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 1sS6bF-00452t-WA for pgsql-hackers@arkaria.postgresql.org; Fri, 12 Jul 2024 03:05:34 +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 1sS6bD-003ld4-6a for pgsql-hackers@arkaria.postgresql.org; Fri, 12 Jul 2024 03:05:31 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1sS6bC-003lcw-Rk for pgsql-hackers@lists.postgresql.org; Fri, 12 Jul 2024 03:05:30 +0000 Received: from mail-lf1-x131.google.com ([2a00:1450:4864:20::131]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1sS6bA-001euL-Do for pgsql-hackers@lists.postgresql.org; Fri, 12 Jul 2024 03:05:30 +0000 Received: by mail-lf1-x131.google.com with SMTP id 2adb3069b0e04-52ea3e499b1so1762755e87.3 for ; Thu, 11 Jul 2024 20:05:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1720753527; x=1721358327; darn=lists.postgresql.org; h=in-reply-to:from:content-language:references:cc:to:subject :user-agent:mime-version:date:message-id:from:to:cc:subject:date :message-id:reply-to; bh=78m5VeIDOcjDErdXxhFhPIKRHBkmMxwz7uwliv29OSs=; b=UuwesYiPFXqltQkxy6W+v9RIrdvrYOyED06eX3SpTmkU7oHvC01sTxDUixQKMdxbMI jkRGGZ6fyjMSsD+RxJPNqEcHZZJw4/Kg9YDbGEYfGcyZpGlUJzeGiHsjQpLt/1+bEzy7 XcjtdQ35PfTG3f3Byf4VU080HRsUyAMUQdurGcWxasvCET8RRUy3nQKA4Ynhg/L5p4+D /zOzY2/kSNfjK+l0aCRwVbNOxCov6YZHHCMOfmETMCoDIB/fMH7RPdLFlw9EhWK84j/p KwlXwRhfOCs3PuFCj9KQ7jaTLRkmV0TN56vWVIdngQojYCayEnb1M51dDLaqNXt0SnY9 Cq3g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720753527; x=1721358327; h=in-reply-to:from:content-language:references:cc:to:subject :user-agent:mime-version:date:message-id:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=78m5VeIDOcjDErdXxhFhPIKRHBkmMxwz7uwliv29OSs=; b=JyBYljsl+Mg97OKOg/nUPUOItqtYqtQBdtqo+WeuIHgxeeqCVKchJVNFKHuBXi0Or2 s9NLkpVFI5FbBZQ65JVt0mS2kkYKkespZPBfK9NW8/0u8rfMpMLQu2Wvvkh4Frii37SW sz3JW41nFkBFWWIVq2A66QYaBzEEUQIu5b1SiwcTM7cbt91X3Z0LALTGNsDUsssbcpNz sfFt1a2jocKt9J8CqbxnXsPNZzsGWFeRDn/LMhNkPDdBRquu8x1fj52s6DS3ml9xI6aH ZCb9o0iYQ1u0YE3khAO7NQbJyNdMXuBaKZYMEAdr+n53TmhCoU5sdr3dFBvJ915sdJsh AXyw== X-Forwarded-Encrypted: i=1; AJvYcCXDPiEXinDo6ENGa3JHOvftDK57U1AG9XIkso8VGLnfQh77ARWiCG4CrLp87ivasoKvdbIe2NbHJ84e8BdB+IAddAj9LtmR+eNEA0h3L+wr8nzW X-Gm-Message-State: AOJu0YzR0jhFE9Kh6/KoM9TQg5zBlfgrRG/AX3/YrVsgCCqRjYiQk23O KVdcsdfQr+LcRvIjnx6trPnFCv/z+Oh9cCV69Gb6B5STQXfA34OC X-Google-Smtp-Source: AGHT+IHZsXyuYABM81MontmyY/Iq1a26wwbRhSIfn234gP4NqJL2a1mxk+OWwIhd5SVzcwohcmSIzw== X-Received: by 2002:ac2:53a5:0:b0:52e:9882:2cd8 with SMTP id 2adb3069b0e04-52eb9993805mr5254291e87.4.1720753526990; Thu, 11 Jul 2024 20:05:26 -0700 (PDT) Received: from [10.10.20.99] (node-bah.pool-113-53.dynamic.totinternet.net. [113.53.57.41]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-52eb9079881sm1136781e87.306.2024.07.11.20.05.21 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 11 Jul 2024 20:05:26 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------l0IjGa7Q94GjaowKWaYxlv6K" Message-ID: <5b49501c-9cb3-4c5d-9d56-49704ff08143@gmail.com> Date: Fri, 12 Jul 2024 10:05:15 +0700 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Removing unneeded self joins To: jian he , Alexander Korotkov Cc: Tom Lane , Robert Haas , Andrei Lepikhov , Richard Guo , Alexander Lakhin , "Gregory Stark (as CFM)" , =?UTF-8?Q?Micha=C5=82_K=C5=82eczek?= , PostgreSQL Hackers References: <64486b0b-0404-e39e-322d-0801154901f3@postgrespro.ru> <735b5cd4-568d-fbf7-ad8c-dcfb4c3af86e@gmail.com> <2422119.1714691974@sss.pgh.pa.us> <24e93efd-eeac-43a6-a75a-ad68eacb32ee@postgrespro.ru> <3622801.1715010885@sss.pgh.pa.us> <96250a42-20e3-40f0-9d45-f53ae852f8ed@gmail.com> Content-Language: en-AU From: Andrei Lepikhov In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------l0IjGa7Q94GjaowKWaYxlv6K Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 7/11/24 14:43, jian he wrote: > On Tue, Jul 9, 2024 at 2:06 PM Andrei Lepikhov wrote: >> >> On 7/2/24 07:25, jian he wrote: >>> to make sure it's correct, I have added a lot of tests, >>> Some of this may be contrived, maybe some of the tests are redundant. >> Thanks for your job! >> I passed through the patches and have some notes: >> 1. Patch 0001 has not been applied anymore since the previous week's >> changes in the core. Also, there is one place with trailing whitespace. > > thanks. > because the previous thread mentioned the EPQ problem. > in remove_useless_self_joins, i make it can only process CMD_SELECT query. I would like to oppose here: IMO, it is just a mishap which we made because of a long history of patch transformations. There we lost the case where RowMark exists for only one of candidate relations. Also, after review I think we don't need so many new tests. Specifically for DML we already have one: EXPLAIN (COSTS OFF) UPDATE sj sq SET b = 1 FROM sj as sz WHERE sq.a = sz.a; And we should just add something to elaborate it a bit. See the patch in attachment containing my proposal to improve v4-0001 main SJE patch. I think it resolved the issue with EPQ assertion as well as problems with returning value. -- regards, Andrei Lepikhov --------------l0IjGa7Q94GjaowKWaYxlv6K Content-Type: text/x-patch; charset=UTF-8; name="v4-0002-Apply-SJE-to-DML-queries-2.patch" Content-Disposition: attachment; filename="v4-0002-Apply-SJE-to-DML-queries-2.patch" Content-Transfer-Encoding: base64 RnJvbSBjMDRhZGQzMDk5OWVjZDY0YzUxYmRlN2RiNTZhNmU1NjM3YzE2Yzc0IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiAiQW5kcmVpIFYuIExlcGlraG92IiA8bGVwaWhvdkBn bWFpbC5jb20+CkRhdGU6IFR1ZSwgOSBKdWwgMjAyNCAxMjoyNToyMyArMDcwMApTdWJqZWN0 OiBbUEFUQ0hdIEFwcGx5IFNKRSB0byBETUwgcXVlcmllczogSnVzdCBkb24ndCBpbmNsdWRl IHJlc3VsdCByZWxhdGlvbgogdG8gdGhlIHNldCBvZiBTSkUgY2FuZGlkYXRlcy4KCkFsc28s IGZpeCB0aGUgc3VidGxlIGJ1ZyB3aXRoIFJvd01hcmtzLgotLS0KIHNyYy9iYWNrZW5kL29w dGltaXplci9wbGFuL2FuYWx5emVqb2lucy5jIHwgMjQgKysrLS0tLS0tCiBzcmMvdGVzdC9y ZWdyZXNzL2V4cGVjdGVkL2pvaW4ub3V0ICAgICAgICB8IDYxICsrKysrKysrKysrKysrKysr KysrKysrCiBzcmMvdGVzdC9yZWdyZXNzL3NxbC9qb2luLnNxbCAgICAgICAgICAgICB8IDE3 ICsrKysrKy0KIDMgZmlsZXMgY2hhbmdlZCwgODQgaW5zZXJ0aW9ucygrKSwgMTggZGVsZXRp b25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vYW5hbHl6 ZWpvaW5zLmMgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9hbmFseXplam9pbnMuYwpp bmRleCBiYjE0NTk3NzYyLi5kMmI5YmE3YzA4IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9v cHRpbWl6ZXIvcGxhbi9hbmFseXplam9pbnMuYworKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6 ZXIvcGxhbi9hbmFseXplam9pbnMuYwpAQCAtMTg2MCwxMCArMTg2MCw2IEBAIHJlbW92ZV9z ZWxmX2pvaW5fcmVsKFBsYW5uZXJJbmZvICpyb290LCBQbGFuUm93TWFyayAqa21hcmssIFBs YW5Sb3dNYXJrICpybWFyaywKIAkvKiByZXN0b3JlIHRoZSByYW5nZXRibHJlZiBpbiBhIHBy b3BlciBvcmRlci4gKi8KIAlyZXN0b3JlX3JhbmdldGJscmVmKChOb2RlICopIHJvb3QtPnBh cnNlLCB0b0tlZXAtPnJlbGlkLCB0b1JlbW92ZS0+cmVsaWQsIDAsIDApOwogCi0JLyogU2Vl IHJlbW92ZV9zZWxmX2pvaW5zX29uZV9ncm91cCgpICovCi0JQXNzZXJ0KHJvb3QtPnBhcnNl LT5yZXN1bHRSZWxhdGlvbiAhPSB0b1JlbW92ZS0+cmVsaWQpOwotCUFzc2VydChyb290LT5w YXJzZS0+cmVzdWx0UmVsYXRpb24gIT0gdG9LZWVwLT5yZWxpZCk7Ci0KIAkvKiBSZXBsYWNl IGxpbmtzIGluIHRoZSBwbGFubmVyIGluZm8gKi8KIAlyZW1vdmVfcmVsX2Zyb21fcXVlcnko cm9vdCwgdG9SZW1vdmUsIHRvS2VlcC0+cmVsaWQsIE5VTEwsIE5VTEwpOwogCkBAIC0yMDQ2 LDE0ICsyMDQyLDYgQEAgcmVtb3ZlX3NlbGZfam9pbnNfb25lX2dyb3VwKFBsYW5uZXJJbmZv ICpyb290LCBSZWxpZHMgcmVsaWRzKQogCXsKIAkJUmVsT3B0SW5mbyAqaW5uZXIgPSByb290 LT5zaW1wbGVfcmVsX2FycmF5W3JdOwogCi0JCS8qCi0JCSAqIFdlIGRvbid0IGFjY2VwdCBy ZXN1bHQgcmVsYXRpb24gYXMgZWl0aGVyIHNvdXJjZSBvciB0YXJnZXQgcmVsYXRpb24KLQkJ ICogb2YgU0pFLCBiZWNhdXNlIHJlc3VsdCByZWxhdGlvbiBoYXMgZGlmZmVyZW50IGJlaGF2 aW9yIGluCi0JCSAqIEV2YWxQbGFuUXVhbCgpIGFuZCBSRVRVUk5JTkcgY2xhdXNlLgotCQkg Ki8KLQkJaWYgKHJvb3QtPnBhcnNlLT5yZXN1bHRSZWxhdGlvbiA9PSByKQotCQkJY29udGlu dWU7Ci0KIAkJayA9IHI7CiAKIAkJd2hpbGUgKChrID0gYm1zX25leHRfbWVtYmVyKHJlbGlk cywgaykpID4gMCkKQEAgLTIwNjksOSArMjA1Nyw2IEBAIHJlbW92ZV9zZWxmX2pvaW5zX29u ZV9ncm91cChQbGFubmVySW5mbyAqcm9vdCwgUmVsaWRzIHJlbGlkcykKIAkJCVBsYW5Sb3dN YXJrICppbWFyayA9IE5VTEw7CiAJCQlMaXN0CSAgICp1Y2xhdXNlcyA9IE5JTDsKIAotCQkJ aWYgKHJvb3QtPnBhcnNlLT5yZXN1bHRSZWxhdGlvbiA9PSBrKQotCQkJCWNvbnRpbnVlOwot CiAJCQkvKiBBIHNhbml0eSBjaGVjazogdGhlIHJlbGF0aW9ucyBoYXZlIHRoZSBzYW1lIE9p ZC4gKi8KIAkJCUFzc2VydChyb290LT5zaW1wbGVfcnRlX2FycmF5W2tdLT5yZWxpZCA9PQog CQkJCSAgIHJvb3QtPnNpbXBsZV9ydGVfYXJyYXlbcl0tPnJlbGlkKTsKQEAgLTIxMjEsNyAr MjEwNiw4IEBAIHJlbW92ZV9zZWxmX2pvaW5zX29uZV9ncm91cChQbGFubmVySW5mbyAqcm9v dCwgUmVsaWRzIHJlbGlkcykKIAkJCQlpZiAob21hcmsgJiYgaW1hcmspCiAJCQkJCWJyZWFr OwogCQkJfQotCQkJaWYgKG9tYXJrICYmIGltYXJrICYmIG9tYXJrLT5tYXJrVHlwZSAhPSBp bWFyay0+bWFya1R5cGUpCisJCQlpZiAoKChvbWFyayA9PSBOVUxMKSBeIChpbWFyayA9PSBO VUxMKSkgfHwKKwkJCQkob21hcmsgJiYgb21hcmstPm1hcmtUeXBlICE9IGltYXJrLT5tYXJr VHlwZSkpCiAJCQkJY29udGludWU7CiAKIAkJCS8qCkBAIC0yMjMxLDcgKzIyMTcsOCBAQCBy ZW1vdmVfc2VsZl9qb2luc19yZWN1cnNlKFBsYW5uZXJJbmZvICpyb290LCBMaXN0ICpqb2lu bGlzdCwgUmVsaWRzIHRvUmVtb3ZlKQogCQkJICovCiAJCQlpZiAocnRlLT5ydGVraW5kID09 IFJURV9SRUxBVElPTiAmJgogCQkJCXJ0ZS0+cmVsa2luZCA9PSBSRUxLSU5EX1JFTEFUSU9O ICYmCi0JCQkJcnRlLT50YWJsZXNhbXBsZSA9PSBOVUxMKQorCQkJCXJ0ZS0+dGFibGVzYW1w bGUgPT0gTlVMTCAmJgorCQkJCXZhcm5vICE9IHJvb3QtPnBhcnNlLT5yZXN1bHRSZWxhdGlv bikKIAkJCXsKIAkJCQlBc3NlcnQoIWJtc19pc19tZW1iZXIodmFybm8sIHJlbGlkcykpOwog CQkJCXJlbGlkcyA9IGJtc19hZGRfbWVtYmVyKHJlbGlkcywgdmFybm8pOwpAQCAtMjMwMCw2 ICsyMjg3LDkgQEAgcmVtb3ZlX3NlbGZfam9pbnNfcmVjdXJzZShQbGFubmVySW5mbyAqcm9v dCwgTGlzdCAqam9pbmxpc3QsIFJlbGlkcyB0b1JlbW92ZSkKIAogCQkJCXJlbGlkcyA9IGJt c19kZWxfbWVtYmVycyhyZWxpZHMsIGdyb3VwKTsKIAorCQkJCS8qIERvbid0IGFwcGx5IFNK RSB0byByZXN1bHQgcmVsYXRpb24gKi8KKwkJCQlBc3NlcnQoIWJtc19pc19tZW1iZXIocm9v dC0+cGFyc2UtPnJlc3VsdFJlbGF0aW9uLCBncm91cCkpOworCiAJCQkJLyoKIAkJCQkgKiBU cnkgdG8gcmVtb3ZlIHNlbGYtam9pbnMgZnJvbSBhIGdyb3VwIG9mIGlkZW50aWNhbCBlbnRy aWVzLgogCQkJCSAqIE1ha2UgdGhlIG5leHQgYXR0ZW1wdCBpdGVyYXRpdmVseSAtIGlmIHNv bWV0aGluZyBpcyBkZWxldGVkCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVj dGVkL2pvaW4ub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qb2luLm91dAppbmRl eCA0ZTRjZWM2MzNhLi43OGRmY2Q0ODY2IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNz L2V4cGVjdGVkL2pvaW4ub3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvam9p bi5vdXQKQEAgLTcwNjgsNiArNzA2OCwxOCBAQCBVUERBVEUgc2ogc3EgU0VUIGIgPSAxIEZS T00gc2ogYXMgc3ogV0hFUkUgc3EuYSA9IHN6LmE7CiAgICAgICAgICAgICAgICAtPiAgU2Vx IFNjYW4gb24gc2ogc3oKICg2IHJvd3MpCiAKK0VYUExBSU4gKENPU1RTIE9GRikKK1VQREFU RSBzaiBzcSBTRVQgYiA9IHN6LmIgRlJPTSBzaiBhcyBzeiBXSEVSRSBzcS5hID0gc3ouYTsK KyAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBVcGRhdGUgb24gc2ogc3EKKyAgIC0+ICBOZXN0 ZWQgTG9vcAorICAgICAgICAgSm9pbiBGaWx0ZXI6IChzcS5hID0gc3ouYSkKKyAgICAgICAg IC0+ICBTZXEgU2NhbiBvbiBzaiBzcQorICAgICAgICAgLT4gIE1hdGVyaWFsaXplCisgICAg ICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24gc2ogc3oKKyg2IHJvd3MpCisKIENSRUFURSBS VUxFIHNqX2RlbF9ydWxlIEFTIE9OIERFTEVURSBUTyBzagogICBETyBJTlNURUFECiAgICAg VVBEQVRFIHNqIFNFVCBhID0gMSBXSEVSRSBhID0gb2xkLmE7CkBAIC03MDgzLDYgKzcwOTUs NTUgQEAgRVhQTEFJTiAoQ09TVFMgT0ZGKSBERUxFVEUgRlJPTSBzajsKICg2IHJvd3MpCiAK IERST1AgUlVMRSBzal9kZWxfcnVsZSBPTiBzaiBDQVNDQURFOworLS0gQWxsb3cgU0pFLCBy ZW1vdmUgKHMyIEpPSU4gczMpLgorRVhQTEFJTiAoQ09TVFMgT0ZGKQorVVBEQVRFIHNqIHMx IFNFVCBiID0gczIuYiwgYSA9IHMzLmEgRlJPTSBzaiBBUyBzMiwgc2ogQVMgczMKK1dIRVJF IHMxLmEgPSBzMi5hIEFORCBzMS5hPXMzLmEgUkVUVVJOSU5HIHMxLiosczIuKixzMy4qOwor ICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgCistLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBVcGRhdGUgb24gc2og czEKKyAgIC0+ICBOZXN0ZWQgTG9vcAorICAgICAgICAgSm9pbiBGaWx0ZXI6IChzMS5hID0g czMuYSkKKyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBzaiBzMQorICAgICAgICAgLT4gIE1h dGVyaWFsaXplCisgICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24gc2ogczMKKyAgICAg ICAgICAgICAgICAgICAgIEZpbHRlcjogKGEgSVMgTk9UIE5VTEwpCisoNyByb3dzKQorCist LSBBbGxvdyBTSkUsIGJ1dCBpdCBpcyBqdXN0IGltcG9zc2libGUKK0VYUExBSU4gKENPU1RT IE9GRikKK1VQREFURSBzaiBzMSBTRVQgYiA9IHMyLmIsIGEgPSBzMy5hIEZST00gc2ogQVMg czIsIHNqIEFTIHMzCitXSEVSRSBzMS5hID0gczIuYSBBTkQgczEuYj1zMy5iOworICAgICAg ICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFVwZGF0ZSBvbiBz aiBzMQorICAgLT4gIE5lc3RlZCBMb29wCisgICAgICAgICBKb2luIEZpbHRlcjogKHMxLmIg PSBzMy5iKQorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHNqIHMzCisgICAgICAgICAtPiAg TWF0ZXJpYWxpemUKKyAgICAgICAgICAgICAgIC0+ICBOZXN0ZWQgTG9vcAorICAgICAgICAg ICAgICAgICAgICAgSm9pbiBGaWx0ZXI6IChzMS5hID0gczIuYSkKKyAgICAgICAgICAgICAg ICAgICAgIC0+ICBTZXEgU2NhbiBvbiBzaiBzMQorICAgICAgICAgICAgICAgICAgICAgLT4g IE1hdGVyaWFsaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4g b24gc2ogczIKKygxMCByb3dzKQorCistLSBBbGxvdyBTSkUuIE9uZSBtb3JlIHNob3QgZm9y IHRoZSBjYXNlIG9mIHN1YnF1ZXJ5CitFWFBMQUlOIChDT1NUUyBPRkYpCitVUERBVEUgc2og czEgU0VUIGIgPSBxLmIsIGEgPSBxLmEgRlJPTSAoCisgIFNFTEVDVCBzMi5hIEFTIGEsIHMz LmIgQVMgYiBGUk9NIHNqIEFTIHMyLCBzaiBBUyBzMworICBXSEVSRSBzMi5hPXMzLmEpIEFT IHEgV0hFUkUgczEuYj1xLmE7CisgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAg ICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQorIFVwZGF0ZSBvbiBzaiBzMQorICAgLT4gIE5lc3RlZCBMb29wCisgICAgICAgICBK b2luIEZpbHRlcjogKHMzLmEgPSBzMS5iKQorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHNq IHMxCisgICAgICAgICAtPiAgTWF0ZXJpYWxpemUKKyAgICAgICAgICAgICAgIC0+ICBTZXEg U2NhbiBvbiBzaiBzMworICAgICAgICAgICAgICAgICAgICAgRmlsdGVyOiAoYSBJUyBOT1Qg TlVMTCkKKyg3IHJvd3MpCisKIC0tIENoZWNrIHRoYXQgU0pFIGRvZXMgbm90IG1pc3Rha2Vu bHkgb21pdCBxdWFsIGNsYXVzZXMgKGJ1ZyAjMTgxODcpCiBpbnNlcnQgaW50byBlbXAxIHZh bHVlcyAoMSwgMSk7CiBleHBsYWluIChjb3N0cyBvZmYpCmRpZmYgLS1naXQgYS9zcmMvdGVz dC9yZWdyZXNzL3NxbC9qb2luLnNxbCBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2pvaW4uc3Fs CmluZGV4IDNlOTRlMGFmNTMuLjdiMzJhOWJiOTUgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3Jl Z3Jlc3Mvc3FsL2pvaW4uc3FsCisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2pvaW4uc3Fs CkBAIC0yNzI0LDEzICsyNzI0LDI4IEBAIFRSVU5DQVRFIGVtcDE7CiAKIEVYUExBSU4gKENP U1RTIE9GRikKIFVQREFURSBzaiBzcSBTRVQgYiA9IDEgRlJPTSBzaiBhcyBzeiBXSEVSRSBz cS5hID0gc3ouYTsKLQorRVhQTEFJTiAoQ09TVFMgT0ZGKQorVVBEQVRFIHNqIHNxIFNFVCBi ID0gc3ouYiBGUk9NIHNqIGFzIHN6IFdIRVJFIHNxLmEgPSBzei5hOwogQ1JFQVRFIFJVTEUg c2pfZGVsX3J1bGUgQVMgT04gREVMRVRFIFRPIHNqCiAgIERPIElOU1RFQUQKICAgICBVUERB VEUgc2ogU0VUIGEgPSAxIFdIRVJFIGEgPSBvbGQuYTsKIEVYUExBSU4gKENPU1RTIE9GRikg REVMRVRFIEZST00gc2o7CiBEUk9QIFJVTEUgc2pfZGVsX3J1bGUgT04gc2ogQ0FTQ0FERTsK IAorLS0gQWxsb3cgU0pFLCByZW1vdmUgKHMyIEpPSU4gczMpLgorRVhQTEFJTiAoQ09TVFMg T0ZGKQorVVBEQVRFIHNqIHMxIFNFVCBiID0gczIuYiwgYSA9IHMzLmEgRlJPTSBzaiBBUyBz Miwgc2ogQVMgczMKK1dIRVJFIHMxLmEgPSBzMi5hIEFORCBzMS5hPXMzLmEgUkVUVVJOSU5H IHMxLiosczIuKixzMy4qOworLS0gQWxsb3cgU0pFLCBidXQgaXQgaXMganVzdCBpbXBvc3Np YmxlCitFWFBMQUlOIChDT1NUUyBPRkYpCitVUERBVEUgc2ogczEgU0VUIGIgPSBzMi5iLCBh ID0gczMuYSBGUk9NIHNqIEFTIHMyLCBzaiBBUyBzMworV0hFUkUgczEuYSA9IHMyLmEgQU5E IHMxLmI9czMuYjsKKy0tIEFsbG93IFNKRS4gT25lIG1vcmUgc2hvdCBmb3IgdGhlIGNhc2Ug b2Ygc3VicXVlcnkKK0VYUExBSU4gKENPU1RTIE9GRikKK1VQREFURSBzaiBzMSBTRVQgYiA9 IHEuYiwgYSA9IHEuYSBGUk9NICgKKyAgU0VMRUNUIHMyLmEgQVMgYSwgczMuYiBBUyBiIEZS T00gc2ogQVMgczIsIHNqIEFTIHMzCisgIFdIRVJFIHMyLmE9czMuYSkgQVMgcSBXSEVSRSBz MS5iPXEuYTsKKwogLS0gQ2hlY2sgdGhhdCBTSkUgZG9lcyBub3QgbWlzdGFrZW5seSBvbWl0 IHF1YWwgY2xhdXNlcyAoYnVnICMxODE4NykKIGluc2VydCBpbnRvIGVtcDEgdmFsdWVzICgx LCAxKTsKIGV4cGxhaW4gKGNvc3RzIG9mZikKLS0gCjIuMzkuMgoK --------------l0IjGa7Q94GjaowKWaYxlv6K--