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 1v5rZg-00D5LZ-28 for pgsql-hackers@arkaria.postgresql.org; Mon, 06 Oct 2025 20:12:48 +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 1v5rZc-00AsMZ-Pt for pgsql-hackers@arkaria.postgresql.org; Mon, 06 Oct 2025 20:12:45 +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 1v5rZc-00AsM0-0D for pgsql-hackers@lists.postgresql.org; Mon, 06 Oct 2025 20:12:45 +0000 Received: from flow-b3-smtp.messagingengine.com ([202.12.124.138]) by makus.postgresql.org with smtp (Exim 4.96) (envelope-from ) id 1v5rZZ-000NJj-3A for pgsql-hackers@postgresql.org; Mon, 06 Oct 2025 20:12:44 +0000 Received: from phl-compute-04.internal (phl-compute-04.internal [10.202.2.44]) by mailflow.stl.internal (Postfix) with ESMTP id 624C313000D7; Mon, 6 Oct 2025 16:12:42 -0400 (EDT) Received: from phl-imap-03 ([10.202.2.93]) by phl-compute-04.internal (MEProxy); Mon, 06 Oct 2025 16:12:42 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=compiler.org; h= cc:cc:content-type:content-type:date:date:from:from:in-reply-to :in-reply-to:message-id:mime-version:references:reply-to:subject :subject:to:to; s=fm2; t=1759781562; x=1759788762; bh=4cwoSitkZj Cqy6NdzvLBFXDsslHRkzcl1aksoSAgdQ0=; b=HDjLTLqgxPPPxcZAIvYmPNc9y9 yXL2G1irHX5edpkI0rk//OlUHn/q94X/po/F18XfTBekwuJ8CtsrVXfHGgqKM86D WzRDJzK32osRd1IHK4tjfIJQ3aNNuQsCTNFRUJ3egpU/orpfi+ppfFlkf+NwZxp/ HWl8c5zQVpIUNX6MGTaxyhB+IWjML55litUZ8aGA6JyURi0CZ33fdOx6A+vta2KI Wrjm9ir0PGkVdL5a+9VYxaMGElcixV5XRFFUdTvLRu/kyBDM945Q0RrNya2GMEJ8 RpBEciy96oUIBwHkUws7ydY9a27bbm/yzAY0dUz2UHroP9ghng02MHhKoNGg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-type:content-type:date:date :feedback-id:feedback-id:from:from:in-reply-to:in-reply-to :message-id:mime-version:references:reply-to:subject:subject:to :to:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm2; t= 1759781562; x=1759788762; bh=4cwoSitkZjCqy6NdzvLBFXDsslHRkzcl1ak soSAgdQ0=; b=NufgCk0qfCAQjQjWuep4aRgdqYE7vLoGdBPIREI++9ZE6gyXeaU wLeleCrK6XxCTBZYWYObYej9Bu/HFPG6JG9gxY7NveZPrhNTjHDz3vVkLbQF1Ihb Zs81rlh1EoMqzCw0jHWaqHVmSWvByyPxQEn/gJQZwuh5UZwhbSbhMz8PG1CzlRhj WS8ashZ5h5z+39RRMhTG5/tN16mAWPUBkYBtfV+yjqgWQwZdU9Rs2vYyu5dxpjHp fVZ+WBKWutoAHbnIWmFgArZXZECICHdBapwiLekuyqYU30gBjBi+7TJUj3MaVjwb xcZzzDHXYS2CK14nvoik5DnHpgHhSRr4x1A== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdeggdelkeegjecutefuodetggdotefrod ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpuffrtefokffrpgfnqfghnecuuegr ihhlohhuthemuceftddtnecunecujfgurhepofggfffhvfevkfgjfhfutgesmhdtreerre dttdenucfhrhhomhepfdflohgvlhculfgrtghosghsohhnfdcuoehjohgvlhestghomhhp ihhlvghrrdhorhhgqeenucggtffrrghtthgvrhhnpeffgfelffffvdehhfeigeefieejud ejvdeiueevueeggfevueekveeiteehhfetieenucevlhhushhtvghrufhiiigvpedtnecu rfgrrhgrmhepmhgrihhlfhhrohhmpehjohgvlhestghomhhpihhlvghrrdhorhhgpdhnsg gprhgtphhtthhopedvpdhmohguvgepshhmthhpohhuthdprhgtphhtthhopehpghhsqhhl qdhhrggtkhgvrhhssehpohhsthhgrhgvshhqlhdrohhrghdprhgtphhtthhopehtghhlse hsshhsrdhpghhhrdhprgdruhhs X-ME-Proxy: Feedback-ID: ic6394509:Fastmail Received: by mailuser.phl.internal (Postfix, from userid 501) id DF2F518E0054; Mon, 6 Oct 2025 16:12:41 -0400 (EDT) X-Mailer: MessagingEngine.com Webmail Interface MIME-Version: 1.0 X-ThreadId: AZ7XRsRLdGms Date: Mon, 06 Oct 2025 22:11:21 +0200 From: "Joel Jacobson" To: "Tom Lane" Cc: pgsql-hackers Message-Id: <4bd5e6c4-6fa7-44bb-869d-59a32a331fa8@app.fastmail.com> In-Reply-To: <1073593.1759423179@sss.pgh.pa.us> References: <6899c044-4a82-49be-8117-e6f669765f7e@app.fastmail.com> <165530.1752362320@sss.pgh.pa.us> <02a7cd37-e2fc-4212-8b19-f8c239c95fb8@app.fastmail.com> <96f00bf1-cc9d-4520-9d02-9e14e7767c88@app.fastmail.com> <30c2aa7d-dd6c-4b68-a2e4-f217a1a34acf@app.fastmail.com> <0b4d402a-9ac2-4aa8-acf8-8231dbe579ea@app.fastmail.com> <3095599.1758644879@sss.pgh.pa.us> <0dc6a2cc-5216-4dc1-9dd2-430cafc6095b@app.fastmail.com> <52CC167F-763B-4ECA-B0B4-DAB381816828@gmail.com> <9186C6D0-F7A9-482A-9183-89E530B57E36@gmail.com> <1073593.1759423179@sss.pgh.pa.us> Subject: Re: Optimize LISTEN/NOTIFY Content-Type: multipart/mixed; boundary=69f5968d42164bf2929b828fd09e4331 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --69f5968d42164bf2929b828fd09e4331 Content-Type: text/plain Content-Transfer-Encoding: 7bit On Thu, Oct 2, 2025, at 18:39, Tom Lane wrote: > I don't understand why you feel you need a bgworker. The existing > code does not have any provision that guarantees a lost signal will > eventually be re-sent --- it will be if there is continuing NOTIFY > traffic, but not if all the senders suddenly go quiet. AFAIR > we've had zero complaints about that in 25+ years. So I'm perfectly > content to continue the approach of "check for laggards during > NOTIFY". (This could be gated behind an overall check on how long the > notify queue is, so that we don't expend the cycles when things are > performing as-expected.) If you feel that that's not robust enough, > you should split it out as a separate patch that's advertised as a > robustness improvement not a performance improvement, and see if you > can get anyone to bite. Good point. I agree it's better to check for laggards during NOTIFY. > The other thing I'm concerned about with this patch is the new shared > hash table. I don't think we have anywhere near a good enough fix on > how big it needs to be, and that is problematic because of the > frozen-at-startup size of main shared memory. We could imagine > inventing YA GUC to let the user tell us how big to make it, > but I think there is now a better way: use a dshash table > (src/backend/lib/dshash.c). That offers the additional win that we > don't have to create it at all in an installation that never uses > LISTEN/NOTIFY. We could also rethink whether we really need the > NOTIFY_MULTICAST_THRESHOLD limit: rather than having two code paths, > we could just say that all listeners are registered for every channel. Thanks for guidance, I didn't know about dshash. The patch is now using dshash. I've been looking at code in launcher.c when implementing it. The function init_channel_hash() ended up being very similar to launcher.c's logicalrep_launcher_attach_dshmem(). /Joel --69f5968d42164bf2929b828fd09e4331 Content-Disposition: attachment; filename="optimize_listen_notify-v7.patch" Content-Type: application/octet-stream; name="optimize_listen_notify-v7.patch" Content-Transfer-Encoding: base64 RnJvbSAxNTMxM2ZhYjQyYTlmOWEzYzgwZGYxNDZiZjNjODQ0M2I3YThmN2RlIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBKb2VsIEphY29ic29uIDxqb2VsQGNvbXBpbGVyLm9y Zz4KRGF0ZTogU3VuLCAyOCBTZXAgMjAyNSAxNDo1Mzo1NyArMDIwMApTdWJqZWN0OiBbUEFU Q0hdIE9wdGltaXplIExJU1RFTi9OT1RJRlkgd2l0aCBjaGFubmVsLXNwZWNpZmljIGxpc3Rl bmVyCiB0cmFja2luZwoKQ3VycmVudGx5LCBpZGxlIGxpc3RlbmluZyBiYWNrZW5kcyBjYXVz ZSBhIGRyYW1hdGljIHNsb3dkb3duIGR1ZSB0bwpjb250ZXh0IHN3aXRjaGluZyB3aGVuIHRo ZXkgYXJlIHNpZ25hbGVkIGFuZCB3YWtlIHVwLiBUaGlzIGlzIHdhc3RlZnVsCndoZW4gdGhl eSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgY2hhbm5lbCBiZWluZyBub3RpZmllZC4KCkp1 c3QgMTAgZXh0cmEgaWRsZSBsaXN0ZW5pbmcgY29ubmVjdGlvbnMgY2F1c2UgYSBzbG93ZG93 biBmcm9tIDg3MDAgVFBTCnRvIDYxMDAgVFBTLCAxMDAgZXh0cmEgY2F1c2UgaXQgdG8gZHJv cCB0byAyMDAwIFRQUywgYW5kIGF0IDEwMDAgZXh0cmEKaXQgZmFsbHMgdG8gMjUwIFRQUy4K ClRoaXMgcGF0Y2ggaW50cm9kdWNlcyB0YXJnZXRlZCBzaWduYWxpbmcgZm9yIExJU1RFTi9O T1RJRlksIGltcHJvdmluZwpzY2FsYWJpbGl0eSBpbiB3b3JrbG9hZHMgd2l0aCBtYW55IGlk bGUgbGlzdGVuZXJzLgoKQSBkeW5hbWljIHNoYXJlZCBoYXNoIHRhYmxlIG5vdyB0cmFja3Mg d2hpY2ggYmFja2VuZHMgbGlzdGVuIG9uIGVhY2gKKGRhdGFiYXNlLCBjaGFubmVsKSBwYWly LCB3aGljaCBTaWduYWxCYWNrZW5kcygpIHVzZXMgdG8gcGVyZm9ybQp0YXJnZXRlZCBzaWdu YWxpbmcuICBJbiBhZGRpdGlvbiwgaXQgc3RhZ2dlcnMgd2FrZXVwcyBieSBzaWduYWxpbmcg b25lCmJhY2tlbmQgYXQgdGhlIGdsb2JhbCB0YWlsIHRvIGhlbHAgaXQgYWR2YW5jZSBncmFk dWFsbHksIGFuZCBmb3JjZXMgYW55CmV4Y2Vzc2l2ZWx5IGxhZ2dpbmcgYmFja2VuZHMgdG8g Y2F0Y2ggdXAuICBBIHBlci1iYWNrZW5kIHdha2V1cF9wZW5kaW5nCmZsYWcgYXZvaWRzIHJl ZHVuZGFudCBzaWduYWxzLgotLS0KIHNyYy9iYWNrZW5kL2NvbW1hbmRzL2FzeW5jLmMgICAg ICAgICAgICAgICAgICB8IDUwMSArKysrKysrKysrKysrKysrLS0KIC4uLi91dGlscy9hY3Rp dml0eS93YWl0X2V2ZW50X25hbWVzLnR4dCAgICAgICB8ICAgMSArCiBzcmMvaW5jbHVkZS9z dG9yYWdlL2x3bG9ja2xpc3QuaCAgICAgICAgICAgICAgfCAgIDEgKwogMyBmaWxlcyBjaGFu Z2VkLCA0NjUgaW5zZXJ0aW9ucygrKSwgMzggZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEv c3JjL2JhY2tlbmQvY29tbWFuZHMvYXN5bmMuYyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2Fz eW5jLmMKaW5kZXggNGJkMzdkNWJlYjUuLmIwODE5OTM0ZDFlIDEwMDY0NAotLS0gYS9zcmMv YmFja2VuZC9jb21tYW5kcy9hc3luYy5jCisrKyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2Fz eW5jLmMKQEAgLTI0LDggKzI0LDEwIEBACiAgKgkgIEFsbCBub3RpZmljYXRpb24gbWVzc2Fn ZXMgYXJlIHBsYWNlZCBpbiB0aGUgcXVldWUgYW5kIGxhdGVyIHJlYWQgb3V0CiAgKgkgIGJ5 IGxpc3RlbmluZyBiYWNrZW5kcy4KICAqCi0gKgkgIFRoZXJlIGlzIG5vIGNlbnRyYWwga25v d2xlZGdlIG9mIHdoaWNoIGJhY2tlbmQgbGlzdGVucyBvbiB3aGljaCBjaGFubmVsOwotICoJ ICBldmVyeSBiYWNrZW5kIGhhcyBpdHMgb3duIGxpc3Qgb2YgaW50ZXJlc3RpbmcgY2hhbm5l bHMuCisgKgkgIFdlIGFsc28gbWFpbnRhaW4gYSBkeW5hbWljIHNoYXJlZCBoYXNoIHRhYmxl IChkc2hhc2gpIHRoYXQgbWFwcyBjaGFubmVsCisgKgkgIG5hbWVzIHRvIHRoZSBzZXQgb2Yg YmFja2VuZHMgbGlzdGVuaW5nIG9uIGVhY2ggY2hhbm5lbC4gVGhpcyB0YWJsZSBpcworICoJ ICBjcmVhdGVkIGxhemlseSBvbiB0aGUgZmlyc3QgTElTVEVOIGNvbW1hbmQgYW5kIGdyb3dz IGR5bmFtaWNhbGx5IGFzCisgKgkgIG5lZWRlZC4KICAqCiAgKgkgIEFsdGhvdWdoIHRoZXJl IGlzIG9ubHkgb25lIHF1ZXVlLCBub3RpZmljYXRpb25zIGFyZSB0cmVhdGVkIGFzIGJlaW5n CiAgKgkgIGRhdGFiYXNlLWxvY2FsOyB0aGlzIGlzIGRvbmUgYnkgaW5jbHVkaW5nIHRoZSBz ZW5kZXIncyBkYXRhYmFzZSBPSUQKQEAgLTcxLDEzICs3MywxNyBAQAogICoJICBtYWtlIGFu eSBhY3R1YWwgdXBkYXRlcyB0byB0aGUgZWZmZWN0aXZlIGxpc3RlbiBzdGF0ZSAobGlzdGVu Q2hhbm5lbHMpLgogICoJICBUaGVuIHdlIHNpZ25hbCBhbnkgYmFja2VuZHMgdGhhdCBtYXkg YmUgaW50ZXJlc3RlZCBpbiBvdXIgbWVzc2FnZXMKICAqCSAgKGluY2x1ZGluZyBvdXIgb3du IGJhY2tlbmQsIGlmIGxpc3RlbmluZykuICBUaGlzIGlzIGRvbmUgYnkKLSAqCSAgU2lnbmFs QmFja2VuZHMoKSwgd2hpY2ggc2NhbnMgdGhlIGxpc3Qgb2YgbGlzdGVuaW5nIGJhY2tlbmRz IGFuZCBzZW5kcyBhCi0gKgkgIFBST0NTSUdfTk9USUZZX0lOVEVSUlVQVCBzaWduYWwgdG8g ZXZlcnkgbGlzdGVuaW5nIGJhY2tlbmQgKHdlIGRvbid0Ci0gKgkgIGtub3cgd2hpY2ggYmFj a2VuZCBpcyBsaXN0ZW5pbmcgb24gd2hpY2ggY2hhbm5lbCBzbyB3ZSBtdXN0IHNpZ25hbCB0 aGVtCi0gKgkgIGFsbCkuICBXZSBjYW4gZXhjbHVkZSBiYWNrZW5kcyB0aGF0IGFyZSBhbHJl YWR5IHVwIHRvIGRhdGUsIHRob3VnaCwgYW5kCi0gKgkgIHdlIGNhbiBhbHNvIGV4Y2x1ZGUg YmFja2VuZHMgdGhhdCBhcmUgaW4gb3RoZXIgZGF0YWJhc2VzICh1bmxlc3MgdGhleQotICoJ ICBhcmUgd2F5IGJlaGluZCBhbmQgc2hvdWxkIGJlIGtpY2tlZCB0byBtYWtlIHRoZW0gYWR2 YW5jZSB0aGVpcgotICoJICBwb2ludGVycykuCisgKgkgIFNpZ25hbEJhY2tlbmRzKCksIHdo aWNoIGNvbnN1bHRzIHRoZSBzaGFyZWQgY2hhbm5lbCBoYXNoIHRhYmxlIHRvCisgKgkgIGlk ZW50aWZ5IGxpc3RlbmVycyBmb3IgdGhlIGNoYW5uZWxzIHRoYXQgaGF2ZSBwZW5kaW5nIG5v dGlmaWNhdGlvbnMKKyAqCSAgaW4gdGhlIGN1cnJlbnQgZGF0YWJhc2UuICBFYWNoIHNlbGVj dGVkIGJhY2tlbmQgaXMgbWFya2VkIGFzIGhhdmluZyBhCisgKgkgIHdha2V1cCBwZW5kaW5n IHRvIGF2b2lkIGR1cGxpY2F0ZSBzaWduYWxzLCBhbmQgYSBQUk9DU0lHX05PVElGWV9JTlRF UlJVUFQKKyAqCSAgc2lnbmFsIGlzIHNlbnQgdG8gaXQuCisgKgorICoJICBUbyBtYWludGFp biBxdWV1ZSBoZWFsdGgsIFNpZ25hbEJhY2tlbmRzKCkgYWxzbyB3YWtlcyBvbmUgYmFja2Vu ZAorICoJICBwb3NpdGlvbmVkIGF0IHRoZSBnbG9iYWwgcXVldWUgdGFpbCB0byBoZWxwIGFk dmFuY2UgaXQsIGFuZCBzaWduYWxzCisgKgkgIGFueSBiYWNrZW5kIHRoYXQgaGFzIGZhbGxl biB0b28gZmFyIGJlaGluZCB0byBjYXRjaCB1cC4gIFRoZXNlIG1lYXN1cmVzCisgKgkgIHBy ZXZlbnQgdGhlIG5vdGlmaWNhdGlvbiBxdWV1ZSBmcm9tIGdyb3dpbmcgaW5kZWZpbml0ZWx5 LCB3aGlsZSBtb3N0bHkKKyAqCSAgbGltaXRpbmcgd2FrZXVwcyB0byB0aGUgYmFja2VuZHMg dGhhdCBhY3R1YWxseSBuZWVkIHRoZW0uCiAgKgogICoJICBGaW5hbGx5LCBhZnRlciB3ZSBh cmUgb3V0IG9mIHRoZSB0cmFuc2FjdGlvbiBhbHRvZ2V0aGVyIGFuZCBhYm91dCB0byBnbwog ICoJICBpZGxlLCB3ZSBzY2FuIHRoZSBxdWV1ZSBmb3IgbWVzc2FnZXMgdGhhdCBuZWVkIHRv IGJlIHNlbnQgdG8gb3VyCkBAIC0xMjgsNiArMTM0LDcgQEAKICNpbmNsdWRlIDxsaW1pdHMu aD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRl IDxzdHJpbmcuaD4KIAogI2luY2x1ZGUgImFjY2Vzcy9wYXJhbGxlbC5oIgogI2luY2x1ZGUg ImFjY2Vzcy9zbHJ1LmgiCkBAIC0xMzcsMTQgKzE0NCwxNyBAQAogI2luY2x1ZGUgImNvbW1h bmRzL2FzeW5jLmgiCiAjaW5jbHVkZSAiY29tbW9uL2hhc2hmbi5oIgogI2luY2x1ZGUgImZ1 bmNhcGkuaCIKKyNpbmNsdWRlICJsaWIvZHNoYXNoLmgiCiAjaW5jbHVkZSAibGlicHEvbGli cHEuaCIKICNpbmNsdWRlICJsaWJwcS9wcWZvcm1hdC5oIgogI2luY2x1ZGUgIm1pc2NhZG1p bi5oIgorI2luY2x1ZGUgInN0b3JhZ2UvZHNtX3JlZ2lzdHJ5LmgiCiAjaW5jbHVkZSAic3Rv cmFnZS9pcGMuaCIKICNpbmNsdWRlICJzdG9yYWdlL2xtZ3IuaCIKICNpbmNsdWRlICJzdG9y YWdlL3Byb2NzaWduYWwuaCIKICNpbmNsdWRlICJ0Y29wL3Rjb3Bwcm90LmgiCiAjaW5jbHVk ZSAidXRpbHMvYnVpbHRpbnMuaCIKKyNpbmNsdWRlICJ1dGlscy9kc2EuaCIKICNpbmNsdWRl ICJ1dGlscy9ndWNfaG9va3MuaCIKICNpbmNsdWRlICJ1dGlscy9tZW11dGlscy5oIgogI2lu Y2x1ZGUgInV0aWxzL3BzX3N0YXR1cy5oIgpAQCAtMTYyLDYgKzE3MiwyOSBAQAogICovCiAj ZGVmaW5lIE5PVElGWV9QQVlMT0FEX01BWF9MRU5HVEgJKEJMQ0tTWiAtIE5BTUVEQVRBTEVO IC0gMTI4KQogCisvKgorICogQ2hhbm5lbCBoYXNoIHRhYmxlIGRlZmluaXRpb25zCisgKgor ICogVGhpcyBoYXNoIHRhYmxlIG1hcHMgKGRhdGFiYXNlIE9JRCwgY2hhbm5lbCBuYW1lKSBr ZXlzIHRvIGFycmF5cyBvZgorICogUHJvY051bWJlcnMgcmVwcmVzZW50aW5nIHRoZSBiYWNr ZW5kcyBsaXN0ZW5pbmcgb24gZWFjaCBjaGFubmVsLgorICovCisKKyNkZWZpbmUgSU5JVElB TF9MSVNURU5FUlNfQVJSQVlfU0laRSA0CisKK3R5cGVkZWYgc3RydWN0IENoYW5uZWxIYXNo S2V5Cit7CisJT2lkCQkJZGJvaWQ7CisJY2hhcgkJY2hhbm5lbFtOQU1FREFUQUxFTl07Cit9 CQkJQ2hhbm5lbEhhc2hLZXk7CisKK3R5cGVkZWYgc3RydWN0IENoYW5uZWxFbnRyeQorewor CUNoYW5uZWxIYXNoS2V5IGtleTsKKwlkc2FfcG9pbnRlciBsaXN0ZW5lcnNfYXJyYXk7CS8q IERTQSBwb2ludGVyIHRvIFByb2NOdW1iZXIgYXJyYXkgKi8KKwlpbnQJCQludW1fbGlzdGVu ZXJzOwkvKiBOdW1iZXIgb2YgbGlzdGVuZXJzIGN1cnJlbnRseSBzdG9yZWQgKi8KKwlpbnQJ CQlhbGxvY2F0ZWRfbGlzdGVuZXJzOwkvKiBBbGxvY2F0ZWQgc2l6ZSBvZiBhcnJheSAqLwor fQkJCUNoYW5uZWxFbnRyeTsKKwogLyoKICAqIFN0cnVjdCByZXByZXNlbnRpbmcgYW4gZW50 cnkgaW4gdGhlIGdsb2JhbCBub3RpZnkgcXVldWUKICAqCkBAIC0yMjcsOCArMjYwLDggQEAg dHlwZWRlZiBzdHJ1Y3QgUXVldWVQb3NpdGlvbgogLyoKICAqIFBhcmFtZXRlciBkZXRlcm1p bmluZyBob3cgb2Z0ZW4gd2UgdHJ5IHRvIGFkdmFuY2UgdGhlIHRhaWwgcG9pbnRlcjoKICAq IHdlIGRvIHRoYXQgYWZ0ZXIgZXZlcnkgUVVFVUVfQ0xFQU5VUF9ERUxBWSBwYWdlcyBvZiBO T1RJRlkgZGF0YS4gIFRoaXMgaXMKLSAqIGFsc28gdGhlIGRpc3RhbmNlIGJ5IHdoaWNoIGEg YmFja2VuZCBpbiBhbm90aGVyIGRhdGFiYXNlIG5lZWRzIHRvIGJlCi0gKiBiZWhpbmQgYmVm b3JlIHdlJ2xsIGRlY2lkZSB3ZSBuZWVkIHRvIHdha2UgaXQgdXAgdG8gYWR2YW5jZSBpdHMg cG9pbnRlci4KKyAqIGFsc28gdGhlIGRpc3RhbmNlIGJ5IHdoaWNoIGEgYmFja2VuZCBuZWVk cyB0byBiZSBiZWhpbmQgYmVmb3JlIHdlJ2xsCisgKiBkZWNpZGUgd2UgbmVlZCB0byB3YWtl IGl0IHVwIHRvIGFkdmFuY2UgaXRzIHBvaW50ZXIuCiAgKgogICogUmVzaXN0IHRoZSB0ZW1w dGF0aW9uIHRvIG1ha2UgdGhpcyByZWFsbHkgbGFyZ2UuICBXaGlsZSB0aGF0IHdvdWxkIHNh dmUKICAqIHdvcmsgaW4gc29tZSBwbGFjZXMsIGl0IHdvdWxkIGFkZCBjb3N0IGluIG90aGVy cy4gIEluIHBhcnRpY3VsYXIsIHRoaXMKQEAgLTI0Niw2ICsyNzksNyBAQCB0eXBlZGVmIHN0 cnVjdCBRdWV1ZUJhY2tlbmRTdGF0dXMKIAlPaWQJCQlkYm9pZDsJCQkvKiBiYWNrZW5kJ3Mg ZGF0YWJhc2UgT0lELCBvciBJbnZhbGlkT2lkICovCiAJUHJvY051bWJlcgluZXh0TGlzdGVu ZXI7CS8qIGlkIG9mIG5leHQgbGlzdGVuZXIsIG9yIElOVkFMSURfUFJPQ19OVU1CRVIgKi8K IAlRdWV1ZVBvc2l0aW9uIHBvczsJCQkvKiBiYWNrZW5kIGhhcyByZWFkIHF1ZXVlIHVwIHRv IGhlcmUgKi8KKwlib29sCQl3YWtldXBfcGVuZGluZzsgLyogc2lnbmFsIHNlbnQgYnV0IG5v dCB5ZXQgcHJvY2Vzc2VkICovCiB9IFF1ZXVlQmFja2VuZFN0YXR1czsKIAogLyoKQEAgLTI4 OCwxMSArMzIyLDkyIEBAIHR5cGVkZWYgc3RydWN0IEFzeW5jUXVldWVDb250cm9sCiAJUHJv Y051bWJlcglmaXJzdExpc3RlbmVyOwkvKiBpZCBvZiBmaXJzdCBsaXN0ZW5lciwgb3IKIAkJ CQkJCQkJICogSU5WQUxJRF9QUk9DX05VTUJFUiAqLwogCVRpbWVzdGFtcFR6IGxhc3RRdWV1 ZUZpbGxXYXJuOwkvKiB0aW1lIG9mIGxhc3QgcXVldWUtZnVsbCBtc2cgKi8KKwlkc2FfaGFu ZGxlCWNoYW5uZWxfaGFzaF9kc2E7CisJZHNoYXNoX3RhYmxlX2hhbmRsZSBjaGFubmVsX2hh c2hfZHNoOwogCVF1ZXVlQmFja2VuZFN0YXR1cyBiYWNrZW5kW0ZMRVhJQkxFX0FSUkFZX01F TUJFUl07CiB9IEFzeW5jUXVldWVDb250cm9sOwogCiBzdGF0aWMgQXN5bmNRdWV1ZUNvbnRy b2wgKmFzeW5jUXVldWVDb250cm9sOwogCitzdGF0aWMgZHNhX2FyZWEgKmNoYW5uZWxfZHNh ID0gTlVMTDsKK3N0YXRpYyBkc2hhc2hfdGFibGUgKmNoYW5uZWxfaGFzaCA9IE5VTEw7Citz dGF0aWMgZHNoYXNoX2hhc2ggY2hhbm5lbF9oYXNoX2Z1bmMoY29uc3Qgdm9pZCAqa2V5LCBz aXplX3Qgc2l6ZSwgdm9pZCAqYXJnKTsKKworLyogcGFyYW1ldGVycyBmb3IgdGhlIGNoYW5u ZWwgaGFzaCB0YWJsZSAqLworc3RhdGljIGNvbnN0IGRzaGFzaF9wYXJhbWV0ZXJzIGNoYW5u ZWxfZHNoX3BhcmFtcyA9IHsKKwlzaXplb2YoQ2hhbm5lbEhhc2hLZXkpLAorCXNpemVvZihD aGFubmVsRW50cnkpLAorCWRzaGFzaF9tZW1jbXAsCisJY2hhbm5lbF9oYXNoX2Z1bmMsCisJ ZHNoYXNoX21lbWNweSwKKwlMV1RSQU5DSEVfTk9USUZZX0NIQU5ORUxfSEFTSAorfTsKKwor LyoKKyAqIGNoYW5uZWxfaGFzaF9mdW5jCisgKgkJSGFzaCBmdW5jdGlvbiBmb3IgY2hhbm5l bCBrZXlzLgorICovCitzdGF0aWMgZHNoYXNoX2hhc2gKK2NoYW5uZWxfaGFzaF9mdW5jKGNv bnN0IHZvaWQgKmtleSwgc2l6ZV90IHNpemUsIHZvaWQgKmFyZykKK3sKKwljb25zdAkJQ2hh bm5lbEhhc2hLZXkgKmsgPSAoY29uc3QgQ2hhbm5lbEhhc2hLZXkgKikga2V5OworCWRzaGFz aF9oYXNoIGg7CisKKwloID0gRGF0dW1HZXRVSW50MzIoaGFzaF91aW50MzIoay0+ZGJvaWQp KTsKKwloIF49IERhdHVtR2V0VUludDMyKGhhc2hfYW55KChjb25zdCB1bnNpZ25lZCBjaGFy ICopIGstPmNoYW5uZWwsCisJCQkJCQkJCSBzdHJubGVuKGstPmNoYW5uZWwsIE5BTUVEQVRB TEVOKSkpOworCisJcmV0dXJuIGg7Cit9CisKKy8qCisgKiBpbml0X2NoYW5uZWxfaGFzaAor ICoJCUxhenkgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGNoYW5uZWwgaGFzaCB0YWJsZS4KKyAq Lworc3RhdGljIHZvaWQKK2luaXRfY2hhbm5lbF9oYXNoKHZvaWQpCit7CisJTWVtb3J5Q29u dGV4dCBvbGRjb250ZXh0OworCisJLyogUXVpY2sgZXhpdCBpZiB3ZSBhbHJlYWR5IGRpZCB0 aGlzICovCisJaWYgKGFzeW5jUXVldWVDb250cm9sLT5jaGFubmVsX2hhc2hfZHNoICE9IERT SEFTSF9IQU5ETEVfSU5WQUxJRCAmJgorCQljaGFubmVsX2hhc2ggIT0gTlVMTCkKKwkJcmV0 dXJuOworCisJLyogT3RoZXJ3aXNlLCB1c2UgYSBsb2NrIHRvIGVuc3VyZSBvbmx5IG9uZSBw cm9jZXNzIGNyZWF0ZXMgdGhlIHRhYmxlICovCisJTFdMb2NrQWNxdWlyZShOb3RpZnlRdWV1 ZUxvY2ssIExXX0VYQ0xVU0lWRSk7CisKKwkvKiBCZSBzdXJlIGFueSBsb2NhbCBtZW1vcnkg YWxsb2NhdGVkIGJ5IERTQSByb3V0aW5lcyBpcyBwZXJzaXN0ZW50ICovCisJb2xkY29udGV4 dCA9IE1lbW9yeUNvbnRleHRTd2l0Y2hUbyhUb3BNZW1vcnlDb250ZXh0KTsKKworCWlmIChh c3luY1F1ZXVlQ29udHJvbC0+Y2hhbm5lbF9oYXNoX2RzaCA9PSBEU0hBU0hfSEFORExFX0lO VkFMSUQpCisJeworCQkvKiBJbml0aWFsaXplIGR5bmFtaWMgc2hhcmVkIGhhc2ggdGFibGUg Zm9yIGNoYW5uZWwgaGFzaCAqLworCQljaGFubmVsX2RzYSA9IGRzYV9jcmVhdGUoTFdUUkFO Q0hFX05PVElGWV9DSEFOTkVMX0hBU0gpOworCQlkc2FfcGluKGNoYW5uZWxfZHNhKTsKKwkJ ZHNhX3Bpbl9tYXBwaW5nKGNoYW5uZWxfZHNhKTsKKwkJY2hhbm5lbF9oYXNoID0gZHNoYXNo X2NyZWF0ZShjaGFubmVsX2RzYSwgJmNoYW5uZWxfZHNoX3BhcmFtcywgTlVMTCk7CisKKwkJ LyogU3RvcmUgaGFuZGxlcyBpbiBzaGFyZWQgbWVtb3J5IGZvciBvdGhlciBiYWNrZW5kcyB0 byB1c2UgKi8KKwkJYXN5bmNRdWV1ZUNvbnRyb2wtPmNoYW5uZWxfaGFzaF9kc2EgPSBkc2Ff Z2V0X2hhbmRsZShjaGFubmVsX2RzYSk7CisJCWFzeW5jUXVldWVDb250cm9sLT5jaGFubmVs X2hhc2hfZHNoID0KKwkJCWRzaGFzaF9nZXRfaGFzaF90YWJsZV9oYW5kbGUoY2hhbm5lbF9o YXNoKTsKKwl9CisJZWxzZQorCXsKKwkJLyogQXR0YWNoIHRvIGV4aXN0aW5nIGR5bmFtaWMg c2hhcmVkIGhhc2ggdGFibGUgKi8KKwkJY2hhbm5lbF9kc2EgPSBkc2FfYXR0YWNoKGFzeW5j UXVldWVDb250cm9sLT5jaGFubmVsX2hhc2hfZHNhKTsKKwkJZHNhX3Bpbl9tYXBwaW5nKGNo YW5uZWxfZHNhKTsKKworCQljaGFubmVsX2hhc2ggPSBkc2hhc2hfYXR0YWNoKGNoYW5uZWxf ZHNhLCAmY2hhbm5lbF9kc2hfcGFyYW1zLAorCQkJCQkJCQkJIGFzeW5jUXVldWVDb250cm9s LT5jaGFubmVsX2hhc2hfZHNoLAorCQkJCQkJCQkJIE5VTEwpOworCX0KKworCU1lbW9yeUNv bnRleHRTd2l0Y2hUbyhvbGRjb250ZXh0KTsKKwlMV0xvY2tSZWxlYXNlKE5vdGlmeVF1ZXVl TG9jayk7Cit9CisKICNkZWZpbmUgUVVFVUVfSEVBRAkJCQkJKGFzeW5jUXVldWVDb250cm9s LT5oZWFkKQogI2RlZmluZSBRVUVVRV9UQUlMCQkJCQkoYXN5bmNRdWV1ZUNvbnRyb2wtPnRh aWwpCiAjZGVmaW5lIFFVRVVFX1NUT1BfUEFHRQkJCQkoYXN5bmNRdWV1ZUNvbnRyb2wtPnN0 b3BQYWdlKQpAQCAtMzAxLDYgKzQxNiw3IEBAIHN0YXRpYyBBc3luY1F1ZXVlQ29udHJvbCAq YXN5bmNRdWV1ZUNvbnRyb2w7CiAjZGVmaW5lIFFVRVVFX0JBQ0tFTkRfREJPSUQoaSkJCShh c3luY1F1ZXVlQ29udHJvbC0+YmFja2VuZFtpXS5kYm9pZCkKICNkZWZpbmUgUVVFVUVfTkVY VF9MSVNURU5FUihpKQkJKGFzeW5jUXVldWVDb250cm9sLT5iYWNrZW5kW2ldLm5leHRMaXN0 ZW5lcikKICNkZWZpbmUgUVVFVUVfQkFDS0VORF9QT1MoaSkJCShhc3luY1F1ZXVlQ29udHJv bC0+YmFja2VuZFtpXS5wb3MpCisjZGVmaW5lIFFVRVVFX0JBQ0tFTkRfV0FLRVVQX1BFTkRJ TkcoaSkJKGFzeW5jUXVldWVDb250cm9sLT5iYWNrZW5kW2ldLndha2V1cF9wZW5kaW5nKQog CiAvKgogICogVGhlIFNMUlUgYnVmZmVyIGFyZWEgdGhyb3VnaCB3aGljaCB3ZSBhY2Nlc3Mg dGhlIG5vdGlmaWNhdGlvbiBxdWV1ZQpAQCAtNDU3LDYgKzU3MywxMSBAQCBzdGF0aWMgdm9p ZCBBZGRFdmVudFRvUGVuZGluZ05vdGlmaWVzKE5vdGlmaWNhdGlvbiAqbik7CiBzdGF0aWMg dWludDMyIG5vdGlmaWNhdGlvbl9oYXNoKGNvbnN0IHZvaWQgKmtleSwgU2l6ZSBrZXlzaXpl KTsKIHN0YXRpYyBpbnQJbm90aWZpY2F0aW9uX21hdGNoKGNvbnN0IHZvaWQgKmtleTEsIGNv bnN0IHZvaWQgKmtleTIsIFNpemUga2V5c2l6ZSk7CiBzdGF0aWMgdm9pZCBDbGVhclBlbmRp bmdBY3Rpb25zQW5kTm90aWZpZXModm9pZCk7CitzdGF0aWMgaW5saW5lIHZvaWQgQ2hhbm5l bEhhc2hQcmVwYXJlS2V5KENoYW5uZWxIYXNoS2V5ICoga2V5LCBPaWQgZGJvaWQsIGNvbnN0 IGNoYXIgKmNoYW5uZWwpOworc3RhdGljIHZvaWQgQ2hhbm5lbEhhc2hBZGRMaXN0ZW5lcihj b25zdCBjaGFyICpjaGFubmVsKTsKK3N0YXRpYyB2b2lkIENoYW5uZWxIYXNoUmVtb3ZlTGlz dGVuZXIoY29uc3QgY2hhciAqY2hhbm5lbCk7CitzdGF0aWMgQ2hhbm5lbEVudHJ5ICogQ2hh bm5lbEhhc2hMb29rdXAoY29uc3QgY2hhciAqY2hhbm5lbCk7CitzdGF0aWMgTGlzdCAqR2V0 UGVuZGluZ05vdGlmeUNoYW5uZWxzKHZvaWQpOwogCiAvKgogICogQ29tcHV0ZSB0aGUgZGlm ZmVyZW5jZSBiZXR3ZWVuIHR3byBxdWV1ZSBwYWdlIG51bWJlcnMuCkBAIC01MjEsMTIgKzY0 MiwxNiBAQCBBc3luY1NobWVtSW5pdCh2b2lkKQogCQlRVUVVRV9TVE9QX1BBR0UgPSAwOwog CQlRVUVVRV9GSVJTVF9MSVNURU5FUiA9IElOVkFMSURfUFJPQ19OVU1CRVI7CiAJCWFzeW5j UXVldWVDb250cm9sLT5sYXN0UXVldWVGaWxsV2FybiA9IDA7CisJCWFzeW5jUXVldWVDb250 cm9sLT5jaGFubmVsX2hhc2hfZHNhID0gRFNBX0hBTkRMRV9JTlZBTElEOworCQlhc3luY1F1 ZXVlQ29udHJvbC0+Y2hhbm5lbF9oYXNoX2RzaCA9IERTSEFTSF9IQU5ETEVfSU5WQUxJRDsK KwogCQlmb3IgKGludCBpID0gMDsgaSA8IE1heEJhY2tlbmRzOyBpKyspCiAJCXsKIAkJCVFV RVVFX0JBQ0tFTkRfUElEKGkpID0gSW52YWxpZFBpZDsKIAkJCVFVRVVFX0JBQ0tFTkRfREJP SUQoaSkgPSBJbnZhbGlkT2lkOwogCQkJUVVFVUVfTkVYVF9MSVNURU5FUihpKSA9IElOVkFM SURfUFJPQ19OVU1CRVI7CiAJCQlTRVRfUVVFVUVfUE9TKFFVRVVFX0JBQ0tFTkRfUE9TKGkp LCAwLCAwKTsKKwkJCVFVRVVFX0JBQ0tFTkRfV0FLRVVQX1BFTkRJTkcoaSkgPSBmYWxzZTsK IAkJfQogCX0KIApAQCAtMTE1Miw2ICsxMjc3LDcgQEAgRXhlY19MaXN0ZW5Db21taXQoY29u c3QgY2hhciAqY2hhbm5lbCkKIAlvbGRjb250ZXh0ID0gTWVtb3J5Q29udGV4dFN3aXRjaFRv KFRvcE1lbW9yeUNvbnRleHQpOwogCWxpc3RlbkNoYW5uZWxzID0gbGFwcGVuZChsaXN0ZW5D aGFubmVscywgcHN0cmR1cChjaGFubmVsKSk7CiAJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9s ZGNvbnRleHQpOworCUNoYW5uZWxIYXNoQWRkTGlzdGVuZXIoY2hhbm5lbCk7CiB9CiAKIC8q CkBAIC0xMTc1LDYgKzEzMDEsNyBAQCBFeGVjX1VubGlzdGVuQ29tbWl0KGNvbnN0IGNoYXIg KmNoYW5uZWwpCiAJCXsKIAkJCWxpc3RlbkNoYW5uZWxzID0gZm9yZWFjaF9kZWxldGVfY3Vy cmVudChsaXN0ZW5DaGFubmVscywgcSk7CiAJCQlwZnJlZShsY2hhbik7CisJCQlDaGFubmVs SGFzaFJlbW92ZUxpc3RlbmVyKGNoYW5uZWwpOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC0x MTkzLDkgKzEzMjAsMTggQEAgRXhlY19Vbmxpc3RlbkNvbW1pdChjb25zdCBjaGFyICpjaGFu bmVsKQogc3RhdGljIHZvaWQKIEV4ZWNfVW5saXN0ZW5BbGxDb21taXQodm9pZCkKIHsKKwlM aXN0Q2VsbCAgICpwOworCiAJaWYgKFRyYWNlX25vdGlmeSkKIAkJZWxvZyhERUJVRzEsICJF eGVjX1VubGlzdGVuQWxsQ29tbWl0KCVkKSIsIE15UHJvY1BpZCk7CiAKKwlmb3JlYWNoKHAs IGxpc3RlbkNoYW5uZWxzKQorCXsKKwkJY2hhcgkgICAqY2hhbm5lbCA9IChjaGFyICopIGxm aXJzdChwKTsKKworCQlDaGFubmVsSGFzaFJlbW92ZUxpc3RlbmVyKGNoYW5uZWwpOworCX0K KwogCWxpc3RfZnJlZV9kZWVwKGxpc3RlbkNoYW5uZWxzKTsKIAlsaXN0ZW5DaGFubmVscyA9 IE5JTDsKIH0KQEAgLTE1NjUsMTIgKzE3MDEsMTYgQEAgYXN5bmNRdWV1ZUZpbGxXYXJuaW5n KHZvaWQpCiAvKgogICogU2VuZCBzaWduYWxzIHRvIGxpc3RlbmluZyBiYWNrZW5kcy4KICAq Ci0gKiBOb3JtYWxseSB3ZSBzaWduYWwgb25seSBiYWNrZW5kcyBpbiBvdXIgb3duIGRhdGFi YXNlLCBzaW5jZSBvbmx5IHRob3NlCi0gKiBiYWNrZW5kcyBjb3VsZCBiZSBpbnRlcmVzdGVk IGluIG5vdGlmaWVzIHdlIHNlbmQuICBIb3dldmVyLCBpZiB0aGVyZSdzCi0gKiBub3RpZnkg dHJhZmZpYyBpbiBvdXIgZGF0YWJhc2UgYnV0IG5vIHRyYWZmaWMgaW4gYW5vdGhlciBkYXRh YmFzZSB0aGF0Ci0gKiBkb2VzIGhhdmUgbGlzdGVuZXIocyksIHRob3NlIGxpc3RlbmVycyB3 aWxsIGZhbGwgZnVydGhlciBhbmQgZnVydGhlcgotICogYmVoaW5kLiAgV2FrZW4gdGhlbSBh bnl3YXkgaWYgdGhleSdyZSBmYXIgZW5vdWdoIGJlaGluZCwgc28gdGhhdCB0aGV5J2xsCi0g KiBhZHZhbmNlIHRoZWlyIHF1ZXVlIHBvc2l0aW9uIHBvaW50ZXJzLCBhbGxvd2luZyB0aGUg Z2xvYmFsIHRhaWwgdG8gYWR2YW5jZS4KKyAqIE5vcm1hbGx5IHdlIHNpZ25hbCBvbmx5IGJh Y2tlbmRzIHJlZ2lzdGVyZWQgYXMgbGlzdGVuZXJzIGZvciBjaGFubmVscworICogd2l0aCBw ZW5kaW5nIG5vdGlmaWNhdGlvbnMuICBIb3dldmVyLCB3aGVuIHRoZXJlIGlzIG5vIHRyYWZm aWMgb24gc29tZQorICogY2hhbm5lbHMsIGxpc3RlbmVycyBvbiBzdWNoIGNoYW5uZWxzIHdp bGwgZmFsbCBmdXJ0aGVyIGFuZCBmdXJ0aGVyCisgKiBiZWhpbmQuICBXYWtlbiB0aGVtIGlm IHRoZXkgYXJlIHRvbyBmYXIgYmVoaW5kLCBzbyB0aGF0IHRoZXknbGwKKyAqIGFkdmFuY2Ug dGhlaXIgcXVldWUgcG9zaXRpb24gcG9pbnRlcnMsIGFsbG93aW5nIHRoZSBnbG9iYWwgdGFp bCB0bworICogYWR2YW5jZS4KKyAqCisgKiBUbyBzdGFnZ2VyIHdha2V1cHMgb2YgbGFnZ2lu ZyBiYWNrZW5kcywgd2FrZSB0aGUgYmFja2VuZCBmdXJ0aGVzdAorICogYmVoaW5kIChhdCB0 aGUgdGFpbCksIGFtb3J0aXppbmcgdGhlIGNvbnRleHQtc3dpdGNoaW5nIGNvc3QgYWNyb3Nz CisgKiBzdWNjZXNzaXZlIG5vdGlmaWNhdGlvbnMgaW5zdGVhZCBvZiBwYXlpbmcgaXQgYWxs IGF0IG9uY2UuCiAgKgogICogU2luY2Ugd2Uga25vdyB0aGUgUHJvY051bWJlciBhbmQgdGhl IFBpZCB0aGUgc2lnbmFsaW5nIGlzIHF1aXRlIGNoZWFwLgogICoKQEAgLTE1ODMsNiArMTcy MywxMCBAQCBTaWduYWxCYWNrZW5kcyh2b2lkKQogCWludDMyCSAgICpwaWRzOwogCVByb2NO dW1iZXIgKnByb2Nub3M7CiAJaW50CQkJY291bnQ7CisJTGlzdAkgICAqY2hhbm5lbHM7CisJ TGlzdENlbGwgICAqcDsKKwlib29sCSAgICpzaWduYWxlZDsKKwlpbnQ2NAkJcXVldWVfbGVu Z3RoOwogCiAJLyoKIAkgKiBJZGVudGlmeSBiYWNrZW5kcyB0aGF0IHdlIG5lZWQgdG8gc2ln bmFsLiAgV2UgZG9uJ3Qgd2FudCB0byBzZW5kCkBAIC0xNTk0LDM5ICsxNzM4LDExMCBAQCBT aWduYWxCYWNrZW5kcyh2b2lkKQogCSAqLwogCXBpZHMgPSAoaW50MzIgKikgcGFsbG9jKE1h eEJhY2tlbmRzICogc2l6ZW9mKGludDMyKSk7CiAJcHJvY25vcyA9IChQcm9jTnVtYmVyICop IHBhbGxvYyhNYXhCYWNrZW5kcyAqIHNpemVvZihQcm9jTnVtYmVyKSk7CisJc2lnbmFsZWQg PSAoYm9vbCAqKSBwYWxsb2MwKE1heEJhY2tlbmRzICogc2l6ZW9mKGJvb2wpKTsKIAljb3Vu dCA9IDA7CiAKKwljaGFubmVscyA9IEdldFBlbmRpbmdOb3RpZnlDaGFubmVscygpOworCiAJ TFdMb2NrQWNxdWlyZShOb3RpZnlRdWV1ZUxvY2ssIExXX0VYQ0xVU0lWRSk7Ci0JZm9yIChQ cm9jTnVtYmVyIGkgPSBRVUVVRV9GSVJTVF9MSVNURU5FUjsgaSAhPSBJTlZBTElEX1BST0Nf TlVNQkVSOyBpID0gUVVFVUVfTkVYVF9MSVNURU5FUihpKSkKKwlmb3JlYWNoKHAsIGNoYW5u ZWxzKQogCXsKLQkJaW50MzIJCXBpZCA9IFFVRVVFX0JBQ0tFTkRfUElEKGkpOwotCQlRdWV1 ZVBvc2l0aW9uIHBvczsKKwkJY2hhcgkgICAqY2hhbm5lbCA9IChjaGFyICopIGxmaXJzdChw KTsKKwkJQ2hhbm5lbEVudHJ5ICplbnRyeTsKKwkJUHJvY051bWJlciAqbGlzdGVuZXJzOwog Ci0JCUFzc2VydChwaWQgIT0gSW52YWxpZFBpZCk7Ci0JCXBvcyA9IFFVRVVFX0JBQ0tFTkRf UE9TKGkpOwotCQlpZiAoUVVFVUVfQkFDS0VORF9EQk9JRChpKSA9PSBNeURhdGFiYXNlSWQp CisJCWVudHJ5ID0gQ2hhbm5lbEhhc2hMb29rdXAoY2hhbm5lbCk7CisJCWlmIChlbnRyeSA9 PSBOVUxMKQorCQkJY29udGludWU7CQkJLyogTm8gbGlzdGVuZXJzIHJlZ2lzdGVyZWQgZm9y IHRoaXMgY2hhbm5lbCAqLworCisJCS8qIEdldCB0aGUgbGlzdGVuZXIgYXJyYXkgZnJvbSBE U0EgKi8KKwkJbGlzdGVuZXJzID0gKFByb2NOdW1iZXIgKikgZHNhX2dldF9hZGRyZXNzKGNo YW5uZWxfZHNhLAorCQkJCQkJCQkJCQkJICAgZW50cnktPmxpc3RlbmVyc19hcnJheSk7CisK KwkJZm9yIChpbnQgaiA9IDA7IGogPCBlbnRyeS0+bnVtX2xpc3RlbmVyczsgaisrKQogCQl7 Ci0JCQkvKgotCQkJICogQWx3YXlzIHNpZ25hbCBsaXN0ZW5lcnMgaW4gb3VyIG93biBkYXRh YmFzZSwgdW5sZXNzIHRoZXkncmUKLQkJCSAqIGFscmVhZHkgY2F1Z2h0IHVwICh1bmxpa2Vs eSwgYnV0IHBvc3NpYmxlKS4KLQkJCSAqLworCQkJUHJvY051bWJlcglpID0gbGlzdGVuZXJz W2pdOworCQkJaW50MzIJCXBpZDsKKwkJCVF1ZXVlUG9zaXRpb24gcG9zOworCisJCQlpZiAo c2lnbmFsZWRbaV0gfHwgUVVFVUVfQkFDS0VORF9XQUtFVVBfUEVORElORyhpKSkKKwkJCQlj b250aW51ZTsKKworCQkJcG9zID0gUVVFVUVfQkFDS0VORF9QT1MoaSk7CisJCQlwaWQgPSBR VUVVRV9CQUNLRU5EX1BJRChpKTsKKworCQkJLyogU2tpcCBpZiBjYXVnaHQgdXAgb3Igd3Jv bmcgZGF0YWJhc2UgKi8KIAkJCWlmIChRVUVVRV9QT1NfRVFVQUwocG9zLCBRVUVVRV9IRUFE KSkKIAkJCQljb250aW51ZTsKKwkJCWlmIChRVUVVRV9CQUNLRU5EX0RCT0lEKGkpICE9IE15 RGF0YWJhc2VJZCkKKwkJCQljb250aW51ZTsKKworCQkJQXNzZXJ0KHBpZCAhPSBJbnZhbGlk UGlkKTsKKworCQkJUVVFVUVfQkFDS0VORF9XQUtFVVBfUEVORElORyhpKSA9IHRydWU7CisK KwkJCXBpZHNbY291bnRdID0gcGlkOworCQkJcHJvY25vc1tjb3VudF0gPSBpOworCQkJc2ln bmFsZWRbaV0gPSB0cnVlOworCQkJY291bnQrKzsKIAkJfQotCQllbHNlCisKKwkJZHNoYXNo X3JlbGVhc2VfbG9jayhjaGFubmVsX2hhc2gsIGVudHJ5KTsKKwl9CisKKwlxdWV1ZV9sZW5n dGggPSBhc3luY1F1ZXVlUGFnZURpZmYoUVVFVUVfUE9TX1BBR0UoUVVFVUVfSEVBRCksCisJ CQkJCQkJCQkgIFFVRVVFX1BPU19QQUdFKFFVRVVFX1RBSUwpKTsKKworCS8qIENoZWNrIGZv ciBsYWdnaW5nIGJhY2tlbmRzIHdoZW4gdGhlIHF1ZXVlIHNwYW5zIG11bHRpcGxlIHBhZ2Vz ICovCisJaWYgKHF1ZXVlX2xlbmd0aCA+IDApCisJeworCQlib29sCQl0YWlsX3dva2VuID0g ZmFsc2U7CisKKwkJZm9yIChQcm9jTnVtYmVyIGkgPSBRVUVVRV9GSVJTVF9MSVNURU5FUjsK KwkJCSBpICE9IElOVkFMSURfUFJPQ19OVU1CRVI7CisJCQkgaSA9IFFVRVVFX05FWFRfTElT VEVORVIoaSkpCiAJCXsKLQkJCS8qCi0JCQkgKiBMaXN0ZW5lcnMgaW4gb3RoZXIgZGF0YWJh c2VzIHNob3VsZCBiZSBzaWduYWxlZCBvbmx5IGlmIHRoZXkKLQkJCSAqIGFyZSBmYXIgYmVo aW5kLgotCQkJICovCi0JCQlpZiAoYXN5bmNRdWV1ZVBhZ2VEaWZmKFFVRVVFX1BPU19QQUdF KFFVRVVFX0hFQUQpLAotCQkJCQkJCQkgICBRVUVVRV9QT1NfUEFHRShwb3MpKSA8IFFVRVVF X0NMRUFOVVBfREVMQVkpCisJCQlRdWV1ZVBvc2l0aW9uIHBvczsKKwkJCWludDY0CQlsYWc7 CisJCQlpbnQzMgkJcGlkOworCisJCQlpZiAoc2lnbmFsZWRbaV0gfHwgUVVFVUVfQkFDS0VO RF9XQUtFVVBfUEVORElORyhpKSkKIAkJCQljb250aW51ZTsKKworCQkJcG9zID0gUVVFVUVf QkFDS0VORF9QT1MoaSk7CisKKwkJCS8qIFNpZ25hbCBvbmUgYmFja2VuZCBwb3NpdGlvbmVk IGF0IHRoZSBnbG9iYWwgdGFpbCAqLworCQkJaWYgKCF0YWlsX3dva2VuICYmIGFzeW5jUXVl dWVQYWdlRGlmZihRVUVVRV9QT1NfUEFHRShRVUVVRV9UQUlMKSwKKwkJCQkJCQkJCQkJCSAg UVVFVUVfUE9TX1BBR0UocG9zKSkgPT0gMCkKKwkJCXsKKwkJCQlwaWQgPSBRVUVVRV9CQUNL RU5EX1BJRChpKTsKKwkJCQlBc3NlcnQocGlkICE9IEludmFsaWRQaWQpOworCisJCQkJUVVF VUVfQkFDS0VORF9XQUtFVVBfUEVORElORyhpKSA9IHRydWU7CisJCQkJcGlkc1tjb3VudF0g PSBwaWQ7CisJCQkJcHJvY25vc1tjb3VudF0gPSBpOworCQkJCXNpZ25hbGVkW2ldID0gdHJ1 ZTsKKwkJCQljb3VudCsrOworCQkJCXRhaWxfd29rZW4gPSB0cnVlOworCQkJCWNvbnRpbnVl OworCQkJfQorCisJCQlsYWcgPSBhc3luY1F1ZXVlUGFnZURpZmYoUVVFVUVfUE9TX1BBR0Uo UVVFVUVfSEVBRCksCisJCQkJCQkJCQkgUVVFVUVfUE9TX1BBR0UocG9zKSk7CisKKwkJCS8q IE5lZWQgdG8gc2lnbmFsIGlmIGEgYmFja2VuZCBoYXMgZmFsbGVuIHRvbyBmYXIgYmVpbmQg Ki8KKwkJCWlmIChsYWcgPj0gUVVFVUVfQ0xFQU5VUF9ERUxBWSkKKwkJCXsKKwkJCQlwaWQg PSBRVUVVRV9CQUNLRU5EX1BJRChpKTsKKwkJCQlBc3NlcnQocGlkICE9IEludmFsaWRQaWQp OworCisJCQkJUVVFVUVfQkFDS0VORF9XQUtFVVBfUEVORElORyhpKSA9IHRydWU7CisJCQkJ cGlkc1tjb3VudF0gPSBwaWQ7CisJCQkJcHJvY25vc1tjb3VudF0gPSBpOworCQkJCXNpZ25h bGVkW2ldID0gdHJ1ZTsKKwkJCQljb3VudCsrOworCQkJfQogCQl9Ci0JCS8qIE9LLCBuZWVk IHRvIHNpZ25hbCB0aGlzIG9uZSAqLwotCQlwaWRzW2NvdW50XSA9IHBpZDsKLQkJcHJvY25v c1tjb3VudF0gPSBpOwotCQljb3VudCsrOwogCX0KIAlMV0xvY2tSZWxlYXNlKE5vdGlmeVF1 ZXVlTG9jayk7CiAKQEAgLTE2NTcsNiArMTg3Miw3IEBAIFNpZ25hbEJhY2tlbmRzKHZvaWQp CiAKIAlwZnJlZShwaWRzKTsKIAlwZnJlZShwcm9jbm9zKTsKKwlwZnJlZShzaWduYWxlZCk7 CiB9CiAKIC8qCkBAIC0xODY1LDYgKzIwODEsNyBAQCBhc3luY1F1ZXVlUmVhZEFsbE5vdGlm aWNhdGlvbnModm9pZCkKIAlMV0xvY2tBY3F1aXJlKE5vdGlmeVF1ZXVlTG9jaywgTFdfU0hB UkVEKTsKIAkvKiBBc3NlcnQgY2hlY2tzIHRoYXQgd2UgaGF2ZSBhIHZhbGlkIHN0YXRlIGVu dHJ5ICovCiAJQXNzZXJ0KE15UHJvY1BpZCA9PSBRVUVVRV9CQUNLRU5EX1BJRChNeVByb2NO dW1iZXIpKTsKKwlRVUVVRV9CQUNLRU5EX1dBS0VVUF9QRU5ESU5HKE15UHJvY051bWJlcikg PSBmYWxzZTsKIAlwb3MgPSBRVUVVRV9CQUNLRU5EX1BPUyhNeVByb2NOdW1iZXIpOwogCWhl YWQgPSBRVUVVRV9IRUFEOwogCUxXTG9ja1JlbGVhc2UoTm90aWZ5UXVldWVMb2NrKTsKQEAg LTIzOTUsMyArMjYxMiwyMTEgQEAgY2hlY2tfbm90aWZ5X2J1ZmZlcnMoaW50ICpuZXd2YWws IHZvaWQgKipleHRyYSwgR3VjU291cmNlIHNvdXJjZSkKIHsKIAlyZXR1cm4gY2hlY2tfc2xy dV9idWZmZXJzKCJub3RpZnlfYnVmZmVycyIsIG5ld3ZhbCk7CiB9CisKKworLyoKKyAqIENo YW5uZWxIYXNoUHJlcGFyZUtleQorICoJCVByZXBhcmUgYSBjaGFubmVsIGtleSBmb3IgdXNl IGFzIGEgaGFzaCBrZXkuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorQ2hhbm5lbEhhc2hQ cmVwYXJlS2V5KENoYW5uZWxIYXNoS2V5ICoga2V5LCBPaWQgZGJvaWQsIGNvbnN0IGNoYXIg KmNoYW5uZWwpCit7CisJbWVtc2V0KGtleSwgMCwgc2l6ZW9mKENoYW5uZWxIYXNoS2V5KSk7 CisJa2V5LT5kYm9pZCA9IGRib2lkOworCXN0cmxjcHkoa2V5LT5jaGFubmVsLCBjaGFubmVs LCBOQU1FREFUQUxFTik7Cit9CisKKy8qCisgKiBDaGFubmVsSGFzaEFkZExpc3RlbmVyCisg KiAgICAgUmVnaXN0ZXIgYXMgYSBsaXN0ZW5lciBmb3IgdGhlIHNwZWNpZmllZCBjaGFubmVs LgorICovCitzdGF0aWMgdm9pZAorQ2hhbm5lbEhhc2hBZGRMaXN0ZW5lcihjb25zdCBjaGFy ICpjaGFubmVsKQoreworCUNoYW5uZWxIYXNoS2V5IGtleTsKKwlDaGFubmVsRW50cnkgKmVu dHJ5OworCWJvb2wJCWZvdW5kOworCVByb2NOdW1iZXIgKmxpc3RlbmVyczsKKworCWluaXRf Y2hhbm5lbF9oYXNoKCk7CisKKwlDaGFubmVsSGFzaFByZXBhcmVLZXkoJmtleSwgTXlEYXRh YmFzZUlkLCBjaGFubmVsKTsKKworCS8qCisJICogRm9yIG5ldyBlbnRyaWVzLCB3ZSBpbml0 aWFsaXplIGxpc3RlbmVyc19hcnJheSB0byBJbnZhbGlkRHNhUG9pbnRlciBhcworCSAqIGEg bWFya2VyLiBUaGlzIGhhbmRsZXMgYm90aCB0aGUgaW5pdGlhbCBjcmVhdGlvbiBhbmQgcG90 ZW50aWFsIHJldHJ5CisJICogYWZ0ZXIgT09NLgorCSAqLworCWVudHJ5ID0gZHNoYXNoX2Zp bmRfb3JfaW5zZXJ0KGNoYW5uZWxfaGFzaCwgJmtleSwgJmZvdW5kKTsKKworCWlmICghZm91 bmQpCisJCWVudHJ5LT5saXN0ZW5lcnNfYXJyYXkgPSBJbnZhbGlkRHNhUG9pbnRlcjsKKwor CWlmICghRHNhUG9pbnRlcklzVmFsaWQoZW50cnktPmxpc3RlbmVyc19hcnJheSkpCisJewor CQkvKiBGaXJzdCBsaXN0ZW5lciBmb3IgdGhpcyBjaGFubmVsICovCisJCWVudHJ5LT5saXN0 ZW5lcnNfYXJyYXkgPSBkc2FfYWxsb2NhdGUoY2hhbm5lbF9kc2EsCisJCQkJCQkJCQkJCSAg c2l6ZW9mKFByb2NOdW1iZXIpICogSU5JVElBTF9MSVNURU5FUlNfQVJSQVlfU0laRSk7CisJ CWVudHJ5LT5udW1fbGlzdGVuZXJzID0gMDsKKwkJZW50cnktPmFsbG9jYXRlZF9saXN0ZW5l cnMgPSBJTklUSUFMX0xJU1RFTkVSU19BUlJBWV9TSVpFOworCX0KKworCWxpc3RlbmVycyA9 IChQcm9jTnVtYmVyICopIGRzYV9nZXRfYWRkcmVzcyhjaGFubmVsX2RzYSwKKwkJCQkJCQkJ CQkJICAgZW50cnktPmxpc3RlbmVyc19hcnJheSk7CisKKwlmb3IgKGludCBpID0gMDsgaSA8 IGVudHJ5LT5udW1fbGlzdGVuZXJzOyBpKyspCisJeworCQlpZiAobGlzdGVuZXJzW2ldID09 IE15UHJvY051bWJlcikKKwkJeworCQkJZHNoYXNoX3JlbGVhc2VfbG9jayhjaGFubmVsX2hh c2gsIGVudHJ5KTsKKwkJCXJldHVybjsJCQkJLyogQWxyZWFkeSByZWdpc3RlcmVkICovCisJ CX0KKwl9CisKKwkvKiBOZWVkIHRvIGFkZCB0aGlzIGxpc3RlbmVyICovCisJaWYgKGVudHJ5 LT5udW1fbGlzdGVuZXJzID49IGVudHJ5LT5hbGxvY2F0ZWRfbGlzdGVuZXJzKQorCXsKKwkJ LyogR3JvdyB0aGUgYXJyYXkgKGRvdWJsZSB0aGUgc2l6ZSkgKi8KKwkJaW50CQkJbmV3X3Np emUgPSBlbnRyeS0+YWxsb2NhdGVkX2xpc3RlbmVycyAqIDI7CisJCWRzYV9wb2ludGVyIG5l d19hcnJheSA9IGRzYV9hbGxvY2F0ZShjaGFubmVsX2RzYSwKKwkJCQkJCQkJCQkJIHNpemVv ZihQcm9jTnVtYmVyKSAqIG5ld19zaXplKTsKKwkJUHJvY051bWJlciAqbmV3X2xpc3RlbmVy cyA9IChQcm9jTnVtYmVyICopIGRzYV9nZXRfYWRkcmVzcyhjaGFubmVsX2RzYSwKKwkJCQkJ CQkJCQkJCQkJCQkgICBuZXdfYXJyYXkpOworCisJCS8qIENvcHkgZXhpc3RpbmcgbGlzdGVu ZXJzICovCisJCW1lbWNweShuZXdfbGlzdGVuZXJzLCBsaXN0ZW5lcnMsCisJCQkgICBzaXpl b2YoUHJvY051bWJlcikgKiBlbnRyeS0+bnVtX2xpc3RlbmVycyk7CisKKwkJLyogRnJlZSBv bGQgYXJyYXkgYW5kIHVwZGF0ZSBlbnRyeSAqLworCQlkc2FfZnJlZShjaGFubmVsX2RzYSwg ZW50cnktPmxpc3RlbmVyc19hcnJheSk7CisJCWVudHJ5LT5saXN0ZW5lcnNfYXJyYXkgPSBu ZXdfYXJyYXk7CisJCWVudHJ5LT5hbGxvY2F0ZWRfbGlzdGVuZXJzID0gbmV3X3NpemU7CisJ CWxpc3RlbmVycyA9IG5ld19saXN0ZW5lcnM7CisJfQorCisJLyogQWRkIHRoZSBuZXcgbGlz dGVuZXIgKi8KKwlsaXN0ZW5lcnNbZW50cnktPm51bV9saXN0ZW5lcnNdID0gTXlQcm9jTnVt YmVyOworCWVudHJ5LT5udW1fbGlzdGVuZXJzKys7CisKKwlkc2hhc2hfcmVsZWFzZV9sb2Nr KGNoYW5uZWxfaGFzaCwgZW50cnkpOworfQorCisvKgorICogQ2hhbm5lbEhhc2hSZW1vdmVM aXN0ZW5lcgorICoJCVVucmVnaXN0ZXIgYXMgYSBsaXN0ZW5lciBmb3IgdGhlIHNwZWNpZmll ZCBjaGFubmVsLgorICovCitzdGF0aWMgdm9pZAorQ2hhbm5lbEhhc2hSZW1vdmVMaXN0ZW5l cihjb25zdCBjaGFyICpjaGFubmVsKQoreworCUNoYW5uZWxIYXNoS2V5IGtleTsKKwlDaGFu bmVsRW50cnkgKmVudHJ5OworCVByb2NOdW1iZXIgKmxpc3RlbmVyczsKKwlpbnQJCQlpOwor CisJaWYgKGNoYW5uZWxfaGFzaCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpbml0X2NoYW5u ZWxfaGFzaCgpOworCisJQ2hhbm5lbEhhc2hQcmVwYXJlS2V5KCZrZXksIE15RGF0YWJhc2VJ ZCwgY2hhbm5lbCk7CisKKwllbnRyeSA9IGRzaGFzaF9maW5kKGNoYW5uZWxfaGFzaCwgJmtl eSwgdHJ1ZSk7CisJaWYgKGVudHJ5ID09IE5VTEwpCisJCXJldHVybjsKKworCWxpc3RlbmVy cyA9IChQcm9jTnVtYmVyICopIGRzYV9nZXRfYWRkcmVzcyhjaGFubmVsX2RzYSwKKwkJCQkJ CQkJCQkJICAgZW50cnktPmxpc3RlbmVyc19hcnJheSk7CisKKwlmb3IgKGkgPSAwOyBpIDwg ZW50cnktPm51bV9saXN0ZW5lcnM7IGkrKykKKwl7CisJCWlmIChsaXN0ZW5lcnNbaV0gPT0g TXlQcm9jTnVtYmVyKQorCQl7CisJCQkvKiBGb3VuZCBpdCwgcmVtb3ZlIGJ5IHNoaWZ0aW5n IHJlbWFpbmluZyBlbGVtZW50cyAqLworCQkJZW50cnktPm51bV9saXN0ZW5lcnMtLTsKKwkJ CWlmIChpIDwgZW50cnktPm51bV9saXN0ZW5lcnMpCisJCQl7CisJCQkJbWVtbW92ZSgmbGlz dGVuZXJzW2ldLCAmbGlzdGVuZXJzW2kgKyAxXSwKKwkJCQkJCXNpemVvZihQcm9jTnVtYmVy KSAqIChlbnRyeS0+bnVtX2xpc3RlbmVycyAtIGkpKTsKKwkJCX0KKworCQkJaWYgKGVudHJ5 LT5udW1fbGlzdGVuZXJzID09IDApCisJCQl7CisJCQkJZHNhX2ZyZWUoY2hhbm5lbF9kc2Es IGVudHJ5LT5saXN0ZW5lcnNfYXJyYXkpOworCQkJCWRzaGFzaF9kZWxldGVfZW50cnkoY2hh bm5lbF9oYXNoLCBlbnRyeSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJZHNoYXNoX3Jl bGVhc2VfbG9jayhjaGFubmVsX2hhc2gsIGVudHJ5KTsKKwkJCX0KKwkJCXJldHVybjsKKwkJ fQorCX0KKworCS8qIE5vdCBmb3VuZCBpbiBsaXN0ICovCisJZHNoYXNoX3JlbGVhc2VfbG9j ayhjaGFubmVsX2hhc2gsIGVudHJ5KTsKK30KKworLyoKKyAqIENoYW5uZWxIYXNoTG9va3Vw CisgKgkJRmluZCB0aGUgaGFzaCBlbnRyeSBmb3IgYSBjaGFubmVsLgorICoKKyAqIFJldHVy bnMgTlVMTCBpZiBubyBoYXNoIGVudHJ5IGV4aXN0cyBmb3IgdGhlIGNoYW5uZWwuCisgKiBD YWxsZXIgbXVzdCBjYWxsIGRzaGFzaF9yZWxlYXNlX2xvY2soKSB3aGVuIGRvbmUgd2l0aCB0 aGUgZW50cnkuCisgKi8KK3N0YXRpYyBDaGFubmVsRW50cnkgKgorQ2hhbm5lbEhhc2hMb29r dXAoY29uc3QgY2hhciAqY2hhbm5lbCkKK3sKKwlDaGFubmVsSGFzaEtleSBrZXk7CisJQ2hh bm5lbEVudHJ5ICpyZXN1bHQ7CisKKwkvKiBIYXNoIG1heSBub3QgYmUgaW5pdGlhbGl6ZWQg Ki8KKwlpZiAoY2hhbm5lbF9oYXNoID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJaW5p dF9jaGFubmVsX2hhc2goKTsKKworCUNoYW5uZWxIYXNoUHJlcGFyZUtleSgma2V5LCBNeURh dGFiYXNlSWQsIGNoYW5uZWwpOworCisJcmVzdWx0ID0gZHNoYXNoX2ZpbmQoY2hhbm5lbF9o YXNoLCAma2V5LCBmYWxzZSk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogR2V0 UGVuZGluZ05vdGlmeUNoYW5uZWxzCisgKgkJR2V0IGxpc3Qgb2YgdW5pcXVlIGNoYW5uZWwg bmFtZXMgZnJvbSBwZW5kaW5nIG5vdGlmaWNhdGlvbnMuCisgKi8KK3N0YXRpYyBMaXN0ICoK K0dldFBlbmRpbmdOb3RpZnlDaGFubmVscyh2b2lkKQoreworCUxpc3QJICAgKmNoYW5uZWxz ID0gTklMOworCUxpc3RDZWxsICAgKnA7CisJTGlzdENlbGwgICAqcTsKKwlib29sCQlmb3Vu ZDsKKworCWlmICghcGVuZGluZ05vdGlmaWVzKQorCQlyZXR1cm4gTklMOworCisJZm9yZWFj aChwLCBwZW5kaW5nTm90aWZpZXMtPmV2ZW50cykKKwl7CisJCU5vdGlmaWNhdGlvbiAqbiA9 IChOb3RpZmljYXRpb24gKikgbGZpcnN0KHApOworCQljaGFyCSAgICpjaGFubmVsID0gbi0+ ZGF0YTsKKworCQlmb3VuZCA9IGZhbHNlOworCQlmb3JlYWNoKHEsIGNoYW5uZWxzKQorCQl7 CisJCQljaGFyCSAgICpleGlzdGluZyA9IChjaGFyICopIGxmaXJzdChxKTsKKworCQkJaWYg KHN0cmNtcChleGlzdGluZywgY2hhbm5lbCkgPT0gMCkKKwkJCXsKKwkJCQlmb3VuZCA9IHRy dWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoIWZvdW5kKQorCQkJY2hhbm5l bHMgPSBsYXBwZW5kKGNoYW5uZWxzLCBjaGFubmVsKTsKKwl9CisKKwlyZXR1cm4gY2hhbm5l bHM7Cit9CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9hY3Rpdml0eS93YWl0X2V2 ZW50X25hbWVzLnR4dCBiL3NyYy9iYWNrZW5kL3V0aWxzL2FjdGl2aXR5L3dhaXRfZXZlbnRf bmFtZXMudHh0CmluZGV4IDc1NTNmNmVhY2VmLi5hNGZhZGJkMDc2NyAxMDA2NDQKLS0tIGEv c3JjL2JhY2tlbmQvdXRpbHMvYWN0aXZpdHkvd2FpdF9ldmVudF9uYW1lcy50eHQKKysrIGIv c3JjL2JhY2tlbmQvdXRpbHMvYWN0aXZpdHkvd2FpdF9ldmVudF9uYW1lcy50eHQKQEAgLTM2 Niw2ICszNjYsNyBAQCBTdWJ0cmFuc0J1ZmZlcgkiV2FpdGluZyBmb3IgSS9PIG9uIGEgc3Vi LXRyYW5zYWN0aW9uIFNMUlUgYnVmZmVyLiIKIE11bHRpWGFjdE9mZnNldEJ1ZmZlcgkiV2Fp dGluZyBmb3IgSS9PIG9uIGEgbXVsdGl4YWN0IG9mZnNldCBTTFJVIGJ1ZmZlci4iCiBNdWx0 aVhhY3RNZW1iZXJCdWZmZXIJIldhaXRpbmcgZm9yIEkvTyBvbiBhIG11bHRpeGFjdCBtZW1i ZXIgU0xSVSBidWZmZXIuIgogTm90aWZ5QnVmZmVyCSJXYWl0aW5nIGZvciBJL08gb24gYSA8 Y29tbWFuZD5OT1RJRlk8L2NvbW1hbmQ+IG1lc3NhZ2UgU0xSVSBidWZmZXIuIgorTm90aWZ5 Q2hhbm5lbEhhc2gJIldhaXRpbmcgdG8gYWNjZXNzIHRoZSA8Y29tbWFuZD5OT1RJRlk8L2Nv bW1hbmQ+IGNoYW5uZWwgaGFzaCB0YWJsZS4iCiBTZXJpYWxCdWZmZXIJIldhaXRpbmcgZm9y IEkvTyBvbiBhIHNlcmlhbGl6YWJsZSB0cmFuc2FjdGlvbiBjb25mbGljdCBTTFJVIGJ1ZmZl ci4iCiBXQUxJbnNlcnQJIldhaXRpbmcgdG8gaW5zZXJ0IFdBTCBkYXRhIGludG8gYSBtZW1v cnkgYnVmZmVyLiIKIEJ1ZmZlckNvbnRlbnQJIldhaXRpbmcgdG8gYWNjZXNzIGEgZGF0YSBw YWdlIGluIG1lbW9yeS4iCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9zdG9yYWdlL2x3bG9j a2xpc3QuaCBiL3NyYy9pbmNsdWRlL3N0b3JhZ2UvbHdsb2NrbGlzdC5oCmluZGV4IDA2YTFm ZmQ0YjA4Li4yNzY4ZGRmNDQxNCAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvc3RvcmFnZS9s d2xvY2tsaXN0LmgKKysrIGIvc3JjL2luY2x1ZGUvc3RvcmFnZS9sd2xvY2tsaXN0LmgKQEAg LTEwMCw2ICsxMDAsNyBAQCBQR19MV0xPQ0tUUkFOQ0hFKFNVQlRSQU5TX0JVRkZFUiwgU3Vi dHJhbnNCdWZmZXIpCiBQR19MV0xPQ0tUUkFOQ0hFKE1VTFRJWEFDVE9GRlNFVF9CVUZGRVIs IE11bHRpWGFjdE9mZnNldEJ1ZmZlcikKIFBHX0xXTE9DS1RSQU5DSEUoTVVMVElYQUNUTUVN QkVSX0JVRkZFUiwgTXVsdGlYYWN0TWVtYmVyQnVmZmVyKQogUEdfTFdMT0NLVFJBTkNIRShO T1RJRllfQlVGRkVSLCBOb3RpZnlCdWZmZXIpCitQR19MV0xPQ0tUUkFOQ0hFKE5PVElGWV9D SEFOTkVMX0hBU0gsIE5vdGlmeUNoYW5uZWxIYXNoKQogUEdfTFdMT0NLVFJBTkNIRShTRVJJ QUxfQlVGRkVSLCBTZXJpYWxCdWZmZXIpCiBQR19MV0xPQ0tUUkFOQ0hFKFdBTF9JTlNFUlQs IFdBTEluc2VydCkKIFBHX0xXTE9DS1RSQU5DSEUoQlVGRkVSX0NPTlRFTlQsIEJ1ZmZlckNv bnRlbnQpCi0tIAoyLjUwLjEKCg== --69f5968d42164bf2929b828fd09e4331--