LyoKICAgIHZpYTY4NmEuYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMKICAgICAgICAgICAgICAgIGZvciBoYXJkd2FyZSBtb25pdG9yaW5nCiAgICAgICAgICAgICAgICAKICAgIENvcHlyaWdodCAoYykgMTk5OCAtIDIwMDIgIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4sCiAgICAgICAgICAgICAgICAgICAgICAgIEt59nN0aSBN5Gxra2kgPGttYWxra2lAY2MuaHV0LmZpPiwKCQkJTWFyayBTdHVkZWJha2VyIDxtZHN4eXoxMjNAeWFob28uY29tPiwKCQkJYW5kIEJvYiBEb3VnaGVydHkgPGJvYmRAc3RhbmZvcmQuZWR1PgogICAgKFNvbWUgY29udmVyc2lvbi1mYWN0b3IgZGF0YSB3ZXJlIGNvbnRyaWJ1dGVkIGJ5IEpvbmF0aGFuIFRlaCBTb29uIFlldyAKICAgIDxqLnRlaEBpbmFtZS5jb20+IGFuZCBBbGV4IHZhbiBLYWFtIDxkYXJrc2lkZUBjaGVsbG8ubmw+LikKCiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKi8KCi8qCiAgICBTdXBwb3J0cyB0aGUgVmlhIFZUODJDNjg2QSwgVlQ4MkM2ODZCIHNvdXRoIGJyaWRnZXMuCiAgICBSZXBvcnRzIGFsbCBhcyBhIDY4NkEuCiAgICBXYXJuaW5nIC0gb25seSBzdXBwb3J0cyBhIHNpbmdsZSBkZXZpY2UuCiovCgojaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgojaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgojaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8YXNtL2lvLmg+CgoKLyogSWYgZm9yY2VfYWRkciBpcyBzZXQgdG8gYW55dGhpbmcgZGlmZmVyZW50IGZyb20gMCwgd2UgZm9yY2libHkgZW5hYmxlCiAgIHRoZSBkZXZpY2UgYXQgdGhlIGdpdmVuIGFkZHJlc3MuICovCnN0YXRpYyB1bnNpZ25lZCBzaG9ydCBmb3JjZV9hZGRyID0gMDsKbW9kdWxlX3BhcmFtKGZvcmNlX2FkZHIsIHVzaG9ydCwgMCk7Ck1PRFVMRV9QQVJNX0RFU0MoZm9yY2VfYWRkciwKCQkgIkluaXRpYWxpemUgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgc2Vuc29ycyIpOwoKLyogQWRkcmVzc2VzIHRvIHNjYW4uCiAgIE5vdGUgdGhhdCB3ZSBjYW4ndCBkZXRlcm1pbmUgdGhlIElTQSBhZGRyZXNzIHVudGlsIHdlIGhhdmUgaW5pdGlhbGl6ZWQKICAgb3VyIG1vZHVsZSAqLwpzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyBJMkNfQ0xJRU5UX0VORCB9OwpzdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9pc2FbXSA9IHsgMHgwMDAwLCBJMkNfQ0xJRU5UX0lTQV9FTkQgfTsKCi8qIEluc21vZCBwYXJhbWV0ZXJzICovClNFTlNPUlNfSU5TTU9EXzEodmlhNjg2YSk7CgovKgogICBUaGUgVmlhIDY4NmEgc291dGhicmlkZ2UgaGFzIGEgTE03OC1saWtlIGNoaXAgaW50ZWdyYXRlZCBvbiB0aGUgc2FtZSBJQy4KICAgVGhpcyBkcml2ZXIgaXMgYSBjdXN0b21pemVkIGNvcHkgb2YgbG03OC5jCiovCgovKiBNYW55IFZJQTY4NkEgY29uc3RhbnRzIHNwZWNpZmllZCBiZWxvdyAqLwoKLyogTGVuZ3RoIG9mIElTQSBhZGRyZXNzIHNlZ21lbnQgKi8KI2RlZmluZSBWSUE2ODZBX0VYVEVOVCAweDgwCiNkZWZpbmUgVklBNjg2QV9CQVNFX1JFRyAweDcwCiNkZWZpbmUgVklBNjg2QV9FTkFCTEVfUkVHIDB4NzQKCi8qIFRoZSBWSUE2ODZBIHJlZ2lzdGVycyAqLwovKiBpbnMgbnVtYmVyZWQgMC00ICovCiNkZWZpbmUgVklBNjg2QV9SRUdfSU5fTUFYKG5yKSAoMHgyYiArICgobnIpICogMikpCiNkZWZpbmUgVklBNjg2QV9SRUdfSU5fTUlOKG5yKSAoMHgyYyArICgobnIpICogMikpCiNkZWZpbmUgVklBNjg2QV9SRUdfSU4obnIpICAgICAoMHgyMiArIChucikpCgovKiBmYW5zIG51bWJlcmVkIDEtMiAqLwojZGVmaW5lIFZJQTY4NkFfUkVHX0ZBTl9NSU4obnIpICgweDNhICsgKG5yKSkKI2RlZmluZSBWSUE2ODZBX1JFR19GQU4obnIpICAgICAoMHgyOCArIChucikpCgovKiB0aGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgYXMgc3BlY2VkIGJ5IFZJQTogKi8Kc3RhdGljIGNvbnN0IHU4IHJlZ3RlbXBbXSA9IHsgMHgyMCwgMHgyMSwgMHgxZiB9OwpzdGF0aWMgY29uc3QgdTggcmVnb3ZlcltdID0geyAweDM5LCAweDNkLCAweDFkIH07CnN0YXRpYyBjb25zdCB1OCByZWdoeXN0W10gPSB7IDB4M2EsIDB4M2UsIDB4MWUgfTsKCi8qIHRlbXBzIG51bWJlcmVkIDEtMyAqLwojZGVmaW5lIFZJQTY4NkFfUkVHX1RFTVAobnIpCQkocmVndGVtcFtucl0pCiNkZWZpbmUgVklBNjg2QV9SRUdfVEVNUF9PVkVSKG5yKQkocmVnb3Zlcltucl0pCiNkZWZpbmUgVklBNjg2QV9SRUdfVEVNUF9IWVNUKG5yKQkocmVnaHlzdFtucl0pCiNkZWZpbmUgVklBNjg2QV9SRUdfVEVNUF9MT1cxCTB4NGIJLy8gYml0cyA3LTYKI2RlZmluZSBWSUE2ODZBX1JFR19URU1QX0xPVzIzCTB4NDkJLy8gMiA9IGJpdHMgNS00LCAzID0gYml0cyA3LTYKCiNkZWZpbmUgVklBNjg2QV9SRUdfQUxBUk0xIDB4NDEKI2RlZmluZSBWSUE2ODZBX1JFR19BTEFSTTIgMHg0MgojZGVmaW5lIFZJQTY4NkFfUkVHX0ZBTkRJViAweDQ3CiNkZWZpbmUgVklBNjg2QV9SRUdfQ09ORklHIDB4NDAKLyogVGhlIGZvbGxvd2luZyByZWdpc3RlciBzZXRzIHRlbXAgaW50ZXJydXB0IG1vZGUgKGJpdHMgMS0wIGZvciB0ZW1wMSwgCiAzLTIgZm9yIHRlbXAyLCA1LTQgZm9yIHRlbXAzKS4gIE1vZGVzIGFyZToKICAgIDAwIGludGVycnVwdCBzdGF5cyBhcyBsb25nIGFzIHZhbHVlIGlzIG91dC1vZi1yYW5nZQogICAgMDEgaW50ZXJydXB0IGlzIGNsZWFyZWQgb25jZSByZWdpc3RlciBpcyByZWFkIChkZWZhdWx0KQogICAgMTAgY29tcGFyYXRvciBtb2RlLSBsaWtlIDAwLCBidXQgaWdub3JlcyBoeXN0ZXJlc2lzCiAgICAxMSBzYW1lIGFzIDAwICovCiNkZWZpbmUgVklBNjg2QV9SRUdfVEVNUF9NT0RFIDB4NGIKLyogV2UnbGwganVzdCBhc3N1bWUgdGhhdCB5b3Ugd2FudCB0byBzZXQgYWxsIDMgc2ltdWx0YW5lb3VzbHk6ICovCiNkZWZpbmUgVklBNjg2QV9URU1QX01PREVfTUFTSyAweDNGCiNkZWZpbmUgVklBNjg2QV9URU1QX01PREVfQ09OVElOVU9VUyAoMHgwMCkKCi8qIENvbnZlcnNpb25zLiBMaW1pdCBjaGVja2luZyBpcyBvbmx5IGRvbmUgb24gdGhlIFRPX1JFRwogICB2YXJpYW50cy4gCgoqKioqKioqKiogVk9MVEFHRSBDT05WRVJTSU9OUyAoQm9iIERvdWdoZXJ0eSkgKioqKioqKioKIEZyb20gSFdNb24uY3BwIChDb3B5cmlnaHQgMTk5OC0yMDAwIEpvbmF0aGFuIFRlaCBTb29uIFlldyk6CiB2b2x0YWdlZmFjdG9yWzBdPTEuMjUvMjYyODsgKDI2MjgvMS4yNT0yMTAyLjQpICAgLy8gVmNjcAogdm9sdGFnZWZhY3RvclsxXT0xLjI1LzI2Mjg7ICgyNjI4LzEuMjU9MjEwMi40KSAgIC8vICsyLjVWCiB2b2x0YWdlZmFjdG9yWzJdPTEuNjcvMjYyODsgKDI2MjgvMS42Nz0xNTczLjcpICAgLy8gKzMuM1YKIHZvbHRhZ2VmYWN0b3JbM109Mi42LzI2Mjg7ICAoMjYyOC8yLjYwPTEwMTAuOCkgICAvLyArNVYKIHZvbHRhZ2VmYWN0b3JbNF09Ni4zLzI2Mjg7ICAoMjYyOC82LjMwPTQxNy4xNCkgICAvLyArMTJWCiBpbltpXT0oZGF0YVtpKzJdKjI1LjArMTMzKSp2b2x0YWdlZmFjdG9yW2ldOwogVGhhdCBpczoKIHZvbHRzID0gKDI1KnJlZ1ZhbCsxMzMpKmZhY3RvcgogcmVnVmFsID0gKHZvbHRzL2ZhY3Rvci0xMzMpLzI1CiAoVGhlc2UgY29udmVyc2lvbnMgd2VyZSBjb250cmlidXRlZCBieSBKb25hdGhhbiBUZWggU29vbiBZZXcgCiA8ai50ZWhAaW5hbWUuY29tPikgKi8Kc3RhdGljIGlubGluZSB1OCBJTl9UT19SRUcobG9uZyB2YWwsIGludCBpbk51bSkKewoJLyogVG8gYXZvaWQgZmxvYXRpbmcgcG9pbnQsIHdlIG11bHRpcGx5IGNvbnN0YW50cyBieSAxMCAoMTAwIGZvciArMTJWKS4KCSAgIFJvdW5kaW5nIGlzIGRvbmUgKDEyMDUwMCBpcyBhY3R1YWxseSAxMzMwMDAgLSAxMjUwMCkuCgkgICBSZW1lbWJlciB0aGF0IHZhbCBpcyBleHByZXNzZWQgaW4gMC4wMDFWL2JpdCwgd2hpY2ggaXMgd2h5IHdlIGRpdmlkZQoJICAgYnkgYW4gYWRkaXRpb25hbCAxMDAwMCAoMTAwMDAwIGZvciArMTJWKTogMTAwMCBmb3IgdmFsIGFuZCAxMCAoMTAwKQoJICAgZm9yIHRoZSBjb25zdGFudHMuICovCglpZiAoaW5OdW0gPD0gMSkKCQlyZXR1cm4gKHU4KQoJCSAgICBTRU5TT1JTX0xJTUlUKCh2YWwgKiAyMTAyNCAtIDEyMDUwMDApIC8gMjUwMDAwLCAwLCAyNTUpOwoJZWxzZSBpZiAoaW5OdW0gPT0gMikKCQlyZXR1cm4gKHU4KQoJCSAgICBTRU5TT1JTX0xJTUlUKCh2YWwgKiAxNTczNyAtIDEyMDUwMDApIC8gMjUwMDAwLCAwLCAyNTUpOwoJZWxzZSBpZiAoaW5OdW0gPT0gMykKCQlyZXR1cm4gKHU4KQoJCSAgICBTRU5TT1JTX0xJTUlUKCh2YWwgKiAxMDEwOCAtIDEyMDUwMDApIC8gMjUwMDAwLCAwLCAyNTUpOwoJZWxzZQoJCXJldHVybiAodTgpCgkJICAgIFNFTlNPUlNfTElNSVQoKHZhbCAqIDQxNzE0IC0gMTIwNTAwMDApIC8gMjUwMDAwMCwgMCwgMjU1KTsKfQoKc3RhdGljIGlubGluZSBsb25nIElOX0ZST01fUkVHKHU4IHZhbCwgaW50IGluTnVtKQp7CgkvKiBUbyBhdm9pZCBmbG9hdGluZyBwb2ludCwgd2UgbXVsdGlwbHkgY29uc3RhbnRzIGJ5IDEwICgxMDAgZm9yICsxMlYpLgoJICAgV2UgYWxzbyBtdWx0aXBseSB0aGVtIGJ5IDEwMDAgYmVjYXVzZSB3ZSB3YW50IDAuMDAxVi9iaXQgZm9yIHRoZQoJICAgb3V0cHV0IHZhbHVlLiBSb3VuZGluZyBpcyBkb25lLiAqLwoJaWYgKGluTnVtIDw9IDEpCgkJcmV0dXJuIChsb25nKSAoKDI1MDAwMCAqIHZhbCArIDEzMzAwMDAgKyAyMTAyNCAvIDIpIC8gMjEwMjQpOwoJZWxzZSBpZiAoaW5OdW0gPT0gMikKCQlyZXR1cm4gKGxvbmcpICgoMjUwMDAwICogdmFsICsgMTMzMDAwMCArIDE1NzM3IC8gMikgLyAxNTczNyk7CgllbHNlIGlmIChpbk51bSA9PSAzKQoJCXJldHVybiAobG9uZykgKCgyNTAwMDAgKiB2YWwgKyAxMzMwMDAwICsgMTAxMDggLyAyKSAvIDEwMTA4KTsKCWVsc2UKCQlyZXR1cm4gKGxvbmcpICgoMjUwMDAwMCAqIHZhbCArIDEzMzAwMDAwICsgNDE3MTQgLyAyKSAvIDQxNzE0KTsKfQoKLyoqKioqKioqKiBGQU4gUlBNIENPTlZFUlNJT05TICoqKioqKioqLwovKiBIaWdoZXIgcmVnaXN0ZXIgdmFsdWVzID0gc2xvd2VyIGZhbnMgKHRoZSBmYW4ncyBzdHJvYmUgZ2F0ZXMgYSBjb3VudGVyKS4KIEJ1dCB0aGlzIGNoaXAgc2F0dXJhdGVzIGJhY2sgYXQgMCwgbm90IGF0IDI1NSBsaWtlIGFsbCB0aGUgb3RoZXIgY2hpcHMuCiBTbywgMCBtZWFucyAwIFJQTSAqLwpzdGF0aWMgaW5saW5lIHU4IEZBTl9UT19SRUcobG9uZyBycG0sIGludCBkaXYpCnsKCWlmIChycG0gPT0gMCkKCQlyZXR1cm4gMDsKCXJwbSA9IFNFTlNPUlNfTElNSVQocnBtLCAxLCAxMDAwMDAwKTsKCXJldHVybiBTRU5TT1JTX0xJTUlUKCgxMzUwMDAwICsgcnBtICogZGl2IC8gMikgLyAocnBtICogZGl2KSwgMSwgMjU1KTsKfQoKI2RlZmluZSBGQU5fRlJPTV9SRUcodmFsLGRpdikgKCh2YWwpPT0wPzA6KHZhbCk9PTI1NT8wOjEzNTAwMDAvKCh2YWwpKihkaXYpKSkKCi8qKioqKioqKiBURU1QIENPTlZFUlNJT05TIChCb2IgRG91Z2hlcnR5KSAqKioqKioqKiovCi8qIGxpbmVhciBmaXRzIGZyb20gSFdNb24uY3BwIChDb3B5cmlnaHQgMTk5OC0yMDAwIEpvbmF0aGFuIFRlaCBTb29uIFlldykKICAgICAgaWYodGVtcDwxNjkpCiAgICAgICAgICAgICAgcmV0dXJuIGRvdWJsZSh0ZW1wKSowLjQyNy0zMi4wODsKICAgICAgZWxzZSBpZih0ZW1wPj0xNjkgJiYgdGVtcDw9MjAyKQogICAgICAgICAgICAgIHJldHVybiBkb3VibGUodGVtcCkqMC41ODItNTguMTY7CiAgICAgIGVsc2UKICAgICAgICAgICAgICByZXR1cm4gZG91YmxlKHRlbXApKjAuOTI0LTEyNy4zMzsKCiBBIGZpZnRoLW9yZGVyIHBvbHlub21pYWwgZml0cyB0aGUgdW5vZmZpY2lhbCBkYXRhIChwcm92aWRlZCBieSBBbGV4IHZhbiAKIEthYW0gPGRhcmtzaWRlQGNoZWxsby5ubD4pIGEgYml0IGJldHRlci4gIEl0IGFsc28gZ2l2ZSBtb3JlIHJlYXNvbmFibGUgCiBudW1iZXJzIG9uIG15IG1hY2hpbmUgKGllLiB0aGV5IGFncmVlIHdpdGggd2hhdCBteSBCSU9TIHRlbGxzIG1lKS4gIAogSGVyZSdzIHRoZSBmaWZ0aC1vcmRlciBmaXQgdG8gdGhlIDgtYml0IGRhdGE6CiB0ZW1wID0gMS42MjUwOTNlLTEwKnZhbF41IC0gMS4wMDE2MzJlLTA3KnZhbF40ICsgMi40NTc2NTNlLTA1KnZhbF4zIC0gCiAgICAgICAgMi45Njc2MTllLTAzKnZhbF4yICsgMi4xNzUxNDRlLTAxKnZhbCAtIDcuMDkwMDY3ZSswLgoKICgyMDAwLTEwLTI1LSBSRkQ6IHRoYW5rcyB0byBVd2UgQW5kZXJzZW4gPHVhbmRlcnNlbkBtYXlhaC5jb20+IGZvciAKIGZpbmRpbmcgbXkgdHlwb3MgaW4gdGhpcyBmb3JtdWxhISkKCiBBbGFzLCBub25lIG9mIHRoZSBlbGVnYW50IGZ1bmN0aW9uLWZpdCBzb2x1dGlvbnMgd2lsbCB3b3JrIGJlY2F1c2Ugd2UgCiBhcmVuJ3QgYWxsb3dlZCB0byB1c2UgZmxvYXRpbmcgcG9pbnQgaW4gdGhlIGtlcm5lbCBhbmQgZG9pbmcgaXQgd2l0aCAKIGludGVnZXJzIGRvZXNuJ3QgcnBvdmlkZSBlbm91Z2ggcHJlY2lzaW9uLiAgU28gd2UnbGwgZG8gYm9yaW5nIG9sZCAKIGxvb2stdXAgdGFibGUgc3R1ZmYuICBUaGUgdW5vZmZpY2lhbCBkYXRhIChzZWUgYmVsb3cpIGhhdmUgZWZmZWN0aXZlbHkgCiA3LWJpdCByZXNvbHV0aW9uICh0aGV5IGFyZSByb3VuZGVkIHRvIHRoZSBuZWFyZXN0IGRlZ3JlZSkuICBJJ20gYXNzdW1pbmcgCiB0aGF0IHRoZSB0cmFuc2ZlciBmdW5jdGlvbiBvZiB0aGUgZGV2aWNlIGlzIG1vbm90b25pYyBhbmQgc21vb3RoLCBzbyBhIAogc21vb3RoIGZ1bmN0aW9uIGZpdCB0byB0aGUgZGF0YSB3aWxsIGFsbG93IHVzIHRvIGdldCBiZXR0ZXIgcHJlY2lzaW9uLiAgCiBJIHVzZWQgdGhlIDV0aC1vcmRlciBwb2x5IGZpdCBkZXNjcmliZWQgYWJvdmUgYW5kIHNvbHZlZCBmb3IKIFZJQSByZWdpc3RlciB2YWx1ZXMgMC0yNTUuICBJICoxMCBiZWZvcmUgcm91bmRpbmcsIHNvIHdlIGdldCB0ZW50aC1kZWdyZWUgCiBwcmVjaXNpb24uICAoSSBjb3VsZCBoYXZlIGRvbmUgYWxsIDEwMjQgdmFsdWVzIGZvciBvdXIgMTAtYml0IHJlYWRpbmdzLCAKIGJ1dCB0aGUgZnVuY3Rpb24gaXMgdmVyeSBsaW5lYXIgaW4gdGhlIHVzZWZ1bCByYW5nZSAoMC04MCBkZWcgQyksIHNvIAogd2UnbGwganVzdCB1c2UgbGluZWFyIGludGVycG9sYXRpb24gZm9yIDEwLWJpdCByZWFkaW5ncy4pICBTbywgdGVtcExVVCAKIGlzIHRoZSB0ZW1wIGF0IHZpYSByZWdpc3RlciB2YWx1ZXMgMC0yNTU6ICovCnN0YXRpYyBjb25zdCBsb25nIHRlbXBMVVRbXSA9CiAgICB7IC03MDksIC02ODgsIC02NjcsIC02NDYsIC02MjcsIC02MDcsIC01ODksIC01NzAsIC01NTMsIC01MzYsIC01MTksCgkgICAgLTUwMywgLTQ4NywgLTQ3MSwgLTQ1NiwgLTQ0MiwgLTQyOCwgLTQxNCwgLTQwMCwgLTM4NywgLTM3NSwKCSAgICAtMzYyLCAtMzUwLCAtMzM5LCAtMzI3LCAtMzE2LCAtMzA1LCAtMjk1LCAtMjg1LCAtMjc1LCAtMjY1LAoJICAgIC0yNTUsIC0yNDYsIC0yMzcsIC0yMjksIC0yMjAsIC0yMTIsIC0yMDQsIC0xOTYsIC0xODgsIC0xODAsCgkgICAgLTE3MywgLTE2NiwgLTE1OSwgLTE1MiwgLTE0NSwgLTEzOSwgLTEzMiwgLTEyNiwgLTEyMCwgLTExNCwKCSAgICAtMTA4LCAtMTAyLCAtOTYsIC05MSwgLTg1LCAtODAsIC03NCwgLTY5LCAtNjQsIC01OSwgLTU0LCAtNDksCgkgICAgLTQ0LCAtMzksIC0zNCwgLTI5LCAtMjUsIC0yMCwgLTE1LCAtMTEsIC02LCAtMiwgMywgNywgMTIsIDE2LAoJICAgIDIwLCAyNSwgMjksIDMzLCAzNywgNDIsIDQ2LCA1MCwgNTQsIDU5LCA2MywgNjcsIDcxLCA3NSwgNzksIDg0LAoJICAgIDg4LCA5MiwgOTYsIDEwMCwgMTA0LCAxMDksIDExMywgMTE3LCAxMjEsIDEyNSwgMTMwLCAxMzQsIDEzOCwKCSAgICAxNDIsIDE0NiwgMTUxLCAxNTUsIDE1OSwgMTYzLCAxNjgsIDE3MiwgMTc2LCAxODEsIDE4NSwgMTg5LAoJICAgIDE5MywgMTk4LCAyMDIsIDIwNiwgMjExLCAyMTUsIDIxOSwgMjI0LCAyMjgsIDIzMiwgMjM3LCAyNDEsCgkgICAgMjQ1LCAyNTAsIDI1NCwgMjU5LCAyNjMsIDI2NywgMjcyLCAyNzYsIDI4MSwgMjg1LCAyOTAsIDI5NCwKCSAgICAyOTksIDMwMywgMzA3LCAzMTIsIDMxNiwgMzIxLCAzMjUsIDMzMCwgMzM0LCAzMzksIDM0NCwgMzQ4LAoJICAgIDM1MywgMzU3LCAzNjIsIDM2NiwgMzcxLCAzNzYsIDM4MCwgMzg1LCAzOTAsIDM5NSwgMzk5LCA0MDQsCgkgICAgNDA5LCA0MTQsIDQxOSwgNDIzLCA0MjgsIDQzMywgNDM4LCA0NDMsIDQ0OSwgNDU0LCA0NTksIDQ2NCwKCSAgICA0NjksIDQ3NSwgNDgwLCA0ODYsIDQ5MSwgNDk3LCA1MDIsIDUwOCwgNTE0LCA1MjAsIDUyNiwgNTMyLAoJICAgIDUzOCwgNTQ0LCA1NTEsIDU1NywgNTY0LCA1NzEsIDU3OCwgNTg0LCA1OTIsIDU5OSwgNjA2LCA2MTQsCgkgICAgNjIxLCA2MjksIDYzNywgNjQ1LCA2NTQsIDY2MiwgNjcxLCA2ODAsIDY4OSwgNjk4LCA3MDgsIDcxOCwKCSAgICA3MjgsIDczOCwgNzQ5LCA3NTksIDc3MCwgNzgyLCA3OTMsIDgwNSwgODE4LCA4MzAsIDg0MywgODU2LAoJICAgIDg3MCwgODgzLCA4OTgsIDkxMiwgOTI3LCA5NDMsIDk1OCwgOTc1LCA5OTEsIDEwMDgsIDEwMjYsIDEwNDQsCgkgICAgMTA2MiwgMTA4MSwgMTEwMSwgMTEyMSwgMTE0MSwgMTE2MiwgMTE4NCwgMTIwNiwgMTIyOSwgMTI1MiwKCSAgICAxMjc2LCAxMzAxLCAxMzI2LCAxMzUyLCAxMzc4LCAxNDA2LCAxNDM0LCAxNDYyCn07CgovKiB0aGUgb3JpZ2luYWwgTFVUIHZhbHVlcyBmcm9tIEFsZXggdmFuIEthYW0gPGRhcmtzaWRlQGNoZWxsby5ubD4gCiAgIChmb3IgdmlhIHJlZ2lzdGVyIHZhbHVlcyAxMi0yNDApOgp7LTUwLC00OSwtNDcsLTQ1LC00MywtNDEsLTM5LC0zOCwtMzcsLTM1LC0zNCwtMzMsLTMyLC0zMSwKLTMwLC0yOSwtMjgsLTI3LC0yNiwtMjUsLTI0LC0yNCwtMjMsLTIyLC0yMSwtMjAsLTIwLC0xOSwtMTgsLTE3LC0xNywtMTYsLTE1LAotMTUsLTE0LC0xNCwtMTMsLTEyLC0xMiwtMTEsLTExLC0xMCwtOSwtOSwtOCwtOCwtNywtNywtNiwtNiwtNSwtNSwtNCwtNCwtMywKLTMsLTIsLTIsLTEsLTEsMCwwLDEsMSwxLDMsMywzLDQsNCw0LDUsNSw1LDYsNiw3LDcsOCw4LDksOSw5LDEwLDEwLDExLDExLDEyLAoxMiwxMiwxMywxMywxMywxNCwxNCwxNSwxNSwxNiwxNiwxNiwxNywxNywxOCwxOCwxOSwxOSwyMCwyMCwyMSwyMSwyMSwyMiwyMiwKMjIsMjMsMjMsMjQsMjQsMjUsMjUsMjYsMjYsMjYsMjcsMjcsMjcsMjgsMjgsMjksMjksMzAsMzAsMzAsMzEsMzEsMzIsMzIsMzMsCjMzLDM0LDM0LDM1LDM1LDM1LDM2LDM2LDM3LDM3LDM4LDM4LDM5LDM5LDQwLDQwLDQxLDQxLDQyLDQyLDQzLDQzLDQ0LDQ0LDQ1LAo0NSw0Niw0Niw0Nyw0OCw0OCw0OSw0OSw1MCw1MSw1MSw1Miw1Miw1Myw1Myw1NCw1NSw1NSw1Niw1Nyw1Nyw1OCw1OSw1OSw2MCwKNjEsNjIsNjIsNjMsNjQsNjUsNjYsNjYsNjcsNjgsNjksNzAsNzEsNzIsNzMsNzQsNzUsNzYsNzcsNzgsNzksODAsODEsODMsODQsCjg1LDg2LDg4LDg5LDkxLDkyLDk0LDk2LDk3LDk5LDEwMSwxMDMsMTA1LDEwNywxMDksMTEwfTsKCgogSGVyZSdzIHRoZSByZXZlcnNlIExVVC4gIEkgZ290IGl0IGJ5IGRvaW5nIGEgNi10aCBvcmRlciBwb2x5IGZpdCAobmVlZGVkCiBhbiBleHRyYSB0ZXJtIGZvciBhIGdvb2QgZml0IHRvIHRoZXNlIGludmVyc2UgZGF0YSEpIGFuZCB0aGVuIAogc29sdmluZyBmb3IgZWFjaCB0ZW1wIHZhbHVlIGZyb20gLTUwIHRvIDExMCAodGhlIHVzZWFibGUgcmFuZ2UgZm9yIAogdGhpcyBjaGlwKS4gIEhlcmUncyB0aGUgZml0OiAKIHZpYVJlZ1ZhbCA9IC0xLjE2MDM3MGUtMTAqdmFsXjYgKzMuMTkzNjkzZS0wOCp2YWxeNSAtIDEuNDY0NDQ3ZS0wNip2YWxeNCAKIC0gMi41MjU0NTNlLTA0KnZhbF4zICsgMS40MjQ1OTNlLTAyKnZhbF4yICsgMi4xNDg5NDFlKzAwKnZhbCArNy4yNzU4MDhlKzAxKQogTm90ZSB0aGF0IG49MTYxOiAqLwpzdGF0aWMgY29uc3QgdTggdmlhTFVUW10gPQogICAgeyAxMiwgMTIsIDEzLCAxNCwgMTQsIDE1LCAxNiwgMTYsIDE3LCAxOCwgMTgsIDE5LCAyMCwgMjAsIDIxLCAyMiwgMjMsCgkgICAgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNSwgMzYsIDM3LCAzOSwgNDAsCgkgICAgNDEsIDQzLCA0NSwgNDYsIDQ4LCA0OSwgNTEsIDUzLCA1NSwgNTcsIDU5LCA2MCwgNjIsIDY0LCA2NiwKCSAgICA2OSwgNzEsIDczLCA3NSwgNzcsIDc5LCA4MiwgODQsIDg2LCA4OCwgOTEsIDkzLCA5NSwgOTgsIDEwMCwKCSAgICAxMDMsIDEwNSwgMTA3LCAxMTAsIDExMiwgMTE1LCAxMTcsIDExOSwgMTIyLCAxMjQsIDEyNiwgMTI5LAoJICAgIDEzMSwgMTM0LCAxMzYsIDEzOCwgMTQwLCAxNDMsIDE0NSwgMTQ3LCAxNTAsIDE1MiwgMTU0LCAxNTYsCgkgICAgMTU4LCAxNjAsIDE2MiwgMTY0LCAxNjYsIDE2OCwgMTcwLCAxNzIsIDE3NCwgMTc2LCAxNzgsIDE4MCwKCSAgICAxODIsIDE4MywgMTg1LCAxODcsIDE4OCwgMTkwLCAxOTIsIDE5MywgMTk1LCAxOTYsIDE5OCwgMTk5LAoJICAgIDIwMCwgMjAyLCAyMDMsIDIwNSwgMjA2LCAyMDcsIDIwOCwgMjA5LCAyMTAsIDIxMSwgMjEyLCAyMTMsCgkgICAgMjE0LCAyMTUsIDIxNiwgMjE3LCAyMTgsIDIxOSwgMjIwLCAyMjEsIDIyMiwgMjIyLCAyMjMsIDIyNCwKCSAgICAyMjUsIDIyNiwgMjI2LCAyMjcsIDIyOCwgMjI4LCAyMjksIDIzMCwgMjMwLCAyMzEsIDIzMiwgMjMyLAoJICAgIDIzMywgMjMzLCAyMzQsIDIzNSwgMjM1LCAyMzYsIDIzNiwgMjM3LCAyMzcsIDIzOCwgMjM4LCAyMzksCgkgICAgMjM5LCAyNDAKfTsKCi8qIENvbnZlcnRpbmcgdGVtcHMgdG8gKDgtYml0KSBoeXN0IGFuZCBvdmVyIHJlZ2lzdGVycwogICBObyBpbnRlcnBvbGF0aW9uIGhlcmUuCiAgIFRoZSArNTAgaXMgYmVjYXVzZSB0aGUgdGVtcHMgc3RhcnQgYXQgLTUwICovCnN0YXRpYyBpbmxpbmUgdTggVEVNUF9UT19SRUcobG9uZyB2YWwpCnsKCXJldHVybiB2aWFMVVRbdmFsIDw9IC01MDAwMCA/IDAgOiB2YWwgPj0gMTEwMDAwID8gMTYwIDogCgkJICAgICAgKHZhbCA8IDAgPyB2YWwgLSA1MDAgOiB2YWwgKyA1MDApIC8gMTAwMCArIDUwXTsKfQoKLyogZm9yIDgtYml0IHRlbXBlcmF0dXJlIGh5c3QgYW5kIG92ZXIgcmVnaXN0ZXJzICovCiNkZWZpbmUgVEVNUF9GUk9NX1JFRyh2YWwpICh0ZW1wTFVUWyh2YWwpXSAqIDEwMCkKCi8qIGZvciAxMC1iaXQgdGVtcGVyYXR1cmUgcmVhZGluZ3MgKi8Kc3RhdGljIGlubGluZSBsb25nIFRFTVBfRlJPTV9SRUcxMCh1MTYgdmFsKQp7Cgl1MTYgZWlnaHRCaXRzID0gdmFsID4+IDI7Cgl1MTYgdHdvQml0cyA9IHZhbCAmIDM7CgoJLyogbm8gaW50ZXJwb2xhdGlvbiBmb3IgdGhlc2UgKi8KCWlmICh0d29CaXRzID09IDAgfHwgZWlnaHRCaXRzID09IDI1NSkKCQlyZXR1cm4gVEVNUF9GUk9NX1JFRyhlaWdodEJpdHMpOwoKCS8qIGRvIHNvbWUgbGluZWFyIGludGVycG9sYXRpb24gKi8KCXJldHVybiAodGVtcExVVFtlaWdodEJpdHNdICogKDQgLSB0d29CaXRzKSArCgkgICAgICAgIHRlbXBMVVRbZWlnaHRCaXRzICsgMV0gKiB0d29CaXRzKSAqIDI1Owp9CgojZGVmaW5lIEFMQVJNU19GUk9NX1JFRyh2YWwpICh2YWwpCgojZGVmaW5lIERJVl9GUk9NX1JFRyh2YWwpICgxIDw8ICh2YWwpKQojZGVmaW5lIERJVl9UT19SRUcodmFsKSAoKHZhbCk9PTg/MzoodmFsKT09ND8yOih2YWwpPT0xPzA6MSkKCi8qIEZvciB0aGUgVklBNjg2QSwgd2UgbmVlZCB0byBrZWVwIHNvbWUgZGF0YSBpbiBtZW1vcnkuCiAgIFRoZSBzdHJ1Y3R1cmUgaXMgZHluYW1pY2FsbHkgYWxsb2NhdGVkLCBhdCB0aGUgc2FtZSB0aW1lIHdoZW4gYSBuZXcKICAgdmlhNjg2YSBjbGllbnQgaXMgYWxsb2NhdGVkLiAqLwpzdHJ1Y3QgdmlhNjg2YV9kYXRhIHsKCXN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKCXN0cnVjdCBzZW1hcGhvcmUgdXBkYXRlX2xvY2s7CgljaGFyIHZhbGlkOwkJLyogIT0wIGlmIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCgl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsJLyogSW4gamlmZmllcyAqLwoKCXU4IGluWzVdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KCXU4IGluX21heFs1XTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCgl1OCBpbl9taW5bNV07CQkvKiBSZWdpc3RlciB2YWx1ZSAqLwoJdTggZmFuWzJdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KCXU4IGZhbl9taW5bMl07CQkvKiBSZWdpc3RlciB2YWx1ZSAqLwoJdTE2IHRlbXBbM107CQkvKiBSZWdpc3RlciB2YWx1ZSAxMCBiaXQgKi8KCXU4IHRlbXBfb3ZlclszXTsJLyogUmVnaXN0ZXIgdmFsdWUgKi8KCXU4IHRlbXBfaHlzdFszXTsJLyogUmVnaXN0ZXIgdmFsdWUgKi8KCXU4IGZhbl9kaXZbMl07CQkvKiBSZWdpc3RlciBlbmNvZGluZywgc2hpZnRlZCByaWdodCAqLwoJdTE2IGFsYXJtczsJCS8qIFJlZ2lzdGVyIGVuY29kaW5nLCBjb21iaW5lZCAqLwp9OwoKc3RhdGljIHN0cnVjdCBwY2lfZGV2ICpzX2JyaWRnZTsJLyogcG9pbnRlciB0byB0aGUgKG9ubHkpIHZpYTY4NmEgKi8KCnN0YXRpYyBpbnQgdmlhNjg2YV9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpOwpzdGF0aWMgaW50IHZpYTY4NmFfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKTsKc3RhdGljIGludCB2aWE2ODZhX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CgpzdGF0aWMgaW5saW5lIGludCB2aWE2ODZhX3JlYWRfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKQp7CglyZXR1cm4gKGluYl9wKGNsaWVudC0+YWRkciArIHJlZykpOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgdmlhNjg2YV93cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsCgkJCQkgICAgICAgdTggdmFsdWUpCnsKCW91dGJfcCh2YWx1ZSwgY2xpZW50LT5hZGRyICsgcmVnKTsKfQoKc3RhdGljIHN0cnVjdCB2aWE2ODZhX2RhdGEgKnZpYTY4NmFfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwpzdGF0aWMgdm9pZCB2aWE2ODZhX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOwoKLyogZm9sbG93aW5nIGFyZSB0aGUgc3lzZnMgY2FsbGJhY2sgZnVuY3Rpb25zICovCgovKiA3IHZvbHRhZ2Ugc2Vuc29ycyAqLwpzdGF0aWMgc3NpemVfdCBzaG93X2luKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpIHsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSB2aWE2ODZhX3VwZGF0ZV9kZXZpY2UoZGV2KTsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgSU5fRlJPTV9SRUcoZGF0YS0+aW5bbnJdLCBucikpOwp9CgpzdGF0aWMgc3NpemVfdCBzaG93X2luX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKSB7CglzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gdmlhNjg2YV91cGRhdGVfZGV2aWNlKGRldik7CglyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIElOX0ZST01fUkVHKGRhdGEtPmluX21pbltucl0sIG5yKSk7Cn0KCnN0YXRpYyBzc2l6ZV90IHNob3dfaW5fbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpIHsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSB2aWE2ODZhX3VwZGF0ZV9kZXZpY2UoZGV2KTsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgSU5fRlJPTV9SRUcoZGF0YS0+aW5fbWF4W25yXSwgbnIpKTsKfQoKc3RhdGljIHNzaXplX3Qgc2V0X2luX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgCgkJc2l6ZV90IGNvdW50LCBpbnQgbnIpIHsKCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CglzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Cgl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwoKCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCWRhdGEtPmluX21pbltucl0gPSBJTl9UT19SRUcodmFsLG5yKTsKCXZpYTY4NmFfd3JpdGVfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19JTl9NSU4obnIpLCAKCQkJZGF0YS0+aW5fbWluW25yXSk7Cgl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOwoJcmV0dXJuIGNvdW50Owp9CnN0YXRpYyBzc2l6ZV90IHNldF9pbl9tYXgoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIAoJCXNpemVfdCBjb3VudCwgaW50IG5yKSB7CglzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwoJdW5zaWduZWQgbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKCglkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CglkYXRhLT5pbl9tYXhbbnJdID0gSU5fVE9fUkVHKHZhbCxucik7Cgl2aWE2ODZhX3dyaXRlX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfSU5fTUFYKG5yKSwgCgkJCWRhdGEtPmluX21heFtucl0pOwoJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCXJldHVybiBjb3VudDsKfQojZGVmaW5lIHNob3dfaW5fb2Zmc2V0KG9mZnNldCkJCQkJCVwKc3RhdGljIHNzaXplX3QgCQkJCQkJCVwKCXNob3dfaW4jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCQlcCnsJCQkJCQkJCVwKCXJldHVybiBzaG93X2luKGRldiwgYnVmLCBvZmZzZXQpOwkJCVwKfQkJCQkJCQkJXApzdGF0aWMgc3NpemVfdCAJCQkJCQkJXAoJc2hvd19pbiMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJXAp7CQkJCQkJCQlcCglyZXR1cm4gc2hvd19pbl9taW4oZGV2LCBidWYsIG9mZnNldCk7CQlcCn0JCQkJCQkJCVwKc3RhdGljIHNzaXplX3QgCQkJCQkJCVwKCXNob3dfaW4jI29mZnNldCMjX21heCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCVwKewkJCQkJCQkJXAoJcmV0dXJuIHNob3dfaW5fbWF4KGRldiwgYnVmLCBvZmZzZXQpOwkJXAp9CQkJCQkJCQlcCnN0YXRpYyBzc2l6ZV90IHNldF9pbiMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsIAlcCgkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIAkJCVwKewkJCQkJCQkJXAoJcmV0dXJuIHNldF9pbl9taW4oZGV2LCBidWYsIGNvdW50LCBvZmZzZXQpOwkJXAp9CQkJCQkJCQlcCnN0YXRpYyBzc2l6ZV90IHNldF9pbiMjb2Zmc2V0IyNfbWF4IChzdHJ1Y3QgZGV2aWNlICpkZXYsCVwKCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCQlcCnsJCQkJCQkJCVwKCXJldHVybiBzZXRfaW5fbWF4KGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0KTsJCVwKfQkJCQkJCQkJXApzdGF0aWMgREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCBzaG93X2luIyNvZmZzZXQsIE5VTEwpO1wKc3RhdGljIERFVklDRV9BVFRSKGluIyNvZmZzZXQjI19taW4sIFNfSVJVR08gfCBTX0lXVVNSLCAJXAoJCXNob3dfaW4jI29mZnNldCMjX21pbiwgc2V0X2luIyNvZmZzZXQjI19taW4pOwlcCnN0YXRpYyBERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfbWF4LCBTX0lSVUdPIHwgU19JV1VTUiwgCVwKCQlzaG93X2luIyNvZmZzZXQjI19tYXgsIHNldF9pbiMjb2Zmc2V0IyNfbWF4KTsKCnNob3dfaW5fb2Zmc2V0KDApOwpzaG93X2luX29mZnNldCgxKTsKc2hvd19pbl9vZmZzZXQoMik7CnNob3dfaW5fb2Zmc2V0KDMpOwpzaG93X2luX29mZnNldCg0KTsKCi8qIDMgdGVtcGVyYXR1cmVzICovCnN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKSB7CglzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gdmlhNjg2YV91cGRhdGVfZGV2aWNlKGRldik7CglyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIFRFTVBfRlJPTV9SRUcxMChkYXRhLT50ZW1wW25yXSkpOwp9CnN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9vdmVyKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpIHsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSB2aWE2ODZhX3VwZGF0ZV9kZXZpY2UoZGV2KTsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX292ZXJbbnJdKSk7Cn0Kc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikgewoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOwoJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfaHlzdFtucl0pKTsKfQpzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9vdmVyKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCAKCQlzaXplX3QgY291bnQsIGludCBucikgewoJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOwoKCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCWRhdGEtPnRlbXBfb3Zlcltucl0gPSBURU1QX1RPX1JFRyh2YWwpOwoJdmlhNjg2YV93cml0ZV92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX1RFTVBfT1ZFUihuciksIGRhdGEtPnRlbXBfb3Zlcltucl0pOwoJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCXJldHVybiBjb3VudDsKfQpzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9oeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCAKCQlzaXplX3QgY291bnQsIGludCBucikgewoJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOwoKCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCWRhdGEtPnRlbXBfaHlzdFtucl0gPSBURU1QX1RPX1JFRyh2YWwpOwoJdmlhNjg2YV93cml0ZV92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX1RFTVBfSFlTVChuciksIGRhdGEtPnRlbXBfaHlzdFtucl0pOwoJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCXJldHVybiBjb3VudDsKfQojZGVmaW5lIHNob3dfdGVtcF9vZmZzZXQob2Zmc2V0KQkJCQkJXApzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQlcCnsJCQkJCQkJCQlcCglyZXR1cm4gc2hvd190ZW1wKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQkJXAp9CQkJCQkJCQkJXApzdGF0aWMgc3NpemVfdAkJCQkJCQkJXApzaG93X3RlbXBfIyNvZmZzZXQjI19vdmVyIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJCVwKewkJCQkJCQkJCVwKCXJldHVybiBzaG93X3RlbXBfb3ZlcihkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJXAp9CQkJCQkJCQkJXApzdGF0aWMgc3NpemVfdAkJCQkJCQkJXApzaG93X3RlbXBfIyNvZmZzZXQjI19oeXN0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJCVwKewkJCQkJCQkJCVwKCXJldHVybiBzaG93X3RlbXBfaHlzdChkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJXAp9CQkJCQkJCQkJXApzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF8jI29mZnNldCMjX292ZXIgKHN0cnVjdCBkZXZpY2UgKmRldiwgCQlcCgkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIAkJCQlcCnsJCQkJCQkJCQlcCglyZXR1cm4gc2V0X3RlbXBfb3ZlcihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOwkJXAp9CQkJCQkJCQkJXApzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF8jI29mZnNldCMjX2h5c3QgKHN0cnVjdCBkZXZpY2UgKmRldiwgCQlcCgkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIAkJCQlcCnsJCQkJCQkJCQlcCglyZXR1cm4gc2V0X3RlbXBfaHlzdChkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOwkJXAp9CQkJCQkJCQkJXApzdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcF8jI29mZnNldCwgTlVMTCk7XApzdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfbWF4LCBTX0lSVUdPIHwgU19JV1VTUiwgCQlcCgkJc2hvd190ZW1wXyMjb2Zmc2V0IyNfb3Zlciwgc2V0X3RlbXBfIyNvZmZzZXQjI19vdmVyKTsJXApzdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfbWF4X2h5c3QsIFNfSVJVR08gfCBTX0lXVVNSLCAJCVwKCQlzaG93X3RlbXBfIyNvZmZzZXQjI19oeXN0LCBzZXRfdGVtcF8jI29mZnNldCMjX2h5c3QpOwkKCnNob3dfdGVtcF9vZmZzZXQoMSk7CnNob3dfdGVtcF9vZmZzZXQoMik7CnNob3dfdGVtcF9vZmZzZXQoMyk7CgovKiAyIEZhbnMgKi8Kc3RhdGljIHNzaXplX3Qgc2hvd19mYW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikgewoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOwoJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgRkFOX0ZST01fUkVHKGRhdGEtPmZhbltucl0sIAoJCQkJRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSkgKTsKfQpzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikgewoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOwoJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwKCQlGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuX21pbltucl0sIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpICk7Cn0Kc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fZGl2KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpIHsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSB2aWE2ODZhX3VwZGF0ZV9kZXZpY2UoZGV2KTsKCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkgKTsKfQpzdGF0aWMgc3NpemVfdCBzZXRfZmFuX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgCgkJc2l6ZV90IGNvdW50LCBpbnQgbnIpIHsKCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CglzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CglpbnQgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKCglkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CglkYXRhLT5mYW5fbWluW25yXSA9IEZBTl9UT19SRUcodmFsLCBESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pKTsKCXZpYTY4NmFfd3JpdGVfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19GQU5fTUlOKG5yKzEpLCBkYXRhLT5mYW5fbWluW25yXSk7Cgl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOwoJcmV0dXJuIGNvdW50Owp9CnN0YXRpYyBzc2l6ZV90IHNldF9mYW5fZGl2KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCAKCQlzaXplX3QgY291bnQsIGludCBucikgewoJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOwoJaW50IG9sZDsKCglkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CglvbGQgPSB2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19GQU5ESVYpOwoJZGF0YS0+ZmFuX2Rpdltucl0gPSBESVZfVE9fUkVHKHZhbCk7CglvbGQgPSAob2xkICYgMHgwZikgfCAoZGF0YS0+ZmFuX2RpdlsxXSA8PCA2KSB8IChkYXRhLT5mYW5fZGl2WzBdIDw8IDQpOwoJdmlhNjg2YV93cml0ZV92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX0ZBTkRJViwgb2xkKTsKCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CglyZXR1cm4gY291bnQ7Cn0KCiNkZWZpbmUgc2hvd19mYW5fb2Zmc2V0KG9mZnNldCkJCQkJCQlcCnN0YXRpYyBzc2l6ZV90IHNob3dfZmFuXyMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJXAp7CQkJCQkJCQkJXAoJcmV0dXJuIHNob3dfZmFuKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQkJXAp9CQkJCQkJCQkJXApzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl8jI29mZnNldCMjX21pbiAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCVwKewkJCQkJCQkJCVwKCXJldHVybiBzaG93X2Zhbl9taW4oZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCVwKfQkJCQkJCQkJCVwKc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fIyNvZmZzZXQjI19kaXYgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQlcCnsJCQkJCQkJCQlcCglyZXR1cm4gc2hvd19mYW5fZGl2KGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQlcCn0JCQkJCQkJCQlcCnN0YXRpYyBzc2l6ZV90IHNldF9mYW5fIyNvZmZzZXQjI19taW4gKHN0cnVjdCBkZXZpY2UgKmRldiwgCQlcCgljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgCQkJCQlcCnsJCQkJCQkJCQlcCglyZXR1cm4gc2V0X2Zhbl9taW4oZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsJCVwKfQkJCQkJCQkJCVwKc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl8jI29mZnNldCMjX2RpdiAoc3RydWN0IGRldmljZSAqZGV2LCAJCVwKCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgCQkJCVwKewkJCQkJCQkJCVwKCXJldHVybiBzZXRfZmFuX2RpdihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOwkJXAp9CQkJCQkJCQkJXApzdGF0aWMgREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgc2hvd19mYW5fIyNvZmZzZXQsIE5VTEwpO1wKc3RhdGljIERFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwgCQlcCgkJc2hvd19mYW5fIyNvZmZzZXQjI19taW4sIHNldF9mYW5fIyNvZmZzZXQjI19taW4pOwlcCnN0YXRpYyBERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX2RpdiwgU19JUlVHTyB8IFNfSVdVU1IsIAkJXAoJCXNob3dfZmFuXyMjb2Zmc2V0IyNfZGl2LCBzZXRfZmFuXyMjb2Zmc2V0IyNfZGl2KTsKCnNob3dfZmFuX29mZnNldCgxKTsKc2hvd19mYW5fb2Zmc2V0KDIpOwoKLyogQWxhcm1zICovCnN0YXRpYyBzc2l6ZV90IHNob3dfYWxhcm1zKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSB7CglzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gdmlhNjg2YV91cGRhdGVfZGV2aWNlKGRldik7CglyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCBBTEFSTVNfRlJPTV9SRUcoZGF0YS0+YWxhcm1zKSk7Cn0Kc3RhdGljIERFVklDRV9BVFRSKGFsYXJtcywgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfYWxhcm1zLCBOVUxMKTsKCi8qIFRoZSBkcml2ZXIuIEkgY2hvb3NlIHRvIHVzZSB0eXBlIGkyY19kcml2ZXIsIGFzIGF0IGlzIGlkZW50aWNhbCB0byBib3RoCiAgIHNtYnVzX2RyaXZlciBhbmQgaXNhX2RyaXZlciwgYW5kIGNsaWVudHMgY291bGQgYmUgb2YgZWl0aGVyIGtpbmQgKi8Kc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHZpYTY4NmFfZHJpdmVyID0gewoJLm93bmVyCQk9IFRISVNfTU9EVUxFLAoJLm5hbWUJCT0gInZpYTY4NmEiLAoJLmlkCQk9IEkyQ19EUklWRVJJRF9WSUE2ODZBLAoJLmZsYWdzCQk9IEkyQ19ERl9OT1RJRlksCgkuYXR0YWNoX2FkYXB0ZXIJPSB2aWE2ODZhX2F0dGFjaF9hZGFwdGVyLAoJLmRldGFjaF9jbGllbnQJPSB2aWE2ODZhX2RldGFjaF9jbGllbnQsCn07CgoKLyogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgbW9kdWxlIGlzIGxvYWRlZCAqLwpzdGF0aWMgaW50IHZpYTY4NmFfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQp7CglpZiAoIShhZGFwdGVyLT5jbGFzcyAmIEkyQ19DTEFTU19IV01PTikpCgkJcmV0dXJuIDA7CglyZXR1cm4gaTJjX2RldGVjdChhZGFwdGVyLCAmYWRkcl9kYXRhLCB2aWE2ODZhX2RldGVjdCk7Cn0KCnN0YXRpYyBpbnQgdmlhNjg2YV9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCnsKCXN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50OwoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YTsKCWludCBlcnIgPSAwOwoJY29uc3QgY2hhciBjbGllbnRfbmFtZVtdID0gInZpYTY4NmEiOwoJdTE2IHZhbDsKCgkvKiBNYWtlIHN1cmUgd2UgYXJlIHByb2JpbmcgdGhlIElTQSBidXMhISAgKi8KCWlmICghaTJjX2lzX2lzYV9hZGFwdGVyKGFkYXB0ZXIpKSB7CgkJZGV2X2VycigmYWRhcHRlci0+ZGV2LAoJCSJ2aWE2ODZhX2RldGVjdCBjYWxsZWQgZm9yIGFuIEkyQyBidXMgYWRhcHRlcj8hP1xuIik7CgkJcmV0dXJuIDA7Cgl9CgoJLyogODIzMSByZXF1aXJlcyBtdWx0aXBsZSBvZiAyNTYsIHdlIGVuZm9yY2UgdGhhdCBvbiA2ODYgYXMgd2VsbCAqLwoJaWYoZm9yY2VfYWRkcikKCQlhZGRyZXNzID0gZm9yY2VfYWRkciAmIDB4RkYwMDsKCglpZihmb3JjZV9hZGRyKSB7CgkJZGV2X3dhcm4oJmFkYXB0ZXItPmRldiwiZm9yY2luZyBJU0EgYWRkcmVzcyAweCUwNFhcbiIsIGFkZHJlc3MpOwoJCWlmIChQQ0lCSU9TX1NVQ0NFU1NGVUwgIT0KCQkgICAgcGNpX3dyaXRlX2NvbmZpZ193b3JkKHNfYnJpZGdlLCBWSUE2ODZBX0JBU0VfUkVHLCBhZGRyZXNzKSkKCQkJcmV0dXJuIC1FTk9ERVY7Cgl9CglpZiAoUENJQklPU19TVUNDRVNTRlVMICE9CgkgICAgcGNpX3JlYWRfY29uZmlnX3dvcmQoc19icmlkZ2UsIFZJQTY4NkFfRU5BQkxFX1JFRywgJnZhbCkpCgkJcmV0dXJuIC1FTk9ERVY7CglpZiAoISh2YWwgJiAweDAwMDEpKSB7CgkJZGV2X3dhcm4oJmFkYXB0ZXItPmRldiwiZW5hYmxpbmcgc2Vuc29yc1xuIik7CgkJaWYgKFBDSUJJT1NfU1VDQ0VTU0ZVTCAhPQoJCSAgICBwY2lfd3JpdGVfY29uZmlnX3dvcmQoc19icmlkZ2UsIFZJQTY4NkFfRU5BQkxFX1JFRywKCQkgICAgICAgICAgICAgICAgICAgICAgdmFsIHwgMHgwMDAxKSkKCQkJcmV0dXJuIC1FTk9ERVY7Cgl9CgoJLyogUmVzZXJ2ZSB0aGUgSVNBIHJlZ2lvbiAqLwoJaWYgKCFyZXF1ZXN0X3JlZ2lvbihhZGRyZXNzLCBWSUE2ODZBX0VYVEVOVCwgdmlhNjg2YV9kcml2ZXIubmFtZSkpIHsKCQlkZXZfZXJyKCZhZGFwdGVyLT5kZXYsInJlZ2lvbiAweCV4IGFscmVhZHkgaW4gdXNlIVxuIiwKCQkgICAgICAgYWRkcmVzcyk7CgkJcmV0dXJuIC1FTk9ERVY7Cgl9CgoJaWYgKCEoZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2aWE2ODZhX2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKCQllcnIgPSAtRU5PTUVNOwoJCWdvdG8gRVJST1IwOwoJfQoJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgdmlhNjg2YV9kYXRhKSk7CgoJbmV3X2NsaWVudCA9ICZkYXRhLT5jbGllbnQ7CglpMmNfc2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCwgZGF0YSk7CgluZXdfY2xpZW50LT5hZGRyID0gYWRkcmVzczsKCW5ld19jbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOwoJbmV3X2NsaWVudC0+ZHJpdmVyID0gJnZpYTY4NmFfZHJpdmVyOwoJbmV3X2NsaWVudC0+ZmxhZ3MgPSAwOwoJbmV3X2NsaWVudC0+ZGV2LnBhcmVudCA9ICZhZGFwdGVyLT5kZXY7CgoJLyogRmlsbCBpbiB0aGUgcmVtYWluaW5nIGNsaWVudCBmaWVsZHMgYW5kIHB1dCBpbnRvIHRoZSBnbG9iYWwgbGlzdCAqLwoJc25wcmludGYobmV3X2NsaWVudC0+bmFtZSwgSTJDX05BTUVfU0laRSwgY2xpZW50X25hbWUpOwoKCWRhdGEtPnZhbGlkID0gMDsKCWluaXRfTVVURVgoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCS8qIFRlbGwgdGhlIEkyQyBsYXllciBhIG5ldyBjbGllbnQgaGFzIGFycml2ZWQgKi8KCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQobmV3X2NsaWVudCkpKQoJCWdvdG8gRVJST1IzOwoJCgkvKiBJbml0aWFsaXplIHRoZSBWSUE2ODZBIGNoaXAgKi8KCXZpYTY4NmFfaW5pdF9jbGllbnQobmV3X2NsaWVudCk7CgoJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX2lucHV0KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xX2lucHV0KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4yX2lucHV0KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4zX2lucHV0KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW40X2lucHV0KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX21pbik7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMV9taW4pOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjJfbWluKTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4zX21pbik7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNF9taW4pOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjBfbWF4KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xX21heCk7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMl9tYXgpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjNfbWF4KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW40X21heCk7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX2lucHV0KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfaW5wdXQpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wM19pbnB1dCk7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX21heCk7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX21heCk7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAzX21heCk7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX21heF9oeXN0KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfbWF4X2h5c3QpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wM19tYXhfaHlzdCk7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjFfaW5wdXQpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4yX2lucHV0KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMV9taW4pOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4yX21pbik7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjFfZGl2KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMl9kaXYpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9hbGFybXMpOwoKCXJldHVybiAwOwoKICAgICAgRVJST1IzOgoJa2ZyZWUoZGF0YSk7CiAgICAgIEVSUk9SMDoKCXJlbGVhc2VfcmVnaW9uKGFkZHJlc3MsIFZJQTY4NkFfRVhURU5UKTsKCXJldHVybiBlcnI7Cn0KCnN0YXRpYyBpbnQgdmlhNjg2YV9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCnsKCWludCBlcnI7CgoJaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkgewoJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAoJCSJDbGllbnQgZGVyZWdpc3RyYXRpb24gZmFpbGVkLCBjbGllbnQgbm90IGRldGFjaGVkLlxuIik7CgkJcmV0dXJuIGVycjsKCX0KCglyZWxlYXNlX3JlZ2lvbihjbGllbnQtPmFkZHIsIFZJQTY4NkFfRVhURU5UKTsKCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKCglyZXR1cm4gMDsKfQoKLyogQ2FsbGVkIHdoZW4gd2UgaGF2ZSBmb3VuZCBhIG5ldyBWSUE2ODZBLiBTZXQgbGltaXRzLCBldGMuICovCnN0YXRpYyB2b2lkIHZpYTY4NmFfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKewoJdTggcmVnOwoKCS8qIFN0YXJ0IG1vbml0b3JpbmcgKi8KCXJlZyA9IHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX0NPTkZJRyk7Cgl2aWE2ODZhX3dyaXRlX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfQ09ORklHLCAocmVnfDB4MDEpJjB4N0YpOwoKCS8qIENvbmZpZ3VyZSB0ZW1wIGludGVycnVwdCBtb2RlIGZvciBjb250aW51b3VzLWludGVycnVwdCBvcGVyYXRpb24gKi8KCXZpYTY4NmFfd3JpdGVfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19URU1QX01PREUsIAoJCQkgICAgdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfVEVNUF9NT0RFKSAmCgkJCSAgICAhKFZJQTY4NkFfVEVNUF9NT0RFX01BU0sgfCBWSUE2ODZBX1RFTVBfTU9ERV9DT05USU5VT1VTKSk7Cn0KCnN0YXRpYyBzdHJ1Y3QgdmlhNjg2YV9kYXRhICp2aWE2ODZhX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQp7CglzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwoJaW50IGk7CgoJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOwoKCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlZCArIEhaICsgSFogLyAyKQoJICAgIHx8ICFkYXRhLT52YWxpZCkgewoJCWZvciAoaSA9IDA7IGkgPD0gNDsgaSsrKSB7CgkJCWRhdGEtPmluW2ldID0KCQkJICAgIHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX0lOKGkpKTsKCQkJZGF0YS0+aW5fbWluW2ldID0gdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwKCQkJCQkJCSAgICAgVklBNjg2QV9SRUdfSU5fTUlOCgkJCQkJCQkgICAgIChpKSk7CgkJCWRhdGEtPmluX21heFtpXSA9CgkJCSAgICB2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19JTl9NQVgoaSkpOwoJCX0KCQlmb3IgKGkgPSAxOyBpIDw9IDI7IGkrKykgewoJCQlkYXRhLT5mYW5baSAtIDFdID0KCQkJICAgIHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX0ZBTihpKSk7CgkJCWRhdGEtPmZhbl9taW5baSAtIDFdID0gdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwKCQkJCQkJICAgICBWSUE2ODZBX1JFR19GQU5fTUlOKGkpKTsKCQl9CgkJZm9yIChpID0gMDsgaSA8PSAyOyBpKyspIHsKCQkJZGF0YS0+dGVtcFtpXSA9IHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsCgkJCQkJCSBWSUE2ODZBX1JFR19URU1QKGkpKSA8PCAyOwoJCQlkYXRhLT50ZW1wX292ZXJbaV0gPQoJCQkgICAgdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwKCQkJCQkgICAgICAgVklBNjg2QV9SRUdfVEVNUF9PVkVSKGkpKTsKCQkJZGF0YS0+dGVtcF9oeXN0W2ldID0KCQkJICAgIHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsCgkJCQkJICAgICAgIFZJQTY4NkFfUkVHX1RFTVBfSFlTVChpKSk7CgkJfQoJCS8qIGFkZCBpbiBsb3dlciAyIGJpdHMgCgkJICAgdGVtcDEgdXNlcyBiaXRzIDctNiBvZiBWSUE2ODZBX1JFR19URU1QX0xPVzEKCQkgICB0ZW1wMiB1c2VzIGJpdHMgNS00IG9mIFZJQTY4NkFfUkVHX1RFTVBfTE9XMjMKCQkgICB0ZW1wMyB1c2VzIGJpdHMgNy02IG9mIFZJQTY4NkFfUkVHX1RFTVBfTE9XMjMKCQkgKi8KCQlkYXRhLT50ZW1wWzBdIHw9ICh2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LAoJCQkJCQkgICAgIFZJQTY4NkFfUkVHX1RFTVBfTE9XMSkKCQkJCSAgJiAweGMwKSA+PiA2OwoJCWRhdGEtPnRlbXBbMV0gfD0KCQkgICAgKHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX1RFTVBfTE9XMjMpICYKCQkgICAgIDB4MzApID4+IDQ7CgkJZGF0YS0+dGVtcFsyXSB8PQoJCSAgICAodmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfVEVNUF9MT1cyMykgJgoJCSAgICAgMHhjMCkgPj4gNjsKCgkJaSA9IHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX0ZBTkRJVik7CgkJZGF0YS0+ZmFuX2RpdlswXSA9IChpID4+IDQpICYgMHgwMzsKCQlkYXRhLT5mYW5fZGl2WzFdID0gaSA+PiA2OwoJCWRhdGEtPmFsYXJtcyA9CgkJICAgIHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsCgkJCQkgICAgICAgVklBNjg2QV9SRUdfQUxBUk0xKSB8CgkJICAgICh2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19BTEFSTTIpIDw8IDgpOwoJCWRhdGEtPmxhc3RfdXBkYXRlZCA9IGppZmZpZXM7CgkJZGF0YS0+dmFsaWQgPSAxOwoJfQoKCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CgoJcmV0dXJuIGRhdGE7Cn0KCnN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB2aWE2ODZhX3BjaV9pZHNbXSA9IHsKICAgICAgIHsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfODJDNjg2XzQpIH0sCiAgICAgICB7IDAsIH0KfTsKCk1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCB2aWE2ODZhX3BjaV9pZHMpOwoKc3RhdGljIGludCBfX2RldmluaXQgdmlhNjg2YV9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCnsKICAgICAgIHUxNiB2YWw7CiAgICAgICBpbnQgYWRkciA9IDA7CgogICAgICAgaWYgKFBDSUJJT1NfU1VDQ0VTU0ZVTCAhPQogICAgICAgICAgIHBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgVklBNjg2QV9CQVNFX1JFRywgJnZhbCkpCiAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOwoKICAgICAgIGFkZHIgPSB2YWwgJiB+KFZJQTY4NkFfRVhURU5UIC0gMSk7CiAgICAgICBpZiAoYWRkciA9PSAwICYmIGZvcmNlX2FkZHIgPT0gMCkgewogICAgICAgICAgICAgICBkZXZfZXJyKCZkZXYtPmRldiwiYmFzZSBhZGRyZXNzIG5vdCBzZXQgLSB1cGdyYWRlIEJJT1Mgb3IgdXNlIGZvcmNlX2FkZHI9MHhhZGRyXG4iKTsKICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CiAgICAgICB9CiAgICAgICBpZiAoZm9yY2VfYWRkcikKICAgICAgICAgICAgICAgYWRkciA9IGZvcmNlX2FkZHI7ICAgICAgLyogc28gZGV0ZWN0IHdpbGwgZ2V0IGNhbGxlZCAqLwoKICAgICAgIGlmICghYWRkcikgewogICAgICAgICAgICAgICBkZXZfZXJyKCZkZXYtPmRldiwiTm8gVmlhIDY4NkEgc2Vuc29ycyBmb3VuZC5cbiIpOwogICAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKICAgICAgIH0KICAgICAgIG5vcm1hbF9pc2FbMF0gPSBhZGRyOwoKCXNfYnJpZGdlID0gcGNpX2Rldl9nZXQoZGV2KTsKCWlmIChpMmNfYWRkX2RyaXZlcigmdmlhNjg2YV9kcml2ZXIpKSB7CgkJcGNpX2Rldl9wdXQoc19icmlkZ2UpOwoJCXNfYnJpZGdlID0gTlVMTDsKCX0KCgkvKiBBbHdheXMgcmV0dXJuIGZhaWx1cmUgaGVyZS4gIFRoaXMgaXMgdG8gYWxsb3cgb3RoZXIgZHJpdmVycyB0byBiaW5kCgkgKiB0byB0aGlzIHBjaSBkZXZpY2UuICBXZSBkb24ndCByZWFsbHkgd2FudCB0byBoYXZlIGNvbnRyb2wgb3ZlciB0aGUKCSAqIHBjaSBkZXZpY2UsIHdlIG9ubHkgd2FudGVkIHRvIHJlYWQgYXMgZmV3IHJlZ2lzdGVyIHZhbHVlcyBmcm9tIGl0LgoJICovCglyZXR1cm4gLUVOT0RFVjsKfQoKc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHZpYTY4NmFfcGNpX2RyaXZlciA9IHsKICAgICAgIC5uYW1lCQk9ICJ2aWE2ODZhIiwKICAgICAgIC5pZF90YWJsZQk9IHZpYTY4NmFfcGNpX2lkcywKICAgICAgIC5wcm9iZQkJPSB2aWE2ODZhX3BjaV9wcm9iZSwKfTsKCnN0YXRpYyBpbnQgX19pbml0IHNtX3ZpYTY4NmFfaW5pdCh2b2lkKQp7CiAgICAgICByZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmdmlhNjg2YV9wY2lfZHJpdmVyKTsKfQoKc3RhdGljIHZvaWQgX19leGl0IHNtX3ZpYTY4NmFfZXhpdCh2b2lkKQp7CglwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnZpYTY4NmFfcGNpX2RyaXZlcik7CglpZiAoc19icmlkZ2UgIT0gTlVMTCkgewoJCWkyY19kZWxfZHJpdmVyKCZ2aWE2ODZhX2RyaXZlcik7CgkJcGNpX2Rldl9wdXQoc19icmlkZ2UpOwoJCXNfYnJpZGdlID0gTlVMTDsKCX0KfQoKTU9EVUxFX0FVVEhPUigiS3n2c3RpIE3kbGtraSA8a21hbGtraUBjYy5odXQuZmk+LCAiCiAgICAgICAgICAgICAgIk1hcmsgU3R1ZGViYWtlciA8bWRzeHl6MTIzQHlhaG9vLmNvbT4gIgogICAgICAgICAgICAgImFuZCBCb2IgRG91Z2hlcnR5IDxib2JkQHN0YW5mb3JkLmVkdT4iKTsKTU9EVUxFX0RFU0NSSVBUSU9OKCJWSUEgNjg2QSBTZW5zb3IgZGV2aWNlIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKCm1vZHVsZV9pbml0KHNtX3ZpYTY4NmFfaW5pdCk7Cm1vZHVsZV9leGl0KHNtX3ZpYTY4NmFfZXhpdCk7Cg==