From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 3FA3745A3A; Thu, 26 Sep 2024 18:38:44 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 218A74067E; Thu, 26 Sep 2024 18:38:44 +0200 (CEST) Received: from mail-oi1-f179.google.com (mail-oi1-f179.google.com [209.85.167.179]) by mails.dpdk.org (Postfix) with ESMTP id DD5EA40672 for ; Thu, 26 Sep 2024 18:38:41 +0200 (CEST) Received: by mail-oi1-f179.google.com with SMTP id 5614622812f47-3e03a5ed4d7so757599b6e.1 for ; Thu, 26 Sep 2024 09:38:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iol.unh.edu; s=unh-iol; t=1727368721; x=1727973521; darn=dpdk.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=+4rFtXDZoxiYonO77EZW3Wb/pS154WZzqWuNw56ywYo=; b=F52shB6tDv/Y23AX7RaZGQIYl5+c8KoOr48QgotcdBjc3/4NbJD0EpwNl33ERsJ4Ow 6orXK6HfgXZ6eJAdXip+hXHYtLJyocZBk12hczBGhlKWBsQeVLeckreSuZote15gVNaX M61I0GdMRIKbp6G4FLGSPvaCl0lVas7bJV1J4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1727368721; x=1727973521; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=+4rFtXDZoxiYonO77EZW3Wb/pS154WZzqWuNw56ywYo=; b=YyG8CFXrrStMt2Sr5DtQsQqI9Fss9Z3LUQxSeplp2MCEUAcREIutC9dQ/QERAG9wFm e7wxYE2MQ4VCsPW9F87iRHwlAUKsOS2WxotkG6CzQOphFUF1QSO86kfPRYdsDQpQ8e6k l+gO2IpUinVuPFQGMdc48N5819JepUu56vIWLRfZ5AWeL5ZEVDXgdFYnFxFLZtzObsGW khsCScGjk05e68yFu91ZRykACrdmXekPGb0QVqz/1o0olozWRXKXZdFBSsagDiN19vmS d2b6LH4HyudNbiqD+mIqOrGtz+bz76zir7s8sTUPr6lmKAiB1USAa/vjEtW4LyESJ8U8 m3nw== X-Gm-Message-State: AOJu0Yzpqd+uZ3J/+/db62prB/+UB8Fsgejw1fizJ/OLIHgAN7+bTxlC jshXk2XWaETVNqM+oRmnedMpCPdCBrIX/4Pt8fUNdNT+f8M+Rzn+UZdMyw2Y8tkUAaQg3dXOG22 6A4hKBj2KVbXkcAaU5HusmkjdqLx/mdKEquVpUQ== X-Google-Smtp-Source: AGHT+IFLhu+SKW1E5LHNBkUQ0FX5+iVEHQiIowA74GL5e7xRp0K9CH3CAdy/uTBuk3PgS/oblzL63wF5OmxS83r0Exw= X-Received: by 2002:a05:6808:2105:b0:3e3:91a5:d892 with SMTP id 5614622812f47-3e393961746mr221206b6e.16.1727368720665; Thu, 26 Sep 2024 09:38:40 -0700 (PDT) MIME-Version: 1.0 References: <20240925181525.66119-1-arkadiuszx.kusztal@intel.com> In-Reply-To: <20240925181525.66119-1-arkadiuszx.kusztal@intel.com> From: Patrick Robb Date: Thu, 26 Sep 2024 12:37:35 -0400 Message-ID: Subject: Re: [PATCH] app/test: refactor cryptodev test cases To: Arkadiusz Kusztal Cc: dev@dpdk.org, gakhil@marvell.com, brian.dooley@intel.com Content-Type: multipart/alternative; boundary="000000000000fdef810623085e6f" X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org --000000000000fdef810623085e6f Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Recheck-request: iol-mellanox-Performance When I enabled this test on Monday I accidentally set the delta threshold to 1.5% instead of 5%. So the accepted results window was too small and led to this false positive test fail. On Wed, Sep 25, 2024 at 3:30=E2=80=AFPM Arkadiusz Kusztal < arkadiuszx.kusztal@intel.com> wrote: > This commit introduces several changes to the cryptodev > test cases that should make it easier to maintain. > > Changes included in this patch: > - If not needed by the specific test case, the device should be > started/stopped in the particular testsuite setup/teardown > function. > - Most of the remaining test vectors were moved from test.c file > to the specific header vector files. > - Part of GCM redundant functions were replaced by named test cases. > - Unit tests do not need to check for the symmetric cryptography feature, > if this feature were not present, the test should not even reach this > stage. > > Signed-off-by: Arkadiusz Kusztal > --- > Please note that this is work in progress, what is left to be done: > - Rework security test cases, these will fail with current setup. > - Fix OOP issue. OOP tests do not check for the prepended data in the OOP > buffer. > - Remove remaining test vectors from the .c file. > - Remove redundant test functions that call common function, replace with > named test cases. > - Refactor block cipher functions, there are only three block cipher > algorithms in the cryptodev. > > app/test/test_cryptodev.c | 1913 > +++++++++++---------------- > app/test/test_cryptodev.h | 6 +- > app/test/test_cryptodev_aead_test_vectors.h | 1 + > app/test/test_cryptodev_aes_test_vectors.h | 106 ++ > app/test/test_cryptodev_blockcipher.c | 28 +- > app/test/test_cryptodev_hmac_test_vectors.h | 75 ++ > 6 files changed, 1001 insertions(+), 1128 deletions(-) > > diff --git a/app/test/test_cryptodev.c b/app/test/test_cryptodev.c > index c846b26ed1..e9adf95c98 100644 > --- a/app/test/test_cryptodev.c > +++ b/app/test/test_cryptodev.c > @@ -85,7 +85,6 @@ struct crypto_unittest_params { > #ifdef RTE_LIB_SECURITY > struct rte_security_docsis_xform docsis_xform; > #endif > - > union { > void *sess; > #ifdef RTE_LIB_SECURITY > @@ -96,11 +95,9 @@ struct crypto_unittest_params { > enum rte_security_session_action_type type; > #endif > struct rte_crypto_op *op; > - > struct rte_mbuf *obuf, *ibuf; > - > uint8_t *digest; > -}; > +} unittest_params, *self =3D &unittest_params; > > #define ALIGN_POW2_ROUNDUP(num, align) \ > (((num) + (align) - 1) & ~((align) - 1)) > @@ -121,6 +118,9 @@ struct crypto_unittest_params { > /* > * Forward declarations. > */ > +static inline void > +ext_mbuf_memzone_free(int nb_segs); > + > static int > test_AES_CBC_HMAC_SHA512_decrypt_create_session_params( > struct crypto_unittest_params *ut_params, uint8_t > *cipher_key, > @@ -196,9 +196,8 @@ post_process_raw_dp_op(void *user_data, uint32_t > index __rte_unused, > RTE_CRYPTO_OP_STATUS_ERROR; > } > > -static struct crypto_testsuite_params testsuite_params =3D { NULL }; > -struct crypto_testsuite_params *p_testsuite_params =3D &testsuite_params= ; > -static struct crypto_unittest_params unittest_params; > +static struct crypto_testsuite_params testsuite_params =3D { .dev_id =3D= -1 }; > +struct crypto_testsuite_params *p_ts_params =3D &testsuite_params; > static bool enq_cb_called; > static bool deq_cb_called; > > @@ -558,12 +557,16 @@ process_crypto_request(uint8_t dev_id, struct > rte_crypto_op *op) > return op; > } > > +/* > + * Setup/teardown functions of the entire testsuite file > + */ > + > static int > testsuite_setup(void) > { > struct crypto_testsuite_params *ts_params =3D &testsuite_params; > struct rte_cryptodev_info info; > - uint32_t i =3D 0, nb_devs, dev_id; > + uint32_t i =3D 0, nb_devs; > uint16_t qp_id; > > memset(ts_params, 0, sizeof(*ts_params)); > @@ -631,22 +634,26 @@ testsuite_setup(void) > if (ts_params->valid_dev_count < 1) > return TEST_FAILED; > > - /* Set up all the qps on the first of the valid devices found */ > - > - dev_id =3D ts_params->valid_devs[0]; > - > - rte_cryptodev_info_get(dev_id, &info); > + ts_params->dev_id =3D ts_params->valid_devs[0]; > + rte_cryptodev_info_get(ts_params->dev_id, &ts_params->dev_info); > + /* Check if this device does not support symmetric crypto */ > + if (!(ts_params->dev_info.feature_flags & > RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) { > + RTE_LOG(INFO, USER1, "Feature flag requirements for AES > GCM " > + "testsuite not met\n"); > + return TEST_SKIPPED; > + } > > - ts_params->conf.nb_queue_pairs =3D info.max_nb_queue_pairs; > + /* Set up all the qps on the first of the valid devices found */ > + ts_params->conf.nb_queue_pairs =3D > ts_params->dev_info.max_nb_queue_pairs; > ts_params->conf.socket_id =3D SOCKET_ID_ANY; > ts_params->conf.ff_disable =3D RTE_CRYPTODEV_FF_SECURITY; > > unsigned int session_size =3D > - rte_cryptodev_sym_get_private_session_size(dev_id); > + > rte_cryptodev_sym_get_private_session_size(ts_params->dev_id); > > #ifdef RTE_LIB_SECURITY > unsigned int security_session_size =3D rte_security_session_get_s= ize( > - rte_cryptodev_get_sec_ctx(dev_id)); > + rte_cryptodev_get_sec_ctx(ts_params->dev_id)); > > if (session_size < security_session_size) > session_size =3D security_session_size; > @@ -654,8 +661,8 @@ testsuite_setup(void) > /* > * Create mempool with maximum number of sessions. > */ > - if (info.sym.max_nb_sessions !=3D 0 && > - info.sym.max_nb_sessions < MAX_NB_SESSIONS) { > + if (ts_params->dev_info.sym.max_nb_sessions !=3D 0 && > + ts_params->dev_info.sym.max_nb_sessions < > MAX_NB_SESSIONS) { > RTE_LOG(ERR, USER1, "Device does not support " > "at least %u sessions\n", > MAX_NB_SESSIONS); > @@ -668,22 +675,30 @@ testsuite_setup(void) > TEST_ASSERT_NOT_NULL(ts_params->session_mpool, > "session mempool allocation failed"); > > - TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, > + TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->dev_id, > &ts_params->conf), > "Failed to configure cryptodev %u with %u qps", > - dev_id, ts_params->conf.nb_queue_pairs); > + ts_params->dev_id, ts_params->conf.nb_queue_pairs= ); > > ts_params->qp_conf.nb_descriptors =3D MAX_NUM_OPS_INFLIGHT; > ts_params->qp_conf.mp_session =3D ts_params->session_mpool; > > - for (qp_id =3D 0; qp_id < info.max_nb_queue_pairs; qp_id++) { > + for (qp_id =3D 0; qp_id < ts_params->dev_info.max_nb_queue_pairs; > qp_id++) { > TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( > - dev_id, qp_id, &ts_params->qp_conf, > - rte_cryptodev_socket_id(dev_id)), > + ts_params->dev_id, qp_id, &ts_params->qp_conf, > + rte_cryptodev_socket_id(ts_params->dev_id)), > "Failed to setup queue pair %u on cryptodev %u", > - qp_id, dev_id); > + qp_id, ts_params->dev_id); > } > > + rte_cryptodev_stats_reset(ts_params->dev_id); > + > + /* Start the device */ > + TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->dev_id), > + "Failed to start cryptodev %u", > + ts_params->dev_id); > + > + > return TEST_SUCCESS; > } > > @@ -708,432 +723,440 @@ testsuite_teardown(void) > ts_params->session_mpool =3D NULL; > } > > + rte_cryptodev_stop(ts_params->valid_devs[0]); > res =3D rte_cryptodev_close(ts_params->valid_devs[0]); > if (res) > RTE_LOG(ERR, USER1, "Crypto device close error %d\n", res= ); > } > > static int > -check_capabilities_supported(enum rte_crypto_sym_xform_type type, > - const int *algs, uint16_t num_algs) > +dev_configure_and_start(uint64_t ff_disable) > { > - uint8_t dev_id =3D testsuite_params.valid_devs[0]; > - bool some_alg_supported =3D FALSE; > - uint16_t i; > + struct crypto_testsuite_params *ts_params =3D &testsuite_params; > + struct crypto_unittest_params *ut_params =3D &unittest_params; > > - for (i =3D 0; i < num_algs && !some_alg_supported; i++) { > - struct rte_cryptodev_sym_capability_idx alg =3D { > - type, {algs[i]} > - }; > - if (rte_cryptodev_sym_capability_get(dev_id, > - &alg) !=3D NULL) > - some_alg_supported =3D TRUE; > + uint16_t qp_id; > + > + /* Clear unit test parameters before running test */ > + memset(ut_params, 0, sizeof(*ut_params)); > + > + /* Reconfigure device to default parameters */ > + ts_params->conf.socket_id =3D SOCKET_ID_ANY; > + ts_params->conf.ff_disable =3D ff_disable; > + ts_params->qp_conf.nb_descriptors =3D MAX_NUM_OPS_INFLIGHT; > + ts_params->qp_conf.mp_session =3D ts_params->session_mpool; > + > + > TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0], > + &ts_params->conf), > + "Failed to configure cryptodev %u", > + ts_params->valid_devs[0]); > + > + for (qp_id =3D 0; qp_id < ts_params->conf.nb_queue_pairs ; qp_id+= +) { > + TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( > + ts_params->valid_devs[0], qp_id, > + &ts_params->qp_conf, > + rte_cryptodev_socket_id(ts_params->valid_devs[0])= ), > + "Failed to setup queue pair %u on cryptodev %u", > + qp_id, ts_params->valid_devs[0]); > } > - if (!some_alg_supported) > - return TEST_SKIPPED; > > - return 0; > -} > + rte_cryptodev_stats_reset(ts_params->valid_devs[0]); > > -int > -check_cipher_capabilities_supported(const enum > rte_crypto_cipher_algorithm *ciphers, > - uint16_t num_ciphers) > -{ > - return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_CIPHER, > - (const int *) ciphers, num_ciphers); > + /* Start the device */ > + TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->valid_devs[0])= , > + "Failed to start cryptodev %u", > + ts_params->valid_devs[0]); > + > + /* Generate Crypto op data structure */ > + ut_params->op =3D rte_crypto_op_alloc(ts_params->op_mpool, > + RTE_CRYPTO_OP_TYPE_SYMMETRIC); > + TEST_ASSERT_NOT_NULL(ut_params->op, > + "Failed to allocate symmetric crypto operation > struct"); > + > + return TEST_SUCCESS; > } > > -int > -check_auth_capabilities_supported(const enum rte_crypto_auth_algorithm > *auths, > - uint16_t num_auths) > +/* > + * Configure and start the device, configure single (first) queue pair > + */ > +static int > +dev_start(void) > { > - return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AUTH, > - (const int *) auths, num_auths); > + int qp_id =3D 0; > + struct rte_cryptodev_config conf =3D { > + .socket_id =3D SOCKET_ID_ANY, > + .nb_queue_pairs =3D 1, > + }; > + const struct rte_cryptodev_qp_conf qp_conf =3D { > + .nb_descriptors =3D MAX_NUM_OPS_INFLIGHT, > + .mp_session =3D p_ts_params->session_mpool > + }; > + > + TEST_ASSERT_SUCCESS( > + rte_cryptodev_configure( > + p_ts_params->dev_id, &conf > + ), > + "Failed to configure cryptodev %u", > + p_ts_params->dev_id > + ); > + TEST_ASSERT_SUCCESS( > + rte_cryptodev_queue_pair_setup( > + p_ts_params->dev_id, qp_id, &qp_conf, > + rte_cryptodev_socket_id(p_ts_params->dev_id) > + ), > + "Failed to setup queue pair %u on cryptodev %u", > + qp_id, p_ts_params->dev_id > + ); > + rte_cryptodev_stats_reset(p_ts_params->dev_id); > + TEST_ASSERT_SUCCESS( > + rte_cryptodev_start( > + p_ts_params->dev_id > + ), > + "Failed to start cryptodev %u", > + p_ts_params->dev_id > + ); > + > + return 0; > } > > -int > -check_aead_capabilities_supported(const enum rte_crypto_aead_algorithm > *aeads, > - uint16_t num_aeads) > +static void > +dev_stop(void) > { > - return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AEAD, > - (const int *) aeads, num_aeads); > + rte_cryptodev_stop(p_ts_params->dev_id); > } > > +/* > + * Individual testsuites setup/teardown functions below > + */ > + > static int > -null_testsuite_setup(void) > +ts_setup_aes_gcm(void) > { > - struct crypto_testsuite_params *ts_params =3D &testsuite_params; > - uint8_t dev_id =3D ts_params->valid_devs[0]; > - struct rte_cryptodev_info dev_info; > - const enum rte_crypto_cipher_algorithm ciphers[] =3D { > - RTE_CRYPTO_CIPHER_NULL > - }; > - const enum rte_crypto_auth_algorithm auths[] =3D { > - RTE_CRYPTO_AUTH_NULL > + const enum rte_crypto_aead_algorithm aeads[] =3D { > + RTE_CRYPTO_AEAD_AES_GCM > }; > > - rte_cryptodev_info_get(dev_id, &dev_info); > - > - if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)= ) > { > - RTE_LOG(INFO, USER1, "Feature flag requirements for NULL = " > - "testsuite not met\n"); > - return TEST_SKIPPED; > - } > - > - if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)= ) > !=3D 0 > - && check_auth_capabilities_supported(auths, > - RTE_DIM(auths)) !=3D 0) { > - RTE_LOG(INFO, USER1, "Capability requirements for NULL " > + if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) !=3D= 0) > { > + RTE_LOG(INFO, USER1, "Capability requirements for AES GCM= " > "testsuite not met\n"); > return TEST_SKIPPED; > } > + TEST_ASSERT_SUCCESS(dev_start(), "Failed to start the device"); > > return 0; > } > > static int > -crypto_gen_testsuite_setup(void) > +ts_setup_aes_ccm(void) > { > - struct crypto_testsuite_params *ts_params =3D &testsuite_params; > - uint8_t dev_id =3D ts_params->valid_devs[0]; > - struct rte_cryptodev_info dev_info; > + const enum rte_crypto_aead_algorithm aeads[] =3D { > + RTE_CRYPTO_AEAD_AES_CCM > + }; > > - rte_cryptodev_info_get(dev_id, &dev_info); > + if (!(p_ts_params->dev_info.feature_flags & > RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || > + ((global_api_test_type =3D=3D CRYPTODEV_RAW_API_T= EST) > && > + !(p_ts_params->dev_info.feature_flags & > RTE_CRYPTODEV_FF_SYM_RAW_DP))) { > + RTE_LOG(INFO, USER1, "Feature flag requirements for AES > CCM " > + "testsuite not met\n"); > + return TEST_SKIPPED; > + } > > - if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)= ) > { > - RTE_LOG(INFO, USER1, "Feature flag requirements for Crypt= o > Gen " > + if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) !=3D= 0) > { > + RTE_LOG(INFO, USER1, "Capability requirements for AES CCM= " > "testsuite not met\n"); > return TEST_SKIPPED; > } > + TEST_ASSERT_SUCCESS(dev_start(), "Failed to start the device"); > > return 0; > } > > -#ifdef RTE_LIB_SECURITY > static int > -sec_proto_testsuite_setup(enum rte_security_session_protocol protocol) > +ts_setup_aes_gmac(void) > { > - struct crypto_testsuite_params *ts_params =3D &testsuite_params; > - struct crypto_unittest_params *ut_params =3D &unittest_params; > - struct rte_cryptodev_info dev_info; > - int ret =3D 0; > - > - rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); > + const enum rte_crypto_auth_algorithm auths[] =3D { > + RTE_CRYPTO_AUTH_AES_GMAC > + }; > > - if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SECURITY)) { > - RTE_LOG(INFO, USER1, > - "Feature flag requirements for security protocol > testsuite not met\n"); > + if (!(p_ts_params->dev_info.feature_flags & > RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || > + ((global_api_test_type =3D=3D CRYPTODEV_RAW_API_T= EST) > && > + !(p_ts_params->dev_info.feature_flags & > RTE_CRYPTODEV_FF_SYM_RAW_DP))) { > + RTE_LOG(INFO, USER1, "Feature flag requirements for AES > GMAC " > + "testsuite not met\n"); > return TEST_SKIPPED; > } > > - /* Reconfigure to enable security */ > - ret =3D dev_configure_and_start(0); > - if (ret !=3D TEST_SUCCESS) > - return ret; > - > - /* Set action type */ > - ut_params->type =3D RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL; > - > - if > (security_proto_supported(RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL, > protocol) < 0) { > - RTE_LOG(INFO, USER1, > - "Capability requirements for security protocol > test not met\n"); > - ret =3D TEST_SKIPPED; > + if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) !=3D= 0) > { > + RTE_LOG(INFO, USER1, "Capability requirements for AES GMA= C > " > + "testsuite not met\n"); > + return TEST_SKIPPED; > } > + TEST_ASSERT_SUCCESS(dev_start(), "Failed to start the device"); > > - test_sec_alg_list_populate(); > - test_sec_auth_only_alg_list_populate(); > - > - /* > - * Stop the device. Device would be started again by individual > test > - * case setup routine. > - */ > - rte_cryptodev_stop(ts_params->valid_devs[0]); > - > - return ret; > -} > - > -static int > -ipsec_proto_testsuite_setup(void) > -{ > - return sec_proto_testsuite_setup(RTE_SECURITY_PROTOCOL_IPSEC); > -} > - > -static int > -tls_record_proto_testsuite_setup(void) > -{ > - test_sec_proto_pattern_generate(); > - > - return sec_proto_testsuite_setup(RTE_SECURITY_PROTOCOL_TLS_RECORD= ); > + return 0; > } > > static int > -pdcp_proto_testsuite_setup(void) > +ts_setup_snow3g(void) > { > - struct crypto_testsuite_params *ts_params =3D &testsuite_params; > - uint8_t dev_id =3D ts_params->valid_devs[0]; > - struct rte_cryptodev_info dev_info; > const enum rte_crypto_cipher_algorithm ciphers[] =3D { > - RTE_CRYPTO_CIPHER_NULL, > - RTE_CRYPTO_CIPHER_AES_CTR, > - RTE_CRYPTO_CIPHER_ZUC_EEA3, > RTE_CRYPTO_CIPHER_SNOW3G_UEA2 > + > }; > const enum rte_crypto_auth_algorithm auths[] =3D { > - RTE_CRYPTO_AUTH_NULL, > - RTE_CRYPTO_AUTH_SNOW3G_UIA2, > - RTE_CRYPTO_AUTH_AES_CMAC, > - RTE_CRYPTO_AUTH_ZUC_EIA3 > + RTE_CRYPTO_AUTH_SNOW3G_UIA2 > }; > > - RTE_BUILD_BUG_ON(RTE_DIM(pdcp_test_params) !=3D > RTE_DIM(pdcp_test_auth_key)); > - RTE_BUILD_BUG_ON(RTE_DIM(pdcp_test_params) !=3D > RTE_DIM(pdcp_test_bearer)); > - RTE_BUILD_BUG_ON(RTE_DIM(pdcp_test_params) !=3D > RTE_DIM(pdcp_test_crypto_key)); > - RTE_BUILD_BUG_ON(RTE_DIM(pdcp_test_params) !=3D > RTE_DIM(pdcp_test_data_in)); > - RTE_BUILD_BUG_ON(RTE_DIM(pdcp_test_params) !=3D > RTE_DIM(pdcp_test_data_in_len)); > - RTE_BUILD_BUG_ON(RTE_DIM(pdcp_test_params) !=3D > RTE_DIM(pdcp_test_data_out)); > - RTE_BUILD_BUG_ON(RTE_DIM(pdcp_test_params) !=3D > RTE_DIM(pdcp_test_data_sn_size)); > - RTE_BUILD_BUG_ON(RTE_DIM(pdcp_test_params) !=3D > RTE_DIM(pdcp_test_hfn)); > - RTE_BUILD_BUG_ON(RTE_DIM(pdcp_test_params) !=3D > RTE_DIM(pdcp_test_hfn_threshold)); > - RTE_BUILD_BUG_ON(RTE_DIM(pdcp_test_params) !=3D > RTE_DIM(pdcp_test_packet_direction)); > - > - rte_cryptodev_info_get(dev_id, &dev_info); > - > - if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) > || > - !(dev_info.feature_flags & > - RTE_CRYPTODEV_FF_SECURITY)) { > - RTE_LOG(INFO, USER1, "Feature flag requirements for PDCP > Proto " > - "testsuite not met\n"); > - return TEST_SKIPPED; > - } > - > if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)= ) > !=3D 0 > && check_auth_capabilities_supported(auths, > RTE_DIM(auths)) !=3D 0) { > - RTE_LOG(INFO, USER1, "Capability requirements for PDCP > Proto " > + RTE_LOG(INFO, USER1, "Capability requirements for Snow3G = " > "testsuite not met\n"); > return TEST_SKIPPED; > } > + TEST_ASSERT_SUCCESS(dev_start(), "Failed to start the device"); > > return 0; > } > > static int > -docsis_proto_testsuite_setup(void) > +ts_setup_chacha20_poly1305(void) > { > - struct crypto_testsuite_params *ts_params =3D &testsuite_params; > - uint8_t dev_id =3D ts_params->valid_devs[0]; > - struct rte_cryptodev_info dev_info; > - const enum rte_crypto_cipher_algorithm ciphers[] =3D { > - RTE_CRYPTO_CIPHER_AES_DOCSISBPI > + const enum rte_crypto_aead_algorithm aeads[] =3D { > + RTE_CRYPTO_AEAD_CHACHA20_POLY1305 > }; > > - rte_cryptodev_info_get(dev_id, &dev_info); > - > - if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) > || > - !(dev_info.feature_flags & > - RTE_CRYPTODEV_FF_SECURITY)) { > - RTE_LOG(INFO, USER1, "Feature flag requirements for DOCSI= S > " > - "Proto testsuite not met\n"); > + if (!(p_ts_params->dev_info.feature_flags & > RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || > + ((global_api_test_type =3D=3D CRYPTODEV_RAW_API_T= EST) > && > + !(p_ts_params->dev_info.feature_flags & > RTE_CRYPTODEV_FF_SYM_RAW_DP))) { > + RTE_LOG(INFO, USER1, "Feature flag requirements for " > + "Chacha20-Poly1305 testsuite not met\n"); > return TEST_SKIPPED; > } > > - if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)= ) > !=3D 0) { > - RTE_LOG(INFO, USER1, "Capability requirements for DOCSIS > Proto " > - "testsuite not met\n"); > + if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) !=3D= 0) > { > + RTE_LOG(INFO, USER1, "Capability requirements for " > + "Chacha20-Poly1305 testsuite not met\n"); > return TEST_SKIPPED; > } > + TEST_ASSERT_SUCCESS(dev_start(), "Failed to start the device"); > > return 0; > } > -#endif > > static int > -aes_ccm_auth_testsuite_setup(void) > +ts_setup_zuc(void) > { > - struct crypto_testsuite_params *ts_params =3D &testsuite_params; > - uint8_t dev_id =3D ts_params->valid_devs[0]; > - struct rte_cryptodev_info dev_info; > - const enum rte_crypto_aead_algorithm aeads[] =3D { > - RTE_CRYPTO_AEAD_AES_CCM > + const enum rte_crypto_cipher_algorithm ciphers[] =3D { > + RTE_CRYPTO_CIPHER_ZUC_EEA3 > + }; > + const enum rte_crypto_auth_algorithm auths[] =3D { > + RTE_CRYPTO_AUTH_ZUC_EIA3 > }; > > - rte_cryptodev_info_get(dev_id, &dev_info); > + if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)= ) > !=3D 0 > + && check_auth_capabilities_supported(auths, > + RTE_DIM(auths)) !=3D 0) { > + RTE_LOG(INFO, USER1, "Capability requirements for ZUC " > + "testsuite not met\n"); > + return TEST_SKIPPED; > + } > + TEST_ASSERT_SUCCESS(dev_start(), "Failed to start the device"); > > - if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) > || > + return 0; > +} > + > +static int > +ts_setup_hmac_md5(void) > +{ > + const enum rte_crypto_auth_algorithm auths[] =3D { > + RTE_CRYPTO_AUTH_MD5_HMAC > + }; > + > + if (!(p_ts_params->dev_info.feature_flags & > RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || > ((global_api_test_type =3D=3D CRYPTODEV_RAW_API_T= EST) > && > - !(dev_info.feature_flags & > RTE_CRYPTODEV_FF_SYM_RAW_DP))) { > - RTE_LOG(INFO, USER1, "Feature flag requirements for AES > CCM " > - "testsuite not met\n"); > + !(p_ts_params->dev_info.feature_flags & > RTE_CRYPTODEV_FF_SYM_RAW_DP))) { > + RTE_LOG(INFO, USER1, "Feature flag requirements for HMAC > MD5 " > + "Auth testsuite not met\n"); > return TEST_SKIPPED; > } > > - if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) !=3D= 0) > { > - RTE_LOG(INFO, USER1, "Capability requirements for AES CCM= " > + if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) !=3D= 0) > { > + RTE_LOG(INFO, USER1, "Capability requirements for HMAC MD= 5 > " > "testsuite not met\n"); > return TEST_SKIPPED; > } > + TEST_ASSERT_SUCCESS(dev_start(), "Failed to start the device"); > > return 0; > } > > static int > -aes_gcm_auth_testsuite_setup(void) > +ts_setup_kasumi(void) > { > - struct crypto_testsuite_params *ts_params =3D &testsuite_params; > - uint8_t dev_id =3D ts_params->valid_devs[0]; > - struct rte_cryptodev_info dev_info; > - const enum rte_crypto_aead_algorithm aeads[] =3D { > - RTE_CRYPTO_AEAD_AES_GCM > + const enum rte_crypto_cipher_algorithm ciphers[] =3D { > + RTE_CRYPTO_CIPHER_KASUMI_F8 > + }; > + const enum rte_crypto_auth_algorithm auths[] =3D { > + RTE_CRYPTO_AUTH_KASUMI_F9 > }; > > - rte_cryptodev_info_get(dev_id, &dev_info); > - > - if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)= ) > { > - RTE_LOG(INFO, USER1, "Feature flag requirements for AES > GCM " > + if (!(p_ts_params->dev_info.feature_flags & > RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || > + ((global_api_test_type =3D=3D CRYPTODEV_RAW_API_T= EST) > && > + !(p_ts_params->dev_info.feature_flags & > RTE_CRYPTODEV_FF_SYM_RAW_DP))) { > + RTE_LOG(INFO, USER1, "Feature flag requirements for Kasum= i > " > "testsuite not met\n"); > return TEST_SKIPPED; > } > > - if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) !=3D= 0) > { > - RTE_LOG(INFO, USER1, "Capability requirements for AES GCM= " > + if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)= ) > !=3D 0 > + && check_auth_capabilities_supported(auths, > + RTE_DIM(auths)) !=3D 0) { > + RTE_LOG(INFO, USER1, "Capability requirements for Kasumi = " > "testsuite not met\n"); > return TEST_SKIPPED; > } > + TEST_ASSERT_SUCCESS(dev_start(), "Failed to start the device"); > > return 0; > } > > static int > -aes_gmac_auth_testsuite_setup(void) > +ts_setup_esn(void) > { > - struct crypto_testsuite_params *ts_params =3D &testsuite_params; > - uint8_t dev_id =3D ts_params->valid_devs[0]; > - struct rte_cryptodev_info dev_info; > + const enum rte_crypto_cipher_algorithm ciphers[] =3D { > + RTE_CRYPTO_CIPHER_AES_CBC > + }; > const enum rte_crypto_auth_algorithm auths[] =3D { > - RTE_CRYPTO_AUTH_AES_GMAC > + RTE_CRYPTO_AUTH_SHA1_HMAC > }; > > - rte_cryptodev_info_get(dev_id, &dev_info); > - > - if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) > || > + if (!(p_ts_params->dev_info.feature_flags & > RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || > ((global_api_test_type =3D=3D CRYPTODEV_RAW_API_T= EST) > && > - !(dev_info.feature_flags & > RTE_CRYPTODEV_FF_SYM_RAW_DP))) { > - RTE_LOG(INFO, USER1, "Feature flag requirements for AES > GMAC " > + !(p_ts_params->dev_info.feature_flags & > RTE_CRYPTODEV_FF_SYM_RAW_DP))) { > + RTE_LOG(INFO, USER1, "Feature flag requirements for ESN " > "testsuite not met\n"); > return TEST_SKIPPED; > } > > - if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) !=3D= 0) > { > - RTE_LOG(INFO, USER1, "Capability requirements for AES GMA= C > " > + if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)= ) > !=3D 0 > + && check_auth_capabilities_supported(auths, > + RTE_DIM(auths)) !=3D 0) { > + RTE_LOG(INFO, USER1, "Capability requirements for ESN " > "testsuite not met\n"); > return TEST_SKIPPED; > } > + TEST_ASSERT_SUCCESS(dev_start(), "Failed to start the device"); > > return 0; > } > > + > static int > -chacha20_poly1305_testsuite_setup(void) > +ts_setup_negative_aes_gcm(void) > { > - struct crypto_testsuite_params *ts_params =3D &testsuite_params; > - uint8_t dev_id =3D ts_params->valid_devs[0]; > - struct rte_cryptodev_info dev_info; > const enum rte_crypto_aead_algorithm aeads[] =3D { > - RTE_CRYPTO_AEAD_CHACHA20_POLY1305 > + RTE_CRYPTO_AEAD_AES_GCM > }; > > - rte_cryptodev_info_get(dev_id, &dev_info); > - > - if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) > || > + if (!(p_ts_params->dev_info.feature_flags & > RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || > ((global_api_test_type =3D=3D CRYPTODEV_RAW_API_T= EST) > && > - !(dev_info.feature_flags & > RTE_CRYPTODEV_FF_SYM_RAW_DP))) { > - RTE_LOG(INFO, USER1, "Feature flag requirements for " > - "Chacha20-Poly1305 testsuite not met\n"); > + !(p_ts_params->dev_info.feature_flags & > RTE_CRYPTODEV_FF_SYM_RAW_DP))) { > + RTE_LOG(INFO, USER1, "Feature flag requirements for > Negative " > + "AES GCM testsuite not met\n"); > return TEST_SKIPPED; > } > > if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) !=3D= 0) > { > - RTE_LOG(INFO, USER1, "Capability requirements for " > - "Chacha20-Poly1305 testsuite not met\n"); > + RTE_LOG(INFO, USER1, "Capability requirements for Negativ= e > " > + "AES GCM testsuite not met\n"); > return TEST_SKIPPED; > } > + TEST_ASSERT_SUCCESS(dev_start(), "Failed to start the device"); > > return 0; > } > > + > static int > -snow3g_testsuite_setup(void) > +ts_setup_negative_aes_gmac(void) > { > - struct crypto_testsuite_params *ts_params =3D &testsuite_params; > - uint8_t dev_id =3D ts_params->valid_devs[0]; > - struct rte_cryptodev_info dev_info; > - const enum rte_crypto_cipher_algorithm ciphers[] =3D { > - RTE_CRYPTO_CIPHER_SNOW3G_UEA2 > - > - }; > const enum rte_crypto_auth_algorithm auths[] =3D { > - RTE_CRYPTO_AUTH_SNOW3G_UIA2 > + RTE_CRYPTO_AUTH_AES_GMAC > }; > > - rte_cryptodev_info_get(dev_id, &dev_info); > - > - if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)= ) > { > - RTE_LOG(INFO, USER1, "Feature flag requirements for Snow3= G > " > - "testsuite not met\n"); > + if (!(p_ts_params->dev_info.feature_flags & > RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || > + ((global_api_test_type =3D=3D CRYPTODEV_RAW_API_T= EST) > && > + !(p_ts_params->dev_info.feature_flags & > RTE_CRYPTODEV_FF_SYM_RAW_DP))) { > + RTE_LOG(INFO, USER1, "Feature flag requirements for > Negative " > + "AES GMAC testsuite not met\n"); > return TEST_SKIPPED; > } > > - if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)= ) > !=3D 0 > - && check_auth_capabilities_supported(auths, > - RTE_DIM(auths)) !=3D 0) { > - RTE_LOG(INFO, USER1, "Capability requirements for Snow3G = " > - "testsuite not met\n"); > + if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) !=3D= 0) > { > + RTE_LOG(INFO, USER1, "Capability requirements for Negativ= e > " > + "AES GMAC testsuite not met\n"); > return TEST_SKIPPED; > } > + TEST_ASSERT_SUCCESS(dev_start(), "Failed to start the device"); > > return 0; > } > > static int > -zuc_testsuite_setup(void) > +ts_setup_mixed_cipher_hash(void) > { > struct crypto_testsuite_params *ts_params =3D &testsuite_params; > uint8_t dev_id =3D ts_params->valid_devs[0]; > struct rte_cryptodev_info dev_info; > + uint64_t feat_flags; > const enum rte_crypto_cipher_algorithm ciphers[] =3D { > - RTE_CRYPTO_CIPHER_ZUC_EEA3 > + RTE_CRYPTO_CIPHER_NULL, > + RTE_CRYPTO_CIPHER_AES_CTR, > + RTE_CRYPTO_CIPHER_ZUC_EEA3, > + RTE_CRYPTO_CIPHER_SNOW3G_UEA2 > }; > const enum rte_crypto_auth_algorithm auths[] =3D { > + RTE_CRYPTO_AUTH_NULL, > + RTE_CRYPTO_AUTH_SNOW3G_UIA2, > + RTE_CRYPTO_AUTH_AES_CMAC, > RTE_CRYPTO_AUTH_ZUC_EIA3 > }; > > rte_cryptodev_info_get(dev_id, &dev_info); > + feat_flags =3D dev_info.feature_flags; > > - if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)= ) > { > - RTE_LOG(INFO, USER1, "Feature flag requirements for ZUC " > - "testsuite not met\n"); > + if (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || > + (global_api_test_type =3D=3D CRYPTODEV_RAW_API_TE= ST)) { > + RTE_LOG(INFO, USER1, "Feature flag requirements for Mixed= " > + "Cipher Hash testsuite not met\n"); > return TEST_SKIPPED; > } > > if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)= ) > !=3D 0 > && check_auth_capabilities_supported(auths, > RTE_DIM(auths)) !=3D 0) { > - RTE_LOG(INFO, USER1, "Capability requirements for ZUC " > - "testsuite not met\n"); > + RTE_LOG(INFO, USER1, "Capability requirements for Mixed " > + "Cipher Hash testsuite not met\n"); > return TEST_SKIPPED; > } > + TEST_ASSERT_SUCCESS(dev_start(), "Failed to start the device"); > > return 0; > } > > + > static int > -hmac_md5_auth_testsuite_setup(void) > +ts_setup_negative_hmac_sha1(void) > { > struct crypto_testsuite_params *ts_params =3D &testsuite_params; > uint8_t dev_id =3D ts_params->valid_devs[0]; > struct rte_cryptodev_info dev_info; > + const enum rte_crypto_cipher_algorithm ciphers[] =3D { > + RTE_CRYPTO_CIPHER_AES_CBC > + }; > const enum rte_crypto_auth_algorithm auths[] =3D { > - RTE_CRYPTO_AUTH_MD5_HMAC > + RTE_CRYPTO_AUTH_SHA1_HMAC > }; > > rte_cryptodev_info_get(dev_id, &dev_info); > @@ -1141,119 +1164,286 @@ hmac_md5_auth_testsuite_setup(void) > if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) > || > ((global_api_test_type =3D=3D CRYPTODEV_RAW_API_T= EST) > && > !(dev_info.feature_flags & > RTE_CRYPTODEV_FF_SYM_RAW_DP))) { > - RTE_LOG(INFO, USER1, "Feature flag requirements for HMAC > MD5 " > - "Auth testsuite not met\n"); > + RTE_LOG(INFO, USER1, "Feature flag requirements for > Negative " > + "HMAC SHA1 testsuite not met\n"); > return TEST_SKIPPED; > } > > - if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) !=3D= 0) > { > - RTE_LOG(INFO, USER1, "Capability requirements for HMAC MD= 5 > " > - "testsuite not met\n"); > + if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)= ) > !=3D 0 > + && check_auth_capabilities_supported(auths, > + RTE_DIM(auths)) !=3D 0) { > + RTE_LOG(INFO, USER1, "Capability requirements for Negativ= e > " > + "HMAC SHA1 testsuite not met\n"); > return TEST_SKIPPED; > } > + TEST_ASSERT_SUCCESS(dev_start(), "Failed to start the device"); > > return 0; > } > > static int > -kasumi_testsuite_setup(void) > +ts_setup_crypto_gen(void) > { > - struct crypto_testsuite_params *ts_params =3D &testsuite_params; > - uint8_t dev_id =3D ts_params->valid_devs[0]; > - struct rte_cryptodev_info dev_info; > + return 0; > +} > + > +static int > +ts_setup_multi_session(void) > +{ > + dev_stop(); > const enum rte_crypto_cipher_algorithm ciphers[] =3D { > - RTE_CRYPTO_CIPHER_KASUMI_F8 > + RTE_CRYPTO_CIPHER_AES_CBC > }; > const enum rte_crypto_auth_algorithm auths[] =3D { > - RTE_CRYPTO_AUTH_KASUMI_F9 > + RTE_CRYPTO_AUTH_SHA512_HMAC > }; > > - rte_cryptodev_info_get(dev_id, &dev_info); > - > - if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) > || > - ((global_api_test_type =3D=3D CRYPTODEV_RAW_API_T= EST) > && > - !(dev_info.feature_flags & > RTE_CRYPTODEV_FF_SYM_RAW_DP))) { > - RTE_LOG(INFO, USER1, "Feature flag requirements for Kasum= i > " > - "testsuite not met\n"); > + if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)= ) > !=3D 0 > + && check_auth_capabilities_supported(auths, > + RTE_DIM(auths)) !=3D 0) { > + RTE_LOG(INFO, USER1, "Capability requirements for Multi " > + "Session testsuite not met\n"); > return TEST_SKIPPED; > } > + TEST_ASSERT_SUCCESS(dev_start(), "Failed to start the device"); > + > + return 0; > +} > + > +static int > +ts_testsuite_null(void) > +{ > + const enum rte_crypto_cipher_algorithm ciphers[] =3D { > + RTE_CRYPTO_CIPHER_NULL > + }; > + const enum rte_crypto_auth_algorithm auths[] =3D { > + RTE_CRYPTO_AUTH_NULL > + }; > > if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)= ) > !=3D 0 > && check_auth_capabilities_supported(auths, > RTE_DIM(auths)) !=3D 0) { > - RTE_LOG(INFO, USER1, "Capability requirements for Kasumi = " > + RTE_LOG(INFO, USER1, "Capability requirements for NULL " > "testsuite not met\n"); > return TEST_SKIPPED; > } > + TEST_ASSERT_SUCCESS(dev_start(), "Failed to start the device"); > > return 0; > } > > -static int > -negative_aes_gcm_testsuite_setup(void) > +static void > +ts_teardown_generic(void) > +{ > + dev_stop(); > +} > + > +/* > + * This functions are responsbile for construction/destruction of > individual unit test context. > + */ > + > +int > +ut_setup(void) > +{ > + memset(self, 0, sizeof(*self)); > + self->op =3D rte_crypto_op_alloc(testsuite_params.op_mpool, > + RTE_CRYPTO_OP_TYPE_SYMMETRIC); > + TEST_ASSERT_NOT_NULL(self->op, > + "Failed to allocate symmetric crypto operation > struct"); > + return TEST_SUCCESS; > +} > + > +/* > + * Destruct unit test context, single op, single/multiple buffer. > + */ > + > +static void > +ut_teardown_aes_gcm(void) > +{ > + if (self->sess) { > + rte_cryptodev_sym_session_free(p_ts_params->valid_devs[0]= , > + self->sess); > + self->sess =3D NULL; > + } > + rte_crypto_op_free(self->op); > + rte_pktmbuf_free(self->ibuf); > + rte_pktmbuf_free(self->obuf); > + self->ibuf =3D 0; > +} > + > +void > +ut_teardown(void) > { > struct crypto_testsuite_params *ts_params =3D &testsuite_params; > - uint8_t dev_id =3D ts_params->valid_devs[0]; > - struct rte_cryptodev_info dev_info; > - const enum rte_crypto_aead_algorithm aeads[] =3D { > - RTE_CRYPTO_AEAD_AES_GCM > - }; > + struct crypto_unittest_params *ut_params =3D &unittest_params; > > - rte_cryptodev_info_get(dev_id, &dev_info); > + /* free crypto session structure */ > +#ifdef RTE_LIB_SECURITY > + if (ut_params->type =3D=3D > RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL) { > + if (ut_params->sec_session) { > + > rte_security_session_destroy(rte_cryptodev_get_sec_ctx > + (ts_params->valid_devs[0]= ), > + ut_params->sec_session); > + ut_params->sec_session =3D NULL; > + } > + } else > +#endif > + { > + if (ut_params->sess) { > + > rte_cryptodev_sym_session_free(ts_params->valid_devs[0], > + ut_params->sess); > + ut_params->sess =3D NULL; > + } > + } > > - if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) > || > - ((global_api_test_type =3D=3D CRYPTODEV_RAW_API_T= EST) > && > - !(dev_info.feature_flags & > RTE_CRYPTODEV_FF_SYM_RAW_DP))) { > - RTE_LOG(INFO, USER1, "Feature flag requirements for > Negative " > - "AES GCM testsuite not met\n"); > - return TEST_SKIPPED; > + /* free crypto operation structure */ > + rte_crypto_op_free(ut_params->op); > + > + /* > + * free mbuf - both obuf and ibuf are usually the same, > + * so check if they point at the same address is necessary, > + * to avoid freeing the mbuf twice. > + */ > + if (ut_params->obuf) { > + rte_pktmbuf_free(ut_params->obuf); > + if (ut_params->ibuf =3D=3D ut_params->obuf) > + ut_params->ibuf =3D 0; > + ut_params->obuf =3D 0; > + } > + if (ut_params->ibuf) { > + ext_mbuf_memzone_free(1); > + rte_pktmbuf_free(ut_params->ibuf); > + ut_params->ibuf =3D 0; > } > > - if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) !=3D= 0) > { > - RTE_LOG(INFO, USER1, "Capability requirements for Negativ= e > " > - "AES GCM testsuite not met\n"); > - return TEST_SKIPPED; > + if (ts_params->mbuf_pool !=3D NULL) > + RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n", > + rte_mempool_avail_count(ts_params->mbuf_pool)); > +} > + > +static int > +ut_setup_security(void) > +{ > + /* Configure and start the device with no features disabled */ > + return dev_configure_and_start(0); > + > + memset(self, 0, sizeof(*self)); > + self->op =3D rte_crypto_op_alloc(testsuite_params.op_mpool, > + RTE_CRYPTO_OP_TYPE_SYMMETRIC); > + TEST_ASSERT_NOT_NULL(self->op, > + "Failed to allocate symmetric crypto operation > struct"); > + return TEST_SUCCESS; > +} > + > +static int > +check_capabilities_supported(enum rte_crypto_sym_xform_type type, > + const int *algs, uint16_t num_algs) > +{ > + uint8_t dev_id =3D testsuite_params.valid_devs[0]; > + bool some_alg_supported =3D FALSE; > + uint16_t i; > + > + for (i =3D 0; i < num_algs && !some_alg_supported; i++) { > + struct rte_cryptodev_sym_capability_idx alg =3D { > + type, {algs[i]} > + }; > + if (rte_cryptodev_sym_capability_get(dev_id, > + &alg) !=3D NULL) > + some_alg_supported =3D TRUE; > } > + if (!some_alg_supported) > + return TEST_SKIPPED; > > return 0; > } > > +int > +check_cipher_capabilities_supported(const enum > rte_crypto_cipher_algorithm *ciphers, > + uint16_t num_ciphers) > +{ > + return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_CIPHER, > + (const int *) ciphers, num_ciphers); > +} > + > +int > +check_auth_capabilities_supported(const enum rte_crypto_auth_algorithm > *auths, > + uint16_t num_auths) > +{ > + return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AUTH, > + (const int *) auths, num_auths); > +} > + > +int > +check_aead_capabilities_supported(const enum rte_crypto_aead_algorithm > *aeads, > + uint16_t num_aeads) > +{ > + return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AEAD, > + (const int *) aeads, num_aeads); > +} > + > +#ifdef RTE_LIB_SECURITY > static int > -negative_aes_gmac_testsuite_setup(void) > +sec_proto_testsuite_setup(enum rte_security_session_protocol protocol) > { > struct crypto_testsuite_params *ts_params =3D &testsuite_params; > - uint8_t dev_id =3D ts_params->valid_devs[0]; > + struct crypto_unittest_params *ut_params =3D &unittest_params; > struct rte_cryptodev_info dev_info; > - const enum rte_crypto_auth_algorithm auths[] =3D { > - RTE_CRYPTO_AUTH_AES_GMAC > - }; > + int ret =3D 0; > > - rte_cryptodev_info_get(dev_id, &dev_info); > + rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); > > - if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) > || > - ((global_api_test_type =3D=3D CRYPTODEV_RAW_API_T= EST) > && > - !(dev_info.feature_flags & > RTE_CRYPTODEV_FF_SYM_RAW_DP))) { > - RTE_LOG(INFO, USER1, "Feature flag requirements for > Negative " > - "AES GMAC testsuite not met\n"); > + if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SECURITY)) { > + RTE_LOG(INFO, USER1, > + "Feature flag requirements for security protocol > testsuite not met\n"); > return TEST_SKIPPED; > } > > - if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) !=3D= 0) > { > - RTE_LOG(INFO, USER1, "Capability requirements for Negativ= e > " > - "AES GMAC testsuite not met\n"); > - return TEST_SKIPPED; > - } > + /* Reconfigure to enable security */ > + ret =3D dev_configure_and_start(0); > + if (ret !=3D TEST_SUCCESS) > + return ret; > + > + /* Set action type */ > + ut_params->type =3D RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL; > + > + if > (security_proto_supported(RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL, > protocol) < 0) { > + RTE_LOG(INFO, USER1, > + "Capability requirements for security protocol > test not met\n"); > + ret =3D TEST_SKIPPED; > + } > + > + test_sec_alg_list_populate(); > + test_sec_auth_only_alg_list_populate(); > + > + /* > + * Stop the device. Device would be started again by individual > test > + * case setup routine. > + */ > + rte_cryptodev_stop(ts_params->valid_devs[0]); > + > + return ret; > +} > > - return 0; > +static int > +ipsec_proto_testsuite_setup(void) > +{ > + return sec_proto_testsuite_setup(RTE_SECURITY_PROTOCOL_IPSEC); > +} > + > +static int > +tls_record_proto_testsuite_setup(void) > +{ > + test_sec_proto_pattern_generate(); > + > + return sec_proto_testsuite_setup(RTE_SECURITY_PROTOCOL_TLS_RECORD= ); > } > > static int > -mixed_cipher_hash_testsuite_setup(void) > +pdcp_proto_testsuite_setup(void) > { > struct crypto_testsuite_params *ts_params =3D &testsuite_params; > uint8_t dev_id =3D ts_params->valid_devs[0]; > struct rte_cryptodev_info dev_info; > - uint64_t feat_flags; > const enum rte_crypto_cipher_algorithm ciphers[] =3D { > RTE_CRYPTO_CIPHER_NULL, > RTE_CRYPTO_CIPHER_AES_CTR, > @@ -1267,46 +1457,23 @@ mixed_cipher_hash_testsuite_setup(void) > RTE_CRYPTO_AUTH_ZUC_EIA3 > }; > > - rte_cryptodev_info_get(dev_id, &dev_info); > - feat_flags =3D dev_info.feature_flags; > - > - if (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || > - (global_api_test_type =3D=3D CRYPTODEV_RAW_API_TE= ST)) { > - RTE_LOG(INFO, USER1, "Feature flag requirements for Mixed= " > - "Cipher Hash testsuite not met\n"); > - return TEST_SKIPPED; > - } > - > - if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)= ) > !=3D 0 > - && check_auth_capabilities_supported(auths, > - RTE_DIM(auths)) !=3D 0) { > - RTE_LOG(INFO, USER1, "Capability requirements for Mixed " > - "Cipher Hash testsuite not met\n"); > - return TEST_SKIPPED; > - } > - > - return 0; > -} > - > -static int > -esn_testsuite_setup(void) > -{ > - struct crypto_testsuite_params *ts_params =3D &testsuite_params; > - uint8_t dev_id =3D ts_params->valid_devs[0]; > - struct rte_cryptodev_info dev_info; > - const enum rte_crypto_cipher_algorithm ciphers[] =3D { > - RTE_CRYPTO_CIPHER_AES_CBC > - }; > - const enum rte_crypto_auth_algorithm auths[] =3D { > - RTE_CRYPTO_AUTH_SHA1_HMAC > - }; > + RTE_BUILD_BUG_ON(RTE_DIM(pdcp_test_params) !=3D > RTE_DIM(pdcp_test_auth_key)); > + RTE_BUILD_BUG_ON(RTE_DIM(pdcp_test_params) !=3D > RTE_DIM(pdcp_test_bearer)); > + RTE_BUILD_BUG_ON(RTE_DIM(pdcp_test_params) !=3D > RTE_DIM(pdcp_test_crypto_key)); > + RTE_BUILD_BUG_ON(RTE_DIM(pdcp_test_params) !=3D > RTE_DIM(pdcp_test_data_in)); > + RTE_BUILD_BUG_ON(RTE_DIM(pdcp_test_params) !=3D > RTE_DIM(pdcp_test_data_in_len)); > + RTE_BUILD_BUG_ON(RTE_DIM(pdcp_test_params) !=3D > RTE_DIM(pdcp_test_data_out)); > + RTE_BUILD_BUG_ON(RTE_DIM(pdcp_test_params) !=3D > RTE_DIM(pdcp_test_data_sn_size)); > + RTE_BUILD_BUG_ON(RTE_DIM(pdcp_test_params) !=3D > RTE_DIM(pdcp_test_hfn)); > + RTE_BUILD_BUG_ON(RTE_DIM(pdcp_test_params) !=3D > RTE_DIM(pdcp_test_hfn_threshold)); > + RTE_BUILD_BUG_ON(RTE_DIM(pdcp_test_params) !=3D > RTE_DIM(pdcp_test_packet_direction)); > > rte_cryptodev_info_get(dev_id, &dev_info); > > if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) > || > - ((global_api_test_type =3D=3D CRYPTODEV_RAW_API_T= EST) > && > - !(dev_info.feature_flags & > RTE_CRYPTODEV_FF_SYM_RAW_DP))) { > - RTE_LOG(INFO, USER1, "Feature flag requirements for ESN " > + !(dev_info.feature_flags & > + RTE_CRYPTODEV_FF_SECURITY)) { > + RTE_LOG(INFO, USER1, "Feature flag requirements for PDCP > Proto " > "testsuite not met\n"); > return TEST_SKIPPED; > } > @@ -1314,7 +1481,7 @@ esn_testsuite_setup(void) > if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)= ) > !=3D 0 > && check_auth_capabilities_supported(auths, > RTE_DIM(auths)) !=3D 0) { > - RTE_LOG(INFO, USER1, "Capability requirements for ESN " > + RTE_LOG(INFO, USER1, "Capability requirements for PDCP > Proto " > "testsuite not met\n"); > return TEST_SKIPPED; > } > @@ -1323,126 +1490,34 @@ esn_testsuite_setup(void) > } > > static int > -multi_session_testsuite_setup(void) > -{ > - struct crypto_testsuite_params *ts_params =3D &testsuite_params; > - uint8_t dev_id =3D ts_params->valid_devs[0]; > - struct rte_cryptodev_info dev_info; > - const enum rte_crypto_cipher_algorithm ciphers[] =3D { > - RTE_CRYPTO_CIPHER_AES_CBC > - }; > - const enum rte_crypto_auth_algorithm auths[] =3D { > - RTE_CRYPTO_AUTH_SHA512_HMAC > - }; > - > - rte_cryptodev_info_get(dev_id, &dev_info); > - > - if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)= ) > { > - RTE_LOG(INFO, USER1, "Feature flag requirements for Multi= " > - "Session testsuite not met\n"); > - return TEST_SKIPPED; > - } > - > - if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)= ) > !=3D 0 > - && check_auth_capabilities_supported(auths, > - RTE_DIM(auths)) !=3D 0) { > - RTE_LOG(INFO, USER1, "Capability requirements for Multi " > - "Session testsuite not met\n"); > - return TEST_SKIPPED; > - } > - > - return 0; > -} > - > -static int > -negative_hmac_sha1_testsuite_setup(void) > +docsis_proto_testsuite_setup(void) > { > struct crypto_testsuite_params *ts_params =3D &testsuite_params; > uint8_t dev_id =3D ts_params->valid_devs[0]; > struct rte_cryptodev_info dev_info; > const enum rte_crypto_cipher_algorithm ciphers[] =3D { > - RTE_CRYPTO_CIPHER_AES_CBC > - }; > - const enum rte_crypto_auth_algorithm auths[] =3D { > - RTE_CRYPTO_AUTH_SHA1_HMAC > + RTE_CRYPTO_CIPHER_AES_DOCSISBPI > }; > > rte_cryptodev_info_get(dev_id, &dev_info); > > if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) > || > - ((global_api_test_type =3D=3D CRYPTODEV_RAW_API_T= EST) > && > - !(dev_info.feature_flags & > RTE_CRYPTODEV_FF_SYM_RAW_DP))) { > - RTE_LOG(INFO, USER1, "Feature flag requirements for > Negative " > - "HMAC SHA1 testsuite not met\n"); > + !(dev_info.feature_flags & > + RTE_CRYPTODEV_FF_SECURITY)) { > + RTE_LOG(INFO, USER1, "Feature flag requirements for DOCSI= S > " > + "Proto testsuite not met\n"); > return TEST_SKIPPED; > } > > - if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)= ) > !=3D 0 > - && check_auth_capabilities_supported(auths, > - RTE_DIM(auths)) !=3D 0) { > - RTE_LOG(INFO, USER1, "Capability requirements for Negativ= e > " > - "HMAC SHA1 testsuite not met\n"); > + if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)= ) > !=3D 0) { > + RTE_LOG(INFO, USER1, "Capability requirements for DOCSIS > Proto " > + "testsuite not met\n"); > return TEST_SKIPPED; > } > > return 0; > } > - > -static int > -dev_configure_and_start(uint64_t ff_disable) > -{ > - struct crypto_testsuite_params *ts_params =3D &testsuite_params; > - struct crypto_unittest_params *ut_params =3D &unittest_params; > - > - uint16_t qp_id; > - > - /* Clear unit test parameters before running test */ > - memset(ut_params, 0, sizeof(*ut_params)); > - > - /* Reconfigure device to default parameters */ > - ts_params->conf.socket_id =3D SOCKET_ID_ANY; > - ts_params->conf.ff_disable =3D ff_disable; > - ts_params->qp_conf.nb_descriptors =3D MAX_NUM_OPS_INFLIGHT; > - ts_params->qp_conf.mp_session =3D ts_params->session_mpool; > - > - > TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0], > - &ts_params->conf), > - "Failed to configure cryptodev %u", > - ts_params->valid_devs[0]); > - > - for (qp_id =3D 0; qp_id < ts_params->conf.nb_queue_pairs ; qp_id+= +) { > - TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( > - ts_params->valid_devs[0], qp_id, > - &ts_params->qp_conf, > - rte_cryptodev_socket_id(ts_params->valid_devs[0])= ), > - "Failed to setup queue pair %u on cryptodev %u", > - qp_id, ts_params->valid_devs[0]); > - } > - > - > - rte_cryptodev_stats_reset(ts_params->valid_devs[0]); > - > - /* Start the device */ > - TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->valid_devs[0])= , > - "Failed to start cryptodev %u", > - ts_params->valid_devs[0]); > - > - return TEST_SUCCESS; > -} > - > -int > -ut_setup(void) > -{ > - /* Configure and start the device with security feature disabled = */ > - return dev_configure_and_start(RTE_CRYPTODEV_FF_SECURITY); > -} > - > -static int > -ut_setup_security(void) > -{ > - /* Configure and start the device with no features disabled */ > - return dev_configure_and_start(0); > -} > +#endif > > static int > ut_setup_security_rx_inject(void) > @@ -1661,59 +1736,6 @@ ext_mbuf_create(struct rte_mempool *mbuf_pool, int > pkt_len, > return NULL; > } > > -void > -ut_teardown(void) > -{ > - struct crypto_testsuite_params *ts_params =3D &testsuite_params; > - struct crypto_unittest_params *ut_params =3D &unittest_params; > - > - /* free crypto session structure */ > -#ifdef RTE_LIB_SECURITY > - if (ut_params->type =3D=3D > RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL) { > - if (ut_params->sec_session) { > - > rte_security_session_destroy(rte_cryptodev_get_sec_ctx > - (ts_params->valid_devs[0]= ), > - ut_params->sec_session); > - ut_params->sec_session =3D NULL; > - } > - } else > -#endif > - { > - if (ut_params->sess) { > - > rte_cryptodev_sym_session_free(ts_params->valid_devs[0], > - ut_params->sess); > - ut_params->sess =3D NULL; > - } > - } > - > - /* free crypto operation structure */ > - rte_crypto_op_free(ut_params->op); > - > - /* > - * free mbuf - both obuf and ibuf are usually the same, > - * so check if they point at the same address is necessary, > - * to avoid freeing the mbuf twice. > - */ > - if (ut_params->obuf) { > - rte_pktmbuf_free(ut_params->obuf); > - if (ut_params->ibuf =3D=3D ut_params->obuf) > - ut_params->ibuf =3D 0; > - ut_params->obuf =3D 0; > - } > - if (ut_params->ibuf) { > - ext_mbuf_memzone_free(1); > - rte_pktmbuf_free(ut_params->ibuf); > - ut_params->ibuf =3D 0; > - } > - > - if (ts_params->mbuf_pool !=3D NULL) > - RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n", > - rte_mempool_avail_count(ts_params->mbuf_pool)); > - > - /* Stop the device */ > - rte_cryptodev_stop(ts_params->valid_devs[0]); > -} > - > static void > ut_teardown_rx_inject(void) > { > @@ -1945,155 +1967,13 @@ test_queue_pair_descriptor_setup(void) > return TEST_SUCCESS; > } > > -/* ***** Plaintext data for tests ***** */ > - > -const char catch_22_quote_1[] =3D > - "There was only one catch and that was Catch-22, which " > - "specified that a concern for one's safety in the face of= " > - "dangers that were real and immediate was the process of = a > " > - "rational mind. Orr was crazy and could be grounded. All > he " > - "had to do was ask; and as soon as he did, he would no > longer " > - "be crazy and would have to fly more missions. Orr would > be " > - "crazy to fly more missions and sane if he didn't, but if > he " > - "was sane he had to fly them. If he flew them he was craz= y > " > - "and didn't have to; but if he didn't want to he was sane > and " > - "had to. Yossarian was moved very deeply by the absolute = " > - "simplicity of this clause of Catch-22 and let out a " > - "respectful whistle. \"That's some catch, that Catch-22\"= , > he " > - "observed. \"It's the best there is,\" Doc Daneeka > agreed."; > - > -const char catch_22_quote[] =3D > - "What a lousy earth! He wondered how many people were " > - "destitute that same night even in his own prosperous > country, " > - "how many homes were shanties, how many husbands were > drunk " > - "and wives socked, and how many children were bullied, > abused, " > - "or abandoned. How many families hungered for food they > could " > - "not afford to buy? How many hearts were broken? How many= " > - "suicides would take place that same night, how many > people " > - "would go insane? How many cockroaches and landlords woul= d > " > - "triumph? How many winners were losers, successes > failures, " > - "and rich men poor men? How many wise guys were stupid? > How " > - "many happy endings were unhappy endings? How many honest > men " > - "were liars, brave men cowards, loyal men traitors, how > many " > - "sainted men were corrupt, how many people in positions o= f > " > - "trust had sold their souls to bodyguards, how many had > never " > - "had souls? How many straight-and-narrow paths were > crooked " > - "paths? How many best families were worst families and ho= w > " > - "many good people were bad people? When you added them al= l > up " > - "and then subtracted, you might be left with only the > children, " > - "and perhaps with Albert Einstein and an old violinist or= " > - "sculptor somewhere."; > - > -#define QUOTE_480_BYTES (480) > -#define QUOTE_512_BYTES (512) > -#define QUOTE_768_BYTES (768) > -#define QUOTE_1024_BYTES (1024) > - > - > - > -/* ***** SHA1 Hash Tests ***** */ > - > -#define HMAC_KEY_LENGTH_SHA1 (DIGEST_BYTE_LENGTH_SHA1) > - > -static uint8_t hmac_sha1_key[] =3D { > - 0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA, > - 0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD, > - 0xDE, 0xF4, 0xDE, 0xAD }; > - > -/* ***** SHA224 Hash Tests ***** */ > - > -#define HMAC_KEY_LENGTH_SHA224 (DIGEST_BYTE_LENGTH_SHA224) > - > - > -/* ***** AES-CBC Cipher Tests ***** */ > - > -#define CIPHER_KEY_LENGTH_AES_CBC (16) > -#define CIPHER_IV_LENGTH_AES_CBC (CIPHER_KEY_LENGTH_AES_CBC) > - > static uint8_t aes_cbc_key[] =3D { > 0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2, > 0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A }; > > -static uint8_t aes_cbc_iv[] =3D { > - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, > - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }; > - > - > -/* ***** AES-CBC / HMAC-SHA1 Hash Tests ***** */ > - > -static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_ciphertext[] =3D= { > - 0x8B, 0x4D, 0xDA, 0x1B, 0xCF, 0x04, 0xA0, 0x31, > - 0xB4, 0xBF, 0xBD, 0x68, 0x43, 0x20, 0x7E, 0x76, > - 0xB1, 0x96, 0x8B, 0xA2, 0x7C, 0xA2, 0x83, 0x9E, > - 0x39, 0x5A, 0x2F, 0x7E, 0x92, 0xB4, 0x48, 0x1A, > - 0x3F, 0x6B, 0x5D, 0xDF, 0x52, 0x85, 0x5F, 0x8E, > - 0x42, 0x3C, 0xFB, 0xE9, 0x1A, 0x24, 0xD6, 0x08, > - 0xDD, 0xFD, 0x16, 0xFB, 0xE9, 0x55, 0xEF, 0xF0, > - 0xA0, 0x8D, 0x13, 0xAB, 0x81, 0xC6, 0x90, 0x01, > - 0xB5, 0x18, 0x84, 0xB3, 0xF6, 0xE6, 0x11, 0x57, > - 0xD6, 0x71, 0xC6, 0x3C, 0x3F, 0x2F, 0x33, 0xEE, > - 0x24, 0x42, 0x6E, 0xAC, 0x0B, 0xCA, 0xEC, 0xF9, > - 0x84, 0xF8, 0x22, 0xAA, 0x60, 0xF0, 0x32, 0xA9, > - 0x75, 0x75, 0x3B, 0xCB, 0x70, 0x21, 0x0A, 0x8D, > - 0x0F, 0xE0, 0xC4, 0x78, 0x2B, 0xF8, 0x97, 0xE3, > - 0xE4, 0x26, 0x4B, 0x29, 0xDA, 0x88, 0xCD, 0x46, > - 0xEC, 0xAA, 0xF9, 0x7F, 0xF1, 0x15, 0xEA, 0xC3, > - 0x87, 0xE6, 0x31, 0xF2, 0xCF, 0xDE, 0x4D, 0x80, > - 0x70, 0x91, 0x7E, 0x0C, 0xF7, 0x26, 0x3A, 0x92, > - 0x4F, 0x18, 0x83, 0xC0, 0x8F, 0x59, 0x01, 0xA5, > - 0x88, 0xD1, 0xDB, 0x26, 0x71, 0x27, 0x16, 0xF5, > - 0xEE, 0x10, 0x82, 0xAC, 0x68, 0x26, 0x9B, 0xE2, > - 0x6D, 0xD8, 0x9A, 0x80, 0xDF, 0x04, 0x31, 0xD5, > - 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, > - 0x58, 0x34, 0x85, 0x61, 0x1C, 0x42, 0x10, 0x76, > - 0x73, 0x02, 0x42, 0xC9, 0x23, 0x18, 0x8E, 0xB4, > - 0x6F, 0xB4, 0xA3, 0x54, 0x6E, 0x88, 0x3B, 0x62, > - 0x7C, 0x02, 0x8D, 0x4C, 0x9F, 0xC8, 0x45, 0xF4, > - 0xC9, 0xDE, 0x4F, 0xEB, 0x22, 0x83, 0x1B, 0xE4, > - 0x49, 0x37, 0xE4, 0xAD, 0xE7, 0xCD, 0x21, 0x54, > - 0xBC, 0x1C, 0xC2, 0x04, 0x97, 0xB4, 0x10, 0x61, > - 0xF0, 0xE4, 0xEF, 0x27, 0x63, 0x3A, 0xDA, 0x91, > - 0x41, 0x25, 0x62, 0x1C, 0x5C, 0xB6, 0x38, 0x4A, > - 0x88, 0x71, 0x59, 0x5A, 0x8D, 0xA0, 0x09, 0xAF, > - 0x72, 0x94, 0xD7, 0x79, 0x5C, 0x60, 0x7C, 0x8F, > - 0x4C, 0xF5, 0xD9, 0xA1, 0x39, 0x6D, 0x81, 0x28, > - 0xEF, 0x13, 0x28, 0xDF, 0xF5, 0x3E, 0xF7, 0x8E, > - 0x09, 0x9C, 0x78, 0x18, 0x79, 0xB8, 0x68, 0xD7, > - 0xA8, 0x29, 0x62, 0xAD, 0xDE, 0xE1, 0x61, 0x76, > - 0x1B, 0x05, 0x16, 0xCD, 0xBF, 0x02, 0x8E, 0xA6, > - 0x43, 0x6E, 0x92, 0x55, 0x4F, 0x60, 0x9C, 0x03, > - 0xB8, 0x4F, 0xA3, 0x02, 0xAC, 0xA8, 0xA7, 0x0C, > - 0x1E, 0xB5, 0x6B, 0xF8, 0xC8, 0x4D, 0xDE, 0xD2, > - 0xB0, 0x29, 0x6E, 0x40, 0xE6, 0xD6, 0xC9, 0xE6, > - 0xB9, 0x0F, 0xB6, 0x63, 0xF5, 0xAA, 0x2B, 0x96, > - 0xA7, 0x16, 0xAC, 0x4E, 0x0A, 0x33, 0x1C, 0xA6, > - 0xE6, 0xBD, 0x8A, 0xCF, 0x40, 0xA9, 0xB2, 0xFA, > - 0x63, 0x27, 0xFD, 0x9B, 0xD9, 0xFC, 0xD5, 0x87, > - 0x8D, 0x4C, 0xB6, 0xA4, 0xCB, 0xE7, 0x74, 0x55, > - 0xF4, 0xFB, 0x41, 0x25, 0xB5, 0x4B, 0x0A, 0x1B, > - 0xB1, 0xD6, 0xB7, 0xD9, 0x47, 0x2A, 0xC3, 0x98, > - 0x6A, 0xC4, 0x03, 0x73, 0x1F, 0x93, 0x6E, 0x53, > - 0x19, 0x25, 0x64, 0x15, 0x83, 0xF9, 0x73, 0x2A, > - 0x74, 0xB4, 0x93, 0x69, 0xC4, 0x72, 0xFC, 0x26, > - 0xA2, 0x9F, 0x43, 0x45, 0xDD, 0xB9, 0xEF, 0x36, > - 0xC8, 0x3A, 0xCD, 0x99, 0x9B, 0x54, 0x1A, 0x36, > - 0xC1, 0x59, 0xF8, 0x98, 0xA8, 0xCC, 0x28, 0x0D, > - 0x73, 0x4C, 0xEE, 0x98, 0xCB, 0x7C, 0x58, 0x7E, > - 0x20, 0x75, 0x1E, 0xB7, 0xC9, 0xF8, 0xF2, 0x0E, > - 0x63, 0x9E, 0x05, 0x78, 0x1A, 0xB6, 0xA8, 0x7A, > - 0xF9, 0x98, 0x6A, 0xA6, 0x46, 0x84, 0x2E, 0xF6, > - 0x4B, 0xDC, 0x9B, 0x8F, 0x9B, 0x8F, 0xEE, 0xB4, > - 0xAA, 0x3F, 0xEE, 0xC0, 0x37, 0x27, 0x76, 0xC7, > - 0x95, 0xBB, 0x26, 0x74, 0x69, 0x12, 0x7F, 0xF1, > - 0xBB, 0xFF, 0xAE, 0xB5, 0x99, 0x6E, 0xCB, 0x0C > -}; > - > -static const uint8_t > catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest[] =3D { > - 0x9a, 0x4f, 0x88, 0x1b, 0xb6, 0x8f, 0xd8, 0x60, > - 0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1, > - 0x18, 0x8c, 0x1d, 0x32 > -}; > - > +static uint8_t aes_cbc_iv[] =3D { > + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, > + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }; > > /* Multisession Vector context Test */ > /*Begin Session 0 */ > @@ -2174,29 +2054,6 @@ static const uint8_t ms_aes_cbc_cipher0[] =3D { > 0xFA, 0x13, 0xBB, 0x6B, 0x3F, 0x45, 0x9F, 0xBF > }; > > - > -static uint8_t ms_hmac_key0[] =3D { > - 0xFF, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1, > - 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, > - 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76, > - 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60, > - 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1, > - 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0, > - 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76, > - 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60 > -}; > - > -static const uint8_t ms_hmac_digest0[] =3D { > - 0x43, 0x52, 0xED, 0x34, 0xAB, 0x36, 0xB2, 0x51, > - 0xFB, 0xA3, 0xA6, 0x7C, 0x38, 0xFC, 0x42, 0x8F, > - 0x57, 0x64, 0xAB, 0x81, 0xA7, 0x89, 0xB7, 0x6C, > - 0xA0, 0xDC, 0xB9, 0x4D, 0xC4, 0x30, 0xF9, 0xD4, > - 0x10, 0x82, 0x55, 0xD0, 0xAB, 0x32, 0xFB, 0x56, > - 0x0D, 0xE4, 0x68, 0x3D, 0x76, 0xD0, 0x7B, 0xE4, > - 0xA6, 0x2C, 0x34, 0x9E, 0x8C, 0x41, 0xF8, 0x23, > - 0x28, 0x1B, 0x3A, 0x90, 0x26, 0x34, 0x47, 0x90 > - }; > - > /* End Session 0 */ > /* Begin session 1 */ > > @@ -2278,27 +2135,6 @@ static const uint8_t ms_aes_cbc_cipher1[] =3D { > > }; > > -static uint8_t ms_hmac_key1[] =3D { > - 0xFE, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1, > - 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, > - 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76, > - 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60, > - 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1, > - 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0, > - 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76, > - 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60 > -}; > - > -static const uint8_t ms_hmac_digest1[] =3D { > - 0xCE, 0x6E, 0x5F, 0x77, 0x96, 0x9A, 0xB1, 0x69, > - 0x2D, 0x5E, 0xF3, 0x2F, 0x32, 0x10, 0xCB, 0x50, > - 0x0E, 0x09, 0x56, 0x25, 0x07, 0x34, 0xC9, 0x20, > - 0xEC, 0x13, 0x43, 0x23, 0x5C, 0x08, 0x8B, 0xCD, > - 0xDC, 0x86, 0x8C, 0xEE, 0x0A, 0x95, 0x2E, 0xB9, > - 0x8C, 0x7B, 0x02, 0x7A, 0xD4, 0xE1, 0x49, 0xB4, > - 0x45, 0xB5, 0x52, 0x37, 0xC6, 0xFF, 0xFE, 0xAA, > - 0x0A, 0x87, 0xB8, 0x51, 0xF9, 0x2A, 0x01, 0x8F > -}; > /* End Session 1 */ > /* Begin Session 2 */ > static uint8_t ms_aes_cbc_key2[] =3D { > @@ -2378,28 +2214,6 @@ static const uint8_t ms_aes_cbc_cipher2[] =3D { > 0xA9, 0x59, 0xC1, 0xD6, 0xC3, 0x57, 0x5B, 0x92 > }; > > -static uint8_t ms_hmac_key2[] =3D { > - 0xFC, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1, > - 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, > - 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76, > - 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60, > - 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1, > - 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0, > - 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76, > - 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60 > -}; > - > -static const uint8_t ms_hmac_digest2[] =3D { > - 0xA5, 0x0F, 0x9C, 0xFB, 0x08, 0x62, 0x59, 0xFF, > - 0x80, 0x2F, 0xEB, 0x4B, 0xE1, 0x46, 0x21, 0xD6, > - 0x02, 0x98, 0xF2, 0x8E, 0xF4, 0xEC, 0xD4, 0x77, > - 0x86, 0x4C, 0x31, 0x28, 0xC8, 0x25, 0x80, 0x27, > - 0x3A, 0x72, 0x5D, 0x6A, 0x56, 0x8A, 0xD3, 0x82, > - 0xB0, 0xEC, 0x31, 0x6D, 0x8B, 0x6B, 0xB4, 0x24, > - 0xE7, 0x62, 0xC1, 0x52, 0xBC, 0x14, 0x1B, 0x8E, > - 0xEC, 0x9A, 0xF1, 0x47, 0x80, 0xD2, 0xB0, 0x59 > -}; > - > /* End Session 2 */ > > #define MAX_OPS_PROCESSED (MAX_NUM_OPS_INFLIGHT - 1) > @@ -8988,218 +8802,170 @@ > test_verify_auth_aes_cmac_cipher_null_test_case_1(void) > > /* ***** AEAD algorithm Tests ***** */ > > +static void > +setup_aead_xform(const struct aead_test_data *data, > + struct rte_crypto_sym_xform *xform) > +{ > + xform->type =3D RTE_CRYPTO_SYM_XFORM_AEAD; > + xform->next =3D NULL; > + xform->aead.algo =3D data->algo; > + xform->aead.key.length =3D data->key.len; > + xform->aead.iv.offset =3D IV_OFFSET; > + xform->aead.iv.length =3D data->iv.len; > + xform->aead.digest_length =3D data->auth_tag.len; > + xform->aead.aad_length =3D data->aad.len; > +} > + > static int > -create_aead_session(uint8_t dev_id, enum rte_crypto_aead_algorithm algo, > - enum rte_crypto_aead_operation op, > - const uint8_t *key, const uint8_t key_len, > - const uint16_t aad_len, const uint8_t auth_len, > - uint8_t iv_len) > +create_aead_session(uint8_t dev_id, enum rte_crypto_aead_operation > aead_op, > + const struct aead_test_data *data) > { > + const int key_len =3D data->key.len; > + /* > + * PMD stops to rely on the xform values as soon as the 'session > create' > + * functions exits. Hence it is ok to use a local array to store = a > key. > + */ > uint8_t aead_key[key_len]; > > - struct crypto_testsuite_params *ts_params =3D &testsuite_params; > - struct crypto_unittest_params *ut_params =3D &unittest_params; > - > - memcpy(aead_key, key, key_len); > - > - /* Setup AEAD Parameters */ > - ut_params->aead_xform.type =3D RTE_CRYPTO_SYM_XFORM_AEAD; > - ut_params->aead_xform.next =3D NULL; > - ut_params->aead_xform.aead.algo =3D algo; > - ut_params->aead_xform.aead.op =3D op; > - ut_params->aead_xform.aead.key.data =3D aead_key; > - ut_params->aead_xform.aead.key.length =3D key_len; > - ut_params->aead_xform.aead.iv.offset =3D IV_OFFSET; > - ut_params->aead_xform.aead.iv.length =3D iv_len; > - ut_params->aead_xform.aead.digest_length =3D auth_len; > - ut_params->aead_xform.aead.aad_length =3D aad_len; > - > - debug_hexdump(stdout, "key:", key, key_len); > - > - /* Create Crypto session*/ > - ut_params->sess =3D rte_cryptodev_sym_session_create(dev_id, > - &ut_params->aead_xform, ts_params->session_mpool)= ; > - if (ut_params->sess =3D=3D NULL && rte_errno =3D=3D ENOTSUP) > - return TEST_SKIPPED; > - TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); > + memcpy(aead_key, data->key.data, key_len); > + /* Setup AEAD xform parameters */ > + self->aead_xform.aead.op =3D aead_op; > + self->aead_xform.aead.key.data =3D aead_key; > + setup_aead_xform(data, &self->aead_xform); > + /* Create cryptodev session */ > + self->sess =3D rte_cryptodev_sym_session_create(dev_id, > + &self->aead_xform, testsuite_params.session_mpool= ); > + if (self->sess =3D=3D NULL && rte_errno =3D=3D ENOTSUP) > + return TEST_SKIPPED; > + TEST_ASSERT_NOT_NULL(self->sess, "Session creation failed"); > return 0; > } > > static int > create_aead_xform(struct rte_crypto_op *op, > - enum rte_crypto_aead_algorithm algo, > - enum rte_crypto_aead_operation aead_op, > - uint8_t *key, const uint8_t key_len, > - const uint8_t aad_len, const uint8_t auth_len, > - uint8_t iv_len) > + enum rte_crypto_aead_operation aead_op, > + const struct aead_test_data *data, > + uint8_t *key) > { > TEST_ASSERT_NOT_NULL(rte_crypto_op_sym_xforms_alloc(op, 1), > - "failed to allocate space for crypto transform"); > - > - struct rte_crypto_sym_op *sym_op =3D op->sym; > - > - /* Setup AEAD Parameters */ > - sym_op->xform->type =3D RTE_CRYPTO_SYM_XFORM_AEAD; > - sym_op->xform->next =3D NULL; > - sym_op->xform->aead.algo =3D algo; > - sym_op->xform->aead.op =3D aead_op; > - sym_op->xform->aead.key.data =3D key; > - sym_op->xform->aead.key.length =3D key_len; > - sym_op->xform->aead.iv.offset =3D IV_OFFSET; > - sym_op->xform->aead.iv.length =3D iv_len; > - sym_op->xform->aead.digest_length =3D auth_len; > - sym_op->xform->aead.aad_length =3D aad_len; > - > - debug_hexdump(stdout, "key:", key, key_len); > + "Failed to allocate space for cryptodev xform"); > + /* Setup AEAD xform parameters */ > + op->sym->xform->aead.op =3D aead_op; > + op->sym->xform->aead.key.data =3D key; > + setup_aead_xform(data, op->sym->xform); > > return 0; > } > > static int > create_aead_operation(enum rte_crypto_aead_operation op, > - const struct aead_test_data *tdata) > + const struct aead_test_data *data) > { > - struct crypto_testsuite_params *ts_params =3D &testsuite_params; > - struct crypto_unittest_params *ut_params =3D &unittest_params; > - > - uint8_t *plaintext, *ciphertext; > + uint8_t *plaintext, *ciphertext, *iv_ptr; > unsigned int aad_pad_len, plaintext_pad_len; > - > - /* Generate Crypto op data structure */ > - ut_params->op =3D rte_crypto_op_alloc(ts_params->op_mpool, > - RTE_CRYPTO_OP_TYPE_SYMMETRIC); > - TEST_ASSERT_NOT_NULL(ut_params->op, > - "Failed to allocate symmetric crypto operation > struct"); > - > - struct rte_crypto_sym_op *sym_op =3D ut_params->op->sym; > + struct rte_crypto_sym_op *sym_op =3D self->op->sym; > > /* Append aad data */ > - if (tdata->algo =3D=3D RTE_CRYPTO_AEAD_AES_CCM) { > - aad_pad_len =3D RTE_ALIGN_CEIL(tdata->aad.len + 18, 16); > - sym_op->aead.aad.data =3D (uint8_t > *)rte_pktmbuf_append(ut_params->ibuf, > + if (data->algo =3D=3D RTE_CRYPTO_AEAD_AES_CCM) { > + aad_pad_len =3D RTE_ALIGN_CEIL(data->aad.len + 18, 16); > + sym_op->aead.aad.data =3D (uint8_t > *)rte_pktmbuf_append(self->ibuf, > aad_pad_len); > TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data, > "no room to append aad"); > - > sym_op->aead.aad.phys_addr =3D > - rte_pktmbuf_iova(ut_params->ibuf); > + rte_pktmbuf_iova(self->ibuf); > /* Copy AAD 18 bytes after the AAD pointer, according to > the API */ > - memcpy(sym_op->aead.aad.data + 18, tdata->aad.data, > tdata->aad.len); > - debug_hexdump(stdout, "aad:", sym_op->aead.aad.data + 18, > - tdata->aad.len); > - > + memcpy(sym_op->aead.aad.data + 18, data->aad.data, > data->aad.len); > /* Append IV at the end of the crypto operation*/ > - uint8_t *iv_ptr =3D rte_crypto_op_ctod_offset(ut_params->= op, > + iv_ptr =3D rte_crypto_op_ctod_offset(self->op, > uint8_t *, IV_OFFSET); > - > /* Copy IV 1 byte after the IV pointer, according to the > API */ > - rte_memcpy(iv_ptr + 1, tdata->iv.data, tdata->iv.len); > - debug_hexdump(stdout, "iv:", iv_ptr + 1, > - tdata->iv.len); > + rte_memcpy(iv_ptr + 1, data->iv.data, data->iv.len); > } else { > - aad_pad_len =3D RTE_ALIGN_CEIL(tdata->aad.len, 16); > - sym_op->aead.aad.data =3D (uint8_t > *)rte_pktmbuf_append(ut_params->ibuf, > + aad_pad_len =3D RTE_ALIGN_CEIL(data->aad.len, 16); > + sym_op->aead.aad.data =3D (uint8_t > *)rte_pktmbuf_append(self->ibuf, > aad_pad_len); > TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data, > "no room to append aad"); > - > sym_op->aead.aad.phys_addr =3D > - rte_pktmbuf_iova(ut_params->ibuf); > - memcpy(sym_op->aead.aad.data, tdata->aad.data, > tdata->aad.len); > - debug_hexdump(stdout, "aad:", sym_op->aead.aad.data, > - tdata->aad.len); > - > + rte_pktmbuf_iova(self->ibuf); > + memcpy(sym_op->aead.aad.data, data->aad.data, > data->aad.len); > /* Append IV at the end of the crypto operation*/ > - uint8_t *iv_ptr =3D rte_crypto_op_ctod_offset(ut_params->= op, > + iv_ptr =3D rte_crypto_op_ctod_offset(self->op, > uint8_t *, IV_OFFSET); > - > - if (tdata->iv.len =3D=3D 0) { > - rte_memcpy(iv_ptr, tdata->iv.data, > AES_GCM_J0_LENGTH); > - debug_hexdump(stdout, "iv:", iv_ptr, > - AES_GCM_J0_LENGTH); > - } else { > - rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len)= ; > - debug_hexdump(stdout, "iv:", iv_ptr, > - tdata->iv.len); > - } > + if (data->iv.len =3D=3D 0) > + rte_memcpy(iv_ptr, data->iv.data, > AES_GCM_J0_LENGTH); > + else > + rte_memcpy(iv_ptr, data->iv.data, data->iv.len); > } > > /* Append plaintext/ciphertext */ > if (op =3D=3D RTE_CRYPTO_AEAD_OP_ENCRYPT) { > - plaintext_pad_len =3D RTE_ALIGN_CEIL(tdata->plaintext.len= , > 16); > - plaintext =3D (uint8_t *)rte_pktmbuf_append(ut_params->ib= uf, > + plaintext_pad_len =3D RTE_ALIGN_CEIL(data->plaintext.len, > 16); > + plaintext =3D (uint8_t *)rte_pktmbuf_append(self->ibuf, > plaintext_pad_len); > TEST_ASSERT_NOT_NULL(plaintext, "no room to append > plaintext"); > > - memcpy(plaintext, tdata->plaintext.data, > tdata->plaintext.len); > - debug_hexdump(stdout, "plaintext:", plaintext, > - tdata->plaintext.len); > - > - if (ut_params->obuf) { > + memcpy(plaintext, data->plaintext.data, > data->plaintext.len); > + if (self->obuf) { > ciphertext =3D (uint8_t *)rte_pktmbuf_append( > - ut_params->obuf, > + self->obuf, > plaintext_pad_len + aad_pad_len); > TEST_ASSERT_NOT_NULL(ciphertext, > "no room to append ciphertext"); > - > memset(ciphertext + aad_pad_len, 0, > - tdata->ciphertext.len); > + data->ciphertext.len); > } > } else { > - plaintext_pad_len =3D RTE_ALIGN_CEIL(tdata->ciphertext.le= n, > 16); > - ciphertext =3D (uint8_t *)rte_pktmbuf_append(ut_params->i= buf, > + plaintext_pad_len =3D RTE_ALIGN_CEIL(data->ciphertext.len= , > 16); > + ciphertext =3D (uint8_t *)rte_pktmbuf_append(self->ibuf, > plaintext_pad_len); > TEST_ASSERT_NOT_NULL(ciphertext, > "no room to append ciphertext"); > - > - memcpy(ciphertext, tdata->ciphertext.data, > - tdata->ciphertext.len); > - debug_hexdump(stdout, "ciphertext:", ciphertext, > - tdata->ciphertext.len); > - > - if (ut_params->obuf) { > + memcpy(ciphertext, data->ciphertext.data, > + data->ciphertext.len); > + if (self->obuf) { > plaintext =3D (uint8_t *)rte_pktmbuf_append( > - ut_params->obuf, > + self->obuf, > plaintext_pad_len + aad_pad_len); > TEST_ASSERT_NOT_NULL(plaintext, > "no room to append plaintext"); > - > memset(plaintext + aad_pad_len, 0, > - tdata->plaintext.len); > + data->plaintext.len); > } > } > > /* Append digest data */ > if (op =3D=3D RTE_CRYPTO_AEAD_OP_ENCRYPT) { > sym_op->aead.digest.data =3D (uint8_t *)rte_pktmbuf_appen= d( > - ut_params->obuf ? ut_params->obuf : > - ut_params->ibuf, > - tdata->auth_tag.len); > + self->obuf ? self->obuf : > + self->ibuf, > + data->auth_tag.len); > TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data, > "no room to append digest"); > - memset(sym_op->aead.digest.data, 0, tdata->auth_tag.len); > + memset(sym_op->aead.digest.data, 0, data->auth_tag.len); > sym_op->aead.digest.phys_addr =3D rte_pktmbuf_iova_offset= ( > - ut_params->obuf ? ut_params->obuf : > - ut_params->ibuf, > + self->obuf ? self->obuf : > + self->ibuf, > plaintext_pad_len + > aad_pad_len); > } else { > sym_op->aead.digest.data =3D (uint8_t *)rte_pktmbuf_appen= d( > - ut_params->ibuf, tdata->auth_tag.len); > + self->ibuf, data->auth_tag.len); > TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data, > "no room to append digest"); > sym_op->aead.digest.phys_addr =3D rte_pktmbuf_iova_offset= ( > - ut_params->ibuf, > + self->ibuf, > plaintext_pad_len + aad_pad_len); > > - rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data= , > - tdata->auth_tag.len); > + rte_memcpy(sym_op->aead.digest.data, data->auth_tag.data, > + data->auth_tag.len); > debug_hexdump(stdout, "digest:", > sym_op->aead.digest.data, > - tdata->auth_tag.len); > + data->auth_tag.len); > } > > - sym_op->aead.data.length =3D tdata->plaintext.len; > + sym_op->aead.data.length =3D data->plaintext.len; > sym_op->aead.data.offset =3D aad_pad_len; > > return 0; > @@ -9215,10 +8981,7 @@ test_authenticated_encryption_helper(const struct > aead_test_data *tdata, bool us > uint8_t *ciphertext, *auth_tag; > uint16_t plaintext_pad_len; > uint32_t i; > - struct rte_cryptodev_info dev_info; > - > - rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); > - uint64_t feat_flags =3D dev_info.feature_flags; > + uint64_t feat_flags =3D ts_params->dev_info.feature_flags; > > if ((global_api_test_type =3D=3D CRYPTODEV_RAW_API_TEST) && > (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { > @@ -9242,11 +9005,7 @@ test_authenticated_encryption_helper(const struct > aead_test_data *tdata, bool us > > /* Create AEAD session */ > retval =3D create_aead_session(ts_params->valid_devs[0], > - tdata->algo, > - RTE_CRYPTO_AEAD_OP_ENCRYPT, > - tdata->key.data, tdata->key.len, > - tdata->aad.len, tdata->auth_tag.len, > - tdata->iv.len); > + RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata); > if (retval !=3D TEST_SUCCESS) > return retval; > > @@ -9265,9 +9024,9 @@ test_authenticated_encryption_helper(const struct > aead_test_data *tdata, bool us > } else { > if (use_ext_mbuf) { > ut_params->ibuf =3D > ext_mbuf_create(ts_params->mbuf_pool, > - > AEAD_TEXT_MAX_LENGTH, > - 1 /* nb_segs */= , > - NULL); > + AEAD_TEXT_MAX_LENGTH, > + 1 /* nb_segs */, > + NULL); > } else { > ut_params->ibuf =3D > rte_pktmbuf_alloc(ts_params->mbuf_pool); > } > @@ -9275,7 +9034,7 @@ test_authenticated_encryption_helper(const struct > aead_test_data *tdata, bool us > > /* clear mbuf payload */ > memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, > - rte_pktmbuf_tailroom(ut_params->ibuf)); > + rte_pktmbuf_tailroom(ut_params->ibuf)); > > /* Create AEAD operation */ > retval =3D create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdat= a); > @@ -9337,7 +9096,7 @@ test_authenticated_encryption_helper(const struct > aead_test_data *tdata, bool us > } > > static int > -test_authenticated_encryption(const struct aead_test_data *tdata) > +test_authenticated_encryption(const void *tdata) > { > return test_authenticated_encryption_helper(tdata, false); > } > @@ -12869,60 +12628,12 @@ test_tls_1_3_record_proto_sgl_oop(void) > #endif > > static int > -test_AES_GCM_authenticated_encryption_test_case_1(void) > -{ > - return test_authenticated_encryption(&gcm_test_case_1); > -} > - > -static int > -test_AES_GCM_authenticated_encryption_test_case_2(void) > -{ > - return test_authenticated_encryption(&gcm_test_case_2); > -} > - > -static int > -test_AES_GCM_authenticated_encryption_test_case_3(void) > -{ > - return test_authenticated_encryption(&gcm_test_case_3); > -} > - > -static int > test_AES_GCM_authenticated_encryption_test_case_3_ext_mbuf(void) > { > return test_authenticated_encryption_helper(&gcm_test_case_3, > true); > } > > static int > -test_AES_GCM_authenticated_encryption_test_case_4(void) > -{ > - return test_authenticated_encryption(&gcm_test_case_4); > -} > - > -static int > -test_AES_GCM_authenticated_encryption_test_case_5(void) > -{ > - return test_authenticated_encryption(&gcm_test_case_5); > -} > - > -static int > -test_AES_GCM_authenticated_encryption_test_case_6(void) > -{ > - return test_authenticated_encryption(&gcm_test_case_6); > -} > - > -static int > -test_AES_GCM_authenticated_encryption_test_case_7(void) > -{ > - return test_authenticated_encryption(&gcm_test_case_7); > -} > - > -static int > -test_AES_GCM_authenticated_encryption_test_case_8(void) > -{ > - return test_authenticated_encryption(&gcm_test_case_8); > -} > - > -static int > test_AES_GCM_J0_authenticated_encryption_test_case_1(void) > { > return test_authenticated_encryption(&gcm_J0_test_case_1); > @@ -13159,11 +12870,8 @@ test_authenticated_decryption_helper(const struc= t > aead_test_data *tdata, bool us > > /* Create AEAD session */ > retval =3D create_aead_session(ts_params->valid_devs[0], > - tdata->algo, > RTE_CRYPTO_AEAD_OP_DECRYPT, > - tdata->key.data, tdata->key.len, > - tdata->aad.len, tdata->auth_tag.len, > - tdata->iv.len); > + tdata); > if (retval !=3D TEST_SUCCESS) > return retval; > > @@ -13243,66 +12951,18 @@ test_authenticated_decryption_helper(const > struct aead_test_data *tdata, bool us > } > > static int > -test_authenticated_decryption(const struct aead_test_data *tdata) > +test_authenticated_decryption(const void *tdata) > { > return test_authenticated_decryption_helper(tdata, false); > } > > static int > -test_AES_GCM_authenticated_decryption_test_case_1(void) > -{ > - return test_authenticated_decryption(&gcm_test_case_1); > -} > - > -static int > -test_AES_GCM_authenticated_decryption_test_case_2(void) > -{ > - return test_authenticated_decryption(&gcm_test_case_2); > -} > - > -static int > -test_AES_GCM_authenticated_decryption_test_case_3(void) > -{ > - return test_authenticated_decryption(&gcm_test_case_3); > -} > - > -static int > test_AES_GCM_authenticated_decryption_test_case_3_ext_mbuf(void) > { > return test_authenticated_decryption_helper(&gcm_test_case_3, > true); > } > > static int > -test_AES_GCM_authenticated_decryption_test_case_4(void) > -{ > - return test_authenticated_decryption(&gcm_test_case_4); > -} > - > -static int > -test_AES_GCM_authenticated_decryption_test_case_5(void) > -{ > - return test_authenticated_decryption(&gcm_test_case_5); > -} > - > -static int > -test_AES_GCM_authenticated_decryption_test_case_6(void) > -{ > - return test_authenticated_decryption(&gcm_test_case_6); > -} > - > -static int > -test_AES_GCM_authenticated_decryption_test_case_7(void) > -{ > - return test_authenticated_decryption(&gcm_test_case_7); > -} > - > -static int > -test_AES_GCM_authenticated_decryption_test_case_8(void) > -{ > - return test_authenticated_decryption(&gcm_test_case_8); > -} > - > -static int > test_AES_GCM_J0_authenticated_decryption_test_case_1(void) > { > return test_authenticated_decryption(&gcm_J0_test_case_1); > @@ -13547,11 +13207,8 @@ test_authenticated_encryption_oop(const struct > aead_test_data *tdata) > > /* Create AEAD session */ > retval =3D create_aead_session(ts_params->valid_devs[0], > - tdata->algo, > RTE_CRYPTO_AEAD_OP_ENCRYPT, > - tdata->key.data, tdata->key.len, > - tdata->aad.len, tdata->auth_tag.len, > - tdata->iv.len); > + tdata); > if (retval < 0) > return retval; > > @@ -13659,11 +13316,8 @@ test_authenticated_decryption_oop(const struct > aead_test_data *tdata) > > /* Create AEAD session */ > retval =3D create_aead_session(ts_params->valid_devs[0], > - tdata->algo, > RTE_CRYPTO_AEAD_OP_DECRYPT, > - tdata->key.data, tdata->key.len, > - tdata->aad.len, tdata->auth_tag.len, > - tdata->iv.len); > + tdata); > if (retval < 0) > return retval; > > @@ -13770,11 +13424,8 @@ test_authenticated_encryption_sessionless( > /* Create GCM xform */ > memcpy(key, tdata->key.data, tdata->key.len); > retval =3D create_aead_xform(ut_params->op, > - tdata->algo, > RTE_CRYPTO_AEAD_OP_ENCRYPT, > - key, tdata->key.len, > - tdata->aad.len, tdata->auth_tag.len, > - tdata->iv.len); > + tdata, key); > if (retval < 0) > return retval; > > @@ -13878,11 +13529,8 @@ test_authenticated_decryption_sessionless( > /* Create AEAD xform */ > memcpy(key, tdata->key.data, tdata->key.len); > retval =3D create_aead_xform(ut_params->op, > - tdata->algo, > RTE_CRYPTO_AEAD_OP_DECRYPT, > - key, tdata->key.len, > - tdata->aad.len, tdata->auth_tag.len, > - tdata->iv.len); > + tdata, key); > if (retval < 0) > return retval; > > @@ -14046,10 +13694,39 @@ test_stats(void) > { > struct crypto_testsuite_params *ts_params =3D &testsuite_params; > struct rte_cryptodev_stats stats; > + struct rte_cryptodev_qp_conf qp_conf =3D { > + .nb_descriptors =3D MAX_NUM_OPS_INFLIGHT, > + .mp_session =3D ts_params->session_mpool > + }; > + uint16_t qp_id, dev_id; > + dev_id =3D ts_params->valid_devs[0]; > > if (gbl_action_type =3D=3D RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) > return TEST_SKIPPED; > > + /* Stop the device in case it's started so it can be configured *= / > + rte_cryptodev_stop(dev_id); > + > + TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, > &ts_params->conf), > + "Failed test for rte_cryptodev_configure: " > + "dev_num %u", dev_id); > + for (qp_id =3D 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++= ) { > + TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( > + ts_params->valid_devs[0], qp_id, &qp_conf= , > + rte_cryptodev_socket_id( > + ts_params->valid_devs[0])= ), > + "Failed test for " > + "rte_cryptodev_queue_pair_setup: > num_inflights " > + "%u on qp %u on cryptodev %u", > + qp_conf.nb_descriptors, qp_id, > + ts_params->valid_devs[0]); > + } > + > + /* Start the device */ > + TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->valid_devs[0])= , > + "Failed to start cryptodev %u", > + ts_params->valid_devs[0]); > + > /* Verify the capabilities */ > struct rte_cryptodev_sym_capability_idx cap_idx; > cap_idx.type =3D RTE_CRYPTO_SYM_XFORM_AUTH; > @@ -14106,6 +13783,9 @@ test_stats(void) > TEST_ASSERT((stats.dequeued_count =3D=3D 0), > "rte_cryptodev_stats_get returned unexpected dequeued sta= t > after valid reset"); > > + /* Stop the device in case it's started so it can be configured *= / > + rte_cryptodev_stop(dev_id); > + > return TEST_SUCCESS; > } > > @@ -16842,11 +16522,8 @@ test_authenticated_encryption_SGL(const struct > aead_test_data *tdata, > > /* Create AEAD session */ > retval =3D create_aead_session(ts_params->valid_devs[0], > - tdata->algo, > RTE_CRYPTO_AEAD_OP_ENCRYPT, > - tdata->key.data, tdata->key.len, > - tdata->aad.len, tdata->auth_tag.len, > - tdata->iv.len); > + tdata); > if (retval < 0) > return retval; > > @@ -18425,9 +18102,10 @@ static struct unit_test_suite > docsis_proto_testsuite =3D { > }; > #endif > > -static struct unit_test_suite cryptodev_gen_testsuite =3D { > +static struct unit_test_suite testsuite_gen_testsuite =3D { > .suite_name =3D "Crypto General Unit Test Suite", > - .setup =3D crypto_gen_testsuite_setup, > + .setup =3D ts_setup_crypto_gen, > + .teardown =3D ts_teardown_generic, > .unit_test_cases =3D { > TEST_CASE_ST(ut_setup, ut_teardown, > test_device_reconfigure), > @@ -18446,9 +18124,10 @@ static struct unit_test_suite > cryptodev_gen_testsuite =3D { > } > }; > > -static struct unit_test_suite cryptodev_negative_hmac_sha1_testsuite =3D= { > +static struct unit_test_suite testsuite_negative_hmac_sha1 =3D { > .suite_name =3D "Negative HMAC SHA1 Unit Test Suite", > - .setup =3D negative_hmac_sha1_testsuite_setup, > + .setup =3D ts_setup_negative_hmac_sha1, > + .teardown =3D ts_teardown_generic, > .unit_test_cases =3D { > /** Negative tests */ > TEST_CASE_ST(ut_setup, ut_teardown, > @@ -18464,9 +18143,10 @@ static struct unit_test_suite > cryptodev_negative_hmac_sha1_testsuite =3D { > } > }; > > -static struct unit_test_suite cryptodev_multi_session_testsuite =3D { > +static struct unit_test_suite testsuite_multi_session =3D { > .suite_name =3D "Multi Session Unit Test Suite", > - .setup =3D multi_session_testsuite_setup, > + .setup =3D ts_setup_multi_session, > + .teardown =3D ts_teardown_generic, > .unit_test_cases =3D { > TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session), > TEST_CASE_ST(ut_setup, ut_teardown, > @@ -18476,9 +18156,10 @@ static struct unit_test_suite > cryptodev_multi_session_testsuite =3D { > } > }; > > -static struct unit_test_suite cryptodev_null_testsuite =3D { > +static struct unit_test_suite testsuite_null =3D { > .suite_name =3D "NULL Test Suite", > - .setup =3D null_testsuite_setup, > + .setup =3D ts_testsuite_null, > + .teardown =3D ts_teardown_generic, > .unit_test_cases =3D { > TEST_CASE_ST(ut_setup, ut_teardown, > test_null_invalid_operation), > @@ -18487,9 +18168,10 @@ static struct unit_test_suite > cryptodev_null_testsuite =3D { > } > }; > > -static struct unit_test_suite cryptodev_aes_ccm_auth_testsuite =3D { > - .suite_name =3D "AES CCM Authenticated Test Suite", > - .setup =3D aes_ccm_auth_testsuite_setup, > +static struct unit_test_suite testsuite_aes_ccm =3D { > + .suite_name =3D "AES CCM test suite", > + .setup =3D ts_setup_aes_ccm, > + .teardown =3D ts_teardown_generic, > .unit_test_cases =3D { > /** AES CCM Authenticated Encryption 128 bits key*/ > TEST_CASE_ST(ut_setup, ut_teardown, > @@ -18542,163 +18224,158 @@ static struct unit_test_suite > cryptodev_aes_ccm_auth_testsuite =3D { > } > }; > > -static struct unit_test_suite cryptodev_aes_gcm_auth_testsuite =3D { > +#define ADD_GCM_ENC_TESTCASE(desc, data) \ > + TEST_CASE_NAMED_WITH_DATA(desc, ut_setup, \ > + ut_teardown_aes_gcm, test_authenticated_encryption, \ > + (const void *) data) > +#define ADD_GCM_DEC_TESTCASE(desc, data) \ > + TEST_CASE_NAMED_WITH_DATA(desc, ut_setup, \ > + ut_teardown_aes_gcm, test_authenticated_decryption, \ > + (const void *) data) > + > +static struct unit_test_suite testsuite_aes_gcm =3D { > .suite_name =3D "AES GCM Authenticated Test Suite", > - .setup =3D aes_gcm_auth_testsuite_setup, > + .setup =3D ts_setup_aes_gcm, > + .teardown =3D ts_teardown_generic, > .unit_test_cases =3D { > /** AES GCM Authenticated Encryption */ > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > test_AES_GCM_auth_encrypt_SGL_in_place_1500B), > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > > test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B), > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > > test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B), > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > > test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg), > - TEST_CASE_ST(ut_setup, ut_teardown, > - test_AES_GCM_authenticated_encryption_test_case_1= ), > - TEST_CASE_ST(ut_setup, ut_teardown, > - test_AES_GCM_authenticated_encryption_test_case_2= ), > - TEST_CASE_ST(ut_setup, ut_teardown, > - test_AES_GCM_authenticated_encryption_test_case_3= ), > - TEST_CASE_ST(ut_setup, ut_teardown, > - test_AES_GCM_authenticated_encryption_test_case_4= ), > - TEST_CASE_ST(ut_setup, ut_teardown, > - test_AES_GCM_authenticated_encryption_test_case_5= ), > - TEST_CASE_ST(ut_setup, ut_teardown, > - test_AES_GCM_authenticated_encryption_test_case_6= ), > - TEST_CASE_ST(ut_setup, ut_teardown, > - test_AES_GCM_authenticated_encryption_test_case_7= ), > - TEST_CASE_ST(ut_setup, ut_teardown, > - test_AES_GCM_authenticated_encryption_test_case_8= ), > - TEST_CASE_ST(ut_setup, ut_teardown, > + ADD_GCM_ENC_TESTCASE("AES GCM encryption test 1", > &gcm_test_case_1), > + ADD_GCM_ENC_TESTCASE("AES GCM encryption test 2", > &gcm_test_case_2), > + ADD_GCM_ENC_TESTCASE("AES GCM encryption test 3", > &gcm_test_case_3), > + ADD_GCM_ENC_TESTCASE("AES GCM encryption test 4", > &gcm_test_case_4), > + ADD_GCM_ENC_TESTCASE("AES GCM encryption test 5", > &gcm_test_case_5), > + ADD_GCM_ENC_TESTCASE("AES GCM encryption test 6", > &gcm_test_case_6), > + ADD_GCM_ENC_TESTCASE("AES GCM encryption test 7", > &gcm_test_case_7), > + ADD_GCM_ENC_TESTCASE("AES GCM encryption test 8", > &gcm_test_case_8), > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > > test_AES_GCM_J0_authenticated_encryption_test_case_1), > > /** AES GCM Authenticated Decryption */ > - TEST_CASE_ST(ut_setup, ut_teardown, > - test_AES_GCM_authenticated_decryption_test_case_1= ), > - TEST_CASE_ST(ut_setup, ut_teardown, > - test_AES_GCM_authenticated_decryption_test_case_2= ), > - TEST_CASE_ST(ut_setup, ut_teardown, > - test_AES_GCM_authenticated_decryption_test_case_3= ), > - TEST_CASE_ST(ut_setup, ut_teardown, > - test_AES_GCM_authenticated_decryption_test_case_4= ), > - TEST_CASE_ST(ut_setup, ut_teardown, > - test_AES_GCM_authenticated_decryption_test_case_5= ), > - TEST_CASE_ST(ut_setup, ut_teardown, > - test_AES_GCM_authenticated_decryption_test_case_6= ), > - TEST_CASE_ST(ut_setup, ut_teardown, > - test_AES_GCM_authenticated_decryption_test_case_7= ), > - TEST_CASE_ST(ut_setup, ut_teardown, > - test_AES_GCM_authenticated_decryption_test_case_8= ), > - TEST_CASE_ST(ut_setup, ut_teardown, > + ADD_GCM_DEC_TESTCASE("AES GCM decryption test 1", > &gcm_test_case_1), > + ADD_GCM_DEC_TESTCASE("AES GCM decryption test 2", > &gcm_test_case_2), > + ADD_GCM_DEC_TESTCASE("AES GCM decryption test 3", > &gcm_test_case_3), > + ADD_GCM_DEC_TESTCASE("AES GCM decryption test 4", > &gcm_test_case_4), > + ADD_GCM_DEC_TESTCASE("AES GCM decryption test 5", > &gcm_test_case_5), > + ADD_GCM_DEC_TESTCASE("AES GCM decryption test 6", > &gcm_test_case_6), > + ADD_GCM_DEC_TESTCASE("AES GCM decryption test 7", > &gcm_test_case_7), > + ADD_GCM_DEC_TESTCASE("AES GCM decryption test 8", > &gcm_test_case_8), > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > > test_AES_GCM_J0_authenticated_decryption_test_case_1), > > /** AES GCM Authenticated Encryption 192 bits key */ > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > test_AES_GCM_auth_encryption_test_case_192_1), > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > test_AES_GCM_auth_encryption_test_case_192_2), > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > test_AES_GCM_auth_encryption_test_case_192_3), > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > test_AES_GCM_auth_encryption_test_case_192_4), > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > test_AES_GCM_auth_encryption_test_case_192_5), > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > test_AES_GCM_auth_encryption_test_case_192_6), > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > test_AES_GCM_auth_encryption_test_case_192_7), > > /** AES GCM Authenticated Decryption 192 bits key */ > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > test_AES_GCM_auth_decryption_test_case_192_1), > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > test_AES_GCM_auth_decryption_test_case_192_2), > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > test_AES_GCM_auth_decryption_test_case_192_3), > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > test_AES_GCM_auth_decryption_test_case_192_4), > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > test_AES_GCM_auth_decryption_test_case_192_5), > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > test_AES_GCM_auth_decryption_test_case_192_6), > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > test_AES_GCM_auth_decryption_test_case_192_7), > > /** AES GCM Authenticated Encryption 256 bits key */ > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > test_AES_GCM_auth_encryption_test_case_256_1), > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > test_AES_GCM_auth_encryption_test_case_256_2), > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > test_AES_GCM_auth_encryption_test_case_256_3), > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > test_AES_GCM_auth_encryption_test_case_256_4), > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > test_AES_GCM_auth_encryption_test_case_256_5), > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > test_AES_GCM_auth_encryption_test_case_256_6), > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > test_AES_GCM_auth_encryption_test_case_256_7), > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > test_AES_GCM_auth_encryption_test_case_256_8), > > /** AES GCM Authenticated Decryption 256 bits key */ > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > test_AES_GCM_auth_decryption_test_case_256_1), > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > test_AES_GCM_auth_decryption_test_case_256_2), > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > test_AES_GCM_auth_decryption_test_case_256_3), > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > test_AES_GCM_auth_decryption_test_case_256_4), > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > test_AES_GCM_auth_decryption_test_case_256_5), > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > test_AES_GCM_auth_decryption_test_case_256_6), > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > test_AES_GCM_auth_decryption_test_case_256_7), > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > test_AES_GCM_auth_decryption_test_case_256_8), > > /** AES GCM Authenticated Encryption big aad size */ > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > test_AES_GCM_auth_encryption_test_case_aad_1), > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > test_AES_GCM_auth_encryption_test_case_aad_2), > > /** AES GCM Authenticated Decryption big aad size */ > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > test_AES_GCM_auth_decryption_test_case_aad_1), > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > test_AES_GCM_auth_decryption_test_case_aad_2), > > /** Out of place tests */ > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > > test_AES_GCM_authenticated_encryption_oop_test_case_1), > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > > test_AES_GCM_authenticated_decryption_oop_test_case_1), > > /** Session-less tests */ > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > > test_AES_GCM_authenticated_encryption_sessionless_test_case_1), > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > > test_AES_GCM_authenticated_decryption_sessionless_test_case_1), > > /** AES GCM external mbuf tests */ > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > > test_AES_GCM_authenticated_encryption_test_case_3_ext_mbuf), > - TEST_CASE_ST(ut_setup, ut_teardown, > + TEST_CASE_ST(ut_setup, ut_teardown_aes_gcm, > > test_AES_GCM_authenticated_decryption_test_case_3_ext_mbuf), > > TEST_CASES_END() > } > }; > > -static struct unit_test_suite cryptodev_aes_gmac_auth_testsuite =3D { > +static struct unit_test_suite testsuite_aes_gmac =3D { > .suite_name =3D "AES GMAC Authentication Test Suite", > - .setup =3D aes_gmac_auth_testsuite_setup, > + .setup =3D ts_setup_aes_gmac, > + .teardown =3D ts_teardown_generic, > .unit_test_cases =3D { > TEST_CASE_ST(ut_setup, ut_teardown, > test_AES_GMAC_authentication_test_case_1), > @@ -18729,9 +18406,10 @@ static struct unit_test_suite > cryptodev_aes_gmac_auth_testsuite =3D { > } > }; > > -static struct unit_test_suite cryptodev_chacha20_poly1305_testsuite =3D= { > +static struct unit_test_suite testsuite_chacha20_poly1305 =3D { > .suite_name =3D "Chacha20-Poly1305 Test Suite", > - .setup =3D chacha20_poly1305_testsuite_setup, > + .setup =3D ts_setup_chacha20_poly1305, > + .teardown =3D ts_teardown_generic, > .unit_test_cases =3D { > TEST_CASE_ST(ut_setup, ut_teardown, > test_chacha20_poly1305_encrypt_test_case_rfc8439)= , > @@ -18743,9 +18421,10 @@ static struct unit_test_suite > cryptodev_chacha20_poly1305_testsuite =3D { > } > }; > > -static struct unit_test_suite cryptodev_snow3g_testsuite =3D { > +static struct unit_test_suite testsuite_snow3g =3D { > .suite_name =3D "SNOW 3G Test Suite", > - .setup =3D snow3g_testsuite_setup, > + .setup =3D ts_setup_snow3g, > + .teardown =3D ts_teardown_generic, > .unit_test_cases =3D { > /** SNOW 3G encrypt only (UEA2) */ > TEST_CASE_ST(ut_setup, ut_teardown, > @@ -18877,9 +18556,10 @@ static struct unit_test_suite > cryptodev_snow3g_testsuite =3D { > } > }; > > -static struct unit_test_suite cryptodev_zuc_testsuite =3D { > +static struct unit_test_suite testsuite_zuc =3D { > .suite_name =3D "ZUC Test Suite", > - .setup =3D zuc_testsuite_setup, > + .setup =3D ts_setup_zuc, > + .teardown =3D ts_teardown_generic, > .unit_test_cases =3D { > /** ZUC encrypt only (EEA3) */ > TEST_CASE_ST(ut_setup, ut_teardown, > @@ -19049,9 +18729,10 @@ static struct unit_test_suite > cryptodev_zuc_testsuite =3D { > } > }; > > -static struct unit_test_suite cryptodev_hmac_md5_auth_testsuite =3D { > +static struct unit_test_suite testsuite_hmac_md5_auth =3D { > .suite_name =3D "HMAC_MD5 Authentication Test Suite", > - .setup =3D hmac_md5_auth_testsuite_setup, > + .setup =3D ts_setup_hmac_md5, > + .teardown =3D ts_teardown_generic, > .unit_test_cases =3D { > TEST_CASE_ST(ut_setup, ut_teardown, > test_MD5_HMAC_generate_case_1), > @@ -19065,9 +18746,10 @@ static struct unit_test_suite > cryptodev_hmac_md5_auth_testsuite =3D { > } > }; > > -static struct unit_test_suite cryptodev_kasumi_testsuite =3D { > +static struct unit_test_suite testsuite_kasumi =3D { > .suite_name =3D "Kasumi Test Suite", > - .setup =3D kasumi_testsuite_setup, > + .setup =3D ts_setup_kasumi, > + .teardown =3D ts_teardown_generic, > .unit_test_cases =3D { > /** KASUMI hash only (UIA1) */ > TEST_CASE_ST(ut_setup, ut_teardown, > @@ -19156,9 +18838,10 @@ static struct unit_test_suite > cryptodev_kasumi_testsuite =3D { > } > }; > > -static struct unit_test_suite cryptodev_esn_testsuite =3D { > +static struct unit_test_suite testsuite_esn =3D { > .suite_name =3D "ESN Test Suite", > - .setup =3D esn_testsuite_setup, > + .setup =3D ts_setup_esn, > + .teardown =3D ts_teardown_generic, > .unit_test_cases =3D { > TEST_CASE_ST(ut_setup, ut_teardown, > auth_encrypt_AES128CBC_HMAC_SHA1_esn_check), > @@ -19168,9 +18851,10 @@ static struct unit_test_suite > cryptodev_esn_testsuite =3D { > } > }; > > -static struct unit_test_suite cryptodev_negative_aes_gcm_testsuite =3D = { > +static struct unit_test_suite testsuite_negative_aes_gcm =3D { > .suite_name =3D "Negative AES GCM Test Suite", > - .setup =3D negative_aes_gcm_testsuite_setup, > + .setup =3D ts_setup_negative_aes_gcm, > + .teardown =3D ts_teardown_generic, > .unit_test_cases =3D { > TEST_CASE_ST(ut_setup, ut_teardown, > test_AES_GCM_auth_encryption_fail_iv_corrupt), > @@ -19201,9 +18885,10 @@ static struct unit_test_suite > cryptodev_negative_aes_gcm_testsuite =3D { > } > }; > > -static struct unit_test_suite cryptodev_negative_aes_gmac_testsuite =3D= { > +static struct unit_test_suite testsuite_negative_aes_gmac =3D { > .suite_name =3D "Negative AES GMAC Test Suite", > - .setup =3D negative_aes_gmac_testsuite_setup, > + .setup =3D ts_setup_negative_aes_gmac, > + .teardown =3D ts_teardown_generic, > .unit_test_cases =3D { > TEST_CASE_ST(ut_setup, ut_teardown, > > authentication_verify_AES128_GMAC_fail_data_corrupt), > @@ -19214,9 +18899,10 @@ static struct unit_test_suite > cryptodev_negative_aes_gmac_testsuite =3D { > } > }; > > -static struct unit_test_suite cryptodev_mixed_cipher_hash_testsuite =3D= { > +static struct unit_test_suite testsuite_mixed_cipher_hash =3D { > .suite_name =3D "Mixed CIPHER + HASH algorithms Test Suite", > - .setup =3D mixed_cipher_hash_testsuite_setup, > + .setup =3D ts_setup_mixed_cipher_hash, > + .teardown =3D ts_teardown_generic, > .unit_test_cases =3D { > /** AUTH AES CMAC + CIPHER AES CTR */ > TEST_CASE_ST(ut_setup, ut_teardown, > @@ -19351,24 +19037,25 @@ run_cryptodev_testsuite(const char *pmd_name) > BLKCIPHER_DES_DOCSIS_TYPE, > BLKCIPHER_SM4_CHAIN_TYPE, > BLKCIPHER_SM4_CIPHERONLY_TYPE, > - BLKCIPHER_AUTHONLY_TYPE}; > + BLKCIPHER_AUTHONLY_TYPE > + }; > struct unit_test_suite *static_suites[] =3D { > - &cryptodev_multi_session_testsuite, > - &cryptodev_null_testsuite, > - &cryptodev_aes_ccm_auth_testsuite, > - &cryptodev_aes_gcm_auth_testsuite, > - &cryptodev_aes_gmac_auth_testsuite, > - &cryptodev_snow3g_testsuite, > - &cryptodev_chacha20_poly1305_testsuite, > - &cryptodev_zuc_testsuite, > - &cryptodev_hmac_md5_auth_testsuite, > - &cryptodev_kasumi_testsuite, > - &cryptodev_esn_testsuite, > - &cryptodev_negative_aes_gcm_testsuite, > - &cryptodev_negative_aes_gmac_testsuite, > - &cryptodev_mixed_cipher_hash_testsuite, > - &cryptodev_negative_hmac_sha1_testsuite, > - &cryptodev_gen_testsuite, > + &testsuite_multi_session, > + &testsuite_null, > + &testsuite_aes_ccm, > + &testsuite_aes_gcm, > + &testsuite_aes_gmac, > + &testsuite_snow3g, > + &testsuite_chacha20_poly1305, > + &testsuite_zuc, > + &testsuite_hmac_md5_auth, > + &testsuite_kasumi, > + &testsuite_esn, > + &testsuite_negative_aes_gcm, > + &testsuite_negative_aes_gmac, > + &testsuite_mixed_cipher_hash, > + &testsuite_negative_hmac_sha1, > + &testsuite_gen_testsuite, > #ifdef RTE_LIB_SECURITY > &ipsec_proto_testsuite, > &pdcp_proto_testsuite, > diff --git a/app/test/test_cryptodev.h b/app/test/test_cryptodev.h > index fd9ea0dd81..d884f1dea3 100644 > --- a/app/test/test_cryptodev.h > +++ b/app/test/test_cryptodev.h > @@ -86,7 +86,7 @@ enum cryptodev_api_test_type { > > extern enum cryptodev_api_test_type global_api_test_type; > > -extern struct crypto_testsuite_params *p_testsuite_params; > +extern struct crypto_testsuite_params *p_ts_params; > struct crypto_testsuite_params { > struct rte_mempool *mbuf_pool; > struct rte_mempool *large_mbuf_pool; > @@ -98,6 +98,10 @@ struct crypto_testsuite_params { > > uint8_t valid_devs[RTE_CRYPTO_MAX_DEVS]; > uint8_t valid_dev_count; > + /* Device ID that is used in tests that require single device */ > + int dev_id; > + /* Cryptodev device info that is used in tests that require singl= e > device */ > + struct rte_cryptodev_info dev_info; > }; > > /** > diff --git a/app/test/test_cryptodev_aead_test_vectors.h > b/app/test/test_cryptodev_aead_test_vectors.h > index e9b0590048..9c3aa328e3 100644 > --- a/app/test/test_cryptodev_aead_test_vectors.h > +++ b/app/test/test_cryptodev_aead_test_vectors.h > @@ -39,6 +39,7 @@ static uint8_t ccm_aad_test_2[22] =3D { > }; > > struct aead_test_data { > + const char *description; > enum rte_crypto_aead_algorithm algo; > > struct { > diff --git a/app/test/test_cryptodev_aes_test_vectors.h > b/app/test/test_cryptodev_aes_test_vectors.h > index 7127156cc4..09ebe4af50 100644 > --- a/app/test/test_cryptodev_aes_test_vectors.h > +++ b/app/test/test_cryptodev_aes_test_vectors.h > @@ -5,6 +5,112 @@ > #ifndef TEST_CRYPTODEV_AES_TEST_VECTORS_H_ > #define TEST_CRYPTODEV_AES_TEST_VECTORS_H_ > > +static const char catch_22_quote[] =3D > + "What a lousy earth! He wondered how many people were " > + "destitute that same night even in his own prosperous > country, " > + "how many homes were shanties, how many husbands were > drunk " > + "and wives socked, and how many children were bullied, > abused, " > + "or abandoned. How many families hungered for food they > could " > + "not afford to buy? How many hearts were broken? How many= " > + "suicides would take place that same night, how many > people " > + "would go insane? How many cockroaches and landlords woul= d > " > + "triumph? How many winners were losers, successes > failures, " > + "and rich men poor men? How many wise guys were stupid? > How " > + "many happy endings were unhappy endings? How many honest > men " > + "were liars, brave men cowards, loyal men traitors, how > many " > + "sainted men were corrupt, how many people in positions o= f > " > + "trust had sold their souls to bodyguards, how many had > never " > + "had souls? How many straight-and-narrow paths were > crooked " > + "paths? How many best families were worst families and ho= w > " > + "many good people were bad people? When you added them al= l > up " > + "and then subtracted, you might be left with only the > children, " > + "and perhaps with Albert Einstein and an old violinist or= " > + "sculptor somewhere."; > + > +#define QUOTE_480_BYTES (480) > +#define QUOTE_512_BYTES (512) > +#define QUOTE_768_BYTES (768) > +#define QUOTE_1024_BYTES (1024) > + > +#define CIPHER_KEY_LENGTH_AES_CBC (16) > +#define CIPHER_IV_LENGTH_AES_CBC (CIPHER_KEY_LENGTH_AES_CBC) > + > + > +/* ***** AES-CBC / HMAC-SHA1 Hash Tests ***** */ > + > +static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_ciphertext[] =3D= { > + 0x8B, 0x4D, 0xDA, 0x1B, 0xCF, 0x04, 0xA0, 0x31, > + 0xB4, 0xBF, 0xBD, 0x68, 0x43, 0x20, 0x7E, 0x76, > + 0xB1, 0x96, 0x8B, 0xA2, 0x7C, 0xA2, 0x83, 0x9E, > + 0x39, 0x5A, 0x2F, 0x7E, 0x92, 0xB4, 0x48, 0x1A, > + 0x3F, 0x6B, 0x5D, 0xDF, 0x52, 0x85, 0x5F, 0x8E, > + 0x42, 0x3C, 0xFB, 0xE9, 0x1A, 0x24, 0xD6, 0x08, > + 0xDD, 0xFD, 0x16, 0xFB, 0xE9, 0x55, 0xEF, 0xF0, > + 0xA0, 0x8D, 0x13, 0xAB, 0x81, 0xC6, 0x90, 0x01, > + 0xB5, 0x18, 0x84, 0xB3, 0xF6, 0xE6, 0x11, 0x57, > + 0xD6, 0x71, 0xC6, 0x3C, 0x3F, 0x2F, 0x33, 0xEE, > + 0x24, 0x42, 0x6E, 0xAC, 0x0B, 0xCA, 0xEC, 0xF9, > + 0x84, 0xF8, 0x22, 0xAA, 0x60, 0xF0, 0x32, 0xA9, > + 0x75, 0x75, 0x3B, 0xCB, 0x70, 0x21, 0x0A, 0x8D, > + 0x0F, 0xE0, 0xC4, 0x78, 0x2B, 0xF8, 0x97, 0xE3, > + 0xE4, 0x26, 0x4B, 0x29, 0xDA, 0x88, 0xCD, 0x46, > + 0xEC, 0xAA, 0xF9, 0x7F, 0xF1, 0x15, 0xEA, 0xC3, > + 0x87, 0xE6, 0x31, 0xF2, 0xCF, 0xDE, 0x4D, 0x80, > + 0x70, 0x91, 0x7E, 0x0C, 0xF7, 0x26, 0x3A, 0x92, > + 0x4F, 0x18, 0x83, 0xC0, 0x8F, 0x59, 0x01, 0xA5, > + 0x88, 0xD1, 0xDB, 0x26, 0x71, 0x27, 0x16, 0xF5, > + 0xEE, 0x10, 0x82, 0xAC, 0x68, 0x26, 0x9B, 0xE2, > + 0x6D, 0xD8, 0x9A, 0x80, 0xDF, 0x04, 0x31, 0xD5, > + 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, > + 0x58, 0x34, 0x85, 0x61, 0x1C, 0x42, 0x10, 0x76, > + 0x73, 0x02, 0x42, 0xC9, 0x23, 0x18, 0x8E, 0xB4, > + 0x6F, 0xB4, 0xA3, 0x54, 0x6E, 0x88, 0x3B, 0x62, > + 0x7C, 0x02, 0x8D, 0x4C, 0x9F, 0xC8, 0x45, 0xF4, > + 0xC9, 0xDE, 0x4F, 0xEB, 0x22, 0x83, 0x1B, 0xE4, > + 0x49, 0x37, 0xE4, 0xAD, 0xE7, 0xCD, 0x21, 0x54, > + 0xBC, 0x1C, 0xC2, 0x04, 0x97, 0xB4, 0x10, 0x61, > + 0xF0, 0xE4, 0xEF, 0x27, 0x63, 0x3A, 0xDA, 0x91, > + 0x41, 0x25, 0x62, 0x1C, 0x5C, 0xB6, 0x38, 0x4A, > + 0x88, 0x71, 0x59, 0x5A, 0x8D, 0xA0, 0x09, 0xAF, > + 0x72, 0x94, 0xD7, 0x79, 0x5C, 0x60, 0x7C, 0x8F, > + 0x4C, 0xF5, 0xD9, 0xA1, 0x39, 0x6D, 0x81, 0x28, > + 0xEF, 0x13, 0x28, 0xDF, 0xF5, 0x3E, 0xF7, 0x8E, > + 0x09, 0x9C, 0x78, 0x18, 0x79, 0xB8, 0x68, 0xD7, > + 0xA8, 0x29, 0x62, 0xAD, 0xDE, 0xE1, 0x61, 0x76, > + 0x1B, 0x05, 0x16, 0xCD, 0xBF, 0x02, 0x8E, 0xA6, > + 0x43, 0x6E, 0x92, 0x55, 0x4F, 0x60, 0x9C, 0x03, > + 0xB8, 0x4F, 0xA3, 0x02, 0xAC, 0xA8, 0xA7, 0x0C, > + 0x1E, 0xB5, 0x6B, 0xF8, 0xC8, 0x4D, 0xDE, 0xD2, > + 0xB0, 0x29, 0x6E, 0x40, 0xE6, 0xD6, 0xC9, 0xE6, > + 0xB9, 0x0F, 0xB6, 0x63, 0xF5, 0xAA, 0x2B, 0x96, > + 0xA7, 0x16, 0xAC, 0x4E, 0x0A, 0x33, 0x1C, 0xA6, > + 0xE6, 0xBD, 0x8A, 0xCF, 0x40, 0xA9, 0xB2, 0xFA, > + 0x63, 0x27, 0xFD, 0x9B, 0xD9, 0xFC, 0xD5, 0x87, > + 0x8D, 0x4C, 0xB6, 0xA4, 0xCB, 0xE7, 0x74, 0x55, > + 0xF4, 0xFB, 0x41, 0x25, 0xB5, 0x4B, 0x0A, 0x1B, > + 0xB1, 0xD6, 0xB7, 0xD9, 0x47, 0x2A, 0xC3, 0x98, > + 0x6A, 0xC4, 0x03, 0x73, 0x1F, 0x93, 0x6E, 0x53, > + 0x19, 0x25, 0x64, 0x15, 0x83, 0xF9, 0x73, 0x2A, > + 0x74, 0xB4, 0x93, 0x69, 0xC4, 0x72, 0xFC, 0x26, > + 0xA2, 0x9F, 0x43, 0x45, 0xDD, 0xB9, 0xEF, 0x36, > + 0xC8, 0x3A, 0xCD, 0x99, 0x9B, 0x54, 0x1A, 0x36, > + 0xC1, 0x59, 0xF8, 0x98, 0xA8, 0xCC, 0x28, 0x0D, > + 0x73, 0x4C, 0xEE, 0x98, 0xCB, 0x7C, 0x58, 0x7E, > + 0x20, 0x75, 0x1E, 0xB7, 0xC9, 0xF8, 0xF2, 0x0E, > + 0x63, 0x9E, 0x05, 0x78, 0x1A, 0xB6, 0xA8, 0x7A, > + 0xF9, 0x98, 0x6A, 0xA6, 0x46, 0x84, 0x2E, 0xF6, > + 0x4B, 0xDC, 0x9B, 0x8F, 0x9B, 0x8F, 0xEE, 0xB4, > + 0xAA, 0x3F, 0xEE, 0xC0, 0x37, 0x27, 0x76, 0xC7, > + 0x95, 0xBB, 0x26, 0x74, 0x69, 0x12, 0x7F, 0xF1, > + 0xBB, 0xFF, 0xAE, 0xB5, 0x99, 0x6E, 0xCB, 0x0C > +}; > + > +static const uint8_t > catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest[] =3D { > + 0x9a, 0x4f, 0x88, 0x1b, 0xb6, 0x8f, 0xd8, 0x60, > + 0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1, > + 0x18, 0x8c, 0x1d, 0x32 > +}; > + > /* test vectors */ > static const uint8_t plaintext_aes128ctr[] =3D { > 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96, > diff --git a/app/test/test_cryptodev_blockcipher.c > b/app/test/test_cryptodev_blockcipher.c > index 87a321fac3..f7a35f59b9 100644 > --- a/app/test/test_cryptodev_blockcipher.c > +++ b/app/test/test_cryptodev_blockcipher.c > @@ -834,10 +834,10 @@ blockcipher_test_case_run(const void *data) > char test_msg[BLOCKCIPHER_TEST_MSG_LEN + 1]; > > status =3D test_blockcipher_one_case(tc_data, > - p_testsuite_params->mbuf_pool, > - p_testsuite_params->op_mpool, > - p_testsuite_params->session_mpool, > - p_testsuite_params->valid_devs[0], > + p_ts_params->mbuf_pool, > + p_ts_params->op_mpool, > + p_ts_params->session_mpool, > + p_ts_params->valid_devs[0], > test_msg); > return status; > } > @@ -845,7 +845,7 @@ blockcipher_test_case_run(const void *data) > static int > aes_chain_setup(void) > { > - uint8_t dev_id =3D p_testsuite_params->valid_devs[0]; > + uint8_t dev_id =3D p_ts_params->valid_devs[0]; > struct rte_cryptodev_info dev_info; > uint64_t feat_flags; > const enum rte_crypto_cipher_algorithm ciphers[] =3D { > @@ -888,7 +888,7 @@ aes_chain_setup(void) > static int > aes_cipheronly_setup(void) > { > - uint8_t dev_id =3D p_testsuite_params->valid_devs[0]; > + uint8_t dev_id =3D p_ts_params->valid_devs[0]; > struct rte_cryptodev_info dev_info; > uint64_t feat_flags; > const enum rte_crypto_cipher_algorithm ciphers[] =3D { > @@ -929,7 +929,7 @@ aes_cipheronly_setup(void) > static int > aes_docsis_setup(void) > { > - uint8_t dev_id =3D p_testsuite_params->valid_devs[0]; > + uint8_t dev_id =3D p_ts_params->valid_devs[0]; > struct rte_cryptodev_info dev_info; > uint64_t feat_flags; > const enum rte_crypto_cipher_algorithm ciphers[] =3D { > @@ -959,7 +959,7 @@ aes_docsis_setup(void) > static int > triple_des_chain_setup(void) > { > - uint8_t dev_id =3D p_testsuite_params->valid_devs[0]; > + uint8_t dev_id =3D p_ts_params->valid_devs[0]; > struct rte_cryptodev_info dev_info; > uint64_t feat_flags; > const enum rte_crypto_cipher_algorithm ciphers[] =3D { > @@ -996,7 +996,7 @@ triple_des_chain_setup(void) > static int > triple_des_cipheronly_setup(void) > { > - uint8_t dev_id =3D p_testsuite_params->valid_devs[0]; > + uint8_t dev_id =3D p_ts_params->valid_devs[0]; > struct rte_cryptodev_info dev_info; > uint64_t feat_flags; > const enum rte_crypto_cipher_algorithm ciphers[] =3D { > @@ -1027,7 +1027,7 @@ triple_des_cipheronly_setup(void) > static int > des_cipheronly_setup(void) > { > - uint8_t dev_id =3D p_testsuite_params->valid_devs[0]; > + uint8_t dev_id =3D p_ts_params->valid_devs[0]; > struct rte_cryptodev_info dev_info; > uint64_t feat_flags; > const enum rte_crypto_cipher_algorithm ciphers[] =3D { > @@ -1057,7 +1057,7 @@ des_cipheronly_setup(void) > static int > des_docsis_setup(void) > { > - uint8_t dev_id =3D p_testsuite_params->valid_devs[0]; > + uint8_t dev_id =3D p_ts_params->valid_devs[0]; > struct rte_cryptodev_info dev_info; > uint64_t feat_flags; > const enum rte_crypto_cipher_algorithm ciphers[] =3D { > @@ -1087,7 +1087,7 @@ des_docsis_setup(void) > static int > authonly_setup(void) > { > - uint8_t dev_id =3D p_testsuite_params->valid_devs[0]; > + uint8_t dev_id =3D p_ts_params->valid_devs[0]; > struct rte_cryptodev_info dev_info; > uint64_t feat_flags; > const enum rte_crypto_auth_algorithm auths[] =3D { > @@ -1131,7 +1131,7 @@ authonly_setup(void) > static int > sm4_chain_setup(void) > { > - uint8_t dev_id =3D p_testsuite_params->valid_devs[0]; > + uint8_t dev_id =3D p_ts_params->valid_devs[0]; > struct rte_cryptodev_info dev_info; > uint64_t feat_flags; > const enum rte_crypto_cipher_algorithm ciphers[] =3D { > @@ -1167,7 +1167,7 @@ sm4_chain_setup(void) > static int > sm4_cipheronly_setup(void) > { > - uint8_t dev_id =3D p_testsuite_params->valid_devs[0]; > + uint8_t dev_id =3D p_ts_params->valid_devs[0]; > struct rte_cryptodev_info dev_info; > uint64_t feat_flags; > const enum rte_crypto_cipher_algorithm ciphers[] =3D { > diff --git a/app/test/test_cryptodev_hmac_test_vectors.h > b/app/test/test_cryptodev_hmac_test_vectors.h > index 77153a5c10..891e5d71fd 100644 > --- a/app/test/test_cryptodev_hmac_test_vectors.h > +++ b/app/test/test_cryptodev_hmac_test_vectors.h > @@ -5,6 +5,81 @@ > #ifndef APP_TEST_TEST_CRYPTODEV_HMAC_TEST_VECTORS_H_ > #define APP_TEST_TEST_CRYPTODEV_HMAC_TEST_VECTORS_H_ > > +#define HMAC_KEY_LENGTH_SHA1 (DIGEST_BYTE_LENGTH_SHA1) > + > +static uint8_t hmac_sha1_key[] =3D { > + 0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA, > + 0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD, > + 0xDE, 0xF4, 0xDE, 0xAD }; > + > +#define HMAC_KEY_LENGTH_SHA224 (DIGEST_BYTE_LENGTH_SHA224) > + > +static uint8_t ms_hmac_key0[] =3D { > + 0xFF, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1, > + 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, > + 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76, > + 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60, > + 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1, > + 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0, > + 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76, > + 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60 > +}; > + > +static const uint8_t ms_hmac_digest0[] =3D { > + 0x43, 0x52, 0xED, 0x34, 0xAB, 0x36, 0xB2, 0x51, > + 0xFB, 0xA3, 0xA6, 0x7C, 0x38, 0xFC, 0x42, 0x8F, > + 0x57, 0x64, 0xAB, 0x81, 0xA7, 0x89, 0xB7, 0x6C, > + 0xA0, 0xDC, 0xB9, 0x4D, 0xC4, 0x30, 0xF9, 0xD4, > + 0x10, 0x82, 0x55, 0xD0, 0xAB, 0x32, 0xFB, 0x56, > + 0x0D, 0xE4, 0x68, 0x3D, 0x76, 0xD0, 0x7B, 0xE4, > + 0xA6, 0x2C, 0x34, 0x9E, 0x8C, 0x41, 0xF8, 0x23, > + 0x28, 0x1B, 0x3A, 0x90, 0x26, 0x34, 0x47, 0x90 > +}; > + > +static uint8_t ms_hmac_key1[] =3D { > + 0xFE, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1, > + 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, > + 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76, > + 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60, > + 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1, > + 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0, > + 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76, > + 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60 > +}; > + > +static const uint8_t ms_hmac_digest1[] =3D { > + 0xCE, 0x6E, 0x5F, 0x77, 0x96, 0x9A, 0xB1, 0x69, > + 0x2D, 0x5E, 0xF3, 0x2F, 0x32, 0x10, 0xCB, 0x50, > + 0x0E, 0x09, 0x56, 0x25, 0x07, 0x34, 0xC9, 0x20, > + 0xEC, 0x13, 0x43, 0x23, 0x5C, 0x08, 0x8B, 0xCD, > + 0xDC, 0x86, 0x8C, 0xEE, 0x0A, 0x95, 0x2E, 0xB9, > + 0x8C, 0x7B, 0x02, 0x7A, 0xD4, 0xE1, 0x49, 0xB4, > + 0x45, 0xB5, 0x52, 0x37, 0xC6, 0xFF, 0xFE, 0xAA, > + 0x0A, 0x87, 0xB8, 0x51, 0xF9, 0x2A, 0x01, 0x8F > +}; > + > +static uint8_t ms_hmac_key2[] =3D { > + 0xFC, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1, > + 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, > + 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76, > + 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60, > + 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1, > + 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0, > + 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76, > + 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60 > +}; > + > +static const uint8_t ms_hmac_digest2[] =3D { > + 0xA5, 0x0F, 0x9C, 0xFB, 0x08, 0x62, 0x59, 0xFF, > + 0x80, 0x2F, 0xEB, 0x4B, 0xE1, 0x46, 0x21, 0xD6, > + 0x02, 0x98, 0xF2, 0x8E, 0xF4, 0xEC, 0xD4, 0x77, > + 0x86, 0x4C, 0x31, 0x28, 0xC8, 0x25, 0x80, 0x27, > + 0x3A, 0x72, 0x5D, 0x6A, 0x56, 0x8A, 0xD3, 0x82, > + 0xB0, 0xEC, 0x31, 0x6D, 0x8B, 0x6B, 0xB4, 0x24, > + 0xE7, 0x62, 0xC1, 0x52, 0xBC, 0x14, 0x1B, 0x8E, > + 0xEC, 0x9A, 0xF1, 0x47, 0x80, 0xD2, 0xB0, 0x59 > +}; > + > /* *** MD5 test vectors *** */ > > #define MD5_DIGEST_LEN 16 > -- > 2.13.6 > > --000000000000fdef810623085e6f Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+UmVjaGVjay1yZXF1ZXN0OiBpb2wtbWVsbGFub3gtUGVyZm9ybWFuY2U8 YnI+PGJyPldoZW4gSSBlbmFibGVkIHRoaXMgdGVzdCBvbiBNb25kYXkgSSBhY2NpZGVudGFsbHkg c2V0IHRoZSBkZWx0YSB0aHJlc2hvbGQgdG8gMS41JSBpbnN0ZWFkIG9mIDUlLiBTbyB0aGUgYWNj ZXB0ZWQgcmVzdWx0cyB3aW5kb3cgd2FzIHRvbyBzbWFsbCBhbmQgbGVkIHRvIHRoaXMgZmFsc2Ug cG9zaXRpdmUgdGVzdCBmYWlsLjxicj48L2Rpdj48YnI+PGRpdiBjbGFzcz0iZ21haWxfcXVvdGUi PjxkaXYgZGlyPSJsdHIiIGNsYXNzPSJnbWFpbF9hdHRyIj5PbiBXZWQsIFNlcCAyNSwgMjAyNCBh dCAzOjMw4oCvUE0gQXJrYWRpdXN6IEt1c3p0YWwgJmx0OzxhIGhyZWY9Im1haWx0bzphcmthZGl1 c3p4Lmt1c3p0YWxAaW50ZWwuY29tIj5hcmthZGl1c3p4Lmt1c3p0YWxAaW50ZWwuY29tPC9hPiZn dDsgd3JvdGU6PGJyPjwvZGl2PjxibG9ja3F1b3RlIGNsYXNzPSJnbWFpbF9xdW90ZSIgc3R5bGU9 Im1hcmdpbjowcHggMHB4IDBweCAwLjhleDtib3JkZXItbGVmdDoxcHggc29saWQgcmdiKDIwNCwy MDQsMjA0KTtwYWRkaW5nLWxlZnQ6MWV4Ij5UaGlzIGNvbW1pdCBpbnRyb2R1Y2VzIHNldmVyYWwg Y2hhbmdlcyB0byB0aGUgY3J5cHRvZGV2PGJyPg0KdGVzdCBjYXNlcyB0aGF0IHNob3VsZCBtYWtl IGl0IGVhc2llciB0byBtYWludGFpbi48YnI+DQo8YnI+DQpDaGFuZ2VzIGluY2x1ZGVkIGluIHRo aXMgcGF0Y2g6PGJyPg0KLSBJZiBub3QgbmVlZGVkIGJ5IHRoZSBzcGVjaWZpYyB0ZXN0IGNhc2Us IHRoZSBkZXZpY2Ugc2hvdWxkIGJlPGJyPg0Kc3RhcnRlZC9zdG9wcGVkIGluIHRoZSBwYXJ0aWN1 bGFyIHRlc3RzdWl0ZSBzZXR1cC90ZWFyZG93bjxicj4NCmZ1bmN0aW9uLjxicj4NCi0gTW9zdCBv ZiB0aGUgcmVtYWluaW5nIHRlc3QgdmVjdG9ycyB3ZXJlIG1vdmVkIGZyb20gdGVzdC5jIGZpbGU8 YnI+DQp0byB0aGUgc3BlY2lmaWMgaGVhZGVyIHZlY3RvciBmaWxlcy48YnI+DQotIFBhcnQgb2Yg R0NNIHJlZHVuZGFudCBmdW5jdGlvbnMgd2VyZSByZXBsYWNlZCBieSBuYW1lZCB0ZXN0IGNhc2Vz Ljxicj4NCi0gVW5pdCB0ZXN0cyBkbyBub3QgbmVlZCB0byBjaGVjayBmb3IgdGhlIHN5bW1ldHJp YyBjcnlwdG9ncmFwaHkgZmVhdHVyZSw8YnI+DQppZiB0aGlzIGZlYXR1cmUgd2VyZSBub3QgcHJl c2VudCwgdGhlIHRlc3Qgc2hvdWxkIG5vdCBldmVuIHJlYWNoIHRoaXMgc3RhZ2UuPGJyPg0KPGJy Pg0KU2lnbmVkLW9mZi1ieTogQXJrYWRpdXN6IEt1c3p0YWwgJmx0OzxhIGhyZWY9Im1haWx0bzph cmthZGl1c3p4Lmt1c3p0YWxAaW50ZWwuY29tIiB0YXJnZXQ9Il9ibGFuayI+YXJrYWRpdXN6eC5r dXN6dGFsQGludGVsLmNvbTwvYT4mZ3Q7PGJyPg0KLS0tPGJyPg0KUGxlYXNlIG5vdGUgdGhhdCB0 aGlzIGlzIHdvcmsgaW4gcHJvZ3Jlc3MsIHdoYXQgaXMgbGVmdCB0byBiZSBkb25lOjxicj4NCi0g UmV3b3JrIHNlY3VyaXR5IHRlc3QgY2FzZXMsIHRoZXNlIHdpbGwgZmFpbCB3aXRoIGN1cnJlbnQg c2V0dXAuPGJyPg0KLSBGaXggT09QIGlzc3VlLiBPT1AgdGVzdHMgZG8gbm90IGNoZWNrIGZvciB0 aGUgcHJlcGVuZGVkIGRhdGEgaW4gdGhlIE9PUCBidWZmZXIuPGJyPg0KLSBSZW1vdmUgcmVtYWlu aW5nIHRlc3QgdmVjdG9ycyBmcm9tIHRoZSAuYyBmaWxlLjxicj4NCi0gUmVtb3ZlIHJlZHVuZGFu dCB0ZXN0IGZ1bmN0aW9ucyB0aGF0IGNhbGwgY29tbW9uIGZ1bmN0aW9uLCByZXBsYWNlIHdpdGgg bmFtZWQgdGVzdCBjYXNlcy48YnI+DQotIFJlZmFjdG9yIGJsb2NrIGNpcGhlciBmdW5jdGlvbnMs IHRoZXJlIGFyZSBvbmx5IHRocmVlIGJsb2NrIGNpcGhlciBhbGdvcml0aG1zIGluIHRoZSBjcnlw dG9kZXYuPGJyPg0KPGJyPg0KwqBhcHAvdGVzdC90ZXN0X2NyeXB0b2Rldi5jwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqB8IDE5MTMgKysrKysrKysrKystLS0tLS0tLS0tLS0tLS0tPGJyPg0K wqBhcHAvdGVzdC90ZXN0X2NyeXB0b2Rldi5owqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB8 wqAgwqAgNiArLTxicj4NCsKgYXBwL3Rlc3QvdGVzdF9jcnlwdG9kZXZfYWVhZF90ZXN0X3ZlY3Rv cnMuaCB8wqAgwqAgMSArPGJyPg0KwqBhcHAvdGVzdC90ZXN0X2NyeXB0b2Rldl9hZXNfdGVzdF92 ZWN0b3JzLmjCoCB8wqAgMTA2ICsrPGJyPg0KwqBhcHAvdGVzdC90ZXN0X2NyeXB0b2Rldl9ibG9j a2NpcGhlci5jwqAgwqAgwqAgwqB8wqAgwqAyOCArLTxicj4NCsKgYXBwL3Rlc3QvdGVzdF9jcnlw dG9kZXZfaG1hY190ZXN0X3ZlY3RvcnMuaCB8wqAgwqA3NSArKzxicj4NCsKgNiBmaWxlcyBjaGFu Z2VkLCAxMDAxIGluc2VydGlvbnMoKyksIDExMjggZGVsZXRpb25zKC0pPGJyPg0KPGJyPg0KZGlm ZiAtLWdpdCBhL2FwcC90ZXN0L3Rlc3RfY3J5cHRvZGV2LmMgYi9hcHAvdGVzdC90ZXN0X2NyeXB0 b2Rldi5jPGJyPg0KaW5kZXggYzg0NmIyNmVkMS4uZTlhZGY5NWM5OCAxMDA2NDQ8YnI+DQotLS0g YS9hcHAvdGVzdC90ZXN0X2NyeXB0b2Rldi5jPGJyPg0KKysrIGIvYXBwL3Rlc3QvdGVzdF9jcnlw dG9kZXYuYzxicj4NCkBAIC04NSw3ICs4NSw2IEBAIHN0cnVjdCBjcnlwdG9fdW5pdHRlc3RfcGFy YW1zIHs8YnI+DQrCoCNpZmRlZiBSVEVfTElCX1NFQ1VSSVRZPGJyPg0KwqAgwqAgwqAgwqAgc3Ry dWN0IHJ0ZV9zZWN1cml0eV9kb2NzaXNfeGZvcm0gZG9jc2lzX3hmb3JtOzxicj4NCsKgI2VuZGlm PGJyPg0KLTxicj4NCsKgIMKgIMKgIMKgIHVuaW9uIHs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCB2b2lkICpzZXNzOzxicj4NCsKgI2lmZGVmIFJURV9MSUJfU0VDVVJJVFk8YnI+DQpAQCAt OTYsMTEgKzk1LDkgQEAgc3RydWN0IGNyeXB0b191bml0dGVzdF9wYXJhbXMgezxicj4NCsKgIMKg IMKgIMKgIGVudW0gcnRlX3NlY3VyaXR5X3Nlc3Npb25fYWN0aW9uX3R5cGUgdHlwZTs8YnI+DQrC oCNlbmRpZjxicj4NCsKgIMKgIMKgIMKgIHN0cnVjdCBydGVfY3J5cHRvX29wICpvcDs8YnI+DQot PGJyPg0KwqAgwqAgwqAgwqAgc3RydWN0IHJ0ZV9tYnVmICpvYnVmLCAqaWJ1Zjs8YnI+DQotPGJy Pg0KwqAgwqAgwqAgwqAgdWludDhfdCAqZGlnZXN0Ozxicj4NCi19Ozxicj4NCit9IHVuaXR0ZXN0 X3BhcmFtcywgKnNlbGYgPSAmYW1wO3VuaXR0ZXN0X3BhcmFtczs8YnI+DQo8YnI+DQrCoCNkZWZp bmUgQUxJR05fUE9XMl9ST1VORFVQKG51bSwgYWxpZ24pIFw8YnI+DQrCoCDCoCDCoCDCoCAoKChu dW0pICsgKGFsaWduKSAtIDEpICZhbXA7IH4oKGFsaWduKSAtIDEpKTxicj4NCkBAIC0xMjEsNiAr MTE4LDkgQEAgc3RydWN0IGNyeXB0b191bml0dGVzdF9wYXJhbXMgezxicj4NCsKgLyo8YnI+DQrC oCAqIEZvcndhcmQgZGVjbGFyYXRpb25zLjxicj4NCsKgICovPGJyPg0KK3N0YXRpYyBpbmxpbmUg dm9pZDxicj4NCitleHRfbWJ1Zl9tZW16b25lX2ZyZWUoaW50IG5iX3NlZ3MpOzxicj4NCis8YnI+ DQrCoHN0YXRpYyBpbnQ8YnI+DQrCoHRlc3RfQUVTX0NCQ19ITUFDX1NIQTUxMl9kZWNyeXB0X2Ny ZWF0ZV9zZXNzaW9uX3BhcmFtcyg8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBzdHJ1Y3Qg Y3J5cHRvX3VuaXR0ZXN0X3BhcmFtcyAqdXRfcGFyYW1zLCB1aW50OF90ICpjaXBoZXJfa2V5LDxi cj4NCkBAIC0xOTYsOSArMTk2LDggQEAgcG9zdF9wcm9jZXNzX3Jhd19kcF9vcCh2b2lkICp1c2Vy X2RhdGEswqAgwqAgwqB1aW50MzJfdCBpbmRleCBfX3J0ZV91bnVzZWQsPGJyPg0KwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgUlRFX0NSWVBUT19PUF9TVEFUVVNfRVJST1I7PGJy Pg0KwqB9PGJyPg0KPGJyPg0KLXN0YXRpYyBzdHJ1Y3QgY3J5cHRvX3Rlc3RzdWl0ZV9wYXJhbXMg dGVzdHN1aXRlX3BhcmFtcyA9IHsgTlVMTCB9Ozxicj4NCi1zdHJ1Y3QgY3J5cHRvX3Rlc3RzdWl0 ZV9wYXJhbXMgKnBfdGVzdHN1aXRlX3BhcmFtcyA9ICZhbXA7dGVzdHN1aXRlX3BhcmFtczs8YnI+ DQotc3RhdGljIHN0cnVjdCBjcnlwdG9fdW5pdHRlc3RfcGFyYW1zIHVuaXR0ZXN0X3BhcmFtczs8 YnI+DQorc3RhdGljIHN0cnVjdCBjcnlwdG9fdGVzdHN1aXRlX3BhcmFtcyB0ZXN0c3VpdGVfcGFy YW1zID0geyAuZGV2X2lkID0gLTEgfTs8YnI+DQorc3RydWN0IGNyeXB0b190ZXN0c3VpdGVfcGFy YW1zICpwX3RzX3BhcmFtcyA9ICZhbXA7dGVzdHN1aXRlX3BhcmFtczs8YnI+DQrCoHN0YXRpYyBi b29sIGVucV9jYl9jYWxsZWQ7PGJyPg0KwqBzdGF0aWMgYm9vbCBkZXFfY2JfY2FsbGVkOzxicj4N Cjxicj4NCkBAIC01NTgsMTIgKzU1NywxNiBAQCBwcm9jZXNzX2NyeXB0b19yZXF1ZXN0KHVpbnQ4 X3QgZGV2X2lkLCBzdHJ1Y3QgcnRlX2NyeXB0b19vcCAqb3ApPGJyPg0KwqAgwqAgwqAgwqAgcmV0 dXJuIG9wOzxicj4NCsKgfTxicj4NCjxicj4NCisvKjxicj4NCisgKiBTZXR1cC90ZWFyZG93biBm dW5jdGlvbnMgb2YgdGhlIGVudGlyZSB0ZXN0c3VpdGUgZmlsZTxicj4NCisgKi88YnI+DQorPGJy Pg0KwqBzdGF0aWMgaW50PGJyPg0KwqB0ZXN0c3VpdGVfc2V0dXAodm9pZCk8YnI+DQrCoHs8YnI+ DQrCoCDCoCDCoCDCoCBzdHJ1Y3QgY3J5cHRvX3Rlc3RzdWl0ZV9wYXJhbXMgKnRzX3BhcmFtcyA9 ICZhbXA7dGVzdHN1aXRlX3BhcmFtczs8YnI+DQrCoCDCoCDCoCDCoCBzdHJ1Y3QgcnRlX2NyeXB0 b2Rldl9pbmZvIGluZm87PGJyPg0KLcKgIMKgIMKgIMKgdWludDMyX3QgaSA9IDAsIG5iX2RldnMs IGRldl9pZDs8YnI+DQorwqAgwqAgwqAgwqB1aW50MzJfdCBpID0gMCwgbmJfZGV2czs8YnI+DQrC oCDCoCDCoCDCoCB1aW50MTZfdCBxcF9pZDs8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCBtZW1zZXQo dHNfcGFyYW1zLCAwLCBzaXplb2YoKnRzX3BhcmFtcykpOzxicj4NCkBAIC02MzEsMjIgKzYzNCwy NiBAQCB0ZXN0c3VpdGVfc2V0dXAodm9pZCk8YnI+DQrCoCDCoCDCoCDCoCBpZiAodHNfcGFyYW1z LSZndDt2YWxpZF9kZXZfY291bnQgJmx0OyAxKTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IHJldHVybiBURVNUX0ZBSUxFRDs8YnI+DQo8YnI+DQotwqAgwqAgwqAgwqAvKiBTZXQgdXAgYWxs IHRoZSBxcHMgb24gdGhlIGZpcnN0IG9mIHRoZSB2YWxpZCBkZXZpY2VzIGZvdW5kICovPGJyPg0K LTxicj4NCi3CoCDCoCDCoCDCoGRldl9pZCA9IHRzX3BhcmFtcy0mZ3Q7dmFsaWRfZGV2c1swXTs8 YnI+DQotPGJyPg0KLcKgIMKgIMKgIMKgcnRlX2NyeXB0b2Rldl9pbmZvX2dldChkZXZfaWQsICZh bXA7aW5mbyk7PGJyPg0KK8KgIMKgIMKgIMKgdHNfcGFyYW1zLSZndDtkZXZfaWQgPSB0c19wYXJh bXMtJmd0O3ZhbGlkX2RldnNbMF07PGJyPg0KK8KgIMKgIMKgIMKgcnRlX2NyeXB0b2Rldl9pbmZv X2dldCh0c19wYXJhbXMtJmd0O2Rldl9pZCwgJmFtcDt0c19wYXJhbXMtJmd0O2Rldl9pbmZvKTs8 YnI+DQorwqAgwqAgwqAgwqAvKiBDaGVjayBpZiB0aGlzIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0 IHN5bW1ldHJpYyBjcnlwdG8gKi88YnI+DQorwqAgwqAgwqAgwqBpZiAoISh0c19wYXJhbXMtJmd0 O2Rldl9pbmZvLmZlYXR1cmVfZmxhZ3MgJmFtcDsgUlRFX0NSWVBUT0RFVl9GRl9TWU1NRVRSSUNf Q1JZUFRPKSkgezxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFJURV9MT0coSU5GTywgVVNF UjEsICZxdW90O0ZlYXR1cmUgZmxhZyByZXF1aXJlbWVudHMgZm9yIEFFUyBHQ00gJnF1b3Q7PGJy Pg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJnF1b3Q7 dGVzdHN1aXRlIG5vdCBtZXRcbiZxdW90Oyk7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKg cmV0dXJuIFRFU1RfU0tJUFBFRDs8YnI+DQorwqAgwqAgwqAgwqB9PGJyPg0KPGJyPg0KLcKgIMKg IMKgIMKgdHNfcGFyYW1zLSZndDtjb25mLm5iX3F1ZXVlX3BhaXJzID0gaW5mby5tYXhfbmJfcXVl dWVfcGFpcnM7PGJyPg0KK8KgIMKgIMKgIMKgLyogU2V0IHVwIGFsbCB0aGUgcXBzIG9uIHRoZSBm aXJzdCBvZiB0aGUgdmFsaWQgZGV2aWNlcyBmb3VuZCAqLzxicj4NCivCoCDCoCDCoCDCoHRzX3Bh cmFtcy0mZ3Q7Y29uZi5uYl9xdWV1ZV9wYWlycyA9IHRzX3BhcmFtcy0mZ3Q7ZGV2X2luZm8ubWF4 X25iX3F1ZXVlX3BhaXJzOzxicj4NCsKgIMKgIMKgIMKgIHRzX3BhcmFtcy0mZ3Q7Y29uZi5zb2Nr ZXRfaWQgPSBTT0NLRVRfSURfQU5ZOzxicj4NCsKgIMKgIMKgIMKgIHRzX3BhcmFtcy0mZ3Q7Y29u Zi5mZl9kaXNhYmxlID0gUlRFX0NSWVBUT0RFVl9GRl9TRUNVUklUWTs8YnI+DQo8YnI+DQrCoCDC oCDCoCDCoCB1bnNpZ25lZCBpbnQgc2Vzc2lvbl9zaXplID08YnI+DQotwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqBydGVfY3J5cHRvZGV2X3N5bV9nZXRfcHJpdmF0ZV9zZXNzaW9uX3NpemUoZGV2X2lk KTs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBydGVfY3J5cHRvZGV2X3N5bV9nZXRfcHJp dmF0ZV9zZXNzaW9uX3NpemUodHNfcGFyYW1zLSZndDtkZXZfaWQpOzxicj4NCjxicj4NCsKgI2lm ZGVmIFJURV9MSUJfU0VDVVJJVFk8YnI+DQrCoCDCoCDCoCDCoCB1bnNpZ25lZCBpbnQgc2VjdXJp dHlfc2Vzc2lvbl9zaXplID0gcnRlX3NlY3VyaXR5X3Nlc3Npb25fZ2V0X3NpemUoPGJyPg0KLcKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcnRlX2NyeXB0b2Rldl9nZXRfc2VjX2N0 eChkZXZfaWQpKTs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBydGVf Y3J5cHRvZGV2X2dldF9zZWNfY3R4KHRzX3BhcmFtcy0mZ3Q7ZGV2X2lkKSk7PGJyPg0KPGJyPg0K wqAgwqAgwqAgwqAgaWYgKHNlc3Npb25fc2l6ZSAmbHQ7IHNlY3VyaXR5X3Nlc3Npb25fc2l6ZSk8 YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBzZXNzaW9uX3NpemUgPSBzZWN1cml0eV9zZXNz aW9uX3NpemU7PGJyPg0KQEAgLTY1NCw4ICs2NjEsOCBAQCB0ZXN0c3VpdGVfc2V0dXAodm9pZCk8 YnI+DQrCoCDCoCDCoCDCoCAvKjxicj4NCsKgIMKgIMKgIMKgIMKgKiBDcmVhdGUgbWVtcG9vbCB3 aXRoIG1heGltdW0gbnVtYmVyIG9mIHNlc3Npb25zLjxicj4NCsKgIMKgIMKgIMKgIMKgKi88YnI+ DQotwqAgwqAgwqAgwqBpZiAoaW5mby5zeW0ubWF4X25iX3Nlc3Npb25zICE9IDAgJmFtcDsmYW1w Ozxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGluZm8uc3ltLm1heF9u Yl9zZXNzaW9ucyAmbHQ7IE1BWF9OQl9TRVNTSU9OUykgezxicj4NCivCoCDCoCDCoCDCoGlmICh0 c19wYXJhbXMtJmd0O2Rldl9pbmZvLnN5bS5tYXhfbmJfc2Vzc2lvbnMgIT0gMCAmYW1wOyZhbXA7 PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdHNfcGFyYW1zLSZndDtk ZXZfaW5mby5zeW0ubWF4X25iX3Nlc3Npb25zICZsdDsgTUFYX05CX1NFU1NJT05TKSB7PGJyPg0K wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgUlRFX0xPRyhFUlIsIFVTRVIxLCAmcXVvdDtEZXZpY2Ug ZG9lcyBub3Qgc3VwcG9ydCAmcXVvdDs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCAmcXVvdDthdCBsZWFzdCAldSBzZXNzaW9uc1xuJnF1b3Q7LDxi cj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIE1BWF9O Ql9TRVNTSU9OUyk7PGJyPg0KQEAgLTY2OCwyMiArNjc1LDMwIEBAIHRlc3RzdWl0ZV9zZXR1cCh2 b2lkKTxicj4NCsKgIMKgIMKgIMKgIFRFU1RfQVNTRVJUX05PVF9OVUxMKHRzX3BhcmFtcy0mZ3Q7 c2Vzc2lvbl9tcG9vbCw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAm cXVvdDtzZXNzaW9uIG1lbXBvb2wgYWxsb2NhdGlvbiBmYWlsZWQmcXVvdDspOzxicj4NCjxicj4N Ci3CoCDCoCDCoCDCoFRFU1RfQVNTRVJUX1NVQ0NFU1MocnRlX2NyeXB0b2Rldl9jb25maWd1cmUo ZGV2X2lkLDxicj4NCivCoCDCoCDCoCDCoFRFU1RfQVNTRVJUX1NVQ0NFU1MocnRlX2NyeXB0b2Rl dl9jb25maWd1cmUodHNfcGFyYW1zLSZndDtkZXZfaWQsPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgJmFtcDt0c19wYXJhbXMtJmd0O2NvbmYpLDxicj4NCsKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICZxdW90O0ZhaWxlZCB0byBjb25maWd1cmUgY3J5 cHRvZGV2ICV1IHdpdGggJXUgcXBzJnF1b3Q7LDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoGRldl9pZCwgdHNfcGFyYW1zLSZndDtjb25mLm5iX3F1ZXVlX3BhaXJzKTs8 YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0c19wYXJhbXMtJmd0O2Rl dl9pZCwgdHNfcGFyYW1zLSZndDtjb25mLm5iX3F1ZXVlX3BhaXJzKTs8YnI+DQo8YnI+DQrCoCDC oCDCoCDCoCB0c19wYXJhbXMtJmd0O3FwX2NvbmYubmJfZGVzY3JpcHRvcnMgPSBNQVhfTlVNX09Q U19JTkZMSUdIVDs8YnI+DQrCoCDCoCDCoCDCoCB0c19wYXJhbXMtJmd0O3FwX2NvbmYubXBfc2Vz c2lvbiA9IHRzX3BhcmFtcy0mZ3Q7c2Vzc2lvbl9tcG9vbDs8YnI+DQo8YnI+DQotwqAgwqAgwqAg wqBmb3IgKHFwX2lkID0gMDsgcXBfaWQgJmx0OyBpbmZvLm1heF9uYl9xdWV1ZV9wYWlyczsgcXBf aWQrKykgezxicj4NCivCoCDCoCDCoCDCoGZvciAocXBfaWQgPSAwOyBxcF9pZCAmbHQ7IHRzX3Bh cmFtcy0mZ3Q7ZGV2X2luZm8ubWF4X25iX3F1ZXVlX3BhaXJzOyBxcF9pZCsrKSB7PGJyPg0KwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgVEVTVF9BU1NFUlRfU1VDQ0VTUyhydGVfY3J5cHRvZGV2X3F1 ZXVlX3BhaXJfc2V0dXAoPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg ZGV2X2lkLCBxcF9pZCwgJmFtcDt0c19wYXJhbXMtJmd0O3FwX2NvbmYsPGJyPg0KLcKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcnRlX2NyeXB0b2Rldl9zb2NrZXRfaWQoZGV2X2lk KSksPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdHNfcGFyYW1zLSZn dDtkZXZfaWQsIHFwX2lkLCAmYW1wO3RzX3BhcmFtcy0mZ3Q7cXBfY29uZiw8YnI+DQorwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBydGVfY3J5cHRvZGV2X3NvY2tldF9pZCh0c19w YXJhbXMtJmd0O2Rldl9pZCkpLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgICZxdW90O0ZhaWxlZCB0byBzZXR1cCBxdWV1ZSBwYWlyICV1IG9uIGNyeXB0b2RldiAldSZx dW90Oyw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBxcF9pZCwgZGV2 X2lkKTs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBxcF9pZCwgdHNf cGFyYW1zLSZndDtkZXZfaWQpOzxicj4NCsKgIMKgIMKgIMKgIH08YnI+DQo8YnI+DQorwqAgwqAg wqAgwqBydGVfY3J5cHRvZGV2X3N0YXRzX3Jlc2V0KHRzX3BhcmFtcy0mZ3Q7ZGV2X2lkKTs8YnI+ DQorPGJyPg0KK8KgIMKgIMKgIMKgLyogU3RhcnQgdGhlIGRldmljZSAqLzxicj4NCivCoCDCoCDC oCDCoFRFU1RfQVNTRVJUX1NVQ0NFU1MocnRlX2NyeXB0b2Rldl9zdGFydCh0c19wYXJhbXMtJmd0 O2Rldl9pZCksPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJnF1b3Q7 RmFpbGVkIHRvIHN0YXJ0IGNyeXB0b2RldiAldSZxdW90Oyw8YnI+DQorwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqB0c19wYXJhbXMtJmd0O2Rldl9pZCk7PGJyPg0KKzxicj4NCis8 YnI+DQrCoCDCoCDCoCDCoCByZXR1cm4gVEVTVF9TVUNDRVNTOzxicj4NCsKgfTxicj4NCjxicj4N CkBAIC03MDgsNDMyICs3MjMsNDQwIEBAIHRlc3RzdWl0ZV90ZWFyZG93bih2b2lkKTxicj4NCsKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIHRzX3BhcmFtcy0mZ3Q7c2Vzc2lvbl9tcG9vbCA9IE5VTEw7 PGJyPg0KwqAgwqAgwqAgwqAgfTxicj4NCjxicj4NCivCoCDCoCDCoCDCoHJ0ZV9jcnlwdG9kZXZf c3RvcCh0c19wYXJhbXMtJmd0O3ZhbGlkX2RldnNbMF0pOzxicj4NCsKgIMKgIMKgIMKgIHJlcyA9 IHJ0ZV9jcnlwdG9kZXZfY2xvc2UodHNfcGFyYW1zLSZndDt2YWxpZF9kZXZzWzBdKTs8YnI+DQrC oCDCoCDCoCDCoCBpZiAocmVzKTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIFJURV9MT0co RVJSLCBVU0VSMSwgJnF1b3Q7Q3J5cHRvIGRldmljZSBjbG9zZSBlcnJvciAlZFxuJnF1b3Q7LCBy ZXMpOzxicj4NCsKgfTxicj4NCjxicj4NCsKgc3RhdGljIGludDxicj4NCi1jaGVja19jYXBhYmls aXRpZXNfc3VwcG9ydGVkKGVudW0gcnRlX2NyeXB0b19zeW1feGZvcm1fdHlwZSB0eXBlLDxicj4N Ci3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGNvbnN0IGludCAqYWxncywgdWludDE2X3QgbnVtX2Fs Z3MpPGJyPg0KK2Rldl9jb25maWd1cmVfYW5kX3N0YXJ0KHVpbnQ2NF90IGZmX2Rpc2FibGUpPGJy Pg0KwqB7PGJyPg0KLcKgIMKgIMKgIMKgdWludDhfdCBkZXZfaWQgPSB0ZXN0c3VpdGVfcGFyYW1z LnZhbGlkX2RldnNbMF07PGJyPg0KLcKgIMKgIMKgIMKgYm9vbCBzb21lX2FsZ19zdXBwb3J0ZWQg PSBGQUxTRTs8YnI+DQotwqAgwqAgwqAgwqB1aW50MTZfdCBpOzxicj4NCivCoCDCoCDCoCDCoHN0 cnVjdCBjcnlwdG9fdGVzdHN1aXRlX3BhcmFtcyAqdHNfcGFyYW1zID0gJmFtcDt0ZXN0c3VpdGVf cGFyYW1zOzxicj4NCivCoCDCoCDCoCDCoHN0cnVjdCBjcnlwdG9fdW5pdHRlc3RfcGFyYW1zICp1 dF9wYXJhbXMgPSAmYW1wO3VuaXR0ZXN0X3BhcmFtczs8YnI+DQo8YnI+DQotwqAgwqAgwqAgwqBm b3IgKGkgPSAwOyBpICZsdDsgbnVtX2FsZ3MgJmFtcDsmYW1wOyAhc29tZV9hbGdfc3VwcG9ydGVk OyBpKyspIHs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBzdHJ1Y3QgcnRlX2NyeXB0b2Rl dl9zeW1fY2FwYWJpbGl0eV9pZHggYWxnID0gezxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoHR5cGUsIHthbGdzW2ldfTxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDC oH07PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKHJ0ZV9jcnlwdG9kZXZfc3ltX2Nh cGFiaWxpdHlfZ2V0KGRldl9pZCw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAmYW1wO2FsZykgIT0gTlVMTCk8YnI+DQotwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBzb21lX2FsZ19zdXBwb3J0ZWQgPSBUUlVFOzxicj4NCivCoCDC oCDCoCDCoHVpbnQxNl90IHFwX2lkOzxicj4NCis8YnI+DQorwqAgwqAgwqAgwqAvKiBDbGVhciB1 bml0IHRlc3QgcGFyYW1ldGVycyBiZWZvcmUgcnVubmluZyB0ZXN0ICovPGJyPg0KK8KgIMKgIMKg IMKgbWVtc2V0KHV0X3BhcmFtcywgMCwgc2l6ZW9mKCp1dF9wYXJhbXMpKTs8YnI+DQorPGJyPg0K K8KgIMKgIMKgIMKgLyogUmVjb25maWd1cmUgZGV2aWNlIHRvIGRlZmF1bHQgcGFyYW1ldGVycyAq Lzxicj4NCivCoCDCoCDCoCDCoHRzX3BhcmFtcy0mZ3Q7Y29uZi5zb2NrZXRfaWQgPSBTT0NLRVRf SURfQU5ZOzxicj4NCivCoCDCoCDCoCDCoHRzX3BhcmFtcy0mZ3Q7Y29uZi5mZl9kaXNhYmxlID0g ZmZfZGlzYWJsZTs8YnI+DQorwqAgwqAgwqAgwqB0c19wYXJhbXMtJmd0O3FwX2NvbmYubmJfZGVz Y3JpcHRvcnMgPSBNQVhfTlVNX09QU19JTkZMSUdIVDs8YnI+DQorwqAgwqAgwqAgwqB0c19wYXJh bXMtJmd0O3FwX2NvbmYubXBfc2Vzc2lvbiA9IHRzX3BhcmFtcy0mZ3Q7c2Vzc2lvbl9tcG9vbDs8 YnI+DQorPGJyPg0KK8KgIMKgIMKgIMKgVEVTVF9BU1NFUlRfU1VDQ0VTUyhydGVfY3J5cHRvZGV2 X2NvbmZpZ3VyZSh0c19wYXJhbXMtJmd0O3ZhbGlkX2RldnNbMF0sPGJyPg0KK8KgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJmFtcDt0c19wYXJhbXMtJmd0O2NvbmYpLDxicj4NCivC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZxdW90O0ZhaWxlZCB0byBjb25maWd1 cmUgY3J5cHRvZGV2ICV1JnF1b3Q7LDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoHRzX3BhcmFtcy0mZ3Q7dmFsaWRfZGV2c1swXSk7PGJyPg0KKzxicj4NCivCoCDCoCDC oCDCoGZvciAocXBfaWQgPSAwOyBxcF9pZCAmbHQ7IHRzX3BhcmFtcy0mZ3Q7Y29uZi5uYl9xdWV1 ZV9wYWlycyA7IHFwX2lkKyspIHs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBURVNUX0FT U0VSVF9TVUNDRVNTKHJ0ZV9jcnlwdG9kZXZfcXVldWVfcGFpcl9zZXR1cCg8YnI+DQorwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0c19wYXJhbXMtJmd0O3ZhbGlkX2RldnNbMF0s IHFwX2lkLDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZhbXA7dHNf cGFyYW1zLSZndDtxcF9jb25mLDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoHJ0ZV9jcnlwdG9kZXZfc29ja2V0X2lkKHRzX3BhcmFtcy0mZ3Q7dmFsaWRfZGV2c1swXSkp LDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZxdW90O0ZhaWxlZCB0 byBzZXR1cCBxdWV1ZSBwYWlyICV1IG9uIGNyeXB0b2RldiAldSZxdW90Oyw8YnI+DQorwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBxcF9pZCwgdHNfcGFyYW1zLSZndDt2YWxpZF9k ZXZzWzBdKTs8YnI+DQrCoCDCoCDCoCDCoCB9PGJyPg0KLcKgIMKgIMKgIMKgaWYgKCFzb21lX2Fs Z19zdXBwb3J0ZWQpPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcmV0dXJuIFRFU1RfU0tJ UFBFRDs8YnI+DQo8YnI+DQotwqAgwqAgwqAgwqByZXR1cm4gMDs8YnI+DQotfTxicj4NCivCoCDC oCDCoCDCoHJ0ZV9jcnlwdG9kZXZfc3RhdHNfcmVzZXQodHNfcGFyYW1zLSZndDt2YWxpZF9kZXZz WzBdKTs8YnI+DQo8YnI+DQotaW50PGJyPg0KLWNoZWNrX2NpcGhlcl9jYXBhYmlsaXRpZXNfc3Vw cG9ydGVkKGNvbnN0IGVudW0gcnRlX2NyeXB0b19jaXBoZXJfYWxnb3JpdGhtICpjaXBoZXJzLDxi cj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHVpbnQxNl90IG51bV9jaXBoZXJzKTxicj4NCi17 PGJyPg0KLcKgIMKgIMKgIMKgcmV0dXJuIGNoZWNrX2NhcGFiaWxpdGllc19zdXBwb3J0ZWQoUlRF X0NSWVBUT19TWU1fWEZPUk1fQ0lQSEVSLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoChjb25zdCBpbnQgKikgY2lwaGVycywgbnVtX2NpcGhlcnMpOzxicj4NCivCoCDC oCDCoCDCoC8qIFN0YXJ0IHRoZSBkZXZpY2UgKi88YnI+DQorwqAgwqAgwqAgwqBURVNUX0FTU0VS VF9TVUNDRVNTKHJ0ZV9jcnlwdG9kZXZfc3RhcnQodHNfcGFyYW1zLSZndDt2YWxpZF9kZXZzWzBd KSw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmcXVvdDtGYWlsZWQg dG8gc3RhcnQgY3J5cHRvZGV2ICV1JnF1b3Q7LDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoHRzX3BhcmFtcy0mZ3Q7dmFsaWRfZGV2c1swXSk7PGJyPg0KKzxicj4NCivC oCDCoCDCoCDCoC8qIEdlbmVyYXRlIENyeXB0byBvcCBkYXRhIHN0cnVjdHVyZSAqLzxicj4NCivC oCDCoCDCoCDCoHV0X3BhcmFtcy0mZ3Q7b3AgPSBydGVfY3J5cHRvX29wX2FsbG9jKHRzX3BhcmFt cy0mZ3Q7b3BfbXBvb2wsPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg UlRFX0NSWVBUT19PUF9UWVBFX1NZTU1FVFJJQyk7PGJyPg0KK8KgIMKgIMKgIMKgVEVTVF9BU1NF UlRfTk9UX05VTEwodXRfcGFyYW1zLSZndDtvcCw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAmcXVvdDtGYWlsZWQgdG8gYWxsb2NhdGUgc3ltbWV0cmljIGNyeXB0byBv cGVyYXRpb24gc3RydWN0JnF1b3Q7KTs8YnI+DQorPGJyPg0KK8KgIMKgIMKgIMKgcmV0dXJuIFRF U1RfU1VDQ0VTUzs8YnI+DQrCoH08YnI+DQo8YnI+DQotaW50PGJyPg0KLWNoZWNrX2F1dGhfY2Fw YWJpbGl0aWVzX3N1cHBvcnRlZChjb25zdCBlbnVtIHJ0ZV9jcnlwdG9fYXV0aF9hbGdvcml0aG0g KmF1dGhzLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHVpbnQxNl90IG51bV9hdXRocyk8 YnI+DQorLyo8YnI+DQorICogQ29uZmlndXJlIGFuZCBzdGFydCB0aGUgZGV2aWNlLCBjb25maWd1 cmUgc2luZ2xlIChmaXJzdCkgcXVldWUgcGFpcjxicj4NCisgKi88YnI+DQorc3RhdGljIGludDxi cj4NCitkZXZfc3RhcnQodm9pZCk8YnI+DQrCoHs8YnI+DQotwqAgwqAgwqAgwqByZXR1cm4gY2hl Y2tfY2FwYWJpbGl0aWVzX3N1cHBvcnRlZChSVEVfQ1JZUFRPX1NZTV9YRk9STV9BVVRILDxicj4N Ci3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoChjb25zdCBpbnQgKikgYXV0aHMs IG51bV9hdXRocyk7PGJyPg0KK8KgIMKgIMKgIMKgaW50IHFwX2lkID0gMDs8YnI+DQorwqAgwqAg wqAgwqBzdHJ1Y3QgcnRlX2NyeXB0b2Rldl9jb25maWcgY29uZiA9IHs8YnI+DQorwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAuc29ja2V0X2lkID0gU09DS0VUX0lEX0FOWSw8YnI+DQorwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAubmJfcXVldWVfcGFpcnMgPSAxLDxicj4NCivCoCDCoCDCoCDCoH07PGJy Pg0KK8KgIMKgIMKgIMKgY29uc3Qgc3RydWN0IHJ0ZV9jcnlwdG9kZXZfcXBfY29uZiBxcF9jb25m ID0gezxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoC5uYl9kZXNjcmlwdG9ycyA9IE1BWF9O VU1fT1BTX0lORkxJR0hULDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoC5tcF9zZXNzaW9u ID0gcF90c19wYXJhbXMtJmd0O3Nlc3Npb25fbXBvb2w8YnI+DQorwqAgwqAgwqAgwqB9Ozxicj4N Cis8YnI+DQorwqAgwqAgwqAgwqBURVNUX0FTU0VSVF9TVUNDRVNTKDxicj4NCivCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoHJ0ZV9jcnlwdG9kZXZfY29uZmlndXJlKDxicj4NCivCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoHBfdHNfcGFyYW1zLSZndDtkZXZfaWQsICZhbXA7Y29uZjxi cj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCksPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKg IMKgJnF1b3Q7RmFpbGVkIHRvIGNvbmZpZ3VyZSBjcnlwdG9kZXYgJXUmcXVvdDssPGJyPg0KK8Kg IMKgIMKgIMKgIMKgIMKgIMKgIMKgcF90c19wYXJhbXMtJmd0O2Rldl9pZDxicj4NCivCoCDCoCDC oCDCoCk7PGJyPg0KK8KgIMKgIMKgIMKgVEVTVF9BU1NFUlRfU1VDQ0VTUyg8YnI+DQorwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqBydGVfY3J5cHRvZGV2X3F1ZXVlX3BhaXJfc2V0dXAoPGJyPg0KK8Kg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcF90c19wYXJhbXMtJmd0O2Rldl9pZCwg cXBfaWQsICZhbXA7cXBfY29uZiw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqBydGVfY3J5cHRvZGV2X3NvY2tldF9pZChwX3RzX3BhcmFtcy0mZ3Q7ZGV2X2lkKTxicj4N CivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCksPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKg JnF1b3Q7RmFpbGVkIHRvIHNldHVwIHF1ZXVlIHBhaXIgJXUgb24gY3J5cHRvZGV2ICV1JnF1b3Q7 LDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHFwX2lkLCBwX3RzX3BhcmFtcy0mZ3Q7ZGV2 X2lkPGJyPg0KK8KgIMKgIMKgIMKgKTs8YnI+DQorwqAgwqAgwqAgwqBydGVfY3J5cHRvZGV2X3N0 YXRzX3Jlc2V0KHBfdHNfcGFyYW1zLSZndDtkZXZfaWQpOzxicj4NCivCoCDCoCDCoCDCoFRFU1Rf QVNTRVJUX1NVQ0NFU1MoPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcnRlX2NyeXB0b2Rl dl9zdGFydCg8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBwX3RzX3Bh cmFtcy0mZ3Q7ZGV2X2lkPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgKSw8YnI+DQorwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAmcXVvdDtGYWlsZWQgdG8gc3RhcnQgY3J5cHRvZGV2ICV1JnF1 b3Q7LDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHBfdHNfcGFyYW1zLSZndDtkZXZfaWQ8 YnI+DQorwqAgwqAgwqAgwqApOzxicj4NCis8YnI+DQorwqAgwqAgwqAgwqByZXR1cm4gMDs8YnI+ DQrCoH08YnI+DQo8YnI+DQotaW50PGJyPg0KLWNoZWNrX2FlYWRfY2FwYWJpbGl0aWVzX3N1cHBv cnRlZChjb25zdCBlbnVtIHJ0ZV9jcnlwdG9fYWVhZF9hbGdvcml0aG0gKmFlYWRzLDxicj4NCi3C oCDCoCDCoCDCoCDCoCDCoCDCoCDCoHVpbnQxNl90IG51bV9hZWFkcyk8YnI+DQorc3RhdGljIHZv aWQ8YnI+DQorZGV2X3N0b3Aodm9pZCk8YnI+DQrCoHs8YnI+DQotwqAgwqAgwqAgwqByZXR1cm4g Y2hlY2tfY2FwYWJpbGl0aWVzX3N1cHBvcnRlZChSVEVfQ1JZUFRPX1NZTV9YRk9STV9BRUFELDxi cj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoChjb25zdCBpbnQgKikgYWVh ZHMsIG51bV9hZWFkcyk7PGJyPg0KK8KgIMKgIMKgIMKgcnRlX2NyeXB0b2Rldl9zdG9wKHBfdHNf cGFyYW1zLSZndDtkZXZfaWQpOzxicj4NCsKgfTxicj4NCjxicj4NCisvKjxicj4NCisgKiBJbmRp dmlkdWFsIHRlc3RzdWl0ZXMgc2V0dXAvdGVhcmRvd24gZnVuY3Rpb25zIGJlbG93PGJyPg0KKyAq Lzxicj4NCis8YnI+DQrCoHN0YXRpYyBpbnQ8YnI+DQotbnVsbF90ZXN0c3VpdGVfc2V0dXAodm9p ZCk8YnI+DQordHNfc2V0dXBfYWVzX2djbSh2b2lkKTxicj4NCsKgezxicj4NCi3CoCDCoCDCoCDC oHN0cnVjdCBjcnlwdG9fdGVzdHN1aXRlX3BhcmFtcyAqdHNfcGFyYW1zID0gJmFtcDt0ZXN0c3Vp dGVfcGFyYW1zOzxicj4NCi3CoCDCoCDCoCDCoHVpbnQ4X3QgZGV2X2lkID0gdHNfcGFyYW1zLSZn dDt2YWxpZF9kZXZzWzBdOzxicj4NCi3CoCDCoCDCoCDCoHN0cnVjdCBydGVfY3J5cHRvZGV2X2lu Zm8gZGV2X2luZm87PGJyPg0KLcKgIMKgIMKgIMKgY29uc3QgZW51bSBydGVfY3J5cHRvX2NpcGhl cl9hbGdvcml0aG0gY2lwaGVyc1tdID0gezxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFJU RV9DUllQVE9fQ0lQSEVSX05VTEw8YnI+DQotwqAgwqAgwqAgwqB9Ozxicj4NCi3CoCDCoCDCoCDC oGNvbnN0IGVudW0gcnRlX2NyeXB0b19hdXRoX2FsZ29yaXRobSBhdXRoc1tdID0gezxicj4NCi3C oCDCoCDCoCDCoCDCoCDCoCDCoCDCoFJURV9DUllQVE9fQVVUSF9OVUxMPGJyPg0KK8KgIMKgIMKg IMKgY29uc3QgZW51bSBydGVfY3J5cHRvX2FlYWRfYWxnb3JpdGhtIGFlYWRzW10gPSB7PGJyPg0K K8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgUlRFX0NSWVBUT19BRUFEX0FFU19HQ008YnI+DQrCoCDC oCDCoCDCoCB9Ozxicj4NCjxicj4NCi3CoCDCoCDCoCDCoHJ0ZV9jcnlwdG9kZXZfaW5mb19nZXQo ZGV2X2lkLCAmYW1wO2Rldl9pbmZvKTs8YnI+DQotPGJyPg0KLcKgIMKgIMKgIMKgaWYgKCEoZGV2 X2luZm8uZmVhdHVyZV9mbGFncyAmYW1wOyBSVEVfQ1JZUFRPREVWX0ZGX1NZTU1FVFJJQ19DUllQ VE8pKSB7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgUlRFX0xPRyhJTkZPLCBVU0VSMSwg JnF1b3Q7RmVhdHVyZSBmbGFnIHJlcXVpcmVtZW50cyBmb3IgTlVMTCAmcXVvdDs8YnI+DQotwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmcXVvdDt0ZXN0c3Vp dGUgbm90IG1ldFxuJnF1b3Q7KTs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqByZXR1cm4g VEVTVF9TS0lQUEVEOzxicj4NCi3CoCDCoCDCoCDCoH08YnI+DQotPGJyPg0KLcKgIMKgIMKgIMKg aWYgKGNoZWNrX2NpcGhlcl9jYXBhYmlsaXRpZXNfc3VwcG9ydGVkKGNpcGhlcnMsIFJURV9ESU0o Y2lwaGVycykpICE9IDA8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAm YW1wOyZhbXA7IGNoZWNrX2F1dGhfY2FwYWJpbGl0aWVzX3N1cHBvcnRlZChhdXRocyw8YnI+DQot wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBSVEVfRElNKGF1dGhzKSkgIT0gMCkg ezxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFJURV9MT0coSU5GTywgVVNFUjEsICZxdW90 O0NhcGFiaWxpdHkgcmVxdWlyZW1lbnRzIGZvciBOVUxMICZxdW90Ozxicj4NCivCoCDCoCDCoCDC oGlmIChjaGVja19hZWFkX2NhcGFiaWxpdGllc19zdXBwb3J0ZWQoYWVhZHMsIFJURV9ESU0oYWVh ZHMpKSAhPSAwKSB7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgUlRFX0xPRyhJTkZPLCBV U0VSMSwgJnF1b3Q7Q2FwYWJpbGl0eSByZXF1aXJlbWVudHMgZm9yIEFFUyBHQ00gJnF1b3Q7PGJy Pg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgJnF1b3Q7 dGVzdHN1aXRlIG5vdCBtZXRcbiZxdW90Oyk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg cmV0dXJuIFRFU1RfU0tJUFBFRDs8YnI+DQrCoCDCoCDCoCDCoCB9PGJyPg0KK8KgIMKgIMKgIMKg VEVTVF9BU1NFUlRfU1VDQ0VTUyhkZXZfc3RhcnQoKSwgJnF1b3Q7RmFpbGVkIHRvIHN0YXJ0IHRo ZSBkZXZpY2UmcXVvdDspOzxicj4NCjxicj4NCsKgIMKgIMKgIMKgIHJldHVybiAwOzxicj4NCsKg fTxicj4NCjxicj4NCsKgc3RhdGljIGludDxicj4NCi1jcnlwdG9fZ2VuX3Rlc3RzdWl0ZV9zZXR1 cCh2b2lkKTxicj4NCit0c19zZXR1cF9hZXNfY2NtKHZvaWQpPGJyPg0KwqB7PGJyPg0KLcKgIMKg IMKgIMKgc3RydWN0IGNyeXB0b190ZXN0c3VpdGVfcGFyYW1zICp0c19wYXJhbXMgPSAmYW1wO3Rl c3RzdWl0ZV9wYXJhbXM7PGJyPg0KLcKgIMKgIMKgIMKgdWludDhfdCBkZXZfaWQgPSB0c19wYXJh bXMtJmd0O3ZhbGlkX2RldnNbMF07PGJyPg0KLcKgIMKgIMKgIMKgc3RydWN0IHJ0ZV9jcnlwdG9k ZXZfaW5mbyBkZXZfaW5mbzs8YnI+DQorwqAgwqAgwqAgwqBjb25zdCBlbnVtIHJ0ZV9jcnlwdG9f YWVhZF9hbGdvcml0aG0gYWVhZHNbXSA9IHs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBS VEVfQ1JZUFRPX0FFQURfQUVTX0NDTTxicj4NCivCoCDCoCDCoCDCoH07PGJyPg0KPGJyPg0KLcKg IMKgIMKgIMKgcnRlX2NyeXB0b2Rldl9pbmZvX2dldChkZXZfaWQsICZhbXA7ZGV2X2luZm8pOzxi cj4NCivCoCDCoCDCoCDCoGlmICghKHBfdHNfcGFyYW1zLSZndDtkZXZfaW5mby5mZWF0dXJlX2Zs YWdzICZhbXA7IFJURV9DUllQVE9ERVZfRkZfU1lNTUVUUklDX0NSWVBUTykgfHw8YnI+DQorwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAoKGdsb2JhbF9hcGlfdGVzdF90eXBlID09 IENSWVBUT0RFVl9SQVdfQVBJX1RFU1QpICZhbXA7JmFtcDs8YnI+DQorwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAhKHBfdHNfcGFyYW1zLSZndDtkZXZfaW5mby5mZWF0dXJlX2Zs YWdzICZhbXA7IFJURV9DUllQVE9ERVZfRkZfU1lNX1JBV19EUCkpKSB7PGJyPg0KK8KgIMKgIMKg IMKgIMKgIMKgIMKgIMKgUlRFX0xPRyhJTkZPLCBVU0VSMSwgJnF1b3Q7RmVhdHVyZSBmbGFnIHJl cXVpcmVtZW50cyBmb3IgQUVTIENDTSAmcXVvdDs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmcXVvdDt0ZXN0c3VpdGUgbm90IG1ldFxuJnF1b3Q7 KTs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqByZXR1cm4gVEVTVF9TS0lQUEVEOzxicj4N CivCoCDCoCDCoCDCoH08YnI+DQo8YnI+DQotwqAgwqAgwqAgwqBpZiAoIShkZXZfaW5mby5mZWF0 dXJlX2ZsYWdzICZhbXA7IFJURV9DUllQVE9ERVZfRkZfU1lNTUVUUklDX0NSWVBUTykpIHs8YnI+ DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBSVEVfTE9HKElORk8sIFVTRVIxLCAmcXVvdDtGZWF0 dXJlIGZsYWcgcmVxdWlyZW1lbnRzIGZvciBDcnlwdG8gR2VuICZxdW90Ozxicj4NCivCoCDCoCDC oCDCoGlmIChjaGVja19hZWFkX2NhcGFiaWxpdGllc19zdXBwb3J0ZWQoYWVhZHMsIFJURV9ESU0o YWVhZHMpKSAhPSAwKSB7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgUlRFX0xPRyhJTkZP LCBVU0VSMSwgJnF1b3Q7Q2FwYWJpbGl0eSByZXF1aXJlbWVudHMgZm9yIEFFUyBDQ00gJnF1b3Q7 PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgJnF1 b3Q7dGVzdHN1aXRlIG5vdCBtZXRcbiZxdW90Oyk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgcmV0dXJuIFRFU1RfU0tJUFBFRDs8YnI+DQrCoCDCoCDCoCDCoCB9PGJyPg0KK8KgIMKgIMKg IMKgVEVTVF9BU1NFUlRfU1VDQ0VTUyhkZXZfc3RhcnQoKSwgJnF1b3Q7RmFpbGVkIHRvIHN0YXJ0 IHRoZSBkZXZpY2UmcXVvdDspOzxicj4NCjxicj4NCsKgIMKgIMKgIMKgIHJldHVybiAwOzxicj4N CsKgfTxicj4NCjxicj4NCi0jaWZkZWYgUlRFX0xJQl9TRUNVUklUWTxicj4NCsKgc3RhdGljIGlu dDxicj4NCi1zZWNfcHJvdG9fdGVzdHN1aXRlX3NldHVwKGVudW0gcnRlX3NlY3VyaXR5X3Nlc3Np b25fcHJvdG9jb2wgcHJvdG9jb2wpPGJyPg0KK3RzX3NldHVwX2Flc19nbWFjKHZvaWQpPGJyPg0K wqB7PGJyPg0KLcKgIMKgIMKgIMKgc3RydWN0IGNyeXB0b190ZXN0c3VpdGVfcGFyYW1zICp0c19w YXJhbXMgPSAmYW1wO3Rlc3RzdWl0ZV9wYXJhbXM7PGJyPg0KLcKgIMKgIMKgIMKgc3RydWN0IGNy eXB0b191bml0dGVzdF9wYXJhbXMgKnV0X3BhcmFtcyA9ICZhbXA7dW5pdHRlc3RfcGFyYW1zOzxi cj4NCi3CoCDCoCDCoCDCoHN0cnVjdCBydGVfY3J5cHRvZGV2X2luZm8gZGV2X2luZm87PGJyPg0K LcKgIMKgIMKgIMKgaW50IHJldCA9IDA7PGJyPg0KLTxicj4NCi3CoCDCoCDCoCDCoHJ0ZV9jcnlw dG9kZXZfaW5mb19nZXQodHNfcGFyYW1zLSZndDt2YWxpZF9kZXZzWzBdLCAmYW1wO2Rldl9pbmZv KTs8YnI+DQorwqAgwqAgwqAgwqBjb25zdCBlbnVtIHJ0ZV9jcnlwdG9fYXV0aF9hbGdvcml0aG0g YXV0aHNbXSA9IHs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBSVEVfQ1JZUFRPX0FVVEhf QUVTX0dNQUM8YnI+DQorwqAgwqAgwqAgwqB9Ozxicj4NCjxicj4NCi3CoCDCoCDCoCDCoGlmICgh KGRldl9pbmZvLmZlYXR1cmVfZmxhZ3MgJmFtcDsgUlRFX0NSWVBUT0RFVl9GRl9TRUNVUklUWSkp IHs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBSVEVfTE9HKElORk8sIFVTRVIxLDxicj4N Ci3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZxdW90O0ZlYXR1cmUgZmxhZyBy ZXF1aXJlbWVudHMgZm9yIHNlY3VyaXR5IHByb3RvY29sIHRlc3RzdWl0ZSBub3QgbWV0XG4mcXVv dDspOzxicj4NCivCoCDCoCDCoCDCoGlmICghKHBfdHNfcGFyYW1zLSZndDtkZXZfaW5mby5mZWF0 dXJlX2ZsYWdzICZhbXA7IFJURV9DUllQVE9ERVZfRkZfU1lNTUVUUklDX0NSWVBUTykgfHw8YnI+ DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAoKGdsb2JhbF9hcGlfdGVzdF90 eXBlID09IENSWVBUT0RFVl9SQVdfQVBJX1RFU1QpICZhbXA7JmFtcDs8YnI+DQorwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAhKHBfdHNfcGFyYW1zLSZndDtkZXZfaW5mby5mZWF0 dXJlX2ZsYWdzICZhbXA7IFJURV9DUllQVE9ERVZfRkZfU1lNX1JBV19EUCkpKSB7PGJyPg0KK8Kg IMKgIMKgIMKgIMKgIMKgIMKgIMKgUlRFX0xPRyhJTkZPLCBVU0VSMSwgJnF1b3Q7RmVhdHVyZSBm bGFnIHJlcXVpcmVtZW50cyBmb3IgQUVTIEdNQUMgJnF1b3Q7PGJyPg0KK8KgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJnF1b3Q7dGVzdHN1aXRlIG5vdCBtZXRc biZxdW90Oyk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcmV0dXJuIFRFU1RfU0tJUFBF RDs8YnI+DQrCoCDCoCDCoCDCoCB9PGJyPg0KPGJyPg0KLcKgIMKgIMKgIMKgLyogUmVjb25maWd1 cmUgdG8gZW5hYmxlIHNlY3VyaXR5ICovPGJyPg0KLcKgIMKgIMKgIMKgcmV0ID0gZGV2X2NvbmZp Z3VyZV9hbmRfc3RhcnQoMCk7PGJyPg0KLcKgIMKgIMKgIMKgaWYgKHJldCAhPSBURVNUX1NVQ0NF U1MpPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcmV0dXJuIHJldDs8YnI+DQotPGJyPg0K LcKgIMKgIMKgIMKgLyogU2V0IGFjdGlvbiB0eXBlICovPGJyPg0KLcKgIMKgIMKgIMKgdXRfcGFy YW1zLSZndDt0eXBlID0gUlRFX1NFQ1VSSVRZX0FDVElPTl9UWVBFX0xPT0tBU0lERV9QUk9UT0NP TDs8YnI+DQotPGJyPg0KLcKgIMKgIMKgIMKgaWYgKHNlY3VyaXR5X3Byb3RvX3N1cHBvcnRlZChS VEVfU0VDVVJJVFlfQUNUSU9OX1RZUEVfTE9PS0FTSURFX1BST1RPQ09MLCBwcm90b2NvbCkgJmx0 OyAwKSB7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgUlRFX0xPRyhJTkZPLCBVU0VSMSw8 YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmcXVvdDtDYXBhYmlsaXR5 IHJlcXVpcmVtZW50cyBmb3Igc2VjdXJpdHkgcHJvdG9jb2wgdGVzdCBub3QgbWV0XG4mcXVvdDsp Ozxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJldCA9IFRFU1RfU0tJUFBFRDs8YnI+DQor wqAgwqAgwqAgwqBpZiAoY2hlY2tfYXV0aF9jYXBhYmlsaXRpZXNfc3VwcG9ydGVkKGF1dGhzLCBS VEVfRElNKGF1dGhzKSkgIT0gMCkgezxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFJURV9M T0coSU5GTywgVVNFUjEsICZxdW90O0NhcGFiaWxpdHkgcmVxdWlyZW1lbnRzIGZvciBBRVMgR01B QyAmcXVvdDs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAmcXVvdDt0ZXN0c3VpdGUgbm90IG1ldFxuJnF1b3Q7KTs8YnI+DQorwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqByZXR1cm4gVEVTVF9TS0lQUEVEOzxicj4NCsKgIMKgIMKgIMKgIH08YnI+DQor wqAgwqAgwqAgwqBURVNUX0FTU0VSVF9TVUNDRVNTKGRldl9zdGFydCgpLCAmcXVvdDtGYWlsZWQg dG8gc3RhcnQgdGhlIGRldmljZSZxdW90Oyk7PGJyPg0KPGJyPg0KLcKgIMKgIMKgIMKgdGVzdF9z ZWNfYWxnX2xpc3RfcG9wdWxhdGUoKTs8YnI+DQotwqAgwqAgwqAgwqB0ZXN0X3NlY19hdXRoX29u bHlfYWxnX2xpc3RfcG9wdWxhdGUoKTs8YnI+DQotPGJyPg0KLcKgIMKgIMKgIMKgLyo8YnI+DQot wqAgwqAgwqAgwqAgKiBTdG9wIHRoZSBkZXZpY2UuIERldmljZSB3b3VsZCBiZSBzdGFydGVkIGFn YWluIGJ5IGluZGl2aWR1YWwgdGVzdDxicj4NCi3CoCDCoCDCoCDCoCAqIGNhc2Ugc2V0dXAgcm91 dGluZS48YnI+DQotwqAgwqAgwqAgwqAgKi88YnI+DQotwqAgwqAgwqAgwqBydGVfY3J5cHRvZGV2 X3N0b3AodHNfcGFyYW1zLSZndDt2YWxpZF9kZXZzWzBdKTs8YnI+DQotPGJyPg0KLcKgIMKgIMKg IMKgcmV0dXJuIHJldDs8YnI+DQotfTxicj4NCi08YnI+DQotc3RhdGljIGludDxicj4NCi1pcHNl Y19wcm90b190ZXN0c3VpdGVfc2V0dXAodm9pZCk8YnI+DQotezxicj4NCi3CoCDCoCDCoCDCoHJl dHVybiBzZWNfcHJvdG9fdGVzdHN1aXRlX3NldHVwKFJURV9TRUNVUklUWV9QUk9UT0NPTF9JUFNF Qyk7PGJyPg0KLX08YnI+DQotPGJyPg0KLXN0YXRpYyBpbnQ8YnI+DQotdGxzX3JlY29yZF9wcm90 b190ZXN0c3VpdGVfc2V0dXAodm9pZCk8YnI+DQotezxicj4NCi3CoCDCoCDCoCDCoHRlc3Rfc2Vj X3Byb3RvX3BhdHRlcm5fZ2VuZXJhdGUoKTs8YnI+DQotPGJyPg0KLcKgIMKgIMKgIMKgcmV0dXJu IHNlY19wcm90b190ZXN0c3VpdGVfc2V0dXAoUlRFX1NFQ1VSSVRZX1BST1RPQ09MX1RMU19SRUNP UkQpOzxicj4NCivCoCDCoCDCoCDCoHJldHVybiAwOzxicj4NCsKgfTxicj4NCjxicj4NCsKgc3Rh dGljIGludDxicj4NCi1wZGNwX3Byb3RvX3Rlc3RzdWl0ZV9zZXR1cCh2b2lkKTxicj4NCit0c19z ZXR1cF9zbm93M2codm9pZCk8YnI+DQrCoHs8YnI+DQotwqAgwqAgwqAgwqBzdHJ1Y3QgY3J5cHRv X3Rlc3RzdWl0ZV9wYXJhbXMgKnRzX3BhcmFtcyA9ICZhbXA7dGVzdHN1aXRlX3BhcmFtczs8YnI+ DQotwqAgwqAgwqAgwqB1aW50OF90IGRldl9pZCA9IHRzX3BhcmFtcy0mZ3Q7dmFsaWRfZGV2c1sw XTs8YnI+DQotwqAgwqAgwqAgwqBzdHJ1Y3QgcnRlX2NyeXB0b2Rldl9pbmZvIGRldl9pbmZvOzxi cj4NCsKgIMKgIMKgIMKgIGNvbnN0IGVudW0gcnRlX2NyeXB0b19jaXBoZXJfYWxnb3JpdGhtIGNp cGhlcnNbXSA9IHs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBSVEVfQ1JZUFRPX0NJUEhF Ul9OVUxMLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFJURV9DUllQVE9fQ0lQSEVSX0FF U19DVFIsPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgUlRFX0NSWVBUT19DSVBIRVJfWlVD X0VFQTMsPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgUlRFX0NSWVBUT19DSVBIRVJfU05P VzNHX1VFQTI8YnI+DQorPGJyPg0KwqAgwqAgwqAgwqAgfTs8YnI+DQrCoCDCoCDCoCDCoCBjb25z dCBlbnVtIHJ0ZV9jcnlwdG9fYXV0aF9hbGdvcml0aG0gYXV0aHNbXSA9IHs8YnI+DQotwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqBSVEVfQ1JZUFRPX0FVVEhfTlVMTCw8YnI+DQotwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqBSVEVfQ1JZUFRPX0FVVEhfU05PVzNHX1VJQTIsPGJyPg0KLcKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgUlRFX0NSWVBUT19BVVRIX0FFU19DTUFDLDxicj4NCi3CoCDCoCDCoCDCoCDC oCDCoCDCoCDCoFJURV9DUllQVE9fQVVUSF9aVUNfRUlBMzxicj4NCivCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoFJURV9DUllQVE9fQVVUSF9TTk9XM0dfVUlBMjxicj4NCsKgIMKgIMKgIMKgIH07PGJy Pg0KPGJyPg0KLcKgIMKgIMKgIMKgUlRFX0JVSUxEX0JVR19PTihSVEVfRElNKHBkY3BfdGVzdF9w YXJhbXMpICE9IFJURV9ESU0ocGRjcF90ZXN0X2F1dGhfa2V5KSk7PGJyPg0KLcKgIMKgIMKgIMKg UlRFX0JVSUxEX0JVR19PTihSVEVfRElNKHBkY3BfdGVzdF9wYXJhbXMpICE9IFJURV9ESU0ocGRj cF90ZXN0X2JlYXJlcikpOzxicj4NCi3CoCDCoCDCoCDCoFJURV9CVUlMRF9CVUdfT04oUlRFX0RJ TShwZGNwX3Rlc3RfcGFyYW1zKSAhPSBSVEVfRElNKHBkY3BfdGVzdF9jcnlwdG9fa2V5KSk7PGJy Pg0KLcKgIMKgIMKgIMKgUlRFX0JVSUxEX0JVR19PTihSVEVfRElNKHBkY3BfdGVzdF9wYXJhbXMp ICE9IFJURV9ESU0ocGRjcF90ZXN0X2RhdGFfaW4pKTs8YnI+DQotwqAgwqAgwqAgwqBSVEVfQlVJ TERfQlVHX09OKFJURV9ESU0ocGRjcF90ZXN0X3BhcmFtcykgIT0gUlRFX0RJTShwZGNwX3Rlc3Rf ZGF0YV9pbl9sZW4pKTs8YnI+DQotwqAgwqAgwqAgwqBSVEVfQlVJTERfQlVHX09OKFJURV9ESU0o cGRjcF90ZXN0X3BhcmFtcykgIT0gUlRFX0RJTShwZGNwX3Rlc3RfZGF0YV9vdXQpKTs8YnI+DQot wqAgwqAgwqAgwqBSVEVfQlVJTERfQlVHX09OKFJURV9ESU0ocGRjcF90ZXN0X3BhcmFtcykgIT0g UlRFX0RJTShwZGNwX3Rlc3RfZGF0YV9zbl9zaXplKSk7PGJyPg0KLcKgIMKgIMKgIMKgUlRFX0JV SUxEX0JVR19PTihSVEVfRElNKHBkY3BfdGVzdF9wYXJhbXMpICE9IFJURV9ESU0ocGRjcF90ZXN0 X2hmbikpOzxicj4NCi3CoCDCoCDCoCDCoFJURV9CVUlMRF9CVUdfT04oUlRFX0RJTShwZGNwX3Rl c3RfcGFyYW1zKSAhPSBSVEVfRElNKHBkY3BfdGVzdF9oZm5fdGhyZXNob2xkKSk7PGJyPg0KLcKg IMKgIMKgIMKgUlRFX0JVSUxEX0JVR19PTihSVEVfRElNKHBkY3BfdGVzdF9wYXJhbXMpICE9IFJU RV9ESU0ocGRjcF90ZXN0X3BhY2tldF9kaXJlY3Rpb24pKTs8YnI+DQotPGJyPg0KLcKgIMKgIMKg IMKgcnRlX2NyeXB0b2Rldl9pbmZvX2dldChkZXZfaWQsICZhbXA7ZGV2X2luZm8pOzxicj4NCi08 YnI+DQotwqAgwqAgwqAgwqBpZiAoIShkZXZfaW5mby5mZWF0dXJlX2ZsYWdzICZhbXA7IFJURV9D UllQVE9ERVZfRkZfU1lNTUVUUklDX0NSWVBUTykgfHw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAhKGRldl9pbmZvLmZlYXR1cmVfZmxhZ3MgJmFtcDs8YnI+DQotwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBSVEVfQ1JZUFRPREVWX0ZGX1NFQ1VSSVRZ KSkgezxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFJURV9MT0coSU5GTywgVVNFUjEsICZx dW90O0ZlYXR1cmUgZmxhZyByZXF1aXJlbWVudHMgZm9yIFBEQ1AgUHJvdG8gJnF1b3Q7PGJyPg0K LcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJnF1b3Q7dGVz dHN1aXRlIG5vdCBtZXRcbiZxdW90Oyk7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcmV0 dXJuIFRFU1RfU0tJUFBFRDs8YnI+DQotwqAgwqAgwqAgwqB9PGJyPg0KLTxicj4NCsKgIMKgIMKg IMKgIGlmIChjaGVja19jaXBoZXJfY2FwYWJpbGl0aWVzX3N1cHBvcnRlZChjaXBoZXJzLCBSVEVf RElNKGNpcGhlcnMpKSAhPSAwPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgJmFtcDsmYW1wOyBjaGVja19hdXRoX2NhcGFiaWxpdGllc19zdXBwb3J0ZWQoYXV0aHMsPGJy Pg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgUlRFX0RJTShhdXRocykpICE9 IDApIHs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBSVEVfTE9HKElORk8sIFVTRVIxLCAm cXVvdDtDYXBhYmlsaXR5IHJlcXVpcmVtZW50cyBmb3IgUERDUCBQcm90byAmcXVvdDs8YnI+DQor wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBSVEVfTE9HKElORk8sIFVTRVIxLCAmcXVvdDtDYXBhYmls aXR5IHJlcXVpcmVtZW50cyBmb3IgU25vdzNHICZxdW90Ozxicj4NCsKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICZxdW90O3Rlc3RzdWl0ZSBub3QgbWV0XG4m cXVvdDspOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHJldHVybiBURVNUX1NLSVBQRUQ7 PGJyPg0KwqAgwqAgwqAgwqAgfTxicj4NCivCoCDCoCDCoCDCoFRFU1RfQVNTRVJUX1NVQ0NFU1Mo ZGV2X3N0YXJ0KCksICZxdW90O0ZhaWxlZCB0byBzdGFydCB0aGUgZGV2aWNlJnF1b3Q7KTs8YnI+ DQo8YnI+DQrCoCDCoCDCoCDCoCByZXR1cm4gMDs8YnI+DQrCoH08YnI+DQo8YnI+DQrCoHN0YXRp YyBpbnQ8YnI+DQotZG9jc2lzX3Byb3RvX3Rlc3RzdWl0ZV9zZXR1cCh2b2lkKTxicj4NCit0c19z ZXR1cF9jaGFjaGEyMF9wb2x5MTMwNSh2b2lkKTxicj4NCsKgezxicj4NCi3CoCDCoCDCoCDCoHN0 cnVjdCBjcnlwdG9fdGVzdHN1aXRlX3BhcmFtcyAqdHNfcGFyYW1zID0gJmFtcDt0ZXN0c3VpdGVf cGFyYW1zOzxicj4NCi3CoCDCoCDCoCDCoHVpbnQ4X3QgZGV2X2lkID0gdHNfcGFyYW1zLSZndDt2 YWxpZF9kZXZzWzBdOzxicj4NCi3CoCDCoCDCoCDCoHN0cnVjdCBydGVfY3J5cHRvZGV2X2luZm8g ZGV2X2luZm87PGJyPg0KLcKgIMKgIMKgIMKgY29uc3QgZW51bSBydGVfY3J5cHRvX2NpcGhlcl9h bGdvcml0aG0gY2lwaGVyc1tdID0gezxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFJURV9D UllQVE9fQ0lQSEVSX0FFU19ET0NTSVNCUEk8YnI+DQorwqAgwqAgwqAgwqBjb25zdCBlbnVtIHJ0 ZV9jcnlwdG9fYWVhZF9hbGdvcml0aG0gYWVhZHNbXSA9IHs8YnI+DQorwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqBSVEVfQ1JZUFRPX0FFQURfQ0hBQ0hBMjBfUE9MWTEzMDU8YnI+DQrCoCDCoCDCoCDC oCB9Ozxicj4NCjxicj4NCi3CoCDCoCDCoCDCoHJ0ZV9jcnlwdG9kZXZfaW5mb19nZXQoZGV2X2lk LCAmYW1wO2Rldl9pbmZvKTs8YnI+DQotPGJyPg0KLcKgIMKgIMKgIMKgaWYgKCEoZGV2X2luZm8u ZmVhdHVyZV9mbGFncyAmYW1wOyBSVEVfQ1JZUFRPREVWX0ZGX1NZTU1FVFJJQ19DUllQVE8pIHx8 PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIShkZXZfaW5mby5mZWF0 dXJlX2ZsYWdzICZhbXA7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg UlRFX0NSWVBUT0RFVl9GRl9TRUNVUklUWSkpIHs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqBSVEVfTE9HKElORk8sIFVTRVIxLCAmcXVvdDtGZWF0dXJlIGZsYWcgcmVxdWlyZW1lbnRzIGZv ciBET0NTSVMgJnF1b3Q7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgJnF1b3Q7UHJvdG8gdGVzdHN1aXRlIG5vdCBtZXRcbiZxdW90Oyk7PGJyPg0K K8KgIMKgIMKgIMKgaWYgKCEocF90c19wYXJhbXMtJmd0O2Rldl9pbmZvLmZlYXR1cmVfZmxhZ3Mg JmFtcDsgUlRFX0NSWVBUT0RFVl9GRl9TWU1NRVRSSUNfQ1JZUFRPKSB8fDxicj4NCivCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCgoZ2xvYmFsX2FwaV90ZXN0X3R5cGUgPT0gQ1JZ UFRPREVWX1JBV19BUElfVEVTVCkgJmFtcDsmYW1wOzxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCEocF90c19wYXJhbXMtJmd0O2Rldl9pbmZvLmZlYXR1cmVfZmxhZ3Mg JmFtcDsgUlRFX0NSWVBUT0RFVl9GRl9TWU1fUkFXX0RQKSkpIHs8YnI+DQorwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqBSVEVfTE9HKElORk8sIFVTRVIxLCAmcXVvdDtGZWF0dXJlIGZsYWcgcmVxdWly ZW1lbnRzIGZvciAmcXVvdDs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAmcXVvdDtDaGFjaGEyMC1Qb2x5MTMwNSB0ZXN0c3VpdGUgbm90IG1ldFxu JnF1b3Q7KTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCByZXR1cm4gVEVTVF9TS0lQUEVE Ozxicj4NCsKgIMKgIMKgIMKgIH08YnI+DQo8YnI+DQotwqAgwqAgwqAgwqBpZiAoY2hlY2tfY2lw aGVyX2NhcGFiaWxpdGllc19zdXBwb3J0ZWQoY2lwaGVycywgUlRFX0RJTShjaXBoZXJzKSkgIT0g MCkgezxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFJURV9MT0coSU5GTywgVVNFUjEsICZx dW90O0NhcGFiaWxpdHkgcmVxdWlyZW1lbnRzIGZvciBET0NTSVMgUHJvdG8gJnF1b3Q7PGJyPg0K LcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJnF1b3Q7dGVz dHN1aXRlIG5vdCBtZXRcbiZxdW90Oyk7PGJyPg0KK8KgIMKgIMKgIMKgaWYgKGNoZWNrX2FlYWRf Y2FwYWJpbGl0aWVzX3N1cHBvcnRlZChhZWFkcywgUlRFX0RJTShhZWFkcykpICE9IDApIHs8YnI+ DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBSVEVfTE9HKElORk8sIFVTRVIxLCAmcXVvdDtDYXBh YmlsaXR5IHJlcXVpcmVtZW50cyBmb3IgJnF1b3Q7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJnF1b3Q7Q2hhY2hhMjAtUG9seTEzMDUgdGVzdHN1 aXRlIG5vdCBtZXRcbiZxdW90Oyk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcmV0dXJu IFRFU1RfU0tJUFBFRDs8YnI+DQrCoCDCoCDCoCDCoCB9PGJyPg0KK8KgIMKgIMKgIMKgVEVTVF9B U1NFUlRfU1VDQ0VTUyhkZXZfc3RhcnQoKSwgJnF1b3Q7RmFpbGVkIHRvIHN0YXJ0IHRoZSBkZXZp Y2UmcXVvdDspOzxicj4NCjxicj4NCsKgIMKgIMKgIMKgIHJldHVybiAwOzxicj4NCsKgfTxicj4N Ci0jZW5kaWY8YnI+DQo8YnI+DQrCoHN0YXRpYyBpbnQ8YnI+DQotYWVzX2NjbV9hdXRoX3Rlc3Rz dWl0ZV9zZXR1cCh2b2lkKTxicj4NCit0c19zZXR1cF96dWModm9pZCk8YnI+DQrCoHs8YnI+DQot wqAgwqAgwqAgwqBzdHJ1Y3QgY3J5cHRvX3Rlc3RzdWl0ZV9wYXJhbXMgKnRzX3BhcmFtcyA9ICZh bXA7dGVzdHN1aXRlX3BhcmFtczs8YnI+DQotwqAgwqAgwqAgwqB1aW50OF90IGRldl9pZCA9IHRz X3BhcmFtcy0mZ3Q7dmFsaWRfZGV2c1swXTs8YnI+DQotwqAgwqAgwqAgwqBzdHJ1Y3QgcnRlX2Ny eXB0b2Rldl9pbmZvIGRldl9pbmZvOzxicj4NCi3CoCDCoCDCoCDCoGNvbnN0IGVudW0gcnRlX2Ny eXB0b19hZWFkX2FsZ29yaXRobSBhZWFkc1tdID0gezxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDC oCDCoFJURV9DUllQVE9fQUVBRF9BRVNfQ0NNPGJyPg0KK8KgIMKgIMKgIMKgY29uc3QgZW51bSBy dGVfY3J5cHRvX2NpcGhlcl9hbGdvcml0aG0gY2lwaGVyc1tdID0gezxicj4NCivCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoFJURV9DUllQVE9fQ0lQSEVSX1pVQ19FRUEzPGJyPg0KK8KgIMKgIMKgIMKg fTs8YnI+DQorwqAgwqAgwqAgwqBjb25zdCBlbnVtIHJ0ZV9jcnlwdG9fYXV0aF9hbGdvcml0aG0g YXV0aHNbXSA9IHs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBSVEVfQ1JZUFRPX0FVVEhf WlVDX0VJQTM8YnI+DQrCoCDCoCDCoCDCoCB9Ozxicj4NCjxicj4NCi3CoCDCoCDCoCDCoHJ0ZV9j cnlwdG9kZXZfaW5mb19nZXQoZGV2X2lkLCAmYW1wO2Rldl9pbmZvKTs8YnI+DQorwqAgwqAgwqAg wqBpZiAoY2hlY2tfY2lwaGVyX2NhcGFiaWxpdGllc19zdXBwb3J0ZWQoY2lwaGVycywgUlRFX0RJ TShjaXBoZXJzKSkgIT0gMDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCZhbXA7JmFtcDsgY2hlY2tfYXV0aF9jYXBhYmlsaXRpZXNfc3VwcG9ydGVkKGF1dGhzLDxicj4N CivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFJURV9ESU0oYXV0aHMpKSAhPSAw KSB7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgUlRFX0xPRyhJTkZPLCBVU0VSMSwgJnF1 b3Q7Q2FwYWJpbGl0eSByZXF1aXJlbWVudHMgZm9yIFpVQyAmcXVvdDs8YnI+DQorwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmcXVvdDt0ZXN0c3VpdGUgbm90 IG1ldFxuJnF1b3Q7KTs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqByZXR1cm4gVEVTVF9T S0lQUEVEOzxicj4NCivCoCDCoCDCoCDCoH08YnI+DQorwqAgwqAgwqAgwqBURVNUX0FTU0VSVF9T VUNDRVNTKGRldl9zdGFydCgpLCAmcXVvdDtGYWlsZWQgdG8gc3RhcnQgdGhlIGRldmljZSZxdW90 Oyk7PGJyPg0KPGJyPg0KLcKgIMKgIMKgIMKgaWYgKCEoZGV2X2luZm8uZmVhdHVyZV9mbGFncyAm YW1wOyBSVEVfQ1JZUFRPREVWX0ZGX1NZTU1FVFJJQ19DUllQVE8pIHx8PGJyPg0KK8KgIMKgIMKg IMKgcmV0dXJuIDA7PGJyPg0KK308YnI+DQorPGJyPg0KK3N0YXRpYyBpbnQ8YnI+DQordHNfc2V0 dXBfaG1hY19tZDUodm9pZCk8YnI+DQorezxicj4NCivCoCDCoCDCoCDCoGNvbnN0IGVudW0gcnRl X2NyeXB0b19hdXRoX2FsZ29yaXRobSBhdXRoc1tdID0gezxicj4NCivCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoFJURV9DUllQVE9fQVVUSF9NRDVfSE1BQzxicj4NCivCoCDCoCDCoCDCoH07PGJyPg0K Kzxicj4NCivCoCDCoCDCoCDCoGlmICghKHBfdHNfcGFyYW1zLSZndDtkZXZfaW5mby5mZWF0dXJl X2ZsYWdzICZhbXA7IFJURV9DUllQVE9ERVZfRkZfU1lNTUVUUklDX0NSWVBUTykgfHw8YnI+DQrC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAoKGdsb2JhbF9hcGlfdGVzdF90eXBl ID09IENSWVBUT0RFVl9SQVdfQVBJX1RFU1QpICZhbXA7JmFtcDs8YnI+DQotwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAhKGRldl9pbmZvLmZlYXR1cmVfZmxhZ3MgJmFtcDsgUlRF X0NSWVBUT0RFVl9GRl9TWU1fUkFXX0RQKSkpIHs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqBSVEVfTE9HKElORk8sIFVTRVIxLCAmcXVvdDtGZWF0dXJlIGZsYWcgcmVxdWlyZW1lbnRzIGZv ciBBRVMgQ0NNICZxdW90Ozxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCZxdW90O3Rlc3RzdWl0ZSBub3QgbWV0XG4mcXVvdDspOzxicj4NCivCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCEocF90c19wYXJhbXMtJmd0O2Rldl9pbmZv LmZlYXR1cmVfZmxhZ3MgJmFtcDsgUlRFX0NSWVBUT0RFVl9GRl9TWU1fUkFXX0RQKSkpIHs8YnI+ DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBSVEVfTE9HKElORk8sIFVTRVIxLCAmcXVvdDtGZWF0 dXJlIGZsYWcgcmVxdWlyZW1lbnRzIGZvciBITUFDIE1ENSAmcXVvdDs8YnI+DQorwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmcXVvdDtBdXRoIHRlc3RzdWl0 ZSBub3QgbWV0XG4mcXVvdDspOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHJldHVybiBU RVNUX1NLSVBQRUQ7PGJyPg0KwqAgwqAgwqAgwqAgfTxicj4NCjxicj4NCi3CoCDCoCDCoCDCoGlm IChjaGVja19hZWFkX2NhcGFiaWxpdGllc19zdXBwb3J0ZWQoYWVhZHMsIFJURV9ESU0oYWVhZHMp KSAhPSAwKSB7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgUlRFX0xPRyhJTkZPLCBVU0VS MSwgJnF1b3Q7Q2FwYWJpbGl0eSByZXF1aXJlbWVudHMgZm9yIEFFUyBDQ00gJnF1b3Q7PGJyPg0K K8KgIMKgIMKgIMKgaWYgKGNoZWNrX2F1dGhfY2FwYWJpbGl0aWVzX3N1cHBvcnRlZChhdXRocywg UlRFX0RJTShhdXRocykpICE9IDApIHs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBSVEVf TE9HKElORk8sIFVTRVIxLCAmcXVvdDtDYXBhYmlsaXR5IHJlcXVpcmVtZW50cyBmb3IgSE1BQyBN RDUgJnF1b3Q7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgJnF1b3Q7dGVzdHN1aXRlIG5vdCBtZXRcbiZxdW90Oyk7PGJyPg0KwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgcmV0dXJuIFRFU1RfU0tJUFBFRDs8YnI+DQrCoCDCoCDCoCDCoCB9PGJyPg0K K8KgIMKgIMKgIMKgVEVTVF9BU1NFUlRfU1VDQ0VTUyhkZXZfc3RhcnQoKSwgJnF1b3Q7RmFpbGVk IHRvIHN0YXJ0IHRoZSBkZXZpY2UmcXVvdDspOzxicj4NCjxicj4NCsKgIMKgIMKgIMKgIHJldHVy biAwOzxicj4NCsKgfTxicj4NCjxicj4NCsKgc3RhdGljIGludDxicj4NCi1hZXNfZ2NtX2F1dGhf dGVzdHN1aXRlX3NldHVwKHZvaWQpPGJyPg0KK3RzX3NldHVwX2thc3VtaSh2b2lkKTxicj4NCsKg ezxicj4NCi3CoCDCoCDCoCDCoHN0cnVjdCBjcnlwdG9fdGVzdHN1aXRlX3BhcmFtcyAqdHNfcGFy YW1zID0gJmFtcDt0ZXN0c3VpdGVfcGFyYW1zOzxicj4NCi3CoCDCoCDCoCDCoHVpbnQ4X3QgZGV2 X2lkID0gdHNfcGFyYW1zLSZndDt2YWxpZF9kZXZzWzBdOzxicj4NCi3CoCDCoCDCoCDCoHN0cnVj dCBydGVfY3J5cHRvZGV2X2luZm8gZGV2X2luZm87PGJyPg0KLcKgIMKgIMKgIMKgY29uc3QgZW51 bSBydGVfY3J5cHRvX2FlYWRfYWxnb3JpdGhtIGFlYWRzW10gPSB7PGJyPg0KLcKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgUlRFX0NSWVBUT19BRUFEX0FFU19HQ008YnI+DQorwqAgwqAgwqAgwqBjb25z dCBlbnVtIHJ0ZV9jcnlwdG9fY2lwaGVyX2FsZ29yaXRobSBjaXBoZXJzW10gPSB7PGJyPg0KK8Kg IMKgIMKgIMKgIMKgIMKgIMKgIMKgUlRFX0NSWVBUT19DSVBIRVJfS0FTVU1JX0Y4PGJyPg0KK8Kg IMKgIMKgIMKgfTs8YnI+DQorwqAgwqAgwqAgwqBjb25zdCBlbnVtIHJ0ZV9jcnlwdG9fYXV0aF9h bGdvcml0aG0gYXV0aHNbXSA9IHs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBSVEVfQ1JZ UFRPX0FVVEhfS0FTVU1JX0Y5PGJyPg0KwqAgwqAgwqAgwqAgfTs8YnI+DQo8YnI+DQotwqAgwqAg wqAgwqBydGVfY3J5cHRvZGV2X2luZm9fZ2V0KGRldl9pZCwgJmFtcDtkZXZfaW5mbyk7PGJyPg0K LTxicj4NCi3CoCDCoCDCoCDCoGlmICghKGRldl9pbmZvLmZlYXR1cmVfZmxhZ3MgJmFtcDsgUlRF X0NSWVBUT0RFVl9GRl9TWU1NRVRSSUNfQ1JZUFRPKSkgezxicj4NCi3CoCDCoCDCoCDCoCDCoCDC oCDCoCDCoFJURV9MT0coSU5GTywgVVNFUjEsICZxdW90O0ZlYXR1cmUgZmxhZyByZXF1aXJlbWVu dHMgZm9yIEFFUyBHQ00gJnF1b3Q7PGJyPg0KK8KgIMKgIMKgIMKgaWYgKCEocF90c19wYXJhbXMt Jmd0O2Rldl9pbmZvLmZlYXR1cmVfZmxhZ3MgJmFtcDsgUlRFX0NSWVBUT0RFVl9GRl9TWU1NRVRS SUNfQ1JZUFRPKSB8fDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCgo Z2xvYmFsX2FwaV90ZXN0X3R5cGUgPT0gQ1JZUFRPREVWX1JBV19BUElfVEVTVCkgJmFtcDsmYW1w Ozxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCEocF90c19wYXJhbXMt Jmd0O2Rldl9pbmZvLmZlYXR1cmVfZmxhZ3MgJmFtcDsgUlRFX0NSWVBUT0RFVl9GRl9TWU1fUkFX X0RQKSkpIHs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBSVEVfTE9HKElORk8sIFVTRVIx LCAmcXVvdDtGZWF0dXJlIGZsYWcgcmVxdWlyZW1lbnRzIGZvciBLYXN1bWkgJnF1b3Q7PGJyPg0K wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgJnF1b3Q7dGVz dHN1aXRlIG5vdCBtZXRcbiZxdW90Oyk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcmV0 dXJuIFRFU1RfU0tJUFBFRDs8YnI+DQrCoCDCoCDCoCDCoCB9PGJyPg0KPGJyPg0KLcKgIMKgIMKg IMKgaWYgKGNoZWNrX2FlYWRfY2FwYWJpbGl0aWVzX3N1cHBvcnRlZChhZWFkcywgUlRFX0RJTShh ZWFkcykpICE9IDApIHs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBSVEVfTE9HKElORk8s IFVTRVIxLCAmcXVvdDtDYXBhYmlsaXR5IHJlcXVpcmVtZW50cyBmb3IgQUVTIEdDTSAmcXVvdDs8 YnI+DQorwqAgwqAgwqAgwqBpZiAoY2hlY2tfY2lwaGVyX2NhcGFiaWxpdGllc19zdXBwb3J0ZWQo Y2lwaGVycywgUlRFX0RJTShjaXBoZXJzKSkgIT0gMDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCZhbXA7JmFtcDsgY2hlY2tfYXV0aF9jYXBhYmlsaXRpZXNfc3VwcG9y dGVkKGF1dGhzLDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFJURV9E SU0oYXV0aHMpKSAhPSAwKSB7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgUlRFX0xPRyhJ TkZPLCBVU0VSMSwgJnF1b3Q7Q2FwYWJpbGl0eSByZXF1aXJlbWVudHMgZm9yIEthc3VtaSAmcXVv dDs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAm cXVvdDt0ZXN0c3VpdGUgbm90IG1ldFxuJnF1b3Q7KTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCByZXR1cm4gVEVTVF9TS0lQUEVEOzxicj4NCsKgIMKgIMKgIMKgIH08YnI+DQorwqAgwqAg wqAgwqBURVNUX0FTU0VSVF9TVUNDRVNTKGRldl9zdGFydCgpLCAmcXVvdDtGYWlsZWQgdG8gc3Rh cnQgdGhlIGRldmljZSZxdW90Oyk7PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgcmV0dXJuIDA7PGJy Pg0KwqB9PGJyPg0KPGJyPg0KwqBzdGF0aWMgaW50PGJyPg0KLWFlc19nbWFjX2F1dGhfdGVzdHN1 aXRlX3NldHVwKHZvaWQpPGJyPg0KK3RzX3NldHVwX2Vzbih2b2lkKTxicj4NCsKgezxicj4NCi3C oCDCoCDCoCDCoHN0cnVjdCBjcnlwdG9fdGVzdHN1aXRlX3BhcmFtcyAqdHNfcGFyYW1zID0gJmFt cDt0ZXN0c3VpdGVfcGFyYW1zOzxicj4NCi3CoCDCoCDCoCDCoHVpbnQ4X3QgZGV2X2lkID0gdHNf cGFyYW1zLSZndDt2YWxpZF9kZXZzWzBdOzxicj4NCi3CoCDCoCDCoCDCoHN0cnVjdCBydGVfY3J5 cHRvZGV2X2luZm8gZGV2X2luZm87PGJyPg0KK8KgIMKgIMKgIMKgY29uc3QgZW51bSBydGVfY3J5 cHRvX2NpcGhlcl9hbGdvcml0aG0gY2lwaGVyc1tdID0gezxicj4NCivCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoFJURV9DUllQVE9fQ0lQSEVSX0FFU19DQkM8YnI+DQorwqAgwqAgwqAgwqB9Ozxicj4N CsKgIMKgIMKgIMKgIGNvbnN0IGVudW0gcnRlX2NyeXB0b19hdXRoX2FsZ29yaXRobSBhdXRoc1td ID0gezxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFJURV9DUllQVE9fQVVUSF9BRVNfR01B Qzxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFJURV9DUllQVE9fQVVUSF9TSEExX0hNQUM8 YnI+DQrCoCDCoCDCoCDCoCB9Ozxicj4NCjxicj4NCi3CoCDCoCDCoCDCoHJ0ZV9jcnlwdG9kZXZf aW5mb19nZXQoZGV2X2lkLCAmYW1wO2Rldl9pbmZvKTs8YnI+DQotPGJyPg0KLcKgIMKgIMKgIMKg aWYgKCEoZGV2X2luZm8uZmVhdHVyZV9mbGFncyAmYW1wOyBSVEVfQ1JZUFRPREVWX0ZGX1NZTU1F VFJJQ19DUllQVE8pIHx8PGJyPg0KK8KgIMKgIMKgIMKgaWYgKCEocF90c19wYXJhbXMtJmd0O2Rl dl9pbmZvLmZlYXR1cmVfZmxhZ3MgJmFtcDsgUlRFX0NSWVBUT0RFVl9GRl9TWU1NRVRSSUNfQ1JZ UFRPKSB8fDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICgoZ2xvYmFs X2FwaV90ZXN0X3R5cGUgPT0gQ1JZUFRPREVWX1JBV19BUElfVEVTVCkgJmFtcDsmYW1wOzxicj4N Ci3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCEoZGV2X2luZm8uZmVhdHVyZV9m bGFncyAmYW1wOyBSVEVfQ1JZUFRPREVWX0ZGX1NZTV9SQVdfRFApKSkgezxicj4NCi3CoCDCoCDC oCDCoCDCoCDCoCDCoCDCoFJURV9MT0coSU5GTywgVVNFUjEsICZxdW90O0ZlYXR1cmUgZmxhZyBy ZXF1aXJlbWVudHMgZm9yIEFFUyBHTUFDICZxdW90Ozxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCEocF90c19wYXJhbXMtJmd0O2Rldl9pbmZvLmZlYXR1cmVfZmxhZ3Mg JmFtcDsgUlRFX0NSWVBUT0RFVl9GRl9TWU1fUkFXX0RQKSkpIHs8YnI+DQorwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqBSVEVfTE9HKElORk8sIFVTRVIxLCAmcXVvdDtGZWF0dXJlIGZsYWcgcmVxdWly ZW1lbnRzIGZvciBFU04gJnF1b3Q7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgJnF1b3Q7dGVzdHN1aXRlIG5vdCBtZXRcbiZxdW90Oyk7PGJyPg0K wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcmV0dXJuIFRFU1RfU0tJUFBFRDs8YnI+DQrCoCDCoCDC oCDCoCB9PGJyPg0KPGJyPg0KLcKgIMKgIMKgIMKgaWYgKGNoZWNrX2F1dGhfY2FwYWJpbGl0aWVz X3N1cHBvcnRlZChhdXRocywgUlRFX0RJTShhdXRocykpICE9IDApIHs8YnI+DQotwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqBSVEVfTE9HKElORk8sIFVTRVIxLCAmcXVvdDtDYXBhYmlsaXR5IHJlcXVp cmVtZW50cyBmb3IgQUVTIEdNQUMgJnF1b3Q7PGJyPg0KK8KgIMKgIMKgIMKgaWYgKGNoZWNrX2Np cGhlcl9jYXBhYmlsaXRpZXNfc3VwcG9ydGVkKGNpcGhlcnMsIFJURV9ESU0oY2lwaGVycykpICE9 IDA8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmYW1wOyZhbXA7IGNo ZWNrX2F1dGhfY2FwYWJpbGl0aWVzX3N1cHBvcnRlZChhdXRocyw8YnI+DQorwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBSVEVfRElNKGF1dGhzKSkgIT0gMCkgezxicj4NCivCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoFJURV9MT0coSU5GTywgVVNFUjEsICZxdW90O0NhcGFiaWxpdHkg cmVxdWlyZW1lbnRzIGZvciBFU04gJnF1b3Q7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgJnF1b3Q7dGVzdHN1aXRlIG5vdCBtZXRcbiZxdW90Oyk7 PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcmV0dXJuIFRFU1RfU0tJUFBFRDs8YnI+DQrC oCDCoCDCoCDCoCB9PGJyPg0KK8KgIMKgIMKgIMKgVEVTVF9BU1NFUlRfU1VDQ0VTUyhkZXZfc3Rh cnQoKSwgJnF1b3Q7RmFpbGVkIHRvIHN0YXJ0IHRoZSBkZXZpY2UmcXVvdDspOzxicj4NCjxicj4N CsKgIMKgIMKgIMKgIHJldHVybiAwOzxicj4NCsKgfTxicj4NCjxicj4NCis8YnI+DQrCoHN0YXRp YyBpbnQ8YnI+DQotY2hhY2hhMjBfcG9seTEzMDVfdGVzdHN1aXRlX3NldHVwKHZvaWQpPGJyPg0K K3RzX3NldHVwX25lZ2F0aXZlX2Flc19nY20odm9pZCk8YnI+DQrCoHs8YnI+DQotwqAgwqAgwqAg wqBzdHJ1Y3QgY3J5cHRvX3Rlc3RzdWl0ZV9wYXJhbXMgKnRzX3BhcmFtcyA9ICZhbXA7dGVzdHN1 aXRlX3BhcmFtczs8YnI+DQotwqAgwqAgwqAgwqB1aW50OF90IGRldl9pZCA9IHRzX3BhcmFtcy0m Z3Q7dmFsaWRfZGV2c1swXTs8YnI+DQotwqAgwqAgwqAgwqBzdHJ1Y3QgcnRlX2NyeXB0b2Rldl9p bmZvIGRldl9pbmZvOzxicj4NCsKgIMKgIMKgIMKgIGNvbnN0IGVudW0gcnRlX2NyeXB0b19hZWFk X2FsZ29yaXRobSBhZWFkc1tdID0gezxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFJURV9D UllQVE9fQUVBRF9DSEFDSEEyMF9QT0xZMTMwNTxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oFJURV9DUllQVE9fQUVBRF9BRVNfR0NNPGJyPg0KwqAgwqAgwqAgwqAgfTs8YnI+DQo8YnI+DQot wqAgwqAgwqAgwqBydGVfY3J5cHRvZGV2X2luZm9fZ2V0KGRldl9pZCwgJmFtcDtkZXZfaW5mbyk7 PGJyPg0KLTxicj4NCi3CoCDCoCDCoCDCoGlmICghKGRldl9pbmZvLmZlYXR1cmVfZmxhZ3MgJmFt cDsgUlRFX0NSWVBUT0RFVl9GRl9TWU1NRVRSSUNfQ1JZUFRPKSB8fDxicj4NCivCoCDCoCDCoCDC oGlmICghKHBfdHNfcGFyYW1zLSZndDtkZXZfaW5mby5mZWF0dXJlX2ZsYWdzICZhbXA7IFJURV9D UllQVE9ERVZfRkZfU1lNTUVUUklDX0NSWVBUTykgfHw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCAoKGdsb2JhbF9hcGlfdGVzdF90eXBlID09IENSWVBUT0RFVl9SQVdf QVBJX1RFU1QpICZhbXA7JmFtcDs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAhKGRldl9pbmZvLmZlYXR1cmVfZmxhZ3MgJmFtcDsgUlRFX0NSWVBUT0RFVl9GRl9TWU1f UkFXX0RQKSkpIHs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBSVEVfTE9HKElORk8sIFVT RVIxLCAmcXVvdDtGZWF0dXJlIGZsYWcgcmVxdWlyZW1lbnRzIGZvciAmcXVvdDs8YnI+DQotwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmcXVvdDtDaGFjaGEy MC1Qb2x5MTMwNSB0ZXN0c3VpdGUgbm90IG1ldFxuJnF1b3Q7KTs8YnI+DQorwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAhKHBfdHNfcGFyYW1zLSZndDtkZXZfaW5mby5mZWF0dXJl X2ZsYWdzICZhbXA7IFJURV9DUllQVE9ERVZfRkZfU1lNX1JBV19EUCkpKSB7PGJyPg0KK8KgIMKg IMKgIMKgIMKgIMKgIMKgIMKgUlRFX0xPRyhJTkZPLCBVU0VSMSwgJnF1b3Q7RmVhdHVyZSBmbGFn IHJlcXVpcmVtZW50cyBmb3IgTmVnYXRpdmUgJnF1b3Q7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJnF1b3Q7QUVTIEdDTSB0ZXN0c3VpdGUgbm90 IG1ldFxuJnF1b3Q7KTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCByZXR1cm4gVEVTVF9T S0lQUEVEOzxicj4NCsKgIMKgIMKgIMKgIH08YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCBpZiAoY2hl Y2tfYWVhZF9jYXBhYmlsaXRpZXNfc3VwcG9ydGVkKGFlYWRzLCBSVEVfRElNKGFlYWRzKSkgIT0g MCkgezxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFJURV9MT0coSU5GTywgVVNFUjEsICZx dW90O0NhcGFiaWxpdHkgcmVxdWlyZW1lbnRzIGZvciAmcXVvdDs8YnI+DQotwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmcXVvdDtDaGFjaGEyMC1Qb2x5MTMw NSB0ZXN0c3VpdGUgbm90IG1ldFxuJnF1b3Q7KTs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqBSVEVfTE9HKElORk8sIFVTRVIxLCAmcXVvdDtDYXBhYmlsaXR5IHJlcXVpcmVtZW50cyBmb3Ig TmVnYXRpdmUgJnF1b3Q7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgJnF1b3Q7QUVTIEdDTSB0ZXN0c3VpdGUgbm90IG1ldFxuJnF1b3Q7KTs8YnI+ DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCByZXR1cm4gVEVTVF9TS0lQUEVEOzxicj4NCsKgIMKg IMKgIMKgIH08YnI+DQorwqAgwqAgwqAgwqBURVNUX0FTU0VSVF9TVUNDRVNTKGRldl9zdGFydCgp LCAmcXVvdDtGYWlsZWQgdG8gc3RhcnQgdGhlIGRldmljZSZxdW90Oyk7PGJyPg0KPGJyPg0KwqAg wqAgwqAgwqAgcmV0dXJuIDA7PGJyPg0KwqB9PGJyPg0KPGJyPg0KKzxicj4NCsKgc3RhdGljIGlu dDxicj4NCi1zbm93M2dfdGVzdHN1aXRlX3NldHVwKHZvaWQpPGJyPg0KK3RzX3NldHVwX25lZ2F0 aXZlX2Flc19nbWFjKHZvaWQpPGJyPg0KwqB7PGJyPg0KLcKgIMKgIMKgIMKgc3RydWN0IGNyeXB0 b190ZXN0c3VpdGVfcGFyYW1zICp0c19wYXJhbXMgPSAmYW1wO3Rlc3RzdWl0ZV9wYXJhbXM7PGJy Pg0KLcKgIMKgIMKgIMKgdWludDhfdCBkZXZfaWQgPSB0c19wYXJhbXMtJmd0O3ZhbGlkX2RldnNb MF07PGJyPg0KLcKgIMKgIMKgIMKgc3RydWN0IHJ0ZV9jcnlwdG9kZXZfaW5mbyBkZXZfaW5mbzs8 YnI+DQotwqAgwqAgwqAgwqBjb25zdCBlbnVtIHJ0ZV9jcnlwdG9fY2lwaGVyX2FsZ29yaXRobSBj aXBoZXJzW10gPSB7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgUlRFX0NSWVBUT19DSVBI RVJfU05PVzNHX1VFQTI8YnI+DQotPGJyPg0KLcKgIMKgIMKgIMKgfTs8YnI+DQrCoCDCoCDCoCDC oCBjb25zdCBlbnVtIHJ0ZV9jcnlwdG9fYXV0aF9hbGdvcml0aG0gYXV0aHNbXSA9IHs8YnI+DQot wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBSVEVfQ1JZUFRPX0FVVEhfU05PVzNHX1VJQTI8YnI+DQor wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBSVEVfQ1JZUFRPX0FVVEhfQUVTX0dNQUM8YnI+DQrCoCDC oCDCoCDCoCB9Ozxicj4NCjxicj4NCi3CoCDCoCDCoCDCoHJ0ZV9jcnlwdG9kZXZfaW5mb19nZXQo ZGV2X2lkLCAmYW1wO2Rldl9pbmZvKTs8YnI+DQotPGJyPg0KLcKgIMKgIMKgIMKgaWYgKCEoZGV2 X2luZm8uZmVhdHVyZV9mbGFncyAmYW1wOyBSVEVfQ1JZUFRPREVWX0ZGX1NZTU1FVFJJQ19DUllQ VE8pKSB7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgUlRFX0xPRyhJTkZPLCBVU0VSMSwg JnF1b3Q7RmVhdHVyZSBmbGFnIHJlcXVpcmVtZW50cyBmb3IgU25vdzNHICZxdW90Ozxicj4NCi3C oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZxdW90O3Rlc3Rz dWl0ZSBub3QgbWV0XG4mcXVvdDspOzxicj4NCivCoCDCoCDCoCDCoGlmICghKHBfdHNfcGFyYW1z LSZndDtkZXZfaW5mby5mZWF0dXJlX2ZsYWdzICZhbXA7IFJURV9DUllQVE9ERVZfRkZfU1lNTUVU UklDX0NSWVBUTykgfHw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAo KGdsb2JhbF9hcGlfdGVzdF90eXBlID09IENSWVBUT0RFVl9SQVdfQVBJX1RFU1QpICZhbXA7JmFt cDs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAhKHBfdHNfcGFyYW1z LSZndDtkZXZfaW5mby5mZWF0dXJlX2ZsYWdzICZhbXA7IFJURV9DUllQVE9ERVZfRkZfU1lNX1JB V19EUCkpKSB7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgUlRFX0xPRyhJTkZPLCBVU0VS MSwgJnF1b3Q7RmVhdHVyZSBmbGFnIHJlcXVpcmVtZW50cyBmb3IgTmVnYXRpdmUgJnF1b3Q7PGJy Pg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJnF1b3Q7 QUVTIEdNQUMgdGVzdHN1aXRlIG5vdCBtZXRcbiZxdW90Oyk7PGJyPg0KwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgcmV0dXJuIFRFU1RfU0tJUFBFRDs8YnI+DQrCoCDCoCDCoCDCoCB9PGJyPg0KPGJy Pg0KLcKgIMKgIMKgIMKgaWYgKGNoZWNrX2NpcGhlcl9jYXBhYmlsaXRpZXNfc3VwcG9ydGVkKGNp cGhlcnMsIFJURV9ESU0oY2lwaGVycykpICE9IDA8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAmYW1wOyZhbXA7IGNoZWNrX2F1dGhfY2FwYWJpbGl0aWVzX3N1cHBvcnRl ZChhdXRocyw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBSVEVfRElN KGF1dGhzKSkgIT0gMCkgezxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFJURV9MT0coSU5G TywgVVNFUjEsICZxdW90O0NhcGFiaWxpdHkgcmVxdWlyZW1lbnRzIGZvciBTbm93M0cgJnF1b3Q7 PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJnF1 b3Q7dGVzdHN1aXRlIG5vdCBtZXRcbiZxdW90Oyk7PGJyPg0KK8KgIMKgIMKgIMKgaWYgKGNoZWNr X2F1dGhfY2FwYWJpbGl0aWVzX3N1cHBvcnRlZChhdXRocywgUlRFX0RJTShhdXRocykpICE9IDAp IHs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBSVEVfTE9HKElORk8sIFVTRVIxLCAmcXVv dDtDYXBhYmlsaXR5IHJlcXVpcmVtZW50cyBmb3IgTmVnYXRpdmUgJnF1b3Q7PGJyPg0KK8KgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJnF1b3Q7QUVTIEdNQUMg dGVzdHN1aXRlIG5vdCBtZXRcbiZxdW90Oyk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg cmV0dXJuIFRFU1RfU0tJUFBFRDs8YnI+DQrCoCDCoCDCoCDCoCB9PGJyPg0KK8KgIMKgIMKgIMKg VEVTVF9BU1NFUlRfU1VDQ0VTUyhkZXZfc3RhcnQoKSwgJnF1b3Q7RmFpbGVkIHRvIHN0YXJ0IHRo ZSBkZXZpY2UmcXVvdDspOzxicj4NCjxicj4NCsKgIMKgIMKgIMKgIHJldHVybiAwOzxicj4NCsKg fTxicj4NCjxicj4NCsKgc3RhdGljIGludDxicj4NCi16dWNfdGVzdHN1aXRlX3NldHVwKHZvaWQp PGJyPg0KK3RzX3NldHVwX21peGVkX2NpcGhlcl9oYXNoKHZvaWQpPGJyPg0KwqB7PGJyPg0KwqAg wqAgwqAgwqAgc3RydWN0IGNyeXB0b190ZXN0c3VpdGVfcGFyYW1zICp0c19wYXJhbXMgPSAmYW1w O3Rlc3RzdWl0ZV9wYXJhbXM7PGJyPg0KwqAgwqAgwqAgwqAgdWludDhfdCBkZXZfaWQgPSB0c19w YXJhbXMtJmd0O3ZhbGlkX2RldnNbMF07PGJyPg0KwqAgwqAgwqAgwqAgc3RydWN0IHJ0ZV9jcnlw dG9kZXZfaW5mbyBkZXZfaW5mbzs8YnI+DQorwqAgwqAgwqAgwqB1aW50NjRfdCBmZWF0X2ZsYWdz Ozxicj4NCsKgIMKgIMKgIMKgIGNvbnN0IGVudW0gcnRlX2NyeXB0b19jaXBoZXJfYWxnb3JpdGht IGNpcGhlcnNbXSA9IHs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBSVEVfQ1JZUFRPX0NJ UEhFUl9aVUNfRUVBMzxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFJURV9DUllQVE9fQ0lQ SEVSX05VTEwsPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgUlRFX0NSWVBUT19DSVBIRVJf QUVTX0NUUiw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBSVEVfQ1JZUFRPX0NJUEhFUl9a VUNfRUVBMyw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBSVEVfQ1JZUFRPX0NJUEhFUl9T Tk9XM0dfVUVBMjxicj4NCsKgIMKgIMKgIMKgIH07PGJyPg0KwqAgwqAgwqAgwqAgY29uc3QgZW51 bSBydGVfY3J5cHRvX2F1dGhfYWxnb3JpdGhtIGF1dGhzW10gPSB7PGJyPg0KK8KgIMKgIMKgIMKg IMKgIMKgIMKgIMKgUlRFX0NSWVBUT19BVVRIX05VTEwsPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKg IMKgIMKgUlRFX0NSWVBUT19BVVRIX1NOT1czR19VSUEyLDxicj4NCivCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoFJURV9DUllQVE9fQVVUSF9BRVNfQ01BQyw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCBSVEVfQ1JZUFRPX0FVVEhfWlVDX0VJQTM8YnI+DQrCoCDCoCDCoCDCoCB9Ozxicj4NCjxi cj4NCsKgIMKgIMKgIMKgIHJ0ZV9jcnlwdG9kZXZfaW5mb19nZXQoZGV2X2lkLCAmYW1wO2Rldl9p bmZvKTs8YnI+DQorwqAgwqAgwqAgwqBmZWF0X2ZsYWdzID0gZGV2X2luZm8uZmVhdHVyZV9mbGFn czs8YnI+DQo8YnI+DQotwqAgwqAgwqAgwqBpZiAoIShkZXZfaW5mby5mZWF0dXJlX2ZsYWdzICZh bXA7IFJURV9DUllQVE9ERVZfRkZfU1lNTUVUUklDX0NSWVBUTykpIHs8YnI+DQotwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqBSVEVfTE9HKElORk8sIFVTRVIxLCAmcXVvdDtGZWF0dXJlIGZsYWcgcmVx dWlyZW1lbnRzIGZvciBaVUMgJnF1b3Q7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgJnF1b3Q7dGVzdHN1aXRlIG5vdCBtZXRcbiZxdW90Oyk7PGJy Pg0KK8KgIMKgIMKgIMKgaWYgKCEoZmVhdF9mbGFncyAmYW1wOyBSVEVfQ1JZUFRPREVWX0ZGX1NZ TU1FVFJJQ19DUllQVE8pIHx8PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgKGdsb2JhbF9hcGlfdGVzdF90eXBlID09IENSWVBUT0RFVl9SQVdfQVBJX1RFU1QpKSB7PGJy Pg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgUlRFX0xPRyhJTkZPLCBVU0VSMSwgJnF1b3Q7RmVh dHVyZSBmbGFnIHJlcXVpcmVtZW50cyBmb3IgTWl4ZWQgJnF1b3Q7PGJyPg0KK8KgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJnF1b3Q7Q2lwaGVyIEhhc2ggdGVz dHN1aXRlIG5vdCBtZXRcbiZxdW90Oyk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcmV0 dXJuIFRFU1RfU0tJUFBFRDs8YnI+DQrCoCDCoCDCoCDCoCB9PGJyPg0KPGJyPg0KwqAgwqAgwqAg wqAgaWYgKGNoZWNrX2NpcGhlcl9jYXBhYmlsaXRpZXNfc3VwcG9ydGVkKGNpcGhlcnMsIFJURV9E SU0oY2lwaGVycykpICE9IDA8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCAmYW1wOyZhbXA7IGNoZWNrX2F1dGhfY2FwYWJpbGl0aWVzX3N1cHBvcnRlZChhdXRocyw8YnI+ DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBSVEVfRElNKGF1dGhzKSkgIT0g MCkgezxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFJURV9MT0coSU5GTywgVVNFUjEsICZx dW90O0NhcGFiaWxpdHkgcmVxdWlyZW1lbnRzIGZvciBaVUMgJnF1b3Q7PGJyPg0KLcKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJnF1b3Q7dGVzdHN1aXRlIG5v dCBtZXRcbiZxdW90Oyk7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgUlRFX0xPRyhJTkZP LCBVU0VSMSwgJnF1b3Q7Q2FwYWJpbGl0eSByZXF1aXJlbWVudHMgZm9yIE1peGVkICZxdW90Ozxi cj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZxdW90 O0NpcGhlciBIYXNoIHRlc3RzdWl0ZSBub3QgbWV0XG4mcXVvdDspOzxicj4NCsKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIHJldHVybiBURVNUX1NLSVBQRUQ7PGJyPg0KwqAgwqAgwqAgwqAgfTxicj4N CivCoCDCoCDCoCDCoFRFU1RfQVNTRVJUX1NVQ0NFU1MoZGV2X3N0YXJ0KCksICZxdW90O0ZhaWxl ZCB0byBzdGFydCB0aGUgZGV2aWNlJnF1b3Q7KTs8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCByZXR1 cm4gMDs8YnI+DQrCoH08YnI+DQo8YnI+DQorPGJyPg0KwqBzdGF0aWMgaW50PGJyPg0KLWhtYWNf bWQ1X2F1dGhfdGVzdHN1aXRlX3NldHVwKHZvaWQpPGJyPg0KK3RzX3NldHVwX25lZ2F0aXZlX2ht YWNfc2hhMSh2b2lkKTxicj4NCsKgezxicj4NCsKgIMKgIMKgIMKgIHN0cnVjdCBjcnlwdG9fdGVz dHN1aXRlX3BhcmFtcyAqdHNfcGFyYW1zID0gJmFtcDt0ZXN0c3VpdGVfcGFyYW1zOzxicj4NCsKg IMKgIMKgIMKgIHVpbnQ4X3QgZGV2X2lkID0gdHNfcGFyYW1zLSZndDt2YWxpZF9kZXZzWzBdOzxi cj4NCsKgIMKgIMKgIMKgIHN0cnVjdCBydGVfY3J5cHRvZGV2X2luZm8gZGV2X2luZm87PGJyPg0K K8KgIMKgIMKgIMKgY29uc3QgZW51bSBydGVfY3J5cHRvX2NpcGhlcl9hbGdvcml0aG0gY2lwaGVy c1tdID0gezxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFJURV9DUllQVE9fQ0lQSEVSX0FF U19DQkM8YnI+DQorwqAgwqAgwqAgwqB9Ozxicj4NCsKgIMKgIMKgIMKgIGNvbnN0IGVudW0gcnRl X2NyeXB0b19hdXRoX2FsZ29yaXRobSBhdXRoc1tdID0gezxicj4NCi3CoCDCoCDCoCDCoCDCoCDC oCDCoCDCoFJURV9DUllQVE9fQVVUSF9NRDVfSE1BQzxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoFJURV9DUllQVE9fQVVUSF9TSEExX0hNQUM8YnI+DQrCoCDCoCDCoCDCoCB9Ozxicj4NCjxi cj4NCsKgIMKgIMKgIMKgIHJ0ZV9jcnlwdG9kZXZfaW5mb19nZXQoZGV2X2lkLCAmYW1wO2Rldl9p bmZvKTs8YnI+DQpAQCAtMTE0MSwxMTkgKzExNjQsMjg2IEBAIGhtYWNfbWQ1X2F1dGhfdGVzdHN1 aXRlX3NldHVwKHZvaWQpPGJyPg0KwqAgwqAgwqAgwqAgaWYgKCEoZGV2X2luZm8uZmVhdHVyZV9m bGFncyAmYW1wOyBSVEVfQ1JZUFRPREVWX0ZGX1NZTU1FVFJJQ19DUllQVE8pIHx8PGJyPg0KwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgKChnbG9iYWxfYXBpX3Rlc3RfdHlwZSA9 PSBDUllQVE9ERVZfUkFXX0FQSV9URVNUKSAmYW1wOyZhbXA7PGJyPg0KwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgIShkZXZfaW5mby5mZWF0dXJlX2ZsYWdzICZhbXA7IFJURV9D UllQVE9ERVZfRkZfU1lNX1JBV19EUCkpKSB7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg UlRFX0xPRyhJTkZPLCBVU0VSMSwgJnF1b3Q7RmVhdHVyZSBmbGFnIHJlcXVpcmVtZW50cyBmb3Ig SE1BQyBNRDUgJnF1b3Q7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgJnF1b3Q7QXV0aCB0ZXN0c3VpdGUgbm90IG1ldFxuJnF1b3Q7KTs8YnI+DQor wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBSVEVfTE9HKElORk8sIFVTRVIxLCAmcXVvdDtGZWF0dXJl IGZsYWcgcmVxdWlyZW1lbnRzIGZvciBOZWdhdGl2ZSAmcXVvdDs8YnI+DQorwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmcXVvdDtITUFDIFNIQTEgdGVzdHN1 aXRlIG5vdCBtZXRcbiZxdW90Oyk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcmV0dXJu IFRFU1RfU0tJUFBFRDs8YnI+DQrCoCDCoCDCoCDCoCB9PGJyPg0KPGJyPg0KLcKgIMKgIMKgIMKg aWYgKGNoZWNrX2F1dGhfY2FwYWJpbGl0aWVzX3N1cHBvcnRlZChhdXRocywgUlRFX0RJTShhdXRo cykpICE9IDApIHs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBSVEVfTE9HKElORk8sIFVT RVIxLCAmcXVvdDtDYXBhYmlsaXR5IHJlcXVpcmVtZW50cyBmb3IgSE1BQyBNRDUgJnF1b3Q7PGJy Pg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJnF1b3Q7 dGVzdHN1aXRlIG5vdCBtZXRcbiZxdW90Oyk7PGJyPg0KK8KgIMKgIMKgIMKgaWYgKGNoZWNrX2Np cGhlcl9jYXBhYmlsaXRpZXNfc3VwcG9ydGVkKGNpcGhlcnMsIFJURV9ESU0oY2lwaGVycykpICE9 IDA8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmYW1wOyZhbXA7IGNo ZWNrX2F1dGhfY2FwYWJpbGl0aWVzX3N1cHBvcnRlZChhdXRocyw8YnI+DQorwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBSVEVfRElNKGF1dGhzKSkgIT0gMCkgezxicj4NCivCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoFJURV9MT0coSU5GTywgVVNFUjEsICZxdW90O0NhcGFiaWxpdHkg cmVxdWlyZW1lbnRzIGZvciBOZWdhdGl2ZSAmcXVvdDs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmcXVvdDtITUFDIFNIQTEgdGVzdHN1aXRlIG5v dCBtZXRcbiZxdW90Oyk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcmV0dXJuIFRFU1Rf U0tJUFBFRDs8YnI+DQrCoCDCoCDCoCDCoCB9PGJyPg0KK8KgIMKgIMKgIMKgVEVTVF9BU1NFUlRf U1VDQ0VTUyhkZXZfc3RhcnQoKSwgJnF1b3Q7RmFpbGVkIHRvIHN0YXJ0IHRoZSBkZXZpY2UmcXVv dDspOzxicj4NCjxicj4NCsKgIMKgIMKgIMKgIHJldHVybiAwOzxicj4NCsKgfTxicj4NCjxicj4N CsKgc3RhdGljIGludDxicj4NCi1rYXN1bWlfdGVzdHN1aXRlX3NldHVwKHZvaWQpPGJyPg0KK3Rz X3NldHVwX2NyeXB0b19nZW4odm9pZCk8YnI+DQrCoHs8YnI+DQotwqAgwqAgwqAgwqBzdHJ1Y3Qg Y3J5cHRvX3Rlc3RzdWl0ZV9wYXJhbXMgKnRzX3BhcmFtcyA9ICZhbXA7dGVzdHN1aXRlX3BhcmFt czs8YnI+DQotwqAgwqAgwqAgwqB1aW50OF90IGRldl9pZCA9IHRzX3BhcmFtcy0mZ3Q7dmFsaWRf ZGV2c1swXTs8YnI+DQotwqAgwqAgwqAgwqBzdHJ1Y3QgcnRlX2NyeXB0b2Rldl9pbmZvIGRldl9p bmZvOzxicj4NCivCoCDCoCDCoCDCoHJldHVybiAwOzxicj4NCit9PGJyPg0KKzxicj4NCitzdGF0 aWMgaW50PGJyPg0KK3RzX3NldHVwX211bHRpX3Nlc3Npb24odm9pZCk8YnI+DQorezxicj4NCivC oCDCoCDCoCDCoGRldl9zdG9wKCk7PGJyPg0KwqAgwqAgwqAgwqAgY29uc3QgZW51bSBydGVfY3J5 cHRvX2NpcGhlcl9hbGdvcml0aG0gY2lwaGVyc1tdID0gezxicj4NCi3CoCDCoCDCoCDCoCDCoCDC oCDCoCDCoFJURV9DUllQVE9fQ0lQSEVSX0tBU1VNSV9GODxicj4NCivCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoFJURV9DUllQVE9fQ0lQSEVSX0FFU19DQkM8YnI+DQrCoCDCoCDCoCDCoCB9Ozxicj4N CsKgIMKgIMKgIMKgIGNvbnN0IGVudW0gcnRlX2NyeXB0b19hdXRoX2FsZ29yaXRobSBhdXRoc1td ID0gezxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFJURV9DUllQVE9fQVVUSF9LQVNVTUlf Rjk8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBSVEVfQ1JZUFRPX0FVVEhfU0hBNTEyX0hN QUM8YnI+DQrCoCDCoCDCoCDCoCB9Ozxicj4NCjxicj4NCi3CoCDCoCDCoCDCoHJ0ZV9jcnlwdG9k ZXZfaW5mb19nZXQoZGV2X2lkLCAmYW1wO2Rldl9pbmZvKTs8YnI+DQotPGJyPg0KLcKgIMKgIMKg IMKgaWYgKCEoZGV2X2luZm8uZmVhdHVyZV9mbGFncyAmYW1wOyBSVEVfQ1JZUFRPREVWX0ZGX1NZ TU1FVFJJQ19DUllQVE8pIHx8PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgKChnbG9iYWxfYXBpX3Rlc3RfdHlwZSA9PSBDUllQVE9ERVZfUkFXX0FQSV9URVNUKSAmYW1w OyZhbXA7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIShkZXZfaW5m by5mZWF0dXJlX2ZsYWdzICZhbXA7IFJURV9DUllQVE9ERVZfRkZfU1lNX1JBV19EUCkpKSB7PGJy Pg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgUlRFX0xPRyhJTkZPLCBVU0VSMSwgJnF1b3Q7RmVh dHVyZSBmbGFnIHJlcXVpcmVtZW50cyBmb3IgS2FzdW1pICZxdW90Ozxicj4NCi3CoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZxdW90O3Rlc3RzdWl0ZSBub3Qg bWV0XG4mcXVvdDspOzxicj4NCivCoCDCoCDCoCDCoGlmIChjaGVja19jaXBoZXJfY2FwYWJpbGl0 aWVzX3N1cHBvcnRlZChjaXBoZXJzLCBSVEVfRElNKGNpcGhlcnMpKSAhPSAwPGJyPg0KK8KgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJmFtcDsmYW1wOyBjaGVja19hdXRoX2NhcGFi aWxpdGllc19zdXBwb3J0ZWQoYXV0aHMsPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgUlRFX0RJTShhdXRocykpICE9IDApIHs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqBSVEVfTE9HKElORk8sIFVTRVIxLCAmcXVvdDtDYXBhYmlsaXR5IHJlcXVpcmVtZW50cyBm b3IgTXVsdGkgJnF1b3Q7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgJnF1b3Q7U2Vzc2lvbiB0ZXN0c3VpdGUgbm90IG1ldFxuJnF1b3Q7KTs8YnI+ DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCByZXR1cm4gVEVTVF9TS0lQUEVEOzxicj4NCsKgIMKg IMKgIMKgIH08YnI+DQorwqAgwqAgwqAgwqBURVNUX0FTU0VSVF9TVUNDRVNTKGRldl9zdGFydCgp LCAmcXVvdDtGYWlsZWQgdG8gc3RhcnQgdGhlIGRldmljZSZxdW90Oyk7PGJyPg0KKzxicj4NCivC oCDCoCDCoCDCoHJldHVybiAwOzxicj4NCit9PGJyPg0KKzxicj4NCitzdGF0aWMgaW50PGJyPg0K K3RzX3Rlc3RzdWl0ZV9udWxsKHZvaWQpPGJyPg0KK3s8YnI+DQorwqAgwqAgwqAgwqBjb25zdCBl bnVtIHJ0ZV9jcnlwdG9fY2lwaGVyX2FsZ29yaXRobSBjaXBoZXJzW10gPSB7PGJyPg0KK8KgIMKg IMKgIMKgIMKgIMKgIMKgIMKgUlRFX0NSWVBUT19DSVBIRVJfTlVMTDxicj4NCivCoCDCoCDCoCDC oH07PGJyPg0KK8KgIMKgIMKgIMKgY29uc3QgZW51bSBydGVfY3J5cHRvX2F1dGhfYWxnb3JpdGht IGF1dGhzW10gPSB7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgUlRFX0NSWVBUT19BVVRI X05VTEw8YnI+DQorwqAgwqAgwqAgwqB9Ozxicj4NCjxicj4NCsKgIMKgIMKgIMKgIGlmIChjaGVj a19jaXBoZXJfY2FwYWJpbGl0aWVzX3N1cHBvcnRlZChjaXBoZXJzLCBSVEVfRElNKGNpcGhlcnMp KSAhPSAwPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgJmFtcDsmYW1w OyBjaGVja19hdXRoX2NhcGFiaWxpdGllc19zdXBwb3J0ZWQoYXV0aHMsPGJyPg0KwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgUlRFX0RJTShhdXRocykpICE9IDApIHs8YnI+DQot wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBSVEVfTE9HKElORk8sIFVTRVIxLCAmcXVvdDtDYXBhYmls aXR5IHJlcXVpcmVtZW50cyBmb3IgS2FzdW1pICZxdW90Ozxicj4NCivCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoFJURV9MT0coSU5GTywgVVNFUjEsICZxdW90O0NhcGFiaWxpdHkgcmVxdWlyZW1lbnRz IGZvciBOVUxMICZxdW90Ozxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgICZxdW90O3Rlc3RzdWl0ZSBub3QgbWV0XG4mcXVvdDspOzxicj4NCsKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIHJldHVybiBURVNUX1NLSVBQRUQ7PGJyPg0KwqAgwqAgwqAgwqAg fTxicj4NCivCoCDCoCDCoCDCoFRFU1RfQVNTRVJUX1NVQ0NFU1MoZGV2X3N0YXJ0KCksICZxdW90 O0ZhaWxlZCB0byBzdGFydCB0aGUgZGV2aWNlJnF1b3Q7KTs8YnI+DQo8YnI+DQrCoCDCoCDCoCDC oCByZXR1cm4gMDs8YnI+DQrCoH08YnI+DQo8YnI+DQotc3RhdGljIGludDxicj4NCi1uZWdhdGl2 ZV9hZXNfZ2NtX3Rlc3RzdWl0ZV9zZXR1cCh2b2lkKTxicj4NCitzdGF0aWMgdm9pZDxicj4NCit0 c190ZWFyZG93bl9nZW5lcmljKHZvaWQpPGJyPg0KK3s8YnI+DQorwqAgwqAgwqAgwqBkZXZfc3Rv cCgpOzxicj4NCit9PGJyPg0KKzxicj4NCisvKjxicj4NCisgKiBUaGlzIGZ1bmN0aW9ucyBhcmUg cmVzcG9uc2JpbGUgZm9yIGNvbnN0cnVjdGlvbi9kZXN0cnVjdGlvbiBvZiBpbmRpdmlkdWFsIHVu aXQgdGVzdCBjb250ZXh0Ljxicj4NCisgKi88YnI+DQorPGJyPg0KK2ludDxicj4NCit1dF9zZXR1 cCh2b2lkKTxicj4NCit7PGJyPg0KK8KgIMKgIMKgIMKgbWVtc2V0KHNlbGYsIDAsIHNpemVvZigq c2VsZikpOzxicj4NCivCoCDCoCDCoCDCoHNlbGYtJmd0O29wID0gcnRlX2NyeXB0b19vcF9hbGxv Yyh0ZXN0c3VpdGVfcGFyYW1zLm9wX21wb29sLDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoFJURV9DUllQVE9fT1BfVFlQRV9TWU1NRVRSSUMpOzxicj4NCivCoCDCoCDC oCDCoFRFU1RfQVNTRVJUX05PVF9OVUxMKHNlbGYtJmd0O29wLDxicj4NCivCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZxdW90O0ZhaWxlZCB0byBhbGxvY2F0ZSBzeW1tZXRyaWMg Y3J5cHRvIG9wZXJhdGlvbiBzdHJ1Y3QmcXVvdDspOzxicj4NCivCoCDCoCDCoCDCoHJldHVybiBU RVNUX1NVQ0NFU1M7PGJyPg0KK308YnI+DQorPGJyPg0KKy8qPGJyPg0KKyAqIERlc3RydWN0IHVu aXQgdGVzdCBjb250ZXh0LCBzaW5nbGUgb3AsIHNpbmdsZS9tdWx0aXBsZSBidWZmZXIuPGJyPg0K KyAqLzxicj4NCis8YnI+DQorc3RhdGljIHZvaWQ8YnI+DQordXRfdGVhcmRvd25fYWVzX2djbSh2 b2lkKTxicj4NCit7PGJyPg0KK8KgIMKgIMKgIMKgaWYgKHNlbGYtJmd0O3Nlc3MpIHs8YnI+DQor wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBydGVfY3J5cHRvZGV2X3N5bV9zZXNzaW9uX2ZyZWUocF90 c19wYXJhbXMtJmd0O3ZhbGlkX2RldnNbMF0sPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgc2VsZi0mZ3Q7c2Vzcyk7PGJyPg0KK8KgIMKgIMKgIMKg IMKgIMKgIMKgIMKgc2VsZi0mZ3Q7c2VzcyA9IE5VTEw7PGJyPg0KK8KgIMKgIMKgIMKgfTxicj4N CivCoCDCoCDCoCDCoHJ0ZV9jcnlwdG9fb3BfZnJlZShzZWxmLSZndDtvcCk7PGJyPg0KK8KgIMKg IMKgIMKgcnRlX3BrdG1idWZfZnJlZShzZWxmLSZndDtpYnVmKTs8YnI+DQorwqAgwqAgwqAgwqBy dGVfcGt0bWJ1Zl9mcmVlKHNlbGYtJmd0O29idWYpOzxicj4NCivCoCDCoCDCoCDCoHNlbGYtJmd0 O2lidWYgPSAwOzxicj4NCit9PGJyPg0KKzxicj4NCit2b2lkPGJyPg0KK3V0X3RlYXJkb3duKHZv aWQpPGJyPg0KwqB7PGJyPg0KwqAgwqAgwqAgwqAgc3RydWN0IGNyeXB0b190ZXN0c3VpdGVfcGFy YW1zICp0c19wYXJhbXMgPSAmYW1wO3Rlc3RzdWl0ZV9wYXJhbXM7PGJyPg0KLcKgIMKgIMKgIMKg dWludDhfdCBkZXZfaWQgPSB0c19wYXJhbXMtJmd0O3ZhbGlkX2RldnNbMF07PGJyPg0KLcKgIMKg IMKgIMKgc3RydWN0IHJ0ZV9jcnlwdG9kZXZfaW5mbyBkZXZfaW5mbzs8YnI+DQotwqAgwqAgwqAg wqBjb25zdCBlbnVtIHJ0ZV9jcnlwdG9fYWVhZF9hbGdvcml0aG0gYWVhZHNbXSA9IHs8YnI+DQot wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBSVEVfQ1JZUFRPX0FFQURfQUVTX0dDTTxicj4NCi3CoCDC oCDCoCDCoH07PGJyPg0KK8KgIMKgIMKgIMKgc3RydWN0IGNyeXB0b191bml0dGVzdF9wYXJhbXMg KnV0X3BhcmFtcyA9ICZhbXA7dW5pdHRlc3RfcGFyYW1zOzxicj4NCjxicj4NCi3CoCDCoCDCoCDC oHJ0ZV9jcnlwdG9kZXZfaW5mb19nZXQoZGV2X2lkLCAmYW1wO2Rldl9pbmZvKTs8YnI+DQorwqAg wqAgwqAgwqAvKiBmcmVlIGNyeXB0byBzZXNzaW9uIHN0cnVjdHVyZSAqLzxicj4NCisjaWZkZWYg UlRFX0xJQl9TRUNVUklUWTxicj4NCivCoCDCoCDCoCDCoGlmICh1dF9wYXJhbXMtJmd0O3R5cGUg PT0gUlRFX1NFQ1VSSVRZX0FDVElPTl9UWVBFX0xPT0tBU0lERV9QUk9UT0NPTCkgezxicj4NCivC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmICh1dF9wYXJhbXMtJmd0O3NlY19zZXNzaW9uKSB7PGJy Pg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcnRlX3NlY3VyaXR5X3Nlc3Np b25fZGVzdHJveShydGVfY3J5cHRvZGV2X2dldF9zZWNfY3R4PGJyPg0KK8KgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg KHRzX3BhcmFtcy0mZ3Q7dmFsaWRfZGV2c1swXSksPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdXRfcGFy YW1zLSZndDtzZWNfc2Vzc2lvbik7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgdXRfcGFyYW1zLSZndDtzZWNfc2Vzc2lvbiA9IE5VTEw7PGJyPg0KK8KgIMKgIMKgIMKg IMKgIMKgIMKgIMKgfTxicj4NCivCoCDCoCDCoCDCoH0gZWxzZTxicj4NCisjZW5kaWY8YnI+DQor wqAgwqAgwqAgwqB7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKHV0X3BhcmFtcy0m Z3Q7c2Vzcykgezxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJ0ZV9j cnlwdG9kZXZfc3ltX3Nlc3Npb25fZnJlZSh0c19wYXJhbXMtJmd0O3ZhbGlkX2RldnNbMF0sPGJy Pg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgdXRfcGFyYW1zLSZndDtzZXNzKTs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqB1dF9wYXJhbXMtJmd0O3Nlc3MgPSBOVUxMOzxicj4NCivCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoH08YnI+DQorwqAgwqAgwqAgwqB9PGJyPg0KPGJyPg0KLcKgIMKgIMKgIMKgaWYg KCEoZGV2X2luZm8uZmVhdHVyZV9mbGFncyAmYW1wOyBSVEVfQ1JZUFRPREVWX0ZGX1NZTU1FVFJJ Q19DUllQVE8pIHx8PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgKChn bG9iYWxfYXBpX3Rlc3RfdHlwZSA9PSBDUllQVE9ERVZfUkFXX0FQSV9URVNUKSAmYW1wOyZhbXA7 PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIShkZXZfaW5mby5mZWF0 dXJlX2ZsYWdzICZhbXA7IFJURV9DUllQVE9ERVZfRkZfU1lNX1JBV19EUCkpKSB7PGJyPg0KLcKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgUlRFX0xPRyhJTkZPLCBVU0VSMSwgJnF1b3Q7RmVhdHVyZSBm bGFnIHJlcXVpcmVtZW50cyBmb3IgTmVnYXRpdmUgJnF1b3Q7PGJyPg0KLcKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJnF1b3Q7QUVTIEdDTSB0ZXN0c3VpdGUg bm90IG1ldFxuJnF1b3Q7KTs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqByZXR1cm4gVEVT VF9TS0lQUEVEOzxicj4NCivCoCDCoCDCoCDCoC8qIGZyZWUgY3J5cHRvIG9wZXJhdGlvbiBzdHJ1 Y3R1cmUgKi88YnI+DQorwqAgwqAgwqAgwqBydGVfY3J5cHRvX29wX2ZyZWUodXRfcGFyYW1zLSZn dDtvcCk7PGJyPg0KKzxicj4NCivCoCDCoCDCoCDCoC8qPGJyPg0KK8KgIMKgIMKgIMKgICogZnJl ZSBtYnVmIC0gYm90aCBvYnVmIGFuZCBpYnVmIGFyZSB1c3VhbGx5IHRoZSBzYW1lLDxicj4NCivC oCDCoCDCoCDCoCAqIHNvIGNoZWNrIGlmIHRoZXkgcG9pbnQgYXQgdGhlIHNhbWUgYWRkcmVzcyBp cyBuZWNlc3NhcnksPGJyPg0KK8KgIMKgIMKgIMKgICogdG8gYXZvaWQgZnJlZWluZyB0aGUgbWJ1 ZiB0d2ljZS48YnI+DQorwqAgwqAgwqAgwqAgKi88YnI+DQorwqAgwqAgwqAgwqBpZiAodXRfcGFy YW1zLSZndDtvYnVmKSB7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcnRlX3BrdG1idWZf ZnJlZSh1dF9wYXJhbXMtJmd0O29idWYpOzxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlm ICh1dF9wYXJhbXMtJmd0O2lidWYgPT0gdXRfcGFyYW1zLSZndDtvYnVmKTxicj4NCivCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHV0X3BhcmFtcy0mZ3Q7aWJ1ZiA9IDA7PGJyPg0K K8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdXRfcGFyYW1zLSZndDtvYnVmID0gMDs8YnI+DQorwqAg wqAgwqAgwqB9PGJyPg0KK8KgIMKgIMKgIMKgaWYgKHV0X3BhcmFtcy0mZ3Q7aWJ1Zikgezxicj4N CivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGV4dF9tYnVmX21lbXpvbmVfZnJlZSgxKTs8YnI+DQor wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBydGVfcGt0bWJ1Zl9mcmVlKHV0X3BhcmFtcy0mZ3Q7aWJ1 Zik7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdXRfcGFyYW1zLSZndDtpYnVmID0gMDs8 YnI+DQrCoCDCoCDCoCDCoCB9PGJyPg0KPGJyPg0KLcKgIMKgIMKgIMKgaWYgKGNoZWNrX2FlYWRf Y2FwYWJpbGl0aWVzX3N1cHBvcnRlZChhZWFkcywgUlRFX0RJTShhZWFkcykpICE9IDApIHs8YnI+ DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBSVEVfTE9HKElORk8sIFVTRVIxLCAmcXVvdDtDYXBh YmlsaXR5IHJlcXVpcmVtZW50cyBmb3IgTmVnYXRpdmUgJnF1b3Q7PGJyPg0KLcKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJnF1b3Q7QUVTIEdDTSB0ZXN0c3Vp dGUgbm90IG1ldFxuJnF1b3Q7KTs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqByZXR1cm4g VEVTVF9TS0lQUEVEOzxicj4NCivCoCDCoCDCoCDCoGlmICh0c19wYXJhbXMtJmd0O21idWZfcG9v bCAhPSBOVUxMKTxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFJURV9MT0coREVCVUcsIFVT RVIxLCAmcXVvdDtDUllQVE9fTUJVRlBPT0wgY291bnQgJXVcbiZxdW90Oyw8YnI+DQorwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBydGVfbWVtcG9vbF9hdmFpbF9jb3VudCh0c19w YXJhbXMtJmd0O21idWZfcG9vbCkpOzxicj4NCit9PGJyPg0KKzxicj4NCitzdGF0aWMgaW50PGJy Pg0KK3V0X3NldHVwX3NlY3VyaXR5KHZvaWQpPGJyPg0KK3s8YnI+DQorwqAgwqAgwqAgwqAvKiBD b25maWd1cmUgYW5kIHN0YXJ0IHRoZSBkZXZpY2Ugd2l0aCBubyBmZWF0dXJlcyBkaXNhYmxlZCAq Lzxicj4NCivCoCDCoCDCoCDCoHJldHVybiBkZXZfY29uZmlndXJlX2FuZF9zdGFydCgwKTs8YnI+ DQorPGJyPg0KK8KgIMKgIMKgIMKgbWVtc2V0KHNlbGYsIDAsIHNpemVvZigqc2VsZikpOzxicj4N CivCoCDCoCDCoCDCoHNlbGYtJmd0O29wID0gcnRlX2NyeXB0b19vcF9hbGxvYyh0ZXN0c3VpdGVf cGFyYW1zLm9wX21wb29sLDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oFJURV9DUllQVE9fT1BfVFlQRV9TWU1NRVRSSUMpOzxicj4NCivCoCDCoCDCoCDCoFRFU1RfQVNT RVJUX05PVF9OVUxMKHNlbGYtJmd0O29wLDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCZxdW90O0ZhaWxlZCB0byBhbGxvY2F0ZSBzeW1tZXRyaWMgY3J5cHRvIG9wZXJh dGlvbiBzdHJ1Y3QmcXVvdDspOzxicj4NCivCoCDCoCDCoCDCoHJldHVybiBURVNUX1NVQ0NFU1M7 PGJyPg0KK308YnI+DQorPGJyPg0KK3N0YXRpYyBpbnQ8YnI+DQorY2hlY2tfY2FwYWJpbGl0aWVz X3N1cHBvcnRlZChlbnVtIHJ0ZV9jcnlwdG9fc3ltX3hmb3JtX3R5cGUgdHlwZSw8YnI+DQorwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBjb25zdCBpbnQgKmFsZ3MsIHVpbnQxNl90IG51bV9hbGdzKTxi cj4NCit7PGJyPg0KK8KgIMKgIMKgIMKgdWludDhfdCBkZXZfaWQgPSB0ZXN0c3VpdGVfcGFyYW1z LnZhbGlkX2RldnNbMF07PGJyPg0KK8KgIMKgIMKgIMKgYm9vbCBzb21lX2FsZ19zdXBwb3J0ZWQg PSBGQUxTRTs8YnI+DQorwqAgwqAgwqAgwqB1aW50MTZfdCBpOzxicj4NCis8YnI+DQorwqAgwqAg wqAgwqBmb3IgKGkgPSAwOyBpICZsdDsgbnVtX2FsZ3MgJmFtcDsmYW1wOyAhc29tZV9hbGdfc3Vw cG9ydGVkOyBpKyspIHs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBzdHJ1Y3QgcnRlX2Ny eXB0b2Rldl9zeW1fY2FwYWJpbGl0eV9pZHggYWxnID0gezxicj4NCivCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoHR5cGUsIHthbGdzW2ldfTxicj4NCivCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoH07PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKHJ0ZV9jcnlwdG9kZXZf c3ltX2NhcGFiaWxpdHlfZ2V0KGRldl9pZCw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmYW1wO2FsZykgIT0gTlVMTCk8YnI+DQorwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBzb21lX2FsZ19zdXBwb3J0ZWQgPSBUUlVFOzxicj4N CsKgIMKgIMKgIMKgIH08YnI+DQorwqAgwqAgwqAgwqBpZiAoIXNvbWVfYWxnX3N1cHBvcnRlZCk8 YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqByZXR1cm4gVEVTVF9TS0lQUEVEOzxicj4NCjxi cj4NCsKgIMKgIMKgIMKgIHJldHVybiAwOzxicj4NCsKgfTxicj4NCjxicj4NCitpbnQ8YnI+DQor Y2hlY2tfY2lwaGVyX2NhcGFiaWxpdGllc19zdXBwb3J0ZWQoY29uc3QgZW51bSBydGVfY3J5cHRv X2NpcGhlcl9hbGdvcml0aG0gKmNpcGhlcnMsPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKg dWludDE2X3QgbnVtX2NpcGhlcnMpPGJyPg0KK3s8YnI+DQorwqAgwqAgwqAgwqByZXR1cm4gY2hl Y2tfY2FwYWJpbGl0aWVzX3N1cHBvcnRlZChSVEVfQ1JZUFRPX1NZTV9YRk9STV9DSVBIRVIsPGJy Pg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgKGNvbnN0IGludCAqKSBjaXBo ZXJzLCBudW1fY2lwaGVycyk7PGJyPg0KK308YnI+DQorPGJyPg0KK2ludDxicj4NCitjaGVja19h dXRoX2NhcGFiaWxpdGllc19zdXBwb3J0ZWQoY29uc3QgZW51bSBydGVfY3J5cHRvX2F1dGhfYWxn b3JpdGhtICphdXRocyw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB1aW50MTZfdCBudW1f YXV0aHMpPGJyPg0KK3s8YnI+DQorwqAgwqAgwqAgwqByZXR1cm4gY2hlY2tfY2FwYWJpbGl0aWVz X3N1cHBvcnRlZChSVEVfQ1JZUFRPX1NZTV9YRk9STV9BVVRILDxicj4NCivCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoChjb25zdCBpbnQgKikgYXV0aHMsIG51bV9hdXRocyk7PGJy Pg0KK308YnI+DQorPGJyPg0KK2ludDxicj4NCitjaGVja19hZWFkX2NhcGFiaWxpdGllc19zdXBw b3J0ZWQoY29uc3QgZW51bSBydGVfY3J5cHRvX2FlYWRfYWxnb3JpdGhtICphZWFkcyw8YnI+DQor wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB1aW50MTZfdCBudW1fYWVhZHMpPGJyPg0KK3s8YnI+DQor wqAgwqAgwqAgwqByZXR1cm4gY2hlY2tfY2FwYWJpbGl0aWVzX3N1cHBvcnRlZChSVEVfQ1JZUFRP X1NZTV9YRk9STV9BRUFELDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oChjb25zdCBpbnQgKikgYWVhZHMsIG51bV9hZWFkcyk7PGJyPg0KK308YnI+DQorPGJyPg0KKyNp ZmRlZiBSVEVfTElCX1NFQ1VSSVRZPGJyPg0KwqBzdGF0aWMgaW50PGJyPg0KLW5lZ2F0aXZlX2Fl c19nbWFjX3Rlc3RzdWl0ZV9zZXR1cCh2b2lkKTxicj4NCitzZWNfcHJvdG9fdGVzdHN1aXRlX3Nl dHVwKGVudW0gcnRlX3NlY3VyaXR5X3Nlc3Npb25fcHJvdG9jb2wgcHJvdG9jb2wpPGJyPg0KwqB7 PGJyPg0KwqAgwqAgwqAgwqAgc3RydWN0IGNyeXB0b190ZXN0c3VpdGVfcGFyYW1zICp0c19wYXJh bXMgPSAmYW1wO3Rlc3RzdWl0ZV9wYXJhbXM7PGJyPg0KLcKgIMKgIMKgIMKgdWludDhfdCBkZXZf aWQgPSB0c19wYXJhbXMtJmd0O3ZhbGlkX2RldnNbMF07PGJyPg0KK8KgIMKgIMKgIMKgc3RydWN0 IGNyeXB0b191bml0dGVzdF9wYXJhbXMgKnV0X3BhcmFtcyA9ICZhbXA7dW5pdHRlc3RfcGFyYW1z Ozxicj4NCsKgIMKgIMKgIMKgIHN0cnVjdCBydGVfY3J5cHRvZGV2X2luZm8gZGV2X2luZm87PGJy Pg0KLcKgIMKgIMKgIMKgY29uc3QgZW51bSBydGVfY3J5cHRvX2F1dGhfYWxnb3JpdGhtIGF1dGhz W10gPSB7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgUlRFX0NSWVBUT19BVVRIX0FFU19H TUFDPGJyPg0KLcKgIMKgIMKgIMKgfTs8YnI+DQorwqAgwqAgwqAgwqBpbnQgcmV0ID0gMDs8YnI+ DQo8YnI+DQotwqAgwqAgwqAgwqBydGVfY3J5cHRvZGV2X2luZm9fZ2V0KGRldl9pZCwgJmFtcDtk ZXZfaW5mbyk7PGJyPg0KK8KgIMKgIMKgIMKgcnRlX2NyeXB0b2Rldl9pbmZvX2dldCh0c19wYXJh bXMtJmd0O3ZhbGlkX2RldnNbMF0sICZhbXA7ZGV2X2luZm8pOzxicj4NCjxicj4NCi3CoCDCoCDC oCDCoGlmICghKGRldl9pbmZvLmZlYXR1cmVfZmxhZ3MgJmFtcDsgUlRFX0NSWVBUT0RFVl9GRl9T WU1NRVRSSUNfQ1JZUFRPKSB8fDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCgoZ2xvYmFsX2FwaV90ZXN0X3R5cGUgPT0gQ1JZUFRPREVWX1JBV19BUElfVEVTVCkgJmFt cDsmYW1wOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCEoZGV2X2lu Zm8uZmVhdHVyZV9mbGFncyAmYW1wOyBSVEVfQ1JZUFRPREVWX0ZGX1NZTV9SQVdfRFApKSkgezxi cj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFJURV9MT0coSU5GTywgVVNFUjEsICZxdW90O0Zl YXR1cmUgZmxhZyByZXF1aXJlbWVudHMgZm9yIE5lZ2F0aXZlICZxdW90Ozxicj4NCi3CoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZxdW90O0FFUyBHTUFDIHRl c3RzdWl0ZSBub3QgbWV0XG4mcXVvdDspOzxicj4NCivCoCDCoCDCoCDCoGlmICghKGRldl9pbmZv LmZlYXR1cmVfZmxhZ3MgJmFtcDsgUlRFX0NSWVBUT0RFVl9GRl9TRUNVUklUWSkpIHs8YnI+DQor wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBSVEVfTE9HKElORk8sIFVTRVIxLDxicj4NCivCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZxdW90O0ZlYXR1cmUgZmxhZyByZXF1aXJlbWVu dHMgZm9yIHNlY3VyaXR5IHByb3RvY29sIHRlc3RzdWl0ZSBub3QgbWV0XG4mcXVvdDspOzxicj4N CsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHJldHVybiBURVNUX1NLSVBQRUQ7PGJyPg0KwqAgwqAg wqAgwqAgfTxicj4NCjxicj4NCi3CoCDCoCDCoCDCoGlmIChjaGVja19hdXRoX2NhcGFiaWxpdGll c19zdXBwb3J0ZWQoYXV0aHMsIFJURV9ESU0oYXV0aHMpKSAhPSAwKSB7PGJyPg0KLcKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgUlRFX0xPRyhJTkZPLCBVU0VSMSwgJnF1b3Q7Q2FwYWJpbGl0eSByZXF1 aXJlbWVudHMgZm9yIE5lZ2F0aXZlICZxdW90Ozxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZxdW90O0FFUyBHTUFDIHRlc3RzdWl0ZSBub3QgbWV0 XG4mcXVvdDspOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJldHVybiBURVNUX1NLSVBQ RUQ7PGJyPg0KLcKgIMKgIMKgIMKgfTxicj4NCivCoCDCoCDCoCDCoC8qIFJlY29uZmlndXJlIHRv IGVuYWJsZSBzZWN1cml0eSAqLzxicj4NCivCoCDCoCDCoCDCoHJldCA9IGRldl9jb25maWd1cmVf YW5kX3N0YXJ0KDApOzxicj4NCivCoCDCoCDCoCDCoGlmIChyZXQgIT0gVEVTVF9TVUNDRVNTKTxi cj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJldHVybiByZXQ7PGJyPg0KKzxicj4NCivCoCDC oCDCoCDCoC8qIFNldCBhY3Rpb24gdHlwZSAqLzxicj4NCivCoCDCoCDCoCDCoHV0X3BhcmFtcy0m Z3Q7dHlwZSA9IFJURV9TRUNVUklUWV9BQ1RJT05fVFlQRV9MT09LQVNJREVfUFJPVE9DT0w7PGJy Pg0KKzxicj4NCivCoCDCoCDCoCDCoGlmIChzZWN1cml0eV9wcm90b19zdXBwb3J0ZWQoUlRFX1NF Q1VSSVRZX0FDVElPTl9UWVBFX0xPT0tBU0lERV9QUk9UT0NPTCwgcHJvdG9jb2wpICZsdDsgMCkg ezxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFJURV9MT0coSU5GTywgVVNFUjEsPGJyPg0K K8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJnF1b3Q7Q2FwYWJpbGl0eSByZXF1 aXJlbWVudHMgZm9yIHNlY3VyaXR5IHByb3RvY29sIHRlc3Qgbm90IG1ldFxuJnF1b3Q7KTs8YnI+ DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqByZXQgPSBURVNUX1NLSVBQRUQ7PGJyPg0KK8KgIMKg IMKgIMKgfTxicj4NCis8YnI+DQorwqAgwqAgwqAgwqB0ZXN0X3NlY19hbGdfbGlzdF9wb3B1bGF0 ZSgpOzxicj4NCivCoCDCoCDCoCDCoHRlc3Rfc2VjX2F1dGhfb25seV9hbGdfbGlzdF9wb3B1bGF0 ZSgpOzxicj4NCis8YnI+DQorwqAgwqAgwqAgwqAvKjxicj4NCivCoCDCoCDCoCDCoCAqIFN0b3Ag dGhlIGRldmljZS4gRGV2aWNlIHdvdWxkIGJlIHN0YXJ0ZWQgYWdhaW4gYnkgaW5kaXZpZHVhbCB0 ZXN0PGJyPg0KK8KgIMKgIMKgIMKgICogY2FzZSBzZXR1cCByb3V0aW5lLjxicj4NCivCoCDCoCDC oCDCoCAqLzxicj4NCivCoCDCoCDCoCDCoHJ0ZV9jcnlwdG9kZXZfc3RvcCh0c19wYXJhbXMtJmd0 O3ZhbGlkX2RldnNbMF0pOzxicj4NCis8YnI+DQorwqAgwqAgwqAgwqByZXR1cm4gcmV0Ozxicj4N Cit9PGJyPg0KPGJyPg0KLcKgIMKgIMKgIMKgcmV0dXJuIDA7PGJyPg0KK3N0YXRpYyBpbnQ8YnI+ DQoraXBzZWNfcHJvdG9fdGVzdHN1aXRlX3NldHVwKHZvaWQpPGJyPg0KK3s8YnI+DQorwqAgwqAg wqAgwqByZXR1cm4gc2VjX3Byb3RvX3Rlc3RzdWl0ZV9zZXR1cChSVEVfU0VDVVJJVFlfUFJPVE9D T0xfSVBTRUMpOzxicj4NCit9PGJyPg0KKzxicj4NCitzdGF0aWMgaW50PGJyPg0KK3Rsc19yZWNv cmRfcHJvdG9fdGVzdHN1aXRlX3NldHVwKHZvaWQpPGJyPg0KK3s8YnI+DQorwqAgwqAgwqAgwqB0 ZXN0X3NlY19wcm90b19wYXR0ZXJuX2dlbmVyYXRlKCk7PGJyPg0KKzxicj4NCivCoCDCoCDCoCDC oHJldHVybiBzZWNfcHJvdG9fdGVzdHN1aXRlX3NldHVwKFJURV9TRUNVUklUWV9QUk9UT0NPTF9U TFNfUkVDT1JEKTs8YnI+DQrCoH08YnI+DQo8YnI+DQrCoHN0YXRpYyBpbnQ8YnI+DQotbWl4ZWRf Y2lwaGVyX2hhc2hfdGVzdHN1aXRlX3NldHVwKHZvaWQpPGJyPg0KK3BkY3BfcHJvdG9fdGVzdHN1 aXRlX3NldHVwKHZvaWQpPGJyPg0KwqB7PGJyPg0KwqAgwqAgwqAgwqAgc3RydWN0IGNyeXB0b190 ZXN0c3VpdGVfcGFyYW1zICp0c19wYXJhbXMgPSAmYW1wO3Rlc3RzdWl0ZV9wYXJhbXM7PGJyPg0K wqAgwqAgwqAgwqAgdWludDhfdCBkZXZfaWQgPSB0c19wYXJhbXMtJmd0O3ZhbGlkX2RldnNbMF07 PGJyPg0KwqAgwqAgwqAgwqAgc3RydWN0IHJ0ZV9jcnlwdG9kZXZfaW5mbyBkZXZfaW5mbzs8YnI+ DQotwqAgwqAgwqAgwqB1aW50NjRfdCBmZWF0X2ZsYWdzOzxicj4NCsKgIMKgIMKgIMKgIGNvbnN0 IGVudW0gcnRlX2NyeXB0b19jaXBoZXJfYWxnb3JpdGhtIGNpcGhlcnNbXSA9IHs8YnI+DQrCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCBSVEVfQ1JZUFRPX0NJUEhFUl9OVUxMLDxicj4NCsKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIFJURV9DUllQVE9fQ0lQSEVSX0FFU19DVFIsPGJyPg0KQEAgLTEyNjcs NDYgKzE0NTcsMjMgQEAgbWl4ZWRfY2lwaGVyX2hhc2hfdGVzdHN1aXRlX3NldHVwKHZvaWQpPGJy Pg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgUlRFX0NSWVBUT19BVVRIX1pVQ19FSUEzPGJyPg0K wqAgwqAgwqAgwqAgfTs8YnI+DQo8YnI+DQotwqAgwqAgwqAgwqBydGVfY3J5cHRvZGV2X2luZm9f Z2V0KGRldl9pZCwgJmFtcDtkZXZfaW5mbyk7PGJyPg0KLcKgIMKgIMKgIMKgZmVhdF9mbGFncyA9 IGRldl9pbmZvLmZlYXR1cmVfZmxhZ3M7PGJyPg0KLTxicj4NCi3CoCDCoCDCoCDCoGlmICghKGZl YXRfZmxhZ3MgJmFtcDsgUlRFX0NSWVBUT0RFVl9GRl9TWU1NRVRSSUNfQ1JZUFRPKSB8fDxicj4N Ci3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoChnbG9iYWxfYXBpX3Rlc3RfdHlw ZSA9PSBDUllQVE9ERVZfUkFXX0FQSV9URVNUKSkgezxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDC oCDCoFJURV9MT0coSU5GTywgVVNFUjEsICZxdW90O0ZlYXR1cmUgZmxhZyByZXF1aXJlbWVudHMg Zm9yIE1peGVkICZxdW90Ozxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCZxdW90O0NpcGhlciBIYXNoIHRlc3RzdWl0ZSBub3QgbWV0XG4mcXVvdDsp Ozxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJldHVybiBURVNUX1NLSVBQRUQ7PGJyPg0K LcKgIMKgIMKgIMKgfTxicj4NCi08YnI+DQotwqAgwqAgwqAgwqBpZiAoY2hlY2tfY2lwaGVyX2Nh cGFiaWxpdGllc19zdXBwb3J0ZWQoY2lwaGVycywgUlRFX0RJTShjaXBoZXJzKSkgIT0gMDxicj4N Ci3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZhbXA7JmFtcDsgY2hlY2tfYXV0 aF9jYXBhYmlsaXRpZXNfc3VwcG9ydGVkKGF1dGhzLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoFJURV9ESU0oYXV0aHMpKSAhPSAwKSB7PGJyPg0KLcKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgUlRFX0xPRyhJTkZPLCBVU0VSMSwgJnF1b3Q7Q2FwYWJpbGl0eSByZXF1aXJl bWVudHMgZm9yIE1peGVkICZxdW90Ozxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCZxdW90O0NpcGhlciBIYXNoIHRlc3RzdWl0ZSBub3QgbWV0XG4m cXVvdDspOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJldHVybiBURVNUX1NLSVBQRUQ7 PGJyPg0KLcKgIMKgIMKgIMKgfTxicj4NCi08YnI+DQotwqAgwqAgwqAgwqByZXR1cm4gMDs8YnI+ DQotfTxicj4NCi08YnI+DQotc3RhdGljIGludDxicj4NCi1lc25fdGVzdHN1aXRlX3NldHVwKHZv aWQpPGJyPg0KLXs8YnI+DQotwqAgwqAgwqAgwqBzdHJ1Y3QgY3J5cHRvX3Rlc3RzdWl0ZV9wYXJh bXMgKnRzX3BhcmFtcyA9ICZhbXA7dGVzdHN1aXRlX3BhcmFtczs8YnI+DQotwqAgwqAgwqAgwqB1 aW50OF90IGRldl9pZCA9IHRzX3BhcmFtcy0mZ3Q7dmFsaWRfZGV2c1swXTs8YnI+DQotwqAgwqAg wqAgwqBzdHJ1Y3QgcnRlX2NyeXB0b2Rldl9pbmZvIGRldl9pbmZvOzxicj4NCi3CoCDCoCDCoCDC oGNvbnN0IGVudW0gcnRlX2NyeXB0b19jaXBoZXJfYWxnb3JpdGhtIGNpcGhlcnNbXSA9IHs8YnI+ DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBSVEVfQ1JZUFRPX0NJUEhFUl9BRVNfQ0JDPGJyPg0K LcKgIMKgIMKgIMKgfTs8YnI+DQotwqAgwqAgwqAgwqBjb25zdCBlbnVtIHJ0ZV9jcnlwdG9fYXV0 aF9hbGdvcml0aG0gYXV0aHNbXSA9IHs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBSVEVf Q1JZUFRPX0FVVEhfU0hBMV9ITUFDPGJyPg0KLcKgIMKgIMKgIMKgfTs8YnI+DQorwqAgwqAgwqAg wqBSVEVfQlVJTERfQlVHX09OKFJURV9ESU0ocGRjcF90ZXN0X3BhcmFtcykgIT0gUlRFX0RJTShw ZGNwX3Rlc3RfYXV0aF9rZXkpKTs8YnI+DQorwqAgwqAgwqAgwqBSVEVfQlVJTERfQlVHX09OKFJU RV9ESU0ocGRjcF90ZXN0X3BhcmFtcykgIT0gUlRFX0RJTShwZGNwX3Rlc3RfYmVhcmVyKSk7PGJy Pg0KK8KgIMKgIMKgIMKgUlRFX0JVSUxEX0JVR19PTihSVEVfRElNKHBkY3BfdGVzdF9wYXJhbXMp ICE9IFJURV9ESU0ocGRjcF90ZXN0X2NyeXB0b19rZXkpKTs8YnI+DQorwqAgwqAgwqAgwqBSVEVf QlVJTERfQlVHX09OKFJURV9ESU0ocGRjcF90ZXN0X3BhcmFtcykgIT0gUlRFX0RJTShwZGNwX3Rl c3RfZGF0YV9pbikpOzxicj4NCivCoCDCoCDCoCDCoFJURV9CVUlMRF9CVUdfT04oUlRFX0RJTShw ZGNwX3Rlc3RfcGFyYW1zKSAhPSBSVEVfRElNKHBkY3BfdGVzdF9kYXRhX2luX2xlbikpOzxicj4N CivCoCDCoCDCoCDCoFJURV9CVUlMRF9CVUdfT04oUlRFX0RJTShwZGNwX3Rlc3RfcGFyYW1zKSAh PSBSVEVfRElNKHBkY3BfdGVzdF9kYXRhX291dCkpOzxicj4NCivCoCDCoCDCoCDCoFJURV9CVUlM RF9CVUdfT04oUlRFX0RJTShwZGNwX3Rlc3RfcGFyYW1zKSAhPSBSVEVfRElNKHBkY3BfdGVzdF9k YXRhX3NuX3NpemUpKTs8YnI+DQorwqAgwqAgwqAgwqBSVEVfQlVJTERfQlVHX09OKFJURV9ESU0o cGRjcF90ZXN0X3BhcmFtcykgIT0gUlRFX0RJTShwZGNwX3Rlc3RfaGZuKSk7PGJyPg0KK8KgIMKg IMKgIMKgUlRFX0JVSUxEX0JVR19PTihSVEVfRElNKHBkY3BfdGVzdF9wYXJhbXMpICE9IFJURV9E SU0ocGRjcF90ZXN0X2hmbl90aHJlc2hvbGQpKTs8YnI+DQorwqAgwqAgwqAgwqBSVEVfQlVJTERf QlVHX09OKFJURV9ESU0ocGRjcF90ZXN0X3BhcmFtcykgIT0gUlRFX0RJTShwZGNwX3Rlc3RfcGFj a2V0X2RpcmVjdGlvbikpOzxicj4NCjxicj4NCsKgIMKgIMKgIMKgIHJ0ZV9jcnlwdG9kZXZfaW5m b19nZXQoZGV2X2lkLCAmYW1wO2Rldl9pbmZvKTs8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCBpZiAo IShkZXZfaW5mby5mZWF0dXJlX2ZsYWdzICZhbXA7IFJURV9DUllQVE9ERVZfRkZfU1lNTUVUUklD X0NSWVBUTykgfHw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAoKGds b2JhbF9hcGlfdGVzdF90eXBlID09IENSWVBUT0RFVl9SQVdfQVBJX1RFU1QpICZhbXA7JmFtcDs8 YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAhKGRldl9pbmZvLmZlYXR1 cmVfZmxhZ3MgJmFtcDsgUlRFX0NSWVBUT0RFVl9GRl9TWU1fUkFXX0RQKSkpIHs8YnI+DQotwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBSVEVfTE9HKElORk8sIFVTRVIxLCAmcXVvdDtGZWF0dXJlIGZs YWcgcmVxdWlyZW1lbnRzIGZvciBFU04gJnF1b3Q7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIShkZXZfaW5mby5mZWF0dXJlX2ZsYWdzICZhbXA7PGJyPg0KK8KgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgUlRFX0NSWVBUT0RFVl9GRl9TRUNVUklUWSkp IHs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBSVEVfTE9HKElORk8sIFVTRVIxLCAmcXVv dDtGZWF0dXJlIGZsYWcgcmVxdWlyZW1lbnRzIGZvciBQRENQIFByb3RvICZxdW90Ozxicj4NCsKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICZxdW90O3Rlc3Rz dWl0ZSBub3QgbWV0XG4mcXVvdDspOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHJldHVy biBURVNUX1NLSVBQRUQ7PGJyPg0KwqAgwqAgwqAgwqAgfTxicj4NCkBAIC0xMzE0LDcgKzE0ODEs NyBAQCBlc25fdGVzdHN1aXRlX3NldHVwKHZvaWQpPGJyPg0KwqAgwqAgwqAgwqAgaWYgKGNoZWNr X2NpcGhlcl9jYXBhYmlsaXRpZXNfc3VwcG9ydGVkKGNpcGhlcnMsIFJURV9ESU0oY2lwaGVycykp ICE9IDA8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAmYW1wOyZhbXA7 IGNoZWNrX2F1dGhfY2FwYWJpbGl0aWVzX3N1cHBvcnRlZChhdXRocyw8YnI+DQrCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBSVEVfRElNKGF1dGhzKSkgIT0gMCkgezxicj4NCi3C oCDCoCDCoCDCoCDCoCDCoCDCoCDCoFJURV9MT0coSU5GTywgVVNFUjEsICZxdW90O0NhcGFiaWxp dHkgcmVxdWlyZW1lbnRzIGZvciBFU04gJnF1b3Q7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKg IMKgUlRFX0xPRyhJTkZPLCBVU0VSMSwgJnF1b3Q7Q2FwYWJpbGl0eSByZXF1aXJlbWVudHMgZm9y IFBEQ1AgUHJvdG8gJnF1b3Q7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgJnF1b3Q7dGVzdHN1aXRlIG5vdCBtZXRcbiZxdW90Oyk7PGJyPg0KwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgcmV0dXJuIFRFU1RfU0tJUFBFRDs8YnI+DQrCoCDCoCDCoCDC oCB9PGJyPg0KQEAgLTEzMjMsMTI2ICsxNDkwLDM0IEBAIGVzbl90ZXN0c3VpdGVfc2V0dXAodm9p ZCk8YnI+DQrCoH08YnI+DQo8YnI+DQrCoHN0YXRpYyBpbnQ8YnI+DQotbXVsdGlfc2Vzc2lvbl90 ZXN0c3VpdGVfc2V0dXAodm9pZCk8YnI+DQotezxicj4NCi3CoCDCoCDCoCDCoHN0cnVjdCBjcnlw dG9fdGVzdHN1aXRlX3BhcmFtcyAqdHNfcGFyYW1zID0gJmFtcDt0ZXN0c3VpdGVfcGFyYW1zOzxi cj4NCi3CoCDCoCDCoCDCoHVpbnQ4X3QgZGV2X2lkID0gdHNfcGFyYW1zLSZndDt2YWxpZF9kZXZz WzBdOzxicj4NCi3CoCDCoCDCoCDCoHN0cnVjdCBydGVfY3J5cHRvZGV2X2luZm8gZGV2X2luZm87 PGJyPg0KLcKgIMKgIMKgIMKgY29uc3QgZW51bSBydGVfY3J5cHRvX2NpcGhlcl9hbGdvcml0aG0g Y2lwaGVyc1tdID0gezxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFJURV9DUllQVE9fQ0lQ SEVSX0FFU19DQkM8YnI+DQotwqAgwqAgwqAgwqB9Ozxicj4NCi3CoCDCoCDCoCDCoGNvbnN0IGVu dW0gcnRlX2NyeXB0b19hdXRoX2FsZ29yaXRobSBhdXRoc1tdID0gezxicj4NCi3CoCDCoCDCoCDC oCDCoCDCoCDCoCDCoFJURV9DUllQVE9fQVVUSF9TSEE1MTJfSE1BQzxicj4NCi3CoCDCoCDCoCDC oH07PGJyPg0KLTxicj4NCi3CoCDCoCDCoCDCoHJ0ZV9jcnlwdG9kZXZfaW5mb19nZXQoZGV2X2lk LCAmYW1wO2Rldl9pbmZvKTs8YnI+DQotPGJyPg0KLcKgIMKgIMKgIMKgaWYgKCEoZGV2X2luZm8u ZmVhdHVyZV9mbGFncyAmYW1wOyBSVEVfQ1JZUFRPREVWX0ZGX1NZTU1FVFJJQ19DUllQVE8pKSB7 PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgUlRFX0xPRyhJTkZPLCBVU0VSMSwgJnF1b3Q7 RmVhdHVyZSBmbGFnIHJlcXVpcmVtZW50cyBmb3IgTXVsdGkgJnF1b3Q7PGJyPg0KLcKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJnF1b3Q7U2Vzc2lvbiB0ZXN0 c3VpdGUgbm90IG1ldFxuJnF1b3Q7KTs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqByZXR1 cm4gVEVTVF9TS0lQUEVEOzxicj4NCi3CoCDCoCDCoCDCoH08YnI+DQotPGJyPg0KLcKgIMKgIMKg IMKgaWYgKGNoZWNrX2NpcGhlcl9jYXBhYmlsaXRpZXNfc3VwcG9ydGVkKGNpcGhlcnMsIFJURV9E SU0oY2lwaGVycykpICE9IDA8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAmYW1wOyZhbXA7IGNoZWNrX2F1dGhfY2FwYWJpbGl0aWVzX3N1cHBvcnRlZChhdXRocyw8YnI+ DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBSVEVfRElNKGF1dGhzKSkgIT0g MCkgezxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFJURV9MT0coSU5GTywgVVNFUjEsICZx dW90O0NhcGFiaWxpdHkgcmVxdWlyZW1lbnRzIGZvciBNdWx0aSAmcXVvdDs8YnI+DQotwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmcXVvdDtTZXNzaW9uIHRl c3RzdWl0ZSBub3QgbWV0XG4mcXVvdDspOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJl dHVybiBURVNUX1NLSVBQRUQ7PGJyPg0KLcKgIMKgIMKgIMKgfTxicj4NCi08YnI+DQotwqAgwqAg wqAgwqByZXR1cm4gMDs8YnI+DQotfTxicj4NCi08YnI+DQotc3RhdGljIGludDxicj4NCi1uZWdh dGl2ZV9obWFjX3NoYTFfdGVzdHN1aXRlX3NldHVwKHZvaWQpPGJyPg0KK2RvY3Npc19wcm90b190 ZXN0c3VpdGVfc2V0dXAodm9pZCk8YnI+DQrCoHs8YnI+DQrCoCDCoCDCoCDCoCBzdHJ1Y3QgY3J5 cHRvX3Rlc3RzdWl0ZV9wYXJhbXMgKnRzX3BhcmFtcyA9ICZhbXA7dGVzdHN1aXRlX3BhcmFtczs8 YnI+DQrCoCDCoCDCoCDCoCB1aW50OF90IGRldl9pZCA9IHRzX3BhcmFtcy0mZ3Q7dmFsaWRfZGV2 c1swXTs8YnI+DQrCoCDCoCDCoCDCoCBzdHJ1Y3QgcnRlX2NyeXB0b2Rldl9pbmZvIGRldl9pbmZv Ozxicj4NCsKgIMKgIMKgIMKgIGNvbnN0IGVudW0gcnRlX2NyeXB0b19jaXBoZXJfYWxnb3JpdGht IGNpcGhlcnNbXSA9IHs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBSVEVfQ1JZUFRPX0NJ UEhFUl9BRVNfQ0JDPGJyPg0KLcKgIMKgIMKgIMKgfTs8YnI+DQotwqAgwqAgwqAgwqBjb25zdCBl bnVtIHJ0ZV9jcnlwdG9fYXV0aF9hbGdvcml0aG0gYXV0aHNbXSA9IHs8YnI+DQotwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqBSVEVfQ1JZUFRPX0FVVEhfU0hBMV9ITUFDPGJyPg0KK8KgIMKgIMKgIMKg IMKgIMKgIMKgIMKgUlRFX0NSWVBUT19DSVBIRVJfQUVTX0RPQ1NJU0JQSTxicj4NCsKgIMKgIMKg IMKgIH07PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgcnRlX2NyeXB0b2Rldl9pbmZvX2dldChkZXZf aWQsICZhbXA7ZGV2X2luZm8pOzxicj4NCjxicj4NCsKgIMKgIMKgIMKgIGlmICghKGRldl9pbmZv LmZlYXR1cmVfZmxhZ3MgJmFtcDsgUlRFX0NSWVBUT0RFVl9GRl9TWU1NRVRSSUNfQ1JZUFRPKSB8 fDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCgoZ2xvYmFsX2FwaV90 ZXN0X3R5cGUgPT0gQ1JZUFRPREVWX1JBV19BUElfVEVTVCkgJmFtcDsmYW1wOzxicj4NCi3CoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCEoZGV2X2luZm8uZmVhdHVyZV9mbGFncyAm YW1wOyBSVEVfQ1JZUFRPREVWX0ZGX1NZTV9SQVdfRFApKSkgezxicj4NCi3CoCDCoCDCoCDCoCDC oCDCoCDCoCDCoFJURV9MT0coSU5GTywgVVNFUjEsICZxdW90O0ZlYXR1cmUgZmxhZyByZXF1aXJl bWVudHMgZm9yIE5lZ2F0aXZlICZxdW90Ozxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZxdW90O0hNQUMgU0hBMSB0ZXN0c3VpdGUgbm90IG1ldFxu JnF1b3Q7KTs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAhKGRldl9p bmZvLmZlYXR1cmVfZmxhZ3MgJmFtcDs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqBSVEVfQ1JZUFRPREVWX0ZGX1NFQ1VSSVRZKSkgezxicj4NCivCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoFJURV9MT0coSU5GTywgVVNFUjEsICZxdW90O0ZlYXR1cmUgZmxhZyByZXF1aXJl bWVudHMgZm9yIERPQ1NJUyAmcXVvdDs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAmcXVvdDtQcm90byB0ZXN0c3VpdGUgbm90IG1ldFxuJnF1b3Q7 KTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCByZXR1cm4gVEVTVF9TS0lQUEVEOzxicj4N CsKgIMKgIMKgIMKgIH08YnI+DQo8YnI+DQotwqAgwqAgwqAgwqBpZiAoY2hlY2tfY2lwaGVyX2Nh cGFiaWxpdGllc19zdXBwb3J0ZWQoY2lwaGVycywgUlRFX0RJTShjaXBoZXJzKSkgIT0gMDxicj4N Ci3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZhbXA7JmFtcDsgY2hlY2tfYXV0 aF9jYXBhYmlsaXRpZXNfc3VwcG9ydGVkKGF1dGhzLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoFJURV9ESU0oYXV0aHMpKSAhPSAwKSB7PGJyPg0KLcKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgUlRFX0xPRyhJTkZPLCBVU0VSMSwgJnF1b3Q7Q2FwYWJpbGl0eSByZXF1aXJl bWVudHMgZm9yIE5lZ2F0aXZlICZxdW90Ozxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZxdW90O0hNQUMgU0hBMSB0ZXN0c3VpdGUgbm90IG1ldFxu JnF1b3Q7KTs8YnI+DQorwqAgwqAgwqAgwqBpZiAoY2hlY2tfY2lwaGVyX2NhcGFiaWxpdGllc19z dXBwb3J0ZWQoY2lwaGVycywgUlRFX0RJTShjaXBoZXJzKSkgIT0gMCkgezxicj4NCivCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoFJURV9MT0coSU5GTywgVVNFUjEsICZxdW90O0NhcGFiaWxpdHkgcmVx dWlyZW1lbnRzIGZvciBET0NTSVMgUHJvdG8gJnF1b3Q7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJnF1b3Q7dGVzdHN1aXRlIG5vdCBtZXRcbiZx dW90Oyk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcmV0dXJuIFRFU1RfU0tJUFBFRDs8 YnI+DQrCoCDCoCDCoCDCoCB9PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgcmV0dXJuIDA7PGJyPg0K wqB9PGJyPg0KLTxicj4NCi1zdGF0aWMgaW50PGJyPg0KLWRldl9jb25maWd1cmVfYW5kX3N0YXJ0 KHVpbnQ2NF90IGZmX2Rpc2FibGUpPGJyPg0KLXs8YnI+DQotwqAgwqAgwqAgwqBzdHJ1Y3QgY3J5 cHRvX3Rlc3RzdWl0ZV9wYXJhbXMgKnRzX3BhcmFtcyA9ICZhbXA7dGVzdHN1aXRlX3BhcmFtczs8 YnI+DQotwqAgwqAgwqAgwqBzdHJ1Y3QgY3J5cHRvX3VuaXR0ZXN0X3BhcmFtcyAqdXRfcGFyYW1z ID0gJmFtcDt1bml0dGVzdF9wYXJhbXM7PGJyPg0KLTxicj4NCi3CoCDCoCDCoCDCoHVpbnQxNl90 IHFwX2lkOzxicj4NCi08YnI+DQotwqAgwqAgwqAgwqAvKiBDbGVhciB1bml0IHRlc3QgcGFyYW1l dGVycyBiZWZvcmUgcnVubmluZyB0ZXN0ICovPGJyPg0KLcKgIMKgIMKgIMKgbWVtc2V0KHV0X3Bh cmFtcywgMCwgc2l6ZW9mKCp1dF9wYXJhbXMpKTs8YnI+DQotPGJyPg0KLcKgIMKgIMKgIMKgLyog UmVjb25maWd1cmUgZGV2aWNlIHRvIGRlZmF1bHQgcGFyYW1ldGVycyAqLzxicj4NCi3CoCDCoCDC oCDCoHRzX3BhcmFtcy0mZ3Q7Y29uZi5zb2NrZXRfaWQgPSBTT0NLRVRfSURfQU5ZOzxicj4NCi3C oCDCoCDCoCDCoHRzX3BhcmFtcy0mZ3Q7Y29uZi5mZl9kaXNhYmxlID0gZmZfZGlzYWJsZTs8YnI+ DQotwqAgwqAgwqAgwqB0c19wYXJhbXMtJmd0O3FwX2NvbmYubmJfZGVzY3JpcHRvcnMgPSBNQVhf TlVNX09QU19JTkZMSUdIVDs8YnI+DQotwqAgwqAgwqAgwqB0c19wYXJhbXMtJmd0O3FwX2NvbmYu bXBfc2Vzc2lvbiA9IHRzX3BhcmFtcy0mZ3Q7c2Vzc2lvbl9tcG9vbDs8YnI+DQotPGJyPg0KLcKg IMKgIMKgIMKgVEVTVF9BU1NFUlRfU1VDQ0VTUyhydGVfY3J5cHRvZGV2X2NvbmZpZ3VyZSh0c19w YXJhbXMtJmd0O3ZhbGlkX2RldnNbMF0sPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgJmFtcDt0c19wYXJhbXMtJmd0O2NvbmYpLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCZxdW90O0ZhaWxlZCB0byBjb25maWd1cmUgY3J5cHRvZGV2ICV1 JnF1b3Q7LDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHRzX3BhcmFt cy0mZ3Q7dmFsaWRfZGV2c1swXSk7PGJyPg0KLTxicj4NCi3CoCDCoCDCoCDCoGZvciAocXBfaWQg PSAwOyBxcF9pZCAmbHQ7IHRzX3BhcmFtcy0mZ3Q7Y29uZi5uYl9xdWV1ZV9wYWlycyA7IHFwX2lk KyspIHs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBURVNUX0FTU0VSVF9TVUNDRVNTKHJ0 ZV9jcnlwdG9kZXZfcXVldWVfcGFpcl9zZXR1cCg8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqB0c19wYXJhbXMtJmd0O3ZhbGlkX2RldnNbMF0sIHFwX2lkLDxicj4NCi3C oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZhbXA7dHNfcGFyYW1zLSZndDtxcF9j b25mLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJ0ZV9jcnlwdG9k ZXZfc29ja2V0X2lkKHRzX3BhcmFtcy0mZ3Q7dmFsaWRfZGV2c1swXSkpLDxicj4NCi3CoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZxdW90O0ZhaWxlZCB0byBzZXR1cCBxdWV1ZSBw YWlyICV1IG9uIGNyeXB0b2RldiAldSZxdW90Oyw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqBxcF9pZCwgdHNfcGFyYW1zLSZndDt2YWxpZF9kZXZzWzBdKTs8YnI+DQot wqAgwqAgwqAgwqB9PGJyPg0KLTxicj4NCi08YnI+DQotwqAgwqAgwqAgwqBydGVfY3J5cHRvZGV2 X3N0YXRzX3Jlc2V0KHRzX3BhcmFtcy0mZ3Q7dmFsaWRfZGV2c1swXSk7PGJyPg0KLTxicj4NCi3C oCDCoCDCoCDCoC8qIFN0YXJ0IHRoZSBkZXZpY2UgKi88YnI+DQotwqAgwqAgwqAgwqBURVNUX0FT U0VSVF9TVUNDRVNTKHJ0ZV9jcnlwdG9kZXZfc3RhcnQodHNfcGFyYW1zLSZndDt2YWxpZF9kZXZz WzBdKSw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmcXVvdDtGYWls ZWQgdG8gc3RhcnQgY3J5cHRvZGV2ICV1JnF1b3Q7LDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoHRzX3BhcmFtcy0mZ3Q7dmFsaWRfZGV2c1swXSk7PGJyPg0KLTxicj4N Ci3CoCDCoCDCoCDCoHJldHVybiBURVNUX1NVQ0NFU1M7PGJyPg0KLX08YnI+DQotPGJyPg0KLWlu dDxicj4NCi11dF9zZXR1cCh2b2lkKTxicj4NCi17PGJyPg0KLcKgIMKgIMKgIMKgLyogQ29uZmln dXJlIGFuZCBzdGFydCB0aGUgZGV2aWNlIHdpdGggc2VjdXJpdHkgZmVhdHVyZSBkaXNhYmxlZCAq Lzxicj4NCi3CoCDCoCDCoCDCoHJldHVybiBkZXZfY29uZmlndXJlX2FuZF9zdGFydChSVEVfQ1JZ UFRPREVWX0ZGX1NFQ1VSSVRZKTs8YnI+DQotfTxicj4NCi08YnI+DQotc3RhdGljIGludDxicj4N Ci11dF9zZXR1cF9zZWN1cml0eSh2b2lkKTxicj4NCi17PGJyPg0KLcKgIMKgIMKgIMKgLyogQ29u ZmlndXJlIGFuZCBzdGFydCB0aGUgZGV2aWNlIHdpdGggbm8gZmVhdHVyZXMgZGlzYWJsZWQgKi88 YnI+DQotwqAgwqAgwqAgwqByZXR1cm4gZGV2X2NvbmZpZ3VyZV9hbmRfc3RhcnQoMCk7PGJyPg0K LX08YnI+DQorI2VuZGlmPGJyPg0KPGJyPg0KwqBzdGF0aWMgaW50PGJyPg0KwqB1dF9zZXR1cF9z ZWN1cml0eV9yeF9pbmplY3Qodm9pZCk8YnI+DQpAQCAtMTY2MSw1OSArMTczNiw2IEBAIGV4dF9t YnVmX2NyZWF0ZShzdHJ1Y3QgcnRlX21lbXBvb2wgKm1idWZfcG9vbCwgaW50IHBrdF9sZW4sPGJy Pg0KwqAgwqAgwqAgwqAgcmV0dXJuIE5VTEw7PGJyPg0KwqB9PGJyPg0KPGJyPg0KLXZvaWQ8YnI+ DQotdXRfdGVhcmRvd24odm9pZCk8YnI+DQotezxicj4NCi3CoCDCoCDCoCDCoHN0cnVjdCBjcnlw dG9fdGVzdHN1aXRlX3BhcmFtcyAqdHNfcGFyYW1zID0gJmFtcDt0ZXN0c3VpdGVfcGFyYW1zOzxi cj4NCi3CoCDCoCDCoCDCoHN0cnVjdCBjcnlwdG9fdW5pdHRlc3RfcGFyYW1zICp1dF9wYXJhbXMg PSAmYW1wO3VuaXR0ZXN0X3BhcmFtczs8YnI+DQotPGJyPg0KLcKgIMKgIMKgIMKgLyogZnJlZSBj cnlwdG8gc2Vzc2lvbiBzdHJ1Y3R1cmUgKi88YnI+DQotI2lmZGVmIFJURV9MSUJfU0VDVVJJVFk8 YnI+DQotwqAgwqAgwqAgwqBpZiAodXRfcGFyYW1zLSZndDt0eXBlID09IFJURV9TRUNVUklUWV9B Q1RJT05fVFlQRV9MT09LQVNJREVfUFJPVE9DT0wpIHs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqBpZiAodXRfcGFyYW1zLSZndDtzZWNfc2Vzc2lvbikgezxicj4NCi3CoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJ0ZV9zZWN1cml0eV9zZXNzaW9uX2Rlc3Ryb3kocnRlX2Ny eXB0b2Rldl9nZXRfc2VjX2N0eDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCh0c19wYXJhbXMtJmd0O3Zh bGlkX2RldnNbMF0pLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHV0X3BhcmFtcy0mZ3Q7c2VjX3Nlc3Np b24pOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHV0X3BhcmFtcy0m Z3Q7c2VjX3Nlc3Npb24gPSBOVUxMOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoH08YnI+ DQotwqAgwqAgwqAgwqB9IGVsc2U8YnI+DQotI2VuZGlmPGJyPg0KLcKgIMKgIMKgIMKgezxicj4N Ci3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmICh1dF9wYXJhbXMtJmd0O3Nlc3MpIHs8YnI+DQot wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBydGVfY3J5cHRvZGV2X3N5bV9zZXNz aW9uX2ZyZWUodHNfcGFyYW1zLSZndDt2YWxpZF9kZXZzWzBdLDxicj4NCi3CoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHV0X3BhcmFtcy0m Z3Q7c2Vzcyk7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdXRfcGFy YW1zLSZndDtzZXNzID0gTlVMTDs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9PGJyPg0K LcKgIMKgIMKgIMKgfTxicj4NCi08YnI+DQotwqAgwqAgwqAgwqAvKiBmcmVlIGNyeXB0byBvcGVy YXRpb24gc3RydWN0dXJlICovPGJyPg0KLcKgIMKgIMKgIMKgcnRlX2NyeXB0b19vcF9mcmVlKHV0 X3BhcmFtcy0mZ3Q7b3ApOzxicj4NCi08YnI+DQotwqAgwqAgwqAgwqAvKjxicj4NCi3CoCDCoCDC oCDCoCAqIGZyZWUgbWJ1ZiAtIGJvdGggb2J1ZiBhbmQgaWJ1ZiBhcmUgdXN1YWxseSB0aGUgc2Ft ZSw8YnI+DQotwqAgwqAgwqAgwqAgKiBzbyBjaGVjayBpZiB0aGV5IHBvaW50IGF0IHRoZSBzYW1l IGFkZHJlc3MgaXMgbmVjZXNzYXJ5LDxicj4NCi3CoCDCoCDCoCDCoCAqIHRvIGF2b2lkIGZyZWVp bmcgdGhlIG1idWYgdHdpY2UuPGJyPg0KLcKgIMKgIMKgIMKgICovPGJyPg0KLcKgIMKgIMKgIMKg aWYgKHV0X3BhcmFtcy0mZ3Q7b2J1Zikgezxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJ0 ZV9wa3RtYnVmX2ZyZWUodXRfcGFyYW1zLSZndDtvYnVmKTs8YnI+DQotwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqBpZiAodXRfcGFyYW1zLSZndDtpYnVmID09IHV0X3BhcmFtcy0mZ3Q7b2J1Zik8YnI+ DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB1dF9wYXJhbXMtJmd0O2lidWYg PSAwOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHV0X3BhcmFtcy0mZ3Q7b2J1ZiA9IDA7 PGJyPg0KLcKgIMKgIMKgIMKgfTxicj4NCi3CoCDCoCDCoCDCoGlmICh1dF9wYXJhbXMtJmd0O2li dWYpIHs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBleHRfbWJ1Zl9tZW16b25lX2ZyZWUo MSk7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcnRlX3BrdG1idWZfZnJlZSh1dF9wYXJh bXMtJmd0O2lidWYpOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHV0X3BhcmFtcy0mZ3Q7 aWJ1ZiA9IDA7PGJyPg0KLcKgIMKgIMKgIMKgfTxicj4NCi08YnI+DQotwqAgwqAgwqAgwqBpZiAo dHNfcGFyYW1zLSZndDttYnVmX3Bvb2wgIT0gTlVMTCk8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqBSVEVfTE9HKERFQlVHLCBVU0VSMSwgJnF1b3Q7Q1JZUFRPX01CVUZQT09MIGNvdW50ICV1 XG4mcXVvdDssPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcnRlX21l bXBvb2xfYXZhaWxfY291bnQodHNfcGFyYW1zLSZndDttYnVmX3Bvb2wpKTs8YnI+DQotPGJyPg0K LcKgIMKgIMKgIMKgLyogU3RvcCB0aGUgZGV2aWNlICovPGJyPg0KLcKgIMKgIMKgIMKgcnRlX2Ny eXB0b2Rldl9zdG9wKHRzX3BhcmFtcy0mZ3Q7dmFsaWRfZGV2c1swXSk7PGJyPg0KLX08YnI+DQot PGJyPg0KwqBzdGF0aWMgdm9pZDxicj4NCsKgdXRfdGVhcmRvd25fcnhfaW5qZWN0KHZvaWQpPGJy Pg0KwqB7PGJyPg0KQEAgLTE5NDUsMTU1ICsxOTY3LDEzIEBAIHRlc3RfcXVldWVfcGFpcl9kZXNj cmlwdG9yX3NldHVwKHZvaWQpPGJyPg0KwqAgwqAgwqAgwqAgcmV0dXJuIFRFU1RfU1VDQ0VTUzs8 YnI+DQrCoH08YnI+DQo8YnI+DQotLyogKioqKiogUGxhaW50ZXh0IGRhdGEgZm9yIHRlc3RzICoq KioqICovPGJyPg0KLTxicj4NCi1jb25zdCBjaGFyIGNhdGNoXzIyX3F1b3RlXzFbXSA9PGJyPg0K LcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJnF1b3Q7VGhlcmUgd2FzIG9ubHkgb25lIGNhdGNoIGFu ZCB0aGF0IHdhcyBDYXRjaC0yMiwgd2hpY2ggJnF1b3Q7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgJnF1b3Q7c3BlY2lmaWVkIHRoYXQgYSBjb25jZXJuIGZvciBvbmUmIzM5O3Mgc2FmZXR5 IGluIHRoZSBmYWNlIG9mICZxdW90Ozxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZxdW90 O2RhbmdlcnMgdGhhdCB3ZXJlIHJlYWwgYW5kIGltbWVkaWF0ZSB3YXMgdGhlIHByb2Nlc3Mgb2Yg YSAmcXVvdDs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmcXVvdDtyYXRpb25hbCBtaW5k LiBPcnIgd2FzIGNyYXp5IGFuZCBjb3VsZCBiZSBncm91bmRlZC4gQWxsIGhlICZxdW90Ozxicj4N Ci3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZxdW90O2hhZCB0byBkbyB3YXMgYXNrOyBhbmQgYXMg c29vbiBhcyBoZSBkaWQsIGhlIHdvdWxkIG5vIGxvbmdlciAmcXVvdDs8YnI+DQotwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAmcXVvdDtiZSBjcmF6eSBhbmQgd291bGQgaGF2ZSB0byBmbHkgbW9yZSBt aXNzaW9ucy4gT3JyIHdvdWxkIGJlICZxdW90Ozxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCZxdW90O2NyYXp5IHRvIGZseSBtb3JlIG1pc3Npb25zIGFuZCBzYW5lIGlmIGhlIGRpZG4mIzM5 O3QsIGJ1dCBpZiBoZSAmcXVvdDs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmcXVvdDt3 YXMgc2FuZSBoZSBoYWQgdG8gZmx5IHRoZW0uIElmIGhlIGZsZXcgdGhlbSBoZSB3YXMgY3Jhenkg JnF1b3Q7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJnF1b3Q7YW5kIGRpZG4mIzM5O3Qg aGF2ZSB0bzsgYnV0IGlmIGhlIGRpZG4mIzM5O3Qgd2FudCB0byBoZSB3YXMgc2FuZSBhbmQgJnF1 b3Q7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJnF1b3Q7aGFkIHRvLiBZb3NzYXJpYW4g d2FzIG1vdmVkIHZlcnkgZGVlcGx5IGJ5IHRoZSBhYnNvbHV0ZSAmcXVvdDs8YnI+DQotwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAmcXVvdDtzaW1wbGljaXR5IG9mIHRoaXMgY2xhdXNlIG9mIENhdGNo LTIyIGFuZCBsZXQgb3V0IGEgJnF1b3Q7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJnF1 b3Q7cmVzcGVjdGZ1bCB3aGlzdGxlLiBcJnF1b3Q7VGhhdCYjMzk7cyBzb21lIGNhdGNoLCB0aGF0 IENhdGNoLTIyXCZxdW90OywgaGUgJnF1b3Q7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg JnF1b3Q7b2JzZXJ2ZWQuIFwmcXVvdDtJdCYjMzk7cyB0aGUgYmVzdCB0aGVyZSBpcyxcJnF1b3Q7 IERvYyBEYW5lZWthIGFncmVlZC4mcXVvdDs7PGJyPg0KLTxicj4NCi1jb25zdCBjaGFyIGNhdGNo XzIyX3F1b3RlW10gPTxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZxdW90O1doYXQgYSBs b3VzeSBlYXJ0aCEgSGUgd29uZGVyZWQgaG93IG1hbnkgcGVvcGxlIHdlcmUgJnF1b3Q7PGJyPg0K LcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJnF1b3Q7ZGVzdGl0dXRlIHRoYXQgc2FtZSBuaWdodCBl dmVuIGluIGhpcyBvd24gcHJvc3Blcm91cyBjb3VudHJ5LCAmcXVvdDs8YnI+DQotwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAmcXVvdDtob3cgbWFueSBob21lcyB3ZXJlIHNoYW50aWVzLCBob3cgbWFu eSBodXNiYW5kcyB3ZXJlIGRydW5rICZxdW90Ozxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCZxdW90O2FuZCB3aXZlcyBzb2NrZWQsIGFuZCBob3cgbWFueSBjaGlsZHJlbiB3ZXJlIGJ1bGxp ZWQsIGFidXNlZCwgJnF1b3Q7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJnF1b3Q7b3Ig YWJhbmRvbmVkLiBIb3cgbWFueSBmYW1pbGllcyBodW5nZXJlZCBmb3IgZm9vZCB0aGV5IGNvdWxk ICZxdW90Ozxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZxdW90O25vdCBhZmZvcmQgdG8g YnV5PyBIb3cgbWFueSBoZWFydHMgd2VyZSBicm9rZW4/IEhvdyBtYW55ICZxdW90Ozxicj4NCi3C oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZxdW90O3N1aWNpZGVzIHdvdWxkIHRha2UgcGxhY2UgdGhh dCBzYW1lIG5pZ2h0LCBob3cgbWFueSBwZW9wbGUgJnF1b3Q7PGJyPg0KLcKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgJnF1b3Q7d291bGQgZ28gaW5zYW5lPyBIb3cgbWFueSBjb2Nrcm9hY2hlcyBhbmQg bGFuZGxvcmRzIHdvdWxkICZxdW90Ozxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZxdW90 O3RyaXVtcGg/IEhvdyBtYW55IHdpbm5lcnMgd2VyZSBsb3NlcnMsIHN1Y2Nlc3NlcyBmYWlsdXJl cywgJnF1b3Q7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJnF1b3Q7YW5kIHJpY2ggbWVu IHBvb3IgbWVuPyBIb3cgbWFueSB3aXNlIGd1eXMgd2VyZSBzdHVwaWQ/IEhvdyAmcXVvdDs8YnI+ DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmcXVvdDttYW55IGhhcHB5IGVuZGluZ3Mgd2VyZSB1 bmhhcHB5IGVuZGluZ3M/IEhvdyBtYW55IGhvbmVzdCBtZW4gJnF1b3Q7PGJyPg0KLcKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgJnF1b3Q7d2VyZSBsaWFycywgYnJhdmUgbWVuIGNvd2FyZHMsIGxveWFs IG1lbiB0cmFpdG9ycywgaG93IG1hbnkgJnF1b3Q7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgJnF1b3Q7c2FpbnRlZCBtZW4gd2VyZSBjb3JydXB0LCBob3cgbWFueSBwZW9wbGUgaW4gcG9z aXRpb25zIG9mICZxdW90Ozxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZxdW90O3RydXN0 IGhhZCBzb2xkIHRoZWlyIHNvdWxzIHRvIGJvZHlndWFyZHMsIGhvdyBtYW55IGhhZCBuZXZlciAm cXVvdDs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmcXVvdDtoYWQgc291bHM/IEhvdyBt YW55IHN0cmFpZ2h0LWFuZC1uYXJyb3cgcGF0aHMgd2VyZSBjcm9va2VkICZxdW90Ozxicj4NCi3C oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZxdW90O3BhdGhzPyBIb3cgbWFueSBiZXN0IGZhbWlsaWVz IHdlcmUgd29yc3QgZmFtaWxpZXMgYW5kIGhvdyAmcXVvdDs8YnI+DQotwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAmcXVvdDttYW55IGdvb2QgcGVvcGxlIHdlcmUgYmFkIHBlb3BsZT8gV2hlbiB5b3Ug YWRkZWQgdGhlbSBhbGwgdXAgJnF1b3Q7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJnF1 b3Q7YW5kIHRoZW4gc3VidHJhY3RlZCwgeW91IG1pZ2h0IGJlIGxlZnQgd2l0aCBvbmx5IHRoZSBj aGlsZHJlbiwgJnF1b3Q7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJnF1b3Q7YW5kIHBl cmhhcHMgd2l0aCBBbGJlcnQgRWluc3RlaW4gYW5kIGFuIG9sZCB2aW9saW5pc3Qgb3IgJnF1b3Q7 PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJnF1b3Q7c2N1bHB0b3Igc29tZXdoZXJlLiZx dW90Ozs8YnI+DQotPGJyPg0KLSNkZWZpbmUgUVVPVEVfNDgwX0JZVEVTwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgKDQ4MCk8YnI+DQotI2RlZmluZSBRVU9URV81MTJfQllURVPCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCAoNTEyKTxicj4NCi0jZGVmaW5lIFFVT1RFXzc2OF9CWVRFU8KgIMKgIMKgIMKg IMKgIMKgIMKgIMKgICg3NjgpPGJyPg0KLSNkZWZpbmUgUVVPVEVfMTAyNF9CWVRFU8KgIMKgIMKg IMKgKDEwMjQpPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLS8qICoqKioqIFNIQTEgSGFzaCBU ZXN0cyAqKioqKiAqLzxicj4NCi08YnI+DQotI2RlZmluZSBITUFDX0tFWV9MRU5HVEhfU0hBMcKg IMKgKERJR0VTVF9CWVRFX0xFTkdUSF9TSEExKTxicj4NCi08YnI+DQotc3RhdGljIHVpbnQ4X3Qg aG1hY19zaGExX2tleVtdID0gezxicj4NCi3CoCDCoCDCoCDCoDB4RjgsIDB4MkEsIDB4QzcsIDB4 NTQsIDB4REIsIDB4OTYsIDB4MTgsIDB4QUEsPGJyPg0KLcKgIMKgIMKgIMKgMHhDMywgMHhBMSwg MHg1MywgMHhGNiwgMHgxRiwgMHgxNywgMHg2MCwgMHhCRCw8YnI+DQotwqAgwqAgwqAgwqAweERF LCAweEY0LCAweERFLCAweEFEIH07PGJyPg0KLTxicj4NCi0vKiAqKioqKiBTSEEyMjQgSGFzaCBU ZXN0cyAqKioqKiAqLzxicj4NCi08YnI+DQotI2RlZmluZSBITUFDX0tFWV9MRU5HVEhfU0hBMjI0 IChESUdFU1RfQllURV9MRU5HVEhfU0hBMjI0KTxicj4NCi08YnI+DQotPGJyPg0KLS8qICoqKioq IEFFUy1DQkMgQ2lwaGVyIFRlc3RzICoqKioqICovPGJyPg0KLTxicj4NCi0jZGVmaW5lIENJUEhF Ul9LRVlfTEVOR1RIX0FFU19DQkPCoCDCoCDCoCAoMTYpPGJyPg0KLSNkZWZpbmUgQ0lQSEVSX0lW X0xFTkdUSF9BRVNfQ0JDwqAgwqAgwqAgwqAoQ0lQSEVSX0tFWV9MRU5HVEhfQUVTX0NCQyk8YnI+ DQotPGJyPg0KwqBzdGF0aWMgdWludDhfdCBhZXNfY2JjX2tleVtdID0gezxicj4NCsKgIMKgIMKg IMKgIDB4RTQsIDB4MjMsIDB4MzMsIDB4OEEsIDB4MzUsIDB4NjQsIDB4NjEsIDB4RTIsPGJyPg0K wqAgwqAgwqAgwqAgMHg0OSwgMHgwMywgMHhERCwgMHhDNiwgMHhCOCwgMHhDQSwgMHg1NSwgMHg3 QSB9Ozxicj4NCjxicj4NCi1zdGF0aWMgdWludDhfdCBhZXNfY2JjX2l2W10gPSB7PGJyPg0KLcKg IMKgIMKgIMKgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNyw8 YnI+DQotwqAgwqAgwqAgwqAweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBl LCAweDBmIH07PGJyPg0KLTxicj4NCi08YnI+DQotLyogKioqKiogQUVTLUNCQyAvIEhNQUMtU0hB MSBIYXNoIFRlc3RzICoqKioqICovPGJyPg0KLTxicj4NCi1zdGF0aWMgY29uc3QgdWludDhfdCBj YXRjaF8yMl9xdW90ZV8yXzUxMl9ieXRlc19BRVNfQ0JDX2NpcGhlcnRleHRbXSA9IHs8YnI+DQot wqAgwqAgwqAgwqAweDhCLCAweDRELCAweERBLCAweDFCLCAweENGLCAweDA0LCAweEEwLCAweDMx LDxicj4NCi3CoCDCoCDCoCDCoDB4QjQsIDB4QkYsIDB4QkQsIDB4NjgsIDB4NDMsIDB4MjAsIDB4 N0UsIDB4NzYsPGJyPg0KLcKgIMKgIMKgIMKgMHhCMSwgMHg5NiwgMHg4QiwgMHhBMiwgMHg3Qywg MHhBMiwgMHg4MywgMHg5RSw8YnI+DQotwqAgwqAgwqAgwqAweDM5LCAweDVBLCAweDJGLCAweDdF LCAweDkyLCAweEI0LCAweDQ4LCAweDFBLDxicj4NCi3CoCDCoCDCoCDCoDB4M0YsIDB4NkIsIDB4 NUQsIDB4REYsIDB4NTIsIDB4ODUsIDB4NUYsIDB4OEUsPGJyPg0KLcKgIMKgIMKgIMKgMHg0Miwg MHgzQywgMHhGQiwgMHhFOSwgMHgxQSwgMHgyNCwgMHhENiwgMHgwOCw8YnI+DQotwqAgwqAgwqAg wqAweERELCAweEZELCAweDE2LCAweEZCLCAweEU5LCAweDU1LCAweEVGLCAweEYwLDxicj4NCi3C oCDCoCDCoCDCoDB4QTAsIDB4OEQsIDB4MTMsIDB4QUIsIDB4ODEsIDB4QzYsIDB4OTAsIDB4MDEs PGJyPg0KLcKgIMKgIMKgIMKgMHhCNSwgMHgxOCwgMHg4NCwgMHhCMywgMHhGNiwgMHhFNiwgMHgx MSwgMHg1Nyw8YnI+DQotwqAgwqAgwqAgwqAweEQ2LCAweDcxLCAweEM2LCAweDNDLCAweDNGLCAw eDJGLCAweDMzLCAweEVFLDxicj4NCi3CoCDCoCDCoCDCoDB4MjQsIDB4NDIsIDB4NkUsIDB4QUMs IDB4MEIsIDB4Q0EsIDB4RUMsIDB4RjksPGJyPg0KLcKgIMKgIMKgIMKgMHg4NCwgMHhGOCwgMHgy MiwgMHhBQSwgMHg2MCwgMHhGMCwgMHgzMiwgMHhBOSw8YnI+DQotwqAgwqAgwqAgwqAweDc1LCAw eDc1LCAweDNCLCAweENCLCAweDcwLCAweDIxLCAweDBBLCAweDhELDxicj4NCi3CoCDCoCDCoCDC oDB4MEYsIDB4RTAsIDB4QzQsIDB4NzgsIDB4MkIsIDB4RjgsIDB4OTcsIDB4RTMsPGJyPg0KLcKg IMKgIMKgIMKgMHhFNCwgMHgyNiwgMHg0QiwgMHgyOSwgMHhEQSwgMHg4OCwgMHhDRCwgMHg0Niw8 YnI+DQotwqAgwqAgwqAgwqAweEVDLCAweEFBLCAweEY5LCAweDdGLCAweEYxLCAweDE1LCAweEVB LCAweEMzLDxicj4NCi3CoCDCoCDCoCDCoDB4ODcsIDB4RTYsIDB4MzEsIDB4RjIsIDB4Q0YsIDB4 REUsIDB4NEQsIDB4ODAsPGJyPg0KLcKgIMKgIMKgIMKgMHg3MCwgMHg5MSwgMHg3RSwgMHgwQywg MHhGNywgMHgyNiwgMHgzQSwgMHg5Miw8YnI+DQotwqAgwqAgwqAgwqAweDRGLCAweDE4LCAweDgz LCAweEMwLCAweDhGLCAweDU5LCAweDAxLCAweEE1LDxicj4NCi3CoCDCoCDCoCDCoDB4ODgsIDB4 RDEsIDB4REIsIDB4MjYsIDB4NzEsIDB4MjcsIDB4MTYsIDB4RjUsPGJyPg0KLcKgIMKgIMKgIMKg MHhFRSwgMHgxMCwgMHg4MiwgMHhBQywgMHg2OCwgMHgyNiwgMHg5QiwgMHhFMiw8YnI+DQotwqAg wqAgwqAgwqAweDZELCAweEQ4LCAweDlBLCAweDgwLCAweERGLCAweDA0LCAweDMxLCAweEQ1LDxi cj4NCi3CoCDCoCDCoCDCoDB4RjEsIDB4MzUsIDB4NUMsIDB4M0IsIDB4REQsIDB4OUEsIDB4NjUs IDB4QkEsPGJyPg0KLcKgIMKgIMKgIMKgMHg1OCwgMHgzNCwgMHg4NSwgMHg2MSwgMHgxQywgMHg0 MiwgMHgxMCwgMHg3Niw8YnI+DQotwqAgwqAgwqAgwqAweDczLCAweDAyLCAweDQyLCAweEM5LCAw eDIzLCAweDE4LCAweDhFLCAweEI0LDxicj4NCi3CoCDCoCDCoCDCoDB4NkYsIDB4QjQsIDB4QTMs IDB4NTQsIDB4NkUsIDB4ODgsIDB4M0IsIDB4NjIsPGJyPg0KLcKgIMKgIMKgIMKgMHg3QywgMHgw MiwgMHg4RCwgMHg0QywgMHg5RiwgMHhDOCwgMHg0NSwgMHhGNCw8YnI+DQotwqAgwqAgwqAgwqAw eEM5LCAweERFLCAweDRGLCAweEVCLCAweDIyLCAweDgzLCAweDFCLCAweEU0LDxicj4NCi3CoCDC oCDCoCDCoDB4NDksIDB4MzcsIDB4RTQsIDB4QUQsIDB4RTcsIDB4Q0QsIDB4MjEsIDB4NTQsPGJy Pg0KLcKgIMKgIMKgIMKgMHhCQywgMHgxQywgMHhDMiwgMHgwNCwgMHg5NywgMHhCNCwgMHgxMCwg MHg2MSw8YnI+DQotwqAgwqAgwqAgwqAweEYwLCAweEU0LCAweEVGLCAweDI3LCAweDYzLCAweDNB LCAweERBLCAweDkxLDxicj4NCi3CoCDCoCDCoCDCoDB4NDEsIDB4MjUsIDB4NjIsIDB4MUMsIDB4 NUMsIDB4QjYsIDB4MzgsIDB4NEEsPGJyPg0KLcKgIMKgIMKgIMKgMHg4OCwgMHg3MSwgMHg1OSwg MHg1QSwgMHg4RCwgMHhBMCwgMHgwOSwgMHhBRiw8YnI+DQotwqAgwqAgwqAgwqAweDcyLCAweDk0 LCAweEQ3LCAweDc5LCAweDVDLCAweDYwLCAweDdDLCAweDhGLDxicj4NCi3CoCDCoCDCoCDCoDB4 NEMsIDB4RjUsIDB4RDksIDB4QTEsIDB4MzksIDB4NkQsIDB4ODEsIDB4MjgsPGJyPg0KLcKgIMKg IMKgIMKgMHhFRiwgMHgxMywgMHgyOCwgMHhERiwgMHhGNSwgMHgzRSwgMHhGNywgMHg4RSw8YnI+ DQotwqAgwqAgwqAgwqAweDA5LCAweDlDLCAweDc4LCAweDE4LCAweDc5LCAweEI4LCAweDY4LCAw eEQ3LDxicj4NCi3CoCDCoCDCoCDCoDB4QTgsIDB4MjksIDB4NjIsIDB4QUQsIDB4REUsIDB4RTEs IDB4NjEsIDB4NzYsPGJyPg0KLcKgIMKgIMKgIMKgMHgxQiwgMHgwNSwgMHgxNiwgMHhDRCwgMHhC RiwgMHgwMiwgMHg4RSwgMHhBNiw8YnI+DQotwqAgwqAgwqAgwqAweDQzLCAweDZFLCAweDkyLCAw eDU1LCAweDRGLCAweDYwLCAweDlDLCAweDAzLDxicj4NCi3CoCDCoCDCoCDCoDB4QjgsIDB4NEYs IDB4QTMsIDB4MDIsIDB4QUMsIDB4QTgsIDB4QTcsIDB4MEMsPGJyPg0KLcKgIMKgIMKgIMKgMHgx RSwgMHhCNSwgMHg2QiwgMHhGOCwgMHhDOCwgMHg0RCwgMHhERSwgMHhEMiw8YnI+DQotwqAgwqAg wqAgwqAweEIwLCAweDI5LCAweDZFLCAweDQwLCAweEU2LCAweEQ2LCAweEM5LCAweEU2LDxicj4N Ci3CoCDCoCDCoCDCoDB4QjksIDB4MEYsIDB4QjYsIDB4NjMsIDB4RjUsIDB4QUEsIDB4MkIsIDB4 OTYsPGJyPg0KLcKgIMKgIMKgIMKgMHhBNywgMHgxNiwgMHhBQywgMHg0RSwgMHgwQSwgMHgzMywg MHgxQywgMHhBNiw8YnI+DQotwqAgwqAgwqAgwqAweEU2LCAweEJELCAweDhBLCAweENGLCAweDQw LCAweEE5LCAweEIyLCAweEZBLDxicj4NCi3CoCDCoCDCoCDCoDB4NjMsIDB4MjcsIDB4RkQsIDB4 OUIsIDB4RDksIDB4RkMsIDB4RDUsIDB4ODcsPGJyPg0KLcKgIMKgIMKgIMKgMHg4RCwgMHg0Qywg MHhCNiwgMHhBNCwgMHhDQiwgMHhFNywgMHg3NCwgMHg1NSw8YnI+DQotwqAgwqAgwqAgwqAweEY0 LCAweEZCLCAweDQxLCAweDI1LCAweEI1LCAweDRCLCAweDBBLCAweDFCLDxicj4NCi3CoCDCoCDC oCDCoDB4QjEsIDB4RDYsIDB4QjcsIDB4RDksIDB4NDcsIDB4MkEsIDB4QzMsIDB4OTgsPGJyPg0K LcKgIMKgIMKgIMKgMHg2QSwgMHhDNCwgMHgwMywgMHg3MywgMHgxRiwgMHg5MywgMHg2RSwgMHg1 Myw8YnI+DQotwqAgwqAgwqAgwqAweDE5LCAweDI1LCAweDY0LCAweDE1LCAweDgzLCAweEY5LCAw eDczLCAweDJBLDxicj4NCi3CoCDCoCDCoCDCoDB4NzQsIDB4QjQsIDB4OTMsIDB4NjksIDB4QzQs IDB4NzIsIDB4RkMsIDB4MjYsPGJyPg0KLcKgIMKgIMKgIMKgMHhBMiwgMHg5RiwgMHg0MywgMHg0 NSwgMHhERCwgMHhCOSwgMHhFRiwgMHgzNiw8YnI+DQotwqAgwqAgwqAgwqAweEM4LCAweDNBLCAw eENELCAweDk5LCAweDlCLCAweDU0LCAweDFBLCAweDM2LDxicj4NCi3CoCDCoCDCoCDCoDB4QzEs IDB4NTksIDB4RjgsIDB4OTgsIDB4QTgsIDB4Q0MsIDB4MjgsIDB4MEQsPGJyPg0KLcKgIMKgIMKg IMKgMHg3MywgMHg0QywgMHhFRSwgMHg5OCwgMHhDQiwgMHg3QywgMHg1OCwgMHg3RSw8YnI+DQot wqAgwqAgwqAgwqAweDIwLCAweDc1LCAweDFFLCAweEI3LCAweEM5LCAweEY4LCAweEYyLCAweDBF LDxicj4NCi3CoCDCoCDCoCDCoDB4NjMsIDB4OUUsIDB4MDUsIDB4NzgsIDB4MUEsIDB4QjYsIDB4 QTgsIDB4N0EsPGJyPg0KLcKgIMKgIMKgIMKgMHhGOSwgMHg5OCwgMHg2QSwgMHhBNiwgMHg0Niwg MHg4NCwgMHgyRSwgMHhGNiw8YnI+DQotwqAgwqAgwqAgwqAweDRCLCAweERDLCAweDlCLCAweDhG LCAweDlCLCAweDhGLCAweEVFLCAweEI0LDxicj4NCi3CoCDCoCDCoCDCoDB4QUEsIDB4M0YsIDB4 RUUsIDB4QzAsIDB4MzcsIDB4MjcsIDB4NzYsIDB4QzcsPGJyPg0KLcKgIMKgIMKgIMKgMHg5NSwg MHhCQiwgMHgyNiwgMHg3NCwgMHg2OSwgMHgxMiwgMHg3RiwgMHhGMSw8YnI+DQotwqAgwqAgwqAg wqAweEJCLCAweEZGLCAweEFFLCAweEI1LCAweDk5LCAweDZFLCAweENCLCAweDBDPGJyPg0KLX07 PGJyPg0KLTxicj4NCi1zdGF0aWMgY29uc3QgdWludDhfdCBjYXRjaF8yMl9xdW90ZV8yXzUxMl9i eXRlc19BRVNfQ0JDX0hNQUNfU0hBMV9kaWdlc3RbXSA9IHs8YnI+DQotwqAgwqAgwqAgwqAweDlh LCAweDRmLCAweDg4LCAweDFiLCAweGI2LCAweDhmLCAweGQ4LCAweDYwLDxicj4NCi3CoCDCoCDC oCDCoDB4NDIsIDB4MWEsIDB4N2QsIDB4M2QsIDB4ZjUsIDB4ODIsIDB4ODAsIDB4ZjEsPGJyPg0K LcKgIMKgIMKgIMKgMHgxOCwgMHg4YywgMHgxZCwgMHgzMjxicj4NCi19Ozxicj4NCi08YnI+DQor c3RhdGljIHVpbnQ4X3QgYWVzX2NiY19pdltdID0gezxicj4NCivCoCDCoCDCoCDCoDB4MDAsIDB4 MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsPGJyPg0KK8KgIMKgIMKgIMKg MHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiB9Ozxicj4NCjxi cj4NCsKgLyogTXVsdGlzZXNzaW9uIFZlY3RvciBjb250ZXh0IFRlc3QgKi88YnI+DQrCoC8qQmVn aW4gU2Vzc2lvbiAwICovPGJyPg0KQEAgLTIxNzQsMjkgKzIwNTQsNiBAQCBzdGF0aWMgY29uc3Qg dWludDhfdCBtc19hZXNfY2JjX2NpcGhlcjBbXSA9IHs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCAweEZBLCAweDEzLCAweEJCLCAweDZCLCAweDNGLCAweDQ1LCAweDlGLCAweEJGPGJyPg0K wqB9Ozxicj4NCjxicj4NCi08YnI+DQotc3RhdGljwqAgdWludDhfdCBtc19obWFjX2tleTBbXSA9 IHs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAweEZGLCAweDFBLCAweDdELCAweDNELCAw eEY1LCAweDgyLCAweDgwLCAweEYxLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDB4RjEs IDB4MzUsIDB4NUMsIDB4M0IsIDB4REQsIDB4OUEsIDB4NjUsIDB4QkEsPGJyPg0KLcKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgMHg1OCwgMHgzNCwgMHg4NSwgMHg2NSwgMHgxQywgMHg0MiwgMHg1MCwg MHg3Niw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAweDlBLCAweEFGLCAweDg4LCAweDFC LCAweEI2LCAweDhGLCAweEY4LCAweDYwLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDB4 QTIsIDB4NUEsIDB4N0YsIDB4M0YsIDB4RjQsIDB4NzIsIDB4NzAsIDB4RjEsPGJyPg0KLcKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgMHhGNSwgMHgzNSwgMHg0QywgMHgzQiwgMHhERCwgMHg5MCwgMHg2 NSwgMHhCMCw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAweDQ3LCAweDNBLCAweDc1LCAw eDYxLCAweDVDLCAweEEyLCAweDEwLCAweDc2LDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDC oDB4OUEsIDB4QUYsIDB4NzcsIDB4NUIsIDB4QjYsIDB4N0YsIDB4RjcsIDB4NjA8YnI+DQotfTs8 YnI+DQotPGJyPg0KLXN0YXRpYyBjb25zdCB1aW50OF90IG1zX2htYWNfZGlnZXN0MFtdID0gezxi cj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDB4NDMsIDB4NTIsIDB4RUQsIDB4MzQsIDB4QUIs IDB4MzYsIDB4QjIsIDB4NTEsPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgMHhGQiwgMHhB MywgMHhBNiwgMHg3QywgMHgzOCwgMHhGQywgMHg0MiwgMHg4Riw8YnI+DQotwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAweDU3LCAweDY0LCAweEFCLCAweDgxLCAweEE3LCAweDg5LCAweEI3LCAweDZD LDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDB4QTAsIDB4REMsIDB4QjksIDB4NEQsIDB4 QzQsIDB4MzAsIDB4RjksIDB4RDQsPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgMHgxMCwg MHg4MiwgMHg1NSwgMHhEMCwgMHhBQiwgMHgzMiwgMHhGQiwgMHg1Niw8YnI+DQotwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAweDBELCAweEU0LCAweDY4LCAweDNELCAweDc2LCAweEQwLCAweDdCLCAw eEU0LDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDB4QTYsIDB4MkMsIDB4MzQsIDB4OUUs IDB4OEMsIDB4NDEsIDB4RjgsIDB4MjMsPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgMHgy OCwgMHgxQiwgMHgzQSwgMHg5MCwgMHgyNiwgMHgzNCwgMHg0NywgMHg5MDxicj4NCi3CoCDCoCDC oCDCoCDCoCDCoCDCoCDCoH07PGJyPg0KLTxicj4NCsKgLyogRW5kIFNlc3Npb24gMCAqLzxicj4N CsKgLyogQmVnaW4gc2Vzc2lvbiAxICovPGJyPg0KPGJyPg0KQEAgLTIyNzgsMjcgKzIxMzUsNiBA QCBzdGF0aWMgY29uc3QgdWludDhfdCBtc19hZXNfY2JjX2NpcGhlcjFbXSA9IHs8YnI+DQo8YnI+ DQrCoH07PGJyPg0KPGJyPg0KLXN0YXRpYyB1aW50OF90IG1zX2htYWNfa2V5MVtdID0gezxicj4N Ci3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDB4RkUsIDB4MUEsIDB4N0QsIDB4M0QsIDB4RjUsIDB4 ODIsIDB4ODAsIDB4RjEsPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgMHhGMSwgMHgzNSwg MHg1QywgMHgzQiwgMHhERCwgMHg5QSwgMHg2NSwgMHhCQSw8YnI+DQotwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAweDU4LCAweDM0LCAweDg1LCAweDY1LCAweDFDLCAweDQyLCAweDUwLCAweDc2LDxi cj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDB4OUEsIDB4QUYsIDB4ODgsIDB4MUIsIDB4QjYs IDB4OEYsIDB4RjgsIDB4NjAsPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgMHhBMiwgMHg1 QSwgMHg3RiwgMHgzRiwgMHhGNCwgMHg3MiwgMHg3MCwgMHhGMSw8YnI+DQotwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAweEY1LCAweDM1LCAweDRDLCAweDNCLCAweERELCAweDkwLCAweDY1LCAweEIw LDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDB4NDcsIDB4M0EsIDB4NzUsIDB4NjEsIDB4 NUMsIDB4QTIsIDB4MTAsIDB4NzYsPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgMHg5QSwg MHhBRiwgMHg3NywgMHg1QiwgMHhCNiwgMHg3RiwgMHhGNywgMHg2MDxicj4NCi19Ozxicj4NCi08 YnI+DQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgbXNfaG1hY19kaWdlc3QxW10gPSB7PGJyPg0KLcKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgMHhDRSwgMHg2RSwgMHg1RiwgMHg3NywgMHg5NiwgMHg5QSwg MHhCMSwgMHg2OSw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAweDJELCAweDVFLCAweEYz LCAweDJGLCAweDMyLCAweDEwLCAweENCLCAweDUwLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDC oCDCoDB4MEUsIDB4MDksIDB4NTYsIDB4MjUsIDB4MDcsIDB4MzQsIDB4QzksIDB4MjAsPGJyPg0K LcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgMHhFQywgMHgxMywgMHg0MywgMHgyMywgMHg1QywgMHgw OCwgMHg4QiwgMHhDRCw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAweERDLCAweDg2LCAw eDhDLCAweEVFLCAweDBBLCAweDk1LCAweDJFLCAweEI5LDxicj4NCi3CoCDCoCDCoCDCoCDCoCDC oCDCoCDCoDB4OEMsIDB4N0IsIDB4MDIsIDB4N0EsIDB4RDQsIDB4RTEsIDB4NDksIDB4QjQsPGJy Pg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgMHg0NSwgMHhCNSwgMHg1MiwgMHgzNywgMHhDNiwg MHhGRiwgMHhGRSwgMHhBQSw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAweDBBLCAweDg3 LCAweEI4LCAweDUxLCAweEY5LCAweDJBLCAweDAxLCAweDhGPGJyPg0KLX07PGJyPg0KwqAvKiBF bmQgU2Vzc2lvbiAxwqAgKi88YnI+DQrCoC8qIEJlZ2luIFNlc3Npb24gMiAqLzxicj4NCsKgc3Rh dGljwqAgdWludDhfdCBtc19hZXNfY2JjX2tleTJbXSA9IHs8YnI+DQpAQCAtMjM3OCwyOCArMjIx NCw2IEBAIHN0YXRpYyBjb25zdCB1aW50OF90IG1zX2Flc19jYmNfY2lwaGVyMltdID0gezxicj4N CsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIDB4QTksIDB4NTksIDB4QzEsIDB4RDYsIDB4QzMsIDB4 NTcsIDB4NUIsIDB4OTI8YnI+DQrCoH07PGJyPg0KPGJyPg0KLXN0YXRpY8KgIHVpbnQ4X3QgbXNf aG1hY19rZXkyW10gPSB7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgMHhGQywgMHgxQSwg MHg3RCwgMHgzRCwgMHhGNSwgMHg4MiwgMHg4MCwgMHhGMSw8YnI+DQotwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAweEYxLCAweDM1LCAweDVDLCAweDNCLCAweERELCAweDlBLCAweDY1LCAweEJBLDxi cj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDB4NTgsIDB4MzQsIDB4ODUsIDB4NjUsIDB4MUMs IDB4NDIsIDB4NTAsIDB4NzYsPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgMHg5QSwgMHhB RiwgMHg4OCwgMHgxQiwgMHhCNiwgMHg4RiwgMHhGOCwgMHg2MCw8YnI+DQotwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAweEEyLCAweDVBLCAweDdGLCAweDNGLCAweEY0LCAweDcyLCAweDcwLCAweEYx LDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDB4RjUsIDB4MzUsIDB4NEMsIDB4M0IsIDB4 REQsIDB4OTAsIDB4NjUsIDB4QjAsPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgMHg0Nywg MHgzQSwgMHg3NSwgMHg2MSwgMHg1QywgMHhBMiwgMHgxMCwgMHg3Niw8YnI+DQotwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAweDlBLCAweEFGLCAweDc3LCAweDVCLCAweEI2LCAweDdGLCAweEY3LCAw eDYwPGJyPg0KLX07PGJyPg0KLTxicj4NCi1zdGF0aWMgY29uc3QgdWludDhfdCBtc19obWFjX2Rp Z2VzdDJbXSA9IHs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAweEE1LCAweDBGLCAweDlD LCAweEZCLCAweDA4LCAweDYyLCAweDU5LCAweEZGLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDC oCDCoDB4ODAsIDB4MkYsIDB4RUIsIDB4NEIsIDB4RTEsIDB4NDYsIDB4MjEsIDB4RDYsPGJyPg0K LcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgMHgwMiwgMHg5OCwgMHhGMiwgMHg4RSwgMHhGNCwgMHhF QywgMHhENCwgMHg3Nyw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAweDg2LCAweDRDLCAw eDMxLCAweDI4LCAweEM4LCAweDI1LCAweDgwLCAweDI3LDxicj4NCi3CoCDCoCDCoCDCoCDCoCDC oCDCoCDCoDB4M0EsIDB4NzIsIDB4NUQsIDB4NkEsIDB4NTYsIDB4OEEsIDB4RDMsIDB4ODIsPGJy Pg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgMHhCMCwgMHhFQywgMHgzMSwgMHg2RCwgMHg4Qiwg MHg2QiwgMHhCNCwgMHgyNCw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAweEU3LCAweDYy LCAweEMxLCAweDUyLCAweEJDLCAweDE0LCAweDFCLCAweDhFLDxicj4NCi3CoCDCoCDCoCDCoCDC oCDCoCDCoCDCoDB4RUMsIDB4OUEsIDB4RjEsIDB4NDcsIDB4ODAsIDB4RDIsIDB4QjAsIDB4NTk8 YnI+DQotfTs8YnI+DQotPGJyPg0KwqAvKiBFbmQgU2Vzc2lvbiAyICovPGJyPg0KPGJyPg0KwqAj ZGVmaW5lIE1BWF9PUFNfUFJPQ0VTU0VEIChNQVhfTlVNX09QU19JTkZMSUdIVCAtIDEpPGJyPg0K QEAgLTg5ODgsMjE4ICs4ODAyLDE3MCBAQCB0ZXN0X3ZlcmlmeV9hdXRoX2Flc19jbWFjX2NpcGhl cl9udWxsX3Rlc3RfY2FzZV8xKHZvaWQpPGJyPg0KPGJyPg0KwqAvKiAqKioqKiBBRUFEIGFsZ29y aXRobSBUZXN0cyAqKioqKiAqLzxicj4NCjxicj4NCitzdGF0aWMgdm9pZDxicj4NCitzZXR1cF9h ZWFkX3hmb3JtKGNvbnN0IHN0cnVjdCBhZWFkX3Rlc3RfZGF0YSAqZGF0YSw8YnI+DQorwqAgwqAg wqAgwqBzdHJ1Y3QgcnRlX2NyeXB0b19zeW1feGZvcm0gKnhmb3JtKTxicj4NCit7PGJyPg0KK8Kg IMKgIMKgIMKgeGZvcm0tJmd0O3R5cGUgPSBSVEVfQ1JZUFRPX1NZTV9YRk9STV9BRUFEOzxicj4N CivCoCDCoCDCoCDCoHhmb3JtLSZndDtuZXh0ID0gTlVMTDs8YnI+DQorwqAgwqAgwqAgwqB4Zm9y bS0mZ3Q7YWVhZC5hbGdvID0gZGF0YS0mZ3Q7YWxnbzs8YnI+DQorwqAgwqAgwqAgwqB4Zm9ybS0m Z3Q7YWVhZC5rZXkubGVuZ3RoID0gZGF0YS0mZ3Q7a2V5Lmxlbjs8YnI+DQorwqAgwqAgwqAgwqB4 Zm9ybS0mZ3Q7YWVhZC5pdi5vZmZzZXQgPSBJVl9PRkZTRVQ7PGJyPg0KK8KgIMKgIMKgIMKgeGZv cm0tJmd0O2FlYWQuaXYubGVuZ3RoID0gZGF0YS0mZ3Q7aXYubGVuOzxicj4NCivCoCDCoCDCoCDC oHhmb3JtLSZndDthZWFkLmRpZ2VzdF9sZW5ndGggPSBkYXRhLSZndDthdXRoX3RhZy5sZW47PGJy Pg0KK8KgIMKgIMKgIMKgeGZvcm0tJmd0O2FlYWQuYWFkX2xlbmd0aCA9IGRhdGEtJmd0O2FhZC5s ZW47PGJyPg0KK308YnI+DQorPGJyPg0KwqBzdGF0aWMgaW50PGJyPg0KLWNyZWF0ZV9hZWFkX3Nl c3Npb24odWludDhfdCBkZXZfaWQsIGVudW0gcnRlX2NyeXB0b19hZWFkX2FsZ29yaXRobSBhbGdv LDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGVudW0gcnRlX2NyeXB0b19hZWFkX29wZXJh dGlvbiBvcCw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBjb25zdCB1aW50OF90ICprZXks IGNvbnN0IHVpbnQ4X3Qga2V5X2xlbiw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBjb25z dCB1aW50MTZfdCBhYWRfbGVuLCBjb25zdCB1aW50OF90IGF1dGhfbGVuLDxicj4NCi3CoCDCoCDC oCDCoCDCoCDCoCDCoCDCoHVpbnQ4X3QgaXZfbGVuKTxicj4NCitjcmVhdGVfYWVhZF9zZXNzaW9u KHVpbnQ4X3QgZGV2X2lkLCBlbnVtIHJ0ZV9jcnlwdG9fYWVhZF9vcGVyYXRpb24gYWVhZF9vcCw8 YnI+DQorwqAgwqAgwqAgwqBjb25zdCBzdHJ1Y3QgYWVhZF90ZXN0X2RhdGEgKmRhdGEpPGJyPg0K wqB7PGJyPg0KK8KgIMKgIMKgIMKgY29uc3QgaW50IGtleV9sZW4gPSBkYXRhLSZndDtrZXkubGVu Ozxicj4NCivCoCDCoCDCoCDCoC8qPGJyPg0KK8KgIMKgIMKgIMKgICogUE1EIHN0b3BzIHRvIHJl bHkgb24gdGhlIHhmb3JtIHZhbHVlcyBhcyBzb29uIGFzIHRoZSAmIzM5O3Nlc3Npb24gY3JlYXRl JiMzOTs8YnI+DQorwqAgwqAgwqAgwqAgKiBmdW5jdGlvbnMgZXhpdHMuIEhlbmNlIGl0IGlzIG9r IHRvIHVzZSBhIGxvY2FsIGFycmF5IHRvIHN0b3JlIGEga2V5Ljxicj4NCivCoCDCoCDCoCDCoCAq Lzxicj4NCsKgIMKgIMKgIMKgIHVpbnQ4X3QgYWVhZF9rZXlba2V5X2xlbl07PGJyPg0KPGJyPg0K LcKgIMKgIMKgIMKgc3RydWN0IGNyeXB0b190ZXN0c3VpdGVfcGFyYW1zICp0c19wYXJhbXMgPSAm YW1wO3Rlc3RzdWl0ZV9wYXJhbXM7PGJyPg0KLcKgIMKgIMKgIMKgc3RydWN0IGNyeXB0b191bml0 dGVzdF9wYXJhbXMgKnV0X3BhcmFtcyA9ICZhbXA7dW5pdHRlc3RfcGFyYW1zOzxicj4NCi08YnI+ DQotwqAgwqAgwqAgwqBtZW1jcHkoYWVhZF9rZXksIGtleSwga2V5X2xlbik7PGJyPg0KLTxicj4N Ci3CoCDCoCDCoCDCoC8qIFNldHVwIEFFQUQgUGFyYW1ldGVycyAqLzxicj4NCi3CoCDCoCDCoCDC oHV0X3BhcmFtcy0mZ3Q7YWVhZF94Zm9ybS50eXBlID0gUlRFX0NSWVBUT19TWU1fWEZPUk1fQUVB RDs8YnI+DQotwqAgwqAgwqAgwqB1dF9wYXJhbXMtJmd0O2FlYWRfeGZvcm0ubmV4dCA9IE5VTEw7 PGJyPg0KLcKgIMKgIMKgIMKgdXRfcGFyYW1zLSZndDthZWFkX3hmb3JtLmFlYWQuYWxnbyA9IGFs Z287PGJyPg0KLcKgIMKgIMKgIMKgdXRfcGFyYW1zLSZndDthZWFkX3hmb3JtLmFlYWQub3AgPSBv cDs8YnI+DQotwqAgwqAgwqAgwqB1dF9wYXJhbXMtJmd0O2FlYWRfeGZvcm0uYWVhZC5rZXkuZGF0 YSA9IGFlYWRfa2V5Ozxicj4NCi3CoCDCoCDCoCDCoHV0X3BhcmFtcy0mZ3Q7YWVhZF94Zm9ybS5h ZWFkLmtleS5sZW5ndGggPSBrZXlfbGVuOzxicj4NCi3CoCDCoCDCoCDCoHV0X3BhcmFtcy0mZ3Q7 YWVhZF94Zm9ybS5hZWFkLml2Lm9mZnNldCA9IElWX09GRlNFVDs8YnI+DQotwqAgwqAgwqAgwqB1 dF9wYXJhbXMtJmd0O2FlYWRfeGZvcm0uYWVhZC5pdi5sZW5ndGggPSBpdl9sZW47PGJyPg0KLcKg IMKgIMKgIMKgdXRfcGFyYW1zLSZndDthZWFkX3hmb3JtLmFlYWQuZGlnZXN0X2xlbmd0aCA9IGF1 dGhfbGVuOzxicj4NCi3CoCDCoCDCoCDCoHV0X3BhcmFtcy0mZ3Q7YWVhZF94Zm9ybS5hZWFkLmFh ZF9sZW5ndGggPSBhYWRfbGVuOzxicj4NCi08YnI+DQotwqAgwqAgwqAgwqBkZWJ1Z19oZXhkdW1w KHN0ZG91dCwgJnF1b3Q7a2V5OiZxdW90Oywga2V5LCBrZXlfbGVuKTs8YnI+DQotPGJyPg0KLcKg IMKgIMKgIMKgLyogQ3JlYXRlIENyeXB0byBzZXNzaW9uKi88YnI+DQotwqAgwqAgwqAgwqB1dF9w YXJhbXMtJmd0O3Nlc3MgPSBydGVfY3J5cHRvZGV2X3N5bV9zZXNzaW9uX2NyZWF0ZShkZXZfaWQs PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJmFtcDt1dF9wYXJhbXMt Jmd0O2FlYWRfeGZvcm0sIHRzX3BhcmFtcy0mZ3Q7c2Vzc2lvbl9tcG9vbCk7PGJyPg0KLcKgIMKg IMKgIMKgaWYgKHV0X3BhcmFtcy0mZ3Q7c2VzcyA9PSBOVUxMICZhbXA7JmFtcDsgcnRlX2Vycm5v ID09IEVOT1RTVVApPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcmV0dXJuIFRFU1RfU0tJ UFBFRDs8YnI+DQotwqAgwqAgwqAgwqBURVNUX0FTU0VSVF9OT1RfTlVMTCh1dF9wYXJhbXMtJmd0 O3Nlc3MsICZxdW90O1Nlc3Npb24gY3JlYXRpb24gZmFpbGVkJnF1b3Q7KTs8YnI+DQorwqAgwqAg wqAgwqBtZW1jcHkoYWVhZF9rZXksIGRhdGEtJmd0O2tleS5kYXRhLCBrZXlfbGVuKTs8YnI+DQor wqAgwqAgwqAgwqAvKiBTZXR1cCBBRUFEIHhmb3JtIHBhcmFtZXRlcnMgKi88YnI+DQorwqAgwqAg wqAgwqBzZWxmLSZndDthZWFkX3hmb3JtLmFlYWQub3AgPSBhZWFkX29wOzxicj4NCivCoCDCoCDC oCDCoHNlbGYtJmd0O2FlYWRfeGZvcm0uYWVhZC5rZXkuZGF0YSA9IGFlYWRfa2V5Ozxicj4NCivC oCDCoCDCoCDCoHNldHVwX2FlYWRfeGZvcm0oZGF0YSwgJmFtcDtzZWxmLSZndDthZWFkX3hmb3Jt KTs8YnI+DQorwqAgwqAgwqAgwqAvKiBDcmVhdGUgY3J5cHRvZGV2IHNlc3Npb24gKi88YnI+DQor wqAgwqAgwqAgwqBzZWxmLSZndDtzZXNzID0gcnRlX2NyeXB0b2Rldl9zeW1fc2Vzc2lvbl9jcmVh dGUoZGV2X2lkLDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZhbXA7 c2VsZi0mZ3Q7YWVhZF94Zm9ybSwgdGVzdHN1aXRlX3BhcmFtcy5zZXNzaW9uX21wb29sKTs8YnI+ DQorwqAgwqAgwqAgwqBpZiAoc2VsZi0mZ3Q7c2VzcyA9PSBOVUxMICZhbXA7JmFtcDsgcnRlX2Vy cm5vID09IEVOT1RTVVApPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcmV0dXJuIFRFU1Rf U0tJUFBFRDs8YnI+DQorwqAgwqAgwqAgwqBURVNUX0FTU0VSVF9OT1RfTlVMTChzZWxmLSZndDtz ZXNzLCAmcXVvdDtTZXNzaW9uIGNyZWF0aW9uIGZhaWxlZCZxdW90Oyk7PGJyPg0KwqAgwqAgwqAg wqAgcmV0dXJuIDA7PGJyPg0KwqB9PGJyPg0KPGJyPg0KwqBzdGF0aWMgaW50PGJyPg0KwqBjcmVh dGVfYWVhZF94Zm9ybShzdHJ1Y3QgcnRlX2NyeXB0b19vcCAqb3AsPGJyPg0KLcKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgZW51bSBydGVfY3J5cHRvX2FlYWRfYWxnb3JpdGhtIGFsZ28sPGJyPg0KLcKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgZW51bSBydGVfY3J5cHRvX2FlYWRfb3BlcmF0aW9uIGFlYWRf b3AsPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdWludDhfdCAqa2V5LCBjb25zdCB1aW50 OF90IGtleV9sZW4sPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgY29uc3QgdWludDhfdCBh YWRfbGVuLCBjb25zdCB1aW50OF90IGF1dGhfbGVuLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDC oCDCoHVpbnQ4X3QgaXZfbGVuKTxicj4NCivCoCDCoCDCoCDCoGVudW0gcnRlX2NyeXB0b19hZWFk X29wZXJhdGlvbiBhZWFkX29wLDxicj4NCivCoCDCoCDCoCDCoGNvbnN0IHN0cnVjdCBhZWFkX3Rl c3RfZGF0YSAqZGF0YSw8YnI+DQorwqAgwqAgwqAgwqB1aW50OF90ICprZXkpPGJyPg0KwqB7PGJy Pg0KwqAgwqAgwqAgwqAgVEVTVF9BU1NFUlRfTk9UX05VTEwocnRlX2NyeXB0b19vcF9zeW1feGZv cm1zX2FsbG9jKG9wLCAxKSw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAmcXVvdDtmYWlsZWQgdG8gYWxsb2NhdGUgc3BhY2UgZm9yIGNyeXB0byB0cmFuc2Zvcm0mcXVv dDspOzxicj4NCi08YnI+DQotwqAgwqAgwqAgwqBzdHJ1Y3QgcnRlX2NyeXB0b19zeW1fb3AgKnN5 bV9vcCA9IG9wLSZndDtzeW07PGJyPg0KLTxicj4NCi3CoCDCoCDCoCDCoC8qIFNldHVwIEFFQUQg UGFyYW1ldGVycyAqLzxicj4NCi3CoCDCoCDCoCDCoHN5bV9vcC0mZ3Q7eGZvcm0tJmd0O3R5cGUg PSBSVEVfQ1JZUFRPX1NZTV9YRk9STV9BRUFEOzxicj4NCi3CoCDCoCDCoCDCoHN5bV9vcC0mZ3Q7 eGZvcm0tJmd0O25leHQgPSBOVUxMOzxicj4NCi3CoCDCoCDCoCDCoHN5bV9vcC0mZ3Q7eGZvcm0t Jmd0O2FlYWQuYWxnbyA9IGFsZ287PGJyPg0KLcKgIMKgIMKgIMKgc3ltX29wLSZndDt4Zm9ybS0m Z3Q7YWVhZC5vcCA9IGFlYWRfb3A7PGJyPg0KLcKgIMKgIMKgIMKgc3ltX29wLSZndDt4Zm9ybS0m Z3Q7YWVhZC5rZXkuZGF0YSA9IGtleTs8YnI+DQotwqAgwqAgwqAgwqBzeW1fb3AtJmd0O3hmb3Jt LSZndDthZWFkLmtleS5sZW5ndGggPSBrZXlfbGVuOzxicj4NCi3CoCDCoCDCoCDCoHN5bV9vcC0m Z3Q7eGZvcm0tJmd0O2FlYWQuaXYub2Zmc2V0ID0gSVZfT0ZGU0VUOzxicj4NCi3CoCDCoCDCoCDC oHN5bV9vcC0mZ3Q7eGZvcm0tJmd0O2FlYWQuaXYubGVuZ3RoID0gaXZfbGVuOzxicj4NCi3CoCDC oCDCoCDCoHN5bV9vcC0mZ3Q7eGZvcm0tJmd0O2FlYWQuZGlnZXN0X2xlbmd0aCA9IGF1dGhfbGVu Ozxicj4NCi3CoCDCoCDCoCDCoHN5bV9vcC0mZ3Q7eGZvcm0tJmd0O2FlYWQuYWFkX2xlbmd0aCA9 IGFhZF9sZW47PGJyPg0KLTxicj4NCi3CoCDCoCDCoCDCoGRlYnVnX2hleGR1bXAoc3Rkb3V0LCAm cXVvdDtrZXk6JnF1b3Q7LCBrZXksIGtleV9sZW4pOzxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCZxdW90O0ZhaWxlZCB0byBhbGxvY2F0ZSBzcGFjZSBmb3IgY3J5cHRvZGV2IHhmb3JtJnF1 b3Q7KTs8YnI+DQorwqAgwqAgwqAgwqAvKiBTZXR1cCBBRUFEIHhmb3JtIHBhcmFtZXRlcnMgKi88 YnI+DQorwqAgwqAgwqAgwqBvcC0mZ3Q7c3ltLSZndDt4Zm9ybS0mZ3Q7YWVhZC5vcCA9IGFlYWRf b3A7PGJyPg0KK8KgIMKgIMKgIMKgb3AtJmd0O3N5bS0mZ3Q7eGZvcm0tJmd0O2FlYWQua2V5LmRh dGEgPSBrZXk7PGJyPg0KK8KgIMKgIMKgIMKgc2V0dXBfYWVhZF94Zm9ybShkYXRhLCBvcC0mZ3Q7 c3ltLSZndDt4Zm9ybSk7PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgcmV0dXJuIDA7PGJyPg0KwqB9 PGJyPg0KPGJyPg0KwqBzdGF0aWMgaW50PGJyPg0KwqBjcmVhdGVfYWVhZF9vcGVyYXRpb24oZW51 bSBydGVfY3J5cHRvX2FlYWRfb3BlcmF0aW9uIG9wLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDC oCDCoGNvbnN0IHN0cnVjdCBhZWFkX3Rlc3RfZGF0YSAqdGRhdGEpPGJyPg0KK8KgIMKgIMKgIMKg IMKgIMKgIMKgIMKgY29uc3Qgc3RydWN0IGFlYWRfdGVzdF9kYXRhICpkYXRhKTxicj4NCsKgezxi cj4NCi3CoCDCoCDCoCDCoHN0cnVjdCBjcnlwdG9fdGVzdHN1aXRlX3BhcmFtcyAqdHNfcGFyYW1z ID0gJmFtcDt0ZXN0c3VpdGVfcGFyYW1zOzxicj4NCi3CoCDCoCDCoCDCoHN0cnVjdCBjcnlwdG9f dW5pdHRlc3RfcGFyYW1zICp1dF9wYXJhbXMgPSAmYW1wO3VuaXR0ZXN0X3BhcmFtczs8YnI+DQot PGJyPg0KLcKgIMKgIMKgIMKgdWludDhfdCAqcGxhaW50ZXh0LCAqY2lwaGVydGV4dDs8YnI+DQor wqAgwqAgwqAgwqB1aW50OF90ICpwbGFpbnRleHQsICpjaXBoZXJ0ZXh0LCAqaXZfcHRyOzxicj4N CsKgIMKgIMKgIMKgIHVuc2lnbmVkIGludCBhYWRfcGFkX2xlbiwgcGxhaW50ZXh0X3BhZF9sZW47 PGJyPg0KLTxicj4NCi3CoCDCoCDCoCDCoC8qIEdlbmVyYXRlIENyeXB0byBvcCBkYXRhIHN0cnVj dHVyZSAqLzxicj4NCi3CoCDCoCDCoCDCoHV0X3BhcmFtcy0mZ3Q7b3AgPSBydGVfY3J5cHRvX29w X2FsbG9jKHRzX3BhcmFtcy0mZ3Q7b3BfbXBvb2wsPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgUlRFX0NSWVBUT19PUF9UWVBFX1NZTU1FVFJJQyk7PGJyPg0KLcKgIMKg IMKgIMKgVEVTVF9BU1NFUlRfTk9UX05VTEwodXRfcGFyYW1zLSZndDtvcCw8YnI+DQotwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmcXVvdDtGYWlsZWQgdG8gYWxsb2NhdGUgc3lt bWV0cmljIGNyeXB0byBvcGVyYXRpb24gc3RydWN0JnF1b3Q7KTs8YnI+DQotPGJyPg0KLcKgIMKg IMKgIMKgc3RydWN0IHJ0ZV9jcnlwdG9fc3ltX29wICpzeW1fb3AgPSB1dF9wYXJhbXMtJmd0O29w LSZndDtzeW07PGJyPg0KK8KgIMKgIMKgIMKgc3RydWN0IHJ0ZV9jcnlwdG9fc3ltX29wICpzeW1f b3AgPSBzZWxmLSZndDtvcC0mZ3Q7c3ltOzxicj4NCjxicj4NCsKgIMKgIMKgIMKgIC8qIEFwcGVu ZCBhYWQgZGF0YSAqLzxicj4NCi3CoCDCoCDCoCDCoGlmICh0ZGF0YS0mZ3Q7YWxnbyA9PSBSVEVf Q1JZUFRPX0FFQURfQUVTX0NDTSkgezxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGFhZF9w YWRfbGVuID0gUlRFX0FMSUdOX0NFSUwodGRhdGEtJmd0O2FhZC5sZW4gKyAxOCwgMTYpOzxicj4N Ci3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHN5bV9vcC0mZ3Q7YWVhZC5hYWQuZGF0YSA9ICh1aW50 OF90ICopcnRlX3BrdG1idWZfYXBwZW5kKHV0X3BhcmFtcy0mZ3Q7aWJ1Ziw8YnI+DQorwqAgwqAg wqAgwqBpZiAoZGF0YS0mZ3Q7YWxnbyA9PSBSVEVfQ1JZUFRPX0FFQURfQUVTX0NDTSkgezxicj4N CivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGFhZF9wYWRfbGVuID0gUlRFX0FMSUdOX0NFSUwoZGF0 YS0mZ3Q7YWFkLmxlbiArIDE4LCAxNik7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgc3lt X29wLSZndDthZWFkLmFhZC5kYXRhID0gKHVpbnQ4X3QgKilydGVfcGt0bWJ1Zl9hcHBlbmQoc2Vs Zi0mZ3Q7aWJ1Ziw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCBhYWRfcGFkX2xlbik7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgVEVTVF9B U1NFUlRfTk9UX05VTEwoc3ltX29wLSZndDthZWFkLmFhZC5kYXRhLDxicj4NCsKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICZxdW90O25vIHJvb20gdG8gYXBw ZW5kIGFhZCZxdW90Oyk7PGJyPg0KLTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHN5bV9v cC0mZ3Q7YWVhZC5hYWQucGh5c19hZGRyID08YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBydGVfcGt0bWJ1Zl9pb3ZhKHV0X3BhcmFtcy0mZ3Q7aWJ1 Zik7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg cnRlX3BrdG1idWZfaW92YShzZWxmLSZndDtpYnVmKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCAvKiBDb3B5IEFBRCAxOCBieXRlcyBhZnRlciB0aGUgQUFEIHBvaW50ZXIsIGFjY29yZGlu ZyB0byB0aGUgQVBJICovPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgbWVtY3B5KHN5bV9v cC0mZ3Q7YWVhZC5hYWQuZGF0YSArIDE4LCB0ZGF0YS0mZ3Q7YWFkLmRhdGEsIHRkYXRhLSZndDth YWQubGVuKTs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBkZWJ1Z19oZXhkdW1wKHN0ZG91 dCwgJnF1b3Q7YWFkOiZxdW90Oywgc3ltX29wLSZndDthZWFkLmFhZC5kYXRhICsgMTgsPGJyPg0K LcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdGRhdGEtJmd0O2FhZC5sZW4pOzxi cj4NCi08YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBtZW1jcHkoc3ltX29wLSZndDthZWFk LmFhZC5kYXRhICsgMTgsIGRhdGEtJmd0O2FhZC5kYXRhLCBkYXRhLSZndDthYWQubGVuKTs8YnI+ DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAvKiBBcHBlbmQgSVYgYXQgdGhlIGVuZCBvZiB0aGUg Y3J5cHRvIG9wZXJhdGlvbiovPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdWludDhfdCAq aXZfcHRyID0gcnRlX2NyeXB0b19vcF9jdG9kX29mZnNldCh1dF9wYXJhbXMtJmd0O29wLDxicj4N CivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGl2X3B0ciA9IHJ0ZV9jcnlwdG9fb3BfY3RvZF9vZmZz ZXQoc2VsZi0mZ3Q7b3AsPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgdWludDhfdCAqLCBJVl9PRkZTRVQpOzxicj4NCi08YnI+DQrCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCAvKiBDb3B5IElWIDEgYnl0ZSBhZnRlciB0aGUgSVYgcG9pbnRlciwgYWNj b3JkaW5nIHRvIHRoZSBBUEkgKi88YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBydGVfbWVt Y3B5KGl2X3B0ciArIDEsIHRkYXRhLSZndDtpdi5kYXRhLCB0ZGF0YS0mZ3Q7aXYubGVuKTs8YnI+ DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBkZWJ1Z19oZXhkdW1wKHN0ZG91dCwgJnF1b3Q7aXY6 JnF1b3Q7LCBpdl9wdHIgKyAxLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoHRkYXRhLSZndDtpdi5sZW4pOzxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJ0ZV9t ZW1jcHkoaXZfcHRyICsgMSwgZGF0YS0mZ3Q7aXYuZGF0YSwgZGF0YS0mZ3Q7aXYubGVuKTs8YnI+ DQrCoCDCoCDCoCDCoCB9IGVsc2Ugezxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGFhZF9w YWRfbGVuID0gUlRFX0FMSUdOX0NFSUwodGRhdGEtJmd0O2FhZC5sZW4sIDE2KTs8YnI+DQotwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBzeW1fb3AtJmd0O2FlYWQuYWFkLmRhdGEgPSAodWludDhfdCAq KXJ0ZV9wa3RtYnVmX2FwcGVuZCh1dF9wYXJhbXMtJmd0O2lidWYsPGJyPg0KK8KgIMKgIMKgIMKg IMKgIMKgIMKgIMKgYWFkX3BhZF9sZW4gPSBSVEVfQUxJR05fQ0VJTChkYXRhLSZndDthYWQubGVu LCAxNik7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgc3ltX29wLSZndDthZWFkLmFhZC5k YXRhID0gKHVpbnQ4X3QgKilydGVfcGt0bWJ1Zl9hcHBlbmQoc2VsZi0mZ3Q7aWJ1Ziw8YnI+DQrC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBhYWRfcGFkX2xl bik7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgVEVTVF9BU1NFUlRfTk9UX05VTEwoc3lt X29wLSZndDthZWFkLmFhZC5kYXRhLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgICZxdW90O25vIHJvb20gdG8gYXBwZW5kIGFhZCZxdW90Oyk7PGJy Pg0KLTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHN5bV9vcC0mZ3Q7YWVhZC5hYWQucGh5 c19hZGRyID08YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqBydGVfcGt0bWJ1Zl9pb3ZhKHV0X3BhcmFtcy0mZ3Q7aWJ1Zik7PGJyPg0KLcKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgbWVtY3B5KHN5bV9vcC0mZ3Q7YWVhZC5hYWQuZGF0YSwgdGRhdGEtJmd0 O2FhZC5kYXRhLCB0ZGF0YS0mZ3Q7YWFkLmxlbik7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgZGVidWdfaGV4ZHVtcChzdGRvdXQsICZxdW90O2FhZDomcXVvdDssIHN5bV9vcC0mZ3Q7YWVh ZC5hYWQuZGF0YSw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0ZGF0 YS0mZ3Q7YWFkLmxlbik7PGJyPg0KLTxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoHJ0ZV9wa3RtYnVmX2lvdmEoc2VsZi0mZ3Q7aWJ1Zik7PGJyPg0K K8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgbWVtY3B5KHN5bV9vcC0mZ3Q7YWVhZC5hYWQuZGF0YSwg ZGF0YS0mZ3Q7YWFkLmRhdGEsIGRhdGEtJmd0O2FhZC5sZW4pOzxicj4NCsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIC8qIEFwcGVuZCBJViBhdCB0aGUgZW5kIG9mIHRoZSBjcnlwdG8gb3BlcmF0aW9u Ki88YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB1aW50OF90ICppdl9wdHIgPSBydGVfY3J5 cHRvX29wX2N0b2Rfb2Zmc2V0KHV0X3BhcmFtcy0mZ3Q7b3AsPGJyPg0KK8KgIMKgIMKgIMKgIMKg IMKgIMKgIMKgaXZfcHRyID0gcnRlX2NyeXB0b19vcF9jdG9kX29mZnNldChzZWxmLSZndDtvcCw8 YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB1aW50 OF90ICosIElWX09GRlNFVCk7PGJyPg0KLTxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlm ICh0ZGF0YS0mZ3Q7aXYubGVuID09IDApIHs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqBydGVfbWVtY3B5KGl2X3B0ciwgdGRhdGEtJmd0O2l2LmRhdGEsIEFFU19HQ01f SjBfTEVOR1RIKTs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBkZWJ1 Z19oZXhkdW1wKHN0ZG91dCwgJnF1b3Q7aXY6JnF1b3Q7LCBpdl9wdHIsPGJyPg0KLcKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgQUVTX0dDTV9KMF9MRU5HVEgp Ozxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoH0gZWxzZSB7PGJyPg0KLcKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcnRlX21lbWNweShpdl9wdHIsIHRkYXRhLSZndDtpdi5k YXRhLCB0ZGF0YS0mZ3Q7aXYubGVuKTs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqBkZWJ1Z19oZXhkdW1wKHN0ZG91dCwgJnF1b3Q7aXY6JnF1b3Q7LCBpdl9wdHIsPGJy Pg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdGRhdGEt Jmd0O2l2Lmxlbik7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfTxicj4NCivCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoGlmIChkYXRhLSZndDtpdi5sZW4gPT0gMCk8YnI+DQorwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBydGVfbWVtY3B5KGl2X3B0ciwgZGF0YS0mZ3Q7aXYu ZGF0YSwgQUVTX0dDTV9KMF9MRU5HVEgpOzxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGVs c2U8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBydGVfbWVtY3B5KGl2 X3B0ciwgZGF0YS0mZ3Q7aXYuZGF0YSwgZGF0YS0mZ3Q7aXYubGVuKTs8YnI+DQrCoCDCoCDCoCDC oCB9PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgLyogQXBwZW5kIHBsYWludGV4dC9jaXBoZXJ0ZXh0 ICovPGJyPg0KwqAgwqAgwqAgwqAgaWYgKG9wID09IFJURV9DUllQVE9fQUVBRF9PUF9FTkNSWVBU KSB7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcGxhaW50ZXh0X3BhZF9sZW4gPSBSVEVf QUxJR05fQ0VJTCh0ZGF0YS0mZ3Q7cGxhaW50ZXh0LmxlbiwgMTYpOzxicj4NCi3CoCDCoCDCoCDC oCDCoCDCoCDCoCDCoHBsYWludGV4dCA9ICh1aW50OF90ICopcnRlX3BrdG1idWZfYXBwZW5kKHV0 X3BhcmFtcy0mZ3Q7aWJ1Ziw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBwbGFpbnRleHRf cGFkX2xlbiA9IFJURV9BTElHTl9DRUlMKGRhdGEtJmd0O3BsYWludGV4dC5sZW4sIDE2KTs8YnI+ DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBwbGFpbnRleHQgPSAodWludDhfdCAqKXJ0ZV9wa3Rt YnVmX2FwcGVuZChzZWxmLSZndDtpYnVmLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIHBsYWludGV4dF9wYWRfbGVuKTs8YnI+DQrCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCBURVNUX0FTU0VSVF9OT1RfTlVMTChwbGFpbnRleHQsICZxdW90O25vIHJv b20gdG8gYXBwZW5kIHBsYWludGV4dCZxdW90Oyk7PGJyPg0KPGJyPg0KLcKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgbWVtY3B5KHBsYWludGV4dCwgdGRhdGEtJmd0O3BsYWludGV4dC5kYXRhLCB0ZGF0 YS0mZ3Q7cGxhaW50ZXh0Lmxlbik7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZGVidWdf aGV4ZHVtcChzdGRvdXQsICZxdW90O3BsYWludGV4dDomcXVvdDssIHBsYWludGV4dCw8YnI+DQot wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0ZGF0YS0mZ3Q7 cGxhaW50ZXh0Lmxlbik7PGJyPg0KLTxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmICh1 dF9wYXJhbXMtJmd0O29idWYpIHs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBtZW1jcHko cGxhaW50ZXh0LCBkYXRhLSZndDtwbGFpbnRleHQuZGF0YSwgZGF0YS0mZ3Q7cGxhaW50ZXh0Lmxl bik7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKHNlbGYtJmd0O29idWYpIHs8YnI+ DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBjaXBoZXJ0ZXh0ID0gKHVpbnQ4 X3QgKilydGVfcGt0bWJ1Zl9hcHBlbmQoPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdXRfcGFyYW1zLSZndDtvYnVmLDxicj4N CivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoHNlbGYtJmd0O29idWYsPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcGxhaW50ZXh0X3BhZF9sZW4gKyBhYWRfcGFkX2xl bik7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgVEVTVF9BU1NFUlRf Tk9UX05VTEwoY2lwaGVydGV4dCw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAmcXVvdDtubyByb29tIHRvIGFwcGVuZCBjaXBo ZXJ0ZXh0JnF1b3Q7KTs8YnI+DQotPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgbWVtc2V0KGNpcGhlcnRleHQgKyBhYWRfcGFkX2xlbiwgMCw8YnI+DQotwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0ZGF0YS0m Z3Q7Y2lwaGVydGV4dC5sZW4pOzxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGRhdGEtJmd0O2NpcGhlcnRleHQubGVuKTs8YnI+ DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB9PGJyPg0KwqAgwqAgwqAgwqAgfSBlbHNlIHs8YnI+ DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBwbGFpbnRleHRfcGFkX2xlbiA9IFJURV9BTElHTl9D RUlMKHRkYXRhLSZndDtjaXBoZXJ0ZXh0LmxlbiwgMTYpOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDC oCDCoCDCoGNpcGhlcnRleHQgPSAodWludDhfdCAqKXJ0ZV9wa3RtYnVmX2FwcGVuZCh1dF9wYXJh bXMtJmd0O2lidWYsPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcGxhaW50ZXh0X3BhZF9s ZW4gPSBSVEVfQUxJR05fQ0VJTChkYXRhLSZndDtjaXBoZXJ0ZXh0LmxlbiwgMTYpOzxicj4NCivC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoGNpcGhlcnRleHQgPSAodWludDhfdCAqKXJ0ZV9wa3RtYnVm X2FwcGVuZChzZWxmLSZndDtpYnVmLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIHBsYWludGV4dF9wYWRfbGVuKTs8YnI+DQrCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCBURVNUX0FTU0VSVF9OT1RfTlVMTChjaXBoZXJ0ZXh0LDxicj4NCsKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICZxdW90O25vIHJvb20gdG8g YXBwZW5kIGNpcGhlcnRleHQmcXVvdDspOzxicj4NCi08YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqBtZW1jcHkoY2lwaGVydGV4dCwgdGRhdGEtJmd0O2NpcGhlcnRleHQuZGF0YSw8YnI+DQot wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0ZGF0YS0mZ3Q7 Y2lwaGVydGV4dC5sZW4pOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGRlYnVnX2hleGR1 bXAoc3Rkb3V0LCAmcXVvdDtjaXBoZXJ0ZXh0OiZxdW90OywgY2lwaGVydGV4dCw8YnI+DQotwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0ZGF0YS0mZ3Q7Y2lw aGVydGV4dC5sZW4pOzxicj4NCi08YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAodXRf cGFyYW1zLSZndDtvYnVmKSB7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgbWVtY3B5KGNp cGhlcnRleHQsIGRhdGEtJmd0O2NpcGhlcnRleHQuZGF0YSw8YnI+DQorwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBkYXRhLSZndDtjaXBoZXJ0ZXh0Lmxlbik7 PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKHNlbGYtJmd0O29idWYpIHs8YnI+DQrC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBwbGFpbnRleHQgPSAodWludDhfdCAq KXJ0ZV9wa3RtYnVmX2FwcGVuZCg8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB1dF9wYXJhbXMtJmd0O29idWYsPGJyPg0KK8Kg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg c2VsZi0mZ3Q7b2J1Ziw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBwbGFpbnRleHRfcGFkX2xlbiArIGFhZF9wYWRfbGVuKTs8 YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBURVNUX0FTU0VSVF9OT1Rf TlVMTChwbGFpbnRleHQsPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgJnF1b3Q7bm8gcm9vbSB0byBhcHBlbmQgcGxhaW50ZXh0 JnF1b3Q7KTs8YnI+DQotPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg bWVtc2V0KHBsYWludGV4dCArIGFhZF9wYWRfbGVuLCAwLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHRkYXRhLSZndDtwbGFp bnRleHQubGVuKTs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBkYXRhLSZndDtwbGFpbnRleHQubGVuKTs8YnI+DQrCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCB9PGJyPg0KwqAgwqAgwqAgwqAgfTxicj4NCjxicj4NCsKgIMKgIMKg IMKgIC8qIEFwcGVuZCBkaWdlc3QgZGF0YSAqLzxicj4NCsKgIMKgIMKgIMKgIGlmIChvcCA9PSBS VEVfQ1JZUFRPX0FFQURfT1BfRU5DUllQVCkgezxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IHN5bV9vcC0mZ3Q7YWVhZC5kaWdlc3QuZGF0YSA9ICh1aW50OF90ICopcnRlX3BrdG1idWZfYXBw ZW5kKDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oHV0X3BhcmFtcy0mZ3Q7b2J1ZiA/IHV0X3BhcmFtcy0mZ3Q7b2J1ZiA6PGJyPg0KLcKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgdXRfcGFyYW1zLSZndDtpYnVmLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHRkYXRhLSZndDth dXRoX3RhZy5sZW4pOzxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoHNlbGYtJmd0O29idWYgPyBzZWxmLSZndDtvYnVmIDo8YnI+DQorwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqBzZWxmLSZndDtpYnVmLDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGRhdGEtJmd0O2F1dGhfdGFn Lmxlbik7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgVEVTVF9BU1NFUlRfTk9UX05VTEwo c3ltX29wLSZndDthZWFkLmRpZ2VzdC5kYXRhLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICZxdW90O25vIHJvb20gdG8gYXBwZW5kIGRpZ2VzdCZx dW90Oyk7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgbWVtc2V0KHN5bV9vcC0mZ3Q7YWVh ZC5kaWdlc3QuZGF0YSwgMCwgdGRhdGEtJmd0O2F1dGhfdGFnLmxlbik7PGJyPg0KK8KgIMKgIMKg IMKgIMKgIMKgIMKgIMKgbWVtc2V0KHN5bV9vcC0mZ3Q7YWVhZC5kaWdlc3QuZGF0YSwgMCwgZGF0 YS0mZ3Q7YXV0aF90YWcubGVuKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBzeW1fb3At Jmd0O2FlYWQuZGlnZXN0LnBoeXNfYWRkciA9IHJ0ZV9wa3RtYnVmX2lvdmFfb2Zmc2V0KDxicj4N Ci3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHV0X3BhcmFt cy0mZ3Q7b2J1ZiA/IHV0X3BhcmFtcy0mZ3Q7b2J1ZiA6PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdXRf cGFyYW1zLSZndDtpYnVmLDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoHNlbGYtJmd0O29idWYgPyBzZWxmLSZndDtvYnVmIDo8YnI+DQorwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqBzZWxmLSZndDtpYnVmLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHBsYWludGV4dF9wYWRf bGVuICs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBhYWRfcGFkX2xlbik7PGJyPg0KwqAgwqAgwqAgwqAg fSBlbHNlIHs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBzeW1fb3AtJmd0O2FlYWQuZGln ZXN0LmRhdGEgPSAodWludDhfdCAqKXJ0ZV9wa3RtYnVmX2FwcGVuZCg8YnI+DQotwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB1dF9wYXJhbXMtJmd0O2lidWYs IHRkYXRhLSZndDthdXRoX3RhZy5sZW4pOzxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoHNlbGYtJmd0O2lidWYsIGRhdGEtJmd0O2F1dGhfdGFnLmxl bik7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgVEVTVF9BU1NFUlRfTk9UX05VTEwoc3lt X29wLSZndDthZWFkLmRpZ2VzdC5kYXRhLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgICZxdW90O25vIHJvb20gdG8gYXBwZW5kIGRpZ2VzdCZxdW90 Oyk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgc3ltX29wLSZndDthZWFkLmRpZ2VzdC5w aHlzX2FkZHIgPSBydGVfcGt0bWJ1Zl9pb3ZhX29mZnNldCg8YnI+DQotwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB1dF9wYXJhbXMtJmd0O2lidWYsPGJyPg0K K8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgc2VsZi0mZ3Q7 aWJ1Ziw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCBwbGFpbnRleHRfcGFkX2xlbiArIGFhZF9wYWRfbGVuKTs8YnI+DQo8YnI+DQotwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqBydGVfbWVtY3B5KHN5bV9vcC0mZ3Q7YWVhZC5kaWdlc3QuZGF0YSwgdGRh dGEtJmd0O2F1dGhfdGFnLmRhdGEsPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgdGRhdGEtJmd0O2F1dGhfdGFnLmxlbik7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKg IMKgcnRlX21lbWNweShzeW1fb3AtJmd0O2FlYWQuZGlnZXN0LmRhdGEsIGRhdGEtJmd0O2F1dGhf dGFnLmRhdGEsPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZGF0YS0m Z3Q7YXV0aF90YWcubGVuKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBkZWJ1Z19oZXhk dW1wKHN0ZG91dCwgJnF1b3Q7ZGlnZXN0OiZxdW90Oyw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCBzeW1fb3AtJmd0O2FlYWQuZGlnZXN0LmRhdGEsPGJyPg0KLcKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdGRhdGEtJmd0O2F1dGhfdGFnLmxlbik7PGJy Pg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZGF0YS0mZ3Q7YXV0aF90YWcu bGVuKTs8YnI+DQrCoCDCoCDCoCDCoCB9PGJyPg0KPGJyPg0KLcKgIMKgIMKgIMKgc3ltX29wLSZn dDthZWFkLmRhdGEubGVuZ3RoID0gdGRhdGEtJmd0O3BsYWludGV4dC5sZW47PGJyPg0KK8KgIMKg IMKgIMKgc3ltX29wLSZndDthZWFkLmRhdGEubGVuZ3RoID0gZGF0YS0mZ3Q7cGxhaW50ZXh0Lmxl bjs8YnI+DQrCoCDCoCDCoCDCoCBzeW1fb3AtJmd0O2FlYWQuZGF0YS5vZmZzZXQgPSBhYWRfcGFk X2xlbjs8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCByZXR1cm4gMDs8YnI+DQpAQCAtOTIxNSwxMCAr ODk4MSw3IEBAIHRlc3RfYXV0aGVudGljYXRlZF9lbmNyeXB0aW9uX2hlbHBlcihjb25zdCBzdHJ1 Y3QgYWVhZF90ZXN0X2RhdGEgKnRkYXRhLCBib29sIHVzPGJyPg0KwqAgwqAgwqAgwqAgdWludDhf dCAqY2lwaGVydGV4dCwgKmF1dGhfdGFnOzxicj4NCsKgIMKgIMKgIMKgIHVpbnQxNl90IHBsYWlu dGV4dF9wYWRfbGVuOzxicj4NCsKgIMKgIMKgIMKgIHVpbnQzMl90IGk7PGJyPg0KLcKgIMKgIMKg IMKgc3RydWN0IHJ0ZV9jcnlwdG9kZXZfaW5mbyBkZXZfaW5mbzs8YnI+DQotPGJyPg0KLcKgIMKg IMKgIMKgcnRlX2NyeXB0b2Rldl9pbmZvX2dldCh0c19wYXJhbXMtJmd0O3ZhbGlkX2RldnNbMF0s ICZhbXA7ZGV2X2luZm8pOzxicj4NCi3CoCDCoCDCoCDCoHVpbnQ2NF90IGZlYXRfZmxhZ3MgPSBk ZXZfaW5mby5mZWF0dXJlX2ZsYWdzOzxicj4NCivCoCDCoCDCoCDCoHVpbnQ2NF90IGZlYXRfZmxh Z3MgPSB0c19wYXJhbXMtJmd0O2Rldl9pbmZvLmZlYXR1cmVfZmxhZ3M7PGJyPg0KPGJyPg0KwqAg wqAgwqAgwqAgaWYgKChnbG9iYWxfYXBpX3Rlc3RfdHlwZSA9PSBDUllQVE9ERVZfUkFXX0FQSV9U RVNUKSAmYW1wOyZhbXA7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg KCEoZmVhdF9mbGFncyAmYW1wOyBSVEVfQ1JZUFRPREVWX0ZGX1NZTV9SQVdfRFApKSkgezxicj4N CkBAIC05MjQyLDExICs5MDA1LDcgQEAgdGVzdF9hdXRoZW50aWNhdGVkX2VuY3J5cHRpb25faGVs cGVyKGNvbnN0IHN0cnVjdCBhZWFkX3Rlc3RfZGF0YSAqdGRhdGEsIGJvb2wgdXM8YnI+DQo8YnI+ DQrCoCDCoCDCoCDCoCAvKiBDcmVhdGUgQUVBRCBzZXNzaW9uICovPGJyPg0KwqAgwqAgwqAgwqAg cmV0dmFsID0gY3JlYXRlX2FlYWRfc2Vzc2lvbih0c19wYXJhbXMtJmd0O3ZhbGlkX2RldnNbMF0s PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdGRhdGEtJmd0O2FsZ28s PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgUlRFX0NSWVBUT19BRUFE X09QX0VOQ1JZUFQsPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdGRh dGEtJmd0O2tleS5kYXRhLCB0ZGF0YS0mZ3Q7a2V5Lmxlbiw8YnI+DQotwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqB0ZGF0YS0mZ3Q7YWFkLmxlbiwgdGRhdGEtJmd0O2F1dGhfdGFn Lmxlbiw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0ZGF0YS0mZ3Q7 aXYubGVuKTs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBSVEVfQ1JZ UFRPX0FFQURfT1BfRU5DUllQVCwgdGRhdGEpOzxicj4NCsKgIMKgIMKgIMKgIGlmIChyZXR2YWwg IT0gVEVTVF9TVUNDRVNTKTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHJldHVybiByZXR2 YWw7PGJyPg0KPGJyPg0KQEAgLTkyNjUsOSArOTAyNCw5IEBAIHRlc3RfYXV0aGVudGljYXRlZF9l bmNyeXB0aW9uX2hlbHBlcihjb25zdCBzdHJ1Y3QgYWVhZF90ZXN0X2RhdGEgKnRkYXRhLCBib29s IHVzPGJyPg0KwqAgwqAgwqAgwqAgfSBlbHNlIHs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCBpZiAodXNlX2V4dF9tYnVmKSB7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgdXRfcGFyYW1zLSZndDtpYnVmID0gZXh0X21idWZfY3JlYXRlKHRzX3BhcmFtcy0mZ3Q7 bWJ1Zl9wb29sLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoEFFQURfVEVYVF9N QVhfTEVOR1RILDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDEgLyogbmJfc2Vn cyAqLyw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBOVUxMKTs8YnI+DQorwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqBBRUFEX1RFWFRfTUFYX0xFTkdUSCw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAxIC8q IG5iX3NlZ3MgKi8sPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgTlVMTCk7PGJyPg0KwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgfSBlbHNlIHs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCB1dF9wYXJhbXMtJmd0O2lidWYgPSBydGVfcGt0bWJ1Zl9hbGxvYyh0c19wYXJhbXMtJmd0 O21idWZfcG9vbCk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgfTxicj4NCkBAIC05Mjc1 LDcgKzkwMzQsNyBAQCB0ZXN0X2F1dGhlbnRpY2F0ZWRfZW5jcnlwdGlvbl9oZWxwZXIoY29uc3Qg c3RydWN0IGFlYWRfdGVzdF9kYXRhICp0ZGF0YSwgYm9vbCB1czxicj4NCjxicj4NCsKgIMKgIMKg IMKgIC8qIGNsZWFyIG1idWYgcGF5bG9hZCAqLzxicj4NCsKgIMKgIMKgIMKgIG1lbXNldChydGVf cGt0bWJ1Zl9tdG9kKHV0X3BhcmFtcy0mZ3Q7aWJ1ZiwgdWludDhfdCAqKSwgMCw8YnI+DQotwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBydGVfcGt0bWJ1Zl90YWlscm9vbSh1dF9w YXJhbXMtJmd0O2lidWYpKTs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBydGVfcGt0bWJ1 Zl90YWlscm9vbSh1dF9wYXJhbXMtJmd0O2lidWYpKTs8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCAv KiBDcmVhdGUgQUVBRCBvcGVyYXRpb24gKi88YnI+DQrCoCDCoCDCoCDCoCByZXR2YWwgPSBjcmVh dGVfYWVhZF9vcGVyYXRpb24oUlRFX0NSWVBUT19BRUFEX09QX0VOQ1JZUFQsIHRkYXRhKTs8YnI+ DQpAQCAtOTMzNyw3ICs5MDk2LDcgQEAgdGVzdF9hdXRoZW50aWNhdGVkX2VuY3J5cHRpb25faGVs cGVyKGNvbnN0IHN0cnVjdCBhZWFkX3Rlc3RfZGF0YSAqdGRhdGEsIGJvb2wgdXM8YnI+DQrCoH08 YnI+DQo8YnI+DQrCoHN0YXRpYyBpbnQ8YnI+DQotdGVzdF9hdXRoZW50aWNhdGVkX2VuY3J5cHRp b24oY29uc3Qgc3RydWN0IGFlYWRfdGVzdF9kYXRhICp0ZGF0YSk8YnI+DQordGVzdF9hdXRoZW50 aWNhdGVkX2VuY3J5cHRpb24oY29uc3Qgdm9pZCAqdGRhdGEpPGJyPg0KwqB7PGJyPg0KwqAgwqAg wqAgwqAgcmV0dXJuIHRlc3RfYXV0aGVudGljYXRlZF9lbmNyeXB0aW9uX2hlbHBlcih0ZGF0YSwg ZmFsc2UpOzxicj4NCsKgfTxicj4NCkBAIC0xMjg2OSw2MCArMTI2MjgsMTIgQEAgdGVzdF90bHNf MV8zX3JlY29yZF9wcm90b19zZ2xfb29wKHZvaWQpPGJyPg0KwqAjZW5kaWY8YnI+DQo8YnI+DQrC oHN0YXRpYyBpbnQ8YnI+DQotdGVzdF9BRVNfR0NNX2F1dGhlbnRpY2F0ZWRfZW5jcnlwdGlvbl90 ZXN0X2Nhc2VfMSh2b2lkKTxicj4NCi17PGJyPg0KLcKgIMKgIMKgIMKgcmV0dXJuIHRlc3RfYXV0 aGVudGljYXRlZF9lbmNyeXB0aW9uKCZhbXA7Z2NtX3Rlc3RfY2FzZV8xKTs8YnI+DQotfTxicj4N Ci08YnI+DQotc3RhdGljIGludDxicj4NCi10ZXN0X0FFU19HQ01fYXV0aGVudGljYXRlZF9lbmNy eXB0aW9uX3Rlc3RfY2FzZV8yKHZvaWQpPGJyPg0KLXs8YnI+DQotwqAgwqAgwqAgwqByZXR1cm4g dGVzdF9hdXRoZW50aWNhdGVkX2VuY3J5cHRpb24oJmFtcDtnY21fdGVzdF9jYXNlXzIpOzxicj4N Ci19PGJyPg0KLTxicj4NCi1zdGF0aWMgaW50PGJyPg0KLXRlc3RfQUVTX0dDTV9hdXRoZW50aWNh dGVkX2VuY3J5cHRpb25fdGVzdF9jYXNlXzModm9pZCk8YnI+DQotezxicj4NCi3CoCDCoCDCoCDC oHJldHVybiB0ZXN0X2F1dGhlbnRpY2F0ZWRfZW5jcnlwdGlvbigmYW1wO2djbV90ZXN0X2Nhc2Vf Myk7PGJyPg0KLX08YnI+DQotPGJyPg0KLXN0YXRpYyBpbnQ8YnI+DQrCoHRlc3RfQUVTX0dDTV9h dXRoZW50aWNhdGVkX2VuY3J5cHRpb25fdGVzdF9jYXNlXzNfZXh0X21idWYodm9pZCk8YnI+DQrC oHs8YnI+DQrCoCDCoCDCoCDCoCByZXR1cm4gdGVzdF9hdXRoZW50aWNhdGVkX2VuY3J5cHRpb25f aGVscGVyKCZhbXA7Z2NtX3Rlc3RfY2FzZV8zLCB0cnVlKTs8YnI+DQrCoH08YnI+DQo8YnI+DQrC oHN0YXRpYyBpbnQ8YnI+DQotdGVzdF9BRVNfR0NNX2F1dGhlbnRpY2F0ZWRfZW5jcnlwdGlvbl90 ZXN0X2Nhc2VfNCh2b2lkKTxicj4NCi17PGJyPg0KLcKgIMKgIMKgIMKgcmV0dXJuIHRlc3RfYXV0 aGVudGljYXRlZF9lbmNyeXB0aW9uKCZhbXA7Z2NtX3Rlc3RfY2FzZV80KTs8YnI+DQotfTxicj4N Ci08YnI+DQotc3RhdGljIGludDxicj4NCi10ZXN0X0FFU19HQ01fYXV0aGVudGljYXRlZF9lbmNy eXB0aW9uX3Rlc3RfY2FzZV81KHZvaWQpPGJyPg0KLXs8YnI+DQotwqAgwqAgwqAgwqByZXR1cm4g dGVzdF9hdXRoZW50aWNhdGVkX2VuY3J5cHRpb24oJmFtcDtnY21fdGVzdF9jYXNlXzUpOzxicj4N Ci19PGJyPg0KLTxicj4NCi1zdGF0aWMgaW50PGJyPg0KLXRlc3RfQUVTX0dDTV9hdXRoZW50aWNh dGVkX2VuY3J5cHRpb25fdGVzdF9jYXNlXzYodm9pZCk8YnI+DQotezxicj4NCi3CoCDCoCDCoCDC oHJldHVybiB0ZXN0X2F1dGhlbnRpY2F0ZWRfZW5jcnlwdGlvbigmYW1wO2djbV90ZXN0X2Nhc2Vf Nik7PGJyPg0KLX08YnI+DQotPGJyPg0KLXN0YXRpYyBpbnQ8YnI+DQotdGVzdF9BRVNfR0NNX2F1 dGhlbnRpY2F0ZWRfZW5jcnlwdGlvbl90ZXN0X2Nhc2VfNyh2b2lkKTxicj4NCi17PGJyPg0KLcKg IMKgIMKgIMKgcmV0dXJuIHRlc3RfYXV0aGVudGljYXRlZF9lbmNyeXB0aW9uKCZhbXA7Z2NtX3Rl c3RfY2FzZV83KTs8YnI+DQotfTxicj4NCi08YnI+DQotc3RhdGljIGludDxicj4NCi10ZXN0X0FF U19HQ01fYXV0aGVudGljYXRlZF9lbmNyeXB0aW9uX3Rlc3RfY2FzZV84KHZvaWQpPGJyPg0KLXs8 YnI+DQotwqAgwqAgwqAgwqByZXR1cm4gdGVzdF9hdXRoZW50aWNhdGVkX2VuY3J5cHRpb24oJmFt cDtnY21fdGVzdF9jYXNlXzgpOzxicj4NCi19PGJyPg0KLTxicj4NCi1zdGF0aWMgaW50PGJyPg0K wqB0ZXN0X0FFU19HQ01fSjBfYXV0aGVudGljYXRlZF9lbmNyeXB0aW9uX3Rlc3RfY2FzZV8xKHZv aWQpPGJyPg0KwqB7PGJyPg0KwqAgwqAgwqAgwqAgcmV0dXJuIHRlc3RfYXV0aGVudGljYXRlZF9l bmNyeXB0aW9uKCZhbXA7Z2NtX0owX3Rlc3RfY2FzZV8xKTs8YnI+DQpAQCAtMTMxNTksMTEgKzEy ODcwLDggQEAgdGVzdF9hdXRoZW50aWNhdGVkX2RlY3J5cHRpb25faGVscGVyKGNvbnN0IHN0cnVj dCBhZWFkX3Rlc3RfZGF0YSAqdGRhdGEsIGJvb2wgdXM8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCAv KiBDcmVhdGUgQUVBRCBzZXNzaW9uICovPGJyPg0KwqAgwqAgwqAgwqAgcmV0dmFsID0gY3JlYXRl X2FlYWRfc2Vzc2lvbih0c19wYXJhbXMtJmd0O3ZhbGlkX2RldnNbMF0sPGJyPg0KLcKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdGRhdGEtJmd0O2FsZ28sPGJyPg0KwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgUlRFX0NSWVBUT19BRUFEX09QX0RFQ1JZUFQsPGJy Pg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdGRhdGEtJmd0O2tleS5kYXRh LCB0ZGF0YS0mZ3Q7a2V5Lmxlbiw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqB0ZGF0YS0mZ3Q7YWFkLmxlbiwgdGRhdGEtJmd0O2F1dGhfdGFnLmxlbiw8YnI+DQotwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0ZGF0YS0mZ3Q7aXYubGVuKTs8YnI+DQor wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0ZGF0YSk7PGJyPg0KwqAgwqAgwqAg wqAgaWYgKHJldHZhbCAhPSBURVNUX1NVQ0NFU1MpPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgcmV0dXJuIHJldHZhbDs8YnI+DQo8YnI+DQpAQCAtMTMyNDMsNjYgKzEyOTUxLDE4IEBAIHRl c3RfYXV0aGVudGljYXRlZF9kZWNyeXB0aW9uX2hlbHBlcihjb25zdCBzdHJ1Y3QgYWVhZF90ZXN0 X2RhdGEgKnRkYXRhLCBib29sIHVzPGJyPg0KwqB9PGJyPg0KPGJyPg0KwqBzdGF0aWMgaW50PGJy Pg0KLXRlc3RfYXV0aGVudGljYXRlZF9kZWNyeXB0aW9uKGNvbnN0IHN0cnVjdCBhZWFkX3Rlc3Rf ZGF0YSAqdGRhdGEpPGJyPg0KK3Rlc3RfYXV0aGVudGljYXRlZF9kZWNyeXB0aW9uKGNvbnN0IHZv aWQgKnRkYXRhKTxicj4NCsKgezxicj4NCsKgIMKgIMKgIMKgIHJldHVybiB0ZXN0X2F1dGhlbnRp Y2F0ZWRfZGVjcnlwdGlvbl9oZWxwZXIodGRhdGEsIGZhbHNlKTs8YnI+DQrCoH08YnI+DQo8YnI+ DQrCoHN0YXRpYyBpbnQ8YnI+DQotdGVzdF9BRVNfR0NNX2F1dGhlbnRpY2F0ZWRfZGVjcnlwdGlv bl90ZXN0X2Nhc2VfMSh2b2lkKTxicj4NCi17PGJyPg0KLcKgIMKgIMKgIMKgcmV0dXJuIHRlc3Rf YXV0aGVudGljYXRlZF9kZWNyeXB0aW9uKCZhbXA7Z2NtX3Rlc3RfY2FzZV8xKTs8YnI+DQotfTxi cj4NCi08YnI+DQotc3RhdGljIGludDxicj4NCi10ZXN0X0FFU19HQ01fYXV0aGVudGljYXRlZF9k ZWNyeXB0aW9uX3Rlc3RfY2FzZV8yKHZvaWQpPGJyPg0KLXs8YnI+DQotwqAgwqAgwqAgwqByZXR1 cm4gdGVzdF9hdXRoZW50aWNhdGVkX2RlY3J5cHRpb24oJmFtcDtnY21fdGVzdF9jYXNlXzIpOzxi cj4NCi19PGJyPg0KLTxicj4NCi1zdGF0aWMgaW50PGJyPg0KLXRlc3RfQUVTX0dDTV9hdXRoZW50 aWNhdGVkX2RlY3J5cHRpb25fdGVzdF9jYXNlXzModm9pZCk8YnI+DQotezxicj4NCi3CoCDCoCDC oCDCoHJldHVybiB0ZXN0X2F1dGhlbnRpY2F0ZWRfZGVjcnlwdGlvbigmYW1wO2djbV90ZXN0X2Nh c2VfMyk7PGJyPg0KLX08YnI+DQotPGJyPg0KLXN0YXRpYyBpbnQ8YnI+DQrCoHRlc3RfQUVTX0dD TV9hdXRoZW50aWNhdGVkX2RlY3J5cHRpb25fdGVzdF9jYXNlXzNfZXh0X21idWYodm9pZCk8YnI+ DQrCoHs8YnI+DQrCoCDCoCDCoCDCoCByZXR1cm4gdGVzdF9hdXRoZW50aWNhdGVkX2RlY3J5cHRp b25faGVscGVyKCZhbXA7Z2NtX3Rlc3RfY2FzZV8zLCB0cnVlKTs8YnI+DQrCoH08YnI+DQo8YnI+ DQrCoHN0YXRpYyBpbnQ8YnI+DQotdGVzdF9BRVNfR0NNX2F1dGhlbnRpY2F0ZWRfZGVjcnlwdGlv bl90ZXN0X2Nhc2VfNCh2b2lkKTxicj4NCi17PGJyPg0KLcKgIMKgIMKgIMKgcmV0dXJuIHRlc3Rf YXV0aGVudGljYXRlZF9kZWNyeXB0aW9uKCZhbXA7Z2NtX3Rlc3RfY2FzZV80KTs8YnI+DQotfTxi cj4NCi08YnI+DQotc3RhdGljIGludDxicj4NCi10ZXN0X0FFU19HQ01fYXV0aGVudGljYXRlZF9k ZWNyeXB0aW9uX3Rlc3RfY2FzZV81KHZvaWQpPGJyPg0KLXs8YnI+DQotwqAgwqAgwqAgwqByZXR1 cm4gdGVzdF9hdXRoZW50aWNhdGVkX2RlY3J5cHRpb24oJmFtcDtnY21fdGVzdF9jYXNlXzUpOzxi cj4NCi19PGJyPg0KLTxicj4NCi1zdGF0aWMgaW50PGJyPg0KLXRlc3RfQUVTX0dDTV9hdXRoZW50 aWNhdGVkX2RlY3J5cHRpb25fdGVzdF9jYXNlXzYodm9pZCk8YnI+DQotezxicj4NCi3CoCDCoCDC oCDCoHJldHVybiB0ZXN0X2F1dGhlbnRpY2F0ZWRfZGVjcnlwdGlvbigmYW1wO2djbV90ZXN0X2Nh c2VfNik7PGJyPg0KLX08YnI+DQotPGJyPg0KLXN0YXRpYyBpbnQ8YnI+DQotdGVzdF9BRVNfR0NN X2F1dGhlbnRpY2F0ZWRfZGVjcnlwdGlvbl90ZXN0X2Nhc2VfNyh2b2lkKTxicj4NCi17PGJyPg0K LcKgIMKgIMKgIMKgcmV0dXJuIHRlc3RfYXV0aGVudGljYXRlZF9kZWNyeXB0aW9uKCZhbXA7Z2Nt X3Rlc3RfY2FzZV83KTs8YnI+DQotfTxicj4NCi08YnI+DQotc3RhdGljIGludDxicj4NCi10ZXN0 X0FFU19HQ01fYXV0aGVudGljYXRlZF9kZWNyeXB0aW9uX3Rlc3RfY2FzZV84KHZvaWQpPGJyPg0K LXs8YnI+DQotwqAgwqAgwqAgwqByZXR1cm4gdGVzdF9hdXRoZW50aWNhdGVkX2RlY3J5cHRpb24o JmFtcDtnY21fdGVzdF9jYXNlXzgpOzxicj4NCi19PGJyPg0KLTxicj4NCi1zdGF0aWMgaW50PGJy Pg0KwqB0ZXN0X0FFU19HQ01fSjBfYXV0aGVudGljYXRlZF9kZWNyeXB0aW9uX3Rlc3RfY2FzZV8x KHZvaWQpPGJyPg0KwqB7PGJyPg0KwqAgwqAgwqAgwqAgcmV0dXJuIHRlc3RfYXV0aGVudGljYXRl ZF9kZWNyeXB0aW9uKCZhbXA7Z2NtX0owX3Rlc3RfY2FzZV8xKTs8YnI+DQpAQCAtMTM1NDcsMTEg KzEzMjA3LDggQEAgdGVzdF9hdXRoZW50aWNhdGVkX2VuY3J5cHRpb25fb29wKGNvbnN0IHN0cnVj dCBhZWFkX3Rlc3RfZGF0YSAqdGRhdGEpPGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgLyogQ3JlYXRl IEFFQUQgc2Vzc2lvbiAqLzxicj4NCsKgIMKgIMKgIMKgIHJldHZhbCA9IGNyZWF0ZV9hZWFkX3Nl c3Npb24odHNfcGFyYW1zLSZndDt2YWxpZF9kZXZzWzBdLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoHRkYXRhLSZndDthbGdvLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIFJURV9DUllQVE9fQUVBRF9PUF9FTkNSWVBULDxicj4NCi3CoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHRkYXRhLSZndDtrZXkuZGF0YSwgdGRhdGEt Jmd0O2tleS5sZW4sPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdGRh dGEtJmd0O2FhZC5sZW4sIHRkYXRhLSZndDthdXRoX3RhZy5sZW4sPGJyPg0KLcKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdGRhdGEtJmd0O2l2Lmxlbik7PGJyPg0KK8KgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdGRhdGEpOzxicj4NCsKgIMKgIMKgIMKgIGlmIChy ZXR2YWwgJmx0OyAwKTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHJldHVybiByZXR2YWw7 PGJyPg0KPGJyPg0KQEAgLTEzNjU5LDExICsxMzMxNiw4IEBAIHRlc3RfYXV0aGVudGljYXRlZF9k ZWNyeXB0aW9uX29vcChjb25zdCBzdHJ1Y3QgYWVhZF90ZXN0X2RhdGEgKnRkYXRhKTxicj4NCjxi cj4NCsKgIMKgIMKgIMKgIC8qIENyZWF0ZSBBRUFEIHNlc3Npb24gKi88YnI+DQrCoCDCoCDCoCDC oCByZXR2YWwgPSBjcmVhdGVfYWVhZF9zZXNzaW9uKHRzX3BhcmFtcy0mZ3Q7dmFsaWRfZGV2c1sw XSw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0ZGF0YS0mZ3Q7YWxn byw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBSVEVfQ1JZUFRPX0FF QURfT1BfREVDUllQVCw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0 ZGF0YS0mZ3Q7a2V5LmRhdGEsIHRkYXRhLSZndDtrZXkubGVuLDxicj4NCi3CoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoHRkYXRhLSZndDthYWQubGVuLCB0ZGF0YS0mZ3Q7YXV0aF90 YWcubGVuLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHRkYXRhLSZn dDtpdi5sZW4pOzxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHRkYXRh KTs8YnI+DQrCoCDCoCDCoCDCoCBpZiAocmV0dmFsICZsdDsgMCk8YnI+DQrCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCByZXR1cm4gcmV0dmFsOzxicj4NCjxicj4NCkBAIC0xMzc3MCwxMSArMTM0MjQs OCBAQCB0ZXN0X2F1dGhlbnRpY2F0ZWRfZW5jcnlwdGlvbl9zZXNzaW9ubGVzcyg8YnI+DQrCoCDC oCDCoCDCoCAvKiBDcmVhdGUgR0NNIHhmb3JtICovPGJyPg0KwqAgwqAgwqAgwqAgbWVtY3B5KGtl eSwgdGRhdGEtJmd0O2tleS5kYXRhLCB0ZGF0YS0mZ3Q7a2V5Lmxlbik7PGJyPg0KwqAgwqAgwqAg wqAgcmV0dmFsID0gY3JlYXRlX2FlYWRfeGZvcm0odXRfcGFyYW1zLSZndDtvcCw8YnI+DQotwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0ZGF0YS0mZ3Q7YWxnbyw8YnI+DQrCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBSVEVfQ1JZUFRPX0FFQURfT1BfRU5DUllQ VCw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBrZXksIHRkYXRhLSZn dDtrZXkubGVuLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHRkYXRh LSZndDthYWQubGVuLCB0ZGF0YS0mZ3Q7YXV0aF90YWcubGVuLDxicj4NCi3CoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoHRkYXRhLSZndDtpdi5sZW4pOzxicj4NCivCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHRkYXRhLCBrZXkpOzxicj4NCsKgIMKgIMKgIMKgIGlm IChyZXR2YWwgJmx0OyAwKTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHJldHVybiByZXR2 YWw7PGJyPg0KPGJyPg0KQEAgLTEzODc4LDExICsxMzUyOSw4IEBAIHRlc3RfYXV0aGVudGljYXRl ZF9kZWNyeXB0aW9uX3Nlc3Npb25sZXNzKDxicj4NCsKgIMKgIMKgIMKgIC8qIENyZWF0ZSBBRUFE IHhmb3JtICovPGJyPg0KwqAgwqAgwqAgwqAgbWVtY3B5KGtleSwgdGRhdGEtJmd0O2tleS5kYXRh LCB0ZGF0YS0mZ3Q7a2V5Lmxlbik7PGJyPg0KwqAgwqAgwqAgwqAgcmV0dmFsID0gY3JlYXRlX2Fl YWRfeGZvcm0odXRfcGFyYW1zLSZndDtvcCw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqB0ZGF0YS0mZ3Q7YWxnbyw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCBSVEVfQ1JZUFRPX0FFQURfT1BfREVDUllQVCw8YnI+DQotwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBrZXksIHRkYXRhLSZndDtrZXkubGVuLDxicj4NCi3CoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHRkYXRhLSZndDthYWQubGVuLCB0ZGF0YS0m Z3Q7YXV0aF90YWcubGVuLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oHRkYXRhLSZndDtpdi5sZW4pOzxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoHRkYXRhLCBrZXkpOzxicj4NCsKgIMKgIMKgIMKgIGlmIChyZXR2YWwgJmx0OyAwKTxicj4N CsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHJldHVybiByZXR2YWw7PGJyPg0KPGJyPg0KQEAgLTE0 MDQ2LDEwICsxMzY5NCwzOSBAQCB0ZXN0X3N0YXRzKHZvaWQpPGJyPg0KwqB7PGJyPg0KwqAgwqAg wqAgwqAgc3RydWN0IGNyeXB0b190ZXN0c3VpdGVfcGFyYW1zICp0c19wYXJhbXMgPSAmYW1wO3Rl c3RzdWl0ZV9wYXJhbXM7PGJyPg0KwqAgwqAgwqAgwqAgc3RydWN0IHJ0ZV9jcnlwdG9kZXZfc3Rh dHMgc3RhdHM7PGJyPg0KK8KgIMKgIMKgIMKgc3RydWN0IHJ0ZV9jcnlwdG9kZXZfcXBfY29uZiBx cF9jb25mID0gezxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoC5uYl9kZXNjcmlwdG9ycyA9 IE1BWF9OVU1fT1BTX0lORkxJR0hULDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoC5tcF9z ZXNzaW9uID0gdHNfcGFyYW1zLSZndDtzZXNzaW9uX21wb29sPGJyPg0KK8KgIMKgIMKgIMKgfTs8 YnI+DQorwqAgwqAgwqAgwqB1aW50MTZfdCBxcF9pZCwgZGV2X2lkOzxicj4NCivCoCDCoCDCoCDC oGRldl9pZCA9IHRzX3BhcmFtcy0mZ3Q7dmFsaWRfZGV2c1swXTs8YnI+DQo8YnI+DQrCoCDCoCDC oCDCoCBpZiAoZ2JsX2FjdGlvbl90eXBlID09IFJURV9TRUNVUklUWV9BQ1RJT05fVFlQRV9DUFVf Q1JZUFRPKTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHJldHVybiBURVNUX1NLSVBQRUQ7 PGJyPg0KPGJyPg0KK8KgIMKgIMKgIMKgLyogU3RvcCB0aGUgZGV2aWNlIGluIGNhc2UgaXQmIzM5 O3Mgc3RhcnRlZCBzbyBpdCBjYW4gYmUgY29uZmlndXJlZCAqLzxicj4NCivCoCDCoCDCoCDCoHJ0 ZV9jcnlwdG9kZXZfc3RvcChkZXZfaWQpOzxicj4NCis8YnI+DQorwqAgwqAgwqAgwqBURVNUX0FT U0VSVF9TVUNDRVNTKHJ0ZV9jcnlwdG9kZXZfY29uZmlndXJlKGRldl9pZCwgJmFtcDt0c19wYXJh bXMtJmd0O2NvbmYpLDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZx dW90O0ZhaWxlZCB0ZXN0IGZvciBydGVfY3J5cHRvZGV2X2NvbmZpZ3VyZTogJnF1b3Q7PGJyPg0K K8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJnF1b3Q7ZGV2X251bSAldSZxdW90 OywgZGV2X2lkKTs8YnI+DQorwqAgwqAgwqAgwqBmb3IgKHFwX2lkID0gMDsgcXBfaWQgJmx0OyB0 c19wYXJhbXMtJmd0O2NvbmYubmJfcXVldWVfcGFpcnM7IHFwX2lkKyspIHs8YnI+DQorwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqBURVNUX0FTU0VSVF9TVUNDRVNTKHJ0ZV9jcnlwdG9kZXZfcXVldWVf cGFpcl9zZXR1cCg8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqB0c19wYXJhbXMtJmd0O3ZhbGlkX2RldnNbMF0sIHFwX2lkLCAmYW1wO3FwX2NvbmYs PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcnRl X2NyeXB0b2Rldl9zb2NrZXRfaWQoPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdHNfcGFyYW1zLSZndDt2 YWxpZF9kZXZzWzBdKSksPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgJnF1b3Q7RmFpbGVkIHRlc3QgZm9yICZxdW90Ozxicj4NCivCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZxdW90O3J0ZV9jcnlwdG9kZXZf cXVldWVfcGFpcl9zZXR1cDogbnVtX2luZmxpZ2h0cyAmcXVvdDs8YnI+DQorwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmcXVvdDsldSBvbiBxcCAldSBvbiBj cnlwdG9kZXYgJXUmcXVvdDssPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgcXBfY29uZi5uYl9kZXNjcmlwdG9ycywgcXBfaWQsPGJyPg0KK8KgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdHNfcGFyYW1zLSZndDt2 YWxpZF9kZXZzWzBdKTs8YnI+DQorwqAgwqAgwqAgwqB9PGJyPg0KKzxicj4NCivCoCDCoCDCoCDC oC8qIFN0YXJ0IHRoZSBkZXZpY2UgKi88YnI+DQorwqAgwqAgwqAgwqBURVNUX0FTU0VSVF9TVUND RVNTKHJ0ZV9jcnlwdG9kZXZfc3RhcnQodHNfcGFyYW1zLSZndDt2YWxpZF9kZXZzWzBdKSw8YnI+ DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmcXVvdDtGYWlsZWQgdG8gc3Rh cnQgY3J5cHRvZGV2ICV1JnF1b3Q7LDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoHRzX3BhcmFtcy0mZ3Q7dmFsaWRfZGV2c1swXSk7PGJyPg0KKzxicj4NCsKgIMKgIMKg IMKgIC8qIFZlcmlmeSB0aGUgY2FwYWJpbGl0aWVzICovPGJyPg0KwqAgwqAgwqAgwqAgc3RydWN0 IHJ0ZV9jcnlwdG9kZXZfc3ltX2NhcGFiaWxpdHlfaWR4IGNhcF9pZHg7PGJyPg0KwqAgwqAgwqAg wqAgY2FwX2lkeC50eXBlID0gUlRFX0NSWVBUT19TWU1fWEZPUk1fQVVUSDs8YnI+DQpAQCAtMTQx MDYsNiArMTM3ODMsOSBAQCB0ZXN0X3N0YXRzKHZvaWQpPGJyPg0KwqAgwqAgwqAgwqAgVEVTVF9B U1NFUlQoKHN0YXRzLmRlcXVldWVkX2NvdW50ID09IDApLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgICZxdW90O3J0ZV9jcnlwdG9kZXZfc3RhdHNfZ2V0IHJldHVybmVkIHVuZXhwZWN0ZWQg ZGVxdWV1ZWQgc3RhdCBhZnRlciB2YWxpZCByZXNldCZxdW90Oyk7PGJyPg0KPGJyPg0KK8KgIMKg IMKgIMKgLyogU3RvcCB0aGUgZGV2aWNlIGluIGNhc2UgaXQmIzM5O3Mgc3RhcnRlZCBzbyBpdCBj YW4gYmUgY29uZmlndXJlZCAqLzxicj4NCivCoCDCoCDCoCDCoHJ0ZV9jcnlwdG9kZXZfc3RvcChk ZXZfaWQpOzxicj4NCis8YnI+DQrCoCDCoCDCoCDCoCByZXR1cm4gVEVTVF9TVUNDRVNTOzxicj4N CsKgfTxicj4NCjxicj4NCkBAIC0xNjg0MiwxMSArMTY1MjIsOCBAQCB0ZXN0X2F1dGhlbnRpY2F0 ZWRfZW5jcnlwdGlvbl9TR0woY29uc3Qgc3RydWN0IGFlYWRfdGVzdF9kYXRhICp0ZGF0YSw8YnI+ DQo8YnI+DQrCoCDCoCDCoCDCoCAvKiBDcmVhdGUgQUVBRCBzZXNzaW9uICovPGJyPg0KwqAgwqAg wqAgwqAgcmV0dmFsID0gY3JlYXRlX2FlYWRfc2Vzc2lvbih0c19wYXJhbXMtJmd0O3ZhbGlkX2Rl dnNbMF0sPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdGRhdGEtJmd0 O2FsZ28sPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgUlRFX0NSWVBU T19BRUFEX09QX0VOQ1JZUFQsPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgdGRhdGEtJmd0O2tleS5kYXRhLCB0ZGF0YS0mZ3Q7a2V5Lmxlbiw8YnI+DQotwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0ZGF0YS0mZ3Q7YWFkLmxlbiwgdGRhdGEtJmd0O2F1 dGhfdGFnLmxlbiw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0ZGF0 YS0mZ3Q7aXYubGVuKTs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0 ZGF0YSk7PGJyPg0KwqAgwqAgwqAgwqAgaWYgKHJldHZhbCAmbHQ7IDApPGJyPg0KwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgcmV0dXJuIHJldHZhbDs8YnI+DQo8YnI+DQpAQCAtMTg0MjUsOSArMTgx MDIsMTAgQEAgc3RhdGljIHN0cnVjdCB1bml0X3Rlc3Rfc3VpdGUgZG9jc2lzX3Byb3RvX3Rlc3Rz dWl0ZcKgID0gezxicj4NCsKgfTs8YnI+DQrCoCNlbmRpZjxicj4NCjxicj4NCi1zdGF0aWMgc3Ry dWN0IHVuaXRfdGVzdF9zdWl0ZSBjcnlwdG9kZXZfZ2VuX3Rlc3RzdWl0ZcKgID0gezxicj4NCitz dGF0aWMgc3RydWN0IHVuaXRfdGVzdF9zdWl0ZSB0ZXN0c3VpdGVfZ2VuX3Rlc3RzdWl0ZcKgID0g ezxicj4NCsKgIMKgIMKgIMKgIC5zdWl0ZV9uYW1lID0gJnF1b3Q7Q3J5cHRvIEdlbmVyYWwgVW5p dCBUZXN0IFN1aXRlJnF1b3Q7LDxicj4NCi3CoCDCoCDCoCDCoC5zZXR1cCA9IGNyeXB0b19nZW5f dGVzdHN1aXRlX3NldHVwLDxicj4NCivCoCDCoCDCoCDCoC5zZXR1cCA9IHRzX3NldHVwX2NyeXB0 b19nZW4sPGJyPg0KK8KgIMKgIMKgIMKgLnRlYXJkb3duID0gdHNfdGVhcmRvd25fZ2VuZXJpYyw8 YnI+DQrCoCDCoCDCoCDCoCAudW5pdF90ZXN0X2Nhc2VzID0gezxicj4NCsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIFRFU1RfQ0FTRV9TVCh1dF9zZXR1cCwgdXRfdGVhcmRvd24sPGJyPg0KwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgdGVzdF9kZXZpY2VfcmVj b25maWd1cmUpLDxicj4NCkBAIC0xODQ0Niw5ICsxODEyNCwxMCBAQCBzdGF0aWMgc3RydWN0IHVu aXRfdGVzdF9zdWl0ZSBjcnlwdG9kZXZfZ2VuX3Rlc3RzdWl0ZcKgID0gezxicj4NCsKgIMKgIMKg IMKgIH08YnI+DQrCoH07PGJyPg0KPGJyPg0KLXN0YXRpYyBzdHJ1Y3QgdW5pdF90ZXN0X3N1aXRl IGNyeXB0b2Rldl9uZWdhdGl2ZV9obWFjX3NoYTFfdGVzdHN1aXRlID0gezxicj4NCitzdGF0aWMg c3RydWN0IHVuaXRfdGVzdF9zdWl0ZSB0ZXN0c3VpdGVfbmVnYXRpdmVfaG1hY19zaGExID0gezxi cj4NCsKgIMKgIMKgIMKgIC5zdWl0ZV9uYW1lID0gJnF1b3Q7TmVnYXRpdmUgSE1BQyBTSEExIFVu aXQgVGVzdCBTdWl0ZSZxdW90Oyw8YnI+DQotwqAgwqAgwqAgwqAuc2V0dXAgPSBuZWdhdGl2ZV9o bWFjX3NoYTFfdGVzdHN1aXRlX3NldHVwLDxicj4NCivCoCDCoCDCoCDCoC5zZXR1cCA9IHRzX3Nl dHVwX25lZ2F0aXZlX2htYWNfc2hhMSw8YnI+DQorwqAgwqAgwqAgwqAudGVhcmRvd24gPSB0c190 ZWFyZG93bl9nZW5lcmljLDxicj4NCsKgIMKgIMKgIMKgIC51bml0X3Rlc3RfY2FzZXMgPSB7PGJy Pg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgLyoqIE5lZ2F0aXZlIHRlc3RzICovPGJyPg0KwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgVEVTVF9DQVNFX1NUKHV0X3NldHVwLCB1dF90ZWFyZG93biw8 YnI+DQpAQCAtMTg0NjQsOSArMTgxNDMsMTAgQEAgc3RhdGljIHN0cnVjdCB1bml0X3Rlc3Rfc3Vp dGUgY3J5cHRvZGV2X25lZ2F0aXZlX2htYWNfc2hhMV90ZXN0c3VpdGUgPSB7PGJyPg0KwqAgwqAg wqAgwqAgfTxicj4NCsKgfTs8YnI+DQo8YnI+DQotc3RhdGljIHN0cnVjdCB1bml0X3Rlc3Rfc3Vp dGUgY3J5cHRvZGV2X211bHRpX3Nlc3Npb25fdGVzdHN1aXRlID0gezxicj4NCitzdGF0aWMgc3Ry dWN0IHVuaXRfdGVzdF9zdWl0ZSB0ZXN0c3VpdGVfbXVsdGlfc2Vzc2lvbiA9IHs8YnI+DQrCoCDC oCDCoCDCoCAuc3VpdGVfbmFtZSA9ICZxdW90O011bHRpIFNlc3Npb24gVW5pdCBUZXN0IFN1aXRl JnF1b3Q7LDxicj4NCi3CoCDCoCDCoCDCoC5zZXR1cCA9IG11bHRpX3Nlc3Npb25fdGVzdHN1aXRl X3NldHVwLDxicj4NCivCoCDCoCDCoCDCoC5zZXR1cCA9IHRzX3NldHVwX211bHRpX3Nlc3Npb24s PGJyPg0KK8KgIMKgIMKgIMKgLnRlYXJkb3duID0gdHNfdGVhcmRvd25fZ2VuZXJpYyw8YnI+DQrC oCDCoCDCoCDCoCAudW5pdF90ZXN0X2Nhc2VzID0gezxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIFRFU1RfQ0FTRV9TVCh1dF9zZXR1cCwgdXRfdGVhcmRvd24sIHRlc3RfbXVsdGlfc2Vzc2lv biksPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgVEVTVF9DQVNFX1NUKHV0X3NldHVwLCB1 dF90ZWFyZG93biw8YnI+DQpAQCAtMTg0NzYsOSArMTgxNTYsMTAgQEAgc3RhdGljIHN0cnVjdCB1 bml0X3Rlc3Rfc3VpdGUgY3J5cHRvZGV2X211bHRpX3Nlc3Npb25fdGVzdHN1aXRlID0gezxicj4N CsKgIMKgIMKgIMKgIH08YnI+DQrCoH07PGJyPg0KPGJyPg0KLXN0YXRpYyBzdHJ1Y3QgdW5pdF90 ZXN0X3N1aXRlIGNyeXB0b2Rldl9udWxsX3Rlc3RzdWl0ZcKgID0gezxicj4NCitzdGF0aWMgc3Ry dWN0IHVuaXRfdGVzdF9zdWl0ZSB0ZXN0c3VpdGVfbnVsbMKgID0gezxicj4NCsKgIMKgIMKgIMKg IC5zdWl0ZV9uYW1lID0gJnF1b3Q7TlVMTCBUZXN0IFN1aXRlJnF1b3Q7LDxicj4NCi3CoCDCoCDC oCDCoC5zZXR1cCA9IG51bGxfdGVzdHN1aXRlX3NldHVwLDxicj4NCivCoCDCoCDCoCDCoC5zZXR1 cCA9IHRzX3Rlc3RzdWl0ZV9udWxsLDxicj4NCivCoCDCoCDCoCDCoC50ZWFyZG93biA9IHRzX3Rl YXJkb3duX2dlbmVyaWMsPGJyPg0KwqAgwqAgwqAgwqAgLnVuaXRfdGVzdF9jYXNlcyA9IHs8YnI+ DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBURVNUX0NBU0VfU1QodXRfc2V0dXAsIHV0X3RlYXJk b3duLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHRlc3RfbnVsbF9p bnZhbGlkX29wZXJhdGlvbiksPGJyPg0KQEAgLTE4NDg3LDkgKzE4MTY4LDEwIEBAIHN0YXRpYyBz dHJ1Y3QgdW5pdF90ZXN0X3N1aXRlIGNyeXB0b2Rldl9udWxsX3Rlc3RzdWl0ZcKgID0gezxicj4N CsKgIMKgIMKgIMKgIH08YnI+DQrCoH07PGJyPg0KPGJyPg0KLXN0YXRpYyBzdHJ1Y3QgdW5pdF90 ZXN0X3N1aXRlIGNyeXB0b2Rldl9hZXNfY2NtX2F1dGhfdGVzdHN1aXRlwqAgPSB7PGJyPg0KLcKg IMKgIMKgIMKgLnN1aXRlX25hbWUgPSAmcXVvdDtBRVMgQ0NNIEF1dGhlbnRpY2F0ZWQgVGVzdCBT dWl0ZSZxdW90Oyw8YnI+DQotwqAgwqAgwqAgwqAuc2V0dXAgPSBhZXNfY2NtX2F1dGhfdGVzdHN1 aXRlX3NldHVwLDxicj4NCitzdGF0aWMgc3RydWN0IHVuaXRfdGVzdF9zdWl0ZSB0ZXN0c3VpdGVf YWVzX2NjbcKgID0gezxicj4NCivCoCDCoCDCoCDCoC5zdWl0ZV9uYW1lID0gJnF1b3Q7QUVTIEND TSB0ZXN0IHN1aXRlJnF1b3Q7LDxicj4NCivCoCDCoCDCoCDCoC5zZXR1cCA9IHRzX3NldHVwX2Fl c19jY20sPGJyPg0KK8KgIMKgIMKgIMKgLnRlYXJkb3duID0gdHNfdGVhcmRvd25fZ2VuZXJpYyw8 YnI+DQrCoCDCoCDCoCDCoCAudW5pdF90ZXN0X2Nhc2VzID0gezxicj4NCsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIC8qKiBBRVMgQ0NNIEF1dGhlbnRpY2F0ZWQgRW5jcnlwdGlvbiAxMjggYml0cyBr ZXkqLzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIFRFU1RfQ0FTRV9TVCh1dF9zZXR1cCwg dXRfdGVhcmRvd24sPGJyPg0KQEAgLTE4NTQyLDE2MyArMTgyMjQsMTU4IEBAIHN0YXRpYyBzdHJ1 Y3QgdW5pdF90ZXN0X3N1aXRlIGNyeXB0b2Rldl9hZXNfY2NtX2F1dGhfdGVzdHN1aXRlwqAgPSB7 PGJyPg0KwqAgwqAgwqAgwqAgfTxicj4NCsKgfTs8YnI+DQo8YnI+DQotc3RhdGljIHN0cnVjdCB1 bml0X3Rlc3Rfc3VpdGUgY3J5cHRvZGV2X2Flc19nY21fYXV0aF90ZXN0c3VpdGXCoCA9IHs8YnI+ DQorI2RlZmluZSBBRERfR0NNX0VOQ19URVNUQ0FTRShkZXNjLCBkYXRhKcKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgXDxicj4NCivCoCDCoCDCoCDCoFRFU1Rf Q0FTRV9OQU1FRF9XSVRIX0RBVEEoZGVzYywgdXRfc2V0dXAswqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqBcPGJyPg0KK8KgIMKgIMKgIMKgdXRfdGVhcmRvd25fYWVzX2djbSwgdGVz dF9hdXRoZW50aWNhdGVkX2VuY3J5cHRpb24swqAgwqAgwqAgwqAgwqAgwqAgwqBcPGJyPg0KK8Kg IMKgIMKgIMKgKGNvbnN0IHZvaWQgKikgZGF0YSk8YnI+DQorI2RlZmluZSBBRERfR0NNX0RFQ19U RVNUQ0FTRShkZXNjLCBkYXRhKcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgXDxicj4NCivCoCDCoCDCoCDCoFRFU1RfQ0FTRV9OQU1FRF9XSVRIX0RBVEEoZGVz YywgdXRfc2V0dXAswqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBcPGJyPg0KK8Kg IMKgIMKgIMKgdXRfdGVhcmRvd25fYWVzX2djbSwgdGVzdF9hdXRoZW50aWNhdGVkX2RlY3J5cHRp b24swqAgwqAgwqAgwqAgwqAgwqAgwqBcPGJyPg0KK8KgIMKgIMKgIMKgKGNvbnN0IHZvaWQgKikg ZGF0YSk8YnI+DQorPGJyPg0KK3N0YXRpYyBzdHJ1Y3QgdW5pdF90ZXN0X3N1aXRlIHRlc3RzdWl0 ZV9hZXNfZ2NtwqAgPSB7PGJyPg0KwqAgwqAgwqAgwqAgLnN1aXRlX25hbWUgPSAmcXVvdDtBRVMg R0NNIEF1dGhlbnRpY2F0ZWQgVGVzdCBTdWl0ZSZxdW90Oyw8YnI+DQotwqAgwqAgwqAgwqAuc2V0 dXAgPSBhZXNfZ2NtX2F1dGhfdGVzdHN1aXRlX3NldHVwLDxicj4NCivCoCDCoCDCoCDCoC5zZXR1 cCA9IHRzX3NldHVwX2Flc19nY20sPGJyPg0KK8KgIMKgIMKgIMKgLnRlYXJkb3duID0gdHNfdGVh cmRvd25fZ2VuZXJpYyw8YnI+DQrCoCDCoCDCoCDCoCAudW5pdF90ZXN0X2Nhc2VzID0gezxicj4N CsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIC8qKiBBRVMgR0NNIEF1dGhlbnRpY2F0ZWQgRW5jcnlw dGlvbiAqLzxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFRFU1RfQ0FTRV9TVCh1dF9zZXR1 cCwgdXRfdGVhcmRvd24sPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgVEVTVF9DQVNFX1NU KHV0X3NldHVwLCB1dF90ZWFyZG93bl9hZXNfZ2NtLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIHRlc3RfQUVTX0dDTV9hdXRoX2VuY3J5cHRfU0dMX2luX3BsYWNlXzE1 MDBCKSw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBURVNUX0NBU0VfU1QodXRfc2V0dXAs IHV0X3RlYXJkb3duLDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFRFU1RfQ0FTRV9TVCh1 dF9zZXR1cCwgdXRfdGVhcmRvd25fYWVzX2djbSw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCB0ZXN0X0FFU19HQ01fYXV0aF9lbmNyeXB0X1NHTF9vdXRfb2ZfcGxhY2Vf NDAwQl80MDBCKSw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBURVNUX0NBU0VfU1QodXRf c2V0dXAsIHV0X3RlYXJkb3duLDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFRFU1RfQ0FT RV9TVCh1dF9zZXR1cCwgdXRfdGVhcmRvd25fYWVzX2djbSw8YnI+DQrCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCB0ZXN0X0FFU19HQ01fYXV0aF9lbmNyeXB0X1NHTF9vdXRfb2Zf cGxhY2VfMTUwMEJfMjAwMEIpLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFRFU1RfQ0FT RV9TVCh1dF9zZXR1cCwgdXRfdGVhcmRvd24sPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKg VEVTVF9DQVNFX1NUKHV0X3NldHVwLCB1dF90ZWFyZG93bl9hZXNfZ2NtLDxicj4NCsKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHRlc3RfQUVTX0dDTV9hdXRoX2VuY3J5cHRfU0dM X291dF9vZl9wbGFjZV80MDBCXzFzZWcpLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFRF U1RfQ0FTRV9TVCh1dF9zZXR1cCwgdXRfdGVhcmRvd24sPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgdGVzdF9BRVNfR0NNX2F1dGhlbnRpY2F0ZWRfZW5jcnlwdGlvbl90 ZXN0X2Nhc2VfMSksPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgVEVTVF9DQVNFX1NUKHV0 X3NldHVwLCB1dF90ZWFyZG93biw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqB0ZXN0X0FFU19HQ01fYXV0aGVudGljYXRlZF9lbmNyeXB0aW9uX3Rlc3RfY2FzZV8yKSw8 YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBURVNUX0NBU0VfU1QodXRfc2V0dXAsIHV0X3Rl YXJkb3duLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHRlc3RfQUVT X0dDTV9hdXRoZW50aWNhdGVkX2VuY3J5cHRpb25fdGVzdF9jYXNlXzMpLDxicj4NCi3CoCDCoCDC oCDCoCDCoCDCoCDCoCDCoFRFU1RfQ0FTRV9TVCh1dF9zZXR1cCwgdXRfdGVhcmRvd24sPGJyPg0K LcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdGVzdF9BRVNfR0NNX2F1dGhlbnRp Y2F0ZWRfZW5jcnlwdGlvbl90ZXN0X2Nhc2VfNCksPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgVEVTVF9DQVNFX1NUKHV0X3NldHVwLCB1dF90ZWFyZG93biw8YnI+DQotwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0ZXN0X0FFU19HQ01fYXV0aGVudGljYXRlZF9lbmNyeXB0 aW9uX3Rlc3RfY2FzZV81KSw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBURVNUX0NBU0Vf U1QodXRfc2V0dXAsIHV0X3RlYXJkb3duLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoHRlc3RfQUVTX0dDTV9hdXRoZW50aWNhdGVkX2VuY3J5cHRpb25fdGVzdF9jYXNl XzYpLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFRFU1RfQ0FTRV9TVCh1dF9zZXR1cCwg dXRfdGVhcmRvd24sPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdGVz dF9BRVNfR0NNX2F1dGhlbnRpY2F0ZWRfZW5jcnlwdGlvbl90ZXN0X2Nhc2VfNyksPGJyPg0KLcKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgVEVTVF9DQVNFX1NUKHV0X3NldHVwLCB1dF90ZWFyZG93biw8 YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0ZXN0X0FFU19HQ01fYXV0 aGVudGljYXRlZF9lbmNyeXB0aW9uX3Rlc3RfY2FzZV84KSw8YnI+DQotwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqBURVNUX0NBU0VfU1QodXRfc2V0dXAsIHV0X3RlYXJkb3duLDxicj4NCivCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoEFERF9HQ01fRU5DX1RFU1RDQVNFKCZxdW90O0FFUyBHQ00gZW5jcnlw dGlvbiB0ZXN0IDEmcXVvdDssICZhbXA7Z2NtX3Rlc3RfY2FzZV8xKSw8YnI+DQorwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqBBRERfR0NNX0VOQ19URVNUQ0FTRSgmcXVvdDtBRVMgR0NNIGVuY3J5cHRp b24gdGVzdCAyJnF1b3Q7LCAmYW1wO2djbV90ZXN0X2Nhc2VfMiksPGJyPg0KK8KgIMKgIMKgIMKg IMKgIMKgIMKgIMKgQUREX0dDTV9FTkNfVEVTVENBU0UoJnF1b3Q7QUVTIEdDTSBlbmNyeXB0aW9u IHRlc3QgMyZxdW90OywgJmFtcDtnY21fdGVzdF9jYXNlXzMpLDxicj4NCivCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoEFERF9HQ01fRU5DX1RFU1RDQVNFKCZxdW90O0FFUyBHQ00gZW5jcnlwdGlvbiB0 ZXN0IDQmcXVvdDssICZhbXA7Z2NtX3Rlc3RfY2FzZV80KSw8YnI+DQorwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqBBRERfR0NNX0VOQ19URVNUQ0FTRSgmcXVvdDtBRVMgR0NNIGVuY3J5cHRpb24gdGVz dCA1JnF1b3Q7LCAmYW1wO2djbV90ZXN0X2Nhc2VfNSksPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKg IMKgIMKgQUREX0dDTV9FTkNfVEVTVENBU0UoJnF1b3Q7QUVTIEdDTSBlbmNyeXB0aW9uIHRlc3Qg NiZxdW90OywgJmFtcDtnY21fdGVzdF9jYXNlXzYpLDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoEFERF9HQ01fRU5DX1RFU1RDQVNFKCZxdW90O0FFUyBHQ00gZW5jcnlwdGlvbiB0ZXN0IDcm cXVvdDssICZhbXA7Z2NtX3Rlc3RfY2FzZV83KSw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqBBRERfR0NNX0VOQ19URVNUQ0FTRSgmcXVvdDtBRVMgR0NNIGVuY3J5cHRpb24gdGVzdCA4JnF1 b3Q7LCAmYW1wO2djbV90ZXN0X2Nhc2VfOCksPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKg VEVTVF9DQVNFX1NUKHV0X3NldHVwLCB1dF90ZWFyZG93bl9hZXNfZ2NtLDxicj4NCsKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHRlc3RfQUVTX0dDTV9KMF9hdXRoZW50aWNhdGVk X2VuY3J5cHRpb25fdGVzdF9jYXNlXzEpLDxicj4NCjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIC8qKiBBRVMgR0NNIEF1dGhlbnRpY2F0ZWQgRGVjcnlwdGlvbiAqLzxicj4NCi3CoCDCoCDC oCDCoCDCoCDCoCDCoCDCoFRFU1RfQ0FTRV9TVCh1dF9zZXR1cCwgdXRfdGVhcmRvd24sPGJyPg0K LcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdGVzdF9BRVNfR0NNX2F1dGhlbnRp Y2F0ZWRfZGVjcnlwdGlvbl90ZXN0X2Nhc2VfMSksPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgVEVTVF9DQVNFX1NUKHV0X3NldHVwLCB1dF90ZWFyZG93biw8YnI+DQotwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0ZXN0X0FFU19HQ01fYXV0aGVudGljYXRlZF9kZWNyeXB0 aW9uX3Rlc3RfY2FzZV8yKSw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBURVNUX0NBU0Vf U1QodXRfc2V0dXAsIHV0X3RlYXJkb3duLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoHRlc3RfQUVTX0dDTV9hdXRoZW50aWNhdGVkX2RlY3J5cHRpb25fdGVzdF9jYXNl XzMpLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFRFU1RfQ0FTRV9TVCh1dF9zZXR1cCwg dXRfdGVhcmRvd24sPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdGVz dF9BRVNfR0NNX2F1dGhlbnRpY2F0ZWRfZGVjcnlwdGlvbl90ZXN0X2Nhc2VfNCksPGJyPg0KLcKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgVEVTVF9DQVNFX1NUKHV0X3NldHVwLCB1dF90ZWFyZG93biw8 YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0ZXN0X0FFU19HQ01fYXV0 aGVudGljYXRlZF9kZWNyeXB0aW9uX3Rlc3RfY2FzZV81KSw8YnI+DQotwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqBURVNUX0NBU0VfU1QodXRfc2V0dXAsIHV0X3RlYXJkb3duLDxicj4NCi3CoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHRlc3RfQUVTX0dDTV9hdXRoZW50aWNhdGVkX2Rl Y3J5cHRpb25fdGVzdF9jYXNlXzYpLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFRFU1Rf Q0FTRV9TVCh1dF9zZXR1cCwgdXRfdGVhcmRvd24sPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgdGVzdF9BRVNfR0NNX2F1dGhlbnRpY2F0ZWRfZGVjcnlwdGlvbl90ZXN0 X2Nhc2VfNyksPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgVEVTVF9DQVNFX1NUKHV0X3Nl dHVwLCB1dF90ZWFyZG93biw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqB0ZXN0X0FFU19HQ01fYXV0aGVudGljYXRlZF9kZWNyeXB0aW9uX3Rlc3RfY2FzZV84KSw8YnI+ DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBURVNUX0NBU0VfU1QodXRfc2V0dXAsIHV0X3RlYXJk b3duLDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoEFERF9HQ01fREVDX1RFU1RDQVNFKCZx dW90O0FFUyBHQ00gZGVjcnlwdGlvbiB0ZXN0IDEmcXVvdDssICZhbXA7Z2NtX3Rlc3RfY2FzZV8x KSw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBBRERfR0NNX0RFQ19URVNUQ0FTRSgmcXVv dDtBRVMgR0NNIGRlY3J5cHRpb24gdGVzdCAyJnF1b3Q7LCAmYW1wO2djbV90ZXN0X2Nhc2VfMiks PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgQUREX0dDTV9ERUNfVEVTVENBU0UoJnF1b3Q7 QUVTIEdDTSBkZWNyeXB0aW9uIHRlc3QgMyZxdW90OywgJmFtcDtnY21fdGVzdF9jYXNlXzMpLDxi cj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoEFERF9HQ01fREVDX1RFU1RDQVNFKCZxdW90O0FF UyBHQ00gZGVjcnlwdGlvbiB0ZXN0IDQmcXVvdDssICZhbXA7Z2NtX3Rlc3RfY2FzZV80KSw8YnI+ DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBBRERfR0NNX0RFQ19URVNUQ0FTRSgmcXVvdDtBRVMg R0NNIGRlY3J5cHRpb24gdGVzdCA1JnF1b3Q7LCAmYW1wO2djbV90ZXN0X2Nhc2VfNSksPGJyPg0K K8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgQUREX0dDTV9ERUNfVEVTVENBU0UoJnF1b3Q7QUVTIEdD TSBkZWNyeXB0aW9uIHRlc3QgNiZxdW90OywgJmFtcDtnY21fdGVzdF9jYXNlXzYpLDxicj4NCivC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoEFERF9HQ01fREVDX1RFU1RDQVNFKCZxdW90O0FFUyBHQ00g ZGVjcnlwdGlvbiB0ZXN0IDcmcXVvdDssICZhbXA7Z2NtX3Rlc3RfY2FzZV83KSw8YnI+DQorwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBBRERfR0NNX0RFQ19URVNUQ0FTRSgmcXVvdDtBRVMgR0NNIGRl Y3J5cHRpb24gdGVzdCA4JnF1b3Q7LCAmYW1wO2djbV90ZXN0X2Nhc2VfOCksPGJyPg0KK8KgIMKg IMKgIMKgIMKgIMKgIMKgIMKgVEVTVF9DQVNFX1NUKHV0X3NldHVwLCB1dF90ZWFyZG93bl9hZXNf Z2NtLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHRlc3RfQUVTX0dD TV9KMF9hdXRoZW50aWNhdGVkX2RlY3J5cHRpb25fdGVzdF9jYXNlXzEpLDxicj4NCjxicj4NCsKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIC8qKiBBRVMgR0NNIEF1dGhlbnRpY2F0ZWQgRW5jcnlwdGlv biAxOTIgYml0cyBrZXkgKi88YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBURVNUX0NBU0Vf U1QodXRfc2V0dXAsIHV0X3RlYXJkb3duLDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFRF U1RfQ0FTRV9TVCh1dF9zZXR1cCwgdXRfdGVhcmRvd25fYWVzX2djbSw8YnI+DQrCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB0ZXN0X0FFU19HQ01fYXV0aF9lbmNyeXB0aW9uX3Rl c3RfY2FzZV8xOTJfMSksPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgVEVTVF9DQVNFX1NU KHV0X3NldHVwLCB1dF90ZWFyZG93biw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBURVNU X0NBU0VfU1QodXRfc2V0dXAsIHV0X3RlYXJkb3duX2Flc19nY20sPGJyPg0KwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgdGVzdF9BRVNfR0NNX2F1dGhfZW5jcnlwdGlvbl90ZXN0 X2Nhc2VfMTkyXzIpLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFRFU1RfQ0FTRV9TVCh1 dF9zZXR1cCwgdXRfdGVhcmRvd24sPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgVEVTVF9D QVNFX1NUKHV0X3NldHVwLCB1dF90ZWFyZG93bl9hZXNfZ2NtLDxicj4NCsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIHRlc3RfQUVTX0dDTV9hdXRoX2VuY3J5cHRpb25fdGVzdF9j YXNlXzE5Ml8zKSw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBURVNUX0NBU0VfU1QodXRf c2V0dXAsIHV0X3RlYXJkb3duLDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFRFU1RfQ0FT RV9TVCh1dF9zZXR1cCwgdXRfdGVhcmRvd25fYWVzX2djbSw8YnI+DQrCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCB0ZXN0X0FFU19HQ01fYXV0aF9lbmNyeXB0aW9uX3Rlc3RfY2Fz ZV8xOTJfNCksPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgVEVTVF9DQVNFX1NUKHV0X3Nl dHVwLCB1dF90ZWFyZG93biw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBURVNUX0NBU0Vf U1QodXRfc2V0dXAsIHV0X3RlYXJkb3duX2Flc19nY20sPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgdGVzdF9BRVNfR0NNX2F1dGhfZW5jcnlwdGlvbl90ZXN0X2Nhc2Vf MTkyXzUpLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFRFU1RfQ0FTRV9TVCh1dF9zZXR1 cCwgdXRfdGVhcmRvd24sPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgVEVTVF9DQVNFX1NU KHV0X3NldHVwLCB1dF90ZWFyZG93bl9hZXNfZ2NtLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIHRlc3RfQUVTX0dDTV9hdXRoX2VuY3J5cHRpb25fdGVzdF9jYXNlXzE5 Ml82KSw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBURVNUX0NBU0VfU1QodXRfc2V0dXAs IHV0X3RlYXJkb3duLDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFRFU1RfQ0FTRV9TVCh1 dF9zZXR1cCwgdXRfdGVhcmRvd25fYWVzX2djbSw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCB0ZXN0X0FFU19HQ01fYXV0aF9lbmNyeXB0aW9uX3Rlc3RfY2FzZV8xOTJf NyksPGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgLyoqIEFFUyBHQ00gQXV0aGVu dGljYXRlZCBEZWNyeXB0aW9uIDE5MiBiaXRzIGtleSAqLzxicj4NCi3CoCDCoCDCoCDCoCDCoCDC oCDCoCDCoFRFU1RfQ0FTRV9TVCh1dF9zZXR1cCwgdXRfdGVhcmRvd24sPGJyPg0KK8KgIMKgIMKg IMKgIMKgIMKgIMKgIMKgVEVTVF9DQVNFX1NUKHV0X3NldHVwLCB1dF90ZWFyZG93bl9hZXNfZ2Nt LDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHRlc3RfQUVTX0dDTV9h dXRoX2RlY3J5cHRpb25fdGVzdF9jYXNlXzE5Ml8xKSw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqBURVNUX0NBU0VfU1QodXRfc2V0dXAsIHV0X3RlYXJkb3duLDxicj4NCivCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoFRFU1RfQ0FTRV9TVCh1dF9zZXR1cCwgdXRfdGVhcmRvd25fYWVzX2djbSw8 YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB0ZXN0X0FFU19HQ01fYXV0 aF9kZWNyeXB0aW9uX3Rlc3RfY2FzZV8xOTJfMiksPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgVEVTVF9DQVNFX1NUKHV0X3NldHVwLCB1dF90ZWFyZG93biw8YnI+DQorwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqBURVNUX0NBU0VfU1QodXRfc2V0dXAsIHV0X3RlYXJkb3duX2Flc19nY20sPGJy Pg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgdGVzdF9BRVNfR0NNX2F1dGhf ZGVjcnlwdGlvbl90ZXN0X2Nhc2VfMTkyXzMpLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDC oFRFU1RfQ0FTRV9TVCh1dF9zZXR1cCwgdXRfdGVhcmRvd24sPGJyPg0KK8KgIMKgIMKgIMKgIMKg IMKgIMKgIMKgVEVTVF9DQVNFX1NUKHV0X3NldHVwLCB1dF90ZWFyZG93bl9hZXNfZ2NtLDxicj4N CsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHRlc3RfQUVTX0dDTV9hdXRoX2Rl Y3J5cHRpb25fdGVzdF9jYXNlXzE5Ml80KSw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBU RVNUX0NBU0VfU1QodXRfc2V0dXAsIHV0X3RlYXJkb3duLDxicj4NCivCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoFRFU1RfQ0FTRV9TVCh1dF9zZXR1cCwgdXRfdGVhcmRvd25fYWVzX2djbSw8YnI+DQrC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB0ZXN0X0FFU19HQ01fYXV0aF9kZWNy eXB0aW9uX3Rlc3RfY2FzZV8xOTJfNSksPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgVEVT VF9DQVNFX1NUKHV0X3NldHVwLCB1dF90ZWFyZG93biw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqBURVNUX0NBU0VfU1QodXRfc2V0dXAsIHV0X3RlYXJkb3duX2Flc19nY20sPGJyPg0KwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgdGVzdF9BRVNfR0NNX2F1dGhfZGVjcnlw dGlvbl90ZXN0X2Nhc2VfMTkyXzYpLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFRFU1Rf Q0FTRV9TVCh1dF9zZXR1cCwgdXRfdGVhcmRvd24sPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKg IMKgVEVTVF9DQVNFX1NUKHV0X3NldHVwLCB1dF90ZWFyZG93bl9hZXNfZ2NtLDxicj4NCsKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHRlc3RfQUVTX0dDTV9hdXRoX2RlY3J5cHRp b25fdGVzdF9jYXNlXzE5Ml83KSw8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAv KiogQUVTIEdDTSBBdXRoZW50aWNhdGVkIEVuY3J5cHRpb24gMjU2IGJpdHMga2V5ICovPGJyPg0K LcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgVEVTVF9DQVNFX1NUKHV0X3NldHVwLCB1dF90ZWFyZG93 biw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBURVNUX0NBU0VfU1QodXRfc2V0dXAsIHV0 X3RlYXJkb3duX2Flc19nY20sPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgdGVzdF9BRVNfR0NNX2F1dGhfZW5jcnlwdGlvbl90ZXN0X2Nhc2VfMjU2XzEpLDxicj4NCi3C oCDCoCDCoCDCoCDCoCDCoCDCoCDCoFRFU1RfQ0FTRV9TVCh1dF9zZXR1cCwgdXRfdGVhcmRvd24s PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgVEVTVF9DQVNFX1NUKHV0X3NldHVwLCB1dF90 ZWFyZG93bl9hZXNfZ2NtLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IHRlc3RfQUVTX0dDTV9hdXRoX2VuY3J5cHRpb25fdGVzdF9jYXNlXzI1Nl8yKSw8YnI+DQotwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBURVNUX0NBU0VfU1QodXRfc2V0dXAsIHV0X3RlYXJkb3duLDxi cj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFRFU1RfQ0FTRV9TVCh1dF9zZXR1cCwgdXRfdGVh cmRvd25fYWVzX2djbSw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB0 ZXN0X0FFU19HQ01fYXV0aF9lbmNyeXB0aW9uX3Rlc3RfY2FzZV8yNTZfMyksPGJyPg0KLcKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgVEVTVF9DQVNFX1NUKHV0X3NldHVwLCB1dF90ZWFyZG93biw8YnI+ DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBURVNUX0NBU0VfU1QodXRfc2V0dXAsIHV0X3RlYXJk b3duX2Flc19nY20sPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgdGVz dF9BRVNfR0NNX2F1dGhfZW5jcnlwdGlvbl90ZXN0X2Nhc2VfMjU2XzQpLDxicj4NCi3CoCDCoCDC oCDCoCDCoCDCoCDCoCDCoFRFU1RfQ0FTRV9TVCh1dF9zZXR1cCwgdXRfdGVhcmRvd24sPGJyPg0K K8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgVEVTVF9DQVNFX1NUKHV0X3NldHVwLCB1dF90ZWFyZG93 bl9hZXNfZ2NtLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHRlc3Rf QUVTX0dDTV9hdXRoX2VuY3J5cHRpb25fdGVzdF9jYXNlXzI1Nl81KSw8YnI+DQotwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqBURVNUX0NBU0VfU1QodXRfc2V0dXAsIHV0X3RlYXJkb3duLDxicj4NCivC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoFRFU1RfQ0FTRV9TVCh1dF9zZXR1cCwgdXRfdGVhcmRvd25f YWVzX2djbSw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB0ZXN0X0FF U19HQ01fYXV0aF9lbmNyeXB0aW9uX3Rlc3RfY2FzZV8yNTZfNiksPGJyPg0KLcKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgVEVTVF9DQVNFX1NUKHV0X3NldHVwLCB1dF90ZWFyZG93biw8YnI+DQorwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBURVNUX0NBU0VfU1QodXRfc2V0dXAsIHV0X3RlYXJkb3duX2Fl c19nY20sPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgdGVzdF9BRVNf R0NNX2F1dGhfZW5jcnlwdGlvbl90ZXN0X2Nhc2VfMjU2XzcpLDxicj4NCi3CoCDCoCDCoCDCoCDC oCDCoCDCoCDCoFRFU1RfQ0FTRV9TVCh1dF9zZXR1cCwgdXRfdGVhcmRvd24sPGJyPg0KK8KgIMKg IMKgIMKgIMKgIMKgIMKgIMKgVEVTVF9DQVNFX1NUKHV0X3NldHVwLCB1dF90ZWFyZG93bl9hZXNf Z2NtLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHRlc3RfQUVTX0dD TV9hdXRoX2VuY3J5cHRpb25fdGVzdF9jYXNlXzI1Nl84KSw8YnI+DQo8YnI+DQrCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCAvKiogQUVTIEdDTSBBdXRoZW50aWNhdGVkIERlY3J5cHRpb24gMjU2IGJp dHMga2V5ICovPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgVEVTVF9DQVNFX1NUKHV0X3Nl dHVwLCB1dF90ZWFyZG93biw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBURVNUX0NBU0Vf U1QodXRfc2V0dXAsIHV0X3RlYXJkb3duX2Flc19nY20sPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgdGVzdF9BRVNfR0NNX2F1dGhfZGVjcnlwdGlvbl90ZXN0X2Nhc2Vf MjU2XzEpLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFRFU1RfQ0FTRV9TVCh1dF9zZXR1 cCwgdXRfdGVhcmRvd24sPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgVEVTVF9DQVNFX1NU KHV0X3NldHVwLCB1dF90ZWFyZG93bl9hZXNfZ2NtLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIHRlc3RfQUVTX0dDTV9hdXRoX2RlY3J5cHRpb25fdGVzdF9jYXNlXzI1 Nl8yKSw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBURVNUX0NBU0VfU1QodXRfc2V0dXAs IHV0X3RlYXJkb3duLDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFRFU1RfQ0FTRV9TVCh1 dF9zZXR1cCwgdXRfdGVhcmRvd25fYWVzX2djbSw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCB0ZXN0X0FFU19HQ01fYXV0aF9kZWNyeXB0aW9uX3Rlc3RfY2FzZV8yNTZf MyksPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgVEVTVF9DQVNFX1NUKHV0X3NldHVwLCB1 dF90ZWFyZG93biw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBURVNUX0NBU0VfU1QodXRf c2V0dXAsIHV0X3RlYXJkb3duX2Flc19nY20sPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgdGVzdF9BRVNfR0NNX2F1dGhfZGVjcnlwdGlvbl90ZXN0X2Nhc2VfMjU2XzQp LDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFRFU1RfQ0FTRV9TVCh1dF9zZXR1cCwgdXRf dGVhcmRvd24sPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgVEVTVF9DQVNFX1NUKHV0X3Nl dHVwLCB1dF90ZWFyZG93bl9hZXNfZ2NtLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIHRlc3RfQUVTX0dDTV9hdXRoX2RlY3J5cHRpb25fdGVzdF9jYXNlXzI1Nl81KSw8 YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBURVNUX0NBU0VfU1QodXRfc2V0dXAsIHV0X3Rl YXJkb3duLDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFRFU1RfQ0FTRV9TVCh1dF9zZXR1 cCwgdXRfdGVhcmRvd25fYWVzX2djbSw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCB0ZXN0X0FFU19HQ01fYXV0aF9kZWNyeXB0aW9uX3Rlc3RfY2FzZV8yNTZfNiksPGJy Pg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgVEVTVF9DQVNFX1NUKHV0X3NldHVwLCB1dF90ZWFy ZG93biw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBURVNUX0NBU0VfU1QodXRfc2V0dXAs IHV0X3RlYXJkb3duX2Flc19nY20sPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgdGVzdF9BRVNfR0NNX2F1dGhfZGVjcnlwdGlvbl90ZXN0X2Nhc2VfMjU2XzcpLDxicj4N Ci3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFRFU1RfQ0FTRV9TVCh1dF9zZXR1cCwgdXRfdGVhcmRv d24sPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgVEVTVF9DQVNFX1NUKHV0X3NldHVwLCB1 dF90ZWFyZG93bl9hZXNfZ2NtLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIHRlc3RfQUVTX0dDTV9hdXRoX2RlY3J5cHRpb25fdGVzdF9jYXNlXzI1Nl84KSw8YnI+DQo8 YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAvKiogQUVTIEdDTSBBdXRoZW50aWNhdGVkIEVu Y3J5cHRpb24gYmlnIGFhZCBzaXplICovPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgVEVT VF9DQVNFX1NUKHV0X3NldHVwLCB1dF90ZWFyZG93biw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqBURVNUX0NBU0VfU1QodXRfc2V0dXAsIHV0X3RlYXJkb3duX2Flc19nY20sPGJyPg0KwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgdGVzdF9BRVNfR0NNX2F1dGhfZW5jcnlw dGlvbl90ZXN0X2Nhc2VfYWFkXzEpLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFRFU1Rf Q0FTRV9TVCh1dF9zZXR1cCwgdXRfdGVhcmRvd24sPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKg IMKgVEVTVF9DQVNFX1NUKHV0X3NldHVwLCB1dF90ZWFyZG93bl9hZXNfZ2NtLDxicj4NCsKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHRlc3RfQUVTX0dDTV9hdXRoX2VuY3J5cHRp b25fdGVzdF9jYXNlX2FhZF8yKSw8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAv KiogQUVTIEdDTSBBdXRoZW50aWNhdGVkIERlY3J5cHRpb24gYmlnIGFhZCBzaXplICovPGJyPg0K LcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgVEVTVF9DQVNFX1NUKHV0X3NldHVwLCB1dF90ZWFyZG93 biw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBURVNUX0NBU0VfU1QodXRfc2V0dXAsIHV0 X3RlYXJkb3duX2Flc19nY20sPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgdGVzdF9BRVNfR0NNX2F1dGhfZGVjcnlwdGlvbl90ZXN0X2Nhc2VfYWFkXzEpLDxicj4NCi3C oCDCoCDCoCDCoCDCoCDCoCDCoCDCoFRFU1RfQ0FTRV9TVCh1dF9zZXR1cCwgdXRfdGVhcmRvd24s PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgVEVTVF9DQVNFX1NUKHV0X3NldHVwLCB1dF90 ZWFyZG93bl9hZXNfZ2NtLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IHRlc3RfQUVTX0dDTV9hdXRoX2RlY3J5cHRpb25fdGVzdF9jYXNlX2FhZF8yKSw8YnI+DQo8YnI+ DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAvKiogT3V0IG9mIHBsYWNlIHRlc3RzICovPGJyPg0K LcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgVEVTVF9DQVNFX1NUKHV0X3NldHVwLCB1dF90ZWFyZG93 biw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBURVNUX0NBU0VfU1QodXRfc2V0dXAsIHV0 X3RlYXJkb3duX2Flc19nY20sPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgdGVzdF9BRVNfR0NNX2F1dGhlbnRpY2F0ZWRfZW5jcnlwdGlvbl9vb3BfdGVzdF9jYXNlXzEp LDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFRFU1RfQ0FTRV9TVCh1dF9zZXR1cCwgdXRf dGVhcmRvd24sPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgVEVTVF9DQVNFX1NUKHV0X3Nl dHVwLCB1dF90ZWFyZG93bl9hZXNfZ2NtLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIHRlc3RfQUVTX0dDTV9hdXRoZW50aWNhdGVkX2RlY3J5cHRpb25fb29wX3Rlc3Rf Y2FzZV8xKSw8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAvKiogU2Vzc2lvbi1s ZXNzIHRlc3RzICovPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgVEVTVF9DQVNFX1NUKHV0 X3NldHVwLCB1dF90ZWFyZG93biw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBURVNUX0NB U0VfU1QodXRfc2V0dXAsIHV0X3RlYXJkb3duX2Flc19nY20sPGJyPg0KwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgdGVzdF9BRVNfR0NNX2F1dGhlbnRpY2F0ZWRfZW5jcnlwdGlv bl9zZXNzaW9ubGVzc190ZXN0X2Nhc2VfMSksPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg VEVTVF9DQVNFX1NUKHV0X3NldHVwLCB1dF90ZWFyZG93biw8YnI+DQorwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqBURVNUX0NBU0VfU1QodXRfc2V0dXAsIHV0X3RlYXJkb3duX2Flc19nY20sPGJyPg0K wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgdGVzdF9BRVNfR0NNX2F1dGhlbnRp Y2F0ZWRfZGVjcnlwdGlvbl9zZXNzaW9ubGVzc190ZXN0X2Nhc2VfMSksPGJyPg0KPGJyPg0KwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgLyoqIEFFUyBHQ00gZXh0ZXJuYWwgbWJ1ZiB0ZXN0cyAqLzxi cj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFRFU1RfQ0FTRV9TVCh1dF9zZXR1cCwgdXRfdGVh cmRvd24sPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgVEVTVF9DQVNFX1NUKHV0X3NldHVw LCB1dF90ZWFyZG93bl9hZXNfZ2NtLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIHRlc3RfQUVTX0dDTV9hdXRoZW50aWNhdGVkX2VuY3J5cHRpb25fdGVzdF9jYXNlXzNf ZXh0X21idWYpLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFRFU1RfQ0FTRV9TVCh1dF9z ZXR1cCwgdXRfdGVhcmRvd24sPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgVEVTVF9DQVNF X1NUKHV0X3NldHVwLCB1dF90ZWFyZG93bl9hZXNfZ2NtLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIHRlc3RfQUVTX0dDTV9hdXRoZW50aWNhdGVkX2RlY3J5cHRpb25f dGVzdF9jYXNlXzNfZXh0X21idWYpLDxicj4NCjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IFRFU1RfQ0FTRVNfRU5EKCk8YnI+DQrCoCDCoCDCoCDCoCB9PGJyPg0KwqB9Ozxicj4NCjxicj4N Ci1zdGF0aWMgc3RydWN0IHVuaXRfdGVzdF9zdWl0ZSBjcnlwdG9kZXZfYWVzX2dtYWNfYXV0aF90 ZXN0c3VpdGXCoCA9IHs8YnI+DQorc3RhdGljIHN0cnVjdCB1bml0X3Rlc3Rfc3VpdGUgdGVzdHN1 aXRlX2Flc19nbWFjwqAgPSB7PGJyPg0KwqAgwqAgwqAgwqAgLnN1aXRlX25hbWUgPSAmcXVvdDtB RVMgR01BQyBBdXRoZW50aWNhdGlvbiBUZXN0IFN1aXRlJnF1b3Q7LDxicj4NCi3CoCDCoCDCoCDC oC5zZXR1cCA9IGFlc19nbWFjX2F1dGhfdGVzdHN1aXRlX3NldHVwLDxicj4NCivCoCDCoCDCoCDC oC5zZXR1cCA9IHRzX3NldHVwX2Flc19nbWFjLDxicj4NCivCoCDCoCDCoCDCoC50ZWFyZG93biA9 IHRzX3RlYXJkb3duX2dlbmVyaWMsPGJyPg0KwqAgwqAgwqAgwqAgLnVuaXRfdGVzdF9jYXNlcyA9 IHs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBURVNUX0NBU0VfU1QodXRfc2V0dXAsIHV0 X3RlYXJkb3duLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHRlc3Rf QUVTX0dNQUNfYXV0aGVudGljYXRpb25fdGVzdF9jYXNlXzEpLDxicj4NCkBAIC0xODcyOSw5ICsx ODQwNiwxMCBAQCBzdGF0aWMgc3RydWN0IHVuaXRfdGVzdF9zdWl0ZSBjcnlwdG9kZXZfYWVzX2dt YWNfYXV0aF90ZXN0c3VpdGXCoCA9IHs8YnI+DQrCoCDCoCDCoCDCoCB9PGJyPg0KwqB9Ozxicj4N Cjxicj4NCi1zdGF0aWMgc3RydWN0IHVuaXRfdGVzdF9zdWl0ZSBjcnlwdG9kZXZfY2hhY2hhMjBf cG9seTEzMDVfdGVzdHN1aXRlwqAgPSB7PGJyPg0KK3N0YXRpYyBzdHJ1Y3QgdW5pdF90ZXN0X3N1 aXRlIHRlc3RzdWl0ZV9jaGFjaGEyMF9wb2x5MTMwNcKgID0gezxicj4NCsKgIMKgIMKgIMKgIC5z dWl0ZV9uYW1lID0gJnF1b3Q7Q2hhY2hhMjAtUG9seTEzMDUgVGVzdCBTdWl0ZSZxdW90Oyw8YnI+ DQotwqAgwqAgwqAgwqAuc2V0dXAgPSBjaGFjaGEyMF9wb2x5MTMwNV90ZXN0c3VpdGVfc2V0dXAs PGJyPg0KK8KgIMKgIMKgIMKgLnNldHVwID0gdHNfc2V0dXBfY2hhY2hhMjBfcG9seTEzMDUsPGJy Pg0KK8KgIMKgIMKgIMKgLnRlYXJkb3duID0gdHNfdGVhcmRvd25fZ2VuZXJpYyw8YnI+DQrCoCDC oCDCoCDCoCAudW5pdF90ZXN0X2Nhc2VzID0gezxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IFRFU1RfQ0FTRV9TVCh1dF9zZXR1cCwgdXRfdGVhcmRvd24sPGJyPg0KwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgdGVzdF9jaGFjaGEyMF9wb2x5MTMwNV9lbmNyeXB0X3Rlc3Rf Y2FzZV9yZmM4NDM5KSw8YnI+DQpAQCAtMTg3NDMsOSArMTg0MjEsMTAgQEAgc3RhdGljIHN0cnVj dCB1bml0X3Rlc3Rfc3VpdGUgY3J5cHRvZGV2X2NoYWNoYTIwX3BvbHkxMzA1X3Rlc3RzdWl0ZcKg ID0gezxicj4NCsKgIMKgIMKgIMKgIH08YnI+DQrCoH07PGJyPg0KPGJyPg0KLXN0YXRpYyBzdHJ1 Y3QgdW5pdF90ZXN0X3N1aXRlIGNyeXB0b2Rldl9zbm93M2dfdGVzdHN1aXRlwqAgPSB7PGJyPg0K K3N0YXRpYyBzdHJ1Y3QgdW5pdF90ZXN0X3N1aXRlIHRlc3RzdWl0ZV9zbm93M2fCoCA9IHs8YnI+ DQrCoCDCoCDCoCDCoCAuc3VpdGVfbmFtZSA9ICZxdW90O1NOT1cgM0cgVGVzdCBTdWl0ZSZxdW90 Oyw8YnI+DQotwqAgwqAgwqAgwqAuc2V0dXAgPSBzbm93M2dfdGVzdHN1aXRlX3NldHVwLDxicj4N CivCoCDCoCDCoCDCoC5zZXR1cCA9IHRzX3NldHVwX3Nub3czZyw8YnI+DQorwqAgwqAgwqAgwqAu dGVhcmRvd24gPSB0c190ZWFyZG93bl9nZW5lcmljLDxicj4NCsKgIMKgIMKgIMKgIC51bml0X3Rl c3RfY2FzZXMgPSB7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgLyoqIFNOT1cgM0cgZW5j cnlwdCBvbmx5IChVRUEyKSAqLzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIFRFU1RfQ0FT RV9TVCh1dF9zZXR1cCwgdXRfdGVhcmRvd24sPGJyPg0KQEAgLTE4ODc3LDkgKzE4NTU2LDEwIEBA IHN0YXRpYyBzdHJ1Y3QgdW5pdF90ZXN0X3N1aXRlIGNyeXB0b2Rldl9zbm93M2dfdGVzdHN1aXRl wqAgPSB7PGJyPg0KwqAgwqAgwqAgwqAgfTxicj4NCsKgfTs8YnI+DQo8YnI+DQotc3RhdGljIHN0 cnVjdCB1bml0X3Rlc3Rfc3VpdGUgY3J5cHRvZGV2X3p1Y190ZXN0c3VpdGXCoCA9IHs8YnI+DQor c3RhdGljIHN0cnVjdCB1bml0X3Rlc3Rfc3VpdGUgdGVzdHN1aXRlX3p1Y8KgID0gezxicj4NCsKg IMKgIMKgIMKgIC5zdWl0ZV9uYW1lID0gJnF1b3Q7WlVDIFRlc3QgU3VpdGUmcXVvdDssPGJyPg0K LcKgIMKgIMKgIMKgLnNldHVwID0genVjX3Rlc3RzdWl0ZV9zZXR1cCw8YnI+DQorwqAgwqAgwqAg wqAuc2V0dXAgPSB0c19zZXR1cF96dWMsPGJyPg0KK8KgIMKgIMKgIMKgLnRlYXJkb3duID0gdHNf dGVhcmRvd25fZ2VuZXJpYyw8YnI+DQrCoCDCoCDCoCDCoCAudW5pdF90ZXN0X2Nhc2VzID0gezxi cj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIC8qKiBaVUMgZW5jcnlwdCBvbmx5IChFRUEzKSAq Lzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIFRFU1RfQ0FTRV9TVCh1dF9zZXR1cCwgdXRf dGVhcmRvd24sPGJyPg0KQEAgLTE5MDQ5LDkgKzE4NzI5LDEwIEBAIHN0YXRpYyBzdHJ1Y3QgdW5p dF90ZXN0X3N1aXRlIGNyeXB0b2Rldl96dWNfdGVzdHN1aXRlwqAgPSB7PGJyPg0KwqAgwqAgwqAg wqAgfTxicj4NCsKgfTs8YnI+DQo8YnI+DQotc3RhdGljIHN0cnVjdCB1bml0X3Rlc3Rfc3VpdGUg Y3J5cHRvZGV2X2htYWNfbWQ1X2F1dGhfdGVzdHN1aXRlwqAgPSB7PGJyPg0KK3N0YXRpYyBzdHJ1 Y3QgdW5pdF90ZXN0X3N1aXRlIHRlc3RzdWl0ZV9obWFjX21kNV9hdXRowqAgPSB7PGJyPg0KwqAg wqAgwqAgwqAgLnN1aXRlX25hbWUgPSAmcXVvdDtITUFDX01ENSBBdXRoZW50aWNhdGlvbiBUZXN0 IFN1aXRlJnF1b3Q7LDxicj4NCi3CoCDCoCDCoCDCoC5zZXR1cCA9IGhtYWNfbWQ1X2F1dGhfdGVz dHN1aXRlX3NldHVwLDxicj4NCivCoCDCoCDCoCDCoC5zZXR1cCA9IHRzX3NldHVwX2htYWNfbWQ1 LDxicj4NCivCoCDCoCDCoCDCoC50ZWFyZG93biA9IHRzX3RlYXJkb3duX2dlbmVyaWMsPGJyPg0K wqAgwqAgwqAgwqAgLnVuaXRfdGVzdF9jYXNlcyA9IHs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCBURVNUX0NBU0VfU1QodXRfc2V0dXAsIHV0X3RlYXJkb3duLDxicj4NCsKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHRlc3RfTUQ1X0hNQUNfZ2VuZXJhdGVfY2FzZV8xKSw8 YnI+DQpAQCAtMTkwNjUsOSArMTg3NDYsMTAgQEAgc3RhdGljIHN0cnVjdCB1bml0X3Rlc3Rfc3Vp dGUgY3J5cHRvZGV2X2htYWNfbWQ1X2F1dGhfdGVzdHN1aXRlwqAgPSB7PGJyPg0KwqAgwqAgwqAg wqAgfTxicj4NCsKgfTs8YnI+DQo8YnI+DQotc3RhdGljIHN0cnVjdCB1bml0X3Rlc3Rfc3VpdGUg Y3J5cHRvZGV2X2thc3VtaV90ZXN0c3VpdGXCoCA9IHs8YnI+DQorc3RhdGljIHN0cnVjdCB1bml0 X3Rlc3Rfc3VpdGUgdGVzdHN1aXRlX2thc3VtacKgID0gezxicj4NCsKgIMKgIMKgIMKgIC5zdWl0 ZV9uYW1lID0gJnF1b3Q7S2FzdW1pIFRlc3QgU3VpdGUmcXVvdDssPGJyPg0KLcKgIMKgIMKgIMKg LnNldHVwID0ga2FzdW1pX3Rlc3RzdWl0ZV9zZXR1cCw8YnI+DQorwqAgwqAgwqAgwqAuc2V0dXAg PSB0c19zZXR1cF9rYXN1bWksPGJyPg0KK8KgIMKgIMKgIMKgLnRlYXJkb3duID0gdHNfdGVhcmRv d25fZ2VuZXJpYyw8YnI+DQrCoCDCoCDCoCDCoCAudW5pdF90ZXN0X2Nhc2VzID0gezxicj4NCsKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIC8qKiBLQVNVTUkgaGFzaCBvbmx5IChVSUExKSAqLzxicj4N CsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIFRFU1RfQ0FTRV9TVCh1dF9zZXR1cCwgdXRfdGVhcmRv d24sPGJyPg0KQEAgLTE5MTU2LDkgKzE4ODM4LDEwIEBAIHN0YXRpYyBzdHJ1Y3QgdW5pdF90ZXN0 X3N1aXRlIGNyeXB0b2Rldl9rYXN1bWlfdGVzdHN1aXRlwqAgPSB7PGJyPg0KwqAgwqAgwqAgwqAg fTxicj4NCsKgfTs8YnI+DQo8YnI+DQotc3RhdGljIHN0cnVjdCB1bml0X3Rlc3Rfc3VpdGUgY3J5 cHRvZGV2X2Vzbl90ZXN0c3VpdGXCoCA9IHs8YnI+DQorc3RhdGljIHN0cnVjdCB1bml0X3Rlc3Rf c3VpdGUgdGVzdHN1aXRlX2VzbsKgID0gezxicj4NCsKgIMKgIMKgIMKgIC5zdWl0ZV9uYW1lID0g JnF1b3Q7RVNOIFRlc3QgU3VpdGUmcXVvdDssPGJyPg0KLcKgIMKgIMKgIMKgLnNldHVwID0gZXNu X3Rlc3RzdWl0ZV9zZXR1cCw8YnI+DQorwqAgwqAgwqAgwqAuc2V0dXAgPSB0c19zZXR1cF9lc24s PGJyPg0KK8KgIMKgIMKgIMKgLnRlYXJkb3duID0gdHNfdGVhcmRvd25fZ2VuZXJpYyw8YnI+DQrC oCDCoCDCoCDCoCAudW5pdF90ZXN0X2Nhc2VzID0gezxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIFRFU1RfQ0FTRV9TVCh1dF9zZXR1cCwgdXRfdGVhcmRvd24sPGJyPg0KwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgYXV0aF9lbmNyeXB0X0FFUzEyOENCQ19ITUFDX1NIQTFf ZXNuX2NoZWNrKSw8YnI+DQpAQCAtMTkxNjgsOSArMTg4NTEsMTAgQEAgc3RhdGljIHN0cnVjdCB1 bml0X3Rlc3Rfc3VpdGUgY3J5cHRvZGV2X2Vzbl90ZXN0c3VpdGXCoCA9IHs8YnI+DQrCoCDCoCDC oCDCoCB9PGJyPg0KwqB9Ozxicj4NCjxicj4NCi1zdGF0aWMgc3RydWN0IHVuaXRfdGVzdF9zdWl0 ZSBjcnlwdG9kZXZfbmVnYXRpdmVfYWVzX2djbV90ZXN0c3VpdGXCoCA9IHs8YnI+DQorc3RhdGlj IHN0cnVjdCB1bml0X3Rlc3Rfc3VpdGUgdGVzdHN1aXRlX25lZ2F0aXZlX2Flc19nY23CoCA9IHs8 YnI+DQrCoCDCoCDCoCDCoCAuc3VpdGVfbmFtZSA9ICZxdW90O05lZ2F0aXZlIEFFUyBHQ00gVGVz dCBTdWl0ZSZxdW90Oyw8YnI+DQotwqAgwqAgwqAgwqAuc2V0dXAgPSBuZWdhdGl2ZV9hZXNfZ2Nt X3Rlc3RzdWl0ZV9zZXR1cCw8YnI+DQorwqAgwqAgwqAgwqAuc2V0dXAgPSB0c19zZXR1cF9uZWdh dGl2ZV9hZXNfZ2NtLDxicj4NCivCoCDCoCDCoCDCoC50ZWFyZG93biA9IHRzX3RlYXJkb3duX2dl bmVyaWMsPGJyPg0KwqAgwqAgwqAgwqAgLnVuaXRfdGVzdF9jYXNlcyA9IHs8YnI+DQrCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCBURVNUX0NBU0VfU1QodXRfc2V0dXAsIHV0X3RlYXJkb3duLDxicj4N CsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHRlc3RfQUVTX0dDTV9hdXRoX2Vu Y3J5cHRpb25fZmFpbF9pdl9jb3JydXB0KSw8YnI+DQpAQCAtMTkyMDEsOSArMTg4ODUsMTAgQEAg c3RhdGljIHN0cnVjdCB1bml0X3Rlc3Rfc3VpdGUgY3J5cHRvZGV2X25lZ2F0aXZlX2Flc19nY21f dGVzdHN1aXRlwqAgPSB7PGJyPg0KwqAgwqAgwqAgwqAgfTxicj4NCsKgfTs8YnI+DQo8YnI+DQot c3RhdGljIHN0cnVjdCB1bml0X3Rlc3Rfc3VpdGUgY3J5cHRvZGV2X25lZ2F0aXZlX2Flc19nbWFj X3Rlc3RzdWl0ZcKgID0gezxicj4NCitzdGF0aWMgc3RydWN0IHVuaXRfdGVzdF9zdWl0ZSB0ZXN0 c3VpdGVfbmVnYXRpdmVfYWVzX2dtYWPCoCA9IHs8YnI+DQrCoCDCoCDCoCDCoCAuc3VpdGVfbmFt ZSA9ICZxdW90O05lZ2F0aXZlIEFFUyBHTUFDIFRlc3QgU3VpdGUmcXVvdDssPGJyPg0KLcKgIMKg IMKgIMKgLnNldHVwID0gbmVnYXRpdmVfYWVzX2dtYWNfdGVzdHN1aXRlX3NldHVwLDxicj4NCivC oCDCoCDCoCDCoC5zZXR1cCA9IHRzX3NldHVwX25lZ2F0aXZlX2Flc19nbWFjLDxicj4NCivCoCDC oCDCoCDCoC50ZWFyZG93biA9IHRzX3RlYXJkb3duX2dlbmVyaWMsPGJyPg0KwqAgwqAgwqAgwqAg LnVuaXRfdGVzdF9jYXNlcyA9IHs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBURVNUX0NB U0VfU1QodXRfc2V0dXAsIHV0X3RlYXJkb3duLDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIGF1dGhlbnRpY2F0aW9uX3ZlcmlmeV9BRVMxMjhfR01BQ19mYWlsX2RhdGFf Y29ycnVwdCksPGJyPg0KQEAgLTE5MjE0LDkgKzE4ODk5LDEwIEBAIHN0YXRpYyBzdHJ1Y3QgdW5p dF90ZXN0X3N1aXRlIGNyeXB0b2Rldl9uZWdhdGl2ZV9hZXNfZ21hY190ZXN0c3VpdGXCoCA9IHs8 YnI+DQrCoCDCoCDCoCDCoCB9PGJyPg0KwqB9Ozxicj4NCjxicj4NCi1zdGF0aWMgc3RydWN0IHVu aXRfdGVzdF9zdWl0ZSBjcnlwdG9kZXZfbWl4ZWRfY2lwaGVyX2hhc2hfdGVzdHN1aXRlwqAgPSB7 PGJyPg0KK3N0YXRpYyBzdHJ1Y3QgdW5pdF90ZXN0X3N1aXRlIHRlc3RzdWl0ZV9taXhlZF9jaXBo ZXJfaGFzaMKgID0gezxicj4NCsKgIMKgIMKgIMKgIC5zdWl0ZV9uYW1lID0gJnF1b3Q7TWl4ZWQg Q0lQSEVSICsgSEFTSCBhbGdvcml0aG1zIFRlc3QgU3VpdGUmcXVvdDssPGJyPg0KLcKgIMKgIMKg IMKgLnNldHVwID0gbWl4ZWRfY2lwaGVyX2hhc2hfdGVzdHN1aXRlX3NldHVwLDxicj4NCivCoCDC oCDCoCDCoC5zZXR1cCA9IHRzX3NldHVwX21peGVkX2NpcGhlcl9oYXNoLDxicj4NCivCoCDCoCDC oCDCoC50ZWFyZG93biA9IHRzX3RlYXJkb3duX2dlbmVyaWMsPGJyPg0KwqAgwqAgwqAgwqAgLnVu aXRfdGVzdF9jYXNlcyA9IHs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAvKiogQVVUSCBB RVMgQ01BQyArIENJUEhFUiBBRVMgQ1RSICovPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg VEVTVF9DQVNFX1NUKHV0X3NldHVwLCB1dF90ZWFyZG93biw8YnI+DQpAQCAtMTkzNTEsMjQgKzE5 MDM3LDI1IEBAIHJ1bl9jcnlwdG9kZXZfdGVzdHN1aXRlKGNvbnN0IGNoYXIgKnBtZF9uYW1lKTxi cj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIEJMS0NJUEhFUl9ERVNfRE9DU0lTX1RZUEUsPGJy Pg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgQkxLQ0lQSEVSX1NNNF9DSEFJTl9UWVBFLDxicj4N CsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIEJMS0NJUEhFUl9TTTRfQ0lQSEVST05MWV9UWVBFLDxi cj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoEJMS0NJUEhFUl9BVVRIT05MWV9UWVBFfTs8YnI+ DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBCTEtDSVBIRVJfQVVUSE9OTFlfVFlQRTxicj4NCivC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoH07PGJyPg0KwqAgwqAgwqAgwqAgc3RydWN0IHVuaXRfdGVz dF9zdWl0ZSAqc3RhdGljX3N1aXRlc1tdID0gezxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCZhbXA7Y3J5cHRvZGV2X211bHRpX3Nlc3Npb25fdGVzdHN1aXRlLDxicj4NCi3CoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCZhbXA7Y3J5cHRvZGV2X251bGxfdGVzdHN1aXRlLDxicj4NCi3CoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCZhbXA7Y3J5cHRvZGV2X2Flc19jY21fYXV0aF90ZXN0c3VpdGUsPGJy Pg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJmFtcDtjcnlwdG9kZXZfYWVzX2djbV9hdXRoX3Rl c3RzdWl0ZSw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmYW1wO2NyeXB0b2Rldl9hZXNf Z21hY19hdXRoX3Rlc3RzdWl0ZSw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmYW1wO2Ny eXB0b2Rldl9zbm93M2dfdGVzdHN1aXRlLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZh bXA7Y3J5cHRvZGV2X2NoYWNoYTIwX3BvbHkxMzA1X3Rlc3RzdWl0ZSw8YnI+DQotwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAmYW1wO2NyeXB0b2Rldl96dWNfdGVzdHN1aXRlLDxicj4NCi3CoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCZhbXA7Y3J5cHRvZGV2X2htYWNfbWQ1X2F1dGhfdGVzdHN1aXRlLDxi cj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZhbXA7Y3J5cHRvZGV2X2thc3VtaV90ZXN0c3Vp dGUsPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJmFtcDtjcnlwdG9kZXZfZXNuX3Rlc3Rz dWl0ZSw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmYW1wO2NyeXB0b2Rldl9uZWdhdGl2 ZV9hZXNfZ2NtX3Rlc3RzdWl0ZSw8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmYW1wO2Ny eXB0b2Rldl9uZWdhdGl2ZV9hZXNfZ21hY190ZXN0c3VpdGUsPGJyPg0KLcKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgJmFtcDtjcnlwdG9kZXZfbWl4ZWRfY2lwaGVyX2hhc2hfdGVzdHN1aXRlLDxicj4N Ci3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZhbXA7Y3J5cHRvZGV2X25lZ2F0aXZlX2htYWNfc2hh MV90ZXN0c3VpdGUsPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJmFtcDtjcnlwdG9kZXZf Z2VuX3Rlc3RzdWl0ZSw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmYW1wO3Rlc3RzdWl0 ZV9tdWx0aV9zZXNzaW9uLDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZhbXA7dGVzdHN1 aXRlX251bGwsPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJmFtcDt0ZXN0c3VpdGVfYWVz X2NjbSw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmYW1wO3Rlc3RzdWl0ZV9hZXNfZ2Nt LDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZhbXA7dGVzdHN1aXRlX2Flc19nbWFjLDxi cj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZhbXA7dGVzdHN1aXRlX3Nub3czZyw8YnI+DQor wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmYW1wO3Rlc3RzdWl0ZV9jaGFjaGEyMF9wb2x5MTMwNSw8 YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmYW1wO3Rlc3RzdWl0ZV96dWMsPGJyPg0KK8Kg IMKgIMKgIMKgIMKgIMKgIMKgIMKgJmFtcDt0ZXN0c3VpdGVfaG1hY19tZDVfYXV0aCw8YnI+DQor wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmYW1wO3Rlc3RzdWl0ZV9rYXN1bWksPGJyPg0KK8KgIMKg IMKgIMKgIMKgIMKgIMKgIMKgJmFtcDt0ZXN0c3VpdGVfZXNuLDxicj4NCivCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCZhbXA7dGVzdHN1aXRlX25lZ2F0aXZlX2Flc19nY20sPGJyPg0KK8KgIMKgIMKg IMKgIMKgIMKgIMKgIMKgJmFtcDt0ZXN0c3VpdGVfbmVnYXRpdmVfYWVzX2dtYWMsPGJyPg0KK8Kg IMKgIMKgIMKgIMKgIMKgIMKgIMKgJmFtcDt0ZXN0c3VpdGVfbWl4ZWRfY2lwaGVyX2hhc2gsPGJy Pg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJmFtcDt0ZXN0c3VpdGVfbmVnYXRpdmVfaG1hY19z aGExLDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZhbXA7dGVzdHN1aXRlX2dlbl90ZXN0 c3VpdGUsPGJyPg0KwqAjaWZkZWYgUlRFX0xJQl9TRUNVUklUWTxicj4NCsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgICZhbXA7aXBzZWNfcHJvdG9fdGVzdHN1aXRlLDxicj4NCsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgICZhbXA7cGRjcF9wcm90b190ZXN0c3VpdGUsPGJyPg0KZGlmZiAtLWdpdCBhL2Fw cC90ZXN0L3Rlc3RfY3J5cHRvZGV2LmggYi9hcHAvdGVzdC90ZXN0X2NyeXB0b2Rldi5oPGJyPg0K aW5kZXggZmQ5ZWEwZGQ4MS4uZDg4NGYxZGVhMyAxMDA2NDQ8YnI+DQotLS0gYS9hcHAvdGVzdC90 ZXN0X2NyeXB0b2Rldi5oPGJyPg0KKysrIGIvYXBwL3Rlc3QvdGVzdF9jcnlwdG9kZXYuaDxicj4N CkBAIC04Niw3ICs4Niw3IEBAIGVudW0gY3J5cHRvZGV2X2FwaV90ZXN0X3R5cGUgezxicj4NCjxi cj4NCsKgZXh0ZXJuIGVudW0gY3J5cHRvZGV2X2FwaV90ZXN0X3R5cGUgZ2xvYmFsX2FwaV90ZXN0 X3R5cGU7PGJyPg0KPGJyPg0KLWV4dGVybiBzdHJ1Y3QgY3J5cHRvX3Rlc3RzdWl0ZV9wYXJhbXMg KnBfdGVzdHN1aXRlX3BhcmFtczs8YnI+DQorZXh0ZXJuIHN0cnVjdCBjcnlwdG9fdGVzdHN1aXRl X3BhcmFtcyAqcF90c19wYXJhbXM7PGJyPg0KwqBzdHJ1Y3QgY3J5cHRvX3Rlc3RzdWl0ZV9wYXJh bXMgezxicj4NCsKgIMKgIMKgIMKgIHN0cnVjdCBydGVfbWVtcG9vbCAqbWJ1Zl9wb29sOzxicj4N CsKgIMKgIMKgIMKgIHN0cnVjdCBydGVfbWVtcG9vbCAqbGFyZ2VfbWJ1Zl9wb29sOzxicj4NCkBA IC05OCw2ICs5OCwxMCBAQCBzdHJ1Y3QgY3J5cHRvX3Rlc3RzdWl0ZV9wYXJhbXMgezxicj4NCjxi cj4NCsKgIMKgIMKgIMKgIHVpbnQ4X3QgdmFsaWRfZGV2c1tSVEVfQ1JZUFRPX01BWF9ERVZTXTs8 YnI+DQrCoCDCoCDCoCDCoCB1aW50OF90IHZhbGlkX2Rldl9jb3VudDs8YnI+DQorwqAgwqAgwqAg wqAvKiBEZXZpY2UgSUQgdGhhdCBpcyB1c2VkIGluIHRlc3RzIHRoYXQgcmVxdWlyZSBzaW5nbGUg ZGV2aWNlICovPGJyPg0KK8KgIMKgIMKgIMKgaW50IGRldl9pZDs8YnI+DQorwqAgwqAgwqAgwqAv KiBDcnlwdG9kZXYgZGV2aWNlIGluZm8gdGhhdCBpcyB1c2VkIGluIHRlc3RzIHRoYXQgcmVxdWly ZSBzaW5nbGUgZGV2aWNlICovPGJyPg0KK8KgIMKgIMKgIMKgc3RydWN0IHJ0ZV9jcnlwdG9kZXZf aW5mbyBkZXZfaW5mbzs8YnI+DQrCoH07PGJyPg0KPGJyPg0KwqAvKio8YnI+DQpkaWZmIC0tZ2l0 IGEvYXBwL3Rlc3QvdGVzdF9jcnlwdG9kZXZfYWVhZF90ZXN0X3ZlY3RvcnMuaCBiL2FwcC90ZXN0 L3Rlc3RfY3J5cHRvZGV2X2FlYWRfdGVzdF92ZWN0b3JzLmg8YnI+DQppbmRleCBlOWIwNTkwMDQ4 Li45YzNhYTMyOGUzIDEwMDY0NDxicj4NCi0tLSBhL2FwcC90ZXN0L3Rlc3RfY3J5cHRvZGV2X2Fl YWRfdGVzdF92ZWN0b3JzLmg8YnI+DQorKysgYi9hcHAvdGVzdC90ZXN0X2NyeXB0b2Rldl9hZWFk X3Rlc3RfdmVjdG9ycy5oPGJyPg0KQEAgLTM5LDYgKzM5LDcgQEAgc3RhdGljIHVpbnQ4X3QgY2Nt X2FhZF90ZXN0XzJbMjJdID0gezxicj4NCsKgfTs8YnI+DQo8YnI+DQrCoHN0cnVjdCBhZWFkX3Rl c3RfZGF0YSB7PGJyPg0KK8KgIMKgIMKgIMKgY29uc3QgY2hhciAqZGVzY3JpcHRpb247PGJyPg0K wqAgwqAgwqAgwqAgZW51bSBydGVfY3J5cHRvX2FlYWRfYWxnb3JpdGhtIGFsZ287PGJyPg0KPGJy Pg0KwqAgwqAgwqAgwqAgc3RydWN0IHs8YnI+DQpkaWZmIC0tZ2l0IGEvYXBwL3Rlc3QvdGVzdF9j cnlwdG9kZXZfYWVzX3Rlc3RfdmVjdG9ycy5oIGIvYXBwL3Rlc3QvdGVzdF9jcnlwdG9kZXZfYWVz X3Rlc3RfdmVjdG9ycy5oPGJyPg0KaW5kZXggNzEyNzE1NmNjNC4uMDllYmU0YWY1MCAxMDA2NDQ8 YnI+DQotLS0gYS9hcHAvdGVzdC90ZXN0X2NyeXB0b2Rldl9hZXNfdGVzdF92ZWN0b3JzLmg8YnI+ DQorKysgYi9hcHAvdGVzdC90ZXN0X2NyeXB0b2Rldl9hZXNfdGVzdF92ZWN0b3JzLmg8YnI+DQpA QCAtNSw2ICs1LDExMiBAQDxicj4NCsKgI2lmbmRlZiBURVNUX0NSWVBUT0RFVl9BRVNfVEVTVF9W RUNUT1JTX0hfPGJyPg0KwqAjZGVmaW5lIFRFU1RfQ1JZUFRPREVWX0FFU19URVNUX1ZFQ1RPUlNf SF88YnI+DQo8YnI+DQorc3RhdGljIGNvbnN0IGNoYXIgY2F0Y2hfMjJfcXVvdGVbXSA9PGJyPg0K K8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJnF1b3Q7V2hhdCBhIGxvdXN5IGVhcnRoISBIZSB3b25k ZXJlZCBob3cgbWFueSBwZW9wbGUgd2VyZSAmcXVvdDs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAmcXVvdDtkZXN0aXR1dGUgdGhhdCBzYW1lIG5pZ2h0IGV2ZW4gaW4gaGlzIG93biBwcm9z cGVyb3VzIGNvdW50cnksICZxdW90Ozxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZxdW90 O2hvdyBtYW55IGhvbWVzIHdlcmUgc2hhbnRpZXMsIGhvdyBtYW55IGh1c2JhbmRzIHdlcmUgZHJ1 bmsgJnF1b3Q7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJnF1b3Q7YW5kIHdpdmVzIHNv Y2tlZCwgYW5kIGhvdyBtYW55IGNoaWxkcmVuIHdlcmUgYnVsbGllZCwgYWJ1c2VkLCAmcXVvdDs8 YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmcXVvdDtvciBhYmFuZG9uZWQuIEhvdyBtYW55 IGZhbWlsaWVzIGh1bmdlcmVkIGZvciBmb29kIHRoZXkgY291bGQgJnF1b3Q7PGJyPg0KK8KgIMKg IMKgIMKgIMKgIMKgIMKgIMKgJnF1b3Q7bm90IGFmZm9yZCB0byBidXk/IEhvdyBtYW55IGhlYXJ0 cyB3ZXJlIGJyb2tlbj8gSG93IG1hbnkgJnF1b3Q7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKg IMKgJnF1b3Q7c3VpY2lkZXMgd291bGQgdGFrZSBwbGFjZSB0aGF0IHNhbWUgbmlnaHQsIGhvdyBt YW55IHBlb3BsZSAmcXVvdDs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmcXVvdDt3b3Vs ZCBnbyBpbnNhbmU/IEhvdyBtYW55IGNvY2tyb2FjaGVzIGFuZCBsYW5kbG9yZHMgd291bGQgJnF1 b3Q7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJnF1b3Q7dHJpdW1waD8gSG93IG1hbnkg d2lubmVycyB3ZXJlIGxvc2Vycywgc3VjY2Vzc2VzIGZhaWx1cmVzLCAmcXVvdDs8YnI+DQorwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAmcXVvdDthbmQgcmljaCBtZW4gcG9vciBtZW4/IEhvdyBtYW55 IHdpc2UgZ3V5cyB3ZXJlIHN0dXBpZD8gSG93ICZxdW90Ozxicj4NCivCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCZxdW90O21hbnkgaGFwcHkgZW5kaW5ncyB3ZXJlIHVuaGFwcHkgZW5kaW5ncz8gSG93 IG1hbnkgaG9uZXN0IG1lbiAmcXVvdDs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmcXVv dDt3ZXJlIGxpYXJzLCBicmF2ZSBtZW4gY293YXJkcywgbG95YWwgbWVuIHRyYWl0b3JzLCBob3cg bWFueSAmcXVvdDs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmcXVvdDtzYWludGVkIG1l biB3ZXJlIGNvcnJ1cHQsIGhvdyBtYW55IHBlb3BsZSBpbiBwb3NpdGlvbnMgb2YgJnF1b3Q7PGJy Pg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgJnF1b3Q7dHJ1c3QgaGFkIHNvbGQgdGhlaXIgc291 bHMgdG8gYm9keWd1YXJkcywgaG93IG1hbnkgaGFkIG5ldmVyICZxdW90Ozxicj4NCivCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCZxdW90O2hhZCBzb3Vscz8gSG93IG1hbnkgc3RyYWlnaHQtYW5kLW5h cnJvdyBwYXRocyB3ZXJlIGNyb29rZWQgJnF1b3Q7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKg IMKgJnF1b3Q7cGF0aHM/IEhvdyBtYW55IGJlc3QgZmFtaWxpZXMgd2VyZSB3b3JzdCBmYW1pbGll cyBhbmQgaG93ICZxdW90Ozxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCZxdW90O21hbnkg Z29vZCBwZW9wbGUgd2VyZSBiYWQgcGVvcGxlPyBXaGVuIHlvdSBhZGRlZCB0aGVtIGFsbCB1cCAm cXVvdDs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmcXVvdDthbmQgdGhlbiBzdWJ0cmFj dGVkLCB5b3UgbWlnaHQgYmUgbGVmdCB3aXRoIG9ubHkgdGhlIGNoaWxkcmVuLCAmcXVvdDs8YnI+ DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAmcXVvdDthbmQgcGVyaGFwcyB3aXRoIEFsYmVydCBF aW5zdGVpbiBhbmQgYW4gb2xkIHZpb2xpbmlzdCBvciAmcXVvdDs8YnI+DQorwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAmcXVvdDtzY3VscHRvciBzb21ld2hlcmUuJnF1b3Q7Ozxicj4NCis8YnI+DQor I2RlZmluZSBRVU9URV80ODBfQllURVPCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAoNDgwKTxicj4N CisjZGVmaW5lIFFVT1RFXzUxMl9CWVRFU8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICg1MTIpPGJy Pg0KKyNkZWZpbmUgUVVPVEVfNzY4X0JZVEVTwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgKDc2OCk8 YnI+DQorI2RlZmluZSBRVU9URV8xMDI0X0JZVEVTwqAgwqAgwqAgwqAoMTAyNCk8YnI+DQorPGJy Pg0KKyNkZWZpbmUgQ0lQSEVSX0tFWV9MRU5HVEhfQUVTX0NCQ8KgIMKgIMKgICgxNik8YnI+DQor I2RlZmluZSBDSVBIRVJfSVZfTEVOR1RIX0FFU19DQkPCoCDCoCDCoCDCoChDSVBIRVJfS0VZX0xF TkdUSF9BRVNfQ0JDKTxicj4NCis8YnI+DQorPGJyPg0KKy8qICoqKioqIEFFUy1DQkMgLyBITUFD LVNIQTEgSGFzaCBUZXN0cyAqKioqKiAqLzxicj4NCis8YnI+DQorc3RhdGljIGNvbnN0IHVpbnQ4 X3QgY2F0Y2hfMjJfcXVvdGVfMl81MTJfYnl0ZXNfQUVTX0NCQ19jaXBoZXJ0ZXh0W10gPSB7PGJy Pg0KK8KgIMKgIMKgIMKgMHg4QiwgMHg0RCwgMHhEQSwgMHgxQiwgMHhDRiwgMHgwNCwgMHhBMCwg MHgzMSw8YnI+DQorwqAgwqAgwqAgwqAweEI0LCAweEJGLCAweEJELCAweDY4LCAweDQzLCAweDIw LCAweDdFLCAweDc2LDxicj4NCivCoCDCoCDCoCDCoDB4QjEsIDB4OTYsIDB4OEIsIDB4QTIsIDB4 N0MsIDB4QTIsIDB4ODMsIDB4OUUsPGJyPg0KK8KgIMKgIMKgIMKgMHgzOSwgMHg1QSwgMHgyRiwg MHg3RSwgMHg5MiwgMHhCNCwgMHg0OCwgMHgxQSw8YnI+DQorwqAgwqAgwqAgwqAweDNGLCAweDZC LCAweDVELCAweERGLCAweDUyLCAweDg1LCAweDVGLCAweDhFLDxicj4NCivCoCDCoCDCoCDCoDB4 NDIsIDB4M0MsIDB4RkIsIDB4RTksIDB4MUEsIDB4MjQsIDB4RDYsIDB4MDgsPGJyPg0KK8KgIMKg IMKgIMKgMHhERCwgMHhGRCwgMHgxNiwgMHhGQiwgMHhFOSwgMHg1NSwgMHhFRiwgMHhGMCw8YnI+ DQorwqAgwqAgwqAgwqAweEEwLCAweDhELCAweDEzLCAweEFCLCAweDgxLCAweEM2LCAweDkwLCAw eDAxLDxicj4NCivCoCDCoCDCoCDCoDB4QjUsIDB4MTgsIDB4ODQsIDB4QjMsIDB4RjYsIDB4RTYs IDB4MTEsIDB4NTcsPGJyPg0KK8KgIMKgIMKgIMKgMHhENiwgMHg3MSwgMHhDNiwgMHgzQywgMHgz RiwgMHgyRiwgMHgzMywgMHhFRSw8YnI+DQorwqAgwqAgwqAgwqAweDI0LCAweDQyLCAweDZFLCAw eEFDLCAweDBCLCAweENBLCAweEVDLCAweEY5LDxicj4NCivCoCDCoCDCoCDCoDB4ODQsIDB4Rjgs IDB4MjIsIDB4QUEsIDB4NjAsIDB4RjAsIDB4MzIsIDB4QTksPGJyPg0KK8KgIMKgIMKgIMKgMHg3 NSwgMHg3NSwgMHgzQiwgMHhDQiwgMHg3MCwgMHgyMSwgMHgwQSwgMHg4RCw8YnI+DQorwqAgwqAg wqAgwqAweDBGLCAweEUwLCAweEM0LCAweDc4LCAweDJCLCAweEY4LCAweDk3LCAweEUzLDxicj4N CivCoCDCoCDCoCDCoDB4RTQsIDB4MjYsIDB4NEIsIDB4MjksIDB4REEsIDB4ODgsIDB4Q0QsIDB4 NDYsPGJyPg0KK8KgIMKgIMKgIMKgMHhFQywgMHhBQSwgMHhGOSwgMHg3RiwgMHhGMSwgMHgxNSwg MHhFQSwgMHhDMyw8YnI+DQorwqAgwqAgwqAgwqAweDg3LCAweEU2LCAweDMxLCAweEYyLCAweENG LCAweERFLCAweDRELCAweDgwLDxicj4NCivCoCDCoCDCoCDCoDB4NzAsIDB4OTEsIDB4N0UsIDB4 MEMsIDB4RjcsIDB4MjYsIDB4M0EsIDB4OTIsPGJyPg0KK8KgIMKgIMKgIMKgMHg0RiwgMHgxOCwg MHg4MywgMHhDMCwgMHg4RiwgMHg1OSwgMHgwMSwgMHhBNSw8YnI+DQorwqAgwqAgwqAgwqAweDg4 LCAweEQxLCAweERCLCAweDI2LCAweDcxLCAweDI3LCAweDE2LCAweEY1LDxicj4NCivCoCDCoCDC oCDCoDB4RUUsIDB4MTAsIDB4ODIsIDB4QUMsIDB4NjgsIDB4MjYsIDB4OUIsIDB4RTIsPGJyPg0K K8KgIMKgIMKgIMKgMHg2RCwgMHhEOCwgMHg5QSwgMHg4MCwgMHhERiwgMHgwNCwgMHgzMSwgMHhE NSw8YnI+DQorwqAgwqAgwqAgwqAweEYxLCAweDM1LCAweDVDLCAweDNCLCAweERELCAweDlBLCAw eDY1LCAweEJBLDxicj4NCivCoCDCoCDCoCDCoDB4NTgsIDB4MzQsIDB4ODUsIDB4NjEsIDB4MUMs IDB4NDIsIDB4MTAsIDB4NzYsPGJyPg0KK8KgIMKgIMKgIMKgMHg3MywgMHgwMiwgMHg0MiwgMHhD OSwgMHgyMywgMHgxOCwgMHg4RSwgMHhCNCw8YnI+DQorwqAgwqAgwqAgwqAweDZGLCAweEI0LCAw eEEzLCAweDU0LCAweDZFLCAweDg4LCAweDNCLCAweDYyLDxicj4NCivCoCDCoCDCoCDCoDB4N0Ms IDB4MDIsIDB4OEQsIDB4NEMsIDB4OUYsIDB4QzgsIDB4NDUsIDB4RjQsPGJyPg0KK8KgIMKgIMKg IMKgMHhDOSwgMHhERSwgMHg0RiwgMHhFQiwgMHgyMiwgMHg4MywgMHgxQiwgMHhFNCw8YnI+DQor wqAgwqAgwqAgwqAweDQ5LCAweDM3LCAweEU0LCAweEFELCAweEU3LCAweENELCAweDIxLCAweDU0 LDxicj4NCivCoCDCoCDCoCDCoDB4QkMsIDB4MUMsIDB4QzIsIDB4MDQsIDB4OTcsIDB4QjQsIDB4 MTAsIDB4NjEsPGJyPg0KK8KgIMKgIMKgIMKgMHhGMCwgMHhFNCwgMHhFRiwgMHgyNywgMHg2Mywg MHgzQSwgMHhEQSwgMHg5MSw8YnI+DQorwqAgwqAgwqAgwqAweDQxLCAweDI1LCAweDYyLCAweDFD LCAweDVDLCAweEI2LCAweDM4LCAweDRBLDxicj4NCivCoCDCoCDCoCDCoDB4ODgsIDB4NzEsIDB4 NTksIDB4NUEsIDB4OEQsIDB4QTAsIDB4MDksIDB4QUYsPGJyPg0KK8KgIMKgIMKgIMKgMHg3Miwg MHg5NCwgMHhENywgMHg3OSwgMHg1QywgMHg2MCwgMHg3QywgMHg4Riw8YnI+DQorwqAgwqAgwqAg wqAweDRDLCAweEY1LCAweEQ5LCAweEExLCAweDM5LCAweDZELCAweDgxLCAweDI4LDxicj4NCivC oCDCoCDCoCDCoDB4RUYsIDB4MTMsIDB4MjgsIDB4REYsIDB4RjUsIDB4M0UsIDB4RjcsIDB4OEUs PGJyPg0KK8KgIMKgIMKgIMKgMHgwOSwgMHg5QywgMHg3OCwgMHgxOCwgMHg3OSwgMHhCOCwgMHg2 OCwgMHhENyw8YnI+DQorwqAgwqAgwqAgwqAweEE4LCAweDI5LCAweDYyLCAweEFELCAweERFLCAw eEUxLCAweDYxLCAweDc2LDxicj4NCivCoCDCoCDCoCDCoDB4MUIsIDB4MDUsIDB4MTYsIDB4Q0Qs IDB4QkYsIDB4MDIsIDB4OEUsIDB4QTYsPGJyPg0KK8KgIMKgIMKgIMKgMHg0MywgMHg2RSwgMHg5 MiwgMHg1NSwgMHg0RiwgMHg2MCwgMHg5QywgMHgwMyw8YnI+DQorwqAgwqAgwqAgwqAweEI4LCAw eDRGLCAweEEzLCAweDAyLCAweEFDLCAweEE4LCAweEE3LCAweDBDLDxicj4NCivCoCDCoCDCoCDC oDB4MUUsIDB4QjUsIDB4NkIsIDB4RjgsIDB4QzgsIDB4NEQsIDB4REUsIDB4RDIsPGJyPg0KK8Kg IMKgIMKgIMKgMHhCMCwgMHgyOSwgMHg2RSwgMHg0MCwgMHhFNiwgMHhENiwgMHhDOSwgMHhFNiw8 YnI+DQorwqAgwqAgwqAgwqAweEI5LCAweDBGLCAweEI2LCAweDYzLCAweEY1LCAweEFBLCAweDJC LCAweDk2LDxicj4NCivCoCDCoCDCoCDCoDB4QTcsIDB4MTYsIDB4QUMsIDB4NEUsIDB4MEEsIDB4 MzMsIDB4MUMsIDB4QTYsPGJyPg0KK8KgIMKgIMKgIMKgMHhFNiwgMHhCRCwgMHg4QSwgMHhDRiwg MHg0MCwgMHhBOSwgMHhCMiwgMHhGQSw8YnI+DQorwqAgwqAgwqAgwqAweDYzLCAweDI3LCAweEZE LCAweDlCLCAweEQ5LCAweEZDLCAweEQ1LCAweDg3LDxicj4NCivCoCDCoCDCoCDCoDB4OEQsIDB4 NEMsIDB4QjYsIDB4QTQsIDB4Q0IsIDB4RTcsIDB4NzQsIDB4NTUsPGJyPg0KK8KgIMKgIMKgIMKg MHhGNCwgMHhGQiwgMHg0MSwgMHgyNSwgMHhCNSwgMHg0QiwgMHgwQSwgMHgxQiw8YnI+DQorwqAg wqAgwqAgwqAweEIxLCAweEQ2LCAweEI3LCAweEQ5LCAweDQ3LCAweDJBLCAweEMzLCAweDk4LDxi cj4NCivCoCDCoCDCoCDCoDB4NkEsIDB4QzQsIDB4MDMsIDB4NzMsIDB4MUYsIDB4OTMsIDB4NkUs IDB4NTMsPGJyPg0KK8KgIMKgIMKgIMKgMHgxOSwgMHgyNSwgMHg2NCwgMHgxNSwgMHg4MywgMHhG OSwgMHg3MywgMHgyQSw8YnI+DQorwqAgwqAgwqAgwqAweDc0LCAweEI0LCAweDkzLCAweDY5LCAw eEM0LCAweDcyLCAweEZDLCAweDI2LDxicj4NCivCoCDCoCDCoCDCoDB4QTIsIDB4OUYsIDB4NDMs IDB4NDUsIDB4REQsIDB4QjksIDB4RUYsIDB4MzYsPGJyPg0KK8KgIMKgIMKgIMKgMHhDOCwgMHgz QSwgMHhDRCwgMHg5OSwgMHg5QiwgMHg1NCwgMHgxQSwgMHgzNiw8YnI+DQorwqAgwqAgwqAgwqAw eEMxLCAweDU5LCAweEY4LCAweDk4LCAweEE4LCAweENDLCAweDI4LCAweDBELDxicj4NCivCoCDC oCDCoCDCoDB4NzMsIDB4NEMsIDB4RUUsIDB4OTgsIDB4Q0IsIDB4N0MsIDB4NTgsIDB4N0UsPGJy Pg0KK8KgIMKgIMKgIMKgMHgyMCwgMHg3NSwgMHgxRSwgMHhCNywgMHhDOSwgMHhGOCwgMHhGMiwg MHgwRSw8YnI+DQorwqAgwqAgwqAgwqAweDYzLCAweDlFLCAweDA1LCAweDc4LCAweDFBLCAweEI2 LCAweEE4LCAweDdBLDxicj4NCivCoCDCoCDCoCDCoDB4RjksIDB4OTgsIDB4NkEsIDB4QTYsIDB4 NDYsIDB4ODQsIDB4MkUsIDB4RjYsPGJyPg0KK8KgIMKgIMKgIMKgMHg0QiwgMHhEQywgMHg5Qiwg MHg4RiwgMHg5QiwgMHg4RiwgMHhFRSwgMHhCNCw8YnI+DQorwqAgwqAgwqAgwqAweEFBLCAweDNG LCAweEVFLCAweEMwLCAweDM3LCAweDI3LCAweDc2LCAweEM3LDxicj4NCivCoCDCoCDCoCDCoDB4 OTUsIDB4QkIsIDB4MjYsIDB4NzQsIDB4NjksIDB4MTIsIDB4N0YsIDB4RjEsPGJyPg0KK8KgIMKg IMKgIMKgMHhCQiwgMHhGRiwgMHhBRSwgMHhCNSwgMHg5OSwgMHg2RSwgMHhDQiwgMHgwQzxicj4N Cit9Ozxicj4NCis8YnI+DQorc3RhdGljIGNvbnN0IHVpbnQ4X3QgY2F0Y2hfMjJfcXVvdGVfMl81 MTJfYnl0ZXNfQUVTX0NCQ19ITUFDX1NIQTFfZGlnZXN0W10gPSB7PGJyPg0KK8KgIMKgIMKgIMKg MHg5YSwgMHg0ZiwgMHg4OCwgMHgxYiwgMHhiNiwgMHg4ZiwgMHhkOCwgMHg2MCw8YnI+DQorwqAg wqAgwqAgwqAweDQyLCAweDFhLCAweDdkLCAweDNkLCAweGY1LCAweDgyLCAweDgwLCAweGYxLDxi cj4NCivCoCDCoCDCoCDCoDB4MTgsIDB4OGMsIDB4MWQsIDB4MzI8YnI+DQorfTs8YnI+DQorPGJy Pg0KwqAvKiB0ZXN0IHZlY3RvcnMgKi88YnI+DQrCoHN0YXRpYyBjb25zdCB1aW50OF90IHBsYWlu dGV4dF9hZXMxMjhjdHJbXSA9IHs8YnI+DQrCoCDCoCDCoCDCoCAweDZCLCAweEMxLCAweEJFLCAw eEUyLCAweDJFLCAweDQwLCAweDlGLCAweDk2LDxicj4NCmRpZmYgLS1naXQgYS9hcHAvdGVzdC90 ZXN0X2NyeXB0b2Rldl9ibG9ja2NpcGhlci5jIGIvYXBwL3Rlc3QvdGVzdF9jcnlwdG9kZXZfYmxv Y2tjaXBoZXIuYzxicj4NCmluZGV4IDg3YTMyMWZhYzMuLmY3YTM1ZjU5YjkgMTAwNjQ0PGJyPg0K LS0tIGEvYXBwL3Rlc3QvdGVzdF9jcnlwdG9kZXZfYmxvY2tjaXBoZXIuYzxicj4NCisrKyBiL2Fw cC90ZXN0L3Rlc3RfY3J5cHRvZGV2X2Jsb2NrY2lwaGVyLmM8YnI+DQpAQCAtODM0LDEwICs4MzQs MTAgQEAgYmxvY2tjaXBoZXJfdGVzdF9jYXNlX3J1bihjb25zdCB2b2lkICpkYXRhKTxicj4NCsKg IMKgIMKgIMKgIGNoYXIgdGVzdF9tc2dbQkxPQ0tDSVBIRVJfVEVTVF9NU0dfTEVOICsgMV07PGJy Pg0KPGJyPg0KwqAgwqAgwqAgwqAgc3RhdHVzID0gdGVzdF9ibG9ja2NpcGhlcl9vbmVfY2FzZSh0 Y19kYXRhLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHBfdGVzdHN1 aXRlX3BhcmFtcy0mZ3Q7bWJ1Zl9wb29sLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoHBfdGVzdHN1aXRlX3BhcmFtcy0mZ3Q7b3BfbXBvb2wsPGJyPg0KLcKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcF90ZXN0c3VpdGVfcGFyYW1zLSZndDtzZXNzaW9u X21wb29sLDxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHBfdGVzdHN1 aXRlX3BhcmFtcy0mZ3Q7dmFsaWRfZGV2c1swXSw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqBwX3RzX3BhcmFtcy0mZ3Q7bWJ1Zl9wb29sLDxicj4NCivCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHBfdHNfcGFyYW1zLSZndDtvcF9tcG9vbCw8YnI+DQor wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBwX3RzX3BhcmFtcy0mZ3Q7c2Vzc2lv bl9tcG9vbCw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBwX3RzX3Bh cmFtcy0mZ3Q7dmFsaWRfZGV2c1swXSw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCB0ZXN0X21zZyk7PGJyPg0KwqAgwqAgwqAgwqAgcmV0dXJuIHN0YXR1czs8YnI+DQrC oH08YnI+DQpAQCAtODQ1LDcgKzg0NSw3IEBAIGJsb2NrY2lwaGVyX3Rlc3RfY2FzZV9ydW4oY29u c3Qgdm9pZCAqZGF0YSk8YnI+DQrCoHN0YXRpYyBpbnQ8YnI+DQrCoGFlc19jaGFpbl9zZXR1cCh2 b2lkKTxicj4NCsKgezxicj4NCi3CoCDCoCDCoCDCoHVpbnQ4X3QgZGV2X2lkID0gcF90ZXN0c3Vp dGVfcGFyYW1zLSZndDt2YWxpZF9kZXZzWzBdOzxicj4NCivCoCDCoCDCoCDCoHVpbnQ4X3QgZGV2 X2lkID0gcF90c19wYXJhbXMtJmd0O3ZhbGlkX2RldnNbMF07PGJyPg0KwqAgwqAgwqAgwqAgc3Ry dWN0IHJ0ZV9jcnlwdG9kZXZfaW5mbyBkZXZfaW5mbzs8YnI+DQrCoCDCoCDCoCDCoCB1aW50NjRf dCBmZWF0X2ZsYWdzOzxicj4NCsKgIMKgIMKgIMKgIGNvbnN0IGVudW0gcnRlX2NyeXB0b19jaXBo ZXJfYWxnb3JpdGhtIGNpcGhlcnNbXSA9IHs8YnI+DQpAQCAtODg4LDcgKzg4OCw3IEBAIGFlc19j aGFpbl9zZXR1cCh2b2lkKTxicj4NCsKgc3RhdGljIGludDxicj4NCsKgYWVzX2NpcGhlcm9ubHlf c2V0dXAodm9pZCk8YnI+DQrCoHs8YnI+DQotwqAgwqAgwqAgwqB1aW50OF90IGRldl9pZCA9IHBf dGVzdHN1aXRlX3BhcmFtcy0mZ3Q7dmFsaWRfZGV2c1swXTs8YnI+DQorwqAgwqAgwqAgwqB1aW50 OF90IGRldl9pZCA9IHBfdHNfcGFyYW1zLSZndDt2YWxpZF9kZXZzWzBdOzxicj4NCsKgIMKgIMKg IMKgIHN0cnVjdCBydGVfY3J5cHRvZGV2X2luZm8gZGV2X2luZm87PGJyPg0KwqAgwqAgwqAgwqAg dWludDY0X3QgZmVhdF9mbGFnczs8YnI+DQrCoCDCoCDCoCDCoCBjb25zdCBlbnVtIHJ0ZV9jcnlw dG9fY2lwaGVyX2FsZ29yaXRobSBjaXBoZXJzW10gPSB7PGJyPg0KQEAgLTkyOSw3ICs5MjksNyBA QCBhZXNfY2lwaGVyb25seV9zZXR1cCh2b2lkKTxicj4NCsKgc3RhdGljIGludDxicj4NCsKgYWVz X2RvY3Npc19zZXR1cCh2b2lkKTxicj4NCsKgezxicj4NCi3CoCDCoCDCoCDCoHVpbnQ4X3QgZGV2 X2lkID0gcF90ZXN0c3VpdGVfcGFyYW1zLSZndDt2YWxpZF9kZXZzWzBdOzxicj4NCivCoCDCoCDC oCDCoHVpbnQ4X3QgZGV2X2lkID0gcF90c19wYXJhbXMtJmd0O3ZhbGlkX2RldnNbMF07PGJyPg0K wqAgwqAgwqAgwqAgc3RydWN0IHJ0ZV9jcnlwdG9kZXZfaW5mbyBkZXZfaW5mbzs8YnI+DQrCoCDC oCDCoCDCoCB1aW50NjRfdCBmZWF0X2ZsYWdzOzxicj4NCsKgIMKgIMKgIMKgIGNvbnN0IGVudW0g cnRlX2NyeXB0b19jaXBoZXJfYWxnb3JpdGhtIGNpcGhlcnNbXSA9IHs8YnI+DQpAQCAtOTU5LDcg Kzk1OSw3IEBAIGFlc19kb2NzaXNfc2V0dXAodm9pZCk8YnI+DQrCoHN0YXRpYyBpbnQ8YnI+DQrC oHRyaXBsZV9kZXNfY2hhaW5fc2V0dXAodm9pZCk8YnI+DQrCoHs8YnI+DQotwqAgwqAgwqAgwqB1 aW50OF90IGRldl9pZCA9IHBfdGVzdHN1aXRlX3BhcmFtcy0mZ3Q7dmFsaWRfZGV2c1swXTs8YnI+ DQorwqAgwqAgwqAgwqB1aW50OF90IGRldl9pZCA9IHBfdHNfcGFyYW1zLSZndDt2YWxpZF9kZXZz WzBdOzxicj4NCsKgIMKgIMKgIMKgIHN0cnVjdCBydGVfY3J5cHRvZGV2X2luZm8gZGV2X2luZm87 PGJyPg0KwqAgwqAgwqAgwqAgdWludDY0X3QgZmVhdF9mbGFnczs8YnI+DQrCoCDCoCDCoCDCoCBj b25zdCBlbnVtIHJ0ZV9jcnlwdG9fY2lwaGVyX2FsZ29yaXRobSBjaXBoZXJzW10gPSB7PGJyPg0K QEAgLTk5Niw3ICs5OTYsNyBAQCB0cmlwbGVfZGVzX2NoYWluX3NldHVwKHZvaWQpPGJyPg0KwqBz dGF0aWMgaW50PGJyPg0KwqB0cmlwbGVfZGVzX2NpcGhlcm9ubHlfc2V0dXAodm9pZCk8YnI+DQrC oHs8YnI+DQotwqAgwqAgwqAgwqB1aW50OF90IGRldl9pZCA9IHBfdGVzdHN1aXRlX3BhcmFtcy0m Z3Q7dmFsaWRfZGV2c1swXTs8YnI+DQorwqAgwqAgwqAgwqB1aW50OF90IGRldl9pZCA9IHBfdHNf cGFyYW1zLSZndDt2YWxpZF9kZXZzWzBdOzxicj4NCsKgIMKgIMKgIMKgIHN0cnVjdCBydGVfY3J5 cHRvZGV2X2luZm8gZGV2X2luZm87PGJyPg0KwqAgwqAgwqAgwqAgdWludDY0X3QgZmVhdF9mbGFn czs8YnI+DQrCoCDCoCDCoCDCoCBjb25zdCBlbnVtIHJ0ZV9jcnlwdG9fY2lwaGVyX2FsZ29yaXRo bSBjaXBoZXJzW10gPSB7PGJyPg0KQEAgLTEwMjcsNyArMTAyNyw3IEBAIHRyaXBsZV9kZXNfY2lw aGVyb25seV9zZXR1cCh2b2lkKTxicj4NCsKgc3RhdGljIGludDxicj4NCsKgZGVzX2NpcGhlcm9u bHlfc2V0dXAodm9pZCk8YnI+DQrCoHs8YnI+DQotwqAgwqAgwqAgwqB1aW50OF90IGRldl9pZCA9 IHBfdGVzdHN1aXRlX3BhcmFtcy0mZ3Q7dmFsaWRfZGV2c1swXTs8YnI+DQorwqAgwqAgwqAgwqB1 aW50OF90IGRldl9pZCA9IHBfdHNfcGFyYW1zLSZndDt2YWxpZF9kZXZzWzBdOzxicj4NCsKgIMKg IMKgIMKgIHN0cnVjdCBydGVfY3J5cHRvZGV2X2luZm8gZGV2X2luZm87PGJyPg0KwqAgwqAgwqAg wqAgdWludDY0X3QgZmVhdF9mbGFnczs8YnI+DQrCoCDCoCDCoCDCoCBjb25zdCBlbnVtIHJ0ZV9j cnlwdG9fY2lwaGVyX2FsZ29yaXRobSBjaXBoZXJzW10gPSB7PGJyPg0KQEAgLTEwNTcsNyArMTA1 Nyw3IEBAIGRlc19jaXBoZXJvbmx5X3NldHVwKHZvaWQpPGJyPg0KwqBzdGF0aWMgaW50PGJyPg0K wqBkZXNfZG9jc2lzX3NldHVwKHZvaWQpPGJyPg0KwqB7PGJyPg0KLcKgIMKgIMKgIMKgdWludDhf dCBkZXZfaWQgPSBwX3Rlc3RzdWl0ZV9wYXJhbXMtJmd0O3ZhbGlkX2RldnNbMF07PGJyPg0KK8Kg IMKgIMKgIMKgdWludDhfdCBkZXZfaWQgPSBwX3RzX3BhcmFtcy0mZ3Q7dmFsaWRfZGV2c1swXTs8 YnI+DQrCoCDCoCDCoCDCoCBzdHJ1Y3QgcnRlX2NyeXB0b2Rldl9pbmZvIGRldl9pbmZvOzxicj4N CsKgIMKgIMKgIMKgIHVpbnQ2NF90IGZlYXRfZmxhZ3M7PGJyPg0KwqAgwqAgwqAgwqAgY29uc3Qg ZW51bSBydGVfY3J5cHRvX2NpcGhlcl9hbGdvcml0aG0gY2lwaGVyc1tdID0gezxicj4NCkBAIC0x MDg3LDcgKzEwODcsNyBAQCBkZXNfZG9jc2lzX3NldHVwKHZvaWQpPGJyPg0KwqBzdGF0aWMgaW50 PGJyPg0KwqBhdXRob25seV9zZXR1cCh2b2lkKTxicj4NCsKgezxicj4NCi3CoCDCoCDCoCDCoHVp bnQ4X3QgZGV2X2lkID0gcF90ZXN0c3VpdGVfcGFyYW1zLSZndDt2YWxpZF9kZXZzWzBdOzxicj4N CivCoCDCoCDCoCDCoHVpbnQ4X3QgZGV2X2lkID0gcF90c19wYXJhbXMtJmd0O3ZhbGlkX2RldnNb MF07PGJyPg0KwqAgwqAgwqAgwqAgc3RydWN0IHJ0ZV9jcnlwdG9kZXZfaW5mbyBkZXZfaW5mbzs8 YnI+DQrCoCDCoCDCoCDCoCB1aW50NjRfdCBmZWF0X2ZsYWdzOzxicj4NCsKgIMKgIMKgIMKgIGNv bnN0IGVudW0gcnRlX2NyeXB0b19hdXRoX2FsZ29yaXRobSBhdXRoc1tdID0gezxicj4NCkBAIC0x MTMxLDcgKzExMzEsNyBAQCBhdXRob25seV9zZXR1cCh2b2lkKTxicj4NCsKgc3RhdGljIGludDxi cj4NCsKgc200X2NoYWluX3NldHVwKHZvaWQpPGJyPg0KwqB7PGJyPg0KLcKgIMKgIMKgIMKgdWlu dDhfdCBkZXZfaWQgPSBwX3Rlc3RzdWl0ZV9wYXJhbXMtJmd0O3ZhbGlkX2RldnNbMF07PGJyPg0K K8KgIMKgIMKgIMKgdWludDhfdCBkZXZfaWQgPSBwX3RzX3BhcmFtcy0mZ3Q7dmFsaWRfZGV2c1sw XTs8YnI+DQrCoCDCoCDCoCDCoCBzdHJ1Y3QgcnRlX2NyeXB0b2Rldl9pbmZvIGRldl9pbmZvOzxi cj4NCsKgIMKgIMKgIMKgIHVpbnQ2NF90IGZlYXRfZmxhZ3M7PGJyPg0KwqAgwqAgwqAgwqAgY29u c3QgZW51bSBydGVfY3J5cHRvX2NpcGhlcl9hbGdvcml0aG0gY2lwaGVyc1tdID0gezxicj4NCkBA IC0xMTY3LDcgKzExNjcsNyBAQCBzbTRfY2hhaW5fc2V0dXAodm9pZCk8YnI+DQrCoHN0YXRpYyBp bnQ8YnI+DQrCoHNtNF9jaXBoZXJvbmx5X3NldHVwKHZvaWQpPGJyPg0KwqB7PGJyPg0KLcKgIMKg IMKgIMKgdWludDhfdCBkZXZfaWQgPSBwX3Rlc3RzdWl0ZV9wYXJhbXMtJmd0O3ZhbGlkX2RldnNb MF07PGJyPg0KK8KgIMKgIMKgIMKgdWludDhfdCBkZXZfaWQgPSBwX3RzX3BhcmFtcy0mZ3Q7dmFs aWRfZGV2c1swXTs8YnI+DQrCoCDCoCDCoCDCoCBzdHJ1Y3QgcnRlX2NyeXB0b2Rldl9pbmZvIGRl dl9pbmZvOzxicj4NCsKgIMKgIMKgIMKgIHVpbnQ2NF90IGZlYXRfZmxhZ3M7PGJyPg0KwqAgwqAg wqAgwqAgY29uc3QgZW51bSBydGVfY3J5cHRvX2NpcGhlcl9hbGdvcml0aG0gY2lwaGVyc1tdID0g ezxicj4NCmRpZmYgLS1naXQgYS9hcHAvdGVzdC90ZXN0X2NyeXB0b2Rldl9obWFjX3Rlc3RfdmVj dG9ycy5oIGIvYXBwL3Rlc3QvdGVzdF9jcnlwdG9kZXZfaG1hY190ZXN0X3ZlY3RvcnMuaDxicj4N CmluZGV4IDc3MTUzYTVjMTAuLjg5MWU1ZDcxZmQgMTAwNjQ0PGJyPg0KLS0tIGEvYXBwL3Rlc3Qv dGVzdF9jcnlwdG9kZXZfaG1hY190ZXN0X3ZlY3RvcnMuaDxicj4NCisrKyBiL2FwcC90ZXN0L3Rl c3RfY3J5cHRvZGV2X2htYWNfdGVzdF92ZWN0b3JzLmg8YnI+DQpAQCAtNSw2ICs1LDgxIEBAPGJy Pg0KwqAjaWZuZGVmIEFQUF9URVNUX1RFU1RfQ1JZUFRPREVWX0hNQUNfVEVTVF9WRUNUT1JTX0hf PGJyPg0KwqAjZGVmaW5lIEFQUF9URVNUX1RFU1RfQ1JZUFRPREVWX0hNQUNfVEVTVF9WRUNUT1JT X0hfPGJyPg0KPGJyPg0KKyNkZWZpbmUgSE1BQ19LRVlfTEVOR1RIX1NIQTHCoCDCoChESUdFU1Rf QllURV9MRU5HVEhfU0hBMSk8YnI+DQorPGJyPg0KK3N0YXRpYyB1aW50OF90IGhtYWNfc2hhMV9r ZXlbXSA9IHs8YnI+DQorwqAgwqAgwqAgwqAweEY4LCAweDJBLCAweEM3LCAweDU0LCAweERCLCAw eDk2LCAweDE4LCAweEFBLDxicj4NCivCoCDCoCDCoCDCoDB4QzMsIDB4QTEsIDB4NTMsIDB4RjYs IDB4MUYsIDB4MTcsIDB4NjAsIDB4QkQsPGJyPg0KK8KgIMKgIMKgIMKgMHhERSwgMHhGNCwgMHhE RSwgMHhBRCB9Ozxicj4NCis8YnI+DQorI2RlZmluZSBITUFDX0tFWV9MRU5HVEhfU0hBMjI0IChE SUdFU1RfQllURV9MRU5HVEhfU0hBMjI0KTxicj4NCis8YnI+DQorc3RhdGljwqAgdWludDhfdCBt c19obWFjX2tleTBbXSA9IHs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAweEZGLCAweDFB LCAweDdELCAweDNELCAweEY1LCAweDgyLCAweDgwLCAweEYxLDxicj4NCivCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoDB4RjEsIDB4MzUsIDB4NUMsIDB4M0IsIDB4REQsIDB4OUEsIDB4NjUsIDB4QkEs PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgMHg1OCwgMHgzNCwgMHg4NSwgMHg2NSwgMHgx QywgMHg0MiwgMHg1MCwgMHg3Niw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAweDlBLCAw eEFGLCAweDg4LCAweDFCLCAweEI2LCAweDhGLCAweEY4LCAweDYwLDxicj4NCivCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoDB4QTIsIDB4NUEsIDB4N0YsIDB4M0YsIDB4RjQsIDB4NzIsIDB4NzAsIDB4 RjEsPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgMHhGNSwgMHgzNSwgMHg0QywgMHgzQiwg MHhERCwgMHg5MCwgMHg2NSwgMHhCMCw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAweDQ3 LCAweDNBLCAweDc1LCAweDYxLCAweDVDLCAweEEyLCAweDEwLCAweDc2LDxicj4NCivCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoDB4OUEsIDB4QUYsIDB4NzcsIDB4NUIsIDB4QjYsIDB4N0YsIDB4Rjcs IDB4NjA8YnI+DQorfTs8YnI+DQorPGJyPg0KK3N0YXRpYyBjb25zdCB1aW50OF90IG1zX2htYWNf ZGlnZXN0MFtdID0gezxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDB4NDMsIDB4NTIsIDB4 RUQsIDB4MzQsIDB4QUIsIDB4MzYsIDB4QjIsIDB4NTEsPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKg IMKgIMKgMHhGQiwgMHhBMywgMHhBNiwgMHg3QywgMHgzOCwgMHhGQywgMHg0MiwgMHg4Riw8YnI+ DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAweDU3LCAweDY0LCAweEFCLCAweDgxLCAweEE3LCAw eDg5LCAweEI3LCAweDZDLDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDB4QTAsIDB4REMs IDB4QjksIDB4NEQsIDB4QzQsIDB4MzAsIDB4RjksIDB4RDQsPGJyPg0KK8KgIMKgIMKgIMKgIMKg IMKgIMKgIMKgMHgxMCwgMHg4MiwgMHg1NSwgMHhEMCwgMHhBQiwgMHgzMiwgMHhGQiwgMHg1Niw8 YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAweDBELCAweEU0LCAweDY4LCAweDNELCAweDc2 LCAweEQwLCAweDdCLCAweEU0LDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDB4QTYsIDB4 MkMsIDB4MzQsIDB4OUUsIDB4OEMsIDB4NDEsIDB4RjgsIDB4MjMsPGJyPg0KK8KgIMKgIMKgIMKg IMKgIMKgIMKgIMKgMHgyOCwgMHgxQiwgMHgzQSwgMHg5MCwgMHgyNiwgMHgzNCwgMHg0NywgMHg5 MDxicj4NCit9Ozxicj4NCis8YnI+DQorc3RhdGljIHVpbnQ4X3QgbXNfaG1hY19rZXkxW10gPSB7 PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgMHhGRSwgMHgxQSwgMHg3RCwgMHgzRCwgMHhG NSwgMHg4MiwgMHg4MCwgMHhGMSw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAweEYxLCAw eDM1LCAweDVDLCAweDNCLCAweERELCAweDlBLCAweDY1LCAweEJBLDxicj4NCivCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoDB4NTgsIDB4MzQsIDB4ODUsIDB4NjUsIDB4MUMsIDB4NDIsIDB4NTAsIDB4 NzYsPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgMHg5QSwgMHhBRiwgMHg4OCwgMHgxQiwg MHhCNiwgMHg4RiwgMHhGOCwgMHg2MCw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAweEEy LCAweDVBLCAweDdGLCAweDNGLCAweEY0LCAweDcyLCAweDcwLCAweEYxLDxicj4NCivCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoDB4RjUsIDB4MzUsIDB4NEMsIDB4M0IsIDB4REQsIDB4OTAsIDB4NjUs IDB4QjAsPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgMHg0NywgMHgzQSwgMHg3NSwgMHg2 MSwgMHg1QywgMHhBMiwgMHgxMCwgMHg3Niw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAw eDlBLCAweEFGLCAweDc3LCAweDVCLCAweEI2LCAweDdGLCAweEY3LCAweDYwPGJyPg0KK307PGJy Pg0KKzxicj4NCitzdGF0aWMgY29uc3QgdWludDhfdCBtc19obWFjX2RpZ2VzdDFbXSA9IHs8YnI+ DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAweENFLCAweDZFLCAweDVGLCAweDc3LCAweDk2LCAw eDlBLCAweEIxLCAweDY5LDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDB4MkQsIDB4NUUs IDB4RjMsIDB4MkYsIDB4MzIsIDB4MTAsIDB4Q0IsIDB4NTAsPGJyPg0KK8KgIMKgIMKgIMKgIMKg IMKgIMKgIMKgMHgwRSwgMHgwOSwgMHg1NiwgMHgyNSwgMHgwNywgMHgzNCwgMHhDOSwgMHgyMCw8 YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAweEVDLCAweDEzLCAweDQzLCAweDIzLCAweDVD LCAweDA4LCAweDhCLCAweENELDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDB4REMsIDB4 ODYsIDB4OEMsIDB4RUUsIDB4MEEsIDB4OTUsIDB4MkUsIDB4QjksPGJyPg0KK8KgIMKgIMKgIMKg IMKgIMKgIMKgIMKgMHg4QywgMHg3QiwgMHgwMiwgMHg3QSwgMHhENCwgMHhFMSwgMHg0OSwgMHhC NCw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAweDQ1LCAweEI1LCAweDUyLCAweDM3LCAw eEM2LCAweEZGLCAweEZFLCAweEFBLDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDB4MEEs IDB4ODcsIDB4QjgsIDB4NTEsIDB4RjksIDB4MkEsIDB4MDEsIDB4OEY8YnI+DQorfTs8YnI+DQor PGJyPg0KK3N0YXRpY8KgIHVpbnQ4X3QgbXNfaG1hY19rZXkyW10gPSB7PGJyPg0KK8KgIMKgIMKg IMKgIMKgIMKgIMKgIMKgMHhGQywgMHgxQSwgMHg3RCwgMHgzRCwgMHhGNSwgMHg4MiwgMHg4MCwg MHhGMSw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAweEYxLCAweDM1LCAweDVDLCAweDNC LCAweERELCAweDlBLCAweDY1LCAweEJBLDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDB4 NTgsIDB4MzQsIDB4ODUsIDB4NjUsIDB4MUMsIDB4NDIsIDB4NTAsIDB4NzYsPGJyPg0KK8KgIMKg IMKgIMKgIMKgIMKgIMKgIMKgMHg5QSwgMHhBRiwgMHg4OCwgMHgxQiwgMHhCNiwgMHg4RiwgMHhG OCwgMHg2MCw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAweEEyLCAweDVBLCAweDdGLCAw eDNGLCAweEY0LCAweDcyLCAweDcwLCAweEYxLDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oDB4RjUsIDB4MzUsIDB4NEMsIDB4M0IsIDB4REQsIDB4OTAsIDB4NjUsIDB4QjAsPGJyPg0KK8Kg IMKgIMKgIMKgIMKgIMKgIMKgIMKgMHg0NywgMHgzQSwgMHg3NSwgMHg2MSwgMHg1QywgMHhBMiwg MHgxMCwgMHg3Niw8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAweDlBLCAweEFGLCAweDc3 LCAweDVCLCAweEI2LCAweDdGLCAweEY3LCAweDYwPGJyPg0KK307PGJyPg0KKzxicj4NCitzdGF0 aWMgY29uc3QgdWludDhfdCBtc19obWFjX2RpZ2VzdDJbXSA9IHs8YnI+DQorwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAweEE1LCAweDBGLCAweDlDLCAweEZCLCAweDA4LCAweDYyLCAweDU5LCAweEZG LDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDB4ODAsIDB4MkYsIDB4RUIsIDB4NEIsIDB4 RTEsIDB4NDYsIDB4MjEsIDB4RDYsPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgMHgwMiwg MHg5OCwgMHhGMiwgMHg4RSwgMHhGNCwgMHhFQywgMHhENCwgMHg3Nyw8YnI+DQorwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAweDg2LCAweDRDLCAweDMxLCAweDI4LCAweEM4LCAweDI1LCAweDgwLCAw eDI3LDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDB4M0EsIDB4NzIsIDB4NUQsIDB4NkEs IDB4NTYsIDB4OEEsIDB4RDMsIDB4ODIsPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgMHhC MCwgMHhFQywgMHgzMSwgMHg2RCwgMHg4QiwgMHg2QiwgMHhCNCwgMHgyNCw8YnI+DQorwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAweEU3LCAweDYyLCAweEMxLCAweDUyLCAweEJDLCAweDE0LCAweDFC LCAweDhFLDxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDB4RUMsIDB4OUEsIDB4RjEsIDB4 NDcsIDB4ODAsIDB4RDIsIDB4QjAsIDB4NTk8YnI+DQorfTs8YnI+DQorPGJyPg0KwqAvKiAqKiog TUQ1IHRlc3QgdmVjdG9ycyAqKiogKi88YnI+DQo8YnI+DQrCoCNkZWZpbmUgTUQ1X0RJR0VTVF9M RU4gMTY8YnI+DQotLSA8YnI+DQoyLjEzLjY8YnI+DQo8YnI+DQo8L2Jsb2NrcXVvdGU+PC9kaXY+ DQo= --000000000000fdef810623085e6f--