Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1u50d9-00AlPz-5V for pgsql-hackers@arkaria.postgresql.org; Wed, 16 Apr 2025 11:08:35 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1u50d7-00CQZD-1l for pgsql-hackers@arkaria.postgresql.org; Wed, 16 Apr 2025 11:08:33 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1u50Zp-00CIeR-3G for pgsql-hackers@lists.postgresql.org; Wed, 16 Apr 2025 11:05:10 +0000 Received: from mail-qk1-x72e.google.com ([2607:f8b0:4864:20::72e]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1u50Zm-000NgO-0I for pgsql-hackers@lists.postgresql.org; Wed, 16 Apr 2025 11:05:09 +0000 Received: by mail-qk1-x72e.google.com with SMTP id af79cd13be357-7c75d727c3aso83667385a.0 for ; Wed, 16 Apr 2025 04:05:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1744801505; x=1745406305; darn=lists.postgresql.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=PCQBaMRcJoGZREnWX/klh236wYP1Dh7SiqQ3AwgH0+M=; b=R6RKho6y8iofuO09SD/rfKRQOFphIvdcQUv7EjlA6BBTVtuo9LWRXUNNJkvJBVe6ec bTVPeMCGNSNBTXyjShJyELCtsulgRq+tczjzZbLtWVqZdoEimfQI0/LmdGzP7HSQFfyO tZtSTMnyy2u43OCcd36qcLeDWaoWPGhgeTTCYx8ohdv+9SXG5uAeqhYuC+HZvsODEWiH lq7+nVwS/J96i8LRvj97RNAVvzUT8H0t0F6AddefPIBRMXihw4FG0mS5TImUfpZbSJ/m gFiYVY/nOXHUFwQqNd8pxRfxYk2lko4nbSuNZ08/XkF8hFsZJiLzmsSxqXDp/9BhVPGq TlRA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744801505; x=1745406305; h=to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=PCQBaMRcJoGZREnWX/klh236wYP1Dh7SiqQ3AwgH0+M=; b=KOtrRCnaqNs2L2zb3FfZ7IvAKePreDLJ4FTmLzPtOmjRldWCed+TzSKOR8ZDnasIDb LVdyoloYKfqLDt0AoHayBIbrYK3lsI99KYv9jCnohrVV6cn9YP5aMQKsLc/PE5lRYU8p z3W+hA2QMYEH8BIOipwdpWNErurZDjISWGWEuVNJqfYyUUk47Zlv2PK3lfkoAEhrAasC 5knYbibCnyZ08cu1bSXdZLrVEh2xpJgbK6k1N8TgzTink5ym1Y3dWWDZ94rzze84E54m U/o+HZykQyJ1L9BcgzpHFYfy0UK19Zvb0NfODCTAc5e2turG6MmoFiMLLWI5SYX8n9sK STew== X-Gm-Message-State: AOJu0YxVZ52Aszku+P+MC9I/Y8t2BnpBOF0Qo07MPLOD2CSzlV/EbQNe 7WLex+Irmi3+006olFNtDkiqLbJaF/mlZMYX4/+2zXDZSLeP/9CDtJL/D2XP73LQUm4c+6wfLPP W9mu53WvQ0kHxGyrFTF2VjfyU8RgejJuM X-Gm-Gg: ASbGncufNOYsZinSAOgG/NALx2kx4eXaYt+e+y+/lyw1N/FeE6zHDCr0IiD/+ld0dnY LVyu05qa8/nAZ/ZyXDEMfUNClgzlbYKmBn2pYkMo2mCqSzIV/NBd2oVZJ9yLWZu/PadvpsGxEov M++9FPsInWhNYHtqbG5OQX X-Google-Smtp-Source: AGHT+IEDV/JtXf1ivVyHqtN9x5q2qvFVlg/Vvg6+wGF3/nJtbGskfROrJJ5Afo9sy1gpa4Mx+SZlXI5Z+07s3Wbiouk= X-Received: by 2002:a05:622a:1884:b0:47a:cbf5:7349 with SMTP id d75a77b69052e-47ad80c807cmr6749721cf.9.1744801505073; Wed, 16 Apr 2025 04:05:05 -0700 (PDT) MIME-Version: 1.0 From: Maxim Orlov Date: Wed, 16 Apr 2025 14:04:53 +0300 X-Gm-Features: ATxdqUHJacwAml3TRy5nKXI5VnxrWs-vUgoe_3DWpY6PM5g99oUf0c9gNOdQgvE Message-ID: Subject: POC: Parallel processing of indexes in autovacuum To: Postgres hackers Content-Type: multipart/mixed; boundary="000000000000ea30570632e341b1" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000ea30570632e341b1 Content-Type: multipart/alternative; boundary="000000000000ea30550632e341af" --000000000000ea30550632e341af Content-Type: text/plain; charset="UTF-8" Hi! The VACUUM command can be executed with the parallel option. As documentation states, it will perform index vacuum and index cleanup phases of VACUUM in parallel using *integer* background workers. But such an interesting feature is not used for an autovacuum. After a quick look at the source codes, it became clear to me that when the parallel option was added, the corresponding option for autovacuum wasn't implemented, although there are no clear obstacles to this. Actually, one of our customers step into a problem with autovacuum on a table with many indexes and relatively long transactions. Of course, long transactions are an ultimate evil and the problem can be solved by calling running vacuum and a cron task, but, I think, we can do better. Anyhow, what about adding parallel option for an autovacuum? Here is a POC patch for proposed functionality. For the sake of simplicity's, several GUC's have been added. It would be good to think through the parallel launch condition without them. As always, any thoughts and opinions are very welcome! -- Best regards, Maxim Orlov. --000000000000ea30550632e341af Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi!

The=C2=A0VACU= UM command can be executed with t= he parallel option. As documentation states, it will p= erform index vacuum and index cleanup phases of VACUUM in parallel using in= teger background workers. Bu= t such an interesting feature is not used for an autovacuum. = After a quick look at the source = codes, it became clear to me that when the=C2=A0= parallel option was added, the corresponding option for <= span class=3D"gmail-ryNqvb">autovacuum wasn't implemented, although there are no clear obstacles to this.

<= /span>
Actually, one of= our customers step into a problem with autovacuum on a table with many indexes and relatively= long transactions. Of course, long transactions are an ultimate evil and t= he problem can be solved by calling running vacuum and a cron task, but, I = think, we can do better.

Anyhow, what about adding parallel option for an autovacuum? Here is a POC patch for proposed funct= ionality. For the sake of simplicity's, several GUC's have been add= ed. It would be good to think through the parallel launch conditio= n without them.

As always, any thoughts and opinions are very welcome!

--
Best regards,
Maxim Orlov.
=
--000000000000ea30550632e341af-- --000000000000ea30570632e341b1 Content-Type: application/octet-stream; name="WIP-Allow-autovacuum-to-process-indexes-of-single-table.patch" Content-Disposition: attachment; filename="WIP-Allow-autovacuum-to-process-indexes-of-single-table.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_m9jtp4550 RnJvbSA1OGRkOWExNDRmMDY1YjM2MTk2MTVlZmM0YzJhZmMxY2M2NzIxNjE3IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBEYW5paWwgRGF2aWRvdiA8ZC5kYXZ5ZG92QHBvc3RncmVzcHJv LnJ1PgpEYXRlOiBUdWUsIDEgQXByIDIwMjUgMTQ6Mzk6NDkgKzA3MDAKU3ViamVjdDogW1BBVENI XSBBbGxvdyBhdXRvdmFjdXVtIHRvIHByb2Nlc3MgaW5kZXhlcyBvZiBzaW5nbGUgdGFibGUgaW4K IHBhcmFsbGVsIG1vZGUKCkF1dGhvcjogRGFuaWlsIERhdnlkb3YgPDNkYW5pc3NpbW9AZ21haWwu Y29tPgpBdXRob3I6IE1heGltIE9ybG92IDxvcmxvdm1nQGdtYWlsLmNvbT4KLS0tCiBzcmMvYmFj a2VuZC9jb21tYW5kcy92YWN1dW0uYyAgICAgICAgICAgICAgICAgfCAgMjcgKwogc3JjL2JhY2tl bmQvY29tbWFuZHMvdmFjdXVtcGFyYWxsZWwuYyAgICAgICAgIHwgMjkwICsrKysrKy0KIHNyYy9i YWNrZW5kL3Bvc3RtYXN0ZXIvYXV0b3ZhY3V1bS5jICAgICAgICAgICB8IDgwMSArKysrKysrKysr KysrKysrKy0KIHNyYy9iYWNrZW5kL3V0aWxzL21pc2MvZ3VjX3RhYmxlcy5jICAgICAgICAgICB8 ICAzMCArCiBzcmMvYmFja2VuZC91dGlscy9taXNjL3Bvc3RncmVzcWwuY29uZi5zYW1wbGUgfCAg IDYgKwogc3JjL2luY2x1ZGUvcG9zdG1hc3Rlci9hdXRvdmFjdXVtLmggICAgICAgICAgIHwgIDI1 ICsKIHNyYy90ZXN0L21vZHVsZXMvYXV0b3ZhY3V1bS8uZ2l0aWdub3JlICAgICAgICB8ICAgMSAr CiBzcmMvdGVzdC9tb2R1bGVzL2F1dG92YWN1dW0vTWFrZWZpbGUgICAgICAgICAgfCAgMTQgKwog Li4uL2F1dG92YWN1dW0vdC8wMDFfYXV0b3ZhY19wYXJhbGxlbC5wbCAgICAgIHwgMTM3ICsrKwog OSBmaWxlcyBjaGFuZ2VkLCAxMjg1IGluc2VydGlvbnMoKyksIDQ2IGRlbGV0aW9ucygtKQogY3Jl YXRlIG1vZGUgMTAwNjQ0IHNyYy90ZXN0L21vZHVsZXMvYXV0b3ZhY3V1bS8uZ2l0aWdub3JlCiBj cmVhdGUgbW9kZSAxMDA2NDQgc3JjL3Rlc3QvbW9kdWxlcy9hdXRvdmFjdXVtL01ha2VmaWxlCiBj cmVhdGUgbW9kZSAxMDA2NDQgc3JjL3Rlc3QvbW9kdWxlcy9hdXRvdmFjdXVtL3QvMDAxX2F1dG92 YWNfcGFyYWxsZWwucGwKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9jb21tYW5kcy92YWN1dW0u YyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL3ZhY3V1bS5jCmluZGV4IGRiNWRhM2NlODI2Li41ZjUx YTY1OTY3YyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvdmFjdXVtLmMKKysrIGIv c3JjL2JhY2tlbmQvY29tbWFuZHMvdmFjdXVtLmMKQEAgLTIyMzIsNiArMjIzMiwzMyBAQCB2YWN1 dW1fcmVsKE9pZCByZWxpZCwgUmFuZ2VWYXIgKnJlbGF0aW9uLCBWYWN1dW1QYXJhbXMgKnBhcmFt cywKIAllbHNlCiAJCXRvYXN0X3JlbGlkID0gSW52YWxpZE9pZDsKIAorCS8qCisJICogRGVjaWRl IHdoZXRoZXIgd2UgbmVlZCB0byBwcm9jZXNzIHRhYmxlIHdpdGggZ2l2ZW4gb2lkIGluIHBhcmFs bGVsIG1vZGUKKwkgKiBkdXJpbmcgYXV0b3ZhY3V1bS4KKwkgKi8KKwlpZiAoQW1BdXRvVmFjdXVt V29ya2VyUHJvY2VzcygpICYmCisJCXBhcmFtcy0+aW5kZXhfY2xlYW51cCAhPSBWQUNPUFRWQUxV RV9ESVNBQkxFRCkKKwl7CisJCVBnU3RhdF9TdGF0VGFiRW50cnkgKnRhYmVudHJ5OworCisJCS8q IGZldGNoIHRoZSBwZ3N0YXQgdGFibGUgZW50cnkgKi8KKwkJdGFiZW50cnkgPSBwZ3N0YXRfZmV0 Y2hfc3RhdF90YWJlbnRyeV9leHQocmVsLT5yZF9yZWwtPnJlbGlzc2hhcmVkLAorCQkJCQkJCQkJ CQkJICByZWwtPnJkX2lkKTsKKwkJaWYgKHRhYmVudHJ5ICYmIHRhYmVudHJ5LT5kZWFkX3R1cGxl cyA+PSBhdXRvdmFjX2lkeF9wYXJhbGxlbF9taW5fcm93cykKKwkJeworCQkJTGlzdCAgICppbmRl eGVzID0gUmVsYXRpb25HZXRJbmRleExpc3QocmVsKTsKKwkJCWludAkJbnVtX2luZGV4ZXMgPSBs aXN0X2xlbmd0aChpbmRleGVzKTsKKworCQkJbGlzdF9mcmVlKGluZGV4ZXMpOworCisJCQlpZiAo bnVtX2luZGV4ZXMgPj0gYXV0b3ZhY19pZHhfcGFyYWxsZWxfbWluX2luZGV4ZXMgJiYKKwkJCQlt YXhfcGFyYWxsZWxfaW5kZXhfYXV0b3ZhY193b3JrZXJzID4gMCkKKwkJCXsKKwkJCQlwYXJhbXMt Pm53b3JrZXJzID0gbWF4X3BhcmFsbGVsX2luZGV4X2F1dG92YWNfd29ya2VyczsKKwkJCX0KKwkJ fQorCX0KKwogCS8qCiAJICogU3dpdGNoIHRvIHRoZSB0YWJsZSBvd25lcidzIHVzZXJpZCwgc28g dGhhdCBhbnkgaW5kZXggZnVuY3Rpb25zIGFyZSBydW4KIAkgKiBhcyB0aGF0IHVzZXIuICBBbHNv IGxvY2sgZG93biBzZWN1cml0eS1yZXN0cmljdGVkIG9wZXJhdGlvbnMgYW5kCmRpZmYgLS1naXQg YS9zcmMvYmFja2VuZC9jb21tYW5kcy92YWN1dW1wYXJhbGxlbC5jIGIvc3JjL2JhY2tlbmQvY29t bWFuZHMvdmFjdXVtcGFyYWxsZWwuYwppbmRleCAyYjlkNTQ4Y2RlYi4uNjA5NGQ2YzY0OWIgMTAw NjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL3ZhY3V1bXBhcmFsbGVsLmMKKysrIGIvc3Jj L2JhY2tlbmQvY29tbWFuZHMvdmFjdXVtcGFyYWxsZWwuYwpAQCAtMSwyMCArMSwyMyBAQAogLyot LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCiAgKgogICogdmFjdXVtcGFyYWxsZWwuYwotICoJICBTdXBwb3J0IHJv dXRpbmVzIGZvciBwYXJhbGxlbCB2YWN1dW0gZXhlY3V0aW9uLgorICoJICBTdXBwb3J0IHJvdXRp bmVzIGZvciBwYXJhbGxlbCBbYXV0b112YWN1dW0gZXhlY3V0aW9uLgogICoKICAqIFRoaXMgZmls ZSBjb250YWlucyByb3V0aW5lcyB0aGF0IGFyZSBpbnRlbmRlZCB0byBzdXBwb3J0IHNldHRpbmcg dXAsIHVzaW5nLAogICogYW5kIHRlYXJpbmcgZG93biBhIFBhcmFsbGVsVmFjdXVtU3RhdGUuCiAg KgotICogSW4gYSBwYXJhbGxlbCB2YWN1dW0sIHdlIHBlcmZvcm0gYm90aCBpbmRleCBidWxrIGRl bGV0aW9uIGFuZCBpbmRleCBjbGVhbnVwCi0gKiB3aXRoIHBhcmFsbGVsIHdvcmtlciBwcm9jZXNz ZXMuICBJbmRpdmlkdWFsIGluZGV4ZXMgYXJlIHByb2Nlc3NlZCBieSBvbmUKLSAqIHZhY3V1bSBw cm9jZXNzLiAgUGFyYWxsZWxWYWN1dW1TdGF0ZSBjb250YWlucyBzaGFyZWQgaW5mb3JtYXRpb24g YXMgd2VsbCBhcwotICogdGhlIG1lbW9yeSBzcGFjZSBmb3Igc3RvcmluZyBkZWFkIGl0ZW1zIGFs bG9jYXRlZCBpbiB0aGUgRFNBIGFyZWEuICBXZQorICogSW4gYSBwYXJhbGxlbCBbYXV0b112YWN1 dW0sIHdlIHBlcmZvcm0gYm90aCBpbmRleCBidWxrIGRlbGV0aW9uIGFuZCBpbmRleAorICogY2xl YW51cCB3aXRoIHBhcmFsbGVsIHdvcmtlciBwcm9jZXNzZXMuICBJbmRpdmlkdWFsIGluZGV4ZXMg YXJlIHByb2Nlc3NlZCBieQorICogb25lIHZhY3V1bSBwcm9jZXNzLiAgUGFyYWxsZWxWYWN1dW1T dGF0ZSBjb250YWlucyBzaGFyZWQgaW5mb3JtYXRpb24gYXMgd2VsbAorICogYXMgdGhlIG1lbW9y eSBzcGFjZSBmb3Igc3RvcmluZyBkZWFkIGl0ZW1zIGFsbG9jYXRlZCBpbiB0aGUgRFNBIGFyZWEu ICBXZQogICogbGF1bmNoIHBhcmFsbGVsIHdvcmtlciBwcm9jZXNzZXMgYXQgdGhlIHN0YXJ0IG9m IHBhcmFsbGVsIGluZGV4CiAgKiBidWxrLWRlbGV0aW9uIGFuZCBpbmRleCBjbGVhbnVwIGFuZCBv bmNlIGFsbCBpbmRleGVzIGFyZSBwcm9jZXNzZWQsIHRoZQogICogcGFyYWxsZWwgd29ya2VyIHBy b2Nlc3NlcyBleGl0LiAgRWFjaCB0aW1lIHdlIHByb2Nlc3MgaW5kZXhlcyBpbiBwYXJhbGxlbCwK ICAqIHRoZSBwYXJhbGxlbCBjb250ZXh0IGlzIHJlLWluaXRpYWxpemVkIHNvIHRoYXQgdGhlIHNh bWUgRFNNIGNhbiBiZSB1c2VkIGZvcgotICogbXVsdGlwbGUgcGFzc2VzIG9mIGluZGV4IGJ1bGst ZGVsZXRpb24gYW5kIGluZGV4IGNsZWFudXAuCisgKiBtdWx0aXBsZSBwYXNzZXMgb2YgaW5kZXgg YnVsay1kZWxldGlvbiBhbmQgaW5kZXggY2xlYW51cC4gRm9yIG1haW50ZW5hbmNlCisgKiB2YWN1 dW0sIHdlIGxhdW5jaCB3b3JrZXJzIG1hbnVhbGx5ICh1c2luZyBkeW5hbWljIGJnd29ya2VycyBt YWNoaW5lcnkpLCBhbmQKKyAqIGZvciBhdXRvdmFjdXVtIHdlIHNlbmQgc2lnbmFscyB0byB0aGUg YXV0b3ZhY3V1bSBsYXVuY2hlciAoYWxsIGxvZ2ljIGZvcgorICogY29tbXVuaWNhdGlvbiBhbW9u ZyBwYXJhbGxlbCBhdXRvdmFjdXVtIHByb2Nlc3NlcyBpcyBpbiBhdXRvdmFjdXVtLmMpLgogICoK ICAqIFBvcnRpb25zIENvcHlyaWdodCAoYykgMTk5Ni0yMDI1LCBQb3N0Z3JlU1FMIEdsb2JhbCBE ZXZlbG9wbWVudCBHcm91cAogICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAxOTk0LCBSZWdlbnRz IG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKQEAgLTM0LDkgKzM3LDExIEBACiAjaW5j bHVkZSAiZXhlY3V0b3IvaW5zdHJ1bWVudC5oIgogI2luY2x1ZGUgIm9wdGltaXplci9wYXRocy5o IgogI2luY2x1ZGUgInBnc3RhdC5oIgorI2luY2x1ZGUgInBvc3RtYXN0ZXIvYXV0b3ZhY3V1bS5o IgogI2luY2x1ZGUgInN0b3JhZ2UvYnVmbWdyLmgiCiAjaW5jbHVkZSAidGNvcC90Y29wcHJvdC5o IgogI2luY2x1ZGUgInV0aWxzL2xzeXNjYWNoZS5oIgorI2luY2x1ZGUgInV0aWxzL21lbXV0aWxz LmgiCiAjaW5jbHVkZSAidXRpbHMvcmVsLmgiCiAKIC8qCkBAIC0xNTcsMTEgKzE2MiwyMCBAQCB0 eXBlZGVmIHN0cnVjdCBQVkluZFN0YXRzCiB9IFBWSW5kU3RhdHM7CiAKIC8qCi0gKiBTdHJ1Y3Qg Zm9yIG1haW50YWluaW5nIGEgcGFyYWxsZWwgdmFjdXVtIHN0YXRlLiB0eXBlZGVmIGFwcGVhcnMg aW4gdmFjdXVtLmguCisgKiBTdHJ1Y3QgZm9yIG1haW50YWluaW5nIGEgcGFyYWxsZWwgW2F1dG9d dmFjdXVtIHN0YXRlLiB0eXBlZGVmIGFwcGVhcnMgaW4KKyAqIHZhY3V1bS5oLgogICovCiBzdHJ1 Y3QgUGFyYWxsZWxWYWN1dW1TdGF0ZQogewotCS8qIE5VTEwgZm9yIHdvcmtlciBwcm9jZXNzZXMg Ki8KKwkvKiBJcyB0aGlzIHN0cnVjdHVyZSB1c2VkIGZvciBtYWludGVuYW5jZSB2YWN1dW0gb3Ig YXV0b3ZhY3V1bSAqLworCWJvb2wgaXNfYXV0b3ZhY3V1bTsKKworCS8qCisJICogTlVMTCBmb3Ig d29ya2VyIHByb2Nlc3Nlcy4KKwkgKgorCSAqIE5PVEU6IFBhcmFsbGVsIGF1dG92YWN1dW0gb25s eSBuZWVkcyBhIHN1YnNldCBvZiB0aGUgbWFpbnRlbmFuY2UgdmFjdXVtCisJICoJCSBmdW5jdGlv bmFsaXR5LgorCSAqLwogCVBhcmFsbGVsQ29udGV4dCAqcGN4dDsKIAogCS8qIFBhcmVudCBIZWFw IFJlbGF0aW9uICovCkBAIC0yMjEsNiArMjM1LDEwIEBAIHN0cnVjdCBQYXJhbGxlbFZhY3V1bVN0 YXRlCiAJUFZJbmRWYWNTdGF0dXMgc3RhdHVzOwogfTsKIAorc3RhdGljIFBhcmFsbGVsQ29udGV4 dCAqQ3JlYXRlUGFyYWxsZWxBdXRvVmFjQ29udGV4dChpbnQgbndvcmtlcnMpOworc3RhdGljIHZv aWQgSW5pdGlhbGl6ZVBhcmFsbGVsQXV0b1ZhY0RTTShQYXJhbGxlbENvbnRleHQgKnBjeHQpOwor c3RhdGljIHZvaWQgRGVzdHJveVBhcmFsbGVsQXV0b1ZhY0NvbnRleHQoUGFyYWxsZWxDb250ZXh0 ICpwY3h0KTsKKwogc3RhdGljIGludAlwYXJhbGxlbF92YWN1dW1fY29tcHV0ZV93b3JrZXJzKFJl bGF0aW9uICppbmRyZWxzLCBpbnQgbmluZGV4ZXMsIGludCBucmVxdWVzdGVkLAogCQkJCQkJCQkJ CQlib29sICp3aWxsX3BhcmFsbGVsX3ZhY3V1bSk7CiBzdGF0aWMgdm9pZCBwYXJhbGxlbF92YWN1 dW1fcHJvY2Vzc19hbGxfaW5kZXhlcyhQYXJhbGxlbFZhY3V1bVN0YXRlICpwdnMsIGludCBudW1f aW5kZXhfc2NhbnMsCkBAIC0yODAsMTUgKzI5OCwyMSBAQCBwYXJhbGxlbF92YWN1dW1faW5pdChS ZWxhdGlvbiByZWwsIFJlbGF0aW9uICppbmRyZWxzLCBpbnQgbmluZGV4ZXMsCiAJfQogCiAJcHZz ID0gKFBhcmFsbGVsVmFjdXVtU3RhdGUgKikgcGFsbG9jMChzaXplb2YoUGFyYWxsZWxWYWN1dW1T dGF0ZSkpOworCXB2cy0+aXNfYXV0b3ZhY3V1bSA9IEFtQXV0b1ZhY3V1bVdvcmtlclByb2Nlc3Mo KTsKIAlwdnMtPmluZHJlbHMgPSBpbmRyZWxzOwogCXB2cy0+bmluZGV4ZXMgPSBuaW5kZXhlczsK IAlwdnMtPndpbGxfcGFyYWxsZWxfdmFjdXVtID0gd2lsbF9wYXJhbGxlbF92YWN1dW07CiAJcHZz LT5ic3RyYXRlZ3kgPSBic3RyYXRlZ3k7CiAJcHZzLT5oZWFwcmVsID0gcmVsOwogCi0JRW50ZXJQ YXJhbGxlbE1vZGUoKTsKLQlwY3h0ID0gQ3JlYXRlUGFyYWxsZWxDb250ZXh0KCJwb3N0Z3JlcyIs ICJwYXJhbGxlbF92YWN1dW1fbWFpbiIsCi0JCQkJCQkJCSBwYXJhbGxlbF93b3JrZXJzKTsKKwlp ZiAocHZzLT5pc19hdXRvdmFjdXVtKQorCQlwY3h0ID0gQ3JlYXRlUGFyYWxsZWxBdXRvVmFjQ29u dGV4dChwYXJhbGxlbF93b3JrZXJzKTsKKwllbHNlCisJeworCQlFbnRlclBhcmFsbGVsTW9kZSgp OworCQlwY3h0ID0gQ3JlYXRlUGFyYWxsZWxDb250ZXh0KCJwb3N0Z3JlcyIsICJwYXJhbGxlbF92 YWN1dW1fbWFpbiIsCisJCQkJCQkJCQkgcGFyYWxsZWxfd29ya2Vycyk7CisJfQogCUFzc2VydChw Y3h0LT5ud29ya2VycyA+IDApOwogCXB2cy0+cGN4dCA9IHBjeHQ7CiAKQEAgLTMyNyw3ICszNTEs MTAgQEAgcGFyYWxsZWxfdmFjdXVtX2luaXQoUmVsYXRpb24gcmVsLCBSZWxhdGlvbiAqaW5kcmVs cywgaW50IG5pbmRleGVzLAogCWVsc2UKIAkJcXVlcnlsZW4gPSAwOwkJCS8qIGtlZXAgY29tcGls ZXIgcXVpZXQgKi8KIAotCUluaXRpYWxpemVQYXJhbGxlbERTTShwY3h0KTsKKwlpZiAocHZzLT5p c19hdXRvdmFjdXVtKQorCQlJbml0aWFsaXplUGFyYWxsZWxBdXRvVmFjRFNNKHB2cy0+cGN4dCk7 CisJZWxzZQorCQlJbml0aWFsaXplUGFyYWxsZWxEU00ocGN4dCk7CiAKIAkvKiBQcmVwYXJlIGlu ZGV4IHZhY3V1bSBzdGF0cyAqLwogCWluZHN0YXRzID0gKFBWSW5kU3RhdHMgKikgc2htX3RvY19h bGxvY2F0ZShwY3h0LT50b2MsIGVzdF9pbmRzdGF0c19sZW4pOwpAQCAtMzcxLDExICszOTgsMTgg QEAgcGFyYWxsZWxfdmFjdXVtX2luaXQoUmVsYXRpb24gcmVsLCBSZWxhdGlvbiAqaW5kcmVscywg aW50IG5pbmRleGVzLAogCXNoYXJlZC0+cmVsaWQgPSBSZWxhdGlvbkdldFJlbGlkKHJlbCk7CiAJ c2hhcmVkLT5lbGV2ZWwgPSBlbGV2ZWw7CiAJc2hhcmVkLT5xdWVyeWlkID0gcGdzdGF0X2dldF9t eV9xdWVyeV9pZCgpOwotCXNoYXJlZC0+bWFpbnRlbmFuY2Vfd29ya19tZW1fd29ya2VyID0KLQkJ KG5pbmRleGVzX213bSA+IDApID8KLQkJbWFpbnRlbmFuY2Vfd29ya19tZW0gLyBNaW4ocGFyYWxs ZWxfd29ya2VycywgbmluZGV4ZXNfbXdtKSA6Ci0JCW1haW50ZW5hbmNlX3dvcmtfbWVtOwotCXNo YXJlZC0+ZGVhZF9pdGVtc19pbmZvLm1heF9ieXRlcyA9IHZhY193b3JrX21lbSAqIChzaXplX3Qp IDEwMjQ7CisKKwlpZiAocHZzLT5pc19hdXRvdmFjdXVtKQorCQlzaGFyZWQtPm1haW50ZW5hbmNl X3dvcmtfbWVtX3dvcmtlciA9CisJCQkobmluZGV4ZXNfbXdtID4gMCkgPworCQkJYXV0b3ZhY3V1 bV93b3JrX21lbSAvIE1pbihwYXJhbGxlbF93b3JrZXJzLCBuaW5kZXhlc19td20pIDoKKwkJCWF1 dG92YWN1dW1fd29ya19tZW07CisJZWxzZQorCQlzaGFyZWQtPm1haW50ZW5hbmNlX3dvcmtfbWVt X3dvcmtlciA9CisJCQkobmluZGV4ZXNfbXdtID4gMCkgPworCQkJbWFpbnRlbmFuY2Vfd29ya19t ZW0gLyBNaW4ocGFyYWxsZWxfd29ya2VycywgbmluZGV4ZXNfbXdtKSA6CisJCQltYWludGVuYW5j ZV93b3JrX21lbTsKKwlzaGFyZWQtPmRlYWRfaXRlbXNfaW5mby5tYXhfYnl0ZXMgPSB2YWNfd29y a19tZW0gKiAxMDI0TDsKIAogCS8qIFByZXBhcmUgRFNBIHNwYWNlIGZvciBkZWFkIGl0ZW1zICov CiAJZGVhZF9pdGVtcyA9IFRpZFN0b3JlQ3JlYXRlU2hhcmVkKHNoYXJlZC0+ZGVhZF9pdGVtc19p bmZvLm1heF9ieXRlcywKQEAgLTQ1Myw4ICs0ODcsMTMgQEAgcGFyYWxsZWxfdmFjdXVtX2VuZChQ YXJhbGxlbFZhY3V1bVN0YXRlICpwdnMsIEluZGV4QnVsa0RlbGV0ZVJlc3VsdCAqKmlzdGF0cykK IAogCVRpZFN0b3JlRGVzdHJveShwdnMtPmRlYWRfaXRlbXMpOwogCi0JRGVzdHJveVBhcmFsbGVs Q29udGV4dChwdnMtPnBjeHQpOwotCUV4aXRQYXJhbGxlbE1vZGUoKTsKKwlpZiAocHZzLT5pc19h dXRvdmFjdXVtKQorCQlEZXN0cm95UGFyYWxsZWxBdXRvVmFjQ29udGV4dChwdnMtPnBjeHQpOwor CWVsc2UKKwl7CisJCURlc3Ryb3lQYXJhbGxlbENvbnRleHQoKFBhcmFsbGVsQ29udGV4dCAqKSBw dnMtPnBjeHQpOworCQlFeGl0UGFyYWxsZWxNb2RlKCk7CisJfQogCiAJcGZyZWUocHZzLT53aWxs X3BhcmFsbGVsX3ZhY3V1bSk7CiAJcGZyZWUocHZzKTsKQEAgLTUzMiw2ICs1NzEsMTQ0IEBAIHBh cmFsbGVsX3ZhY3V1bV9jbGVhbnVwX2FsbF9pbmRleGVzKFBhcmFsbGVsVmFjdXVtU3RhdGUgKnB2 cywgbG9uZyBudW1fdGFibGVfdHVwCiAJcGFyYWxsZWxfdmFjdXVtX3Byb2Nlc3NfYWxsX2luZGV4 ZXMocHZzLCBudW1faW5kZXhfc2NhbnMsIGZhbHNlKTsKIH0KIAorLyoKKyAqIFNob3J0IHZlcnNp b24gb2YgQ3JlYXRlUGFyYWxsZWxDb250ZXh0IChwYXJhbGxlbC5jKS4gSGVyZSB3ZSBpbml0IG9u bHkgdGhvc2UKKyAqIGZpZWxkcyB0aGF0IGFyZSBuZWVkZWQgZm9yIHBhcmFsbGVsIGluZGV4IHBy b2Nlc3NpbmcgZHVyaW5nIGF1dG92YWN1dW0uCisgKi8KK3N0YXRpYyBQYXJhbGxlbENvbnRleHQg KgorQ3JlYXRlUGFyYWxsZWxBdXRvVmFjQ29udGV4dChpbnQgbndvcmtlcnMpCit7CisJUGFyYWxs ZWxDb250ZXh0ICpwY3h0OworCU1lbW9yeUNvbnRleHQgb2xkY29udGV4dDsKKworCUFzc2VydChB bUF1dG9WYWN1dW1Xb3JrZXJQcm9jZXNzKCkpOworCisJLyogTnVtYmVyIG9mIHdvcmtlcnMgc2hv dWxkIGJlIG5vbi1uZWdhdGl2ZS4gKi8KKwlBc3NlcnQobndvcmtlcnMgPj0gMCk7CisKKwkvKiBX ZSBtaWdodCBiZSBydW5uaW5nIGluIGEgc2hvcnQtbGl2ZWQgbWVtb3J5IGNvbnRleHQuICovCisJ b2xkY29udGV4dCA9IE1lbW9yeUNvbnRleHRTd2l0Y2hUbyhUb3BUcmFuc2FjdGlvbkNvbnRleHQp OworCisJLyogSW5pdGlhbGl6ZSBhIG5ldyBQYXJhbGxlbENvbnRleHQuICovCisJcGN4dCA9IHBh bGxvYzAoc2l6ZW9mKFBhcmFsbGVsQ29udGV4dCkpOworCXBjeHQtPm53b3JrZXJzID0gbndvcmtl cnM7CisJcGN4dC0+bndvcmtlcnNfdG9fbGF1bmNoID0gbndvcmtlcnM7CisJc2htX3RvY19pbml0 aWFsaXplX2VzdGltYXRvcigmcGN4dC0+ZXN0aW1hdG9yKTsKKworCS8qIFJlc3RvcmUgcHJldmlv dXMgbWVtb3J5IGNvbnRleHQuICovCisJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZGNvbnRleHQp OworCisJcmV0dXJuIHBjeHQ7Cit9CisKKy8qCisgKiBTaG9ydCB2ZXJzaW9uIG9mIEluaXRpYWxp emVQYXJhbGxlbERTTSAocGFyYWxsZWwuYykuIEhlcmUgd2UgcHV0IGludG8gZHNtCisgKiBvbmx5 IHRob3NlIGRhdGEgdGhhdCBhcmUgbmVlZGVkIGZvciBwYXJhbGxlbCBpbmRleCBwcm9jZXNzaW5n IGR1cmluZworICogYXV0b3ZhY3V1bS4KKyAqLworc3RhdGljIHZvaWQKK0luaXRpYWxpemVQYXJh bGxlbEF1dG9WYWNEU00oUGFyYWxsZWxDb250ZXh0ICpwY3h0KQoreworCU1lbW9yeUNvbnRleHQg b2xkY29udGV4dDsKKwlTaXplCQl0c25hcGxlbiA9IDA7CisJU2l6ZQkJYXNuYXBsZW4gPSAwOwor CVNpemUJCXNlZ3NpemUgPSAwOworCWNoYXIJICAgKnRzbmFwc3BhY2U7CisJY2hhcgkgICAqYXNu YXBzcGFjZTsKKwlTbmFwc2hvdAl0cmFuc2FjdGlvbl9zbmFwc2hvdCA9IEdldFRyYW5zYWN0aW9u U25hcHNob3QoKTsKKwlTbmFwc2hvdAlhY3RpdmVfc25hcHNob3QgPSBHZXRBY3RpdmVTbmFwc2hv dCgpOworCisJQXNzZXJ0KHBjeHQtPm53b3JrZXJzID49IDEpOworCisJLyogV2UgbWlnaHQgYmUg cnVubmluZyBpbiBhIHZlcnkgc2hvcnQtbGl2ZWQgbWVtb3J5IGNvbnRleHQuICovCisJb2xkY29u dGV4dCA9IE1lbW9yeUNvbnRleHRTd2l0Y2hUbyhUb3BUcmFuc2FjdGlvbkNvbnRleHQpOworCisJ aWYgKElzb2xhdGlvblVzZXNYYWN0U25hcHNob3QoKSkKKwl7CisJCXRzbmFwbGVuID0gRXN0aW1h dGVTbmFwc2hvdFNwYWNlKHRyYW5zYWN0aW9uX3NuYXBzaG90KTsKKwkJc2htX3RvY19lc3RpbWF0 ZV9jaHVuaygmcGN4dC0+ZXN0aW1hdG9yLCB0c25hcGxlbik7CisJCXNobV90b2NfZXN0aW1hdGVf a2V5cygmcGN4dC0+ZXN0aW1hdG9yLCAxKTsKKwl9CisJYXNuYXBsZW4gPSBFc3RpbWF0ZVNuYXBz aG90U3BhY2UoYWN0aXZlX3NuYXBzaG90KTsKKwlzaG1fdG9jX2VzdGltYXRlX2NodW5rKCZwY3h0 LT5lc3RpbWF0b3IsIGFzbmFwbGVuKTsKKwlzaG1fdG9jX2VzdGltYXRlX2tleXMoJnBjeHQtPmVz dGltYXRvciwgMSk7CisKKworCS8qIENyZWF0ZSBEU00gYW5kIGluaXRpYWxpemUgd2l0aCBuZXcg dGFibGUgb2YgY29udGVudHMuICovCisJc2Vnc2l6ZSA9IHNobV90b2NfZXN0aW1hdGUoJnBjeHQt PmVzdGltYXRvcik7CisJcGN4dC0+c2VnID0gZHNtX2NyZWF0ZShzZWdzaXplLCBEU01fQ1JFQVRF X05VTExfSUZfTUFYU0VHTUVOVFMpOworCisJaWYgKHBjeHQtPnNlZyA9PSBOVUxMKQorCXsKKwkJ cGN4dC0+bndvcmtlcnMgPSAwOworCQlwY3h0LT5wcml2YXRlX21lbW9yeSA9IE1lbW9yeUNvbnRl eHRBbGxvYyhUb3BNZW1vcnlDb250ZXh0LCBzZWdzaXplKTsKKwl9CisKKwlwY3h0LT50b2MgPSBz aG1fdG9jX2NyZWF0ZShBVl9QQVJBTExFTF9NQUdJQywKKwkJCQkJCQkgICBwY3h0LT5zZWcgPT0g TlVMTCA/IHBjeHQtPnByaXZhdGVfbWVtb3J5IDoKKwkJCQkJCQkJCQkJCSAgIGRzbV9zZWdtZW50 X2FkZHJlc3MocGN4dC0+c2VnKSwKKwkJCQkJCQkgICBzZWdzaXplKTsKKworCS8qIFdlIGNhbiBz a2lwIHRoZSByZXN0IG9mIHRoaXMgaWYgd2UncmUgbm90IGJ1ZGdldGluZyBmb3IgYW55IHdvcmtl cnMuICovCisJaWYgKHBjeHQtPm53b3JrZXJzID4gMCkKKwl7CisJCS8qCisJCSAqIFNlcmlhbGl6 ZSB0aGUgdHJhbnNhY3Rpb24gc25hcHNob3QgaWYgdGhlIHRyYW5zYWN0aW9uIGlzb2xhdGlvbgor CQkgKiBsZXZlbCB1c2VzIGEgdHJhbnNhY3Rpb24gc25hcHNob3QuCisJCSAqLworCQlpZiAoSXNv bGF0aW9uVXNlc1hhY3RTbmFwc2hvdCgpKQorCQl7CisJCQl0c25hcHNwYWNlID0gc2htX3RvY19h bGxvY2F0ZShwY3h0LT50b2MsIHRzbmFwbGVuKTsKKwkJCVNlcmlhbGl6ZVNuYXBzaG90KHRyYW5z YWN0aW9uX3NuYXBzaG90LCB0c25hcHNwYWNlKTsKKwkJCXNobV90b2NfaW5zZXJ0KHBjeHQtPnRv YywgQVZfUEFSQUxMRUxfS0VZX1RSQU5TQUNUSU9OX1NOQVBTSE9ULAorCQkJCQkJICAgdHNuYXBz cGFjZSk7CisJCX0KKworCQkvKiBTZXJpYWxpemUgdGhlIGFjdGl2ZSBzbmFwc2hvdC4gKi8KKwkJ YXNuYXBzcGFjZSA9IHNobV90b2NfYWxsb2NhdGUocGN4dC0+dG9jLCBhc25hcGxlbik7CisJCVNl cmlhbGl6ZVNuYXBzaG90KGFjdGl2ZV9zbmFwc2hvdCwgYXNuYXBzcGFjZSk7CisJCXNobV90b2Nf aW5zZXJ0KHBjeHQtPnRvYywgQVZfUEFSQUxMRUxfS0VZX0FDVElWRV9TTkFQU0hPVCwgYXNuYXBz cGFjZSk7CisJfQorCisJLyogVXBkYXRlIG53b3JrZXJzX3RvX2xhdW5jaCwgaW4gY2FzZSB3ZSBj aGFuZ2VkIG53b3JrZXJzIGFib3ZlLiAqLworCXBjeHQtPm53b3JrZXJzX3RvX2xhdW5jaCA9IHBj eHQtPm53b3JrZXJzOworCisJLyogUmVzdG9yZSBwcmV2aW91cyBtZW1vcnkgY29udGV4dC4gKi8K KwlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkY29udGV4dCk7Cit9CisKKy8qCisgKiBTaG9ydCB2 ZXJzaW9uIG9mIERlc3Ryb3lQYXJhbGxlbENvbnRleHQgKHBhcmFsbGVsLmMpLiBIZXJlIHdlIGNs ZWFuIHVwIG9ubHkKKyAqIHRob3NlIGRhdGEgdGhhdCB3ZXJlIHVzZWQgZHVyaW5nIHBhcmFsbGVs IGluZGV4IHByb2Nlc3NpbmcgZHVyaW5nIGF1dG92YWN1dW0uCisgKi8KK3N0YXRpYyB2b2lkCitE ZXN0cm95UGFyYWxsZWxBdXRvVmFjQ29udGV4dChQYXJhbGxlbENvbnRleHQgKnBjeHQpCit7CisJ LyoKKwkgKiBJZiB3ZSBoYXZlIGFsbG9jYXRlZCBhIHNoYXJlZCBtZW1vcnkgc2VnbWVudCwgZGV0 YWNoIGl0LiAgVGhpcyB3aWxsCisJICogaW1wbGljaXRseSBkZXRhY2ggdGhlIGVycm9yIHF1ZXVl cywgYW5kIGFueSBvdGhlciBzaGFyZWQgbWVtb3J5IHF1ZXVlcywKKwkgKiBzdG9yZWQgdGhlcmUu CisJICovCisJaWYgKHBjeHQtPnNlZyAhPSBOVUxMKQorCXsKKwkJZHNtX2RldGFjaChwY3h0LT5z ZWcpOworCQlwY3h0LT5zZWcgPSBOVUxMOworCX0KKworCS8qCisJICogSWYgdGhpcyBwYXJhbGxl bCBjb250ZXh0IGlzIGFjdHVhbGx5IGluIGJhY2tlbmQtcHJpdmF0ZSBtZW1vcnkgcmF0aGVyCisJ ICogdGhhbiBzaGFyZWQgbWVtb3J5LCBmcmVlIHRoYXQgbWVtb3J5IGluc3RlYWQuCisJICovCisJ aWYgKHBjeHQtPnByaXZhdGVfbWVtb3J5ICE9IE5VTEwpCisJeworCQlwZnJlZShwY3h0LT5wcml2 YXRlX21lbW9yeSk7CisJCXBjeHQtPnByaXZhdGVfbWVtb3J5ID0gTlVMTDsKKwl9CisKKwlBdXRv VmFjdXVtUmVsZWFzZVBhcmFsbGVsV29yayhmYWxzZSk7CisJcGZyZWUocGN4dCk7Cit9CisKIC8q CiAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgcGFyYWxsZWwgd29ya2VyIHByb2Nlc3NlcyB0byBy ZXF1ZXN0LiAgQm90aCBpbmRleAogICogdmFjdXVtIGFuZCBpbmRleCBjbGVhbnVwIGNhbiBiZSBl eGVjdXRlZCB3aXRoIHBhcmFsbGVsIHdvcmtlcnMuCkBAIC01NTgsNyArNzM1LDkgQEAgcGFyYWxs ZWxfdmFjdXVtX2NvbXB1dGVfd29ya2VycyhSZWxhdGlvbiAqaW5kcmVscywgaW50IG5pbmRleGVz LCBpbnQgbnJlcXVlc3RlZCwKIAkgKiBXZSBkb24ndCBhbGxvdyBwZXJmb3JtaW5nIHBhcmFsbGVs IG9wZXJhdGlvbiBpbiBzdGFuZGFsb25lIGJhY2tlbmQgb3IKIAkgKiB3aGVuIHBhcmFsbGVsaXNt IGlzIGRpc2FibGVkLgogCSAqLwotCWlmICghSXNVbmRlclBvc3RtYXN0ZXIgfHwgbWF4X3BhcmFs bGVsX21haW50ZW5hbmNlX3dvcmtlcnMgPT0gMCkKKwlpZiAoIUlzVW5kZXJQb3N0bWFzdGVyIHx8 CisJCShtYXhfcGFyYWxsZWxfbWFpbnRlbmFuY2Vfd29ya2VycyA9PSAwICYmICFBbUF1dG9WYWN1 dW1Xb3JrZXJQcm9jZXNzKCkpIHx8CisJCShtYXhfcGFyYWxsZWxfaW5kZXhfYXV0b3ZhY193b3Jr ZXJzID09IDAgJiYgQW1BdXRvVmFjdXVtV29ya2VyUHJvY2VzcygpKSkKIAkJcmV0dXJuIDA7CiAK IAkvKgpAQCAtNTk3LDE1ICs3NzYsMTcgQEAgcGFyYWxsZWxfdmFjdXVtX2NvbXB1dGVfd29ya2Vy cyhSZWxhdGlvbiAqaW5kcmVscywgaW50IG5pbmRleGVzLCBpbnQgbnJlcXVlc3RlZCwKIAlwYXJh bGxlbF93b3JrZXJzID0gKG5yZXF1ZXN0ZWQgPiAwKSA/CiAJCU1pbihucmVxdWVzdGVkLCBuaW5k ZXhlc19wYXJhbGxlbCkgOiBuaW5kZXhlc19wYXJhbGxlbDsKIAotCS8qIENhcCBieSBtYXhfcGFy YWxsZWxfbWFpbnRlbmFuY2Vfd29ya2VycyAqLwotCXBhcmFsbGVsX3dvcmtlcnMgPSBNaW4ocGFy YWxsZWxfd29ya2VycywgbWF4X3BhcmFsbGVsX21haW50ZW5hbmNlX3dvcmtlcnMpOworCS8qIENh cCBieSBHVUMgdmFyaWFibGUgKi8KKwlwYXJhbGxlbF93b3JrZXJzID0gQW1BdXRvVmFjdXVtV29y a2VyUHJvY2VzcygpID8KKwkJTWluKHBhcmFsbGVsX3dvcmtlcnMsIG1heF9wYXJhbGxlbF9pbmRl eF9hdXRvdmFjX3dvcmtlcnMpIDoKKwkJTWluKHBhcmFsbGVsX3dvcmtlcnMsIG1heF9wYXJhbGxl bF9tYWludGVuYW5jZV93b3JrZXJzKTsKIAogCXJldHVybiBwYXJhbGxlbF93b3JrZXJzOwogfQog CiAvKgogICogUGVyZm9ybSBpbmRleCB2YWN1dW0gb3IgaW5kZXggY2xlYW51cCB3aXRoIHBhcmFs bGVsIHdvcmtlcnMuICBUaGlzIGZ1bmN0aW9uCi0gKiBtdXN0IGJlIHVzZWQgYnkgdGhlIHBhcmFs bGVsIHZhY3V1bSBsZWFkZXIgcHJvY2Vzcy4KKyAqIG11c3QgYmUgdXNlZCBieSB0aGUgcGFyYWxs ZWwgW2F1dG9ddmFjdXVtIGxlYWRlciBwcm9jZXNzLgogICovCiBzdGF0aWMgdm9pZAogcGFyYWxs ZWxfdmFjdXVtX3Byb2Nlc3NfYWxsX2luZGV4ZXMoUGFyYWxsZWxWYWN1dW1TdGF0ZSAqcHZzLCBp bnQgbnVtX2luZGV4X3NjYW5zLApAQCAtNjcwLDcgKzg1MSw3IEBAIHBhcmFsbGVsX3ZhY3V1bV9w cm9jZXNzX2FsbF9pbmRleGVzKFBhcmFsbGVsVmFjdXVtU3RhdGUgKnB2cywgaW50IG51bV9pbmRl eF9zY2FuCiAJaWYgKG53b3JrZXJzID4gMCkKIAl7CiAJCS8qIFJlaW5pdGlhbGl6ZSBwYXJhbGxl bCBjb250ZXh0IHRvIHJlbGF1bmNoIHBhcmFsbGVsIHdvcmtlcnMgKi8KLQkJaWYgKG51bV9pbmRl eF9zY2FucyA+IDApCisJCWlmIChudW1faW5kZXhfc2NhbnMgPiAwICYmICFwdnMtPmlzX2F1dG92 YWN1dW0pCiAJCQlSZWluaXRpYWxpemVQYXJhbGxlbERTTShwdnMtPnBjeHQpOwogCiAJCS8qCkBA IC02ODYsOSArODY3LDIzIEBAIHBhcmFsbGVsX3ZhY3V1bV9wcm9jZXNzX2FsbF9pbmRleGVzKFBh cmFsbGVsVmFjdXVtU3RhdGUgKnB2cywgaW50IG51bV9pbmRleF9zY2FuCiAJCSAqIFRoZSBudW1i ZXIgb2Ygd29ya2VycyBjYW4gdmFyeSBiZXR3ZWVuIGJ1bGtkZWxldGUgYW5kIGNsZWFudXAKIAkJ ICogcGhhc2UuCiAJCSAqLwotCQlSZWluaXRpYWxpemVQYXJhbGxlbFdvcmtlcnMocHZzLT5wY3h0 LCBud29ya2Vycyk7Ci0KLQkJTGF1bmNoUGFyYWxsZWxXb3JrZXJzKHB2cy0+cGN4dCk7CisJCWlm IChwdnMtPmlzX2F1dG92YWN1dW0pCisJCXsKKwkJCXB2cy0+cGN4dC0+bndvcmtlcnNfdG9fbGF1 bmNoID0gTWluKHB2cy0+cGN4dC0+bndvcmtlcnMsIG53b3JrZXJzKTsKKwkJCWlmIChwdnMtPnBj eHQtPm53b3JrZXJzID4gMCAmJiBwdnMtPnBjeHQtPm53b3JrZXJzX3RvX2xhdW5jaCA+IDApCisJ CQl7CisJCQkJcHZzLT5wY3h0LT5ud29ya2Vyc19sYXVuY2hlZCA9CisJCQkJCUxhdW5jaFBhcmFs bGVsQXV0b3ZhY3V1bVdvcmtlcnMocHZzLT5oZWFwcmVsLT5yZF9pZCwKKwkJCQkJCQkJCQkJCQlw dnMtPnBjeHQtPm53b3JrZXJzX3RvX2xhdW5jaCwKKwkJCQkJCQkJCQkJCQlkc21fc2VnbWVudF9o YW5kbGUocHZzLT5wY3h0LT5zZWcpLAorCQkJCQkJCQkJCQkJCU15UHJvYywgTXlQcm9jUGlkKTsK KwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCVJlaW5pdGlhbGl6ZVBhcmFsbGVsV29ya2Vycyhw dnMtPnBjeHQsIG53b3JrZXJzKTsKKwkJCUxhdW5jaFBhcmFsbGVsV29ya2VycyhwdnMtPnBjeHQp OworCQl9CiAKIAkJaWYgKHB2cy0+cGN4dC0+bndvcmtlcnNfbGF1bmNoZWQgPiAwKQogCQl7CkBA IC03MzMsOCArOTI4LDE0IEBAIHBhcmFsbGVsX3ZhY3V1bV9wcm9jZXNzX2FsbF9pbmRleGVzKFBh cmFsbGVsVmFjdXVtU3RhdGUgKnB2cywgaW50IG51bV9pbmRleF9zY2FuCiAJICovCiAJaWYgKG53 b3JrZXJzID4gMCkKIAl7Ci0JCS8qIFdhaXQgZm9yIGFsbCB2YWN1dW0gd29ya2VycyB0byBmaW5p c2ggKi8KLQkJV2FpdEZvclBhcmFsbGVsV29ya2Vyc1RvRmluaXNoKHB2cy0+cGN4dCk7CisJCS8q CisJCSAqIFdhaXQgZm9yIGFsbCBbYXV0b112YWN1dW0gd29ya2VycyAoaW52b2x2ZWQgaW4gcGFy YWxsZWwgaW5kZXgKKwkJICogcHJvY2Vzc2luZykgdG8gZmluaXNoLgorCQkgKi8KKwkJaWYgKHB2 cy0+aXNfYXV0b3ZhY3V1bSkKKwkJCVBhcmFsbGVsQXV0b3ZhY3V1bUVuZFN5bmNQb2ludChmYWxz ZSk7CisJCWVsc2UKKwkJCVdhaXRGb3JQYXJhbGxlbFdvcmtlcnNUb0ZpbmlzaChwdnMtPnBjeHQp OwogCiAJCWZvciAoaW50IGkgPSAwOyBpIDwgcHZzLT5wY3h0LT5ud29ya2Vyc19sYXVuY2hlZDsg aSsrKQogCQkJSW5zdHJBY2N1bVBhcmFsbGVsUXVlcnkoJnB2cy0+YnVmZmVyX3VzYWdlW2ldLCAm cHZzLT53YWxfdXNhZ2VbaV0pOwpAQCAtOTgyLDggKzExODMsOCBAQCBwYXJhbGxlbF92YWN1dW1f aW5kZXhfaXNfcGFyYWxsZWxfc2FmZShSZWxhdGlvbiBpbmRyZWwsIGludCBudW1faW5kZXhfc2Nh bnMsCiAvKgogICogUGVyZm9ybSB3b3JrIHdpdGhpbiBhIGxhdW5jaGVkIHBhcmFsbGVsIHByb2Nl c3MuCiAgKgotICogU2luY2UgcGFyYWxsZWwgdmFjdXVtIHdvcmtlcnMgcGVyZm9ybSBvbmx5IGlu ZGV4IHZhY3V1bSBvciBpbmRleCBjbGVhbnVwLAotICogd2UgZG9uJ3QgbmVlZCB0byByZXBvcnQg cHJvZ3Jlc3MgaW5mb3JtYXRpb24uCisgKiBTaW5jZSBwYXJhbGxlbCBbYXV0b112YWN1dW0gd29y a2VycyBwZXJmb3JtIG9ubHkgaW5kZXggdmFjdXVtIG9yIGluZGV4CisgKiBjbGVhbnVwLCB3ZSBk b24ndCBuZWVkIHRvIHJlcG9ydCBwcm9ncmVzcyBpbmZvcm1hdGlvbi4KICAqLwogdm9pZAogcGFy YWxsZWxfdmFjdXVtX21haW4oZHNtX3NlZ21lbnQgKnNlZywgc2htX3RvYyAqdG9jKQpAQCAtOTk3 LDIzICsxMTk4LDIyIEBAIHBhcmFsbGVsX3ZhY3V1bV9tYWluKGRzbV9zZWdtZW50ICpzZWcsIHNo bV90b2MgKnRvYykKIAlCdWZmZXJVc2FnZSAqYnVmZmVyX3VzYWdlOwogCVdhbFVzYWdlICAgKndh bF91c2FnZTsKIAlpbnQJCQluaW5kZXhlczsKKwlpbnQJCQl3b3JrZXJfbnVtYmVyOwogCWNoYXIJ ICAgKnNoYXJlZHF1ZXJ5OwogCUVycm9yQ29udGV4dENhbGxiYWNrIGVycmNhbGxiYWNrOwogCi0J LyoKLQkgKiBBIHBhcmFsbGVsIHZhY3V1bSB3b3JrZXIgbXVzdCBoYXZlIG9ubHkgUFJPQ19JTl9W QUNVVU0gZmxhZyBzaW5jZSB3ZQotCSAqIGRvbid0IHN1cHBvcnQgcGFyYWxsZWwgdmFjdXVtIGZv ciBhdXRvdmFjdXVtIGFzIG9mIG5vdy4KLQkgKi8KLQlBc3NlcnQoTXlQcm9jLT5zdGF0dXNGbGFn cyA9PSBQUk9DX0lOX1ZBQ1VVTSk7Ci0KLQllbG9nKERFQlVHMSwgInN0YXJ0aW5nIHBhcmFsbGVs IHZhY3V1bSB3b3JrZXIiKTsKKwlBc3NlcnQoTXlQcm9jLT5zdGF0dXNGbGFncyA9PSBQUk9DX0lO X1ZBQ1VVTSB8fCBBbUF1dG9WYWN1dW1Xb3JrZXJQcm9jZXNzKCkpOworCWVsb2coREVCVUcxLCAi c3RhcnRpbmcgcGFyYWxsZWwgW2F1dG9ddmFjdXVtIHdvcmtlciIpOwogCiAJc2hhcmVkID0gKFBW U2hhcmVkICopIHNobV90b2NfbG9va3VwKHRvYywgUEFSQUxMRUxfVkFDVVVNX0tFWV9TSEFSRUQs IGZhbHNlKTsKIAogCS8qIFNldCBkZWJ1Z19xdWVyeV9zdHJpbmcgZm9yIGluZGl2aWR1YWwgd29y a2VycyAqLwotCXNoYXJlZHF1ZXJ5ID0gc2htX3RvY19sb29rdXAodG9jLCBQQVJBTExFTF9WQUNV VU1fS0VZX1FVRVJZX1RFWFQsIHRydWUpOwotCWRlYnVnX3F1ZXJ5X3N0cmluZyA9IHNoYXJlZHF1 ZXJ5OwotCXBnc3RhdF9yZXBvcnRfYWN0aXZpdHkoU1RBVEVfUlVOTklORywgZGVidWdfcXVlcnlf c3RyaW5nKTsKKwlpZiAoIUFtQXV0b1ZhY3V1bVdvcmtlclByb2Nlc3MoKSkKKwl7CisJCXNoYXJl ZHF1ZXJ5ID0gc2htX3RvY19sb29rdXAodG9jLCBQQVJBTExFTF9WQUNVVU1fS0VZX1FVRVJZX1RF WFQsIHRydWUpOworCQlkZWJ1Z19xdWVyeV9zdHJpbmcgPSBzaGFyZWRxdWVyeTsKKwkJcGdzdGF0 X3JlcG9ydF9hY3Rpdml0eShTVEFURV9SVU5OSU5HLCBkZWJ1Z19xdWVyeV9zdHJpbmcpOworCX0K IAogCS8qIFRyYWNrIHF1ZXJ5IElEICovCiAJcGdzdGF0X3JlcG9ydF9xdWVyeV9pZChzaGFyZWQt PnF1ZXJ5aWQsIGZhbHNlKTsKQEAgLTEwOTEsOCArMTI5MSwxMiBAQCBwYXJhbGxlbF92YWN1dW1f bWFpbihkc21fc2VnbWVudCAqc2VnLCBzaG1fdG9jICp0b2MpCiAJLyogUmVwb3J0IGJ1ZmZlci9X QUwgdXNhZ2UgZHVyaW5nIHBhcmFsbGVsIGV4ZWN1dGlvbiAqLwogCWJ1ZmZlcl91c2FnZSA9IHNo bV90b2NfbG9va3VwKHRvYywgUEFSQUxMRUxfVkFDVVVNX0tFWV9CVUZGRVJfVVNBR0UsIGZhbHNl KTsKIAl3YWxfdXNhZ2UgPSBzaG1fdG9jX2xvb2t1cCh0b2MsIFBBUkFMTEVMX1ZBQ1VVTV9LRVlf V0FMX1VTQUdFLCBmYWxzZSk7Ci0JSW5zdHJFbmRQYXJhbGxlbFF1ZXJ5KCZidWZmZXJfdXNhZ2Vb UGFyYWxsZWxXb3JrZXJOdW1iZXJdLAotCQkJCQkJICAmd2FsX3VzYWdlW1BhcmFsbGVsV29ya2Vy TnVtYmVyXSk7CisKKwl3b3JrZXJfbnVtYmVyID0gQW1BdXRvVmFjdXVtV29ya2VyUHJvY2Vzcygp ID8KKwkJR2V0QXV0b1ZhY3V1bVBhcmFsbGVsV29ya2VyTnVtYmVyKCkgOiBQYXJhbGxlbFdvcmtl ck51bWJlcjsKKworCUluc3RyRW5kUGFyYWxsZWxRdWVyeSgmYnVmZmVyX3VzYWdlW3dvcmtlcl9u dW1iZXJdLAorCQkJCQkJICAmd2FsX3VzYWdlW3dvcmtlcl9udW1iZXJdKTsKIAogCS8qIFJlcG9y dCBhbnkgcmVtYWluaW5nIGNvc3QtYmFzZWQgdmFjdXVtIGRlbGF5IHRpbWUgKi8KIAlpZiAodHJh Y2tfY29zdF9kZWxheV90aW1pbmcpCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9wb3N0bWFzdGVy L2F1dG92YWN1dW0uYyBiL3NyYy9iYWNrZW5kL3Bvc3RtYXN0ZXIvYXV0b3ZhY3V1bS5jCmluZGV4 IDE2NzU2MTUyYjcxLi42MDE5MmVjYjhmNSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvcG9zdG1h c3Rlci9hdXRvdmFjdXVtLmMKKysrIGIvc3JjL2JhY2tlbmQvcG9zdG1hc3Rlci9hdXRvdmFjdXVt LmMKQEAgLTkwLDYgKzkwLDcgQEAKICNpbmNsdWRlICJwb3N0bWFzdGVyL3Bvc3RtYXN0ZXIuaCIK ICNpbmNsdWRlICJzdG9yYWdlL2Fpb19zdWJzeXMuaCIKICNpbmNsdWRlICJzdG9yYWdlL2J1Zm1n ci5oIgorI2luY2x1ZGUgInN0b3JhZ2UvY29uZGl0aW9uX3ZhcmlhYmxlLmgiCiAjaW5jbHVkZSAi c3RvcmFnZS9pcGMuaCIKICNpbmNsdWRlICJzdG9yYWdlL2xhdGNoLmgiCiAjaW5jbHVkZSAic3Rv cmFnZS9sbWdyLmgiCkBAIC0xMDIsNiArMTAzLDcgQEAKICNpbmNsdWRlICJ1dGlscy9mbWdycHJv dG9zLmgiCiAjaW5jbHVkZSAidXRpbHMvZ3VjX2hvb2tzLmgiCiAjaW5jbHVkZSAidXRpbHMvaW5q ZWN0aW9uX3BvaW50LmgiCisjaW5jbHVkZSAidXRpbHMvaW52YWwuaCIKICNpbmNsdWRlICJ1dGls cy9sc3lzY2FjaGUuaCIKICNpbmNsdWRlICJ1dGlscy9tZW11dGlscy5oIgogI2luY2x1ZGUgInV0 aWxzL3BzX3N0YXR1cy5oIgpAQCAtMTI5LDYgKzEzMSw5IEBAIGludAkJCWF1dG92YWN1dW1fYW5s X3RocmVzaDsKIGRvdWJsZQkJYXV0b3ZhY3V1bV9hbmxfc2NhbGU7CiBpbnQJCQlhdXRvdmFjdXVt X2ZyZWV6ZV9tYXhfYWdlOwogaW50CQkJYXV0b3ZhY3V1bV9tdWx0aXhhY3RfZnJlZXplX21heF9h Z2U7CitpbnQJCQltYXhfcGFyYWxsZWxfaW5kZXhfYXV0b3ZhY193b3JrZXJzOworaW50CQkJYXV0 b3ZhY19pZHhfcGFyYWxsZWxfbWluX3Jvd3M7CitpbnQJCQlhdXRvdmFjX2lkeF9wYXJhbGxlbF9t aW5faW5kZXhlczsKIAogZG91YmxlCQlhdXRvdmFjdXVtX3ZhY19jb3N0X2RlbGF5OwogaW50CQkJ YXV0b3ZhY3V1bV92YWNfY29zdF9saW1pdDsKQEAgLTE2NCw2ICsxNjksMTQgQEAgc3RhdGljIGlu dAlkZWZhdWx0X2ZyZWV6ZV90YWJsZV9hZ2U7CiBzdGF0aWMgaW50CWRlZmF1bHRfbXVsdGl4YWN0 X2ZyZWV6ZV9taW5fYWdlOwogc3RhdGljIGludAlkZWZhdWx0X211bHRpeGFjdF9mcmVlemVfdGFi bGVfYWdlOwogCisvKgorICogTnVtYmVyIG9mIGFkZGl0aW9uYWwgd29ya2VycyB0aGF0IHdhcyBy ZXF1ZXN0ZWQgZm9yIHBhcmFsbGVsIGluZGV4IHByb2Nlc3NpbmcKKyAqIGR1cmluZyBhdXRvdmFj dXVtLgorICovCitzdGF0aWMgaW50CW53b3JrZXJzX2Zvcl9pZHhfYXV0b3ZhYyA9IDA7CisKK3N0 YXRpYyBpbnQgbndvcmtlcnNfbGF1bmNoZWQgPSAwOworCiAvKiBNZW1vcnkgY29udGV4dCBmb3Ig bG9uZy1saXZlZCBkYXRhICovCiBzdGF0aWMgTWVtb3J5Q29udGV4dCBBdXRvdmFjTWVtQ3h0Owog CkBAIC0yMjIsNiArMjM1LDggQEAgdHlwZWRlZiBzdHJ1Y3QgYXV0b3ZhY190YWJsZQogICogd2lf cHJvYwkJcG9pbnRlciB0byBQR1BST0Mgb2YgdGhlIHJ1bm5pbmcgd29ya2VyLCBOVUxMIGlmIG5v dCBzdGFydGVkCiAgKiB3aV9sYXVuY2h0aW1lIFRpbWUgYXQgd2hpY2ggdGhpcyB3b3JrZXIgd2Fz IGxhdW5jaGVkCiAgKiB3aV9kb2JhbGFuY2UgV2hldGhlciB0aGlzIHdvcmtlciBzaG91bGQgYmUg aW5jbHVkZWQgaW4gYmFsYW5jZSBjYWxjdWxhdGlvbnMKKyAqIHdpX3BjbGVhbnVwIGlmICg+IDAp ID0+IHRoaXMgd29ya2VyIG11c3QgcGFydGljaXBhdGUgaW4gcGFyYWxsZWwgaW5kZXgKKyAqIAkJ CSAgIHZhY3V1bWluZyBhcyBzdXBwb3J0aXZlIC4gTXVzdCBiZSAoPT0gMCkgZm9yIGxlYWRlciB3 b3JrZXIuCiAgKgogICogQWxsIGZpZWxkcyBhcmUgcHJvdGVjdGVkIGJ5IEF1dG92YWN1dW1Mb2Nr LCBleGNlcHQgZm9yIHdpX3RhYmxlb2lkIGFuZAogICogd2lfc2hhcmVkcmVsIHdoaWNoIGFyZSBw cm90ZWN0ZWQgYnkgQXV0b3ZhY3V1bVNjaGVkdWxlTG9jayAobm90ZSB0aGVzZQpAQCAtMjM3LDEw ICsyNTIsMTcgQEAgdHlwZWRlZiBzdHJ1Y3QgV29ya2VySW5mb0RhdGEKIAlUaW1lc3RhbXBUeiB3 aV9sYXVuY2h0aW1lOwogCXBnX2F0b21pY19mbGFnIHdpX2RvYmFsYW5jZTsKIAlib29sCQl3aV9z aGFyZWRyZWw7CisJaW50CQkJd2lfcGNsZWFudXA7CiB9IFdvcmtlckluZm9EYXRhOwogCiB0eXBl ZGVmIHN0cnVjdCBXb3JrZXJJbmZvRGF0YSAqV29ya2VySW5mbzsKIAorI2RlZmluZSBBbVBhcmFs bGVsSWR4QXV0b1ZhY1N1cHBvcnRpdmUoKSBcCisJKE15V29ya2VySW5mbyAhPSBOVUxMICYmIE15 V29ya2VySW5mby0+d2lfcGNsZWFudXAgPiAwKQorCisjZGVmaW5lIEFtUGFyYWxsZWxJZHhBdXRv VmFjTGVhZGVyKCkgXAorCShNeVdvcmtlckluZm8gIT0gTlVMTCAmJiBNeVdvcmtlckluZm8tPndp X3BjbGVhbnVwID09IDApCisKIC8qCiAgKiBQb3NzaWJsZSBzaWduYWxzIHJlY2VpdmVkIGJ5IHRo ZSBsYXVuY2hlciBmcm9tIHJlbW90ZSBwcm9jZXNzZXMuICBUaGVzZSBhcmUKICAqIHN0b3JlZCBh dG9taWNhbGx5IGluIHNoYXJlZCBtZW1vcnkgc28gdGhhdCBvdGhlciBwcm9jZXNzZXMgY2FuIHNl dCB0aGVtCkBAIC0yNTAsOSArMjcyLDExIEBAIHR5cGVkZWYgZW51bQogewogCUF1dG9WYWNGb3Jr RmFpbGVkLAkJCS8qIGZhaWxlZCB0cnlpbmcgdG8gc3RhcnQgYSB3b3JrZXIgKi8KIAlBdXRvVmFj UmViYWxhbmNlLAkJCS8qIHJlYmFsYW5jZSB0aGUgY29zdCBsaW1pdHMgKi8KKwlBdXRvVmFjUGFy YWxsZWxSZXEsCQkJLyogcmVxdWVzdCBmb3IgcGFyYWxsZWwgaW5kZXggdmFjdXVtICovCisJQXV0 b1ZhY051bVNpZ25hbHMsCQkJLyogbXVzdCBiZSBsYXN0ICovCiB9CQkJQXV0b1ZhY3V1bVNpZ25h bDsKIAotI2RlZmluZSBBdXRvVmFjTnVtU2lnbmFscyAoQXV0b1ZhY1JlYmFsYW5jZSArIDEpCisj ZGVmaW5lIEF1dG9WYWNOdW1TaWduYWxzIChBdXRvVmFjUGFyYWxsZWxSZXEgKyAxKQogCiAvKgog ICogQXV0b3ZhY3V1bSB3b3JraXRlbSBhcnJheSwgc3RvcmVkIGluIEF1dG9WYWN1dW1TaG1lbS0+ YXZfd29ya0l0ZW1zLiAgVGhpcwpAQCAtMjcyLDYgKzI5Niw0OSBAQCB0eXBlZGVmIHN0cnVjdCBB dXRvVmFjdXVtV29ya0l0ZW0KIAogI2RlZmluZSBOVU1fV09SS0lURU1TCTI1NgogCit0eXBlZGVm IGVudW0KK3sKKwlMQVVOQ0hFUiA9IDAsCS8qIGF1dG92YWN1dW0gbGF1bmNoZXIgbXVzdCB3YWtl IGV2ZXJ5b25lIHVwICovCisJTEVBREVSLAkJCS8qIGxlYWRlciBtdXN0IHdha2UgZXZlcnlvbmUg dXAgKi8KKwlMQVNUX1dPUktFUiwJLyogdGhlIGxhc3QgaW5pdGVkIHN1cHBvcnRpdmUgd29ya2Vy IG11c3Qgd2FrZSBldmVyeW9uZQorCQkJCQkgICB1cCAqLworfSBTeW5jVHlwZTsKKwordHlwZWRl ZiBlbnVtCit7CisJU1RBUlRVUCA9IDAsCQkJCS8qIGluaXRpYWwgdmFsdWUgLSBubyBzeW5jIHBv aW50cyB3ZXJlIHBhc3NlZCAqLworCVNUQVJUX1NZTkNfUE9JTlRfUEFTU0VELAkvKiBzdGFydF9z eW5jX3BvaW50IHdhcyBwYXNzZWQgKi8KKwlFTkRfU1lOQ19QT0lOVF9QQVNTRUQsCQkvKiBlbmRf c3luY19wb2ludCB3YXMgcGFzc2VkICovCisJU0hVVERPV04sCQkJCQkvKiBsZWFkZXIgd2FudHMg dG8gc2h1dCBkb3duIHBhcmFsbGVsIGluZGV4CisJCQkJCQkJCQl2YWN1dW0gZHVlIHRvIG9jY3Vy ZWQgZXJyb3IgKi8KK30gU3RhdHVzOworCisvKgorICogU3RydWN0dXJlLCBzdG9yZWQgaW4gQXV0 b1ZhY3V1bVNobWVtLT5wYXZfd29ya0l0ZW0uIFRoaXMgaXMgdXNlZCBmb3IgbWFuYWdpbmcKKyAq IHBhcmFsbGVsIGluZGV4IHByb2Nlc3NpbmcgKHdoaXRoaW4gc2luZ2xlIHRhYmxlKS4KKyAqLwor dHlwZWRlZiBzdHJ1Y3QgUGFyYWxsZWxBdXRvVmFjdXVtV29ya0l0ZW0KK3sKKwlPaWQJCQlhdndf ZGF0YWJhc2U7CisJT2lkCQkJYXZ3X3JlbGF0aW9uOworCWludAkJCW53b3JrZXJzX3BhcnRpY2lw YXRpbmc7CisJaW50CQkJbndvcmtlcnNfdG9fbGF1bmNoOworCWludCAJCW53b3JrZXJzX3NsZWVw aW5nOyAvKiBsZWFkZXIgZG9lc24ndCBjb3VudCAqLworCWludAkJCW5maW5pc2hlZDsgLyogIyBv ZiB3b3JrZXJzLCB0aGF0IGFscmVhZHkgZmluaXNoZWQgcGFyYWxsZWwKKwkJCQkJCQkgIGluZGV4 IHByb2Nlc3NpbmcgKGFuZCBwcm9iYWJseSBhbHJlYWR5IGRlYWQpICovCisKKwlkc21faGFuZGxl CWhhbmRsOworCVByb2NOdW1iZXIJbGVhZGVyX3Byb2NfbnVtOworCisJUEdQUk9DIAkJCQkqbGVh ZGVyX3Byb2M7CisJQ29uZGl0aW9uVmFyaWFibGUJY3Y7CisKKwlib29sCQlhY3RpdmU7CQkvKiBi ZWluZyBwcm9jZXNzZWQgKi8KKwlib29sCQlsZWFkZXJfc2xlZXBpbmc7CisJU3luY1R5cGUgCXN5 bmNfdHlwZTsKKwlTdGF0dXMJCXN0YXR1czsKK30JCVBhcmFsbGVsQXV0b1ZhY3V1bVdvcmtJdGVt OworCiAvKi0tLS0tLS0tLS0tLS0KICAqIFRoZSBtYWluIGF1dG92YWN1dW0gc2htZW0gc3RydWN0 LiAgT24gc2hhcmVkIG1lbW9yeSB3ZSBzdG9yZSB0aGlzIG1haW4KICAqIHN0cnVjdCBhbmQgdGhl IGFycmF5IG9mIFdvcmtlckluZm8gc3RydWN0cy4gIFRoaXMgc3RydWN0IGtlZXBzOgpAQCAtMjgz LDYgKzM1MCw4IEBAIHR5cGVkZWYgc3RydWN0IEF1dG9WYWN1dW1Xb3JrSXRlbQogICogYXZfc3Rh cnRpbmdXb3JrZXIgcG9pbnRlciB0byBXb3JrZXJJbmZvIGN1cnJlbnRseSBiZWluZyBzdGFydGVk IChjbGVhcmVkIGJ5CiAgKgkJCQkJdGhlIHdvcmtlciBpdHNlbGYgYXMgc29vbiBhcyBpdCdzIHVw IGFuZCBydW5uaW5nKQogICogYXZfd29ya0l0ZW1zCQl3b3JrIGl0ZW0gYXJyYXkKKyAqIHBhdl93 b3JrSXRlbQkJaW5mb3JtYXRpb24gbmVlZGVkIGZvciBwYXJhbGxlbCBpbmRleCBwcm9jZXNzaW5n IHdoaXRoaW5nCisgKiAJCQkJCXNpbmdsZSB0YWJsZQogICogYXZfbndvcmtlcnNGb3JCYWxhbmNl IHRoZSBudW1iZXIgb2YgYXV0b3ZhY3V1bSB3b3JrZXJzIHRvIHVzZSB3aGVuCiAgKiAJCQkJCWNh bGN1bGF0aW5nIHRoZSBwZXIgd29ya2VyIGNvc3QgbGltaXQKICAqCkBAIC0yOTgsNiArMzY3LDcg QEAgdHlwZWRlZiBzdHJ1Y3QKIAlkbGlzdF9oZWFkCWF2X3J1bm5pbmdXb3JrZXJzOwogCVdvcmtl ckluZm8JYXZfc3RhcnRpbmdXb3JrZXI7CiAJQXV0b1ZhY3V1bVdvcmtJdGVtIGF2X3dvcmtJdGVt c1tOVU1fV09SS0lURU1TXTsKKwlQYXJhbGxlbEF1dG9WYWN1dW1Xb3JrSXRlbSBwYXZfd29ya0l0 ZW07CiAJcGdfYXRvbWljX3VpbnQzMiBhdl9ud29ya2Vyc0ZvckJhbGFuY2U7CiB9IEF1dG9WYWN1 dW1TaG1lbVN0cnVjdDsKIApAQCAtMzIyLDExICszOTIsMTcgQEAgcGdfbm9yZXR1cm4gc3RhdGlj IHZvaWQgQXV0b1ZhY0xhdW5jaGVyU2h1dGRvd24odm9pZCk7CiBzdGF0aWMgdm9pZCBsYXVuY2hl cl9kZXRlcm1pbmVfc2xlZXAoYm9vbCBjYW5sYXVuY2gsIGJvb2wgcmVjdXJzaW5nLAogCQkJCQkJ CQkJIHN0cnVjdCB0aW1ldmFsICpuYXApOwogc3RhdGljIHZvaWQgbGF1bmNoX3dvcmtlcihUaW1l c3RhbXBUeiBub3cpOworc3RhdGljIHZvaWQgbGF1bmNoX3dvcmtlcl9mb3JfcGNsZWFudXAoVGlt ZXN0YW1wVHogbm93KTsKK3N0YXRpYyB2b2lkIGVsaW1pbmF0ZV9sb2NrX2NvbmZsaWN0cyhQYXJh bGxlbEF1dG9WYWN1dW1Xb3JrSXRlbSAqaXRlbSwKKwkJCQkJCQkJCSBib29sIGFsbF9sYXVuY2hl ZCk7CiBzdGF0aWMgTGlzdCAqZ2V0X2RhdGFiYXNlX2xpc3Qodm9pZCk7CiBzdGF0aWMgdm9pZCBy ZWJ1aWxkX2RhdGFiYXNlX2xpc3QoT2lkIG5ld2RiKTsKIHN0YXRpYyBpbnQJZGJfY29tcGFyYXRv cihjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKTsKIHN0YXRpYyB2b2lkIGF1dG92YWNfcmVj YWxjdWxhdGVfd29ya2Vyc19mb3JfYmFsYW5jZSh2b2lkKTsKIAorc3RhdGljIGludCBwYXJhbGxl bF9hdXRvdmFjdXVtX3N0YXJ0X3N5bmNfcG9pbnQoYm9vbCBrZWVwX2xvY2spOworc3RhdGljIHZv aWQgaGFuZGxlX3BhcmFsbGVsX2lkeF9hdXRvdmFjX2Vycm9ycyh2b2lkKTsKKwogc3RhdGljIHZv aWQgZG9fYXV0b3ZhY3V1bSh2b2lkKTsKIHN0YXRpYyB2b2lkIEZyZWVXb3JrZXJJbmZvKGludCBj b2RlLCBEYXR1bSBhcmcpOwogCkBAIC01ODMsNyArNjU5LDE0IEBAIEF1dG9WYWNMYXVuY2hlck1h aW4oY29uc3Qgdm9pZCAqc3RhcnR1cF9kYXRhLCBzaXplX3Qgc3RhcnR1cF9kYXRhX2xlbikKIAkJ ICogd2FrZW5pbmcgY29uZGl0aW9ucy4KIAkJICovCiAKLQkJbGF1bmNoZXJfZGV0ZXJtaW5lX3Ns ZWVwKGF2X3dvcmtlcl9hdmFpbGFibGUoKSwgZmFsc2UsICZuYXApOworCQlpZiAobndvcmtlcnNf bGF1bmNoZWQgPCBud29ya2Vyc19mb3JfaWR4X2F1dG92YWMpCisJCXsKKwkJCS8qIFRha2UgdGhl IHNtYWxsZXN0IHBvc3NpYmxlIHNsZWVwIGludGVydmFsLiAqLworCQkJbmFwLnR2X3NlYyA9IDA7 CisJCQluYXAudHZfdXNlYyA9IE1JTl9BVVRPVkFDX1NMRUVQVElNRSAqIDEwMDA7CisJCX0KKwkJ ZWxzZQorCQkJbGF1bmNoZXJfZGV0ZXJtaW5lX3NsZWVwKGF2X3dvcmtlcl9hdmFpbGFibGUoKSwg ZmFsc2UsICZuYXApOwogCiAJCS8qCiAJCSAqIFdhaXQgdW50aWwgbmFwdGltZSBleHBpcmVzIG9y IHdlIGdldCBzb21lIHR5cGUgb2Ygc2lnbmFsIChhbGwgdGhlCkBAIC02MTQsNiArNjk3LDE5IEBA IEF1dG9WYWNMYXVuY2hlck1haW4oY29uc3Qgdm9pZCAqc3RhcnR1cF9kYXRhLCBzaXplX3Qgc3Rh cnR1cF9kYXRhX2xlbikKIAkJCQlMV0xvY2tSZWxlYXNlKEF1dG92YWN1dW1Mb2NrKTsKIAkJCX0K IAorCQkJaWYgKEF1dG9WYWN1dW1TaG1lbS0+YXZfc2lnbmFsW0F1dG9WYWNQYXJhbGxlbFJlcV0p CisJCQl7CisJCQkJUGFyYWxsZWxBdXRvVmFjdXVtV29ya0l0ZW0gKml0ZW07CisKKwkJCQlMV0xv Y2tBY3F1aXJlKEF1dG92YWN1dW1Mb2NrLCBMV19FWENMVVNJVkUpOworCQkJCUF1dG9WYWN1dW1T aG1lbS0+YXZfc2lnbmFsW0F1dG9WYWNQYXJhbGxlbFJlcV0gPSBmYWxzZTsKKworCQkJCWl0ZW0g PSAmQXV0b1ZhY3V1bVNobWVtLT5wYXZfd29ya0l0ZW07CisJCQkJbndvcmtlcnNfZm9yX2lkeF9h dXRvdmFjID0gaXRlbS0+bndvcmtlcnNfdG9fbGF1bmNoOworCQkJCW53b3JrZXJzX2xhdW5jaGVk ID0gMDsKKwkJCQlMV0xvY2tSZWxlYXNlKEF1dG92YWN1dW1Mb2NrKTsKKwkJCX0KKwogCQkJaWYg KEF1dG9WYWN1dW1TaG1lbS0+YXZfc2lnbmFsW0F1dG9WYWNGb3JrRmFpbGVkXSkKIAkJCXsKIAkJ CQkvKgpAQCAtNjg2LDYgKzc4Miw3IEBAIEF1dG9WYWNMYXVuY2hlck1haW4oY29uc3Qgdm9pZCAq c3RhcnR1cF9kYXRhLCBzaXplX3Qgc3RhcnR1cF9kYXRhX2xlbikKIAkJCQkJd29ya2VyLT53aV9z aGFyZWRyZWwgPSBmYWxzZTsKIAkJCQkJd29ya2VyLT53aV9wcm9jID0gTlVMTDsKIAkJCQkJd29y a2VyLT53aV9sYXVuY2h0aW1lID0gMDsKKwkJCQkJd29ya2VyLT53aV9wY2xlYW51cCA9IC0xOwog CQkJCQlkY2xpc3RfcHVzaF9oZWFkKCZBdXRvVmFjdXVtU2htZW0tPmF2X2ZyZWVXb3JrZXJzLAog CQkJCQkJCQkJICZ3b3JrZXItPndpX2xpbmtzKTsKIAkJCQkJQXV0b1ZhY3V1bVNobWVtLT5hdl9z dGFydGluZ1dvcmtlciA9IE5VTEw7CkBAIC02OTgsOSArNzk1LDI5IEBAIEF1dG9WYWNMYXVuY2hl ck1haW4oY29uc3Qgdm9pZCAqc3RhcnR1cF9kYXRhLCBzaXplX3Qgc3RhcnR1cF9kYXRhX2xlbikK IAkJfQogCQlMV0xvY2tSZWxlYXNlKEF1dG92YWN1dW1Mb2NrKTsJLyogZWl0aGVyIHNoYXJlZCBv ciBleGNsdXNpdmUgKi8KIAotCQkvKiBpZiB3ZSBjYW4ndCBkbyBhbnl0aGluZywganVzdCBnbyBi YWNrIHRvIHNsZWVwICovCiAJCWlmICghY2FuX2xhdW5jaCkKKwkJeworCQkJLyoKKwkJCSAqIElm IGxhdW5jaGVyIGNhbm5vdCBsYXVuY2ggYWxsIHJlcXVlc3RlZCBmb3IgcGFyYWxsZWwgaW5kZXgK KwkJCSAqIHZhY3V1bSB3b3JrZXJzLCBpdCBtdXN0IGhhbmRsZSBhbGwgcG9zc2libGUgbG9jayBj b25mbGljdHMgYW5kCisJCQkgKiB0ZWxsIGV2ZXJ5b25lLCB0aGF0IHRoZXJlIHdpbGwgbm8gbmV3 IHN1cHBvcnRpdmUgd29ya2Vycy4KKwkJCSAqLworCQkJaWYgKG53b3JrZXJzX2xhdW5jaGVkIDwg bndvcmtlcnNfZm9yX2lkeF9hdXRvdmFjKQorCQkJeworCQkJCVBhcmFsbGVsQXV0b1ZhY3V1bVdv cmtJdGVtICppdGVtOworCisJCQkJTFdMb2NrQWNxdWlyZShBdXRvdmFjdXVtTG9jaywgTFdfRVhD TFVTSVZFKTsKKwkJCQlpdGVtID0gJkF1dG9WYWN1dW1TaG1lbS0+cGF2X3dvcmtJdGVtOworCQkJ CUFzc2VydChpdGVtLT5hY3RpdmUpOworCisJCQkJZWxpbWluYXRlX2xvY2tfY29uZmxpY3RzKGl0 ZW0sIGZhbHNlKTsKKwkJCQlud29ya2Vyc19sYXVuY2hlZCA9IG53b3JrZXJzX2Zvcl9pZHhfYXV0 b3ZhYyA9IDA7CisJCQkJTFdMb2NrUmVsZWFzZShBdXRvdmFjdXVtTG9jayk7CisJCQl9CisKKwkJ CS8qIGlmIHdlIGNhbid0IGRvIGFueXRoaW5nIGVsc2UsIGp1c3QgZ28gYmFjayB0byBzbGVlcCAq LwogCQkJY29udGludWU7CisJCX0KIAogCQkvKiBXZSdyZSBPSyB0byBzdGFydCBhIG5ldyB3b3Jr ZXIgKi8KIApAQCAtNzE2LDYgKzgzMywxNSBAQCBBdXRvVmFjTGF1bmNoZXJNYWluKGNvbnN0IHZv aWQgKnN0YXJ0dXBfZGF0YSwgc2l6ZV90IHN0YXJ0dXBfZGF0YV9sZW4pCiAJCQkgKi8KIAkJCWxh dW5jaF93b3JrZXIoY3VycmVudF90aW1lKTsKIAkJfQorCQllbHNlIGlmIChud29ya2Vyc19sYXVu Y2hlZCA8IG53b3JrZXJzX2Zvcl9pZHhfYXV0b3ZhYykKKwkJeworCQkJLyoKKwkJCSAqIE9uZSBv ZiBhY3RpdmUgYXV0b3ZhY3V1bSB3b3JrZXJzIHNlbnQgdXMgcmVxdWVzdCB0byBsYXVjaAorCQkJ ICogcGFydGljaXBhbnRzIGZvciBwYXJhbGxlbCBpbmRleCB2YWN1dW0uIFdlIGNoZWNrIHRoaXMg Y2FzZSBmaXJzdAorCQkJICogYmVjYXVzZSB3ZSBuZWVkIHRvIHN0YXJ0IHBhcnRpY2lwYW50cyBh cyBzb29uIGFzIHBvc3NpYmxlLgorCQkJICovCisJCQlsYXVuY2hfd29ya2VyX2Zvcl9wY2xlYW51 cChjdXJyZW50X3RpbWUpOworCQl9CiAJCWVsc2UKIAkJewogCQkJLyoKQEAgLTEyNjcsNiArMTM5 Myw3IEBAIGRvX3N0YXJ0X3dvcmtlcih2b2lkKQogCQl3b3JrZXItPndpX2Rib2lkID0gYXZkYi0+ YWR3X2RhdGlkOwogCQl3b3JrZXItPndpX3Byb2MgPSBOVUxMOwogCQl3b3JrZXItPndpX2xhdW5j aHRpbWUgPSBHZXRDdXJyZW50VGltZXN0YW1wKCk7CisJCXdvcmtlci0+d2lfcGNsZWFudXAgPSAt MTsKIAogCQlBdXRvVmFjdXVtU2htZW0tPmF2X3N0YXJ0aW5nV29ya2VyID0gd29ya2VyOwogCkBA IC0xMzQ5LDYgKzE0NzYsMTM0IEBAIGxhdW5jaF93b3JrZXIoVGltZXN0YW1wVHogbm93KQogCX0K IH0KIAorLyoKKyAqIGxhdW5jaF93b3JrZXJfZm9yX3BjbGVhbnVwCisgKgorICogV3JhcHBlciBm b3Igc3RhcnRpbmcgYSB3b3JrZXIgKHJlcXVlc3RlZCBieSBsZWFkZXIgb2YgcGFyYWxsZWwgaW5k ZXgKKyAqIHZhY3V1bWluZykgZnJvbSB0aGUgbGF1bmNoZXIuCisgKi8KK3N0YXRpYyB2b2lkCits YXVuY2hfd29ya2VyX2Zvcl9wY2xlYW51cChUaW1lc3RhbXBUeiBub3cpCit7CisJUGFyYWxsZWxB dXRvVmFjdXVtV29ya0l0ZW0gKml0ZW07CisJV29ya2VySW5mbwkJCQkJd29ya2VyOworCWRsaXN0 X25vZGUJCQkJICAgKndwdHI7CisKKwlBc3NlcnQobndvcmtlcnNfbGF1bmNoZWQgPCBud29ya2Vy c19mb3JfaWR4X2F1dG92YWMpOworCisJTFdMb2NrQWNxdWlyZShBdXRvdmFjdXVtTG9jaywgTFdf RVhDTFVTSVZFKTsKKworCS8qCisJICogR2V0IGEgd29ya2VyIGVudHJ5IGZyb20gdGhlIGZyZWVs aXN0LiAgV2UgY2hlY2tlZCBhYm92ZSwgc28gdGhlcmUKKwkgKiByZWFsbHkgc2hvdWxkIGJlIGEg ZnJlZSBzbG90LgorCSAqLworCXdwdHIgPSBkY2xpc3RfcG9wX2hlYWRfbm9kZSgmQXV0b1ZhY3V1 bVNobWVtLT5hdl9mcmVlV29ya2Vycyk7CisKKwl3b3JrZXIgPSBkbGlzdF9jb250YWluZXIoV29y a2VySW5mb0RhdGEsIHdpX2xpbmtzLCB3cHRyKTsKKwl3b3JrZXItPndpX2Rib2lkID0gSW52YWxp ZE9pZDsKKwl3b3JrZXItPndpX3Byb2MgPSBOVUxMOworCXdvcmtlci0+d2lfbGF1bmNodGltZSA9 IEdldEN1cnJlbnRUaW1lc3RhbXAoKTsKKworCS8qCisJICogU2V0IGluZGljYXRvciwgdGhhdCB0 aGlzIHdvcmtlcnMgbXVzdCBqb2luIHRvIHBhcmFsbGVsIGluZGV4IHZhY3V1bS4KKwkgKiBUaGlz IHZhcmlhYmxlIGFsc28gcGxheXMgdGhlIHJvbGUgb2YgYW4gdW5pcXVlIGlkIGFtb25nIHBhcmFs bGVsIGluZGV4CisJICogdmFjdXVtIHdvcmtlcnMuIEZpcnN0IGlkIGlzICcxJywgYmVjYXVzZSAn MCcgaXMgcmVzZXJ2ZWQgZm9yIGxlYWRlci4KKwkgKi8KKwl3b3JrZXItPndpX3BjbGVhbnVwID0g KG53b3JrZXJzX2xhdW5jaGVkICsgMSk7CisKKwlBdXRvVmFjdXVtU2htZW0tPmF2X3N0YXJ0aW5n V29ya2VyID0gd29ya2VyOworCisJU2VuZFBvc3RtYXN0ZXJTaWduYWwoUE1TSUdOQUxfU1RBUlRf QVVUT1ZBQ19XT1JLRVIpOworCisJaXRlbSA9ICZBdXRvVmFjdXVtU2htZW0tPnBhdl93b3JrSXRl bTsKKwlBc3NlcnQoaXRlbS0+YWN0aXZlKTsKKworCW53b3JrZXJzX2xhdW5jaGVkICs9IDE7CisK KwlpZiAobndvcmtlcnNfbGF1bmNoZWQgPCBud29ya2Vyc19mb3JfaWR4X2F1dG92YWMpCisJewor CQlMV0xvY2tSZWxlYXNlKEF1dG92YWN1dW1Mb2NrKTsKKwkJcmV0dXJuOworCX0KKworCUFzc2Vy dChpdGVtLT5zeW5jX3R5cGUgPT0gTEFVTkNIRVIgJiYKKwkJICAgbndvcmtlcnNfbGF1bmNoZWQg PT0gbndvcmtlcnNfZm9yX2lkeF9hdXRvdmFjKTsKKworCS8qCisJICogSWYgbGF1bmNoZXIgbWFu YWdlZCB0byBsYXVuY2ggYWxsIHJlcXVlc3RlZCBmb3IgcGFyYWxsZWwgaW5kZXgKKwkgKiB2YWN1 dW0gd29ya2VycywgaXQgbXVzdCBoYW5kbGUgYWxsIHBvc3NpYmxlIGxvY2sgY29uZmxpY3RzLgor CSAqLworCWVsaW1pbmF0ZV9sb2NrX2NvbmZsaWN0cyhpdGVtLCB0cnVlKTsKKwlMV0xvY2tSZWxl YXNlKEF1dG92YWN1dW1Mb2NrKTsKK30KKworLyoKKyAqIE11c3QgYmUgY2FsbGVkIGZyb20gYXV0 b3ZhY3V1bSBsYXVuY2hlciB3aGVuIGl0IGxhdW5jaGVkIGFsbCByZXF1ZXN0ZWQKKyAqIHdvcmtl cnMgZm9yIHBhcmFsbGVsIGluZGV4IHZhY3V1bSwgb3Igd2hlbiBpdCByZWFsaXplZCwgdGhhdCBu byBtb3JlCisgKiBwcm9jZXNzZXMgY2FuIGJlIGxhdW5jaGVkLgorICoKKyAqIEluIHRoaXMgZnVu Y3Rpb24gbGF1bmNoZXIgd2lsbCBhc3NpZ24gcm9sZXMgaW4gc3VjaCBhIHdheSBhcyB0byBhdm9p ZCBsb2NrCisgKiBjb25mbGljdHMgYmV0d2VlbiBsZWFkZXIgYW5kIHN1cHBvcnRpdmUgd29ya2Vy cy4KKyAqCisgKiBBdXRvdmFjdXVtTG9jayBtdXN0IGJlIGhlbGQgaW4gZXhjbHVzaXZlIG1vZGUg YmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiEKKyAqLworc3RhdGljIHZvaWQKK2VsaW1pbmF0 ZV9sb2NrX2NvbmZsaWN0cyhQYXJhbGxlbEF1dG9WYWN1dW1Xb3JrSXRlbSAqaXRlbSwgYm9vbCBh bGxfbGF1bmNoZWQpCit7CisJQXNzZXJ0KEFtQXV0b1ZhY3V1bUxhdW5jaGVyUHJvY2VzcygpKTsK KwlBc3NlcnQoTFdMb2NrSGVsZEJ5TWUoQXV0b3ZhY3V1bUxvY2spKTsKKworCS8qIFNvLCBsZXQn cyBzdGFydC4uLiAqLworCisJaWYgKGl0ZW0tPmxlYWRlcl9zbGVlcGluZyAmJiBpdGVtLT5ud29y a2Vyc19zbGVlcGluZyA9PSBud29ya2Vyc19sYXVuY2hlZCkKKwl7CisJCS8qCisJCSAqIElmIGJv dGggbGVhZGVyIGFuZCBhbGwgbGF1bmNoZWQgc3VwcG9ydGl2ZSB3b3JrZXJzIGFyZSBzbGVlcGlu ZywgdGhlbgorCQkgKiBvbmx5IHdlIGNhbiB3YWtlIGV2ZXJ5b25lIHVwLgorCQkgKi8KKwkJTFdM b2NrUmVsZWFzZShBdXRvdmFjdXVtTG9jayk7CisJCUNvbmRpdGlvblZhcmlhYmxlQnJvYWRjYXN0 KCZpdGVtLT5jdik7CisJCUxXTG9ja0FjcXVpcmUoQXV0b3ZhY3V1bUxvY2ssIExXX0VYQ0xVU0lW RSk7CisJfQorCWVsc2UgaWYgKGl0ZW0tPmxlYWRlcl9zbGVlcGluZyAmJgorCQkJIGl0ZW0tPm53 b3JrZXJzX3NsZWVwaW5nIDwgbndvcmtlcnNfbGF1bmNoZWQpCisJeworCQkvKgorCQkgKiBJZiBs ZWFkZXIgYWxyZWFkeSBzbGVlcGluZywgYnV0IHNldmVyYWwgc3VwcG9ydGl2ZSB3b3JrZXJzIGFy ZQorCQkgKiBpbml0aW5nLCB3ZSBzaGlmdCB0aGUgcmVzcG9uc2liaWxpdHkgZm9yIGF3YWtlbmlu ZyBldmVyeW9uZSBpbnRvIHRoZQorCQkgKiB3b3JrZXIgd2hvIGNvbXBsZXRlcyBpbml0aWFsaXph dGlvbiBsYXN0CisJCSAqLworCQlpdGVtLT5zeW5jX3R5cGUgPSBMQVNUX1dPUktFUjsKKwl9CisJ ZWxzZSBpZiAoIWl0ZW0tPmxlYWRlcl9zbGVlcGluZyAmJgorCQkJIGl0ZW0tPm53b3JrZXJzX3Ns ZWVwaW5nID09IG53b3JrZXJzX2xhdW5jaGVkKQorCXsKKwkJLyoKKwkJICogSWYgb25seSBsZWFk ZXIgaXMgbm90IHNsZWVwaW5nIC0gaXQgbXVzdCB3YWtlIHVwIGFsbCB3b3JrZXJzIHdoZW4gaXQK KwkJICogZmluaXNoZXMgYWxsIHByZXBhcmF0aW9ucy4KKwkJICovCisJCWl0ZW0tPnN5bmNfdHlw ZSA9IExFQURFUjsKKwl9CisJZWxzZQorCXsKKwkJLyoKKwkJICogSWYgbm9ib2R5IGlzIHNsZWVw aW5nLCB3ZSBhc3N1bWUgdGhhdCBsZWFkZXIgaGFzIGhpZ2hlciBjaGFuc2VzIHRvCisJCSAqIGFz bGVlcCBmaXJzdCwgc28gc2V0IHN5bmMgdHlwZSB0byBMQVNUX1dPUktFUiwgYnV0IGlmIHRoZSBs YXN0IHdvcmtlcgorCQkgKiB3aWxsIHNlZSB0aGF0IGxlYWRlciBzdGlsbCBub3Qgc2xlZXBpbmcs IGl0IHdpbGwgY2hhbmdlIHN5bmMgdHlwZSB0bworCQkgKiBMRUFERVIgYW5kIGFzbGVlcC4KKwkJ ICovCisJCWl0ZW0tPnN5bmNfdHlwZSA9IExBU1RfV09SS0VSOworCX0KKworCS8qCisJICogSWYg d2UgY2Fubm90IGxhdW5jaCBhbGwgcmVxdWVzdGVkIHdvcmtlcnMsIHJlZnJlc2gKKwkgKiBud29y a2Vyc190b19sYXVuY2ggdmFsdWUsIHNvIHRoYXQgdGhlIGxhc3Qgd29ya2VyIGNhbiBmaW5kIG91 dAorCSAqIHRoYXQgaGUgaXMgcmVhbGx5IHRoZSBsYXN0LgorCSAqLworCWlmICghYWxsX2xhdW5j aGVkICYmIGl0ZW0tPnN5bmNfdHlwZSA9PSBMQVNUX1dPUktFUikKKwkJaXRlbS0+bndvcmtlcnNf dG9fbGF1bmNoID0gbndvcmtlcnNfbGF1bmNoZWQ7Cit9CisKIC8qCiAgKiBDYWxsZWQgZnJvbSBw b3N0bWFzdGVyIHRvIHNpZ25hbCBhIGZhaWx1cmUgdG8gZm9yayBhIHByb2Nlc3MgdG8gYmVjb21l CiAgKiB3b3JrZXIuICBUaGUgcG9zdG1hc3RlciBzaG91bGQga2lsbChTSUdVU1IyKSB0aGUgbGF1 bmNoZXIgc2hvcnRseQpAQCAtMTM2MCw2ICsxNjE1LDM4IEBAIEF1dG9WYWNXb3JrZXJGYWlsZWQo dm9pZCkKIAlBdXRvVmFjdXVtU2htZW0tPmF2X3NpZ25hbFtBdXRvVmFjRm9ya0ZhaWxlZF0gPSB0 cnVlOwogfQogCisvKgorICogQ2FsbGVkIGZyb20gYXV0b3ZhY3V1bSB3b3JrZXIgdG8gc2lnbmFs IHRoYXQgaGUgbmVlZHMgcGFydGljaXBhbnRzIGluCisgKiBwYXJhbGxlbCBpbmRleCB2YWN1dW0u IEZ1bmN0aW9uIHNlbmRzIFNJR1VTUjIgdG8gdGhlIGxhdW5jaGVyIGFuZCByZXR1cm5zCisgKiAn dHJ1ZScgaWZmIHNpZ25hbCB3YXMgc2VudCBzdWNjZXNzZnVsbHkuCisgKi8KK2Jvb2wKK0F1dG9W YWNQYXJhbGxlbFdvcmtSZXF1ZXN0KHZvaWQpCit7CisJaWYgKEF1dG9WYWN1dW1TaG1lbS0+YXZf bGF1bmNoZXJwaWQgPT0gMCkKKwl7CisJCWVyZXBvcnQoV0FSTklORywKKwkJCQkoZXJyY29kZShF UlJDT0RFX0lOVEVSTkFMX0VSUk9SKSwKKwkJCQkgZXJybXNnKCJhdXRvdmFjdXVtIGxhdW5jaGVy IGlzIGRlYWQiKSkpOworCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlBdXRvVmFjdXVtU2htZW0t PmF2X3NpZ25hbFtBdXRvVmFjUGFyYWxsZWxSZXFdID0gdHJ1ZTsKKworCWlmIChraWxsKEF1dG9W YWN1dW1TaG1lbS0+YXZfbGF1bmNoZXJwaWQsIFNJR1VTUjIpIDwgMCkKKwl7CisJCWVyZXBvcnQo V0FSTklORywKKwkJCQkoZXJyY29kZShFUlJDT0RFX1NZU1RFTV9FUlJPUiksCisJCQkJIGVycm1z ZygiZmFpbGVkIHRvIHNlbmQgc2lnbmFsIHRvIGF1dG92YWMgbGF1bmNoZXIgKHBpZCAlZCk6ICVt IiwKKwkJCQkJCUF1dG9WYWN1dW1TaG1lbS0+YXZfbGF1bmNoZXJwaWQpKSk7CisKKwkJcmV0dXJu IGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCiAvKiBTSUdVU1IyOiBhIHdvcmtlciBp cyB1cCBhbmQgcnVubmluZywgb3IganVzdCBmaW5pc2hlZCwgb3IgZmFpbGVkIHRvIGZvcmsgKi8K IHN0YXRpYyB2b2lkCiBhdmxfc2lndXNyMl9oYW5kbGVyKFNJR05BTF9BUkdTKQpAQCAtMTU1OSw2 ICsxODQ2LDggQEAgQXV0b1ZhY1dvcmtlck1haW4oY29uc3Qgdm9pZCAqc3RhcnR1cF9kYXRhLCBz aXplX3Qgc3RhcnR1cF9kYXRhX2xlbikKIAl7CiAJCWNoYXIJCWRibmFtZVtOQU1FREFUQUxFTl07 CiAKKwkJQXNzZXJ0KE15V29ya2VySW5mby0+d2lfcGNsZWFudXAgPCAwKTsKKwogCQkvKgogCQkg KiBSZXBvcnQgYXV0b3ZhYyBzdGFydHVwIHRvIHRoZSBjdW11bGF0aXZlIHN0YXRzIHN5c3RlbS4g IFdlCiAJCSAqIGRlbGliZXJhdGVseSBkbyB0aGlzIGJlZm9yZSBJbml0UG9zdGdyZXMsIHNvIHRo YXQgdGhlCkBAIC0xNTkzLDEyICsxODgyLDExMiBAQCBBdXRvVmFjV29ya2VyTWFpbihjb25zdCB2 b2lkICpzdGFydHVwX2RhdGEsIHNpemVfdCBzdGFydHVwX2RhdGFfbGVuKQogCQlyZWNlbnRNdWx0 aSA9IFJlYWROZXh0TXVsdGlYYWN0SWQoKTsKIAkJZG9fYXV0b3ZhY3V1bSgpOwogCX0KKwllbHNl IGlmIChBbVBhcmFsbGVsSWR4QXV0b1ZhY1N1cHBvcnRpdmUoKSkKKwl7CisJCVBhcmFsbGVsQXV0 b1ZhY3V1bVdvcmtJdGVtICppdGVtOworCQlkc21faGFuZGxlCQloYW5kbGU7CisJCVBHUFJPQwkJ ICAgKmxlYWRlcl9wcm9jOworCQlQcm9jTnVtYmVyCQlsZWFkZXJfcHJvY19udW1iZXI7CisJCWRz bV9zZWdtZW50CSAgICpzZWc7CisJCXNobV90b2MJCSAgICp0b2M7CisJCWNoYXIJCSAgICphc25h cHNwYWNlOworCQljaGFyCQkgICAqdHNuYXBzcGFjZTsKKwkJY2hhcgkJCWRibmFtZVtOQU1FREFU QUxFTl07CisJCVNuYXBzaG90CQl0c25hcHNob3Q7CisJCVNuYXBzaG90CQlhc25hcHNob3Q7CisK KwkJLyoKKwkJICogV2Ugd2lsbCBhYm9ydCBwYXJhbGxlbCBpbmRleCB2YWN1dW1pbmcgd2hpdGhp biBjdXJyZW50IHByb2Nlc3MgaWYKKwkJICogc29tZXRoaW5nIGVycm9ycyBvdXQKKwkJICovCisJ CVBHX1RSWSgpOworCQl7CisJCQlMV0xvY2tBY3F1aXJlKEF1dG92YWN1dW1Mb2NrLCBMV19FWENM VVNJVkUpOworCQkJaXRlbSA9ICZBdXRvVmFjdXVtU2htZW0tPnBhdl93b3JrSXRlbTsKKwkJCWRi aWQgPSBpdGVtLT5hdndfZGF0YWJhc2U7CisJCQloYW5kbGUgPSBpdGVtLT5oYW5kbDsKKwkJCWxl YWRlcl9wcm9jID0gaXRlbS0+bGVhZGVyX3Byb2M7CisJCQlsZWFkZXJfcHJvY19udW1iZXIgPSBp dGVtLT5sZWFkZXJfcHJvY19udW07CisJCQlMV0xvY2tSZWxlYXNlKEF1dG92YWN1dW1Mb2NrKTsK KworCQkJSW5pdFBvc3RncmVzKE5VTEwsIGRiaWQsIE5VTEwsIEludmFsaWRPaWQsCisJCQkJCQkg SU5JVF9QR19PVkVSUklERV9BTExPV19DT05OUywKKwkJCQkJCSBkYm5hbWUpOworCisJCQlzZXRf cHNfZGlzcGxheShkYm5hbWUpOworCQkJaWYgKFBvc3RBdXRoRGVsYXkpCisJCQkJcGdfdXNsZWVw KFBvc3RBdXRoRGVsYXkgKiAxMDAwMDAwTCk7CisKKwkJCS8qIEFuZCBkbyBhbiBhcHByb3ByaWF0 ZSBhbW91bnQgb2Ygd29yayAqLworCQkJcmVjZW50WGlkID0gUmVhZE5leHRUcmFuc2FjdGlvbklk KCk7CisJCQlyZWNlbnRNdWx0aSA9IFJlYWROZXh0TXVsdGlYYWN0SWQoKTsKKworCQkJaWYgKHBh cmFsbGVsX2F1dG92YWN1dW1fc3RhcnRfc3luY19wb2ludChmYWxzZSkgPT0gLTEpCisJCQl7CisJ CQkJLyogV2UgYXJlIG5vdCBwYXJ0aWNpcGF0aW5nIGFueW1vcmUgKi8KKwkJCQlNeVdvcmtlcklu Zm8tPndpX3BjbGVhbnVwID0gLTE7CisJCQkJZ290byBleGl0OworCQkJfQorCisJCQlzZWcgPSBk c21fYXR0YWNoKGhhbmRsZSk7CisJCQlpZiAoc2VnID09IE5VTEwpCisJCQkJZXJlcG9ydChFUlJP UiwKKwkJCQkJCShlcnJjb2RlKEVSUkNPREVfT0JKRUNUX05PVF9JTl9QUkVSRVFVSVNJVEVfU1RB VEUpLAorCQkJCQkJIGVycm1zZygiY291bGQgbm90IG1hcCBkeW5hbWljIHNoYXJlZCBtZW1vcnkg c2VnbWVudCIpKSk7CisKKwkJCXRvYyA9IHNobV90b2NfYXR0YWNoKEFWX1BBUkFMTEVMX01BR0lD LCBkc21fc2VnbWVudF9hZGRyZXNzKHNlZykpOworCQkJaWYgKHRvYyA9PSBOVUxMKQorCQkJCWVy ZXBvcnQoRVJST1IsCisJCQkJCQkoZXJyY29kZShFUlJDT0RFX09CSkVDVF9OT1RfSU5fUFJFUkVR VUlTSVRFX1NUQVRFKSwKKwkJCQkJCSBlcnJtc2coImludmFsaWQgbWFnaWMgbnVtYmVyIGluIGR5 bmFtaWMgc2hhcmVkIG1lbW9yeSBzZWdtZW50IikpKTsKKworCQkJaWYgKCFCZWNvbWVMb2NrR3Jv dXBNZW1iZXIobGVhZGVyX3Byb2MsIGxlYWRlcl9wcm9jX251bWJlcikpCisJCQl7CisJCQkJZXJl cG9ydChFUlJPUiwKKwkJCQkJCShlcnJjb2RlKEVSUkNPREVfT0JKRUNUX05PVF9JTl9QUkVSRVFV SVNJVEVfU1RBVEUpLAorCQkJCQkJIGVycm1zZygiY291bGQgbm90IGJlY29tZSBsb2NrIGdyb3Vw IG1lbWJlciIpKSk7CisJCQl9CisKKwkJCVN0YXJ0VHJhbnNhY3Rpb25Db21tYW5kKCk7CisKKwkJ CWFzbmFwc3BhY2UgPQorCQkJCXNobV90b2NfbG9va3VwKHRvYywgQVZfUEFSQUxMRUxfS0VZX0FD VElWRV9TTkFQU0hPVCwgZmFsc2UpOworCQkJdHNuYXBzcGFjZSA9CisJCQkJc2htX3RvY19sb29r dXAodG9jLCBBVl9QQVJBTExFTF9LRVlfVFJBTlNBQ1RJT05fU05BUFNIT1QsIHRydWUpOworCQkJ YXNuYXBzaG90ID0gUmVzdG9yZVNuYXBzaG90KGFzbmFwc3BhY2UpOworCQkJdHNuYXBzaG90ID0g dHNuYXBzcGFjZSA/IFJlc3RvcmVTbmFwc2hvdCh0c25hcHNwYWNlKSA6IGFzbmFwc2hvdDsKKwkJ CVJlc3RvcmVUcmFuc2FjdGlvblNuYXBzaG90KHRzbmFwc2hvdCwgbGVhZGVyX3Byb2MpOworCQkJ UHVzaEFjdGl2ZVNuYXBzaG90KGFzbmFwc2hvdCk7CisKKwkJCS8qCisJCQkgKiBXZSd2ZSBjaGFu Z2VkIHdoaWNoIHR1cGxlcyB3ZSBjYW4gc2VlLCBhbmQgbXVzdCB0aGVyZWZvcmUKKwkJCSAqIGlu dmFsaWRhdGUgc3lzdGVtIGNhY2hlcy4KKwkJCSAqLworCQkJSW52YWxpZGF0ZVN5c3RlbUNhY2hl cygpOworCisJCQlwYXJhbGxlbF92YWN1dW1fbWFpbihzZWcsIHRvYyk7CisKKwkJCS8qIE11c3Qg cG9wIGFjdGl2ZSBzbmFwc2hvdCBzbyBzbmFwbWdyLmMgZG9lc24ndCBjb21wbGFpbi4gKi8KKwkJ CVBvcEFjdGl2ZVNuYXBzaG90KCk7CisKKwkJCWRzbV9kZXRhY2goc2VnKTsKKwkJCUNvbW1pdFRy YW5zYWN0aW9uQ29tbWFuZCgpOworCQkJUGFyYWxsZWxBdXRvdmFjdXVtRW5kU3luY1BvaW50KGZh bHNlKTsKKwkJfQorCQlQR19DQVRDSCgpOworCQl7CisJCQlFbWl0RXJyb3JSZXBvcnQoKTsKKwkJ CWhhbmRsZV9wYXJhbGxlbF9pZHhfYXV0b3ZhY19lcnJvcnMoKTsKKwkJfQorCQlQR19FTkRfVFJZ KCk7CisJfQogCiAJLyoKIAkgKiBUaGUgbGF1bmNoZXIgd2lsbCBiZSBub3RpZmllZCBvZiBteSBk ZWF0aCBpbiBQcm9jS2lsbCwgKmlmKiB3ZSBtYW5hZ2VkCiAJICogdG8gZ2V0IGEgd29ya2VyIHNs b3QgYXQgYWxsCiAJICovCiAKK2V4aXQ6CiAJLyogQWxsIGRvbmUsIGdvIGF3YXkgKi8KIAlwcm9j X2V4aXQoMCk7CiB9CkBAIC0yNDYxLDYgKzI4NTAsMTAgQEAgZG9fYXV0b3ZhY3V1bSh2b2lkKQog CQkJCQkJICAgdGFiLT5hdF9kYXRuYW1lLCB0YWItPmF0X25zcG5hbWUsIHRhYi0+YXRfcmVsbmFt ZSk7CiAJCQlFbWl0RXJyb3JSZXBvcnQoKTsKIAorCQkJLyogaWYgd2UgYXJlIHBhcmFsbGVsIGlu ZGV4IHZhY3V1bWluZyBsZWFkZXIsIHdlIG11c3Qgc2h1dCBpdCBkb3duICovCisJCQlpZiAoQW1Q YXJhbGxlbElkeEF1dG9WYWNMZWFkZXIoKSkKKwkJCQloYW5kbGVfcGFyYWxsZWxfaWR4X2F1dG92 YWNfZXJyb3JzKCk7CisKIAkJCS8qIHRoaXMgcmVzZXRzIFByb2NHbG9iYWwtPnN0YXR1c0ZsYWdz W2ldIHRvbyAqLwogCQkJQWJvcnRPdXRPZkFueVRyYW5zYWN0aW9uKCk7CiAJCQlGbHVzaEVycm9y U3RhdGUoKTsKQEAgLTMyOTYsNiArMzY4OSw0MDUgQEAgQXV0b1ZhY3V1bVJlcXVlc3RXb3JrKEF1 dG9WYWN1dW1Xb3JrSXRlbVR5cGUgdHlwZSwgT2lkIHJlbGF0aW9uSWQsCiAJcmV0dXJuIHJlc3Vs dDsKIH0KIAorLyoKKyAqIFJlbGVhc2Ugd29yayBpdGVtLCB1c2VkIGZvciBtYW5hZ2luZyBwYXJh bGxlbCBpbmRleCB2YWN1dW0uIE11c3QgYmUgY2FsbGVkCisgKiBvbmNlIGFuZCBvbmx5IGZyb20g bGVhZGVyIHdvcmtlci4KKyAqCisgKiBJZiAna2VlcF9sb2NrJyBpcyB0cnVlLCB0aGVuIEF1dG92 YWN1dW1Mb2NrIHdpbGwgbm90IGJlIHJlbGVhc2VkIGluIHRoZSBlbmQKKyAqIG9mIGZ1bmN0aW9u IGV4ZWN1dGlvbi4KKyAqLwordm9pZAorQXV0b1ZhY3V1bVJlbGVhc2VQYXJhbGxlbFdvcmsoYm9v bCBrZWVwX2xvY2spCit7CisJUGFyYWxsZWxBdXRvVmFjdXVtV29ya0l0ZW0gKndvcmtpdGVtOwor CisJaWYgKCFMV0xvY2tIZWxkQnlNZShBdXRvdmFjdXVtTG9jaykpCisJCUxXTG9ja0FjcXVpcmUo QXV0b3ZhY3V1bUxvY2ssIExXX0VYQ0xVU0lWRSk7CisKKwl3b3JraXRlbSA9ICZBdXRvVmFjdXVt U2htZW0tPnBhdl93b3JrSXRlbTsKKworCUFzc2VydCh3b3JraXRlbS0+bGVhZGVyX3Byb2NfbnVt ID09IE15UHJvY1BpZCk7CisKKwl3b3JraXRlbS0+YWN0aXZlID0gZmFsc2U7CisKKwlpZiAoIWtl ZXBfbG9jaykKKwkJTFdMb2NrUmVsZWFzZShBdXRvdmFjdXVtTG9jayk7Cit9CisKKy8qCisgKiBX YWl0aW5nIG9uIGNvbmRpdGlvbiB2YXJpYWJsZSBpcyBmcmVxdWVudCBvcGVyYXRpb24sIHNvIGl0 IGhhcyBiZWVkIHRha2VuCisgKiBvdXQgd2l0aCBhIHNlcGFyYXRlIGZ1bmN0aW9uLiBDYWxsZXIg bXVzdCBhY3F1aXJlIGhvbGQgQXV0b3ZhY3V1bUxvY2sgYmVmb3JlCisgKiBjYWxsaW5nIGl0Lgor ICovCitzdGF0aWMgaW5saW5lIHZvaWQKK0NWU2xlZXAoQ29uZGl0aW9uVmFyaWFibGUgKmN2KQor eworCUNvbmRpdGlvblZhcmlhYmxlUHJlcGFyZVRvU2xlZXAoY3YpOworCisJTFdMb2NrUmVsZWFz ZShBdXRvdmFjdXVtTG9jayk7CisJQ29uZGl0aW9uVmFyaWFibGVTbGVlcChjdiwgUEdfV0FJVF9J UEMpOworCUxXTG9ja0FjcXVpcmUoQXV0b3ZhY3V1bUxvY2ssIExXX0VYQ0xVU0lWRSk7CisKKwlD b25kaXRpb25WYXJpYWJsZUNhbmNlbFNsZWVwKCk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9u IHVzZWQgdG8gc3luY2hyb25pemUgbGVhZGVyIHdpdGggc3VwcG9ydGl2ZSB3b3JrZXJzIGR1cmlu ZworICogcGFyYWxsZWwgaW5kZXggdmFjdXVtaW5nLiBFYWNoIHByb2Nlc3Mgd2lsbCBleGl0IGlm ZjoKKyAqCQlMZWFkZXIgd29ya2VyIGlzIHJlYWR5IHRvIHBlcmZvcm0gcGFyYWxsZWwgdmFjdXVt ICYmCisgKiAJCUFsbCBsYXVuY2hlZCBzdXBwb3J0aXZlIHdvcmtlcnMgYXJlIHJlYWR5IHRvIHBl cmZvcm0gcGFyYWxsZWwgdmFjdXVtICYmCisgKiAJCShBdXRvdmFjdXVtIGxhdW5jaGVyIGFscmVh ZHkgbGF1bmNoZWQgYWxsIHJlcXVlc3RlZCB3b3JrZXJzIHx8CisgKiAJCSBBdXRvdmFjdXVtIGxh dW5jaGVyIGNhbm5vdCBsYXVuY2ggbW9yZSB3b3JrZXJzKQorICoKKyAqIElmICdrZWVwX2xvY2sn IGlzIHRydWUsIHRoZW4gQXV0b3ZhY3V1bUxvY2sgd2lsbCBub3QgYmUgcmVsZWFzZWQgaW4gdGhl IGVuZAorICogb2YgZnVuY3Rpb24gZXhlY3V0aW9uLgorICoKKyAqIE5PVEU6IFNvbWUgd29ya2Vy cyBtYXkgY2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gbGVhZGVyIHdvcmtlciBkZWNpZGVkIHRvIHNo dXQKKyAqIAkJIGRvd24gcGFyYWxsZWwgdmFjdXVtaW5nLiBJbiB0aGlzIGNhc2UgJy0xJyB2YWx1 ZSB3aWxsIGJlIHJldHVybmVkLgorICovCitzdGF0aWMgaW50CitwYXJhbGxlbF9hdXRvdmFjdXVt X3N0YXJ0X3N5bmNfcG9pbnQoYm9vbCBrZWVwX2xvY2spCit7CisJUGFyYWxsZWxBdXRvVmFjdXVt V29ya0l0ZW0gKndvcmtpdGVtOworCVN5bmNUeXBlIHN5bmNfdHlwZTsKKwlpbnQgbnVtX3BhcnRp Y2lwYW50czsKKworCWlmICghTFdMb2NrSGVsZEJ5TWUoQXV0b3ZhY3V1bUxvY2spKQorCQlMV0xv Y2tBY3F1aXJlKEF1dG92YWN1dW1Mb2NrLCBMV19FWENMVVNJVkUpOworCisJd29ya2l0ZW0gPSAm QXV0b1ZhY3V1bVNobWVtLT5wYXZfd29ya0l0ZW07CisJQXNzZXJ0KHdvcmtpdGVtLT5hY3RpdmUp OworCXN5bmNfdHlwZSA9IHdvcmtpdGVtLT5zeW5jX3R5cGU7CisKKwlpZiAoQW1QYXJhbGxlbElk eEF1dG9WYWNMZWFkZXIoKSkKKwl7CisJCUFzc2VydCh3b3JraXRlbS0+bGVhZGVyX3Byb2NfbnVt ID09IE15UHJvY1BpZCk7CisKKwkJLyogV2FrZSB1cCBhbGwgc2xlZXBpbmcgc3VwcG9ydGl2ZSB3 b3JrZXJzLCBpZiByZXF1aXJlZCAuLi4gKi8KKwkJaWYgKHN5bmNfdHlwZSA9PSBMRUFERVIpCisJ CXsKKwkJCUNvbmRpdGlvblZhcmlhYmxlQnJvYWRjYXN0KCZ3b3JraXRlbS0+Y3YpOworCisJCQkv KgorCQkJICogQWR2YW5jZSBzdGF0dXMsIGJlY2F1c2Ugd2UgYXJlIGd1YXJhbnRlZWQgdG8gcGFz cyB0aGlzCisJCQkgKiBzeW5jIHBvaW50LgorCQkJICovCisJCQl3b3JraXRlbS0+c3RhdHVzID0g U1RBUlRfU1lOQ19QT0lOVF9QQVNTRUQ7CisJCX0KKwkJLyogLi4uIG90aGVyd2lzZSwgd2FpdCBm b3Igc29tZWJvZHkgdG8gd2FrZSB1cyB1cCAqLworCQllbHNlCisJCXsKKwkJCXdvcmtpdGVtLT5s ZWFkZXJfc2xlZXBpbmcgPSB0cnVlOworCQkJQ1ZTbGVlcCgmd29ya2l0ZW0tPmN2KTsKKwkJCXdv cmtpdGVtLT5sZWFkZXJfc2xlZXBpbmcgPSBmYWxzZTsKKworCQkJLyoKKwkJCSAqIEEgcHJpb3Jp LCB3ZSBiZWxpZXZlIHRoYXQgaW4gdGhlIGVuZCBldmVyeW9uZSBzaG91bGQgYmUgYXdha2VuZWQK KwkJCSAqIGJ5IHRoZSBsZWFkZXIuCisJCQkgKi8KKwkJCXdvcmtpdGVtLT5zeW5jX3R5cGUgPSBM RUFERVI7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJd29ya2l0ZW0tPm53b3JrZXJzX3BhcnRpY2lw YXRpbmcgKz0gMTsKKworCQkvKgorCQkgKiBJZiB3ZSBrbm93LCB0aGF0IGxhdW5jaGVyIHdpbGwg bm8gbG9uZ2VyIGF0dGVtcHQgdG8gbGF1bmNoIG1vcmUKKwkJICogc3VwcG9ydGl2ZSB3b3JrZXJz IGZvciB0aGlzIGl0ZW0gPT4gd2UgYXJlIExBU1RfV09SS0VSIGZvciBzdXJlLgorCQkgKgorCQkg KiBOb3RlLCB0aGF0IGxhdW5jaGVyIHNldCBMQVNUX1dPUktFUiBzeW5jIHR5cGUgd2l0aG91dCBr bm93aW5nCisJCSAqIGN1cnJlbnQgc3RhdHVzIG9mIGxlYWRlci4gU28gd2UgYWxzbyBjaGVjayB0 aGF0IGxlYWRlciBpcyBzbGVlcGluZworCQkgKiBiZWZvcmUgd2FrZSBhbGwgdXAuIE90aGVyd2lz ZSwgd2UgbXVzdCB3YWl0IGZvciBsZWFkZXIgKGFuZCBhc2sgaGltCisJCSAqIHRvIHdha2UgYWxs IHVwKS4KKwkJICovCisJCWlmICh3b3JraXRlbS0+bndvcmtlcnNfcGFydGljaXBhdGluZyA9PSB3 b3JraXRlbS0+bndvcmtlcnNfdG9fbGF1bmNoICYmCisJCQlzeW5jX3R5cGUgPT0gTEFTVF9XT1JL RVIgJiYgd29ya2l0ZW0tPmxlYWRlcl9zbGVlcGluZykKKwkJeworCQkJQ29uZGl0aW9uVmFyaWFi bGVCcm9hZGNhc3QoJndvcmtpdGVtLT5jdik7CisKKwkJCS8qCisJCQkgKiBXZSBtdXN0IG5vdCBh ZHZhbmNlIHN0YXR1cyBpZiBsZWFkZXIgd2FudHMgdG8gc2h1dCBkb3duIHBhcmFsbGVsCisJCQkg KiBleGVjdXRpb24gKHNlZSBjaGVja3MgYmVsb3cpLgorCQkJICovCisJCQlpZiAod29ya2l0ZW0t PnN0YXR1cyAhPSBTSFVURE9XTikKKwkJCQl3b3JraXRlbS0+c3RhdHVzID0gU1RBUlRfU1lOQ19Q T0lOVF9QQVNTRUQ7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAod29ya2l0ZW0tPm53b3JrZXJz X3BhcnRpY2lwYXRpbmcgPT0gd29ya2l0ZW0tPm53b3JrZXJzX3RvX2xhdW5jaCAmJgorCQkJCXN5 bmNfdHlwZSA9PSBMQVNUX1dPUktFUikKKwkJCXsKKwkJCQl3b3JraXRlbS0+c3luY190eXBlID0g TEVBREVSOworCQkJfQorCisJCQl3b3JraXRlbS0+bndvcmtlcnNfc2xlZXBpbmcgKz0gMTsKKwkJ CUNWU2xlZXAoJndvcmtpdGVtLT5jdik7CisJCQl3b3JraXRlbS0+bndvcmtlcnNfc2xlZXBpbmcg LT0gMTsKKwkJfQorCX0KKworCS8qIFRlbGwgY2FsbGVyIHRoYXQgICovCisJaWYgKHdvcmtpdGVt LT5zdGF0dXMgPT0gU0hVVERPV04pCisJCW51bV9wYXJ0aWNpcGFudHMgPSAtMTsKKwllbHNlCisJ CW51bV9wYXJ0aWNpcGFudHMgPSB3b3JraXRlbS0+bndvcmtlcnNfcGFydGljaXBhdGluZzsKKwor CWlmICgha2VlcF9sb2NrKQorCQlMV0xvY2tSZWxlYXNlKEF1dG92YWN1dW1Mb2NrKTsKKworCXJl dHVybiBudW1fcGFydGljaXBhbnRzOworfQorCisvKgorICogTGlrZSBmdW5jdGlvbiBhYm92ZSwg YnV0IG11c3QgYmUgY2FsbGVkIGJ5IGxlYWRlciBhbmQgc3VwcG9ydGl2ZSB3b3JrZXJzCisgKiB3 aGVuIHRoZXkgZmluaXNoZWQgcGFyYWxsZWwgaW5kZXggdmFjdXVtLgorICoKKyAqIElmICdrZWVw X2xvY2snIGlzIHRydWUsIHRoZW4gQXV0b3ZhY3V1bUxvY2sgd2lsbCBub3QgYmUgcmVsZWFzZWQg aW4gdGhlIGVuZAorICogb2YgZnVuY3Rpb24gZXhlY3V0aW9uLgorICovCit2b2lkCitQYXJhbGxl bEF1dG92YWN1dW1FbmRTeW5jUG9pbnQoYm9vbCBrZWVwX2xvY2spCit7CisJUGFyYWxsZWxBdXRv VmFjdXVtV29ya0l0ZW0gKndvcmtpdGVtOworCisJaWYgKCFMV0xvY2tIZWxkQnlNZShBdXRvdmFj dXVtTG9jaykpCisJCUxXTG9ja0FjcXVpcmUoQXV0b3ZhY3V1bUxvY2ssIExXX0VYQ0xVU0lWRSk7 CisKKwl3b3JraXRlbSA9ICZBdXRvVmFjdXVtU2htZW0tPnBhdl93b3JrSXRlbTsKKwlBc3NlcnQo d29ya2l0ZW0tPmFjdGl2ZSk7CisKKwkvKiBOb3RoaW5nIHRvIGRvIGlmIG5vIHN1cHBvcnRpdmUg d29ya2VycyB3ZXJlIGxhdW5jaGVkICovCisJaWYgKHdvcmtpdGVtLT5ud29ya2Vyc19wYXJ0aWNp cGF0aW5nID09IDApCisJeworCQlBc3NlcnQoQW1QYXJhbGxlbElkeEF1dG9WYWNMZWFkZXIoKSk7 CisJCXdvcmtpdGVtLT5zdGF0dXMgPSBFTkRfU1lOQ19QT0lOVF9QQVNTRUQ7CisKKwkJaWYgKCFr ZWVwX2xvY2spCisJCQlMV0xvY2tSZWxlYXNlKEF1dG92YWN1dW1Mb2NrKTsKKworCQlyZXR1cm47 CisJfQorCisJaWYgKEFtUGFyYWxsZWxJZHhBdXRvVmFjTGVhZGVyKCkpCisJeworCQlBc3NlcnQo d29ya2l0ZW0tPnN5bmNfdHlwZSA9PSBMRUFERVIpOworCisJCS8qIFdhaXQgZm9yIGFsbCB3b3Jr ZXJzIHRvIGZpbmlzaCAob25seSBsYXN0IHdvcmtlciB3aWxsIHdha2UgdXMgdXApICovCisJCWlm ICh3b3JraXRlbS0+bmZpbmlzaGVkICE9IHdvcmtpdGVtLT5ud29ya2Vyc19wYXJ0aWNpcGF0aW5n KQorCQl7CisJCQl3b3JraXRlbS0+c3luY190eXBlID0gTEFTVF9XT1JLRVI7CisJCQl3b3JraXRl bS0+bGVhZGVyX3NsZWVwaW5nID0gdHJ1ZTsKKwkJCUNWU2xlZXAoJndvcmtpdGVtLT5jdik7CisJ CQl3b3JraXRlbS0+bGVhZGVyX3NsZWVwaW5nID0gZmFsc2U7CisKKwkJCUFzc2VydCh3b3JraXRl bS0+bmZpbmlzaGVkID09IHdvcmtpdGVtLT5ud29ya2Vyc19wYXJ0aWNpcGF0aW5nKTsKKworCQkJ LyoKKwkJCSAqIEFkdmFuY2Ugc3RhdHVzLCBiZWNhdXNlIHdlIGFyZSBndWFyYW50ZWVkIHRvIHBh c3MgdGhpcworCQkJICogc3luYyBwb2ludC4KKwkJCSAqLworCQkJd29ya2l0ZW0tPnN0YXR1cyA9 IEVORF9TWU5DX1BPSU5UX1BBU1NFRDsKKwkJfQorCX0KKwllbHNlCisJeworCQl3b3JraXRlbS0+ bmZpbmlzaGVkICs9IDE7CisKKwkJLyogSWYgd2UgYXJlIGxhc3QgZmluaXNoZWQgd29ya2VyIC0g d2FrZSB1cCB0aGUgbGVhZGVyLgorCQkgKgorCQkgKiBJZiBub3QgLSBqdXN0IGxlYXZlLCBiZWNh dXNlIHN1cHBvcnRpdmUgd29ya2VyIGFscmVhZHkgZmluaXNoZWQgYWxsCisJCSAqIHdvcmsgYW5k IG11c3QgZGllLgorCQkgKi8KKwkJaWYgKHdvcmtpdGVtLT5zeW5jX3R5cGUgPT0gTEFTVF9XT1JL RVIgJiYKKwkJCXdvcmtpdGVtLT5uZmluaXNoZWQgPT0gd29ya2l0ZW0tPm53b3JrZXJzX3BhcnRp Y2lwYXRpbmcpCisJCXsKKwkJCUNvbmRpdGlvblZhcmlhYmxlQnJvYWRjYXN0KCZ3b3JraXRlbS0+ Y3YpOworCisJCQkvKgorCQkJICogRG9uJ3QgbmVlZCB0byBjaGVjayBTSFVURE9XTiBzdGF0dXMg aGVyZSAtIGFsbCBzdXBwb3J0aXZlIHdvcmtlcnMKKwkJCSAqIGFyZSBhYm91dCB0byBmaW5pc2gg YW55d2F5LgorCQkJICovCisJCQl3b3JraXRlbS0+c3RhdHVzID0gRU5EX1NZTkNfUE9JTlRfUEFT U0VEOworCQl9CisKKwkJLyogV2UgYXJlIG5vdCBwYXJ0aWNpcGF0ZSBhbnltb3JlICovCisJCU15 V29ya2VySW5mby0+d2lfcGNsZWFudXAgPSAtMTsKKwl9CisKKwlpZiAoIWtlZXBfbG9jaykKKwkJ TFdMb2NrUmVsZWFzZShBdXRvdmFjdXVtTG9jayk7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBH ZXQgaWQgb2YgcGFyYWxsZWwgaW5kZXggdmFjdXVtIHdvcmtlciAoY291bnRpbmcgZnJvbSAwKS4K KyAqLworaW50CitHZXRBdXRvVmFjdXVtUGFyYWxsZWxXb3JrZXJOdW1iZXIodm9pZCkKK3sKKwlB c3NlcnQoQW1BdXRvVmFjdXVtV29ya2VyUHJvY2VzcygpICYmIE15V29ya2VySW5mby0+d2lfcGNs ZWFudXAgPiAwKTsKKwlyZXR1cm4gKE15V29ya2VySW5mby0+d2lfcGNsZWFudXAgLSAxKTsKK30K KworLyoKKyAqIExlYWRlciBhdXRvdmFjdXVtIHByb2Nlc3MgY2FuIGRlY2lkZSwgdGhhdCBoZSBu ZWVkcyBzZXZlcmFsIGhlbHBlciB3b3JrZXJzCisgKiB0byBwcm9jZXNzIHRhYmxlIGluIHBhcmFs bGVsIG1vZGUuIEhlIG11c3Qgc2V0IHVwIHBhcmFsbGVsIGNvbnRleHQgYW5kIGNhbGwKKyAqIExh dW5jaFBhcmFsbGVsQXV0b3ZhY3V1bVdvcmtlcnMuCisgKgorICogSW4gdGhpcyBmdW5jdGlvbiB3 ZSBkbyBmb2xsb3dpbmcgOgorICogMSkgU2VuZCBzaWduYWwgdG8gYXV0b3ZhY3V1bSBsYW5jaGVy IHRoYXQgY3JlYXRlcyAnc3VwcG9ydGl2ZSB3b3JrZXJzJworICoJICBkdXJpbmcgbGF1bmNoZXIn cyBzdGFuZGFyZCB3b3JrIGxvb3AuCisgKiAyKSBXYWl0IGZvciBzdXBwb3J0aXZlIHdvcmtlcnMg dG8gc3RhcnQuCisgKgorICogRnVuY2l0aW9uIHJldHVybiBudW1iZXIgb2Ygd29ya2VycyB0aGF0 IGxhdW5jaGVyIHdhcyBhYmxlIHRvIGxhdW5jaCAobWF5IGJlCisgKiBsZXNzIHRoZW4gJ253b3Jr ZXJzX3RvX2xhdW5jaCcpLgorICovCitpbnQKK0xhdW5jaFBhcmFsbGVsQXV0b3ZhY3V1bVdvcmtl cnMoT2lkIHJlbF9pZCwgaW50IG53b3JrZXJzX3RvX2xhdW5jaCwKKwkJCQkJCQkJZHNtX2hhbmRs ZSBoYW5kbGUsIFBHUFJPQyAqbGVhZGVyX3Byb2MsCisJCQkJCQkJCWludCBsZWFkZXJfcHJvY19w aWQpCit7CisJaW50IG53b3JrZXJzX2xhdW5jaGVkID0gMDsKKwlQYXJhbGxlbEF1dG9WYWN1dW1X b3JrSXRlbSAqd29ya2l0ZW07CisKKwlMV0xvY2tBY3F1aXJlKEF1dG92YWN1dW1Mb2NrLCBMV19F WENMVVNJVkUpOworCisJd29ya2l0ZW0gPSAmQXV0b1ZhY3V1bVNobWVtLT5wYXZfd29ya0l0ZW07 CisKKwkvKgorCSAqIEZvciBub3csIHRoZXJlIGNhbiBiZSBvbmx5IG9uZSBsZWFkZXIgYWNyb3Nz IGFsbCBjbHVzdGVyLgorCSAqIFRPRE86IGZpeCBpdCBpbiBuZXh0IHZlcnNpb25zCisJICovCisJ aWYgKHdvcmtpdGVtLT5hY3RpdmUgJiYgd29ya2l0ZW0tPmxlYWRlcl9wcm9jX251bSAhPSBNeVBy b2NQaWQpCisJeworCQlMV0xvY2tSZWxlYXNlKEF1dG92YWN1dW1Mb2NrKTsKKwkJcmV0dXJuIDA7 CisJfQorCisJLyogT0ssIHdlIGNhbiB1c2UgdGhpcyB3b3JraXRlbSBlbnRyeS4gSW5pdCBpdC4g Ki8KKwl3b3JraXRlbS0+YXZ3X2RhdGFiYXNlID0gTXlEYXRhYmFzZUlkOworCXdvcmtpdGVtLT5h dndfcmVsYXRpb24gPSByZWxfaWQ7CisJd29ya2l0ZW0tPmhhbmRsID0gaGFuZGxlOworCXdvcmtp dGVtLT5sZWFkZXJfcHJvYyA9IGxlYWRlcl9wcm9jOworCXdvcmtpdGVtLT5sZWFkZXJfcHJvY19u dW0gPSBsZWFkZXJfcHJvY19waWQ7CisJd29ya2l0ZW0tPm53b3JrZXJzX3BhcnRpY2lwYXRpbmcg PSAwOworCXdvcmtpdGVtLT5uZmluaXNoZWQgPSAwOworCXdvcmtpdGVtLT5ud29ya2Vyc190b19s YXVuY2ggPSBud29ya2Vyc190b19sYXVuY2g7CisJd29ya2l0ZW0tPmFjdGl2ZSA9IHRydWU7CisJ d29ya2l0ZW0tPmxlYWRlcl9zbGVlcGluZyA9IGZhbHNlOworCXdvcmtpdGVtLT5ud29ya2Vyc19z bGVlcGluZyA9IDA7CisJd29ya2l0ZW0tPm5maW5pc2hlZCA9IDA7CisJd29ya2l0ZW0tPnN5bmNf dHlwZSA9IExBVU5DSEVSOworCXdvcmtpdGVtLT5zdGF0dXMgPSBTVEFSVFVQOworCisJTFdMb2Nr UmVsZWFzZShBdXRvdmFjdXVtTG9jayk7CisKKwkvKiBOb3RpZnkgYXV0b3ZhY3V1bSBsYXVuY2hl ciB0aGF0IHdlIG5lZWQgc3VwcG9ydGl2ZSB3b3JrZXJzICovCisJaWYgKEF1dG9WYWNQYXJhbGxl bFdvcmtSZXF1ZXN0KCkpCisJeworCQkvKiBCZWNvbWUgdGhlIGxlYWRlciAqLworCQlNeVdvcmtl ckluZm8tPndpX3BjbGVhbnVwID0gMDsKKworCQkvKiBBbGwgY3JlYXRlZCB3b3JrZXJzIG11c3Qg Z2V0IHNhbWUgbG9ja3MgYXMgbGVhZGVyIHByb2Nlc3MgKi8KKwkJQmVjb21lTG9ja0dyb3VwTGVh ZGVyKCk7CisKKwkJLyoKKwkJICogV2FpdCB1bnRpbCBhbGwgc3VwcHJvdGl2ZSB3b3JrZXJzIGFy ZSBsYXVuY2hlZC4gQWxzbyByZXRyaWV2ZSBhY3R1YWwKKwkJICogbnVtYmVyIG9mIHBhcnRpY2lw YW50cworCQkgKi8KKworCQlud29ya2Vyc19sYXVuY2hlZCA9IHBhcmFsbGVsX2F1dG92YWN1dW1f c3RhcnRfc3luY19wb2ludChmYWxzZSk7CisJfQorCWVsc2UKKwl7CisJCS8qCisJCSAqIElmIHdl IChmb3IgYW55IHJlYXNvbikgY2Fubm90IHNlbmQgc2lnbmFsIHRvIHRoZSBsYXVuY2hlciwgZG9u J3QgdHJ5CisJCSAqIHRvIGRvIGluZGV4IHZhY3V1bWluZyBpbiBwYXJhbGxlbAorCQkgKi8KKwkJ cmV0dXJuIDA7CisJfQorCisJcmV0dXJuIG53b3JrZXJzX2xhdW5jaGVkOworfQorCisvKgorICog RHVyaW5nIHBhcmFsbGVsIGluZGV4IHZhY3V1bWluZyBhbnkgd29ya2VyIChib3RoIHN1cHBvcnRp dmVzIGFuZCBsZWFkZXIpIGNhbgorICogY2F0Y2ggYW4gZXJyb3IuCisgKiBJbiBvcmRlciB0byBo YW5kbGUgaXQgaW4gdGhlIHJpZ2h0IHdheSB3ZSBtdXN0IGNhbGwgdGhpcyBmdW5jdGlvbi4KKyAq Lworc3RhdGljIHZvaWQKK2hhbmRsZV9wYXJhbGxlbF9pZHhfYXV0b3ZhY19lcnJvcnModm9pZCkK K3sKKwlQYXJhbGxlbEF1dG9WYWN1dW1Xb3JrSXRlbSAqaXRlbTsKKworCUxXTG9ja0FjcXVpcmUo QXV0b3ZhY3V1bUxvY2ssIExXX0VYQ0xVU0lWRSk7CisJaXRlbSA9ICZBdXRvVmFjdXVtU2htZW0t PnBhdl93b3JrSXRlbTsKKworCWlmIChBbVBhcmFsbGVsSWR4QXV0b1ZhY0xlYWRlcigpKQorCXsK KwkJaWYgKGl0ZW0tPnN0YXR1cyA9PSBTVEFSVF9TWU5DX1BPSU5UX1BBU1NFRCkKKwkJeworCQkJ LyoKKwkJCSAqIElmIHN0YXJ0IHN5bmMgcG9pbnQgYWxyZWFkeSBwYXNzZWQgLSBqdXN0IHdhaXQg Zm9yIGFsbCBzdXBwb3J0aXZlCisJCQkgKiB3b3JrZXJzIHRvIGZpbmlzaCBhbmQgZXhpdC4KKwkJ CSAqLworCQkJUGFyYWxsZWxBdXRvdmFjdXVtRW5kU3luY1BvaW50KHRydWUpOworCQl9CisJCWVs c2UgaWYgKGl0ZW0tPnN0YXR1cyA9PSBTVEFSVFVQKQorCQl7CisJCQkvKgorCQkJICogSWYgbm8g c3luYyBwb2ludCBhcmUgcGFzc2VkIHdlIGNhbiBwcmV2ZW50IHN1cHBvcnRpdmUgd29ya2Vycwor CQkJICogZnJvbSBwZXJmb3JtaW5nIHRoZWlyIHdvcmsgLSBzZXQgU0hVVERPV04gc3RhdHVzIGFu ZCB3YWl0IHdoaWxlCisJCQkgKiBhbGwgd29ya2VycyB3aWxsIHNlZSBpdC4KKwkJCSAqLworCQkJ aXRlbS0+c3RhdHVzID0gU0hVVERPV047CisJCQlwYXJhbGxlbF9hdXRvdmFjdXVtX3N0YXJ0X3N5 bmNfcG9pbnQodHJ1ZSk7CisJCX0KKworCQlBdXRvVmFjdXVtUmVsZWFzZVBhcmFsbGVsV29yayh0 cnVlKTsKKwl9CisJZWxzZQorCXsKKwkJQXNzZXJ0KEFtUGFyYWxsZWxJZHhBdXRvVmFjU3VwcG9y dGl2ZSgpKTsKKworCQlpZiAoaXRlbS0+c3RhdHVzID09IFNUQVJUVVApCisJCXsKKwkJCS8qCisJ CQkgKiBJZiBubyBzeW5jIHBvaW50IGFyZSBwYXNzZWQgLSBqdXN0IGV4Y2x1ZGUgb3Vyc2VsdmVz IGZyb20KKwkJCSAqIHBhcnRpY2lwYW50cy4gRnVydGhlciBwYXJhbGxlbCBpbmRleCB2YWN1dW1p bmcgd2lsbCB0YWtlIHBsYWNlCisJCQkgKiBhcyB1c3VhbC4KKwkJCSAqLworCQkJaXRlbS0+bndv cmtlcnNfdG9fbGF1bmNoIC09IDE7CisKKwkJCWlmIChpdGVtLT5ud29ya2Vyc19wYXJ0aWNpcGF0 aW5nID09IGl0ZW0tPm53b3JrZXJzX3RvX2xhdW5jaCAmJgorCQkJCWl0ZW0tPnN5bmNfdHlwZSA9 PSBMQVNUX1dPUktFUiAmJiBpdGVtLT5sZWFkZXJfc2xlZXBpbmcpCisJCQl7CisJCQkJQ29uZGl0 aW9uVmFyaWFibGVCcm9hZGNhc3QoJml0ZW0tPmN2KTsKKwkJCQlpdGVtLT5zdGF0dXMgPSBTVEFS VF9TWU5DX1BPSU5UX1BBU1NFRDsKKwkJCX0KKwkJfQorCQllbHNlIGlmIChpdGVtLT5zdGF0dXMg PT0gU1RBUlRfU1lOQ19QT0lOVF9QQVNTRUQpCisJCXsKKwkJCS8qCisJCQkgKiBJZiBzdGFydCBz eW5jIHBvaW50IGFscmVhZHkgcGFzc2VkIHdlIHdpbGwgc2ltdWxhdGUgdGhlIHVzdWFsCisJCQkg KiBlbmQgb2Ygd29yayAoc2VlIFBhcmFsbGVsQXV0b3ZhY3V1bUVuZFN5bmNQb2ludCkuCisJCQkg Ki8KKwkJCWl0ZW0tPm5maW5pc2hlZCArPSAxOworCisJCQlpZiAoaXRlbS0+c3luY190eXBlID09 IExBU1RfV09SS0VSICYmCisJCQkJaXRlbS0+bmZpbmlzaGVkID09IGl0ZW0tPm53b3JrZXJzX3Bh cnRpY2lwYXRpbmcpCisJCQl7CisJCQkJQ29uZGl0aW9uVmFyaWFibGVCcm9hZGNhc3QoJml0ZW0t PmN2KTsKKwkJCQlpdGVtLT5zdGF0dXMgPSBFTkRfU1lOQ19QT0lOVF9QQVNTRUQ7CisJCQl9CisJ CX0KKwl9CisKKwlMV0xvY2tSZWxlYXNlKEF1dG92YWN1dW1Mb2NrKTsKK30KKwogLyoKICAqIGF1 dG92YWNfaW5pdAogICoJCVRoaXMgaXMgY2FsbGVkIGF0IHBvc3RtYXN0ZXIgaW5pdGlhbGl6YXRp b24uCkBAIC0zMzYxLDYgKzQxNTMsOSBAQCBBdXRvVmFjdXVtU2htZW1Jbml0KHZvaWQpCiAJCUF1 dG9WYWN1dW1TaG1lbS0+YXZfc3RhcnRpbmdXb3JrZXIgPSBOVUxMOwogCQltZW1zZXQoQXV0b1Zh Y3V1bVNobWVtLT5hdl93b3JrSXRlbXMsIDAsCiAJCQkgICBzaXplb2YoQXV0b1ZhY3V1bVdvcmtJ dGVtKSAqIE5VTV9XT1JLSVRFTVMpOworCQltZW1zZXQoJkF1dG9WYWN1dW1TaG1lbS0+cGF2X3dv cmtJdGVtLCAwLAorCQkJICAgc2l6ZW9mKFBhcmFsbGVsQXV0b1ZhY3V1bVdvcmtJdGVtKSk7CisJ CUNvbmRpdGlvblZhcmlhYmxlSW5pdCgmQXV0b1ZhY3V1bVNobWVtLT5wYXZfd29ya0l0ZW0uY3Yp OwogCiAJCXdvcmtlciA9IChXb3JrZXJJbmZvKSAoKGNoYXIgKikgQXV0b1ZhY3V1bVNobWVtICsK IAkJCQkJCQkgICBNQVhBTElHTihzaXplb2YoQXV0b1ZhY3V1bVNobWVtU3RydWN0KSkpOwpkaWZm IC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvbWlzYy9ndWNfdGFibGVzLmMgYi9zcmMvYmFja2Vu ZC91dGlscy9taXNjL2d1Y190YWJsZXMuYwppbmRleCA2MGIxMjQ0NmExYy4uYzA0NWE4ZDZlZGEg MTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL21pc2MvZ3VjX3RhYmxlcy5jCisrKyBiL3Ny Yy9iYWNrZW5kL3V0aWxzL21pc2MvZ3VjX3RhYmxlcy5jCkBAIC0zNjQ3LDYgKzM2NDcsMzYgQEAg c3RydWN0IGNvbmZpZ19pbnQgQ29uZmlndXJlTmFtZXNJbnRbXSA9CiAJCWNoZWNrX2F1dG92YWN1 dW1fd29ya19tZW0sIE5VTEwsIE5VTEwKIAl9LAogCisJeworCQl7Im1heF9wYXJhbGxlbF9pbmRl eF9hdXRvdmFjX3dvcmtlcnMiLCBQR0NfUE9TVE1BU1RFUiwgVkFDVVVNX0FVVE9WQUNVVU0sCisJ CQlnZXR0ZXh0X25vb3AoIlNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHBhcmFsbGVsIGF1dG92 YWN1dW0gd29ya2VyIHByb2Nlc3NlcyBkdXJpbmcgcGFyYWxsZWwgaW5kZXggdmFjdXVtaW5nIG9m IHNpbmdsZSB0YWJsZS4iKSwKKwkJCU5VTEwKKwkJfSwKKwkJJm1heF9wYXJhbGxlbF9pbmRleF9h dXRvdmFjX3dvcmtlcnMsCisJCTAsIDAsIE1BWF9QQVJBTExFTF9XT1JLRVJfTElNSVQsCisJCU5V TEwsIE5VTEwsIE5VTEwKKwl9LAorCisJeworCQl7ImF1dG92YWNfaWR4X3BhcmFsbGVsX21pbl9y b3dzIiwgUEdDX1BPU1RNQVNURVIsIFZBQ1VVTV9BVVRPVkFDVVVNLAorCQkJZ2V0dGV4dF9ub29w KCJTZXRzIHRoZSBtaW5pbXVtIG51bWJlciBvZiBkZWFkIHR1cGxlcyBpbiBzaW5nbGUgdGFibGUg dGhhdCByZXF1aXJlcyBwYXJhbGxlbCBpbmRleCBwcm9jZXNzaW5nIGR1cmluZyBhdXRvdmFjdXVt LiIpLAorCQkJTlVMTAorCQl9LAorCQkmYXV0b3ZhY19pZHhfcGFyYWxsZWxfbWluX3Jvd3MsCisJ CTAsIDAsIElOVDMyX01BWCwKKwkJTlVMTCwgTlVMTCwgTlVMTAorCX0sCisKKwl7CisJCXsiYXV0 b3ZhY19pZHhfcGFyYWxsZWxfbWluX2luZGV4ZXMiLCBQR0NfUE9TVE1BU1RFUiwgVkFDVVVNX0FV VE9WQUNVVU0sCisJCQlnZXR0ZXh0X25vb3AoIlNldHMgdGhlIG1pbmltdW0gbnVtYmVyIGluZGV4 ZXMgY3JlYXRlZCBvbiBzaW5nbGUgdGFibGUgdGhhdCByZXF1aXJlcyBwYXJhbGxlbCBpbmRleCBw cm9jZXNzaW5nIGR1cmluZyBhdXRvdmFjdXVtLiIpLAorCQkJTlVMTAorCQl9LAorCQkmYXV0b3Zh Y19pZHhfcGFyYWxsZWxfbWluX2luZGV4ZXMsCisJCTIsIDIsIElOVDMyX01BWCwKKwkJTlVMTCwg TlVMTCwgTlVMTAorCX0sCisKIAl7CiAJCXsidGNwX2tlZXBhbGl2ZXNfaWRsZSIsIFBHQ19VU0VS U0VULCBDT05OX0FVVEhfVENQLAogCQkJZ2V0dGV4dF9ub29wKCJUaW1lIGJldHdlZW4gaXNzdWlu ZyBUQ1Aga2VlcGFsaXZlcy4iKSwKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL21pc2Mv cG9zdGdyZXNxbC5jb25mLnNhbXBsZSBiL3NyYy9iYWNrZW5kL3V0aWxzL21pc2MvcG9zdGdyZXNx bC5jb25mLnNhbXBsZQppbmRleCAzNDgyNmQwMTM4MC4uMDg4NjkzOTgwMzkgMTAwNjQ0Ci0tLSBh L3NyYy9iYWNrZW5kL3V0aWxzL21pc2MvcG9zdGdyZXNxbC5jb25mLnNhbXBsZQorKysgYi9zcmMv YmFja2VuZC91dGlscy9taXNjL3Bvc3RncmVzcWwuY29uZi5zYW1wbGUKQEAgLTE0Niw2ICsxNDYs MTIgQEAKICNoYXNoX21lbV9tdWx0aXBsaWVyID0gMi4wCQkjIDEtMTAwMC4wIG11bHRpcGxpZXIg b24gaGFzaCB0YWJsZSB3b3JrX21lbQogI21haW50ZW5hbmNlX3dvcmtfbWVtID0gNjRNQgkJIyBt aW4gNjRrQgogI2F1dG92YWN1dW1fd29ya19tZW0gPSAtMQkJIyBtaW4gNjRrQiwgb3IgLTEgdG8g dXNlIG1haW50ZW5hbmNlX3dvcmtfbWVtCisjbWF4X3BhcmFsbGVsX2luZGV4X2F1dG92YWNfd29y a2VycyA9IDAgIyB0aGlzIGZlYXR1cmUgZGlzYWJsZWQgYnkgZGVmYXVsdAorCQkJCQkjIChjaGFu Z2UgcmVxdWlyZXMgcmVzdGFydCkKKyNhdXRvdmFjX2lkeF9wYXJhbGxlbF9taW5fcm93cyA9IDAK KwkJCQkJIyAoY2hhbmdlIHJlcXVpcmVzIHJlc3RhcnQpCisjYXV0b3ZhY19pZHhfcGFyYWxsZWxf bWluX2luZGV4ZXMgPSAyCisJCQkJCSMgKGNoYW5nZSByZXF1aXJlcyByZXN0YXJ0KQogI2xvZ2lj YWxfZGVjb2Rpbmdfd29ya19tZW0gPSA2NE1CCSMgbWluIDY0a0IKICNtYXhfc3RhY2tfZGVwdGgg PSAyTUIJCQkjIG1pbiAxMDBrQgogI3NoYXJlZF9tZW1vcnlfdHlwZSA9IG1tYXAJCSMgdGhlIGRl ZmF1bHQgaXMgdGhlIGZpcnN0IG9wdGlvbgpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvcG9zdG1h c3Rlci9hdXRvdmFjdXVtLmggYi9zcmMvaW5jbHVkZS9wb3N0bWFzdGVyL2F1dG92YWN1dW0uaApp bmRleCBlODEzNWY0MWExYy4uODFlNjI2N2NkN2IgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL3Bv c3RtYXN0ZXIvYXV0b3ZhY3V1bS5oCisrKyBiL3NyYy9pbmNsdWRlL3Bvc3RtYXN0ZXIvYXV0b3Zh Y3V1bS5oCkBAIC0xNSw2ICsxNSw4IEBACiAjZGVmaW5lIEFVVE9WQUNVVU1fSAogCiAjaW5jbHVk ZSAic3RvcmFnZS9ibG9jay5oIgorI2luY2x1ZGUgInN0b3JhZ2UvZHNtX2ltcGwuaCIKKyNpbmNs dWRlICJzdG9yYWdlL2xvY2suaCIKIAogLyoKICAqIE90aGVyIHByb2Nlc3NlcyBjYW4gcmVxdWVz dCBzcGVjaWZpYyB3b3JrIGZyb20gYXV0b3ZhY3V1bSwgaWRlbnRpZmllZCBieQpAQCAtMjUsMTIg KzI3LDI1IEBAIHR5cGVkZWYgZW51bQogCUFWV19CUklOU3VtbWFyaXplUmFuZ2UsCiB9IEF1dG9W YWN1dW1Xb3JrSXRlbVR5cGU7CiAKKy8qCisgKiBNYWdpYyBudW1iZXIgZm9yIHBhcmFsbGVsIGNv bnRleHQgVE9DLiBVc2VkIGZvciBwYXJhbGxlbCBpbmRleCBwcm9jZXNzaW5nCisgKiBkdXJpbmcg YXV0b3ZhY3V1bS4KKyAqLworI2RlZmluZSBBVl9QQVJBTExFTF9NQUdJQwkJCQkJCTB4YWFhYWFh YWEKKworLyogTWFnaWMgbnVtYmVycyBmb3IgcGVyLWNvbnRleHQgcGFyYWxsZWwgaW5kZXggcHJv Y2Vzc2luZyBzdGF0ZSBzaGFyaW5nLiAqLworI2RlZmluZSBBVl9QQVJBTExFTF9LRVlfVFJBTlNB Q1RJT05fU05BUFNIT1QJVUlOVDY0Q09OU1QoMHhGRkYwMDAwMDAwMDAwMDAxKQorI2RlZmluZSBB Vl9QQVJBTExFTF9LRVlfQUNUSVZFX1NOQVBTSE9UCQkJVUlOVDY0Q09OU1QoMHhGRkYwMDAwMDAw MDAwMDAyKQorCiAKIC8qIEdVQyB2YXJpYWJsZXMgKi8KIGV4dGVybiBQR0RMTElNUE9SVCBib29s IGF1dG92YWN1dW1fc3RhcnRfZGFlbW9uOwogZXh0ZXJuIFBHRExMSU1QT1JUIGludCBhdXRvdmFj dXVtX3dvcmtlcl9zbG90czsKIGV4dGVybiBQR0RMTElNUE9SVCBpbnQgYXV0b3ZhY3V1bV9tYXhf d29ya2VyczsKIGV4dGVybiBQR0RMTElNUE9SVCBpbnQgYXV0b3ZhY3V1bV93b3JrX21lbTsKK2V4 dGVybiBQR0RMTElNUE9SVCBpbnQgbWF4X3BhcmFsbGVsX2luZGV4X2F1dG92YWNfd29ya2VyczsK K2V4dGVybiBQR0RMTElNUE9SVCBpbnQgYXV0b3ZhY19pZHhfcGFyYWxsZWxfbWluX3Jvd3M7Citl eHRlcm4gUEdETExJTVBPUlQgaW50IGF1dG92YWNfaWR4X3BhcmFsbGVsX21pbl9pbmRleGVzOwog ZXh0ZXJuIFBHRExMSU1QT1JUIGludCBhdXRvdmFjdXVtX25hcHRpbWU7CiBleHRlcm4gUEdETExJ TVBPUlQgaW50IGF1dG92YWN1dW1fdmFjX3RocmVzaDsKIGV4dGVybiBQR0RMTElNUE9SVCBpbnQg YXV0b3ZhY3V1bV92YWNfbWF4X3RocmVzaDsKQEAgLTYwLDEwICs3NSwyMCBAQCBleHRlcm4gdm9p ZCBBdXRvVmFjV29ya2VyRmFpbGVkKHZvaWQpOwogCiBwZ19ub3JldHVybiBleHRlcm4gdm9pZCBB dXRvVmFjTGF1bmNoZXJNYWluKGNvbnN0IHZvaWQgKnN0YXJ0dXBfZGF0YSwgc2l6ZV90IHN0YXJ0 dXBfZGF0YV9sZW4pOwogcGdfbm9yZXR1cm4gZXh0ZXJuIHZvaWQgQXV0b1ZhY1dvcmtlck1haW4o Y29uc3Qgdm9pZCAqc3RhcnR1cF9kYXRhLCBzaXplX3Qgc3RhcnR1cF9kYXRhX2xlbik7CisvKiBj YWxsZWQgZnJvbSBhdXRvdmFjIHdvcmtlciB3aGVuIGl0IG5lZWRzIHBhcnRpY2lwYW50cyBpbiBw YXJhbGxlbCBpbmRleCBjbGVhbnVwICovCitleHRlcm4gYm9vbCBBdXRvVmFjUGFyYWxsZWxXb3Jr UmVxdWVzdCh2b2lkKTsKIAogZXh0ZXJuIGJvb2wgQXV0b1ZhY3V1bVJlcXVlc3RXb3JrKEF1dG9W YWN1dW1Xb3JrSXRlbVR5cGUgdHlwZSwKIAkJCQkJCQkJICBPaWQgcmVsYXRpb25JZCwgQmxvY2tO dW1iZXIgYmxrbm8pOwogCitleHRlcm4gdm9pZCBBdXRvVmFjdXVtUmVsZWFzZVBhcmFsbGVsV29y ayhib29sIGtlZXBfbG9jayk7CitleHRlcm4gaW50IEF1dG9WYWN1dW1QYXJhbGxlbFdvcmtXYWl0 Rm9yU3RhcnQodm9pZCk7CitleHRlcm4gdm9pZCBQYXJhbGxlbEF1dG92YWN1dW1FbmRTeW5jUG9p bnQoIGJvb2wga2VlcF9sb2NrKTsKK2V4dGVybiBpbnQgR2V0QXV0b1ZhY3V1bVBhcmFsbGVsV29y a2VyTnVtYmVyKHZvaWQpOworZXh0ZXJuIGludCBMYXVuY2hQYXJhbGxlbEF1dG92YWN1dW1Xb3Jr ZXJzKE9pZCByZWxfaWQsIGludCBud29ya2Vyc190b19sYXVuY2gsCisJCQkJCQkJCQkJICAgZHNt X2hhbmRsZSBoYW5kbGUsCisJCQkJCQkJCQkJICAgUEdQUk9DICpsZWFkZXJfcHJvYywKKwkJCQkJ CQkJCQkgICBpbnQgbGVhZGVyX3Byb2NfcGlkKTsKIC8qIHNoYXJlZCBtZW1vcnkgc3R1ZmYgKi8K IGV4dGVybiBTaXplIEF1dG9WYWN1dW1TaG1lbVNpemUodm9pZCk7CiBleHRlcm4gdm9pZCBBdXRv VmFjdXVtU2htZW1Jbml0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvbW9kdWxlcy9hdXRv dmFjdXVtLy5naXRpZ25vcmUgYi9zcmMvdGVzdC9tb2R1bGVzL2F1dG92YWN1dW0vLmdpdGlnbm9y ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uMGI1NDY0MWJjZWIKLS0t IC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9tb2R1bGVzL2F1dG92YWN1dW0vLmdpdGlnbm9yZQpA QCAtMCwwICsxIEBACisvdG1wX2NoZWNrLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlm ZiAtLWdpdCBhL3NyYy90ZXN0L21vZHVsZXMvYXV0b3ZhY3V1bS9NYWtlZmlsZSBiL3NyYy90ZXN0 L21vZHVsZXMvYXV0b3ZhY3V1bS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw MDAwMDAwMDAwMC4uOTBjMDBmZjM1MGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9tb2R1 bGVzL2F1dG92YWN1dW0vTWFrZWZpbGUKQEAgLTAsMCArMSwxNCBAQAorIyBzcmMvdGVzdC9tb2R1 bGVzL2F1dG92YWN1dW0vTWFrZWZpbGUKKworVEFQX1RFU1RTID0gMQorCitpZmRlZiBVU0VfUEdY UworUEdfQ09ORklHID0gcGdfY29uZmlnCitQR1hTIDo9ICQoc2hlbGwgJChQR19DT05GSUcpIC0t cGd4cykKK2luY2x1ZGUgJChQR1hTKQorZWxzZQorc3ViZGlyID0gc3JjL3Rlc3QvbW9kdWxlcy9h dXRvdmFjdXVtCit0b3BfYnVpbGRkaXIgPSAuLi8uLi8uLi8uLgoraW5jbHVkZSAkKHRvcF9idWls ZGRpcikvc3JjL01ha2VmaWxlLmdsb2JhbAoraW5jbHVkZSAkKHRvcF9zcmNkaXIpL2NvbnRyaWIv Y29udHJpYi1nbG9iYWwubWsKK2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZm IC0tZ2l0IGEvc3JjL3Rlc3QvbW9kdWxlcy9hdXRvdmFjdXVtL3QvMDAxX2F1dG92YWNfcGFyYWxs ZWwucGwgYi9zcmMvdGVzdC9tb2R1bGVzL2F1dG92YWN1dW0vdC8wMDFfYXV0b3ZhY19wYXJhbGxl bC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uZDhlMjJhMDZiYWMK LS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9tb2R1bGVzL2F1dG92YWN1dW0vdC8wMDFfYXV0 b3ZhY19wYXJhbGxlbC5wbApAQCAtMCwwICsxLDEzNyBAQAordXNlIHdhcm5pbmdzIEZBVEFMID0+ ICdhbGwnOwordXNlIFBvc3RncmVTUUw6OlRlc3Q6OkNsdXN0ZXI7Cit1c2UgUG9zdGdyZVNRTDo6 VGVzdDo6VXRpbHM7Cit1c2UgVGVzdDo6TW9yZTsKKworbXkgJHBzcWxfb3V0OworCitteSAkbm9k ZSA9IFBvc3RncmVTUUw6OlRlc3Q6OkNsdXN0ZXItPm5ldygnbm9kZTEnKTsKKyRub2RlLT5pbml0 OworJG5vZGUtPmFwcGVuZF9jb25mKCdwb3N0Z3Jlc3FsLmNvbmYnLCBxcXsKKwlhdXRvdmFjdXVt ID0gb2ZmCisJbWF4X3dhbF9zaXplID0gNDA5NgorfSk7Ciskbm9kZS0+c3RhcnQ7CisKK215ICRp bmRleGVzX251bSA9IDgwOworbXkgJGluaXRpYWxfcm93c19udW0gPSAxXzAwMF8wMDA7CisKKyMg Q3JlYXRlIGJpZyB0YWJsZSBhbmQgY3JlYXRlIHNwZWNpZmllZCBudW1iZXIgb2YgYi10cmVlIGlu ZGV4ZXMgb24gaXQKKyRub2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgcXF7CisJQ1JFQVRFIFRB QkxFIHRlc3RfYXV0b3ZhYyAoCisJCWlkIFNFUklBTCBQUklNQVJZIEtFWSwKKwkJY29sXzEgSU5U RUdFUiwgIGNvbF8yIElOVEVHRVIsICBjb2xfMyBJTlRFR0VSLCAgY29sXzQgSU5URUdFUiwgIGNv bF81IElOVEVHRVIsCisJCWNvbF82IElOVEVHRVIsICBjb2xfNyBJTlRFR0VSLCAgY29sXzggSU5U RUdFUiwgIGNvbF85IElOVEVHRVIsICBjb2xfMTAgSU5URUdFUiwKKwkJY29sXzExIElOVEVHRVIs IGNvbF8xMiBJTlRFR0VSLCBjb2xfMTMgSU5URUdFUiwgY29sXzE0IElOVEVHRVIsIGNvbF8xNSBJ TlRFR0VSLAorCQljb2xfMTYgSU5URUdFUiwgY29sXzE3IElOVEVHRVIsIGNvbF8xOCBJTlRFR0VS LCBjb2xfMTkgSU5URUdFUiwgY29sXzIwIElOVEVHRVIsCisJCWNvbF8yMSBJTlRFR0VSLCBjb2xf MjIgSU5URUdFUiwgY29sXzIzIElOVEVHRVIsIGNvbF8yNCBJTlRFR0VSLCBjb2xfMjUgSU5URUdF UiwKKwkJY29sXzI2IElOVEVHRVIsIGNvbF8yNyBJTlRFR0VSLCBjb2xfMjggSU5URUdFUiwgY29s XzI5IElOVEVHRVIsIGNvbF8zMCBJTlRFR0VSLAorCQljb2xfMzEgSU5URUdFUiwgY29sXzMyIElO VEVHRVIsIGNvbF8zMyBJTlRFR0VSLCBjb2xfMzQgSU5URUdFUiwgY29sXzM1IElOVEVHRVIsCisJ CWNvbF8zNiBJTlRFR0VSLCBjb2xfMzcgSU5URUdFUiwgY29sXzM4IElOVEVHRVIsIGNvbF8zOSBJ TlRFR0VSLCBjb2xfNDAgSU5URUdFUiwKKwkJY29sXzQxIElOVEVHRVIsIGNvbF80MiBJTlRFR0VS LCBjb2xfNDMgSU5URUdFUiwgY29sXzQ0IElOVEVHRVIsIGNvbF80NSBJTlRFR0VSLAorCQljb2xf NDYgSU5URUdFUiwgY29sXzQ3IElOVEVHRVIsIGNvbF80OCBJTlRFR0VSLCBjb2xfNDkgSU5URUdF UiwgY29sXzUwIElOVEVHRVIsCisJCWNvbF81MSBJTlRFR0VSLCBjb2xfNTIgSU5URUdFUiwgY29s XzUzIElOVEVHRVIsIGNvbF81NCBJTlRFR0VSLCBjb2xfNTUgSU5URUdFUiwKKwkJY29sXzU2IElO VEVHRVIsIGNvbF81NyBJTlRFR0VSLCBjb2xfNTggSU5URUdFUiwgY29sXzU5IElOVEVHRVIsIGNv bF82MCBJTlRFR0VSLAorCQljb2xfNjEgSU5URUdFUiwgY29sXzYyIElOVEVHRVIsIGNvbF82MyBJ TlRFR0VSLCBjb2xfNjQgSU5URUdFUiwgY29sXzY1IElOVEVHRVIsCisJCWNvbF82NiBJTlRFR0VS LCBjb2xfNjcgSU5URUdFUiwgY29sXzY4IElOVEVHRVIsIGNvbF82OSBJTlRFR0VSLCBjb2xfNzAg SU5URUdFUiwKKwkJY29sXzcxIElOVEVHRVIsIGNvbF83MiBJTlRFR0VSLCBjb2xfNzMgSU5URUdF UiwgY29sXzc0IElOVEVHRVIsIGNvbF83NSBJTlRFR0VSLAorCQljb2xfNzYgSU5URUdFUiwgY29s Xzc3IElOVEVHRVIsIGNvbF83OCBJTlRFR0VSLCBjb2xfNzkgSU5URUdFUiwgY29sXzgwIElOVEVH RVIsCisJCWNvbF84MSBJTlRFR0VSLCBjb2xfODIgSU5URUdFUiwgY29sXzgzIElOVEVHRVIsIGNv bF84NCBJTlRFR0VSLCBjb2xfODUgSU5URUdFUiwKKwkJY29sXzg2IElOVEVHRVIsIGNvbF84NyBJ TlRFR0VSLCBjb2xfODggSU5URUdFUiwgY29sXzg5IElOVEVHRVIsIGNvbF85MCBJTlRFR0VSLAor CQljb2xfOTEgSU5URUdFUiwgY29sXzkyIElOVEVHRVIsIGNvbF85MyBJTlRFR0VSLCBjb2xfOTQg SU5URUdFUiwgY29sXzk1IElOVEVHRVIsCisJCWNvbF85NiBJTlRFR0VSLCBjb2xfOTcgSU5URUdF UiwgY29sXzk4IElOVEVHRVIsIGNvbF85OSBJTlRFR0VSLCBjb2xfMTAwIElOVEVHRVIKKwkpOwor CisJRE8gXCRcJAorCURFQ0xBUkUKKwkJaSBJTlRFR0VSOworCUJFR0lOCisJCUZPUiBpIElOIDEu LiRpbmRleGVzX251bSBMT09QCisJCQlFWEVDVVRFIGZvcm1hdCgnQ1JFQVRFIElOREVYIGlkeF9j b2xfXCVzIE9OIHRlc3RfYXV0b3ZhYyAoY29sX1wlcyk7JywgaSwgaSk7CisJCUVORCBMT09QOwor CUVORCBcJFwkOworfSk7CisKKyRub2RlLT5wc3FsKCdwb3N0Z3JlcycsCisJIlNFTEVDVCBDT1VO VCgqKSBGUk9NIHBnX2luZGV4IGkKKwkgICBKT0lOIHBnX2NsYXNzIGMgT04gYy5vaWQgPSBpLmlu ZHJlbGlkCisJICBXSEVSRSBjLnJlbG5hbWUgPSAndGVzdF9hdXRvdmFjJzsiLAorCXN0ZG91dCA9 PiBcJHBzcWxfb3V0CispOworaXMoJHBzcWxfb3V0LCAkaW5kZXhlc19udW0gKyAxLCAiQWxsIGlu ZGV4ZXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkiKTsKKworJG5vZGUtPnNhZmVfcHNxbCgncG9zdGdy ZXMnLCBxcXsKKwlETyBcJFwkCisJREVDTEFSRQorCSAgICBpIElOVEVHRVI7CisJQkVHSU4KKwkg ICAgRk9SIGkgSU4gMS4uJGluaXRpYWxfcm93c19udW0gTE9PUAorCSAgICAgICAgSU5TRVJUIElO VE8gdGVzdF9hdXRvdmFjICgKKwkgICAgICAgICAgICBjb2xfMSwgY29sXzIsIGNvbF8zLCBjb2xf NCwgY29sXzUsIGNvbF82LCBjb2xfNywgY29sXzgsIGNvbF85LCBjb2xfMTAsCisJICAgICAgICAg ICAgY29sXzExLCBjb2xfMTIsIGNvbF8xMywgY29sXzE0LCBjb2xfMTUsIGNvbF8xNiwgY29sXzE3 LCBjb2xfMTgsIGNvbF8xOSwgY29sXzIwLAorCSAgICAgICAgICAgIGNvbF8yMSwgY29sXzIyLCBj b2xfMjMsIGNvbF8yNCwgY29sXzI1LCBjb2xfMjYsIGNvbF8yNywgY29sXzI4LCBjb2xfMjksIGNv bF8zMCwKKwkgICAgICAgICAgICBjb2xfMzEsIGNvbF8zMiwgY29sXzMzLCBjb2xfMzQsIGNvbF8z NSwgY29sXzM2LCBjb2xfMzcsIGNvbF8zOCwgY29sXzM5LCBjb2xfNDAsCisJICAgICAgICAgICAg Y29sXzQxLCBjb2xfNDIsIGNvbF80MywgY29sXzQ0LCBjb2xfNDUsIGNvbF80NiwgY29sXzQ3LCBj b2xfNDgsIGNvbF80OSwgY29sXzUwLAorCSAgICAgICAgICAgIGNvbF81MSwgY29sXzUyLCBjb2xf NTMsIGNvbF81NCwgY29sXzU1LCBjb2xfNTYsIGNvbF81NywgY29sXzU4LCBjb2xfNTksIGNvbF82 MCwKKwkgICAgICAgICAgICBjb2xfNjEsIGNvbF82MiwgY29sXzYzLCBjb2xfNjQsIGNvbF82NSwg Y29sXzY2LCBjb2xfNjcsIGNvbF82OCwgY29sXzY5LCBjb2xfNzAsCisJICAgICAgICAgICAgY29s XzcxLCBjb2xfNzIsIGNvbF83MywgY29sXzc0LCBjb2xfNzUsIGNvbF83NiwgY29sXzc3LCBjb2xf NzgsIGNvbF83OSwgY29sXzgwLAorCSAgICAgICAgICAgIGNvbF84MSwgY29sXzgyLCBjb2xfODMs IGNvbF84NCwgY29sXzg1LCBjb2xfODYsIGNvbF84NywgY29sXzg4LCBjb2xfODksIGNvbF85MCwK KwkgICAgICAgICAgICBjb2xfOTEsIGNvbF85MiwgY29sXzkzLCBjb2xfOTQsIGNvbF85NSwgY29s Xzk2LCBjb2xfOTcsIGNvbF85OCwgY29sXzk5LCBjb2xfMTAwCisJICAgICAgICApIFZBTFVFUyAo CisJICAgICAgICAgICAgaSwgaSArIDEsIGkgKyAyLCBpICsgMywgaSArIDQsIGkgKyA1LCBpICsg NiwgaSArIDcsIGkgKyA4LCBpICsgOSwKKwkgICAgICAgICAgICBpICsgMTAsIGkgKyAxMSwgaSAr IDEyLCBpICsgMTMsIGkgKyAxNCwgaSArIDE1LCBpICsgMTYsIGkgKyAxNywgaSArIDE4LCBpICsg MTksCisJICAgICAgICAgICAgaSArIDIwLCBpICsgMjEsIGkgKyAyMiwgaSArIDIzLCBpICsgMjQs IGkgKyAyNSwgaSArIDI2LCBpICsgMjcsIGkgKyAyOCwgaSArIDI5LAorCSAgICAgICAgICAgIGkg KyAzMCwgaSArIDMxLCBpICsgMzIsIGkgKyAzMywgaSArIDM0LCBpICsgMzUsIGkgKyAzNiwgaSAr IDM3LCBpICsgMzgsIGkgKyAzOSwKKwkgICAgICAgICAgICBpICsgNDAsIGkgKyA0MSwgaSArIDQy LCBpICsgNDMsIGkgKyA0NCwgaSArIDQ1LCBpICsgNDYsIGkgKyA0NywgaSArIDQ4LCBpICsgNDks CisJICAgICAgICAgICAgaSArIDUwLCBpICsgNTEsIGkgKyA1MiwgaSArIDUzLCBpICsgNTQsIGkg KyA1NSwgaSArIDU2LCBpICsgNTcsIGkgKyA1OCwgaSArIDU5LAorCSAgICAgICAgICAgIGkgKyA2 MCwgaSArIDYxLCBpICsgNjIsIGkgKyA2MywgaSArIDY0LCBpICsgNjUsIGkgKyA2NiwgaSArIDY3 LCBpICsgNjgsIGkgKyA2OSwKKwkgICAgICAgICAgICBpICsgNzAsIGkgKyA3MSwgaSArIDcyLCBp ICsgNzMsIGkgKyA3NCwgaSArIDc1LCBpICsgNzYsIGkgKyA3NywgaSArIDc4LCBpICsgNzksCisJ ICAgICAgICAgICAgaSArIDgwLCBpICsgODEsIGkgKyA4MiwgaSArIDgzLCBpICsgODQsIGkgKyA4 NSwgaSArIDg2LCBpICsgODcsIGkgKyA4OCwgaSArIDg5LAorCSAgICAgICAgICAgIGkgKyA5MCwg aSArIDkxLCBpICsgOTIsIGkgKyA5MywgaSArIDk0LCBpICsgOTUsIGkgKyA5NiwgaSArIDk3LCBp ICsgOTgsIGkgKyA5OQorCSAgICAgICAgKTsKKwkgICAgRU5EIExPT1A7CisJRU5EIFwkXCQ7Cit9 KTsKKworJG5vZGUtPnBzcWwoJ3Bvc3RncmVzJywKKwkiU0VMRUNUIENPVU5UKCopIEZST00gdGVz dF9hdXRvdmFjOyIsCisJc3Rkb3V0ID0+IFwkcHNxbF9vdXQKKyk7CitpcygkcHNxbF9vdXQsICRp bml0aWFsX3Jvd3NfbnVtLCAiQWxsIGRhdGEgaW5zZXJ0ZWQgaW50byB0YWJsZSBzdWNjZXNzZnVs bHkiKTsKKworJG5vZGUtPnNhZmVfcHNxbCgncG9zdGdyZXMnLCBxcXsKKwlVUERBVEUgdGVzdF9h dXRvdmFjIFNFVCBjb2xfMSA9IDAgV0hFUkUgKGNvbF8xICUgMykgPSAwOworCUFOQUxZWkUgdGVz dF9hdXRvdmFjOworfSk7CisKK215ICRkZWFkX3R1cGxlc190aHJlc2ggPSAkaW5pdGlhbF9yb3dz X251bSAvIDQ7CitteSAkaW5kZXhlc19udW1fdGhyZXNoID0gJGluZGV4ZXNfbnVtIC8gMjsKK215 ICRudW1fd29ya2VycyA9IDE7CisKKyMgUmVkdWNlIGF1dG92YWN1dW1fd29ya19tZW0sIHNvIGxl YWRlciBwcm9jZXNzIHdpbGwgcGVyZm9ybSBwYXJhbGxlbCBpbmRleGkKKyMgdmFjdXVtIHBoYXNl IHNldmVyYWwgdGltZXMKKyRub2RlLT5hcHBlbmRfY29uZigncG9zdGdyZXNxbC5jb25mJywgcXF7 CisJYXV0b3ZhY3V1bV9uYXB0aW1lID0gJzFzJworCWF1dG92YWN1dW1fd29ya19tZW0gPSAyMDQ4 CisJYXV0b3ZhY3V1bV92YWN1dW1fdGhyZXNob2xkID0gMQorCWF1dG92YWN1dW1fYW5hbHl6ZV90 aHJlc2hvbGQgPSAxCisJYXV0b3ZhY3V1bV92YWN1dW1fc2NhbGVfZmFjdG9yID0gMC4xCisJYXV0 b3ZhY3V1bV9hbmFseXplX3NjYWxlX2ZhY3RvciA9IDAuMQorCWF1dG92YWN1dW1fbWF4X3dvcmtl cnMgPSAxMAorCWF1dG92YWN1dW0gPSBvbgorCWF1dG92YWNfaWR4X3BhcmFsbGVsX21pbl9yb3dz ID0gJGRlYWRfdHVwbGVzX3RocmVzaAorCWF1dG92YWNfaWR4X3BhcmFsbGVsX21pbl9pbmRleGVz ID0gJGluZGV4ZXNfbnVtX3RocmVzaAorCW1heF9wYXJhbGxlbF9pbmRleF9hdXRvdmFjX3dvcmtl cnMgPSAkbnVtX3dvcmtlcnMKK30pOworCiskbm9kZS0+cmVzdGFydDsKKworIyB3YWl0IGZvciBh dXRvdmFjdXVtIHRvIHJlc2V0IGRhdGZyb3plbnhpZCBhZ2UgdG8gMAorJG5vZGUtPnBvbGxfcXVl cnlfdW50aWwoJ3Bvc3RncmVzJywgcXsKKwlTRUxFQ1QgY291bnQoKikgPSAwIEZST00gcGdfZGF0 YWJhc2UgV0hFUkUgbXhpZF9hZ2UoZGF0ZnJvemVueGlkKSA+IDAKK30pIG9yIGRpZSAiVGltZWQg b3V0IHdoaWxlIHdhaXRpbmcgZm9yIGF1dG92YWN1dW0iOworCitvaygxLCAiVGhlcmUgYXJlIG5v IHNlZ2ZhdWx0cyIpOworCiskbm9kZS0+c3RvcDsKK2RvbmVfdGVzdGluZygpOwotLSAKMi40My4w Cgo= --000000000000ea30570632e341b1--