From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [2/4] EDAC, skx_edac: Delete the duplicated codes From: "Luck, Tony" Message-Id: <20190125195902.17109-3-tony.luck@intel.com> Date: Fri, 25 Jan 2019 11:59:00 -0800 To: Borislav Petkov Cc: Qiuxu Zhuo , Tony Luck , Aristeu Rozanski , Mauro Carvalho Chehab , Kan Liang , linux-edac@vger.kernel.org, linux-kernel@vger.kernel.org List-ID: RnJvbTogUWl1eHUgWmh1byA8cWl1eHUuemh1b0BpbnRlbC5jb20+CgpQYXJ0IG9mIHRoZSBza3hf ZWRhYyBkcml2ZXIgY29kZXMgYXJlIGNhcnZlZCB0byB0aGUgc2t4X2NvbW1fZWRhYy5jCmZpbGUs IHdoaWNoIGFyZSB1c2VkIGJ5IGJvdGggc2t4X2VkYWMgZHJpdmVyIGFuZCBpMTBubV9lZGFjIGRy aXZlci4KRGVsZXRlIHRoZSBkdXBsaWNhdGVkIGNvZGVzIGZyb20gdGhlIHNreF9lZGFjLmMgZmls ZSBhbmQgcmVuYW1lCnNreF9lZGFjLmMgdG8gc2t4X2Jhc2UuYy4gVXBkYXRlIHRoZSBNYWtlZmls ZSB0byBidWlsZCB0aGUgc2t4X2VkYWMKZHJpdmVyIGZyb20gc2t4X2Jhc2UuYyBwbHV4IHNreF9j b21tX2VkYWMuYwoKQ28tZGV2ZWxvcGVkLWJ5OiBUb255IEx1Y2sgPHRvbnkubHVja0BpbnRlbC5j b20+ClNpZ25lZC1vZmYtYnk6IFFpdXh1IFpodW8gPHFpdXh1LnpodW9AaW50ZWwuY29tPgpTaWdu ZWQtb2ZmLWJ5OiBUb255IEx1Y2sgPHRvbnkubHVja0BpbnRlbC5jb20+Ci0tLQogZHJpdmVycy9l ZGFjL01ha2VmaWxlICAgfCAgICA0ICstCiBkcml2ZXJzL2VkYWMvc2t4X2Jhc2UuYyB8ICA2NzMg KysrKysrKysrKysrKysrKysrKwogZHJpdmVycy9lZGFjL3NreF9lZGFjLmMgfCAxMzU4IC0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogMyBmaWxlcyBjaGFuZ2VkLCA2NzYg aW5zZXJ0aW9ucygrKSwgMTM1OSBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2 ZXJzL2VkYWMvc2t4X2Jhc2UuYwogZGVsZXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZWRhYy9za3hf ZWRhYy5jCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL01ha2VmaWxlIGIvZHJpdmVycy9lZGFj L01ha2VmaWxlCmluZGV4IDcxNjA5NmQwOGVhMC4uMTc2NGI3ZWQwNWRiIDEwMDY0NAotLS0gYS9k cml2ZXJzL2VkYWMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9lZGFjL01ha2VmaWxlCkBAIC0zMCw3 ICszMCw2IEBAIG9iai0kKENPTkZJR19FREFDX0k1NDAwKQkJKz0gaTU0MDBfZWRhYy5vCiBvYmot JChDT05GSUdfRURBQ19JNzMwMCkJCSs9IGk3MzAwX2VkYWMubwogb2JqLSQoQ09ORklHX0VEQUNf STdDT1JFKQkJKz0gaTdjb3JlX2VkYWMubwogb2JqLSQoQ09ORklHX0VEQUNfU0JSSURHRSkJCSs9 IHNiX2VkYWMubwotb2JqLSQoQ09ORklHX0VEQUNfU0tYKQkJCSs9IHNreF9lZGFjLm8KIG9iai0k KENPTkZJR19FREFDX1BORDIpCQkJKz0gcG5kMl9lZGFjLm8KIG9iai0kKENPTkZJR19FREFDX0U3 WFhYKQkJKz0gZTd4eHhfZWRhYy5vCiBvYmotJChDT05GSUdfRURBQ19FNzUyWCkJCSs9IGU3NTJ4 X2VkYWMubwpAQCAtNTgsNiArNTcsOSBAQCBvYmotJChDT05GSUdfRURBQ19NUEM4NVhYKQkJKz0g bXBjODV4eF9lZGFjX21vZC5vCiBsYXllcnNjYXBlX2VkYWNfbW9kLXkJCQk6PSBmc2xfZGRyX2Vk YWMubyBsYXllcnNjYXBlX2VkYWMubwogb2JqLSQoQ09ORklHX0VEQUNfTEFZRVJTQ0FQRSkJCSs9 IGxheWVyc2NhcGVfZWRhY19tb2QubwogCitza3hfZWRhYy15CQkJCTo9IHNreF9jb21tX2VkYWMu byBza3hfYmFzZS5vCitvYmotJChDT05GSUdfRURBQ19TS1gpCQkJKz0gc2t4X2VkYWMubworCiBv YmotJChDT05GSUdfRURBQ19NVjY0WDYwKQkJKz0gbXY2NHg2MF9lZGFjLm8KIG9iai0kKENPTkZJ R19FREFDX0NFTEwpCQkJKz0gY2VsbF9lZGFjLm8KIG9iai0kKENPTkZJR19FREFDX1BQQzRYWCkJ CSs9IHBwYzR4eF9lZGFjLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9za3hfYmFzZS5jIGIv ZHJpdmVycy9lZGFjL3NreF9iYXNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw MDAwMDAwLi40YWE1M2MxNWI4OWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2VkYWMvc2t4 X2Jhc2UuYwpAQCAtMCwwICsxLDY3MyBAQAorLyoKKyAqIEVEQUMgZHJpdmVyIGZvciBJbnRlbChS KSBYZW9uKFIpIFNreWxha2UgcHJvY2Vzc29ycworICogQ29weXJpZ2h0IChjKSAyMDE2LCBJbnRl bCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91 IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1z IGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZl cnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisg KgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUg dXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGlt cGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBB UlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9y CisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2lu Y2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8 bGludXgvZG1pLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcGNp X2lkcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5o PgorI2luY2x1ZGUgPGxpbnV4L2VkYWMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbXpvbmUuaD4KKyNp bmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KKyNpbmNsdWRl IDxsaW51eC9tYXRoNjQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KKyNp bmNsdWRlIDxsaW51eC9hZHhsLmg+CisjaW5jbHVkZSA8YWNwaS9uZml0Lmg+CisjaW5jbHVkZSA8 YXNtL2NwdV9kZXZpY2VfaWQuaD4KKyNpbmNsdWRlIDxhc20vaW50ZWwtZmFtaWx5Lmg+CisjaW5j bHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9tY2UuaD4KKworI2luY2x1ZGUg ImVkYWNfbW9kdWxlLmgiCisjaW5jbHVkZSAic2t4X2NvbW1fZWRhYy5oIgorCisjZGVmaW5lIEVE QUNfTU9EX1NUUiAgICAic2t4X2VkYWMiCisKKy8qCisgKiBEZWJ1ZyBtYWNyb3MKKyAqLworI2Rl ZmluZSBza3hfcHJpbnRrKGxldmVsLCBmbXQsIGFyZy4uLikJCQlcCisJZWRhY19wcmludGsobGV2 ZWwsICJza3giLCBmbXQsICMjYXJnKQorCisjZGVmaW5lIHNreF9tY19wcmludGsobWNpLCBsZXZl bCwgZm10LCBhcmcuLi4pCQlcCisJZWRhY19tY19jaGlwc2V0X3ByaW50ayhtY2ksIGxldmVsLCAi c2t4IiwgZm10LCAjI2FyZykKKworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgKnNreF9lZGFjX2xp c3Q7CisKK3N0YXRpYyB1NjQgc2t4X3RvbG0sIHNreF90b2htOworc3RhdGljIGludCBza3hfbnVt X3NvY2tldHM7CitzdGF0aWMgdW5zaWduZWQgaW50IG52ZGltbV9jb3VudDsKKworI2RlZmluZQlN QVNLMjYJMHgzRkZGRkZGCQkvKiBNYXNrIGZvciAyXjI2ICovCisjZGVmaW5lIE1BU0syOQkweDFG RkZGRkZGCQkvKiBNYXNrIGZvciAyXjI5ICovCisKK3N0YXRpYyBzdHJ1Y3Qgc2t4X2RldiAqZ2V0 X3NreF9kZXYoc3RydWN0IHBjaV9idXMgKmJ1cywgdTggaWR4KQoreworCXN0cnVjdCBza3hfZGV2 ICpkOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkLCBza3hfZWRhY19saXN0LCBsaXN0KSB7CisJ CWlmIChkLT5zZWcgPT0gcGNpX2RvbWFpbl9ucihidXMpICYmIGQtPmJ1c1tpZHhdID09IGJ1cy0+ bnVtYmVyKQorCQkJcmV0dXJuIGQ7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK2VudW0gbXVu aXR0eXBlIHsKKwlDSEFOMCwgQ0hBTjEsIENIQU4yLCBTQURfQUxMLCBVVElMX0FMTCwgU0FECit9 OworCitzdHJ1Y3QgbXVuaXQgeworCXUxNglkaWQ7CisJdTE2CWRldmZuW1NLWF9OVU1fSU1DXTsK Kwl1OAlidXNpZHg7CisJdTgJcGVyX3NvY2tldDsKKwllbnVtIG11bml0dHlwZSBtdHlwZTsKK307 CisKKy8qCisgKiBMaXN0IG9mIFBDSSBkZXZpY2UgaWRzIHRoYXQgd2UgbmVlZCB0b2dldGhlciB3 aXRoIHNvbWUgZGV2aWNlCisgKiBudW1iZXIgYW5kIGZ1bmN0aW9uIG51bWJlcnMgdG8gdGVsbCB3 aGljaCBtZW1vcnkgY29udHJvbGxlciB0aGUKKyAqIGRldmljZSBiZWxvbmdzIHRvLgorICovCitz dGF0aWMgY29uc3Qgc3RydWN0IG11bml0IHNreF9hbGxfbXVuaXRzW10gPSB7CisJeyAweDIwNTQs IHsgfSwgMSwgMSwgU0FEX0FMTCB9LAorCXsgMHgyMDU1LCB7IH0sIDEsIDEsIFVUSUxfQUxMIH0s CisJeyAweDIwNDAsIHsgUENJX0RFVkZOKDEwLCAwKSwgUENJX0RFVkZOKDEyLCAwKSB9LCAyLCAy LCBDSEFOMCB9LAorCXsgMHgyMDQ0LCB7IFBDSV9ERVZGTigxMCwgNCksIFBDSV9ERVZGTigxMiwg NCkgfSwgMiwgMiwgQ0hBTjEgfSwKKwl7IDB4MjA0OCwgeyBQQ0lfREVWRk4oMTEsIDApLCBQQ0lf REVWRk4oMTMsIDApIH0sIDIsIDIsIENIQU4yIH0sCisJeyAweDIwOGUsIHsgfSwgMSwgMCwgU0FE IH0sCisJeyB9Cit9OworCitzdGF0aWMgaW50IGdldF9hbGxfbXVuaXRzKGNvbnN0IHN0cnVjdCBt dW5pdCAqbSkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiwgKnByZXY7CisJc3RydWN0IHNreF9k ZXYgKmQ7CisJdTMyIHJlZzsKKwlpbnQgaSA9IDAsIG5kZXYgPSAwOworCisJcHJldiA9IE5VTEw7 CisJZm9yICg7OykgeworCQlwZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRF TCwgbS0+ZGlkLCBwcmV2KTsKKwkJaWYgKCFwZGV2KQorCQkJYnJlYWs7CisJCW5kZXYrKzsKKwkJ aWYgKG0tPnBlcl9zb2NrZXQgPT0gU0tYX05VTV9JTUMpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBT S1hfTlVNX0lNQzsgaSsrKQorCQkJCWlmIChtLT5kZXZmbltpXSA9PSBwZGV2LT5kZXZmbikKKwkJ CQkJYnJlYWs7CisJCQlpZiAoaSA9PSBTS1hfTlVNX0lNQykKKwkJCQlnb3RvIGZhaWw7CisJCX0K KwkJZCA9IGdldF9za3hfZGV2KHBkZXYtPmJ1cywgbS0+YnVzaWR4KTsKKwkJaWYgKCFkKQorCQkJ Z290byBmYWlsOworCisJCS8qIEJlIHN1cmUgdGhhdCB0aGUgZGV2aWNlIGlzIGVuYWJsZWQgKi8K KwkJaWYgKHVubGlrZWx5KHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpIDwgMCkpIHsKKwkJCXNreF9w cmludGsoS0VSTl9FUlIsICJDb3VsZG4ndCBlbmFibGUgZGV2aWNlICUwNHg6JTA0eFxuIiwKKwkJ CQkgICBQQ0lfVkVORE9SX0lEX0lOVEVMLCBtLT5kaWQpOworCQkJZ290byBmYWlsOworCQl9CisK KwkJc3dpdGNoIChtLT5tdHlwZSkgeworCQljYXNlIENIQU4wOiBjYXNlIENIQU4xOiBjYXNlIENI QU4yOgorCQkJcGNpX2Rldl9nZXQocGRldik7CisJCQlkLT5pbWNbaV0uY2hhblttLT5tdHlwZV0u Y2RldiA9IHBkZXY7CisJCQlicmVhazsKKwkJY2FzZSBTQURfQUxMOgorCQkJcGNpX2Rldl9nZXQo cGRldik7CisJCQlkLT5zYWRfYWxsID0gcGRldjsKKwkJCWJyZWFrOworCQljYXNlIFVUSUxfQUxM OgorCQkJcGNpX2Rldl9nZXQocGRldik7CisJCQlkLT51dGlsX2FsbCA9IHBkZXY7CisJCQlicmVh azsKKwkJY2FzZSBTQUQ6CisJCQkvKgorCQkJICogb25lIG9mIHRoZXNlIGRldmljZXMgcGVyIGNv cmUsIGluY2x1ZGluZyBjb3JlcworCQkJICogdGhhdCBkb24ndCBleGlzdCBvbiB0aGlzIFNLVS4g SWdub3JlIGFueSB0aGF0CisJCQkgKiByZWFkIGEgcm91dGUgdGFibGUgb2YgemVybywgbWFrZSBz dXJlIGFsbCB0aGUKKwkJCSAqIG5vbi16ZXJvIHZhbHVlcyBtYXRjaC4KKwkJCSAqLworCQkJcGNp X3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIDB4QjQsICZyZWcpOworCQkJaWYgKHJlZyAhPSAwKSB7 CisJCQkJaWYgKGQtPm1jcm91dGUgPT0gMCkgeworCQkJCQlkLT5tY3JvdXRlID0gcmVnOworCQkJ CX0gZWxzZSBpZiAoZC0+bWNyb3V0ZSAhPSByZWcpIHsKKwkJCQkJc2t4X3ByaW50ayhLRVJOX0VS UiwgIm1jcm91dGUgbWlzbWF0Y2hcbiIpOworCQkJCQlnb3RvIGZhaWw7CisJCQkJfQorCQkJfQor CQkJbmRldi0tOworCQkJYnJlYWs7CisJCX0KKworCQlwcmV2ID0gcGRldjsKKwl9CisKKwlyZXR1 cm4gbmRldjsKK2ZhaWw6CisJcGNpX2Rldl9wdXQocGRldik7CisJcmV0dXJuIC1FTk9ERVY7Cit9 CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeDg2X2NwdV9pZCBza3hfY3B1aWRzW10gPSB7CisJeyBY ODZfVkVORE9SX0lOVEVMLCA2LCBJTlRFTF9GQU02X1NLWUxBS0VfWCwgMCwgMCB9LAorCXsgfQor fTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoeDg2Y3B1LCBza3hfY3B1aWRzKTsKKworI2RlZmluZSBT S1hfR0VUX01UTVRSKGRldiwgcmVnKSBcCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKChkZXYpLCAw eDg3YywgJihyZWcpKQorCitzdGF0aWMgYm9vbCBza3hfY2hlY2tfZWNjKHN0cnVjdCBwY2lfZGV2 ICpwZGV2KQoreworCXUzMiBtdG10cjsKKworCVNLWF9HRVRfTVRNVFIocGRldiwgbXRtdHIpOwor CisJcmV0dXJuICEhR0VUX0JJVEZJRUxEKG10bXRyLCAyLCAyKTsKK30KKworc3RhdGljIGludCBz a3hfZ2V0X2RpbW1fY29uZmlnKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSkKK3sKKwlzdHJ1Y3Qg c2t4X3B2dCAqcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKwlzdHJ1Y3Qgc2t4X2ltYyAqaW1jID0gcHZ0 LT5pbWM7CisJdTMyIG10ciwgYW1hcCwgbWNkZHJ0Y2ZnOworCXN0cnVjdCBkaW1tX2luZm8gKmRp bW07CisJaW50IGksIGo7CisJaW50IG5kaW1tczsKKworCWZvciAoaSA9IDA7IGkgPCBTS1hfTlVN X0NIQU5ORUxTOyBpKyspIHsKKwkJbmRpbW1zID0gMDsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3Jk KGltYy0+Y2hhbltpXS5jZGV2LCAweDhDLCAmYW1hcCk7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29y ZChpbWMtPmNoYW5baV0uY2RldiwgMHg0MDAsICZtY2RkcnRjZmcpOworCQlmb3IgKGogPSAwOyBq IDwgU0tYX05VTV9ESU1NUzsgaisrKSB7CisJCQlkaW1tID0gRURBQ19ESU1NX1BUUihtY2ktPmxh eWVycywgbWNpLT5kaW1tcywKKwkJCQkJICAgICBtY2ktPm5fbGF5ZXJzLCBpLCBqLCAwKTsKKwkJ CXBjaV9yZWFkX2NvbmZpZ19kd29yZChpbWMtPmNoYW5baV0uY2RldiwKKwkJCQkJICAgICAgMHg4 MCArIDQgKiBqLCAmbXRyKTsKKwkJCWlmIChJU19ESU1NX1BSRVNFTlQobXRyKSkgeworCQkJCW5k aW1tcyArPSBza3hfZ2V0X2RpbW1faW5mbyhtdHIsIGFtYXAsIGRpbW0sIGltYywgaSwgaik7CisJ CQl9IGVsc2UgaWYgKElTX05WRElNTV9QUkVTRU5UKG1jZGRydGNmZywgaikpIHsKKwkJCQluZGlt bXMgKz0gc2t4X2dldF9udmRpbW1faW5mbyhkaW1tLCBpbWMsIGksIGosCisJCQkJCQkJICAgICAg RURBQ19NT0RfU1RSKTsKKwkJCQludmRpbW1fY291bnQrKzsKKwkJCX0KKwkJfQorCQlpZiAobmRp bW1zICYmICFza3hfY2hlY2tfZWNjKGltYy0+Y2hhblswXS5jZGV2KSkgeworCQkJc2t4X3ByaW50 ayhLRVJOX0VSUiwgIkVDQyBpcyBkaXNhYmxlZCBvbiBpbWMgJWRcbiIsIGltYy0+bWMpOworCQkJ cmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZQlTS1hf TUFYX1NBRCAyNAorCisjZGVmaW5lIFNLWF9HRVRfU0FEKGQsIGksIHJlZykJXAorCXBjaV9yZWFk X2NvbmZpZ19kd29yZCgoZCktPnNhZF9hbGwsIDB4NjAgKyA4ICogKGkpLCAmKHJlZykpCisjZGVm aW5lIFNLWF9HRVRfSUxWKGQsIGksIHJlZykJXAorCXBjaV9yZWFkX2NvbmZpZ19kd29yZCgoZCkt PnNhZF9hbGwsIDB4NjQgKyA4ICogKGkpLCAmKHJlZykpCisKKyNkZWZpbmUJU0tYX1NBRF9NT0Qz TU9ERShzYWQpCUdFVF9CSVRGSUVMRCgoc2FkKSwgMzAsIDMxKQorI2RlZmluZQlTS1hfU0FEX01P RDMoc2FkKQlHRVRfQklURklFTEQoKHNhZCksIDI3LCAyNykKKyNkZWZpbmUgU0tYX1NBRF9MSU1J VChzYWQpCSgoKHU2NClHRVRfQklURklFTEQoKHNhZCksIDcsIDI2KSA8PCAyNikgfCBNQVNLMjYp CisjZGVmaW5lCVNLWF9TQURfTU9EM0FTTU9EMihzYWQpCUdFVF9CSVRGSUVMRCgoc2FkKSwgNSwg NikKKyNkZWZpbmUJU0tYX1NBRF9BVFRSKHNhZCkJR0VUX0JJVEZJRUxEKChzYWQpLCAzLCA0KQor I2RlZmluZQlTS1hfU0FEX0lOVEVSTEVBVkUoc2FkKQlHRVRfQklURklFTEQoKHNhZCksIDEsIDIp CisjZGVmaW5lIFNLWF9TQURfRU5BQkxFKHNhZCkJR0VUX0JJVEZJRUxEKChzYWQpLCAwLCAwKQor CisjZGVmaW5lIFNLWF9JTFZfUkVNT1RFKHRndCkJKCgodGd0KSAmIDgpID09IDApCisjZGVmaW5l IFNLWF9JTFZfVEFSR0VUKHRndCkJKCh0Z3QpICYgNykKKworc3RhdGljIGJvb2wgc2t4X3NhZF9k ZWNvZGUoc3RydWN0IGRlY29kZWRfYWRkciAqcmVzKQoreworCXN0cnVjdCBza3hfZGV2ICpkID0g bGlzdF9maXJzdF9lbnRyeShza3hfZWRhY19saXN0LCB0eXBlb2YoKmQpLCBsaXN0KTsKKwl1NjQg YWRkciA9IHJlcy0+YWRkcjsKKwlpbnQgaSwgaWR4LCB0Z3QsIGxjaGFuLCBzaGlmdDsKKwl1MzIg c2FkLCBpbHY7CisJdTY0IGxpbWl0LCBwcmV2X2xpbWl0OworCWludCByZW1vdGUgPSAwOworCisJ LyogU2ltcGxlIHNhbml0eSBjaGVjayBmb3IgSS9PIHNwYWNlIG9yIG91dCBvZiByYW5nZSAqLwor CWlmIChhZGRyID49IHNreF90b2htIHx8IChhZGRyID49IHNreF90b2xtICYmIGFkZHIgPCBCSVRf VUxMKDMyKSkpIHsKKwkJZWRhY19kYmcoMCwgIkFkZHJlc3MgMHglbGx4IG91dCBvZiByYW5nZVxu IiwgYWRkcik7CisJCXJldHVybiBmYWxzZTsKKwl9CisKK3Jlc3RhcnQ6CisJcHJldl9saW1pdCA9 IDA7CisJZm9yIChpID0gMDsgaSA8IFNLWF9NQVhfU0FEOyBpKyspIHsKKwkJU0tYX0dFVF9TQUQo ZCwgaSwgc2FkKTsKKwkJbGltaXQgPSBTS1hfU0FEX0xJTUlUKHNhZCk7CisJCWlmIChTS1hfU0FE X0VOQUJMRShzYWQpKSB7CisJCQlpZiAoYWRkciA+PSBwcmV2X2xpbWl0ICYmIGFkZHIgPD0gbGlt aXQpCisJCQkJZ290byBzYWRfZm91bmQ7CisJCX0KKwkJcHJldl9saW1pdCA9IGxpbWl0ICsgMTsK Kwl9CisJZWRhY19kYmcoMCwgIk5vIFNBRCBlbnRyeSBmb3IgMHglbGx4XG4iLCBhZGRyKTsKKwly ZXR1cm4gZmFsc2U7CisKK3NhZF9mb3VuZDoKKwlTS1hfR0VUX0lMVihkLCBpLCBpbHYpOworCisJ c3dpdGNoIChTS1hfU0FEX0lOVEVSTEVBVkUoc2FkKSkgeworCWNhc2UgMDoKKwkJaWR4ID0gR0VU X0JJVEZJRUxEKGFkZHIsIDYsIDgpOworCQlicmVhazsKKwljYXNlIDE6CisJCWlkeCA9IEdFVF9C SVRGSUVMRChhZGRyLCA4LCAxMCk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJaWR4ID0gR0VUX0JJ VEZJRUxEKGFkZHIsIDEyLCAxNCk7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJaWR4ID0gR0VUX0JJ VEZJRUxEKGFkZHIsIDMwLCAzMik7CisJCWJyZWFrOworCX0KKworCXRndCA9IEdFVF9CSVRGSUVM RChpbHYsIDQgKiBpZHgsIDQgKiBpZHggKyAzKTsKKworCS8qIElmIHBvaW50IHRvIGFub3RoZXIg bm9kZSwgZmluZCBpdCBhbmQgc3RhcnQgb3ZlciAqLworCWlmIChTS1hfSUxWX1JFTU9URSh0Z3Qp KSB7CisJCWlmIChyZW1vdGUpIHsKKwkJCWVkYWNfZGJnKDAsICJEb3VibGUgcmVtb3RlIVxuIik7 CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmVtb3RlID0gMTsKKwkJbGlzdF9mb3JfZWFjaF9l bnRyeShkLCBza3hfZWRhY19saXN0LCBsaXN0KSB7CisJCQlpZiAoZC0+aW1jWzBdLnNyY19pZCA9 PSBTS1hfSUxWX1RBUkdFVCh0Z3QpKQorCQkJCWdvdG8gcmVzdGFydDsKKwkJfQorCQllZGFjX2Ri ZygwLCAiQ2FuJ3QgZmluZCBub2RlICVkXG4iLCBTS1hfSUxWX1RBUkdFVCh0Z3QpKTsKKwkJcmV0 dXJuIGZhbHNlOworCX0KKworCWlmIChTS1hfU0FEX01PRDMoc2FkKSA9PSAwKSB7CisJCWxjaGFu ID0gU0tYX0lMVl9UQVJHRVQodGd0KTsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKFNLWF9TQURfTU9E M01PREUoc2FkKSkgeworCQljYXNlIDA6CisJCQlzaGlmdCA9IDY7CisJCQlicmVhazsKKwkJY2Fz ZSAxOgorCQkJc2hpZnQgPSA4OworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXNoaWZ0ID0gMTI7 CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWVkYWNfZGJnKDAsICJpbGxlZ2FsIG1vZDNtb2Rl XG4iKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlzd2l0Y2ggKFNLWF9TQURfTU9EM0FTTU9E MihzYWQpKSB7CisJCWNhc2UgMDoKKwkJCWxjaGFuID0gKGFkZHIgPj4gc2hpZnQpICUgMzsKKwkJ CWJyZWFrOworCQljYXNlIDE6CisJCQlsY2hhbiA9IChhZGRyID4+IHNoaWZ0KSAlIDI7CisJCQli cmVhazsKKwkJY2FzZSAyOgorCQkJbGNoYW4gPSAoYWRkciA+PiBzaGlmdCkgJSAyOworCQkJbGNo YW4gPSAobGNoYW4gPDwgMSkgfCAhbGNoYW47CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJbGNo YW4gPSAoKGFkZHIgPj4gc2hpZnQpICUgMikgPDwgMTsKKwkJCWJyZWFrOworCQl9CisJCWxjaGFu ID0gKGxjaGFuIDw8IDEpIHwgKFNLWF9JTFZfVEFSR0VUKHRndCkgJiAxKTsKKwl9CisKKwlyZXMt PmRldiA9IGQ7CisJcmVzLT5zb2NrZXQgPSBkLT5pbWNbMF0uc3JjX2lkOworCXJlcy0+aW1jID0g R0VUX0JJVEZJRUxEKGQtPm1jcm91dGUsIGxjaGFuICogMywgbGNoYW4gKiAzICsgMik7CisJcmVz LT5jaGFubmVsID0gR0VUX0JJVEZJRUxEKGQtPm1jcm91dGUsIGxjaGFuICogMiArIDE4LCBsY2hh biAqIDIgKyAxOSk7CisKKwllZGFjX2RiZygyLCAiMHglbGx4OiBzb2NrZXQ9JWQgaW1jPSVkIGNo YW5uZWw9JWRcbiIsCisJCSByZXMtPmFkZHIsIHJlcy0+c29ja2V0LCByZXMtPmltYywgcmVzLT5j aGFubmVsKTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworI2RlZmluZQlTS1hfTUFYX1RBRCA4CisKKyNk ZWZpbmUgU0tYX0dFVF9UQURCQVNFKGQsIG1jLCBpLCByZWcpCQkJXAorCXBjaV9yZWFkX2NvbmZp Z19kd29yZCgoZCktPmltY1ttY10uY2hhblswXS5jZGV2LCAweDg1MCArIDQgKiAoaSksICYocmVn KSkKKyNkZWZpbmUgU0tYX0dFVF9UQURXQVlORVNTKGQsIG1jLCBpLCByZWcpCQlcCisJcGNpX3Jl YWRfY29uZmlnX2R3b3JkKChkKS0+aW1jW21jXS5jaGFuWzBdLmNkZXYsIDB4ODgwICsgNCAqIChp KSwgJihyZWcpKQorI2RlZmluZSBTS1hfR0VUX1RBRENITklMVk9GRlNFVChkLCBtYywgY2gsIGks IHJlZykJXAorCXBjaV9yZWFkX2NvbmZpZ19kd29yZCgoZCktPmltY1ttY10uY2hhbltjaF0uY2Rl diwgMHg5MCArIDQgKiAoaSksICYocmVnKSkKKworI2RlZmluZQlTS1hfVEFEX0JBU0UoYikJCSgo dTY0KUdFVF9CSVRGSUVMRCgoYiksIDEyLCAzMSkgPDwgMjYpCisjZGVmaW5lIFNLWF9UQURfU0tU X0dSQU4oYikJR0VUX0JJVEZJRUxEKChiKSwgNCwgNSkKKyNkZWZpbmUgU0tYX1RBRF9DSE5fR1JB TihiKQlHRVRfQklURklFTEQoKGIpLCA2LCA3KQorI2RlZmluZQlTS1hfVEFEX0xJTUlUKGIpCSgo KHU2NClHRVRfQklURklFTEQoKGIpLCAxMiwgMzEpIDw8IDI2KSB8IE1BU0syNikKKyNkZWZpbmUJ U0tYX1RBRF9PRkZTRVQoYikJKCh1NjQpR0VUX0JJVEZJRUxEKChiKSwgNCwgMjMpIDw8IDI2KQor I2RlZmluZQlTS1hfVEFEX1NLVFdBWVMoYikJKDEgPDwgR0VUX0JJVEZJRUxEKChiKSwgMTAsIDEx KSkKKyNkZWZpbmUJU0tYX1RBRF9DSE5XQVlTKGIpCShHRVRfQklURklFTEQoKGIpLCA4LCA5KSAr IDEpCisKKy8qIHdoaWNoIGJpdCB1c2VkIGZvciBib3RoIHNvY2tldCBhbmQgY2hhbm5lbCBpbnRl cmxlYXZlICovCitzdGF0aWMgaW50IHNreF9ncmFudWxhcml0eVtdID0geyA2LCA4LCAxMiwgMzAg fTsKKworc3RhdGljIHU2NCBza3hfZG9faW50ZXJsZWF2ZSh1NjQgYWRkciwgaW50IHNoaWZ0LCBp bnQgd2F5cywgdTY0IGxvd2JpdHMpCit7CisJYWRkciA+Pj0gc2hpZnQ7CisJYWRkciAvPSB3YXlz OworCWFkZHIgPDw9IHNoaWZ0OworCisJcmV0dXJuIGFkZHIgfCAobG93Yml0cyAmICgoMXVsbCA8 PCBzaGlmdCkgLSAxKSk7Cit9CisKK3N0YXRpYyBib29sIHNreF90YWRfZGVjb2RlKHN0cnVjdCBk ZWNvZGVkX2FkZHIgKnJlcykKK3sKKwlpbnQgaTsKKwl1MzIgYmFzZSwgd2F5bmVzcywgY2huaWx2 b2Zmc2V0OworCWludCBza3RfaW50ZXJsZWF2ZV9iaXQsIGNobl9pbnRlcmxlYXZlX2JpdDsKKwl1 NjQgY2hhbm5lbF9hZGRyOworCisJZm9yIChpID0gMDsgaSA8IFNLWF9NQVhfVEFEOyBpKyspIHsK KwkJU0tYX0dFVF9UQURCQVNFKHJlcy0+ZGV2LCByZXMtPmltYywgaSwgYmFzZSk7CisJCVNLWF9H RVRfVEFEV0FZTkVTUyhyZXMtPmRldiwgcmVzLT5pbWMsIGksIHdheW5lc3MpOworCQlpZiAoU0tY X1RBRF9CQVNFKGJhc2UpIDw9IHJlcy0+YWRkciAmJiByZXMtPmFkZHIgPD0gU0tYX1RBRF9MSU1J VCh3YXluZXNzKSkKKwkJCWdvdG8gdGFkX2ZvdW5kOworCX0KKwllZGFjX2RiZygwLCAiTm8gVEFE IGVudHJ5IGZvciAweCVsbHhcbiIsIHJlcy0+YWRkcik7CisJcmV0dXJuIGZhbHNlOworCit0YWRf Zm91bmQ6CisJcmVzLT5za3R3YXlzID0gU0tYX1RBRF9TS1RXQVlTKHdheW5lc3MpOworCXJlcy0+ Y2hhbndheXMgPSBTS1hfVEFEX0NITldBWVMod2F5bmVzcyk7CisJc2t0X2ludGVybGVhdmVfYml0 ID0gc2t4X2dyYW51bGFyaXR5W1NLWF9UQURfU0tUX0dSQU4oYmFzZSldOworCWNobl9pbnRlcmxl YXZlX2JpdCA9IHNreF9ncmFudWxhcml0eVtTS1hfVEFEX0NITl9HUkFOKGJhc2UpXTsKKworCVNL WF9HRVRfVEFEQ0hOSUxWT0ZGU0VUKHJlcy0+ZGV2LCByZXMtPmltYywgcmVzLT5jaGFubmVsLCBp LCBjaG5pbHZvZmZzZXQpOworCWNoYW5uZWxfYWRkciA9IHJlcy0+YWRkciAtIFNLWF9UQURfT0ZG U0VUKGNobmlsdm9mZnNldCk7CisKKwlpZiAocmVzLT5jaGFud2F5cyA9PSAzICYmIHNrdF9pbnRl cmxlYXZlX2JpdCA+IGNobl9pbnRlcmxlYXZlX2JpdCkgeworCQkvKiBNdXN0IGhhbmRsZSBjaGFu bmVsIGZpcnN0LCB0aGVuIHNvY2tldCAqLworCQljaGFubmVsX2FkZHIgPSBza3hfZG9faW50ZXJs ZWF2ZShjaGFubmVsX2FkZHIsIGNobl9pbnRlcmxlYXZlX2JpdCwKKwkJCQkJCSByZXMtPmNoYW53 YXlzLCBjaGFubmVsX2FkZHIpOworCQljaGFubmVsX2FkZHIgPSBza3hfZG9faW50ZXJsZWF2ZShj aGFubmVsX2FkZHIsIHNrdF9pbnRlcmxlYXZlX2JpdCwKKwkJCQkJCSByZXMtPnNrdHdheXMsIGNo YW5uZWxfYWRkcik7CisJfSBlbHNlIHsKKwkJLyogSGFuZGxlIHNvY2tldCB0aGVuIGNoYW5uZWwu IFByZXNlcnZlIGxvdyBiaXRzIGZyb20gb3JpZ2luYWwgYWRkcmVzcyAqLworCQljaGFubmVsX2Fk ZHIgPSBza3hfZG9faW50ZXJsZWF2ZShjaGFubmVsX2FkZHIsIHNrdF9pbnRlcmxlYXZlX2JpdCwK KwkJCQkJCSByZXMtPnNrdHdheXMsIHJlcy0+YWRkcik7CisJCWNoYW5uZWxfYWRkciA9IHNreF9k b19pbnRlcmxlYXZlKGNoYW5uZWxfYWRkciwgY2huX2ludGVybGVhdmVfYml0LAorCQkJCQkJIHJl cy0+Y2hhbndheXMsIHJlcy0+YWRkcik7CisJfQorCisJcmVzLT5jaGFuX2FkZHIgPSBjaGFubmVs X2FkZHI7CisKKwllZGFjX2RiZygyLCAiMHglbGx4OiBjaGFuX2FkZHI9MHglbGx4IHNrdHdheXM9 JWQgY2hhbndheXM9JWRcbiIsCisJCSByZXMtPmFkZHIsIHJlcy0+Y2hhbl9hZGRyLCByZXMtPnNr dHdheXMsIHJlcy0+Y2hhbndheXMpOworCXJldHVybiB0cnVlOworfQorCisjZGVmaW5lIFNLWF9N QVhfUklSIDQKKworI2RlZmluZSBTS1hfR0VUX1JJUldBWU5FU1MoZCwgbWMsIGNoLCBpLCByZWcp CQlcCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKChkKS0+aW1jW21jXS5jaGFuW2NoXS5jZGV2LAlc CisJCQkgICAgICAweDEwOCArIDQgKiAoaSksICYocmVnKSkKKyNkZWZpbmUgU0tYX0dFVF9SSVJJ TFYoZCwgbWMsIGNoLCBpZHgsIGksIHJlZykJCVwKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoKGQp LT5pbWNbbWNdLmNoYW5bY2hdLmNkZXYsCVwKKwkJCSAgICAgIDB4MTIwICsgMTYgKiAoaWR4KSAr IDQgKiAoaSksICYocmVnKSkKKworI2RlZmluZQlTS1hfUklSX1ZBTElEKGIpIEdFVF9CSVRGSUVM RCgoYiksIDMxLCAzMSkKKyNkZWZpbmUJU0tYX1JJUl9MSU1JVChiKSAoKCh1NjQpR0VUX0JJVEZJ RUxEKChiKSwgMSwgMTEpIDw8IDI5KSB8IE1BU0syOSkKKyNkZWZpbmUJU0tYX1JJUl9XQVlTKGIp ICgxIDw8IEdFVF9CSVRGSUVMRCgoYiksIDI4LCAyOSkpCisjZGVmaW5lCVNLWF9SSVJfQ0hBTl9S QU5LKGIpIEdFVF9CSVRGSUVMRCgoYiksIDE2LCAxOSkKKyNkZWZpbmUJU0tYX1JJUl9PRkZTRVQo YikgKCh1NjQpKEdFVF9CSVRGSUVMRCgoYiksIDIsIDE1KSA8PCAyNikpCisKK3N0YXRpYyBib29s IHNreF9yaXJfZGVjb2RlKHN0cnVjdCBkZWNvZGVkX2FkZHIgKnJlcykKK3sKKwlpbnQgaSwgaWR4 LCBjaGFuX3Jhbms7CisJaW50IHNoaWZ0OworCXUzMiByaXJ3YXksIHJpcmx2OworCXU2NCByYW5r X2FkZHIsIHByZXZfbGltaXQgPSAwLCBsaW1pdDsKKworCWlmIChyZXMtPmRldi0+aW1jW3Jlcy0+ aW1jXS5jaGFuW3Jlcy0+Y2hhbm5lbF0uZGltbXNbMF0uY2xvc2VfcGcpCisJCXNoaWZ0ID0gNjsK KwllbHNlCisJCXNoaWZ0ID0gMTM7CisKKwlmb3IgKGkgPSAwOyBpIDwgU0tYX01BWF9SSVI7IGkr KykgeworCQlTS1hfR0VUX1JJUldBWU5FU1MocmVzLT5kZXYsIHJlcy0+aW1jLCByZXMtPmNoYW5u ZWwsIGksIHJpcndheSk7CisJCWxpbWl0ID0gU0tYX1JJUl9MSU1JVChyaXJ3YXkpOworCQlpZiAo U0tYX1JJUl9WQUxJRChyaXJ3YXkpKSB7CisJCQlpZiAocHJldl9saW1pdCA8PSByZXMtPmNoYW5f YWRkciAmJgorCQkJICAgIHJlcy0+Y2hhbl9hZGRyIDw9IGxpbWl0KQorCQkJCWdvdG8gcmlyX2Zv dW5kOworCQl9CisJCXByZXZfbGltaXQgPSBsaW1pdDsKKwl9CisJZWRhY19kYmcoMCwgIk5vIFJJ UiBlbnRyeSBmb3IgMHglbGx4XG4iLCByZXMtPmFkZHIpOworCXJldHVybiBmYWxzZTsKKworcmly X2ZvdW5kOgorCXJhbmtfYWRkciA9IHJlcy0+Y2hhbl9hZGRyID4+IHNoaWZ0OworCXJhbmtfYWRk ciAvPSBTS1hfUklSX1dBWVMocmlyd2F5KTsKKwlyYW5rX2FkZHIgPDw9IHNoaWZ0OworCXJhbmtf YWRkciB8PSByZXMtPmNoYW5fYWRkciAmIEdFTk1BU0tfVUxMKHNoaWZ0IC0gMSwgMCk7CisKKwly ZXMtPnJhbmtfYWRkcmVzcyA9IHJhbmtfYWRkcjsKKwlpZHggPSAocmVzLT5jaGFuX2FkZHIgPj4g c2hpZnQpICUgU0tYX1JJUl9XQVlTKHJpcndheSk7CisKKwlTS1hfR0VUX1JJUklMVihyZXMtPmRl diwgcmVzLT5pbWMsIHJlcy0+Y2hhbm5lbCwgaWR4LCBpLCByaXJsdik7CisJcmVzLT5yYW5rX2Fk ZHJlc3MgPSByYW5rX2FkZHIgLSBTS1hfUklSX09GRlNFVChyaXJsdik7CisJY2hhbl9yYW5rID0g U0tYX1JJUl9DSEFOX1JBTksocmlybHYpOworCXJlcy0+Y2hhbm5lbF9yYW5rID0gY2hhbl9yYW5r OworCXJlcy0+ZGltbSA9IGNoYW5fcmFuayAvIDQ7CisJcmVzLT5yYW5rID0gY2hhbl9yYW5rICUg NDsKKworCWVkYWNfZGJnKDIsICIweCVsbHg6IGRpbW09JWQgcmFuaz0lZCBjaGFuX3Jhbms9JWQg cmFua19hZGRyPTB4JWxseFxuIiwKKwkJIHJlcy0+YWRkciwgcmVzLT5kaW1tLCByZXMtPnJhbmss CisJCSByZXMtPmNoYW5uZWxfcmFuaywgcmVzLT5yYW5rX2FkZHJlc3MpOworCXJldHVybiB0cnVl OworfQorCitzdGF0aWMgdTggc2t4X2Nsb3NlX3Jvd1tdID0geworCTE1LCAxNiwgMTcsIDE4LCAy MCwgMjEsIDIyLCAyOCwgMTAsIDExLCAxMiwgMTMsIDI5LCAzMCwgMzEsIDMyLCAzMworfTsKKwor c3RhdGljIHU4IHNreF9jbG9zZV9jb2x1bW5bXSA9IHsKKwkzLCA0LCA1LCAxNCwgMTksIDIzLCAy NCwgMjUsIDI2LCAyNworfTsKKworc3RhdGljIHU4IHNreF9vcGVuX3Jvd1tdID0geworCTE0LCAx NSwgMTYsIDIwLCAyOCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI5LCAzMCwgMzEsIDMy LCAzMworfTsKKworc3RhdGljIHU4IHNreF9vcGVuX2NvbHVtbltdID0geworCTMsIDQsIDUsIDYs IDcsIDgsIDksIDEwLCAxMSwgMTIKK307CisKK3N0YXRpYyB1OCBza3hfb3Blbl9maW5lX2NvbHVt bltdID0geworCTMsIDQsIDUsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzCit9OworCitzdGF0aWMg aW50IHNreF9iaXRzKHU2NCBhZGRyLCBpbnQgbmJpdHMsIHU4ICpiaXRzKQoreworCWludCBpLCBy ZXMgPSAwOworCisJZm9yIChpID0gMDsgaSA8IG5iaXRzOyBpKyspCisJCXJlcyB8PSAoKGFkZHIg Pj4gYml0c1tpXSkgJiAxKSA8PCBpOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgc2t4 X2JhbmtfYml0cyh1NjQgYWRkciwgaW50IGIwLCBpbnQgYjEsIGludCBkb194b3IsIGludCB4MCwg aW50IHgxKQoreworCWludCByZXQgPSBHRVRfQklURklFTEQoYWRkciwgYjAsIGIwKSB8IChHRVRf QklURklFTEQoYWRkciwgYjEsIGIxKSA8PCAxKTsKKworCWlmIChkb194b3IpCisJCXJldCBePSBH RVRfQklURklFTEQoYWRkciwgeDAsIHgwKSB8IChHRVRfQklURklFTEQoYWRkciwgeDEsIHgxKSA8 PCAxKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBib29sIHNreF9tYWRfZGVjb2RlKHN0 cnVjdCBkZWNvZGVkX2FkZHIgKnIpCit7CisJc3RydWN0IHNreF9kaW1tICpkaW1tID0gJnItPmRl di0+aW1jW3ItPmltY10uY2hhbltyLT5jaGFubmVsXS5kaW1tc1tyLT5kaW1tXTsKKwlpbnQgYmcw ID0gZGltbS0+ZmluZV9ncmFpbl9iYW5rID8gNiA6IDEzOworCisJaWYgKGRpbW0tPmNsb3NlX3Bn KSB7CisJCXItPnJvdyA9IHNreF9iaXRzKHItPnJhbmtfYWRkcmVzcywgZGltbS0+cm93Yml0cywg c2t4X2Nsb3NlX3Jvdyk7CisJCXItPmNvbHVtbiA9IHNreF9iaXRzKHItPnJhbmtfYWRkcmVzcywg ZGltbS0+Y29sYml0cywgc2t4X2Nsb3NlX2NvbHVtbik7CisJCXItPmNvbHVtbiB8PSAweDQwMDsg LyogQzEwIGlzIGF1dG9wcmVjaGFyZ2UsIGFsd2F5cyBzZXQgKi8KKwkJci0+YmFua19hZGRyZXNz ID0gc2t4X2JhbmtfYml0cyhyLT5yYW5rX2FkZHJlc3MsIDgsIDksIGRpbW0tPmJhbmtfeG9yX2Vu YWJsZSwgMjIsIDI4KTsKKwkJci0+YmFua19ncm91cCA9IHNreF9iYW5rX2JpdHMoci0+cmFua19h ZGRyZXNzLCA2LCA3LCBkaW1tLT5iYW5rX3hvcl9lbmFibGUsIDIwLCAyMSk7CisJfSBlbHNlIHsK KwkJci0+cm93ID0gc2t4X2JpdHMoci0+cmFua19hZGRyZXNzLCBkaW1tLT5yb3diaXRzLCBza3hf b3Blbl9yb3cpOworCQlpZiAoZGltbS0+ZmluZV9ncmFpbl9iYW5rKQorCQkJci0+Y29sdW1uID0g c2t4X2JpdHMoci0+cmFua19hZGRyZXNzLCBkaW1tLT5jb2xiaXRzLCBza3hfb3Blbl9maW5lX2Nv bHVtbik7CisJCWVsc2UKKwkJCXItPmNvbHVtbiA9IHNreF9iaXRzKHItPnJhbmtfYWRkcmVzcywg ZGltbS0+Y29sYml0cywgc2t4X29wZW5fY29sdW1uKTsKKwkJci0+YmFua19hZGRyZXNzID0gc2t4 X2JhbmtfYml0cyhyLT5yYW5rX2FkZHJlc3MsIDE4LCAxOSwgZGltbS0+YmFua194b3JfZW5hYmxl LCAyMiwgMjMpOworCQlyLT5iYW5rX2dyb3VwID0gc2t4X2JhbmtfYml0cyhyLT5yYW5rX2FkZHJl c3MsIGJnMCwgMTcsIGRpbW0tPmJhbmtfeG9yX2VuYWJsZSwgMjAsIDIxKTsKKwl9CisJci0+cm93 ICY9ICgxdSA8PCBkaW1tLT5yb3diaXRzKSAtIDE7CisKKwllZGFjX2RiZygyLCAiMHglbGx4OiBy b3c9MHgleCBjb2w9MHgleCBiYW5rX2FkZHI9JWQgYmFua19ncm91cD0lZFxuIiwKKwkJIHItPmFk ZHIsIHItPnJvdywgci0+Y29sdW1uLCByLT5iYW5rX2FkZHJlc3MsCisJCSByLT5iYW5rX2dyb3Vw KTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgc2t4X2RlY29kZShzdHJ1Y3QgZGVj b2RlZF9hZGRyICpyZXMpCit7CisJcmV0dXJuIHNreF9zYWRfZGVjb2RlKHJlcykgJiYgc2t4X3Rh ZF9kZWNvZGUocmVzKSAmJgorCQlza3hfcmlyX2RlY29kZShyZXMpICYmIHNreF9tYWRfZGVjb2Rl KHJlcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgc2t4X21jZV9kZWMgPSB7 CisJLm5vdGlmaWVyX2NhbGwJPSBza3hfbWNlX2NoZWNrX2Vycm9yLAorCS5wcmlvcml0eQk9IE1D RV9QUklPX0VEQUMsCit9OworCisvKgorICogc2t4X2luaXQ6CisgKgltYWtlIHN1cmUgd2UgYXJl IHJ1bm5pbmcgb24gdGhlIGNvcnJlY3QgY3B1IG1vZGVsCisgKglzZWFyY2ggZm9yIGFsbCB0aGUg ZGV2aWNlcyB3ZSBuZWVkCisgKgljaGVjayB3aGljaCBESU1NcyBhcmUgcHJlc2VudC4KKyAqLwor c3RhdGljIGludCBfX2luaXQgc2t4X2luaXQodm9pZCkKK3sKKwljb25zdCBzdHJ1Y3QgeDg2X2Nw dV9pZCAqaWQ7CisJY29uc3Qgc3RydWN0IG11bml0ICptOworCWNvbnN0IGNoYXIgKm93bmVyOwor CWludCByYyA9IDAsIGksIG9mZlszXSA9IHsweGQwLCAweGQ0LCAweGQ4fTsKKwl1OCBtYyA9IDAs IHNyY19pZCwgbm9kZV9pZDsKKwlzdHJ1Y3Qgc2t4X2RldiAqZDsKKworCWVkYWNfZGJnKDIsICJc biIpOworCisJb3duZXIgPSBlZGFjX2dldF9vd25lcigpOworCWlmIChvd25lciAmJiBzdHJuY21w KG93bmVyLCBFREFDX01PRF9TVFIsIHNpemVvZihFREFDX01PRF9TVFIpKSkKKwkJcmV0dXJuIC1F QlVTWTsKKworCWlkID0geDg2X21hdGNoX2NwdShza3hfY3B1aWRzKTsKKwlpZiAoIWlkKQorCQly ZXR1cm4gLUVOT0RFVjsKKworCXJjID0gc2t4X2dldF9oaV9sbygweDIwMzQsIG9mZiwgJnNreF90 b2xtLCAmc2t4X3RvaG0pOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmMgPSBza3hfZ2V0 X2FsbF9idXNfbWFwcGluZ3MoMHgyMDE2LCAweGNjLCBTS1gsICZza3hfZWRhY19saXN0KTsKKwlp ZiAocmMgPCAwKQorCQlnb3RvIGZhaWw7CisJaWYgKHJjID09IDApIHsKKwkJZWRhY19kYmcoMiwg Ik5vIG1lbW9yeSBjb250cm9sbGVycyBmb3VuZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0K Kwlza3hfbnVtX3NvY2tldHMgPSByYzsKKworCWZvciAobSA9IHNreF9hbGxfbXVuaXRzOyBtLT5k aWQ7IG0rKykgeworCQlyYyA9IGdldF9hbGxfbXVuaXRzKG0pOworCQlpZiAocmMgPCAwKQorCQkJ Z290byBmYWlsOworCQlpZiAocmMgIT0gbS0+cGVyX3NvY2tldCAqIHNreF9udW1fc29ja2V0cykg eworCQkJZWRhY19kYmcoMiwgIkV4cGVjdGVkICVkLCBnb3QgJWQgb2YgMHgleFxuIiwKKwkJCQkg bS0+cGVyX3NvY2tldCAqIHNreF9udW1fc29ja2V0cywgcmMsIG0tPmRpZCk7CisJCQlyYyA9IC1F Tk9ERVY7CisJCQlnb3RvIGZhaWw7CisJCX0KKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGQs IHNreF9lZGFjX2xpc3QsIGxpc3QpIHsKKwkJcmMgPSBza3hfZ2V0X3NyY19pZChkLCAmc3JjX2lk KTsKKwkJaWYgKHJjIDwgMCkKKwkJCWdvdG8gZmFpbDsKKwkJcmMgPSBza3hfZ2V0X25vZGVfaWQo ZCwgJm5vZGVfaWQpOworCQlpZiAocmMgPCAwKQorCQkJZ290byBmYWlsOworCQllZGFjX2RiZygy LCAic3JjX2lkPSVkIG5vZGVfaWQ9JWRcbiIsIHNyY19pZCwgbm9kZV9pZCk7CisJCWZvciAoaSA9 IDA7IGkgPCBTS1hfTlVNX0lNQzsgaSsrKSB7CisJCQlkLT5pbWNbaV0ubWMgPSBtYysrOworCQkJ ZC0+aW1jW2ldLmxtYyA9IGk7CisJCQlkLT5pbWNbaV0uc3JjX2lkID0gc3JjX2lkOworCQkJZC0+ aW1jW2ldLm5vZGVfaWQgPSBub2RlX2lkOworCQkJcmMgPSBza3hfcmVnaXN0ZXJfbWNpKCZkLT5p bWNbaV0sIGQtPmltY1tpXS5jaGFuWzBdLmNkZXYsCisJCQkJCSAgICAgICJTa3lsYWtlIFNvY2tl dCIsIEVEQUNfTU9EX1NUUiwKKwkJCQkJICAgICAgc2t4X2dldF9kaW1tX2NvbmZpZyk7CisJCQlp ZiAocmMgPCAwKQorCQkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKworCXNreF9zZXRfZGVjb2RlKHNr eF9kZWNvZGUpOworCisJaWYgKG52ZGltbV9jb3VudCAmJiBza3hfYWR4bF9nZXQoKSA9PSAtRU5P REVWKQorCQlza3hfcHJpbnRrKEtFUk5fTk9USUNFLCAiT25seSBkZWNvZGluZyBERFI0IGFkZHJl c3MhXG4iKTsKKworCS8qIEVuc3VyZSB0aGF0IHRoZSBPUFNUQVRFIGlzIHNldCBjb3JyZWN0bHkg Zm9yIFBPTEwgb3IgTk1JICovCisJb3BzdGF0ZV9pbml0KCk7CisKKwlzZXR1cF9za3hfZGVidWco InNreF90ZXN0Iik7CisKKwltY2VfcmVnaXN0ZXJfZGVjb2RlX2NoYWluKCZza3hfbWNlX2RlYyk7 CisKKwlyZXR1cm4gMDsKK2ZhaWw6CisJc2t4X3JlbW92ZSgpOworCXJldHVybiByYzsKK30KKwor c3RhdGljIHZvaWQgX19leGl0IHNreF9leGl0KHZvaWQpCit7CisJZWRhY19kYmcoMiwgIlxuIik7 CisJbWNlX3VucmVnaXN0ZXJfZGVjb2RlX2NoYWluKCZza3hfbWNlX2RlYyk7CisJdGVhcmRvd25f c2t4X2RlYnVnKCk7CisJaWYgKG52ZGltbV9jb3VudCkKKwkJc2t4X2FkeGxfcHV0KCk7CisJc2t4 X3JlbW92ZSgpOworfQorCittb2R1bGVfaW5pdChza3hfaW5pdCk7Cittb2R1bGVfZXhpdChza3hf ZXhpdCk7CisKK21vZHVsZV9wYXJhbShlZGFjX29wX3N0YXRlLCBpbnQsIDA0NDQpOworTU9EVUxF X1BBUk1fREVTQyhlZGFjX29wX3N0YXRlLCAiRURBQyBFcnJvciBSZXBvcnRpbmcgc3RhdGU6IDA9 UG9sbCwxPU5NSSIpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQVVUSE9S KCJUb255IEx1Y2siKTsKK01PRFVMRV9ERVNDUklQVElPTigiTUMgRHJpdmVyIGZvciBJbnRlbCBT a3lsYWtlIHNlcnZlciBwcm9jZXNzb3JzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvc2t4 X2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9za3hfZWRhYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0 NAppbmRleCA5M2VmMTYxYmI1ZTEuLjAwMDAwMDAwMDAwMAotLS0gYS9kcml2ZXJzL2VkYWMvc2t4 X2VkYWMuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNTggKzAsMCBAQAotLyoKLSAqIEVEQUMgZHJp dmVyIGZvciBJbnRlbChSKSBYZW9uKFIpIFNreWxha2UgcHJvY2Vzc29ycwotICogQ29weXJpZ2h0 IChjKSAyMDE2LCBJbnRlbCBDb3Jwb3JhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJl ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICog dW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMg TGljZW5zZSwKLSAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJl IEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBo b3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRo b3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBG SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVi bGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4 L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9hY3Bp Lmg+Ci0jaW5jbHVkZSA8bGludXgvZG1pLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5j bHVkZSA8bGludXgvcGNpX2lkcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRl IDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2VkYWMuaD4KLSNpbmNsdWRlIDxsaW51 eC9tbXpvbmUuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXAuaD4KLSNpbmNsdWRlIDxsaW51eC9iaXRt YXAuaD4KLSNpbmNsdWRlIDxsaW51eC9tYXRoNjQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2RfZGV2 aWNldGFibGUuaD4KLSNpbmNsdWRlIDxsaW51eC9hZHhsLmg+Ci0jaW5jbHVkZSA8YWNwaS9uZml0 Lmg+Ci0jaW5jbHVkZSA8YXNtL2NwdV9kZXZpY2VfaWQuaD4KLSNpbmNsdWRlIDxhc20vaW50ZWwt ZmFtaWx5Lmg+Ci0jaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgotI2luY2x1ZGUgPGFzbS9tY2Uu aD4KLQotI2luY2x1ZGUgImVkYWNfbW9kdWxlLmgiCi0KLSNkZWZpbmUgRURBQ19NT0RfU1RSICAg ICJza3hfZWRhYyIKLSNkZWZpbmUgTVNHX1NJWkUJMTAyNAotCi0vKgotICogRGVidWcgbWFjcm9z Ci0gKi8KLSNkZWZpbmUgc2t4X3ByaW50ayhsZXZlbCwgZm10LCBhcmcuLi4pCQkJXAotCWVkYWNf cHJpbnRrKGxldmVsLCAic2t4IiwgZm10LCAjI2FyZykKLQotI2RlZmluZSBza3hfbWNfcHJpbnRr KG1jaSwgbGV2ZWwsIGZtdCwgYXJnLi4uKQkJXAotCWVkYWNfbWNfY2hpcHNldF9wcmludGsobWNp LCBsZXZlbCwgInNreCIsIGZtdCwgIyNhcmcpCi0KLS8qCi0gKiBHZXQgYSBiaXQgZmllbGQgYXQg cmVnaXN0ZXIgdmFsdWUgPHY+LCBmcm9tIGJpdCA8bG8+IHRvIGJpdCA8aGk+Ci0gKi8KLSNkZWZp bmUgR0VUX0JJVEZJRUxEKHYsIGxvLCBoaSkgXAotCSgoKHYpICYgR0VOTUFTS19VTEwoKGhpKSwg KGxvKSkpID4+IChsbykpCi0KLXN0YXRpYyBMSVNUX0hFQUQoc2t4X2VkYWNfbGlzdCk7Ci0KLXN0 YXRpYyB1NjQgc2t4X3RvbG0sIHNreF90b2htOwotc3RhdGljIGNoYXIgKnNreF9tc2c7Ci1zdGF0 aWMgdW5zaWduZWQgaW50IG52ZGltbV9jb3VudDsKLQotZW51bSB7Ci0JSU5ERVhfU09DS0VULAot CUlOREVYX01FTUNUUkwsCi0JSU5ERVhfQ0hBTk5FTCwKLQlJTkRFWF9ESU1NLAotCUlOREVYX01B WAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjb21wb25lbnRfbmFtZXNbXSA9IHsK LQlbSU5ERVhfU09DS0VUXQk9ICJQcm9jZXNzb3JTb2NrZXRJZCIsCi0JW0lOREVYX01FTUNUUkxd CT0gIk1lbW9yeUNvbnRyb2xsZXJJZCIsCi0JW0lOREVYX0NIQU5ORUxdCT0gIkNoYW5uZWxJZCIs Ci0JW0lOREVYX0RJTU1dCT0gIkRpbW1TbG90SWQiLAotfTsKLQotc3RhdGljIGludCBjb21wb25l bnRfaW5kaWNlc1tBUlJBWV9TSVpFKGNvbXBvbmVudF9uYW1lcyldOwotc3RhdGljIGludCBhZHhs X2NvbXBvbmVudF9jb3VudDsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgKmFkeGxfY29tcG9u ZW50X25hbWVzOwotc3RhdGljIHU2NCAqYWR4bF92YWx1ZXM7Ci1zdGF0aWMgY2hhciAqYWR4bF9t c2c7Ci0KLSNkZWZpbmUgTlVNX0lNQwkJCTIJLyogbWVtb3J5IGNvbnRyb2xsZXJzIHBlciBzb2Nr ZXQgKi8KLSNkZWZpbmUgTlVNX0NIQU5ORUxTCQkzCS8qIGNoYW5uZWxzIHBlciBtZW1vcnkgY29u dHJvbGxlciAqLwotI2RlZmluZSBOVU1fRElNTVMJCTIJLyogTWF4IERJTU1TIHBlciBjaGFubmVs ICovCi0KLSNkZWZpbmUJTUFTSzI2CTB4M0ZGRkZGRgkJLyogTWFzayBmb3IgMl4yNiAqLwotI2Rl ZmluZSBNQVNLMjkJMHgxRkZGRkZGRgkJLyogTWFzayBmb3IgMl4yOSAqLwotCi0vKgotICogRWFj aCBjcHUgc29ja2V0IGNvbnRhaW5zIHNvbWUgcGNpIGRldmljZXMgdGhhdCBwcm92aWRlIGdsb2Jh bAotICogaW5mb3JtYXRpb24sIGFuZCBhbHNvIHNvbWUgdGhhdCBhcmUgbG9jYWwgdG8gZWFjaCBv ZiB0aGUgdHdvCi0gKiBtZW1vcnkgY29udHJvbGxlcnMgb24gdGhlIGRpZS4KLSAqLwotc3RydWN0 IHNreF9kZXYgewotCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKLQl1OAkJCWJ1c1s0XTsKLQlpbnQJ CQlzZWc7Ci0Jc3RydWN0IHBjaV9kZXYJKnNhZF9hbGw7Ci0Jc3RydWN0IHBjaV9kZXYJKnV0aWxf YWxsOwotCXUzMgltY3JvdXRlOwotCXN0cnVjdCBza3hfaW1jIHsKLQkJc3RydWN0IG1lbV9jdGxf aW5mbyAqbWNpOwotCQl1OAltYzsJLyogc3lzdGVtIHdpZGUgbWMjICovCi0JCXU4CWxtYzsJLyog c29ja2V0IHJlbGF0aXZlIG1jIyAqLwotCQl1OAlzcmNfaWQsIG5vZGVfaWQ7Ci0JCXN0cnVjdCBz a3hfY2hhbm5lbCB7Ci0JCQlzdHJ1Y3QgcGNpX2RldiAqY2RldjsKLQkJCXN0cnVjdCBza3hfZGlt bSB7Ci0JCQkJdTgJY2xvc2VfcGc7Ci0JCQkJdTgJYmFua194b3JfZW5hYmxlOwotCQkJCXU4CWZp bmVfZ3JhaW5fYmFuazsKLQkJCQl1OAlyb3diaXRzOwotCQkJCXU4CWNvbGJpdHM7Ci0JCQl9IGRp bW1zW05VTV9ESU1NU107Ci0JCX0gY2hhbltOVU1fQ0hBTk5FTFNdOwotCX0gaW1jW05VTV9JTUNd OwotfTsKLXN0YXRpYyBpbnQgc2t4X251bV9zb2NrZXRzOwotCi1zdHJ1Y3Qgc2t4X3B2dCB7Ci0J c3RydWN0IHNreF9pbWMJKmltYzsKLX07Ci0KLXN0cnVjdCBkZWNvZGVkX2FkZHIgewotCXN0cnVj dCBza3hfZGV2ICpkZXY7Ci0JdTY0CWFkZHI7Ci0JaW50CXNvY2tldDsKLQlpbnQJaW1jOwotCWlu dAljaGFubmVsOwotCXU2NAljaGFuX2FkZHI7Ci0JaW50CXNrdHdheXM7Ci0JaW50CWNoYW53YXlz OwotCWludAlkaW1tOwotCWludAlyYW5rOwotCWludAljaGFubmVsX3Jhbms7Ci0JdTY0CXJhbmtf YWRkcmVzczsKLQlpbnQJcm93OwotCWludAljb2x1bW47Ci0JaW50CWJhbmtfYWRkcmVzczsKLQlp bnQJYmFua19ncm91cDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2t4X2RldiAqZ2V0X3NreF9kZXYo c3RydWN0IHBjaV9idXMgKmJ1cywgdTggaWR4KQotewotCXN0cnVjdCBza3hfZGV2ICpkOwotCi0J bGlzdF9mb3JfZWFjaF9lbnRyeShkLCAmc2t4X2VkYWNfbGlzdCwgbGlzdCkgewotCQlpZiAoZC0+ c2VnID09IHBjaV9kb21haW5fbnIoYnVzKSAmJiBkLT5idXNbaWR4XSA9PSBidXMtPm51bWJlcikK LQkJCXJldHVybiBkOwotCX0KLQotCXJldHVybiBOVUxMOwotfQotCi1lbnVtIG11bml0dHlwZSB7 Ci0JQ0hBTjAsIENIQU4xLCBDSEFOMiwgU0FEX0FMTCwgVVRJTF9BTEwsIFNBRAotfTsKLQotc3Ry dWN0IG11bml0IHsKLQl1MTYJZGlkOwotCXUxNglkZXZmbltOVU1fSU1DXTsKLQl1OAlidXNpZHg7 Ci0JdTgJcGVyX3NvY2tldDsKLQllbnVtIG11bml0dHlwZSBtdHlwZTsKLX07Ci0KLS8qCi0gKiBM aXN0IG9mIFBDSSBkZXZpY2UgaWRzIHRoYXQgd2UgbmVlZCB0b2dldGhlciB3aXRoIHNvbWUgZGV2 aWNlCi0gKiBudW1iZXIgYW5kIGZ1bmN0aW9uIG51bWJlcnMgdG8gdGVsbCB3aGljaCBtZW1vcnkg Y29udHJvbGxlciB0aGUKLSAqIGRldmljZSBiZWxvbmdzIHRvLgotICovCi1zdGF0aWMgY29uc3Qg c3RydWN0IG11bml0IHNreF9hbGxfbXVuaXRzW10gPSB7Ci0JeyAweDIwNTQsIHsgfSwgMSwgMSwg U0FEX0FMTCB9LAotCXsgMHgyMDU1LCB7IH0sIDEsIDEsIFVUSUxfQUxMIH0sCi0JeyAweDIwNDAs IHsgUENJX0RFVkZOKDEwLCAwKSwgUENJX0RFVkZOKDEyLCAwKSB9LCAyLCAyLCBDSEFOMCB9LAot CXsgMHgyMDQ0LCB7IFBDSV9ERVZGTigxMCwgNCksIFBDSV9ERVZGTigxMiwgNCkgfSwgMiwgMiwg Q0hBTjEgfSwKLQl7IDB4MjA0OCwgeyBQQ0lfREVWRk4oMTEsIDApLCBQQ0lfREVWRk4oMTMsIDAp IH0sIDIsIDIsIENIQU4yIH0sCi0JeyAweDIwOGUsIHsgfSwgMSwgMCwgU0FEIH0sCi0JeyB9Ci19 OwotCi0vKgotICogV2UgdXNlIHRoZSBwZXItc29ja2V0IGRldmljZSAweDIwMTYgdG8gY291bnQg aG93IG1hbnkgc29ja2V0cyBhcmUgcHJlc2VudCwKLSAqIGFuZCB0byBkZXRlbWluZSB3aGljaCBQ Q0kgYnVzZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCBlYWNoIHNvY2tldC4gQWxsb2NhdGUKLSAqIGFu ZCBidWlsZCB0aGUgZnVsbCBsaXN0IG9mIGFsbCB0aGUgc2t4X2RldiBzdHJ1Y3R1cmVzIHRoYXQg d2UgbmVlZCBoZXJlLgotICovCi1zdGF0aWMgaW50IGdldF9hbGxfYnVzX21hcHBpbmdzKHZvaWQp Ci17Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYsICpwcmV2OwotCXN0cnVjdCBza3hfZGV2ICpkOwot CXUzMiByZWc7Ci0JaW50IG5kZXYgPSAwOwotCi0JcHJldiA9IE5VTEw7Ci0JZm9yICg7Oykgewot CQlwZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyMDE2LCBwcmV2 KTsKLQkJaWYgKCFwZGV2KQotCQkJYnJlYWs7Ci0JCW5kZXYrKzsKLQkJZCA9IGt6YWxsb2Moc2l6 ZW9mKCpkKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghZCkgewotCQkJcGNpX2Rldl9wdXQocGRldik7 Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCQlkLT5zZWcgPSBwY2lfZG9tYWluX25yKHBkZXYt PmJ1cyk7Ci0JCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCAweENDLCAmcmVnKTsKLQkJZC0+ YnVzWzBdID0gIEdFVF9CSVRGSUVMRChyZWcsIDAsIDcpOwotCQlkLT5idXNbMV0gPSAgR0VUX0JJ VEZJRUxEKHJlZywgOCwgMTUpOwotCQlkLT5idXNbMl0gPSAgR0VUX0JJVEZJRUxEKHJlZywgMTYs IDIzKTsKLQkJZC0+YnVzWzNdID0gIEdFVF9CSVRGSUVMRChyZWcsIDI0LCAzMSk7Ci0JCWVkYWNf ZGJnKDIsICJidXNzZXM6IDB4JXgsIDB4JXgsIDB4JXgsIDB4JXhcbiIsCi0JCQkgZC0+YnVzWzBd LCBkLT5idXNbMV0sIGQtPmJ1c1syXSwgZC0+YnVzWzNdKTsKLQkJbGlzdF9hZGRfdGFpbCgmZC0+ bGlzdCwgJnNreF9lZGFjX2xpc3QpOwotCQlza3hfbnVtX3NvY2tldHMrKzsKLQkJcHJldiA9IHBk ZXY7Ci0JfQotCi0JcmV0dXJuIG5kZXY7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X2FsbF9tdW5pdHMo Y29uc3Qgc3RydWN0IG11bml0ICptKQotewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2LCAqcHJldjsK LQlzdHJ1Y3Qgc2t4X2RldiAqZDsKLQl1MzIgcmVnOwotCWludCBpID0gMCwgbmRldiA9IDA7Ci0K LQlwcmV2ID0gTlVMTDsKLQlmb3IgKDs7KSB7Ci0JCXBkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lf VkVORE9SX0lEX0lOVEVMLCBtLT5kaWQsIHByZXYpOwotCQlpZiAoIXBkZXYpCi0JCQlicmVhazsK LQkJbmRldisrOwotCQlpZiAobS0+cGVyX3NvY2tldCA9PSBOVU1fSU1DKSB7Ci0JCQlmb3IgKGkg PSAwOyBpIDwgTlVNX0lNQzsgaSsrKQotCQkJCWlmIChtLT5kZXZmbltpXSA9PSBwZGV2LT5kZXZm bikKLQkJCQkJYnJlYWs7Ci0JCQlpZiAoaSA9PSBOVU1fSU1DKQotCQkJCWdvdG8gZmFpbDsKLQkJ fQotCQlkID0gZ2V0X3NreF9kZXYocGRldi0+YnVzLCBtLT5idXNpZHgpOwotCQlpZiAoIWQpCi0J CQlnb3RvIGZhaWw7Ci0KLQkJLyogQmUgc3VyZSB0aGF0IHRoZSBkZXZpY2UgaXMgZW5hYmxlZCAq LwotCQlpZiAodW5saWtlbHkocGNpX2VuYWJsZV9kZXZpY2UocGRldikgPCAwKSkgewotCQkJc2t4 X3ByaW50ayhLRVJOX0VSUiwgIkNvdWxkbid0IGVuYWJsZSBkZXZpY2UgJTA0eDolMDR4XG4iLAot CQkJCSAgIFBDSV9WRU5ET1JfSURfSU5URUwsIG0tPmRpZCk7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0K LQotCQlzd2l0Y2ggKG0tPm10eXBlKSB7Ci0JCWNhc2UgQ0hBTjA6IGNhc2UgQ0hBTjE6IGNhc2Ug Q0hBTjI6Ci0JCQlwY2lfZGV2X2dldChwZGV2KTsKLQkJCWQtPmltY1tpXS5jaGFuW20tPm10eXBl XS5jZGV2ID0gcGRldjsKLQkJCWJyZWFrOwotCQljYXNlIFNBRF9BTEw6Ci0JCQlwY2lfZGV2X2dl dChwZGV2KTsKLQkJCWQtPnNhZF9hbGwgPSBwZGV2OwotCQkJYnJlYWs7Ci0JCWNhc2UgVVRJTF9B TEw6Ci0JCQlwY2lfZGV2X2dldChwZGV2KTsKLQkJCWQtPnV0aWxfYWxsID0gcGRldjsKLQkJCWJy ZWFrOwotCQljYXNlIFNBRDoKLQkJCS8qCi0JCQkgKiBvbmUgb2YgdGhlc2UgZGV2aWNlcyBwZXIg Y29yZSwgaW5jbHVkaW5nIGNvcmVzCi0JCQkgKiB0aGF0IGRvbid0IGV4aXN0IG9uIHRoaXMgU0tV LiBJZ25vcmUgYW55IHRoYXQKLQkJCSAqIHJlYWQgYSByb3V0ZSB0YWJsZSBvZiB6ZXJvLCBtYWtl IHN1cmUgYWxsIHRoZQotCQkJICogbm9uLXplcm8gdmFsdWVzIG1hdGNoLgotCQkJICovCi0JCQlw Y2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgMHhCNCwgJnJlZyk7Ci0JCQlpZiAocmVnICE9IDAp IHsKLQkJCQlpZiAoZC0+bWNyb3V0ZSA9PSAwKQotCQkJCQlkLT5tY3JvdXRlID0gcmVnOwotCQkJ CWVsc2UgaWYgKGQtPm1jcm91dGUgIT0gcmVnKSB7Ci0JCQkJCXNreF9wcmludGsoS0VSTl9FUlIs Ci0JCQkJCQkibWNyb3V0ZSBtaXNtYXRjaFxuIik7Ci0JCQkJCWdvdG8gZmFpbDsKLQkJCQl9Ci0J CQl9Ci0JCQluZGV2LS07Ci0JCQlicmVhazsKLQkJfQotCi0JCXByZXYgPSBwZGV2OwotCX0KLQot CXJldHVybiBuZGV2OwotZmFpbDoKLQlwY2lfZGV2X3B1dChwZGV2KTsKLQlyZXR1cm4gLUVOT0RF VjsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB4ODZfY3B1X2lkIHNreF9jcHVpZHNbXSA9IHsK LQl7IFg4Nl9WRU5ET1JfSU5URUwsIDYsIElOVEVMX0ZBTTZfU0tZTEFLRV9YLCAwLCAwIH0sCi0J eyB9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRSh4ODZjcHUsIHNreF9jcHVpZHMpOwotCi1zdGF0 aWMgdTggZ2V0X3NyY19pZChzdHJ1Y3Qgc2t4X2RldiAqZCkKLXsKLQl1MzIgcmVnOwotCi0JcGNp X3JlYWRfY29uZmlnX2R3b3JkKGQtPnV0aWxfYWxsLCAweEYwLCAmcmVnKTsKLQotCXJldHVybiBH RVRfQklURklFTEQocmVnLCAxMiwgMTQpOwotfQotCi1zdGF0aWMgdTggc2t4X2dldF9ub2RlX2lk KHN0cnVjdCBza3hfZGV2ICpkKQotewotCXUzMiByZWc7Ci0KLQlwY2lfcmVhZF9jb25maWdfZHdv cmQoZC0+dXRpbF9hbGwsIDB4RjQsICZyZWcpOwotCi0JcmV0dXJuIEdFVF9CSVRGSUVMRChyZWcs IDAsIDIpOwotfQotCi1zdGF0aWMgaW50IGdldF9kaW1tX2F0dHIodTMyIHJlZywgaW50IGxvYml0 LCBpbnQgaGliaXQsIGludCBhZGQsIGludCBtaW52YWwsCi0JCQkgaW50IG1heHZhbCwgY2hhciAq bmFtZSkKLXsKLQl1MzIgdmFsID0gR0VUX0JJVEZJRUxEKHJlZywgbG9iaXQsIGhpYml0KTsKLQot CWlmICh2YWwgPCBtaW52YWwgfHwgdmFsID4gbWF4dmFsKSB7Ci0JCWVkYWNfZGJnKDIsICJiYWQg JXMgPSAlZCAocmF3PTB4JXgpXG4iLCBuYW1lLCB2YWwsIHJlZyk7Ci0JCXJldHVybiAtRUlOVkFM OwotCX0KLQlyZXR1cm4gdmFsICsgYWRkOwotfQotCi0jZGVmaW5lIElTX0RJTU1fUFJFU0VOVCht dHIpCQlHRVRfQklURklFTEQoKG10ciksIDE1LCAxNSkKLSNkZWZpbmUgSVNfTlZESU1NX1BSRVNF TlQobWNkZHJ0Y2ZnLCBpKQlHRVRfQklURklFTEQoKG1jZGRydGNmZyksIChpKSwgKGkpKQotCi0j ZGVmaW5lIG51bXJhbmsocmVnKSBnZXRfZGltbV9hdHRyKChyZWcpLCAxMiwgMTMsIDAsIDAsIDIs ICJyYW5rcyIpCi0jZGVmaW5lIG51bXJvdyhyZWcpIGdldF9kaW1tX2F0dHIoKHJlZyksIDIsIDQs IDEyLCAxLCA2LCAicm93cyIpCi0jZGVmaW5lIG51bWNvbChyZWcpIGdldF9kaW1tX2F0dHIoKHJl ZyksIDAsIDEsIDEwLCAwLCAyLCAiY29scyIpCi0KLXN0YXRpYyBpbnQgZ2V0X3dpZHRoKHUzMiBt dHIpCi17Ci0Jc3dpdGNoIChHRVRfQklURklFTEQobXRyLCA4LCA5KSkgewotCWNhc2UgMDoKLQkJ cmV0dXJuIERFVl9YNDsKLQljYXNlIDE6Ci0JCXJldHVybiBERVZfWDg7Ci0JY2FzZSAyOgotCQly ZXR1cm4gREVWX1gxNjsKLQl9Ci0JcmV0dXJuIERFVl9VTktOT1dOOwotfQotCi1zdGF0aWMgaW50 IHNreF9nZXRfaGlfbG8odm9pZCkKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKLQl1MzIgcmVn OwotCi0JcGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjAzNCwg TlVMTCk7Ci0JaWYgKCFwZGV2KSB7Ci0JCWVkYWNfZGJnKDAsICJDYW4ndCBnZXQgdG9sbS90b2ht XG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBk ZXYsIDB4RDAsICZyZWcpOwotCXNreF90b2xtID0gcmVnOwotCXBjaV9yZWFkX2NvbmZpZ19kd29y ZChwZGV2LCAweEQ0LCAmcmVnKTsKLQlza3hfdG9obSA9IHJlZzsKLQlwY2lfcmVhZF9jb25maWdf ZHdvcmQocGRldiwgMHhEOCwgJnJlZyk7Ci0Jc2t4X3RvaG0gfD0gKHU2NClyZWcgPDwgMzI7Ci0K LQlwY2lfZGV2X3B1dChwZGV2KTsKLQllZGFjX2RiZygyLCAidG9sbT0weCVsbHggdG9obT0weCVs bHhcbiIsIHNreF90b2xtLCBza3hfdG9obSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlu dCBnZXRfZGltbV9pbmZvKHUzMiBtdHIsIHUzMiBhbWFwLCBzdHJ1Y3QgZGltbV9pbmZvICpkaW1t LAotCQkJIHN0cnVjdCBza3hfaW1jICppbWMsIGludCBjaGFuLCBpbnQgZGltbW5vKQotewotCWlu dCAgYmFua3MgPSAxNiwgcmFua3MsIHJvd3MsIGNvbHMsIG5wYWdlczsKLQl1NjQgc2l6ZTsKLQot CXJhbmtzID0gbnVtcmFuayhtdHIpOwotCXJvd3MgPSBudW1yb3cobXRyKTsKLQljb2xzID0gbnVt Y29sKG10cik7Ci0KLQkvKgotCSAqIENvbXB1dGUgc2l6ZSBpbiA4LWJ5dGUgKDJeMykgd29yZHMs IHRoZW4gc2hpZnQgdG8gTWlCICgyXjIwKQotCSAqLwotCXNpemUgPSAoKDF1bGwgPDwgKHJvd3Mg KyBjb2xzICsgcmFua3MpKSAqIGJhbmtzKSA+PiAoMjAgLSAzKTsKLQlucGFnZXMgPSBNaUJfVE9f UEFHRVMoc2l6ZSk7Ci0KLQllZGFjX2RiZygwLCAibWMjJWQ6IGNoYW5uZWwgJWQsIGRpbW0gJWQs ICVsbGQgTWlCICglZCBwYWdlcykgYmFuazogJWQsIHJhbms6ICVkLCByb3c6IDB4JSN4LCBjb2w6 IDB4JSN4XG4iLAotCQkgaW1jLT5tYywgY2hhbiwgZGltbW5vLCBzaXplLCBucGFnZXMsCi0JCSBi YW5rcywgMSA8PCByYW5rcywgcm93cywgY29scyk7Ci0KLQlpbWMtPmNoYW5bY2hhbl0uZGltbXNb ZGltbW5vXS5jbG9zZV9wZyA9IEdFVF9CSVRGSUVMRChtdHIsIDAsIDApOwotCWltYy0+Y2hhbltj aGFuXS5kaW1tc1tkaW1tbm9dLmJhbmtfeG9yX2VuYWJsZSA9IEdFVF9CSVRGSUVMRChtdHIsIDks IDkpOwotCWltYy0+Y2hhbltjaGFuXS5kaW1tc1tkaW1tbm9dLmZpbmVfZ3JhaW5fYmFuayA9IEdF VF9CSVRGSUVMRChhbWFwLCAwLCAwKTsKLQlpbWMtPmNoYW5bY2hhbl0uZGltbXNbZGltbW5vXS5y b3diaXRzID0gcm93czsKLQlpbWMtPmNoYW5bY2hhbl0uZGltbXNbZGltbW5vXS5jb2xiaXRzID0g Y29sczsKLQotCWRpbW0tPm5yX3BhZ2VzID0gbnBhZ2VzOwotCWRpbW0tPmdyYWluID0gMzI7Ci0J ZGltbS0+ZHR5cGUgPSBnZXRfd2lkdGgobXRyKTsKLQlkaW1tLT5tdHlwZSA9IE1FTV9ERFI0Owot CWRpbW0tPmVkYWNfbW9kZSA9IEVEQUNfU0VDREVEOyAvKiBsaWtlbHkgYmV0dGVyIHRoYW4gdGhp cyAqLwotCXNucHJpbnRmKGRpbW0tPmxhYmVsLCBzaXplb2YoZGltbS0+bGFiZWwpLCAiQ1BVX1Ny Y0lEIyV1X01DIyV1X0NoYW4jJXVfRElNTSMldSIsCi0JCSBpbWMtPnNyY19pZCwgaW1jLT5sbWMs IGNoYW4sIGRpbW1ubyk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBnZXRfbnZkaW1t X2luZm8oc3RydWN0IGRpbW1faW5mbyAqZGltbSwgc3RydWN0IHNreF9pbWMgKmltYywKLQkJCSAg IGludCBjaGFuLCBpbnQgZGltbW5vKQotewotCWludCBzbWJpb3NfaGFuZGxlOwotCXUzMiBkZXZf aGFuZGxlOwotCXUxNiBmbGFnczsKLQl1NjQgc2l6ZSA9IDA7Ci0KLQludmRpbW1fY291bnQrKzsK LQotCWRldl9oYW5kbGUgPSBBQ1BJX05GSVRfQlVJTERfREVWSUNFX0hBTkRMRShkaW1tbm8sIGNo YW4sIGltYy0+bG1jLAotCQkJCQkJICAgaW1jLT5zcmNfaWQsIDApOwotCi0Jc21iaW9zX2hhbmRs ZSA9IG5maXRfZ2V0X3NtYmlvc19pZChkZXZfaGFuZGxlLCAmZmxhZ3MpOwotCWlmIChzbWJpb3Nf aGFuZGxlID09IC1FT1BOT1RTVVBQKSB7Ci0JCXByX3dhcm5fb25jZShFREFDX01PRF9TVFIgIjog Q2FuJ3QgZmluZCBzaXplIG9mIE5WRElNTS4gVHJ5IGVuYWJsaW5nIENPTkZJR19BQ1BJX05GSVRc biIpOwotCQlnb3RvIHVua25vd25fc2l6ZTsKLQl9Ci0KLQlpZiAoc21iaW9zX2hhbmRsZSA8IDAp IHsKLQkJc2t4X3ByaW50ayhLRVJOX0VSUiwgIkNhbid0IGZpbmQgaGFuZGxlIGZvciBOVkRJTU0g QURSPTB4JXhcbiIsIGRldl9oYW5kbGUpOwotCQlnb3RvIHVua25vd25fc2l6ZTsKLQl9Ci0KLQlp ZiAoZmxhZ3MgJiBBQ1BJX05GSVRfTUVNX01BUF9GQUlMRUQpIHsKLQkJc2t4X3ByaW50ayhLRVJO X0VSUiwgIk5WRElNTSBBRFI9MHgleCBpcyBub3QgbWFwcGVkXG4iLCBkZXZfaGFuZGxlKTsKLQkJ Z290byB1bmtub3duX3NpemU7Ci0JfQotCi0Jc2l6ZSA9IGRtaV9tZW1kZXZfc2l6ZShzbWJpb3Nf aGFuZGxlKTsKLQlpZiAoc2l6ZSA9PSB+MHVsbCkKLQkJc2t4X3ByaW50ayhLRVJOX0VSUiwgIkNh bid0IGZpbmQgc2l6ZSBmb3IgTlZESU1NIEFEUj0weCV4L1NNQklPUz0weCV4XG4iLAotCQkJICAg ZGV2X2hhbmRsZSwgc21iaW9zX2hhbmRsZSk7Ci0KLXVua25vd25fc2l6ZToKLQlkaW1tLT5ucl9w YWdlcyA9IHNpemUgPj4gUEFHRV9TSElGVDsKLQlkaW1tLT5ncmFpbiA9IDMyOwotCWRpbW0tPmR0 eXBlID0gREVWX1VOS05PV047Ci0JZGltbS0+bXR5cGUgPSBNRU1fTlZESU1NOwotCWRpbW0tPmVk YWNfbW9kZSA9IEVEQUNfU0VDREVEOyAvKiBsaWtlbHkgYmV0dGVyIHRoYW4gdGhpcyAqLwotCi0J ZWRhY19kYmcoMCwgIm1jIyVkOiBjaGFubmVsICVkLCBkaW1tICVkLCAlbGx1IE1pQiAoJXUgcGFn ZXMpXG4iLAotCQkgaW1jLT5tYywgY2hhbiwgZGltbW5vLCBzaXplID4+IDIwLCBkaW1tLT5ucl9w YWdlcyk7Ci0KLQlzbnByaW50ZihkaW1tLT5sYWJlbCwgc2l6ZW9mKGRpbW0tPmxhYmVsKSwgIkNQ VV9TcmNJRCMldV9NQyMldV9DaGFuIyV1X0RJTU0jJXUiLAotCQkgaW1jLT5zcmNfaWQsIGltYy0+ bG1jLCBjaGFuLCBkaW1tbm8pOwotCi0JcmV0dXJuIChzaXplID09IDAgfHwgc2l6ZSA9PSB+MHVs bCkgPyAwIDogMTsKLX0KLQotI2RlZmluZSBTS1hfR0VUX01UTVRSKGRldiwgcmVnKSBcCi0JcGNp X3JlYWRfY29uZmlnX2R3b3JkKChkZXYpLCAweDg3YywgJnJlZykKLQotc3RhdGljIGJvb2wgc2t4 X2NoZWNrX2VjYyhzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLQl1MzIgbXRtdHI7Ci0KLQlTS1hf R0VUX01UTVRSKHBkZXYsIG10bXRyKTsKLQotCXJldHVybiAhIUdFVF9CSVRGSUVMRChtdG10ciwg MiwgMik7Ci19Ci0KLXN0YXRpYyBpbnQgc2t4X2dldF9kaW1tX2NvbmZpZyhzdHJ1Y3QgbWVtX2N0 bF9pbmZvICptY2kpCi17Ci0Jc3RydWN0IHNreF9wdnQgKnB2dCA9IG1jaS0+cHZ0X2luZm87Ci0J c3RydWN0IHNreF9pbWMgKmltYyA9IHB2dC0+aW1jOwotCXUzMiBtdHIsIGFtYXAsIG1jZGRydGNm ZzsKLQlzdHJ1Y3QgZGltbV9pbmZvICpkaW1tOwotCWludCBpLCBqOwotCWludCBuZGltbXM7Ci0K LQlmb3IgKGkgPSAwOyBpIDwgTlVNX0NIQU5ORUxTOyBpKyspIHsKLQkJbmRpbW1zID0gMDsKLQkJ cGNpX3JlYWRfY29uZmlnX2R3b3JkKGltYy0+Y2hhbltpXS5jZGV2LCAweDhDLCAmYW1hcCk7Ci0J CXBjaV9yZWFkX2NvbmZpZ19kd29yZChpbWMtPmNoYW5baV0uY2RldiwgMHg0MDAsICZtY2RkcnRj ZmcpOwotCQlmb3IgKGogPSAwOyBqIDwgTlVNX0RJTU1TOyBqKyspIHsKLQkJCWRpbW0gPSBFREFD X0RJTU1fUFRSKG1jaS0+bGF5ZXJzLCBtY2ktPmRpbW1zLAotCQkJCQkgICAgIG1jaS0+bl9sYXll cnMsIGksIGosIDApOwotCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGltYy0+Y2hhbltpXS5jZGV2 LAotCQkJCQkweDgwICsgNCpqLCAmbXRyKTsKLQkJCWlmIChJU19ESU1NX1BSRVNFTlQobXRyKSkK LQkJCQluZGltbXMgKz0gZ2V0X2RpbW1faW5mbyhtdHIsIGFtYXAsIGRpbW0sIGltYywgaSwgaik7 Ci0JCQllbHNlIGlmIChJU19OVkRJTU1fUFJFU0VOVChtY2RkcnRjZmcsIGopKQotCQkJCW5kaW1t cyArPSBnZXRfbnZkaW1tX2luZm8oZGltbSwgaW1jLCBpLCBqKTsKLQkJfQotCQlpZiAobmRpbW1z ICYmICFza3hfY2hlY2tfZWNjKGltYy0+Y2hhblswXS5jZGV2KSkgewotCQkJc2t4X3ByaW50ayhL RVJOX0VSUiwgIkVDQyBpcyBkaXNhYmxlZCBvbiBpbWMgJWRcbiIsIGltYy0+bWMpOwotCQkJcmV0 dXJuIC1FTk9ERVY7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgc2t4 X3VucmVnaXN0ZXJfbWNpKHN0cnVjdCBza3hfaW1jICppbWMpCi17Ci0Jc3RydWN0IG1lbV9jdGxf aW5mbyAqbWNpID0gaW1jLT5tY2k7Ci0KLQlpZiAoIW1jaSkKLQkJcmV0dXJuOwotCi0JZWRhY19k YmcoMCwgIk1DJWQ6IG1jaSA9ICVwXG4iLCBpbWMtPm1jLCBtY2kpOwotCi0JLyogUmVtb3ZlIE1D IHN5c2ZzIG5vZGVzICovCi0JZWRhY19tY19kZWxfbWMobWNpLT5wZGV2KTsKLQotCWVkYWNfZGJn KDEsICIlczogZnJlZSBtY2kgc3RydWN0XG4iLCBtY2ktPmN0bF9uYW1lKTsKLQlrZnJlZShtY2kt PmN0bF9uYW1lKTsKLQllZGFjX21jX2ZyZWUobWNpKTsKLX0KLQotc3RhdGljIGludCBza3hfcmVn aXN0ZXJfbWNpKHN0cnVjdCBza3hfaW1jICppbWMpCi17Ci0Jc3RydWN0IG1lbV9jdGxfaW5mbyAq bWNpOwotCXN0cnVjdCBlZGFjX21jX2xheWVyIGxheWVyc1syXTsKLQlzdHJ1Y3QgcGNpX2RldiAq cGRldiA9IGltYy0+Y2hhblswXS5jZGV2OwotCXN0cnVjdCBza3hfcHZ0ICpwdnQ7Ci0JaW50IHJj OwotCi0JLyogYWxsb2NhdGUgYSBuZXcgTUMgY29udHJvbCBzdHJ1Y3R1cmUgKi8KLQlsYXllcnNb MF0udHlwZSA9IEVEQUNfTUNfTEFZRVJfQ0hBTk5FTDsKLQlsYXllcnNbMF0uc2l6ZSA9IE5VTV9D SEFOTkVMUzsKLQlsYXllcnNbMF0uaXNfdmlydF9jc3JvdyA9IGZhbHNlOwotCWxheWVyc1sxXS50 eXBlID0gRURBQ19NQ19MQVlFUl9TTE9UOwotCWxheWVyc1sxXS5zaXplID0gTlVNX0RJTU1TOwot CWxheWVyc1sxXS5pc192aXJ0X2Nzcm93ID0gdHJ1ZTsKLQltY2kgPSBlZGFjX21jX2FsbG9jKGlt Yy0+bWMsIEFSUkFZX1NJWkUobGF5ZXJzKSwgbGF5ZXJzLAotCQkJICAgIHNpemVvZihzdHJ1Y3Qg c2t4X3B2dCkpOwotCi0JaWYgKHVubGlrZWx5KCFtY2kpKQotCQlyZXR1cm4gLUVOT01FTTsKLQot CWVkYWNfZGJnKDAsICJNQyMlZDogbWNpID0gJXBcbiIsIGltYy0+bWMsIG1jaSk7Ci0KLQkvKiBB c3NvY2lhdGUgc2t4X2RldiBhbmQgbWNpIGZvciBmdXR1cmUgdXNhZ2UgKi8KLQlpbWMtPm1jaSA9 IG1jaTsKLQlwdnQgPSBtY2ktPnB2dF9pbmZvOwotCXB2dC0+aW1jID0gaW1jOwotCi0JbWNpLT5j dGxfbmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiU2t5bGFrZSBTb2NrZXQjJWQgSU1DIyVk IiwKLQkJCQkgIGltYy0+bm9kZV9pZCwgaW1jLT5sbWMpOwotCWlmICghbWNpLT5jdGxfbmFtZSkg ewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gZmFpbDA7Ci0JfQotCi0JbWNpLT5tdHlwZV9jYXAg PSBNRU1fRkxBR19ERFI0IHwgTUVNX0ZMQUdfTlZESU1NOwotCW1jaS0+ZWRhY19jdGxfY2FwID0g RURBQ19GTEFHX05PTkU7Ci0JbWNpLT5lZGFjX2NhcCA9IEVEQUNfRkxBR19OT05FOwotCW1jaS0+ bW9kX25hbWUgPSBFREFDX01PRF9TVFI7Ci0JbWNpLT5kZXZfbmFtZSA9IHBjaV9uYW1lKGltYy0+ Y2hhblswXS5jZGV2KTsKLQltY2ktPmN0bF9wYWdlX3RvX3BoeXMgPSBOVUxMOwotCi0JcmMgPSBz a3hfZ2V0X2RpbW1fY29uZmlnKG1jaSk7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBmYWlsOwotCi0J LyogcmVjb3JkIHB0ciB0byB0aGUgZ2VuZXJpYyBkZXZpY2UgKi8KLQltY2ktPnBkZXYgPSAmcGRl di0+ZGV2OwotCi0JLyogYWRkIHRoaXMgbmV3IE1DIGNvbnRyb2wgc3RydWN0dXJlIHRvIEVEQUMn cyBsaXN0IG9mIE1DcyAqLwotCWlmICh1bmxpa2VseShlZGFjX21jX2FkZF9tYyhtY2kpKSkgewot CQllZGFjX2RiZygwLCAiTUM6IGZhaWxlZCBlZGFjX21jX2FkZF9tYygpXG4iKTsKLQkJcmMgPSAt RUlOVkFMOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWZhaWw6Ci0Ja2ZyZWUo bWNpLT5jdGxfbmFtZSk7Ci1mYWlsMDoKLQllZGFjX21jX2ZyZWUobWNpKTsKLQlpbWMtPm1jaSA9 IE5VTEw7Ci0JcmV0dXJuIHJjOwotfQotCi0jZGVmaW5lCVNLWF9NQVhfU0FEIDI0Ci0KLSNkZWZp bmUgU0tYX0dFVF9TQUQoZCwgaSwgcmVnKQlcCi0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKChkKS0+ c2FkX2FsbCwgMHg2MCArIDggKiAoaSksICZyZWcpCi0jZGVmaW5lIFNLWF9HRVRfSUxWKGQsIGks IHJlZykJXAotCXBjaV9yZWFkX2NvbmZpZ19kd29yZCgoZCktPnNhZF9hbGwsIDB4NjQgKyA4ICog KGkpLCAmcmVnKQotCi0jZGVmaW5lCVNLWF9TQURfTU9EM01PREUoc2FkKQlHRVRfQklURklFTEQo KHNhZCksIDMwLCAzMSkKLSNkZWZpbmUJU0tYX1NBRF9NT0QzKHNhZCkJR0VUX0JJVEZJRUxEKChz YWQpLCAyNywgMjcpCi0jZGVmaW5lIFNLWF9TQURfTElNSVQoc2FkKQkoKCh1NjQpR0VUX0JJVEZJ RUxEKChzYWQpLCA3LCAyNikgPDwgMjYpIHwgTUFTSzI2KQotI2RlZmluZQlTS1hfU0FEX01PRDNB U01PRDIoc2FkKQlHRVRfQklURklFTEQoKHNhZCksIDUsIDYpCi0jZGVmaW5lCVNLWF9TQURfQVRU UihzYWQpCUdFVF9CSVRGSUVMRCgoc2FkKSwgMywgNCkKLSNkZWZpbmUJU0tYX1NBRF9JTlRFUkxF QVZFKHNhZCkJR0VUX0JJVEZJRUxEKChzYWQpLCAxLCAyKQotI2RlZmluZSBTS1hfU0FEX0VOQUJM RShzYWQpCUdFVF9CSVRGSUVMRCgoc2FkKSwgMCwgMCkKLQotI2RlZmluZSBTS1hfSUxWX1JFTU9U RSh0Z3QpCSgoKHRndCkgJiA4KSA9PSAwKQotI2RlZmluZSBTS1hfSUxWX1RBUkdFVCh0Z3QpCSgo dGd0KSAmIDcpCi0KLXN0YXRpYyBib29sIHNreF9zYWRfZGVjb2RlKHN0cnVjdCBkZWNvZGVkX2Fk ZHIgKnJlcykKLXsKLQlzdHJ1Y3Qgc2t4X2RldiAqZCA9IGxpc3RfZmlyc3RfZW50cnkoJnNreF9l ZGFjX2xpc3QsIHR5cGVvZigqZCksIGxpc3QpOwotCXU2NCBhZGRyID0gcmVzLT5hZGRyOwotCWlu dCBpLCBpZHgsIHRndCwgbGNoYW4sIHNoaWZ0OwotCXUzMiBzYWQsIGlsdjsKLQl1NjQgbGltaXQs IHByZXZfbGltaXQ7Ci0JaW50IHJlbW90ZSA9IDA7Ci0KLQkvKiBTaW1wbGUgc2FuaXR5IGNoZWNr IGZvciBJL08gc3BhY2Ugb3Igb3V0IG9mIHJhbmdlICovCi0JaWYgKGFkZHIgPj0gc2t4X3RvaG0g fHwgKGFkZHIgPj0gc2t4X3RvbG0gJiYgYWRkciA8IEJJVF9VTEwoMzIpKSkgewotCQllZGFjX2Ri ZygwLCAiQWRkcmVzcyAweCVsbHggb3V0IG9mIHJhbmdlXG4iLCBhZGRyKTsKLQkJcmV0dXJuIGZh bHNlOwotCX0KLQotcmVzdGFydDoKLQlwcmV2X2xpbWl0ID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwg U0tYX01BWF9TQUQ7IGkrKykgewotCQlTS1hfR0VUX1NBRChkLCBpLCBzYWQpOwotCQlsaW1pdCA9 IFNLWF9TQURfTElNSVQoc2FkKTsKLQkJaWYgKFNLWF9TQURfRU5BQkxFKHNhZCkpIHsKLQkJCWlm IChhZGRyID49IHByZXZfbGltaXQgJiYgYWRkciA8PSBsaW1pdCkKLQkJCQlnb3RvIHNhZF9mb3Vu ZDsKLQkJfQotCQlwcmV2X2xpbWl0ID0gbGltaXQgKyAxOwotCX0KLQllZGFjX2RiZygwLCAiTm8g U0FEIGVudHJ5IGZvciAweCVsbHhcbiIsIGFkZHIpOwotCXJldHVybiBmYWxzZTsKLQotc2FkX2Zv dW5kOgotCVNLWF9HRVRfSUxWKGQsIGksIGlsdik7Ci0KLQlzd2l0Y2ggKFNLWF9TQURfSU5URVJM RUFWRShzYWQpKSB7Ci0JY2FzZSAwOgotCQlpZHggPSBHRVRfQklURklFTEQoYWRkciwgNiwgOCk7 Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJaWR4ID0gR0VUX0JJVEZJRUxEKGFkZHIsIDgsIDEwKTsK LQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlpZHggPSBHRVRfQklURklFTEQoYWRkciwgMTIsIDE0KTsK LQkJYnJlYWs7Ci0JY2FzZSAzOgotCQlpZHggPSBHRVRfQklURklFTEQoYWRkciwgMzAsIDMyKTsK LQkJYnJlYWs7Ci0JfQotCi0JdGd0ID0gR0VUX0JJVEZJRUxEKGlsdiwgNCAqIGlkeCwgNCAqIGlk eCArIDMpOwotCi0JLyogSWYgcG9pbnQgdG8gYW5vdGhlciBub2RlLCBmaW5kIGl0IGFuZCBzdGFy dCBvdmVyICovCi0JaWYgKFNLWF9JTFZfUkVNT1RFKHRndCkpIHsKLQkJaWYgKHJlbW90ZSkgewot CQkJZWRhY19kYmcoMCwgIkRvdWJsZSByZW1vdGUhXG4iKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJ fQotCQlyZW1vdGUgPSAxOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGQsICZza3hfZWRhY19saXN0 LCBsaXN0KSB7Ci0JCQlpZiAoZC0+aW1jWzBdLnNyY19pZCA9PSBTS1hfSUxWX1RBUkdFVCh0Z3Qp KQotCQkJCWdvdG8gcmVzdGFydDsKLQkJfQotCQllZGFjX2RiZygwLCAiQ2FuJ3QgZmluZCBub2Rl ICVkXG4iLCBTS1hfSUxWX1RBUkdFVCh0Z3QpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCWlm IChTS1hfU0FEX01PRDMoc2FkKSA9PSAwKQotCQlsY2hhbiA9IFNLWF9JTFZfVEFSR0VUKHRndCk7 Ci0JZWxzZSB7Ci0JCXN3aXRjaCAoU0tYX1NBRF9NT0QzTU9ERShzYWQpKSB7Ci0JCWNhc2UgMDoK LQkJCXNoaWZ0ID0gNjsKLQkJCWJyZWFrOwotCQljYXNlIDE6Ci0JCQlzaGlmdCA9IDg7Ci0JCQli cmVhazsKLQkJY2FzZSAyOgotCQkJc2hpZnQgPSAxMjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0Ogot CQkJZWRhY19kYmcoMCwgImlsbGVnYWwgbW9kM21vZGVcbiIpOwotCQkJcmV0dXJuIGZhbHNlOwot CQl9Ci0JCXN3aXRjaCAoU0tYX1NBRF9NT0QzQVNNT0QyKHNhZCkpIHsKLQkJY2FzZSAwOgotCQkJ bGNoYW4gPSAoYWRkciA+PiBzaGlmdCkgJSAzOwotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCWxj aGFuID0gKGFkZHIgPj4gc2hpZnQpICUgMjsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQlsY2hh biA9IChhZGRyID4+IHNoaWZ0KSAlIDI7Ci0JCQlsY2hhbiA9IChsY2hhbiA8PCAxKSB8ICFsY2hh bjsKLQkJCWJyZWFrOwotCQljYXNlIDM6Ci0JCQlsY2hhbiA9ICgoYWRkciA+PiBzaGlmdCkgJSAy KSA8PCAxOwotCQkJYnJlYWs7Ci0JCX0KLQkJbGNoYW4gPSAobGNoYW4gPDwgMSkgfCAoU0tYX0lM Vl9UQVJHRVQodGd0KSAmIDEpOwotCX0KLQotCXJlcy0+ZGV2ID0gZDsKLQlyZXMtPnNvY2tldCA9 IGQtPmltY1swXS5zcmNfaWQ7Ci0JcmVzLT5pbWMgPSBHRVRfQklURklFTEQoZC0+bWNyb3V0ZSwg bGNoYW4gKiAzLCBsY2hhbiAqIDMgKyAyKTsKLQlyZXMtPmNoYW5uZWwgPSBHRVRfQklURklFTEQo ZC0+bWNyb3V0ZSwgbGNoYW4gKiAyICsgMTgsIGxjaGFuICogMiArIDE5KTsKLQotCWVkYWNfZGJn KDIsICIweCVsbHg6IHNvY2tldD0lZCBpbWM9JWQgY2hhbm5lbD0lZFxuIiwKLQkJIHJlcy0+YWRk ciwgcmVzLT5zb2NrZXQsIHJlcy0+aW1jLCByZXMtPmNoYW5uZWwpOwotCXJldHVybiB0cnVlOwot fQotCi0jZGVmaW5lCVNLWF9NQVhfVEFEIDgKLQotI2RlZmluZSBTS1hfR0VUX1RBREJBU0UoZCwg bWMsIGksIHJlZykJCQlcCi0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKChkKS0+aW1jW21jXS5jaGFu WzBdLmNkZXYsIDB4ODUwICsgNCAqIChpKSwgJnJlZykKLSNkZWZpbmUgU0tYX0dFVF9UQURXQVlO RVNTKGQsIG1jLCBpLCByZWcpCQlcCi0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKChkKS0+aW1jW21j XS5jaGFuWzBdLmNkZXYsIDB4ODgwICsgNCAqIChpKSwgJnJlZykKLSNkZWZpbmUgU0tYX0dFVF9U QURDSE5JTFZPRkZTRVQoZCwgbWMsIGNoLCBpLCByZWcpCVwKLQlwY2lfcmVhZF9jb25maWdfZHdv cmQoKGQpLT5pbWNbbWNdLmNoYW5bY2hdLmNkZXYsIDB4OTAgKyA0ICogKGkpLCAmcmVnKQotCi0j ZGVmaW5lCVNLWF9UQURfQkFTRShiKQkJKCh1NjQpR0VUX0JJVEZJRUxEKChiKSwgMTIsIDMxKSA8 PCAyNikKLSNkZWZpbmUgU0tYX1RBRF9TS1RfR1JBTihiKQlHRVRfQklURklFTEQoKGIpLCA0LCA1 KQotI2RlZmluZSBTS1hfVEFEX0NITl9HUkFOKGIpCUdFVF9CSVRGSUVMRCgoYiksIDYsIDcpCi0j ZGVmaW5lCVNLWF9UQURfTElNSVQoYikJKCgodTY0KUdFVF9CSVRGSUVMRCgoYiksIDEyLCAzMSkg PDwgMjYpIHwgTUFTSzI2KQotI2RlZmluZQlTS1hfVEFEX09GRlNFVChiKQkoKHU2NClHRVRfQklU RklFTEQoKGIpLCA0LCAyMykgPDwgMjYpCi0jZGVmaW5lCVNLWF9UQURfU0tUV0FZUyhiKQkoMSA8 PCBHRVRfQklURklFTEQoKGIpLCAxMCwgMTEpKQotI2RlZmluZQlTS1hfVEFEX0NITldBWVMoYikJ KEdFVF9CSVRGSUVMRCgoYiksIDgsIDkpICsgMSkKLQotLyogd2hpY2ggYml0IHVzZWQgZm9yIGJv dGggc29ja2V0IGFuZCBjaGFubmVsIGludGVybGVhdmUgKi8KLXN0YXRpYyBpbnQgc2t4X2dyYW51 bGFyaXR5W10gPSB7IDYsIDgsIDEyLCAzMCB9OwotCi1zdGF0aWMgdTY0IHNreF9kb19pbnRlcmxl YXZlKHU2NCBhZGRyLCBpbnQgc2hpZnQsIGludCB3YXlzLCB1NjQgbG93Yml0cykKLXsKLQlhZGRy ID4+PSBzaGlmdDsKLQlhZGRyIC89IHdheXM7Ci0JYWRkciA8PD0gc2hpZnQ7Ci0KLQlyZXR1cm4g YWRkciB8IChsb3diaXRzICYgKCgxdWxsIDw8IHNoaWZ0KSAtIDEpKTsKLX0KLQotc3RhdGljIGJv b2wgc2t4X3RhZF9kZWNvZGUoc3RydWN0IGRlY29kZWRfYWRkciAqcmVzKQotewotCWludCBpOwot CXUzMiBiYXNlLCB3YXluZXNzLCBjaG5pbHZvZmZzZXQ7Ci0JaW50IHNrdF9pbnRlcmxlYXZlX2Jp dCwgY2huX2ludGVybGVhdmVfYml0OwotCXU2NCBjaGFubmVsX2FkZHI7Ci0KLQlmb3IgKGkgPSAw OyBpIDwgU0tYX01BWF9UQUQ7IGkrKykgewotCQlTS1hfR0VUX1RBREJBU0UocmVzLT5kZXYsIHJl cy0+aW1jLCBpLCBiYXNlKTsKLQkJU0tYX0dFVF9UQURXQVlORVNTKHJlcy0+ZGV2LCByZXMtPmlt YywgaSwgd2F5bmVzcyk7Ci0JCWlmIChTS1hfVEFEX0JBU0UoYmFzZSkgPD0gcmVzLT5hZGRyICYm IHJlcy0+YWRkciA8PSBTS1hfVEFEX0xJTUlUKHdheW5lc3MpKQotCQkJZ290byB0YWRfZm91bmQ7 Ci0JfQotCWVkYWNfZGJnKDAsICJObyBUQUQgZW50cnkgZm9yIDB4JWxseFxuIiwgcmVzLT5hZGRy KTsKLQlyZXR1cm4gZmFsc2U7Ci0KLXRhZF9mb3VuZDoKLQlyZXMtPnNrdHdheXMgPSBTS1hfVEFE X1NLVFdBWVMod2F5bmVzcyk7Ci0JcmVzLT5jaGFud2F5cyA9IFNLWF9UQURfQ0hOV0FZUyh3YXlu ZXNzKTsKLQlza3RfaW50ZXJsZWF2ZV9iaXQgPSBza3hfZ3JhbnVsYXJpdHlbU0tYX1RBRF9TS1Rf R1JBTihiYXNlKV07Ci0JY2huX2ludGVybGVhdmVfYml0ID0gc2t4X2dyYW51bGFyaXR5W1NLWF9U QURfQ0hOX0dSQU4oYmFzZSldOwotCi0JU0tYX0dFVF9UQURDSE5JTFZPRkZTRVQocmVzLT5kZXYs IHJlcy0+aW1jLCByZXMtPmNoYW5uZWwsIGksIGNobmlsdm9mZnNldCk7Ci0JY2hhbm5lbF9hZGRy ID0gcmVzLT5hZGRyIC0gU0tYX1RBRF9PRkZTRVQoY2huaWx2b2Zmc2V0KTsKLQotCWlmIChyZXMt PmNoYW53YXlzID09IDMgJiYgc2t0X2ludGVybGVhdmVfYml0ID4gY2huX2ludGVybGVhdmVfYml0 KSB7Ci0JCS8qIE11c3QgaGFuZGxlIGNoYW5uZWwgZmlyc3QsIHRoZW4gc29ja2V0ICovCi0JCWNo YW5uZWxfYWRkciA9IHNreF9kb19pbnRlcmxlYXZlKGNoYW5uZWxfYWRkciwgY2huX2ludGVybGVh dmVfYml0LAotCQkJCQkJIHJlcy0+Y2hhbndheXMsIGNoYW5uZWxfYWRkcik7Ci0JCWNoYW5uZWxf YWRkciA9IHNreF9kb19pbnRlcmxlYXZlKGNoYW5uZWxfYWRkciwgc2t0X2ludGVybGVhdmVfYml0 LAotCQkJCQkJIHJlcy0+c2t0d2F5cywgY2hhbm5lbF9hZGRyKTsKLQl9IGVsc2UgewotCQkvKiBI YW5kbGUgc29ja2V0IHRoZW4gY2hhbm5lbC4gUHJlc2VydmUgbG93IGJpdHMgZnJvbSBvcmlnaW5h bCBhZGRyZXNzICovCi0JCWNoYW5uZWxfYWRkciA9IHNreF9kb19pbnRlcmxlYXZlKGNoYW5uZWxf YWRkciwgc2t0X2ludGVybGVhdmVfYml0LAotCQkJCQkJIHJlcy0+c2t0d2F5cywgcmVzLT5hZGRy KTsKLQkJY2hhbm5lbF9hZGRyID0gc2t4X2RvX2ludGVybGVhdmUoY2hhbm5lbF9hZGRyLCBjaG5f aW50ZXJsZWF2ZV9iaXQsCi0JCQkJCQkgcmVzLT5jaGFud2F5cywgcmVzLT5hZGRyKTsKLQl9Ci0K LQlyZXMtPmNoYW5fYWRkciA9IGNoYW5uZWxfYWRkcjsKLQotCWVkYWNfZGJnKDIsICIweCVsbHg6 IGNoYW5fYWRkcj0weCVsbHggc2t0d2F5cz0lZCBjaGFud2F5cz0lZFxuIiwKLQkJIHJlcy0+YWRk ciwgcmVzLT5jaGFuX2FkZHIsIHJlcy0+c2t0d2F5cywgcmVzLT5jaGFud2F5cyk7Ci0JcmV0dXJu IHRydWU7Ci19Ci0KLSNkZWZpbmUgU0tYX01BWF9SSVIgNAotCi0jZGVmaW5lIFNLWF9HRVRfUklS V0FZTkVTUyhkLCBtYywgY2gsIGksIHJlZykJCVwKLQlwY2lfcmVhZF9jb25maWdfZHdvcmQoKGQp LT5pbWNbbWNdLmNoYW5bY2hdLmNkZXYsCVwKLQkJCSAgICAgIDB4MTA4ICsgNCAqIChpKSwgJnJl ZykKLSNkZWZpbmUgU0tYX0dFVF9SSVJJTFYoZCwgbWMsIGNoLCBpZHgsIGksIHJlZykJCVwKLQlw Y2lfcmVhZF9jb25maWdfZHdvcmQoKGQpLT5pbWNbbWNdLmNoYW5bY2hdLmNkZXYsCVwKLQkJCSAg ICAgIDB4MTIwICsgMTYgKiBpZHggKyA0ICogKGkpLCAmcmVnKQotCi0jZGVmaW5lCVNLWF9SSVJf VkFMSUQoYikgR0VUX0JJVEZJRUxEKChiKSwgMzEsIDMxKQotI2RlZmluZQlTS1hfUklSX0xJTUlU KGIpICgoKHU2NClHRVRfQklURklFTEQoKGIpLCAxLCAxMSkgPDwgMjkpIHwgTUFTSzI5KQotI2Rl ZmluZQlTS1hfUklSX1dBWVMoYikgKDEgPDwgR0VUX0JJVEZJRUxEKChiKSwgMjgsIDI5KSkKLSNk ZWZpbmUJU0tYX1JJUl9DSEFOX1JBTksoYikgR0VUX0JJVEZJRUxEKChiKSwgMTYsIDE5KQotI2Rl ZmluZQlTS1hfUklSX09GRlNFVChiKSAoKHU2NCkoR0VUX0JJVEZJRUxEKChiKSwgMiwgMTUpIDw8 IDI2KSkKLQotc3RhdGljIGJvb2wgc2t4X3Jpcl9kZWNvZGUoc3RydWN0IGRlY29kZWRfYWRkciAq cmVzKQotewotCWludCBpLCBpZHgsIGNoYW5fcmFuazsKLQlpbnQgc2hpZnQ7Ci0JdTMyIHJpcndh eSwgcmlybHY7Ci0JdTY0IHJhbmtfYWRkciwgcHJldl9saW1pdCA9IDAsIGxpbWl0OwotCi0JaWYg KHJlcy0+ZGV2LT5pbWNbcmVzLT5pbWNdLmNoYW5bcmVzLT5jaGFubmVsXS5kaW1tc1swXS5jbG9z ZV9wZykKLQkJc2hpZnQgPSA2OwotCWVsc2UKLQkJc2hpZnQgPSAxMzsKLQotCWZvciAoaSA9IDA7 IGkgPCBTS1hfTUFYX1JJUjsgaSsrKSB7Ci0JCVNLWF9HRVRfUklSV0FZTkVTUyhyZXMtPmRldiwg cmVzLT5pbWMsIHJlcy0+Y2hhbm5lbCwgaSwgcmlyd2F5KTsKLQkJbGltaXQgPSBTS1hfUklSX0xJ TUlUKHJpcndheSk7Ci0JCWlmIChTS1hfUklSX1ZBTElEKHJpcndheSkpIHsKLQkJCWlmIChwcmV2 X2xpbWl0IDw9IHJlcy0+Y2hhbl9hZGRyICYmCi0JCQkgICAgcmVzLT5jaGFuX2FkZHIgPD0gbGlt aXQpCi0JCQkJZ290byByaXJfZm91bmQ7Ci0JCX0KLQkJcHJldl9saW1pdCA9IGxpbWl0OwotCX0K LQllZGFjX2RiZygwLCAiTm8gUklSIGVudHJ5IGZvciAweCVsbHhcbiIsIHJlcy0+YWRkcik7Ci0J cmV0dXJuIGZhbHNlOwotCi1yaXJfZm91bmQ6Ci0JcmFua19hZGRyID0gcmVzLT5jaGFuX2FkZHIg Pj4gc2hpZnQ7Ci0JcmFua19hZGRyIC89IFNLWF9SSVJfV0FZUyhyaXJ3YXkpOwotCXJhbmtfYWRk ciA8PD0gc2hpZnQ7Ci0JcmFua19hZGRyIHw9IHJlcy0+Y2hhbl9hZGRyICYgR0VOTUFTS19VTEwo c2hpZnQgLSAxLCAwKTsKLQotCXJlcy0+cmFua19hZGRyZXNzID0gcmFua19hZGRyOwotCWlkeCA9 IChyZXMtPmNoYW5fYWRkciA+PiBzaGlmdCkgJSBTS1hfUklSX1dBWVMocmlyd2F5KTsKLQotCVNL WF9HRVRfUklSSUxWKHJlcy0+ZGV2LCByZXMtPmltYywgcmVzLT5jaGFubmVsLCBpZHgsIGksIHJp cmx2KTsKLQlyZXMtPnJhbmtfYWRkcmVzcyA9IHJhbmtfYWRkciAtIFNLWF9SSVJfT0ZGU0VUKHJp cmx2KTsKLQljaGFuX3JhbmsgPSBTS1hfUklSX0NIQU5fUkFOSyhyaXJsdik7Ci0JcmVzLT5jaGFu bmVsX3JhbmsgPSBjaGFuX3Jhbms7Ci0JcmVzLT5kaW1tID0gY2hhbl9yYW5rIC8gNDsKLQlyZXMt PnJhbmsgPSBjaGFuX3JhbmsgJSA0OwotCi0JZWRhY19kYmcoMiwgIjB4JWxseDogZGltbT0lZCBy YW5rPSVkIGNoYW5fcmFuaz0lZCByYW5rX2FkZHI9MHglbGx4XG4iLAotCQkgcmVzLT5hZGRyLCBy ZXMtPmRpbW0sIHJlcy0+cmFuaywKLQkJIHJlcy0+Y2hhbm5lbF9yYW5rLCByZXMtPnJhbmtfYWRk cmVzcyk7Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB1OCBza3hfY2xvc2Vfcm93W10gPSB7 Ci0JMTUsIDE2LCAxNywgMTgsIDIwLCAyMSwgMjIsIDI4LCAxMCwgMTEsIDEyLCAxMywgMjksIDMw LCAzMSwgMzIsIDMzCi19Owotc3RhdGljIHU4IHNreF9jbG9zZV9jb2x1bW5bXSA9IHsKLQkzLCA0 LCA1LCAxNCwgMTksIDIzLCAyNCwgMjUsIDI2LCAyNwotfTsKLXN0YXRpYyB1OCBza3hfb3Blbl9y b3dbXSA9IHsKLQkxNCwgMTUsIDE2LCAyMCwgMjgsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3 LCAyOSwgMzAsIDMxLCAzMiwgMzMKLX07Ci1zdGF0aWMgdTggc2t4X29wZW5fY29sdW1uW10gPSB7 Ci0JMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMgotfTsKLXN0YXRpYyB1OCBza3hfb3Bl bl9maW5lX2NvbHVtbltdID0gewotCTMsIDQsIDUsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzCi19 OwotCi1zdGF0aWMgaW50IHNreF9iaXRzKHU2NCBhZGRyLCBpbnQgbmJpdHMsIHU4ICpiaXRzKQot ewotCWludCBpLCByZXMgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IG5iaXRzOyBpKyspCi0JCXJl cyB8PSAoKGFkZHIgPj4gYml0c1tpXSkgJiAxKSA8PCBpOwotCXJldHVybiByZXM7Ci19Ci0KLXN0 YXRpYyBpbnQgc2t4X2JhbmtfYml0cyh1NjQgYWRkciwgaW50IGIwLCBpbnQgYjEsIGludCBkb194 b3IsIGludCB4MCwgaW50IHgxKQotewotCWludCByZXQgPSBHRVRfQklURklFTEQoYWRkciwgYjAs IGIwKSB8IChHRVRfQklURklFTEQoYWRkciwgYjEsIGIxKSA8PCAxKTsKLQotCWlmIChkb194b3Ip Ci0JCXJldCBePSBHRVRfQklURklFTEQoYWRkciwgeDAsIHgwKSB8IChHRVRfQklURklFTEQoYWRk ciwgeDEsIHgxKSA8PCAxKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBib29sIHNreF9t YWRfZGVjb2RlKHN0cnVjdCBkZWNvZGVkX2FkZHIgKnIpCi17Ci0Jc3RydWN0IHNreF9kaW1tICpk aW1tID0gJnItPmRldi0+aW1jW3ItPmltY10uY2hhbltyLT5jaGFubmVsXS5kaW1tc1tyLT5kaW1t XTsKLQlpbnQgYmcwID0gZGltbS0+ZmluZV9ncmFpbl9iYW5rID8gNiA6IDEzOwotCi0JaWYgKGRp bW0tPmNsb3NlX3BnKSB7Ci0JCXItPnJvdyA9IHNreF9iaXRzKHItPnJhbmtfYWRkcmVzcywgZGlt bS0+cm93Yml0cywgc2t4X2Nsb3NlX3Jvdyk7Ci0JCXItPmNvbHVtbiA9IHNreF9iaXRzKHItPnJh bmtfYWRkcmVzcywgZGltbS0+Y29sYml0cywgc2t4X2Nsb3NlX2NvbHVtbik7Ci0JCXItPmNvbHVt biB8PSAweDQwMDsgLyogQzEwIGlzIGF1dG9wcmVjaGFyZ2UsIGFsd2F5cyBzZXQgKi8KLQkJci0+ YmFua19hZGRyZXNzID0gc2t4X2JhbmtfYml0cyhyLT5yYW5rX2FkZHJlc3MsIDgsIDksIGRpbW0t PmJhbmtfeG9yX2VuYWJsZSwgMjIsIDI4KTsKLQkJci0+YmFua19ncm91cCA9IHNreF9iYW5rX2Jp dHMoci0+cmFua19hZGRyZXNzLCA2LCA3LCBkaW1tLT5iYW5rX3hvcl9lbmFibGUsIDIwLCAyMSk7 Ci0JfSBlbHNlIHsKLQkJci0+cm93ID0gc2t4X2JpdHMoci0+cmFua19hZGRyZXNzLCBkaW1tLT5y b3diaXRzLCBza3hfb3Blbl9yb3cpOwotCQlpZiAoZGltbS0+ZmluZV9ncmFpbl9iYW5rKQotCQkJ ci0+Y29sdW1uID0gc2t4X2JpdHMoci0+cmFua19hZGRyZXNzLCBkaW1tLT5jb2xiaXRzLCBza3hf b3Blbl9maW5lX2NvbHVtbik7Ci0JCWVsc2UKLQkJCXItPmNvbHVtbiA9IHNreF9iaXRzKHItPnJh bmtfYWRkcmVzcywgZGltbS0+Y29sYml0cywgc2t4X29wZW5fY29sdW1uKTsKLQkJci0+YmFua19h ZGRyZXNzID0gc2t4X2JhbmtfYml0cyhyLT5yYW5rX2FkZHJlc3MsIDE4LCAxOSwgZGltbS0+YmFu a194b3JfZW5hYmxlLCAyMiwgMjMpOwotCQlyLT5iYW5rX2dyb3VwID0gc2t4X2JhbmtfYml0cyhy LT5yYW5rX2FkZHJlc3MsIGJnMCwgMTcsIGRpbW0tPmJhbmtfeG9yX2VuYWJsZSwgMjAsIDIxKTsK LQl9Ci0Jci0+cm93ICY9ICgxdSA8PCBkaW1tLT5yb3diaXRzKSAtIDE7Ci0KLQllZGFjX2RiZygy LCAiMHglbGx4OiByb3c9MHgleCBjb2w9MHgleCBiYW5rX2FkZHI9JWQgYmFua19ncm91cD0lZFxu IiwKLQkJIHItPmFkZHIsIHItPnJvdywgci0+Y29sdW1uLCByLT5iYW5rX2FkZHJlc3MsCi0JCSBy LT5iYW5rX2dyb3VwKTsKLQlyZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgc2t4X2RlY29k ZShzdHJ1Y3QgZGVjb2RlZF9hZGRyICpyZXMpCi17Ci0KLQlyZXR1cm4gc2t4X3NhZF9kZWNvZGUo cmVzKSAmJiBza3hfdGFkX2RlY29kZShyZXMpICYmCi0JCXNreF9yaXJfZGVjb2RlKHJlcykgJiYg c2t4X21hZF9kZWNvZGUocmVzKTsKLX0KLQotc3RhdGljIGJvb2wgc2t4X2FkeGxfZGVjb2RlKHN0 cnVjdCBkZWNvZGVkX2FkZHIgKnJlcykKLQotewotCWludCBpLCBsZW4gPSAwOwotCi0JaWYgKHJl cy0+YWRkciA+PSBza3hfdG9obSB8fCAocmVzLT5hZGRyID49IHNreF90b2xtICYmCi0JCQkJICAg ICAgcmVzLT5hZGRyIDwgQklUX1VMTCgzMikpKSB7Ci0JCWVkYWNfZGJnKDAsICJBZGRyZXNzIDB4 JWxseCBvdXQgb2YgcmFuZ2VcbiIsIHJlcy0+YWRkcik7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0K LQlpZiAoYWR4bF9kZWNvZGUocmVzLT5hZGRyLCBhZHhsX3ZhbHVlcykpIHsKLQkJZWRhY19kYmco MCwgIkZhaWxlZCB0byBkZWNvZGUgMHglbGx4XG4iLCByZXMtPmFkZHIpOwotCQlyZXR1cm4gZmFs c2U7Ci0JfQotCi0JcmVzLT5zb2NrZXQgID0gKGludClhZHhsX3ZhbHVlc1tjb21wb25lbnRfaW5k aWNlc1tJTkRFWF9TT0NLRVRdXTsKLQlyZXMtPmltYyAgICAgPSAoaW50KWFkeGxfdmFsdWVzW2Nv bXBvbmVudF9pbmRpY2VzW0lOREVYX01FTUNUUkxdXTsKLQlyZXMtPmNoYW5uZWwgPSAoaW50KWFk eGxfdmFsdWVzW2NvbXBvbmVudF9pbmRpY2VzW0lOREVYX0NIQU5ORUxdXTsKLQlyZXMtPmRpbW0g ICAgPSAoaW50KWFkeGxfdmFsdWVzW2NvbXBvbmVudF9pbmRpY2VzW0lOREVYX0RJTU1dXTsKLQot CWZvciAoaSA9IDA7IGkgPCBhZHhsX2NvbXBvbmVudF9jb3VudDsgaSsrKSB7Ci0JCWlmIChhZHhs X3ZhbHVlc1tpXSA9PSB+MHgwdWxsKQotCQkJY29udGludWU7Ci0KLQkJbGVuICs9IHNucHJpbnRm KGFkeGxfbXNnICsgbGVuLCBNU0dfU0laRSAtIGxlbiwgIiAlczoweCVsbHgiLAotCQkJCWFkeGxf Y29tcG9uZW50X25hbWVzW2ldLCBhZHhsX3ZhbHVlc1tpXSk7Ci0JCWlmIChNU0dfU0laRSAtIGxl biA8PSAwKQotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lk IHNreF9tY2Vfb3V0cHV0X2Vycm9yKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwKLQkJCQkgY29u c3Qgc3RydWN0IG1jZSAqbSwKLQkJCQkgc3RydWN0IGRlY29kZWRfYWRkciAqcmVzKQotewotCWVu dW0gaHdfZXZlbnRfbWNfZXJyX3R5cGUgdHBfZXZlbnQ7Ci0JY2hhciAqdHlwZSwgKm9wdHlwZTsK LQlib29sIHJpcHYgPSBHRVRfQklURklFTEQobS0+bWNnc3RhdHVzLCAwLCAwKTsKLQlib29sIG92 ZXJmbG93ID0gR0VUX0JJVEZJRUxEKG0tPnN0YXR1cywgNjIsIDYyKTsKLQlib29sIHVuY29ycmVj dGVkX2Vycm9yID0gR0VUX0JJVEZJRUxEKG0tPnN0YXR1cywgNjEsIDYxKTsKLQlib29sIHJlY292 ZXJhYmxlOwotCXUzMiBjb3JlX2Vycl9jbnQgPSBHRVRfQklURklFTEQobS0+c3RhdHVzLCAzOCwg NTIpOwotCXUzMiBtc2NvZCA9IEdFVF9CSVRGSUVMRChtLT5zdGF0dXMsIDE2LCAzMSk7Ci0JdTMy IGVycmNvZGUgPSBHRVRfQklURklFTEQobS0+c3RhdHVzLCAwLCAxNSk7Ci0JdTMyIG9wdHlwZW51 bSA9IEdFVF9CSVRGSUVMRChtLT5zdGF0dXMsIDQsIDYpOwotCi0JcmVjb3ZlcmFibGUgPSBHRVRf QklURklFTEQobS0+c3RhdHVzLCA1NiwgNTYpOwotCi0JaWYgKHVuY29ycmVjdGVkX2Vycm9yKSB7 Ci0JCWNvcmVfZXJyX2NudCA9IDE7Ci0JCWlmIChyaXB2KSB7Ci0JCQl0eXBlID0gIkZBVEFMIjsK LQkJCXRwX2V2ZW50ID0gSFdfRVZFTlRfRVJSX0ZBVEFMOwotCQl9IGVsc2UgewotCQkJdHlwZSA9 ICJOT05fRkFUQUwiOwotCQkJdHBfZXZlbnQgPSBIV19FVkVOVF9FUlJfVU5DT1JSRUNURUQ7Ci0J CX0KLQl9IGVsc2UgewotCQl0eXBlID0gIkNPUlJFQ1RFRCI7Ci0JCXRwX2V2ZW50ID0gSFdfRVZF TlRfRVJSX0NPUlJFQ1RFRDsKLQl9Ci0KLQkvKgotCSAqIEFjY29yZGluZyB3aXRoIFRhYmxlIDE1 LTkgb2YgdGhlIEludGVsIEFyY2hpdGVjdHVyZSBzcGVjIHZvbCAzQSwKLQkgKiBtZW1vcnkgZXJy b3JzIHNob3VsZCBmaXQgaW4gdGhpcyBtYXNrOgotCSAqCTAwMGYgMDAwMCAxbW1tIGNjY2MgKGJp bmFyeSkKLQkgKiB3aGVyZToKLQkgKglmID0gQ29ycmVjdGlvbiBSZXBvcnQgRmlsdGVyaW5nIEJp dC4gSWYgMSwgc3Vic2VxdWVudCBlcnJvcnMKLQkgKgkgICAgd29uJ3QgYmUgc2hvd24KLQkgKglt bW0gPSBlcnJvciB0eXBlCi0JICoJY2NjYyA9IGNoYW5uZWwKLQkgKiBJZiB0aGUgbWFzayBkb2Vz bid0IG1hdGNoLCByZXBvcnQgYW4gZXJyb3IgdG8gdGhlIHBhcnNpbmcgbG9naWMKLQkgKi8KLQlp ZiAoISgoZXJyY29kZSAmIDB4ZWY4MCkgPT0gMHg4MCkpIHsKLQkJb3B0eXBlID0gIkNhbid0IHBh cnNlOiBpdCBpcyBub3QgYSBtZW0iOwotCX0gZWxzZSB7Ci0JCXN3aXRjaCAob3B0eXBlbnVtKSB7 Ci0JCWNhc2UgMDoKLQkJCW9wdHlwZSA9ICJnZW5lcmljIHVuZGVmIHJlcXVlc3QgZXJyb3IiOwot CQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCW9wdHlwZSA9ICJtZW1vcnkgcmVhZCBlcnJvciI7Ci0J CQlicmVhazsKLQkJY2FzZSAyOgotCQkJb3B0eXBlID0gIm1lbW9yeSB3cml0ZSBlcnJvciI7Ci0J CQlicmVhazsKLQkJY2FzZSAzOgotCQkJb3B0eXBlID0gImFkZHIvY21kIGVycm9yIjsKLQkJCWJy ZWFrOwotCQljYXNlIDQ6Ci0JCQlvcHR5cGUgPSAibWVtb3J5IHNjcnViYmluZyBlcnJvciI7Ci0J CQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCW9wdHlwZSA9ICJyZXNlcnZlZCI7Ci0JCQlicmVhazsK LQkJfQotCX0KLQlpZiAoYWR4bF9jb21wb25lbnRfY291bnQpIHsKLQkJc25wcmludGYoc2t4X21z ZywgTVNHX1NJWkUsICIlcyVzIGVycl9jb2RlOjB4JTA0eDoweCUwNHggJXMiLAotCQkJIG92ZXJm bG93ID8gIiBPVkVSRkxPVyIgOiAiIiwKLQkJCSAodW5jb3JyZWN0ZWRfZXJyb3IgJiYgcmVjb3Zl cmFibGUpID8gIiByZWNvdmVyYWJsZSIgOiAiIiwKLQkJCSBtc2NvZCwgZXJyY29kZSwgYWR4bF9t c2cpOwotCX0gZWxzZSB7Ci0JCXNucHJpbnRmKHNreF9tc2csIE1TR19TSVpFLAotCQkJICIlcyVz IGVycl9jb2RlOjB4JTA0eDoweCUwNHggc29ja2V0OiVkIGltYzolZCByYW5rOiVkIGJnOiVkIGJh OiVkIHJvdzoweCV4IGNvbDoweCV4IiwKLQkJCSBvdmVyZmxvdyA/ICIgT1ZFUkZMT1ciIDogIiIs Ci0JCQkgKHVuY29ycmVjdGVkX2Vycm9yICYmIHJlY292ZXJhYmxlKSA/ICIgcmVjb3ZlcmFibGUi IDogIiIsCi0JCQkgbXNjb2QsIGVycmNvZGUsCi0JCQkgcmVzLT5zb2NrZXQsIHJlcy0+aW1jLCBy ZXMtPnJhbmssCi0JCQkgcmVzLT5iYW5rX2dyb3VwLCByZXMtPmJhbmtfYWRkcmVzcywgcmVzLT5y b3csIHJlcy0+Y29sdW1uKTsKLQl9Ci0KLQllZGFjX2RiZygwLCAiJXNcbiIsIHNreF9tc2cpOwot Ci0JLyogQ2FsbCB0aGUgaGVscGVyIHRvIG91dHB1dCBtZXNzYWdlICovCi0JZWRhY19tY19oYW5k bGVfZXJyb3IodHBfZXZlbnQsIG1jaSwgY29yZV9lcnJfY250LAotCQkJICAgICBtLT5hZGRyID4+ IFBBR0VfU0hJRlQsIG0tPmFkZHIgJiB+UEFHRV9NQVNLLCAwLAotCQkJICAgICByZXMtPmNoYW5u ZWwsIHJlcy0+ZGltbSwgLTEsCi0JCQkgICAgIG9wdHlwZSwgc2t4X21zZyk7Ci19Ci0KLXN0YXRp YyBzdHJ1Y3QgbWVtX2N0bF9pbmZvICpnZXRfbWNpKGludCBzcmNfaWQsIGludCBsbWMpCi17Ci0J c3RydWN0IHNreF9kZXYgKmQ7Ci0KLQlpZiAobG1jID4gTlVNX0lNQyAtIDEpIHsKLQkJc2t4X3By aW50ayhLRVJOX0VSUiwgIkJhZCBsbWMgJWRcbiIsIGxtYyk7Ci0JCXJldHVybiBOVUxMOwotCX0K LQotCWxpc3RfZm9yX2VhY2hfZW50cnkoZCwgJnNreF9lZGFjX2xpc3QsIGxpc3QpIHsKLQkJaWYg KGQtPmltY1swXS5zcmNfaWQgPT0gc3JjX2lkKQotCQkJcmV0dXJuIGQtPmltY1tsbWNdLm1jaTsK LQl9Ci0KLQlza3hfcHJpbnRrKEtFUk5fRVJSLCAiTm8gbWNpIGZvciBzcmNfaWQgJWQgbG1jICVk XG4iLCBzcmNfaWQsIGxtYyk7Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGludCBza3hf bWNlX2NoZWNrX2Vycm9yKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcg dmFsLAotCQkJICAgICAgIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IG1jZSAqbWNlID0gKHN0cnVj dCBtY2UgKilkYXRhOwotCXN0cnVjdCBkZWNvZGVkX2FkZHIgcmVzOwotCXN0cnVjdCBtZW1fY3Rs X2luZm8gKm1jaTsKLQljaGFyICp0eXBlOwotCi0JaWYgKGVkYWNfZ2V0X3JlcG9ydF9zdGF0dXMo KSA9PSBFREFDX1JFUE9SVElOR19ESVNBQkxFRCkKLQkJcmV0dXJuIE5PVElGWV9ET05FOwotCi0J LyogaWdub3JlIHVubGVzcyB0aGlzIGlzIG1lbW9yeSByZWxhdGVkIHdpdGggYW4gYWRkcmVzcyAq LwotCWlmICgobWNlLT5zdGF0dXMgJiAweGVmZmYpID4+IDcgIT0gMSB8fCAhKG1jZS0+c3RhdHVz ICYgTUNJX1NUQVRVU19BRERSVikpCi0JCXJldHVybiBOT1RJRllfRE9ORTsKLQotCW1lbXNldCgm cmVzLCAwLCBzaXplb2YocmVzKSk7Ci0JcmVzLmFkZHIgPSBtY2UtPmFkZHI7Ci0KLQlpZiAoYWR4 bF9jb21wb25lbnRfY291bnQpIHsKLQkJaWYgKCFza3hfYWR4bF9kZWNvZGUoJnJlcykpCi0JCQly ZXR1cm4gTk9USUZZX0RPTkU7Ci0KLQkJbWNpID0gZ2V0X21jaShyZXMuc29ja2V0LCByZXMuaW1j KTsKLQl9IGVsc2UgewotCQlpZiAoIXNreF9kZWNvZGUoJnJlcykpCi0JCQlyZXR1cm4gTk9USUZZ X0RPTkU7Ci0KLQkJbWNpID0gcmVzLmRldi0+aW1jW3Jlcy5pbWNdLm1jaTsKLQl9Ci0KLQlpZiAo IW1jaSkKLQkJcmV0dXJuIE5PVElGWV9ET05FOwotCi0JaWYgKG1jZS0+bWNnc3RhdHVzICYgTUNH X1NUQVRVU19NQ0lQKQotCQl0eXBlID0gIkV4Y2VwdGlvbiI7Ci0JZWxzZQotCQl0eXBlID0gIkV2 ZW50IjsKLQotCXNreF9tY19wcmludGsobWNpLCBLRVJOX0RFQlVHLCAiSEFORExJTkcgTUNFIE1F TU9SWSBFUlJPUlxuIik7Ci0KLQlza3hfbWNfcHJpbnRrKG1jaSwgS0VSTl9ERUJVRywgIkNQVSAl ZDogTWFjaGluZSBDaGVjayAlczogMHglbGx4ICIKLQkJCSAgIkJhbmsgJWQ6ICUwMTZMeFxuIiwg bWNlLT5leHRjcHUsIHR5cGUsCi0JCQkgIG1jZS0+bWNnc3RhdHVzLCBtY2UtPmJhbmssIG1jZS0+ c3RhdHVzKTsKLQlza3hfbWNfcHJpbnRrKG1jaSwgS0VSTl9ERUJVRywgIlRTQyAweCVsbHggIiwg bWNlLT50c2MpOwotCXNreF9tY19wcmludGsobWNpLCBLRVJOX0RFQlVHLCAiQUREUiAweCVsbHgg IiwgbWNlLT5hZGRyKTsKLQlza3hfbWNfcHJpbnRrKG1jaSwgS0VSTl9ERUJVRywgIk1JU0MgMHgl bGx4ICIsIG1jZS0+bWlzYyk7Ci0KLQlza3hfbWNfcHJpbnRrKG1jaSwgS0VSTl9ERUJVRywgIlBS T0NFU1NPUiAldToweCV4IFRJTUUgJWxsdSBTT0NLRVQgIgotCQkJICAiJXUgQVBJQyAweCV4XG4i LCBtY2UtPmNwdXZlbmRvciwgbWNlLT5jcHVpZCwKLQkJCSAgbWNlLT50aW1lLCBtY2UtPnNvY2tl dGlkLCBtY2UtPmFwaWNpZCk7Ci0KLQlza3hfbWNlX291dHB1dF9lcnJvcihtY2ksIG1jZSwgJnJl cyk7Ci0KLQlyZXR1cm4gTk9USUZZX0RPTkU7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJf YmxvY2sgc2t4X21jZV9kZWMgPSB7Ci0JLm5vdGlmaWVyX2NhbGwJPSBza3hfbWNlX2NoZWNrX2Vy cm9yLAotCS5wcmlvcml0eQk9IE1DRV9QUklPX0VEQUMsCi19OwotCi0jaWZkZWYgQ09ORklHX0VE QUNfREVCVUcKLS8qCi0gKiBEZWJ1ZyBmZWF0dXJlLgotICogRXhlcmNpc2UgdGhlIGFkZHJlc3Mg ZGVjb2RlIGxvZ2ljIGJ5IHdyaXRpbmcgYW4gYWRkcmVzcyB0bwotICogL3N5cy9rZXJuZWwvZGVi dWcvZWRhYy9za3hfdGVzdC9hZGRyLgotICovCi1zdGF0aWMgc3RydWN0IGRlbnRyeSAqc2t4X3Rl c3Q7Ci0KLXN0YXRpYyBpbnQgZGVidWdmc191NjRfc2V0KHZvaWQgKmRhdGEsIHU2NCB2YWwpCi17 Ci0Jc3RydWN0IG1jZSBtOwotCi0JcHJfd2Fybl9vbmNlKCJGYWtlIGVycm9yIHRvIDB4JWxseCBp bmplY3RlZCB2aWEgZGVidWdmc1xuIiwgdmFsKTsKLQotCW1lbXNldCgmbSwgMCwgc2l6ZW9mKG0p KTsKLQkvKiBBRERSViArIE1lbVJkICsgVW5rbm93biBjaGFubmVsICovCi0JbS5zdGF0dXMgPSBN Q0lfU1RBVFVTX0FERFJWICsgMHg5MDsKLQkvKiBPbmUgY29ycmVjdGVkIGVycm9yICovCi0JbS5z dGF0dXMgfD0gQklUX1VMTChNQ0lfU1RBVFVTX0NFQ19TSElGVCk7Ci0JbS5hZGRyID0gdmFsOwot CXNreF9tY2VfY2hlY2tfZXJyb3IoTlVMTCwgMCwgJm0pOwotCi0JcmV0dXJuIDA7Ci19Ci1ERUZJ TkVfU0lNUExFX0FUVFJJQlVURShmb3BzX3U2NF93bywgTlVMTCwgZGVidWdmc191NjRfc2V0LCAi JWxsdVxuIik7Ci0KLXN0YXRpYyB2b2lkIHNldHVwX3NreF9kZWJ1Zyh2b2lkKQotewotCXNreF90 ZXN0ID0gZWRhY19kZWJ1Z2ZzX2NyZWF0ZV9kaXIoInNreF90ZXN0Iik7Ci0JaWYgKCFza3hfdGVz dCkKLQkJcmV0dXJuOwotCi0JaWYgKCFlZGFjX2RlYnVnZnNfY3JlYXRlX2ZpbGUoImFkZHIiLCAw MjAwLCBza3hfdGVzdCwKLQkJCQkgICAgICBOVUxMLCAmZm9wc191NjRfd28pKSB7Ci0JCWRlYnVn ZnNfcmVtb3ZlKHNreF90ZXN0KTsKLQkJc2t4X3Rlc3QgPSBOVUxMOwotCX0KLX0KLQotc3RhdGlj IHZvaWQgdGVhcmRvd25fc2t4X2RlYnVnKHZvaWQpCi17Ci0JZGVidWdmc19yZW1vdmVfcmVjdXJz aXZlKHNreF90ZXN0KTsKLX0KLSNlbHNlCi1zdGF0aWMgdm9pZCBzZXR1cF9za3hfZGVidWcodm9p ZCkge30KLXN0YXRpYyB2b2lkIHRlYXJkb3duX3NreF9kZWJ1Zyh2b2lkKSB7fQotI2VuZGlmIC8q Q09ORklHX0VEQUNfREVCVUcqLwotCi1zdGF0aWMgdm9pZCBza3hfcmVtb3ZlKHZvaWQpCi17Ci0J aW50IGksIGo7Ci0Jc3RydWN0IHNreF9kZXYgKmQsICp0bXA7Ci0KLQllZGFjX2RiZygwLCAiXG4i KTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkLCB0bXAsICZza3hfZWRhY19saXN0LCBs aXN0KSB7Ci0JCWxpc3RfZGVsKCZkLT5saXN0KTsKLQkJZm9yIChpID0gMDsgaSA8IE5VTV9JTUM7 IGkrKykgewotCQkJc2t4X3VucmVnaXN0ZXJfbWNpKCZkLT5pbWNbaV0pOwotCQkJZm9yIChqID0g MDsgaiA8IE5VTV9DSEFOTkVMUzsgaisrKQotCQkJCXBjaV9kZXZfcHV0KGQtPmltY1tpXS5jaGFu W2pdLmNkZXYpOwotCQl9Ci0JCXBjaV9kZXZfcHV0KGQtPnV0aWxfYWxsKTsKLQkJcGNpX2Rldl9w dXQoZC0+c2FkX2FsbCk7Ci0KLQkJa2ZyZWUoZCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBfX2lu aXQgc2t4X2FkeGxfZ2V0KHZvaWQpCi17Ci0JY29uc3QgY2hhciAqIGNvbnN0ICpuYW1lczsKLQlp bnQgaSwgajsKLQotCW5hbWVzID0gYWR4bF9nZXRfY29tcG9uZW50X25hbWVzKCk7Ci0JaWYgKCFu YW1lcykgewotCQlza3hfcHJpbnRrKEtFUk5fTk9USUNFLCAiTm8gZmlybXdhcmUgc3VwcG9ydCBm b3IgYWRkcmVzcyB0cmFuc2xhdGlvbi4iKTsKLQkJc2t4X3ByaW50ayhLRVJOX0NPTlQsICIgT25s eSBkZWNvZGluZyBERFI0IGFkZHJlc3MhXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWZvciAoaSA9 IDA7IGkgPCBJTkRFWF9NQVg7IGkrKykgewotCQlmb3IgKGogPSAwOyBuYW1lc1tqXTsgaisrKSB7 Ci0JCQlpZiAoIXN0cmNtcChjb21wb25lbnRfbmFtZXNbaV0sIG5hbWVzW2pdKSkgewotCQkJCWNv bXBvbmVudF9pbmRpY2VzW2ldID0gajsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWlmICgh bmFtZXNbal0pCi0JCQlnb3RvIGVycjsKLQl9Ci0KLQlhZHhsX2NvbXBvbmVudF9uYW1lcyA9IG5h bWVzOwotCXdoaWxlICgqbmFtZXMrKykKLQkJYWR4bF9jb21wb25lbnRfY291bnQrKzsKLQotCWFk eGxfdmFsdWVzID0ga2NhbGxvYyhhZHhsX2NvbXBvbmVudF9jb3VudCwgc2l6ZW9mKCphZHhsX3Zh bHVlcyksCi0JCQkgICAgICBHRlBfS0VSTkVMKTsKLQlpZiAoIWFkeGxfdmFsdWVzKSB7Ci0JCWFk eGxfY29tcG9uZW50X2NvdW50ID0gMDsKLQkJcmV0dXJuOwotCX0KLQotCWFkeGxfbXNnID0ga3ph bGxvYyhNU0dfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFhZHhsX21zZykgewotCQlhZHhsX2Nv bXBvbmVudF9jb3VudCA9IDA7Ci0JCWtmcmVlKGFkeGxfdmFsdWVzKTsKLQl9Ci0KLQlyZXR1cm47 Ci1lcnI6Ci0Jc2t4X3ByaW50ayhLRVJOX0VSUiwgIiclcycgaXMgbm90IG1hdGNoZWQgZnJvbSBE U00gcGFyYW1ldGVyczogIiwKLQkJICAgY29tcG9uZW50X25hbWVzW2ldKTsKLQlmb3IgKGogPSAw OyBuYW1lc1tqXTsgaisrKQotCQlza3hfcHJpbnRrKEtFUk5fQ09OVCwgIiVzICIsIG5hbWVzW2pd KTsKLQlza3hfcHJpbnRrKEtFUk5fQ09OVCwgIlxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhp dCBza3hfYWR4bF9wdXQodm9pZCkKLXsKLQlrZnJlZShhZHhsX3ZhbHVlcyk7Ci0Ja2ZyZWUoYWR4 bF9tc2cpOwotfQotCi0vKgotICogc2t4X2luaXQ6Ci0gKgltYWtlIHN1cmUgd2UgYXJlIHJ1bm5p bmcgb24gdGhlIGNvcnJlY3QgY3B1IG1vZGVsCi0gKglzZWFyY2ggZm9yIGFsbCB0aGUgZGV2aWNl cyB3ZSBuZWVkCi0gKgljaGVjayB3aGljaCBESU1NcyBhcmUgcHJlc2VudC4KLSAqLwotc3RhdGlj IGludCBfX2luaXQgc2t4X2luaXQodm9pZCkKLXsKLQljb25zdCBzdHJ1Y3QgeDg2X2NwdV9pZCAq aWQ7Ci0JY29uc3Qgc3RydWN0IG11bml0ICptOwotCWNvbnN0IGNoYXIgKm93bmVyOwotCWludCBy YyA9IDAsIGk7Ci0JdTggbWMgPSAwLCBzcmNfaWQsIG5vZGVfaWQ7Ci0Jc3RydWN0IHNreF9kZXYg KmQ7Ci0KLQllZGFjX2RiZygyLCAiXG4iKTsKLQotCW93bmVyID0gZWRhY19nZXRfb3duZXIoKTsK LQlpZiAob3duZXIgJiYgc3RybmNtcChvd25lciwgRURBQ19NT0RfU1RSLCBzaXplb2YoRURBQ19N T0RfU1RSKSkpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQlpZCA9IHg4Nl9tYXRjaF9jcHUoc2t4X2Nw dWlkcyk7Ci0JaWYgKCFpZCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlyYyA9IHNreF9nZXRfaGlf bG8oKTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKLQotCXJjID0gZ2V0X2FsbF9idXNfbWFwcGlu Z3MoKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIGZhaWw7Ci0JaWYgKHJjID09IDApIHsKLQkJZWRh Y19kYmcoMiwgIk5vIG1lbW9yeSBjb250cm9sbGVycyBmb3VuZFxuIik7Ci0JCXJldHVybiAtRU5P REVWOwotCX0KLQotCWZvciAobSA9IHNreF9hbGxfbXVuaXRzOyBtLT5kaWQ7IG0rKykgewotCQly YyA9IGdldF9hbGxfbXVuaXRzKG0pOwotCQlpZiAocmMgPCAwKQotCQkJZ290byBmYWlsOwotCQlp ZiAocmMgIT0gbS0+cGVyX3NvY2tldCAqIHNreF9udW1fc29ja2V0cykgewotCQkJZWRhY19kYmco MiwgIkV4cGVjdGVkICVkLCBnb3QgJWQgb2YgMHgleFxuIiwKLQkJCQkgbS0+cGVyX3NvY2tldCAq IHNreF9udW1fc29ja2V0cywgcmMsIG0tPmRpZCk7Ci0JCQlyYyA9IC1FTk9ERVY7Ci0JCQlnb3Rv IGZhaWw7Ci0JCX0KLQl9Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGQsICZza3hfZWRhY19saXN0 LCBsaXN0KSB7Ci0JCXNyY19pZCA9IGdldF9zcmNfaWQoZCk7Ci0JCW5vZGVfaWQgPSBza3hfZ2V0 X25vZGVfaWQoZCk7Ci0JCWVkYWNfZGJnKDIsICJzcmNfaWQ9JWQgbm9kZV9pZD0lZFxuIiwgc3Jj X2lkLCBub2RlX2lkKTsKLQkJZm9yIChpID0gMDsgaSA8IE5VTV9JTUM7IGkrKykgewotCQkJZC0+ aW1jW2ldLm1jID0gbWMrKzsKLQkJCWQtPmltY1tpXS5sbWMgPSBpOwotCQkJZC0+aW1jW2ldLnNy Y19pZCA9IHNyY19pZDsKLQkJCWQtPmltY1tpXS5ub2RlX2lkID0gbm9kZV9pZDsKLQkJCXJjID0g c2t4X3JlZ2lzdGVyX21jaSgmZC0+aW1jW2ldKTsKLQkJCWlmIChyYyA8IDApCi0JCQkJZ290byBm YWlsOwotCQl9Ci0JfQotCi0Jc2t4X21zZyA9IGt6YWxsb2MoTVNHX1NJWkUsIEdGUF9LRVJORUwp OwotCWlmICghc2t4X21zZykgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gZmFpbDsKLQl9Ci0K LQlpZiAobnZkaW1tX2NvdW50KQotCQlza3hfYWR4bF9nZXQoKTsKLQotCS8qIEVuc3VyZSB0aGF0 IHRoZSBPUFNUQVRFIGlzIHNldCBjb3JyZWN0bHkgZm9yIFBPTEwgb3IgTk1JICovCi0Jb3BzdGF0 ZV9pbml0KCk7Ci0KLQlzZXR1cF9za3hfZGVidWcoKTsKLQotCW1jZV9yZWdpc3Rlcl9kZWNvZGVf Y2hhaW4oJnNreF9tY2VfZGVjKTsKLQotCXJldHVybiAwOwotZmFpbDoKLQlza3hfcmVtb3ZlKCk7 Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgc2t4X2V4aXQodm9pZCkKLXsK LQllZGFjX2RiZygyLCAiXG4iKTsKLQltY2VfdW5yZWdpc3Rlcl9kZWNvZGVfY2hhaW4oJnNreF9t Y2VfZGVjKTsKLQl0ZWFyZG93bl9za3hfZGVidWcoKTsKLQlpZiAobnZkaW1tX2NvdW50KQotCQlz a3hfYWR4bF9wdXQoKTsKLQlrZnJlZShza3hfbXNnKTsKLQlza3hfcmVtb3ZlKCk7Ci19Ci0KLW1v ZHVsZV9pbml0KHNreF9pbml0KTsKLW1vZHVsZV9leGl0KHNreF9leGl0KTsKLQotbW9kdWxlX3Bh cmFtKGVkYWNfb3Bfc3RhdGUsIGludCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGVkYWNfb3Bf c3RhdGUsICJFREFDIEVycm9yIFJlcG9ydGluZyBzdGF0ZTogMD1Qb2xsLDE9Tk1JIik7Ci0KLU1P RFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKLU1PRFVMRV9BVVRIT1IoIlRvbnkgTHVjayIpOwotTU9E VUxFX0RFU0NSSVBUSU9OKCJNQyBEcml2ZXIgZm9yIEludGVsIFNreWxha2Ugc2VydmVyIHByb2Nl c3NvcnMiKTsK