Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1lp5Ad-0004NT-MT for pgsql-hackers@arkaria.postgresql.org; Fri, 04 Jun 2021 08:27:12 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1lp5A7-0000e7-4s for pgsql-hackers@arkaria.postgresql.org; Fri, 04 Jun 2021 08:26:39 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1lp5A6-0000dv-II for pgsql-hackers@lists.postgresql.org; Fri, 04 Jun 2021 08:26:38 +0000 Received: from mail.postgrespro.ru ([93.174.131.139]) by makus.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1lp5A0-0004Qj-IO for pgsql-hackers@postgresql.org; Fri, 04 Jun 2021 08:26:37 +0000 Received: from ip-192-168-0-192.is74.loc (unknown [77.222.105.30]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client did not present a certificate) by mail.postgrespro.ru (Postfix) with ESMTPSA id DA66621C81EF; Fri, 4 Jun 2021 11:26:29 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mail; t=1622795190; bh=S9/H0R0hHmnJJ91zpZ441SBMCApxK+JlbcGlWEZMERo=; h=Subject:To:Cc:References:From:Date:In-Reply-To; b=gTaNW1M3Ejd3xWOYJTHeMrW37GKKx7XGmZZ8BTOzku0T44PsTz4LmTjbguvEpgGwl HR5Q7gSFwKYbRHr3sveSjAJre65EVPL1TvJ6M9aL2oaOjgjf6sFDYYBua4YHgNAmr8 1iL3AyU1DlgUFfBr2pF/fHsoQjqhcI6/jG4B1Mu0= Subject: Fast COPY FROM based on batch insert To: Etsuro Fujita , Justin Pryzby Cc: "tsunakawa.takay" , Zhihong Yu , Amit Langote , tanghy.fnst@fujitsu.com, Ashutosh Bapat , Pg Hackers , Tomas Vondra , houzj.fnst@fujitsu.com References: <20210304203949.GQ29832@telsasoft.com> <20210323032322.GW4203@telsasoft.com> <20210409004956.GN6592@telsasoft.com> From: Andrey Lepikhov Organization: Postgres Professional Message-ID: Date: Fri, 4 Jun 2021 13:26:29 +0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:78.0) Gecko/20100101 Thunderbird/78.10.2 MIME-Version: 1.0 In-Reply-To: Content-Type: multipart/mixed; boundary="------------A0220516AB66D657E1AFFFE6" Content-Language: en-US List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------A0220516AB66D657E1AFFFE6 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Hi, We still have slow 'COPY FROM' operation for foreign tables in current master. Now we have a foreign batch insert operation And I tried to rewrite the patch [1] with this machinery. The patch (see in attachment) smaller than [1] and no changes required in FDW API. Benchmarking ============ I used two data sets: with a number of 1E6 and 1E7 tuples. As a foreign server emulation I used loopback FDW links. Test table: CREATE TABLE test(a int, payload varchar(80)); Execution time of COPY FROM into single foreign table: version | 1E6 tuples | 1E7 tuples | master: | 64s | 775s | Patch [1]: | 5s | 50s | Current: | 4s | 42s | Execution time of the COPY operation into a plane table is 0.8s for 1E6 tuples and 8s for 1E7 tuples. Execution time of COPY FROM into the table partitioned by three foreign partitions: version | 1E6 tuples | 1E7 tuples | master: | 85s | 900s | Patch [1]: | 10s | 100s | Current: | 3.5s | 34s | But the bulk insert execution time in current implementation strongly depends on MAX_BUFFERED_TUPLES/BYTES value and in my experiments was reduced to 50s. [1] https://www.postgresql.org/message-id/flat/3d0909dc-3691-a576-208a-90986e55489f%40postgrespro.ru -- regards, Andrey Lepikhov Postgres Professional --------------A0220516AB66D657E1AFFFE6 Content-Type: text/plain; charset=UTF-8; x-mac-type="0"; x-mac-creator="0"; name="0001-Implementation-of-a-Bulk-COPY-FROM.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="0001-Implementation-of-a-Bulk-COPY-FROM.patch" RnJvbSA3MTU0MDZjZTRhOThkZjRlMGFlY2RmZGY5ZDlmNTljZDNhMTMxMDFlIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiAiQW5kcmV5IFYuIExlcGlraG92IiA8YS5sZXBpa2hv dkBwb3N0Z3Jlc3Byby5ydT4KRGF0ZTogRnJpLCA0IEp1biAyMDIxIDEzOjIxOjQzICswNTAw ClN1YmplY3Q6IFtQQVRDSF0gSW1wbGVtZW50YXRpb24gb2YgYSBCdWxrICdDT1BZIEZST00g Li4uJyBvcGVyYXRpb24gaW50bwogZm9yZWlnbi9kaXN0cmlidXRlZCB0YWJsZS4KCi0tLQog Li4uL3Bvc3RncmVzX2Zkdy9leHBlY3RlZC9wb3N0Z3Jlc19mZHcub3V0ICAgIHwgIDQ2ICsr Ky0KIGNvbnRyaWIvcG9zdGdyZXNfZmR3L3NxbC9wb3N0Z3Jlc19mZHcuc3FsICAgICB8ICA0 NSArKysKIHNyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHlmcm9tLmMgICAgICAgICAgICAgICB8 IDI1OSArKysrKysrKy0tLS0tLS0tLS0KIHNyYy9iYWNrZW5kL2V4ZWN1dG9yL2V4ZWNNYWlu LmMgICAgICAgICAgICAgICB8ICA0NSArKysKIHNyYy9iYWNrZW5kL2V4ZWN1dG9yL2V4ZWNQ YXJ0aXRpb24uYyAgICAgICAgICB8ICAgOCArCiBzcmMvaW5jbHVkZS9jb21tYW5kcy9jb3B5 ZnJvbV9pbnRlcm5hbC5oICAgICAgfCAgMTAgLQogc3JjL2luY2x1ZGUvZXhlY3V0b3IvZXhl Y3V0b3IuaCAgICAgICAgICAgICAgIHwgICAxICsKIHNyYy9pbmNsdWRlL25vZGVzL2V4ZWNu b2Rlcy5oICAgICAgICAgICAgICAgICB8ICAgOCArLQogOCBmaWxlcyBjaGFuZ2VkLCAyNjEg aW5zZXJ0aW9ucygrKSwgMTYxIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2NvbnRyaWIv cG9zdGdyZXNfZmR3L2V4cGVjdGVkL3Bvc3RncmVzX2Zkdy5vdXQgYi9jb250cmliL3Bvc3Rn cmVzX2Zkdy9leHBlY3RlZC9wb3N0Z3Jlc19mZHcub3V0CmluZGV4IGYzMjBhNzU3OGQuLmNi MjY4MGM2YmQgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvcG9zdGdyZXNfZmR3L2V4cGVjdGVkL3Bv c3RncmVzX2Zkdy5vdXQKKysrIGIvY29udHJpYi9wb3N0Z3Jlc19mZHcvZXhwZWN0ZWQvcG9z dGdyZXNfZmR3Lm91dApAQCAtODE2NCw4ICs4MTY0LDkgQEAgY29weSByZW0yIGZyb20gc3Rk aW47CiBjb3B5IHJlbTIgZnJvbSBzdGRpbjsgLS0gRVJST1IKIEVSUk9SOiAgbmV3IHJvdyBm b3IgcmVsYXRpb24gImxvYzIiIHZpb2xhdGVzIGNoZWNrIGNvbnN0cmFpbnQgImxvYzJfZjFw b3NpdGl2ZSIKIERFVEFJTDogIEZhaWxpbmcgcm93IGNvbnRhaW5zICgtMSwgeHl6enkpLgot Q09OVEVYVDogIHJlbW90ZSBTUUwgY29tbWFuZDogSU5TRVJUIElOVE8gcHVibGljLmxvYzIo ZjEsIGYyKSBWQUxVRVMgKCQxLCAkMikKLUNPUFkgcmVtMiwgbGluZSAxOiAiLTEJeHl6enki CitDT05URVhUOiAgQ09QWSBsb2MyLCBsaW5lIDE6ICItMQl4eXp6eSIKK3JlbW90ZSBTUUwg Y29tbWFuZDogQ09QWSBwdWJsaWMubG9jMihmMSwgZjIpIEZST00gU1RESU4gCitDT1BZIHJl bTIsIGxpbmUgMgogc2VsZWN0ICogZnJvbSByZW0yOwogIGYxIHwgZjIgIAogLS0tLSstLS0t LQpAQCAtODE3Niw2ICs4MTc3LDE5IEBAIHNlbGVjdCAqIGZyb20gcmVtMjsKIGFsdGVyIGZv cmVpZ24gdGFibGUgcmVtMiBkcm9wIGNvbnN0cmFpbnQgcmVtMl9mMXBvc2l0aXZlOwogYWx0 ZXIgdGFibGUgbG9jMiBkcm9wIGNvbnN0cmFpbnQgbG9jMl9mMXBvc2l0aXZlOwogZGVsZXRl IGZyb20gcmVtMjsKK2NyZWF0ZSB0YWJsZSBmb28gKGEgaW50KSBwYXJ0aXRpb24gYnkgbGlz dCAoYSk7CitjcmVhdGUgdGFibGUgZm9vMSAobGlrZSBmb28pOworY3JlYXRlIGZvcmVpZ24g dGFibGUgZmZvbzEgcGFydGl0aW9uIG9mIGZvbyBmb3IgdmFsdWVzIGluICgxKQorCXNlcnZl ciBsb29wYmFjayBvcHRpb25zICh0YWJsZV9uYW1lICdmb28xJyk7CitjcmVhdGUgdGFibGUg Zm9vMiAobGlrZSBmb28pOworY3JlYXRlIGZvcmVpZ24gdGFibGUgZmZvbzIgcGFydGl0aW9u IG9mIGZvbyBmb3IgdmFsdWVzIGluICgyKQorCXNlcnZlciBsb29wYmFjayBvcHRpb25zICh0 YWJsZV9uYW1lICdmb28yJyk7CitjcmVhdGUgZnVuY3Rpb24gcHJpbnRfbmV3X3JvdygpIHJl dHVybnMgdHJpZ2dlciBsYW5ndWFnZSBwbHBnc3FsIGFzICQkCisJYmVnaW4gcmFpc2Ugbm90 aWNlICclJywgbmV3OyByZXR1cm4gbmV3OyBlbmQ7ICQkOworY3JlYXRlIHRyaWdnZXIgZmZv bzFfYnJfdHJpZyBiZWZvcmUgaW5zZXJ0IG9uIGZmb28xCisJZm9yIGVhY2ggcm93IGV4ZWN1 dGUgZnVuY3Rpb24gcHJpbnRfbmV3X3JvdygpOworY29weSBmb28gZnJvbSBzdGRpbjsKK05P VElDRTogICgxKQogLS0gVGVzdCBsb2NhbCB0cmlnZ2VycwogY3JlYXRlIHRyaWdnZXIgdHJp Z19zdG10X2JlZm9yZSBiZWZvcmUgaW5zZXJ0IG9uIHJlbTIKIAlmb3IgZWFjaCBzdGF0ZW1l bnQgZXhlY3V0ZSBwcm9jZWR1cmUgdHJpZ2dlcl9mdW5jKCk7CkBAIC04Mjg0LDYgKzgyOTgs MzQgQEAgZHJvcCB0cmlnZ2VyIHJlbTJfdHJpZ19yb3dfYmVmb3JlIG9uIHJlbTI7CiBkcm9w IHRyaWdnZXIgcmVtMl90cmlnX3Jvd19hZnRlciBvbiByZW0yOwogZHJvcCB0cmlnZ2VyIGxv YzJfdHJpZ19yb3dfYmVmb3JlX2luc2VydCBvbiBsb2MyOwogZGVsZXRlIGZyb20gcmVtMjsK K2FsdGVyIHRhYmxlIGxvYzIgZHJvcCBjb2x1bW4gZjE7CithbHRlciB0YWJsZSBsb2MyIGRy b3AgY29sdW1uIGYyOworY29weSByZW0yIGZyb20gc3RkaW47CitFUlJPUjogIGNvbHVtbiAi ZjEiIG9mIHJlbGF0aW9uICJsb2MyIiBkb2VzIG5vdCBleGlzdAorQ09OVEVYVDogIHJlbW90 ZSBTUUwgY29tbWFuZDogQ09QWSBwdWJsaWMubG9jMihmMSwgZjIpIEZST00gU1RESU4gCitD T1BZIHJlbTIsIGxpbmUgMworYWx0ZXIgdGFibGUgbG9jMiBhZGQgY29sdW1uIGYxIGludDsK K2FsdGVyIHRhYmxlIGxvYzIgYWRkIGNvbHVtbiBmMiBpbnQ7CitzZWxlY3QgKiBmcm9tIHJl bTI7CisgZjEgfCBmMiAKKy0tLS0rLS0tLQorKDAgcm93cykKKworLS0gZHJvcHBlZCBjb2x1 bW5zIGxvY2FsbHkgYW5kIG9uIHRoZSBmb3JlaWduIHNlcnZlcgorYWx0ZXIgdGFibGUgcmVt MiBkcm9wIGNvbHVtbiBmMTsKK2FsdGVyIHRhYmxlIHJlbTIgZHJvcCBjb2x1bW4gZjI7Citj b3B5IHJlbTIgZnJvbSBzdGRpbjsKK3NlbGVjdCAqIGZyb20gcmVtMjsKKy0tCisoMiByb3dz KQorCithbHRlciB0YWJsZSBsb2MyIGRyb3AgY29sdW1uIGYxOworYWx0ZXIgdGFibGUgbG9j MiBkcm9wIGNvbHVtbiBmMjsKK2NvcHkgcmVtMiBmcm9tIHN0ZGluOworc2VsZWN0ICogZnJv bSByZW0yOworLS0KKyg0IHJvd3MpCisKIC0tIHRlc3QgQ09QWSBGUk9NIHdpdGggZm9yZWln biB0YWJsZSBjcmVhdGVkIGluIHRoZSBzYW1lIHRyYW5zYWN0aW9uCiBjcmVhdGUgdGFibGUg bG9jMyAoZjEgaW50LCBmMiB0ZXh0KTsKIGJlZ2luOwpkaWZmIC0tZ2l0IGEvY29udHJpYi9w b3N0Z3Jlc19mZHcvc3FsL3Bvc3RncmVzX2Zkdy5zcWwgYi9jb250cmliL3Bvc3RncmVzX2Zk dy9zcWwvcG9zdGdyZXNfZmR3LnNxbAppbmRleCAxN2RiYTc3ZDdlLi41NTc2MzI4MzQ4IDEw MDY0NAotLS0gYS9jb250cmliL3Bvc3RncmVzX2Zkdy9zcWwvcG9zdGdyZXNfZmR3LnNxbAor KysgYi9jb250cmliL3Bvc3RncmVzX2Zkdy9zcWwvcG9zdGdyZXNfZmR3LnNxbApAQCAtMjI1 OCw2ICsyMjU4LDIzIEBAIGFsdGVyIHRhYmxlIGxvYzIgZHJvcCBjb25zdHJhaW50IGxvYzJf ZjFwb3NpdGl2ZTsKIAogZGVsZXRlIGZyb20gcmVtMjsKIAorY3JlYXRlIHRhYmxlIGZvbyAo YSBpbnQpIHBhcnRpdGlvbiBieSBsaXN0IChhKTsKK2NyZWF0ZSB0YWJsZSBmb28xIChsaWtl IGZvbyk7CitjcmVhdGUgZm9yZWlnbiB0YWJsZSBmZm9vMSBwYXJ0aXRpb24gb2YgZm9vIGZv ciB2YWx1ZXMgaW4gKDEpCisJc2VydmVyIGxvb3BiYWNrIG9wdGlvbnMgKHRhYmxlX25hbWUg J2ZvbzEnKTsKK2NyZWF0ZSB0YWJsZSBmb28yIChsaWtlIGZvbyk7CitjcmVhdGUgZm9yZWln biB0YWJsZSBmZm9vMiBwYXJ0aXRpb24gb2YgZm9vIGZvciB2YWx1ZXMgaW4gKDIpCisJc2Vy dmVyIGxvb3BiYWNrIG9wdGlvbnMgKHRhYmxlX25hbWUgJ2ZvbzInKTsKK2NyZWF0ZSBmdW5j dGlvbiBwcmludF9uZXdfcm93KCkgcmV0dXJucyB0cmlnZ2VyIGxhbmd1YWdlIHBscGdzcWwg YXMgJCQKKwliZWdpbiByYWlzZSBub3RpY2UgJyUnLCBuZXc7IHJldHVybiBuZXc7IGVuZDsg JCQ7CitjcmVhdGUgdHJpZ2dlciBmZm9vMV9icl90cmlnIGJlZm9yZSBpbnNlcnQgb24gZmZv bzEKKwlmb3IgZWFjaCByb3cgZXhlY3V0ZSBmdW5jdGlvbiBwcmludF9uZXdfcm93KCk7CisK K2NvcHkgZm9vIGZyb20gc3RkaW47CisxCisyCitcLgorCiAtLSBUZXN0IGxvY2FsIHRyaWdn ZXJzCiBjcmVhdGUgdHJpZ2dlciB0cmlnX3N0bXRfYmVmb3JlIGJlZm9yZSBpbnNlcnQgb24g cmVtMgogCWZvciBlYWNoIHN0YXRlbWVudCBleGVjdXRlIHByb2NlZHVyZSB0cmlnZ2VyX2Z1 bmMoKTsKQEAgLTIzNTgsNiArMjM3NSwzNCBAQCBkcm9wIHRyaWdnZXIgbG9jMl90cmlnX3Jv d19iZWZvcmVfaW5zZXJ0IG9uIGxvYzI7CiAKIGRlbGV0ZSBmcm9tIHJlbTI7CiAKK2FsdGVy IHRhYmxlIGxvYzIgZHJvcCBjb2x1bW4gZjE7CithbHRlciB0YWJsZSBsb2MyIGRyb3AgY29s dW1uIGYyOworY29weSByZW0yIGZyb20gc3RkaW47CisxCWZvbworMgliYXIKK1wuCisKK2Fs dGVyIHRhYmxlIGxvYzIgYWRkIGNvbHVtbiBmMSBpbnQ7CithbHRlciB0YWJsZSBsb2MyIGFk ZCBjb2x1bW4gZjIgaW50Oworc2VsZWN0ICogZnJvbSByZW0yOworCistLSBkcm9wcGVkIGNv bHVtbnMgbG9jYWxseSBhbmQgb24gdGhlIGZvcmVpZ24gc2VydmVyCithbHRlciB0YWJsZSBy ZW0yIGRyb3AgY29sdW1uIGYxOworYWx0ZXIgdGFibGUgcmVtMiBkcm9wIGNvbHVtbiBmMjsK K2NvcHkgcmVtMiBmcm9tIHN0ZGluOworCisKK1wuCitzZWxlY3QgKiBmcm9tIHJlbTI7CisK K2FsdGVyIHRhYmxlIGxvYzIgZHJvcCBjb2x1bW4gZjE7CithbHRlciB0YWJsZSBsb2MyIGRy b3AgY29sdW1uIGYyOworY29weSByZW0yIGZyb20gc3RkaW47CisKKworXC4KK3NlbGVjdCAq IGZyb20gcmVtMjsKKwogLS0gdGVzdCBDT1BZIEZST00gd2l0aCBmb3JlaWduIHRhYmxlIGNy ZWF0ZWQgaW4gdGhlIHNhbWUgdHJhbnNhY3Rpb24KIGNyZWF0ZSB0YWJsZSBsb2MzIChmMSBp bnQsIGYyIHRleHQpOwogYmVnaW47CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9jb21tYW5k cy9jb3B5ZnJvbS5jIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvY29weWZyb20uYwppbmRleCA0 MGE1NGFkMGJkLi40ZjY1NjAxYmFjIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9jb21tYW5k cy9jb3B5ZnJvbS5jCisrKyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHlmcm9tLmMKQEAg LTMxNyw1NCArMzE3LDc4IEBAIENvcHlNdWx0aUluc2VydEJ1ZmZlckZsdXNoKENvcHlNdWx0 aUluc2VydEluZm8gKm1paW5mbywKIAljc3RhdGUtPmxpbmVfYnVmX3ZhbGlkID0gZmFsc2U7 CiAJc2F2ZV9jdXJfbGluZW5vID0gY3N0YXRlLT5jdXJfbGluZW5vOwogCi0JLyoKLQkgKiB0 YWJsZV9tdWx0aV9pbnNlcnQgbWF5IGxlYWsgbWVtb3J5LCBzbyBzd2l0Y2ggdG8gc2hvcnQt bGl2ZWQgbWVtb3J5Ci0JICogY29udGV4dCBiZWZvcmUgY2FsbGluZyBpdC4KLQkgKi8KLQlv bGRjb250ZXh0ID0gTWVtb3J5Q29udGV4dFN3aXRjaFRvKEdldFBlclR1cGxlTWVtb3J5Q29u dGV4dChlc3RhdGUpKTsKLQl0YWJsZV9tdWx0aV9pbnNlcnQocmVzdWx0UmVsSW5mby0+cmlf UmVsYXRpb25EZXNjLAotCQkJCQkgICBzbG90cywKLQkJCQkJICAgbnVzZWQsCi0JCQkJCSAg IG15Y2lkLAotCQkJCQkgICB0aV9vcHRpb25zLAotCQkJCQkgICBidWZmZXItPmJpc3RhdGUp OwotCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRjb250ZXh0KTsKLQotCWZvciAoaSA9IDA7 IGkgPCBudXNlZDsgaSsrKQorCWlmIChyZXN1bHRSZWxJbmZvLT5yaV9SZWxhdGlvbkRlc2Mt PnJkX3JlbC0+cmVsa2luZCA9PSBSRUxLSU5EX0ZPUkVJR05fVEFCTEUpCisJeworCQlpbnQg c2VudCA9IDA7CisKKwkJQXNzZXJ0KHJlc3VsdFJlbEluZm8tPnJpX0JhdGNoU2l6ZSA+IDEg JiYKKwkJCSAgIHJlc3VsdFJlbEluZm8tPnJpX0Zkd1JvdXRpbmUtPkV4ZWNGb3JlaWduQmF0 Y2hJbnNlcnQgIT0gTlVMTCAmJgorCQkJICAgcmVzdWx0UmVsSW5mby0+cmlfRmR3Um91dGlu ZS0+R2V0Rm9yZWlnbk1vZGlmeUJhdGNoU2l6ZSAhPSBOVUxMKTsKKworCQkvKiBGbHVzaCBp bnRvIGZvcmVpZ24gdGFibGUgb3IgcGFydGl0aW9uICovCisJCWRvIHsKKwkJCWludCBiYXRj aF9zaXplID0gKHJlc3VsdFJlbEluZm8tPnJpX0JhdGNoU2l6ZSA8IG51c2VkIC0gc2VudCkg PworCQkJCQkJcmVzdWx0UmVsSW5mby0+cmlfQmF0Y2hTaXplIDogKG51c2VkIC0gc2VudCk7 CisKKwkJCXJlc3VsdFJlbEluZm8tPnJpX0Zkd1JvdXRpbmUtPkV4ZWNGb3JlaWduQmF0Y2hJ bnNlcnQoZXN0YXRlLAorCQkJCQkJCQkJCQkJCQkJCSByZXN1bHRSZWxJbmZvLAorCQkJCQkJ CQkJCQkJCQkJCSBzbG90cywKKwkJCQkJCQkJCQkJCQkJCQkgTlVMTCwKKwkJCQkJCQkJCQkJ CQkJCQkgJmJhdGNoX3NpemUpOworCQkJc2VudCArPSBiYXRjaF9zaXplOworCQl9IHdoaWxl IChzZW50IDwgbnVzZWQpOworCX0KKwllbHNlCiAJewogCQkvKgotCQkgKiBJZiB0aGVyZSBh cmUgYW55IGluZGV4ZXMsIHVwZGF0ZSB0aGVtIGZvciBhbGwgdGhlIGluc2VydGVkIHR1cGxl cywKLQkJICogYW5kIHJ1biBBRlRFUiBST1cgSU5TRVJUIHRyaWdnZXJzLgorCQkgKiB0YWJs ZV9tdWx0aV9pbnNlcnQgbWF5IGxlYWsgbWVtb3J5LCBzbyBzd2l0Y2ggdG8gc2hvcnQtbGl2 ZWQgbWVtb3J5CisJCSAqIGNvbnRleHQgYmVmb3JlIGNhbGxpbmcgaXQuCiAJCSAqLwotCQlp ZiAocmVzdWx0UmVsSW5mby0+cmlfTnVtSW5kaWNlcyA+IDApCi0JCXsKLQkJCUxpc3QJICAg KnJlY2hlY2tJbmRleGVzOwotCi0JCQljc3RhdGUtPmN1cl9saW5lbm8gPSBidWZmZXItPmxp bmVub3NbaV07Ci0JCQlyZWNoZWNrSW5kZXhlcyA9Ci0JCQkJRXhlY0luc2VydEluZGV4VHVw bGVzKHJlc3VsdFJlbEluZm8sCi0JCQkJCQkJCQkgIGJ1ZmZlci0+c2xvdHNbaV0sIGVzdGF0 ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJCQkJICBOVUxMLCBOSUwpOwotCQkJRXhlY0FSSW5z ZXJ0VHJpZ2dlcnMoZXN0YXRlLCByZXN1bHRSZWxJbmZvLAotCQkJCQkJCQkgc2xvdHNbaV0s IHJlY2hlY2tJbmRleGVzLAotCQkJCQkJCQkgY3N0YXRlLT50cmFuc2l0aW9uX2NhcHR1cmUp OwotCQkJbGlzdF9mcmVlKHJlY2hlY2tJbmRleGVzKTsKLQkJfQorCQlvbGRjb250ZXh0ID0g TWVtb3J5Q29udGV4dFN3aXRjaFRvKEdldFBlclR1cGxlTWVtb3J5Q29udGV4dChlc3RhdGUp KTsKKwkJdGFibGVfbXVsdGlfaW5zZXJ0KHJlc3VsdFJlbEluZm8tPnJpX1JlbGF0aW9uRGVz YywKKwkJCQkJCSAgIHNsb3RzLAorCQkJCQkJICAgbnVzZWQsCisJCQkJCQkgICBteWNpZCwK KwkJCQkJCSAgIHRpX29wdGlvbnMsCisJCQkJCQkgICBidWZmZXItPmJpc3RhdGUpOworCQlN ZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkY29udGV4dCk7CiAKLQkJLyoKLQkJICogVGhlcmUn cyBubyBpbmRleGVzLCBidXQgc2VlIGlmIHdlIG5lZWQgdG8gcnVuIEFGVEVSIFJPVyBJTlNF UlQKLQkJICogdHJpZ2dlcnMgYW55d2F5LgotCQkgKi8KLQkJZWxzZSBpZiAocmVzdWx0UmVs SW5mby0+cmlfVHJpZ0Rlc2MgIT0gTlVMTCAmJgotCQkJCSAocmVzdWx0UmVsSW5mby0+cmlf VHJpZ0Rlc2MtPnRyaWdfaW5zZXJ0X2FmdGVyX3JvdyB8fAotCQkJCSAgcmVzdWx0UmVsSW5m by0+cmlfVHJpZ0Rlc2MtPnRyaWdfaW5zZXJ0X25ld190YWJsZSkpCisJCWZvciAoaSA9IDA7 IGkgPCBudXNlZDsgaSsrKQogCQl7Ci0JCQljc3RhdGUtPmN1cl9saW5lbm8gPSBidWZmZXIt PmxpbmVub3NbaV07Ci0JCQlFeGVjQVJJbnNlcnRUcmlnZ2Vycyhlc3RhdGUsIHJlc3VsdFJl bEluZm8sCi0JCQkJCQkJCSBzbG90c1tpXSwgTklMLCBjc3RhdGUtPnRyYW5zaXRpb25fY2Fw dHVyZSk7Ci0JCX0KKwkJCS8qCisJCQkgKiBJZiB0aGVyZSBhcmUgYW55IGluZGV4ZXMsIHVw ZGF0ZSB0aGVtIGZvciBhbGwgdGhlIGluc2VydGVkIHR1cGxlcywKKwkJCSAqIGFuZCBydW4g QUZURVIgUk9XIElOU0VSVCB0cmlnZ2Vycy4KKwkJCSAqLworCQkJaWYgKHJlc3VsdFJlbElu Zm8tPnJpX051bUluZGljZXMgPiAwKQorCQkJeworCQkJCUxpc3QJICAgKnJlY2hlY2tJbmRl eGVzOworCisJCQkJY3N0YXRlLT5jdXJfbGluZW5vID0gYnVmZmVyLT5saW5lbm9zW2ldOwor CQkJCXJlY2hlY2tJbmRleGVzID0KKwkJCQkJRXhlY0luc2VydEluZGV4VHVwbGVzKHJlc3Vs dFJlbEluZm8sCisJCQkJCQkJCQkJICBidWZmZXItPnNsb3RzW2ldLCBlc3RhdGUsIGZhbHNl LCBmYWxzZSwKKwkJCQkJCQkJCQkgIE5VTEwsIE5JTCk7CisJCQkJRXhlY0FSSW5zZXJ0VHJp Z2dlcnMoZXN0YXRlLCByZXN1bHRSZWxJbmZvLAorCQkJCQkJCQkJIHNsb3RzW2ldLCByZWNo ZWNrSW5kZXhlcywKKwkJCQkJCQkJCSBjc3RhdGUtPnRyYW5zaXRpb25fY2FwdHVyZSk7CisJ CQkJbGlzdF9mcmVlKHJlY2hlY2tJbmRleGVzKTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFRo ZXJlJ3Mgbm8gaW5kZXhlcywgYnV0IHNlZSBpZiB3ZSBuZWVkIHRvIHJ1biBBRlRFUiBST1cg SU5TRVJUCisJCQkgKiB0cmlnZ2VycyBhbnl3YXkuCisJCQkgKi8KKwkJCWVsc2UgaWYgKHJl c3VsdFJlbEluZm8tPnJpX1RyaWdEZXNjICE9IE5VTEwgJiYKKwkJCQkJIChyZXN1bHRSZWxJ bmZvLT5yaV9UcmlnRGVzYy0+dHJpZ19pbnNlcnRfYWZ0ZXJfcm93IHx8CisJCQkJCSAgcmVz dWx0UmVsSW5mby0+cmlfVHJpZ0Rlc2MtPnRyaWdfaW5zZXJ0X25ld190YWJsZSkpCisJCQl7 CisJCQkJY3N0YXRlLT5jdXJfbGluZW5vID0gYnVmZmVyLT5saW5lbm9zW2ldOworCQkJCUV4 ZWNBUkluc2VydFRyaWdnZXJzKGVzdGF0ZSwgcmVzdWx0UmVsSW5mbywKKwkJCQkJCQkJCSBz bG90c1tpXSwgTklMLCBjc3RhdGUtPnRyYW5zaXRpb25fY2FwdHVyZSk7CisJCQl9CiAKLQkJ RXhlY0NsZWFyVHVwbGUoc2xvdHNbaV0pOworCQkJRXhlY0NsZWFyVHVwbGUoc2xvdHNbaV0p OworCQl9CiAJfQogCiAJLyogTWFyayB0aGF0IGFsbCBzbG90cyBhcmUgZnJlZSAqLwpAQCAt NTM4LDEzICs1NjIsMTEgQEAgQ29weUZyb20oQ29weUZyb21TdGF0ZSBjc3RhdGUpCiAJQ29t bWFuZElkCW15Y2lkID0gR2V0Q3VycmVudENvbW1hbmRJZCh0cnVlKTsKIAlpbnQJCQl0aV9v cHRpb25zID0gMDsgLyogc3RhcnQgd2l0aCBkZWZhdWx0IG9wdGlvbnMgZm9yIGluc2VydCAq LwogCUJ1bGtJbnNlcnRTdGF0ZSBiaXN0YXRlID0gTlVMTDsKLQlDb3B5SW5zZXJ0TWV0aG9k IGluc2VydE1ldGhvZDsKIAlDb3B5TXVsdGlJbnNlcnRJbmZvIG11bHRpSW5zZXJ0SW5mbyA9 IHswfTsJLyogcGFjaWZ5IGNvbXBpbGVyICovCiAJaW50NjQJCXByb2Nlc3NlZCA9IDA7CiAJ aW50NjQJCWV4Y2x1ZGVkID0gMDsKIAlib29sCQloYXNfYmVmb3JlX2luc2VydF9yb3dfdHJp ZzsKIAlib29sCQloYXNfaW5zdGVhZF9pbnNlcnRfcm93X3RyaWc7Ci0JYm9vbAkJbGVhZnBh cnRfdXNlX211bHRpX2luc2VydCA9IGZhbHNlOwogCiAJQXNzZXJ0KGNzdGF0ZS0+cmVsKTsK IAlBc3NlcnQobGlzdF9sZW5ndGgoY3N0YXRlLT5yYW5nZV90YWJsZSkgPT0gMSk7CkBAIC02 NTQsNiArNjc2LDMzIEBAIENvcHlGcm9tKENvcHlGcm9tU3RhdGUgY3N0YXRlKQogCXJlc3Vs dFJlbEluZm8gPSB0YXJnZXRfcmVzdWx0UmVsSW5mbyA9IG1ha2VOb2RlKFJlc3VsdFJlbElu Zm8pOwogCUV4ZWNJbml0UmVzdWx0UmVsYXRpb24oZXN0YXRlLCByZXN1bHRSZWxJbmZvLCAx KTsKIAorCUFzc2VydCghdGFyZ2V0X3Jlc3VsdFJlbEluZm8tPnJpX3VzZXNNdWx0aUluc2Vy dCk7CisKKwkvKgorCSAqIEl0J3MgZ2VuZXJhbGx5IG1vcmUgZWZmaWNpZW50IHRvIHByZXBh cmUgYSBidW5jaCBvZiB0dXBsZXMgZm9yCisJICogaW5zZXJ0aW9uLCBhbmQgaW5zZXJ0IHRo ZW0gaW4gYnVsaywgZm9yIGV4YW1wbGUsIHdpdGggb25lCisJICogdGFibGVfbXVsdGlfaW5z ZXJ0KCkgY2FsbCB0aGFuIGNhbGwgdGFibGVfdHVwbGVfaW5zZXJ0KCkgc2VwYXJhdGVseSBm b3IKKwkgKiBldmVyeSB0dXBsZS4gSG93ZXZlciwgdGhlcmUgYXJlIGEgbnVtYmVyIG9mIHJl YXNvbnMgd2h5IHdlIG1pZ2h0IG5vdCBiZQorCSAqIGFibGUgdG8gZG8gdGhpcy4gIEZvciBl eGFtcGxlLCBpZiB0aGVyZSBhbnkgdm9sYXRpbGUgZXhwcmVzc2lvbnMgaW4gdGhlCisJICog dGFibGUncyBkZWZhdWx0IHZhbHVlcyBvciBpbiB0aGUgc3RhdGVtZW50J3MgV0hFUkUgY2xh dXNlLCB3aGljaCBtYXkKKwkgKiBxdWVyeSB0aGUgdGFibGUgd2UgYXJlIGluc2VydGluZyBp bnRvLCBidWZmZXJpbmcgdHVwbGVzIG1pZ2h0IHByb2R1Y2UKKwkgKiB3cm9uZyByZXN1bHRz LiAgQWxzbywgdGhlIHJlbGF0aW9uIHdlIGFyZSB0cnlpbmcgdG8gaW5zZXJ0IGludG8gaXRz ZWxmCisJICogbWF5IG5vdCBiZSBhbWVuYWJsZSB0byBidWZmZXJlZCBpbnNlcnRzLgorCSAq CisJICogTm90ZTogRm9yIHBhcnRpdGlvbnMsIHRoaXMgZmxhZyBpcyBzZXQgY29uc2lkZXJp bmcgdGhlIHRhcmdldCB0YWJsZSdzCisJICogZmxhZyB0aGF0IGlzIGJlaW5nIHNldCBoZXJl IGFuZCBwYXJ0aXRpb24ncyBvd24gcHJvcGVydGllcyB3aGljaCBhcmUKKwkgKiBjaGVja2Vk IGJ5IGNhbGxpbmcgRXhlY011bHRpSW5zZXJ0QWxsb3dlZCgpLiAgSXQgZG9lcyBub3QgbWF0 dGVyCisJICogd2hldGhlciBwYXJ0aXRpb25zIGhhdmUgYW55IHZvbGF0aWxlIGRlZmF1bHQg ZXhwcmVzc2lvbnMgYXMgd2UgdXNlIHRoZQorCSAqIGRlZmF1bHRzIGZyb20gdGhlIHRhcmdl dCBvZiB0aGUgQ09QWSBjb21tYW5kLgorCSAqIEFsc28sIHRoZSBDT1BZIGNvbW1hbmQgcmVx dWlyZXMgYSBub24temVybyBpbnB1dCBsaXN0IG9mIGF0dHJpYnV0ZXMuCisJICogVGhlcmVm b3JlLCB0aGUgbGVuZ3RoIG9mIHRoZSBhdHRyaWJ1dGUgbGlzdCBpcyBjaGVja2VkIGhlcmUu CisJICovCisJaWYgKCFjc3RhdGUtPnZvbGF0aWxlX2RlZmV4cHJzICYmCisJCWxpc3RfbGVu Z3RoKGNzdGF0ZS0+YXR0bnVtbGlzdCkgPiAwICYmCisJCSFjb250YWluX3ZvbGF0aWxlX2Z1 bmN0aW9ucyhjc3RhdGUtPndoZXJlQ2xhdXNlKSkKKwkJdGFyZ2V0X3Jlc3VsdFJlbEluZm8t PnJpX3VzZXNNdWx0aUluc2VydCA9CisJCQkJCUV4ZWNNdWx0aUluc2VydEFsbG93ZWQodGFy Z2V0X3Jlc3VsdFJlbEluZm8pOworCiAJLyogVmVyaWZ5IHRoZSBuYW1lZCByZWxhdGlvbiBp cyBhIHZhbGlkIHRhcmdldCBmb3IgSU5TRVJUICovCiAJQ2hlY2tWYWxpZFJlc3VsdFJlbChy ZXN1bHRSZWxJbmZvLCBDTURfSU5TRVJUKTsKIApAQCAtNjc2LDYgKzcyNSwxMiBAQCBDb3B5 RnJvbShDb3B5RnJvbVN0YXRlIGNzdGF0ZSkKIAkJcmVzdWx0UmVsSW5mby0+cmlfRmR3Um91 dGluZS0+QmVnaW5Gb3JlaWduSW5zZXJ0KG10c3RhdGUsCiAJCQkJCQkJCQkJCQkJCSByZXN1 bHRSZWxJbmZvKTsKIAorCWlmICh0YXJnZXRfcmVzdWx0UmVsSW5mby0+cmlfdXNlc011bHRp SW5zZXJ0ICYmCisJCXJlc3VsdFJlbEluZm8tPnJpX0Zkd1JvdXRpbmUgIT0gTlVMTCAmJgor CQlyZXN1bHRSZWxJbmZvLT5yaV9GZHdSb3V0aW5lLT5HZXRGb3JlaWduTW9kaWZ5QmF0Y2hT aXplICE9IE5VTEwpCisJCXJlc3VsdFJlbEluZm8tPnJpX0JhdGNoU2l6ZSA9CisJCQlyZXN1 bHRSZWxJbmZvLT5yaV9GZHdSb3V0aW5lLT5HZXRGb3JlaWduTW9kaWZ5QmF0Y2hTaXplKHJl c3VsdFJlbEluZm8pOworCiAJLyogUHJlcGFyZSB0byBjYXRjaCBBRlRFUiB0cmlnZ2Vycy4g Ki8KIAlBZnRlclRyaWdnZXJCZWdpblF1ZXJ5KCk7CiAKQEAgLTcwMyw4MyArNzU4LDkgQEAg Q29weUZyb20oQ29weUZyb21TdGF0ZSBjc3RhdGUpCiAJCWNzdGF0ZS0+cXVhbGV4cHIgPSBF eGVjSW5pdFF1YWwoY2FzdE5vZGUoTGlzdCwgY3N0YXRlLT53aGVyZUNsYXVzZSksCiAJCQkJ CQkJCQkJJm10c3RhdGUtPnBzKTsKIAotCS8qCi0JICogSXQncyBnZW5lcmFsbHkgbW9yZSBl ZmZpY2llbnQgdG8gcHJlcGFyZSBhIGJ1bmNoIG9mIHR1cGxlcyBmb3IKLQkgKiBpbnNlcnRp b24sIGFuZCBpbnNlcnQgdGhlbSBpbiBvbmUgdGFibGVfbXVsdGlfaW5zZXJ0KCkgY2FsbCwg dGhhbiBjYWxsCi0JICogdGFibGVfdHVwbGVfaW5zZXJ0KCkgc2VwYXJhdGVseSBmb3IgZXZl cnkgdHVwbGUuIEhvd2V2ZXIsIHRoZXJlIGFyZSBhCi0JICogbnVtYmVyIG9mIHJlYXNvbnMg d2h5IHdlIG1pZ2h0IG5vdCBiZSBhYmxlIHRvIGRvIHRoaXMuICBUaGVzZSBhcmUKLQkgKiBl eHBsYWluZWQgYmVsb3cuCi0JICovCi0JaWYgKHJlc3VsdFJlbEluZm8tPnJpX1RyaWdEZXNj ICE9IE5VTEwgJiYKLQkJKHJlc3VsdFJlbEluZm8tPnJpX1RyaWdEZXNjLT50cmlnX2luc2Vy dF9iZWZvcmVfcm93IHx8Ci0JCSByZXN1bHRSZWxJbmZvLT5yaV9UcmlnRGVzYy0+dHJpZ19p bnNlcnRfaW5zdGVhZF9yb3cpKQotCXsKLQkJLyoKLQkJICogQ2FuJ3Qgc3VwcG9ydCBtdWx0 aS1pbnNlcnRzIHdoZW4gdGhlcmUgYXJlIGFueSBCRUZPUkUvSU5TVEVBRCBPRgotCQkgKiB0 cmlnZ2VycyBvbiB0aGUgdGFibGUuIFN1Y2ggdHJpZ2dlcnMgbWlnaHQgcXVlcnkgdGhlIHRh YmxlIHdlJ3JlCi0JCSAqIGluc2VydGluZyBpbnRvIGFuZCBhY3QgZGlmZmVyZW50bHkgaWYg dGhlIHR1cGxlcyB0aGF0IGhhdmUgYWxyZWFkeQotCQkgKiBiZWVuIHByb2Nlc3NlZCBhbmQg cHJlcGFyZWQgZm9yIGluc2VydGlvbiBhcmUgbm90IHRoZXJlLgotCQkgKi8KLQkJaW5zZXJ0 TWV0aG9kID0gQ0lNX1NJTkdMRTsKLQl9Ci0JZWxzZSBpZiAocHJvdXRlICE9IE5VTEwgJiYg cmVzdWx0UmVsSW5mby0+cmlfVHJpZ0Rlc2MgIT0gTlVMTCAmJgotCQkJIHJlc3VsdFJlbElu Zm8tPnJpX1RyaWdEZXNjLT50cmlnX2luc2VydF9uZXdfdGFibGUpCi0JewotCQkvKgotCQkg KiBGb3IgcGFydGl0aW9uZWQgdGFibGVzIHdlIGNhbid0IHN1cHBvcnQgbXVsdGktaW5zZXJ0 cyB3aGVuIHRoZXJlCi0JCSAqIGFyZSBhbnkgc3RhdGVtZW50IGxldmVsIGluc2VydCB0cmln Z2Vycy4gSXQgbWlnaHQgYmUgcG9zc2libGUgdG8KLQkJICogYWxsb3cgcGFydGl0aW9uZWQg dGFibGVzIHdpdGggc3VjaCB0cmlnZ2VycyBpbiB0aGUgZnV0dXJlLCBidXQgZm9yCi0JCSAq IG5vdywgQ29weU11bHRpSW5zZXJ0SW5mb0ZsdXNoIGV4cGVjdHMgdGhhdCBhbnkgYmVmb3Jl IHJvdyBpbnNlcnQKLQkJICogYW5kIHN0YXRlbWVudCBsZXZlbCBpbnNlcnQgdHJpZ2dlcnMg YXJlIG9uIHRoZSBzYW1lIHJlbGF0aW9uLgotCQkgKi8KLQkJaW5zZXJ0TWV0aG9kID0gQ0lN X1NJTkdMRTsKLQl9Ci0JZWxzZSBpZiAocmVzdWx0UmVsSW5mby0+cmlfRmR3Um91dGluZSAh PSBOVUxMIHx8Ci0JCQkgY3N0YXRlLT52b2xhdGlsZV9kZWZleHBycykKLQl7Ci0JCS8qCi0J CSAqIENhbid0IHN1cHBvcnQgbXVsdGktaW5zZXJ0cyB0byBmb3JlaWduIHRhYmxlcyBvciBp ZiB0aGVyZSBhcmUgYW55Ci0JCSAqIHZvbGF0aWxlIGRlZmF1bHQgZXhwcmVzc2lvbnMgaW4g dGhlIHRhYmxlLiAgU2ltaWxhcmx5IHRvIHRoZQotCQkgKiB0cmlnZ2VyIGNhc2UgYWJvdmUs IHN1Y2ggZXhwcmVzc2lvbnMgbWF5IHF1ZXJ5IHRoZSB0YWJsZSB3ZSdyZQotCQkgKiBpbnNl cnRpbmcgaW50by4KLQkJICoKLQkJICogTm90ZTogSXQgZG9lcyBub3QgbWF0dGVyIGlmIGFu eSBwYXJ0aXRpb25zIGhhdmUgYW55IHZvbGF0aWxlCi0JCSAqIGRlZmF1bHQgZXhwcmVzc2lv bnMgYXMgd2UgdXNlIHRoZSBkZWZhdWx0cyBmcm9tIHRoZSB0YXJnZXQgb2YgdGhlCi0JCSAq IENPUFkgY29tbWFuZC4KLQkJICovCi0JCWluc2VydE1ldGhvZCA9IENJTV9TSU5HTEU7Ci0J fQotCWVsc2UgaWYgKGNvbnRhaW5fdm9sYXRpbGVfZnVuY3Rpb25zKGNzdGF0ZS0+d2hlcmVD bGF1c2UpKQotCXsKLQkJLyoKLQkJICogQ2FuJ3Qgc3VwcG9ydCBtdWx0aS1pbnNlcnRzIGlm IHRoZXJlIGFyZSBhbnkgdm9sYXRpbGUgZnVuY3Rpb24KLQkJICogZXhwcmVzc2lvbnMgaW4g V0hFUkUgY2xhdXNlLiAgU2ltaWxhcmx5IHRvIHRoZSB0cmlnZ2VyIGNhc2UgYWJvdmUsCi0J CSAqIHN1Y2ggZXhwcmVzc2lvbnMgbWF5IHF1ZXJ5IHRoZSB0YWJsZSB3ZSdyZSBpbnNlcnRp bmcgaW50by4KLQkJICovCi0JCWluc2VydE1ldGhvZCA9IENJTV9TSU5HTEU7Ci0JfQotCWVs c2UKLQl7Ci0JCS8qCi0JCSAqIEZvciBwYXJ0aXRpb25lZCB0YWJsZXMsIHdlIG1heSBzdGls bCBiZSBhYmxlIHRvIHBlcmZvcm0gYnVsawotCQkgKiBpbnNlcnRzLiAgSG93ZXZlciwgdGhl IHBvc3NpYmlsaXR5IG9mIHRoaXMgZGVwZW5kcyBvbiB3aGljaCB0eXBlcwotCQkgKiBvZiB0 cmlnZ2VycyBleGlzdCBvbiB0aGUgcGFydGl0aW9uLiAgV2UgbXVzdCBkaXNhYmxlIGJ1bGsg aW5zZXJ0cwotCQkgKiBpZiB0aGUgcGFydGl0aW9uIGlzIGEgZm9yZWlnbiB0YWJsZSBvciBp dCBoYXMgYW55IGJlZm9yZSByb3cgaW5zZXJ0Ci0JCSAqIG9yIGluc2VydCBpbnN0ZWFkIHRy aWdnZXJzIChzYW1lIGFzIHdlIGNoZWNrZWQgYWJvdmUgZm9yIHRoZSBwYXJlbnQKLQkJICog dGFibGUpLiAgU2luY2UgdGhlIHBhcnRpdGlvbidzIHJlc3VsdFJlbEluZm9zIGFyZSBpbml0 aWFsaXplZCBvbmx5Ci0JCSAqIHdoZW4gd2UgYWN0dWFsbHkgbmVlZCB0byBpbnNlcnQgdGhl IGZpcnN0IHR1cGxlIGludG8gdGhlbSwgd2UgbXVzdAotCQkgKiBoYXZlIHRoZSBpbnRlcm1l ZGlhdGUgaW5zZXJ0IG1ldGhvZCBvZiBDSU1fTVVMVElfQ09ORElUSU9OQUwgdG8KLQkJICog ZmxhZyB0aGF0IHdlIG11c3QgbGF0ZXIgZGV0ZXJtaW5lIGlmIHdlIGNhbiB1c2UgYnVsay1p bnNlcnRzIGZvcgotCQkgKiB0aGUgcGFydGl0aW9uIGJlaW5nIGluc2VydGVkIGludG8uCi0J CSAqLwotCQlpZiAocHJvdXRlKQotCQkJaW5zZXJ0TWV0aG9kID0gQ0lNX01VTFRJX0NPTkRJ VElPTkFMOwotCQllbHNlCi0JCQlpbnNlcnRNZXRob2QgPSBDSU1fTVVMVEk7Ci0KKwlpZiAo cmVzdWx0UmVsSW5mby0+cmlfdXNlc011bHRpSW5zZXJ0KQogCQlDb3B5TXVsdGlJbnNlcnRJ bmZvSW5pdCgmbXVsdGlJbnNlcnRJbmZvLCByZXN1bHRSZWxJbmZvLCBjc3RhdGUsCiAJCQkJ CQkJCWVzdGF0ZSwgbXljaWQsIHRpX29wdGlvbnMpOwotCX0KIAogCS8qCiAJICogSWYgbm90 IHVzaW5nIGJhdGNoIG1vZGUgKHdoaWNoIGFsbG9jYXRlcyBzbG90cyBhcyBuZWVkZWQpIHNl dCB1cCBhCkBAIC03ODcsNyArNzY4LDcgQEAgQ29weUZyb20oQ29weUZyb21TdGF0ZSBjc3Rh dGUpCiAJICogb25lLCBldmVuIGlmIHdlIG1pZ2h0IGJhdGNoIGluc2VydCwgdG8gcmVhZCB0 aGUgdHVwbGUgaW4gdGhlIHJvb3QKIAkgKiBwYXJ0aXRpb24ncyBmb3JtLgogCSAqLwotCWlm IChpbnNlcnRNZXRob2QgPT0gQ0lNX1NJTkdMRSB8fCBpbnNlcnRNZXRob2QgPT0gQ0lNX01V TFRJX0NPTkRJVElPTkFMKQorCWlmICghcmVzdWx0UmVsSW5mby0+cmlfdXNlc011bHRpSW5z ZXJ0IHx8IHByb3V0ZSkKIAl7CiAJCXNpbmdsZXNsb3QgPSB0YWJsZV9zbG90X2NyZWF0ZShy ZXN1bHRSZWxJbmZvLT5yaV9SZWxhdGlvbkRlc2MsCiAJCQkJCQkJCQkgICAmZXN0YXRlLT5l c190dXBsZVRhYmxlKTsKQEAgLTgzMCw3ICs4MTEsNyBAQCBDb3B5RnJvbShDb3B5RnJvbVN0 YXRlIGNzdGF0ZSkKIAkJUmVzZXRQZXJUdXBsZUV4cHJDb250ZXh0KGVzdGF0ZSk7CiAKIAkJ Lyogc2VsZWN0IHNsb3QgdG8gKGluaXRpYWxseSkgbG9hZCByb3cgaW50byAqLwotCQlpZiAo aW5zZXJ0TWV0aG9kID09IENJTV9TSU5HTEUgfHwgcHJvdXRlKQorCQlpZiAoIXRhcmdldF9y ZXN1bHRSZWxJbmZvLT5yaV91c2VzTXVsdGlJbnNlcnQgfHwgcHJvdXRlKQogCQl7CiAJCQlt eXNsb3QgPSBzaW5nbGVzbG90OwogCQkJQXNzZXJ0KG15c2xvdCAhPSBOVUxMKTsKQEAgLTgz OCw3ICs4MTksNiBAQCBDb3B5RnJvbShDb3B5RnJvbVN0YXRlIGNzdGF0ZSkKIAkJZWxzZQog CQl7CiAJCQlBc3NlcnQocmVzdWx0UmVsSW5mbyA9PSB0YXJnZXRfcmVzdWx0UmVsSW5mbyk7 Ci0JCQlBc3NlcnQoaW5zZXJ0TWV0aG9kID09IENJTV9NVUxUSSk7CiAKIAkJCW15c2xvdCA9 IENvcHlNdWx0aUluc2VydEluZm9OZXh0RnJlZVNsb3QoJm11bHRpSW5zZXJ0SW5mbywKIAkJ CQkJCQkJCQkJCQkgcmVzdWx0UmVsSW5mbyk7CkBAIC05MDUsMjQgKzg4NSwxNCBAQCBDb3B5 RnJvbShDb3B5RnJvbVN0YXRlIGNzdGF0ZSkKIAkJCQloYXNfaW5zdGVhZF9pbnNlcnRfcm93 X3RyaWcgPSAocmVzdWx0UmVsSW5mby0+cmlfVHJpZ0Rlc2MgJiYKIAkJCQkJCQkJCQkJICAg cmVzdWx0UmVsSW5mby0+cmlfVHJpZ0Rlc2MtPnRyaWdfaW5zZXJ0X2luc3RlYWRfcm93KTsK IAotCQkJCS8qCi0JCQkJICogRGlzYWJsZSBtdWx0aS1pbnNlcnRzIHdoZW4gdGhlIHBhcnRp dGlvbiBoYXMgQkVGT1JFL0lOU1RFQUQKLQkJCQkgKiBPRiB0cmlnZ2Vycywgb3IgaWYgdGhl IHBhcnRpdGlvbiBpcyBhIGZvcmVpZ24gcGFydGl0aW9uLgotCQkJCSAqLwotCQkJCWxlYWZw YXJ0X3VzZV9tdWx0aV9pbnNlcnQgPSBpbnNlcnRNZXRob2QgPT0gQ0lNX01VTFRJX0NPTkRJ VElPTkFMICYmCi0JCQkJCSFoYXNfYmVmb3JlX2luc2VydF9yb3dfdHJpZyAmJgotCQkJCQkh aGFzX2luc3RlYWRfaW5zZXJ0X3Jvd190cmlnICYmCi0JCQkJCXJlc3VsdFJlbEluZm8tPnJp X0Zkd1JvdXRpbmUgPT0gTlVMTDsKLQogCQkJCS8qIFNldCB0aGUgbXVsdGktaW5zZXJ0IGJ1 ZmZlciB0byB1c2UgZm9yIHRoaXMgcGFydGl0aW9uLiAqLwotCQkJCWlmIChsZWFmcGFydF91 c2VfbXVsdGlfaW5zZXJ0KQorCQkJCWlmIChyZXN1bHRSZWxJbmZvLT5yaV91c2VzTXVsdGlJ bnNlcnQpCiAJCQkJewogCQkJCQlpZiAocmVzdWx0UmVsSW5mby0+cmlfQ29weU11bHRpSW5z ZXJ0QnVmZmVyID09IE5VTEwpCiAJCQkJCQlDb3B5TXVsdGlJbnNlcnRJbmZvU2V0dXBCdWZm ZXIoJm11bHRpSW5zZXJ0SW5mbywKIAkJCQkJCQkJCQkJCQkgICByZXN1bHRSZWxJbmZvKTsK IAkJCQl9Ci0JCQkJZWxzZSBpZiAoaW5zZXJ0TWV0aG9kID09IENJTV9NVUxUSV9DT05ESVRJ T05BTCAmJgotCQkJCQkJICFDb3B5TXVsdGlJbnNlcnRJbmZvSXNFbXB0eSgmbXVsdGlJbnNl cnRJbmZvKSkKKwkJCQllbHNlIGlmICghQ29weU11bHRpSW5zZXJ0SW5mb0lzRW1wdHkoJm11 bHRpSW5zZXJ0SW5mbykpCiAJCQkJewogCQkJCQkvKgogCQkJCQkgKiBGbHVzaCBwZW5kaW5n IGluc2VydHMgaWYgdGhpcyBwYXJ0aXRpb24gY2FuJ3QgdXNlCkBAIC05NTIsNyArOTIyLDcg QEAgQ29weUZyb20oQ29weUZyb21TdGF0ZSBjc3RhdGUpCiAJCQkgKiByb3d0eXBlLgogCQkJ ICovCiAJCQltYXAgPSByZXN1bHRSZWxJbmZvLT5yaV9Sb290VG9QYXJ0aXRpb25NYXA7Ci0J CQlpZiAoaW5zZXJ0TWV0aG9kID09IENJTV9TSU5HTEUgfHwgIWxlYWZwYXJ0X3VzZV9tdWx0 aV9pbnNlcnQpCisJCQlpZiAoIXJlc3VsdFJlbEluZm8tPnJpX3VzZXNNdWx0aUluc2VydCkK IAkJCXsKIAkJCQkvKiBub24gYmF0Y2ggaW5zZXJ0ICovCiAJCQkJaWYgKG1hcCAhPSBOVUxM KQpAQCAtOTcxLDkgKzk0MSw2IEBAIENvcHlGcm9tKENvcHlGcm9tU3RhdGUgY3N0YXRlKQog CQkJCSAqLwogCQkJCVR1cGxlVGFibGVTbG90ICpiYXRjaHNsb3Q7CiAKLQkJCQkvKiBubyBv dGhlciBwYXRoIGF2YWlsYWJsZSBmb3IgcGFydGl0aW9uZWQgdGFibGUgKi8KLQkJCQlBc3Nl cnQoaW5zZXJ0TWV0aG9kID09IENJTV9NVUxUSV9DT05ESVRJT05BTCk7Ci0KIAkJCQliYXRj aHNsb3QgPSBDb3B5TXVsdGlJbnNlcnRJbmZvTmV4dEZyZWVTbG90KCZtdWx0aUluc2VydElu Zm8sCiAJCQkJCQkJCQkJCQkJCQlyZXN1bHRSZWxJbmZvKTsKIApAQCAtMTA0NSw3ICsxMDEy LDcgQEAgQ29weUZyb20oQ29weUZyb21TdGF0ZSBjc3RhdGUpCiAJCQkJCUV4ZWNQYXJ0aXRp b25DaGVjayhyZXN1bHRSZWxJbmZvLCBteXNsb3QsIGVzdGF0ZSwgdHJ1ZSk7CiAKIAkJCQkv KiBTdG9yZSB0aGUgc2xvdCBpbiB0aGUgbXVsdGktaW5zZXJ0IGJ1ZmZlciwgd2hlbiBlbmFi bGVkLiAqLwotCQkJCWlmIChpbnNlcnRNZXRob2QgPT0gQ0lNX01VTFRJIHx8IGxlYWZwYXJ0 X3VzZV9tdWx0aV9pbnNlcnQpCisJCQkJaWYgKHJlc3VsdFJlbEluZm8tPnJpX3VzZXNNdWx0 aUluc2VydCkKIAkJCQl7CiAJCQkJCS8qCiAJCQkJCSAqIFRoZSBzbG90IHByZXZpb3VzbHkg bWlnaHQgcG9pbnQgaW50byB0aGUgcGVyLXR1cGxlCkBAIC0xMTI0LDExICsxMDkxLDggQEAg Q29weUZyb20oQ29weUZyb21TdGF0ZSBjc3RhdGUpCiAJfQogCiAJLyogRmx1c2ggYW55IHJl bWFpbmluZyBidWZmZXJlZCB0dXBsZXMgKi8KLQlpZiAoaW5zZXJ0TWV0aG9kICE9IENJTV9T SU5HTEUpCi0JewotCQlpZiAoIUNvcHlNdWx0aUluc2VydEluZm9Jc0VtcHR5KCZtdWx0aUlu c2VydEluZm8pKQotCQkJQ29weU11bHRpSW5zZXJ0SW5mb0ZsdXNoKCZtdWx0aUluc2VydElu Zm8sIE5VTEwpOwotCX0KKwlpZiAoIUNvcHlNdWx0aUluc2VydEluZm9Jc0VtcHR5KCZtdWx0 aUluc2VydEluZm8pKQorCQlDb3B5TXVsdGlJbnNlcnRJbmZvRmx1c2goJm11bHRpSW5zZXJ0 SW5mbywgTlVMTCk7CiAKIAkvKiBEb25lLCBjbGVhbiB1cCAqLwogCWVycm9yX2NvbnRleHRf c3RhY2sgPSBlcnJjYWxsYmFjay5wcmV2aW91czsKQEAgLTExNDksMTIgKzExMTMsMTEgQEAg Q29weUZyb20oQ29weUZyb21TdGF0ZSBjc3RhdGUpCiAJLyogQWxsb3cgdGhlIEZEVyB0byBz aHV0IGRvd24gKi8KIAlpZiAodGFyZ2V0X3Jlc3VsdFJlbEluZm8tPnJpX0Zkd1JvdXRpbmUg IT0gTlVMTCAmJgogCQl0YXJnZXRfcmVzdWx0UmVsSW5mby0+cmlfRmR3Um91dGluZS0+RW5k Rm9yZWlnbkluc2VydCAhPSBOVUxMKQotCQl0YXJnZXRfcmVzdWx0UmVsSW5mby0+cmlfRmR3 Um91dGluZS0+RW5kRm9yZWlnbkluc2VydChlc3RhdGUsCi0JCQkJCQkJCQkJCQkJCQkgIHRh cmdldF9yZXN1bHRSZWxJbmZvKTsKKwkJCXRhcmdldF9yZXN1bHRSZWxJbmZvLT5yaV9GZHdS b3V0aW5lLT5FbmRGb3JlaWduSW5zZXJ0KGVzdGF0ZSwKKwkJCQkJCQkJCQkJCQkJdGFyZ2V0 X3Jlc3VsdFJlbEluZm8pOwogCiAJLyogVGVhciBkb3duIHRoZSBtdWx0aS1pbnNlcnQgYnVm ZmVyIGRhdGEgKi8KLQlpZiAoaW5zZXJ0TWV0aG9kICE9IENJTV9TSU5HTEUpCi0JCUNvcHlN dWx0aUluc2VydEluZm9DbGVhbnVwKCZtdWx0aUluc2VydEluZm8pOworCUNvcHlNdWx0aUlu c2VydEluZm9DbGVhbnVwKCZtdWx0aUluc2VydEluZm8pOwogCiAJLyogQ2xvc2UgYWxsIHRo ZSBwYXJ0aXRpb25lZCB0YWJsZXMsIGxlYWYgcGFydGl0aW9ucywgYW5kIHRoZWlyIGluZGlj ZXMgKi8KIAlpZiAocHJvdXRlKQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvZXhlY3V0b3Iv ZXhlY01haW4uYyBiL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL2V4ZWNNYWluLmMKaW5kZXggYjNj ZTRiYWU1My4uOTIyZTgwMDg5YyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvZXhlY3V0b3Iv ZXhlY01haW4uYworKysgYi9zcmMvYmFja2VuZC9leGVjdXRvci9leGVjTWFpbi5jCkBAIC0x MjU2LDkgKzEyNTYsNTQgQEAgSW5pdFJlc3VsdFJlbEluZm8oUmVzdWx0UmVsSW5mbyAqcmVz dWx0UmVsSW5mbywKIAlyZXN1bHRSZWxJbmZvLT5yaV9QYXJ0aXRpb25UdXBsZVNsb3QgPSBO VUxMOwkvKiBkaXR0byAqLwogCXJlc3VsdFJlbEluZm8tPnJpX0NoaWxkVG9Sb290TWFwID0g TlVMTDsKIAlyZXN1bHRSZWxJbmZvLT5yaV9DaGlsZFRvUm9vdE1hcFZhbGlkID0gZmFsc2U7 CisJcmVzdWx0UmVsSW5mby0+cmlfdXNlc011bHRpSW5zZXJ0ID0gZmFsc2U7CiAJcmVzdWx0 UmVsSW5mby0+cmlfQ29weU11bHRpSW5zZXJ0QnVmZmVyID0gTlVMTDsKIH0KIAorLyoKKyAq IEV4ZWNNdWx0aUluc2VydEFsbG93ZWQKKyAqCQlEb2VzIHRoaXMgcmVsYXRpb24gYWxsb3cg Y2FsbGVyIHRvIHVzZSBtdWx0aS1pbnNlcnQgbW9kZSB3aGVuCisgKgkJaW5zZXJ0aW5nIHJv d3MgaW50byBpdD8KKyAqLworYm9vbAorRXhlY011bHRpSW5zZXJ0QWxsb3dlZChjb25zdCBS ZXN1bHRSZWxJbmZvICpycmkpCit7CisJLyoKKwkgKiBDYW4ndCBzdXBwb3J0IG11bHRpLWlu c2VydHMgd2hlbiB0aGVyZSBhcmUgYW55IEJFRk9SRS9JTlNURUFEIE9GCisJICogdHJpZ2dl cnMgb24gdGhlIHRhYmxlLiBTdWNoIHRyaWdnZXJzIG1pZ2h0IHF1ZXJ5IHRoZSB0YWJsZSB3 ZSdyZQorCSAqIGluc2VydGluZyBpbnRvIGFuZCBhY3QgZGlmZmVyZW50bHkgaWYgdGhlIHR1 cGxlcyB0aGF0IGhhdmUgYWxyZWFkeQorCSAqIGJlZW4gcHJvY2Vzc2VkIGFuZCBwcmVwYXJl ZCBmb3IgaW5zZXJ0aW9uIGFyZSBub3QgdGhlcmUuCisJICovCisJaWYgKHJyaS0+cmlfVHJp Z0Rlc2MgIT0gTlVMTCAmJgorCQkocnJpLT5yaV9UcmlnRGVzYy0+dHJpZ19pbnNlcnRfYmVm b3JlX3JvdyB8fAorCQkgcnJpLT5yaV9UcmlnRGVzYy0+dHJpZ19pbnNlcnRfaW5zdGVhZF9y b3cpKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKgorCSAqIEZvciBwYXJ0aXRpb25lZCB0YWJs ZXMgd2UgY2FuJ3Qgc3VwcG9ydCBtdWx0aS1pbnNlcnRzIHdoZW4gdGhlcmUgYXJlCisJICog YW55IHN0YXRlbWVudCBsZXZlbCBpbnNlcnQgdHJpZ2dlcnMuIEl0IG1pZ2h0IGJlIHBvc3Np YmxlIHRvIGFsbG93CisJICogcGFydGl0aW9uZWQgdGFibGVzIHdpdGggc3VjaCB0cmlnZ2Vy cyBpbiB0aGUgZnV0dXJlLCBidXQgZm9yIG5vdywKKwkgKiBDb3B5TXVsdGlJbnNlcnRJbmZv Rmx1c2ggZXhwZWN0cyB0aGF0IGFueSBiZWZvcmUgcm93IGluc2VydCBhbmQKKwkgKiBzdGF0 ZW1lbnQgbGV2ZWwgaW5zZXJ0IHRyaWdnZXJzIGFyZSBvbiB0aGUgc2FtZSByZWxhdGlvbi4K KwkgKi8KKwlpZiAocnJpLT5yaV9SZWxhdGlvbkRlc2MtPnJkX3JlbC0+cmVsa2luZCA9PSBS RUxLSU5EX1BBUlRJVElPTkVEX1RBQkxFICYmCisJCXJyaS0+cmlfVHJpZ0Rlc2MgIT0gTlVM TCAmJgorCQlycmktPnJpX1RyaWdEZXNjLT50cmlnX2luc2VydF9uZXdfdGFibGUpCisJCXJl dHVybiBmYWxzZTsKKworCWlmIChycmktPnJpX0Zkd1JvdXRpbmUgIT0gTlVMTCAmJgorCQko cnJpLT5yaV9GZHdSb3V0aW5lLT5FeGVjRm9yZWlnbkJhdGNoSW5zZXJ0ID09IE5VTEwgfHwK KwkJcnJpLT5yaV9GZHdSb3V0aW5lLT5HZXRGb3JlaWduTW9kaWZ5QmF0Y2hTaXplID09IE5V TEwpKQorCQkvKgorCQkgKiBGb3JlaWduIHRhYmxlcyBkb24ndCBzdXBwb3J0IG11bHRpLWlu c2VydHMsIHVubGVzcyB0aGVpciBGRFcKKwkJICogcHJvdmlkZXMgdGhlIG5lY2Vzc2FyeSBi dWxrIGluc2VydCBpbnRlcmZhY2UuCisJCSAqLworCQlyZXR1cm4gZmFsc2U7CisKKwkvKiBP SywgY2FsbGVyIGNhbiB1c2UgbXVsdGktaW5zZXJ0IG9uIHRoaXMgcmVsYXRpb24uICovCisJ cmV0dXJuIHRydWU7Cit9CisKIC8qCiAgKiBFeGVjR2V0VHJpZ2dlclJlc3VsdFJlbAogICoJ CUdldCBhIFJlc3VsdFJlbEluZm8gZm9yIGEgdHJpZ2dlciB0YXJnZXQgcmVsYXRpb24uCmRp ZmYgLS1naXQgYS9zcmMvYmFja2VuZC9leGVjdXRvci9leGVjUGFydGl0aW9uLmMgYi9zcmMv YmFja2VuZC9leGVjdXRvci9leGVjUGFydGl0aW9uLmMKaW5kZXggNjA2YzkyMGIwNi4uZDc4 NDY5MmJmOCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvZXhlY3V0b3IvZXhlY1BhcnRpdGlv bi5jCisrKyBiL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL2V4ZWNQYXJ0aXRpb24uYwpAQCAtNTE0 LDYgKzUxNCwxNCBAQCBFeGVjSW5pdFBhcnRpdGlvbkluZm8oTW9kaWZ5VGFibGVTdGF0ZSAq bXRzdGF0ZSwgRVN0YXRlICplc3RhdGUsCiAJCQkJCSAgcm9vdFJlc3VsdFJlbEluZm8sCiAJ CQkJCSAgZXN0YXRlLT5lc19pbnN0cnVtZW50KTsKIAorCS8qCisJICogSWYgYSBwYXJ0aXRp b24ncyByb290IHBhcmVudCBpc24ndCBhbGxvd2VkIHRvIHVzZSBpdCwgbmVpdGhlciBpcyB0 aGUKKwkgKiBwYXJ0aXRpb24uCisJICovCisJaWYgKHJvb3RSZXN1bHRSZWxJbmZvLT5yaV91 c2VzTXVsdGlJbnNlcnQpCisJCWxlYWZfcGFydF9ycmktPnJpX3VzZXNNdWx0aUluc2VydCA9 CisJCQlFeGVjTXVsdGlJbnNlcnRBbGxvd2VkKGxlYWZfcGFydF9ycmkpOworCiAJLyoKIAkg KiBWZXJpZnkgcmVzdWx0IHJlbGF0aW9uIGlzIGEgdmFsaWQgdGFyZ2V0IGZvciBhbiBJTlNF UlQuICBBbiBVUERBVEUgb2YgYQogCSAqIHBhcnRpdGlvbi1rZXkgYmVjb21lcyBhIERFTEVU RStJTlNFUlQgb3BlcmF0aW9uLCBzbyB0aGlzIGNoZWNrIGlzIHN0aWxsCmRpZmYgLS1naXQg YS9zcmMvaW5jbHVkZS9jb21tYW5kcy9jb3B5ZnJvbV9pbnRlcm5hbC5oIGIvc3JjL2luY2x1 ZGUvY29tbWFuZHMvY29weWZyb21faW50ZXJuYWwuaAppbmRleCA0ZDY4ZDljY2ViLi41OThh NjhhNmYxIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9jb21tYW5kcy9jb3B5ZnJvbV9pbnRl cm5hbC5oCisrKyBiL3NyYy9pbmNsdWRlL2NvbW1hbmRzL2NvcHlmcm9tX2ludGVybmFsLmgK QEAgLTM5LDE2ICszOSw2IEBAIHR5cGVkZWYgZW51bSBFb2xUeXBlCiAJRU9MX0NSTkwKIH0g RW9sVHlwZTsKIAotLyoKLSAqIFJlcHJlc2VudHMgdGhlIGhlYXAgaW5zZXJ0IG1ldGhvZCB0 byBiZSB1c2VkIGR1cmluZyBDT1BZIEZST00uCi0gKi8KLXR5cGVkZWYgZW51bSBDb3B5SW5z ZXJ0TWV0aG9kCi17Ci0JQ0lNX1NJTkdMRSwJCQkJCS8qIHVzZSB0YWJsZV90dXBsZV9pbnNl cnQgb3IgZmR3IHJvdXRpbmUgKi8KLQlDSU1fTVVMVEksCQkJCQkvKiBhbHdheXMgdXNlIHRh YmxlX211bHRpX2luc2VydCAqLwotCUNJTV9NVUxUSV9DT05ESVRJT05BTAkJLyogdXNlIHRh YmxlX211bHRpX2luc2VydCBvbmx5IGlmIHZhbGlkICovCi19IENvcHlJbnNlcnRNZXRob2Q7 Ci0KIC8qCiAgKiBUaGlzIHN0cnVjdCBjb250YWlucyBhbGwgdGhlIHN0YXRlIHZhcmlhYmxl cyB1c2VkIHRocm91Z2hvdXQgYSBDT1BZIEZST00KICAqIG9wZXJhdGlvbi4KZGlmZiAtLWdp dCBhL3NyYy9pbmNsdWRlL2V4ZWN1dG9yL2V4ZWN1dG9yLmggYi9zcmMvaW5jbHVkZS9leGVj dXRvci9leGVjdXRvci5oCmluZGV4IDNkYzAzYzkxM2UuLjQ2YTc5YzVhZDggMTAwNjQ0Ci0t LSBhL3NyYy9pbmNsdWRlL2V4ZWN1dG9yL2V4ZWN1dG9yLmgKKysrIGIvc3JjL2luY2x1ZGUv ZXhlY3V0b3IvZXhlY3V0b3IuaApAQCAtMjAzLDYgKzIwMyw3IEBAIGV4dGVybiB2b2lkIElu aXRSZXN1bHRSZWxJbmZvKFJlc3VsdFJlbEluZm8gKnJlc3VsdFJlbEluZm8sCiAJCQkJCQkJ ICBJbmRleCByZXN1bHRSZWxhdGlvbkluZGV4LAogCQkJCQkJCSAgUmVzdWx0UmVsSW5mbyAq cGFydGl0aW9uX3Jvb3RfcnJpLAogCQkJCQkJCSAgaW50IGluc3RydW1lbnRfb3B0aW9ucyk7 CitleHRlcm4gYm9vbCBFeGVjTXVsdGlJbnNlcnRBbGxvd2VkKGNvbnN0IFJlc3VsdFJlbElu Zm8gKnJyaSk7CiBleHRlcm4gUmVzdWx0UmVsSW5mbyAqRXhlY0dldFRyaWdnZXJSZXN1bHRS ZWwoRVN0YXRlICplc3RhdGUsIE9pZCByZWxpZCk7CiBleHRlcm4gdm9pZCBFeGVjQ29uc3Ry YWludHMoUmVzdWx0UmVsSW5mbyAqcmVzdWx0UmVsSW5mbywKIAkJCQkJCQlUdXBsZVRhYmxl U2xvdCAqc2xvdCwgRVN0YXRlICplc3RhdGUpOwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUv bm9kZXMvZXhlY25vZGVzLmggYi9zcmMvaW5jbHVkZS9ub2Rlcy9leGVjbm9kZXMuaAppbmRl eCA3Nzk1YTY5NDkwLi41OGQ1ZGY5ODc0IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9ub2Rl cy9leGVjbm9kZXMuaAorKysgYi9zcmMvaW5jbHVkZS9ub2Rlcy9leGVjbm9kZXMuaApAQCAt NTIxLDcgKzUyMSwxMyBAQCB0eXBlZGVmIHN0cnVjdCBSZXN1bHRSZWxJbmZvCiAJVHVwbGVD b252ZXJzaW9uTWFwICpyaV9DaGlsZFRvUm9vdE1hcDsKIAlib29sCQlyaV9DaGlsZFRvUm9v dE1hcFZhbGlkOwogCi0JLyogZm9yIHVzZSBieSBjb3B5ZnJvbS5jIHdoZW4gcGVyZm9ybWlu ZyBtdWx0aS1pbnNlcnRzICovCisJLyoKKwkgKiBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUg Y3VycmVudGx5IG9ubHkgcmVsZXZhbnQgdG8gY29weWZyb20uYy4KKwkgKiBUcnVlIGlmIG9r YXkgdG8gdXNlIG11bHRpLWluc2VydCBvbiB0aGlzIHJlbGF0aW9uCisJICovCisJYm9vbCBy aV91c2VzTXVsdGlJbnNlcnQ7CisKKwkvKiBCdWZmZXIgYWxsb2NhdGVkIHRvIHRoaXMgcmVs YXRpb24gd2hlbiB1c2luZyBtdWx0aS1pbnNlcnQgbW9kZSAqLwogCXN0cnVjdCBDb3B5TXVs dGlJbnNlcnRCdWZmZXIgKnJpX0NvcHlNdWx0aUluc2VydEJ1ZmZlcjsKIH0gUmVzdWx0UmVs SW5mbzsKIAotLSAKMi4zMS4xCgo= --------------A0220516AB66D657E1AFFFE6--