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 1qrBcs-002zrk-RH for pgsql-hackers@arkaria.postgresql.org; Fri, 13 Oct 2023 06:26:22 +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 1qrBcq-00F0Aq-8v for pgsql-hackers@arkaria.postgresql.org; Fri, 13 Oct 2023 06:26:20 +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 1qrBcp-00F0Ah-N0 for pgsql-hackers@lists.postgresql.org; Fri, 13 Oct 2023 06:26:20 +0000 Received: from mail-vs1-xe32.google.com ([2607:f8b0:4864:20::e32]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1qrBck-000FST-Dk for pgsql-hackers@lists.postgresql.org; Fri, 13 Oct 2023 06:26:19 +0000 Received: by mail-vs1-xe32.google.com with SMTP id ada2fe7eead31-457c82cd87bso38785137.0 for ; Thu, 12 Oct 2023 23:26:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1697178373; x=1697783173; darn=lists.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=2X7qJvQ6GXyfuyA0QqKptNQiuqM4zphvU4CZUvLJrBI=; b=QBpLrEf1Hv/k53tKyIhwKdVEN26i4fi092SBN0DuJNX2dRT87/Q7456PWuN1xBFPgV ATWqIXH96Z55CuI82PVazyevCzm32c44SWAfOztPo6ym7SI47QA0WDeTIBA7e7G/fGrt omayWzcBCdE+y6LuqYGXAUnEdmY6hv5P2pWmQNRjNMYhwikDl7YzjRT7fz1ckNP8Wj3s hK5jJOt7p1LmCJ8zj3G3dWp54xFVho4GxoAXR6AxfzGvw2+CnMGhhW+BOWmqu78ByuBU Zn8ix63R+OBH6pBQ4xNgyyrH74I+62WjGL3eSKhrgeEk4kn49a4CmcqIyVY9F3jxCQJG q9iQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1697178373; x=1697783173; 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=2X7qJvQ6GXyfuyA0QqKptNQiuqM4zphvU4CZUvLJrBI=; b=beXGrZ4oX6Pq3f7gjnFwqbTPLh4LZtRUAR8WJrrDV67o3FlgJltFYHwq8NcHdDNCxc CmBboPJxznzrUT9mibMb7al4WBC7tqTjyIiavu7nAYv0yly4j9ALV1R8VhZeeDD/97yz Iny8Lupwqqo6SaWb8KRxD8CWIgfhMvccBge7Q2NvJKykYkM4X/07knheNBWXz1O1+cmb g7FAjC4ikit4CmLaNEJ/WDwU00brIncPmNbexzKIrX+X4LhdIuND9dp5KoiXaDnYmZnX QbR7zYUz1IWARhD0E9mWGnvzBF3t7ju31zNJ8dWsCjkaFiP2dRcAc5Ajj1X8/5kXdtzy /Dlw== X-Gm-Message-State: AOJu0Yzse3tzljxjsdMd4OD8vmuxjfHzCNQM8uTt7KoFMgiP+qz/EYCf xxR8qLxl13A3Mj/wr6WowMghhY3O/LlWONl2Fps= X-Google-Smtp-Source: AGHT+IH2tzfhWnoYq/pVGNX1HmTUuCZmoRWOY4iH+ReQK5c6izpHzdgYiTM+3TMmCq0sEUfSfVGWkECVr+juEDu5uAU= X-Received: by 2002:a67:fe88:0:b0:452:513a:ac1d with SMTP id b8-20020a67fe88000000b00452513aac1dmr20507843vsr.15.1697178373240; Thu, 12 Oct 2023 23:26:13 -0700 (PDT) MIME-Version: 1.0 References: <94f64d1f-b8c0-b0c5-98bc-0793a34e0851@kimmet.dk> <4e6efd382b3195eb7ea438b7219cc94d9399c0bd.camel@cybertec.at> <147ac793f2c3a9a57764fba84988a4b5e843443b.camel@cybertec.at> <4cdc292e-3234-a03d-107d-31cf8b721cd4@kimmet.dk> <36ea800b7b537c89d92bcd109b3858c72c16a14c.camel@cybertec.at> In-Reply-To: <36ea800b7b537c89d92bcd109b3858c72c16a14c.camel@cybertec.at> From: jian he Date: Fri, 13 Oct 2023 14:26:01 +0800 Message-ID: Subject: Re: [PATCH] Add support function for containment operators To: Laurenz Albe Cc: Kim Johan Andersson , pgsql-hackers@lists.postgresql.org Content-Type: multipart/mixed; boundary="0000000000000ee01906079322af" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000000ee01906079322af Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Tue, Aug 1, 2023 at 10:07=E2=80=AFAM Laurenz Albe wrote: > > > > > > > I had an idea about this: > > > So far, you only consider constant ranges. But if we have a STABLE r= ange > > > expression, you could use an index scan for "expr <@ range", for exam= ple > > > Index Cond (expr >=3D lower(range) AND expr < upper(range)). > > > The above part, not sure how to implement it, not sure it is doable. Refactor: drop SupportRequestIndexCondition and related code, since mentioned in upthread, it's dead code. refactor the regression test. (since data types with infinity cover more cases than int4range, so I deleted some tests). now there are 3 helper functions (build_bound_expr, find_simplified_clause, match_support_request), 2 entry functions (elem_contained_by_range_support, range_contains_elem_support) Collation problem seems solved. Putting the following test on the src/test/regress/sql/rangetypes.sql will not work. Maybe because of the order of the regression test, in SQL-ASCII encoding, I cannot create collation=3D"cs-CZ-x-icu". drop type if EXISTS textrange1, textrange2; drop table if EXISTS collate_test1, collate_test2; CREATE TYPE textrange1 AS RANGE (SUBTYPE =3D text, collation=3D"C"); create type textrange2 as range(subtype=3Dtext, collation=3D"cs-CZ-x-icu"); CREATE TABLE collate_test1 (b text COLLATE "en-x-icu" NOT NULL); INSERT INTO collate_test1(b) VALUES ('a'), ('c'), ('d'), ('ch'); CREATE TABLE collate_test2 (b text NOT NULL); INSERT INTO collate_test2(b) VALUES ('a'), ('c'), ('d'), ('ch'); --should include 'ch' SELECT * FROM collate_test1 WHERE b <@ textrange1('a', 'd'); --should not include 'ch' SELECT * FROM collate_test1 WHERE b <@ textrange2('a', 'd'); --should include 'ch' SELECT * FROM collate_test2 WHERE b <@ textrange1('a', 'd'); --should not include 'ch' SELECT * FROM collate_test2 WHERE b <@ textrange2('a', 'd'); ----------------- --0000000000000ee01906079322af Content-Type: text/x-patch; charset="US-ASCII"; name="v2-0001-Optimize-qual-cases-like-Expr-RangeConst-and-Rang.patch" Content-Disposition: attachment; filename="v2-0001-Optimize-qual-cases-like-Expr-RangeConst-and-Rang.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lno84abg0 RnJvbSBiY2FlN2Y4YTA2NDBiNDhiMDRmMjQzNjYwNTM5ZTg2NzBkZTQzZDQxIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBwZ2FkZGljdCA8amlhbi51bml2ZXJzYWxpdHlAZ21haWwuY29t PgpEYXRlOiBGcmksIDEzIE9jdCAyMDIzIDEyOjQzOjQxICswODAwClN1YmplY3Q6IFtQQVRDSCB2 MiAxLzFdIE9wdGltaXplIHF1YWwgY2FzZXMgbGlrZSBFeHByIDxAIFJhbmdlQ29uc3QgYW5kCiBS YW5nZUNvbnN0IEA+IEV4cHIKClByZXZpb3VzbHkgdGhlc2UgdHdvIHF1YWxzIHdpbGwgYmUgcHJv Y2Vzc2VkIGFzIGlzLgpXaXRoIHRoaXMgcGF0Y2gsIGFkZGluZyBwcm9zdXBwb3J0CmZ1bmN0aW9u IHRvIHJhbmdlX2NvbnRhaW5zX2VsZW0sIGVsZW1fY29udGFpbmVkX2J5X3JhbmdlLgoKU28gY2Fz ZXMgbGlrZSBFeHByIDxAIHJhbmdlQ09uc3QsIHJhbmdlQ29uc3QgQD4gZXhwcgp3aWxsIGJlIHJl d3JpdHRlbiB0byAiZXhwciBvcHIgcmFuZ2VfbG93ZXJfYm91bmQgYW5kIGV4cHIgb3ByCnJhbmdl X3VwcGVyX2JvdW5kIi4KCkV4cHIgPEAgcmFuZ2VDb25zdCB3aWxsIGJlIGxvZ2ljYWxseSBlcXVp dmFsZW50IHRvIHJhbmdlQ29uc3QgQD4gRXhwciwKaWYgcmFuZ2VDb25zdCBpcyB0aGUgc2FtZS4g YWRkZWQgc29tZSB0ZXN0cyB0byB2YWxpZGF0ZSB0aGUgZ2VuZXJhdGVkCnBsYW4uCi0tLQogc3Jj L2JhY2tlbmQvdXRpbHMvYWR0L3JhbmdldHlwZXMuYyAgICAgICAgICB8IDE5OSArKysrKysrKysr KysrKysrKysrLQogc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3JhbmdldHlwZXNfc2VsZnVuY3MuYyB8 ICAgNiArLQogc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdCAgICAgICAgICAgICB8ICAx MiArLQogc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9yYW5nZXR5cGVzLm91dCAgICB8IDE5NCAr KysrKysrKysrKysrKysrKysrCiBzcmMvdGVzdC9yZWdyZXNzL3NxbC9yYW5nZXR5cGVzLnNxbCAg ICAgICAgIHwgMTAxICsrKysrKysrKysKIDUgZmlsZXMgY2hhbmdlZCwgNTA1IGluc2VydGlvbnMo KyksIDcgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3Jh bmdldHlwZXMuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9yYW5nZXR5cGVzLmMKaW5kZXggZDY1 ZTU2MjUuLjY0N2JkNWU0IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9hZHQvcmFuZ2V0 eXBlcy5jCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9yYW5nZXR5cGVzLmMKQEAgLTMxLDEz ICszMSwxOSBAQAogI2luY2x1ZGUgInBvc3RncmVzLmgiCiAKICNpbmNsdWRlICJhY2Nlc3MvdHVw bWFjcy5oIgorI2luY2x1ZGUgImFjY2Vzcy9zdHJhdG51bS5oIgogI2luY2x1ZGUgImNvbW1vbi9o YXNoZm4uaCIKICNpbmNsdWRlICJsaWIvc3RyaW5naW5mby5oIgogI2luY2x1ZGUgImxpYnBxL3Bx Zm9ybWF0LmgiCiAjaW5jbHVkZSAibWlzY2FkbWluLmgiCisjaW5jbHVkZSAibm9kZXMvc3VwcG9y dG5vZGVzLmgiCisjaW5jbHVkZSAibm9kZXMvbWFrZWZ1bmNzLmgiCisjaW5jbHVkZSAibm9kZXMv bm9kZUZ1bmNzLmgiCisjaW5jbHVkZSAibm9kZXMvcGdfbGlzdC5oIgogI2luY2x1ZGUgIm5vZGVz L21pc2Nub2Rlcy5oIgogI2luY2x1ZGUgInBvcnQvcGdfYml0dXRpbHMuaCIKICNpbmNsdWRlICJ1 dGlscy9idWlsdGlucy5oIgorI2luY2x1ZGUgInV0aWxzL2ZtZ3JvaWRzLmgiCiAjaW5jbHVkZSAi dXRpbHMvZGF0ZS5oIgogI2luY2x1ZGUgInV0aWxzL2xzeXNjYWNoZS5oIgogI2luY2x1ZGUgInV0 aWxzL3JhbmdldHlwZXMuaCIKQEAgLTY5LDcgKzc1LDExIEBAIHN0YXRpYyBTaXplIGRhdHVtX2Nv bXB1dGVfc2l6ZShTaXplIGRhdGFfbGVuZ3RoLCBEYXR1bSB2YWwsIGJvb2wgdHlwYnl2YWwsCiAJ CQkJCQkJICAgY2hhciB0eXBhbGlnbiwgaW50MTYgdHlwbGVuLCBjaGFyIHR5cHN0b3JhZ2UpOwog c3RhdGljIFBvaW50ZXIgZGF0dW1fd3JpdGUoUG9pbnRlciBwdHIsIERhdHVtIGRhdHVtLCBib29s IHR5cGJ5dmFsLAogCQkJCQkJICAgY2hhciB0eXBhbGlnbiwgaW50MTYgdHlwbGVuLCBjaGFyIHR5 cHN0b3JhZ2UpOwotCitzdGF0aWMgRXhwciAqYnVpbGRfYm91bmRfZXhwcihPaWQgb3BmYW1pbHks IFR5cGVDYWNoZUVudHJ5ICp0eXBlQ2FjaGUsCisJCQkJCQkJICBib29sIGlzTG93ZXJCb3VuZCwg Ym9vbCBpc0luY2x1c2l2ZSwKKwkJCQkJCQkgIERhdHVtIHZhbCwgRXhwciAqb3RoZXJFeHByLCBP aWQgcm5nX2NvbGxhdGlvbik7CitzdGF0aWMgTm9kZSAqZmluZF9zaW1wbGlmaWVkX2NsYXVzZShD b25zdCAqcmFuZ2VDb25zdCwgRXhwciAqb3RoZXJFeHByKTsKK3N0YXRpYyBOb2RlICptYXRjaF9z dXBwb3J0X3JlcXVlc3QoTm9kZSAqcmF3cmVxKTsKIAogLyoKICAqLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNTU4LDcgKzU2OCw2 IEBAIGVsZW1fY29udGFpbmVkX2J5X3JhbmdlKFBHX0ZVTkNUSU9OX0FSR1MpCiAJUEdfUkVUVVJO X0JPT0wocmFuZ2VfY29udGFpbnNfZWxlbV9pbnRlcm5hbCh0eXBjYWNoZSwgciwgdmFsKSk7CiB9 CiAKLQogLyogcmFuZ2UsIHJhbmdlIC0+IGJvb2wgZnVuY3Rpb25zICovCiAKIC8qIGVxdWFsaXR5 IChpbnRlcm5hbCB2ZXJzaW9uKSAqLwpAQCAtMjE3Myw2ICsyMTgyLDI5IEBAIG1ha2VfZW1wdHlf cmFuZ2UoVHlwZUNhY2hlRW50cnkgKnR5cGNhY2hlKQogCXJldHVybiBtYWtlX3JhbmdlKHR5cGNh Y2hlLCAmbG93ZXIsICZ1cHBlciwgdHJ1ZSwgTlVMTCk7CiB9CiAKKy8qCisgKiBQbGFubmVyIHN1 cHBvcnQgZnVuY3Rpb24gZm9yIGVsZW1fY29udGFpbmVkX2J5X3JhbmdlIG9wZXJhdG9yCisgKi8K K0RhdHVtCitlbGVtX2NvbnRhaW5lZF9ieV9yYW5nZV9zdXBwb3J0KFBHX0ZVTkNUSU9OX0FSR1Mp Cit7CisJTm9kZQkgICAqcmF3cmVxID0gKE5vZGUgKikgUEdfR0VUQVJHX1BPSU5URVIoMCk7CisJ Tm9kZQkgICAqcmV0ID0gbWF0Y2hfc3VwcG9ydF9yZXF1ZXN0KHJhd3JlcSk7CisKKwlQR19SRVRV Uk5fUE9JTlRFUihyZXQpOworfQorCisvKgorICogUGxhbm5lciBzdXBwb3J0IGZ1bmN0aW9uIGZv ciByYW5nZV9jb250YWluc19lbGVtIG9wZXJhdG9yCisgKi8KK0RhdHVtCityYW5nZV9jb250YWlu c19lbGVtX3N1cHBvcnQoUEdfRlVOQ1RJT05fQVJHUykKK3sKKwlOb2RlCSAgICpyYXdyZXEgPSAo Tm9kZSAqKSBQR19HRVRBUkdfUE9JTlRFUigwKTsKKwlOb2RlCSAgICpyZXQgPSBtYXRjaF9zdXBw b3J0X3JlcXVlc3QocmF3cmVxKTsKKworCVBHX1JFVFVSTl9QT0lOVEVSKHJldCk7Cit9CiAKIC8q CiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KQEAgLTI3MTQsMyArMjc0NiwxNjYgQEAgZGF0dW1fd3JpdGUoUG9pbnRlciBwdHIsIERh dHVtIGRhdHVtLCBib29sIHR5cGJ5dmFsLCBjaGFyIHR5cGFsaWduLAogCiAJcmV0dXJuIHB0cjsK IH0KKy8qCisgKiBidWlsZCAoRXhwciBPcGVyYXRvciBSYW5nZV9ib3VuZCkgZXhwcmVzc2lvbi4g c29tZXRoaW5nIGxpa2U6IGV4cHIgPj0gbG93ZXIocmFuZ2UpCisgKiBpZiBvcGVyYXRvciBib3Ro IHNpZGVzIGhhdmUgY29sbGF0aW9uLCBvcGVyYXRvciBzaG91bGQgdXNlIChyaWdodCkgcmFuZ2Un cyBjb2xsYXRpb24KKyAqCisqLworc3RhdGljIEV4cHIgKgorYnVpbGRfYm91bmRfZXhwcihPaWQg b3BmYW1pbHksIFR5cGVDYWNoZUVudHJ5ICp0eXBlQ2FjaGUsCisJCQkJCWJvb2wgaXNMb3dlckJv dW5kLCBib29sIGlzSW5jbHVzaXZlLAorCQkJCQlEYXR1bSB2YWwsIEV4cHIgKm90aGVyRXhwciwg T2lkIHJuZ19jb2xsYXRpb24pCit7CisJT2lkCQkJZWxlbVR5cGUgPSB0eXBlQ2FjaGUtPnR5cGVf aWQ7CisJaW50MTYJCWVsZW1UeXBlTGVuID0gdHlwZUNhY2hlLT50eXBsZW47CisJYm9vbAkJZWxl bUJ5VmFsdWUgPSB0eXBlQ2FjaGUtPnR5cGJ5dmFsOworCU9pZAkJCWVsZW1Db2xsYXRpb24gPSB0 eXBlQ2FjaGUtPnR5cGNvbGxhdGlvbjsKKwlpbnQxNgkJc3RyYXRlZ3k7CisJT2lkCQkJb3Byb2lk OworCUV4cHIJICAgKmNvbnN0RXhwcjsKKworCWlmIChpc0xvd2VyQm91bmQpCisJCXN0cmF0ZWd5 ID0gaXNJbmNsdXNpdmUgPyBCVEdyZWF0ZXJFcXVhbFN0cmF0ZWd5TnVtYmVyIDogQlRHcmVhdGVy U3RyYXRlZ3lOdW1iZXI7CisJZWxzZQorCQlzdHJhdGVneSA9IGlzSW5jbHVzaXZlID8gQlRMZXNz RXF1YWxTdHJhdGVneU51bWJlciA6IEJUTGVzc1N0cmF0ZWd5TnVtYmVyOworCisJb3Byb2lkID0g Z2V0X29wZmFtaWx5X21lbWJlcihvcGZhbWlseSwgZWxlbVR5cGUsIGVsZW1UeXBlLCBzdHJhdGVn eSk7CisKKwlpZiAoIU9pZElzVmFsaWQob3Byb2lkKSkKKwkJcmV0dXJuIE5VTEw7CisKKwljb25z dEV4cHIgPSAoRXhwciAqKSBtYWtlQ29uc3QoZWxlbVR5cGUsCisJCQkJCQkJCSAgIC0xLAorCQkJ CQkJCQkgICBlbGVtQ29sbGF0aW9uLAorCQkJCQkJCQkgICBlbGVtVHlwZUxlbiwKKwkJCQkJCQkJ ICAgdmFsLAorCQkJCQkJCQkgICBmYWxzZSwKKwkJCQkJCQkJICAgZWxlbUJ5VmFsdWUpOworCisJ cmV0dXJuIG1ha2Vfb3BjbGF1c2Uob3Byb2lkLAorCQkJCQkJIEJPT0xPSUQsCisJCQkJCQkgZmFs c2UsCisJCQkJCQkgb3RoZXJFeHByLAorCQkJCQkJIGNvbnN0RXhwciwKKwkJCQkJCSBJbnZhbGlk T2lkLAorCQkJCQkJIHJuZ19jb2xsYXRpb24KKwkJCQkJCSApOworfQorCisvKgorICogU3VwcG9y dHMgYm90aCB0aGUgRUxFTV9DT05UQUlORURfQllfUkFOR0UgYW5kIFJBTkdFX0NPTlRBSU5TX0VM RU0gY2FzZXMuCisgKgorICovCitzdGF0aWMgTm9kZSAqCitmaW5kX3NpbXBsaWZpZWRfY2xhdXNl KENvbnN0ICpyYW5nZUNvbnN0LCBFeHByICpvdGhlckV4cHIpCit7CisJUmFuZ2VUeXBlICAqcmFu Z2UgPSBEYXR1bUdldFJhbmdlVHlwZVAocmFuZ2VDb25zdC0+Y29uc3R2YWx1ZSk7CisJVHlwZUNh Y2hlRW50cnkgKnJhbmdldHlwY2FjaGUgPSBsb29rdXBfdHlwZV9jYWNoZShSYW5nZVR5cGVHZXRP aWQocmFuZ2UpLCBUWVBFQ0FDSEVfUkFOR0VfSU5GTyk7CisJUmFuZ2VCb3VuZAlsb3dlcjsKKwlS YW5nZUJvdW5kCXVwcGVyOworCWJvb2wJCWVtcHR5OworCU9pZAkJCXJuZ19jb2xsYXRpb247CisK KwlyYW5nZV9kZXNlcmlhbGl6ZShyYW5nZXR5cGNhY2hlLCByYW5nZSwgJmxvd2VyLCAmdXBwZXIs ICZlbXB0eSk7CisKKwlybmdfY29sbGF0aW9uID0gcmFuZ2V0eXBjYWNoZS0+cm5nX2NvbGxhdGlv bjsKKworCWlmIChlbXB0eSkKKwl7CisJCS8qIElmIHRoZSByYW5nZSBpcyBlbXB0eSwgdGhlbiB0 aGVyZSBjYW4gYmUgbm8gbWF0Y2hlcy4gKi8KKwkJcmV0dXJuIG1ha2VCb29sQ29uc3QoZmFsc2Us IGZhbHNlKTsKKwl9CisJZWxzZSBpZiAobG93ZXIuaW5maW5pdGUgJiYgdXBwZXIuaW5maW5pdGUp CisJeworCQkvKiBUaGUgcmFuZ2UgaGFzIG5vIGJvdW5kcywgc28gbWF0Y2hlcyBldmVyeXRoaW5n LiAqLworCQlyZXR1cm4gbWFrZUJvb2xDb25zdCh0cnVlLCBmYWxzZSk7CisJfQorCWVsc2UKKwl7 CisJCS8qIEF0IGxlYXN0IG9uZSBib3VuZCBpcyBhdmFpbGFibGUsIHdlIGhhdmUgc29tZXRoaW5n IHRvIHdvcmsgd2l0aC4gKi8KKwkJVHlwZUNhY2hlRW50cnkgKmVsZW1UeXBjYWNoZSA9IGxvb2t1 cF90eXBlX2NhY2hlKHJhbmdldHlwY2FjaGUtPnJuZ2VsZW10eXBlLT50eXBlX2lkLCBUWVBFQ0FD SEVfQlRSRUVfT1BGQU1JTFkpOworCQlFeHByCSAgICpsb3dlckV4cHIgPSBOVUxMOworCQlFeHBy CSAgICp1cHBlckV4cHIgPSBOVUxMOworCisJCS8qIFRoZXJlIG1pZ2h0IG5vdCBiZSBhbiBvcGVy YXRvciBmYW1pbHkgYXZhaWxhYmxlIGZvciB0aGlzIGVsZW1lbnQgKi8KKwkJaWYgKCFPaWRJc1Zh bGlkKGVsZW1UeXBjYWNoZS0+YnRyZWVfb3BmKSkKKwkJCXJldHVybiBOVUxMOworCisJCWlmICgh bG93ZXIuaW5maW5pdGUpCisJCXsKKwkJCWxvd2VyRXhwciA9IGJ1aWxkX2JvdW5kX2V4cHIoZWxl bVR5cGNhY2hlLT5idHJlZV9vcGYsCisJCQkJCQkJCQkJIGVsZW1UeXBjYWNoZSwKKwkJCQkJCQkJ CQkgdHJ1ZSwKKwkJCQkJCQkJCQkgbG93ZXIuaW5jbHVzaXZlLAorCQkJCQkJCQkJCSBsb3dlci52 YWwsCisJCQkJCQkJCQkJIG90aGVyRXhwciwKKwkJCQkJCQkJCQkgcm5nX2NvbGxhdGlvbgorCQkJ CQkJCQkJCSApOworCQl9CisKKwkJaWYgKCF1cHBlci5pbmZpbml0ZSkKKwkJeworCQkJdXBwZXJF eHByID0gYnVpbGRfYm91bmRfZXhwcihlbGVtVHlwY2FjaGUtPmJ0cmVlX29wZiwKKwkJCQkJCQkJ CQkgZWxlbVR5cGNhY2hlLAorCQkJCQkJCQkJCSBmYWxzZSwKKwkJCQkJCQkJCQkgdXBwZXIuaW5j bHVzaXZlLAorCQkJCQkJCQkJCSB1cHBlci52YWwsCisJCQkJCQkJCQkJIG90aGVyRXhwciwKKwkJ CQkJCQkJCQkgcm5nX2NvbGxhdGlvbgorCQkJCQkJCQkJCSApOworCQl9CisKKwkJaWYgKGxvd2Vy RXhwciAhPSBOVUxMICYmIHVwcGVyRXhwciAhPSBOVUxMKQorCQkJcmV0dXJuIChOb2RlICopIG1h a2VCb29sRXhwcihBTkRfRVhQUiwgbGlzdF9tYWtlMihsb3dlckV4cHIsIHVwcGVyRXhwciksIC0x KTsKKwkJZWxzZSBpZiAobG93ZXJFeHByICE9IE5VTEwpCisJCQlyZXR1cm4gKE5vZGUgKikgbG93 ZXJFeHByOworCQllbHNlIGlmICh1cHBlckV4cHIgIT0gTlVMTCkKKwkJCXJldHVybiAoTm9kZSAq KSB1cHBlckV4cHI7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBOb2RlICoKK21h dGNoX3N1cHBvcnRfcmVxdWVzdChOb2RlICpyYXdyZXEpCit7CisJaWYgKElzQShyYXdyZXEsIFN1 cHBvcnRSZXF1ZXN0U2ltcGxpZnkpKQorCXsKKwkJU3VwcG9ydFJlcXVlc3RTaW1wbGlmeSAqcmVx ID0gKFN1cHBvcnRSZXF1ZXN0U2ltcGxpZnkgKikgcmF3cmVxOworCQlGdW5jRXhwciAgICpmZXhw ciA9IHJlcS0+ZmNhbGw7CisJCU5vZGUJICAgKmxlZnRvcDsKKwkJTm9kZQkgICAqcmlnaHRvcDsK KwkJQ29uc3QJICAgKnJhbmdlQ29uc3Q7CisJCUV4cHIJICAgKm90aGVyRXhwcjsKKworCQlBc3Nl cnQobGlzdF9sZW5ndGgoZmV4cHItPmFyZ3MpID09IDIpOworCisJCWxlZnRvcCA9IGxpbml0aWFs KGZleHByLT5hcmdzKTsKKwkJcmlnaHRvcCA9IGxzZWNvbmQoZmV4cHItPmFyZ3MpOworCisJCXN3 aXRjaCAoZmV4cHItPmZ1bmNpZCkKKwkJeworCQkJY2FzZSBGX0VMRU1fQ09OVEFJTkVEX0JZX1JB TkdFOgorCQkJCWlmICghSXNBKHJpZ2h0b3AsIENvbnN0KSB8fCAoKENvbnN0ICopIHJpZ2h0b3Ap LT5jb25zdGlzbnVsbCkKKwkJCQkJcmV0dXJuIE5VTEw7CisKKwkJCQlyYW5nZUNvbnN0ID0gKENv bnN0ICopIHJpZ2h0b3A7CisJCQkJb3RoZXJFeHByID0gKEV4cHIgKikgbGVmdG9wOworCQkJCWJy ZWFrOworCisJCQljYXNlIEZfUkFOR0VfQ09OVEFJTlNfRUxFTToKKwkJCQlpZiAoIUlzQShsZWZ0 b3AsIENvbnN0KSB8fCAoKENvbnN0ICopIGxlZnRvcCktPmNvbnN0aXNudWxsKQorCQkJCQlyZXR1 cm4gTlVMTDsKKworCQkJCXJhbmdlQ29uc3QgPSAoQ29uc3QgKikgbGVmdG9wOworCQkJCW90aGVy RXhwciA9IChFeHByICopIHJpZ2h0b3A7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJ cmV0dXJuIE5VTEw7CisJCX0KKworCQlyZXR1cm4gZmluZF9zaW1wbGlmaWVkX2NsYXVzZShyYW5n ZUNvbnN0LCBvdGhlckV4cHIpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KXCBObyBuZXdsaW5lIGF0 IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9hZHQvcmFuZ2V0eXBl c19zZWxmdW5jcy5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3JhbmdldHlwZXNfc2VsZnVuY3Mu YwppbmRleCBmYmFiYjNlMS4uN2M0Y2YwYWUgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxz L2FkdC9yYW5nZXR5cGVzX3NlbGZ1bmNzLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3Jh bmdldHlwZXNfc2VsZnVuY3MuYwpAQCAtMTk2LDkgKzE5Niw5IEBAIHJhbmdlc2VsKFBHX0ZVTkNU SU9OX0FSR1MpCiAJZWxzZSBpZiAob3BlcmF0b3IgPT0gT0lEX1JBTkdFX0VMRU1fQ09OVEFJTkVE X09QKQogCXsKIAkJLyoKLQkJICogSGVyZSwgdGhlIFZhciBpcyB0aGUgZWxlbSwgbm90IHRoZSBy YW5nZS4gIEZvciBub3cgd2UganVzdCBwdW50IGFuZAotCQkgKiByZXR1cm4gdGhlIGRlZmF1bHQg ZXN0aW1hdGUuICBJbiBmdXR1cmUgd2UgY291bGQgZGlzYXNzZW1ibGUgdGhlCi0JCSAqIHJhbmdl IGNvbnN0YW50IGFuZCBhcHBseSBzY2FsYXJpbmVxc2VsIC4uLgorCQkgKiBIZXJlLCB0aGUgVmFy IGlzIHRoZSBlbGVtLCBub3QgdGhlIHJhbmdlLgorCQkgKiBUaGUgc3VwcG9ydCBmdW5jdGlvbiBp biByYW5nZXR5cGVzLmMgc2hvdWxkIGhhdmUgc2ltcGxpZmllZCB0aGlzIGNhc2UsCisJCSAqIGVu YWJsaW5nIHRoZSBjbGF1c2VzZWwuYyBtYWNoaW5lcnkgdG8gaGFuZGxlIGl0LgogCQkgKi8KIAl9 CiAJZWxzZSBpZiAoKChDb25zdCAqKSBvdGhlciktPmNvbnN0dHlwZSA9PSB2YXJkYXRhLnZhcnR5 cGUpCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0IGIvc3JjL2lu Y2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdAppbmRleCBmMGI3YjljYi4uMzc3N2NlNGEgMTAwNjQ0 Ci0tLSBhL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQKKysrIGIvc3JjL2luY2x1ZGUv Y2F0YWxvZy9wZ19wcm9jLmRhdApAQCAtMTA0NjgsMTMgKzEwNDY4LDE1IEBACiAgIHByb2FyZ3R5 cGVzID0+ICdhbnlyYW5nZSBhbnlyYW5nZScsIHByb3NyYyA9PiAncmFuZ2Vfb3ZlcmxhcHMnIH0s CiB7IG9pZCA9PiAnMzg1OCcsCiAgIHByb25hbWUgPT4gJ3JhbmdlX2NvbnRhaW5zX2VsZW0nLCBw cm9yZXR0eXBlID0+ICdib29sJywKLSAgcHJvYXJndHlwZXMgPT4gJ2FueXJhbmdlIGFueWVsZW1l bnQnLCBwcm9zcmMgPT4gJ3JhbmdlX2NvbnRhaW5zX2VsZW0nIH0sCisgIHByb2FyZ3R5cGVzID0+ ICdhbnlyYW5nZSBhbnllbGVtZW50JywgcHJvc3JjID0+ICdyYW5nZV9jb250YWluc19lbGVtJywK KyAgcHJvc3VwcG9ydCA9PiAncmFuZ2VfY29udGFpbnNfZWxlbV9zdXBwb3J0JyB9LAogeyBvaWQg PT4gJzM4NTknLAogICBwcm9uYW1lID0+ICdyYW5nZV9jb250YWlucycsIHByb3JldHR5cGUgPT4g J2Jvb2wnLAogICBwcm9hcmd0eXBlcyA9PiAnYW55cmFuZ2UgYW55cmFuZ2UnLCBwcm9zcmMgPT4g J3JhbmdlX2NvbnRhaW5zJyB9LAogeyBvaWQgPT4gJzM4NjAnLAogICBwcm9uYW1lID0+ICdlbGVt X2NvbnRhaW5lZF9ieV9yYW5nZScsIHByb3JldHR5cGUgPT4gJ2Jvb2wnLAotICBwcm9hcmd0eXBl cyA9PiAnYW55ZWxlbWVudCBhbnlyYW5nZScsIHByb3NyYyA9PiAnZWxlbV9jb250YWluZWRfYnlf cmFuZ2UnIH0sCisgIHByb2FyZ3R5cGVzID0+ICdhbnllbGVtZW50IGFueXJhbmdlJywgcHJvc3Jj ID0+ICdlbGVtX2NvbnRhaW5lZF9ieV9yYW5nZScsCisgIHByb3N1cHBvcnQgPT4gJ2VsZW1fY29u dGFpbmVkX2J5X3JhbmdlX3N1cHBvcnQnIH0sCiB7IG9pZCA9PiAnMzg2MScsCiAgIHByb25hbWUg PT4gJ3JhbmdlX2NvbnRhaW5lZF9ieScsIHByb3JldHR5cGUgPT4gJ2Jvb2wnLAogICBwcm9hcmd0 eXBlcyA9PiAnYW55cmFuZ2UgYW55cmFuZ2UnLCBwcm9zcmMgPT4gJ3JhbmdlX2NvbnRhaW5lZF9i eScgfSwKQEAgLTEwNDk2LDYgKzEwNDk4LDEyIEBACiB7IG9pZCA9PiAnMzg2NycsCiAgIHByb25h bWUgPT4gJ3JhbmdlX3VuaW9uJywgcHJvcmV0dHlwZSA9PiAnYW55cmFuZ2UnLAogICBwcm9hcmd0 eXBlcyA9PiAnYW55cmFuZ2UgYW55cmFuZ2UnLCBwcm9zcmMgPT4gJ3JhbmdlX3VuaW9uJyB9LAor eyBvaWQgPT4gJzk5OTgnLCBkZXNjciA9PiAnUGxhbm5lciBzdXBwb3J0IGZ1bmN0aW9uIGZvciBy YW5nZV9jb250YWluc19lbGVtIG9wZXJhdG9yJywKKyAgcHJvbmFtZSA9PiAncmFuZ2VfY29udGFp bnNfZWxlbV9zdXBwb3J0JywgcHJvcmV0dHlwZSA9PiAnaW50ZXJuYWwnLAorICBwcm9hcmd0eXBl cyA9PiAnaW50ZXJuYWwnLCBwcm9zcmMgPT4gJ3JhbmdlX2NvbnRhaW5zX2VsZW1fc3VwcG9ydCcg fSwKK3sgb2lkID0+ICc5OTk5JywgZGVzY3IgPT4gJ1BsYW5uZXIgc3VwcG9ydCBmdW5jdGlvbiBm b3IgZWxlbV9jb250YWluZWRfYnlfcmFuZ2Ugb3BlcmF0b3InLAorICBwcm9uYW1lID0+ICdlbGVt X2NvbnRhaW5lZF9ieV9yYW5nZV9zdXBwb3J0JywgcHJvcmV0dHlwZSA9PiAnaW50ZXJuYWwnLAor ICBwcm9hcmd0eXBlcyA9PiAnaW50ZXJuYWwnLCBwcm9zcmMgPT4gJ2VsZW1fY29udGFpbmVkX2J5 X3JhbmdlX3N1cHBvcnQnIH0sCiB7IG9pZCA9PiAnNDA1NycsCiAgIGRlc2NyID0+ICd0aGUgc21h bGxlc3QgcmFuZ2Ugd2hpY2ggaW5jbHVkZXMgYm90aCBvZiB0aGUgZ2l2ZW4gcmFuZ2VzJywKICAg cHJvbmFtZSA9PiAncmFuZ2VfbWVyZ2UnLCBwcm9yZXR0eXBlID0+ICdhbnlyYW5nZScsCmRpZmYg LS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3JhbmdldHlwZXMub3V0IGIvc3JjL3Rl c3QvcmVncmVzcy9leHBlY3RlZC9yYW5nZXR5cGVzLm91dAppbmRleCBlZTAyZmYwMS4uMDJmM2Yy OWUgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvcmFuZ2V0eXBlcy5vdXQK KysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9yYW5nZXR5cGVzLm91dApAQCAtMTgzNCwz ICsxODM0LDE5NyBAQCBjcmVhdGUgZnVuY3Rpb24gdGFibGVfZmFpbChpIGFueWVsZW1lbnQpIHJl dHVybnMgdGFibGUoaSBhbnllbGVtZW50LCByIGFueXJhbmdlKQogICBhcyAkJCBzZWxlY3QgJDEs ICdbMSwxMF0nICQkIGxhbmd1YWdlIHNxbDsKIEVSUk9SOiAgY2Fubm90IGRldGVybWluZSByZXN1 bHQgZGF0YSB0eXBlCiBERVRBSUw6ICBBIHJlc3VsdCBvZiB0eXBlIGFueXJhbmdlIHJlcXVpcmVz IGF0IGxlYXN0IG9uZSBpbnB1dCBvZiB0eXBlIGFueXJhbmdlIG9yIGFueW11bHRpcmFuZ2UuCist LQorLS0gVGVzdCBzdXBwb3J0IGZ1bmN0aW9uCistLQorLS0gVGVzdCBhY3R1YWwgcmVzdWx0cywg YXMgd2VsbCBhcyBlc3RpbWF0ZXMuCitDUkVBVEUgVEFCTEUgZGF0ZV9zdXBwb3J0X3Rlc3QgQVMg U0VMRUNUICcyMDAwLTAxLTAxJzo6REFURSArIGcgQVMgc29tZV9kYXRlIEZST00KKwkJCQlnZW5l cmF0ZV9zZXJpZXMoLTEwMDAsIDEwMDApIHN1YihnKTsKK0NSRUFURSBVTklRVUUgSU5ERVggT04g ZGF0ZV9zdXBwb3J0X3Rlc3QoIHNvbWVfZGF0ZSApOworSU5TRVJUIElOVE8gZGF0ZV9zdXBwb3J0 X3Rlc3QgdmFsdWVzICggJy1pbmZpbml0eScgKSwgKCAnaW5maW5pdHknICk7CitBTkFMWVpFIGRh dGVfc3VwcG9ydF90ZXN0OworY3JlYXRlIG9yIFJFUExBQ0UgZnVuY3Rpb24gY2hlY2sycGxhbih0 ZXh0LCB0ZXh0KQorUkVUVVJOUyB2b2lkCitBUyAkJAorICBkZWNsYXJlIGxuMSB0ZXh0IGRlZmF1 bHQgJyc7CisgICAgICAgICAgbG4yIHRleHQgZGVmYXVsdCAnJzsKK0JFR0lOCisgIGV4ZWN1dGUg JDEgaW50byBsbjE7CisgIGV4ZWN1dGUgJDIgaW50byBsbjI7CisgICAgaWYgbG4xID0gbG4yIGFu ZCBsbjEgIT0gJycgYW5kIGxuMiAhPSAnJyB0aGVuCisgICAgICBSQUlTRSBOT1RJQ0UgJ3RoZXNl IHR3byBxdWVyeScncGxhbiBpcyB0aGUgc2FtZSc7CisgICAgZW5kIGlmOworRU5EOworJCQKK0xB TkdVQUdFIHBscGdzcWw7CistLSBFbXB0eSByYW5nZXMKK0VYUExBSU4gKENPU1RTIE9GRikKK1NF TEVDVCBzb21lX2RhdGUgRlJPTSBkYXRlX3N1cHBvcnRfdGVzdAorV0hFUkUgc29tZV9kYXRlIDxA IGRhdGVyYW5nZSgnMjAwMC0wMS0wMScsICcyMDAwLTAxLTAxJywgJygpJyk7CisgICAgICAgIFFV RVJZIFBMQU4gICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBSZXN1bHQKKyAg IE9uZS1UaW1lIEZpbHRlcjogZmFsc2UKKygyIHJvd3MpCisKKy0tIE9ubHkgbG93ZXIgYm91bmQg cHJlc2VudAorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIHNvbWVfZGF0ZSBGUk9NIGRhdGVf c3VwcG9ydF90ZXN0CitXSEVSRSBzb21lX2RhdGUgPEAgZGF0ZXJhbmdlKCcyMDAwLTAxLTAxJywg TlVMTCwgJ1tdJyk7CisgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAg ICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNlcSBT Y2FuIG9uIGRhdGVfc3VwcG9ydF90ZXN0CisgICBGaWx0ZXI6IChzb21lX2RhdGUgPj0gJzAxLTAx LTIwMDAnOjpkYXRlKQorKDIgcm93cykKKworLS0gT25seSB1cHBlciBib3VuZCBwcmVzZW50CitF WFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1Qgc29tZV9kYXRlIEZST00gZGF0ZV9zdXBwb3J0X3Rl c3QKK1dIRVJFIHNvbWVfZGF0ZSA8QCBkYXRlcmFuZ2UoTlVMTCwnMjAwMC0wMS0wMScsICdbXScp OworICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAKKy0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgU2VxIFNjYW4gb24gZGF0ZV9z dXBwb3J0X3Rlc3QKKyAgIEZpbHRlcjogKHNvbWVfZGF0ZSA8ICcwMS0wMi0yMDAwJzo6ZGF0ZSkK KygyIHJvd3MpCisKKy0tIE5vIGJvdW5kcywgc28gbm90IGEgYm91bmRlZCByYW5nZS4KK0VYUExB SU4gKENPU1RTIE9GRikKK1NFTEVDVCBzb21lX2RhdGUgRlJPTSBkYXRlX3N1cHBvcnRfdGVzdCBX SEVSRSBzb21lX2RhdGUgPEAgZGF0ZXJhbmdlKG51bGwsIG51bGwpOworICAgICAgICAgIFFVRVJZ IFBMQU4gICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNlcSBT Y2FuIG9uIGRhdGVfc3VwcG9ydF90ZXN0CisoMSByb3cpCisKK0VYUExBSU4gKENPU1RTIE9GRikK K1NFTEVDVCBjb3VudChzb21lX2RhdGUpIEZST00gZGF0ZV9zdXBwb3J0X3Rlc3QgV0hFUkUgc29t ZV9kYXRlIDxAIGRhdGVyYW5nZSgnLWluZmluaXR5JywgJzIwMDAtMDEtMDEnOjpEQVRFLCAnKCkn KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KKyBBZ2dyZWdhdGUKKyAgIC0+ICBTZXEgU2NhbiBvbiBkYXRlX3N1cHBvcnRf dGVzdAorICAgICAgICAgRmlsdGVyOiAoKHNvbWVfZGF0ZSA+ICctaW5maW5pdHknOjpkYXRlKSBB TkQgKHNvbWVfZGF0ZSA8ICcwMS0wMS0yMDAwJzo6ZGF0ZSkpCisoMyByb3dzKQorCistLSBTaG91 bGQgcmV0dXJuIDEwMDAgcm93cywgc2luY2UgLWluZmluaXR5IGFuZCAyMDAwLTAxLTAxIGFyZSBu b3QgaW5jbHVkZWQgaW4gdGhlIHJhbmdlCitTRUxFQ1QgY291bnQoc29tZV9kYXRlKSBGUk9NIGRh dGVfc3VwcG9ydF90ZXN0IFdIRVJFIHNvbWVfZGF0ZSA8QCBkYXRlcmFuZ2UoJy1pbmZpbml0eScs ICcyMDAwLTAxLTAxJzo6REFURSwgJygpJyk7CisgY291bnQgCistLS0tLS0tCisgIDEwMDAKKygx IHJvdykKKworRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIGNvdW50KHNvbWVfZGF0ZSkgRlJP TSBkYXRlX3N1cHBvcnRfdGVzdCBXSEVSRSBzb21lX2RhdGUgPEAgZGF0ZXJhbmdlKCctaW5maW5p dHknLCAnMjAwMC0wMS0wMSc6OkRBVEUsICdbKScpOworICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQWdncmVnYXRlCisg ICAtPiAgU2VxIFNjYW4gb24gZGF0ZV9zdXBwb3J0X3Rlc3QKKyAgICAgICAgIEZpbHRlcjogKChz b21lX2RhdGUgPj0gJy1pbmZpbml0eSc6OmRhdGUpIEFORCAoc29tZV9kYXRlIDwgJzAxLTAxLTIw MDAnOjpkYXRlKSkKKygzIHJvd3MpCisKKy0tIFNob3VsZCByZXR1cm4gMTAwMSByb3dzLCBzaW5j ZSAtaW5maW5pdHkgaXMgaW5jbHVkZWQgaGVyZQorU0VMRUNUIGNvdW50KHNvbWVfZGF0ZSkgRlJP TSBkYXRlX3N1cHBvcnRfdGVzdCBXSEVSRSBzb21lX2RhdGUgPEAgZGF0ZXJhbmdlKCctaW5maW5p dHknLCAnMjAwMC0wMS0wMSc6OkRBVEUsICdbKScpOworIGNvdW50IAorLS0tLS0tLQorICAxMDAx CisoMSByb3cpCisKK3NlbGVjdCBjaGVjazJwbGFuKCQkIEVYUExBSU4gKENPU1RTIE9GRikKKyAg ICAgICAgICBTRUxFQ1QgY291bnQoc29tZV9kYXRlKSBGUk9NIGRhdGVfc3VwcG9ydF90ZXN0IFdI RVJFIHNvbWVfZGF0ZSA8QCBkYXRlcmFuZ2UoJy1pbmZpbml0eScsICcyMDAwLTAxLTAxJzo6REFU RSwgJygpJyk7CisgICAgICAgICAgJCQsCisgICAgICAkJAorICAgICAgRVhQTEFJTiAoQ09TVFMg T0ZGKQorICAgICAgU0VMRUNUIGNvdW50KHNvbWVfZGF0ZSkgRlJPTSBkYXRlX3N1cHBvcnRfdGVz dAorICAgICAgV0hFUkUgZGF0ZXJhbmdlKCctaW5maW5pdHknLCAnMjAwMC0wMS0wMSc6OkRBVEUs ICcoKScpIEA+IHNvbWVfZGF0ZQorICAgICAgJCQpOworTk9USUNFOiAgdGhlc2UgdHdvIHF1ZXJ5 J3BsYW4gaXMgdGhlIHNhbWUKKyBjaGVjazJwbGFuIAorLS0tLS0tLS0tLS0tCisgCisoMSByb3cp CisKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCBjb3VudChzb21lX2RhdGUpIEZST00gZGF0 ZV9zdXBwb3J0X3Rlc3QgV0hFUkUgc29tZV9kYXRlIDxAIGRhdGVyYW5nZSgnLWluZmluaXR5Jywg JzIwMDAtMDEtMDEnOjpEQVRFLCAnW10nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEFnZ3JlZ2F0ZQorICAgLT4g IFNlcSBTY2FuIG9uIGRhdGVfc3VwcG9ydF90ZXN0CisgICAgICAgICBGaWx0ZXI6ICgoc29tZV9k YXRlID49ICctaW5maW5pdHknOjpkYXRlKSBBTkQgKHNvbWVfZGF0ZSA8ICcwMS0wMi0yMDAwJzo6 ZGF0ZSkpCisoMyByb3dzKQorCistLSBTaG91bGQgcmV0dXJuIDEwMDIgcm93cywgc2luY2UgLWlu ZmluaXR5IGFuZCAyMDAwLTAxLTAxIGFyZSBpbmNsdWRlZCBoZXJlCitTRUxFQ1QgY291bnQoc29t ZV9kYXRlKSBGUk9NIGRhdGVfc3VwcG9ydF90ZXN0IFdIRVJFIHNvbWVfZGF0ZSA8QCBkYXRlcmFu Z2UoJy1pbmZpbml0eScsICcyMDAwLTAxLTAxJzo6REFURSwgJ1tdJyk7CisgY291bnQgCistLS0t LS0tCisgIDEwMDIKKygxIHJvdykKKworc2VsZWN0IGNoZWNrMnBsYW4oJGEkCisgICAgICAgICAg ICAgIEVYUExBSU4gKENPU1RTIE9GRikKKyAgICAgICAgICAgICAgU0VMRUNUIGNvdW50KHNvbWVf ZGF0ZSkgRlJPTSBkYXRlX3N1cHBvcnRfdGVzdCBXSEVSRSBzb21lX2RhdGUgPEAgZGF0ZXJhbmdl KCcyMDAwLTAxLTAxJzo6REFURSwgJ2luZmluaXR5JywgJ1spJykKKyAgICAgICAgICAgICAgJGEk LAorICAgICAgJGIkCisgICAgICBFWFBMQUlOIChDT1NUUyBPRkYpCisgICAgICBTRUxFQ1QgY291 bnQoc29tZV9kYXRlKSBGUk9NIGRhdGVfc3VwcG9ydF90ZXN0IFdIRVJFIGRhdGVyYW5nZSgnMjAw MC0wMS0wMSc6OkRBVEUsICdpbmZpbml0eScsICdbKScpIEA+IHNvbWVfZGF0ZQorICAgICAgJGIk KTsKK05PVElDRTogIHRoZXNlIHR3byBxdWVyeSdwbGFuIGlzIHRoZSBzYW1lCisgY2hlY2sycGxh biAKKy0tLS0tLS0tLS0tLQorIAorKDEgcm93KQorCistLSBTaG91bGQgcmV0dXJuIDEwMDEgcm93 cywgc2luY2UgaW5maW5pdHkgbm90IGluY2x1ZGVkIGhlcmUKK1NFTEVDVCBjb3VudChzb21lX2Rh dGUpIEZST00gZGF0ZV9zdXBwb3J0X3Rlc3QgV0hFUkUgc29tZV9kYXRlIDxAIGRhdGVyYW5nZSgn MjAwMC0wMS0wMSc6OkRBVEUsICdpbmZpbml0eScsICdbKScpOworIGNvdW50IAorLS0tLS0tLQor ICAxMDAxCisoMSByb3cpCisKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCBjb3VudChzb21l X2RhdGUpIEZST00gZGF0ZV9zdXBwb3J0X3Rlc3QgV0hFUkUgc29tZV9kYXRlIDxAIGRhdGVyYW5n ZSgnMjAwMC0wMS0wMSc6OkRBVEUsICdpbmZpbml0eScsICdbXScpOworICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQWdn cmVnYXRlCisgICAtPiAgU2VxIFNjYW4gb24gZGF0ZV9zdXBwb3J0X3Rlc3QKKyAgICAgICAgIEZp bHRlcjogKChzb21lX2RhdGUgPj0gJzAxLTAxLTIwMDAnOjpkYXRlKSBBTkQgKHNvbWVfZGF0ZSA8 PSAnaW5maW5pdHknOjpkYXRlKSkKKygzIHJvd3MpCisKKy0tIFNob3VsZCByZXR1cm4gMTAwMiBy b3dzLCBzaW5jZSBpbmZpbml0eSBpcyBpbmNsdWRlZCBoZXJlCitTRUxFQ1QgY291bnQoc29tZV9k YXRlKSBGUk9NIGRhdGVfc3VwcG9ydF90ZXN0IFdIRVJFIHNvbWVfZGF0ZSA8QCBkYXRlcmFuZ2Uo JzIwMDAtMDEtMDEnOjpEQVRFLCAnaW5maW5pdHknLCAnW10nKTsKKyBjb3VudCAKKy0tLS0tLS0K KyAgMTAwMgorKDEgcm93KQorCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgY291bnQoc29t ZV9kYXRlKSBGUk9NIGRhdGVfc3VwcG9ydF90ZXN0IFdIRVJFIHNvbWVfZGF0ZSA8QCBkYXRlcmFu Z2UoJ2luZmluaXR5JywgJ2luZmluaXR5JywgJ1tdJyk7CisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQWdncmVn YXRlCisgICAtPiAgSW5kZXggT25seSBTY2FuIHVzaW5nIGRhdGVfc3VwcG9ydF90ZXN0X3NvbWVf ZGF0ZV9pZHggb24gZGF0ZV9zdXBwb3J0X3Rlc3QKKyAgICAgICAgIEluZGV4IENvbmQ6ICgoc29t ZV9kYXRlID49ICdpbmZpbml0eSc6OmRhdGUpIEFORCAoc29tZV9kYXRlIDw9ICdpbmZpbml0eSc6 OmRhdGUpKQorKDMgcm93cykKKworLS0gU2hvdWxkIHJldHVybiAxIHJvd3MsIHNpbmNlIGp1c3Qg aW5maW5pdHkgaXMgaW5jbHVkZWQgaGVyZQorU0VMRUNUIGNvdW50KHNvbWVfZGF0ZSkgRlJPTSBk YXRlX3N1cHBvcnRfdGVzdCBXSEVSRSBzb21lX2RhdGUgPEAgZGF0ZXJhbmdlKCdpbmZpbml0eScs ICdpbmZpbml0eScsICdbXScpOworIGNvdW50IAorLS0tLS0tLQorICAgICAxCisoMSByb3cpCisK Ky0tIFNob3VsZCByZXR1cm4gMCByb3dzLCBzaW5jZSB0aGlzIGlzIHVwIHRvLCBidXQgbm90IGlu Y2x1ZGluZyBpbmZpbml0eQorU0VMRUNUIGNvdW50KHNvbWVfZGF0ZSkgRlJPTSBkYXRlX3N1cHBv cnRfdGVzdCBXSEVSRSBzb21lX2RhdGUgPEAgZGF0ZXJhbmdlKCdpbmZpbml0eScsICdpbmZpbml0 eScsICdbKScpOworIGNvdW50IAorLS0tLS0tLQorICAgICAwCisoMSByb3cpCisKK0VYUExBSU4g KENPU1RTIE9GRikKK1NFTEVDVCBjb3VudChzb21lX2RhdGUpIEZST00gZGF0ZV9zdXBwb3J0X3Rl c3QgV0hFUkUgc29tZV9kYXRlIDxAIGRhdGVyYW5nZSgnaW5maW5pdHknLCAnaW5maW5pdHknLCAn WyknKTsKKyAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQorIEFnZ3JlZ2F0ZQorICAgLT4gIFJlc3VsdAorICAgICAgICAgT25l LVRpbWUgRmlsdGVyOiBmYWxzZQorKDMgcm93cykKKworRFJPUCBUQUJMRSBkYXRlX3N1cHBvcnRf dGVzdDsKK2Ryb3AgZnVuY3Rpb24gY2hlY2sycGxhbjsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3Jl Z3Jlc3Mvc3FsL3JhbmdldHlwZXMuc3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvcmFuZ2V0eXBl cy5zcWwKaW5kZXggYzIzYmU5MjguLjdkNmQxNzk5IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdy ZXNzL3NxbC9yYW5nZXR5cGVzLnNxbAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9yYW5nZXR5 cGVzLnNxbApAQCAtNjI5LDMgKzYyOSwxMDQgQEAgY3JlYXRlIGZ1bmN0aW9uIGlub3V0cGFyYW1f ZmFpbChpbm91dCBpIGFueWVsZW1lbnQsIG91dCByIGFueXJhbmdlKQogLS1zaG91bGQgZmFpbAog Y3JlYXRlIGZ1bmN0aW9uIHRhYmxlX2ZhaWwoaSBhbnllbGVtZW50KSByZXR1cm5zIHRhYmxlKGkg YW55ZWxlbWVudCwgciBhbnlyYW5nZSkKICAgYXMgJCQgc2VsZWN0ICQxLCAnWzEsMTBdJyAkJCBs YW5ndWFnZSBzcWw7CisKKy0tCistLSBUZXN0IHN1cHBvcnQgZnVuY3Rpb24KKy0tCistLSBUZXN0 IGFjdHVhbCByZXN1bHRzLCBhcyB3ZWxsIGFzIGVzdGltYXRlcy4KK0NSRUFURSBUQUJMRSBkYXRl X3N1cHBvcnRfdGVzdCBBUyBTRUxFQ1QgJzIwMDAtMDEtMDEnOjpEQVRFICsgZyBBUyBzb21lX2Rh dGUgRlJPTQorCQkJCWdlbmVyYXRlX3NlcmllcygtMTAwMCwgMTAwMCkgc3ViKGcpOworQ1JFQVRF IFVOSVFVRSBJTkRFWCBPTiBkYXRlX3N1cHBvcnRfdGVzdCggc29tZV9kYXRlICk7CitJTlNFUlQg SU5UTyBkYXRlX3N1cHBvcnRfdGVzdCB2YWx1ZXMgKCAnLWluZmluaXR5JyApLCAoICdpbmZpbml0 eScgKTsKK0FOQUxZWkUgZGF0ZV9zdXBwb3J0X3Rlc3Q7CisKK2NyZWF0ZSBvciBSRVBMQUNFIGZ1 bmN0aW9uIGNoZWNrMnBsYW4odGV4dCwgdGV4dCkKK1JFVFVSTlMgdm9pZAorQVMgJCQKKyAgZGVj bGFyZSBsbjEgdGV4dCBkZWZhdWx0ICcnOworICAgICAgICAgIGxuMiB0ZXh0IGRlZmF1bHQgJyc7 CitCRUdJTgorICBleGVjdXRlICQxIGludG8gbG4xOworICBleGVjdXRlICQyIGludG8gbG4yOwor ICAgIGlmIGxuMSA9IGxuMiBhbmQgbG4xICE9ICcnIGFuZCBsbjIgIT0gJycgdGhlbgorICAgICAg UkFJU0UgTk9USUNFICd0aGVzZSB0d28gcXVlcnknJ3BsYW4gaXMgdGhlIHNhbWUnOworICAgIGVu ZCBpZjsKK0VORDsKKyQkCitMQU5HVUFHRSBwbHBnc3FsOworCistLSBFbXB0eSByYW5nZXMKK0VY UExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCBzb21lX2RhdGUgRlJPTSBkYXRlX3N1cHBvcnRfdGVz dAorV0hFUkUgc29tZV9kYXRlIDxAIGRhdGVyYW5nZSgnMjAwMC0wMS0wMScsICcyMDAwLTAxLTAx JywgJygpJyk7CisKKy0tIE9ubHkgbG93ZXIgYm91bmQgcHJlc2VudAorRVhQTEFJTiAoQ09TVFMg T0ZGKQorU0VMRUNUIHNvbWVfZGF0ZSBGUk9NIGRhdGVfc3VwcG9ydF90ZXN0CitXSEVSRSBzb21l X2RhdGUgPEAgZGF0ZXJhbmdlKCcyMDAwLTAxLTAxJywgTlVMTCwgJ1tdJyk7CisKKy0tIE9ubHkg dXBwZXIgYm91bmQgcHJlc2VudAorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIHNvbWVfZGF0 ZSBGUk9NIGRhdGVfc3VwcG9ydF90ZXN0CitXSEVSRSBzb21lX2RhdGUgPEAgZGF0ZXJhbmdlKE5V TEwsJzIwMDAtMDEtMDEnLCAnW10nKTsKKworLS0gTm8gYm91bmRzLCBzbyBub3QgYSBib3VuZGVk IHJhbmdlLgorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIHNvbWVfZGF0ZSBGUk9NIGRhdGVf c3VwcG9ydF90ZXN0IFdIRVJFIHNvbWVfZGF0ZSA8QCBkYXRlcmFuZ2UobnVsbCwgbnVsbCk7CisK K0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCBjb3VudChzb21lX2RhdGUpIEZST00gZGF0ZV9z dXBwb3J0X3Rlc3QgV0hFUkUgc29tZV9kYXRlIDxAIGRhdGVyYW5nZSgnLWluZmluaXR5JywgJzIw MDAtMDEtMDEnOjpEQVRFLCAnKCknKTsKKy0tIFNob3VsZCByZXR1cm4gMTAwMCByb3dzLCBzaW5j ZSAtaW5maW5pdHkgYW5kIDIwMDAtMDEtMDEgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgcmFuZ2UK K1NFTEVDVCBjb3VudChzb21lX2RhdGUpIEZST00gZGF0ZV9zdXBwb3J0X3Rlc3QgV0hFUkUgc29t ZV9kYXRlIDxAIGRhdGVyYW5nZSgnLWluZmluaXR5JywgJzIwMDAtMDEtMDEnOjpEQVRFLCAnKCkn KTsKKworRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIGNvdW50KHNvbWVfZGF0ZSkgRlJPTSBk YXRlX3N1cHBvcnRfdGVzdCBXSEVSRSBzb21lX2RhdGUgPEAgZGF0ZXJhbmdlKCctaW5maW5pdHkn LCAnMjAwMC0wMS0wMSc6OkRBVEUsICdbKScpOworLS0gU2hvdWxkIHJldHVybiAxMDAxIHJvd3Ms IHNpbmNlIC1pbmZpbml0eSBpcyBpbmNsdWRlZCBoZXJlCitTRUxFQ1QgY291bnQoc29tZV9kYXRl KSBGUk9NIGRhdGVfc3VwcG9ydF90ZXN0IFdIRVJFIHNvbWVfZGF0ZSA8QCBkYXRlcmFuZ2UoJy1p bmZpbml0eScsICcyMDAwLTAxLTAxJzo6REFURSwgJ1spJyk7CisKK3NlbGVjdCBjaGVjazJwbGFu KCQkIEVYUExBSU4gKENPU1RTIE9GRikKKyAgICAgICAgICBTRUxFQ1QgY291bnQoc29tZV9kYXRl KSBGUk9NIGRhdGVfc3VwcG9ydF90ZXN0IFdIRVJFIHNvbWVfZGF0ZSA8QCBkYXRlcmFuZ2UoJy1p bmZpbml0eScsICcyMDAwLTAxLTAxJzo6REFURSwgJygpJyk7CisgICAgICAgICAgJCQsCisgICAg ICAkJAorICAgICAgRVhQTEFJTiAoQ09TVFMgT0ZGKQorICAgICAgU0VMRUNUIGNvdW50KHNvbWVf ZGF0ZSkgRlJPTSBkYXRlX3N1cHBvcnRfdGVzdAorICAgICAgV0hFUkUgZGF0ZXJhbmdlKCctaW5m aW5pdHknLCAnMjAwMC0wMS0wMSc6OkRBVEUsICcoKScpIEA+IHNvbWVfZGF0ZQorICAgICAgJCQp OworCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgY291bnQoc29tZV9kYXRlKSBGUk9NIGRh dGVfc3VwcG9ydF90ZXN0IFdIRVJFIHNvbWVfZGF0ZSA8QCBkYXRlcmFuZ2UoJy1pbmZpbml0eScs ICcyMDAwLTAxLTAxJzo6REFURSwgJ1tdJyk7CisKKy0tIFNob3VsZCByZXR1cm4gMTAwMiByb3dz LCBzaW5jZSAtaW5maW5pdHkgYW5kIDIwMDAtMDEtMDEgYXJlIGluY2x1ZGVkIGhlcmUKK1NFTEVD VCBjb3VudChzb21lX2RhdGUpIEZST00gZGF0ZV9zdXBwb3J0X3Rlc3QgV0hFUkUgc29tZV9kYXRl IDxAIGRhdGVyYW5nZSgnLWluZmluaXR5JywgJzIwMDAtMDEtMDEnOjpEQVRFLCAnW10nKTsKKwor c2VsZWN0IGNoZWNrMnBsYW4oJGEkCisgICAgICAgICAgICAgIEVYUExBSU4gKENPU1RTIE9GRikK KyAgICAgICAgICAgICAgU0VMRUNUIGNvdW50KHNvbWVfZGF0ZSkgRlJPTSBkYXRlX3N1cHBvcnRf dGVzdCBXSEVSRSBzb21lX2RhdGUgPEAgZGF0ZXJhbmdlKCcyMDAwLTAxLTAxJzo6REFURSwgJ2lu ZmluaXR5JywgJ1spJykKKyAgICAgICAgICAgICAgJGEkLAorICAgICAgJGIkCisgICAgICBFWFBM QUlOIChDT1NUUyBPRkYpCisgICAgICBTRUxFQ1QgY291bnQoc29tZV9kYXRlKSBGUk9NIGRhdGVf c3VwcG9ydF90ZXN0IFdIRVJFIGRhdGVyYW5nZSgnMjAwMC0wMS0wMSc6OkRBVEUsICdpbmZpbml0 eScsICdbKScpIEA+IHNvbWVfZGF0ZQorICAgICAgJGIkKTsKKworLS0gU2hvdWxkIHJldHVybiAx MDAxIHJvd3MsIHNpbmNlIGluZmluaXR5IG5vdCBpbmNsdWRlZCBoZXJlCitTRUxFQ1QgY291bnQo c29tZV9kYXRlKSBGUk9NIGRhdGVfc3VwcG9ydF90ZXN0IFdIRVJFIHNvbWVfZGF0ZSA8QCBkYXRl cmFuZ2UoJzIwMDAtMDEtMDEnOjpEQVRFLCAnaW5maW5pdHknLCAnWyknKTsKKworRVhQTEFJTiAo Q09TVFMgT0ZGKQorU0VMRUNUIGNvdW50KHNvbWVfZGF0ZSkgRlJPTSBkYXRlX3N1cHBvcnRfdGVz dCBXSEVSRSBzb21lX2RhdGUgPEAgZGF0ZXJhbmdlKCcyMDAwLTAxLTAxJzo6REFURSwgJ2luZmlu aXR5JywgJ1tdJyk7CisKKy0tIFNob3VsZCByZXR1cm4gMTAwMiByb3dzLCBzaW5jZSBpbmZpbml0 eSBpcyBpbmNsdWRlZCBoZXJlCitTRUxFQ1QgY291bnQoc29tZV9kYXRlKSBGUk9NIGRhdGVfc3Vw cG9ydF90ZXN0IFdIRVJFIHNvbWVfZGF0ZSA8QCBkYXRlcmFuZ2UoJzIwMDAtMDEtMDEnOjpEQVRF LCAnaW5maW5pdHknLCAnW10nKTsKKworRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIGNvdW50 KHNvbWVfZGF0ZSkgRlJPTSBkYXRlX3N1cHBvcnRfdGVzdCBXSEVSRSBzb21lX2RhdGUgPEAgZGF0 ZXJhbmdlKCdpbmZpbml0eScsICdpbmZpbml0eScsICdbXScpOworLS0gU2hvdWxkIHJldHVybiAx IHJvd3MsIHNpbmNlIGp1c3QgaW5maW5pdHkgaXMgaW5jbHVkZWQgaGVyZQorU0VMRUNUIGNvdW50 KHNvbWVfZGF0ZSkgRlJPTSBkYXRlX3N1cHBvcnRfdGVzdCBXSEVSRSBzb21lX2RhdGUgPEAgZGF0 ZXJhbmdlKCdpbmZpbml0eScsICdpbmZpbml0eScsICdbXScpOworCistLSBTaG91bGQgcmV0dXJu IDAgcm93cywgc2luY2UgdGhpcyBpcyB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcgaW5maW5pdHkK K1NFTEVDVCBjb3VudChzb21lX2RhdGUpIEZST00gZGF0ZV9zdXBwb3J0X3Rlc3QgV0hFUkUgc29t ZV9kYXRlIDxAIGRhdGVyYW5nZSgnaW5maW5pdHknLCAnaW5maW5pdHknLCAnWyknKTsKKworRVhQ TEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIGNvdW50KHNvbWVfZGF0ZSkgRlJPTSBkYXRlX3N1cHBv cnRfdGVzdCBXSEVSRSBzb21lX2RhdGUgPEAgZGF0ZXJhbmdlKCdpbmZpbml0eScsICdpbmZpbml0 eScsICdbKScpOworCitEUk9QIFRBQkxFIGRhdGVfc3VwcG9ydF90ZXN0OworZHJvcCBmdW5jdGlv biBjaGVjazJwbGFuOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKLS0gCjIuMzQuMQoK --0000000000000ee01906079322af--