LyoKICAgIHZpYTY4NmEuYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMKICAgICAgICAgICAgICAgIGZvciBoYXJkd2FyZSBtb25pdG9yaW5nCgogICAgQ29weXJpZ2h0IChjKSAxOTk4IC0gMjAwMiAgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiwKICAgICAgICAgICAgICAgICAgICAgICAgS3n2c3RpIE3kbGtraSA8a21hbGtraUBjYy5odXQuZmk+LAoJCQlNYXJrIFN0dWRlYmFrZXIgPG1kc3h5ejEyM0B5YWhvby5jb20+LAoJCQlhbmQgQm9iIERvdWdoZXJ0eSA8Ym9iZEBzdGFuZm9yZC5lZHU+CiAgICAoU29tZSBjb252ZXJzaW9uLWZhY3RvciBkYXRhIHdlcmUgY29udHJpYnV0ZWQgYnkgSm9uYXRoYW4gVGVoIFNvb24gWWV3CiAgICA8ai50ZWhAaW5hbWUuY29tPiBhbmQgQWxleCB2YW4gS2FhbSA8ZGFya3NpZGVAY2hlbGxvLm5sPi4pCgogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiovCgovKgogICAgU3VwcG9ydHMgdGhlIFZpYSBWVDgyQzY4NkEsIFZUODJDNjg2QiBzb3V0aCBicmlkZ2VzLgogICAgUmVwb3J0cyBhbGwgYXMgYSA2ODZBLgogICAgV2FybmluZyAtIG9ubHkgc3VwcG9ydHMgYSBzaW5nbGUgZGV2aWNlLgoqLwoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgvcGNpLmg+CiNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiNpbmNsdWRlIDxsaW51eC9pMmMuaD4KI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgoKCi8qIElmIGZvcmNlX2FkZHIgaXMgc2V0IHRvIGFueXRoaW5nIGRpZmZlcmVudCBmcm9tIDAsIHdlIGZvcmNpYmx5IGVuYWJsZQogICB0aGUgZGV2aWNlIGF0IHRoZSBnaXZlbiBhZGRyZXNzLiAqLwpzdGF0aWMgdW5zaWduZWQgc2hvcnQgZm9yY2VfYWRkciA9IDA7Cm1vZHVsZV9wYXJhbShmb3JjZV9hZGRyLCB1c2hvcnQsIDApOwpNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX2FkZHIsCgkJICJJbml0aWFsaXplIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIHNlbnNvcnMiKTsKCi8qIEFkZHJlc3NlcyB0byBzY2FuLgogICBOb3RlIHRoYXQgd2UgY2FuJ3QgZGV0ZXJtaW5lIHRoZSBJU0EgYWRkcmVzcyB1bnRpbCB3ZSBoYXZlIGluaXRpYWxpemVkCiAgIG91ciBtb2R1bGUgKi8Kc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgSTJDX0NMSUVOVF9FTkQgfTsKc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7IDB4MDAwMCwgSTJDX0NMSUVOVF9JU0FfRU5EIH07CgovKiBJbnNtb2QgcGFyYW1ldGVycyAqLwpTRU5TT1JTX0lOU01PRF8xKHZpYTY4NmEpOwoKLyoKICAgVGhlIFZpYSA2ODZhIHNvdXRoYnJpZGdlIGhhcyBhIExNNzgtbGlrZSBjaGlwIGludGVncmF0ZWQgb24gdGhlIHNhbWUgSUMuCiAgIFRoaXMgZHJpdmVyIGlzIGEgY3VzdG9taXplZCBjb3B5IG9mIGxtNzguYwoqLwoKLyogTWFueSBWSUE2ODZBIGNvbnN0YW50cyBzcGVjaWZpZWQgYmVsb3cgKi8KCi8qIExlbmd0aCBvZiBJU0EgYWRkcmVzcyBzZWdtZW50ICovCiNkZWZpbmUgVklBNjg2QV9FWFRFTlQJCTB4ODAKI2RlZmluZSBWSUE2ODZBX0JBU0VfUkVHCTB4NzAKI2RlZmluZSBWSUE2ODZBX0VOQUJMRV9SRUcJMHg3NAoKLyogVGhlIFZJQTY4NkEgcmVnaXN0ZXJzICovCi8qIGlucyBudW1iZXJlZCAwLTQgKi8KI2RlZmluZSBWSUE2ODZBX1JFR19JTl9NQVgobnIpCSgweDJiICsgKChucikgKiAyKSkKI2RlZmluZSBWSUE2ODZBX1JFR19JTl9NSU4obnIpCSgweDJjICsgKChucikgKiAyKSkKI2RlZmluZSBWSUE2ODZBX1JFR19JTihucikJKDB4MjIgKyAobnIpKQoKLyogZmFucyBudW1iZXJlZCAxLTIgKi8KI2RlZmluZSBWSUE2ODZBX1JFR19GQU5fTUlOKG5yKQkoMHgzYSArIChucikpCiNkZWZpbmUgVklBNjg2QV9SRUdfRkFOKG5yKQkoMHgyOCArIChucikpCgovKiB0ZW1wcyBudW1iZXJlZCAxLTMgKi8Kc3RhdGljIGNvbnN0IHU4IFZJQTY4NkFfUkVHX1RFTVBbXQk9IHsgMHgyMCwgMHgyMSwgMHgxZiB9OwpzdGF0aWMgY29uc3QgdTggVklBNjg2QV9SRUdfVEVNUF9PVkVSW10JPSB7IDB4MzksIDB4M2QsIDB4MWQgfTsKc3RhdGljIGNvbnN0IHU4IFZJQTY4NkFfUkVHX1RFTVBfSFlTVFtdCT0geyAweDNhLCAweDNlLCAweDFlIH07Ci8qIGJpdHMgNy02ICovCiNkZWZpbmUgVklBNjg2QV9SRUdfVEVNUF9MT1cxCTB4NGIKLyogMiA9IGJpdHMgNS00LCAzID0gYml0cyA3LTYgKi8KI2RlZmluZSBWSUE2ODZBX1JFR19URU1QX0xPVzIzCTB4NDkKCiNkZWZpbmUgVklBNjg2QV9SRUdfQUxBUk0xCTB4NDEKI2RlZmluZSBWSUE2ODZBX1JFR19BTEFSTTIJMHg0MgojZGVmaW5lIFZJQTY4NkFfUkVHX0ZBTkRJVgkweDQ3CiNkZWZpbmUgVklBNjg2QV9SRUdfQ09ORklHCTB4NDAKLyogVGhlIGZvbGxvd2luZyByZWdpc3RlciBzZXRzIHRlbXAgaW50ZXJydXB0IG1vZGUgKGJpdHMgMS0wIGZvciB0ZW1wMSwKIDMtMiBmb3IgdGVtcDIsIDUtNCBmb3IgdGVtcDMpLiAgTW9kZXMgYXJlOgogICAgMDAgaW50ZXJydXB0IHN0YXlzIGFzIGxvbmcgYXMgdmFsdWUgaXMgb3V0LW9mLXJhbmdlCiAgICAwMSBpbnRlcnJ1cHQgaXMgY2xlYXJlZCBvbmNlIHJlZ2lzdGVyIGlzIHJlYWQgKGRlZmF1bHQpCiAgICAxMCBjb21wYXJhdG9yIG1vZGUtIGxpa2UgMDAsIGJ1dCBpZ25vcmVzIGh5c3RlcmVzaXMKICAgIDExIHNhbWUgYXMgMDAgKi8KI2RlZmluZSBWSUE2ODZBX1JFR19URU1QX01PREUJCTB4NGIKLyogV2UnbGwganVzdCBhc3N1bWUgdGhhdCB5b3Ugd2FudCB0byBzZXQgYWxsIDMgc2ltdWx0YW5lb3VzbHk6ICovCiNkZWZpbmUgVklBNjg2QV9URU1QX01PREVfTUFTSwkJMHgzRgojZGVmaW5lIFZJQTY4NkFfVEVNUF9NT0RFX0NPTlRJTlVPVVMJMHgwMAoKLyogQ29udmVyc2lvbnMuIExpbWl0IGNoZWNraW5nIGlzIG9ubHkgZG9uZSBvbiB0aGUgVE9fUkVHCiAgIHZhcmlhbnRzLgoKKioqKioqKioqIFZPTFRBR0UgQ09OVkVSU0lPTlMgKEJvYiBEb3VnaGVydHkpICoqKioqKioqCiBGcm9tIEhXTW9uLmNwcCAoQ29weXJpZ2h0IDE5OTgtMjAwMCBKb25hdGhhbiBUZWggU29vbiBZZXcpOgogdm9sdGFnZWZhY3RvclswXT0xLjI1LzI2Mjg7ICgyNjI4LzEuMjU9MjEwMi40KSAgIC8vIFZjY3AKIHZvbHRhZ2VmYWN0b3JbMV09MS4yNS8yNjI4OyAoMjYyOC8xLjI1PTIxMDIuNCkgICAvLyArMi41Vgogdm9sdGFnZWZhY3RvclsyXT0xLjY3LzI2Mjg7ICgyNjI4LzEuNjc9MTU3My43KSAgIC8vICszLjNWCiB2b2x0YWdlZmFjdG9yWzNdPTIuNi8yNjI4OyAgKDI2MjgvMi42MD0xMDEwLjgpICAgLy8gKzVWCiB2b2x0YWdlZmFjdG9yWzRdPTYuMy8yNjI4OyAgKDI2MjgvNi4zMD00MTcuMTQpICAgLy8gKzEyVgogaW5baV09KGRhdGFbaSsyXSoyNS4wKzEzMykqdm9sdGFnZWZhY3RvcltpXTsKIFRoYXQgaXM6CiB2b2x0cyA9ICgyNSpyZWdWYWwrMTMzKSpmYWN0b3IKIHJlZ1ZhbCA9ICh2b2x0cy9mYWN0b3ItMTMzKS8yNQogKFRoZXNlIGNvbnZlcnNpb25zIHdlcmUgY29udHJpYnV0ZWQgYnkgSm9uYXRoYW4gVGVoIFNvb24gWWV3CiA8ai50ZWhAaW5hbWUuY29tPikgKi8Kc3RhdGljIGlubGluZSB1OCBJTl9UT19SRUcobG9uZyB2YWwsIGludCBpbk51bSkKewoJLyogVG8gYXZvaWQgZmxvYXRpbmcgcG9pbnQsIHdlIG11bHRpcGx5IGNvbnN0YW50cyBieSAxMCAoMTAwIGZvciArMTJWKS4KCSAgIFJvdW5kaW5nIGlzIGRvbmUgKDEyMDUwMCBpcyBhY3R1YWxseSAxMzMwMDAgLSAxMjUwMCkuCgkgICBSZW1lbWJlciB0aGF0IHZhbCBpcyBleHByZXNzZWQgaW4gMC4wMDFWL2JpdCwgd2hpY2ggaXMgd2h5IHdlIGRpdmlkZQoJICAgYnkgYW4gYWRkaXRpb25hbCAxMDAwMCAoMTAwMDAwIGZvciArMTJWKTogMTAwMCBmb3IgdmFsIGFuZCAxMCAoMTAwKQoJICAgZm9yIHRoZSBjb25zdGFudHMuICovCglpZiAoaW5OdW0gPD0gMSkKCQlyZXR1cm4gKHU4KQoJCSAgICBTRU5TT1JTX0xJTUlUKCh2YWwgKiAyMTAyNCAtIDEyMDUwMDApIC8gMjUwMDAwLCAwLCAyNTUpOwoJZWxzZSBpZiAoaW5OdW0gPT0gMikKCQlyZXR1cm4gKHU4KQoJCSAgICBTRU5TT1JTX0xJTUlUKCh2YWwgKiAxNTczNyAtIDEyMDUwMDApIC8gMjUwMDAwLCAwLCAyNTUpOwoJZWxzZSBpZiAoaW5OdW0gPT0gMykKCQlyZXR1cm4gKHU4KQoJCSAgICBTRU5TT1JTX0xJTUlUKCh2YWwgKiAxMDEwOCAtIDEyMDUwMDApIC8gMjUwMDAwLCAwLCAyNTUpOwoJZWxzZQoJCXJldHVybiAodTgpCgkJICAgIFNFTlNPUlNfTElNSVQoKHZhbCAqIDQxNzE0IC0gMTIwNTAwMDApIC8gMjUwMDAwMCwgMCwgMjU1KTsKfQoKc3RhdGljIGlubGluZSBsb25nIElOX0ZST01fUkVHKHU4IHZhbCwgaW50IGluTnVtKQp7CgkvKiBUbyBhdm9pZCBmbG9hdGluZyBwb2ludCwgd2UgbXVsdGlwbHkgY29uc3RhbnRzIGJ5IDEwICgxMDAgZm9yICsxMlYpLgoJICAgV2UgYWxzbyBtdWx0aXBseSB0aGVtIGJ5IDEwMDAgYmVjYXVzZSB3ZSB3YW50IDAuMDAxVi9iaXQgZm9yIHRoZQoJICAgb3V0cHV0IHZhbHVlLiBSb3VuZGluZyBpcyBkb25lLiAqLwoJaWYgKGluTnVtIDw9IDEpCgkJcmV0dXJuIChsb25nKSAoKDI1MDAwMCAqIHZhbCArIDEzMzAwMDAgKyAyMTAyNCAvIDIpIC8gMjEwMjQpOwoJZWxzZSBpZiAoaW5OdW0gPT0gMikKCQlyZXR1cm4gKGxvbmcpICgoMjUwMDAwICogdmFsICsgMTMzMDAwMCArIDE1NzM3IC8gMikgLyAxNTczNyk7CgllbHNlIGlmIChpbk51bSA9PSAzKQoJCXJldHVybiAobG9uZykgKCgyNTAwMDAgKiB2YWwgKyAxMzMwMDAwICsgMTAxMDggLyAyKSAvIDEwMTA4KTsKCWVsc2UKCQlyZXR1cm4gKGxvbmcpICgoMjUwMDAwMCAqIHZhbCArIDEzMzAwMDAwICsgNDE3MTQgLyAyKSAvIDQxNzE0KTsKfQoKLyoqKioqKioqKiBGQU4gUlBNIENPTlZFUlNJT05TICoqKioqKioqLwovKiBIaWdoZXIgcmVnaXN0ZXIgdmFsdWVzID0gc2xvd2VyIGZhbnMgKHRoZSBmYW4ncyBzdHJvYmUgZ2F0ZXMgYSBjb3VudGVyKS4KIEJ1dCB0aGlzIGNoaXAgc2F0dXJhdGVzIGJhY2sgYXQgMCwgbm90IGF0IDI1NSBsaWtlIGFsbCB0aGUgb3RoZXIgY2hpcHMuCiBTbywgMCBtZWFucyAwIFJQTSAqLwpzdGF0aWMgaW5saW5lIHU4IEZBTl9UT19SRUcobG9uZyBycG0sIGludCBkaXYpCnsKCWlmIChycG0gPT0gMCkKCQlyZXR1cm4gMDsKCXJwbSA9IFNFTlNPUlNfTElNSVQocnBtLCAxLCAxMDAwMDAwKTsKCXJldHVybiBTRU5TT1JTX0xJTUlUKCgxMzUwMDAwICsgcnBtICogZGl2IC8gMikgLyAocnBtICogZGl2KSwgMSwgMjU1KTsKfQoKI2RlZmluZSBGQU5fRlJPTV9SRUcodmFsLGRpdikgKCh2YWwpPT0wPzA6KHZhbCk9PTI1NT8wOjEzNTAwMDAvKCh2YWwpKihkaXYpKSkKCi8qKioqKioqKiBURU1QIENPTlZFUlNJT05TIChCb2IgRG91Z2hlcnR5KSAqKioqKioqKiovCi8qIGxpbmVhciBmaXRzIGZyb20gSFdNb24uY3BwIChDb3B5cmlnaHQgMTk5OC0yMDAwIEpvbmF0aGFuIFRlaCBTb29uIFlldykKICAgICAgaWYodGVtcDwxNjkpCiAgICAgICAgICAgICAgcmV0dXJuIGRvdWJsZSh0ZW1wKSowLjQyNy0zMi4wODsKICAgICAgZWxzZSBpZih0ZW1wPj0xNjkgJiYgdGVtcDw9MjAyKQogICAgICAgICAgICAgIHJldHVybiBkb3VibGUodGVtcCkqMC41ODItNTguMTY7CiAgICAgIGVsc2UKICAgICAgICAgICAgICByZXR1cm4gZG91YmxlKHRlbXApKjAuOTI0LTEyNy4zMzsKCiBBIGZpZnRoLW9yZGVyIHBvbHlub21pYWwgZml0cyB0aGUgdW5vZmZpY2lhbCBkYXRhIChwcm92aWRlZCBieSBBbGV4IHZhbgogS2FhbSA8ZGFya3NpZGVAY2hlbGxvLm5sPikgYSBiaXQgYmV0dGVyLiAgSXQgYWxzbyBnaXZlIG1vcmUgcmVhc29uYWJsZQogbnVtYmVycyBvbiBteSBtYWNoaW5lIChpZS4gdGhleSBhZ3JlZSB3aXRoIHdoYXQgbXkgQklPUyB0ZWxscyBtZSkuCiBIZXJlJ3MgdGhlIGZpZnRoLW9yZGVyIGZpdCB0byB0aGUgOC1iaXQgZGF0YToKIHRlbXAgPSAxLjYyNTA5M2UtMTAqdmFsXjUgLSAxLjAwMTYzMmUtMDcqdmFsXjQgKyAyLjQ1NzY1M2UtMDUqdmFsXjMgLQogICAgICAgIDIuOTY3NjE5ZS0wMyp2YWxeMiArIDIuMTc1MTQ0ZS0wMSp2YWwgLSA3LjA5MDA2N2UrMC4KCiAoMjAwMC0xMC0yNS0gUkZEOiB0aGFua3MgdG8gVXdlIEFuZGVyc2VuIDx1YW5kZXJzZW5AbWF5YWguY29tPiBmb3IKIGZpbmRpbmcgbXkgdHlwb3MgaW4gdGhpcyBmb3JtdWxhISkKCiBBbGFzLCBub25lIG9mIHRoZSBlbGVnYW50IGZ1bmN0aW9uLWZpdCBzb2x1dGlvbnMgd2lsbCB3b3JrIGJlY2F1c2Ugd2UKIGFyZW4ndCBhbGxvd2VkIHRvIHVzZSBmbG9hdGluZyBwb2ludCBpbiB0aGUga2VybmVsIGFuZCBkb2luZyBpdCB3aXRoCiBpbnRlZ2VycyBkb2Vzbid0IHByb3ZpZGUgZW5vdWdoIHByZWNpc2lvbi4gIFNvIHdlJ2xsIGRvIGJvcmluZyBvbGQKIGxvb2stdXAgdGFibGUgc3R1ZmYuICBUaGUgdW5vZmZpY2lhbCBkYXRhIChzZWUgYmVsb3cpIGhhdmUgZWZmZWN0aXZlbHkKIDctYml0IHJlc29sdXRpb24gKHRoZXkgYXJlIHJvdW5kZWQgdG8gdGhlIG5lYXJlc3QgZGVncmVlKS4gIEknbSBhc3N1bWluZwogdGhhdCB0aGUgdHJhbnNmZXIgZnVuY3Rpb24gb2YgdGhlIGRldmljZSBpcyBtb25vdG9uaWMgYW5kIHNtb290aCwgc28gYQogc21vb3RoIGZ1bmN0aW9uIGZpdCB0byB0aGUgZGF0YSB3aWxsIGFsbG93IHVzIHRvIGdldCBiZXR0ZXIgcHJlY2lzaW9uLgogSSB1c2VkIHRoZSA1dGgtb3JkZXIgcG9seSBmaXQgZGVzY3JpYmVkIGFib3ZlIGFuZCBzb2x2ZWQgZm9yCiBWSUEgcmVnaXN0ZXIgdmFsdWVzIDAtMjU1LiAgSSAqMTAgYmVmb3JlIHJvdW5kaW5nLCBzbyB3ZSBnZXQgdGVudGgtZGVncmVlCiBwcmVjaXNpb24uICAoSSBjb3VsZCBoYXZlIGRvbmUgYWxsIDEwMjQgdmFsdWVzIGZvciBvdXIgMTAtYml0IHJlYWRpbmdzLAogYnV0IHRoZSBmdW5jdGlvbiBpcyB2ZXJ5IGxpbmVhciBpbiB0aGUgdXNlZnVsIHJhbmdlICgwLTgwIGRlZyBDKSwgc28KIHdlJ2xsIGp1c3QgdXNlIGxpbmVhciBpbnRlcnBvbGF0aW9uIGZvciAxMC1iaXQgcmVhZGluZ3MuKSAgU28sIHRlbXBMVVQKIGlzIHRoZSB0ZW1wIGF0IHZpYSByZWdpc3RlciB2YWx1ZXMgMC0yNTU6ICovCnN0YXRpYyBjb25zdCBsb25nIHRlbXBMVVRbXSA9CnsgLTcwOSwgLTY4OCwgLTY2NywgLTY0NiwgLTYyNywgLTYwNywgLTU4OSwgLTU3MCwgLTU1MywgLTUzNiwgLTUxOSwKCS01MDMsIC00ODcsIC00NzEsIC00NTYsIC00NDIsIC00MjgsIC00MTQsIC00MDAsIC0zODcsIC0zNzUsCgktMzYyLCAtMzUwLCAtMzM5LCAtMzI3LCAtMzE2LCAtMzA1LCAtMjk1LCAtMjg1LCAtMjc1LCAtMjY1LAoJLTI1NSwgLTI0NiwgLTIzNywgLTIyOSwgLTIyMCwgLTIxMiwgLTIwNCwgLTE5NiwgLTE4OCwgLTE4MCwKCS0xNzMsIC0xNjYsIC0xNTksIC0xNTIsIC0xNDUsIC0xMzksIC0xMzIsIC0xMjYsIC0xMjAsIC0xMTQsCgktMTA4LCAtMTAyLCAtOTYsIC05MSwgLTg1LCAtODAsIC03NCwgLTY5LCAtNjQsIC01OSwgLTU0LCAtNDksCgktNDQsIC0zOSwgLTM0LCAtMjksIC0yNSwgLTIwLCAtMTUsIC0xMSwgLTYsIC0yLCAzLCA3LCAxMiwgMTYsCgkyMCwgMjUsIDI5LCAzMywgMzcsIDQyLCA0NiwgNTAsIDU0LCA1OSwgNjMsIDY3LCA3MSwgNzUsIDc5LCA4NCwKCTg4LCA5MiwgOTYsIDEwMCwgMTA0LCAxMDksIDExMywgMTE3LCAxMjEsIDEyNSwgMTMwLCAxMzQsIDEzOCwKCTE0MiwgMTQ2LCAxNTEsIDE1NSwgMTU5LCAxNjMsIDE2OCwgMTcyLCAxNzYsIDE4MSwgMTg1LCAxODksCgkxOTMsIDE5OCwgMjAyLCAyMDYsIDIxMSwgMjE1LCAyMTksIDIyNCwgMjI4LCAyMzIsIDIzNywgMjQxLAoJMjQ1LCAyNTAsIDI1NCwgMjU5LCAyNjMsIDI2NywgMjcyLCAyNzYsIDI4MSwgMjg1LCAyOTAsIDI5NCwKCTI5OSwgMzAzLCAzMDcsIDMxMiwgMzE2LCAzMjEsIDMyNSwgMzMwLCAzMzQsIDMzOSwgMzQ0LCAzNDgsCgkzNTMsIDM1NywgMzYyLCAzNjYsIDM3MSwgMzc2LCAzODAsIDM4NSwgMzkwLCAzOTUsIDM5OSwgNDA0LAoJNDA5LCA0MTQsIDQxOSwgNDIzLCA0MjgsIDQzMywgNDM4LCA0NDMsIDQ0OSwgNDU0LCA0NTksIDQ2NCwKCTQ2OSwgNDc1LCA0ODAsIDQ4NiwgNDkxLCA0OTcsIDUwMiwgNTA4LCA1MTQsIDUyMCwgNTI2LCA1MzIsCgk1MzgsIDU0NCwgNTUxLCA1NTcsIDU2NCwgNTcxLCA1NzgsIDU4NCwgNTkyLCA1OTksIDYwNiwgNjE0LAoJNjIxLCA2MjksIDYzNywgNjQ1LCA2NTQsIDY2MiwgNjcxLCA2ODAsIDY4OSwgNjk4LCA3MDgsIDcxOCwKCTcyOCwgNzM4LCA3NDksIDc1OSwgNzcwLCA3ODIsIDc5MywgODA1LCA4MTgsIDgzMCwgODQzLCA4NTYsCgk4NzAsIDg4MywgODk4LCA5MTIsIDkyNywgOTQzLCA5NTgsIDk3NSwgOTkxLCAxMDA4LCAxMDI2LCAxMDQ0LAoJMTA2MiwgMTA4MSwgMTEwMSwgMTEyMSwgMTE0MSwgMTE2MiwgMTE4NCwgMTIwNiwgMTIyOSwgMTI1MiwKCTEyNzYsIDEzMDEsIDEzMjYsIDEzNTIsIDEzNzgsIDE0MDYsIDE0MzQsIDE0NjIKfTsKCi8qIHRoZSBvcmlnaW5hbCBMVVQgdmFsdWVzIGZyb20gQWxleCB2YW4gS2FhbSA8ZGFya3NpZGVAY2hlbGxvLm5sPgogICAoZm9yIHZpYSByZWdpc3RlciB2YWx1ZXMgMTItMjQwKToKey01MCwtNDksLTQ3LC00NSwtNDMsLTQxLC0zOSwtMzgsLTM3LC0zNSwtMzQsLTMzLC0zMiwtMzEsCi0zMCwtMjksLTI4LC0yNywtMjYsLTI1LC0yNCwtMjQsLTIzLC0yMiwtMjEsLTIwLC0yMCwtMTksLTE4LC0xNywtMTcsLTE2LC0xNSwKLTE1LC0xNCwtMTQsLTEzLC0xMiwtMTIsLTExLC0xMSwtMTAsLTksLTksLTgsLTgsLTcsLTcsLTYsLTYsLTUsLTUsLTQsLTQsLTMsCi0zLC0yLC0yLC0xLC0xLDAsMCwxLDEsMSwzLDMsMyw0LDQsNCw1LDUsNSw2LDYsNyw3LDgsOCw5LDksOSwxMCwxMCwxMSwxMSwxMiwKMTIsMTIsMTMsMTMsMTMsMTQsMTQsMTUsMTUsMTYsMTYsMTYsMTcsMTcsMTgsMTgsMTksMTksMjAsMjAsMjEsMjEsMjEsMjIsMjIsCjIyLDIzLDIzLDI0LDI0LDI1LDI1LDI2LDI2LDI2LDI3LDI3LDI3LDI4LDI4LDI5LDI5LDMwLDMwLDMwLDMxLDMxLDMyLDMyLDMzLAozMywzNCwzNCwzNSwzNSwzNSwzNiwzNiwzNywzNywzOCwzOCwzOSwzOSw0MCw0MCw0MSw0MSw0Miw0Miw0Myw0Myw0NCw0NCw0NSwKNDUsNDYsNDYsNDcsNDgsNDgsNDksNDksNTAsNTEsNTEsNTIsNTIsNTMsNTMsNTQsNTUsNTUsNTYsNTcsNTcsNTgsNTksNTksNjAsCjYxLDYyLDYyLDYzLDY0LDY1LDY2LDY2LDY3LDY4LDY5LDcwLDcxLDcyLDczLDc0LDc1LDc2LDc3LDc4LDc5LDgwLDgxLDgzLDg0LAo4NSw4Niw4OCw4OSw5MSw5Miw5NCw5Niw5Nyw5OSwxMDEsMTAzLDEwNSwxMDcsMTA5LDExMH07CgoKIEhlcmUncyB0aGUgcmV2ZXJzZSBMVVQuICBJIGdvdCBpdCBieSBkb2luZyBhIDYtdGggb3JkZXIgcG9seSBmaXQgKG5lZWRlZAogYW4gZXh0cmEgdGVybSBmb3IgYSBnb29kIGZpdCB0byB0aGVzZSBpbnZlcnNlIGRhdGEhKSBhbmQgdGhlbgogc29sdmluZyBmb3IgZWFjaCB0ZW1wIHZhbHVlIGZyb20gLTUwIHRvIDExMCAodGhlIHVzZWFibGUgcmFuZ2UgZm9yCiB0aGlzIGNoaXApLiAgSGVyZSdzIHRoZSBmaXQ6CiB2aWFSZWdWYWwgPSAtMS4xNjAzNzBlLTEwKnZhbF42ICszLjE5MzY5M2UtMDgqdmFsXjUgLSAxLjQ2NDQ0N2UtMDYqdmFsXjQKIC0gMi41MjU0NTNlLTA0KnZhbF4zICsgMS40MjQ1OTNlLTAyKnZhbF4yICsgMi4xNDg5NDFlKzAwKnZhbCArNy4yNzU4MDhlKzAxKQogTm90ZSB0aGF0IG49MTYxOiAqLwpzdGF0aWMgY29uc3QgdTggdmlhTFVUW10gPQp7IDEyLCAxMiwgMTMsIDE0LCAxNCwgMTUsIDE2LCAxNiwgMTcsIDE4LCAxOCwgMTksIDIwLCAyMCwgMjEsIDIyLCAyMywKCTIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzUsIDM2LCAzNywgMzksIDQwLAoJNDEsIDQzLCA0NSwgNDYsIDQ4LCA0OSwgNTEsIDUzLCA1NSwgNTcsIDU5LCA2MCwgNjIsIDY0LCA2NiwKCTY5LCA3MSwgNzMsIDc1LCA3NywgNzksIDgyLCA4NCwgODYsIDg4LCA5MSwgOTMsIDk1LCA5OCwgMTAwLAoJMTAzLCAxMDUsIDEwNywgMTEwLCAxMTIsIDExNSwgMTE3LCAxMTksIDEyMiwgMTI0LCAxMjYsIDEyOSwKCTEzMSwgMTM0LCAxMzYsIDEzOCwgMTQwLCAxNDMsIDE0NSwgMTQ3LCAxNTAsIDE1MiwgMTU0LCAxNTYsCgkxNTgsIDE2MCwgMTYyLCAxNjQsIDE2NiwgMTY4LCAxNzAsIDE3MiwgMTc0LCAxNzYsIDE3OCwgMTgwLAoJMTgyLCAxODMsIDE4NSwgMTg3LCAxODgsIDE5MCwgMTkyLCAxOTMsIDE5NSwgMTk2LCAxOTgsIDE5OSwKCTIwMCwgMjAyLCAyMDMsIDIwNSwgMjA2LCAyMDcsIDIwOCwgMjA5LCAyMTAsIDIxMSwgMjEyLCAyMTMsCgkyMTQsIDIxNSwgMjE2LCAyMTcsIDIxOCwgMjE5LCAyMjAsIDIyMSwgMjIyLCAyMjIsIDIyMywgMjI0LAoJMjI1LCAyMjYsIDIyNiwgMjI3LCAyMjgsIDIyOCwgMjI5LCAyMzAsIDIzMCwgMjMxLCAyMzIsIDIzMiwKCTIzMywgMjMzLCAyMzQsIDIzNSwgMjM1LCAyMzYsIDIzNiwgMjM3LCAyMzcsIDIzOCwgMjM4LCAyMzksCgkyMzksIDI0MAp9OwoKLyogQ29udmVydGluZyB0ZW1wcyB0byAoOC1iaXQpIGh5c3QgYW5kIG92ZXIgcmVnaXN0ZXJzCiAgIE5vIGludGVycG9sYXRpb24gaGVyZS4KICAgVGhlICs1MCBpcyBiZWNhdXNlIHRoZSB0ZW1wcyBzdGFydCBhdCAtNTAgKi8Kc3RhdGljIGlubGluZSB1OCBURU1QX1RPX1JFRyhsb25nIHZhbCkKewoJcmV0dXJuIHZpYUxVVFt2YWwgPD0gLTUwMDAwID8gMCA6IHZhbCA+PSAxMTAwMDAgPyAxNjAgOgoJCSAgICAgICh2YWwgPCAwID8gdmFsIC0gNTAwIDogdmFsICsgNTAwKSAvIDEwMDAgKyA1MF07Cn0KCi8qIGZvciA4LWJpdCB0ZW1wZXJhdHVyZSBoeXN0IGFuZCBvdmVyIHJlZ2lzdGVycyAqLwojZGVmaW5lIFRFTVBfRlJPTV9SRUcodmFsKSAodGVtcExVVFsodmFsKV0gKiAxMDApCgovKiBmb3IgMTAtYml0IHRlbXBlcmF0dXJlIHJlYWRpbmdzICovCnN0YXRpYyBpbmxpbmUgbG9uZyBURU1QX0ZST01fUkVHMTAodTE2IHZhbCkKewoJdTE2IGVpZ2h0Qml0cyA9IHZhbCA+PiAyOwoJdTE2IHR3b0JpdHMgPSB2YWwgJiAzOwoKCS8qIG5vIGludGVycG9sYXRpb24gZm9yIHRoZXNlICovCglpZiAodHdvQml0cyA9PSAwIHx8IGVpZ2h0Qml0cyA9PSAyNTUpCgkJcmV0dXJuIFRFTVBfRlJPTV9SRUcoZWlnaHRCaXRzKTsKCgkvKiBkbyBzb21lIGxpbmVhciBpbnRlcnBvbGF0aW9uICovCglyZXR1cm4gKHRlbXBMVVRbZWlnaHRCaXRzXSAqICg0IC0gdHdvQml0cykgKwoJCXRlbXBMVVRbZWlnaHRCaXRzICsgMV0gKiB0d29CaXRzKSAqIDI1Owp9CgojZGVmaW5lIERJVl9GUk9NX1JFRyh2YWwpICgxIDw8ICh2YWwpKQojZGVmaW5lIERJVl9UT19SRUcodmFsKSAoKHZhbCk9PTg/MzoodmFsKT09ND8yOih2YWwpPT0xPzA6MSkKCi8qIEZvciB0aGUgVklBNjg2QSwgd2UgbmVlZCB0byBrZWVwIHNvbWUgZGF0YSBpbiBtZW1vcnkuCiAgIFRoZSBzdHJ1Y3R1cmUgaXMgZHluYW1pY2FsbHkgYWxsb2NhdGVkLCBhdCB0aGUgc2FtZSB0aW1lIHdoZW4gYSBuZXcKICAgdmlhNjg2YSBjbGllbnQgaXMgYWxsb2NhdGVkLiAqLwpzdHJ1Y3QgdmlhNjg2YV9kYXRhIHsKCXN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKCXN0cnVjdCBzZW1hcGhvcmUgdXBkYXRlX2xvY2s7CgljaGFyIHZhbGlkOwkJLyogIT0wIGlmIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCgl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsJLyogSW4gamlmZmllcyAqLwoKCXU4IGluWzVdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KCXU4IGluX21heFs1XTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCgl1OCBpbl9taW5bNV07CQkvKiBSZWdpc3RlciB2YWx1ZSAqLwoJdTggZmFuWzJdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KCXU4IGZhbl9taW5bMl07CQkvKiBSZWdpc3RlciB2YWx1ZSAqLwoJdTE2IHRlbXBbM107CQkvKiBSZWdpc3RlciB2YWx1ZSAxMCBiaXQgKi8KCXU4IHRlbXBfb3ZlclszXTsJLyogUmVnaXN0ZXIgdmFsdWUgKi8KCXU4IHRlbXBfaHlzdFszXTsJLyogUmVnaXN0ZXIgdmFsdWUgKi8KCXU4IGZhbl9kaXZbMl07CQkvKiBSZWdpc3RlciBlbmNvZGluZywgc2hpZnRlZCByaWdodCAqLwoJdTE2IGFsYXJtczsJCS8qIFJlZ2lzdGVyIGVuY29kaW5nLCBjb21iaW5lZCAqLwp9OwoKc3RhdGljIHN0cnVjdCBwY2lfZGV2ICpzX2JyaWRnZTsJLyogcG9pbnRlciB0byB0aGUgKG9ubHkpIHZpYTY4NmEgKi8KCnN0YXRpYyBpbnQgdmlhNjg2YV9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpOwpzdGF0aWMgaW50IHZpYTY4NmFfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKTsKc3RhdGljIGludCB2aWE2ODZhX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CgpzdGF0aWMgaW5saW5lIGludCB2aWE2ODZhX3JlYWRfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKQp7CglyZXR1cm4gKGluYl9wKGNsaWVudC0+YWRkciArIHJlZykpOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgdmlhNjg2YV93cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsCgkJCQkgICAgICAgdTggdmFsdWUpCnsKCW91dGJfcCh2YWx1ZSwgY2xpZW50LT5hZGRyICsgcmVnKTsKfQoKc3RhdGljIHN0cnVjdCB2aWE2ODZhX2RhdGEgKnZpYTY4NmFfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwpzdGF0aWMgdm9pZCB2aWE2ODZhX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOwoKLyogZm9sbG93aW5nIGFyZSB0aGUgc3lzZnMgY2FsbGJhY2sgZnVuY3Rpb25zICovCgovKiA3IHZvbHRhZ2Ugc2Vuc29ycyAqLwpzdGF0aWMgc3NpemVfdCBzaG93X2luKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpIHsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSB2aWE2ODZhX3VwZGF0ZV9kZXZpY2UoZGV2KTsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgSU5fRlJPTV9SRUcoZGF0YS0+aW5bbnJdLCBucikpOwp9CgpzdGF0aWMgc3NpemVfdCBzaG93X2luX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKSB7CglzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gdmlhNjg2YV91cGRhdGVfZGV2aWNlKGRldik7CglyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIElOX0ZST01fUkVHKGRhdGEtPmluX21pbltucl0sIG5yKSk7Cn0KCnN0YXRpYyBzc2l6ZV90IHNob3dfaW5fbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpIHsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSB2aWE2ODZhX3VwZGF0ZV9kZXZpY2UoZGV2KTsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgSU5fRlJPTV9SRUcoZGF0YS0+aW5fbWF4W25yXSwgbnIpKTsKfQoKc3RhdGljIHNzaXplX3Qgc2V0X2luX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKCQlzaXplX3QgY291bnQsIGludCBucikgewoJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKCXVuc2lnbmVkIGxvbmcgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CgoJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOwoJZGF0YS0+aW5fbWluW25yXSA9IElOX1RPX1JFRyh2YWwsIG5yKTsKCXZpYTY4NmFfd3JpdGVfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19JTl9NSU4obnIpLAoJCQlkYXRhLT5pbl9taW5bbnJdKTsKCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CglyZXR1cm4gY291bnQ7Cn0Kc3RhdGljIHNzaXplX3Qgc2V0X2luX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKCQlzaXplX3QgY291bnQsIGludCBucikgewoJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKCXVuc2lnbmVkIGxvbmcgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CgoJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOwoJZGF0YS0+aW5fbWF4W25yXSA9IElOX1RPX1JFRyh2YWwsIG5yKTsKCXZpYTY4NmFfd3JpdGVfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19JTl9NQVgobnIpLAoJCQlkYXRhLT5pbl9tYXhbbnJdKTsKCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CglyZXR1cm4gY291bnQ7Cn0KI2RlZmluZSBzaG93X2luX29mZnNldChvZmZzZXQpCQkJCQlcCnN0YXRpYyBzc2l6ZV90IAkJCQkJCQlcCglzaG93X2luIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJCVwKewkJCQkJCQkJXAoJcmV0dXJuIHNob3dfaW4oZGV2LCBidWYsIG9mZnNldCk7CQkJXAp9CQkJCQkJCQlcCnN0YXRpYyBzc2l6ZV90IAkJCQkJCQlcCglzaG93X2luIyNvZmZzZXQjI19taW4gKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJXAp7CQkJCQkJCQlcCglyZXR1cm4gc2hvd19pbl9taW4oZGV2LCBidWYsIG9mZnNldCk7CQlcCn0JCQkJCQkJCVwKc3RhdGljIHNzaXplX3QgCQkJCQkJCVwKCXNob3dfaW4jI29mZnNldCMjX21heCAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQlcCnsJCQkJCQkJCVwKCXJldHVybiBzaG93X2luX21heChkZXYsIGJ1Ziwgb2Zmc2V0KTsJCVwKfQkJCQkJCQkJXApzdGF0aWMgc3NpemVfdCBzZXRfaW4jI29mZnNldCMjX21pbiAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgCVwKCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgCQkJXAp7CQkJCQkJCQlcCglyZXR1cm4gc2V0X2luX21pbihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCk7CQlcCn0JCQkJCQkJCVwKc3RhdGljIHNzaXplX3Qgc2V0X2luIyNvZmZzZXQjI19tYXggKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCVwKCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCQlcCnsJCQkJCQkJCVwKCXJldHVybiBzZXRfaW5fbWF4KGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0KTsJCVwKfQkJCQkJCQkJXApzdGF0aWMgREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCBzaG93X2luIyNvZmZzZXQsIE5VTEwpO1wKc3RhdGljIERFVklDRV9BVFRSKGluIyNvZmZzZXQjI19taW4sIFNfSVJVR08gfCBTX0lXVVNSLCAJXAoJCXNob3dfaW4jI29mZnNldCMjX21pbiwgc2V0X2luIyNvZmZzZXQjI19taW4pOwlcCnN0YXRpYyBERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfbWF4LCBTX0lSVUdPIHwgU19JV1VTUiwgCVwKCQlzaG93X2luIyNvZmZzZXQjI19tYXgsIHNldF9pbiMjb2Zmc2V0IyNfbWF4KTsKCnNob3dfaW5fb2Zmc2V0KDApOwpzaG93X2luX29mZnNldCgxKTsKc2hvd19pbl9vZmZzZXQoMik7CnNob3dfaW5fb2Zmc2V0KDMpOwpzaG93X2luX29mZnNldCg0KTsKCi8qIDMgdGVtcGVyYXR1cmVzICovCnN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKSB7CglzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gdmlhNjg2YV91cGRhdGVfZGV2aWNlKGRldik7CglyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIFRFTVBfRlJPTV9SRUcxMChkYXRhLT50ZW1wW25yXSkpOwp9CnN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9vdmVyKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpIHsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSB2aWE2ODZhX3VwZGF0ZV9kZXZpY2UoZGV2KTsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX292ZXJbbnJdKSk7Cn0Kc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikgewoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOwoJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfaHlzdFtucl0pKTsKfQpzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9vdmVyKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAoJCXNpemVfdCBjb3VudCwgaW50IG5yKSB7CglzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwoJaW50IHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CgoJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOwoJZGF0YS0+dGVtcF9vdmVyW25yXSA9IFRFTVBfVE9fUkVHKHZhbCk7Cgl2aWE2ODZhX3dyaXRlX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfVEVNUF9PVkVSW25yXSwKCQkJICAgIGRhdGEtPnRlbXBfb3Zlcltucl0pOwoJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCXJldHVybiBjb3VudDsKfQpzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9oeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAoJCXNpemVfdCBjb3VudCwgaW50IG5yKSB7CglzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwoJaW50IHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CgoJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOwoJZGF0YS0+dGVtcF9oeXN0W25yXSA9IFRFTVBfVE9fUkVHKHZhbCk7Cgl2aWE2ODZhX3dyaXRlX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfVEVNUF9IWVNUW25yXSwKCQkJICAgIGRhdGEtPnRlbXBfaHlzdFtucl0pOwoJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCXJldHVybiBjb3VudDsKfQojZGVmaW5lIHNob3dfdGVtcF9vZmZzZXQob2Zmc2V0KQkJCQkJXApzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJXAp7CQkJCQkJCQkJXAoJcmV0dXJuIHNob3dfdGVtcChkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJCVwKfQkJCQkJCQkJCVwKc3RhdGljIHNzaXplX3QJCQkJCQkJCVwKc2hvd190ZW1wXyMjb2Zmc2V0IyNfb3ZlciAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQkJXAp7CQkJCQkJCQkJXAoJcmV0dXJuIHNob3dfdGVtcF9vdmVyKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQlcCn0JCQkJCQkJCQlcCnN0YXRpYyBzc2l6ZV90CQkJCQkJCQlcCnNob3dfdGVtcF8jI29mZnNldCMjX2h5c3QgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJCVwKewkJCQkJCQkJCVwKCXJldHVybiBzaG93X3RlbXBfaHlzdChkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJXAp9CQkJCQkJCQkJXApzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF8jI29mZnNldCMjX292ZXIgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIAkJXAoJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSAJCQkJXAp7CQkJCQkJCQkJXAoJcmV0dXJuIHNldF90ZW1wX292ZXIoZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsJCVwKfQkJCQkJCQkJCVwKc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfIyNvZmZzZXQjI19oeXN0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCAJCVwKCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgCQkJCVwKewkJCQkJCQkJCVwKCXJldHVybiBzZXRfdGVtcF9oeXN0KGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7CQlcCn0JCQkJCQkJCQlcCnN0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wXyMjb2Zmc2V0LCBOVUxMKTtcCnN0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19tYXgsIFNfSVJVR08gfCBTX0lXVVNSLCAJCVwKCQlzaG93X3RlbXBfIyNvZmZzZXQjI19vdmVyLCBzZXRfdGVtcF8jI29mZnNldCMjX292ZXIpOwlcCnN0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19tYXhfaHlzdCwgU19JUlVHTyB8IFNfSVdVU1IsIAkJXAoJCXNob3dfdGVtcF8jI29mZnNldCMjX2h5c3QsIHNldF90ZW1wXyMjb2Zmc2V0IyNfaHlzdCk7CgpzaG93X3RlbXBfb2Zmc2V0KDEpOwpzaG93X3RlbXBfb2Zmc2V0KDIpOwpzaG93X3RlbXBfb2Zmc2V0KDMpOwoKLyogMiBGYW5zICovCnN0YXRpYyBzc2l6ZV90IHNob3dfZmFuKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpIHsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSB2aWE2ODZhX3VwZGF0ZV9kZXZpY2UoZGV2KTsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuW25yXSwKCQkJCURJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpICk7Cn0Kc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpIHsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSB2aWE2ODZhX3VwZGF0ZV9kZXZpY2UoZGV2KTsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLAoJCUZBTl9GUk9NX1JFRyhkYXRhLT5mYW5fbWluW25yXSwgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSkgKTsKfQpzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl9kaXYoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikgewoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOwoJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkgKTsKfQpzdGF0aWMgc3NpemVfdCBzZXRfZmFuX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKCQlzaXplX3QgY291bnQsIGludCBucikgewoJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOwoKCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCWRhdGEtPmZhbl9taW5bbnJdID0gRkFOX1RPX1JFRyh2YWwsIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpOwoJdmlhNjg2YV93cml0ZV92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX0ZBTl9NSU4obnIrMSksIGRhdGEtPmZhbl9taW5bbnJdKTsKCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CglyZXR1cm4gY291bnQ7Cn0Kc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9kaXYoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCgkJc2l6ZV90IGNvdW50LCBpbnQgbnIpIHsKCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CglzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CglpbnQgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKCWludCBvbGQ7CgoJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOwoJb2xkID0gdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfRkFORElWKTsKCWRhdGEtPmZhbl9kaXZbbnJdID0gRElWX1RPX1JFRyh2YWwpOwoJb2xkID0gKG9sZCAmIDB4MGYpIHwgKGRhdGEtPmZhbl9kaXZbMV0gPDwgNikgfCAoZGF0YS0+ZmFuX2RpdlswXSA8PCA0KTsKCXZpYTY4NmFfd3JpdGVfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19GQU5ESVYsIG9sZCk7Cgl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOwoJcmV0dXJuIGNvdW50Owp9CgojZGVmaW5lIHNob3dfZmFuX29mZnNldChvZmZzZXQpCQkJCQkJXApzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl8jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQlcCnsJCQkJCQkJCQlcCglyZXR1cm4gc2hvd19mYW4oZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCQlcCn0JCQkJCQkJCQlcCnN0YXRpYyBzc2l6ZV90IHNob3dfZmFuXyMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCVwKewkJCQkJCQkJCVwKCXJldHVybiBzaG93X2Zhbl9taW4oZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCVwKfQkJCQkJCQkJCVwKc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fIyNvZmZzZXQjI19kaXYgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJXAp7CQkJCQkJCQkJXAoJcmV0dXJuIHNob3dfZmFuX2RpdihkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJXAp9CQkJCQkJCQkJXApzdGF0aWMgc3NpemVfdCBzZXRfZmFuXyMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCAJCVwKCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSAJCQkJCVwKewkJCQkJCQkJCVwKCXJldHVybiBzZXRfZmFuX21pbihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOwkJXAp9CQkJCQkJCQkJXApzdGF0aWMgc3NpemVfdCBzZXRfZmFuXyMjb2Zmc2V0IyNfZGl2IChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCAJCVwKCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgCQkJCVwKewkJCQkJCQkJCVwKCXJldHVybiBzZXRfZmFuX2RpdihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOwkJXAp9CQkJCQkJCQkJXApzdGF0aWMgREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgc2hvd19mYW5fIyNvZmZzZXQsIE5VTEwpO1wKc3RhdGljIERFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwgCQlcCgkJc2hvd19mYW5fIyNvZmZzZXQjI19taW4sIHNldF9mYW5fIyNvZmZzZXQjI19taW4pOwlcCnN0YXRpYyBERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX2RpdiwgU19JUlVHTyB8IFNfSVdVU1IsIAkJXAoJCXNob3dfZmFuXyMjb2Zmc2V0IyNfZGl2LCBzZXRfZmFuXyMjb2Zmc2V0IyNfZGl2KTsKCnNob3dfZmFuX29mZnNldCgxKTsKc2hvd19mYW5fb2Zmc2V0KDIpOwoKLyogQWxhcm1zICovCnN0YXRpYyBzc2l6ZV90IHNob3dfYWxhcm1zKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikgewoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOwoJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRhdGEtPmFsYXJtcyk7Cn0Kc3RhdGljIERFVklDRV9BVFRSKGFsYXJtcywgU19JUlVHTywgc2hvd19hbGFybXMsIE5VTEwpOwoKLyogVGhlIGRyaXZlci4gSSBjaG9vc2UgdG8gdXNlIHR5cGUgaTJjX2RyaXZlciwgYXMgYXQgaXMgaWRlbnRpY2FsIHRvIGJvdGgKICAgc21idXNfZHJpdmVyIGFuZCBpc2FfZHJpdmVyLCBhbmQgY2xpZW50cyBjb3VsZCBiZSBvZiBlaXRoZXIga2luZCAqLwpzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgdmlhNjg2YV9kcml2ZXIgPSB7Cgkub3duZXIJCT0gVEhJU19NT0RVTEUsCgkubmFtZQkJPSAidmlhNjg2YSIsCgkuaWQJCT0gSTJDX0RSSVZFUklEX1ZJQTY4NkEsCgkuZmxhZ3MJCT0gSTJDX0RGX05PVElGWSwKCS5hdHRhY2hfYWRhcHRlcgk9IHZpYTY4NmFfYXR0YWNoX2FkYXB0ZXIsCgkuZGV0YWNoX2NsaWVudAk9IHZpYTY4NmFfZGV0YWNoX2NsaWVudCwKfTsKCgovKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBtb2R1bGUgaXMgbG9hZGVkICovCnN0YXRpYyBpbnQgdmlhNjg2YV9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCnsKCWlmICghKGFkYXB0ZXItPmNsYXNzICYgSTJDX0NMQVNTX0hXTU9OKSkKCQlyZXR1cm4gMDsKCXJldHVybiBpMmNfZGV0ZWN0KGFkYXB0ZXIsICZhZGRyX2RhdGEsIHZpYTY4NmFfZGV0ZWN0KTsKfQoKc3RhdGljIGludCB2aWE2ODZhX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKewoJc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQ7CglzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhOwoJaW50IGVyciA9IDA7Cgljb25zdCBjaGFyIGNsaWVudF9uYW1lW10gPSAidmlhNjg2YSI7Cgl1MTYgdmFsOwoKCS8qIE1ha2Ugc3VyZSB3ZSBhcmUgcHJvYmluZyB0aGUgSVNBIGJ1cyEhICAqLwoJaWYgKCFpMmNfaXNfaXNhX2FkYXB0ZXIoYWRhcHRlcikpIHsKCQlkZXZfZXJyKCZhZGFwdGVyLT5kZXYsCgkJInZpYTY4NmFfZGV0ZWN0IGNhbGxlZCBmb3IgYW4gSTJDIGJ1cyBhZGFwdGVyPyE/XG4iKTsKCQlyZXR1cm4gMDsKCX0KCgkvKiA4MjMxIHJlcXVpcmVzIG11bHRpcGxlIG9mIDI1Niwgd2UgZW5mb3JjZSB0aGF0IG9uIDY4NiBhcyB3ZWxsICovCglpZiAoZm9yY2VfYWRkcikKCQlhZGRyZXNzID0gZm9yY2VfYWRkciAmIDB4RkYwMDsKCglpZiAoZm9yY2VfYWRkcikgewoJCWRldl93YXJuKCZhZGFwdGVyLT5kZXYsICJmb3JjaW5nIElTQSBhZGRyZXNzIDB4JTA0WFxuIiwKCQkJIGFkZHJlc3MpOwoJCWlmIChQQ0lCSU9TX1NVQ0NFU1NGVUwgIT0KCQkgICAgcGNpX3dyaXRlX2NvbmZpZ193b3JkKHNfYnJpZGdlLCBWSUE2ODZBX0JBU0VfUkVHLCBhZGRyZXNzKSkKCQkJcmV0dXJuIC1FTk9ERVY7Cgl9CglpZiAoUENJQklPU19TVUNDRVNTRlVMICE9CgkgICAgcGNpX3JlYWRfY29uZmlnX3dvcmQoc19icmlkZ2UsIFZJQTY4NkFfRU5BQkxFX1JFRywgJnZhbCkpCgkJcmV0dXJuIC1FTk9ERVY7CglpZiAoISh2YWwgJiAweDAwMDEpKSB7CgkJZGV2X3dhcm4oJmFkYXB0ZXItPmRldiwgImVuYWJsaW5nIHNlbnNvcnNcbiIpOwoJCWlmIChQQ0lCSU9TX1NVQ0NFU1NGVUwgIT0KCQkgICAgcGNpX3dyaXRlX2NvbmZpZ193b3JkKHNfYnJpZGdlLCBWSUE2ODZBX0VOQUJMRV9SRUcsCgkJCQkJICB2YWwgfCAweDAwMDEpKQoJCQlyZXR1cm4gLUVOT0RFVjsKCX0KCgkvKiBSZXNlcnZlIHRoZSBJU0EgcmVnaW9uICovCglpZiAoIXJlcXVlc3RfcmVnaW9uKGFkZHJlc3MsIFZJQTY4NkFfRVhURU5ULCB2aWE2ODZhX2RyaXZlci5uYW1lKSkgewoJCWRldl9lcnIoJmFkYXB0ZXItPmRldiwgInJlZ2lvbiAweCV4IGFscmVhZHkgaW4gdXNlIVxuIiwKCQkJYWRkcmVzcyk7CgkJcmV0dXJuIC1FTk9ERVY7Cgl9CgoJaWYgKCEoZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2aWE2ODZhX2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKCQllcnIgPSAtRU5PTUVNOwoJCWdvdG8gRVJST1IwOwoJfQoJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgdmlhNjg2YV9kYXRhKSk7CgoJbmV3X2NsaWVudCA9ICZkYXRhLT5jbGllbnQ7CglpMmNfc2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCwgZGF0YSk7CgluZXdfY2xpZW50LT5hZGRyID0gYWRkcmVzczsKCW5ld19jbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOwoJbmV3X2NsaWVudC0+ZHJpdmVyID0gJnZpYTY4NmFfZHJpdmVyOwoJbmV3X2NsaWVudC0+ZmxhZ3MgPSAwOwoKCS8qIEZpbGwgaW4gdGhlIHJlbWFpbmluZyBjbGllbnQgZmllbGRzIGFuZCBwdXQgaW50byB0aGUgZ2xvYmFsIGxpc3QgKi8KCXN0cmxjcHkobmV3X2NsaWVudC0+bmFtZSwgY2xpZW50X25hbWUsIEkyQ19OQU1FX1NJWkUpOwoKCWRhdGEtPnZhbGlkID0gMDsKCWluaXRfTVVURVgoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCS8qIFRlbGwgdGhlIEkyQyBsYXllciBhIG5ldyBjbGllbnQgaGFzIGFycml2ZWQgKi8KCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQobmV3X2NsaWVudCkpKQoJCWdvdG8gRVJST1IzOwoKCS8qIEluaXRpYWxpemUgdGhlIFZJQTY4NkEgY2hpcCAqLwoJdmlhNjg2YV9pbml0X2NsaWVudChuZXdfY2xpZW50KTsKCgkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjBfaW5wdXQpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjFfaW5wdXQpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjJfaW5wdXQpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjNfaW5wdXQpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjRfaW5wdXQpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjBfbWluKTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xX21pbik7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMl9taW4pOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjNfbWluKTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW40X21pbik7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMF9tYXgpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjFfbWF4KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4yX21heCk7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luM19tYXgpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjRfbWF4KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfaW5wdXQpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9pbnB1dCk7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAzX2lucHV0KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfbWF4KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfbWF4KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDNfbWF4KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfbWF4X2h5c3QpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9tYXhfaHlzdCk7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAzX21heF9oeXN0KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMV9pbnB1dCk7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjJfaW5wdXQpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4xX21pbik7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjJfbWluKTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMV9kaXYpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4yX2Rpdik7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2FsYXJtcyk7CgoJcmV0dXJuIDA7CgpFUlJPUjM6CglrZnJlZShkYXRhKTsKRVJST1IwOgoJcmVsZWFzZV9yZWdpb24oYWRkcmVzcywgVklBNjg2QV9FWFRFTlQpOwoJcmV0dXJuIGVycjsKfQoKc3RhdGljIGludCB2aWE2ODZhX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKewoJaW50IGVycjsKCglpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKSB7CgkJZGV2X2VycigmY2xpZW50LT5kZXYsCgkJIkNsaWVudCBkZXJlZ2lzdHJhdGlvbiBmYWlsZWQsIGNsaWVudCBub3QgZGV0YWNoZWQuXG4iKTsKCQlyZXR1cm4gZXJyOwoJfQoKCXJlbGVhc2VfcmVnaW9uKGNsaWVudC0+YWRkciwgVklBNjg2QV9FWFRFTlQpOwoJa2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOwoKCXJldHVybiAwOwp9CgovKiBDYWxsZWQgd2hlbiB3ZSBoYXZlIGZvdW5kIGEgbmV3IFZJQTY4NkEuIFNldCBsaW1pdHMsIGV0Yy4gKi8Kc3RhdGljIHZvaWQgdmlhNjg2YV9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQp7Cgl1OCByZWc7CgoJLyogU3RhcnQgbW9uaXRvcmluZyAqLwoJcmVnID0gdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfQ09ORklHKTsKCXZpYTY4NmFfd3JpdGVfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19DT05GSUcsIChyZWd8MHgwMSkmMHg3Rik7CgoJLyogQ29uZmlndXJlIHRlbXAgaW50ZXJydXB0IG1vZGUgZm9yIGNvbnRpbnVvdXMtaW50ZXJydXB0IG9wZXJhdGlvbiAqLwoJdmlhNjg2YV93cml0ZV92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX1RFTVBfTU9ERSwKCQkJICAgIHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX1RFTVBfTU9ERSkgJgoJCQkgICAgIShWSUE2ODZBX1RFTVBfTU9ERV9NQVNLIHwgVklBNjg2QV9URU1QX01PREVfQ09OVElOVU9VUykpOwp9CgpzdGF0aWMgc3RydWN0IHZpYTY4NmFfZGF0YSAqdmlhNjg2YV91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKewoJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKCWludCBpOwoKCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCglpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3VwZGF0ZWQgKyBIWiArIEhaIC8gMikKCSAgICB8fCAhZGF0YS0+dmFsaWQpIHsKCQlmb3IgKGkgPSAwOyBpIDw9IDQ7IGkrKykgewoJCQlkYXRhLT5pbltpXSA9CgkJCSAgICB2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19JTihpKSk7CgkJCWRhdGEtPmluX21pbltpXSA9IHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsCgkJCQkJCQkgICAgIFZJQTY4NkFfUkVHX0lOX01JTgoJCQkJCQkJICAgICAoaSkpOwoJCQlkYXRhLT5pbl9tYXhbaV0gPQoJCQkgICAgdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfSU5fTUFYKGkpKTsKCQl9CgkJZm9yIChpID0gMTsgaSA8PSAyOyBpKyspIHsKCQkJZGF0YS0+ZmFuW2kgLSAxXSA9CgkJCSAgICB2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19GQU4oaSkpOwoJCQlkYXRhLT5mYW5fbWluW2kgLSAxXSA9IHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsCgkJCQkJCSAgICAgVklBNjg2QV9SRUdfRkFOX01JTihpKSk7CgkJfQoJCWZvciAoaSA9IDA7IGkgPD0gMjsgaSsrKSB7CgkJCWRhdGEtPnRlbXBbaV0gPSB2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LAoJCQkJCQkgVklBNjg2QV9SRUdfVEVNUFtpXSkgPDwgMjsKCQkJZGF0YS0+dGVtcF9vdmVyW2ldID0KCQkJICAgIHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsCgkJCQkJICAgICAgIFZJQTY4NkFfUkVHX1RFTVBfT1ZFUltpXSk7CgkJCWRhdGEtPnRlbXBfaHlzdFtpXSA9CgkJCSAgICB2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LAoJCQkJCSAgICAgICBWSUE2ODZBX1JFR19URU1QX0hZU1RbaV0pOwoJCX0KCQkvKiBhZGQgaW4gbG93ZXIgMiBiaXRzCgkJICAgdGVtcDEgdXNlcyBiaXRzIDctNiBvZiBWSUE2ODZBX1JFR19URU1QX0xPVzEKCQkgICB0ZW1wMiB1c2VzIGJpdHMgNS00IG9mIFZJQTY4NkFfUkVHX1RFTVBfTE9XMjMKCQkgICB0ZW1wMyB1c2VzIGJpdHMgNy02IG9mIFZJQTY4NkFfUkVHX1RFTVBfTE9XMjMKCQkgKi8KCQlkYXRhLT50ZW1wWzBdIHw9ICh2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LAoJCQkJCQkgICAgIFZJQTY4NkFfUkVHX1RFTVBfTE9XMSkKCQkJCSAgJiAweGMwKSA+PiA2OwoJCWRhdGEtPnRlbXBbMV0gfD0KCQkgICAgKHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX1RFTVBfTE9XMjMpICYKCQkgICAgIDB4MzApID4+IDQ7CgkJZGF0YS0+dGVtcFsyXSB8PQoJCSAgICAodmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfVEVNUF9MT1cyMykgJgoJCSAgICAgMHhjMCkgPj4gNjsKCgkJaSA9IHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX0ZBTkRJVik7CgkJZGF0YS0+ZmFuX2RpdlswXSA9IChpID4+IDQpICYgMHgwMzsKCQlkYXRhLT5mYW5fZGl2WzFdID0gaSA+PiA2OwoJCWRhdGEtPmFsYXJtcyA9CgkJICAgIHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsCgkJCQkgICAgICAgVklBNjg2QV9SRUdfQUxBUk0xKSB8CgkJICAgICh2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19BTEFSTTIpIDw8IDgpOwoJCWRhdGEtPmxhc3RfdXBkYXRlZCA9IGppZmZpZXM7CgkJZGF0YS0+dmFsaWQgPSAxOwoJfQoKCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CgoJcmV0dXJuIGRhdGE7Cn0KCnN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB2aWE2ODZhX3BjaV9pZHNbXSA9IHsKCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfODJDNjg2XzQpIH0sCgl7IDAsIH0KfTsKCk1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCB2aWE2ODZhX3BjaV9pZHMpOwoKc3RhdGljIGludCBfX2RldmluaXQgdmlhNjg2YV9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwKCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCnsKCXUxNiB2YWw7CglpbnQgYWRkciA9IDA7CgoJaWYgKFBDSUJJT1NfU1VDQ0VTU0ZVTCAhPQoJICAgIHBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgVklBNjg2QV9CQVNFX1JFRywgJnZhbCkpCgkJcmV0dXJuIC1FTk9ERVY7CgoJYWRkciA9IHZhbCAmIH4oVklBNjg2QV9FWFRFTlQgLSAxKTsKCWlmIChhZGRyID09IDAgJiYgZm9yY2VfYWRkciA9PSAwKSB7CgkJZGV2X2VycigmZGV2LT5kZXYsICJiYXNlIGFkZHJlc3Mgbm90IHNldCAtIHVwZ3JhZGUgQklPUyAiCgkJCSJvciB1c2UgZm9yY2VfYWRkcj0weGFkZHJcbiIpOwoJCXJldHVybiAtRU5PREVWOwoJfQoJaWYgKGZvcmNlX2FkZHIpCgkJYWRkciA9IGZvcmNlX2FkZHI7CS8qIHNvIGRldGVjdCB3aWxsIGdldCBjYWxsZWQgKi8KCglpZiAoIWFkZHIpIHsKCQlkZXZfZXJyKCZkZXYtPmRldiwgIk5vIFZpYSA2ODZBIHNlbnNvcnMgZm91bmQuXG4iKTsKCQlyZXR1cm4gLUVOT0RFVjsKCX0KCW5vcm1hbF9pc2FbMF0gPSBhZGRyOwoKCXNfYnJpZGdlID0gcGNpX2Rldl9nZXQoZGV2KTsKCWlmIChpMmNfYWRkX2RyaXZlcigmdmlhNjg2YV9kcml2ZXIpKSB7CgkJcGNpX2Rldl9wdXQoc19icmlkZ2UpOwoJCXNfYnJpZGdlID0gTlVMTDsKCX0KCgkvKiBBbHdheXMgcmV0dXJuIGZhaWx1cmUgaGVyZS4gIFRoaXMgaXMgdG8gYWxsb3cgb3RoZXIgZHJpdmVycyB0byBiaW5kCgkgKiB0byB0aGlzIHBjaSBkZXZpY2UuICBXZSBkb24ndCByZWFsbHkgd2FudCB0byBoYXZlIGNvbnRyb2wgb3ZlciB0aGUKCSAqIHBjaSBkZXZpY2UsIHdlIG9ubHkgd2FudGVkIHRvIHJlYWQgYXMgZmV3IHJlZ2lzdGVyIHZhbHVlcyBmcm9tIGl0LgoJICovCglyZXR1cm4gLUVOT0RFVjsKfQoKc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHZpYTY4NmFfcGNpX2RyaXZlciA9IHsKCS5uYW1lCQk9ICJ2aWE2ODZhIiwKCS5pZF90YWJsZQk9IHZpYTY4NmFfcGNpX2lkcywKCS5wcm9iZQkJPSB2aWE2ODZhX3BjaV9wcm9iZSwKfTsKCnN0YXRpYyBpbnQgX19pbml0IHNtX3ZpYTY4NmFfaW5pdCh2b2lkKQp7CglyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmdmlhNjg2YV9wY2lfZHJpdmVyKTsKfQoKc3RhdGljIHZvaWQgX19leGl0IHNtX3ZpYTY4NmFfZXhpdCh2b2lkKQp7CglwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnZpYTY4NmFfcGNpX2RyaXZlcik7CglpZiAoc19icmlkZ2UgIT0gTlVMTCkgewoJCWkyY19kZWxfZHJpdmVyKCZ2aWE2ODZhX2RyaXZlcik7CgkJcGNpX2Rldl9wdXQoc19icmlkZ2UpOwoJCXNfYnJpZGdlID0gTlVMTDsKCX0KfQoKTU9EVUxFX0FVVEhPUigiS3n2c3RpIE3kbGtraSA8a21hbGtraUBjYy5odXQuZmk+LCAiCgkgICAgICAiTWFyayBTdHVkZWJha2VyIDxtZHN4eXoxMjNAeWFob28uY29tPiAiCgkgICAgICAiYW5kIEJvYiBEb3VnaGVydHkgPGJvYmRAc3RhbmZvcmQuZWR1PiIpOwpNT0RVTEVfREVTQ1JJUFRJT04oIlZJQSA2ODZBIFNlbnNvciBkZXZpY2UiKTsKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwoKbW9kdWxlX2luaXQoc21fdmlhNjg2YV9pbml0KTsKbW9kdWxlX2V4aXQoc21fdmlhNjg2YV9leGl0KTsK