Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1qbdhZ-00Cce1-4u for pgsql-hackers@arkaria.postgresql.org; Thu, 31 Aug 2023 09:10:57 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1qbdhX-005NrA-Vb for pgsql-hackers@arkaria.postgresql.org; Thu, 31 Aug 2023 09:10:55 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1qbdhX-005Nqj-8g for pgsql-hackers@lists.postgresql.org; Thu, 31 Aug 2023 09:10:55 +0000 Received: from mail-oa1-x33.google.com ([2001:4860:4864:20::33]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1qbdhU-001wKE-Cs for pgsql-hackers@postgresql.org; Thu, 31 Aug 2023 09:10:53 +0000 Received: by mail-oa1-x33.google.com with SMTP id 586e51a60fabf-1c8e9d75ce1so279147fac.3 for ; Thu, 31 Aug 2023 02:10:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1693473051; x=1694077851; darn=postgresql.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=r9lJWd+d/N5NWZ8aYFRGwECLyx+m127Y5M/yb5yi+Xs=; b=NiOiLFScAg95bIn2LXtgNJqOwIsgobtcdu+QmQXGUtpIUPQu4pY63pBTd9fRT9ZWKP mC9OwH8Cw7wwD5PfK4zFsFP4JEh4j4NhMxmih1bm11kbMB13kqtKqfMYeTTB1ednWZPY 4fxYxXVTxhZ0mK4Eu6pfS9M65DgBZADhilyAqxVoIj/nI7TxF25UDKa/dfb75+Dy6JNY Buin4hrm4E8Szesr/CMFAawJn7qLdODLmoT8IL1ogMGvBspLMyx+y0Nj1NRujLvRMAux PdZHimzTJvnKoQuSZrAblDUgsLn4yT8xExbAVsHgtEqL8juZxr6Wr7PYPc7jMfRyeSnt szxw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1693473051; x=1694077851; 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=r9lJWd+d/N5NWZ8aYFRGwECLyx+m127Y5M/yb5yi+Xs=; b=XuJnEBRL7sZ3a8R7zS6SXxub8vAoYS5eFB4cSgBbPJozYn0yqp17tL+1rX8Tmy4B6m w6dSgxxdGcvTFm+ZSiRfC3HzCsTFNkeR/wqevdw+3/P3QZBa4XXj45Tlks0FYqqFHlOW +zJ/vDLUEUaTvYh7+mqW4cOU/bx9GQsp7tRU85db4tKrx/3WCTufUU0nVeN5J6LkSzvS lHUjYD7lL5tyuZpBVedA62txS1yVgXgZ7a+1iqjj2lbaaUB2C2Za6w15xQT05s3WtlDv ioy30nwzidvhYyxdEOOtIUtukOKPTqm8UB+EXm9A9bMFaSX4hraDBARicocel1tj/Kqm jixg== X-Gm-Message-State: AOJu0YyBHGbcpl1s96TCNeGEeq8yE3v1ZFn5dBZZNLZb5hABtuIcuklj qoiRTduukhFWEU/xF/1pkCBmvFrLTFnxwuhopeLfdvwJ8gc= X-Google-Smtp-Source: AGHT+IFH8xMewryu+CYMHsCjmDAciHZ+muynPJkrERzSKDPOHvj6F8074dXQF5AqKDy7VnH+TTo8dp8DwgY+oshnYIc= X-Received: by 2002:a05:6870:73c9:b0:1bf:1d31:9c9f with SMTP id a9-20020a05687073c900b001bf1d319c9fmr5279530oan.19.1693473051466; Thu, 31 Aug 2023 02:10:51 -0700 (PDT) MIME-Version: 1.0 References: <3507485.1691090027@sss.pgh.pa.us> <900892914fdc3f477b101d699efb40e0@anastigmatix.net> <903341.1692022214@sss.pgh.pa.us> <4b97f1a1dd9b6e45443d24870d3be698@anastigmatix.net> <111272f2dc112c7becdd35ad89f6b935@anastigmatix.net> <5138c6b5fd239e7ce4e1a4e63826ac27@anastigmatix.net> <369543439e988ae43f0a6307500b27c4@anastigmatix.net> <5955e93347a7e3b1612cf7e129ae6d04@anastigmatix.net> In-Reply-To: From: Andy Fan Date: Thu, 31 Aug 2023 17:10:39 +0800 Message-ID: Subject: Re: Extract numeric filed in JSONB more effectively To: Chapman Flack Cc: jian he , Pavel Stehule , Tom Lane , pgsql-hackers Content-Type: multipart/mixed; boundary="000000000000ab77280604346bea" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000ab77280604346bea Content-Type: multipart/alternative; boundary="000000000000ab77260604346be8" --000000000000ab77260604346be8 Content-Type: text/plain; charset="UTF-8" Hi Chap, The v11 attached, mainly changes are: 1. use the jsonb_xx_start and jsonb_finish_numeric style. 2. improve the test case a bit. It doesn't include: 1. the jsonb_finish_text function, since we have a operator ->> for text already and the performance for it is OK and there is no cast entry for jsonb to text. 2. the jsonb_finish_jsonb since I can't see a clear user case for now. Rewriting jsonb_object_field with 2 DirectFunctionCall looks not pretty reasonable as we paid 2 DirectFunctionCall overhead to reduce ~10 lines code duplication. An incompatible issue at error message level is found during test: create table jb(a jsonb); insert into jb select '{"a": "a"}'::jsonb; select (a->'a')::int4 from jb; master: ERROR: cannot cast jsonb string to type *integer* patch: ERROR: cannot cast jsonb string to type *numeric* That's mainly because we first extract the field to numeric and then cast it to int4 and the error raised at the first step and it doesn't know the final type. One way to fix it is adding a 2nd argument for jsonb_finish_numeric for the real type, but it looks weird and more suggestions on this would be good. Performance comparison between v10 and v11. create table tb (a jsonb); insert into tb select '{"a": 1}'::jsonb from generate_series(1, 100000)i; select 1 from tb where (a->'a')::int2 = 2; (pgbench 5 times) v11: 16.273 ms v10: 15.986 ms master: 32.530ms So I think the performance would not be an issue. > I noticed there is another patch registered in this CF: [1] > It adds new operations within jsonpath like .bigint .time > and so on. > > I was wondering whether that work would be conflicting or > complementary with this. It looks to be complementary. The > operations being added there are within jsonpath evaluation. > Here we are working on faster ways to get those results out. > > It does not seem that [1] will add any new choices in > JsonbValue. All of its (.bigint .integer .number) seem to > verify the requested form and then put the result as a > numeric in ->val.numeric. So that doesn't add any new > cases for this patch to handle. (Too bad, in a way: if that > other patch added ->val.bigint, this patch could add a case > to retrieve that value without going through the work of > making a numeric. But that would complicate other things > touching JsonbValue, and be a matter for that other patch.) > > It may be expanding the choices for what we might one day > find in ->val.datetime though. > > Thanks for this information. I tried the jsonb_xx_start and jsonb_finish_numeric style, and it looks like a good experience and it may not make things too complicated even if the above things happen IMO. Any feedback is welcome. -- Best Regards Andy Fan --000000000000ab77260604346be8 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi Chap,

The v11 attached, mainly changes are:
1.=C2=A0 use the js= onb_xx_start and jsonb_finish_numeric style.=C2=A0
2.=C2=A0 impro= ve the test case a bit.=C2=A0=C2=A0

It doesn't= include:
1.=C2=A0 the jsonb_finish_text function, since we have = a operator ->> for text
already and the performance for= it is OK and there is no cast entry for
jsonb to text.=C2=A0
2.=C2=A0 the jsonb_finish_jsonb since I can't see a clear user c= ase for now.=C2=A0
Rewriting jsonb_object_field with 2 DirectFunc= tionCall looks not pretty
reasonable as we paid=C2=A02 DirectFunc= tionCall overhead to reduce ~10 lines
code duplication.=C2=A0


An incompatible issue at error message= level is found during test:=C2=A0
create table jb(a jsonb);
<= /div>
insert into jb select '{"a": "a"}'::j= sonb;
select (a->'a')::int4 from jb;

master:=C2=A0 =C2=A0ERROR: = =C2=A0cannot cast jsonb string to type integer
patch:=C2=A0 ERROR: =C2=A0cannot cast jsonb string to type numeric

That's mainly because we first extract the f= ield to numeric and
then cast it to int4 and the error raised= at the first step and it
doesn't know the final type.=C2=A0 = One way to fix it is adding a 2nd
argument for=C2=A0jsonb_finish_= numeric for the real type, but
it looks weird=C2=A0and more sugge= stions on this would be good.=C2=A0

Performance co= mparison between v10 and v11.=C2=A0

create table t= b (a jsonb);
insert into tb select '{"a": 1}'::jsonb f= rom generate_series(1, 100000)i;
select 1 from tb where (a-&g= t;'a')::int2 =3D 2;=C2=A0 =C2=A0(pgbench 5 times)

v11:=C2=A0=C2=A016.273 ms=C2=A0
v10:=C2=A0=C2=A0
So I think the performance would not be an iss= ue.=C2=A0=C2=A0


I noticed there is another patch registered in this CF: [1]
It adds new operations within jsonpath like .bigint .time
and so on.

I was wondering whether that work would be conflicting or
complementary with this. It looks to be complementary. The
operations being added there are within jsonpath evaluation.
Here we are working on faster ways to get those results out.

It does not seem that [1] will add any new choices in
JsonbValue. All of its (.bigint .integer .number) seem to
verify the requested form and then put the result as a
numeric in ->val.numeric. So that doesn't add any new
cases for this patch to handle. (Too bad, in a way: if that
other patch added ->val.bigint, this patch could add a case
to retrieve that value without going through the work of
making a numeric. But that would complicate other things
touching JsonbValue, and be a matter for that other patch.)

It may be expanding the choices for what we might one day
find in ->val.datetime though.

Thanks for this = information. I tried the=C2=A0 jsonb_xx_start and
jsonb_finish_nu= meric style, and it looks like a good experience=C2=A0
and it may= not make things too complicated even if the above=C2=A0
things h= appen IMO.=C2=A0

Any feedback is welcome.= =C2=A0

--
Best Regar= ds
Andy Fan
--000000000000ab77260604346be8-- --000000000000ab77280604346bea Content-Type: application/octet-stream; name="v11-0001-optimize-casting-jsonb-to-a-given-type.patch" Content-Disposition: attachment; filename="v11-0001-optimize-casting-jsonb-to-a-given-type.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_llyy0g5n0 RnJvbSAzM2M5Mzk1NTc0Y2ZhMGU4MDQwZTU2NjYxYWFiZWM0MGQ1YThhYTZiIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbmR5IEZhbiA8emhpaHVpLmZhbjEyMTNAZ21haWwuY29tPgpE YXRlOiBUaHUsIDMxIEF1ZyAyMDIzIDE2OjQ4OjM1ICswODAwClN1YmplY3Q6IFtQQVRDSCB2MTFd IG9wdGltaXplIGNhc3RpbmcganNvbmIgdG8gYSBnaXZlbiB0eXBlLgoKUHJldmlvdXNseSBhZnRl ciB3ZSBnZXQgYSBKc29uYlZhbHVlLCB3ZSBuZWVkIHRvIGNvbnZlcnQgaXQgdG8KSnNvbmIgZmly c3QgdGhlbiBjYXN0IHRoZSBKc29uYiB0byB0aGUgZ2l2ZW4gdHlwZS4gSW4gdGhpcyBwYXRjaCwK d2UgY292ZXJ0IHRoZSBKc29uYlZhbHVlIHRvIHRoZSBkZXNpcmVkIHR5cGUgZGlyZWN0bHkuCi0t LQogc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2pzb25iLmMgICAgICAgfCAxNjkgKysrKysrKysrKysr KysrKysrKysrKysrKysrKwogc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2pzb25mdW5jcy5jICAgfCAx MTQgKysrKysrKysrKysrLS0tLS0tLQogc3JjL2luY2x1ZGUvY2F0YWxvZy9jYXR2ZXJzaW9uLmgg ICAgfCAgIDMgKy0KIHNyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQgICAgIHwgIDM4ICsr KysrLS0KIHNyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvanNvbmIub3V0IHwgIDc4ICsrKysrKysr KysrKy0KIHNyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2pzb25iLnNxbCAgICAgIHwgIDQ4ICsrKysrKyst CiA2IGZpbGVzIGNoYW5nZWQsIDM5OCBpbnNlcnRpb25zKCspLCA1MiBkZWxldGlvbnMoLSkKCmRp ZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9hZHQvanNvbmIuYyBiL3NyYy9iYWNrZW5kL3V0 aWxzL2FkdC9qc29uYi5jCmluZGV4IDk3ODE4NTJiMGNiLi40NDljYjRhMDUyMyAxMDA2NDQKLS0t IGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2pzb25iLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMv YWR0L2pzb25iLmMKQEAgLTE3LDExICsxNywxNSBAQAogI2luY2x1ZGUgImNhdGFsb2cvcGdfcHJv Yy5oIgogI2luY2x1ZGUgImNhdGFsb2cvcGdfdHlwZS5oIgogI2luY2x1ZGUgImZ1bmNhcGkuaCIK KyNpbmNsdWRlICJub2Rlcy9tYWtlZnVuY3MuaCIKKyNpbmNsdWRlICJub2Rlcy9zdXBwb3J0bm9k ZXMuaCIKKyNpbmNsdWRlICJwYXJzZXIvcGFyc2VfY29lcmNlLmgiCiAjaW5jbHVkZSAibGlicHEv cHFmb3JtYXQuaCIKICNpbmNsdWRlICJtaXNjYWRtaW4uaCIKICNpbmNsdWRlICJ1dGlscy9idWls dGlucy5oIgogI2luY2x1ZGUgInV0aWxzL2RhdGUuaCIKICNpbmNsdWRlICJ1dGlscy9kYXRldGlt ZS5oIgorI2luY2x1ZGUgInV0aWxzL2ZtZ3JvaWRzLmgiCiAjaW5jbHVkZSAidXRpbHMvanNvbi5o IgogI2luY2x1ZGUgInV0aWxzL2pzb25iLmgiCiAjaW5jbHVkZSAidXRpbHMvanNvbmZ1bmNzLmgi CkBAIC0yMDM4LDYgKzIwNDIsMTcxIEBAIGNhbm5vdENhc3RKc29uYlZhbHVlKGVudW0gamJ2VHlw ZSB0eXBlLCBjb25zdCBjaGFyICpzcWx0eXBlKQogCWVsb2coRVJST1IsICJ1bmtub3duIGpzb25i IHR5cGU6ICVkIiwgKGludCkgdHlwZSk7CiB9CiAKK3N0YXRpYyBib29sCitqc29uYl9jYXN0X2lz X29wdGltaXplZChPaWQgdGFyZ2V0X3R5cGUpCit7CisJc3dpdGNoKHRhcmdldF90eXBlKQorCXsK KwkJY2FzZSBOVU1FUklDT0lEOgorCQljYXNlIEJPT0xPSUQ6CisJCWNhc2UgSU5UMk9JRDoKKwkJ Y2FzZSBJTlQ0T0lEOgorCQljYXNlIElOVDhPSUQ6CisJCWNhc2UgRkxPQVQ0T0lEOgorCQljYXNl IEZMT0FUOE9JRDoKKwkJCXJldHVybiB0cnVlOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIGZhbHNl OworCX0KK30KKworRGF0dW0KK2pzb25iX2Nhc3Rfc3VwcG9ydChQR19GVU5DVElPTl9BUkdTKQor eworCU5vZGUJICAgKnJhd3JlcSA9IChOb2RlICopIFBHX0dFVEFSR19QT0lOVEVSKDApOworCisJ aWYgKElzQShyYXdyZXEsIFN1cHBvcnRSZXF1ZXN0U2ltcGxpZnkpKQorCXsKKwkJU3VwcG9ydFJl cXVlc3RTaW1wbGlmeSAqcmVxID0gKFN1cHBvcnRSZXF1ZXN0U2ltcGxpZnkgKikgcmF3cmVxOwor CQlGdW5jRXhwcgkqZmV4cHIgPSBwYWxsb2MwKHNpemVvZihGdW5jRXhwcikpOworCQlGdW5jRXhw cgkqanNvbmJfc3RhcnRfZnVuYyA9IE5VTEwsICpqc29uYl9maW5pc2hfZnVuYyA9IE5VTEwsICpm aW5hbF9mdW5jID0gTlVMTDsKKwkJT3BFeHByCQkqb3BleHByOworCQlPaWQJCQluZXdfZnVuY19p ZCA9IEludmFsaWRPaWQ7CisKKwkJbWVtY3B5KGZleHByLCByZXEtPmZjYWxsLCBzaXplb2YoRnVu Y0V4cHIpKTsKKworCQlvcGV4cHIgPSAoT3BFeHByICopIGxpbml0aWFsKGZleHByLT5hcmdzKTsK KworCQlpZiAoIUlzQShvcGV4cHIsIE9wRXhwcikgfHwKKwkJCSFqc29uYl9jYXN0X2lzX29wdGlt aXplZChmZXhwci0+ZnVuY3Jlc3VsdHR5cGUpKQorCQl7CisJCQkvKiBub3QgdGhlIGRlc2lyZWQg cGF0dGVybi4gKi8KKwkJCVBHX1JFVFVSTl9QT0lOVEVSKGZleHByKTsKKwkJfQorCisJCWlmIChv cGV4cHItPm9wZnVuY2lkICA9PSBGX0pTT05CX09CSkVDVF9GSUVMRCkKKwkJCW5ld19mdW5jX2lk ID0gRl9KU09OQl9PQkpFQ1RfRklFTERfU1RBUlQ7CisJCWVsc2UgaWYgKG9wZXhwci0+b3BmdW5j aWQgPT0gRl9KU09OQl9BUlJBWV9FTEVNRU5UKQorCQkJbmV3X2Z1bmNfaWQgPSBGX0pTT05CX0FS UkFZX0VMRU1FTlRfU1RBUlQ7CisJCWVsc2UgaWYgKG9wZXhwci0+b3BmdW5jaWQgPT0gRl9KU09O Ql9FWFRSQUNUX1BBVEgpCisJCQluZXdfZnVuY19pZCA9IEZfSlNPTkJfRVhUUkFDVF9QQVRIX1NU QVJUOworCisJCWlmICghT2lkSXNWYWxpZChuZXdfZnVuY19pZCkpCisJCQlQR19SRVRVUk5fUE9J TlRFUihmZXhwcik7CisKKwkJanNvbmJfc3RhcnRfZnVuYyA9IG1ha2VGdW5jRXhwcihuZXdfZnVu Y19pZCwgSU5URVJOQUxPSUQsIG9wZXhwci0+YXJncywKKwkJCQkJCQkJCQlvcGV4cHItPm9wY29s bGlkLCBvcGV4cHItPmlucHV0Y29sbGlkLAorCQkJCQkJCQkJCUNPRVJDRV9FWFBMSUNJVF9DQUxM KTsKKworCQkvKiByZWxhYmVsIHRoZSBmaXJzdCBhcmd1bWVudHMgYXMgJ2ludGVybmFsJy4gKi8K KwkJbGluaXRpYWwoanNvbmJfc3RhcnRfZnVuYy0+YXJncykgPSBtYWtlUmVsYWJlbFR5cGUobGlu aXRpYWwoanNvbmJfc3RhcnRfZnVuYy0+YXJncyksCisJCQkJCQkJCQkJCQkJCSAgIElOVEVSTkFM T0lELCAwLAorCQkJCQkJCQkJCQkJCQkgICBJbnZhbGlkT2lkLAorCQkJCQkJCQkJCQkJCQkgICBD T0VSQ0VfSU1QTElDSVRfQ0FTVCk7CisJCXN3aXRjaCAoZmV4cHItPmZ1bmNyZXN1bHR0eXBlKQor CQl7CisJCQljYXNlIElOVDJPSUQ6CisJCQljYXNlIElOVDRPSUQ6CisJCQljYXNlIElOVDhPSUQ6 CisJCQljYXNlIEZMT0FUNE9JRDoKKwkJCWNhc2UgRkxPQVQ4T0lEOgorCQkJY2FzZSBOVU1FUklD T0lEOgorCQkJCWpzb25iX2ZpbmlzaF9mdW5jID0gbWFrZUZ1bmNFeHByKEZfSlNPTkJfRklOSVNI X05VTUVSSUMsIE5VTUVSSUNPSUQsCisJCQkJCQkJCQkJCQkgbGlzdF9tYWtlMShqc29uYl9zdGFy dF9mdW5jKSwgb3BleHByLT5vcGNvbGxpZCwKKwkJCQkJCQkJCQkJCSBvcGV4cHItPmlucHV0Y29s bGlkLCBDT0VSQ0VfRVhQTElDSVRfQ0FMTCk7CisKKwkJCQlpZiAoZmV4cHItPmZ1bmNyZXN1bHR0 eXBlICE9IE5VTUVSSUNPSUQpCisJCQkJeworCQkJCQlmaW5hbF9mdW5jID0gKEZ1bmNFeHByICop Y29lcmNlX3R5cGUoTlVMTCwgKE5vZGUgKilqc29uYl9maW5pc2hfZnVuYywgTlVNRVJJQ09JRCwK KwkJCQkJCQkJCQkJCQkJIGZleHByLT5mdW5jcmVzdWx0dHlwZSwgMCwgQ09FUkNJT05fRVhQTElD SVQsCisJCQkJCQkJCQkJCQkJCSBDT0VSQ0VfRVhQTElDSVRfQ0FTVCwgZmV4cHItPmxvY2F0aW9u KTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCQlmaW5hbF9mdW5jID0ganNvbmJfZmluaXNoX2Z1bmM7 CisKKwkJCQlQR19SRVRVUk5fUE9JTlRFUihmaW5hbF9mdW5jKTsKKwkJCWNhc2UgQk9PTE9JRDoK KwkJCQlmaW5hbF9mdW5jID0gbWFrZUZ1bmNFeHByKEZfSlNPTkJfRklOSVNIX0JPT0wsIEJPT0xP SUQsCisJCQkJCQkJCQkJCSAgIGxpc3RfbWFrZTEoanNvbmJfc3RhcnRfZnVuYyksIG9wZXhwci0+ b3Bjb2xsaWQsCisJCQkJCQkJCQkJICBvcGV4cHItPmlucHV0Y29sbGlkLCBDT0VSQ0VfRVhQTElD SVRfQ0FMTCk7CisJCQkJUEdfUkVUVVJOX1BPSU5URVIoZmluYWxfZnVuYyk7CisJCQlkZWZhdWx0 OgorCQkJCVBHX1JFVFVSTl9QT0lOVEVSKGZleHByKTsKKwkJfQorCX0KKworCVBHX1JFVFVSTl9Q T0lOVEVSKE5VTEwpOworfQorCisKK0RhdHVtCitqc29uYl9vYmplY3RfZmllbGRfc3RhcnQoUEdf RlVOQ1RJT05fQVJHUykKK3sKKwlKc29uYgkgICAqamIgPSBQR19HRVRBUkdfSlNPTkJfUCgwKTsK Kwl0ZXh0CSAgICprZXkgPSBQR19HRVRBUkdfVEVYVF9QUCgxKTsKKwlKc29uYlZhbHVlCSp2Owor CUpzb25iVmFsdWUJdmJ1ZjsKKworCWlmICghSkJfUk9PVF9JU19PQkpFQ1QoamIpKQorCQlQR19S RVRVUk5fTlVMTCgpOworCisJdiA9IGdldEtleUpzb25WYWx1ZUZyb21Db250YWluZXIoJmpiLT5y b290LAorCQkJCQkJCQkJIFZBUkRBVEFfQU5ZKGtleSksCisJCQkJCQkJCQkgVkFSU0laRV9BTllf RVhIRFIoa2V5KSwKKwkJCQkJCQkJCSAmdmJ1Zik7CisKKwlpZiAodiA9PSBOVUxMKQorCQlQR19S RVRVUk5fTlVMTCgpOworCisJUEdfUkVUVVJOX1BPSU5URVIodik7Cit9CisKK0RhdHVtCitqc29u Yl9hcnJheV9lbGVtZW50X3N0YXJ0KFBHX0ZVTkNUSU9OX0FSR1MpCit7CisJSnNvbmIJICAgKmpi ID0gUEdfR0VUQVJHX0pTT05CX1AoMCk7CisJaW50CQkJZWxlbWVudCA9IFBHX0dFVEFSR19JTlQz MigxKTsKKwlKc29uYlZhbHVlCSp2OworCisJaWYgKCFKQl9ST09UX0lTX0FSUkFZKGpiKSkKKwkJ UEdfUkVUVVJOX05VTEwoKTsKKworCS8qIEhhbmRsZSBuZWdhdGl2ZSBzdWJzY3JpcHQgKi8KKwlp ZiAoZWxlbWVudCA8IDApCisJeworCQl1aW50MzIJCW5lbGVtZW50cyA9IEpCX1JPT1RfQ09VTlQo amIpOworCisJCWlmICgtZWxlbWVudCA+IG5lbGVtZW50cykKKwkJCVBHX1JFVFVSTl9OVUxMKCk7 CisJCWVsc2UKKwkJCWVsZW1lbnQgKz0gbmVsZW1lbnRzOworCX0KKworCXYgPSBnZXRJdGhKc29u YlZhbHVlRnJvbUNvbnRhaW5lcigmamItPnJvb3QsIGVsZW1lbnQpOworCWlmICh2ID09IE5VTEwp CisJCVBHX1JFVFVSTl9OVUxMKCk7CisKKwlQR19SRVRVUk5fUE9JTlRFUih2KTsKK30KKworRGF0 dW0KK2pzb25iX2ZpbmlzaF9udW1lcmljKFBHX0ZVTkNUSU9OX0FSR1MpCit7CisJSnNvbmJWYWx1 ZQkqdiA9IChKc29uYlZhbHVlICopUEdfR0VUQVJHX1BPSU5URVIoMCk7CisJaWYgKHYtPnR5cGUg IT0gamJ2TnVtZXJpYykKKwkJY2Fubm90Q2FzdEpzb25iVmFsdWUodi0+dHlwZSwgIm51bWVyaWMi KTsKKwlQR19SRVRVUk5fTlVNRVJJQyh2LT52YWwubnVtZXJpYyk7Cit9CisKK0RhdHVtCitqc29u Yl9maW5pc2hfYm9vbChQR19GVU5DVElPTl9BUkdTKQoreworCUpzb25iVmFsdWUJKnYgPSAoSnNv bmJWYWx1ZSAqKVBHX0dFVEFSR19QT0lOVEVSKDApOworCWlmICh2LT50eXBlICE9IGpidkJvb2wp CisJCWNhbm5vdENhc3RKc29uYlZhbHVlKHYtPnR5cGUsICJib29sZWFuIik7CisJUEdfUkVUVVJO X0JPT0wodi0+dmFsLmJvb2xlYW4pOworfQorCiBEYXR1bQoganNvbmJfYm9vbChQR19GVU5DVElP Tl9BUkdTKQogewpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2pzb25mdW5jcy5j IGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2pzb25mdW5jcy5jCmluZGV4IGE0YmZhNWU0MDQwLi5m NjA0MmVhNDQyYyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2pzb25mdW5jcy5j CisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9qc29uZnVuY3MuYwpAQCAtNDkyLDYgKzQ5Miw3 IEBAIHN0YXRpYyBKc29uUGFyc2VFcnJvclR5cGUgdHJhbnNmb3JtX3N0cmluZ192YWx1ZXNfb2Jq ZWN0X2ZpZWxkX3N0YXJ0KHZvaWQgKnN0YXRlCiBzdGF0aWMgSnNvblBhcnNlRXJyb3JUeXBlIHRy YW5zZm9ybV9zdHJpbmdfdmFsdWVzX2FycmF5X2VsZW1lbnRfc3RhcnQodm9pZCAqc3RhdGUsIGJv b2wgaXNudWxsKTsKIHN0YXRpYyBKc29uUGFyc2VFcnJvclR5cGUgdHJhbnNmb3JtX3N0cmluZ192 YWx1ZXNfc2NhbGFyKHZvaWQgKnN0YXRlLCBjaGFyICp0b2tlbiwgSnNvblRva2VuVHlwZSB0b2tl bnR5cGUpOwogCitzdGF0aWMgSnNvbmJWYWx1ZSAqanNvbmJfZ2V0X2pzb25idmFsdWUoSnNvbmIg KmpiLCBEYXR1bSAqcGF0aCwgaW50IG5wYXRoLCBib29sICppc251bGwpOwogCiAvKgogICogcGdf cGFyc2VfanNvbl9vcl9lcnJzYXZlCkBAIC0xNDczLDYgKzE0NzQsMzkgQEAgZ2V0X3NjYWxhcih2 b2lkICpzdGF0ZSwgY2hhciAqdG9rZW4sIEpzb25Ub2tlblR5cGUgdG9rZW50eXBlKQogCXJldHVy biBKU09OX1NVQ0NFU1M7CiB9CiAKK0RhdHVtCitqc29uYl9leHRyYWN0X3BhdGhfc3RhcnQoUEdf RlVOQ1RJT05fQVJHUykKK3sKKwlKc29uYgkgICAqamIgPSBQR19HRVRBUkdfSlNPTkJfUCgwKTsK KwlBcnJheVR5cGUgICpwYXRoID0gUEdfR0VUQVJHX0FSUkFZVFlQRV9QKDEpOworCisJSnNvbmJW YWx1ZSAqdjsKKworCURhdHVtCSAgICpwYXRodGV4dDsKKwlib29sCSAgICpwYXRobnVsbHM7CisJ Ym9vbAkJaXNudWxsID0gZmFsc2U7CisJaW50CQkJbnBhdGg7CisKKwkvKgorCSAqIElmIHRoZSBh cnJheSBjb250YWlucyBhbnkgbnVsbCBlbGVtZW50cywgcmV0dXJuIE5VTEwsIG9uIHRoZSBncm91 bmRzCisJICogdGhhdCB5b3UnZCBoYXZlIGdvdHRlbiBOVUxMIGlmIGFueSBSSFMgdmFsdWUgd2Vy ZSBOVUxMIGluIGEgbmVzdGVkCisJICogc2VyaWVzIG9mIGFwcGxpY2F0aW9ucyBvZiB0aGUgLT4g b3BlcmF0b3IuICAoTm90ZTogYmVjYXVzZSB3ZSBhbHNvCisJICogcmV0dXJuIE5VTEwgZm9yIGVy cm9yIGNhc2VzIHN1Y2ggYXMgbm8tc3VjaC1maWVsZCwgdGhpcyBpcyB0cnVlCisJICogcmVnYXJk bGVzcyBvZiB0aGUgY29udGVudHMgb2YgdGhlIHJlc3Qgb2YgdGhlIGFycmF5LikKKwkgKi8KKwlp ZiAoYXJyYXlfY29udGFpbnNfbnVsbHMocGF0aCkpCisJCVBHX1JFVFVSTl9OVUxMKCk7CisKKwlk ZWNvbnN0cnVjdF9hcnJheV9idWlsdGluKHBhdGgsIFRFWFRPSUQsICZwYXRodGV4dCwgJnBhdGhu dWxscywgJm5wYXRoKTsKKworCXYgPSBqc29uYl9nZXRfanNvbmJ2YWx1ZShqYiwgcGF0aHRleHQs IG5wYXRoLCAmaXNudWxsKTsKKworCWlmIChpc251bGwpCisJCVBHX1JFVFVSTl9OVUxMKCk7CisK KwlQR19SRVRVUk5fUE9JTlRFUih2KTsKK30KKwogRGF0dW0KIGpzb25iX2V4dHJhY3RfcGF0aChQ R19GVU5DVElPTl9BUkdTKQogewpAQCAtMTUxNiw1MiArMTU1MCwzNiBAQCBnZXRfanNvbmJfcGF0 aF9hbGwoRnVuY3Rpb25DYWxsSW5mbyBmY2luZm8sIGJvb2wgYXNfdGV4dCkKIAkJUEdfUkVUVVJO X0RBVFVNKHJlcyk7CiB9CiAKLURhdHVtCi1qc29uYl9nZXRfZWxlbWVudChKc29uYiAqamIsIERh dHVtICpwYXRoLCBpbnQgbnBhdGgsIGJvb2wgKmlzbnVsbCwgYm9vbCBhc190ZXh0KQorCitzdGF0 aWMgSnNvbmJWYWx1ZSAqCitqc29uYl9nZXRfanNvbmJ2YWx1ZShKc29uYiAqamIsIERhdHVtICpw YXRoLCBpbnQgbnBhdGgsIGJvb2wgKmlzbnVsbCkKIHsKKwlib29sIGhhdmVfb2JqZWN0ID0gZmFs c2UsIGhhdmVfYXJyYXkgPSBmYWxzZTsKIAlKc29uYkNvbnRhaW5lciAqY29udGFpbmVyID0gJmpi LT5yb290OworCWludCBpOwogCUpzb25iVmFsdWUgKmpidnAgPSBOVUxMOwotCWludAkJCWk7Ci0J Ym9vbAkJaGF2ZV9vYmplY3QgPSBmYWxzZSwKLQkJCQloYXZlX2FycmF5ID0gZmFsc2U7CiAKLQkq aXNudWxsID0gZmFsc2U7CisJLyoKKwkgKiBJZiB0aGUgYXJyYXkgaXMgZW1wdHksIHJldHVybiB0 aGUgZW50aXJlIExIUyBvYmplY3QsIG9uIHRoZSBncm91bmRzCisJICogdGhhdCB3ZSBzaG91bGQg ZG8gemVybyBmaWVsZCBvciBlbGVtZW50IGV4dHJhY3Rpb25zLgorCSAqLworCWlmIChucGF0aCA8 PSAwKQorCXsKKwkJSnNvbmJWYWx1ZSAqcmVzID0gTlVMTDsKKwkJaWYgKEpCX1JPT1RfSVNfQVJS QVkoamIpICYmIEpCX1JPT1RfSVNfU0NBTEFSKGpiKSkKKwkJCXJldHVybiBnZXRJdGhKc29uYlZh bHVlRnJvbUNvbnRhaW5lcihjb250YWluZXIsIDApOworCisJCS8qIE5COiByZXMgaXMgYSBqYnZC aW5hcnkgSnNvbmJWYWx1ZSAqLworCQlyZXMgPSBwYWxsb2MwKHNpemVvZihKc29uYlZhbHVlKSk7 CisJCUpzb25iVG9Kc29uYlZhbHVlKGpiLCByZXMpOworCQlyZXR1cm4gcmVzOworCX0KIAogCS8q IElkZW50aWZ5IHdoZXRoZXIgd2UgaGF2ZSBvYmplY3QsIGFycmF5LCBvciBzY2FsYXIgYXQgdG9w LWxldmVsICovCiAJaWYgKEpCX1JPT1RfSVNfT0JKRUNUKGpiKSkKIAkJaGF2ZV9vYmplY3QgPSB0 cnVlOwogCWVsc2UgaWYgKEpCX1JPT1RfSVNfQVJSQVkoamIpICYmICFKQl9ST09UX0lTX1NDQUxB UihqYikpCiAJCWhhdmVfYXJyYXkgPSB0cnVlOwotCWVsc2UKLQl7Ci0JCUFzc2VydChKQl9ST09U X0lTX0FSUkFZKGpiKSAmJiBKQl9ST09UX0lTX1NDQUxBUihqYikpOwotCQkvKiBFeHRyYWN0IHRo ZSBzY2FsYXIgdmFsdWUsIGlmIGl0IGlzIHdoYXQgd2UnbGwgcmV0dXJuICovCi0JCWlmIChucGF0 aCA8PSAwKQotCQkJamJ2cCA9IGdldEl0aEpzb25iVmFsdWVGcm9tQ29udGFpbmVyKGNvbnRhaW5l ciwgMCk7Ci0JfQotCi0JLyoKLQkgKiBJZiB0aGUgYXJyYXkgaXMgZW1wdHksIHJldHVybiB0aGUg ZW50aXJlIExIUyBvYmplY3QsIG9uIHRoZSBncm91bmRzCi0JICogdGhhdCB3ZSBzaG91bGQgZG8g emVybyBmaWVsZCBvciBlbGVtZW50IGV4dHJhY3Rpb25zLiAgRm9yIHRoZQotCSAqIG5vbi1zY2Fs YXIgY2FzZSB3ZSBjYW4ganVzdCBoYW5kIGJhY2sgdGhlIG9iamVjdCB3aXRob3V0IG11Y2ggd29y ay4gRm9yCi0JICogdGhlIHNjYWxhciBjYXNlLCBmYWxsIHRocm91Z2ggYW5kIGRlYWwgd2l0aCB0 aGUgdmFsdWUgYmVsb3cgdGhlIGxvb3AuCi0JICogKFRoaXMgaW5jb25zaXN0ZW5jeSBhcmlzZXMg YmVjYXVzZSB0aGVyZSdzIG5vIGVhc3kgd2F5IHRvIGdlbmVyYXRlIGEKLQkgKiBKc29uYlZhbHVl IGRpcmVjdGx5IGZvciByb290LWxldmVsIGNvbnRhaW5lcnMuKQotCSAqLwotCWlmIChucGF0aCA8 PSAwICYmIGpidnAgPT0gTlVMTCkKLQl7Ci0JCWlmIChhc190ZXh0KQotCQl7Ci0JCQlyZXR1cm4g UG9pbnRlckdldERhdHVtKGNzdHJpbmdfdG9fdGV4dChKc29uYlRvQ1N0cmluZyhOVUxMLAotCQkJ CQkJCQkJCQkJCQkJCSAgY29udGFpbmVyLAotCQkJCQkJCQkJCQkJCQkJCSAgVkFSU0laRShqYikp KSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvKiBub3QgdGV4dCBtb2RlIC0ganVzdCBoYW5kIGJh Y2sgdGhlIGpzb25iICovCi0JCQlQR19SRVRVUk5fSlNPTkJfUChqYik7Ci0JCX0KLQl9CiAKIAlm b3IgKGkgPSAwOyBpIDwgbnBhdGg7IGkrKykKIAl7CkBAIC0xNTg2LDcgKzE2MDQsNyBAQCBqc29u Yl9nZXRfZWxlbWVudChKc29uYiAqamIsIERhdHVtICpwYXRoLCBpbnQgbnBhdGgsIGJvb2wgKmlz bnVsbCwgYm9vbCBhc190ZXh0KQogCQkJaWYgKGVuZHB0ciA9PSBpbmRleHRleHQgfHwgKmVuZHB0 ciAhPSAnXDAnIHx8IGVycm5vICE9IDApCiAJCQl7CiAJCQkJKmlzbnVsbCA9IHRydWU7Ci0JCQkJ cmV0dXJuIFBvaW50ZXJHZXREYXR1bShOVUxMKTsKKwkJCQlyZXR1cm4gTlVMTDsKIAkJCX0KIAog CQkJaWYgKGxpbmRleCA+PSAwKQpAQCAtMTYwNyw3ICsxNjI1LDcgQEAganNvbmJfZ2V0X2VsZW1l bnQoSnNvbmIgKmpiLCBEYXR1bSAqcGF0aCwgaW50IG5wYXRoLCBib29sICppc251bGwsIGJvb2wg YXNfdGV4dCkKIAkJCQlpZiAobGluZGV4ID09IElOVF9NSU4gfHwgLWxpbmRleCA+IG5lbGVtZW50 cykKIAkJCQl7CiAJCQkJCSppc251bGwgPSB0cnVlOwotCQkJCQlyZXR1cm4gUG9pbnRlckdldERh dHVtKE5VTEwpOworCQkJCQlyZXR1cm4gTlVMTDsKIAkJCQl9CiAJCQkJZWxzZQogCQkJCQlpbmRl eCA9IG5lbGVtZW50cyArIGxpbmRleDsKQEAgLTE2MTksMTMgKzE2MzcsMTMgQEAganNvbmJfZ2V0 X2VsZW1lbnQoSnNvbmIgKmpiLCBEYXR1bSAqcGF0aCwgaW50IG5wYXRoLCBib29sICppc251bGws IGJvb2wgYXNfdGV4dCkKIAkJewogCQkJLyogc2NhbGFyLCBleHRyYWN0aW9uIHlpZWxkcyBhIG51 bGwgKi8KIAkJCSppc251bGwgPSB0cnVlOwotCQkJcmV0dXJuIFBvaW50ZXJHZXREYXR1bShOVUxM KTsKKwkJCXJldHVybiBOVUxMOwogCQl9CiAKIAkJaWYgKGpidnAgPT0gTlVMTCkKIAkJewogCQkJ KmlzbnVsbCA9IHRydWU7Ci0JCQlyZXR1cm4gUG9pbnRlckdldERhdHVtKE5VTEwpOworCQkJcmV0 dXJuIE5VTEw7CiAJCX0KIAkJZWxzZSBpZiAoaSA9PSBucGF0aCAtIDEpCiAJCQlicmVhazsKQEAg LTE2NDQsNiArMTY2MiwyMiBAQCBqc29uYl9nZXRfZWxlbWVudChKc29uYiAqamIsIERhdHVtICpw YXRoLCBpbnQgbnBhdGgsIGJvb2wgKmlzbnVsbCwgYm9vbCBhc190ZXh0KQogCQkJaGF2ZV9hcnJh eSA9IGZhbHNlOwogCQl9CiAJfQorCXJldHVybiBqYnZwOworfQorCisvKgorICogUmV0dXJuIGpz b25iIGRhdHVtIG9yIGpzb25iLWFzLXRleHQgZGF0dW0uCisgKi8KK0RhdHVtCitqc29uYl9nZXRf ZWxlbWVudChKc29uYiAqamIsIERhdHVtICpwYXRoLCBpbnQgbnBhdGgsIGJvb2wgKmlzbnVsbCwg Ym9vbCBhc190ZXh0KQoreworCUpzb25iVmFsdWUgKmpidnAgPSBOVUxMOworCSppc251bGwgPSBm YWxzZTsKKworCWpidnAgPSBqc29uYl9nZXRfanNvbmJ2YWx1ZShqYiwgcGF0aCwgbnBhdGgsIGlz bnVsbCk7CisKKwlpZiAoKmlzbnVsbCkKKwkJcmV0dXJuIFBvaW50ZXJHZXREYXR1bShOVUxMKTsK IAogCWlmIChhc190ZXh0KQogCXsKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL2NhdGFsb2cvY2F0 dmVyc2lvbi5oIGIvc3JjL2luY2x1ZGUvY2F0YWxvZy9jYXR2ZXJzaW9uLmgKaW5kZXggYWI5YTdh YzFmNzkuLjJjZTg1YjQyZDhmIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9jYXRhbG9nL2NhdHZl cnNpb24uaAorKysgYi9zcmMvaW5jbHVkZS9jYXRhbG9nL2NhdHZlcnNpb24uaApAQCAtNTcsNiAr NTcsNSBAQAogICovCiAKIC8qCQkJCQkJCXl5eXltbWRkTiAqLwotI2RlZmluZSBDQVRBTE9HX1ZF UlNJT05fTk8JMjAyMzA4MjUxCi0KKyNkZWZpbmUgQ0FUQUxPR19WRVJTSU9OX05PCTIwMjMwODMx MQogI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0IGIv c3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdAppbmRleCA5ODA1YmM2MTE4MC4uNTgzMDMy NzA3ZTQgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQKKysrIGIv c3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdApAQCAtNDU4NywyNSArNDU4NywyNSBAQAog ICBwcm9uYW1lID0+ICdwZ19sc24nLCBwcm9yZXR0eXBlID0+ICdwZ19sc24nLCBwcm9hcmd0eXBl cyA9PiAnbnVtZXJpYycsCiAgIHByb3NyYyA9PiAnbnVtZXJpY19wZ19sc24nIH0sCiAKLXsgb2lk ID0+ICczNTU2JywgZGVzY3IgPT4gJ2NvbnZlcnQganNvbmIgdG8gYm9vbGVhbicsCit7IG9pZCA9 PiAnMzU1NicsIGRlc2NyID0+ICdjb252ZXJ0IGpzb25iIHRvIGJvb2xlYW4nLCBwcm9zdXBwb3J0 ID0+ICdqc29uYl9jYXN0X3N1cHBvcnQnLAogICBwcm9uYW1lID0+ICdib29sJywgcHJvcmV0dHlw ZSA9PiAnYm9vbCcsIHByb2FyZ3R5cGVzID0+ICdqc29uYicsCiAgIHByb3NyYyA9PiAnanNvbmJf Ym9vbCcgfSwKIHsgb2lkID0+ICczNDQ5JywgZGVzY3IgPT4gJ2NvbnZlcnQganNvbmIgdG8gbnVt ZXJpYycsCi0gIHByb25hbWUgPT4gJ251bWVyaWMnLCBwcm9yZXR0eXBlID0+ICdudW1lcmljJywg cHJvYXJndHlwZXMgPT4gJ2pzb25iJywKKyAgcHJvbmFtZSA9PiAnbnVtZXJpYycsIHByb3JldHR5 cGUgPT4gJ251bWVyaWMnLCBwcm9hcmd0eXBlcyA9PiAnanNvbmInLCBwcm9zdXBwb3J0ID0+ICdq c29uYl9jYXN0X3N1cHBvcnQnLAogICBwcm9zcmMgPT4gJ2pzb25iX251bWVyaWMnIH0sCi17IG9p ZCA9PiAnMzQ1MCcsIGRlc2NyID0+ICdjb252ZXJ0IGpzb25iIHRvIGludDInLAoreyBvaWQgPT4g JzM0NTAnLCBkZXNjciA9PiAnY29udmVydCBqc29uYiB0byBpbnQyJywgcHJvc3VwcG9ydCA9PiAn anNvbmJfY2FzdF9zdXBwb3J0JywKICAgcHJvbmFtZSA9PiAnaW50MicsIHByb3JldHR5cGUgPT4g J2ludDInLCBwcm9hcmd0eXBlcyA9PiAnanNvbmInLAogICBwcm9zcmMgPT4gJ2pzb25iX2ludDIn IH0sCi17IG9pZCA9PiAnMzQ1MScsIGRlc2NyID0+ICdjb252ZXJ0IGpzb25iIHRvIGludDQnLAor eyBvaWQgPT4gJzM0NTEnLCBkZXNjciA9PiAnY29udmVydCBqc29uYiB0byBpbnQ0JywgcHJvc3Vw cG9ydCA9PiAnanNvbmJfY2FzdF9zdXBwb3J0JywKICAgcHJvbmFtZSA9PiAnaW50NCcsIHByb3Jl dHR5cGUgPT4gJ2ludDQnLCBwcm9hcmd0eXBlcyA9PiAnanNvbmInLAogICBwcm9zcmMgPT4gJ2pz b25iX2ludDQnIH0sCi17IG9pZCA9PiAnMzQ1MicsIGRlc2NyID0+ICdjb252ZXJ0IGpzb25iIHRv IGludDgnLAoreyBvaWQgPT4gJzM0NTInLCBkZXNjciA9PiAnY29udmVydCBqc29uYiB0byBpbnQ4 JywgcHJvc3VwcG9ydCA9PiAnanNvbmJfY2FzdF9zdXBwb3J0JywKICAgcHJvbmFtZSA9PiAnaW50 OCcsIHByb3JldHR5cGUgPT4gJ2ludDgnLCBwcm9hcmd0eXBlcyA9PiAnanNvbmInLAogICBwcm9z cmMgPT4gJ2pzb25iX2ludDgnIH0sCi17IG9pZCA9PiAnMzQ1MycsIGRlc2NyID0+ICdjb252ZXJ0 IGpzb25iIHRvIGZsb2F0NCcsCit7IG9pZCA9PiAnMzQ1MycsIGRlc2NyID0+ICdjb252ZXJ0IGpz b25iIHRvIGZsb2F0NCcsIHByb3N1cHBvcnQgPT4gJ2pzb25iX2Nhc3Rfc3VwcG9ydCcsCiAgIHBy b25hbWUgPT4gJ2Zsb2F0NCcsIHByb3JldHR5cGUgPT4gJ2Zsb2F0NCcsIHByb2FyZ3R5cGVzID0+ ICdqc29uYicsCiAgIHByb3NyYyA9PiAnanNvbmJfZmxvYXQ0JyB9LAoteyBvaWQgPT4gJzI1ODAn LCBkZXNjciA9PiAnY29udmVydCBqc29uYiB0byBmbG9hdDgnLAoreyBvaWQgPT4gJzI1ODAnLCBk ZXNjciA9PiAnY29udmVydCBqc29uYiB0byBmbG9hdDgnLCBwcm9zdXBwb3J0ID0+ICdqc29uYl9j YXN0X3N1cHBvcnQnLAogICBwcm9uYW1lID0+ICdmbG9hdDgnLCBwcm9yZXR0eXBlID0+ICdmbG9h dDgnLCBwcm9hcmd0eXBlcyA9PiAnanNvbmInLAogICBwcm9zcmMgPT4gJ2pzb25iX2Zsb2F0OCcg fSwKIApAQCAtOTk0Nyw2ICs5OTQ3LDMwIEBACiAgIHByb25hbWUgPT4gJ2pzb25iX29iamVjdF9m aWVsZF90ZXh0JywgcHJvcmV0dHlwZSA9PiAndGV4dCcsCiAgIHByb2FyZ3R5cGVzID0+ICdqc29u YiB0ZXh0JywgcHJvYXJnbmFtZXMgPT4gJ3tmcm9tX2pzb24sIGZpZWxkX25hbWV9JywKICAgcHJv c3JjID0+ICdqc29uYl9vYmplY3RfZmllbGRfdGV4dCcgfSwKK3sgb2lkID0+ICc0NTUyJywKKyAg cHJvbmFtZSA9PiAnanNvbmJfb2JqZWN0X2ZpZWxkX3N0YXJ0JywgcHJvcmV0dHlwZSA9PiAnaW50 ZXJuYWwnLAorICBwcm9hcmd0eXBlcyA9PiAnaW50ZXJuYWwgdGV4dCcsIHByb2FyZ25hbWVzID0+ ICd7ZnJvbV9qc29uLCBmaWVsZF9uYW1lfScsCisgIHByb3NyYyA9PiAnanNvbmJfb2JqZWN0X2Zp ZWxkX3N0YXJ0JyB9LAoreyBvaWQgPT4gJzM4MTMnLAorICBwcm9uYW1lID0+ICdqc29uYl9hcnJh eV9lbGVtZW50X3N0YXJ0JywgcHJvcmV0dHlwZSA9PiAnaW50ZXJuYWwnLAorICBwcm9hcmd0eXBl cyA9PiAnaW50ZXJuYWwgaW50NCcsIHByb2FyZ25hbWVzID0+ICd7ZnJvbV9qc29uYiwgZWxlbWVu dF9pbmRleH0nLAorICBwcm9zcmMgPT4gJ2pzb25iX2FycmF5X2VsZW1lbnRfc3RhcnQnIH0sCit7 IG9pZCA9PiAnNDU0OScsCisgIHByb25hbWUgPT4gJ2pzb25iX2V4dHJhY3RfcGF0aF9zdGFydCcs IHByb3JldHR5cGUgPT4gJ2ludGVybmFsJywKKyAgcHJvYXJndHlwZXMgPT4gJ2ludGVybmFsIF90 ZXh0JywgcHJvYWxsYXJndHlwZXMgPT4gJ3tqc29uYixfdGV4dH0nLAorICBwcm9hcmdtb2RlcyA9 PiAne2ksdn0nLCBwcm9hcmduYW1lcyA9PiAne2Zyb21fanNvbmIscGF0aF9lbGVtc30nLAorICBw cm9zcmMgPT4gJ2pzb25iX2V4dHJhY3RfcGF0aF9zdGFydCd9LAoreyBvaWQgPT4gJzQ1NTMnLAor ICBwcm9uYW1lID0+ICdqc29uYl9maW5pc2hfbnVtZXJpYycsIHByb3JldHR5cGUgPT4gJ251bWVy aWMnLAorICBwcm9hcmd0eXBlcyA9PiAnaW50ZXJuYWwnLCBwcm9hcmduYW1lcyA9PiAne2Zyb21f anNvbnZhbHVlfScsCisgIHByb3NyYyA9PiAnanNvbmJfZmluaXNoX251bWVyaWMnIH0sCit7IG9p ZCA9PiAnNDU1NCcsCisgIHByb25hbWUgPT4gJ2pzb25iX2ZpbmlzaF9ib29sJywgcHJvcmV0dHlw ZSA9PiAnYm9vbCcsCisgIHByb2FyZ3R5cGVzID0+ICdpbnRlcm5hbCcsIHByb2FyZ25hbWVzID0+ ICd7anNvbnZhbHVlfScsCisgIHByb3NyYyA9PiAnanNvbmJfZmluaXNoX2Jvb2wnIH0sCit7IG9p ZCA9PiAnMzgxNCcsIGRlc2NyID0+ICdwbGFubmVyIHN1cHBvcnQgZm9yIG51bWVyaWMoanNvbmIp JywKKyAgcHJvbmFtZSA9PiAnanNvbmJfY2FzdF9zdXBwb3J0JywgcHJvcmV0dHlwZSA9PiAnaW50 ZXJuYWwnLAorICBwcm9hcmd0eXBlcyA9PiAnaW50ZXJuYWwnLCBwcm9zcmMgPT4gJ2pzb25iX2Nh c3Rfc3VwcG9ydCcgfSwKIHsgb2lkID0+ICczMjE1JywKICAgcHJvbmFtZSA9PiAnanNvbmJfYXJy YXlfZWxlbWVudCcsIHByb3JldHR5cGUgPT4gJ2pzb25iJywKICAgcHJvYXJndHlwZXMgPT4gJ2pz b25iIGludDQnLCBwcm9hcmduYW1lcyA9PiAne2Zyb21fanNvbiwgZWxlbWVudF9pbmRleH0nLApk aWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qc29uYi5vdXQgYi9zcmMvdGVz dC9yZWdyZXNzL2V4cGVjdGVkL2pzb25iLm91dAppbmRleCA0YTE2ZDBkYmFmYi4uYzE2NmViMDAz ZjEgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvanNvbmIub3V0CisrKyBi L3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvanNvbmIub3V0CkBAIC00NTcsOCArNDU3LDgxIEBA IENSRUFURSBURU1QIFRBQkxFIHRlc3RfanNvbmIgKAogKTsKIElOU0VSVCBJTlRPIHRlc3RfanNv bmIgVkFMVUVTCiAoJ3NjYWxhcicsJyJhIHNjYWxhciInKSwKKygnc2NhbGFyaW50JywnMicpLAog KCdhcnJheScsJ1siemVybyIsICJvbmUiLCJ0d28iLG51bGwsImZvdXIiLCJmaXZlIiwgWzEsMiwz XSx7ImYxIjo5fV0nKSwKLSgnb2JqZWN0JywneyJmaWVsZDEiOiJ2YWwxIiwiZmllbGQyIjoidmFs MiIsImZpZWxkMyI6bnVsbCwgImZpZWxkNCI6IDQsICJmaWVsZDUiOiBbMSwyLDNdLCAiZmllbGQ2 IjogeyJmMSI6OX19Jyk7CisoJ29iamVjdCcsJ3siZmllbGQxIjoidmFsMSIsImZpZWxkMiI6InZh bDIiLCJmaWVsZDMiOm51bGwsICJmaWVsZDQiOiA0LCAiZmllbGQ1IjogWzEsMiwzXSwgImZpZWxk NiI6IHsiZjEiOjl9LCAiZmllbGQ3IjogdHJ1ZX0nKTsKK1xwc2V0IG51bGwgTlVMTAorRVhQTEFJ TiAoQ09TVFMgT0ZGLCBWRVJCT1NFKQorU0VMRUNUCisodGVzdF9qc29uIC0+ICdmaWVsZDQnKTo6 bnVtZXJpYywKKyh0ZXN0X2pzb24gLT4gJ2ZpZWxkNCcpOjppbnQyLAorKHRlc3RfanNvbiAtPiAn ZmllbGQ0Jyk6OmludDQsCisodGVzdF9qc29uIC0+ICdmaWVsZDQnKTo6aW50OCwKKyh0ZXN0X2pz b24gLT4gJ2ZpZWxkNCcpOjpmbG9hdDQsCisodGVzdF9qc29uIC0+ICdmaWVsZDQnKTo6ZmxvYXQ4 LAorKHRlc3RfanNvbi0+J2ZpZWxkNScgLT4gMCk6Om51bWVyaWMsCisodGVzdF9qc29uLT4nZmll bGQ1JyAtPiAxMCk6Om51bWVyaWMsCisodGVzdF9qc29uIz4neyJmaWVsZDYiLCAiZjEifScpOjpu dW1lcmljLAorKHRlc3RfanNvbiM+J3siZmllbGQ2IiwgImYyIn0nKTo6bnVtZXJpYywKKyh0ZXN0 X2pzb24jPid7ImZpZWxkNyJ9Jyk6OmJvb2wKK0ZST00gdGVzdF9qc29uYgorV0hFUkUganNvbl90 eXBlID0gJ29iamVjdCc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgU2VxIFNjYW4gb24gcGdf dGVtcC50ZXN0X2pzb25iCisgICBPdXRwdXQ6IGpzb25iX2ZpbmlzaF9udW1lcmljKGpzb25iX29i amVjdF9maWVsZF9zdGFydCgodGVzdF9qc29uKTo6aW50ZXJuYWwoMCksICdmaWVsZDQnOjp0ZXh0 KSksIChqc29uYl9maW5pc2hfbnVtZXJpYyhqc29uYl9vYmplY3RfZmllbGRfc3RhcnQoKHRlc3Rf anNvbik6OmludGVybmFsKDApLCAnZmllbGQ0Jzo6dGV4dCkpKTo6c21hbGxpbnQsIChqc29uYl9m aW5pc2hfbnVtZXJpYyhqc29uYl9vYmplY3RfZmllbGRfc3RhcnQoKHRlc3RfanNvbik6OmludGVy bmFsKDApLCAnZmllbGQ0Jzo6dGV4dCkpKTo6aW50ZWdlciwgKGpzb25iX2ZpbmlzaF9udW1lcmlj KGpzb25iX29iamVjdF9maWVsZF9zdGFydCgodGVzdF9qc29uKTo6aW50ZXJuYWwoMCksICdmaWVs ZDQnOjp0ZXh0KSkpOjpiaWdpbnQsIChqc29uYl9maW5pc2hfbnVtZXJpYyhqc29uYl9vYmplY3Rf ZmllbGRfc3RhcnQoKHRlc3RfanNvbik6OmludGVybmFsKDApLCAnZmllbGQ0Jzo6dGV4dCkpKTo6 cmVhbCwgKGpzb25iX2ZpbmlzaF9udW1lcmljKGpzb25iX29iamVjdF9maWVsZF9zdGFydCgodGVz dF9qc29uKTo6aW50ZXJuYWwoMCksICdmaWVsZDQnOjp0ZXh0KSkpOjpkb3VibGUgcHJlY2lzaW9u LCBqc29uYl9maW5pc2hfbnVtZXJpYyhqc29uYl9hcnJheV9lbGVtZW50X3N0YXJ0KCgodGVzdF9q c29uIC0+ICdmaWVsZDUnOjp0ZXh0KSk6OmludGVybmFsKDApLCAwKSksIGpzb25iX2ZpbmlzaF9u dW1lcmljKGpzb25iX2FycmF5X2VsZW1lbnRfc3RhcnQoKCh0ZXN0X2pzb24gLT4gJ2ZpZWxkNSc6 OnRleHQpKTo6aW50ZXJuYWwoMCksIDEwKSksIGpzb25iX2ZpbmlzaF9udW1lcmljKGpzb25iX2V4 dHJhY3RfcGF0aF9zdGFydCgodGVzdF9qc29uKTo6aW50ZXJuYWwoMCksICd7ZmllbGQ2LGYxfSc6 OnRleHRbXSkpLCBqc29uYl9maW5pc2hfbnVtZXJpYyhqc29uYl9leHRyYWN0X3BhdGhfc3RhcnQo KHRlc3RfanNvbik6OmludGVybmFsKDApLCAne2ZpZWxkNixmMn0nOjp0ZXh0W10pKSwganNvbmJf ZmluaXNoX2Jvb2woanNvbmJfZXh0cmFjdF9wYXRoX3N0YXJ0KCh0ZXN0X2pzb24pOjppbnRlcm5h bCgwKSwgJ3tmaWVsZDd9Jzo6dGV4dFtdKSkKKyAgIEZpbHRlcjogKHRlc3RfanNvbmIuanNvbl90 eXBlID0gJ29iamVjdCc6OnRleHQpCisoMyByb3dzKQorCitTRUxFQ1QKKyh0ZXN0X2pzb24gLT4g J2ZpZWxkNCcpOjpudW1lcmljLAorKHRlc3RfanNvbiAtPiAnZmllbGQ0Jyk6OmludDIsCisodGVz dF9qc29uIC0+ICdmaWVsZDQnKTo6aW50NCwKKyh0ZXN0X2pzb24gLT4gJ2ZpZWxkNCcpOjppbnQ4 LAorKHRlc3RfanNvbiAtPiAnZmllbGQ0Jyk6OmZsb2F0NCwKKyh0ZXN0X2pzb24gLT4gJ2ZpZWxk NCcpOjpmbG9hdDgsCisodGVzdF9qc29uIC0+ICdmaWVsZDUnIC0+IDApOjpudW1lcmljLAorKHRl c3RfanNvbiAtPiAnZmllbGQ1JyAtPiAxMCk6Om51bWVyaWMsCisodGVzdF9qc29uICM+ICd7ImZp ZWxkNiIsICJmMSJ9Jyk6Om51bWVyaWMsCisodGVzdF9qc29uICM+ICd7ImZpZWxkNiIsICJmMiJ9 Jyk6Om51bWVyaWMsCisodGVzdF9qc29uIz4neyJmaWVsZDcifScpOjpib29sCitGUk9NIHRlc3Rf anNvbmIKK1dIRVJFIGpzb25fdHlwZSA9ICdvYmplY3QnOworIG51bWVyaWMgfCBpbnQyIHwgaW50 NCB8IGludDggfCBmbG9hdDQgfCBmbG9hdDggfCBudW1lcmljIHwgbnVtZXJpYyB8IG51bWVyaWMg fCBudW1lcmljIHwgYm9vbCAKKy0tLS0tLS0tLSstLS0tLS0rLS0tLS0tKy0tLS0tLSstLS0tLS0t LSstLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0t CisgICAgICAgNCB8ICAgIDQgfCAgICA0IHwgICAgNCB8ICAgICAgNCB8ICAgICAgNCB8ICAgICAg IDEgfCAgICBOVUxMIHwgICAgICAgOSB8ICAgIE5VTEwgfCB0CisoMSByb3cpCisKK0VYUExBSU4g KENPU1RTIE9GRiwgVkVSQk9TRSkKK1NFTEVDVCAodGVzdF9qc29uICM+ICd7fScpOjpudW1lcmlj IEZST00gdGVzdF9qc29uYiBXSEVSRSBqc29uX3R5cGUgPSAnc2NhbGFyaW50JzsKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQorIFNlcSBTY2FuIG9uIHBnX3RlbXAudGVzdF9qc29uYgorICAg T3V0cHV0OiBqc29uYl9maW5pc2hfbnVtZXJpYyhqc29uYl9leHRyYWN0X3BhdGhfc3RhcnQoKHRl c3RfanNvbik6OmludGVybmFsKDApLCAne30nOjp0ZXh0W10pKQorICAgRmlsdGVyOiAodGVzdF9q c29uYi5qc29uX3R5cGUgPSAnc2NhbGFyaW50Jzo6dGV4dCkKKygzIHJvd3MpCisKK1NFTEVDVCAo dGVzdF9qc29uICM+ICd7fScpOjpudW1lcmljIEZST00gdGVzdF9qc29uYiBXSEVSRSBqc29uX3R5 cGUgPSAnc2NhbGFyaW50JzsKKyBudW1lcmljIAorLS0tLS0tLS0tCisgICAgICAgMgorKDEgcm93 KQorCistLSBsZXQgcmFpc2Ugc29tZSBlcnJvcnMuCitFWFBMQUlOIChDT1NUUyBPRkYsIFZFUkJP U0UpCitTRUxFQ1QgKHRlc3RfanNvbiAtPiAnZmllbGQxJyk6OmludDQgRlJPTSB0ZXN0X2pzb25i IFdIRVJFIGpzb25fdHlwZSA9ICdvYmplY3QnOworICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTZXEgU2NhbiBvbiBwZ190ZW1wLnRlc3RfanNv bmIKKyAgIE91dHB1dDogKGpzb25iX2ZpbmlzaF9udW1lcmljKGpzb25iX29iamVjdF9maWVsZF9z dGFydCgodGVzdF9qc29uKTo6aW50ZXJuYWwoMCksICdmaWVsZDEnOjp0ZXh0KSkpOjppbnRlZ2Vy CisgICBGaWx0ZXI6ICh0ZXN0X2pzb25iLmpzb25fdHlwZSA9ICdvYmplY3QnOjp0ZXh0KQorKDMg cm93cykKKworU0VMRUNUICh0ZXN0X2pzb24gLT4gJ2ZpZWxkMScpOjppbnQ0IEZST00gdGVzdF9q c29uYiBXSEVSRSBqc29uX3R5cGUgPSAnb2JqZWN0JzsKK0VSUk9SOiAgY2Fubm90IGNhc3QganNv bmIgc3RyaW5nIHRvIHR5cGUgbnVtZXJpYworU0VMRUNUICh0ZXN0X2pzb24gLT4gJ2ZpZWxkMScp Ojpib29sIEZST00gdGVzdF9qc29uYiBXSEVSRSBqc29uX3R5cGUgPSAnb2JqZWN0JzsKK0VSUk9S OiAgY2Fubm90IGNhc3QganNvbmIgc3RyaW5nIHRvIHR5cGUgYm9vbGVhbgorXHBzZXQgbnVsbCAn JwogU0VMRUNUIHRlc3RfanNvbiAtPiAneCcgRlJPTSB0ZXN0X2pzb25iIFdIRVJFIGpzb25fdHlw ZSA9ICdzY2FsYXInOwogID9jb2x1bW4/IAogLS0tLS0tLS0tLQpAQCAtNTg2LDcgKzY1OSw4IEBA IFNFTEVDVCBqc29uYl9vYmplY3Rfa2V5cyh0ZXN0X2pzb24pIEZST00gdGVzdF9qc29uYiBXSEVS RSBqc29uX3R5cGUgPSAnb2JqZWN0JzsKICBmaWVsZDQKICBmaWVsZDUKICBmaWVsZDYKLSg2IHJv d3MpCisgZmllbGQ3CisoNyByb3dzKQogCiAtLSBudWxscwogU0VMRUNUICh0ZXN0X2pzb24tPidm aWVsZDMnKSBJUyBOVUxMIEFTIGV4cGVjdF9mYWxzZSBGUk9NIHRlc3RfanNvbmIgV0hFUkUganNv bl90eXBlID0gJ29iamVjdCc7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9qc29u Yi5zcWwgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9qc29uYi5zcWwKaW5kZXggZTRiN2NkZjcwM2Qu LjlkZjg4ODY2NjcxIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9qc29uYi5zcWwK KysrIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvanNvbmIuc3FsCkBAIC0xNTQsOCArMTU0LDU0IEBA IENSRUFURSBURU1QIFRBQkxFIHRlc3RfanNvbmIgKAogCiBJTlNFUlQgSU5UTyB0ZXN0X2pzb25i IFZBTFVFUwogKCdzY2FsYXInLCciYSBzY2FsYXIiJyksCisoJ3NjYWxhcmludCcsJzInKSwKICgn YXJyYXknLCdbInplcm8iLCAib25lIiwidHdvIixudWxsLCJmb3VyIiwiZml2ZSIsIFsxLDIsM10s eyJmMSI6OX1dJyksCi0oJ29iamVjdCcsJ3siZmllbGQxIjoidmFsMSIsImZpZWxkMiI6InZhbDIi LCJmaWVsZDMiOm51bGwsICJmaWVsZDQiOiA0LCAiZmllbGQ1IjogWzEsMiwzXSwgImZpZWxkNiI6 IHsiZjEiOjl9fScpOworKCdvYmplY3QnLCd7ImZpZWxkMSI6InZhbDEiLCJmaWVsZDIiOiJ2YWwy IiwiZmllbGQzIjpudWxsLCAiZmllbGQ0IjogNCwgImZpZWxkNSI6IFsxLDIsM10sICJmaWVsZDYi OiB7ImYxIjo5fSwgImZpZWxkNyI6IHRydWV9Jyk7CisKK1xwc2V0IG51bGwgTlVMTAorRVhQTEFJ TiAoQ09TVFMgT0ZGLCBWRVJCT1NFKQorU0VMRUNUCisodGVzdF9qc29uIC0+ICdmaWVsZDQnKTo6 bnVtZXJpYywKKyh0ZXN0X2pzb24gLT4gJ2ZpZWxkNCcpOjppbnQyLAorKHRlc3RfanNvbiAtPiAn ZmllbGQ0Jyk6OmludDQsCisodGVzdF9qc29uIC0+ICdmaWVsZDQnKTo6aW50OCwKKyh0ZXN0X2pz b24gLT4gJ2ZpZWxkNCcpOjpmbG9hdDQsCisodGVzdF9qc29uIC0+ICdmaWVsZDQnKTo6ZmxvYXQ4 LAorKHRlc3RfanNvbi0+J2ZpZWxkNScgLT4gMCk6Om51bWVyaWMsCisodGVzdF9qc29uLT4nZmll bGQ1JyAtPiAxMCk6Om51bWVyaWMsCisodGVzdF9qc29uIz4neyJmaWVsZDYiLCAiZjEifScpOjpu dW1lcmljLAorKHRlc3RfanNvbiM+J3siZmllbGQ2IiwgImYyIn0nKTo6bnVtZXJpYywKKyh0ZXN0 X2pzb24jPid7ImZpZWxkNyJ9Jyk6OmJvb2wKK0ZST00gdGVzdF9qc29uYgorV0hFUkUganNvbl90 eXBlID0gJ29iamVjdCc7CisKK1NFTEVDVAorKHRlc3RfanNvbiAtPiAnZmllbGQ0Jyk6Om51bWVy aWMsCisodGVzdF9qc29uIC0+ICdmaWVsZDQnKTo6aW50MiwKKyh0ZXN0X2pzb24gLT4gJ2ZpZWxk NCcpOjppbnQ0LAorKHRlc3RfanNvbiAtPiAnZmllbGQ0Jyk6OmludDgsCisodGVzdF9qc29uIC0+ ICdmaWVsZDQnKTo6ZmxvYXQ0LAorKHRlc3RfanNvbiAtPiAnZmllbGQ0Jyk6OmZsb2F0OCwKKyh0 ZXN0X2pzb24gLT4gJ2ZpZWxkNScgLT4gMCk6Om51bWVyaWMsCisodGVzdF9qc29uIC0+ICdmaWVs ZDUnIC0+IDEwKTo6bnVtZXJpYywKKyh0ZXN0X2pzb24gIz4gJ3siZmllbGQ2IiwgImYxIn0nKTo6 bnVtZXJpYywKKyh0ZXN0X2pzb24gIz4gJ3siZmllbGQ2IiwgImYyIn0nKTo6bnVtZXJpYywKKyh0 ZXN0X2pzb24jPid7ImZpZWxkNyJ9Jyk6OmJvb2wKK0ZST00gdGVzdF9qc29uYgorV0hFUkUganNv bl90eXBlID0gJ29iamVjdCc7CisKK0VYUExBSU4gKENPU1RTIE9GRiwgVkVSQk9TRSkKK1NFTEVD VCAodGVzdF9qc29uICM+ICd7fScpOjpudW1lcmljIEZST00gdGVzdF9qc29uYiBXSEVSRSBqc29u X3R5cGUgPSAnc2NhbGFyaW50JzsKK1NFTEVDVCAodGVzdF9qc29uICM+ICd7fScpOjpudW1lcmlj IEZST00gdGVzdF9qc29uYiBXSEVSRSBqc29uX3R5cGUgPSAnc2NhbGFyaW50JzsKKworLS0gbGV0 IHJhaXNlIHNvbWUgZXJyb3JzLgorRVhQTEFJTiAoQ09TVFMgT0ZGLCBWRVJCT1NFKQorU0VMRUNU ICh0ZXN0X2pzb24gLT4gJ2ZpZWxkMScpOjppbnQ0IEZST00gdGVzdF9qc29uYiBXSEVSRSBqc29u X3R5cGUgPSAnb2JqZWN0JzsKK1NFTEVDVCAodGVzdF9qc29uIC0+ICdmaWVsZDEnKTo6aW50NCBG Uk9NIHRlc3RfanNvbmIgV0hFUkUganNvbl90eXBlID0gJ29iamVjdCc7CisKK1NFTEVDVCAodGVz dF9qc29uIC0+ICdmaWVsZDEnKTo6Ym9vbCBGUk9NIHRlc3RfanNvbmIgV0hFUkUganNvbl90eXBl ID0gJ29iamVjdCc7CisKK1xwc2V0IG51bGwgJycKIAogU0VMRUNUIHRlc3RfanNvbiAtPiAneCcg RlJPTSB0ZXN0X2pzb25iIFdIRVJFIGpzb25fdHlwZSA9ICdzY2FsYXInOwogU0VMRUNUIHRlc3Rf anNvbiAtPiAneCcgRlJPTSB0ZXN0X2pzb25iIFdIRVJFIGpzb25fdHlwZSA9ICdhcnJheSc7Ci0t IAoyLjIxLjAKCg== --000000000000ab77280604346bea--