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.96) (envelope-from ) id 1wPICD-000cpf-20 for pgsql-hackers@arkaria.postgresql.org; Tue, 19 May 2026 11:01:09 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wPICB-004BX8-1H for pgsql-hackers@arkaria.postgresql.org; Tue, 19 May 2026 11:01:08 +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.96) (envelope-from ) id 1wPICA-004BX0-2Z for pgsql-hackers@lists.postgresql.org; Tue, 19 May 2026 11:01:08 +0000 Received: from mail-oo1-xc33.google.com ([2607:f8b0:4864:20::c33]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wPIC8-00000000JgW-3VOP for pgsql-hackers@postgresql.org; Tue, 19 May 2026 11:01:06 +0000 Received: by mail-oo1-xc33.google.com with SMTP id 006d021491bc7-68470763896so1729668eaf.1 for ; Tue, 19 May 2026 04:01:05 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1779188465; cv=none; d=google.com; s=arc-20240605; b=Hc6rej7zkcCUlzSBmUZ0T29wpqRV9FsxEXZXT8J+IyNlBH0JulY1N10gk6dNp2mCIl ZuKzurRmmJMW53jCZuVKNmY8T7G183YEbtgXMkSYe7Pqn8o82E6MLskODF7XGKkTfBFR T1xDlm3RAygZI1/5o7BmeHkOpWayaCcm5RgtQKPXjA1HspnvBGVnIFyYS26XtRt7i8hr I2skMkJy6XikqCFCygEy/VY9Ssk1gmomZt74GQIK2y/xl8CTBzdaHidrE72VOqRlGlt9 5ek7P+M8KbtZMD6SjRz+yolBuI3WjEvk2bTQ93ohyrcrmOvL/eJs8bGilKZjUGL0HzT6 uCUA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=bGLzC1kWdl3/LgNfvGi8EPo5E6jl/u9OfSL3fyeMAB0=; fh=upeCEQOLX8onPekLRNI8fq2iPE/SCOgojgzTkYuCCh8=; b=a4R0KiWduRcXmsHSfHyr9E+8RzDfsBChxQGS3lDMU5ooA6AdPApPT9FnVCoVojK/an FEQCajFz/yB32cpFYbTMGEYLEEvK9Ay6smJx/zXdB9I2DB/PK56ANlv48JR8tlDHrKb+ xm5tbapAgxCx3A6WFqoLd2k8lJkP4i8tiuP0ATBjaPphuywLqiq/1SGMXA/vWcypQ6mV 9mw+oEWQx80yOsPXX2iroWJrdEGx8hUD20Wqzgfc4IgcHSU5pw8/MCbeT1QQxmSBds98 /NRkmG6orSOhDF2SFG+ErVXjUpClfxaIVFc6THo1ICcImlYJzDVGDGcznsSLumE4FbGT d3jQ==; darn=postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779188465; x=1779793265; 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=bGLzC1kWdl3/LgNfvGi8EPo5E6jl/u9OfSL3fyeMAB0=; b=r1efJTkfsBAQA818olK72yyrsTqabR76pR4+uPVoKEBOM+2TxtJwZY1ap4oQPw7EaX iTJ31qpofJw3PeO9GePXsxeCfPKiJ8XZCRKbgYUsyWMQFSmKUHJB8BsakcD1C2l4NurT gXREefxd2kCpS/Im0H8sVZUchEZDfrCqcmHj/PdEXzzPzoCJeS8WG/NI7FYYnCqFnH6h eGnBPWfRnZY+JrYzZl7UEVqaGByB0mPS5yL6wan40ZjZFMTboBQhUw3RJ8tGDb1FgD0v W72ZlBspfv5ik0BRVTFn1DR8KSrzydFDQQJye7jaQiljpqqSEe1BZKffWGQ2fQQqSm/0 aknQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779188465; x=1779793265; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=bGLzC1kWdl3/LgNfvGi8EPo5E6jl/u9OfSL3fyeMAB0=; b=XDobOsHEb2XYSm2Jto4/RhZENMghG85IoMwjOEv5+vfUWtfYAQqST4RnvlTkoIjvnm GefPmIMpe/YOkyJyv7HfadZ/QVHFNvKHu15KaXK/CgCIJdekJWdoWdip7SKxksSSpzyq O98amrgp7E/3jVwxw4YZK30W2h8m1xiRZpYNkCU2ceBDV/f/vcTFTd9eyRtSU+rL6ogS Fjg9/oDFoAVBEm2CfVOailkvWTseMRZCQKTI2nrsPNs6ClLRt+9T11/Nvys0J6nJC5M/ E9K2nvy2bfgqpKxYa9obRf1yx8+7BdRVGNSWIaw5U0O8mOMGZRjm0rGbZYvLyY1q3AIr sUFg== X-Forwarded-Encrypted: i=1; AFNElJ+VsnHp51by6f4+c2mJT7eL+UGJwsW/tcMJ6Io/iJqUJng7OR92fynj8jXltjzfwwjjaARtsu21mCTkuUOJ@postgresql.org X-Gm-Message-State: AOJu0YzHO3p+HNYDxy4/HuOsspruu+9nhF41phqUCeQCcxUuQVDmSMxx bNuwnUAqz5JANLJ2RoepfUrLFC3zXg8SAGMjQt3M0DBrUt6EGRBTDEiCke4/rlmxr9VahvmQxaJ 4FSd/YhFa37GTwlN0cD94+YTBwKXWm1E= X-Gm-Gg: Acq92OFsSy0Uf38WoVv0Rvww/c+MpX7MRuYhd78vCIX5yDws0a0s8mdc9uRXNCc8HGC 8GKgmExkwY6BuoEkc2M1egUjTD5vjIV+ZaMae4q/9hY3Kia95Vuk7TDRAOSyxCrf1nUkwS3uoyy zSmbjsl7FYqhSSU6MuiUrk7AP2XrnuZbYdK0v1sngdeGFQJaJDAFLGZpNFLF75Wro3oE/79Pitz LfwdX7iCOgs+/wM0r/hmKtH24KBYd9poJ+MeT98MNjdaRw4bstAi9GO5vK2K82NJAj/LfCSWThT Zov84dDqzygblKU4+hR+3kyB1mWuAgD0ekmSe7ZkMjuYoZpdC/ukovVz/Bo5C7h4jzbH2pNb6r4 cQcWaDGpJmTe7x+5/s2moiLYE02XShsIATfAMvlwxRoOEQc8beG4= X-Received: by 2002:a05:6820:4c16:b0:694:9764:a6b3 with SMTP id 006d021491bc7-69c942936admr12340045eaf.10.1779188464845; Tue, 19 May 2026 04:01:04 -0700 (PDT) MIME-Version: 1.0 References: <4df20e70-a083-4334-9548-5f8b9025847c@postgrespro.ru> <4B04275C-E044-4EEE-BE64-6FEEE73DCBB0@gmail.com> <09307DC2-64A1-4D6A-9EAF-9A86A173A7FC@gmail.com> In-Reply-To: <09307DC2-64A1-4D6A-9EAF-9A86A173A7FC@gmail.com> From: Alexander Korotkov Date: Tue, 19 May 2026 14:00:52 +0300 X-Gm-Features: AVHnY4IK_xujnWjqTI7msUDFvTmiw89cud7CvueLPcN1XayB0UVx6PO6PAGraLI Message-ID: Subject: Re: Fix SPLIT PARTITION bound-overlap bug and other improvements To: Chao Li Cc: Dmitry Koval , PostgreSQL-development Content-Type: multipart/mixed; boundary="0000000000006f9ef606522998f9" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000006f9ef606522998f9 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi, Chao! On Tue, May 19, 2026 at 5:50=E2=80=AFAM Chao Li wr= ote: > > On May 18, 2026, at 20:04, Alexander Korotkov wr= ote: > > > > On Mon, May 18, 2026 at 2:57=E2=80=AFPM Chao Li wrote: > >>> > >> > >> v3-0001 through v3-0003 look good to me. > >> > >> For v3-0004, I have a suspicion, but it's late here and my brain is ge= tting slow, so I would like to study it more tomorrow. > > > > Sure, take your time. > > > > ------ > > Regards, > > Alexander Korotkov > > Supabase > > My suspicion was that check_split_partition_not_same_bound() now has two = paths. The RANGE path honors collation, while the LIST path does not. So I = spent some time creating a test that uses a case-insensitive collation: > ``` > evantest=3D# create collation case_insensitive (provider=3Dicu, locale=3D= 'und-u-ks-level2', deterministic =3D false); > CREATE COLLATION > evantest=3D# create table t (b text collate case_insensitive) partition b= y list (b); > CREATE TABLE > evantest=3D# create table tp_ab partition of t for values in ('a', 'b'); > CREATE TABLE > evantest=3D# alter table t split partition tp_ab into > evantest-# (partition tp_a for values in ('a', 'A'), > evantest(# partition tp_default default); > ERROR: cannot split partition "tp_ab" only to add a DEFAULT partition > LINE 2: (partition tp_a for values in ('a', 'A'), > ^ > DETAIL: The non-DEFAULT partition would keep the same partition bound. > HINT: Use CREATE TABLE ... PARTITION OF ... DEFAULT to add a DEFAULT par= tition. > ``` > > In this test, the split partition=E2=80=99s bound is ('a', 'b'), and the = new partition=E2=80=99s bound is ('a', 'A'). Their list lengths are both 2,= but the two bounds are actually different, because 'a' and 'A' are conside= red equal by the collation. > > So, in the LIST path, since check_partition_bounds_for_split_list() has a= lready ensured that the new partition=E2=80=99s bound is contained within t= he split partition=E2=80=99s bound, we need to check the reverse direction = as well. Whether the split partition=E2=80=99s bound is also contained in t= he new partition=E2=80=99s bound. If yes, the two bounds are identical. > > See the attached v4 for my changes for 0004. 0001-0003 are unchanged. Sin= ce 0001 and 0003 are independent of 0004, maybe they can be pushed first. I've pushed 0001-0003. Thank you for discovering the collation issue in 0004. Note that original approach of using partition_bounds_equal() can't handle different collations too (as it internally uses datumIsEqual()). I've revised the remaining patch: made function header comment a bit more detailed and added additional regression tests. Please, check. ------ Regards, Alexander Korotkov Supabase --0000000000006f9ef606522998f9 Content-Type: application/octet-stream; name="v5-0001-Reject-degenerate-SPLIT-PARTITION-with-DEFAULT-pa.patch" Content-Disposition: attachment; filename="v5-0001-Reject-degenerate-SPLIT-PARTITION-with-DEFAULT-pa.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mpcipdnj0 RnJvbSBlYjAzYmQ4ZDM0NmMwNzJhZjUwMjQ4OTlhY2M3OWI0OTkxY2Q0NWE0IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGV4YW5kZXIgS29yb3Rrb3YgPGFrb3JvdGtvdkBwb3N0Z3Jl c3FsLm9yZz4KRGF0ZTogTW9uLCAxOCBNYXkgMjAyNiAwMDozNzo1MiArMDMwMApTdWJqZWN0OiBb UEFUQ0ggdjVdIFJlamVjdCBkZWdlbmVyYXRlIFNQTElUIFBBUlRJVElPTiB3aXRoIERFRkFVTFQg cGFydGl0aW9uCgpBTFRFUiBUQUJMRSAuLi4gU1BMSVQgUEFSVElUSU9OIGFsbG93cyBhIERFRkFV TFQgcGFydGl0aW9uIHRvIGJlIGNyZWF0ZWQKYXMgb25lIG9mIHRoZSByZXBsYWNlbWVudCBwYXJ0 aXRpb25zIHdoZW4gdGhlIHBhcmVudCB0YWJsZSBkb2VzIG5vdAphbHJlYWR5IGhhdmUgb25lLiAg SG93ZXZlciwgaXQgc2hvdWxkIG5vdCBhbGxvdyB0aGUgZGVnZW5lcmF0ZSBjYXNlIHdoZXJlCmEg bm9uLURFRkFVTFQgcGFydGl0aW9uIGtlZXBzIGV4YWN0bHkgdGhlIHNhbWUgYm91bmQgYXMgdGhl IHNwbGl0CnBhcnRpdGlvbiBhbmQgdGhlIGNvbW1hbmQgbWVyZWx5IGFkZHMgYSBERUZBVUxUIHBh cnRpdGlvbiB0aHJvdWdoIHRoZQpTUExJVCBQQVJUSVRJT04gcGF0aC4KCkRldGVjdCB0aGF0IGNh c2UgYnkgY29tcGFyaW5nIHRoZSBib3VuZCBvZiB0aGUgc3BsaXQgcGFydGl0aW9uIHdpdGggdGhl CmJvdW5kIG9mIHRoZSBvbmx5IG5vbi1ERUZBVUxUIHJlcGxhY2VtZW50IHBhcnRpdGlvbiwgYW5k IHJhaXNlIGFuIGVycm9yCndoZW4gdGhleSBhcmUgdGhlIHNhbWUuICBVc2VycyBzaG91bGQgYWRk IGEgREVGQVVMVCBwYXJ0aXRpb24gZGlyZWN0bHkKd2l0aCBDUkVBVEUgVEFCTEUgLi4uIFBBUlRJ VElPTiBPRiAuLi4gREVGQVVMVCBvciBBTFRFUiBUQUJMRSAuLi4gQVRUQUNIClBBUlRJVElPTiAu Li4gREVGQVVMVCBpbnN0ZWFkLgoKQXV0aG9yOiBDaGFvIExpIDxsaWNAaGlnaGdvLmNvbT4KUmV2 aWV3ZWQtYnk6IEFsZXhhbmRlciBLb3JvdGtvdiA8YWVrb3JvdGtvdkBnbWFpbC5jb20+CkRpc2N1 c3Npb246IGh0dHBzOi8vcG9zdGdyLmVzL20vQzE4ODc4QUItREVCMi00QTYxLTk5OTUtQTAzNURE NjQ0QjgxQGdtYWlsLmNvbQotLS0KIHNyYy9iYWNrZW5kL3BhcnRpdGlvbmluZy9wYXJ0Ym91bmRz LmMgICAgICAgICB8IDE1MCArKysrKysrKysrKysrKysrKysKIHNyYy90ZXN0L3JlZ3Jlc3MvZXhw ZWN0ZWQvcGFydGl0aW9uX3NwbGl0Lm91dCB8ICA1OSArKysrKysrCiBzcmMvdGVzdC9yZWdyZXNz L3NxbC9wYXJ0aXRpb25fc3BsaXQuc3FsICAgICAgfCAgNTIgKysrKysrCiAzIGZpbGVzIGNoYW5n ZWQsIDI2MSBpbnNlcnRpb25zKCspCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvcGFydGl0aW9u aW5nL3BhcnRib3VuZHMuYyBiL3NyYy9iYWNrZW5kL3BhcnRpdGlvbmluZy9wYXJ0Ym91bmRzLmMK aW5kZXggN2QzNTgwY2JjMTAuLmVhYzgwN2RkYjc3IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9w YXJ0aXRpb25pbmcvcGFydGJvdW5kcy5jCisrKyBiL3NyYy9iYWNrZW5kL3BhcnRpdGlvbmluZy9w YXJ0Ym91bmRzLmMKQEAgLTU3MDAsNiArNTcwMCwxNDYgQEAgY2hlY2tfcGFyZW50X3ZhbHVlc19p bl9uZXdfcGFydGl0aW9ucyhSZWxhdGlvbiBwYXJlbnQsCiAJfQogfQogCisvKgorICogc3BsaXRf cGFydGl0aW9uX3ZhbHVlc19jb250YWluZWRfaW5fbmV3X3BhcnQKKyAqCisgKiAoZnVuY3Rpb24g Zm9yIEJZIExJU1QgcGFydGl0aW9uaW5nKQorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgdmFs dWVzIGluIHRoZSBMSVNUIGJvdW5kIG9mIHRoZSBwYXJ0aXRpb24gYmVpbmcgc3BsaXQKKyAqIGFy ZSBjb250YWluZWQgaW4gdGhlIHNwZWNpZmllZCBub24tREVGQVVMVCByZXBsYWNlbWVudCBwYXJ0 aXRpb24ncyBib3VuZC4KKyAqCisgKiBUaGUgY2FsbGVyIG11c3QgYWxyZWFkeSBoYXZlIHZlcmlm aWVkIGNvbnRhaW5tZW50IGluIHRoZSBvdGhlciBkaXJlY3Rpb24sCisgKiBzbyB0aGlzIGNoZWNr IGlzIHN1ZmZpY2llbnQgdG8gcHJvdmUgdGhhdCB0aGUgdHdvIExJU1QgYm91bmRzIGFyZSBlcXVh bC4KKyAqLworc3RhdGljIGJvb2wKK3NwbGl0X3BhcnRpdGlvbl92YWx1ZXNfY29udGFpbmVkX2lu X25ld19wYXJ0KFJlbGF0aW9uIHBhcmVudCwKKwkJCQkJCQkJCQkJIE9pZCBzcGxpdFBhcnRPaWQs CisJCQkJCQkJCQkJCSBTaW5nbGVQYXJ0aXRpb25TcGVjICpwYXJ0KQoreworCVBhcnRpdGlvbktl eSBrZXkgPSBSZWxhdGlvbkdldFBhcnRpdGlvbktleShwYXJlbnQpOworCVBhcnRpdGlvbkRlc2Mg cGFydGRlc2MgPSBSZWxhdGlvbkdldFBhcnRpdGlvbkRlc2MocGFyZW50LCBmYWxzZSk7CisJUGFy dGl0aW9uQm91bmRJbmZvIGJvdW5kaW5mbyA9IHBhcnRkZXNjLT5ib3VuZGluZm87CisJU2luZ2xl UGFydGl0aW9uU3BlYyAqcGFydHNbMV07CisJRGF0dW0JCWRhdHVtID0gUG9pbnRlckdldERhdHVt KE5VTEwpOworCisJQXNzZXJ0KGtleS0+c3RyYXRlZ3kgPT0gUEFSVElUSU9OX1NUUkFURUdZX0xJ U1QpOworCisJcGFydHNbMF0gPSBwYXJ0OworCisJLyoKKwkgKiBTcGVjaWFsIHByb2Nlc3Npbmcg Zm9yIE5VTEwgdmFsdWUuICBTZWFyY2ggZm9yIGEgTlVMTCB2YWx1ZSBpZiB0aGUKKwkgKiBzcGxp dCBwYXJ0aXRpb24gY29udGFpbnMgaXQuCisJICovCisJaWYgKHBhcnRpdGlvbl9ib3VuZF9hY2Nl cHRzX251bGxzKGJvdW5kaW5mbykgJiYKKwkJcGFydGRlc2MtPm9pZHNbYm91bmRpbmZvLT5udWxs X2luZGV4XSA9PSBzcGxpdFBhcnRPaWQpCisJeworCQlpZiAoIWZpbmRfdmFsdWVfaW5fbmV3X3Bh cnRpdGlvbnNfbGlzdCgma2V5LT5wYXJ0c3VwZnVuY1swXSwKKwkJCQkJCQkJCQkJICAga2V5LT5w YXJ0Y29sbGF0aW9uLCBwYXJ0cywgMSwKKwkJCQkJCQkJCQkJICAgZGF0dW0sIHRydWUpKQorCQkJ cmV0dXJuIGZhbHNlOworCX0KKworCS8qCisJICogU2VhcmNoIGFsbCB2YWx1ZXMgb2YgdGhlIHNw bGl0IHBhcnRpdGlvbiBpbiB0aGUgc2luZ2xlIG5vbi1ERUZBVUxUCisJICogcmVwbGFjZW1lbnQg cGFydGl0aW9uLgorCSAqLworCWZvciAoaW50IGkgPSAwOyBpIDwgYm91bmRpbmZvLT5uZGF0dW1z OyBpKyspCisJeworCQlpZiAocGFydGRlc2MtPm9pZHNbYm91bmRpbmZvLT5pbmRleGVzW2ldXSA9 PSBzcGxpdFBhcnRPaWQpCisJCXsKKwkJCWRhdHVtID0gYm91bmRpbmZvLT5kYXR1bXNbaV1bMF07 CisKKwkJCWlmICghZmluZF92YWx1ZV9pbl9uZXdfcGFydGl0aW9uc19saXN0KCZrZXktPnBhcnRz dXBmdW5jWzBdLAorCQkJCQkJCQkJCQkJICAga2V5LT5wYXJ0Y29sbGF0aW9uLCBwYXJ0cywgMSwK KwkJCQkJCQkJCQkJCSAgIGRhdHVtLCBmYWxzZSkpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9CisJ fQorCisJcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiBjaGVja19zcGxpdF9wYXJ0aXRpb25fbm90 X3NhbWVfYm91bmQKKyAqCisgKiBSZWplY3Qgc3BsaXR0aW5nIGEgbm9uLURFRkFVTFQgcGFydGl0 aW9uIGludG8gb25lIG5vbi1ERUZBVUxUIHBhcnRpdGlvbgorICogd2l0aCB0aGUgb3JpZ2luYWwg Ym91bmQgcGx1cyBhIERFRkFVTFQgcGFydGl0aW9uLiAgVGhhdCBmb3JtIGRvZXMgbm90CisgKiBw ZXJmb3JtIGEgcmVhbCBzcGxpdDsgaXQgbWVyZWx5IGFkZHMgYSBERUZBVUxUIHBhcnRpdGlvbiB0 byB0aGUgcGFyZW50CisgKiB0YWJsZSB0aHJvdWdoIHRoZSBzcGxpdC1wYXJ0aXRpb24gcGF0aC4g IFVzZXJzIHNob3VsZCB1c2UKKyAqIENSRUFURSBUQUJMRSAuLi4gUEFSVElUSU9OIE9GIC4uLiBE RUZBVUxUIG9yIEFMVEVSIFRBQkxFIC4uLiBBVFRBQ0gKKyAqIFBBUlRJVElPTiAuLi4gREVGQVVM VCBmb3IgdGhhdC4KKyAqCisgKiBNdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgcGVyLXBhcnRpdGlv biBib3VuZCB2YWxpZGF0aW9uIGluCisgKiBjaGVja19wYXJ0aXRpb25zX2Zvcl9zcGxpdCgpIHNv IHRoYXQgY29udGFpbm1lbnQgb2YgbmV3IGJvdW5kcyB3aXRoaW4gdGhlCisgKiBzcGxpdCBwYXJ0 aXRpb24gaXMgYWxyZWFkeSBlc3RhYmxpc2hlZC4gIEdpdmVuIGNvbnRhaW5tZW50LCBSQU5HRSBi b3VuZHMKKyAqIGFyZSBlcXVhbCBpZmYgdGhlaXIgbG93ZXIgYW5kIHVwcGVyIHJib3VuZHMgbWF0 Y2g7IExJU1QgYm91bmQgc2V0cyBhcmUKKyAqIGVxdWFsIGlmZiB0aGUgc3BsaXQgcGFydGl0aW9u J3MgdmFsdWVzIGFyZSBhbHNvIGNvbnRhaW5lZCBpbiB0aGUgbmV3CisgKiBwYXJ0aXRpb24gKHRo ZSBjb250YWlubWVudCBpcyB0aGVuIGJpZGlyZWN0aW9uYWwpLiAgQm90aCBjaGVja3MgaG9ub3IK KyAqIHRoZSBwYXJ0aXRpb24ga2V5IGNvbGxhdGlvbiB2aWEgdGhlIG9wZXJhdG9yLWZhbWlseSBj b21wYXJhdG9ycworICogKHBhcnRpdGlvbl9yYm91bmRfY21wIC8gZmluZF92YWx1ZV9pbl9uZXdf cGFydGl0aW9uc19saXN0KSwgc28gZS5nLgorICogKCdhJywnYicpIGFuZCAoJ0EnLCdCJykgdW5k ZXIgYSBjYXNlLWluc2Vuc2l0aXZlIElDVSBjb2xsYXRpb24gYXJlCisgKiBjb3JyZWN0bHkgcmVj b2duaXNlZCBhcyB0aGUgc2FtZSBib3VuZC4KKyAqLworc3RhdGljIHZvaWQKK2NoZWNrX3NwbGl0 X3BhcnRpdGlvbl9ub3Rfc2FtZV9ib3VuZChSZWxhdGlvbiBwYXJlbnQsCisJCQkJCQkJCQkgT2lk IHNwbGl0UGFydE9pZCwKKwkJCQkJCQkJCSBTaW5nbGVQYXJ0aXRpb25TcGVjICoqcGFydHMsCisJ CQkJCQkJCQkgaW50IG5wYXJ0cywKKwkJCQkJCQkJCSBQYXJzZVN0YXRlICpwc3RhdGUpCit7CisJ UGFydGl0aW9uS2V5IGtleSA9IFJlbGF0aW9uR2V0UGFydGl0aW9uS2V5KHBhcmVudCk7CisJUGFy dGl0aW9uQm91bmRTcGVjICpuZXdfc3BlYzsKKwlQYXJ0aXRpb25Cb3VuZFNwZWMgKnNwbGl0X3Nw ZWM7CisKKwlpZiAobnBhcnRzICE9IDEpCisJCXJldHVybjsKKworCW5ld19zcGVjID0gcGFydHNb MF0tPmJvdW5kOworCXNwbGl0X3NwZWMgPSBnZXRfcGFydGl0aW9uX2JvdW5kX3NwZWMoc3BsaXRQ YXJ0T2lkKTsKKworCUFzc2VydChuZXdfc3BlYy0+c3RyYXRlZ3kgPT0gc3BsaXRfc3BlYy0+c3Ry YXRlZ3kpOworCisJaWYgKGtleS0+c3RyYXRlZ3kgPT0gUEFSVElUSU9OX1NUUkFURUdZX1JBTkdF KQorCXsKKwkJUGFydGl0aW9uUmFuZ2VCb3VuZCAqbmV3X2xvd2VyOworCQlQYXJ0aXRpb25SYW5n ZUJvdW5kICpuZXdfdXBwZXI7CisJCVBhcnRpdGlvblJhbmdlQm91bmQgKnNwbGl0X2xvd2VyOwor CQlQYXJ0aXRpb25SYW5nZUJvdW5kICpzcGxpdF91cHBlcjsKKworCQluZXdfbG93ZXIgPSBtYWtl X29uZV9wYXJ0aXRpb25fcmJvdW5kKGtleSwgLTEsIG5ld19zcGVjLT5sb3dlcmRhdHVtcywgdHJ1 ZSk7CisJCW5ld191cHBlciA9IG1ha2Vfb25lX3BhcnRpdGlvbl9yYm91bmQoa2V5LCAtMSwgbmV3 X3NwZWMtPnVwcGVyZGF0dW1zLCBmYWxzZSk7CisJCXNwbGl0X2xvd2VyID0gbWFrZV9vbmVfcGFy dGl0aW9uX3Jib3VuZChrZXksIC0xLCBzcGxpdF9zcGVjLT5sb3dlcmRhdHVtcywgdHJ1ZSk7CisJ CXNwbGl0X3VwcGVyID0gbWFrZV9vbmVfcGFydGl0aW9uX3Jib3VuZChrZXksIC0xLCBzcGxpdF9z cGVjLT51cHBlcmRhdHVtcywgZmFsc2UpOworCisJCWlmIChwYXJ0aXRpb25fcmJvdW5kX2NtcChr ZXktPnBhcnRuYXR0cywga2V5LT5wYXJ0c3VwZnVuYywKKwkJCQkJCQkJIGtleS0+cGFydGNvbGxh dGlvbiwKKwkJCQkJCQkJIG5ld19sb3dlci0+ZGF0dW1zLCBuZXdfbG93ZXItPmtpbmQsIHRydWUs CisJCQkJCQkJCSBzcGxpdF9sb3dlcikgIT0gMCkKKwkJCXJldHVybjsKKwkJaWYgKHBhcnRpdGlv bl9yYm91bmRfY21wKGtleS0+cGFydG5hdHRzLCBrZXktPnBhcnRzdXBmdW5jLAorCQkJCQkJCQkg a2V5LT5wYXJ0Y29sbGF0aW9uLAorCQkJCQkJCQkgbmV3X3VwcGVyLT5kYXR1bXMsIG5ld191cHBl ci0+a2luZCwgZmFsc2UsCisJCQkJCQkJCSBzcGxpdF91cHBlcikgIT0gMCkKKwkJCXJldHVybjsK Kwl9CisJZWxzZQorCXsKKwkJQXNzZXJ0KGtleS0+c3RyYXRlZ3kgPT0gUEFSVElUSU9OX1NUUkFU RUdZX0xJU1QpOworCisJCWlmICghc3BsaXRfcGFydGl0aW9uX3ZhbHVlc19jb250YWluZWRfaW5f bmV3X3BhcnQocGFyZW50LCBzcGxpdFBhcnRPaWQsCisJCQkJCQkJCQkJCQkJCSAgcGFydHNbMF0p KQorCQkJcmV0dXJuOworCX0KKworCWVyZXBvcnQoRVJST1IsCisJCQllcnJjb2RlKEVSUkNPREVf SU5WQUxJRF9PQkpFQ1RfREVGSU5JVElPTiksCisJCQllcnJtc2coImNhbm5vdCBzcGxpdCBwYXJ0 aXRpb24gXCIlc1wiIG9ubHkgdG8gYWRkIGEgREVGQVVMVCBwYXJ0aXRpb24iLAorCQkJCSAgIGdl dF9yZWxfbmFtZShzcGxpdFBhcnRPaWQpKSwKKwkJCWVycmRldGFpbCgiVGhlIG5vbi1ERUZBVUxU IHBhcnRpdGlvbiB3b3VsZCBrZWVwIHRoZSBzYW1lIHBhcnRpdGlvbiBib3VuZC4iKSwKKwkJCWVy cmhpbnQoIlVzZSBDUkVBVEUgVEFCTEUgLi4uIFBBUlRJVElPTiBPRiAuLi4gREVGQVVMVCB0byBh ZGQgYSBERUZBVUxUIHBhcnRpdGlvbi4iKSwKKwkJCXBhcnNlcl9lcnJwb3NpdGlvbihwc3RhdGUs IHBhcnRzWzBdLT5uYW1lLT5sb2NhdGlvbikpOworfQorCiAvKgogICogY2hlY2tfcGFydGl0aW9u c19mb3Jfc3BsaXQKICAqCkBAIC01ODcxLDUgKzYwMTEsMTUgQEAgY2hlY2tfcGFydGl0aW9uc19m b3Jfc3BsaXQoUmVsYXRpb24gcGFyZW50LAogCQkJCQkJCQkJCQkJICBuZXdfcGFydHMsIG5wYXJ0 cywgcHN0YXRlKTsKIAl9CiAKKwkvKgorCSAqIFJlamVjdCB0aGUgZGVnZW5lcmF0ZSBmb3JtIHdo ZXJlIHRoZSBzaW5nbGUgbm9uLURFRkFVTFQgcmVwbGFjZW1lbnQKKwkgKiBwYXJ0aXRpb24ga2Vl cHMgdGhlIGJvdW5kIG9mIHRoZSBzcGxpdCBwYXJ0aXRpb247IHRoZSBjb21tYW5kIHRoZW4gZG9l cworCSAqIG5vdGhpbmcgYmV5b25kIGFkZGluZyBhIERFRkFVTFQgcGFydGl0aW9uLiAgQ29udGFp bm1lbnQgd2FzIGVzdGFibGlzaGVkCisJICogYnkgdGhlIHBlci1wYXJ0aXRpb24gdmFsaWRhdGlv biBhYm92ZSwgc28gYW4gZXF1YWxpdHkgY2hlY2sgaXMgZW5vdWdoLgorCSAqLworCWlmICghaXNT cGxpdFBhcnREZWZhdWx0ICYmIGNyZWF0ZURlZmF1bHRQYXJ0KQorCQljaGVja19zcGxpdF9wYXJ0 aXRpb25fbm90X3NhbWVfYm91bmQocGFyZW50LCBzcGxpdFBhcnRPaWQsIG5ld19wYXJ0cywKKwkJ CQkJCQkJCQkJIG5wYXJ0cywgcHN0YXRlKTsKKwogCXBmcmVlKG5ld19wYXJ0cyk7CiB9CmRpZmYg LS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3BhcnRpdGlvbl9zcGxpdC5vdXQgYi9z cmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3BhcnRpdGlvbl9zcGxpdC5vdXQKaW5kZXggMmI5YTZh YTUwZWQuLjJmZDlhZWUxZGNjIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVk L3BhcnRpdGlvbl9zcGxpdC5vdXQKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9wYXJ0 aXRpb25fc3BsaXQub3V0CkBAIC0xMTg4LDYgKzExODgsNjUgQEAgU0VMRUNUIHRhYmxlb2lkOjpy ZWdjbGFzcywgKiBGUk9NIHNhbGVzX3JhbmdlIE9SREVSIEJZIHRhYmxlb2lkOjpyZWdjbGFzczo6 dGV4dAogCiBEUk9QIFRBQkxFIHNhbGVzX3JhbmdlOwogLS0KKy0tIFRlc3QgdGhhdCBTUExJVCBQ QVJUSVRJT04gcmVqZWN0cyB0aGUgZGVnZW5lcmF0ZSBjYXNlIHdoZXJlIHRoZSBvbmx5CistLSBu b24tREVGQVVMVCByZXBsYWNlbWVudCBwYXJ0aXRpb24ga2VlcHMgdGhlIG9yaWdpbmFsIGJvdW5k IGFuZCB0aGUgY29tbWFuZAorLS0gbWVyZWx5IGFkZHMgYSBERUZBVUxUIHBhcnRpdGlvbi4KKy0t CitDUkVBVEUgVEFCTEUgdCAoaSBpbnQpIFBBUlRJVElPTiBCWSBSQU5HRSAoaSk7CitDUkVBVEUg VEFCTEUgdHBfMF81MCBQQVJUSVRJT04gT0YgdCBGT1IgVkFMVUVTIEZST00gKDApIFRPICg1MCk7 CitJTlNFUlQgSU5UTyB0IFZBTFVFUyAoMSk7CistLSBFUlJPUgorQUxURVIgVEFCTEUgdCBTUExJ VCBQQVJUSVRJT04gdHBfMF81MCBJTlRPCisgIChQQVJUSVRJT04gdHBfMF81MCBGT1IgVkFMVUVT IEZST00gKDApIFRPICg1MCksCisgICBQQVJUSVRJT04gdHBfZGVmYXVsdCBERUZBVUxUKTsKK0VS Uk9SOiAgY2Fubm90IHNwbGl0IHBhcnRpdGlvbiAidHBfMF81MCIgb25seSB0byBhZGQgYSBERUZB VUxUIHBhcnRpdGlvbgorTElORSAyOiAgIChQQVJUSVRJT04gdHBfMF81MCBGT1IgVkFMVUVTIEZS T00gKDApIFRPICg1MCksCisgICAgICAgICAgICAgICAgICAgICBeCitERVRBSUw6ICBUaGUgbm9u LURFRkFVTFQgcGFydGl0aW9uIHdvdWxkIGtlZXAgdGhlIHNhbWUgcGFydGl0aW9uIGJvdW5kLgor SElOVDogIFVzZSBDUkVBVEUgVEFCTEUgLi4uIFBBUlRJVElPTiBPRiAuLi4gREVGQVVMVCB0byBh ZGQgYSBERUZBVUxUIHBhcnRpdGlvbi4KK0RST1AgVEFCTEUgdDsKKy0tCistLSBUZXN0IHRoYXQg YSBMSVNUIHNwbGl0IHdpdGggREVGQVVMVCBpcyBub3QgY29uc2lkZXJlZCBkZWdlbmVyYXRlIHdo ZW4KKy0tIG9ubHkgTlVMTCBpcyByZW1vdmVkIGZyb20gdGhlIGV4cGxpY2l0IHJlcGxhY2VtZW50 IHBhcnRpdGlvbi4KKy0tCitDUkVBVEUgVEFCTEUgdCAoaSBpbnQpIFBBUlRJVElPTiBCWSBMSVNU IChpKTsKK0NSRUFURSBUQUJMRSB0cF9udWxsXzEgUEFSVElUSU9OIE9GIHQgRk9SIFZBTFVFUyBJ TiAoTlVMTCwgMSk7CitBTFRFUiBUQUJMRSB0IFNQTElUIFBBUlRJVElPTiB0cF9udWxsXzEgSU5U TworICAoUEFSVElUSU9OIHRwXzEgRk9SIFZBTFVFUyBJTiAoMSksCisgICBQQVJUSVRJT04gdHBf ZGVmYXVsdCBERUZBVUxUKTsKK0lOU0VSVCBJTlRPIHQgVkFMVUVTIChOVUxMKSwgKDEpLCAoMik7 CitTRUxFQ1QgdGFibGVvaWQ6OnJlZ2NsYXNzLCBpIEZST00gdCBPUkRFUiBCWSB0YWJsZW9pZDo6 cmVnY2xhc3M6OnRleHQgQ09MTEFURSAiQyIsIGkgTlVMTFMgRklSU1Q7CisgIHRhYmxlb2lkICB8 IGkgCistLS0tLS0tLS0tLS0rLS0tCisgdHBfMSAgICAgICB8IDEKKyB0cF9kZWZhdWx0IHwgIAor IHRwX2RlZmF1bHQgfCAyCisoMyByb3dzKQorCitEUk9QIFRBQkxFIHQ7CistLQorLS0gVGVzdCB0 aGF0IHRoZSBzYW1lLWJvdW5kIGNoZWNrIGZvciBMSVNUIHBhcnRpdGlvbmluZyB1c2VzIHBhcnRp dGlvbgorLS0gY29tcGFyaXNvbiBzZW1hbnRpY3MsIG5vdCByYXcgbGlzdCBsZW5ndGguICBUaGUg Y2FzZS1pbnNlbnNpdGl2ZSBjb2xsYXRpb24KKy0tIHRyZWF0cyAnYScgYW5kICdBJyBhcyBlcXVh bCwgc28gdGhlIG5vbi1ERUZBVUxUIHJlcGxhY2VtZW50IHBhcnRpdGlvbgorLS0gY292ZXJzIG9u bHkgdGhlICdhJyBncm91cCBhbmQgdGhlIERFRkFVTFQgcGFydGl0aW9uIGNvdmVycyB0aGUgcmVz dC4KKy0tCitDUkVBVEUgQ09MTEFUSU9OIGNhc2VfaW5zZW5zaXRpdmUgKHByb3ZpZGVyID0gaWN1 LCBsb2NhbGUgPSAndW5kLXUta3MtbGV2ZWwyJywgZGV0ZXJtaW5pc3RpYyA9IGZhbHNlKTsKK0NS RUFURSBUQUJMRSB0IChiIHRleHQgQ09MTEFURSBjYXNlX2luc2Vuc2l0aXZlKSBQQVJUSVRJT04g QlkgTElTVCAoYik7CitDUkVBVEUgVEFCTEUgdHBfYWIgUEFSVElUSU9OIE9GIHQgRk9SIFZBTFVF UyBJTiAoJ2EnLCAnYicpOworQUxURVIgVEFCTEUgdCBTUExJVCBQQVJUSVRJT04gdHBfYWIgSU5U TworICAoUEFSVElUSU9OIHRwX2EgRk9SIFZBTFVFUyBJTiAoJ2EnLCAnQScpLAorICAgUEFSVElU SU9OIHRwX2RlZmF1bHQgREVGQVVMVCk7CitJTlNFUlQgSU5UTyB0IFZBTFVFUyAoJ2EnKSwgKCdB JyksICgnYicpLCAoJ2MnKTsKK1NFTEVDVCB0YWJsZW9pZDo6cmVnY2xhc3MsIGNvdW50KCopIEZS T00gdCBHUk9VUCBCWSAxIE9SREVSIEJZIDE7CisgIHRhYmxlb2lkICB8IGNvdW50IAorLS0tLS0t LS0tLS0tKy0tLS0tLS0KKyB0cF9hICAgICAgIHwgICAgIDIKKyB0cF9kZWZhdWx0IHwgICAgIDIK KygyIHJvd3MpCisKK0RST1AgVEFCTEUgdDsKK0RST1AgQ09MTEFUSU9OIGNhc2VfaW5zZW5zaXRp dmU7CistLQogLS0gVGVzdCB0aGF0IHRoZSBleHBsaWNpdCBwYXJ0aXRpb24gYm91bmQgY2Fubm90 IGV4dGVuZCBvdXRzaWRlIHRoZSBzcGxpdAogLS0gcGFydGl0aW9uJ3MgYm91bmQgd2hlbiBhIERF RkFVTFQgcGFydGl0aW9uIGlzIHNwZWNpZmllZC4KIC0tCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9y ZWdyZXNzL3NxbC9wYXJ0aXRpb25fc3BsaXQuc3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvcGFy dGl0aW9uX3NwbGl0LnNxbAppbmRleCBkOTgyMWM1ZTJhMy4uZWRlODlhZDAyMjggMTAwNjQ0Ci0t LSBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3BhcnRpdGlvbl9zcGxpdC5zcWwKKysrIGIvc3JjL3Rl c3QvcmVncmVzcy9zcWwvcGFydGl0aW9uX3NwbGl0LnNxbApAQCAtODM0LDYgKzgzNCw1OCBAQCBT RUxFQ1QgdGFibGVvaWQ6OnJlZ2NsYXNzLCAqIEZST00gc2FsZXNfcmFuZ2UgT1JERVIgQlkgdGFi bGVvaWQ6OnJlZ2NsYXNzOjp0ZXh0CiAKIERST1AgVEFCTEUgc2FsZXNfcmFuZ2U7CiAKKy0tCist LSBUZXN0IHRoYXQgU1BMSVQgUEFSVElUSU9OIHJlamVjdHMgdGhlIGRlZ2VuZXJhdGUgY2FzZSB3 aGVyZSB0aGUgb25seQorLS0gbm9uLURFRkFVTFQgcmVwbGFjZW1lbnQgcGFydGl0aW9uIGtlZXBz IHRoZSBvcmlnaW5hbCBib3VuZCBhbmQgdGhlIGNvbW1hbmQKKy0tIG1lcmVseSBhZGRzIGEgREVG QVVMVCBwYXJ0aXRpb24uCistLQorQ1JFQVRFIFRBQkxFIHQgKGkgaW50KSBQQVJUSVRJT04gQlkg UkFOR0UgKGkpOworQ1JFQVRFIFRBQkxFIHRwXzBfNTAgUEFSVElUSU9OIE9GIHQgRk9SIFZBTFVF UyBGUk9NICgwKSBUTyAoNTApOworSU5TRVJUIElOVE8gdCBWQUxVRVMgKDEpOworCistLSBFUlJP UgorQUxURVIgVEFCTEUgdCBTUExJVCBQQVJUSVRJT04gdHBfMF81MCBJTlRPCisgIChQQVJUSVRJ T04gdHBfMF81MCBGT1IgVkFMVUVTIEZST00gKDApIFRPICg1MCksCisgICBQQVJUSVRJT04gdHBf ZGVmYXVsdCBERUZBVUxUKTsKKworRFJPUCBUQUJMRSB0OworCistLQorLS0gVGVzdCB0aGF0IGEg TElTVCBzcGxpdCB3aXRoIERFRkFVTFQgaXMgbm90IGNvbnNpZGVyZWQgZGVnZW5lcmF0ZSB3aGVu CistLSBvbmx5IE5VTEwgaXMgcmVtb3ZlZCBmcm9tIHRoZSBleHBsaWNpdCByZXBsYWNlbWVudCBw YXJ0aXRpb24uCistLQorQ1JFQVRFIFRBQkxFIHQgKGkgaW50KSBQQVJUSVRJT04gQlkgTElTVCAo aSk7CitDUkVBVEUgVEFCTEUgdHBfbnVsbF8xIFBBUlRJVElPTiBPRiB0IEZPUiBWQUxVRVMgSU4g KE5VTEwsIDEpOworCitBTFRFUiBUQUJMRSB0IFNQTElUIFBBUlRJVElPTiB0cF9udWxsXzEgSU5U TworICAoUEFSVElUSU9OIHRwXzEgRk9SIFZBTFVFUyBJTiAoMSksCisgICBQQVJUSVRJT04gdHBf ZGVmYXVsdCBERUZBVUxUKTsKKworSU5TRVJUIElOVE8gdCBWQUxVRVMgKE5VTEwpLCAoMSksICgy KTsKK1NFTEVDVCB0YWJsZW9pZDo6cmVnY2xhc3MsIGkgRlJPTSB0IE9SREVSIEJZIHRhYmxlb2lk OjpyZWdjbGFzczo6dGV4dCBDT0xMQVRFICJDIiwgaSBOVUxMUyBGSVJTVDsKKworRFJPUCBUQUJM RSB0OworCistLQorLS0gVGVzdCB0aGF0IHRoZSBzYW1lLWJvdW5kIGNoZWNrIGZvciBMSVNUIHBh cnRpdGlvbmluZyB1c2VzIHBhcnRpdGlvbgorLS0gY29tcGFyaXNvbiBzZW1hbnRpY3MsIG5vdCBy YXcgbGlzdCBsZW5ndGguICBUaGUgY2FzZS1pbnNlbnNpdGl2ZSBjb2xsYXRpb24KKy0tIHRyZWF0 cyAnYScgYW5kICdBJyBhcyBlcXVhbCwgc28gdGhlIG5vbi1ERUZBVUxUIHJlcGxhY2VtZW50IHBh cnRpdGlvbgorLS0gY292ZXJzIG9ubHkgdGhlICdhJyBncm91cCBhbmQgdGhlIERFRkFVTFQgcGFy dGl0aW9uIGNvdmVycyB0aGUgcmVzdC4KKy0tCitDUkVBVEUgQ09MTEFUSU9OIGNhc2VfaW5zZW5z aXRpdmUgKHByb3ZpZGVyID0gaWN1LCBsb2NhbGUgPSAndW5kLXUta3MtbGV2ZWwyJywgZGV0ZXJt aW5pc3RpYyA9IGZhbHNlKTsKK0NSRUFURSBUQUJMRSB0IChiIHRleHQgQ09MTEFURSBjYXNlX2lu c2Vuc2l0aXZlKSBQQVJUSVRJT04gQlkgTElTVCAoYik7CitDUkVBVEUgVEFCTEUgdHBfYWIgUEFS VElUSU9OIE9GIHQgRk9SIFZBTFVFUyBJTiAoJ2EnLCAnYicpOworCitBTFRFUiBUQUJMRSB0IFNQ TElUIFBBUlRJVElPTiB0cF9hYiBJTlRPCisgIChQQVJUSVRJT04gdHBfYSBGT1IgVkFMVUVTIElO ICgnYScsICdBJyksCisgICBQQVJUSVRJT04gdHBfZGVmYXVsdCBERUZBVUxUKTsKKworSU5TRVJU IElOVE8gdCBWQUxVRVMgKCdhJyksICgnQScpLCAoJ2InKSwgKCdjJyk7CitTRUxFQ1QgdGFibGVv aWQ6OnJlZ2NsYXNzLCBjb3VudCgqKSBGUk9NIHQgR1JPVVAgQlkgMSBPUkRFUiBCWSAxOworCitE Uk9QIFRBQkxFIHQ7CitEUk9QIENPTExBVElPTiBjYXNlX2luc2Vuc2l0aXZlOworCiAtLQogLS0g VGVzdCB0aGF0IHRoZSBleHBsaWNpdCBwYXJ0aXRpb24gYm91bmQgY2Fubm90IGV4dGVuZCBvdXRz aWRlIHRoZSBzcGxpdAogLS0gcGFydGl0aW9uJ3MgYm91bmQgd2hlbiBhIERFRkFVTFQgcGFydGl0 aW9uIGlzIHNwZWNpZmllZC4KLS0gCjIuMzkuNSAoQXBwbGUgR2l0LTE1NCkKCg== --0000000000006f9ef606522998f9--