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 1v3fWm-001ddV-2T for pgsql-hackers@arkaria.postgresql.org; Tue, 30 Sep 2025 18:56:44 +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 1v3fWi-00BkBi-11 for pgsql-hackers@arkaria.postgresql.org; Tue, 30 Sep 2025 18:56:40 +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 1v3fWg-00BkAi-Kg for pgsql-hackers@lists.postgresql.org; Tue, 30 Sep 2025 18:56:40 +0000 Received: from fhigh-a1-smtp.messagingengine.com ([103.168.172.152]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1v3fWd-000wqj-1S for pgsql-hackers@postgresql.org; Tue, 30 Sep 2025 18:56:38 +0000 Received: from phl-compute-04.internal (phl-compute-04.internal [10.202.2.44]) by mailfhigh.phl.internal (Postfix) with ESMTP id 7879614000B1 for ; Tue, 30 Sep 2025 14:56:32 -0400 (EDT) Received: from phl-imap-03 ([10.202.2.93]) by phl-compute-04.internal (MEProxy); Tue, 30 Sep 2025 14:56:32 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=compiler.org; h= 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=1759258592; x=1759344992; bh=8UJcpCK5Qs oA6hISIbkJqUmsqkNHxC+C57f1LjtX2I8=; b=HWQSzWvlYfWzXgRL2cAdka9Bix uUa2nHaVwNR2iV2s0SjiiUcWock0nQwNETbJrKyKWelpsphcdDiQMwuTSRvdahpb MsAY1BALmw75EdOuOYZyXotXXUe/F682zKaEyHVcNmXpPXCa72w/LPl4oHGv8L2H gZPR9JSaFRIg7ntNXqCrMiYVyxDpOMun4MGbeFd5M2tB9cLZ943VoNBEDf/GOV7Q MQcOo/zQeJe8tQGszqFQnd0pshx8lmG2brRurguojPgNpsxGK5LIxs6lfL8zhLk+ DWflL2HJZn8L5/cpbhoKmNYlSu0E2eRegyddDAUb2vPAu6klruGpKMUufRJQ== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=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= 1759258592; x=1759344992; bh=8UJcpCK5QsoA6hISIbkJqUmsqkNHxC+C57f 1LjtX2I8=; b=UKGMm2cNhRcFxYF8L5LlaWOktM3JjMheAVLtQYwS4M28qL/DUCl g28P2a9x3Z66BObpYXxsyQP/Cullw3M7gMhrpdTVG6WbX+ajPy4aIRm4Pid195Oz 54bBJ5Q4FRsHk9UHI6GqlVj21I4kRcu8p5wNg872zwjFje4vXkU/SPq2uBjo52cy gAwjKIMRXHdRSC4w2JZ5D/rGB2ix1NxeGWiDrP33R785P9iK29XxGN+xajkGkNO7 0DrxbSd+75IRX7iam5sCGwAiy6l/sTq9bP80+JHiFUZ6mQDu5FODcJySGP9nApsv cWLgrEJZ4OugM//P4B7n9dqesWWYuIf0t/A== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdeggdekudegkecutefuodetggdotefrod ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpuffrtefokffrpgfnqfghnecuuegr ihhlohhuthemuceftddtnecunecujfgurhepofggfffhvffkjghfufgtsehmtderreertd dtnecuhfhrohhmpedflfhovghlucflrggtohgsshhonhdfuceojhhovghlsegtohhmphhi lhgvrhdrohhrgheqnecuggftrfgrthhtvghrnhepfeehuedtgedvgfeuueeukeeiueffhe ekueelffevkeekgeekvefhkeffgffhveelnecuvehluhhsthgvrhfuihiivgeptdenucfr rghrrghmpehmrghilhhfrhhomhepjhhovghlsegtohhmphhilhgvrhdrohhrghdpnhgspg hrtghpthhtohepuddpmhhouggvpehsmhhtphhouhhtpdhrtghpthhtohepphhgshhqlhdq hhgrtghkvghrshesphhoshhtghhrvghsqhhlrdhorhhg X-ME-Proxy: Feedback-ID: ic6394509:Fastmail Received: by mailuser.phl.internal (Postfix, from userid 501) id DF71318E0069; Tue, 30 Sep 2025 14:56:31 -0400 (EDT) X-Mailer: MessagingEngine.com Webmail Interface MIME-Version: 1.0 X-ThreadId: AZ7XRsRLdGms Date: Tue, 30 Sep 2025 20:56:11 +0200 From: "Joel Jacobson" To: pgsql-hackers Message-Id: In-Reply-To: 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> Subject: Re: Optimize LISTEN/NOTIFY Content-Type: multipart/mixed; boundary=58cf2ac6de9047d7a36b1c0e5549407d List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --58cf2ac6de9047d7a36b1c0e5549407d Content-Type: text/plain Content-Transfer-Encoding: 7bit On Mon, Sep 29, 2025, at 04:33, Chao Li wrote: > I never had a concern about using the timeout mechanism. My comment was > about enabling timeout duplicately. Thanks for reviewing. However, like said in my previous email, I'm sorry, but don't believe in my suggested throughput/latency approach. I unfortunately managed to derail from the IMO more promising approaches I worked on initially. What I couldn't find a solution to then, was the problem of possibly ending up in a situation where some lagging backends would never catch up. In this new patch, I've simply introduced a new bgworker, given the specific task of kicking lagging backends. I wish of course we could do without the bgworker, but I don't see how that would be possible. --- optimize_listen_notify-v5.patch: Fix LISTEN/NOTIFY so it scales with idle listening backends Currently, idle listening backends cause a dramatic slowdown due to context switching when they are signaled and wake up. This is wasteful when they are not listening to the channel being notified. Just 10 extra idle listening connections cause a slowdown from 8700 TPS to 6100 TPS, 100 extra cause it to drop to 2000 TPS, and at 1000 extra it falls to 250 TPS. To improve scalability with the number of idle listening backends, this patch introduces a shared hash table to keep track of channels per listening backend. This hash table is partitioned to reduce contention on concurrent LISTEN/UNLISTEN operations. We keep track of up to NOTIFY_MULTICAST_THRESHOLD (16) listeners per channel. Benchmarks indicated diminishing gains above this level. Setting it lower seems unnecessary, so a constant seemed fine; a GUC did not seem motivated. This patch also adds a wakeup_pending flag to each backend's queue status to avoid redundant signaling when a wakeup is already pending as the backend is signaled again. The flag is set when a backend is signaled and cleared before processing the queue. This order is important to ensure correctness. It was also necessary to add a new bgworker, notify_bgworker, whose sole responsibility is to wake up lagging listening backends, ensuring they are kicked when they are about to fall too far behind. This bgworker is always started at postmaster startup, but is only activated upon NOTIFY by signaling it, unless it is already active. The notify_bgworker staggers the signaling of lagging listening backends by sleeping 100 ms between each signal, to prevent the thundering herd problem we would otherwise get if all listening backends woke up at the same time. It loops until there are no more lagging listening backends, and then becomes inactive. /Joel --58cf2ac6de9047d7a36b1c0e5549407d Content-Disposition: attachment; filename="optimize_listen_notify-v5.patch" Content-Type: application/octet-stream; name="optimize_listen_notify-v5.patch" Content-Transfer-Encoding: base64 RnJvbSBlNWJkMDk1OWI3NTZkZDdlNTJmZmNjMWUwYTcwMDVjZTI3ZjljYWJiIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBKb2VsIEphY29ic29uIDxqb2VsQGNvbXBpbGVyLm9y Zz4KRGF0ZTogU3VuLCAyOCBTZXAgMjAyNSAxNDo1Mzo1NyArMDIwMApTdWJqZWN0OiBbUEFU Q0hdIEZpeCBMSVNURU4vTk9USUZZIHNvIGl0IHNjYWxlcyB3aXRoIGlkbGUgbGlzdGVuaW5n IGJhY2tlbmRzCgpDdXJyZW50bHksIGlkbGUgbGlzdGVuaW5nIGJhY2tlbmRzIGNhdXNlIGEg ZHJhbWF0aWMgc2xvd2Rvd24gZHVlIHRvCmNvbnRleHQgc3dpdGNoaW5nIHdoZW4gdGhleSBh cmUgc2lnbmFsZWQgYW5kIHdha2UgdXAuIFRoaXMgaXMgd2FzdGVmdWwKd2hlbiB0aGV5IGFy ZSBub3QgbGlzdGVuaW5nIHRvIHRoZSBjaGFubmVsIGJlaW5nIG5vdGlmaWVkLgoKSnVzdCAx MCBleHRyYSBpZGxlIGxpc3RlbmluZyBjb25uZWN0aW9ucyBjYXVzZSBhIHNsb3dkb3duIGZy b20gODcwMCBUUFMKdG8gNjEwMCBUUFMsIDEwMCBleHRyYSBjYXVzZSBpdCB0byBkcm9wIHRv IDIwMDAgVFBTLCBhbmQgYXQgMTAwMCBleHRyYQppdCBmYWxscyB0byAyNTAgVFBTLgoKVG8g aW1wcm92ZSBzY2FsYWJpbGl0eSB3aXRoIHRoZSBudW1iZXIgb2YgaWRsZSBsaXN0ZW5pbmcg YmFja2VuZHMsIHRoaXMKcGF0Y2ggaW50cm9kdWNlcyBhIHNoYXJlZCBoYXNoIHRhYmxlIHRv IGtlZXAgdHJhY2sgb2YgY2hhbm5lbHMgcGVyCmxpc3RlbmluZyBiYWNrZW5kLiBUaGlzIGhh c2ggdGFibGUgaXMgcGFydGl0aW9uZWQgdG8gcmVkdWNlIGNvbnRlbnRpb24Kb24gY29uY3Vy cmVudCBMSVNURU4vVU5MSVNURU4gb3BlcmF0aW9ucy4KCldlIGtlZXAgdHJhY2sgb2YgdXAg dG8gTk9USUZZX01VTFRJQ0FTVF9USFJFU0hPTEQgKDE2KSBsaXN0ZW5lcnMgcGVyCmNoYW5u ZWwuIEJlbmNobWFya3MgaW5kaWNhdGVkIGRpbWluaXNoaW5nIGdhaW5zIGFib3ZlIHRoaXMg bGV2ZWwuClNldHRpbmcgaXQgbG93ZXIgc2VlbXMgdW5uZWNlc3NhcnksIHNvIGEgY29uc3Rh bnQgc2VlbWVkIGZpbmU7IGEgR1VDIGRpZApub3Qgc2VlbSBtb3RpdmF0ZWQuCgpUaGlzIHBh dGNoIGFsc28gYWRkcyBhIHdha2V1cF9wZW5kaW5nIGZsYWcgdG8gZWFjaCBiYWNrZW5kJ3Mg cXVldWUKc3RhdHVzIHRvIGF2b2lkIHJlZHVuZGFudCBzaWduYWxpbmcgd2hlbiBhIHdha2V1 cCBpcyBhbHJlYWR5IHBlbmRpbmcgYXMKdGhlIGJhY2tlbmQgaXMgc2lnbmFsZWQgYWdhaW4u IFRoZSBmbGFnIGlzIHNldCB3aGVuIGEgYmFja2VuZCBpcwpzaWduYWxlZCBhbmQgY2xlYXJl ZCBiZWZvcmUgcHJvY2Vzc2luZyB0aGUgcXVldWUuIFRoaXMgb3JkZXIgaXMKaW1wb3J0YW50 IHRvIGVuc3VyZSBjb3JyZWN0bmVzcy4KCkl0IHdhcyBhbHNvIG5lY2Vzc2FyeSB0byBhZGQg YSBuZXcgYmd3b3JrZXIsIG5vdGlmeV9iZ3dvcmtlciwgd2hvc2Ugc29sZQpyZXNwb25zaWJp bGl0eSBpcyB0byB3YWtlIHVwIGxhZ2dpbmcgbGlzdGVuaW5nIGJhY2tlbmRzLCBlbnN1cmlu ZyB0aGV5CmFyZSBraWNrZWQgd2hlbiB0aGV5IGFyZSBhYm91dCB0byBmYWxsIHRvbyBmYXIg YmVoaW5kLiBUaGlzIGJnd29ya2VyIGlzCmFsd2F5cyBzdGFydGVkIGF0IHBvc3RtYXN0ZXIg c3RhcnR1cCwgYnV0IGlzIG9ubHkgYWN0aXZhdGVkIHVwb24gTk9USUZZCmJ5IHNpZ25hbGlu ZyBpdCwgdW5sZXNzIGl0IGlzIGFscmVhZHkgYWN0aXZlLiBUaGUgbm90aWZ5X2Jnd29ya2Vy CnN0YWdnZXJzIHRoZSBzaWduYWxpbmcgb2YgbGFnZ2luZyBsaXN0ZW5pbmcgYmFja2VuZHMg Ynkgc2xlZXBpbmcgMTAwIG1zCmJldHdlZW4gZWFjaCBzaWduYWwsIHRvIHByZXZlbnQgdGhl IHRodW5kZXJpbmcgaGVyZCBwcm9ibGVtIHdlIHdvdWxkCm90aGVyd2lzZSBnZXQgaWYgYWxs IGxpc3RlbmluZyBiYWNrZW5kcyB3b2tlIHVwIGF0IHRoZSBzYW1lIHRpbWUuIEl0Cmxvb3Bz IHVudGlsIHRoZXJlIGFyZSBubyBtb3JlIGxhZ2dpbmcgbGlzdGVuaW5nIGJhY2tlbmRzLCBh bmQgdGhlbgpiZWNvbWVzIGluYWN0aXZlLgotLS0KIHNyYy9iYWNrZW5kL2NvbW1hbmRzL2Fz eW5jLmMgICAgICAgICAgICAgICAgICB8IDg4MiArKysrKysrKysrKysrKysrKy0KIHNyYy9i YWNrZW5kL3Bvc3RtYXN0ZXIvTWFrZWZpbGUgICAgICAgICAgICAgICB8ICAgMSArCiBzcmMv YmFja2VuZC9wb3N0bWFzdGVyL2Jnd29ya2VyLmMgICAgICAgICAgICAgfCAgIDQgKwogc3Jj L2JhY2tlbmQvcG9zdG1hc3Rlci9tZXNvbi5idWlsZCAgICAgICAgICAgIHwgICAxICsKIHNy Yy9iYWNrZW5kL3Bvc3RtYXN0ZXIvbm90aWZ5X2Jnd29ya2VyLmMgICAgICB8IDIyNSArKysr Kwogc3JjL2JhY2tlbmQvcG9zdG1hc3Rlci9wb3N0bWFzdGVyLmMgICAgICAgICAgIHwgICA2 ICsKIC4uLi91dGlscy9hY3Rpdml0eS93YWl0X2V2ZW50X25hbWVzLnR4dCAgICAgICB8ICAg MSArCiBzcmMvaW5jbHVkZS9wb3N0bWFzdGVyL25vdGlmeV9iZ3dvcmtlci5oICAgICAgfCAg NDAgKwogc3JjL2luY2x1ZGUvc3RvcmFnZS9sd2xvY2tsaXN0LmggICAgICAgICAgICAgIHwg ICAxICsKIDkgZmlsZXMgY2hhbmdlZCwgMTEyMiBpbnNlcnRpb25zKCspLCAzOSBkZWxldGlv bnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvYmFja2VuZC9wb3N0bWFzdGVyL25vdGlm eV9iZ3dvcmtlci5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL2luY2x1ZGUvcG9zdG1hc3Rl ci9ub3RpZnlfYmd3b3JrZXIuaAoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1hbmRz L2FzeW5jLmMgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9hc3luYy5jCmluZGV4IDRiZDM3ZDVi ZWI1Li5mZDMyZTIwNzQwOCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvYXN5 bmMuYworKysgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9hc3luYy5jCkBAIC0yNCw4ICsyNCwx MiBAQAogICoJICBBbGwgbm90aWZpY2F0aW9uIG1lc3NhZ2VzIGFyZSBwbGFjZWQgaW4gdGhl IHF1ZXVlIGFuZCBsYXRlciByZWFkIG91dAogICoJICBieSBsaXN0ZW5pbmcgYmFja2VuZHMu CiAgKgotICoJICBUaGVyZSBpcyBubyBjZW50cmFsIGtub3dsZWRnZSBvZiB3aGljaCBiYWNr ZW5kIGxpc3RlbnMgb24gd2hpY2ggY2hhbm5lbDsKLSAqCSAgZXZlcnkgYmFja2VuZCBoYXMg aXRzIG93biBsaXN0IG9mIGludGVyZXN0aW5nIGNoYW5uZWxzLgorICoJICBJbiBhZGRpdGlv biB0byBlYWNoIGJhY2tlbmQgbWFpbnRhaW5pbmcgaXRzIG93biBsaXN0IG9mIGNoYW5uZWxz LCB3ZSBhbHNvCisgKgkgIG1haW50YWluIGEgY2VudHJhbCBoYXNoIHRhYmxlIHRoYXQgdHJh Y2tzIGxpc3RlbmVycyBmb3IgZWFjaCBjaGFubmVsLCB1cAorICoJICB0byBOT1RJRllfTVVM VElDQVNUX1RIUkVTSE9MRC4gV2hlbiB0aGUgbnVtYmVyIG9mIGxpc3RlbmVycyBpcyBiZWxv dworICoJICB0aGlzIHRocmVzaG9sZCwgd2UgY2FuIHBlcmZvcm0gYSB0YXJnZXRlZCAibXVs dGljYXN0IiBieSBzaWduYWxpbmcgb25seQorICoJICB0aG9zZSBzcGVjaWZpYyBiYWNrZW5k cy4gSWYgdGhlIG51bWJlciBvZiBsaXN0ZW5lcnMgcmVhY2hlcyBvciBleGNlZWRzIHRoZQor ICoJICB0aHJlc2hvbGQsIHdlIGZhbGwgYmFjayB0byBzaWduYWxpbmcgYWxsIGxpc3Rlbmlu ZyBiYWNrZW5kcyBpbiB0aGUgZGF0YWJhc2UuCiAgKgogICoJICBBbHRob3VnaCB0aGVyZSBp cyBvbmx5IG9uZSBxdWV1ZSwgbm90aWZpY2F0aW9ucyBhcmUgdHJlYXRlZCBhcyBiZWluZwog ICoJICBkYXRhYmFzZS1sb2NhbDsgdGhpcyBpcyBkb25lIGJ5IGluY2x1ZGluZyB0aGUgc2Vu ZGVyJ3MgZGF0YWJhc2UgT0lECkBAIC03MSwxMyArNzUsMTkgQEAKICAqCSAgbWFrZSBhbnkg YWN0dWFsIHVwZGF0ZXMgdG8gdGhlIGVmZmVjdGl2ZSBsaXN0ZW4gc3RhdGUgKGxpc3RlbkNo YW5uZWxzKS4KICAqCSAgVGhlbiB3ZSBzaWduYWwgYW55IGJhY2tlbmRzIHRoYXQgbWF5IGJl IGludGVyZXN0ZWQgaW4gb3VyIG1lc3NhZ2VzCiAgKgkgIChpbmNsdWRpbmcgb3VyIG93biBi YWNrZW5kLCBpZiBsaXN0ZW5pbmcpLiAgVGhpcyBpcyBkb25lIGJ5Ci0gKgkgIFNpZ25hbEJh Y2tlbmRzKCksIHdoaWNoIHNjYW5zIHRoZSBsaXN0IG9mIGxpc3RlbmluZyBiYWNrZW5kcyBh bmQgc2VuZHMgYQotICoJICBQUk9DU0lHX05PVElGWV9JTlRFUlJVUFQgc2lnbmFsIHRvIGV2 ZXJ5IGxpc3RlbmluZyBiYWNrZW5kICh3ZSBkb24ndAotICoJICBrbm93IHdoaWNoIGJhY2tl bmQgaXMgbGlzdGVuaW5nIG9uIHdoaWNoIGNoYW5uZWwgc28gd2UgbXVzdCBzaWduYWwgdGhl bQotICoJICBhbGwpLiAgV2UgY2FuIGV4Y2x1ZGUgYmFja2VuZHMgdGhhdCBhcmUgYWxyZWFk eSB1cCB0byBkYXRlLCB0aG91Z2gsIGFuZAotICoJICB3ZSBjYW4gYWxzbyBleGNsdWRlIGJh Y2tlbmRzIHRoYXQgYXJlIGluIG90aGVyIGRhdGFiYXNlcyAodW5sZXNzIHRoZXkKLSAqCSAg YXJlIHdheSBiZWhpbmQgYW5kIHNob3VsZCBiZSBraWNrZWQgdG8gbWFrZSB0aGVtIGFkdmFu Y2UgdGhlaXIKLSAqCSAgcG9pbnRlcnMpLgorICoJICBTaWduYWxCYWNrZW5kcygpLCB3aGlj aCBzZW5kcyBQUk9DU0lHX05PVElGWV9JTlRFUlJVUFQgc2lnbmFscyB0bworICoJICBsaXN0 ZW5pbmcgYmFja2VuZHMsIGFuZCBoYXMgdHdvIG1vZGVzIG9mIG9wZXJhdGlvbjoKKyAqCSAg YSkgTXVsdGljYXN0IG1vZGU6IEZvciBjaGFubmVscyB3aXRoIGEgbnVtYmVyIG9mIGxpc3Rl bmVycyBub3QgZXhjZWVkaW5nCisgKgkgIE5PVElGWV9NVUxUSUNBU1RfVEhSRVNIT0xELCBz aWduYWxzIGFyZSBzZW50IG9ubHkgdG8gdGhvc2Ugc3BlY2lmaWMKKyAqCSAgYmFja2VuZHMu CisgKgkgIGIpIEJyb2FkY2FzdCBtb2RlOiBJZiBhbnkgY2hhbm5lbCBiZWluZyBub3RpZmll ZCBoYXMgbW9yZSBsaXN0ZW5lcnMgdGhhbgorICoJICB0aGUgdGhyZXNob2xkIChvciBpZiB0 aGUgaGFzaCB0YWJsZSBydW5zIG91dCBvZiBzaGFyZWQgbWVtb3J5IGZvcgorICoJICBuZXcg ZW50cmllcyksIHdlIHNpZ25hbCBldmVyeSBsaXN0ZW5pbmcgYmFja2VuZCBpbiB0aGUgZGF0 YWJhc2UuCisgKgorICoJICBBZnRlciBzZW5kaW5nIGltbWVkaWF0ZSBzaWduYWxzLCBTaWdu YWxCYWNrZW5kcygpIGFsc28gdHJpZ2dlcnMgYSBkZWZlcnJlZAorICoJICB3YWtldXAgYmFj a2dyb3VuZCB3b3JrZXIgKGlmIG5vdCBhbHJlYWR5IGFjdGl2ZSkgdGhhdCBoYW5kbGVzIHdh a2luZyB1cAorICoJICBiYWNrZW5kcyB0aGF0IGhhdmUgZmFsbGVuIGJlaGluZCBieSBRVUVV RV9DTEVBTlVQX0RFTEFZIG9yIG1vcmUgcGFnZXMsCisgKgkgIHVzaW5nIHN0YWdnZXJlZCBk ZWxheXMgdG8gcHJldmVudCB0aHVuZGVyaW5nIGhlcmQgZWZmZWN0cy4KICAqCiAgKgkgIEZp bmFsbHksIGFmdGVyIHdlIGFyZSBvdXQgb2YgdGhlIHRyYW5zYWN0aW9uIGFsdG9nZXRoZXIg YW5kIGFib3V0IHRvIGdvCiAgKgkgIGlkbGUsIHdlIHNjYW4gdGhlIHF1ZXVlIGZvciBtZXNz YWdlcyB0aGF0IG5lZWQgdG8gYmUgc2VudCB0byBvdXIKQEAgLTEyOCw2ICsxMzgsNyBAQAog I2luY2x1ZGUgPGxpbWl0cy5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHNp Z25hbC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgogCiAjaW5jbHVkZSAiYWNjZXNzL3BhcmFs bGVsLmgiCiAjaW5jbHVkZSAiYWNjZXNzL3NscnUuaCIKQEAgLTEzNyw2ICsxNDgsNyBAQAog I2luY2x1ZGUgImNvbW1hbmRzL2FzeW5jLmgiCiAjaW5jbHVkZSAiY29tbW9uL2hhc2hmbi5o IgogI2luY2x1ZGUgImZ1bmNhcGkuaCIKKyNpbmNsdWRlICJwb3N0bWFzdGVyL25vdGlmeV9i Z3dvcmtlci5oIgogI2luY2x1ZGUgImxpYnBxL2xpYnBxLmgiCiAjaW5jbHVkZSAibGlicHEv cHFmb3JtYXQuaCIKICNpbmNsdWRlICJtaXNjYWRtaW4uaCIKQEAgLTE0Niw2ICsxNTgsNyBA QAogI2luY2x1ZGUgInRjb3AvdGNvcHByb3QuaCIKICNpbmNsdWRlICJ1dGlscy9idWlsdGlu cy5oIgogI2luY2x1ZGUgInV0aWxzL2d1Y19ob29rcy5oIgorI2luY2x1ZGUgInV0aWxzL2hz ZWFyY2guaCIKICNpbmNsdWRlICJ1dGlscy9tZW11dGlscy5oIgogI2luY2x1ZGUgInV0aWxz L3BzX3N0YXR1cy5oIgogI2luY2x1ZGUgInV0aWxzL3NuYXBtZ3IuaCIKQEAgLTE2Miw2ICsx NzUsNzkgQEAKICAqLwogI2RlZmluZSBOT1RJRllfUEFZTE9BRF9NQVhfTEVOR1RICShCTENL U1ogLSBOQU1FREFUQUxFTiAtIDEyOCkKIAorLyoKKyAqIE1heGltdW0gbnVtYmVyIG9mIGxp c3RlbmVycyB0byB0cmFjayBwZXIgY2hhbm5lbCBmb3IgbXVsdGljYXN0IHNpZ25hbGluZy4K KyAqIFdoZW4gdGhlIG51bWJlciBvZiBsaXN0ZW5lcnMgb24gYSBjaGFubmVsIGV4Y2VlZHMg dGhpcyB0aHJlc2hvbGQsIE5PVElGWQorICogd2lsbCBzaWduYWwgYWxsIGxpc3RlbmluZyBi YWNrZW5kcyByYXRoZXIgdGhhbiBqdXN0IHRob3NlIGxpc3RlbmluZyBvbiB0aGUKKyAqIHNw ZWNpZmljIGNoYW5uZWwuIFNldHRpbmcgdG8gMCBkaXNhYmxlcyBtdWx0aWNhc3Qgc2lnbmFs aW5nIGVudGlyZWx5LgorICovCisjZGVmaW5lIE5PVElGWV9NVUxUSUNBU1RfVEhSRVNIT0xE CTE2CisKKy8qCisgKiBOdW1iZXIgb2YgcGFydGl0aW9ucyBmb3IgdGhlIGNoYW5uZWwgaGFz aCB0YWJsZSdzIGxvY2tzLgorICogVGhpcyBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvLgorICov CisjZGVmaW5lIE5VTV9OT1RJRllfUEFSVElUSU9OUyAxMjgKKworLyoKKyAqIENoYW5uZWwg aGFzaCB0YWJsZSBkZWZpbml0aW9ucworICoKKyAqIFRoaXMgaGFzaCB0YWJsZSBwcm92aWRl cyBhbiBvcHRpbWl6YXRpb24gYnkgdHJhY2tpbmcgd2hpY2ggYmFja2VuZHMgYXJlCisgKiBs aXN0ZW5pbmcgb24gZWFjaCBjaGFubmVsLCB1cCB0byBhIGNlcnRhaW4gdGhyZXNob2xkLiBD aGFubmVscyBhcmUKKyAqIGlkZW50aWZpZWQgYnkgZGF0YWJhc2UgT0lEIGFuZCBjaGFubmVs IG5hbWUsIG1ha2luZyB0aGVtCisgKiBkYXRhYmFzZS1zcGVjaWZpYy4KKyAqCisgKiBUbyBp bXByb3ZlIHNjYWxhYmlsaXR5IG9mIGNvbmN1cnJlbnQgTElTVEVOL1VOTElTVEVOIG9wZXJh dGlvbnMsIHRoZSBoYXNoCisgKiB0YWJsZSBpcyBwYXJ0aXRpb25lZCwgd2l0aCBlYWNoIHBh cnRpdGlvbiBwcm90ZWN0ZWQgYnkgaXRzIG93biBMV0xvY2suCisgKiBUaGlzIGF2b2lkcyBz ZXJpYWxpemluZyBhbGwgb3BlcmF0aW9ucyBvbiBhIHNpbmdsZSBnbG9iYWwgbG9jay4KKyAq CisgKiBXaGVuIHRoZSBudW1iZXIgb2YgYmFja2VuZHMgbGlzdGVuaW5nIG9uIGEgY2hhbm5l bCBpcyBhdCBvciBiZWxvdworICogTk9USUZZX01VTFRJQ0FTVF9USFJFU0hPTEQsIHdlIHN0 b3JlIHRoZWlyIFByb2NOdW1iZXJzIGFuZCBzaWduYWwgdGhlbQorICogZGlyZWN0bHkgKG11 bHRpY2FzdCkuCisgKgorICogV2UgZmFsbCBiYWNrIHRvIGJyb2FkY2FzdCBtb2RlIGFuZCBz aWduYWwgYWxsIGxpc3RlbmluZyBiYWNrZW5kcyB3aGVuOgorICogMSkgTW9yZSBiYWNrZW5k cyBsaXN0ZW4gb24gdGhlIHNhbWUgY2hhbm5lbCB0aGFuIHRoZSB0aHJlc2hvbGQgYWxsb3dz LCBPUgorICogMikgVGhlIGhhc2ggdGFibGUgcnVucyBvdXQgb2Ygc2hhcmVkIG1lbW9yeSBm b3IgbmV3IGVudHJpZXMKKyAqCisgKiBOb3RlIHRoYXQgQ0hBTk5FTF9IQVNIX01BWF9TSVpF IGlzIG5vdCBhIGhhcmQgbGltaXQgLSB0aGUgaGFzaCB0YWJsZSBjYW4KKyAqIHN0b3JlIG1v cmUgZW50cmllcyB0aGFuIHRoaXMsIGJ1dCBwZXJmb3JtYW5jZSB3aWxsIGRlZ3JhZGUgZHVl IHRvIGJ1Y2tldAorICogb3ZlcmZsb3cuIFRoZSBhY3R1YWwgZmFsbGJhY2sgdG8gYnJvYWRj YXN0IG1vZGUgb2NjdXJzIG9ubHkgd2hlbiBzaGFyZWQKKyAqIG1lbW9yeSBpcyBleGhhdXN0 ZWQgYW5kIHdlIGNhbm5vdCBhbGxvY2F0ZSBuZXcgaGFzaCBlbnRyaWVzLgorICoKKyAqIFRo ZSBtYXhpbXVtIHNpemUgKENIQU5ORUxfSEFTSF9NQVhfU0laRSkgaXMgYmFzZWQgb24gdGhl IHR5cGljYWwgT1MgcG9ydAorICogcmFuZ2UuIFRoaXMgcHJvdmlkZXMgYSByZWFzb25hYmxl IHVwcGVyIGJvdW5kIGZvciBzeXN0ZW1zIHRoYXQgdXNlCisgKiBwZXItY29ubmVjdGlvbiBj aGFubmVscy4KKyAqCisgKi8KKyNkZWZpbmUgQ0hBTk5FTF9IQVNIX0lOSVRfU0laRQkJMjU2 CisjZGVmaW5lIENIQU5ORUxfSEFTSF9NQVhfU0laRQkJNjU1MzUKKworLyoKKyAqIEtleSBz dHJ1Y3R1cmUgZm9yIHRoZSBjaGFubmVsIGhhc2ggdGFibGUuCisgKiBDaGFubmVscyBhcmUg ZGF0YWJhc2Utc3BlY2lmaWMsIHNvIHdlIG5lZWQgYm90aCB0aGUgZGF0YWJhc2UgT0lECisg KiBhbmQgdGhlIGNoYW5uZWwgbmFtZSB0byB1bmlxdWVseSBpZGVudGlmeSBhIGNoYW5uZWwu CisgKi8KK3R5cGVkZWYgc3RydWN0IENoYW5uZWxIYXNoS2V5Cit7CisJT2lkCQkJZGJvaWQ7 CisJY2hhcgkJY2hhbm5lbFtOQU1FREFUQUxFTl07Cit9CQkJQ2hhbm5lbEhhc2hLZXk7CisK Ky8qCisgKiBFYWNoIGVudHJ5IGNvbnRhaW5zIGEgY2hhbm5lbCBrZXkgKGRhdGFiYXNlIE9J RCArIGNoYW5uZWwgbmFtZSkgYW5kIGFuIGFycmF5CisgKiBvZiBsaXN0ZW5pbmcgYmFja2Vu ZCBQcm9jTnVtYmVycywgdXAgdG8gTk9USUZZX01VTFRJQ0FTVF9USFJFU0hPTEQuIElmIHRo ZQorICogbnVtYmVyIG9mIGxpc3RlbmVycyBleGNlZWRzIHRoZSB0aHJlc2hvbGQsIHdlIG1h cmsgdGhlIGNoYW5uZWwgZm9yCisgKiBicm9hZGNhc3QgYW5kIHN0b3AgdHJhY2tpbmcgaW5k aXZpZHVhbCBsaXN0ZW5lcnMuCisgKi8KK3R5cGVkZWYgc3RydWN0IENoYW5uZWxFbnRyeQor eworCUNoYW5uZWxIYXNoS2V5IGtleTsKKwlib29sCQlpc19icm9hZGNhc3Q7CS8qIFRydWUg aWYgbnVtX2xpc3RlbmVycyA+PSB0aHJlc2hvbGQgKi8KKwl1aW50OAkJbnVtX2xpc3RlbmVy czsJLyogTnVtYmVyIG9mIGxpc3RlbmVycyBjdXJyZW50bHkgc3RvcmVkICovCisJLyogTGlz dGVuZXJzIGFycmF5IGZvbGxvd3MsIG9mIHNpemUgTk9USUZZX01VTFRJQ0FTVF9USFJFU0hP TEQgKi8KKwlQcm9jTnVtYmVyCWxpc3RlbmVyc1tGTEVYSUJMRV9BUlJBWV9NRU1CRVJdOwor fQkJCUNoYW5uZWxFbnRyeTsKKwogLyoKICAqIFN0cnVjdCByZXByZXNlbnRpbmcgYW4gZW50 cnkgaW4gdGhlIGdsb2JhbCBub3RpZnkgcXVldWUKICAqCkBAIC0yMjcsOCArMzEzLDggQEAg dHlwZWRlZiBzdHJ1Y3QgUXVldWVQb3NpdGlvbgogLyoKICAqIFBhcmFtZXRlciBkZXRlcm1p bmluZyBob3cgb2Z0ZW4gd2UgdHJ5IHRvIGFkdmFuY2UgdGhlIHRhaWwgcG9pbnRlcjoKICAq IHdlIGRvIHRoYXQgYWZ0ZXIgZXZlcnkgUVVFVUVfQ0xFQU5VUF9ERUxBWSBwYWdlcyBvZiBO T1RJRlkgZGF0YS4gIFRoaXMgaXMKLSAqIGFsc28gdGhlIGRpc3RhbmNlIGJ5IHdoaWNoIGEg YmFja2VuZCBpbiBhbm90aGVyIGRhdGFiYXNlIG5lZWRzIHRvIGJlCi0gKiBiZWhpbmQgYmVm b3JlIHdlJ2xsIGRlY2lkZSB3ZSBuZWVkIHRvIHdha2UgaXQgdXAgdG8gYWR2YW5jZSBpdHMg cG9pbnRlci4KKyAqIGFsc28gdGhlIGRpc3RhbmNlIGJ5IHdoaWNoIGEgYmFja2VuZCBuZWVk cyB0byBiZSBiZWhpbmQgYmVmb3JlIHdlJ2xsCisgKiBkZWNpZGUgd2UgbmVlZCB0byB3YWtl IGl0IHVwIHRvIGFkdmFuY2UgaXRzIHBvaW50ZXIuCiAgKgogICogUmVzaXN0IHRoZSB0ZW1w dGF0aW9uIHRvIG1ha2UgdGhpcyByZWFsbHkgbGFyZ2UuICBXaGlsZSB0aGF0IHdvdWxkIHNh dmUKICAqIHdvcmsgaW4gc29tZSBwbGFjZXMsIGl0IHdvdWxkIGFkZCBjb3N0IGluIG90aGVy cy4gIEluIHBhcnRpY3VsYXIsIHRoaXMKQEAgLTI0Niw2ICszMzIsNyBAQCB0eXBlZGVmIHN0 cnVjdCBRdWV1ZUJhY2tlbmRTdGF0dXMKIAlPaWQJCQlkYm9pZDsJCQkvKiBiYWNrZW5kJ3Mg ZGF0YWJhc2UgT0lELCBvciBJbnZhbGlkT2lkICovCiAJUHJvY051bWJlcgluZXh0TGlzdGVu ZXI7CS8qIGlkIG9mIG5leHQgbGlzdGVuZXIsIG9yIElOVkFMSURfUFJPQ19OVU1CRVIgKi8K IAlRdWV1ZVBvc2l0aW9uIHBvczsJCQkvKiBiYWNrZW5kIGhhcyByZWFkIHF1ZXVlIHVwIHRv IGhlcmUgKi8KKwlib29sCQl3YWtldXBfcGVuZGluZzsKIH0gUXVldWVCYWNrZW5kU3RhdHVz OwogCiAvKgpAQCAtMjY5LDYgKzM1NiwxMSBAQCB0eXBlZGVmIHN0cnVjdCBRdWV1ZUJhY2tl bmRTdGF0dXMKICAqIEluIG9yZGVyIHRvIGF2b2lkIGRlYWRsb2Nrcywgd2hlbmV2ZXIgd2Ug bmVlZCBtdWx0aXBsZSBsb2Nrcywgd2UgZmlyc3QgZ2V0CiAgKiBOb3RpZnlRdWV1ZVRhaWxM b2NrLCB0aGVuIE5vdGlmeVF1ZXVlTG9jaywgYW5kIGxhc3RseSBTTFJVIGJhbmsgbG9jay4K ICAqCisgKiBUaGUgY2hhbm5lbCBoYXNoIHRhYmxlIGlzIHByb3RlY3RlZCBieSBhIHNlcGFy YXRlIHNldCBvZiBwYXJ0aXRpb25lZAorICogbG9ja3MuIFRvIHByZXZlbnQgZGVhZGxvY2tz IGJldHdlZW4gdGhlc2UgYW5kIE5vdGlmeVF1ZXVlTG9jaywgdGhlIGdsb2JhbAorICogbG9j ay1vcmRlcmluZyBydWxlIGlzOiBhbHdheXMgYWNxdWlyZSBOb3RpZnlRdWV1ZUxvY2sgKmJl Zm9yZSogYWNxdWlyaW5nCisgKiBhbnkgY2hhbm5lbCBoYXNoIHBhcnRpdGlvbiBsb2NrLgor ICoKICAqIEVhY2ggYmFja2VuZCB1c2VzIHRoZSBiYWNrZW5kW10gYXJyYXkgZW50cnkgd2l0 aCBpbmRleCBlcXVhbCB0byBpdHMKICAqIFByb2NOdW1iZXIuICBXZSByZWx5IG9uIHRoaXMg dG8gbWFrZSBTZW5kUHJvY1NpZ25hbCBmYXN0LgogICoKQEAgLTI4OCwxMSArMzgwLDY3IEBA IHR5cGVkZWYgc3RydWN0IEFzeW5jUXVldWVDb250cm9sCiAJUHJvY051bWJlcglmaXJzdExp c3RlbmVyOwkvKiBpZCBvZiBmaXJzdCBsaXN0ZW5lciwgb3IKIAkJCQkJCQkJICogSU5WQUxJ RF9QUk9DX05VTUJFUiAqLwogCVRpbWVzdGFtcFR6IGxhc3RRdWV1ZUZpbGxXYXJuOwkvKiB0 aW1lIG9mIGxhc3QgcXVldWUtZnVsbCBtc2cgKi8KKwkvKiBEZWZlcnJlZCB3YWtldXAgd29y a2VyIHN0YXRlICovCisJYm9vbAkJZGVmZXJyZWRXYWtldXBXb3JrZXJBY3RpdmU7IC8qIGlz IHdvcmtlciBwcm9jZXNzaW5nPyAqLworCXBpZF90CQlkZWZlcnJlZFdha2V1cFdvcmtlclBp ZDsJLyogUElEIG9mIHdvcmtlciBmb3Igc2lnbmFsaW5nICovCiAJUXVldWVCYWNrZW5kU3Rh dHVzIGJhY2tlbmRbRkxFWElCTEVfQVJSQVlfTUVNQkVSXTsKIH0gQXN5bmNRdWV1ZUNvbnRy b2w7CiAKIHN0YXRpYyBBc3luY1F1ZXVlQ29udHJvbCAqYXN5bmNRdWV1ZUNvbnRyb2w7CiAK Ky8qIExvY2tzIGZvciBwYXJ0aXRpb25lZCBjaGFubmVsIGhhc2ggdGFibGUgKi8KK3N0YXRp YyBMV0xvY2sgKmNoYW5uZWxIYXNoTG9ja3M7CisKKy8qIENoYW5uZWwgaGFzaCB0YWJsZSBm b3IgbXVsdGljYXN0IHNpZ25hbGxpbmcgKi8KK3N0YXRpYyBIVEFCICpjaGFubmVsSGFzaCA9 IE5VTEw7CisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb24gbmVlZGVkIGJ5IEdldENoYW5uZWxI YXNoICovCitzdGF0aWMgdWludDMyIGNoYW5uZWxfaGFzaF9mdW5jKGNvbnN0IHZvaWQgKmtl eSwgU2l6ZSBrZXlzaXplKTsKKworLyoKKyAqIEdldENoYW5uZWxIYXNoCisgKgkJR2V0IHRo ZSBjaGFubmVsIGhhc2ggdGFibGUsIGluaXRpYWxpemluZyBvdXIgYmFja2VuZCdzIHBvaW50 ZXIgaWYgbmVlZGVkLgorICoKKyAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBh Y2Nlc3MgdG8gdGhlIGNoYW5uZWwgaGFzaCB0YWJsZS4KKyAqIFRoZSBoYXNoIHRhYmxlIGl0 c2VsZiBpcyBjcmVhdGVkIGluIHNoYXJlZCBtZW1vcnkgZHVyaW5nIEFzeW5jU2htZW1Jbml0 LAorICogYnV0IGVhY2ggYmFja2VuZCBuZWVkcyB0byBnZXQgaXRzIG93biBwb2ludGVyIHRv IGl0LgorICovCitzdGF0aWMgSFRBQiAqCitHZXRDaGFubmVsSGFzaCh2b2lkKQoreworCWlm IChjaGFubmVsSGFzaCA9PSBOVUxMKQorCXsKKwkJSEFTSENUTAkJaGFzaF9jdGw7CisJCVNp emUJCWVudHJ5c2l6ZTsKKworCQkvKgorCQkgKiBTZXQgdXAgdG8gYXR0YWNoIHRvIHRoZSBl eGlzdGluZyBzaGFyZWQgaGFzaCB0YWJsZS4gVGhlIGhhc2gKKwkJICogY29udHJvbCBwYXJh bWV0ZXJzIG11c3QgbWF0Y2ggdGhvc2UgdXNlZCBpbiBBc3luY1NobWVtSW5pdC4KKwkJICov CisJCU1lbVNldCgmaGFzaF9jdGwsIDAsIHNpemVvZihoYXNoX2N0bCkpOworCQloYXNoX2N0 bC5rZXlzaXplID0gc2l6ZW9mKENoYW5uZWxIYXNoS2V5KTsKKworCQkvKgorCQkgKiBUaGUg c2l6ZSBvZiBhIGNoYW5uZWwgZW50cnkgaXMgZmxleGlibGUuIFdlIG11c3QgaGF2ZSBlbm91 Z2ggc3BhY2UKKwkJICogZm9yIHRoZSBtYXhpbXVtIG51bWJlciBvZiBsaXN0ZW5lcnMgc3Bl Y2lmaWVkIGJ5IHRoZSB0aHJlc2hvbGQuCisJCSAqLworCQllbnRyeXNpemUgPSBhZGRfc2l6 ZShvZmZzZXRvZihDaGFubmVsRW50cnksIGxpc3RlbmVycyksCisJCQkJCQkJIG11bF9zaXpl KE5PVElGWV9NVUxUSUNBU1RfVEhSRVNIT0xELCBzaXplb2YoUHJvY051bWJlcikpKTsKKwkJ aGFzaF9jdGwuZW50cnlzaXplID0gZW50cnlzaXplOworCisJCWhhc2hfY3RsLmhhc2ggPSBj aGFubmVsX2hhc2hfZnVuYzsKKwkJaGFzaF9jdGwubnVtX3BhcnRpdGlvbnMgPSBOVU1fTk9U SUZZX1BBUlRJVElPTlM7CisKKwkJY2hhbm5lbEhhc2ggPSBTaG1lbUluaXRIYXNoKCJDaGFu bmVsIEhhc2giLAorCQkJCQkJCQkJQ0hBTk5FTF9IQVNIX0lOSVRfU0laRSwKKwkJCQkJCQkJ CUNIQU5ORUxfSEFTSF9NQVhfU0laRSwKKwkJCQkJCQkJCSZoYXNoX2N0bCwKKwkJCQkJCQkJ CUhBU0hfRUxFTSB8IEhBU0hfRlVOQ1RJT04gfCBIQVNIX1BBUlRJVElPTik7CisJfQorCisJ cmV0dXJuIGNoYW5uZWxIYXNoOworfQorCiAjZGVmaW5lIFFVRVVFX0hFQUQJCQkJCShhc3lu Y1F1ZXVlQ29udHJvbC0+aGVhZCkKICNkZWZpbmUgUVVFVUVfVEFJTAkJCQkJKGFzeW5jUXVl dWVDb250cm9sLT50YWlsKQogI2RlZmluZSBRVUVVRV9TVE9QX1BBR0UJCQkJKGFzeW5jUXVl dWVDb250cm9sLT5zdG9wUGFnZSkKQEAgLTMwMSw2ICs0NDksNyBAQCBzdGF0aWMgQXN5bmNR dWV1ZUNvbnRyb2wgKmFzeW5jUXVldWVDb250cm9sOwogI2RlZmluZSBRVUVVRV9CQUNLRU5E X0RCT0lEKGkpCQkoYXN5bmNRdWV1ZUNvbnRyb2wtPmJhY2tlbmRbaV0uZGJvaWQpCiAjZGVm aW5lIFFVRVVFX05FWFRfTElTVEVORVIoaSkJCShhc3luY1F1ZXVlQ29udHJvbC0+YmFja2Vu ZFtpXS5uZXh0TGlzdGVuZXIpCiAjZGVmaW5lIFFVRVVFX0JBQ0tFTkRfUE9TKGkpCQkoYXN5 bmNRdWV1ZUNvbnRyb2wtPmJhY2tlbmRbaV0ucG9zKQorI2RlZmluZSBRVUVVRV9CQUNLRU5E X1dBS0VVUF9QRU5ESU5HKGkpCShhc3luY1F1ZXVlQ29udHJvbC0+YmFja2VuZFtpXS53YWtl dXBfcGVuZGluZykKIAogLyoKICAqIFRoZSBTTFJVIGJ1ZmZlciBhcmVhIHRocm91Z2ggd2hp Y2ggd2UgYWNjZXNzIHRoZSBub3RpZmljYXRpb24gcXVldWUKQEAgLTQ1OCw2ICs2MDcsMTQg QEAgc3RhdGljIHVpbnQzMiBub3RpZmljYXRpb25faGFzaChjb25zdCB2b2lkICprZXksIFNp emUga2V5c2l6ZSk7CiBzdGF0aWMgaW50CW5vdGlmaWNhdGlvbl9tYXRjaChjb25zdCB2b2lk ICprZXkxLCBjb25zdCB2b2lkICprZXkyLCBTaXplIGtleXNpemUpOwogc3RhdGljIHZvaWQg Q2xlYXJQZW5kaW5nQWN0aW9uc0FuZE5vdGlmaWVzKHZvaWQpOwogCisvKiBDaGFubmVsIGhh c2ggdGFibGUgbWFuYWdlbWVudCBmdW5jdGlvbnMgKi8KK3N0YXRpYyBMV0xvY2sgKkdldENo YW5uZWxIYXNoTG9jayhjb25zdCBjaGFyICpjaGFubmVsKTsKK3N0YXRpYyBpbmxpbmUgdm9p ZCBDaGFubmVsSGFzaFByZXBhcmVLZXkoQ2hhbm5lbEhhc2hLZXkgKiBrZXksIE9pZCBkYm9p ZCwgY29uc3QgY2hhciAqY2hhbm5lbCk7CitzdGF0aWMgdm9pZCBDaGFubmVsSGFzaEFkZExp c3RlbmVyKGNvbnN0IGNoYXIgKmNoYW5uZWwsIFByb2NOdW1iZXIgcHJvY25vKTsKK3N0YXRp YyB2b2lkIENoYW5uZWxIYXNoUmVtb3ZlTGlzdGVuZXIoY29uc3QgY2hhciAqY2hhbm5lbCwg UHJvY051bWJlciBwcm9jbm8pOworc3RhdGljIENoYW5uZWxFbnRyeSAqIENoYW5uZWxIYXNo TG9va3VwKGNvbnN0IGNoYXIgKmNoYW5uZWwpOworc3RhdGljIExpc3QgKkdldFBlbmRpbmdO b3RpZnlDaGFubmVscyh2b2lkKTsKKwogLyoKICAqIENvbXB1dGUgdGhlIGRpZmZlcmVuY2Ug YmV0d2VlbiB0d28gcXVldWUgcGFnZSBudW1iZXJzLgogICogUHJldmlvdXNseSB0aGlzIGZ1 bmN0aW9uIGFjY291bnRlZCBmb3IgYSB3cmFwYXJvdW5kLgpAQCAtNDg1LDYgKzY0Miw3IEBA IFNpemUKIEFzeW5jU2htZW1TaXplKHZvaWQpCiB7CiAJU2l6ZQkJc2l6ZTsKKwlTaXplCQll bnRyeXNpemU7CiAKIAkvKiBUaGlzIGhhZCBiZXR0ZXIgbWF0Y2ggQXN5bmNTaG1lbUluaXQg Ki8KIAlzaXplID0gbXVsX3NpemUoTWF4QmFja2VuZHMsIHNpemVvZihRdWV1ZUJhY2tlbmRT dGF0dXMpKTsKQEAgLTQ5Miw2ICs2NTAsMTggQEAgQXN5bmNTaG1lbVNpemUodm9pZCkKIAog CXNpemUgPSBhZGRfc2l6ZShzaXplLCBTaW1wbGVMcnVTaG1lbVNpemUobm90aWZ5X2J1ZmZl cnMsIDApKTsKIAorCS8qCisJICogVGhlIHNpemUgb2YgYSBjaGFubmVsIGVudHJ5IGlzIGZs ZXhpYmxlLiBXZSBtdXN0IGFsbG9jYXRlIGVub3VnaCBzcGFjZQorCSAqIGZvciB0aGUgbWF4 aW11bSBudW1iZXIgb2YgbGlzdGVuZXJzIHNwZWNpZmllZCBieSB0aGUgdGhyZXNob2xkLgor CSAqLworCWVudHJ5c2l6ZSA9IGFkZF9zaXplKG9mZnNldG9mKENoYW5uZWxFbnRyeSwgbGlz dGVuZXJzKSwKKwkJCQkJCSBtdWxfc2l6ZShOT1RJRllfTVVMVElDQVNUX1RIUkVTSE9MRCwg c2l6ZW9mKFByb2NOdW1iZXIpKSk7CisJc2l6ZSA9IGFkZF9zaXplKHNpemUsIGhhc2hfZXN0 aW1hdGVfc2l6ZShDSEFOTkVMX0hBU0hfTUFYX1NJWkUsCisJCQkJCQkJCQkJCSBlbnRyeXNp emUpKTsKKworCS8qIFNwYWNlIGZvciBjaGFubmVsIGhhc2ggcGFydGl0aW9uIGxvY2tzICov CisJc2l6ZSA9IGFkZF9zaXplKHNpemUsIG11bF9zaXplKE5VTV9OT1RJRllfUEFSVElUSU9O Uywgc2l6ZW9mKExXTG9jaykpKTsKKwogCXJldHVybiBzaXplOwogfQogCkBAIC01MjEsMTIg KzY5MSwxNSBAQCBBc3luY1NobWVtSW5pdCh2b2lkKQogCQlRVUVVRV9TVE9QX1BBR0UgPSAw OwogCQlRVUVVRV9GSVJTVF9MSVNURU5FUiA9IElOVkFMSURfUFJPQ19OVU1CRVI7CiAJCWFz eW5jUXVldWVDb250cm9sLT5sYXN0UXVldWVGaWxsV2FybiA9IDA7CisJCWFzeW5jUXVldWVD b250cm9sLT5kZWZlcnJlZFdha2V1cFdvcmtlckFjdGl2ZSA9IGZhbHNlOworCQlhc3luY1F1 ZXVlQ29udHJvbC0+ZGVmZXJyZWRXYWtldXBXb3JrZXJQaWQgPSAwOwogCQlmb3IgKGludCBp ID0gMDsgaSA8IE1heEJhY2tlbmRzOyBpKyspCiAJCXsKIAkJCVFVRVVFX0JBQ0tFTkRfUElE KGkpID0gSW52YWxpZFBpZDsKIAkJCVFVRVVFX0JBQ0tFTkRfREJPSUQoaSkgPSBJbnZhbGlk T2lkOwogCQkJUVVFVUVfTkVYVF9MSVNURU5FUihpKSA9IElOVkFMSURfUFJPQ19OVU1CRVI7 CiAJCQlTRVRfUVVFVUVfUE9TKFFVRVVFX0JBQ0tFTkRfUE9TKGkpLCAwLCAwKTsKKwkJCVFV RVVFX0JBQ0tFTkRfV0FLRVVQX1BFTkRJTkcoaSkgPSBmYWxzZTsKIAkJfQogCX0KIApAQCAt NTQ2LDYgKzcxOSw0OCBAQCBBc3luY1NobWVtSW5pdCh2b2lkKQogCQkgKi8KIAkJKHZvaWQp IFNscnVTY2FuRGlyZWN0b3J5KE5vdGlmeUN0bCwgU2xydVNjYW5EaXJDYkRlbGV0ZUFsbCwg TlVMTCk7CiAJfQorCisJLyoKKwkgKiBDcmVhdGUgb3IgYXR0YWNoIHRvIHRoZSBjaGFubmVs IGhhc2ggdGFibGUuCisJICovCisJeworCQlIQVNIQ1RMCQloYXNoX2N0bDsKKwkJU2l6ZQkJ ZW50cnlzaXplOworCisJCU1lbVNldCgmaGFzaF9jdGwsIDAsIHNpemVvZihoYXNoX2N0bCkp OworCQloYXNoX2N0bC5rZXlzaXplID0gc2l6ZW9mKENoYW5uZWxIYXNoS2V5KTsKKworCQkv KgorCQkgKiBUaGUgc2l6ZSBvZiBhIGNoYW5uZWwgZW50cnkgaXMgZmxleGlibGUuIFdlIG11 c3QgaGF2ZSBlbm91Z2ggc3BhY2UKKwkJICogZm9yIHRoZSBtYXhpbXVtIG51bWJlciBvZiBs aXN0ZW5lcnMgc3BlY2lmaWVkIGJ5IHRoZSB0aHJlc2hvbGQuCisJCSAqLworCQllbnRyeXNp emUgPSBhZGRfc2l6ZShvZmZzZXRvZihDaGFubmVsRW50cnksIGxpc3RlbmVycyksCisJCQkJ CQkJIG11bF9zaXplKE5PVElGWV9NVUxUSUNBU1RfVEhSRVNIT0xELCBzaXplb2YoUHJvY051 bWJlcikpKTsKKwkJaGFzaF9jdGwuZW50cnlzaXplID0gZW50cnlzaXplOworCisJCWhhc2hf Y3RsLmhhc2ggPSBjaGFubmVsX2hhc2hfZnVuYzsKKwkJaGFzaF9jdGwubnVtX3BhcnRpdGlv bnMgPSBOVU1fTk9USUZZX1BBUlRJVElPTlM7CisKKwkJY2hhbm5lbEhhc2ggPSBTaG1lbUlu aXRIYXNoKCJDaGFubmVsIEhhc2giLAorCQkJCQkJCQkJQ0hBTk5FTF9IQVNIX0lOSVRfU0la RSwKKwkJCQkJCQkJCUNIQU5ORUxfSEFTSF9NQVhfU0laRSwKKwkJCQkJCQkJCSZoYXNoX2N0 bCwKKwkJCQkJCQkJCUhBU0hfRUxFTSB8IEhBU0hfRlVOQ1RJT04gfCBIQVNIX1BBUlRJVElP Tik7CisJfQorCisJLyogSW5pdGlhbGl6ZSBsb2NrcyBmb3IgdGhlIHBhcnRpdGlvbmVkIGhh c2ggdGFibGUgKi8KKwlzaXplID0gbXVsX3NpemUoTlVNX05PVElGWV9QQVJUSVRJT05TLCBz aXplb2YoTFdMb2NrKSk7CisJY2hhbm5lbEhhc2hMb2NrcyA9IChMV0xvY2sgKikKKwkJU2ht ZW1Jbml0U3RydWN0KCJDaGFubmVsIEhhc2ggTG9ja3MiLCBzaXplLCAmZm91bmQpOworCWlm ICghZm91bmQpCisJeworCQkvKiBGaXJzdCB0aW1lIHRocm91Z2g6IGluaXRpYWxpemUgdGhl IGxvY2tzICovCisJCWZvciAoaW50IGkgPSAwOyBpIDwgTlVNX05PVElGWV9QQVJUSVRJT05T OyBpKyspCisJCXsKKwkJCUxXTG9ja0luaXRpYWxpemUoJmNoYW5uZWxIYXNoTG9ja3NbaV0s CisJCQkJCQkJIExXVFJBTkNIRV9OT1RJRllfQ0hBTk5FTF9IQVNIKTsKKwkJfQorCX0KIH0K IAogCkBAIC0xMTUyLDYgKzEzNjcsOCBAQCBFeGVjX0xpc3RlbkNvbW1pdChjb25zdCBjaGFy ICpjaGFubmVsKQogCW9sZGNvbnRleHQgPSBNZW1vcnlDb250ZXh0U3dpdGNoVG8oVG9wTWVt b3J5Q29udGV4dCk7CiAJbGlzdGVuQ2hhbm5lbHMgPSBsYXBwZW5kKGxpc3RlbkNoYW5uZWxz LCBwc3RyZHVwKGNoYW5uZWwpKTsKIAlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkY29udGV4 dCk7CisKKwlDaGFubmVsSGFzaEFkZExpc3RlbmVyKGNoYW5uZWwsIE15UHJvY051bWJlcik7 CiB9CiAKIC8qCkBAIC0xMTc1LDYgKzEzOTIsNyBAQCBFeGVjX1VubGlzdGVuQ29tbWl0KGNv bnN0IGNoYXIgKmNoYW5uZWwpCiAJCXsKIAkJCWxpc3RlbkNoYW5uZWxzID0gZm9yZWFjaF9k ZWxldGVfY3VycmVudChsaXN0ZW5DaGFubmVscywgcSk7CiAJCQlwZnJlZShsY2hhbik7CisJ CQlDaGFubmVsSGFzaFJlbW92ZUxpc3RlbmVyKGNoYW5uZWwsIE15UHJvY051bWJlcik7CiAJ CQlicmVhazsKIAkJfQogCX0KQEAgLTExOTMsOSArMTQxMSwyMiBAQCBFeGVjX1VubGlzdGVu Q29tbWl0KGNvbnN0IGNoYXIgKmNoYW5uZWwpCiBzdGF0aWMgdm9pZAogRXhlY19Vbmxpc3Rl bkFsbENvbW1pdCh2b2lkKQogeworCUxpc3RDZWxsICAgKnA7CisKIAlpZiAoVHJhY2Vfbm90 aWZ5KQogCQllbG9nKERFQlVHMSwgIkV4ZWNfVW5saXN0ZW5BbGxDb21taXQoJWQpIiwgTXlQ cm9jUGlkKTsKIAorCS8qCisJICogQmVmb3JlIGZyZWVpbmcgdGhlIGxvY2FsIGxpc3QsIGl0 ZXJhdGUgdGhyb3VnaCBpdCBhbmQgcGVyZm9ybSBhCisJICogdGFyZ2V0ZWQgcmVtb3ZhbCBm b3IgZWFjaCBvZiBvdXIgY2hhbm5lbHMgZnJvbSB0aGUgc2hhcmVkIGhhc2ggdGFibGUuCisJ ICovCisJZm9yZWFjaChwLCBsaXN0ZW5DaGFubmVscykKKwl7CisJCWNoYXIJICAgKmNoYW5u ZWwgPSAoY2hhciAqKSBsZmlyc3QocCk7CisKKwkJQ2hhbm5lbEhhc2hSZW1vdmVMaXN0ZW5l cihjaGFubmVsLCBNeVByb2NOdW1iZXIpOworCX0KKwogCWxpc3RfZnJlZV9kZWVwKGxpc3Rl bkNoYW5uZWxzKTsKIAlsaXN0ZW5DaGFubmVscyA9IE5JTDsKIH0KQEAgLTE1NjUsMTIgKzE3 OTYsMTIgQEAgYXN5bmNRdWV1ZUZpbGxXYXJuaW5nKHZvaWQpCiAvKgogICogU2VuZCBzaWdu YWxzIHRvIGxpc3RlbmluZyBiYWNrZW5kcy4KICAqCi0gKiBOb3JtYWxseSB3ZSBzaWduYWwg b25seSBiYWNrZW5kcyBpbiBvdXIgb3duIGRhdGFiYXNlLCBzaW5jZSBvbmx5IHRob3NlCi0g KiBiYWNrZW5kcyBjb3VsZCBiZSBpbnRlcmVzdGVkIGluIG5vdGlmaWVzIHdlIHNlbmQuICBI b3dldmVyLCBpZiB0aGVyZSdzCi0gKiBub3RpZnkgdHJhZmZpYyBpbiBvdXIgZGF0YWJhc2Ug YnV0IG5vIHRyYWZmaWMgaW4gYW5vdGhlciBkYXRhYmFzZSB0aGF0Ci0gKiBkb2VzIGhhdmUg bGlzdGVuZXIocyksIHRob3NlIGxpc3RlbmVycyB3aWxsIGZhbGwgZnVydGhlciBhbmQgZnVy dGhlcgotICogYmVoaW5kLiAgV2FrZW4gdGhlbSBhbnl3YXkgaWYgdGhleSdyZSBmYXIgZW5v dWdoIGJlaGluZCwgc28gdGhhdCB0aGV5J2xsCi0gKiBhZHZhbmNlIHRoZWlyIHF1ZXVlIHBv c2l0aW9uIHBvaW50ZXJzLCBhbGxvd2luZyB0aGUgZ2xvYmFsIHRhaWwgdG8gYWR2YW5jZS4K KyAqIFRoaXMgZnVuY3Rpb24gb3BlcmF0ZXMgaW4gdHdvIG1vZGVzOgorICogMS4gTXVsdGlj YXN0IG1vZGU6IElmIGFsbCBwZW5kaW5nIG5vdGlmaWNhdGlvbiBjaGFubmVscyBoYXZlIGxp c3RlbmVycyBhdCBvcgorICogICAgYmVsb3cgTk9USUZZX01VTFRJQ0FTVF9USFJFU0hPTEQs IHdlIHNpZ25hbCBvbmx5IHRob3NlIHNwZWNpZmljIGJhY2tlbmRzLgorICogMi4gQnJvYWRj YXN0IG1vZGU6IElmIGFueSBjaGFubmVsJ3MgbGlzdGVuZXIgY291bnQgZXhjZWVkcyB0aGUg dGhyZXNob2xkIE9SCisgKiAgICB0aGUgaGFzaCB0YWJsZSBsYWNrcyBtZW1vcnkgZm9yIG5l dyBlbnRyaWVzLCB3ZSBzaWduYWwgYWxsIGxpc3RlbmluZworICogICAgYmFja2VuZHMgaW4g b3VyIGRhdGFiYXNlLgogICoKICAqIFNpbmNlIHdlIGtub3cgdGhlIFByb2NOdW1iZXIgYW5k IHRoZSBQaWQgdGhlIHNpZ25hbGluZyBpcyBxdWl0ZSBjaGVhcC4KICAqCkBAIC0xNTgzLDYg KzE4MTQsMTIgQEAgU2lnbmFsQmFja2VuZHModm9pZCkKIAlpbnQzMgkgICAqcGlkczsKIAlQ cm9jTnVtYmVyICpwcm9jbm9zOwogCWludAkJCWNvdW50OworCUxpc3QJICAgKmNoYW5uZWxz OworCUxpc3RDZWxsICAgKnA7CisJYm9vbAkgICAqc2lnbmFsZWQ7CisJYm9vbAkJYnJvYWRj YXN0X21vZGUgPSBmYWxzZTsKKwlib29sCQl0cmlnZ2VyX2RlZmVycmVkX3dha2V1cCA9IGZh bHNlOworCXBpZF90CQlkZWZlcnJlZF93YWtldXBfcGlkID0gMDsKIAogCS8qCiAJICogSWRl bnRpZnkgYmFja2VuZHMgdGhhdCB3ZSBuZWVkIHRvIHNpZ25hbC4gIFdlIGRvbid0IHdhbnQg dG8gc2VuZApAQCAtMTU5NCw0MCArMTgzMSwxNDkgQEAgU2lnbmFsQmFja2VuZHModm9pZCkK IAkgKi8KIAlwaWRzID0gKGludDMyICopIHBhbGxvYyhNYXhCYWNrZW5kcyAqIHNpemVvZihp bnQzMikpOwogCXByb2Nub3MgPSAoUHJvY051bWJlciAqKSBwYWxsb2MoTWF4QmFja2VuZHMg KiBzaXplb2YoUHJvY051bWJlcikpOworCXNpZ25hbGVkID0gKGJvb2wgKikgcGFsbG9jMChN YXhCYWNrZW5kcyAqIHNpemVvZihib29sKSk7CiAJY291bnQgPSAwOwogCisJLyogR2V0IGxp c3Qgb2YgY2hhbm5lbHMgdGhhdCBoYXZlIHBlbmRpbmcgbm90aWZpY2F0aW9ucyAqLworCWNo YW5uZWxzID0gR2V0UGVuZGluZ05vdGlmeUNoYW5uZWxzKCk7CisKKwkvKgorCSAqIFRvIHBy ZXZlbnQgZGVhZGxvY2tzLCB3ZSBtdXN0IGFsd2F5cyBhY3F1aXJlIGxvY2tzIGluIHRoZSBz YW1lIG9yZGVyOgorCSAqIGdsb2JhbCBOb3RpZnlRdWV1ZUxvY2sgZmlyc3QsIHRoZW4gaW5k aXZpZHVhbCBwYXJ0aXRpb24gbG9ja3MuCisJICovCiAJTFdMb2NrQWNxdWlyZShOb3RpZnlR dWV1ZUxvY2ssIExXX0VYQ0xVU0lWRSk7Ci0JZm9yIChQcm9jTnVtYmVyIGkgPSBRVUVVRV9G SVJTVF9MSVNURU5FUjsgaSAhPSBJTlZBTElEX1BST0NfTlVNQkVSOyBpID0gUVVFVUVfTkVY VF9MSVNURU5FUihpKSkKKworCS8qCisJICogRGV0ZXJtaW5lIGlmIHdlIGNhbiB1c2UgdGFy Z2V0ZWQgc2lnbmFsaW5nIG9yIG11c3QgYnJvYWRjYXN0LiBUaGlzCisJICogY2hlY2sgbXVz dCBiZSBkb25lIHdoaWxlIGhvbGRpbmcgTm90aWZ5UXVldWVMb2NrIHRvIHByZXZlbnQgZGVh ZGxvY2tzCisJICogYWdhaW5zdCBvdGhlciBiYWNrZW5kcyB0aGF0IG1pZ2h0IGJlIG1vZGlm eWluZyB0aGUgbGlzdGVuZXIgbGlzdCBhbmQKKwkgKiBoYXNoIHRhYmxlIHNpbXVsdGFuZW91 c2x5IChlLmcuLCBhc3luY1F1ZXVlVW5yZWdpc3RlcikuCisJICovCisJZm9yZWFjaChwLCBj aGFubmVscykKIAl7Ci0JCWludDMyCQlwaWQgPSBRVUVVRV9CQUNLRU5EX1BJRChpKTsKLQkJ UXVldWVQb3NpdGlvbiBwb3M7CisJCWNoYXIJICAgKmNoYW5uZWwgPSAoY2hhciAqKSBsZmly c3QocCk7CisJCUNoYW5uZWxFbnRyeSAqZW50cnk7CisJCUxXTG9jawkgICAqbG9jayA9IEdl dENoYW5uZWxIYXNoTG9jayhjaGFubmVsKTsKKworCQlMV0xvY2tBY3F1aXJlKGxvY2ssIExX X1NIQVJFRCk7CisJCWVudHJ5ID0gQ2hhbm5lbEhhc2hMb29rdXAoY2hhbm5lbCk7CiAKLQkJ QXNzZXJ0KHBpZCAhPSBJbnZhbGlkUGlkKTsKLQkJcG9zID0gUVVFVUVfQkFDS0VORF9QT1Mo aSk7Ci0JCWlmIChRVUVVRV9CQUNLRU5EX0RCT0lEKGkpID09IE15RGF0YWJhc2VJZCkKKwkJ LyoKKwkJICogSWYgdGhlcmUgaXMgbm8gZW50cnksIGl0IGNvdWxkIG1lYW4gd2UgcmFuIG91 dCBvZiBzaGFyZWQgbWVtb3J5CisJCSAqIHdoZW4gdHJ5aW5nIHRvIGFkZCB0aGlzIGNoYW5u ZWwgdG8gdGhlIGhhc2ggdGFibGUuIElmIHRoZSBlbnRyeSBpcworCQkgKiBtYXJrZWQgZm9y IGJyb2FkY2FzdCwgd2UgbXVzdCB1c2UgYnJvYWRjYXN0IG1vZGUuCisJCSAqLworCQlpZiAo IWVudHJ5IHx8IGVudHJ5LT5pc19icm9hZGNhc3QpCisJCXsKKwkJCWJyb2FkY2FzdF9tb2Rl ID0gdHJ1ZTsKKwkJCUxXTG9ja1JlbGVhc2UobG9jayk7CisJCQlicmVhazsKKwkJfQorCQlM V0xvY2tSZWxlYXNlKGxvY2spOworCX0KKworCWlmIChicm9hZGNhc3RfbW9kZSkKKwl7CisJ CS8qCisJCSAqIEluIGJyb2FkY2FzdCBtb2RlLCB3ZSBpdGVyYXRlIG92ZXIgYWxsIGxpc3Rl bmluZyBiYWNrZW5kcyBhbmQKKwkJICogc2lnbmFsIHRoZSBvbmVzIGluIG91ciBkYXRhYmFz ZSB0aGF0IGFyZSBub3QgYWxyZWFkeSBjYXVnaHQgdXAuCisJCSAqLworCQlmb3IgKFByb2NO dW1iZXIgaSA9IFFVRVVFX0ZJUlNUX0xJU1RFTkVSOyBpICE9IElOVkFMSURfUFJPQ19OVU1C RVI7IGkgPSBRVUVVRV9ORVhUX0xJU1RFTkVSKGkpKQogCQl7CisJCQlpbnQzMgkJcGlkOwor CQkJUXVldWVQb3NpdGlvbiBwb3M7CisKKwkJCWlmIChRVUVVRV9CQUNLRU5EX0RCT0lEKGkp ICE9IE15RGF0YWJhc2VJZCkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKFFVRVVFX0JBQ0tF TkRfV0FLRVVQX1BFTkRJTkcoaSkpCisJCQkJY29udGludWU7CisKKwkJCXBvcyA9IFFVRVVF X0JBQ0tFTkRfUE9TKGkpOworCiAJCQkvKgogCQkJICogQWx3YXlzIHNpZ25hbCBsaXN0ZW5l cnMgaW4gb3VyIG93biBkYXRhYmFzZSwgdW5sZXNzIHRoZXkncmUKLQkJCSAqIGFscmVhZHkg Y2F1Z2h0IHVwICh1bmxpa2VseSwgYnV0IHBvc3NpYmxlKS4KKwkJCSAqIGFscmVhZHkgY2F1 Z2h0IHVwLgogCQkJICovCiAJCQlpZiAoUVVFVUVfUE9TX0VRVUFMKHBvcywgUVVFVUVfSEVB RCkpCiAJCQkJY29udGludWU7CisKKwkJCXBpZCA9IFFVRVVFX0JBQ0tFTkRfUElEKGkpOwor CQkJQXNzZXJ0KHBpZCAhPSBJbnZhbGlkUGlkKTsKKworCQkJLyogT0ssIG5lZWQgdG8gc2ln bmFsIHRoaXMgb25lICovCisJCQlRVUVVRV9CQUNLRU5EX1dBS0VVUF9QRU5ESU5HKGkpID0g dHJ1ZTsKKwkJCXBpZHNbY291bnRdID0gcGlkOworCQkJcHJvY25vc1tjb3VudF0gPSBpOwor CQkJc2lnbmFsZWRbaV0gPSB0cnVlOworCQkJY291bnQrKzsKIAkJfQotCQllbHNlCisJfQor CWVsc2UKKwl7CisJCS8qCisJCSAqIEluIG11bHRpY2FzdCBtb2RlLCBzaWduYWwgc3BlY2lm aWMgbGlzdGVuaW5nIGJhY2tlbmRzLiBXZSBtdXN0CisJCSAqIHJlLWNoZWNrIHRoZSBoYXNo IGVudHJpZXMgaGVyZSBpbnNpZGUgdGhlIGxvY2sgdG8gYXZvaWQgcmFjZXMuCisJCSAqLwor CQlmb3JlYWNoKHAsIGNoYW5uZWxzKQogCQl7Ci0JCQkvKgotCQkJICogTGlzdGVuZXJzIGlu IG90aGVyIGRhdGFiYXNlcyBzaG91bGQgYmUgc2lnbmFsZWQgb25seSBpZiB0aGV5Ci0JCQkg KiBhcmUgZmFyIGJlaGluZC4KLQkJCSAqLwotCQkJaWYgKGFzeW5jUXVldWVQYWdlRGlmZihR VUVVRV9QT1NfUEFHRShRVUVVRV9IRUFEKSwKLQkJCQkJCQkJICAgUVVFVUVfUE9TX1BBR0Uo cG9zKSkgPCBRVUVVRV9DTEVBTlVQX0RFTEFZKQotCQkJCWNvbnRpbnVlOworCQkJY2hhcgkg ICAqY2hhbm5lbCA9IChjaGFyICopIGxmaXJzdChwKTsKKwkJCUNoYW5uZWxFbnRyeSAqZW50 cnk7CisJCQlMV0xvY2sJICAgKmxvY2sgPSBHZXRDaGFubmVsSGFzaExvY2soY2hhbm5lbCk7 CisKKwkJCUxXTG9ja0FjcXVpcmUobG9jaywgTFdfU0hBUkVEKTsKKwkJCWVudHJ5ID0gQ2hh bm5lbEhhc2hMb29rdXAoY2hhbm5lbCk7CisKKwkJCWlmIChlbnRyeSAmJiAhZW50cnktPmlz X2Jyb2FkY2FzdCkKKwkJCXsKKwkJCQlmb3IgKGludCBqID0gMDsgaiA8IGVudHJ5LT5udW1f bGlzdGVuZXJzOyBqKyspCisJCQkJeworCQkJCQlQcm9jTnVtYmVyCWkgPSBlbnRyeS0+bGlz dGVuZXJzW2pdOworCQkJCQlpbnQzMgkJcGlkOworCQkJCQlRdWV1ZVBvc2l0aW9uIHBvczsK KworCQkJCQlpZiAoUVVFVUVfQkFDS0VORF9XQUtFVVBfUEVORElORyhpKSkKKwkJCQkJCWNv bnRpbnVlOworCisJCQkJCWlmIChzaWduYWxlZFtpXSkKKwkJCQkJCWNvbnRpbnVlOworCisJ CQkJCXBvcyA9IFFVRVVFX0JBQ0tFTkRfUE9TKGkpOworCisJCQkJCWlmIChRVUVVRV9QT1Nf RVFVQUwocG9zLCBRVUVVRV9IRUFEKSkKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCWlmIChR VUVVRV9CQUNLRU5EX0RCT0lEKGkpICE9IE15RGF0YWJhc2VJZCkKKwkJCQkJCWNvbnRpbnVl OworCisJCQkJCXBpZCA9IFFVRVVFX0JBQ0tFTkRfUElEKGkpOworCQkJCQlBc3NlcnQocGlk ICE9IEludmFsaWRQaWQpOworCisJCQkJCS8qIE9LLCBuZWVkIHRvIHNpZ25hbCB0aGlzIG9u ZSAqLworCQkJCQlRVUVVRV9CQUNLRU5EX1dBS0VVUF9QRU5ESU5HKGkpID0gdHJ1ZTsKKwkJ CQkJcGlkc1tjb3VudF0gPSBwaWQ7CisJCQkJCXByb2Nub3NbY291bnRdID0gaTsKKwkJCQkJ c2lnbmFsZWRbaV0gPSB0cnVlOworCQkJCQljb3VudCsrOworCQkJCX0KKwkJCX0KKwkJCUxX TG9ja1JlbGVhc2UobG9jayk7CiAJCX0KLQkJLyogT0ssIG5lZWQgdG8gc2lnbmFsIHRoaXMg b25lICovCi0JCXBpZHNbY291bnRdID0gcGlkOwotCQlwcm9jbm9zW2NvdW50XSA9IGk7Ci0J CWNvdW50Kys7CiAJfQorCisJLyoKKwkgKiBDaGVjayBpZiB3ZSBzaG91bGQgdHJpZ2dlciB0 aGUgZGVmZXJyZWQgd2FrZXVwIHdvcmtlciBhZnRlciB3ZSdyZSBkb25lCisJICogc2VuZGlu ZyBpbW1lZGlhdGUgc2lnbmFscy4gV2UgZG8gdGhpcyBjaGVjayB3aGlsZSBzdGlsbCBob2xk aW5nIHRoZQorCSAqIGxvY2sgdG8gYXZvaWQgbmVlZGluZyB0byByZWFjcXVpcmUgaXQgbGF0 ZXIuCisJICovCisJaWYgKCFhc3luY1F1ZXVlQ29udHJvbC0+ZGVmZXJyZWRXYWtldXBXb3Jr ZXJBY3RpdmUgJiYKKwkJYXN5bmNRdWV1ZUNvbnRyb2wtPmRlZmVycmVkV2FrZXVwV29ya2Vy UGlkICE9IDApCisJeworCQlhc3luY1F1ZXVlQ29udHJvbC0+ZGVmZXJyZWRXYWtldXBXb3Jr ZXJBY3RpdmUgPSB0cnVlOworCQl0cmlnZ2VyX2RlZmVycmVkX3dha2V1cCA9IHRydWU7CisJ CWRlZmVycmVkX3dha2V1cF9waWQgPSBhc3luY1F1ZXVlQ29udHJvbC0+ZGVmZXJyZWRXYWtl dXBXb3JrZXJQaWQ7CisJfQorCiAJTFdMb2NrUmVsZWFzZShOb3RpZnlRdWV1ZUxvY2spOwog CiAJLyogTm93IHNlbmQgc2lnbmFscyAqLwpAQCAtMTY0Nyw5ICsxOTkzLDkgQEAgU2lnbmFs QmFja2VuZHModm9pZCkKIAogCQkvKgogCQkgKiBOb3RlOiBhc3N1bWluZyB0aGluZ3MgYXJl bid0IGJyb2tlbiwgYSBzaWduYWwgZmFpbHVyZSBoZXJlIGNvdWxkCi0JCSAqIG9ubHkgb2Nj dXIgaWYgdGhlIHRhcmdldCBiYWNrZW5kIGV4aXRlZCBzaW5jZSB3ZSByZWxlYXNlZAotCQkg KiBOb3RpZnlRdWV1ZUxvY2s7IHdoaWNoIGlzIHVubGlrZWx5IGJ1dCBjZXJ0YWlubHkgcG9z c2libGUuIFNvIHdlCi0JCSAqIGp1c3QgbG9nIGEgbG93LWxldmVsIGRlYnVnIG1lc3NhZ2Ug aWYgaXQgaGFwcGVucy4KKwkJICogb25seSBvY2N1ciBpZiB0aGUgdGFyZ2V0IGJhY2tlbmQg ZXhpdGVkIHNpbmNlIHdlIHJlbGVhc2VkIHRoZSBsb2NrOworCQkgKiB3aGljaCBpcyB1bmxp a2VseSBidXQgY2VydGFpbmx5IHBvc3NpYmxlLiBTbyB3ZSBqdXN0IGxvZyBhCisJCSAqIGxv dy1sZXZlbCBkZWJ1ZyBtZXNzYWdlIGlmIGl0IGhhcHBlbnMuCiAJCSAqLwogCQlpZiAoU2Vu ZFByb2NTaWduYWwocGlkLCBQUk9DU0lHX05PVElGWV9JTlRFUlJVUFQsIHByb2Nub3NbaV0p IDwgMCkKIAkJCWVsb2coREVCVUczLCAiY291bGQgbm90IHNpZ25hbCBiYWNrZW5kIHdpdGgg UElEICVkOiAlbSIsIHBpZCk7CkBAIC0xNjU3LDYgKzIwMDMsMjUgQEAgU2lnbmFsQmFja2Vu ZHModm9pZCkKIAogCXBmcmVlKHBpZHMpOwogCXBmcmVlKHByb2Nub3MpOworCXBmcmVlKHNp Z25hbGVkKTsKKworCS8qCisJICogVHJpZ2dlciB0aGUgZGVmZXJyZWQgd2FrZXVwIHdvcmtl ciBpZiBuZWVkZWQuIFRoZSB3b3JrZXIgd2lsbCBjaGVjayBmb3IKKwkgKiBsYWdnaW5nIGJh Y2tlbmRzIGFuZCB3YWtlIHRoZW0gdXAgd2l0aCBzdGFnZ2VyZWQgZGVsYXlzLgorCSAqLwor CWlmICh0cmlnZ2VyX2RlZmVycmVkX3dha2V1cCkKKwl7CisJCWlmIChraWxsKGRlZmVycmVk X3dha2V1cF9waWQsIFNJR1VTUjEpIDwgMCkKKwkJeworCQkJLyogV29ya2VyIG1pZ2h0IGhh dmUgZGllZCwgY2xlYXIgdGhlIGZsYWdzICovCisJCQllbG9nKFdBUk5JTkcsICJjb3VsZCBu b3Qgc2lnbmFsIGRlZmVycmVkIHdha2V1cCB3b3JrZXI6ICVtIik7CisKKwkJCUxXTG9ja0Fj cXVpcmUoTm90aWZ5UXVldWVMb2NrLCBMV19FWENMVVNJVkUpOworCQkJYXN5bmNRdWV1ZUNv bnRyb2wtPmRlZmVycmVkV2FrZXVwV29ya2VyQWN0aXZlID0gZmFsc2U7CisJCQlhc3luY1F1 ZXVlQ29udHJvbC0+ZGVmZXJyZWRXYWtldXBXb3JrZXJQaWQgPSAwOworCQkJTFdMb2NrUmVs ZWFzZShOb3RpZnlRdWV1ZUxvY2spOworCQl9CisJfQogfQogCiAvKgpAQCAtMTg2NSw2ICsy MjMwLDcgQEAgYXN5bmNRdWV1ZVJlYWRBbGxOb3RpZmljYXRpb25zKHZvaWQpCiAJTFdMb2Nr QWNxdWlyZShOb3RpZnlRdWV1ZUxvY2ssIExXX1NIQVJFRCk7CiAJLyogQXNzZXJ0IGNoZWNr cyB0aGF0IHdlIGhhdmUgYSB2YWxpZCBzdGF0ZSBlbnRyeSAqLwogCUFzc2VydChNeVByb2NQ aWQgPT0gUVVFVUVfQkFDS0VORF9QSUQoTXlQcm9jTnVtYmVyKSk7CisJUVVFVUVfQkFDS0VO RF9XQUtFVVBfUEVORElORyhNeVByb2NOdW1iZXIpID0gZmFsc2U7CiAJcG9zID0gUVVFVUVf QkFDS0VORF9QT1MoTXlQcm9jTnVtYmVyKTsKIAloZWFkID0gUVVFVUVfSEVBRDsKIAlMV0xv Y2tSZWxlYXNlKE5vdGlmeVF1ZXVlTG9jayk7CkBAIC0yMzk1LDMgKzI3NjEsNDQxIEBAIGNo ZWNrX25vdGlmeV9idWZmZXJzKGludCAqbmV3dmFsLCB2b2lkICoqZXh0cmEsIEd1Y1NvdXJj ZSBzb3VyY2UpCiB7CiAJcmV0dXJuIGNoZWNrX3NscnVfYnVmZmVycygibm90aWZ5X2J1ZmZl cnMiLCBuZXd2YWwpOwogfQorCisKKy8qCisgKiBDaGFubmVsIGhhc2ggdGFibGUgbWFuYWdl bWVudCBmdW5jdGlvbnMKKyAqLworCisvKgorICogY2hhbm5lbF9oYXNoX2Z1bmMKKyAqICAg ICBDdXN0b20gaGFzaCBmdW5jdGlvbiBmb3IgdGhlIGNoYW5uZWwgaGFzaCB0YWJsZS4gVGhp cyBmdW5jdGlvbiBlbnN1cmVzCisgKiAgICAgdGhhdCB0aGUgbG93LW9yZGVyIGJpdHMgb2Yg dGhlIGhhc2ggYXJlIHdlbGwtZGlzdHJpYnV0ZWQsIHdoaWNoIGlzCisgKiAgICAgY3JpdGlj YWwgZm9yIHBhcnRpdGlvbmVkIGhhc2ggdGFibGVzLgorICovCitzdGF0aWMgdWludDMyCitj aGFubmVsX2hhc2hfZnVuYyhjb25zdCB2b2lkICprZXksIFNpemUga2V5c2l6ZSkKK3sKKwlj b25zdAkJQ2hhbm5lbEhhc2hLZXkgKmsgPSAoY29uc3QgQ2hhbm5lbEhhc2hLZXkgKikga2V5 OworCXVpbnQzMgkJaDsKKworCS8qCisJICogTWl4IHRoZSBkYm9pZCBhbmQgdGhlIGNoYW5u ZWwgbmFtZSB0byBwcm9kdWNlIGEgZ29vZCBoYXNoLiBoYXNoX2FueSgpCisJICogaXMgYSBo aWdoLXF1YWxpdHkgcG9ydGFibGUgaGFzaCBmdW5jdGlvbi4gVGhpcyBwcmV2ZW50cyBjaGFu bmVscyB3aXRoCisJICogdGhlIHNhbWUgbmFtZSBpbiBkaWZmZXJlbnQgZGF0YWJhc2VzIGZy b20gYWx3YXlzIG1hcHBpbmcgdG8gdGhlIHNhbWUKKwkgKiBwYXJ0aXRpb24uCisJICovCisJ aCA9IERhdHVtR2V0VUludDMyKGhhc2hfdWludDMyKGstPmRib2lkKSk7CisJaCBePSBEYXR1 bUdldFVJbnQzMihoYXNoX2FueSgoY29uc3QgdW5zaWduZWQgY2hhciAqKSBrLT5jaGFubmVs LAorCQkJCQkJCQkgc3RybmxlbihrLT5jaGFubmVsLCBOQU1FREFUQUxFTikpKTsKKworCXJl dHVybiBoOworfQorCisvKgorICogR2V0Q2hhbm5lbEhhc2hMb2NrCisgKiAgICAgUmV0dXJu IHRoZSBMV0xvY2sgdGhhdCBwcm90ZWN0cyB0aGUgcGFydGl0aW9uIGZvciB0aGUgZ2l2ZW4g Y2hhbm5lbCBuYW1lLgorICovCitzdGF0aWMgTFdMb2NrICoKK0dldENoYW5uZWxIYXNoTG9j ayhjb25zdCBjaGFyICpjaGFubmVsKQoreworCUNoYW5uZWxIYXNoS2V5IGtleTsKKwl1aW50 MzIJCWhhc2g7CisKKwlDaGFubmVsSGFzaFByZXBhcmVLZXkoJmtleSwgTXlEYXRhYmFzZUlk LCBjaGFubmVsKTsKKwloYXNoID0gZ2V0X2hhc2hfdmFsdWUoR2V0Q2hhbm5lbEhhc2goKSwg JmtleSk7CisKKwlyZXR1cm4gJmNoYW5uZWxIYXNoTG9ja3NbaGFzaCAlIE5VTV9OT1RJRllf UEFSVElUSU9OU107Cit9CisKKy8qCisgKiBDaGFubmVsSGFzaFByZXBhcmVLZXkKKyAqCQlQ cmVwYXJlIGEgY2hhbm5lbCBrZXkgKGRhdGFiYXNlIE9JRCArIGNoYW5uZWwgbmFtZSkgZm9y IHVzZSBhcyBhIGhhc2gga2V5LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK0NoYW5uZWxI YXNoUHJlcGFyZUtleShDaGFubmVsSGFzaEtleSAqIGtleSwgT2lkIGRib2lkLCBjb25zdCBj aGFyICpjaGFubmVsKQoreworCW1lbXNldChrZXksIDAsIHNpemVvZihDaGFubmVsSGFzaEtl eSkpOworCWtleS0+ZGJvaWQgPSBkYm9pZDsKKwlzdHJsY3B5KGtleS0+Y2hhbm5lbCwgY2hh bm5lbCwgTkFNRURBVEFMRU4pOworfQorCisvKgorICogQ2hhbm5lbEhhc2hBZGRMaXN0ZW5l cgorICogICAgIFJlZ2lzdGVyIHRoZSBnaXZlbiBiYWNrZW5kIGFzIGEgbGlzdGVuZXIgZm9y IHRoZSBzcGVjaWZpZWQgY2hhbm5lbC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHVzZXMgYW4g b3B0aW1pc3RpYyByZWFkLWxvY2tpbmcgc3RyYXRlZ3kgdG8gbWF4aW1pemUKKyAqIGNvbmN1 cnJlbmN5LiBBbiBleGNsdXNpdmUgbG9jayBpcyBvbmx5IHRha2VuIHdoZW4gbXV0YXRpbmcg dGhlIGxpc3RlbmVyCisgKiBsaXN0LgorICoKKyAqIDEuIEl0IGZpcnN0IHRha2VzIGEgc2hh cmVkIGxvY2suIElmIHRoZSBjaGFubmVsIGlzIGFscmVhZHkgaW4gYnJvYWRjYXN0CisgKiAg ICBtb2RlLCBvciBpZiB0aGUgY3VycmVudCBiYWNrZW5kIGlzIGFscmVhZHkgaW4gdGhlIGxp c3RlbmVyIGxpc3QsIG5vIHdyaXRlCisgKiAgICBpcyBuZWVkZWQgYW5kIHdlIGNhbiByZXR1 cm4gaW1tZWRpYXRlbHkuCisgKgorICogMi4gSWYgYSB3cml0ZSBpcyBuZWVkZWQsIGl0IHJl bGVhc2VzIHRoZSBzaGFyZWQgbG9jayBhbmQgYWNxdWlyZXMgYW4KKyAqICAgIGV4Y2x1c2l2 ZSBsb2NrLgorICoKKyAqIDMuIENSVUNJQUxMWSwgYWZ0ZXIgYWNxdWlyaW5nIHRoZSBleGNs dXNpdmUgbG9jaywgaXQgbXVzdCByZS1jaGVjayB0aGUKKyAqICAgIHN0YXRlLCBhcyBhbm90 aGVyIGJhY2tlbmQgbWF5IGhhdmUgbW9kaWZpZWQgdGhlIGVudHJ5IGluIHRoZSBpbnRlcmlt LgorICoKKyAqIDQuIElmIHRoZSBudW1iZXIgb2YgbGlzdGVuZXJzIGlzIGJlbG93IE5PVElG WV9NVUxUSUNBU1RfVEhSRVNIT0xELCB0aGUKKyAqICAgIG5ldyBsaXN0ZW5lciBpcyBhZGRl ZC4gSWYgdGhlIHRocmVzaG9sZCBpcyByZWFjaGVkLCB0aGUgY2hhbm5lbCBpcworICogICAg Y29udmVydGVkIHRvIGJyb2FkY2FzdCBtb2RlLgorICovCitzdGF0aWMgdm9pZAorQ2hhbm5l bEhhc2hBZGRMaXN0ZW5lcihjb25zdCBjaGFyICpjaGFubmVsLCBQcm9jTnVtYmVyIHByb2Nu bykKK3sKKwlDaGFubmVsRW50cnkgKmVudHJ5OworCWJvb2wJCWZvdW5kOworCUNoYW5uZWxI YXNoS2V5IGtleTsKKwlMV0xvY2sJICAgKmxvY2sgPSBHZXRDaGFubmVsSGFzaExvY2soY2hh bm5lbCk7CisKKwkvKgorCSAqIElmIHRoZSB0aHJlc2hvbGQgaXMgemVybywgdGhpcyBvcHRp bWl6YXRpb24gaXMgZGlzYWJsZWQuIEFsbCBjaGFubmVscworCSAqIGltbWVkaWF0ZWx5IHVz ZSBicm9hZGNhc3QsIHNvIHdlIGRvbid0IG5lZWQgdG8gdHJhY2sgdGhlbS4KKwkgKi8KKwlp ZiAoTk9USUZZX01VTFRJQ0FTVF9USFJFU0hPTEQgPD0gMCkKKwkJcmV0dXJuOworCisJQ2hh bm5lbEhhc2hQcmVwYXJlS2V5KCZrZXksIE15RGF0YWJhc2VJZCwgY2hhbm5lbCk7CisKKwkv KgorCSAqIEZBU1QgUEFUSDogT3B0aW1pc3RpY2FsbHkgdGFrZSBhIHNoYXJlZCBsb2NrLiBJ ZiB0aGUgY2hhbm5lbCBpcyBhbHJlYWR5CisJICogaW4gYnJvYWRjYXN0IG1vZGUsIG9yIGlm IHdlIGFyZSBhbHJlYWR5IGxpc3RlZCwgd2UgYXJlIGRvbmUuCisJICovCisJTFdMb2NrQWNx dWlyZShsb2NrLCBMV19TSEFSRUQpOworCWVudHJ5ID0gKENoYW5uZWxFbnRyeSAqKSBoYXNo X3NlYXJjaChHZXRDaGFubmVsSGFzaCgpLCAma2V5LCBIQVNIX0ZJTkQsIE5VTEwpOworCWlm IChlbnRyeSkKKwl7CisJCWlmIChlbnRyeS0+aXNfYnJvYWRjYXN0KQorCQl7CisJCQlMV0xv Y2tSZWxlYXNlKGxvY2spOworCQkJcmV0dXJuOworCQl9CisJCS8qIENoZWNrIGlmIHdlIGFy ZSBhbHJlYWR5IGluIHRoZSBsaXN0ICovCisJCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cnkt Pm51bV9saXN0ZW5lcnM7IGkrKykKKwkJeworCQkJaWYgKGVudHJ5LT5saXN0ZW5lcnNbaV0g PT0gcHJvY25vKQorCQkJeworCQkJCUxXTG9ja1JlbGVhc2UobG9jayk7CisJCQkJcmV0dXJu OworCQkJfQorCQl9CisJfQorCUxXTG9ja1JlbGVhc2UobG9jayk7CisKKwkvKgorCSAqIFNM T1cgUEFUSDogV2UgbmVlZCB0byB3cml0ZS4gQWNxdWlyZSBleGNsdXNpdmUgbG9jay4KKwkg Ki8KKwlMV0xvY2tBY3F1aXJlKGxvY2ssIExXX0VYQ0xVU0lWRSk7CisKKwkvKgorCSAqIFJl LWNoZWNrIHN0YXRlIGFmdGVyIGFjcXVpcmluZyBleGNsdXNpdmUgbG9jaywgYXMgaXQgbWF5 IGhhdmUgY2hhbmdlZC4KKwkgKi8KKwllbnRyeSA9IChDaGFubmVsRW50cnkgKikgaGFzaF9z ZWFyY2goR2V0Q2hhbm5lbEhhc2goKSwgJmtleSwgSEFTSF9FTlRFUl9OVUxMLCAmZm91bmQp OworCisJaWYgKGVudHJ5ID09IE5VTEwpCisJeworCQkvKiBPdXQgb2YgbWVtb3J5IGluIHRo ZSBoYXNoIHBhcnRpdGlvbi4gKi8KKwkJZXJlcG9ydChERUJVRzEsIChlcnJtc2coInRvbyBt YW55IG5vdGlmaWNhdGlvbiBjaGFubmVscyBhcmUgYWxyZWFkeSBiZWluZyB0cmFja2VkIikp KTsKKwkJTFdMb2NrUmVsZWFzZShsb2NrKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghZm91 bmQpCisJeworCQkvKiBGaXJzdCBsaXN0ZW5lciBmb3IgdGhpcyBjaGFubmVsLiAqLworCQll bnRyeS0+aXNfYnJvYWRjYXN0ID0gZmFsc2U7CisJCWVudHJ5LT5udW1fbGlzdGVuZXJzID0g MTsKKwkJZW50cnktPmxpc3RlbmVyc1swXSA9IHByb2NubzsKKwl9CisJZWxzZQorCXsKKwkJ LyogRW50cnkgYWxyZWFkeSBleGlzdHMsIHJlLWNoZWNrIGV2ZXJ5dGhpbmcuICovCisJCWJv b2wJCWFscmVhZHlfcHJlc2VudCA9IGZhbHNlOworCisJCWlmIChlbnRyeS0+aXNfYnJvYWRj YXN0KQorCQl7CisJCQkvKiBBbm90aGVyIGJhY2tlbmQgc2V0IGl0IHRvIGJyb2FkY2FzdCBt b2RlLiBXZSdyZSBkb25lLiAqLworCQkJTFdMb2NrUmVsZWFzZShsb2NrKTsKKwkJCXJldHVy bjsKKwkJfQorCisJCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cnktPm51bV9saXN0ZW5lcnM7 IGkrKykKKwkJeworCQkJaWYgKGVudHJ5LT5saXN0ZW5lcnNbaV0gPT0gcHJvY25vKQorCQkJ eworCQkJCWFscmVhZHlfcHJlc2VudCA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0K KworCQlpZiAoIWFscmVhZHlfcHJlc2VudCkKKwkJeworCQkJaWYgKGVudHJ5LT5udW1fbGlz dGVuZXJzIDwgTk9USUZZX01VTFRJQ0FTVF9USFJFU0hPTEQpCisJCQl7CisJCQkJLyogQWRk IG91cnNlbHZlcyB0byB0aGUgbGlzdCBvZiBsaXN0ZW5lcnMuICovCisJCQkJZW50cnktPmxp c3RlbmVyc1tlbnRyeS0+bnVtX2xpc3RlbmVyc10gPSBwcm9jbm87CisJCQkJZW50cnktPm51 bV9saXN0ZW5lcnMrKzsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvKiBXZSBhcmUgdGhl IGxpc3RlbmVyIHRoYXQgZXhjZWVkcyB0aGUgdGhyZXNob2xkLiAqLworCQkJCWVudHJ5LT5p c19icm9hZGNhc3QgPSB0cnVlOworCQkJCWVudHJ5LT5udW1fbGlzdGVuZXJzID0gMDsJLyog Q2xlYXIgdGhlIGxpc3QgKi8KKwkJCX0KKwkJfQorCX0KKwlMV0xvY2tSZWxlYXNlKGxvY2sp OworfQorCisvKgorICogQ2hhbm5lbEhhc2hSZW1vdmVMaXN0ZW5lcgorICoJCVVwZGF0ZSB0 aGUgY2hhbm5lbCBoYXNoIHdoZW4gYSBiYWNrZW5kIHN0b3BzIGxpc3RlbmluZyBvbiBhIGNo YW5uZWwuCisgKgorICogVGhpcyBmdW5jdGlvbiB1c2VzIGFuIG9wdGltaXN0aWMgcmVhZC1s b2NrIHN0cmF0ZWd5LiBBbiBleGNsdXNpdmUgbG9jayBpcworICogb25seSB0YWtlbiBpZiB3 ZSBhcmUgaW4gdGhlIGxpc3RlbmVyIGxpc3QgZm9yIGEgY2hhbm5lbCBhbmQgbmVlZCB0byBy ZW1vdmUKKyAqIG91cnNlbHZlcy4gSWYgYSBjaGFubmVsIGlzIGluIGJyb2FkY2FzdCBtb2Rl LCB3ZSBjYW5ub3Qgc2FmZWx5IG1vZGlmeSBpdCwKKyAqIGFzIHdlIGNhbid0IGtub3cgd2hp Y2ggYmFja2VuZHMgYXJlIGxpc3RlbmluZy4KKyAqLworc3RhdGljIHZvaWQKK0NoYW5uZWxI YXNoUmVtb3ZlTGlzdGVuZXIoY29uc3QgY2hhciAqY2hhbm5lbCwgUHJvY051bWJlciBwcm9j bm8pCit7CisJQ2hhbm5lbEVudHJ5ICplbnRyeTsKKwlDaGFubmVsSGFzaEtleSBrZXk7CisJ TFdMb2NrCSAgICpsb2NrID0gR2V0Q2hhbm5lbEhhc2hMb2NrKGNoYW5uZWwpOworCWJvb2wJ CXByZXNlbnQgPSBmYWxzZTsKKworCUNoYW5uZWxIYXNoUHJlcGFyZUtleSgma2V5LCBNeURh dGFiYXNlSWQsIGNoYW5uZWwpOworCisJLyoKKwkgKiBUYWtlIGEgc2hhcmVkIGxvY2sgZmly c3QgdG8gc2VlIGlmIGEgcmVtb3ZhbCBpcyBldmVuIHBvc3NpYmxlLiBJZiB0aGUKKwkgKiBl bnRyeSBkb2Vzbid0IGV4aXN0LCBpcyBpbiBicm9hZGNhc3QgbW9kZSwgb3Igd2UncmUgbm90 IGluIGl0cyBsaXN0LCB3ZQorCSAqIGhhdmUgbm90aGluZyB0byBkby4gVGhpcyBpcyB0aGUg ZmFzdCBwYXRoLgorCSAqLworCUxXTG9ja0FjcXVpcmUobG9jaywgTFdfU0hBUkVEKTsKKwll bnRyeSA9IChDaGFubmVsRW50cnkgKikgaGFzaF9zZWFyY2goR2V0Q2hhbm5lbEhhc2goKSwg JmtleSwgSEFTSF9GSU5ELCBOVUxMKTsKKwlpZiAoIWVudHJ5IHx8IGVudHJ5LT5pc19icm9h ZGNhc3QpCisJeworCQlMV0xvY2tSZWxlYXNlKGxvY2spOworCQlyZXR1cm47CisJfQorCisJ LyogQ2hlY2sgaWYgd2UgYXJlIGluIHRoZSBsaXN0ICovCisJZm9yIChpbnQgaSA9IDA7IGkg PCBlbnRyeS0+bnVtX2xpc3RlbmVyczsgaSsrKQorCXsKKwkJaWYgKGVudHJ5LT5saXN0ZW5l cnNbaV0gPT0gcHJvY25vKQorCQl7CisJCQlwcmVzZW50ID0gdHJ1ZTsKKwkJCWJyZWFrOwor CQl9CisJfQorCWlmICghcHJlc2VudCkKKwl7CisJCUxXTG9ja1JlbGVhc2UobG9jayk7CisJ CXJldHVybjsKKwl9CisJTFdMb2NrUmVsZWFzZShsb2NrKTsKKworCS8qIEEgcmVtb3ZhbCBp cyBsaWtlbHkgbmVlZGVkLiBBY3F1aXJlIGFuIGV4Y2x1c2l2ZSBsb2NrLiAqLworCUxXTG9j a0FjcXVpcmUobG9jaywgTFdfRVhDTFVTSVZFKTsKKworCS8qCisJICogUmUtY2hlY2sgdGhl IHN0YXRlLiBBbm90aGVyIGJhY2tlbmQgbWlnaHQgaGF2ZSBjaGFuZ2VkIGl0IChlLmcuLCB0 bworCSAqIGJyb2FkY2FzdCBtb2RlKS4KKwkgKi8KKwllbnRyeSA9IChDaGFubmVsRW50cnkg KikgaGFzaF9zZWFyY2goR2V0Q2hhbm5lbEhhc2goKSwgJmtleSwgSEFTSF9GSU5ELCBOVUxM KTsKKwlpZiAoZW50cnkgJiYgIWVudHJ5LT5pc19icm9hZGNhc3QpCisJeworCQlpbnQJCQlp OworCisJCWZvciAoaSA9IDA7IGkgPCBlbnRyeS0+bnVtX2xpc3RlbmVyczsgaSsrKQorCQl7 CisJCQlpZiAoZW50cnktPmxpc3RlbmVyc1tpXSA9PSBwcm9jbm8pCisJCQl7CisJCQkJLyoK KwkJCQkgKiBGb3VuZCBvdXIgcHJvY25vLiBSZW1vdmUgaXQgZnJvbSB0aGUgbGlzdGVuZXIg YXJyYXkuCisJCQkJICoKKwkJCQkgKiBJZiB0aGlzIGlzIHRoZSBsYXN0IGxpc3RlbmVyLCB3 ZSByZW1vdmUgdGhlIGVudGlyZSBoYXNoCisJCQkJICogZW50cnkgZm9yIHRoZSBjaGFubmVs LgorCQkJCSAqLworCQkJCWlmIChlbnRyeS0+bnVtX2xpc3RlbmVycyA9PSAxKQorCQkJCXsK KwkJCQkJKHZvaWQpIGhhc2hfc2VhcmNoKEdldENoYW5uZWxIYXNoKCksICZrZXksIEhBU0hf UkVNT1ZFLCBOVUxMKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJLyoKKwkJCQkJ ICogVG8gcmVtb3ZlIGFuIGVsZW1lbnQgZnJvbSB0aGUgYXJyYXkgd2hpbGUga2VlcGluZyBp dAorCQkJCQkgKiBjb250aWd1b3VzLCB3ZSBmaXJzdCBkZWNyZW1lbnQgdGhlIGxpc3RlbmVy IGNvdW50LgorCQkJCQkgKiBUaGVuLCB3ZSBzaGlmdCBhbGwgc3Vic2VxdWVudCBlbGVtZW50 cyBvbmUgcG9zaXRpb24gdG8KKwkJCQkJICogdGhlIGxlZnQsIG92ZXJ3cml0aW5nIHRoZSBl bGVtZW50IHdlIHdhbnQgdG8gcmVtb3ZlLgorCQkJCQkgKgorCQkJCQkgKiBUaGUgYGlmIChp IDwgZW50cnktPm51bV9saXN0ZW5lcnMpYCBjb25kaXRpb24KKwkJCQkJICogZXhwbGljaXRs eSBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIHRoZSBsYXN0IGVsZW1lbnQgaW4KKwkJCQkJICog dGhlIGFycmF5IGlzIGJlaW5nIHJlbW92ZWQuIEluIHRoYXQgc2NlbmFyaW8sIGBpYAorCQkJ CQkgKiBlcXVhbHMgdGhlIG5ldyBgbnVtX2xpc3RlbmVyc2AsIHNvIG5vIG1lbW9yeSBtb3Zl bWVudAorCQkJCQkgKiBpcyBuZWNlc3NhcnksIGFuZCB0aGUgYG1lbW1vdmVgIGlzIGNvcnJl Y3RseSBza2lwcGVkLgorCQkJCQkgKi8KKwkJCQkJZW50cnktPm51bV9saXN0ZW5lcnMtLTsK KwkJCQkJaWYgKGkgPCBlbnRyeS0+bnVtX2xpc3RlbmVycykKKwkJCQkJeworCQkJCQkJU2l6 ZQkJc2l6ZV90b19tb3ZlOworCisJCQkJCQlzaXplX3RvX21vdmUgPSBtdWxfc2l6ZShlbnRy eS0+bnVtX2xpc3RlbmVycyAtIGksCisJCQkJCQkJCQkJCQlzaXplb2YoUHJvY051bWJlcikp OworCQkJCQkJbWVtbW92ZSgmZW50cnktPmxpc3RlbmVyc1tpXSwKKwkJCQkJCQkJJmVudHJ5 LT5saXN0ZW5lcnNbaSArIDFdLAorCQkJCQkJCQlzaXplX3RvX21vdmUpOworCQkJCQl9CisJ CQkJfQorCQkJCWJyZWFrOwkJCS8qIEZvdW5kIGFuZCByZW1vdmVkLCBleGl0IGxvb3AuICov CisJCQl9CisJCX0KKwl9CisJTFdMb2NrUmVsZWFzZShsb2NrKTsKK30KKworLyoKKyAqIENo YW5uZWxIYXNoTG9va3VwCisgKgkJTG9vayB1cCB0aGUgY2hhbm5lbCBoYXNoIGVudHJ5IGZv ciB0aGUgZ2l2ZW4gY2hhbm5lbCBuYW1lIGluIHRoZQorICoJCWN1cnJlbnQgZGF0YWJhc2Uu CisgKgorICogUmV0dXJucyBOVUxMIGlmIG5vIGhhc2ggZW50cnkgZXhpc3RzIGZvciB0aGUg Y2hhbm5lbC4gV2hlbiBhbiBlbnRyeSBleGlzdHMsCisgKiB0aGUgY2FsbGVyIHNob3VsZCBj aGVjayB0aGUgaXNfYnJvYWRjYXN0IGZpZWxkIHRvIGRldGVybWluZSBpZiBpbmRpdmlkdWFs CisgKiBsaXN0ZW5lcnMgYXJlIGJlaW5nIHRyYWNrZWQgb3IgaWYgdGhlIGNoYW5uZWwgdXNl cyBicm9hZGNhc3QgbW9kZS4KKyAqCisgKiBDYWxsZXIgbXVzdCBob2xkIHRoZSBhcHByb3By aWF0ZSBwYXJ0aXRpb24gbG9jayAoc2hhcmVkIGlzIHN1ZmZpY2llbnQpLgorICovCitzdGF0 aWMgQ2hhbm5lbEVudHJ5ICoKK0NoYW5uZWxIYXNoTG9va3VwKGNvbnN0IGNoYXIgKmNoYW5u ZWwpCit7CisJQ2hhbm5lbEhhc2hLZXkga2V5OworCisJQXNzZXJ0KExXTG9ja0hlbGRCeU1l KEdldENoYW5uZWxIYXNoTG9jayhjaGFubmVsKSkpOworCisJQ2hhbm5lbEhhc2hQcmVwYXJl S2V5KCZrZXksIE15RGF0YWJhc2VJZCwgY2hhbm5lbCk7CisKKwlyZXR1cm4gKENoYW5uZWxF bnRyeSAqKSBoYXNoX3NlYXJjaChHZXRDaGFubmVsSGFzaCgpLAorCQkJCQkJCQkJCSZrZXks CisJCQkJCQkJCQkJSEFTSF9GSU5ELAorCQkJCQkJCQkJCU5VTEwpOworfQorCisvKgorICog R2V0UGVuZGluZ05vdGlmeUNoYW5uZWxzCisgKgkJR2V0IGxpc3Qgb2YgdW5pcXVlIGNoYW5u ZWwgbmFtZXMgZnJvbSBwZW5kaW5nIG5vdGlmaWNhdGlvbnMuCisgKi8KK3N0YXRpYyBMaXN0 ICoKK0dldFBlbmRpbmdOb3RpZnlDaGFubmVscyh2b2lkKQoreworCUxpc3QJICAgKmNoYW5u ZWxzID0gTklMOworCUxpc3RDZWxsICAgKnA7CisJTGlzdENlbGwgICAqcTsKKwlib29sCQlm b3VuZDsKKworCWlmICghcGVuZGluZ05vdGlmaWVzKQorCQlyZXR1cm4gTklMOworCisJLyog Q29sbGVjdCB1bmlxdWUgY2hhbm5lbCBuYW1lcyBmcm9tIHBlbmRpbmcgbm90aWZpY2F0aW9u cyAqLworCWZvcmVhY2gocCwgcGVuZGluZ05vdGlmaWVzLT5ldmVudHMpCisJeworCQlOb3Rp ZmljYXRpb24gKm4gPSAoTm90aWZpY2F0aW9uICopIGxmaXJzdChwKTsKKwkJY2hhcgkgICAq Y2hhbm5lbCA9IG4tPmRhdGE7CisKKwkJLyogQ2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIHRo aXMgY2hhbm5lbCBpbiBvdXIgbGlzdCAqLworCQlmb3VuZCA9IGZhbHNlOworCQlmb3JlYWNo KHEsIGNoYW5uZWxzKQorCQl7CisJCQljaGFyCSAgICpleGlzdGluZyA9IChjaGFyICopIGxm aXJzdChxKTsKKworCQkJaWYgKHN0cmNtcChleGlzdGluZywgY2hhbm5lbCkgPT0gMCkKKwkJ CXsKKwkJCQlmb3VuZCA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAo IWZvdW5kKQorCQkJY2hhbm5lbHMgPSBsYXBwZW5kKGNoYW5uZWxzLCBjaGFubmVsKTsKKwl9 CisKKwlyZXR1cm4gY2hhbm5lbHM7Cit9CisKKy8qCisgKiBBc3luY0RlZmVycmVkV2FrZXVw U2V0V29ya2VyUGlkCisgKgkJU3RvcmUgdGhlIFBJRCBvZiB0aGUgZGVmZXJyZWQgd2FrZXVw IHdvcmtlciBpbiBzaGFyZWQgbWVtb3J5CisgKi8KK3ZvaWQKK0FzeW5jRGVmZXJyZWRXYWtl dXBTZXRXb3JrZXJQaWQocGlkX3QgcGlkKQoreworCUxXTG9ja0FjcXVpcmUoTm90aWZ5UXVl dWVMb2NrLCBMV19FWENMVVNJVkUpOworCWFzeW5jUXVldWVDb250cm9sLT5kZWZlcnJlZFdh a2V1cFdvcmtlclBpZCA9IHBpZDsKKwlMV0xvY2tSZWxlYXNlKE5vdGlmeVF1ZXVlTG9jayk7 Cit9CisKKy8qCisgKiBBc3luY0RlZmVycmVkV2FrZXVwQ2xlYXJBY3RpdmUKKyAqCQlDbGVh ciB0aGUgYWN0aXZlIGZsYWcgZm9yIHRoZSBkZWZlcnJlZCB3YWtldXAgd29ya2VyCisgKi8K K3ZvaWQKK0FzeW5jRGVmZXJyZWRXYWtldXBDbGVhckFjdGl2ZSh2b2lkKQoreworCUxXTG9j a0FjcXVpcmUoTm90aWZ5UXVldWVMb2NrLCBMV19FWENMVVNJVkUpOworCWFzeW5jUXVldWVD b250cm9sLT5kZWZlcnJlZFdha2V1cFdvcmtlckFjdGl2ZSA9IGZhbHNlOworCUxXTG9ja1Jl bGVhc2UoTm90aWZ5UXVldWVMb2NrKTsKK30KKworLyoKKyAqIEFzeW5jR2V0TGFnZ2luZ0Jh Y2tlbmRzCisgKgkJR2V0IGxpc3Qgb2YgbGFnZ2luZyBsaXN0ZW5pbmcgYmFja2VuZHMgdGhh dCBuZWVkIHRvIGJlIHdva2VuIHVwCisgKgorICogUmV0dXJucyBhIGxpc3Qgb2YgQmFja2Vu ZFdha2V1cEluZm8gc3RydWN0cy4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZQorICogZm9y IGZyZWVpbmcgdGhlIGxpc3QgYW5kIGl0cyBjb250ZW50cy4KKyAqLworTGlzdCAqCitBc3lu Y0dldExhZ2dpbmdCYWNrZW5kcyh2b2lkKQoreworCUxpc3QJICAgKmxhZ2dpbmdfYmFja2Vu ZHMgPSBOSUw7CisJUXVldWVQb3NpdGlvbiBoZWFkOworCisJTFdMb2NrQWNxdWlyZShOb3Rp ZnlRdWV1ZUxvY2ssIExXX0VYQ0xVU0lWRSk7CisKKwloZWFkID0gUVVFVUVfSEVBRDsKKwor CS8qIEl0ZXJhdGUgdGhyb3VnaCBhbGwgbGlzdGVuaW5nIGJhY2tlbmRzICovCisJZm9yIChQ cm9jTnVtYmVyIGkgPSBRVUVVRV9GSVJTVF9MSVNURU5FUjsgaSAhPSBJTlZBTElEX1BST0Nf TlVNQkVSOyBpID0gUVVFVUVfTkVYVF9MSVNURU5FUihpKSkKKwl7CisJCVF1ZXVlUG9zaXRp b24gcG9zOworCQlpbnQ2NAkJcGFnZURpZmY7CisKKwkJLyogU2tpcCBpZiB3YWtldXAgaXMg YWxyZWFkeSBwZW5kaW5nICovCisJCWlmIChRVUVVRV9CQUNLRU5EX1dBS0VVUF9QRU5ESU5H KGkpKQorCQkJY29udGludWU7CisKKwkJcG9zID0gUVVFVUVfQkFDS0VORF9QT1MoaSk7CisK KwkJLyogQ2FsY3VsYXRlIGhvdyBmYXIgYmVoaW5kIHRoaXMgYmFja2VuZCBpcyAqLworCQlw YWdlRGlmZiA9IGFzeW5jUXVldWVQYWdlRGlmZihRVUVVRV9QT1NfUEFHRShoZWFkKSwgUVVF VUVfUE9TX1BBR0UocG9zKSk7CisKKwkJLyogSWYgYmFja2VuZCBpcyBsYWdnaW5nIGJ5IFFV RVVFX0NMRUFOVVBfREVMQVkgb3IgbW9yZSBwYWdlcyAqLworCQlpZiAocGFnZURpZmYgPj0g UVVFVUVfQ0xFQU5VUF9ERUxBWSkKKwkJeworCQkJQmFja2VuZFdha2V1cEluZm8gKmluZm87 CisKKwkJCWluZm8gPSAoQmFja2VuZFdha2V1cEluZm8gKikgcGFsbG9jKHNpemVvZihCYWNr ZW5kV2FrZXVwSW5mbykpOworCQkJaW5mby0+cGlkID0gUVVFVUVfQkFDS0VORF9QSUQoaSk7 CisJCQlpbmZvLT5wcm9jbm8gPSBpOworCisJCQkvKiBNYXJrIGFzIGhhdmluZyB3YWtldXAg cGVuZGluZyAqLworCQkJUVVFVUVfQkFDS0VORF9XQUtFVVBfUEVORElORyhpKSA9IHRydWU7 CisKKwkJCWxhZ2dpbmdfYmFja2VuZHMgPSBsYXBwZW5kKGxhZ2dpbmdfYmFja2VuZHMsIGlu Zm8pOworCQl9CisJfQorCisJTFdMb2NrUmVsZWFzZShOb3RpZnlRdWV1ZUxvY2spOworCisJ cmV0dXJuIGxhZ2dpbmdfYmFja2VuZHM7Cit9CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9w b3N0bWFzdGVyL01ha2VmaWxlIGIvc3JjL2JhY2tlbmQvcG9zdG1hc3Rlci9NYWtlZmlsZQpp bmRleCAwZjQ0MzVkMmQ5Ny4uMmFjNGYzZmQ1MjQgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5k L3Bvc3RtYXN0ZXIvTWFrZWZpbGUKKysrIGIvc3JjL2JhY2tlbmQvcG9zdG1hc3Rlci9NYWtl ZmlsZQpAQCAtMjEsNiArMjEsNyBAQCBPQkpTID0gXAogCWZvcmtfcHJvY2Vzcy5vIFwKIAlp bnRlcnJ1cHQubyBcCiAJbGF1bmNoX2JhY2tlbmQubyBcCisJbm90aWZ5X2Jnd29ya2VyLm8g XAogCXBnYXJjaC5vIFwKIAlwbWNoaWxkLm8gXAogCXBvc3RtYXN0ZXIubyBcCmRpZmYgLS1n aXQgYS9zcmMvYmFja2VuZC9wb3N0bWFzdGVyL2Jnd29ya2VyLmMgYi9zcmMvYmFja2VuZC9w b3N0bWFzdGVyL2Jnd29ya2VyLmMKaW5kZXggMWFkNjVjMjM3YzMuLjA5NDYwNjU4OTVhIDEw MDY0NAotLS0gYS9zcmMvYmFja2VuZC9wb3N0bWFzdGVyL2Jnd29ya2VyLmMKKysrIGIvc3Jj L2JhY2tlbmQvcG9zdG1hc3Rlci9iZ3dvcmtlci5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5j bHVkZSAicGdzdGF0LmgiCiAjaW5jbHVkZSAicG9ydC9hdG9taWNzLmgiCiAjaW5jbHVkZSAi cG9zdG1hc3Rlci9iZ3dvcmtlcl9pbnRlcm5hbHMuaCIKKyNpbmNsdWRlICJwb3N0bWFzdGVy L25vdGlmeV9iZ3dvcmtlci5oIgogI2luY2x1ZGUgInBvc3RtYXN0ZXIvcG9zdG1hc3Rlci5o IgogI2luY2x1ZGUgInJlcGxpY2F0aW9uL2xvZ2ljYWxsYXVuY2hlci5oIgogI2luY2x1ZGUg InJlcGxpY2F0aW9uL2xvZ2ljYWx3b3JrZXIuaCIKQEAgLTEzMiw2ICsxMzMsOSBAQCBzdGF0 aWMgY29uc3Qgc3RydWN0CiAJfSwKIAl7CiAJCSJUYWJsZXN5bmNXb3JrZXJNYWluIiwgVGFi bGVzeW5jV29ya2VyTWFpbgorCX0sCisJeworCQkiTm90aWZ5RGVmZXJyZWRXYWtldXBNYWlu IiwgTm90aWZ5RGVmZXJyZWRXYWtldXBNYWluCiAJfQogfTsKIApkaWZmIC0tZ2l0IGEvc3Jj L2JhY2tlbmQvcG9zdG1hc3Rlci9tZXNvbi5idWlsZCBiL3NyYy9iYWNrZW5kL3Bvc3RtYXN0 ZXIvbWVzb24uYnVpbGQKaW5kZXggMDAwODYwM2NmZWUuLmM5ZDI4NTU3MGFlIDEwMDY0NAot LS0gYS9zcmMvYmFja2VuZC9wb3N0bWFzdGVyL21lc29uLmJ1aWxkCisrKyBiL3NyYy9iYWNr ZW5kL3Bvc3RtYXN0ZXIvbWVzb24uYnVpbGQKQEAgLTksNiArOSw3IEBAIGJhY2tlbmRfc291 cmNlcyArPSBmaWxlcygKICAgJ2ZvcmtfcHJvY2Vzcy5jJywKICAgJ2ludGVycnVwdC5jJywK ICAgJ2xhdW5jaF9iYWNrZW5kLmMnLAorICAnbm90aWZ5X2Jnd29ya2VyLmMnLAogICAncGdh cmNoLmMnLAogICAncG1jaGlsZC5jJywKICAgJ3Bvc3RtYXN0ZXIuYycsCmRpZmYgLS1naXQg YS9zcmMvYmFja2VuZC9wb3N0bWFzdGVyL25vdGlmeV9iZ3dvcmtlci5jIGIvc3JjL2JhY2tl bmQvcG9zdG1hc3Rlci9ub3RpZnlfYmd3b3JrZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NApp bmRleCAwMDAwMDAwMDAwMC4uZjBjNTUxNGNmZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMv YmFja2VuZC9wb3N0bWFzdGVyL25vdGlmeV9iZ3dvcmtlci5jCkBAIC0wLDAgKzEsMjI1IEBA CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBub3RpZnlfYmd3b3JrZXIuYworICoJ ICBCYWNrZ3JvdW5kIHdvcmtlciBmb3IgZGVmZXJyZWQgd2FrZXVwIG9mIGxhZ2dpbmcgTElT VEVOL05PVElGWSBiYWNrZW5kcworICoKKyAqIFRoaXMgYmFja2dyb3VuZCB3b3JrZXIgaXMg cmVzcG9uc2libGUgZm9yIHBlcmZvcm1pbmcgc3RhZ2dlcmVkIHdha2V1cCBvZgorICogbGlz dGVuaW5nIGJhY2tlbmRzIHRoYXQgaGF2ZSBmYWxsZW4gYmVoaW5kIGluIHByb2Nlc3Npbmcg dGhlIG5vdGlmaWNhdGlvbgorICogcXVldWUuIEl0IHJ1bnMgY29udGludW91c2x5IGJ1dCBv bmx5IHBlcmZvcm1zIHdvcmsgd2hlbiBzaWduYWxlZCBieSB0aGUKKyAqIG1haW4gTk9USUZZ IG1lY2hhbmlzbS4KKyAqCisgKiBUaGUgd29ya2VyIGlzIHRyaWdnZXJlZCB3aGVuIFNpZ25h bEJhY2tlbmRzKCkgaW4gYXN5bmMuYyBkZXRlcm1pbmVzIHRoYXQKKyAqIHRoZXJlIGFyZSBs YWdnaW5nIGJhY2tlbmRzIHRoYXQgbmVlZCB0byBiZSB3b2tlbiB1cC4gVGhlIHdvcmtlciB0 aGVuCisgKiBwZXJmb3JtcyBhIHN0YWdnZXJlZCB3YWtldXAgd2l0aCBkZWxheXMgYmV0d2Vl biBzaWduYWxzIHRvIGF2b2lkCisgKiB0aHVuZGVyaW5nIGhlcmQgZWZmZWN0cy4KKyAqCisg KiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5OTYtMjAyNSwgUG9zdGdyZVNRTCBHbG9iYWwg RGV2ZWxvcG1lbnQgR3JvdXAKKyAqIFBvcnRpb25zIENvcHlyaWdodCAoYykgMTk5NCwgUmVn ZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCisgKgorICogSURFTlRJRklD QVRJT04KKyAqCSAgc3JjL2JhY2tlbmQvcG9zdG1hc3Rlci9ub3RpZnlfYmd3b3JrZXIuYwor ICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaW5jbHVkZSAicG9zdGdyZXMuaCIK KworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVk ZSAiYWNjZXNzL3BhcmFsbGVsLmgiCisjaW5jbHVkZSAiY29tbWFuZHMvYXN5bmMuaCIKKyNp bmNsdWRlICJtaXNjYWRtaW4uaCIKKyNpbmNsdWRlICJwZ3N0YXQuaCIKKyNpbmNsdWRlICJw b3N0bWFzdGVyL2Jnd29ya2VyLmgiCisjaW5jbHVkZSAicG9zdG1hc3Rlci9pbnRlcnJ1cHQu aCIKKyNpbmNsdWRlICJwb3N0bWFzdGVyL25vdGlmeV9iZ3dvcmtlci5oIgorI2luY2x1ZGUg InN0b3JhZ2UvaXBjLmgiCisjaW5jbHVkZSAic3RvcmFnZS9sYXRjaC5oIgorI2luY2x1ZGUg InN0b3JhZ2UvbHdsb2NrLmgiCisjaW5jbHVkZSAic3RvcmFnZS9wcm9jLmgiCisjaW5jbHVk ZSAic3RvcmFnZS9wcm9jc2lnbmFsLmgiCisjaW5jbHVkZSAic3RvcmFnZS9zaG1fdG9jLmgi CisjaW5jbHVkZSAic3RvcmFnZS9zaG1lbS5oIgorI2luY2x1ZGUgInRjb3AvdGNvcHByb3Qu aCIKKyNpbmNsdWRlICJ1dGlscy9tZW11dGlscy5oIgorI2luY2x1ZGUgInV0aWxzL3BzX3N0 YXR1cy5oIgorCisvKiBDb25maWd1cmF0aW9uIGNvbnN0YW50cyAqLworI2RlZmluZSBOT1RJ RllfREVGRVJSRURfV0FLRVVQX0RFTEFZX01TIDEwMCAvKiBtaWxsaXNlY29uZHMgYmV0d2Vl biBzaWduYWxzICovCisKKy8qIEZsYWcgdG8gaW5kaWNhdGUgU0lHVVNSMSB3YXMgcmVjZWl2 ZWQgKi8KK3N0YXRpYyB2b2xhdGlsZSBzaWdfYXRvbWljX3QgZ290X3NpZ3VzcjEgPSBmYWxz ZTsKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbiAqLworc3RhdGljIHZvaWQgUHJvY2Vzc0Rl ZmVycmVkV2FrZXVwcyh2b2lkKTsKKworLyogU2lnbmFsIGhhbmRsZXIgZm9yIFNJR1VTUjEg Ki8KK3N0YXRpYyB2b2lkCitub3RpZnlfYmd3b3JrZXJfc2lndXNyMShTSUdOQUxfQVJHUykK K3sKKwlpbnQJCQlzYXZlX2Vycm5vID0gZXJybm87CisKKwlnb3Rfc2lndXNyMSA9IHRydWU7 CisJU2V0TGF0Y2goTXlMYXRjaCk7CisKKwllcnJubyA9IHNhdmVfZXJybm87Cit9CisKKy8q CisgKiBOb3RpZnlEZWZlcnJlZFdha2V1cE1haW4KKyAqCQlNYWluIGVudHJ5IHBvaW50IGZv ciB0aGUgbm90aWZ5IGRlZmVycmVkIHdha2V1cCBiYWNrZ3JvdW5kIHdvcmtlcgorICovCit2 b2lkCitOb3RpZnlEZWZlcnJlZFdha2V1cE1haW4oRGF0dW0gbWFpbl9hcmcpCit7CisJLyog RXN0YWJsaXNoIHNpZ25hbCBoYW5kbGVycyAqLworCXBxc2lnbmFsKFNJR1VTUjEsIG5vdGlm eV9iZ3dvcmtlcl9zaWd1c3IxKTsKKwlwcXNpZ25hbChTSUdURVJNLCBkaWUpOworCUJhY2tn cm91bmRXb3JrZXJVbmJsb2NrU2lnbmFscygpOworCisJLyogU3RvcmUgb3VyIFBJRCBpbiBz aGFyZWQgbWVtb3J5IGZvciBzaWduYWxpbmcgKi8KKwlBc3luY0RlZmVycmVkV2FrZXVwU2V0 V29ya2VyUGlkKE15UHJvY1BpZCk7CisKKwllcmVwb3J0KExPRywKKwkJCShlcnJtc2coIm5v dGlmeSBkZWZlcnJlZCB3YWtldXAgd29ya2VyIHN0YXJ0ZWQiKSkpOworCisJLyogTWFpbiBs b29wICovCisJZm9yICg7OykKKwl7CisJCWludAkJCXJjOworCisJCS8qIENoZWNrIGZvciBp bnRlcnJ1cHRzICovCisJCUNIRUNLX0ZPUl9JTlRFUlJVUFRTKCk7CisKKwkJLyoKKwkJICog V2FpdCBmb3Igc2lnbmFsIHRvIHdha2UgdXAuIFdlIHVzZSBXTF9MQVRDSF9TRVQgdG8gd2Fr ZSBvbiBvdXIKKwkJICogbGF0Y2ggYmVpbmcgc2V0LCBhbmQgV0xfRVhJVF9PTl9QTV9ERUFU SCB0byBlbnN1cmUgd2UgZXhpdCBpZiB0aGUKKwkJICogcG9zdG1hc3RlciBkaWVzLgorCQkg Ki8KKwkJcmMgPSBXYWl0TGF0Y2goTXlMYXRjaCwKKwkJCQkJICAgV0xfTEFUQ0hfU0VUIHwg V0xfRVhJVF9PTl9QTV9ERUFUSCwKKwkJCQkJICAgLTEsCisJCQkJCSAgIFdBSVRfRVZFTlRf Tk9USUZZX0RFRkVSUkVEX1dBS0VVUCk7CisKKwkJUmVzZXRMYXRjaChNeUxhdGNoKTsKKwor CQkvKiBFbWVyZ2VuY3kgYmFpbG91dCBpZiBwb3N0bWFzdGVyIGhhcyBkaWVkICovCisJCWlm IChyYyAmIFdMX1BPU1RNQVNURVJfREVBVEgpCisJCQlwcm9jX2V4aXQoMSk7CisKKwkJLyog UHJvY2VzcyBkZWZlcnJlZCB3YWtldXBzIGlmIHdlIHdlcmUgc2lnbmFsZWQgKi8KKwkJaWYg KGdvdF9zaWd1c3IxKQorCQl7CisJCQlnb3Rfc2lndXNyMSA9IGZhbHNlOworCQkJUHJvY2Vz c0RlZmVycmVkV2FrZXVwcygpOworCQl9CisJfQorfQorCisvKgorICogUHJvY2Vzc0RlZmVy cmVkV2FrZXVwcworICoJCVdha2UgdXAgbGFnZ2luZyBsaXN0ZW5pbmcgYmFja2VuZHMgd2l0 aCBzdGFnZ2VyZWQgZGVsYXlzCisgKgorICogVGhpcyBmdW5jdGlvbiBjb250aW51ZXMgcHJv Y2Vzc2luZyB1bnRpbCB0aGVyZSBhcmUgbm8gbW9yZSBsYWdnaW5nCisgKiBiYWNrZW5kcywg ZW5zdXJpbmcgYWxsIGJhY2tlbmRzIGV2ZW50dWFsbHkgZ2V0IHdva2VuIHVwLgorICovCitz dGF0aWMgdm9pZAorUHJvY2Vzc0RlZmVycmVkV2FrZXVwcyh2b2lkKQoreworCWludAkJCXRv dGFsX3dha2V1cF9jb3VudCA9IDA7CisKKwkvKgorCSAqIENvbnRpbnVlIHByb2Nlc3Npbmcg dW50aWwgdGhlcmUgYXJlIG5vIG1vcmUgbGFnZ2luZyBiYWNrZW5kcy4gVGhpcworCSAqIGVu c3VyZXMgd2UgaGFuZGxlIGFsbCBiYWNrZW5kcyB0aGF0IG5lZWQgd2FraW5nIHVwLCBldmVu IGlmIG5ldyBvbmVzCisJICogYmVjb21lIGxhZ2dpbmcgd2hpbGUgd2UncmUgcHJvY2Vzc2lu Zy4KKwkgKi8KKwlmb3IgKDs7KQorCXsKKwkJTGlzdAkgICAqbGFnZ2luZ19iYWNrZW5kczsK KwkJTGlzdENlbGwgICAqbGM7CisJCWludAkJCXdha2V1cF9jb3VudCA9IDA7CisKKwkJLyoK KwkJICogQnVpbGQgbGlzdCBvZiBsYWdnaW5nIGJhY2tlbmRzIHdoaWxlIGhvbGRpbmcgdGhl IGxvY2suIFdlIG5lZWQgdG8KKwkJICogYmUgcXVpY2sgaGVyZSB0byBhdm9pZCBob2xkaW5n IHRoZSBsb2NrIGZvciB0b28gbG9uZy4KKwkJICovCisJCWxhZ2dpbmdfYmFja2VuZHMgPSBB c3luY0dldExhZ2dpbmdCYWNrZW5kcygpOworCisJCWlmIChsYWdnaW5nX2JhY2tlbmRzID09 IE5JTCkKKwkJeworCQkJLyogTm8gbW9yZSBsYWdnaW5nIGJhY2tlbmRzLCB3ZSdyZSBkb25l ICovCisJCQlicmVhazsKKwkJfQorCisJCS8qIE5vdyBwZXJmb3JtIHRoZSBzdGFnZ2VyZWQg d2FrZXVwIHdpdGhvdXQgaG9sZGluZyB0aGUgbG9jayAqLworCQlmb3JlYWNoKGxjLCBsYWdn aW5nX2JhY2tlbmRzKQorCQl7CisJCQlCYWNrZW5kV2FrZXVwSW5mbyAqaW5mbyA9IChCYWNr ZW5kV2FrZXVwSW5mbyAqKSBsZmlyc3QobGMpOworCisJCQkvKiBTZW5kIHNpZ25hbCB0byB0 aGUgYmFja2VuZCAqLworCQkJaWYgKFNlbmRQcm9jU2lnbmFsKGluZm8tPnBpZCwgUFJPQ1NJ R19OT1RJRllfSU5URVJSVVBULCBpbmZvLT5wcm9jbm8pIDwgMCkKKwkJCXsKKwkJCQkvKiBC YWNrZW5kIG1pZ2h0IGhhdmUgZXhpdGVkLCBqdXN0IGxvZyBhbmQgY29udGludWUgKi8KKwkJ CQllbG9nKFdBUk5JTkcsICJjb3VsZCBub3Qgc2lnbmFsIGJhY2tlbmQgd2l0aCBQSUQgJWQ6 ICVtIiwgaW5mby0+cGlkKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQl3YWtldXBfY291 bnQrKzsKKwkJCQl0b3RhbF93YWtldXBfY291bnQrKzsKKwkJCX0KKworCQkJcGZyZWUoaW5m byk7CisKKwkJCS8qIFNsZWVwIGJldHdlZW4gc2lnbmFscyB0byBhdm9pZCB0aHVuZGVyaW5n IGhlcmQgKi8KKwkJCWlmIChsbmV4dChsYWdnaW5nX2JhY2tlbmRzLCBsYykgIT0gTlVMTCkK KwkJCXsKKwkJCQlwZ191c2xlZXAoTk9USUZZX0RFRkVSUkVEX1dBS0VVUF9ERUxBWV9NUyAq IDEwMDBMKTsKKworCQkJCS8qIENoZWNrIGZvciBpbnRlcnJ1cHRzIGJldHdlZW4gd2FrZXVw cyAqLworCQkJCUNIRUNLX0ZPUl9JTlRFUlJVUFRTKCk7CisJCQl9CisJCX0KKworCQlsaXN0 X2ZyZWUobGFnZ2luZ19iYWNrZW5kcyk7CisKKwkJaWYgKHdha2V1cF9jb3VudCA+IDApCisJ CXsKKwkJCWVyZXBvcnQoREVCVUcxLAorCQkJCQkoZXJybXNnKCJub3RpZnkgZGVmZXJyZWQg d2FrZXVwIHdvcmtlciBzaWduYWxlZCAlZCBsYWdnaW5nIGJhY2tlbmRzIGluIHRoaXMgcm91 bmQiLAorCQkJCQkJCXdha2V1cF9jb3VudCkpKTsKKwkJfQorCX0KKworCWlmICh0b3RhbF93 YWtldXBfY291bnQgPiAwKQorCXsKKwkJZXJlcG9ydChERUJVRzEsCisJCQkJKGVycm1zZygi bm90aWZ5IGRlZmVycmVkIHdha2V1cCB3b3JrZXIgc2lnbmFsZWQgJWQgbGFnZ2luZyBiYWNr ZW5kcyB0b3RhbCIsCisJCQkJCQl0b3RhbF93YWtldXBfY291bnQpKSk7CisJfQorCisJLyog Q2xlYXIgdGhlIGFjdGl2ZSBmbGFnIHRvIGluZGljYXRlIHdlJ3JlIGRvbmUgKi8KKwlBc3lu Y0RlZmVycmVkV2FrZXVwQ2xlYXJBY3RpdmUoKTsKK30KKworLyoKKyAqIE5vdGlmeURlZmVy cmVkV2FrZXVwV29ya2VyUmVnaXN0ZXIKKyAqCQlSZWdpc3RlciB0aGUgbm90aWZ5IGRlZmVy cmVkIHdha2V1cCBiYWNrZ3JvdW5kIHdvcmtlcgorICovCit2b2lkCitOb3RpZnlEZWZlcnJl ZFdha2V1cFdvcmtlclJlZ2lzdGVyKHZvaWQpCit7CisJQmFja2dyb3VuZFdvcmtlciB3b3Jr ZXI7CisKKwltZW1zZXQoJndvcmtlciwgMCwgc2l6ZW9mKEJhY2tncm91bmRXb3JrZXIpKTsK KwlzbnByaW50Zih3b3JrZXIuYmd3X25hbWUsIEJHV19NQVhMRU4sICJub3RpZnkgZGVmZXJy ZWQgd2FrZXVwIik7CisJc25wcmludGYod29ya2VyLmJnd190eXBlLCBCR1dfTUFYTEVOLCAi bm90aWZ5IGRlZmVycmVkIHdha2V1cCIpOworCXdvcmtlci5iZ3dfZmxhZ3MgPSBCR1dPUktF Ul9TSE1FTV9BQ0NFU1M7CisJd29ya2VyLmJnd19zdGFydF90aW1lID0gQmdXb3JrZXJTdGFy dF9SZWNvdmVyeUZpbmlzaGVkOworCXdvcmtlci5iZ3dfcmVzdGFydF90aW1lID0gQkdXX0RF RkFVTFRfUkVTVEFSVF9JTlRFUlZBTDsKKwlzbnByaW50Zih3b3JrZXIuYmd3X2xpYnJhcnlf bmFtZSwgTUFYUEdQQVRILCAicG9zdGdyZXMiKTsKKwlzbnByaW50Zih3b3JrZXIuYmd3X2Z1 bmN0aW9uX25hbWUsIEJHV19NQVhMRU4sICJOb3RpZnlEZWZlcnJlZFdha2V1cE1haW4iKTsK Kwl3b3JrZXIuYmd3X21haW5fYXJnID0gKERhdHVtKSAwOworCXdvcmtlci5iZ3dfbm90aWZ5 X3BpZCA9IDA7CisKKwlSZWdpc3RlckJhY2tncm91bmRXb3JrZXIoJndvcmtlcik7Cit9CmRp ZmYgLS1naXQgYS9zcmMvYmFja2VuZC9wb3N0bWFzdGVyL3Bvc3RtYXN0ZXIuYyBiL3NyYy9i YWNrZW5kL3Bvc3RtYXN0ZXIvcG9zdG1hc3Rlci5jCmluZGV4IGUxZDY0M2IwMTNkLi45NTRj M2IzNzFjMiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvcG9zdG1hc3Rlci9wb3N0bWFzdGVy LmMKKysrIGIvc3JjL2JhY2tlbmQvcG9zdG1hc3Rlci9wb3N0bWFzdGVyLmMKQEAgLTEwMiw2 ICsxMDIsNyBAQAogI2luY2x1ZGUgInBvcnQvcGdfYnN3YXAuaCIKICNpbmNsdWRlICJwb3N0 bWFzdGVyL2F1dG92YWN1dW0uaCIKICNpbmNsdWRlICJwb3N0bWFzdGVyL2Jnd29ya2VyX2lu dGVybmFscy5oIgorI2luY2x1ZGUgInBvc3RtYXN0ZXIvbm90aWZ5X2Jnd29ya2VyLmgiCiAj aW5jbHVkZSAicG9zdG1hc3Rlci9wZ2FyY2guaCIKICNpbmNsdWRlICJwb3N0bWFzdGVyL3Bv c3RtYXN0ZXIuaCIKICNpbmNsdWRlICJwb3N0bWFzdGVyL3N5c2xvZ2dlci5oIgpAQCAtOTI5 LDYgKzkzMCwxMSBAQCBQb3N0bWFzdGVyTWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQog CSAqLwogCUFwcGx5TGF1bmNoZXJSZWdpc3RlcigpOwogCisJLyoKKwkgKiBSZWdpc3RlciB0 aGUgbm90aWZ5IGRlZmVycmVkIHdha2V1cCB3b3JrZXIuCisJICovCisJTm90aWZ5RGVmZXJy ZWRXYWtldXBXb3JrZXJSZWdpc3RlcigpOworCiAJLyoKIAkgKiBwcm9jZXNzIGFueSBsaWJy YXJpZXMgdGhhdCBzaG91bGQgYmUgcHJlbG9hZGVkIGF0IHBvc3RtYXN0ZXIgc3RhcnQKIAkg Ki8KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2FjdGl2aXR5L3dhaXRfZXZlbnRf bmFtZXMudHh0IGIvc3JjL2JhY2tlbmQvdXRpbHMvYWN0aXZpdHkvd2FpdF9ldmVudF9uYW1l cy50eHQKaW5kZXggNzU1M2Y2ZWFjZWYuLmE0ZmFkYmQwNzY3IDEwMDY0NAotLS0gYS9zcmMv YmFja2VuZC91dGlscy9hY3Rpdml0eS93YWl0X2V2ZW50X25hbWVzLnR4dAorKysgYi9zcmMv YmFja2VuZC91dGlscy9hY3Rpdml0eS93YWl0X2V2ZW50X25hbWVzLnR4dApAQCAtMzY2LDYg KzM2Niw3IEBAIFN1YnRyYW5zQnVmZmVyCSJXYWl0aW5nIGZvciBJL08gb24gYSBzdWItdHJh bnNhY3Rpb24gU0xSVSBidWZmZXIuIgogTXVsdGlYYWN0T2Zmc2V0QnVmZmVyCSJXYWl0aW5n IGZvciBJL08gb24gYSBtdWx0aXhhY3Qgb2Zmc2V0IFNMUlUgYnVmZmVyLiIKIE11bHRpWGFj dE1lbWJlckJ1ZmZlcgkiV2FpdGluZyBmb3IgSS9PIG9uIGEgbXVsdGl4YWN0IG1lbWJlciBT TFJVIGJ1ZmZlci4iCiBOb3RpZnlCdWZmZXIJIldhaXRpbmcgZm9yIEkvTyBvbiBhIDxjb21t YW5kPk5PVElGWTwvY29tbWFuZD4gbWVzc2FnZSBTTFJVIGJ1ZmZlci4iCitOb3RpZnlDaGFu bmVsSGFzaAkiV2FpdGluZyB0byBhY2Nlc3MgdGhlIDxjb21tYW5kPk5PVElGWTwvY29tbWFu ZD4gY2hhbm5lbCBoYXNoIHRhYmxlLiIKIFNlcmlhbEJ1ZmZlcgkiV2FpdGluZyBmb3IgSS9P IG9uIGEgc2VyaWFsaXphYmxlIHRyYW5zYWN0aW9uIGNvbmZsaWN0IFNMUlUgYnVmZmVyLiIK IFdBTEluc2VydAkiV2FpdGluZyB0byBpbnNlcnQgV0FMIGRhdGEgaW50byBhIG1lbW9yeSBi dWZmZXIuIgogQnVmZmVyQ29udGVudAkiV2FpdGluZyB0byBhY2Nlc3MgYSBkYXRhIHBhZ2Ug aW4gbWVtb3J5LiIKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL3Bvc3RtYXN0ZXIvbm90aWZ5 X2Jnd29ya2VyLmggYi9zcmMvaW5jbHVkZS9wb3N0bWFzdGVyL25vdGlmeV9iZ3dvcmtlci5o Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi41ZDhiOThiODJhNgot LS0gL2Rldi9udWxsCisrKyBiL3NyYy9pbmNsdWRlL3Bvc3RtYXN0ZXIvbm90aWZ5X2Jnd29y a2VyLmgKQEAgLTAsMCArMSw0MCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICog bm90aWZ5X2Jnd29ya2VyLmgKKyAqCSAgRGVmZXJyZWQgd2FrZXVwIGJhY2tncm91bmQgd29y a2VyIGZvciBMSVNURU4vTk9USUZZCisgKgorICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAx OTk2LTIwMjUsIFBvc3RncmVTUUwgR2xvYmFsIERldmVsb3BtZW50IEdyb3VwCisgKiBQb3J0 aW9ucyBDb3B5cmlnaHQgKGMpIDE5OTQsIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2Yg Q2FsaWZvcm5pYQorICoKKyAqIHNyYy9pbmNsdWRlL3Bvc3RtYXN0ZXIvbm90aWZ5X2Jnd29y a2VyLmgKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2lmbmRlZiBOT1RJRllf QkdXT1JLRVJfSAorI2RlZmluZSBOT1RJRllfQkdXT1JLRVJfSAorCisjaW5jbHVkZSAic3Rv cmFnZS9wcm9jLmgiCisKKy8qIFN0cnVjdHVyZSB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0 IGEgYmFja2VuZCB0aGF0IG5lZWRzIHRvIGJlIHdva2VuIHVwICovCit0eXBlZGVmIHN0cnVj dCBCYWNrZW5kV2FrZXVwSW5mbworeworCWludDMyCQlwaWQ7CisJUHJvY051bWJlcglwcm9j bm87Cit9CQkJQmFja2VuZFdha2V1cEluZm87CisKKy8qIFdhaXQgZXZlbnQgZm9yIHRoZSBu b3RpZnkgZGVmZXJyZWQgd2FrZXVwIHdvcmtlciAqLworI2RlZmluZSBXQUlUX0VWRU5UX05P VElGWV9ERUZFUlJFRF9XQUtFVVAJUEdfV0FJVF9FWFRFTlNJT04KKworCisvKiBNYWluIGVu dHJ5IHBvaW50IGZvciB0aGUgYmFja2dyb3VuZCB3b3JrZXIgKi8KK2V4dGVybiB2b2lkIE5v dGlmeURlZmVycmVkV2FrZXVwTWFpbihEYXR1bSBtYWluX2FyZyk7CisKKy8qIFJlZ2lzdHJh dGlvbiBmdW5jdGlvbiAqLworZXh0ZXJuIHZvaWQgTm90aWZ5RGVmZXJyZWRXYWtldXBXb3Jr ZXJSZWdpc3Rlcih2b2lkKTsKKworLyogRnVuY3Rpb25zIHRvIGJlIGltcGxlbWVudGVkIGlu IGFzeW5jLmMgZm9yIHdvcmtlciBpbnRlcmFjdGlvbiAqLworZXh0ZXJuIHZvaWQgQXN5bmNE ZWZlcnJlZFdha2V1cFNldFdvcmtlclBpZChwaWRfdCBwaWQpOworZXh0ZXJuIHZvaWQgQXN5 bmNEZWZlcnJlZFdha2V1cENsZWFyQWN0aXZlKHZvaWQpOworZXh0ZXJuIExpc3QgKkFzeW5j R2V0TGFnZ2luZ0JhY2tlbmRzKHZvaWQpOworCisjZW5kaWYJCQkJCQkJLyogTk9USUZZX0JH V09SS0VSX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL3N0b3JhZ2UvbHdsb2NrbGlz dC5oIGIvc3JjL2luY2x1ZGUvc3RvcmFnZS9sd2xvY2tsaXN0LmgKaW5kZXggMDZhMWZmZDRi MDguLjI3NjhkZGY0NDE0IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9zdG9yYWdlL2x3bG9j a2xpc3QuaAorKysgYi9zcmMvaW5jbHVkZS9zdG9yYWdlL2x3bG9ja2xpc3QuaApAQCAtMTAw LDYgKzEwMCw3IEBAIFBHX0xXTE9DS1RSQU5DSEUoU1VCVFJBTlNfQlVGRkVSLCBTdWJ0cmFu c0J1ZmZlcikKIFBHX0xXTE9DS1RSQU5DSEUoTVVMVElYQUNUT0ZGU0VUX0JVRkZFUiwgTXVs dGlYYWN0T2Zmc2V0QnVmZmVyKQogUEdfTFdMT0NLVFJBTkNIRShNVUxUSVhBQ1RNRU1CRVJf QlVGRkVSLCBNdWx0aVhhY3RNZW1iZXJCdWZmZXIpCiBQR19MV0xPQ0tUUkFOQ0hFKE5PVElG WV9CVUZGRVIsIE5vdGlmeUJ1ZmZlcikKK1BHX0xXTE9DS1RSQU5DSEUoTk9USUZZX0NIQU5O RUxfSEFTSCwgTm90aWZ5Q2hhbm5lbEhhc2gpCiBQR19MV0xPQ0tUUkFOQ0hFKFNFUklBTF9C VUZGRVIsIFNlcmlhbEJ1ZmZlcikKIFBHX0xXTE9DS1RSQU5DSEUoV0FMX0lOU0VSVCwgV0FM SW5zZXJ0KQogUEdfTFdMT0NLVFJBTkNIRShCVUZGRVJfQ09OVEVOVCwgQnVmZmVyQ29udGVu dCkKLS0gCjIuNTAuMQoK --58cf2ac6de9047d7a36b1c0e5549407d--