Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1ojgNe-0006M8-5O for pgsql-hackers@arkaria.postgresql.org; Sat, 15 Oct 2022 12:35:07 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1ojgMd-0005HO-5o for pgsql-hackers@arkaria.postgresql.org; Sat, 15 Oct 2022 12:34:03 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1ojgMb-0005HF-QG for pgsql-hackers@lists.postgresql.org; Sat, 15 Oct 2022 12:34:02 +0000 Received: from mail-ej1-x631.google.com ([2a00:1450:4864:20::631]) by magus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1ojgMU-0000gP-8I for pgsql-hackers@lists.postgresql.org; Sat, 15 Oct 2022 12:34:01 +0000 Received: by mail-ej1-x631.google.com with SMTP id k2so15704921ejr.2 for ; Sat, 15 Oct 2022 05:33:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=enterprisedb.com; s=google; h=subject:from:to:content-language:user-agent:mime-version:date :message-id:from:to:cc:subject:date:message-id:reply-to; bh=Oa3LAe16YbSh6w0j1ZX8cUz+ffCSzdTfqg110hnUMBQ=; b=hvGQhXXhwtHXgyFppwzrF0CALBjB+6Tl+hNfNMOuF43TqhdwlNiyG8E/plBQsE7dBH URjPW64gJwDi09xrItfGOpIWbZI1W+jc2HjPNAOdzXdxmHPQCoytp2B1YzJHj5/iIfm8 PD7ZiUcXdU/LwNpT33iAhTkO5Ul4aTMr8QYw9hd2hT/eaAVbUnfGAnyVXmlv15fm5vOC UGNUGX23LxsXYjbljp1pfbmD1o4ETMeh2jQOla8TJGW/LW4okl/4HiFChiwxLwJfhbIl Jkjy6i0+F52AyVrYm8UpDydXxKQ1Y17d/Gq1HzqQYucBs/dkYDvZCZtdkdlm+UFFTI7S A5gA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=subject:from:to:content-language:user-agent:mime-version:date :message-id:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=Oa3LAe16YbSh6w0j1ZX8cUz+ffCSzdTfqg110hnUMBQ=; b=4gkFO15WN7nq/wWtAaAImhPpY5IDcAOvsgp2NE5kL6MdQ7Z6MmvMaio8tpWAD0ZbLa wscqZaTIcRs2bJ1seVAjkKODUU9MXyZSUOz7Nj59IWsare3a1JmOo9eBhq/XlRUhNJmn UrDTfYH6Qj9KEPWvd8fHKoHxVMKYPSwQBb5jkjbzdv1AEH4zIAiYXhyUSkvYkJ0jSW77 8E5PEarrH/YPnAhXGdkwKLGcyNiy8oEScqUlYWMwRxEz7GtWf/WPGDJSnpLUTi/fF0np ZLC8mrt6hkYMeGu6RsgKbK4ZigUCg9KPyXieB/nvKPGPOCq/au0JTf/oOVqUHk2PepRC nMlQ== X-Gm-Message-State: ACrzQf3PPH6kYp8L+WoKIv9DdE8MJYRFdP/v/uYFGaa/iDyOMz2yBNm4 s2syXm68zVwntf03ANkt956Oohc0KzsZN2mBcl8V6q+WryqDbLMnmXl1QPl8NzQHOJPHy76App8 snJwlydKVMSIDAHhTFZlAgfeGh4Qu+p3SDU0XBO5foy9eGDCBYMQY2nMcMhkP0qACKrtkixl7XA gLgzOiPnONgYyGE81V3LLmwuuJHpLK7j9KLbe9hoS7ILq2rHQreaqcV9lhkfsc/26P1bucbJ7Uu AP+6LzUXM10rNKLAGRgDqHOwDARM0xBJrTaRz/N4EvKxhA+upN2WVlHPonhUMCoV9vuKBqDV3c3 79z8pBcviivi5iPDSkpQ+L8R4CeHEKiGW238ZTlht12J7hkG8rQthT1THw== X-Google-Smtp-Source: AMsMyM5QMwx4MLsGbk1e/FmznVYxZtXmpyjc0cZPSUmo+dfe+HrAr5etz0n708VKbJKB9DkSITRJcg== X-Received: by 2002:a17:906:8a47:b0:78d:b6d8:f531 with SMTP id gx7-20020a1709068a4700b0078db6d8f531mr1877715ejc.287.1665837232419; Sat, 15 Oct 2022 05:33:52 -0700 (PDT) Received: from [10.137.0.17] (ip-86-49-228-162.bb.vodafone.cz. [86.49.228.162]) by smtp.gmail.com with ESMTPSA id e14-20020a170906314e00b0073d84a321c8sm3071169eje.166.2022.10.15.05.33.50 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sat, 15 Oct 2022 05:33:51 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------spOVlteNcqSeU4NYyJcJZ0TM" Message-ID: Date: Sat, 15 Oct 2022 14:33:50 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.3.1 Content-Language: en-US To: PostgreSQL Hackers From: Tomas Vondra Subject: PATCH: Using BRIN indexes for sorted output X-CLOUD-SEC-AV-Info: enterprisedb,google_mail,monitor X-CLOUD-SEC-AV-Sent: true X-Gm-Spam: 0 X-Gm-Phishy: 0 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. --------------spOVlteNcqSeU4NYyJcJZ0TM Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Hi, There have been a couple discussions about using BRIN indexes for sorting - in fact this was mentioned even in the "Improving Indexing Performance" unconference session this year (don't remember by whom). But I haven't seen any patches, so here's one. The idea is that we can use information about ranges to split the table into smaller parts that can be sorted in smaller chunks. For example if you have a tiny 2MB table with two ranges, with values in [0,100] and [101,200] intervals, then it's clear we can sort the first range, output tuples, and then sort/output the second range. The attached patch builds "BRIN Sort" paths/plans, closely resembling index scans, only for BRIN indexes. And this special type of index scan does what was mentioned above - incrementally sorts the data. It's a bit more complicated because of overlapping ranges, ASC/DESC, NULL etc. This is disabled by default, using a GUC enable_brinsort (you may need to tweak other GUCs to disable parallel plans etc.). A trivial example, demonstrating the benefits: create table t (a int) with (fillfactor = 10); insert into t select i from generate_series(1,10000000) s(i); First, a simple LIMIT query: explain (analyze, costs off) select * from t order by a limit 10; QUERY PLAN ------------------------------------------------------------------------ Limit (actual time=1879.768..1879.770 rows=10 loops=1) -> Sort (actual time=1879.767..1879.768 rows=10 loops=1) Sort Key: a Sort Method: top-N heapsort Memory: 25kB -> Seq Scan on t (actual time=0.007..1353.110 rows=10000000 loops=1) Planning Time: 0.083 ms Execution Time: 1879.786 ms (7 rows) QUERY PLAN ------------------------------------------------------------------------ Limit (actual time=1.217..1.219 rows=10 loops=1) -> BRIN Sort using t_a_idx on t (actual time=1.216..1.217 rows=10 loops=1) Sort Key: a Planning Time: 0.084 ms Execution Time: 1.234 ms (5 rows) That's a pretty nice improvement - of course, this is thanks to having a perfectly sequential, and the difference can be almost arbitrary by making the table smaller/larger. Similarly, if the table gets less sequential (making ranges to overlap), the BRIN plan will be more expensive. Feel free to experiment with other data sets. However, not only the LIMIT queries can improve - consider a sort of the whole table: test=# explain (analyze, costs off) select * from t order by a; QUERY PLAN ------------------------------------------------------------------------- Sort (actual time=2806.468..3487.213 rows=10000000 loops=1) Sort Key: a Sort Method: external merge Disk: 117528kB -> Seq Scan on t (actual time=0.018..1498.754 rows=10000000 loops=1) Planning Time: 0.110 ms Execution Time: 3766.825 ms (6 rows) test=# explain (analyze, costs off) select * from t order by a; QUERY PLAN ---------------------------------------------------------------------------------- BRIN Sort using t_a_idx on t (actual time=1.210..2670.875 rows=10000000 loops=1) Sort Key: a Planning Time: 0.073 ms Execution Time: 2939.324 ms (4 rows) Right - not a huge difference, but still a nice 25% speedup, mostly due to not having to spill data to disk and sorting smaller amounts of data. There's a bunch of issues with this initial version of the patch, usually described in XXX comments in the relevant places.6) 1) The paths are created in build_index_paths() because that's what creates index scans (which the new path resembles). But that is expected to produce IndexPath, not BrinSortPath, so it's not quite correct. Should be somewhere "higher" I guess. 2) BRIN indexes don't have internal ordering, i.e. ASC/DESC and NULLS FIRST/LAST does not really matter for them. The patch just generates paths for all 4 combinations (or tries to). Maybe there's a better way. 3) I'm not quite sure the separation of responsibilities between opfamily and opclass is optimal. I added a new amproc, but maybe this should be split differently. At the moment only minmax indexes have this, but adding this to minmax-multi should be trivial. 4) The state changes in nodeBrinSort is a bit confusing. Works, but may need cleanup and refactoring. Ideas welcome. 5) The costing is essentially just plain cost_index. I have some ideas about BRIN costing in general, which I'll post in a separate thread (as it's not specific to this patch). 6) At the moment this only picks one of the index keys, specified in the ORDER BY clause. I think we can generalize this to multiple keys, but thinking about multi-key ranges was a bit too much for me. The good thing is this nicely combines with IncrementalSort. 7) Only plain index keys for the ORDER BY keys, no expressions. Should not be hard to fix, though. 8) Parallel version is not supported, but I think it shouldn't be possible. Just make the leader build the range info, and then let the workers to acquire/sort ranges and merge them by Gather Merge. 9) I was also thinking about leveraging other indexes to quickly eliminate ranges that need to be sorted. The node does evaluate filter, of course, but only after reading the tuple from the range. But imagine we allow BrinSort to utilize BRIN indexes to evaluate the filter - in that case we might skip many ranges entirely. Essentially like a bitmap index scan does, except that building the bitmap incrementally with BRIN is trivial - you can quickly check if a particular range matches or not. With other indexes (e.g. btree) you essentially need to evaluate the filter completely, and only then you can look at the bitmap. Which seems rather against the idea of this patch, which is about low startup cost. Of course, the condition might be very selective, but then you probably can just fetch the matching tuples and do a Sort. regards -- Tomas Vondra EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company --------------spOVlteNcqSeU4NYyJcJZ0TM Content-Type: text/x-patch; charset=UTF-8; name="0001-Allow-BRIN-indexes-to-produce-sorted-output-20221015.patch" Content-Disposition: attachment; filename*0="0001-Allow-BRIN-indexes-to-produce-sorted-output-20221015.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSA2ZDc1Y2QyNDNjMTA3YmMzMDk5NThlY2VlOThiMDg1ZGZiNzk2MmFkIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBUb21hcyBWb25kcmEgPHRvbWFzLnZvbmRyYUBwb3N0 Z3Jlc3FsLm9yZz4KRGF0ZTogU3VuLCA5IE9jdCAyMDIyIDExOjMzOjM3ICswMjAwClN1Ympl Y3Q6IFtQQVRDSF0gQWxsb3cgQlJJTiBpbmRleGVzIHRvIHByb2R1Y2Ugc29ydGVkIG91dHB1 dAoKU29tZSBCUklOIGluZGV4ZXMgY2FuIGJlIHVzZWQgdG8gcHJvZHVjZSBzb3J0ZWQgb3V0 cHV0LCBieSB1c2luZyB0aGUKcmFuZ2UgaW5mb3JtYXRpb24gdG8gc29ydCB0dXBsZXMgaW5j cmVtZW50YWxseS4gVGhpcyBpcyBwYXJ0aWN1bGFybHkKaW50ZXJlc3RpbmcgZm9yIExJTUlU IHF1ZXJpZXMsIHdoaWNoIG9ubHkgbmVlZCB0byBzY2FuIHRoZSBmaXJzdCBmZXcKcm93cywg YW5kIGFsdGVybmF0aXZlIHBsYW5zIChlLmcuIFNlcSBTY2FuICsgU29ydCkgaGF2ZSBhIHZl cnkgaGlnaApzdGFydHVwIGNvc3QuCgpPZiBjb3Vyc2UsIGlmIHRoZXJlIGFyZSBlLmcuIEJU UkVFIGluZGV4ZXMgdGhpcyBpcyBnb2luZyB0byBiZSBzbG93ZXIsCmJ1dCBwZW9wbGUgYXJl IHVubGlrZWx5IHRvIGhhdmUgYm90aCBpbmRleCB0eXBlcyBvbiB0aGUgc2FtZSBjb2x1bW4u CgpUaGlzIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQsIHVzZSBlbmFibGVfYnJpbnNvcnQgR1VD IHRvIGVuYWJsZSBpdC4KLS0tCiBzcmMvYmFja2VuZC9hY2Nlc3MvYnJpbi9icmluX21pbm1h eC5jICAgfCAgMTQ5ICsrKwogc3JjL2JhY2tlbmQvY29tbWFuZHMvZXhwbGFpbi5jICAgICAg ICAgIHwgICA0NCArCiBzcmMvYmFja2VuZC9leGVjdXRvci9NYWtlZmlsZSAgICAgICAgICAg fCAgICAxICsKIHNyYy9iYWNrZW5kL2V4ZWN1dG9yL2V4ZWNQcm9jbm9kZS5jICAgICB8ICAg MTAgKwogc3JjL2JhY2tlbmQvZXhlY3V0b3Ivbm9kZUJyaW5Tb3J0LmMgICAgIHwgMTUzOCAr KysrKysrKysrKysrKysrKysrKysrKwogc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvY29z dHNpemUuYyAgIHwgIDI1NCArKysrCiBzcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9pbmR4 cGF0aC5jICAgfCAgMTk3ICsrKwogc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvcGF0aGtl eXMuYyAgIHwgICA1MCArCiBzcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9jcmVhdGVwbGFu LmMgfCAgMTg5ICsrKwogc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vc2V0cmVmcy5jICAg IHwgICAxOSArCiBzcmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRpbC9wYXRobm9kZS5jICAgfCAg IDU5ICsKIHNyYy9iYWNrZW5kL3V0aWxzL21pc2MvZ3VjX3RhYmxlcy5jICAgICB8ICAgMTAg Kwogc3JjL2luY2x1ZGUvYWNjZXNzL2JyaW4uaCAgICAgICAgICAgICAgIHwgICAyMCArCiBz cmMvaW5jbHVkZS9hY2Nlc3MvYnJpbl9pbnRlcm5hbC5oICAgICAgfCAgICAxICsKIHNyYy9p bmNsdWRlL2NhdGFsb2cvcGdfYW1wcm9jLmRhdCAgICAgICB8ICAgNjQgKwogc3JjL2luY2x1 ZGUvY2F0YWxvZy9wZ19vcGNsYXNzLmRhdCAgICAgIHwgICAgMiArLQogc3JjL2luY2x1ZGUv Y2F0YWxvZy9wZ19wcm9jLmRhdCAgICAgICAgIHwgICAgMyArCiBzcmMvaW5jbHVkZS9leGVj dXRvci9ub2RlQnJpblNvcnQuaCAgICAgfCAgIDQ3ICsKIHNyYy9pbmNsdWRlL25vZGVzL2V4 ZWNub2Rlcy5oICAgICAgICAgICB8ICAgNjkgKwogc3JjL2luY2x1ZGUvbm9kZXMvcGF0aG5v ZGVzLmggICAgICAgICAgIHwgICAxMSArCiBzcmMvaW5jbHVkZS9ub2Rlcy9wbGFubm9kZXMu aCAgICAgICAgICAgfCAgIDI2ICsKIHNyYy9pbmNsdWRlL29wdGltaXplci9jb3N0LmggICAg ICAgICAgICB8ICAgIDMgKwogc3JjL2luY2x1ZGUvb3B0aW1pemVyL3BhdGhub2RlLmggICAg ICAgIHwgICAxMSArCiBzcmMvaW5jbHVkZS9vcHRpbWl6ZXIvcGF0aHMuaCAgICAgICAgICAg fCAgICAzICsKIDI0IGZpbGVzIGNoYW5nZWQsIDI3NzkgaW5zZXJ0aW9ucygrKSwgMSBkZWxl dGlvbigtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy9iYWNrZW5kL2V4ZWN1dG9yL25vZGVC cmluU29ydC5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL2luY2x1ZGUvZXhlY3V0b3Ivbm9k ZUJyaW5Tb3J0LmgKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9hY2Nlc3MvYnJpbi9icmlu X21pbm1heC5jIGIvc3JjL2JhY2tlbmQvYWNjZXNzL2JyaW4vYnJpbl9taW5tYXguYwppbmRl eCA5ZThhOGUwNTZjYy4uMGU2YmEwODkzZGYgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2Fj Y2Vzcy9icmluL2JyaW5fbWlubWF4LmMKKysrIGIvc3JjL2JhY2tlbmQvYWNjZXNzL2JyaW4v YnJpbl9taW5tYXguYwpAQCAtMTAsMTIgKzEwLDIwIEBACiAgKi8KICNpbmNsdWRlICJwb3N0 Z3Jlcy5oIgogCisjaW5jbHVkZSAiYWNjZXNzL2JyaW4uaCIKICNpbmNsdWRlICJhY2Nlc3Mv YnJpbl9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImFjY2Vzcy9icmluX3Jldm1hcC5oIgogI2lu Y2x1ZGUgImFjY2Vzcy9icmluX3R1cGxlLmgiCiAjaW5jbHVkZSAiYWNjZXNzL2dlbmFtLmgi CiAjaW5jbHVkZSAiYWNjZXNzL3N0cmF0bnVtLmgiCisjaW5jbHVkZSAiYWNjZXNzL3RhYmxl LmgiCisjaW5jbHVkZSAiYWNjZXNzL3RhYmxlYW0uaCIKKyNpbmNsdWRlICJjYXRhbG9nL2lu ZGV4LmgiCisjaW5jbHVkZSAiY2F0YWxvZy9wZ19hbS5oIgogI2luY2x1ZGUgImNhdGFsb2cv cGdfYW1vcC5oIgogI2luY2x1ZGUgImNhdGFsb2cvcGdfdHlwZS5oIgorI2luY2x1ZGUgIm1p c2NhZG1pbi5oIgorI2luY2x1ZGUgInN0b3JhZ2UvYnVmbWdyLmgiCiAjaW5jbHVkZSAidXRp bHMvYnVpbHRpbnMuaCIKICNpbmNsdWRlICJ1dGlscy9kYXR1bS5oIgogI2luY2x1ZGUgInV0 aWxzL2xzeXNjYWNoZS5oIgpAQCAtMjUzLDYgKzI2MSwxNDcgQEAgYnJpbl9taW5tYXhfdW5p b24oUEdfRlVOQ1RJT05fQVJHUykKIAlQR19SRVRVUk5fVk9JRCgpOwogfQogCit0eXBlZGVm IHN0cnVjdCBCcmluT3BhcXVlCit7CisJQmxvY2tOdW1iZXIgYm9fcGFnZXNQZXJSYW5nZTsK KwlCcmluUmV2bWFwICpib19ybUFjY2VzczsKKwlCcmluRGVzYyAgICpib19iZGVzYzsKK30g QnJpbk9wYXF1ZTsKKworRGF0dW0KK2JyaW5fbWlubWF4X3JhbmdlcyhQR19GVU5DVElPTl9B UkdTKQoreworCUluZGV4U2NhbkRlc2MJc2NhbiA9IChJbmRleFNjYW5EZXNjKSBQR19HRVRB UkdfUE9JTlRFUigwKTsKKwlBdHRyTnVtYmVyCQlhdHRudW0gPSBQR19HRVRBUkdfSU5UMTYo MSk7CisJQnJpbk9wYXF1ZSAqb3BhcXVlOworCVJlbGF0aW9uCWluZGV4UmVsOworCVJlbGF0 aW9uCWhlYXBSZWw7CisJQmxvY2tOdW1iZXIgbmJsb2NrczsKKwlCbG9ja051bWJlcglucmFu Z2VzOworCUJsb2NrTnVtYmVyCWhlYXBCbGs7CisJT2lkCQkJaGVhcE9pZDsKKwlCcmluTWVt VHVwbGUgKmR0dXA7CisJQnJpblR1cGxlICAqYnR1cCA9IE5VTEw7CisJU2l6ZQkJYnR1cHN6 ID0gMDsKKwlCdWZmZXIJCWJ1ZiA9IEludmFsaWRCdWZmZXI7CisJQnJpblJhbmdlcyAgKnJh bmdlczsKKwlCbG9ja051bWJlcglwYWdlc1BlclJhbmdlOworCUJyaW5EZXNjCSAgICpiZGVz YzsKKworCS8qCisJICogRGV0ZXJtaW5lIGhvdyBtYW55IEJSSU4gcmFuZ2VzIGNvdWxkIHRo ZXJlIGJlLCBhbGxvY2F0ZSBzcGFjZSBhbmQgcmVhZAorCSAqIGFsbCB0aGUgbWluL21heCB2 YWx1ZXMuCisJICovCisJb3BhcXVlID0gKEJyaW5PcGFxdWUgKikgc2Nhbi0+b3BhcXVlOwor CWJkZXNjID0gb3BhcXVlLT5ib19iZGVzYzsKKwlwYWdlc1BlclJhbmdlID0gb3BhcXVlLT5i b19wYWdlc1BlclJhbmdlOworCisJaW5kZXhSZWwgPSBiZGVzYy0+YmRfaW5kZXg7CisKKwkv KiBtYWtlIHN1cmUgdGhlIHByb3ZpZGVkIGF0dG51bSBpcyB2YWxpZCAqLworCUFzc2VydCgo YXR0bnVtID4gMCkgJiYgKGF0dG51bSA8PSBiZGVzYy0+YmRfdHVwZGVzYy0+bmF0dHMpKTsK KworCS8qCisJICogV2UgbmVlZCB0byBrbm93IHRoZSBzaXplIG9mIHRoZSB0YWJsZSBzbyB0 aGF0IHdlIGtub3cgaG93IGxvbmcgdG8gaXRlcmF0ZQorCSAqIG9uIHRoZSByZXZtYXAgKGFu ZCB0byBwcmUtYWxsb2NhdGUgdGhlIGFycmF5cykuCisJICovCisJaGVhcE9pZCA9IEluZGV4 R2V0UmVsYXRpb24oUmVsYXRpb25HZXRSZWxpZChpbmRleFJlbCksIGZhbHNlKTsKKwloZWFw UmVsID0gdGFibGVfb3BlbihoZWFwT2lkLCBBY2Nlc3NTaGFyZUxvY2spOworCW5ibG9ja3Mg PSBSZWxhdGlvbkdldE51bWJlck9mQmxvY2tzKGhlYXBSZWwpOworCXRhYmxlX2Nsb3NlKGhl YXBSZWwsIEFjY2Vzc1NoYXJlTG9jayk7CisKKwkvKgorCSAqIEhvdyBtYW55IHJhbmdlcyBj YW4gdGhlcmUgYmU/IFdlIHNpbXBseSBsb29rIGF0IHRoZSBudW1iZXIgb2YgcGFnZXMsCisJ ICogZGl2aWRlIGl0IGJ5IHRoZSBwYWdlc19wZXJfcmFuZ2UuCisJICoKKwkgKiBYWFggV2Ug bmVlZCB0byBiZSBjYXJlZnVsIG5vdCB0byBvdmVyZmxvdyBucmFuZ2VzLCBzbyB3ZSBqdXN0 IGRpdmlkZQorCSAqIGFuZCB0aGVuIG1heWJlIGFkZCAxIGZvciBwYXJ0aWFsIHJhbmdlcy4K KwkgKi8KKwlucmFuZ2VzID0gKG5ibG9ja3MgLyBwYWdlc1BlclJhbmdlKTsKKwlpZiAobmJs b2NrcyAlIHBhZ2VzUGVyUmFuZ2UgIT0gMCkKKwkJbnJhbmdlcyArPSAxOworCisJLyogYWxs b2NhdGUgZm9yIHNwYWNlLCBhbmQgYWxzbyBmb3IgdGhlIGFsdGVybmF0aXZlIG9yZGVyaW5n ICovCisJcmFuZ2VzID0gcGFsbG9jMChvZmZzZXRvZihCcmluUmFuZ2VzLCByYW5nZXMpICsg bnJhbmdlcyAqIHNpemVvZihCcmluUmFuZ2UpKTsKKwlyYW5nZXMtPm5yYW5nZXMgPSAwOwor CisJLyogYWxsb2NhdGUgYW4gaW5pdGlhbCBpbi1tZW1vcnkgdHVwbGUsIG91dCBvZiB0aGUg cGVyLXJhbmdlIG1lbWN4dCAqLworCWR0dXAgPSBicmluX25ld19tZW10dXBsZShiZGVzYyk7 CisKKwkvKgorCSAqIE5vdyBzY2FuIHRoZSByZXZtYXAuICBXZSBzdGFydCBieSBxdWVyeWlu ZyBmb3IgaGVhcCBwYWdlIDAsCisJICogaW5jcmVtZW50aW5nIGJ5IHRoZSBudW1iZXIgb2Yg cGFnZXMgcGVyIHJhbmdlOyB0aGlzIGdpdmVzIHVzIGEgZnVsbAorCSAqIHZpZXcgb2YgdGhl IHRhYmxlLgorCSAqLworCWZvciAoaGVhcEJsayA9IDA7IGhlYXBCbGsgPCBuYmxvY2tzOyBo ZWFwQmxrICs9IHBhZ2VzUGVyUmFuZ2UpCisJeworCQlib29sCQlnb3R0dXBsZSA9IGZhbHNl OworCQlCcmluVHVwbGUgICp0dXA7CisJCU9mZnNldE51bWJlciBvZmY7CisJCVNpemUJCXNp emU7CisJCUJyaW5SYW5nZSAgKnJhbmdlID0gJnJhbmdlcy0+cmFuZ2VzW3Jhbmdlcy0+bnJh bmdlc107CisKKwkJcmFuZ2VzLT5ucmFuZ2VzKys7CisKKwkJQ0hFQ0tfRk9SX0lOVEVSUlVQ VFMoKTsKKworCQl0dXAgPSBicmluR2V0VHVwbGVGb3JIZWFwQmxvY2sob3BhcXVlLT5ib19y bUFjY2VzcywgaGVhcEJsaywgJmJ1ZiwKKwkJCQkJCQkJCSAgICZvZmYsICZzaXplLCBCVUZG RVJfTE9DS19TSEFSRSwKKwkJCQkJCQkJCSAgIHNjYW4tPnhzX3NuYXBzaG90KTsKKwkJaWYg KHR1cCkKKwkJeworCQkJZ290dHVwbGUgPSB0cnVlOworCQkJYnR1cCA9IGJyaW5fY29weV90 dXBsZSh0dXAsIHNpemUsIGJ0dXAsICZidHVwc3opOworCQkJTG9ja0J1ZmZlcihidWYsIEJV RkZFUl9MT0NLX1VOTE9DSyk7CisJCX0KKworCQlyYW5nZS0+Ymxrbm9fc3RhcnQgPSBoZWFw QmxrOworCQlyYW5nZS0+Ymxrbm9fZW5kID0gaGVhcEJsayArIChwYWdlc1BlclJhbmdlIC0g MSk7CisKKwkJLyoKKwkJICogUmFuZ2VzIHdpdGggbm8gaW5kZXhlZCB0dXBsZSBtYXkgY29u dGFpbiBhbnl0aGluZy4KKwkJICovCisJCWlmICghZ290dHVwbGUpCisJCXsKKwkJCXJhbmdl LT5ub3Rfc3VtbWFyaXplZCA9IHRydWU7CisJCX0KKwkJZWxzZQorCQl7CisJCQlkdHVwID0g YnJpbl9kZWZvcm1fdHVwbGUoYmRlc2MsIGJ0dXAsIGR0dXApOworCQkJaWYgKGR0dXAtPmJ0 X3BsYWNlaG9sZGVyKQorCQkJeworCQkJCS8qCisJCQkJICogUGxhY2Vob2xkZXIgdHVwbGVz IGFyZSB0cmVhdGVkIGFzIGlmIG5vdCBwb3B1bGF0ZWQuCisJCQkJICoKKwkJCQkgKiBYWFgg SXMgdGhpcyBjb3JyZWN0PworCQkJCSAqLworCQkJCXJhbmdlLT5ub3Rfc3VtbWFyaXplZCA9 IHRydWU7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQnJpblZhbHVlcyAqYnZhbDsKKwor CQkJCWJ2YWwgPSAmZHR1cC0+YnRfY29sdW1uc1thdHRudW0gLSAxXTsKKworCQkJCXJhbmdl LT5oYXNfbnVsbHMgPSBidmFsLT5idl9oYXNudWxsczsKKwkJCQlyYW5nZS0+YWxsX251bGxz ID0gYnZhbC0+YnZfYWxsbnVsbHM7CisKKwkJCQlpZiAoIWJ2YWwtPmJ2X2FsbG51bGxzKQor CQkJCXsKKwkJCQkJLyogRklYTUUgY29weSB0aGUgdmFsdWVzLCBpZiBuZWVkZWQgKGUuZy4g dmFybGVuYSkgKi8KKwkJCQkJcmFuZ2UtPm1pbl92YWx1ZSA9IGJ2YWwtPmJ2X3ZhbHVlc1sw XTsKKwkJCQkJcmFuZ2UtPm1heF92YWx1ZSA9IGJ2YWwtPmJ2X3ZhbHVlc1sxXTsKKwkJCQl9 CisJCQl9CisJCX0KKwl9CisKKwlpZiAoYnVmICE9IEludmFsaWRCdWZmZXIpCisJCVJlbGVh c2VCdWZmZXIoYnVmKTsKKworCVBHX1JFVFVSTl9QT0lOVEVSKHJhbmdlcyk7Cit9CisKIC8q CiAgKiBDYWNoZSBhbmQgcmV0dXJuIHRoZSBwcm9jZWR1cmUgZm9yIHRoZSBnaXZlbiBzdHJh dGVneS4KICAqCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9jb21tYW5kcy9leHBsYWluLmMg Yi9zcmMvYmFja2VuZC9jb21tYW5kcy9leHBsYWluLmMKaW5kZXggZjg2OTgzYzY2MDEuLmUx NWIyOTI0NmIxIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9jb21tYW5kcy9leHBsYWluLmMK KysrIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvZXhwbGFpbi5jCkBAIC04NSw2ICs4NSw4IEBA IHN0YXRpYyB2b2lkIHNob3dfc29ydF9rZXlzKFNvcnRTdGF0ZSAqc29ydHN0YXRlLCBMaXN0 ICphbmNlc3RvcnMsCiAJCQkJCQkgICBFeHBsYWluU3RhdGUgKmVzKTsKIHN0YXRpYyB2b2lk IHNob3dfaW5jcmVtZW50YWxfc29ydF9rZXlzKEluY3JlbWVudGFsU29ydFN0YXRlICppbmNy c29ydHN0YXRlLAogCQkJCQkJCQkJICAgTGlzdCAqYW5jZXN0b3JzLCBFeHBsYWluU3RhdGUg KmVzKTsKK3N0YXRpYyB2b2lkIHNob3dfYnJpbnNvcnRfa2V5cyhCcmluU29ydFN0YXRlICpz b3J0c3RhdGUsIExpc3QgKmFuY2VzdG9ycywKKwkJCQkJCQkgICBFeHBsYWluU3RhdGUgKmVz KTsKIHN0YXRpYyB2b2lkIHNob3dfbWVyZ2VfYXBwZW5kX2tleXMoTWVyZ2VBcHBlbmRTdGF0 ZSAqbXN0YXRlLCBMaXN0ICphbmNlc3RvcnMsCiAJCQkJCQkJCSAgIEV4cGxhaW5TdGF0ZSAq ZXMpOwogc3RhdGljIHZvaWQgc2hvd19hZ2dfa2V5cyhBZ2dTdGF0ZSAqYXN0YXRlLCBMaXN0 ICphbmNlc3RvcnMsCkBAIC0xMTAwLDYgKzExMDIsNyBAQCBFeHBsYWluUHJlU2Nhbk5vZGUo UGxhblN0YXRlICpwbGFuc3RhdGUsIEJpdG1hcHNldCAqKnJlbHNfdXNlZCkKIAkJY2FzZSBU X0luZGV4U2NhbjoKIAkJY2FzZSBUX0luZGV4T25seVNjYW46CiAJCWNhc2UgVF9CaXRtYXBI ZWFwU2NhbjoKKwkJY2FzZSBUX0JyaW5Tb3J0OgogCQljYXNlIFRfVGlkU2NhbjoKIAkJY2Fz ZSBUX1RpZFJhbmdlU2NhbjoKIAkJY2FzZSBUX1N1YnF1ZXJ5U2NhbjoKQEAgLTEyNjIsNiAr MTI2NSw5IEBAIEV4cGxhaW5Ob2RlKFBsYW5TdGF0ZSAqcGxhbnN0YXRlLCBMaXN0ICphbmNl c3RvcnMsCiAJCWNhc2UgVF9JbmRleE9ubHlTY2FuOgogCQkJcG5hbWUgPSBzbmFtZSA9ICJJ bmRleCBPbmx5IFNjYW4iOwogCQkJYnJlYWs7CisJCWNhc2UgVF9CcmluU29ydDoKKwkJCXBu YW1lID0gc25hbWUgPSAiQlJJTiBTb3J0IjsKKwkJCWJyZWFrOwogCQljYXNlIFRfQml0bWFw SW5kZXhTY2FuOgogCQkJcG5hbWUgPSBzbmFtZSA9ICJCaXRtYXAgSW5kZXggU2NhbiI7CiAJ CQlicmVhazsKQEAgLTE1MDgsNiArMTUxNCwxNiBAQCBFeHBsYWluTm9kZShQbGFuU3RhdGUg KnBsYW5zdGF0ZSwgTGlzdCAqYW5jZXN0b3JzLAogCQkJCUV4cGxhaW5TY2FuVGFyZ2V0KChT Y2FuICopIGluZGV4b25seXNjYW4sIGVzKTsKIAkJCX0KIAkJCWJyZWFrOworCQljYXNlIFRf QnJpblNvcnQ6CisJCQl7CisJCQkJQnJpblNvcnQgICpicmluc29ydCA9IChCcmluU29ydCAq KSBwbGFuOworCisJCQkJRXhwbGFpbkluZGV4U2NhbkRldGFpbHMoYnJpbnNvcnQtPmluZGV4 aWQsCisJCQkJCQkJCQkJYnJpbnNvcnQtPmluZGV4b3JkZXJkaXIsCisJCQkJCQkJCQkJZXMp OworCQkJCUV4cGxhaW5TY2FuVGFyZ2V0KChTY2FuICopIGJyaW5zb3J0LCBlcyk7CisJCQl9 CisJCQlicmVhazsKIAkJY2FzZSBUX0JpdG1hcEluZGV4U2NhbjoKIAkJCXsKIAkJCQlCaXRt YXBJbmRleFNjYW4gKmJpdG1hcGluZGV4c2NhbiA9IChCaXRtYXBJbmRleFNjYW4gKikgcGxh bjsKQEAgLTE3OTAsNiArMTgwNiwxOCBAQCBFeHBsYWluTm9kZShQbGFuU3RhdGUgKnBsYW5z dGF0ZSwgTGlzdCAqYW5jZXN0b3JzLAogCQkJCUV4cGxhaW5Qcm9wZXJ0eUZsb2F0KCJIZWFw IEZldGNoZXMiLCBOVUxMLAogCQkJCQkJCQkJIHBsYW5zdGF0ZS0+aW5zdHJ1bWVudC0+bnR1 cGxlczIsIDAsIGVzKTsKIAkJCWJyZWFrOworCQljYXNlIFRfQnJpblNvcnQ6CisJCQlzaG93 X3NjYW5fcXVhbCgoKEJyaW5Tb3J0ICopIHBsYW4pLT5pbmRleHF1YWxvcmlnLAorCQkJCQkJ ICAgIkluZGV4IENvbmQiLCBwbGFuc3RhdGUsIGFuY2VzdG9ycywgZXMpOworCQkJaWYgKCgo QnJpblNvcnQgKikgcGxhbiktPmluZGV4cXVhbG9yaWcpCisJCQkJc2hvd19pbnN0cnVtZW50 YXRpb25fY291bnQoIlJvd3MgUmVtb3ZlZCBieSBJbmRleCBSZWNoZWNrIiwgMiwKKwkJCQkJ CQkJCQkgICBwbGFuc3RhdGUsIGVzKTsKKwkJCXNob3dfc2Nhbl9xdWFsKHBsYW4tPnF1YWws ICJGaWx0ZXIiLCBwbGFuc3RhdGUsIGFuY2VzdG9ycywgZXMpOworCQkJc2hvd19icmluc29y dF9rZXlzKGNhc3ROb2RlKEJyaW5Tb3J0U3RhdGUsIHBsYW5zdGF0ZSksIGFuY2VzdG9ycywg ZXMpOworCQkJaWYgKHBsYW4tPnF1YWwpCisJCQkJc2hvd19pbnN0cnVtZW50YXRpb25fY291 bnQoIlJvd3MgUmVtb3ZlZCBieSBGaWx0ZXIiLCAxLAorCQkJCQkJCQkJCSAgIHBsYW5zdGF0 ZSwgZXMpOworCQkJYnJlYWs7CiAJCWNhc2UgVF9CaXRtYXBJbmRleFNjYW46CiAJCQlzaG93 X3NjYW5fcXVhbCgoKEJpdG1hcEluZGV4U2NhbiAqKSBwbGFuKS0+aW5kZXhxdWFsb3JpZywK IAkJCQkJCSAgICJJbmRleCBDb25kIiwgcGxhbnN0YXRlLCBhbmNlc3RvcnMsIGVzKTsKQEAg LTIzODksNiArMjQxNywyMSBAQCBzaG93X2luY3JlbWVudGFsX3NvcnRfa2V5cyhJbmNyZW1l bnRhbFNvcnRTdGF0ZSAqaW5jcnNvcnRzdGF0ZSwKIAkJCQkJCSBhbmNlc3RvcnMsIGVzKTsK IH0KIAorLyoKKyAqIFNob3cgdGhlIHNvcnQga2V5cyBmb3IgYSBCUklOIFNvcnQgbm9kZS4K KyAqLworc3RhdGljIHZvaWQKK3Nob3dfYnJpbnNvcnRfa2V5cyhCcmluU29ydFN0YXRlICpz b3J0c3RhdGUsIExpc3QgKmFuY2VzdG9ycywgRXhwbGFpblN0YXRlICplcykKK3sKKwlCcmlu U29ydAkgICAqcGxhbiA9IChCcmluU29ydCAqKSBzb3J0c3RhdGUtPnNzLnBzLnBsYW47CisK KwlzaG93X3NvcnRfZ3JvdXBfa2V5cygoUGxhblN0YXRlICopIHNvcnRzdGF0ZSwgIlNvcnQg S2V5IiwKKwkJCQkJCSBwbGFuLT5udW1Db2xzLCAwLCBwbGFuLT5zb3J0Q29sSWR4LAorCQkJ CQkJIHBsYW4tPnNvcnRPcGVyYXRvcnMsIHBsYW4tPmNvbGxhdGlvbnMsCisJCQkJCQkgcGxh bi0+bnVsbHNGaXJzdCwKKwkJCQkJCSBhbmNlc3RvcnMsIGVzKTsKK30KKwogLyoKICAqIExp a2V3aXNlLCBmb3IgYSBNZXJnZUFwcGVuZCBub2RlLgogICovCkBAIC0zODEyLDYgKzM4NTUs NyBAQCBFeHBsYWluVGFyZ2V0UmVsKFBsYW4gKnBsYW4sIEluZGV4IHJ0aSwgRXhwbGFpblN0 YXRlICplcykKIAkJY2FzZSBUX0ZvcmVpZ25TY2FuOgogCQljYXNlIFRfQ3VzdG9tU2NhbjoK IAkJY2FzZSBUX01vZGlmeVRhYmxlOgorCQljYXNlIFRfQnJpblNvcnQ6CiAJCQkvKiBBc3Nl cnQgaXQncyBvbiBhIHJlYWwgcmVsYXRpb24gKi8KIAkJCUFzc2VydChydGUtPnJ0ZWtpbmQg PT0gUlRFX1JFTEFUSU9OKTsKIAkJCW9iamVjdG5hbWUgPSBnZXRfcmVsX25hbWUocnRlLT5y ZWxpZCk7CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9leGVjdXRvci9NYWtlZmlsZSBiL3Ny Yy9iYWNrZW5kL2V4ZWN1dG9yL01ha2VmaWxlCmluZGV4IDExMTE4ZDBjZTAyLi5iY2FhMmNl OGUyMSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvZXhlY3V0b3IvTWFrZWZpbGUKKysrIGIv c3JjL2JhY2tlbmQvZXhlY3V0b3IvTWFrZWZpbGUKQEAgLTM4LDYgKzM4LDcgQEAgT0JKUyA9 IFwKIAlub2RlQml0bWFwSGVhcHNjYW4ubyBcCiAJbm9kZUJpdG1hcEluZGV4c2Nhbi5vIFwK IAlub2RlQml0bWFwT3IubyBcCisJbm9kZUJyaW5Tb3J0Lm8gXAogCW5vZGVDdGVzY2FuLm8g XAogCW5vZGVDdXN0b20ubyBcCiAJbm9kZUZvcmVpZ25zY2FuLm8gXApkaWZmIC0tZ2l0IGEv c3JjL2JhY2tlbmQvZXhlY3V0b3IvZXhlY1Byb2Nub2RlLmMgYi9zcmMvYmFja2VuZC9leGVj dXRvci9leGVjUHJvY25vZGUuYwppbmRleCAzNjQwNmMzYWY1Ny4uNGE2ZGMzZjI2M2MgMTAw NjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL2V4ZWNQcm9jbm9kZS5jCisrKyBiL3Ny Yy9iYWNrZW5kL2V4ZWN1dG9yL2V4ZWNQcm9jbm9kZS5jCkBAIC03OSw2ICs3OSw3IEBACiAj aW5jbHVkZSAiZXhlY3V0b3Ivbm9kZUJpdG1hcEhlYXBzY2FuLmgiCiAjaW5jbHVkZSAiZXhl Y3V0b3Ivbm9kZUJpdG1hcEluZGV4c2Nhbi5oIgogI2luY2x1ZGUgImV4ZWN1dG9yL25vZGVC aXRtYXBPci5oIgorI2luY2x1ZGUgImV4ZWN1dG9yL25vZGVCcmluU29ydC5oIgogI2luY2x1 ZGUgImV4ZWN1dG9yL25vZGVDdGVzY2FuLmgiCiAjaW5jbHVkZSAiZXhlY3V0b3Ivbm9kZUN1 c3RvbS5oIgogI2luY2x1ZGUgImV4ZWN1dG9yL25vZGVGb3JlaWduc2Nhbi5oIgpAQCAtMjI2 LDYgKzIyNywxMSBAQCBFeGVjSW5pdE5vZGUoUGxhbiAqbm9kZSwgRVN0YXRlICplc3RhdGUs IGludCBlZmxhZ3MpCiAJCQkJCQkJCQkJCQkJCSBlc3RhdGUsIGVmbGFncyk7CiAJCQlicmVh azsKIAorCQljYXNlIFRfQnJpblNvcnQ6CisJCQlyZXN1bHQgPSAoUGxhblN0YXRlICopIEV4 ZWNJbml0QnJpblNvcnQoKEJyaW5Tb3J0ICopIG5vZGUsCisJCQkJCQkJCQkJCQkJZXN0YXRl LCBlZmxhZ3MpOworCQkJYnJlYWs7CisKIAkJY2FzZSBUX0JpdG1hcEluZGV4U2NhbjoKIAkJ CXJlc3VsdCA9IChQbGFuU3RhdGUgKikgRXhlY0luaXRCaXRtYXBJbmRleFNjYW4oKEJpdG1h cEluZGV4U2NhbiAqKSBub2RlLAogCQkJCQkJCQkJCQkJCQkgICBlc3RhdGUsIGVmbGFncyk7 CkBAIC02MzksNiArNjQ1LDEwIEBAIEV4ZWNFbmROb2RlKFBsYW5TdGF0ZSAqbm9kZSkKIAkJ CUV4ZWNFbmRJbmRleE9ubHlTY2FuKChJbmRleE9ubHlTY2FuU3RhdGUgKikgbm9kZSk7CiAJ CQlicmVhazsKIAorCQljYXNlIFRfQnJpblNvcnRTdGF0ZToKKwkJCUV4ZWNFbmRCcmluU29y dCgoQnJpblNvcnRTdGF0ZSAqKSBub2RlKTsKKwkJCWJyZWFrOworCiAJCWNhc2UgVF9CaXRt YXBJbmRleFNjYW5TdGF0ZToKIAkJCUV4ZWNFbmRCaXRtYXBJbmRleFNjYW4oKEJpdG1hcElu ZGV4U2NhblN0YXRlICopIG5vZGUpOwogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9zcmMvYmFj a2VuZC9leGVjdXRvci9ub2RlQnJpblNvcnQuYyBiL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL25v ZGVCcmluU29ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi5h ZDQ2MTY5YWVlMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL25v ZGVCcmluU29ydC5jCkBAIC0wLDAgKzEsMTUzOCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CisgKgorICogbm9kZUJyaW5Tb3J0LmMKKyAqCSAgUm91dGluZXMgdG8gc3VwcG9ydCBzb3J0 ZWQgc2NhbiBvZiByZWxhdGlvbnMgdXNpbmcgYSBCUklOIGluZGV4CisgKgorICogUG9ydGlv bnMgQ29weXJpZ2h0IChjKSAxOTk2LTIwMjIsIFBvc3RncmVTUUwgR2xvYmFsIERldmVsb3Bt ZW50IEdyb3VwCisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5OTQsIFJlZ2VudHMgb2Yg dGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQorICoKKyAqCisgKiBGSVhNRSBoYW5kbGlu ZyBvZiBvdGhlciBicmluIG9wY2xhc3NlcyAobWlubWF4LW11bHRpKQorICoKKyAqIEZJWE1F IGltcHJvdmUgY29zdGluZworICoKKyAqCisgKiBJbXByb3ZlbWVudCBpZGVhczoKKyAqCisg KiAxKSBtdWx0aXBsZSB0dXBsZXN0b3JlcyBmb3Igb3ZlcmxhcHBpbmcgcmFuZ2VzCisgKgor ICogV2hlbiB0aGVyZSBhcmUgbWFueSBvdmVybGFwcGluZyByYW5nZXMgKHNvIHRoYXQgbWF4 dmFsID4gY3VycmVudC5tYXh2YWwpLAorICogd2UncmUgbG9hZGluZyBhbGwgdGhlICJmdXR1 cmUiIHR1cGxlcyBpbnRvIGEgbmV3IHR1cGxlc3RvcmUuIEhvd2V2ZXIsIGlmCisgKiB0aGVy ZSBhcmUgbXVsdGlwbGUgc3VjaCByYW5nZXMgKGltYWdpbmUgcmFuZ2VzICJzaGlmdGluZyIg YnkgMTAlLCB3aGljaAorICogZ2l2ZXMgdXMgOSBtb3JlIHJhbmdlcyksIHdlIGtub3cgaW4g dGhlIG5leHQgcm91bmQgd2UnbGwgb25seSBuZWVkIHJvd3MKKyAqIHVudGlsIHRoZSBuZXh0 IG1heHZhbC4gV2UnbGwgbm90IHNvcnQgdGhlc2Ugcm93cywgYnV0IHdlJ2xsIHN0aWxsIHNo dWZmbGUKKyAqIHRoZW0gYXJvdW5kIHVudGlsIHdlIGdldCB0byB0aGUgcHJvcGVyIHJhbmdl IChzbyBhYm91dCAxMHggZWFjaCByb3cpLgorICogTWF5YmUgd2Ugc2hvdWxkIHByZS1hbGxv Y2F0ZSB0aGUgdHVwbGVzdG9yZXMgKG9yIG1heWJlIGV2ZW4gdHVwbGVzb3J0cykKKyAqIGZv ciBmdXR1cmUgcmFuZ2VzLCBhbmQgcm91dGUgdGhlIHR1cGxlcyB0byB0aGUgY29ycmVjdCBv bmU/IE1heWJlIHdlCisgKiBjb3VsZCBiZSBhIGJpdCBzbWFydGVyIGFuZCBkaXNjYXJkIHR1 cGxlcyBvbmNlIHdlIGhhdmUgZW5vdWdoIHJvd3MgZm9yCisgKiB0aGUgcHJlY2VkaW5nIHJh bmdlcyAoc2F5LCB3aXRoIExJTUlUIHF1ZXJpZXMpLiBXZSdkIGFsc28gbmVlZCB0byB3b3Jy eQorICogYWJvdXQgd29ya19tZW0sIHRob3VnaCAtIHdlIGNhbid0IGp1c3QgdXNlIG1hbnkg dHVwbGVzdG9yZXMsIGVhY2ggd2l0aAorICogd2hvbGUgd29ya19tZW0uIFNvIHdlJ2QgcHJv YmFibHkgdXNlIGUuZy4gd29ya19tZW0vMiBmb3IgdGhlIG5leHQgb25lLAorICogYW5kIHRo ZW4gLzQsIC84IGV0Yy4gZm9yIHRoZSBmb2xsb3dpbmcgb25lcy4gVGhhdCdzIHdvcmtfbWVt IGluIHRvdGFsLgorICogQW5kIHRoZXJlJ2QgbmVlZCB0byBiZSBzb21lIGxpbWl0IG9uIG51 bWJlciBvZiB0dXBsZXN0b3JlcywgSSBndWVzcy4KKyAqCisgKiAyKSBoYW5kbGluZyBOVUxM IHZhbHVlcworICoKKyAqIFdlIG5lZWQgdG8gaGFuZGxlIE5VTExTIEZJUlNUIC8gTlVMTFMg TEFTVCBjYXNlcy4gVGhlIHF1ZXN0aW9uIGlzIGhvdworICogdG8gZG8gdGhhdCAtIHRoZSBl YXNpZXN0IHdheSBpcyB0byBzaW1wbHkgZG8gYSBzZXBhcmF0ZSBzY2FuIG9mIHJhbmdlcwor ICogdGhhdCBtaWdodCBjb250YWluIE5VTEwgdmFsdWVzLCBwcm9jZXNzaW5nIGp1c3Qgcm93 cyB3aXRoIE5VTExzLCBhbmQKKyAqIGRpc2NhcmRpbmcgb3RoZXIgcm93cy4gQW5kIHRoZW4g cHJvY2VzcyBub24tTlVMTCB2YWx1ZXMgYXMgY3VycmVudGx5LgorICogVGhlIE5VTEwgc2Nh biB3b3VsZCBoYXBwZW4gYmVmb3JlL2FmdGVyIHRoaXMgcmVndWxhciBwaGFzZS4KKyAqCisg KiBCeXQgbWF5YmUgd2UgY291bGQgYmUgc21hcnRlciwgYW5kIG5vdCBkbyBzZXBhcmF0ZSBz Y2Fucy4gV2hlbiByZWFkaW5nCisgKiBhIHBhZ2UsIHdlIG1pZ2h0IHN0YXNoIHRoZSB0dXBs ZSBpbiBhIHR1cGxlc3RvcmUsIHNvIHRoYXQgd2UgY2FuIHJlYWQKKyAqIGl0IHRoZSBuZXh0 IHJvdW5kLiBPYnZpb3VzbHksIHRoaXMgbWlnaHQgYmUgZXhwZW5zaXZlIGlmIHdlIG5lZWQg dG8KKyAqIGtlZXAgdG9vIG1hbnkgcm93cywgc28gdGhlIHR1cGxlc3RvcmUgd291bGQgZ3Jv dyB0b28gbGFyZ2UgLSBpbiB0aGF0CisgKiBjYXNlIGl0IG1pZ2h0IGJlIGJldHRlciB0byBq dXN0IGRvIHRoZSB0d28gc2NhbnMuCisgKgorICogMykgcGFyYWxsZWxpc20KKyAqCisgKiBQ cmVzdW1hYmx5IHdlIGNvdWxkIGRvIGEgcGFyYWxsZWwgdmVyc2lvbiBvZiB0aGlzLiBUaGUg bGVhZGVyIG9yIGZpcnN0CisgKiB3b3JrZXIgd291bGQgcHJlcGFyZSB0aGUgcmFuZ2UgaW5m b3JtYXRpb24sIGFuZCB0aGUgd29ya2VycyB3b3VsZCB0aGVuCisgKiBncmFiIHJhbmdlcyAo aW4gYSBraW5kYSByb3VuZCByb2JpbiBtYW5uZXIpLCBzb3J0IHRoZW0gaW5kZXBlbmRlbnRs eSwKKyAqIGFuZCB0aGVuIHRoZSByZXN1bHRzIHdvdWxkIGJlIG1lcmdlZCBieSBHYXRoZXIg TWVyZ2UuCisgKgorICogSURFTlRJRklDQVRJT04KKyAqCSAgc3JjL2JhY2tlbmQvZXhlY3V0 b3Ivbm9kZUJyaW5Tb3J0LmMKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyoK KyAqIElOVEVSRkFDRSBST1VUSU5FUworICoJCUV4ZWNCcmluU29ydAkJCXNjYW5zIGEgcmVs YXRpb24gdXNpbmcgYW4gaW5kZXgKKyAqCQlJbmRleE5leHQJCQkJcmV0cmlldmUgbmV4dCB0 dXBsZSB1c2luZyBpbmRleAorICoJCUV4ZWNJbml0QnJpblNvcnQJCWNyZWF0ZXMgYW5kIGlu aXRpYWxpemVzIHN0YXRlIGluZm8uCisgKgkJRXhlY1JlU2NhbkJyaW5Tb3J0CQlyZXNjYW5z IHRoZSBpbmRleGVkIHJlbGF0aW9uLgorICoJCUV4ZWNFbmRCcmluU29ydAkJCXJlbGVhc2Vz IGFsbCBzdG9yYWdlLgorICoJCUV4ZWNCcmluU29ydE1hcmtQb3MJCW1hcmtzIHNjYW4gcG9z aXRpb24uCisgKgkJRXhlY0JyaW5Tb3J0UmVzdHJQb3MJcmVzdG9yZXMgc2NhbiBwb3NpdGlv bi4KKyAqCQlFeGVjQnJpblNvcnRFc3RpbWF0ZQllc3RpbWF0ZXMgRFNNIHNwYWNlIG5lZWRl ZCBmb3IgcGFyYWxsZWwgaW5kZXggc2NhbgorICoJCUV4ZWNCcmluU29ydEluaXRpYWxpemVE U00gaW5pdGlhbGl6ZSBEU00gZm9yIHBhcmFsbGVsIEJyaW5Tb3J0CisgKgkJRXhlY0JyaW5T b3J0UmVJbml0aWFsaXplRFNNIHJlaW5pdGlhbGl6ZSBEU00gZm9yIGZyZXNoIHNjYW4KKyAq CQlFeGVjQnJpblNvcnRJbml0aWFsaXplV29ya2VyIGF0dGFjaCB0byBEU00gaW5mbyBpbiBw YXJhbGxlbCB3b3JrZXIKKyAqLworI2luY2x1ZGUgInBvc3RncmVzLmgiCisKKyNpbmNsdWRl ICJhY2Nlc3MvYnJpbi5oIgorI2luY2x1ZGUgImFjY2Vzcy9icmluX2ludGVybmFsLmgiCisj aW5jbHVkZSAiYWNjZXNzL25idHJlZS5oIgorI2luY2x1ZGUgImFjY2Vzcy9yZWxzY2FuLmgi CisjaW5jbHVkZSAiYWNjZXNzL3RhYmxlLmgiCisjaW5jbHVkZSAiYWNjZXNzL3RhYmxlYW0u aCIKKyNpbmNsdWRlICJjYXRhbG9nL2luZGV4LmgiCisjaW5jbHVkZSAiY2F0YWxvZy9wZ19h bS5oIgorI2luY2x1ZGUgImV4ZWN1dG9yL2V4ZWNkZWJ1Zy5oIgorI2luY2x1ZGUgImV4ZWN1 dG9yL25vZGVCcmluU29ydC5oIgorI2luY2x1ZGUgImxpYi9wYWlyaW5naGVhcC5oIgorI2lu Y2x1ZGUgIm1pc2NhZG1pbi5oIgorI2luY2x1ZGUgIm5vZGVzL25vZGVGdW5jcy5oIgorI2lu Y2x1ZGUgInV0aWxzL2FycmF5LmgiCisjaW5jbHVkZSAidXRpbHMvZGF0dW0uaCIKKyNpbmNs dWRlICJ1dGlscy9sc3lzY2FjaGUuaCIKKyNpbmNsdWRlICJ1dGlscy9tZW11dGlscy5oIgor I2luY2x1ZGUgInV0aWxzL3JlbC5oIgorCisvKgorICogV2hlbiBhbiBvcmRlcmluZyBvcGVy YXRvciBpcyB1c2VkLCB0dXBsZXMgZmV0Y2hlZCBmcm9tIHRoZSBpbmRleCB0aGF0CisgKiBu ZWVkIHRvIGJlIHJlb3JkZXJlZCBhcmUgcXVldWVkIGluIGEgcGFpcmluZyBoZWFwLCBhcyBS ZW9yZGVyVHVwbGVzLgorICovCit0eXBlZGVmIHN0cnVjdAoreworCXBhaXJpbmdoZWFwX25v ZGUgcGhfbm9kZTsKKwlIZWFwVHVwbGUJaHR1cDsKKwlEYXR1bQkgICAqb3JkZXJieXZhbHM7 CisJYm9vbAkgICAqb3JkZXJieW51bGxzOworfSBSZW9yZGVyVHVwbGU7CisKK3N0YXRpYyBU dXBsZVRhYmxlU2xvdCAqSW5kZXhOZXh0KEJyaW5Tb3J0U3RhdGUgKm5vZGUpOworc3RhdGlj IGJvb2wgSW5kZXhSZWNoZWNrKEJyaW5Tb3J0U3RhdGUgKm5vZGUsIFR1cGxlVGFibGVTbG90 ICpzbG90KTsKK3N0YXRpYyB2b2lkIEV4ZWNJbml0QnJpblNvcnRSYW5nZXMoQnJpblNvcnQg Km5vZGUsIEJyaW5Tb3J0U3RhdGUgKnBsYW5zdGF0ZSk7CisKKy8qIGRvIHZhcmlvdXMgY29u c2lzdGVuY3kgY2hlY2tzICovCitzdGF0aWMgdm9pZAorQXNzZXJ0Q2hlY2tSYW5nZXMoQnJp blNvcnRTdGF0ZSAqbm9kZSkKK3sKKyNpZmRlZiBVU0VfQVNTRVJUX0NIRUNLSU5HCisKKwkv KiB0aGUgcHJpbWFyeSByYW5nZSBpbmRleCBoYXMgdG8gYmUgdmFsaWQgKi8KKwlBc3NlcnQo KDAgPD0gbm9kZS0+YnNfbmV4dF9yYW5nZSkgJiYKKwkJICAgKG5vZGUtPmJzX25leHRfcmFu Z2UgPD0gbm9kZS0+YnNfbnJhbmdlcykpOworCisJLyogdGhlIGludGVyc2VjdCByYW5nZSBp bmRleCBoYXMgdG8gYmUgdmFsaWQqLworCUFzc2VydCgoMCA8PSBub2RlLT5ic19uZXh0X3Jh bmdlX2ludGVyc2VjdCkgJiYKKwkJICAgKG5vZGUtPmJzX25leHRfcmFuZ2VfaW50ZXJzZWN0 IDw9IG5vZGUtPmJzX25yYW5nZXMpKTsKKworCS8qIGFsbCB0aGUgcmFuZ2VzIHVwIHRvIGJz X25leHRfcmFuZ2Ugc2hvdWxkIGJlIG1hcmtlZCBhcyBwcm9jZXNzZWQgKi8KKwlmb3IgKGlu dCBpID0gMDsgaSA8IG5vZGUtPmJzX25leHRfcmFuZ2U7IGkrKykKKwl7CisJCUJyaW5Tb3J0 UmFuZ2UgKnJhbmdlID0gJm5vZGUtPmJzX3Jhbmdlc1tpXTsKKwkJQXNzZXJ0KHJhbmdlLT5w cm9jZXNzZWQpOworCX0KKworCS8qIHNhbWUgZm9yIGJzX25leHRfcmFuZ2VfaW50ZXJzZWN0 ICovCisJZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlLT5ic19uZXh0X3JhbmdlX2ludGVyc2Vj dDsgaSsrKQorCXsKKwkJQnJpblNvcnRSYW5nZSAqcmFuZ2UgPSBub2RlLT5ic19yYW5nZXNf bWludmFsW2ldOworCQlBc3NlcnQocmFuZ2UtPnByb2Nlc3NlZCk7CisJfQorI2VuZGlmCit9 CisKKy8qCisgKiBicmluc29ydF9zdGFydF90aWRzY2FuCisgKgkJU3RhcnQgc2Nhbm5pbmcg dHVwbGVzIGZyb20gYSBnaXZlbiBwYWdlIHJhbmdlLgorICoKKyAqIFdlIG9wZW4gYSBUSUQg cmFuZ2Ugc2NhbiBmb3IgdGhlIGdpdmVuIHJhbmdlLCBhbmQgaW5pdGlhbGl6ZSB0aGUgdHVw bGVzb3J0LgorICogT3B0aW9uYWxseSwgd2UgdXBkYXRlIHRoZSB3YXRlcm1hcmsgKHdpdGgg ZWl0aGVyIGhpZ2gvbG93IHZhbHVlKS4gV2Ugb25seQorICogbmVlZCB0byBkbyB0aGlzIGZv ciB0aGUgbWFpbiBwYWdlIHJhbmdlLCBub3QgZm9yIHRoZSBpbnRlcnNlY3RpbmcgcmFuZ2Vz LgorICoKKyAqIFhYWCBNYXliZSB3ZSBzaG91bGQgaW5pdGlhbGl6ZSB0aGUgdGlkc2NhbiBv bmx5IG9uY2UsIGFuZCB0aGVuIGRvIHJlc2NhbgorICogZm9yIHRoZSBmb2xsb3dpbmcgcmFu Z2VzPyBBbmQgc2ltaWxhcmx5IGZvciB0aGUgdHVwbGVzb3J0PworICovCitzdGF0aWMgdm9p ZAorYnJpbnNvcnRfc3RhcnRfdGlkc2NhbihCcmluU29ydFN0YXRlICpub2RlLCBCcmluU29y dFJhbmdlICpyYW5nZSwKKwkJCQkJICAgYm9vbCB1cGRhdGVfd2F0ZXJtYXJrLCBib29sIG1h cmtfcHJvY2Vzc2VkKQoreworCUJyaW5Tb3J0ICAgKnBsYW4gPSAoQnJpblNvcnQgKikgbm9k ZS0+c3MucHMucGxhbjsKKwlFU3RhdGUJICAgKmVzdGF0ZSA9IG5vZGUtPnNzLnBzLnN0YXRl OworCisJLyoKKwkgKiBXaGVuIHNjYW5uaW5nIHRoZSByYW5nZSBkdXJpbmcgTlVMTCBwcm9j ZXNzaW5nLCBpbiB3aGljaCBjYXNlIHRoZSByYW5nZQorCSAqIG1pZ2h0IGJlIGFscmVhZHkg bWFya2VkIGFzIHByb2Nlc3NlZCAoZm9yIE5VTExTIExBU1QpLiBTbyB3ZSBvbmx5IGNoZWNr CisJICogdGhlIHBhZ2UgaXMgbm90IGFscmVheWQgbWFya2VkIGFzIHByb2Nlc3NlZCB3aGVu IHdlJ3JlIHN1cHBvc2VkIHRvIG1hcmsKKwkgKiBpdCBhcyBwcm9jZXNzZWQuCisJICovCisJ QXNzZXJ0KCEobWFya19wcm9jZXNzZWQgJiYgcmFuZ2UtPnByb2Nlc3NlZCkpOworCisJLyog VGhlcmUgbXVzdCBub3QgYmUgYW55IFRJRCBzY2FuIGluIHByb2dyZXNzIHlldC4gKi8KKwlB c3NlcnQobm9kZS0+c3Muc3NfY3VycmVudFNjYW5EZXNjID09IE5VTEwpOworCisJLyogSW5p dGlhbGl6ZSB0aGUgVElEIHJhbmdlIHNjYW4sIGZvciB0aGUgcHJvdmlkZWQgYmxvY2sgcmFu Z2UuICovCisJaWYgKG5vZGUtPnNzLnNzX2N1cnJlbnRTY2FuRGVzYyA9PSBOVUxMKQorCXsK KwkJVGFibGVTY2FuRGVzYwkJdHNjYW5kZXNjOworCQlJdGVtUG9pbnRlckRhdGEJCW1pbnRp ZCwKKwkJCQkJCQltYXh0aWQ7CisKKwkJSXRlbVBvaW50ZXJTZXRCbG9ja051bWJlcigmbWlu dGlkLCByYW5nZS0+Ymxrbm9fc3RhcnQpOworCQlJdGVtUG9pbnRlclNldE9mZnNldE51bWJl cigmbWludGlkLCAwKTsKKworCQlJdGVtUG9pbnRlclNldEJsb2NrTnVtYmVyKCZtYXh0aWQs IHJhbmdlLT5ibGtub19lbmQpOworCQlJdGVtUG9pbnRlclNldE9mZnNldE51bWJlcigmbWF4 dGlkLCBNYXhIZWFwVHVwbGVzUGVyUGFnZSk7CisKKwkJZWxvZyhERUJVRzEsICJsb2FkaW5n IHJhbmdlIGJsb2NrcyBbJXUsICV1XSIsCisJCQkgcmFuZ2UtPmJsa25vX3N0YXJ0LCByYW5n ZS0+Ymxrbm9fZW5kKTsKKworCQl0c2NhbmRlc2MgPSB0YWJsZV9iZWdpbnNjYW5fdGlkcmFu Z2Uobm9kZS0+c3Muc3NfY3VycmVudFJlbGF0aW9uLAorCQkJCQkJCQkJCQkgZXN0YXRlLT5l c19zbmFwc2hvdCwKKwkJCQkJCQkJCQkJICZtaW50aWQsICZtYXh0aWQpOworCQlub2RlLT5z cy5zc19jdXJyZW50U2NhbkRlc2MgPSB0c2NhbmRlc2M7CisJfQorCisJaWYgKG5vZGUtPmJz X3R1cGxlc29ydHN0YXRlID09IE5VTEwpCisJeworCQlUdXBsZURlc2MJdHVwRGVzYyA9IFJl bGF0aW9uR2V0RGVzY3Iobm9kZS0+c3Muc3NfY3VycmVudFJlbGF0aW9uKTsKKworCQlub2Rl LT5ic190dXBsZXNvcnRzdGF0ZSA9IHR1cGxlc29ydF9iZWdpbl9oZWFwKHR1cERlc2MsCisJ CQkJCQkJCQkJCQkJcGxhbi0+bnVtQ29scywKKwkJCQkJCQkJCQkJCQlwbGFuLT5zb3J0Q29s SWR4LAorCQkJCQkJCQkJCQkJCXBsYW4tPnNvcnRPcGVyYXRvcnMsCisJCQkJCQkJCQkJCQkJ cGxhbi0+Y29sbGF0aW9ucywKKwkJCQkJCQkJCQkJCQlwbGFuLT5udWxsc0ZpcnN0LAorCQkJ CQkJCQkJCQkJCXdvcmtfbWVtLAorCQkJCQkJCQkJCQkJCU5VTEwsCisJCQkJCQkJCQkJCQkJ VFVQTEVTT1JUX05PTkUpOworCX0KKworCWlmIChub2RlLT5ic190dXBsZXN0b3JlID09IE5V TEwpCisJeworCQlub2RlLT5ic190dXBsZXN0b3JlID0gdHVwbGVzdG9yZV9iZWdpbl9oZWFw KGZhbHNlLCBmYWxzZSwgd29ya19tZW0pOworCX0KKworCS8qCisJICogUmVtZW1iZXIgbWF4 aW11bSB2YWx1ZSBmb3IgdGhlIGN1cnJlbnQgcmFuZ2UgKGJ1dCBub3Qgd2hlbgorCSAqIHBy b2Nlc3Npbmcgb3ZlcmxhcHBpbmcgcmFuZ2VzKS4gV2Ugb25seSBkbyB0aGlzIGR1cmluZyB0 aGUKKwkgKiByZWd1bGFyIHR1cGxlIHByb2Nlc3NpbmcsIG5vdCB3aGVuIHNjYW5uaW5nIE5V TEwgdmFsdWVzLgorCSAqCisJICogV2UgdXNlIHRoZSBsYXJnZXIgdmFsdWUsIGFjY29yZGlu ZyB0byB0aGUgc29ydCBvcGVyYXRvciwgc28gdGhhdCB0aGlzCisJICogZ2V0cyB0aGUgcmln aHQgdmFsdWUgZXZlbiBmb3IgREVTQyBvcmRlcmluZyAoaW4gd2hpY2ggY2FzZSB0aGUgbG93 ZXIKKwkgKiBib3VuZGFyeSB3aWxsIGJlIGV2YWx1YXRlZCBhcyAiZ3JlYXRlciIpLgorCSAq CisJICogWFhYIENvdWxkIGFsc28gdXNlIHRoZSBzY2FuIGRpcmVjdGlvbiwgbGlrZSBpbiBv dGhlciBwbGFjZXMuCisJICovCisJaWYgKHVwZGF0ZV93YXRlcm1hcmspCisJeworCQlpbnQg Y21wID0gQXBwbHlTb3J0Q29tcGFyYXRvcihyYW5nZS0+bWluX3ZhbHVlLCBmYWxzZSwKKwkJ CQkJCQkJCSAgcmFuZ2UtPm1heF92YWx1ZSwgZmFsc2UsCisJCQkJCQkJCQkgICZub2RlLT5i c19zb3J0c3VwcG9ydCk7CisKKwkJaWYgKGNtcCA8IDApCisJCQlub2RlLT5ic193YXRlcm1h cmsgPSByYW5nZS0+bWF4X3ZhbHVlOworCQllbHNlCisJCQlub2RlLT5ic193YXRlcm1hcmsg PSByYW5nZS0+bWluX3ZhbHVlOworCX0KKworCS8qIE1heWJlIG1hcmsgdGhlIHJhbmdlIGFz IHByb2Nlc3NlZC4gKi8KKwlyYW5nZS0+cHJvY2Vzc2VkIHw9IG1hcmtfcHJvY2Vzc2VkOwor fQorCisvKgorICogYnJpbnNvcnRfZW5kX3RpZHNjYW4KKyAqCQlGaW5pc2ggdGhlIFRJRCBy YW5nZSBzY2FuLgorICovCitzdGF0aWMgdm9pZAorYnJpbnNvcnRfZW5kX3RpZHNjYW4oQnJp blNvcnRTdGF0ZSAqbm9kZSkKK3sKKwkvKiBnZXQgdGhlIGZpcnN0IHJhbmdlLCByZWFkIGFs bCB0dXBsZXMgdXNpbmcgYSB0aWQgcmFuZ2Ugc2NhbiAqLworCWlmIChub2RlLT5zcy5zc19j dXJyZW50U2NhbkRlc2MgIT0gTlVMTCkKKwl7CisJCXRhYmxlX2VuZHNjYW4obm9kZS0+c3Mu c3NfY3VycmVudFNjYW5EZXNjKTsKKwkJbm9kZS0+c3Muc3NfY3VycmVudFNjYW5EZXNjID0g TlVMTDsKKwl9Cit9CisKKy8qCisgKiBicmluc29ydF9sb2FkX3R1cGxlcworICoJCUxvYWQg dHVwbGVzIGZyb20gdGhlIFRJRCByYW5nZSBzY2FuLCBhZGQgdGhlbSB0byB0dXBsZXNvcnQv c3RvcmUuCisgKgorICogV2hlbiBjYWxsZWQgZm9yIHRoZSAiY3VycmVudCIgcmFuZ2UsIHdl IGRvbid0IG5lZWQgdG8gY2hlY2sgdGhlIHdhdGVybWFyaywKKyAqIHdlIGtub3cgdGhlIHR1 cGxlIGdvZXMgaW50byB0aGUgdHVwbGVzb3J0LiBTbyB3aXRoIGNoZWNrX3dhdGVybWFyayB3 ZQorICogc2tpcCB0aGUgY29tcGFyYXRvciBjYWxsIHRvIHNhdmUgQ1BVIGNvc3QuCisgKi8K K3N0YXRpYyB2b2lkCiticmluc29ydF9sb2FkX3R1cGxlcyhCcmluU29ydFN0YXRlICpub2Rl LCBib29sIGNoZWNrX3dhdGVybWFyaywgYm9vbCBudWxsX3Byb2Nlc3NpbmcpCit7CisJQnJp blNvcnQJICAgKnBsYW4gPSAoQnJpblNvcnQgKikgbm9kZS0+c3MucHMucGxhbjsKKwlUYWJs ZVNjYW5EZXNjCXNjYW4gPSBub2RlLT5zcy5zc19jdXJyZW50U2NhbkRlc2M7CisJRVN0YXRl CQkgICAqZXN0YXRlOworCVNjYW5EaXJlY3Rpb24JZGlyZWN0aW9uOworCVR1cGxlVGFibGVT bG90ICpzbG90OworCisJZXN0YXRlID0gbm9kZS0+c3MucHMuc3RhdGU7CisJZGlyZWN0aW9u ID0gZXN0YXRlLT5lc19kaXJlY3Rpb247CisKKwlzbG90ID0gbm9kZS0+c3Muc3NfU2NhblR1 cGxlU2xvdDsKKworCS8qCisJICogUmVhZCB0dXBsZXMsIGV2YWx1YXRlIHRoZSBmaWxlciAo c28gdGhhdCB3ZSBkb24ndCBrZWVwIHR1cGxlcyBvbmx5IHRvCisJICogZGlzY2FyZCB0aGVt IGxhdGVyKSwgYW5kIGRlY2lkZSBpZiBpdCBnb2VzIGludG8gdGhlIGN1cnJlbnQgcmFuZ2UK KwkgKiAodHVwbGVzb3J0KSBvciBvdmVyZmxvdyAodHVwbGVzdG9yZSkuCisJICovCisJd2hp bGUgKHRhYmxlX3NjYW5fZ2V0bmV4dHNsb3RfdGlkcmFuZ2Uoc2NhbiwgZGlyZWN0aW9uLCBz bG90KSkKKwl7CisJCUV4cHJDb250ZXh0ICplY29udGV4dDsKKwkJRXhwclN0YXRlICAqcXVh bDsKKworCQkvKgorCQkgKiBGZXRjaCBkYXRhIGZyb20gbm9kZQorCQkgKi8KKwkJcXVhbCA9 IG5vZGUtPmJzX3F1YWw7CisJCWVjb250ZXh0ID0gbm9kZS0+c3MucHMucHNfRXhwckNvbnRl eHQ7CisKKwkJLyoKKwkJICogcGxhY2UgdGhlIGN1cnJlbnQgdHVwbGUgaW50byB0aGUgZXhw ciBjb250ZXh0CisJCSAqLworCQllY29udGV4dC0+ZWN4dF9zY2FudHVwbGUgPSBzbG90Owor CisJCS8qCisJCSAqIGNoZWNrIHRoYXQgdGhlIGN1cnJlbnQgdHVwbGUgc2F0aXNmaWVzIHRo ZSBxdWFsLWNsYXVzZQorCQkgKgorCQkgKiBjaGVjayBmb3Igbm9uLW51bGwgcXVhbCBoZXJl IHRvIGF2b2lkIGEgZnVuY3Rpb24gY2FsbCB0byBFeGVjUXVhbCgpCisJCSAqIHdoZW4gdGhl IHF1YWwgaXMgbnVsbCAuLi4gc2F2ZXMgb25seSBhIGZldyBjeWNsZXMsIGJ1dCB0aGV5IGFk ZCB1cAorCQkgKiAuLi4KKwkJICoKKwkJICogWFhYIERvbmUgaGVyZSwgYmVjYXVzZSBpbiBF eGVjU2NhbiB3ZSdsbCBnZXQgZGlmZmVyZW50IHNsb3QgdHlwZQorCQkgKiAobWluaW1hbCB0 dXBsZSB2cy4gYnVmZmVyZWQgdHVwbGUpLiBTY2FuIGV4cGVjdHMgc2xvdCB3aGlsZSByZWFk aW5nCisJCSAqIGZyb20gdGhlIHRhYmxlIChsaWtlIGhlcmUpLCBidXQgd2UncmUgc3Rhc2hp bmcgaXQgaW50byBhIHR1cGxlc29ydC4KKwkJICoKKwkJICogWFhYIE1heWJlIHdlIGNvdWxk IGVsaW1pbmF0ZSBtYW55IHR1cGxlcyBieSBsZXZlcmFnaW5nIHRoZSBCUklOCisJCSAqIHJh bmdlLCBieSBleGVjdXRpbmcgdGhlIGNvbnNpc3RlbnQgZnVuY3Rpb24uIEJ1dCB3ZSBkb24n dCBoYXZlCisJCSAqIHRoZSBxdWFsIGluIGFwcHJvcHJpYXRlIGZvcm1hdCBhdCB0aGUgbW9t ZW50LCBzbyB3ZSdkIHByZXByb2Nlc3MKKwkJICogdGhlIGtleXMgc2ltaWxhcmx5IHRvIGJy aW5nZXRiaXRtYXAoKS4gSW4gd2hpY2ggY2FzZSB3ZSBzaG91bGQKKwkJICogcHJvYmFibHkg ZXZhbHVhdGUgdGhlIHN0dWZmIHdoaWxlIGJ1aWxkaW5nIHRoZSByYW5nZXM/IEFsdGhvdWdo LAorCQkgKiBpZiB0aGUgImNvbnNpc3RlbnQiIGZ1bmN0aW9uIGlzIGV4cGVuc2l2ZSwgaXQg bWlnaHQgYmUgY2hlYXBlcgorCQkgKiB0byBkbyB0aGF0IGluY3JlbWVudGFsbHksIGFzIHdl IG5lZWQgdGhlIHJhbmdlcy4gV291bGQgYmUgYSB3aW4KKwkJICogZm9yIExJTUlUIHF1ZXJp ZXMsIGZvciBleGFtcGxlLgorCQkgKgorCQkgKiBYWFggSG93ZXZlciwgbWF5YmUgd2UgY291 bGQgYWxzbyBsZXZlcmFnZSBvdGhlciBiaXRtYXAgaW5kZXhlcywKKwkJICogcGFydGljdWxh cmx5IGZvciBCUklOIGluZGV4ZXMgYmVjYXVzZSB0aGF0IG1ha2VzIGl0IHNpbXBsZXIgdG8K KwkJICogZWxpbWluYWdlIHRoZSByYW5nZXMgaW5jcmVtZW50YWxseSAtIHdlIGtub3cgd2hp Y2ggcmFuZ2VzIHRvCisJCSAqIGxvYWQgZnJvbSB0aGUgaW5kZXgsIHdoaWxlIGZvciBvdGhl ciBpbmRleGVzIChlLmcuIGJ0cmVlKSB3ZQorCQkgKiBoYXZlIHRvIHJlYWQgdGhlIHdob2xl IGluZGV4IGFuZCBidWlsZCBhIGJpdG1hcCBpbiBvcmRlciB0byBoYXZlCisJCSAqIGEgYml0 bWFwIGZvciBhbnkgcmFuZ2UuIEFsdGhvdWdoLCBpZiB0aGUgY29uZGl0aW9uIGlzIHZlcnkK KwkJICogc2VsZWN0aXZlLCB3ZSBtYXkgbmVlZCB0byByZWFkIG9ubHkgYSBzbWFsbCBmcmFj dGlvbiBvZiB0aGUKKwkJICogaW5kZXgsIHNvIG1heWJlIHRoYXQncyBPSy4KKwkJICovCisJ CWlmIChxdWFsID09IE5VTEwgfHwgRXhlY1F1YWwocXVhbCwgZWNvbnRleHQpKQorCQl7CisJ CQlpbnQJCWNtcCA9IDA7CS8qIG1hdHRlcnMgZm9yIGNoZWNrX3dhdGVybWFyaz1mYWxzZSAq LworCQkJRGF0dW0JdmFsdWU7CisJCQlib29sCWlzbnVsbDsKKworCQkJdmFsdWUgPSBzbG90 X2dldGF0dHIoc2xvdCwgcGxhbi0+c29ydENvbElkeFswXSwgJmlzbnVsbCk7CisKKwkJCS8q CisJCQkgKiBGSVhNRSBOb3QgaGFuZGxpbmcgTlVMTFMgZm9yIG5vdywgd2UgbmVlZCB0byBz dGFzaCB0aGVtIGludG8KKwkJCSAqIGEgc2VwYXJhdGUgdHVwbGVzdG9yZSAoc28gdGhhdCB3 ZSBjYW4gb3V0cHV0IHRoZW0gZmlyc3Qgb3IKKwkJCSAqIGxhc3QpLCBhbmQgdGhlbiBza2lw IHRoZW0gaW4gdGhlIHJlZ3VsYXIgcHJvY2Vzc2luZz8KKwkJCSAqLworCQkJaWYgKG51bGxf cHJvY2Vzc2luZykKKwkJCXsKKwkJCQkvKiBTdGFzaCBpdCB0byB0aGUgdHVwbGVzdG9yZSAo d2hlbiBOVUxMLCBvciBpZ25vcmUKKwkJCQkgKiBpdCAod2hlbiBub3QtTlVMTCkuICovCisJ CQkJaWYgKGlzbnVsbCkKKwkJCQkJdHVwbGVzdG9yZV9wdXR0dXBsZXNsb3Qobm9kZS0+YnNf dHVwbGVzdG9yZSwgc2xvdCk7CisKKwkJCQkvKiBOVUxMIG9yIG5vdCwgd2UncmUgZG9uZSAq LworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKiB3ZSdyZSBub3QgcHJvY2Vzc2luZyBO VUxMIHZhbHVlcywgc28gaWdub3JlIE5VTExzICovCisJCQlpZiAoaXNudWxsKQorCQkJCWNv bnRpbnVlOworCisJCQkvKgorCQkJICogT3RoZXJ3aXNlIGNvbXBhcmUgdG8gd2F0ZXJtYXJr LCBhbmQgc3Rhc2ggaXQgZWl0aGVyIHRvIHRoZQorCQkJICogdHVwbGVzb3J0IG9yIHR1cGxl c3RvcmUuCisJCQkgKi8KKwkJCWlmIChjaGVja193YXRlcm1hcmspCisJCQkJY21wID0gQXBw bHlTb3J0Q29tcGFyYXRvcih2YWx1ZSwgZmFsc2UsCisJCQkJCQkJCQkJICBub2RlLT5ic193 YXRlcm1hcmssIGZhbHNlLAorCQkJCQkJCQkJCSAgJm5vZGUtPmJzX3NvcnRzdXBwb3J0KTsK KworCQkJaWYgKGNtcCA8PSAwKQorCQkJCXR1cGxlc29ydF9wdXR0dXBsZXNsb3Qobm9kZS0+ YnNfdHVwbGVzb3J0c3RhdGUsIHNsb3QpOworCQkJZWxzZQorCQkJCXR1cGxlc3RvcmVfcHV0 dHVwbGVzbG90KG5vZGUtPmJzX3R1cGxlc3RvcmUsIHNsb3QpOworCQl9CisKKwkJRXhlY0Ns ZWFyVHVwbGUoc2xvdCk7CisJfQorCisJRXhlY0NsZWFyVHVwbGUoc2xvdCk7Cit9CisKKy8q CisgKiBicmluc29ydF9sb2FkX3NwaWxsX3R1cGxlcworICoJCUxvYWQgdHVwbGVzIGZyb20g dGhlIHNwaWxsIHR1cGxlc3RvcmUsIGFuZCBlaXRoZXIgc3Rhc2ggdGhlbSBpbnRvCisgKgkJ YSB0dXBsZXNvcnQgb3IgYSBuZXcgdHVwbGVzdG9yZS4KKyAqCisgKiBBZnRlciBwcm9jZXNz aW5nIHRoZSBsYXN0IHJhbmdlLCB3ZSB3YW50IHRvIHByb2Nlc3MgYWxsIHJlbWFpbmluZyBy YW5nZXMsCisgKiBzbyB3aXRoIGNoZWNrX3dhdGVybWFyaz1mYWxzZSB3ZSBza2lwIHRoZSBj aGVjay4KKyAqLworc3RhdGljIHZvaWQKK2JyaW5zb3J0X2xvYWRfc3BpbGxfdHVwbGVzKEJy aW5Tb3J0U3RhdGUgKm5vZGUsIGJvb2wgY2hlY2tfd2F0ZXJtYXJrKQoreworCUJyaW5Tb3J0 ICAgKnBsYW4gPSAoQnJpblNvcnQgKikgbm9kZS0+c3MucHMucGxhbjsKKwlUdXBsZXN0b3Jl c3RhdGUgKnR1cHN0b3JlOworCVR1cGxlVGFibGVTbG90ICpzbG90OworCisJaWYgKG5vZGUt PmJzX3R1cGxlc3RvcmUgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLyogc3RhcnQgc2Nhbm5p bmcgdGhlIGV4aXN0aW5nIHR1cGxlc3RvcmUgKFhYWCBuZWVkZWQ/KSAqLworCXR1cGxlc3Rv cmVfcmVzY2FuKG5vZGUtPmJzX3R1cGxlc3RvcmUpOworCisJLyoKKwkgKiBDcmVhdGUgYSBu ZXcgdHVwbGVzdG9yZSwgZm9yIHR1cGxlcyB0aGF0IGV4Y2VlZCB0aGUgd2F0ZXJtYXJrIGFu ZCBzbworCSAqIHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIGN1cnJlbnQgc29ydC4K KwkgKi8KKwl0dXBzdG9yZSA9IHR1cGxlc3RvcmVfYmVnaW5faGVhcChmYWxzZSwgZmFsc2Us IHdvcmtfbWVtKTsKKworCS8qCisJICogV2UgbmVlZCBhIHNsb3QgZm9yIG1pbmltYWwgdHVw bGVzLiBUaGUgc2NhbiBzbG90IHVzZXMgYnVmZmVyZWQgdHVwbGVzLAorCSAqIHNvIGl0J2Qg dHJpZ2dlciBhbiBlcnJvciBpbiB0aGUgbG9vcC4KKwkgKi8KKwlzbG90ID0gTWFrZVNpbmds ZVR1cGxlVGFibGVTbG90KFJlbGF0aW9uR2V0RGVzY3Iobm9kZS0+c3Muc3NfY3VycmVudFJl bGF0aW9uKSwKKwkJCQkJCQkJCSZUVFNPcHNNaW5pbWFsVHVwbGUpOworCisJd2hpbGUgKHR1 cGxlc3RvcmVfZ2V0dHVwbGVzbG90KG5vZGUtPmJzX3R1cGxlc3RvcmUsIHRydWUsIHRydWUs IHNsb3QpKQorCXsKKwkJaW50CQljbXAgPSAwOwkvKiBtYXR0ZXJzIGZvciBjaGVja193YXRl cm1hcms9ZmFsc2UgKi8KKwkJYm9vbAlpc251bGw7CisJCURhdHVtCXZhbHVlOworCisJCXZh bHVlID0gc2xvdF9nZXRhdHRyKHNsb3QsIHBsYW4tPnNvcnRDb2xJZHhbMF0sICZpc251bGwp OworCisJCS8qIFdlIHNob3VsZG4ndCBoYXZlIE5VTEwgdmFsdWVzIGluIHRoZSBzcGlsbCwg YXQgbGVhc3Qgbm90IG5vdy4gKi8KKwkJQXNzZXJ0KCFpc251bGwpOworCisJCWlmIChjaGVj a193YXRlcm1hcmspCisJCQljbXAgPSBBcHBseVNvcnRDb21wYXJhdG9yKHZhbHVlLCBmYWxz ZSwKKwkJCQkJCQkJCSAgbm9kZS0+YnNfd2F0ZXJtYXJrLCBmYWxzZSwKKwkJCQkJCQkJCSAg Jm5vZGUtPmJzX3NvcnRzdXBwb3J0KTsKKworCQlpZiAoY21wIDw9IDApCisJCQl0dXBsZXNv cnRfcHV0dHVwbGVzbG90KG5vZGUtPmJzX3R1cGxlc29ydHN0YXRlLCBzbG90KTsKKwkJZWxz ZQorCQkJdHVwbGVzdG9yZV9wdXR0dXBsZXNsb3QodHVwc3RvcmUsIHNsb3QpOworCX0KKwor CS8qCisJICogRGlzY2FyZCB0aGUgZXhpc3RpbmcgdHVwbGVzdG9yZSAodGhhdCB3ZSBqdXN0 IHByb2Nlc3NlZCksIHVzZSB0aGUgbmV3CisJICogb25lIGluc3RlYWQuCisJICovCisJdHVw bGVzdG9yZV9lbmQobm9kZS0+YnNfdHVwbGVzdG9yZSk7CisJbm9kZS0+YnNfdHVwbGVzdG9y ZSA9IHR1cHN0b3JlOworCisJRXhlY0Ryb3BTaW5nbGVUdXBsZVRhYmxlU2xvdChzbG90KTsK K30KKworLyoKKyAqIGJyaW5zb3J0X2xvYWRfaW50ZXJzZWN0aW5nX3JhbmdlcworICoJCUxv YWQgcmFuZ2VzIGludGVyc2VjdGluZyB3aXRoIHRoZSBjdXJyZW50IHdhdGVybWFyay4KKyAq CisgKiBUaGlzIGRvZXMgbm90IGluY3JlbWVudCBic19uZXh0X3JhbmdlLCBidXQgYnNfbmV4 dF9yYW5nZV9pbnRlcnNlY3QuCisgKi8KK3N0YXRpYyB2b2lkCiticmluc29ydF9sb2FkX2lu dGVyc2VjdGluZ19yYW5nZXMoQnJpblNvcnQgKnBsYW4sIEJyaW5Tb3J0U3RhdGUgKm5vZGUp Cit7CisJLyogbG9hZCBpbnRlcnNlY3RpbmcgcmFuZ2VzICovCisJZm9yIChpbnQgaSA9IG5v ZGUtPmJzX25leHRfcmFuZ2VfaW50ZXJzZWN0OyBpIDwgbm9kZS0+YnNfbnJhbmdlczsgaSsr KQorCXsKKwkJaW50CWNtcDsKKwkJQnJpblNvcnRSYW5nZSAgKnJhbmdlID0gbm9kZS0+YnNf cmFuZ2VzX21pbnZhbFtpXTsKKworCQkvKiBza2lwIGFscmVhZHkgcHJvY2Vzc2VkIHJhbmdl cyAqLworCQlpZiAocmFuZ2UtPnByb2Nlc3NlZCkKKwkJCWNvbnRpbnVlOworCisJCS8qCisJ CSAqIEFib3J0IG9uIHRoZSBmaXJzdCBhbGwtbnVsbCBvciBub3Qtc3VtbWFyaXplZCByYW5n ZS4gVGhlc2UgYXJlCisJCSAqIGludGVudGlvbmFsbHkga2VwdCBhdCB0aGUgZW5kLCBidXQg ZG9uJ3QgaW50ZXJzZWN0IHdpdGggYW55dGhpbmcuCisJCSAqLworCQlpZiAocmFuZ2UtPmFs bF9udWxscyB8fCByYW5nZS0+bm90X3N1bW1hcml6ZWQpCisJCQlicmVhazsKKworCQlpZiAo U2NhbkRpcmVjdGlvbklzRm9yd2FyZChwbGFuLT5pbmRleG9yZGVyZGlyKSkKKwkJCWNtcCA9 IEFwcGx5U29ydENvbXBhcmF0b3IocmFuZ2UtPm1pbl92YWx1ZSwgZmFsc2UsCisJCQkJCQkJ CQkgIG5vZGUtPmJzX3dhdGVybWFyaywgZmFsc2UsCisJCQkJCQkJCQkgICZub2RlLT5ic19z b3J0c3VwcG9ydCk7CisJCWVsc2UKKwkJCWNtcCA9IEFwcGx5U29ydENvbXBhcmF0b3IocmFu Z2UtPm1heF92YWx1ZSwgZmFsc2UsCisJCQkJCQkJCQkgIG5vZGUtPmJzX3dhdGVybWFyaywg ZmFsc2UsCisJCQkJCQkJCQkgICZub2RlLT5ic19zb3J0c3VwcG9ydCk7CisKKwkJLyoKKwkJ ICogTm8gcG9zc2libGUgb3ZlcmxhcCwgc28gYnJlYWssIHdlIGtub3cgYWxsIGZvbGxvd2lu ZyByYW5nZXMgaGF2ZQorCQkgKiBhIGhpZ2hlciBtaW52YWwgYW5kIHRodXMgY2FuJ3QgaW50 ZXJzZWN0IGVpdGhlci4KKwkJICovCisJCWlmIChjbXAgPiAwKQorCQkJYnJlYWs7CisKKwkJ bm9kZS0+YnNfbmV4dF9yYW5nZV9pbnRlcnNlY3QrKzsKKworCQllbG9nKERFQlVHMSwgImxv YWRpbmcgaW50ZXJzZWN0aW5nIHJhbmdlICVkICgldSwldSkgWyVsZCwlbGRdICVsZCIsIGks CisJCQkJCSAgcmFuZ2UtPmJsa25vX3N0YXJ0LCByYW5nZS0+Ymxrbm9fZW5kLAorCQkJCQkg IHJhbmdlLT5taW5fdmFsdWUsIHJhbmdlLT5tYXhfdmFsdWUsCisJCQkJCSAgbm9kZS0+YnNf d2F0ZXJtYXJrKTsKKworCQkvKiBsb2FkIHR1cGxlcyBmcm9tIHRoZSByYWdlLCBjaGVjayB0 aGUgd2F0ZXJtYXJrICovCisJCWJyaW5zb3J0X3N0YXJ0X3RpZHNjYW4obm9kZSwgcmFuZ2Us IGZhbHNlLCB0cnVlKTsKKwkJYnJpbnNvcnRfbG9hZF90dXBsZXMobm9kZSwgdHJ1ZSwgZmFs c2UpOworCQlicmluc29ydF9lbmRfdGlkc2Nhbihub2RlKTsKKwl9Cit9CisKKy8qCisgKiBi cmluc29ydF9sb2FkX3Vuc3VtbWFyaXplZF9yYW5nZXMKKyAqCQlMb2FkIHJhbmdlcyB0aGF0 IGRvbid0IGhhdmUgYSBwcm9wZXIgc3VtbWFyeSwgc28gd2UgZG9uJ3Qga25vdworICoJCXdo YXQgdmFsdWVzIGFyZSBpbiB0aGVtIChtaWdodCBiZSBldmVuIE5VTEwgdmFsdWVzKS4KKyAq CisgKiBXZSBzaW1wbHkgbG9hZCB0aGVtIGludG8gdGhlIHNwaWxsIHR1cGxlc3RvcmUsIGJl Y2F1c2UgdGhhdCdzIHRoZQorICogYmVzdCB0aGluZyB3ZSBjYW4gZG8uIFdlIGlnbm9yZSBO VUxMIHZhbHVlcyB0aG91Z2ggLSB0aG9zZSBhcmUgaGFuZGxlZAorICogaW4gYSBzZXBhcmF0 ZSBzdGVwLgorICovCitzdGF0aWMgdm9pZAorYnJpbnNvcnRfbG9hZF91bnN1bW1hcml6ZWRf cmFuZ2VzKEJyaW5Tb3J0ICpwbGFuLCBCcmluU29ydFN0YXRlICpub2RlKQoreworCS8qIFNo b3VsZCBiZSBjYWxsZWQgb25seSBvbmNlLCByaWdodCBhZnRlciB0aGUgZmlyc3QgcmFuZ2Uu ICovCisJQXNzZXJ0KG5vZGUtPmJzX25leHRfcmFuZ2UgPT0gMSk7CisKKwkvKiBsb2FkIHVu c3VtbWFyaXplZCByYW5nZXMgKi8KKwlmb3IgKGludCBpID0gMDsgaSA8IG5vZGUtPmJzX25y YW5nZXM7IGkrKykKKwl7CisJCUJyaW5Tb3J0UmFuZ2UgICpyYW5nZSA9IG5vZGUtPmJzX3Jh bmdlc19taW52YWxbaV07CisKKwkJLyogc2tpcCBhbHJlYWR5IHByb2Nlc3NlZCByYW5nZXMg KHRoZXJlIHNob3VsZCBiZSBqdXN0IG9uZSkgKi8KKwkJaWYgKHJhbmdlLT5wcm9jZXNzZWQp CisJCQljb250aW51ZTsKKworCQkvKiB3ZSdyZSBpbnRlcmVzdGVkIG9ubHkgaW4gbm90LXN1 bW1hcml6ZWQgcmFuZ2VzICovCisJCWlmICghcmFuZ2UtPm5vdF9zdW1tYXJpemVkKQorCQkJ Y29udGludWU7CisKKwkJZWxvZyhERUJVRzEsICJsb2FkaW5nIG5vdC1zdW1tYXJpemVkIHJh bmdlICVkICgldSwldSkgWyVsZCwlbGRdICVsZCIsIGksCisJCQkJCSAgcmFuZ2UtPmJsa25v X3N0YXJ0LCByYW5nZS0+Ymxrbm9fZW5kLAorCQkJCQkgIHJhbmdlLT5taW5fdmFsdWUsIHJh bmdlLT5tYXhfdmFsdWUsCisJCQkJCSAgbm9kZS0+YnNfd2F0ZXJtYXJrKTsKKworCQkvKgor CQkgKiBMb2FkIHR1cGxlcyBmcm9tIHRoZSByYWdlLCBjaGVjayB0aGUgd2F0ZXJtYXJrIGFu ZCBtYXJrIHRoZQorCQkgKiByYW5nZXMgYXMgcHJvY2Vzc2VkLgorCQkgKi8KKwkJYnJpbnNv cnRfc3RhcnRfdGlkc2Nhbihub2RlLCByYW5nZSwgZmFsc2UsIHRydWUpOworCQlicmluc29y dF9sb2FkX3R1cGxlcyhub2RlLCB0cnVlLCBmYWxzZSk7CisJCWJyaW5zb3J0X2VuZF90aWRz Y2FuKG5vZGUpOworCX0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJCUluZGV4TmV4dAorICoK KyAqCQlSZXRyaWV2ZSBhIHR1cGxlIGZyb20gdGhlIEJyaW5Tb3J0IG5vZGUncyBjdXJyZW50 UmVsYXRpb24KKyAqCQl1c2luZyB0aGUgaW5kZXggc3BlY2lmaWVkIGluIHRoZSBCcmluU29y dFN0YXRlIGluZm9ybWF0aW9uLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgVHVwbGVU YWJsZVNsb3QgKgorSW5kZXhOZXh0KEJyaW5Tb3J0U3RhdGUgKm5vZGUpCit7CisJQnJpblNv cnQgICAqcGxhbiA9IChCcmluU29ydCAqKSBub2RlLT5zcy5wcy5wbGFuOworCUVTdGF0ZQkg ICAqZXN0YXRlOworCVNjYW5EaXJlY3Rpb24gZGlyZWN0aW9uOworCUluZGV4U2NhbkRlc2Mg c2NhbmRlc2M7CisJVHVwbGVUYWJsZVNsb3QgKnNsb3Q7CisJYm9vbAkJbnVsbHNGaXJzdDsK KworCS8qCisJICogZXh0cmFjdCBuZWNlc3NhcnkgaW5mb3JtYXRpb24gZnJvbSBpbmRleCBz Y2FuIG5vZGUKKwkgKi8KKwllc3RhdGUgPSBub2RlLT5zcy5wcy5zdGF0ZTsKKwlkaXJlY3Rp b24gPSBlc3RhdGUtPmVzX2RpcmVjdGlvbjsKKworCS8qIGZsaXAgZGlyZWN0aW9uIGlmIHRo aXMgaXMgYW4gb3ZlcmFsbCBiYWNrd2FyZCBzY2FuICovCisJLyogWFhYIEZvciBCUklOIGlu ZGV4ZXMgdGhpcyBpcyBhbHdheXMgZm9yd2FyZCBkaXJlY3Rpb24gKi8KKwkvLyBpZiAoU2Nh bkRpcmVjdGlvbklzQmFja3dhcmQoKChCcmluU29ydCAqKSBub2RlLT5zcy5wcy5wbGFuKS0+ aW5kZXhvcmRlcmRpcikpCisJaWYgKGZhbHNlKQorCXsKKwkJaWYgKFNjYW5EaXJlY3Rpb25J c0ZvcndhcmQoZGlyZWN0aW9uKSkKKwkJCWRpcmVjdGlvbiA9IEJhY2t3YXJkU2NhbkRpcmVj dGlvbjsKKwkJZWxzZSBpZiAoU2NhbkRpcmVjdGlvbklzQmFja3dhcmQoZGlyZWN0aW9uKSkK KwkJCWRpcmVjdGlvbiA9IEZvcndhcmRTY2FuRGlyZWN0aW9uOworCX0KKwlzY2FuZGVzYyA9 IG5vZGUtPmlzc19TY2FuRGVzYzsKKwlzbG90ID0gbm9kZS0+c3Muc3NfU2NhblR1cGxlU2xv dDsKKworCW51bGxzRmlyc3QgPSBwbGFuLT5udWxsc0ZpcnN0WzBdOworCisJaWYgKHNjYW5k ZXNjID09IE5VTEwpCisJeworCQkvKgorCQkgKiBXZSByZWFjaCBoZXJlIGlmIHRoZSBpbmRl eCBzY2FuIGlzIG5vdCBwYXJhbGxlbCwgb3IgaWYgd2UncmUKKwkJICogc2VyaWFsbHkgZXhl Y3V0aW5nIGFuIGluZGV4IHNjYW4gdGhhdCB3YXMgcGxhbm5lZCB0byBiZSBwYXJhbGxlbC4K KwkJICovCisJCXNjYW5kZXNjID0gaW5kZXhfYmVnaW5zY2FuKG5vZGUtPnNzLnNzX2N1cnJl bnRSZWxhdGlvbiwKKwkJCQkJCQkJICAgbm9kZS0+aXNzX1JlbGF0aW9uRGVzYywKKwkJCQkJ CQkJICAgZXN0YXRlLT5lc19zbmFwc2hvdCwKKwkJCQkJCQkJICAgbm9kZS0+aXNzX051bVNj YW5LZXlzLAorCQkJCQkJCQkgICBub2RlLT5pc3NfTnVtT3JkZXJCeUtleXMpOworCisJCW5v ZGUtPmlzc19TY2FuRGVzYyA9IHNjYW5kZXNjOworCisJCS8qCisJCSAqIElmIG5vIHJ1bi10 aW1lIGtleXMgdG8gY2FsY3VsYXRlIG9yIHRoZXkgYXJlIHJlYWR5LCBnbyBhaGVhZCBhbmQK KwkJICogcGFzcyB0aGUgc2NhbmtleXMgdG8gdGhlIGluZGV4IEFNLgorCQkgKi8KKwkJaWYg KG5vZGUtPmlzc19OdW1SdW50aW1lS2V5cyA9PSAwIHx8IG5vZGUtPmlzc19SdW50aW1lS2V5 c1JlYWR5KQorCQkJaW5kZXhfcmVzY2FuKHNjYW5kZXNjLAorCQkJCQkJIG5vZGUtPmlzc19T Y2FuS2V5cywgbm9kZS0+aXNzX051bVNjYW5LZXlzLAorCQkJCQkJIG5vZGUtPmlzc19PcmRl ckJ5S2V5cywgbm9kZS0+aXNzX051bU9yZGVyQnlLZXlzKTsKKworCQkvKgorCQkgKiBMb2Fk IGluZm8gYWJvdXQgQlJJTiByYW5nZXMsIHNvcnQgdGhlbSB0byBtYXRjaCB0aGUgZGVzaXJl ZCBvcmRlcmluZy4KKwkJICovCisJCUV4ZWNJbml0QnJpblNvcnRSYW5nZXMocGxhbiwgbm9k ZSk7CisJCW5vZGUtPmJzX25leHRfcmFuZ2UgPSAwOworCQlub2RlLT5ic19uZXh0X3Jhbmdl X2ludGVyc2VjdCA9IDA7CisJCW5vZGUtPmJzX25leHRfcmFuZ2VfbnVsbHMgPSAwOworCQlu b2RlLT5ic19waGFzZSA9IEJSSU5TT1JUX1NUQVJUOworCisKKwkJLyogZHVtcCByYW5nZXMg Zm9yIGRlYnVnZ2luZyAqLworCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGUtPmJzX25yYW5n ZXM7IGkrKykKKwkJeworCQkJZWxvZyhERUJVRzEsICIlZCA9PiAoJXUsJXUpIFslbGQsJWxk XSIsIGksCisJCQkJIG5vZGUtPmJzX3Jhbmdlc1tpXS5ibGtub19zdGFydCwKKwkJCQkgbm9k ZS0+YnNfcmFuZ2VzW2ldLmJsa25vX2VuZCwKKwkJCQkgbm9kZS0+YnNfcmFuZ2VzW2ldLm1p bl92YWx1ZSwKKwkJCQkgbm9kZS0+YnNfcmFuZ2VzW2ldLm1heF92YWx1ZSk7CisJCX0KKwor CQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGUtPmJzX25yYW5nZXM7IGkrKykKKwkJeworCQkJ ZWxvZyhERUJVRzEsICJtaW52YWwgJWQgPT4gKCV1LCV1KSBbJWxkLCVsZF0iLCBpLAorCQkJ CSBub2RlLT5ic19yYW5nZXNfbWludmFsW2ldLT5ibGtub19zdGFydCwKKwkJCQkgbm9kZS0+ YnNfcmFuZ2VzX21pbnZhbFtpXS0+Ymxrbm9fZW5kLAorCQkJCSBub2RlLT5ic19yYW5nZXNf bWludmFsW2ldLT5taW5fdmFsdWUsCisJCQkJIG5vZGUtPmJzX3Jhbmdlc19taW52YWxbaV0t Pm1heF92YWx1ZSk7CisJCX0KKwl9CisKKwkvKgorCSAqIG9rLCBub3cgdGhhdCB3ZSBoYXZl IHdoYXQgd2UgbmVlZCwgZmV0Y2ggdGhlIG5leHQgdHVwbGUuCisJICovCisJd2hpbGUgKG5v ZGUtPmJzX3BoYXNlICE9IEJSSU5TT1JUX0ZJTklTSEVEKQorCXsKKwkJQ0hFQ0tfRk9SX0lO VEVSUlVQVFMoKTsKKworCQllbG9nKERFQlVHMSwgInBoYXNlID0gJWQiLCBub2RlLT5ic19w aGFzZSk7CisKKwkJQXNzZXJ0Q2hlY2tSYW5nZXMobm9kZSk7CisKKwkJc3dpdGNoIChub2Rl LT5ic19waGFzZSkKKwkJeworCQkJY2FzZSBCUklOU09SVF9TVEFSVDoKKwkJCQkvKgorCQkJ CSAqIElmIHdlIGhhdmUgTlVMTFMgRklSU1QsIG1vdmUgdG8gdGhhdCBzdGFnZS4gT3RoZXJ3 aXNlCisJCQkJICogc3RhcnQgc2Nhbm5pbmcgcmVndWxhciByYW5nZXMuCisJCQkJICovCisJ CQkJbm9kZS0+YnNfcGhhc2UgPSAobnVsbHNGaXJzdCkgPyBCUklOU09SVF9MT0FEX05VTExT IDogQlJJTlNPUlRfTE9BRF9SQU5HRTsKKworCQkJCWJyZWFrOworCisJCQljYXNlIEJSSU5T T1JUX0xPQURfUkFOR0U6CisJCQkJeworCQkJCQlCcmluU29ydFJhbmdlICpyYW5nZTsKKwor CQkJCQllbG9nKERFQlVHMSwgInBoYXNlID0gTE9BRF9SQU5HRSAlZCBvZiAlZCIsIG5vZGUt PmJzX25leHRfcmFuZ2UsIG5vZGUtPmJzX25yYW5nZXMpOworCisJCQkJCS8qCisJCQkJCSAq IFNvbWUgb2YgdGhlIHJhbmdlcyBtaWdodCBpbnRlcnNlY3Qgd2l0aCBhbHJlYWR5IHByb2Nl c3NlZAorCQkJCQkgKiByYW5nZSBhbmQgdGh1cyBoYXZlIGFscmVhZHkgYmVlbiBwcm9jZXNz ZWQsIHNvIHNraXAgdGhlbS4KKwkJCQkJICoKKwkJCQkJICogRklYTUUgU2hvdWxkIHRoaXMg Y2FyZSBhYm91dCBhbGwtbnVsbCAvIG5vdF9zdW1tYXJpemVkPworCQkJCQkgKi8KKwkJCQkJ d2hpbGUgKChub2RlLT5ic19uZXh0X3JhbmdlIDwgbm9kZS0+YnNfbnJhbmdlcykgJiYKKwkJ CQkJCSAgIChub2RlLT5ic19yYW5nZXNbbm9kZS0+YnNfbmV4dF9yYW5nZV0ucHJvY2Vzc2Vk KSkKKwkJCQkJCW5vZGUtPmJzX25leHRfcmFuZ2UrKzsKKworCQkJCQlBc3NlcnQobm9kZS0+ YnNfbmV4dF9yYW5nZSA8PSBub2RlLT5ic19ucmFuZ2VzKTsKKworCQkJCQkvKiBtaWdodCBw b2ludCBqdXN0IGFmdGVyIHRoZSBsYXN0IHJhbmdlICovCisJCQkJCXJhbmdlID0gJm5vZGUt PmJzX3Jhbmdlc1tub2RlLT5ic19uZXh0X3JhbmdlXTsKKworCQkJCQkvKgorCQkJCQkgKiBJ cyB0aGlzIHRoZSBsYXN0IHJlZ3VsYXIgcmFuZ2U/IFdlIG1pZ2h0IGhhdmUgZWl0aGVyIHJ1 bgorCQkJCQkgKiBvdXQgb2YgcmFuZ2VzIGluIGdlbmVyYWwsIG9yIG1heWJlIHdlIGp1c3Qg aGl0IHRoZSBmaXJzdAorCQkJCQkgKiBhbGwtbnVsbCBvciB1bnByb2Nlc3NlZCByYW5nZS4K KwkJCQkJICoKKwkJCQkJICogSW4gdGhpcyBjYXNlIHRoZXJlIG1pZ2h0IHN0aWxsIGJlIGEg YnVuY2ggb2YgdHVwbGVzIGluCisJCQkJCSAqIHRoZSB0dXBsZXN0b3JlLCBzbyB3ZSBuZWVk IHRvIHByb2Nlc3MgdGhlbSBwcm9wZXJseS4gV2UKKwkJCQkJICogbG9hZCB0aGVtIGludG8g dGhlIHR1cGxlc29ydCBhbmQgcHJvY2VzcyB0aGVtLgorCQkJCQkgKi8KKwkJCQkJaWYgKChu b2RlLT5ic19uZXh0X3JhbmdlID09IG5vZGUtPmJzX25yYW5nZXMpIHx8CisJCQkJCQkocmFu Z2UtPmFsbF9udWxscyB8fCByYW5nZS0+bm90X3N1bW1hcml6ZWQpKQorCQkJCQl7CisJCQkJ CQkvKiBzdGlsbCBzb21lIHR1cGxlcyB0byBwcm9jZXNzICovCisJCQkJCQlpZiAobm9kZS0+ YnNfdHVwbGVzdG9yZSAhPSBOVUxMKQorCQkJCQkJeworCQkJCQkJCWJyaW5zb3J0X2xvYWRf c3BpbGxfdHVwbGVzKG5vZGUsIGZhbHNlKTsKKwkJCQkJCQlub2RlLT5ic190dXBsZXN0b3Jl ID0gTlVMTDsKKwkJCQkJCQl0dXBsZXNvcnRfcGVyZm9ybXNvcnQobm9kZS0+YnNfdHVwbGVz b3J0c3RhdGUpOworCisJCQkJCQkJbm9kZS0+YnNfcGhhc2UgPSBCUklOU09SVF9QUk9DRVNT X1JBTkdFOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCisJCQkJCQkvKgorCQkJCQkJICog V2UndmUgcmVhY2hlZCB0aGUgZW5kLCBhbmQgdGhlcmUgYXJlIG5vIG1vcmUgcm93cyBpbiB0 aGUKKwkJCQkJCSAqIHR1cGxlc3RvcmUsIHNvIHdlJ3JlIGRvbmUuCisJCQkJCQkgKi8KKwkJ CQkJCWlmIChub2RlLT5ic19uZXh0X3JhbmdlID09IG5vZGUtPmJzX25yYW5nZXMpCisJCQkJ CQl7CisJCQkJCQkJZWxvZyhERUJVRzEsICJwaGFzZSA9PiBGSU5JU0hFRCAvIGxhc3QgcmFu Z2UgcHJvY2Vzc2VkIik7CisJCQkJCQkJbm9kZS0+YnNfcGhhc2UgPSAobnVsbHNGaXJzdCkg PyBCUklOU09SVF9GSU5JU0hFRCA6IEJSSU5TT1JUX0xPQURfTlVMTFM7CisJCQkJCQkJYnJl YWs7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQkvKiBGaW5lLCB3ZSBjYW4gcHJvY2VzcyB0 aGlzIHJhbmdlLCBzbyBtb3ZlIHRoZSBpbmRleCB0b28uICovCisJCQkJCW5vZGUtPmJzX25l eHRfcmFuZ2UrKzsKKworCQkJCQkvKgorCQkJCQkgKiBMb2FkIHRoZSBuZXh0IHVucHJvY2Vz c2VkIHJhbmdlLiBXZSB1cGRhdGUgdGhlIHdhdGVybWFyaywKKwkJCQkJICogc28gdGhhdCB3 ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGl0IHdoZW4gbG9hZGluZyB0dXBsZXMuCisJCQkJCSAq LworCQkJCQlicmluc29ydF9zdGFydF90aWRzY2FuKG5vZGUsIHJhbmdlLCB0cnVlLCB0cnVl KTsKKwkJCQkJYnJpbnNvcnRfbG9hZF90dXBsZXMobm9kZSwgZmFsc2UsIGZhbHNlKTsKKwkJ CQkJYnJpbnNvcnRfZW5kX3RpZHNjYW4obm9kZSk7CisKKwkJCQkJQXNzZXJ0KHJhbmdlLT5w cm9jZXNzZWQpOworCisJCQkJCS8qIExvYWQgbWF0Y2hpbmcgdHVwbGVzIGZyb20gdGhlIGN1 cnJlbnQgc3BpbGwgdHVwbGVzdG9yZS4gKi8KKwkJCQkJYnJpbnNvcnRfbG9hZF9zcGlsbF90 dXBsZXMobm9kZSwgdHJ1ZSk7CisKKwkJCQkJLyoKKwkJCQkJICogTG9hZCB0dXBsZXMgZnJv bSBpbnRlcnNlY3RpbmcgcmFuZ2VzLgorCQkJCQkgKgorCQkJCQkgKiBYWFggV2UgZG8gdGhp cyBhZnRlciBwcm9jZXNzaW5nIHRoZSBzcGlsbCB0dXBsZXN0b3JlLAorCQkJCQkgKiBiZWNh dXNlIHdlIHdpbGwgYWRkIHJvd3MgdG8gaXQgLSBidXQgd2Uga25vdyB0aG9zZSByb3dzCisJ CQkJCSAqIHNob3VsZCBiZSB0aGVyZSwgYW5kIGJyaW5zb3J0X2xvYWRfc3BpbGwgd291bGQg cmVjaGVjaworCQkJCQkgKiB0aGVtIGFnYWluIHVubmVjZXNzYXJpbHkuCisJCQkJCSAqLwor CQkJCQllbG9nKERFQlVHMSwgImxvYWRpbmcgaW50ZXJzZWN0aW5nIHJhbmdlcyIpOworCQkJ CQlicmluc29ydF9sb2FkX2ludGVyc2VjdGluZ19yYW5nZXMocGxhbiwgbm9kZSk7CisKKwkJ CQkJLyoKKwkJCQkJICogSWYgdGhpcyBpcyB0aGUgZmlyc3QgcmFuZ2UsIHByb2Nlc3MgdW5z dW1tYXJpemVkIHJhbmdlcworCQkJCQkgKiB0b28uIFNpbWlsYXJseSB0byB0aGUgaW50ZXJz ZWN0aW5nIHJhbmdlcywgd2UgZG8gdGhpcworCQkJCQkgKiBhZnRlciBsb2FkaW5nIHR1cGxl cyBmcm9tIHRoZSBzcGlsbCB0dXBsZXN0b3JlLCBiZWNhdXNlCisJCQkJCSAqIHdlIG1pZ2h0 IHdyaXRlIHNvbWUgKG1hbnkpIHR1cGxlcyBpbnRvIHRoYXQuCisJCQkJCSAqLworCQkJCQlp ZiAobm9kZS0+YnNfbmV4dF9yYW5nZSA9PSAxKQorCQkJCQkJYnJpbnNvcnRfbG9hZF91bnN1 bW1hcml6ZWRfcmFuZ2VzKHBsYW4sIG5vZGUpOworCisJCQkJCWVsb2coREVCVUcxLCAicGVy Zm9ybWluZyBzb3J0Iik7CisJCQkJCXR1cGxlc29ydF9wZXJmb3Jtc29ydChub2RlLT5ic190 dXBsZXNvcnRzdGF0ZSk7CisKKwkJCQkJbm9kZS0+YnNfcGhhc2UgPSBCUklOU09SVF9QUk9D RVNTX1JBTkdFOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWNhc2UgQlJJTlNPUlRfUFJP Q0VTU19SQU5HRToKKworCQkJCXNsb3QgPSBub2RlLT5zcy5wcy5wc19SZXN1bHRUdXBsZVNs b3Q7CisKKwkJCQkvKiByZWFkIHR1cGxlcyBmcm9tIHRoZSB0dXBsZXNvcnQgcmFuZ2UsIGFu ZCBvdXRwdXQgdGhlbSAqLworCQkJCWlmIChub2RlLT5ic190dXBsZXNvcnRzdGF0ZSAhPSBO VUxMKQorCQkJCXsKKwkJCQkJaWYgKHR1cGxlc29ydF9nZXR0dXBsZXNsb3Qobm9kZS0+YnNf dHVwbGVzb3J0c3RhdGUsCisJCQkJCQkJCQkJU2NhbkRpcmVjdGlvbklzRm9yd2FyZChkaXJl Y3Rpb24pLAorCQkJCQkJCQkJCWZhbHNlLCBzbG90LCBOVUxMKSkKKwkJCQkJCXJldHVybiBz bG90OworCisJCQkJCS8qIG9uY2Ugd2UncmUgZG9uZSB3aXRoIHRoZSB0dXBsZXNvcnQsIHJl c2V0IGl0ICovCisJCQkJCXR1cGxlc29ydF9yZXNldChub2RlLT5ic190dXBsZXNvcnRzdGF0 ZSk7CisJCQkJCW5vZGUtPmJzX3BoYXNlID0gQlJJTlNPUlRfTE9BRF9SQU5HRTsJLyogbG9h ZCBuZXh0IHJhbmdlICovCisJCQkJfQorCisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQlJJTlNP UlRfTE9BRF9OVUxMUzoKKwkJCQl7CisJCQkJCUJyaW5Tb3J0UmFuZ2UgKnJhbmdlOworCisJ CQkJCWVsb2coREVCVUcxLCAicGhhc2UgPSBMT0FEX05VTExTIik7CisKKwkJCQkJLyoKKwkJ CQkJICogSWdub3JlIHJhbmdlcyB0aGF0IGNhbid0IHBvc3NpYmx5IGhhdmUgTlVMTCB2YWx1 ZXMuIFdlIGRvCisJCQkJCSAqIG5vdCBjYXJlIGFib3V0IHdoZXRoZXIgdGhlIHJhbmdlIHdh cyBhbHJlYWR5IHByb2Nlc3NlZC4KKwkJCQkJICovCisJCQkJCXdoaWxlIChub2RlLT5ic19u ZXh0X3JhbmdlX251bGxzIDwgbm9kZS0+YnNfbnJhbmdlcykKKwkJCQkJeworCQkJCQkJLyog dGhlc2UgcmFuZ2VzIG1heSBoYXZlIE5VTEwgdmFsdWVzICovCisJCQkJCQlpZiAobm9kZS0+ YnNfcmFuZ2VzW25vZGUtPmJzX25leHRfcmFuZ2VfbnVsbHNdLmhhc19udWxscyB8fAorCQkJ CQkJCW5vZGUtPmJzX3Jhbmdlc1tub2RlLT5ic19uZXh0X3JhbmdlX251bGxzXS5hbGxfbnVs bHMgfHwKKwkJCQkJCQlub2RlLT5ic19yYW5nZXNbbm9kZS0+YnNfbmV4dF9yYW5nZV9udWxs c10ubm90X3N1bW1hcml6ZWQpCisJCQkJCQkJYnJlYWs7CisKKwkJCQkJCW5vZGUtPmJzX25l eHRfcmFuZ2VfbnVsbHMrKzsKKwkJCQkJfQorCisJCQkJCUFzc2VydChub2RlLT5ic19uZXh0 X3JhbmdlX251bGxzIDw9IG5vZGUtPmJzX25yYW5nZXMpOworCisJCQkJCS8qCisJCQkJCSAq IERpZCB3ZSBwcm9jZXNzIHRoZSBsYXN0IHJhbmdlPyBUaGVyZSBzaG91bGQgYmUgbm90aGlu ZyBsZWZ0CisJCQkJCSAqIGluIHRoZSB0dXBsZXN0b3JlLCBiZWNhdXNlIHdlIGZsdXNoIHRo YXQgYXQgdGhlIGVuZCBvZgorCQkJCQkgKiBwcm9jZXNzaW5nIHJlZ3VsYXIgdHVwbGVzLgor CQkJCQkgKi8KKwkJCQkJaWYgKG5vZGUtPmJzX25leHRfcmFuZ2VfbnVsbHMgPT0gbm9kZS0+ YnNfbnJhbmdlcykKKwkJCQkJeworCQkJCQkJZWxvZyhERUJVRzEsICJwaGFzZSA9PiBGSU5J U0hFRCAvIGxhc3QgcmFuZ2UgcHJvY2Vzc2VkIik7CisJCQkJCQlBc3NlcnQobm9kZS0+YnNf dHVwbGVzdG9yZSA9PSBOVUxMKTsKKwkJCQkJCW5vZGUtPmJzX3BoYXNlID0gQlJJTlNPUlRf RklOSVNIRUQ7CisJCQkJCQlub2RlLT5ic19waGFzZSA9IChudWxsc0ZpcnN0KSA/IEJSSU5T T1JUX0xPQURfUkFOR0UgOiBCUklOU09SVF9GSU5JU0hFRDsKKwkJCQkJCWJyZWFrOworCQkJ CQl9CisKKwkJCQkJcmFuZ2UgPSAmbm9kZS0+YnNfcmFuZ2VzW25vZGUtPmJzX25leHRfcmFu Z2VfbnVsbHNdOworCQkJCQlub2RlLT5ic19uZXh0X3JhbmdlX251bGxzKys7CisKKwkJCQkJ LyoKKwkJCQkJICogTG9hZCB0aGUgbmV4dCB1bnByb2Nlc3NlZCByYW5nZS4gV2UgdXBkYXRl IHRoZSB3YXRlcm1hcmssCisJCQkJCSAqIHNvIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byBjaGVj ayBpdCB3aGVuIGxvYWRpbmcgdHVwbGVzLgorCQkJCQkgKi8KKwkJCQkJYnJpbnNvcnRfc3Rh cnRfdGlkc2Nhbihub2RlLCByYW5nZSwgZmFsc2UsIGZhbHNlKTsKKwkJCQkJYnJpbnNvcnRf bG9hZF90dXBsZXMobm9kZSwgdHJ1ZSwgdHJ1ZSk7CisJCQkJCWJyaW5zb3J0X2VuZF90aWRz Y2FuKG5vZGUpOworCisJCQkJCW5vZGUtPmJzX3BoYXNlID0gQlJJTlNPUlRfUFJPQ0VTU19O VUxMUzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQlJJ TlNPUlRfUFJPQ0VTU19OVUxMUzoKKworCQkJCXNsb3QgPSBub2RlLT5zcy5wcy5wc19SZXN1 bHRUdXBsZVNsb3Q7CisKKwkJCQlBc3NlcnQobm9kZS0+YnNfdHVwbGVzdG9yZSAhPSBOVUxM KTsKKworCQkJCS8qIHJlYWQgdHVwbGVzIGZyb20gdGhlIHR1cGxlc29ydCByYW5nZSwgYW5k IG91dHB1dCB0aGVtICovCisJCQkJaWYgKG5vZGUtPmJzX3R1cGxlc3RvcmUgIT0gTlVMTCkK KwkJCQl7CisKKwkJCQkJd2hpbGUgKHR1cGxlc3RvcmVfZ2V0dHVwbGVzbG90KG5vZGUtPmJz X3R1cGxlc3RvcmUsIHRydWUsIHRydWUsIHNsb3QpKQorCQkJCQkJcmV0dXJuIHNsb3Q7CisK KwkJCQkJdHVwbGVzdG9yZV9lbmQobm9kZS0+YnNfdHVwbGVzdG9yZSk7CisJCQkJCW5vZGUt PmJzX3R1cGxlc3RvcmUgPSBOVUxMOworCisJCQkJCW5vZGUtPmJzX3BoYXNlID0gQlJJTlNP UlRfTE9BRF9OVUxMUzsJLyogbG9hZCBuZXh0IHJhbmdlICovCisJCQkJfQorCisJCQkJYnJl YWs7CisKKwkJCWNhc2UgQlJJTlNPUlRfRklOSVNIRUQ6CisJCQkJZWxvZyhFUlJPUiwgInVu ZXhwZWN0ZWQgQnJpblNvcnQgcGhhc2U6IEZJTklTSEVEIik7CisJCQkJYnJlYWs7CisJCX0K Kwl9CisKKwkvKgorCSAqIGlmIHdlIGdldCBoZXJlIGl0IG1lYW5zIHRoZSBpbmRleCBzY2Fu IGZhaWxlZCBzbyB3ZSBhcmUgYXQgdGhlIGVuZCBvZgorCSAqIHRoZSBzY2FuLi4KKwkgKi8K Kwlub2RlLT5pc3NfUmVhY2hlZEVuZCA9IHRydWU7CisJcmV0dXJuIEV4ZWNDbGVhclR1cGxl KHNsb3QpOworfQorCisvKgorICogSW5kZXhSZWNoZWNrIC0tIGFjY2VzcyBtZXRob2Qgcm91 dGluZSB0byByZWNoZWNrIGEgdHVwbGUgaW4gRXZhbFBsYW5RdWFsCisgKi8KK3N0YXRpYyBi b29sCitJbmRleFJlY2hlY2soQnJpblNvcnRTdGF0ZSAqbm9kZSwgVHVwbGVUYWJsZVNsb3Qg KnNsb3QpCit7CisJRXhwckNvbnRleHQgKmVjb250ZXh0OworCisJLyoKKwkgKiBleHRyYWN0 IG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBmcm9tIGluZGV4IHNjYW4gbm9kZQorCSAqLworCWVj b250ZXh0ID0gbm9kZS0+c3MucHMucHNfRXhwckNvbnRleHQ7CisKKwkvKiBEb2VzIHRoZSB0 dXBsZSBtZWV0IHRoZSBpbmRleHF1YWwgY29uZGl0aW9uPyAqLworCWVjb250ZXh0LT5lY3h0 X3NjYW50dXBsZSA9IHNsb3Q7CisJcmV0dXJuIEV4ZWNRdWFsQW5kUmVzZXQobm9kZS0+aW5k ZXhxdWFsb3JpZywgZWNvbnRleHQpOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCQlFeGVj QnJpblNvcnQobm9kZSkKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIFR1cGxlVGFibGVT bG90ICoKK0V4ZWNCcmluU29ydChQbGFuU3RhdGUgKnBzdGF0ZSkKK3sKKwlCcmluU29ydFN0 YXRlICpub2RlID0gY2FzdE5vZGUoQnJpblNvcnRTdGF0ZSwgcHN0YXRlKTsKKworCS8qCisJ ICogSWYgd2UgaGF2ZSBydW50aW1lIGtleXMgYW5kIHRoZXkndmUgbm90IGFscmVhZHkgYmVl biBzZXQgdXAsIGRvIGl0IG5vdy4KKwkgKi8KKwlpZiAobm9kZS0+aXNzX051bVJ1bnRpbWVL ZXlzICE9IDAgJiYgIW5vZGUtPmlzc19SdW50aW1lS2V5c1JlYWR5KQorCQlFeGVjUmVTY2Fu KChQbGFuU3RhdGUgKikgbm9kZSk7CisKKwlyZXR1cm4gRXhlY1NjYW4oJm5vZGUtPnNzLAor CQkJCQkoRXhlY1NjYW5BY2Nlc3NNdGQpIEluZGV4TmV4dCwKKwkJCQkJKEV4ZWNTY2FuUmVj aGVja010ZCkgSW5kZXhSZWNoZWNrKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJCUV4ZWNS ZVNjYW5CcmluU29ydChub2RlKQorICoKKyAqCQlSZWNhbGN1bGF0ZXMgdGhlIHZhbHVlcyBv ZiBhbnkgc2NhbiBrZXlzIHdob3NlIHZhbHVlIGRlcGVuZHMgb24KKyAqCQlpbmZvcm1hdGlv biBrbm93biBhdCBydW50aW1lLCB0aGVuIHJlc2NhbnMgdGhlIGluZGV4ZWQgcmVsYXRpb24u CisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit2b2lkCitFeGVjUmVTY2FuQnJpblNvcnQoQnJp blNvcnRTdGF0ZSAqbm9kZSkKK3sKKwkvKgorCSAqIElmIHdlIGFyZSBkb2luZyBydW50aW1l IGtleSBjYWxjdWxhdGlvbnMgKGllLCBhbnkgb2YgdGhlIGluZGV4IGtleQorCSAqIHZhbHVl cyB3ZXJlbid0IHNpbXBsZSBDb25zdHMpLCBjb21wdXRlIHRoZSBuZXcga2V5IHZhbHVlcy4g IEJ1dCBmaXJzdCwKKwkgKiByZXNldCB0aGUgY29udGV4dCBzbyB3ZSBkb24ndCBsZWFrIG1l bW9yeSBhcyBlYWNoIG91dGVyIHR1cGxlIGlzCisJICogc2Nhbm5lZC4gIE5vdGUgdGhpcyBh c3N1bWVzIHRoYXQgd2Ugd2lsbCByZWNhbGN1bGF0ZSAqYWxsKiBydW50aW1lIGtleXMKKwkg KiBvbiBlYWNoIGNhbGwuCisJICovCisJaWYgKG5vZGUtPmlzc19OdW1SdW50aW1lS2V5cyAh PSAwKQorCXsKKwkJRXhwckNvbnRleHQgKmVjb250ZXh0ID0gbm9kZS0+aXNzX1J1bnRpbWVD b250ZXh0OworCisJCVJlc2V0RXhwckNvbnRleHQoZWNvbnRleHQpOworCQlFeGVjSW5kZXhF dmFsUnVudGltZUtleXMoZWNvbnRleHQsCisJCQkJCQkJCSBub2RlLT5pc3NfUnVudGltZUtl eXMsCisJCQkJCQkJCSBub2RlLT5pc3NfTnVtUnVudGltZUtleXMpOworCX0KKwlub2RlLT5p c3NfUnVudGltZUtleXNSZWFkeSA9IHRydWU7CisKKwkvKiByZXNldCBpbmRleCBzY2FuICov CisJaWYgKG5vZGUtPmlzc19TY2FuRGVzYykKKwkJaW5kZXhfcmVzY2FuKG5vZGUtPmlzc19T Y2FuRGVzYywKKwkJCQkJIG5vZGUtPmlzc19TY2FuS2V5cywgbm9kZS0+aXNzX051bVNjYW5L ZXlzLAorCQkJCQkgbm9kZS0+aXNzX09yZGVyQnlLZXlzLCBub2RlLT5pc3NfTnVtT3JkZXJC eUtleXMpOworCW5vZGUtPmlzc19SZWFjaGVkRW5kID0gZmFsc2U7CisKKwlFeGVjU2NhblJl U2Nhbigmbm9kZS0+c3MpOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCQlFeGVjRW5kQnJp blNvcnQKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwordm9pZAorRXhlY0VuZEJyaW5Tb3J0KEJyaW5T b3J0U3RhdGUgKm5vZGUpCit7CisJUmVsYXRpb24JaW5kZXhSZWxhdGlvbkRlc2M7CisJSW5k ZXhTY2FuRGVzYyBJbmRleFNjYW5EZXNjOworCisJLyoKKwkgKiBleHRyYWN0IGluZm9ybWF0 aW9uIGZyb20gdGhlIG5vZGUKKwkgKi8KKwlpbmRleFJlbGF0aW9uRGVzYyA9IG5vZGUtPmlz c19SZWxhdGlvbkRlc2M7CisJSW5kZXhTY2FuRGVzYyA9IG5vZGUtPmlzc19TY2FuRGVzYzsK KworCS8qCisJICogY2xlYXIgb3V0IHR1cGxlIHRhYmxlIHNsb3RzCisJICovCisJaWYgKG5v ZGUtPnNzLnBzLnBzX1Jlc3VsdFR1cGxlU2xvdCkKKwkJRXhlY0NsZWFyVHVwbGUobm9kZS0+ c3MucHMucHNfUmVzdWx0VHVwbGVTbG90KTsKKwlFeGVjQ2xlYXJUdXBsZShub2RlLT5zcy5z c19TY2FuVHVwbGVTbG90KTsKKworCS8qCisJICogY2xvc2UgdGhlIGluZGV4IHJlbGF0aW9u IChuby1vcCBpZiB3ZSBkaWRuJ3Qgb3BlbiBpdCkKKwkgKi8KKwlpZiAoSW5kZXhTY2FuRGVz YykKKwkJaW5kZXhfZW5kc2NhbihJbmRleFNjYW5EZXNjKTsKKwlpZiAoaW5kZXhSZWxhdGlv bkRlc2MpCisJCWluZGV4X2Nsb3NlKGluZGV4UmVsYXRpb25EZXNjLCBOb0xvY2spOworCisJ aWYgKG5vZGUtPnNzLnNzX2N1cnJlbnRTY2FuRGVzYyAhPSBOVUxMKQorCQl0YWJsZV9lbmRz Y2FuKG5vZGUtPnNzLnNzX2N1cnJlbnRTY2FuRGVzYyk7CisKKwlpZiAobm9kZS0+YnNfdHVw bGVzdG9yZSAhPSBOVUxMKQorCQl0dXBsZXN0b3JlX2VuZChub2RlLT5ic190dXBsZXN0b3Jl KTsKKwlub2RlLT5ic190dXBsZXN0b3JlID0gTlVMTDsKKworCWlmIChub2RlLT5ic190dXBs ZXNvcnRzdGF0ZSAhPSBOVUxMKQorCQl0dXBsZXNvcnRfZW5kKG5vZGUtPmJzX3R1cGxlc29y dHN0YXRlKTsKKwlub2RlLT5ic190dXBsZXNvcnRzdGF0ZSA9IE5VTEw7Cit9CisKKy8qIC0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KKyAqCQlFeGVjQnJpblNvcnRNYXJrUG9zCisgKgorICogTm90ZTogd2UgYXNz dW1lIHRoYXQgbm8gY2FsbGVyIGF0dGVtcHRzIHRvIHNldCBhIG1hcmsgYmVmb3JlIGhhdmlu ZyByZWFkCisgKiBhdCBsZWFzdCBvbmUgdHVwbGUuICBPdGhlcndpc2UsIGlzc19TY2FuRGVz YyBtaWdodCBzdGlsbCBiZSBOVUxMLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit2b2lkCitFeGVj QnJpblNvcnRNYXJrUG9zKEJyaW5Tb3J0U3RhdGUgKm5vZGUpCit7CisJRVN0YXRlCSAgICpl c3RhdGUgPSBub2RlLT5zcy5wcy5zdGF0ZTsKKwlFUFFTdGF0ZSAgICplcHFzdGF0ZSA9IGVz dGF0ZS0+ZXNfZXBxX2FjdGl2ZTsKKworCWlmIChlcHFzdGF0ZSAhPSBOVUxMKQorCXsKKwkJ LyoKKwkJICogV2UgYXJlIGluc2lkZSBhbiBFdmFsUGxhblF1YWwgcmVjaGVjay4gIElmIGEg dGVzdCB0dXBsZSBleGlzdHMgZm9yCisJCSAqIHRoaXMgcmVsYXRpb24sIHRoZW4gd2Ugc2hv dWxkbid0IGFjY2VzcyB0aGUgaW5kZXggYXQgYWxsLiAgV2Ugd291bGQKKwkJICogaW5zdGVh ZCBuZWVkIHRvIHNhdmUsIGFuZCBsYXRlciByZXN0b3JlLCB0aGUgc3RhdGUgb2YgdGhlCisJ CSAqIHJlbHN1YnNfZG9uZSBmbGFnLCBzbyB0aGF0IHJlLWZldGNoaW5nIHRoZSB0ZXN0IHR1 cGxlIGlzIHBvc3NpYmxlLgorCQkgKiBIb3dldmVyLCBnaXZlbiB0aGUgYXNzdW1wdGlvbiB0 aGF0IG5vIGNhbGxlciBzZXRzIGEgbWFyayBhdCB0aGUKKwkJICogc3RhcnQgb2YgdGhlIHNj YW4sIHdlIGNhbiBvbmx5IGdldCBoZXJlIHdpdGggcmVsc3Vic19kb25lW2ldCisJCSAqIGFs cmVhZHkgc2V0LCBhbmQgc28gbm8gc3RhdGUgbmVlZCBiZSBzYXZlZC4KKwkJICovCisJCUlu ZGV4CQlzY2FucmVsaWQgPSAoKFNjYW4gKikgbm9kZS0+c3MucHMucGxhbiktPnNjYW5yZWxp ZDsKKworCQlBc3NlcnQoc2NhbnJlbGlkID4gMCk7CisJCWlmIChlcHFzdGF0ZS0+cmVsc3Vi c19zbG90W3NjYW5yZWxpZCAtIDFdICE9IE5VTEwgfHwKKwkJCWVwcXN0YXRlLT5yZWxzdWJz X3Jvd21hcmtbc2NhbnJlbGlkIC0gMV0gIT0gTlVMTCkKKwkJeworCQkJLyogVmVyaWZ5IHRo ZSBjbGFpbSBhYm92ZSAqLworCQkJaWYgKCFlcHFzdGF0ZS0+cmVsc3Vic19kb25lW3NjYW5y ZWxpZCAtIDFdKQorCQkJCWVsb2coRVJST1IsICJ1bmV4cGVjdGVkIEV4ZWNCcmluU29ydE1h cmtQb3MgY2FsbCBpbiBFUFEgcmVjaGVjayIpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJ aW5kZXhfbWFya3Bvcyhub2RlLT5pc3NfU2NhbkRlc2MpOworfQorCisvKiAtLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CisgKgkJRXhlY0luZGV4UmVzdHJQb3MKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwordm9pZAorRXhl Y0JyaW5Tb3J0UmVzdHJQb3MoQnJpblNvcnRTdGF0ZSAqbm9kZSkKK3sKKwlFU3RhdGUJICAg KmVzdGF0ZSA9IG5vZGUtPnNzLnBzLnN0YXRlOworCUVQUVN0YXRlICAgKmVwcXN0YXRlID0g ZXN0YXRlLT5lc19lcHFfYWN0aXZlOworCisJaWYgKGVzdGF0ZS0+ZXNfZXBxX2FjdGl2ZSAh PSBOVUxMKQorCXsKKwkJLyogU2VlIGNvbW1lbnRzIGluIEV4ZWNJbmRleE1hcmtQb3MgKi8K KwkJSW5kZXgJCXNjYW5yZWxpZCA9ICgoU2NhbiAqKSBub2RlLT5zcy5wcy5wbGFuKS0+c2Nh bnJlbGlkOworCisJCUFzc2VydChzY2FucmVsaWQgPiAwKTsKKwkJaWYgKGVwcXN0YXRlLT5y ZWxzdWJzX3Nsb3Rbc2NhbnJlbGlkIC0gMV0gIT0gTlVMTCB8fAorCQkJZXBxc3RhdGUtPnJl bHN1YnNfcm93bWFya1tzY2FucmVsaWQgLSAxXSAhPSBOVUxMKQorCQl7CisJCQkvKiBWZXJp ZnkgdGhlIGNsYWltIGFib3ZlICovCisJCQlpZiAoIWVwcXN0YXRlLT5yZWxzdWJzX2RvbmVb c2NhbnJlbGlkIC0gMV0pCisJCQkJZWxvZyhFUlJPUiwgInVuZXhwZWN0ZWQgRXhlY0JyaW5T b3J0UmVzdHJQb3MgY2FsbCBpbiBFUFEgcmVjaGVjayIpOworCQkJcmV0dXJuOworCQl9CisJ fQorCisJaW5kZXhfcmVzdHJwb3Mobm9kZS0+aXNzX1NjYW5EZXNjKTsKK30KKworCisvKgor ICogV2UgYWx3YXlzIHNvcnQgdGhlIHJhbmdlcyBzbyB0aGF0IHdlIGhhdmUgdGhlbSBpbiB0 aGlzIGdlbmVyYWwgb3JkZXIKKyAqCisgKiAxKSByYW5nZXMgc29ydGVkIGJ5IG1pbi9tYXgg dmFsdWUsIGFzIGRpY3RhdGVkIGJ5IEFTQy9ERVNDCisgKiAyKSBhbGwtbnVsbCByYW5nZXMK KyAqIDMpIG5vdC1zdW1tYXJpemVkIHJhbmdlcworICoKKyAqLworc3RhdGljIGludAorYnJp bl9zb3J0X3JhbmdlX2FzY19jbXAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYiwgdm9p ZCAqYXJnKQoreworCWludAkJCQlyOworCUJyaW5Tb3J0UmFuZ2UgICpyYSA9IChCcmluU29y dFJhbmdlICopIGE7CisJQnJpblNvcnRSYW5nZSAgKnJiID0gKEJyaW5Tb3J0UmFuZ2UgKikg YjsKKwlTb3J0U3VwcG9ydAkJc3N1cCA9IChTb3J0U3VwcG9ydCkgYXJnOworCisJLyogdW5z dW1tYXJpemVkIHJhbmdlcyBhcmUgc29ydGVkIGxhc3QgKi8KKwlpZiAocmEtPm5vdF9zdW1t YXJpemVkICYmIHJiLT5ub3Rfc3VtbWFyaXplZCkKKwkJcmV0dXJuIDA7CisJZWxzZSBpZiAo cmEtPm5vdF9zdW1tYXJpemVkKQorCQlyZXR1cm4gLTE7CisJZWxzZSBpZiAocmItPm5vdF9z dW1tYXJpemVkKQorCQlyZXR1cm4gMTsKKworCUFzc2VydCghKHJhLT5ub3Rfc3VtbWFyaXpl ZCB8fCByYi0+bm90X3N1bW1hcml6ZWQpKTsKKworCS8qIHRoZW4gd2Ugc29ydCBhbGwtbnVs bCByYW5nZXMgKi8KKwlpZiAocmEtPmFsbF9udWxscyAmJiByYi0+YWxsX251bGxzKQorCQly ZXR1cm4gMDsKKwllbHNlIGlmIChyYS0+YWxsX251bGxzKQorCQlyZXR1cm4gLTE7CisJZWxz ZSBpZiAocmItPmFsbF9udWxscykKKwkJcmV0dXJuIDE7CisKKwlBc3NlcnQoIShyYS0+YWxs X251bGxzIHx8IHJiLT5hbGxfbnVsbHMpKTsKKworCXIgPSBBcHBseVNvcnRDb21wYXJhdG9y KHJhLT5tYXhfdmFsdWUsIGZhbHNlLCByYi0+bWF4X3ZhbHVlLCBmYWxzZSwgc3N1cCk7CisJ aWYgKHIgIT0gMCkKKwkJcmV0dXJuIHI7CisKKwlyZXR1cm4gQXBwbHlTb3J0Q29tcGFyYXRv cihyYS0+bWluX3ZhbHVlLCBmYWxzZSwgcmItPm1pbl92YWx1ZSwgZmFsc2UsIHNzdXApOwor fQorCitzdGF0aWMgaW50CiticmluX3NvcnRfcmFuZ2VfZGVzY19jbXAoY29uc3Qgdm9pZCAq YSwgY29uc3Qgdm9pZCAqYiwgdm9pZCAqYXJnKQoreworCWludAkJCQlyOworCUJyaW5Tb3J0 UmFuZ2UgICpyYSA9IChCcmluU29ydFJhbmdlICopIGE7CisJQnJpblNvcnRSYW5nZSAgKnJi ID0gKEJyaW5Tb3J0UmFuZ2UgKikgYjsKKwlTb3J0U3VwcG9ydAkJc3N1cCA9IChTb3J0U3Vw cG9ydCkgYXJnOworCisJLyogdW5zdW1tYXJpemVkIHJhbmdlcyBhcmUgc29ydGVkIGxhc3Qg Ki8KKwlpZiAocmEtPm5vdF9zdW1tYXJpemVkICYmIHJiLT5ub3Rfc3VtbWFyaXplZCkKKwkJ cmV0dXJuIDA7CisJZWxzZSBpZiAocmEtPm5vdF9zdW1tYXJpemVkKQorCQlyZXR1cm4gLTE7 CisJZWxzZSBpZiAocmItPm5vdF9zdW1tYXJpemVkKQorCQlyZXR1cm4gMTsKKworCUFzc2Vy dCghKHJhLT5ub3Rfc3VtbWFyaXplZCB8fCByYi0+bm90X3N1bW1hcml6ZWQpKTsKKworCS8q IHRoZW4gd2Ugc29ydCBhbGwtbnVsbCByYW5nZXMgKi8KKwlpZiAocmEtPmFsbF9udWxscyAm JiByYi0+YWxsX251bGxzKQorCQlyZXR1cm4gMDsKKwllbHNlIGlmIChyYS0+YWxsX251bGxz KQorCQlyZXR1cm4gLTE7CisJZWxzZSBpZiAocmItPmFsbF9udWxscykKKwkJcmV0dXJuIDE7 CisKKwlBc3NlcnQoIShyYS0+YWxsX251bGxzIHx8IHJiLT5hbGxfbnVsbHMpKTsKKworCXIg PSBBcHBseVNvcnRDb21wYXJhdG9yKHJhLT5taW5fdmFsdWUsIGZhbHNlLCByYi0+bWluX3Zh bHVlLCBmYWxzZSwgc3N1cCk7CisJaWYgKHIgIT0gMCkKKwkJcmV0dXJuIHI7CisKKwlyZXR1 cm4gQXBwbHlTb3J0Q29tcGFyYXRvcihyYS0+bWF4X3ZhbHVlLCBmYWxzZSwgcmItPm1heF92 YWx1ZSwgZmFsc2UsIHNzdXApOworfQorCitzdGF0aWMgaW50CiticmluX3NvcnRfcmFuZ2Vw dHJfYXNjX2NtcChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiLCB2b2lkICphcmcpCit7 CisJQnJpblNvcnRSYW5nZSAgKnJhID0gKihCcmluU29ydFJhbmdlICoqKSBhOworCUJyaW5T b3J0UmFuZ2UgICpyYiA9ICooQnJpblNvcnRSYW5nZSAqKikgYjsKKwlTb3J0U3VwcG9ydAkJ c3N1cCA9IChTb3J0U3VwcG9ydCkgYXJnOworCisJLyogdW5zdW1tYXJpemVkIHJhbmdlcyBh cmUgc29ydGVkIGxhc3QgKi8KKwlpZiAocmEtPm5vdF9zdW1tYXJpemVkICYmIHJiLT5ub3Rf c3VtbWFyaXplZCkKKwkJcmV0dXJuIDA7CisJZWxzZSBpZiAocmEtPm5vdF9zdW1tYXJpemVk KQorCQlyZXR1cm4gLTE7CisJZWxzZSBpZiAocmItPm5vdF9zdW1tYXJpemVkKQorCQlyZXR1 cm4gMTsKKworCUFzc2VydCghKHJhLT5ub3Rfc3VtbWFyaXplZCB8fCByYi0+bm90X3N1bW1h cml6ZWQpKTsKKworCS8qIHRoZW4gd2Ugc29ydCBhbGwtbnVsbCByYW5nZXMgKi8KKwlpZiAo cmEtPmFsbF9udWxscyAmJiByYi0+YWxsX251bGxzKQorCQlyZXR1cm4gMDsKKwllbHNlIGlm IChyYS0+YWxsX251bGxzKQorCQlyZXR1cm4gLTE7CisJZWxzZSBpZiAocmItPmFsbF9udWxs cykKKwkJcmV0dXJuIDE7CisKKwlBc3NlcnQoIShyYS0+YWxsX251bGxzIHx8IHJiLT5hbGxf bnVsbHMpKTsKKworCXJldHVybiBBcHBseVNvcnRDb21wYXJhdG9yKHJhLT5taW5fdmFsdWUs IGZhbHNlLCByYi0+bWluX3ZhbHVlLCBmYWxzZSwgc3N1cCk7Cit9CisKK3N0YXRpYyBpbnQK K2JyaW5fc29ydF9yYW5nZXB0cl9kZXNjX2NtcChjb25zdCB2b2lkICphLCBjb25zdCB2b2lk ICpiLCB2b2lkICphcmcpCit7CisJQnJpblNvcnRSYW5nZSAgKnJhID0gKihCcmluU29ydFJh bmdlICoqKSBhOworCUJyaW5Tb3J0UmFuZ2UgICpyYiA9ICooQnJpblNvcnRSYW5nZSAqKikg YjsKKwlTb3J0U3VwcG9ydAkJc3N1cCA9IChTb3J0U3VwcG9ydCkgYXJnOworCisJLyogdW5z dW1tYXJpemVkIHJhbmdlcyBhcmUgc29ydGVkIGxhc3QgKi8KKwlpZiAocmEtPm5vdF9zdW1t YXJpemVkICYmIHJiLT5ub3Rfc3VtbWFyaXplZCkKKwkJcmV0dXJuIDA7CisJZWxzZSBpZiAo cmEtPm5vdF9zdW1tYXJpemVkKQorCQlyZXR1cm4gLTE7CisJZWxzZSBpZiAocmItPm5vdF9z dW1tYXJpemVkKQorCQlyZXR1cm4gMTsKKworCUFzc2VydCghKHJhLT5ub3Rfc3VtbWFyaXpl ZCB8fCByYi0+bm90X3N1bW1hcml6ZWQpKTsKKworCS8qIHRoZW4gd2Ugc29ydCBhbGwtbnVs bCByYW5nZXMgKi8KKwlpZiAocmEtPmFsbF9udWxscyAmJiByYi0+YWxsX251bGxzKQorCQly ZXR1cm4gMDsKKwllbHNlIGlmIChyYS0+YWxsX251bGxzKQorCQlyZXR1cm4gLTE7CisJZWxz ZSBpZiAocmItPmFsbF9udWxscykKKwkJcmV0dXJuIDE7CisKKwlBc3NlcnQoIShyYS0+YWxs X251bGxzIHx8IHJiLT5hbGxfbnVsbHMpKTsKKworCXJldHVybiBBcHBseVNvcnRDb21wYXJh dG9yKHJhLT5tYXhfdmFsdWUsIGZhbHNlLCByYi0+bWF4X3ZhbHVlLCBmYWxzZSwgc3N1cCk7 Cit9CisKKy8qCisgKiBzb21ld2hhdCBjcmlwcGxlZCB2ZXJzb24gb2YgYnJpbmdldGJpdG1h cAorICoKKyAqIFhYWCBXZSBkb24ndCBjYWxsIGNvbnNpc3RlbnQgZnVuY3Rpb24gKG9yIGFu eSBvdGhlciBmdW5jdGlvbiksIHNvIHVubGlrZQorICogYnJpbmdldGJpdG1hcCB3ZSBkb24n dCBzZXQgYSBzZXBhcmF0ZSBtZW1vcnkgY29udGV4dC4gSWYgd2UgZW5kIHVwIGZpbHRlcmlu ZworICogdGhlIHJhbmdlcyBzb21laG93IChlLmcuIGJ5IFdIRVJFIGNvbmRpdGlvbnMpLCB0 aGlzIG1pZ2h0IGJlIG5lY2Vzc2FyeS4KKyAqCisgKiBYWFggU2hvdWxkIGJlIHBhcnQgb2Yg b3BjbGFzcywgdG8gc29tZXdoZXJlIGluIGJyaW5fbWlubWF4LmMgZXRjLgorICovCitzdGF0 aWMgdm9pZAorRXhlY0luaXRCcmluU29ydFJhbmdlcyhCcmluU29ydCAqbm9kZSwgQnJpblNv cnRTdGF0ZSAqcGxhbnN0YXRlKQoreworCUluZGV4U2NhbkRlc2MJc2NhbiA9IHBsYW5zdGF0 ZS0+aXNzX1NjYW5EZXNjOworCVJlbGF0aW9uCWluZGV4UmVsID0gcGxhbnN0YXRlLT5pc3Nf UmVsYXRpb25EZXNjOworCWludAkJCWF0dG5vOworCUZtZ3JJbmZvICAgKnJhbmdlcHJvYzsK KwlCcmluUmFuZ2VzICpyYW5nZXM7CisKKwkvKiBCUklOIFNvcnQgb25seSBhbGxvd3MgT1JE RVIgQlkgdXNpbmcgYSBzaW5nbGUgY29sdW1uICovCisJQXNzZXJ0KG5vZGUtPm51bUNvbHMg PT0gMSk7CisKKwkvKgorCSAqIERldGVybWluZSBpbmRleCBhdHRudW0gd2UncmUgaW50ZXJl c3RlZCBpbi4gVGhlIHNvcnRDb2xJZHggaGFzIGF0dG51bXMKKwkgKiBmcm9tIHRoZSB0YWJs ZSwgYnV0IHdlIG5lZWQgaW5kZXggYXR0bnVtIHNvIHRoYXQgd2UgY2FuIGZldGNoIHRoZSBy aWdodAorCSAqIHJhbmdlIHN1bW1hcnkuCisJICoKKwkgKiBYWFggTWF5YmUgd2UgY291bGQv c2hvdWxkIGFycmFuZ2UgdGhlIHRsaXN0cyBkaWZmZXJlbnRseSwgc28gdGhhdCB0aGlzCisJ ICogaXMgbm90IG5lY2Vzc2FyeT8KKwkgKi8KKwlhdHRubyA9IDA7CisJZm9yIChpbnQgaSA9 IDA7IGkgPCBpbmRleFJlbC0+cmRfaW5kZXgtPmluZG5hdHRzOyBpKyspCisJeworCQlpZiAo aW5kZXhSZWwtPnJkX2luZGV4LT5pbmRrZXkudmFsdWVzW2ldID09IG5vZGUtPnNvcnRDb2xJ ZHhbMF0pCisJCXsKKwkJCWF0dG5vID0gKGkgKyAxKTsKKwkJCWJyZWFrOworCQl9CisJfQor CisJLyogZ2V0IHByb2NlZHVyZSB0byBnZW5lcmF0ZSBzb3J0IHJhbmdlcyAqLworCXJhbmdl cHJvYyA9IGluZGV4X2dldHByb2NpbmZvKGluZGV4UmVsLCBhdHRubywgQlJJTl9QUk9DTlVN X1JBTkdFUyk7CisKKwkvKgorCSAqIFNob3VsZCBub3QgZ2V0IGhlcmUgd2l0aG91dCBhIHBy b2MsIHRoYW5rcyB0byB0aGUgY2hlY2sgYmVmb3JlCisJICogYnVpbGRpbmcgdGhlIEJyaW5T b3J0IHBhdGguCisJICovCisJQXNzZXJ0KE9pZElzVmFsaWQocmFuZ2Vwcm9jKSk7CisKKwkv KiBYWFggbWF5YmUgY2FsbCB0aGlzIGluIGEgc2VwYXJhdGUgbWVtb3J5IGNvbnRleHQ/ICov CisJcmFuZ2VzID0gKEJyaW5SYW5nZXMgKikgRGF0dW1HZXRQb2ludGVyKEZ1bmN0aW9uQ2Fs bDJDb2xsKHJhbmdlcHJvYywKKwkJCQkJCQkJCQkJSW52YWxpZE9pZCwJLyogRklYTUUgdXNl IHByb3BlciBjb2xsYXRpb24qLworCQkJCQkJCQkJCQlQb2ludGVyR2V0RGF0dW0oc2Nhbiks CisJCQkJCQkJCQkJCUludDE2R2V0RGF0dW0oYXR0bm8pKSk7CisKKwkvKiBhbGxvY2F0ZSBm b3Igc3BhY2UsIGFuZCBhbHNvIGZvciB0aGUgYWx0ZXJuYXRpdmUgb3JkZXJpbmcgKi8KKwlw bGFuc3RhdGUtPmJzX25yYW5nZXMgPSAwOworCXBsYW5zdGF0ZS0+YnNfcmFuZ2VzID0gKEJy aW5Tb3J0UmFuZ2UgKikgcGFsbG9jMChyYW5nZXMtPm5yYW5nZXMgKiBzaXplb2YoQnJpblNv cnRSYW5nZSkpOworCXBsYW5zdGF0ZS0+YnNfcmFuZ2VzX21pbnZhbCA9IChCcmluU29ydFJh bmdlICoqKSBwYWxsb2MwKHJhbmdlcy0+bnJhbmdlcyAqIHNpemVvZihCcmluU29ydFJhbmdl ICopKTsKKworCWZvciAoaW50IGkgPSAwOyBpIDwgcmFuZ2VzLT5ucmFuZ2VzOyBpKyspCisJ eworCQlwbGFuc3RhdGUtPmJzX3Jhbmdlc1tpXS5ibGtub19zdGFydCA9IHJhbmdlcy0+cmFu Z2VzW2ldLmJsa25vX3N0YXJ0OworCQlwbGFuc3RhdGUtPmJzX3Jhbmdlc1tpXS5ibGtub19l bmQgPSByYW5nZXMtPnJhbmdlc1tpXS5ibGtub19lbmQ7CisJCXBsYW5zdGF0ZS0+YnNfcmFu Z2VzW2ldLm1pbl92YWx1ZSA9IHJhbmdlcy0+cmFuZ2VzW2ldLm1pbl92YWx1ZTsKKwkJcGxh bnN0YXRlLT5ic19yYW5nZXNbaV0ubWF4X3ZhbHVlID0gcmFuZ2VzLT5yYW5nZXNbaV0ubWF4 X3ZhbHVlOworCQlwbGFuc3RhdGUtPmJzX3Jhbmdlc1tpXS5oYXNfbnVsbHMgPSByYW5nZXMt PnJhbmdlc1tpXS5oYXNfbnVsbHM7CisJCXBsYW5zdGF0ZS0+YnNfcmFuZ2VzW2ldLmFsbF9u dWxscyA9IHJhbmdlcy0+cmFuZ2VzW2ldLmFsbF9udWxsczsKKwkJcGxhbnN0YXRlLT5ic19y YW5nZXNbaV0ubm90X3N1bW1hcml6ZWQgPSByYW5nZXMtPnJhbmdlc1tpXS5ub3Rfc3VtbWFy aXplZDsKKworCQlwbGFuc3RhdGUtPmJzX3Jhbmdlc19taW52YWxbaV0gPSAmcGxhbnN0YXRl LT5ic19yYW5nZXNbaV07CisJfQorCisJcGxhbnN0YXRlLT5ic19ucmFuZ2VzID0gcmFuZ2Vz LT5ucmFuZ2VzOworCisJLyoKKwkgKiBTb3J0IHJhbmdlcyBieSBtYXhpbXVtIHZhbHVlLCBh cyBkZXRlcm1pbmVkIGJ5IHRoZSBzb3J0IG9wZXJhdG9yLgorCSAqCisJICogVGhpcyBhdXRv bWF0aWNhbGx5IGNvbnNpZGVycyB0aGUgQVNDL0RFU0MsIGJlY2F1c2UgZm9yIERFU0Mgd2Ug dXNlCisJICogYW4gb3BlcmF0b3IgdGhhdCBkZWVtcyB0aGUgIm1pbl92YWx1ZSIgdmFsdWUg Z3JlYXRlci4KKwkgKgorCSAqIFhYWCBOb3Qgc3VyZSB3aGF0IHRvIGRvIGFib3V0IE5VTExT IEZJUlNUIC8gTEFTVC4KKwkgKi8KKwltZW1zZXQoJnBsYW5zdGF0ZS0+YnNfc29ydHN1cHBv cnQsIDAsIHNpemVvZihTb3J0U3VwcG9ydERhdGEpKTsKKwlQcmVwYXJlU29ydFN1cHBvcnRG cm9tT3JkZXJpbmdPcChub2RlLT5zb3J0T3BlcmF0b3JzWzBdLCAmcGxhbnN0YXRlLT5ic19z b3J0c3VwcG9ydCk7CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gc29ydCBieSBtYXhfdmFsdWUg aW4gdGhlIGZpcnN0IHN0ZXAsIHNvIHRoYXQgd2UgY2FuIGFkZAorCSAqIHJhbmdlcyBpbmNy ZW1lbnRhbGx5LCBhcyB0aGV5IGFkZCAibWluaW11bSIgbnVtYmVyIG9mIHJvd3MuCisJICoK KwkgKiBCdXQgdGhlbiBpbiB0aGUgc2Vjb25kIHN0ZXAgd2UgbmVlZCB0byBhZGQgYWxsIGlu dGVyc2VjdGluZyByYW5nZXMgWAorCSAqIHVudGlsIFgubWluX3ZhbHVlID4gQS5tYXhfdmFs dWUgKHdoZXJlIEEgaXMgdGhlIHJhbmdlIGFkZGVkIGluIGZpcnN0CisJICogc3RlcCkuIEFu ZCBmb3IgdGhhdCB3ZSBwcm9iYWJseSBuZWVkIGEgc2VwYXJhdGUgc29ydCBieSBtaW5fdmFs dWUsCisJICogcGVyaGFwcyBvZiBqdXN0IGEgcG9pbnRlciBhcnJheSwgcG9pbnRpbmcgYmFj ayB0byBic19yYW5nZXMuCisJICoKKwkgKiBGb3IgREVTQyBzb3J0IHRoaXMgd29ya3MgdGhl IG9wcG9zaXRlIHdheSwgaS5lLiBmaXJzdCBzdGVwIHNvcnQgYnkKKwkgKiBtaW5fdmFsdWUs IHRoZW4gbWF4X3ZhbHVlLgorCSAqLworCWlmIChTY2FuRGlyZWN0aW9uSXNGb3J3YXJkKG5v ZGUtPmluZGV4b3JkZXJkaXIpKQorCXsKKwkJcXNvcnRfYXJnKHBsYW5zdGF0ZS0+YnNfcmFu Z2VzLCBwbGFuc3RhdGUtPmJzX25yYW5nZXMsIHNpemVvZihCcmluU29ydFJhbmdlKSwKKwkJ CQkgIGJyaW5fc29ydF9yYW5nZV9hc2NfY21wLCAmcGxhbnN0YXRlLT5ic19zb3J0c3VwcG9y dCk7CisKKwkJcXNvcnRfYXJnKHBsYW5zdGF0ZS0+YnNfcmFuZ2VzX21pbnZhbCwgcGxhbnN0 YXRlLT5ic19ucmFuZ2VzLCBzaXplb2YoQnJpblNvcnRSYW5nZSAqKSwKKwkJCQkgIGJyaW5f c29ydF9yYW5nZXB0cl9hc2NfY21wLCAmcGxhbnN0YXRlLT5ic19zb3J0c3VwcG9ydCk7CisJ fQorCWVsc2UKKwl7CisJCXFzb3J0X2FyZyhwbGFuc3RhdGUtPmJzX3JhbmdlcywgcGxhbnN0 YXRlLT5ic19ucmFuZ2VzLCBzaXplb2YoQnJpblNvcnRSYW5nZSksCisJCQkJICBicmluX3Nv cnRfcmFuZ2VfZGVzY19jbXAsICZwbGFuc3RhdGUtPmJzX3NvcnRzdXBwb3J0KTsKKworCQlx c29ydF9hcmcocGxhbnN0YXRlLT5ic19yYW5nZXNfbWludmFsLCBwbGFuc3RhdGUtPmJzX25y YW5nZXMsIHNpemVvZihCcmluU29ydFJhbmdlICopLAorCQkJCSAgYnJpbl9zb3J0X3Jhbmdl cHRyX2Rlc2NfY21wLCAmcGxhbnN0YXRlLT5ic19zb3J0c3VwcG9ydCk7CisJfQorfQorCisv KiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCisgKgkJRXhlY0luaXRCcmluU29ydAorICoKKyAqCQlJbml0aWFsaXpl cyB0aGUgaW5kZXggc2NhbidzIHN0YXRlIGluZm9ybWF0aW9uLCBjcmVhdGVzCisgKgkJc2Nh biBrZXlzLCBhbmQgb3BlbnMgdGhlIGJhc2UgYW5kIGluZGV4IHJlbGF0aW9ucy4KKyAqCisg KgkJTm90ZTogaW5kZXggc2NhbnMgaGF2ZSAyIHNldHMgb2Ygc3RhdGUgaW5mb3JtYXRpb24g YmVjYXVzZQorICoJCQkgIHdlIGhhdmUgdG8ga2VlcCB0cmFjayBvZiB0aGUgYmFzZSByZWxh dGlvbiBhbmQgdGhlCisgKgkJCSAgaW5kZXggcmVsYXRpb24uCisgKiAtLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg Ki8KK0JyaW5Tb3J0U3RhdGUgKgorRXhlY0luaXRCcmluU29ydChCcmluU29ydCAqbm9kZSwg RVN0YXRlICplc3RhdGUsIGludCBlZmxhZ3MpCit7CisJQnJpblNvcnRTdGF0ZSAqaW5kZXhz dGF0ZTsKKwlSZWxhdGlvbgljdXJyZW50UmVsYXRpb247CisJTE9DS01PREUJbG9ja21vZGU7 CisKKwkvKgorCSAqIGNyZWF0ZSBzdGF0ZSBzdHJ1Y3R1cmUKKwkgKi8KKwlpbmRleHN0YXRl ID0gbWFrZU5vZGUoQnJpblNvcnRTdGF0ZSk7CisJaW5kZXhzdGF0ZS0+c3MucHMucGxhbiA9 IChQbGFuICopIG5vZGU7CisJaW5kZXhzdGF0ZS0+c3MucHMuc3RhdGUgPSBlc3RhdGU7CisJ aW5kZXhzdGF0ZS0+c3MucHMuRXhlY1Byb2NOb2RlID0gRXhlY0JyaW5Tb3J0OworCisJLyoK KwkgKiBNaXNjZWxsYW5lb3VzIGluaXRpYWxpemF0aW9uCisJICoKKwkgKiBjcmVhdGUgZXhw cmVzc2lvbiBjb250ZXh0IGZvciBub2RlCisJICovCisJRXhlY0Fzc2lnbkV4cHJDb250ZXh0 KGVzdGF0ZSwgJmluZGV4c3RhdGUtPnNzLnBzKTsKKworCS8qCisJICogb3BlbiB0aGUgc2Nh biByZWxhdGlvbgorCSAqLworCWN1cnJlbnRSZWxhdGlvbiA9IEV4ZWNPcGVuU2NhblJlbGF0 aW9uKGVzdGF0ZSwgbm9kZS0+c2Nhbi5zY2FucmVsaWQsIGVmbGFncyk7CisKKwlpbmRleHN0 YXRlLT5zcy5zc19jdXJyZW50UmVsYXRpb24gPSBjdXJyZW50UmVsYXRpb247CisJaW5kZXhz dGF0ZS0+c3Muc3NfY3VycmVudFNjYW5EZXNjID0gTlVMTDsJLyogbm8gaGVhcCBzY2FuIGhl cmUgKi8KKworCS8qCisJICogZ2V0IHRoZSBzY2FuIHR5cGUgZnJvbSB0aGUgcmVsYXRpb24g ZGVzY3JpcHRvci4KKwkgKi8KKwlFeGVjSW5pdFNjYW5UdXBsZVNsb3QoZXN0YXRlLCAmaW5k ZXhzdGF0ZS0+c3MsCisJCQkJCQkgIFJlbGF0aW9uR2V0RGVzY3IoY3VycmVudFJlbGF0aW9u KSwKKwkJCQkJCSAgdGFibGVfc2xvdF9jYWxsYmFja3MoY3VycmVudFJlbGF0aW9uKSk7CisK KwkvKgorCSAqIEluaXRpYWxpemUgcmVzdWx0IHR5cGUgYW5kIHByb2plY3Rpb24uCisJICov CisJRXhlY0luaXRSZXN1bHRUeXBlVEwoJmluZGV4c3RhdGUtPnNzLnBzKTsKKwlFeGVjQXNz aWduU2NhblByb2plY3Rpb25JbmZvKCZpbmRleHN0YXRlLT5zcyk7CisKKwkvKgorCSAqIGlu aXRpYWxpemUgY2hpbGQgZXhwcmVzc2lvbnMKKwkgKgorCSAqIE5vdGU6IHdlIGRvbid0IGlu aXRpYWxpemUgYWxsIG9mIHRoZSBpbmRleHF1YWwgZXhwcmVzc2lvbiwgb25seSB0aGUKKwkg KiBzdWItcGFydHMgY29ycmVzcG9uZGluZyB0byBydW50aW1lIGtleXMgKHNlZSBiZWxvdyku ICBMaWtld2lzZSBmb3IKKwkgKiBpbmRleG9yZGVyYnksIGlmIGFueS4gIEJ1dCB0aGUgaW5k ZXhxdWFsb3JpZyBleHByZXNzaW9uIGlzIGFsd2F5cworCSAqIGluaXRpYWxpemVkIGV2ZW4g dGhvdWdoIGl0IHdpbGwgb25seSBiZSB1c2VkIGluIHNvbWUgdW5jb21tb24gY2FzZXMgLS0t CisJICogd291bGQgYmUgbmljZSB0byBpbXByb3ZlIHRoYXQuICAoUHJvYmxlbSBpcyB0aGF0 IGFueSBTdWJQbGFucyBwcmVzZW50CisJICogaW4gdGhlIGV4cHJlc3Npb24gbXVzdCBiZSBm b3VuZCBub3cuLi4pCisJICovCisJaW5kZXhzdGF0ZS0+c3MucHMucXVhbCA9CisJCUV4ZWNJ bml0UXVhbChub2RlLT5zY2FuLnBsYW4ucXVhbCwgKFBsYW5TdGF0ZSAqKSBpbmRleHN0YXRl KTsKKwlpbmRleHN0YXRlLT5pbmRleHF1YWxvcmlnID0KKwkJRXhlY0luaXRRdWFsKG5vZGUt PmluZGV4cXVhbG9yaWcsIChQbGFuU3RhdGUgKikgaW5kZXhzdGF0ZSk7CisKKwkvKgorCSAq IElmIHdlIGFyZSBqdXN0IGRvaW5nIEVYUExBSU4gKGllLCBhcmVuJ3QgZ29pbmcgdG8gcnVu IHRoZSBwbGFuKSwgc3RvcAorCSAqIGhlcmUuICBUaGlzIGFsbG93cyBhbiBpbmRleC1hZHZp c29yIHBsdWdpbiB0byBFWFBMQUlOIGEgcGxhbiBjb250YWluaW5nCisJICogcmVmZXJlbmNl cyB0byBub25leGlzdGVudCBpbmRleGVzLgorCSAqLworCWlmIChlZmxhZ3MgJiBFWEVDX0ZM QUdfRVhQTEFJTl9PTkxZKQorCQlyZXR1cm4gaW5kZXhzdGF0ZTsKKworCS8qIE9wZW4gdGhl IGluZGV4IHJlbGF0aW9uLiAqLworCWxvY2ttb2RlID0gZXhlY19ydF9mZXRjaChub2RlLT5z Y2FuLnNjYW5yZWxpZCwgZXN0YXRlKS0+cmVsbG9ja21vZGU7CisJaW5kZXhzdGF0ZS0+aXNz X1JlbGF0aW9uRGVzYyA9IGluZGV4X29wZW4obm9kZS0+aW5kZXhpZCwgbG9ja21vZGUpOwor CisJLyoKKwkgKiBJbml0aWFsaXplIGluZGV4LXNwZWNpZmljIHNjYW4gc3RhdGUKKwkgKi8K KwlpbmRleHN0YXRlLT5pc3NfUnVudGltZUtleXNSZWFkeSA9IGZhbHNlOworCWluZGV4c3Rh dGUtPmlzc19SdW50aW1lS2V5cyA9IE5VTEw7CisJaW5kZXhzdGF0ZS0+aXNzX051bVJ1bnRp bWVLZXlzID0gMDsKKworCS8qCisJICogYnVpbGQgdGhlIGluZGV4IHNjYW4ga2V5cyBmcm9t IHRoZSBpbmRleCBxdWFsaWZpY2F0aW9uCisJICovCisJRXhlY0luZGV4QnVpbGRTY2FuS2V5 cygoUGxhblN0YXRlICopIGluZGV4c3RhdGUsCisJCQkJCQkgICBpbmRleHN0YXRlLT5pc3Nf UmVsYXRpb25EZXNjLAorCQkJCQkJICAgbm9kZS0+aW5kZXhxdWFsLAorCQkJCQkJICAgZmFs c2UsCisJCQkJCQkgICAmaW5kZXhzdGF0ZS0+aXNzX1NjYW5LZXlzLAorCQkJCQkJICAgJmlu ZGV4c3RhdGUtPmlzc19OdW1TY2FuS2V5cywKKwkJCQkJCSAgICZpbmRleHN0YXRlLT5pc3Nf UnVudGltZUtleXMsCisJCQkJCQkgICAmaW5kZXhzdGF0ZS0+aXNzX051bVJ1bnRpbWVLZXlz LAorCQkJCQkJICAgTlVMTCwJLyogbm8gQXJyYXlLZXlzICovCisJCQkJCQkgICBOVUxMKTsK KworCS8qCisJICogSWYgd2UgaGF2ZSBydW50aW1lIGtleXMsIHdlIG5lZWQgYW4gRXhwckNv bnRleHQgdG8gZXZhbHVhdGUgdGhlbS4gVGhlCisJICogbm9kZSdzIHN0YW5kYXJkIGNvbnRl eHQgd29uJ3QgZG8gYmVjYXVzZSB3ZSB3YW50IHRvIHJlc2V0IHRoYXQgY29udGV4dAorCSAq IGZvciBldmVyeSB0dXBsZS4gIFNvLCBidWlsZCBhbm90aGVyIGNvbnRleHQganVzdCBsaWtl IHRoZSBvdGhlciBvbmUuLi4KKwkgKiAtdGdsIDcvMTEvMDAKKwkgKi8KKwlpZiAoaW5kZXhz dGF0ZS0+aXNzX051bVJ1bnRpbWVLZXlzICE9IDApCisJeworCQlFeHByQ29udGV4dCAqc3Rk ZWNvbnRleHQgPSBpbmRleHN0YXRlLT5zcy5wcy5wc19FeHByQ29udGV4dDsKKworCQlFeGVj QXNzaWduRXhwckNvbnRleHQoZXN0YXRlLCAmaW5kZXhzdGF0ZS0+c3MucHMpOworCQlpbmRl eHN0YXRlLT5pc3NfUnVudGltZUNvbnRleHQgPSBpbmRleHN0YXRlLT5zcy5wcy5wc19FeHBy Q29udGV4dDsKKwkJaW5kZXhzdGF0ZS0+c3MucHMucHNfRXhwckNvbnRleHQgPSBzdGRlY29u dGV4dDsKKwl9CisJZWxzZQorCXsKKwkJaW5kZXhzdGF0ZS0+aXNzX1J1bnRpbWVDb250ZXh0 ID0gTlVMTDsKKwl9CisKKwlpbmRleHN0YXRlLT5ic190dXBsZXNvcnRzdGF0ZSA9IE5VTEw7 CisJaW5kZXhzdGF0ZS0+YnNfcXVhbCA9IGluZGV4c3RhdGUtPnNzLnBzLnF1YWw7CisJaW5k ZXhzdGF0ZS0+c3MucHMucXVhbCA9IE5VTEw7CisJRXhlY0luaXRSZXN1bHRUdXBsZVNsb3RU TCgmaW5kZXhzdGF0ZS0+c3MucHMsICZUVFNPcHNNaW5pbWFsVHVwbGUpOworCisJLyoKKwkg KiBhbGwgZG9uZS4KKwkgKi8KKwlyZXR1cm4gaW5kZXhzdGF0ZTsKK30KKworLyogLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQorICoJCQkJCQlQYXJhbGxlbCBTY2FuIFN1cHBvcnQKKyAqIC0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAq LworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCisgKgkJRXhlY0JyaW5Tb3J0RXN0aW1hdGUKKyAqCisgKgkJ Q29tcHV0ZSB0aGUgYW1vdW50IG9mIHNwYWNlIHdlJ2xsIG5lZWQgaW4gdGhlIHBhcmFsbGVs CisgKgkJcXVlcnkgRFNNLCBhbmQgaW5mb3JtIHBjeHQtPmVzdGltYXRvciBhYm91dCBvdXIg bmVlZHMuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3ZvaWQKK0V4ZWNCcmluU29ydEVzdGltYXRl KEJyaW5Tb3J0U3RhdGUgKm5vZGUsCisJCQkJCSAgUGFyYWxsZWxDb250ZXh0ICpwY3h0KQor eworCUVTdGF0ZQkgICAqZXN0YXRlID0gbm9kZS0+c3MucHMuc3RhdGU7CisKKwlub2RlLT5p c3NfUHNjYW5MZW4gPSBpbmRleF9wYXJhbGxlbHNjYW5fZXN0aW1hdGUobm9kZS0+aXNzX1Jl bGF0aW9uRGVzYywKKwkJCQkJCQkJCQkJCQkgZXN0YXRlLT5lc19zbmFwc2hvdCk7CisJc2ht X3RvY19lc3RpbWF0ZV9jaHVuaygmcGN4dC0+ZXN0aW1hdG9yLCBub2RlLT5pc3NfUHNjYW5M ZW4pOworCXNobV90b2NfZXN0aW1hdGVfa2V5cygmcGN4dC0+ZXN0aW1hdG9yLCAxKTsKK30K KworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQorICoJCUV4ZWNCcmluU29ydEluaXRpYWxpemVEU00KKyAqCisg KgkJU2V0IHVwIGEgcGFyYWxsZWwgaW5kZXggc2NhbiBkZXNjcmlwdG9yLgorICogLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQorICovCit2b2lkCitFeGVjQnJpblNvcnRJbml0aWFsaXplRFNNKEJyaW5Tb3J0U3Rh dGUgKm5vZGUsCisJCQkJCQkgICBQYXJhbGxlbENvbnRleHQgKnBjeHQpCit7CisJRVN0YXRl CSAgICplc3RhdGUgPSBub2RlLT5zcy5wcy5zdGF0ZTsKKwlQYXJhbGxlbEluZGV4U2NhbkRl c2MgcGlzY2FuOworCisJcGlzY2FuID0gc2htX3RvY19hbGxvY2F0ZShwY3h0LT50b2MsIG5v ZGUtPmlzc19Qc2Nhbkxlbik7CisJaW5kZXhfcGFyYWxsZWxzY2FuX2luaXRpYWxpemUobm9k ZS0+c3Muc3NfY3VycmVudFJlbGF0aW9uLAorCQkJCQkJCQkgIG5vZGUtPmlzc19SZWxhdGlv bkRlc2MsCisJCQkJCQkJCSAgZXN0YXRlLT5lc19zbmFwc2hvdCwKKwkJCQkJCQkJICBwaXNj YW4pOworCXNobV90b2NfaW5zZXJ0KHBjeHQtPnRvYywgbm9kZS0+c3MucHMucGxhbi0+cGxh bl9ub2RlX2lkLCBwaXNjYW4pOworCW5vZGUtPmlzc19TY2FuRGVzYyA9CisJCWluZGV4X2Jl Z2luc2Nhbl9wYXJhbGxlbChub2RlLT5zcy5zc19jdXJyZW50UmVsYXRpb24sCisJCQkJCQkJ CSBub2RlLT5pc3NfUmVsYXRpb25EZXNjLAorCQkJCQkJCQkgbm9kZS0+aXNzX051bVNjYW5L ZXlzLAorCQkJCQkJCQkgbm9kZS0+aXNzX051bU9yZGVyQnlLZXlzLAorCQkJCQkJCQkgcGlz Y2FuKTsKKworCS8qCisJICogSWYgbm8gcnVuLXRpbWUga2V5cyB0byBjYWxjdWxhdGUgb3Ig dGhleSBhcmUgcmVhZHksIGdvIGFoZWFkIGFuZCBwYXNzCisJICogdGhlIHNjYW5rZXlzIHRv IHRoZSBpbmRleCBBTS4KKwkgKi8KKwlpZiAobm9kZS0+aXNzX051bVJ1bnRpbWVLZXlzID09 IDAgfHwgbm9kZS0+aXNzX1J1bnRpbWVLZXlzUmVhZHkpCisJCWluZGV4X3Jlc2Nhbihub2Rl LT5pc3NfU2NhbkRlc2MsCisJCQkJCSBub2RlLT5pc3NfU2NhbktleXMsIG5vZGUtPmlzc19O dW1TY2FuS2V5cywKKwkJCQkJIG5vZGUtPmlzc19PcmRlckJ5S2V5cywgbm9kZS0+aXNzX051 bU9yZGVyQnlLZXlzKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJCUV4ZWNCcmluU29ydFJl SW5pdGlhbGl6ZURTTQorICoKKyAqCQlSZXNldCBzaGFyZWQgc3RhdGUgYmVmb3JlIGJlZ2lu bmluZyBhIGZyZXNoIHNjYW4uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3ZvaWQKK0V4ZWNCcmlu U29ydFJlSW5pdGlhbGl6ZURTTShCcmluU29ydFN0YXRlICpub2RlLAorCQkJCQkJCSBQYXJh bGxlbENvbnRleHQgKnBjeHQpCit7CisJaW5kZXhfcGFyYWxsZWxyZXNjYW4obm9kZS0+aXNz X1NjYW5EZXNjKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJCUV4ZWNCcmluU29ydEluaXRp YWxpemVXb3JrZXIKKyAqCisgKgkJQ29weSByZWxldmFudCBpbmZvcm1hdGlvbiBmcm9tIFRP QyBpbnRvIHBsYW5zdGF0ZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwordm9pZAorRXhlY0JyaW5T b3J0SW5pdGlhbGl6ZVdvcmtlcihCcmluU29ydFN0YXRlICpub2RlLAorCQkJCQkJCSAgUGFy YWxsZWxXb3JrZXJDb250ZXh0ICpwd2N4dCkKK3sKKwlQYXJhbGxlbEluZGV4U2NhbkRlc2Mg cGlzY2FuOworCisJcGlzY2FuID0gc2htX3RvY19sb29rdXAocHdjeHQtPnRvYywgbm9kZS0+ c3MucHMucGxhbi0+cGxhbl9ub2RlX2lkLCBmYWxzZSk7CisJbm9kZS0+aXNzX1NjYW5EZXNj ID0KKwkJaW5kZXhfYmVnaW5zY2FuX3BhcmFsbGVsKG5vZGUtPnNzLnNzX2N1cnJlbnRSZWxh dGlvbiwKKwkJCQkJCQkJIG5vZGUtPmlzc19SZWxhdGlvbkRlc2MsCisJCQkJCQkJCSBub2Rl LT5pc3NfTnVtU2NhbktleXMsCisJCQkJCQkJCSBub2RlLT5pc3NfTnVtT3JkZXJCeUtleXMs CisJCQkJCQkJCSBwaXNjYW4pOworCisJLyoKKwkgKiBJZiBubyBydW4tdGltZSBrZXlzIHRv IGNhbGN1bGF0ZSBvciB0aGV5IGFyZSByZWFkeSwgZ28gYWhlYWQgYW5kIHBhc3MKKwkgKiB0 aGUgc2NhbmtleXMgdG8gdGhlIGluZGV4IEFNLgorCSAqLworCWlmIChub2RlLT5pc3NfTnVt UnVudGltZUtleXMgPT0gMCB8fCBub2RlLT5pc3NfUnVudGltZUtleXNSZWFkeSkKKwkJaW5k ZXhfcmVzY2FuKG5vZGUtPmlzc19TY2FuRGVzYywKKwkJCQkJIG5vZGUtPmlzc19TY2FuS2V5 cywgbm9kZS0+aXNzX051bVNjYW5LZXlzLAorCQkJCQkgbm9kZS0+aXNzX09yZGVyQnlLZXlz LCBub2RlLT5pc3NfTnVtT3JkZXJCeUtleXMpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tl bmQvb3B0aW1pemVyL3BhdGgvY29zdHNpemUuYyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9w YXRoL2Nvc3RzaXplLmMKaW5kZXggNGM2YjFkMWY1NWIuLjY0ZDEwM2IxOWU5IDEwMDY0NAot LS0gYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9jb3N0c2l6ZS5jCisrKyBiL3NyYy9i YWNrZW5kL29wdGltaXplci9wYXRoL2Nvc3RzaXplLmMKQEAgLTc5MCw2ICs3OTAsMjYwIEBA IGNvc3RfaW5kZXgoSW5kZXhQYXRoICpwYXRoLCBQbGFubmVySW5mbyAqcm9vdCwgZG91Ymxl IGxvb3BfY291bnQsCiAJcGF0aC0+cGF0aC50b3RhbF9jb3N0ID0gc3RhcnR1cF9jb3N0ICsg cnVuX2Nvc3Q7CiB9CiAKK3ZvaWQKK2Nvc3RfYnJpbnNvcnQoQnJpblNvcnRQYXRoICpwYXRo LCBQbGFubmVySW5mbyAqcm9vdCwgZG91YmxlIGxvb3BfY291bnQsCisJCSAgIGJvb2wgcGFy dGlhbF9wYXRoKQoreworCUluZGV4T3B0SW5mbyAqaW5kZXggPSBwYXRoLT5pcGF0aC5pbmRl eGluZm87CisJUmVsT3B0SW5mbyAqYmFzZXJlbCA9IGluZGV4LT5yZWw7CisJYW1jb3N0ZXN0 aW1hdGVfZnVuY3Rpb24gYW1jb3N0ZXN0aW1hdGU7CisJTGlzdAkgICAqcXBxdWFsczsKKwlD b3N0CQlzdGFydHVwX2Nvc3QgPSAwOworCUNvc3QJCXJ1bl9jb3N0ID0gMDsKKwlDb3N0CQlj cHVfcnVuX2Nvc3QgPSAwOworCUNvc3QJCWluZGV4U3RhcnR1cENvc3Q7CisJQ29zdAkJaW5k ZXhUb3RhbENvc3Q7CisJU2VsZWN0aXZpdHkgaW5kZXhTZWxlY3Rpdml0eTsKKwlkb3VibGUJ CWluZGV4Q29ycmVsYXRpb24sCisJCQkJY3NxdWFyZWQ7CisJZG91YmxlCQlzcGNfc2VxX3Bh Z2VfY29zdCwKKwkJCQlzcGNfcmFuZG9tX3BhZ2VfY29zdDsKKwlDb3N0CQltaW5fSU9fY29z dCwKKwkJCQltYXhfSU9fY29zdDsKKwlRdWFsQ29zdAlxcHF1YWxfY29zdDsKKwlDb3N0CQlj cHVfcGVyX3R1cGxlOworCWRvdWJsZQkJdHVwbGVzX2ZldGNoZWQ7CisJZG91YmxlCQlwYWdl c19mZXRjaGVkOworCWRvdWJsZQkJcmFuZF9oZWFwX3BhZ2VzOworCWRvdWJsZQkJaW5kZXhf cGFnZXM7CisKKwkvKiBTaG91bGQgb25seSBiZSBhcHBsaWVkIHRvIGJhc2UgcmVsYXRpb25z ICovCisJQXNzZXJ0KElzQShiYXNlcmVsLCBSZWxPcHRJbmZvKSAmJgorCQkgICBJc0EoaW5k ZXgsIEluZGV4T3B0SW5mbykpOworCUFzc2VydChiYXNlcmVsLT5yZWxpZCA+IDApOworCUFz c2VydChiYXNlcmVsLT5ydGVraW5kID09IFJURV9SRUxBVElPTik7CisKKwkvKgorCSAqIE1h cmsgdGhlIHBhdGggd2l0aCB0aGUgY29ycmVjdCByb3cgZXN0aW1hdGUsIGFuZCBpZGVudGlm eSB3aGljaCBxdWFscworCSAqIHdpbGwgbmVlZCB0byBiZSBlbmZvcmNlZCBhcyBxcHF1YWxz LiAgV2UgbmVlZCBub3QgY2hlY2sgYW55IHF1YWxzIHRoYXQKKwkgKiBhcmUgaW1wbGllZCBi eSB0aGUgaW5kZXgncyBwcmVkaWNhdGUsIHNvIHdlIGNhbiB1c2UgaW5kcmVzdHJpY3RpbmZv IG5vdAorCSAqIGJhc2VyZXN0cmljdGluZm8gYXMgdGhlIGxpc3Qgb2YgcmVsZXZhbnQgcmVz dHJpY3Rpb24gY2xhdXNlcyBmb3IgdGhlCisJICogcmVsLgorCSAqLworCWlmIChwYXRoLT5p cGF0aC5wYXRoLnBhcmFtX2luZm8pCisJeworCQlwYXRoLT5pcGF0aC5wYXRoLnJvd3MgPSBw YXRoLT5pcGF0aC5wYXRoLnBhcmFtX2luZm8tPnBwaV9yb3dzOworCQkvKiBxcHF1YWxzIGNv bWUgZnJvbSB0aGUgcmVsJ3MgcmVzdHJpY3Rpb24gY2xhdXNlcyBhbmQgcHBpX2NsYXVzZXMg Ki8KKwkJcXBxdWFscyA9IGxpc3RfY29uY2F0KGV4dHJhY3Rfbm9uaW5kZXhfY29uZGl0aW9u cyhwYXRoLT5pcGF0aC5pbmRleGluZm8tPmluZHJlc3RyaWN0aW5mbywKKwkJCQkJCQkJCQkJ CQkJICBwYXRoLT5pcGF0aC5pbmRleGNsYXVzZXMpLAorCQkJCQkJCSAgZXh0cmFjdF9ub25p bmRleF9jb25kaXRpb25zKHBhdGgtPmlwYXRoLnBhdGgucGFyYW1faW5mby0+cHBpX2NsYXVz ZXMsCisJCQkJCQkJCQkJCQkJCSAgcGF0aC0+aXBhdGguaW5kZXhjbGF1c2VzKSk7CisJfQor CWVsc2UKKwl7CisJCXBhdGgtPmlwYXRoLnBhdGgucm93cyA9IGJhc2VyZWwtPnJvd3M7CisJ CS8qIHFwcXVhbHMgY29tZSBmcm9tIGp1c3QgdGhlIHJlbCdzIHJlc3RyaWN0aW9uIGNsYXVz ZXMgKi8KKwkJcXBxdWFscyA9IGV4dHJhY3Rfbm9uaW5kZXhfY29uZGl0aW9ucyhwYXRoLT5p cGF0aC5pbmRleGluZm8tPmluZHJlc3RyaWN0aW5mbywKKwkJCQkJCQkJCQkJICBwYXRoLT5p cGF0aC5pbmRleGNsYXVzZXMpOworCX0KKworCWlmICghZW5hYmxlX2luZGV4c2NhbikKKwkJ c3RhcnR1cF9jb3N0ICs9IGRpc2FibGVfY29zdDsKKwkvKiB3ZSBkb24ndCBuZWVkIHRvIGNo ZWNrIGVuYWJsZV9pbmRleG9ubHlzY2FuOyBpbmR4cGF0aC5jIGRvZXMgdGhhdCAqLworCisJ LyoKKwkgKiBDYWxsIGluZGV4LWFjY2Vzcy1tZXRob2Qtc3BlY2lmaWMgY29kZSB0byBlc3Rp bWF0ZSB0aGUgcHJvY2Vzc2luZyBjb3N0CisJICogZm9yIHNjYW5uaW5nIHRoZSBpbmRleCwg YXMgd2VsbCBhcyB0aGUgc2VsZWN0aXZpdHkgb2YgdGhlIGluZGV4IChpZSwKKwkgKiB0aGUg ZnJhY3Rpb24gb2YgbWFpbi10YWJsZSB0dXBsZXMgd2Ugd2lsbCBoYXZlIHRvIHJldHJpZXZl KSBhbmQgaXRzCisJICogY29ycmVsYXRpb24gdG8gdGhlIG1haW4tdGFibGUgdHVwbGUgb3Jk ZXIuICBXZSBuZWVkIGEgY2FzdCBoZXJlIGJlY2F1c2UKKwkgKiBwYXRobm9kZXMuaCB1c2Vz IGEgd2VhayBmdW5jdGlvbiB0eXBlIHRvIGF2b2lkIGluY2x1ZGluZyBhbWFwaS5oLgorCSAq LworCWFtY29zdGVzdGltYXRlID0gKGFtY29zdGVzdGltYXRlX2Z1bmN0aW9uKSBpbmRleC0+ YW1jb3N0ZXN0aW1hdGU7CisJYW1jb3N0ZXN0aW1hdGUocm9vdCwgJnBhdGgtPmlwYXRoLCBs b29wX2NvdW50LAorCQkJCSAgICZpbmRleFN0YXJ0dXBDb3N0LCAmaW5kZXhUb3RhbENvc3Qs CisJCQkJICAgJmluZGV4U2VsZWN0aXZpdHksICZpbmRleENvcnJlbGF0aW9uLAorCQkJCSAg ICZpbmRleF9wYWdlcyk7CisKKwkvKgorCSAqIFNhdmUgYW1jb3N0ZXN0aW1hdGUncyByZXN1 bHRzIGZvciBwb3NzaWJsZSB1c2UgaW4gYml0bWFwIHNjYW4gcGxhbm5pbmcuCisJICogV2Ug ZG9uJ3QgYm90aGVyIHRvIHNhdmUgaW5kZXhTdGFydHVwQ29zdCBvciBpbmRleENvcnJlbGF0 aW9uLCBiZWNhdXNlIGEKKwkgKiBiaXRtYXAgc2NhbiBkb2Vzbid0IGNhcmUgYWJvdXQgZWl0 aGVyLgorCSAqLworCXBhdGgtPmlwYXRoLmluZGV4dG90YWxjb3N0ID0gaW5kZXhUb3RhbENv c3Q7CisJcGF0aC0+aXBhdGguaW5kZXhzZWxlY3Rpdml0eSA9IGluZGV4U2VsZWN0aXZpdHk7 CisKKwkvKiBhbGwgY29zdHMgZm9yIHRvdWNoaW5nIGluZGV4IGl0c2VsZiBpbmNsdWRlZCBo ZXJlICovCisJc3RhcnR1cF9jb3N0ICs9IGluZGV4U3RhcnR1cENvc3Q7CisJcnVuX2Nvc3Qg Kz0gaW5kZXhUb3RhbENvc3QgLSBpbmRleFN0YXJ0dXBDb3N0OworCisJLyogZXN0aW1hdGUg bnVtYmVyIG9mIG1haW4tdGFibGUgdHVwbGVzIGZldGNoZWQgKi8KKwl0dXBsZXNfZmV0Y2hl ZCA9IGNsYW1wX3Jvd19lc3QoaW5kZXhTZWxlY3Rpdml0eSAqIGJhc2VyZWwtPnR1cGxlcyk7 CisKKwkvKiBmZXRjaCBlc3RpbWF0ZWQgcGFnZSBjb3N0cyBmb3IgdGFibGVzcGFjZSBjb250 YWluaW5nIHRhYmxlICovCisJZ2V0X3RhYmxlc3BhY2VfcGFnZV9jb3N0cyhiYXNlcmVsLT5y ZWx0YWJsZXNwYWNlLAorCQkJCQkJCSAgJnNwY19yYW5kb21fcGFnZV9jb3N0LAorCQkJCQkJ CSAgJnNwY19zZXFfcGFnZV9jb3N0KTsKKworCS8qLS0tLS0tLS0tLQorCSAqIEVzdGltYXRl IG51bWJlciBvZiBtYWluLXRhYmxlIHBhZ2VzIGZldGNoZWQsIGFuZCBjb21wdXRlIEkvTyBj b3N0LgorCSAqCisJICogV2hlbiB0aGUgaW5kZXggb3JkZXJpbmcgaXMgdW5jb3JyZWxhdGVk IHdpdGggdGhlIHRhYmxlIG9yZGVyaW5nLAorCSAqIHdlIHVzZSBhbiBhcHByb3hpbWF0aW9u IHByb3Bvc2VkIGJ5IE1hY2tlcnQgYW5kIExvaG1hbiAoc2VlCisJICogaW5kZXhfcGFnZXNf ZmV0Y2hlZCgpIGZvciBkZXRhaWxzKSB0byBjb21wdXRlIHRoZSBudW1iZXIgb2YgcGFnZXMK KwkgKiBmZXRjaGVkLCBhbmQgdGhlbiBjaGFyZ2Ugc3BjX3JhbmRvbV9wYWdlX2Nvc3QgcGVy IHBhZ2UgZmV0Y2hlZC4KKwkgKgorCSAqIFdoZW4gdGhlIGluZGV4IG9yZGVyaW5nIGlzIGV4 YWN0bHkgY29ycmVsYXRlZCB3aXRoIHRoZSB0YWJsZSBvcmRlcmluZworCSAqIChqdXN0IGFm dGVyIGEgQ0xVU1RFUiwgZm9yIGV4YW1wbGUpLCB0aGUgbnVtYmVyIG9mIHBhZ2VzIGZldGNo ZWQgc2hvdWxkCisJICogYmUgZXhhY3RseSBzZWxlY3Rpdml0eSAqIHRhYmxlX3NpemUuICBX aGF0J3MgbW9yZSwgYWxsIGJ1dCB0aGUgZmlyc3QKKwkgKiB3aWxsIGJlIHNlcXVlbnRpYWwg ZmV0Y2hlcywgbm90IHRoZSByYW5kb20gZmV0Y2hlcyB0aGF0IG9jY3VyIGluIHRoZQorCSAq IHVuY29ycmVsYXRlZCBjYXNlLiAgU28gaWYgdGhlIG51bWJlciBvZiBwYWdlcyBpcyBtb3Jl IHRoYW4gMSwgd2UKKwkgKiBvdWdodCB0byBjaGFyZ2UKKwkgKgkJc3BjX3JhbmRvbV9wYWdl X2Nvc3QgKyAocGFnZXNfZmV0Y2hlZCAtIDEpICogc3BjX3NlcV9wYWdlX2Nvc3QKKwkgKiBG b3IgcGFydGlhbGx5LWNvcnJlbGF0ZWQgaW5kZXhlcywgd2Ugb3VnaHQgdG8gY2hhcmdlIHNv bWV3aGVyZSBiZXR3ZWVuCisJICogdGhlc2UgdHdvIGVzdGltYXRlcy4gIFdlIGN1cnJlbnRs eSBpbnRlcnBvbGF0ZSBsaW5lYXJseSBiZXR3ZWVuIHRoZQorCSAqIGVzdGltYXRlcyBiYXNl ZCBvbiB0aGUgY29ycmVsYXRpb24gc3F1YXJlZCAoWFhYIGlzIHRoYXQgYXBwcm9wcmlhdGU/ KS4KKwkgKgorCSAqIElmIGl0J3MgYW4gaW5kZXgtb25seSBzY2FuLCB0aGVuIHdlIHdpbGwg bm90IG5lZWQgdG8gZmV0Y2ggYW55IGhlYXAKKwkgKiBwYWdlcyBmb3Igd2hpY2ggdGhlIHZp c2liaWxpdHkgbWFwIHNob3dzIGFsbCB0dXBsZXMgYXJlIHZpc2libGUuCisJICogSGVuY2Us IHJlZHVjZSB0aGUgZXN0aW1hdGVkIG51bWJlciBvZiBoZWFwIGZldGNoZXMgYWNjb3JkaW5n bHkuCisJICogV2UgdXNlIHRoZSBtZWFzdXJlZCBmcmFjdGlvbiBvZiB0aGUgZW50aXJlIGhl YXAgdGhhdCBpcyBhbGwtdmlzaWJsZSwKKwkgKiB3aGljaCBtaWdodCBub3QgYmUgcGFydGlj dWxhcmx5IHJlbGV2YW50IHRvIHRoZSBzdWJzZXQgb2YgdGhlIGhlYXAKKwkgKiB0aGF0IHRo aXMgcXVlcnkgd2lsbCBmZXRjaDsgYnV0IGl0J3Mgbm90IGNsZWFyIGhvdyB0byBkbyBiZXR0 ZXIuCisJICotLS0tLS0tLS0tCisJICovCisJaWYgKGxvb3BfY291bnQgPiAxKQorCXsKKwkJ LyoKKwkJICogRm9yIHJlcGVhdGVkIGluZGV4c2NhbnMsIHRoZSBhcHByb3ByaWF0ZSBlc3Rp bWF0ZSBmb3IgdGhlCisJCSAqIHVuY29ycmVsYXRlZCBjYXNlIGlzIHRvIHNjYWxlIHVwIHRo ZSBudW1iZXIgb2YgdHVwbGVzIGZldGNoZWQgaW4KKwkJICogdGhlIE1hY2tlcnQgYW5kIExv aG1hbiBmb3JtdWxhIGJ5IHRoZSBudW1iZXIgb2Ygc2NhbnMsIHNvIHRoYXQgd2UKKwkJICog ZXN0aW1hdGUgdGhlIG51bWJlciBvZiBwYWdlcyBmZXRjaGVkIGJ5IGFsbCB0aGUgc2NhbnM7 IHRoZW4KKwkJICogcHJvLXJhdGUgdGhlIGNvc3RzIGZvciBvbmUgc2Nhbi4gIEluIHRoaXMg Y2FzZSB3ZSBhc3N1bWUgYWxsIHRoZQorCQkgKiBmZXRjaGVzIGFyZSByYW5kb20gYWNjZXNz ZXMuCisJCSAqLworCQlwYWdlc19mZXRjaGVkID0gaW5kZXhfcGFnZXNfZmV0Y2hlZCh0dXBs ZXNfZmV0Y2hlZCAqIGxvb3BfY291bnQsCisJCQkJCQkJCQkJCWJhc2VyZWwtPnBhZ2VzLAor CQkJCQkJCQkJCQkoZG91YmxlKSBpbmRleC0+cGFnZXMsCisJCQkJCQkJCQkJCXJvb3QpOwor CisJCXJhbmRfaGVhcF9wYWdlcyA9IHBhZ2VzX2ZldGNoZWQ7CisKKwkJbWF4X0lPX2Nvc3Qg PSAocGFnZXNfZmV0Y2hlZCAqIHNwY19yYW5kb21fcGFnZV9jb3N0KSAvIGxvb3BfY291bnQ7 CisKKwkJLyoKKwkJICogSW4gdGhlIHBlcmZlY3RseSBjb3JyZWxhdGVkIGNhc2UsIHRoZSBu dW1iZXIgb2YgcGFnZXMgdG91Y2hlZCBieQorCQkgKiBlYWNoIHNjYW4gaXMgc2VsZWN0aXZp dHkgKiB0YWJsZV9zaXplLCBhbmQgd2UgY2FuIHVzZSB0aGUgTWFja2VydAorCQkgKiBhbmQg TG9obWFuIGZvcm11bGEgYXQgdGhlIHBhZ2UgbGV2ZWwgdG8gZXN0aW1hdGUgaG93IG11Y2gg d29yayBpcworCQkgKiBzYXZlZCBieSBjYWNoaW5nIGFjcm9zcyBzY2Fucy4gIFdlIHN0aWxs IGFzc3VtZSBhbGwgdGhlIGZldGNoZXMgYXJlCisJCSAqIHJhbmRvbSwgdGhvdWdoLCB3aGlj aCBpcyBhbiBvdmVyZXN0aW1hdGUgdGhhdCdzIGhhcmQgdG8gY29ycmVjdCBmb3IKKwkJICog d2l0aG91dCBkb3VibGUtY291bnRpbmcgdGhlIGNhY2hlIGVmZmVjdHMuICAoQnV0IGluIG1v c3QgY2FzZXMKKwkJICogd2hlcmUgc3VjaCBhIHBsYW4gaXMgYWN0dWFsbHkgaW50ZXJlc3Rp bmcsIG9ubHkgb25lIHBhZ2Ugd291bGQgZ2V0CisJCSAqIGZldGNoZWQgcGVyIHNjYW4gYW55 d2F5LCBzbyBpdCBzaG91bGRuJ3QgbWF0dGVyIG11Y2guKQorCQkgKi8KKwkJcGFnZXNfZmV0 Y2hlZCA9IGNlaWwoaW5kZXhTZWxlY3Rpdml0eSAqIChkb3VibGUpIGJhc2VyZWwtPnBhZ2Vz KTsKKworCQlwYWdlc19mZXRjaGVkID0gaW5kZXhfcGFnZXNfZmV0Y2hlZChwYWdlc19mZXRj aGVkICogbG9vcF9jb3VudCwKKwkJCQkJCQkJCQkJYmFzZXJlbC0+cGFnZXMsCisJCQkJCQkJ CQkJCShkb3VibGUpIGluZGV4LT5wYWdlcywKKwkJCQkJCQkJCQkJcm9vdCk7CisKKwkJbWlu X0lPX2Nvc3QgPSAocGFnZXNfZmV0Y2hlZCAqIHNwY19yYW5kb21fcGFnZV9jb3N0KSAvIGxv b3BfY291bnQ7CisJfQorCWVsc2UKKwl7CisJCS8qCisJCSAqIE5vcm1hbCBjYXNlOiBhcHBs eSB0aGUgTWFja2VydCBhbmQgTG9obWFuIGZvcm11bGEsIGFuZCB0aGVuCisJCSAqIGludGVy cG9sYXRlIGJldHdlZW4gdGhhdCBhbmQgdGhlIGNvcnJlbGF0aW9uLWRlcml2ZWQgcmVzdWx0 LgorCQkgKi8KKwkJcGFnZXNfZmV0Y2hlZCA9IGluZGV4X3BhZ2VzX2ZldGNoZWQodHVwbGVz X2ZldGNoZWQsCisJCQkJCQkJCQkJCWJhc2VyZWwtPnBhZ2VzLAorCQkJCQkJCQkJCQkoZG91 YmxlKSBpbmRleC0+cGFnZXMsCisJCQkJCQkJCQkJCXJvb3QpOworCisJCXJhbmRfaGVhcF9w YWdlcyA9IHBhZ2VzX2ZldGNoZWQ7CisKKwkJLyogbWF4X0lPX2Nvc3QgaXMgZm9yIHRoZSBw ZXJmZWN0bHkgdW5jb3JyZWxhdGVkIGNhc2UgKGNzcXVhcmVkPTApICovCisJCW1heF9JT19j b3N0ID0gcGFnZXNfZmV0Y2hlZCAqIHNwY19yYW5kb21fcGFnZV9jb3N0OworCisJCS8qIG1p bl9JT19jb3N0IGlzIGZvciB0aGUgcGVyZmVjdGx5IGNvcnJlbGF0ZWQgY2FzZSAoY3NxdWFy ZWQ9MSkgKi8KKwkJcGFnZXNfZmV0Y2hlZCA9IGNlaWwoaW5kZXhTZWxlY3Rpdml0eSAqIChk b3VibGUpIGJhc2VyZWwtPnBhZ2VzKTsKKworCQlpZiAocGFnZXNfZmV0Y2hlZCA+IDApCisJ CXsKKwkJCW1pbl9JT19jb3N0ID0gc3BjX3JhbmRvbV9wYWdlX2Nvc3Q7CisJCQlpZiAocGFn ZXNfZmV0Y2hlZCA+IDEpCisJCQkJbWluX0lPX2Nvc3QgKz0gKHBhZ2VzX2ZldGNoZWQgLSAx KSAqIHNwY19zZXFfcGFnZV9jb3N0OworCQl9CisJCWVsc2UKKwkJCW1pbl9JT19jb3N0ID0g MDsKKwl9CisKKwlpZiAocGFydGlhbF9wYXRoKQorCXsKKwkJLyoKKwkJICogRXN0aW1hdGUg dGhlIG51bWJlciBvZiBwYXJhbGxlbCB3b3JrZXJzIHJlcXVpcmVkIHRvIHNjYW4gaW5kZXgu IFVzZQorCQkgKiB0aGUgbnVtYmVyIG9mIGhlYXAgcGFnZXMgY29tcHV0ZWQgY29uc2lkZXJp bmcgaGVhcCBmZXRjaGVzIHdvbid0IGJlCisJCSAqIHNlcXVlbnRpYWwgYXMgZm9yIHBhcmFs bGVsIHNjYW5zIHRoZSBwYWdlcyBhcmUgYWNjZXNzZWQgaW4gcmFuZG9tCisJCSAqIG9yZGVy LgorCQkgKi8KKwkJcGF0aC0+aXBhdGgucGF0aC5wYXJhbGxlbF93b3JrZXJzID0gY29tcHV0 ZV9wYXJhbGxlbF93b3JrZXIoYmFzZXJlbCwKKwkJCQkJCQkJCQkJCQkJCSAgcmFuZF9oZWFw X3BhZ2VzLAorCQkJCQkJCQkJCQkJCQkJICBpbmRleF9wYWdlcywKKwkJCQkJCQkJCQkJCQkJ CSAgbWF4X3BhcmFsbGVsX3dvcmtlcnNfcGVyX2dhdGhlcik7CisKKwkJLyoKKwkJICogRmFs bCBvdXQgaWYgd29ya2VycyBjYW4ndCBiZSBhc3NpZ25lZCBmb3IgcGFyYWxsZWwgc2Nhbiwg YmVjYXVzZSBpbgorCQkgKiBzdWNoIGEgY2FzZSB0aGlzIHBhdGggd2lsbCBiZSByZWplY3Rl ZC4gIFNvIHRoZXJlIGlzIG5vIGJlbmVmaXQgaW4KKwkJICogZG9pbmcgZXh0cmEgY29tcHV0 YXRpb24uCisJCSAqLworCQlpZiAocGF0aC0+aXBhdGgucGF0aC5wYXJhbGxlbF93b3JrZXJz IDw9IDApCisJCQlyZXR1cm47CisKKwkJcGF0aC0+aXBhdGgucGF0aC5wYXJhbGxlbF9hd2Fy ZSA9IHRydWU7CisJfQorCisJLyoKKwkgKiBOb3cgaW50ZXJwb2xhdGUgYmFzZWQgb24gZXN0 aW1hdGVkIGluZGV4IG9yZGVyIGNvcnJlbGF0aW9uIHRvIGdldCB0b3RhbAorCSAqIGRpc2sg SS9PIGNvc3QgZm9yIG1haW4gdGFibGUgYWNjZXNzZXMuCisJICovCisJY3NxdWFyZWQgPSBp bmRleENvcnJlbGF0aW9uICogaW5kZXhDb3JyZWxhdGlvbjsKKworCXJ1bl9jb3N0ICs9IG1h eF9JT19jb3N0ICsgY3NxdWFyZWQgKiAobWluX0lPX2Nvc3QgLSBtYXhfSU9fY29zdCk7CisK KwkvKgorCSAqIEVzdGltYXRlIENQVSBjb3N0cyBwZXIgdHVwbGUuCisJICoKKwkgKiBXaGF0 IHdlIHdhbnQgaGVyZSBpcyBjcHVfdHVwbGVfY29zdCBwbHVzIHRoZSBldmFsdWF0aW9uIGNv c3RzIG9mIGFueQorCSAqIHF1YWwgY2xhdXNlcyB0aGF0IHdlIGhhdmUgdG8gZXZhbHVhdGUg YXMgcXBxdWFscy4KKwkgKi8KKwljb3N0X3F1YWxfZXZhbCgmcXBxdWFsX2Nvc3QsIHFwcXVh bHMsIHJvb3QpOworCisJc3RhcnR1cF9jb3N0ICs9IHFwcXVhbF9jb3N0LnN0YXJ0dXA7CisJ Y3B1X3Blcl90dXBsZSA9IGNwdV90dXBsZV9jb3N0ICsgcXBxdWFsX2Nvc3QucGVyX3R1cGxl OworCisJY3B1X3J1bl9jb3N0ICs9IGNwdV9wZXJfdHVwbGUgKiB0dXBsZXNfZmV0Y2hlZDsK KworCS8qIHRsaXN0IGV2YWwgY29zdHMgYXJlIHBhaWQgcGVyIG91dHB1dCByb3csIG5vdCBw ZXIgdHVwbGUgc2Nhbm5lZCAqLworCXN0YXJ0dXBfY29zdCArPSBwYXRoLT5pcGF0aC5wYXRo LnBhdGh0YXJnZXQtPmNvc3Quc3RhcnR1cDsKKwljcHVfcnVuX2Nvc3QgKz0gcGF0aC0+aXBh dGgucGF0aC5wYXRodGFyZ2V0LT5jb3N0LnBlcl90dXBsZSAqIHBhdGgtPmlwYXRoLnBhdGgu cm93czsKKworCS8qIEFkanVzdCBjb3N0aW5nIGZvciBwYXJhbGxlbGlzbSwgaWYgdXNlZC4g Ki8KKwlpZiAocGF0aC0+aXBhdGgucGF0aC5wYXJhbGxlbF93b3JrZXJzID4gMCkKKwl7CisJ CWRvdWJsZQkJcGFyYWxsZWxfZGl2aXNvciA9IGdldF9wYXJhbGxlbF9kaXZpc29yKCZwYXRo LT5pcGF0aC5wYXRoKTsKKworCQlwYXRoLT5pcGF0aC5wYXRoLnJvd3MgPSBjbGFtcF9yb3df ZXN0KHBhdGgtPmlwYXRoLnBhdGgucm93cyAvIHBhcmFsbGVsX2Rpdmlzb3IpOworCisJCS8q IFRoZSBDUFUgY29zdCBpcyBkaXZpZGVkIGFtb25nIGFsbCB0aGUgd29ya2Vycy4gKi8KKwkJ Y3B1X3J1bl9jb3N0IC89IHBhcmFsbGVsX2Rpdmlzb3I7CisJfQorCisJcnVuX2Nvc3QgKz0g Y3B1X3J1bl9jb3N0OworCisJcGF0aC0+aXBhdGgucGF0aC5zdGFydHVwX2Nvc3QgPSBzdGFy dHVwX2Nvc3Q7CisJcGF0aC0+aXBhdGgucGF0aC50b3RhbF9jb3N0ID0gc3RhcnR1cF9jb3N0 ICsgcnVuX2Nvc3Q7Cit9CisKIC8qCiAgKiBleHRyYWN0X25vbmluZGV4X2NvbmRpdGlvbnMK ICAqCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9pbmR4cGF0aC5j IGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvaW5keHBhdGguYwppbmRleCBjMzFmY2M5 MTdkZi4uNmJhNDM0N2RiZGMgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL29wdGltaXplci9w YXRoL2luZHhwYXRoLmMKKysrIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvaW5keHBh dGguYwpAQCAtMTcsMTIgKzE3LDE2IEBACiAKICNpbmNsdWRlIDxtYXRoLmg+CiAKKyNpbmNs dWRlICJhY2Nlc3MvYnJpbl9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImFjY2Vzcy9yZWxhdGlv bi5oIgogI2luY2x1ZGUgImFjY2Vzcy9zdHJhdG51bS5oIgogI2luY2x1ZGUgImFjY2Vzcy9z eXNhdHRyLmgiCiAjaW5jbHVkZSAiY2F0YWxvZy9wZ19hbS5oIgogI2luY2x1ZGUgImNhdGFs b2cvcGdfb3BlcmF0b3IuaCIKKyNpbmNsdWRlICJjYXRhbG9nL3BnX29wY2xhc3MuaCIKICNp bmNsdWRlICJjYXRhbG9nL3BnX29wZmFtaWx5LmgiCiAjaW5jbHVkZSAiY2F0YWxvZy9wZ190 eXBlLmgiCisjaW5jbHVkZSAibWlzY2FkbWluLmgiCiAjaW5jbHVkZSAibm9kZXMvbWFrZWZ1 bmNzLmgiCiAjaW5jbHVkZSAibm9kZXMvbm9kZUZ1bmNzLmgiCiAjaW5jbHVkZSAibm9kZXMv c3VwcG9ydG5vZGVzLmgiCkBAIC0zMiwxMCArMzYsMTMgQEAKICNpbmNsdWRlICJvcHRpbWl6 ZXIvcGF0aHMuaCIKICNpbmNsdWRlICJvcHRpbWl6ZXIvcHJlcC5oIgogI2luY2x1ZGUgIm9w dGltaXplci9yZXN0cmljdGluZm8uaCIKKyNpbmNsdWRlICJ1dGlscy9yZWwuaCIKICNpbmNs dWRlICJ1dGlscy9sc3lzY2FjaGUuaCIKICNpbmNsdWRlICJ1dGlscy9zZWxmdW5jcy5oIgog CiAKK2Jvb2wJCWVuYWJsZV9icmluc29ydCA9IHRydWU7CisKIC8qIFhYWCBzZWUgUGFydENv bGxNYXRjaGVzRXhwckNvbGwgKi8KICNkZWZpbmUgSW5kZXhDb2xsTWF0Y2hlc0V4cHJDb2xs KGlkeGNvbGxhdGlvbiwgZXhwcmNvbGxhdGlvbikgXAogCSgoaWR4Y29sbGF0aW9uKSA9PSBJ bnZhbGlkT2lkIHx8IChpZHhjb2xsYXRpb24pID09IChleHByY29sbGF0aW9uKSkKQEAgLTEx MjcsNiArMTEzNCwxOTYgQEAgYnVpbGRfaW5kZXhfcGF0aHMoUGxhbm5lckluZm8gKnJvb3Qs IFJlbE9wdEluZm8gKnJlbCwKIAkJfQogCX0KIAorCS8qCisJICogSWYgdGhpcyBpcyBhIEJS SU4gaW5kZXggd2l0aCBzdWl0YWJsZSBvcGNsYXNzIChtaW5tYXggb3Igc3VjaCksIHdlIG1h eQorCSAqIHRyeSBkb2luZyBCUklOIHNvcnQuIEJSSU4gaW5kZXhlcyBhcmUgbm90IG9yZGVy ZWQgYW5kIGFtY2Fub3JkZXJieW9wCisJICogaXMgc2V0IHRvIGZhbHNlLCBzbyB3ZSBwcm9i YWJseSB3aWxsIG5lZWQgc29tZSBuZXcgb3BjbGFzcyBmbGFnIHRvCisJICogbWFyayBpbmRl eGVzIHRoYXQgc3VwcG9ydCB0aGlzLgorCSAqLworCWlmIChlbmFibGVfYnJpbnNvcnQgJiYg cGF0aGtleXNfcG9zc2libHlfdXNlZnVsKQorCXsKKwkJTGlzdENlbGwgKmxjOworCQlSZWxh dGlvbiByZWwyID0gcmVsYXRpb25fb3BlbihpbmRleC0+aW5kZXhvaWQsIE5vTG9jayk7CisJ CWludAkJIGlkeDsKKworCQkvKgorCQkgKiBUcnkgZ2VuZXJhdGluZyBzb3J0ZWQgcGF0aHMg Zm9yIGVhY2gga2V5IHdpdGggdGhlIHJpZ2h0IG9wY2xhc3MuCisJCSAqLworCQlpZHggPSAt MTsKKwkJZm9yZWFjaChsYywgaW5kZXgtPmluZGV4dGxpc3QpCisJCXsKKwkJCVRhcmdldEVu dHJ5CSAgICppbmRleHRsZSA9IChUYXJnZXRFbnRyeSAqKSBsZmlyc3QobGMpOworCQkJQnJp blNvcnRQYXRoICAgKmJwYXRoOworCQkJT2lkCQkJCXJhbmdlcHJvYzsKKwkJCUF0dHJOdW1i ZXIJCWF0dG51bTsKKworCQkJaWR4Kys7CisJCQlhdHRudW0gPSAoaWR4ICsgMSk7CisKKwkJ CS8qIHNraXAgZXhwcmVzc2lvbnMgZm9yIG5vdyAqLworCQkJaWYgKCFBdHRyaWJ1dGVOdW1i ZXJJc1ZhbGlkKGluZGV4LT5pbmRleGtleXNbaWR4XSkpCisJCQkJY29udGludWU7CisKKwkJ CS8qIFhYWCBpZ25vcmUgbm9uLUJSSU4gaW5kZXhlcyAqLworCQkJaWYgKHJlbDItPnJkX3Jl bC0+cmVsYW0gIT0gQlJJTl9BTV9PSUQpCisJCQkJY29udGludWU7CisKKwkJCS8qCisJCQkg KiBYWFggSWdub3JlIGtleXMgbm90IHVzaW5nIGFuIG9wY2xhc3Mgd2l0aCB0aGUgInJhbmdl cyIgcHJvYy4KKwkJCSAqIEZvciBub3cgd2Ugb25seSBkbyB0aGlzIGZvciBzb21lIG1pbm1h eCBvcGNsYXNzZXMsIGJ1dCBhZGRpbmcKKwkJCSAqIGl0IHRvIGFsbCBtaW5tYXggaXMgc2lt cGxlLCBhbmQgYWRkaW5nIGl0IHRvIG1pbm1heC1tdWx0aQorCQkJICogc2hvdWxkIG5vdCBi ZSB2ZXJ5IGhhcmQuCisJCQkgKi8KKwkJCXJhbmdlcHJvYyA9IGluZGV4X2dldHByb2NpZChy ZWwyLCBhdHRudW0sIEJSSU5fUFJPQ05VTV9SQU5HRVMpOworCQkJaWYgKCFPaWRJc1ZhbGlk KHJhbmdlcHJvYykpCisJCQkJY29udGludWU7CisKKwkJCW9yZGVyYnljbGF1c2VzID0gTklM OworCQkJb3JkZXJieWNsYXVzZWNvbHMgPSBOSUw7CisKKwkJCS8qCisJCQkgKiBYWFggc3R1 ZmYgZXh0cmFjdGVkIGZyb20gYnVpbGRfaW5kZXhfcGF0aGtleXMsIGV4Y2VwdCB0aGF0IHdl CisJCQkgKiBvbmx5IGRlYWwgd2l0aCBhIHNpbmdsZSBpbmRleCBrZXkgKHByb2R1Y2luZyBh IHNpbmdsZSBwYXRoa2V5KSwKKwkJCSAqIHNvIHdlIG9ubHkgc29ydCBvbiBhIHNpbmdsZSBj b2x1bW4uIEkgZ3Vlc3Mgd2UgY291bGQgdXNlIG1vcmUKKwkJCSAqIGluZGV4IGtleXMgYW5k IHNvcnQgb24gbW9yZSBleHByZXNzaW9ucz8gV291bGQgdGhhdCBtZWFuIHRoZXNlCisJCQkg KiBrZXlzIG5lZWQgdG8gYmUgcmF0aGVyIHdlbGwgY29ycmVsYXRlZD8gSW4gYW55IGNhc2Us IGl0IHNlZW1zCisJCQkgKiByYXRoZXIgY29tcGxleCB0byBpbXBsZW1lbnQsIHNvIEkgbGVh dmUgaXQgYXMgYSBwb3NzaWJsZQorCQkJICogZnV0dXJlIGltcHJvdmVtZW50LgorCQkJICoK KwkJCSAqIFhYWCBUaGlzIGNvdWxkIGFsc28gdXNlIHRoZSBvdGhlciBCUklOIGtleXMgKGV2 ZW4gZnJvbSBvdGhlcgorCQkJICogaW5kZXhlcykgaW4gYSBkaWZmZXJlbnQgd2F5IC0gd2Ug bWlnaHQgdXNlIHRoZSBvdGhlciByYW5nZXMKKwkJCSAqIHRvIHF1aWNrbHkgZWxpbWluYXRl IHNvbWUgb2YgdGhlIGNodW5rcywgZXNzZW50aWFsbHkgbGlrZSBhCisJCQkgKiBiaXRtYXAs IGJ1dCBtYXliZSB3aXRob3V0IHVzaW5nIHRoZSBiaXRtYXAuIE9yIHdlIG1pZ2h0IHVzZQor CQkJICogb3RoZXIgaW5kZXhlcyB0aHJvdWdoIGJpdG1hcHMuCisJCQkgKgorCQkJICogWFhY IFRoaXMgZmFrZXMgYSBudW1iZXIgb2YgcGFyYW1ldGVycywgYmVjYXVzZSB3ZSBkb24ndCBz dG9yZQorCQkJICogdGhlIGJ0cmVlIG9wY2xhc3MgaW4gdGhlIGluZGV4LCBpbnN0ZWFkIHdl IHVzZSB0aGUgZGVmYXVsdAorCQkJICogb25lIGZvciB0aGUga2V5IGRhdGEgdHlwZS4gQW5k IEJSSU4gZG9lcyBub3QgYWxsb3cgc3BlY2lmeWluZworCQkJICoKKwkJCSAqIFhYWCBXZSBk b24ndCBhZGQgdGhlIHBhdGggdG8gcmVzdWx0LCBiZWNhdXNlIHRoaXMgZnVuY3Rpb24gaXMK KwkJCSAqIHN1cHBvc2VkIHRvIGdlbmVyYXRlIEluZGV4UGF0aHMuIEluc3RlYWQsIHdlIGp1 c3QgYWRkIHRoZSBwYXRoCisJCQkgKiB1c2luZyBhZGRfcGF0aCgpLiBXZSBzaG91bGQgYmUg YnVpbGRpbmcgdGhpcyBpbiBhIGRpZmZlcmVudAorCQkJICogcGxhY2UsIHBlcmhhcHMgaW4g Y3JlYXRlX2luZGV4X3BhdGhzKCkgb3Igc28uCisJCQkgKgorCQkJICogWFhYIEJ5IGJ1aWxk aW5nIGl0IGVsc2V3aGVyZSwgd2UgY291bGQgYWxzbyBsZXZlcmFnZSB0aGUgaW5kZXgKKwkJ CSAqIHBhdGhzIHdlJ3ZlIGJ1aWx0IGhlcmUsIHBhcnRpY3VsYXJseSB0aGUgYml0bWFwIGlu ZGV4IHBhdGhzLAorCQkJICogd2hpY2ggd2UgY291bGQgdXNlIHRvIGVsaW1pbmF0ZSBtYW55 IG9mIHRoZSByYW5nZXMuCisJCQkgKgorCQkJICogWFhYIFdlIGRvbid0IGhhdmUgYW55IGV4 cGxpY2l0IG9yZGVyaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGUKKwkJCSAqIEJSSU4gaW5kZXgs IGUuZy4gd2UgZG9uJ3QgaGF2ZSBBU0MvREVTQyBhbmQgTlVMTFMgRklSU1QvTEFTVC4KKwkJ CSAqIFNvIHRoaXMgaXMgbm90IGVuY29kZWQgaW4gdGhlIGluZGV4LCBhbmQgd2UgY2FuIHNh dGlzZnkgYWxsCisJCQkgKiB0aGVzZSBjYXNlcyAtIGJ1dCB3ZSBuZWVkIHRvIGFkZCBwYXRo cyBmb3IgZWFjaCBjb21iaW5hdGlvbi4KKwkJCSAqIEkgd29uZGVyIGlmIHRoZXJlJ3MgYSBi ZXR0ZXIgd2F5IHRvIGRvIHRoaXMuCisJCQkgKi8KKworCQkJLyogQVNDIE5VTExTIExBU1Qg Ki8KKwkJCWluZGV4X3BhdGhrZXlzID0gYnVpbGRfaW5kZXhfcGF0aGtleXNfYnJpbihyb290 LCBpbmRleCwgaW5kZXh0bGUsCisJCQkJCQkJCQkJCQkJICAgaWR4LAorCQkJCQkJCQkJCQkJ CSAgIGZhbHNlLAkvKiByZXZlcnNlX3NvcnQgKi8KKwkJCQkJCQkJCQkJCQkgICBmYWxzZSk7 CS8qIG51bGxzX2ZpcnN0ICovCisKKwkJCXVzZWZ1bF9wYXRoa2V5cyA9IHRydW5jYXRlX3Vz ZWxlc3NfcGF0aGtleXMocm9vdCwgcmVsLAorCQkJCQkJCQkJCQkJCQlpbmRleF9wYXRoa2V5 cyk7CisKKwkJCWlmICh1c2VmdWxfcGF0aGtleXMgIT0gTklMKQorCQkJeworCQkJCWJwYXRo ID0gY3JlYXRlX2JyaW5zb3J0X3BhdGgocm9vdCwgaW5kZXgsCisJCQkJCQkJCQkJCSBpbmRl eF9jbGF1c2VzLAorCQkJCQkJCQkJCQkgb3JkZXJieWNsYXVzZXMsCisJCQkJCQkJCQkJCSBv cmRlcmJ5Y2xhdXNlY29scywKKwkJCQkJCQkJCQkJIHVzZWZ1bF9wYXRoa2V5cywKKwkJCQkJ CQkJCQkJIEZvcndhcmRTY2FuRGlyZWN0aW9uLAorCQkJCQkJCQkJCQkgaW5kZXhfb25seV9z Y2FuLAorCQkJCQkJCQkJCQkgb3V0ZXJfcmVsaWRzLAorCQkJCQkJCQkJCQkgbG9vcF9jb3Vu dCwKKwkJCQkJCQkJCQkJIGZhbHNlKTsKKworCQkJCS8qIGNoZWF0IGFuZCBhZGQgaXQgYW55 d2F5ICovCisJCQkJYWRkX3BhdGgocmVsLCAoUGF0aCAqKSBicGF0aCk7CisJCQl9CisKKwkJ CS8qIERFU0MgTlVMTFMgTEFTVCAqLworCQkJaW5kZXhfcGF0aGtleXMgPSBidWlsZF9pbmRl eF9wYXRoa2V5c19icmluKHJvb3QsIGluZGV4LCBpbmRleHRsZSwKKwkJCQkJCQkJCQkJCQkg ICBpZHgsCisJCQkJCQkJCQkJCQkJICAgdHJ1ZSwJLyogcmV2ZXJzZV9zb3J0ICovCisJCQkJ CQkJCQkJCQkJICAgZmFsc2UpOwkvKiBudWxsc19maXJzdCAqLworCisJCQl1c2VmdWxfcGF0 aGtleXMgPSB0cnVuY2F0ZV91c2VsZXNzX3BhdGhrZXlzKHJvb3QsIHJlbCwKKwkJCQkJCQkJ CQkJCQkJaW5kZXhfcGF0aGtleXMpOworCisJCQlpZiAodXNlZnVsX3BhdGhrZXlzICE9IE5J TCkKKwkJCXsKKwkJCQlicGF0aCA9IGNyZWF0ZV9icmluc29ydF9wYXRoKHJvb3QsIGluZGV4 LAorCQkJCQkJCQkJCQkgaW5kZXhfY2xhdXNlcywKKwkJCQkJCQkJCQkJIG9yZGVyYnljbGF1 c2VzLAorCQkJCQkJCQkJCQkgb3JkZXJieWNsYXVzZWNvbHMsCisJCQkJCQkJCQkJCSB1c2Vm dWxfcGF0aGtleXMsCisJCQkJCQkJCQkJCSBCYWNrd2FyZFNjYW5EaXJlY3Rpb24sCisJCQkJ CQkJCQkJCSBpbmRleF9vbmx5X3NjYW4sCisJCQkJCQkJCQkJCSBvdXRlcl9yZWxpZHMsCisJ CQkJCQkJCQkJCSBsb29wX2NvdW50LAorCQkJCQkJCQkJCQkgZmFsc2UpOworCisJCQkJLyog Y2hlYXQgYW5kIGFkZCBpdCBhbnl3YXkgKi8KKwkJCQlhZGRfcGF0aChyZWwsIChQYXRoICop IGJwYXRoKTsKKwkJCX0KKworCQkJLyogQVNDIE5VTExTIEZJUlNUICovCisJCQlpbmRleF9w YXRoa2V5cyA9IGJ1aWxkX2luZGV4X3BhdGhrZXlzX2JyaW4ocm9vdCwgaW5kZXgsIGluZGV4 dGxlLAorCQkJCQkJCQkJCQkJCSAgIGlkeCwKKwkJCQkJCQkJCQkJCQkgICBmYWxzZSwJLyog cmV2ZXJzZV9zb3J0ICovCisJCQkJCQkJCQkJCQkJICAgdHJ1ZSk7CS8qIG51bGxzX2ZpcnN0 ICovCisKKwkJCXVzZWZ1bF9wYXRoa2V5cyA9IHRydW5jYXRlX3VzZWxlc3NfcGF0aGtleXMo cm9vdCwgcmVsLAorCQkJCQkJCQkJCQkJCQlpbmRleF9wYXRoa2V5cyk7CisKKwkJCWlmICh1 c2VmdWxfcGF0aGtleXMgIT0gTklMKQorCQkJeworCQkJCWJwYXRoID0gY3JlYXRlX2JyaW5z b3J0X3BhdGgocm9vdCwgaW5kZXgsCisJCQkJCQkJCQkJCSBpbmRleF9jbGF1c2VzLAorCQkJ CQkJCQkJCQkgb3JkZXJieWNsYXVzZXMsCisJCQkJCQkJCQkJCSBvcmRlcmJ5Y2xhdXNlY29s cywKKwkJCQkJCQkJCQkJIHVzZWZ1bF9wYXRoa2V5cywKKwkJCQkJCQkJCQkJIEZvcndhcmRT Y2FuRGlyZWN0aW9uLAorCQkJCQkJCQkJCQkgaW5kZXhfb25seV9zY2FuLAorCQkJCQkJCQkJ CQkgb3V0ZXJfcmVsaWRzLAorCQkJCQkJCQkJCQkgbG9vcF9jb3VudCwKKwkJCQkJCQkJCQkJ IGZhbHNlKTsKKworCQkJCS8qIGNoZWF0IGFuZCBhZGQgaXQgYW55d2F5ICovCisJCQkJYWRk X3BhdGgocmVsLCAoUGF0aCAqKSBicGF0aCk7CisJCQl9CisKKwkJCS8qIERFU0MgTlVMTFMg RklSU1QgKi8KKwkJCWluZGV4X3BhdGhrZXlzID0gYnVpbGRfaW5kZXhfcGF0aGtleXNfYnJp bihyb290LCBpbmRleCwgaW5kZXh0bGUsCisJCQkJCQkJCQkJCQkJICAgaWR4LAorCQkJCQkJ CQkJCQkJCSAgIHRydWUsCS8qIHJldmVyc2Vfc29ydCAqLworCQkJCQkJCQkJCQkJCSAgIHRy dWUpOwkvKiBudWxsc19maXJzdCAqLworCisJCQl1c2VmdWxfcGF0aGtleXMgPSB0cnVuY2F0 ZV91c2VsZXNzX3BhdGhrZXlzKHJvb3QsIHJlbCwKKwkJCQkJCQkJCQkJCQkJaW5kZXhfcGF0 aGtleXMpOworCisJCQlpZiAodXNlZnVsX3BhdGhrZXlzICE9IE5JTCkKKwkJCXsKKwkJCQli cGF0aCA9IGNyZWF0ZV9icmluc29ydF9wYXRoKHJvb3QsIGluZGV4LAorCQkJCQkJCQkJCQkg aW5kZXhfY2xhdXNlcywKKwkJCQkJCQkJCQkJIG9yZGVyYnljbGF1c2VzLAorCQkJCQkJCQkJ CQkgb3JkZXJieWNsYXVzZWNvbHMsCisJCQkJCQkJCQkJCSB1c2VmdWxfcGF0aGtleXMsCisJ CQkJCQkJCQkJCSBCYWNrd2FyZFNjYW5EaXJlY3Rpb24sCisJCQkJCQkJCQkJCSBpbmRleF9v bmx5X3NjYW4sCisJCQkJCQkJCQkJCSBvdXRlcl9yZWxpZHMsCisJCQkJCQkJCQkJCSBsb29w X2NvdW50LAorCQkJCQkJCQkJCQkgZmFsc2UpOworCisJCQkJLyogY2hlYXQgYW5kIGFkZCBp dCBhbnl3YXkgKi8KKwkJCQlhZGRfcGF0aChyZWwsIChQYXRoICopIGJwYXRoKTsKKwkJCX0K KwkJfQorCisJCXJlbGF0aW9uX2Nsb3NlKHJlbDIsIE5vTG9jayk7CisJfQorCiAJcmV0dXJu IHJlc3VsdDsKIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgv cGF0aGtleXMuYyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL3BhdGhrZXlzLmMKaW5k ZXggYTk5NDNjZDZlMDEuLjgzZGRlNmYyMmViIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9v cHRpbWl6ZXIvcGF0aC9wYXRoa2V5cy5jCisrKyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9w YXRoL3BhdGhrZXlzLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlICJvcHRpbWl6ZXIv cGF0aHMuaCIKICNpbmNsdWRlICJwYXJ0aXRpb25pbmcvcGFydGJvdW5kcy5oIgogI2luY2x1 ZGUgInV0aWxzL2xzeXNjYWNoZS5oIgorI2luY2x1ZGUgInV0aWxzL3R5cGNhY2hlLmgiCiAK IAogc3RhdGljIGJvb2wgcGF0aGtleV9pc19yZWR1bmRhbnQoUGF0aEtleSAqbmV3X3BhdGhr ZXksIExpc3QgKnBhdGhrZXlzKTsKQEAgLTYzMCw2ICs2MzEsNTUgQEAgYnVpbGRfaW5kZXhf cGF0aGtleXMoUGxhbm5lckluZm8gKnJvb3QsCiAJcmV0dXJuIHJldHZhbDsKIH0KIAorCitM aXN0ICoKK2J1aWxkX2luZGV4X3BhdGhrZXlzX2JyaW4oUGxhbm5lckluZm8gKnJvb3QsCisJ CQkJCQkgIEluZGV4T3B0SW5mbyAqaW5kZXgsCisJCQkJCQkgIFRhcmdldEVudHJ5ICAqdGxl LAorCQkJCQkJICBpbnQgaWR4LAorCQkJCQkJICBib29sIHJldmVyc2Vfc29ydCwKKwkJCQkJ CSAgYm9vbCBudWxsc19maXJzdCkKK3sKKwlUeXBlQ2FjaGVFbnRyeSAqdHlwY2FjaGU7CisJ UGF0aEtleQkJICAgKmNwYXRoa2V5OworCU9pZAkJCQlzb3J0b3BmYW1pbHk7CisKKwkvKgor CSAqIEdldCBkZWZhdWx0IGJ0cmVlIG9wZmFtaWx5IGZvciB0aGUgdHlwZSwgZXh0cmFjdGVk IGZyb20gdGhlCisJICogZW50cnkgaW4gaW5kZXggdGFyZ2V0bGlzdC4KKwkgKgorCSAqIFhY WCBJcyB0aGVyZSBhIGJldHRlciAvIG1vcmUgY29ycmVjdCB3YXkgdG8gZG8gdGhpcz8KKwkg Ki8KKwl0eXBjYWNoZSA9IGxvb2t1cF90eXBlX2NhY2hlKGV4cHJUeXBlKChOb2RlICopIHRs ZS0+ZXhwciksCisJCQkJCQkJCSBUWVBFQ0FDSEVfQlRSRUVfT1BGQU1JTFkpOworCXNvcnRv cGZhbWlseSA9IHR5cGNhY2hlLT5idHJlZV9vcGY7CisKKwkvKgorCSAqIE9LLCB0cnkgdG8g bWFrZSBhIGNhbm9uaWNhbCBwYXRoa2V5IGZvciB0aGlzIHNvcnQga2V5LiAgTm90ZSB3ZSdy ZQorCSAqIHVuZGVybmVhdGggYW55IG91dGVyIGpvaW5zLCBzbyBudWxsYWJsZV9yZWxpZHMg c2hvdWxkIGJlIE5VTEwuCisJICovCisJY3BhdGhrZXkgPSBtYWtlX3BhdGhrZXlfZnJvbV9z b3J0aW5mbyhyb290LAorCQkJCQkJCQkJCSAgdGxlLT5leHByLAorCQkJCQkJCQkJCSAgTlVM TCwKKwkJCQkJCQkJCQkgIHNvcnRvcGZhbWlseSwKKwkJCQkJCQkJCQkgIGluZGV4LT5vcGNp bnR5cGVbaWR4XSwKKwkJCQkJCQkJCQkgIGluZGV4LT5pbmRleGNvbGxhdGlvbnNbaWR4XSwK KwkJCQkJCQkJCQkgIHJldmVyc2Vfc29ydCwKKwkJCQkJCQkJCQkgIG51bGxzX2ZpcnN0LAor CQkJCQkJCQkJCSAgMCwKKwkJCQkJCQkJCQkgIGluZGV4LT5yZWwtPnJlbGlkcywKKwkJCQkJ CQkJCQkgIGZhbHNlKTsKKworCS8qCisJICogVGhlcmUgbWF5IGJlIG5vIHBhdGhrZXkgaWYg d2UgaGF2ZW4ndCBtYXRjaGVkIGFueSBzb3J0a2V5LCBpbiB3aGljaAorCSAqIGNhc2UgaWdu b3JlIGl0LgorCSAqLworCWlmICghY3BhdGhrZXkpCisJCXJldHVybiBOSUw7CisKKwlyZXR1 cm4gbGlzdF9tYWtlMShjcGF0aGtleSk7Cit9CisKIC8qCiAgKiBwYXJ0a2V5X2lzX2Jvb2xf Y29uc3RhbnRfZm9yX3F1ZXJ5CiAgKgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvb3B0aW1p emVyL3BsYW4vY3JlYXRlcGxhbi5jIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vY3Jl YXRlcGxhbi5jCmluZGV4IGFiNGQ4ZTIwMWRmLi42M2ZmZGY5YTZhYiAxMDA2NDQKLS0tIGEv c3JjL2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vY3JlYXRlcGxhbi5jCisrKyBiL3NyYy9iYWNr ZW5kL29wdGltaXplci9wbGFuL2NyZWF0ZXBsYW4uYwpAQCAtMTI0LDYgKzEyNCw4IEBAIHN0 YXRpYyBTYW1wbGVTY2FuICpjcmVhdGVfc2FtcGxlc2Nhbl9wbGFuKFBsYW5uZXJJbmZvICpy b290LCBQYXRoICpiZXN0X3BhdGgsCiAJCQkJCQkJCQkJICBMaXN0ICp0bGlzdCwgTGlzdCAq c2Nhbl9jbGF1c2VzKTsKIHN0YXRpYyBTY2FuICpjcmVhdGVfaW5kZXhzY2FuX3BsYW4oUGxh bm5lckluZm8gKnJvb3QsIEluZGV4UGF0aCAqYmVzdF9wYXRoLAogCQkJCQkJCQkgICBMaXN0 ICp0bGlzdCwgTGlzdCAqc2Nhbl9jbGF1c2VzLCBib29sIGluZGV4b25seSk7CitzdGF0aWMg QnJpblNvcnQgKmNyZWF0ZV9icmluc29ydF9wbGFuKFBsYW5uZXJJbmZvICpyb290LCBCcmlu U29ydFBhdGggKmJlc3RfcGF0aCwKKwkJCQkJCQkJCSAgTGlzdCAqdGxpc3QsIExpc3QgKnNj YW5fY2xhdXNlcyk7CiBzdGF0aWMgQml0bWFwSGVhcFNjYW4gKmNyZWF0ZV9iaXRtYXBfc2Nh bl9wbGFuKFBsYW5uZXJJbmZvICpyb290LAogCQkJCQkJCQkJCQkgICBCaXRtYXBIZWFwUGF0 aCAqYmVzdF9wYXRoLAogCQkJCQkJCQkJCQkgICBMaXN0ICp0bGlzdCwgTGlzdCAqc2Nhbl9j bGF1c2VzKTsKQEAgLTE5MSw2ICsxOTMsOSBAQCBzdGF0aWMgSW5kZXhPbmx5U2NhbiAqbWFr ZV9pbmRleG9ubHlzY2FuKExpc3QgKnFwdGxpc3QsIExpc3QgKnFwcXVhbCwKIAkJCQkJCQkJ CQkgTGlzdCAqaW5kZXhvcmRlcmJ5LAogCQkJCQkJCQkJCSBMaXN0ICppbmRleHRsaXN0LAog CQkJCQkJCQkJCSBTY2FuRGlyZWN0aW9uIGluZGV4c2NhbmRpcik7CitzdGF0aWMgQnJpblNv cnQgKm1ha2VfYnJpbnNvcnQoTGlzdCAqcXB0bGlzdCwgTGlzdCAqcXBxdWFsLCBJbmRleCBz Y2FucmVsaWQsCisJCQkJCQkJICAgT2lkIGluZGV4aWQsIExpc3QgKmluZGV4cXVhbCwgTGlz dCAqaW5kZXhxdWFsb3JpZywKKwkJCQkJCQkgICBTY2FuRGlyZWN0aW9uIGluZGV4c2NhbmRp cik7CiBzdGF0aWMgQml0bWFwSW5kZXhTY2FuICptYWtlX2JpdG1hcF9pbmRleHNjYW4oSW5k ZXggc2NhbnJlbGlkLCBPaWQgaW5kZXhpZCwKIAkJCQkJCQkJCQkJICBMaXN0ICppbmRleHF1 YWwsCiAJCQkJCQkJCQkJCSAgTGlzdCAqaW5kZXhxdWFsb3JpZyk7CkBAIC00MTAsNiArNDE1 LDkgQEAgY3JlYXRlX3BsYW5fcmVjdXJzZShQbGFubmVySW5mbyAqcm9vdCwgUGF0aCAqYmVz dF9wYXRoLCBpbnQgZmxhZ3MpCiAJCWNhc2UgVF9DdXN0b21TY2FuOgogCQkJcGxhbiA9IGNy ZWF0ZV9zY2FuX3BsYW4ocm9vdCwgYmVzdF9wYXRoLCBmbGFncyk7CiAJCQlicmVhazsKKwkJ Y2FzZSBUX0JyaW5Tb3J0OgorCQkJcGxhbiA9IGNyZWF0ZV9zY2FuX3BsYW4ocm9vdCwgYmVz dF9wYXRoLCBmbGFncyk7CisJCQlicmVhazsKIAkJY2FzZSBUX0hhc2hKb2luOgogCQljYXNl IFRfTWVyZ2VKb2luOgogCQljYXNlIFRfTmVzdExvb3A6CkBAIC03NzYsNiArNzg0LDEzIEBA IGNyZWF0ZV9zY2FuX3BsYW4oUGxhbm5lckluZm8gKnJvb3QsIFBhdGggKmJlc3RfcGF0aCwg aW50IGZsYWdzKQogCQkJCQkJCQkJCQkJICAgc2Nhbl9jbGF1c2VzKTsKIAkJCWJyZWFrOwog CisJCWNhc2UgVF9CcmluU29ydDoKKwkJCXBsYW4gPSAoUGxhbiAqKSBjcmVhdGVfYnJpbnNv cnRfcGxhbihyb290LAorCQkJCQkJCQkJCQkJIChCcmluU29ydFBhdGggKikgYmVzdF9wYXRo LAorCQkJCQkJCQkJCQkJIHRsaXN0LAorCQkJCQkJCQkJCQkJIHNjYW5fY2xhdXNlcyk7CisJ CQlicmVhazsKKwogCQlkZWZhdWx0OgogCQkJZWxvZyhFUlJPUiwgInVucmVjb2duaXplZCBu b2RlIHR5cGU6ICVkIiwKIAkJCQkgKGludCkgYmVzdF9wYXRoLT5wYXRodHlwZSk7CkBAIC0z MTgwLDYgKzMxOTUsMTU1IEBAIGNyZWF0ZV9pbmRleHNjYW5fcGxhbihQbGFubmVySW5mbyAq cm9vdCwKIAlyZXR1cm4gc2Nhbl9wbGFuOwogfQogCisvKgorICogY3JlYXRlX2luZGV4c2Nh bl9wbGFuCisgKgkgIFJldHVybnMgYW4gaW5kZXhzY2FuIHBsYW4gZm9yIHRoZSBiYXNlIHJl bGF0aW9uIHNjYW5uZWQgYnkgJ2Jlc3RfcGF0aCcKKyAqCSAgd2l0aCByZXN0cmljdGlvbiBj bGF1c2VzICdzY2FuX2NsYXVzZXMnIGFuZCB0YXJnZXRsaXN0ICd0bGlzdCcuCisgKgorICog V2UgdXNlIHRoaXMgZm9yIGJvdGggcGxhaW4gSW5kZXhTY2FucyBhbmQgSW5kZXhPbmx5U2Nh bnMsIGJlY2F1c2UgdGhlCisgKiBxdWFsIHByZXByb2Nlc3Npbmcgd29yayBpcyB0aGUgc2Ft ZSBmb3IgYm90aC4gIE5vdGUgdGhhdCB0aGUgY2FsbGVyIHRlbGxzCisgKiB1cyB3aGljaCB0 byBidWlsZCAtLS0gd2UgZG9uJ3QgbG9vayBhdCBiZXN0X3BhdGgtPnBhdGgucGF0aHR5cGUs IGJlY2F1c2UKKyAqIGNyZWF0ZV9iaXRtYXBfc3VicGxhbiBuZWVkcyB0byBiZSBhYmxlIHRv IG92ZXJyaWRlIHRoZSBwcmlvciBkZWNpc2lvbi4KKyAqLworc3RhdGljIEJyaW5Tb3J0ICoK K2NyZWF0ZV9icmluc29ydF9wbGFuKFBsYW5uZXJJbmZvICpyb290LAorCQkJCQkgQnJpblNv cnRQYXRoICpiZXN0X3BhdGgsCisJCQkJCSBMaXN0ICp0bGlzdCwKKwkJCQkJIExpc3QgKnNj YW5fY2xhdXNlcykKK3sKKwlCcmluU29ydCAgICpicmluc29ydF9wbGFuOworCUxpc3QJICAg KmluZGV4Y2xhdXNlcyA9IGJlc3RfcGF0aC0+aXBhdGguaW5kZXhjbGF1c2VzOworCUluZGV4 CQliYXNlcmVsaWQgPSBiZXN0X3BhdGgtPmlwYXRoLnBhdGgucGFyZW50LT5yZWxpZDsKKwlJ bmRleE9wdEluZm8gKmluZGV4aW5mbyA9IGJlc3RfcGF0aC0+aXBhdGguaW5kZXhpbmZvOwor CU9pZAkJCWluZGV4b2lkID0gaW5kZXhpbmZvLT5pbmRleG9pZDsKKwlMaXN0CSAgICpxcHF1 YWw7CisJTGlzdAkgICAqc3RyaXBwZWRfaW5kZXhxdWFsczsKKwlMaXN0CSAgICpmaXhlZF9p bmRleHF1YWxzOworCUxpc3RDZWxsICAgKmw7CisKKwlMaXN0CSAgICpwYXRoa2V5cyA9IGJl c3RfcGF0aC0+aXBhdGgucGF0aC5wYXRoa2V5czsKKworCS8qIGl0IHNob3VsZCBiZSBhIGJh c2UgcmVsLi4uICovCisJQXNzZXJ0KGJhc2VyZWxpZCA+IDApOworCUFzc2VydChiZXN0X3Bh dGgtPmlwYXRoLnBhdGgucGFyZW50LT5ydGVraW5kID09IFJURV9SRUxBVElPTik7CisKKwkv KgorCSAqIEV4dHJhY3QgdGhlIGluZGV4IHF1YWwgZXhwcmVzc2lvbnMgKHN0cmlwcGVkIG9m IFJlc3RyaWN0SW5mb3MpIGZyb20gdGhlCisJICogSW5kZXhDbGF1c2VzIGxpc3QsIGFuZCBw cmVwYXJlIGEgY29weSB3aXRoIGluZGV4IFZhcnMgc3Vic3RpdHV0ZWQgZm9yCisJICogdGFi bGUgVmFycy4gIChUaGlzIHN0ZXAgYWxzbyBkb2VzIHJlcGxhY2VfbmVzdGxvb3BfcGFyYW1z IG9uIHRoZQorCSAqIGZpeGVkX2luZGV4cXVhbHMuKQorCSAqLworCWZpeF9pbmRleHF1YWxf cmVmZXJlbmNlcyhyb290LCAmYmVzdF9wYXRoLT5pcGF0aCwKKwkJCQkJCQkgJnN0cmlwcGVk X2luZGV4cXVhbHMsCisJCQkJCQkJICZmaXhlZF9pbmRleHF1YWxzKTsKKworCS8qCisJICog VGhlIHFwcXVhbCBsaXN0IG11c3QgY29udGFpbiBhbGwgcmVzdHJpY3Rpb25zIG5vdCBhdXRv bWF0aWNhbGx5IGhhbmRsZWQKKwkgKiBieSB0aGUgaW5kZXgsIG90aGVyIHRoYW4gcHNldWRv Y29uc3RhbnQgY2xhdXNlcyB3aGljaCB3aWxsIGJlIGhhbmRsZWQKKwkgKiBieSBhIHNlcGFy YXRlIGdhdGluZyBwbGFuIG5vZGUuICBBbGwgdGhlIHByZWRpY2F0ZXMgaW4gdGhlIGluZGV4 cXVhbHMKKwkgKiB3aWxsIGJlIGNoZWNrZWQgKGVpdGhlciBieSB0aGUgaW5kZXggaXRzZWxm LCBvciBieSBub2RlSW5kZXhzY2FuLmMpLAorCSAqIGJ1dCBpZiB0aGVyZSBhcmUgYW55ICJz cGVjaWFsIiBvcGVyYXRvcnMgaW52b2x2ZWQgdGhlbiB0aGV5IG11c3QgYmUKKwkgKiBpbmNs dWRlZCBpbiBxcHF1YWwuICBUaGUgdXBzaG90IGlzIHRoYXQgcXBxdWFsIG11c3QgY29udGFp bgorCSAqIHNjYW5fY2xhdXNlcyBtaW51cyB3aGF0ZXZlciBhcHBlYXJzIGluIGluZGV4cXVh bHMuCisJICoKKwkgKiBpc19yZWR1bmRhbnRfd2l0aF9pbmRleGNsYXVzZXMoKSBkZXRlY3Rz IGNhc2VzIHdoZXJlIGEgc2NhbiBjbGF1c2UgaXMKKwkgKiBwcmVzZW50IGluIHRoZSBpbmRl eGNsYXVzZXMgbGlzdCBvciBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgc2FtZQorCSAqIEVxdWl2 YWxlbmNlQ2xhc3MgYXMgc29tZSBpbmRleGNsYXVzZSwgYW5kIGlzIHRoZXJlZm9yZSByZWR1 bmRhbnQgd2l0aAorCSAqIGl0LCB0aG91Z2ggbm90IGVxdWFsLiAgKFRoZSBsYXR0ZXIgaGFw cGVucyB3aGVuIGluZHhwYXRoLmMgcHJlZmVycyBhCisJICogZGlmZmVyZW50IGRlcml2ZWQg ZXF1YWxpdHkgdGhhbiB3aGF0IGdlbmVyYXRlX2pvaW5faW1wbGllZF9lcXVhbGl0aWVzCisJ ICogcGlja2VkIGZvciBhIHBhcmFtZXRlcml6ZWQgc2NhbidzIHBwaV9jbGF1c2VzLikgIE5v dGUgdGhhdCBpdCB3aWxsIG5vdAorCSAqIG1hdGNoIHRvIGxvc3N5IGluZGV4IGNsYXVzZXMs IHdoaWNoIGlzIGNyaXRpY2FsIGJlY2F1c2Ugd2UgaGF2ZSB0bworCSAqIGluY2x1ZGUgdGhl IG9yaWdpbmFsIGNsYXVzZSBpbiBxcHF1YWwgaW4gdGhhdCBjYXNlLgorCSAqCisJICogSW4g c29tZSBzaXR1YXRpb25zIChwYXJ0aWN1bGFybHkgd2l0aCBPUidkIGluZGV4IGNvbmRpdGlv bnMpIHdlIG1heQorCSAqIGhhdmUgc2Nhbl9jbGF1c2VzIHRoYXQgYXJlIG5vdCBlcXVhbCB0 bywgYnV0IGFyZSBsb2dpY2FsbHkgaW1wbGllZCBieSwKKwkgKiB0aGUgaW5kZXggcXVhbHM7 IHNvIHdlIGFsc28gdHJ5IGEgcHJlZGljYXRlX2ltcGxpZWRfYnkoKSBjaGVjayB0byBzZWUK KwkgKiBpZiB3ZSBjYW4gZGlzY2FyZCBxdWFscyB0aGF0IHdheS4gIChwcmVkaWNhdGVfaW1w bGllZF9ieSBhc3N1bWVzIGl0cworCSAqIGZpcnN0IGlucHV0IGNvbnRhaW5zIG9ubHkgaW1t dXRhYmxlIGZ1bmN0aW9ucywgc28gd2UgaGF2ZSB0byBjaGVjaworCSAqIHRoYXQuKQorCSAq CisJICogTm90ZTogaWYgeW91IGNoYW5nZSB0aGlzIGJpdCBvZiBjb2RlIHlvdSBzaG91bGQg YWxzbyBsb29rIGF0CisJICogZXh0cmFjdF9ub25pbmRleF9jb25kaXRpb25zKCkgaW4gY29z dHNpemUuYy4KKwkgKi8KKwlxcHF1YWwgPSBOSUw7CisJZm9yZWFjaChsLCBzY2FuX2NsYXVz ZXMpCisJeworCQlSZXN0cmljdEluZm8gKnJpbmZvID0gbGZpcnN0X25vZGUoUmVzdHJpY3RJ bmZvLCBsKTsKKworCQlpZiAocmluZm8tPnBzZXVkb2NvbnN0YW50KQorCQkJY29udGludWU7 CQkJLyogd2UgbWF5IGRyb3AgcHNldWRvY29uc3RhbnRzIGhlcmUgKi8KKwkJaWYgKGlzX3Jl ZHVuZGFudF93aXRoX2luZGV4Y2xhdXNlcyhyaW5mbywgaW5kZXhjbGF1c2VzKSkKKwkJCWNv bnRpbnVlOwkJCS8qIGR1cCBvciBkZXJpdmVkIGZyb20gc2FtZSBFcXVpdmFsZW5jZUNsYXNz ICovCisJCWlmICghY29udGFpbl9tdXRhYmxlX2Z1bmN0aW9ucygoTm9kZSAqKSByaW5mby0+ Y2xhdXNlKSAmJgorCQkJcHJlZGljYXRlX2ltcGxpZWRfYnkobGlzdF9tYWtlMShyaW5mby0+ Y2xhdXNlKSwgc3RyaXBwZWRfaW5kZXhxdWFscywKKwkJCQkJCQkJIGZhbHNlKSkKKwkJCWNv bnRpbnVlOwkJCS8qIHByb3ZhYmx5IGltcGxpZWQgYnkgaW5kZXhxdWFscyAqLworCQlxcHF1 YWwgPSBsYXBwZW5kKHFwcXVhbCwgcmluZm8pOworCX0KKworCS8qIFNvcnQgY2xhdXNlcyBp bnRvIGJlc3QgZXhlY3V0aW9uIG9yZGVyICovCisJcXBxdWFsID0gb3JkZXJfcXVhbF9jbGF1 c2VzKHJvb3QsIHFwcXVhbCk7CisKKwkvKiBSZWR1Y2UgUmVzdHJpY3RJbmZvIGxpc3QgdG8g YmFyZSBleHByZXNzaW9uczsgaWdub3JlIHBzZXVkb2NvbnN0YW50cyAqLworCXFwcXVhbCA9 IGV4dHJhY3RfYWN0dWFsX2NsYXVzZXMocXBxdWFsLCBmYWxzZSk7CisKKwkvKgorCSAqIFdl IGhhdmUgdG8gcmVwbGFjZSBhbnkgb3V0ZXItcmVsYXRpb24gdmFyaWFibGVzIHdpdGggbmVz dGxvb3AgcGFyYW1zIGluCisJICogdGhlIGluZGV4cXVhbG9yaWcsIHFwcXVhbCwgYW5kIGlu ZGV4b3JkZXJieW9yaWcgZXhwcmVzc2lvbnMuICBBIGJpdAorCSAqIGFubm95aW5nIHRvIGhh dmUgdG8gZG8gdGhpcyBzZXBhcmF0ZWx5IGZyb20gdGhlIHByb2Nlc3NpbmcgaW4KKwkgKiBm aXhfaW5kZXhxdWFsX3JlZmVyZW5jZXMgLS0tIHJldGhpbmsgdGhpcyB3aGVuIGdlbmVyYWxp emluZyB0aGUgaW5uZXIKKwkgKiBpbmRleHNjYW4gc3VwcG9ydC4gIEJ1dCBub3RlIHdlIGNh bid0IHJlYWxseSBkbyB0aGlzIGVhcmxpZXIgYmVjYXVzZQorCSAqIGl0J2QgYnJlYWsgdGhl IGNvbXBhcmlzb25zIHRvIHByZWRpY2F0ZXMgYWJvdmUgLi4uIChvciB3b3VsZCBpdD8gIFRo b3NlCisJICogd291bGRuJ3QgaGF2ZSBvdXRlciByZWZzKQorCSAqLworCWlmIChiZXN0X3Bh dGgtPmlwYXRoLnBhdGgucGFyYW1faW5mbykKKwl7CisJCXN0cmlwcGVkX2luZGV4cXVhbHMg PSAoTGlzdCAqKQorCQkJcmVwbGFjZV9uZXN0bG9vcF9wYXJhbXMocm9vdCwgKE5vZGUgKikg c3RyaXBwZWRfaW5kZXhxdWFscyk7CisJCXFwcXVhbCA9IChMaXN0ICopCisJCQlyZXBsYWNl X25lc3Rsb29wX3BhcmFtcyhyb290LCAoTm9kZSAqKSBxcHF1YWwpOworCX0KKworCS8qIEZp bmFsbHkgcmVhZHkgdG8gYnVpbGQgdGhlIHBsYW4gbm9kZSAqLworCWJyaW5zb3J0X3BsYW4g PSBtYWtlX2JyaW5zb3J0KHRsaXN0LAorCQkJCQkJCQkgIHFwcXVhbCwKKwkJCQkJCQkJICBi YXNlcmVsaWQsCisJCQkJCQkJCSAgaW5kZXhvaWQsCisJCQkJCQkJCSAgZml4ZWRfaW5kZXhx dWFscywKKwkJCQkJCQkJICBzdHJpcHBlZF9pbmRleHF1YWxzLAorCQkJCQkJCQkgIGJlc3Rf cGF0aC0+aXBhdGguaW5kZXhzY2FuZGlyKTsKKworCWlmIChwYXRoa2V5cyAhPSBOSUwpCisJ eworCQkvKgorCQkgKiBDb21wdXRlIHNvcnQgY29sdW1uIGluZm8sIGFuZCBhZGp1c3QgdGhl IEFwcGVuZCdzIHRsaXN0IGFzIG5lZWRlZC4KKwkJICogQmVjYXVzZSB3ZSBwYXNzIGFkanVz dF90bGlzdF9pbl9wbGFjZSA9IHRydWUsIHdlIG1heSBpZ25vcmUgdGhlCisJCSAqIGZ1bmN0 aW9uIHJlc3VsdDsgaXQgbXVzdCBiZSB0aGUgc2FtZSBwbGFuIG5vZGUuICBIb3dldmVyLCB3 ZSB0aGVuCisJCSAqIG5lZWQgdG8gZGV0ZWN0IHdoZXRoZXIgYW55IHRsaXN0IGVudHJpZXMg d2VyZSBhZGRlZC4KKwkJICovCisJCSh2b2lkKSBwcmVwYXJlX3NvcnRfZnJvbV9wYXRoa2V5 cygoUGxhbiAqKSBicmluc29ydF9wbGFuLCBwYXRoa2V5cywKKwkJCQkJCQkJCQkgIGJlc3Rf cGF0aC0+aXBhdGgucGF0aC5wYXJlbnQtPnJlbGlkcywKKwkJCQkJCQkJCQkgIE5VTEwsCisJ CQkJCQkJCQkJICB0cnVlLAorCQkJCQkJCQkJCSAgJmJyaW5zb3J0X3BsYW4tPm51bUNvbHMs CisJCQkJCQkJCQkJICAmYnJpbnNvcnRfcGxhbi0+c29ydENvbElkeCwKKwkJCQkJCQkJCQkg ICZicmluc29ydF9wbGFuLT5zb3J0T3BlcmF0b3JzLAorCQkJCQkJCQkJCSAgJmJyaW5zb3J0 X3BsYW4tPmNvbGxhdGlvbnMsCisJCQkJCQkJCQkJICAmYnJpbnNvcnRfcGxhbi0+bnVsbHNG aXJzdCk7CisJCS8vdGxpc3Rfd2FzX2NoYW5nZWQgPSAob3JpZ190bGlzdF9sZW5ndGggIT0g bGlzdF9sZW5ndGgocGxhbi0+cGxhbi50YXJnZXRsaXN0KSk7CisJCWZvciAoaW50IGkgPSAw OyBpIDwgYnJpbnNvcnRfcGxhbi0+bnVtQ29sczsgaSsrKQorCQkJZWxvZyhERUJVRzEsICIl ZCA9PiAlZCAlZCAlZCAlZCIsIGksCisJCQkJIGJyaW5zb3J0X3BsYW4tPnNvcnRDb2xJZHhb aV0sCisJCQkJIGJyaW5zb3J0X3BsYW4tPnNvcnRPcGVyYXRvcnNbaV0sCisJCQkJIGJyaW5z b3J0X3BsYW4tPmNvbGxhdGlvbnNbaV0sCisJCQkJIGJyaW5zb3J0X3BsYW4tPm51bGxzRmly c3RbaV0pOworCX0KKworCWNvcHlfZ2VuZXJpY19wYXRoX2luZm8oJmJyaW5zb3J0X3BsYW4t PnNjYW4ucGxhbiwgJmJlc3RfcGF0aC0+aXBhdGgucGF0aCk7CisKKwlyZXR1cm4gYnJpbnNv cnRfcGxhbjsKK30KKwogLyoKICAqIGNyZWF0ZV9iaXRtYXBfc2Nhbl9wbGFuCiAgKgkgIFJl dHVybnMgYSBiaXRtYXAgc2NhbiBwbGFuIGZvciB0aGUgYmFzZSByZWxhdGlvbiBzY2FubmVk IGJ5ICdiZXN0X3BhdGgnCkBAIC01NTIzLDYgKzU2ODcsMzEgQEAgbWFrZV9pbmRleHNjYW4o TGlzdCAqcXB0bGlzdCwKIAlyZXR1cm4gbm9kZTsKIH0KIAorc3RhdGljIEJyaW5Tb3J0ICoK K21ha2VfYnJpbnNvcnQoTGlzdCAqcXB0bGlzdCwKKwkJCSAgIExpc3QgKnFwcXVhbCwKKwkJ CSAgIEluZGV4IHNjYW5yZWxpZCwKKwkJCSAgIE9pZCBpbmRleGlkLAorCQkJICAgTGlzdCAq aW5kZXhxdWFsLAorCQkJICAgTGlzdCAqaW5kZXhxdWFsb3JpZywKKwkJCSAgIFNjYW5EaXJl Y3Rpb24gaW5kZXhzY2FuZGlyKQoreworCUJyaW5Tb3J0ICAqbm9kZSA9IG1ha2VOb2RlKEJy aW5Tb3J0KTsKKwlQbGFuCSAgICpwbGFuID0gJm5vZGUtPnNjYW4ucGxhbjsKKworCXBsYW4t PnRhcmdldGxpc3QgPSBxcHRsaXN0OworCXBsYW4tPnF1YWwgPSBxcHF1YWw7CisJcGxhbi0+ bGVmdHRyZWUgPSBOVUxMOworCXBsYW4tPnJpZ2h0dHJlZSA9IE5VTEw7CisJbm9kZS0+c2Nh bi5zY2FucmVsaWQgPSBzY2FucmVsaWQ7CisJbm9kZS0+aW5kZXhpZCA9IGluZGV4aWQ7CisJ bm9kZS0+aW5kZXhxdWFsID0gaW5kZXhxdWFsOworCW5vZGUtPmluZGV4cXVhbG9yaWcgPSBp bmRleHF1YWxvcmlnOworCW5vZGUtPmluZGV4b3JkZXJkaXIgPSBpbmRleHNjYW5kaXI7CisK KwlyZXR1cm4gbm9kZTsKK30KKwogc3RhdGljIEluZGV4T25seVNjYW4gKgogbWFrZV9pbmRl eG9ubHlzY2FuKExpc3QgKnFwdGxpc3QsCiAJCQkJICAgTGlzdCAqcXBxdWFsLApkaWZmIC0t Z2l0IGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vc2V0cmVmcy5jIGIvc3JjL2JhY2tl bmQvb3B0aW1pemVyL3BsYW4vc2V0cmVmcy5jCmluZGV4IDFjYjBhYmRiYzFmLi4yNTg0YTFm MDMyZCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vc2V0cmVmcy5j CisrKyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL3NldHJlZnMuYwpAQCAtNjA5LDYg KzYwOSwyNSBAQCBzZXRfcGxhbl9yZWZzKFBsYW5uZXJJbmZvICpyb290LCBQbGFuICpwbGFu LCBpbnQgcnRvZmZzZXQpCiAJCQkJcmV0dXJuIHNldF9pbmRleG9ubHlzY2FuX3JlZmVyZW5j ZXMocm9vdCwgc3BsYW4sIHJ0b2Zmc2V0KTsKIAkJCX0KIAkJCWJyZWFrOworCQljYXNlIFRf QnJpblNvcnQ6CisJCQl7CisJCQkJQnJpblNvcnQgICpzcGxhbiA9IChCcmluU29ydCAqKSBw bGFuOworCisJCQkJc3BsYW4tPnNjYW4uc2NhbnJlbGlkICs9IHJ0b2Zmc2V0OworCQkJCXNw bGFuLT5zY2FuLnBsYW4udGFyZ2V0bGlzdCA9CisJCQkJCWZpeF9zY2FuX2xpc3Qocm9vdCwg c3BsYW4tPnNjYW4ucGxhbi50YXJnZXRsaXN0LAorCQkJCQkJCQkgIHJ0b2Zmc2V0LCBOVU1f RVhFQ19UTElTVChwbGFuKSk7CisJCQkJc3BsYW4tPnNjYW4ucGxhbi5xdWFsID0KKwkJCQkJ Zml4X3NjYW5fbGlzdChyb290LCBzcGxhbi0+c2Nhbi5wbGFuLnF1YWwsCisJCQkJCQkJCSAg cnRvZmZzZXQsIE5VTV9FWEVDX1FVQUwocGxhbikpOworCQkJCXNwbGFuLT5pbmRleHF1YWwg PQorCQkJCQlmaXhfc2Nhbl9saXN0KHJvb3QsIHNwbGFuLT5pbmRleHF1YWwsCisJCQkJCQkJ CSAgcnRvZmZzZXQsIDEpOworCQkJCXNwbGFuLT5pbmRleHF1YWxvcmlnID0KKwkJCQkJZml4 X3NjYW5fbGlzdChyb290LCBzcGxhbi0+aW5kZXhxdWFsb3JpZywKKwkJCQkJCQkJICBydG9m ZnNldCwgTlVNX0VYRUNfUVVBTChwbGFuKSk7CisJCQl9CisJCQlicmVhazsKIAkJY2FzZSBU X0JpdG1hcEluZGV4U2NhbjoKIAkJCXsKIAkJCQlCaXRtYXBJbmRleFNjYW4gKnNwbGFuID0g KEJpdG1hcEluZGV4U2NhbiAqKSBwbGFuOwpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvb3B0 aW1pemVyL3V0aWwvcGF0aG5vZGUuYyBiL3NyYy9iYWNrZW5kL29wdGltaXplci91dGlsL3Bh dGhub2RlLmMKaW5kZXggNzBmNjFhZTdiMWMuLmU4YmVhZGIxN2I1IDEwMDY0NAotLS0gYS9z cmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRpbC9wYXRobm9kZS5jCisrKyBiL3NyYy9iYWNrZW5k L29wdGltaXplci91dGlsL3BhdGhub2RlLmMKQEAgLTEwMzAsNiArMTAzMCw2NSBAQCBjcmVh dGVfaW5kZXhfcGF0aChQbGFubmVySW5mbyAqcm9vdCwKIAlyZXR1cm4gcGF0aG5vZGU7CiB9 CiAKKworLyoKKyAqIGNyZWF0ZV9icmluc29ydF9wYXRoCisgKgkgIENyZWF0ZXMgYSBwYXRo IG5vZGUgZm9yIHNvcnRlZCBicmluIGluZGV4IHNjYW4uCisgKgorICogJ2luZGV4JyBpcyBh IHVzYWJsZSBpbmRleC4KKyAqICdpbmRleGNsYXVzZXMnIGlzIGEgbGlzdCBvZiBJbmRleENs YXVzZSBub2RlcyByZXByZXNlbnRpbmcgY2xhdXNlcworICoJCQl0byBiZSBlbmZvcmNlZCBh cyBxdWFsIGNvbmRpdGlvbnMgaW4gdGhlIHNjYW4uCisgKiAnaW5kZXhvcmRlcmJ5cycgaXMg YSBsaXN0IG9mIGJhcmUgZXhwcmVzc2lvbnMgKG5vIFJlc3RyaWN0SW5mb3MpCisgKgkJCXRv IGJlIHVzZWQgYXMgaW5kZXggb3JkZXJpbmcgb3BlcmF0b3JzIGluIHRoZSBzY2FuLgorICog J2luZGV4b3JkZXJieWNvbHMnIGlzIGFuIGludGVnZXIgbGlzdCBvZiBpbmRleCBjb2x1bW4g bnVtYmVycyAoemVybyBiYXNlZCkKKyAqCQkJdGhlIG9yZGVyaW5nIG9wZXJhdG9ycyBjYW4g YmUgdXNlZCB3aXRoLgorICogJ3BhdGhrZXlzJyBkZXNjcmliZXMgdGhlIG9yZGVyaW5nIG9m IHRoZSBwYXRoLgorICogJ2luZGV4c2NhbmRpcicgaXMgRm9yd2FyZFNjYW5EaXJlY3Rpb24g b3IgQmFja3dhcmRTY2FuRGlyZWN0aW9uCisgKgkJCWZvciBhbiBvcmRlcmVkIGluZGV4LCBv ciBOb01vdmVtZW50U2NhbkRpcmVjdGlvbiBmb3IKKyAqCQkJYW4gdW5vcmRlcmVkIGluZGV4 LgorICogJ2luZGV4b25seScgaXMgdHJ1ZSBpZiBhbiBpbmRleC1vbmx5IHNjYW4gaXMgd2Fu dGVkLgorICogJ3JlcXVpcmVkX291dGVyJyBpcyB0aGUgc2V0IG9mIG91dGVyIHJlbGlkcyBm b3IgYSBwYXJhbWV0ZXJpemVkIHBhdGguCisgKiAnbG9vcF9jb3VudCcgaXMgdGhlIG51bWJl ciBvZiByZXBldGl0aW9ucyBvZiB0aGUgaW5kZXhzY2FuIHRvIGZhY3RvciBpbnRvCisgKgkJ ZXN0aW1hdGVzIG9mIGNhY2hpbmcgYmVoYXZpb3IuCisgKiAncGFydGlhbF9wYXRoJyBpcyB0 cnVlIGlmIGNvbnN0cnVjdGluZyBhIHBhcmFsbGVsIGluZGV4IHNjYW4gcGF0aC4KKyAqCisg KiBSZXR1cm5zIHRoZSBuZXcgcGF0aCBub2RlLgorICovCitCcmluU29ydFBhdGggKgorY3Jl YXRlX2JyaW5zb3J0X3BhdGgoUGxhbm5lckluZm8gKnJvb3QsCisJCQkJCSBJbmRleE9wdElu Zm8gKmluZGV4LAorCQkJCQkgTGlzdCAqaW5kZXhjbGF1c2VzLAorCQkJCQkgTGlzdCAqaW5k ZXhvcmRlcmJ5cywKKwkJCQkJIExpc3QgKmluZGV4b3JkZXJieWNvbHMsCisJCQkJCSBMaXN0 ICpwYXRoa2V5cywKKwkJCQkJIFNjYW5EaXJlY3Rpb24gaW5kZXhzY2FuZGlyLAorCQkJCQkg Ym9vbCBpbmRleG9ubHksCisJCQkJCSBSZWxpZHMgcmVxdWlyZWRfb3V0ZXIsCisJCQkJCSBk b3VibGUgbG9vcF9jb3VudCwKKwkJCQkJIGJvb2wgcGFydGlhbF9wYXRoKQoreworCUJyaW5T b3J0UGF0aCAgKnBhdGhub2RlID0gbWFrZU5vZGUoQnJpblNvcnRQYXRoKTsKKwlSZWxPcHRJ bmZvICpyZWwgPSBpbmRleC0+cmVsOworCisJcGF0aG5vZGUtPmlwYXRoLnBhdGgucGF0aHR5 cGUgPSBUX0JyaW5Tb3J0OworCXBhdGhub2RlLT5pcGF0aC5wYXRoLnBhcmVudCA9IHJlbDsK KwlwYXRobm9kZS0+aXBhdGgucGF0aC5wYXRodGFyZ2V0ID0gcmVsLT5yZWx0YXJnZXQ7CisJ cGF0aG5vZGUtPmlwYXRoLnBhdGgucGFyYW1faW5mbyA9IGdldF9iYXNlcmVsX3BhcmFtcGF0 aGluZm8ocm9vdCwgcmVsLAorCQkJCQkJCQkJCQkJCQkgIHJlcXVpcmVkX291dGVyKTsKKwlw YXRobm9kZS0+aXBhdGgucGF0aC5wYXJhbGxlbF9hd2FyZSA9IGZhbHNlOworCXBhdGhub2Rl LT5pcGF0aC5wYXRoLnBhcmFsbGVsX3NhZmUgPSByZWwtPmNvbnNpZGVyX3BhcmFsbGVsOwor CXBhdGhub2RlLT5pcGF0aC5wYXRoLnBhcmFsbGVsX3dvcmtlcnMgPSAwOworCXBhdGhub2Rl LT5pcGF0aC5wYXRoLnBhdGhrZXlzID0gcGF0aGtleXM7CisKKwlwYXRobm9kZS0+aXBhdGgu aW5kZXhpbmZvID0gaW5kZXg7CisJcGF0aG5vZGUtPmlwYXRoLmluZGV4Y2xhdXNlcyA9IGlu ZGV4Y2xhdXNlczsKKwlwYXRobm9kZS0+aXBhdGguaW5kZXhzY2FuZGlyID0gaW5kZXhzY2Fu ZGlyOworCisJY29zdF9icmluc29ydChwYXRobm9kZSwgcm9vdCwgbG9vcF9jb3VudCwgcGFy dGlhbF9wYXRoKTsKKworCXJldHVybiBwYXRobm9kZTsKK30KKwogLyoKICAqIGNyZWF0ZV9i aXRtYXBfaGVhcF9wYXRoCiAgKgkgIENyZWF0ZXMgYSBwYXRoIG5vZGUgZm9yIGEgYml0bWFw IHNjYW4uCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9taXNjL2d1Y190YWJsZXMu YyBiL3NyYy9iYWNrZW5kL3V0aWxzL21pc2MvZ3VjX3RhYmxlcy5jCmluZGV4IDA1YWIwODc5 MzRjLi42Yzg1NGUzNTViMCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvbWlzYy9n dWNfdGFibGVzLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvbWlzYy9ndWNfdGFibGVzLmMK QEAgLTk2Nyw2ICs5NjcsMTYgQEAgc3RydWN0IGNvbmZpZ19ib29sIENvbmZpZ3VyZU5hbWVz Qm9vbFtdID0KIAkJdHJ1ZSwKIAkJTlVMTCwgTlVMTCwgTlVMTAogCX0sCisJeworCQl7ImVu YWJsZV9icmluc29ydCIsIFBHQ19VU0VSU0VULCBRVUVSWV9UVU5JTkdfTUVUSE9ELAorCQkJ Z2V0dGV4dF9ub29wKCJFbmFibGVzIHRoZSBwbGFubmVyJ3MgdXNlIG9mIEJSSU4gc29ydCBw bGFucy4iKSwKKwkJCU5VTEwsCisJCQlHVUNfRVhQTEFJTgorCQl9LAorCQkmZW5hYmxlX2Jy aW5zb3J0LAorCQlmYWxzZSwKKwkJTlVMTCwgTlVMTCwgTlVMTAorCX0sCiAJewogCQl7Imdl cW8iLCBQR0NfVVNFUlNFVCwgUVVFUllfVFVOSU5HX0dFUU8sCiAJCQlnZXR0ZXh0X25vb3Ao IkVuYWJsZXMgZ2VuZXRpYyBxdWVyeSBvcHRpbWl6YXRpb24uIiksCmRpZmYgLS1naXQgYS9z cmMvaW5jbHVkZS9hY2Nlc3MvYnJpbi5oIGIvc3JjL2luY2x1ZGUvYWNjZXNzL2JyaW4uaApp bmRleCA4ODdmYjBhNTUzMi4uZThmZmM0YTA0NTYgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRl L2FjY2Vzcy9icmluLmgKKysrIGIvc3JjL2luY2x1ZGUvYWNjZXNzL2JyaW4uaApAQCAtMzQs NiArMzQsMjYgQEAgdHlwZWRlZiBzdHJ1Y3QgQnJpblN0YXRzRGF0YQogCUJsb2NrTnVtYmVy IHJldm1hcE51bVBhZ2VzOwogfSBCcmluU3RhdHNEYXRhOwogCisvKgorICogSW5mbyBhYm91 dCByYW5nZXMgZm9yIEJSSU4gU29ydC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQnJpblJhbmdl Cit7CisJQmxvY2tOdW1iZXIgYmxrbm9fc3RhcnQ7CisJQmxvY2tOdW1iZXIgYmxrbm9fZW5k OworCisJRGF0dW0JbWluX3ZhbHVlOworCURhdHVtCW1heF92YWx1ZTsKKwlib29sCWhhc19u dWxsczsKKwlib29sCWFsbF9udWxsczsKKwlib29sCW5vdF9zdW1tYXJpemVkOworfSBCcmlu UmFuZ2U7CisKK3R5cGVkZWYgc3RydWN0IEJyaW5SYW5nZXMKK3sKKwlpbnQJCQlucmFuZ2Vz OworCUJyaW5SYW5nZQlyYW5nZXNbRkxFWElCTEVfQVJSQVlfTUVNQkVSXTsKK30gQnJpblJh bmdlczsKIAogI2RlZmluZSBCUklOX0RFRkFVTFRfUEFHRVNfUEVSX1JBTkdFCTEyOAogI2Rl ZmluZSBCcmluR2V0UGFnZXNQZXJSYW5nZShyZWxhdGlvbikgXApkaWZmIC0tZ2l0IGEvc3Jj L2luY2x1ZGUvYWNjZXNzL2JyaW5faW50ZXJuYWwuaCBiL3NyYy9pbmNsdWRlL2FjY2Vzcy9i cmluX2ludGVybmFsLmgKaW5kZXggMjUxODY2MDkyNzIuLjcwMjdiNDFkNWZiIDEwMDY0NAot LS0gYS9zcmMvaW5jbHVkZS9hY2Nlc3MvYnJpbl9pbnRlcm5hbC5oCisrKyBiL3NyYy9pbmNs dWRlL2FjY2Vzcy9icmluX2ludGVybmFsLmgKQEAgLTczLDYgKzczLDcgQEAgdHlwZWRlZiBz dHJ1Y3QgQnJpbkRlc2MKICNkZWZpbmUgQlJJTl9QUk9DTlVNX1VOSU9OCQkJNAogI2RlZmlu ZSBCUklOX01BTkRBVE9SWV9OUFJPQ1MJCTQKICNkZWZpbmUgQlJJTl9QUk9DTlVNX09QVElP TlMgCQk1CS8qIG9wdGlvbmFsICovCisjZGVmaW5lIEJSSU5fUFJPQ05VTV9SQU5HRVMgCQk2 CS8qIG9wdGlvbmFsICovCiAvKiBwcm9jZWR1cmUgbnVtYmVycyB1cCB0byAxMCBhcmUgcmVz ZXJ2ZWQgZm9yIEJSSU4gZnV0dXJlIGV4cGFuc2lvbiAqLwogI2RlZmluZSBCUklOX0ZJUlNU X09QVElPTkFMX1BST0NOVU0gMTEKICNkZWZpbmUgQlJJTl9MQVNUX09QVElPTkFMX1BST0NO VU0JMTUKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfYW1wcm9jLmRhdCBi L3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfYW1wcm9jLmRhdAppbmRleCA0Y2MxMjliZWJkOC4u NDFlNzE0M2I4NzAgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfYW1wcm9j LmRhdAorKysgYi9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX2FtcHJvYy5kYXQKQEAgLTgwNCw2 ICs4MDQsOCBAQAogICBhbXByb2MgPT4gJ2JyaW5fbWlubWF4X2NvbnNpc3RlbnQnIH0sCiB7 IGFtcHJvY2ZhbWlseSA9PiAnYnJpbi9ieXRlYV9taW5tYXhfb3BzJywgYW1wcm9jbGVmdHR5 cGUgPT4gJ2J5dGVhJywKICAgYW1wcm9jcmlnaHR0eXBlID0+ICdieXRlYScsIGFtcHJvY251 bSA9PiAnNCcsIGFtcHJvYyA9PiAnYnJpbl9taW5tYXhfdW5pb24nIH0sCit7IGFtcHJvY2Zh bWlseSA9PiAnYnJpbi9ieXRlYV9taW5tYXhfb3BzJywgYW1wcm9jbGVmdHR5cGUgPT4gJ2J5 dGVhJywKKyAgYW1wcm9jcmlnaHR0eXBlID0+ICdieXRlYScsIGFtcHJvY251bSA9PiAnNics IGFtcHJvYyA9PiAnYnJpbl9taW5tYXhfcmFuZ2VzJyB9LAogCiAjIGJsb29tIGJ5dGVhCiB7 IGFtcHJvY2ZhbWlseSA9PiAnYnJpbi9ieXRlYV9ibG9vbV9vcHMnLCBhbXByb2NsZWZ0dHlw ZSA9PiAnYnl0ZWEnLApAQCAtODM1LDYgKzgzNyw4IEBACiAgIGFtcHJvYyA9PiAnYnJpbl9t aW5tYXhfY29uc2lzdGVudCcgfSwKIHsgYW1wcm9jZmFtaWx5ID0+ICdicmluL2NoYXJfbWlu bWF4X29wcycsIGFtcHJvY2xlZnR0eXBlID0+ICdjaGFyJywKICAgYW1wcm9jcmlnaHR0eXBl ID0+ICdjaGFyJywgYW1wcm9jbnVtID0+ICc0JywgYW1wcm9jID0+ICdicmluX21pbm1heF91 bmlvbicgfSwKK3sgYW1wcm9jZmFtaWx5ID0+ICdicmluL2NoYXJfbWlubWF4X29wcycsIGFt cHJvY2xlZnR0eXBlID0+ICdjaGFyJywKKyAgYW1wcm9jcmlnaHR0eXBlID0+ICdjaGFyJywg YW1wcm9jbnVtID0+ICc2JywgYW1wcm9jID0+ICdicmluX21pbm1heF9yYW5nZXMnIH0sCiAK ICMgYmxvb20gImNoYXIiCiB7IGFtcHJvY2ZhbWlseSA9PiAnYnJpbi9jaGFyX2Jsb29tX29w cycsIGFtcHJvY2xlZnR0eXBlID0+ICdjaGFyJywKQEAgLTg2NCw2ICs4NjgsOCBAQAogICBh bXByb2MgPT4gJ2JyaW5fbWlubWF4X2NvbnNpc3RlbnQnIH0sCiB7IGFtcHJvY2ZhbWlseSA9 PiAnYnJpbi9uYW1lX21pbm1heF9vcHMnLCBhbXByb2NsZWZ0dHlwZSA9PiAnbmFtZScsCiAg IGFtcHJvY3JpZ2h0dHlwZSA9PiAnbmFtZScsIGFtcHJvY251bSA9PiAnNCcsIGFtcHJvYyA9 PiAnYnJpbl9taW5tYXhfdW5pb24nIH0sCit7IGFtcHJvY2ZhbWlseSA9PiAnYnJpbi9uYW1l X21pbm1heF9vcHMnLCBhbXByb2NsZWZ0dHlwZSA9PiAnbmFtZScsCisgIGFtcHJvY3JpZ2h0 dHlwZSA9PiAnbmFtZScsIGFtcHJvY251bSA9PiAnNicsIGFtcHJvYyA9PiAnYnJpbl9taW5t YXhfcmFuZ2VzJyB9LAogCiAjIGJsb29tIG5hbWUKIHsgYW1wcm9jZmFtaWx5ID0+ICdicmlu L25hbWVfYmxvb21fb3BzJywgYW1wcm9jbGVmdHR5cGUgPT4gJ25hbWUnLApAQCAtODkzLDYg Kzg5OSw4IEBACiAgIGFtcHJvYyA9PiAnYnJpbl9taW5tYXhfY29uc2lzdGVudCcgfSwKIHsg YW1wcm9jZmFtaWx5ID0+ICdicmluL2ludGVnZXJfbWlubWF4X29wcycsIGFtcHJvY2xlZnR0 eXBlID0+ICdpbnQ4JywKICAgYW1wcm9jcmlnaHR0eXBlID0+ICdpbnQ4JywgYW1wcm9jbnVt ID0+ICc0JywgYW1wcm9jID0+ICdicmluX21pbm1heF91bmlvbicgfSwKK3sgYW1wcm9jZmFt aWx5ID0+ICdicmluL2ludGVnZXJfbWlubWF4X29wcycsIGFtcHJvY2xlZnR0eXBlID0+ICdp bnQ4JywKKyAgYW1wcm9jcmlnaHR0eXBlID0+ICdpbnQ4JywgYW1wcm9jbnVtID0+ICc2Jywg YW1wcm9jID0+ICdicmluX21pbm1heF9yYW5nZXMnIH0sCiAKIHsgYW1wcm9jZmFtaWx5ID0+ ICdicmluL2ludGVnZXJfbWlubWF4X29wcycsIGFtcHJvY2xlZnR0eXBlID0+ICdpbnQyJywK ICAgYW1wcm9jcmlnaHR0eXBlID0+ICdpbnQyJywgYW1wcm9jbnVtID0+ICcxJywKQEAgLTkw NSw2ICs5MTMsOCBAQAogICBhbXByb2MgPT4gJ2JyaW5fbWlubWF4X2NvbnNpc3RlbnQnIH0s CiB7IGFtcHJvY2ZhbWlseSA9PiAnYnJpbi9pbnRlZ2VyX21pbm1heF9vcHMnLCBhbXByb2Ns ZWZ0dHlwZSA9PiAnaW50MicsCiAgIGFtcHJvY3JpZ2h0dHlwZSA9PiAnaW50MicsIGFtcHJv Y251bSA9PiAnNCcsIGFtcHJvYyA9PiAnYnJpbl9taW5tYXhfdW5pb24nIH0sCit7IGFtcHJv Y2ZhbWlseSA9PiAnYnJpbi9pbnRlZ2VyX21pbm1heF9vcHMnLCBhbXByb2NsZWZ0dHlwZSA9 PiAnaW50MicsCisgIGFtcHJvY3JpZ2h0dHlwZSA9PiAnaW50MicsIGFtcHJvY251bSA9PiAn NicsIGFtcHJvYyA9PiAnYnJpbl9taW5tYXhfcmFuZ2VzJyB9LAogCiB7IGFtcHJvY2ZhbWls eSA9PiAnYnJpbi9pbnRlZ2VyX21pbm1heF9vcHMnLCBhbXByb2NsZWZ0dHlwZSA9PiAnaW50 NCcsCiAgIGFtcHJvY3JpZ2h0dHlwZSA9PiAnaW50NCcsIGFtcHJvY251bSA9PiAnMScsCkBA IC05MTcsNiArOTI3LDggQEAKICAgYW1wcm9jID0+ICdicmluX21pbm1heF9jb25zaXN0ZW50 JyB9LAogeyBhbXByb2NmYW1pbHkgPT4gJ2JyaW4vaW50ZWdlcl9taW5tYXhfb3BzJywgYW1w cm9jbGVmdHR5cGUgPT4gJ2ludDQnLAogICBhbXByb2NyaWdodHR5cGUgPT4gJ2ludDQnLCBh bXByb2NudW0gPT4gJzQnLCBhbXByb2MgPT4gJ2JyaW5fbWlubWF4X3VuaW9uJyB9LAoreyBh bXByb2NmYW1pbHkgPT4gJ2JyaW4vaW50ZWdlcl9taW5tYXhfb3BzJywgYW1wcm9jbGVmdHR5 cGUgPT4gJ2ludDQnLAorICBhbXByb2NyaWdodHR5cGUgPT4gJ2ludDQnLCBhbXByb2NudW0g PT4gJzYnLCBhbXByb2MgPT4gJ2JyaW5fbWlubWF4X3JhbmdlcycgfSwKIAogIyBtaW5tYXgg bXVsdGkgaW50ZWdlcjogaW50MiwgaW50NCwgaW50OAogeyBhbXByb2NmYW1pbHkgPT4gJ2Jy aW4vaW50ZWdlcl9taW5tYXhfbXVsdGlfb3BzJywgYW1wcm9jbGVmdHR5cGUgPT4gJ2ludDIn LApAQCAtMTAzNCw2ICsxMDQ2LDggQEAKICAgYW1wcm9jID0+ICdicmluX21pbm1heF9jb25z aXN0ZW50JyB9LAogeyBhbXByb2NmYW1pbHkgPT4gJ2JyaW4vdGV4dF9taW5tYXhfb3BzJywg YW1wcm9jbGVmdHR5cGUgPT4gJ3RleHQnLAogICBhbXByb2NyaWdodHR5cGUgPT4gJ3RleHQn LCBhbXByb2NudW0gPT4gJzQnLCBhbXByb2MgPT4gJ2JyaW5fbWlubWF4X3VuaW9uJyB9LAor eyBhbXByb2NmYW1pbHkgPT4gJ2JyaW4vdGV4dF9taW5tYXhfb3BzJywgYW1wcm9jbGVmdHR5 cGUgPT4gJ3RleHQnLAorICBhbXByb2NyaWdodHR5cGUgPT4gJ3RleHQnLCBhbXByb2NudW0g PT4gJzYnLCBhbXByb2MgPT4gJ2JyaW5fbWlubWF4X3JhbmdlcycgfSwKIAogIyBibG9vbSB0 ZXh0CiB7IGFtcHJvY2ZhbWlseSA9PiAnYnJpbi90ZXh0X2Jsb29tX29wcycsIGFtcHJvY2xl ZnR0eXBlID0+ICd0ZXh0JywKQEAgLTEwNjIsNiArMTA3Niw4IEBACiAgIGFtcHJvYyA9PiAn YnJpbl9taW5tYXhfY29uc2lzdGVudCcgfSwKIHsgYW1wcm9jZmFtaWx5ID0+ICdicmluL29p ZF9taW5tYXhfb3BzJywgYW1wcm9jbGVmdHR5cGUgPT4gJ29pZCcsCiAgIGFtcHJvY3JpZ2h0 dHlwZSA9PiAnb2lkJywgYW1wcm9jbnVtID0+ICc0JywgYW1wcm9jID0+ICdicmluX21pbm1h eF91bmlvbicgfSwKK3sgYW1wcm9jZmFtaWx5ID0+ICdicmluL29pZF9taW5tYXhfb3BzJywg YW1wcm9jbGVmdHR5cGUgPT4gJ29pZCcsCisgIGFtcHJvY3JpZ2h0dHlwZSA9PiAnb2lkJywg YW1wcm9jbnVtID0+ICc2JywgYW1wcm9jID0+ICdicmluX21pbm1heF9yYW5nZXMnIH0sCiAK ICMgbWlubWF4IG11bHRpIG9pZAogeyBhbXByb2NmYW1pbHkgPT4gJ2JyaW4vb2lkX21pbm1h eF9tdWx0aV9vcHMnLCBhbXByb2NsZWZ0dHlwZSA9PiAnb2lkJywKQEAgLTExMTAsNiArMTEy Niw4IEBACiAgIGFtcHJvYyA9PiAnYnJpbl9taW5tYXhfY29uc2lzdGVudCcgfSwKIHsgYW1w cm9jZmFtaWx5ID0+ICdicmluL3RpZF9taW5tYXhfb3BzJywgYW1wcm9jbGVmdHR5cGUgPT4g J3RpZCcsCiAgIGFtcHJvY3JpZ2h0dHlwZSA9PiAndGlkJywgYW1wcm9jbnVtID0+ICc0Jywg YW1wcm9jID0+ICdicmluX21pbm1heF91bmlvbicgfSwKK3sgYW1wcm9jZmFtaWx5ID0+ICdi cmluL3RpZF9taW5tYXhfb3BzJywgYW1wcm9jbGVmdHR5cGUgPT4gJ3RpZCcsCisgIGFtcHJv Y3JpZ2h0dHlwZSA9PiAndGlkJywgYW1wcm9jbnVtID0+ICc2JywgYW1wcm9jID0+ICdicmlu X21pbm1heF9yYW5nZXMnIH0sCiAKICMgYmxvb20gdGlkCiB7IGFtcHJvY2ZhbWlseSA9PiAn YnJpbi90aWRfYmxvb21fb3BzJywgYW1wcm9jbGVmdHR5cGUgPT4gJ3RpZCcsCkBAIC0xMTYw LDYgKzExNzgsOSBAQAogeyBhbXByb2NmYW1pbHkgPT4gJ2JyaW4vZmxvYXRfbWlubWF4X29w cycsIGFtcHJvY2xlZnR0eXBlID0+ICdmbG9hdDQnLAogICBhbXByb2NyaWdodHR5cGUgPT4g J2Zsb2F0NCcsIGFtcHJvY251bSA9PiAnNCcsCiAgIGFtcHJvYyA9PiAnYnJpbl9taW5tYXhf dW5pb24nIH0sCit7IGFtcHJvY2ZhbWlseSA9PiAnYnJpbi9mbG9hdF9taW5tYXhfb3BzJywg YW1wcm9jbGVmdHR5cGUgPT4gJ2Zsb2F0NCcsCisgIGFtcHJvY3JpZ2h0dHlwZSA9PiAnZmxv YXQ0JywgYW1wcm9jbnVtID0+ICc2JywKKyAgYW1wcm9jID0+ICdicmluX21pbm1heF9yYW5n ZXMnIH0sCiAKIHsgYW1wcm9jZmFtaWx5ID0+ICdicmluL2Zsb2F0X21pbm1heF9vcHMnLCBh bXByb2NsZWZ0dHlwZSA9PiAnZmxvYXQ4JywKICAgYW1wcm9jcmlnaHR0eXBlID0+ICdmbG9h dDgnLCBhbXByb2NudW0gPT4gJzEnLApAQCAtMTE3Myw2ICsxMTk0LDkgQEAKIHsgYW1wcm9j ZmFtaWx5ID0+ICdicmluL2Zsb2F0X21pbm1heF9vcHMnLCBhbXByb2NsZWZ0dHlwZSA9PiAn ZmxvYXQ4JywKICAgYW1wcm9jcmlnaHR0eXBlID0+ICdmbG9hdDgnLCBhbXByb2NudW0gPT4g JzQnLAogICBhbXByb2MgPT4gJ2JyaW5fbWlubWF4X3VuaW9uJyB9LAoreyBhbXByb2NmYW1p bHkgPT4gJ2JyaW4vZmxvYXRfbWlubWF4X29wcycsIGFtcHJvY2xlZnR0eXBlID0+ICdmbG9h dDgnLAorICBhbXByb2NyaWdodHR5cGUgPT4gJ2Zsb2F0OCcsIGFtcHJvY251bSA9PiAnNics CisgIGFtcHJvYyA9PiAnYnJpbl9taW5tYXhfcmFuZ2VzJyB9LAogCiAjIG1pbm1heCBtdWx0 aSBmbG9hdAogeyBhbXByb2NmYW1pbHkgPT4gJ2JyaW4vZmxvYXRfbWlubWF4X211bHRpX29w cycsIGFtcHJvY2xlZnR0eXBlID0+ICdmbG9hdDQnLApAQCAtMTI2MSw2ICsxMjg1LDkgQEAK IHsgYW1wcm9jZmFtaWx5ID0+ICdicmluL21hY2FkZHJfbWlubWF4X29wcycsIGFtcHJvY2xl ZnR0eXBlID0+ICdtYWNhZGRyJywKICAgYW1wcm9jcmlnaHR0eXBlID0+ICdtYWNhZGRyJywg YW1wcm9jbnVtID0+ICc0JywKICAgYW1wcm9jID0+ICdicmluX21pbm1heF91bmlvbicgfSwK K3sgYW1wcm9jZmFtaWx5ID0+ICdicmluL21hY2FkZHJfbWlubWF4X29wcycsIGFtcHJvY2xl ZnR0eXBlID0+ICdtYWNhZGRyJywKKyAgYW1wcm9jcmlnaHR0eXBlID0+ICdtYWNhZGRyJywg YW1wcm9jbnVtID0+ICc2JywKKyAgYW1wcm9jID0+ICdicmluX21pbm1heF9yYW5nZXMnIH0s CiAKICMgbWlubWF4IG11bHRpIG1hY2FkZHIKIHsgYW1wcm9jZmFtaWx5ID0+ICdicmluL21h Y2FkZHJfbWlubWF4X211bHRpX29wcycsIGFtcHJvY2xlZnR0eXBlID0+ICdtYWNhZGRyJywK QEAgLTEzMTQsNiArMTM0MSw5IEBACiB7IGFtcHJvY2ZhbWlseSA9PiAnYnJpbi9tYWNhZGRy OF9taW5tYXhfb3BzJywgYW1wcm9jbGVmdHR5cGUgPT4gJ21hY2FkZHI4JywKICAgYW1wcm9j cmlnaHR0eXBlID0+ICdtYWNhZGRyOCcsIGFtcHJvY251bSA9PiAnNCcsCiAgIGFtcHJvYyA9 PiAnYnJpbl9taW5tYXhfdW5pb24nIH0sCit7IGFtcHJvY2ZhbWlseSA9PiAnYnJpbi9tYWNh ZGRyOF9taW5tYXhfb3BzJywgYW1wcm9jbGVmdHR5cGUgPT4gJ21hY2FkZHI4JywKKyAgYW1w cm9jcmlnaHR0eXBlID0+ICdtYWNhZGRyOCcsIGFtcHJvY251bSA9PiAnNicsCisgIGFtcHJv YyA9PiAnYnJpbl9taW5tYXhfcmFuZ2VzJyB9LAogCiAjIG1pbm1heCBtdWx0aSBtYWNhZGRy OAogeyBhbXByb2NmYW1pbHkgPT4gJ2JyaW4vbWFjYWRkcjhfbWlubWF4X211bHRpX29wcycs CkBAIC0xMzY2LDYgKzEzOTYsOCBAQAogICBhbXByb2MgPT4gJ2JyaW5fbWlubWF4X2NvbnNp c3RlbnQnIH0sCiB7IGFtcHJvY2ZhbWlseSA9PiAnYnJpbi9uZXR3b3JrX21pbm1heF9vcHMn LCBhbXByb2NsZWZ0dHlwZSA9PiAnaW5ldCcsCiAgIGFtcHJvY3JpZ2h0dHlwZSA9PiAnaW5l dCcsIGFtcHJvY251bSA9PiAnNCcsIGFtcHJvYyA9PiAnYnJpbl9taW5tYXhfdW5pb24nIH0s Cit7IGFtcHJvY2ZhbWlseSA9PiAnYnJpbi9uZXR3b3JrX21pbm1heF9vcHMnLCBhbXByb2Ns ZWZ0dHlwZSA9PiAnaW5ldCcsCisgIGFtcHJvY3JpZ2h0dHlwZSA9PiAnaW5ldCcsIGFtcHJv Y251bSA9PiAnNicsIGFtcHJvYyA9PiAnYnJpbl9taW5tYXhfcmFuZ2VzJyB9LAogCiAjIG1p bm1heCBtdWx0aSBpbmV0CiB7IGFtcHJvY2ZhbWlseSA9PiAnYnJpbi9uZXR3b3JrX21pbm1h eF9tdWx0aV9vcHMnLCBhbXByb2NsZWZ0dHlwZSA9PiAnaW5ldCcsCkBAIC0xNDM2LDYgKzE0 NjgsOSBAQAogeyBhbXByb2NmYW1pbHkgPT4gJ2JyaW4vYnBjaGFyX21pbm1heF9vcHMnLCBh bXByb2NsZWZ0dHlwZSA9PiAnYnBjaGFyJywKICAgYW1wcm9jcmlnaHR0eXBlID0+ICdicGNo YXInLCBhbXByb2NudW0gPT4gJzQnLAogICBhbXByb2MgPT4gJ2JyaW5fbWlubWF4X3VuaW9u JyB9LAoreyBhbXByb2NmYW1pbHkgPT4gJ2JyaW4vYnBjaGFyX21pbm1heF9vcHMnLCBhbXBy b2NsZWZ0dHlwZSA9PiAnYnBjaGFyJywKKyAgYW1wcm9jcmlnaHR0eXBlID0+ICdicGNoYXIn LCBhbXByb2NudW0gPT4gJzYnLAorICBhbXByb2MgPT4gJ2JyaW5fbWlubWF4X3Jhbmdlcycg fSwKIAogIyBibG9vbSBjaGFyYWN0ZXIKIHsgYW1wcm9jZmFtaWx5ID0+ICdicmluL2JwY2hh cl9ibG9vbV9vcHMnLCBhbXByb2NsZWZ0dHlwZSA9PiAnYnBjaGFyJywKQEAgLTE0NjcsNiAr MTUwMiw4IEBACiAgIGFtcHJvYyA9PiAnYnJpbl9taW5tYXhfY29uc2lzdGVudCcgfSwKIHsg YW1wcm9jZmFtaWx5ID0+ICdicmluL3RpbWVfbWlubWF4X29wcycsIGFtcHJvY2xlZnR0eXBl ID0+ICd0aW1lJywKICAgYW1wcm9jcmlnaHR0eXBlID0+ICd0aW1lJywgYW1wcm9jbnVtID0+ ICc0JywgYW1wcm9jID0+ICdicmluX21pbm1heF91bmlvbicgfSwKK3sgYW1wcm9jZmFtaWx5 ID0+ICdicmluL3RpbWVfbWlubWF4X29wcycsIGFtcHJvY2xlZnR0eXBlID0+ICd0aW1lJywK KyAgYW1wcm9jcmlnaHR0eXBlID0+ICd0aW1lJywgYW1wcm9jbnVtID0+ICc2JywgYW1wcm9j ID0+ICdicmluX21pbm1heF9yYW5nZXMnIH0sCiAKICMgbWlubWF4IG11bHRpIHRpbWUgd2l0 aG91dCB0aW1lIHpvbmUKIHsgYW1wcm9jZmFtaWx5ID0+ICdicmluL3RpbWVfbWlubWF4X211 bHRpX29wcycsIGFtcHJvY2xlZnR0eXBlID0+ICd0aW1lJywKQEAgLTE1MTcsNiArMTU1NCw5 IEBACiB7IGFtcHJvY2ZhbWlseSA9PiAnYnJpbi9kYXRldGltZV9taW5tYXhfb3BzJywgYW1w cm9jbGVmdHR5cGUgPT4gJ3RpbWVzdGFtcCcsCiAgIGFtcHJvY3JpZ2h0dHlwZSA9PiAndGlt ZXN0YW1wJywgYW1wcm9jbnVtID0+ICc0JywKICAgYW1wcm9jID0+ICdicmluX21pbm1heF91 bmlvbicgfSwKK3sgYW1wcm9jZmFtaWx5ID0+ICdicmluL2RhdGV0aW1lX21pbm1heF9vcHMn LCBhbXByb2NsZWZ0dHlwZSA9PiAndGltZXN0YW1wJywKKyAgYW1wcm9jcmlnaHR0eXBlID0+ ICd0aW1lc3RhbXAnLCBhbXByb2NudW0gPT4gJzYnLAorICBhbXByb2MgPT4gJ2JyaW5fbWlu bWF4X3JhbmdlcycgfSwKIAogeyBhbXByb2NmYW1pbHkgPT4gJ2JyaW4vZGF0ZXRpbWVfbWlu bWF4X29wcycsIGFtcHJvY2xlZnR0eXBlID0+ICd0aW1lc3RhbXB0eicsCiAgIGFtcHJvY3Jp Z2h0dHlwZSA9PiAndGltZXN0YW1wdHonLCBhbXByb2NudW0gPT4gJzEnLApAQCAtMTUzMCw2 ICsxNTcwLDkgQEAKIHsgYW1wcm9jZmFtaWx5ID0+ICdicmluL2RhdGV0aW1lX21pbm1heF9v cHMnLCBhbXByb2NsZWZ0dHlwZSA9PiAndGltZXN0YW1wdHonLAogICBhbXByb2NyaWdodHR5 cGUgPT4gJ3RpbWVzdGFtcHR6JywgYW1wcm9jbnVtID0+ICc0JywKICAgYW1wcm9jID0+ICdi cmluX21pbm1heF91bmlvbicgfSwKK3sgYW1wcm9jZmFtaWx5ID0+ICdicmluL2RhdGV0aW1l X21pbm1heF9vcHMnLCBhbXByb2NsZWZ0dHlwZSA9PiAndGltZXN0YW1wdHonLAorICBhbXBy b2NyaWdodHR5cGUgPT4gJ3RpbWVzdGFtcHR6JywgYW1wcm9jbnVtID0+ICc2JywKKyAgYW1w cm9jID0+ICdicmluX21pbm1heF9yYW5nZXMnIH0sCiAKIHsgYW1wcm9jZmFtaWx5ID0+ICdi cmluL2RhdGV0aW1lX21pbm1heF9vcHMnLCBhbXByb2NsZWZ0dHlwZSA9PiAnZGF0ZScsCiAg IGFtcHJvY3JpZ2h0dHlwZSA9PiAnZGF0ZScsIGFtcHJvY251bSA9PiAnMScsCkBAIC0xNTQy LDYgKzE1ODUsOCBAQAogICBhbXByb2MgPT4gJ2JyaW5fbWlubWF4X2NvbnNpc3RlbnQnIH0s CiB7IGFtcHJvY2ZhbWlseSA9PiAnYnJpbi9kYXRldGltZV9taW5tYXhfb3BzJywgYW1wcm9j bGVmdHR5cGUgPT4gJ2RhdGUnLAogICBhbXByb2NyaWdodHR5cGUgPT4gJ2RhdGUnLCBhbXBy b2NudW0gPT4gJzQnLCBhbXByb2MgPT4gJ2JyaW5fbWlubWF4X3VuaW9uJyB9LAoreyBhbXBy b2NmYW1pbHkgPT4gJ2JyaW4vZGF0ZXRpbWVfbWlubWF4X29wcycsIGFtcHJvY2xlZnR0eXBl ID0+ICdkYXRlJywKKyAgYW1wcm9jcmlnaHR0eXBlID0+ICdkYXRlJywgYW1wcm9jbnVtID0+ ICc2JywgYW1wcm9jID0+ICdicmluX21pbm1heF9yYW5nZXMnIH0sCiAKICMgbWlubWF4IG11 bHRpIGRhdGV0aW1lIChkYXRlLCB0aW1lc3RhbXAsIHRpbWVzdGFtcHR6KQogeyBhbXByb2Nm YW1pbHkgPT4gJ2JyaW4vZGF0ZXRpbWVfbWlubWF4X211bHRpX29wcycsCkBAIC0xNjY4LDYg KzE3MTMsOSBAQAogeyBhbXByb2NmYW1pbHkgPT4gJ2JyaW4vaW50ZXJ2YWxfbWlubWF4X29w cycsIGFtcHJvY2xlZnR0eXBlID0+ICdpbnRlcnZhbCcsCiAgIGFtcHJvY3JpZ2h0dHlwZSA9 PiAnaW50ZXJ2YWwnLCBhbXByb2NudW0gPT4gJzQnLAogICBhbXByb2MgPT4gJ2JyaW5fbWlu bWF4X3VuaW9uJyB9LAoreyBhbXByb2NmYW1pbHkgPT4gJ2JyaW4vaW50ZXJ2YWxfbWlubWF4 X29wcycsIGFtcHJvY2xlZnR0eXBlID0+ICdpbnRlcnZhbCcsCisgIGFtcHJvY3JpZ2h0dHlw ZSA9PiAnaW50ZXJ2YWwnLCBhbXByb2NudW0gPT4gJzYnLAorICBhbXByb2MgPT4gJ2JyaW5f bWlubWF4X3JhbmdlcycgfSwKIAogIyBtaW5tYXggbXVsdGkgaW50ZXJ2YWwKIHsgYW1wcm9j ZmFtaWx5ID0+ICdicmluL2ludGVydmFsX21pbm1heF9tdWx0aV9vcHMnLApAQCAtMTcyMSw2 ICsxNzY5LDkgQEAKIHsgYW1wcm9jZmFtaWx5ID0+ICdicmluL3RpbWV0el9taW5tYXhfb3Bz JywgYW1wcm9jbGVmdHR5cGUgPT4gJ3RpbWV0eicsCiAgIGFtcHJvY3JpZ2h0dHlwZSA9PiAn dGltZXR6JywgYW1wcm9jbnVtID0+ICc0JywKICAgYW1wcm9jID0+ICdicmluX21pbm1heF91 bmlvbicgfSwKK3sgYW1wcm9jZmFtaWx5ID0+ICdicmluL3RpbWV0el9taW5tYXhfb3BzJywg YW1wcm9jbGVmdHR5cGUgPT4gJ3RpbWV0eicsCisgIGFtcHJvY3JpZ2h0dHlwZSA9PiAndGlt ZXR6JywgYW1wcm9jbnVtID0+ICc2JywKKyAgYW1wcm9jID0+ICdicmluX21pbm1heF9yYW5n ZXMnIH0sCiAKICMgbWlubWF4IG11bHRpIHRpbWUgd2l0aCB0aW1lIHpvbmUKIHsgYW1wcm9j ZmFtaWx5ID0+ICdicmluL3RpbWV0el9taW5tYXhfbXVsdGlfb3BzJywgYW1wcm9jbGVmdHR5 cGUgPT4gJ3RpbWV0eicsCkBAIC0xNzcxLDYgKzE4MjIsOCBAQAogICBhbXByb2MgPT4gJ2Jy aW5fbWlubWF4X2NvbnNpc3RlbnQnIH0sCiB7IGFtcHJvY2ZhbWlseSA9PiAnYnJpbi9iaXRf bWlubWF4X29wcycsIGFtcHJvY2xlZnR0eXBlID0+ICdiaXQnLAogICBhbXByb2NyaWdodHR5 cGUgPT4gJ2JpdCcsIGFtcHJvY251bSA9PiAnNCcsIGFtcHJvYyA9PiAnYnJpbl9taW5tYXhf dW5pb24nIH0sCit7IGFtcHJvY2ZhbWlseSA9PiAnYnJpbi9iaXRfbWlubWF4X29wcycsIGFt cHJvY2xlZnR0eXBlID0+ICdiaXQnLAorICBhbXByb2NyaWdodHR5cGUgPT4gJ2JpdCcsIGFt cHJvY251bSA9PiAnNicsIGFtcHJvYyA9PiAnYnJpbl9taW5tYXhfcmFuZ2VzJyB9LAogCiAj IG1pbm1heCBiaXQgdmFyeWluZwogeyBhbXByb2NmYW1pbHkgPT4gJ2JyaW4vdmFyYml0X21p bm1heF9vcHMnLCBhbXByb2NsZWZ0dHlwZSA9PiAndmFyYml0JywKQEAgLTE3ODUsNiArMTgz OCw5IEBACiB7IGFtcHJvY2ZhbWlseSA9PiAnYnJpbi92YXJiaXRfbWlubWF4X29wcycsIGFt cHJvY2xlZnR0eXBlID0+ICd2YXJiaXQnLAogICBhbXByb2NyaWdodHR5cGUgPT4gJ3ZhcmJp dCcsIGFtcHJvY251bSA9PiAnNCcsCiAgIGFtcHJvYyA9PiAnYnJpbl9taW5tYXhfdW5pb24n IH0sCit7IGFtcHJvY2ZhbWlseSA9PiAnYnJpbi92YXJiaXRfbWlubWF4X29wcycsIGFtcHJv Y2xlZnR0eXBlID0+ICd2YXJiaXQnLAorICBhbXByb2NyaWdodHR5cGUgPT4gJ3ZhcmJpdCcs IGFtcHJvY251bSA9PiAnNicsCisgIGFtcHJvYyA9PiAnYnJpbl9taW5tYXhfcmFuZ2VzJyB9 LAogCiAjIG1pbm1heCBudW1lcmljCiB7IGFtcHJvY2ZhbWlseSA9PiAnYnJpbi9udW1lcmlj X21pbm1heF9vcHMnLCBhbXByb2NsZWZ0dHlwZSA9PiAnbnVtZXJpYycsCkBAIC0xNzk5LDYg KzE4NTUsOSBAQAogeyBhbXByb2NmYW1pbHkgPT4gJ2JyaW4vbnVtZXJpY19taW5tYXhfb3Bz JywgYW1wcm9jbGVmdHR5cGUgPT4gJ251bWVyaWMnLAogICBhbXByb2NyaWdodHR5cGUgPT4g J251bWVyaWMnLCBhbXByb2NudW0gPT4gJzQnLAogICBhbXByb2MgPT4gJ2JyaW5fbWlubWF4 X3VuaW9uJyB9LAoreyBhbXByb2NmYW1pbHkgPT4gJ2JyaW4vbnVtZXJpY19taW5tYXhfb3Bz JywgYW1wcm9jbGVmdHR5cGUgPT4gJ251bWVyaWMnLAorICBhbXByb2NyaWdodHR5cGUgPT4g J251bWVyaWMnLCBhbXByb2NudW0gPT4gJzYnLAorICBhbXByb2MgPT4gJ2JyaW5fbWlubWF4 X3JhbmdlcycgfSwKIAogIyBtaW5tYXggbXVsdGkgbnVtZXJpYwogeyBhbXByb2NmYW1pbHkg PT4gJ2JyaW4vbnVtZXJpY19taW5tYXhfbXVsdGlfb3BzJywgYW1wcm9jbGVmdHR5cGUgPT4g J251bWVyaWMnLApAQCAtMTg1MSw2ICsxOTEwLDggQEAKICAgYW1wcm9jID0+ICdicmluX21p bm1heF9jb25zaXN0ZW50JyB9LAogeyBhbXByb2NmYW1pbHkgPT4gJ2JyaW4vdXVpZF9taW5t YXhfb3BzJywgYW1wcm9jbGVmdHR5cGUgPT4gJ3V1aWQnLAogICBhbXByb2NyaWdodHR5cGUg PT4gJ3V1aWQnLCBhbXByb2NudW0gPT4gJzQnLCBhbXByb2MgPT4gJ2JyaW5fbWlubWF4X3Vu aW9uJyB9LAoreyBhbXByb2NmYW1pbHkgPT4gJ2JyaW4vdXVpZF9taW5tYXhfb3BzJywgYW1w cm9jbGVmdHR5cGUgPT4gJ3V1aWQnLAorICBhbXByb2NyaWdodHR5cGUgPT4gJ3V1aWQnLCBh bXByb2NudW0gPT4gJzYnLCBhbXByb2MgPT4gJ2JyaW5fbWlubWF4X3JhbmdlcycgfSwKIAog IyBtaW5tYXggbXVsdGkgdXVpZAogeyBhbXByb2NmYW1pbHkgPT4gJ2JyaW4vdXVpZF9taW5t YXhfbXVsdGlfb3BzJywgYW1wcm9jbGVmdHR5cGUgPT4gJ3V1aWQnLApAQCAtMTkyNCw2ICsx OTg1LDkgQEAKIHsgYW1wcm9jZmFtaWx5ID0+ICdicmluL3BnX2xzbl9taW5tYXhfb3BzJywg YW1wcm9jbGVmdHR5cGUgPT4gJ3BnX2xzbicsCiAgIGFtcHJvY3JpZ2h0dHlwZSA9PiAncGdf bHNuJywgYW1wcm9jbnVtID0+ICc0JywKICAgYW1wcm9jID0+ICdicmluX21pbm1heF91bmlv bicgfSwKK3sgYW1wcm9jZmFtaWx5ID0+ICdicmluL3BnX2xzbl9taW5tYXhfb3BzJywgYW1w cm9jbGVmdHR5cGUgPT4gJ3BnX2xzbicsCisgIGFtcHJvY3JpZ2h0dHlwZSA9PiAncGdfbHNu JywgYW1wcm9jbnVtID0+ICc2JywKKyAgYW1wcm9jID0+ICdicmluX21pbm1heF9yYW5nZXMn IH0sCiAKICMgbWlubWF4IG11bHRpIHBnX2xzbgogeyBhbXByb2NmYW1pbHkgPT4gJ2JyaW4v cGdfbHNuX21pbm1heF9tdWx0aV9vcHMnLCBhbXByb2NsZWZ0dHlwZSA9PiAncGdfbHNuJywK ZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfb3BjbGFzcy5kYXQgYi9zcmMv aW5jbHVkZS9jYXRhbG9nL3BnX29wY2xhc3MuZGF0CmluZGV4IGRiY2FlN2ZmZGQyLi41MmZk ZmE4Y2MwYyAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19vcGNsYXNzLmRh dAorKysgYi9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX29wY2xhc3MuZGF0CkBAIC0zMDEsNyAr MzAxLDcgQEAKICAgb3Bja2V5dHlwZSA9PiAnaW50MicgfSwKIHsgb3BjbWV0aG9kID0+ICdi cmluJywgb3BjbmFtZSA9PiAnaW50NF9taW5tYXhfb3BzJywKICAgb3BjZmFtaWx5ID0+ICdi cmluL2ludGVnZXJfbWlubWF4X29wcycsIG9wY2ludHlwZSA9PiAnaW50NCcsCi0gIG9wY2tl eXR5cGUgPT4gJ2ludDQnIH0sCisgIG9wY2tleXR5cGUgPT4gJ2ludDQnLCBvaWRfc3ltYm9s ID0+ICdJTlQ0X0JSSU5fTUlOTUFYX09QU19PSUQnfSwKIHsgb3BjbWV0aG9kID0+ICdicmlu Jywgb3BjbmFtZSA9PiAnaW50NF9taW5tYXhfbXVsdGlfb3BzJywKICAgb3BjZmFtaWx5ID0+ ICdicmluL2ludGVnZXJfbWlubWF4X211bHRpX29wcycsIG9wY2ludHlwZSA9PiAnaW50NCcs CiAgIG9wY2RlZmF1bHQgPT4gJ2YnLCBvcGNrZXl0eXBlID0+ICdpbnQ0JyB9LApkaWZmIC0t Z2l0IGEvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdCBiL3NyYy9pbmNsdWRlL2Nh dGFsb2cvcGdfcHJvYy5kYXQKaW5kZXggNjJhNWI4ZTY1NWQuLjlmZWEyYTgzODdjIDEwMDY0 NAotLS0gYS9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0CisrKyBiL3NyYy9pbmNs dWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQKQEAgLTg0MDcsNiArODQwNyw5IEBACiB7IG9pZCA9 PiAnMzM4NicsIGRlc2NyID0+ICdCUklOIG1pbm1heCBzdXBwb3J0JywKICAgcHJvbmFtZSA9 PiAnYnJpbl9taW5tYXhfdW5pb24nLCBwcm9yZXR0eXBlID0+ICdib29sJywKICAgcHJvYXJn dHlwZXMgPT4gJ2ludGVybmFsIGludGVybmFsIGludGVybmFsJywgcHJvc3JjID0+ICdicmlu X21pbm1heF91bmlvbicgfSwKK3sgb2lkID0+ICc5OTc2JywgZGVzY3IgPT4gJ0JSSU4gbWlu bWF4IHN1cHBvcnQnLAorICBwcm9uYW1lID0+ICdicmluX21pbm1heF9yYW5nZXMnLCBwcm9y ZXR0eXBlID0+ICdib29sJywKKyAgcHJvYXJndHlwZXMgPT4gJ2ludGVybmFsIGludDInLCBw cm9zcmMgPT4gJ2JyaW5fbWlubWF4X3JhbmdlcycgfSwKIAogIyBCUklOIG1pbm1heCBtdWx0 aQogeyBvaWQgPT4gJzQ2MTYnLCBkZXNjciA9PiAnQlJJTiBtdWx0aSBtaW5tYXggc3VwcG9y dCcsCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9leGVjdXRvci9ub2RlQnJpblNvcnQuaCBi L3NyYy9pbmNsdWRlL2V4ZWN1dG9yL25vZGVCcmluU29ydC5oCm5ldyBmaWxlIG1vZGUgMTAw NjQ0CmluZGV4IDAwMDAwMDAwMDAwLi4yYzg2MGQ5MjZlYQotLS0gL2Rldi9udWxsCisrKyBi L3NyYy9pbmNsdWRlL2V4ZWN1dG9yL25vZGVCcmluU29ydC5oCkBAIC0wLDAgKzEsNDcgQEAK Ky8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIG5vZGVCcmluU29ydC5oCisgKgorICoK KyAqCisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5OTYtMjAyMiwgUG9zdGdyZVNRTCBH bG9iYWwgRGV2ZWxvcG1lbnQgR3JvdXAKKyAqIFBvcnRpb25zIENvcHlyaWdodCAoYykgMTk5 NCwgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCisgKgorICogc3Jj L2luY2x1ZGUvZXhlY3V0b3Ivbm9kZUJyaW5Tb3J0LmgKKyAqCisgKi0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KKyAqLworI2lmbmRlZiBOT0RFQnJpblNvcnRfSAorI2RlZmluZSBOT0RFQnJpblNv cnRfSAorCisjaW5jbHVkZSAiYWNjZXNzL2dlbmFtLmgiCisjaW5jbHVkZSAiYWNjZXNzL3Bh cmFsbGVsLmgiCisjaW5jbHVkZSAibm9kZXMvZXhlY25vZGVzLmgiCisKK2V4dGVybiBCcmlu U29ydFN0YXRlICpFeGVjSW5pdEJyaW5Tb3J0KEJyaW5Tb3J0ICpub2RlLCBFU3RhdGUgKmVz dGF0ZSwgaW50IGVmbGFncyk7CitleHRlcm4gdm9pZCBFeGVjRW5kQnJpblNvcnQoQnJpblNv cnRTdGF0ZSAqbm9kZSk7CitleHRlcm4gdm9pZCBFeGVjQnJpblNvcnRNYXJrUG9zKEJyaW5T b3J0U3RhdGUgKm5vZGUpOworZXh0ZXJuIHZvaWQgRXhlY0JyaW5Tb3J0UmVzdHJQb3MoQnJp blNvcnRTdGF0ZSAqbm9kZSk7CitleHRlcm4gdm9pZCBFeGVjUmVTY2FuQnJpblNvcnQoQnJp blNvcnRTdGF0ZSAqbm9kZSk7CitleHRlcm4gdm9pZCBFeGVjQnJpblNvcnRFc3RpbWF0ZShC cmluU29ydFN0YXRlICpub2RlLCBQYXJhbGxlbENvbnRleHQgKnBjeHQpOworZXh0ZXJuIHZv aWQgRXhlY0JyaW5Tb3J0SW5pdGlhbGl6ZURTTShCcmluU29ydFN0YXRlICpub2RlLCBQYXJh bGxlbENvbnRleHQgKnBjeHQpOworZXh0ZXJuIHZvaWQgRXhlY0JyaW5Tb3J0UmVJbml0aWFs aXplRFNNKEJyaW5Tb3J0U3RhdGUgKm5vZGUsIFBhcmFsbGVsQ29udGV4dCAqcGN4dCk7Citl eHRlcm4gdm9pZCBFeGVjQnJpblNvcnRJbml0aWFsaXplV29ya2VyKEJyaW5Tb3J0U3RhdGUg Km5vZGUsCisJCQkJCQkJCQkJICBQYXJhbGxlbFdvcmtlckNvbnRleHQgKnB3Y3h0KTsKKwor LyoKKyAqIFRoZXNlIHJvdXRpbmVzIGFyZSBleHBvcnRlZCB0byBzaGFyZSBjb2RlIHdpdGgg bm9kZUluZGV4b25seXNjYW4uYyBhbmQKKyAqIG5vZGVCaXRtYXBCcmluU29ydC5jCisgKi8K K2V4dGVybiB2b2lkIEV4ZWNJbmRleEJ1aWxkU2NhbktleXMoUGxhblN0YXRlICpwbGFuc3Rh dGUsIFJlbGF0aW9uIGluZGV4LAorCQkJCQkJCQkgICBMaXN0ICpxdWFscywgYm9vbCBpc29y ZGVyYnksCisJCQkJCQkJCSAgIFNjYW5LZXkgKnNjYW5LZXlzLCBpbnQgKm51bVNjYW5LZXlz LAorCQkJCQkJCQkgICBJbmRleFJ1bnRpbWVLZXlJbmZvICoqcnVudGltZUtleXMsIGludCAq bnVtUnVudGltZUtleXMsCisJCQkJCQkJCSAgIEluZGV4QXJyYXlLZXlJbmZvICoqYXJyYXlL ZXlzLCBpbnQgKm51bUFycmF5S2V5cyk7CitleHRlcm4gdm9pZCBFeGVjSW5kZXhFdmFsUnVu dGltZUtleXMoRXhwckNvbnRleHQgKmVjb250ZXh0LAorCQkJCQkJCQkJIEluZGV4UnVudGlt ZUtleUluZm8gKnJ1bnRpbWVLZXlzLCBpbnQgbnVtUnVudGltZUtleXMpOworZXh0ZXJuIGJv b2wgRXhlY0luZGV4RXZhbEFycmF5S2V5cyhFeHByQ29udGV4dCAqZWNvbnRleHQsCisJCQkJ CQkJCSAgIEluZGV4QXJyYXlLZXlJbmZvICphcnJheUtleXMsIGludCBudW1BcnJheUtleXMp OworZXh0ZXJuIGJvb2wgRXhlY0luZGV4QWR2YW5jZUFycmF5S2V5cyhJbmRleEFycmF5S2V5 SW5mbyAqYXJyYXlLZXlzLCBpbnQgbnVtQXJyYXlLZXlzKTsKKworI2VuZGlmCQkJCQkJCS8q IE5PREVCcmluU29ydF9IICovCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9ub2Rlcy9leGVj bm9kZXMuaCBiL3NyYy9pbmNsdWRlL25vZGVzL2V4ZWNub2Rlcy5oCmluZGV4IDAxYjE3Mjdm YzA5Li43NGZiMDQ2N2Q3ZiAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvbm9kZXMvZXhlY25v ZGVzLmgKKysrIGIvc3JjL2luY2x1ZGUvbm9kZXMvZXhlY25vZGVzLmgKQEAgLTE1NDksNiAr MTU0OSw3NSBAQCB0eXBlZGVmIHN0cnVjdCBJbmRleFNjYW5TdGF0ZQogCVNpemUJCWlzc19Q c2NhbkxlbjsKIH0gSW5kZXhTY2FuU3RhdGU7CiAKK3R5cGVkZWYgc3RydWN0IEJyaW5Tb3J0 UmFuZ2UKK3sKKwlCbG9ja051bWJlciBibGtub19zdGFydDsKKwlCbG9ja051bWJlciBibGtu b19lbmQ7CisKKwlEYXR1bQltaW5fdmFsdWU7CisJRGF0dW0JbWF4X3ZhbHVlOworCWJvb2wJ aGFzX251bGxzOworCWJvb2wJYWxsX251bGxzOworCWJvb2wJbm90X3N1bW1hcml6ZWQ7CisK Kwlib29sCXByb2Nlc3NlZDsKK30gQnJpblNvcnRSYW5nZTsKKwordHlwZWRlZiBlbnVtIHsK KwlCUklOU09SVF9TVEFSVCwKKwlCUklOU09SVF9MT0FEX1JBTkdFLAorCUJSSU5TT1JUX1BS T0NFU1NfUkFOR0UsCisJQlJJTlNPUlRfTE9BRF9OVUxMUywKKwlCUklOU09SVF9QUk9DRVNT X05VTExTLAorCUJSSU5TT1JUX0ZJTklTSEVECit9IEJyaW5Tb3J0UGhhc2U7CisKK3R5cGVk ZWYgc3RydWN0IEJyaW5Tb3J0U3RhdGUKK3sKKwlTY2FuU3RhdGUJc3M7CQkJCS8qIGl0cyBm aXJzdCBmaWVsZCBpcyBOb2RlVGFnICovCisJRXhwclN0YXRlICAqaW5kZXhxdWFsb3JpZzsK KwlMaXN0CSAgICppbmRleG9yZGVyYnlvcmlnOworCXN0cnVjdCBTY2FuS2V5RGF0YSAqaXNz X1NjYW5LZXlzOworCWludAkJCWlzc19OdW1TY2FuS2V5czsKKwlzdHJ1Y3QgU2NhbktleURh dGEgKmlzc19PcmRlckJ5S2V5czsKKwlpbnQJCQlpc3NfTnVtT3JkZXJCeUtleXM7CisJSW5k ZXhSdW50aW1lS2V5SW5mbyAqaXNzX1J1bnRpbWVLZXlzOworCWludAkJCWlzc19OdW1SdW50 aW1lS2V5czsKKwlib29sCQlpc3NfUnVudGltZUtleXNSZWFkeTsKKwlFeHByQ29udGV4dCAq aXNzX1J1bnRpbWVDb250ZXh0OworCVJlbGF0aW9uCWlzc19SZWxhdGlvbkRlc2M7CisJc3Ry dWN0IEluZGV4U2NhbkRlc2NEYXRhICppc3NfU2NhbkRlc2M7CisKKwkvKiBUaGVzZSBhcmUg bmVlZGVkIGZvciByZS1jaGVja2luZyBPUkRFUiBCWSBleHByIG9yZGVyaW5nICovCisJcGFp cmluZ2hlYXAgKmlzc19SZW9yZGVyUXVldWU7CisJYm9vbAkJaXNzX1JlYWNoZWRFbmQ7CisJ RGF0dW0JICAgKmlzc19PcmRlckJ5VmFsdWVzOworCWJvb2wJICAgKmlzc19PcmRlckJ5TnVs bHM7CisJU29ydFN1cHBvcnQgaXNzX1NvcnRTdXBwb3J0OworCWJvb2wJICAgKmlzc19PcmRl ckJ5VHlwQnlWYWxzOworCWludDE2CSAgICppc3NfT3JkZXJCeVR5cExlbnM7CisJU2l6ZQkJ aXNzX1BzY2FuTGVuOworCisJLyogKi8KKwlpbnQJCQkJYnNfbnJhbmdlczsKKwlCcmluU29y dFJhbmdlICAqYnNfcmFuZ2VzOworCUJyaW5Tb3J0UmFuZ2UgKipic19yYW5nZXNfbWludmFs OworCWludAkJCQlic19uZXh0X3JhbmdlOworCWludAkJCQlic19uZXh0X3JhbmdlX2ludGVy c2VjdDsKKwlpbnQJCQkJYnNfbmV4dF9yYW5nZV9udWxsczsKKwlFeHByU3RhdGUJICAgKmJz X3F1YWw7CisJRGF0dW0JCQlic193YXRlcm1hcms7CisJQnJpblNvcnRQaGFzZQlic19waGFz ZTsKKwlTb3J0U3VwcG9ydERhdGEJYnNfc29ydHN1cHBvcnQ7CisKKwkvKgorCSAqIFdlIG5l ZWQgdHdvIHR1cGxlc29ydCBpbnN0YW5jZXMgLSBvbmUgZm9yIGN1cnJlbnQgcmFuZ2UsIG9u ZSBmb3IKKwkgKiBzcGlsbC1vdmVyIHR1cGxlcyBmcm9tIHRoZSBvdmVybGFwcGluZyByYW5n ZXMKKwkgKi8KKwl2b2lkCQkgICAqYnNfdHVwbGVzb3J0c3RhdGU7CisJVHVwbGVzdG9yZXN0 YXRlICpic190dXBsZXN0b3JlOworfSBCcmluU29ydFN0YXRlOworCiAvKiAtLS0tLS0tLS0t LS0tLS0tCiAgKgkgSW5kZXhPbmx5U2NhblN0YXRlIGluZm9ybWF0aW9uCiAgKgpkaWZmIC0t Z2l0IGEvc3JjL2luY2x1ZGUvbm9kZXMvcGF0aG5vZGVzLmggYi9zcmMvaW5jbHVkZS9ub2Rl cy9wYXRobm9kZXMuaAppbmRleCA2YmRhMzgzYmVhZC4uZTc5YzkwNGE4ZmMgMTAwNjQ0Ci0t LSBhL3NyYy9pbmNsdWRlL25vZGVzL3BhdGhub2Rlcy5oCisrKyBiL3NyYy9pbmNsdWRlL25v ZGVzL3BhdGhub2Rlcy5oCkBAIC0xNTk2LDYgKzE1OTYsMTcgQEAgdHlwZWRlZiBzdHJ1Y3Qg SW5kZXhQYXRoCiAJU2VsZWN0aXZpdHkgaW5kZXhzZWxlY3Rpdml0eTsKIH0gSW5kZXhQYXRo OwogCisvKgorICogcmVhZCBzb3J0ZWQgZGF0YSBmcm9tIGJyaW4gaW5kZXgKKyAqCisgKiBX ZSB1c2UgSW5kZXhQYXRoLCBiZWNhdXNlIHRoYXQncyB3aGF0IGFtY29zdGVzdGltYXRlIGlz IGV4cGVjdGluZywgYnV0CisgKiB3ZSB0eXBlZGVmIGl0IGFzIGEgc2VwYXJhdGUgc3RydWN0 LgorICovCit0eXBlZGVmIHN0cnVjdCBCcmluU29ydFBhdGgKK3sKKwlJbmRleFBhdGgJaXBh dGg7Cit9IEJyaW5Tb3J0UGF0aDsKKwogLyoKICAqIEVhY2ggSW5kZXhDbGF1c2UgcmVmZXJl bmNlcyBhIFJlc3RyaWN0SW5mbyBub2RlIGZyb20gdGhlIHF1ZXJ5J3MgV0hFUkUKICAqIG9y IEpPSU4gY29uZGl0aW9ucywgYW5kIHNob3dzIGhvdyB0aGF0IHJlc3RyaWN0aW9uIGNhbiBi ZSBhcHBsaWVkIHRvCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9ub2Rlcy9wbGFubm9kZXMu aCBiL3NyYy9pbmNsdWRlL25vZGVzL3BsYW5ub2Rlcy5oCmluZGV4IDIxZTY0MmE2NGM0Li5j NGVmNTM2MmFjYyAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvbm9kZXMvcGxhbm5vZGVzLmgK KysrIGIvc3JjL2luY2x1ZGUvbm9kZXMvcGxhbm5vZGVzLmgKQEAgLTQ5NSw2ICs0OTUsMzIg QEAgdHlwZWRlZiBzdHJ1Y3QgSW5kZXhPbmx5U2NhbgogCVNjYW5EaXJlY3Rpb24gaW5kZXhv cmRlcmRpcjsJLyogZm9yd2FyZCBvciBiYWNrd2FyZCBvciBkb24ndCBjYXJlICovCiB9IElu ZGV4T25seVNjYW47CiAKKwordHlwZWRlZiBzdHJ1Y3QgQnJpblNvcnQKK3sKKwlTY2FuCQlz Y2FuOworCU9pZAkJCWluZGV4aWQ7CQkvKiBPSUQgb2YgaW5kZXggdG8gc2NhbiAqLworCUxp c3QJICAgKmluZGV4cXVhbDsJCS8qIGxpc3Qgb2YgaW5kZXggcXVhbHMgKHVzdWFsbHkgT3BF eHBycykgKi8KKwlMaXN0CSAgICppbmRleHF1YWxvcmlnOwkvKiB0aGUgc2FtZSBpbiBvcmln aW5hbCBmb3JtICovCisJU2NhbkRpcmVjdGlvbiBpbmRleG9yZGVyZGlyOwkvKiBmb3J3YXJk IG9yIGJhY2t3YXJkIG9yIGRvbid0IGNhcmUgKi8KKworCS8qIG51bWJlciBvZiBzb3J0LWtl eSBjb2x1bW5zICovCisJaW50CQkJbnVtQ29sczsKKworCS8qIHRoZWlyIGluZGV4ZXMgaW4g dGhlIHRhcmdldCBsaXN0ICovCisJQXR0ck51bWJlciAqc29ydENvbElkeCBwZ19ub2RlX2F0 dHIoYXJyYXlfc2l6ZShudW1Db2xzKSk7CisKKwkvKiBPSURzIG9mIG9wZXJhdG9ycyB0byBz b3J0IHRoZW0gYnkgKi8KKwlPaWQJCSAgICpzb3J0T3BlcmF0b3JzIHBnX25vZGVfYXR0cihh cnJheV9zaXplKG51bUNvbHMpKTsKKworCS8qIE9JRHMgb2YgY29sbGF0aW9ucyAqLworCU9p ZAkJICAgKmNvbGxhdGlvbnMgcGdfbm9kZV9hdHRyKGFycmF5X3NpemUobnVtQ29scykpOwor CisJLyogTlVMTFMgRklSU1QvTEFTVCBkaXJlY3Rpb25zICovCisJYm9vbAkgICAqbnVsbHNG aXJzdCBwZ19ub2RlX2F0dHIoYXJyYXlfc2l6ZShudW1Db2xzKSk7CisKK30gQnJpblNvcnQ7 CisKIC8qIC0tLS0tLS0tLS0tLS0tLS0KICAqCQliaXRtYXAgaW5kZXggc2NhbiBub2RlCiAg KgpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvb3B0aW1pemVyL2Nvc3QuaCBiL3NyYy9pbmNs dWRlL29wdGltaXplci9jb3N0LmgKaW5kZXggMjA0ZTk0YjZkMTAuLmI3NzQ0MDcyOGQxIDEw MDY0NAotLS0gYS9zcmMvaW5jbHVkZS9vcHRpbWl6ZXIvY29zdC5oCisrKyBiL3NyYy9pbmNs dWRlL29wdGltaXplci9jb3N0LmgKQEAgLTY5LDYgKzY5LDcgQEAgZXh0ZXJuIFBHRExMSU1Q T1JUIGJvb2wgZW5hYmxlX3BhcmFsbGVsX2FwcGVuZDsKIGV4dGVybiBQR0RMTElNUE9SVCBi b29sIGVuYWJsZV9wYXJhbGxlbF9oYXNoOwogZXh0ZXJuIFBHRExMSU1QT1JUIGJvb2wgZW5h YmxlX3BhcnRpdGlvbl9wcnVuaW5nOwogZXh0ZXJuIFBHRExMSU1QT1JUIGJvb2wgZW5hYmxl X2FzeW5jX2FwcGVuZDsKK2V4dGVybiBQR0RMTElNUE9SVCBib29sIGVuYWJsZV9icmluc29y dDsKIGV4dGVybiBQR0RMTElNUE9SVCBpbnQgY29uc3RyYWludF9leGNsdXNpb247CiAKIGV4 dGVybiBkb3VibGUgaW5kZXhfcGFnZXNfZmV0Y2hlZChkb3VibGUgdHVwbGVzX2ZldGNoZWQs IEJsb2NrTnVtYmVyIHBhZ2VzLApAQCAtNzksNiArODAsOCBAQCBleHRlcm4gdm9pZCBjb3N0 X3NhbXBsZXNjYW4oUGF0aCAqcGF0aCwgUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8g KmJhc2VyZWwsCiAJCQkJCQkJUGFyYW1QYXRoSW5mbyAqcGFyYW1faW5mbyk7CiBleHRlcm4g dm9pZCBjb3N0X2luZGV4KEluZGV4UGF0aCAqcGF0aCwgUGxhbm5lckluZm8gKnJvb3QsCiAJ CQkJCSAgIGRvdWJsZSBsb29wX2NvdW50LCBib29sIHBhcnRpYWxfcGF0aCk7CitleHRlcm4g dm9pZCBjb3N0X2JyaW5zb3J0KEJyaW5Tb3J0UGF0aCAqcGF0aCwgUGxhbm5lckluZm8gKnJv b3QsCisJCQkJCQkgIGRvdWJsZSBsb29wX2NvdW50LCBib29sIHBhcnRpYWxfcGF0aCk7CiBl eHRlcm4gdm9pZCBjb3N0X2JpdG1hcF9oZWFwX3NjYW4oUGF0aCAqcGF0aCwgUGxhbm5lcklu Zm8gKnJvb3QsIFJlbE9wdEluZm8gKmJhc2VyZWwsCiAJCQkJCQkJCSAgUGFyYW1QYXRoSW5m byAqcGFyYW1faW5mbywKIAkJCQkJCQkJICBQYXRoICpiaXRtYXBxdWFsLCBkb3VibGUgbG9v cF9jb3VudCk7CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9vcHRpbWl6ZXIvcGF0aG5vZGUu aCBiL3NyYy9pbmNsdWRlL29wdGltaXplci9wYXRobm9kZS5oCmluZGV4IDA1MGYwMGU3OWE0 Li4yNDE1YzA3YTg1NiAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvb3B0aW1pemVyL3BhdGhu b2RlLmgKKysrIGIvc3JjL2luY2x1ZGUvb3B0aW1pemVyL3BhdGhub2RlLmgKQEAgLTQ5LDYg KzQ5LDE3IEBAIGV4dGVybiBJbmRleFBhdGggKmNyZWF0ZV9pbmRleF9wYXRoKFBsYW5uZXJJ bmZvICpyb290LAogCQkJCQkJCQkJUmVsaWRzIHJlcXVpcmVkX291dGVyLAogCQkJCQkJCQkJ ZG91YmxlIGxvb3BfY291bnQsCiAJCQkJCQkJCQlib29sIHBhcnRpYWxfcGF0aCk7CitleHRl cm4gQnJpblNvcnRQYXRoICpjcmVhdGVfYnJpbnNvcnRfcGF0aChQbGFubmVySW5mbyAqcm9v dCwKKwkJCQkJCQkJCUluZGV4T3B0SW5mbyAqaW5kZXgsCisJCQkJCQkJCQlMaXN0ICppbmRl eGNsYXVzZXMsCisJCQkJCQkJCQlMaXN0ICppbmRleG9yZGVyYnlzLAorCQkJCQkJCQkJTGlz dCAqaW5kZXhvcmRlcmJ5Y29scywKKwkJCQkJCQkJCUxpc3QgKnBhdGhrZXlzLAorCQkJCQkJ CQkJU2NhbkRpcmVjdGlvbiBpbmRleHNjYW5kaXIsCisJCQkJCQkJCQlib29sIGluZGV4b25s eSwKKwkJCQkJCQkJCVJlbGlkcyByZXF1aXJlZF9vdXRlciwKKwkJCQkJCQkJCWRvdWJsZSBs b29wX2NvdW50LAorCQkJCQkJCQkJYm9vbCBwYXJ0aWFsX3BhdGgpOwogZXh0ZXJuIEJpdG1h cEhlYXBQYXRoICpjcmVhdGVfYml0bWFwX2hlYXBfcGF0aChQbGFubmVySW5mbyAqcm9vdCwK IAkJCQkJCQkJCQkJICAgUmVsT3B0SW5mbyAqcmVsLAogCQkJCQkJCQkJCQkgICBQYXRoICpi aXRtYXBxdWFsLApkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvb3B0aW1pemVyL3BhdGhzLmgg Yi9zcmMvaW5jbHVkZS9vcHRpbWl6ZXIvcGF0aHMuaAppbmRleCA0MWY3NjVkMzQyMi4uNmFh NTAyNTc3MzAgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL29wdGltaXplci9wYXRocy5oCisr KyBiL3NyYy9pbmNsdWRlL29wdGltaXplci9wYXRocy5oCkBAIC0yMTMsNiArMjEzLDkgQEAg ZXh0ZXJuIFBhdGggKmdldF9jaGVhcGVzdF9mcmFjdGlvbmFsX3BhdGhfZm9yX3BhdGhrZXlz KExpc3QgKnBhdGhzLAogZXh0ZXJuIFBhdGggKmdldF9jaGVhcGVzdF9wYXJhbGxlbF9zYWZl X3RvdGFsX2lubmVyKExpc3QgKnBhdGhzKTsKIGV4dGVybiBMaXN0ICpidWlsZF9pbmRleF9w YXRoa2V5cyhQbGFubmVySW5mbyAqcm9vdCwgSW5kZXhPcHRJbmZvICppbmRleCwKIAkJCQkJ CQkJICBTY2FuRGlyZWN0aW9uIHNjYW5kaXIpOworZXh0ZXJuIExpc3QgKmJ1aWxkX2luZGV4 X3BhdGhrZXlzX2JyaW4oUGxhbm5lckluZm8gKnJvb3QsIEluZGV4T3B0SW5mbyAqaW5kZXgs CisJCQkJCQkJCSAgVGFyZ2V0RW50cnkgKnRsZSwgaW50IGlkeCwKKwkJCQkJCQkJICBib29s IHJldmVyc2Vfc29ydCwgYm9vbCBudWxsc19maXJzdCk7CiBleHRlcm4gTGlzdCAqYnVpbGRf cGFydGl0aW9uX3BhdGhrZXlzKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpwYXJ0 cmVsLAogCQkJCQkJCQkJICBTY2FuRGlyZWN0aW9uIHNjYW5kaXIsIGJvb2wgKnBhcnRpYWxr ZXlzKTsKIGV4dGVybiBMaXN0ICpidWlsZF9leHByZXNzaW9uX3BhdGhrZXkoUGxhbm5lcklu Zm8gKnJvb3QsIEV4cHIgKmV4cHIsCi0tIAoyLjM3LjMKCg== --------------spOVlteNcqSeU4NYyJcJZ0TM--