Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wh30V-00017y-15 for pgsql-hackers@arkaria.postgresql.org; Tue, 07 Jul 2026 10:26:28 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wh2zT-000Lna-2G for pgsql-hackers@arkaria.postgresql.org; Tue, 07 Jul 2026 10:25:24 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wh2zT-000LnM-0J for pgsql-hackers@lists.postgresql.org; Tue, 07 Jul 2026 10:25:24 +0000 Received: from mail.postgrespro.ru ([93.174.132.70]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.98.2) (envelope-from ) id 1wh2zP-000000001F7-3dLf for pgsql-hackers@lists.postgresql.org; Tue, 07 Jul 2026 10:25:23 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mx2023; t=1783419919; bh=4A3hl+EmdUKNlQHVsiJbnA3P5+pSnczcJhngMMyr3R4=; h=Date:From:To:Cc:Subject:In-Reply-To:References:Message-ID:From; b=epU8UWb3KZ9XUUh7yHrhdYsMWoookno9lWTnjzLjmW7eEeswpEdt6D7NhFucoEZSG JisF1+QtY5ovdql5VvH7bFpOHnOahMsGaHVacXPxleK/oJsv270+OcNCvo4QRk/7aC GruWujfeeCRGgUovczzl4PwtquFU0qYQjsJENbhijynJInkpzjt1xLktdOXz+eDOtC V6SeYTc8FHUXeWi3D1dYlzLi5RR32UqVRKTXCtj89ogfbH9iXHjOS6FEQBf8JzPdT1 a/71oRqRUurkeE6/lEbEv5sSRLEdmitLVwX4UfKBykmKPFQ78RwcIEIBl2HkRQ6ump ESHKCUO5Ak3mg== Received: from mail.l.postgrespro.ru (webmail-master-mstn.l.postgrespro.ru [192.168.2.26]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (Client did not present a certificate) (Authenticated sender: a.pyhalov@postgrespro.ru) by mail.postgrespro.ru (Postfix/587) with ESMTPSA id CDF145FDFB; Tue, 7 Jul 2026 13:25:18 +0300 (MSK) MIME-Version: 1.0 Date: Tue, 07 Jul 2026 13:25:18 +0300 From: Alexander Pyhalov To: Alexander Korotkov Cc: solaimurugan vellaipandiyan , =?UTF-8?Q?=C3=81lvaro_Herrera?= , g.kashkin@postgrespro.ru, Ashutosh Bapat , PostgreSQL Hackers Subject: Re: Function scan FDW pushdown In-Reply-To: References: <202508051955.sao7ucalcce7@alvherre.pgsql> <7e2abeb3ea9bc7ca024f4e457dce33f5@postgrespro.ru> <214e7cb76a9f142a08246660a649ca0b@postgrespro.ru> Message-ID: <2dcab8ff39f8c6f88ecfa3cfb54d8180@postgrespro.ru> X-Sender: a.pyhalov@postgrespro.ru Content-Type: multipart/mixed; boundary="=_87c219c4cc6e4e946033881815a2f5dc" X-KSMG-AntiPhishing: NotDetected X-KSMG-AntiSpam-Interceptor-Info: not scanned X-KSMG-AntiSpam-Status: not scanned, disabled by settings X-KSMG-AntiVirus: Kaspersky Secure Mail Gateway, version 3.0.0.9059, bases: 2026/07/07 09:21:00 #28408968 X-KSMG-AntiVirus-Status: NotDetected, skipped X-KSMG-LinksScanning: not scanned, disabled by settings X-KSMG-Message-Action: skipped X-KSMG-Rule-ID: 1 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --=_87c219c4cc6e4e946033881815a2f5dc Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8; format=flowed Alexander Korotkov писал(а) 2026-07-06 17:11: > Hi, Alexander! > > On Wed, May 20, 2026 at 1:17 PM Alexander Pyhalov > wrote: >> I've found another issue. The fact that in the new versions of the >> patch >> RTE RelOptInfo misses fdw_private seems to be unfortunate. For >> example, >> in the last version we haven't thought about classifying >> baserestrictinfo. And if we do, we should pass fdw_private down to >> foreign_expr_walker. Perhaps, we could attach it to RTE_FUNCTION rel >> prior to calling classifyConditions(), but should we later set it back >> to NULL? Another problem comes if we try to handle joins, which can >> crearte subqueries (like INNER/OUTER UNIQUE). In this case we should >> somehow cook fpinfo for get_relation_column_alias_ids(). Attaching >> patch >> which tries to handle baserestrictinfos by passing fpinfo down to >> foreign_expr_walker(). > > I think passing fpinfo down to foreign_expr_walker() is the right > approach, thank you. Attaching it to RTE_FUNCTION rel, and reseting > it back to NULL would create excessive state and potential source of > bugs. The only advantage is saving existing function signatures, but > it doesn't worth it. > > Also, I don't think we need to care bout > get_relation_column_alias_ids(). As we currently pushdown function > only for inner joins, make_outerrel_subquery/make_innerrel_subquery > are always false, lower_subquery_rels also wouldn't contain > RTE_FUNCTION relid. > Therefore: > > * In deparseFromExprForRel() for functional rel deparseRangeTblRef() > is always called with make_subquery=false. > * is_subquery_var() returns false. Well, at least current patch version classifies conditions correctly. > Other changes I made: > > 1. In foreign_join_ok(), the function side's baserestrictinfo was > classified against the joinrel fpinfo, whose > server/shippable_extensions aren't set until merge_fdw_options() runs > later — so extension-shippable quals would be misclassified as local > and silently kill the pushdown. Now it: (a) copies > shippable_extensions from the foreign side onto the stub, and (b) > classifies against the stub (fpinfo_i/fpinfo_o, which already has > server). Built-in quals like n > 3 were unaffected; this fixes the > extension case. I've added the test case for this. > > 2. Dropped unused funcid. The per-RTE metadata was a 3-element list > (funcid, funcrettype, funccollation) but funcid was never read. > Reduced to list_make2(funcrettype, funccollation); updated the > consumer (linitial/lsecond) and both descriptive comments. With funcid we could print actual function name in explain. Now we print, for example, Relations: ((public.distr1_part_3 d1_3) INNER JOIN (public.distr2_part_3 d2_3)) INNER JOIN (Function n) If funcid is preserved, we could output actual function name instead of alias. This is more similar to how we show relation names. Attaching updated patch, which preserves function names in explain. After looking at it once more, I'm not convinced when we can get not-FuncExpr in rtfunc->funcexpr. So added more checks to function_rte_pushdown_ok() to avoid dealing with such case. -- Best regards, Alexander Pyhalov, Postgres Professional --=_87c219c4cc6e4e946033881815a2f5dc Content-Transfer-Encoding: base64 Content-Type: text/x-diff; name=v11-0001-postgres_fdw-push-down-FUNCTION-RTE-into-foreign.patch Content-Disposition: attachment; filename=v11-0001-postgres_fdw-push-down-FUNCTION-RTE-into-foreign.patch; size=84440 RnJvbSBiODUwNzEzYjY0OGVkOTg1ODE2YzczMzU1MmRiNDBkNjEzMjk0MDA1IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGV4YW5kZXIgS29yb3Rrb3YgPGFrb3JvdGtvdkBwb3N0Z3Jl c3FsLm9yZz4KRGF0ZTogVHVlLCA3IEp1bCAyMDI2IDA5OjU3OjE5ICswMzAwClN1YmplY3Q6IFtQ QVRDSF0gcG9zdGdyZXNfZmR3OiBwdXNoIGRvd24gRlVOQ1RJT04gUlRFIGludG8gZm9yZWlnbiBq b2lucwoKQSBmb3JlaWduIGpvaW4gcGxhbm5pbmcgaG9vayBub3cgY29uc2lkZXJzIGEgKGZvcmVp Z24tdGFibGUgeCBmdW5jdGlvbi1SVEUpCklOTkVSIGpvaW4gYXMgYSBwdXNoLWRvd24gY2FuZGlk YXRlIHdoZW4gdGhlIGZ1bmN0aW9uIGV4cHJlc3Npb24gaXMKSU1NVVRBQkxFIGFuZCBvdGhlcndp c2Ugc2hpcHBhYmxlLiAgVGhlIHJlbW90ZSBxdWVyeSBhYnNvcmJzIHRoZSBmdW5jdGlvbgpjYWxs IGFzIGEgRlJPTS1saXN0IGl0ZW0gKGUuZy4gdW5uZXN0KC4uLikgQVMgZjxydGk+KGMxLCBjMiwg Li4uKSksIHNvIHRoZQpmb3JlaWduIHNpZGUgcmV0dXJucyBvbmx5IHJvd3MgdGhhdCBtYXRjaCB0 aGUgZnVuY3Rpb24tcHJvZHVjZWQgc2V0IGFuZCB0aGUKam9pbiBleGVjdXRlcyBlbnRpcmVseSBv biB0aGUgcmVtb3RlLgoKQW4gSU1NVVRBQkxFIGZ1bmN0aW9uIGdpdmVzIHRoZSBzYW1lIHJlc3Vs dCBvbiBhbnkgc2VydmVyLCBzbyB0aGUgc2FtZQpmdW5jdGlvbiBSVEUgY2FuIGJlIGEgcHVzaC1k b3duIGNhbmRpZGF0ZSBmb3Igc2V2ZXJhbCBkaXN0aW5jdCBmb3JlaWduCnNlcnZlcnMgd2l0aG91 dCBzZW1hbnRpYyByaXNrLiAgVG8ga2VlcCB0aGUgcGxhbm5lciBzdGF0ZSBjb25zaXN0ZW50CmFj cm9zcyB0aG9zZSBpbmRlcGVuZGVudCBhdHRlbXB0cywgdGhlIHBlci1jYWxsIHN0dWIgZnBpbmZv IGZvciB0aGUKZnVuY3Rpb24gc2lkZSBsaXZlcyBvbiB0aGUgam9pbnJlbCdzIFBnRmR3UmVsYXRp b25JbmZvIChuZXcKb3V0ZXJfZnVuY19mcGluZm8gLyBpbm5lcl9mdW5jX2ZwaW5mbyksIG5ldmVy IG9uIHRoZSBmdW5jdGlvbiByZWwgaXRzZWxmLAphbmQgdGhlIGZ1bmN0aW9uIHNpZGUgaXMgZGV0 ZWN0ZWQgdmlhIHJ0ZWtpbmQgcmF0aGVyIHRoYW4gZmR3X3ByaXZhdGUuCgpzZXRfZm9yZWlnbl9y ZWxfcHJvcGVydGllcygpIHByb3BhZ2F0ZXMgZmR3cm91dGluZSBvbnRvIGEgam9pbnJlbCB0aGF0 CnBhaXJzIGEgZm9yZWlnbiByZWwgd2l0aCBhbiBSVEVfRlVOQ1RJT04gcmVsIHNvIEdldEZvcmVp Z25Kb2luUGF0aHMgZ2V0cwpjYWxsZWQ7IHRoZSBGRFcgcmV0YWlucyBmdWxsIGNvbnRyb2wgb3Zl ciB3aGV0aGVyIHRvIGFjdHVhbGx5IGdlbmVyYXRlIGEKcGF0aC4gIGRlcGFyc2VSYW5nZVRibFJl ZiBhbmQgZGVwYXJzZUNvbHVtblJlZiBnYWluIGEgRlVOQ1RJT04tUlRFIGJyYW5jaAp0aGF0IGVt aXRzIHRoZSBmdW5jdGlvbiBleHByZXNzaW9uIGFuZCByZXNvbHZlcyBWYXJzIHRvIHRoZSBnZW5l cmF0ZWQKLS0tCiBjb250cmliL3Bvc3RncmVzX2Zkdy9kZXBhcnNlLmMgICAgICAgICAgICAgICAg fCAxNDMgKysrLQogLi4uL3Bvc3RncmVzX2Zkdy9leHBlY3RlZC9wb3N0Z3Jlc19mZHcub3V0ICAg IHwgNjMxICsrKysrKysrKysrKysrKysrKwogY29udHJpYi9wb3N0Z3Jlc19mZHcvcG9zdGdyZXNf ZmR3LmMgICAgICAgICAgIHwgNjA4ICsrKysrKysrKysrKysrKy0tCiBjb250cmliL3Bvc3RncmVz X2Zkdy9wb3N0Z3Jlc19mZHcuaCAgICAgICAgICAgfCAgMTIgKwogY29udHJpYi9wb3N0Z3Jlc19m ZHcvc3FsL3Bvc3RncmVzX2Zkdy5zcWwgICAgIHwgMjY1ICsrKysrKysrCiBzcmMvYmFja2VuZC9v cHRpbWl6ZXIvdXRpbC9yZWxub2RlLmMgICAgICAgICAgfCAgMjQgKwogNiBmaWxlcyBjaGFuZ2Vk LCAxNjI2IGluc2VydGlvbnMoKyksIDU3IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2NvbnRy aWIvcG9zdGdyZXNfZmR3L2RlcGFyc2UuYyBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3L2RlcGFyc2Uu YwppbmRleCAyZGNjNmM4YWYxYi4uYTJlOTMwMWZiNjUgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvcG9z dGdyZXNfZmR3L2RlcGFyc2UuYworKysgYi9jb250cmliL3Bvc3RncmVzX2Zkdy9kZXBhcnNlLmMK QEAgLTY4LDYgKzY4LDcgQEAgdHlwZWRlZiBzdHJ1Y3QgZm9yZWlnbl9nbG9iX2N4dAogewogCVBs YW5uZXJJbmZvICpyb290OwkJCS8qIGdsb2JhbCBwbGFubmVyIHN0YXRlICovCiAJUmVsT3B0SW5m byAqZm9yZWlnbnJlbDsJCS8qIHRoZSBmb3JlaWduIHJlbGF0aW9uIHdlIGFyZSBwbGFubmluZyBm b3IgKi8KKwlQZ0Zkd1JlbGF0aW9uSW5mbyAqZnBpbmZvOwkvKiB0aGUgZm9yZWlnbiBzZXJ2ZXIg aW5mbyB3ZSBzaG91bGQgcmVseSBvbiAqLwogCVJlbGlkcwkJcmVsaWRzOwkJCS8qIHJlbGlkcyBv ZiBiYXNlIHJlbGF0aW9ucyBpbiB0aGUgdW5kZXJseWluZwogCQkJCQkJCQkgKiBzY2FuICovCiB9 IGZvcmVpZ25fZ2xvYl9jeHQ7CkBAIC0xMTIsNiArMTEzLDcgQEAgdHlwZWRlZiBzdHJ1Y3QgZGVw YXJzZV9leHByX2N4dAogCQlhcHBlbmRTdHJpbmdJbmZvKChidWYpLCAiJXMlZC4iLCBSRUxfQUxJ QVNfUFJFRklYLCAodmFybm8pKQogI2RlZmluZSBTVUJRVUVSWV9SRUxfQUxJQVNfUFJFRklYCSJz IgogI2RlZmluZSBTVUJRVUVSWV9DT0xfQUxJQVNfUFJFRklYCSJjIgorI2RlZmluZSBGVU5DVElP Tl9SRUxfQUxJQVNfUFJFRklYCSJmIgogCiAvKgogICogRnVuY3Rpb25zIHRvIGRldGVybWluZSB3 aGV0aGVyIGFuIGV4cHJlc3Npb24gY2FuIGJlIGV2YWx1YXRlZCBzYWZlbHkgb24KQEAgLTIxNyw2 ICsyMTksNyBAQCBzdGF0aWMgdm9pZCBnZXRfcmVsYXRpb25fY29sdW1uX2FsaWFzX2lkcyhWYXIg Km5vZGUsIFJlbE9wdEluZm8gKmZvcmVpZ25yZWwsCiB2b2lkCiBjbGFzc2lmeUNvbmRpdGlvbnMo UGxhbm5lckluZm8gKnJvb3QsCiAJCQkJICAgUmVsT3B0SW5mbyAqYmFzZXJlbCwKKwkJCQkgICBQ Z0Zkd1JlbGF0aW9uSW5mbyAqZnBpbmZvLAogCQkJCSAgIExpc3QgKmlucHV0X2NvbmRzLAogCQkJ CSAgIExpc3QgKipyZW1vdGVfY29uZHMsCiAJCQkJICAgTGlzdCAqKmxvY2FsX2NvbmRzKQpAQCAt MjMwLDcgKzIzMyw3IEBAIGNsYXNzaWZ5Q29uZGl0aW9ucyhQbGFubmVySW5mbyAqcm9vdCwKIAl7 CiAJCVJlc3RyaWN0SW5mbyAqcmkgPSBsZmlyc3Rfbm9kZShSZXN0cmljdEluZm8sIGxjKTsKIAot CQlpZiAoaXNfZm9yZWlnbl9leHByKHJvb3QsIGJhc2VyZWwsIHJpLT5jbGF1c2UpKQorCQlpZiAo aXNfZm9yZWlnbl9leHByKHJvb3QsIGJhc2VyZWwsIGZwaW5mbywgcmktPmNsYXVzZSkpCiAJCQkq cmVtb3RlX2NvbmRzID0gbGFwcGVuZCgqcmVtb3RlX2NvbmRzLCByaSk7CiAJCWVsc2UKIAkJCSps b2NhbF9jb25kcyA9IGxhcHBlbmQoKmxvY2FsX2NvbmRzLCByaSk7CkBAIC0yNDMsMTEgKzI0Niwx MSBAQCBjbGFzc2lmeUNvbmRpdGlvbnMoUGxhbm5lckluZm8gKnJvb3QsCiBib29sCiBpc19mb3Jl aWduX2V4cHIoUGxhbm5lckluZm8gKnJvb3QsCiAJCQkJUmVsT3B0SW5mbyAqYmFzZXJlbCwKKwkJ CQlQZ0Zkd1JlbGF0aW9uSW5mbyAqZnBpbmZvLAogCQkJCUV4cHIgKmV4cHIpCiB7CiAJZm9yZWln bl9nbG9iX2N4dCBnbG9iX2N4dDsKIAlmb3JlaWduX2xvY19jeHQgbG9jX2N4dDsKLQlQZ0Zkd1Jl bGF0aW9uSW5mbyAqZnBpbmZvID0gKFBnRmR3UmVsYXRpb25JbmZvICopIChiYXNlcmVsLT5mZHdf cHJpdmF0ZSk7CiAKIAkvKgogCSAqIENoZWNrIHRoYXQgdGhlIGV4cHJlc3Npb24gY29uc2lzdHMg b2Ygbm9kZXMgdGhhdCBhcmUgc2FmZSB0byBleGVjdXRlCkBAIC0yNTUsNiArMjU4LDcgQEAgaXNf Zm9yZWlnbl9leHByKFBsYW5uZXJJbmZvICpyb290LAogCSAqLwogCWdsb2JfY3h0LnJvb3QgPSBy b290OwogCWdsb2JfY3h0LmZvcmVpZ25yZWwgPSBiYXNlcmVsOworCWdsb2JfY3h0LmZwaW5mbyA9 IGZwaW5mbzsKIAogCS8qCiAJICogRm9yIGFuIHVwcGVyIHJlbGF0aW9uLCB1c2UgcmVsaWRzIGZy b20gaXRzIHVuZGVybmVhdGggc2NhbiByZWxhdGlvbiwKQEAgLTMyNCw4ICszMjgsOCBAQCBmb3Jl aWduX2V4cHJfd2Fsa2VyKE5vZGUgKm5vZGUsCiAJaWYgKG5vZGUgPT0gTlVMTCkKIAkJcmV0dXJu IHRydWU7CiAKLQkvKiBNYXkgbmVlZCBzZXJ2ZXIgaW5mbyBmcm9tIGJhc2VyZWwncyBmZHdfcHJp dmF0ZSBzdHJ1Y3QgKi8KLQlmcGluZm8gPSAoUGdGZHdSZWxhdGlvbkluZm8gKikgKGdsb2JfY3h0 LT5mb3JlaWducmVsLT5mZHdfcHJpdmF0ZSk7CisJLyogTWF5IG5lZWQgc2VydmVyIGluZm8gZnJv bSBnbG9iYWwgY29udGV4dCAqLworCWZwaW5mbyA9IGdsb2JfY3h0LT5mcGluZm87CiAKIAkvKiBT ZXQgdXAgaW5uZXJfY3h0IGZvciBwb3NzaWJsZSByZWN1cnNpb24gdG8gY2hpbGQgbm9kZXMgKi8K IAlpbm5lcl9jeHQuY29sbGF0aW9uID0gSW52YWxpZE9pZDsKQEAgLTIwMzAsNiArMjAzNCw3MiBA QCBkZXBhcnNlRnJvbUV4cHJGb3JSZWwoU3RyaW5nSW5mbyBidWYsIFBsYW5uZXJJbmZvICpyb290 LCBSZWxPcHRJbmZvICpmb3JlaWducmVsLAogCX0KIH0KIAorLyoKKyAqIERlcGFyc2UgYSBGVU5D VElPTiBSVEUgYWJzb3JiZWQgaW50byBhIGZvcmVpZ24gam9pbi4gIFRoZSBmdW5jdGlvbiBjYWxs KHMpCisgKiBhcmUgZW1pdHRlZCBhcyBhIEZST00tbGlzdCBpdGVtOgorICoKKyAqICAgPGZ1bmNl eHByPiBBUyBmPHJ0aT4oYzEsIGMyLCAuLi4sIGNOKQorICoKKyAqIEZvciBtdWx0aS1mdW5jdGlv biBSVEVzIChTUUwgUk9XUyBGUk9NIChmMSgpLCBmMigpLCAuLi4pKSwgZWFjaAorICogZnVuY3Rp b24gY2FsbCBhcHBlYXJzIGNvbW1hLXNlcGFyYXRlZCBpbnNpZGUgUk9XUyBGUk9NKC4uLikuICBD b2x1bW4KKyAqIGFsaWFzZXMgYzEuLmNOIGNvdmVyIHRoZSB1bmlvbiBvZiBldmVyeSBmdW5jdGlv bidzIGNvbHVtbnMsIGluIHRoZQorICogb3JkZXIgdGhleSBhcHBlYXI7IHRoYXQgbWF0Y2hlcyB0 aGUgY29sdW1uIG9yZGVyaW5nIG9mIHRoZSBSVEUuCisgKi8KK3N0YXRpYyB2b2lkCitkZXBhcnNl RnVuY3Rpb25SYW5nZVRibFJlZihTdHJpbmdJbmZvIGJ1ZiwgUGxhbm5lckluZm8gKnJvb3QsCisJ CQkJCQkgICBSZWxPcHRJbmZvICpmb3JlaWducmVsLCBSZWxPcHRJbmZvICpzY2FucmVsLAorCQkJ CQkJICAgTGlzdCAqKnBhcmFtc19saXN0KQoreworCVJhbmdlVGJsRW50cnkgKnJ0ZSA9IHBsYW5u ZXJfcnRfZmV0Y2goZm9yZWlnbnJlbC0+cmVsaWQsIHJvb3QpOworCWRlcGFyc2VfZXhwcl9jeHQg Y29udGV4dDsKKwlMaXN0Q2VsbCAgICpsYzsKKwlib29sCQltdWx0aV9mdW5jOworCWludAkJCXRv dGFsX2NvbHMgPSAwOworCWludAkJCWk7CisKKwlBc3NlcnQocnRlLT5ydGVraW5kID09IFJURV9G VU5DVElPTik7CisJQXNzZXJ0KCFydGUtPmZ1bmNvcmRpbmFsaXR5KTsKKwlBc3NlcnQobGlzdF9s ZW5ndGgocnRlLT5mdW5jdGlvbnMpID49IDEpOworCisJbXVsdGlfZnVuYyA9IGxpc3RfbGVuZ3Ro KHJ0ZS0+ZnVuY3Rpb25zKSA+IDE7CisKKwljb250ZXh0LmJ1ZiA9IGJ1ZjsKKwljb250ZXh0LnJv b3QgPSByb290OworCWNvbnRleHQuZm9yZWlnbnJlbCA9IHNjYW5yZWw7CisJY29udGV4dC5zY2Fu cmVsID0gc2NhbnJlbDsKKwljb250ZXh0LnBhcmFtc19saXN0ID0gcGFyYW1zX2xpc3Q7CisKKwlp ZiAobXVsdGlfZnVuYykKKwkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZyhidWYsICJST1dTIEZST00g KCIpOworCisJZm9yZWFjaChsYywgcnRlLT5mdW5jdGlvbnMpCisJeworCQlSYW5nZVRibEZ1bmN0 aW9uICpydGZ1bmMgPSAoUmFuZ2VUYmxGdW5jdGlvbiAqKSBsZmlyc3QobGMpOworCisJCWlmIChm b3JlYWNoX2N1cnJlbnRfaW5kZXgobGMpID4gMCkKKwkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmco YnVmLCAiLCAiKTsKKwkJZGVwYXJzZUV4cHIoKEV4cHIgKikgcnRmdW5jLT5mdW5jZXhwciwgJmNv bnRleHQpOworCQl0b3RhbF9jb2xzICs9IHJ0ZnVuYy0+ZnVuY2NvbGNvdW50OworCX0KKworCWlm IChtdWx0aV9mdW5jKQorCQlhcHBlbmRTdHJpbmdJbmZvQ2hhcihidWYsICcpJyk7CisKKwkvKiBB bGlhcyArIGdlbmVyYXRlZCBjb2x1bW4tbmFtZSBsaXN0LiAqLworCWFwcGVuZFN0cmluZ0luZm8o YnVmLCAiICVzJWQiLCBGVU5DVElPTl9SRUxfQUxJQVNfUFJFRklYLCBmb3JlaWducmVsLT5yZWxp ZCk7CisJaWYgKHRvdGFsX2NvbHMgPiAwKQorCXsKKwkJYXBwZW5kU3RyaW5nSW5mb0NoYXIoYnVm LCAnKCcpOworCQlmb3IgKGkgPSAxOyBpIDw9IHRvdGFsX2NvbHM7IGkrKykKKwkJeworCQkJaWYg KGkgPiAxKQorCQkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoYnVmLCAiLCAiKTsKKwkJCWFwcGVu ZFN0cmluZ0luZm8oYnVmLCAiJXMlZCIsIFNVQlFVRVJZX0NPTF9BTElBU19QUkVGSVgsIGkpOwor CQl9CisJCWFwcGVuZFN0cmluZ0luZm9DaGFyKGJ1ZiwgJyknKTsKKwl9Cit9CisKIC8qCiAgKiBB cHBlbmQgRlJPTSBjbGF1c2UgZW50cnkgZm9yIHRoZSBnaXZlbiByZWxhdGlvbiBpbnRvIGJ1Zi4K ICAqIENvbmRpdGlvbnMgZnJvbSBsb3dlci1sZXZlbCBTRU1JLUpPSU5zIGFyZSBhcHBlbmRlZCB0 byBhZGRpdGlvbmFsX2NvbmRzCkBAIC0yMDQwLDcgKzIxMTAsMjIgQEAgZGVwYXJzZVJhbmdlVGJs UmVmKFN0cmluZ0luZm8gYnVmLCBQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqZm9yZWln bnJlbCwKIAkJCQkgICBib29sIG1ha2Vfc3VicXVlcnksIEluZGV4IGlnbm9yZV9yZWwsIExpc3Qg KippZ25vcmVfY29uZHMsCiAJCQkJICAgTGlzdCAqKmFkZGl0aW9uYWxfY29uZHMsIExpc3QgKipw YXJhbXNfbGlzdCkKIHsKLQlQZ0Zkd1JlbGF0aW9uSW5mbyAqZnBpbmZvID0gKFBnRmR3UmVsYXRp b25JbmZvICopIGZvcmVpZ25yZWwtPmZkd19wcml2YXRlOworCVBnRmR3UmVsYXRpb25JbmZvICpm cGluZm87CisKKwkvKgorCSAqIEZvciBhIGZ1bmN0aW9uIFJURSBhYnNvcmJlZCBpbnRvIGEgZm9y ZWlnbiBqb2luLCBkZXBhcnNlIHRoZSBmdW5jdGlvbgorCSAqIGV4cHJlc3Npb24gYXMgYSBGUk9N LWxpc3QgaXRlbSBhbmQgcmV0dXJuLiAgVGhlIHN0dWIgZnBpbmZvIHNldCB1cCBieQorCSAqIGZv cmVpZ25fam9pbl9vaygpIG1heSBvciBtYXkgbm90IGJlIHByZXNlbnQgaGVyZS4KKwkgKi8KKwlp ZiAoZm9yZWlnbnJlbC0+cnRla2luZCA9PSBSVEVfRlVOQ1RJT04pCisJeworCQlBc3NlcnQoIW1h a2Vfc3VicXVlcnkpOworCQlkZXBhcnNlRnVuY3Rpb25SYW5nZVRibFJlZihidWYsIHJvb3QsIGZv cmVpZ25yZWwsIGZvcmVpZ25yZWwsCisJCQkJCQkJCSAgIHBhcmFtc19saXN0KTsKKwkJcmV0dXJu OworCX0KKworCWZwaW5mbyA9IChQZ0Zkd1JlbGF0aW9uSW5mbyAqKSBmb3JlaWducmVsLT5mZHdf cHJpdmF0ZTsKIAogCS8qIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBpbiB0aGVzZSBjYXNlcy4gKi8K IAlBc3NlcnQoSVNfU0lNUExFX1JFTChmb3JlaWducmVsKSB8fCBJU19KT0lOX1JFTChmb3JlaWdu cmVsKSk7CkBAIC0yNzEyLDYgKzI3OTcsNTQgQEAgc3RhdGljIHZvaWQKIGRlcGFyc2VDb2x1bW5S ZWYoU3RyaW5nSW5mbyBidWYsIGludCB2YXJubywgaW50IHZhcmF0dG5vLCBSYW5nZVRibEVudHJ5 ICpydGUsCiAJCQkJIGJvb2wgcXVhbGlmeV9jb2wpCiB7CisJLyoKKwkgKiBGdW5jdGlvbiBSVEUg Y29sdW1uczogZW1pdCBhcyBmPHZhcm5vPi5jPHZhcmF0dG5vPiwgbWF0Y2hpbmcgdGhlCisJICog YWxpYXNlcyBnZW5lcmF0ZWQgYnkgZGVwYXJzZUZ1bmN0aW9uUmFuZ2VUYmxSZWYoKS4gIEEgd2hv bGUtcm93IFZhcgorCSAqICh2YXJhdHRubyA9PSAwKSBpcyByZW5kZXJlZCBhcyBST1coZjx2YXJu bz4uYzEsIC4uLiwgZjx2YXJubz4uYzxOPikKKwkgKiB3aGVyZSBOIGlzIHRoZSB0b3RhbCBjb2x1 bW4gY291bnQgb2YgdGhlIGZ1bmN0aW9uIFJURSAoaW5jbHVkaW5nIGFsbAorCSAqIFJPV1MgRlJP TSAoLi4uKSBtZW1iZXJzKS4gIFN5c3RlbSBhdHRyaWJ1dGVzIHN1Y2ggYXMgY3RpZCBoYXZlIG5v CisJICogbWVhbmluZyBmb3IgZnVuY3Rpb24gUlRFcyBhbmQgYXJlIHJlamVjdGVkLgorCSAqLwor CWlmIChydGUtPnJ0ZWtpbmQgPT0gUlRFX0ZVTkNUSU9OKQorCXsKKwkJaWYgKHZhcmF0dG5vID09 IDApCisJCXsKKwkJCWludAkJCW5jb2xzID0gbGlzdF9sZW5ndGgocnRlLT5lcmVmLT5jb2xuYW1l cyk7CisJCQlpbnQJCQlpOworCisJCQlpZiAocXVhbGlmeV9jb2wpCisJCQl7CisJCQkJYXBwZW5k U3RyaW5nSW5mb1N0cmluZyhidWYsICJDQVNFIFdIRU4gKCIpOworCQkJCWFwcGVuZFN0cmluZ0lu Zm8oYnVmLCAiJXMlZC4iLCBGVU5DVElPTl9SRUxfQUxJQVNfUFJFRklYLCB2YXJubyk7CisJCQkJ YXBwZW5kU3RyaW5nSW5mb1N0cmluZyhidWYsICIqKTo6dGV4dCBJUyBOT1QgTlVMTCBUSEVOICIp OworCQkJfQorCisJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKGJ1ZiwgIlJPVygiKTsKKwkJCWZv ciAoaSA9IDE7IGkgPD0gbmNvbHM7IGkrKykKKwkJCXsKKwkJCQlpZiAoaSA+IDEpCisJCQkJCWFw cGVuZFN0cmluZ0luZm9TdHJpbmcoYnVmLCAiLCAiKTsKKwkJCQlhcHBlbmRTdHJpbmdJbmZvKGJ1 ZiwgIiVzJWQuJXMlZCIsCisJCQkJCQkJCSBGVU5DVElPTl9SRUxfQUxJQVNfUFJFRklYLCB2YXJu bywKKwkJCQkJCQkJIFNVQlFVRVJZX0NPTF9BTElBU19QUkVGSVgsIGkpOworCQkJfQorCQkJYXBw ZW5kU3RyaW5nSW5mb0NoYXIoYnVmLCAnKScpOworCisJCQlpZiAocXVhbGlmeV9jb2wpCisJCQkJ YXBwZW5kU3RyaW5nSW5mb1N0cmluZyhidWYsICIgRU5EIik7CisJCQlyZXR1cm47CisJCX0KKwor CQlpZiAodmFyYXR0bm8gPCAwKQorCQkJZWxvZyhFUlJPUiwKKwkJCQkgInN5c3RlbSBhdHRyaWJ1 dGUgcmVmZXJlbmNlIHRvIGEgZnVuY3Rpb24gUlRFIGlzIG5vdCBzdXBwb3J0ZWQgaW4gZm9yZWln biBqb2luIHB1c2hkb3duIik7CisKKwkJaWYgKHF1YWxpZnlfY29sKQorCQkJYXBwZW5kU3RyaW5n SW5mbyhidWYsICIlcyVkLiIsIEZVTkNUSU9OX1JFTF9BTElBU19QUkVGSVgsIHZhcm5vKTsKKwkJ YXBwZW5kU3RyaW5nSW5mbyhidWYsICIlcyVkIiwgU1VCUVVFUllfQ09MX0FMSUFTX1BSRUZJWCwg dmFyYXR0bm8pOworCQlyZXR1cm47CisJfQorCiAJLyogV2Ugc3VwcG9ydCBmZXRjaGluZyB0aGUg cmVtb3RlIHNpZGUncyBDVElEIGFuZCBPSUQuICovCiAJaWYgKHZhcmF0dG5vID09IFNlbGZJdGVt UG9pbnRlckF0dHJpYnV0ZU51bWJlcikKIAl7CmRpZmYgLS1naXQgYS9jb250cmliL3Bvc3RncmVz X2Zkdy9leHBlY3RlZC9wb3N0Z3Jlc19mZHcub3V0IGIvY29udHJpYi9wb3N0Z3Jlc19mZHcvZXhw ZWN0ZWQvcG9zdGdyZXNfZmR3Lm91dAppbmRleCBhYWZmY2YzMTI3MS4uZTMzNTVhYThhODYgMTAw NjQ0Ci0tLSBhL2NvbnRyaWIvcG9zdGdyZXNfZmR3L2V4cGVjdGVkL3Bvc3RncmVzX2Zkdy5vdXQK KysrIGIvY29udHJpYi9wb3N0Z3Jlc19mZHcvZXhwZWN0ZWQvcG9zdGdyZXNfZmR3Lm91dApAQCAt Mjg4NSw2ICsyODg1LDYzNyBAQCBTRUxFQ1QgdDEuYzEsIHQyLmMyIEZST00gdjQgdDEgTEVGVCBK T0lOIGZ0NSB0MiBPTiAodDEuYzEgPSB0Mi5jMSkgT1JERVIgQlkgdDEuYwogKDEwIHJvd3MpCiAK IEFMVEVSIFZJRVcgdjQgT1dORVIgVE8gcmVncmVzc192aWV3X293bmVyOworLS0gPT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PQorLS0gRm9yZWlnbi1qb2luIHdpdGggRlVOQ1RJT04gUlRFIHB1c2hkb3duIChJTU1VVEFCTEUg ZnVuY3Rpb25zIG9ubHkpCistLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLSBJTU1VVEFCTEUgZnVuY3Rpb246IHVu bmVzdCBvZiBjb25zdGFudCBhcnJheSBjYW4gYmUgcHVzaGVkIGRvd24KK0VYUExBSU4gKFZFUkJP U0UsIENPU1RTIE9GRikKK1NFTEVDVCB0MS5jMSwgdDEuYzMgRlJPTSBmdDEgdDEsIHVubmVzdChB UlJBWVsxLCA1LCAxMCwgMTAwXTo6aW50W10pIEFTIHUoaWQpCitXSEVSRSB0MS5jMSA9IHUuaWQg T1JERVIgQlkgdDEuYzE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNvcnQKKyAgIE91dHB1dDogdDEuYzEsIHQxLmMzCisg ICBTb3J0IEtleTogdDEuYzEKKyAgIC0+ICBGb3JlaWduIFNjYW4KKyAgICAgICAgIE91dHB1dDog dDEuYzEsIHQxLmMzCisgICAgICAgICBSZWxhdGlvbnM6IChwdWJsaWMuZnQxIHQxKSBJTk5FUiBK T0lOIChwZ19jYXRhbG9nLnVubmVzdCgpIHUpCisgICAgICAgICBSZW1vdGUgU1FMOiBTRUxFQ1Qg cjEuIkMgMSIsIHIxLmMzIEZST00gKCJTIDEiLiJUIDEiIHIxIElOTkVSIEpPSU4gdW5uZXN0KCd7 MSw1LDEwLDEwMH0nOjppbnRlZ2VyW10pIGYyKGMxKSBPTiAoKChyMS4iQyAxIiA9IGYyLmMxKSkp KQorKDcgcm93cykKKworU0VMRUNUIHQxLmMxLCB0MS5jMyBGUk9NIGZ0MSB0MSwgdW5uZXN0KEFS UkFZWzEsIDUsIDEwLCAxMDBdOjppbnRbXSkgQVMgdShpZCkKK1dIRVJFIHQxLmMxID0gdS5pZCBP UkRFUiBCWSB0MS5jMTsKKyBjMSAgfCAgYzMgICAKKy0tLS0tKy0tLS0tLS0KKyAgIDEgfCAwMDAw MQorICAgNSB8IDAwMDA1CisgIDEwIHwgMDAwMTAKKyAxMDAgfCAwMDEwMAorKDQgcm93cykKKwor LS0gSU1NVVRBQkxFIGZ1bmN0aW9uOiBnZW5lcmF0ZV9zZXJpZXMgd2l0aCBjb25zdGFudCBhcmdz CitFWFBMQUlOIChWRVJCT1NFLCBDT1NUUyBPRkYpCitTRUxFQ1QgdDEuYzEgRlJPTSBmdDEgdDEs IGdlbmVyYXRlX3NlcmllcygxLCA0KSBBUyBnKGlkKQorV0hFUkUgdDEuYzEgPSBnLmlkIE9SREVS IEJZIHQxLmMxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgU29ydAorICAgT3V0cHV0OiB0 MS5jMQorICAgU29ydCBLZXk6IHQxLmMxCisgICAtPiAgRm9yZWlnbiBTY2FuCisgICAgICAgICBP dXRwdXQ6IHQxLmMxCisgICAgICAgICBSZWxhdGlvbnM6IChwdWJsaWMuZnQxIHQxKSBJTk5FUiBK T0lOIChwZ19jYXRhbG9nLmdlbmVyYXRlX3NlcmllcygpIGcpCisgICAgICAgICBSZW1vdGUgU1FM OiBTRUxFQ1QgcjEuIkMgMSIgRlJPTSAoIlMgMSIuIlQgMSIgcjEgSU5ORVIgSk9JTiBnZW5lcmF0 ZV9zZXJpZXMoMSwgNCkgZjIoYzEpIE9OICgoKHIxLiJDIDEiID0gZjIuYzEpKSkpCisoNyByb3dz KQorCitTRUxFQ1QgdDEuYzEgRlJPTSBmdDEgdDEsIGdlbmVyYXRlX3NlcmllcygxLCA0KSBBUyBn KGlkKQorV0hFUkUgdDEuYzEgPSBnLmlkIE9SREVSIEJZIHQxLmMxOworIGMxIAorLS0tLQorICAx CisgIDIKKyAgMworICA0CisoNCByb3dzKQorCistLSBWT0xBVElMRSBmdW5jdGlvbiAocmFuZG9t KSBtdXN0IE5PVCBiZSBwdXNoZWQgZG93bgorRVhQTEFJTiAoVkVSQk9TRSwgQ09TVFMgT0ZGKQor U0VMRUNUIHQxLmMxIEZST00gZnQxIHQxLCBnZW5lcmF0ZV9zZXJpZXMoMSwgNCArIChyYW5kb20o KSAqIDApOjppbnQpIEFTIGcoaWQpCitXSEVSRSB0MS5jMSA9IGcuaWQ7CisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQorIEhhc2ggSm9pbgorICAgT3V0cHV0OiB0MS5jMQorICAgSGFzaCBDb25kOiAo Zy5pZCA9IHQxLmMxKQorICAgLT4gIEZ1bmN0aW9uIFNjYW4gb24gcGdfY2F0YWxvZy5nZW5lcmF0 ZV9zZXJpZXMgZworICAgICAgICAgT3V0cHV0OiBnLmlkCisgICAgICAgICBGdW5jdGlvbiBDYWxs OiBnZW5lcmF0ZV9zZXJpZXMoMSwgKDQgKyAoKHJhbmRvbSgpICogJzAnOjpkb3VibGUgcHJlY2lz aW9uKSk6OmludGVnZXIpKQorICAgLT4gIEhhc2gKKyAgICAgICAgIE91dHB1dDogdDEuYzEKKyAg ICAgICAgIC0+ICBGb3JlaWduIFNjYW4gb24gcHVibGljLmZ0MSB0MQorICAgICAgICAgICAgICAg T3V0cHV0OiB0MS5jMQorICAgICAgICAgICAgICAgUmVtb3RlIFNRTDogU0VMRUNUICJDIDEiIEZS T00gIlMgMSIuIlQgMSIKKygxMSByb3dzKQorCistLSBXSVRIIE9SRElOQUxJVFkgbXVzdCBOT1Qg YmUgcHVzaGVkIGRvd24gKGxpbWl0YXRpb24gb2YgdGhpcyBpbXBsZW1lbnRhdGlvbikKK0VYUExB SU4gKFZFUkJPU0UsIENPU1RTIE9GRikKK1NFTEVDVCB0MS5jMSwgdS5vcmQKK0ZST00gZnQxIHQx LCB1bm5lc3QoQVJSQVlbMSwgNSwgMTBdOjppbnRbXSkgV0lUSCBPUkRJTkFMSVRZIEFTIHUoaWQs IG9yZCkKK1dIRVJFIHQxLmMxID0gdS5pZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICBRVUVS WSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgSGFzaCBKb2luCisgICBPdXRw dXQ6IHQxLmMxLCB1Lm9yZAorICAgSGFzaCBDb25kOiAodDEuYzEgPSB1LmlkKQorICAgLT4gIEZv cmVpZ24gU2NhbiBvbiBwdWJsaWMuZnQxIHQxCisgICAgICAgICBPdXRwdXQ6IHQxLmMxCisgICAg ICAgICBSZW1vdGUgU1FMOiBTRUxFQ1QgIkMgMSIgRlJPTSAiUyAxIi4iVCAxIgorICAgLT4gIEhh c2gKKyAgICAgICAgIE91dHB1dDogdS5vcmQsIHUuaWQKKyAgICAgICAgIC0+ICBGdW5jdGlvbiBT Y2FuIG9uIHBnX2NhdGFsb2cudW5uZXN0IHUKKyAgICAgICAgICAgICAgIE91dHB1dDogdS5vcmQs IHUuaWQKKyAgICAgICAgICAgICAgIEZ1bmN0aW9uIENhbGw6IHVubmVzdCgnezEsNSwxMH0nOjpp bnRlZ2VyW10pCisoMTEgcm93cykKKworLS0gU2FtZSBmdW5jdGlvbiBSVEUgam9pbmVkIHdpdGgg dHdvIGRpZmZlcmVudCBmb3JlaWduIHNlcnZlcnM6IHBsYW5uZXIgcGlja3MKKy0tIG9uZSBhYnNv cnB0aW9uICsgYSBsb2NhbCBqb2luIHdpdGggdGhlIHNlY29uZCBmb3JlaWduIHNlcnZlci4gIFRo ZSBmYWN0CistLSB0aGF0IHRoZSBmdW5jdGlvbiBpcyBJTU1VVEFCTEUgbWFrZXMgdGhpcyBzYWZl IGV2ZW4gaWYgYm90aCBzaWRlcyBjaG9zZSB0bworLS0gYWJzb3JiIGl0IGluZGVwZW5kZW50bHku CitFWFBMQUlOIChWRVJCT1NFLCBDT1NUUyBPRkYpCitTRUxFQ1QgdDEuYzEsIHQyLmMxCitGUk9N IGZ0MSB0MSwgZnQ2IHQyLCB1bm5lc3QoQVJSQVlbMSwgNSwgMTAsIDEwMF06OmludFtdKSBBUyB1 KGlkKQorV0hFUkUgdDEuYzEgPSB1LmlkIEFORCB0Mi5jMSA9IHUuaWQgT1JERVIgQlkgdDEuYzE7 CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorIE1lcmdlIEpvaW4KKyAgIE91dHB1dDogdDEuYzEsIHQyLmMxCisgICBNZXJnZSBD b25kOiAodDEuYzEgPSB1LmlkKQorICAgLT4gIEZvcmVpZ24gU2NhbiBvbiBwdWJsaWMuZnQxIHQx CisgICAgICAgICBPdXRwdXQ6IHQxLmMxCisgICAgICAgICBSZW1vdGUgU1FMOiBTRUxFQ1QgIkMg MSIgRlJPTSAiUyAxIi4iVCAxIiBPUkRFUiBCWSAiQyAxIiBBU0MgTlVMTFMgTEFTVAorICAgLT4g IFNvcnQKKyAgICAgICAgIE91dHB1dDogdDIuYzEsIHUuaWQKKyAgICAgICAgIFNvcnQgS2V5OiB0 Mi5jMQorICAgICAgICAgLT4gIEZvcmVpZ24gU2NhbgorICAgICAgICAgICAgICAgT3V0cHV0OiB0 Mi5jMSwgdS5pZAorICAgICAgICAgICAgICAgUmVsYXRpb25zOiAocHVibGljLmZ0NiB0MikgSU5O RVIgSk9JTiAocGdfY2F0YWxvZy51bm5lc3QoKSB1KQorICAgICAgICAgICAgICAgUmVtb3RlIFNR TDogU0VMRUNUIHIyLmMxLCBmMy5jMSBGUk9NICgiUyAxIi4iVCA0IiByMiBJTk5FUiBKT0lOIHVu bmVzdCgnezEsNSwxMCwxMDB9Jzo6aW50ZWdlcltdKSBmMyhjMSkgT04gKCgocjIuYzEgPSBmMy5j MSkpKSkKKygxMyByb3dzKQorCistLSBDb3N0LWJhc2VkIHNlbGVjdGlvbiBiZXR3ZWVuIHR3byBm b3JlaWduIHNlcnZlcnM6IGZ0MSAoIlMgMSIuIlQgMSIpIGhhcworLS0gMTAwMCByb3dzLCBmdDYg KCJTIDEiLiJUIDQiKSBoYXMgfjMzIHJvd3MuICBUaGUgc2FtZSBxdWVyeSBzaGFwZSBnZXRzIGEK Ky0tIGRpZmZlcmVudCBwdXNoLWRvd24gdGFyZ2V0IGRlcGVuZGluZyBvbiBhIHByZWRpY2F0ZSB0 aGF0IGNoYW5nZXMgdGhlCistLSBlZmZlY3RpdmUgY2FyZGluYWxpdHkgb2Ygb25lIHNpZGUgLS0g dGhlIGZ1bmN0aW9uICJqdW1wcyIgdG8gd2hpY2hldmVyCistLSBmb3JlaWduIHNjYW4gYmVuZWZp dHMgbW9yZSBmcm9tIGJlaW5nIHByZS1maWx0ZXJlZC4KK0FOQUxZWkUgZnQxOworQU5BTFlaRSBm dDY7CistLSBObyBleHRyYSBwcmVkaWNhdGU6IGZ0MSBpcyB0aGUgYmlnZ2VyIHNpZGUsIGZ1bmN0 aW9uIGFic29yYmVkIHRoZXJlLgorRVhQTEFJTiAoVkVSQk9TRSwgQ09TVFMgT0ZGKQorU0VMRUNU IHQxLmMxLCB0Mi5jMQorRlJPTSBmdDEgdDEsIGZ0NiB0MiwgdW5uZXN0KEFSUkFZWzMsIDYsIDks IDEyLCAxNSwgMThdOjppbnRbXSkgQVMgdShpZCkKK1dIRVJFIHQxLmMxID0gdS5pZCBBTkQgdDIu YzEgPSB1LmlkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEhhc2ggSm9pbgorICAgT3V0cHV0OiB0MS5jMSwg dDIuYzEKKyAgIEhhc2ggQ29uZDogKHQxLmMxID0gdDIuYzEpCisgICAtPiAgRm9yZWlnbiBTY2Fu CisgICAgICAgICBPdXRwdXQ6IHQxLmMxLCB1LmlkCisgICAgICAgICBSZWxhdGlvbnM6IChwdWJs aWMuZnQxIHQxKSBJTk5FUiBKT0lOIChwZ19jYXRhbG9nLnVubmVzdCgpIHUpCisgICAgICAgICBS ZW1vdGUgU1FMOiBTRUxFQ1QgcjEuIkMgMSIsIGYzLmMxIEZST00gKCJTIDEiLiJUIDEiIHIxIElO TkVSIEpPSU4gdW5uZXN0KCd7Myw2LDksMTIsMTUsMTh9Jzo6aW50ZWdlcltdKSBmMyhjMSkgT04g KCgocjEuIkMgMSIgPSBmMy5jMSkpKSkKKyAgIC0+ICBIYXNoCisgICAgICAgICBPdXRwdXQ6IHQy LmMxCisgICAgICAgICAtPiAgRm9yZWlnbiBTY2FuIG9uIHB1YmxpYy5mdDYgdDIKKyAgICAgICAg ICAgICAgIE91dHB1dDogdDIuYzEKKyAgICAgICAgICAgICAgIFJlbW90ZSBTUUw6IFNFTEVDVCBj MSBGUk9NICJTIDEiLiJUIDQiCisoMTIgcm93cykKKworLS0gU2VsZWN0aXZlIHByZWRpY2F0ZSBv biBmdDEuYzMgKG5vdCBpbiB0aGUgZXFjbGFzcykgc2hyaW5rcyBmdDEgdG8gYQorLS0gaGFuZGZ1 bCBvZiByZW1vdGUgcm93czsgbm93IGZ0NiBpcyBlZmZlY3RpdmVseSB0aGUgYmlnZ2VyIHNpZGUg YW5kIHRoZQorLS0gZnVuY3Rpb24gaXMgYWJzb3JiZWQgaW50byBmdDYgaW5zdGVhZC4KK0VYUExB SU4gKFZFUkJPU0UsIENPU1RTIE9GRikKK1NFTEVDVCB0MS5jMSwgdDIuYzEKK0ZST00gZnQxIHQx LCBmdDYgdDIsIHVubmVzdChBUlJBWVszLCA2LCA5LCAxMiwgMTUsIDE4XTo6aW50W10pIEFTIHUo aWQpCitXSEVSRSB0MS5jMSA9IHUuaWQgQU5EIHQyLmMxID0gdS5pZCBBTkQgdDEuYzMgPCAnMDAw MTAnOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wCisgICBPdXRwdXQ6IHQxLmMxLCB0Mi5j MQorICAgSm9pbiBGaWx0ZXI6ICh0MS5jMSA9IHUuaWQpCisgICAtPiAgRm9yZWlnbiBTY2FuIG9u IHB1YmxpYy5mdDEgdDEKKyAgICAgICAgIE91dHB1dDogdDEuYzEKKyAgICAgICAgIFJlbW90ZSBT UUw6IFNFTEVDVCAiQyAxIiBGUk9NICJTIDEiLiJUIDEiIFdIRVJFICgoYzMgPCAnMDAwMTAnKSkK KyAgIC0+ICBNYXRlcmlhbGl6ZQorICAgICAgICAgT3V0cHV0OiB0Mi5jMSwgdS5pZAorICAgICAg ICAgLT4gIEZvcmVpZ24gU2NhbgorICAgICAgICAgICAgICAgT3V0cHV0OiB0Mi5jMSwgdS5pZAor ICAgICAgICAgICAgICAgUmVsYXRpb25zOiAocHVibGljLmZ0NiB0MikgSU5ORVIgSk9JTiAocGdf Y2F0YWxvZy51bm5lc3QoKSB1KQorICAgICAgICAgICAgICAgUmVtb3RlIFNRTDogU0VMRUNUIHIy LmMxLCBmMy5jMSBGUk9NICgiUyAxIi4iVCA0IiByMiBJTk5FUiBKT0lOIHVubmVzdCgnezMsNiw5 LDEyLDE1LDE4fSc6OmludGVnZXJbXSkgZjMoYzEpIE9OICgoKHIyLmMxID0gZjMuYzEpKSkpCiso MTIgcm93cykKKworLS0gVGhlIHJlbWFpbmluZyBzY2VuYXJpb3MgcmV1c2UgYSBkZWRpY2F0ZWQg Zm9yZWlnbiB0YWJsZSB0byBjb3ZlciB0aGUKKy0tIGNvcm5lciBjYXNlcyBvZiBGVU5DVElPTiBS VEUgcHVzaC1kb3duOiBmdW5jdGlvbi1maXJzdCBGUk9NLCByZWNvcmQKKy0tIHJldHVybiB0eXBl IHJlamVjdGlvbiwgd2hvbGUtcm93IHJlZmVyZW5jZSwgVVBEQVRFLi4uRlJPTS4uLiwgYW5kCist LSBtdWx0aS1mdW5jdGlvbiBST1dTIEZST00uCitDUkVBVEUgVEFCTEUgYmFzZV90YmxfZm4gKGEg aW50LCBiIGludCk7CitJTlNFUlQgSU5UTyBiYXNlX3RibF9mbgorICBTRUxFQ1QgZywgZyArIDEw MCBGUk9NIGdlbmVyYXRlX3NlcmllcygxLCAzMCkgZzsKK0NSRUFURSBGT1JFSUdOIFRBQkxFIHJl bW90ZV90YmwgKGEgaW50LCBiIGludCkKKyAgU0VSVkVSIGxvb3BiYWNrIE9QVElPTlMgKHRhYmxl X25hbWUgJ2Jhc2VfdGJsX2ZuJyk7CistLSBUaGUgZnVuY3Rpb24gUlRFIGFwcGVhcnMgZmlyc3Qg aW4gRlJPTTsgdGhlIGZvcmVpZ24gcmVsYXRpb24gbXVzdCBiZQorLS0gZm91bmQgYnkgc2Nhbm5p bmcgZnNfYmFzZV9yZWxpZHMgZm9yIGFuIFJURV9SRUxBVElPTiByYXRoZXIgdGhhbgorLS0gdXNp bmcgc2Nhbi0+ZnNfcmVsaWQgYmxpbmRseS4KK0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikK K1NFTEVDVCAqIEZST00gdW5uZXN0KGFycmF5WzIsIDMsIDRdKSBuLCByZW1vdGVfdGJsIHIgV0hF UkUgci5hID0gbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCisgRm9yZWlnbiBTY2FuCisgICBPdXRwdXQ6IG4ubiwgci5hLCByLmIKKyAgIFJlbGF0 aW9uczogKHBnX2NhdGFsb2cudW5uZXN0KCkgbikgSU5ORVIgSk9JTiAocHVibGljLnJlbW90ZV90 YmwgcikKKyAgIFJlbW90ZSBTUUw6IFNFTEVDVCBmMS5jMSwgcjIuYSwgcjIuYiBGUk9NICh1bm5l c3QoJ3syLDMsNH0nOjppbnRlZ2VyW10pIGYxKGMxKSBJTk5FUiBKT0lOIHB1YmxpYy5iYXNlX3Ri bF9mbiByMiBPTiAoKChmMS5jMSA9IHIyLmEpKSkpCisoNCByb3dzKQorCitTRUxFQ1QgKiBGUk9N IHVubmVzdChhcnJheVsyLCAzLCA0XSkgbiwgcmVtb3RlX3RibCByCitXSEVSRSByLmEgPSBuIE9S REVSIEJZIHIuYTsKKyBuIHwgYSB8ICBiICAKKy0tLSstLS0rLS0tLS0KKyAyIHwgMiB8IDEwMgor IDMgfCAzIHwgMTAzCisgNCB8IDQgfCAxMDQKKygzIHJvd3MpCisKKy0tIEZ1bmN0aW9uIFJURSBp cyByZXN0cmljdGVkLCBzaGlwcGFibGUgY29uZGl0aW9ucworRVhQTEFJTiAoVkVSQk9TRSwgQ09T VFMgT0ZGKQorU0VMRUNUICogRlJPTSB1bm5lc3QoYXJyYXlbMiwgMywgNF0pIG4sIHJlbW90ZV90 YmwgciBXSEVSRSByLmEgPSBuIGFuZCBuID4gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFO ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tCisgRm9yZWlnbiBTY2FuCisgICBPdXRwdXQ6IG4ubiwgci5hLCByLmIKKyAgIFJlbGF0aW9u czogKHBnX2NhdGFsb2cudW5uZXN0KCkgbikgSU5ORVIgSk9JTiAocHVibGljLnJlbW90ZV90Ymwg cikKKyAgIFJlbW90ZSBTUUw6IFNFTEVDVCBmMS5jMSwgcjIuYSwgcjIuYiBGUk9NICh1bm5lc3Qo J3syLDMsNH0nOjppbnRlZ2VyW10pIGYxKGMxKSBJTk5FUiBKT0lOIHB1YmxpYy5iYXNlX3RibF9m biByMiBPTiAoKChmMS5jMSA9IHIyLmEpKSBBTkQgKChmMS5jMSA+IDMpKSkpCisoNCByb3dzKQor CitTRUxFQ1QgKiBGUk9NIHVubmVzdChhcnJheVsyLCAzLCA0XSkgbiwgcmVtb3RlX3RibCByCitX SEVSRSByLmEgPSBuIGFuZCBuID4gMyBPUkRFUiBCWSByLmE7CisgbiB8IGEgfCAgYiAgCistLS0r LS0tKy0tLS0tCisgNCB8IDQgfCAxMDQKKygxIHJvdykKKworLS0gRnVuY3Rpb24gUlRFIGlzIHJl c3RyaWN0ZWQsIG5vbnNoaXBwYWJsZSBjb25kaXRpb25zCitDUkVBVEUgRlVOQ1RJT04gZl9sb2Nh bChpbnQpIFJFVFVSTlMgaW50IEFTICQkCitCRUdJTgorUkVUVVJOICQxOworRU5ECiskJCBMQU5H VUFHRSBwbHBnc3FsOworRVhQTEFJTiAoVkVSQk9TRSwgQ09TVFMgT0ZGKQorU0VMRUNUICogRlJP TSB1bm5lc3QoYXJyYXlbMiwgMywgNF0pIG4sIHJlbW90ZV90YmwgciBXSEVSRSByLmEgPSBuIGFu ZCBuID4gZl9sb2NhbCgzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAg ICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEhhc2ggSm9pbgorICAgT3V0cHV0OiBuLm4sIHIu YSwgci5iCisgICBIYXNoIENvbmQ6IChyLmEgPSBuLm4pCisgICAtPiAgRm9yZWlnbiBTY2FuIG9u IHB1YmxpYy5yZW1vdGVfdGJsIHIKKyAgICAgICAgIE91dHB1dDogci5hLCByLmIKKyAgICAgICAg IFJlbW90ZSBTUUw6IFNFTEVDVCBhLCBiIEZST00gcHVibGljLmJhc2VfdGJsX2ZuCisgICAtPiAg SGFzaAorICAgICAgICAgT3V0cHV0OiBuLm4KKyAgICAgICAgIC0+ICBGdW5jdGlvbiBTY2FuIG9u IHBnX2NhdGFsb2cudW5uZXN0IG4KKyAgICAgICAgICAgICAgIE91dHB1dDogbi5uCisgICAgICAg ICAgICAgICBGdW5jdGlvbiBDYWxsOiB1bm5lc3QoJ3syLDMsNH0nOjppbnRlZ2VyW10pCisgICAg ICAgICAgICAgICBGaWx0ZXI6IChuLm4gPiBmX2xvY2FsKDMpKQorKDEyIHJvd3MpCisKK1NFTEVD VCAqIEZST00gdW5uZXN0KGFycmF5WzIsIDMsIDRdKSBuLCByZW1vdGVfdGJsIHIKK1dIRVJFIHIu YSA9IG4gYW5kIG4gPiBmX2xvY2FsKDMpIE9SREVSIEJZIHIuYTsKKyBuIHwgYSB8ICBiICAKKy0t LSstLS0rLS0tLS0KKyA0IHwgNCB8IDEwNAorKDEgcm93KQorCitEUk9QIEZVTkNUSU9OIGZfbG9j YWwoaW50KTsKKy0tIENoZWNrIHRoYXQgYSBxdWFsIG9uIHRoZSBmdW5jdGlvbiBSVEUgdXNpbmcg YSBmdW5jdGlvbiBmcm9tIGEgc2hpcHBhYmxlCistLSBleHRlbnNpb24gaXMgcHVzaGVkIGRvd24u ICBwbHBnc3FsIChub3QgaW5saW5lZCkgd2l0aCB0aGUgY29sdW1uIGFzCistLSBhcmd1bWVudCAo bm90IGNvbnN0LWZvbGRlZCkga2VlcHMgdGhlIGZ1bmN0aW9uIGNhbGwgaW4gdGhlIHF1YWwuCitD UkVBVEUgRlVOQ1RJT04gZl9leHQoaW50KSBSRVRVUk5TIGludCBBUyAkJAorQkVHSU4gUkVUVVJO ICQxOyBFTkQKKyQkIExBTkdVQUdFIHBscGdzcWwgSU1NVVRBQkxFOworQUxURVIgRVhURU5TSU9O IHBvc3RncmVzX2ZkdyBBREQgRlVOQ1RJT04gZl9leHQoaW50KTsKKy0tIEZvcmNlIHB1c2hkb3du IHNvIHRoZSBmaXhlZC1jb2RlIHBsYW4gaXMgZGV0ZXJtaW5pc3RpY2FsbHkgYSBGb3JlaWduCist LSBTY2FuOyBvbiB0aGUgdW5maXhlZCBjb2RlIHRoZSBxdWFsIGlzIGNsYXNzaWZpZWQgbG9jYWws IHRoZSBqb2luIGlzCistLSByZWZ1c2VkLCBhbmQgdGhlIHBsYW4gZmFsbHMgYmFjayB0byBhIGxv Y2FsIGpvaW4gaW5zdGVhZC4KK1NFVCBlbmFibGVfaGFzaGpvaW4gPSBvZmY7CitTRVQgZW5hYmxl X21lcmdlam9pbiA9IG9mZjsKK1NFVCBlbmFibGVfbmVzdGxvb3AgPSBvZmY7CitFWFBMQUlOIChW RVJCT1NFLCBDT1NUUyBPRkYpCitTRUxFQ1QgKiBGUk9NIHVubmVzdChhcnJheVsyLCAzLCA0XSkg biwgcmVtb3RlX3RibCByIFdIRVJFIHIuYSA9IG4gYW5kIGZfZXh0KG4pID4gMzsKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEZvcmVp Z24gU2NhbgorICAgT3V0cHV0OiBuLm4sIHIuYSwgci5iCisgICBSZWxhdGlvbnM6IChwZ19jYXRh bG9nLnVubmVzdCgpIG4pIElOTkVSIEpPSU4gKHB1YmxpYy5yZW1vdGVfdGJsIHIpCisgICBSZW1v dGUgU1FMOiBTRUxFQ1QgZjEuYzEsIHIyLmEsIHIyLmIgRlJPTSAodW5uZXN0KCd7MiwzLDR9Jzo6 aW50ZWdlcltdKSBmMShjMSkgSU5ORVIgSk9JTiBwdWJsaWMuYmFzZV90YmxfZm4gcjIgT04gKCgo ZjEuYzEgPSByMi5hKSkgQU5EICgocHVibGljLmZfZXh0KGYxLmMxKSA+IDMpKSkpCisoNCByb3dz KQorCitTRUxFQ1QgKiBGUk9NIHVubmVzdChhcnJheVsyLCAzLCA0XSkgbiwgcmVtb3RlX3RibCBy CitXSEVSRSByLmEgPSBuIGFuZCBmX2V4dChuKSA+IDMgT1JERVIgQlkgci5hOworIG4gfCBhIHwg IGIgIAorLS0tKy0tLSstLS0tLQorIDQgfCA0IHwgMTA0CisoMSByb3cpCisKK1JFU0VUIGVuYWJs ZV9oYXNoam9pbjsKK1JFU0VUIGVuYWJsZV9tZXJnZWpvaW47CitSRVNFVCBlbmFibGVfbmVzdGxv b3A7CitBTFRFUiBFWFRFTlNJT04gcG9zdGdyZXNfZmR3IERST1AgRlVOQ1RJT04gZl9leHQoaW50 KTsKK0RST1AgRlVOQ1RJT04gZl9leHQoaW50KTsKKy0tIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHJl Y29yZCAoY29tcG9zaXRlKSBpcyBmb3JiaWRkZW47IHB1c2hpbmcgaXQKKy0tIHdvdWxkIHlpZWxk IGEgcmVtb3RlICJjb2x1bW4gZGVmaW5pdGlvbiBsaXN0IGlzIHJlcXVpcmVkIiBlcnJvci4KKy0t IGZ1bmN0aW9uX3J0ZV9wdXNoZG93bl9vaygpIHJlamVjdHMgaXQgdmlhIFRZUEVGVU5DX1NDQUxB Ui4KK0NSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OIGZfcmV0X3JlY29yZCgpIFJFVFVSTlMgcmVj b3JkIEFTICQkCisgIFNFTEVDVCAoMSwgMik6OnJlY29yZAorJCQgTEFOR1VBR0UgU1FMIElNTVVU QUJMRTsKK0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikKK1NFTEVDVCBzIEZST00gcmVtb3Rl X3RibCBydCwgZl9yZXRfcmVjb3JkKCkgQVMgcyhhIGludCwgYiBpbnQpCitXSEVSRSBzLmEgPSBy dC5hOworICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAg ICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KKyBIYXNoIEpvaW4KKyAgIE91dHB1dDogcy4qCisgICBIYXNoIENvbmQ6IChydC5hID0gcy5h KQorICAgLT4gIEZvcmVpZ24gU2NhbiBvbiBwdWJsaWMucmVtb3RlX3RibCBydAorICAgICAgICAg T3V0cHV0OiBydC5hLCBydC5iCisgICAgICAgICBSZW1vdGUgU1FMOiBTRUxFQ1QgYSBGUk9NIHB1 YmxpYy5iYXNlX3RibF9mbgorICAgLT4gIEhhc2gKKyAgICAgICAgIE91dHB1dDogcy4qLCBzLmEK KyAgICAgICAgIC0+ICBGdW5jdGlvbiBTY2FuIG9uIHB1YmxpYy5mX3JldF9yZWNvcmQgcworICAg ICAgICAgICAgICAgT3V0cHV0OiBzLiosIHMuYQorICAgICAgICAgICAgICAgRnVuY3Rpb24gQ2Fs bDogZl9yZXRfcmVjb3JkKCkKKygxMSByb3dzKQorCitEUk9QIEZVTkNUSU9OIGZfcmV0X3JlY29y ZCgpOworLS0gVVBEQVRFIC4uLiBGUk9NIHVubmVzdCgpIHdpdGggYSBjb21wbGV4IGVsZW1lbnQg dHlwZTsgYXJlYShib3gpCistLSB5aWVsZHMgdGhlIHZhbHVlIHRvIG1hdGNoLiAgVGhlIGxvY2tp bmcgbWFjaGluZXJ5IGZvciB0aGUKKy0tIG5vbi1yZWxhdGlvbiBSVEUgZ2VuZXJhdGVzIGEgd2hv bGUtcm93IFZhciB0aGF0IGRlcGFyc2VDb2x1bW5SZWYKKy0tIGVtaXRzIGFzIFJPVyhmPHJ0aT4u YzEsIC4uLikuCitVUERBVEUgcmVtb3RlX3RibCByIFNFVCBiID0gOTk5CitGUk9NIHVubmVzdChh cnJheVtib3ggJygoMiwzKSwoLTIsLTMpKSddKSBBUyB0KGJ4KQorV0hFUkUgci5hID0gYXJlYSh0 LmJ4KTsKK1NFTEVDVCAqIEZST00gcmVtb3RlX3RibCBXSEVSRSBhIElOICgyMywgMjQsIDI1KSBP UkRFUiBCWSBhOworIGEgIHwgIGIgIAorLS0tLSstLS0tLQorIDIzIHwgMTIzCisgMjQgfCA5OTkK KyAyNSB8IDEyNQorKDMgcm93cykKKworLS0gVGhlIHNhbWUgc2hhcGUgd2l0aCBDQVNFIGFuZCBS RVRVUk5JTkc7IGV4ZXJjaXNlcyB0aGUgRGlyZWN0TW9kaWZ5CistLSBwYXRoIGFuZCB0aGUgZXhl Y3V0b3IncyB0dXBsZS1kZXNjIHJlY29uc3RydWN0aW9uLgorVVBEQVRFIHJlbW90ZV90Ymwgcgor ICAgU0VUIGIgPSBDQVNFIFdIRU4gcmFuZG9tKCkgPj0gMCBUSEVOIDUgRUxTRSAwIEVORAorICBG Uk9NIHVubmVzdChhcnJheVtib3ggJygoMiwzKSwoLTIsLTMpKSddKSBBUyB0KGJ4KQorIFdIRVJF IHIuYSA9IGFyZWEodC5ieCkgUkVUVVJOSU5HIGEsIGI7CisgYSAgfCBiIAorLS0tLSstLS0KKyAy NCB8IDUKKygxIHJvdykKKworLS0gUkVUVVJOSU5HIGEgd2hvbGUtcm93IHJlZmVyZW5jZSB0byB0 aGUgZnVuY3Rpb24gUlRFLiAgV2l0aG91dCB0aGUKKy0tIHBlci1SVEUgZnVuY3Rpb24gbWV0YWRh dGEgYmVpbmcgcHJlc2VydmVkIG9uIHRoZSBEaXJlY3RNb2RpZnkgcGF0aAorLS0gKEZkd0RpcmVj dE1vZGlmeVByaXZhdGVGdW5jdGlvbnMgLyBGZHdEaXJlY3RNb2RpZnlQcml2YXRlTWluUlRJbmRl eCksCistLSB0aGlzIHdvdWxkIGZhaWwgd2l0aCAiaW5wdXQgb2YgYW5vbnltb3VzIGNvbXBvc2l0 ZSB0eXBlcyBpcyBub3QKKy0tIGltcGxlbWVudGVkIi4KK1VQREFURSByZW1vdGVfdGJsIHIgU0VU IGIgPSA3CisgIEZST00gdW5uZXN0KGFycmF5W2JveCAnKCgyLDMpLCgtMiwtMykpJ10sCisgICAg ICAgICAgICAgIGFycmF5W2ludCAnMSddKSBBUyB0KGJ4LCBpKQorIFdIRVJFIHIuYSA9IGFyZWEo dC5ieCkgUkVUVVJOSU5HIGEsIGIsIHQ7CisgYSAgfCBiIHwgICAgICAgICAgdCAgICAgICAgICAK Ky0tLS0rLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIDI0IHwgNyB8ICgiKDIsMyksKC0yLC0z KSIsMSkKKygxIHJvdykKKworLS0gUk9XUyBGUk9NICguLi4pIHdpdGggc2V2ZXJhbCBmdW5jdGlv bnMuICBGb3JjZSBwdXNoZG93biBiZWNhdXNlIHRoZQorLS0gY29zdCBtb2RlbCBvdGhlcndpc2Ug cGlja3MgYSBsb2NhbCBwbGFuLgorU0VUIGVuYWJsZV9oYXNoam9pbiA9IG9mZjsKK1NFVCBlbmFi bGVfbWVyZ2Vqb2luID0gb2ZmOworU0VUIGVuYWJsZV9uZXN0bG9vcCA9IG9mZjsKK0VYUExBSU4g KFZFUkJPU0UsIENPU1RTIE9GRikKK1NFTEVDVCByLmEsIHQubiwgdC5zCisgIEZST00gcmVtb3Rl X3RibCByLCBST1dTIEZST00gKHVubmVzdChhcnJheVszLCA2LCA5XSksCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlX3NlcmllcygxMSwgMTMpKSBBUyB0KG4sIHMpCisg V0hFUkUgci5hID0gdC5uIE9SREVSIEJZIHIuYTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCisgU29ydAorICAgT3V0cHV0OiByLmEsIHQubiwgdC5zCisgICBTb3J0IEtleTogci5h CisgICAtPiAgRm9yZWlnbiBTY2FuCisgICAgICAgICBPdXRwdXQ6IHIuYSwgdC5uLCB0LnMKKyAg ICAgICAgIFJlbGF0aW9uczogKHB1YmxpYy5yZW1vdGVfdGJsIHIpIElOTkVSIEpPSU4gKFJPV1Mg RlJPTSAocGdfY2F0YWxvZy51bm5lc3QoKSwgcGdfY2F0YWxvZy5nZW5lcmF0ZV9zZXJpZXMoKSkg dCkKKyAgICAgICAgIFJlbW90ZSBTUUw6IFNFTEVDVCByMS5hLCBmMi5jMSwgZjIuYzIgRlJPTSAo cHVibGljLmJhc2VfdGJsX2ZuIHIxIElOTkVSIEpPSU4gUk9XUyBGUk9NICh1bm5lc3QoJ3szLDYs OX0nOjppbnRlZ2VyW10pLCBnZW5lcmF0ZV9zZXJpZXMoMTEsIDEzKSkgZjIoYzEsIGMyKSBPTiAo KChyMS5hID0gZjIuYzEpKSkpCisoNyByb3dzKQorCitTRUxFQ1Qgci5hLCB0Lm4sIHQucworICBG Uk9NIHJlbW90ZV90YmwgciwgUk9XUyBGUk9NICh1bm5lc3QoYXJyYXlbMywgNiwgOV0pLAorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZV9zZXJpZXMoMTEsIDEzKSkgQVMg dChuLCBzKQorIFdIRVJFIHIuYSA9IHQubiBPUkRFUiBCWSByLmE7CisgYSB8IG4gfCBzICAKKy0t LSstLS0rLS0tLQorIDMgfCAzIHwgMTEKKyA2IHwgNiB8IDEyCisgOSB8IDkgfCAxMworKDMgcm93 cykKKworLS0gV2hvbGUtcm93IFZhciBvbiB0aGUgYWJzb3JiZWQgZnVuY3Rpb24gc2lkZSAoZS5n LiB2aWEgYSBjYXN0IHRvCistLSB0ZXh0KS4gIEV4ZXJjaXNlcyBib3RoIGRlcGFyc2VDb2x1bW5S ZWYgd2hvbGUtcm93IGJyYW5jaCBhbmQgdGhlCistLSBnZXRfdHVwZGVzY19mb3Jfam9pbl9zY2Fu X3R1cGxlcygpIFJURV9GVU5DVElPTiBtZXRhZGF0YSBwYXRoLgorRVhQTEFJTiAoVkVSQk9TRSwg Q09TVFMgT0ZGKQorU0VMRUNUIHQ6OnRleHQsIHIuYQorICBGUk9NIHJlbW90ZV90YmwgciwgUk9X UyBGUk9NICh1bm5lc3QoYXJyYXlbMywgNiwgOV0pLAorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBnZW5lcmF0ZV9zZXJpZXMoMTEsIDEzKSkgQVMgdChuLCBzKQorIFdIRVJFIHIuYSA9 IHQubiBPUkRFUiBCWSByLmE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgU29ydAorICAgT3V0cHV0OiAo KHQuKik6OnRleHQpLCByLmEKKyAgIFNvcnQgS2V5OiByLmEKKyAgIC0+ICBGb3JlaWduIFNjYW4K KyAgICAgICAgIE91dHB1dDogKHQuKik6OnRleHQsIHIuYQorICAgICAgICAgUmVsYXRpb25zOiAo cHVibGljLnJlbW90ZV90YmwgcikgSU5ORVIgSk9JTiAoUk9XUyBGUk9NIChwZ19jYXRhbG9nLnVu bmVzdCgpLCBwZ19jYXRhbG9nLmdlbmVyYXRlX3NlcmllcygpKSB0KQorICAgICAgICAgUmVtb3Rl IFNRTDogU0VMRUNUIENBU0UgV0hFTiAoZjIuKik6OnRleHQgSVMgTk9UIE5VTEwgVEhFTiBST1co ZjIuYzEsIGYyLmMyKSBFTkQsIHIxLmEgRlJPTSAocHVibGljLmJhc2VfdGJsX2ZuIHIxIElOTkVS IEpPSU4gUk9XUyBGUk9NICh1bm5lc3QoJ3szLDYsOX0nOjppbnRlZ2VyW10pLCBnZW5lcmF0ZV9z ZXJpZXMoMTEsIDEzKSkgZjIoYzEsIGMyKSBPTiAoKChyMS5hID0gZjIuYzEpKSkpCisoNyByb3dz KQorCitTRUxFQ1QgdDo6dGV4dCwgci5hCisgIEZST00gcmVtb3RlX3RibCByLCBST1dTIEZST00g KHVubmVzdChhcnJheVszLCA2LCA5XSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGdlbmVyYXRlX3NlcmllcygxMSwgMTMpKSBBUyB0KG4sIHMpCisgV0hFUkUgci5hID0gdC5uIE9S REVSIEJZIHIuYTsKKyAgIHQgICAgfCBhIAorLS0tLS0tLS0rLS0tCisgKDMsMTEpIHwgMworICg2 LDEyKSB8IDYKKyAoOSwxMykgfCA5CisoMyByb3dzKQorCistLSBDaGVjayB3aG9sZS1yb3cgVmFy IHJlcHJlc2VudGVkIGJ5IGZ1bmN0aW9uIG9uIHRoZSBudWxsYWJsZQorLS0gbGVmdCBqb2luIHNp ZGUKK0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikKK1NFTEVDVCB1LCBmdDUuYzEsIGZ0NS5j MiwgZnQ0LmMxLCBmdDQuYzIgRlJPTSBmdDUgTEVGVCBKT0lOCisoZnQ0IEpPSU4gdW5uZXN0KGFy cmF5WzEsMl0sIGFycmF5WzMsNF0pIGFzIHUgKHUxLCB1MikgT04gZnQ0LmMxPXUxKQorT04gZnQ1 LmMxID0gZnQ0LmMxIFdIRVJFIGZ0NS5jMSA8IDEwIE9SREVSIEJZIGZ0NS5jMTsKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4g ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCist LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQorIEZvcmVpZ24gU2NhbgorICAgT3V0cHV0OiB1LiosIGZ0NS5jMSwgZnQ1LmMyLCBmdDQu YzEsIGZ0NC5jMgorICAgUmVsYXRpb25zOiAocHVibGljLmZ0NSkgTEVGVCBKT0lOICgocHVibGlj LmZ0NCkgSU5ORVIgSk9JTiAoUk9XUyBGUk9NIChwZ19jYXRhbG9nLnVubmVzdCgpLCBwZ19jYXRh bG9nLnVubmVzdCgpKSB1KSkKKyAgIFJlbW90ZSBTUUw6IFNFTEVDVCBDQVNFIFdIRU4gKGYzLiop Ojp0ZXh0IElTIE5PVCBOVUxMIFRIRU4gUk9XKGYzLmMxLCBmMy5jMikgRU5ELCByMS5jMSwgcjEu YzIsIHIyLmMxLCByMi5jMiBGUk9NICgiUyAxIi4iVCA0IiByMSBMRUZUIEpPSU4gKCJTIDEiLiJU IDMiIHIyIElOTkVSIEpPSU4gUk9XUyBGUk9NICh1bm5lc3QoJ3sxLDJ9Jzo6aW50ZWdlcltdKSwg dW5uZXN0KCd7Myw0fSc6OmludGVnZXJbXSkpIGYzKGMxLCBjMikgT04gKCgocjIuYzEgPSBmMy5j MSkpKSkgT04gKCgocjEuYzEgPSByMi5jMSkpKSkgV0hFUkUgKChyMS5jMSA8IDEwKSkgT1JERVIg QlkgcjEuYzEgQVNDIE5VTExTIExBU1QKKyg0IHJvd3MpCisKK1NFTEVDVCB1LCBmdDUuYzEsIGZ0 NS5jMiwgZnQ0LmMxLCBmdDQuYzIgRlJPTSBmdDUgTEVGVCBKT0lOCisoZnQ0IEpPSU4gdW5uZXN0 KGFycmF5WzEsMl0sIGFycmF5WzMsNF0pIGFzIHUgKHUxLCB1MikgT04gZnQ0LmMxPXUxKQorT04g ZnQ1LmMxID0gZnQ0LmMxIFdIRVJFIGZ0NS5jMSA8IDEwIE9SREVSIEJZIGZ0NS5jMTsKKyB1IHwg YzEgfCBjMiB8IGMxIHwgYzIgCistLS0rLS0tLSstLS0tKy0tLS0rLS0tLQorICAgfCAgMyB8ICA0 IHwgICAgfCAgIAorICAgfCAgNiB8ICA3IHwgICAgfCAgIAorICAgfCAgOSB8IDEwIHwgICAgfCAg IAorKDMgcm93cykKKworLS0gU2FtZSBudWxsYWJsZS1zaWRlIHdob2xlLXJvdyBWYXIsIGJ1dCB3 aXRoIG91dGVyIHJvd3MgdGhhdCBib3RoIG1hdGNoCistLSBhbmQgbWlzcyB0aGUgKGZvcmVpZ24g eCBmdW5jdGlvbikgaW5uZXIgam9pbi4gIEEgbXVsdGktY29sdW1uIGZ1bmN0aW9uCistLSBSVEUg aXMgdXNlZCBzbyB0aGF0IHRoZSByZWZlcmVuY2UgaXMgYSBnZW51aW5lIHdob2xlLXJvdyBWYXIg KGEgc2luZ2xlCistLSBzY2FsYXItcmV0dXJuaW5nIGZ1bmN0aW9uIHdvdWxkIGNvbGxhcHNlIHRv IGl0cyBsb25lIGNvbHVtbikuICBUaGlzCistLSBleGVyY2lzZXMgdGhlIFRIRU4gUk9XKC4uLikg c2lkZSBvZiBkZXBhcnNlQ29sdW1uUmVmKCkncyB3aG9sZS1yb3cgQ0FTRQorLS0gKG1hdGNoZWQg cm93cyByZWNvbnN0cnVjdCB0aGUgY29tcG9zaXRlKSBhcyB3ZWxsIGFzIHRoZSBOVUxMIHNpZGUK Ky0tIChtaXNzZWQgcm93cyksIGNvbmZpcm1pbmcgdGhlIGV4ZWN1dG9yIHJlYnVpbGRzIHRoZSBh bm9ueW1vdXMgY29tcG9zaXRlCistLSBjb3JyZWN0bHkuCitFWFBMQUlOIChWRVJCT1NFLCBDT1NU UyBPRkYpCitTRUxFQ1QgbC5hLCB0IEZST00gcmVtb3RlX3RibCBsCisgIExFRlQgSk9JTiAocmVt b3RlX3RibCByIEpPSU4gdW5uZXN0KGFycmF5WzIsIDRdLCBhcnJheVsyMCwgNDBdKSBBUyB0KHgs IHkpCisgICAgICAgICAgICAgT04gci5hID0gdC54KQorICBPTiBsLmEgPSByLmEKKyBXSEVSRSBs LmEgPCA2IE9SREVSIEJZIGwuYTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQorIEZvcmVpZ24gU2NhbgorICAgT3V0cHV0OiBsLmEsIHQuKgorICAgUmVsYXRp b25zOiAocHVibGljLnJlbW90ZV90YmwgbCkgTEVGVCBKT0lOICgocHVibGljLnJlbW90ZV90Ymwg cikgSU5ORVIgSk9JTiAoUk9XUyBGUk9NIChwZ19jYXRhbG9nLnVubmVzdCgpLCBwZ19jYXRhbG9n LnVubmVzdCgpKSB0KSkKKyAgIFJlbW90ZSBTUUw6IFNFTEVDVCByMS5hLCBDQVNFIFdIRU4gKGYz LiopOjp0ZXh0IElTIE5PVCBOVUxMIFRIRU4gUk9XKGYzLmMxLCBmMy5jMikgRU5EIEZST00gKHB1 YmxpYy5iYXNlX3RibF9mbiByMSBMRUZUIEpPSU4gKHB1YmxpYy5iYXNlX3RibF9mbiByMiBJTk5F UiBKT0lOIFJPV1MgRlJPTSAodW5uZXN0KCd7Miw0fSc6OmludGVnZXJbXSksIHVubmVzdCgnezIw LDQwfSc6OmludGVnZXJbXSkpIGYzKGMxLCBjMikgT04gKCgocjIuYSA9IGYzLmMxKSkpKSBPTiAo KChyMS5hID0gcjIuYSkpKSkgV0hFUkUgKChyMS5hIDwgNikpIE9SREVSIEJZIHIxLmEgQVNDIE5V TExTIExBU1QKKyg0IHJvd3MpCisKK1NFTEVDVCBsLmEsIHQgRlJPTSByZW1vdGVfdGJsIGwKKyAg TEVGVCBKT0lOIChyZW1vdGVfdGJsIHIgSk9JTiB1bm5lc3QoYXJyYXlbMiwgNF0sIGFycmF5WzIw LCA0MF0pIEFTIHQoeCwgeSkKKyAgICAgICAgICAgICBPTiByLmEgPSB0LngpCisgIE9OIGwuYSA9 IHIuYQorIFdIRVJFIGwuYSA8IDYgT1JERVIgQlkgbC5hOworIGEgfCAgIHQgICAgCistLS0rLS0t LS0tLS0KKyAxIHwgCisgMiB8ICgyLDIwKQorIDMgfCAKKyA0IHwgKDQsNDApCisgNSB8IAorKDUg cm93cykKKworUkVTRVQgZW5hYmxlX2hhc2hqb2luOworUkVTRVQgZW5hYmxlX21lcmdlam9pbjsK K1JFU0VUIGVuYWJsZV9uZXN0bG9vcDsKKy0tIENoZWNrIGZvcmVpZ24gam9pbiB3aXRoIHBhcmFt ZXRlcml6ZWQgZnVuY3Rpb24KK0NSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OIGYoaW50KSBSRVRV Uk5TIFNFVE9GIGludCBMQU5HVUFHRSBwbHBnc3FsIFJPV1MgMTAgQVMgJ0JFR0lOIFJFVFVSTiBR VUVSWSBTRUxFQ1QgZ2VuZXJhdGVfc2VyaWVzKDEsJDEpIDsgRU5EJyBJTU1VVEFCTEU7CitBTFRF UiBFWFRFTlNJT04gcG9zdGdyZXNfZmR3IEFERCBGVU5DVElPTiBmKElOVEVHRVIpOworRVhQTEFJ TiAoVkVSQk9TRSwgQ09TVFMgT0ZGKQorV0lUSCBzIEFTIE1BVEVSSUFMSVpFRCAoU0VMRUNUIHIx LiogRlJPTSByZW1vdGVfdGJsIHIxCitKT0lOIExBVEVSQUwKKyhTRUxFQ1QgcjIuYSBGUk9NIHJl bW90ZV90YmwgcjIsIGYocjEuYSkgTElNSVQgMSkgcworT04gdHJ1ZSkKK1NFTEVDVCAqIEZST00g cyBPUkRFUiBCWSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQorIFNvcnQKKyAgIE91dHB1dDogcy5hLCBzLmIKKyAgIFNvcnQgS2V5OiBzLmEKKyAgIENU RSBzCisgICAgIC0+ICBOZXN0ZWQgTG9vcAorICAgICAgICAgICBPdXRwdXQ6IHIxLmEsIHIxLmIK KyAgICAgICAgICAgLT4gIEZvcmVpZ24gU2NhbiBvbiBwdWJsaWMucmVtb3RlX3RibCByMQorICAg ICAgICAgICAgICAgICBPdXRwdXQ6IHIxLmEsIHIxLmIKKyAgICAgICAgICAgICAgICAgUmVtb3Rl IFNRTDogU0VMRUNUIGEsIGIgRlJPTSBwdWJsaWMuYmFzZV90YmxfZm4KKyAgICAgICAgICAgLT4g IEZvcmVpZ24gU2NhbgorICAgICAgICAgICAgICAgICBPdXRwdXQ6IE5VTEw6OmludGVnZXIKKyAg ICAgICAgICAgICAgICAgUmVsYXRpb25zOiAocHVibGljLnJlbW90ZV90YmwgcjIpIElOTkVSIEpP SU4gKHB1YmxpYy5mKCkpCisgICAgICAgICAgICAgICAgIFJlbW90ZSBTUUw6IFNFTEVDVCBOVUxM IEZST00gKHB1YmxpYy5iYXNlX3RibF9mbiByMSBJTk5FUiBKT0lOIHB1YmxpYy5mKCQxOjppbnRl Z2VyKSBmMihjMSkgT04gKFRSVUUpKSBMSU1JVCAxOjpiaWdpbnQKKyAgIC0+ICBDVEUgU2NhbiBv biBzCisgICAgICAgICBPdXRwdXQ6IHMuYSwgcy5iCisoMTUgcm93cykKKworV0lUSCBzIEFTIE1B VEVSSUFMSVpFRCAoU0VMRUNUIHIxLiogRlJPTSByZW1vdGVfdGJsIHIxCitKT0lOIExBVEVSQUwK KyhTRUxFQ1QgcjIuYSBGUk9NIHJlbW90ZV90YmwgcjIsIGYocjEuYSkgTElNSVQgMSkgcworT04g dHJ1ZSkKK1NFTEVDVCAqIEZST00gcyBPUkRFUiBCWSAxOworIGEgIHwgIGIgIAorLS0tLSstLS0t LQorICAxIHwgMTAxCisgIDIgfCAxMDIKKyAgMyB8IDEwMworICA0IHwgMTA0CisgIDUgfCAxMDUK KyAgNiB8IDEwNgorICA3IHwgMTA3CisgIDggfCAxMDgKKyAgOSB8IDEwOQorIDEwIHwgMTEwCisg MTEgfCAxMTEKKyAxMiB8IDExMgorIDEzIHwgMTEzCisgMTQgfCAxMTQKKyAxNSB8IDExNQorIDE2 IHwgMTE2CisgMTcgfCAxMTcKKyAxOCB8IDExOAorIDE5IHwgMTE5CisgMjAgfCAxMjAKKyAyMSB8 IDEyMQorIDIyIHwgMTIyCisgMjMgfCAxMjMKKyAyNCB8ICAgNworIDI1IHwgMTI1CisgMjYgfCAx MjYKKyAyNyB8IDEyNworIDI4IHwgMTI4CisgMjkgfCAxMjkKKyAzMCB8IDEzMAorKDMwIHJvd3Mp CisKK0FMVEVSIEVYVEVOU0lPTiBwb3N0Z3Jlc19mZHcgRFJPUCBGVU5DVElPTiBmKElOVEVHRVIp OworRFJPUCBGVU5DVElPTiBmKElOVEVHRVIpOworLS0gVm9sYXRpbGUgZnVuY3Rpb24gaW4gUk9X UyBGUk9NIGRpc3F1YWxpZmllcyB0aGUgd2hvbGUgUlRFLgorRVhQTEFJTiAoVkVSQk9TRSwgQ09T VFMgT0ZGKQorU0VMRUNUIHIuYSBGUk9NIHJlbW90ZV90YmwgciwKKyAgICAgICAgICAgICAgICBS T1dTIEZST00gKHVubmVzdChhcnJheVszLCA2LCA5XSksCisgICAgICAgICAgICAgICAgICAgICAg ICAgICBnZW5lcmF0ZV9zZXJpZXMoMSwgNCArIChyYW5kb20oKSAqIDApOjppbnQpKSBBUyB0KG4s IHMpCisgV0hFUkUgci5hID0gdC5uOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KKyBNZXJnZSBKb2luCisgICBPdXRwdXQ6IHIuYQorICAgTWVyZ2UgQ29uZDogKHQubiA9 IHIuYSkKKyAgIC0+ICBTb3J0CisgICAgICAgICBPdXRwdXQ6IHQubgorICAgICAgICAgU29ydCBL ZXk6IHQubgorICAgICAgICAgLT4gIEZ1bmN0aW9uIFNjYW4gb24gdAorICAgICAgICAgICAgICAg T3V0cHV0OiB0Lm4KKyAgICAgICAgICAgICAgIEZ1bmN0aW9uIENhbGw6IHVubmVzdCgnezMsNiw5 fSc6OmludGVnZXJbXSksIGdlbmVyYXRlX3NlcmllcygxLCAoNCArICgocmFuZG9tKCkgKiAnMCc6 OmRvdWJsZSBwcmVjaXNpb24pKTo6aW50ZWdlcikpCisgICAtPiAgU29ydAorICAgICAgICAgT3V0 cHV0OiByLmEKKyAgICAgICAgIFNvcnQgS2V5OiByLmEKKyAgICAgICAgIC0+ICBGb3JlaWduIFNj YW4gb24gcHVibGljLnJlbW90ZV90YmwgcgorICAgICAgICAgICAgICAgT3V0cHV0OiByLmEKKyAg ICAgICAgICAgICAgIFJlbW90ZSBTUUw6IFNFTEVDVCBhIEZST00gcHVibGljLmJhc2VfdGJsX2Zu CisoMTUgcm93cykKKworLS0gTEFURVJBTCBmdW5jdGlvbiByZWZlcmVuY2luZyBhIGZvcmVpZ24g VmFyOiBwb3N0Z3Jlc19mZHcncworLS0gZm9yZWlnbi1qb2luIHB1c2hkb3duIHJlamVjdHMgdGhp cyB2aWEgdGhlIGpvaW5yZWwtPmxhdGVyYWxfcmVsaWRzCistLSBjaGVjazsgdGhlIHBsYW4gaXMg dGhlcmVmb3JlIGEgbG9jYWwgTmVzdExvb3AgKyBGdW5jdGlvblNjYW4uCitFWFBMQUlOIChWRVJC T1NFLCBDT1NUUyBPRkYpCitTRUxFQ1Qgci5hLCB0LnggRlJPTSByZW1vdGVfdGJsIHIsIExBVEVS QUwgdW5uZXN0KGFycmF5W3IuYV0pIEFTIHQoeCkKK1dIRVJFIHIuYSA8PSAzIE9SREVSIEJZIHIu YTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFO ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAorICAgT3V0cHV0OiBy LmEsIHQueAorICAgLT4gIEZvcmVpZ24gU2NhbiBvbiBwdWJsaWMucmVtb3RlX3RibCByCisgICAg ICAgICBPdXRwdXQ6IHIuYSwgci5iCisgICAgICAgICBSZW1vdGUgU1FMOiBTRUxFQ1QgYSBGUk9N IHB1YmxpYy5iYXNlX3RibF9mbiBXSEVSRSAoKGEgPD0gMykpIE9SREVSIEJZIGEgQVNDIE5VTExT IExBU1QKKyAgIC0+ICBGdW5jdGlvbiBTY2FuIG9uIHBnX2NhdGFsb2cudW5uZXN0IHQKKyAgICAg ICAgIE91dHB1dDogdC54CisgICAgICAgICBGdW5jdGlvbiBDYWxsOiB1bm5lc3QoQVJSQVlbci5h XSkKKyg4IHJvd3MpCisKKy0tIE91dGVyIGpvaW5zIHdpdGggdGhlIGZ1bmN0aW9uIFJURSBhcmUg bm90IHB1c2hlZCBkb3duIChvbmx5IElOTkVSCistLSBqb2lucyBhcmUgc3VwcG9ydGVkIGJ5IGZ1 bmN0aW9uX3J0ZV9wdXNoZG93bl9vaygpKS4KK0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikK K1NFTEVDVCByLmEsIHQubiBGUk9NIHJlbW90ZV90YmwgcgorICAgICBMRUZUIEpPSU4gdW5uZXN0 KGFycmF5WzEsIDIsIDNdKSBBUyB0KG4pIE9OIHIuYSA9IHQubgorIFdIRVJFIHIuYSA8PSA1IE9S REVSIEJZIHIuYTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBR VUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBNZXJnZSBMZWZ0IEpvaW4K KyAgIE91dHB1dDogci5hLCB0Lm4KKyAgIE1lcmdlIENvbmQ6IChyLmEgPSB0Lm4pCisgICAtPiAg Rm9yZWlnbiBTY2FuIG9uIHB1YmxpYy5yZW1vdGVfdGJsIHIKKyAgICAgICAgIE91dHB1dDogci5h LCByLmIKKyAgICAgICAgIFJlbW90ZSBTUUw6IFNFTEVDVCBhIEZST00gcHVibGljLmJhc2VfdGJs X2ZuIFdIRVJFICgoYSA8PSA1KSkgT1JERVIgQlkgYSBBU0MgTlVMTFMgTEFTVAorICAgLT4gIFNv cnQKKyAgICAgICAgIE91dHB1dDogdC5uCisgICAgICAgICBTb3J0IEtleTogdC5uCisgICAgICAg ICAtPiAgRnVuY3Rpb24gU2NhbiBvbiBwZ19jYXRhbG9nLnVubmVzdCB0CisgICAgICAgICAgICAg ICBPdXRwdXQ6IHQubgorICAgICAgICAgICAgICAgRnVuY3Rpb24gQ2FsbDogdW5uZXN0KCd7MSwy LDN9Jzo6aW50ZWdlcltdKQorKDEyIHJvd3MpCisKKy0tIFNFTUkgam9pbiAoRVhJU1RTKSB3aXRo IGEgZnVuY3Rpb24gUlRFIGlzIGFsc28gbm90IHB1c2hlZCBkb3duLgorRVhQTEFJTiAoVkVSQk9T RSwgQ09TVFMgT0ZGKQorU0VMRUNUIHIuYSBGUk9NIHJlbW90ZV90YmwgcgorIFdIRVJFIEVYSVNU UyAoU0VMRUNUIDEgRlJPTSB1bm5lc3QoYXJyYXlbMywgNiwgOV0pIEFTIHQobikgV0hFUkUgdC5u ID0gci5hKQorIE9SREVSIEJZIHIuYTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQorIE1lcmdlIFNlbWkgSm9pbgorICAgT3V0cHV0OiByLmEKKyAgIE1l cmdlIENvbmQ6IChyLmEgPSB0Lm4pCisgICAtPiAgRm9yZWlnbiBTY2FuIG9uIHB1YmxpYy5yZW1v dGVfdGJsIHIKKyAgICAgICAgIE91dHB1dDogci5hLCByLmIKKyAgICAgICAgIFJlbW90ZSBTUUw6 IFNFTEVDVCBhIEZST00gcHVibGljLmJhc2VfdGJsX2ZuIE9SREVSIEJZIGEgQVNDIE5VTExTIExB U1QKKyAgIC0+ICBTb3J0CisgICAgICAgICBPdXRwdXQ6IHQubgorICAgICAgICAgU29ydCBLZXk6 IHQubgorICAgICAgICAgLT4gIEZ1bmN0aW9uIFNjYW4gb24gcGdfY2F0YWxvZy51bm5lc3QgdAor ICAgICAgICAgICAgICAgT3V0cHV0OiB0Lm4KKyAgICAgICAgICAgICAgIEZ1bmN0aW9uIENhbGw6 IHVubmVzdCgnezMsNiw5fSc6OmludGVnZXJbXSkKKygxMiByb3dzKQorCitEUk9QIEZPUkVJR04g VEFCTEUgcmVtb3RlX3RibDsKK0RST1AgVEFCTEUgYmFzZV90YmxfZm47CiAtLSA9PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PQogLS0gQ2hlY2sgdGhhdCB1c2VyaWQgdG8gdXNlIHdoZW4gcXVlcnlpbmcgdGhlIHJlbW90ZSB0 YWJsZSBpcyBjb3JyZWN0bHkKIC0tIHByb3BhZ2F0ZWQgaW50byBmb3JlaWduIHJlbHMgcHJlc2Vu dCBpbiBzdWJxdWVyaWVzIHVuZGVyIGFuIFVOSU9OIEFMTApkaWZmIC0tZ2l0IGEvY29udHJpYi9w b3N0Z3Jlc19mZHcvcG9zdGdyZXNfZmR3LmMgYi9jb250cmliL3Bvc3RncmVzX2Zkdy9wb3N0Z3Jl c19mZHcuYwppbmRleCAwZmY0ZWMyMzE2NC4uNTlhZjQ2ZjY5NDIgMTAwNjQ0Ci0tLSBhL2NvbnRy aWIvcG9zdGdyZXNfZmR3L3Bvc3RncmVzX2Zkdy5jCisrKyBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3 L3Bvc3RncmVzX2Zkdy5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSAibm9kZXMvbWFrZWZ1 bmNzLmgiCiAjaW5jbHVkZSAibm9kZXMvbm9kZUZ1bmNzLmgiCiAjaW5jbHVkZSAib3B0aW1pemVy L2FwcGVuZGluZm8uaCIKKyNpbmNsdWRlICJvcHRpbWl6ZXIvY2xhdXNlcy5oIgogI2luY2x1ZGUg Im9wdGltaXplci9jb3N0LmgiCiAjaW5jbHVkZSAib3B0aW1pemVyL2luaGVyaXQuaCIKICNpbmNs dWRlICJvcHRpbWl6ZXIvb3B0aW1pemVyLmgiCkBAIC04OCw2ICs4OSwyMiBAQCBlbnVtIEZkd1Nj YW5Qcml2YXRlSW5kZXgKIAkgKiBvZiBqb2luLCBhZGRlZCB3aGVuIHRoZSBzY2FuIGlzIGpvaW4K IAkgKi8KIAlGZHdTY2FuUHJpdmF0ZVJlbGF0aW9ucywKKworCS8qCisJICogTGlzdCBvZiBwZXIt UlRFIGZ1bmN0aW9uIG1ldGFkYXRhLCBpbmRleGVkIGJ5IGJhc2UgUlRJIG9mZnNldC4gIEVhY2gK KwkgKiBlbGVtZW50IGlzIGVpdGhlciBOVUxMIChmb3Igbm9uLVJURV9GVU5DVElPTiByZWxzIGlu IHRoaXMgc2Nhbikgb3IgYQorCSAqIGxpc3Qgb2YgdGhyZWUtZWxlbWVudCBsaXN0cyAoZnVuY2lk LCBmdW5jcmV0dHlwZSwgZnVuY2NvbGxhdGlvbikgLS0gb25lCisJICogaW5uZXIgbGlzdCBwZXIg ZnVuY3Rpb24gaW4gdGhlIFJURS4gIEFsbG93cyB0aGUgZXhlY3V0b3IgdG8gcmVidWlsZAorCSAq IFR1cGxlRGVzYyBlbnRyaWVzIGZvciB3aG9sZS1yb3cgcmVmZXJlbmNlcyB0byBmdW5jdGlvbiBS VEVzLgorCSAqLworCUZkd1NjYW5Qcml2YXRlRnVuY3Rpb25zLAorCisJLyoKKwkgKiBJbnRlZ2Vy IG5vZGU6IG1pbmltdW0gYmFzZSBSVCBpbmRleCBjb3ZlcmVkIGJ5IHRoZSBzY2FuLCB1c2VkIHRv CisJICogdHJhbnNsYXRlIHNjYW4tbG9jYWwgaW5kZXhlcyB0byBlc3RhdGUtcnRhYmxlIGluZGV4 ZXMgYWZ0ZXIgc2V0cmVmcy5jCisJICogZmxhdHRlbnMgcnRhYmxlcy4KKwkgKi8KKwlGZHdTY2Fu UHJpdmF0ZU1pblJUSW5kZXgsCiB9OwogCiAvKgpAQCAtMTI0LDYgKzE0MSwxMSBAQCBlbnVtIEZk d01vZGlmeVByaXZhdGVJbmRleAogICogMikgQm9vbGVhbiBmbGFnIHNob3dpbmcgaWYgdGhlIHJl bW90ZSBxdWVyeSBoYXMgYSBSRVRVUk5JTkcgY2xhdXNlCiAgKiAzKSBJbnRlZ2VyIGxpc3Qgb2Yg YXR0cmlidXRlIG51bWJlcnMgcmV0cmlldmVkIGJ5IFJFVFVSTklORywgaWYgYW55CiAgKiA0KSBC b29sZWFuIGZsYWcgc2hvd2luZyBpZiB3ZSBzZXQgdGhlIGNvbW1hbmQgZXNfcHJvY2Vzc2VkCisg KiA1KSBQZXItUlRFIGZ1bmN0aW9uIG1ldGFkYXRhIChtaXJyb3JzIEZkd1NjYW5Qcml2YXRlRnVu Y3Rpb25zOyBsZXRzCisgKiAgICB0aGUgZXhlY3V0b3IgcmVidWlsZCBUdXBsZURlc2MgZW50cmll cyBmb3Igd2hvbGUtcm93IFZhcnMgb3ZlcgorICogICAgZnVuY3Rpb24gUlRFcyBhYnNvcmJlZCBp bnRvIGEgZm9yZWlnbiBqb2luKQorICogNikgSW50ZWdlciBub2RlOiBtaW5pbXVtIGJhc2UgUlQg aW5kZXggb2YgdGhlIHNjYW4gKG1pcnJvcnMKKyAqICAgIEZkd1NjYW5Qcml2YXRlTWluUlRJbmRl eCkKICAqLwogZW51bSBGZHdEaXJlY3RNb2RpZnlQcml2YXRlSW5kZXgKIHsKQEAgLTEzNSw2ICsx NTcsMTAgQEAgZW51bSBGZHdEaXJlY3RNb2RpZnlQcml2YXRlSW5kZXgKIAlGZHdEaXJlY3RNb2Rp ZnlQcml2YXRlUmV0cmlldmVkQXR0cnMsCiAJLyogc2V0LXByb2Nlc3NlZCBmbGFnIChhcyBhIEJv b2xlYW4gbm9kZSkgKi8KIAlGZHdEaXJlY3RNb2RpZnlQcml2YXRlU2V0UHJvY2Vzc2VkLAorCS8q IFBlci1SVEUgZnVuY3Rpb24gbWV0YWRhdGEsIGluZGV4ZWQgYnkgYmFzZSBSVEkgb2Zmc2V0ICov CisJRmR3RGlyZWN0TW9kaWZ5UHJpdmF0ZUZ1bmN0aW9ucywKKwkvKiBJbnRlZ2VyIG5vZGU6IG1p bmltdW0gYmFzZSBSVCBpbmRleCBpbiB0aGUgc2NhbiAqLworCUZkd0RpcmVjdE1vZGlmeVByaXZh dGVNaW5SVEluZGV4LAogfTsKIAogLyoKQEAgLTc0MCw2ICs3NjYsOSBAQCBzdGF0aWMgYm9vbCBm b3JlaWduX2dyb3VwaW5nX29rKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpncm91cGVk X3JlbCwKIHN0YXRpYyBMaXN0ICpnZXRfdXNlZnVsX3BhdGhrZXlzX2Zvcl9yZWxhdGlvbihQbGFu bmVySW5mbyAqcm9vdCwKIAkJCQkJCQkJCQkJICBSZWxPcHRJbmZvICpyZWwpOwogc3RhdGljIExp c3QgKmdldF91c2VmdWxfZWNzX2Zvcl9yZWxhdGlvbihQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0 SW5mbyAqcmVsKTsKK3N0YXRpYyBSZWxpZHMgZ2V0X2Jhc2VfcmVsaWRzKFBsYW5uZXJJbmZvICpy b290LCBSZWxPcHRJbmZvICpyZWwpOworc3RhdGljIGludAlnZXRfbWluX2Jhc2VfcnRpKFBsYW5u ZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwpOworc3RhdGljIExpc3QgKmdldF9mdW5jdGlv bnNfZGF0YShQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsKTsKIHN0YXRpYyB2b2lk IGFkZF9wYXRoc193aXRoX3BhdGhrZXlzX2Zvcl9yZWwoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9w dEluZm8gKnJlbCwKIAkJCQkJCQkJCQkJUGF0aCAqZXBxX3BhdGgsIExpc3QgKnJlc3RyaWN0bGlz dCk7CiBzdGF0aWMgdm9pZCBhZGRfZm9yZWlnbl9ncm91cGluZ19wYXRocyhQbGFubmVySW5mbyAq cm9vdCwKQEAgLTg5Myw3ICs5MjIsNyBAQCBwb3N0Z3Jlc0dldEZvcmVpZ25SZWxTaXplKFBsYW5u ZXJJbmZvICpyb290LAogCSAqIElkZW50aWZ5IHdoaWNoIGJhc2VyZXN0cmljdGluZm8gY2xhdXNl cyBjYW4gYmUgc2VudCB0byB0aGUgcmVtb3RlCiAJICogc2VydmVyIGFuZCB3aGljaCBjYW4ndC4K IAkgKi8KLQljbGFzc2lmeUNvbmRpdGlvbnMocm9vdCwgYmFzZXJlbCwgYmFzZXJlbC0+YmFzZXJl c3RyaWN0aW5mbywKKwljbGFzc2lmeUNvbmRpdGlvbnMocm9vdCwgYmFzZXJlbCwgZnBpbmZvLCBi YXNlcmVsLT5iYXNlcmVzdHJpY3RpbmZvLAogCQkJCQkgICAmZnBpbmZvLT5yZW1vdGVfY29uZHMs ICZmcGluZm8tPmxvY2FsX2NvbmRzKTsKIAogCS8qCkBAIC0xMjk3LDcgKzEzMjYsNyBAQCBwb3N0 Z3Jlc0dldEZvcmVpZ25QYXRocyhQbGFubmVySW5mbyAqcm9vdCwKIAkJCWNvbnRpbnVlOwogCiAJ CS8qIFNlZSBpZiBpdCBpcyBzYWZlIHRvIHNlbmQgdG8gcmVtb3RlICovCi0JCWlmICghaXNfZm9y ZWlnbl9leHByKHJvb3QsIGJhc2VyZWwsIHJpbmZvLT5jbGF1c2UpKQorCQlpZiAoIWlzX2ZvcmVp Z25fZXhwcihyb290LCBiYXNlcmVsLCBmcGluZm8sIHJpbmZvLT5jbGF1c2UpKQogCQkJY29udGlu dWU7CiAKIAkJLyogQ2FsY3VsYXRlIHJlcXVpcmVkIG91dGVyIHJlbHMgZm9yIHRoZSByZXN1bHRp bmcgcGF0aCAqLwpAQCAtMTM3Myw3ICsxNDAyLDcgQEAgcG9zdGdyZXNHZXRGb3JlaWduUGF0aHMo UGxhbm5lckluZm8gKnJvb3QsCiAJCQkJCWNvbnRpbnVlOwogCiAJCQkJLyogU2VlIGlmIGl0IGlz IHNhZmUgdG8gc2VuZCB0byByZW1vdGUgKi8KLQkJCQlpZiAoIWlzX2ZvcmVpZ25fZXhwcihyb290 LCBiYXNlcmVsLCByaW5mby0+Y2xhdXNlKSkKKwkJCQlpZiAoIWlzX2ZvcmVpZ25fZXhwcihyb290 LCBiYXNlcmVsLCBmcGluZm8sIHJpbmZvLT5jbGF1c2UpKQogCQkJCQljb250aW51ZTsKIAogCQkJ CS8qIENhbGN1bGF0ZSByZXF1aXJlZCBvdXRlciByZWxzIGZvciB0aGUgcmVzdWx0aW5nIHBhdGgg Ki8KQEAgLTE1MTMsNyArMTU0Miw3IEBAIHBvc3RncmVzR2V0Rm9yZWlnblBsYW4oUGxhbm5lcklu Zm8gKnJvb3QsCiAJCQkJcmVtb3RlX2V4cHJzID0gbGFwcGVuZChyZW1vdGVfZXhwcnMsIHJpbmZv LT5jbGF1c2UpOwogCQkJZWxzZSBpZiAobGlzdF9tZW1iZXJfcHRyKGZwaW5mby0+bG9jYWxfY29u ZHMsIHJpbmZvKSkKIAkJCQlsb2NhbF9leHBycyA9IGxhcHBlbmQobG9jYWxfZXhwcnMsIHJpbmZv LT5jbGF1c2UpOwotCQkJZWxzZSBpZiAoaXNfZm9yZWlnbl9leHByKHJvb3QsIGZvcmVpZ25yZWws IHJpbmZvLT5jbGF1c2UpKQorCQkJZWxzZSBpZiAoaXNfZm9yZWlnbl9leHByKHJvb3QsIGZvcmVp Z25yZWwsIGZwaW5mbywgcmluZm8tPmNsYXVzZSkpCiAJCQkJcmVtb3RlX2V4cHJzID0gbGFwcGVu ZChyZW1vdGVfZXhwcnMsIHJpbmZvLT5jbGF1c2UpOwogCQkJZWxzZQogCQkJCWxvY2FsX2V4cHJz ID0gbGFwcGVuZChsb2NhbF9leHBycywgcmluZm8tPmNsYXVzZSk7CkBAIC0xNjM0LDkgKzE2NjMs MjYgQEAgcG9zdGdyZXNHZXRGb3JlaWduUGxhbihQbGFubmVySW5mbyAqcm9vdCwKIAlmZHdfcHJp dmF0ZSA9IGxpc3RfbWFrZTMobWFrZVN0cmluZyhzcWwuZGF0YSksCiAJCQkJCQkJIHJldHJpZXZl ZF9hdHRycywKIAkJCQkJCQkgbWFrZUludGVnZXIoZnBpbmZvLT5mZXRjaF9zaXplKSk7CisKKwkv KgorCSAqIFBvc2l0aW9uIEZkd1NjYW5Qcml2YXRlUmVsYXRpb25zOiBlaXRoZXIgdGhlIEVYUExB SU4gcmVsYXRpb24gc3RyaW5nCisJICogKGpvaW5zL3VwcGVyIHJlbHMpIG9yIGEgTlVMTCBwbGFj ZWhvbGRlciwgc28gdGhhdCBzdWJzZXF1ZW50IGluZGV4ZXMKKwkgKiBzdGF5IHZhbGlkIGZvciB0 aGUgYmFzZS1yZWwgc2NhbiBjYXNlLgorCSAqLwogCWlmIChJU19KT0lOX1JFTChmb3JlaWducmVs KSB8fCBJU19VUFBFUl9SRUwoZm9yZWlnbnJlbCkpCiAJCWZkd19wcml2YXRlID0gbGFwcGVuZChm ZHdfcHJpdmF0ZSwKIAkJCQkJCQkgIG1ha2VTdHJpbmcoZnBpbmZvLT5yZWxhdGlvbl9uYW1lKSk7 CisJZWxzZQorCQlmZHdfcHJpdmF0ZSA9IGxhcHBlbmQoZmR3X3ByaXZhdGUsIE5VTEwpOworCisJ LyoKKwkgKiBGZHdTY2FuUHJpdmF0ZUZ1bmN0aW9ucyAvIEZkd1NjYW5Qcml2YXRlTWluUlRJbmRl eCBjYXJyeSB0aGUgbWV0YWRhdGEKKwkgKiB0aGUgZXhlY3V0b3IgbmVlZHMgdG8gcmVidWlsZCBU dXBsZURlc2MgZW50cmllcyBmb3Igd2hvbGUtcm93IFZhcnMKKwkgKiBwb2ludGluZyBhdCBSVEVf RlVOQ1RJT04gcmVscyBhYnNvcmJlZCBpbnRvIHRoZSBmb3JlaWduIHNjYW4uCisJICovCisJZmR3 X3ByaXZhdGUgPSBsYXBwZW5kKGZkd19wcml2YXRlLCBnZXRfZnVuY3Rpb25zX2RhdGEocm9vdCwg Zm9yZWlnbnJlbCkpOworCWZkd19wcml2YXRlID0gbGFwcGVuZChmZHdfcHJpdmF0ZSwKKwkJCQkJ CSAgbWFrZUludGVnZXIoZ2V0X21pbl9iYXNlX3J0aShyb290LCBmb3JlaWducmVsKSkpOwogCiAJ LyoKIAkgKiBDcmVhdGUgdGhlIEZvcmVpZ25TY2FuIG5vZGUgZm9yIHRoZSBnaXZlbiByZWxhdGlv bi4KQEAgLTE2NTcsOSArMTcwMywxNSBAQCBwb3N0Z3Jlc0dldEZvcmVpZ25QbGFuKFBsYW5uZXJJ bmZvICpyb290LAogCiAvKgogICogQ29uc3RydWN0IGEgdHVwbGUgZGVzY3JpcHRvciBmb3IgdGhl IHNjYW4gdHVwbGVzIGhhbmRsZWQgYnkgYSBmb3JlaWduIGpvaW4uCisgKgorICogJ3J0ZnVuY2Rh dGEnIGlzIHRoZSBGZHdTY2FuUHJpdmF0ZUZ1bmN0aW9ucyBsaXN0IHNhdmVkIGF0IHBsYW4gdGlt ZSwgYW5kCisgKiAncnRvZmZzZXQnIGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGV4ZWN1 dG9yJ3MgUlQgaW5kZXhlcyBhbmQgdGhlCisgKiBzY2FuLWxvY2FsIFJUIGluZGV4ZXMgY2FwdHVy ZWQgaW4gdGhhdCBsaXN0LiAgQm90aCBtYXkgYmUgMC9OSUwgd2hlbiB0aGUKKyAqIHNjYW4gaGFz IG5vIFJURV9GVU5DVElPTiBkZXBlbmRlbnRzLgogICovCiBzdGF0aWMgVHVwbGVEZXNjCi1nZXRf dHVwZGVzY19mb3Jfam9pbl9zY2FuX3R1cGxlcyhGb3JlaWduU2NhblN0YXRlICpub2RlKQorZ2V0 X3R1cGRlc2NfZm9yX2pvaW5fc2Nhbl90dXBsZXMoRm9yZWlnblNjYW5TdGF0ZSAqbm9kZSwKKwkJ CQkJCQkJIExpc3QgKnJ0ZnVuY2RhdGEsIGludCBydG9mZnNldCkKIHsKIAlGb3JlaWduU2NhbiAq ZnNwbGFuID0gKEZvcmVpZ25TY2FuICopIG5vZGUtPnNzLnBzLnBsYW47CiAJRVN0YXRlCSAgICpl c3RhdGUgPSBub2RlLT5zcy5wcy5zdGF0ZTsKQEAgLTE2OTUsMTMgKzE3NDcsNjcgQEAgZ2V0X3R1 cGRlc2NfZm9yX2pvaW5fc2Nhbl90dXBsZXMoRm9yZWlnblNjYW5TdGF0ZSAqbm9kZSkKIAkJaWYg KCFJc0EodmFyLCBWYXIpIHx8IHZhci0+dmFyYXR0bm8gIT0gMCkKIAkJCWNvbnRpbnVlOwogCQly dGUgPSBsaXN0X250aChlc3RhdGUtPmVzX3JhbmdlX3RhYmxlLCB2YXItPnZhcm5vIC0gMSk7Ci0J CWlmIChydGUtPnJ0ZWtpbmQgIT0gUlRFX1JFTEFUSU9OKQotCQkJY29udGludWU7Ci0JCXJlbHR5 cGUgPSBnZXRfcmVsX3R5cGVfaWQocnRlLT5yZWxpZCk7Ci0JCWlmICghT2lkSXNWYWxpZChyZWx0 eXBlKSkKLQkJCWNvbnRpbnVlOwotCQlhdHQtPmF0dHR5cGlkID0gcmVsdHlwZTsKLQkJLyogc2hv dWxkbid0IG5lZWQgdG8gY2hhbmdlIGFueXRoaW5nIGVsc2UgKi8KKworCQlpZiAocnRlLT5ydGVr aW5kID09IFJURV9SRUxBVElPTikKKwkJeworCQkJcmVsdHlwZSA9IGdldF9yZWxfdHlwZV9pZChy dGUtPnJlbGlkKTsKKwkJCWlmICghT2lkSXNWYWxpZChyZWx0eXBlKSkKKwkJCQljb250aW51ZTsK KwkJCWF0dC0+YXR0dHlwaWQgPSByZWx0eXBlOworCQkJLyogc2hvdWxkbid0IG5lZWQgdG8gY2hh bmdlIGFueXRoaW5nIGVsc2UgKi8KKwkJfQorCQllbHNlIGlmIChydGUtPnJ0ZWtpbmQgPT0gUlRF X0ZVTkNUSU9OKQorCQl7CisJCQkvKgorCQkJICogQSB3aG9sZS1yb3cgVmFyIHBvaW50cyBhdCBh IEZVTkNUSU9OIFJURSBhYnNvcmJlZCBpbnRvIHRoZQorCQkJICogZm9yZWlnbiBqb2luLiAgU3lu dGhlc2l6ZSBhbiBhbm9ueW1vdXMgY29tcG9zaXRlIFR1cGxlRGVzYyBmcm9tCisJCQkgKiB0aGUg cGVyLWZ1bmN0aW9uIHJldHVybi10eXBlIG1ldGFkYXRhIHdlIHNhdmVkIGF0IHBsYW4gdGltZTsK KwkJCSAqIHRoZSBkZXBhcnNlciBlbWl0cyB0aGVzZSBhcyBST1coZjxydGk+LmMxLCBmPHJ0aT4u YzIsIC4uLikuCisJCQkgKgorCQkJICogRm9yIGFuIHVwcGVycmVsIHNjYW4gKHRoZSBvbmx5IHBh dGggdGhhdCByZWFjaGVzIGhlcmUpCisJCQkgKiBwb3N0Z3Jlc0dldEZvcmVpZ25QbGFuIGFsd2F5 cyBidWlsZHMgcnRmdW5jZGF0YSB2aWEKKwkJCSAqIGdldF9mdW5jdGlvbnNfZGF0YSgpLCBzbyBp dCBpcyBuZXZlciBOSUw7IHRoZSBwZXItUlRFIHNsb3QgZm9yCisJCQkgKiB0aGUgZnVuY3Rpb24g UlRFIHJlZmVyZW5jZWQgYnkgdGhpcyBWYXIgbXVzdCBsaWtld2lzZSBiZQorCQkJICogcG9wdWxh dGVkLgorCQkJICovCisJCQlMaXN0CSAgICpmdW5jZGF0YTsKKwkJCVR1cGxlRGVzYwlydGVfdHVw ZGVzYzsKKwkJCWludAkJCW51bV9mdW5jczsKKwkJCWludAkJCWF0dG51bTsKKwkJCUxpc3RDZWxs ICAgKmxjMSwKKwkJCQkJICAgKmxjMjsKKworCQkJQXNzZXJ0KHJ0ZnVuY2RhdGEgIT0gTklMKTsK KwkJCWZ1bmNkYXRhID0gbGlzdF9udGgocnRmdW5jZGF0YSwgdmFyLT52YXJubyAtIHJ0b2Zmc2V0 KTsKKwkJCUFzc2VydChmdW5jZGF0YSAhPSBOSUwpOworCQkJbnVtX2Z1bmNzID0gbGlzdF9sZW5n dGgoZnVuY2RhdGEpOworCQkJQXNzZXJ0KG51bV9mdW5jcyA9PSBsaXN0X2xlbmd0aChydGUtPmVy ZWYtPmNvbG5hbWVzKSk7CisJCQlydGVfdHVwZGVzYyA9IENyZWF0ZVRlbXBsYXRlVHVwbGVEZXNj KG51bV9mdW5jcyk7CisKKwkJCWF0dG51bSA9IDE7CisJCQlmb3Jib3RoKGxjMSwgZnVuY2RhdGEs IGxjMiwgcnRlLT5lcmVmLT5jb2xuYW1lcykKKwkJCXsKKwkJCQlMaXN0CSAgICpmZGF0YSA9IGxm aXJzdF9ub2RlKExpc3QsIGxjMSk7CisJCQkJY2hhcgkgICAqY29sbmFtZSA9IHN0clZhbChsZmly c3QobGMyKSk7CisJCQkJT2lkCQkJZnVuY3JldHR5cGU7CisJCQkJT2lkCQkJZnVuY2NvbGxhdGlv bjsKKworCQkJCWZ1bmNyZXR0eXBlID0gbHNlY29uZF9ub2RlKEludGVnZXIsIGZkYXRhKS0+aXZh bDsKKwkJCQlmdW5jY29sbGF0aW9uID0gbHRoaXJkX25vZGUoSW50ZWdlciwgZmRhdGEpLT5pdmFs OworCisJCQkJLyogZ2V0X2Z1bmN0aW9uc19kYXRhKCkgYWxyZWFkeSB2YWxpZGF0ZWQgdGhlIHJl dHVybiB0eXBlLiAqLworCQkJCUFzc2VydChPaWRJc1ZhbGlkKGZ1bmNyZXR0eXBlKSAmJiBmdW5j cmV0dHlwZSAhPSBSRUNPUkRPSUQpOworCisJCQkJVHVwbGVEZXNjSW5pdEVudHJ5KHJ0ZV90dXBk ZXNjLCAoQXR0ck51bWJlcikgYXR0bnVtLCBjb2xuYW1lLAorCQkJCQkJCQkgICBmdW5jcmV0dHlw ZSwgLTEsIDApOworCQkJCVR1cGxlRGVzY0luaXRFbnRyeUNvbGxhdGlvbihydGVfdHVwZGVzYywg KEF0dHJOdW1iZXIpIGF0dG51bSwKKwkJCQkJCQkJCQkJZnVuY2NvbGxhdGlvbik7CisJCQkJYXR0 bnVtKys7CisJCQl9CisKKwkJCWFzc2lnbl9yZWNvcmRfdHlwZV90eXBtb2QocnRlX3R1cGRlc2Mp OworCQkJYXR0LT5hdHR0eXBtb2QgPSBydGVfdHVwZGVzYy0+dGR0eXBtb2Q7CisJCX0KIAl9CiAJ cmV0dXJuIHR1cGRlc2M7CiB9CkBAIC0xNzM3LDE0ICsxODQzLDMwIEBAIHBvc3RncmVzQmVnaW5G b3JlaWduU2NhbihGb3JlaWduU2NhblN0YXRlICpub2RlLCBpbnQgZWZsYWdzKQogCiAJLyoKIAkg KiBJZGVudGlmeSB3aGljaCB1c2VyIHRvIGRvIHRoZSByZW1vdGUgYWNjZXNzIGFzLiAgVGhpcyBz aG91bGQgbWF0Y2ggd2hhdAotCSAqIEV4ZWNDaGVja1Blcm1pc3Npb25zKCkgZG9lcy4KKwkgKiBF eGVjQ2hlY2tQZXJtaXNzaW9ucygpIGRvZXMuICBGb3IgYSBqb2luLCBzY2FuIHRoZSBiYXNlIHJl bGlkcyB1bnRpbCB3ZQorCSAqIGZpbmQgYW4gUlRFX1JFTEFUSU9OICh0aGUgZm9yZWlnbi10YWJs ZSBzaWRlKTsgaWdub3JlIGFueSBSVEVfRlVOQ1RJT04KKwkgKiBhYnNvcmJlZCBpbnRvIHRoZSBq b2luLCB3aGljaCBjb250cmlidXRlcyBubyByZWxhdGlvbiBPSUQgdG8gbG9vayB1cC4KIAkgKi8K IAl1c2VyaWQgPSBPaWRJc1ZhbGlkKGZzcGxhbi0+Y2hlY2tBc1VzZXIpID8gZnNwbGFuLT5jaGVj a0FzVXNlciA6IEdldFVzZXJJZCgpOworCXJ0ZSA9IE5VTEw7CiAJaWYgKGZzcGxhbi0+c2Nhbi5z Y2FucmVsaWQgPiAwKQorCXsKIAkJcnRpbmRleCA9IGZzcGxhbi0+c2Nhbi5zY2FucmVsaWQ7CisJ CXJ0ZSA9IGV4ZWNfcnRfZmV0Y2gocnRpbmRleCwgZXN0YXRlKTsKKwl9CiAJZWxzZQotCQlydGlu ZGV4ID0gYm1zX25leHRfbWVtYmVyKGZzcGxhbi0+ZnNfYmFzZV9yZWxpZHMsIC0xKTsKLQlydGUg PSBleGVjX3J0X2ZldGNoKHJ0aW5kZXgsIGVzdGF0ZSk7CisJeworCQlydGluZGV4ID0gLTE7CisJ CXdoaWxlICgocnRpbmRleCA9IGJtc19uZXh0X21lbWJlcihmc3BsYW4tPmZzX2Jhc2VfcmVsaWRz LCBydGluZGV4KSkgPj0gMCkKKwkJeworCQkJcnRlID0gZXhlY19ydF9mZXRjaChydGluZGV4LCBl c3RhdGUpOworCQkJaWYgKHJ0ZSAhPSBOVUxMICYmIHJ0ZS0+cnRla2luZCA9PSBSVEVfUkVMQVRJ T04pCisJCQkJYnJlYWs7CisJCQlydGUgPSBOVUxMOworCQl9CisJCWlmIChydGUgPT0gTlVMTCkK KwkJCWVsb2coRVJST1IsICJjb3VsZCBub3QgbG9jYXRlIGEgZm9yZWlnbiByZWxhdGlvbiBSVEUg aW4gZm9yZWlnbiBzY2FuIik7CisJfQogCiAJLyogR2V0IGluZm8gYWJvdXQgZm9yZWlnbiB0YWJs ZS4gKi8KIAl0YWJsZSA9IEdldEZvcmVpZ25UYWJsZShydGUtPnJlbGlkKTsKQEAgLTE3ODcsOCAr MTkwOSwxOSBAQCBwb3N0Z3Jlc0JlZ2luRm9yZWlnblNjYW4oRm9yZWlnblNjYW5TdGF0ZSAqbm9k ZSwgaW50IGVmbGFncykKIAl9CiAJZWxzZQogCXsKKwkJTGlzdAkgICAqcnRmdW5jZGF0YSA9IChM aXN0ICopIGxpc3RfbnRoKGZzcGxhbi0+ZmR3X3ByaXZhdGUsCisJCQkJCQkJCQkJCQkgICBGZHdT Y2FuUHJpdmF0ZUZ1bmN0aW9ucyk7CisJCWludAkJCW1pbl9iYXNlX3J0aSA9IGludFZhbChsaXN0 X250aChmc3BsYW4tPmZkd19wcml2YXRlLAorCQkJCQkJCQkJCQkJICAgRmR3U2NhblByaXZhdGVN aW5SVEluZGV4KSk7CisJCWludAkJCXJ0b2Zmc2V0ID0gYm1zX25leHRfbWVtYmVyKGZzcGxhbi0+ ZnNfYmFzZV9yZWxpZHMsIC0xKSAtCisJCQltaW5fYmFzZV9ydGk7CisKKwkJQXNzZXJ0KG1pbl9i YXNlX3J0aSA+IDApOworCQlBc3NlcnQocnRvZmZzZXQgPj0gMCk7CisKIAkJZnNzdGF0ZS0+cmVs ID0gTlVMTDsKLQkJZnNzdGF0ZS0+dHVwZGVzYyA9IGdldF90dXBkZXNjX2Zvcl9qb2luX3NjYW5f dHVwbGVzKG5vZGUpOworCQlmc3N0YXRlLT50dXBkZXNjID0gZ2V0X3R1cGRlc2NfZm9yX2pvaW5f c2Nhbl90dXBsZXMobm9kZSwgcnRmdW5jZGF0YSwKKwkJCQkJCQkJCQkJCQkJCXJ0b2Zmc2V0KTsK IAl9CiAKIAlmc3N0YXRlLT5hdHRpbm1ldGEgPSBUdXBsZURlc2NHZXRBdHRJbk1ldGFkYXRhKGZz c3RhdGUtPnR1cGRlc2MpOwpAQCAtMjc0MSw3ICsyODc0LDcgQEAgcG9zdGdyZXNQbGFuRGlyZWN0 TW9kaWZ5KFBsYW5uZXJJbmZvICpyb290LAogCQkJaWYgKGF0dG5vIDw9IEludmFsaWRBdHRyTnVt YmVyKSAvKiBzaG91bGRuJ3QgaGFwcGVuICovCiAJCQkJZWxvZyhFUlJPUiwgInN5c3RlbS1jb2x1 bW4gdXBkYXRlIGlzIG5vdCBzdXBwb3J0ZWQiKTsKIAotCQkJaWYgKCFpc19mb3JlaWduX2V4cHIo cm9vdCwgZm9yZWlnbnJlbCwgKEV4cHIgKikgdGxlLT5leHByKSkKKwkJCWlmICghaXNfZm9yZWln bl9leHByKHJvb3QsIGZvcmVpZ25yZWwsIGZwaW5mbywgKEV4cHIgKikgdGxlLT5leHByKSkKIAkJ CQlyZXR1cm4gZmFsc2U7CiAJCX0KIAl9CkBAIC0yODI4LDYgKzI5NjEsMTAgQEAgcG9zdGdyZXNQ bGFuRGlyZWN0TW9kaWZ5KFBsYW5uZXJJbmZvICpyb290LAogCQkJCQkJCQkJbWFrZUJvb2xlYW4o KHJldHJpZXZlZF9hdHRycyAhPSBOSUwpKSwKIAkJCQkJCQkJCXJldHJpZXZlZF9hdHRycywKIAkJ CQkJCQkJCW1ha2VCb29sZWFuKHBsYW4tPmNhblNldFRhZykpOworCWZzY2FuLT5mZHdfcHJpdmF0 ZSA9IGxhcHBlbmQoZnNjYW4tPmZkd19wcml2YXRlLAorCQkJCQkJCQkgZ2V0X2Z1bmN0aW9uc19k YXRhKHJvb3QsIGZvcmVpZ25yZWwpKTsKKwlmc2Nhbi0+ZmR3X3ByaXZhdGUgPSBsYXBwZW5kKGZz Y2FuLT5mZHdfcHJpdmF0ZSwKKwkJCQkJCQkJIG1ha2VJbnRlZ2VyKGdldF9taW5fYmFzZV9ydGko cm9vdCwgZm9yZWlnbnJlbCkpKTsKIAogCS8qCiAJICogVXBkYXRlIHRoZSBmb3JlaWduLWpvaW4t cmVsYXRlZCBmaWVsZHMuCkBAIC0yOTQxLDcgKzMwNzgsMjYgQEAgcG9zdGdyZXNCZWdpbkRpcmVj dE1vZGlmeShGb3JlaWduU2NhblN0YXRlICpub2RlLCBpbnQgZWZsYWdzKQogCQlUdXBsZURlc2MJ dHVwZGVzYzsKIAogCQlpZiAoZnNwbGFuLT5zY2FuLnNjYW5yZWxpZCA9PSAwKQotCQkJdHVwZGVz YyA9IGdldF90dXBkZXNjX2Zvcl9qb2luX3NjYW5fdHVwbGVzKG5vZGUpOworCQl7CisJCQkvKgor CQkJICogRGlyZWN0TW9kaWZ5IG9uIGEgZm9yZWlnbiBqb2luOiB1c2UgdGhlIHBlci1SVEUgZnVu Y3Rpb24KKwkJCSAqIG1ldGFkYXRhIHNhdmVkIGF0IHBsYW4gdGltZSBzbyBhIHdob2xlLXJvdyBW YXIgcG9pbnRpbmcgYXQgYQorCQkJICogZnVuY3Rpb24gUlRFIGFic29yYmVkIGludG8gdGhlIGpv aW4gY2FuIGJlIHJlYnVpbHQgaW50byBhCisJCQkgKiB1c2FibGUgVHVwbGVEZXNjIChlLmcuIFJF VFVSTklORyB0IGZvciBhIGpvaW4gd2l0aCBVTk5FU1QoLi4uLAorCQkJICogLi4uKSBBUyB0KGJ4 LCBpKSkuCisJCQkgKi8KKwkJCUxpc3QJICAgKnJ0ZnVuY2RhdGEgPSAoTGlzdCAqKSBsaXN0X250 aChmc3BsYW4tPmZkd19wcml2YXRlLAorCQkJCQkJCQkJCQkJCSAgIEZkd0RpcmVjdE1vZGlmeVBy aXZhdGVGdW5jdGlvbnMpOworCQkJaW50CQkJbWluX2Jhc2VfcnRpID0gaW50VmFsKGxpc3RfbnRo KGZzcGxhbi0+ZmR3X3ByaXZhdGUsCisJCQkJCQkJCQkJCQkJICAgRmR3RGlyZWN0TW9kaWZ5UHJp dmF0ZU1pblJUSW5kZXgpKTsKKwkJCWludAkJCXJ0b2Zmc2V0ID0gYm1zX25leHRfbWVtYmVyKGZz cGxhbi0+ZnNfYmFzZV9yZWxpZHMsIC0xKSAtCisJCQkJbWluX2Jhc2VfcnRpOworCisJCQlBc3Nl cnQobWluX2Jhc2VfcnRpID4gMCk7CisJCQlBc3NlcnQocnRvZmZzZXQgPj0gMCk7CisKKwkJCXR1 cGRlc2MgPSBnZXRfdHVwZGVzY19mb3Jfam9pbl9zY2FuX3R1cGxlcyhub2RlLCBydGZ1bmNkYXRh LCBydG9mZnNldCk7CisJCX0KIAkJZWxzZQogCQkJdHVwZGVzYyA9IFJlbGF0aW9uR2V0RGVzY3Io ZG1zdGF0ZS0+cmVsKTsKIApAQCAtMzA1NCw3ICszMjEwLDggQEAgcG9zdGdyZXNFeHBsYWluRm9y ZWlnblNjYW4oRm9yZWlnblNjYW5TdGF0ZSAqbm9kZSwgRXhwbGFpblN0YXRlICplcykKIAkgKiBX ZSBkbyB0aGF0IGhlcmUsIG5vdCB3aGVuIHRoZSBwbGFuIGlzIGNyZWF0ZWQsIGJlY2F1c2Ugd2Ug Y2FuJ3Qga25vdwogCSAqIHdoYXQgYWxpYXNlcyBydWxldXRpbHMuYyB3aWxsIGFzc2lnbiBhdCBw bGFuIGNyZWF0aW9uIHRpbWUuCiAJICovCi0JaWYgKGxpc3RfbGVuZ3RoKGZkd19wcml2YXRlKSA+ IEZkd1NjYW5Qcml2YXRlUmVsYXRpb25zKQorCWlmIChsaXN0X2xlbmd0aChmZHdfcHJpdmF0ZSkg PiBGZHdTY2FuUHJpdmF0ZVJlbGF0aW9ucyAmJgorCQlsaXN0X250aChmZHdfcHJpdmF0ZSwgRmR3 U2NhblByaXZhdGVSZWxhdGlvbnMpICE9IE5VTEwpCiAJewogCQlTdHJpbmdJbmZvRGF0YSByZWxh dGlvbnM7CiAJCWNoYXIJICAgKnJhd3JlbGF0aW9uczsKQEAgLTMxMDQsMjUgKzMyNjEsOTAgQEAg cG9zdGdyZXNFeHBsYWluRm9yZWlnblNjYW4oRm9yZWlnblNjYW5TdGF0ZSAqbm9kZSwgRXhwbGFp blN0YXRlICplcykKIAkJCQlydGkgKz0gcnRvZmZzZXQ7CiAJCQkJQXNzZXJ0KGJtc19pc19tZW1i ZXIocnRpLCBwbGFuLT5mc19iYXNlX3JlbGlkcykpOwogCQkJCXJ0ZSA9IHJ0X2ZldGNoKHJ0aSwg ZXMtPnJ0YWJsZSk7Ci0JCQkJQXNzZXJ0KHJ0ZS0+cnRla2luZCA9PSBSVEVfUkVMQVRJT04pOwot CQkJCS8qIFRoaXMgbG9naWMgc2hvdWxkIGFncmVlIHdpdGggZXhwbGFpbi5jJ3MgRXhwbGFpblRh cmdldFJlbCAqLwotCQkJCXJlbG5hbWUgPSBnZXRfcmVsX25hbWUocnRlLT5yZWxpZCk7Ci0JCQkJ aWYgKGVzLT52ZXJib3NlKQotCQkJCXsKLQkJCQkJY2hhcgkgICAqbmFtZXNwYWNlOwogCi0JCQkJ CW5hbWVzcGFjZSA9IGdldF9uYW1lc3BhY2VfbmFtZV9vcl90ZW1wKGdldF9yZWxfbmFtZXNwYWNl KHJ0ZS0+cmVsaWQpKTsKLQkJCQkJYXBwZW5kU3RyaW5nSW5mbygmcmVsYXRpb25zLCAiJXMuJXMi LAotCQkJCQkJCQkJIHF1b3RlX2lkZW50aWZpZXIobmFtZXNwYWNlKSwKLQkJCQkJCQkJCSBxdW90 ZV9pZGVudGlmaWVyKHJlbG5hbWUpKTsKKwkJCQlpZiAocnRlLT5ydGVraW5kID09IFJURV9GVU5D VElPTikKKwkJCQl7CisJCQkJCUxpc3QJICAgKnJ0ZnVuY2RhdGEgPSBsaXN0X250aChmZHdfcHJp dmF0ZSwgRmR3U2NhblByaXZhdGVGdW5jdGlvbnMpOworCQkJCQlMaXN0CSAgICpmdW5jZGF0YTsK KwkJCQkJYm9vbAkJbXVsdGlfZnVuYzsKKwkJCQkJYm9vbAkJZmlyc3QgPSB0cnVlOworCQkJCQlM aXN0Q2VsbCAgICpsYzsKKworCQkJCQlmdW5jZGF0YSA9IGxpc3RfbnRoKHJ0ZnVuY2RhdGEsIHJ0 aSAtIHJ0b2Zmc2V0KTsKKworCQkJCQltdWx0aV9mdW5jID0gbGlzdF9sZW5ndGgoZnVuY2RhdGEp ID4gMTsKKworCQkJCQlpZiAobXVsdGlfZnVuYykKKwkJCQkJCWFwcGVuZFN0cmluZ0luZm9TdHJp bmcoJnJlbGF0aW9ucywgIlJPV1MgRlJPTSAoIik7CisKKwkJCQkJZm9yZWFjaChsYywgZnVuY2Rh dGEpCisJCQkJCXsKKwkJCQkJCUxpc3QJICAgKmZ1bmNpbmZvOworCQkJCQkJT2lkCQkJZnVuY2lk OworCisKKwkJCQkJCWlmICghZmlyc3QpCisJCQkJCQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZygm cmVsYXRpb25zLCAiLCAiKTsKKworCQkJCQkJZnVuY2luZm8gPSAoTGlzdCAqKSBsZmlyc3QobGMp OworCisJCQkJCQlmdW5jaWQgPSBsaW5pdGlhbF9ub2RlKEludGVnZXIsIGZ1bmNpbmZvKS0+aXZh bDsKKwkJCQkJCS8qIENoZWNrZWQgYnkgZnVuY3Rpb25fcnRlX3B1c2hkb3duX29rKCkgKi8KKwkJ CQkJCUFzc2VydChPaWRJc1ZhbGlkKGZ1bmNpZCkpOworCisJCQkJCQkvKiBNYXRjaCBSVEVfUkVM QVRJT04gYmVoYXZpb3IgKi8KKwkJCQkJCXJlbG5hbWUgPSBnZXRfZnVuY19uYW1lKGZ1bmNpZCk7 CisJCQkJCQlpZiAocmVsbmFtZSA9PSBOVUxMKQorCQkJCQkJCWVsb2coRVJST1IsICJjYWNoZSBs b29rdXAgZmFpbGVkIGZvciBmdW5jdGlvbiAldSIsIGZ1bmNpZCk7CisJCQkJCQlpZiAoZXMtPnZl cmJvc2UpCisJCQkJCQl7CisJCQkJCQkJY2hhcgkgICAqbmFtZXNwYWNlOworCQkJCQkJCU9pZAkJ CW5zb2lkID0gZ2V0X2Z1bmNfbmFtZXNwYWNlKGZ1bmNpZCk7CisKKwkJCQkJCQluYW1lc3BhY2Ug PSBnZXRfbmFtZXNwYWNlX25hbWUobnNvaWQpOworCQkJCQkJCWlmIChuYW1lc3BhY2UgPT0gTlVM TCkKKwkJCQkJCQkJZWxvZyhFUlJPUiwgImNhY2hlIGxvb2t1cCBmYWlsZWQgZm9yIG5hbWVzcGFj ZSAldSIsIG5zb2lkKTsKKworCQkJCQkJCWFwcGVuZFN0cmluZ0luZm8oJnJlbGF0aW9ucywgIiVz LiVzKCkiLAorCQkJCQkJCQkJCQkgcXVvdGVfaWRlbnRpZmllcihuYW1lc3BhY2UpLAorCQkJCQkJ CQkJCQkgcXVvdGVfaWRlbnRpZmllcihyZWxuYW1lKSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJ CQkJCQkJYXBwZW5kU3RyaW5nSW5mbygmcmVsYXRpb25zLCAiJXMoKSIsIHF1b3RlX2lkZW50aWZp ZXIocmVsbmFtZSkpOworCisJCQkJCQlmaXJzdCA9IGZhbHNlOworCQkJCQl9CisJCQkJCS8qIENs b3NlIFJPV1MgRlJPTSAqLworCQkJCQlpZiAobXVsdGlfZnVuYykKKwkJCQkJCWFwcGVuZFN0cmlu Z0luZm9DaGFyKCZyZWxhdGlvbnMsICcpJyk7CiAJCQkJfQogCQkJCWVsc2UKLQkJCQkJYXBwZW5k U3RyaW5nSW5mb1N0cmluZygmcmVsYXRpb25zLAotCQkJCQkJCQkJCSAgIHF1b3RlX2lkZW50aWZp ZXIocmVsbmFtZSkpOworCQkJCXsKKwkJCQkJQXNzZXJ0KHJ0ZS0+cnRla2luZCA9PSBSVEVfUkVM QVRJT04pOworCisJCQkJCS8qCisJCQkJCSAqIFRoaXMgbG9naWMgc2hvdWxkIGFncmVlIHdpdGgg ZXhwbGFpbi5jJ3MKKwkJCQkJICogRXhwbGFpblRhcmdldFJlbAorCQkJCQkgKi8KKwkJCQkJcmVs bmFtZSA9IGdldF9yZWxfbmFtZShydGUtPnJlbGlkKTsKKwkJCQkJaWYgKGVzLT52ZXJib3NlKQor CQkJCQl7CisJCQkJCQljaGFyCSAgICpuYW1lc3BhY2U7CisKKwkJCQkJCW5hbWVzcGFjZSA9IGdl dF9uYW1lc3BhY2VfbmFtZV9vcl90ZW1wKGdldF9yZWxfbmFtZXNwYWNlKHJ0ZS0+cmVsaWQpKTsK KwkJCQkJCWFwcGVuZFN0cmluZ0luZm8oJnJlbGF0aW9ucywgIiVzLiVzIiwKKwkJCQkJCQkJCQkg cXVvdGVfaWRlbnRpZmllcihuYW1lc3BhY2UpLAorCQkJCQkJCQkJCSBxdW90ZV9pZGVudGlmaWVy KHJlbG5hbWUpKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCQlhcHBlbmRTdHJpbmdJbmZvU3Ry aW5nKCZyZWxhdGlvbnMsCisJCQkJCQkJCQkJCSAgIHF1b3RlX2lkZW50aWZpZXIocmVsbmFtZSkp OworCQkJCX0KKwogCQkJCXJlZm5hbWUgPSAoY2hhciAqKSBsaXN0X250aChlcy0+cnRhYmxlX25h bWVzLCBydGkgLSAxKTsKIAkJCQlpZiAocmVmbmFtZSA9PSBOVUxMKQogCQkJCQlyZWZuYW1lID0g cnRlLT5lcmVmLT5hbGlhc25hbWU7Ci0JCQkJaWYgKHN0cmNtcChyZWZuYW1lLCByZWxuYW1lKSAh PSAwKQorCQkJCWlmIChyZWxuYW1lID09IE5VTEwgfHwgc3RyY21wKHJlZm5hbWUsIHJlbG5hbWUp ICE9IDApCiAJCQkJCWFwcGVuZFN0cmluZ0luZm8oJnJlbGF0aW9ucywgIiAlcyIsCiAJCQkJCQkJ CQkgcXVvdGVfaWRlbnRpZmllcihyZWZuYW1lKSk7CiAJCQl9CkBAIC0zMzQ2LDcgKzM1NjgsNyBA QCBlc3RpbWF0ZV9wYXRoX2Nvc3Rfc2l6ZShQbGFubmVySW5mbyAqcm9vdCwKIAkJICogcGFyYW1f am9pbl9jb25kcyBtaWdodCBjb250YWluIGJvdGggY2xhdXNlcyB0aGF0IGFyZSBzYWZlIHRvIHNl bmQKIAkJICogYWNyb3NzLCBhbmQgY2xhdXNlcyB0aGF0IGFyZW4ndC4KIAkJICovCi0JCWNsYXNz aWZ5Q29uZGl0aW9ucyhyb290LCBmb3JlaWducmVsLCBwYXJhbV9qb2luX2NvbmRzLAorCQljbGFz c2lmeUNvbmRpdGlvbnMocm9vdCwgZm9yZWlnbnJlbCwgZnBpbmZvLCBwYXJhbV9qb2luX2NvbmRz LAogCQkJCQkJICAgJnJlbW90ZV9wYXJhbV9qb2luX2NvbmRzLCAmbG9jYWxfcGFyYW1fam9pbl9j b25kcyk7CiAKIAkJLyogQnVpbGQgdGhlIGxpc3Qgb2YgY29sdW1ucyB0byBiZSBmZXRjaGVkIGZy b20gdGhlIGZvcmVpZ24gc2VydmVyLiAqLwpAQCAtMzQ3OSw4ICszNzAxLDE3IEBAIGVzdGltYXRl X3BhdGhfY29zdF9zaXplKFBsYW5uZXJJbmZvICpyb290LAogCQkJLyogRm9yIGpvaW4gd2UgZXhw ZWN0IGlubmVyIGFuZCBvdXRlciByZWxhdGlvbnMgc2V0ICovCiAJCQlBc3NlcnQoZnBpbmZvLT5p bm5lcnJlbCAmJiBmcGluZm8tPm91dGVycmVsKTsKIAotCQkJZnBpbmZvX2kgPSAoUGdGZHdSZWxh dGlvbkluZm8gKikgZnBpbmZvLT5pbm5lcnJlbC0+ZmR3X3ByaXZhdGU7Ci0JCQlmcGluZm9fbyA9 IChQZ0Zkd1JlbGF0aW9uSW5mbyAqKSBmcGluZm8tPm91dGVycmVsLT5mZHdfcHJpdmF0ZTsKKwkJ CS8qCisJCQkgKiBGb3IgYSBGVU5DVElPTiBSVEUgYWJzb3JiZWQgaW50byB0aGUgam9pbiwgdXNl IHRoZSBzdHViIGZwaW5mbworCQkJICogd2UgYnVpbHQgaW4gZm9yZWlnbl9qb2luX29rKCksIHNp bmNlIHRoZSBmdW5jdGlvbiByZWwgaXRzZWxmCisJCQkgKiBoYXMgbm8gZmR3X3ByaXZhdGUuCisJ CQkgKi8KKwkJCWZwaW5mb19pID0gZnBpbmZvLT5pbm5lcl9mdW5jX2ZwaW5mbyA/CisJCQkJZnBp bmZvLT5pbm5lcl9mdW5jX2ZwaW5mbyA6CisJCQkJKFBnRmR3UmVsYXRpb25JbmZvICopIGZwaW5m by0+aW5uZXJyZWwtPmZkd19wcml2YXRlOworCQkJZnBpbmZvX28gPSBmcGluZm8tPm91dGVyX2Z1 bmNfZnBpbmZvID8KKwkJCQlmcGluZm8tPm91dGVyX2Z1bmNfZnBpbmZvIDoKKwkJCQkoUGdGZHdS ZWxhdGlvbkluZm8gKikgZnBpbmZvLT5vdXRlcnJlbC0+ZmR3X3ByaXZhdGU7CiAKIAkJCS8qIEVz dGltYXRlIG9mIG51bWJlciBvZiByb3dzIGluIGNyb3NzIHByb2R1Y3QgKi8KIAkJCW5yb3dzID0g ZnBpbmZvX2ktPnJvd3MgKiBmcGluZm9fby0+cm93czsKQEAgLTY2MTksNiArNjg1MCwyMDUgQEAg c2VtaWpvaW5fdGFyZ2V0X29rKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpqb2lucmVs LCBSZWxPcHRJbmZvICpvdXRlcnJlbCwKIAlyZXR1cm4gb2s7CiB9CiAKKy8qCisgKiBnZXRfYmFz ZV9yZWxpZHMKKyAqCQlSZXR1cm4gdGhlIHNldCBvZiBiYXNlIHJlbGlkcyByZWZlcmVuY2VkIGJ5 IGEgZm9yZWlnbiBzY2FuIHJlbC4KKyAqCisgKiBGb3IgYW4gdXBwZXIgcmVsIHdlIHVzZSB0aGUg YWxsLXF1ZXJ5IHJlbGlkcyBtaW51cyB0aGUgb3V0ZXIgam9pbnM7CisgKiBvdGhlcndpc2UgdGhl IHJlbCdzIG93biByZWxpZHMgbWludXMgdGhlIG91dGVyIGpvaW5zLiAgVGhlIHJlc3VsdCBtYXRj aGVzCisgKiB0aGUgcmVsaWRzIHRoYXQgY3JlYXRlX2ZvcmVpZ25zY2FuX3BsYW4oKSB1bHRpbWF0 ZWx5IHVzZXMgZm9yCisgKiBGb3JlaWduU2Nhbi5mc19iYXNlX3JlbGlkcywgc28gaXQgaXMgc3Vp dGFibGUgZm9yIGFueSB0YWdnaW5nIHdlIHdhbnQgdG8KKyAqIHN0b3JlIHZpYSBwbGFuLXByaXZh dGUgc3RhdGUuCisgKi8KK3N0YXRpYyBSZWxpZHMKK2dldF9iYXNlX3JlbGlkcyhQbGFubmVySW5m byAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsKQoreworCVJlbGlkcwkJcmVsaWRzOworCisJaWYgKHJl bC0+cmVsb3B0a2luZCA9PSBSRUxPUFRfVVBQRVJfUkVMKQorCQlyZWxpZHMgPSByb290LT5hbGxf cXVlcnlfcmVsczsKKwllbHNlCisJCXJlbGlkcyA9IHJlbC0+cmVsaWRzOworCisJcmV0dXJuIGJt c19kaWZmZXJlbmNlKHJlbGlkcywgcm9vdC0+b3V0ZXJfam9pbl9yZWxzKTsKK30KKworLyoKKyAq IGdldF9taW5fYmFzZV9ydGkKKyAqCQlMb3dlc3QgYmFzZSBSVCBpbmRleCBpbiB0aGUgZm9yZWln biBzY2FuIHJlbC4KKyAqCisgKiBBZnRlciBzZXRyZWZzLmMgZmxhdHRlbnMgdGhlIHJ0YWJsZSwg dGhlIHNjYW4tbG9jYWwgaW5kZXhlcyBzYXZlZCBpbgorICogcGxhbi1wcml2YXRlIGRhdGEgY2Fu IGJlIHRyYW5zbGF0ZWQgdG8gZXN0YXRlIGluZGV4ZXMgYnkgYWRkaW5nCisgKiAoRm9yZWlnblNj YW4uZnNfYmFzZV9yZWxpZHMgbWluIC0gdGhpcyB2YWx1ZSkuICBDYXB0dXJlZCBhdCBwbGFuIHRp bWUKKyAqIGJlY2F1c2UgY3JlYXRlX2ZvcmVpZ25zY2FuX3BsYW4oKSBjb21wdXRlcyB0aGUgc2Ft ZSB2YWx1ZSBpbnRlcm5hbGx5LgorICovCitzdGF0aWMgaW50CitnZXRfbWluX2Jhc2VfcnRpKFBs YW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwpCit7CisJUmVsaWRzCQlyZWxpZHMgPSBn ZXRfYmFzZV9yZWxpZHMocm9vdCwgcmVsKTsKKworCXJldHVybiBibXNfbmV4dF9tZW1iZXIocmVs aWRzLCAtMSk7Cit9CisKKy8qCisgKiBnZXRfZnVuY3Rpb25zX2RhdGEKKyAqCQlCdWlsZCB0aGUg cGVyLVJURSBmdW5jdGlvbiBtZXRhZGF0YSBsaXN0IHNhdmVkIGFzCisgKgkJRmR3U2NhblByaXZh dGVGdW5jdGlvbnMuCisgKgorICogVGhlIHJlc3VsdCBsaXN0IGlzIGluZGV4ZWQgYnkgYmFzZSBS VCBpbmRleCByZWxhdGl2ZSB0byB0aGUgbG93ZXN0IGJhc2UKKyAqIFJUIGluZGV4IG9mIHRoZSBz Y2FuLiAgRWFjaCBlbGVtZW50IGlzIGVpdGhlciBOVUxMIChmb3Igbm9uLVJURV9GVU5DVElPTgor ICogYmFzZSByZWxzIGluIHRoaXMgc2Nhbikgb3IgYSBMaXN0IG9mIExpc3Qgb2YgdHdvIEludGVn ZXIgbm9kZXM6CisgKiAoZnVuY3JldHR5cGUsIGZ1bmNjb2xsYXRpb24pIC0tIG9uZSBpbm5lciBs aXN0IHBlciBSYW5nZVRibEZ1bmN0aW9uLgorICoKKyAqIE9ubHkgUlRFX0ZVTkNUSU9OIHJlbGlk cyBhY3R1YWxseSBhcHBlYXJpbmcgaW4gdGhlIGZvcmVpZ24gc2NhbidzCisgKiBmc19iYXNlX3Jl bGlkcyBjb250cmlidXRlOyBvdGhlcnMgYXJlIHBsYWNlaG9sZGVycyBzbyB0aGF0IHRoZSBjb25z dW1lcgorICogY2FuIGluZGV4IGludG8gdGhlIHJlc3VsdCBieSBSVEkgb2Zmc2V0LgorICovCitz dGF0aWMgTGlzdCAqCitnZXRfZnVuY3Rpb25zX2RhdGEoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9w dEluZm8gKnJlbCkKK3sKKwlMaXN0CSAgICpydGZ1bmNkYXRhID0gTklMOworCVJlbGlkcwkJZnNj YW5fcmVsaWRzID0gZ2V0X2Jhc2VfcmVsaWRzKHJvb3QsIHJlbCk7CisJaW50CQkJaTsKKworCWZv ciAoaSA9IDA7IGkgPCByb290LT5zaW1wbGVfcmVsX2FycmF5X3NpemU7IGkrKykKKwl7CisJCVJh bmdlVGJsRW50cnkgKnJ0ZSA9IHJvb3QtPnNpbXBsZV9ydGVfYXJyYXlbaV07CisJCUxpc3QJICAg KmZ1bmNkYXRhID0gTklMOworCQlMaXN0Q2VsbCAgICpsYzsKKworCQlpZiAocnRlID09IE5VTEwg fHwgaSA9PSAwIHx8CisJCQkhYm1zX2lzX21lbWJlcihpLCBmc2Nhbl9yZWxpZHMpIHx8CisJCQly dGUtPnJ0ZWtpbmQgIT0gUlRFX0ZVTkNUSU9OKQorCQl7CisJCQlydGZ1bmNkYXRhID0gbGFwcGVu ZChydGZ1bmNkYXRhLCBOVUxMKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZm9yZWFjaChsYywg cnRlLT5mdW5jdGlvbnMpCisJCXsKKwkJCVJhbmdlVGJsRnVuY3Rpb24gKnJ0ZnVuYyA9IChSYW5n ZVRibEZ1bmN0aW9uICopIGxmaXJzdChsYyk7CisJCQlPaWQJCQlmdW5jcmV0dHlwZTsKKwkJCU9p ZAkJCWZ1bmNjb2xsYXRpb247CisJCQlUdXBsZURlc2MJdHVwZGVzYzsKKwkJCU9pZAkJCWZ1bmNp ZDsKKworCQkJZ2V0X2V4cHJfcmVzdWx0X3R5cGUocnRmdW5jLT5mdW5jZXhwciwgJmZ1bmNyZXR0 eXBlLCAmdHVwZGVzYyk7CisKKwkJCS8qCisJCQkgKiBmdW5jdGlvbl9ydGVfcHVzaGRvd25fb2so KSBhbHJlYWR5IHJlamVjdGVkIGFueSBmdW5jdGlvbiB0aGF0CisJCQkgKiBkb2Vzbid0IHJldHVy biBhIHdlbGwtZGVmaW5lZCBzY2FsYXIgdHlwZSwgc28gdGhpcyBpcyBhIG1lcmUKKwkJCSAqIGNy b3NzLWNoZWNrLgorCQkJICovCisJCQlBc3NlcnQoT2lkSXNWYWxpZChmdW5jcmV0dHlwZSkgJiYg ZnVuY3JldHR5cGUgIT0gUkVDT1JET0lEKTsKKworCQkJZnVuY2NvbGxhdGlvbiA9IGV4cHJDb2xs YXRpb24ocnRmdW5jLT5mdW5jZXhwcik7CisKKwkJCWZ1bmNpZCA9ICgoRnVuY0V4cHIgKikgcnRm dW5jLT5mdW5jZXhwciktPmZ1bmNpZDsKKworCQkJZnVuY2RhdGEgPSBsYXBwZW5kKGZ1bmNkYXRh LAorCQkJCQkJCSAgIGxpc3RfbWFrZTMobWFrZUludGVnZXIoZnVuY2lkKSwKKwkJCQkJCQkJCQkg IG1ha2VJbnRlZ2VyKGZ1bmNyZXR0eXBlKSwKKwkJCQkJCQkJCQkgIG1ha2VJbnRlZ2VyKGZ1bmNj b2xsYXRpb24pKSk7CisJCX0KKworCQlydGZ1bmNkYXRhID0gbGFwcGVuZChydGZ1bmNkYXRhLCBm dW5jZGF0YSk7CisJfQorCisJcmV0dXJuIHJ0ZnVuY2RhdGE7Cit9CisKKy8qCisgKiBDaGVjayBp ZiBhIHJlbGF0aW9uIGlzIGEgRlVOQ1RJT04gUlRFIHRoYXQgY2FuIGJlIGFic29yYmVkIGludG8g YSByZW1vdGUKKyAqIGpvaW4uICBFdmVyeSBmdW5jdGlvbiBpbiB0aGUgUlRFIG11c3QKKyAqCisg KiAgIC0gcmV0dXJuIGEgd2VsbC1kZWZpbmVkIHNjYWxhciB0eXBlIC0tIHdlIGRvbid0IHNoaXAg cmVjb3Jkcy9jb21wb3NpdGUKKyAqICAgICBzaW5jZSB0aGUgcmVtb3RlIHNlcnZlciBjYW5ub3Qg cmVjb25zdHJ1Y3QgYSBjb2x1bW4gZGVmaW5pdGlvbiBsaXN0CisgKiAgICAgYW5kIG91ciBkZXBh cnNlciBkb2VzIG5vdCBlbWl0IG9uZTsKKyAqICAgLSBoYXZlIGEgc2hpcHBhYmxlIGV4cHJlc3Np b24gd2l0aCBubyBtdXRhYmxlIHN1Ym5vZGVzIC0tIGlzX2ZvcmVpZ25fZXhwcigpCisgKiAgICAg cmVqZWN0cyB2b2xhdGlsZS9zdGFibGUgZnVuY3Rpb25zIHRocm91Z2ggY29udGFpbl9tdXRhYmxl X2Z1bmN0aW9ucygpLAorICogICAgIHNvIHRoZSBJTU1VVEFCTEUtb25seSByZXN0cmljdGlvbiBp cyBpbXBsaWNpdDsKKyAqICAgLSBub3QgY29udGFpbiBTdWJQbGFucyAtLSB3ZSdkIG90aGVyd2lz ZSBuZWVkIHRvIHNoaXAgc3ViLXJlc3VsdHMgdG8KKyAqICAgICB0aGUgcmVtb3RlLCB3aGljaCB3 ZSBkbyBub3QgaW1wbGVtZW50LgorICoKKyAqIFdJVEggT1JESU5BTElUWSBpcyBub3Qgc3VwcG9y dGVkIHlldC4KKyAqLworc3RhdGljIGJvb2wKK2Z1bmN0aW9uX3J0ZV9wdXNoZG93bl9vayhQbGFu bmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAorCQkJCQkJIFJlbE9wdEluZm8gKmZkd3Jl bCkKK3sKKwlSYW5nZVRibEVudHJ5ICpydGU7CisJTGlzdENlbGwgICAqbGM7CisKKwlpZiAocmVs LT5ydGVraW5kICE9IFJURV9GVU5DVElPTikKKwkJcmV0dXJuIGZhbHNlOworCXJ0ZSA9IHBsYW5u ZXJfcnRfZmV0Y2gocmVsLT5yZWxpZCwgcm9vdCk7CisKKwkvKgorCSAqIGJ1aWxkX3NpbXBsZV9y ZWwoKSBjb3BpZXMgcnRla2luZCBzdHJhaWdodCBmcm9tIHRoZSBSVEUsIHNvIGZvciBhIGJhc2UK KwkgKiByZWwgcmVsLT5ydGVraW5kIGFsd2F5cyBtYXRjaGVzIHRoZSBSVEUnczsgdGhlIGNoZWNr IGFib3ZlIGlzIHRoZXJlZm9yZQorCSAqIHN1ZmZpY2llbnQuCisJICovCisJQXNzZXJ0KHJ0ZS0+ cnRla2luZCA9PSBSVEVfRlVOQ1RJT04pOworCisJaWYgKHJ0ZS0+ZnVuY29yZGluYWxpdHkpCisJ CXJldHVybiBmYWxzZTsKKworCS8qCisJICogUmVqZWN0IHVwLWZyb250IGFueSBmdW5jdGlvbiBS VEUgdGhhdCBsYXRlcmFsLXJlZmVyZW5jZXMgYW5vdGhlcgorCSAqIHJlbGF0aW9uOiBmb3JlaWdu LWpvaW4gcHVzaC1kb3duIHdvdWxkIG5lZWQgdG8gcGFyYW1ldGVyaXNlIHRoZSByZW1vdGUKKwkg KiBxdWVyeSBwZXIgb3V0ZXIgcm93LCB3aGljaCB3ZSBkb24ndCBzdXBwb3J0LCBhbmQgZXZlbiBj b25zaWRlcmluZyB0aGUKKwkgKiBwYXRoIGlzIGV4cGVuc2l2ZSBvbiB0aGUgcGxhbm5lciBzaWRl LiAgVGhlIHN1cnJvdW5kaW5nIGxhdGVyYWxfcmVsaWRzCisJICogY2hlY2sgaW4gcG9zdGdyZXNH ZXRGb3JlaWduSm9pblBhdGhzKCkgd291bGQgbm9ybWFsbHkgYmFpbCBvdXQgZm9yIHRoZQorCSAq IGpvaW5yZWwsIGJ1dCBkb2luZyB0aGUgY2hlY2sgaGVyZSBhdm9pZHMgd2Fsa2luZyB0aGUgZnVu Y3Rpb24KKwkgKiBleHByZXNzaW9uIGVudGlyZWx5LgorCSAqCisJICogTm90ZSB0aGlzIHJlamVj dHMgb25seSBsYXRlcmFsIHJlZmVyZW5jZXMgdG8gYW5vdGhlciByZWxhdGlvbiBhdCB0aGUKKwkg KiBzYW1lIHF1ZXJ5IGxldmVsLiAgQSBmdW5jdGlvbiBhcmd1bWVudCByZWZlcmVuY2luZyBhbiBv dXRlciBxdWVyeSBsZXZlbAorCSAqIChlLmcuIGYob3V0ZXIuY29sKSBpbnNpZGUgYSBzdWJxdWVy eSkgaXMgYSBkaWZmZXJlbnQgY2FzZTogaXQgYmVjb21lcyBhCisJICogUEFSQU1fRVhFQyBQYXJh bSwgdGhlIGZ1bmN0aW9uIHJlbCdzIGxhdGVyYWxfcmVsaWRzIGlzIGVtcHR5LCBhbmQKKwkgKiBm b3JlaWduX2V4cHJfd2Fsa2VyKCkgaW50ZW50aW9uYWxseSB0cmVhdHMgUEFSQU1fRVhFQyBhcyBz aGlwcGFibGUuIFRoZQorCSAqIHJlbW90ZSBxdWVyeSB0aGVuIGNhcnJpZXMgYSBwYXJhbWV0ZXIg cGxhY2Vob2xkZXIsIGFuZCBwb3N0Z3Jlc19mZHcncworCSAqIG9yZGluYXJ5IHBhcmFtZXRlciBt YWNoaW5lcnkgcmUtc2VuZHMgaXQgb24gZWFjaCByZXNjYW4gLS0gaS5lLiBpdAorCSAqIHdvcmtz IGFzIGEgbm9ybWFsIHBhcmFtZXRlcml6ZWQgZm9yZWlnbiBzY2FuLCB3aGljaCBpcyBmaW5lLgor CSAqLworCWlmICghYm1zX2lzX2VtcHR5KHJlbC0+bGF0ZXJhbF9yZWxpZHMpKQorCQlyZXR1cm4g ZmFsc2U7CisKKwlBc3NlcnQobGlzdF9sZW5ndGgocnRlLT5mdW5jdGlvbnMpID49IDEpOworCisJ Zm9yZWFjaChsYywgcnRlLT5mdW5jdGlvbnMpCisJeworCQlSYW5nZVRibEZ1bmN0aW9uICpydGZ1 bmMgPSAoUmFuZ2VUYmxGdW5jdGlvbiAqKSBsZmlyc3QobGMpOworCQlUeXBlRnVuY0NsYXNzIGZ1 bmN0eXBjbGFzczsKKwkJT2lkCQkJZnVuY3JldHR5cGU7CisJCVR1cGxlRGVzYwl0dXBkZXNjOwor CisJCS8qIFJlZnVzZSB0byBkZWFsIHdpdGggc3RyYW5nZSBmdW5jZXhwcnMgKi8KKwkJaWYgKCFJ c0EocnRmdW5jLT5mdW5jZXhwciwgRnVuY0V4cHIpKQorCQkJcmV0dXJuIGZhbHNlOworCisJCWlm ICghT2lkSXNWYWxpZCgoKEZ1bmNFeHByICopIHJ0ZnVuYy0+ZnVuY2V4cHIpLT5mdW5jaWQpKQor CQkJcmV0dXJuIGZhbHNlOworCisJCWZ1bmN0eXBjbGFzcyA9IGdldF9leHByX3Jlc3VsdF90eXBl KHJ0ZnVuYy0+ZnVuY2V4cHIsCisJCQkJCQkJCQkJCSZmdW5jcmV0dHlwZSwgJnR1cGRlc2MpOwor CQlpZiAoZnVuY3R5cGNsYXNzICE9IFRZUEVGVU5DX1NDQUxBUikKKwkJCXJldHVybiBmYWxzZTsK KwkJaWYgKCFPaWRJc1ZhbGlkKGZ1bmNyZXR0eXBlKSB8fAorCQkJZnVuY3JldHR5cGUgPT0gUkVD T1JET0lEIHx8CisJCQlmdW5jcmV0dHlwZSA9PSBWT0lET0lEKQorCQkJcmV0dXJuIGZhbHNlOwor CisJCWlmIChjb250YWluX3N1YnBsYW5zKHJ0ZnVuYy0+ZnVuY2V4cHIpKQorCQkJcmV0dXJuIGZh bHNlOworCQlpZiAoIWlzX2ZvcmVpZ25fZXhwcihyb290LCBmZHdyZWwsIGZkd3JlbC0+ZmR3X3By aXZhdGUsIChFeHByICopIHJ0ZnVuYy0+ZnVuY2V4cHIpKQorCQkJcmV0dXJuIGZhbHNlOworCX0K KworCXJldHVybiB0cnVlOworfQorCiAvKgogICogQXNzZXNzIHdoZXRoZXIgdGhlIGpvaW4gYmV0 d2VlbiBpbm5lciBhbmQgb3V0ZXIgcmVsYXRpb25zIGNhbiBiZSBwdXNoZWQgZG93bgogICogdG8g dGhlIGZvcmVpZ24gc2VydmVyLiBBcyBhIHNpZGUgZWZmZWN0LCBzYXZlIGluZm9ybWF0aW9uIHdl IG9idGFpbiBpbiB0aGlzCkBAIC02NjM0LDYgKzcwNjQsOCBAQCBmb3JlaWduX2pvaW5fb2soUGxh bm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKmpvaW5yZWwsIEpvaW5UeXBlIGpvaW50eXBlLAog CVBnRmR3UmVsYXRpb25JbmZvICpmcGluZm9faTsKIAlMaXN0Q2VsbCAgICpsYzsKIAlMaXN0CSAg ICpqb2luY2xhdXNlczsKKwlib29sCQlvdXRlcl9pc19mdW5jdGlvbiA9IGZhbHNlOworCWJvb2wJ CWlubmVyX2lzX2Z1bmN0aW9uID0gZmFsc2U7CiAKIAkvKgogCSAqIFdlIHN1cHBvcnQgcHVzaGlu ZyBkb3duIElOTkVSLCBMRUZULCBSSUdIVCwgRlVMTCBPVVRFUiBhbmQgU0VNSSBqb2lucy4KQEAg LTY2NTIsMTUgKzcwODQsODYgQEAgZm9yZWlnbl9qb2luX29rKFBsYW5uZXJJbmZvICpyb290LCBS ZWxPcHRJbmZvICpqb2lucmVsLCBKb2luVHlwZSBqb2ludHlwZSwKIAkJcmV0dXJuIGZhbHNlOwog CiAJLyoKLQkgKiBJZiBlaXRoZXIgb2YgdGhlIGpvaW5pbmcgcmVsYXRpb25zIGlzIG1hcmtlZCBh cyB1bnNhZmUgdG8gcHVzaGRvd24sIHRoZQotCSAqIGpvaW4gY2FuIG5vdCBiZSBwdXNoZWQgZG93 bi4KKwkgKiBEZXRlY3QgbWl4ZWQgKGZvcmVpZ24geCBmdW5jdGlvbi1SVEUpIGNhc2VzLiAgT25s eSBJTk5FUiBqb2lucyBhcmUKKwkgKiBzdXBwb3J0ZWQgaW5pdGlhbGx5LiAgV2UgZGlzcGF0Y2gg b24gcnRla2luZCBoZXJlIHNvIHRoYXQgdGhlIHNhbWUKKwkgKiBmdW5jdGlvbiBSVEUgY2FuIGJl IGFic29yYmVkIGludG8gam9pbnMgb24gbXVsdGlwbGUgZm9yZWlnbiBzZXJ2ZXJzCisJICogKGVh Y2ggY2FsbCBnZXRzIGl0cyBvd24gc3R1YiBmcGluZm8gYW5kIHJlY2hlY2tzIHNoaXBwYWJpbGl0 eSBmb3IgdGhlCisJICogc3BlY2lmaWMgc2VydmVyKS4KIAkgKi8KIAlmcGluZm8gPSAoUGdGZHdS ZWxhdGlvbkluZm8gKikgam9pbnJlbC0+ZmR3X3ByaXZhdGU7Ci0JZnBpbmZvX28gPSAoUGdGZHdS ZWxhdGlvbkluZm8gKikgb3V0ZXJyZWwtPmZkd19wcml2YXRlOwotCWZwaW5mb19pID0gKFBnRmR3 UmVsYXRpb25JbmZvICopIGlubmVycmVsLT5mZHdfcHJpdmF0ZTsKLQlpZiAoIWZwaW5mb19vIHx8 ICFmcGluZm9fby0+cHVzaGRvd25fc2FmZSB8fAotCQkhZnBpbmZvX2kgfHwgIWZwaW5mb19pLT5w dXNoZG93bl9zYWZlKQotCQlyZXR1cm4gZmFsc2U7CisJaWYgKGpvaW50eXBlID09IEpPSU5fSU5O RVIgJiYgaW5uZXJyZWwtPnJ0ZWtpbmQgPT0gUlRFX0ZVTkNUSU9OICYmCisJCShmcGluZm9fbyA9 IChQZ0Zkd1JlbGF0aW9uSW5mbyAqKSBvdXRlcnJlbC0+ZmR3X3ByaXZhdGUpICYmCisJCWZwaW5m b19vLT5wdXNoZG93bl9zYWZlICYmCisJCWZ1bmN0aW9uX3J0ZV9wdXNoZG93bl9vayhyb290LCBp bm5lcnJlbCwgb3V0ZXJyZWwpKQorCXsKKwkJaW5uZXJfaXNfZnVuY3Rpb24gPSB0cnVlOworCX0K KwllbHNlIGlmIChqb2ludHlwZSA9PSBKT0lOX0lOTkVSICYmIG91dGVycmVsLT5ydGVraW5kID09 IFJURV9GVU5DVElPTiAmJgorCQkJIChmcGluZm9faSA9IChQZ0Zkd1JlbGF0aW9uSW5mbyAqKSBp bm5lcnJlbC0+ZmR3X3ByaXZhdGUpICYmCisJCQkgZnBpbmZvX2ktPnB1c2hkb3duX3NhZmUgJiYK KwkJCSBmdW5jdGlvbl9ydGVfcHVzaGRvd25fb2socm9vdCwgb3V0ZXJyZWwsIGlubmVycmVsKSkK Kwl7CisJCW91dGVyX2lzX2Z1bmN0aW9uID0gdHJ1ZTsKKwl9CisJZWxzZQorCXsKKwkJZnBpbmZv X28gPSAoUGdGZHdSZWxhdGlvbkluZm8gKikgb3V0ZXJyZWwtPmZkd19wcml2YXRlOworCQlmcGlu Zm9faSA9IChQZ0Zkd1JlbGF0aW9uSW5mbyAqKSBpbm5lcnJlbC0+ZmR3X3ByaXZhdGU7CisJCWlm ICghZnBpbmZvX28gfHwgIWZwaW5mb19vLT5wdXNoZG93bl9zYWZlIHx8CisJCQkhZnBpbmZvX2kg fHwgIWZwaW5mb19pLT5wdXNoZG93bl9zYWZlKQorCQkJcmV0dXJuIGZhbHNlOworCX0KKworCS8q CisJICogSWYgb25lIHNpZGUgaXMgYSBmdW5jdGlvbiBSVEUsIGFsbG9jYXRlIGEgc3R1YiBmcGlu Zm8gc28gdGhlIHJlc3Qgb2YKKwkgKiB0aGlzIGZ1bmN0aW9uIGFuZCB0aGUgY29zdCBlc3RpbWF0 b3IgY2FuIHRyZWF0IGl0IHVuaWZvcm1seS4gIFdlIGhhbmQKKwkgKiB0aGUgc3R1YiB0byB0aGUg am9pbnJlbCdzIGRlcGFyc2VyIHZpYSB0aGUgc2FtZSBwYXRoIHRoZSBmb3JlaWduIHNpZGUKKwkg KiB1c2VzLCBidXQgd2UgbmV2ZXIgcGVybWFuZW50bHkgYXR0YWNoIGl0IHRvIHRoZSBmdW5jdGlv biByZWwncworCSAqIGZkd19wcml2YXRlIChkaWZmZXJlbnQgam9pbnJlbHMgbWF5IHBhaXIgdGhl IHNhbWUgZnVuY3Rpb24gUlRFIHdpdGgKKwkgKiBkaWZmZXJlbnQgZm9yZWlnbiBzZXJ2ZXJzKS4K KwkgKi8KKwlpZiAoaW5uZXJfaXNfZnVuY3Rpb24pCisJeworCQlmcGluZm9faSA9IHBhbGxvYzBf b2JqZWN0KFBnRmR3UmVsYXRpb25JbmZvKTsKKwkJZnBpbmZvX2ktPnB1c2hkb3duX3NhZmUgPSB0 cnVlOworCQlmcGluZm9faS0+c2VydmVyID0gZnBpbmZvX28tPnNlcnZlcjsKKwkJZnBpbmZvX2kt PnNoaXBwYWJsZV9leHRlbnNpb25zID0gZnBpbmZvX28tPnNoaXBwYWJsZV9leHRlbnNpb25zOwor CQlmcGluZm9faS0+cmVsYXRpb25fbmFtZSA9IHBzcHJpbnRmKCIldSIsIGlubmVycmVsLT5yZWxp ZCk7CisJCWZwaW5mb19pLT5yb3dzID0gaW5uZXJyZWwtPnJvd3M7CisJCWZwaW5mb19pLT53aWR0 aCA9IGlubmVycmVsLT5yZWx0YXJnZXQtPndpZHRoOworCQlmcGluZm9faS0+cmV0cmlldmVkX3Jv d3MgPSBpbm5lcnJlbC0+cm93czsKKwkJZnBpbmZvX2ktPnJlbF9zdGFydHVwX2Nvc3QgPSAwOwor CQlmcGluZm9faS0+cmVsX3RvdGFsX2Nvc3QgPSAwOworCisJCS8qCisJCSAqIENsYXNzaWZ5IHRo ZSBmdW5jdGlvbiByZWwncyBvd24gYmFzZXJlc3RyaWN0aW5mbyBub3csIHNvIHRoYXQgdGhlCisJ CSAqIGxvY2FsX2NvbmRzIGNoZWNrIGJlbG93IGNhbiBiYWlsIG91dCBpZiBhbnkgb2YgaXQgaXMg dW5zaGlwcGFibGUuCisJCSAqIFdlIGNsYXNzaWZ5IGFnYWluc3QgdGhlIHN0dWIsIG5vdCB0aGUg am9pbnJlbCdzIGZwaW5mbywgYmVjYXVzZSB0aGUKKwkJICogbGF0dGVyJ3Mgc2VydmVyL3NoaXBw YWJsZV9leHRlbnNpb25zIGFyZW4ndCBwb3B1bGF0ZWQgdW50aWwKKwkJICogbWVyZ2VfZmR3X29w dGlvbnMoKSBydW5zIGZ1cnRoZXIgZG93bi4KKwkJICovCisJCWNsYXNzaWZ5Q29uZGl0aW9ucyhy b290LCBpbm5lcnJlbCwgZnBpbmZvX2ksIGlubmVycmVsLT5iYXNlcmVzdHJpY3RpbmZvLAorCQkJ CQkJICAgJmZwaW5mb19pLT5yZW1vdGVfY29uZHMsICZmcGluZm9faS0+bG9jYWxfY29uZHMpOwor CQlmcGluZm8tPmlubmVyX2Z1bmNfZnBpbmZvID0gZnBpbmZvX2k7CisJfQorCWVsc2UgaWYgKG91 dGVyX2lzX2Z1bmN0aW9uKQorCXsKKwkJZnBpbmZvX28gPSBwYWxsb2MwX29iamVjdChQZ0Zkd1Jl bGF0aW9uSW5mbyk7CisJCWZwaW5mb19vLT5wdXNoZG93bl9zYWZlID0gdHJ1ZTsKKwkJZnBpbmZv X28tPnNlcnZlciA9IGZwaW5mb19pLT5zZXJ2ZXI7CisJCWZwaW5mb19vLT5zaGlwcGFibGVfZXh0 ZW5zaW9ucyA9IGZwaW5mb19pLT5zaGlwcGFibGVfZXh0ZW5zaW9uczsKKwkJZnBpbmZvX28tPnJl bGF0aW9uX25hbWUgPSBwc3ByaW50ZigiJXUiLCBvdXRlcnJlbC0+cmVsaWQpOworCQlmcGluZm9f by0+cm93cyA9IG91dGVycmVsLT5yb3dzOworCQlmcGluZm9fby0+d2lkdGggPSBvdXRlcnJlbC0+ cmVsdGFyZ2V0LT53aWR0aDsKKwkJZnBpbmZvX28tPnJldHJpZXZlZF9yb3dzID0gb3V0ZXJyZWwt PnJvd3M7CisJCWZwaW5mb19vLT5yZWxfc3RhcnR1cF9jb3N0ID0gMDsKKwkJZnBpbmZvX28tPnJl bF90b3RhbF9jb3N0ID0gMDsKKworCQkvKiBTZWUgdGhlIGNvbW1lbnQgaW4gdGhlIGlubmVyX2lz X2Z1bmN0aW9uIGJyYW5jaCBhYm92ZS4gKi8KKwkJY2xhc3NpZnlDb25kaXRpb25zKHJvb3QsIG91 dGVycmVsLCBmcGluZm9fbywgb3V0ZXJyZWwtPmJhc2VyZXN0cmljdGluZm8sCisJCQkJCQkgICAm ZnBpbmZvX28tPnJlbW90ZV9jb25kcywgJmZwaW5mb19vLT5sb2NhbF9jb25kcyk7CisJCWZwaW5m by0+b3V0ZXJfZnVuY19mcGluZm8gPSBmcGluZm9fbzsKKwl9CiAKIAkvKgogCSAqIElmIGpvaW5p bmcgcmVsYXRpb25zIGhhdmUgbG9jYWwgY29uZGl0aW9ucywgdGhvc2UgY29uZGl0aW9ucyBhcmUK QEAgLTY2OTgsNyArNzIwMSw3IEBAIGZvcmVpZ25fam9pbl9vayhQbGFubmVySW5mbyAqcm9vdCwg UmVsT3B0SW5mbyAqam9pbnJlbCwgSm9pblR5cGUgam9pbnR5cGUsCiAJZm9yZWFjaChsYywgZXh0 cmEtPnJlc3RyaWN0bGlzdCkKIAl7CiAJCVJlc3RyaWN0SW5mbyAqcmluZm8gPSBsZmlyc3Rfbm9k ZShSZXN0cmljdEluZm8sIGxjKTsKLQkJYm9vbAkJaXNfcmVtb3RlX2NsYXVzZSA9IGlzX2ZvcmVp Z25fZXhwcihyb290LCBqb2lucmVsLAorCQlib29sCQlpc19yZW1vdGVfY2xhdXNlID0gaXNfZm9y ZWlnbl9leHByKHJvb3QsIGpvaW5yZWwsIGZwaW5mbywKIAkJCQkJCQkJCQkJCQkgICByaW5mby0+ Y2xhdXNlKTsKIAogCQlpZiAoSVNfT1VURVJfSk9JTihqb2ludHlwZSkgJiYKQEAgLTczOTYsNyAr Nzg5OSw3IEBAIGZvcmVpZ25fZ3JvdXBpbmdfb2soUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdElu Zm8gKmdyb3VwZWRfcmVsLAogCQkJICogSWYgYW55IEdST1VQIEJZIGV4cHJlc3Npb24gaXMgbm90 IHNoaXBwYWJsZSwgdGhlbiB3ZSBjYW5ub3QKIAkJCSAqIHB1c2ggZG93biBhZ2dyZWdhdGlvbiB0 byB0aGUgZm9yZWlnbiBzZXJ2ZXIuCiAJCQkgKi8KLQkJCWlmICghaXNfZm9yZWlnbl9leHByKHJv b3QsIGdyb3VwZWRfcmVsLCBleHByKSkKKwkJCWlmICghaXNfZm9yZWlnbl9leHByKHJvb3QsIGdy b3VwZWRfcmVsLCBmcGluZm8sIGV4cHIpKQogCQkJCXJldHVybiBmYWxzZTsKIAogCQkJLyoKQEAg LTc0MjQsNyArNzkyNyw3IEBAIGZvcmVpZ25fZ3JvdXBpbmdfb2soUGxhbm5lckluZm8gKnJvb3Qs IFJlbE9wdEluZm8gKmdyb3VwZWRfcmVsLAogCQkJICogTm9uLWdyb3VwaW5nIGV4cHJlc3Npb24g d2UgbmVlZCB0byBjb21wdXRlLiAgQ2FuIHdlIHNoaXAgaXQKIAkJCSAqIGFzLWlzIHRvIHRoZSBm b3JlaWduIHNlcnZlcj8KIAkJCSAqLwotCQkJaWYgKGlzX2ZvcmVpZ25fZXhwcihyb290LCBncm91 cGVkX3JlbCwgZXhwcikgJiYKKwkJCWlmIChpc19mb3JlaWduX2V4cHIocm9vdCwgZ3JvdXBlZF9y ZWwsIGZwaW5mbywgZXhwcikgJiYKIAkJCQkhaXNfZm9yZWlnbl9wYXJhbShyb290LCBncm91cGVk X3JlbCwgZXhwcikpCiAJCQl7CiAJCQkJLyogWWVzLCBzbyBhZGQgdG8gdGxpc3QgYXMtaXM7IE9L IHRvIHN1cHByZXNzIGR1cGxpY2F0ZXMgKi8KQEAgLTc0NDQsNyArNzk0Nyw3IEBAIGZvcmVpZ25f Z3JvdXBpbmdfb2soUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKmdyb3VwZWRfcmVsLAog CQkJCSAqIGRvbid0IGhhdmUgdG8gY2hlY2sgaXNfZm9yZWlnbl9wYXJhbSwgc2luY2UgdGhhdCBj ZXJ0YWlubHkKIAkJCQkgKiB3b24ndCByZXR1cm4gdHJ1ZSBmb3IgYW55IHN1Y2ggZXhwcmVzc2lv bi4pCiAJCQkJICovCi0JCQkJaWYgKCFpc19mb3JlaWduX2V4cHIocm9vdCwgZ3JvdXBlZF9yZWws IChFeHByICopIGFnZ3ZhcnMpKQorCQkJCWlmICghaXNfZm9yZWlnbl9leHByKHJvb3QsIGdyb3Vw ZWRfcmVsLCBmcGluZm8sIChFeHByICopIGFnZ3ZhcnMpKQogCQkJCQlyZXR1cm4gZmFsc2U7CiAK IAkJCQkvKgpAQCAtNzQ5Niw3ICs3OTk5LDcgQEAgZm9yZWlnbl9ncm91cGluZ19vayhQbGFubmVy SW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqZ3JvdXBlZF9yZWwsCiAJCQkJCQkJCQkgIGdyb3VwZWRf cmVsLT5yZWxpZHMsCiAJCQkJCQkJCQkgIE5VTEwsCiAJCQkJCQkJCQkgIE5VTEwpOwotCQkJaWYg KGlzX2ZvcmVpZ25fZXhwcihyb290LCBncm91cGVkX3JlbCwgZXhwcikpCisJCQlpZiAoaXNfZm9y ZWlnbl9leHByKHJvb3QsIGdyb3VwZWRfcmVsLCBmcGluZm8sIGV4cHIpKQogCQkJCWZwaW5mby0+ cmVtb3RlX2NvbmRzID0gbGFwcGVuZChmcGluZm8tPnJlbW90ZV9jb25kcywgcmluZm8pOwogCQkJ ZWxzZQogCQkJCWZwaW5mby0+bG9jYWxfY29uZHMgPSBsYXBwZW5kKGZwaW5mby0+bG9jYWxfY29u ZHMsIHJpbmZvKTsKQEAgLTc1MzMsNyArODAzNiw3IEBAIGZvcmVpZ25fZ3JvdXBpbmdfb2soUGxh bm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKmdyb3VwZWRfcmVsLAogCQkJICovCiAJCQlpZiAo SXNBKGV4cHIsIEFnZ3JlZikpCiAJCQl7Ci0JCQkJaWYgKCFpc19mb3JlaWduX2V4cHIocm9vdCwg Z3JvdXBlZF9yZWwsIGV4cHIpKQorCQkJCWlmICghaXNfZm9yZWlnbl9leHByKHJvb3QsIGdyb3Vw ZWRfcmVsLCBmcGluZm8sIGV4cHIpKQogCQkJCQlyZXR1cm4gZmFsc2U7CiAKIAkJCQl0bGlzdCA9 IGFkZF90b19mbGF0X3RsaXN0KHRsaXN0LCBsaXN0X21ha2UxKGV4cHIpKTsKQEAgLTgwNDYsOCAr ODU0OSw4IEBAIGFkZF9mb3JlaWduX2ZpbmFsX3BhdGhzKFBsYW5uZXJJbmZvICpyb290LCBSZWxP cHRJbmZvICppbnB1dF9yZWwsCiAJICogQWxzbywgdGhlIExJTUlUL09GRlNFVCBjYW5ub3QgYmUg cHVzaGVkIGRvd24sIGlmIHRoZWlyIGV4cHJlc3Npb25zIGFyZQogCSAqIG5vdCBzYWZlIHRvIHJl bW90ZS4KIAkgKi8KLQlpZiAoIWlzX2ZvcmVpZ25fZXhwcihyb290LCBpbnB1dF9yZWwsIChFeHBy ICopIHBhcnNlLT5saW1pdE9mZnNldCkgfHwKLQkJIWlzX2ZvcmVpZ25fZXhwcihyb290LCBpbnB1 dF9yZWwsIChFeHByICopIHBhcnNlLT5saW1pdENvdW50KSkKKwlpZiAoIWlzX2ZvcmVpZ25fZXhw cihyb290LCBpbnB1dF9yZWwsIGlmcGluZm8sIChFeHByICopIHBhcnNlLT5saW1pdE9mZnNldCkg fHwKKwkJIWlzX2ZvcmVpZ25fZXhwcihyb290LCBpbnB1dF9yZWwsIGlmcGluZm8sIChFeHByICop IHBhcnNlLT5saW1pdENvdW50KSkKIAkJcmV0dXJuOwogCiAJLyogU2FmZSB0byBwdXNoIGRvd24g Ki8KQEAgLTg2OTMsNyArOTE5Niw3IEBAIGZpbmRfZW1fZm9yX3JlbChQbGFubmVySW5mbyAqcm9v dCwgRXF1aXZhbGVuY2VDbGFzcyAqZWMsIFJlbE9wdEluZm8gKnJlbCkKIAkJaWYgKGJtc19pc19z dWJzZXQoZW0tPmVtX3JlbGlkcywgcmVsLT5yZWxpZHMpICYmCiAJCQkhYm1zX2lzX2VtcHR5KGVt LT5lbV9yZWxpZHMpICYmCiAJCQlibXNfaXNfZW1wdHkoYm1zX2ludGVyc2VjdChlbS0+ZW1fcmVs aWRzLCBmcGluZm8tPmhpZGRlbl9zdWJxdWVyeV9yZWxzKSkgJiYKLQkJCWlzX2ZvcmVpZ25fZXhw cihyb290LCByZWwsIGVtLT5lbV9leHByKSkKKwkJCWlzX2ZvcmVpZ25fZXhwcihyb290LCByZWws IGZwaW5mbywgZW0tPmVtX2V4cHIpKQogCQkJcmV0dXJuIGVtOwogCX0KIApAQCAtODcxNSw2ICs5 MjE4LDcgQEAgRXF1aXZhbGVuY2VNZW1iZXIgKgogZmluZF9lbV9mb3JfcmVsX3RhcmdldChQbGFu bmVySW5mbyAqcm9vdCwgRXF1aXZhbGVuY2VDbGFzcyAqZWMsCiAJCQkJCSAgIFJlbE9wdEluZm8g KnJlbCkKIHsKKwlQZ0Zkd1JlbGF0aW9uSW5mbyAqZnBpbmZvID0gKFBnRmR3UmVsYXRpb25JbmZv ICopIHJlbC0+ZmR3X3ByaXZhdGU7CiAJUGF0aFRhcmdldCAqdGFyZ2V0ID0gcmVsLT5yZWx0YXJn ZXQ7CiAJTGlzdENlbGwgICAqbGMxOwogCWludAkJCWk7CkBAIC04NzY0LDcgKzkyNjgsNyBAQCBm aW5kX2VtX2Zvcl9yZWxfdGFyZ2V0KFBsYW5uZXJJbmZvICpyb290LCBFcXVpdmFsZW5jZUNsYXNz ICplYywKIAkJCQljb250aW51ZTsKIAogCQkJLyogQ2hlY2sgdGhhdCBleHByZXNzaW9uIChpbmNs dWRpbmcgcmVsYWJlbHMhKSBpcyBzaGlwcGFibGUgKi8KLQkJCWlmIChpc19mb3JlaWduX2V4cHIo cm9vdCwgcmVsLCBlbS0+ZW1fZXhwcikpCisJCQlpZiAoaXNfZm9yZWlnbl9leHByKHJvb3QsIHJl bCwgZnBpbmZvLCBlbS0+ZW1fZXhwcikpCiAJCQkJcmV0dXJuIGVtOwogCQl9CiAKZGlmZiAtLWdp dCBhL2NvbnRyaWIvcG9zdGdyZXNfZmR3L3Bvc3RncmVzX2Zkdy5oIGIvY29udHJpYi9wb3N0Z3Jl c19mZHcvcG9zdGdyZXNfZmR3LmgKaW5kZXggYTJiYjFmZjM1MmMuLmRhN2RhMWMyZWE5IDEwMDY0 NAotLS0gYS9jb250cmliL3Bvc3RncmVzX2Zkdy9wb3N0Z3Jlc19mZHcuaAorKysgYi9jb250cmli L3Bvc3RncmVzX2Zkdy9wb3N0Z3Jlc19mZHcuaApAQCAtMTA2LDYgKzEwNiwxNiBAQCB0eXBlZGVm IHN0cnVjdCBQZ0Zkd1JlbGF0aW9uSW5mbwogCS8qIGpvaW5jbGF1c2VzIGNvbnRhaW5zIG9ubHkg Sk9JTi9PTiBjb25kaXRpb25zIGZvciBhbiBvdXRlciBqb2luICovCiAJTGlzdAkgICAqam9pbmNs YXVzZXM7CS8qIExpc3Qgb2YgUmVzdHJpY3RJbmZvICovCiAKKwkvKgorCSAqIElmIGEgRlVOQ1RJ T04gUlRFIHdhcyBhYnNvcmJlZCBpbnRvIHRoaXMgam9pbiwgdGhlc2UgcG9pbnQgYXQgdGhlIHN0 dWIKKwkgKiBQZ0Zkd1JlbGF0aW9uSW5mbyBmb3IgdGhlIGZ1bmN0aW9uIHNpZGUgKHBhaXJlZCB3 aXRoIHRoZQorCSAqIG91dGVycmVsL2lubmVycmVsKSwgc28gdGhlIGNvc3QgZXN0aW1hdG9yIGFu ZCBkZXBhcnNlciBjYW4gZmluZCBpdAorCSAqIHdpdGhvdXQgY29uc3VsdGluZyB0aGUgZnVuY3Rp b24gcmVsJ3MgZmR3X3ByaXZhdGUuICBBdCBtb3N0IG9uZSBvZgorCSAqIG91dGVyX2Z1bmNfZnBp bmZvL2lubmVyX2Z1bmNfZnBpbmZvIGlzIHNldC4KKwkgKi8KKwlzdHJ1Y3QgUGdGZHdSZWxhdGlv bkluZm8gKm91dGVyX2Z1bmNfZnBpbmZvOworCXN0cnVjdCBQZ0Zkd1JlbGF0aW9uSW5mbyAqaW5u ZXJfZnVuY19mcGluZm87CisKIAkvKiBVcHBlciByZWxhdGlvbiBpbmZvcm1hdGlvbiAqLwogCVVw cGVyUmVsYXRpb25LaW5kIHN0YWdlOwogCkBAIC0xODMsMTEgKzE5MywxMyBAQCBleHRlcm4gY2hh ciAqcGdmZHdfYXBwbGljYXRpb25fbmFtZTsKIC8qIGluIGRlcGFyc2UuYyAqLwogZXh0ZXJuIHZv aWQgY2xhc3NpZnlDb25kaXRpb25zKFBsYW5uZXJJbmZvICpyb290LAogCQkJCQkJCSAgIFJlbE9w dEluZm8gKmJhc2VyZWwsCisJCQkJCQkJICAgUGdGZHdSZWxhdGlvbkluZm8gKmZwaW5mbywKIAkJ CQkJCQkgICBMaXN0ICppbnB1dF9jb25kcywKIAkJCQkJCQkgICBMaXN0ICoqcmVtb3RlX2NvbmRz LAogCQkJCQkJCSAgIExpc3QgKipsb2NhbF9jb25kcyk7CiBleHRlcm4gYm9vbCBpc19mb3JlaWdu X2V4cHIoUGxhbm5lckluZm8gKnJvb3QsCiAJCQkJCQkJUmVsT3B0SW5mbyAqYmFzZXJlbCwKKwkJ CQkJCQlQZ0Zkd1JlbGF0aW9uSW5mbyAqZnBpbmZvLAogCQkJCQkJCUV4cHIgKmV4cHIpOwogZXh0 ZXJuIGJvb2wgaXNfZm9yZWlnbl9wYXJhbShQbGFubmVySW5mbyAqcm9vdCwKIAkJCQkJCQkgUmVs T3B0SW5mbyAqYmFzZXJlbCwKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcG9zdGdyZXNfZmR3L3NxbC9w b3N0Z3Jlc19mZHcuc3FsIGIvY29udHJpYi9wb3N0Z3Jlc19mZHcvc3FsL3Bvc3RncmVzX2Zkdy5z cWwKaW5kZXggMjY3ZDNjMWE3ZTcuLjJlNjMyODFjZTJkIDEwMDY0NAotLS0gYS9jb250cmliL3Bv c3RncmVzX2Zkdy9zcWwvcG9zdGdyZXNfZmR3LnNxbAorKysgYi9jb250cmliL3Bvc3RncmVzX2Zk dy9zcWwvcG9zdGdyZXNfZmR3LnNxbApAQCAtNzkwLDYgKzc5MCwyNzEgQEAgU0VMRUNUIHQxLmMx LCB0Mi5jMiBGUk9NIHY0IHQxIExFRlQgSk9JTiBmdDUgdDIgT04gKHQxLmMxID0gdDIuYzEpIE9S REVSIEJZIHQxLmMKIFNFTEVDVCB0MS5jMSwgdDIuYzIgRlJPTSB2NCB0MSBMRUZUIEpPSU4gZnQ1 IHQyIE9OICh0MS5jMSA9IHQyLmMxKSBPUkRFUiBCWSB0MS5jMSwgdDIuYzEgT0ZGU0VUIDEwIExJ TUlUIDEwOwogQUxURVIgVklFVyB2NCBPV05FUiBUTyByZWdyZXNzX3ZpZXdfb3duZXI7CiAKKy0t ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT0KKy0tIEZvcmVpZ24tam9pbiB3aXRoIEZVTkNUSU9OIFJURSBwdXNoZG93biAo SU1NVVRBQkxFIGZ1bmN0aW9ucyBvbmx5KQorLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0gSU1NVVRBQkxFIGZ1 bmN0aW9uOiB1bm5lc3Qgb2YgY29uc3RhbnQgYXJyYXkgY2FuIGJlIHB1c2hlZCBkb3duCitFWFBM QUlOIChWRVJCT1NFLCBDT1NUUyBPRkYpCitTRUxFQ1QgdDEuYzEsIHQxLmMzIEZST00gZnQxIHQx LCB1bm5lc3QoQVJSQVlbMSwgNSwgMTAsIDEwMF06OmludFtdKSBBUyB1KGlkKQorV0hFUkUgdDEu YzEgPSB1LmlkIE9SREVSIEJZIHQxLmMxOworU0VMRUNUIHQxLmMxLCB0MS5jMyBGUk9NIGZ0MSB0 MSwgdW5uZXN0KEFSUkFZWzEsIDUsIDEwLCAxMDBdOjppbnRbXSkgQVMgdShpZCkKK1dIRVJFIHQx LmMxID0gdS5pZCBPUkRFUiBCWSB0MS5jMTsKKworLS0gSU1NVVRBQkxFIGZ1bmN0aW9uOiBnZW5l cmF0ZV9zZXJpZXMgd2l0aCBjb25zdGFudCBhcmdzCitFWFBMQUlOIChWRVJCT1NFLCBDT1NUUyBP RkYpCitTRUxFQ1QgdDEuYzEgRlJPTSBmdDEgdDEsIGdlbmVyYXRlX3NlcmllcygxLCA0KSBBUyBn KGlkKQorV0hFUkUgdDEuYzEgPSBnLmlkIE9SREVSIEJZIHQxLmMxOworU0VMRUNUIHQxLmMxIEZS T00gZnQxIHQxLCBnZW5lcmF0ZV9zZXJpZXMoMSwgNCkgQVMgZyhpZCkKK1dIRVJFIHQxLmMxID0g Zy5pZCBPUkRFUiBCWSB0MS5jMTsKKworLS0gVk9MQVRJTEUgZnVuY3Rpb24gKHJhbmRvbSkgbXVz dCBOT1QgYmUgcHVzaGVkIGRvd24KK0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikKK1NFTEVD VCB0MS5jMSBGUk9NIGZ0MSB0MSwgZ2VuZXJhdGVfc2VyaWVzKDEsIDQgKyAocmFuZG9tKCkgKiAw KTo6aW50KSBBUyBnKGlkKQorV0hFUkUgdDEuYzEgPSBnLmlkOworCistLSBXSVRIIE9SRElOQUxJ VFkgbXVzdCBOT1QgYmUgcHVzaGVkIGRvd24gKGxpbWl0YXRpb24gb2YgdGhpcyBpbXBsZW1lbnRh dGlvbikKK0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikKK1NFTEVDVCB0MS5jMSwgdS5vcmQK K0ZST00gZnQxIHQxLCB1bm5lc3QoQVJSQVlbMSwgNSwgMTBdOjppbnRbXSkgV0lUSCBPUkRJTkFM SVRZIEFTIHUoaWQsIG9yZCkKK1dIRVJFIHQxLmMxID0gdS5pZDsKKworLS0gU2FtZSBmdW5jdGlv biBSVEUgam9pbmVkIHdpdGggdHdvIGRpZmZlcmVudCBmb3JlaWduIHNlcnZlcnM6IHBsYW5uZXIg cGlja3MKKy0tIG9uZSBhYnNvcnB0aW9uICsgYSBsb2NhbCBqb2luIHdpdGggdGhlIHNlY29uZCBm b3JlaWduIHNlcnZlci4gIFRoZSBmYWN0CistLSB0aGF0IHRoZSBmdW5jdGlvbiBpcyBJTU1VVEFC TEUgbWFrZXMgdGhpcyBzYWZlIGV2ZW4gaWYgYm90aCBzaWRlcyBjaG9zZSB0bworLS0gYWJzb3Ji IGl0IGluZGVwZW5kZW50bHkuCitFWFBMQUlOIChWRVJCT1NFLCBDT1NUUyBPRkYpCitTRUxFQ1Qg dDEuYzEsIHQyLmMxCitGUk9NIGZ0MSB0MSwgZnQ2IHQyLCB1bm5lc3QoQVJSQVlbMSwgNSwgMTAs IDEwMF06OmludFtdKSBBUyB1KGlkKQorV0hFUkUgdDEuYzEgPSB1LmlkIEFORCB0Mi5jMSA9IHUu aWQgT1JERVIgQlkgdDEuYzE7CisKKy0tIENvc3QtYmFzZWQgc2VsZWN0aW9uIGJldHdlZW4gdHdv IGZvcmVpZ24gc2VydmVyczogZnQxICgiUyAxIi4iVCAxIikgaGFzCistLSAxMDAwIHJvd3MsIGZ0 NiAoIlMgMSIuIlQgNCIpIGhhcyB+MzMgcm93cy4gIFRoZSBzYW1lIHF1ZXJ5IHNoYXBlIGdldHMg YQorLS0gZGlmZmVyZW50IHB1c2gtZG93biB0YXJnZXQgZGVwZW5kaW5nIG9uIGEgcHJlZGljYXRl IHRoYXQgY2hhbmdlcyB0aGUKKy0tIGVmZmVjdGl2ZSBjYXJkaW5hbGl0eSBvZiBvbmUgc2lkZSAt LSB0aGUgZnVuY3Rpb24gImp1bXBzIiB0byB3aGljaGV2ZXIKKy0tIGZvcmVpZ24gc2NhbiBiZW5l Zml0cyBtb3JlIGZyb20gYmVpbmcgcHJlLWZpbHRlcmVkLgorQU5BTFlaRSBmdDE7CitBTkFMWVpF IGZ0NjsKKy0tIE5vIGV4dHJhIHByZWRpY2F0ZTogZnQxIGlzIHRoZSBiaWdnZXIgc2lkZSwgZnVu Y3Rpb24gYWJzb3JiZWQgdGhlcmUuCitFWFBMQUlOIChWRVJCT1NFLCBDT1NUUyBPRkYpCitTRUxF Q1QgdDEuYzEsIHQyLmMxCitGUk9NIGZ0MSB0MSwgZnQ2IHQyLCB1bm5lc3QoQVJSQVlbMywgNiwg OSwgMTIsIDE1LCAxOF06OmludFtdKSBBUyB1KGlkKQorV0hFUkUgdDEuYzEgPSB1LmlkIEFORCB0 Mi5jMSA9IHUuaWQ7CistLSBTZWxlY3RpdmUgcHJlZGljYXRlIG9uIGZ0MS5jMyAobm90IGluIHRo ZSBlcWNsYXNzKSBzaHJpbmtzIGZ0MSB0byBhCistLSBoYW5kZnVsIG9mIHJlbW90ZSByb3dzOyBu b3cgZnQ2IGlzIGVmZmVjdGl2ZWx5IHRoZSBiaWdnZXIgc2lkZSBhbmQgdGhlCistLSBmdW5jdGlv biBpcyBhYnNvcmJlZCBpbnRvIGZ0NiBpbnN0ZWFkLgorRVhQTEFJTiAoVkVSQk9TRSwgQ09TVFMg T0ZGKQorU0VMRUNUIHQxLmMxLCB0Mi5jMQorRlJPTSBmdDEgdDEsIGZ0NiB0MiwgdW5uZXN0KEFS UkFZWzMsIDYsIDksIDEyLCAxNSwgMThdOjppbnRbXSkgQVMgdShpZCkKK1dIRVJFIHQxLmMxID0g dS5pZCBBTkQgdDIuYzEgPSB1LmlkIEFORCB0MS5jMyA8ICcwMDAxMCc7CisKKy0tIFRoZSByZW1h aW5pbmcgc2NlbmFyaW9zIHJldXNlIGEgZGVkaWNhdGVkIGZvcmVpZ24gdGFibGUgdG8gY292ZXIg dGhlCistLSBjb3JuZXIgY2FzZXMgb2YgRlVOQ1RJT04gUlRFIHB1c2gtZG93bjogZnVuY3Rpb24t Zmlyc3QgRlJPTSwgcmVjb3JkCistLSByZXR1cm4gdHlwZSByZWplY3Rpb24sIHdob2xlLXJvdyBy ZWZlcmVuY2UsIFVQREFURS4uLkZST00uLi4sIGFuZAorLS0gbXVsdGktZnVuY3Rpb24gUk9XUyBG Uk9NLgorQ1JFQVRFIFRBQkxFIGJhc2VfdGJsX2ZuIChhIGludCwgYiBpbnQpOworSU5TRVJUIElO VE8gYmFzZV90YmxfZm4KKyAgU0VMRUNUIGcsIGcgKyAxMDAgRlJPTSBnZW5lcmF0ZV9zZXJpZXMo MSwgMzApIGc7CitDUkVBVEUgRk9SRUlHTiBUQUJMRSByZW1vdGVfdGJsIChhIGludCwgYiBpbnQp CisgIFNFUlZFUiBsb29wYmFjayBPUFRJT05TICh0YWJsZV9uYW1lICdiYXNlX3RibF9mbicpOwor CistLSBUaGUgZnVuY3Rpb24gUlRFIGFwcGVhcnMgZmlyc3QgaW4gRlJPTTsgdGhlIGZvcmVpZ24g cmVsYXRpb24gbXVzdCBiZQorLS0gZm91bmQgYnkgc2Nhbm5pbmcgZnNfYmFzZV9yZWxpZHMgZm9y IGFuIFJURV9SRUxBVElPTiByYXRoZXIgdGhhbgorLS0gdXNpbmcgc2Nhbi0+ZnNfcmVsaWQgYmxp bmRseS4KK0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikKK1NFTEVDVCAqIEZST00gdW5uZXN0 KGFycmF5WzIsIDMsIDRdKSBuLCByZW1vdGVfdGJsIHIgV0hFUkUgci5hID0gbjsKK1NFTEVDVCAq IEZST00gdW5uZXN0KGFycmF5WzIsIDMsIDRdKSBuLCByZW1vdGVfdGJsIHIKK1dIRVJFIHIuYSA9 IG4gT1JERVIgQlkgci5hOworCistLSBGdW5jdGlvbiBSVEUgaXMgcmVzdHJpY3RlZCwgc2hpcHBh YmxlIGNvbmRpdGlvbnMKK0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikKK1NFTEVDVCAqIEZS T00gdW5uZXN0KGFycmF5WzIsIDMsIDRdKSBuLCByZW1vdGVfdGJsIHIgV0hFUkUgci5hID0gbiBh bmQgbiA+IDM7CitTRUxFQ1QgKiBGUk9NIHVubmVzdChhcnJheVsyLCAzLCA0XSkgbiwgcmVtb3Rl X3RibCByCitXSEVSRSByLmEgPSBuIGFuZCBuID4gMyBPUkRFUiBCWSByLmE7CisKKy0tIEZ1bmN0 aW9uIFJURSBpcyByZXN0cmljdGVkLCBub25zaGlwcGFibGUgY29uZGl0aW9ucworQ1JFQVRFIEZV TkNUSU9OIGZfbG9jYWwoaW50KSBSRVRVUk5TIGludCBBUyAkJAorQkVHSU4KK1JFVFVSTiAkMTsK K0VORAorJCQgTEFOR1VBR0UgcGxwZ3NxbDsKKworRVhQTEFJTiAoVkVSQk9TRSwgQ09TVFMgT0ZG KQorU0VMRUNUICogRlJPTSB1bm5lc3QoYXJyYXlbMiwgMywgNF0pIG4sIHJlbW90ZV90YmwgciBX SEVSRSByLmEgPSBuIGFuZCBuID4gZl9sb2NhbCgzKTsKK1NFTEVDVCAqIEZST00gdW5uZXN0KGFy cmF5WzIsIDMsIDRdKSBuLCByZW1vdGVfdGJsIHIKK1dIRVJFIHIuYSA9IG4gYW5kIG4gPiBmX2xv Y2FsKDMpIE9SREVSIEJZIHIuYTsKKworRFJPUCBGVU5DVElPTiBmX2xvY2FsKGludCk7CisKKy0t IENoZWNrIHRoYXQgYSBxdWFsIG9uIHRoZSBmdW5jdGlvbiBSVEUgdXNpbmcgYSBmdW5jdGlvbiBm cm9tIGEgc2hpcHBhYmxlCistLSBleHRlbnNpb24gaXMgcHVzaGVkIGRvd24uICBwbHBnc3FsIChu b3QgaW5saW5lZCkgd2l0aCB0aGUgY29sdW1uIGFzCistLSBhcmd1bWVudCAobm90IGNvbnN0LWZv bGRlZCkga2VlcHMgdGhlIGZ1bmN0aW9uIGNhbGwgaW4gdGhlIHF1YWwuCitDUkVBVEUgRlVOQ1RJ T04gZl9leHQoaW50KSBSRVRVUk5TIGludCBBUyAkJAorQkVHSU4gUkVUVVJOICQxOyBFTkQKKyQk IExBTkdVQUdFIHBscGdzcWwgSU1NVVRBQkxFOworQUxURVIgRVhURU5TSU9OIHBvc3RncmVzX2Zk dyBBREQgRlVOQ1RJT04gZl9leHQoaW50KTsKKy0tIEZvcmNlIHB1c2hkb3duIHNvIHRoZSBmaXhl ZC1jb2RlIHBsYW4gaXMgZGV0ZXJtaW5pc3RpY2FsbHkgYSBGb3JlaWduCistLSBTY2FuOyBvbiB0 aGUgdW5maXhlZCBjb2RlIHRoZSBxdWFsIGlzIGNsYXNzaWZpZWQgbG9jYWwsIHRoZSBqb2luIGlz CistLSByZWZ1c2VkLCBhbmQgdGhlIHBsYW4gZmFsbHMgYmFjayB0byBhIGxvY2FsIGpvaW4gaW5z dGVhZC4KK1NFVCBlbmFibGVfaGFzaGpvaW4gPSBvZmY7CitTRVQgZW5hYmxlX21lcmdlam9pbiA9 IG9mZjsKK1NFVCBlbmFibGVfbmVzdGxvb3AgPSBvZmY7CitFWFBMQUlOIChWRVJCT1NFLCBDT1NU UyBPRkYpCitTRUxFQ1QgKiBGUk9NIHVubmVzdChhcnJheVsyLCAzLCA0XSkgbiwgcmVtb3RlX3Ri bCByIFdIRVJFIHIuYSA9IG4gYW5kIGZfZXh0KG4pID4gMzsKK1NFTEVDVCAqIEZST00gdW5uZXN0 KGFycmF5WzIsIDMsIDRdKSBuLCByZW1vdGVfdGJsIHIKK1dIRVJFIHIuYSA9IG4gYW5kIGZfZXh0 KG4pID4gMyBPUkRFUiBCWSByLmE7CitSRVNFVCBlbmFibGVfaGFzaGpvaW47CitSRVNFVCBlbmFi bGVfbWVyZ2Vqb2luOworUkVTRVQgZW5hYmxlX25lc3Rsb29wOworQUxURVIgRVhURU5TSU9OIHBv c3RncmVzX2ZkdyBEUk9QIEZVTkNUSU9OIGZfZXh0KGludCk7CitEUk9QIEZVTkNUSU9OIGZfZXh0 KGludCk7CisKKy0tIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHJlY29yZCAoY29tcG9zaXRlKSBpcyBm b3JiaWRkZW47IHB1c2hpbmcgaXQKKy0tIHdvdWxkIHlpZWxkIGEgcmVtb3RlICJjb2x1bW4gZGVm aW5pdGlvbiBsaXN0IGlzIHJlcXVpcmVkIiBlcnJvci4KKy0tIGZ1bmN0aW9uX3J0ZV9wdXNoZG93 bl9vaygpIHJlamVjdHMgaXQgdmlhIFRZUEVGVU5DX1NDQUxBUi4KK0NSRUFURSBPUiBSRVBMQUNF IEZVTkNUSU9OIGZfcmV0X3JlY29yZCgpIFJFVFVSTlMgcmVjb3JkIEFTICQkCisgIFNFTEVDVCAo MSwgMik6OnJlY29yZAorJCQgTEFOR1VBR0UgU1FMIElNTVVUQUJMRTsKK0VYUExBSU4gKFZFUkJP U0UsIENPU1RTIE9GRikKK1NFTEVDVCBzIEZST00gcmVtb3RlX3RibCBydCwgZl9yZXRfcmVjb3Jk KCkgQVMgcyhhIGludCwgYiBpbnQpCitXSEVSRSBzLmEgPSBydC5hOworRFJPUCBGVU5DVElPTiBm X3JldF9yZWNvcmQoKTsKKworLS0gVVBEQVRFIC4uLiBGUk9NIHVubmVzdCgpIHdpdGggYSBjb21w bGV4IGVsZW1lbnQgdHlwZTsgYXJlYShib3gpCistLSB5aWVsZHMgdGhlIHZhbHVlIHRvIG1hdGNo LiAgVGhlIGxvY2tpbmcgbWFjaGluZXJ5IGZvciB0aGUKKy0tIG5vbi1yZWxhdGlvbiBSVEUgZ2Vu ZXJhdGVzIGEgd2hvbGUtcm93IFZhciB0aGF0IGRlcGFyc2VDb2x1bW5SZWYKKy0tIGVtaXRzIGFz IFJPVyhmPHJ0aT4uYzEsIC4uLikuCitVUERBVEUgcmVtb3RlX3RibCByIFNFVCBiID0gOTk5CitG Uk9NIHVubmVzdChhcnJheVtib3ggJygoMiwzKSwoLTIsLTMpKSddKSBBUyB0KGJ4KQorV0hFUkUg ci5hID0gYXJlYSh0LmJ4KTsKK1NFTEVDVCAqIEZST00gcmVtb3RlX3RibCBXSEVSRSBhIElOICgy MywgMjQsIDI1KSBPUkRFUiBCWSBhOworCistLSBUaGUgc2FtZSBzaGFwZSB3aXRoIENBU0UgYW5k IFJFVFVSTklORzsgZXhlcmNpc2VzIHRoZSBEaXJlY3RNb2RpZnkKKy0tIHBhdGggYW5kIHRoZSBl eGVjdXRvcidzIHR1cGxlLWRlc2MgcmVjb25zdHJ1Y3Rpb24uCitVUERBVEUgcmVtb3RlX3RibCBy CisgICBTRVQgYiA9IENBU0UgV0hFTiByYW5kb20oKSA+PSAwIFRIRU4gNSBFTFNFIDAgRU5ECisg IEZST00gdW5uZXN0KGFycmF5W2JveCAnKCgyLDMpLCgtMiwtMykpJ10pIEFTIHQoYngpCisgV0hF UkUgci5hID0gYXJlYSh0LmJ4KSBSRVRVUk5JTkcgYSwgYjsKKworLS0gUkVUVVJOSU5HIGEgd2hv bGUtcm93IHJlZmVyZW5jZSB0byB0aGUgZnVuY3Rpb24gUlRFLiAgV2l0aG91dCB0aGUKKy0tIHBl ci1SVEUgZnVuY3Rpb24gbWV0YWRhdGEgYmVpbmcgcHJlc2VydmVkIG9uIHRoZSBEaXJlY3RNb2Rp ZnkgcGF0aAorLS0gKEZkd0RpcmVjdE1vZGlmeVByaXZhdGVGdW5jdGlvbnMgLyBGZHdEaXJlY3RN b2RpZnlQcml2YXRlTWluUlRJbmRleCksCistLSB0aGlzIHdvdWxkIGZhaWwgd2l0aCAiaW5wdXQg b2YgYW5vbnltb3VzIGNvbXBvc2l0ZSB0eXBlcyBpcyBub3QKKy0tIGltcGxlbWVudGVkIi4KK1VQ REFURSByZW1vdGVfdGJsIHIgU0VUIGIgPSA3CisgIEZST00gdW5uZXN0KGFycmF5W2JveCAnKCgy LDMpLCgtMiwtMykpJ10sCisgICAgICAgICAgICAgIGFycmF5W2ludCAnMSddKSBBUyB0KGJ4LCBp KQorIFdIRVJFIHIuYSA9IGFyZWEodC5ieCkgUkVUVVJOSU5HIGEsIGIsIHQ7CisKKy0tIFJPV1Mg RlJPTSAoLi4uKSB3aXRoIHNldmVyYWwgZnVuY3Rpb25zLiAgRm9yY2UgcHVzaGRvd24gYmVjYXVz ZSB0aGUKKy0tIGNvc3QgbW9kZWwgb3RoZXJ3aXNlIHBpY2tzIGEgbG9jYWwgcGxhbi4KK1NFVCBl bmFibGVfaGFzaGpvaW4gPSBvZmY7CitTRVQgZW5hYmxlX21lcmdlam9pbiA9IG9mZjsKK1NFVCBl bmFibGVfbmVzdGxvb3AgPSBvZmY7CitFWFBMQUlOIChWRVJCT1NFLCBDT1NUUyBPRkYpCitTRUxF Q1Qgci5hLCB0Lm4sIHQucworICBGUk9NIHJlbW90ZV90YmwgciwgUk9XUyBGUk9NICh1bm5lc3Qo YXJyYXlbMywgNiwgOV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0 ZV9zZXJpZXMoMTEsIDEzKSkgQVMgdChuLCBzKQorIFdIRVJFIHIuYSA9IHQubiBPUkRFUiBCWSBy LmE7CitTRUxFQ1Qgci5hLCB0Lm4sIHQucworICBGUk9NIHJlbW90ZV90YmwgciwgUk9XUyBGUk9N ICh1bm5lc3QoYXJyYXlbMywgNiwgOV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBnZW5lcmF0ZV9zZXJpZXMoMTEsIDEzKSkgQVMgdChuLCBzKQorIFdIRVJFIHIuYSA9IHQubiBP UkRFUiBCWSByLmE7CisKKy0tIFdob2xlLXJvdyBWYXIgb24gdGhlIGFic29yYmVkIGZ1bmN0aW9u IHNpZGUgKGUuZy4gdmlhIGEgY2FzdCB0bworLS0gdGV4dCkuICBFeGVyY2lzZXMgYm90aCBkZXBh cnNlQ29sdW1uUmVmIHdob2xlLXJvdyBicmFuY2ggYW5kIHRoZQorLS0gZ2V0X3R1cGRlc2NfZm9y X2pvaW5fc2Nhbl90dXBsZXMoKSBSVEVfRlVOQ1RJT04gbWV0YWRhdGEgcGF0aC4KK0VYUExBSU4g KFZFUkJPU0UsIENPU1RTIE9GRikKK1NFTEVDVCB0Ojp0ZXh0LCByLmEKKyAgRlJPTSByZW1vdGVf dGJsIHIsIFJPV1MgRlJPTSAodW5uZXN0KGFycmF5WzMsIDYsIDldKSwKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVfc2VyaWVzKDExLCAxMykpIEFTIHQobiwgcykKKyBX SEVSRSByLmEgPSB0Lm4gT1JERVIgQlkgci5hOworU0VMRUNUIHQ6OnRleHQsIHIuYQorICBGUk9N IHJlbW90ZV90YmwgciwgUk9XUyBGUk9NICh1bm5lc3QoYXJyYXlbMywgNiwgOV0pLAorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZV9zZXJpZXMoMTEsIDEzKSkgQVMgdChu LCBzKQorIFdIRVJFIHIuYSA9IHQubiBPUkRFUiBCWSByLmE7CisKKy0tIENoZWNrIHdob2xlLXJv dyBWYXIgcmVwcmVzZW50ZWQgYnkgZnVuY3Rpb24gb24gdGhlIG51bGxhYmxlCistLSBsZWZ0IGpv aW4gc2lkZQorRVhQTEFJTiAoVkVSQk9TRSwgQ09TVFMgT0ZGKQorU0VMRUNUIHUsIGZ0NS5jMSwg ZnQ1LmMyLCBmdDQuYzEsIGZ0NC5jMiBGUk9NIGZ0NSBMRUZUIEpPSU4KKyhmdDQgSk9JTiB1bm5l c3QoYXJyYXlbMSwyXSwgYXJyYXlbMyw0XSkgYXMgdSAodTEsIHUyKSBPTiBmdDQuYzE9dTEpCitP TiBmdDUuYzEgPSBmdDQuYzEgV0hFUkUgZnQ1LmMxIDwgMTAgT1JERVIgQlkgZnQ1LmMxOworU0VM RUNUIHUsIGZ0NS5jMSwgZnQ1LmMyLCBmdDQuYzEsIGZ0NC5jMiBGUk9NIGZ0NSBMRUZUIEpPSU4K KyhmdDQgSk9JTiB1bm5lc3QoYXJyYXlbMSwyXSwgYXJyYXlbMyw0XSkgYXMgdSAodTEsIHUyKSBP TiBmdDQuYzE9dTEpCitPTiBmdDUuYzEgPSBmdDQuYzEgV0hFUkUgZnQ1LmMxIDwgMTAgT1JERVIg QlkgZnQ1LmMxOworCistLSBTYW1lIG51bGxhYmxlLXNpZGUgd2hvbGUtcm93IFZhciwgYnV0IHdp dGggb3V0ZXIgcm93cyB0aGF0IGJvdGggbWF0Y2gKKy0tIGFuZCBtaXNzIHRoZSAoZm9yZWlnbiB4 IGZ1bmN0aW9uKSBpbm5lciBqb2luLiAgQSBtdWx0aS1jb2x1bW4gZnVuY3Rpb24KKy0tIFJURSBp cyB1c2VkIHNvIHRoYXQgdGhlIHJlZmVyZW5jZSBpcyBhIGdlbnVpbmUgd2hvbGUtcm93IFZhciAo YSBzaW5nbGUKKy0tIHNjYWxhci1yZXR1cm5pbmcgZnVuY3Rpb24gd291bGQgY29sbGFwc2UgdG8g aXRzIGxvbmUgY29sdW1uKS4gIFRoaXMKKy0tIGV4ZXJjaXNlcyB0aGUgVEhFTiBST1coLi4uKSBz aWRlIG9mIGRlcGFyc2VDb2x1bW5SZWYoKSdzIHdob2xlLXJvdyBDQVNFCistLSAobWF0Y2hlZCBy b3dzIHJlY29uc3RydWN0IHRoZSBjb21wb3NpdGUpIGFzIHdlbGwgYXMgdGhlIE5VTEwgc2lkZQor LS0gKG1pc3NlZCByb3dzKSwgY29uZmlybWluZyB0aGUgZXhlY3V0b3IgcmVidWlsZHMgdGhlIGFu b255bW91cyBjb21wb3NpdGUKKy0tIGNvcnJlY3RseS4KK0VYUExBSU4gKFZFUkJPU0UsIENPU1RT IE9GRikKK1NFTEVDVCBsLmEsIHQgRlJPTSByZW1vdGVfdGJsIGwKKyAgTEVGVCBKT0lOIChyZW1v dGVfdGJsIHIgSk9JTiB1bm5lc3QoYXJyYXlbMiwgNF0sIGFycmF5WzIwLCA0MF0pIEFTIHQoeCwg eSkKKyAgICAgICAgICAgICBPTiByLmEgPSB0LngpCisgIE9OIGwuYSA9IHIuYQorIFdIRVJFIGwu YSA8IDYgT1JERVIgQlkgbC5hOworU0VMRUNUIGwuYSwgdCBGUk9NIHJlbW90ZV90YmwgbAorICBM RUZUIEpPSU4gKHJlbW90ZV90YmwgciBKT0lOIHVubmVzdChhcnJheVsyLCA0XSwgYXJyYXlbMjAs IDQwXSkgQVMgdCh4LCB5KQorICAgICAgICAgICAgIE9OIHIuYSA9IHQueCkKKyAgT04gbC5hID0g ci5hCisgV0hFUkUgbC5hIDwgNiBPUkRFUiBCWSBsLmE7CitSRVNFVCBlbmFibGVfaGFzaGpvaW47 CitSRVNFVCBlbmFibGVfbWVyZ2Vqb2luOworUkVTRVQgZW5hYmxlX25lc3Rsb29wOworCistLSBD aGVjayBmb3JlaWduIGpvaW4gd2l0aCBwYXJhbWV0ZXJpemVkIGZ1bmN0aW9uCitDUkVBVEUgT1Ig UkVQTEFDRSBGVU5DVElPTiBmKGludCkgUkVUVVJOUyBTRVRPRiBpbnQgTEFOR1VBR0UgcGxwZ3Nx bCBST1dTIDEwIEFTICdCRUdJTiBSRVRVUk4gUVVFUlkgU0VMRUNUIGdlbmVyYXRlX3Nlcmllcygx LCQxKSA7IEVORCcgSU1NVVRBQkxFOworQUxURVIgRVhURU5TSU9OIHBvc3RncmVzX2ZkdyBBREQg RlVOQ1RJT04gZihJTlRFR0VSKTsKKworRVhQTEFJTiAoVkVSQk9TRSwgQ09TVFMgT0ZGKQorV0lU SCBzIEFTIE1BVEVSSUFMSVpFRCAoU0VMRUNUIHIxLiogRlJPTSByZW1vdGVfdGJsIHIxCitKT0lO IExBVEVSQUwKKyhTRUxFQ1QgcjIuYSBGUk9NIHJlbW90ZV90YmwgcjIsIGYocjEuYSkgTElNSVQg MSkgcworT04gdHJ1ZSkKK1NFTEVDVCAqIEZST00gcyBPUkRFUiBCWSAxOworV0lUSCBzIEFTIE1B VEVSSUFMSVpFRCAoU0VMRUNUIHIxLiogRlJPTSByZW1vdGVfdGJsIHIxCitKT0lOIExBVEVSQUwK KyhTRUxFQ1QgcjIuYSBGUk9NIHJlbW90ZV90YmwgcjIsIGYocjEuYSkgTElNSVQgMSkgcworT04g dHJ1ZSkKK1NFTEVDVCAqIEZST00gcyBPUkRFUiBCWSAxOworCitBTFRFUiBFWFRFTlNJT04gcG9z dGdyZXNfZmR3IERST1AgRlVOQ1RJT04gZihJTlRFR0VSKTsKK0RST1AgRlVOQ1RJT04gZihJTlRF R0VSKTsKKworLS0gVm9sYXRpbGUgZnVuY3Rpb24gaW4gUk9XUyBGUk9NIGRpc3F1YWxpZmllcyB0 aGUgd2hvbGUgUlRFLgorRVhQTEFJTiAoVkVSQk9TRSwgQ09TVFMgT0ZGKQorU0VMRUNUIHIuYSBG Uk9NIHJlbW90ZV90YmwgciwKKyAgICAgICAgICAgICAgICBST1dTIEZST00gKHVubmVzdChhcnJh eVszLCA2LCA5XSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZV9zZXJpZXMo MSwgNCArIChyYW5kb20oKSAqIDApOjppbnQpKSBBUyB0KG4sIHMpCisgV0hFUkUgci5hID0gdC5u OworCistLSBMQVRFUkFMIGZ1bmN0aW9uIHJlZmVyZW5jaW5nIGEgZm9yZWlnbiBWYXI6IHBvc3Rn cmVzX2ZkdydzCistLSBmb3JlaWduLWpvaW4gcHVzaGRvd24gcmVqZWN0cyB0aGlzIHZpYSB0aGUg am9pbnJlbC0+bGF0ZXJhbF9yZWxpZHMKKy0tIGNoZWNrOyB0aGUgcGxhbiBpcyB0aGVyZWZvcmUg YSBsb2NhbCBOZXN0TG9vcCArIEZ1bmN0aW9uU2Nhbi4KK0VYUExBSU4gKFZFUkJPU0UsIENPU1RT IE9GRikKK1NFTEVDVCByLmEsIHQueCBGUk9NIHJlbW90ZV90YmwgciwgTEFURVJBTCB1bm5lc3Qo YXJyYXlbci5hXSkgQVMgdCh4KQorV0hFUkUgci5hIDw9IDMgT1JERVIgQlkgci5hOworCistLSBP dXRlciBqb2lucyB3aXRoIHRoZSBmdW5jdGlvbiBSVEUgYXJlIG5vdCBwdXNoZWQgZG93biAob25s eSBJTk5FUgorLS0gam9pbnMgYXJlIHN1cHBvcnRlZCBieSBmdW5jdGlvbl9ydGVfcHVzaGRvd25f b2soKSkuCitFWFBMQUlOIChWRVJCT1NFLCBDT1NUUyBPRkYpCitTRUxFQ1Qgci5hLCB0Lm4gRlJP TSByZW1vdGVfdGJsIHIKKyAgICAgTEVGVCBKT0lOIHVubmVzdChhcnJheVsxLCAyLCAzXSkgQVMg dChuKSBPTiByLmEgPSB0Lm4KKyBXSEVSRSByLmEgPD0gNSBPUkRFUiBCWSByLmE7CisKKy0tIFNF TUkgam9pbiAoRVhJU1RTKSB3aXRoIGEgZnVuY3Rpb24gUlRFIGlzIGFsc28gbm90IHB1c2hlZCBk b3duLgorRVhQTEFJTiAoVkVSQk9TRSwgQ09TVFMgT0ZGKQorU0VMRUNUIHIuYSBGUk9NIHJlbW90 ZV90YmwgcgorIFdIRVJFIEVYSVNUUyAoU0VMRUNUIDEgRlJPTSB1bm5lc3QoYXJyYXlbMywgNiwg OV0pIEFTIHQobikgV0hFUkUgdC5uID0gci5hKQorIE9SREVSIEJZIHIuYTsKKworRFJPUCBGT1JF SUdOIFRBQkxFIHJlbW90ZV90Ymw7CitEUk9QIFRBQkxFIGJhc2VfdGJsX2ZuOworCiAtLSA9PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PQogLS0gQ2hlY2sgdGhhdCB1c2VyaWQgdG8gdXNlIHdoZW4gcXVlcnlpbmcgdGhlIHJl bW90ZSB0YWJsZSBpcyBjb3JyZWN0bHkKIC0tIHByb3BhZ2F0ZWQgaW50byBmb3JlaWduIHJlbHMg cHJlc2VudCBpbiBzdWJxdWVyaWVzIHVuZGVyIGFuIFVOSU9OIEFMTApkaWZmIC0tZ2l0IGEvc3Jj L2JhY2tlbmQvb3B0aW1pemVyL3V0aWwvcmVsbm9kZS5jIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVy L3V0aWwvcmVsbm9kZS5jCmluZGV4IDNmYzJjMmY3MWQwLi5mMjFhZTFiYWViMiAxMDA2NDQKLS0t IGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwvcmVsbm9kZS5jCisrKyBiL3NyYy9iYWNrZW5k L29wdGltaXplci91dGlsL3JlbG5vZGUuYwpAQCAtNzQ2LDYgKzc0NiwzMCBAQCBzZXRfZm9yZWln bl9yZWxfcHJvcGVydGllcyhSZWxPcHRJbmZvICpqb2lucmVsLCBSZWxPcHRJbmZvICpvdXRlcl9y ZWwsCiAJCQlqb2lucmVsLT5mZHdyb3V0aW5lID0gb3V0ZXJfcmVsLT5mZHdyb3V0aW5lOwogCQl9 CiAJfQorCWVsc2UgaWYgKE9pZElzVmFsaWQob3V0ZXJfcmVsLT5zZXJ2ZXJpZCkgJiYKKwkJCSBp bm5lcl9yZWwtPnJ0ZWtpbmQgPT0gUlRFX0ZVTkNUSU9OKQorCXsKKwkJLyoKKwkJICogT25lIHNp ZGUgaXMgYSBmb3JlaWduIHJlbGF0aW9uLCB0aGUgb3RoZXIgc2lkZSBpcyBhIGZ1bmN0aW9uIFJU RS4KKwkJICogSWYgdGhlIGZ1bmN0aW9uIGlzIElNTVVUQUJMRSwgdGhlIEZEVyBjYW4gYWJzb3Ji IHRoZSBmdW5jdGlvbiBjYWxsCisJCSAqIGludG8gdGhlIHJlbW90ZSBxdWVyeSAodGhlIHJlc3Vs dCBpcyBpZGVudGljYWwgcmVnYXJkbGVzcyBvZiB3aGljaAorCQkgKiBzZXJ2ZXIgZXZhbHVhdGVz IGl0KS4gIExldCB0aGUgRkRXIGRlY2lkZSB3aGV0aGVyIHRoZSBqb2luIGlzCisJCSAqIGFjdHVh bGx5IHNoaXBwYWJsZTsgaGVyZSB3ZSBqdXN0IHByb3BhZ2F0ZSB0aGUgRkRXIHJvdXRpbmUgc28g dGhlCisJCSAqIEZEVyBnZXRzIGEgY2hhbmNlLgorCQkgKi8KKwkJam9pbnJlbC0+c2VydmVyaWQg PSBvdXRlcl9yZWwtPnNlcnZlcmlkOworCQlqb2lucmVsLT51c2VyaWQgPSBvdXRlcl9yZWwtPnVz ZXJpZDsKKwkJam9pbnJlbC0+dXNlcmlkaXNjdXJyZW50ID0gb3V0ZXJfcmVsLT51c2VyaWRpc2N1 cnJlbnQ7CisJCWpvaW5yZWwtPmZkd3JvdXRpbmUgPSBvdXRlcl9yZWwtPmZkd3JvdXRpbmU7CisJ fQorCWVsc2UgaWYgKE9pZElzVmFsaWQoaW5uZXJfcmVsLT5zZXJ2ZXJpZCkgJiYKKwkJCSBvdXRl cl9yZWwtPnJ0ZWtpbmQgPT0gUlRFX0ZVTkNUSU9OKQorCXsKKwkJam9pbnJlbC0+c2VydmVyaWQg PSBpbm5lcl9yZWwtPnNlcnZlcmlkOworCQlqb2lucmVsLT51c2VyaWQgPSBpbm5lcl9yZWwtPnVz ZXJpZDsKKwkJam9pbnJlbC0+dXNlcmlkaXNjdXJyZW50ID0gaW5uZXJfcmVsLT51c2VyaWRpc2N1 cnJlbnQ7CisJCWpvaW5yZWwtPmZkd3JvdXRpbmUgPSBpbm5lcl9yZWwtPmZkd3JvdXRpbmU7CisJ fQogfQogCiAvKgotLSAKMi40My4wCgo= --=_87c219c4cc6e4e946033881815a2f5dc--