From nobody Sat Nov 23 17:36:58 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1730208100754170.9926474269779; Tue, 29 Oct 2024 06:21:40 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1t5m9l-000097-Il; Tue, 29 Oct 2024 09:21:09 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1t5ggF-0002Au-Mg for qemu-devel@nongnu.org; Tue, 29 Oct 2024 03:30:19 -0400 Received: from unicom145.biz-email.net ([210.51.26.145]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1t5ggB-0007v1-1Z for qemu-devel@nongnu.org; Tue, 29 Oct 2024 03:30:19 -0400 Received: from unicom145.biz-email.net by unicom145.biz-email.net ((D)) with ASMTP (SSL) id ZHG00146 for ; Tue, 29 Oct 2024 15:29:46 +0800 Received: from jtjnmailAR06.home.langchao.com (10.100.2.47) by jtjnmail201606.home.langchao.com (10.100.2.6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.39; Tue, 29 Oct 2024 15:29:45 +0800 Received: from jtjnmailAR01.home.langchao.com (10.100.2.42) by jtjnmailAR06.home.langchao.com (10.100.2.47) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.39; Tue, 29 Oct 2024 15:29:45 +0800 Received: from inspur.com (10.100.2.97) by jtjnmailAR01.home.langchao.com (10.100.2.42) with Microsoft SMTP Server id 15.1.2507.39 via Frontend Transport; Tue, 29 Oct 2024 15:29:45 +0800 Received: from cheliequan$inspur.com ( [10.166.15.5] ) by ajax-webmail-app2 (Coremail) ; Tue, 29 Oct 2024 15:29:44 +0800 (GMT+08:00) X-Originating-IP: [10.166.15.5] Date: Tue, 29 Oct 2024 15:29:44 +0800 X-CM-HeaderCharset: UTF-8 From: =?UTF-8?Q?jack_cheliequan_=28=E8=BD=A6=E7=83=88=E6=9D=83=29?= To: qemu-devel Subject: Introduce SM3 hash hmac pbkdf algorithm X-Priority: 3 X-Mailer: Coremail Webmail Server Version 2024.1-cmXT6 build 20240522(f9ac29d3) Coremail_cmclient(4.2.0.1044_win64.exe) Copyright (c) 2002-2024 www.mailtech.cn mispb-39078be8-44f8-459d-aa33-411e3e3b0787-inspur.com X-CM-CTRLMSGS: vfWbRw== Message-ID: <67208ed8.2.LyTFmhUE60iMyTFm@inspur.com> Content-Type: multipart/alternative; boundary="----=_Part_118918_488494484.1730186984431" MIME-Version: 1.0 X-Coremail-Locale: zh_CN X-CM-TRANSID: YQJkCgDx3LfpjiBnS_oOAA--.1874W X-CM-SenderInfo: xfkhzxphtxt0o6lq211xuou0bp/1tbiAgEFB2cfq+ky7gADsk X-Coremail-Antispam: 1Ur529EdanIXcx71UUUUU7IcSsGvfJ3iIAIbVAYjsxI4VWkKw CS07vEb4IE77IF4wCS07vE1I0E4x80FVAKz4kxMIAIbVAFxVCaYxvI4VCIwcAKzIAtYxBI daVFxhVjvjDU= X-CM-DELIVERINFO: =?B?Ljd+hKrHkKHvKYnwc1uMehJ6ITl1sXCyC61xUGF9lUaXpKXcTsfIXgJbZFt2izPhvf M74PjRg1NCmiJ8p5sbTdWTrKlg0nwIaw4M69hNK8h6qZqbMAbSvwWp7yr6DoGDof3QiljM UNy8UzOjImUDW4B2tCyt04/iuZ135RoJJA8ns9s6 tUid: 2024102915294601ede1329ca94beb7c12c3def9f25eab X-Abuse-Reports-To: service@corp-email.com Abuse-Reports-To: service@corp-email.com X-Complaints-To: service@corp-email.com X-Report-Abuse-To: service@corp-email.com Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=210.51.26.145; envelope-from=cheliequan@inspur.com; helo=unicom145.biz-email.net X-Spam_score_int: -25 X-Spam_score: -2.6 X-Spam_bar: -- X-Spam_report: (-2.6 / 5.0 requ) BAYES_00=-1.9, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Tue, 29 Oct 2024 09:21:06 -0400 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1730208104354116600 ------=_Part_118918_488494484.1730186984431 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" crypto: Introduce SM3 hash hmac pbkdf algorithm Introduce the SM3 cryptographic hash algorithm (GB/T 32905-2016). SM3 (GB/T 32905-2016) is a cryptographic standard issued by the Organization of State Commercial Cryptography Administration (OSCCA) as an authorized cryptographic algorithm for use within China. Detect the SM3 cryptographic hash algorithm and enable the feature silently if it is available. Signed-off-by: cheliequan --- crypto/hash-gcrypt.c | 3 +++ crypto/hash-nettle.c | 14 ++++++++++++ crypto/hash.c | 3 +++ crypto/hmac-gcrypt.c | 3 +++ crypto/hmac-nettle.c | 11 ++++++++++ crypto/pbkdf-gcrypt.c | 6 ++++++ crypto/pbkdf-nettle.c | 13 ++++++++++++ meson.build | 39 ++++++++++++++++++++++++++++++++++ qapi/crypto.json | 4 +++- tests/unit/test-crypto-hash.c | 16 ++++++++++++++ tests/unit/test-crypto-hmac.c | 8 +++++++ tests/unit/test-crypto-pbkdf.c | 16 ++++++++++++++ 12 files changed, 135 insertions(+), 1 deletion(-) diff --git a/crypto/hash-gcrypt.c b/crypto/hash-gcrypt.c index 829e48258d..d3bdfe5633 100644 --- a/crypto/hash-gcrypt.c +++ b/crypto/hash-gcrypt.c @@ -33,6 +33,9 @@ static int qcrypto_hash_alg_map[QCRYPTO_HASH_ALG__MAX] = =3D { [QCRYPTO_HASH_ALG_SHA384] =3D GCRY_MD_SHA384, [QCRYPTO_HASH_ALG_SHA512] =3D GCRY_MD_SHA512, [QCRYPTO_HASH_ALG_RIPEMD160] =3D GCRY_MD_RMD160, +#ifdef CONFIG_CRYPTO_SM3 + [QCRYPTO_HASH_ALG_SM3] =3D GCRY_MD_SM3, +#endif }; gboolean qcrypto_hash_supports(QCryptoHashAlgorithm alg) diff --git a/crypto/hash-nettle.c b/crypto/hash-nettle.c index 1ca1a41062..0c2f8ce86c 100644 --- a/crypto/hash-nettle.c +++ b/crypto/hash-nettle.c @@ -25,6 +25,9 @@ #include #include #include +#ifdef CONFIG_CRYPTO_SM3 +#include +#endif typedef void (*qcrypto_nettle_init)(void *ctx); typedef void (*qcrypto_nettle_write)(void *ctx, @@ -42,6 +45,9 @@ union qcrypto_hash_ctx { struct sha384_ctx sha384; struct sha512_ctx sha512; struct ripemd160_ctx ripemd160; +#ifdef CONFIG_CRYPTO_SM3 + struct sm3_ctx sm3; +#endif }; struct qcrypto_hash_alg { @@ -92,6 +98,14 @@ struct qcrypto_hash_alg { .result =3D (qcrypto_nettle_result)ripemd160_digest, .len =3D RIPEMD160_DIGEST_SIZE, }, +#ifdef CONFIG_CRYPTO_SM3 + [QCRYPTO_HASH_ALG_SM3] =3D { + .init =3D (qcrypto_nettle_init)sm3_init, + .write =3D (qcrypto_nettle_write)sm3_update, + .result =3D (qcrypto_nettle_result)sm3_digest, + .len =3D SM3_DIGEST_SIZE, + }, +#endif }; gboolean qcrypto_hash_supports(QCryptoHashAlgorithm alg) diff --git a/crypto/hash.c b/crypto/hash.c index b0f8228bdc..8f1502ce68 100644 --- a/crypto/hash.c +++ b/crypto/hash.c @@ -30,6 +30,9 @@ static size_t qcrypto_hash_alg_size[QCRYPTO_HASH_ALG__MAX= ] =3D { [QCRYPTO_HASH_ALG_SHA384] =3D 48, [QCRYPTO_HASH_ALG_SHA512] =3D 64, [QCRYPTO_HASH_ALG_RIPEMD160] =3D 20, +#ifdef CONFIG_CRYPTO_SM3 + [QCRYPTO_HASH_ALG_SM3] =3D 32, +#endif }; size_t qcrypto_hash_digest_len(QCryptoHashAlgorithm alg) diff --git a/crypto/hmac-gcrypt.c b/crypto/hmac-gcrypt.c index 0c6f979711..888afb86ed 100644 --- a/crypto/hmac-gcrypt.c +++ b/crypto/hmac-gcrypt.c @@ -26,6 +26,9 @@ static int qcrypto_hmac_alg_map[QCRYPTO_HASH_ALG__MAX] = =3D { [QCRYPTO_HASH_ALG_SHA384] =3D GCRY_MAC_HMAC_SHA384, [QCRYPTO_HASH_ALG_SHA512] =3D GCRY_MAC_HMAC_SHA512, [QCRYPTO_HASH_ALG_RIPEMD160] =3D GCRY_MAC_HMAC_RMD160, +#ifdef CONFIG_CRYPTO_SM3 + [QCRYPTO_HASH_ALG_SM3] =3D GCRY_MAC_HMAC_SM3, +#endif }; typedef struct QCryptoHmacGcrypt QCryptoHmacGcrypt; diff --git a/crypto/hmac-nettle.c b/crypto/hmac-nettle.c index 1ad6c4f253..e51e3319ab 100644 --- a/crypto/hmac-nettle.c +++ b/crypto/hmac-nettle.c @@ -38,6 +38,9 @@ struct QCryptoHmacNettle { struct hmac_sha256_ctx sha256_ctx; /* equals hmac_sha224_ctx */ struct hmac_sha512_ctx sha512_ctx; /* equals hmac_sha384_ctx */ struct hmac_ripemd160_ctx ripemd160_ctx; +#ifdef CONFIG_CRYPTO_SM3 + struct hmac_sm3_ctx ctx; +#endif } u; }; @@ -89,6 +92,14 @@ struct qcrypto_nettle_hmac_alg { .digest =3D (qcrypto_nettle_hmac_digest)hmac_ripemd160_digest, .len =3D RIPEMD160_DIGEST_SIZE, }, +#ifdef CONFIG_CRYPTO_SM3 + [QCRYPTO_HASH_ALG_SM3] =3D { + .setkey =3D (qcrypto_nettle_hmac_setkey)hmac_sm3_set_key, + .update =3D (qcrypto_nettle_hmac_update)hmac_sm3_update, + .digest =3D (qcrypto_nettle_hmac_digest)hmac_sm3_digest, + .len =3D SM3_DIGEST_SIZE, + }, +#endif }; bool qcrypto_hmac_supports(QCryptoHashAlgorithm alg) diff --git a/crypto/pbkdf-gcrypt.c b/crypto/pbkdf-gcrypt.c index a8d8e64f4d..09b38d0d6e 100644 --- a/crypto/pbkdf-gcrypt.c +++ b/crypto/pbkdf-gcrypt.c @@ -33,6 +33,9 @@ bool qcrypto_pbkdf2_supports(QCryptoHashAlgorithm hash) case QCRYPTO_HASH_ALG_SHA384: case QCRYPTO_HASH_ALG_SHA512: case QCRYPTO_HASH_ALG_RIPEMD160: +#ifdef CONFIG_CRYPTO_SM3 + case QCRYPTO_HASH_ALG_SM3: +#endif return true; default: return false; @@ -54,6 +57,9 @@ int qcrypto_pbkdf2(QCryptoHashAlgorithm hash, [QCRYPTO_HASH_ALG_SHA384] =3D GCRY_MD_SHA384, [QCRYPTO_HASH_ALG_SHA512] =3D GCRY_MD_SHA512, [QCRYPTO_HASH_ALG_RIPEMD160] =3D GCRY_MD_RMD160, +#ifdef CONFIG_CRYPTO_SM3 + [QCRYPTO_HASH_ALG_SM3] =3D GCRY_MD_SM3, +#endif }; int ret; diff --git a/crypto/pbkdf-nettle.c b/crypto/pbkdf-nettle.c index d6293c25a1..5fea570bd3 100644 --- a/crypto/pbkdf-nettle.c +++ b/crypto/pbkdf-nettle.c @@ -34,6 +34,9 @@ bool qcrypto_pbkdf2_supports(QCryptoHashAlgorithm hash) case QCRYPTO_HASH_ALG_SHA384: case QCRYPTO_HASH_ALG_SHA512: case QCRYPTO_HASH_ALG_RIPEMD160: +#ifdef CONFIG_CRYPTO_SM3 + case QCRYPTO_HASH_ALG_SM3: +#endif return true; default: return false; @@ -55,6 +58,9 @@ int qcrypto_pbkdf2(QCryptoHashAlgorithm hash, struct hmac_sha384_ctx sha384; struct hmac_sha512_ctx sha512; struct hmac_ripemd160_ctx ripemd160; +#ifdef CONFIG_CRYPTO_SM3 + struct hmac_sm3_ctx sm3; +#endif } ctx; if (iterations > UINT_MAX) { @@ -106,6 +112,13 @@ int qcrypto_pbkdf2(QCryptoHashAlgorithm hash, PBKDF2(&ctx.ripemd160, hmac_ripemd160_update, hmac_ripemd160_digest, RIPEMD160_DIGEST_SIZE, iterations, nsalt, salt, nout, out); break; +#ifdef CONFIG_CRYPTO_SM3 + case QCRYPTO_HASH_ALG_SM3: + hmac_sm3_set_key(&ctx.sm3, nkey, key); + PBKDF2(&ctx.sm3, hmac_sm3_update, hmac_sm3_digest, + SM3_DIGEST_SIZE, iterations, nsalt, salt, nout, out); + break; +#endif default: error_setg_errno(errp, ENOSYS, diff --git a/meson.build b/meson.build index 089f45d386..4024f9a4bb 100644 --- a/meson.build +++ b/meson.build @@ -1486,6 +1486,7 @@ gcrypt =3D not_found nettle =3D not_found hogweed =3D not_found crypto_sm4 =3D not_found +crypto_sm3 =3D not_found xts =3D 'none' if get_option('nettle').enabled() and get_option('gcrypt').enabled() @@ -1522,6 +1523,17 @@ if not gnutls_crypto.found() }''', dependencies: gcrypt) crypto_sm4 =3D not_found endif + crypto_sm3 =3D gcrypt + # SM3 ALG is available in libgcrypt >=3D 1.8 + if gcrypt.found() and not cc.links(''' + #include + int main(void) { + gcry_md_hd_t handler; + gcry_md_open(&handler, GCRY_MD_SM3, 0); + return 0; + }''', dependencies: gcrypt) + crypto_sm3 =3D not_found + endif endif if (not get_option('nettle').auto() or have_system) and not gcrypt.found() nettle =3D dependency('nettle', version: '>=3D3.4', @@ -1542,6 +1554,31 @@ if not gnutls_crypto.found() }''', dependencies: nettle) crypto_sm4 =3D not_found endif + crypto_sm3 =3D nettle + # SM3 ALG is available in nettle >=3D 3.4 + if nettle.found() and not cc.links(''' + #include + #include + int main(void) { + struct sm3_ctx ctx; + struct hmac_sm3_ctx hmac_ctx; + unsigned char data[64] =3D {0}; + unsigned char output[32]; + =20 + // SM3 hash function test + sm3_init(&ctx); + sm3_update(&ctx, 64, data); + sm3_digest(&ctx, 32, data); + + // HMAC-SM3 test + hmac_sm3_set_key(&hmac_ctx, 32, data); + hmac_sm3_update(&hmac_ctx, 64, data); + hmac_sm3_digest(&hmac_ctx, 32, output); + =20 + return 0; + }''', dependencies: nettle) + crypto_sm3 =3D not_found + endif endif endif @@ -2229,6 +2266,7 @@ config_host_data.set('CONFIG_TASN1', tasn1.found()) config_host_data.set('CONFIG_GCRYPT', gcrypt.found()) config_host_data.set('CONFIG_NETTLE', nettle.found()) config_host_data.set('CONFIG_CRYPTO_SM4', crypto_sm4.found()) +config_host_data.set('CONFIG_CRYPTO_SM3', crypto_sm3.found()) config_host_data.set('CONFIG_HOGWEED', hogweed.found()) config_host_data.set('CONFIG_QEMU_PRIVATE_XTS', xts =3D=3D 'private') config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim) @@ -4306,6 +4344,7 @@ if nettle.found() summary_info +=3D {' XTS': xts !=3D 'private'} endif summary_info +=3D {'SM4 ALG support': crypto_sm4} +summary_info +=3D {'SM3 ALG support': crypto_sm3} summary_info +=3D {'AF_ALG support': have_afalg} summary_info +=3D {'rng-none': get_option('rng_none')} summary_info +=3D {'Linux keyring': have_keyring} diff --git a/qapi/crypto.json b/qapi/crypto.json index 2f2aeff5fd..af38f0a4bd 100644 --- a/qapi/crypto.json +++ b/qapi/crypto.json @@ -58,11 +58,13 @@ # # @ripemd160: RIPEMD-160. (since 2.7) # +# @sm3: SM3. (since 8.2.0) +# # Since: 2.6 ## { 'enum': 'QCryptoHashAlgorithm', 'prefix': 'QCRYPTO_HASH_ALG', - 'data': ['md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512', 'ripemd1= 60']} + 'data': ['md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512', 'ripemd1= 60', 'sm3']} ## # @QCryptoCipherAlgorithm: diff --git a/tests/unit/test-crypto-hash.c b/tests/unit/test-crypto-hash.c index 1f4abb822b..61908e1769 100644 --- a/tests/unit/test-crypto-hash.c +++ b/tests/unit/test-crypto-hash.c @@ -42,6 +42,9 @@ "63b54e4cb2d2032b393994aa263c0dbb" \ "e00a9f2fe9ef6037352232a1eec55ee7" #define OUTPUT_RIPEMD160 "f3d658fad3fdfb2b52c9369cf0d441249ddfa8a0" +#ifdef CONFIG_CRYPTO_SM3 +#define OUTPUT_SM3 "d4a97db105b477b84c4f20ec9c31a6c814e2705a0b83a5a89748d7= 5f0ef456a1" +#endif #define OUTPUT_MD5_B64 "Yo0gY3FWMDWrjvYvSSveyQ=3D=3D" #define OUTPUT_SHA1_B64 "sudPJnWKOkIeUJzuBFJEt4dTzAI=3D" @@ -54,6 +57,10 @@ "7sVe5w=3D=3D" #define OUTPUT_RIPEMD160_B64 "89ZY+tP9+ytSyTac8NRBJJ3fqKA=3D" +#ifdef CONFIG_CRYPTO_SM3 +#define OUTPUT_SM3_B64 "1Kl9sQW0d7hMTyDsnDGmyBTicFoLg6Wol0jXXw70VqE=3D" +#endif + static const char *expected_outputs[] =3D { [QCRYPTO_HASH_ALG_MD5] =3D OUTPUT_MD5, [QCRYPTO_HASH_ALG_SHA1] =3D OUTPUT_SHA1, @@ -62,6 +69,9 @@ static const char *expected_outputs[] =3D { [QCRYPTO_HASH_ALG_SHA384] =3D OUTPUT_SHA384, [QCRYPTO_HASH_ALG_SHA512] =3D OUTPUT_SHA512, [QCRYPTO_HASH_ALG_RIPEMD160] =3D OUTPUT_RIPEMD160, +#ifdef CONFIG_CRYPTO_SM3 + [QCRYPTO_HASH_ALG_SM3] =3D OUTPUT_SM3, +#endif }; static const char *expected_outputs_b64[] =3D { [QCRYPTO_HASH_ALG_MD5] =3D OUTPUT_MD5_B64, @@ -71,6 +81,9 @@ static const char *expected_outputs_b64[] =3D { [QCRYPTO_HASH_ALG_SHA384] =3D OUTPUT_SHA384_B64, [QCRYPTO_HASH_ALG_SHA512] =3D OUTPUT_SHA512_B64, [QCRYPTO_HASH_ALG_RIPEMD160] =3D OUTPUT_RIPEMD160_B64, +#ifdef CONFIG_CRYPTO_SM3 + [QCRYPTO_HASH_ALG_SM3] =3D OUTPUT_SM3_B64, +#endif }; static const int expected_lens[] =3D { [QCRYPTO_HASH_ALG_MD5] =3D 16, @@ -80,6 +93,9 @@ static const int expected_lens[] =3D { [QCRYPTO_HASH_ALG_SHA384] =3D 48, [QCRYPTO_HASH_ALG_SHA512] =3D 64, [QCRYPTO_HASH_ALG_RIPEMD160] =3D 20, +#ifdef CONFIG_CRYPTO_SM3 + [QCRYPTO_HASH_ALG_SM3] =3D 32, +#endif }; static const char hex[] =3D "0123456789abcdef"; diff --git a/tests/unit/test-crypto-hmac.c b/tests/unit/test-crypto-hmac.c index 23eb724d94..b1d04e9fcc 100644 --- a/tests/unit/test-crypto-hmac.c +++ b/tests/unit/test-crypto-hmac.c @@ -76,6 +76,14 @@ static QCryptoHmacTestData test_data[] =3D { "94964ed4c1155b62b668c241d67279e5" "8a711676", }, +#ifdef CONFIG_CRYPTO_SM3 + { + .alg =3D QCRYPTO_HASH_ALG_SM3, + .hex_digest =3D + "760e3799332bc913819b930085360ddb" + "c05529261313d5b15b75bab4fd7ae91e", + }, +#endif }; static const char hex[] =3D "0123456789abcdef"; diff --git a/tests/unit/test-crypto-pbkdf.c b/tests/unit/test-crypto-pbkdf.c index 43c417f6b4..3d76593c86 100644 --- a/tests/unit/test-crypto-pbkdf.c +++ b/tests/unit/test-crypto-pbkdf.c @@ -326,6 +326,22 @@ static QCryptoPbkdfTestData test_data[] =3D { "\xce\xbf\x91\x14\x8b\x5c\x48\x41", .nout =3D 32 }, +#ifdef CONFIG_CRYPTO_SM3 + { + .path =3D "/crypto/pbkdf/nonrfc/sm3/iter2", + .hash =3D QCRYPTO_HASH_ALG_SM3, + .iterations =3D 2, + .key =3D "password", + .nkey =3D 8, + .salt =3D "ATHENA.MIT.EDUraeburn", + .nsalt =3D 21, + .out =3D "\x48\x71\x1b\x58\xa3\xcb\xce\x06" + "\xba\xad\x77\xa8\xb5\xb9\xd8\x07" + "\x6a\xe2\xb3\x5b\x95\xce\xc8\xce" + "\xe7\xb1\xcb\xee\x61\xdf\x04\xea", + .nout =3D 32 + }, +#endif #if 0 { .path =3D "/crypto/pbkdf/nonrfc/whirlpool/iter1200", =E8=BD=A6=E7=83=88=E6=9D=83 Jack Che cheliequan@inspur.com ------=_Part_118918_488494484.1730186984431 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 PHN0eWxlIGNsYXNzPSJrZS1zdHlsZSI+CltsaXN0LXN0eWxlLXR5cGVdIHtwYWRkaW5nLWxlZnQ6 MjBweDtsaXN0LXN0eWxlLXBvc2l0aW9uOmluc2lkZX0KW2xpc3Qtc3R5bGUtdHlwZV0gbGkge21h cmdpbjowfQpbbGlzdC1zdHlsZS10eXBlXSBsaTpiZWZvcmUsIHNwYW4ua2UtbGlzdC1pdGVtLW1h dHRlciB7Zm9udC1mYW1pbHk6InNhbnMgc2VyaWYiLHRhaG9tYSx2ZXJkYW5hLGhlbHZldGljYX0K W2xpc3Qtc3R5bGUtdHlwZV0gbGkgcCxbbGlzdC1zdHlsZS10eXBlXSBsaSBoMSxbbGlzdC1zdHls ZS10eXBlXSBsaSBoMixbbGlzdC1zdHlsZS10eXBlXSBsaSBoMyxbbGlzdC1zdHlsZS10eXBlXSBs aSBoNCxbbGlzdC1zdHlsZS10eXBlXSBsaSBoNSxbbGlzdC1zdHlsZS10eXBlXSBsaSBkaXYsW2xp c3Qtc3R5bGUtdHlwZV0gbGkgYmxvY2txdW90ZXtkaXNwbGF5OmlubGluZTt3b3JkLWJyZWFrOmJy ZWFrLWFsbH0KW2xpc3Qtc3R5bGUtdHlwZV0gbGkgdGFibGUge2Rpc3BsYXk6aW5saW5lLWJsb2Nr O3ZlcnRpY2FsLWFsaWduOnRvcH0KcHttYXJnaW46MH0KdGQge3dvcmQtYnJlYWs6IGJyZWFrLXdv cmR9Ci5kZWZhdWx0LWZvbnQtMTczMDE4Njc2MTQwNHsKZm9udC1zaXplOjEycHQ7CmZvbnQtZmFt aWx5OiJNaWNyb3NvZnQgWWFIZWkgVUkiOwpjb2xvcjpyZ2IoMCwgMCwgMCk7CnRleHQtYWxpZ246 bGVmdDsKbGluZS1oZWlnaHQ6MS41Owp9Cjwvc3R5bGU+PGRpdiBjbGFzcz0iZGVmYXVsdC1mb250 LTE3MzAxODY3NjE0MDQiIGRpcj0ibHRyIj48ZGl2IGNsYXNzPSJSZWZlcmVuY2VRdW90ZSI+PHAg c3R5bGU9ImJveC1zaXppbmc6Ym9yZGVyLWJveDttYXJnaW4tcmlnaHQ6MGVtO21hcmdpbi1ib3R0 b206MTZweDttYXJnaW4tbGVmdDowZW07bGluZS1oZWlnaHQ6MS42O3dvcmQtYnJlYWs6YnJlYWst d29yZDtjb2xvcjojNDA0ODVCO2ZvbnQtZmFtaWx5Oi1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lz dGVtRm9udCwgJnF1b3Q7U2Vnb2UgVUkmcXVvdDssIEhlbHZldGljYSwgQXJpYWwsICZxdW90O0Fw cGxlIENvbG9yIEVtb2ppJnF1b3Q7LCAmcXVvdDtTZWdvZSBVSSBFbW9qaSZxdW90OywgJnF1b3Q7 U2Vnb2UgVUkgU3ltYm9sJnF1b3Q7LCAmcXVvdDtMaWJlcmF0aW9uIFNhbnMmcXVvdDssICZxdW90 O1BpbmdGYW5nIFNDJnF1b3Q7LCAmcXVvdDtNaWNyb3NvZnQgWWFIZWkmcXVvdDssICZxdW90O0hp cmFnaW5vIFNhbnMgR0ImcXVvdDssICZxdW90O1dlbnF1YW55aSBNaWNybyBIZWkmcXVvdDssICZx dW90O1dlblF1YW5ZaSBaZW4gSGVpJnF1b3Q7LCAmcXVvdDtTVCBIZWl0aSZxdW90OywgU2ltSGVp LCBTaW1TdW4sICZxdW90O1dlblF1YW5ZaSBaZW4gSGVpIFNoYXJwJnF1b3Q7LCBzYW5zLXNlcmlm O3doaXRlLXNwYWNlOm5vcm1hbDtiYWNrZ3JvdW5kLWNvbG9yOiNGRkZGRkY7Ij5jcnlwdG86IElu dHJvZHVjZSBTTTMgaGFzaCBobWFjIHBia2RmIGFsZ29yaXRobTwvcD48cCBzdHlsZT0iYm94LXNp emluZzpib3JkZXItYm94O21hcmdpbi1yaWdodDowZW07bWFyZ2luLWJvdHRvbToxNnB4O21hcmdp bi1sZWZ0OjBlbTtsaW5lLWhlaWdodDoxLjY7d29yZC1icmVhazpicmVhay13b3JkO2NvbG9yOiM0 MDQ4NUI7Zm9udC1mYW1pbHk6LWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAmcXVv dDtTZWdvZSBVSSZxdW90OywgSGVsdmV0aWNhLCBBcmlhbCwgJnF1b3Q7QXBwbGUgQ29sb3IgRW1v amkmcXVvdDssICZxdW90O1NlZ29lIFVJIEVtb2ppJnF1b3Q7LCAmcXVvdDtTZWdvZSBVSSBTeW1i b2wmcXVvdDssICZxdW90O0xpYmVyYXRpb24gU2FucyZxdW90OywgJnF1b3Q7UGluZ0ZhbmcgU0Mm cXVvdDssICZxdW90O01pY3Jvc29mdCBZYUhlaSZxdW90OywgJnF1b3Q7SGlyYWdpbm8gU2FucyBH QiZxdW90OywgJnF1b3Q7V2VucXVhbnlpIE1pY3JvIEhlaSZxdW90OywgJnF1b3Q7V2VuUXVhbllp IFplbiBIZWkmcXVvdDssICZxdW90O1NUIEhlaXRpJnF1b3Q7LCBTaW1IZWksIFNpbVN1biwgJnF1 b3Q7V2VuUXVhbllpIFplbiBIZWkgU2hhcnAmcXVvdDssIHNhbnMtc2VyaWY7d2hpdGUtc3BhY2U6 bm9ybWFsO2JhY2tncm91bmQtY29sb3I6I0ZGRkZGRjsiPjxzcGFuIHN0eWxlPSJjb2xvcjojMDAw MDAwO2ZvbnQtZmFtaWx5OiZxdW90O01pY3Jvc29mdCBZYUhlaSBVSSZxdW90Oztmb250LXNpemU6 MTJwdDsiPkludHJvZHVjZSB0aGUgU00zIGNyeXB0b2dyYXBoaWMgaGFzaCBhbGdvcml0aG0gKEdC L1QgMzI5MDUtMjAxNikuPC9zcGFuPjxicj48L3A+PHA+U00zIChHQi9UIDMyOTA1LTIwMTYpIGlz IGEgY3J5cHRvZ3JhcGhpYyBzdGFuZGFyZCBpc3N1ZWQgYnkgdGhlPGJyPjwvcD48cD5Pcmdhbml6 YXRpb24gb2YgU3RhdGUgQ29tbWVyY2lhbCBDcnlwdG9ncmFwaHkgQWRtaW5pc3RyYXRpb24gKE9T Q0NBKTxicj48L3A+PHA+YXMgYW4gYXV0aG9yaXplZCBjcnlwdG9ncmFwaGljIGFsZ29yaXRobSBm b3IgdXNlIHdpdGhpbiBDaGluYS48YnI+PC9wPjxwPkRldGVjdCB0aGUgU00zIGNyeXB0b2dyYXBo aWMgaGFzaCBhbGdvcml0aG0gYW5kIGVuYWJsZSB0aGUgZmVhdHVyZSBzaWxlbnRseTxicj48L3A+ PHA+aWYgaXQgaXMgYXZhaWxhYmxlLjxicj48L3A+PHA+U2lnbmVkLW9mZi1ieTogY2hlbGllcXVh biAmbHQ7Y2hlbGllcXVhbkBpbnNwdXIuY29tJmd0Ozxicj48L3A+PHA+LS0tPGJyPjwvcD48cD5j cnlwdG8vaGFzaC1nY3J5cHQuYyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IHwg Jm5ic3A7MyArKys8YnI+PC9wPjxwPmNyeXB0by9oYXNoLW5ldHRsZS5jICZuYnNwOyAmbmJzcDsg Jm5ic3A7ICZuYnNwOyAmbmJzcDsgfCAxNCArKysrKysrKysrKys8YnI+PC9wPjxwPmNyeXB0by9o YXNoLmMgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZu YnNwOyAmbmJzcDt8ICZuYnNwOzMgKysrPGJyPjwvcD48cD5jcnlwdG8vaG1hYy1nY3J5cHQuYyAm bmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IHwgJm5ic3A7MyArKys8YnI+PC9wPjxw PmNyeXB0by9obWFjLW5ldHRsZS5jICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsg fCAxMSArKysrKysrKysrPGJyPjwvcD48cD5jcnlwdG8vcGJrZGYtZ2NyeXB0LmMgJm5ic3A7ICZu YnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwO3wgJm5ic3A7NiArKysrKys8YnI+PC9wPjxwPmNyeXB0 by9wYmtkZi1uZXR0bGUuYyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7fCAxMyAr KysrKysrKysrKys8YnI+PC9wPjxwPm1lc29uLmJ1aWxkICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZu YnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwO3wgMzkgKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKzxicj48L3A+PHA+cWFwaS9jcnlwdG8uanNvbiAm bmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgfCAmbmJzcDs0 ICsrKy08YnI+PC9wPjxwPnRlc3RzL3VuaXQvdGVzdC1jcnlwdG8taGFzaC5jICZuYnNwO3wgMTYg KysrKysrKysrKysrKys8YnI+PC9wPjxwPnRlc3RzL3VuaXQvdGVzdC1jcnlwdG8taG1hYy5jICZu YnNwO3wgJm5ic3A7OCArKysrKysrPGJyPjwvcD48cD50ZXN0cy91bml0L3Rlc3QtY3J5cHRvLXBi a2RmLmMgfCAxNiArKysrKysrKysrKysrKzxicj48L3A+PHA+MTIgZmlsZXMgY2hhbmdlZCwgMTM1 IGluc2VydGlvbnMoKyksIDEgZGVsZXRpb24oLSk8YnI+PC9wPjxwPmRpZmYgLS1naXQgYS9jcnlw dG8vaGFzaC1nY3J5cHQuYyBiL2NyeXB0by9oYXNoLWdjcnlwdC5jPGJyPjwvcD48cD5pbmRleCA4 MjllNDgyNThkLi5kM2JkZmU1NjMzIDEwMDY0NDxicj48L3A+PHA+LS0tIGEvY3J5cHRvL2hhc2gt Z2NyeXB0LmM8YnI+PC9wPjxwPisrKyBiL2NyeXB0by9oYXNoLWdjcnlwdC5jPGJyPjwvcD48cD5A QCAtMzMsNiArMzMsOSBAQCBzdGF0aWMgaW50IHFjcnlwdG9faGFzaF9hbGdfbWFwW1FDUllQVE9f SEFTSF9BTEdfX01BWF0gPSB7PGJyPjwvcD48cD4mbmJzcDsgJm5ic3A7IFtRQ1JZUFRPX0hBU0hf QUxHX1NIQTM4NF0gPSBHQ1JZX01EX1NIQTM4NCw8YnI+PC9wPjxwPiZuYnNwOyAmbmJzcDsgW1FD UllQVE9fSEFTSF9BTEdfU0hBNTEyXSA9IEdDUllfTURfU0hBNTEyLDxicj48L3A+PHA+Jm5ic3A7 ICZuYnNwOyBbUUNSWVBUT19IQVNIX0FMR19SSVBFTUQxNjBdID0gR0NSWV9NRF9STUQxNjAsPGJy PjwvcD48cD4rI2lmZGVmIENPTkZJR19DUllQVE9fU00zPGJyPjwvcD48cD4rICZuYnNwOyAmbmJz cDtbUUNSWVBUT19IQVNIX0FMR19TTTNdID0gR0NSWV9NRF9TTTMsPGJyPjwvcD48cD4rI2VuZGlm PGJyPjwvcD48cD59Ozxicj48L3A+PHA+PGJyPjwvcD48cD5nYm9vbGVhbiBxY3J5cHRvX2hhc2hf c3VwcG9ydHMoUUNyeXB0b0hhc2hBbGdvcml0aG0gYWxnKTxicj48L3A+PHA+ZGlmZiAtLWdpdCBh L2NyeXB0by9oYXNoLW5ldHRsZS5jIGIvY3J5cHRvL2hhc2gtbmV0dGxlLmM8YnI+PC9wPjxwPmlu ZGV4IDFjYTFhNDEwNjIuLjBjMmY4Y2U4NmMgMTAwNjQ0PGJyPjwvcD48cD4tLS0gYS9jcnlwdG8v aGFzaC1uZXR0bGUuYzxicj48L3A+PHA+KysrIGIvY3J5cHRvL2hhc2gtbmV0dGxlLmM8YnI+PC9w PjxwPkBAIC0yNSw2ICsyNSw5IEBAPGJyPjwvcD48cD4jaW5jbHVkZSAmbHQ7bmV0dGxlL21kNS5o Jmd0Ozxicj48L3A+PHA+I2luY2x1ZGUgJmx0O25ldHRsZS9zaGEuaCZndDs8YnI+PC9wPjxwPiNp bmNsdWRlICZsdDtuZXR0bGUvcmlwZW1kMTYwLmgmZ3Q7PGJyPjwvcD48cD4rI2lmZGVmIENPTkZJ R19DUllQVE9fU00zPGJyPjwvcD48cD4rI2luY2x1ZGUgJmx0O25ldHRsZS9zbTMuaCZndDs8YnI+ PC9wPjxwPisjZW5kaWY8YnI+PC9wPjxwPjxicj48L3A+PHA+dHlwZWRlZiB2b2lkICgqcWNyeXB0 b19uZXR0bGVfaW5pdCkodm9pZCAqY3R4KTs8YnI+PC9wPjxwPnR5cGVkZWYgdm9pZCAoKnFjcnlw dG9fbmV0dGxlX3dyaXRlKSh2b2lkICpjdHgsPGJyPjwvcD48cD5AQCAtNDIsNiArNDUsOSBAQCB1 bmlvbiBxY3J5cHRvX2hhc2hfY3R4IHs8YnI+PC9wPjxwPiZuYnNwOyAmbmJzcDsgc3RydWN0IHNo YTM4NF9jdHggc2hhMzg0Ozxicj48L3A+PHA+Jm5ic3A7ICZuYnNwOyBzdHJ1Y3Qgc2hhNTEyX2N0 eCBzaGE1MTI7PGJyPjwvcD48cD4mbmJzcDsgJm5ic3A7IHN0cnVjdCByaXBlbWQxNjBfY3R4IHJp cGVtZDE2MDs8YnI+PC9wPjxwPisjaWZkZWYgQ09ORklHX0NSWVBUT19TTTM8YnI+PC9wPjxwPisg Jm5ic3A7ICZuYnNwO3N0cnVjdCBzbTNfY3R4IHNtMzs8YnI+PC9wPjxwPisjZW5kaWY8YnI+PC9w PjxwPn07PGJyPjwvcD48cD48YnI+PC9wPjxwPnN0cnVjdCBxY3J5cHRvX2hhc2hfYWxnIHs8YnI+ PC9wPjxwPkBAIC05Miw2ICs5OCwxNCBAQCBzdHJ1Y3QgcWNyeXB0b19oYXNoX2FsZyB7PGJyPjwv cD48cD4mbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgLnJlc3VsdCA9IChxY3J5cHRvX25ldHRs ZV9yZXN1bHQpcmlwZW1kMTYwX2RpZ2VzdCw8YnI+PC9wPjxwPiZuYnNwOyAmbmJzcDsgJm5ic3A7 ICZuYnNwOyAubGVuID0gUklQRU1EMTYwX0RJR0VTVF9TSVpFLDxicj48L3A+PHA+Jm5ic3A7ICZu YnNwOyB9LDxicj48L3A+PHA+KyNpZmRlZiBDT05GSUdfQ1JZUFRPX1NNMzxicj48L3A+PHA+KyAm bmJzcDsgJm5ic3A7W1FDUllQVE9fSEFTSF9BTEdfU00zXSA9IHs8YnI+PC9wPjxwPisgJm5ic3A7 ICZuYnNwOyAmbmJzcDsgJm5ic3A7LmluaXQgPSAocWNyeXB0b19uZXR0bGVfaW5pdClzbTNfaW5p dCw8YnI+PC9wPjxwPisgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7LndyaXRlID0gKHFjcnlw dG9fbmV0dGxlX3dyaXRlKXNtM191cGRhdGUsPGJyPjwvcD48cD4rICZuYnNwOyAmbmJzcDsgJm5i c3A7ICZuYnNwOy5yZXN1bHQgPSAocWNyeXB0b19uZXR0bGVfcmVzdWx0KXNtM19kaWdlc3QsPGJy PjwvcD48cD4rICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOy5sZW4gPSBTTTNfRElHRVNUX1NJ WkUsPGJyPjwvcD48cD4rICZuYnNwOyAmbmJzcDt9LDxicj48L3A+PHA+KyNlbmRpZjxicj48L3A+ PHA+fTs8YnI+PC9wPjxwPjxicj48L3A+PHA+Z2Jvb2xlYW4gcWNyeXB0b19oYXNoX3N1cHBvcnRz KFFDcnlwdG9IYXNoQWxnb3JpdGhtIGFsZyk8YnI+PC9wPjxwPmRpZmYgLS1naXQgYS9jcnlwdG8v aGFzaC5jIGIvY3J5cHRvL2hhc2guYzxicj48L3A+PHA+aW5kZXggYjBmODIyOGJkYy4uOGYxNTAy Y2U2OCAxMDA2NDQ8YnI+PC9wPjxwPi0tLSBhL2NyeXB0by9oYXNoLmM8YnI+PC9wPjxwPisrKyBi L2NyeXB0by9oYXNoLmM8YnI+PC9wPjxwPkBAIC0zMCw2ICszMCw5IEBAIHN0YXRpYyBzaXplX3Qg cWNyeXB0b19oYXNoX2FsZ19zaXplW1FDUllQVE9fSEFTSF9BTEdfX01BWF0gPSB7PGJyPjwvcD48 cD4mbmJzcDsgJm5ic3A7IFtRQ1JZUFRPX0hBU0hfQUxHX1NIQTM4NF0gPSA0OCw8YnI+PC9wPjxw PiZuYnNwOyAmbmJzcDsgW1FDUllQVE9fSEFTSF9BTEdfU0hBNTEyXSA9IDY0LDxicj48L3A+PHA+ Jm5ic3A7ICZuYnNwOyBbUUNSWVBUT19IQVNIX0FMR19SSVBFTUQxNjBdID0gMjAsPGJyPjwvcD48 cD4rI2lmZGVmIENPTkZJR19DUllQVE9fU00zPGJyPjwvcD48cD4rICZuYnNwOyAmbmJzcDtbUUNS WVBUT19IQVNIX0FMR19TTTNdID0gMzIsPGJyPjwvcD48cD4rI2VuZGlmPGJyPjwvcD48cD59Ozxi cj48L3A+PHA+PGJyPjwvcD48cD5zaXplX3QgcWNyeXB0b19oYXNoX2RpZ2VzdF9sZW4oUUNyeXB0 b0hhc2hBbGdvcml0aG0gYWxnKTxicj48L3A+PHA+ZGlmZiAtLWdpdCBhL2NyeXB0by9obWFjLWdj cnlwdC5jIGIvY3J5cHRvL2htYWMtZ2NyeXB0LmM8YnI+PC9wPjxwPmluZGV4IDBjNmY5Nzk3MTEu Ljg4OGFmYjg2ZWQgMTAwNjQ0PGJyPjwvcD48cD4tLS0gYS9jcnlwdG8vaG1hYy1nY3J5cHQuYzxi cj48L3A+PHA+KysrIGIvY3J5cHRvL2htYWMtZ2NyeXB0LmM8YnI+PC9wPjxwPkBAIC0yNiw2ICsy Niw5IEBAIHN0YXRpYyBpbnQgcWNyeXB0b19obWFjX2FsZ19tYXBbUUNSWVBUT19IQVNIX0FMR19f TUFYXSA9IHs8YnI+PC9wPjxwPiZuYnNwOyAmbmJzcDsgW1FDUllQVE9fSEFTSF9BTEdfU0hBMzg0 XSA9IEdDUllfTUFDX0hNQUNfU0hBMzg0LDxicj48L3A+PHA+Jm5ic3A7ICZuYnNwOyBbUUNSWVBU T19IQVNIX0FMR19TSEE1MTJdID0gR0NSWV9NQUNfSE1BQ19TSEE1MTIsPGJyPjwvcD48cD4mbmJz cDsgJm5ic3A7IFtRQ1JZUFRPX0hBU0hfQUxHX1JJUEVNRDE2MF0gPSBHQ1JZX01BQ19ITUFDX1JN RDE2MCw8YnI+PC9wPjxwPisjaWZkZWYgQ09ORklHX0NSWVBUT19TTTM8YnI+PC9wPjxwPisgJm5i c3A7ICZuYnNwO1tRQ1JZUFRPX0hBU0hfQUxHX1NNM10gPSBHQ1JZX01BQ19ITUFDX1NNMyw8YnI+ PC9wPjxwPisjZW5kaWY8YnI+PC9wPjxwPn07PGJyPjwvcD48cD48YnI+PC9wPjxwPnR5cGVkZWYg c3RydWN0IFFDcnlwdG9IbWFjR2NyeXB0IFFDcnlwdG9IbWFjR2NyeXB0Ozxicj48L3A+PHA+ZGlm ZiAtLWdpdCBhL2NyeXB0by9obWFjLW5ldHRsZS5jIGIvY3J5cHRvL2htYWMtbmV0dGxlLmM8YnI+ PC9wPjxwPmluZGV4IDFhZDZjNGYyNTMuLmU1MWUzMzE5YWIgMTAwNjQ0PGJyPjwvcD48cD4tLS0g YS9jcnlwdG8vaG1hYy1uZXR0bGUuYzxicj48L3A+PHA+KysrIGIvY3J5cHRvL2htYWMtbmV0dGxl LmM8YnI+PC9wPjxwPkBAIC0zOCw2ICszOCw5IEBAIHN0cnVjdCBRQ3J5cHRvSG1hY05ldHRsZSB7 PGJyPjwvcD48cD4mbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgc3RydWN0IGhtYWNfc2hhMjU2 X2N0eCBzaGEyNTZfY3R4OyAvKiBlcXVhbHMgaG1hY19zaGEyMjRfY3R4ICovPGJyPjwvcD48cD4m bmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgc3RydWN0IGhtYWNfc2hhNTEyX2N0eCBzaGE1MTJf Y3R4OyAvKiBlcXVhbHMgaG1hY19zaGEzODRfY3R4ICovPGJyPjwvcD48cD4mbmJzcDsgJm5ic3A7 ICZuYnNwOyAmbmJzcDsgc3RydWN0IGhtYWNfcmlwZW1kMTYwX2N0eCByaXBlbWQxNjBfY3R4Ozxi cj48L3A+PHA+KyNpZmRlZiBDT05GSUdfQ1JZUFRPX1NNMzxicj48L3A+PHA+KwlzdHJ1Y3QgaG1h Y19zbTNfY3R4IGN0eDs8YnI+PC9wPjxwPisjZW5kaWY8YnI+PC9wPjxwPiZuYnNwOyAmbmJzcDsg fSB1Ozxicj48L3A+PHA+fTs8YnI+PC9wPjxwPjxicj48L3A+PHA+QEAgLTg5LDYgKzkyLDE0IEBA IHN0cnVjdCBxY3J5cHRvX25ldHRsZV9obWFjX2FsZyB7PGJyPjwvcD48cD4mbmJzcDsgJm5ic3A7 ICZuYnNwOyAmbmJzcDsgLmRpZ2VzdCA9IChxY3J5cHRvX25ldHRsZV9obWFjX2RpZ2VzdClobWFj X3JpcGVtZDE2MF9kaWdlc3QsPGJyPjwvcD48cD4mbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsg LmxlbiA9IFJJUEVNRDE2MF9ESUdFU1RfU0laRSw8YnI+PC9wPjxwPiZuYnNwOyAmbmJzcDsgfSw8 YnI+PC9wPjxwPisjaWZkZWYgQ09ORklHX0NSWVBUT19TTTM8YnI+PC9wPjxwPisgJm5ic3A7ICZu YnNwO1tRQ1JZUFRPX0hBU0hfQUxHX1NNM10gPSB7PGJyPjwvcD48cD4rICZuYnNwOyAmbmJzcDsg Jm5ic3A7ICZuYnNwOy5zZXRrZXkgPSAocWNyeXB0b19uZXR0bGVfaG1hY19zZXRrZXkpaG1hY19z bTNfc2V0X2tleSw8YnI+PC9wPjxwPisgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7LnVwZGF0 ZSA9IChxY3J5cHRvX25ldHRsZV9obWFjX3VwZGF0ZSlobWFjX3NtM191cGRhdGUsPGJyPjwvcD48 cD4rICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOy5kaWdlc3QgPSAocWNyeXB0b19uZXR0bGVf aG1hY19kaWdlc3QpaG1hY19zbTNfZGlnZXN0LDxicj48L3A+PHA+KyAmbmJzcDsgJm5ic3A7ICZu YnNwOyAmbmJzcDsubGVuID0gU00zX0RJR0VTVF9TSVpFLDxicj48L3A+PHA+KyAmbmJzcDsgJm5i c3A7fSw8YnI+PC9wPjxwPisjZW5kaWY8YnI+PC9wPjxwPn07PGJyPjwvcD48cD48YnI+PC9wPjxw PmJvb2wgcWNyeXB0b19obWFjX3N1cHBvcnRzKFFDcnlwdG9IYXNoQWxnb3JpdGhtIGFsZyk8YnI+ PC9wPjxwPmRpZmYgLS1naXQgYS9jcnlwdG8vcGJrZGYtZ2NyeXB0LmMgYi9jcnlwdG8vcGJrZGYt Z2NyeXB0LmM8YnI+PC9wPjxwPmluZGV4IGE4ZDhlNjRmNGQuLjA5YjM4ZDBkNmUgMTAwNjQ0PGJy PjwvcD48cD4tLS0gYS9jcnlwdG8vcGJrZGYtZ2NyeXB0LmM8YnI+PC9wPjxwPisrKyBiL2NyeXB0 by9wYmtkZi1nY3J5cHQuYzxicj48L3A+PHA+QEAgLTMzLDYgKzMzLDkgQEAgYm9vbCBxY3J5cHRv X3Bia2RmMl9zdXBwb3J0cyhRQ3J5cHRvSGFzaEFsZ29yaXRobSBoYXNoKTxicj48L3A+PHA+Jm5i c3A7ICZuYnNwOyBjYXNlIFFDUllQVE9fSEFTSF9BTEdfU0hBMzg0Ojxicj48L3A+PHA+Jm5ic3A7 ICZuYnNwOyBjYXNlIFFDUllQVE9fSEFTSF9BTEdfU0hBNTEyOjxicj48L3A+PHA+Jm5ic3A7ICZu YnNwOyBjYXNlIFFDUllQVE9fSEFTSF9BTEdfUklQRU1EMTYwOjxicj48L3A+PHA+KyNpZmRlZiBD T05GSUdfQ1JZUFRPX1NNMzxicj48L3A+PHA+KyAmbmJzcDsgJm5ic3A7Y2FzZSBRQ1JZUFRPX0hB U0hfQUxHX1NNMzo8YnI+PC9wPjxwPisjZW5kaWY8YnI+PC9wPjxwPiZuYnNwOyAmbmJzcDsgJm5i c3A7ICZuYnNwOyByZXR1cm4gdHJ1ZTs8YnI+PC9wPjxwPiZuYnNwOyAmbmJzcDsgZGVmYXVsdDo8 YnI+PC9wPjxwPiZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyByZXR1cm4gZmFsc2U7PGJyPjwv cD48cD5AQCAtNTQsNiArNTcsOSBAQCBpbnQgcWNyeXB0b19wYmtkZjIoUUNyeXB0b0hhc2hBbGdv cml0aG0gaGFzaCw8YnI+PC9wPjxwPiZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyBbUUNSWVBU T19IQVNIX0FMR19TSEEzODRdID0gR0NSWV9NRF9TSEEzODQsPGJyPjwvcD48cD4mbmJzcDsgJm5i c3A7ICZuYnNwOyAmbmJzcDsgW1FDUllQVE9fSEFTSF9BTEdfU0hBNTEyXSA9IEdDUllfTURfU0hB NTEyLDxicj48L3A+PHA+Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IFtRQ1JZUFRPX0hBU0hf QUxHX1JJUEVNRDE2MF0gPSBHQ1JZX01EX1JNRDE2MCw8YnI+PC9wPjxwPisjaWZkZWYgQ09ORklH X0NSWVBUT19TTTM8YnI+PC9wPjxwPisgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7W1FDUllQ VE9fSEFTSF9BTEdfU00zXSA9IEdDUllfTURfU00zLDxicj48L3A+PHA+KyNlbmRpZjxicj48L3A+ PHA+Jm5ic3A7ICZuYnNwOyB9Ozxicj48L3A+PHA+Jm5ic3A7ICZuYnNwOyBpbnQgcmV0Ozxicj48 L3A+PHA+PGJyPjwvcD48cD5kaWZmIC0tZ2l0IGEvY3J5cHRvL3Bia2RmLW5ldHRsZS5jIGIvY3J5 cHRvL3Bia2RmLW5ldHRsZS5jPGJyPjwvcD48cD5pbmRleCBkNjI5M2MyNWExLi41ZmVhNTcwYmQz IDEwMDY0NDxicj48L3A+PHA+LS0tIGEvY3J5cHRvL3Bia2RmLW5ldHRsZS5jPGJyPjwvcD48cD4r KysgYi9jcnlwdG8vcGJrZGYtbmV0dGxlLmM8YnI+PC9wPjxwPkBAIC0zNCw2ICszNCw5IEBAIGJv b2wgcWNyeXB0b19wYmtkZjJfc3VwcG9ydHMoUUNyeXB0b0hhc2hBbGdvcml0aG0gaGFzaCk8YnI+ PC9wPjxwPiZuYnNwOyAmbmJzcDsgY2FzZSBRQ1JZUFRPX0hBU0hfQUxHX1NIQTM4NDo8YnI+PC9w PjxwPiZuYnNwOyAmbmJzcDsgY2FzZSBRQ1JZUFRPX0hBU0hfQUxHX1NIQTUxMjo8YnI+PC9wPjxw PiZuYnNwOyAmbmJzcDsgY2FzZSBRQ1JZUFRPX0hBU0hfQUxHX1JJUEVNRDE2MDo8YnI+PC9wPjxw PisjaWZkZWYgQ09ORklHX0NSWVBUT19TTTM8YnI+PC9wPjxwPisgJm5ic3A7ICZuYnNwO2Nhc2Ug UUNSWVBUT19IQVNIX0FMR19TTTM6PGJyPjwvcD48cD4rI2VuZGlmPGJyPjwvcD48cD4mbmJzcDsg Jm5ic3A7ICZuYnNwOyAmbmJzcDsgcmV0dXJuIHRydWU7PGJyPjwvcD48cD4mbmJzcDsgJm5ic3A7 IGRlZmF1bHQ6PGJyPjwvcD48cD4mbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgcmV0dXJuIGZh bHNlOzxicj48L3A+PHA+QEAgLTU1LDYgKzU4LDkgQEAgaW50IHFjcnlwdG9fcGJrZGYyKFFDcnlw dG9IYXNoQWxnb3JpdGhtIGhhc2gsPGJyPjwvcD48cD4mbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJz cDsgc3RydWN0IGhtYWNfc2hhMzg0X2N0eCBzaGEzODQ7PGJyPjwvcD48cD4mbmJzcDsgJm5ic3A7 ICZuYnNwOyAmbmJzcDsgc3RydWN0IGhtYWNfc2hhNTEyX2N0eCBzaGE1MTI7PGJyPjwvcD48cD4m bmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgc3RydWN0IGhtYWNfcmlwZW1kMTYwX2N0eCByaXBl bWQxNjA7PGJyPjwvcD48cD4rI2lmZGVmIENPTkZJR19DUllQVE9fU00zPGJyPjwvcD48cD4rICZu YnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwO3N0cnVjdCBobWFjX3NtM19jdHggc20zOzxicj48L3A+ PHA+KyNlbmRpZjxicj48L3A+PHA+Jm5ic3A7ICZuYnNwOyB9IGN0eDs8YnI+PC9wPjxwPjxicj48 L3A+PHA+Jm5ic3A7ICZuYnNwOyBpZiAoaXRlcmF0aW9ucyAmZ3Q7IFVJTlRfTUFYKSB7PGJyPjwv cD48cD5AQCAtMTA2LDYgKzExMiwxMyBAQCBpbnQgcWNyeXB0b19wYmtkZjIoUUNyeXB0b0hhc2hB bGdvcml0aG0gaGFzaCw8YnI+PC9wPjxwPiZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyBQQktE RjIoJmFtcDtjdHgucmlwZW1kMTYwLCBobWFjX3JpcGVtZDE2MF91cGRhdGUsIGhtYWNfcmlwZW1k MTYwX2RpZ2VzdCw8YnI+PC9wPjxwPiZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsg Jm5ic3A7ICZuYnNwOyAmbmJzcDtSSVBFTUQxNjBfRElHRVNUX1NJWkUsIGl0ZXJhdGlvbnMsIG5z YWx0LCBzYWx0LCBub3V0LCBvdXQpOzxicj48L3A+PHA+Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5i c3A7IGJyZWFrOzxicj48L3A+PHA+KyNpZmRlZiBDT05GSUdfQ1JZUFRPX1NNMzxicj48L3A+PHA+ KyAmbmJzcDsgJm5ic3A7Y2FzZSBRQ1JZUFRPX0hBU0hfQUxHX1NNMzo8YnI+PC9wPjxwPisgJm5i c3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7aG1hY19zbTNfc2V0X2tleSgmYW1wO2N0eC5zbTMsIG5r ZXksIGtleSk7PGJyPjwvcD48cD4rICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwO1BCS0RGMigm YW1wO2N0eC5zbTMsIGhtYWNfc20zX3VwZGF0ZSwgaG1hY19zbTNfZGlnZXN0LDxicj48L3A+PHA+ KyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgU00zX0RJ R0VTVF9TSVpFLCBpdGVyYXRpb25zLCBuc2FsdCwgc2FsdCwgbm91dCwgb3V0KTs8YnI+PC9wPjxw PisgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7YnJlYWs7PGJyPjwvcD48cD4rI2VuZGlmPGJy PjwvcD48cD48YnI+PC9wPjxwPiZuYnNwOyAmbmJzcDsgZGVmYXVsdDo8YnI+PC9wPjxwPiZuYnNw OyAmbmJzcDsgJm5ic3A7ICZuYnNwOyBlcnJvcl9zZXRnX2Vycm5vKGVycnAsIEVOT1NZUyw8YnI+ PC9wPjxwPmRpZmYgLS1naXQgYS9tZXNvbi5idWlsZCBiL21lc29uLmJ1aWxkPGJyPjwvcD48cD5p bmRleCAwODlmNDVkMzg2Li40MDI0ZjlhNGJiIDEwMDY0NDxicj48L3A+PHA+LS0tIGEvbWVzb24u YnVpbGQ8YnI+PC9wPjxwPisrKyBiL21lc29uLmJ1aWxkPGJyPjwvcD48cD5AQCAtMTQ4Niw2ICsx NDg2LDcgQEAgZ2NyeXB0ID0gbm90X2ZvdW5kPGJyPjwvcD48cD5uZXR0bGUgPSBub3RfZm91bmQ8 YnI+PC9wPjxwPmhvZ3dlZWQgPSBub3RfZm91bmQ8YnI+PC9wPjxwPmNyeXB0b19zbTQgPSBub3Rf Zm91bmQ8YnI+PC9wPjxwPitjcnlwdG9fc20zID0gbm90X2ZvdW5kPGJyPjwvcD48cD54dHMgPSAn bm9uZSc8YnI+PC9wPjxwPjxicj48L3A+PHA+aWYgZ2V0X29wdGlvbignbmV0dGxlJykuZW5hYmxl ZCgpIGFuZCBnZXRfb3B0aW9uKCdnY3J5cHQnKS5lbmFibGVkKCk8YnI+PC9wPjxwPkBAIC0xNTIy LDYgKzE1MjMsMTcgQEAgaWYgbm90IGdudXRsc19jcnlwdG8uZm91bmQoKTxicj48L3A+PHA+Jm5i c3A7ICZuYnNwOyAmbmJzcDsgfScnJywgZGVwZW5kZW5jaWVzOiBnY3J5cHQpPGJyPjwvcD48cD4m bmJzcDsgJm5ic3A7ICZuYnNwOyBjcnlwdG9fc200ID0gbm90X2ZvdW5kPGJyPjwvcD48cD4mbmJz cDsgJm5ic3A7IGVuZGlmPGJyPjwvcD48cD4rICZuYnNwOyAmbmJzcDtjcnlwdG9fc20zID0gZ2Ny eXB0PGJyPjwvcD48cD4rICZuYnNwOyAmbmJzcDsjIFNNMyBBTEcgaXMgYXZhaWxhYmxlIGluIGxp YmdjcnlwdCAmZ3Q7PSAxLjg8YnI+PC9wPjxwPisgJm5ic3A7ICZuYnNwO2lmIGdjcnlwdC5mb3Vu ZCgpIGFuZCBub3QgY2MubGlua3MoJycnPGJyPjwvcD48cD4rICZuYnNwOyAmbmJzcDsgJm5ic3A7 I2luY2x1ZGUgJmx0O2djcnlwdC5oJmd0Ozxicj48L3A+PHA+KyAmbmJzcDsgJm5ic3A7ICZuYnNw O2ludCBtYWluKHZvaWQpIHs8YnI+PC9wPjxwPisgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7 Z2NyeV9tZF9oZF90IGhhbmRsZXI7PGJyPjwvcD48cD4rICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZu YnNwO2djcnlfbWRfb3BlbigmYW1wO2hhbmRsZXIsIEdDUllfTURfU00zLCAwKTs8YnI+PC9wPjxw PisgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7cmV0dXJuIDA7PGJyPjwvcD48cD4rICZuYnNw OyAmbmJzcDsgJm5ic3A7fScnJywgZGVwZW5kZW5jaWVzOiBnY3J5cHQpPGJyPjwvcD48cD4rICZu YnNwOyAmbmJzcDsgJm5ic3A7Y3J5cHRvX3NtMyA9IG5vdF9mb3VuZDxicj48L3A+PHA+KyAmbmJz cDsgJm5ic3A7ZW5kaWY8YnI+PC9wPjxwPiZuYnNwOyBlbmRpZjxicj48L3A+PHA+Jm5ic3A7IGlm IChub3QgZ2V0X29wdGlvbignbmV0dGxlJykuYXV0bygpIG9yIGhhdmVfc3lzdGVtKSBhbmQgbm90 IGdjcnlwdC5mb3VuZCgpPGJyPjwvcD48cD4mbmJzcDsgJm5ic3A7IG5ldHRsZSA9IGRlcGVuZGVu Y3koJ25ldHRsZScsIHZlcnNpb246ICcmZ3Q7PTMuNCcsPGJyPjwvcD48cD5AQCAtMTU0Miw2ICsx NTU0LDMxIEBAIGlmIG5vdCBnbnV0bHNfY3J5cHRvLmZvdW5kKCk8YnI+PC9wPjxwPiZuYnNwOyAm bmJzcDsgJm5ic3A7IH0nJycsIGRlcGVuZGVuY2llczogbmV0dGxlKTxicj48L3A+PHA+Jm5ic3A7 ICZuYnNwOyAmbmJzcDsgY3J5cHRvX3NtNCA9IG5vdF9mb3VuZDxicj48L3A+PHA+Jm5ic3A7ICZu YnNwOyBlbmRpZjxicj48L3A+PHA+KyAmbmJzcDsgJm5ic3A7Y3J5cHRvX3NtMyA9IG5ldHRsZTxi cj48L3A+PHA+KyAmbmJzcDsgJm5ic3A7IyBTTTMgQUxHIGlzIGF2YWlsYWJsZSBpbiBuZXR0bGUg Jmd0Oz0gMy40PGJyPjwvcD48cD4rICZuYnNwOyAmbmJzcDtpZiBuZXR0bGUuZm91bmQoKSBhbmQg bm90IGNjLmxpbmtzKCcnJzxicj48L3A+PHA+KyAmbmJzcDsgJm5ic3A7ICZuYnNwOyNpbmNsdWRl ICZsdDtuZXR0bGUvc20zLmgmZ3Q7PGJyPjwvcD48cD4rICZuYnNwOyAmbmJzcDsgJm5ic3A7I2lu Y2x1ZGUgJmx0O25ldHRsZS9obWFjLmgmZ3Q7PGJyPjwvcD48cD4rICZuYnNwOyAmbmJzcDsgJm5i c3A7aW50IG1haW4odm9pZCkgezxicj48L3A+PHA+KyAmbmJzcDsgJm5ic3A7ICZuYnNwO3N0cnVj dCBzbTNfY3R4IGN0eDs8YnI+PC9wPjxwPisgJm5ic3A7ICZuYnNwOyAmbmJzcDtzdHJ1Y3QgaG1h Y19zbTNfY3R4IGhtYWNfY3R4Ozxicj48L3A+PHA+KyAmbmJzcDsgJm5ic3A7ICZuYnNwO3Vuc2ln bmVkIGNoYXIgZGF0YVs2NF0gPSB7MH07PGJyPjwvcD48cD4rICZuYnNwOyAmbmJzcDsgJm5ic3A7 dW5zaWduZWQgY2hhciBvdXRwdXRbMzJdOzxicj48L3A+PHA+KyAmbmJzcDsgJm5ic3A7PGJyPjwv cD48cD4rICZuYnNwOyAmbmJzcDsgJm5ic3A7Ly8gU00zIGhhc2ggZnVuY3Rpb24gdGVzdDxicj48 L3A+PHA+KyAmbmJzcDsgJm5ic3A7ICZuYnNwO3NtM19pbml0KCZhbXA7Y3R4KTs8YnI+PC9wPjxw PisgJm5ic3A7ICZuYnNwOyAmbmJzcDtzbTNfdXBkYXRlKCZhbXA7Y3R4LCA2NCwgZGF0YSk7PGJy PjwvcD48cD4rICZuYnNwOyAmbmJzcDsgJm5ic3A7c20zX2RpZ2VzdCgmYW1wO2N0eCwgMzIsIGRh dGEpOzxicj48L3A+PHA+Kzxicj48L3A+PHA+KyAmbmJzcDsgJm5ic3A7ICZuYnNwOy8vIEhNQUMt U00zIHRlc3Q8YnI+PC9wPjxwPisgJm5ic3A7ICZuYnNwOyAmbmJzcDtobWFjX3NtM19zZXRfa2V5 KCZhbXA7aG1hY19jdHgsIDMyLCBkYXRhKTs8YnI+PC9wPjxwPisgJm5ic3A7ICZuYnNwOyAmbmJz cDtobWFjX3NtM191cGRhdGUoJmFtcDtobWFjX2N0eCwgNjQsIGRhdGEpOzxicj48L3A+PHA+KyAm bmJzcDsgJm5ic3A7ICZuYnNwO2htYWNfc20zX2RpZ2VzdCgmYW1wO2htYWNfY3R4LCAzMiwgb3V0 cHV0KTs8YnI+PC9wPjxwPisgJm5ic3A7ICZuYnNwOzxicj48L3A+PHA+KyAmbmJzcDsgJm5ic3A7 ICZuYnNwO3JldHVybiAwOzxicj48L3A+PHA+KyAmbmJzcDsgJm5ic3A7ICZuYnNwO30nJycsIGRl cGVuZGVuY2llczogbmV0dGxlKTxicj48L3A+PHA+KyAmbmJzcDsgJm5ic3A7ICZuYnNwO2NyeXB0 b19zbTMgPSBub3RfZm91bmQ8YnI+PC9wPjxwPisgJm5ic3A7ICZuYnNwO2VuZGlmPGJyPjwvcD48 cD4mbmJzcDsgZW5kaWY8YnI+PC9wPjxwPmVuZGlmPGJyPjwvcD48cD48YnI+PC9wPjxwPkBAIC0y MjI5LDYgKzIyNjYsNyBAQCBjb25maWdfaG9zdF9kYXRhLnNldCgnQ09ORklHX1RBU04xJywgdGFz bjEuZm91bmQoKSk8YnI+PC9wPjxwPmNvbmZpZ19ob3N0X2RhdGEuc2V0KCdDT05GSUdfR0NSWVBU JywgZ2NyeXB0LmZvdW5kKCkpPGJyPjwvcD48cD5jb25maWdfaG9zdF9kYXRhLnNldCgnQ09ORklH X05FVFRMRScsIG5ldHRsZS5mb3VuZCgpKTxicj48L3A+PHA+Y29uZmlnX2hvc3RfZGF0YS5zZXQo J0NPTkZJR19DUllQVE9fU000JywgY3J5cHRvX3NtNC5mb3VuZCgpKTxicj48L3A+PHA+K2NvbmZp Z19ob3N0X2RhdGEuc2V0KCdDT05GSUdfQ1JZUFRPX1NNMycsIGNyeXB0b19zbTMuZm91bmQoKSk8 YnI+PC9wPjxwPmNvbmZpZ19ob3N0X2RhdGEuc2V0KCdDT05GSUdfSE9HV0VFRCcsIGhvZ3dlZWQu Zm91bmQoKSk8YnI+PC9wPjxwPmNvbmZpZ19ob3N0X2RhdGEuc2V0KCdDT05GSUdfUUVNVV9QUklW QVRFX1hUUycsIHh0cyA9PSAncHJpdmF0ZScpPGJyPjwvcD48cD5jb25maWdfaG9zdF9kYXRhLnNl dCgnQ09ORklHX01BTExPQ19UUklNJywgaGFzX21hbGxvY190cmltKTxicj48L3A+PHA+QEAgLTQz MDYsNiArNDM0NCw3IEBAIGlmIG5ldHRsZS5mb3VuZCgpPGJyPjwvcD48cD4mbmJzcDsgJm5ic3A7 c3VtbWFyeV9pbmZvICs9IHsnICZuYnNwO1hUUyc6ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNw OyAmbmJzcDsgJm5ic3A7IHh0cyAhPSAncHJpdmF0ZSd9PGJyPjwvcD48cD5lbmRpZjxicj48L3A+ PHA+c3VtbWFyeV9pbmZvICs9IHsnU000IEFMRyBzdXBwb3J0JzogJm5ic3A7IGNyeXB0b19zbTR9 PGJyPjwvcD48cD4rc3VtbWFyeV9pbmZvICs9IHsnU00zIEFMRyBzdXBwb3J0JzogJm5ic3A7IGNy eXB0b19zbTN9PGJyPjwvcD48cD5zdW1tYXJ5X2luZm8gKz0geydBRl9BTEcgc3VwcG9ydCc6ICZu YnNwOyAmbmJzcDtoYXZlX2FmYWxnfTxicj48L3A+PHA+c3VtbWFyeV9pbmZvICs9IHsncm5nLW5v bmUnOiAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Z2V0X29wdGlvbigncm5nX25v bmUnKX08YnI+PC9wPjxwPnN1bW1hcnlfaW5mbyArPSB7J0xpbnV4IGtleXJpbmcnOiAmbmJzcDsg Jm5ic3A7IGhhdmVfa2V5cmluZ308YnI+PC9wPjxwPmRpZmYgLS1naXQgYS9xYXBpL2NyeXB0by5q c29uIGIvcWFwaS9jcnlwdG8uanNvbjxicj48L3A+PHA+aW5kZXggMmYyYWVmZjVmZC4uYWYzOGYw YTRiZCAxMDA2NDQ8YnI+PC9wPjxwPi0tLSBhL3FhcGkvY3J5cHRvLmpzb248YnI+PC9wPjxwPisr KyBiL3FhcGkvY3J5cHRvLmpzb248YnI+PC9wPjxwPkBAIC01OCwxMSArNTgsMTMgQEA8YnI+PC9w PjxwPiM8YnI+PC9wPjxwPiMgQHJpcGVtZDE2MDogUklQRU1ELTE2MC4gKHNpbmNlIDIuNyk8YnI+ PC9wPjxwPiM8YnI+PC9wPjxwPisjIEBzbTM6IFNNMy4gKHNpbmNlIDguMi4wKTxicj48L3A+PHA+ KyM8YnI+PC9wPjxwPiMgU2luY2U6IDIuNjxicj48L3A+PHA+IyM8YnI+PC9wPjxwPnsgJ2VudW0n OiAnUUNyeXB0b0hhc2hBbGdvcml0aG0nLDxicj48L3A+PHA+Jm5ic3A7ICdwcmVmaXgnOiAnUUNS WVBUT19IQVNIX0FMRycsPGJyPjwvcD48cD4tICZuYnNwOydkYXRhJzogWydtZDUnLCAnc2hhMScs ICdzaGEyMjQnLCAnc2hhMjU2JywgJ3NoYTM4NCcsICdzaGE1MTInLCAncmlwZW1kMTYwJ119PGJy PjwvcD48cD4rICZuYnNwOydkYXRhJzogWydtZDUnLCAnc2hhMScsICdzaGEyMjQnLCAnc2hhMjU2 JywgJ3NoYTM4NCcsICdzaGE1MTInLCAncmlwZW1kMTYwJywgJ3NtMyddfTxicj48L3A+PHA+PGJy PjwvcD48cD4jIzxicj48L3A+PHA+IyBAUUNyeXB0b0NpcGhlckFsZ29yaXRobTo8YnI+PC9wPjxw PmRpZmYgLS1naXQgYS90ZXN0cy91bml0L3Rlc3QtY3J5cHRvLWhhc2guYyBiL3Rlc3RzL3VuaXQv dGVzdC1jcnlwdG8taGFzaC5jPGJyPjwvcD48cD5pbmRleCAxZjRhYmI4MjJiLi42MTkwOGUxNzY5 IDEwMDY0NDxicj48L3A+PHA+LS0tIGEvdGVzdHMvdW5pdC90ZXN0LWNyeXB0by1oYXNoLmM8YnI+ PC9wPjxwPisrKyBiL3Rlc3RzL3VuaXQvdGVzdC1jcnlwdG8taGFzaC5jPGJyPjwvcD48cD5AQCAt NDIsNiArNDIsOSBAQDxicj48L3A+PHA+Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNw OyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAiNjNiNTRlNGNiMmQy MDMyYjM5Mzk5NGFhMjYzYzBkYmIiIFw8YnI+PC9wPjxwPiZuYnNwOyAmbmJzcDsgJm5ic3A7ICZu YnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgImUw MGE5ZjJmZTllZjYwMzczNTIyMzJhMWVlYzU1ZWU3Ijxicj48L3A+PHA+I2RlZmluZSBPVVRQVVRf UklQRU1EMTYwICJmM2Q2NThmYWQzZmRmYjJiNTJjOTM2OWNmMGQ0NDEyNDlkZGZhOGEwIjxicj48 L3A+PHA+KyNpZmRlZiBDT05GSUdfQ1JZUFRPX1NNMzxicj48L3A+PHA+KyNkZWZpbmUgT1VUUFVU X1NNMyAiZDRhOTdkYjEwNWI0NzdiODRjNGYyMGVjOWMzMWE2YzgxNGUyNzA1YTBiODNhNWE4OTc0 OGQ3NWYwZWY0NTZhMSI8YnI+PC9wPjxwPisjZW5kaWY8YnI+PC9wPjxwPjxicj48L3A+PHA+I2Rl ZmluZSBPVVRQVVRfTUQ1X0I2NCAiWW8wZ1kzRldNRFdyanZZdlNTdmV5UT09Ijxicj48L3A+PHA+ I2RlZmluZSBPVVRQVVRfU0hBMV9CNjQgInN1ZFBKbldLT2tJZVVKenVCRkpFdDRkVHpBST0iPGJy PjwvcD48cD5AQCAtNTQsNiArNTcsMTAgQEA8YnI+PC9wPjxwPiZuYnNwOyAmbmJzcDsgJm5ic3A7 ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsg Jm5ic3A7ICZuYnNwOyAiN3NWZTV3PT0iPGJyPjwvcD48cD4jZGVmaW5lIE9VVFBVVF9SSVBFTUQx NjBfQjY0ICI4OVpZK3RQOSt5dFN5VGFjOE5SQkpKM2ZxS0E9Ijxicj48L3A+PHA+PGJyPjwvcD48 cD4rI2lmZGVmIENPTkZJR19DUllQVE9fU00zPGJyPjwvcD48cD4rI2RlZmluZSBPVVRQVVRfU00z X0I2NCAiMUtsOXNRVzBkN2hNVHlEc25ER215QlRpY0ZvTGc2V29sMGpYWHc3MFZxRT0iPGJyPjwv cD48cD4rI2VuZGlmPGJyPjwvcD48cD4rPGJyPjwvcD48cD5zdGF0aWMgY29uc3QgY2hhciAqZXhw ZWN0ZWRfb3V0cHV0c1tdID0gezxicj48L3A+PHA+Jm5ic3A7ICZuYnNwOyBbUUNSWVBUT19IQVNI X0FMR19NRDVdID0gT1VUUFVUX01ENSw8YnI+PC9wPjxwPiZuYnNwOyAmbmJzcDsgW1FDUllQVE9f SEFTSF9BTEdfU0hBMV0gPSBPVVRQVVRfU0hBMSw8YnI+PC9wPjxwPkBAIC02Miw2ICs2OSw5IEBA IHN0YXRpYyBjb25zdCBjaGFyICpleHBlY3RlZF9vdXRwdXRzW10gPSB7PGJyPjwvcD48cD4mbmJz cDsgJm5ic3A7IFtRQ1JZUFRPX0hBU0hfQUxHX1NIQTM4NF0gPSBPVVRQVVRfU0hBMzg0LDxicj48 L3A+PHA+Jm5ic3A7ICZuYnNwOyBbUUNSWVBUT19IQVNIX0FMR19TSEE1MTJdID0gT1VUUFVUX1NI QTUxMiw8YnI+PC9wPjxwPiZuYnNwOyAmbmJzcDsgW1FDUllQVE9fSEFTSF9BTEdfUklQRU1EMTYw XSA9IE9VVFBVVF9SSVBFTUQxNjAsPGJyPjwvcD48cD4rI2lmZGVmIENPTkZJR19DUllQVE9fU00z PGJyPjwvcD48cD4rICZuYnNwOyAmbmJzcDtbUUNSWVBUT19IQVNIX0FMR19TTTNdID0gT1VUUFVU X1NNMyw8YnI+PC9wPjxwPisjZW5kaWY8YnI+PC9wPjxwPn07PGJyPjwvcD48cD5zdGF0aWMgY29u c3QgY2hhciAqZXhwZWN0ZWRfb3V0cHV0c19iNjRbXSA9IHs8YnI+PC9wPjxwPiZuYnNwOyAmbmJz cDsgW1FDUllQVE9fSEFTSF9BTEdfTUQ1XSA9IE9VVFBVVF9NRDVfQjY0LDxicj48L3A+PHA+QEAg LTcxLDYgKzgxLDkgQEAgc3RhdGljIGNvbnN0IGNoYXIgKmV4cGVjdGVkX291dHB1dHNfYjY0W10g PSB7PGJyPjwvcD48cD4mbmJzcDsgJm5ic3A7IFtRQ1JZUFRPX0hBU0hfQUxHX1NIQTM4NF0gPSBP VVRQVVRfU0hBMzg0X0I2NCw8YnI+PC9wPjxwPiZuYnNwOyAmbmJzcDsgW1FDUllQVE9fSEFTSF9B TEdfU0hBNTEyXSA9IE9VVFBVVF9TSEE1MTJfQjY0LDxicj48L3A+PHA+Jm5ic3A7ICZuYnNwOyBb UUNSWVBUT19IQVNIX0FMR19SSVBFTUQxNjBdID0gT1VUUFVUX1JJUEVNRDE2MF9CNjQsPGJyPjwv cD48cD4rI2lmZGVmIENPTkZJR19DUllQVE9fU00zPGJyPjwvcD48cD4rICZuYnNwOyAmbmJzcDtb UUNSWVBUT19IQVNIX0FMR19TTTNdID0gT1VUUFVUX1NNM19CNjQsPGJyPjwvcD48cD4rI2VuZGlm PGJyPjwvcD48cD59Ozxicj48L3A+PHA+c3RhdGljIGNvbnN0IGludCBleHBlY3RlZF9sZW5zW10g PSB7PGJyPjwvcD48cD4mbmJzcDsgJm5ic3A7IFtRQ1JZUFRPX0hBU0hfQUxHX01ENV0gPSAxNiw8 YnI+PC9wPjxwPkBAIC04MCw2ICs5Myw5IEBAIHN0YXRpYyBjb25zdCBpbnQgZXhwZWN0ZWRfbGVu c1tdID0gezxicj48L3A+PHA+Jm5ic3A7ICZuYnNwOyBbUUNSWVBUT19IQVNIX0FMR19TSEEzODRd ID0gNDgsPGJyPjwvcD48cD4mbmJzcDsgJm5ic3A7IFtRQ1JZUFRPX0hBU0hfQUxHX1NIQTUxMl0g PSA2NCw8YnI+PC9wPjxwPiZuYnNwOyAmbmJzcDsgW1FDUllQVE9fSEFTSF9BTEdfUklQRU1EMTYw XSA9IDIwLDxicj48L3A+PHA+KyNpZmRlZiBDT05GSUdfQ1JZUFRPX1NNMzxicj48L3A+PHA+KyAm bmJzcDsgJm5ic3A7W1FDUllQVE9fSEFTSF9BTEdfU00zXSA9IDMyLDxicj48L3A+PHA+KyNlbmRp Zjxicj48L3A+PHA+fTs8YnI+PC9wPjxwPjxicj48L3A+PHA+c3RhdGljIGNvbnN0IGNoYXIgaGV4 W10gPSAiMDEyMzQ1Njc4OWFiY2RlZiI7PGJyPjwvcD48cD5kaWZmIC0tZ2l0IGEvdGVzdHMvdW5p dC90ZXN0LWNyeXB0by1obWFjLmMgYi90ZXN0cy91bml0L3Rlc3QtY3J5cHRvLWhtYWMuYzxicj48 L3A+PHA+aW5kZXggMjNlYjcyNGQ5NC4uYjFkMDRlOWZjYyAxMDA2NDQ8YnI+PC9wPjxwPi0tLSBh L3Rlc3RzL3VuaXQvdGVzdC1jcnlwdG8taG1hYy5jPGJyPjwvcD48cD4rKysgYi90ZXN0cy91bml0 L3Rlc3QtY3J5cHRvLWhtYWMuYzxicj48L3A+PHA+QEAgLTc2LDYgKzc2LDE0IEBAIHN0YXRpYyBR Q3J5cHRvSG1hY1Rlc3REYXRhIHRlc3RfZGF0YVtdID0gezxicj48L3A+PHA+Jm5ic3A7ICZuYnNw OyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgIjk0OTY0ZWQ0YzExNTViNjJiNjY4YzI0MWQ2 NzI3OWU1Ijxicj48L3A+PHA+Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJz cDsgIjhhNzExNjc2Iiw8YnI+PC9wPjxwPiZuYnNwOyAmbmJzcDsgfSw8YnI+PC9wPjxwPisjaWZk ZWYgQ09ORklHX0NSWVBUT19TTTM8YnI+PC9wPjxwPisgJm5ic3A7ICZuYnNwO3s8YnI+PC9wPjxw PisgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7LmFsZyA9IFFDUllQVE9fSEFTSF9BTEdfU00z LDxicj48L3A+PHA+KyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsuaGV4X2RpZ2VzdCA9PGJy PjwvcD48cD4rICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Ijc2MGUz Nzk5MzMyYmM5MTM4MTliOTMwMDg1MzYwZGRiIjxicj48L3A+PHA+KwkgJm5ic3A7ICZuYnNwOyJj MDU1MjkyNjEzMTNkNWIxNWI3NWJhYjRmZDdhZTkxZSIsPGJyPjwvcD48cD4rICZuYnNwOyAmbmJz cDt9LDxicj48L3A+PHA+KyNlbmRpZjxicj48L3A+PHA+fTs8YnI+PC9wPjxwPjxicj48L3A+PHA+ c3RhdGljIGNvbnN0IGNoYXIgaGV4W10gPSAiMDEyMzQ1Njc4OWFiY2RlZiI7PGJyPjwvcD48cD5k aWZmIC0tZ2l0IGEvdGVzdHMvdW5pdC90ZXN0LWNyeXB0by1wYmtkZi5jIGIvdGVzdHMvdW5pdC90 ZXN0LWNyeXB0by1wYmtkZi5jPGJyPjwvcD48cD5pbmRleCA0M2M0MTdmNmI0Li4zZDc2NTkzYzg2 IDEwMDY0NDxicj48L3A+PHA+LS0tIGEvdGVzdHMvdW5pdC90ZXN0LWNyeXB0by1wYmtkZi5jPGJy PjwvcD48cD4rKysgYi90ZXN0cy91bml0L3Rlc3QtY3J5cHRvLXBia2RmLmM8YnI+PC9wPjxwPkBA IC0zMjYsNiArMzI2LDIyIEBAIHN0YXRpYyBRQ3J5cHRvUGJrZGZUZXN0RGF0YSB0ZXN0X2RhdGFb XSA9IHs8YnI+PC9wPjxwPiZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7 ICZuYnNwOyAmbmJzcDsiXHhjZVx4YmZceDkxXHgxNFx4OGJceDVjXHg0OFx4NDEiLDxicj48L3A+ PHA+Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IC5ub3V0ID0gMzI8YnI+PC9wPjxwPiZuYnNw OyAmbmJzcDsgfSw8YnI+PC9wPjxwPisjaWZkZWYgQ09ORklHX0NSWVBUT19TTTM8YnI+PC9wPjxw PisgJm5ic3A7ICZuYnNwO3s8YnI+PC9wPjxwPisgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7 LnBhdGggPSAiL2NyeXB0by9wYmtkZi9ub25yZmMvc20zL2l0ZXIyIiw8YnI+PC9wPjxwPisgJm5i c3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Lmhhc2ggPSBRQ1JZUFRPX0hBU0hfQUxHX1NNMyw8YnI+ PC9wPjxwPisgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Lml0ZXJhdGlvbnMgPSAyLDxicj48 L3A+PHA+KyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsua2V5ID0gInBhc3N3b3JkIiw8YnI+ PC9wPjxwPisgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Lm5rZXkgPSA4LDxicj48L3A+PHA+ KyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsuc2FsdCA9ICJBVEhFTkEuTUlULkVEVXJhZWJ1 cm4iLDxicj48L3A+PHA+KyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsubnNhbHQgPSAyMSw8 YnI+PC9wPjxwPisgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Lm91dCA9ICJceDQ4XHg3MVx4 MWJceDU4XHhhM1x4Y2JceGNlXHgwNiI8YnI+PC9wPjxwPisJCSJceGJhXHhhZFx4NzdceGE4XHhi NVx4YjlceGQ4XHgwNyI8YnI+PC9wPjxwPisJCSJceDZhXHhlMlx4YjNceDViXHg5NVx4Y2VceGM4 XHhjZSI8YnI+PC9wPjxwPisJCSJceGU3XHhiMVx4Y2JceGVlXHg2MVx4ZGZceDA0XHhlYSIsPGJy PjwvcD48cD4rICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOy5ub3V0ID0gMzI8YnI+PC9wPjxw PisgJm5ic3A7ICZuYnNwO30sPGJyPjwvcD48cD4rI2VuZGlmPGJyPjwvcD48cD4jaWYgMDxicj48 L3A+PHA+Jm5ic3A7ICZuYnNwOyB7PGJyPjwvcD48cD4mbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJz cDsgLnBhdGggPSAiL2NyeXB0by9wYmtkZi9ub25yZmMvd2hpcmxwb29sL2l0ZXIxMjAwIiw8YnI+ PC9wPjxwcmUgc3R5bGU9IndvcmQtd3JhcDpicmVhay13b3JkOyIgd3JhcD0ic29mdCI+PC9wcmU+ PHByZSBzdHlsZT0id29yZC13cmFwOmJyZWFrLXdvcmQ7IiB3cmFwPSJzb2Z0Ij7ovabng4jmnYMm bmJzcDsmbmJzcDtKYWNrJm5ic3A7Q2hlCmNoZWxpZXF1YW5AaW5zcHVyLmNvbQo8L3ByZT4KICA8 L2Rpdj48L2Rpdj4= ------=_Part_118918_488494484.1730186984431--