LyoKICAgIHZpYTY4NmEuYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMKCQlmb3IgaGFyZHdhcmUgbW9uaXRvcmluZwoKICAgIENvcHlyaWdodCAoYykgMTk5OCAtIDIwMDIgIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4sCgkJCUt59nN0aSBN5Gxra2kgPGttYWxra2lAY2MuaHV0LmZpPiwKCQkJTWFyayBTdHVkZWJha2VyIDxtZHN4eXoxMjNAeWFob28uY29tPiwKCQkJYW5kIEJvYiBEb3VnaGVydHkgPGJvYmRAc3RhbmZvcmQuZWR1PgogICAgKFNvbWUgY29udmVyc2lvbi1mYWN0b3IgZGF0YSB3ZXJlIGNvbnRyaWJ1dGVkIGJ5IEpvbmF0aGFuIFRlaCBTb29uIFlldwogICAgPGoudGVoQGluYW1lLmNvbT4gYW5kIEFsZXggdmFuIEthYW0gPGRhcmtzaWRlQGNoZWxsby5ubD4uKQoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgoqLwoKLyoKICAgIFN1cHBvcnRzIHRoZSBWaWEgVlQ4MkM2ODZBLCBWVDgyQzY4NkIgc291dGggYnJpZGdlcy4KICAgIFJlcG9ydHMgYWxsIGFzIGEgNjg2QS4KICAgIFdhcm5pbmcgLSBvbmx5IHN1cHBvcnRzIGEgc2luZ2xlIGRldmljZS4KKi8KCiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgojaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgojaW5jbHVkZSA8bGludXgvaTJjLmg+CiNpbmNsdWRlIDxsaW51eC9pMmMtaXNhLmg+CiNpbmNsdWRlIDxsaW51eC9od21vbi5oPgojaW5jbHVkZSA8bGludXgvZXJyLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxhc20vaW8uaD4KCgovKiBJZiBmb3JjZV9hZGRyIGlzIHNldCB0byBhbnl0aGluZyBkaWZmZXJlbnQgZnJvbSAwLCB3ZSBmb3JjaWJseSBlbmFibGUKICAgdGhlIGRldmljZSBhdCB0aGUgZ2l2ZW4gYWRkcmVzcy4gKi8Kc3RhdGljIHVuc2lnbmVkIHNob3J0IGZvcmNlX2FkZHI7Cm1vZHVsZV9wYXJhbShmb3JjZV9hZGRyLCB1c2hvcnQsIDApOwpNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX2FkZHIsCgkJICJJbml0aWFsaXplIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIHNlbnNvcnMiKTsKCi8qIERldmljZSBhZGRyZXNzCiAgIE5vdGUgdGhhdCB3ZSBjYW4ndCBkZXRlcm1pbmUgdGhlIElTQSBhZGRyZXNzIHVudGlsIHdlIGhhdmUgaW5pdGlhbGl6ZWQKICAgb3VyIG1vZHVsZSAqLwpzdGF0aWMgdW5zaWduZWQgc2hvcnQgYWRkcmVzczsKCi8qCiAgIFRoZSBWaWEgNjg2YSBzb3V0aGJyaWRnZSBoYXMgYSBMTTc4LWxpa2UgY2hpcCBpbnRlZ3JhdGVkIG9uIHRoZSBzYW1lIElDLgogICBUaGlzIGRyaXZlciBpcyBhIGN1c3RvbWl6ZWQgY29weSBvZiBsbTc4LmMKKi8KCi8qIE1hbnkgVklBNjg2QSBjb25zdGFudHMgc3BlY2lmaWVkIGJlbG93ICovCgovKiBMZW5ndGggb2YgSVNBIGFkZHJlc3Mgc2VnbWVudCAqLwojZGVmaW5lIFZJQTY4NkFfRVhURU5UCQkweDgwCiNkZWZpbmUgVklBNjg2QV9CQVNFX1JFRwkweDcwCiNkZWZpbmUgVklBNjg2QV9FTkFCTEVfUkVHCTB4NzQKCi8qIFRoZSBWSUE2ODZBIHJlZ2lzdGVycyAqLwovKiBpbnMgbnVtYmVyZWQgMC00ICovCiNkZWZpbmUgVklBNjg2QV9SRUdfSU5fTUFYKG5yKQkoMHgyYiArICgobnIpICogMikpCiNkZWZpbmUgVklBNjg2QV9SRUdfSU5fTUlOKG5yKQkoMHgyYyArICgobnIpICogMikpCiNkZWZpbmUgVklBNjg2QV9SRUdfSU4obnIpCSgweDIyICsgKG5yKSkKCi8qIGZhbnMgbnVtYmVyZWQgMS0yICovCiNkZWZpbmUgVklBNjg2QV9SRUdfRkFOX01JTihucikJKDB4M2EgKyAobnIpKQojZGVmaW5lIFZJQTY4NkFfUkVHX0ZBTihucikJKDB4MjggKyAobnIpKQoKLyogdGVtcHMgbnVtYmVyZWQgMS0zICovCnN0YXRpYyBjb25zdCB1OCBWSUE2ODZBX1JFR19URU1QW10JPSB7IDB4MjAsIDB4MjEsIDB4MWYgfTsKc3RhdGljIGNvbnN0IHU4IFZJQTY4NkFfUkVHX1RFTVBfT1ZFUltdCT0geyAweDM5LCAweDNkLCAweDFkIH07CnN0YXRpYyBjb25zdCB1OCBWSUE2ODZBX1JFR19URU1QX0hZU1RbXQk9IHsgMHgzYSwgMHgzZSwgMHgxZSB9OwovKiBiaXRzIDctNiAqLwojZGVmaW5lIFZJQTY4NkFfUkVHX1RFTVBfTE9XMQkweDRiCi8qIDIgPSBiaXRzIDUtNCwgMyA9IGJpdHMgNy02ICovCiNkZWZpbmUgVklBNjg2QV9SRUdfVEVNUF9MT1cyMwkweDQ5CgojZGVmaW5lIFZJQTY4NkFfUkVHX0FMQVJNMQkweDQxCiNkZWZpbmUgVklBNjg2QV9SRUdfQUxBUk0yCTB4NDIKI2RlZmluZSBWSUE2ODZBX1JFR19GQU5ESVYJMHg0NwojZGVmaW5lIFZJQTY4NkFfUkVHX0NPTkZJRwkweDQwCi8qIFRoZSBmb2xsb3dpbmcgcmVnaXN0ZXIgc2V0cyB0ZW1wIGludGVycnVwdCBtb2RlIChiaXRzIDEtMCBmb3IgdGVtcDEsCiAzLTIgZm9yIHRlbXAyLCA1LTQgZm9yIHRlbXAzKS4gIE1vZGVzIGFyZToKICAgIDAwIGludGVycnVwdCBzdGF5cyBhcyBsb25nIGFzIHZhbHVlIGlzIG91dC1vZi1yYW5nZQogICAgMDEgaW50ZXJydXB0IGlzIGNsZWFyZWQgb25jZSByZWdpc3RlciBpcyByZWFkIChkZWZhdWx0KQogICAgMTAgY29tcGFyYXRvciBtb2RlLSBsaWtlIDAwLCBidXQgaWdub3JlcyBoeXN0ZXJlc2lzCiAgICAxMSBzYW1lIGFzIDAwICovCiNkZWZpbmUgVklBNjg2QV9SRUdfVEVNUF9NT0RFCQkweDRiCi8qIFdlJ2xsIGp1c3QgYXNzdW1lIHRoYXQgeW91IHdhbnQgdG8gc2V0IGFsbCAzIHNpbXVsdGFuZW91c2x5OiAqLwojZGVmaW5lIFZJQTY4NkFfVEVNUF9NT0RFX01BU0sJCTB4M0YKI2RlZmluZSBWSUE2ODZBX1RFTVBfTU9ERV9DT05USU5VT1VTCTB4MDAKCi8qIENvbnZlcnNpb25zLiBMaW1pdCBjaGVja2luZyBpcyBvbmx5IGRvbmUgb24gdGhlIFRPX1JFRwogICB2YXJpYW50cy4KCioqKioqKioqKiBWT0xUQUdFIENPTlZFUlNJT05TIChCb2IgRG91Z2hlcnR5KSAqKioqKioqKgogRnJvbSBIV01vbi5jcHAgKENvcHlyaWdodCAxOTk4LTIwMDAgSm9uYXRoYW4gVGVoIFNvb24gWWV3KToKIHZvbHRhZ2VmYWN0b3JbMF09MS4yNS8yNjI4OyAoMjYyOC8xLjI1PTIxMDIuNCkgICAvLyBWY2NwCiB2b2x0YWdlZmFjdG9yWzFdPTEuMjUvMjYyODsgKDI2MjgvMS4yNT0yMTAyLjQpICAgLy8gKzIuNVYKIHZvbHRhZ2VmYWN0b3JbMl09MS42Ny8yNjI4OyAoMjYyOC8xLjY3PTE1NzMuNykgICAvLyArMy4zVgogdm9sdGFnZWZhY3RvclszXT0yLjYvMjYyODsgICgyNjI4LzIuNjA9MTAxMC44KSAgIC8vICs1Vgogdm9sdGFnZWZhY3Rvcls0XT02LjMvMjYyODsgICgyNjI4LzYuMzA9NDE3LjE0KSAgIC8vICsxMlYKIGluW2ldPShkYXRhW2krMl0qMjUuMCsxMzMpKnZvbHRhZ2VmYWN0b3JbaV07CiBUaGF0IGlzOgogdm9sdHMgPSAoMjUqcmVnVmFsKzEzMykqZmFjdG9yCiByZWdWYWwgPSAodm9sdHMvZmFjdG9yLTEzMykvMjUKIChUaGVzZSBjb252ZXJzaW9ucyB3ZXJlIGNvbnRyaWJ1dGVkIGJ5IEpvbmF0aGFuIFRlaCBTb29uIFlldwogPGoudGVoQGluYW1lLmNvbT4pICovCnN0YXRpYyBpbmxpbmUgdTggSU5fVE9fUkVHKGxvbmcgdmFsLCBpbnQgaW5OdW0pCnsKCS8qIFRvIGF2b2lkIGZsb2F0aW5nIHBvaW50LCB3ZSBtdWx0aXBseSBjb25zdGFudHMgYnkgMTAgKDEwMCBmb3IgKzEyVikuCgkgICBSb3VuZGluZyBpcyBkb25lICgxMjA1MDAgaXMgYWN0dWFsbHkgMTMzMDAwIC0gMTI1MDApLgoJICAgUmVtZW1iZXIgdGhhdCB2YWwgaXMgZXhwcmVzc2VkIGluIDAuMDAxVi9iaXQsIHdoaWNoIGlzIHdoeSB3ZSBkaXZpZGUKCSAgIGJ5IGFuIGFkZGl0aW9uYWwgMTAwMDAgKDEwMDAwMCBmb3IgKzEyVik6IDEwMDAgZm9yIHZhbCBhbmQgMTAgKDEwMCkKCSAgIGZvciB0aGUgY29uc3RhbnRzLiAqLwoJaWYgKGluTnVtIDw9IDEpCgkJcmV0dXJuICh1OCkKCQkgICAgU0VOU09SU19MSU1JVCgodmFsICogMjEwMjQgLSAxMjA1MDAwKSAvIDI1MDAwMCwgMCwgMjU1KTsKCWVsc2UgaWYgKGluTnVtID09IDIpCgkJcmV0dXJuICh1OCkKCQkgICAgU0VOU09SU19MSU1JVCgodmFsICogMTU3MzcgLSAxMjA1MDAwKSAvIDI1MDAwMCwgMCwgMjU1KTsKCWVsc2UgaWYgKGluTnVtID09IDMpCgkJcmV0dXJuICh1OCkKCQkgICAgU0VOU09SU19MSU1JVCgodmFsICogMTAxMDggLSAxMjA1MDAwKSAvIDI1MDAwMCwgMCwgMjU1KTsKCWVsc2UKCQlyZXR1cm4gKHU4KQoJCSAgICBTRU5TT1JTX0xJTUlUKCh2YWwgKiA0MTcxNCAtIDEyMDUwMDAwKSAvIDI1MDAwMDAsIDAsIDI1NSk7Cn0KCnN0YXRpYyBpbmxpbmUgbG9uZyBJTl9GUk9NX1JFRyh1OCB2YWwsIGludCBpbk51bSkKewoJLyogVG8gYXZvaWQgZmxvYXRpbmcgcG9pbnQsIHdlIG11bHRpcGx5IGNvbnN0YW50cyBieSAxMCAoMTAwIGZvciArMTJWKS4KCSAgIFdlIGFsc28gbXVsdGlwbHkgdGhlbSBieSAxMDAwIGJlY2F1c2Ugd2Ugd2FudCAwLjAwMVYvYml0IGZvciB0aGUKCSAgIG91dHB1dCB2YWx1ZS4gUm91bmRpbmcgaXMgZG9uZS4gKi8KCWlmIChpbk51bSA8PSAxKQoJCXJldHVybiAobG9uZykgKCgyNTAwMDAgKiB2YWwgKyAxMzMwMDAwICsgMjEwMjQgLyAyKSAvIDIxMDI0KTsKCWVsc2UgaWYgKGluTnVtID09IDIpCgkJcmV0dXJuIChsb25nKSAoKDI1MDAwMCAqIHZhbCArIDEzMzAwMDAgKyAxNTczNyAvIDIpIC8gMTU3MzcpOwoJZWxzZSBpZiAoaW5OdW0gPT0gMykKCQlyZXR1cm4gKGxvbmcpICgoMjUwMDAwICogdmFsICsgMTMzMDAwMCArIDEwMTA4IC8gMikgLyAxMDEwOCk7CgllbHNlCgkJcmV0dXJuIChsb25nKSAoKDI1MDAwMDAgKiB2YWwgKyAxMzMwMDAwMCArIDQxNzE0IC8gMikgLyA0MTcxNCk7Cn0KCi8qKioqKioqKiogRkFOIFJQTSBDT05WRVJTSU9OUyAqKioqKioqKi8KLyogSGlnaGVyIHJlZ2lzdGVyIHZhbHVlcyA9IHNsb3dlciBmYW5zICh0aGUgZmFuJ3Mgc3Ryb2JlIGdhdGVzIGEgY291bnRlcikuCiBCdXQgdGhpcyBjaGlwIHNhdHVyYXRlcyBiYWNrIGF0IDAsIG5vdCBhdCAyNTUgbGlrZSBhbGwgdGhlIG90aGVyIGNoaXBzLgogU28sIDAgbWVhbnMgMCBSUE0gKi8Kc3RhdGljIGlubGluZSB1OCBGQU5fVE9fUkVHKGxvbmcgcnBtLCBpbnQgZGl2KQp7CglpZiAocnBtID09IDApCgkJcmV0dXJuIDA7CglycG0gPSBTRU5TT1JTX0xJTUlUKHJwbSwgMSwgMTAwMDAwMCk7CglyZXR1cm4gU0VOU09SU19MSU1JVCgoMTM1MDAwMCArIHJwbSAqIGRpdiAvIDIpIC8gKHJwbSAqIGRpdiksIDEsIDI1NSk7Cn0KCiNkZWZpbmUgRkFOX0ZST01fUkVHKHZhbCxkaXYpICgodmFsKT09MD8wOih2YWwpPT0yNTU/MDoxMzUwMDAwLygodmFsKSooZGl2KSkpCgovKioqKioqKiogVEVNUCBDT05WRVJTSU9OUyAoQm9iIERvdWdoZXJ0eSkgKioqKioqKioqLwovKiBsaW5lYXIgZml0cyBmcm9tIEhXTW9uLmNwcCAoQ29weXJpZ2h0IDE5OTgtMjAwMCBKb25hdGhhbiBUZWggU29vbiBZZXcpCiAgICAgIGlmKHRlbXA8MTY5KQoJICAgICAgcmV0dXJuIGRvdWJsZSh0ZW1wKSowLjQyNy0zMi4wODsKICAgICAgZWxzZSBpZih0ZW1wPj0xNjkgJiYgdGVtcDw9MjAyKQoJICAgICAgcmV0dXJuIGRvdWJsZSh0ZW1wKSowLjU4Mi01OC4xNjsKICAgICAgZWxzZQoJICAgICAgcmV0dXJuIGRvdWJsZSh0ZW1wKSowLjkyNC0xMjcuMzM7CgogQSBmaWZ0aC1vcmRlciBwb2x5bm9taWFsIGZpdHMgdGhlIHVub2ZmaWNpYWwgZGF0YSAocHJvdmlkZWQgYnkgQWxleCB2YW4KIEthYW0gPGRhcmtzaWRlQGNoZWxsby5ubD4pIGEgYml0IGJldHRlci4gIEl0IGFsc28gZ2l2ZSBtb3JlIHJlYXNvbmFibGUKIG51bWJlcnMgb24gbXkgbWFjaGluZSAoaWUuIHRoZXkgYWdyZWUgd2l0aCB3aGF0IG15IEJJT1MgdGVsbHMgbWUpLgogSGVyZSdzIHRoZSBmaWZ0aC1vcmRlciBmaXQgdG8gdGhlIDgtYml0IGRhdGE6CiB0ZW1wID0gMS42MjUwOTNlLTEwKnZhbF41IC0gMS4wMDE2MzJlLTA3KnZhbF40ICsgMi40NTc2NTNlLTA1KnZhbF4zIC0KCTIuOTY3NjE5ZS0wMyp2YWxeMiArIDIuMTc1MTQ0ZS0wMSp2YWwgLSA3LjA5MDA2N2UrMC4KCiAoMjAwMC0xMC0yNS0gUkZEOiB0aGFua3MgdG8gVXdlIEFuZGVyc2VuIDx1YW5kZXJzZW5AbWF5YWguY29tPiBmb3IKIGZpbmRpbmcgbXkgdHlwb3MgaW4gdGhpcyBmb3JtdWxhISkKCiBBbGFzLCBub25lIG9mIHRoZSBlbGVnYW50IGZ1bmN0aW9uLWZpdCBzb2x1dGlvbnMgd2lsbCB3b3JrIGJlY2F1c2Ugd2UKIGFyZW4ndCBhbGxvd2VkIHRvIHVzZSBmbG9hdGluZyBwb2ludCBpbiB0aGUga2VybmVsIGFuZCBkb2luZyBpdCB3aXRoCiBpbnRlZ2VycyBkb2Vzbid0IHByb3ZpZGUgZW5vdWdoIHByZWNpc2lvbi4gIFNvIHdlJ2xsIGRvIGJvcmluZyBvbGQKIGxvb2stdXAgdGFibGUgc3R1ZmYuICBUaGUgdW5vZmZpY2lhbCBkYXRhIChzZWUgYmVsb3cpIGhhdmUgZWZmZWN0aXZlbHkKIDctYml0IHJlc29sdXRpb24gKHRoZXkgYXJlIHJvdW5kZWQgdG8gdGhlIG5lYXJlc3QgZGVncmVlKS4gIEknbSBhc3N1bWluZwogdGhhdCB0aGUgdHJhbnNmZXIgZnVuY3Rpb24gb2YgdGhlIGRldmljZSBpcyBtb25vdG9uaWMgYW5kIHNtb290aCwgc28gYQogc21vb3RoIGZ1bmN0aW9uIGZpdCB0byB0aGUgZGF0YSB3aWxsIGFsbG93IHVzIHRvIGdldCBiZXR0ZXIgcHJlY2lzaW9uLgogSSB1c2VkIHRoZSA1dGgtb3JkZXIgcG9seSBmaXQgZGVzY3JpYmVkIGFib3ZlIGFuZCBzb2x2ZWQgZm9yCiBWSUEgcmVnaXN0ZXIgdmFsdWVzIDAtMjU1LiAgSSAqMTAgYmVmb3JlIHJvdW5kaW5nLCBzbyB3ZSBnZXQgdGVudGgtZGVncmVlCiBwcmVjaXNpb24uICAoSSBjb3VsZCBoYXZlIGRvbmUgYWxsIDEwMjQgdmFsdWVzIGZvciBvdXIgMTAtYml0IHJlYWRpbmdzLAogYnV0IHRoZSBmdW5jdGlvbiBpcyB2ZXJ5IGxpbmVhciBpbiB0aGUgdXNlZnVsIHJhbmdlICgwLTgwIGRlZyBDKSwgc28KIHdlJ2xsIGp1c3QgdXNlIGxpbmVhciBpbnRlcnBvbGF0aW9uIGZvciAxMC1iaXQgcmVhZGluZ3MuKSAgU28sIHRlbXBMVVQKIGlzIHRoZSB0ZW1wIGF0IHZpYSByZWdpc3RlciB2YWx1ZXMgMC0yNTU6ICovCnN0YXRpYyBjb25zdCBzMTYgdGVtcExVVFtdID0KeyAtNzA5LCAtNjg4LCAtNjY3LCAtNjQ2LCAtNjI3LCAtNjA3LCAtNTg5LCAtNTcwLCAtNTUzLCAtNTM2LCAtNTE5LAoJLTUwMywgLTQ4NywgLTQ3MSwgLTQ1NiwgLTQ0MiwgLTQyOCwgLTQxNCwgLTQwMCwgLTM4NywgLTM3NSwKCS0zNjIsIC0zNTAsIC0zMzksIC0zMjcsIC0zMTYsIC0zMDUsIC0yOTUsIC0yODUsIC0yNzUsIC0yNjUsCgktMjU1LCAtMjQ2LCAtMjM3LCAtMjI5LCAtMjIwLCAtMjEyLCAtMjA0LCAtMTk2LCAtMTg4LCAtMTgwLAoJLTE3MywgLTE2NiwgLTE1OSwgLTE1MiwgLTE0NSwgLTEzOSwgLTEzMiwgLTEyNiwgLTEyMCwgLTExNCwKCS0xMDgsIC0xMDIsIC05NiwgLTkxLCAtODUsIC04MCwgLTc0LCAtNjksIC02NCwgLTU5LCAtNTQsIC00OSwKCS00NCwgLTM5LCAtMzQsIC0yOSwgLTI1LCAtMjAsIC0xNSwgLTExLCAtNiwgLTIsIDMsIDcsIDEyLCAxNiwKCTIwLCAyNSwgMjksIDMzLCAzNywgNDIsIDQ2LCA1MCwgNTQsIDU5LCA2MywgNjcsIDcxLCA3NSwgNzksIDg0LAoJODgsIDkyLCA5NiwgMTAwLCAxMDQsIDEwOSwgMTEzLCAxMTcsIDEyMSwgMTI1LCAxMzAsIDEzNCwgMTM4LAoJMTQyLCAxNDYsIDE1MSwgMTU1LCAxNTksIDE2MywgMTY4LCAxNzIsIDE3NiwgMTgxLCAxODUsIDE4OSwKCTE5MywgMTk4LCAyMDIsIDIwNiwgMjExLCAyMTUsIDIxOSwgMjI0LCAyMjgsIDIzMiwgMjM3LCAyNDEsCgkyNDUsIDI1MCwgMjU0LCAyNTksIDI2MywgMjY3LCAyNzIsIDI3NiwgMjgxLCAyODUsIDI5MCwgMjk0LAoJMjk5LCAzMDMsIDMwNywgMzEyLCAzMTYsIDMyMSwgMzI1LCAzMzAsIDMzNCwgMzM5LCAzNDQsIDM0OCwKCTM1MywgMzU3LCAzNjIsIDM2NiwgMzcxLCAzNzYsIDM4MCwgMzg1LCAzOTAsIDM5NSwgMzk5LCA0MDQsCgk0MDksIDQxNCwgNDE5LCA0MjMsIDQyOCwgNDMzLCA0MzgsIDQ0MywgNDQ5LCA0NTQsIDQ1OSwgNDY0LAoJNDY5LCA0NzUsIDQ4MCwgNDg2LCA0OTEsIDQ5NywgNTAyLCA1MDgsIDUxNCwgNTIwLCA1MjYsIDUzMiwKCTUzOCwgNTQ0LCA1NTEsIDU1NywgNTY0LCA1NzEsIDU3OCwgNTg0LCA1OTIsIDU5OSwgNjA2LCA2MTQsCgk2MjEsIDYyOSwgNjM3LCA2NDUsIDY1NCwgNjYyLCA2NzEsIDY4MCwgNjg5LCA2OTgsIDcwOCwgNzE4LAoJNzI4LCA3MzgsIDc0OSwgNzU5LCA3NzAsIDc4MiwgNzkzLCA4MDUsIDgxOCwgODMwLCA4NDMsIDg1NiwKCTg3MCwgODgzLCA4OTgsIDkxMiwgOTI3LCA5NDMsIDk1OCwgOTc1LCA5OTEsIDEwMDgsIDEwMjYsIDEwNDQsCgkxMDYyLCAxMDgxLCAxMTAxLCAxMTIxLCAxMTQxLCAxMTYyLCAxMTg0LCAxMjA2LCAxMjI5LCAxMjUyLAoJMTI3NiwgMTMwMSwgMTMyNiwgMTM1MiwgMTM3OCwgMTQwNiwgMTQzNCwgMTQ2Mgp9OwoKLyogdGhlIG9yaWdpbmFsIExVVCB2YWx1ZXMgZnJvbSBBbGV4IHZhbiBLYWFtIDxkYXJrc2lkZUBjaGVsbG8ubmw+CiAgIChmb3IgdmlhIHJlZ2lzdGVyIHZhbHVlcyAxMi0yNDApOgp7LTUwLC00OSwtNDcsLTQ1LC00MywtNDEsLTM5LC0zOCwtMzcsLTM1LC0zNCwtMzMsLTMyLC0zMSwKLTMwLC0yOSwtMjgsLTI3LC0yNiwtMjUsLTI0LC0yNCwtMjMsLTIyLC0yMSwtMjAsLTIwLC0xOSwtMTgsLTE3LC0xNywtMTYsLTE1LAotMTUsLTE0LC0xNCwtMTMsLTEyLC0xMiwtMTEsLTExLC0xMCwtOSwtOSwtOCwtOCwtNywtNywtNiwtNiwtNSwtNSwtNCwtNCwtMywKLTMsLTIsLTIsLTEsLTEsMCwwLDEsMSwxLDMsMywzLDQsNCw0LDUsNSw1LDYsNiw3LDcsOCw4LDksOSw5LDEwLDEwLDExLDExLDEyLAoxMiwxMiwxMywxMywxMywxNCwxNCwxNSwxNSwxNiwxNiwxNiwxNywxNywxOCwxOCwxOSwxOSwyMCwyMCwyMSwyMSwyMSwyMiwyMiwKMjIsMjMsMjMsMjQsMjQsMjUsMjUsMjYsMjYsMjYsMjcsMjcsMjcsMjgsMjgsMjksMjksMzAsMzAsMzAsMzEsMzEsMzIsMzIsMzMsCjMzLDM0LDM0LDM1LDM1LDM1LDM2LDM2LDM3LDM3LDM4LDM4LDM5LDM5LDQwLDQwLDQxLDQxLDQyLDQyLDQzLDQzLDQ0LDQ0LDQ1LAo0NSw0Niw0Niw0Nyw0OCw0OCw0OSw0OSw1MCw1MSw1MSw1Miw1Miw1Myw1Myw1NCw1NSw1NSw1Niw1Nyw1Nyw1OCw1OSw1OSw2MCwKNjEsNjIsNjIsNjMsNjQsNjUsNjYsNjYsNjcsNjgsNjksNzAsNzEsNzIsNzMsNzQsNzUsNzYsNzcsNzgsNzksODAsODEsODMsODQsCjg1LDg2LDg4LDg5LDkxLDkyLDk0LDk2LDk3LDk5LDEwMSwxMDMsMTA1LDEwNywxMDksMTEwfTsKCgogSGVyZSdzIHRoZSByZXZlcnNlIExVVC4gIEkgZ290IGl0IGJ5IGRvaW5nIGEgNi10aCBvcmRlciBwb2x5IGZpdCAobmVlZGVkCiBhbiBleHRyYSB0ZXJtIGZvciBhIGdvb2QgZml0IHRvIHRoZXNlIGludmVyc2UgZGF0YSEpIGFuZCB0aGVuCiBzb2x2aW5nIGZvciBlYWNoIHRlbXAgdmFsdWUgZnJvbSAtNTAgdG8gMTEwICh0aGUgdXNlYWJsZSByYW5nZSBmb3IKIHRoaXMgY2hpcCkuICBIZXJlJ3MgdGhlIGZpdDoKIHZpYVJlZ1ZhbCA9IC0xLjE2MDM3MGUtMTAqdmFsXjYgKzMuMTkzNjkzZS0wOCp2YWxeNSAtIDEuNDY0NDQ3ZS0wNip2YWxeNAogLSAyLjUyNTQ1M2UtMDQqdmFsXjMgKyAxLjQyNDU5M2UtMDIqdmFsXjIgKyAyLjE0ODk0MWUrMDAqdmFsICs3LjI3NTgwOGUrMDEpCiBOb3RlIHRoYXQgbj0xNjE6ICovCnN0YXRpYyBjb25zdCB1OCB2aWFMVVRbXSA9CnsgMTIsIDEyLCAxMywgMTQsIDE0LCAxNSwgMTYsIDE2LCAxNywgMTgsIDE4LCAxOSwgMjAsIDIwLCAyMSwgMjIsIDIzLAoJMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNSwgMzYsIDM3LCAzOSwgNDAsCgk0MSwgNDMsIDQ1LCA0NiwgNDgsIDQ5LCA1MSwgNTMsIDU1LCA1NywgNTksIDYwLCA2MiwgNjQsIDY2LAoJNjksIDcxLCA3MywgNzUsIDc3LCA3OSwgODIsIDg0LCA4NiwgODgsIDkxLCA5MywgOTUsIDk4LCAxMDAsCgkxMDMsIDEwNSwgMTA3LCAxMTAsIDExMiwgMTE1LCAxMTcsIDExOSwgMTIyLCAxMjQsIDEyNiwgMTI5LAoJMTMxLCAxMzQsIDEzNiwgMTM4LCAxNDAsIDE0MywgMTQ1LCAxNDcsIDE1MCwgMTUyLCAxNTQsIDE1NiwKCTE1OCwgMTYwLCAxNjIsIDE2NCwgMTY2LCAxNjgsIDE3MCwgMTcyLCAxNzQsIDE3NiwgMTc4LCAxODAsCgkxODIsIDE4MywgMTg1LCAxODcsIDE4OCwgMTkwLCAxOTIsIDE5MywgMTk1LCAxOTYsIDE5OCwgMTk5LAoJMjAwLCAyMDIsIDIwMywgMjA1LCAyMDYsIDIwNywgMjA4LCAyMDksIDIxMCwgMjExLCAyMTIsIDIxMywKCTIxNCwgMjE1LCAyMTYsIDIxNywgMjE4LCAyMTksIDIyMCwgMjIxLCAyMjIsIDIyMiwgMjIzLCAyMjQsCgkyMjUsIDIyNiwgMjI2LCAyMjcsIDIyOCwgMjI4LCAyMjksIDIzMCwgMjMwLCAyMzEsIDIzMiwgMjMyLAoJMjMzLCAyMzMsIDIzNCwgMjM1LCAyMzUsIDIzNiwgMjM2LCAyMzcsIDIzNywgMjM4LCAyMzgsIDIzOSwKCTIzOSwgMjQwCn07CgovKiBDb252ZXJ0aW5nIHRlbXBzIHRvICg4LWJpdCkgaHlzdCBhbmQgb3ZlciByZWdpc3RlcnMKICAgTm8gaW50ZXJwb2xhdGlvbiBoZXJlLgogICBUaGUgKzUwIGlzIGJlY2F1c2UgdGhlIHRlbXBzIHN0YXJ0IGF0IC01MCAqLwpzdGF0aWMgaW5saW5lIHU4IFRFTVBfVE9fUkVHKGxvbmcgdmFsKQp7CglyZXR1cm4gdmlhTFVUW3ZhbCA8PSAtNTAwMDAgPyAwIDogdmFsID49IDExMDAwMCA/IDE2MCA6CgkJICAgICAgKHZhbCA8IDAgPyB2YWwgLSA1MDAgOiB2YWwgKyA1MDApIC8gMTAwMCArIDUwXTsKfQoKLyogZm9yIDgtYml0IHRlbXBlcmF0dXJlIGh5c3QgYW5kIG92ZXIgcmVnaXN0ZXJzICovCiNkZWZpbmUgVEVNUF9GUk9NX1JFRyh2YWwpCSgobG9uZyl0ZW1wTFVUW3ZhbF0gKiAxMDApCgovKiBmb3IgMTAtYml0IHRlbXBlcmF0dXJlIHJlYWRpbmdzICovCnN0YXRpYyBpbmxpbmUgbG9uZyBURU1QX0ZST01fUkVHMTAodTE2IHZhbCkKewoJdTE2IGVpZ2h0Qml0cyA9IHZhbCA+PiAyOwoJdTE2IHR3b0JpdHMgPSB2YWwgJiAzOwoKCS8qIG5vIGludGVycG9sYXRpb24gZm9yIHRoZXNlICovCglpZiAodHdvQml0cyA9PSAwIHx8IGVpZ2h0Qml0cyA9PSAyNTUpCgkJcmV0dXJuIFRFTVBfRlJPTV9SRUcoZWlnaHRCaXRzKTsKCgkvKiBkbyBzb21lIGxpbmVhciBpbnRlcnBvbGF0aW9uICovCglyZXR1cm4gKHRlbXBMVVRbZWlnaHRCaXRzXSAqICg0IC0gdHdvQml0cykgKwoJCXRlbXBMVVRbZWlnaHRCaXRzICsgMV0gKiB0d29CaXRzKSAqIDI1Owp9CgojZGVmaW5lIERJVl9GUk9NX1JFRyh2YWwpICgxIDw8ICh2YWwpKQojZGVmaW5lIERJVl9UT19SRUcodmFsKSAoKHZhbCk9PTg/MzoodmFsKT09ND8yOih2YWwpPT0xPzA6MSkKCi8qIEZvciB0aGUgVklBNjg2QSwgd2UgbmVlZCB0byBrZWVwIHNvbWUgZGF0YSBpbiBtZW1vcnkuCiAgIFRoZSBzdHJ1Y3R1cmUgaXMgZHluYW1pY2FsbHkgYWxsb2NhdGVkLCBhdCB0aGUgc2FtZSB0aW1lIHdoZW4gYSBuZXcKICAgdmlhNjg2YSBjbGllbnQgaXMgYWxsb2NhdGVkLiAqLwpzdHJ1Y3QgdmlhNjg2YV9kYXRhIHsKCXN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldjsKCXN0cnVjdCBzZW1hcGhvcmUgdXBkYXRlX2xvY2s7CgljaGFyIHZhbGlkOwkJLyogIT0wIGlmIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCgl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsJLyogSW4gamlmZmllcyAqLwoKCXU4IGluWzVdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KCXU4IGluX21heFs1XTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCgl1OCBpbl9taW5bNV07CQkvKiBSZWdpc3RlciB2YWx1ZSAqLwoJdTggZmFuWzJdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KCXU4IGZhbl9taW5bMl07CQkvKiBSZWdpc3RlciB2YWx1ZSAqLwoJdTE2IHRlbXBbM107CQkvKiBSZWdpc3RlciB2YWx1ZSAxMCBiaXQgKi8KCXU4IHRlbXBfb3ZlclszXTsJLyogUmVnaXN0ZXIgdmFsdWUgKi8KCXU4IHRlbXBfaHlzdFszXTsJLyogUmVnaXN0ZXIgdmFsdWUgKi8KCXU4IGZhbl9kaXZbMl07CQkvKiBSZWdpc3RlciBlbmNvZGluZywgc2hpZnRlZCByaWdodCAqLwoJdTE2IGFsYXJtczsJCS8qIFJlZ2lzdGVyIGVuY29kaW5nLCBjb21iaW5lZCAqLwp9OwoKc3RhdGljIHN0cnVjdCBwY2lfZGV2ICpzX2JyaWRnZTsJLyogcG9pbnRlciB0byB0aGUgKG9ubHkpIHZpYTY4NmEgKi8KCnN0YXRpYyBpbnQgdmlhNjg2YV9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKc3RhdGljIGludCB2aWE2ODZhX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CgpzdGF0aWMgaW5saW5lIGludCB2aWE2ODZhX3JlYWRfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKQp7CglyZXR1cm4gKGluYl9wKGNsaWVudC0+YWRkciArIHJlZykpOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgdmlhNjg2YV93cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsCgkJCQkgICAgICAgdTggdmFsdWUpCnsKCW91dGJfcCh2YWx1ZSwgY2xpZW50LT5hZGRyICsgcmVnKTsKfQoKc3RhdGljIHN0cnVjdCB2aWE2ODZhX2RhdGEgKnZpYTY4NmFfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwpzdGF0aWMgdm9pZCB2aWE2ODZhX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOwoKLyogZm9sbG93aW5nIGFyZSB0aGUgc3lzZnMgY2FsbGJhY2sgZnVuY3Rpb25zICovCgovKiA3IHZvbHRhZ2Ugc2Vuc29ycyAqLwpzdGF0aWMgc3NpemVfdCBzaG93X2luKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpIHsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSB2aWE2ODZhX3VwZGF0ZV9kZXZpY2UoZGV2KTsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgSU5fRlJPTV9SRUcoZGF0YS0+aW5bbnJdLCBucikpOwp9CgpzdGF0aWMgc3NpemVfdCBzaG93X2luX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKSB7CglzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gdmlhNjg2YV91cGRhdGVfZGV2aWNlKGRldik7CglyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIElOX0ZST01fUkVHKGRhdGEtPmluX21pbltucl0sIG5yKSk7Cn0KCnN0YXRpYyBzc2l6ZV90IHNob3dfaW5fbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpIHsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSB2aWE2ODZhX3VwZGF0ZV9kZXZpY2UoZGV2KTsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgSU5fRlJPTV9SRUcoZGF0YS0+aW5fbWF4W25yXSwgbnIpKTsKfQoKc3RhdGljIHNzaXplX3Qgc2V0X2luX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKCQlzaXplX3QgY291bnQsIGludCBucikgewoJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKCXVuc2lnbmVkIGxvbmcgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CgoJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOwoJZGF0YS0+aW5fbWluW25yXSA9IElOX1RPX1JFRyh2YWwsIG5yKTsKCXZpYTY4NmFfd3JpdGVfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19JTl9NSU4obnIpLAoJCQlkYXRhLT5pbl9taW5bbnJdKTsKCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CglyZXR1cm4gY291bnQ7Cn0Kc3RhdGljIHNzaXplX3Qgc2V0X2luX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKCQlzaXplX3QgY291bnQsIGludCBucikgewoJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKCXVuc2lnbmVkIGxvbmcgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CgoJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOwoJZGF0YS0+aW5fbWF4W25yXSA9IElOX1RPX1JFRyh2YWwsIG5yKTsKCXZpYTY4NmFfd3JpdGVfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19JTl9NQVgobnIpLAoJCQlkYXRhLT5pbl9tYXhbbnJdKTsKCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CglyZXR1cm4gY291bnQ7Cn0KI2RlZmluZSBzaG93X2luX29mZnNldChvZmZzZXQpCQkJCQlcCnN0YXRpYyBzc2l6ZV90IAkJCQkJCQlcCglzaG93X2luIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJCVwKewkJCQkJCQkJXAoJcmV0dXJuIHNob3dfaW4oZGV2LCBidWYsIG9mZnNldCk7CQkJXAp9CQkJCQkJCQlcCnN0YXRpYyBzc2l6ZV90IAkJCQkJCQlcCglzaG93X2luIyNvZmZzZXQjI19taW4gKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJXAp7CQkJCQkJCQlcCglyZXR1cm4gc2hvd19pbl9taW4oZGV2LCBidWYsIG9mZnNldCk7CQlcCn0JCQkJCQkJCVwKc3RhdGljIHNzaXplX3QgCQkJCQkJCVwKCXNob3dfaW4jI29mZnNldCMjX21heCAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQlcCnsJCQkJCQkJCVwKCXJldHVybiBzaG93X2luX21heChkZXYsIGJ1Ziwgb2Zmc2V0KTsJCVwKfQkJCQkJCQkJXApzdGF0aWMgc3NpemVfdCBzZXRfaW4jI29mZnNldCMjX21pbiAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgCVwKCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgCQkJXAp7CQkJCQkJCQlcCglyZXR1cm4gc2V0X2luX21pbihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCk7CQlcCn0JCQkJCQkJCVwKc3RhdGljIHNzaXplX3Qgc2V0X2luIyNvZmZzZXQjI19tYXggKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCVwKCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCQlcCnsJCQkJCQkJCVwKCXJldHVybiBzZXRfaW5fbWF4KGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0KTsJCVwKfQkJCQkJCQkJXApzdGF0aWMgREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCBzaG93X2luIyNvZmZzZXQsIE5VTEwpO1wKc3RhdGljIERFVklDRV9BVFRSKGluIyNvZmZzZXQjI19taW4sIFNfSVJVR08gfCBTX0lXVVNSLCAJXAoJCXNob3dfaW4jI29mZnNldCMjX21pbiwgc2V0X2luIyNvZmZzZXQjI19taW4pOwlcCnN0YXRpYyBERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfbWF4LCBTX0lSVUdPIHwgU19JV1VTUiwgCVwKCQlzaG93X2luIyNvZmZzZXQjI19tYXgsIHNldF9pbiMjb2Zmc2V0IyNfbWF4KTsKCnNob3dfaW5fb2Zmc2V0KDApOwpzaG93X2luX29mZnNldCgxKTsKc2hvd19pbl9vZmZzZXQoMik7CnNob3dfaW5fb2Zmc2V0KDMpOwpzaG93X2luX29mZnNldCg0KTsKCi8qIDMgdGVtcGVyYXR1cmVzICovCnN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKSB7CglzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gdmlhNjg2YV91cGRhdGVfZGV2aWNlKGRldik7CglyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIFRFTVBfRlJPTV9SRUcxMChkYXRhLT50ZW1wW25yXSkpOwp9CnN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9vdmVyKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpIHsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSB2aWE2ODZhX3VwZGF0ZV9kZXZpY2UoZGV2KTsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX292ZXJbbnJdKSk7Cn0Kc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikgewoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOwoJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfaHlzdFtucl0pKTsKfQpzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9vdmVyKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAoJCXNpemVfdCBjb3VudCwgaW50IG5yKSB7CglzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwoJaW50IHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CgoJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOwoJZGF0YS0+dGVtcF9vdmVyW25yXSA9IFRFTVBfVE9fUkVHKHZhbCk7Cgl2aWE2ODZhX3dyaXRlX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfVEVNUF9PVkVSW25yXSwKCQkJICAgIGRhdGEtPnRlbXBfb3Zlcltucl0pOwoJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCXJldHVybiBjb3VudDsKfQpzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9oeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAoJCXNpemVfdCBjb3VudCwgaW50IG5yKSB7CglzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwoJaW50IHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CgoJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOwoJZGF0YS0+dGVtcF9oeXN0W25yXSA9IFRFTVBfVE9fUkVHKHZhbCk7Cgl2aWE2ODZhX3dyaXRlX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfVEVNUF9IWVNUW25yXSwKCQkJICAgIGRhdGEtPnRlbXBfaHlzdFtucl0pOwoJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCXJldHVybiBjb3VudDsKfQojZGVmaW5lIHNob3dfdGVtcF9vZmZzZXQob2Zmc2V0KQkJCQkJXApzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJXAp7CQkJCQkJCQkJXAoJcmV0dXJuIHNob3dfdGVtcChkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJCVwKfQkJCQkJCQkJCVwKc3RhdGljIHNzaXplX3QJCQkJCQkJCVwKc2hvd190ZW1wXyMjb2Zmc2V0IyNfb3ZlciAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQkJXAp7CQkJCQkJCQkJXAoJcmV0dXJuIHNob3dfdGVtcF9vdmVyKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQlcCn0JCQkJCQkJCQlcCnN0YXRpYyBzc2l6ZV90CQkJCQkJCQlcCnNob3dfdGVtcF8jI29mZnNldCMjX2h5c3QgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJCVwKewkJCQkJCQkJCVwKCXJldHVybiBzaG93X3RlbXBfaHlzdChkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJXAp9CQkJCQkJCQkJXApzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF8jI29mZnNldCMjX292ZXIgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIAkJXAoJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSAJCQkJXAp7CQkJCQkJCQkJXAoJcmV0dXJuIHNldF90ZW1wX292ZXIoZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsJCVwKfQkJCQkJCQkJCVwKc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfIyNvZmZzZXQjI19oeXN0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCAJCVwKCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgCQkJCVwKewkJCQkJCQkJCVwKCXJldHVybiBzZXRfdGVtcF9oeXN0KGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7CQlcCn0JCQkJCQkJCQlcCnN0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wXyMjb2Zmc2V0LCBOVUxMKTtcCnN0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19tYXgsIFNfSVJVR08gfCBTX0lXVVNSLCAJCVwKCQlzaG93X3RlbXBfIyNvZmZzZXQjI19vdmVyLCBzZXRfdGVtcF8jI29mZnNldCMjX292ZXIpOwlcCnN0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19tYXhfaHlzdCwgU19JUlVHTyB8IFNfSVdVU1IsIAkJXAoJCXNob3dfdGVtcF8jI29mZnNldCMjX2h5c3QsIHNldF90ZW1wXyMjb2Zmc2V0IyNfaHlzdCk7CgpzaG93X3RlbXBfb2Zmc2V0KDEpOwpzaG93X3RlbXBfb2Zmc2V0KDIpOwpzaG93X3RlbXBfb2Zmc2V0KDMpOwoKLyogMiBGYW5zICovCnN0YXRpYyBzc2l6ZV90IHNob3dfZmFuKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpIHsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSB2aWE2ODZhX3VwZGF0ZV9kZXZpY2UoZGV2KTsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuW25yXSwKCQkJCURJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpICk7Cn0Kc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpIHsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSB2aWE2ODZhX3VwZGF0ZV9kZXZpY2UoZGV2KTsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLAoJCUZBTl9GUk9NX1JFRyhkYXRhLT5mYW5fbWluW25yXSwgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSkgKTsKfQpzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl9kaXYoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikgewoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOwoJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkgKTsKfQpzdGF0aWMgc3NpemVfdCBzZXRfZmFuX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKCQlzaXplX3QgY291bnQsIGludCBucikgewoJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOwoKCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCWRhdGEtPmZhbl9taW5bbnJdID0gRkFOX1RPX1JFRyh2YWwsIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpOwoJdmlhNjg2YV93cml0ZV92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX0ZBTl9NSU4obnIrMSksIGRhdGEtPmZhbl9taW5bbnJdKTsKCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CglyZXR1cm4gY291bnQ7Cn0Kc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9kaXYoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCgkJc2l6ZV90IGNvdW50LCBpbnQgbnIpIHsKCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CglzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CglpbnQgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKCWludCBvbGQ7CgoJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOwoJb2xkID0gdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfRkFORElWKTsKCWRhdGEtPmZhbl9kaXZbbnJdID0gRElWX1RPX1JFRyh2YWwpOwoJb2xkID0gKG9sZCAmIDB4MGYpIHwgKGRhdGEtPmZhbl9kaXZbMV0gPDwgNikgfCAoZGF0YS0+ZmFuX2RpdlswXSA8PCA0KTsKCXZpYTY4NmFfd3JpdGVfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19GQU5ESVYsIG9sZCk7Cgl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOwoJcmV0dXJuIGNvdW50Owp9CgojZGVmaW5lIHNob3dfZmFuX29mZnNldChvZmZzZXQpCQkJCQkJXApzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl8jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQlcCnsJCQkJCQkJCQlcCglyZXR1cm4gc2hvd19mYW4oZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCQlcCn0JCQkJCQkJCQlcCnN0YXRpYyBzc2l6ZV90IHNob3dfZmFuXyMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCVwKewkJCQkJCQkJCVwKCXJldHVybiBzaG93X2Zhbl9taW4oZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCVwKfQkJCQkJCQkJCVwKc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fIyNvZmZzZXQjI19kaXYgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJXAp7CQkJCQkJCQkJXAoJcmV0dXJuIHNob3dfZmFuX2RpdihkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJXAp9CQkJCQkJCQkJXApzdGF0aWMgc3NpemVfdCBzZXRfZmFuXyMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCAJCVwKCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSAJCQkJCVwKewkJCQkJCQkJCVwKCXJldHVybiBzZXRfZmFuX21pbihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOwkJXAp9CQkJCQkJCQkJXApzdGF0aWMgc3NpemVfdCBzZXRfZmFuXyMjb2Zmc2V0IyNfZGl2IChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCAJCVwKCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgCQkJCVwKewkJCQkJCQkJCVwKCXJldHVybiBzZXRfZmFuX2RpdihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOwkJXAp9CQkJCQkJCQkJXApzdGF0aWMgREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgc2hvd19mYW5fIyNvZmZzZXQsIE5VTEwpO1wKc3RhdGljIERFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwgCQlcCgkJc2hvd19mYW5fIyNvZmZzZXQjI19taW4sIHNldF9mYW5fIyNvZmZzZXQjI19taW4pOwlcCnN0YXRpYyBERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX2RpdiwgU19JUlVHTyB8IFNfSVdVU1IsIAkJXAoJCXNob3dfZmFuXyMjb2Zmc2V0IyNfZGl2LCBzZXRfZmFuXyMjb2Zmc2V0IyNfZGl2KTsKCnNob3dfZmFuX29mZnNldCgxKTsKc2hvd19mYW5fb2Zmc2V0KDIpOwoKLyogQWxhcm1zICovCnN0YXRpYyBzc2l6ZV90IHNob3dfYWxhcm1zKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikgewoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOwoJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRhdGEtPmFsYXJtcyk7Cn0Kc3RhdGljIERFVklDRV9BVFRSKGFsYXJtcywgU19JUlVHTywgc2hvd19hbGFybXMsIE5VTEwpOwoKLyogVGhlIGRyaXZlci4gSSBjaG9vc2UgdG8gdXNlIHR5cGUgaTJjX2RyaXZlciwgYXMgYXQgaXMgaWRlbnRpY2FsIHRvIGJvdGgKICAgc21idXNfZHJpdmVyIGFuZCBpc2FfZHJpdmVyLCBhbmQgY2xpZW50cyBjb3VsZCBiZSBvZiBlaXRoZXIga2luZCAqLwpzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgdmlhNjg2YV9kcml2ZXIgPSB7CgkuZHJpdmVyID0gewoJCS5uYW1lCT0gInZpYTY4NmEiLAoJfSwKCS5hdHRhY2hfYWRhcHRlcgk9IHZpYTY4NmFfZGV0ZWN0LAoJLmRldGFjaF9jbGllbnQJPSB2aWE2ODZhX2RldGFjaF9jbGllbnQsCn07CgoKLyogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgbW9kdWxlIGlzIGxvYWRlZCAqLwpzdGF0aWMgaW50IHZpYTY4NmFfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKewoJc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQ7CglzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhOwoJaW50IGVyciA9IDA7Cgljb25zdCBjaGFyIGNsaWVudF9uYW1lW10gPSAidmlhNjg2YSI7Cgl1MTYgdmFsOwoKCS8qIDgyMzEgcmVxdWlyZXMgbXVsdGlwbGUgb2YgMjU2LCB3ZSBlbmZvcmNlIHRoYXQgb24gNjg2IGFzIHdlbGwgKi8KCWlmIChmb3JjZV9hZGRyKSB7CgkJYWRkcmVzcyA9IGZvcmNlX2FkZHIgJiAweEZGMDA7CgkJZGV2X3dhcm4oJmFkYXB0ZXItPmRldiwgImZvcmNpbmcgSVNBIGFkZHJlc3MgMHglMDRYXG4iLAoJCQkgYWRkcmVzcyk7CgkJaWYgKFBDSUJJT1NfU1VDQ0VTU0ZVTCAhPQoJCSAgICBwY2lfd3JpdGVfY29uZmlnX3dvcmQoc19icmlkZ2UsIFZJQTY4NkFfQkFTRV9SRUcsIGFkZHJlc3MpKQoJCQlyZXR1cm4gLUVOT0RFVjsKCX0KCWlmIChQQ0lCSU9TX1NVQ0NFU1NGVUwgIT0KCSAgICBwY2lfcmVhZF9jb25maWdfd29yZChzX2JyaWRnZSwgVklBNjg2QV9FTkFCTEVfUkVHLCAmdmFsKSkKCQlyZXR1cm4gLUVOT0RFVjsKCWlmICghKHZhbCAmIDB4MDAwMSkpIHsKCQlpZiAoZm9yY2VfYWRkcikgewoJCQlkZXZfaW5mbygmYWRhcHRlci0+ZGV2LCAiZW5hYmxpbmcgc2Vuc29yc1xuIik7CgkJCWlmIChQQ0lCSU9TX1NVQ0NFU1NGVUwgIT0KCQkJICAgIHBjaV93cml0ZV9jb25maWdfd29yZChzX2JyaWRnZSwgVklBNjg2QV9FTkFCTEVfUkVHLAoJCQkJCQkgIHZhbCB8IDB4MDAwMSkpCgkJCQlyZXR1cm4gLUVOT0RFVjsKCQl9IGVsc2UgewoJCQlkZXZfd2FybigmYWRhcHRlci0+ZGV2LCAic2Vuc29ycyBkaXNhYmxlZCAtIGVuYWJsZSAiCgkJCQkgIndpdGggZm9yY2VfYWRkcj0weCV4XG4iLCBhZGRyZXNzKTsKCQkJcmV0dXJuIC1FTk9ERVY7CgkJfQoJfQoKCS8qIFJlc2VydmUgdGhlIElTQSByZWdpb24gKi8KCWlmICghcmVxdWVzdF9yZWdpb24oYWRkcmVzcywgVklBNjg2QV9FWFRFTlQsCgkJCSAgICB2aWE2ODZhX2RyaXZlci5kcml2ZXIubmFtZSkpIHsKCQlkZXZfZXJyKCZhZGFwdGVyLT5kZXYsICJyZWdpb24gMHgleCBhbHJlYWR5IGluIHVzZSFcbiIsCgkJCWFkZHJlc3MpOwoJCXJldHVybiAtRU5PREVWOwoJfQoKCWlmICghKGRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdmlhNjg2YV9kYXRhKSwgR0ZQX0tFUk5FTCkpKSB7CgkJZXJyID0gLUVOT01FTTsKCQlnb3RvIGV4aXRfcmVsZWFzZTsKCX0KCgluZXdfY2xpZW50ID0gJmRhdGEtPmNsaWVudDsKCWkyY19zZXRfY2xpZW50ZGF0YShuZXdfY2xpZW50LCBkYXRhKTsKCW5ld19jbGllbnQtPmFkZHIgPSBhZGRyZXNzOwoJbmV3X2NsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CgluZXdfY2xpZW50LT5kcml2ZXIgPSAmdmlhNjg2YV9kcml2ZXI7CgluZXdfY2xpZW50LT5mbGFncyA9IDA7CgoJLyogRmlsbCBpbiB0aGUgcmVtYWluaW5nIGNsaWVudCBmaWVsZHMgYW5kIHB1dCBpbnRvIHRoZSBnbG9iYWwgbGlzdCAqLwoJc3RybGNweShuZXdfY2xpZW50LT5uYW1lLCBjbGllbnRfbmFtZSwgSTJDX05BTUVfU0laRSk7CgoJZGF0YS0+dmFsaWQgPSAwOwoJaW5pdF9NVVRFWCgmZGF0YS0+dXBkYXRlX2xvY2spOwoJLyogVGVsbCB0aGUgSTJDIGxheWVyIGEgbmV3IGNsaWVudCBoYXMgYXJyaXZlZCAqLwoJaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChuZXdfY2xpZW50KSkpCgkJZ290byBleGl0X2ZyZWU7CgoJLyogSW5pdGlhbGl6ZSB0aGUgVklBNjg2QSBjaGlwICovCgl2aWE2ODZhX2luaXRfY2xpZW50KG5ld19jbGllbnQpOwoKCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCglkYXRhLT5jbGFzc19kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJm5ld19jbGllbnQtPmRldik7CglpZiAoSVNfRVJSKGRhdGEtPmNsYXNzX2RldikpIHsKCQllcnIgPSBQVFJfRVJSKGRhdGEtPmNsYXNzX2Rldik7CgkJZ290byBleGl0X2RldGFjaDsKCX0KCglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMF9pbnB1dCk7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMV9pbnB1dCk7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMl9pbnB1dCk7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luM19pbnB1dCk7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNF9pbnB1dCk7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMF9taW4pOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjFfbWluKTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4yX21pbik7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luM19taW4pOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjRfbWluKTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX21heCk7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMV9tYXgpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjJfbWF4KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4zX21heCk7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNF9tYXgpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9pbnB1dCk7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX2lucHV0KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDNfaW5wdXQpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9tYXgpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9tYXgpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wM19tYXgpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9tYXhfaHlzdCk7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX21heF9oeXN0KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDNfbWF4X2h5c3QpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4xX2lucHV0KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMl9pbnB1dCk7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjFfbWluKTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMl9taW4pOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4xX2Rpdik7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjJfZGl2KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYWxhcm1zKTsKCglyZXR1cm4gMDsKCmV4aXRfZGV0YWNoOgoJaTJjX2RldGFjaF9jbGllbnQobmV3X2NsaWVudCk7CmV4aXRfZnJlZToKCWtmcmVlKGRhdGEpOwpleGl0X3JlbGVhc2U6CglyZWxlYXNlX3JlZ2lvbihhZGRyZXNzLCBWSUE2ODZBX0VYVEVOVCk7CglyZXR1cm4gZXJyOwp9CgpzdGF0aWMgaW50IHZpYTY4NmFfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQp7CglzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CglpbnQgZXJyOwoKCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmNsYXNzX2Rldik7CgoJaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkKCQlyZXR1cm4gZXJyOwoKCXJlbGVhc2VfcmVnaW9uKGNsaWVudC0+YWRkciwgVklBNjg2QV9FWFRFTlQpOwoJa2ZyZWUoZGF0YSk7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkIHZpYTY4NmFfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKewoJdTggcmVnOwoKCS8qIFN0YXJ0IG1vbml0b3JpbmcgKi8KCXJlZyA9IHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX0NPTkZJRyk7Cgl2aWE2ODZhX3dyaXRlX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfQ09ORklHLCAocmVnfDB4MDEpJjB4N0YpOwoKCS8qIENvbmZpZ3VyZSB0ZW1wIGludGVycnVwdCBtb2RlIGZvciBjb250aW51b3VzLWludGVycnVwdCBvcGVyYXRpb24gKi8KCXZpYTY4NmFfd3JpdGVfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19URU1QX01PREUsCgkJCSAgICB2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19URU1QX01PREUpICYKCQkJICAgICEoVklBNjg2QV9URU1QX01PREVfTUFTSyB8IFZJQTY4NkFfVEVNUF9NT0RFX0NPTlRJTlVPVVMpKTsKfQoKc3RhdGljIHN0cnVjdCB2aWE2ODZhX2RhdGEgKnZpYTY4NmFfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCnsKCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CglzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CglpbnQgaTsKCglkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CgoJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgSFogKyBIWiAvIDIpCgkgICAgfHwgIWRhdGEtPnZhbGlkKSB7CgkJZm9yIChpID0gMDsgaSA8PSA0OyBpKyspIHsKCQkJZGF0YS0+aW5baV0gPQoJCQkgICAgdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfSU4oaSkpOwoJCQlkYXRhLT5pbl9taW5baV0gPSB2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LAoJCQkJCQkJICAgICBWSUE2ODZBX1JFR19JTl9NSU4KCQkJCQkJCSAgICAgKGkpKTsKCQkJZGF0YS0+aW5fbWF4W2ldID0KCQkJICAgIHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX0lOX01BWChpKSk7CgkJfQoJCWZvciAoaSA9IDE7IGkgPD0gMjsgaSsrKSB7CgkJCWRhdGEtPmZhbltpIC0gMV0gPQoJCQkgICAgdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfRkFOKGkpKTsKCQkJZGF0YS0+ZmFuX21pbltpIC0gMV0gPSB2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LAoJCQkJCQkgICAgIFZJQTY4NkFfUkVHX0ZBTl9NSU4oaSkpOwoJCX0KCQlmb3IgKGkgPSAwOyBpIDw9IDI7IGkrKykgewoJCQlkYXRhLT50ZW1wW2ldID0gdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwKCQkJCQkJIFZJQTY4NkFfUkVHX1RFTVBbaV0pIDw8IDI7CgkJCWRhdGEtPnRlbXBfb3ZlcltpXSA9CgkJCSAgICB2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LAoJCQkJCSAgICAgICBWSUE2ODZBX1JFR19URU1QX09WRVJbaV0pOwoJCQlkYXRhLT50ZW1wX2h5c3RbaV0gPQoJCQkgICAgdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwKCQkJCQkgICAgICAgVklBNjg2QV9SRUdfVEVNUF9IWVNUW2ldKTsKCQl9CgkJLyogYWRkIGluIGxvd2VyIDIgYml0cwoJCSAgIHRlbXAxIHVzZXMgYml0cyA3LTYgb2YgVklBNjg2QV9SRUdfVEVNUF9MT1cxCgkJICAgdGVtcDIgdXNlcyBiaXRzIDUtNCBvZiBWSUE2ODZBX1JFR19URU1QX0xPVzIzCgkJICAgdGVtcDMgdXNlcyBiaXRzIDctNiBvZiBWSUE2ODZBX1JFR19URU1QX0xPVzIzCgkJICovCgkJZGF0YS0+dGVtcFswXSB8PSAodmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwKCQkJCQkJICAgICBWSUE2ODZBX1JFR19URU1QX0xPVzEpCgkJCQkgICYgMHhjMCkgPj4gNjsKCQlkYXRhLT50ZW1wWzFdIHw9CgkJICAgICh2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19URU1QX0xPVzIzKSAmCgkJICAgICAweDMwKSA+PiA0OwoJCWRhdGEtPnRlbXBbMl0gfD0KCQkgICAgKHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX1RFTVBfTE9XMjMpICYKCQkgICAgIDB4YzApID4+IDY7CgoJCWkgPSB2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19GQU5ESVYpOwoJCWRhdGEtPmZhbl9kaXZbMF0gPSAoaSA+PiA0KSAmIDB4MDM7CgkJZGF0YS0+ZmFuX2RpdlsxXSA9IGkgPj4gNjsKCQlkYXRhLT5hbGFybXMgPQoJCSAgICB2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LAoJCQkJICAgICAgIFZJQTY4NkFfUkVHX0FMQVJNMSkgfAoJCSAgICAodmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfQUxBUk0yKSA8PCA4KTsKCQlkYXRhLT5sYXN0X3VwZGF0ZWQgPSBqaWZmaWVzOwoJCWRhdGEtPnZhbGlkID0gMTsKCX0KCgl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOwoKCXJldHVybiBkYXRhOwp9CgpzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgdmlhNjg2YV9wY2lfaWRzW10gPSB7Cgl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9WSUEsIFBDSV9ERVZJQ0VfSURfVklBXzgyQzY4Nl80KSB9LAoJeyAwLCB9Cn07CgpNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgdmlhNjg2YV9wY2lfaWRzKTsKCnN0YXRpYyBpbnQgX19kZXZpbml0IHZpYTY4NmFfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsCgkJCQkgICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQp7Cgl1MTYgdmFsOwoKCWlmIChQQ0lCSU9TX1NVQ0NFU1NGVUwgIT0KCSAgICBwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFZJQTY4NkFfQkFTRV9SRUcsICZ2YWwpKQoJCXJldHVybiAtRU5PREVWOwoKCWFkZHJlc3MgPSB2YWwgJiB+KFZJQTY4NkFfRVhURU5UIC0gMSk7CglpZiAoYWRkcmVzcyA9PSAwICYmIGZvcmNlX2FkZHIgPT0gMCkgewoJCWRldl9lcnIoJmRldi0+ZGV2LCAiYmFzZSBhZGRyZXNzIG5vdCBzZXQgLSB1cGdyYWRlIEJJT1MgIgoJCQkib3IgdXNlIGZvcmNlX2FkZHI9MHhhZGRyXG4iKTsKCQlyZXR1cm4gLUVOT0RFVjsKCX0KCglzX2JyaWRnZSA9IHBjaV9kZXZfZ2V0KGRldik7CglpZiAoaTJjX2lzYV9hZGRfZHJpdmVyKCZ2aWE2ODZhX2RyaXZlcikpIHsKCQlwY2lfZGV2X3B1dChzX2JyaWRnZSk7CgkJc19icmlkZ2UgPSBOVUxMOwoJfQoKCS8qIEFsd2F5cyByZXR1cm4gZmFpbHVyZSBoZXJlLiAgVGhpcyBpcyB0byBhbGxvdyBvdGhlciBkcml2ZXJzIHRvIGJpbmQKCSAqIHRvIHRoaXMgcGNpIGRldmljZS4gIFdlIGRvbid0IHJlYWxseSB3YW50IHRvIGhhdmUgY29udHJvbCBvdmVyIHRoZQoJICogcGNpIGRldmljZSwgd2Ugb25seSB3YW50ZWQgdG8gcmVhZCBhcyBmZXcgcmVnaXN0ZXIgdmFsdWVzIGZyb20gaXQuCgkgKi8KCXJldHVybiAtRU5PREVWOwp9CgpzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgdmlhNjg2YV9wY2lfZHJpdmVyID0gewoJLm5hbWUJCT0gInZpYTY4NmEiLAoJLmlkX3RhYmxlCT0gdmlhNjg2YV9wY2lfaWRzLAoJLnByb2JlCQk9IHZpYTY4NmFfcGNpX3Byb2JlLAp9OwoKc3RhdGljIGludCBfX2luaXQgc21fdmlhNjg2YV9pbml0KHZvaWQpCnsKCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZ2aWE2ODZhX3BjaV9kcml2ZXIpOwp9CgpzdGF0aWMgdm9pZCBfX2V4aXQgc21fdmlhNjg2YV9leGl0KHZvaWQpCnsKCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmdmlhNjg2YV9wY2lfZHJpdmVyKTsKCWlmIChzX2JyaWRnZSAhPSBOVUxMKSB7CgkJaTJjX2lzYV9kZWxfZHJpdmVyKCZ2aWE2ODZhX2RyaXZlcik7CgkJcGNpX2Rldl9wdXQoc19icmlkZ2UpOwoJCXNfYnJpZGdlID0gTlVMTDsKCX0KfQoKTU9EVUxFX0FVVEhPUigiS3n2c3RpIE3kbGtraSA8a21hbGtraUBjYy5odXQuZmk+LCAiCgkgICAgICAiTWFyayBTdHVkZWJha2VyIDxtZHN4eXoxMjNAeWFob28uY29tPiAiCgkgICAgICAiYW5kIEJvYiBEb3VnaGVydHkgPGJvYmRAc3RhbmZvcmQuZWR1PiIpOwpNT0RVTEVfREVTQ1JJUFRJT04oIlZJQSA2ODZBIFNlbnNvciBkZXZpY2UiKTsKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwoKbW9kdWxlX2luaXQoc21fdmlhNjg2YV9pbml0KTsKbW9kdWxlX2V4aXQoc21fdmlhNjg2YV9leGl0KTsK