Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1kUQ6i-0008RB-MX for pgsql-hackers@arkaria.postgresql.org; Mon, 19 Oct 2020 08:01:29 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1kUQ6f-0006cE-US for pgsql-hackers@arkaria.postgresql.org; Mon, 19 Oct 2020 08:01:25 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1kUQ6f-0006c7-L3 for pgsql-hackers@lists.postgresql.org; Mon, 19 Oct 2020 08:01:25 +0000 Received: from wforward5-smtp.messagingengine.com ([64.147.123.35]) by magus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1kUQ6b-0001j4-GY for pgsql-hackers@postgresql.org; Mon, 19 Oct 2020 08:01:25 +0000 Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailforward.west.internal (Postfix) with ESMTP id 7D1C9B05 for ; Mon, 19 Oct 2020 04:01:17 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute1.internal (MEProxy); Mon, 19 Oct 2020 04:01:17 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=content-type:date:from:message-id :mime-version:subject:to:x-me-proxy:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm1; bh=xNSCtEw3MoG5l3qdxZlQuwlNOgHpD DlZgt3ekFdtqnY=; b=aHoQWr2XnvpyeThAPnlAbnXtoyp4QU0Xx684Vv4HsRsUu Nr5XtSjvE6+FNQaA+XXJESXZ04YNd1snjNvvCsoKH696R+ZdoIlaxkSZ2oXdIvVT WJLVt5Yg2BQo4DTaSpt7V4s9NQRRJM7qFm3GRTtTo19//mW5fHkttW/hyUv0cCU3 5boGZ3X1eLi1+m7w8ocZbMbUCNap4bnpuUWTukhio3VKlwv4LyAfcwi9yhZVCJ1g coizkp0aKQ6Y3Pkj6kgraDQg9MggvLqeVz/LEy65tV9/EqK+gySowvZ9uClYhtDU mkf2lrl48pmAflcbtgAexIziAwoKOZllOxriKHycg== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedujedrjeduucetufdoteggodetrfdotffvucfrrh hofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgenuceurghi lhhouhhtmecufedttdenucenucfjughrpefhuffvohfkffgfgggtsehmtderredtfeejne cuhfhrohhmpefrvghtvghrucfgihhsvghnthhrrghuthcuoehpvghtvghrrdgvihhsvghn thhrrghuthesvdhnughquhgrughrrghnthdrtghomheqnecuggftrfgrthhtvghrnhepge dtudetkeevheelieffhefhieelveegfeevkeeugfekvedtvdehkeelueeuvedtnecuffho mhgrihhnpehpohhsthhgrhgvshhqlhdrohhrghdpvdhnughquhgrughrrghnthdrtghomh enucfkphepleefrddvtddvrddvhedvrdeljeenucevlhhushhtvghrufhiiigvpedtnecu rfgrrhgrmhepmhgrihhlfhhrohhmpehpvghtvghrrdgvihhsvghnthhrrghuthesvdhnug hquhgrughrrghnthdrtghomh X-ME-Proxy: Received: from april.pezone.net (p5dcafc61.dip0.t-ipconnect.de [93.202.252.97]) by mail.messagingengine.com (Postfix) with ESMTPA id CFA8C3280064 for ; Mon, 19 Oct 2020 04:01:15 -0400 (EDT) From: Peter Eisentraut Subject: Hash support for row types To: pgsql-hackers Organization: 2ndQuadrant Message-ID: <38eccd35-4e2d-6767-1b3c-dada1eac3124@2ndquadrant.com> Date: Mon, 19 Oct 2020 10:01:14 +0200 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------D5195484C267D353E663DE36" Content-Language: en-US List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk This is a multi-part message in MIME format. --------------D5195484C267D353E663DE36 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit In [0] it was discussed that hash support for row types/record would be handy. So I implemented that. The implementation hashes each field and combines the hash values. Most of the code structure can be borrowed from the record comparison functions/btree support. To combine the hash values, I adapted the code from the array hashing functions. (The hash_combine()/hash_combine64() functions also looked sensible, but they don't appear to work in a way that satisfies the hash_func regression test. Could be documented better.) The main motivation is to support UNION [DISTINCT] as discussed in [0], but this also enables other hash-related functionality such as hash joins (as one regression test accidentally revealed) and hash partitioning. [0]: https://www.postgresql.org/message-id/flat/52beaf44-ccc3-0ba1-45c7-74aa251cd6ab%402ndquadrant.com#9559845e0ee2129c483b745b9843c571 -- Peter Eisentraut http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services --------------D5195484C267D353E663DE36 Content-Type: text/plain; charset=UTF-8; x-mac-type="0"; x-mac-creator="0"; name="v1-0001-Hash-support-for-row-types.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="v1-0001-Hash-support-for-row-types.patch" RnJvbSAzYzkyNjlkNjBhYmM1MDMzODA0ODAyNzEzZDlhMTBmNzJlNzdmM2UwIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBQZXRlciBFaXNlbnRyYXV0IDxwZXRlckBlaXNlbnRy YXV0Lm9yZz4KRGF0ZTogTW9uLCAxOSBPY3QgMjAyMCAwOTo0NDoxNSArMDIwMApTdWJqZWN0 OiBbUEFUQ0ggdjFdIEhhc2ggc3VwcG9ydCBmb3Igcm93IHR5cGVzCgpBZGQgaGFzaCBmdW5j dGlvbnMgZm9yIHRoZSByZWNvcmQgdHlwZSBhcyB3ZWxsIGFzIGEgaGFzaCBvcGVyYXRvcgpm YW1pbHkgYW5kIG9wZXJhdG9yIGNsYXNzIGZvciB0aGUgcmVjb3JkIHR5cGUuICBUaGlzIGVu YWJsZXMgYWxsIHRoZQpoYXNoIGZ1bmN0aW9uYWxpdHkgZm9yIHRoZSByZWNvcmQgdHlwZSBz dWNoIGFzIFVOSU9OIERJU1RJTkNULCBoYXNoCmpvaW5zLCBhbmQgaGFzaCBwYXJ0aXRpb25p bmcuCi0tLQogZG9jL3NyYy9zZ21sL3F1ZXJpZXMuc2dtbCAgICAgICAgICAgICAgIHwgICA5 IC0KIHNyYy9iYWNrZW5kL3V0aWxzL2FkdC9yb3d0eXBlcy5jICAgICAgICB8IDI0OSArKysr KysrKysrKysrKysrKysrKysrKysKIHNyYy9pbmNsdWRlL2NhdGFsb2cvcGdfYW1vcC5kYXQg ICAgICAgICB8ICAgNSArCiBzcmMvaW5jbHVkZS9jYXRhbG9nL3BnX2FtcHJvYy5kYXQgICAg ICAgfCAgIDQgKwogc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19vcGNsYXNzLmRhdCAgICAgIHwg ICAyICsKIHNyYy9pbmNsdWRlL2NhdGFsb2cvcGdfb3BlcmF0b3IuZGF0ICAgICB8ICAgMiAr LQogc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19vcGZhbWlseS5kYXQgICAgIHwgICAyICsKIHNy Yy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQgICAgICAgICB8ICAgNyArCiBzcmMvdGVz dC9yZWdyZXNzL2V4cGVjdGVkL2hhc2hfZnVuYy5vdXQgfCAgMTIgKysKIHNyYy90ZXN0L3Jl Z3Jlc3MvZXhwZWN0ZWQvam9pbi5vdXQgICAgICB8ICAgMSArCiBzcmMvdGVzdC9yZWdyZXNz L2V4cGVjdGVkL3dpdGgub3V0ICAgICAgfCAgMzggKysrKwogc3JjL3Rlc3QvcmVncmVzcy9z cWwvaGFzaF9mdW5jLnNxbCAgICAgIHwgICA5ICsKIHNyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2pv aW4uc3FsICAgICAgICAgICB8ICAgMSArCiBzcmMvdGVzdC9yZWdyZXNzL3NxbC93aXRoLnNx bCAgICAgICAgICAgfCAgMTAgKwogMTQgZmlsZXMgY2hhbmdlZCwgMzQxIGluc2VydGlvbnMo KyksIDEwIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dtbC9xdWVyaWVz LnNnbWwgYi9kb2Mvc3JjL3NnbWwvcXVlcmllcy5zZ21sCmluZGV4IGYwNmFmZTJjM2YuLjhl NzBlNTdiNzIgMTAwNjQ0Ci0tLSBhL2RvYy9zcmMvc2dtbC9xdWVyaWVzLnNnbWwKKysrIGIv ZG9jL3NyYy9zZ21sL3F1ZXJpZXMuc2dtbApAQCAtMjE4MiwxNSArMjE4Miw2IEBAIDx0aXRs ZT5TZWFyY2ggT3JkZXI8L3RpdGxlPgogPC9wcm9ncmFtbGlzdGluZz4KICAgIDwvcGFyYT4K IAotICAgPG5vdGU+Ci0gICAgPHBhcmE+Ci0gICAgIFRoZSBxdWVyaWVzIHNob3duIGluIHRo aXMgYW5kIHRoZSBmb2xsb3dpbmcgc2VjdGlvbiBpbnZvbHZpbmcKLSAgICAgPGxpdGVyYWw+ Uk9XPC9saXRlcmFsPiBjb25zdHJ1Y3RvcnMgaW4gdGhlIHRhcmdldCBsaXN0IG9ubHkgc3Vw cG9ydAotICAgICA8bGl0ZXJhbD5VTklPTiBBTEw8L2xpdGVyYWw+IChub3QgcGxhaW4gPGxp dGVyYWw+VU5JT048L2xpdGVyYWw+KSBpbiB0aGUKLSAgICAgY3VycmVudCBpbXBsZW1lbnRh dGlvbi4KLSAgICA8L3BhcmE+Ci0gICA8L25vdGU+Ci0KICAgIDx0aXA+CiAgICAgPHBhcmE+ CiAgICAgIE9taXQgdGhlIDxsaXRlcmFsPlJPVygpPC9saXRlcmFsPiBzeW50YXggaW4gdGhl IGNvbW1vbiBjYXNlIHdoZXJlIG9ubHkgb25lCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91 dGlscy9hZHQvcm93dHlwZXMuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9yb3d0eXBlcy5j CmluZGV4IDY3NGNmMGE1NWQuLjVjODYyNTk5MjkgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5k L3V0aWxzL2FkdC9yb3d0eXBlcy5jCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9yb3d0 eXBlcy5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSAiYWNjZXNzL2RldG9hc3QuaCIK ICNpbmNsdWRlICJhY2Nlc3MvaHR1cF9kZXRhaWxzLmgiCiAjaW5jbHVkZSAiY2F0YWxvZy9w Z190eXBlLmgiCisjaW5jbHVkZSAiY29tbW9uL2hhc2hmbi5oIgogI2luY2x1ZGUgImZ1bmNh cGkuaCIKICNpbmNsdWRlICJsaWJwcS9wcWZvcm1hdC5oIgogI2luY2x1ZGUgIm1pc2NhZG1p bi5oIgpAQCAtMTc2NiwzICsxNzY3LDI1MSBAQCBidHJlY29yZGltYWdlY21wKFBHX0ZVTkNU SU9OX0FSR1MpCiB7CiAJUEdfUkVUVVJOX0lOVDMyKHJlY29yZF9pbWFnZV9jbXAoZmNpbmZv KSk7CiB9CisKKworLyoKKyAqIFJvdyB0eXBlIGhhc2ggZnVuY3Rpb25zCisgKi8KKworRGF0 dW0KK3JlY29yZF9oYXNoKFBHX0ZVTkNUSU9OX0FSR1MpCit7CisJSGVhcFR1cGxlSGVhZGVy IHJlY29yZCA9IFBHX0dFVEFSR19IRUFQVFVQTEVIRUFERVIoMCk7CisJdWludDMyCQlyZXN1 bHQgPSAwOworCU9pZAkJCXR1cFR5cGU7CisJaW50MzIJCXR1cFR5cG1vZDsKKwlUdXBsZURl c2MJdHVwZGVzYzsKKwlIZWFwVHVwbGVEYXRhIHR1cGxlOworCWludAkJCW5jb2x1bW5zOwor CVJlY29yZENvbXBhcmVEYXRhICpteV9leHRyYTsKKwlEYXR1bQkgICAqdmFsdWVzOworCWJv b2wJICAgKm51bGxzOworCisJY2hlY2tfc3RhY2tfZGVwdGgoKTsJCS8qIHJlY3Vyc2VzIGZv ciByZWNvcmQtdHlwZSBjb2x1bW5zICovCisKKwkvKiBFeHRyYWN0IHR5cGUgaW5mbyBmcm9t IHR1cGxlICovCisJdHVwVHlwZSA9IEhlYXBUdXBsZUhlYWRlckdldFR5cGVJZChyZWNvcmQp OworCXR1cFR5cG1vZCA9IEhlYXBUdXBsZUhlYWRlckdldFR5cE1vZChyZWNvcmQpOworCXR1 cGRlc2MgPSBsb29rdXBfcm93dHlwZV90dXBkZXNjKHR1cFR5cGUsIHR1cFR5cG1vZCk7CisJ bmNvbHVtbnMgPSB0dXBkZXNjLT5uYXR0czsKKworCS8qIEJ1aWxkIHRlbXBvcmFyeSBIZWFw VHVwbGUgY29udHJvbCBzdHJ1Y3R1cmUgKi8KKwl0dXBsZS50X2xlbiA9IEhlYXBUdXBsZUhl YWRlckdldERhdHVtTGVuZ3RoKHJlY29yZCk7CisJSXRlbVBvaW50ZXJTZXRJbnZhbGlkKCYo dHVwbGUudF9zZWxmKSk7CisJdHVwbGUudF90YWJsZU9pZCA9IEludmFsaWRPaWQ7CisJdHVw bGUudF9kYXRhID0gcmVjb3JkOworCisJLyoKKwkgKiBXZSBhcnJhbmdlIHRvIGxvb2sgdXAg dGhlIG5lZWRlZCBoYXNoaW5nIGluZm8ganVzdCBvbmNlIHBlciBzZXJpZXMKKwkgKiBvZiBj YWxscywgYXNzdW1pbmcgdGhlIHJlY29yZCB0eXBlIGRvZXNuJ3QgY2hhbmdlIHVuZGVybmVh dGggdXMuCisJICovCisJbXlfZXh0cmEgPSAoUmVjb3JkQ29tcGFyZURhdGEgKikgZmNpbmZv LT5mbGluZm8tPmZuX2V4dHJhOworCWlmIChteV9leHRyYSA9PSBOVUxMIHx8CisJCW15X2V4 dHJhLT5uY29sdW1ucyA8IG5jb2x1bW5zKQorCXsKKwkJZmNpbmZvLT5mbGluZm8tPmZuX2V4 dHJhID0KKwkJCU1lbW9yeUNvbnRleHRBbGxvYyhmY2luZm8tPmZsaW5mby0+Zm5fbWN4dCwK KwkJCQkJCQkgICBvZmZzZXRvZihSZWNvcmRDb21wYXJlRGF0YSwgY29sdW1ucykgKworCQkJ CQkJCSAgIG5jb2x1bW5zICogc2l6ZW9mKENvbHVtbkNvbXBhcmVEYXRhKSk7CisJCW15X2V4 dHJhID0gKFJlY29yZENvbXBhcmVEYXRhICopIGZjaW5mby0+ZmxpbmZvLT5mbl9leHRyYTsK KwkJbXlfZXh0cmEtPm5jb2x1bW5zID0gbmNvbHVtbnM7CisJCW15X2V4dHJhLT5yZWNvcmQx X3R5cGUgPSBJbnZhbGlkT2lkOworCQlteV9leHRyYS0+cmVjb3JkMV90eXBtb2QgPSAwOwor CX0KKworCWlmIChteV9leHRyYS0+cmVjb3JkMV90eXBlICE9IHR1cFR5cGUgfHwKKwkJbXlf ZXh0cmEtPnJlY29yZDFfdHlwbW9kICE9IHR1cFR5cG1vZCkKKwl7CisJCU1lbVNldChteV9l eHRyYS0+Y29sdW1ucywgMCwgbmNvbHVtbnMgKiBzaXplb2YoQ29sdW1uQ29tcGFyZURhdGEp KTsKKwkJbXlfZXh0cmEtPnJlY29yZDFfdHlwZSA9IHR1cFR5cGU7CisJCW15X2V4dHJhLT5y ZWNvcmQxX3R5cG1vZCA9IHR1cFR5cG1vZDsKKwl9CisKKwkvKiBCcmVhayBkb3duIHRoZSB0 dXBsZSBpbnRvIGZpZWxkcyAqLworCXZhbHVlcyA9IChEYXR1bSAqKSBwYWxsb2MobmNvbHVt bnMgKiBzaXplb2YoRGF0dW0pKTsKKwludWxscyA9IChib29sICopIHBhbGxvYyhuY29sdW1u cyAqIHNpemVvZihib29sKSk7CisJaGVhcF9kZWZvcm1fdHVwbGUoJnR1cGxlLCB0dXBkZXNj LCB2YWx1ZXMsIG51bGxzKTsKKworCWZvciAoaW50IGkgPSAwOyBpIDwgbmNvbHVtbnM7IGkr KykKKwl7CisJCUZvcm1fcGdfYXR0cmlidXRlIGF0dDsKKwkJVHlwZUNhY2hlRW50cnkgKnR5 cGVudHJ5OworCQl1aW50MzIJCWVsZW1lbnRfaGFzaDsKKworCQlhdHQgPSBUdXBsZURlc2NB dHRyKHR1cGRlc2MsIGkpOworCisJCWlmIChhdHQtPmF0dGlzZHJvcHBlZCkKKwkJCWNvbnRp bnVlOworCisJCS8qCisJCSAqIExvb2t1cCB0aGUgaGFzaCBmdW5jdGlvbiBpZiBub3QgZG9u ZSBhbHJlYWR5CisJCSAqLworCQl0eXBlbnRyeSA9IG15X2V4dHJhLT5jb2x1bW5zW2ldLnR5 cGVudHJ5OworCQlpZiAodHlwZW50cnkgPT0gTlVMTCB8fAorCQkJdHlwZW50cnktPnR5cGVf aWQgIT0gYXR0LT5hdHR0eXBpZCkKKwkJeworCQkJdHlwZW50cnkgPSBsb29rdXBfdHlwZV9j YWNoZShhdHQtPmF0dHR5cGlkLAorCQkJCQkJCQkJCSBUWVBFQ0FDSEVfSEFTSF9QUk9DX0ZJ TkZPKTsKKwkJCWlmICghT2lkSXNWYWxpZCh0eXBlbnRyeS0+aGFzaF9wcm9jX2ZpbmZvLmZu X29pZCkpCisJCQkJZXJlcG9ydChFUlJPUiwKKwkJCQkJCShlcnJjb2RlKEVSUkNPREVfVU5E RUZJTkVEX0ZVTkNUSU9OKSwKKwkJCQkJCSBlcnJtc2coImNvdWxkIG5vdCBpZGVudGlmeSBh IGhhc2ggZnVuY3Rpb24gZm9yIHR5cGUgJXMiLAorCQkJCQkJCQlmb3JtYXRfdHlwZV9iZSh0 eXBlbnRyeS0+dHlwZV9pZCkpKSk7CisJCQlteV9leHRyYS0+Y29sdW1uc1tpXS50eXBlbnRy eSA9IHR5cGVudHJ5OworCQl9CisKKwkJLyogQ29tcHV0ZSBoYXNoIG9mIGVsZW1lbnQgKi8K KwkJaWYgKG51bGxzW2ldKQorCQl7CisJCQllbGVtZW50X2hhc2ggPSAwOworCQl9CisJCWVs c2UKKwkJeworCQkJTE9DQUxfRkNJTkZPKGxvY2ZjaW5mbywgMSk7CisKKwkJCUluaXRGdW5j dGlvbkNhbGxJbmZvRGF0YSgqbG9jZmNpbmZvLCAmdHlwZW50cnktPmhhc2hfcHJvY19maW5m bywgMSwKKwkJCQkJCQkJCSBhdHQtPmF0dGNvbGxhdGlvbiwgTlVMTCwgTlVMTCk7CisJCQls b2NmY2luZm8tPmFyZ3NbMF0udmFsdWUgPSB2YWx1ZXNbaV07CisJCQlsb2NmY2luZm8tPmFy Z3NbMF0uaXNudWxsID0gZmFsc2U7CisJCQllbGVtZW50X2hhc2ggPSBEYXR1bUdldFVJbnQz MihGdW5jdGlvbkNhbGxJbnZva2UobG9jZmNpbmZvKSk7CisKKwkJCS8qIFdlIGRvbid0IGV4 cGVjdCBoYXNoIHN1cHBvcnQgZnVuY3Rpb25zIHRvIHJldHVybiBudWxsICovCisJCQlBc3Nl cnQoIWxvY2ZjaW5mby0+aXNudWxsKTsKKwkJfQorCisJCS8qIHNlZSBoYXNoX2FycmF5KCkg Ki8KKwkJcmVzdWx0ID0gKHJlc3VsdCA8PCA1KSAtIHJlc3VsdCArIGVsZW1lbnRfaGFzaDsK Kwl9CisKKwlwZnJlZSh2YWx1ZXMpOworCXBmcmVlKG51bGxzKTsKKwlSZWxlYXNlVHVwbGVE ZXNjKHR1cGRlc2MpOworCisJLyogQXZvaWQgbGVha2luZyBtZW1vcnkgd2hlbiBoYW5kZWQg dG9hc3RlZCBpbnB1dC4gKi8KKwlQR19GUkVFX0lGX0NPUFkocmVjb3JkLCAwKTsKKworCVBH X1JFVFVSTl9VSU5UMzIocmVzdWx0KTsKK30KKworRGF0dW0KK3JlY29yZF9oYXNoX2V4dGVu ZGVkKFBHX0ZVTkNUSU9OX0FSR1MpCit7CisJSGVhcFR1cGxlSGVhZGVyIHJlY29yZCA9IFBH X0dFVEFSR19IRUFQVFVQTEVIRUFERVIoMCk7CisJdWludDY0CQlzZWVkID0gUEdfR0VUQVJH X0lOVDY0KDEpOworCXVpbnQ2NAkJcmVzdWx0ID0gMDsKKwlPaWQJCQl0dXBUeXBlOworCWlu dDMyCQl0dXBUeXBtb2Q7CisJVHVwbGVEZXNjCXR1cGRlc2M7CisJSGVhcFR1cGxlRGF0YSB0 dXBsZTsKKwlpbnQJCQluY29sdW1uczsKKwlSZWNvcmRDb21wYXJlRGF0YSAqbXlfZXh0cmE7 CisJRGF0dW0JICAgKnZhbHVlczsKKwlib29sCSAgICpudWxsczsKKworCWNoZWNrX3N0YWNr X2RlcHRoKCk7CQkvKiByZWN1cnNlcyBmb3IgcmVjb3JkLXR5cGUgY29sdW1ucyAqLworCisJ LyogRXh0cmFjdCB0eXBlIGluZm8gZnJvbSB0dXBsZSAqLworCXR1cFR5cGUgPSBIZWFwVHVw bGVIZWFkZXJHZXRUeXBlSWQocmVjb3JkKTsKKwl0dXBUeXBtb2QgPSBIZWFwVHVwbGVIZWFk ZXJHZXRUeXBNb2QocmVjb3JkKTsKKwl0dXBkZXNjID0gbG9va3VwX3Jvd3R5cGVfdHVwZGVz Yyh0dXBUeXBlLCB0dXBUeXBtb2QpOworCW5jb2x1bW5zID0gdHVwZGVzYy0+bmF0dHM7CisK KwkvKiBCdWlsZCB0ZW1wb3JhcnkgSGVhcFR1cGxlIGNvbnRyb2wgc3RydWN0dXJlICovCisJ dHVwbGUudF9sZW4gPSBIZWFwVHVwbGVIZWFkZXJHZXREYXR1bUxlbmd0aChyZWNvcmQpOwor CUl0ZW1Qb2ludGVyU2V0SW52YWxpZCgmKHR1cGxlLnRfc2VsZikpOworCXR1cGxlLnRfdGFi bGVPaWQgPSBJbnZhbGlkT2lkOworCXR1cGxlLnRfZGF0YSA9IHJlY29yZDsKKworCS8qCisJ ICogV2UgYXJyYW5nZSB0byBsb29rIHVwIHRoZSBuZWVkZWQgaGFzaGluZyBpbmZvIGp1c3Qg b25jZSBwZXIgc2VyaWVzCisJICogb2YgY2FsbHMsIGFzc3VtaW5nIHRoZSByZWNvcmQgdHlw ZSBkb2Vzbid0IGNoYW5nZSB1bmRlcm5lYXRoIHVzLgorCSAqLworCW15X2V4dHJhID0gKFJl Y29yZENvbXBhcmVEYXRhICopIGZjaW5mby0+ZmxpbmZvLT5mbl9leHRyYTsKKwlpZiAobXlf ZXh0cmEgPT0gTlVMTCB8fAorCQlteV9leHRyYS0+bmNvbHVtbnMgPCBuY29sdW1ucykKKwl7 CisJCWZjaW5mby0+ZmxpbmZvLT5mbl9leHRyYSA9CisJCQlNZW1vcnlDb250ZXh0QWxsb2Mo ZmNpbmZvLT5mbGluZm8tPmZuX21jeHQsCisJCQkJCQkJICAgb2Zmc2V0b2YoUmVjb3JkQ29t cGFyZURhdGEsIGNvbHVtbnMpICsKKwkJCQkJCQkgICBuY29sdW1ucyAqIHNpemVvZihDb2x1 bW5Db21wYXJlRGF0YSkpOworCQlteV9leHRyYSA9IChSZWNvcmRDb21wYXJlRGF0YSAqKSBm Y2luZm8tPmZsaW5mby0+Zm5fZXh0cmE7CisJCW15X2V4dHJhLT5uY29sdW1ucyA9IG5jb2x1 bW5zOworCQlteV9leHRyYS0+cmVjb3JkMV90eXBlID0gSW52YWxpZE9pZDsKKwkJbXlfZXh0 cmEtPnJlY29yZDFfdHlwbW9kID0gMDsKKwl9CisKKwlpZiAobXlfZXh0cmEtPnJlY29yZDFf dHlwZSAhPSB0dXBUeXBlIHx8CisJCW15X2V4dHJhLT5yZWNvcmQxX3R5cG1vZCAhPSB0dXBU eXBtb2QpCisJeworCQlNZW1TZXQobXlfZXh0cmEtPmNvbHVtbnMsIDAsIG5jb2x1bW5zICog c2l6ZW9mKENvbHVtbkNvbXBhcmVEYXRhKSk7CisJCW15X2V4dHJhLT5yZWNvcmQxX3R5cGUg PSB0dXBUeXBlOworCQlteV9leHRyYS0+cmVjb3JkMV90eXBtb2QgPSB0dXBUeXBtb2Q7CisJ fQorCisJLyogQnJlYWsgZG93biB0aGUgdHVwbGUgaW50byBmaWVsZHMgKi8KKwl2YWx1ZXMg PSAoRGF0dW0gKikgcGFsbG9jKG5jb2x1bW5zICogc2l6ZW9mKERhdHVtKSk7CisJbnVsbHMg PSAoYm9vbCAqKSBwYWxsb2MobmNvbHVtbnMgKiBzaXplb2YoYm9vbCkpOworCWhlYXBfZGVm b3JtX3R1cGxlKCZ0dXBsZSwgdHVwZGVzYywgdmFsdWVzLCBudWxscyk7CisKKwlmb3IgKGlu dCBpID0gMDsgaSA8IG5jb2x1bW5zOyBpKyspCisJeworCQlGb3JtX3BnX2F0dHJpYnV0ZSBh dHQ7CisJCVR5cGVDYWNoZUVudHJ5ICp0eXBlbnRyeTsKKwkJdWludDY0CQllbGVtZW50X2hh c2g7CisKKwkJYXR0ID0gVHVwbGVEZXNjQXR0cih0dXBkZXNjLCBpKTsKKworCQlpZiAoYXR0 LT5hdHRpc2Ryb3BwZWQpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBMb29rdXAgdGhl IGhhc2ggZnVuY3Rpb24gaWYgbm90IGRvbmUgYWxyZWFkeQorCQkgKi8KKwkJdHlwZW50cnkg PSBteV9leHRyYS0+Y29sdW1uc1tpXS50eXBlbnRyeTsKKwkJaWYgKHR5cGVudHJ5ID09IE5V TEwgfHwKKwkJCXR5cGVudHJ5LT50eXBlX2lkICE9IGF0dC0+YXR0dHlwaWQpCisJCXsKKwkJ CXR5cGVudHJ5ID0gbG9va3VwX3R5cGVfY2FjaGUoYXR0LT5hdHR0eXBpZCwKKwkJCQkJCQkJ CQkgVFlQRUNBQ0hFX0hBU0hfRVhURU5ERURfUFJPQ19GSU5GTyk7CisJCQlpZiAoIU9pZElz VmFsaWQodHlwZW50cnktPmhhc2hfZXh0ZW5kZWRfcHJvY19maW5mby5mbl9vaWQpKQorCQkJ CWVyZXBvcnQoRVJST1IsCisJCQkJCQkoZXJyY29kZShFUlJDT0RFX1VOREVGSU5FRF9GVU5D VElPTiksCisJCQkJCQkgZXJybXNnKCJjb3VsZCBub3QgaWRlbnRpZnkgYSBoYXNoIGZ1bmN0 aW9uIGZvciB0eXBlICVzIiwKKwkJCQkJCQkJZm9ybWF0X3R5cGVfYmUodHlwZW50cnktPnR5 cGVfaWQpKSkpOworCQkJbXlfZXh0cmEtPmNvbHVtbnNbaV0udHlwZW50cnkgPSB0eXBlbnRy eTsKKwkJfQorCisJCS8qIENvbXB1dGUgaGFzaCBvZiBlbGVtZW50ICovCisJCWlmIChudWxs c1tpXSkKKwkJeworCQkJZWxlbWVudF9oYXNoID0gMDsKKwkJfQorCQllbHNlCisJCXsKKwkJ CUxPQ0FMX0ZDSU5GTyhsb2NmY2luZm8sIDIpOworCisJCQlJbml0RnVuY3Rpb25DYWxsSW5m b0RhdGEoKmxvY2ZjaW5mbywgJnR5cGVudHJ5LT5oYXNoX2V4dGVuZGVkX3Byb2NfZmluZm8s IDIsCisJCQkJCQkJCQkgYXR0LT5hdHRjb2xsYXRpb24sIE5VTEwsIE5VTEwpOworCQkJbG9j ZmNpbmZvLT5hcmdzWzBdLnZhbHVlID0gdmFsdWVzW2ldOworCQkJbG9jZmNpbmZvLT5hcmdz WzBdLmlzbnVsbCA9IGZhbHNlOworCQkJbG9jZmNpbmZvLT5hcmdzWzFdLnZhbHVlID0gSW50 NjRHZXREYXR1bShzZWVkKTsKKwkJCWxvY2ZjaW5mby0+YXJnc1swXS5pc251bGwgPSBmYWxz ZTsKKwkJCWVsZW1lbnRfaGFzaCA9IERhdHVtR2V0VUludDY0KEZ1bmN0aW9uQ2FsbEludm9r ZShsb2NmY2luZm8pKTsKKworCQkJLyogV2UgZG9uJ3QgZXhwZWN0IGhhc2ggc3VwcG9ydCBm dW5jdGlvbnMgdG8gcmV0dXJuIG51bGwgKi8KKwkJCUFzc2VydCghbG9jZmNpbmZvLT5pc251 bGwpOworCQl9CisKKwkJLyogc2VlIGhhc2hfYXJyYXlfZXh0ZW5kZWQoKSAqLworCQlyZXN1 bHQgPSAocmVzdWx0IDw8IDUpIC0gcmVzdWx0ICsgZWxlbWVudF9oYXNoOworCX0KKworCXBm cmVlKHZhbHVlcyk7CisJcGZyZWUobnVsbHMpOworCVJlbGVhc2VUdXBsZURlc2ModHVwZGVz Yyk7CisKKwkvKiBBdm9pZCBsZWFraW5nIG1lbW9yeSB3aGVuIGhhbmRlZCB0b2FzdGVkIGlu cHV0LiAqLworCVBHX0ZSRUVfSUZfQ09QWShyZWNvcmQsIDApOworCisJUEdfUkVUVVJOX1VJ TlQ2NChyZXN1bHQpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19h bW9wLmRhdCBiL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfYW1vcC5kYXQKaW5kZXggMWRmYjZm ZDM3My4uZGNjYmVhYmNmNCAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19h bW9wLmRhdAorKysgYi9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX2Ftb3AuZGF0CkBAIC05Nzks NiArOTc5LDExIEBACiAgIGFtb3ByaWdodHR5cGUgPT4gJ29pZHZlY3RvcicsIGFtb3BzdHJh dGVneSA9PiAnMScsCiAgIGFtb3BvcHIgPT4gJz0ob2lkdmVjdG9yLG9pZHZlY3RvciknLCBh bW9wbWV0aG9kID0+ICdoYXNoJyB9LAogCisjIHJlY29yZF9vcHMKK3sgYW1vcGZhbWlseSA9 PiAnaGFzaC9yZWNvcmRfb3BzJywgYW1vcGxlZnR0eXBlID0+ICdyZWNvcmQnLAorICBhbW9w cmlnaHR0eXBlID0+ICdyZWNvcmQnLCBhbW9wc3RyYXRlZ3kgPT4gJzEnLAorICBhbW9wb3By ID0+ICc9KHJlY29yZCxyZWNvcmQpJywgYW1vcG1ldGhvZCA9PiAnaGFzaCcgfSwKKwogIyB0 ZXh0X29wcwogeyBhbW9wZmFtaWx5ID0+ICdoYXNoL3RleHRfb3BzJywgYW1vcGxlZnR0eXBl ID0+ICd0ZXh0JywKICAgYW1vcHJpZ2h0dHlwZSA9PiAndGV4dCcsIGFtb3BzdHJhdGVneSA9 PiAnMScsIGFtb3BvcHIgPT4gJz0odGV4dCx0ZXh0KScsCmRpZmYgLS1naXQgYS9zcmMvaW5j bHVkZS9jYXRhbG9nL3BnX2FtcHJvYy5kYXQgYi9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX2Ft cHJvYy5kYXQKaW5kZXggYThlMGM0ZmY4YS4uZTAwMDQyMTc4OCAxMDA2NDQKLS0tIGEvc3Jj L2luY2x1ZGUvY2F0YWxvZy9wZ19hbXByb2MuZGF0CisrKyBiL3NyYy9pbmNsdWRlL2NhdGFs b2cvcGdfYW1wcm9jLmRhdApAQCAtNDMzLDYgKzQzMywxMCBAQAogICBhbXByb2NyaWdodHR5 cGUgPT4gJ3V1aWQnLCBhbXByb2NudW0gPT4gJzEnLCBhbXByb2MgPT4gJ3V1aWRfaGFzaCcg fSwKIHsgYW1wcm9jZmFtaWx5ID0+ICdoYXNoL3V1aWRfb3BzJywgYW1wcm9jbGVmdHR5cGUg PT4gJ3V1aWQnLAogICBhbXByb2NyaWdodHR5cGUgPT4gJ3V1aWQnLCBhbXByb2NudW0gPT4g JzInLCBhbXByb2MgPT4gJ3V1aWRfaGFzaF9leHRlbmRlZCcgfSwKK3sgYW1wcm9jZmFtaWx5 ID0+ICdoYXNoL3JlY29yZF9vcHMnLCBhbXByb2NsZWZ0dHlwZSA9PiAncmVjb3JkJywKKyAg YW1wcm9jcmlnaHR0eXBlID0+ICdyZWNvcmQnLCBhbXByb2NudW0gPT4gJzEnLCBhbXByb2Mg PT4gJ3JlY29yZF9oYXNoJyB9LAoreyBhbXByb2NmYW1pbHkgPT4gJ2hhc2gvcmVjb3JkX29w cycsIGFtcHJvY2xlZnR0eXBlID0+ICdyZWNvcmQnLAorICBhbXByb2NyaWdodHR5cGUgPT4g J3JlY29yZCcsIGFtcHJvY251bSA9PiAnMicsIGFtcHJvYyA9PiAncmVjb3JkX2hhc2hfZXh0 ZW5kZWQnIH0sCiB7IGFtcHJvY2ZhbWlseSA9PiAnaGFzaC9wZ19sc25fb3BzJywgYW1wcm9j bGVmdHR5cGUgPT4gJ3BnX2xzbicsCiAgIGFtcHJvY3JpZ2h0dHlwZSA9PiAncGdfbHNuJywg YW1wcm9jbnVtID0+ICcxJywgYW1wcm9jID0+ICdwZ19sc25faGFzaCcgfSwKIHsgYW1wcm9j ZmFtaWx5ID0+ICdoYXNoL3BnX2xzbl9vcHMnLCBhbXByb2NsZWZ0dHlwZSA9PiAncGdfbHNu JywKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfb3BjbGFzcy5kYXQgYi9z cmMvaW5jbHVkZS9jYXRhbG9nL3BnX29wY2xhc3MuZGF0CmluZGV4IGYyMzQyYmIzMjguLmJl NTcxMjY5MmYgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfb3BjbGFzcy5k YXQKKysrIGIvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19vcGNsYXNzLmRhdApAQCAtMTE0LDYg KzExNCw4IEBACiAgIG9wY2ZhbWlseSA9PiAnaGFzaC9vaWR2ZWN0b3Jfb3BzJywgb3BjaW50 eXBlID0+ICdvaWR2ZWN0b3InIH0sCiB7IG9wY21ldGhvZCA9PiAnYnRyZWUnLCBvcGNuYW1l ID0+ICdyZWNvcmRfb3BzJywKICAgb3BjZmFtaWx5ID0+ICdidHJlZS9yZWNvcmRfb3BzJywg b3BjaW50eXBlID0+ICdyZWNvcmQnIH0sCit7IG9wY21ldGhvZCA9PiAnaGFzaCcsIG9wY25h bWUgPT4gJ3JlY29yZF9vcHMnLAorICBvcGNmYW1pbHkgPT4gJ2hhc2gvcmVjb3JkX29wcycs IG9wY2ludHlwZSA9PiAncmVjb3JkJyB9LAogeyBvcGNtZXRob2QgPT4gJ2J0cmVlJywgb3Bj bmFtZSA9PiAncmVjb3JkX2ltYWdlX29wcycsCiAgIG9wY2ZhbWlseSA9PiAnYnRyZWUvcmVj b3JkX2ltYWdlX29wcycsIG9wY2ludHlwZSA9PiAncmVjb3JkJywKICAgb3BjZGVmYXVsdCA9 PiAnZicgfSwKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfb3BlcmF0b3Iu ZGF0IGIvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19vcGVyYXRvci5kYXQKaW5kZXggN2NjODEy YWRkYS4uMWZmZDgyNjY3OSAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19v cGVyYXRvci5kYXQKKysrIGIvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19vcGVyYXRvci5kYXQK QEAgLTMwNjQsNyArMzA2NCw3IEBACiAKICMgZ2VuZXJpYyByZWNvcmQgY29tcGFyaXNvbiBv cGVyYXRvcnMKIHsgb2lkID0+ICcyOTg4Jywgb2lkX3N5bWJvbCA9PiAnUkVDT1JEX0VRX09Q JywgZGVzY3IgPT4gJ2VxdWFsJywKLSAgb3BybmFtZSA9PiAnPScsIG9wcmNhbm1lcmdlID0+ ICd0Jywgb3BybGVmdCA9PiAncmVjb3JkJywgb3BycmlnaHQgPT4gJ3JlY29yZCcsCisgIG9w cm5hbWUgPT4gJz0nLCBvcHJjYW5tZXJnZSA9PiAndCcsIG9wcmNhbmhhc2ggPT4gJ3QnLCBv cHJsZWZ0ID0+ICdyZWNvcmQnLCBvcHJyaWdodCA9PiAncmVjb3JkJywKICAgb3BycmVzdWx0 ID0+ICdib29sJywgb3ByY29tID0+ICc9KHJlY29yZCxyZWNvcmQpJywKICAgb3BybmVnYXRl ID0+ICc8PihyZWNvcmQscmVjb3JkKScsIG9wcmNvZGUgPT4gJ3JlY29yZF9lcScsIG9wcnJl c3QgPT4gJ2Vxc2VsJywKICAgb3Byam9pbiA9PiAnZXFqb2luc2VsJyB9LApkaWZmIC0tZ2l0 IGEvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19vcGZhbWlseS5kYXQgYi9zcmMvaW5jbHVkZS9j YXRhbG9nL3BnX29wZmFtaWx5LmRhdAppbmRleCBjZjBmYjMyNWIzLi4xMWM3YWQyYzE0IDEw MDY0NAotLS0gYS9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX29wZmFtaWx5LmRhdAorKysgYi9z cmMvaW5jbHVkZS9jYXRhbG9nL3BnX29wZmFtaWx5LmRhdApAQCAtNzYsNiArNzYsOCBAQAog ICBvcGZtZXRob2QgPT4gJ2hhc2gnLCBvcGZuYW1lID0+ICdvaWR2ZWN0b3Jfb3BzJyB9LAog eyBvaWQgPT4gJzI5OTQnLAogICBvcGZtZXRob2QgPT4gJ2J0cmVlJywgb3BmbmFtZSA9PiAn cmVjb3JkX29wcycgfSwKK3sgb2lkID0+ICc5NjExJywKKyAgb3BmbWV0aG9kID0+ICdoYXNo Jywgb3BmbmFtZSA9PiAncmVjb3JkX29wcycgfSwKIHsgb2lkID0+ICczMTk0JywKICAgb3Bm bWV0aG9kID0+ICdidHJlZScsIG9wZm5hbWUgPT4gJ3JlY29yZF9pbWFnZV9vcHMnIH0sCiB7 IG9pZCA9PiAnMTk5NCcsIG9pZF9zeW1ib2wgPT4gJ1RFWFRfQlRSRUVfRkFNX09JRCcsCmRp ZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0IGIvc3JjL2luY2x1 ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdAppbmRleCAyMjM0MGJhZjFjLi4xZDExMzI3MmZkIDEw MDY0NAotLS0gYS9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0CisrKyBiL3NyYy9p bmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQKQEAgLTk2NzAsNiArOTY3MCwxMyBAQAogICBw cm9uYW1lID0+ICdidHJlY29yZGNtcCcsIHByb3JldHR5cGUgPT4gJ2ludDQnLAogICBwcm9h cmd0eXBlcyA9PiAncmVjb3JkIHJlY29yZCcsIHByb3NyYyA9PiAnYnRyZWNvcmRjbXAnIH0s CiAKK3sgb2lkID0+ICc5NjA5JywgZGVzY3IgPT4gJ2hhc2gnLAorICBwcm9uYW1lID0+ICdy ZWNvcmRfaGFzaCcsIHByb3JldHR5cGUgPT4gJ2ludDQnLCBwcm9hcmd0eXBlcyA9PiAncmVj b3JkJywKKyAgcHJvc3JjID0+ICdyZWNvcmRfaGFzaCcgfSwKK3sgb2lkID0+ICc5NjEwJywg ZGVzY3IgPT4gJ2hhc2gnLAorICBwcm9uYW1lID0+ICdyZWNvcmRfaGFzaF9leHRlbmRlZCcs IHByb3JldHR5cGUgPT4gJ2ludDgnLCBwcm9hcmd0eXBlcyA9PiAncmVjb3JkIGludDgnLAor ICBwcm9zcmMgPT4gJ3JlY29yZF9oYXNoX2V4dGVuZGVkJyB9LAorCiAjIHJlY29yZCBjb21w YXJpc29uIHVzaW5nIHJhdyBieXRlIGltYWdlcwogeyBvaWQgPT4gJzMxODEnLAogICBwcm9u YW1lID0+ICdyZWNvcmRfaW1hZ2VfZXEnLCBwcm9yZXR0eXBlID0+ICdib29sJywKZGlmZiAt LWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvaGFzaF9mdW5jLm91dCBiL3NyYy90 ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvaGFzaF9mdW5jLm91dAppbmRleCBlNmUzNDEwYWFhLi45 YzExZTE2YjBiIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2hhc2hf ZnVuYy5vdXQKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9oYXNoX2Z1bmMub3V0 CkBAIC0yOTgsMyArMjk4LDE1IEBAIFdIRVJFICBoYXNoX3JhbmdlKHYpOjpiaXQoMzIpICE9 IGhhc2hfcmFuZ2VfZXh0ZW5kZWQodiwgMCk6OmJpdCgzMikKIC0tLS0tLS0rLS0tLS0tLS0t LSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLQogKDAgcm93cykKIAorQ1JFQVRFIFRZUEUgdDEg QVMgKGEgaW50LCBiIHRleHQpOworU0VMRUNUIHYgYXMgdmFsdWUsIHJlY29yZF9oYXNoKHYp OjpiaXQoMzIpIGFzIHN0YW5kYXJkLAorICAgICAgIHJlY29yZF9oYXNoX2V4dGVuZGVkKHYs IDApOjpiaXQoMzIpIGFzIGV4dGVuZGVkMCwKKyAgICAgICByZWNvcmRfaGFzaF9leHRlbmRl ZCh2LCAxKTo6Yml0KDMyKSBhcyBleHRlbmRlZDEKK0ZST00gICAoVkFMVUVTIChyb3coMSwg J2FhYScpOjp0MSwgcm93KDIsICdiYmInKSwgcm93KC0xLCAnY2NjJykpKSB4KHYpCitXSEVS RSAgcmVjb3JkX2hhc2godik6OmJpdCgzMikgIT0gcmVjb3JkX2hhc2hfZXh0ZW5kZWQodiwg MCk6OmJpdCgzMikKKyAgICAgICBPUiByZWNvcmRfaGFzaCh2KTo6Yml0KDMyKSA9IHJlY29y ZF9oYXNoX2V4dGVuZGVkKHYsIDEpOjpiaXQoMzIpOworIHZhbHVlIHwgc3RhbmRhcmQgfCBl eHRlbmRlZDAgfCBleHRlbmRlZDEgCistLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0KKygwIHJvd3MpCisKK0RST1AgVFlQRSB0MTsKZGlmZiAtLWdpdCBhL3Ny Yy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvam9pbi5vdXQgYi9zcmMvdGVzdC9yZWdyZXNzL2V4 cGVjdGVkL2pvaW4ub3V0CmluZGV4IGE0NmIxNTczYmQuLjRhMzc1ZGVmZjMgMTAwNjQ0Ci0t LSBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvam9pbi5vdXQKKysrIGIvc3JjL3Rlc3Qv cmVncmVzcy9leHBlY3RlZC9qb2luLm91dApAQCAtMjcwNyw2ICsyNzA3LDcgQEAgc2VsZWN0 IGEuaWR2LCBiLmlkdiBmcm9tIHRpZHYgYSwgdGlkdiBiIHdoZXJlIGEuaWR2ID0gYi5pZHY7 CiAoNSByb3dzKQogCiBzZXQgZW5hYmxlX21lcmdlam9pbiA9IDA7CitzZXQgZW5hYmxlX2hh c2hqb2luID0gMDsKIGV4cGxhaW4gKGNvc3RzIG9mZikKIHNlbGVjdCBhLmlkdiwgYi5pZHYg ZnJvbSB0aWR2IGEsIHRpZHYgYiB3aGVyZSBhLmlkdiA9IGIuaWR2OwogICAgICAgICAgICAg ICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgIApkaWZmIC0tZ2l0IGEv c3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC93aXRoLm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3Mv ZXhwZWN0ZWQvd2l0aC5vdXQKaW5kZXggNDU3ZjNiZjA0Zi4uNmEwMWRkZmRkNiAxMDA2NDQK LS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC93aXRoLm91dAorKysgYi9zcmMvdGVz dC9yZWdyZXNzL2V4cGVjdGVkL3dpdGgub3V0CkBAIC02MTYsNiArNjE2LDQ0IEBAIHNlbGVj dCAqIGZyb20gc2VhcmNoX2dyYXBoOwogIDIgfCAzIHwgYXJjIDIgLT4gMyB8IGYgICAgICAg IHwgeyIoMSw0KSIsIig0LDUpIiwiKDUsMSkiLCIoMSwyKSIsIigyLDMpIn0KICgyNSByb3dz KQogCistLSBhZ2FpbiB3aXRoIHVuaW9uIGRpc3RpbmN0IHRvIHRlc3Qgcm93LXR5cGUgaGFz aCBzdXBwb3J0Cit3aXRoIHJlY3Vyc2l2ZSBzZWFyY2hfZ3JhcGgoZiwgdCwgbGFiZWwsIGlz X2N5Y2xlLCBwYXRoKSBhcyAoCisJc2VsZWN0ICosIGZhbHNlLCBhcnJheVtyb3coZy5mLCBn LnQpXSBmcm9tIGdyYXBoIGcKKwl1bmlvbiBkaXN0aW5jdAorCXNlbGVjdCBnLiosIHJvdyhn LmYsIGcudCkgPSBhbnkocGF0aCksIHBhdGggfHwgcm93KGcuZiwgZy50KQorCWZyb20gZ3Jh cGggZywgc2VhcmNoX2dyYXBoIHNnCisJd2hlcmUgZy5mID0gc2cudCBhbmQgbm90IGlzX2N5 Y2xlCispCitzZWxlY3QgKiBmcm9tIHNlYXJjaF9ncmFwaDsKKyBmIHwgdCB8ICAgbGFiZWwg ICAgfCBpc19jeWNsZSB8ICAgICAgICAgICAgICAgICAgIHBhdGggICAgICAgICAgICAgICAg ICAgIAorLS0tKy0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMSB8IDIgfCBhcmMgMSAtPiAyIHwgZiAg ICAgICAgfCB7IigxLDIpIn0KKyAxIHwgMyB8IGFyYyAxIC0+IDMgfCBmICAgICAgICB8IHsi KDEsMykifQorIDIgfCAzIHwgYXJjIDIgLT4gMyB8IGYgICAgICAgIHwgeyIoMiwzKSJ9Cisg MSB8IDQgfCBhcmMgMSAtPiA0IHwgZiAgICAgICAgfCB7IigxLDQpIn0KKyA0IHwgNSB8IGFy YyA0IC0+IDUgfCBmICAgICAgICB8IHsiKDQsNSkifQorIDUgfCAxIHwgYXJjIDUgLT4gMSB8 IGYgICAgICAgIHwgeyIoNSwxKSJ9CisgMSB8IDIgfCBhcmMgMSAtPiAyIHwgZiAgICAgICAg fCB7Iig1LDEpIiwiKDEsMikifQorIDEgfCAzIHwgYXJjIDEgLT4gMyB8IGYgICAgICAgIHwg eyIoNSwxKSIsIigxLDMpIn0KKyAxIHwgNCB8IGFyYyAxIC0+IDQgfCBmICAgICAgICB8IHsi KDUsMSkiLCIoMSw0KSJ9CisgMiB8IDMgfCBhcmMgMiAtPiAzIHwgZiAgICAgICAgfCB7Iigx LDIpIiwiKDIsMykifQorIDQgfCA1IHwgYXJjIDQgLT4gNSB8IGYgICAgICAgIHwgeyIoMSw0 KSIsIig0LDUpIn0KKyA1IHwgMSB8IGFyYyA1IC0+IDEgfCBmICAgICAgICB8IHsiKDQsNSki LCIoNSwxKSJ9CisgMSB8IDIgfCBhcmMgMSAtPiAyIHwgZiAgICAgICAgfCB7Iig0LDUpIiwi KDUsMSkiLCIoMSwyKSJ9CisgMSB8IDMgfCBhcmMgMSAtPiAzIHwgZiAgICAgICAgfCB7Iig0 LDUpIiwiKDUsMSkiLCIoMSwzKSJ9CisgMSB8IDQgfCBhcmMgMSAtPiA0IHwgZiAgICAgICAg fCB7Iig0LDUpIiwiKDUsMSkiLCIoMSw0KSJ9CisgMiB8IDMgfCBhcmMgMiAtPiAzIHwgZiAg ICAgICAgfCB7Iig1LDEpIiwiKDEsMikiLCIoMiwzKSJ9CisgNCB8IDUgfCBhcmMgNCAtPiA1 IHwgZiAgICAgICAgfCB7Iig1LDEpIiwiKDEsNCkiLCIoNCw1KSJ9CisgNSB8IDEgfCBhcmMg NSAtPiAxIHwgZiAgICAgICAgfCB7IigxLDQpIiwiKDQsNSkiLCIoNSwxKSJ9CisgMSB8IDIg fCBhcmMgMSAtPiAyIHwgZiAgICAgICAgfCB7IigxLDQpIiwiKDQsNSkiLCIoNSwxKSIsIigx LDIpIn0KKyAxIHwgMyB8IGFyYyAxIC0+IDMgfCBmICAgICAgICB8IHsiKDEsNCkiLCIoNCw1 KSIsIig1LDEpIiwiKDEsMykifQorIDEgfCA0IHwgYXJjIDEgLT4gNCB8IHQgICAgICAgIHwg eyIoMSw0KSIsIig0LDUpIiwiKDUsMSkiLCIoMSw0KSJ9CisgMiB8IDMgfCBhcmMgMiAtPiAz IHwgZiAgICAgICAgfCB7Iig0LDUpIiwiKDUsMSkiLCIoMSwyKSIsIigyLDMpIn0KKyA0IHwg NSB8IGFyYyA0IC0+IDUgfCB0ICAgICAgICB8IHsiKDQsNSkiLCIoNSwxKSIsIigxLDQpIiwi KDQsNSkifQorIDUgfCAxIHwgYXJjIDUgLT4gMSB8IHQgICAgICAgIHwgeyIoNSwxKSIsIigx LDQpIiwiKDQsNSkiLCIoNSwxKSJ9CisgMiB8IDMgfCBhcmMgMiAtPiAzIHwgZiAgICAgICAg fCB7IigxLDQpIiwiKDQsNSkiLCIoNSwxKSIsIigxLDIpIiwiKDIsMykifQorKDI1IHJvd3Mp CisKIC0tIG9yZGVyaW5nIGJ5IHRoZSBwYXRoIGNvbHVtbiBoYXMgc2FtZSBlZmZlY3QgYXMg U0VBUkNIIERFUFRIIEZJUlNUCiB3aXRoIHJlY3Vyc2l2ZSBzZWFyY2hfZ3JhcGgoZiwgdCwg bGFiZWwsIGlzX2N5Y2xlLCBwYXRoKSBhcyAoCiAJc2VsZWN0ICosIGZhbHNlLCBhcnJheVty b3coZy5mLCBnLnQpXSBmcm9tIGdyYXBoIGcKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jl c3Mvc3FsL2hhc2hfZnVuYy5zcWwgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9oYXNoX2Z1bmMu c3FsCmluZGV4IGEzZTJkZWNjMmMuLjc0N2M3OWI5MTUgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0 L3JlZ3Jlc3Mvc3FsL2hhc2hfZnVuYy5zcWwKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwv aGFzaF9mdW5jLnNxbApAQCAtMjIwLDMgKzIyMCwxMiBAQCBDUkVBVEUgVFlQRSBtb29kIEFT IEVOVU0gKCdzYWQnLCAnb2snLCAnaGFwcHknKTsKICAgICAgICAgKGludDRyYW5nZSg1NTAy NzQsIDE1NTAyNzQpKSwgKGludDRyYW5nZSgxNTUwMjc1LCAyMDgxMTI0ODkpKSkgeCh2KQog V0hFUkUgIGhhc2hfcmFuZ2Uodik6OmJpdCgzMikgIT0gaGFzaF9yYW5nZV9leHRlbmRlZCh2 LCAwKTo6Yml0KDMyKQogICAgICAgIE9SIGhhc2hfcmFuZ2Uodik6OmJpdCgzMikgPSBoYXNo X3JhbmdlX2V4dGVuZGVkKHYsIDEpOjpiaXQoMzIpOworCitDUkVBVEUgVFlQRSB0MSBBUyAo YSBpbnQsIGIgdGV4dCk7CitTRUxFQ1QgdiBhcyB2YWx1ZSwgcmVjb3JkX2hhc2godik6OmJp dCgzMikgYXMgc3RhbmRhcmQsCisgICAgICAgcmVjb3JkX2hhc2hfZXh0ZW5kZWQodiwgMCk6 OmJpdCgzMikgYXMgZXh0ZW5kZWQwLAorICAgICAgIHJlY29yZF9oYXNoX2V4dGVuZGVkKHYs IDEpOjpiaXQoMzIpIGFzIGV4dGVuZGVkMQorRlJPTSAgIChWQUxVRVMgKHJvdygxLCAnYWFh Jyk6OnQxLCByb3coMiwgJ2JiYicpLCByb3coLTEsICdjY2MnKSkpIHgodikKK1dIRVJFICBy ZWNvcmRfaGFzaCh2KTo6Yml0KDMyKSAhPSByZWNvcmRfaGFzaF9leHRlbmRlZCh2LCAwKTo6 Yml0KDMyKQorICAgICAgIE9SIHJlY29yZF9oYXNoKHYpOjpiaXQoMzIpID0gcmVjb3JkX2hh c2hfZXh0ZW5kZWQodiwgMSk6OmJpdCgzMik7CitEUk9QIFRZUEUgdDE7CmRpZmYgLS1naXQg YS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9qb2luLnNxbCBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3Fs L2pvaW4uc3FsCmluZGV4IDE0MDNlMGZmZTcuLjAyMzI5MGJkNTIgMTAwNjQ0Ci0tLSBhL3Ny Yy90ZXN0L3JlZ3Jlc3Mvc3FsL2pvaW4uc3FsCisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3Fs L2pvaW4uc3FsCkBAIC03MDAsNiArNzAwLDcgQEAgQ1JFQVRFIFRFTVAgVEFCTEUgdHQyICgg dHQyX2lkIGludDQsIGpvaW5jb2wgaW50NCApOwogc2VsZWN0IGEuaWR2LCBiLmlkdiBmcm9t IHRpZHYgYSwgdGlkdiBiIHdoZXJlIGEuaWR2ID0gYi5pZHY7CiAKIHNldCBlbmFibGVfbWVy Z2Vqb2luID0gMDsKK3NldCBlbmFibGVfaGFzaGpvaW4gPSAwOwogCiBleHBsYWluIChjb3N0 cyBvZmYpCiBzZWxlY3QgYS5pZHYsIGIuaWR2IGZyb20gdGlkdiBhLCB0aWR2IGIgd2hlcmUg YS5pZHYgPSBiLmlkdjsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3dpdGgu c3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvd2l0aC5zcWwKaW5kZXggMmVlYTI5N2E3MS4u N2FhMTY0Yjk5NyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvd2l0aC5zcWwK KysrIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvd2l0aC5zcWwKQEAgLTMxNyw2ICszMTcsMTYg QEAgQ1JFQVRFIFRFTVBPUkFSWSBUQUJMRSB0cmVlKAogKQogc2VsZWN0ICogZnJvbSBzZWFy Y2hfZ3JhcGg7CiAKKy0tIGFnYWluIHdpdGggdW5pb24gZGlzdGluY3QgdG8gdGVzdCByb3ct dHlwZSBoYXNoIHN1cHBvcnQKK3dpdGggcmVjdXJzaXZlIHNlYXJjaF9ncmFwaChmLCB0LCBs YWJlbCwgaXNfY3ljbGUsIHBhdGgpIGFzICgKKwlzZWxlY3QgKiwgZmFsc2UsIGFycmF5W3Jv dyhnLmYsIGcudCldIGZyb20gZ3JhcGggZworCXVuaW9uIGRpc3RpbmN0CisJc2VsZWN0IGcu Kiwgcm93KGcuZiwgZy50KSA9IGFueShwYXRoKSwgcGF0aCB8fCByb3coZy5mLCBnLnQpCisJ ZnJvbSBncmFwaCBnLCBzZWFyY2hfZ3JhcGggc2cKKwl3aGVyZSBnLmYgPSBzZy50IGFuZCBu b3QgaXNfY3ljbGUKKykKK3NlbGVjdCAqIGZyb20gc2VhcmNoX2dyYXBoOworCiAtLSBvcmRl cmluZyBieSB0aGUgcGF0aCBjb2x1bW4gaGFzIHNhbWUgZWZmZWN0IGFzIFNFQVJDSCBERVBU SCBGSVJTVAogd2l0aCByZWN1cnNpdmUgc2VhcmNoX2dyYXBoKGYsIHQsIGxhYmVsLCBpc19j eWNsZSwgcGF0aCkgYXMgKAogCXNlbGVjdCAqLCBmYWxzZSwgYXJyYXlbcm93KGcuZiwgZy50 KV0gZnJvbSBncmFwaCBnCi0tIAoyLjI4LjAKCg== --------------D5195484C267D353E663DE36--