Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S265777AbUAMWtW (ORCPT ); Tue, 13 Jan 2004 17:49:22 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S265776AbUAMWtW (ORCPT ); Tue, 13 Jan 2004 17:49:22 -0500 Received: from mailserver2.hrz.tu-darmstadt.de ([130.83.47.4]:12818 "EHLO mailserver2.hrz.tu-darmstadt.de") by vger.kernel.org with ESMTP id S266236AbUAMWno (ORCPT ); Tue, 13 Jan 2004 17:43:44 -0500 Message-Id: <200401132243.i0DMhVeK028429@mailserver2.hrz.tu-darmstadt.de> From: Jens David Organization: FBR Networks Inc. To: linux-kernel@vger.kernel.org Subject: [SPAM?] [PATCH] Backport via-ircc to Linux-2.4 from 2.6 Date: Tue, 13 Jan 2004 23:43:31 +0100 X-Mailer: KMail [version 1.3.2] MIME-Version: 1.0 Content-Type: Multipart/Mixed; boundary="------------Boundary-00=_JS9GOF69AODVPQXISBZV" X-TUD-HRZ-MailScanner: Found to be clean X-TUD-HRZ-MailScanner-SpamCheck: spam, SpamAssassin (Wertung=7.05, benoetigt 5, DOMAIN_BODY 1.80, MIME_MISSING_BOUNDARY 0.80, MSGID_FROM_MTA_SHORT 3.31, REMOVE_REMOVAL_NEAR 1.14) X-TUD-HRZ-MailScanner-SpamScore: sssssss Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 98459 Lines: 1304 --------------Boundary-00=_JS9GOF69AODVPQXISBZV Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 8bit Hi Jeff & all, this patch adds support for the VIA fast infrared controller to Linux-2.4 . Most VIA686a and VT1211-based notebooks with infrared port need this driver to offer IRDA support. Non-intrusive high-quality (incl. Configure.help entry etc.) patch against linux-2.4.24-0pre2.1mdk from Mandrake Cooker. Needs patch-2.4.24-0.pre2.1mdk-irda_device_api26 from previous mail. Should apply to vanilla-2.4.24 without too much fuzz as well. -- j -- Jens David, DG1KJD Email: dg1kjd@afthd.tu-darmstadt.de http://www.afthd.tu-darmstadt.de/~dg1kjd Work: +49 351 80800 527 --- Home/Mobile: +49 173 6394993 --------------Boundary-00=_JS9GOF69AODVPQXISBZV Content-Type: text/x-diff; charset="iso-8859-1"; name="patch-2.4.24-0.pre2.1mdk-via_ircc" Content-Transfer-Encoding: base64 Content-Description: VIA-IRCC driver backport Linux-2.6 -> Linux-2.4 Content-Disposition: attachment; filename="patch-2.4.24-0.pre2.1mdk-via_ircc" LS0tIGxpbnV4LTIuNC4yNC0wLnByZTIuMW1kay5vcmlnL2RyaXZlcnMvbmV0L2lyZGEvdmlhLWly Y2MuYwkxOTcwLTAxLTAxIDAxOjAwOjAwLjAwMDAwMDAwMCArMDEwMAorKysgbGludXgtMi40LjI0 LTAucHJlMi4xbWRrL2RyaXZlcnMvbmV0L2lyZGEvdmlhLWlyY2MuYwkyMDA0LTAxLTEzIDE4OjI0 OjAwLjAwMDAwMDAwMCArMDEwMApAQCAtMCwwICsxLDE2MjEgQEAKKy8qKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZp bGVuYW1lOiAgICAgIHZpYS1pcmNjLmMKKyBWZXJzaW9uOiAgICAgICAxLjAgCisgRGVzY3JpcHRp b246ICAgRHJpdmVyIGZvciB0aGUgVklBIFZUODIzMS9WVDgyMzMgSXJEQSBjaGlwc2V0cworIEF1 dGhvcjogICAgICAgIFZJQSBUZWNobm9sb2dpZXMsaW5jCisgRGF0ZSAgOgkwOC8wNi8yMDAzCisK K0NvcHlyaWdodCAoYykgMTk5OC0yMDAzIFZJQSBUZWNobm9sb2dpZXMsIEluYy4KKworVGhpcyBw cm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBt b2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vu c2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIg dmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlz IHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1 bCwgYnV0IFdJVEhPVVQKK0FOWSBXQVJSQU5USUVTIE9SIFJFUFJFU0VOVEFUSU9OUzsgd2l0aG91 dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVT UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCitTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBM aWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNv cHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJv Z3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMu LAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVT QS4KKworRjAxIE9jdC8wMi8wMjogTW9kaWZ5IGNvZGUgZm9yIFYwLjExKG1vdmUgb3V0IGJhY2sg dG8gYmFjayB0cmFuc2ZlcikKK0YwMiBPY3QvMjgvMDI6IEFkZCBTQiBkZXZpY2UgSUQgZm9yIDMx NDcgYW5kIDMxNzcuCisgQ29tbWVudCA6CisgICAgICAganVsLzA5LzIwMDIgOiBvbmx5IGltcGxl bWVudCB0d28ga2luZCBvZiBkb25nbGUgY3VycmVudGx5LgorICAgICAgIE9jdC8wMi8yMDAyIDog d29yayBvbiBWVDgyMzEgYW5kIFZUODIzMyAuCisgICAgICAgQXVnLzA2LzIwMDMgOiBjaGFuZ2Ug ZHJpdmVyIGZvcm1hdCB0byBwY2kgZHJpdmVyIC4KKyAgICAgICAKKyAqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNp bmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNs dWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUg PGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUg PGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4 L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9w Y2kuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNs dWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorCisjaW5jbHVk ZSA8bmV0L2lyZGEvd3JhcHBlci5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNs dWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgorCisjaW5jbHVkZSAidmlhLWlyY2MuaCIKKwor Ly8jZGVmaW5lIERCR19JTwkxCisvLyNkZWZpbmUgICBEQkdNU0cgMQorLy8jZGVmaW5lICAgREJH TVNHXzk2IDEKKy8vI2RlZmluZSAgIERCR01TR183NiAxCisvL3N0YXRpYyBpbnQgZGVidWc9MDsK KworCisjZGVmaW5lIERCRyh4KSB7aWYgKGRlYnVnKSB4O30KKworI2RlZmluZSAgIFZJQV9NT0RV TEVfTkFNRSAidmlhLWlyY2MiCisjZGVmaW5lIENISVBfSU9fRVhURU5UIDgKKyNkZWZpbmUgQlJP S0VOX0RPTkdMRV9JRAorCitzdGF0aWMgY2hhciAqZHJpdmVyX25hbWUgPSAidmlhLWlyY2MiOwor CisvKiBNb2R1bGUgcGFyYW1ldGVycyAqLworc3RhdGljIGludCBxb3NfbXR0X2JpdHMgPSAweDA3 OwkvKiAxIG1zIG9yIG1vcmUgKi8KK3N0YXRpYyBpbnQgZG9uZ2xlX2lkID0gOTsJLy9kZWZhbHV0 IElCTSB0eXBlCisKKy8qIFJlc291cmNlIGlzIGFsbG9jYXRlIGJ5IEJJT1MgdXNlciBvbmx5IG5l ZWQgdG8gc3VwcGx5IGRvbmdsZV9pZCovCitNT0RVTEVfUEFSTShkb25nbGVfaWQsICJpIik7CisK Ky8qIE1heCA0IGluc3RhbmNlcyBmb3Igbm93ICovCitzdGF0aWMgc3RydWN0IHZpYV9pcmNjX2Ni ICpkZXZfc2VsZltdID0geyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH07CisKKy8qIFNvbWUgcHJv dG90eXBlcyAqLworc3RhdGljIGludCB2aWFfaXJjY19vcGVuKGludCBpLCBjaGlwaW9fdCAqIGlu Zm8sIHVuc2lnbmVkIGludCBpZCk7CitzdGF0aWMgaW50IF9fZXhpdCB2aWFfaXJjY19jbG9zZShz dHJ1Y3QgdmlhX2lyY2NfY2IgKnNlbGYpOworc3RhdGljIGludCB2aWFfaXJjY19zZXR1cChjaGlw aW9fdCAqIGluZm8sIHVuc2lnbmVkIGludCBpZCk7CitzdGF0aWMgaW50IHZpYV9pcmNjX2RtYV9y ZWNlaXZlKHN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZik7CitzdGF0aWMgaW50IHZpYV9pcmNjX2Rt YV9yZWNlaXZlX2NvbXBsZXRlKHN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZiwKKwkJCQkJIGludCBp b2Jhc2UpOworc3RhdGljIGludCB2aWFfaXJjY19oYXJkX3htaXRfc2lyKHN0cnVjdCBza19idWZm ICpza2IsCisJCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgdmlhX2ly Y2NfaGFyZF94bWl0X2ZpcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgc3RydWN0IG5ldF9k ZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCB2aWFfaXJjY19jaGFuZ2Vfc3BlZWQoc3RydWN0IHZp YV9pcmNjX2NiICpzZWxmLCBfX3UzMiBiYXVkKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCB2aWFfaXJj Y19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLAorCQkJCSAgICAgIHN0cnVjdCBwdF9y ZWdzICpyZWdzKTsKK3N0YXRpYyBpbnQgdmlhX2lyY2NfaXNfcmVjZWl2aW5nKHN0cnVjdCB2aWFf aXJjY19jYiAqc2VsZik7CitzdGF0aWMgaW50IHZpYV9pcmNjX3JlYWRfZG9uZ2xlX2lkKGludCBp b2Jhc2UpOworCitzdGF0aWMgaW50IHZpYV9pcmNjX25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNl ICpkZXYpOworc3RhdGljIGludCB2aWFfaXJjY19uZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2Ug KmRldik7CitzdGF0aWMgaW50IHZpYV9pcmNjX25ldF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAq ZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLAorCQkJICAgICAgaW50IGNtZCk7CitzdGF0aWMgc3RydWN0 IG5ldF9kZXZpY2Vfc3RhdHMgKnZpYV9pcmNjX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZp Y2UKKwkJCQkJCSAgICAgICAqZGV2KTsKK3N0YXRpYyB2b2lkIHZpYV9pcmNjX2NoYW5nZV9kb25n bGVfc3BlZWQoaW50IGlvYmFzZSwgaW50IHNwZWVkLAorCQkJCQkgaW50IGRvbmdsZV9pZCk7Citz dGF0aWMgaW50IFJ4VGltZXJIYW5kbGVyKHN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZiwgaW50IGlv YmFzZSk7Cit2b2lkIGh3cmVzZXQoc3RydWN0IHZpYV9pcmNjX2NiICpzZWxmKTsKK3N0YXRpYyBp bnQgdmlhX2lyY2NfZG1hX3htaXQoc3RydWN0IHZpYV9pcmNjX2NiICpzZWxmLCB1MTYgaW9iYXNl KTsKK3N0YXRpYyBpbnQgdXBsb2FkX3J4ZGF0YShzdHJ1Y3QgdmlhX2lyY2NfY2IgKnNlbGYsIGlu dCBpb2Jhc2UpOworc3RhdGljIGludCBfX2RldmluaXQgdmlhX2luaXRfb25lIChzdHJ1Y3QgcGNp X2RldiAqcGNpZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpOworc3RhdGljIHZv aWQgX19leGl0IHZpYV9yZW1vdmVfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldik7CisKKy8qIFNo b3VsZCB1c2UgdWRlbGF5KCkgaW5zdGVhZCwgZXZlbiBpZiB3ZSBhcmUgeDg2IG9ubHkgLSBKZWFu IElJICovCit2b2lkIGlvZGVsYXkoaW50IHVkZWxheSkKK3sKKwl1OCBkYXRhOworCWludCBpOwor CisJZm9yIChpID0gMDsgaSA8IHVkZWxheTsgaSsrKSB7CisJCWRhdGEgPSBpbmIoMHg4MCk7CisJ fQorfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgdmlhX3BjaV90YmxbXSA9IHsKKwl7 IFBDSV9WRU5ET1JfSURfVklBLCBEZXZpY2VJRDEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsMCww LDAgfSwKKwl7IFBDSV9WRU5ET1JfSURfVklBLCBEZXZpY2VJRDIsIFBDSV9BTllfSUQsIFBDSV9B TllfSUQsMCwwLDEgfSwKKwl7IFBDSV9WRU5ET1JfSURfVklBLCBEZXZpY2VJRDMsIFBDSV9BTllf SUQsIFBDSV9BTllfSUQsMCwwLDIgfSwKKwl7IFBDSV9WRU5ET1JfSURfVklBLCBEZXZpY2VJRDQs IFBDSV9BTllfSUQsIFBDSV9BTllfSUQsMCwwLDMgfSwKKwl7IFBDSV9WRU5ET1JfSURfVklBLCBE ZXZpY2VJRDUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsMCwwLDQgfSwKKwl7IDAsIH0KK307CisK K01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLHZpYV9wY2lfdGJsKTsKKworCitzdGF0aWMgc3RydWN0 IHBjaV9kcml2ZXIgdmlhX2RyaXZlciA9IHsKKwkubmFtZQkJPSBWSUFfTU9EVUxFX05BTUUsCisJ LmlkX3RhYmxlCT0gdmlhX3BjaV90YmwsCisJLnByb2JlCQk9IHZpYV9pbml0X29uZSwKKwkucmVt b3ZlCQk9IHZpYV9yZW1vdmVfb25lLAorfTsKKworCisvKgorICogRnVuY3Rpb24gdmlhX2lyY2Nf aW5pdCAoKQorICoKKyAqICAgIEluaXRpYWxpemUgY2hpcC4gSnVzdCBmaW5kIG91dCBjaGlwIHR5 cGUgYW5kIHJlc291cmNlLgorICovCitpbnQgX19pbml0IHZpYV9pcmNjX2luaXQodm9pZCkKK3sK KwlpbnQgcmM7CisKKyNpZmRlZglIRUFETVNHCisgICAgICAgIERCRyhwcmludGsoS0VSTl9JTkZP ICJ2aWFfaXJjY19pbml0IC4uLi4uLlxuIikpOworI2VuZGlmCisJcmMgPSBwY2lfcmVnaXN0ZXJf ZHJpdmVyICgmdmlhX2RyaXZlcik7CisjaWZkZWYJSEVBRE1TRworICAgICAgICBEQkcocHJpbnRr KEtFUk5fSU5GTyAidmlhX2lyY2NfaW5pdCA6cmMgPSAlZC4uLi4uLlxuIixyYykpOworI2VuZGlm CisJaWYgKHJjIDwgMSkgeworI2lmZGVmCUhFQURNU0cKKyAgICAgICAgREJHKHByaW50ayhLRVJO X0lORk8gInZpYV9pcmNjX2luaXQgcmV0dXJuIC1FTk9ERVYuLi4uLi5cbiIpKTsKKyNlbmRpZgor CQlpZiAocmMgPT0gMCkJcGNpX3VucmVnaXN0ZXJfZHJpdmVyICgmdmlhX2RyaXZlcik7CisJCXJl dHVybiAtRU5PREVWOworCX0KKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50IF9fZGV2aW5p dCB2aWFfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsIGNvbnN0IHN0cnVjdCBwY2lf ZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmM7CisgICAgICAgIHU4IHRlbXAsb2xkUENJXzQwLG9s ZFBDSV80NCxiVG1wLGJUbXAxOworCXUxNiBDaGlwc2V0LEZpckRSUTEsRmlyRFJRMCxGaXJJUlEs RmlySU9CYXNlOworCWNoaXBpb190IGluZm87CisJCisjaWZkZWYJSEVBRE1TRworICAgICAgICBE QkcocHJpbnRrKEtFUk5fSU5GTyAidmlhX2luaXRfb25lIDogRGV2aWNlIElEPSgwWCVYKVxuIixp ZC0+ZGV2aWNlKSk7CisjZW5kaWYKKwlpZihpZC0+ZGV2aWNlICE9IERldmljZUlEMSAmJiBpZC0+ ZGV2aWNlICE9IERldmljZUlEMiAmJgorCSAgIGlkLT5kZXZpY2UgIT0gRGV2aWNlSUQzICYmIGlk LT5kZXZpY2UgIT0gRGV2aWNlSUQ0ICYmCisJICAgaWQtPmRldmljZSAhPSBEZXZpY2VJRDUgICl7 CisjaWZkZWYJSEVBRE1TRworCQlEQkcocHJpbnRrKEtFUk5fSU5GTyAidmlhX2luaXRfb25lIDog RGV2aWNlIElEKDBYJVgpIG5vdCBTdXBwb3J0ZWRcbiIsaWQtPmRldmljZSkpOworI2VuZGlmCisJ ICAgICAgcmV0dXJuIC1FTk9ERVY7IC8vU291dGggbm90IGV4aXN0ICEhISEhCisJfQorCXJjID0g cGNpX2VuYWJsZV9kZXZpY2UgKHBjaWRldik7CisjaWZkZWYJSEVBRE1TRworCURCRyhwcmludGso S0VSTl9JTkZPICJ2aWFfaW5pdF9vbmUgOiByYz0lZFxuIixyYykpOworI2VuZGlmCisJaWYgKHJj KQorCQlyZXR1cm4gLUVOT0RFVjsgCisgICAgICAgIC8vU291dGggQnJpZGdlIGV4aXN0CisgICAg ICAgIGlmICggUmVhZExQQ1JlZygweDIwKSAhPSAweDNDICkKKwkJQ2hpcHNldD0weDMwOTY7CisJ ZWxzZQorCQlDaGlwc2V0PTB4MzA3NjsKKwlpZiAoQ2hpcHNldD09MHgzMDc2KSB7CisjaWZkZWYJ SEVBRE1TRworCQlEQkcocHJpbnRrKEtFUk5fSU5GTyAidmlhX2luaXRfb25lIDogMzA3NiAuLi4u Li5cbiIpKTsKKyNlbmRpZgorCQlXcml0ZUxQQ1JlZyg3LDB4MGMgKTsKKwkJdGVtcD1SZWFkTFBD UmVnKDB4MzApOy8vY2hlY2sgaWYgQklPUyBFbmFibGUgRmlyCisJCWlmKCh0ZW1wJjB4MDEpPT0x KSB7ICAgLy8gQklPUyBjbG9zZSBvciBubyBGSVIKKwkJCVdyaXRlTFBDUmVnKDB4MWQsIDB4ODIg KTsKKwkJCVdyaXRlTFBDUmVnKDB4MjMsMHgxOCk7CisJCQl0ZW1wPVJlYWRMUENSZWcoMHhGMCk7 CisJCQlpZigodGVtcCYweDAxKT09MCkgeworCQkJCXRlbXA9KFJlYWRMUENSZWcoMHg3NCkmMHgw Myk7ICAgIC8vRE1BCisJCQkJRmlyRFJRMD10ZW1wICsgNDsKKwkJCQl0ZW1wPShSZWFkTFBDUmVn KDB4NzQpJjB4MEMpID4+IDI7CisJCQkJRmlyRFJRMT10ZW1wICsgNDsKKwkJCX0gZWxzZSB7CisJ CQkJdGVtcD0oUmVhZExQQ1JlZygweDc0KSYweDBDKSA+PiAyOyAgICAvL0RNQQorCQkJCUZpckRS UTA9dGVtcCArIDQ7CisJCQkJRmlyRFJRMT1GaXJEUlEwOworCQkJfQorCQkJRmlySVJRPShSZWFk TFBDUmVnKDB4NzApJjB4MGYpOwkJLy9JUlEKKwkJCUZpcklPQmFzZT1SZWFkTFBDUmVnKDB4NjAg KSA8PCA4OwkvL0lPIFNwYWNlIDpoaWdoIGJ5dGUKKwkJCUZpcklPQmFzZT1GaXJJT0Jhc2V8IFJl YWRMUENSZWcoMHg2MSkgOwkvL2xvdyBieXRlCisJCQlGaXJJT0Jhc2U9RmlySU9CYXNlICA7CisJ CQlpbmZvLmZpcl9iYXNlPUZpcklPQmFzZTsKKwkJCWluZm8uaXJxPUZpcklSUTsKKwkJCWluZm8u ZG1hPUZpckRSUTE7CisJCQlpbmZvLmRtYTI9RmlyRFJRMDsKKwkJCXBjaV9yZWFkX2NvbmZpZ19i eXRlKHBjaWRldiwweDQwLCZiVG1wKTsKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwY2lkZXYs MHg0MCwoKGJUbXAgfCAweDA4KSAmIDB4ZmUpKTsKKwkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBj aWRldiwweDQyLCZiVG1wKTsKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwY2lkZXYsMHg0Miwo YlRtcCB8IDB4ZjApKTsKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwY2lkZXYsMHg1YSwweGMw KTsKKwkJCVdyaXRlTFBDUmVnKDB4MjgsIDB4NzAgKTsKKwkJCWlmICh2aWFfaXJjY19vcGVuKDAs ICZpbmZvLDB4MzA3NikgPT0gMCkKKwkJCQlyYz0wOworCQl9IGVsc2UKKwkJCXJjID0gLUVOT0RF VjsgLy9JUiBub3QgdHVybiBvbgkgCisJfSBlbHNlIHsgLy9Ob3QgVlQxMjExCisjaWZkZWYJSEVB RE1TRworCQlEQkcocHJpbnRrKEtFUk5fSU5GTyAidmlhX2luaXRfb25lIDogMzA5NiAuLi4uLi5c biIpKTsKKyNlbmRpZgorCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lkZXYsMHg2NywmYlRtcCk7 Ly9jaGVjayBpZiBCSU9TIEVuYWJsZSBGaXIKKwkJaWYoKGJUbXAmMHgwMSk9PTEpIHsgIC8vIEJJ T1MgZW5hYmxlIEZJUgorCQkJLy9FbmFibGUgRG91YmxlIERNQSBjbG9jaworCQkJcGNpX3JlYWRf Y29uZmlnX2J5dGUocGNpZGV2LDB4NDIsJm9sZFBDSV80MCk7CisJCQlwY2lfd3JpdGVfY29uZmln X2J5dGUocGNpZGV2LDB4NDIsb2xkUENJXzQwIHwgMHg4MCk7CisJCQlwY2lfcmVhZF9jb25maWdf Ynl0ZShwY2lkZXYsMHg0MCwmb2xkUENJXzQwKTsKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShw Y2lkZXYsMHg0MCxvbGRQQ0lfNDAgJiAweGY3KTsKKwkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBj aWRldiwweDQ0LCZvbGRQQ0lfNDQpOworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBjaWRldiww eDQ0LDB4NGUpOworICAvLy0tLS0tLS0tLS0gcmVhZCBjb25maWd1cmF0aW9uIGZyb20gRnVuY3Rp b24wIG9mIHNvdXRoIGJyaWRnZQorCQkJaWYoKGJUbXAmMHgwMik9PTApIHsKKwkJCQlwY2lfcmVh ZF9jb25maWdfYnl0ZShwY2lkZXYsMHg0NCwmYlRtcDEpOyAvL0RNQQorCQkJCUZpckRSUTAgPSAo YlRtcDEgJiAweDMwKSA+PiA0OworCQkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaWRldiwweDQ0 LCZiVG1wMSk7CisJCQkJRmlyRFJRMSA9IChiVG1wMSAmIDB4YzApID4+IDY7CisJCQl9IGVsc2Ug IHsKKwkJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lkZXYsMHg0NCwmYlRtcDEpOyAgICAvL0RN QQorCQkJCUZpckRSUTAgPSAoYlRtcDEgJiAweDMwKSA+PiA0IDsKKwkJCQlGaXJEUlExPTA7CisJ CQl9CisJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lkZXYsMHg0NywmYlRtcDEpOyAgLy9JUlEK KwkJCUZpcklSUSA9IGJUbXAxICYgMHgwZjsKKworCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNp ZGV2LDB4NjksJmJUbXApOworCQkJRmlySU9CYXNlID0gYlRtcCA8PCA4Oy8vaGlnaHQgYnl0ZQor CQkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpZGV2LDB4NjgsJmJUbXApOworCQkJRmlySU9CYXNl ID0gKEZpcklPQmFzZSB8IGJUbXAgKSAmIDB4ZmZmMDsKKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCisJCQlpbmZvLmZpcl9iYXNlPUZpcklPQmFzZTsKKwkJCWluZm8uaXJxPUZpcklSUTsK KwkJCWluZm8uZG1hPUZpckRSUTE7CisJCQlpbmZvLmRtYTI9RmlyRFJRMDsKKwkJCWlmICh2aWFf aXJjY19vcGVuKDAsICZpbmZvLDB4MzA5NikgPT0gMCkKKwkJCQlyYz0wOworCQl9IGVsc2UKKwkJ CXJjID0gLUVOT0RFVjsgLy9JUiBub3QgdHVybiBvbiAhISEhIQorCX0vL05vdCBWVDEyMTEKKyNp ZmRlZglIRUFETVNHCisJREJHKHByaW50ayhLRVJOX0lORk8gInZpYV9pbml0X29uZSBFbmQgOiBy Yz0lZFxuIixyYykpOworI2VuZGlmCisJcmV0dXJuIHJjOworfQorCisvKgorICogRnVuY3Rpb24g dmlhX2lyY2NfY2xlYW4gKCkKKyAqCisgKiAgICBDbG9zZSBhbGwgY29uZmlndXJlZCBjaGlwcwor ICoKKyAqLworc3RhdGljIHZvaWQgX19leGl0IHZpYV9pcmNjX2NsZWFuKHZvaWQpCit7CisJaW50 IGk7CisKKyNpZmRlZglIRUFETVNHCisJREJHKHByaW50ayhLRVJOX0lORk8gInZpYV9pcmNjX2Ns ZWFuXG4iKSk7CisjZW5kaWYKKwlmb3IgKGk9MDsgaSA8IDQ7IGkrKykgeworCQlpZiAoZGV2X3Nl bGZbaV0pCisJCQl2aWFfaXJjY19jbG9zZShkZXZfc2VsZltpXSk7CisJfQorfQorCitzdGF0aWMg dm9pZCBfX2V4aXQgdmlhX3JlbW92ZV9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworI2lm ZGVmCUhFQURNU0cKKyAgICAgICAgREJHKHByaW50ayhLRVJOX0lORk8gInZpYV9yZW1vdmVfb25l IDogIC4uLi4uLlxuIikpOworI2VuZGlmCisJdmlhX2lyY2NfY2xlYW4oKTsKKworfQorCitzdGF0 aWMgdm9pZCBfX2V4aXQgdmlhX2lyY2NfY2xlYW51cCh2b2lkKQoreworCisjaWZkZWYJSEVBRE1T RworCURCRyhwcmludGsoS0VSTl9JTkZPICJ2aWFfaXJjY19jbGVhbnVwIC4uLi4uLlxuIikpOwor I2VuZGlmCisJdmlhX2lyY2NfY2xlYW4oKTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgKCZ2aWFf ZHJpdmVyKTsgCit9CisKKy8qCisgKiBGdW5jdGlvbiB2aWFfaXJjY19vcGVuIChpb2Jhc2UsIGly cSkKKyAqCisgKiAgICBPcGVuIGRyaXZlciBpbnN0YW5jZQorICoKKyAqLworc3RhdGljIF9fZGV2 aW5pdCBpbnQgdmlhX2lyY2Nfb3BlbihpbnQgaSwgY2hpcGlvX3QgKiBpbmZvLCB1bnNpZ25lZCBp bnQgaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgdmlhX2lyY2NfY2Ig KnNlbGY7CisJaW50IGVycjsKKworCWlmICgodmlhX2lyY2Nfc2V0dXAoaW5mbywgaWQpKSA9PSAt MSkKKwkJcmV0dXJuIC0xOworCisJLyogQWxsb2NhdGUgbmV3IGluc3RhbmNlIG9mIHRoZSBkcml2 ZXIgKi8KKwlkZXYgPSBhbGxvY19pcmRhZGV2KHNpemVvZihzdHJ1Y3QgdmlhX2lyY2NfY2IpKTsK KwlpZiAoZGV2ID09IE5VTEwpIAorCQlyZXR1cm4gLUVOT01FTTsKKworCXNlbGYgPSBkZXYtPnBy aXY7CisJc2VsZi0+bmV0ZGV2ID0gZGV2OworCXNwaW5fbG9ja19pbml0KCZzZWxmLT5sb2NrKTsK KworCS8qIE5lZWQgdG8gc3RvcmUgc2VsZiBzb21ld2hlcmUgKi8KKwlkZXZfc2VsZltpXSA9IHNl bGY7CisJc2VsZi0+aW5kZXggPSBpOworCS8qIEluaXRpYWxpemUgUmVzb3VyY2UgKi8KKwlzZWxm LT5pby5jZmdfYmFzZSA9IGluZm8tPmNmZ19iYXNlOworCXNlbGYtPmlvLmZpcl9iYXNlID0gaW5m by0+ZmlyX2Jhc2U7CisJc2VsZi0+aW8uaXJxID0gaW5mby0+aXJxOworCXNlbGYtPmlvLmZpcl9l eHQgPSBDSElQX0lPX0VYVEVOVDsKKwlzZWxmLT5pby5kbWEgPSBpbmZvLT5kbWE7CisJc2VsZi0+ aW8uZG1hMiA9IGluZm8tPmRtYTI7CisJc2VsZi0+aW8uZmlmb19zaXplID0gMzI7CisJc2VsZi0+ Y2hpcF9pZCA9IGlkOworCXNlbGYtPnN0X2ZpZm8ubGVuID0gMDsKKwlzZWxmLT5SeERhdGFSZWFk eSA9IDA7CisKKwkvKiBSZXNlcnZlIHRoZSBpb3BvcnRzIHRoYXQgd2UgbmVlZCAqLworCWlmICgh cmVxdWVzdF9yZWdpb24oc2VsZi0+aW8uZmlyX2Jhc2UsIHNlbGYtPmlvLmZpcl9leHQsIGRyaXZl cl9uYW1lKSkgeworLy8gICAgICAgICAgICAgIFdBUk5JTkcoX19GVU5DVElPTl9fICIoKSwgY2Fu J3QgZ2V0IGlvYmFzZSBvZiAweCUwM3hcbiIsc2VsZi0+aW8uZmlyX2Jhc2UpOworCQllcnIgPSAt RU5PREVWOworCQlnb3RvIGVycl9vdXQxOworCX0KKwkKKwkvKiBJbml0aWFsaXplIFFvUyBmb3Ig dGhpcyBkZXZpY2UgKi8KKwlpcmRhX2luaXRfbWF4X3Fvc19jYXBhYmlsaWVzKCZzZWxmLT5xb3Mp OworCS8qIFRoZSBvbmx5IHZhbHVlIHdlIG11c3Qgb3ZlcnJpZGUgaXQgdGhlIGJhdWRyYXRlICov CisvLyAgICAgIHNlbGYtPnFvcy5iYXVkX3JhdGUuYml0cyA9IElSXzk2MDA7Ly8gTWF5IHVzZSB0 aGlzIGZvciB0ZXN0aW5nCisKKwlzZWxmLT5xb3MuYmF1ZF9yYXRlLmJpdHMgPQorCSAgICBJUl85 NjAwIHwgSVJfMTkyMDAgfCBJUl8zODQwMCB8IElSXzU3NjAwIHwgSVJfMTE1MjAwIHwKKwkgICAg SVJfNTc2MDAwIHwgSVJfMTE1MjAwMCB8IChJUl80MDAwMDAwIDw8IDgpOworCisJc2VsZi0+cW9z Lm1pbl90dXJuX3RpbWUuYml0cyA9IHFvc19tdHRfYml0czsKKwlpcmRhX3Fvc19iaXRzX3RvX3Zh bHVlKCZzZWxmLT5xb3MpOworCisJc2VsZi0+ZmxhZ3MgPQorCSAgICBJRkZfRklSIHwgSUZGX01J UiB8IElGRl9TSVIgfCBJRkZfRE1BIHwgSUZGX1BJTyB8IElGRl9ET05HTEU7CisKKwkvKiBNYXgg RE1BIGJ1ZmZlciBzaXplIG5lZWRlZCA9IChkYXRhX3NpemUgKyA2KSAqICh3aW5kb3dfc2l6ZSkg KyA2OyAqLworCXNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUgPSAxNDM4NCArIDIwNDg7CisJc2VsZi0+ dHhfYnVmZi50cnVlc2l6ZSA9IDE0Mzg0ICsgMjA0ODsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBp ZiBuZWVkZWQgKi8KKwlzZWxmLT5yeF9idWZmLmhlYWQgPQorCSAgICAoX191OCAqKSBrbWFsbG9j KHNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUsIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKKwlpZiAoc2Vs Zi0+cnhfYnVmZi5oZWFkID09IE5VTEwpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJf b3V0MjsKKwl9CisJbWVtc2V0KHNlbGYtPnJ4X2J1ZmYuaGVhZCwgMCwgc2VsZi0+cnhfYnVmZi50 cnVlc2l6ZSk7CisKKwlzZWxmLT50eF9idWZmLmhlYWQgPQorCSAgICAoX191OCAqKSBrbWFsbG9j KHNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUsIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKKwlpZiAoc2Vs Zi0+dHhfYnVmZi5oZWFkID09IE5VTEwpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJf b3V0MzsKKwl9CisJbWVtc2V0KHNlbGYtPnR4X2J1ZmYuaGVhZCwgMCwgc2VsZi0+dHhfYnVmZi50 cnVlc2l6ZSk7CisKKwlzZWxmLT5yeF9idWZmLmluX2ZyYW1lID0gRkFMU0U7CisJc2VsZi0+cnhf YnVmZi5zdGF0ZSA9IE9VVFNJREVfRlJBTUU7CisJc2VsZi0+dHhfYnVmZi5kYXRhID0gc2VsZi0+ dHhfYnVmZi5oZWFkOworCXNlbGYtPnJ4X2J1ZmYuZGF0YSA9IHNlbGYtPnJ4X2J1ZmYuaGVhZDsK KworCS8qIFJlc2V0IFR4IHF1ZXVlIGluZm8gKi8KKwlzZWxmLT50eF9maWZvLmxlbiA9IHNlbGYt PnR4X2ZpZm8ucHRyID0gc2VsZi0+dHhfZmlmby5mcmVlID0gMDsKKwlzZWxmLT50eF9maWZvLnRh aWwgPSBzZWxmLT50eF9idWZmLmhlYWQ7CisKKwkvKiBLZWVwIHRyYWNrIG9mIG1vZHVsZSB1c2Fn ZSAqLworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCS8qIE92ZXJyaWRlIHRoZSBuZXR3b3Jr IGZ1bmN0aW9ucyB3ZSBuZWVkIHRvIHVzZSAqLworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gdmlh X2lyY2NfaGFyZF94bWl0X3NpcjsKKwlkZXYtPm9wZW4gPSB2aWFfaXJjY19uZXRfb3BlbjsKKwlk ZXYtPnN0b3AgPSB2aWFfaXJjY19uZXRfY2xvc2U7CisJZGV2LT5kb19pb2N0bCA9IHZpYV9pcmNj X25ldF9pb2N0bDsKKwlkZXYtPmdldF9zdGF0cyA9IHZpYV9pcmNjX25ldF9nZXRfc3RhdHM7CisK KwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXQ0 OworCisJTUVTU0FHRSgiSXJEQTogUmVnaXN0ZXJlZCBkZXZpY2UgJXNcbiIsIGRldi0+bmFtZSk7 CisKKwkvKiBDaGVjayBpZiB1c2VyIGhhcyBzdXBwbGllZCB0aGUgZG9uZ2xlIGlkIG9yIG5vdCAq LworCWlmICghZG9uZ2xlX2lkKQorCQlkb25nbGVfaWQgPSB2aWFfaXJjY19yZWFkX2RvbmdsZV9p ZChzZWxmLT5pby5maXJfYmFzZSk7CisJc2VsZi0+aW8uZG9uZ2xlX2lkID0gZG9uZ2xlX2lkOwor CXZpYV9pcmNjX2NoYW5nZV9kb25nbGVfc3BlZWQoc2VsZi0+aW8uZmlyX2Jhc2UsIDk2MDAsCisJ CQkJICAgICBzZWxmLT5pby5kb25nbGVfaWQpOworCisJcmV0dXJuIDA7CisgZXJyX291dDQ6CisJ a2ZyZWUoc2VsZi0+dHhfYnVmZi5oZWFkKTsKKyBlcnJfb3V0MzoKKwlrZnJlZShzZWxmLT5yeF9i dWZmLmhlYWQpOworIGVycl9vdXQyOgorCXJlbGVhc2VfcmVnaW9uKHNlbGYtPmlvLmZpcl9iYXNl LCBzZWxmLT5pby5maXJfZXh0KTsKKyBlcnJfb3V0MToKKwlmcmVlX25ldGRldihkZXYpOworCWRl dl9zZWxmW2ldID0gTlVMTDsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogRnVuY3Rpb24gdmlh X2lyY2NfY2xvc2UgKHNlbGYpCisgKgorICogICAgQ2xvc2UgZHJpdmVyIGluc3RhbmNlCisgKgor ICovCitzdGF0aWMgaW50IF9fZXhpdCB2aWFfaXJjY19jbG9zZShzdHJ1Y3QgdmlhX2lyY2NfY2Ig KnNlbGYpCit7CisJaW50IGlvYmFzZTsKKworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVO Q1RJT05fXyk7CisKKwlBU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCWlvYmFz ZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCisJUmVzZXRDaGlwKGlvYmFzZSwgNSk7CS8vaGFyZHdh cmUgcmVzZXQuCisJLyogUmVtb3ZlIG5ldGRldmljZSAqLworCXVucmVnaXN0ZXJfbmV0ZGV2KHNl bGYtPm5ldGRldik7CisKKwkvKiBSZWxlYXNlIHRoZSBQT1JUIHRoYXQgdGhpcyBkcml2ZXIgaXMg dXNpbmcgKi8KKwlJUkRBX0RFQlVHKDQsICIlcygpLCBSZWxlYXNpbmcgUmVnaW9uICUwM3hcbiIs CisJCSAgIF9fRlVOQ1RJT05fXywgc2VsZi0+aW8uZmlyX2Jhc2UpOworCXJlbGVhc2VfcmVnaW9u KHNlbGYtPmlvLmZpcl9iYXNlLCBzZWxmLT5pby5maXJfZXh0KTsKKwlpZiAoc2VsZi0+dHhfYnVm Zi5oZWFkKQorCQlrZnJlZShzZWxmLT50eF9idWZmLmhlYWQpOworCWlmIChzZWxmLT5yeF9idWZm LmhlYWQpCisJCWtmcmVlKHNlbGYtPnJ4X2J1ZmYuaGVhZCk7CisJZGV2X3NlbGZbc2VsZi0+aW5k ZXhdID0gTlVMTDsKKworCWZyZWVfbmV0ZGV2KHNlbGYtPm5ldGRldik7CisKKwlyZXR1cm4gMDsK K30KKworLyoKKyAqIEZ1bmN0aW9uIHZpYV9pcmNjX3NldHVwIChpbmZvKQorICoKKyAqICAgIFJl dHVybnMgbm9uLW5lZ2F0aXZlIG9uIHN1Y2Nlc3MuCisgKgorICovCitzdGF0aWMgaW50IHZpYV9p cmNjX3NldHVwKGNoaXBpb190ICogaW5mbywgdW5zaWduZWQgaW50IGNoaXBfaWQpCit7CisJaW50 IGlvYmFzZSA9IGluZm8tPmZpcl9iYXNlOworCisJU2V0TWF4UnhQYWNrZXRTaXplKGlvYmFzZSwg MHgwZmZmKTsJLy9zZXQgdG8gbWF4OjQwOTUKKwkvLyBGSUZPIEluaXQKKwlFblJYRklGT1JlYWR5 SW50KGlvYmFzZSwgT0ZGKTsKKwlFblJYRklGT0hhbGZMZXZlbEludChpb2Jhc2UsIE9GRik7CisJ RW5UWEZJRk9IYWxmTGV2ZWxJbnQoaW9iYXNlLCBPRkYpOworCUVuVFhGSUZPVW5kZXJydW5FT01J bnQoaW9iYXNlLCBPTik7CisJRW5UWEZJRk9SZWFkeUludChpb2Jhc2UsIE9GRik7CisJSW52ZXJ0 VFgoaW9iYXNlLCBPRkYpOworCUludmVydFJYKGlvYmFzZSwgT0ZGKTsKKwlpZiAoUmVhZExQQ1Jl ZygweDIwKSA9PSAweDNjKQorCQlXcml0ZUxQQ1JlZygweEYwLCAwKTsJLy8gZm9yIFZUMTIxMQor CWlmIChJc1NJUk9uKGlvYmFzZSkpIHsKKwkJU0lSRmlsdGVyKGlvYmFzZSwgT04pOworCQlTSVJS ZWN2QW55KGlvYmFzZSwgT04pOworCX0gZWxzZSB7CisJCVNJUkZpbHRlcihpb2Jhc2UsIE9GRik7 CisJCVNJUlJlY3ZBbnkoaW9iYXNlLCBPRkYpOworCX0KKwkvL0ludCBJbml0CisJRW5SWFNwZWNJ bnQoaW9iYXNlLCBPTik7CisJLy9ETUEgSW5pdCBMYXRlci4uLi4KKwlXcml0ZVJlZyhpb2Jhc2Us IElfU1RfQ1RfMCwgMHg4MCk7CisJRW5hYmxlRE1BKGlvYmFzZSwgT04pOworCisJcmV0dXJuIDA7 Cit9CisKKy8qCisgKiBGdW5jdGlvbiB2aWFfaXJjY19yZWFkX2RvbmdsZV9pZCAodm9pZCkKKyAq CisgKi8KK3N0YXRpYyBpbnQgdmlhX2lyY2NfcmVhZF9kb25nbGVfaWQoaW50IGlvYmFzZSkKK3sK KwlpbnQgZG9uZ2xlX2lkID0gOTsKKworCXJldHVybiBkb25nbGVfaWQ7Cit9CisKKy8qCisgKiBG dW5jdGlvbiB2aWFfaXJjY19jaGFuZ2VfZG9uZ2xlX3NwZWVkIChpb2Jhc2UsIHNwZWVkLCBkb25n bGVfaWQpCisgKiAgICBDaGFuZ2Ugc3BlZWQgb2YgdGhlIGF0dGFjaCBkb25nbGUKKyAqICAgIG9u bHkgaW1wbGVtZW50IHR3byB0eXBlIG9mIGRvbmdsZSBjdXJyZW50bHkuCisgKi8KK3N0YXRpYyB2 b2lkIHZpYV9pcmNjX2NoYW5nZV9kb25nbGVfc3BlZWQoaW50IGlvYmFzZSwgaW50IHNwZWVkLAor CQkJCQkgaW50IGRvbmdsZV9pZCkKK3sKKwl1OCBtb2RlID0gMDsKKworCVdyaXRlUmVnKGlvYmFz ZSwgSV9TVF9DVF8wLCAweDApOworCXN3aXRjaCAoZG9uZ2xlX2lkKSB7CS8vSFAxMTAwCisJY2Fz ZSAweDAwOgkJLyogc2FtZSBhcyAqLworCWNhc2UgMHgwMToJCS8qIERpZmZlcmVudGlhbCBzZXJp YWwgaW50ZXJmYWNlICovCisJCWJyZWFrOworCWNhc2UgMHgwMjoJCS8qIHNhbWUgYXMgKi8KKwlj YXNlIDB4MDM6CQkvKiBSZXNlcnZlZCAqLworCQlicmVhazsKKwljYXNlIDB4MDQ6CQkvKiBTaGFy cCBSWTVIRDAxICovCisJCWJyZWFrOworCWNhc2UgMHgwNToJCS8qIFJlc2VydmVkLCBidXQgdGhp cyBpcyB3aGF0IHRoZSBUaGlua3BhZCByZXBvcnRzICovCisJCWJyZWFrOworCWNhc2UgMHgwNjoJ CS8qIFNpbmdsZS1lbmRlZCBzZXJpYWwgaW50ZXJmYWNlICovCisJCWJyZWFrOworCWNhc2UgMHgw NzoJCS8qIENvbnN1bWVyLUlSIG9ubHkgKi8KKwkJYnJlYWs7CisKKwljYXNlIDB4MDg6CQkvKiBI UCBIU0RMLTIzMDAsIEhQIEhTREwtMzYwMC9IU0RMLTM2MTAgKi8KKwkJVXNlT25lUlgoaW9iYXNl LCBPTik7CS8vIHVzZSBvbmUgUlggcGluICAgUlgxLFJYMgorCQlJbnZlcnRUWChpb2Jhc2UsIE9G Rik7CisJCUludmVydFJYKGlvYmFzZSwgT0ZGKTsKKworCQlFblJYMihpb2Jhc2UsIE9OKTsJLy9z aXIgdG8gcngyCisJCUVuR1BJT3RvUlgyKGlvYmFzZSwgT0ZGKTsKKworCQlpZiAoSXNTSVJPbihp b2Jhc2UpKSB7CS8vc2lyCisJCQkvLyBNb2RlIHNlbGVjdCBPZmYKKwkJCVNsb3dJUlJYTG93QWN0 aXZlKGlvYmFzZSwgT04pOworCQkJdWRlbGF5KDEwMDApOworCQkJU2xvd0lSUlhMb3dBY3RpdmUo aW9iYXNlLCBPRkYpOworCQl9IGVsc2UgeworCQkJaWYgKElzTUlST24oaW9iYXNlKSkgewkvL21p cgorCQkJCS8vIE1vZGUgc2VsZWN0IE9uCisJCQkJU2xvd0lSUlhMb3dBY3RpdmUoaW9iYXNlLCBP RkYpOworCQkJCXVkZWxheSgyMCk7CisJCQl9IGVsc2UgewkvLyBmaXIKKwkJCQlpZiAoSXNGSVJP bihpb2Jhc2UpKSB7CS8vZmlyCisJCQkJCS8vIE1vZGUgc2VsZWN0IE9uCisJCQkJCVNsb3dJUlJY TG93QWN0aXZlKGlvYmFzZSwgT0ZGKTsKKwkJCQkJdWRlbGF5KDIwKTsKKwkJCQl9CisJCQl9CisJ CX0KKwkJYnJlYWs7CisJY2FzZSAweDA5OgkJLyogSUJNMzFUMTEwMCBvciBUZW1pYyBURkRTNjAw MC9URkRTNjUwMCAqLworCQlVc2VPbmVSWChpb2Jhc2UsIE9OKTsJLy91c2UgT05FIFJYLi4uLlJY MQorCQlJbnZlcnRUWChpb2Jhc2UsIE9GRik7CisJCUludmVydFJYKGlvYmFzZSwgT0ZGKTsJLy8g aW52ZXJ0IFJYIHBpbgorCQlFblJYMihpb2Jhc2UsIE9OKTsKKwkJRW5HUElPdG9SWDIoaW9iYXNl LCBPRkYpOworCQlpZiAoSXNTSVJPbihpb2Jhc2UpKSB7CS8vc2lyCisJCQkvLyBNb2RlIHNlbGVj dCBPbgorCQkJU2xvd0lSUlhMb3dBY3RpdmUoaW9iYXNlLCBPTik7CisJCQl1ZGVsYXkoMjApOwor CQkJLy8gTW9kZSBzZWxlY3QgT2ZmCisJCQlTbG93SVJSWExvd0FjdGl2ZShpb2Jhc2UsIE9GRik7 CisJCX0KKwkJaWYgKElzTUlST24oaW9iYXNlKSkgewkvL21pcgorCQkJLy8gTW9kZSBzZWxlY3Qg T24KKwkJCVNsb3dJUlJYTG93QWN0aXZlKGlvYmFzZSwgT0ZGKTsKKwkJCXVkZWxheSgyMCk7CisJ CQkvLyBNb2RlIHNlbGVjdCBPZmYKKwkJCVNsb3dJUlJYTG93QWN0aXZlKGlvYmFzZSwgT04pOwor CQl9IGVsc2UgewkvLyBmaXIKKwkJCWlmIChJc0ZJUk9uKGlvYmFzZSkpIHsJLy9maXIKKwkJCQkv LyBNb2RlIHNlbGVjdCBPbgorCQkJCVNsb3dJUlJYTG93QWN0aXZlKGlvYmFzZSwgT0ZGKTsKKwkJ CQkvLyBUWCBPbgorCQkJCVdyaXRlVFgoaW9iYXNlLCBPTik7CisJCQkJdWRlbGF5KDIwKTsKKwkJ CQkvLyBNb2RlIHNlbGVjdCBPRkYKKwkJCQlTbG93SVJSWExvd0FjdGl2ZShpb2Jhc2UsIE9OKTsK KwkJCQl1ZGVsYXkoMjApOworCQkJCS8vIFRYIE9mZgorCQkJCVdyaXRlVFgoaW9iYXNlLCBPRkYp OworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgMHgwZDoKKwkJVXNlT25lUlgoaW9iYXNlLCBP RkYpOwkvLyB1c2UgdHdvIFJYIHBpbiAgIFJYMSxSWDIKKwkJSW52ZXJ0VFgoaW9iYXNlLCBPRkYp OworCQlJbnZlcnRSWChpb2Jhc2UsIE9GRik7CisJCVNsb3dJUlJYTG93QWN0aXZlKGlvYmFzZSwg T0ZGKTsKKwkJaWYgKElzU0lST24oaW9iYXNlKSkgewkvL3NpcgorCQkJRW5HUElPdG9SWDIoaW9i YXNlLCBPRkYpOworCQkJV3JpdGVHSU8oaW9iYXNlLCBPRkYpOworCQkJRW5SWDIoaW9iYXNlLCBP RkYpOwkvL3NpciB0byByeDIKKwkJfSBlbHNlIHsJLy8gZmlyIG1pcgorCQkJRW5HUElPdG9SWDIo aW9iYXNlLCBPRkYpOworCQkJV3JpdGVHSU8oaW9iYXNlLCBPRkYpOworCQkJRW5SWDIoaW9iYXNl LCBPRkYpOwkvL2ZpciB0byByeAorCQl9CisJCWJyZWFrOworCWNhc2UgMHgwZmY6CQkvKiBWaXNo YXkgKi8KKwkJaWYgKElzU0lST24oaW9iYXNlKSkKKwkJCW1vZGUgPSAwOworCQllbHNlIGlmIChJ c01JUk9uKGlvYmFzZSkpCisJCQltb2RlID0gMTsKKwkJZWxzZSBpZiAoSXNGSVJPbihpb2Jhc2Up KQorCQkJbW9kZSA9IDI7CisJCWVsc2UgaWYgKElzVkZJUk9uKGlvYmFzZSkpCisJCQltb2RlID0g NTsJLy9WRklSLTE2CisJCVNJX1NldE1vZGUoaW9iYXNlLCBtb2RlKTsKKwl9CisJV3JpdGVSZWco aW9iYXNlLCBJX1NUX0NUXzAsIDB4ODApOworCit9CisKKy8qCisgKiBGdW5jdGlvbiB2aWFfaXJj Y19jaGFuZ2Vfc3BlZWQgKHNlbGYsIGJhdWQpCisgKgorICogICAgQ2hhbmdlIHRoZSBzcGVlZCBv ZiB0aGUgZGV2aWNlCisgKgorICovCitzdGF0aWMgdm9pZCB2aWFfaXJjY19jaGFuZ2Vfc3BlZWQo c3RydWN0IHZpYV9pcmNjX2NiICpzZWxmLCBfX3UzMiBzcGVlZCkKK3sKKwlzdHJ1Y3QgbmV0X2Rl dmljZSAqZGV2ID0gc2VsZi0+bmV0ZGV2OworCXUxNiBpb2Jhc2U7CisJdTggdmFsdWUgPSAwLCBi VG1wOworCisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisJLyogVXBkYXRlIGFjY291bnRp bmcgZm9yIG5ldyBzcGVlZCAqLworCXNlbGYtPmlvLnNwZWVkID0gc3BlZWQ7CisjaWZkZWYJREJH TVNHCisJREJHKHByaW50ayhLRVJOX0lORk8gImNoYW5nZV9zcGVlZCA9JXguLi4uLi5cbiIsIHNw ZWVkKSk7CisjZW5kaWYKKworI2lmZGVmCURCR19JTworCWlmIChzZWxmLT5pby5zcGVlZCA+IDB4 MjU4MCkKKwkJb3V0YigweGFhLCAweDkwKTsKKwllbHNlCisJCW91dGIoMHhiYiwgMHg5MCk7Cisj ZW5kaWYKKworCisJLyogQ29udHJvbGxlciBtb2RlIHNlbGxlY3Rpb24gKi8KKwlzd2l0Y2ggKHNw ZWVkKSB7CisJY2FzZSA5NjAwOgorCQl2YWx1ZSA9IDExOworCQlTZXRTSVIoaW9iYXNlLCBPTik7 CisJCUNSQzE2KGlvYmFzZSwgT04pOworCQlicmVhazsKKwljYXNlIDE5MjAwOgorCQl2YWx1ZSA9 IDU7CisJCVNldFNJUihpb2Jhc2UsIE9OKTsKKwkJQ1JDMTYoaW9iYXNlLCBPTik7CisJCWJyZWFr OworCWNhc2UgMzg0MDA6CisJCXZhbHVlID0gMjsKKwkJU2V0U0lSKGlvYmFzZSwgT04pOworCQlD UkMxNihpb2Jhc2UsIE9OKTsKKwkJYnJlYWs7CisJY2FzZSA1NzYwMDoKKwkJdmFsdWUgPSAxOwor CQlTZXRTSVIoaW9iYXNlLCBPTik7CisJCUNSQzE2KGlvYmFzZSwgT04pOworCQlicmVhazsKKwlj YXNlIDExNTIwMDoKKwkJdmFsdWUgPSAwOworCQlTZXRTSVIoaW9iYXNlLCBPTik7CisJCUNSQzE2 KGlvYmFzZSwgT04pOworCQlicmVhazsKKwljYXNlIDU3NjAwMDoKKwkJdmFsdWUgPSAwOworCQlT ZXRTSVIoaW9iYXNlLCBPTik7CisJCUNSQzE2KGlvYmFzZSwgT04pOworCQlicmVhazsKKwljYXNl IDExNTIwMDA6CisJCXZhbHVlID0gMDsKKwkJU2V0TUlSKGlvYmFzZSwgT04pOworCQlicmVhazsK KwljYXNlIDQwMDAwMDA6CisJCXZhbHVlID0gMDsKKwkJU2V0RklSKGlvYmFzZSwgT04pOworCQlT ZXRQdWxzZVdpZHRoKGlvYmFzZSwgMCk7CisJCVNldFNlbmRQcmVhbWJsZUNvdW50KGlvYmFzZSwg MTQpOworCQlDUkMxNihpb2Jhc2UsIE9GRik7CisJCUVuVFhDUkMoaW9iYXNlLCBPTik7CisJCWJy ZWFrOworCWNhc2UgMTYwMDAwMDA6CisJCXZhbHVlID0gMDsKKwkJU2V0VkZJUihpb2Jhc2UsIE9O KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdmFsdWUgPSAwOworCQlicmVhazsKKwl9CisJLyog U2V0IGJhdWRyYXRlIHRvIDB4MTlbMi4uN10gKi8KKwliVG1wID0gKFJlYWRSZWcoaW9iYXNlLCBJ X0NGX0hfMSkgJiAweDAzKTsKKwliVG1wID0gYlRtcCB8ICh2YWx1ZSA8PCAyKTsKKwlXcml0ZVJl Zyhpb2Jhc2UsIElfQ0ZfSF8xLCBiVG1wKTsKKwl2aWFfaXJjY19jaGFuZ2VfZG9uZ2xlX3NwZWVk KGlvYmFzZSwgc3BlZWQsIHNlbGYtPmlvLmRvbmdsZV9pZCk7CisvLyBFblRYRklGT0hhbGZMZXZl bEludChpb2Jhc2UsT04pOworCS8qIFNldCBGSUZPIHNpemUgdG8gNjQgKi8KKwlTZXRGSUZPKGlv YmFzZSwgNjQpOworCS8qIEVuYWJsZSBzb21lIGludGVycnVwdHMgc28gd2UgY2FuIHJlY2VpdmUg ZnJhbWVzICovCisJLy9FbkFsbEludChpb2Jhc2UsT04pOworCisJaWYgKElzU0lST24oaW9iYXNl KSkgeworCQlTSVJGaWx0ZXIoaW9iYXNlLCBPTik7CisJCVNJUlJlY3ZBbnkoaW9iYXNlLCBPTik7 CisJfSBlbHNlIHsKKwkJU0lSRmlsdGVyKGlvYmFzZSwgT0ZGKTsKKwkJU0lSUmVjdkFueShpb2Jh c2UsIE9GRik7CisJfQorCWlmIChzcGVlZCA+IDExNTIwMCkgeworCQkvKiBJbnN0YWxsIEZJUiB4 bWl0IGhhbmRsZXIgKi8KKwkJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSB2aWFfaXJjY19oYXJkX3ht aXRfZmlyOworCQl2aWFfaXJjY19kbWFfcmVjZWl2ZShzZWxmKTsKKwl9IGVsc2UgeworCQkvKiBJ bnN0YWxsIFNJUiB4bWl0IGhhbmRsZXIgKi8KKwkJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSB2aWFf aXJjY19oYXJkX3htaXRfc2lyOworCX0KKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKy8q CisgKiBGdW5jdGlvbiB2aWFfaXJjY19oYXJkX3htaXQgKHNrYiwgZGV2KQorICoKKyAqICAgIFRy YW5zbWl0IHRoZSBmcmFtZSEKKyAqCisgKi8KK3N0YXRpYyBpbnQgdmlhX2lyY2NfaGFyZF94bWl0 X3NpcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikK K3sKKwlzdHJ1Y3QgdmlhX2lyY2NfY2IgKnNlbGY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1 MTYgaW9iYXNlOworCV9fdTMyIHNwZWVkOworCisJc2VsZiA9IChzdHJ1Y3QgdmlhX2lyY2NfY2Ig KikgZGV2LT5wcml2OworCUFTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAwOyk7CisJaW9iYXNl ID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJLyogQ2hl Y2sgaWYgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIHNwZWVkICovCisJc3BlZWQgPSBpcmRhX2dldF9u ZXh0X3NwZWVkKHNrYik7CisJaWYgKChzcGVlZCAhPSBzZWxmLT5pby5zcGVlZCkgJiYgKHNwZWVk ICE9IC0xKSkgeworCQkvKiBDaGVjayBmb3IgZW1wdHkgZnJhbWUgKi8KKwkJaWYgKCFza2ItPmxl bikgeworCQkJdmlhX2lyY2NfY2hhbmdlX3NwZWVkKHNlbGYsIHNwZWVkKTsKKwkJCWRldi0+dHJh bnNfc3RhcnQgPSBqaWZmaWVzOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJcmV0dXJuIDA7 CisJCX0gZWxzZQorCQkJc2VsZi0+bmV3X3NwZWVkID0gc3BlZWQ7CisJfQorCUluaXRDYXJkKGlv YmFzZSk7CisJQ29tbW9uSW5pdChpb2Jhc2UpOworCVNJUkZpbHRlcihpb2Jhc2UsIE9OKTsKKwlT ZXRTSVIoaW9iYXNlLCBPTik7CisJQ1JDMTYoaW9iYXNlLCBPTik7CisJRW5UWENSQyhpb2Jhc2Us IDApOworCVdyaXRlUmVnKGlvYmFzZSwgSV9TVF9DVF8wLCAweDAwKTsKKworCXNwaW5fbG9ja19p cnFzYXZlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJc2VsZi0+dHhfYnVmZi5kYXRhID0gc2VsZi0+ dHhfYnVmZi5oZWFkOworCXNlbGYtPnR4X2J1ZmYubGVuID0KKwkgICAgYXN5bmNfd3JhcF9za2Io c2tiLCBzZWxmLT50eF9idWZmLmRhdGEsCisJCQkgICBzZWxmLT50eF9idWZmLnRydWVzaXplKTsK KworCXNlbGYtPnN0YXRzLnR4X2J5dGVzICs9IHNlbGYtPnR4X2J1ZmYubGVuOworCVNldEJhdWRS YXRlKGlvYmFzZSwgc3BlZWQpOworCVNldFB1bHNlV2lkdGgoaW9iYXNlLCAxMik7CisJU2V0U2Vu ZFByZWFtYmxlQ291bnQoaW9iYXNlLCAwKTsKKwlXcml0ZVJlZyhpb2Jhc2UsIElfU1RfQ1RfMCwg MHg4MCk7CisKKwlFbmFibGVUWChpb2Jhc2UsIE9OKTsKKwlFbmFibGVSWChpb2Jhc2UsIE9GRik7 CisKKwlSZXNldENoaXAoaW9iYXNlLCAwKTsKKwlSZXNldENoaXAoaW9iYXNlLCAxKTsKKwlSZXNl dENoaXAoaW9iYXNlLCAyKTsKKwlSZXNldENoaXAoaW9iYXNlLCAzKTsKKwlSZXNldENoaXAoaW9i YXNlLCA0KTsKKworCUVuQWxsSW50KGlvYmFzZSwgT04pOworCUVuVFhETUEoaW9iYXNlLCBPTik7 CisJRW5SWERNQShpb2Jhc2UsIE9GRik7CisKKwlzZXR1cF9kbWEoc2VsZi0+aW8uZG1hLCBzZWxm LT50eF9idWZmLmRhdGEsIHNlbGYtPnR4X2J1ZmYubGVuLAorCQkgIERNQV9UWF9NT0RFKTsKKwor CVNldFNlbmRCeXRlKGlvYmFzZSwgc2VsZi0+dHhfYnVmZi5sZW4pOworCVJYU3RhcnQoaW9iYXNl LCBPRkYpOworCVRYU3RhcnQoaW9iYXNlLCBPTik7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlm ZmllczsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJZGV2 X2tmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpYV9pcmNjX2hh cmRfeG1pdF9maXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgIHN0cnVjdCBuZXRfZGV2aWNl ICpkZXYpCit7CisJc3RydWN0IHZpYV9pcmNjX2NiICpzZWxmOworCXUxNiBpb2Jhc2U7CisJX191 MzIgc3BlZWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNlbGYgPSAoc3RydWN0IHZpYV9p cmNjX2NiICopIGRldi0+cHJpdjsKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKworCWlm IChzZWxmLT5zdF9maWZvLmxlbikKKwkJcmV0dXJuIDA7CisJaWYgKHNlbGYtPmNoaXBfaWQgPT0g MHgzMDc2KQorCQlpb2RlbGF5KDE1MDApOworCWVsc2UKKwkJdWRlbGF5KDE1MDApOworCW5ldGlm X3N0b3BfcXVldWUoZGV2KTsKKwlzcGVlZCA9IGlyZGFfZ2V0X25leHRfc3BlZWQoc2tiKTsKKwlp ZiAoKHNwZWVkICE9IHNlbGYtPmlvLnNwZWVkKSAmJiAoc3BlZWQgIT0gLTEpKSB7CisJCWlmICgh c2tiLT5sZW4pIHsKKwkJCXZpYV9pcmNjX2NoYW5nZV9zcGVlZChzZWxmLCBzcGVlZCk7CisJCQlk ZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCXJl dHVybiAwOworCQl9IGVsc2UKKwkJCXNlbGYtPm5ld19zcGVlZCA9IHNwZWVkOworCX0KKwlzcGlu X2xvY2tfaXJxc2F2ZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCXNlbGYtPnR4X2ZpZm8ucXVldWVb c2VsZi0+dHhfZmlmby5mcmVlXS5zdGFydCA9IHNlbGYtPnR4X2ZpZm8udGFpbDsKKwlzZWxmLT50 eF9maWZvLnF1ZXVlW3NlbGYtPnR4X2ZpZm8uZnJlZV0ubGVuID0gc2tiLT5sZW47CisKKwlzZWxm LT50eF9maWZvLnRhaWwgKz0gc2tiLT5sZW47CisJc2VsZi0+c3RhdHMudHhfYnl0ZXMgKz0gc2ti LT5sZW47CisJbWVtY3B5KHNlbGYtPnR4X2ZpZm8ucXVldWVbc2VsZi0+dHhfZmlmby5mcmVlXS5z dGFydCwgc2tiLT5kYXRhLAorCSAgICAgICBza2ItPmxlbik7CisJc2VsZi0+dHhfZmlmby5sZW4r KzsKKwlzZWxmLT50eF9maWZvLmZyZWUrKzsKKy8vRjAxICAgaWYgKHNlbGYtPnR4X2ZpZm8ubGVu ID09IDEpIHsKKwl2aWFfaXJjY19kbWFfeG1pdChzZWxmLCBpb2Jhc2UpOworLy9GMDEgICB9Cisv L0YwMSAgIGlmIChzZWxmLT50eF9maWZvLmZyZWUgPCAoTUFYX1RYX1dJTkRPVyAtMSApKSBuZXRp Zl93YWtlX3F1ZXVlKHNlbGYtPm5ldGRldik7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7 CisJZGV2X2tmcmVlX3NrYihza2IpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxv Y2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50IHZpYV9pcmNjX2RtYV94 bWl0KHN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZiwgdTE2IGlvYmFzZSkKK3sKKy8vICAgICAgaW50 IGk7CisvLyAgICAgIHU4ICpjaDsKKworCUVuVFhETUEoaW9iYXNlLCBPRkYpOworCXNlbGYtPmlv LmRpcmVjdGlvbiA9IElPX1hNSVQ7CisJRW5QaHlzKGlvYmFzZSwgT04pOworCUVuYWJsZVRYKGlv YmFzZSwgT04pOworCUVuYWJsZVJYKGlvYmFzZSwgT0ZGKTsKKwlSZXNldENoaXAoaW9iYXNlLCAw KTsKKwlSZXNldENoaXAoaW9iYXNlLCAxKTsKKwlSZXNldENoaXAoaW9iYXNlLCAyKTsKKwlSZXNl dENoaXAoaW9iYXNlLCAzKTsKKwlSZXNldENoaXAoaW9iYXNlLCA0KTsKKwlFbkFsbEludChpb2Jh c2UsIE9OKTsKKwlFblRYRE1BKGlvYmFzZSwgT04pOworCUVuUlhETUEoaW9iYXNlLCBPRkYpOwor CXNldHVwX2RtYShzZWxmLT5pby5kbWEsCisJCSAgc2VsZi0+dHhfZmlmby5xdWV1ZVtzZWxmLT50 eF9maWZvLnB0cl0uc3RhcnQsCisJCSAgc2VsZi0+dHhfZmlmby5xdWV1ZVtzZWxmLT50eF9maWZv LnB0cl0ubGVuLCBETUFfVFhfTU9ERSk7CisjaWZkZWYJREJHTVNHCisJREJHKHByaW50aworCSAg ICAoS0VSTl9JTkZPICJkbWFfeG1pdDp0eF9maWZvLnB0cj0leCxsZW49JXgsdHhfZmlmby5sZW49 JXguLlxuIiwKKwkgICAgIHNlbGYtPnR4X2ZpZm8ucHRyLCBzZWxmLT50eF9maWZvLnF1ZXVlW3Nl bGYtPnR4X2ZpZm8ucHRyXS5sZW4sCisJICAgICBzZWxmLT50eF9maWZvLmxlbikpOworLyogICAK KwljaCA9IHNlbGYtPnR4X2ZpZm8ucXVldWVbc2VsZi0+dHhfZmlmby5wdHJdLnN0YXJ0OworCWZv cihpPTAgOyBpIDwgc2VsZi0+dHhfZmlmby5xdWV1ZVtzZWxmLT50eF9maWZvLnB0cl0ubGVuIDsg aSsrKSB7CisJICAgIERCRyhwcmludGsoS0VSTl9JTkZPICIleC4uXG4iLGNoW2ldKSk7CisJfQor Ki8KKyNlbmRpZgorCisJU2V0U2VuZEJ5dGUoaW9iYXNlLCBzZWxmLT50eF9maWZvLnF1ZXVlW3Nl bGYtPnR4X2ZpZm8ucHRyXS5sZW4pOworCVJYU3RhcnQoaW9iYXNlLCBPRkYpOworCVRYU3RhcnQo aW9iYXNlLCBPTik7CisJcmV0dXJuIDA7CisKK30KKworLyoKKyAqIEZ1bmN0aW9uIHZpYV9pcmNj X2RtYV94bWl0X2NvbXBsZXRlIChzZWxmKQorICoKKyAqICAgIFRoZSB0cmFuc2ZlciBvZiBhIGZy YW1lIGluIGZpbmlzaGVkLiBUaGlzIGZ1bmN0aW9uIHdpbGwgb25seSBiZSBjYWxsZWQgCisgKiAg ICBieSB0aGUgaW50ZXJydXB0IGhhbmRsZXIKKyAqCisgKi8KK3N0YXRpYyBpbnQgdmlhX2lyY2Nf ZG1hX3htaXRfY29tcGxldGUoc3RydWN0IHZpYV9pcmNjX2NiICpzZWxmKQoreworCWludCBpb2Jh c2U7CisJaW50IHJldCA9IFRSVUU7CisJdTggVHhfc3RhdHVzOworCisJSVJEQV9ERUJVRygyLCAi JXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKwkv KiBEaXNhYmxlIERNQSAqLworLy8gICAgICBEaXNhYmxlRG1hQ2hhbm5lbChzZWxmLT5pby5kbWEp OworCS8qIENoZWNrIGZvciB1bmRlcnJydW4hICovCisJLyogQ2xlYXIgYml0LCBieSB3cml0aW5n IDEgaW50byBpdCAqLworCVR4X3N0YXR1cyA9IEdldFRYU3RhdHVzKGlvYmFzZSk7CisJaWYgKFR4 X3N0YXR1cyAmIDB4MDgpIHsKKwkJc2VsZi0+c3RhdHMudHhfZXJyb3JzKys7CisJCXNlbGYtPnN0 YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCWh3cmVzZXQoc2VsZik7CisvLyBob3cgdG8gY2xlYXIg dW5kZXJycnVuID8KKwl9IGVsc2UgeworCQlzZWxmLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCVJl c2V0Q2hpcChpb2Jhc2UsIDMpOworCQlSZXNldENoaXAoaW9iYXNlLCA0KTsKKwl9CisJLyogQ2hl Y2sgaWYgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIHNwZWVkICovCisJaWYgKHNlbGYtPm5ld19zcGVl ZCkgeworCQl2aWFfaXJjY19jaGFuZ2Vfc3BlZWQoc2VsZiwgc2VsZi0+bmV3X3NwZWVkKTsKKwkJ c2VsZi0+bmV3X3NwZWVkID0gMDsKKwl9CisKKwkvKiBGaW5pc2hlZCB3aXRoIHRoaXMgZnJhbWUs IHNvIHByZXBhcmUgZm9yIG5leHQgKi8KKwlpZiAoSXNGSVJPbihpb2Jhc2UpKSB7CisJCWlmIChz ZWxmLT50eF9maWZvLmxlbikgeworCQkJc2VsZi0+dHhfZmlmby5sZW4tLTsKKwkJCXNlbGYtPnR4 X2ZpZm8ucHRyKys7CisJCX0KKwl9CisjaWZkZWYJREJHTVNHCisJREJHKHByaW50aworCSAgICAo S0VSTl9JTkZPCisJICAgICAidmlhX2lyY2NfZG1hX3htaXRfY29tcGxldGU6dHhfZmlmby5sZW49 JXggLHR4X2ZpZm8ucHRyPSV4LHR4X2ZpZm8uZnJlZT0leC4uLlxuIiwKKwkgICAgIHNlbGYtPnR4 X2ZpZm8ubGVuLCBzZWxmLT50eF9maWZvLnB0ciwgc2VsZi0+dHhfZmlmby5mcmVlKSk7CisjZW5k aWYKKy8qIEYwMV9TCisJLy8gQW55IGZyYW1lcyB0byBiZSBzZW50IGJhY2stdG8tYmFjaz8gCisJ aWYgKHNlbGYtPnR4X2ZpZm8ubGVuKSB7CisJCS8vIE5vdCBmaW5pc2hlZCB5ZXQhIAorCSAgCXZp YV9pcmNjX2RtYV94bWl0KHNlbGYsIGlvYmFzZSk7CisJCXJldCA9IEZBTFNFOworCX0gZWxzZSB7 IAorRjAxX0UqLworCS8vIFJlc2V0IFR4IEZJRk8gaW5mbyAKKwlzZWxmLT50eF9maWZvLmxlbiA9 IHNlbGYtPnR4X2ZpZm8ucHRyID0gc2VsZi0+dHhfZmlmby5mcmVlID0gMDsKKwlzZWxmLT50eF9m aWZvLnRhaWwgPSBzZWxmLT50eF9idWZmLmhlYWQ7CisvL0YwMSAgIH0KKworCS8vIE1ha2Ugc3Vy ZSB3ZSBoYXZlIHJvb20gZm9yIG1vcmUgZnJhbWVzIAorLy9GMDEgICBpZiAoc2VsZi0+dHhfZmlm by5mcmVlIDwgKE1BWF9UWF9XSU5ET1cgLTEgKSkgeworCS8vIE5vdCBidXN5IHRyYW5zbWl0dGlu ZyBhbnltb3JlIAorCS8vIFRlbGwgdGhlIG5ldHdvcmsgbGF5ZXIsIHRoYXQgd2UgY2FuIGFjY2Vw dCBtb3JlIGZyYW1lcyAKKwluZXRpZl93YWtlX3F1ZXVlKHNlbGYtPm5ldGRldik7CisvL0YwMSAg IH0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gdmlhX2lyY2NfZG1hX3JlY2Vp dmUgKHNlbGYpCisgKgorICogICAgU2V0IGNvbmZpZ3VyYXRpb24gZm9yIHJlY2VpdmUgYSBmcmFt ZS4KKyAqCisgKi8KK3N0YXRpYyBpbnQgdmlhX2lyY2NfZG1hX3JlY2VpdmUoc3RydWN0IHZpYV9p cmNjX2NiICpzZWxmKQoreworCWludCBpb2Jhc2U7CisKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJf YmFzZTsKKworCXNlbGYtPnR4X2ZpZm8ubGVuID0gc2VsZi0+dHhfZmlmby5wdHIgPSBzZWxmLT50 eF9maWZvLmZyZWUgPSAwOworCXNlbGYtPnR4X2ZpZm8udGFpbCA9IHNlbGYtPnR4X2J1ZmYuaGVh ZDsKKwlzZWxmLT5SeERhdGFSZWFkeSA9IDA7CisJc2VsZi0+aW8uZGlyZWN0aW9uID0gSU9fUkVD VjsKKwlzZWxmLT5yeF9idWZmLmRhdGEgPSBzZWxmLT5yeF9idWZmLmhlYWQ7CisJc2VsZi0+c3Rf Zmlmby5sZW4gPSBzZWxmLT5zdF9maWZvLnBlbmRpbmdfYnl0ZXMgPSAwOworCXNlbGYtPnN0X2Zp Zm8udGFpbCA9IHNlbGYtPnN0X2ZpZm8uaGVhZCA9IDA7CisJRW5QaHlzKGlvYmFzZSwgT04pOwor CUVuYWJsZVRYKGlvYmFzZSwgT0ZGKTsKKwlFbmFibGVSWChpb2Jhc2UsIE9OKTsKKworCVJlc2V0 Q2hpcChpb2Jhc2UsIDApOworCVJlc2V0Q2hpcChpb2Jhc2UsIDEpOworCVJlc2V0Q2hpcChpb2Jh c2UsIDIpOworCVJlc2V0Q2hpcChpb2Jhc2UsIDMpOworCVJlc2V0Q2hpcChpb2Jhc2UsIDQpOwor CisJRW5BbGxJbnQoaW9iYXNlLCBPTik7CisJRW5UWERNQShpb2Jhc2UsIE9GRik7CisJRW5SWERN QShpb2Jhc2UsIE9OKTsKKwlzZXR1cF9kbWEoc2VsZi0+aW8uZG1hMiwgc2VsZi0+cnhfYnVmZi5k YXRhLAorCQkgIHNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUsIERNQV9SWF9NT0RFKTsKKwlUWFN0YXJ0 KGlvYmFzZSwgT0ZGKTsKKwlSWFN0YXJ0KGlvYmFzZSwgT04pOworCisJcmV0dXJuIDA7Cit9CisK Ky8qCisgKiBGdW5jdGlvbiB2aWFfaXJjY19kbWFfcmVjZWl2ZV9jb21wbGV0ZSAoc2VsZikKKyAq CisgKiAgICBDb250cm9sbGVyIEZpbmlzaGVkIHdpdGggcmVjZWl2aW5nIGZyYW1lcywKKyAqICAg IGFuZCB0aGlzIHJvdXRpbmUgaXMgY2FsbCBieSBJU1IKKyAqICAgIAorICovCitzdGF0aWMgaW50 IHZpYV9pcmNjX2RtYV9yZWNlaXZlX2NvbXBsZXRlKHN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZiwK KwkJCQkJIGludCBpb2Jhc2UpCit7CisJc3RydWN0IHN0X2ZpZm8gKnN0X2ZpZm87CisJc3RydWN0 IHNrX2J1ZmYgKnNrYjsKKwlpbnQgbGVuLCBpOworCXU4IHN0YXR1cyA9IDA7CisKKwlpb2Jhc2Ug PSBzZWxmLT5pby5maXJfYmFzZTsKKwlzdF9maWZvID0gJnNlbGYtPnN0X2ZpZm87CisKKwlpZiAo c2VsZi0+aW8uc3BlZWQgPCA0MDAwMDAwKSB7CS8vU3BlZWQgYmVsb3cgRklSCisJCWxlbiA9IEdl dFJlY3ZCeXRlKGlvYmFzZSwgc2VsZik7CisJCXNrYiA9IGRldl9hbGxvY19za2IobGVuICsgMSk7 CisJCWlmIChza2IgPT0gTlVMTCkKKwkJCXJldHVybiBGQUxTRTsKKwkJLy8gTWFrZSBzdXJlIElQ IGhlYWRlciBnZXRzIGFsaWduZWQgCisJCXNrYl9yZXNlcnZlKHNrYiwgMSk7CisJCXNrYl9wdXQo c2tiLCBsZW4gLSAyKTsKKwkJaWYgKHNlbGYtPmNoaXBfaWQgPT0gMHgzMDc2KSB7CisJCQlmb3Ig KGkgPSAwOyBpIDwgbGVuIC0gMjsgaSsrKQorCQkJCXNrYi0+ZGF0YVtpXSA9IHNlbGYtPnJ4X2J1 ZmYuZGF0YVtpICogMl07CisJCX0gZWxzZSB7CisJCQlpZiAoc2VsZi0+Y2hpcF9pZCA9PSAweDMw OTYpIHsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgbGVuIC0gMjsgaSsrKQorCQkJCQlza2ItPmRhdGFb aV0gPQorCQkJCQkgICAgc2VsZi0+cnhfYnVmZi5kYXRhW2ldOworCQkJfQorCQl9CisJCS8vIE1v dmUgdG8gbmV4dCBmcmFtZSAKKwkJc2VsZi0+cnhfYnVmZi5kYXRhICs9IGxlbjsKKwkJc2VsZi0+ c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCQlzZWxmLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCXNr Yi0+ZGV2ID0gc2VsZi0+bmV0ZGV2OworCQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJCXNr Yi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUkRBKTsKKwkJbmV0aWZfcngoc2tiKTsKKwkJcmV0 dXJuIFRSVUU7CisJfQorCisJZWxzZSB7CQkJLy9GSVIgbW9kZQorCQlsZW4gPSBHZXRSZWN2Qnl0 ZShpb2Jhc2UsIHNlbGYpOworCQlpZiAobGVuID09IDApCisJCQlyZXR1cm4gVFJVRTsJLy9pbnRl cnJ1cHQgb25seSwgZGF0YSBtYXliZSBtb3ZlIGJ5IFJ4VCAgCisJCWlmICgoKGxlbiAtIDQpIDwg MikgfHwgKChsZW4gLSA0KSA+IDIwNDgpKSB7CisjaWZkZWYJREJHTVNHCisJCQlEQkcocHJpbnRr CisJCQkgICAgKEtFUk5fSU5GTworCQkJICAgICAicmVjZWl2ZV9jb21wbGU6VHJvdWJsZTpsZW49 JXgsQ3VyQ291bnQ9JXgsTGFzdENvdW50PSV4Li5cbiIsCisJCQkgICAgIGxlbiwgUnhDdXJDb3Vu dChpb2Jhc2UsIHNlbGYpLAorCQkJICAgICBzZWxmLT5SeExhc3RDb3VudCkpOworI2VuZGlmCisJ CQlod3Jlc2V0KHNlbGYpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisjaWZkZWYJREJHTVNHCisJ CURCRyhwcmludGsKKwkJICAgIChLRVJOX0lORk8KKwkJICAgICAicmVjdl9jb21wbGU6Zmlmby5s ZW49JXgsbGVuPSV4LEN1ckNvdW50PSV4Li5cbiIsCisJCSAgICAgc3RfZmlmby0+bGVuLCBsZW4g LSA0LCBSeEN1ckNvdW50KGlvYmFzZSwgc2VsZikpKTsKKyNlbmRpZgorCQlzdF9maWZvLT5lbnRy aWVzW3N0X2ZpZm8tPnRhaWxdLnN0YXR1cyA9IHN0YXR1czsKKwkJc3RfZmlmby0+ZW50cmllc1tz dF9maWZvLT50YWlsXS5sZW4gPSBsZW47CisJCXN0X2ZpZm8tPnBlbmRpbmdfYnl0ZXMgKz0gbGVu OworCQlzdF9maWZvLT50YWlsKys7CisJCXN0X2ZpZm8tPmxlbisrOworCQlpZiAoc3RfZmlmby0+ dGFpbCA+IE1BWF9SWF9XSU5ET1cpCisJCQlzdF9maWZvLT50YWlsID0gMDsKKwkJc2VsZi0+UnhE YXRhUmVhZHkgPSAwOworCisJCS8vIEl0IG1heWJlIGhhdmUgTUFYX1JYX1dJTkRPVyBwYWNrYWdl IHJlY2VpdmUgYnkKKwkJLy8gcmVjZWl2ZV9jb21wbGV0ZSBiZWZvcmUgVGltZXIgSVJRCisvKiBG MDFfUworICAgICAgICAgIGlmIChzdF9maWZvLT5sZW4gPCAoTUFYX1JYX1dJTkRPVysyICkpIHsg CisJCSAgUlhTdGFydChpb2Jhc2UsT04pOworCSAgCSAgU2V0VGltZXIoaW9iYXNlLDQpOworCSAg fQorCSAgZWxzZQkgIHsgCitGMDFfRSAqLworCQlFbmFibGVSWChpb2Jhc2UsIE9GRik7CisJCUVu UlhETUEoaW9iYXNlLCBPRkYpOworCQlSWFN0YXJ0KGlvYmFzZSwgT0ZGKTsKKy8vRjAxX1MKKwkJ Ly8gUHV0IHRoaXMgZW50cnkgYmFjayBpbiBmaWZvIAorCQlpZiAoc3RfZmlmby0+aGVhZCA+IE1B WF9SWF9XSU5ET1cpCisJCQlzdF9maWZvLT5oZWFkID0gMDsKKwkJc3RhdHVzID0gc3RfZmlmby0+ ZW50cmllc1tzdF9maWZvLT5oZWFkXS5zdGF0dXM7CisJCWxlbiA9IHN0X2ZpZm8tPmVudHJpZXNb c3RfZmlmby0+aGVhZF0ubGVuOworCQlzdF9maWZvLT5oZWFkKys7CisJCXN0X2ZpZm8tPmxlbi0t OworCisJCXNrYiA9IGRldl9hbGxvY19za2IobGVuICsgMSAtIDQpOworCQkvKgorCQkgKiBpZiBm cmFtZSBzaXplLGRhdGEgcHRyLG9yIHNrYiBwdHIgYXJlIHdyb25nICx0aGUgZ2V0IG5leHQKKwkJ ICogZW50cnkuCisJCSAqLworCQlpZiAoKHNrYiA9PSBOVUxMKSB8fCAoc2tiLT5kYXRhID09IE5V TEwpCisJCSAgICB8fCAoc2VsZi0+cnhfYnVmZi5kYXRhID09IE5VTEwpIHx8IChsZW4gPCA2KSkg eworCQkJc2VsZi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJcmV0dXJuIFRSVUU7CisJCX0KKwkJ c2tiX3Jlc2VydmUoc2tiLCAxKTsKKwkJc2tiX3B1dChza2IsIGxlbiAtIDQpOworCQltZW1jcHko c2tiLT5kYXRhLCBzZWxmLT5yeF9idWZmLmRhdGEsIGxlbiAtIDQpOworI2lmZGVmCURCR01TRwor CQlEQkcocHJpbnRrCisJCSAgICAoS0VSTl9JTkZPICJSeFQ6bGVuPSV4LnJ4X2J1ZmY9JXhcbiIs IGxlbiAtIDQsCisJCSAgICAgc2VsZi0+cnhfYnVmZi5kYXRhKSk7CisvKgkJZm9yKGk9MCA7IGkg PCAobGVuLTQpIDsgaSsrKSB7CisJCSAgICBEQkcocHJpbnRrKEtFUk5fSU5GTyAiJXguLlxuIixz ZWxmLT5yeF9idWZmLmRhdGFbaV0pKTsKKwkJfQorKi8KKyNlbmRpZgorCQkvLyBNb3ZlIHRvIG5l eHQgZnJhbWUgCisJCXNlbGYtPnJ4X2J1ZmYuZGF0YSArPSBsZW47CisJCXNlbGYtPnN0YXRzLnJ4 X2J5dGVzICs9IGxlbjsKKwkJc2VsZi0+c3RhdHMucnhfcGFja2V0cysrOworCQlza2ItPmRldiA9 IHNlbGYtPm5ldGRldjsKKwkJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCQlza2ItPnByb3Rv Y29sID0gaHRvbnMoRVRIX1BfSVJEQSk7CisJCW5ldGlmX3J4KHNrYik7CisKKy8vRjAxX0UKKwl9 CQkJLy9GSVIKKwlyZXR1cm4gVFJVRTsKKworfQorCisvKgorICogaWYgZnJhbWUgaXMgcmVjZWl2 ZWQgLCBidXQgbm8gSU5UICx0aGVuIHVzZSB0aGlzIHJvdXRpbmUgdG8gdXBsb2FkIGZyYW1lLgor ICovCitzdGF0aWMgaW50IHVwbG9hZF9yeGRhdGEoc3RydWN0IHZpYV9pcmNjX2NiICpzZWxmLCBp bnQgaW9iYXNlKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGxlbjsKKwlzdHJ1Y3Qg c3RfZmlmbyAqc3RfZmlmbzsKKwlzdF9maWZvID0gJnNlbGYtPnN0X2ZpZm87CisKKwlsZW4gPSBH ZXRSZWN2Qnl0ZShpb2Jhc2UsIHNlbGYpOworCisjaWZkZWYJREJHTVNHCisJREJHKHByaW50ayhL RVJOX0lORk8gInVwbG9hZF9yeGRhdGE6IGxlbj0leFxuIiwgbGVuKSk7CisjZW5kaWYKKwlza2Ig PSBkZXZfYWxsb2Nfc2tiKGxlbiArIDEpOworCWlmICgoc2tiID09IE5VTEwpIHx8ICgobGVuIC0g NCkgPCAyKSkgeworCQlzZWxmLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCXJldHVybiBGQUxTRTsK Kwl9CisJc2tiX3Jlc2VydmUoc2tiLCAxKTsKKwlza2JfcHV0KHNrYiwgbGVuIC0gNCArIDEpOwor CW1lbWNweShza2ItPmRhdGEsIHNlbGYtPnJ4X2J1ZmYuZGF0YSwgbGVuIC0gNCArIDEpOworCXN0 X2ZpZm8tPnRhaWwrKzsKKwlzdF9maWZvLT5sZW4rKzsKKwlpZiAoc3RfZmlmby0+dGFpbCA+IE1B WF9SWF9XSU5ET1cpCisJCXN0X2ZpZm8tPnRhaWwgPSAwOworCS8vIE1vdmUgdG8gbmV4dCBmcmFt ZSAKKwlzZWxmLT5yeF9idWZmLmRhdGEgKz0gbGVuOworCXNlbGYtPnN0YXRzLnJ4X2J5dGVzICs9 IGxlbjsKKwlzZWxmLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJc2tiLT5kZXYgPSBzZWxmLT5uZXRk ZXY7CisJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhF VEhfUF9JUkRBKTsKKwluZXRpZl9yeChza2IpOworCWlmIChzdF9maWZvLT5sZW4gPCAoTUFYX1JY X1dJTkRPVyArIDIpKSB7CisJCVJYU3RhcnQoaW9iYXNlLCBPTik7CisJfSBlbHNlIHsKKwkJRW5h YmxlUlgoaW9iYXNlLCBPRkYpOworCQlFblJYRE1BKGlvYmFzZSwgT0ZGKTsKKwkJUlhTdGFydChp b2Jhc2UsIE9GRik7CisJfQorCXJldHVybiBUUlVFOworfQorCisvKgorICogSW1wbGVtZW50IGJh Y2sgdG8gYmFjayByZWNlaXZlICwgdXNlIHRoaXMgcm91dGluZSB0byB1cGxvYWQgZGF0YS4KKyAq LworCitzdGF0aWMgaW50IFJ4VGltZXJIYW5kbGVyKHN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZiwg aW50IGlvYmFzZSkKK3sKKwlzdHJ1Y3Qgc3RfZmlmbyAqc3RfZmlmbzsKKwlzdHJ1Y3Qgc2tfYnVm ZiAqc2tiOworCWludCBsZW47CisJdTggc3RhdHVzOworCisJc3RfZmlmbyA9ICZzZWxmLT5zdF9m aWZvOworCisJaWYgKENrUnhSZWN2KGlvYmFzZSwgc2VsZikpIHsKKwkJLy8gaWYgc3RpbGwgcmVj ZWl2aW5nICx0aGVuIHJldHVybiAsZG9uJ3QgdXBsb2FkIGZyYW1lIAorCQlzZWxmLT5SZXRyeUNv dW50ID0gMDsKKwkJU2V0VGltZXIoaW9iYXNlLCAyMCk7CisJCXNlbGYtPlJ4RGF0YVJlYWR5Kys7 CisJCXJldHVybiBGQUxTRTsKKwl9IGVsc2UKKwkJc2VsZi0+UmV0cnlDb3VudCsrOworCisJaWYg KChzZWxmLT5SZXRyeUNvdW50ID49IDEpIHx8CisJICAgICgoc3RfZmlmby0+cGVuZGluZ19ieXRl cyArIDIwNDgpID4gc2VsZi0+cnhfYnVmZi50cnVlc2l6ZSkKKwkgICAgfHwgKHN0X2ZpZm8tPmxl biA+PSAoTUFYX1JYX1dJTkRPVykpKSB7CisJCXdoaWxlIChzdF9maWZvLT5sZW4gPiAwKSB7CS8v dXBsb2FkIGZyYW1lCisJCQkvLyBQdXQgdGhpcyBlbnRyeSBiYWNrIGluIGZpZm8gCisJCQlpZiAo c3RfZmlmby0+aGVhZCA+IE1BWF9SWF9XSU5ET1cpCisJCQkJc3RfZmlmby0+aGVhZCA9IDA7CisJ CQlzdGF0dXMgPSBzdF9maWZvLT5lbnRyaWVzW3N0X2ZpZm8tPmhlYWRdLnN0YXR1czsKKwkJCWxl biA9IHN0X2ZpZm8tPmVudHJpZXNbc3RfZmlmby0+aGVhZF0ubGVuOworCQkJc3RfZmlmby0+aGVh ZCsrOworCQkJc3RfZmlmby0+bGVuLS07CisKKwkJCXNrYiA9IGRldl9hbGxvY19za2IobGVuICsg MSAtIDQpOworCQkJLyoKKwkJCSAqIGlmIGZyYW1lIHNpemUsIGRhdGEgcHRyLCBvciBza2IgcHRy IGFyZSB3cm9uZywKKwkJCSAqIHRoZW4gZ2V0IG5leHQgZW50cnkuCisJCQkgKi8KKwkJCWlmICgo c2tiID09IE5VTEwpIHx8IChza2ItPmRhdGEgPT0gTlVMTCkKKwkJCSAgICB8fCAoc2VsZi0+cnhf YnVmZi5kYXRhID09IE5VTEwpIHx8IChsZW4gPCA2KSkgeworCQkJCXNlbGYtPnN0YXRzLnJ4X2Ry b3BwZWQrKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXNrYl9yZXNlcnZlKHNrYiwgMSk7CisJ CQlza2JfcHV0KHNrYiwgbGVuIC0gNCk7CisJCQltZW1jcHkoc2tiLT5kYXRhLCBzZWxmLT5yeF9i dWZmLmRhdGEsIGxlbiAtIDQpOworI2lmZGVmCURCR01TRworCQkJREJHKHByaW50aworCQkJICAg IChLRVJOX0lORk8gIlJ4VDpsZW49JXguaGVhZD0leFxuIiwgbGVuIC0gNCwKKwkJCSAgICAgc3Rf Zmlmby0+aGVhZCkpOworI2VuZGlmCisJCQkvLyBNb3ZlIHRvIG5leHQgZnJhbWUgCisJCQlzZWxm LT5yeF9idWZmLmRhdGEgKz0gbGVuOworCQkJc2VsZi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOwor CQkJc2VsZi0+c3RhdHMucnhfcGFja2V0cysrOworCQkJc2tiLT5kZXYgPSBzZWxmLT5uZXRkZXY7 CisJCQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJCQlza2ItPnByb3RvY29sID0gaHRvbnMo RVRIX1BfSVJEQSk7CisJCQluZXRpZl9yeChza2IpOworCQl9CQkvL3doaWxlCisJCXNlbGYtPlJl dHJ5Q291bnQgPSAwOworI2lmZGVmCURCR01TRworCQlEQkcocHJpbnRrCisJCSAgICAoS0VSTl9J TkZPCisJCSAgICAgIlJ4VDpFbmQgb2YgdXBsb2FkIEhvc3RTdGF0dXM9JXgsUnhTdGF0dXM9JXhc biIsCisJCSAgICAgR2V0SG9zdFN0YXR1cyhpb2Jhc2UpLCBHZXRSWFN0YXR1cyhpb2Jhc2UpKSk7 CisjZW5kaWYKKwkJLyoKKwkJICogaWYgZnJhbWUgaXMgcmVjZWl2ZSBjb21wbGV0ZSBhdCB0aGlz IHJvdXRpbmUgLHRoZW4gdXBsb2FkCisJCSAqIGZyYW1lLgorCQkgKi8KKwkJaWYgKChHZXRSWFN0 YXR1cyhpb2Jhc2UpICYgMHgxMCkKKwkJICAgICYmIChSeEN1ckNvdW50KGlvYmFzZSwgc2VsZikg IT0gc2VsZi0+UnhMYXN0Q291bnQpKSB7CisJCQl1cGxvYWRfcnhkYXRhKHNlbGYsIGlvYmFzZSk7 CisJCQlpZiAoaXJkYV9kZXZpY2VfdHhxdWV1ZV9lbXB0eShzZWxmLT5uZXRkZXYpKQorCQkJCXZp YV9pcmNjX2RtYV9yZWNlaXZlKHNlbGYpOworCQl9CisJfQkJCS8vIHRpbWVyIGRldGVjdCBjb21w bGV0ZQorCWVsc2UKKwkJU2V0VGltZXIoaW9iYXNlLCA0KTsKKwlyZXR1cm4gVFJVRTsKKworfQor CisKKworLyoKKyAqIEZ1bmN0aW9uIHZpYV9pcmNjX2ludGVycnVwdCAoaXJxLCBkZXZfaWQsIHJl Z3MpCisgKgorICogICAgQW4gaW50ZXJydXB0IGZyb20gdGhlIGNoaXAgaGFzIGFycml2ZWQuIFRp bWUgdG8gZG8gc29tZSB3b3JrCisgKgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgdmlhX2lyY2Nf aW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwKKwkJCQkgICAgICBzdHJ1Y3QgcHRfcmVn cyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNl ICopIGRldl9pZDsKKwlzdHJ1Y3QgdmlhX2lyY2NfY2IgKnNlbGY7CisJaW50IGlvYmFzZTsKKwl1 OCBpSG9zdEludFR5cGUsIGlSeEludFR5cGUsIGlUeEludFR5cGU7CisKKwlpZiAoIWRldikgewor CQlXQVJOSU5HKCIlczogaXJxICVkIGZvciB1bmtub3duIGRldmljZS5cbiIsIGRyaXZlcl9uYW1l LAorCQkJaXJxKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKwlzZWxmID0gKHN0cnVjdCB2aWFf aXJjY19jYiAqKSBkZXYtPnByaXY7CisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisJc3Bp bl9sb2NrKCZzZWxmLT5sb2NrKTsKKwlpSG9zdEludFR5cGUgPSBHZXRIb3N0U3RhdHVzKGlvYmFz ZSk7CisJaWYgKChpSG9zdEludFR5cGUgJiAweDQwKSAhPSAwKSB7CS8vVGltZXIgRXZlbnQKKwkJ c2VsZi0+RXZlbnRGbGFnLlRpbWVPdXQrKzsKKwkJQ2xlYXJUaW1lckludChpb2Jhc2UsIDEpOwor CQlpZiAoc2VsZi0+aW8uZGlyZWN0aW9uID09IElPX1hNSVQpIHsKKwkJCXZpYV9pcmNjX2RtYV94 bWl0KHNlbGYsIGlvYmFzZSk7CisJCX0KKwkJaWYgKHNlbGYtPmlvLmRpcmVjdGlvbiA9PSBJT19S RUNWKSB7CisJCQkvKgorCQkJICogZnJhbWUgcmVhZHkgaG9sZCB0b28gbG9uZywgbXVzdCByZXNl dC4KKwkJCSAqLworCQkJaWYgKHNlbGYtPlJ4RGF0YVJlYWR5ID4gMzApIHsKKwkJCQlod3Jlc2V0 KHNlbGYpOworCQkJCWlmIChpcmRhX2RldmljZV90eHF1ZXVlX2VtcHR5CisJCQkJICAgIChzZWxm LT5uZXRkZXYpKSB7CisJCQkJCXZpYV9pcmNjX2RtYV9yZWNlaXZlKHNlbGYpOworCQkJCX0KKwkJ CX0gZWxzZSB7CS8vIGNhbGwgdGhpcyB0byB1cGxvYWQgZnJhbWUuCisJCQkJUnhUaW1lckhhbmRs ZXIoc2VsZiwgaW9iYXNlKTsKKwkJCX0KKwkJfQkJLy9SRUNWCisJfQkJCS8vVGltZXIgRXZlbnQK KwlpZiAoKGlIb3N0SW50VHlwZSAmIDB4MjApICE9IDApIHsJLy9UeCBFdmVudAorCQlpVHhJbnRU eXBlID0gR2V0VFhTdGF0dXMoaW9iYXNlKTsKKwkJaWYgKGlUeEludFR5cGUgJiAweDQpIHsKKwkJ CXNlbGYtPkV2ZW50RmxhZy5FT01lc3NhZ2UrKzsJLy8gcmVhZCBhbmQgd2lsbCBhdXRvIGNsZWFu CisJCQlpZiAodmlhX2lyY2NfZG1hX3htaXRfY29tcGxldGUoc2VsZikpIHsKKwkJCQlpZiAoaXJk YV9kZXZpY2VfdHhxdWV1ZV9lbXB0eQorCQkJCSAgICAoc2VsZi0+bmV0ZGV2KSkgeworCQkJCQl2 aWFfaXJjY19kbWFfcmVjZWl2ZShzZWxmKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXNlbGYt PkV2ZW50RmxhZy5Vbmtub3duKys7CisJCQl9CisJCX0JCS8vRU9QCisJfQkJCS8vVHggRXZlbnQK KwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlpZiAoKGlIb3N0 SW50VHlwZSAmIDB4MTApICE9IDApIHsJLy9SeCBFdmVudAorCQkvKiBDaGVjayBpZiBETUEgaGFz IGZpbmlzaGVkICovCisJCWlSeEludFR5cGUgPSBHZXRSWFN0YXR1cyhpb2Jhc2UpOworI2lmZGVm CURCR01TRworCQlpZiAoIWlSeEludFR5cGUpCisJCQlEQkcocHJpbnRrKEtFUk5fSU5GTyAiIFJ4 SVJRID0wXG4iKSk7CisjZW5kaWYKKwkJaWYgKGlSeEludFR5cGUgJiAweDEwKSB7CisJCQlpZiAo dmlhX2lyY2NfZG1hX3JlY2VpdmVfY29tcGxldGUoc2VsZiwgaW9iYXNlKSkgeworLy9GMDEgICAg ICAgaWYoIShJc0ZJUk9uKGlvYmFzZSkpKSAgdmlhX2lyY2NfZG1hX3JlY2VpdmUoc2VsZik7CisJ CQkJdmlhX2lyY2NfZG1hX3JlY2VpdmUoc2VsZik7CisJCQl9CisJCX0JCS8vIE5vIEVSUiAgICAg CisJCWVsc2UgewkJLy9FUlIKKyNpZmRlZglEQkdNU0cKKwkJCURCRyhwcmludGsKKwkJCSAgICAo S0VSTl9JTkZPCisJCQkgICAgICIgUnhJUlEgRVJSOmlSeEludFR5cGU9JXgsSG9zdEludFR5cGU9 JXgsQ3VyQ291bnQ9JXgsUnhMYXN0Q291bnQ9JXhfX19fX1xuIiwKKwkJCSAgICAgaVJ4SW50VHlw ZSwgaUhvc3RJbnRUeXBlLCBSeEN1ckNvdW50KGlvYmFzZSwKKwkJCQkJCQkJICBzZWxmKSwKKwkJ CSAgICAgc2VsZi0+UnhMYXN0Q291bnQpKTsKKyNlbmRpZgorCQkJaWYgKGlSeEludFR5cGUgJiAw eDIwKSB7CS8vRklGTyBPdmVyUnVuIEVSUgorCQkJCVJlc2V0Q2hpcChpb2Jhc2UsIDApOworCQkJ CVJlc2V0Q2hpcChpb2Jhc2UsIDEpOworCQkJfSBlbHNlIHsJLy9QSFksQ1JDIEVSUgorCisJCQkJ aWYgKGlSeEludFR5cGUgIT0gMHgwOCkKKwkJCQkJaHdyZXNldChzZWxmKTsJLy9GMDEKKwkJCX0K KwkJCXZpYV9pcmNjX2RtYV9yZWNlaXZlKHNlbGYpOworCQl9CQkvL0VSUgorCisJfQkJCS8vUngg RXZlbnQKKwlzcGluX3VubG9jaygmc2VsZi0+bG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOwor fQorCit2b2lkIGh3cmVzZXQoc3RydWN0IHZpYV9pcmNjX2NiICpzZWxmKQoreworCWludCBpb2Jh c2U7CisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisjaWZkZWYJREJHTVNHCisJREJHKHBy aW50ayhLRVJOX0lORk8gImh3cmVzZXQgIC4uLi5cbiIpKTsKKyNlbmRpZgorCVJlc2V0Q2hpcChp b2Jhc2UsIDUpOworCUVuYWJsZURNQShpb2Jhc2UsIE9GRik7CisJRW5hYmxlVFgoaW9iYXNlLCBP RkYpOworCUVuYWJsZVJYKGlvYmFzZSwgT0ZGKTsKKwlFblJYRE1BKGlvYmFzZSwgT0ZGKTsKKwlF blRYRE1BKGlvYmFzZSwgT0ZGKTsKKwlSWFN0YXJ0KGlvYmFzZSwgT0ZGKTsKKwlUWFN0YXJ0KGlv YmFzZSwgT0ZGKTsKKwlJbml0Q2FyZChpb2Jhc2UpOworCUNvbW1vbkluaXQoaW9iYXNlKTsKKwlT SVJGaWx0ZXIoaW9iYXNlLCBPTik7CisJU2V0U0lSKGlvYmFzZSwgT04pOworCUNSQzE2KGlvYmFz ZSwgT04pOworCUVuVFhDUkMoaW9iYXNlLCAwKTsKKwlXcml0ZVJlZyhpb2Jhc2UsIElfU1RfQ1Rf MCwgMHgwMCk7CisJU2V0QmF1ZFJhdGUoaW9iYXNlLCA5NjAwKTsKKwlTZXRQdWxzZVdpZHRoKGlv YmFzZSwgMTIpOworCVNldFNlbmRQcmVhbWJsZUNvdW50KGlvYmFzZSwgMCk7CisJV3JpdGVSZWco aW9iYXNlLCBJX1NUX0NUXzAsIDB4ODApOworCXZpYV9pcmNjX2NoYW5nZV9zcGVlZChzZWxmLCBz ZWxmLT5pby5zcGVlZCk7CisJc2VsZi0+c3RfZmlmby5sZW4gPSAwOworfQorCisvKgorICogRnVu Y3Rpb24gdmlhX2lyY2NfaXNfcmVjZWl2aW5nIChzZWxmKQorICoKKyAqICAgIFJldHVybiBUUlVF IGlzIHdlIGFyZSBjdXJyZW50bHkgcmVjZWl2aW5nIGEgZnJhbWUKKyAqCisgKi8KK3N0YXRpYyBp bnQgdmlhX2lyY2NfaXNfcmVjZWl2aW5nKHN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZikKK3sKKwlp bnQgc3RhdHVzID0gRkFMU0U7CisJaW50IGlvYmFzZTsKKworCUFTU0VSVChzZWxmICE9IE5VTEws IHJldHVybiBGQUxTRTspOworCisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisJaWYgKENr UnhSZWN2KGlvYmFzZSwgc2VsZikpCisJCXN0YXR1cyA9IFRSVUU7CisjaWZkZWYJREJHTVNHCisJ REJHKHByaW50ayhLRVJOX0lORk8gImlzX3JlY2VpdmluZyAgc3RhdHVzPSV4Li4uLlxuIiwgc3Rh dHVzKSk7CisjZW5kaWYKKwlyZXR1cm4gc3RhdHVzOworfQorCisKKy8qCisgKiBGdW5jdGlvbiB2 aWFfaXJjY19uZXRfb3BlbiAoZGV2KQorICoKKyAqICAgIFN0YXJ0IHRoZSBkZXZpY2UKKyAqCisg Ki8KK3N0YXRpYyBpbnQgdmlhX2lyY2NfbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikK K3sKKwlzdHJ1Y3QgdmlhX2lyY2NfY2IgKnNlbGY7CisJaW50IGlvYmFzZTsKKwljaGFyIGh3bmFt ZVszMl07CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJQVNT RVJUKGRldiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlzZWxmID0gKHN0cnVjdCB2aWFfaXJjY19j YiAqKSBkZXYtPnByaXY7CisJc2VsZi0+c3RhdHMucnhfcGFja2V0cyA9IDA7CisJQVNTRVJUKHNl bGYgIT0gTlVMTCwgcmV0dXJuIDA7KTsKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKwlp ZiAocmVxdWVzdF9pcnEKKwkgICAgKHNlbGYtPmlvLmlycSwgdmlhX2lyY2NfaW50ZXJydXB0LCAw LCBkZXYtPm5hbWUsIGRldikpIHsKKwkJV0FSTklORygiJXMsIHVuYWJsZSB0byBhbGxvY2F0ZSBp cnE9JWRcbiIsIGRyaXZlcl9uYW1lLAorCQkJc2VsZi0+aW8uaXJxKTsKKwkJcmV0dXJuIC1FQUdB SU47CisJfQorCS8qCisJICogQWx3YXlzIGFsbG9jYXRlIHRoZSBETUEgY2hhbm5lbCBhZnRlciB0 aGUgSVJRLCBhbmQgY2xlYW4gdXAgb24gCisJICogZmFpbHVyZS4KKwkgKi8KKwlpZiAocmVxdWVz dF9kbWEoc2VsZi0+aW8uZG1hLCBkZXYtPm5hbWUpKSB7CisJCVdBUk5JTkcoIiVzLCB1bmFibGUg dG8gYWxsb2NhdGUgZG1hPSVkXG4iLCBkcml2ZXJfbmFtZSwKKwkJCXNlbGYtPmlvLmRtYSk7CisJ CWZyZWVfaXJxKHNlbGYtPmlvLmlycSwgc2VsZik7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwlp ZiAoc2VsZi0+aW8uZG1hMiAhPSBzZWxmLT5pby5kbWEpIHsKKwkJaWYgKHJlcXVlc3RfZG1hKHNl bGYtPmlvLmRtYTIsIGRldi0+bmFtZSkpIHsKKwkJCVdBUk5JTkcoIiVzLCB1bmFibGUgdG8gYWxs b2NhdGUgZG1hMj0lZFxuIiwKKwkJCQlkcml2ZXJfbmFtZSwgc2VsZi0+aW8uZG1hMik7CisJCQlm cmVlX2lycShzZWxmLT5pby5pcnEsIHNlbGYpOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwl9 CisKKworCS8qIHR1cm4gb24gaW50ZXJydXB0cyAqLworCUVuQWxsSW50KGlvYmFzZSwgT04pOwor CUVuSW50ZXJuYWxMb29wKGlvYmFzZSwgT0ZGKTsKKwlFbkV4dGVybmFsTG9vcChpb2Jhc2UsIE9G Rik7CisJLyogUmVhZHkgdG8gcGxheSEgKi8KKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJ LyogCisJICogT3BlbiBuZXcgSXJMQVAgbGF5ZXIgaW5zdGFuY2UsIG5vdyB0aGF0IGV2ZXJ5dGhp bmcgc2hvdWxkIGJlCisJICogaW5pdGlhbGl6ZWQgcHJvcGVybHkgCisJICovCisJc3ByaW50Ziho d25hbWUsICJWSUEiKTsKKwkvKgorCSAqIGZvciBkaWZmZXJlbnQga2VybmVsICxpcmxhcF9vcGVu IGhhdmUgZGlmZmVyZW50IHBhcmFtZXRlci4KKwkgKi8KKwlzZWxmLT5pcmxhcCA9IGlybGFwX29w ZW4oZGV2LCAmc2VsZi0+cW9zLCBod25hbWUpOworLy8gICAgICBzZWxmLT5pcmxhcCA9IGlybGFw X29wZW4oZGV2LCAmc2VsZi0+cW9zKTsKKworCXNlbGYtPlJ4TGFzdENvdW50ID0gMDsKKworCXJl dHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gdmlhX2lyY2NfbmV0X2Nsb3NlIChkZXYpCisg KgorICogICAgU3RvcCB0aGUgZGV2aWNlCisgKgorICovCitzdGF0aWMgaW50IHZpYV9pcmNjX25l dF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB2aWFfaXJjY19jYiAq c2VsZjsKKwlpbnQgaW9iYXNlOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElP Tl9fKTsKKworCUFTU0VSVChkZXYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJc2VsZiA9IChzdHJ1 Y3QgdmlhX2lyY2NfY2IgKikgZGV2LT5wcml2OworCUFTU0VSVChzZWxmICE9IE5VTEwsIHJldHVy biAwOyk7CisKKyNpZmRlZglEQkdfSU8KKwlvdXRiKDB4ZmYsIDB4OTApOworCW91dGIoMHhmZiwg MHg5NCk7CisjZW5kaWYKKwkvKiBTdG9wIGRldmljZSAqLworCW5ldGlmX3N0b3BfcXVldWUoZGV2 KTsKKwkvKiBTdG9wIGFuZCByZW1vdmUgaW5zdGFuY2Ugb2YgSXJMQVAgKi8KKwlpZiAoc2VsZi0+ aXJsYXApCisJCWlybGFwX2Nsb3NlKHNlbGYtPmlybGFwKTsKKwlzZWxmLT5pcmxhcCA9IE5VTEw7 CisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisJRW5UWERNQShpb2Jhc2UsIE9GRik7CisJ RW5SWERNQShpb2Jhc2UsIE9GRik7CisJRGlzYWJsZURtYUNoYW5uZWwoc2VsZi0+aW8uZG1hKTsK KworCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCUVuQWxsSW50KGlvYmFzZSwgT0ZGKTsKKwlm cmVlX2lycShzZWxmLT5pby5pcnEsIGRldik7CisJZnJlZV9kbWEoc2VsZi0+aW8uZG1hKTsKKwor CXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gdmlhX2lyY2NfbmV0X2lvY3RsIChkZXYs IHJxLCBjbWQpCisgKgorICogICAgUHJvY2VzcyBJT0NUTCBjb21tYW5kcyBmb3IgdGhpcyBkZXZp Y2UKKyAqCisgKi8KK3N0YXRpYyBpbnQgdmlhX2lyY2NfbmV0X2lvY3RsKHN0cnVjdCBuZXRfZGV2 aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsCisJCQkgICAgICBpbnQgY21kKQoreworCXN0cnVj dCBpZl9pcmRhX3JlcSAqaXJxID0gKHN0cnVjdCBpZl9pcmRhX3JlcSAqKSBycTsKKwlzdHJ1Y3Qg dmlhX2lyY2NfY2IgKnNlbGY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsK KworCUFTU0VSVChkZXYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJc2VsZiA9IGRldi0+cHJpdjsK KwlBU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0RFQlVHKDIsICIlcygp LCAlcywgKGNtZD0weCVYKVxuIiwgX19GVU5DVElPTl9fLCBkZXYtPm5hbWUsCisJCSAgIGNtZCk7 CisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICYgc2F2ZSBmbGFncyAqLworCXNwaW5fbG9ja19pcnFz YXZlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NTQkFO RFdJRFRIOgkvKiBTZXQgYmFuZHdpZHRoICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlO KSkgeworCQkJcmV0ID0gLUVQRVJNOworCQkJZ290byBvdXQ7CisJCX0KKwkJdmlhX2lyY2NfY2hh bmdlX3NwZWVkKHNlbGYsIGlycS0+aWZyX2JhdWRyYXRlKTsKKwkJYnJlYWs7CisJY2FzZSBTSU9D U01FRElBQlVTWToJLyogU2V0IG1lZGlhIGJ1c3kgKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRf QURNSU4pKSB7CisJCQlyZXQgPSAtRVBFUk07CisJCQlnb3RvIG91dDsKKwkJfQorCQlpcmRhX2Rl dmljZV9zZXRfbWVkaWFfYnVzeShzZWxmLT5uZXRkZXYsIFRSVUUpOworCQlicmVhazsKKwljYXNl IFNJT0NHUkVDRUlWSU5HOgkvKiBDaGVjayBpZiB3ZSBhcmUgcmVjZWl2aW5nIHJpZ2h0IG5vdyAq LworCQlpcnEtPmlmcl9yZWNlaXZpbmcgPSB2aWFfaXJjY19pc19yZWNlaXZpbmcoc2VsZik7CisJ CWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FT1BOT1RTVVBQOworCX0KKyAgICAgIG91dDoK KwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJl dDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp2aWFfaXJjY19uZXRfZ2V0 X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlCisJCQkJCQkgICAgICAgKmRldikKK3sKKwlzdHJ1Y3Qg dmlhX2lyY2NfY2IgKnNlbGYgPSAoc3RydWN0IHZpYV9pcmNjX2NiICopIGRldi0+cHJpdjsKKwor CXJldHVybiAmc2VsZi0+c3RhdHM7Cit9CisKK01PRFVMRV9BVVRIT1IoIlZJQSBUZWNobm9sb2dp ZXMsaW5jIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlZJQSBJckRBIERldmljZSBEcml2ZXIiKTsK K01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQodmlhX2lyY2NfaW5pdCk7Citt b2R1bGVfZXhpdCh2aWFfaXJjY19jbGVhbnVwKTsKLS0tIGxpbnV4LTIuNC4yNC0wLnByZTIuMW1k ay5vcmlnL2RyaXZlcnMvbmV0L2lyZGEvdmlhLWlyY2MuaAkxOTcwLTAxLTAxIDAxOjAwOjAwLjAw MDAwMDAwMCArMDEwMAorKysgbGludXgtMi40LjI0LTAucHJlMi4xbWRrL2RyaXZlcnMvbmV0L2ly ZGEvdmlhLWlyY2MuaAkyMDA0LTAxLTEzIDE4OjI0OjAwLjAwMDAwMDAwMCArMDEwMApAQCAtMCww ICsxLDEwNDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5h bWU6ICAgICAgdmlhLWlyY2MuaAorICogVmVyc2lvbjogICAgICAgMS4wCisgKiBEZXNjcmlwdGlv bjogICBEcml2ZXIgZm9yIHRoZSBWSUEgVlQ4MjMxL1ZUODIzMyBJckRBIGNoaXBzZXRzCisgKiBB dXRob3I6ICAgICAgICBWSUEgVGVjaG5vbG9naWVzLCBpbmMKKyAqIERhdGUgIDoJICAwOC8wNi8y MDAzCisKK0NvcHlyaWdodCAoYykgMTk5OC0yMDAzIFZJQSBUZWNobm9sb2dpZXMsIEluYy4KKwor VGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu ZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGlj IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBl aXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgor CitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJl IHVzZWZ1bCwgYnV0IFdJVEhPVVQKK0FOWSBXQVJSQU5USUVTIE9SIFJFUFJFU0VOVEFUSU9OUzsg d2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3Ig RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCitTZWUgdGhlIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZl ZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3Ro aXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u LCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEz MDcsIFVTQS4KKworICogQ29tbWVudDoKKyAqIGp1bC8wOC8yMDAyIDogUnggYnVmZmVyIGxlbmd0 aCBzaG91bGQgdXNlIFJ4IHJpbmcgcHRyLgkKKyAqIE9jdC8yOC8yMDAyIDogQWRkIFNCIGlkIGZv ciAzMTQ3IGFuZCAzMTc3LgkKKyAqIGp1bC8wOS8yMDAyIDogb25seSBpbXBsZW1lbnQgdHdvIGtp bmQgb2YgZG9uZ2xlIGN1cnJlbnRseS4KKyAqIE9jdC8wMi8yMDAyIDogd29yayBvbiBWVDgyMzEg YW5kIFZUODIzMyAuCisgKiBBdWcvMDYvMjAwMyA6IGNoYW5nZSBkcml2ZXIgZm9ybWF0IHRvIHBj aSBkcml2ZXIgLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiB2aWFfSVJDQ19ICisjZGVmaW5lIHZp YV9JUkNDX0gKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvc3Bpbmxv Y2suaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjZGVm aW5lIE1BWF9UWF9XSU5ET1cgNworI2RlZmluZSBNQVhfUlhfV0lORE9XIDcKKworc3RydWN0IHN0 X2ZpZm9fZW50cnkgeworCWludCBzdGF0dXM7CisJaW50IGxlbjsKK307CisKK3N0cnVjdCBzdF9m aWZvIHsKKwlzdHJ1Y3Qgc3RfZmlmb19lbnRyeSBlbnRyaWVzW01BWF9SWF9XSU5ET1cgKyAyXTsK KwlpbnQgcGVuZGluZ19ieXRlczsKKwlpbnQgaGVhZDsKKwlpbnQgdGFpbDsKKwlpbnQgbGVuOwor fTsKKworc3RydWN0IGZyYW1lX2NiIHsKKwl2b2lkICpzdGFydDsJCS8qIFN0YXJ0IG9mIGZyYW1l IGluIERNQSBtZW0gKi8KKwlpbnQgbGVuOwkJLyogTGVuZ2h0IG9mIGZyYW1lIGluIERNQSBtZW0g Ki8KK307CisKK3N0cnVjdCB0eF9maWZvIHsKKwlzdHJ1Y3QgZnJhbWVfY2IgcXVldWVbTUFYX1RY X1dJTkRPVyArIDJdOwkvKiBJbmZvIGFib3V0IGZyYW1lcyBpbiBxdWV1ZSAqLworCWludCBwdHI7 CQkvKiBDdXJyZW50bHkgYmVpbmcgc2VudCAqLworCWludCBsZW47CQkvKiBMZW5naHQgb2YgcXVl dWUgKi8KKwlpbnQgZnJlZTsJCS8qIE5leHQgZnJlZSBzbG90ICovCisJdm9pZCAqdGFpbDsJCS8q IE5leHQgZnJlZSBzdGFydCBpbiBETUEgbWVtICovCit9OworCisKK3N0cnVjdCBldmVudGZsYWcJ CS8vIGZvciBrZWVwaW5nIHRyYWNrIG9mIEludGVycnVwdCBFdmVudHMKK3sKKwkvLy0tLS0tLS0t dHggcGFydAorCXVuc2lnbmVkIGNoYXIgVHhGSUZPVW5kZXJSdW47CisJdW5zaWduZWQgY2hhciBF T01lc3NhZ2U7CisJdW5zaWduZWQgY2hhciBUeEZJRk9SZWFkeTsKKwl1bnNpZ25lZCBjaGFyIEVh cmx5RU9NOworCS8vLS0tLS0tLS1yeCBwYXJ0CisJdW5zaWduZWQgY2hhciBQSFlFcnI7CisJdW5z aWduZWQgY2hhciBDUkNFcnI7CisJdW5zaWduZWQgY2hhciBSeEZJRk9PdmVyUnVuOworCXVuc2ln bmVkIGNoYXIgRU9QYWNrZXQ7CisJdW5zaWduZWQgY2hhciBSeEF2YWlsOworCXVuc2lnbmVkIGNo YXIgVG9vTGFyZ2VQYWNrZXQ7CisJdW5zaWduZWQgY2hhciBTSVJCYWQ7CisJLy8tLS0tLS0tLXVu a25vd24KKwl1bnNpZ25lZCBjaGFyIFVua25vd247CisJLy8tLS0tLS0tLS0tCisJdW5zaWduZWQg Y2hhciBUaW1lT3V0OworCXVuc2lnbmVkIGNoYXIgUnhETUFUQzsKKwl1bnNpZ25lZCBjaGFyIFR4 RE1BVEM7Cit9OworCisvKiBQcml2YXRlIGRhdGEgZm9yIGVhY2ggaW5zdGFuY2UgKi8KK3N0cnVj dCB2aWFfaXJjY19jYiB7CisJc3RydWN0IHN0X2ZpZm8gc3RfZmlmbzsJLyogSW5mbyBhYm91dCBy ZWNlaXZlZCBmcmFtZXMgKi8KKwlzdHJ1Y3QgdHhfZmlmbyB0eF9maWZvOwkvKiBJbmZvIGFib3V0 IGZyYW1lcyB0byBiZSB0cmFuc21pdHRlZCAqLworCisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRl djsJLyogWWVzISB3ZSBhcmUgc29tZSBraW5kIG9mIG5ldGRldmljZSAqLworCXN0cnVjdCBuZXRf ZGV2aWNlX3N0YXRzIHN0YXRzOworCisJc3RydWN0IGlybGFwX2NiICppcmxhcDsJLyogVGhlIGxp bmsgbGF5ZXIgd2UgYXJlIGJpbmRlZCB0byAqLworCXN0cnVjdCBxb3NfaW5mbyBxb3M7CS8qIFFv UyBjYXBhYmlsaXRpZXMgZm9yIHRoaXMgZGV2aWNlICovCisKKwljaGlwaW9fdCBpbzsJCS8qIEly REEgY29udHJvbGxlciBpbmZvcm1hdGlvbiAqLworCWlvYnVmZl90IHR4X2J1ZmY7CS8qIFRyYW5z bWl0IGJ1ZmZlciAqLworCWlvYnVmZl90IHJ4X2J1ZmY7CS8qIFJlY2VpdmUgYnVmZmVyICovCisK KwlfX3U4IGllcjsJCS8qIEludGVycnVwdCBlbmFibGUgcmVnaXN0ZXIgKi8KKworCXN0cnVjdCB0 aW1ldmFsIHN0YW1wOworCXN0cnVjdCB0aW1ldmFsIG5vdzsKKworCXNwaW5sb2NrX3QgbG9jazsJ LyogRm9yIHNlcmlhbGl6aW5nIG9wZXJhdGlvbnMgKi8KKworCV9fdTMyIGZsYWdzOwkJLyogSW50 ZXJmYWNlIGZsYWdzICovCisJX191MzIgbmV3X3NwZWVkOworCWludCBpbmRleDsJCS8qIEluc3Rh bmNlIGluZGV4ICovCisKKwlzdHJ1Y3QgZXZlbnRmbGFnIEV2ZW50RmxhZzsKKwlzdHJ1Y3QgcG1f ZGV2ICpkZXY7CisJdW5zaWduZWQgaW50IGNoaXBfaWQ7CS8qIHRvIHJlbWVtYmVyIGNoaXAgaWQg Ki8KKwl1bnNpZ25lZCBpbnQgUmV0cnlDb3VudDsKKwl1bnNpZ25lZCBpbnQgUnhEYXRhUmVhZHk7 CisJdW5zaWduZWQgaW50IFJ4TGFzdENvdW50OworfTsKKworCisvLy0tLS0tLS0tLUk9SW5mcmFy ZWQsICBIPUhvc3QsIE09TWlzYywgVD1UeCwgUj1SeCwgU1Q9U3RhdHVzLAorLy8gICAgICAgICBD Rj1Db25maWcsIENUPUNvbnRyb2wsIEw9TG93LCBIPUhpZ2gsIEM9Q291bnQKKyNkZWZpbmUgIElf Q0ZfTF8wICAJCTB4MTAKKyNkZWZpbmUgIElfQ0ZfSF8wCQkweDExCisjZGVmaW5lICBJX1NJUl9C T0YJCTB4MTIKKyNkZWZpbmUgIElfU0lSX0VPRgkJMHgxMworI2RlZmluZSAgSV9TVF9DVF8wCQkw eDE1CisjZGVmaW5lICBJX1NUX0xfMQkJMHgxNgorI2RlZmluZSAgSV9TVF9IXzEJCTB4MTcKKyNk ZWZpbmUgIElfQ0ZfTF8xCQkweDE4CisjZGVmaW5lICBJX0NGX0hfMQkJMHgxOQorI2RlZmluZSAg SV9DRl9MXzIJCTB4MWEKKyNkZWZpbmUgIElfQ0ZfSF8yCQkweDFiCisjZGVmaW5lICBJX0NGXzMJ CTB4MWUKKyNkZWZpbmUgIEhfQ1QJCQkweDIwCisjZGVmaW5lICBIX1NUCQkJMHgyMQorI2RlZmlu ZSAgTV9DVAkJCTB4MjIKKyNkZWZpbmUgIFRYX0NUXzEJCTB4MjMKKyNkZWZpbmUgIFRYX0NUXzIJ CTB4MjQKKyNkZWZpbmUgIFRYX1NUCQkJMHgyNQorI2RlZmluZSAgUlhfQ1QJCQkweDI2CisjZGVm aW5lICBSWF9TVAkJCTB4MjcKKyNkZWZpbmUgIFJFU0VUCQkJMHgyOAorI2RlZmluZSAgUF9BRERS CQkweDI5CisjZGVmaW5lICBSWF9DX0wJCTB4MmEKKyNkZWZpbmUgIFJYX0NfSAkJMHgyYgorI2Rl ZmluZSAgUlhfUF9MCQkweDJjCisjZGVmaW5lICBSWF9QX0gJCTB4MmQKKyNkZWZpbmUgIFRYX0Nf TAkJMHgyZQorI2RlZmluZSAgVFhfQ19ICQkweDJmCisjZGVmaW5lICBUSU1FUiAgICAgICAgIAkw eDMyCisjZGVmaW5lICBJX0NGXzQgICAgICAgICAJMHgzMworI2RlZmluZSAgSV9UX0NfTAkJMHgz NAorI2RlZmluZSAgSV9UX0NfSAkJMHgzNQorI2RlZmluZSAgVkVSU0lPTgkJMHgzZgorLy8tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIFN0YXJ0QWRkciAJMHgxMAkvLyB0 aGUgZmlyc3QgcmVnaXN0ZXIgYWRkcmVzcworI2RlZmluZSBFbmRBZGRyIAkweDNmCS8vIHRoZSBs YXN0IHJlZ2lzdGVyIGFkZHJlc3MKKyNkZWZpbmUgR2V0Qml0KHZhbCxiaXQpICB2YWwgPSAodW5z aWduZWQgY2hhcikgKCh2YWw+PmJpdCkgJiAweDEpCisJCQkvLyBSZXR1cm5zIHRoZSBiaXQKKyNk ZWZpbmUgU2V0Qml0KHZhbCxiaXQpICB2YWw9ICh1bnNpZ25lZCBjaGFyICkgKHZhbCB8ICgweDEg PDwgYml0KSkKKwkJCS8vIFNldHMgYml0IHRvIDEKKyNkZWZpbmUgUmVzZXRCaXQodmFsLGJpdCkg dmFsPSAodW5zaWduZWQgY2hhciApICh2YWwgJiB+KDB4MSA8PCBiaXQpKQorCQkJLy8gU2V0cyBi aXQgdG8gMAorI2RlZmluZSBQQ0lfQ09ORklHX0FERFJFU1MgMHhjZjgKKyNkZWZpbmUgUENJX0NP TkZJR19EQVRBICAgIDB4Y2ZjCisKKyNkZWZpbmUgVmVuZGVySUQgICAgMHgxMTA2CisjZGVmaW5l IERldmljZUlEMSAgIDB4ODIzMQorI2RlZmluZSBEZXZpY2VJRDIgICAweDMxMDkKKyNkZWZpbmUg RGV2aWNlSUQzICAgMHgzMDc0CisvL0YwMV9TCisjZGVmaW5lIERldmljZUlENCAgIDB4MzE0Nwor I2RlZmluZSBEZXZpY2VJRDUgICAweDMxNzcKKy8vRjAxX0UKKworI2RlZmluZSBPRkYgICAwCisj ZGVmaW5lIE9OICAgMQorI2RlZmluZSBETUFfVFhfTU9ERSAgIDB4MDgKKyNkZWZpbmUgRE1BX1JY X01PREUgICAweDA0CisKKyNkZWZpbmUgRE1BMSAgIDAKKyNkZWZpbmUgRE1BMiAgIDB4YzAKKyNk ZWZpbmUgTUFTSzEgICBETUExKzB4MGEKKyNkZWZpbmUgTUFTSzIgICBETUEyKzB4MTQKKworI2Rl ZmluZSBDbGtfYml0IDB4NDAKKyNkZWZpbmUgVHhfYml0IDB4MDEKKyNkZWZpbmUgUmRfVmFsaWQg MHgwOAorI2RlZmluZSBSeEJpdCAweDA4CisKK19fdTggUmVhZFBDSUJ5dGUoX191OCwgX191OCwg X191OCwgX191OCk7CitfX3UzMiBSZWFkUENJKF9fdTgsIF9fdTgsIF9fdTgsIF9fdTgpOwordm9p ZCBXcml0ZVBDSShfX3U4LCBfX3U4LCBfX3U4LCBfX3U4LCBfX3UzMik7Cit2b2lkIFdyaXRlUENJ Qnl0ZShfX3U4LCBfX3U4LCBfX3U4LCBfX3U4LCBfX3U4KTsKK2ludCBteVNlYXJjaFBDSShfX3U4 ICosIF9fdTE2LCBfX3UxNik7CisKKwordm9pZCBEaXNhYmxlRG1hQ2hhbm5lbCh1bnNpZ25lZCBp bnQgY2hhbm5lbCkKK3sKKwlzd2l0Y2ggKGNoYW5uZWwpIHsJLy8gOCBCaXQgRE1BIGNoYW5uZWxz IERNQUMxCisJY2FzZSAwOgorCQlvdXRiKDQsIE1BU0sxKTsJLy9tYXNrIGNoYW5uZWwgMAorCQli cmVhazsKKwljYXNlIDE6CisJCW91dGIoNSwgTUFTSzEpOwkvL01hc2sgY2hhbm5lbCAxCisJCWJy ZWFrOworCWNhc2UgMjoKKwkJb3V0Yig2LCBNQVNLMSk7CS8vTWFzayBjaGFubmVsIDIKKwkJYnJl YWs7CisJY2FzZSAzOgorCQlvdXRiKDcsIE1BU0sxKTsJLy9NYXNrIGNoYW5uZWwgMworCQlicmVh azsKKwljYXNlIDU6CisJCW91dGIoNSwgTUFTSzIpOwkvL01hc2sgY2hhbm5lbCA1CisJCWJyZWFr OworCWNhc2UgNjoKKwkJb3V0Yig2LCBNQVNLMik7CS8vTWFzayBjaGFubmVsIDYKKwkJYnJlYWs7 CisJY2FzZSA3OgorCQlvdXRiKDcsIE1BU0syKTsJLy9NYXNrIGNoYW5uZWwgNworCQlicmVhazsK KwlkZWZhdWx0OgorCQlicmVhazsKKwl9OwkJCS8vU3dpdGNoCit9CisKK3Vuc2lnbmVkIGNoYXIg UmVhZExQQ1JlZyhpbnQgaVJlZ051bSkKK3sKKwl1bnNpZ25lZCBjaGFyIGlWYWw7CisKKwlvdXRi KDB4ODcsIDB4MmUpOworCW91dGIoMHg4NywgMHgyZSk7CisJb3V0YihpUmVnTnVtLCAweDJlKTsK KwlpVmFsID0gaW5iKDB4MmYpOworCW91dGIoMHhhYSwgMHgyZSk7CisKKwlyZXR1cm4gaVZhbDsK K30KKwordm9pZCBXcml0ZUxQQ1JlZyhpbnQgaVJlZ051bSwgdW5zaWduZWQgY2hhciBpVmFsKQor eworCisJb3V0YigweDg3LCAweDJlKTsKKwlvdXRiKDB4ODcsIDB4MmUpOworCW91dGIoaVJlZ051 bSwgMHgyZSk7CisJb3V0YihpVmFsLCAweDJmKTsKKwlvdXRiKDB4QUEsIDB4MmUpOworfQorCitf X3U4IFJlYWRSZWcodW5zaWduZWQgaW50IEJhc2VBZGRyLCBpbnQgaVJlZ051bSkKK3sKKwlyZXR1 cm4gKChfX3U4KSBpbmIoQmFzZUFkZHIgKyBpUmVnTnVtKSk7Cit9CisKK3ZvaWQgV3JpdGVSZWco dW5zaWduZWQgaW50IEJhc2VBZGRyLCBpbnQgaVJlZ051bSwgdW5zaWduZWQgY2hhciBpVmFsKQor eworCW91dGIoaVZhbCwgQmFzZUFkZHIgKyBpUmVnTnVtKTsKK30KKworaW50IFdyaXRlUmVnQml0 KHVuc2lnbmVkIGludCBCYXNlQWRkciwgdW5zaWduZWQgY2hhciBSZWdOdW0sCisJCXVuc2lnbmVk IGNoYXIgQml0UG9zLCB1bnNpZ25lZCBjaGFyIHZhbHVlKQoreworCV9fdTggUnRlbXAsIFd0ZW1w OworCisJaWYgKEJpdFBvcyA+IDcpIHsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoKFJlZ051bSA8 IFN0YXJ0QWRkcikgfHwgKFJlZ051bSA+IEVuZEFkZHIpKQorCQlyZXR1cm4gLTE7CisJUnRlbXAg PSBSZWFkUmVnKEJhc2VBZGRyLCBSZWdOdW0pOworCWlmICh2YWx1ZSA9PSAwKQorCQlXdGVtcCA9 IFJlc2V0Qml0KFJ0ZW1wLCBCaXRQb3MpOworCWVsc2UgeworCQlpZiAodmFsdWUgPT0gMSkKKwkJ CVd0ZW1wID0gU2V0Qml0KFJ0ZW1wLCBCaXRQb3MpOworCQllbHNlCisJCQlyZXR1cm4gLTE7CisJ fQorCVdyaXRlUmVnKEJhc2VBZGRyLCBSZWdOdW0sIFd0ZW1wKTsKKwlyZXR1cm4gMDsKK30KKwor X191OCBDaGVja1JlZ0JpdCh1bnNpZ25lZCBpbnQgQmFzZUFkZHIsIHVuc2lnbmVkIGNoYXIgUmVn TnVtLAorCQkgdW5zaWduZWQgY2hhciBCaXRQb3MpCit7CisJX191OCB0ZW1wOworCisJaWYgKEJp dFBvcyA+IDcpCisJCXJldHVybiAweGZmOworCWlmICgoUmVnTnVtIDwgU3RhcnRBZGRyKSB8fCAo UmVnTnVtID4gRW5kQWRkcikpIHsKKy8vICAgICBwcmludGYoIndoYXQgaXMgdGhlIHJlZ2lzdGVy ICV4IVxuIixSZWdOdW0pOworCX0KKwl0ZW1wID0gUmVhZFJlZyhCYXNlQWRkciwgUmVnTnVtKTsK KwlyZXR1cm4gR2V0Qml0KHRlbXAsIEJpdFBvcyk7Cit9CisKK19fdTggUmVhZFBDSUJ5dGUoX191 OCBidXMsIF9fdTggZGV2aWNlLCBfX3U4IGZ1biwgX191OCByZWcpCit7CisJX191MzIgZFRtcDsK KwlfX3U4IGJEYXRhLCBiVG1wOworCisJYlRtcCA9IHJlZyAmIH4weDAzOworCWRUbXAgPSBSZWFk UENJKGJ1cywgZGV2aWNlLCBmdW4sIGJUbXApOworCWJUbXAgPSByZWcgJiAweDAzOworCWJEYXRh ID0gKF9fdTgpIChkVG1wID4+IGJUbXApOworCXJldHVybiBiRGF0YTsKK30KKworX191MzIgUmVh ZFBDSShfX3U4IGJ1cywgX191OCBkZXZpY2UsIF9fdTggZnVuLCBfX3U4IHJlZykKK3sKKwlfX3Uz MiBDT05GSUdfQUREUiwgdGVtcCwgZGF0YTsKKworCWlmICgoYnVzID09IDB4ZmYpIHx8IChkZXZp Y2UgPT0gMHhmZikgfHwgKGZ1biA9PSAweGZmKSkKKwkJcmV0dXJuIDB4ZmZmZmZmZmY7CisJQ09O RklHX0FERFIgPSAweDgwMDAwMDAwOworCXRlbXAgPSAoX191MzIpIHJlZyA8PCAyOworCUNPTkZJ R19BRERSID0gQ09ORklHX0FERFIgfCB0ZW1wOworCXRlbXAgPSAoX191MzIpIGZ1biA8PCA4Owor CUNPTkZJR19BRERSID0gQ09ORklHX0FERFIgfCB0ZW1wOworCXRlbXAgPSAoX191MzIpIGRldmlj ZSA8PCAxMTsKKwlDT05GSUdfQUREUiA9IENPTkZJR19BRERSIHwgdGVtcDsKKwl0ZW1wID0gKF9f dTMyKSBidXMgPDwgMTY7CisJQ09ORklHX0FERFIgPSBDT05GSUdfQUREUiB8IHRlbXA7CisKKwlv dXRsKFBDSV9DT05GSUdfQUREUkVTUywgQ09ORklHX0FERFIpOworCWRhdGEgPSBpbmwoUENJX0NP TkZJR19EQVRBKTsKKwlyZXR1cm4gZGF0YTsKK30KKworCit2b2lkIFdyaXRlUENJQnl0ZShfX3U4 IGJ1cywgX191OCBkZXZpY2UsIF9fdTggZnVuLCBfX3U4IHJlZywKKwkJICBfX3U4IENPTkZJR19E QVRBKQoreworCV9fdTMyIGRUbXAsIGRUbXAxID0gMDsKKwlfX3U4IGJUbXA7CisKKwliVG1wID0g cmVnICYgfjB4MDM7CisJZFRtcCA9IFJlYWRQQ0koYnVzLCBkZXZpY2UsIGZ1biwgYlRtcCk7CisJ c3dpdGNoIChyZWcgJiAweDAzKSB7CisJY2FzZSAwOgorCQlkVG1wMSA9IChkVG1wICYgfjB4ZmYp IHwgQ09ORklHX0RBVEE7CisJCWJyZWFrOworCWNhc2UgMToKKwkJZFRtcCA9IChkVG1wICYgfjB4 MDBmZjAwKTsKKwkJZFRtcDEgPSBDT05GSUdfREFUQTsKKwkJZFRtcDEgPSBkVG1wMSA8PCA4Owor CQlkVG1wMSA9IGRUbXAxIHwgZFRtcDsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlkVG1wID0gKGRU bXAgJiB+MHhmZjAwMDApOworCQlkVG1wMSA9IENPTkZJR19EQVRBOworCQlkVG1wMSA9IGRUbXAx IDw8IDE2OworCQlkVG1wMSA9IGRUbXAxIHwgZFRtcDsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlk VG1wID0gKGRUbXAgJiB+MHhmZjAwMDAwMCk7CisJCWRUbXAxID0gQ09ORklHX0RBVEE7CisJCWRU bXAxID0gZFRtcDEgPDwgMjQ7CisJCWRUbXAxID0gZFRtcDEgfCBkVG1wOworCQlicmVhazsKKwl9 CisJV3JpdGVQQ0koYnVzLCBkZXZpY2UsIGZ1biwgYlRtcCwgZFRtcDEpOworfQorCisvLy0tLS0t LS0tLS0tLS0tLS0tLQordm9pZCBXcml0ZVBDSShfX3U4IGJ1cywgX191OCBkZXZpY2UsIF9fdTgg ZnVuLCBfX3U4IHJlZywgX191MzIgQ09ORklHX0RBVEEpCit7CisJX191MzIgQ09ORklHX0FERFIs IHRlbXA7CisKKwlpZiAoKGJ1cyA9PSAweGZmKSB8fCAoZGV2aWNlID09IDB4ZmYpIHx8IChmdW4g PT0gMHhmZikpCisJCXJldHVybjsKKwlDT05GSUdfQUREUiA9IDB4ODAwMDAwMDA7CisJdGVtcCA9 IChfX3UzMikgcmVnIDw8IDI7CisJQ09ORklHX0FERFIgPSBDT05GSUdfQUREUiB8IHRlbXA7CisJ dGVtcCA9IChfX3UzMikgZnVuIDw8IDg7CisJQ09ORklHX0FERFIgPSBDT05GSUdfQUREUiB8IHRl bXA7CisJdGVtcCA9IChfX3UzMikgZGV2aWNlIDw8IDExOworCUNPTkZJR19BRERSID0gQ09ORklH X0FERFIgfCB0ZW1wOworCXRlbXAgPSAoX191MzIpIGJ1cyA8PCAxNjsKKwlDT05GSUdfQUREUiA9 IENPTkZJR19BRERSIHwgdGVtcDsKKworCW91dGwoUENJX0NPTkZJR19BRERSRVNTLCBDT05GSUdf QUREUik7CisJb3V0bChQQ0lfQ09ORklHX0RBVEEsIENPTkZJR19EQVRBKTsKKworfQorCisJCQkJ CQkJCQkJCS8vIGZpbmQgZGV2aWNlIHdpdGggRGV2aWNlSUQgYW5kIFZlbmRlcklEICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgbWF0Y2ggcmV0dXJuIHRocmVlIGJ5 dGUgYnVmZmVyIChidXMsZGV2aWNlLGZ1bmN0aW9uKSAgICAgICAgICAgICAgICAgICAgICAvLyBu byBmb3VuZCwgYWRkcmVzcz17OTksOTksOTl9IAoraW50IG15U2VhcmNoUENJKF9fdTggKiBTQnJp ZHBvcywgX191MTYgVklELCBfX3UxNiBESUQpCit7CisJX191OCBpLCBqLCBrOworCV9fdTE2IEZp bmREZXZpY2VJRCwgRmluZFZlbmRlcklEOworCisJZm9yIChrID0gMDsgayA8IDg7IGsrKykgewkv L3NjYW4gZnVuY3Rpb24KKwkJaSA9IDA7CisJCWogPSAweDExOworCQlrID0gMDsKKwkJaWYgKFJl YWRQQ0koaSwgaiwgaywgMCkgPCAweGZmZmZmZmZmKSB7CS8vIG5vdCBlbXB0eQorCQkJRmluZERl dmljZUlEID0gKF9fdTE2KSAoUmVhZFBDSShpLCBqLCBrLCAwKSA+PiAxNik7CisJCQlGaW5kVmVu ZGVySUQgPQorCQkJICAgIChfX3UxNikgKFJlYWRQQ0koaSwgaiwgaywgMCkgJiAweDAwMDBmZmZm KTsKKwkJCWlmICgoVklEID09IEZpbmRWZW5kZXJJRCkgJiYgKERJRCA9PSBGaW5kRGV2aWNlSUQp KSB7CisJCQkJU0JyaWRwb3NbMF0gPSBpOwkvLyBidXMKKwkJCQlTQnJpZHBvc1sxXSA9IGo7CS8v ZGV2aWNlCisJCQkJU0JyaWRwb3NbMl0gPSBrOwkvL2Z1bmMKKwkJCQlyZXR1cm4gMTsKKwkJCX0K KwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCBTZXRNYXhSeFBhY2tldFNpemUoX191MTYg aW9iYXNlLCBfX3UxNiBzaXplKQoreworCV9fdTE2IGxvdywgaGlnaDsKKwlpZiAoKHNpemUgJiAw eGUwMDApID09IDApIHsKKwkJbG93ID0gc2l6ZSAmIDB4MDBmZjsKKwkJaGlnaCA9IChzaXplICYg MHgxZjAwKSA+PiA4OworCQlXcml0ZVJlZyhpb2Jhc2UsIElfQ0ZfTF8yLCBsb3cpOworCQlXcml0 ZVJlZyhpb2Jhc2UsIElfQ0ZfSF8yLCBoaWdoKTsKKworCX0KKworfQorCisvL2ZvciBib3RoIFJ4 IGFuZCBUeAorCit2b2lkIFNldEZJRk8oX191MTYgaW9iYXNlLCBfX3UxNiB2YWx1ZSkKK3sKKwlz d2l0Y2ggKHZhbHVlKSB7CisJY2FzZSAxMjg6CisJCVdyaXRlUmVnQml0KGlvYmFzZSwgMHgxMSwg MCwgMCk7CisJCVdyaXRlUmVnQml0KGlvYmFzZSwgMHgxMSwgNywgMSk7CisJCWJyZWFrOworCWNh c2UgNjQ6CisJCVdyaXRlUmVnQml0KGlvYmFzZSwgMHgxMSwgMCwgMCk7CisJCVdyaXRlUmVnQml0 KGlvYmFzZSwgMHgxMSwgNywgMCk7CisJCWJyZWFrOworCWNhc2UgMzI6CisJCVdyaXRlUmVnQml0 KGlvYmFzZSwgMHgxMSwgMCwgMSk7CisJCVdyaXRlUmVnQml0KGlvYmFzZSwgMHgxMSwgNywgMCk7 CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVdyaXRlUmVnQml0KGlvYmFzZSwgMHgxMSwgMCwgMCk7 CisJCVdyaXRlUmVnQml0KGlvYmFzZSwgMHgxMSwgNywgMCk7CisJfQorCit9CisKKyNkZWZpbmUg Q1JDMTYoQmFzZUFkZHIsdmFsKSAgICAgICAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLElfQ0ZfTF8w LDcsdmFsKQkvLzAgZm9yIDMyIENSQworLyoKKyNkZWZpbmUgU2V0VkZJUihCYXNlQWRkcix2YWwp ICAgICAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLElfQ0ZfSF8wLDUsdmFsKQorI2RlZmluZSBTZXRG SVIoQmFzZUFkZHIsdmFsKSAgICAgICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsSV9DRl9MXzAsNix2 YWwpCisjZGVmaW5lIFNldE1JUihCYXNlQWRkcix2YWwpICAgICAgICBXcml0ZVJlZ0JpdChCYXNl QWRkcixJX0NGX0xfMCw1LHZhbCkKKyNkZWZpbmUgU2V0U0lSKEJhc2VBZGRyLHZhbCkgICAgICAg IFdyaXRlUmVnQml0KEJhc2VBZGRyLElfQ0ZfTF8wLDQsdmFsKQorKi8KKyNkZWZpbmUgU0lSRmls dGVyKEJhc2VBZGRyLHZhbCkgICAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLElfQ0ZfTF8wLDMsdmFs KQorI2RlZmluZSBGaWx0ZXIoQmFzZUFkZHIsdmFsKSAgICAgICAgV3JpdGVSZWdCaXQoQmFzZUFk ZHIsSV9DRl9MXzAsMix2YWwpCisjZGVmaW5lIEludmVydFRYKEJhc2VBZGRyLHZhbCkgICAgICBX cml0ZVJlZ0JpdChCYXNlQWRkcixJX0NGX0xfMCwxLHZhbCkKKyNkZWZpbmUgSW52ZXJ0UlgoQmFz ZUFkZHIsdmFsKSAgICAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLElfQ0ZfTF8wLDAsdmFsKQorLy8q KioqKioqKioqKioqKioqKioqKioqKioqKioqSV9DRl9IXzAKKyNkZWZpbmUgRW5hYmxlVFgoQmFz ZUFkZHIsdmFsKSAgICAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLElfQ0ZfSF8wLDQsdmFsKQorI2Rl ZmluZSBFbmFibGVSWChCYXNlQWRkcix2YWwpICAgICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsSV9D Rl9IXzAsMyx2YWwpCisjZGVmaW5lIEVuYWJsZURNQShCYXNlQWRkcix2YWwpICAgICBXcml0ZVJl Z0JpdChCYXNlQWRkcixJX0NGX0hfMCwyLHZhbCkKKyNkZWZpbmUgU0lSUmVjdkFueShCYXNlQWRk cix2YWwpICAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLElfQ0ZfSF8wLDEsdmFsKQorI2RlZmluZSBE aWFibGVUcmFucyhCYXNlQWRkcix2YWwpICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsSV9DRl9IXzAs MCx2YWwpCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKklfU0lSX0JPRixJX1NJUl9FT0YK KyNkZWZpbmUgU2V0U0lSQk9GKEJhc2VBZGRyLHZhbCkgICAgIFdyaXRlUmVnKEJhc2VBZGRyLElf U0lSX0JPRix2YWwpCisjZGVmaW5lIFNldFNJUkVPRihCYXNlQWRkcix2YWwpICAgICBXcml0ZVJl ZyhCYXNlQWRkcixJX1NJUl9FT0YsdmFsKQorI2RlZmluZSBHZXRTSVJCT0YoQmFzZUFkZHIpICAg ICAgICBSZWFkUmVnKEJhc2VBZGRyLElfU0lSX0JPRikKKyNkZWZpbmUgR2V0U0lSRU9GKEJhc2VB ZGRyKSAgICAgICAgUmVhZFJlZyhCYXNlQWRkcixJX1NJUl9FT0YpCisvLyoqKioqKioqKioqKioq KioqKipJX1NUX0NUXzAKKyNkZWZpbmUgRW5QaHlzKEJhc2VBZGRyLHZhbCkgICBXcml0ZVJlZ0Jp dChCYXNlQWRkcixJX1NUX0NUXzAsNyx2YWwpCisjZGVmaW5lIElzTW9kZUVycm9yKEJhc2VBZGRy KSBDaGVja1JlZ0JpdChCYXNlQWRkcixJX1NUX0NUXzAsNikJLy9STworI2RlZmluZSBJc1ZGSVJP bihCYXNlQWRkcikgICAgIENoZWNrUmVnQml0KEJhc2VBZGRyLDB4MTQsMCkJLy9STyBmb3IgVlQx MjExIG9ubHkKKyNkZWZpbmUgSXNGSVJPbihCYXNlQWRkcikgICAgIENoZWNrUmVnQml0KEJhc2VB ZGRyLElfU1RfQ1RfMCw1KQkvL1JPCisjZGVmaW5lIElzTUlST24oQmFzZUFkZHIpICAgICBDaGVj a1JlZ0JpdChCYXNlQWRkcixJX1NUX0NUXzAsNCkJLy9STworI2RlZmluZSBJc1NJUk9uKEJhc2VB ZGRyKSAgICAgQ2hlY2tSZWdCaXQoQmFzZUFkZHIsSV9TVF9DVF8wLDMpCS8vUk8KKyNkZWZpbmUg SXNFbmFibGVUWChCYXNlQWRkcikgIENoZWNrUmVnQml0KEJhc2VBZGRyLElfU1RfQ1RfMCwyKQkv L1JPCisjZGVmaW5lIElzRW5hYmxlUlgoQmFzZUFkZHIpICBDaGVja1JlZ0JpdChCYXNlQWRkcixJ X1NUX0NUXzAsMSkJLy9STworI2RlZmluZSBJczE2Q1JDKEJhc2VBZGRyKSAgICAgQ2hlY2tSZWdC aXQoQmFzZUFkZHIsSV9TVF9DVF8wLDApCS8vUk8KKy8vKioqKioqKioqKioqKioqKioqKioqKioq KioqSV9DRl8zCisjZGVmaW5lIERpc2FibGVBZGphY2VudFB1bHNlV2lkdGgoQmFzZUFkZHIsdmFs KSBXcml0ZVJlZ0JpdChCYXNlQWRkcixJX0NGXzMsNSx2YWwpCS8vMSBkaXNhYmxlCisjZGVmaW5l IERpc2FibGVQdWxzZVdpZHRoQWRqdXN0KEJhc2VBZGRyLHZhbCkgICBXcml0ZVJlZ0JpdChCYXNl QWRkcixJX0NGXzMsNCx2YWwpCS8vMSBkaXNhYmxlCisjZGVmaW5lIFVzZU9uZVJYKEJhc2VBZGRy LHZhbCkgICAgICAgICAgICAgICAgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixJX0NGXzMsMSx2YWwp CS8vMCB1c2UgdHdvIFJYCisjZGVmaW5lIFNsb3dJUlJYTG93QWN0aXZlKEJhc2VBZGRyLHZhbCkg ICAgICAgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixJX0NGXzMsMCx2YWwpCS8vMCBzaG93IFJYIGhp Z2g9MSBpbiBTSVIKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqSF9DVAorI2RlZmluZSBF bkFsbEludChCYXNlQWRkcix2YWwpICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsSF9DVCw3LHZhbCkK KyNkZWZpbmUgVFhTdGFydChCYXNlQWRkcix2YWwpICAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLEhf Q1QsNix2YWwpCisjZGVmaW5lIFJYU3RhcnQoQmFzZUFkZHIsdmFsKSAgICBXcml0ZVJlZ0JpdChC YXNlQWRkcixIX0NULDUsdmFsKQorI2RlZmluZSBDbGVhclJYSW50KEJhc2VBZGRyLHZhbCkgICBX cml0ZVJlZ0JpdChCYXNlQWRkcixIX0NULDQsdmFsKQkvLyAxIGNsZWFyCisvLyoqKioqKioqKioq KioqKioqSF9TVAorI2RlZmluZSBJc1JYSW50KEJhc2VBZGRyKSAgICAgICAgICAgQ2hlY2tSZWdC aXQoQmFzZUFkZHIsSF9TVCw0KQorI2RlZmluZSBHZXRJbnRJbmRlbnRpZnkoQmFzZUFkZHIpICAg KChSZWFkUmVnKEJhc2VBZGRyLEhfU1QpJjB4ZjEpID4+MSkKKyNkZWZpbmUgSXNIb3N0QnVzeShC YXNlQWRkcikgICAgICAgIENoZWNrUmVnQml0KEJhc2VBZGRyLEhfU1QsMCkKKyNkZWZpbmUgR2V0 SG9zdFN0YXR1cyhCYXNlQWRkcikgICAgIFJlYWRSZWcoQmFzZUFkZHIsSF9TVCkJLy9STworLy8q KioqKioqKioqKioqKioqKioqKioqKioqKk1fQ1QKKyNkZWZpbmUgRW5UWERNQShCYXNlQWRkcix2 YWwpICAgICAgICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsTV9DVCw3LHZhbCkKKyNkZWZpbmUgRW5S WERNQShCYXNlQWRkcix2YWwpICAgICAgICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsTV9DVCw2LHZh bCkKKyNkZWZpbmUgU3dhcERNQShCYXNlQWRkcix2YWwpICAgICAgICAgV3JpdGVSZWdCaXQoQmFz ZUFkZHIsTV9DVCw1LHZhbCkKKyNkZWZpbmUgRW5JbnRlcm5hbExvb3AoQmFzZUFkZHIsdmFsKSAg V3JpdGVSZWdCaXQoQmFzZUFkZHIsTV9DVCw0LHZhbCkKKyNkZWZpbmUgRW5FeHRlcm5hbExvb3Ao QmFzZUFkZHIsdmFsKSAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsTV9DVCwzLHZhbCkKKy8vKioqKioq KioqKioqKioqKioqKioqKioqKipUWF9DVF8xCisjZGVmaW5lIEVuVFhGSUZPSGFsZkxldmVsSW50 KEJhc2VBZGRyLHZhbCkgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixUWF9DVF8xLDQsdmFsKQkvL2hh bGYgZW1wdHkgaW50ICgxIGhhbGYpCisjZGVmaW5lIEVuVFhGSUZPVW5kZXJydW5FT01JbnQoQmFz ZUFkZHIsdmFsKSBXcml0ZVJlZ0JpdChCYXNlQWRkcixUWF9DVF8xLDUsdmFsKQorI2RlZmluZSBF blRYRklGT1JlYWR5SW50KEJhc2VBZGRyLHZhbCkgICAgICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIs VFhfQ1RfMSw2LHZhbCkJLy9pbnQgd2hlbiByZWFjaCBpdCB0aHJlc2hvbGQgKHNldHRpbmcgYnkg Yml0IDQpCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqVFhfQ1RfMgorI2RlZmluZSBGb3Jj ZVVuZGVycnVuKEJhc2VBZGRyLHZhbCkgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixUWF9DVF8yLDcs dmFsKQkvLyBmb3JjZSBhbiB1bmRlcnJ1biBpbnQKKyNkZWZpbmUgRW5UWENSQyhCYXNlQWRkcix2 YWwpICAgICAgICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsVFhfQ1RfMiw2LHZhbCkJLy8xIGZvciBG SVIsTUlSLi4uMCAobm90IFNJUikKKyNkZWZpbmUgRm9yY2VCQURDUkMoQmFzZUFkZHIsdmFsKSAg ICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsVFhfQ1RfMiw1LHZhbCkJLy9mb3JjZSBhbiBiYWQgQ1JD CisjZGVmaW5lIFNlbmRTSVAoQmFzZUFkZHIsdmFsKSAgICAgICAgIFdyaXRlUmVnQml0KEJhc2VB ZGRyLFRYX0NUXzIsNCx2YWwpCS8vc2VuZCBpbmRpY2F0aW9uIHB1bHNlIGZvciBwcmV2ZW50IFNJ UiBkaXN0dXJiCisjZGVmaW5lIENsZWFyRW5UWChCYXNlQWRkcix2YWwpICAgICAgIFdyaXRlUmVn Qml0KEJhc2VBZGRyLFRYX0NUXzIsMyx2YWwpCS8vIG9wcG9zaXRlIHRvIEVuVFgKKy8vKioqKioq KioqKioqKioqKipUWF9TVAorI2RlZmluZSBHZXRUWFN0YXR1cyhCYXNlQWRkcikgCVJlYWRSZWco QmFzZUFkZHIsVFhfU1QpCS8vUk8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKipSWF9DVAor I2RlZmluZSBFblJYU3BlY0ludChCYXNlQWRkcix2YWwpICAgICAgICAgICBXcml0ZVJlZ0JpdChC YXNlQWRkcixSWF9DVCwwLHZhbCkKKyNkZWZpbmUgRW5SWEZJRk9SZWFkeUludChCYXNlQWRkcix2 YWwpICAgICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsUlhfQ1QsMSx2YWwpCS8vZW5hYmxlIGludCB3 aGVuIHJlYWNoIGl0IHRocmVzaG9sZCAoc2V0dGluZyBieSBiaXQgNykKKyNkZWZpbmUgRW5SWEZJ Rk9IYWxmTGV2ZWxJbnQoQmFzZUFkZHIsdmFsKSAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsUlhfQ1Qs Nyx2YWwpCS8vZW5hYmxlIGludCB3aGVuICgxKSBoYWxmIGZ1bGwuLi5vciAoMCkganVzdCBub3Qg ZnVsbAorLy8qKioqKioqKioqKioqKioqKlJYX1NUCisjZGVmaW5lIEdldFJYU3RhdHVzKEJhc2VB ZGRyKSAJUmVhZFJlZyhCYXNlQWRkcixSWF9TVCkJLy9STworLy8qKioqKioqKioqKioqKioqKioq KioqKlBfQUREUgorI2RlZmluZSBTZXRQYWNrZXRBZGRyKEJhc2VBZGRyLGFkZHIpICAgICAgICBX cml0ZVJlZyhCYXNlQWRkcixQX0FERFIsYWRkcikKKy8vKioqKioqKioqKioqKioqKioqKioqKipJ X0NGXzQKKyNkZWZpbmUgRW5HUElPdG9SWDIoQmFzZUFkZHIsdmFsKQlXcml0ZVJlZ0JpdChCYXNl QWRkcixJX0NGXzQsNyx2YWwpCisjZGVmaW5lIEVuVGltZXJJbnQoQmFzZUFkZHIsdmFsKQkJV3Jp dGVSZWdCaXQoQmFzZUFkZHIsSV9DRl80LDEsdmFsKQorI2RlZmluZSBDbGVhclRpbWVySW50KEJh c2VBZGRyLHZhbCkJV3JpdGVSZWdCaXQoQmFzZUFkZHIsSV9DRl80LDAsdmFsKQorLy8qKioqKioq KioqKioqKioqKioqKioqKklfVF9DX0wKKyNkZWZpbmUgV3JpdGVHSU8oQmFzZUFkZHIsdmFsKQkg ICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsSV9UX0NfTCw3LHZhbCkKKyNkZWZpbmUgUmVhZEdJTyhC YXNlQWRkcikJCSAgICBDaGVja1JlZ0JpdChCYXNlQWRkcixJX1RfQ19MLDcpCisjZGVmaW5lIFJl YWRSWChCYXNlQWRkcikJCSAgICBDaGVja1JlZ0JpdChCYXNlQWRkcixJX1RfQ19MLDMpCS8vUk8K KyNkZWZpbmUgV3JpdGVUWChCYXNlQWRkcix2YWwpCQlXcml0ZVJlZ0JpdChCYXNlQWRkcixJX1Rf Q19MLDAsdmFsKQorLy8qKioqKioqKioqKioqKioqKioqKioqKklfVF9DX0gKKyNkZWZpbmUgRW5S WDIoQmFzZUFkZHIsdmFsKQkJICAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLElfVF9DX0gsNyx2YWwp CisjZGVmaW5lIFJlYWRSWDIoQmFzZUFkZHIpICAgICAgICAgICBDaGVja1JlZ0JpdChCYXNlQWRk cixJX1RfQ19ILDcpCisvLyoqKioqKioqKioqKioqKioqKioqKipWZXJzaW9uCisjZGVmaW5lIEdl dEZJUlZlcnNpb24oQmFzZUFkZHIpCQlSZWFkUmVnKEJhc2VBZGRyLFZFUlNJT04pCisKKwordm9p ZCBTZXRUaW1lcihfX3UxNiBpb2Jhc2UsIF9fdTggY291bnQpCit7CisJRW5UaW1lckludChpb2Jh c2UsIE9GRik7CisJV3JpdGVSZWcoaW9iYXNlLCBUSU1FUiwgY291bnQpOworCUVuVGltZXJJbnQo aW9iYXNlLCBPTik7Cit9CisKKwordm9pZCBTZXRTZW5kQnl0ZShfX3UxNiBpb2Jhc2UsIF9fdTMy IGNvdW50KQoreworCV9fdTMyIGxvdywgaGlnaDsKKworCWlmICgoY291bnQgJiAweGYwMDApID09 IDApIHsKKwkJbG93ID0gY291bnQgJiAweDAwZmY7CisJCWhpZ2ggPSAoY291bnQgJiAweDBmMDAp ID4+IDg7CisJCVdyaXRlUmVnKGlvYmFzZSwgVFhfQ19MLCBsb3cpOworCQlXcml0ZVJlZyhpb2Jh c2UsIFRYX0NfSCwgaGlnaCk7CisJfQorfQorCit2b2lkIFJlc2V0Q2hpcChfX3UxNiBpb2Jhc2Us IF9fdTggdHlwZSkKK3sKKwlfX3U4IHZhbHVlOworCisJdmFsdWUgPSAodHlwZSArIDIpIDw8IDQ7 CisJV3JpdGVSZWcoaW9iYXNlLCBSRVNFVCwgdHlwZSk7Cit9CisKK3ZvaWQgU2V0QWRkck1vZGUo X191MTYgaW9iYXNlLCBfX3U4IG1vZGUpCit7CisJX191OCBiVG1wID0gMDsKKwlpZiAobW9kZSA8 IDMpIHsKKwkJYlRtcCA9IChSZWFkUmVnKGlvYmFzZSwgUlhfQ1QpICYgMHhjZikgfCAobW9kZSA8 PCA0KTsKKwkJV3JpdGVSZWcoaW9iYXNlLCBSWF9DVCwgYlRtcCk7CisJfQorfQorCitpbnQgQ2tS eFJlY3YoX191MTYgaW9iYXNlLCBzdHJ1Y3QgdmlhX2lyY2NfY2IgKnNlbGYpCit7CisJX191OCBs b3csIGhpZ2g7CisJX191MTYgd1RtcCA9IDAsIHdUbXAxID0gMCwgd1RtcF9uZXcgPSAwOworCisJ bG93ID0gUmVhZFJlZyhpb2Jhc2UsIFJYX0NfTCk7CisJaGlnaCA9IFJlYWRSZWcoaW9iYXNlLCBS WF9DX0gpOworCXdUbXAxID0gaGlnaDsKKwl3VG1wID0gKHdUbXAxIDw8IDgpIHwgbG93OworCXVk ZWxheSgxMCk7CisJbG93ID0gUmVhZFJlZyhpb2Jhc2UsIFJYX0NfTCk7CisJaGlnaCA9IFJlYWRS ZWcoaW9iYXNlLCBSWF9DX0gpOworCXdUbXAxID0gaGlnaDsKKwl3VG1wX25ldyA9ICh3VG1wMSA8 PCA4KSB8IGxvdzsKKwlpZiAod1RtcF9uZXcgIT0gd1RtcCkKKwkJcmV0dXJuIDE7CisJZWxzZQor CQlyZXR1cm4gMDsKKworfQorCitfX3UxNiBSeEN1ckNvdW50KF9fdTE2IGlvYmFzZSwgc3RydWN0 IHZpYV9pcmNjX2NiICogc2VsZikKK3sKKwlfX3U4IGxvdywgaGlnaDsKKwlfX3UxNiB3VG1wID0g MCwgd1RtcDEgPSAwOworCisJbG93ID0gUmVhZFJlZyhpb2Jhc2UsIFJYX1BfTCk7CisJaGlnaCA9 IFJlYWRSZWcoaW9iYXNlLCBSWF9QX0gpOworCXdUbXAxID0gaGlnaDsKKwl3VG1wID0gKHdUbXAx IDw8IDgpIHwgbG93OworCXJldHVybiB3VG1wOworfQorCisvKiBUaGlzIFJvdXRpbmUgY2FuIG9u bHkgdXNlIGluIHJlY2V2aWVfY29tcGxldGUKKyAqIGZvciBpdCB3aWxsIHVwZGF0ZSBsYXN0IGNv dW50LgorICovCisKK19fdTE2IEdldFJlY3ZCeXRlKF9fdTE2IGlvYmFzZSwgc3RydWN0IHZpYV9p cmNjX2NiICogc2VsZikKK3sKKwlfX3U4IGxvdywgaGlnaDsKKwlfX3UxNiB3VG1wLCB3VG1wMSwg cmV0OworCisJbG93ID0gUmVhZFJlZyhpb2Jhc2UsIFJYX1BfTCk7CisJaGlnaCA9IFJlYWRSZWco aW9iYXNlLCBSWF9QX0gpOworCXdUbXAxID0gaGlnaDsKKwl3VG1wID0gKHdUbXAxIDw8IDgpIHwg bG93OworCisKKwlpZiAod1RtcCA+PSBzZWxmLT5SeExhc3RDb3VudCkKKwkJcmV0ID0gd1RtcCAt IHNlbGYtPlJ4TGFzdENvdW50OworCWVsc2UKKwkJcmV0ID0gKDB4ODAwMCAtIHNlbGYtPlJ4TGFz dENvdW50KSArIHdUbXA7CisJc2VsZi0+UnhMYXN0Q291bnQgPSB3VG1wOworCisvKiBSWF9QIGlz IG1vcmUgYWN0dWFsbHkgdGhlIFJYX0MKKyBsb3c9UmVhZFJlZyhpb2Jhc2UsUlhfQ19MKTsKKyBo aWdoPVJlYWRSZWcoaW9iYXNlLFJYX0NfSCk7CisKKyBpZighKGhpZ2gmMHhlMDAwKSkgeworCSB0 ZW1wPShoaWdoPDw4KStsb3c7CisJIHJldHVybiB0ZW1wOworIH0KKyBlbHNlIHJldHVybiAwOwor Ki8KKwlyZXR1cm4gcmV0OworfQorCisKK19fdTE2IEdldFJlY3ZMZW4oX191MTYgaW9iYXNlKQor eworCV9fdTggbG93LCBoaWdoOworCV9fdTE2IHRlbXA7CisKKwlsb3cgPSBSZWFkUmVnKGlvYmFz ZSwgUlhfUF9MKTsKKwloaWdoID0gUmVhZFJlZyhpb2Jhc2UsIFJYX1BfSCk7CisKKwlpZiAoISho aWdoICYgMHhlMDAwKSkgeworCQl0ZW1wID0gKGhpZ2ggPDwgOCkgKyBsb3c7CisJCXJldHVybiB0 ZW1wOworCX0gZWxzZQorCQlyZXR1cm4gMDsKK30KKwordm9pZCBTZGVsYXkoX191MTYgc2NhbGUp Cit7CisJX191OCBiVG1wOworCWludCBpLCBqOworCisJZm9yIChqID0gMDsgaiA8IHNjYWxlOyBq KyspIHsKKwkJZm9yIChpID0gMDsgaSA8IDB4MjA7IGkrKykgeworCQkJYlRtcCA9IGluYigweGVi KTsKKwkJCW91dGIoYlRtcCwgMHhlYik7CisJCX0KKwl9Cit9CisKK3ZvaWQgVGRlbGF5KF9fdTE2 IHNjYWxlKQoreworCV9fdTggYlRtcDsKKwlpbnQgaSwgajsKKworCWZvciAoaiA9IDA7IGogPCBz Y2FsZTsgaisrKSB7CisJCWZvciAoaSA9IDA7IGkgPCAweDUwOyBpKyspIHsKKwkJCWJUbXAgPSBp bmIoMHhlYik7CisJCQlvdXRiKGJUbXAsIDB4ZWIpOworCQl9CisJfQorfQorCisKK3ZvaWQgQWN0 Q2xrKF9fdTE2IGlvYmFzZSwgX191OCB2YWx1ZSkKK3sKKwlfX3U4IGJUbXA7CisJYlRtcCA9IFJl YWRSZWcoaW9iYXNlLCAweDM0KTsKKwlpZiAodmFsdWUpCisJCVdyaXRlUmVnKGlvYmFzZSwgMHgz NCwgYlRtcCB8IENsa19iaXQpOworCWVsc2UKKwkJV3JpdGVSZWcoaW9iYXNlLCAweDM0LCBiVG1w ICYgfkNsa19iaXQpOworfQorCit2b2lkIEFjdFR4KF9fdTE2IGlvYmFzZSwgX191OCB2YWx1ZSkK K3sKKwlfX3U4IGJUbXA7CisKKwliVG1wID0gUmVhZFJlZyhpb2Jhc2UsIDB4MzQpOworCWlmICh2 YWx1ZSkKKwkJV3JpdGVSZWcoaW9iYXNlLCAweDM0LCBiVG1wIHwgVHhfYml0KTsKKwllbHNlCisJ CVdyaXRlUmVnKGlvYmFzZSwgMHgzNCwgYlRtcCAmIH5UeF9iaXQpOworfQorCit2b2lkIENsa1R4 KF9fdTE2IGlvYmFzZSwgX191OCBDbGssIF9fdTggVHgpCit7CisJX191OCBiVG1wOworCisJYlRt cCA9IFJlYWRSZWcoaW9iYXNlLCAweDM0KTsKKwlpZiAoQ2xrID09IDApCisJCWJUbXAgJj0gfkNs a19iaXQ7CisJZWxzZSB7CisJCWlmIChDbGsgPT0gMSkKKwkJCWJUbXAgfD0gQ2xrX2JpdDsKKwl9 CisJV3JpdGVSZWcoaW9iYXNlLCAweDM0LCBiVG1wKTsKKwlTZGVsYXkoMSk7CisJaWYgKFR4ID09 IDApCisJCWJUbXAgJj0gflR4X2JpdDsKKwllbHNlIHsKKwkJaWYgKFR4ID09IDEpCisJCQliVG1w IHw9IFR4X2JpdDsKKwl9CisJV3JpdGVSZWcoaW9iYXNlLCAweDM0LCBiVG1wKTsKK30KKwordm9p ZCBXcl9CeXRlKF9fdTE2IGlvYmFzZSwgX191OCBkYXRhKQoreworCV9fdTggYkRhdGEgPSBkYXRh OworLy8gICAgICBfX3U4IGJ0bXA7CisJaW50IGk7CisKKwlDbGtUeChpb2Jhc2UsIDAsIDEpOwor CisJVGRlbGF5KDIpOworCUFjdENsayhpb2Jhc2UsIDEpOworCVRkZWxheSgxKTsKKworCWZvciAo aSA9IDA7IGkgPCA4OyBpKyspIHsJLy9MRE4KKworCQlpZiAoKGJEYXRhID4+IGkpICYgMHgwMSkg eworCQkJQ2xrVHgoaW9iYXNlLCAwLCAxKTsJLy9iaXQgZGF0YSA9IDE7CisJCX0gZWxzZSB7CisJ CQlDbGtUeChpb2Jhc2UsIDAsIDApOwkvL2JpdCBkYXRhID0gMTsKKwkJfQorCQlUZGVsYXkoMik7 CisJCVNkZWxheSgxKTsKKwkJQWN0Q2xrKGlvYmFzZSwgMSk7CS8vY2xrIGhpCisJCVRkZWxheSgx KTsKKwl9Cit9CisKK19fdTggUmRfSW5keChfX3UxNiBpb2Jhc2UsIF9fdTggYWRkciwgX191OCBp bmRleCkKK3sKKwlfX3U4IGRhdGEgPSAwLCBiVG1wLCBkYXRhX2JpdDsKKwlpbnQgaTsKKworCWJU bXAgPSBhZGRyIHwgKGluZGV4IDw8IDEpIHwgMDsKKwlDbGtUeChpb2Jhc2UsIDAsIDApOworCVRk ZWxheSgyKTsKKwlBY3RDbGsoaW9iYXNlLCAxKTsKKwl1ZGVsYXkoMSk7CisJV3JfQnl0ZShpb2Jh c2UsIGJUbXApOworCVNkZWxheSgxKTsKKwlDbGtUeChpb2Jhc2UsIDAsIDApOworCVRkZWxheSgy KTsKKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQlBY3RDbGsoaW9iYXNlLCAxKTsKKwkJ VGRlbGF5KDEpOworCQlBY3RDbGsoaW9iYXNlLCAwKTsKKwkJVGRlbGF5KDEpOworCQlDbGtUeChp b2Jhc2UsIDAsIDEpOworCQlUZGVsYXkoMSk7CisJCWJUbXAgPSBSZWFkUmVnKGlvYmFzZSwgMHgz NCk7CisJCWlmICghKGJUbXAgJiBSZF9WYWxpZCkpCisJCQlicmVhazsKKwl9CisJaWYgKCEoYlRt cCAmIFJkX1ZhbGlkKSkgeworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQlBY3RDbGso aW9iYXNlLCAxKTsKKwkJCVRkZWxheSgxKTsKKwkJCUFjdENsayhpb2Jhc2UsIDApOworCQkJYlRt cCA9IFJlYWRSZWcoaW9iYXNlLCAweDM0KTsKKwkJCWRhdGFfYml0ID0gMSA8PCBpOworCQkJaWYg KGJUbXAgJiBSeEJpdCkKKwkJCQlkYXRhIHw9IGRhdGFfYml0OworCQkJZWxzZQorCQkJCWRhdGEg Jj0gfmRhdGFfYml0OworCQkJVGRlbGF5KDIpOworCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpID0g MDsgaSA8IDI7IGkrKykgeworCQkJQWN0Q2xrKGlvYmFzZSwgMSk7CisJCQlUZGVsYXkoMSk7CisJ CQlBY3RDbGsoaW9iYXNlLCAwKTsKKwkJCVRkZWxheSgyKTsKKwkJfQorCQliVG1wID0gUmVhZFJl Zyhpb2Jhc2UsIDB4MzQpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgMTsgaSsrKSB7CisJCUFjdENs ayhpb2Jhc2UsIDEpOworCQlUZGVsYXkoMSk7CisJCUFjdENsayhpb2Jhc2UsIDApOworCQlUZGVs YXkoMik7CisJfQorCUNsa1R4KGlvYmFzZSwgMCwgMCk7CisJVGRlbGF5KDEpOworCWZvciAoaSA9 IDA7IGkgPCAzOyBpKyspIHsKKwkJQWN0Q2xrKGlvYmFzZSwgMSk7CisJCVRkZWxheSgxKTsKKwkJ QWN0Q2xrKGlvYmFzZSwgMCk7CisJCVRkZWxheSgyKTsKKwl9CisJcmV0dXJuIGRhdGE7Cit9CisK K3ZvaWQgV3JfSW5keChfX3UxNiBpb2Jhc2UsIF9fdTggYWRkciwgX191OCBpbmRleCwgX191OCBk YXRhKQoreworCWludCBpOworCV9fdTggYlRtcDsKKworCUNsa1R4KGlvYmFzZSwgMCwgMCk7CisJ dWRlbGF5KDIpOworCUFjdENsayhpb2Jhc2UsIDEpOworCXVkZWxheSgxKTsKKwliVG1wID0gYWRk ciB8IChpbmRleCA8PCAxKSB8IDE7CisJV3JfQnl0ZShpb2Jhc2UsIGJUbXApOworCVdyX0J5dGUo aW9iYXNlLCBkYXRhKTsKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCUNsa1R4KGlvYmFz ZSwgMCwgMCk7CisJCVRkZWxheSgyKTsKKwkJQWN0Q2xrKGlvYmFzZSwgMSk7CisJCVRkZWxheSgx KTsKKwl9CisJQWN0Q2xrKGlvYmFzZSwgMCk7Cit9CisKK3ZvaWQgUmVzZXREb25nbGUoX191MTYg aW9iYXNlKQoreworCWludCBpOworCUNsa1R4KGlvYmFzZSwgMCwgMCk7CisJVGRlbGF5KDEpOwor CWZvciAoaSA9IDA7IGkgPCAzMDsgaSsrKSB7CisJCUFjdENsayhpb2Jhc2UsIDEpOworCQlUZGVs YXkoMSk7CisJCUFjdENsayhpb2Jhc2UsIDApOworCQlUZGVsYXkoMSk7CisJfQorCUFjdENsayhp b2Jhc2UsIDApOworfQorCit2b2lkIFNldFNJVG1vZGUoX191MTYgaW9iYXNlKQoreworCisJX191 OCBiVG1wOworCisJYlRtcCA9IFJlYWRMUENSZWcoMHgyOCk7CisJV3JpdGVMUENSZWcoMHgyOCwg YlRtcCB8IDB4MTApOwkvL3NlbGVjdCBJVE1PRkYKKwliVG1wID0gUmVhZFJlZyhpb2Jhc2UsIDB4 MzUpOworCVdyaXRlUmVnKGlvYmFzZSwgMHgzNSwgYlRtcCB8IDB4NDApOwkvLyBEcml2ZXIgSVRN T0ZGCisJV3JpdGVSZWcoaW9iYXNlLCAweDI4LCBiVG1wIHwgMHg4MCk7CS8vIGVuYWJsZSBBbGwg aW50ZXJydXB0Cit9CisKK3ZvaWQgU0lfU2V0TW9kZShfX3UxNiBpb2Jhc2UsIGludCBtb2RlKQor eworCS8vX191MzIgZFRtcDsKKwlfX3U4IGJUbXA7CisKKwlXcml0ZUxQQ1JlZygweDI4LCAweDcw KTsJLy8gUy9XIFJlc2V0CisJU2V0U0lUbW9kZShpb2Jhc2UpOworCVJlc2V0RG9uZ2xlKGlvYmFz ZSk7CisJdWRlbGF5KDEwKTsKKwlXcl9JbmR4KGlvYmFzZSwgMHg0MCwgMHgwLCAweDE3KTsJLy9S WCAsQVBFTiBlbmFibGUsTm9ybWFsIHBvd2VyCisJV3JfSW5keChpb2Jhc2UsIDB4NDAsIDB4MSwg bW9kZSk7CS8vU2V0IE1vZGUKKwlXcl9JbmR4KGlvYmFzZSwgMHg0MCwgMHgyLCAweGZmKTsJLy9T ZXQgcG93ZXIgdG8gRklSIFZGSVIgPiAxbQorCWJUbXAgPSBSZF9JbmR4KGlvYmFzZSwgMHg0MCwg MSk7Cit9CisKK3ZvaWQgSW5pdENhcmQoX191MTYgaW9iYXNlKQoreworCVJlc2V0Q2hpcChpb2Jh c2UsIDUpOworCVdyaXRlUmVnKGlvYmFzZSwgSV9TVF9DVF8wLCAweDAwKTsJLy8gb3BlbiBDSElQ IG9uCisJU2V0U0lSQk9GKGlvYmFzZSwgMHhjMCk7CS8vIGhhcmR3YXJlIGRlZmF1bHQgdmFsdWUK KwlTZXRTSVJFT0YoaW9iYXNlLCAweGMxKTsKK30KKwordm9pZCBDb21tb25TaHV0RG93bihfX3Ux NiBpb2Jhc2UsIF9fdTggVHhETUEpCit7CisJRGlzYWJsZURtYUNoYW5uZWwoVHhETUEpOworfQor Cit2b2lkIENvbW1vbkluaXQoX191MTYgaW9iYXNlKQoreworLy8gIEVuVFhDUkMoaW9iYXNlLDAp OworCVN3YXBETUEoaW9iYXNlLCBPRkYpOworCVNldE1heFJ4UGFja2V0U2l6ZShpb2Jhc2UsIDB4 MGZmZik7CS8vc2V0IHRvIG1heDo0MDk1CisJRW5SWEZJRk9SZWFkeUludChpb2Jhc2UsIE9GRik7 CisJRW5SWEZJRk9IYWxmTGV2ZWxJbnQoaW9iYXNlLCBPRkYpOworCUVuVFhGSUZPSGFsZkxldmVs SW50KGlvYmFzZSwgT0ZGKTsKKwlFblRYRklGT1VuZGVycnVuRU9NSW50KGlvYmFzZSwgT04pOwor Ly8gIEVuVFhGSUZPUmVhZHlJbnQoaW9iYXNlLE9OKTsKKwlJbnZlcnRUWChpb2Jhc2UsIE9GRik7 CisJSW52ZXJ0UlgoaW9iYXNlLCBPRkYpOworLy8gIFdyaXRlTFBDUmVnKDB4RjAsMCk7IC8vKGlm IFZUMTIxMSB0aGVuIGRvIHRoaXMpCisJaWYgKElzU0lST24oaW9iYXNlKSkgeworCQlTSVJGaWx0 ZXIoaW9iYXNlLCBPTik7CisJCVNJUlJlY3ZBbnkoaW9iYXNlLCBPTik7CisJfSBlbHNlIHsKKwkJ U0lSRmlsdGVyKGlvYmFzZSwgT0ZGKTsKKwkJU0lSUmVjdkFueShpb2Jhc2UsIE9GRik7CisJfQor CUVuUlhTcGVjSW50KGlvYmFzZSwgT04pOworCVdyaXRlUmVnKGlvYmFzZSwgSV9TVF9DVF8wLCAw eDgwKTsKKwlFbmFibGVETUEoaW9iYXNlLCBPTik7Cit9CisKK3ZvaWQgU2V0QmF1ZFJhdGUoX191 MTYgaW9iYXNlLCBfX3UzMiByYXRlKQoreworCV9fdTggdmFsdWUgPSAxMSwgdGVtcDsKKworCWlm IChJc1NJUk9uKGlvYmFzZSkpIHsKKwkJc3dpdGNoIChyYXRlKSB7CisJCWNhc2UgKF9fdTMyKSAo MjQwMEwpOgorCQkJdmFsdWUgPSA0NzsKKwkJCWJyZWFrOworCQljYXNlIChfX3UzMikgKDk2MDBM KToKKwkJCXZhbHVlID0gMTE7CisJCQlicmVhazsKKwkJY2FzZSAoX191MzIpICgxOTIwMEwpOgor CQkJdmFsdWUgPSA1OworCQkJYnJlYWs7CisJCWNhc2UgKF9fdTMyKSAoMzg0MDBMKToKKwkJCXZh bHVlID0gMjsKKwkJCWJyZWFrOworCQljYXNlIChfX3UzMikgKDU3NjAwTCk6CisJCQl2YWx1ZSA9 IDE7CisJCQlicmVhazsKKwkJY2FzZSAoX191MzIpICgxMTUyMDBMKToKKwkJCXZhbHVlID0gMDsK KwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX07CisJfSBlbHNlIGlmIChJc01J Uk9uKGlvYmFzZSkpIHsKKwkJdmFsdWUgPSAwOwkvLyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZml4 ZWQgaW4gMS4xNTJNCisJfSBlbHNlIGlmIChJc0ZJUk9uKGlvYmFzZSkpIHsKKwkJdmFsdWUgPSAw OwkvLyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZml4ZWQgaW4gNE0KKwl9CisJdGVtcCA9IChSZWFk UmVnKGlvYmFzZSwgSV9DRl9IXzEpICYgMHgwMyk7CisJdGVtcCA9IHRlbXAgfCAodmFsdWUgPDwg Mik7CisJV3JpdGVSZWcoaW9iYXNlLCBJX0NGX0hfMSwgdGVtcCk7Cit9CisKK3ZvaWQgU2V0UHVs c2VXaWR0aChfX3UxNiBpb2Jhc2UsIF9fdTggd2lkdGgpCit7CisJX191OCB0ZW1wLCB0ZW1wMSwg dGVtcDI7CisKKwl0ZW1wID0gKFJlYWRSZWcoaW9iYXNlLCBJX0NGX0xfMSkgJiAweDFmKTsKKwl0 ZW1wMSA9IChSZWFkUmVnKGlvYmFzZSwgSV9DRl9IXzEpICYgMHhmYyk7CisJdGVtcDIgPSAod2lk dGggJiAweDA3KSA8PCA1OworCXRlbXAgPSB0ZW1wIHwgdGVtcDI7CisJdGVtcDIgPSAod2lkdGgg JiAweDE4KSA+PiAzOworCXRlbXAxID0gdGVtcDEgfCB0ZW1wMjsKKwlXcml0ZVJlZyhpb2Jhc2Us IElfQ0ZfTF8xLCB0ZW1wKTsKKwlXcml0ZVJlZyhpb2Jhc2UsIElfQ0ZfSF8xLCB0ZW1wMSk7Cit9 CisKK3ZvaWQgU2V0U2VuZFByZWFtYmxlQ291bnQoX191MTYgaW9iYXNlLCBfX3U4IGNvdW50KQor eworCV9fdTggdGVtcDsKKworCXRlbXAgPSBSZWFkUmVnKGlvYmFzZSwgSV9DRl9MXzEpICYgMHhl MDsKKwl0ZW1wID0gdGVtcCB8IGNvdW50OworCVdyaXRlUmVnKGlvYmFzZSwgSV9DRl9MXzEsIHRl bXApOworCit9CisKK3ZvaWQgU2V0VkZJUihfX3UxNiBCYXNlQWRkciwgX191OCB2YWwpCit7CisJ X191OCB0bXA7CisKKwl0bXAgPSBSZWFkUmVnKEJhc2VBZGRyLCBJX0NGX0xfMCk7CisJV3JpdGVS ZWcoQmFzZUFkZHIsIElfQ0ZfTF8wLCB0bXAgJiAweDhmKTsKKwlXcml0ZVJlZ0JpdChCYXNlQWRk ciwgSV9DRl9IXzAsIDUsIHZhbCk7Cit9CisKK3ZvaWQgU2V0RklSKF9fdTE2IEJhc2VBZGRyLCBf X3U4IHZhbCkKK3sKKwlfX3U4IHRtcDsKKworCVdyaXRlUmVnQml0KEJhc2VBZGRyLCBJX0NGX0hf MCwgNSwgMCk7CisJdG1wID0gUmVhZFJlZyhCYXNlQWRkciwgSV9DRl9MXzApOworCVdyaXRlUmVn KEJhc2VBZGRyLCBJX0NGX0xfMCwgdG1wICYgMHg4Zik7CisJV3JpdGVSZWdCaXQoQmFzZUFkZHIs IElfQ0ZfTF8wLCA2LCB2YWwpOworfQorCit2b2lkIFNldE1JUihfX3UxNiBCYXNlQWRkciwgX191 OCB2YWwpCit7CisJX191OCB0bXA7CisKKwlXcml0ZVJlZ0JpdChCYXNlQWRkciwgSV9DRl9IXzAs IDUsIDApOworCXRtcCA9IFJlYWRSZWcoQmFzZUFkZHIsIElfQ0ZfTF8wKTsKKwlXcml0ZVJlZyhC YXNlQWRkciwgSV9DRl9MXzAsIHRtcCAmIDB4OGYpOworCVdyaXRlUmVnQml0KEJhc2VBZGRyLCBJ X0NGX0xfMCwgNSwgdmFsKTsKK30KKwordm9pZCBTZXRTSVIoX191MTYgQmFzZUFkZHIsIF9fdTgg dmFsKQoreworCV9fdTggdG1wOworCisJV3JpdGVSZWdCaXQoQmFzZUFkZHIsIElfQ0ZfSF8wLCA1 LCAwKTsKKwl0bXAgPSBSZWFkUmVnKEJhc2VBZGRyLCBJX0NGX0xfMCk7CisJV3JpdGVSZWcoQmFz ZUFkZHIsIElfQ0ZfTF8wLCB0bXAgJiAweDhmKTsKKwlXcml0ZVJlZ0JpdChCYXNlQWRkciwgSV9D Rl9MXzAsIDQsIHZhbCk7Cit9CisKK3ZvaWQgQ2xySEJ1c3koX191MTYgaW9iYXNlKQoreworCisJ RW5hYmxlRE1BKGlvYmFzZSwgT0ZGKTsKKwlFbmFibGVETUEoaW9iYXNlLCBPTik7CisJUlhTdGFy dChpb2Jhc2UsIE9GRik7CisJUlhTdGFydChpb2Jhc2UsIE9OKTsKKwlSWFN0YXJ0KGlvYmFzZSwg T0ZGKTsKKwlFbmFibGVETUEoaW9iYXNlLCBPRkYpOworCUVuYWJsZURNQShpb2Jhc2UsIE9OKTsK K30KKwordm9pZCBTZXRGaWZvNjQoX191MTYgaW9iYXNlKQoreworCisJV3JpdGVSZWdCaXQoaW9i YXNlLCBJX0NGX0hfMCwgMCwgMCk7CisJV3JpdGVSZWdCaXQoaW9iYXNlLCBJX0NGX0hfMCwgNywg MCk7Cit9CisKKworI2VuZGlmCQkJCS8qIHZpYV9JUkNDX0ggKi8KLS0tIGxpbnV4LTIuNC4yNC0w LnByZTIuMW1kay5vcmlnL2RyaXZlcnMvbmV0L2lyZGEvTWFrZWZpbGUJMjAwMy0wNi0xMyAxNjo1 MTozNC4wMDAwMDAwMDAgKzAyMDAKKysrIGxpbnV4LTIuNC4yNC0wLnByZTIuMW1kay9kcml2ZXJz L25ldC9pcmRhL01ha2VmaWxlCTIwMDQtMDEtMTMgMTg6MjY6MzcuMDAwMDAwMDAwICswMTAwCkBA IC0yMCw2ICsyMCw3IEBAIG9iai0kKENPTkZJR19TQTExMDBfRklSKQkrPSBzYTExMDBfaXIubwog b2JqLSQoQ09ORklHX1RPU0hJQkFfT0xEKQkrPSB0b3Nob2JvZS5vCiBvYmotJChDT05GSUdfVE9T SElCQV9GSVIpCSs9IGRvbmF1Ym9lLm8KIG9iai0kKENPTkZJR19TTUNfSVJDQ19GSVIpCSs9IHNt Yy1pcmNjLm8JaXJwb3J0Lm8KK29iai0kKENPTkZJR19WSUFfSVJDQ19GSVIpICAgICAgKz0gdmlh LWlyY2Mubwogb2JqLSQoQ09ORklHX0FMSV9GSVIpCQkrPSBhbGktaXJjYy5vCiBvYmotJChDT05G SUdfVkxTSV9GSVIpCQkrPSB2bHNpX2lyLm8KIG9iai0kKENPTkZJR19FU0lfRE9OR0xFKQkrPSBl c2kubwotLS0gbGludXgtMi40LjI0LTAucHJlMi4xbWRrLm9yaWcvZHJpdmVycy9uZXQvaXJkYS9D b25maWcuaW4JMjAwMy0wNi0xMyAxNjo1MTozNC4wMDAwMDAwMDAgKzAyMDAKKysrIGxpbnV4LTIu NC4yNC0wLnByZTIuMW1kay9kcml2ZXJzL25ldC9pcmRhL0NvbmZpZy5pbgkyMDA0LTAxLTEzIDE4 OjI0OjU4LjAwMDAwMDAwMCArMDEwMApAQCAtMzUsNiArMzUsNyBAQCBpZiBbICIkQ09ORklHX01J UFMiID0gInkiIF07IHRoZW4KIGZpCiBpZiBbICIkQ09ORklHX0VYUEVSSU1FTlRBTCIgIT0gIm4i IF07IHRoZW4KIGRlcF90cmlzdGF0ZSAnU01DIElyQ0MgKEV4cGVyaW1lbnRhbCknIENPTkZJR19T TUNfSVJDQ19GSVIgJENPTkZJR19JUkRBCitkZXBfdHJpc3RhdGUgJ1ZJQSBJckNDIChFeHBlcmlt ZW50YWwpJyBDT05GSUdfVklBX0lSQ0NfRklSICRDT05GSUdfSVJEQQogZGVwX3RyaXN0YXRlICdB TGkgTTUxMjMgRklSIChFeHBlcmltZW50YWwpJyBDT05GSUdfQUxJX0ZJUiAkQ09ORklHX0lSREEK IGRlcF90cmlzdGF0ZSAnVkxTSSA4MkMxNDcgU0lSL01JUi9GSVIgKEV4cGVyaW1lbnRhbCknIENP TkZJR19WTFNJX0ZJUiAkQ09ORklHX0lSREEKIGZpCi0tLSBsaW51eC0yLjQuMjQtMC5wcmUyLjFt ZGsub3JpZy9uZXQvaXJkYS9pcmRhX2RldmljZS5jCTIwMDMtMTEtMjggMTk6MjY6MjEuMDAwMDAw MDAwICswMTAwCisrKyBsaW51eC0yLjQuMjQtMC5wcmUyLjFtZGsvbmV0L2lyZGEvaXJkYV9kZXZp Y2UuYwkyMDA0LTAxLTEzIDE4OjM1OjAxLjAwMDAwMDAwMCArMDEwMApAQCAtMTQ1LDYgKzE0NSw5 IEBAIGludCBfX2luaXQgaXJkYV9kZXZpY2VfaW5pdCggdm9pZCkKICNpZmRlZiBDT05GSUdfU01D X0lSQ0NfRklSCiAJaXJjY19pbml0KCk7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfVklBX0lSQ0Nf RklSCisJdmlhX2lyY2NfaW5pdCgpOworI2VuZGlmCiAjaWZkZWYgQ09ORklHX0VTSV9ET05HTEUK IAllc2lfaW5pdCgpOwogI2VuZGlmCi0tLSBsaW51eC0yLjQuMjQtMC5wcmUyLjFtZGsub3JpZy9E b2N1bWVudGF0aW9uL0NvbmZpZ3VyZS5oZWxwCTIwMDQtMDEtMTMgMTg6MDI6NDcuMDAwMDAwMDAw ICswMTAwCisrKyBsaW51eC0yLjQuMjQtMC5wcmUyLjFtZGsvRG9jdW1lbnRhdGlvbi9Db25maWd1 cmUuaGVscAkyMDA0LTAxLTEzIDE4OjQzOjM3LjAwMDAwMDAwMCArMDEwMApAQCAtMjc3NzQsNiAr Mjc3NzQsMTQgQEAgQ09ORklHX1NNQ19JUkNDX0ZJUgogICBoZXJlIGFuZCByZWFkIDxmaWxlOkRv Y3VtZW50YXRpb24vbW9kdWxlcy50eHQ+LiAgVGhlIG1vZHVsZSB3aWxsIGJlCiAgIGNhbGxlZCBz bWMtaXJjYy5vLgogCitWSUEgSXJDQworQ09ORklHX1ZJQV9JUkNDX0ZJUgorICBTYXkgWSBoZXJl IGlmIHlvdSB3YW50IHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBWSUEgRmFzdCBJbmZyYXJlZAor ICBDb21tdW5pY2F0aW9ucyBDb250cm9sbGVyLiAgSXQgaXMgdXNlZCBpbiBhbGwgc29ydHMgb2Yg VklBNjg2YS0gYW5kCisgIFZUMTIxMS1iYXNlZCBub3RlYm9va3MuIElmIHlvdSB3YW50IHRvIGNv bXBpbGUgaXQgYXMgYSBtb2R1bGUsIHNheSBNCisgIGhlcmUgYW5kIHJlYWQgPGZpbGU6RG9jdW1l bnRhdGlvbi9tb2R1bGVzLnR4dD4uICBUaGUgbW9kdWxlIHdpbGwgYmUKKyAgY2FsbGVkIHZpYS1p cmNjLm8uCisKIEFMaSBNNTEyMyBGSVIgY29udHJvbGxlciBkcml2ZXIKIENPTkZJR19BTElfRklS CiAgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIEFMaSBN NTEyMyBGSVIKLS0tIGxpbnV4LTIuNC4yNC0wLnByZTIuMW1kay5vcmlnL01BSU5UQUlORVJTCTIw MDQtMDEtMTMgMTg6MDI6MzcuMDAwMDAwMDAwICswMTAwCisrKyBsaW51eC0yLjQuMjQtMC5wcmUy LjFtZGsvTUFJTlRBSU5FUlMJMjAwNC0wMS0xMyAxODo1ODoyNy4wMDAwMDAwMDAgKzAxMDAKQEAg LTIxMTAsNiArMjExMCwxMSBAQCBQOglSb2dlciBMdWV0aGkKIE06CXJsQGhlbGxnYXRlLmNoCiBT OglNYWludGFpbmVkCiAKK1ZJQS1JUkNDIElSREEgRFJJVkVSCitQOglKZW5zIERhdmlkCitNOglk ZzFramRAYWZ0aGQudHUtZGFybXN0YWR0LmRlCitTOglNYWludGFpbmVkCisKIFVTQiBESUFNT05E IFJJTzUwMCBEUklWRVIKIFA6CUNlc2FyIE1pcXVlbAogTToJbWlxdWVsQGRmLnViYS5hcgo= --------------Boundary-00=_JS9GOF69AODVPQXISBZV-- - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/