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 1rsQmL-0070kV-2W for pgsql-hackers@arkaria.postgresql.org; Thu, 04 Apr 2024 17:21:34 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1rsQmK-009opU-8z for pgsql-hackers@arkaria.postgresql.org; Thu, 04 Apr 2024 17:21:32 +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 1rsQmJ-009oml-8Z for pgsql-hackers@lists.postgresql.org; Thu, 04 Apr 2024 17:21:31 +0000 Received: from lahtoruutu.iki.fi ([2a0b:5c81:1c1::37]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1rsQmC-000ZIy-B5 for pgsql-hackers@postgresql.org; Thu, 04 Apr 2024 17:21:30 +0000 Received: from [192.168.1.115] (dsl-hkibng22-54f8db-125.dhcp.inet.fi [84.248.219.125]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: hlinnaka) by lahtoruutu.iki.fi (Postfix) with ESMTPSA id 4V9T1C32svz49Q4F for ; Thu, 4 Apr 2024 20:21:19 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1712251279; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type; bh=awv01CTU+JQRF9E5OpY9JaNKUxbZAzVe0wCCC31zrrU=; b=XwfJx7u1zRYSE6waxc17HEe8CaWZ63aEhUGZaEp25RYHj1MEAQz/1ssf/nlvCa7Us4afhM S0RB+6On2mXGW1PEvSShJvQp+aPi+pg/hmnpYp4Wc/2OsPZNuwxQjRoGyTzqSBtnnkUWtU F0SbGV7GuWwqKGqYNXKx7HllEP/eTUDD7xoJ71pPDnnwWRpnK0cevd6Hb2a3tmD1wF2D4P FPn9hhbDFFBv/o/mifaYAOHXgQU53fUf5+cTRpSfXadHZPJ4xV/4trFW+w+HhXuUqVm8BG 2Y+cc/O7sdCl3Pnfr42/vnimC1rhwTtci0oRxJXZGAVURUACuzF9Z+LGAadR8w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1712251279; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type; bh=awv01CTU+JQRF9E5OpY9JaNKUxbZAzVe0wCCC31zrrU=; b=Ouuoc2yBG0uZaD1dm+99mVs2K9uT3K21u87lW0uYG0yoTAG4QPvIiPPW8s2Ea/F9ka+oWN rVIDRLqFEqImPB4V44xmRhYtA8SIyh+or3B97NpES6Whk2OAm20RVI2WVuRINvBd8rl8g+ FApoqBor6SowY5dOeOf4GJmhz8nKfeTEIheUt0StOxE8EvPD1kVi6fIDiN3Ts1KD0+yFMm Z8d6g1bKmGN6bFgaBfR3K7/JnZFuXmm9DYlEzLbKHA9loOkkCcKZtOVYU4lg2zsFsAup48 KCIliV4ATsM8+EWfKWYACJ2okmKwofX4exU00iQfXePHgjytECDWr/ZppelBTA== ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=hlinnaka smtp.mailfrom=hlinnaka@iki.fi ARC-Seal: i=1; s=lahtoruutu; d=iki.fi; t=1712251279; a=rsa-sha256; cv=none; b=cCi8B/HCkBLeXueGGVNoxj51Kt29lPuJNtIE38luQgumpQIP6HZXxaT6Owq4qnrHQ6Eoj/ Uz/SNR5/QuB8DjhHuybgpHlyspaz+HbUaCkVDbgVuEhKCL2G4D4PFn2IoFKMVJpJiHbjnF 4CIr6kxYM3fQClBwTli3bHTEkwGUJD3ai/lPyKplXrpErxvVrwFx4Wq3S0vaVzZtJuG/Xq VatNISDKnn1DIGs6Np5tmp88pkPZWpZ5Ty085WWhvc+FVRljZsy/rBqwpTxyO5c9XWm+TU yCLqp/4fLPQr2bRMXv/VAAlxy+T6cRY5qrypYrGsMnJfpDxGis0smIuulg1OZw== Content-Type: multipart/mixed; boundary="------------jZa0JVb0CkVqIgS8qBINceUd" Message-ID: <08da26cc-95ef-4c0e-9573-8b930f80ce27@iki.fi> Date: Thu, 4 Apr 2024 20:21:18 +0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Content-Language: en-US From: Heikki Linnakangas Subject: CSN snapshots in hot standby To: pgsql-hackers List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------jZa0JVb0CkVqIgS8qBINceUd Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit You cannot run queries on a Hot Standby server until the standby has seen a running-xacts record. Furthermore if the subxids cache had overflowed, you also need to wait for those transactions to finish. That is usually not a problem, because we write a running-xacts record after each checkpoint, and most systems don't use so many subtransactions that the cache would overflow. Still, you can run into it if you're unlucky, and it's annoying when you do. It occurred to me that we could replace the known-assigned-xids machinery with CSN snapshots. We've talked about CSN snapshots many times in the past, and I think it would make sense on the primary too, but for starters, we could use it just during Hot Standby. With CSN-based snapshots, you don't have the limitation with the fixed-size known-assigned-xids array, and overflowed sub-XIDs are not a problem either. You can always enter Hot Standby and start accepting queries as soon as the standby is in a physically consistent state. I dusted up and rebased the last CSN patch that I found on the mailing list [1], and modified it so that it's only used during recovery. That makes some things simpler and less scary. There are no changes to how transaction commit happens in the primary, the CSN log is only kept up-to-date in the standby, when commit/abort records are replayed. The CSN of each transaction is the LSN of its commit record. The CSN approach is much simpler than the existing known-assigned-XIDs machinery, as you can see from "git diff --stat" with this patch: 32 files changed, 773 insertions(+), 1711 deletions(-) With CSN snapshots, we don't need the known-assigned-XIDs machinery, and we can get rid of the xact-assignment records altogether. We no longer need the running-xacts records for Hot Standby either, but I wasn't able to remove that because it's still used by logical replication, in snapbuild.c. I have a feeling that that could somehow be simplified too, but didn't look into it. This is obviously v18 material, so I'll park this at the July commitfest for now. There are a bunch of little FIXMEs in the code, and needs performance testing, but overall I was surprised how easy this was. (We ran into this issue particularly hard with Neon, because with Neon you don't need to perform WAL replay at standby startup. However, when you don't perform WAL replay, you don't get to see the running-xact record after the checkpoint either. If the primary is idle, it doesn't generate new running-xact records, and the standby cannot start Hot Standby until the next time something happens in the primary. It's always a potential problem with overflowed sub-XIDs cache, but the lack of WAL replay made it happen even when there are no subtransactions involved.) [1] https://www.postgresql.org/message-id/2020081009525213277261%40highgo.ca -- Heikki Linnakangas Neon (https://neon.tech) --------------jZa0JVb0CkVqIgS8qBINceUd Content-Type: text/x-patch; charset=UTF-8; name="v1-0001-Use-CSN-snapshots-during-Hot-Standby.patch" Content-Disposition: attachment; filename="v1-0001-Use-CSN-snapshots-during-Hot-Standby.patch" Content-Transfer-Encoding: base64 RnJvbSAxNjkxZWVhMTRkMWQzNTkzMzk1ZGVjMmY1MTM2OTdiZjUxNDUxMzVjIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBIZWlra2kgTGlubmFrYW5nYXMgPGhlaWtraS5saW5u YWthbmdhc0Bpa2kuZmk+CkRhdGU6IEZyaSwgMjkgTWFyIDIwMjQgMTk6NTM6MTkgKzAyMDAK U3ViamVjdDogW1BBVENIIHYxIDEvMV0gVXNlIENTTiBzbmFwc2hvdHMgZHVyaW5nIEhvdCBT dGFuZGJ5CgpSZXBsYWNlIHRoZSBrbm93bi1hc3NpZ25lZC1YSURzIG1lY2hhbmlzbSB3aXRo IGEgQ1NOIGxvZy4gVGhlIENTTiBsb2cKKHBnX2NzbikgdHJhY2tzIHRoZSBjb21taXQgTFNO IG9mIGVhY2ggdHJhbnNhY3Rpb24sIHdoZW4gcmVwbGF5aW5nIHRoZQpXQUwgb24gYSBzdGFu ZGJ5LiBJdCdzIG9ubHkgdXNlZCBvbiB0aGUgc3RhbmRieSwgYW5kIGlzIGluaXRpYWxpemVk CmZyb20gc2NyYXRjaCBhdCBzZXJ2ZXIgc3RhcnR1cCBsaWtlIHBnX3N1YnRyYW5zLgoKQmFz ZWQgb24gMDAwMS1DU04tYmFzZS1zbmFwc2hvdC5wYXRjaCBmcm9tCmh0dHBzOi8vd3d3LnBv c3RncmVzcWwub3JnL21lc3NhZ2UtaWQvMjAyMDA4MTAwOTUyNTIxMzI3NzI2MSU0MGhpZ2hn by5jYS4KVGhpcyBwYXRjaCBoYXMgYSBsb25nIGxpbmVhZ2UsIHZhcmlvdXMgQ1NOIHBhdGNo ZXMgaGF2ZSBiZWVuIHBvc3RlZAp3aXRoIHBhcnRzIGZyb20gU3RhcyBLZWx2aWNoLCBNb3Zl YWQgTGksIEFudHMgQWFzbWEsIEhlaWtraQpMaW5uYWthbmdhcywgQWxleGFuZGVyIEt1em1l bmtvdgotLS0KIGNvbnRyaWIvcGdfdmlzaWJpbGl0eS9wZ192aXNpYmlsaXR5LmMgICAgICAg ICB8ICAgMTIgKy0KIHNyYy9iYWNrZW5kL2FjY2Vzcy9ybWdyZGVzYy94YWN0ZGVzYy5jICAg ICAgICB8ICAgMjYgLQogc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0vTWFrZWZpbGUgICAg ICAgICAgIHwgICAgMSArCiBzcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS9jc25fbG9nLmMg ICAgICAgICAgfCAgNDY5ICsrKysrKwogc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0vbWVz b24uYnVpbGQgICAgICAgIHwgICAgMSArCiBzcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS90 cmFuc2FtLmMgICAgICAgICAgfCAgICAzICsKIHNyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2Ft L3R3b3BoYXNlLmMgICAgICAgICB8ICAgMzQgKy0KIHNyYy9iYWNrZW5kL2FjY2Vzcy90cmFu c2FtL3ZhcnN1cC5jICAgICAgICAgICB8ICAgIDIgKwogc3JjL2JhY2tlbmQvYWNjZXNzL3Ry YW5zYW0veGFjdC5jICAgICAgICAgICAgIHwgIDEyNiArLQogc3JjL2JhY2tlbmQvYWNjZXNz L3RyYW5zYW0veGxvZy5jICAgICAgICAgICAgIHwgIDExMSArLQogc3JjL2JhY2tlbmQvYWNj ZXNzL3RyYW5zYW0veGxvZ3JlY292ZXJ5LmMgICAgIHwgICAxMyArLQogc3JjL2JhY2tlbmQv YWNjZXNzL3RyYW5zYW0veGxvZ3V0aWxzLmMgICAgICAgIHwgICAgMiArLQogc3JjL2JhY2tl bmQvcG9zdG1hc3Rlci9zdGFydHVwLmMgICAgICAgICAgICAgIHwgICAgMiArLQogc3JjL2Jh Y2tlbmQvcmVwbGljYXRpb24vbG9naWNhbC9kZWNvZGUuYyAgICAgIHwgICAgOCAtCiBzcmMv YmFja2VuZC9yZXBsaWNhdGlvbi9sb2dpY2FsL3NuYXBidWlsZC5jICAgfCAgICAyICstCiBz cmMvYmFja2VuZC9zdG9yYWdlL2lwYy9pcGNpLmMgICAgICAgICAgICAgICAgfCAgICAzICsK IHNyYy9iYWNrZW5kL3N0b3JhZ2UvaXBjL3Byb2NhcnJheS5jICAgICAgICAgICB8IDE0NTMg KystLS0tLS0tLS0tLS0tLS0KIHNyYy9iYWNrZW5kL3N0b3JhZ2UvaXBjL3N0YW5kYnkuYyAg ICAgICAgICAgICB8ICAgNDIgKy0KIHNyYy9iYWNrZW5kL3N0b3JhZ2UvbG1nci9sd2xvY2su YyAgICAgICAgICAgICB8ICAgIDIgKwogLi4uL3V0aWxzL2FjdGl2aXR5L3dhaXRfZXZlbnRf bmFtZXMudHh0ICAgICAgIHwgICAgMSArCiBzcmMvYmFja2VuZC91dGlscy9wcm9iZXMuZCAg ICAgICAgICAgICAgICAgICAgfCAgICAyICsKIHNyYy9iYWNrZW5kL3V0aWxzL3RpbWUvc25h cG1nci5jICAgICAgICAgICAgICB8ICAgMzcgKy0KIHNyYy9iaW4vaW5pdGRiL2luaXRkYi5j ICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDMgKy0KIHNyYy9pbmNsdWRlL2FjY2Vzcy9j c25fbG9nLmggICAgICAgICAgICAgICAgICB8ICAgMzAgKwogc3JjL2luY2x1ZGUvYWNjZXNz L3RyYW5zYW0uaCAgICAgICAgICAgICAgICAgIHwgICAgMyArCiBzcmMvaW5jbHVkZS9hY2Nl c3MvdHdvcGhhc2UuaCAgICAgICAgICAgICAgICAgfCAgICAzICstCiBzcmMvaW5jbHVkZS9h Y2Nlc3MveGFjdC5oICAgICAgICAgICAgICAgICAgICAgfCAgIDEyICstCiBzcmMvaW5jbHVk ZS9hY2Nlc3MveGxvZ3V0aWxzLmggICAgICAgICAgICAgICAgfCAgIDMzICstCiBzcmMvaW5j bHVkZS9zdG9yYWdlL2x3bG9jay5oICAgICAgICAgICAgICAgICAgfCAgICAyICsKIHNyYy9p bmNsdWRlL3N0b3JhZ2UvcHJvY2FycmF5LmggICAgICAgICAgICAgICB8ICAgMTMgKy0KIHNy Yy9pbmNsdWRlL3N0b3JhZ2Uvc3RhbmRieS5oICAgICAgICAgICAgICAgICB8ICAgMjYgKy0K IHNyYy9pbmNsdWRlL3V0aWxzL3NuYXBzaG90LmggICAgICAgICAgICAgICAgICB8ICAgIDcg KwogMzIgZmlsZXMgY2hhbmdlZCwgNzczIGluc2VydGlvbnMoKyksIDE3MTEgZGVsZXRpb25z KC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0vY3Nu X2xvZy5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL2luY2x1ZGUvYWNjZXNzL2Nzbl9sb2cu aAoKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcGdfdmlzaWJpbGl0eS9wZ192aXNpYmlsaXR5LmMg Yi9jb250cmliL3BnX3Zpc2liaWxpdHkvcGdfdmlzaWJpbGl0eS5jCmluZGV4IDFhMWE0ZmY3 YmU3Li5jYjBjNDljN2E0NCAxMDA2NDQKLS0tIGEvY29udHJpYi9wZ192aXNpYmlsaXR5L3Bn X3Zpc2liaWxpdHkuYworKysgYi9jb250cmliL3BnX3Zpc2liaWxpdHkvcGdfdmlzaWJpbGl0 eS5jCkBAIC01NTgsMTUgKzU1OCwxMCBAQCBjb2xsZWN0X3Zpc2liaWxpdHlfZGF0YShPaWQg cmVsaWQsIGJvb2wgaW5jbHVkZV9wZCkKIHN0YXRpYyBUcmFuc2FjdGlvbklkCiBHZXRTdHJp Y3RPbGRlc3ROb25SZW1vdmFibGVUcmFuc2FjdGlvbklkKFJlbGF0aW9uIHJlbCkKIHsKLQlS dW5uaW5nVHJhbnNhY3Rpb25zIHJ1bm5pbmdUcmFuc2FjdGlvbnM7Ci0KIAlpZiAocmVsID09 IE5VTEwgfHwgcmVsLT5yZF9yZWwtPnJlbGlzc2hhcmVkIHx8IFJlY292ZXJ5SW5Qcm9ncmVz cygpKQogCXsKIAkJLyogU2hhcmVkIHJlbGF0aW9uOiB0YWtlIGludG8gYWNjb3VudCBhbGwg cnVubmluZyB4aWRzICovCi0JCXJ1bm5pbmdUcmFuc2FjdGlvbnMgPSBHZXRSdW5uaW5nVHJh bnNhY3Rpb25EYXRhKCk7Ci0JCUxXTG9ja1JlbGVhc2UoUHJvY0FycmF5TG9jayk7Ci0JCUxX TG9ja1JlbGVhc2UoWGlkR2VuTG9jayk7Ci0JCXJldHVybiBydW5uaW5nVHJhbnNhY3Rpb25z LT5vbGRlc3RSdW5uaW5nWGlkOworCQlyZXR1cm4gR2V0T2xkZXN0QWN0aXZlVHJhbnNhY3Rp b25JZCh0cnVlKTsKIAl9CiAJZWxzZSBpZiAoIVJFTEFUSU9OX0lTX0xPQ0FMKHJlbCkpCiAJ ewpAQCAtNTc0LDEwICs1NjksNyBAQCBHZXRTdHJpY3RPbGRlc3ROb25SZW1vdmFibGVUcmFu c2FjdGlvbklkKFJlbGF0aW9uIHJlbCkKIAkJICogTm9ybWFsIHJlbGF0aW9uOiB0YWtlIGlu dG8gYWNjb3VudCB4aWRzIHJ1bm5pbmcgd2l0aGluIHRoZSBjdXJyZW50CiAJCSAqIGRhdGFi YXNlCiAJCSAqLwotCQlydW5uaW5nVHJhbnNhY3Rpb25zID0gR2V0UnVubmluZ1RyYW5zYWN0 aW9uRGF0YSgpOwotCQlMV0xvY2tSZWxlYXNlKFByb2NBcnJheUxvY2spOwotCQlMV0xvY2tS ZWxlYXNlKFhpZEdlbkxvY2spOwotCQlyZXR1cm4gcnVubmluZ1RyYW5zYWN0aW9ucy0+b2xk ZXN0RGF0YWJhc2VSdW5uaW5nWGlkOworCQlyZXR1cm4gR2V0T2xkZXN0QWN0aXZlVHJhbnNh Y3Rpb25JZChmYWxzZSk7CiAJfQogCWVsc2UKIAl7CmRpZmYgLS1naXQgYS9zcmMvYmFja2Vu ZC9hY2Nlc3Mvcm1ncmRlc2MveGFjdGRlc2MuYyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9ybWdy ZGVzYy94YWN0ZGVzYy5jCmluZGV4IDQxYjg0MmQ4MGVjLi5jMWMzOTc0YWM5YiAxMDA2NDQK LS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL3JtZ3JkZXNjL3hhY3RkZXNjLmMKKysrIGIvc3Jj L2JhY2tlbmQvYWNjZXNzL3JtZ3JkZXNjL3hhY3RkZXNjLmMKQEAgLTQyMSwxNyArNDIxLDYg QEAgeGFjdF9kZXNjX3ByZXBhcmUoU3RyaW5nSW5mbyBidWYsIHVpbnQ4IGluZm8sIHhsX3hh Y3RfcHJlcGFyZSAqeGxyZWMsIFJlcE9yaWdpbkkKIAkJCQkJCSB0aW1lc3RhbXB0el90b19z dHIocGFyc2VkLm9yaWdpbl90aW1lc3RhbXApKTsKIH0KIAotc3RhdGljIHZvaWQKLXhhY3Rf ZGVzY19hc3NpZ25tZW50KFN0cmluZ0luZm8gYnVmLCB4bF94YWN0X2Fzc2lnbm1lbnQgKnhs cmVjKQotewotCWludAkJCWk7Ci0KLQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKGJ1ZiwgInN1 YnhhY3RzOiIpOwotCi0JZm9yIChpID0gMDsgaSA8IHhscmVjLT5uc3VieGFjdHM7IGkrKykK LQkJYXBwZW5kU3RyaW5nSW5mbyhidWYsICIgJXUiLCB4bHJlYy0+eHN1YltpXSk7Ci19Ci0K IHZvaWQKIHhhY3RfZGVzYyhTdHJpbmdJbmZvIGJ1ZiwgWExvZ1JlYWRlclN0YXRlICpyZWNv cmQpCiB7CkBAIC00NTksMTggKzQ0OCw2IEBAIHhhY3RfZGVzYyhTdHJpbmdJbmZvIGJ1Ziwg WExvZ1JlYWRlclN0YXRlICpyZWNvcmQpCiAJCXhhY3RfZGVzY19wcmVwYXJlKGJ1ZiwgWExv Z1JlY0dldEluZm8ocmVjb3JkKSwgeGxyZWMsCiAJCQkJCQkgIFhMb2dSZWNHZXRPcmlnaW4o cmVjb3JkKSk7CiAJfQotCWVsc2UgaWYgKGluZm8gPT0gWExPR19YQUNUX0FTU0lHTk1FTlQp Ci0JewotCQl4bF94YWN0X2Fzc2lnbm1lbnQgKnhscmVjID0gKHhsX3hhY3RfYXNzaWdubWVu dCAqKSByZWM7Ci0KLQkJLyoKLQkJICogTm90ZSB0aGF0IHdlIGlnbm9yZSB0aGUgV0FMIHJl Y29yZCdzIHhpZCwgc2luY2Ugd2UncmUgbW9yZQotCQkgKiBpbnRlcmVzdGVkIGluIHRoZSB0 b3AtbGV2ZWwgeGlkIHRoYXQgaXNzdWVkIHRoZSByZWNvcmQgYW5kIHdoaWNoCi0JCSAqIHhp ZHMgYXJlIGJlaW5nIHJlcG9ydGVkIGhlcmUuCi0JCSAqLwotCQlhcHBlbmRTdHJpbmdJbmZv KGJ1ZiwgInh0b3AgJXU6ICIsIHhscmVjLT54dG9wKTsKLQkJeGFjdF9kZXNjX2Fzc2lnbm1l bnQoYnVmLCB4bHJlYyk7Ci0JfQogCWVsc2UgaWYgKGluZm8gPT0gWExPR19YQUNUX0lOVkFM SURBVElPTlMpCiAJewogCQl4bF94YWN0X2ludmFscyAqeGxyZWMgPSAoeGxfeGFjdF9pbnZh bHMgKikgcmVjOwpAQCAtNTAyLDkgKzQ3OSw2IEBAIHhhY3RfaWRlbnRpZnkodWludDggaW5m bykKIAkJY2FzZSBYTE9HX1hBQ1RfQUJPUlRfUFJFUEFSRUQ6CiAJCQlpZCA9ICJBQk9SVF9Q UkVQQVJFRCI7CiAJCQlicmVhazsKLQkJY2FzZSBYTE9HX1hBQ1RfQVNTSUdOTUVOVDoKLQkJ CWlkID0gIkFTU0lHTk1FTlQiOwotCQkJYnJlYWs7CiAJCWNhc2UgWExPR19YQUNUX0lOVkFM SURBVElPTlM6CiAJCQlpZCA9ICJJTlZBTElEQVRJT04iOwogCQkJYnJlYWs7CmRpZmYgLS1n aXQgYS9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS9NYWtlZmlsZSBiL3NyYy9iYWNrZW5k L2FjY2Vzcy90cmFuc2FtL01ha2VmaWxlCmluZGV4IDY2MWM1NWE5ZGI3Li4yNTIwZDc3Yzdj OCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0vTWFrZWZpbGUKKysr IGIvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0vTWFrZWZpbGUKQEAgLTE1LDYgKzE1LDcg QEAgaW5jbHVkZSAkKHRvcF9idWlsZGRpcikvc3JjL01ha2VmaWxlLmdsb2JhbAogT0JKUyA9 IFwKIAljbG9nLm8gXAogCWNvbW1pdF90cy5vIFwKKwljc25fbG9nLm8gXAogCWdlbmVyaWNf eGxvZy5vIFwKIAltdWx0aXhhY3QubyBcCiAJcGFyYWxsZWwubyBcCmRpZmYgLS1naXQgYS9z cmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS9jc25fbG9nLmMgYi9zcmMvYmFja2VuZC9hY2Nl c3MvdHJhbnNhbS9jc25fbG9nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw MDAwMDAuLmZjYWYzYTNiY2E0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2JhY2tlbmQvYWNj ZXNzL3RyYW5zYW0vY3NuX2xvZy5jCkBAIC0wLDAgKzEsNDY5IEBACisvKi0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCisgKgorICogY3NuX2xvZy5jCisgKgkJVHJhY2sgY29tbWl0IHNlcXVl bmNlIG51bWJlcnMgb2YgZmluaXNoZWQgdHJhbnNhY3Rpb25zCisgKgorICogVGhpcyBtb2R1 bGUgcHJvdmlkZXMgU0xSVSB0byBzdG9yZSBDU04gZm9yIGVhY2ggdHJhbnNhY3Rpb24uICBU aGlzCisgKiBtYXBwaW5nIG5lZWQgdG8gYmUga2VwdCBvbmx5IGZvciB4aWQncyBncmVhdGVy IHRoZW4gb2xkZXN0WGlkLCBidXQKKyAqIHRoYXQgY2FuIHJlcXVpcmUgYXJiaXRyYXJ5IGxh cmdlIGFtb3VudHMgb2YgbWVtb3J5IGluIGNhc2Ugb2YgbG9uZy1saXZlZAorICogdHJhbnNh Y3Rpb25zLiAgQmVjYXVzZSBvZiBzYW1lIGxpZmV0aW1lIGFuZCBwZXJzaXN0YW5jeSByZXF1 aXJlbWVudHMKKyAqIHRoaXMgbW9kdWxlIGlzIHF1aXRlIHNpbWlsYXIgdG8gc3VidHJhbnMu YworICoKKyAqIFBvcnRpb25zIENvcHlyaWdodCAoYykgMTk5Ni0yMDE4LCBQb3N0Z3JlU1FM IEdsb2JhbCBEZXZlbG9wbWVudCBHcm91cAorICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAx OTk0LCBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKKyAqCisgKiBz cmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS9jc25fbG9nLmMKKyAqCisgKi0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJwb3N0Z3Jlcy5oIgorCisjaW5jbHVkZSAi YWNjZXNzL2Nsb2cuaCIKKyNpbmNsdWRlICJhY2Nlc3MvY3NuX2xvZy5oIgorI2luY2x1ZGUg ImFjY2Vzcy9zbHJ1LmgiCisjaW5jbHVkZSAiYWNjZXNzL3N1YnRyYW5zLmgiCisjaW5jbHVk ZSAiYWNjZXNzL3RyYW5zYW0uaCIKKyNpbmNsdWRlICJtaXNjYWRtaW4uaCIKKyNpbmNsdWRl ICJwZ190cmFjZS5oIgorI2luY2x1ZGUgInV0aWxzL3NuYXBtZ3IuaCIKKworLyoKKyAqIERl ZmluZXMgZm9yIENTTkxvZyBwYWdlIHNpemVzLiAgQSBwYWdlIGlzIHRoZSBzYW1lIEJMQ0tT WiBhcyBpcyB1c2VkCisgKiBldmVyeXdoZXJlIGVsc2UgaW4gUG9zdGdyZXMuCisgKgorICog Tm90ZTogYmVjYXVzZSBUcmFuc2FjdGlvbklkcyBhcmUgMzIgYml0cyBhbmQgd3JhcCBhcm91 bmQgYXQgMHhGRkZGRkZGRiwKKyAqIENTTkxvZyBwYWdlIG51bWJlcmluZyBhbHNvIHdyYXBz IGFyb3VuZCBhdAorICogMHhGRkZGRkZGRi9DU05fTE9HX1hBQ1RTX1BFUl9QQUdFLCBhbmQg Q1NOTG9nIHNlZ21lbnQgbnVtYmVyaW5nIGF0CisgKiAweEZGRkZGRkZGL0NMT0dfWEFDVFNf UEVSX1BBR0UvU0xSVV9QQUdFU19QRVJfU0VHTUVOVC4gIFdlIG5lZWQgdGFrZSBubworICog ZXhwbGljaXQgbm90aWNlIG9mIHRoYXQgZmFjdCBpbiB0aGlzIG1vZHVsZSwgZXhjZXB0IHdo ZW4gY29tcGFyaW5nIHNlZ21lbnQKKyAqIGFuZCBwYWdlIG51bWJlcnMgaW4gVHJ1bmNhdGVD U05Mb2cgKHNlZSBDU05Mb2dQYWdlUHJlY2VkZXMpLgorICovCisKKy8qIFdlIHN0b3JlIHRo ZSBjb21taXQgQ1NOIGZvciBlYWNoIHhpZCAqLworI2RlZmluZSBDU05fTE9HX1hBQ1RTX1BF Ul9QQUdFIChCTENLU1ogLyBzaXplb2YoWExvZ1JlY1B0cikpCisKKyNkZWZpbmUgVHJhbnNh Y3Rpb25JZFRvUGFnZSh4aWQpCSgoeGlkKSAvIChUcmFuc2FjdGlvbklkKSBDU05fTE9HX1hB Q1RTX1BFUl9QQUdFKQorI2RlZmluZSBUcmFuc2FjdGlvbklkVG9QZ0luZGV4KHhpZCkgKCh4 aWQpICUgKFRyYW5zYWN0aW9uSWQpIENTTl9MT0dfWEFDVFNfUEVSX1BBR0UpCisKKyNkZWZp bmUgUGdJbmRleFRvVHJhbnNhY3Rpb25JZChwYWdlbm8sIGlkeCkgKENTTl9MT0dfWEFDVFNf UEVSX1BBR0UgKiAocGFnZW5vKSArIGlkeCkKKworCisKKy8qCisgKiBMaW5rIHRvIHNoYXJl ZC1tZW1vcnkgZGF0YSBzdHJ1Y3R1cmVzIGZvciBDTE9HIGNvbnRyb2wKKyAqLworc3RhdGlj IFNscnVDdGxEYXRhIENTTkxvZ0N0bERhdGE7CisjZGVmaW5lIENzbmxvZ0N0bCAoJkNTTkxv Z0N0bERhdGEpCisKK3N0YXRpYyBpbnQJWmVyb0NTTkxvZ1BhZ2UoaW50IHBhZ2Vubyk7Citz dGF0aWMgYm9vbCBDU05Mb2dQYWdlUHJlY2VkZXMoaW50NjQgcGFnZTEsIGludDY0IHBhZ2Uy KTsKK3N0YXRpYyB2b2lkIENTTkxvZ1NldFBhZ2VTdGF0dXMoVHJhbnNhY3Rpb25JZCB4aWQs IGludCBuc3VieGlkcywKKwkJCQkJCQkJCSAgVHJhbnNhY3Rpb25JZCAqc3VieGlkcywKKwkJ CQkJCQkJCSAgWExvZ1JlY1B0ciBjc24sIGludCBwYWdlbm8pOworc3RhdGljIHZvaWQgQ1NO TG9nU2V0Q1NOSW5TbG90KFRyYW5zYWN0aW9uSWQgeGlkLCBYTG9nUmVjUHRyIGNzbiwKKwkJ CQkJCQkJCSAgaW50IHNsb3Rubyk7CisKKworLyoKKyAqIENTTkxvZ1NldENTTgorICoKKyAq IFJlY29yZCBYaWRDU04gb2YgdHJhbnNhY3Rpb24gYW5kIGl0cyBzdWJ0cmFuc2FjdGlvbiB0 cmVlLgorICoKKyAqIHhpZCBpcyBhIHNpbmdsZSB4aWQgdG8gc2V0IHN0YXR1cyBmb3IuIFRo aXMgd2lsbCB0eXBpY2FsbHkgYmUgdGhlIHRvcCBsZXZlbAorICogdHJhbnNhY3Rpb25pZCBm b3IgYSB0b3AgbGV2ZWwgY29tbWl0IG9yIGFib3J0LiBJdCBjYW4gYWxzbyBiZSBhCisgKiBz dWJ0cmFuc2FjdGlvbiB3aGVuIHdlIHJlY29yZCB0cmFuc2FjdGlvbiBhYm9ydHMuCisgKgor ICogc3VieGlkcyBpcyBhbiBhcnJheSBvZiB4aWRzIG9mIGxlbmd0aCBuc3VieGlkcywgcmVw cmVzZW50aW5nIHN1YnRyYW5zYWN0aW9ucworICogaW4gdGhlIHRyZWUgb2YgeGlkLiBJbiB2 YXJpb3VzIGNhc2VzIG5zdWJ4aWRzIG1heSBiZSB6ZXJvLgorICoKKyAqIGNzbiBpcyB0aGUg Y29tbWl0IHNlcXVlbmNlIG51bWJlciBvZiB0aGUgdHJhbnNhY3Rpb24uIEl0IHNob3VsZCBi ZQorICogQWJvcnRlZENTTiBmb3IgYWJvcnQgY2FzZXMuCisgKi8KK3ZvaWQKK0NTTkxvZ1Nl dENTTihUcmFuc2FjdGlvbklkIHhpZCwgaW50IG5zdWJ4aWRzLAorCQkJCQkgVHJhbnNhY3Rp b25JZCAqc3VieGlkcywgWExvZ1JlY1B0ciBjc24pCit7CisJaW50CQkJcGFnZW5vOworCWlu dAkJCWkgPSAwOworCWludAkJCW9mZnNldCA9IDA7CisKKwlBc3NlcnQoVHJhbnNhY3Rpb25J ZElzVmFsaWQoeGlkKSk7CisKKwlwYWdlbm8gPSBUcmFuc2FjdGlvbklkVG9QYWdlKHhpZCk7 CQkvKiBnZXQgcGFnZSBvZiBwYXJlbnQgKi8KKwlmb3IgKDs7KQorCXsKKwkJaW50CQkJbnVt X29uX3BhZ2UgPSAwOworCisJCXdoaWxlIChpIDwgbnN1YnhpZHMgJiYgVHJhbnNhY3Rpb25J ZFRvUGFnZShzdWJ4aWRzW2ldKSA9PSBwYWdlbm8pCisJCXsKKwkJCW51bV9vbl9wYWdlKys7 CisJCQlpKys7CisJCX0KKworCQlDU05Mb2dTZXRQYWdlU3RhdHVzKHhpZCwKKwkJCQkJCQlu dW1fb25fcGFnZSwgc3VieGlkcyArIG9mZnNldCwKKwkJCQkJCQljc24sIHBhZ2Vubyk7CisJ CWlmIChpID49IG5zdWJ4aWRzKQorCQkJYnJlYWs7CisKKwkJb2Zmc2V0ID0gaTsKKwkJcGFn ZW5vID0gVHJhbnNhY3Rpb25JZFRvUGFnZShzdWJ4aWRzW29mZnNldF0pOworCQl4aWQgPSBJ bnZhbGlkVHJhbnNhY3Rpb25JZDsKKwl9Cit9CisKKy8qCisgKiBSZWNvcmQgdGhlIGZpbmFs IHN0YXRlIG9mIHRyYW5zYWN0aW9uIGVudHJpZXMgaW4gdGhlIGNzbiBsb2cgZm9yCisgKiBh bGwgZW50cmllcyBvbiBhIHNpbmdsZSBwYWdlLiAgQXRvbWljIG9ubHkgb24gdGhpcyBwYWdl LgorICoKKyAqIE90aGVyd2lzZSBBUEkgaXMgc2FtZSBhcyBUcmFuc2FjdGlvbklkU2V0VHJl ZVN0YXR1cygpCisgKi8KK3N0YXRpYyB2b2lkCitDU05Mb2dTZXRQYWdlU3RhdHVzKFRyYW5z YWN0aW9uSWQgeGlkLCBpbnQgbnN1YnhpZHMsCisJCQkJCQkgICBUcmFuc2FjdGlvbklkICpz dWJ4aWRzLAorCQkJCQkJICAgWExvZ1JlY1B0ciBjc24sIGludCBwYWdlbm8pCit7CisJaW50 CQkJc2xvdG5vOworCWludAkJCWk7CisJTFdMb2NrCSAgICpsb2NrOworCisJbG9jayA9IFNp bXBsZUxydUdldEJhbmtMb2NrKENzbmxvZ0N0bCwgcGFnZW5vKTsKKwlMV0xvY2tBY3F1aXJl KGxvY2ssIExXX0VYQ0xVU0lWRSk7CisKKwlzbG90bm8gPSBTaW1wbGVMcnVSZWFkUGFnZShD c25sb2dDdGwsIHBhZ2VubywgdHJ1ZSwgeGlkKTsKKworCS8qIFN1YnRyYW5zYWN0aW9ucyBm aXJzdCwgaWYgbmVlZGVkIC4uLiAqLworCWZvciAoaSA9IDA7IGkgPCBuc3VieGlkczsgaSsr KQorCXsKKwkJQXNzZXJ0KENzbmxvZ0N0bC0+c2hhcmVkLT5wYWdlX251bWJlcltzbG90bm9d ID09IFRyYW5zYWN0aW9uSWRUb1BhZ2Uoc3VieGlkc1tpXSkpOworCQlDU05Mb2dTZXRDU05J blNsb3Qoc3VieGlkc1tpXSwJY3NuLCBzbG90bm8pOworCX0KKworCS8qIC4uLiB0aGVuIHRo ZSBtYWluIHRyYW5zYWN0aW9uICovCisJaWYgKFRyYW5zYWN0aW9uSWRJc1ZhbGlkKHhpZCkp CisJCUNTTkxvZ1NldENTTkluU2xvdCh4aWQsIGNzbiwgc2xvdG5vKTsKKworCUNzbmxvZ0N0 bC0+c2hhcmVkLT5wYWdlX2RpcnR5W3Nsb3Rub10gPSB0cnVlOworCisJTFdMb2NrUmVsZWFz ZShsb2NrKTsKK30KKworLyoKKyAqIFNldHMgdGhlIGNvbW1pdCBzdGF0dXMgb2YgYSBzaW5n bGUgdHJhbnNhY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkCitDU05Mb2dTZXRDU05JblNsb3Qo VHJhbnNhY3Rpb25JZCB4aWQsIFhMb2dSZWNQdHIgY3NuLCBpbnQgc2xvdG5vKQoreworCWlu dAkJCWVudHJ5bm8gPSBUcmFuc2FjdGlvbklkVG9QZ0luZGV4KHhpZCk7CisJWExvZ1JlY1B0 ciAqcHRyOworCisJcHRyID0gKFhMb2dSZWNQdHIgKikgKENzbmxvZ0N0bC0+c2hhcmVkLT5w YWdlX2J1ZmZlcltzbG90bm9dICsgZW50cnlubyAqIHNpemVvZihYTG9nUmVjUHRyKSk7CisK KwkqcHRyID0gY3NuOworfQorCisvKgorICogSW50ZXJyb2dhdGUgdGhlIHN0YXRlIG9mIGEg dHJhbnNhY3Rpb24gaW4gdGhlIGxvZy4KKyAqCisgKiBOQjogdGhpcyBpcyBhIGxvdy1sZXZl bCByb3V0aW5lIGFuZCBpcyBOT1QgdGhlIHByZWZlcnJlZCBlbnRyeSBwb2ludAorICogZm9y IG1vc3QgdXNlczsgVHJhbnNhY3Rpb25JZEdldFhpZENTTigpIGluIGNzbl9zbmFwc2hvdC5j IGlzIHRoZQorICogaW50ZW5kZWQgY2FsbGVyLgorICovCitYTG9nUmVjUHRyCitDU05Mb2dH ZXRDU05CeVhpZChUcmFuc2FjdGlvbklkIHhpZCkKK3sKKwlpbnQJCQlwYWdlbm8gPSBUcmFu c2FjdGlvbklkVG9QYWdlKHhpZCk7CisJaW50CQkJZW50cnlubyA9IFRyYW5zYWN0aW9uSWRU b1BnSW5kZXgoeGlkKTsKKwlpbnQJCQlzbG90bm87CisJWExvZ1JlY1B0ciAqcHRyOworCVhM b2dSZWNQdHIJeGlkX2NzbjsKKworCUFzc2VydChUcmFuc2FjdGlvbklkSXNWYWxpZCh4aWQp KTsKKworCS8qIENhbid0IGFzayBhYm91dCBzdHVmZiB0aGF0IG1pZ2h0IG5vdCBiZSBhcm91 bmQgYW55bW9yZSAqLworCUFzc2VydChUcmFuc2FjdGlvbklkRm9sbG93c09yRXF1YWxzKHhp ZCwgVHJhbnNhY3Rpb25YbWluKSk7CisKKwkvKiBsb2NrIGlzIGFjcXVpcmVkIGJ5IFNpbXBs ZUxydVJlYWRQYWdlX1JlYWRPbmx5ICovCisKKwlzbG90bm8gPSBTaW1wbGVMcnVSZWFkUGFn ZV9SZWFkT25seShDc25sb2dDdGwsIHBhZ2VubywgeGlkKTsKKwlwdHIgPSAoWExvZ1JlY1B0 ciAqKSAoQ3NubG9nQ3RsLT5zaGFyZWQtPnBhZ2VfYnVmZmVyW3Nsb3Rub10gKyBlbnRyeW5v ICogc2l6ZW9mKFhMb2dSZWNQdHIpKTsKKwl4aWRfY3NuID0gKnB0cjsKKworCUxXTG9ja1Jl bGVhc2UoU2ltcGxlTHJ1R2V0QmFua0xvY2soQ3NubG9nQ3RsLCBwYWdlbm8pKTsKKworCXJl dHVybiB4aWRfY3NuOworfQorCisvKgorICogTnVtYmVyIG9mIHNoYXJlZCBDU05Mb2cgYnVm ZmVycy4KKyAqLworc3RhdGljIFNpemUKK0NTTkxvZ1NobWVtQnVmZmVycyh2b2lkKQorewor CXJldHVybiBNaW4oMzIsIE1heCgxNiwgTkJ1ZmZlcnMgLyA1MTIpKTsKK30KKworLyoKKyAq IFJlc2VydmUgc2hhcmVkIG1lbW9yeSBmb3IgQ3NubG9nQ3RsLgorICovCitTaXplCitDU05M b2dTaG1lbVNpemUodm9pZCkKK3sKKwkvLyBGSVhNRTogc2tpcCBpZiBub3QgSW5Ib3RTdGFu ZGJ5PworCXJldHVybiBTaW1wbGVMcnVTaG1lbVNpemUoQ1NOTG9nU2htZW1CdWZmZXJzKCks IDApOworfQorCisvKgorICogSW5pdGlhbGl6YXRpb24gb2Ygc2hhcmVkIG1lbW9yeSBmb3Ig Q1NOTG9nLgorICovCit2b2lkCitDU05Mb2dTaG1lbUluaXQodm9pZCkKK3sKKwlDc25sb2dD dGwtPlBhZ2VQcmVjZWRlcyA9IENTTkxvZ1BhZ2VQcmVjZWRlczsKKwlTaW1wbGVMcnVJbml0 KENzbmxvZ0N0bCwgIkNTTkxvZyBDdGwiLCBDU05Mb2dTaG1lbUJ1ZmZlcnMoKSwgMCwKKwkJ CQkgICJwZ19jc24iLCBMV1RSQU5DSEVfQ1NOX0xPR19CVUZGRVIsCisJCQkJICBMV1RSQU5D SEVfQ1NOX0xPR19TTFJVLCBTWU5DX0hBTkRMRVJfTk9ORSwgZmFsc2UpOworCS8vU2xydVBh Z2VQcmVjZWRlc1VuaXRUZXN0cyhDc25sb2dDdGwsIFNVQlRSQU5TX1hBQ1RTX1BFUl9QQUdF KTsKK30KKworLyoKKyAqIFRoaXMgZnVuYyBtdXN0IGJlIGNhbGxlZCBPTkNFIG9uIHN5c3Rl bSBpbnN0YWxsLiAgSXQgY3JlYXRlcyB0aGUgaW5pdGlhbAorICogQ1NOTG9nIHNlZ21lbnQu ICBUaGUgcGdfY3NuIGRpcmVjdG9yeSBpcyBhc3N1bWVkIHRvIGhhdmUgYmVlbgorICogY3Jl YXRlZCBieSBpbml0ZGIsIGFuZCBDU05Mb2dTaG1lbUluaXQgbXVzdCBoYXZlIGJlZW4gY2Fs bGVkIGFscmVhZHkuCisgKgorICogTm90ZTogaXQncyBub3QgcmVhbGx5IG5lY2Vzc2FyeSB0 byBjcmVhdGUgdGhlIGluaXRpYWwgc2VnbWVudCBub3csCisgKiBzaW5jZSBzbHJ1LmMgd291 bGQgY3JlYXRlIGl0IG9uIGZpcnN0IHdyaXRlIGFueXdheS4gIEJ1dCB3ZSBtYXkgYXMgd2Vs bAorICogZG8gaXQgdG8gYmUgc3VyZSB0aGUgZGlyZWN0b3J5IGlzIHNldCB1cCBjb3JyZWN0 bHkuCisgKi8KK3ZvaWQKK0Jvb3RTdHJhcENTTkxvZyh2b2lkKQoreworCWludAkJCXNsb3Ru bzsKKwlMV0xvY2sJICAgKmxvY2s7CisKKwlsb2NrID0gU2ltcGxlTHJ1R2V0QmFua0xvY2so Q3NubG9nQ3RsLCAwKTsKKwlMV0xvY2tBY3F1aXJlKGxvY2ssIExXX0VYQ0xVU0lWRSk7CisK KwkvKiBDcmVhdGUgYW5kIHplcm8gdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIGNvbW1pdCBsb2cg Ki8KKwlzbG90bm8gPSBaZXJvQ1NOTG9nUGFnZSgwKTsKKworCS8qIE1ha2Ugc3VyZSBpdCdz IHdyaXR0ZW4gb3V0ICovCisJU2ltcGxlTHJ1V3JpdGVQYWdlKENzbmxvZ0N0bCwgc2xvdG5v KTsKKwlBc3NlcnQoIUNzbmxvZ0N0bC0+c2hhcmVkLT5wYWdlX2RpcnR5W3Nsb3Rub10pOwor CisJTFdMb2NrUmVsZWFzZShsb2NrKTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgKG9yIHJl aW5pdGlhbGl6ZSkgYSBwYWdlIG9mIENTTkxvZyB0byB6ZXJvZXMuCisgKgorICogVGhlIHBh Z2UgaXMgbm90IGFjdHVhbGx5IHdyaXR0ZW4sIGp1c3Qgc2V0IHVwIGluIHNoYXJlZCBtZW1v cnkuCisgKiBUaGUgc2xvdCBudW1iZXIgb2YgdGhlIG5ldyBwYWdlIGlzIHJldHVybmVkLgor ICoKKyAqIENvbnRyb2wgbG9jayBtdXN0IGJlIGhlbGQgYXQgZW50cnksIGFuZCB3aWxsIGJl IGhlbGQgYXQgZXhpdC4KKyAqLworc3RhdGljIGludAorWmVyb0NTTkxvZ1BhZ2UoaW50IHBh Z2VubykKK3sKKwlyZXR1cm4gU2ltcGxlTHJ1WmVyb1BhZ2UoQ3NubG9nQ3RsLCBwYWdlbm8p OworfQorCisvKgorICogSW5pdGlhbGl6ZSBhIHBhZ2Ugb2YgQ1NOTG9nIGJhc2VkIG9uIHBn X3hhY3QuCisgKgorICovCitzdGF0aWMgdm9pZAorSW5pdENTTkxvZ1BhZ2UoaW50IHBhZ2Vu bywgVHJhbnNhY3Rpb25JZCAqeGlkLCBUcmFuc2FjdGlvbklkIG5leHRYaWQsIFhMb2dSZWNQ dHIgY3NuKQoreworCVhMb2dSZWNQdHIJZHVtbXk7CisJaW50CQkJc2xvdG5vOworCisJc2xv dG5vID0gWmVyb0NTTkxvZ1BhZ2UocGFnZW5vKTsKKworCXdoaWxlICgqeGlkIDwgbmV4dFhp ZCAmJiBUcmFuc2FjdGlvbklkVG9QYWdlKCp4aWQpID09IHBhZ2VubykKKwl7CisJCVhpZFN0 YXR1cyBzdGF0dXMgPSBUcmFuc2FjdGlvbklkR2V0U3RhdHVzKCp4aWQsICZkdW1teSk7CisJ CWlmIChzdGF0dXMgPT0gVFJBTlNBQ1RJT05fU1RBVFVTX0NPTU1JVFRFRCB8fAorCQkJc3Rh dHVzID09IFRSQU5TQUNUSU9OX1NUQVRVU19BQk9SVEVEKQorCQkJQ1NOTG9nU2V0Q1NOSW5T bG90KCp4aWQsIGNzbiwgc2xvdG5vKTsKKworCQlUcmFuc2FjdGlvbklkQWR2YW5jZSgqeGlk KTsKKwl9CisJU2ltcGxlTHJ1WmVyb1BhZ2UoQ3NubG9nQ3RsLCBwYWdlbm8pOworfQorCisv KgorICogVGhpcyBtdXN0IGJlIGNhbGxlZCBPTkNFIGR1cmluZyBwb3N0bWFzdGVyIG9yIHN0 YW5kYWxvbmUtYmFja2VuZCBzdGFydHVwLAorICogYWZ0ZXIgU3RhcnR1cFhMT0cgaGFzIGlu aXRpYWxpemVkIFNobWVtVmFyaWFibGVDYWNoZS0+bmV4dFhpZC4KKyAqCisgKiBvbGRlc3RB Y3RpdmVYSUQgaXMgdGhlIG9sZGVzdCBYSUQgb2YgYW55IHByZXBhcmVkIHRyYW5zYWN0aW9u LCBvciBuZXh0WGlkCisgKiBpZiB0aGVyZSBhcmUgbm9uZS4KKyAqCisgKiBBbGwgdHJhbnNh Y3Rpb25zIHRoYXQgaGF2ZSBhbHJlYWR5IGNvbXBsZXRlZCBhcmUgbWFya2VkIHdpdGggJ2Nz bicuCisgKi8KK3ZvaWQKK1N0YXJ0dXBDU05Mb2coVHJhbnNhY3Rpb25JZCBvbGRlc3RBY3Rp dmVYSUQsIFhMb2dSZWNQdHIgY3NuKQoreworCVRyYW5zYWN0aW9uSWQgeGlkOworCUZ1bGxU cmFuc2FjdGlvbklkIG5leHRYaWQ7CisJaW50CQkJc3RhcnRQYWdlOworCWludAkJCWVuZFBh Z2U7CisJTFdMb2NrCSAgICpwcmV2bG9jayA9IE5VTEw7CisJTFdMb2NrCSAgICpsb2NrOwor CisJLyoKKwkgKiBTaW5jZSB3ZSBkb24ndCBleHBlY3QgcGdfY3NuIHRvIGJlIHZhbGlkIGFj cm9zcyBjcmFzaGVzLCB3ZQorCSAqIGluaXRpYWxpemUgdGhlIGN1cnJlbnRseS1hY3RpdmUg cGFnZShzKSB0byB6ZXJvZXMgZHVyaW5nIHN0YXJ0dXAuCisJICogV2hlbmV2ZXIgd2UgYWR2 YW5jZSBpbnRvIGEgbmV3IHBhZ2UsIEV4dGVuZENTTkxvZyB3aWxsIGxpa2V3aXNlCisJICog emVybyB0aGUgbmV3IHBhZ2Ugd2l0aG91dCByZWdhcmQgdG8gd2hhdGV2ZXIgd2FzIHByZXZp b3VzbHkgb24gZGlzay4KKwkgKi8KKwlzdGFydFBhZ2UgPSBUcmFuc2FjdGlvbklkVG9QYWdl KG9sZGVzdEFjdGl2ZVhJRCk7CisJbmV4dFhpZCA9IFRyYW5zYW1WYXJpYWJsZXMtPm5leHRY aWQ7CisJZW5kUGFnZSA9IFRyYW5zYWN0aW9uSWRUb1BhZ2UoWGlkRnJvbUZ1bGxUcmFuc2Fj dGlvbklkKG5leHRYaWQpKTsKKworCUFzc2VydChUcmFuc2FjdGlvbklkSXNWYWxpZChvbGRl c3RBY3RpdmVYSUQpKTsKKwlBc3NlcnQoRnVsbFRyYW5zYWN0aW9uSWRJc1ZhbGlkKG5leHRY aWQpKTsKKworCXhpZCA9IG9sZGVzdEFjdGl2ZVhJRDsKKwlmb3IgKDs7KQorCXsKKwkJbG9j ayA9IFNpbXBsZUxydUdldEJhbmtMb2NrKENzbmxvZ0N0bCwgc3RhcnRQYWdlKTsKKwkJaWYg KHByZXZsb2NrICE9IGxvY2spCisJCXsKKwkJCWlmIChwcmV2bG9jaykKKwkJCQlMV0xvY2tS ZWxlYXNlKHByZXZsb2NrKTsKKwkJCUxXTG9ja0FjcXVpcmUobG9jaywgTFdfRVhDTFVTSVZF KTsKKwkJCXByZXZsb2NrID0gbG9jazsKKwkJfQorCisJCUluaXRDU05Mb2dQYWdlKHN0YXJ0 UGFnZSwgJnhpZCwgWGlkRnJvbUZ1bGxUcmFuc2FjdGlvbklkKG5leHRYaWQpLCBjc24pOwor CQlpZiAoc3RhcnRQYWdlID09IGVuZFBhZ2UpCisJCQlicmVhazsKKworCQlzdGFydFBhZ2Ur KzsKKwkJLyogbXVzdCBhY2NvdW50IGZvciB3cmFwYXJvdW5kICovCisJCWlmIChzdGFydFBh Z2UgPiBUcmFuc2FjdGlvbklkVG9QYWdlKE1heFRyYW5zYWN0aW9uSWQpKQorCQkJc3RhcnRQ YWdlID0gMDsKKwl9CisKKwlMV0xvY2tSZWxlYXNlKGxvY2spOworfQorCisvKgorICogVGhp cyBtdXN0IGJlIGNhbGxlZCBPTkNFIGR1cmluZyBwb3N0bWFzdGVyIG9yIHN0YW5kYWxvbmUt YmFja2VuZCBzaHV0ZG93bgorICovCit2b2lkCitTaHV0ZG93bkNTTkxvZyh2b2lkKQorewor CS8qCisJICogRmx1c2ggZGlydHkgQ1NOTG9nIHBhZ2VzIHRvIGRpc2suCisJICoKKwkgKiBU aGlzIGlzIG5vdCBhY3R1YWxseSBuZWNlc3NhcnkgZnJvbSBhIGNvcnJlY3RuZXNzIHBvaW50 IG9mIHZpZXcuIFdlIGRvCisJICogaXQgbWVyZWx5IGFzIGEgZGVidWdnaW5nIGFpZC4KKwkg Ki8KKwlUUkFDRV9QT1NUR1JFU1FMX0NTTkxPR19DSEVDS1BPSU5UX1NUQVJUKGZhbHNlKTsK KwlTaW1wbGVMcnVXcml0ZUFsbChDc25sb2dDdGwsIGZhbHNlKTsKKwlUUkFDRV9QT1NUR1JF U1FMX0NTTkxPR19DSEVDS1BPSU5UX0RPTkUoZmFsc2UpOworfQorCisvKgorICogUGVyZm9y bSBhIGNoZWNrcG9pbnQgLS0tIGVpdGhlciBkdXJpbmcgc2h1dGRvd24sIG9yIG9uLXRoZS1m bHkKKyAqLwordm9pZAorQ2hlY2tQb2ludENTTkxvZyh2b2lkKQoreworCS8qCisJICogRmx1 c2ggZGlydHkgQ1NOTG9nIHBhZ2VzIHRvIGRpc2suCisJICoKKwkgKiBUaGlzIGlzIG5vdCBh Y3R1YWxseSBuZWNlc3NhcnkgZnJvbSBhIGNvcnJlY3RuZXNzIHBvaW50IG9mIHZpZXcuIFdl IGRvCisJICogaXQgbWVyZWx5IHRvIGltcHJvdmUgdGhlIG9kZHMgdGhhdCB3cml0aW5nIG9m IGRpcnR5IHBhZ2VzIGlzIGRvbmUgYnkKKwkgKiB0aGUgY2hlY2twb2ludCBwcm9jZXNzIGFu ZCBub3QgYnkgYmFja2VuZHMuCisJICovCisJVFJBQ0VfUE9TVEdSRVNRTF9DU05MT0dfQ0hF Q0tQT0lOVF9TVEFSVCh0cnVlKTsKKwlTaW1wbGVMcnVXcml0ZUFsbChDc25sb2dDdGwsIHRy dWUpOworCVRSQUNFX1BPU1RHUkVTUUxfQ1NOTE9HX0NIRUNLUE9JTlRfRE9ORSh0cnVlKTsK K30KKworLyoKKyAqIE1ha2Ugc3VyZSB0aGF0IENTTkxvZyBoYXMgcm9vbSBmb3IgYSBuZXds eS1hbGxvY2F0ZWQgWElELgorICoKKyAqIE5COiB0aGlzIGlzIGNhbGxlZCB3aGlsZSBob2xk aW5nIFhpZEdlbkxvY2suICBXZSB3YW50IGl0IHRvIGJlIHZlcnkgZmFzdAorICogbW9zdCBv ZiB0aGUgdGltZTsgZXZlbiB3aGVuIGl0J3Mgbm90IHNvIGZhc3QsIG5vIGFjdHVhbCBJL08g bmVlZCBoYXBwZW4KKyAqIHVubGVzcyB3ZSdyZSBmb3JjZWQgdG8gd3JpdGUgb3V0IGEgZGly dHkgY2xvZyBvciB4bG9nIHBhZ2UgdG8gbWFrZSByb29tCisgKiBpbiBzaGFyZWQgbWVtb3J5 LgorICovCit2b2lkCitFeHRlbmRDU05Mb2coVHJhbnNhY3Rpb25JZCBuZXdlc3RYYWN0KQor eworCWludDY0CQlwYWdlbm87CisJTFdMb2NrCSAgICpsb2NrOworCisJLyoKKwkgKiBObyB3 b3JrIGV4Y2VwdCBhdCBmaXJzdCBYSUQgb2YgYSBwYWdlLiAgQnV0IGJld2FyZToganVzdCBh ZnRlcgorCSAqIHdyYXBhcm91bmQsIHRoZSBmaXJzdCBYSUQgb2YgcGFnZSB6ZXJvIGlzIEZp cnN0Tm9ybWFsVHJhbnNhY3Rpb25JZC4KKwkgKi8KKwlpZiAoVHJhbnNhY3Rpb25JZFRvUGdJ bmRleChuZXdlc3RYYWN0KSAhPSAwICYmCisJCSFUcmFuc2FjdGlvbklkRXF1YWxzKG5ld2Vz dFhhY3QsIEZpcnN0Tm9ybWFsVHJhbnNhY3Rpb25JZCkpCisJCXJldHVybjsKKworCXBhZ2Vu byA9IFRyYW5zYWN0aW9uSWRUb1BhZ2UobmV3ZXN0WGFjdCk7CisKKwlsb2NrID0gU2ltcGxl THJ1R2V0QmFua0xvY2soQ3NubG9nQ3RsLCBwYWdlbm8pOworCisJTFdMb2NrQWNxdWlyZShs b2NrLCBMV19FWENMVVNJVkUpOworCisJLyogWmVybyB0aGUgcGFnZSBhbmQgbWFrZSBhbiBY TE9HIGVudHJ5IGFib3V0IGl0ICovCisJWmVyb0NTTkxvZ1BhZ2UocGFnZW5vKTsKKworCUxX TG9ja1JlbGVhc2UobG9jayk7Cit9CisKKy8qCisgKiBSZW1vdmUgYWxsIENTTkxvZyBzZWdt ZW50cyBiZWZvcmUgdGhlIG9uZSBob2xkaW5nIHRoZSBwYXNzZWQKKyAqIHRyYW5zYWN0aW9u IElELgorICoKKyAqIFRoaXMgaXMgbm9ybWFsbHkgY2FsbGVkIGR1cmluZyBjaGVja3BvaW50 LCB3aXRoIG9sZGVzdFhhY3QgYmVpbmcgdGhlCisgKiBvbGRlc3QgVHJhbnNhY3Rpb25YbWlu IG9mIGFueSBydW5uaW5nIHRyYW5zYWN0aW9uLgorICovCit2b2lkCitUcnVuY2F0ZUNTTkxv ZyhUcmFuc2FjdGlvbklkIG9sZGVzdFhhY3QpCit7CisJaW50CQkJY3V0b2ZmUGFnZTsKKwor CS8qCisJICogVGhlIGN1dG9mZiBwb2ludCBpcyB0aGUgc3RhcnQgb2YgdGhlIHNlZ21lbnQg Y29udGFpbmluZyBvbGRlc3RYYWN0LiBXZQorCSAqIHBhc3MgdGhlICpwYWdlKiBjb250YWlu aW5nIG9sZGVzdFhhY3QgdG8gU2ltcGxlTHJ1VHJ1bmNhdGUuIFdlIHN0ZXAKKwkgKiBiYWNr IG9uZSB0cmFuc2FjdGlvbiB0byBhdm9pZCBwYXNzaW5nIGEgY3V0b2ZmIHBhZ2UgdGhhdCBo YXNuJ3QgYmVlbgorCSAqIGNyZWF0ZWQgeWV0IGluIHRoZSByYXJlIGNhc2UgdGhhdCBvbGRl c3RYYWN0IHdvdWxkIGJlIHRoZSBmaXJzdCBpdGVtIG9uCisJICogYSBwYWdlIGFuZCBvbGRl c3RYYWN0ID09IG5leHQgWElELiAgSW4gdGhhdCBjYXNlLCBpZiB3ZSBkaWRuJ3Qgc3VidHJh Y3QKKwkgKiBvbmUsIHdlJ2QgdHJpZ2dlciBTaW1wbGVMcnVUcnVuY2F0ZSdzIHdyYXBhcm91 bmQgZGV0ZWN0aW9uLgorCSAqLworCVRyYW5zYWN0aW9uSWRSZXRyZWF0KG9sZGVzdFhhY3Qp OworCWN1dG9mZlBhZ2UgPSBUcmFuc2FjdGlvbklkVG9QYWdlKG9sZGVzdFhhY3QpOworCisJ U2ltcGxlTHJ1VHJ1bmNhdGUoQ3NubG9nQ3RsLCBjdXRvZmZQYWdlKTsKK30KKworLyoKKyAq IERlY2lkZSB3aGljaCBvZiB0d28gQ1NOTG9nIHBhZ2UgbnVtYmVycyBpcyAib2xkZXIiIGZv ciB0cnVuY2F0aW9uCisgKiBwdXJwb3Nlcy4KKyAqCisgKiBXZSBuZWVkIHRvIHVzZSBjb21w YXJpc29uIG9mIFRyYW5zYWN0aW9uSWRzIGhlcmUgaW4gb3JkZXIgdG8gZG8gdGhlIHJpZ2h0 CisgKiB0aGluZyB3aXRoIHdyYXBhcm91bmQgWElEIGFyaXRobWV0aWMuICBIb3dldmVyLCBp ZiB3ZSBhcmUgYXNrZWQgYWJvdXQKKyAqIHBhZ2UgbnVtYmVyIHplcm8sIHdlIGRvbid0IHdh bnQgdG8gaGFuZCBJbnZhbGlkVHJhbnNhY3Rpb25JZCB0bworICogVHJhbnNhY3Rpb25JZFBy ZWNlZGVzOiBpdCdsbCBnZXQgd2VpcmQgYWJvdXQgcGVybWFuZW50IHhhY3QgSURzLiAgU28s CisgKiBvZmZzZXQgYm90aCB4aWRzIGJ5IEZpcnN0Tm9ybWFsVHJhbnNhY3Rpb25JZCB0byBh dm9pZCB0aGF0LgorICovCitzdGF0aWMgYm9vbAorQ1NOTG9nUGFnZVByZWNlZGVzKGludDY0 IHBhZ2UxLCBpbnQ2NCBwYWdlMikKK3sKKwlUcmFuc2FjdGlvbklkIHhpZDE7CisJVHJhbnNh Y3Rpb25JZCB4aWQyOworCisJeGlkMSA9ICgoVHJhbnNhY3Rpb25JZCkgcGFnZTEpICogQ1NO X0xPR19YQUNUU19QRVJfUEFHRTsKKwl4aWQxICs9IEZpcnN0Tm9ybWFsVHJhbnNhY3Rpb25J ZDsKKwl4aWQyID0gKChUcmFuc2FjdGlvbklkKSBwYWdlMikgKiBDU05fTE9HX1hBQ1RTX1BF Ul9QQUdFOworCXhpZDIgKz0gRmlyc3ROb3JtYWxUcmFuc2FjdGlvbklkOworCisJcmV0dXJu IFRyYW5zYWN0aW9uSWRQcmVjZWRlcyh4aWQxLCB4aWQyKTsKK30KZGlmZiAtLWdpdCBhL3Ny Yy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL21lc29uLmJ1aWxkIGIvc3JjL2JhY2tlbmQvYWNj ZXNzL3RyYW5zYW0vbWVzb24uYnVpbGQKaW5kZXggOGEzNTIyNTU3Y2QuLmNmNDFkZjI5NzFm IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS9tZXNvbi5idWlsZAor KysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS9tZXNvbi5idWlsZApAQCAtMiw2ICsy LDcgQEAKIAogYmFja2VuZF9zb3VyY2VzICs9IGZpbGVzKAogICAnY2xvZy5jJywKKyAgJ2Nz bl9sb2cuYycsCiAgICdjb21taXRfdHMuYycsCiAgICdnZW5lcmljX3hsb2cuYycsCiAgICdt dWx0aXhhY3QuYycsCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS90 cmFuc2FtLmMgYi9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS90cmFuc2FtLmMKaW5kZXgg NzViNTMyNWRmOGIuLjJkYjE3ZmE2OTI4IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9hY2Nl c3MvdHJhbnNhbS90cmFuc2FtLmMKKysrIGIvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0v dHJhbnNhbS5jCkBAIC0zNzcsNiArMzc3LDkgQEAgVHJhbnNhY3Rpb25JZExhdGVzdChUcmFu c2FjdGlvbklkIG1haW54aWQsCiAgKiBBbHNvLCBiZWNhdXNlIHdlIGdyb3VwIHRyYW5zYWN0 aW9ucyBvbiB0aGUgc2FtZSBjbG9nIHBhZ2UgdG8gY29uc2VydmUKICAqIHN0b3JhZ2UsIHdl IG1pZ2h0IHJldHVybiB0aGUgTFNOIG9mIGEgbGF0ZXIgdHJhbnNhY3Rpb24gdGhhdCBmYWxs cyBpbnRvCiAgKiB0aGUgc2FtZSBncm91cC4KKyAqCisgKiBYWFg6IE5vdyB0aGF0IHdlIGhh dmUgQ1NOLWxvZywgc2hvdWxkIHdlIHVzZSB0aGF0IGR1cmluZyByZWNvdmVyeT8gT3IKKyAq IHJlbmFtZSB0aGlzIGZ1bmN0aW9uIHRvIHJlZHVjZSBjb25mdXNpb24uCiAgKi8KIFhMb2dS ZWNQdHIKIFRyYW5zYWN0aW9uSWRHZXRDb21taXRMU04oVHJhbnNhY3Rpb25JZCB4aWQpCmRp ZmYgLS1naXQgYS9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS90d29waGFzZS5jIGIvc3Jj L2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0vdHdvcGhhc2UuYwppbmRleCA4MDkwYWM5ZmMxOS4u OTliMWY0Zjg5NzkgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3R3 b3BoYXNlLmMKKysrIGIvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0vdHdvcGhhc2UuYwpA QCAtNzcsNiArNzcsNyBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaW5jbHVkZSAiYWNj ZXNzL2NvbW1pdF90cy5oIgorI2luY2x1ZGUgImFjY2Vzcy9jc25fbG9nLmgiCiAjaW5jbHVk ZSAiYWNjZXNzL2h0dXBfZGV0YWlscy5oIgogI2luY2x1ZGUgImFjY2Vzcy9zdWJ0cmFucy5o IgogI2luY2x1ZGUgImFjY2Vzcy90cmFuc2FtLmgiCkBAIC0xOTUzLDIwICsxOTU0LDEzIEBA IHJlc3RvcmVUd29QaGFzZURhdGEodm9pZCkKICAqIE91ciBvdGhlciByZXNwb25zaWJpbGl0 eSBpcyB0byBkZXRlcm1pbmUgYW5kIHJldHVybiB0aGUgb2xkZXN0IHZhbGlkIFhJRAogICog YW1vbmcgdGhlIHByZXBhcmVkIHhhY3RzIChpZiBub25lLCByZXR1cm4gVHJhbnNhbVZhcmlh Ymxlcy0+bmV4dFhpZCkuCiAgKiBUaGlzIGlzIG5lZWRlZCB0byBzeW5jaHJvbml6ZSBwZ19z dWJ0cmFucyBzdGFydHVwIHByb3Blcmx5LgotICoKLSAqIElmIHhpZHNfcCBhbmQgbnhpZHNf cCBhcmUgbm90IE5VTEwsIHBvaW50ZXIgdG8gYSBwYWxsb2MnZCBhcnJheSBvZiBhbGwKLSAq IHRvcC1sZXZlbCB4aWRzIGlzIHN0b3JlZCBpbiAqeGlkc19wLiBUaGUgbnVtYmVyIG9mIGVu dHJpZXMgaW4gdGhlIGFycmF5Ci0gKiBpcyByZXR1cm5lZCBpbiAqbnhpZHNfcC4KICAqLwog VHJhbnNhY3Rpb25JZAotUHJlc2NhblByZXBhcmVkVHJhbnNhY3Rpb25zKFRyYW5zYWN0aW9u SWQgKip4aWRzX3AsIGludCAqbnhpZHNfcCkKK1ByZXNjYW5QcmVwYXJlZFRyYW5zYWN0aW9u cyh2b2lkKQogewogCUZ1bGxUcmFuc2FjdGlvbklkIG5leHRYaWQgPSBUcmFuc2FtVmFyaWFi bGVzLT5uZXh0WGlkOwogCVRyYW5zYWN0aW9uSWQgb3JpZ05leHRYaWQgPSBYaWRGcm9tRnVs bFRyYW5zYWN0aW9uSWQobmV4dFhpZCk7CiAJVHJhbnNhY3Rpb25JZCByZXN1bHQgPSBvcmln TmV4dFhpZDsKLQlUcmFuc2FjdGlvbklkICp4aWRzID0gTlVMTDsKLQlpbnQJCQlueGlkcyA9 IDA7Ci0JaW50CQkJYWxsb2NzaXplID0gMDsKIAlpbnQJCQlpOwogCiAJTFdMb2NrQWNxdWly ZShUd29QaGFzZVN0YXRlTG9jaywgTFdfRVhDTFVTSVZFKTsKQEAgLTE5OTQsMzQgKzE5ODgs MTAgQEAgUHJlc2NhblByZXBhcmVkVHJhbnNhY3Rpb25zKFRyYW5zYWN0aW9uSWQgKip4aWRz X3AsIGludCAqbnhpZHNfcCkKIAkJaWYgKFRyYW5zYWN0aW9uSWRQcmVjZWRlcyh4aWQsIHJl c3VsdCkpCiAJCQlyZXN1bHQgPSB4aWQ7CiAKLQkJaWYgKHhpZHNfcCkKLQkJewotCQkJaWYg KG54aWRzID09IGFsbG9jc2l6ZSkKLQkJCXsKLQkJCQlpZiAobnhpZHMgPT0gMCkKLQkJCQl7 Ci0JCQkJCWFsbG9jc2l6ZSA9IDEwOwotCQkJCQl4aWRzID0gcGFsbG9jKGFsbG9jc2l6ZSAq IHNpemVvZihUcmFuc2FjdGlvbklkKSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJ CWFsbG9jc2l6ZSA9IGFsbG9jc2l6ZSAqIDI7Ci0JCQkJCXhpZHMgPSByZXBhbGxvYyh4aWRz LCBhbGxvY3NpemUgKiBzaXplb2YoVHJhbnNhY3Rpb25JZCkpOwotCQkJCX0KLQkJCX0KLQkJ CXhpZHNbbnhpZHMrK10gPSB4aWQ7Ci0JCX0KLQogCQlwZnJlZShidWYpOwogCX0KIAlMV0xv Y2tSZWxlYXNlKFR3b1BoYXNlU3RhdGVMb2NrKTsKIAotCWlmICh4aWRzX3ApCi0JewotCQkq eGlkc19wID0geGlkczsKLQkJKm54aWRzX3AgPSBueGlkczsKLQl9Ci0KIAlyZXR1cm4gcmVz dWx0OwogfQogCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS92YXJz dXAuYyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3ZhcnN1cC5jCmluZGV4IGZiNmE4 NmFmY2IxLi5mMTE2MmZmMTM5MyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL3Ry YW5zYW0vdmFyc3VwLmMKKysrIGIvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0vdmFyc3Vw LmMKQEAgLTE1LDYgKzE1LDcgQEAKIAogI2luY2x1ZGUgImFjY2Vzcy9jbG9nLmgiCiAjaW5j bHVkZSAiYWNjZXNzL2NvbW1pdF90cy5oIgorI2luY2x1ZGUgImFjY2Vzcy9jc25fbG9nLmgi CiAjaW5jbHVkZSAiYWNjZXNzL3N1YnRyYW5zLmgiCiAjaW5jbHVkZSAiYWNjZXNzL3RyYW5z YW0uaCIKICNpbmNsdWRlICJhY2Nlc3MveGFjdC5oIgpAQCAtMjAyLDYgKzIwMyw3IEBAIEdl dE5ld1RyYW5zYWN0aW9uSWQoYm9vbCBpc1N1YlhhY3QpCiAJICogRXh0ZW5kIHBnX3N1YnRy YW5zIGFuZCBwZ19jb21taXRfdHMgdG9vLgogCSAqLwogCUV4dGVuZENMT0coeGlkKTsKKwlF eHRlbmRDU05Mb2coeGlkKTsKIAlFeHRlbmRDb21taXRUcyh4aWQpOwogCUV4dGVuZFNVQlRS QU5TKHhpZCk7CiAKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hh Y3QuYyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hhY3QuYwppbmRleCBkZjVhNjdl NGMzMS4uNTQ1Njk1NDYwMjUgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFu c2FtL3hhY3QuYworKysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94YWN0LmMKQEAg LTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgImFjY2Vz cy9jb21taXRfdHMuaCIKKyNpbmNsdWRlICJhY2Nlc3MvY3NuX2xvZy5oIgogI2luY2x1ZGUg ImFjY2Vzcy9tdWx0aXhhY3QuaCIKICNpbmNsdWRlICJhY2Nlc3MvcGFyYWxsZWwuaCIKICNp bmNsdWRlICJhY2Nlc3Mvc3VidHJhbnMuaCIKQEAgLTIwNyw3ICsyMDgsNiBAQCB0eXBlZGVm IHN0cnVjdCBUcmFuc2FjdGlvblN0YXRlRGF0YQogCWludAkJCXByZXZTZWNDb250ZXh0OyAv KiBwcmV2aW91cyBTZWN1cml0eVJlc3RyaWN0aW9uQ29udGV4dCAqLwogCWJvb2wJCXByZXZY YWN0UmVhZE9ubHk7CS8qIGVudHJ5LXRpbWUgeGFjdCByL28gc3RhdGUgKi8KIAlib29sCQlz dGFydGVkSW5SZWNvdmVyeTsJLyogZGlkIHdlIHN0YXJ0IGluIHJlY292ZXJ5PyAqLwotCWJv b2wJCWRpZExvZ1hpZDsJCS8qIGhhcyB4aWQgYmVlbiBpbmNsdWRlZCBpbiBXQUwgcmVjb3Jk PyAqLwogCWludAkJCXBhcmFsbGVsTW9kZUxldmVsOwkvKiBFbnRlci9FeGl0UGFyYWxsZWxN b2RlIGNvdW50ZXIgKi8KIAlib29sCQlwYXJhbGxlbENoaWxkWGFjdDsJLyogaXMgYW55IHBh cmVudCB0cmFuc2FjdGlvbiBwYXJhbGxlbD8gKi8KIAlib29sCQljaGFpbjsJCQkvKiBzdGFy dCBhIG5ldyBibG9jayBhZnRlciB0aGlzIG9uZSAqLwpAQCAtMjQ3LDEzICsyNDcsNiBAQCBz dGF0aWMgVHJhbnNhY3Rpb25TdGF0ZURhdGEgVG9wVHJhbnNhY3Rpb25TdGF0ZURhdGEgPSB7 CiAJLnRvcFhpZExvZ2dlZCA9IGZhbHNlLAogfTsKIAotLyoKLSAqIHVucmVwb3J0ZWRYaWRz IGhvbGRzIFhJRHMgb2YgYWxsIHN1YnRyYW5zYWN0aW9ucyB0aGF0IGhhdmUgbm90IHlldCBi ZWVuCi0gKiByZXBvcnRlZCBpbiBhbiBYTE9HX1hBQ1RfQVNTSUdOTUVOVCByZWNvcmQuCi0g Ki8KLXN0YXRpYyBpbnQJblVucmVwb3J0ZWRYaWRzOwotc3RhdGljIFRyYW5zYWN0aW9uSWQg dW5yZXBvcnRlZFhpZHNbUEdQUk9DX01BWF9DQUNIRURfU1VCWElEU107Ci0KIHN0YXRpYyBU cmFuc2FjdGlvblN0YXRlIEN1cnJlbnRUcmFuc2FjdGlvblN0YXRlID0gJlRvcFRyYW5zYWN0 aW9uU3RhdGVEYXRhOwogCiAvKgpAQCAtNTI5LDE4ICs1MjIsNiBAQCBHZXRDdXJyZW50RnVs bFRyYW5zYWN0aW9uSWRJZkFueSh2b2lkKQogCXJldHVybiBDdXJyZW50VHJhbnNhY3Rpb25T dGF0ZS0+ZnVsbFRyYW5zYWN0aW9uSWQ7CiB9CiAKLS8qCi0gKglNYXJrQ3VycmVudFRyYW5z YWN0aW9uSWRMb2dnZWRJZkFueQotICoKLSAqIFJlbWVtYmVyIHRoYXQgdGhlIGN1cnJlbnQg eGlkIC0gaWYgaXQgaXMgYXNzaWduZWQgLSBub3cgaGFzIGJlZW4gd2FsIGxvZ2dlZC4KLSAq Lwotdm9pZAotTWFya0N1cnJlbnRUcmFuc2FjdGlvbklkTG9nZ2VkSWZBbnkodm9pZCkKLXsK LQlpZiAoRnVsbFRyYW5zYWN0aW9uSWRJc1ZhbGlkKEN1cnJlbnRUcmFuc2FjdGlvblN0YXRl LT5mdWxsVHJhbnNhY3Rpb25JZCkpCi0JCUN1cnJlbnRUcmFuc2FjdGlvblN0YXRlLT5kaWRM b2dYaWQgPSB0cnVlOwotfQotCiAvKgogICogSXNTdWJ4YWN0VG9wWGlkTG9nUGVuZGluZwog ICoKQEAgLTYzMyw3ICs2MTQsNiBAQCBBc3NpZ25UcmFuc2FjdGlvbklkKFRyYW5zYWN0aW9u U3RhdGUgcykKIHsKIAlib29sCQlpc1N1YlhhY3QgPSAocy0+cGFyZW50ICE9IE5VTEwpOwog CVJlc291cmNlT3duZXIgY3VycmVudE93bmVyOwotCWJvb2wJCWxvZ191bmtub3duX3RvcCA9 IGZhbHNlOwogCiAJLyogQXNzZXJ0IHRoYXQgY2FsbGVyIGRpZG4ndCBzY3JldyB1cCAqLwog CUFzc2VydCghRnVsbFRyYW5zYWN0aW9uSWRJc1ZhbGlkKHMtPmZ1bGxUcmFuc2FjdGlvbklk KSk7CkBAIC02NzcsMjAgKzY1Nyw2IEBAIEFzc2lnblRyYW5zYWN0aW9uSWQoVHJhbnNhY3Rp b25TdGF0ZSBzKQogCQlwZnJlZShwYXJlbnRzKTsKIAl9CiAKLQkvKgotCSAqIFdoZW4gd2Fs X2xldmVsPWxvZ2ljYWwsIGd1YXJhbnRlZSB0aGF0IGEgc3VidHJhbnNhY3Rpb24ncyB4aWQg Y2FuIG9ubHkKLQkgKiBiZSBzZWVuIGluIHRoZSBXQUwgc3RyZWFtIGlmIGl0cyB0b3BsZXZl bCB4aWQgaGFzIGJlZW4gbG9nZ2VkIGJlZm9yZS4KLQkgKiBJZiBuZWNlc3Nhcnkgd2UgbG9n IGFuIHhhY3RfYXNzaWdubWVudCByZWNvcmQgd2l0aCBmZXdlciB0aGFuCi0JICogUEdQUk9D X01BWF9DQUNIRURfU1VCWElEUy4gTm90ZSB0aGF0IGl0IGlzIGZpbmUgaWYgZGlkTG9nWGlk IGlzbid0IHNldAotCSAqIGZvciBhIHRyYW5zYWN0aW9uIGV2ZW4gdGhvdWdoIGl0IGFwcGVh cnMgaW4gYSBXQUwgcmVjb3JkLCB3ZSBqdXN0IG1pZ2h0Ci0JICogc3VwZXJmbHVvdXNseSBs b2cgc29tZXRoaW5nLiBUaGF0IGNhbiBoYXBwZW4gd2hlbiBhbiB4aWQgaXMgaW5jbHVkZWQK LQkgKiBzb21ld2hlcmUgaW5zaWRlIGEgd2FsIHJlY29yZCwgYnV0IG5vdCBpbiBYTG9nUmVj b3JkLT54bF94aWQsIGxpa2UgaW4KLQkgKiB4bF9zdGFuZGJ5X2xvY2tzLgotCSAqLwotCWlm IChpc1N1YlhhY3QgJiYgWExvZ0xvZ2ljYWxJbmZvQWN0aXZlKCkgJiYKLQkJIVRvcFRyYW5z YWN0aW9uU3RhdGVEYXRhLmRpZExvZ1hpZCkKLQkJbG9nX3Vua25vd25fdG9wID0gdHJ1ZTsK LQogCS8qCiAJICogR2VuZXJhdGUgYSBuZXcgRnVsbFRyYW5zYWN0aW9uSWQgYW5kIHJlY29y ZCBpdHMgeGlkIGluIFBHUFJPQyBhbmQKIAkgKiBwZ19zdWJ0cmFucy4KQEAgLTcyNiw1OSAr NjkyLDYgQEAgQXNzaWduVHJhbnNhY3Rpb25JZChUcmFuc2FjdGlvblN0YXRlIHMpCiAJWGFj dExvY2tUYWJsZUluc2VydChYaWRGcm9tRnVsbFRyYW5zYWN0aW9uSWQocy0+ZnVsbFRyYW5z YWN0aW9uSWQpKTsKIAogCUN1cnJlbnRSZXNvdXJjZU93bmVyID0gY3VycmVudE93bmVyOwot Ci0JLyoKLQkgKiBFdmVyeSBQR1BST0NfTUFYX0NBQ0hFRF9TVUJYSURTIGFzc2lnbmVkIHRy YW5zYWN0aW9uIGlkcyB3aXRoaW4gZWFjaAotCSAqIHRvcC1sZXZlbCB0cmFuc2FjdGlvbiB3 ZSBpc3N1ZSBhIFdBTCByZWNvcmQgZm9yIHRoZSBhc3NpZ25tZW50LiBXZQotCSAqIGluY2x1 ZGUgdGhlIHRvcC1sZXZlbCB4aWQgYW5kIGFsbCB0aGUgc3VieGlkcyB0aGF0IGhhdmUgbm90 IHlldCBiZWVuCi0JICogcmVwb3J0ZWQgdXNpbmcgWExPR19YQUNUX0FTU0lHTk1FTlQgcmVj b3Jkcy4KLQkgKgotCSAqIFRoaXMgaXMgcmVxdWlyZWQgdG8gbGltaXQgdGhlIGFtb3VudCBv ZiBzaGFyZWQgbWVtb3J5IHJlcXVpcmVkIGluIGEgaG90Ci0JICogc3RhbmRieSBzZXJ2ZXIg dG8ga2VlcCB0cmFjayBvZiBpbi1wcm9ncmVzcyBYSURzLiBTZWUgbm90ZXMgZm9yCi0JICog UmVjb3JkS25vd25Bc3NpZ25lZFRyYW5zYWN0aW9uSWRzKCkuCi0JICoKLQkgKiBXZSBkb24n dCBrZWVwIHRyYWNrIG9mIHRoZSBpbW1lZGlhdGUgcGFyZW50IG9mIGVhY2ggc3VieGlkLCBv bmx5IHRoZQotCSAqIHRvcC1sZXZlbCB0cmFuc2FjdGlvbiB0aGF0IGVhY2ggc3VieGFjdCBi ZWxvbmdzIHRvLiBUaGlzIGlzIGNvcnJlY3QgaW4KLQkgKiByZWNvdmVyeSBvbmx5IGJlY2F1 c2UgYWJvcnRlZCBzdWJ0cmFuc2FjdGlvbnMgYXJlIHNlcGFyYXRlbHkgV0FMCi0JICogbG9n Z2VkLgotCSAqCi0JICogVGhpcyBpcyBjb3JyZWN0IGV2ZW4gZm9yIHRoZSBjYXNlIHdoZXJl IHNldmVyYWwgbGV2ZWxzIGFib3ZlIHVzIGRpZG4ndAotCSAqIGhhdmUgYW4geGlkIGFzc2ln bmVkIGFzIHdlIHJlY3Vyc2VkIHVwIHRvIHRoZW0gYmVmb3JlaGFuZC4KLQkgKi8KLQlpZiAo aXNTdWJYYWN0ICYmIFhMb2dTdGFuZGJ5SW5mb0FjdGl2ZSgpKQotCXsKLQkJdW5yZXBvcnRl ZFhpZHNbblVucmVwb3J0ZWRYaWRzXSA9IFhpZEZyb21GdWxsVHJhbnNhY3Rpb25JZChzLT5m dWxsVHJhbnNhY3Rpb25JZCk7Ci0JCW5VbnJlcG9ydGVkWGlkcysrOwotCi0JCS8qCi0JCSAq IGVuc3VyZSB0aGlzIHRlc3QgbWF0Y2hlcyBzaW1pbGFyIG9uZSBpbgotCQkgKiBSZWNvdmVy UHJlcGFyZWRUcmFuc2FjdGlvbnMoKQotCQkgKi8KLQkJaWYgKG5VbnJlcG9ydGVkWGlkcyA+ PSBQR1BST0NfTUFYX0NBQ0hFRF9TVUJYSURTIHx8Ci0JCQlsb2dfdW5rbm93bl90b3ApCi0J CXsKLQkJCXhsX3hhY3RfYXNzaWdubWVudCB4bHJlYzsKLQotCQkJLyoKLQkJCSAqIHh0b3Ag aXMgYWx3YXlzIHNldCBieSBub3cgYmVjYXVzZSB3ZSByZWN1cnNlIHVwIHRyYW5zYWN0aW9u Ci0JCQkgKiBzdGFjayB0byB0aGUgaGlnaGVzdCB1bmFzc2lnbmVkIHhpZCBhbmQgdGhlbiBj b21lIGJhY2sgZG93bgotCQkJICovCi0JCQl4bHJlYy54dG9wID0gR2V0VG9wVHJhbnNhY3Rp b25JZCgpOwotCQkJQXNzZXJ0KFRyYW5zYWN0aW9uSWRJc1ZhbGlkKHhscmVjLnh0b3ApKTsK LQkJCXhscmVjLm5zdWJ4YWN0cyA9IG5VbnJlcG9ydGVkWGlkczsKLQotCQkJWExvZ0JlZ2lu SW5zZXJ0KCk7Ci0JCQlYTG9nUmVnaXN0ZXJEYXRhKChjaGFyICopICZ4bHJlYywgTWluU2l6 ZU9mWGFjdEFzc2lnbm1lbnQpOwotCQkJWExvZ1JlZ2lzdGVyRGF0YSgoY2hhciAqKSB1bnJl cG9ydGVkWGlkcywKLQkJCQkJCQkgblVucmVwb3J0ZWRYaWRzICogc2l6ZW9mKFRyYW5zYWN0 aW9uSWQpKTsKLQotCQkJKHZvaWQpIFhMb2dJbnNlcnQoUk1fWEFDVF9JRCwgWExPR19YQUNU X0FTU0lHTk1FTlQpOwotCi0JCQluVW5yZXBvcnRlZFhpZHMgPSAwOwotCQkJLyogbWFyayB0 b3AsIG5vdCBjdXJyZW50IHhhY3QgYXMgaGF2aW5nIGJlZW4gbG9nZ2VkICovCi0JCQlUb3BU cmFuc2FjdGlvblN0YXRlRGF0YS5kaWRMb2dYaWQgPSB0cnVlOwotCQl9Ci0JfQogfQogCiAv KgpAQCAtMTU0MCw2ICsxNDUzLDcgQEAgUmVjb3JkVHJhbnNhY3Rpb25Db21taXQodm9pZCkK IAogCS8qIFJlc2V0IFhhY3RMYXN0UmVjRW5kIHVudGlsIHRoZSBuZXh0IHRyYW5zYWN0aW9u IHdyaXRlcyBzb21ldGhpbmcgKi8KIAlYYWN0TGFzdFJlY0VuZCA9IDA7CisKIGNsZWFudXA6 CiAJLyogQ2xlYW4gdXAgbG9jYWwgZGF0YSAqLwogCWlmIChyZWxzKQpAQCAtMTkyMiwxMyAr MTgzNiw2IEBAIEF0U3ViQWJvcnRfY2hpbGRYaWRzKHZvaWQpCiAJcy0+Y2hpbGRYaWRzID0g TlVMTDsKIAlzLT5uQ2hpbGRYaWRzID0gMDsKIAlzLT5tYXhDaGlsZFhpZHMgPSAwOwotCi0J LyoKLQkgKiBXZSBjb3VsZCBwcnVuZSB0aGUgdW5yZXBvcnRlZFhpZHMgYXJyYXkgaGVyZS4g QnV0IHdlIGRvbid0IGJvdGhlci4gVGhhdAotCSAqIHdvdWxkIHBvdGVudGlhbGx5IHJlZHVj ZSBudW1iZXIgb2YgWExPR19YQUNUX0FTU0lHTk1FTlQgcmVjb3JkcyBidXQgaXQKLQkgKiB3 b3VsZCBsaWtlbHkgaW50cm9kdWNlIG1vcmUgQ1BVIHRpbWUgaW50byB0aGUgbW9yZSBjb21t b24gcGF0aHMsIHNvIHdlCi0JICogY2hvb3NlIG5vdCB0byBkbyB0aGF0LgotCSAqLwogfQog CiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCkBAIC0yMDkyLDEyICsxOTk5LDYgQEAgU3RhcnRUcmFuc2FjdGlv bih2b2lkKQogCWN1cnJlbnRDb21tYW5kSWQgPSBGaXJzdENvbW1hbmRJZDsKIAljdXJyZW50 Q29tbWFuZElkVXNlZCA9IGZhbHNlOwogCi0JLyoKLQkgKiBpbml0aWFsaXplIHJlcG9ydGVk IHhpZCBhY2NvdW50aW5nCi0JICovCi0JblVucmVwb3J0ZWRYaWRzID0gMDsKLQlzLT5kaWRM b2dYaWQgPSBmYWxzZTsKLQogCS8qCiAJICogbXVzdCBpbml0aWFsaXplIHJlc291cmNlLW1h bmFnZW1lbnQgc3R1ZmYgZmlyc3QKIAkgKi8KQEAgLTYxMTgsNyArNjAxOSw3IEBAIHhhY3Rf cmVkb19jb21taXQoeGxfeGFjdF9wYXJzZWRfY29tbWl0ICpwYXJzZWQsCiAJVHJhbnNhY3Rp b25UcmVlU2V0Q29tbWl0VHNEYXRhKHhpZCwgcGFyc2VkLT5uc3VieGFjdHMsIHBhcnNlZC0+ c3VieGFjdHMsCiAJCQkJCQkJCSAgIGNvbW1pdF90aW1lLCBvcmlnaW5faWQpOwogCi0JaWYg KHN0YW5kYnlTdGF0ZSA9PSBTVEFOREJZX0RJU0FCTEVEKQorCWlmICghSW5Ib3RTdGFuZGJ5 KQogCXsKIAkJLyoKIAkJICogTWFyayB0aGUgdHJhbnNhY3Rpb24gY29tbWl0dGVkIGluIHBn X3hhY3QuCkBAIC02MTM4LDYgKzYwMzksMTEgQEAgeGFjdF9yZWRvX2NvbW1pdCh4bF94YWN0 X3BhcnNlZF9jb21taXQgKnBhcnNlZCwKIAkJICovCiAJCVJlY29yZEtub3duQXNzaWduZWRU cmFuc2FjdGlvbklkcyhtYXhfeGlkKTsKIAorCQkvKgorCQkgKiBUT0RPOiBXZSBtdXN0IG1h cmsgQ1NOTE9HIGZpcnN0CisJCSAqLworCQlDU05Mb2dTZXRDU04oeGlkLCBwYXJzZWQtPm5z dWJ4YWN0cywgcGFyc2VkLT5zdWJ4YWN0cywgbHNuKTsKKwogCQkvKgogCQkgKiBNYXJrIHRo ZSB0cmFuc2FjdGlvbiBjb21taXR0ZWQgaW4gcGdfeGFjdC4gV2UgdXNlIGFzeW5jIGNvbW1p dAogCQkgKiBwcm90b2NvbCBkdXJpbmcgcmVjb3ZlcnkgdG8gcHJvdmlkZSBpbmZvcm1hdGlv biBvbiBkYXRhYmFzZQpAQCAtNjE1MCw5ICs2MDU2LDkgQEAgeGFjdF9yZWRvX2NvbW1pdCh4 bF94YWN0X3BhcnNlZF9jb21taXQgKnBhcnNlZCwKIAkJVHJhbnNhY3Rpb25JZEFzeW5jQ29t bWl0VHJlZSh4aWQsIHBhcnNlZC0+bnN1YnhhY3RzLCBwYXJzZWQtPnN1YnhhY3RzLCBsc24p OwogCiAJCS8qCi0JCSAqIFdlIG11c3QgbWFyayBjbG9nIGJlZm9yZSB3ZSB1cGRhdGUgdGhl IFByb2NBcnJheS4KKwkJICogV2UgbXVzdCBtYXJrIGNsb2cgYW5kIGNzbmxvZyBiZWZvcmUg d2UgdXBkYXRlIHRoZSBQcm9jQXJyYXkuCiAJCSAqLwotCQlFeHBpcmVUcmVlS25vd25Bc3Np Z25lZFRyYW5zYWN0aW9uSWRzKHhpZCwgcGFyc2VkLT5uc3VieGFjdHMsIHBhcnNlZC0+c3Vi eGFjdHMsIG1heF94aWQpOworCQlFeHBpcmVUcmVlS25vd25Bc3NpZ25lZFRyYW5zYWN0aW9u SWRzKG1heF94aWQsIGxzbik7CiAKIAkJLyoKIAkJICogU2VuZCBhbnkgY2FjaGUgaW52YWxp ZGF0aW9ucyBhdHRhY2hlZCB0byB0aGUgY29tbWl0LiBXZSBtdXN0CkBAIC02MjU4LDcgKzYx NjQsNyBAQCB4YWN0X3JlZG9fYWJvcnQoeGxfeGFjdF9wYXJzZWRfYWJvcnQgKnBhcnNlZCwg VHJhbnNhY3Rpb25JZCB4aWQsCiAJCQkJCQkJCSAgcGFyc2VkLT5zdWJ4YWN0cyk7CiAJQWR2 YW5jZU5leHRGdWxsVHJhbnNhY3Rpb25JZFBhc3RYaWQobWF4X3hpZCk7CiAKLQlpZiAoc3Rh bmRieVN0YXRlID09IFNUQU5EQllfRElTQUJMRUQpCisJaWYgKCFJbkhvdFN0YW5kYnkpCiAJ ewogCQkvKiBNYXJrIHRoZSB0cmFuc2FjdGlvbiBhYm9ydGVkIGluIHBnX3hhY3QsIG5vIG5l ZWQgZm9yIGFzeW5jIHN0dWZmICovCiAJCVRyYW5zYWN0aW9uSWRBYm9ydFRyZWUoeGlkLCBw YXJzZWQtPm5zdWJ4YWN0cywgcGFyc2VkLT5zdWJ4YWN0cyk7CkBAIC02MjgyLDcgKzYxODgs NyBAQCB4YWN0X3JlZG9fYWJvcnQoeGxfeGFjdF9wYXJzZWRfYWJvcnQgKnBhcnNlZCwgVHJh bnNhY3Rpb25JZCB4aWQsCiAJCS8qCiAJCSAqIFdlIG11c3QgdXBkYXRlIHRoZSBQcm9jQXJy YXkgYWZ0ZXIgd2UgaGF2ZSBtYXJrZWQgY2xvZy4KIAkJICovCi0JCUV4cGlyZVRyZWVLbm93 bkFzc2lnbmVkVHJhbnNhY3Rpb25JZHMoeGlkLCBwYXJzZWQtPm5zdWJ4YWN0cywgcGFyc2Vk LT5zdWJ4YWN0cywgbWF4X3hpZCk7CisJCUV4cGlyZVRyZWVLbm93bkFzc2lnbmVkVHJhbnNh Y3Rpb25JZHMobWF4X3hpZCwgbHNuKTsKIAogCQkvKgogCQkgKiBUaGVyZSBhcmUgbm8gaW52 YWxpZGF0aW9uIG1lc3NhZ2VzIHRvIHNlbmQgb3IgdW5kby4KQEAgLTYzOTAsMTQgKzYyOTYs NiBAQCB4YWN0X3JlZG8oWExvZ1JlYWRlclN0YXRlICpyZWNvcmQpCiAJCQkJCSAgIFhMb2dS ZWNHZXRPcmlnaW4ocmVjb3JkKSk7CiAJCUxXTG9ja1JlbGVhc2UoVHdvUGhhc2VTdGF0ZUxv Y2spOwogCX0KLQllbHNlIGlmIChpbmZvID09IFhMT0dfWEFDVF9BU1NJR05NRU5UKQotCXsK LQkJeGxfeGFjdF9hc3NpZ25tZW50ICp4bHJlYyA9ICh4bF94YWN0X2Fzc2lnbm1lbnQgKikg WExvZ1JlY0dldERhdGEocmVjb3JkKTsKLQotCQlpZiAoc3RhbmRieVN0YXRlID49IFNUQU5E QllfSU5JVElBTElaRUQpCi0JCQlQcm9jQXJyYXlBcHBseVhpZEFzc2lnbm1lbnQoeGxyZWMt Pnh0b3AsCi0JCQkJCQkJCQkJeGxyZWMtPm5zdWJ4YWN0cywgeGxyZWMtPnhzdWIpOwotCX0K IAllbHNlIGlmIChpbmZvID09IFhMT0dfWEFDVF9JTlZBTElEQVRJT05TKQogCXsKIAkJLyoK ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hsb2cuYyBiL3NyYy9i YWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hsb2cuYwppbmRleCAzYmRkOWEyZGRkMy4uM2M1YjM2 ZGFmMjUgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hsb2cuYwor KysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94bG9nLmMKQEAgLTQ4LDYgKzQ4LDcg QEAKIAogI2luY2x1ZGUgImFjY2Vzcy9jbG9nLmgiCiAjaW5jbHVkZSAiYWNjZXNzL2NvbW1p dF90cy5oIgorI2luY2x1ZGUgImFjY2Vzcy9jc25fbG9nLmgiCiAjaW5jbHVkZSAiYWNjZXNz L2hlYXB0b2FzdC5oIgogI2luY2x1ZGUgImFjY2Vzcy9tdWx0aXhhY3QuaCIKICNpbmNsdWRl ICJhY2Nlc3MvcmV3cml0ZWhlYXAuaCIKQEAgLTk1MCw4ICs5NTEsNiBAQCBYTG9nSW5zZXJ0 UmVjb3JkKFhMb2dSZWNEYXRhICpyZGF0YSwKIAogCUVORF9DUklUX1NFQ1RJT04oKTsKIAot CU1hcmtDdXJyZW50VHJhbnNhY3Rpb25JZExvZ2dlZElmQW55KCk7Ci0KIAkvKgogCSAqIE1h cmsgdG9wIHRyYW5zYWN0aW9uIGlkIGlzIGxvZ2dlZCAoaWYgbmVlZGVkKSBzbyB0aGF0IHdl IHNob3VsZCBub3QgdHJ5CiAJICogdG8gbG9nIGl0IGFnYWluIHdpdGggdGhlIG5leHQgV0FM IHJlY29yZCBpbiB0aGUgY3VycmVudCBzdWJ0cmFuc2FjdGlvbi4KQEAgLTUwOTksNiArNTA5 OCw3IEBAIEJvb3RTdHJhcFhMT0codm9pZCkKIAogCS8qIEJvb3RzdHJhcCB0aGUgY29tbWl0 IGxvZywgdG9vICovCiAJQm9vdFN0cmFwQ0xPRygpOworCUJvb3RTdHJhcENTTkxvZygpOwog CUJvb3RTdHJhcENvbW1pdFRzKCk7CiAJQm9vdFN0cmFwU1VCVFJBTlMoKTsKIAlCb290U3Ry YXBNdWx0aVhhY3QoKTsKQEAgLTU2OTMsMTYgKzU2OTMsMTYgQEAgU3RhcnR1cFhMT0codm9p ZCkKIAkJICovCiAJCWlmIChBcmNoaXZlUmVjb3ZlcnlSZXF1ZXN0ZWQgJiYgRW5hYmxlSG90 U3RhbmRieSkKIAkJewotCQkJVHJhbnNhY3Rpb25JZCAqeGlkczsKLQkJCWludAkJCW54aWRz OworCQkJRnVsbFRyYW5zYWN0aW9uSWQgbGF0ZXN0Q29tcGxldGVkWGlkOwogCiAJCQllcmVw b3J0KERFQlVHMSwKIAkJCQkJKGVycm1zZ19pbnRlcm5hbCgiaW5pdGlhbGl6aW5nIGZvciBo b3Qgc3RhbmRieSIpKSk7CisJCQlJbkhvdFN0YW5kYnkgPSB0cnVlOwogCiAJCQlJbml0UmVj b3ZlcnlUcmFuc2FjdGlvbkVudmlyb25tZW50KCk7CiAKIAkJCWlmICh3YXNTaHV0ZG93bikK LQkJCQlvbGRlc3RBY3RpdmVYSUQgPSBQcmVzY2FuUHJlcGFyZWRUcmFuc2FjdGlvbnMoJnhp ZHMsICZueGlkcyk7CisJCQkJb2xkZXN0QWN0aXZlWElEID0gUHJlc2NhblByZXBhcmVkVHJh bnNhY3Rpb25zKCk7CiAJCQllbHNlCiAJCQkJb2xkZXN0QWN0aXZlWElEID0gY2hlY2tQb2lu dC5vbGRlc3RBY3RpdmVYaWQ7CiAJCQlBc3NlcnQoVHJhbnNhY3Rpb25JZElzVmFsaWQob2xk ZXN0QWN0aXZlWElEKSk7CkBAIC01NzE3LDM4ICs1NzE3LDE5IEBAIFN0YXJ0dXBYTE9HKHZv aWQpCiAJCQkgKi8KIAkJCVN0YXJ0dXBTVUJUUkFOUyhvbGRlc3RBY3RpdmVYSUQpOwogCisJ CQlsYXRlc3RDb21wbGV0ZWRYaWQgPSBjaGVja1BvaW50Lm5leHRYaWQ7CisJCQlGdWxsVHJh bnNhY3Rpb25JZFJldHJlYXQoJmxhdGVzdENvbXBsZXRlZFhpZCk7CisJCQlUcmFuc2FtVmFy aWFibGVzLT5sYXRlc3RDb21wbGV0ZWRYaWQgPSBsYXRlc3RDb21wbGV0ZWRYaWQ7CisKKwkJ CVN0YXJ0dXBDU05Mb2cob2xkZXN0QWN0aXZlWElELCBSZWRvUmVjUHRyKTsKKworCQkJUHJv Y0FycmF5VXBkYXRlT2xkZXN0UnVubmluZ1hpZChvbGRlc3RBY3RpdmVYSUQpOworCiAJCQkv KgotCQkJICogSWYgd2UncmUgYmVnaW5uaW5nIGF0IGEgc2h1dGRvd24gY2hlY2twb2ludCwg d2Uga25vdyB0aGF0Ci0JCQkgKiBub3RoaW5nIHdhcyBydW5uaW5nIG9uIHRoZSBwcmltYXJ5 IGF0IHRoaXMgcG9pbnQuIFNvIGZha2UtdXAgYW4KLQkJCSAqIGVtcHR5IHJ1bm5pbmcteGFj dHMgcmVjb3JkIGFuZCB1c2UgdGhhdCBoZXJlIGFuZCBub3cuIFJlY292ZXIKLQkJCSAqIGFk ZGl0aW9uYWwgc3RhbmRieSBzdGF0ZSBmb3IgcHJlcGFyZWQgdHJhbnNhY3Rpb25zLgorCQkJ ICogUmVjb3ZlciBhZGRpdGlvbmFsIHN0YW5kYnkgc3RhdGUgZm9yIHByZXBhcmVkIHRyYW5z YWN0aW9ucy4KIAkJCSAqLwogCQkJaWYgKHdhc1NodXRkb3duKQotCQkJewotCQkJCVJ1bm5p bmdUcmFuc2FjdGlvbnNEYXRhIHJ1bm5pbmc7Ci0JCQkJVHJhbnNhY3Rpb25JZCBsYXRlc3RD b21wbGV0ZWRYaWQ7Ci0KLQkJCQkvKgotCQkJCSAqIENvbnN0cnVjdCBhIFJ1bm5pbmdUcmFu c2FjdGlvbnMgc25hcHNob3QgcmVwcmVzZW50aW5nIGEKLQkJCQkgKiBzaHV0IGRvd24gc2Vy dmVyLCB3aXRoIG9ubHkgcHJlcGFyZWQgdHJhbnNhY3Rpb25zIHN0aWxsCi0JCQkJICogYWxp dmUuIFdlJ3JlIG5ldmVyIG92ZXJmbG93ZWQgYXQgdGhpcyBwb2ludCBiZWNhdXNlIGFsbAot CQkJCSAqIHN1YnhpZHMgYXJlIGxpc3RlZCB3aXRoIHRoZWlyIHBhcmVudCBwcmVwYXJlZCB0 cmFuc2FjdGlvbnMuCi0JCQkJICovCi0JCQkJcnVubmluZy54Y250ID0gbnhpZHM7Ci0JCQkJ cnVubmluZy5zdWJ4Y250ID0gMDsKLQkJCQlydW5uaW5nLnN1YnhpZF9vdmVyZmxvdyA9IGZh bHNlOwotCQkJCXJ1bm5pbmcubmV4dFhpZCA9IFhpZEZyb21GdWxsVHJhbnNhY3Rpb25JZChj aGVja1BvaW50Lm5leHRYaWQpOwotCQkJCXJ1bm5pbmcub2xkZXN0UnVubmluZ1hpZCA9IG9s ZGVzdEFjdGl2ZVhJRDsKLQkJCQlsYXRlc3RDb21wbGV0ZWRYaWQgPSBYaWRGcm9tRnVsbFRy YW5zYWN0aW9uSWQoY2hlY2tQb2ludC5uZXh0WGlkKTsKLQkJCQlUcmFuc2FjdGlvbklkUmV0 cmVhdChsYXRlc3RDb21wbGV0ZWRYaWQpOwotCQkJCUFzc2VydChUcmFuc2FjdGlvbklkSXNO b3JtYWwobGF0ZXN0Q29tcGxldGVkWGlkKSk7Ci0JCQkJcnVubmluZy5sYXRlc3RDb21wbGV0 ZWRYaWQgPSBsYXRlc3RDb21wbGV0ZWRYaWQ7Ci0JCQkJcnVubmluZy54aWRzID0geGlkczsK LQotCQkJCVByb2NBcnJheUFwcGx5UmVjb3ZlcnlJbmZvKCZydW5uaW5nKTsKLQogCQkJCVN0 YW5kYnlSZWNvdmVyUHJlcGFyZWRUcmFuc2FjdGlvbnMoKTsKLQkJCX0KIAkJfQogCiAJCS8q CkBAIC01ODMyLDcgKzU4MTMsNyBAQCBTdGFydHVwWExPRyh2b2lkKQogCSAqIFRoaXMgaW5m b3JtYXRpb24gaXMgbm90IHF1aXRlIG5lZWRlZCB5ZXQsIGJ1dCBpdCBpcyBwb3NpdGlvbmVk IGhlcmUgc28KIAkgKiBhcyBwb3RlbnRpYWwgcHJvYmxlbXMgYXJlIGRldGVjdGVkIGJlZm9y ZSBhbnkgb24tZGlzayBjaGFuZ2UgaXMgZG9uZS4KIAkgKi8KLQlvbGRlc3RBY3RpdmVYSUQg PSBQcmVzY2FuUHJlcGFyZWRUcmFuc2FjdGlvbnMoTlVMTCwgTlVMTCk7CisJb2xkZXN0QWN0 aXZlWElEID0gUHJlc2NhblByZXBhcmVkVHJhbnNhY3Rpb25zKCk7CiAKIAkvKgogCSAqIEFs bG93IG9yZGluYXJ5IFdBTCBzZWdtZW50IGNyZWF0aW9uIGJlZm9yZSBwb3NzaWJseSBzd2l0 Y2hpbmcgdG8gYSBuZXcKQEAgLTU5OTMsOSArNTk3NCwxOCBAQCBTdGFydHVwWExPRyh2b2lk KQogCSAqIFN0YXJ0IHVwIHN1YnRyYW5zLCBpZiBub3QgYWxyZWFkeSBkb25lIGZvciBob3Qg c3RhbmRieS4gIChjb21taXQKIAkgKiB0aW1lc3RhbXBzIGFyZSBzdGFydGVkIGJlbG93LCBp ZiBuZWNlc3NhcnkuKQogCSAqLwotCWlmIChzdGFuZGJ5U3RhdGUgPT0gU1RBTkRCWV9ESVNB QkxFRCkKKwlpZiAoIUluSG90U3RhbmRieSkKKwl7CiAJCVN0YXJ0dXBTVUJUUkFOUyhvbGRl c3RBY3RpdmVYSUQpOwogCisJCS8qCisJCSAqIFRPRE86IHdlIGRvbid0IG5lZWQgdG8gdXBk YXRlIENTTiBsb2cgZnJvbSBub3cgb24sIGJ1dCBpdCdzIHN0aWxsCisJCSAqIHJlcXVpcmVk IGJ5IHNuYXBzaG90cyB0aGF0IHdlcmUgdGFrZW4gYmVmb3JlIHJlY292ZXJ5IGVuZGVkLiAg V2UKKwkJICoganVzdCBsZXQgaXQgYmUsIGJ1dCBpdCB3b3VsZCBiZSBuaWNlIHRvIHRydW5j YXRlIGl0IHRvIDAgYWZ0ZXIgYWxsCisJCSAqIHRoZSBzbmFwc2hvdHMgYXJlIGdvbmUuCisJ CSAqLworCX0KKwogCS8qCiAJICogUGVyZm9ybSBlbmQgb2YgcmVjb3ZlcnkgYWN0aW9ucyBm b3IgYW55IFNMUlVzIHRoYXQgbmVlZCBpdC4KIAkgKi8KQEAgLTYwOTIsNyArNjA4Miw3IEBA IFN0YXJ0dXBYTE9HKHZvaWQpCiAJICogcGFydGljdWxhcmx5IGNyaXRpY2FsIGZvciBwcmVw YXJlZCAyUEMgdHJhbnNhY3Rpb25zLCB0aGF0IHdvdWxkIHN0aWxsCiAJICogbmVlZCB0byBi ZSBpbmNsdWRlZCBpbiBzbmFwc2hvdHMgb25jZSByZWNvdmVyeSBoYXMgZW5kZWQuCiAJICov Ci0JaWYgKHN0YW5kYnlTdGF0ZSAhPSBTVEFOREJZX0RJU0FCTEVEKQorCWlmIChJbkhvdFN0 YW5kYnkpCiAJCVNodXRkb3duUmVjb3ZlcnlUcmFuc2FjdGlvbkVudmlyb25tZW50KCk7CiAK IAkvKgpAQCAtNjg0Miw3ICs2ODMyLDcgQEAgQ3JlYXRlQ2hlY2tQb2ludChpbnQgZmxhZ3Mp CiAJICogc3RhcnRpbmcgc25hcHNob3Qgb2YgbG9ja3MgYW5kIHRyYW5zYWN0aW9ucy4KIAkg Ki8KIAlpZiAoIXNodXRkb3duICYmIFhMb2dTdGFuZGJ5SW5mb0FjdGl2ZSgpKQotCQljaGVj a1BvaW50Lm9sZGVzdEFjdGl2ZVhpZCA9IEdldE9sZGVzdEFjdGl2ZVRyYW5zYWN0aW9uSWQo KTsKKwkJY2hlY2tQb2ludC5vbGRlc3RBY3RpdmVYaWQgPSBHZXRPbGRlc3RBY3RpdmVUcmFu c2FjdGlvbklkKHRydWUpOwogCWVsc2UKIAkJY2hlY2tQb2ludC5vbGRlc3RBY3RpdmVYaWQg PSBJbnZhbGlkVHJhbnNhY3Rpb25JZDsKIApAQCAtNzIyNiw3ICs3MjE2LDEwIEBAIENyZWF0 ZUNoZWNrUG9pbnQoaW50IGZsYWdzKQogCSAqIFN0YXJ0dXBTVUJUUkFOUyBoYXNuJ3QgYmVl biBjYWxsZWQgeWV0LgogCSAqLwogCWlmICghUmVjb3ZlcnlJblByb2dyZXNzKCkpCisJewog CQlUcnVuY2F0ZVNVQlRSQU5TKEdldE9sZGVzdFRyYW5zYWN0aW9uSWRDb25zaWRlcmVkUnVu bmluZygpKTsKKwkJVHJ1bmNhdGVDU05Mb2coR2V0T2xkZXN0VHJhbnNhY3Rpb25JZENvbnNp ZGVyZWRSdW5uaW5nKCkpOworCX0KIAogCS8qIFJlYWwgd29yayBpcyBkb25lOyBsb2cgYW5k IHVwZGF0ZSBzdGF0cy4gKi8KIAlMb2dDaGVja3BvaW50RW5kKGZhbHNlKTsKQEAgLTczOTYs NiArNzM4OSw3IEBAIENoZWNrUG9pbnRHdXRzKFhMb2dSZWNQdHIgY2hlY2tQb2ludFJlZG8s IGludCBmbGFncykKIAlUUkFDRV9QT1NUR1JFU1FMX0JVRkZFUl9DSEVDS1BPSU5UX1NUQVJU KGZsYWdzKTsKIAlDaGVja3BvaW50U3RhdHMuY2twdF93cml0ZV90ID0gR2V0Q3VycmVudFRp bWVzdGFtcCgpOwogCUNoZWNrUG9pbnRDTE9HKCk7CisJQ2hlY2tQb2ludENTTkxvZygpOwog CUNoZWNrUG9pbnRDb21taXRUcygpOwogCUNoZWNrUG9pbnRTVUJUUkFOUygpOwogCUNoZWNr UG9pbnRNdWx0aVhhY3QoKTsKQEAgLTc2OTIsNyArNzY4NiwxMCBAQCBDcmVhdGVSZXN0YXJ0 UG9pbnQoaW50IGZsYWdzKQogCSAqIHRoaXMgYmVjYXVzZSBTdGFydHVwU1VCVFJBTlMgaGFz bid0IGJlZW4gY2FsbGVkIHlldC4KIAkgKi8KIAlpZiAoRW5hYmxlSG90U3RhbmRieSkKKwl7 CiAJCVRydW5jYXRlU1VCVFJBTlMoR2V0T2xkZXN0VHJhbnNhY3Rpb25JZENvbnNpZGVyZWRS dW5uaW5nKCkpOworCQlUcnVuY2F0ZUNTTkxvZyhHZXRPbGRlc3RUcmFuc2FjdGlvbklkQ29u c2lkZXJlZFJ1bm5pbmcoKSk7CisJfQogCiAJLyogUmVhbCB3b3JrIGlzIGRvbmU7IGxvZyBh bmQgdXBkYXRlIHN0YXRzLiAqLwogCUxvZ0NoZWNrcG9pbnRFbmQodHJ1ZSk7CkBAIC04MTc3 LDM4ICs4MTc0LDE1IEBAIHhsb2dfcmVkbyhYTG9nUmVhZGVyU3RhdGUgKnJlY29yZCkKIAog CQkvKgogCQkgKiBJZiB3ZSBzZWUgYSBzaHV0ZG93biBjaGVja3BvaW50LCB3ZSBrbm93IHRo YXQgbm90aGluZyB3YXMgcnVubmluZwotCQkgKiBvbiB0aGUgcHJpbWFyeSBhdCB0aGlzIHBv aW50LiBTbyBmYWtlLXVwIGFuIGVtcHR5IHJ1bm5pbmcteGFjdHMKLQkJICogcmVjb3JkIGFu ZCB1c2UgdGhhdCBoZXJlIGFuZCBub3cuIFJlY292ZXIgYWRkaXRpb25hbCBzdGFuZGJ5IHN0 YXRlCi0JCSAqIGZvciBwcmVwYXJlZCB0cmFuc2FjdGlvbnMuCisJCSAqIG9uIHRoZSBwcmlt YXJ5IGF0IHRoaXMgcG9pbnQsIGV4Y2VwdCBmb3IgcHJlcGFyZWQgdHJhbnNhY3Rpb25zLgor CQkgKiBSZWNvdmVyIGFkZGl0aW9uYWwgc3RhbmRieSBzdGF0ZSBmb3IgcHJlcGFyZWQgdHJh bnNhY3Rpb25zLgogCQkgKi8KLQkJaWYgKHN0YW5kYnlTdGF0ZSA+PSBTVEFOREJZX0lOSVRJ QUxJWkVEKQorCQlpZiAoSW5Ib3RTdGFuZGJ5KQogCQl7Ci0JCQlUcmFuc2FjdGlvbklkICp4 aWRzOwotCQkJaW50CQkJbnhpZHM7CiAJCQlUcmFuc2FjdGlvbklkIG9sZGVzdEFjdGl2ZVhJ RDsKLQkJCVRyYW5zYWN0aW9uSWQgbGF0ZXN0Q29tcGxldGVkWGlkOwotCQkJUnVubmluZ1Ry YW5zYWN0aW9uc0RhdGEgcnVubmluZzsKIAotCQkJb2xkZXN0QWN0aXZlWElEID0gUHJlc2Nh blByZXBhcmVkVHJhbnNhY3Rpb25zKCZ4aWRzLCAmbnhpZHMpOwotCi0JCQkvKgotCQkJICog Q29uc3RydWN0IGEgUnVubmluZ1RyYW5zYWN0aW9ucyBzbmFwc2hvdCByZXByZXNlbnRpbmcg YSBzaHV0Ci0JCQkgKiBkb3duIHNlcnZlciwgd2l0aCBvbmx5IHByZXBhcmVkIHRyYW5zYWN0 aW9ucyBzdGlsbCBhbGl2ZS4gV2UncmUKLQkJCSAqIG5ldmVyIG92ZXJmbG93ZWQgYXQgdGhp cyBwb2ludCBiZWNhdXNlIGFsbCBzdWJ4aWRzIGFyZSBsaXN0ZWQKLQkJCSAqIHdpdGggdGhl aXIgcGFyZW50IHByZXBhcmVkIHRyYW5zYWN0aW9ucy4KLQkJCSAqLwotCQkJcnVubmluZy54 Y250ID0gbnhpZHM7Ci0JCQlydW5uaW5nLnN1YnhjbnQgPSAwOwotCQkJcnVubmluZy5zdWJ4 aWRfb3ZlcmZsb3cgPSBmYWxzZTsKLQkJCXJ1bm5pbmcubmV4dFhpZCA9IFhpZEZyb21GdWxs VHJhbnNhY3Rpb25JZChjaGVja1BvaW50Lm5leHRYaWQpOwotCQkJcnVubmluZy5vbGRlc3RS dW5uaW5nWGlkID0gb2xkZXN0QWN0aXZlWElEOwotCQkJbGF0ZXN0Q29tcGxldGVkWGlkID0g WGlkRnJvbUZ1bGxUcmFuc2FjdGlvbklkKGNoZWNrUG9pbnQubmV4dFhpZCk7Ci0JCQlUcmFu c2FjdGlvbklkUmV0cmVhdChsYXRlc3RDb21wbGV0ZWRYaWQpOwotCQkJQXNzZXJ0KFRyYW5z YWN0aW9uSWRJc05vcm1hbChsYXRlc3RDb21wbGV0ZWRYaWQpKTsKLQkJCXJ1bm5pbmcubGF0 ZXN0Q29tcGxldGVkWGlkID0gbGF0ZXN0Q29tcGxldGVkWGlkOwotCQkJcnVubmluZy54aWRz ID0geGlkczsKLQotCQkJUHJvY0FycmF5QXBwbHlSZWNvdmVyeUluZm8oJnJ1bm5pbmcpOwor CQkJb2xkZXN0QWN0aXZlWElEID0gUHJlc2NhblByZXBhcmVkVHJhbnNhY3Rpb25zKCk7CisJ CQlQcm9jQXJyYXlVcGRhdGVPbGRlc3RSdW5uaW5nWGlkKG9sZGVzdEFjdGl2ZVhJRCk7CiAK IAkJCVN0YW5kYnlSZWNvdmVyUHJlcGFyZWRUcmFuc2FjdGlvbnMoKTsKIAkJfQpAQCAtODI3 NCw2ICs4MjQ4LDEzIEBAIHhsb2dfcmVkbyhYTG9nUmVhZGVyU3RhdGUgKnJlY29yZCkKIAkJ CQkJCQkJICBjaGVja1BvaW50Lm9sZGVzdFhpZCkpCiAJCQlTZXRUcmFuc2FjdGlvbklkTGlt aXQoY2hlY2tQb2ludC5vbGRlc3RYaWQsCiAJCQkJCQkJCSAgY2hlY2tQb2ludC5vbGRlc3RY aWREQik7CisKKwkJLyoKKwkJICogVXBkYXRlIG9sZGVzdEFjdGl2ZVhpZAorCQkgKi8KKwkJ aWYgKEluSG90U3RhbmRieSkKKwkJCVByb2NBcnJheVVwZGF0ZU9sZGVzdFJ1bm5pbmdYaWQo Y2hlY2tQb2ludC5vbGRlc3RBY3RpdmVYaWQpOworCiAJCS8qIENvbnRyb2xGaWxlLT5jaGVj a1BvaW50Q29weSBhbHdheXMgdHJhY2tzIHRoZSBsYXRlc3QgY2twdCBYSUQgKi8KIAkJTFdM b2NrQWNxdWlyZShDb250cm9sRmlsZUxvY2ssIExXX0VYQ0xVU0lWRSk7CiAJCUNvbnRyb2xG aWxlLT5jaGVja1BvaW50Q29weS5uZXh0WGlkID0gY2hlY2tQb2ludC5uZXh0WGlkOwpkaWZm IC0tZ2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGxvZ3JlY292ZXJ5LmMgYi9z cmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94bG9ncmVjb3ZlcnkuYwppbmRleCBiMmZlMmQw NGNjZi4uZGFjOWY2MzllNzMgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFu c2FtL3hsb2dyZWNvdmVyeS5jCisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hs b2dyZWNvdmVyeS5jCkBAIC0xOTg1LDEwICsxOTg1LDkgQEAgQXBwbHlXYWxSZWNvcmQoWExv Z1JlYWRlclN0YXRlICp4bG9ncmVhZGVyLCBYTG9nUmVjb3JkICpyZWNvcmQsIFRpbWVMaW5l SUQgKnJlcGwKIAlTcGluTG9ja1JlbGVhc2UoJlhMb2dSZWNvdmVyeUN0bC0+aW5mb19sY2sp OwogCiAJLyoKLQkgKiBJZiB3ZSBhcmUgYXR0ZW1wdGluZyB0byBlbnRlciBIb3QgU3RhbmRi eSBtb2RlLCBwcm9jZXNzIFhJRHMgd2Ugc2VlCisJICogSW4gSG90IFN0YW5kYnkgbW9kZSwg cHJvY2VzcyBYSURzIHdlIHNlZQogCSAqLwotCWlmIChzdGFuZGJ5U3RhdGUgPj0gU1RBTkRC WV9JTklUSUFMSVpFRCAmJgotCQlUcmFuc2FjdGlvbklkSXNWYWxpZChyZWNvcmQtPnhsX3hp ZCkpCisJaWYgKEluSG90U3RhbmRieSAmJiBUcmFuc2FjdGlvbklkSXNWYWxpZChyZWNvcmQt PnhsX3hpZCkpCiAJCVJlY29yZEtub3duQXNzaWduZWRUcmFuc2FjdGlvbklkcyhyZWNvcmQt PnhsX3hpZCk7CiAKIAkvKgpAQCAtMjI2NCw3ICsyMjYzLDcgQEAgQ2hlY2tSZWNvdmVyeUNv bnNpc3RlbmN5KHZvaWQpCiAJICogcnVuPyBJZiBzbywgd2UgY2FuIHRlbGwgcG9zdG1hc3Rl ciB0aGF0IHRoZSBkYXRhYmFzZSBpcyBjb25zaXN0ZW50IG5vdywKIAkgKiBlbmFibGluZyBj b25uZWN0aW9ucy4KIAkgKi8KLQlpZiAoc3RhbmRieVN0YXRlID09IFNUQU5EQllfU05BUFNI T1RfUkVBRFkgJiYKKwlpZiAoSW5Ib3RTdGFuZGJ5ICYmCiAJCSFMb2NhbEhvdFN0YW5kYnlB Y3RpdmUgJiYKIAkJcmVhY2hlZENvbnNpc3RlbmN5ICYmCiAJCUlzVW5kZXJQb3N0bWFzdGVy KQpAQCAtMzcwOSw5ICszNzA4LDYgQEAgV2FpdEZvcldBTFRvQmVjb21lQXZhaWxhYmxlKFhM b2dSZWNQdHIgUmVjUHRyLCBib29sIHJhbmRBY2Nlc3MsCiAJCQkJCQllbG9nKExPRywgIndh aXRpbmcgZm9yIFdBTCB0byBiZWNvbWUgYXZhaWxhYmxlIGF0ICVYLyVYIiwKIAkJCQkJCQkg TFNOX0ZPUk1BVF9BUkdTKFJlY1B0cikpOwogCi0JCQkJCQkvKiBEbyBiYWNrZ3JvdW5kIHRh c2tzIHRoYXQgbWlnaHQgYmVuZWZpdCB1cyBsYXRlci4gKi8KLQkJCQkJCUtub3duQXNzaWdu ZWRUcmFuc2FjdGlvbklkc0lkbGVNYWludGVuYW5jZSgpOwotCiAJCQkJCQkodm9pZCkgV2Fp dExhdGNoKCZYTG9nUmVjb3ZlcnlDdGwtPnJlY292ZXJ5V2FrZXVwTGF0Y2gsCiAJCQkJCQkJ CQkJIFdMX0xBVENIX1NFVCB8IFdMX1RJTUVPVVQgfAogCQkJCQkJCQkJCSBXTF9FWElUX09O X1BNX0RFQVRILApAQCAtMzk3OCw5ICszOTc0LDYgQEAgV2FpdEZvcldBTFRvQmVjb21lQXZh aWxhYmxlKFhMb2dSZWNQdHIgUmVjUHRyLCBib29sIHJhbmRBY2Nlc3MsCiAJCQkJCQlzdHJl YW1pbmdfcmVwbHlfc2VudCA9IHRydWU7CiAJCQkJCX0KIAotCQkJCQkvKiBEbyBhbnkgYmFj a2dyb3VuZCB0YXNrcyB0aGF0IG1pZ2h0IGJlbmVmaXQgdXMgbGF0ZXIuICovCi0JCQkJCUtu b3duQXNzaWduZWRUcmFuc2FjdGlvbklkc0lkbGVNYWludGVuYW5jZSgpOwotCiAJCQkJCS8q IFVwZGF0ZSBwZ19zdGF0X3JlY292ZXJ5X3ByZWZldGNoIGJlZm9yZSBzbGVlcGluZy4gKi8K IAkJCQkJWExvZ1ByZWZldGNoZXJDb21wdXRlU3RhdHMoeGxvZ3ByZWZldGNoZXIpOwogCmRp ZmYgLS1naXQgYS9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94bG9ndXRpbHMuYyBiL3Ny Yy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hsb2d1dGlscy5jCmluZGV4IDUyOTViODVmZTA3 Li5iZjA4YzYwZTkzYSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0v eGxvZ3V0aWxzLmMKKysrIGIvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGxvZ3V0aWxz LmMKQEAgLTUwLDcgKzUwLDcgQEAgYm9vbAkJaWdub3JlX2ludmFsaWRfcGFnZXMgPSBmYWxz ZTsKIGJvb2wJCUluUmVjb3ZlcnkgPSBmYWxzZTsKIAogLyogQXJlIHdlIGluIEhvdCBTdGFu ZGJ5IG1vZGU/IE9ubHkgdmFsaWQgaW4gc3RhcnR1cCBwcm9jZXNzLCBzZWUgeGxvZ3V0aWxz LmggKi8KLUhvdFN0YW5kYnlTdGF0ZSBzdGFuZGJ5U3RhdGUgPSBTVEFOREJZX0RJU0FCTEVE OworYm9vbAkJSW5Ib3RTdGFuZGJ5ID0gZmFsc2U7CiAKIC8qCiAgKiBEdXJpbmcgWExPRyBy ZXBsYXksIHdlIG1heSBzZWUgWExPRyByZWNvcmRzIGZvciBpbmNyZW1lbnRhbCB1cGRhdGVz IG9mCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9wb3N0bWFzdGVyL3N0YXJ0dXAuYyBiL3Ny Yy9iYWNrZW5kL3Bvc3RtYXN0ZXIvc3RhcnR1cC5jCmluZGV4IGVmNmY5OGViY2Q3Li5hOTc1 ODY1ZmRkOSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvcG9zdG1hc3Rlci9zdGFydHVwLmMK KysrIGIvc3JjL2JhY2tlbmQvcG9zdG1hc3Rlci9zdGFydHVwLmMKQEAgLTIwMyw3ICsyMDMs NyBAQCBzdGF0aWMgdm9pZAogU3RhcnR1cFByb2NFeGl0KGludCBjb2RlLCBEYXR1bSBhcmcp CiB7CiAJLyogU2h1dGRvd24gdGhlIHJlY292ZXJ5IGVudmlyb25tZW50ICovCi0JaWYgKHN0 YW5kYnlTdGF0ZSAhPSBTVEFOREJZX0RJU0FCTEVEKQorCWlmIChJbkhvdFN0YW5kYnkpCiAJ CVNodXRkb3duUmVjb3ZlcnlUcmFuc2FjdGlvbkVudmlyb25tZW50KCk7CiB9CiAKZGlmZiAt LWdpdCBhL3NyYy9iYWNrZW5kL3JlcGxpY2F0aW9uL2xvZ2ljYWwvZGVjb2RlLmMgYi9zcmMv YmFja2VuZC9yZXBsaWNhdGlvbi9sb2dpY2FsL2RlY29kZS5jCmluZGV4IDdhODZmODQ4MWRi Li5kYWY2ZWIwMjc1OSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvcmVwbGljYXRpb24vbG9n aWNhbC9kZWNvZGUuYworKysgYi9zcmMvYmFja2VuZC9yZXBsaWNhdGlvbi9sb2dpY2FsL2Rl Y29kZS5jCkBAIC0yNzAsMTQgKzI3MCw2IEBAIHhhY3RfZGVjb2RlKExvZ2ljYWxEZWNvZGlu Z0NvbnRleHQgKmN0eCwgWExvZ1JlY29yZEJ1ZmZlciAqYnVmKQogCQkJCURlY29kZUFib3J0 KGN0eCwgYnVmLCAmcGFyc2VkLCB4aWQsIHR3b19waGFzZSk7CiAJCQkJYnJlYWs7CiAJCQl9 Ci0JCWNhc2UgWExPR19YQUNUX0FTU0lHTk1FTlQ6Ci0KLQkJCS8qCi0JCQkgKiBXZSBhc3Np Z24gc3VieGFjdCB0byB0aGUgdG9wbGV2ZWwgeGFjdCB3aGlsZSBwcm9jZXNzaW5nIGVhY2gK LQkJCSAqIHJlY29yZCBpZiByZXF1aXJlZC4gIFNvLCB3ZSBkb24ndCBuZWVkIHRvIGRvIGFu eXRoaW5nIGhlcmUuIFNlZQotCQkJICogTG9naWNhbERlY29kaW5nUHJvY2Vzc1JlY29yZC4K LQkJCSAqLwotCQkJYnJlYWs7CiAJCWNhc2UgWExPR19YQUNUX0lOVkFMSURBVElPTlM6CiAJ CQl7CiAJCQkJVHJhbnNhY3Rpb25JZCB4aWQ7CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9y ZXBsaWNhdGlvbi9sb2dpY2FsL3NuYXBidWlsZC5jIGIvc3JjL2JhY2tlbmQvcmVwbGljYXRp b24vbG9naWNhbC9zbmFwYnVpbGQuYwppbmRleCBlMzdlMjJmNDQxNy4uMzI2MWJhMTI4MzIg MTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3JlcGxpY2F0aW9uL2xvZ2ljYWwvc25hcGJ1aWxk LmMKKysrIGIvc3JjL2JhY2tlbmQvcmVwbGljYXRpb24vbG9naWNhbC9zbmFwYnVpbGQuYwpA QCAtMjcsNyArMjcsNyBAQAogICogcmVtb3ZlZC4gVGhpcyBpcyBhY2hpZXZlZCBieSB1c2lu ZyB0aGUgcmVwbGljYXRpb24gc2xvdCBtZWNoYW5pc20uCiAgKgogICogQXMgdGhlIHBlcmNl bnRhZ2Ugb2YgdHJhbnNhY3Rpb25zIG1vZGlmeWluZyB0aGUgY2F0YWxvZyBub3JtYWxseSBp cyBmYWlybHkKLSAqIHNtYWxsIGluIGNvbXBhcmlzb25zIHRvIG9uZXMgb25seSBtYW5pcHVs YXRpbmcgdXNlciBkYXRhLCB3ZSBrZWVwIHRyYWNrIG9mCisgKiBzbWFsbCBpbiBjb21wYXJp c29uIHRvIG9uZXMgb25seSBtYW5pcHVsYXRpbmcgdXNlciBkYXRhLCB3ZSBrZWVwIHRyYWNr IG9mCiAgKiB0aGUgY29tbWl0dGVkIGNhdGFsb2cgbW9kaWZ5aW5nIG9uZXMgaW5zaWRlIFt4 bWluLCB4bWF4KSBpbnN0ZWFkIG9mIGtlZXBpbmcKICAqIHRyYWNrIG9mIGFsbCBydW5uaW5n IHRyYW5zYWN0aW9ucyBsaWtlIGl0J3MgZG9uZSBpbiBhIG5vcm1hbCBzbmFwc2hvdC4gTm90 ZQogICogdGhhdCB3ZSdyZSBnZW5lcmFsbHkgb25seSBsb29raW5nIGF0IHRyYW5zYWN0aW9u cyB0aGF0IGhhdmUgYWNxdWlyZWQgYW4KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0b3Jh Z2UvaXBjL2lwY2kuYyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2UvaXBjL2lwY2kuYwppbmRleCA5 MGM4NGZlYzI3YS4uNDY1YTA0NzcwYmUgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3N0b3Jh Z2UvaXBjL2lwY2kuYworKysgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2lwYy9pcGNpLmMKQEAg LTE2LDYgKzE2LDcgQEAKIAogI2luY2x1ZGUgImFjY2Vzcy9jbG9nLmgiCiAjaW5jbHVkZSAi YWNjZXNzL2NvbW1pdF90cy5oIgorI2luY2x1ZGUgImFjY2Vzcy9jc25fbG9nLmgiCiAjaW5j bHVkZSAiYWNjZXNzL211bHRpeGFjdC5oIgogI2luY2x1ZGUgImFjY2Vzcy9uYnRyZWUuaCIK ICNpbmNsdWRlICJhY2Nlc3Mvc3VidHJhbnMuaCIKQEAgLTEyNiw2ICsxMjcsNyBAQCBDYWxj dWxhdGVTaG1lbVNpemUoaW50ICpudW1fc2VtYXBob3JlcykKIAlzaXplID0gYWRkX3NpemUo c2l6ZSwgWExPR1NobWVtU2l6ZSgpKTsKIAlzaXplID0gYWRkX3NpemUoc2l6ZSwgWExvZ1Jl Y292ZXJ5U2htZW1TaXplKCkpOwogCXNpemUgPSBhZGRfc2l6ZShzaXplLCBDTE9HU2htZW1T aXplKCkpOworCXNpemUgPSBhZGRfc2l6ZShzaXplLCBDU05Mb2dTaG1lbVNpemUoKSk7CiAJ c2l6ZSA9IGFkZF9zaXplKHNpemUsIENvbW1pdFRzU2htZW1TaXplKCkpOwogCXNpemUgPSBh ZGRfc2l6ZShzaXplLCBTVUJUUkFOU1NobWVtU2l6ZSgpKTsKIAlzaXplID0gYWRkX3NpemUo c2l6ZSwgVHdvUGhhc2VTaG1lbVNpemUoKSk7CkBAIC0zMDQsNiArMzA2LDcgQEAgQ3JlYXRl T3JBdHRhY2hTaG1lbVN0cnVjdHModm9pZCkKIAlYTG9nUHJlZmV0Y2hTaG1lbUluaXQoKTsK IAlYTG9nUmVjb3ZlcnlTaG1lbUluaXQoKTsKIAlDTE9HU2htZW1Jbml0KCk7CisJQ1NOTG9n U2htZW1Jbml0KCk7CiAJQ29tbWl0VHNTaG1lbUluaXQoKTsKIAlTVUJUUkFOU1NobWVtSW5p dCgpOwogCU11bHRpWGFjdFNobWVtSW5pdCgpOwpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQv c3RvcmFnZS9pcGMvcHJvY2FycmF5LmMgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2lwYy9wcm9j YXJyYXkuYwppbmRleCA4OGE2ZDUwNGRmZi4uMDY4OWQ1Yjk4MzggMTAwNjQ0Ci0tLSBhL3Ny Yy9iYWNrZW5kL3N0b3JhZ2UvaXBjL3Byb2NhcnJheS5jCisrKyBiL3NyYy9iYWNrZW5kL3N0 b3JhZ2UvaXBjL3Byb2NhcnJheS5jCkBAIC0xOSwyMCArMTksMTAgQEAKICAqIG15UHJvY0xv Y2tzIGxpc3RzLiAgVGhleSBjYW4gYmUgZGlzdGluZ3Vpc2hlZCBmcm9tIHJlZ3VsYXIgYmFj a2VuZCBQR1BST0NzCiAgKiBhdCBuZWVkIGJ5IGNoZWNraW5nIGZvciBwaWQgPT0gMC4KICAq Ci0gKiBEdXJpbmcgaG90IHN0YW5kYnksIHdlIGFsc28ga2VlcCBhIGxpc3Qgb2YgWElEcyBy ZXByZXNlbnRpbmcgdHJhbnNhY3Rpb25zCi0gKiB0aGF0IGFyZSBrbm93biB0byBiZSBydW5u aW5nIG9uIHRoZSBwcmltYXJ5IChvciBtb3JlIHByZWNpc2VseSwgd2VyZSBydW5uaW5nCi0g KiBhcyBvZiB0aGUgY3VycmVudCBwb2ludCBpbiB0aGUgV0FMIHN0cmVhbSkuICBUaGlzIGxp c3QgaXMga2VwdCBpbiB0aGUKLSAqIEtub3duQXNzaWduZWRYaWRzIGFycmF5LCBhbmQgaXMg dXBkYXRlZCBieSB3YXRjaGluZyB0aGUgc2VxdWVuY2Ugb2YKLSAqIGFycml2aW5nIFhJRHMu ICBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGlmIHdlIGxlYXZlIHRob3NlIFhJRHMgb3V0 IG9mCi0gKiBzbmFwc2hvdHMgdGFrZW4gZm9yIHN0YW5kYnkgcXVlcmllcywgdGhlbiB0aGV5 IHdpbGwgYXBwZWFyIHRvIGJlIGFscmVhZHkKLSAqIGNvbXBsZXRlLCBsZWFkaW5nIHRvIE1W Q0MgZmFpbHVyZXMuICBOb3RlIHRoYXQgaW4gaG90IHN0YW5kYnksIHRoZSBQR1BST0MKLSAq IGFycmF5IHJlcHJlc2VudHMgc3RhbmRieSBwcm9jZXNzZXMsIHdoaWNoIGJ5IGRlZmluaXRp b24gYXJlIG5vdCBydW5uaW5nCi0gKiB0cmFuc2FjdGlvbnMgdGhhdCBoYXZlIFhJRHMuCi0g KgotICogSXQgaXMgcGVyaGFwcyBwb3NzaWJsZSBmb3IgYSBiYWNrZW5kIG9uIHRoZSBwcmlt YXJ5IHRvIHRlcm1pbmF0ZSB3aXRob3V0Ci0gKiB3cml0aW5nIGFuIGFib3J0IHJlY29yZCBm b3IgaXRzIHRyYW5zYWN0aW9uLiAgV2hpbGUgdGhhdCBzaG91bGRuJ3QgcmVhbGx5Ci0gKiBo YXBwZW4sIGl0IHdvdWxkIHRpZSB1cCBLbm93bkFzc2lnbmVkWGlkcyBpbmRlZmluaXRlbHks IHNvIHdlIHByb3RlY3QKLSAqIG91cnNlbHZlcyBieSBwcnVuaW5nIHRoZSBhcnJheSB3aGVu IGEgdmFsaWQgbGlzdCBvZiBydW5uaW5nIFhJRHMgYXJyaXZlcy4KKyAqIER1cmluZyBob3Qg c3RhbmRieSwgd2UgZG9uJ3QgaGF2ZSBQR1BST0MgZW50cmllcyByZXByZXNlbnRpbmcgdHJh bnNhY3Rpb25zCisgKiBydW5uaW5nIGluIHRoZSBwcmltYXJ5LiAgSW4gc25hcHNob3RzIHRh a2VuIGR1cmluZyByZWNvdmVyeSwgdGhlIHNuYXBzaG90CisgKiBjb250YWlucyBhIENvbW1p dC1TZXF1ZW5jZSBOdW1iZXIgKENTTikgd2hpY2ggaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hp Y2gKKyAqIFhJRHMgYXJlIHN0aWxsIGNvbnNpZGVyZWQgYXMgcnVubmluZyBieSB0aGUgc25h cHNob3QuCiAgKgogICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAxOTk2LTIwMjQsIFBvc3Rn cmVTUUwgR2xvYmFsIERldmVsb3BtZW50IEdyb3VwCiAgKiBQb3J0aW9ucyBDb3B5cmlnaHQg KGMpIDE5OTQsIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQpAQCAt NDcsNiArMzcsNyBAQAogCiAjaW5jbHVkZSA8c2lnbmFsLmg+CiAKKyNpbmNsdWRlICJhY2Nl c3MvY3NuX2xvZy5oIgogI2luY2x1ZGUgImFjY2Vzcy9zdWJ0cmFucy5oIgogI2luY2x1ZGUg ImFjY2Vzcy90cmFuc2FtLmgiCiAjaW5jbHVkZSAiYWNjZXNzL3R3b3BoYXNlLmgiCkBAIC03 MywyMiArNjQsOCBAQCB0eXBlZGVmIHN0cnVjdCBQcm9jQXJyYXlTdHJ1Y3QKIAlpbnQJCQlu dW1Qcm9jczsJCS8qIG51bWJlciBvZiB2YWxpZCBwcm9jcyBlbnRyaWVzICovCiAJaW50CQkJ bWF4UHJvY3M7CQkvKiBhbGxvY2F0ZWQgc2l6ZSBvZiBwcm9jcyBhcnJheSAqLwogCi0JLyoK LQkgKiBLbm93biBhc3NpZ25lZCBYSURzIGhhbmRsaW5nCi0JICovCi0JaW50CQkJbWF4S25v d25Bc3NpZ25lZFhpZHM7CS8qIGFsbG9jYXRlZCBzaXplIG9mIGFycmF5ICovCi0JaW50CQkJ bnVtS25vd25Bc3NpZ25lZFhpZHM7CS8qIGN1cnJlbnQgIyBvZiB2YWxpZCBlbnRyaWVzICov Ci0JaW50CQkJdGFpbEtub3duQXNzaWduZWRYaWRzOwkvKiBpbmRleCBvZiBvbGRlc3QgdmFs aWQgZWxlbWVudCAqLwotCWludAkJCWhlYWRLbm93bkFzc2lnbmVkWGlkczsJLyogaW5kZXgg b2YgbmV3ZXN0IGVsZW1lbnQsICsgMSAqLwotCi0JLyoKLQkgKiBIaWdoZXN0IHN1YnhpZCB0 aGF0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSBLbm93bkFzc2lnbmVkWGlkcyBhcnJheSB0bwot CSAqIHByZXZlbnQgb3ZlcmZsb3c7IG9yIEludmFsaWRUcmFuc2FjdGlvbklkIGlmIG5vbmUu ICBXZSB0cmFjayB0aGlzIGZvcgotCSAqIHNpbWlsYXIgcmVhc29ucyB0byB0cmFja2luZyBv dmVyZmxvd2luZyBjYWNoZWQgc3VieGlkcyBpbiBQR1BST0MKLQkgKiBlbnRyaWVzLiAgTXVz dCBob2xkIGV4Y2x1c2l2ZSBQcm9jQXJyYXlMb2NrIHRvIGNoYW5nZSB0aGlzLCBhbmQgc2hh cmVkCi0JICogbG9jayB0byByZWFkIGl0LgotCSAqLwotCVRyYW5zYWN0aW9uSWQgbGFzdE92 ZXJmbG93ZWRYaWQ7CisJLyogSW4gcmVjb3ZlcnksIG9sZGVzdCBYSUQgdGhhdCBjb3VsZCBi ZSBzdGlsbCBydW5uaW5nIGluIHByaW1hcnkgKi8KKwlUcmFuc2FjdGlvbklkIG9sZGVzdF9y dW5uaW5nX3ByaW1hcnlfeGlkOwogCiAJLyogb2xkZXN0IHhtaW4gb2YgYW55IHJlcGxpY2F0 aW9uIHNsb3QgKi8KIAlUcmFuc2FjdGlvbklkIHJlcGxpY2F0aW9uX3Nsb3RfeG1pbjsKQEAg LTI1NCwxNyArMjMxLDYgQEAgdHlwZWRlZiBlbnVtIEdsb2JhbFZpc0hvcml6b25LaW5kCiAJ VklTSE9SSVpPTl9URU1QLAogfSBHbG9iYWxWaXNIb3Jpem9uS2luZDsKIAotLyoKLSAqIFJl YXNvbiBjb2RlcyBmb3IgS25vd25Bc3NpZ25lZFhpZHNDb21wcmVzcygpLgotICovCi10eXBl ZGVmIGVudW0gS0FYQ29tcHJlc3NSZWFzb24KLXsKLQlLQVhfTk9fU1BBQ0UsCQkJCS8qIG5l ZWQgdG8gZnJlZSB1cCBzcGFjZSBhdCBhcnJheSBlbmQgKi8KLQlLQVhfUFJVTkUsCQkJCQkv KiB3ZSBqdXN0IHBydW5lZCBvbGQgZW50cmllcyAqLwotCUtBWF9UUkFOU0FDVElPTl9FTkQs CQkvKiB3ZSBqdXN0IGNvbW1pdHRlZC9yZW1vdmVkIHNvbWUgWElEcyAqLwotCUtBWF9TVEFS VFVQX1BST0NFU1NfSURMRSwJLyogc3RhcnR1cCBwcm9jZXNzIGlzIGFib3V0IHRvIHNsZWVw ICovCi19IEtBWENvbXByZXNzUmVhc29uOwotCiAKIHN0YXRpYyBQcm9jQXJyYXlTdHJ1Y3Qg KnByb2NBcnJheTsKIApAQCAtMjc4LDE3ICsyNDQsOCBAQCBzdGF0aWMgVHJhbnNhY3Rpb25J ZCBjYWNoZWRYaWRJc05vdEluUHJvZ3Jlc3MgPSBJbnZhbGlkVHJhbnNhY3Rpb25JZDsKIC8q CiAgKiBCb29ra2VlcGluZyBmb3IgdHJhY2tpbmcgZW11bGF0ZWQgdHJhbnNhY3Rpb25zIGlu IHJlY292ZXJ5CiAgKi8KLXN0YXRpYyBUcmFuc2FjdGlvbklkICpLbm93bkFzc2lnbmVkWGlk czsKLXN0YXRpYyBib29sICpLbm93bkFzc2lnbmVkWGlkc1ZhbGlkOwogc3RhdGljIFRyYW5z YWN0aW9uSWQgbGF0ZXN0T2JzZXJ2ZWRYaWQgPSBJbnZhbGlkVHJhbnNhY3Rpb25JZDsKIAot LyoKLSAqIElmIHdlJ3JlIGluIFNUQU5EQllfU05BUFNIT1RfUEVORElORyBzdGF0ZSwgc3Rh bmRieVNuYXBzaG90UGVuZGluZ1htaW4gaXMKLSAqIHRoZSBoaWdoZXN0IHhpZCB0aGF0IG1p Z2h0IHN0aWxsIGJlIHJ1bm5pbmcgdGhhdCB3ZSBkb24ndCBoYXZlIGluCi0gKiBLbm93bkFz c2lnbmVkWGlkcy4KLSAqLwotc3RhdGljIFRyYW5zYWN0aW9uSWQgc3RhbmRieVNuYXBzaG90 UGVuZGluZ1htaW47Ci0KIC8qCiAgKiBTdGF0ZSBmb3IgdmlzaWJpbGl0eSBjaGVja3Mgb24g ZGlmZmVyZW50IHR5cGVzIG9mIHJlbGF0aW9ucy4gU2VlIHN0cnVjdAogICogR2xvYmFsVmlz U3RhdGUgZm9yIGRldGFpbHMuIEFzIHNoYXJlZCwgY2F0YWxvZywgbm9ybWFsIGFuZCB0ZW1w b3JhcnkKQEAgLTMxNSw3ICsyNzIsNyBAQCBzdGF0aWMgbG9uZyB4Y19ieV9teV94YWN0ID0g MDsKIHN0YXRpYyBsb25nIHhjX2J5X2xhdGVzdF94aWQgPSAwOwogc3RhdGljIGxvbmcgeGNf YnlfbWFpbl94aWQgPSAwOwogc3RhdGljIGxvbmcgeGNfYnlfY2hpbGRfeGlkID0gMDsKLXN0 YXRpYyBsb25nIHhjX2J5X2tub3duX2Fzc2lnbmVkID0gMDsKK3N0YXRpYyBsb25nIHhjX2R1 cmluZ19yZWNvdmVyeSA9IDA7CiBzdGF0aWMgbG9uZyB4Y19ub19vdmVyZmxvdyA9IDA7CiBz dGF0aWMgbG9uZyB4Y19zbG93X2Fuc3dlciA9IDA7CiAKQEAgLTMyNSw3ICsyODIsNyBAQCBz dGF0aWMgbG9uZyB4Y19zbG93X2Fuc3dlciA9IDA7CiAjZGVmaW5lIHhjX2J5X2xhdGVzdF94 aWRfaW5jKCkJCSh4Y19ieV9sYXRlc3RfeGlkKyspCiAjZGVmaW5lIHhjX2J5X21haW5feGlk X2luYygpCQkoeGNfYnlfbWFpbl94aWQrKykKICNkZWZpbmUgeGNfYnlfY2hpbGRfeGlkX2lu YygpCQkoeGNfYnlfY2hpbGRfeGlkKyspCi0jZGVmaW5lIHhjX2J5X2tub3duX2Fzc2lnbmVk X2luYygpCSh4Y19ieV9rbm93bl9hc3NpZ25lZCsrKQorI2RlZmluZSB4Y19kdXJpbmdfcmVj b3ZlcnlfaW5jKCkJKHhjX2R1cmluZ19yZWNvdmVyeSsrKQogI2RlZmluZSB4Y19ub19vdmVy Zmxvd19pbmMoKQkJKHhjX25vX292ZXJmbG93KyspCiAjZGVmaW5lIHhjX3Nsb3dfYW5zd2Vy X2luYygpCQkoeGNfc2xvd19hbnN3ZXIrKykKIApAQCAtMzM4LDI4ICsyOTUsMTIgQEAgc3Rh dGljIHZvaWQgRGlzcGxheVhpZENhY2hlKHZvaWQpOwogI2RlZmluZSB4Y19ieV9sYXRlc3Rf eGlkX2luYygpCQkoKHZvaWQpIDApCiAjZGVmaW5lIHhjX2J5X21haW5feGlkX2luYygpCQko KHZvaWQpIDApCiAjZGVmaW5lIHhjX2J5X2NoaWxkX3hpZF9pbmMoKQkJKCh2b2lkKSAwKQot I2RlZmluZSB4Y19ieV9rbm93bl9hc3NpZ25lZF9pbmMoKQkoKHZvaWQpIDApCisjZGVmaW5l IHhjX2R1cmluZ19yZWNvdmVyeV9pbmMoKQkoKHZvaWQpIDApCiAjZGVmaW5lIHhjX25vX292 ZXJmbG93X2luYygpCQkoKHZvaWQpIDApCiAjZGVmaW5lIHhjX3Nsb3dfYW5zd2VyX2luYygp CQkoKHZvaWQpIDApCiAjZW5kaWYJCQkJCQkJLyogWElEQ0FDSEVfREVCVUcgKi8KIAotLyog UHJpbWl0aXZlcyBmb3IgS25vd25Bc3NpZ25lZFhpZHMgYXJyYXkgaGFuZGxpbmcgZm9yIHN0 YW5kYnkgKi8KLXN0YXRpYyB2b2lkIEtub3duQXNzaWduZWRYaWRzQ29tcHJlc3MoS0FYQ29t cHJlc3NSZWFzb24gcmVhc29uLCBib29sIGhhdmVMb2NrKTsKLXN0YXRpYyB2b2lkIEtub3du QXNzaWduZWRYaWRzQWRkKFRyYW5zYWN0aW9uSWQgZnJvbV94aWQsIFRyYW5zYWN0aW9uSWQg dG9feGlkLAotCQkJCQkJCQkgYm9vbCBleGNsdXNpdmVfbG9jayk7Ci1zdGF0aWMgYm9vbCBL bm93bkFzc2lnbmVkWGlkc1NlYXJjaChUcmFuc2FjdGlvbklkIHhpZCwgYm9vbCByZW1vdmUp Owotc3RhdGljIGJvb2wgS25vd25Bc3NpZ25lZFhpZEV4aXN0cyhUcmFuc2FjdGlvbklkIHhp ZCk7Ci1zdGF0aWMgdm9pZCBLbm93bkFzc2lnbmVkWGlkc1JlbW92ZShUcmFuc2FjdGlvbklk IHhpZCk7Ci1zdGF0aWMgdm9pZCBLbm93bkFzc2lnbmVkWGlkc1JlbW92ZVRyZWUoVHJhbnNh Y3Rpb25JZCB4aWQsIGludCBuc3VieGlkcywKLQkJCQkJCQkJCQlUcmFuc2FjdGlvbklkICpz dWJ4aWRzKTsKLXN0YXRpYyB2b2lkIEtub3duQXNzaWduZWRYaWRzUmVtb3ZlUHJlY2VkaW5n KFRyYW5zYWN0aW9uSWQgcmVtb3ZlWGlkKTsKLXN0YXRpYyBpbnQJS25vd25Bc3NpZ25lZFhp ZHNHZXQoVHJhbnNhY3Rpb25JZCAqeGFycmF5LCBUcmFuc2FjdGlvbklkIHhtYXgpOwotc3Rh dGljIGludAlLbm93bkFzc2lnbmVkWGlkc0dldEFuZFNldFhtaW4oVHJhbnNhY3Rpb25JZCAq eGFycmF5LAotCQkJCQkJCQkJCSAgIFRyYW5zYWN0aW9uSWQgKnhtaW4sCi0JCQkJCQkJCQkJ ICAgVHJhbnNhY3Rpb25JZCB4bWF4KTsKLXN0YXRpYyBUcmFuc2FjdGlvbklkIEtub3duQXNz aWduZWRYaWRzR2V0T2xkZXN0WG1pbih2b2lkKTsKLXN0YXRpYyB2b2lkIEtub3duQXNzaWdu ZWRYaWRzRGlzcGxheShpbnQgdHJhY2VfbGV2ZWwpOwotc3RhdGljIHZvaWQgS25vd25Bc3Np Z25lZFhpZHNSZXNldCh2b2lkKTsKKwogc3RhdGljIGlubGluZSB2b2lkIFByb2NBcnJheUVu ZFRyYW5zYWN0aW9uSW50ZXJuYWwoUEdQUk9DICpwcm9jLCBUcmFuc2FjdGlvbklkIGxhdGVz dFhpZCk7CiBzdGF0aWMgdm9pZCBQcm9jQXJyYXlHcm91cENsZWFyWGlkKFBHUFJPQyAqcHJv YywgVHJhbnNhY3Rpb25JZCBsYXRlc3RYaWQpOwogc3RhdGljIHZvaWQgTWFpbnRhaW5MYXRl c3RDb21wbGV0ZWRYaWQoVHJhbnNhY3Rpb25JZCBsYXRlc3RYaWQpOwpAQCAtMzk1LDE5ICsz MzYsMTIgQEAgUHJvY0FycmF5U2htZW1TaXplKHZvaWQpCiAJICogSWRlYWxseSB3ZSdkIG9u bHkgY3JlYXRlIHRoaXMgc3RydWN0dXJlIGlmIHdlIHdlcmUgYWN0dWFsbHkgZG9pbmcgaG90 CiAJICogc3RhbmRieSBpbiB0aGUgY3VycmVudCBydW4sIGJ1dCB3ZSBkb24ndCBrbm93IHRo YXQgeWV0IGF0IHRoZSB0aW1lCiAJICogc2hhcmVkIG1lbW9yeSBpcyBiZWluZyBzZXQgdXAu CisJICoKKwkgKiBYWFg6IG1pc3BsYWNlZCBub3cKIAkgKi8KICNkZWZpbmUgVE9UQUxfTUFY X0NBQ0hFRF9TVUJYSURTIFwKIAkoKFBHUFJPQ19NQVhfQ0FDSEVEX1NVQlhJRFMgKyAxKSAq IFBST0NBUlJBWV9NQVhQUk9DUykKIAotCWlmIChFbmFibGVIb3RTdGFuZGJ5KQotCXsKLQkJ c2l6ZSA9IGFkZF9zaXplKHNpemUsCi0JCQkJCQltdWxfc2l6ZShzaXplb2YoVHJhbnNhY3Rp b25JZCksCi0JCQkJCQkJCSBUT1RBTF9NQVhfQ0FDSEVEX1NVQlhJRFMpKTsKLQkJc2l6ZSA9 IGFkZF9zaXplKHNpemUsCi0JCQkJCQltdWxfc2l6ZShzaXplb2YoYm9vbCksIFRPVEFMX01B WF9DQUNIRURfU1VCWElEUykpOwotCX0KLQogCXJldHVybiBzaXplOwogfQogCkBAIC00MzQs MzEgKzM2OCwxMiBAQCBDcmVhdGVTaGFyZWRQcm9jQXJyYXkodm9pZCkKIAkJICovCiAJCXBy b2NBcnJheS0+bnVtUHJvY3MgPSAwOwogCQlwcm9jQXJyYXktPm1heFByb2NzID0gUFJPQ0FS UkFZX01BWFBST0NTOwotCQlwcm9jQXJyYXktPm1heEtub3duQXNzaWduZWRYaWRzID0gVE9U QUxfTUFYX0NBQ0hFRF9TVUJYSURTOwotCQlwcm9jQXJyYXktPm51bUtub3duQXNzaWduZWRY aWRzID0gMDsKLQkJcHJvY0FycmF5LT50YWlsS25vd25Bc3NpZ25lZFhpZHMgPSAwOwotCQlw cm9jQXJyYXktPmhlYWRLbm93bkFzc2lnbmVkWGlkcyA9IDA7Ci0JCXByb2NBcnJheS0+bGFz dE92ZXJmbG93ZWRYaWQgPSBJbnZhbGlkVHJhbnNhY3Rpb25JZDsKIAkJcHJvY0FycmF5LT5y ZXBsaWNhdGlvbl9zbG90X3htaW4gPSBJbnZhbGlkVHJhbnNhY3Rpb25JZDsKIAkJcHJvY0Fy cmF5LT5yZXBsaWNhdGlvbl9zbG90X2NhdGFsb2dfeG1pbiA9IEludmFsaWRUcmFuc2FjdGlv bklkOwogCQlUcmFuc2FtVmFyaWFibGVzLT54YWN0Q29tcGxldGlvbkNvdW50ID0gMTsKIAl9 CiAKIAlhbGxQcm9jcyA9IFByb2NHbG9iYWwtPmFsbFByb2NzOwotCi0JLyogQ3JlYXRlIG9y IGF0dGFjaCB0byB0aGUgS25vd25Bc3NpZ25lZFhpZHMgYXJyYXlzIHRvbywgaWYgbmVlZGVk ICovCi0JaWYgKEVuYWJsZUhvdFN0YW5kYnkpCi0JewotCQlLbm93bkFzc2lnbmVkWGlkcyA9 IChUcmFuc2FjdGlvbklkICopCi0JCQlTaG1lbUluaXRTdHJ1Y3QoIktub3duQXNzaWduZWRY aWRzIiwKLQkJCQkJCQltdWxfc2l6ZShzaXplb2YoVHJhbnNhY3Rpb25JZCksCi0JCQkJCQkJ CQkgVE9UQUxfTUFYX0NBQ0hFRF9TVUJYSURTKSwKLQkJCQkJCQkmZm91bmQpOwotCQlLbm93 bkFzc2lnbmVkWGlkc1ZhbGlkID0gKGJvb2wgKikKLQkJCVNobWVtSW5pdFN0cnVjdCgiS25v d25Bc3NpZ25lZFhpZHNWYWxpZCIsCi0JCQkJCQkJbXVsX3NpemUoc2l6ZW9mKGJvb2wpLCBU T1RBTF9NQVhfQ0FDSEVEX1NVQlhJRFMpLAotCQkJCQkJCSZmb3VuZCk7Ci0JfQogfQogCiAv KgpAQCAtMTAyMiwzNDMgKzkzNywzMCBAQCBNYWludGFpbkxhdGVzdENvbXBsZXRlZFhpZFJl Y292ZXJ5KFRyYW5zYWN0aW9uSWQgbGF0ZXN0WGlkKQogdm9pZAogUHJvY0FycmF5SW5pdFJl Y292ZXJ5KFRyYW5zYWN0aW9uSWQgaW5pdGlhbGl6ZWRVcHRvWElEKQogewotCUFzc2VydChz dGFuZGJ5U3RhdGUgPT0gU1RBTkRCWV9JTklUSUFMSVpFRCk7CisJQXNzZXJ0KEluSG90U3Rh bmRieSk7CiAJQXNzZXJ0KFRyYW5zYWN0aW9uSWRJc05vcm1hbChpbml0aWFsaXplZFVwdG9Y SUQpKTsKIAogCS8qCi0JICogd2Ugc2V0IGxhdGVzdE9ic2VydmVkWGlkIHRvIHRoZSB4aWQg U1VCVFJBTlMgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgdXAKLQkgKiB0bywgc28gd2UgY2FuIGV4 dGVuZCBpdCBmcm9tIHRoYXQgcG9pbnQgb253YXJkcyBpbgotCSAqIFJlY29yZEtub3duQXNz aWduZWRUcmFuc2FjdGlvbklkcywgYW5kIHdoZW4gd2UgZ2V0IGNvbnNpc3RlbnQgaW4KLQkg KiBQcm9jQXJyYXlBcHBseVJlY292ZXJ5SW5mbygpLgorCSAqIHdlIHNldCBsYXRlc3RPYnNl cnZlZFhpZCB0byB0aGUgeGlkIFNVQlRSQU5TIGFuZCBDU04gbG9nIGhhdmUgYmVlbgorCSAq IGluaXRpYWxpemVkIHVwIHRvLCBzbyB3ZSBjYW4gZXh0ZW5kIGl0IGZyb20gdGhhdCBwb2lu dCBvbndhcmRzIHdoZW5ldmVyCisJICogd2Ugb2JzZXJ2ZSBuZXcgWElEcy4KIAkgKi8KIAls YXRlc3RPYnNlcnZlZFhpZCA9IGluaXRpYWxpemVkVXB0b1hJRDsKIAlUcmFuc2FjdGlvbklk UmV0cmVhdChsYXRlc3RPYnNlcnZlZFhpZCk7CiB9CiAKIC8qCi0gKiBQcm9jQXJyYXlBcHBs eVJlY292ZXJ5SW5mbyAtLSBhcHBseSByZWNvdmVyeSBpbmZvIGFib3V0IHhpZHMKLSAqCi0g KiBUYWtlcyB1cyB0aHJvdWdoIDMgc3RhdGVzOiBJbml0aWFsaXplZCwgUGVuZGluZyBhbmQg UmVhZHkuCi0gKiBOb3JtYWwgY2FzZSBpcyB0byBnbyBhbGwgdGhlIHdheSB0byBSZWFkeSBz dHJhaWdodCBhd2F5LCB0aG91Z2ggdGhlcmUKLSAqIGFyZSBhdHlwaWNhbCBjYXNlcyB3aGVy ZSB3ZSBuZWVkIHRvIHRha2UgaXQgaW4gc3RlcHMuCi0gKgotICogVXNlIHRoZSBkYXRhIGFi b3V0IHJ1bm5pbmcgdHJhbnNhY3Rpb25zIG9uIHRoZSBwcmltYXJ5IHRvIGNyZWF0ZSB0aGUg aW5pdGlhbAotICogc3RhdGUgb2YgS25vd25Bc3NpZ25lZFhpZHMuIFdlIGFsc28gdXNlIHRo ZXNlIHJlY29yZHMgdG8gcmVndWxhcmx5IHBydW5lCi0gKiBLbm93bkFzc2lnbmVkWGlkcyBi ZWNhdXNlIHdlIGtub3cgaXQgaXMgcG9zc2libGUgdGhhdCBzb21lIHRyYW5zYWN0aW9ucwot ICogd2l0aCBGQVRBTCBlcnJvcnMgZmFpbCB0byB3cml0ZSBhYm9ydCByZWNvcmRzLCB3aGlj aCBjb3VsZCBjYXVzZSBldmVudHVhbAotICogb3ZlcmZsb3cuCi0gKgotICogU2VlIGNvbW1l bnRzIGZvciBMb2dTdGFuZGJ5U25hcHNob3QoKS4KKyAqIFVwZGF0ZSBvbGRlc3QgcnVubmlu ZyBYSUQuIGZyb20gYSBjaGVja3BvaW50IHJlY29yZC4gVGhpcyBhbGxvd3MgdHJ1bmNhdGlu ZworICogU1VCVFJBTlMgYW5kIHRoZSBDU04gbG9nLgogICovCiB2b2lkCi1Qcm9jQXJyYXlB cHBseVJlY292ZXJ5SW5mbyhSdW5uaW5nVHJhbnNhY3Rpb25zIHJ1bm5pbmcpCitQcm9jQXJy YXlVcGRhdGVPbGRlc3RSdW5uaW5nWGlkKFRyYW5zYWN0aW9uSWQgb2xkZXN0UnVubmluZ1hJ RCkKIHsKLQlUcmFuc2FjdGlvbklkICp4aWRzOwotCVRyYW5zYWN0aW9uSWQgYWR2YW5jZU5l eHRYaWQ7Ci0JaW50CQkJbnhpZHM7Ci0JaW50CQkJaTsKLQotCUFzc2VydChzdGFuZGJ5U3Rh dGUgPj0gU1RBTkRCWV9JTklUSUFMSVpFRCk7Ci0JQXNzZXJ0KFRyYW5zYWN0aW9uSWRJc1Zh bGlkKHJ1bm5pbmctPm5leHRYaWQpKTsKLQlBc3NlcnQoVHJhbnNhY3Rpb25JZElzVmFsaWQo cnVubmluZy0+b2xkZXN0UnVubmluZ1hpZCkpOwotCUFzc2VydChUcmFuc2FjdGlvbklkSXNO b3JtYWwocnVubmluZy0+bGF0ZXN0Q29tcGxldGVkWGlkKSk7Ci0KLQkvKgotCSAqIFJlbW92 ZSBzdGFsZSB0cmFuc2FjdGlvbnMsIGlmIGFueS4KLQkgKi8KLQlFeHBpcmVPbGRLbm93bkFz c2lnbmVkVHJhbnNhY3Rpb25JZHMocnVubmluZy0+b2xkZXN0UnVubmluZ1hpZCk7Ci0KLQkv KgotCSAqIEFkanVzdCBUcmFuc2FtVmFyaWFibGVzLT5uZXh0WGlkIGJlZm9yZSBTdGFuZGJ5 UmVsZWFzZU9sZExvY2tzKCksCi0JICogYmVjYXVzZSB3ZSB3aWxsIG5lZWQgaXQgdXAgdG8g ZGF0ZSBmb3IgYWNjZXNzaW5nIHR3by1waGFzZSB0cmFuc2FjdGlvbnMKLQkgKiBpbiBTdGFu ZGJ5UmVsZWFzZU9sZExvY2tzKCkuCi0JICovCi0JYWR2YW5jZU5leHRYaWQgPSBydW5uaW5n LT5uZXh0WGlkOwotCVRyYW5zYWN0aW9uSWRSZXRyZWF0KGFkdmFuY2VOZXh0WGlkKTsKLQlB ZHZhbmNlTmV4dEZ1bGxUcmFuc2FjdGlvbklkUGFzdFhpZChhZHZhbmNlTmV4dFhpZCk7Ci0J QXNzZXJ0KEZ1bGxUcmFuc2FjdGlvbklkSXNWYWxpZChUcmFuc2FtVmFyaWFibGVzLT5uZXh0 WGlkKSk7Ci0KLQkvKgotCSAqIFJlbW92ZSBzdGFsZSBsb2NrcywgaWYgYW55LgotCSAqLwot CVN0YW5kYnlSZWxlYXNlT2xkTG9ja3MocnVubmluZy0+b2xkZXN0UnVubmluZ1hpZCk7Ci0K LQkvKgotCSAqIElmIG91ciBzbmFwc2hvdCBpcyBhbHJlYWR5IHZhbGlkLCBub3RoaW5nIGVs c2UgdG8gZG8uLi4KLQkgKi8KLQlpZiAoc3RhbmRieVN0YXRlID09IFNUQU5EQllfU05BUFNI T1RfUkVBRFkpCi0JCXJldHVybjsKLQotCS8qCi0JICogSWYgb3VyIGluaXRpYWwgUnVubmlu Z1RyYW5zYWN0aW9uc0RhdGEgaGFkIGFuIG92ZXJmbG93ZWQgc25hcHNob3QgdGhlbgotCSAq IHdlIGtuZXcgd2Ugd2VyZSBtaXNzaW5nIHNvbWUgc3VieGlkcyBmcm9tIG91ciBzbmFwc2hv dC4gSWYgd2UgY29udGludWUKLQkgKiB0byBzZWUgb3ZlcmZsb3dlZCBzbmFwc2hvdHMgdGhl biB3ZSBtaWdodCBuZXZlciBiZSBhYmxlIHRvIHN0YXJ0IHVwLCBzbwotCSAqIHdlIG1ha2Ug YW5vdGhlciB0ZXN0IHRvIHNlZSBpZiBvdXIgc25hcHNob3QgaXMgbm93IHZhbGlkLiBXZSBr bm93IHRoYXQKLQkgKiB0aGUgbWlzc2luZyBzdWJ4aWRzIGFyZSBlcXVhbCB0byBvciBlYXJs aWVyIHRoYW4gbmV4dFhpZC4gQWZ0ZXIgd2UKLQkgKiBpbml0aWFsaXNlIHdlIGNvbnRpbnVl IHRvIGFwcGx5IGNoYW5nZXMgZHVyaW5nIHJlY292ZXJ5LCBzbyBvbmNlIHRoZQotCSAqIG9s ZGVzdFJ1bm5pbmdYaWQgaXMgbGF0ZXIgdGhhbiB0aGUgbmV4dFhpZCBmcm9tIHRoZSBpbml0 aWFsIHNuYXBzaG90IHdlCi0JICoga25vdyB0aGF0IHdlIG5vIGxvbmdlciBoYXZlIG1pc3Np bmcgaW5mb3JtYXRpb24gYW5kIGNhbiBtYXJrIHRoZQotCSAqIHNuYXBzaG90IGFzIHZhbGlk LgotCSAqLwotCWlmIChzdGFuZGJ5U3RhdGUgPT0gU1RBTkRCWV9TTkFQU0hPVF9QRU5ESU5H KQotCXsKLQkJLyoKLQkJICogSWYgdGhlIHNuYXBzaG90IGlzbid0IG92ZXJmbG93ZWQgb3Ig aWYgaXRzIGVtcHR5IHdlIGNhbiByZXNldCBvdXIKLQkJICogcGVuZGluZyBzdGF0ZSBhbmQg dXNlIHRoaXMgc25hcHNob3QgaW5zdGVhZC4KLQkJICovCi0JCWlmICghcnVubmluZy0+c3Vi eGlkX292ZXJmbG93IHx8IHJ1bm5pbmctPnhjbnQgPT0gMCkKLQkJewotCQkJLyoKLQkJCSAq IElmIHdlIGhhdmUgYWxyZWFkeSBjb2xsZWN0ZWQga25vd24gYXNzaWduZWQgeGlkcywgd2Ug bmVlZCB0bwotCQkJICogdGhyb3cgdGhlbSBhd2F5IGJlZm9yZSB3ZSBhcHBseSB0aGUgcmVj b3Zlcnkgc25hcHNob3QuCi0JCQkgKi8KLQkJCUtub3duQXNzaWduZWRYaWRzUmVzZXQoKTsK LQkJCXN0YW5kYnlTdGF0ZSA9IFNUQU5EQllfSU5JVElBTElaRUQ7Ci0JCX0KLQkJZWxzZQot CQl7Ci0JCQlpZiAoVHJhbnNhY3Rpb25JZFByZWNlZGVzKHN0YW5kYnlTbmFwc2hvdFBlbmRp bmdYbWluLAotCQkJCQkJCQkJICBydW5uaW5nLT5vbGRlc3RSdW5uaW5nWGlkKSkKLQkJCXsK LQkJCQlzdGFuZGJ5U3RhdGUgPSBTVEFOREJZX1NOQVBTSE9UX1JFQURZOwotCQkJCWVsb2co REVCVUcxLAotCQkJCQkgInJlY292ZXJ5IHNuYXBzaG90cyBhcmUgbm93IGVuYWJsZWQiKTsK LQkJCX0KLQkJCWVsc2UKLQkJCQllbG9nKERFQlVHMSwKLQkJCQkJICJyZWNvdmVyeSBzbmFw c2hvdCB3YWl0aW5nIGZvciBub24tb3ZlcmZsb3dlZCBzbmFwc2hvdCBvciAiCi0JCQkJCSAi dW50aWwgb2xkZXN0IGFjdGl2ZSB4aWQgb24gc3RhbmRieSBpcyBhdCBsZWFzdCAldSAobm93 ICV1KSIsCi0JCQkJCSBzdGFuZGJ5U25hcHNob3RQZW5kaW5nWG1pbiwKLQkJCQkJIHJ1bm5p bmctPm9sZGVzdFJ1bm5pbmdYaWQpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JQXNzZXJ0 KHN0YW5kYnlTdGF0ZSA9PSBTVEFOREJZX0lOSVRJQUxJWkVEKTsKLQotCS8qCi0JICogTkI6 IHRoaXMgY2FuIGJlIHJlYWNoZWQgYXQgbGVhc3QgdHdpY2UsIHNvIG1ha2Ugc3VyZSBuZXcg Y29kZSBjYW4gZGVhbAotCSAqIHdpdGggdGhhdC4KLQkgKi8KLQotCS8qCi0JICogTm9ib2R5 IGVsc2UgaXMgcnVubmluZyB5ZXQsIGJ1dCB0YWtlIGxvY2tzIGFueWhvdwotCSAqLwogCUxX TG9ja0FjcXVpcmUoUHJvY0FycmF5TG9jaywgTFdfRVhDTFVTSVZFKTsKLQotCS8qCi0JICog S25vd25Bc3NpZ25lZFhpZHMgaXMgc29ydGVkIHNvIHdlIGNhbm5vdCBqdXN0IGFkZCB0aGUg eGlkcywgd2UgaGF2ZSB0bwotCSAqIHNvcnQgdGhlbSBmaXJzdC4KLQkgKgotCSAqIFNvbWUg b2YgdGhlIG5ldyB4aWRzIGFyZSB0b3AtbGV2ZWwgeGlkcyBhbmQgc29tZSBhcmUgc3VidHJh bnNhY3Rpb25zLgotCSAqIFdlIGRvbid0IGNhbGwgU3ViVHJhbnNTZXRQYXJlbnQgYmVjYXVz ZSBpdCBkb2Vzbid0IG1hdHRlciB5ZXQuIElmIHdlCi0JICogYXJlbid0IG92ZXJmbG93ZWQg dGhlbiBhbGwgeGlkcyB3aWxsIGZpdCBpbiBzbmFwc2hvdCBhbmQgc28gd2UgZG9uJ3QKLQkg KiBuZWVkIHN1YnRyYW5zLiBJZiB3ZSBsYXRlciBvdmVyZmxvdywgYW4geGlkIGFzc2lnbm1l bnQgcmVjb3JkIHdpbGwgYWRkCi0JICogeGlkcyB0byBzdWJ0cmFucy4gSWYgUnVubmluZ1Ry YW5zYWN0aW9uc0RhdGEgaXMgb3ZlcmZsb3dlZCB0aGVuIHdlCi0JICogZG9uJ3QgaGF2ZSBl bm91Z2ggaW5mb3JtYXRpb24gdG8gY29ycmVjdGx5IHVwZGF0ZSBzdWJ0cmFucyBhbnl3YXku Ci0JICovCi0KLQkvKgotCSAqIEFsbG9jYXRlIGEgdGVtcG9yYXJ5IGFycmF5IHRvIGF2b2lk IG1vZGlmeWluZyB0aGUgYXJyYXkgcGFzc2VkIGFzCi0JICogYXJndW1lbnQuCi0JICovCi0J eGlkcyA9IHBhbGxvYyhzaXplb2YoVHJhbnNhY3Rpb25JZCkgKiAocnVubmluZy0+eGNudCAr IHJ1bm5pbmctPnN1YnhjbnQpKTsKLQotCS8qCi0JICogQWRkIHRvIHRoZSB0ZW1wIGFycmF5 IGFueSB4aWRzIHdoaWNoIGhhdmUgbm90IGFscmVhZHkgY29tcGxldGVkLgotCSAqLwotCW54 aWRzID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgcnVubmluZy0+eGNudCArIHJ1bm5pbmctPnN1 YnhjbnQ7IGkrKykKLQl7Ci0JCVRyYW5zYWN0aW9uSWQgeGlkID0gcnVubmluZy0+eGlkc1tp XTsKLQotCQkvKgotCQkgKiBUaGUgcnVubmluZy14YWN0cyBzbmFwc2hvdCBjYW4gY29udGFp biB4aWRzIHRoYXQgd2VyZSBzdGlsbCB2aXNpYmxlCi0JCSAqIGluIHRoZSBwcm9jYXJyYXkg d2hlbiB0aGUgc25hcHNob3Qgd2FzIHRha2VuLCBidXQgd2VyZSBhbHJlYWR5Ci0JCSAqIFdB TC1sb2dnZWQgYXMgY29tcGxldGVkLiBUaGV5J3JlIG5vdCBydW5uaW5nIGFueW1vcmUsIHNv IGlnbm9yZQotCQkgKiB0aGVtLgotCQkgKi8KLQkJaWYgKFRyYW5zYWN0aW9uSWREaWRDb21t aXQoeGlkKSB8fCBUcmFuc2FjdGlvbklkRGlkQWJvcnQoeGlkKSkKLQkJCWNvbnRpbnVlOwot Ci0JCXhpZHNbbnhpZHMrK10gPSB4aWQ7Ci0JfQotCi0JaWYgKG54aWRzID4gMCkKLQl7Ci0J CWlmIChwcm9jQXJyYXktPm51bUtub3duQXNzaWduZWRYaWRzICE9IDApCi0JCXsKLQkJCUxX TG9ja1JlbGVhc2UoUHJvY0FycmF5TG9jayk7Ci0JCQllbG9nKEVSUk9SLCAiS25vd25Bc3Np Z25lZFhpZHMgaXMgbm90IGVtcHR5Iik7Ci0JCX0KLQotCQkvKgotCQkgKiBTb3J0IHRoZSBh cnJheSBzbyB0aGF0IHdlIGNhbiBhZGQgdGhlbSBzYWZlbHkgaW50bwotCQkgKiBLbm93bkFz c2lnbmVkWGlkcy4KLQkJICoKLQkJICogV2UgaGF2ZSB0byBzb3J0IHRoZW0gbG9naWNhbGx5 LCBiZWNhdXNlIGluIEtub3duQXNzaWduZWRYaWRzQWRkIHdlCi0JCSAqIGNhbGwgVHJhbnNh Y3Rpb25JZEZvbGxvd3NPckVxdWFscyBhbmQgc28gb24uIEJ1dCB3ZSBrbm93IHRoZXNlIFhJ RHMKLQkJICogY29tZSBmcm9tIFJVTk5JTkdfWEFDVFMsIHdoaWNoIG1lYW5zIHRoZXJlIGFy ZSBvbmx5IG5vcm1hbCBYSURzCi0JCSAqIGZyb20gdGhlIHNhbWUgZXBvY2gsIHNvIHRoaXMg aXMgc2FmZS4KLQkJICovCi0JCXFzb3J0KHhpZHMsIG54aWRzLCBzaXplb2YoVHJhbnNhY3Rp b25JZCksIHhpZExvZ2ljYWxDb21wYXJhdG9yKTsKLQotCQkvKgotCQkgKiBBZGQgdGhlIHNv cnRlZCBzbmFwc2hvdCBpbnRvIEtub3duQXNzaWduZWRYaWRzLiAgVGhlIHJ1bm5pbmcteGFj dHMKLQkJICogc25hcHNob3QgbWF5IGluY2x1ZGUgZHVwbGljYXRlZCB4aWRzIGJlY2F1c2Ug b2YgcHJlcGFyZWQKLQkJICogdHJhbnNhY3Rpb25zLCBzbyBpZ25vcmUgdGhlbS4KLQkJICov Ci0JCWZvciAoaSA9IDA7IGkgPCBueGlkczsgaSsrKQotCQl7Ci0JCQlpZiAoaSA+IDAgJiYg VHJhbnNhY3Rpb25JZEVxdWFscyh4aWRzW2kgLSAxXSwgeGlkc1tpXSkpCi0JCQl7Ci0JCQkJ ZWxvZyhERUJVRzEsCi0JCQkJCSAiZm91bmQgZHVwbGljYXRlZCB0cmFuc2FjdGlvbiAldSBm b3IgS25vd25Bc3NpZ25lZFhpZHMgaW5zZXJ0aW9uIiwKLQkJCQkJIHhpZHNbaV0pOwotCQkJ CWNvbnRpbnVlOwotCQkJfQotCQkJS25vd25Bc3NpZ25lZFhpZHNBZGQoeGlkc1tpXSwgeGlk c1tpXSwgdHJ1ZSk7Ci0JCX0KLQotCQlLbm93bkFzc2lnbmVkWGlkc0Rpc3BsYXkoREVCVUcz KTsKLQl9Ci0KLQlwZnJlZSh4aWRzKTsKLQotCS8qCi0JICogbGF0ZXN0T2JzZXJ2ZWRYaWQg aXMgYXQgbGVhc3Qgc2V0IHRvIHRoZSBwb2ludCB3aGVyZSBTVUJUUkFOUyB3YXMKLQkgKiBz dGFydGVkIHVwIHRvIChjZi4gUHJvY0FycmF5SW5pdFJlY292ZXJ5KCkpIG9yIHRvIHRoZSBi aWdnZXN0IHhpZAotCSAqIFJlY29yZEtub3duQXNzaWduZWRUcmFuc2FjdGlvbklkcygpIHdh cyBjYWxsZWQgZm9yLiAgSW5pdGlhbGl6ZQotCSAqIHN1YnRyYW5zIGZyb20gdGhlcmVvbiwg dXAgdG8gbmV4dFhpZCAtIDEuCi0JICoKLQkgKiBXZSBuZWVkIHRvIGR1cGxpY2F0ZSBwYXJ0 cyBvZiBSZWNvcmRLbm93bkFzc2lnbmVkVHJhbnNhY3Rpb25JZCgpIGhlcmUsCi0JICogYmVj YXVzZSB3ZSd2ZSBqdXN0IGFkZGVkIHhpZHMgdG8gdGhlIGtub3duIGFzc2lnbmVkIHhpZHMg bWFjaGluZXJ5IHRoYXQKLQkgKiBoYXZlbid0IGdvbmUgdGhyb3VnaCBSZWNvcmRLbm93bkFz c2lnbmVkVHJhbnNhY3Rpb25JZCgpLgotCSAqLwotCUFzc2VydChUcmFuc2FjdGlvbklkSXNO b3JtYWwobGF0ZXN0T2JzZXJ2ZWRYaWQpKTsKLQlUcmFuc2FjdGlvbklkQWR2YW5jZShsYXRl c3RPYnNlcnZlZFhpZCk7Ci0Jd2hpbGUgKFRyYW5zYWN0aW9uSWRQcmVjZWRlcyhsYXRlc3RP YnNlcnZlZFhpZCwgcnVubmluZy0+bmV4dFhpZCkpCi0JewotCQlFeHRlbmRTVUJUUkFOUyhs YXRlc3RPYnNlcnZlZFhpZCk7Ci0JCVRyYW5zYWN0aW9uSWRBZHZhbmNlKGxhdGVzdE9ic2Vy dmVkWGlkKTsKLQl9Ci0JVHJhbnNhY3Rpb25JZFJldHJlYXQobGF0ZXN0T2JzZXJ2ZWRYaWQp OwkvKiA9IHJ1bm5pbmctPm5leHRYaWQgLSAxICovCi0KLQkvKiAtLS0tLS0tLS0tCi0JICog Tm93IHdlJ3ZlIGdvdCB0aGUgcnVubmluZyB4aWRzIHdlIG5lZWQgdG8gc2V0IHRoZSBnbG9i YWwgdmFsdWVzIHRoYXQKLQkgKiBhcmUgdXNlZCB0byB0cmFjayBzbmFwc2hvdHMgYXMgdGhl eSBldm9sdmUgZnVydGhlci4KLQkgKgotCSAqIC0gbGF0ZXN0Q29tcGxldGVkWGlkIHdoaWNo IHdpbGwgYmUgdGhlIHhtYXggZm9yIHNuYXBzaG90cwotCSAqIC0gbGFzdE92ZXJmbG93ZWRY aWQgd2hpY2ggc2hvd3Mgd2hldGhlciBzbmFwc2hvdHMgb3ZlcmZsb3cKLQkgKiAtIG5leHRY aWQKLQkgKgotCSAqIElmIHRoZSBzbmFwc2hvdCBvdmVyZmxvd2VkLCB0aGVuIHdlIHN0aWxs IGluaXRpYWxpc2Ugd2l0aCB3aGF0IHdlIGtub3csCi0JICogYnV0IHRoZSByZWNvdmVyeSBz bmFwc2hvdCBpc24ndCBmdWxseSB2YWxpZCB5ZXQgYmVjYXVzZSB3ZSBrbm93IHRoZXJlCi0J ICogYXJlIHNvbWUgc3VieGlkcyBtaXNzaW5nLiBXZSBkb24ndCBrbm93IHRoZSBzcGVjaWZp YyBzdWJ4aWRzIHRoYXQgYXJlCi0JICogbWlzc2luZywgc28gY29uc2VydmF0aXZlbHkgYXNz dW1lIHRoZSBsYXN0IG9uZSBpcyBsYXRlc3RPYnNlcnZlZFhpZC4KLQkgKiAtLS0tLS0tLS0t Ci0JICovCi0JaWYgKHJ1bm5pbmctPnN1YnhpZF9vdmVyZmxvdykKLQl7Ci0JCXN0YW5kYnlT dGF0ZSA9IFNUQU5EQllfU05BUFNIT1RfUEVORElORzsKLQotCQlzdGFuZGJ5U25hcHNob3RQ ZW5kaW5nWG1pbiA9IGxhdGVzdE9ic2VydmVkWGlkOwotCQlwcm9jQXJyYXktPmxhc3RPdmVy Zmxvd2VkWGlkID0gbGF0ZXN0T2JzZXJ2ZWRYaWQ7Ci0JfQotCWVsc2UKLQl7Ci0JCXN0YW5k YnlTdGF0ZSA9IFNUQU5EQllfU05BUFNIT1RfUkVBRFk7Ci0KLQkJc3RhbmRieVNuYXBzaG90 UGVuZGluZ1htaW4gPSBJbnZhbGlkVHJhbnNhY3Rpb25JZDsKLQl9Ci0KLQkvKgotCSAqIElm IGEgdHJhbnNhY3Rpb24gd3JvdGUgYSBjb21taXQgcmVjb3JkIGluIHRoZSBnYXAgYmV0d2Vl biB0YWtpbmcgYW5kCi0JICogbG9nZ2luZyB0aGUgc25hcHNob3QgdGhlbiBsYXRlc3RDb21w bGV0ZWRYaWQgbWF5IGFscmVhZHkgYmUgaGlnaGVyIHRoYW4KLQkgKiB0aGUgdmFsdWUgZnJv bSB0aGUgc25hcHNob3QsIHNvIGNoZWNrIGJlZm9yZSB3ZSB1c2UgdGhlIGluY29taW5nIHZh bHVlLgotCSAqIEl0IGFsc28gbWlnaHQgbm90IHlldCBiZSBzZXQgYXQgYWxsLgotCSAqLwot CU1haW50YWluTGF0ZXN0Q29tcGxldGVkWGlkUmVjb3ZlcnkocnVubmluZy0+bGF0ZXN0Q29t cGxldGVkWGlkKTsKLQotCS8qCi0JICogTkI6IE5vIG5lZWQgdG8gaW5jcmVtZW50IFRyYW5z YW1WYXJpYWJsZXMtPnhhY3RDb21wbGV0aW9uQ291bnQgaGVyZSwKLQkgKiBub2JvZHkgY2Fu IHNlZSBpdCB5ZXQuCi0JICovCi0KKwlwcm9jQXJyYXktPm9sZGVzdF9ydW5uaW5nX3ByaW1h cnlfeGlkID0gb2xkZXN0UnVubmluZ1hJRDsKIAlMV0xvY2tSZWxlYXNlKFByb2NBcnJheUxv Y2spOwotCi0JS25vd25Bc3NpZ25lZFhpZHNEaXNwbGF5KERFQlVHMyk7Ci0JaWYgKHN0YW5k YnlTdGF0ZSA9PSBTVEFOREJZX1NOQVBTSE9UX1JFQURZKQotCQllbG9nKERFQlVHMSwgInJl Y292ZXJ5IHNuYXBzaG90cyBhcmUgbm93IGVuYWJsZWQiKTsKLQllbHNlCi0JCWVsb2coREVC VUcxLAotCQkJICJyZWNvdmVyeSBzbmFwc2hvdCB3YWl0aW5nIGZvciBub24tb3ZlcmZsb3dl ZCBzbmFwc2hvdCBvciAiCi0JCQkgInVudGlsIG9sZGVzdCBhY3RpdmUgeGlkIG9uIHN0YW5k YnkgaXMgYXQgbGVhc3QgJXUgKG5vdyAldSkiLAotCQkJIHN0YW5kYnlTbmFwc2hvdFBlbmRp bmdYbWluLAotCQkJIHJ1bm5pbmctPm9sZGVzdFJ1bm5pbmdYaWQpOwogfQogCi0vKgotICog UHJvY0FycmF5QXBwbHlYaWRBc3NpZ25tZW50Ci0gKgkJUHJvY2VzcyBhbiBYTE9HX1hBQ1Rf QVNTSUdOTUVOVCBXQUwgcmVjb3JkCi0gKi8KLXZvaWQKLVByb2NBcnJheUFwcGx5WGlkQXNz aWdubWVudChUcmFuc2FjdGlvbklkIHRvcHhpZCwKLQkJCQkJCQlpbnQgbnN1YnhpZHMsIFRy YW5zYWN0aW9uSWQgKnN1YnhpZHMpCi17Ci0JVHJhbnNhY3Rpb25JZCBtYXhfeGlkOwotCWlu dAkJCWk7Ci0KLQlBc3NlcnQoc3RhbmRieVN0YXRlID49IFNUQU5EQllfSU5JVElBTElaRUQp OwotCi0JbWF4X3hpZCA9IFRyYW5zYWN0aW9uSWRMYXRlc3QodG9weGlkLCBuc3VieGlkcywg c3VieGlkcyk7Ci0KLQkvKgotCSAqIE1hcmsgYWxsIHRoZSBzdWJ0cmFuc2FjdGlvbnMgYXMg b2JzZXJ2ZWQuCi0JICoKLQkgKiBOT1RFOiBUaGlzIHdpbGwgZmFpbCBpZiB0aGUgc3VieGlk IGNvbnRhaW5zIHRvbyBtYW55IHByZXZpb3VzbHkKLQkgKiB1bm9ic2VydmVkIHhpZHMgdG8g Zml0IGludG8ga25vd24tYXNzaWduZWQteGlkcy4gVGhhdCBzaG91bGRuJ3QgaGFwcGVuCi0J ICogYXMgdGhlIGNvZGUgc3RhbmRzLCBiZWNhdXNlIHhpZC1hc3NpZ25tZW50IHJlY29yZHMg c2hvdWxkIG5ldmVyIGNvbnRhaW4KLQkgKiBtb3JlIHRoYW4gUEdQUk9DX01BWF9DQUNIRURf U1VCWElEUyBlbnRyaWVzLgotCSAqLwotCVJlY29yZEtub3duQXNzaWduZWRUcmFuc2FjdGlv bklkcyhtYXhfeGlkKTsKLQotCS8qCi0JICogTm90aWNlIHRoYXQgd2UgdXBkYXRlIHBnX3N1 YnRyYW5zIHdpdGggdGhlIHRvcC1sZXZlbCB4aWQsIHJhdGhlciB0aGFuCi0JICogdGhlIHBh cmVudCB4aWQuIFRoaXMgaXMgYSBkaWZmZXJlbmNlIGJldHdlZW4gbm9ybWFsIHByb2Nlc3Np bmcgYW5kCi0JICogcmVjb3ZlcnksIHlldCBpcyBzdGlsbCBjb3JyZWN0IGluIGFsbCBjYXNl cy4gVGhlIHJlYXNvbiBpcyB0aGF0Ci0JICogc3VidHJhbnNhY3Rpb24gY29tbWl0IGlzIG5v dCBtYXJrZWQgaW4gY2xvZyB1bnRpbCBjb21taXQgcHJvY2Vzc2luZywgc28KLQkgKiBhbGwg YWJvcnRlZCBzdWJ0cmFuc2FjdGlvbnMgaGF2ZSBhbHJlYWR5IGJlZW4gY2xlYXJseSBtYXJr ZWQgaW4gY2xvZy4KLQkgKiBBcyBhIHJlc3VsdCB3ZSBhcmUgYWJsZSB0byByZWZlciBkaXJl Y3RseSB0byB0aGUgdG9wLWxldmVsCi0JICogdHJhbnNhY3Rpb24ncyBzdGF0ZSByYXRoZXIg dGhhbiBza2lwcGluZyB0aHJvdWdoIGFsbCB0aGUgaW50ZXJtZWRpYXRlCi0JICogc3RhdGVz IGluIHRoZSBzdWJ0cmFuc2FjdGlvbiB0cmVlLiBUaGlzIHNob3VsZCBiZSB0aGUgZmlyc3Qg dGltZSB3ZQotCSAqIGhhdmUgYXR0ZW1wdGVkIHRvIFN1YlRyYW5zU2V0UGFyZW50KCkuCi0J ICovCi0JZm9yIChpID0gMDsgaSA8IG5zdWJ4aWRzOyBpKyspCi0JCVN1YlRyYW5zU2V0UGFy ZW50KHN1YnhpZHNbaV0sIHRvcHhpZCk7Ci0KLQkvKiBLbm93bkFzc2lnbmVkWGlkcyBpc24n dCBtYWludGFpbmVkIHlldCwgc28gd2UncmUgZG9uZSBmb3Igbm93ICovCi0JaWYgKHN0YW5k YnlTdGF0ZSA9PSBTVEFOREJZX0lOSVRJQUxJWkVEKQotCQlyZXR1cm47Ci0KLQkvKgotCSAq IFVzZXMgc2FtZSBsb2NraW5nIGFzIHRyYW5zYWN0aW9uIGNvbW1pdAotCSAqLwotCUxXTG9j a0FjcXVpcmUoUHJvY0FycmF5TG9jaywgTFdfRVhDTFVTSVZFKTsKLQotCS8qCi0JICogUmVt b3ZlIHN1YnhpZHMgZnJvbSBrbm93bi1hc3NpZ25lZC14YWN0cy4KLQkgKi8KLQlLbm93bkFz c2lnbmVkWGlkc1JlbW92ZVRyZWUoSW52YWxpZFRyYW5zYWN0aW9uSWQsIG5zdWJ4aWRzLCBz dWJ4aWRzKTsKLQotCS8qCi0JICogQWR2YW5jZSBsYXN0T3ZlcmZsb3dlZFhpZCB0byBiZSBh dCBsZWFzdCB0aGUgbGFzdCBvZiB0aGVzZSBzdWJ4aWRzLgotCSAqLwotCWlmIChUcmFuc2Fj dGlvbklkUHJlY2VkZXMocHJvY0FycmF5LT5sYXN0T3ZlcmZsb3dlZFhpZCwgbWF4X3hpZCkp Ci0JCXByb2NBcnJheS0+bGFzdE92ZXJmbG93ZWRYaWQgPSBtYXhfeGlkOwotCi0JTFdMb2Nr UmVsZWFzZShQcm9jQXJyYXlMb2NrKTsKLX0KIAogLyoKICAqIFRyYW5zYWN0aW9uSWRJc0lu UHJvZ3Jlc3MgLS0gaXMgZ2l2ZW4gdHJhbnNhY3Rpb24gcnVubmluZyBpbiBzb21lIGJhY2tl bmQKQEAgLTEzNjYsMTUgKzk2OCwxNyBAQCBQcm9jQXJyYXlBcHBseVhpZEFzc2lnbm1lbnQo VHJhbnNhY3Rpb25JZCB0b3B4aWQsCiAgKiBBc2lkZSBmcm9tIHNvbWUgc2hvcnRjdXRzIHN1 Y2ggYXMgY2hlY2tpbmcgUmVjZW50WG1pbiBhbmQgb3VyIG93biBYaWQsCiAgKiB0aGVyZSBh cmUgZm91ciBwb3NzaWJpbGl0aWVzIGZvciBmaW5kaW5nIGEgcnVubmluZyB0cmFuc2FjdGlv bjoKICAqCi0gKiAxLiBUaGUgZ2l2ZW4gWGlkIGlzIGEgbWFpbiB0cmFuc2FjdGlvbiBJZC4g IFdlIHdpbGwgZmluZCB0aGlzIG91dCBjaGVhcGx5CisgKgorICogMS4gSW4gSG90IFN0YW5k YnkgbW9kZSwgdGhlcmUgYXJlIG5vIHRyYW5zYWN0aW9ucyB3aXRoIFhJRHMgYWN0aXZlIGlu IHRoZQorICogc3RhbmRieS4gQ2hlY2sgcGdfeGFjdCB0byBzZWUgaWYgdGhlIHRyYW5zYWN0 aW9uIG1pZ2h0IHN0aWxsIGJlIHJ1bm5pbmcgb24KKyAqIHRoZSBwcmltYXJ5LgorICoKKyAq IDIuIFRoZSBnaXZlbiBYaWQgaXMgYSBtYWluIHRyYW5zYWN0aW9uIElkLiAgV2Ugd2lsbCBm aW5kIHRoaXMgb3V0IGNoZWFwbHkKICAqIGJ5IGxvb2tpbmcgYXQgUHJvY0dsb2JhbC0+eGlk cy4KICAqCi0gKiAyLiBUaGUgZ2l2ZW4gWGlkIGlzIG9uZSBvZiB0aGUgY2FjaGVkIHN1Ynhh Y3QgWGlkcyBpbiB0aGUgUEdQUk9DIGFycmF5LgorICogMy4gVGhlIGdpdmVuIFhpZCBpcyBv bmUgb2YgdGhlIGNhY2hlZCBzdWJ4YWN0IFhpZHMgaW4gdGhlIFBHUFJPQyBhcnJheS4KICAq IFdlIGNhbiBmaW5kIHRoaXMgb3V0IGNoZWFwbHkgdG9vLgogICoKLSAqIDMuIEluIEhvdCBT dGFuZGJ5IG1vZGUsIHdlIG11c3Qgc2VhcmNoIHRoZSBLbm93bkFzc2lnbmVkWGlkcyBsaXN0 IHRvIHNlZQotICogaWYgdGhlIFhpZCBpcyBydW5uaW5nIG9uIHRoZSBwcmltYXJ5LgotICoK ICAqIDQuIFNlYXJjaCB0aGUgU3ViVHJhbnMgdHJlZSB0byBmaW5kIHRoZSBYaWQncyB0b3Bt b3N0IHBhcmVudCwgYW5kIHRoZW4gc2VlCiAgKiBpZiB0aGF0IGlzIHJ1bm5pbmcgYWNjb3Jk aW5nIHRvIFByb2NHbG9iYWwtPnhpZHNbXSBvciBLbm93bkFzc2lnbmVkWGlkcy4KICAqIFRo aXMgaXMgdGhlIHNsb3dlc3Qgd2F5LCBidXQgc2FkbHkgaXQgaGFzIHRvIGJlIGRvbmUgYWx3 YXlzIGlmIHRoZSBvdGhlcnMKQEAgLTE0MjMsNiArMTAyNywyOCBAQCBUcmFuc2FjdGlvbklk SXNJblByb2dyZXNzKFRyYW5zYWN0aW9uSWQgeGlkKQogCQlyZXR1cm4gZmFsc2U7CiAJfQog CisJLyoKKwkgKiBJbiBob3Qgc3RhbmRieSBtb2RlLCBjaGVjayBwZ194YWN0LgorCSAqCisJ ICogV2l0aCBub3JtYWwgbm9uLUNTTiBzbmFwc2hvdHMsIHlvdSBtdXN0IGJlIGNhcmVmdWwg dG8gY2hlY2sKKwkgKiBUcmFuc2FjdGlvbklkSXNJblByb2dyZXNzKCkgYmVmb3JlIGNoZWNr aW5nIHBnX3hhY3QsIGJlY2F1c2UgYQorCSAqIHRyYW5zYWN0aW9uIGlzIG1hcmtlZCBhcyBj b21taXR0ZWQgYmVmb3JlIGl0J3MgcmVtb3ZlZCBmcm9tIFBHUFJPQy4gQnV0CisJICogZHVy aW5nIHJlY292ZXJ5LCB3ZSBub3cgdXNlIENTTiBzbmFwc2hvdHMgc28gSSB0aGluayB0aGF0 J3MgT0suIFNlZSB0aGUKKwkgKiAiTk9URSIgYXQgdGhlIHRvcCBvZiBoZWFwYW1fdmlzaWJp bGl0eS5jLgorCSAqCisJICogRHVyaW5nIHJlY292ZXJ5LCB0aGUgWElEIGNhbm5vdCBiZSBv dXIgb3duIHRyYW5zYWN0aW9uLCBhbmQgdGhlIENTTgorCSAqIGNoZWNrIGhhbmRsZXMgc3Vi dHJhbnNhY3Rpb25zIHRvbywgc28gd2UgY2FuIHNraXAgdGhlIHJlc3Qgb2YgdGhlCisJICog ZnVuY3Rpb24uCisJICovCisJaWYgKFJlY292ZXJ5SW5Qcm9ncmVzcygpKQorCXsKKwkJeGNf ZHVyaW5nX3JlY292ZXJ5X2luYygpOworCQlpZiAoVHJhbnNhY3Rpb25JZERpZENvbW1pdCh4 aWQpIHx8IFRyYW5zYWN0aW9uSWREaWRBYm9ydCh4aWQpKQorCQkJcmV0dXJuIGZhbHNlOwor CQllbHNlCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisKIAkvKgogCSAqIEFsc28sIHdlIGNhbiBo YW5kbGUgb3VyIG93biB0cmFuc2FjdGlvbiAoYW5kIHN1YnRyYW5zYWN0aW9ucykgd2l0aG91 dAogCSAqIGFueSBhY2Nlc3MgdG8gc2hhcmVkIG1lbW9yeS4KQEAgLTE0MzksMTIgKzEwNjUs NyBAQCBUcmFuc2FjdGlvbklkSXNJblByb2dyZXNzKFRyYW5zYWN0aW9uSWQgeGlkKQogCSAq LwogCWlmICh4aWRzID09IE5VTEwpCiAJewotCQkvKgotCQkgKiBJbiBob3Qgc3RhbmRieSBt b2RlLCByZXNlcnZlIGVub3VnaCBzcGFjZSB0byBob2xkIGFsbCB4aWRzIGluIHRoZQotCQkg KiBrbm93bi1hc3NpZ25lZCBsaXN0LiBJZiB3ZSBsYXRlciBmaW5pc2ggcmVjb3ZlcnksIHdl IG5vIGxvbmdlciBuZWVkCi0JCSAqIHRoZSBiaWdnZXIgYXJyYXksIGJ1dCB3ZSBkb24ndCBi b3RoZXIgdG8gc2hyaW5rIGl0LgotCQkgKi8KLQkJaW50CQkJbWF4eGlkcyA9IFJlY292ZXJ5 SW5Qcm9ncmVzcygpID8gVE9UQUxfTUFYX0NBQ0hFRF9TVUJYSURTIDogYXJyYXlQLT5tYXhQ cm9jczsKKwkJaW50CQkJbWF4eGlkcyA9IGFycmF5UC0+bWF4UHJvY3M7CiAKIAkJeGlkcyA9 IChUcmFuc2FjdGlvbklkICopIG1hbGxvYyhtYXh4aWRzICogc2l6ZW9mKFRyYW5zYWN0aW9u SWQpKTsKIAkJaWYgKHhpZHMgPT0gTlVMTCkKQEAgLTE1MzksMzMgKzExNjAsNiBAQCBUcmFu c2FjdGlvbklkSXNJblByb2dyZXNzKFRyYW5zYWN0aW9uSWQgeGlkKQogCQkJeGlkc1tueGlk cysrXSA9IHB4aWQ7CiAJfQogCi0JLyoKLQkgKiBTdGVwIDM6IGluIGhvdCBzdGFuZGJ5IG1v ZGUsIGNoZWNrIHRoZSBrbm93bi1hc3NpZ25lZC14aWRzIGxpc3QuICBYSURzCi0JICogaW4g dGhlIGxpc3QgbXVzdCBiZSB0cmVhdGVkIGFzIHJ1bm5pbmcuCi0JICovCi0JaWYgKFJlY292 ZXJ5SW5Qcm9ncmVzcygpKQotCXsKLQkJLyogbm9uZSBvZiB0aGUgUEdQUk9DIGVudHJpZXMg c2hvdWxkIGhhdmUgWElEcyBpbiBob3Qgc3RhbmRieSBtb2RlICovCi0JCUFzc2VydChueGlk cyA9PSAwKTsKLQotCQlpZiAoS25vd25Bc3NpZ25lZFhpZEV4aXN0cyh4aWQpKQotCQl7Ci0J CQlMV0xvY2tSZWxlYXNlKFByb2NBcnJheUxvY2spOwotCQkJeGNfYnlfa25vd25fYXNzaWdu ZWRfaW5jKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCS8qCi0JCSAqIElmIHRoZSBL bm93bkFzc2lnbmVkWGlkcyBvdmVyZmxvd2VkLCB3ZSBoYXZlIHRvIGNoZWNrIHBnX3N1YnRy YW5zCi0JCSAqIHRvby4gIEZldGNoIGFsbCB4aWRzIGZyb20gS25vd25Bc3NpZ25lZFhpZHMg dGhhdCBhcmUgbG93ZXIgdGhhbgotCQkgKiB4aWQsIHNpbmNlIGlmIHhpZCBpcyBhIHN1YnRy YW5zYWN0aW9uIGl0cyBwYXJlbnQgd2lsbCBhbHdheXMgaGF2ZSBhCi0JCSAqIGxvd2VyIHZh bHVlLiAgTm90ZSB3ZSB3aWxsIGNvbGxlY3QgYm90aCBtYWluIGFuZCBzdWJYSURzIGhlcmUs IGJ1dAotCQkgKiB0aGVyZSdzIG5vIGhlbHAgZm9yIGl0LgotCQkgKi8KLQkJaWYgKFRyYW5z YWN0aW9uSWRQcmVjZWRlc09yRXF1YWxzKHhpZCwgcHJvY0FycmF5LT5sYXN0T3ZlcmZsb3dl ZFhpZCkpCi0JCQlueGlkcyA9IEtub3duQXNzaWduZWRYaWRzR2V0KHhpZHMsIHhpZCk7Ci0J fQotCiAJTFdMb2NrUmVsZWFzZShQcm9jQXJyYXlMb2NrKTsKIAogCS8qCkBAIC0xODM5LDgg KzE0MzMsNyBAQCBDb21wdXRlWGlkSG9yaXpvbnMoQ29tcHV0ZVhpZEhvcml6b25zUmVzdWx0 ICpoKQogCQkgKiBjYW4ndCBiZSB0aWVkIHRvIGEgc3BlY2lmaWMgZGF0YWJhc2UuKQogCQkg KgogCQkgKiBBbHNvLCB3aGlsZSBpbiByZWNvdmVyeSB3ZSBjYW5ub3QgY29tcHV0ZSBhbiBh Y2N1cmF0ZSBwZXItZGF0YWJhc2UKLQkJICogaG9yaXpvbiwgYXMgYWxsIHhpZHMgYXJlIG1h bmFnZWQgdmlhIHRoZSBLbm93bkFzc2lnbmVkWGlkcwotCQkgKiBtYWNoaW5lcnkuCisJCSAq IGhvcml6b24sIGFzIGFsbCB4aWRzIGFyZSBtYW5hZ2VkIHZpYSB0aGUgQ1NOIGxvZyBtYWNo aW5lcnkuCiAJCSAqLwogCQlpZiAocHJvYy0+ZGF0YWJhc2VJZCA9PSBNeURhdGFiYXNlSWQg fHwKIAkJCU15RGF0YWJhc2VJZCA9PSBJbnZhbGlkT2lkIHx8CkBAIC0xODUzLDExICsxNDQ2 LDE0IEBAIENvbXB1dGVYaWRIb3Jpem9ucyhDb21wdXRlWGlkSG9yaXpvbnNSZXN1bHQgKmgp CiAJfQogCiAJLyoKLQkgKiBJZiBpbiByZWNvdmVyeSBmZXRjaCBvbGRlc3QgeGlkIGluIEtu b3duQXNzaWduZWRYaWRzLCB3aWxsIGJlIGFwcGxpZWQKLQkgKiBhZnRlciBsb2NrIGlzIHJl bGVhc2VkLgorCSAqIElmIGluIHJlY292ZXJ5IGZldGNoIG9sZGVzdCB4aWQgZnJvbSBsYXN0 IGNoZWNrcG9pbnQuCisJICoKKwkgKiBYWFg6IHRoYXQgY2FuIGJlIG11Y2ggb2xkZXIgdGhh biB3aGF0IHdlIGhhZCBwcmV2aW91c2x5IHdpdGggdGhlCisJICoga25vd24tYXNzaWduZWQt eGlkcyBtYWNoaW5lcnkuIEkgdGhpbmsgdGhhdCdzIE9LLCBnaXZlbiB3aGF0IHRoaXMKKwkg KiBmdW5jdGlvbiBpcyB1c2VkIGZvciBkdXJpbmcgcmVjb3Zlcnk/CiAJICovCiAJaWYgKGlu X3JlY292ZXJ5KQotCQlrYXhtaW4gPSBLbm93bkFzc2lnbmVkWGlkc0dldE9sZGVzdFhtaW4o KTsKKwkJa2F4bWluID0gcHJvY0FycmF5LT5vbGRlc3RfcnVubmluZ19wcmltYXJ5X3hpZDsK IAogCS8qCiAJICogTm8gb3RoZXIgaW5mb3JtYXRpb24gZnJvbSBzaGFyZWQgc3RhdGUgaXMg bmVlZGVkLCByZWxlYXNlIHRoZSBsb2NrCkBAIC0yMTc2LDcgKzE3NzIsNyBAQCBHZXRTbmFw c2hvdERhdGEoU25hcHNob3Qgc25hcHNob3QpCiAJaW50CQkJbXlwZ3hhY3RvZmY7CiAJVHJh bnNhY3Rpb25JZCBteXhpZDsKIAl1aW50NjQJCWN1clhhY3RDb21wbGV0aW9uQ291bnQ7Ci0K KwlYTG9nUmVjUHRyCWNzbiA9IEludmFsaWRYTG9nUmVjUHRyOwogCVRyYW5zYWN0aW9uSWQg cmVwbGljYXRpb25fc2xvdF94bWluID0gSW52YWxpZFRyYW5zYWN0aW9uSWQ7CiAJVHJhbnNh Y3Rpb25JZCByZXBsaWNhdGlvbl9zbG90X2NhdGFsb2dfeG1pbiA9IEludmFsaWRUcmFuc2Fj dGlvbklkOwogCkBAIC0yMzU2LDI3ICsxOTUyLDggQEAgR2V0U25hcHNob3REYXRhKFNuYXBz aG90IHNuYXBzaG90KQogCWVsc2UKIAl7CiAJCS8qCi0JCSAqIFdlJ3JlIGluIGhvdCBzdGFu ZGJ5LCBzbyBnZXQgWElEcyBmcm9tIEtub3duQXNzaWduZWRYaWRzLgotCQkgKgotCQkgKiBX ZSBzdG9yZSBhbGwgeGlkcyBkaXJlY3RseSBpbnRvIHN1YnhpcFtdLiBIZXJlJ3Mgd2h5Ogot CQkgKgotCQkgKiBJbiByZWNvdmVyeSB3ZSBkb24ndCBrbm93IHdoaWNoIHhpZHMgYXJlIHRv cC1sZXZlbCBhbmQgd2hpY2ggYXJlCi0JCSAqIHN1YnhhY3RzLCBhIGRlc2lnbiBjaG9pY2Ug dGhhdCBncmVhdGx5IHNpbXBsaWZpZXMgeGlkIHByb2Nlc3NpbmcuCi0JCSAqCi0JCSAqIEl0 IHNlZW1zIGxpa2Ugd2Ugd291bGQgd2FudCB0byB0cnkgdG8gcHV0IHhpZHMgaW50byB4aXBb XSBvbmx5LCBidXQKLQkJICogdGhhdCBpcyBmYWlybHkgc21hbGwuIFdlIHdvdWxkIGVpdGhl ciBuZWVkIHRvIG1ha2UgdGhhdCBiaWdnZXIgb3IKLQkJICogdG8gaW5jcmVhc2UgdGhlIHJh dGUgYXQgd2hpY2ggd2UgV0FMLWxvZyB4aWQgYXNzaWdubWVudDsgbmVpdGhlciBpcwotCQkg KiBhbiBhcHBlYWxpbmcgY2hvaWNlLgotCQkgKgotCQkgKiBXZSBjb3VsZCB0cnkgdG8gc3Rv cmUgeGlkcyBpbnRvIHhpcFtdIGZpcnN0IGFuZCB0aGVuIGludG8gc3VieGlwW10KLQkJICog aWYgdGhlcmUgYXJlIHRvbyBtYW55IHhpZHMuIFRoYXQgb25seSB3b3JrcyBpZiB0aGUgc25h cHNob3QgZG9lc24ndAotCQkgKiBvdmVyZmxvdyBiZWNhdXNlIHdlIGRvIG5vdCBzZWFyY2gg c3VieGlwW10gaW4gdGhhdCBjYXNlLiBBIHNpbXBsZXIKLQkJICogd2F5IGlzIHRvIGp1c3Qg c3RvcmUgYWxsIHhpZHMgaW4gdGhlIHN1YnhpcCBhcnJheSBiZWNhdXNlIHRoaXMgaXMKLQkJ ICogYnkgZmFyIHRoZSBiaWdnZXIgYXJyYXkuIFdlIGp1c3QgbGVhdmUgdGhlIHhpcCBhcnJh eSBlbXB0eS4KLQkJICoKLQkJICogRWl0aGVyIHdheSB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUg d2F5IFhpZEluTVZDQ1NuYXBzaG90KCkgd29ya3MKLQkJICogZGVwZW5kaW5nIHVwb24gd2hl biB0aGUgc25hcHNob3Qgd2FzIHRha2VuLCBvciBjaGFuZ2Ugbm9ybWFsCi0JCSAqIHNuYXBz aG90IHByb2Nlc3Npbmcgc28gaXQgbWF0Y2hlcy4KKwkJICogV2UncmUgaW4gaG90IHN0YW5k YnksIHNvIGdldCB0aGUgY3VycmVudCBDU04uIFRoYXQncyB1c2VkIHRvCisJCSAqIGRldGVy bWluZSB3aGljaCB0cmFuc2FjdGlvbnMgY29tbWl0dGVkIGJlZm9yZSB0aGlzIHNuYXBzaG90 LgogCQkgKgogCQkgKiBOb3RlOiBJdCBpcyBwb3NzaWJsZSBmb3IgcmVjb3ZlcnkgdG8gZW5k IGJlZm9yZSB3ZSBmaW5pc2ggdGFraW5nCiAJCSAqIHRoZSBzbmFwc2hvdCwgYW5kIGZvciBu ZXdseSBhc3NpZ25lZCB0cmFuc2FjdGlvbiBpZHMgdG8gYmUgYWRkZWQgdG8KQEAgLTIzODQs MTQgKzE5NjEsMTUgQEAgR2V0U25hcHNob3REYXRhKFNuYXBzaG90IHNuYXBzaG90KQogCQkg KiB0aG9zZSBuZXdseSBhZGRlZCB0cmFuc2FjdGlvbiBpZHMgd291bGQgYmUgZmlsdGVyZWQg YXdheSwgc28gd2UKIAkJICogbmVlZCBub3QgYmUgY29uY2VybmVkIGFib3V0IHRoZW0uCiAJ CSAqLwotCQlzdWJjb3VudCA9IEtub3duQXNzaWduZWRYaWRzR2V0QW5kU2V0WG1pbihzbmFw c2hvdC0+c3VieGlwLCAmeG1pbiwKLQkJCQkJCQkJCQkJCSAgeG1heCk7CisJCXhtaW4gPSBw cm9jQXJyYXktPm9sZGVzdF9ydW5uaW5nX3ByaW1hcnlfeGlkOwogCi0JCWlmIChUcmFuc2Fj dGlvbklkUHJlY2VkZXNPckVxdWFscyh4bWluLCBwcm9jQXJyYXktPmxhc3RPdmVyZmxvd2Vk WGlkKSkKLQkJCXN1Ym92ZXJmbG93ZWQgPSB0cnVlOworCQkvKgorCQkgKiBUYWtlIENTTiB1 bmRlciBQcm9jQXJyYXlMb2NrIHNvIHRoZSBzbmFwc2hvdCBzdGF5cyBzeW5jaHJvbml6ZWQu CisJCSAqIFhYWDogbm90IHN1cmUgdGhhdCdzIHN0cmljdGx5IHJlcXVpcmVkLgorCQkgKi8K KwkJY3NuID0gVHJhbnNhbVZhcmlhYmxlcy0+bGF0ZXN0Q29tbWl0TFNOOwogCX0KIAotCiAJ LyoKIAkgKiBGZXRjaCBpbnRvIGxvY2FsIHZhcmlhYmxlIHdoaWxlIFByb2NBcnJheUxvY2sg aXMgaGVsZCAtIHRoZQogCSAqIExXTG9ja1JlbGVhc2UgYmVsb3cgaXMgYSBiYXJyaWVyLCBl bnN1cmluZyB0aGlzIGhhcHBlbnMgaW5zaWRlIHRoZQpAQCAtMjUwNyw2ICsyMDg1LDggQEAg R2V0U25hcHNob3REYXRhKFNuYXBzaG90IHNuYXBzaG90KQogCXNuYXBzaG90LT5sc24gPSBJ bnZhbGlkWExvZ1JlY1B0cjsKIAlzbmFwc2hvdC0+d2hlblRha2VuID0gMDsKIAorCXNuYXBz aG90LT5zbmFwc2hvdENzbiA9IGNzbjsKKwogCXJldHVybiBzbmFwc2hvdDsKIH0KIApAQCAt Mjg1NiwxNSArMjQzNiwxNiBAQCBHZXRSdW5uaW5nVHJhbnNhY3Rpb25EYXRhKHZvaWQpCiAg KiBXZSBsb29rIGF0IGFsbCBkYXRhYmFzZXMsIHRob3VnaCB0aGVyZSBpcyBubyBuZWVkIHRv IGluY2x1ZGUgV0FMU2VuZGVyCiAgKiBzaW5jZSB0aGlzIGhhcyBubyBlZmZlY3Qgb24gaG90 IHN0YW5kYnkgY29uZmxpY3RzLgogICoKLSAqIFRoaXMgaXMgbmV2ZXIgZXhlY3V0ZWQgZHVy aW5nIHJlY292ZXJ5IHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gbG9vayBhdAotICogS25vd25B c3NpZ25lZFhpZHMuCisgKiBJZiBhbGxEYnMgaXMgZmFsc2UsIHNraXAgcHJvY2Vzc2VzIGF0 dGFjaGVkIHRvIG90aGVyIGRhdGFiYXNlcy4KKyAqCisgKiBUaGlzIGlzIG5ldmVyIGV4ZWN1 dGVkIGR1cmluZyByZWNvdmVyeS4KICAqCiAgKiBXZSBkb24ndCB3b3JyeSBhYm91dCB1cGRh dGluZyBvdGhlciBjb3VudGVycywgd2Ugd2FudCB0byBrZWVwIHRoaXMgYXMKICAqIHNpbXBs ZSBhcyBwb3NzaWJsZSBhbmQgbGVhdmUgR2V0U25hcHNob3REYXRhKCkgYXMgdGhlIHByaW1h cnkgY29kZSBmb3IKICAqIHRoYXQgYm9va2tlZXBpbmcuCiAgKi8KIFRyYW5zYWN0aW9uSWQK LUdldE9sZGVzdEFjdGl2ZVRyYW5zYWN0aW9uSWQodm9pZCkKK0dldE9sZGVzdEFjdGl2ZVRy YW5zYWN0aW9uSWQoYm9vbCBhbGxEYnMpCiB7CiAJUHJvY0FycmF5U3RydWN0ICphcnJheVAg PSBwcm9jQXJyYXk7CiAJVHJhbnNhY3Rpb25JZCAqb3RoZXJfeGlkcyA9IFByb2NHbG9iYWwt PnhpZHM7CkBAIC0yODg1LDExICsyNDY2LDEzIEBAIEdldE9sZGVzdEFjdGl2ZVRyYW5zYWN0 aW9uSWQodm9pZCkKIAlMV0xvY2tSZWxlYXNlKFhpZEdlbkxvY2spOwogCiAJLyoKLQkgKiBT cGluIG92ZXIgcHJvY0FycmF5IGNvbGxlY3RpbmcgYWxsIHhpZHMgYW5kIHN1YnhpZHMuCisJ ICogU3BpbiBvdmVyIHByb2NBcnJheSBjaGVja2luZyBlYWNoIHhpZC4KIAkgKi8KIAlMV0xv Y2tBY3F1aXJlKFByb2NBcnJheUxvY2ssIExXX1NIQVJFRCk7CiAJZm9yIChpbmRleCA9IDA7 IGluZGV4IDwgYXJyYXlQLT5udW1Qcm9jczsgaW5kZXgrKykKIAl7CisJCWludAkJCXBncHJv Y25vID0gYXJyYXlQLT5wZ3Byb2Nub3NbaW5kZXhdOworCQlQR1BST0MJICAgKnByb2MgPSAm YWxsUHJvY3NbcGdwcm9jbm9dOwogCQlUcmFuc2FjdGlvbklkIHhpZDsKIAogCQkvKiBGZXRj aCB4aWQganVzdCBvbmNlIC0gc2VlIEdldE5ld1RyYW5zYWN0aW9uSWQgKi8KQEAgLTI4OTgs NiArMjQ4MSw5IEBAIEdldE9sZGVzdEFjdGl2ZVRyYW5zYWN0aW9uSWQodm9pZCkKIAkJaWYg KCFUcmFuc2FjdGlvbklkSXNOb3JtYWwoeGlkKSkKIAkJCWNvbnRpbnVlOwogCisJCWlmICgh YWxsRGJzICYmIHByb2MtPmRhdGFiYXNlSWQgIT0gTXlEYXRhYmFzZUlkKQorCQkJY29udGlu dWU7CisKIAkJaWYgKFRyYW5zYWN0aW9uSWRQcmVjZWRlcyh4aWQsIG9sZGVzdFJ1bm5pbmdY aWQpKQogCQkJb2xkZXN0UnVubmluZ1hpZCA9IHhpZDsKIApAQCAtMjk3OCw2ICsyNTY0LDgg QEAgR2V0T2xkZXN0U2FmZURlY29kaW5nVHJhbnNhY3Rpb25JZChib29sIGNhdGFsb2dPbmx5 KQogCSAqIGFib3ZlLCBzbyB3ZSdsbCBoYXZlIHRvIHdhaXQgYSBiaXQgbG9uZ2VyIHRoZXJl LiBXZSB1bmZvcnR1bmF0ZWx5IGNhbgogCSAqICpub3QqIHVzZSBLbm93bkFzc2lnbmVkWGlk c0dldE9sZGVzdFhtaW4oKSBzaW5jZSB0aGUgS25vd25Bc3NpZ25lZFhpZHMKIAkgKiBtYWNo aW5lcnkgY2FuIG1pc3MgdmFsdWVzIGFuZCByZXR1cm4gYW4gb2xkZXIgdmFsdWUgdGhhbiBp cyBzYWZlLgorCSAqIFhYWDogb2Jzb2xldGUgY29tbWVudCBhcyBLbm93bkFzc2lnbmVkWGlk cyBpcyBnb25lLiBJIGJlbGlldmUgbm8gY29kZQorCSAqIGNoYW5nZXMgYXJlIHJlcXVpcmVk IGhlcmUsIGJ1dCBUQkggSSBkb24ndCB1bmRlcnN0YW5kIHRoaXMgZnVuY3Rpb24uCiAJICov CiAJaWYgKCFyZWNvdmVyeV9pbl9wcm9ncmVzcykKIAl7CkBAIC0zMzk1LDYgKzI5ODMsOSBA QCBHZXRDdXJyZW50VmlydHVhbFhJRHMoVHJhbnNhY3Rpb25JZCBsaW1pdFhtaW4sIGJvb2wg ZXhjbHVkZVhtaW4wLAogICogYnV0IHRoYXQgd291bGQgbm90IGJlIHRydWUgaW4gdGhlIGNh c2Ugb2YgRkFUQUwgZXJyb3JzIGxhZ2dpbmcgaW4gYXJyYXksCiAgKiBidXQgd2UgYWxyZWFk eSBrbm93IHRob3NlIGFyZSBib2d1cyBhbnl3YXksIHNvIHdlIHNraXAgdGhhdCB0ZXN0Lgog ICoKKyAqIFhYWDogS25vd25Bc3NpZ25lZFhpZHMgaXMgZ29uZSBzbyB0aGUgYWJvdmUgY29t bWVudCBuZWVkcyB1cGRhdGluZy4gSXMKKyAqIHRoZSBjb2RlIHN0aWxsIGNvcnJlY3Q/IEkg dGhpbmsgc28gYnV0IG5lZWQgdG8gZG91YmxlLWNoZWNrLgorICoKICAqIElmIGRiT2lkIGlz IHZhbGlkIHdlIHNraXAgYmFja2VuZHMgYXR0YWNoZWQgdG8gb3RoZXIgZGF0YWJhc2VzLgog ICoKICAqIEJlIGNhcmVmdWwgdG8gKm5vdCogcGZyZWUgdGhlIHJlc3VsdCBmcm9tIHRoaXMg ZnVuY3Rpb24uIFdlIHJldXNlCkBAIC00MDYzLDE0ICszNjU0LDE0IEBAIHN0YXRpYyB2b2lk CiBEaXNwbGF5WGlkQ2FjaGUodm9pZCkKIHsKIAlmcHJpbnRmKHN0ZGVyciwKLQkJCSJYaWRD YWNoZTogeG1pbjogJWxkLCBrbm93bjogJWxkLCBteXhhY3Q6ICVsZCwgbGF0ZXN0OiAlbGQs IG1haW54aWQ6ICVsZCwgY2hpbGR4aWQ6ICVsZCwga25vd25hc3NpZ25lZDogJWxkLCBub29m bG86ICVsZCwgc2xvdzogJWxkXG4iLAorCQkJIlhpZENhY2hlOiB4bWluOiAlbGQsIGtub3du OiAlbGQsIG15eGFjdDogJWxkLCBsYXRlc3Q6ICVsZCwgbWFpbnhpZDogJWxkLCBjaGlsZHhp ZDogJWxkLCBkdXJpbmdfcmVjb3Zlcnk6ICVsZCwgbm9vZmxvOiAlbGQsIHNsb3c6ICVsZFxu IiwKIAkJCXhjX2J5X3JlY2VudF94bWluLAogCQkJeGNfYnlfa25vd25feGFjdCwKIAkJCXhj X2J5X215X3hhY3QsCiAJCQl4Y19ieV9sYXRlc3RfeGlkLAogCQkJeGNfYnlfbWFpbl94aWQs CiAJCQl4Y19ieV9jaGlsZF94aWQsCi0JCQl4Y19ieV9rbm93bl9hc3NpZ25lZCwKKwkJCXhj X2R1cmluZ19yZWNvdmVyeSwKIAkJCXhjX25vX292ZXJmbG93LAogCQkJeGNfc2xvd19hbnN3 ZXIpOwogfQpAQCAtNDM0Nyw2MSArMzkzOCw2IEBAIEZ1bGxYaWRSZWxhdGl2ZVRvKEZ1bGxU cmFuc2FjdGlvbklkIHJlbCwgVHJhbnNhY3Rpb25JZCB4aWQpCiB9CiAKIAotLyogLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoJCUtub3duQXNz aWduZWRUcmFuc2FjdGlvbklkcyBzdWItbW9kdWxlCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLQotLyoKLSAqIEluIEhvdCBTdGFu ZGJ5IG1vZGUsIHdlIG1haW50YWluIGEgbGlzdCBvZiB0cmFuc2FjdGlvbnMgdGhhdCBhcmUg KG9yIHdlcmUpCi0gKiBydW5uaW5nIG9uIHRoZSBwcmltYXJ5IGF0IHRoZSBjdXJyZW50IHBv aW50IGluIFdBTC4gIFRoZXNlIFhJRHMgbXVzdCBiZQotICogdHJlYXRlZCBhcyBydW5uaW5n IGJ5IHN0YW5kYnkgdHJhbnNhY3Rpb25zLCBldmVuIHRob3VnaCB0aGV5IGFyZSBub3QgaW4K LSAqIHRoZSBzdGFuZGJ5IHNlcnZlcidzIFBHUFJPQyBhcnJheS4KLSAqCi0gKiBXZSByZWNv cmQgYWxsIFhJRHMgdGhhdCB3ZSBrbm93IGhhdmUgYmVlbiBhc3NpZ25lZC4gIFRoYXQgaW5j bHVkZXMgYWxsIHRoZQotICogWElEcyBzZWVuIGluIFdBTCByZWNvcmRzLCBwbHVzIGFsbCB1 bm9ic2VydmVkIFhJRHMgdGhhdCB3ZSBjYW4gZGVkdWNlIGhhdmUKLSAqIGJlZW4gYXNzaWdu ZWQuICBXZSBjYW4gZGVkdWNlIHRoZSBleGlzdGVuY2Ugb2YgdW5vYnNlcnZlZCBYSURzIGJl Y2F1c2Ugd2UKLSAqIGtub3cgWElEcyBhcmUgYXNzaWduZWQgaW4gc2VxdWVuY2UsIHdpdGgg bm8gZ2Fwcy4gIFRoZSBLbm93bkFzc2lnbmVkWGlkcwotICogbGlzdCBleHBhbmRzIGFzIG5l dyBYSURzIGFyZSBvYnNlcnZlZCBvciBpbmZlcnJlZCwgYW5kIGNvbnRyYWN0cyB3aGVuCi0g KiB0cmFuc2FjdGlvbiBjb21wbGV0aW9uIHJlY29yZHMgYXJyaXZlLgotICoKLSAqIER1cmlu ZyBob3Qgc3RhbmRieSB3ZSBkbyBub3QgZnJldCB0b28gbXVjaCBhYm91dCB0aGUgZGlzdGlu Y3Rpb24gYmV0d2VlbgotICogdG9wLWxldmVsIFhJRHMgYW5kIHN1YnRyYW5zYWN0aW9uIFhJ RHMuIFdlIHN0b3JlIGJvdGggdG9nZXRoZXIgaW4gdGhlCi0gKiBLbm93bkFzc2lnbmVkWGlk cyBsaXN0LiAgSW4gYmFja2VuZHMsIHRoaXMgaXMgY29waWVkIGludG8gc25hcHNob3RzIGlu Ci0gKiBHZXRTbmFwc2hvdERhdGEoKSwgdGFraW5nIGFkdmFudGFnZSBvZiB0aGUgZmFjdCB0 aGF0IFhpZEluTVZDQ1NuYXBzaG90KCkKLSAqIGRvZXNuJ3QgY2FyZSBhYm91dCB0aGUgZGlz dGluY3Rpb24gZWl0aGVyLiAgU3VidHJhbnNhY3Rpb24gWElEcyBhcmUKLSAqIGVmZmVjdGl2 ZWx5IHRyZWF0ZWQgYXMgdG9wLWxldmVsIFhJRHMgYW5kIGluIHRoZSB0eXBpY2FsIGNhc2Ug cGdfc3VidHJhbnMKLSAqIGxpbmtzIGFyZSAqbm90KiBtYWludGFpbmVkICh3aGljaCBkb2Vz IG5vdCBhZmZlY3QgdmlzaWJpbGl0eSkuCi0gKgotICogV2UgaGF2ZSByb29tIGluIEtub3du QXNzaWduZWRYaWRzIGFuZCBpbiBzbmFwc2hvdHMgdG8gaG9sZCBtYXhQcm9jcyAqCi0gKiAo MSArIFBHUFJPQ19NQVhfQ0FDSEVEX1NVQlhJRFMpIFhJRHMsIHNvIGV2ZXJ5IHByaW1hcnkg dHJhbnNhY3Rpb24gbXVzdAotICogcmVwb3J0IGl0cyBzdWJ0cmFuc2FjdGlvbiBYSURzIGlu IGEgV0FMIFhMT0dfWEFDVF9BU1NJR05NRU5UIHJlY29yZCBhdAotICogbGVhc3QgZXZlcnkg UEdQUk9DX01BWF9DQUNIRURfU1VCWElEUy4gIFdoZW4gd2UgcmVjZWl2ZSBvbmUgb2YgdGhl c2UKLSAqIHJlY29yZHMsIHdlIG1hcmsgdGhlIHN1YlhJRHMgYXMgY2hpbGRyZW4gb2YgdGhl IHRvcCBYSUQgaW4gcGdfc3VidHJhbnMsCi0gKiBhbmQgdGhlbiByZW1vdmUgdGhlbSBmcm9t IEtub3duQXNzaWduZWRYaWRzLiAgVGhpcyBwcmV2ZW50cyBvdmVyZmxvdyBvZgotICogS25v d25Bc3NpZ25lZFhpZHMgYW5kIHNuYXBzaG90cywgYXQgdGhlIGNvc3QgdGhhdCBzdGF0dXMg Y2hlY2tzIGZvciB0aGVzZQotICogc3ViWElEcyB3aWxsIHRha2UgYSBzbG93ZXIgcGF0aCB0 aHJvdWdoIFRyYW5zYWN0aW9uSWRJc0luUHJvZ3Jlc3MoKS4KLSAqIFRoaXMgbWVhbnMgdGhh dCBLbm93bkFzc2lnbmVkWGlkcyBpcyBub3QgbmVjZXNzYXJpbHkgY29tcGxldGUgZm9yIHN1 YlhJRHMsCi0gKiB0aG91Z2ggaXQgc2hvdWxkIGJlIGNvbXBsZXRlIGZvciB0b3AtbGV2ZWwg WElEczsgdGhpcyBpcyB0aGUgc2FtZSBzaXR1YXRpb24KLSAqIHRoYXQgaG9sZHMgd2l0aCBy ZXNwZWN0IHRvIHRoZSBQR1BST0MgZW50cmllcyBpbiBub3JtYWwgcnVubmluZy4KLSAqCi0g KiBXaGVuIHdlIHRocm93IGF3YXkgc3ViWElEcyBmcm9tIEtub3duQXNzaWduZWRYaWRzLCB3 ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YKLSAqIHRoYXQsIHNpbWlsYXJseSB0byB0cmFja2lu ZyBvdmVyZmxvdyBvZiBhIFBHUFJPQydzIHN1YnhpZHMgYXJyYXkuICBXZSBkbwotICogdGhh dCBieSByZW1lbWJlcmluZyB0aGUgbGFzdE92ZXJmbG93ZWRYaWQsIGllIHRoZSBsYXN0IHRo cm93bi1hd2F5IHN1YlhJRC4KLSAqIEFzIGxvbmcgYXMgdGhhdCBpcyB3aXRoaW4gdGhlIHJh bmdlIG9mIGludGVyZXN0aW5nIFhJRHMsIHdlIGhhdmUgdG8gYXNzdW1lCi0gKiB0aGF0IHN1 YlhJRHMgYXJlIG1pc3NpbmcgZnJvbSBzbmFwc2hvdHMuICAoTm90ZSB0aGF0IHN1YlhJRCBv dmVyZmxvdyBvY2N1cnMKLSAqIG9uIHByaW1hcnkgd2hlbiA2NXRoIHN1YlhJRCBhcnJpdmVz LCB3aGVyZWFzIG9uIHN0YW5kYnkgaXQgb2NjdXJzIHdoZW4gNjR0aAotICogc3ViWElEIGFy cml2ZXMgLSB0aGF0IGlzIG5vdCBhbiBlcnJvci4pCi0gKgotICogU2hvdWxkIGEgYmFja2Vu ZCBvbiBwcmltYXJ5IHNvbWVob3cgZGlzYXBwZWFyIGJlZm9yZSBpdCBjYW4gd3JpdGUgYW4g YWJvcnQKLSAqIHJlY29yZCwgdGhlbiB3ZSBqdXN0IGxlYXZlIHRob3NlIFhJRHMgaW4gS25v d25Bc3NpZ25lZFhpZHMuIFRoZXkgYWN0dWFsbHkKLSAqIGFib3J0ZWQgYnV0IHdlIHRoaW5r IHRoZXkgd2VyZSBydW5uaW5nOyB0aGUgZGlzdGluY3Rpb24gaXMgaXJyZWxldmFudAotICog YmVjYXVzZSBlaXRoZXIgd2F5IGFueSBjaGFuZ2VzIGRvbmUgYnkgdGhlIHRyYW5zYWN0aW9u IGFyZSBub3QgdmlzaWJsZSB0bwotICogYmFja2VuZHMgaW4gdGhlIHN0YW5kYnkuICBXZSBw cnVuZSBLbm93bkFzc2lnbmVkWGlkcyB3aGVuCi0gKiBYTE9HX1JVTk5JTkdfWEFDVFMgYXJy aXZlcywgdG8gZm9yZXN0YWxsIHBvc3NpYmxlIG92ZXJmbG93IG9mIHRoZQotICogYXJyYXkg ZHVlIHRvIHN1Y2ggZGVhZCBYSURzLgotICovCi0KIC8qCiAgKiBSZWNvcmRLbm93bkFzc2ln bmVkVHJhbnNhY3Rpb25JZHMKICAqCQlSZWNvcmQgdGhlIGdpdmVuIFhJRCBpbiBLbm93bkFz c2lnbmVkWGlkcywgYXMgd2VsbCBhcyBhbnkgcHJlY2VkaW5nCkBAIC00NDE2LDcgKzM5NTIs NyBAQCBGdWxsWGlkUmVsYXRpdmVUbyhGdWxsVHJhbnNhY3Rpb25JZCByZWwsIFRyYW5zYWN0 aW9uSWQgeGlkKQogdm9pZAogUmVjb3JkS25vd25Bc3NpZ25lZFRyYW5zYWN0aW9uSWRzKFRy YW5zYWN0aW9uSWQgeGlkKQogewotCUFzc2VydChzdGFuZGJ5U3RhdGUgPj0gU1RBTkRCWV9J TklUSUFMSVpFRCk7CisJQXNzZXJ0KEluSG90U3RhbmRieSk7CiAJQXNzZXJ0KFRyYW5zYWN0 aW9uSWRJc1ZhbGlkKHhpZCkpOwogCUFzc2VydChUcmFuc2FjdGlvbklkSXNWYWxpZChsYXRl c3RPYnNlcnZlZFhpZCkpOwogCkBAIC00NDM0LDM4ICszOTcwLDE5IEBAIFJlY29yZEtub3du QXNzaWduZWRUcmFuc2FjdGlvbklkcyhUcmFuc2FjdGlvbklkIHhpZCkKIAogCQkvKgogCQkg KiBFeHRlbmQgc3VidHJhbnMgbGlrZSB3ZSBkbyBpbiBHZXROZXdUcmFuc2FjdGlvbklkKCkg ZHVyaW5nIG5vcm1hbAotCQkgKiBvcGVyYXRpb24gdXNpbmcgaW5kaXZpZHVhbCBleHRlbmQg c3RlcHMuIE5vdGUgdGhhdCB3ZSBkbyBub3QgbmVlZAotCQkgKiB0byBleHRlbmQgY2xvZyBz aW5jZSBpdHMgZXh0ZW5zaW9ucyBhcmUgV0FMIGxvZ2dlZC4KLQkJICoKLQkJICogVGhpcyBw YXJ0IGhhcyB0byBiZSBkb25lIHJlZ2FyZGxlc3Mgb2Ygc3RhbmRieVN0YXRlIHNpbmNlIHdl Ci0JCSAqIGltbWVkaWF0ZWx5IHN0YXJ0IGFzc2lnbmluZyBzdWJ0cmFuc2FjdGlvbnMgdG8g dGhlaXIgdG9wbGV2ZWwKLQkJICogdHJhbnNhY3Rpb25zLgorCQkgKiBvcGVyYXRpb24gdXNp bmcgaW5kaXZpZHVhbCBleHRlbmQgc3RlcHMuIEFuZCBDU04gbG9nLCB0b28uIE5vdGUKKwkJ ICogdGhhdCB3ZSBkbyBub3QgbmVlZCB0byBleHRlbmQgY2xvZyBzaW5jZSBpdHMgZXh0ZW5z aW9ucyBhcmUgV0FMCisJCSAqIGxvZ2dlZC4KIAkJICovCiAJCW5leHRfZXhwZWN0ZWRfeGlk ID0gbGF0ZXN0T2JzZXJ2ZWRYaWQ7CiAJCXdoaWxlIChUcmFuc2FjdGlvbklkUHJlY2VkZXMo bmV4dF9leHBlY3RlZF94aWQsIHhpZCkpCiAJCXsKIAkJCVRyYW5zYWN0aW9uSWRBZHZhbmNl KG5leHRfZXhwZWN0ZWRfeGlkKTsKIAkJCUV4dGVuZFNVQlRSQU5TKG5leHRfZXhwZWN0ZWRf eGlkKTsKKwkJCUV4dGVuZENTTkxvZyhuZXh0X2V4cGVjdGVkX3hpZCk7CiAJCX0KIAkJQXNz ZXJ0KG5leHRfZXhwZWN0ZWRfeGlkID09IHhpZCk7CiAKLQkJLyoKLQkJICogSWYgdGhlIEtu b3duQXNzaWduZWRYaWRzIG1hY2hpbmVyeSBpc24ndCB1cCB5ZXQsIHRoZXJlJ3Mgbm90aGlu ZwotCQkgKiBtb3JlIHRvIGRvIHNpbmNlIHdlIGRvbid0IHRyYWNrIGFzc2lnbmVkIHhpZHMg eWV0LgotCQkgKi8KLQkJaWYgKHN0YW5kYnlTdGF0ZSA8PSBTVEFOREJZX0lOSVRJQUxJWkVE KQotCQl7Ci0JCQlsYXRlc3RPYnNlcnZlZFhpZCA9IHhpZDsKLQkJCXJldHVybjsKLQkJfQot Ci0JCS8qCi0JCSAqIEFkZCAobGF0ZXN0T2JzZXJ2ZWRYaWQsIHhpZF0gb250byB0aGUgS25v d25Bc3NpZ25lZFhpZHMgYXJyYXkuCi0JCSAqLwotCQluZXh0X2V4cGVjdGVkX3hpZCA9IGxh dGVzdE9ic2VydmVkWGlkOwotCQlUcmFuc2FjdGlvbklkQWR2YW5jZShuZXh0X2V4cGVjdGVk X3hpZCk7Ci0JCUtub3duQXNzaWduZWRYaWRzQWRkKG5leHRfZXhwZWN0ZWRfeGlkLCB4aWQs IGZhbHNlKTsKLQogCQkvKgogCQkgKiBOb3cgd2UgY2FuIGFkdmFuY2UgbGF0ZXN0T2JzZXJ2 ZWRYaWQKIAkJICovCkBAIC00NDc4LDc4MCArMzk5NSw1NCBAQCBSZWNvcmRLbm93bkFzc2ln bmVkVHJhbnNhY3Rpb25JZHMoVHJhbnNhY3Rpb25JZCB4aWQpCiAKIC8qCiAgKiBFeHBpcmVU cmVlS25vd25Bc3NpZ25lZFRyYW5zYWN0aW9uSWRzCi0gKgkJUmVtb3ZlIHRoZSBnaXZlbiBY SURzIGZyb20gS25vd25Bc3NpZ25lZFhpZHMuCiAgKgotICogQ2FsbGVkIGR1cmluZyByZWNv dmVyeSBpbiBhbmFsb2d5IHdpdGggYW5kIGluIHBsYWNlIG9mIFByb2NBcnJheUVuZFRyYW5z YWN0aW9uKCkKKyAqIENhbGxlZCBkdXJpbmcgcmVjb3ZlcnkgaW4gYW5hbG9neSB3aXRoIGFu ZCBpbiBwbGFjZSBvZgorICogUHJvY0FycmF5RW5kVHJhbnNhY3Rpb24oKQogICovCiB2b2lk Ci1FeHBpcmVUcmVlS25vd25Bc3NpZ25lZFRyYW5zYWN0aW9uSWRzKFRyYW5zYWN0aW9uSWQg eGlkLCBpbnQgbnN1YnhpZHMsCi0JCQkJCQkJCQkgIFRyYW5zYWN0aW9uSWQgKnN1YnhpZHMs IFRyYW5zYWN0aW9uSWQgbWF4X3hpZCkKK0V4cGlyZVRyZWVLbm93bkFzc2lnbmVkVHJhbnNh Y3Rpb25JZHMoVHJhbnNhY3Rpb25JZCBtYXhfeGlkLCBYTG9nUmVjUHRyIGxzbikKIHsKLQlB c3NlcnQoc3RhbmRieVN0YXRlID49IFNUQU5EQllfSU5JVElBTElaRUQpOworCVRyYW5zYWN0 aW9uSWQgb2xkZXN0X3J1bm5pbmdfcHJpbWFyeV94aWQ7CisKKwlBc3NlcnQoSW5Ib3RTdGFu ZGJ5KTsKKworCS8qCisJICogWFhYOiB0aGlzIGlzIG5lY2Vzc2FyeSB0byBrZWVwIHhtaW4g bW9yZSByZWNlbnQuIFdoaWNoIGluIHR1cm4gaXMgbmVlZGVkCisJICogdG8gYXZvaWQgdW5u ZWNlc3NhcnkgcmVjb3ZlcnkgY29uZmxpY3RzCisJICoKKwkgKiBYWFg6IG5vIGxvY2tpbmcg bmVlZGVkIGJlY2F1c2UgdGhpcyBydW5zIGluIHRoZSBzdGFydHVwIHByb2Nlc3MKKwkgKgor CSAqIFhYWDogdGhlIGNhbGxlciBhY3R1YWxseSBoYXMgYSBsaXN0IG9mIFhJRHMuIFdlIGNv dWxkIHNhdmUgc29tZSBjbG9nCisJICogbG9va3VwcyBieSB0YWtpbmcgYWR2YW50YWdlIG9m IHRoYXQgbGlzdC4KKwkgKi8KKwlvbGRlc3RfcnVubmluZ19wcmltYXJ5X3hpZCA9IHByb2NB cnJheS0+b2xkZXN0X3J1bm5pbmdfcHJpbWFyeV94aWQ7CisJd2hpbGUgKG9sZGVzdF9ydW5u aW5nX3ByaW1hcnlfeGlkIDwgbWF4X3hpZCkKKwl7CisJCWlmICghVHJhbnNhY3Rpb25JZERp ZENvbW1pdChvbGRlc3RfcnVubmluZ19wcmltYXJ5X3hpZCkgJiYKKwkJCSFUcmFuc2FjdGlv bklkRGlkQWJvcnQob2xkZXN0X3J1bm5pbmdfcHJpbWFyeV94aWQpKQorCQl7CisJCQlicmVh azsKKwkJfQorCQlUcmFuc2FjdGlvbklkQWR2YW5jZShvbGRlc3RfcnVubmluZ19wcmltYXJ5 X3hpZCk7CisJfQorCWlmIChtYXhfeGlkID09IG9sZGVzdF9ydW5uaW5nX3ByaW1hcnlfeGlk KQorCQlUcmFuc2FjdGlvbklkQWR2YW5jZShvbGRlc3RfcnVubmluZ19wcmltYXJ5X3hpZCk7 CiAKIAkvKgogCSAqIFVzZXMgc2FtZSBsb2NraW5nIGFzIHRyYW5zYWN0aW9uIGNvbW1pdAog CSAqLwogCUxXTG9ja0FjcXVpcmUoUHJvY0FycmF5TG9jaywgTFdfRVhDTFVTSVZFKTsKIAot CUtub3duQXNzaWduZWRYaWRzUmVtb3ZlVHJlZSh4aWQsIG5zdWJ4aWRzLCBzdWJ4aWRzKTsK LQogCS8qIEFzIGluIFByb2NBcnJheUVuZFRyYW5zYWN0aW9uLCBhZHZhbmNlIGxhdGVzdENv bXBsZXRlZFhpZCAqLwogCU1haW50YWluTGF0ZXN0Q29tcGxldGVkWGlkUmVjb3ZlcnkobWF4 X3hpZCk7CiAKIAkvKiAuLi4gYW5kIHhhY3RDb21wbGV0aW9uQ291bnQgKi8KIAlUcmFuc2Ft VmFyaWFibGVzLT54YWN0Q29tcGxldGlvbkNvdW50Kys7CiAKLQlMV0xvY2tSZWxlYXNlKFBy b2NBcnJheUxvY2spOwotfQotCi0vKgotICogRXhwaXJlQWxsS25vd25Bc3NpZ25lZFRyYW5z YWN0aW9uSWRzCi0gKgkJUmVtb3ZlIGFsbCBlbnRyaWVzIGluIEtub3duQXNzaWduZWRYaWRz IGFuZCByZXNldCBsYXN0T3ZlcmZsb3dlZFhpZC4KLSAqLwotdm9pZAotRXhwaXJlQWxsS25v d25Bc3NpZ25lZFRyYW5zYWN0aW9uSWRzKHZvaWQpCi17Ci0JTFdMb2NrQWNxdWlyZShQcm9j QXJyYXlMb2NrLCBMV19FWENMVVNJVkUpOwotCUtub3duQXNzaWduZWRYaWRzUmVtb3ZlUHJl Y2VkaW5nKEludmFsaWRUcmFuc2FjdGlvbklkKTsKLQotCS8qCi0JICogUmVzZXQgbGFzdE92 ZXJmbG93ZWRYaWQuICBDdXJyZW50bHksIGxhc3RPdmVyZmxvd2VkWGlkIGhhcyBubyB1c2Ug YWZ0ZXIKLQkgKiB0aGUgY2FsbCBvZiB0aGlzIGZ1bmN0aW9uLiAgQnV0IGRvIHRoaXMgZm9y IHVuaWZpY2F0aW9uIHdpdGggd2hhdAotCSAqIEV4cGlyZU9sZEtub3duQXNzaWduZWRUcmFu c2FjdGlvbklkcygpIGRvLgotCSAqLwotCXByb2NBcnJheS0+bGFzdE92ZXJmbG93ZWRYaWQg PSBJbnZhbGlkVHJhbnNhY3Rpb25JZDsKLQlMV0xvY2tSZWxlYXNlKFByb2NBcnJheUxvY2sp OwotfQotCi0vKgotICogRXhwaXJlT2xkS25vd25Bc3NpZ25lZFRyYW5zYWN0aW9uSWRzCi0g KgkJUmVtb3ZlIEtub3duQXNzaWduZWRYaWRzIGVudHJpZXMgcHJlY2VkaW5nIHRoZSBnaXZl biBYSUQgYW5kCi0gKgkJcG90ZW50aWFsbHkgcmVzZXQgbGFzdE92ZXJmbG93ZWRYaWQuCi0g Ki8KLXZvaWQKLUV4cGlyZU9sZEtub3duQXNzaWduZWRUcmFuc2FjdGlvbklkcyhUcmFuc2Fj dGlvbklkIHhpZCkKLXsKLQlMV0xvY2tBY3F1aXJlKFByb2NBcnJheUxvY2ssIExXX0VYQ0xV U0lWRSk7Ci0KLQkvKgotCSAqIFJlc2V0IGxhc3RPdmVyZmxvd2VkWGlkIGlmIHdlIGtub3cg YWxsIHRyYW5zYWN0aW9ucyB0aGF0IGhhdmUgYmVlbgotCSAqIHBvc3NpYmx5IHJ1bm5pbmcg YXJlIGJlaW5nIGdvbmUuICBOb3QgZG9pbmcgc28gY291bGQgY2F1c2UgYW4gaW5jb3JyZWN0 Ci0JICogbGFzdE92ZXJmbG93ZWRYaWQgdmFsdWUsIHdoaWNoIG1ha2VzIGV4dHJhIHNuYXBz aG90cyBiZSBtYXJrZWQgYXMKLQkgKiBzdWJvdmVyZmxvd2VkLgotCSAqLwotCWlmIChUcmFu c2FjdGlvbklkUHJlY2VkZXMocHJvY0FycmF5LT5sYXN0T3ZlcmZsb3dlZFhpZCwgeGlkKSkK LQkJcHJvY0FycmF5LT5sYXN0T3ZlcmZsb3dlZFhpZCA9IEludmFsaWRUcmFuc2FjdGlvbklk OwotCUtub3duQXNzaWduZWRYaWRzUmVtb3ZlUHJlY2VkaW5nKHhpZCk7Ci0JTFdMb2NrUmVs ZWFzZShQcm9jQXJyYXlMb2NrKTsKLX0KLQotLyoKLSAqIEtub3duQXNzaWduZWRUcmFuc2Fj dGlvbklkc0lkbGVNYWludGVuYW5jZQotICoJCU9wcG9ydHVuaXN0aWNhbGx5IGRvIG1haW50 ZW5hbmNlIHdvcmsgd2hlbiB0aGUgc3RhcnR1cCBwcm9jZXNzCi0gKgkJaXMgYWJvdXQgdG8g Z28gaWRsZS4KLSAqLwotdm9pZAotS25vd25Bc3NpZ25lZFRyYW5zYWN0aW9uSWRzSWRsZU1h aW50ZW5hbmNlKHZvaWQpCi17Ci0JS25vd25Bc3NpZ25lZFhpZHNDb21wcmVzcyhLQVhfU1RB UlRVUF9QUk9DRVNTX0lETEUsIGZhbHNlKTsKLX0KLQotCi0vKgotICogUHJpdmF0ZSBtb2R1 bGUgZnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgS25vd25Bc3NpZ25lZFhpZHMKLSAqCi0gKiBU aGVyZSBhcmUgNSBtYWluIHVzZXMgb2YgdGhlIEtub3duQXNzaWduZWRYaWRzIGRhdGEgc3Ry dWN0dXJlOgotICoKLSAqCSogYmFja2VuZHMgdGFraW5nIHNuYXBzaG90cyAtIGFsbCB2YWxp ZCBYSURzIG5lZWQgdG8gYmUgY29waWVkIG91dAotICoJKiBiYWNrZW5kcyBzZWVraW5nIHRv IGRldGVybWluZSBwcmVzZW5jZSBvZiBhIHNwZWNpZmljIFhJRAotICoJKiBzdGFydHVwIHBy b2Nlc3MgYWRkaW5nIG5ldyBrbm93bi1hc3NpZ25lZCBYSURzCi0gKgkqIHN0YXJ0dXAgcHJv Y2VzcyByZW1vdmluZyBzcGVjaWZpYyBYSURzIGFzIHRyYW5zYWN0aW9ucyBlbmQKLSAqCSog c3RhcnR1cCBwcm9jZXNzIHBydW5pbmcgYXJyYXkgd2hlbiBzcGVjaWFsIFdBTCByZWNvcmRz IGFycml2ZQotICoKLSAqIFRoaXMgZGF0YSBzdHJ1Y3R1cmUgaXMga25vd24gdG8gYmUgYSBo b3Qgc3BvdCBkdXJpbmcgSG90IFN0YW5kYnksIHNvIHdlCi0gKiBnbyB0byBzb21lIGxlbmd0 aHMgdG8gbWFrZSB0aGVzZSBvcGVyYXRpb25zIGFzIGVmZmljaWVudCBhbmQgYXMgY29uY3Vy cmVudAotICogYXMgcG9zc2libGUuCi0gKgotICogVGhlIFhJRHMgYXJlIHN0b3JlZCBpbiBh biBhcnJheSBpbiBzb3J0ZWQgb3JkZXIgLS0tIFRyYW5zYWN0aW9uSWRQcmVjZWRlcwotICog b3JkZXIsIHRvIGJlIGV4YWN0IC0tLSB0byBhbGxvdyBiaW5hcnkgc2VhcmNoIGZvciBzcGVj aWZpYyBYSURzLiAgTm90ZToKLSAqIGluIGdlbmVyYWwgVHJhbnNhY3Rpb25JZFByZWNlZGVz IHdvdWxkIG5vdCBwcm92aWRlIGEgdG90YWwgb3JkZXIsIGJ1dAotICogd2Uga25vdyB0aGF0 IHRoZSBlbnRyaWVzIHByZXNlbnQgYXQgYW55IGluc3RhbnQgc2hvdWxkIG5vdCBleHRlbmQg YWNyb3NzCi0gKiBhIGxhcmdlIGVub3VnaCBmcmFjdGlvbiBvZiBYSUQgc3BhY2UgdG8gd3Jh cCBhcm91bmQgKHRoZSBwcmltYXJ5IHdvdWxkCi0gKiBzaHV0IGRvd24gZm9yIGZlYXIgb2Yg WElEIHdyYXAgbG9uZyBiZWZvcmUgdGhhdCBoYXBwZW5zKS4gIFNvIGl0J3MgT0sgdG8KLSAq IHVzZSBUcmFuc2FjdGlvbklkUHJlY2VkZXMgYXMgYSBiaW5hcnktc2VhcmNoIGNvbXBhcmF0 b3IuCi0gKgotICogSXQncyBjaGVhcCB0byBtYWludGFpbiB0aGUgc29ydGVkbmVzcyBkdXJp bmcgaW5zZXJ0aW9ucywgc2luY2UgbmV3IGtub3duCi0gKiBYSURzIGFyZSBhbHdheXMgcmVw b3J0ZWQgaW4gWElEIG9yZGVyOyB3ZSBqdXN0IGFwcGVuZCB0aGVtIGF0IHRoZSByaWdodC4K LSAqCi0gKiBUbyBrZWVwIGluZGl2aWR1YWwgZGVsZXRpb25zIGNoZWFwLCB3ZSBuZWVkIHRv IGFsbG93IGdhcHMgaW4gdGhlIGFycmF5LgotICogVGhpcyBpcyBpbXBsZW1lbnRlZCBieSBt YXJraW5nIGFycmF5IGVsZW1lbnRzIGFzIHZhbGlkIG9yIGludmFsaWQgdXNpbmcKLSAqIHRo ZSBwYXJhbGxlbCBib29sZWFuIGFycmF5IEtub3duQXNzaWduZWRYaWRzVmFsaWRbXS4gIEEg ZGVsZXRpb24gaXMgZG9uZQotICogYnkgc2V0dGluZyBLbm93bkFzc2lnbmVkWGlkc1ZhbGlk W2ldIHRvIGZhbHNlLCAqd2l0aG91dCogY2xlYXJpbmcgdGhlCi0gKiBYSUQgZW50cnkgaXRz ZWxmLiAgVGhpcyBwcmVzZXJ2ZXMgdGhlIHByb3BlcnR5IHRoYXQgdGhlIFhJRCBlbnRyaWVz IGFyZQotICogc29ydGVkLCBzbyB3ZSBjYW4gZG8gYmluYXJ5IHNlYXJjaGVzIGVhc2lseS4g IFBlcmlvZGljYWxseSB3ZSBjb21wcmVzcwotICogb3V0IHRoZSB1bnVzZWQgZW50cmllczsg dGhhdCdzIG11Y2ggY2hlYXBlciB0aGFuIGhhdmluZyB0byBjb21wcmVzcyB0aGUKLSAqIGFy cmF5IGltbWVkaWF0ZWx5IG9uIGV2ZXJ5IGRlbGV0aW9uLgotICoKLSAqIFRoZSBhY3R1YWxs eSB2YWxpZCBpdGVtcyBpbiBLbm93bkFzc2lnbmVkWGlkc1tdIGFuZCBLbm93bkFzc2lnbmVk WGlkc1ZhbGlkW10KLSAqIGFyZSB0aG9zZSB3aXRoIGluZGV4ZXMgdGFpbCA8PSBpIDwgaGVh ZDsgaXRlbXMgb3V0c2lkZSB0aGlzIHN1YnNjcmlwdCByYW5nZQotICogaGF2ZSB1bnNwZWNp ZmllZCBjb250ZW50cy4gIFdoZW4gaGVhZCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIGFycmF5 LCB3ZQotICogZm9yY2UgY29tcHJlc3Npb24gb2YgdW51c2VkIGVudHJpZXMgcmF0aGVyIHRo YW4gd3JhcHBpbmcgYXJvdW5kLCBzaW5jZQotICogYWxsb3dpbmcgd3JhcGFyb3VuZCB3b3Vs ZCBncmVhdGx5IGNvbXBsaWNhdGUgdGhlIHNlYXJjaCBsb2dpYy4gIFdlIG1haW50YWluCi0g KiBhbiBleHBsaWNpdCB0YWlsIHBvaW50ZXIgc28gdGhhdCBwcnVuaW5nIG9mIG9sZCBYSURz IGNhbiBiZSBkb25lIHdpdGhvdXQKLSAqIGltbWVkaWF0ZWx5IG1vdmluZyB0aGUgYXJyYXkg Y29udGVudHMuICBJbiBtb3N0IGNhc2VzIG9ubHkgYSBzbWFsbCBmcmFjdGlvbgotICogb2Yg dGhlIGFycmF5IGNvbnRhaW5zIHZhbGlkIGVudHJpZXMgYXQgYW55IGluc3RhbnQuCi0gKgot ICogQWx0aG91Z2ggb25seSB0aGUgc3RhcnR1cCBwcm9jZXNzIGNhbiBldmVyIGNoYW5nZSB0 aGUgS25vd25Bc3NpZ25lZFhpZHMKLSAqIGRhdGEgc3RydWN0dXJlLCB3ZSBzdGlsbCBuZWVk IGludGVybG9ja2luZyBzbyB0aGF0IHN0YW5kYnkgYmFja2VuZHMgd2lsbAotICogbm90IG9i c2VydmUgaW52YWxpZCBpbnRlcm1lZGlhdGUgc3RhdGVzLiAgVGhlIGNvbnZlbnRpb24gaXMg dGhhdCBiYWNrZW5kcwotICogbXVzdCBob2xkIHNoYXJlZCBQcm9jQXJyYXlMb2NrIHRvIGV4 YW1pbmUgdGhlIGFycmF5LiAgVG8gcmVtb3ZlIFhJRHMgZnJvbQotICogdGhlIGFycmF5LCB0 aGUgc3RhcnR1cCBwcm9jZXNzIG11c3QgaG9sZCBQcm9jQXJyYXlMb2NrIGV4Y2x1c2l2ZWx5 LCBmb3IKLSAqIHRoZSB1c3VhbCB0cmFuc2FjdGlvbmFsIHJlYXNvbnMgKGNvbXBhcmUgY29t bWl0L2Fib3J0IG9mIGEgdHJhbnNhY3Rpb24KLSAqIGR1cmluZyBub3JtYWwgcnVubmluZyku ICBDb21wcmVzc2luZyB1bnVzZWQgZW50cmllcyBvdXQgb2YgdGhlIGFycmF5Ci0gKiBsaWtl d2lzZSByZXF1aXJlcyBleGNsdXNpdmUgbG9jay4gIFRvIGFkZCBYSURzIHRvIHRoZSBhcnJh eSwgd2UganVzdCBpbnNlcnQKLSAqIHRoZW0gaW50byBzbG90cyB0byB0aGUgcmlnaHQgb2Yg dGhlIGhlYWQgcG9pbnRlciBhbmQgdGhlbiBhZHZhbmNlIHRoZSBoZWFkCi0gKiBwb2ludGVy LiAgVGhpcyBkb2Vzbid0IHJlcXVpcmUgYW55IGxvY2sgYXQgYWxsLCBidXQgb24gbWFjaGlu ZXMgd2l0aCB3ZWFrCi0gKiBtZW1vcnkgb3JkZXJpbmcsIHdlIG5lZWQgdG8gYmUgY2FyZWZ1 bCB0aGF0IG90aGVyIHByb2Nlc3NvcnMgc2VlIHRoZSBhcnJheQotICogZWxlbWVudCBjaGFu Z2VzIGJlZm9yZSB0aGV5IHNlZSB0aGUgaGVhZCBwb2ludGVyIGNoYW5nZS4gIFdlIGhhbmRs ZSB0aGlzIGJ5Ci0gKiB1c2luZyBtZW1vcnkgYmFycmllcnMgd2hlbiByZWFkaW5nIG9yIHdy aXRpbmcgdGhlIGhlYWQvdGFpbCBwb2ludGVycyAodW5sZXNzCi0gKiB0aGUgY2FsbGVyIGhv bGRzIFByb2NBcnJheUxvY2sgZXhjbHVzaXZlbHkpLgotICoKLSAqIEFsZ29yaXRobWljIGFu YWx5c2lzOgotICoKLSAqIElmIHdlIGhhdmUgYSBtYXhpbXVtIG9mIE0gc2xvdHMsIHdpdGgg TiBYSURzIGN1cnJlbnRseSBzcHJlYWQgYWNyb3NzCi0gKiBTIGVsZW1lbnRzIHRoZW4gd2Ug aGF2ZSBOIDw9IFMgPD0gTSBhbHdheXMuCi0gKgotICoJKiBBZGRpbmcgYSBuZXcgWElEIGlz IE8oMSkgYW5kIG5lZWRzIG5vIGxvY2sgKHVubGVzcyBjb21wcmVzc2lvbiBtdXN0Ci0gKgkJ aGFwcGVuKQotICoJKiBDb21wcmVzc2luZyB0aGUgYXJyYXkgaXMgTyhTKSBhbmQgcmVxdWly ZXMgZXhjbHVzaXZlIGxvY2sKLSAqCSogUmVtb3ZpbmcgYW4gWElEIGlzIE8obG9nUykgYW5k IHJlcXVpcmVzIGV4Y2x1c2l2ZSBsb2NrCi0gKgkqIFRha2luZyBhIHNuYXBzaG90IGlzIE8o UykgYW5kIHJlcXVpcmVzIHNoYXJlZCBsb2NrCi0gKgkqIENoZWNraW5nIGZvciBhbiBYSUQg aXMgTyhsb2dTKSBhbmQgcmVxdWlyZXMgc2hhcmVkIGxvY2sKLSAqCi0gKiBJbiBjb21wYXJp c29uLCB1c2luZyBhIGhhc2ggdGFibGUgZm9yIEtub3duQXNzaWduZWRYaWRzIHdvdWxkIG1l YW4gdGhhdAotICogdGFraW5nIHNuYXBzaG90cyB3b3VsZCBiZSBPKE0pLiBJZiB3ZSBjYW4g bWFpbnRhaW4gUyA8PCBNIHRoZW4gdGhlCi0gKiBzb3J0ZWQgYXJyYXkgdGVjaG5pcXVlIHdp bGwgZGVsaXZlciBzaWduaWZpY2FudGx5IGZhc3RlciBzbmFwc2hvdHMuCi0gKiBJZiB3ZSB0 cnkgdG8ga2VlcCBTIHRvbyBzbWFsbCB0aGVuIHdlIHdpbGwgc3BlbmQgdG9vIG11Y2ggdGlt ZSBjb21wcmVzc2luZywKLSAqIHNvIHRoZXJlIGlzIGFuIG9wdGltYWwgcG9pbnQgZm9yIGFu eSB3b3JrbG9hZCBtaXguIFdlIHVzZSBhIGhldXJpc3RpYyB0bwotICogZGVjaWRlIHdoZW4g dG8gY29tcHJlc3MgdGhlIGFycmF5LCB0aG91Z2ggdHJpbW1pbmcgYWxzbyBoZWxwcyByZWR1 Y2UKLSAqIGZyZXF1ZW5jeSBvZiBjb21wcmVzc2luZy4gVGhlIGhldXJpc3RpYyByZXF1aXJl cyB1cyB0byB0cmFjayB0aGUgbnVtYmVyIG9mCi0gKiBjdXJyZW50bHkgdmFsaWQgWElEcyBp biB0aGUgYXJyYXkgKE4pLiAgRXhjZXB0IGluIHNwZWNpYWwgY2FzZXMsIHdlJ2xsCi0gKiBj b21wcmVzcyB3aGVuIFMgPj0gMk4uICBCb3VuZGluZyBTIGF0IDJOIGluIHR1cm4gYm91bmRz IHRoZSB0aW1lIGZvcgotICogdGFraW5nIGEgc25hcHNob3QgdG8gYmUgTyhOKSwgd2hpY2gg aXQgd291bGQgaGF2ZSB0byBiZSBhbnl3YXkuCi0gKi8KLQotCi0vKgotICogQ29tcHJlc3Mg S25vd25Bc3NpZ25lZFhpZHMgYnkgc2hpZnRpbmcgdmFsaWQgZGF0YSBkb3duIHRvIHRoZSBz dGFydCBvZiB0aGUKLSAqIGFycmF5LCByZW1vdmluZyBhbnkgZ2Fwcy4KLSAqCi0gKiBBIGNv bXByZXNzaW9uIHN0ZXAgaXMgZm9yY2VkIGlmICJyZWFzb24iIGlzIEtBWF9OT19TUEFDRSwg b3RoZXJ3aXNlCi0gKiB3ZSBkbyBpdCBvbmx5IGlmIGEgaGV1cmlzdGljIGluZGljYXRlcyBp dCdzIGEgZ29vZCB0aW1lIHRvIGRvIGl0LgotICoKLSAqIENvbXByZXNzaW9uIHJlcXVpcmVz IGhvbGRpbmcgUHJvY0FycmF5TG9jayBpbiBleGNsdXNpdmUgbW9kZS4KLSAqIENhbGxlciBt dXN0IHBhc3MgaGF2ZUxvY2sgPSB0cnVlIGlmIGl0IGFscmVhZHkgaG9sZHMgdGhlIGxvY2su Ci0gKi8KLXN0YXRpYyB2b2lkCi1Lbm93bkFzc2lnbmVkWGlkc0NvbXByZXNzKEtBWENvbXBy ZXNzUmVhc29uIHJlYXNvbiwgYm9vbCBoYXZlTG9jaykKLXsKLQlQcm9jQXJyYXlTdHJ1Y3Qg KnBBcnJheSA9IHByb2NBcnJheTsKLQlpbnQJCQloZWFkLAotCQkJCXRhaWwsCi0JCQkJbmVs ZW1lbnRzOwotCWludAkJCWNvbXByZXNzX2luZGV4OwotCWludAkJCWk7Ci0KLQkvKiBDb3Vu dGVycyBmb3IgY29tcHJlc3Npb24gaGV1cmlzdGljcyAqLwotCXN0YXRpYyB1bnNpZ25lZCBp bnQgdHJhbnNhY3Rpb25FbmRzQ291bnRlcjsKLQlzdGF0aWMgVGltZXN0YW1wVHogbGFzdENv bXByZXNzVHM7Ci0KLQkvKiBUdW5pbmcgY29uc3RhbnRzICovCi0jZGVmaW5lIEtBWF9DT01Q UkVTU19GUkVRVUVOQ1kgMTI4CS8qIGluIHRyYW5zYWN0aW9ucyAqLwotI2RlZmluZSBLQVhf Q09NUFJFU1NfSURMRV9JTlRFUlZBTCAxMDAwIC8qIGluIG1zICovCi0KLQkvKgotCSAqIFNp bmNlIG9ubHkgdGhlIHN0YXJ0dXAgcHJvY2VzcyBtb2RpZmllcyB0aGUgaGVhZC90YWlsIHBv aW50ZXJzLCB3ZQotCSAqIGRvbid0IG5lZWQgYSBsb2NrIHRvIHJlYWQgdGhlbSBoZXJlLgot CSAqLwotCWhlYWQgPSBwQXJyYXktPmhlYWRLbm93bkFzc2lnbmVkWGlkczsKLQl0YWlsID0g cEFycmF5LT50YWlsS25vd25Bc3NpZ25lZFhpZHM7Ci0JbmVsZW1lbnRzID0gaGVhZCAtIHRh aWw7Ci0KLQkvKgotCSAqIElmIHdlIGNhbiBjaG9vc2Ugd2hldGhlciB0byBjb21wcmVzcywg dXNlIGEgaGV1cmlzdGljIHRvIGF2b2lkCi0JICogY29tcHJlc3NpbmcgdG9vIG9mdGVuIG9y IG5vdCBvZnRlbiBlbm91Z2guICAiQ29tcHJlc3MiIGhlcmUgc2ltcGx5Ci0JICogbWVhbnMg bW92aW5nIHRoZSB2YWx1ZXMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXksIHNvIGl0 IGlzIG5vdCBhcwotCSAqIGNvbXBsZXggb3IgY29zdGx5IGFzIHR5cGljYWwgZGF0YSBjb21w cmVzc2lvbiBhbGdvcml0aG1zLgotCSAqLwotCWlmIChuZWxlbWVudHMgPT0gcEFycmF5LT5u dW1Lbm93bkFzc2lnbmVkWGlkcykKLQl7Ci0JCS8qCi0JCSAqIFdoZW4gdGhlcmUgYXJlIG5v IGdhcHMgYmV0d2VlbiBoZWFkIGFuZCB0YWlsLCBkb24ndCBib3RoZXIgdG8KLQkJICogY29t cHJlc3MsIGV4Y2VwdCBpbiB0aGUgS0FYX05PX1NQQUNFIGNhc2Ugd2hlcmUgd2UgbXVzdCBj b21wcmVzcyB0bwotCQkgKiBjcmVhdGUgc29tZSBzcGFjZSBhZnRlciB0aGUgaGVhZC4KLQkJ ICovCi0JCWlmIChyZWFzb24gIT0gS0FYX05PX1NQQUNFKQotCQkJcmV0dXJuOwotCX0KLQll bHNlIGlmIChyZWFzb24gPT0gS0FYX1RSQU5TQUNUSU9OX0VORCkKLQl7Ci0JCS8qCi0JCSAq IENvbnNpZGVyIGNvbXByZXNzaW5nIG9ubHkgb25jZSBldmVyeSBzbyBtYW55IGNvbW1pdHMu ICBGcmVxdWVuY3kKLQkJICogZGV0ZXJtaW5lZCBieSBiZW5jaG1hcmtzLgotCQkgKi8KLQkJ aWYgKCh0cmFuc2FjdGlvbkVuZHNDb3VudGVyKyspICUgS0FYX0NPTVBSRVNTX0ZSRVFVRU5D WSAhPSAwKQotCQkJcmV0dXJuOwotCi0JCS8qCi0JCSAqIEZ1cnRoZXJtb3JlLCBjb21wcmVz cyBvbmx5IGlmIHRoZSB1c2VkIHBhcnQgb2YgdGhlIGFycmF5IGlzIGxlc3MKLQkJICogdGhh biA1MCUgZnVsbCAoc2VlIGNvbW1lbnRzIGFib3ZlKS4KLQkJICovCi0JCWlmIChuZWxlbWVu dHMgPCAyICogcEFycmF5LT5udW1Lbm93bkFzc2lnbmVkWGlkcykKLQkJCXJldHVybjsKLQl9 Ci0JZWxzZSBpZiAocmVhc29uID09IEtBWF9TVEFSVFVQX1BST0NFU1NfSURMRSkKLQl7Ci0J CS8qCi0JCSAqIFdlJ3JlIGFib3V0IHRvIGdvIGlkbGUgZm9yIGxhY2sgb2YgbmV3IFdBTCwg c28gd2UgbWlnaHQgYXMgd2VsbAotCQkgKiBjb21wcmVzcy4gIEJ1dCBub3QgdG9vIG9mdGVu LCB0byBhdm9pZCBQcm9jQXJyYXkgbG9jayBjb250ZW50aW9uCi0JCSAqIHdpdGggcmVhZGVy cy4KLQkJICovCi0JCWlmIChsYXN0Q29tcHJlc3NUcyAhPSAwKQotCQl7Ci0JCQlUaW1lc3Rh bXBUeiBjb21wcmVzc19hZnRlcjsKLQotCQkJY29tcHJlc3NfYWZ0ZXIgPSBUaW1lc3RhbXBU elBsdXNNaWxsaXNlY29uZHMobGFzdENvbXByZXNzVHMsCi0JCQkJCQkJCQkJCQkJCSBLQVhf Q09NUFJFU1NfSURMRV9JTlRFUlZBTCk7Ci0JCQlpZiAoR2V0Q3VycmVudFRpbWVzdGFtcCgp IDwgY29tcHJlc3NfYWZ0ZXIpCi0JCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JLyogTmVlZCB0 byBjb21wcmVzcywgc28gZ2V0IHRoZSBsb2NrIGlmIHdlIGRvbid0IGhhdmUgaXQuICovCi0J aWYgKCFoYXZlTG9jaykKLQkJTFdMb2NrQWNxdWlyZShQcm9jQXJyYXlMb2NrLCBMV19FWENM VVNJVkUpOwotCi0JLyoKLQkgKiBXZSBjb21wcmVzcyB0aGUgYXJyYXkgYnkgcmVhZGluZyB0 aGUgdmFsaWQgdmFsdWVzIGZyb20gdGFpbCB0byBoZWFkLAotCSAqIHJlLWFsaWduaW5nIGRh dGEgdG8gMHRoIGVsZW1lbnQuCi0JICovCi0JY29tcHJlc3NfaW5kZXggPSAwOwotCWZvciAo aSA9IHRhaWw7IGkgPCBoZWFkOyBpKyspCi0JewotCQlpZiAoS25vd25Bc3NpZ25lZFhpZHNW YWxpZFtpXSkKLQkJewotCQkJS25vd25Bc3NpZ25lZFhpZHNbY29tcHJlc3NfaW5kZXhdID0g S25vd25Bc3NpZ25lZFhpZHNbaV07Ci0JCQlLbm93bkFzc2lnbmVkWGlkc1ZhbGlkW2NvbXBy ZXNzX2luZGV4XSA9IHRydWU7Ci0JCQljb21wcmVzc19pbmRleCsrOwotCQl9Ci0JfQotCUFz c2VydChjb21wcmVzc19pbmRleCA9PSBwQXJyYXktPm51bUtub3duQXNzaWduZWRYaWRzKTsK LQotCXBBcnJheS0+dGFpbEtub3duQXNzaWduZWRYaWRzID0gMDsKLQlwQXJyYXktPmhlYWRL bm93bkFzc2lnbmVkWGlkcyA9IGNvbXByZXNzX2luZGV4OwotCi0JaWYgKCFoYXZlTG9jaykK LQkJTFdMb2NrUmVsZWFzZShQcm9jQXJyYXlMb2NrKTsKLQotCS8qIFVwZGF0ZSB0aW1lc3Rh bXAgZm9yIG1haW50ZW5hbmNlLiAgTm8gbmVlZCB0byBob2xkIGxvY2sgZm9yIHRoaXMuICov Ci0JbGFzdENvbXByZXNzVHMgPSBHZXRDdXJyZW50VGltZXN0YW1wKCk7Ci19Ci0KLS8qCi0g KiBBZGQgeGlkcyBpbnRvIEtub3duQXNzaWduZWRYaWRzIGF0IHRoZSBoZWFkIG9mIHRoZSBh cnJheS4KLSAqCi0gKiB4aWRzIGZyb20gZnJvbV94aWQgdG8gdG9feGlkLCBpbmNsdXNpdmUs IGFyZSBhZGRlZCB0byB0aGUgYXJyYXkuCi0gKgotICogSWYgZXhjbHVzaXZlX2xvY2sgaXMg dHJ1ZSB0aGVuIGNhbGxlciBhbHJlYWR5IGhvbGRzIFByb2NBcnJheUxvY2sgaW4KLSAqIGV4 Y2x1c2l2ZSBtb2RlLCBzbyB3ZSBuZWVkIG5vIGV4dHJhIGxvY2tpbmcgaGVyZS4gIEVsc2Ug Y2FsbGVyIGhvbGRzIG5vCi0gKiBsb2NrLCBzbyB3ZSBuZWVkIHRvIGJlIHN1cmUgd2UgbWFp bnRhaW4gc3VmZmljaWVudCBpbnRlcmxvY2tzIGFnYWluc3QKLSAqIGNvbmN1cnJlbnQgcmVh ZGVycy4gIChPbmx5IHRoZSBzdGFydHVwIHByb2Nlc3MgZXZlciBjYWxscyB0aGlzLCBzbyBu byBuZWVkCi0gKiB0byB3b3JyeSBhYm91dCBjb25jdXJyZW50IHdyaXRlcnMuKQotICovCi1z dGF0aWMgdm9pZAotS25vd25Bc3NpZ25lZFhpZHNBZGQoVHJhbnNhY3Rpb25JZCBmcm9tX3hp ZCwgVHJhbnNhY3Rpb25JZCB0b194aWQsCi0JCQkJCSBib29sIGV4Y2x1c2l2ZV9sb2NrKQot ewotCVByb2NBcnJheVN0cnVjdCAqcEFycmF5ID0gcHJvY0FycmF5OwotCVRyYW5zYWN0aW9u SWQgbmV4dF94aWQ7Ci0JaW50CQkJaGVhZCwKLQkJCQl0YWlsOwotCWludAkJCW54aWRzOwot CWludAkJCWk7Ci0KLQlBc3NlcnQoVHJhbnNhY3Rpb25JZFByZWNlZGVzT3JFcXVhbHMoZnJv bV94aWQsIHRvX3hpZCkpOwotCi0JLyoKLQkgKiBDYWxjdWxhdGUgaG93IG1hbnkgYXJyYXkg c2xvdHMgd2UnbGwgbmVlZC4gIE5vcm1hbGx5IHRoaXMgaXMgY2hlYXA7IGluCi0JICogdGhl IHVudXN1YWwgY2FzZSB3aGVyZSB0aGUgWElEcyBjcm9zcyB0aGUgd3JhcCBwb2ludCwgd2Ug ZG8gaXQgdGhlIGhhcmQKLQkgKiB3YXkuCi0JICovCi0JaWYgKHRvX3hpZCA+PSBmcm9tX3hp ZCkKLQkJbnhpZHMgPSB0b194aWQgLSBmcm9tX3hpZCArIDE7Ci0JZWxzZQotCXsKLQkJbnhp ZHMgPSAxOwotCQluZXh0X3hpZCA9IGZyb21feGlkOwotCQl3aGlsZSAoVHJhbnNhY3Rpb25J ZFByZWNlZGVzKG5leHRfeGlkLCB0b194aWQpKQotCQl7Ci0JCQlueGlkcysrOwotCQkJVHJh bnNhY3Rpb25JZEFkdmFuY2UobmV4dF94aWQpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBTaW5j ZSBvbmx5IHRoZSBzdGFydHVwIHByb2Nlc3MgbW9kaWZpZXMgdGhlIGhlYWQvdGFpbCBwb2lu dGVycywgd2UKLQkgKiBkb24ndCBuZWVkIGEgbG9jayB0byByZWFkIHRoZW0gaGVyZS4KLQkg Ki8KLQloZWFkID0gcEFycmF5LT5oZWFkS25vd25Bc3NpZ25lZFhpZHM7Ci0JdGFpbCA9IHBB cnJheS0+dGFpbEtub3duQXNzaWduZWRYaWRzOwotCi0JQXNzZXJ0KGhlYWQgPj0gMCAmJiBo ZWFkIDw9IHBBcnJheS0+bWF4S25vd25Bc3NpZ25lZFhpZHMpOwotCUFzc2VydCh0YWlsID49 IDAgJiYgdGFpbCA8IHBBcnJheS0+bWF4S25vd25Bc3NpZ25lZFhpZHMpOwotCi0JLyoKLQkg KiBWZXJpZnkgdGhhdCBpbnNlcnRpb25zIG9jY3VyIGluIFRyYW5zYWN0aW9uSWQgc2VxdWVu Y2UuICBOb3RlIHRoYXQgZXZlbgotCSAqIGlmIHRoZSBsYXN0IGV4aXN0aW5nIGVsZW1lbnQg aXMgbWFya2VkIGludmFsaWQsIGl0IG11c3Qgc3RpbGwgaGF2ZSBhCi0JICogY29ycmVjdGx5 IHNlcXVlbmNlZCBYSUQgdmFsdWUuCi0JICovCi0JaWYgKGhlYWQgPiB0YWlsICYmCi0JCVRy YW5zYWN0aW9uSWRGb2xsb3dzT3JFcXVhbHMoS25vd25Bc3NpZ25lZFhpZHNbaGVhZCAtIDFd LCBmcm9tX3hpZCkpCi0JewotCQlLbm93bkFzc2lnbmVkWGlkc0Rpc3BsYXkoTE9HKTsKLQkJ ZWxvZyhFUlJPUiwgIm91dC1vZi1vcmRlciBYSUQgaW5zZXJ0aW9uIGluIEtub3duQXNzaWdu ZWRYaWRzIik7Ci0JfQotCi0JLyoKLQkgKiBJZiBvdXIgeGlkcyB3b24ndCBmaXQgaW4gdGhl IHJlbWFpbmluZyBzcGFjZSwgY29tcHJlc3Mgb3V0IGZyZWUgc3BhY2UKLQkgKi8KLQlpZiAo aGVhZCArIG54aWRzID4gcEFycmF5LT5tYXhLbm93bkFzc2lnbmVkWGlkcykKLQl7Ci0JCUtu b3duQXNzaWduZWRYaWRzQ29tcHJlc3MoS0FYX05PX1NQQUNFLCBleGNsdXNpdmVfbG9jayk7 Ci0KLQkJaGVhZCA9IHBBcnJheS0+aGVhZEtub3duQXNzaWduZWRYaWRzOwotCQkvKiBub3Rl OiB3ZSBubyBsb25nZXIgY2FyZSBhYm91dCB0aGUgdGFpbCBwb2ludGVyICovCi0KLQkJLyoK LQkJICogSWYgaXQgc3RpbGwgd29uJ3QgZml0IHRoZW4gd2UncmUgb3V0IG9mIG1lbW9yeQot CQkgKi8KLQkJaWYgKGhlYWQgKyBueGlkcyA+IHBBcnJheS0+bWF4S25vd25Bc3NpZ25lZFhp ZHMpCi0JCQllbG9nKEVSUk9SLCAidG9vIG1hbnkgS25vd25Bc3NpZ25lZFhpZHMiKTsKLQl9 Ci0KLQkvKiBOb3cgd2UgY2FuIGluc2VydCB0aGUgeGlkcyBpbnRvIHRoZSBzcGFjZSBzdGFy dGluZyBhdCBoZWFkICovCi0JbmV4dF94aWQgPSBmcm9tX3hpZDsKLQlmb3IgKGkgPSAwOyBp IDwgbnhpZHM7IGkrKykKLQl7Ci0JCUtub3duQXNzaWduZWRYaWRzW2hlYWRdID0gbmV4dF94 aWQ7Ci0JCUtub3duQXNzaWduZWRYaWRzVmFsaWRbaGVhZF0gPSB0cnVlOwotCQlUcmFuc2Fj dGlvbklkQWR2YW5jZShuZXh0X3hpZCk7Ci0JCWhlYWQrKzsKLQl9Ci0KLQkvKiBBZGp1c3Qg Y291bnQgb2YgbnVtYmVyIG9mIHZhbGlkIGVudHJpZXMgKi8KLQlwQXJyYXktPm51bUtub3du QXNzaWduZWRYaWRzICs9IG54aWRzOwotCi0JLyoKLQkgKiBOb3cgdXBkYXRlIHRoZSBoZWFk IHBvaW50ZXIuICBXZSB1c2UgYSB3cml0ZSBiYXJyaWVyIHRvIGVuc3VyZSB0aGF0Ci0JICog b3RoZXIgcHJvY2Vzc29ycyBzZWUgdGhlIGFib3ZlIGFycmF5IHVwZGF0ZXMgYmVmb3JlIHRo ZXkgc2VlIHRoZSBoZWFkCi0JICogcG9pbnRlciBjaGFuZ2UuICBUaGUgYmFycmllciBpc24n dCByZXF1aXJlZCBpZiB3ZSdyZSBob2xkaW5nCi0JICogUHJvY0FycmF5TG9jayBleGNsdXNp dmVseS4KLQkgKi8KLQlpZiAoIWV4Y2x1c2l2ZV9sb2NrKQotCQlwZ193cml0ZV9iYXJyaWVy KCk7Ci0KLQlwQXJyYXktPmhlYWRLbm93bkFzc2lnbmVkWGlkcyA9IGhlYWQ7Ci19Ci0KLS8q Ci0gKiBLbm93bkFzc2lnbmVkWGlkc1NlYXJjaAotICoKLSAqIFNlYXJjaGVzIEtub3duQXNz aWduZWRYaWRzIGZvciBhIHNwZWNpZmljIHhpZCBhbmQgb3B0aW9uYWxseSByZW1vdmVzIGl0 LgotICogUmV0dXJucyB0cnVlIGlmIGl0IHdhcyBmb3VuZCwgZmFsc2UgaWYgbm90LgotICoK LSAqIENhbGxlciBtdXN0IGhvbGQgUHJvY0FycmF5TG9jayBpbiBzaGFyZWQgb3IgZXhjbHVz aXZlIG1vZGUuCi0gKiBFeGNsdXNpdmUgbG9jayBtdXN0IGJlIGhlbGQgZm9yIHJlbW92ZSA9 IHRydWUuCi0gKi8KLXN0YXRpYyBib29sCi1Lbm93bkFzc2lnbmVkWGlkc1NlYXJjaChUcmFu c2FjdGlvbklkIHhpZCwgYm9vbCByZW1vdmUpCi17Ci0JUHJvY0FycmF5U3RydWN0ICpwQXJy YXkgPSBwcm9jQXJyYXk7Ci0JaW50CQkJZmlyc3QsCi0JCQkJbGFzdDsKLQlpbnQJCQloZWFk OwotCWludAkJCXRhaWw7Ci0JaW50CQkJcmVzdWx0X2luZGV4ID0gLTE7Ci0KLQl0YWlsID0g cEFycmF5LT50YWlsS25vd25Bc3NpZ25lZFhpZHM7Ci0JaGVhZCA9IHBBcnJheS0+aGVhZEtu b3duQXNzaWduZWRYaWRzOwotCi0JLyoKLQkgKiBPbmx5IHRoZSBzdGFydHVwIHByb2Nlc3Mg cmVtb3ZlcyBlbnRyaWVzLCBzbyB3ZSBkb24ndCBuZWVkIHRoZSByZWFkCi0JICogYmFycmll ciBpbiB0aGF0IGNhc2UuCi0JICovCi0JaWYgKCFyZW1vdmUpCi0JCXBnX3JlYWRfYmFycmll cigpOwkJLyogcGFpcnMgd2l0aCBLbm93bkFzc2lnbmVkWGlkc0FkZCAqLwotCi0JLyoKLQkg KiBTdGFuZGFyZCBiaW5hcnkgc2VhcmNoLiAgTm90ZSB3ZSBjYW4gaWdub3JlIHRoZSBLbm93 bkFzc2lnbmVkWGlkc1ZhbGlkCi0JICogYXJyYXkgaGVyZSwgc2luY2UgZXZlbiBpbnZhbGlk IGVudHJpZXMgd2lsbCBjb250YWluIHNvcnRlZCBYSURzLgotCSAqLwotCWZpcnN0ID0gdGFp bDsKLQlsYXN0ID0gaGVhZCAtIDE7Ci0Jd2hpbGUgKGZpcnN0IDw9IGxhc3QpCi0JewotCQlp bnQJCQltaWRfaW5kZXg7Ci0JCVRyYW5zYWN0aW9uSWQgbWlkX3hpZDsKLQotCQltaWRfaW5k ZXggPSAoZmlyc3QgKyBsYXN0KSAvIDI7Ci0JCW1pZF94aWQgPSBLbm93bkFzc2lnbmVkWGlk c1ttaWRfaW5kZXhdOwotCi0JCWlmICh4aWQgPT0gbWlkX3hpZCkKLQkJewotCQkJcmVzdWx0 X2luZGV4ID0gbWlkX2luZGV4OwotCQkJYnJlYWs7Ci0JCX0KLQkJZWxzZSBpZiAoVHJhbnNh Y3Rpb25JZFByZWNlZGVzKHhpZCwgbWlkX3hpZCkpCi0JCQlsYXN0ID0gbWlkX2luZGV4IC0g MTsKLQkJZWxzZQotCQkJZmlyc3QgPSBtaWRfaW5kZXggKyAxOwotCX0KLQotCWlmIChyZXN1 bHRfaW5kZXggPCAwKQotCQlyZXR1cm4gZmFsc2U7CQkJLyogbm90IGluIGFycmF5ICovCi0K LQlpZiAoIUtub3duQXNzaWduZWRYaWRzVmFsaWRbcmVzdWx0X2luZGV4XSkKLQkJcmV0dXJu IGZhbHNlOwkJCS8qIGluIGFycmF5LCBidXQgaW52YWxpZCAqLwotCi0JaWYgKHJlbW92ZSkK LQl7Ci0JCUtub3duQXNzaWduZWRYaWRzVmFsaWRbcmVzdWx0X2luZGV4XSA9IGZhbHNlOwot Ci0JCXBBcnJheS0+bnVtS25vd25Bc3NpZ25lZFhpZHMtLTsKLQkJQXNzZXJ0KHBBcnJheS0+ bnVtS25vd25Bc3NpZ25lZFhpZHMgPj0gMCk7Ci0KLQkJLyoKLQkJICogSWYgd2UncmUgcmVt b3ZpbmcgdGhlIHRhaWwgZWxlbWVudCB0aGVuIGFkdmFuY2UgdGFpbCBwb2ludGVyIG92ZXIK LQkJICogYW55IGludmFsaWQgZWxlbWVudHMuICBUaGlzIHdpbGwgc3BlZWQgZnV0dXJlIHNl YXJjaGVzLgotCQkgKi8KLQkJaWYgKHJlc3VsdF9pbmRleCA9PSB0YWlsKQotCQl7Ci0JCQl0 YWlsKys7Ci0JCQl3aGlsZSAodGFpbCA8IGhlYWQgJiYgIUtub3duQXNzaWduZWRYaWRzVmFs aWRbdGFpbF0pCi0JCQkJdGFpbCsrOwotCQkJaWYgKHRhaWwgPj0gaGVhZCkKLQkJCXsKLQkJ CQkvKiBBcnJheSBpcyBlbXB0eSwgc28gd2UgY2FuIHJlc2V0IGJvdGggcG9pbnRlcnMgKi8K LQkJCQlwQXJyYXktPmhlYWRLbm93bkFzc2lnbmVkWGlkcyA9IDA7Ci0JCQkJcEFycmF5LT50 YWlsS25vd25Bc3NpZ25lZFhpZHMgPSAwOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXBB cnJheS0+dGFpbEtub3duQXNzaWduZWRYaWRzID0gdGFpbDsKLQkJCX0KLQkJfQotCX0KLQot CXJldHVybiB0cnVlOwotfQotCi0vKgotICogSXMgdGhlIHNwZWNpZmllZCBYSUQgcHJlc2Vu dCBpbiBLbm93bkFzc2lnbmVkWGlkc1tdPwotICoKLSAqIENhbGxlciBtdXN0IGhvbGQgUHJv Y0FycmF5TG9jayBpbiBzaGFyZWQgb3IgZXhjbHVzaXZlIG1vZGUuCi0gKi8KLXN0YXRpYyBi b29sCi1Lbm93bkFzc2lnbmVkWGlkRXhpc3RzKFRyYW5zYWN0aW9uSWQgeGlkKQotewotCUFz c2VydChUcmFuc2FjdGlvbklkSXNWYWxpZCh4aWQpKTsKLQotCXJldHVybiBLbm93bkFzc2ln bmVkWGlkc1NlYXJjaCh4aWQsIGZhbHNlKTsKLX0KLQotLyoKLSAqIFJlbW92ZSB0aGUgc3Bl Y2lmaWVkIFhJRCBmcm9tIEtub3duQXNzaWduZWRYaWRzW10uCi0gKgotICogQ2FsbGVyIG11 c3QgaG9sZCBQcm9jQXJyYXlMb2NrIGluIGV4Y2x1c2l2ZSBtb2RlLgotICovCi1zdGF0aWMg dm9pZAotS25vd25Bc3NpZ25lZFhpZHNSZW1vdmUoVHJhbnNhY3Rpb25JZCB4aWQpCi17Ci0J QXNzZXJ0KFRyYW5zYWN0aW9uSWRJc1ZhbGlkKHhpZCkpOwotCi0JZWxvZyhERUJVRzQsICJy ZW1vdmUgS25vd25Bc3NpZ25lZFhpZCAldSIsIHhpZCk7Ci0KLQkvKgotCSAqIE5vdGU6IHdl IGNhbm5vdCBjb25zaWRlciBpdCBhbiBlcnJvciB0byByZW1vdmUgYW4gWElEIHRoYXQncyBu b3QKLQkgKiBwcmVzZW50LiAgV2UgaW50ZW50aW9uYWxseSByZW1vdmUgc3VieGFjdCBJRHMg d2hpbGUgcHJvY2Vzc2luZwotCSAqIFhMT0dfWEFDVF9BU1NJR05NRU5ULCB0byBhdm9pZCBh cnJheSBvdmVyZmxvdy4gIFRoZW4gdGhvc2UgWElEcyB3aWxsIGJlCi0JICogcmVtb3ZlZCBh Z2FpbiB3aGVuIHRoZSB0b3AtbGV2ZWwgeGFjdCBjb21taXRzIG9yIGFib3J0cy4KLQkgKgot CSAqIEl0IG1pZ2h0IGJlIHBvc3NpYmxlIHRvIHRyYWNrIHN1Y2ggWElEcyB0byBkaXN0aW5n dWlzaCB0aGlzIGNhc2UgZnJvbQotCSAqIGFjdHVhbCBlcnJvcnMsIGJ1dCBpdCB3b3VsZCBi ZSBjb21wbGljYXRlZCBhbmQgcHJvYmFibHkgbm90IHdvcnRoIGl0LgotCSAqIFNvLCBqdXN0 IGlnbm9yZSB0aGUgc2VhcmNoIHJlc3VsdC4KLQkgKi8KLQkodm9pZCkgS25vd25Bc3NpZ25l ZFhpZHNTZWFyY2goeGlkLCB0cnVlKTsKLX0KLQotLyoKLSAqIEtub3duQXNzaWduZWRYaWRz UmVtb3ZlVHJlZQotICoJCVJlbW92ZSB4aWQgKGlmIGl0J3Mgbm90IEludmFsaWRUcmFuc2Fj dGlvbklkKSBhbmQgYWxsIHRoZSBzdWJ4aWRzLgotICoKLSAqIENhbGxlciBtdXN0IGhvbGQg UHJvY0FycmF5TG9jayBpbiBleGNsdXNpdmUgbW9kZS4KLSAqLwotc3RhdGljIHZvaWQKLUtu b3duQXNzaWduZWRYaWRzUmVtb3ZlVHJlZShUcmFuc2FjdGlvbklkIHhpZCwgaW50IG5zdWJ4 aWRzLAotCQkJCQkJCVRyYW5zYWN0aW9uSWQgKnN1YnhpZHMpCi17Ci0JaW50CQkJaTsKLQot CWlmIChUcmFuc2FjdGlvbklkSXNWYWxpZCh4aWQpKQotCQlLbm93bkFzc2lnbmVkWGlkc1Jl bW92ZSh4aWQpOwotCi0JZm9yIChpID0gMDsgaSA8IG5zdWJ4aWRzOyBpKyspCi0JCUtub3du QXNzaWduZWRYaWRzUmVtb3ZlKHN1YnhpZHNbaV0pOwotCi0JLyogT3Bwb3J0dW5pc3RpY2Fs bHkgY29tcHJlc3MgdGhlIGFycmF5ICovCi0JS25vd25Bc3NpZ25lZFhpZHNDb21wcmVzcyhL QVhfVFJBTlNBQ1RJT05fRU5ELCB0cnVlKTsKLX0KLQotLyoKLSAqIFBydW5lIEtub3duQXNz aWduZWRYaWRzIHVwIHRvLCBidXQgKm5vdCogaW5jbHVkaW5nIHhpZC4gSWYgeGlkIGlzIGlu dmFsaWQKLSAqIHRoZW4gY2xlYXIgdGhlIHdob2xlIHRhYmxlLgotICoKLSAqIENhbGxlciBt dXN0IGhvbGQgUHJvY0FycmF5TG9jayBpbiBleGNsdXNpdmUgbW9kZS4KLSAqLwotc3RhdGlj IHZvaWQKLUtub3duQXNzaWduZWRYaWRzUmVtb3ZlUHJlY2VkaW5nKFRyYW5zYWN0aW9uSWQg cmVtb3ZlWGlkKQotewotCVByb2NBcnJheVN0cnVjdCAqcEFycmF5ID0gcHJvY0FycmF5Owot CWludAkJCWNvdW50ID0gMDsKLQlpbnQJCQloZWFkLAotCQkJCXRhaWwsCi0JCQkJaTsKLQot CWlmICghVHJhbnNhY3Rpb25JZElzVmFsaWQocmVtb3ZlWGlkKSkKLQl7Ci0JCWVsb2coREVC VUc0LCAicmVtb3ZpbmcgYWxsIEtub3duQXNzaWduZWRYaWRzIik7Ci0JCXBBcnJheS0+bnVt S25vd25Bc3NpZ25lZFhpZHMgPSAwOwotCQlwQXJyYXktPmhlYWRLbm93bkFzc2lnbmVkWGlk cyA9IHBBcnJheS0+dGFpbEtub3duQXNzaWduZWRYaWRzID0gMDsKLQkJcmV0dXJuOwotCX0K LQotCWVsb2coREVCVUc0LCAicHJ1bmUgS25vd25Bc3NpZ25lZFhpZHMgdG8gJXUiLCByZW1v dmVYaWQpOwotCi0JLyoKLQkgKiBNYXJrIGVudHJpZXMgaW52YWxpZCBzdGFydGluZyBhdCB0 aGUgdGFpbC4gIFNpbmNlIGFycmF5IGlzIHNvcnRlZCwgd2UKLQkgKiBjYW4gc3RvcCBhcyBz b29uIGFzIHdlIHJlYWNoIGFuIGVudHJ5ID49IHJlbW92ZVhpZC4KLQkgKi8KLQl0YWlsID0g cEFycmF5LT50YWlsS25vd25Bc3NpZ25lZFhpZHM7Ci0JaGVhZCA9IHBBcnJheS0+aGVhZEtu b3duQXNzaWduZWRYaWRzOwotCi0JZm9yIChpID0gdGFpbDsgaSA8IGhlYWQ7IGkrKykKLQl7 Ci0JCWlmIChLbm93bkFzc2lnbmVkWGlkc1ZhbGlkW2ldKQotCQl7Ci0JCQlUcmFuc2FjdGlv bklkIGtub3duWGlkID0gS25vd25Bc3NpZ25lZFhpZHNbaV07Ci0KLQkJCWlmIChUcmFuc2Fj dGlvbklkRm9sbG93c09yRXF1YWxzKGtub3duWGlkLCByZW1vdmVYaWQpKQotCQkJCWJyZWFr OwotCi0JCQlpZiAoIVN0YW5kYnlUcmFuc2FjdGlvbklkSXNQcmVwYXJlZChrbm93blhpZCkp Ci0JCQl7Ci0JCQkJS25vd25Bc3NpZ25lZFhpZHNWYWxpZFtpXSA9IGZhbHNlOwotCQkJCWNv dW50Kys7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwQXJyYXktPm51bUtub3duQXNzaWduZWRYaWRz IC09IGNvdW50OwotCUFzc2VydChwQXJyYXktPm51bUtub3duQXNzaWduZWRYaWRzID49IDAp OwotCi0JLyoKLQkgKiBBZHZhbmNlIHRoZSB0YWlsIHBvaW50ZXIgaWYgd2UndmUgbWFya2Vk IHRoZSB0YWlsIGl0ZW0gaW52YWxpZC4KLQkgKi8KLQlmb3IgKGkgPSB0YWlsOyBpIDwgaGVh ZDsgaSsrKQotCXsKLQkJaWYgKEtub3duQXNzaWduZWRYaWRzVmFsaWRbaV0pCi0JCQlicmVh azsKLQl9Ci0JaWYgKGkgPj0gaGVhZCkKLQl7Ci0JCS8qIEFycmF5IGlzIGVtcHR5LCBzbyB3 ZSBjYW4gcmVzZXQgYm90aCBwb2ludGVycyAqLwotCQlwQXJyYXktPmhlYWRLbm93bkFzc2ln bmVkWGlkcyA9IDA7Ci0JCXBBcnJheS0+dGFpbEtub3duQXNzaWduZWRYaWRzID0gMDsKLQl9 Ci0JZWxzZQotCXsKLQkJcEFycmF5LT50YWlsS25vd25Bc3NpZ25lZFhpZHMgPSBpOwotCX0K LQotCS8qIE9wcG9ydHVuaXN0aWNhbGx5IGNvbXByZXNzIHRoZSBhcnJheSAqLwotCUtub3du QXNzaWduZWRYaWRzQ29tcHJlc3MoS0FYX1BSVU5FLCB0cnVlKTsKLX0KLQotLyoKLSAqIEtu b3duQXNzaWduZWRYaWRzR2V0IC0gR2V0IGFuIGFycmF5IG9mIHhpZHMgYnkgc2Nhbm5pbmcg S25vd25Bc3NpZ25lZFhpZHMuCi0gKiBXZSBmaWx0ZXIgb3V0IGFueXRoaW5nID49IHhtYXgu Ci0gKgotICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIFhJRHMgc3RvcmVkIGludG8geGFycmF5 W10uICBDYWxsZXIgaXMgcmVzcG9uc2libGUKLSAqIHRoYXQgYXJyYXkgaXMgbGFyZ2UgZW5v dWdoLgotICoKLSAqIENhbGxlciBtdXN0IGhvbGQgUHJvY0FycmF5TG9jayBpbiAoYXQgbGVh c3QpIHNoYXJlZCBtb2RlLgotICovCi1zdGF0aWMgaW50Ci1Lbm93bkFzc2lnbmVkWGlkc0dl dChUcmFuc2FjdGlvbklkICp4YXJyYXksIFRyYW5zYWN0aW9uSWQgeG1heCkKLXsKLQlUcmFu c2FjdGlvbklkIHh0bXAgPSBJbnZhbGlkVHJhbnNhY3Rpb25JZDsKLQotCXJldHVybiBLbm93 bkFzc2lnbmVkWGlkc0dldEFuZFNldFhtaW4oeGFycmF5LCAmeHRtcCwgeG1heCk7Ci19Ci0K LS8qCi0gKiBLbm93bkFzc2lnbmVkWGlkc0dldEFuZFNldFhtaW4gLSBhcyBLbm93bkFzc2ln bmVkWGlkc0dldCwgcGx1cwotICogd2UgcmVkdWNlICp4bWluIHRvIHRoZSBsb3dlc3QgeGlk IHZhbHVlIHNlZW4gaWYgbm90IGFscmVhZHkgbG93ZXIuCi0gKgotICogQ2FsbGVyIG11c3Qg aG9sZCBQcm9jQXJyYXlMb2NrIGluIChhdCBsZWFzdCkgc2hhcmVkIG1vZGUuCi0gKi8KLXN0 YXRpYyBpbnQKLUtub3duQXNzaWduZWRYaWRzR2V0QW5kU2V0WG1pbihUcmFuc2FjdGlvbklk ICp4YXJyYXksIFRyYW5zYWN0aW9uSWQgKnhtaW4sCi0JCQkJCQkJICAgVHJhbnNhY3Rpb25J ZCB4bWF4KQotewotCWludAkJCWNvdW50ID0gMDsKLQlpbnQJCQloZWFkLAotCQkJCXRhaWw7 Ci0JaW50CQkJaTsKLQotCS8qCi0JICogRmV0Y2ggaGVhZCBqdXN0IG9uY2UsIHNpbmNlIGl0 IG1heSBjaGFuZ2Ugd2hpbGUgd2UgbG9vcC4gV2UgY2FuIHN0b3AKLQkgKiBvbmNlIHdlIHJl YWNoIHRoZSBpbml0aWFsbHkgc2VlbiBoZWFkLCBzaW5jZSB3ZSBhcmUgY2VydGFpbiB0aGF0 IGFuIHhpZAotCSAqIGNhbm5vdCBlbnRlciBhbmQgdGhlbiBsZWF2ZSB0aGUgYXJyYXkgd2hp bGUgd2UgaG9sZCBQcm9jQXJyYXlMb2NrLiAgV2UKLQkgKiBtaWdodCBtaXNzIG5ld2x5LWFk ZGVkIHhpZHMsIGJ1dCB0aGV5IHNob3VsZCBiZSA+PSB4bWF4IHNvIGlycmVsZXZhbnQKLQkg KiBhbnl3YXkuCi0JICovCi0JdGFpbCA9IHByb2NBcnJheS0+dGFpbEtub3duQXNzaWduZWRY aWRzOwotCWhlYWQgPSBwcm9jQXJyYXktPmhlYWRLbm93bkFzc2lnbmVkWGlkczsKLQotCXBn X3JlYWRfYmFycmllcigpOwkJCS8qIHBhaXJzIHdpdGggS25vd25Bc3NpZ25lZFhpZHNBZGQg Ki8KLQotCWZvciAoaSA9IHRhaWw7IGkgPCBoZWFkOyBpKyspCi0JewotCQkvKiBTa2lwIGFu eSBnYXBzIGluIHRoZSBhcnJheSAqLwotCQlpZiAoS25vd25Bc3NpZ25lZFhpZHNWYWxpZFtp XSkKLQkJewotCQkJVHJhbnNhY3Rpb25JZCBrbm93blhpZCA9IEtub3duQXNzaWduZWRYaWRz W2ldOwotCi0JCQkvKgotCQkJICogVXBkYXRlIHhtaW4gaWYgcmVxdWlyZWQuICBPbmx5IHRo ZSBmaXJzdCBYSUQgbmVlZCBiZSBjaGVja2VkLAotCQkJICogc2luY2UgdGhlIGFycmF5IGlz IHNvcnRlZC4KLQkJCSAqLwotCQkJaWYgKGNvdW50ID09IDAgJiYKLQkJCQlUcmFuc2FjdGlv bklkUHJlY2VkZXMoa25vd25YaWQsICp4bWluKSkKLQkJCQkqeG1pbiA9IGtub3duWGlkOwot Ci0JCQkvKgotCQkJICogRmlsdGVyIG91dCBhbnl0aGluZyA+PSB4bWF4LCBhZ2FpbiByZWx5 aW5nIG9uIHNvcnRlZCBwcm9wZXJ0eQotCQkJICogb2YgYXJyYXkuCi0JCQkgKi8KLQkJCWlm IChUcmFuc2FjdGlvbklkSXNWYWxpZCh4bWF4KSAmJgotCQkJCVRyYW5zYWN0aW9uSWRGb2xs b3dzT3JFcXVhbHMoa25vd25YaWQsIHhtYXgpKQotCQkJCWJyZWFrOwotCi0JCQkvKiBBZGQg a25vd25YaWQgaW50byBvdXRwdXQgYXJyYXkgKi8KLQkJCXhhcnJheVtjb3VudCsrXSA9IGtu b3duWGlkOwotCQl9Ci0JfQotCi0JcmV0dXJuIGNvdW50OwotfQotCi0vKgotICogR2V0IG9s ZGVzdCBYSUQgaW4gdGhlIEtub3duQXNzaWduZWRYaWRzIGFycmF5LCBvciBJbnZhbGlkVHJh bnNhY3Rpb25JZAotICogaWYgbm90aGluZyB0aGVyZS4KLSAqLwotc3RhdGljIFRyYW5zYWN0 aW9uSWQKLUtub3duQXNzaWduZWRYaWRzR2V0T2xkZXN0WG1pbih2b2lkKQotewotCWludAkJ CWhlYWQsCi0JCQkJdGFpbDsKLQlpbnQJCQlpOwotCi0JLyoKLQkgKiBGZXRjaCBoZWFkIGp1 c3Qgb25jZSwgc2luY2UgaXQgbWF5IGNoYW5nZSB3aGlsZSB3ZSBsb29wLgotCSAqLwotCXRh aWwgPSBwcm9jQXJyYXktPnRhaWxLbm93bkFzc2lnbmVkWGlkczsKLQloZWFkID0gcHJvY0Fy cmF5LT5oZWFkS25vd25Bc3NpZ25lZFhpZHM7Ci0KLQlwZ19yZWFkX2JhcnJpZXIoKTsJCQkv KiBwYWlycyB3aXRoIEtub3duQXNzaWduZWRYaWRzQWRkICovCi0KLQlmb3IgKGkgPSB0YWls OyBpIDwgaGVhZDsgaSsrKQotCXsKLQkJLyogU2tpcCBhbnkgZ2FwcyBpbiB0aGUgYXJyYXkg Ki8KLQkJaWYgKEtub3duQXNzaWduZWRYaWRzVmFsaWRbaV0pCi0JCQlyZXR1cm4gS25vd25B c3NpZ25lZFhpZHNbaV07Ci0JfQotCi0JcmV0dXJuIEludmFsaWRUcmFuc2FjdGlvbklkOwot fQotCi0vKgotICogRGlzcGxheSBLbm93bkFzc2lnbmVkWGlkcyB0byBwcm92aWRlIGRlYnVn IHRyYWlsCi0gKgotICogQ3VycmVudGx5IHRoaXMgaXMgb25seSBjYWxsZWQgd2l0aGluIHN0 YXJ0dXAgcHJvY2Vzcywgc28gd2UgbmVlZCBubwotICogc3BlY2lhbCBsb2NraW5nLgotICoK LSAqIE5vdGUgdGhpcyBpcyBwcmV0dHkgZXhwZW5zaXZlLCBhbmQgbXVjaCBvZiB0aGUgZXhw ZW5zZSB3aWxsIGJlIGluY3VycmVkCi0gKiBldmVuIGlmIHRoZSBlbG9nIG1lc3NhZ2Ugd2ls bCBnZXQgZGlzY2FyZGVkLiAgSXQncyBub3QgY3VycmVudGx5IGNhbGxlZAotICogaW4gYW55 IHBlcmZvcm1hbmNlLWNyaXRpY2FsIHBsYWNlcywgaG93ZXZlciwgc28gbm8gbmVlZCB0byBi ZSB0ZW5zZXIuCi0gKi8KLXN0YXRpYyB2b2lkCi1Lbm93bkFzc2lnbmVkWGlkc0Rpc3BsYXko aW50IHRyYWNlX2xldmVsKQotewotCVByb2NBcnJheVN0cnVjdCAqcEFycmF5ID0gcHJvY0Fy cmF5OwotCVN0cmluZ0luZm9EYXRhIGJ1ZjsKLQlpbnQJCQloZWFkLAotCQkJCXRhaWwsCi0J CQkJaTsKLQlpbnQJCQlueGlkcyA9IDA7Ci0KLQl0YWlsID0gcEFycmF5LT50YWlsS25vd25B c3NpZ25lZFhpZHM7Ci0JaGVhZCA9IHBBcnJheS0+aGVhZEtub3duQXNzaWduZWRYaWRzOwot Ci0JaW5pdFN0cmluZ0luZm8oJmJ1Zik7Ci0KLQlmb3IgKGkgPSB0YWlsOyBpIDwgaGVhZDsg aSsrKQotCXsKLQkJaWYgKEtub3duQXNzaWduZWRYaWRzVmFsaWRbaV0pCi0JCXsKLQkJCW54 aWRzKys7Ci0JCQlhcHBlbmRTdHJpbmdJbmZvKCZidWYsICJbJWRdPSV1ICIsIGksIEtub3du QXNzaWduZWRYaWRzW2ldKTsKLQkJfQotCX0KLQotCWVsb2codHJhY2VfbGV2ZWwsICIlZCBL bm93bkFzc2lnbmVkWGlkcyAobnVtPSVkIHRhaWw9JWQgaGVhZD0lZCkgJXMiLAotCQkgbnhp ZHMsCi0JCSBwQXJyYXktPm51bUtub3duQXNzaWduZWRYaWRzLAotCQkgcEFycmF5LT50YWls S25vd25Bc3NpZ25lZFhpZHMsCi0JCSBwQXJyYXktPmhlYWRLbm93bkFzc2lnbmVkWGlkcywK LQkJIGJ1Zi5kYXRhKTsKLQotCXBmcmVlKGJ1Zi5kYXRhKTsKLX0KLQotLyoKLSAqIEtub3du QXNzaWduZWRYaWRzUmVzZXQKLSAqCQlSZXNldHMgS25vd25Bc3NpZ25lZFhpZHMgdG8gYmUg ZW1wdHkKLSAqLwotc3RhdGljIHZvaWQKLUtub3duQXNzaWduZWRYaWRzUmVzZXQodm9pZCkK LXsKLQlQcm9jQXJyYXlTdHJ1Y3QgKnBBcnJheSA9IHByb2NBcnJheTsKLQotCUxXTG9ja0Fj cXVpcmUoUHJvY0FycmF5TG9jaywgTFdfRVhDTFVTSVZFKTsKKwlBc3NlcnQobHNuID4gVHJh bnNhbVZhcmlhYmxlcy0+bGF0ZXN0Q29tbWl0TFNOKTsKKwlUcmFuc2FtVmFyaWFibGVzLT5s YXRlc3RDb21taXRMU04gPSBsc247CiAKLQlwQXJyYXktPm51bUtub3duQXNzaWduZWRYaWRz ID0gMDsKLQlwQXJyYXktPnRhaWxLbm93bkFzc2lnbmVkWGlkcyA9IDA7Ci0JcEFycmF5LT5o ZWFkS25vd25Bc3NpZ25lZFhpZHMgPSAwOworCXByb2NBcnJheS0+b2xkZXN0X3J1bm5pbmdf cHJpbWFyeV94aWQgPSBvbGRlc3RfcnVubmluZ19wcmltYXJ5X3hpZDsKIAogCUxXTG9ja1Jl bGVhc2UoUHJvY0FycmF5TG9jayk7CiB9CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9zdG9y YWdlL2lwYy9zdGFuZGJ5LmMgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2lwYy9zdGFuZGJ5LmMK aW5kZXggODdiMDRlNTFiMzYuLjA3OGVkNTNhY2RhIDEwMDY0NAotLS0gYS9zcmMvYmFja2Vu ZC9zdG9yYWdlL2lwYy9zdGFuZGJ5LmMKKysrIGIvc3JjL2JhY2tlbmQvc3RvcmFnZS9pcGMv c3RhbmRieS5jCkBAIC0xMzksOCArMTM5LDYgQEAgSW5pdFJlY292ZXJ5VHJhbnNhY3Rpb25F bnZpcm9ubWVudCh2b2lkKQogCXZ4aWQucHJvY051bWJlciA9IE15UHJvY051bWJlcjsKIAl2 eGlkLmxvY2FsVHJhbnNhY3Rpb25JZCA9IEdldE5leHRMb2NhbFRyYW5zYWN0aW9uSWQoKTsK IAlWaXJ0dWFsWGFjdExvY2tUYWJsZUluc2VydCh2eGlkKTsKLQotCXN0YW5kYnlTdGF0ZSA9 IFNUQU5EQllfSU5JVElBTElaRUQ7CiB9CiAKIC8qCkBAIC0xNjgsOSArMTY2LDYgQEAgU2h1 dGRvd25SZWNvdmVyeVRyYW5zYWN0aW9uRW52aXJvbm1lbnQodm9pZCkKIAlpZiAoUmVjb3Zl cnlMb2NrSGFzaCA9PSBOVUxMKQogCQlyZXR1cm47CiAKLQkvKiBNYXJrIGFsbCB0cmFja2Vk IGluLXByb2dyZXNzIHRyYW5zYWN0aW9ucyBhcyBmaW5pc2hlZC4gKi8KLQlFeHBpcmVBbGxL bm93bkFzc2lnbmVkVHJhbnNhY3Rpb25JZHMoKTsKLQogCS8qIFJlbGVhc2UgYWxsIGxvY2tz IHRoZSB0cmFja2VkIHRyYW5zYWN0aW9ucyB3ZXJlIGhvbGRpbmcgKi8KIAlTdGFuZGJ5UmVs ZWFzZUFsbExvY2tzKCk7CiAKQEAgLTQ4Nyw2ICs0ODIsMTkgQEAgUmVzb2x2ZVJlY292ZXJ5 Q29uZmxpY3RXaXRoU25hcHNob3QoVHJhbnNhY3Rpb25JZCBzbmFwc2hvdENvbmZsaWN0SG9y aXpvbiwKIAlBc3NlcnQoVHJhbnNhY3Rpb25JZElzTm9ybWFsKHNuYXBzaG90Q29uZmxpY3RI b3Jpem9uKSk7CiAJYmFja2VuZHMgPSBHZXRDb25mbGljdGluZ1ZpcnR1YWxYSURzKHNuYXBz aG90Q29uZmxpY3RIb3Jpem9uLAogCQkJCQkJCQkJCSBsb2NhdG9yLmRiT2lkKTsKKwl7CisJ CVN0cmluZ0luZm9EYXRhIGJ1ZjsKKwkJVmlydHVhbFRyYW5zYWN0aW9uSWQgKnZ4aWQ7CisK KwkJaW5pdFN0cmluZ0luZm8oJmJ1Zik7CisJCWZvciAodnhpZCA9IGJhY2tlbmRzOyB2eGlk LT5wcm9jTnVtYmVyICE9IElOVkFMSURfUFJPQ19OVU1CRVI7IHZ4aWQrKykKKwkJeworCQkJ YXBwZW5kU3RyaW5nSW5mbygmYnVmLCAiICVkIiwgR2V0UEdQcm9jQnlOdW1iZXIodnhpZC0+ cHJvY051bWJlciktPnBpZCk7CisJCX0KKworCQllbG9nKExPRywgIlJlc29sdmVSZWNvdmVy eUNvbmZsaWN0V2l0aFNuYXBzaG90IGNhbGxlZCBmb3IgeGlkICV1IGlzQ2F0YWxvZ1JlbCAl ZCwgY29uZmxpY3RzIHdpdGg6IFslcyBdIiwKKwkJIHNuYXBzaG90Q29uZmxpY3RIb3Jpem9u LCBpc0NhdGFsb2dSZWwsIGJ1Zi5kYXRhKTsKKwl9CiAJUmVzb2x2ZVJlY292ZXJ5Q29uZmxp Y3RXaXRoVmlydHVhbFhJRHMoYmFja2VuZHMsCiAJCQkJCQkJCQkJICAgUFJPQ1NJR19SRUNP VkVSWV9DT05GTElDVF9TTkFQU0hPVCwKIAkJCQkJCQkJCQkgICBXQUlUX0VWRU5UX1JFQ09W RVJZX0NPTkZMSUNUX1NOQVBTSE9ULApAQCAtMTE2NCw3ICsxMTcyLDcgQEAgc3RhbmRieV9y ZWRvKFhMb2dSZWFkZXJTdGF0ZSAqcmVjb3JkKQogCUFzc2VydCghWExvZ1JlY0hhc0FueUJs b2NrUmVmcyhyZWNvcmQpKTsKIAogCS8qIERvIG5vdGhpbmcgaWYgd2UncmUgbm90IGluIGhv dCBzdGFuZGJ5IG1vZGUgKi8KLQlpZiAoc3RhbmRieVN0YXRlID09IFNUQU5EQllfRElTQUJM RUQpCisJaWYgKCFJbkhvdFN0YW5kYnkpCiAJCXJldHVybjsKIAogCWlmIChpbmZvID09IFhM T0dfU1RBTkRCWV9MT0NLKQpAQCAtMTE3OSwxOCArMTE4NywxNiBAQCBzdGFuZGJ5X3JlZG8o WExvZ1JlYWRlclN0YXRlICpyZWNvcmQpCiAJfQogCWVsc2UgaWYgKGluZm8gPT0gWExPR19S VU5OSU5HX1hBQ1RTKQogCXsKKwkJLyoKKwkJICogWFhYOiBydW5uaW5nIHhhY3RzIHJlY29y ZHMgd2VyZSBwcmV2aW91c2x5IHVzZWQgdG8gdXBkYXRlCisJCSAqIGtub3duLWFzc2lnbmVk IHhpZHMsIGJ1dCBub3cgd2Ugb25seSBuZWVkIGl0IGZvciB0aGUgbG9naWNhbAorCQkgKiBy ZXBsaWNhdGlvbiBzbmFwYnVpbGRlciBzdHVmZi4gQW5kIGZvciB0aGUKKwkJICogcGdfc3Rh dF9yZXBvcnRfc3RhdCh0cnVlKSBjYWxsIGJlbG93LgorCQkgKi8KIAkJeGxfcnVubmluZ194 YWN0cyAqeGxyZWMgPSAoeGxfcnVubmluZ194YWN0cyAqKSBYTG9nUmVjR2V0RGF0YShyZWNv cmQpOwotCQlSdW5uaW5nVHJhbnNhY3Rpb25zRGF0YSBydW5uaW5nOwotCi0JCXJ1bm5pbmcu eGNudCA9IHhscmVjLT54Y250OwotCQlydW5uaW5nLnN1YnhjbnQgPSB4bHJlYy0+c3VieGNu dDsKLQkJcnVubmluZy5zdWJ4aWRfb3ZlcmZsb3cgPSB4bHJlYy0+c3VieGlkX292ZXJmbG93 OwotCQlydW5uaW5nLm5leHRYaWQgPSB4bHJlYy0+bmV4dFhpZDsKLQkJcnVubmluZy5sYXRl c3RDb21wbGV0ZWRYaWQgPSB4bHJlYy0+bGF0ZXN0Q29tcGxldGVkWGlkOwotCQlydW5uaW5n Lm9sZGVzdFJ1bm5pbmdYaWQgPSB4bHJlYy0+b2xkZXN0UnVubmluZ1hpZDsKLQkJcnVubmlu Zy54aWRzID0geGxyZWMtPnhpZHM7CiAKLQkJUHJvY0FycmF5QXBwbHlSZWNvdmVyeUluZm8o JnJ1bm5pbmcpOworCQkvKiBub3Qgc3RyaWN0bHkgcmVxdWlyZWQsIGJ1dCB1cGRhdGUgb2xk ZXN0UnVubmluZ1hpZCBiZWNhdXNlIHdlIGNhbiAqLworCQlQcm9jQXJyYXlVcGRhdGVPbGRl c3RSdW5uaW5nWGlkKHhscmVjLT5vbGRlc3RSdW5uaW5nWGlkKTsKIAogCQkvKgogCQkgKiBU aGUgc3RhcnR1cCBwcm9jZXNzIGN1cnJlbnRseSBoYXMgbm8gY29udmVuaWVudCB3YXkgdG8g c2NoZWR1bGUKQEAgLTEyODAsNiArMTI4NiwxMCBAQCBzdGFuZGJ5X3JlZG8oWExvZ1JlYWRl clN0YXRlICpyZWNvcmQpCiAgKgogICoKICAqIFJldHVybnMgdGhlIFJlY1B0ciBvZiB0aGUg bGFzdCBpbnNlcnRlZCByZWNvcmQuCisgKgorICogWFhYOiBXZSBvbmx5IG5lZWQgdG8gdGhl IHJ1bm5pbmcteGFjdHMgcmVjb3JkIGZvciBsb2dpY2FsIHJlcGxpY2F0aW9uCisgKiBzbmFw c2hvdCBidWlsZGVyIHN0dWZmIG5vdy4gSWYgd2Ugc3RvcCBlbWl0dGluZyBpdCBoZXJlLCB3 aWxsIHRoZSBjYWxsZXJzCisgKiBiZSBoYXBweSBpZiB3ZSByZXR1cm4gSW52YWxpZFhMb2dS ZWNQdHI/CiAgKi8KIFhMb2dSZWNQdHIKIExvZ1N0YW5kYnlTbmFwc2hvdCh2b2lkKQpkaWZm IC0tZ2l0IGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9sbWdyL2x3bG9jay5jIGIvc3JjL2JhY2tl bmQvc3RvcmFnZS9sbWdyL2x3bG9jay5jCmluZGV4IGIxZTM4OGRjN2M5Li5kM2RlNmJhYmU2 NyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9sbWdyL2x3bG9jay5jCisrKyBi L3NyYy9iYWNrZW5kL3N0b3JhZ2UvbG1nci9sd2xvY2suYwpAQCAtMTMzLDYgKzEzMyw3IEBA IHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBCdWlsdGluVHJhbmNoZU5hbWVzW10gPSB7CiAJ W0xXVFJBTkNIRV9YQUNUX0JVRkZFUl0gPSAiWGFjdEJ1ZmZlciIsCiAJW0xXVFJBTkNIRV9D T01NSVRUU19CVUZGRVJdID0gIkNvbW1pdFRzQnVmZmVyIiwKIAlbTFdUUkFOQ0hFX1NVQlRS QU5TX0JVRkZFUl0gPSAiU3VidHJhbnNCdWZmZXIiLAorCVtMV1RSQU5DSEVfQ1NOX0xPR19C VUZGRVJdID0gIkNzbkxvZ0J1ZmZlciIsCiAJW0xXVFJBTkNIRV9NVUxUSVhBQ1RPRkZTRVRf QlVGRkVSXSA9ICJNdWx0aVhhY3RPZmZzZXRCdWZmZXIiLAogCVtMV1RSQU5DSEVfTVVMVElY QUNUTUVNQkVSX0JVRkZFUl0gPSAiTXVsdGlYYWN0TWVtYmVyQnVmZmVyIiwKIAlbTFdUUkFO Q0hFX05PVElGWV9CVUZGRVJdID0gIk5vdGlmeUJ1ZmZlciIsCkBAIC0xNjksNiArMTcwLDcg QEAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IEJ1aWx0aW5UcmFuY2hlTmFtZXNbXSA9IHsK IAlbTFdUUkFOQ0hFX1NVQlRSQU5TX1NMUlVdID0gIlN1YnRyYW5zU0xSVSIsCiAJW0xXVFJB TkNIRV9YQUNUX1NMUlVdID0gIlhhY3RTTFJVIiwKIAlbTFdUUkFOQ0hFX1BBUkFMTEVMX1ZB Q1VVTV9EU0FdID0gIlBhcmFsbGVsVmFjdXVtRFNBIiwKKwlbTFdUUkFOQ0hFX0NTTl9MT0df U0xSVV0gPSAiQ3NuTG9nU0xSVSIsCiB9OwogCiBTdGF0aWNBc3NlcnREZWNsKGxlbmd0aG9m KEJ1aWx0aW5UcmFuY2hlTmFtZXMpID09CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGls cy9hY3Rpdml0eS93YWl0X2V2ZW50X25hbWVzLnR4dCBiL3NyYy9iYWNrZW5kL3V0aWxzL2Fj dGl2aXR5L3dhaXRfZXZlbnRfbmFtZXMudHh0CmluZGV4IDBkMjg4ZDZiM2Q4Li41ODIyYWY0 MWVhYSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvYWN0aXZpdHkvd2FpdF9ldmVu dF9uYW1lcy50eHQKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWN0aXZpdHkvd2FpdF9ldmVu dF9uYW1lcy50eHQKQEAgLTM0Miw2ICszNDIsNyBAQCBTZXJpYWxDb250cm9sCSJXYWl0aW5n IHRvIHJlYWQgb3IgdXBkYXRlIHNoYXJlZCA8ZmlsZW5hbWU+cGdfc2VyaWFsPC9maWxlbmFt ZT4gcwogWGFjdEJ1ZmZlcgkiV2FpdGluZyBmb3IgSS9PIG9uIGEgdHJhbnNhY3Rpb24gc3Rh dHVzIFNMUlUgYnVmZmVyLiIKIENvbW1pdFRzQnVmZmVyCSJXYWl0aW5nIGZvciBJL08gb24g YSBjb21taXQgdGltZXN0YW1wIFNMUlUgYnVmZmVyLiIKIFN1YnRyYW5zQnVmZmVyCSJXYWl0 aW5nIGZvciBJL08gb24gYSBzdWItdHJhbnNhY3Rpb24gU0xSVSBidWZmZXIuIgorQ3NubG9n QnVmZmVyCSJXYWl0aW5nIGZvciBJL08gb24gYSBzdWItdHJhbnNhY3Rpb24gU0xSVSBidWZm ZXIuIgogTXVsdGlYYWN0T2Zmc2V0QnVmZmVyCSJXYWl0aW5nIGZvciBJL08gb24gYSBtdWx0 aXhhY3Qgb2Zmc2V0IFNMUlUgYnVmZmVyLiIKIE11bHRpWGFjdE1lbWJlckJ1ZmZlcgkiV2Fp dGluZyBmb3IgSS9PIG9uIGEgbXVsdGl4YWN0IG1lbWJlciBTTFJVIGJ1ZmZlci4iCiBOb3Rp ZnlCdWZmZXIJIldhaXRpbmcgZm9yIEkvTyBvbiBhIDxjb21tYW5kPk5PVElGWTwvY29tbWFu ZD4gbWVzc2FnZSBTTFJVIGJ1ZmZlci4iCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGls cy9wcm9iZXMuZCBiL3NyYy9iYWNrZW5kL3V0aWxzL3Byb2Jlcy5kCmluZGV4IGQ3NzI1NDQz Nzc0Li5mZmJmYWU4NGI4MCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvcHJvYmVz LmQKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvcHJvYmVzLmQKQEAgLTc3LDYgKzc3LDggQEAg cHJvdmlkZXIgcG9zdGdyZXNxbCB7CiAJcHJvYmUgY2xvZ19fY2hlY2twb2ludF9fZG9uZShi b29sKTsKIAlwcm9iZSBzdWJ0cmFuc19fY2hlY2twb2ludF9fc3RhcnQoYm9vbCk7CiAJcHJv YmUgc3VidHJhbnNfX2NoZWNrcG9pbnRfX2RvbmUoYm9vbCk7CisJcHJvYmUgY3NubG9nX19j aGVja3BvaW50X19zdGFydChib29sKTsKKwlwcm9iZSBjc25sb2dfX2NoZWNrcG9pbnRfX2Rv bmUoYm9vbCk7CiAJcHJvYmUgbXVsdGl4YWN0X19jaGVja3BvaW50X19zdGFydChib29sKTsK IAlwcm9iZSBtdWx0aXhhY3RfX2NoZWNrcG9pbnRfX2RvbmUoYm9vbCk7CiAJcHJvYmUgdHdv cGhhc2VfX2NoZWNrcG9pbnRfX3N0YXJ0KCk7CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91 dGlscy90aW1lL3NuYXBtZ3IuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL3RpbWUvc25hcG1nci5j CmluZGV4IDdkMmIzNGQ0ZjIwLi4zNTg2NjViNmRkOSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tl bmQvdXRpbHMvdGltZS9zbmFwbWdyLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvdGltZS9z bmFwbWdyLmMKQEAgLTQ4LDYgKzQ4LDcgQEAKICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2lu Y2x1ZGUgPHVuaXN0ZC5oPgogCisjaW5jbHVkZSAiYWNjZXNzL2Nzbl9sb2cuaCIKICNpbmNs dWRlICJhY2Nlc3Mvc3VidHJhbnMuaCIKICNpbmNsdWRlICJhY2Nlc3MvdHJhbnNhbS5oIgog I2luY2x1ZGUgImFjY2Vzcy94YWN0LmgiCkBAIC0yMDEsNiArMjAyLDcgQEAgdHlwZWRlZiBz dHJ1Y3QgU2VyaWFsaXplZFNuYXBzaG90RGF0YQogCUNvbW1hbmRJZAljdXJjaWQ7CiAJVGlt ZXN0YW1wVHogd2hlblRha2VuOwogCVhMb2dSZWNQdHIJbHNuOworCVhMb2dSZWNQdHIJc25h cHNob3RDc247CiB9IFNlcmlhbGl6ZWRTbmFwc2hvdERhdGE7CiAKIC8qCkBAIC0xNzI5LDYg KzE3MzEsNyBAQCBTZXJpYWxpemVTbmFwc2hvdChTbmFwc2hvdCBzbmFwc2hvdCwgY2hhciAq c3RhcnRfYWRkcmVzcykKIAlzZXJpYWxpemVkX3NuYXBzaG90LmN1cmNpZCA9IHNuYXBzaG90 LT5jdXJjaWQ7CiAJc2VyaWFsaXplZF9zbmFwc2hvdC53aGVuVGFrZW4gPSBzbmFwc2hvdC0+ d2hlblRha2VuOwogCXNlcmlhbGl6ZWRfc25hcHNob3QubHNuID0gc25hcHNob3QtPmxzbjsK KwlzZXJpYWxpemVkX3NuYXBzaG90LnNuYXBzaG90Q3NuID0gc25hcHNob3QtPnNuYXBzaG90 Q3NuOwogCiAJLyoKIAkgKiBJZ25vcmUgdGhlIFN1YlhJRCBhcnJheSBpZiBpdCBoYXMgb3Zl cmZsb3dlZCwgdW5sZXNzIHRoZSBzbmFwc2hvdCB3YXMKQEAgLTE4MDMsNiArMTgwNiw3IEBA IFJlc3RvcmVTbmFwc2hvdChjaGFyICpzdGFydF9hZGRyZXNzKQogCXNuYXBzaG90LT5jdXJj aWQgPSBzZXJpYWxpemVkX3NuYXBzaG90LmN1cmNpZDsKIAlzbmFwc2hvdC0+d2hlblRha2Vu ID0gc2VyaWFsaXplZF9zbmFwc2hvdC53aGVuVGFrZW47CiAJc25hcHNob3QtPmxzbiA9IHNl cmlhbGl6ZWRfc25hcHNob3QubHNuOworCXNuYXBzaG90LT5zbmFwc2hvdENzbiA9IHNlcmlh bGl6ZWRfc25hcHNob3Quc25hcHNob3RDc247CiAJc25hcHNob3QtPnNuYXBYYWN0Q29tcGxl dGlvbkNvdW50ID0gMDsKIAogCS8qIENvcHkgWElEcywgaWYgcHJlc2VudC4gKi8KQEAgLTE5 MTMsMzYgKzE5MTcsMTEgQEAgWGlkSW5NVkNDU25hcHNob3QoVHJhbnNhY3Rpb25JZCB4aWQs IFNuYXBzaG90IHNuYXBzaG90KQogCX0KIAllbHNlCiAJewotCQkvKgotCQkgKiBJbiByZWNv dmVyeSB3ZSBzdG9yZSBhbGwgeGlkcyBpbiB0aGUgc3VieGlwIGFycmF5IGJlY2F1c2UgaXQg aXMgYnkKLQkJICogZmFyIHRoZSBiaWdnZXIgYXJyYXksIGFuZCB3ZSBtb3N0bHkgZG9uJ3Qg a25vdyB3aGljaCB4aWRzIGFyZQotCQkgKiB0b3AtbGV2ZWwgYW5kIHdoaWNoIGFyZSBzdWJ4 YWN0cy4gVGhlIHhpcCBhcnJheSBpcyBlbXB0eS4KLQkJICoKLQkJICogV2Ugc3RhcnQgYnkg c2VhcmNoaW5nIHN1YnRyYW5zLCBpZiB3ZSBvdmVyZmxvd2VkLgotCQkgKi8KLQkJaWYgKHNu YXBzaG90LT5zdWJvdmVyZmxvd2VkKQotCQl7Ci0JCQkvKgotCQkJICogU25hcHNob3Qgb3Zl cmZsb3dlZCwgc28gY29udmVydCB4aWQgdG8gdG9wLWxldmVsLiAgVGhpcyBpcyBzYWZlCi0J CQkgKiBiZWNhdXNlIHdlIGVsaW1pbmF0ZWQgdG9vLW9sZCBYSURzIGFib3ZlLgotCQkJICov Ci0JCQl4aWQgPSBTdWJUcmFuc0dldFRvcG1vc3RUcmFuc2FjdGlvbih4aWQpOworCQlYTG9n UmVjUHRyIGNzbiA9IENTTkxvZ0dldENTTkJ5WGlkKHhpZCk7CiAKLQkJCS8qCi0JCQkgKiBJ ZiB4aWQgd2FzIGluZGVlZCBhIHN1YnhhY3QsIHdlIG1pZ2h0IG5vdyBoYXZlIGFuIHhpZCA8 IHhtaW4sCi0JCQkgKiBzbyByZWNoZWNrIHRvIGF2b2lkIGFuIGFycmF5IHNjYW4uICBObyBw b2ludCBpbiByZWNoZWNraW5nCi0JCQkgKiB4bWF4LgotCQkJICovCi0JCQlpZiAoVHJhbnNh Y3Rpb25JZFByZWNlZGVzKHhpZCwgc25hcHNob3QtPnhtaW4pKQotCQkJCXJldHVybiBmYWxz ZTsKLQkJfQotCi0JCS8qCi0JCSAqIFdlIG5vdyBoYXZlIGVpdGhlciBhIHRvcC1sZXZlbCB4 aWQgaGlnaGVyIHRoYW4geG1pbiBvciBhbgotCQkgKiBpbmRldGVybWluYXRlIHhpZC4gV2Ug ZG9uJ3Qga25vdyB3aGV0aGVyIGl0J3MgdG9wIGxldmVsIG9yIHN1YnhhY3QKLQkJICogYnV0 IGl0IGRvZXNuJ3QgbWF0dGVyLiBJZiBpdCdzIHByZXNlbnQsIHRoZSB4aWQgaXMgdmlzaWJs ZS4KLQkJICovCi0JCWlmIChwZ19sZmluZDMyKHhpZCwgc25hcHNob3QtPnN1YnhpcCwgc25h cHNob3QtPnN1YnhjbnQpKQorCQlpZiAoY3NuICE9IEludmFsaWRYTG9nUmVjUHRyICYmIGNz biA8PSBzbmFwc2hvdC0+c25hcHNob3RDc24pCisJCQlyZXR1cm4gZmFsc2U7CisJCWVsc2UK IAkJCXJldHVybiB0cnVlOwogCX0KIApkaWZmIC0tZ2l0IGEvc3JjL2Jpbi9pbml0ZGIvaW5p dGRiLmMgYi9zcmMvYmluL2luaXRkYi9pbml0ZGIuYwppbmRleCAzMGUxN2JkMWQxZS4uMGM2 MmQ5NzkxZGEgMTAwNjQ0Ci0tLSBhL3NyYy9iaW4vaW5pdGRiL2luaXRkYi5jCisrKyBiL3Ny Yy9iaW4vaW5pdGRiL2luaXRkYi5jCkBAIC0yNDksNyArMjQ5LDggQEAgc3RhdGljIGNvbnN0 IGNoYXIgKmNvbnN0IHN1YmRpcnNbXSA9IHsKIAkicGdfeGFjdCIsCiAJInBnX2xvZ2ljYWwi LAogCSJwZ19sb2dpY2FsL3NuYXBzaG90cyIsCi0JInBnX2xvZ2ljYWwvbWFwcGluZ3MiCisJ InBnX2xvZ2ljYWwvbWFwcGluZ3MiLAorCSJwZ19jc24iCiB9OwogCiAKZGlmZiAtLWdpdCBh L3NyYy9pbmNsdWRlL2FjY2Vzcy9jc25fbG9nLmggYi9zcmMvaW5jbHVkZS9hY2Nlc3MvY3Nu X2xvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi45NTkxM2U2 M2M5MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9pbmNsdWRlL2FjY2Vzcy9jc25fbG9nLmgK QEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIGNzbl9sb2cuaAorICoKKyAqIENvbW1pdC1TZXF1 ZW5jZS1OdW1iZXIgbG9nLgorICoKKyAqIFBvcnRpb25zIENvcHlyaWdodCAoYykgMTk5Ni0y MDE0LCBQb3N0Z3JlU1FMIEdsb2JhbCBEZXZlbG9wbWVudCBHcm91cAorICogUG9ydGlvbnMg Q29weXJpZ2h0IChjKSAxOTk0LCBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlm b3JuaWEKKyAqCisgKiBzcmMvaW5jbHVkZS9hY2Nlc3MvY3NuX2xvZy5oCisgKi8KKyNpZm5k ZWYgQ1NOTE9HX0gKKyNkZWZpbmUgQ1NOTE9HX0gKKworI2luY2x1ZGUgImFjY2Vzcy94bG9n LmgiCisjaW5jbHVkZSAidXRpbHMvc25hcHNob3QuaCIKKworZXh0ZXJuIHZvaWQgQ1NOTG9n U2V0Q1NOKFRyYW5zYWN0aW9uSWQgeGlkLCBpbnQgbnN1YnhpZHMsCisJCQkJCQkJICAgVHJh bnNhY3Rpb25JZCAqc3VieGlkcywgWExvZ1JlY1B0ciBjc24pOworZXh0ZXJuIFhMb2dSZWNQ dHIgQ1NOTG9nR2V0Q1NOQnlYaWQoVHJhbnNhY3Rpb25JZCB4aWQpOworCitleHRlcm4gU2l6 ZSBDU05Mb2dTaG1lbVNpemUodm9pZCk7CitleHRlcm4gdm9pZCBDU05Mb2dTaG1lbUluaXQo dm9pZCk7CitleHRlcm4gdm9pZCBCb290U3RyYXBDU05Mb2codm9pZCk7CitleHRlcm4gdm9p ZCBTdGFydHVwQ1NOTG9nKFRyYW5zYWN0aW9uSWQgb2xkZXN0QWN0aXZlWElELCBYTG9nUmVj UHRyIGNzbik7CitleHRlcm4gdm9pZCBTaHV0ZG93bkNTTkxvZyh2b2lkKTsKK2V4dGVybiB2 b2lkIENoZWNrUG9pbnRDU05Mb2codm9pZCk7CitleHRlcm4gdm9pZCBFeHRlbmRDU05Mb2co VHJhbnNhY3Rpb25JZCBuZXdlc3RYYWN0KTsKK2V4dGVybiB2b2lkIFRydW5jYXRlQ1NOTG9n KFRyYW5zYWN0aW9uSWQgb2xkZXN0WGFjdCk7CisKKyNlbmRpZiAgIC8qIENTTkxPR19IICov CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9hY2Nlc3MvdHJhbnNhbS5oIGIvc3JjL2luY2x1 ZGUvYWNjZXNzL3RyYW5zYW0uaAppbmRleCAyOGEyZDI4N2ZkNS4uZDIxNmVkMTgyODIgMTAw NjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2FjY2Vzcy90cmFuc2FtLmgKKysrIGIvc3JjL2luY2x1 ZGUvYWNjZXNzL3RyYW5zYW0uaApAQCAtMjM4LDYgKzIzOCw5IEBAIHR5cGVkZWYgc3RydWN0 IFRyYW5zYW1WYXJpYWJsZXNEYXRhCiAJRnVsbFRyYW5zYWN0aW9uSWQgbGF0ZXN0Q29tcGxl dGVkWGlkOwkvKiBuZXdlc3QgZnVsbCBYSUQgdGhhdCBoYXMKIAkJCQkJCQkJCQkJICogY29t bWl0dGVkIG9yIGFib3J0ZWQgKi8KIAorCS8qIER1cmluZyByZWNvdmVyeSwgTFNOIG9mIGxh dGVzdCByZXBsYXllZCBjb21taXQgcmVjb3JkICovCisJWExvZ1JlY1B0ciBsYXRlc3RDb21t aXRMU047CisKIAkvKgogCSAqIE51bWJlciBvZiB0b3AtbGV2ZWwgdHJhbnNhY3Rpb25zIHdp dGggeGlkcyAoaS5lLiB3aGljaCBtYXkgaGF2ZQogCSAqIG1vZGlmaWVkIHRoZSBkYXRhYmFz ZSkgdGhhdCBjb21wbGV0ZWQgaW4gc29tZSBmb3JtIHNpbmNlIHRoZSBzdGFydCBvZgpkaWZm IC0tZ2l0IGEvc3JjL2luY2x1ZGUvYWNjZXNzL3R3b3BoYXNlLmggYi9zcmMvaW5jbHVkZS9h Y2Nlc3MvdHdvcGhhc2UuaAppbmRleCA1NjI0OGMwMDA2My4uNDRmN2Q2ZmU5NjUgMTAwNjQ0 Ci0tLSBhL3NyYy9pbmNsdWRlL2FjY2Vzcy90d29waGFzZS5oCisrKyBiL3NyYy9pbmNsdWRl L2FjY2Vzcy90d29waGFzZS5oCkBAIC00Nyw4ICs0Nyw3IEBAIGV4dGVybiB2b2lkIFN0YXJ0 UHJlcGFyZShHbG9iYWxUcmFuc2FjdGlvbiBneGFjdCk7CiBleHRlcm4gdm9pZCBFbmRQcmVw YXJlKEdsb2JhbFRyYW5zYWN0aW9uIGd4YWN0KTsKIGV4dGVybiBib29sIFN0YW5kYnlUcmFu c2FjdGlvbklkSXNQcmVwYXJlZChUcmFuc2FjdGlvbklkIHhpZCk7CiAKLWV4dGVybiBUcmFu c2FjdGlvbklkIFByZXNjYW5QcmVwYXJlZFRyYW5zYWN0aW9ucyhUcmFuc2FjdGlvbklkICoq eGlkc19wLAotCQkJCQkJCQkJCQkJIGludCAqbnhpZHNfcCk7CitleHRlcm4gVHJhbnNhY3Rp b25JZCBQcmVzY2FuUHJlcGFyZWRUcmFuc2FjdGlvbnModm9pZCk7CiBleHRlcm4gdm9pZCBT dGFuZGJ5UmVjb3ZlclByZXBhcmVkVHJhbnNhY3Rpb25zKHZvaWQpOwogZXh0ZXJuIHZvaWQg UmVjb3ZlclByZXBhcmVkVHJhbnNhY3Rpb25zKHZvaWQpOwogCmRpZmYgLS1naXQgYS9zcmMv aW5jbHVkZS9hY2Nlc3MveGFjdC5oIGIvc3JjL2luY2x1ZGUvYWNjZXNzL3hhY3QuaAppbmRl eCA2ZDQ0MzlmMDUyNC4uZGYwYWY1ZWEyMDkgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2Fj Y2Vzcy94YWN0LmgKKysrIGIvc3JjL2luY2x1ZGUvYWNjZXNzL3hhY3QuaApAQCAtMTcxLDcg KzE3MSw3IEBAIHR5cGVkZWYgc3RydWN0IFNhdmVkVHJhbnNhY3Rpb25DaGFyYWN0ZXJpc3Rp Y3MKICNkZWZpbmUgWExPR19YQUNUX0FCT1JUCQkJCTB4MjAKICNkZWZpbmUgWExPR19YQUNU X0NPTU1JVF9QUkVQQVJFRAkweDMwCiAjZGVmaW5lIFhMT0dfWEFDVF9BQk9SVF9QUkVQQVJF RAkweDQwCi0jZGVmaW5lIFhMT0dfWEFDVF9BU1NJR05NRU5UCQkweDUwCisvKiAweDUwIGlz IHVudXNlZCwgd2FzIFhMT0dfWEFDVF9BU1NJR05NRU5UICovCiAjZGVmaW5lIFhMT0dfWEFD VF9JTlZBTElEQVRJT05TCQkweDYwCiAvKiBmcmVlIG9wY29kZSAweDcwICovCiAKQEAgLTIx NSwxNSArMjE1LDYgQEAgdHlwZWRlZiBzdHJ1Y3QgU2F2ZWRUcmFuc2FjdGlvbkNoYXJhY3Rl cmlzdGljcwogI2RlZmluZSBYYWN0Q29tcGxldGlvbkZvcmNlU3luY0NvbW1pdCh4aW5mbykg XAogCSgoeGluZm8gJiBYQUNUX0NPTVBMRVRJT05fRk9SQ0VfU1lOQ19DT01NSVQpICE9IDAp CiAKLXR5cGVkZWYgc3RydWN0IHhsX3hhY3RfYXNzaWdubWVudAotewotCVRyYW5zYWN0aW9u SWQgeHRvcDsJCQkvKiBhc3NpZ25lZCBYSUQncyB0b3AtbGV2ZWwgWElEICovCi0JaW50CQkJ bnN1YnhhY3RzOwkJLyogbnVtYmVyIG9mIHN1YnRyYW5zYWN0aW9uIFhJRHMgKi8KLQlUcmFu c2FjdGlvbklkIHhzdWJbRkxFWElCTEVfQVJSQVlfTUVNQkVSXTsJLyogYXNzaWduZWQgc3Vi eGlkcyAqLwotfSB4bF94YWN0X2Fzc2lnbm1lbnQ7Ci0KLSNkZWZpbmUgTWluU2l6ZU9mWGFj dEFzc2lnbm1lbnQgb2Zmc2V0b2YoeGxfeGFjdF9hc3NpZ25tZW50LCB4c3ViKQotCiAvKgog ICogQ29tbWl0IGFuZCBhYm9ydCByZWNvcmRzIGNhbiBjb250YWluIGEgbG90IG9mIGluZm9y bWF0aW9uLiBCdXQgYSBsYXJnZQogICogcG9ydGlvbiBvZiB0aGUgcmVjb3JkcyB3b24ndCBu ZWVkIGFsbCBwb3NzaWJsZSBwaWVjZXMgb2YgaW5mb3JtYXRpb24uIFNvIHdlCkBAIC00NDIs NyArNDMzLDYgQEAgZXh0ZXJuIEZ1bGxUcmFuc2FjdGlvbklkIEdldFRvcEZ1bGxUcmFuc2Fj dGlvbklkKHZvaWQpOwogZXh0ZXJuIEZ1bGxUcmFuc2FjdGlvbklkIEdldFRvcEZ1bGxUcmFu c2FjdGlvbklkSWZBbnkodm9pZCk7CiBleHRlcm4gRnVsbFRyYW5zYWN0aW9uSWQgR2V0Q3Vy cmVudEZ1bGxUcmFuc2FjdGlvbklkKHZvaWQpOwogZXh0ZXJuIEZ1bGxUcmFuc2FjdGlvbklk IEdldEN1cnJlbnRGdWxsVHJhbnNhY3Rpb25JZElmQW55KHZvaWQpOwotZXh0ZXJuIHZvaWQg TWFya0N1cnJlbnRUcmFuc2FjdGlvbklkTG9nZ2VkSWZBbnkodm9pZCk7CiBleHRlcm4gYm9v bCBTdWJUcmFuc2FjdGlvbklzQWN0aXZlKFN1YlRyYW5zYWN0aW9uSWQgc3VieGlkKTsKIGV4 dGVybiBDb21tYW5kSWQgR2V0Q3VycmVudENvbW1hbmRJZChib29sIHVzZWQpOwogZXh0ZXJu IHZvaWQgU2V0UGFyYWxsZWxTdGFydFRpbWVzdGFtcHMoVGltZXN0YW1wVHogeGFjdF90cywg VGltZXN0YW1wVHogc3RtdF90cyk7CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9hY2Nlc3Mv eGxvZ3V0aWxzLmggYi9zcmMvaW5jbHVkZS9hY2Nlc3MveGxvZ3V0aWxzLmgKaW5kZXggZTI0 NjEzZThmODEuLjc4NDhjZjdkMTMwIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9hY2Nlc3Mv eGxvZ3V0aWxzLmgKKysrIGIvc3JjL2luY2x1ZGUvYWNjZXNzL3hsb2d1dGlscy5oCkBAIC0y NCwzNyArMjQsMTAgQEAKIGV4dGVybiBQR0RMTElNUE9SVCBib29sIEluUmVjb3Zlcnk7CiAK IC8qCi0gKiBMaWtlIEluUmVjb3ZlcnksIHN0YW5kYnlTdGF0ZSBpcyBvbmx5IHZhbGlkIGlu IHRoZSBzdGFydHVwIHByb2Nlc3MuCi0gKiBJbiBhbGwgb3RoZXIgcHJvY2Vzc2VzIGl0IHdp bGwgaGF2ZSB0aGUgdmFsdWUgU1RBTkRCWV9ESVNBQkxFRCAoc28KLSAqIEluSG90U3RhbmRi eSB3aWxsIHJlYWQgYXMgZmFsc2UpLgotICoKLSAqIEluIERJU0FCTEVEIHN0YXRlLCB3ZSdy ZSBwZXJmb3JtaW5nIGNyYXNoIHJlY292ZXJ5IG9yIGhvdCBzdGFuZGJ5IHdhcwotICogZGlz YWJsZWQgaW4gcG9zdGdyZXNxbC5jb25mLgotICoKLSAqIEluIElOSVRJQUxJWkVEIHN0YXRl LCB3ZSd2ZSBydW4gSW5pdFJlY292ZXJ5VHJhbnNhY3Rpb25FbnZpcm9ubWVudCwgYnV0Ci0g KiB3ZSBoYXZlbid0IHlldCBwcm9jZXNzZWQgYSBSVU5OSU5HX1hBQ1RTIG9yIHNodXRkb3du LWNoZWNrcG9pbnQgV0FMIHJlY29yZAotICogdG8gaW5pdGlhbGl6ZSBvdXIgcHJpbWFyeS10 cmFuc2FjdGlvbiB0cmFja2luZyBzeXN0ZW0uCi0gKgotICogV2hlbiB0aGUgdHJhbnNhY3Rp b24gdHJhY2tpbmcgaXMgaW5pdGlhbGl6ZWQsIHdlIGVudGVyIHRoZSBTTkFQU0hPVF9QRU5E SU5HCi0gKiBzdGF0ZS4gVGhlIHRyYWNrZWQgaW5mb3JtYXRpb24gbWlnaHQgc3RpbGwgYmUg aW5jb21wbGV0ZSwgc28gd2UgY2FuJ3QgYWxsb3cKLSAqIGNvbm5lY3Rpb25zIHlldCwgYnV0 IHJlZG8gZnVuY3Rpb25zIG11c3QgdXBkYXRlIHRoZSBpbi1tZW1vcnkgc3RhdGUgd2hlbgot ICogYXBwcm9wcmlhdGUuCi0gKgotICogSW4gU05BUFNIT1RfUkVBRFkgbW9kZSwgd2UgaGF2 ZSBmdWxsIGtub3dsZWRnZSBvZiB0cmFuc2FjdGlvbnMgdGhhdCBhcmUKLSAqIChvciB3ZXJl KSBydW5uaW5nIG9uIHRoZSBwcmltYXJ5IGF0IHRoZSBjdXJyZW50IFdBTCBsb2NhdGlvbi4g U25hcHNob3RzCi0gKiBjYW4gYmUgdGFrZW4sIGFuZCByZWFkLW9ubHkgcXVlcmllcyBjYW4g YmUgcnVuLgorICogTGlrZSBJblJlY292ZXJ5LCBJbkhvdFN0YW5kYnkgaXMgb25seSB2YWxp ZCBpbiB0aGUgc3RhcnR1cCBwcm9jZXNzLgorICogSW4gYWxsIG90aGVyIHByb2Nlc3NlcyBp dCB3aWxsIGJlIGZhbHNlLgogICovCi10eXBlZGVmIGVudW0KLXsKLQlTVEFOREJZX0RJU0FC TEVELAotCVNUQU5EQllfSU5JVElBTElaRUQsCi0JU1RBTkRCWV9TTkFQU0hPVF9QRU5ESU5H LAotCVNUQU5EQllfU05BUFNIT1RfUkVBRFksCi19IEhvdFN0YW5kYnlTdGF0ZTsKLQotZXh0 ZXJuIFBHRExMSU1QT1JUIEhvdFN0YW5kYnlTdGF0ZSBzdGFuZGJ5U3RhdGU7Ci0KLSNkZWZp bmUgSW5Ib3RTdGFuZGJ5IChzdGFuZGJ5U3RhdGUgPj0gU1RBTkRCWV9TTkFQU0hPVF9QRU5E SU5HKQorZXh0ZXJuIFBHRExMSU1QT1JUIGJvb2wgSW5Ib3RTdGFuZGJ5OwogCiAKIGV4dGVy biBib29sIFhMb2dIYXZlSW52YWxpZFBhZ2VzKHZvaWQpOwpkaWZmIC0tZ2l0IGEvc3JjL2lu Y2x1ZGUvc3RvcmFnZS9sd2xvY2suaCBiL3NyYy9pbmNsdWRlL3N0b3JhZ2UvbHdsb2NrLmgK aW5kZXggZDcwZTZkMzdlMDkuLmMyMTU2YWNhMTJkIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVk ZS9zdG9yYWdlL2x3bG9jay5oCisrKyBiL3NyYy9pbmNsdWRlL3N0b3JhZ2UvbHdsb2NrLmgK QEAgLTE3OSw2ICsxNzksNyBAQCB0eXBlZGVmIGVudW0gQnVpbHRpblRyYW5jaGVJZHMKIAlM V1RSQU5DSEVfWEFDVF9CVUZGRVIgPSBOVU1fSU5ESVZJRFVBTF9MV0xPQ0tTLAogCUxXVFJB TkNIRV9DT01NSVRUU19CVUZGRVIsCiAJTFdUUkFOQ0hFX1NVQlRSQU5TX0JVRkZFUiwKKwlM V1RSQU5DSEVfQ1NOX0xPR19CVUZGRVIsCiAJTFdUUkFOQ0hFX01VTFRJWEFDVE9GRlNFVF9C VUZGRVIsCiAJTFdUUkFOQ0hFX01VTFRJWEFDVE1FTUJFUl9CVUZGRVIsCiAJTFdUUkFOQ0hF X05PVElGWV9CVUZGRVIsCkBAIC0yMTUsNiArMjE2LDcgQEAgdHlwZWRlZiBlbnVtIEJ1aWx0 aW5UcmFuY2hlSWRzCiAJTFdUUkFOQ0hFX1NVQlRSQU5TX1NMUlUsCiAJTFdUUkFOQ0hFX1hB Q1RfU0xSVSwKIAlMV1RSQU5DSEVfUEFSQUxMRUxfVkFDVVVNX0RTQSwKKwlMV1RSQU5DSEVf Q1NOX0xPR19TTFJVLAogCUxXVFJBTkNIRV9GSVJTVF9VU0VSX0RFRklORUQsCiB9CQkJQnVp bHRpblRyYW5jaGVJZHM7CiAKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL3N0b3JhZ2UvcHJv Y2FycmF5LmggYi9zcmMvaW5jbHVkZS9zdG9yYWdlL3Byb2NhcnJheS5oCmluZGV4IDhjYTYw NTA0NjIyLi45NWYyZjM5ZTE5MiAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvc3RvcmFnZS9w cm9jYXJyYXkuaAorKysgYi9zcmMvaW5jbHVkZS9zdG9yYWdlL3Byb2NhcnJheS5oCkBAIC0y OCwxOCArMjgsMTEgQEAgZXh0ZXJuIHZvaWQgUHJvY0FycmF5UmVtb3ZlKFBHUFJPQyAqcHJv YywgVHJhbnNhY3Rpb25JZCBsYXRlc3RYaWQpOwogZXh0ZXJuIHZvaWQgUHJvY0FycmF5RW5k VHJhbnNhY3Rpb24oUEdQUk9DICpwcm9jLCBUcmFuc2FjdGlvbklkIGxhdGVzdFhpZCk7CiBl eHRlcm4gdm9pZCBQcm9jQXJyYXlDbGVhclRyYW5zYWN0aW9uKFBHUFJPQyAqcHJvYyk7CiAK K2V4dGVybiB2b2lkIFByb2NBcnJheVVwZGF0ZU9sZGVzdFJ1bm5pbmdYaWQoVHJhbnNhY3Rp b25JZCBvbGRlc3RSdW5uaW5nWElEKTsKIGV4dGVybiB2b2lkIFByb2NBcnJheUluaXRSZWNv dmVyeShUcmFuc2FjdGlvbklkIGluaXRpYWxpemVkVXB0b1hJRCk7Ci1leHRlcm4gdm9pZCBQ cm9jQXJyYXlBcHBseVJlY292ZXJ5SW5mbyhSdW5uaW5nVHJhbnNhY3Rpb25zIHJ1bm5pbmcp OwotZXh0ZXJuIHZvaWQgUHJvY0FycmF5QXBwbHlYaWRBc3NpZ25tZW50KFRyYW5zYWN0aW9u SWQgdG9weGlkLAotCQkJCQkJCQkJCWludCBuc3VieGlkcywgVHJhbnNhY3Rpb25JZCAqc3Vi eGlkcyk7CiAKIGV4dGVybiB2b2lkIFJlY29yZEtub3duQXNzaWduZWRUcmFuc2FjdGlvbklk cyhUcmFuc2FjdGlvbklkIHhpZCk7Ci1leHRlcm4gdm9pZCBFeHBpcmVUcmVlS25vd25Bc3Np Z25lZFRyYW5zYWN0aW9uSWRzKFRyYW5zYWN0aW9uSWQgeGlkLAotCQkJCQkJCQkJCQkJICBp bnQgbnN1YnhpZHMsIFRyYW5zYWN0aW9uSWQgKnN1YnhpZHMsCi0JCQkJCQkJCQkJCQkgIFRy YW5zYWN0aW9uSWQgbWF4X3hpZCk7Ci1leHRlcm4gdm9pZCBFeHBpcmVBbGxLbm93bkFzc2ln bmVkVHJhbnNhY3Rpb25JZHModm9pZCk7Ci1leHRlcm4gdm9pZCBFeHBpcmVPbGRLbm93bkFz c2lnbmVkVHJhbnNhY3Rpb25JZHMoVHJhbnNhY3Rpb25JZCB4aWQpOwotZXh0ZXJuIHZvaWQg S25vd25Bc3NpZ25lZFRyYW5zYWN0aW9uSWRzSWRsZU1haW50ZW5hbmNlKHZvaWQpOworZXh0 ZXJuIHZvaWQgRXhwaXJlVHJlZUtub3duQXNzaWduZWRUcmFuc2FjdGlvbklkcyhUcmFuc2Fj dGlvbklkIG1heF94aWQsIFhMb2dSZWNQdHIgbHNuKTsKIAogZXh0ZXJuIGludAlHZXRNYXhT bmFwc2hvdFhpZENvdW50KHZvaWQpOwogZXh0ZXJuIGludAlHZXRNYXhTbmFwc2hvdFN1Ynhp ZENvdW50KHZvaWQpOwpAQCAtNTYsNyArNDksNyBAQCBleHRlcm4gYm9vbCBUcmFuc2FjdGlv bklkSXNJblByb2dyZXNzKFRyYW5zYWN0aW9uSWQgeGlkKTsKIGV4dGVybiBib29sIFRyYW5z YWN0aW9uSWRJc0FjdGl2ZShUcmFuc2FjdGlvbklkIHhpZCk7CiBleHRlcm4gVHJhbnNhY3Rp b25JZCBHZXRPbGRlc3ROb25SZW1vdmFibGVUcmFuc2FjdGlvbklkKFJlbGF0aW9uIHJlbCk7 CiBleHRlcm4gVHJhbnNhY3Rpb25JZCBHZXRPbGRlc3RUcmFuc2FjdGlvbklkQ29uc2lkZXJl ZFJ1bm5pbmcodm9pZCk7Ci1leHRlcm4gVHJhbnNhY3Rpb25JZCBHZXRPbGRlc3RBY3RpdmVU cmFuc2FjdGlvbklkKHZvaWQpOworZXh0ZXJuIFRyYW5zYWN0aW9uSWQgR2V0T2xkZXN0QWN0 aXZlVHJhbnNhY3Rpb25JZChib29sIGFsbERicyk7CiBleHRlcm4gVHJhbnNhY3Rpb25JZCBH ZXRPbGRlc3RTYWZlRGVjb2RpbmdUcmFuc2FjdGlvbklkKGJvb2wgY2F0YWxvZ09ubHkpOwog ZXh0ZXJuIHZvaWQgR2V0UmVwbGljYXRpb25Ib3Jpem9ucyhUcmFuc2FjdGlvbklkICp4bWlu LCBUcmFuc2FjdGlvbklkICpjYXRhbG9nX3htaW4pOwogCmRpZmYgLS1naXQgYS9zcmMvaW5j bHVkZS9zdG9yYWdlL3N0YW5kYnkuaCBiL3NyYy9pbmNsdWRlL3N0b3JhZ2Uvc3RhbmRieS5o CmluZGV4IDBmYzA4MDRlMjY2Li5hZWU3ZjU1OTJjZCAxMDA2NDQKLS0tIGEvc3JjL2luY2x1 ZGUvc3RvcmFnZS9zdGFuZGJ5LmgKKysrIGIvc3JjL2luY2x1ZGUvc3RvcmFnZS9zdGFuZGJ5 LmgKQEAgLTQ3LDE5ICs0Nyw2IEBAIGV4dGVybiB2b2lkIExvZ1JlY292ZXJ5Q29uZmxpY3Qo UHJvY1NpZ25hbFJlYXNvbiByZWFzb24sIFRpbWVzdGFtcFR6IHdhaXRfc3RhcnQsCiAJCQkJ CQkJCVRpbWVzdGFtcFR6IG5vdywgVmlydHVhbFRyYW5zYWN0aW9uSWQgKndhaXRfbGlzdCwK IAkJCQkJCQkJYm9vbCBzdGlsbF93YWl0aW5nKTsKIAotLyoKLSAqIFN0YW5kYnkgUm1nciAo Uk1fU1RBTkRCWV9JRCkKLSAqCi0gKiBTdGFuZGJ5IHJlY292ZXJ5IG1hbmFnZXIgZXhpc3Rz IHRvIHBlcmZvcm0gYWN0aW9ucyB0aGF0IGFyZSByZXF1aXJlZAotICogdG8gbWFrZSBob3Qg c3RhbmRieSB3b3JrLiBUaGF0IGluY2x1ZGVzIGxvZ2dpbmcgQWNjZXNzRXhjbHVzaXZlTG9j a3MgdGFrZW4KLSAqIGJ5IHRyYW5zYWN0aW9ucyBhbmQgcnVubmluZy14YWN0cyBzbmFwc2hv dHMuCi0gKi8KLWV4dGVybiB2b2lkIFN0YW5kYnlBY3F1aXJlQWNjZXNzRXhjbHVzaXZlTG9j ayhUcmFuc2FjdGlvbklkIHhpZCwgT2lkIGRiT2lkLCBPaWQgcmVsT2lkKTsKLWV4dGVybiB2 b2lkIFN0YW5kYnlSZWxlYXNlTG9ja1RyZWUoVHJhbnNhY3Rpb25JZCB4aWQsCi0JCQkJCQkJ CSAgIGludCBuc3VieGlkcywgVHJhbnNhY3Rpb25JZCAqc3VieGlkcyk7Ci1leHRlcm4gdm9p ZCBTdGFuZGJ5UmVsZWFzZUFsbExvY2tzKHZvaWQpOwotZXh0ZXJuIHZvaWQgU3RhbmRieVJl bGVhc2VPbGRMb2NrcyhUcmFuc2FjdGlvbklkIG9sZHhpZCk7Ci0KICNkZWZpbmUgTWluU2l6 ZU9mWGFjdFJ1bm5pbmdYYWN0cyBvZmZzZXRvZih4bF9ydW5uaW5nX3hhY3RzLCB4aWRzKQog CiAKQEAgLTkxLDYgKzc4LDE5IEBAIHR5cGVkZWYgc3RydWN0IFJ1bm5pbmdUcmFuc2FjdGlv bnNEYXRhCiAKIHR5cGVkZWYgUnVubmluZ1RyYW5zYWN0aW9uc0RhdGEgKlJ1bm5pbmdUcmFu c2FjdGlvbnM7CiAKKy8qCisgKiBTdGFuZGJ5IFJtZ3IgKFJNX1NUQU5EQllfSUQpCisgKgor ICogU3RhbmRieSByZWNvdmVyeSBtYW5hZ2VyIGV4aXN0cyB0byBwZXJmb3JtIGFjdGlvbnMg dGhhdCBhcmUgcmVxdWlyZWQKKyAqIHRvIG1ha2UgaG90IHN0YW5kYnkgd29yay4gVGhhdCBp bmNsdWRlcyBsb2dnaW5nIEFjY2Vzc0V4Y2x1c2l2ZUxvY2tzIHRha2VuCisgKiBieSB0cmFu c2FjdGlvbnMgYW5kIHJ1bm5pbmcteGFjdHMgc25hcHNob3RzLgorICovCitleHRlcm4gdm9p ZCBTdGFuZGJ5QWNxdWlyZUFjY2Vzc0V4Y2x1c2l2ZUxvY2soVHJhbnNhY3Rpb25JZCB4aWQs IE9pZCBkYk9pZCwgT2lkIHJlbE9pZCk7CitleHRlcm4gdm9pZCBTdGFuZGJ5UmVsZWFzZUxv Y2tUcmVlKFRyYW5zYWN0aW9uSWQgeGlkLAorCQkJCQkJCQkgICBpbnQgbnN1YnhpZHMsIFRy YW5zYWN0aW9uSWQgKnN1YnhpZHMpOworZXh0ZXJuIHZvaWQgU3RhbmRieVJlbGVhc2VBbGxM b2Nrcyh2b2lkKTsKK2V4dGVybiB2b2lkIFN0YW5kYnlSZWxlYXNlT2xkTG9ja3MoVHJhbnNh Y3Rpb25JZCBvbGR4aWQpOworCiBleHRlcm4gdm9pZCBMb2dBY2Nlc3NFeGNsdXNpdmVMb2Nr KE9pZCBkYk9pZCwgT2lkIHJlbE9pZCk7CiBleHRlcm4gdm9pZCBMb2dBY2Nlc3NFeGNsdXNp dmVMb2NrUHJlcGFyZSh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvdXRpbHMv c25hcHNob3QuaCBiL3NyYy9pbmNsdWRlL3V0aWxzL3NuYXBzaG90LmgKaW5kZXggOGQxZTMx ZTg4OGUuLjFmZGE1YjA2ZjY3IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS91dGlscy9zbmFw c2hvdC5oCisrKyBiL3NyYy9pbmNsdWRlL3V0aWxzL3NuYXBzaG90LmgKQEAgLTE4MSw2ICsx ODEsMTMgQEAgdHlwZWRlZiBzdHJ1Y3QgU25hcHNob3REYXRhCiAJaW50MzIJCXN1YnhjbnQ7 CQkvKiAjIG9mIHhhY3QgaWRzIGluIHN1YnhpcFtdICovCiAJYm9vbAkJc3Vib3ZlcmZsb3dl ZDsJLyogaGFzIHRoZSBzdWJ4aXAgYXJyYXkgb3ZlcmZsb3dlZD8gKi8KIAorCS8qCisJICog TVZDQyBzbmFwc2hvdHMgdGFrZW4gZHVyaW5nIHJlY292ZXJ5IHVzZSB0aGlzIENTTiBpbnN0 ZWFkIG9mIHRoZSB4aXAKKwkgKiBhbmQgc3VieGlwIGFycmF5cy4gQW55IHRyYW5zYWN0aW9u cyB0aGF0IGNvbW1pdHRlZCBhdCBvciBiZWZvcmUgdGhpcworCSAqIExTTiBhcmUgY29uc2lk ZXJlZCBhcyB2aXNpYmxlLgorCSAqLworCVhMb2dSZWNQdHIJc25hcHNob3RDc247CisKIAli b29sCQl0YWtlbkR1cmluZ1JlY292ZXJ5OwkvKiByZWNvdmVyeS1zaGFwZWQgc25hcHNob3Q/ ICovCiAJYm9vbAkJY29waWVkOwkJCS8qIGZhbHNlIGlmIGl0J3MgYSBzdGF0aWMgc25hcHNo b3QgKi8KIAotLSAKMi4zOS4yCgo= --------------jZa0JVb0CkVqIgS8qBINceUd--