LyoKICogVVNCIEZUREkgU0lPIGRyaXZlcgogKgogKiAJQ29weXJpZ2h0IChDKSAxOTk5IC0gMjAwMQogKiAJICAgIEdyZWcgS3JvYWgtSGFydG1hbiAoZ3JlZ0Brcm9haC5jb20pCiAqICAgICAgICAgIEJpbGwgUnlkZXIgKGJyeWRlckBzZ2kuY29tKQogKglDb3B5cmlnaHQgKEMpIDIwMDIKICoJICAgIEt1YmEgT2JlciAoa3ViYUBtYXJlaW1icml1bS5vcmcpCiAqCiAqIAlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiAJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIAkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBTZWUgRG9jdW1lbnRhdGlvbi91c2IvdXNiLXNlcmlhbC50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdXNpbmcgdGhpcyBkcml2ZXIKICoKICogU2VlIGh0dHA6Ly9mdGRpLXVzYi1zaW8uc291cmNlZm9yZ2UubmV0IGZvciB1cHRvIGRhdGUgdGVzdGluZyBpbmZvCiAqCWFuZCBleHRyYSBkb2N1bWVudGF0aW9uCiAqCiAqICgyMS9KdWwvMjAwNCkgSWFuIEFiYm90dAogKiAgICAgIEluY29ycG9yYXRlZCBTdGV2ZW4gVHVybmVyJ3MgY29kZSB0byBhZGQgc3VwcG9ydCBmb3IgdGhlIEZUMjIzMkMgY2hpcC4KICogICAgICBUaGUgcHJlbGltaWxhcnkgcG9ydCB0byB0aGUgMi42IGtlcm5lbCB3YXMgYnkgUnVzIFYuIEJydXNoa29mZi4gIEkgaGF2ZQogKiAgICAgIGZpeGVkIGEgY291cGxlIG9mIHRoaW5ncy4KICoKICogKDI3L01heS8yMDA0KSBJYW4gQWJib3R0CiAqICAgICAgSW1wcm92ZWQgdGhyb3R0bGluZyBjb2RlLCBtb3N0bHkgc3RvbGVuIGZyb20gdGhlIFdoaXRlSEVBVCBkcml2ZXIuCiAqCiAqICgyNi9NYXIvMjAwNCkgSmFuIENhcGVrCiAqICAgICAgQWRkZWQgUElEJ3MgZm9yIElDRC1VMjAvSUNELVU0MCAtIGluY2lyY3VpdCBQSUMgZGVidWdnZXJzIGZyb20gQ0NTIEluYy4KICoKICogKDA5L0ZlYi8yMDA0KSBJYW4gQWJib3R0CiAqICAgICAgQ2hhbmdlZCBmdWxsIG5hbWUgb2YgVVNCLVVJUlQgZGV2aWNlIHRvIGF2b2lkICIvIiBjaGFyYWN0ZXIuCiAqICAgICAgQWRkZWQgRlRESSdzIGFsdGVybmF0ZSBQSUQgKDB4NjAwNikgZm9yIEZUMjMyLzI0NSBkZXZpY2VzLgogKiAgICAgIEFkZGVkIFBJRCBmb3IgIkVMViBVU0IgTW9kdWxlIFVPMTAwIiBmcm9tIFN0ZWZhbiBGcmluZ3MuCiAqIAogKiAoMjEvT2N0LzIwMDMpIElhbiBBYmJvdHQKICogICAgICBSZW5hbWVkIHNvbWUgVklEL1BJRCBtYWNyb3MgZm9yIE1hdHJpeCBPcmJpdGFsIGFuZCBQZXJsZSBTeXN0ZW1zCiAqICAgICAgZGV2aWNlcy4gIFJlbW92ZWQgTWF0cml4IE9yYml0YWwgYW5kIFBlcmxlIFN5c3RlbXMgZGV2aWNlcyBmcm9tIHRoZQogKiAgICAgIDhVMjMyQU0gZGV2aWNlIHRhYmxlLCBidXQgbGVmdCB0aGVtIGluIHRoZSBGVDIzMkJNIHRhYmxlLCBhcyB0aGV5IGFyZQogKiAgICAgIGtub3duIHRvIHVzZSBvbmx5IEZUMjMyQk0uCiAqCiAqICgxNy9PY3QvMjAwMykgU2NvdHQgQWxsZW4KICogICAgICBBZGRlZCB2aWQvcGlkIGZvciBQZXJsZSBTeXN0ZW1zIFVsdHJhUG9ydCBVU0Igc2VyaWFsIGNvbnZlcnRlcnMKICoKICogKDIxL1NlcC8yMDAzKSBJYW4gQWJib3R0CiAqICAgICAgQWRkZWQgVklEL1BJRCBmb3IgT21uaWRpcmVjdGlvbmFsIENvbnRyb2wgVGVjaG5vbG9neSBVUzEwMSBVU0IgdG8KICogICAgICBSUy0yMzIgYWRhcHRlciAoYWxzbyByZWJhZGdlZCBhcyBEaWNrIFNtaXRoIEVsZWN0cm9uaWNzIFhINjM4MSkuCiAqICAgICAgVklEL1BJRCBzdXBwbGllZCBieSBEb25hbGQgR29yZG9uLgogKgogKiAoMTkvQXVnLzIwMDMpIElhbiBBYmJvdHQKICogICAgICBGcmVlZCB1cmIncyB0cmFuc2ZlciBidWZmZXIgaW4gd3JpdGUgYnVsayBjYWxsYmFjay4KICogICAgICBPbWl0dGVkIHNvbWUgcGFyYW5vaWQgY2hlY2tzIGluIHdyaXRlIGJ1bGsgY2FsbGJhY2sgdGhhdCBkb24ndCBtYXR0ZXIuCiAqICAgICAgU2NoZWR1bGVkIHdvcmsgaW4gd3JpdGUgYnVsayBjYWxsYmFjayByZWdhcmRsZXNzIG9mIHBvcnQncyBvcGVuIGNvdW50LgogKgogKiAoMDUvQXVnLzIwMDMpIElhbiBBYmJvdHQKICogICAgICBBZGRlZCBWSUQvUElEIGZvciBJRCBURUNIIElEVDEyMjFVIFVTQiB0byBSUy0yMzIgYWRhcHRlci4KICogICAgICBWSUQvUElEIHByb3ZpZGVkIGJ5IFN0ZXZlIEJyaWdncy4KICoKICogKDIzL0p1bC8yMDAzKSBJYW4gQWJib3R0CiAqICAgICAgQWRkZWQgUElEcyBmb3IgQ3J5c3RhbEZvbnR6IDU0NywgNjMzLCA2MzEsIDYzNSwgNjQwIGFuZCA2NDAgZnJvbQogKiAgICAgIFdheW5lIFd5bHVwc2tpLgogKgogKiAoMTAvSnVsLzIwMDMpIERhdmlkIEdsYW5jZQogKiAgICAgIEFkZGVkIFBJRCBmb3IgRFNTLTIwIFN5bmNTdGF0aW9uIGNyYWRsZSBmb3IgU29ueS1Fcmljc3NvbiBQODAwLgogKgogKiAoMjcvSnVuLzIwMDMpIElhbiBBYmJvdHQKICoJUmV3b3JrZWQgdGhlIHVyYiBoYW5kbGluZyBsb2dpYy4gIFdlIGhhdmUgbm8gbW9yZSBwb29sLCBidXQgZHluYW1pY2FsbHkKICoJYWxsb2NhdGUgdGhlIHVyYiBhbmQgdGhlIHRyYW5zZmVyIGJ1ZmZlciBvbiB0aGUgZmx5LiAgSW4gdGVzdGluZyB0aGlzCiAqCWRvZXMgbm90IGluY3VyZSBhbnkgbWVhc3VyYWJsZSBvdmVyaGVhZC4gIFRoaXMgYWxzbyByZWxpZXMgb24gdGhlIGZhY3QKICoJdGhhdCB3ZSBoYXZlIHByb3BlciByZWZlcmVuY2UgY291bnRpbmcgbG9naWMgZm9yIHVyYnMuICBJIG5pY2tlZCB0aGlzCiAqCWZyb20gR3JlZyBLSCdzIFZpc29yIGRyaXZlci4KICogICAgICAKICogKDIzL0p1bi8yMDAzKSBJYW4gQWJib3R0CiAqICAgICAgUmVkdWNlZCBmbGlwIGJ1ZmZlciBwdXNoZXMgYW5kIGNvcnJlY3RlZCBhIGRhdGEgbGVuZ3RoIHRlc3QgaW4KICogICAgICBmdGRpX3JlYWRfYnVsa19jYWxsYmFjay4KICogICAgICBEZWZlcmVyZW5jZSBwb2ludGVycyBhZnRlciBhbnkgcGFyYW5vaWQgY2hlY2tzLCBub3QgYmVmb3JlLgogKgogKiAoMjEvSnVuLzIwMDMpIEVyaWsgTnlncmVuCiAqICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgSG9tZSBFbGVjdHJvbmljcyBUaXJhLTEgSVIgdHJhbmNlaXZlciB1c2luZyBGVDIzMkJNIGNoaXAuCiAqICAgICAgU2VlIDxodHRwOi8vd3d3LmhvbWUtZWxlY3Ryby5jb20vdGlyYTEuaHRtPi4gIE9ubHkgb3BlcmF0ZXMgcHJvcGVybHkgCiAqICAgICAgYXQgMTAwMDAwIGFuZCBSVFMtQ1RTLCBzbyBzZXQgY3VzdG9tIGRpdmlzb3IgbW9kZSBvbiBzdGFydHVwLgogKiAgICAgIEFsc28gZm9yY2UgdGhlIFRpcmEtMSBhbmQgVVNCLVVJUlQgdG8gb25seSB1c2UgdGhlaXIgY3VzdG9tIGJhdWQgcmF0ZXMuCiAqCiAqICgxOC9KdW4vMjAwMykgSWFuIEFiYm90dAogKiAgICAgIEFkZGVkIERldmljZSBJRCBvZiB0aGUgVVNCIHJlbGFpcyBmcm9tIFJ1ZG9sZiBHdWdsZXIgKGJhY2twb3J0ZWQgZnJvbQogKiAgICAgIFBoaWxpcHAgR/xocmluZydzIHBhdGNoIGZvciAyLjUueCBrZXJuZWwpLgogKiAgICAgIE1vdmVkIHJlYWQgdHJhbnNmZXIgYnVmZmVyIHJlYWxsb2NhdGlvbiBpbnRvIHN0YXJ0dXAgZnVuY3Rpb24uCiAqICAgICAgRnJlZSBleGlzdGluZyB3cml0ZSB1cmIgYW5kIHRyYW5zZmVyIGJ1ZmZlciBpbiBzdGFydHVwIGZ1bmN0aW9uLgogKiAgICAgIE9ubHkgdXNlIHVyYnMgaW4gd3JpdGUgdXJiIHBvb2wgdGhhdCB3ZXJlIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQuCiAqICAgICAgTW92ZWQgc29tZSBjb25zdGFudCBtYWNyb3Mgb3V0IG9mIGZ1bmN0aW9ucy4KICogICAgICBNaW5vciB3aGl0ZXNwYWNlIGFuZCBjb21tZW50IGNoYW5nZXMuCiAqCiAqICgxMi9KdW4vMjAwMykgRGF2aWQgTm9yd29vZAogKiAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIFVTQi1VSVJUIElSIHRyYW5jZWl2ZXIgdXNpbmcgOFUyMzJBTSBjaGlwLgogKiAgICAgIFNlZSA8aHR0cDovL2hvbWUuZWFydGhsaW5rLm5ldC9+anJoZWVzL1VTQlVJUlQvaW5kZXguaHRtPi4gIE9ubHkKICogICAgICBvcGVyYXRlcyBwcm9wZXJseSBhdCAzMTI1MDAsIHNvIHNldCBjdXN0b20gZGl2aXNvciBtb2RlIG9uIHN0YXJ0dXAuCiAqCiAqICgxMi9KdW4vMjAwMykgSWFuIEFiYm90dAogKiAgICAgIEFkZGVkIFNlYWxldmVsIFNlYUxJTksrIDIxMHgsIDIyMHgsIDI0MHgsIDI4MHggdmlkL3BpZHMgZnJvbSBUdWFuIEhvYW5nCiAqICAgICAgLSBJJ3ZlIGVsaW1pbmF0ZWQgc29tZSB0aGF0IGRvbid0IHNlZW0gdG8gZXhpc3QhCiAqICAgICAgQWRkZWQgSG9tZSBFbGVjdHJvbmljcyBUaXJhLTEgSVIgdHJhbnNjZWl2ZXIgcGlkIGZyb20gQ2hyaXMgSG9ybgogKiAgICAgIFNvbWUgd2hpdGVzcGFjZS9jb2Rpbmctc3R5bGUgY2xlYW51cHMKICoKICogKDExL0p1bi8yMDAzKSBJYW4gQWJib3R0CiAqICAgICAgRml4ZWQgdW5zYWZlIHNwaW5sb2NrIHVzYWdlIGluIGZ0ZGlfd3JpdGUKICoKICogKDI0L0ZlYi8yMDAzKSBSaWNoYXJkIFNob290ZXIKICogICAgICBJbmNyZWFzZSByZWFkIGJ1ZmZlciBzaXplIHRvIGltcHJvdmUgcmVhZCBzcGVlZHMgYXQgaGlnaGVyIGJhdWQgcmF0ZXMKICogICAgICAoc3BlY2lmaWNhbGx5IHRlc3RlZCB3aXRoIHVwIHRvIDFNYi9zZWMgYXQgMS41TSBiYXVkKQogKgogKiAoMjMvRmViLzIwMDMpIEpvaG4gV2lsa2lucwogKiAgICAgIEFkZGVkIFhvbi94b2ZmIGZsb3cgY29udHJvbCAoYWN0aXZhdGluZyBzdXBwb3J0IGluIHRoZSBmdGRpIGRldmljZSkKICogICAgICBBZGRlZCB2aWQvcGlkIGZvciBWaWRlb25ldHdvcmtzL0hvbWVjaG9pY2UgKFVLIElTUCkKICoKICogKDIzL0ZlYi8yMDAzKSBCaWxsIFJ5ZGVyCiAqICAgICAgQWRkZWQgbWF0cml4IG9yYiBkZXZpY2UgdmlkL3BpZHMgZnJvbSBXYXluZSBXeWx1cHNraQogKgogKiAoMTkvRmViLzIwMDMpIElhbiBBYmJvdHQKICogICAgICBGb3IgVElPQ1NTRVJJQUwsIHNldCBhbHRfc3BlZWQgdG8gMCB3aGVuIEFTWU5DX1NQRF9NQVNLIHZhbHVlIGhhcwogKiAgICAgIGNoYW5nZWQgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gQVNZTkNfU1BEX0hJLCBBU1lOQ19TUERfVkhJLAogKiAgICAgIEFTWU5DX1NQRF9TSEkgb3IgQVNZTkNfU1BEX1dBUlAuICBBbHNvLCB1bmxlc3MgQVNZTkNfU1BEX0NVU1QgaXMgaW4KICogICAgICBmb3JjZSwgZG9uJ3QgYm90aGVyIGNoYW5naW5nIGJhdWQgcmF0ZSB3aGVuIGN1c3RvbV9kaXZpc29yIGhhcyBjaGFuZ2VkLgogKgogKiAoMTgvRmViLzIwMDMpIElhbiBBYmJvdHQKICogICAgICBGaXhlZCBUSU9DTUdFVCBoYW5kbGluZyB0byBpbmNsdWRlIHN0YXRlIG9mIERUUiBhbmQgUlRTLCB0aGUgc3RhdGUKICogICAgICBvZiB3aGljaCBhcmUgbm93IHNhdmVkIGJ5IHNldF9kdHIoKSBhbmQgc2V0X3J0cygpLgogKiAgICAgIEZpeGVkIGltcHJvcGVyIHN0b3JhZ2UgY2xhc3MgZm9yIGJ1ZiBpbiBzZXRfZHRyKCkgYW5kIHNldF9ydHMoKS4KICogICAgICBBZGRlZCBGVDIzMkJNIGNoaXAgdHlwZSBhbmQgc3VwcG9ydCBmb3IgaXRzIGV4dHJhIGJhdWQgcmF0ZXMgKGNvbXBhcmVkCiAqICAgICAgdG8gRlQ4VTIzMkFNKS4KICogICAgICBUb29rIGFjY291bnQgb2Ygc3BlY2lhbCBjYXNlIGRpdmlzb3IgdmFsdWVzIGZvciBoaWdoZXN0IGJhdWQgcmF0ZXMgb2YKICogICAgICBGVDhVMjMyQU0gYW5kIEZUMjMyQk0uCiAqICAgICAgRm9yIFRJT0NTU0VSSUFMLCBmb3JjZWQgYWx0X3NwZWVkIHRvIDAgd2hlbiBBU1lOQ19TUERfQ1VTVCBrbHVkZ2UgdXNlZCwKICogICAgICBhcyBwcmV2aW91cyBhbHRfc3BlZWQgc2V0dGluZyBpcyBub3cgc3RhbGUuCiAqICAgICAgTW92ZWQgc3RhcnR1cCBjb2RlIGNvbW1vbiBiZXR3ZWVuIHRoZSBzdGFydHVwIHJvdXRpbmVzIGZvciB0aGUKICogICAgICBkaWZmZXJlbnQgY2hpcCB0eXBlcyBpbnRvIGEgY29tbW9uIHN1YnJvdXRpbmUuCiAqCiAqICgxNy9GZWIvMjAwMykgQmlsbCBSeWRlcgogKiAgICAgIEFkZGVkIHdyaXRlIHVyYiBidWZmZXIgcG9vbCBvbiBhIHBlciBkZXZpY2UgYmFzaXMKICogICAgICBBZGRlZCBtb3JlIGNoZWNraW5nIGZvciBvcGVuIGZpbGUgb24gY2FsbGJhY2tzIChmaXhlZCBPT1BTKQogKiAgICAgIEFkZGVkIENyeXN0YWxGb250eiA2MzIgYW5kIDYzNCBQSURzIAogKiAgICAgICAgICh0aGFueCB0byBDcnlzdGFsRm9udHogZm9yIHRoZSBzYW1wbGUgZGV2aWNlcyAtIHRoZXkgZmx1c2hlZCBvdXQKICogICAgICAgICAgIHNvbWUgZHJpdmVyIGJ1Z3MpCiAqICAgICAgTWlub3IgZGVidWdnaW5nIG1lc3NhZ2UgY2hhbmdlcwogKiAgICAgIEFkZGVkIHRocm90dGxlLCB1bnRocm90dGxlIGFuZCBjaGFyc19pbl9idWZmZXIgZnVuY3Rpb25zCiAqICAgICAgRml4ZWQgRlRESV9TSU8gKHRoZSBvcmlnaW5hbCBkZXZpY2UpIGJ1ZwogKiAgICAgIEZpeGVkIHNvbWUgc2h1dGRvd24gaGFuZGxpbmcKICogICAgICAKICogCiAqIAogKiAKICogKDA3L0p1bi8yMDAyKSBLdWJhIE9iZXIKICoJQ2hhbmdlZCBGVERJX1NJT19CQVNFX0JBVURfVE9fRElWSVNPUiBtYWNybyBpbnRvIGZ0ZGlfYmF1ZF90b19kaXZpc29yCiAqCWZ1bmN0aW9uLiBJdCB3YXMgZ2V0dGluZyB0b28gY29tcGxleC4KICoJRml4IHRoZSBkaXZpc29yIGNhbGN1bGF0aW9uIGxvZ2ljIHdoaWNoIHdhcyBzZXR0aW5nIGRpdmlzb3Igb2YgMC4xMjUKICoJaW5zdGVhZCBvZiAwLjUgZm9yIGZyYWN0aW9uYWwgcGFydHMgb2YgZGl2aXNvciBlcXVhbCB0byA1LzgsIDYvOCwgNy84LgogKglBbHNvIG1ha2UgaXQgYnVtcCB1cCB0aGUgZGl2aXNvciB0byBuZXh0IGludGVnZXIgaW4gY2FzZSBvZiA3LzggLSBpdCdzCiAqCWEgYmV0dGVyIGFwcHJveGltYXRpb24uCiAqCiAqICgyNS9KdWwvMjAwMikgQmlsbCBSeWRlciBpbnNlcnRlZCBEbWl0cmkncyBUSU9DTUlXQUlUIHBhdGNoCiAqICAgICAgTm90IHRlc3RlZCBieSBtZSBidXQgaXQgZG9lc24ndCBicmVhayBhbnl0aGluZyBJIHVzZS4KICogCiAqICgwNC9KYW4vMjAwMikgS3ViYSBPYmVyCiAqCUltcGxlbWVudGVkIDM4NDAwIGJhdWRyYXRlIGtsdWRnZSwgd2hlcmUgaXQgY2FuIGJlIHN1YnN0aXR1dGVkIHdpdGggb3RoZXIKICoJICB2YWx1ZXMuIFRoYXQncyB0aGUgb25seSB3YXkgdG8gc2V0IGN1c3RvbSBiYXVkcmF0ZXMuCiAqCUltcGxlbWVudGVkIFRJT0NTU0VSSUFMLCBUSU9DR1NFUklBTCBpb2N0bCdzIHNvIHRoYXQgc2V0c2VyaWFsIGlzIGhhcHB5LgogKglGSVhNRTogYm90aCBiYXVkcmF0ZSB0aGluZ3Mgc2hvdWxkIGV2ZW50dWFsbHkgZ28gdG8gdXNic2VyaWFsLmMgYXMgb3RoZXIKICoJICBkZXZpY2VzIG1heSBuZWVkIHRoYXQgZnVuY3Rpb25hbGl0eSB0b28uIEFjdHVhbGx5LCBpdCBjYW4gcHJvYmFibHkgYmUKICoJICBtZXJnZWQgaW4gc2VyaWFsLmMgc29tZWhvdyAtIHRvbyBtYW55IGRyaXZlcnMgcmVwZWF0IHRoaXMgY29kZSBvdmVyCiAqCSAgYW5kIG92ZXIuCiAqCUZpeGVkIGJhdWRyYXRlIGZvcmdldGZ1bG5lc3MgLSBvcGVuKCkgdXNlZCB0byByZXNldCBiYXVkcmF0ZSB0byA5NjAwIGV2ZXJ5IHRpbWUuCiAqCURpdmlzb3JzIGZvciBiYXVkcmF0ZXMgYXJlIGNhbGN1bGF0ZWQgYnkgYSBtYWNyby4KICoJU21hbGwgY29kZSBjbGVhbnVwcy4gVWdseSB3aGl0ZXNwYWNlIGNoYW5nZXMgZm9yIFBsYXRvJ3Mgc2FrZSBvbmx5IDstXS4KICoKICogKDA0L05vdi8yMDAxKSBCaWxsIFJ5ZGVyCiAqCUZpeGVkIGJ1ZyBpbiByZWFkX2J1bGtfY2FsbGJhY2sgd2hlcmUgaW5jb3JyZWN0IHVyYiBidWZmZXIgd2FzIHVzZWQuCiAqCUNsZWFuZWQgdXAgd3JpdGUgb2Zmc2V0IGNhbGN1bGF0aW9uCiAqCUFkZGVkIHdyaXRlX3Jvb20gc2luY2UgZGVmYXVsdCB2YWx1ZXMgY2FuIGJlIGluY29ycmVjdCBmb3Igc2lvCiAqCUNoYW5nZWQgd3JpdGVfYnVsa19jYWxsYmFjayB0byB1c2Ugc2FtZSBxdWV1ZV90YXNrIGFzIG90aGVyIGRyaXZlcnMKICogICAgICAgICh0aGUgcHJldmlvdXMgdmVyc2lvbiBjYXVzZWQgcGFuaWNzKQogKglSZW1vdmVkIHBvcnQgaXRlcmF0aW9uIGNvZGUgc2luY2UgdGhlIGRldmljZSBvbmx5IGhhcyBvbmUgSS9PIHBvcnQgYW5kIGl0CiAqCSAgd2FzIHdyb25nIGFueXdheS4KICogCiAqICgzMS9NYXkvMjAwMSkgZ2toCiAqCVN3aXRjaGVkIGZyb20gdXNpbmcgc3BpbmxvY2sgdG8gYSBzZW1hcGhvcmUsIHdoaWNoIGZpeGVzIGxvdHMgb2YgcHJvYmxlbXMuCiAqCiAqICgyMy9NYXkvMjAwMSkgICBCaWxsIFJ5ZGVyCiAqCUFkZGVkIHJ1bnRpbWUgZGVidWcgcGF0Y2ggKHRoYW54IFR5c29uIEQgU2F3eWVyKS4KICoJQ2xlYW5lZCB1cCBjb21tZW50cyBmb3IgOFUyMzIKICoJQWRkZWQgcGFyaXR5LCBmcmFtaW5nIGFuZCBvdmVycnVuIGVycm9yIGhhbmRsaW5nCiAqCUFkZGVkIHJlY2VpdmUgYnJlYWsgaGFuZGxpbmcuCiAqIAogKiAoMDQvMDgvMjAwMSkgZ2IKICoJSWRlbnRpZnkgdmVyc2lvbiBvbiBtb2R1bGUgbG9hZC4KICogICAgICAgCiAqICgxOC9NYXJjaC8yMDAxKSBCaWxsIFJ5ZGVyCiAqCShOb3QgcmVsZWFzZWQpCiAqCUFkZGVkIHNlbmQgYnJlYWsgaGFuZGxpbmcuIChyZXF1aXJlcyBrZXJuZWwgcGF0Y2ggdG9vKQogKglGaXhlZCA4VTIzMkFNIGhhcmR3YXJlIFJUUy9DVFMgZXRjIHN0YXR1cyByZXBvcnRpbmcuCiAqCUFkZGVkIGZsaXBidWYgZml4IGNvcGllZCBmcm9tIGdlbmVyaWMgZGV2aWNlCiAqIAogKiAoMTIvMy8yMDAwKSBCaWxsIFJ5ZGVyCiAqCUFkZGVkIHN1cHBvcnQgZm9yIDhVMjMyQU0gZGV2aWNlLgogKglNb3ZlZCBQSUQgYW5kIFZJRHMgaW50byBoZWFkZXIgZmlsZSBvbmx5LgogKglUdXJuZWQgb24gbG93LWxhdGVuY3kgZm9yIHRoZSB0dHkgKGRldmljZSB3aWxsIGRvIGhpZ2ggYmF1ZHJhdGVzKQogKglBZGRlZCBzaHV0ZG93biByb3V0aW5lIHRvIGNsb3NlIGZpbGVzIHdoZW4gZGV2aWNlIHJlbW92ZWQuCiAqCU1vcmUgZGVidWcgYW5kIGVycm9yIG1lc3NhZ2UgY2xlYW51cHMuCiAqCiAqICgxMS8xMy8yMDAwKSBCaWxsIFJ5ZGVyCiAqCUFkZGVkIHNwaW5sb2NrIHByb3RlY3RlZCBvcGVuIGNvZGUgYW5kIGNsb3NlIGNvZGUuCiAqCU11bHRpcGxlIG9wZW5zIHdvcmsgKHNvcnQgb2YgLSBzZWUgd2VicGFnZSBtZW50aW9uZWQgYWJvdmUpLgogKglDbGVhbmVkIHVwIGNvbW1lbnRzLiBSZW1vdmVkIG11bHRpcGxlIFBJRC9WSUQgZGVmaW5pdGlvbnMuCiAqCUZhY3RvcmlzZWQgY3RzL2R0ciBjb2RlCiAqCU1hZGUgdXNlIG9mIF9fRlVOQ1RJT05fXyBpbiBkYmcncwogKiAgICAgIAogKiAoMTEvMDEvMjAwMCkgQWRhbSBKLiBSaWNodGVyCiAqCXVzYl9kZXZpY2VfaWQgdGFibGUgc3VwcG9ydAogKiAKICogKDEwLzA1LzIwMDApIGdraAogKglGaXhlZCBidWcgd2l0aCB1cmItPmRldiBub3QgYmVpbmcgc2V0IHByb3Blcmx5LCBub3cgdGhhdCB0aGUgdXNiCiAqCWNvcmUgbmVlZHMgaXQuCiAqIAogKiAoMDkvMTEvMjAwMCkgZ2toCiAqCVJlbW92ZWQgREVCVUcgI2lmZGVmcyB3aXRoIGNhbGwgdG8gdXNiX3NlcmlhbF9kZWJ1Z19kYXRhCiAqCiAqICgwNy8xOS8yMDAwKSBna2gKICoJQWRkZWQgbW9kdWxlX2luaXQgYW5kIG1vZHVsZV9leGl0IGZ1bmN0aW9ucyB0byBoYW5kbGUgdGhlIGZhY3QgdGhhdCB0aGlzCiAqCWRyaXZlciBpcyBhIGxvYWRhYmxlIG1vZHVsZSBub3cuCiAqCiAqICgwNC8wNC8yMDAwKSBCaWxsIFJ5ZGVyIAogKglGaXhlZCBidWdzIGluIFRDR0VUL1RDU0VUIGlvY3RscyAoYnkgcmVtb3ZpbmcgdGhlbSAtIHRoZXkgYXJlCiAqICAgICAgICBoYW5kbGVkIGVsc2V3aGVyZSBpbiB0aGUgdHR5IGlvIGRyaXZlciBjaGFpbikuCiAqCiAqICgwMy8zMC8yMDAwKSBCaWxsIFJ5ZGVyIAogKglJbXBsZW1lbnRlZCBsb3RzIG9mIGlvY3RscwogKglGaXhlZCBhIHJhY2UgY29uZGl0aW9uIGluIHdyaXRlCiAqCUNoYW5nZWQgc29tZSBkYmcncyB0byBlcnJzCiAqCiAqICgwMy8yNi8yMDAwKSBna2gKICoJU3BsaXQgZHJpdmVyIHVwIGludG8gZGV2aWNlIHNwZWNpZmljIHBpZWNlcy4KICoKICovCgovKiBCaWxsIFJ5ZGVyIC0gYnJ5ZGVyQHNnaS5jb20gLSB3cm90ZSB0aGUgRlRESV9TSU8gaW1wbGVtZW50YXRpb24gKi8KLyogVGhhbnggdG8gRlRESSBmb3Igc28ga2luZGx5IHByb3ZpZGluZyBkZXRhaWxzIG9mIHRoZSBwcm90b2NvbCByZXF1aXJlZCAqLwovKiAgIHRvIHRhbGsgdG8gdGhlIGRldmljZSAqLwovKiBUaGFueCB0byBna2ggYW5kIHRoZSByZXN0IG9mIHRoZSB1c2IgZGV2IGdyb3VwIGZvciBhbGwgY29kZSBJIGhhdmUgYXNzaW1pbGF0ZWQgOi0pICovCgojaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiNpbmNsdWRlIDxsaW51eC90dHkuaD4KI2luY2x1ZGUgPGxpbnV4L3R0eV9kcml2ZXIuaD4KI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgojaW5jbHVkZSA8bGludXgvdXNiLmg+CiNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KI2luY2x1ZGUgInVzYi1zZXJpYWwuaCIKI2luY2x1ZGUgImZ0ZGlfc2lvLmgiCgovKgogKiBWZXJzaW9uIEluZm9ybWF0aW9uCiAqLwojZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2MS40LjEiCiNkZWZpbmUgRFJJVkVSX0FVVEhPUiAiR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4sIEJpbGwgUnlkZXIgPGJyeWRlckBzZ2kuY29tPiwgS3ViYSBPYmVyIDxrdWJhQG1hcmVpbWJyaXVtLm9yZz4iCiNkZWZpbmUgRFJJVkVSX0RFU0MgIlVTQiBGVERJIFNlcmlhbCBDb252ZXJ0ZXJzIERyaXZlciIKCnN0YXRpYyBpbnQgZGVidWc7CgpzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgaWRfdGFibGVfc2lvIFtdID0gewoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1NJT19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoTU9CSUxJVFlfVklELCBNT0JJTElUWV9VU0JfU0VSSUFMX1BJRCkgfSwKCXsgfQkJCQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCn07CgovKgogKiBUaGUgOFUyMzJBTSBoYXMgdGhlIHNhbWUgQVBJIGFzIHRoZSBzaW8gZXhjZXB0IGZvcjoKICogLSBpdCBjYW4gc3VwcG9ydCBNVUNIIGhpZ2hlciBiYXVkcmF0ZXM7IHVwIHRvOgogKiAgIG8gOTIxNjAwIGZvciBSUzIzMiBhbmQgMjAwMDAwMCBmb3IgUlM0MjIvNDg1IGF0IDQ4TUh6CiAqICAgbyAyMzA0MDAgYXQgMTJNSHoKICogICBzbyAuLiA4VTIzMkFNJ3MgYmF1ZHJhdGUgc2V0dGluZyBjb2RlcyBhcmUgZGlmZmVyZW50CiAqIC0gaXQgaGFzIGEgdHdvIGJ5dGUgc3RhdHVzIGNvZGUuCiAqIC0gaXQgcmV0dXJucyBjaGFyYWN0ZXJzIGV2ZXJ5IDE2bXMgKHRoZSBGVERJIGRvZXMgaXQgZXZlcnkgNDBtcykKICoKICogdGhlIGJjZERldmljZSB2YWx1ZSBpcyB1c2VkIHRvIGRpZmZlcmVudGlhdGUgRlQyMzJCTSBhbmQgRlQyNDVCTSBmcm9tCiAqIHRoZSBlYXJsaWVyIEZUOFUyMzJBTSBhbmQgRlQ4VTIzMkJNLiAgRm9yIG5vdywgaW5jbHVkZSBhbGwga25vd24gVklEL1BJRAogKiBjb21iaW5hdGlvbnMgaW4gYm90aCB0YWJsZXMuCiAqIEZJWE1FOiBwZXJoYXBzIGJjZERldmljZSBjYW4gYWxzbyBpZGVudGlmeSAxMk1IeiBkZXZpY2VzLCBidXQgSSBkb24ndCBrbm93CiAqIGlmIHRob3NlIGV2ZXIgd2VudCBpbnRvIG1hc3MgcHJvZHVjdGlvbi4gW0lhbiBBYmJvdHRdCiAqLwoKCnN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBpZF90YWJsZV84VTIzMkFNIFtdID0gewoJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9JUlRSQU5TX1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJXzhVMjMyQU1fUElELCAwLCAweDNmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfOFUyMzJBTV9BTFRfUElELCAwLCAweDNmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfUkVMQUlTX1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0UoSU5URVJCSU9NRVRSSUNTX1ZJRCwgSU5URVJCSU9NRVRSSUNTX0lPQk9BUkRfUElEKSB9LAoJeyBVU0JfREVWSUNFKElOVEVSQklPTUVUUklDU19WSUQsIElOVEVSQklPTUVUUklDU19NSU5JX0lPQk9BUkRfUElEKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihGVERJX05GX1JJQ19WSUQsIEZURElfTkZfUklDX1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1hGXzYzMl9QSUQsIDAsIDB4M2ZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9YRl82MzRfUElELCAwLCAweDNmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfWEZfNTQ3X1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1hGXzYzM19QSUQsIDAsIDB4M2ZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9YRl82MzFfUElELCAwLCAweDNmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfWEZfNjM1X1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1hGXzY0MF9QSUQsIDAsIDB4M2ZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9YRl82NDJfUElELCAwLCAweDNmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfVk5IQ1BDVVNCX0RfUElELCAwLCAweDNmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfRFNTMjBfUElELCAwLCAweDNmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMTAxX1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjEwMl9QSUQsIDAsIDB4M2ZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzIxMDNfUElELCAwLCAweDNmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMTA0X1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjIwMV8xX1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjIwMV8yX1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjIwMl8xX1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjIwMl8yX1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjIwM18xX1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjIwM18yX1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwMV8xX1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwMV8yX1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwMV8zX1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwMV80X1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwMl8xX1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwMl8yX1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwMl8zX1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwMl80X1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwM18xX1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwM18yX1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwM18zX1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwM180X1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMV8xX1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMV8yX1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMV8zX1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMV80X1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMV81X1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMV82X1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMV83X1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMV84X1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMl8xX1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMl8yX1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMl8zX1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMl80X1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMl81X1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMl82X1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMl83X1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMl84X1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwM18xX1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwM18yX1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwM18zX1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwM180X1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwM181X1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwM182X1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwM183X1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwM184X1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKElEVEVDSF9WSUQsIElEVEVDSF9JRFQxMjIxVV9QSUQsIDAsIDB4M2ZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihPQ1RfVklELCBPQ1RfVVMxMDFfUElELCAwLCAweDNmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIFBST1RFR09fU1BFQ0lBTF8xLCAwLCAweDNmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIFBST1RFR09fUjJYMCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBQUk9URUdPX1NQRUNJQUxfMywgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBQUk9URUdPX1NQRUNJQUxfNCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0VMVl9VTzEwMF9QSUQsIDAsIDB4M2ZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgSU5TSURFX0FDQ0VTU08sIDAsIDB4M2ZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihJTlRSRVBJRF9WSUQsIElOVFJFUElEX1ZBTFVFQ0FOX1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKElOVFJFUElEX1ZJRCwgSU5UUkVQSURfTkVPVklfUElELCAwLCAweDNmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoRkFMQ09NX1ZJRCwgRkFMQ09NX1RXSVNUX1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1NVVU5UT19TUE9SVFNfUElELCAwLCAweDNmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfUk1fQ0FOVklFV19QSUQsIDAsIDB4M2ZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihCQU5EQl9WSUQsIEJBTkRCX1VTT1RMNF9QSUQsIDAsIDB4M2ZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihCQU5EQl9WSUQsIEJBTkRCX1VTVEw0X1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKEJBTkRCX1ZJRCwgQkFOREJfVVNPOU1MMl9QSUQsIDAsIDB4M2ZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRVZFUl9FQ09fUFJPX0NEUywgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJXzROX0dBTEFYWV9ERV8wX1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJXzROX0dBTEFYWV9ERV8xX1BJRCwgMCwgMHgzZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJXzROX0dBTEFYWV9ERV8yX1BJRCwgMCwgMHgzZmYpIH0sCgl7IH0JCQkJCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwp9OwoKCnN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBpZF90YWJsZV9GVDIzMkJNIFtdID0gewoJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9JUlRSQU5TX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfOFUyMzJBTV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJXzhVMjMyQU1fQUxUX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfUkVMQUlTX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoRlRESV9ORl9SSUNfVklELCBGVERJX05GX1JJQ19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1hGXzYzMl9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1hGXzYzNF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1hGXzU0N19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1hGXzYzM19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1hGXzYzMV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1hGXzYzNV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1hGXzY0MF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1hGXzY0Ml9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1ZOSENQQ1VTQl9EX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfRFNTMjBfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9NVFhPUkJfMF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX01UWE9SQl8xX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfTVRYT1JCXzJfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9NVFhPUkJfM19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX01UWE9SQl80X1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfTVRYT1JCXzVfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9NVFhPUkJfNl9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1BFUkxFX1VMVFJBUE9SVF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1BJRUdST1VQX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMTAxX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMTAyX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMTAzX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMTA0X1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMjAxXzFfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzIyMDFfMl9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjIwMl8xX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMjAyXzJfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzIyMDNfMV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjIwM18yX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAxXzFfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDFfMl9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwMV8zX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAxXzRfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDJfMV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwMl8yX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAyXzNfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDJfNF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwM18xX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAzXzJfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDNfM19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwM180X1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAxXzFfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDFfMl9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMV8zX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAxXzRfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDFfNV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMV82X1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAxXzdfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDFfOF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMl8xX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAyXzJfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDJfM19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMl80X1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAyXzVfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDJfNl9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMl83X1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAyXzhfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDNfMV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwM18yX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAzXzNfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDNfNF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwM181X1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAzXzZfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDNfN19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwM184X1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoSURURUNIX1ZJRCwgSURURUNIX0lEVDEyMjFVX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoT0NUX1ZJRCwgT0NUX1VTMTAxX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIFBST1RFR09fU1BFQ0lBTF8xLCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgUFJPVEVHT19SMlgwLCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgUFJPVEVHT19TUEVDSUFMXzMsIDB4NDAwLCAweGZmZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBQUk9URUdPX1NQRUNJQUxfNCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODA4X1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODA5X1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODBBX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODBCX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODBDX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODBEX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODBFX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODBGX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODg4X1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODg5X1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODhBX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODhCX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODhDX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODhEX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODhFX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODhGX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfRUxWX1VPMTAwX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKIAl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBMSU5YX1NETVVTQlFTU19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCiAJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgTElOWF9NQVNURVJERVZFTDJfUElELCAweDQwMCwgMHhmZmZmKSB9LAogCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIExJTlhfRlVUVVJFXzBfUElELCAweDQwMCwgMHhmZmZmKSB9LAogCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIExJTlhfRlVUVVJFXzFfUElELCAweDQwMCwgMHhmZmZmKSB9LAogCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIExJTlhfRlVUVVJFXzJfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0NDU0lDRFUyMF8wX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9DQ1NJQ0RVNDBfMV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBJTlNJREVfQUNDRVNTTywgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoSU5UUkVQSURfVklELCBJTlRSRVBJRF9WQUxVRUNBTl9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKElOVFJFUElEX1ZJRCwgSU5UUkVQSURfTkVPVklfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihGQUxDT01fVklELCBGQUxDT01fVFdJU1RfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9TVVVOVE9fU1BPUlRTX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfUk1fQ0FOVklFV19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKEJBTkRCX1ZJRCwgQkFOREJfVVNPVEw0X1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoQkFOREJfVklELCBCQU5EQl9VU1RMNF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKEJBTkRCX1ZJRCwgQkFOREJfVVNPOU1MMl9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBFVkVSX0VDT19QUk9fQ0RTLCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV80Tl9HQUxBWFlfREVfMF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJXzROX0dBTEFYWV9ERV8xX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfNE5fR0FMQVhZX0RFXzJfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9BQ1RJVkVfUk9CT1RTX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgfQkJCQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCn07CgoKc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGlkX3RhYmxlX1VTQl9VSVJUIFtdID0gewoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1VTQl9VSVJUX1BJRCkgfSwKCXsgfQkJCQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCn07CgoKc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGlkX3RhYmxlX0hFX1RJUkExIFtdID0gewoJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9IRV9USVJBMV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCgl7IH0JCQkJCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwp9OwoKCnN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBpZF90YWJsZV9GVDIyMzJDW10gPSB7Cgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfOFUyMjMyQ19QSUQpIH0sCgl7IH0JCQkJCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwp9OwoKCnN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBpZF90YWJsZV9jb21iaW5lZCBbXSA9IHsKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9JUlRSQU5TX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9TSU9fUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJXzhVMjMyQU1fUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJXzhVMjMyQU1fQUxUX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV84VTIyMzJDX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9SRUxBSVNfUElEKSB9LAoJeyBVU0JfREVWSUNFKElOVEVSQklPTUVUUklDU19WSUQsIElOVEVSQklPTUVUUklDU19JT0JPQVJEX1BJRCkgfSwKCXsgVVNCX0RFVklDRShJTlRFUkJJT01FVFJJQ1NfVklELCBJTlRFUkJJT01FVFJJQ1NfTUlOSV9JT0JPQVJEX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9YRl82MzJfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1hGXzYzNF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfWEZfNTQ3X1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9YRl82MzNfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1hGXzYzMV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfWEZfNjM1X1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9YRl82NDBfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1hGXzY0Ml9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRFNTMjBfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfTkZfUklDX1ZJRCwgRlRESV9ORl9SSUNfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1ZOSENQQ1VTQl9EX1BJRCkgfSwKCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfTVRYT1JCXzBfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9NVFhPUkJfMV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX01UWE9SQl8yX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfTVRYT1JCXzNfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9NVFhPUkJfNF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCgl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX01UWE9SQl81X1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfTVRYT1JCXzZfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9QRVJMRV9VTFRSQVBPUlRfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1BJRUdST1VQX1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzIxMDFfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjEwMl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMTAzX1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzIxMDRfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjIwMV8xX1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzIyMDFfMl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMjAyXzFfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjIwMl8yX1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzIyMDNfMV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMjAzXzJfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwMV8xX1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDFfMl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAxXzNfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwMV80X1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDJfMV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAyXzJfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwMl8zX1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDJfNF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAzXzFfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwM18yX1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDNfM19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAzXzRfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMV8xX1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDFfMl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAxXzNfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMV80X1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDFfNV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAxXzZfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMV83X1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDFfOF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAyXzFfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMl8yX1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDJfM19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAyXzRfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMl81X1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDJfNl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAyXzdfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMl84X1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDNfMV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAzXzJfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwM18zX1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDNfNF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAzXzVfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwM182X1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDNfN19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAzXzhfUElEKSB9LAoJeyBVU0JfREVWSUNFKElEVEVDSF9WSUQsIElEVEVDSF9JRFQxMjIxVV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoT0NUX1ZJRCwgT0NUX1VTMTAxX1BJRCkgfSwKCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfSEVfVElSQTFfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1VTQl9VSVJUX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgUFJPVEVHT19TUEVDSUFMXzEpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIFBST1RFR09fUjJYMCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgUFJPVEVHT19TUEVDSUFMXzMpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIFBST1RFR09fU1BFQ0lBTF80KSB9LAoJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4MDhfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4MDlfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4MEFfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4MEJfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4MENfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4MERfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4MEVfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4MEZfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4ODhfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4ODlfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4OEFfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4OEJfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4OENfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4OERfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4OEVfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4OEZfUElELCAweDQwMCwgMHhmZmZmKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9VTzEwMF9QSUQpIH0sCiAJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgTElOWF9TRE1VU0JRU1NfUElELCAweDQwMCwgMHhmZmZmKSB9LAogCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIExJTlhfTUFTVEVSREVWRUwyX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKIAl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBMSU5YX0ZVVFVSRV8wX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKIAl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBMSU5YX0ZVVFVSRV8xX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKIAl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBMSU5YX0ZVVFVSRV8yX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfQ0NTSUNEVTIwXzBfUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9DQ1NJQ0RVNDBfMV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIElOU0lERV9BQ0NFU1NPKSB9LAoJeyBVU0JfREVWSUNFKElOVFJFUElEX1ZJRCwgSU5UUkVQSURfVkFMVUVDQU5fUElEKSB9LAoJeyBVU0JfREVWSUNFKElOVFJFUElEX1ZJRCwgSU5UUkVQSURfTkVPVklfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZBTENPTV9WSUQsIEZBTENPTV9UV0lTVF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfU1VVTlRPX1NQT1JUU19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfUk1fQ0FOVklFV19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoQkFOREJfVklELCBCQU5EQl9VU09UTDRfUElEKSB9LAoJeyBVU0JfREVWSUNFKEJBTkRCX1ZJRCwgQkFOREJfVVNUTDRfUElEKSB9LAoJeyBVU0JfREVWSUNFKEJBTkRCX1ZJRCwgQkFOREJfVVNPOU1MMl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEVWRVJfRUNPX1BST19DRFMpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfNE5fR0FMQVhZX0RFXzBfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJXzROX0dBTEFYWV9ERV8xX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV80Tl9HQUxBWFlfREVfMl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoTU9CSUxJVFlfVklELCBNT0JJTElUWV9VU0JfU0VSSUFMX1BJRCkgfSwKCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfQUNUSVZFX1JPQk9UU19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCgl7IH0JCQkJCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwp9OwoKTU9EVUxFX0RFVklDRV9UQUJMRSAodXNiLCBpZF90YWJsZV9jb21iaW5lZCk7CgpzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgZnRkaV9kcml2ZXIgPSB7CgkubmFtZSA9CQkiZnRkaV9zaW8iLAoJLnByb2JlID0JdXNiX3NlcmlhbF9wcm9iZSwKCS5kaXNjb25uZWN0ID0JdXNiX3NlcmlhbF9kaXNjb25uZWN0LAoJLmlkX3RhYmxlID0JaWRfdGFibGVfY29tYmluZWQsCn07CgpzdGF0aWMgY2hhciAqZnRkaV9jaGlwX25hbWVbXSA9IHsKCVtTSU9dID0gIlNJTyIsCS8qIHRoZSBzZXJpYWwgcGFydCBvZiBGVDhVMTAwQVggKi8KCVtGVDhVMjMyQU1dID0gIkZUOFUyMzJBTSIsCglbRlQyMzJCTV0gPSAiRlQyMzJCTSIsCglbRlQyMjMyQ10gPSAiRlQyMjMyQyIsCn07CgoKLyogQ29uc3RhbnRzIGZvciByZWFkIHVyYiBhbmQgd3JpdGUgdXJiICovCiNkZWZpbmUgQlVGU1ogNTEyCiNkZWZpbmUgUEtUU1ogNjQKCi8qIHJ4X2ZsYWdzICovCiNkZWZpbmUgVEhST1RUTEVECQkweDAxCiNkZWZpbmUgQUNUVUFMTFlfVEhST1RUTEVECTB4MDIKCnN0cnVjdCBmdGRpX3ByaXZhdGUgewoJZnRkaV9jaGlwX3R5cGVfdCBjaGlwX3R5cGU7CgkJCQkvKiB0eXBlIG9mIHRoZSBkZXZpY2UsIGVpdGhlciBTSU8gb3IgRlQ4VTIzMkFNICovCglpbnQgYmF1ZF9iYXNlOwkJLyogYmF1ZCBiYXNlIGNsb2NrIGZvciBkaXZpc29yIHNldHRpbmcgKi8KCWludCBjdXN0b21fZGl2aXNvcjsJLyogY3VzdG9tX2Rpdmlzb3Iga2x1ZGdlLCB0aGlzIGlzIGZvciBiYXVkX2Jhc2UgKGRpZmZlcmVudCBmcm9tIHdoYXQgZ29lcyB0byB0aGUgY2hpcCEpICovCglfX3UxNiBsYXN0X3NldF9kYXRhX3VyYl92YWx1ZSA7CgkJCQkvKiB0aGUgbGFzdCBkYXRhIHN0YXRlIHNldCAtIG5lZWRlZCBmb3IgZG9pbmcgYSBicmVhayAqLwogICAgICAgIGludCB3cml0ZV9vZmZzZXQ7ICAgICAgIC8qIFRoaXMgaXMgdGhlIG9mZnNldCBpbiB0aGUgdXNiIGRhdGEgYmxvY2sgdG8gd3JpdGUgdGhlIHNlcmlhbCBkYXRhIC0gCgkJCQkgKiBpdCBpcyBkaWZmZXJlbnQgYmV0d2VlbiBkZXZpY2VzCgkJCQkgKi8KCWludCBmbGFnczsJCS8qIHNvbWUgQVNZTkNfeHh4eCBmbGFncyBhcmUgc3VwcG9ydGVkICovCgl1bnNpZ25lZCBsb25nIGxhc3RfZHRyX3J0czsJLyogc2F2ZWQgbW9kZW0gY29udHJvbCBvdXRwdXRzICovCiAgICAgICAgd2FpdF9xdWV1ZV9oZWFkX3QgZGVsdGFfbXNyX3dhaXQ7IC8qIFVzZWQgZm9yIFRJT0NNSVdBSVQgKi8KIAljaGFyIHByZXZfc3RhdHVzLCBkaWZmX3N0YXR1czsgICAgICAgIC8qIFVzZWQgZm9yIFRJT0NNSVdBSVQgKi8KCV9fdTggcnhfZmxhZ3M7CQkvKiByZWNlaXZlIHN0YXRlIGZsYWdzICh0aHJvdHRsaW5nKSAqLwoJc3BpbmxvY2tfdCByeF9sb2NrOwkvKiBzcGlubG9jayBmb3IgcmVjZWl2ZSBzdGF0ZSAqLwoKCV9fdTE2IGludGVyZmFjZTsJLyogRlQyMjMyQyBwb3J0IGludGVyZmFjZSAoMCBmb3IgRlQyMzIvMjQ1KSAqLwoKCWludCBmb3JjZV9iYXVkOwkJLyogaWYgbm9uLXplcm8sIGZvcmNlIHRoZSBiYXVkIHJhdGUgdG8gdGhpcyB2YWx1ZSAqLwoJaW50IGZvcmNlX3J0c2N0czsJLyogaWYgbm9uLXplcm8sIGZvcmNlIFJUUy1DVFMgdG8gYWx3YXlzIGJlIGVuYWJsZWQgKi8KfTsKCi8qIFVzZWQgZm9yIFRJT0NNSVdBSVQgKi8KI2RlZmluZSBGVERJX1NUQVRVU19CMF9NQVNLCShGVERJX1JTMF9DVFMgfCBGVERJX1JTMF9EU1IgfCBGVERJX1JTMF9SSSB8IEZURElfUlMwX1JMU0QpCiNkZWZpbmUgRlRESV9TVEFUVVNfQjFfTUFTSwkoRlRESV9SU19CSSkKLyogRW5kIFRJT0NNSVdBSVQgKi8KCiNkZWZpbmUgRlRESV9JTVBMX0FTWU5DX0ZMQUdTID0gKCBBU1lOQ19TUERfSEkgfCBBU1lOQ19TUERfVkhJIFwKIEFTWU5DX1NQRF9DVVNUIHwgQVNZTkNfU1BEX1NISSB8IEFTWU5DX1NQRF9XQVJQICkKCi8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yIGEgRlRESSBzZXJpYWwgY29udmVydGVyICovCnN0YXRpYyBpbnQgIGZ0ZGlfU0lPX3N0YXJ0dXAJCShzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKTsKc3RhdGljIGludCAgZnRkaV84VTIzMkFNX3N0YXJ0dXAJKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpOwpzdGF0aWMgaW50ICBmdGRpX0ZUMjMyQk1fc3RhcnR1cAkoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCk7CnN0YXRpYyBpbnQgIGZ0ZGlfRlQyMjMyQ19zdGFydHVwCShzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKTsKc3RhdGljIGludCAgZnRkaV9VU0JfVUlSVF9zdGFydHVwCShzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKTsKc3RhdGljIGludCAgZnRkaV9IRV9USVJBMV9zdGFydHVwCShzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKTsKc3RhdGljIHZvaWQgZnRkaV9zaHV0ZG93bgkJKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpOwpzdGF0aWMgaW50ICBmdGRpX29wZW4JCQkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApOwpzdGF0aWMgdm9pZCBmdGRpX2Nsb3NlCQkJKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKTsKc3RhdGljIGludCAgZnRkaV93cml0ZQkJCShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCk7CnN0YXRpYyBpbnQgIGZ0ZGlfd3JpdGVfcm9vbQkJKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpOwpzdGF0aWMgaW50ICBmdGRpX2NoYXJzX2luX2J1ZmZlcgkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCk7CnN0YXRpYyB2b2lkIGZ0ZGlfd3JpdGVfYnVsa19jYWxsYmFjawkoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CnN0YXRpYyB2b2lkIGZ0ZGlfcmVhZF9idWxrX2NhbGxiYWNrCShzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKc3RhdGljIHZvaWQgZnRkaV9wcm9jZXNzX3JlYWQJCShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKc3RhdGljIHZvaWQgZnRkaV9zZXRfdGVybWlvcwkJKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCB0ZXJtaW9zICogb2xkKTsKc3RhdGljIGludCAgZnRkaV90aW9jbWdldCAgICAgICAgICAgICAgIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CnN0YXRpYyBpbnQgIGZ0ZGlfdGlvY21zZXQJCShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqIGZpbGUsIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcik7CnN0YXRpYyBpbnQgIGZ0ZGlfaW9jdGwJCQkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKiBmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CnN0YXRpYyB2b2lkIGZ0ZGlfYnJlYWtfY3RsCQkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgaW50IGJyZWFrX3N0YXRlICk7CnN0YXRpYyB2b2lkIGZ0ZGlfdGhyb3R0bGUJCShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKc3RhdGljIHZvaWQgZnRkaV91bnRocm90dGxlCQkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCk7CgpzdGF0aWMgdW5zaWduZWQgc2hvcnQgaW50IGZ0ZGlfMjMyYW1fYmF1ZF9iYXNlX3RvX2Rpdmlzb3IgKGludCBiYXVkLCBpbnQgYmFzZSk7CnN0YXRpYyB1bnNpZ25lZCBzaG9ydCBpbnQgZnRkaV8yMzJhbV9iYXVkX3RvX2Rpdmlzb3IgKGludCBiYXVkKTsKc3RhdGljIF9fdTMyIGZ0ZGlfMjMyYm1fYmF1ZF9iYXNlX3RvX2Rpdmlzb3IgKGludCBiYXVkLCBpbnQgYmFzZSk7CnN0YXRpYyBfX3UzMiBmdGRpXzIzMmJtX2JhdWRfdG9fZGl2aXNvciAoaW50IGJhdWQpOwoKc3RhdGljIHN0cnVjdCB1c2Jfc2VyaWFsX2RldmljZV90eXBlIGZ0ZGlfU0lPX2RldmljZSA9IHsKCS5vd25lciA9CQlUSElTX01PRFVMRSwKCS5uYW1lID0JCQkiRlRESSBTSU8iLAoJLmlkX3RhYmxlID0JCWlkX3RhYmxlX3NpbywKCS5udW1faW50ZXJydXB0X2luID0JMCwKCS5udW1fYnVsa19pbiA9CQkxLAoJLm51bV9idWxrX291dCA9CQkxLAoJLm51bV9wb3J0cyA9CQkxLAoJLm9wZW4gPQkJCWZ0ZGlfb3BlbiwKCS5jbG9zZSA9CQlmdGRpX2Nsb3NlLAoJLnRocm90dGxlID0JCWZ0ZGlfdGhyb3R0bGUsCgkudW50aHJvdHRsZSA9CQlmdGRpX3VudGhyb3R0bGUsCgkud3JpdGUgPQkJZnRkaV93cml0ZSwKCS53cml0ZV9yb29tID0JCWZ0ZGlfd3JpdGVfcm9vbSwKCS5jaGFyc19pbl9idWZmZXIgPQlmdGRpX2NoYXJzX2luX2J1ZmZlciwKCS5yZWFkX2J1bGtfY2FsbGJhY2sgPQlmdGRpX3JlYWRfYnVsa19jYWxsYmFjaywKCS53cml0ZV9idWxrX2NhbGxiYWNrID0JZnRkaV93cml0ZV9idWxrX2NhbGxiYWNrLAoJLnRpb2NtZ2V0ID0gICAgICAgICAgICAgZnRkaV90aW9jbWdldCwKCS50aW9jbXNldCA9ICAgICAgICAgICAgIGZ0ZGlfdGlvY21zZXQsCgkuaW9jdGwgPQkJZnRkaV9pb2N0bCwKCS5zZXRfdGVybWlvcyA9CQlmdGRpX3NldF90ZXJtaW9zLAoJLmJyZWFrX2N0bCA9CQlmdGRpX2JyZWFrX2N0bCwKCS5hdHRhY2ggPQkJZnRkaV9TSU9fc3RhcnR1cCwKCS5zaHV0ZG93biA9CQlmdGRpX3NodXRkb3duLAp9OwoKc3RhdGljIHN0cnVjdCB1c2Jfc2VyaWFsX2RldmljZV90eXBlIGZ0ZGlfOFUyMzJBTV9kZXZpY2UgPSB7Cgkub3duZXIgPQkJVEhJU19NT0RVTEUsCgkubmFtZSA9CQkJIkZUREkgOFUyMzJBTSBDb21wYXRpYmxlIiwKCS5pZF90YWJsZSA9CQlpZF90YWJsZV84VTIzMkFNLAoJLm51bV9pbnRlcnJ1cHRfaW4gPQkwLAoJLm51bV9idWxrX2luID0JCTEsCgkubnVtX2J1bGtfb3V0ID0JCTEsCgkubnVtX3BvcnRzID0JCTEsCgkub3BlbiA9CQkJZnRkaV9vcGVuLAoJLmNsb3NlID0JCWZ0ZGlfY2xvc2UsCgkudGhyb3R0bGUgPQkJZnRkaV90aHJvdHRsZSwKCS51bnRocm90dGxlID0JCWZ0ZGlfdW50aHJvdHRsZSwKCS53cml0ZSA9CQlmdGRpX3dyaXRlLAoJLndyaXRlX3Jvb20gPQkJZnRkaV93cml0ZV9yb29tLAoJLmNoYXJzX2luX2J1ZmZlciA9CWZ0ZGlfY2hhcnNfaW5fYnVmZmVyLAoJLnJlYWRfYnVsa19jYWxsYmFjayA9CWZ0ZGlfcmVhZF9idWxrX2NhbGxiYWNrLAoJLndyaXRlX2J1bGtfY2FsbGJhY2sgPQlmdGRpX3dyaXRlX2J1bGtfY2FsbGJhY2ssCgkudGlvY21nZXQgPSAgICAgICAgICAgICBmdGRpX3Rpb2NtZ2V0LAoJLnRpb2Ntc2V0ID0gICAgICAgICAgICAgZnRkaV90aW9jbXNldCwKCS5pb2N0bCA9CQlmdGRpX2lvY3RsLAoJLnNldF90ZXJtaW9zID0JCWZ0ZGlfc2V0X3Rlcm1pb3MsCgkuYnJlYWtfY3RsID0JCWZ0ZGlfYnJlYWtfY3RsLAoJLmF0dGFjaCA9CQlmdGRpXzhVMjMyQU1fc3RhcnR1cCwKCS5zaHV0ZG93biA9CQlmdGRpX3NodXRkb3duLAp9OwoKc3RhdGljIHN0cnVjdCB1c2Jfc2VyaWFsX2RldmljZV90eXBlIGZ0ZGlfRlQyMzJCTV9kZXZpY2UgPSB7Cgkub3duZXIgPQkJVEhJU19NT0RVTEUsCgkubmFtZSA9CQkJIkZUREkgRlQyMzJCTSBDb21wYXRpYmxlIiwKCS5pZF90YWJsZSA9CQlpZF90YWJsZV9GVDIzMkJNLAoJLm51bV9pbnRlcnJ1cHRfaW4gPQkwLAoJLm51bV9idWxrX2luID0JCTEsCgkubnVtX2J1bGtfb3V0ID0JCTEsCgkubnVtX3BvcnRzID0JCTEsCgkub3BlbiA9CQkJZnRkaV9vcGVuLAoJLmNsb3NlID0JCWZ0ZGlfY2xvc2UsCgkudGhyb3R0bGUgPQkJZnRkaV90aHJvdHRsZSwKCS51bnRocm90dGxlID0JCWZ0ZGlfdW50aHJvdHRsZSwKCS53cml0ZSA9CQlmdGRpX3dyaXRlLAoJLndyaXRlX3Jvb20gPQkJZnRkaV93cml0ZV9yb29tLAoJLmNoYXJzX2luX2J1ZmZlciA9CWZ0ZGlfY2hhcnNfaW5fYnVmZmVyLAoJLnJlYWRfYnVsa19jYWxsYmFjayA9CWZ0ZGlfcmVhZF9idWxrX2NhbGxiYWNrLAoJLndyaXRlX2J1bGtfY2FsbGJhY2sgPQlmdGRpX3dyaXRlX2J1bGtfY2FsbGJhY2ssCgkudGlvY21nZXQgPSAgICAgICAgICAgICBmdGRpX3Rpb2NtZ2V0LAoJLnRpb2Ntc2V0ID0gICAgICAgICAgICAgZnRkaV90aW9jbXNldCwKCS5pb2N0bCA9CQlmdGRpX2lvY3RsLAoJLnNldF90ZXJtaW9zID0JCWZ0ZGlfc2V0X3Rlcm1pb3MsCgkuYnJlYWtfY3RsID0JCWZ0ZGlfYnJlYWtfY3RsLAoJLmF0dGFjaCA9CQlmdGRpX0ZUMjMyQk1fc3RhcnR1cCwKCS5zaHV0ZG93biA9CQlmdGRpX3NodXRkb3duLAp9OwoKc3RhdGljIHN0cnVjdCB1c2Jfc2VyaWFsX2RldmljZV90eXBlIGZ0ZGlfRlQyMjMyQ19kZXZpY2UgPSB7Cgkub3duZXIgPQkJVEhJU19NT0RVTEUsCgkubmFtZSA9CQkJIkZUREkgRlQyMjMyQyBDb21wYXRpYmxlIiwKCS5pZF90YWJsZSA9CQlpZF90YWJsZV9GVDIyMzJDLAoJLm51bV9pbnRlcnJ1cHRfaW4gPQkwLAoJLm51bV9idWxrX2luID0JCTEsCgkubnVtX2J1bGtfb3V0ID0JCTEsCgkubnVtX3BvcnRzID0JCTEsCgkub3BlbiA9CQkJZnRkaV9vcGVuLAoJLmNsb3NlID0JCWZ0ZGlfY2xvc2UsCgkudGhyb3R0bGUgPQkJZnRkaV90aHJvdHRsZSwKCS51bnRocm90dGxlID0JCWZ0ZGlfdW50aHJvdHRsZSwKCS53cml0ZSA9CQlmdGRpX3dyaXRlLAoJLndyaXRlX3Jvb20gPQkJZnRkaV93cml0ZV9yb29tLAoJLmNoYXJzX2luX2J1ZmZlciA9CWZ0ZGlfY2hhcnNfaW5fYnVmZmVyLAoJLnJlYWRfYnVsa19jYWxsYmFjayA9CWZ0ZGlfcmVhZF9idWxrX2NhbGxiYWNrLAoJLndyaXRlX2J1bGtfY2FsbGJhY2sgPQlmdGRpX3dyaXRlX2J1bGtfY2FsbGJhY2ssCgkudGlvY21nZXQgPSAgICAgICAgICAgICBmdGRpX3Rpb2NtZ2V0LAoJLnRpb2Ntc2V0ID0gICAgICAgICAgICAgZnRkaV90aW9jbXNldCwKCS5pb2N0bCA9CQlmdGRpX2lvY3RsLAoJLnNldF90ZXJtaW9zID0JCWZ0ZGlfc2V0X3Rlcm1pb3MsCgkuYnJlYWtfY3RsID0JCWZ0ZGlfYnJlYWtfY3RsLAoJLmF0dGFjaCA9CQlmdGRpX0ZUMjIzMkNfc3RhcnR1cCwKCS5zaHV0ZG93biA9CQlmdGRpX3NodXRkb3duLAp9OwoKc3RhdGljIHN0cnVjdCB1c2Jfc2VyaWFsX2RldmljZV90eXBlIGZ0ZGlfVVNCX1VJUlRfZGV2aWNlID0gewoJLm93bmVyID0JCVRISVNfTU9EVUxFLAoJLm5hbWUgPQkJCSJVU0ItVUlSVCBJbmZyYXJlZCBUcmFuY2VpdmVyIiwKCS5pZF90YWJsZSA9CQlpZF90YWJsZV9VU0JfVUlSVCwKCS5udW1faW50ZXJydXB0X2luID0JMCwKCS5udW1fYnVsa19pbiA9CQkxLAoJLm51bV9idWxrX291dCA9CQkxLAoJLm51bV9wb3J0cyA9CQkxLAoJLm9wZW4gPQkJCWZ0ZGlfb3BlbiwKCS5jbG9zZSA9CQlmdGRpX2Nsb3NlLAoJLnRocm90dGxlID0JCWZ0ZGlfdGhyb3R0bGUsCgkudW50aHJvdHRsZSA9CQlmdGRpX3VudGhyb3R0bGUsCgkud3JpdGUgPQkJZnRkaV93cml0ZSwKCS53cml0ZV9yb29tID0JCWZ0ZGlfd3JpdGVfcm9vbSwKCS5jaGFyc19pbl9idWZmZXIgPQlmdGRpX2NoYXJzX2luX2J1ZmZlciwKCS5yZWFkX2J1bGtfY2FsbGJhY2sgPQlmdGRpX3JlYWRfYnVsa19jYWxsYmFjaywKCS53cml0ZV9idWxrX2NhbGxiYWNrID0JZnRkaV93cml0ZV9idWxrX2NhbGxiYWNrLAoJLnRpb2NtZ2V0ID0gICAgICAgICAgICAgZnRkaV90aW9jbWdldCwKCS50aW9jbXNldCA9ICAgICAgICAgICAgIGZ0ZGlfdGlvY21zZXQsCgkuaW9jdGwgPQkJZnRkaV9pb2N0bCwKCS5zZXRfdGVybWlvcyA9CQlmdGRpX3NldF90ZXJtaW9zLAoJLmJyZWFrX2N0bCA9CQlmdGRpX2JyZWFrX2N0bCwKCS5hdHRhY2ggPQkJZnRkaV9VU0JfVUlSVF9zdGFydHVwLAoJLnNodXRkb3duID0JCWZ0ZGlfc2h1dGRvd24sCn07CgovKiBUaGUgVElSQTEgaXMgYmFzZWQgb24gYSAgRlQyMzJCTSB3aGljaCByZXF1aXJlcyBhIGZpeGVkIGJhdWQgcmF0ZSBvZiAxMDAwMDAKICogYW5kIHdoaWNoIHJlcXVpcmVzIFJUUy1DVFMgdG8gYmUgZW5hYmxlZC4gKi8Kc3RhdGljIHN0cnVjdCB1c2Jfc2VyaWFsX2RldmljZV90eXBlIGZ0ZGlfSEVfVElSQTFfZGV2aWNlID0gewoJLm93bmVyID0JCVRISVNfTU9EVUxFLAoJLm5hbWUgPQkJCSJIb21lLUVsZWN0cm9uaWNzIFRJUkEtMSBJUiBUcmFuc2NlaXZlciIsCgkuaWRfdGFibGUgPQkJaWRfdGFibGVfSEVfVElSQTEsCgkubnVtX2ludGVycnVwdF9pbiA9CTAsCgkubnVtX2J1bGtfaW4gPQkJMSwKCS5udW1fYnVsa19vdXQgPQkJMSwKCS5udW1fcG9ydHMgPQkJMSwKCS5vcGVuID0JCQlmdGRpX29wZW4sCgkuY2xvc2UgPQkJZnRkaV9jbG9zZSwKCS50aHJvdHRsZSA9CQlmdGRpX3Rocm90dGxlLAoJLnVudGhyb3R0bGUgPQkJZnRkaV91bnRocm90dGxlLAoJLndyaXRlID0JCWZ0ZGlfd3JpdGUsCgkud3JpdGVfcm9vbSA9CQlmdGRpX3dyaXRlX3Jvb20sCgkuY2hhcnNfaW5fYnVmZmVyID0JZnRkaV9jaGFyc19pbl9idWZmZXIsCgkucmVhZF9idWxrX2NhbGxiYWNrID0JZnRkaV9yZWFkX2J1bGtfY2FsbGJhY2ssCgkud3JpdGVfYnVsa19jYWxsYmFjayA9CWZ0ZGlfd3JpdGVfYnVsa19jYWxsYmFjaywKCS50aW9jbWdldCA9ICAgICAgICAgICAgIGZ0ZGlfdGlvY21nZXQsCgkudGlvY21zZXQgPSAgICAgICAgICAgICBmdGRpX3Rpb2Ntc2V0LAoJLmlvY3RsID0JCWZ0ZGlfaW9jdGwsCgkuc2V0X3Rlcm1pb3MgPQkJZnRkaV9zZXRfdGVybWlvcywKCS5icmVha19jdGwgPQkJZnRkaV9icmVha19jdGwsCgkuYXR0YWNoID0JCWZ0ZGlfSEVfVElSQTFfc3RhcnR1cCwKCS5zaHV0ZG93biA9CQlmdGRpX3NodXRkb3duLAp9OwoKCgojZGVmaW5lIFdEUl9USU1FT1VUIDUwMDAgLyogZGVmYXVsdCB1cmIgdGltZW91dCAqLwoKLyogSGlnaCBhbmQgbG93IGFyZSBmb3IgRFRSLCBSVFMgZXRjIGV0YyAqLwojZGVmaW5lIEhJR0ggMQojZGVmaW5lIExPVyAwCgovKgogKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogVXRsaXR5IGZ1bmN0aW9ucwogKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCgpzdGF0aWMgdW5zaWduZWQgc2hvcnQgaW50IGZ0ZGlfMjMyYW1fYmF1ZF9iYXNlX3RvX2Rpdmlzb3IoaW50IGJhdWQsIGludCBiYXNlKQp7Cgl1bnNpZ25lZCBzaG9ydCBpbnQgZGl2aXNvcjsKCWludCBkaXZpc29yMyA9IGJhc2UgLyAyIC8gYmF1ZDsgLy8gZGl2aXNvciBzaGlmdGVkIDMgYml0cyB0byB0aGUgbGVmdAoJaWYgKChkaXZpc29yMyAmIDB4NykgPT0gNykgZGl2aXNvcjMgKys7IC8vIHJvdW5kIHguNy84IHVwIHRvIHgrMQoJZGl2aXNvciA9IGRpdmlzb3IzID4+IDM7CglkaXZpc29yMyAmPSAweDc7CglpZiAoZGl2aXNvcjMgPT0gMSkgZGl2aXNvciB8PSAweGMwMDA7IGVsc2UgLy8gMC4xMjUKCWlmIChkaXZpc29yMyA+PSA0KSBkaXZpc29yIHw9IDB4NDAwMDsgZWxzZSAvLyAwLjUKCWlmIChkaXZpc29yMyAhPSAwKSBkaXZpc29yIHw9IDB4ODAwMDsgICAgICAvLyAwLjI1CglpZiAoZGl2aXNvciA9PSAxKSBkaXZpc29yID0gMDsJLyogc3BlY2lhbCBjYXNlIGZvciBtYXhpbXVtIGJhdWQgcmF0ZSAqLwoJcmV0dXJuIGRpdmlzb3I7Cn0KCnN0YXRpYyB1bnNpZ25lZCBzaG9ydCBpbnQgZnRkaV8yMzJhbV9iYXVkX3RvX2Rpdmlzb3IoaW50IGJhdWQpCnsKCSByZXR1cm4oZnRkaV8yMzJhbV9iYXVkX2Jhc2VfdG9fZGl2aXNvcihiYXVkLCA0ODAwMDAwMCkpOwp9CgpzdGF0aWMgX191MzIgZnRkaV8yMzJibV9iYXVkX2Jhc2VfdG9fZGl2aXNvcihpbnQgYmF1ZCwgaW50IGJhc2UpCnsKCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGRpdmZyYWNbOF0gPSB7IDAsIDMsIDIsIDQsIDEsIDUsIDYsIDcgfTsKCV9fdTMyIGRpdmlzb3I7CglpbnQgZGl2aXNvcjMgPSBiYXNlIC8gMiAvIGJhdWQ7IC8vIGRpdmlzb3Igc2hpZnRlZCAzIGJpdHMgdG8gdGhlIGxlZnQKCWRpdmlzb3IgPSBkaXZpc29yMyA+PiAzOwoJZGl2aXNvciB8PSAoX191MzIpZGl2ZnJhY1tkaXZpc29yMyAmIDB4N10gPDwgMTQ7CgkvKiBEZWFsIHdpdGggc3BlY2lhbCBjYXNlcyBmb3IgaGlnaGVzdCBiYXVkIHJhdGVzLiAqLwoJaWYgKGRpdmlzb3IgPT0gMSkgZGl2aXNvciA9IDA7IGVsc2UJLy8gMS4wCglpZiAoZGl2aXNvciA9PSAweDQwMDEpIGRpdmlzb3IgPSAxOwkvLyAxLjUKCXJldHVybiBkaXZpc29yOwp9CgpzdGF0aWMgX191MzIgZnRkaV8yMzJibV9iYXVkX3RvX2Rpdmlzb3IoaW50IGJhdWQpCnsKCSByZXR1cm4oZnRkaV8yMzJibV9iYXVkX2Jhc2VfdG9fZGl2aXNvcihiYXVkLCA0ODAwMDAwMCkpOwp9CgpzdGF0aWMgaW50IHNldF9ydHMoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgaW50IGhpZ2hfb3JfbG93KQp7CglzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwoJY2hhciAqYnVmOwoJdW5zaWduZWQgZnRkaV9oaWdoX29yX2xvdzsKCWludCBydjsKCQoJYnVmID0ga21hbGxvYygxLCBHRlBfTk9JTyk7CglpZiAoIWJ1ZikKCQlyZXR1cm4gLUVOT01FTTsKCQoJaWYgKGhpZ2hfb3JfbG93KSB7CgkJZnRkaV9oaWdoX29yX2xvdyA9IEZURElfU0lPX1NFVF9SVFNfSElHSDsKCQlwcml2LT5sYXN0X2R0cl9ydHMgfD0gVElPQ01fUlRTOwoJfSBlbHNlIHsKCQlmdGRpX2hpZ2hfb3JfbG93ID0gRlRESV9TSU9fU0VUX1JUU19MT1c7CgkJcHJpdi0+bGFzdF9kdHJfcnRzICY9IH5USU9DTV9SVFM7Cgl9CglydiA9IHVzYl9jb250cm9sX21zZyhwb3J0LT5zZXJpYWwtPmRldiwKCQkJICAgICAgIHVzYl9zbmRjdHJscGlwZShwb3J0LT5zZXJpYWwtPmRldiwgMCksCgkJCSAgICAgICBGVERJX1NJT19TRVRfTU9ERU1fQ1RSTF9SRVFVRVNULCAKCQkJICAgICAgIEZURElfU0lPX1NFVF9NT0RFTV9DVFJMX1JFUVVFU1RfVFlQRSwKCQkJICAgICAgIGZ0ZGlfaGlnaF9vcl9sb3csIHByaXYtPmludGVyZmFjZSwgCgkJCSAgICAgICBidWYsIDAsIFdEUl9USU1FT1VUKTsKCglrZnJlZShidWYpOwoJcmV0dXJuIHJ2Owp9CgoKc3RhdGljIGludCBzZXRfZHRyKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIGludCBoaWdoX29yX2xvdykKewoJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKCWNoYXIgKmJ1ZjsKCXVuc2lnbmVkIGZ0ZGlfaGlnaF9vcl9sb3c7CglpbnQgcnY7CgkKCWJ1ZiA9IGttYWxsb2MoMSwgR0ZQX05PSU8pOwoJaWYgKCFidWYpCgkJcmV0dXJuIC1FTk9NRU07CgoJaWYgKGhpZ2hfb3JfbG93KSB7CgkJZnRkaV9oaWdoX29yX2xvdyA9IEZURElfU0lPX1NFVF9EVFJfSElHSDsKCQlwcml2LT5sYXN0X2R0cl9ydHMgfD0gVElPQ01fRFRSOwoJfSBlbHNlIHsKCQlmdGRpX2hpZ2hfb3JfbG93ID0gRlRESV9TSU9fU0VUX0RUUl9MT1c7CgkJcHJpdi0+bGFzdF9kdHJfcnRzICY9IH5USU9DTV9EVFI7Cgl9CglydiA9IHVzYl9jb250cm9sX21zZyhwb3J0LT5zZXJpYWwtPmRldiwKCQkJICAgICAgIHVzYl9zbmRjdHJscGlwZShwb3J0LT5zZXJpYWwtPmRldiwgMCksCgkJCSAgICAgICBGVERJX1NJT19TRVRfTU9ERU1fQ1RSTF9SRVFVRVNULCAKCQkJICAgICAgIEZURElfU0lPX1NFVF9NT0RFTV9DVFJMX1JFUVVFU1RfVFlQRSwKCQkJICAgICAgIGZ0ZGlfaGlnaF9vcl9sb3csIHByaXYtPmludGVyZmFjZSwgCgkJCSAgICAgICBidWYsIDAsIFdEUl9USU1FT1VUKTsKCglrZnJlZShidWYpOwoJcmV0dXJuIHJ2Owp9CgoKc3RhdGljIF9fdTMyIGdldF9mdGRpX2Rpdmlzb3Ioc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqIHBvcnQpOwoKCnN0YXRpYyBpbnQgY2hhbmdlX3NwZWVkKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCnsKCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CgljaGFyICpidWY7CiAgICAgICAgX191MTYgdXJiX3ZhbHVlOwoJX191MTYgdXJiX2luZGV4OwoJX191MzIgdXJiX2luZGV4X3ZhbHVlOwoJaW50IHJ2OwoKCWJ1ZiA9IGttYWxsb2MoMSwgR0ZQX05PSU8pOwoJaWYgKCFidWYpCgkJcmV0dXJuIC1FTk9NRU07CgoJdXJiX2luZGV4X3ZhbHVlID0gZ2V0X2Z0ZGlfZGl2aXNvcihwb3J0KTsKCXVyYl92YWx1ZSA9IChfX3UxNil1cmJfaW5kZXhfdmFsdWU7Cgl1cmJfaW5kZXggPSAoX191MTYpKHVyYl9pbmRleF92YWx1ZSA+PiAxNik7CglpZiAocHJpdi0+aW50ZXJmYWNlKSB7CS8qIEZUMjIzMkMgKi8KCQl1cmJfaW5kZXggPSAoX191MTYpKCh1cmJfaW5kZXggPDwgOCkgfCBwcml2LT5pbnRlcmZhY2UpOwoJfQoJCglydiA9IHVzYl9jb250cm9sX21zZyhwb3J0LT5zZXJpYWwtPmRldiwKCQkJICAgIHVzYl9zbmRjdHJscGlwZShwb3J0LT5zZXJpYWwtPmRldiwgMCksCgkJCSAgICBGVERJX1NJT19TRVRfQkFVRFJBVEVfUkVRVUVTVCwKCQkJICAgIEZURElfU0lPX1NFVF9CQVVEUkFURV9SRVFVRVNUX1RZUEUsCgkJCSAgICB1cmJfdmFsdWUsIHVyYl9pbmRleCwKCQkJICAgIGJ1ZiwgMCwgMTAwKTsKCglrZnJlZShidWYpOwoJcmV0dXJuIHJ2Owp9CgoKc3RhdGljIF9fdTMyIGdldF9mdGRpX2Rpdmlzb3Ioc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqIHBvcnQpCnsgLyogZ2V0X2Z0ZGlfZGl2aXNvciAqLwoJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKCV9fdTMyIGRpdl92YWx1ZSA9IDA7CglpbnQgZGl2X29rYXkgPSAxOwoJaW50IGJhdWQ7CgoJLyoKCSAqIFRoZSBsb2dpYyBpbnZvbHZlZCBpbiBzZXR0aW5nIHRoZSBiYXVkcmF0ZSBjYW4gYmUgY2xlYW5seSBzcGxpdCBpbiAzIHN0ZXBzLgoJICogT2J0YWluaW5nIHRoZSBhY3R1YWwgYmF1ZCByYXRlIGlzIGEgbGl0dGxlIHRyaWNreSBzaW5jZSB1bml4IHRyYWRpdGlvbmFsbHkKCSAqIHNvbWVob3cgaWdub3JlZCB0aGUgcG9zc2liaWxpdHkgdG8gc2V0IG5vbi1zdGFuZGFyZCBiYXVkIHJhdGVzLgoJICogMS4gU3RhbmRhcmQgYmF1ZCByYXRlcyBhcmUgc2V0IGluIHR0eS0+dGVybWlvcy0+Y19jZmxhZwoJICogMi4gSWYgdGhlc2UgYXJlIG5vdCBlbm91Z2gsIHlvdSBjYW4gc2V0IGFueSBzcGVlZCB1c2luZyBhbHRfc3BlZWQgYXMgZm9sbG93czoKCSAqICAgIC0gc2V0IHR0eS0+dGVybWlvcy0+Y19jZmxhZyBzcGVlZCB0byBCMzg0MDAKCSAqICAgIC0gc2V0IHlvdXIgcmVhbCBzcGVlZCBpbiB0dHktPmFsdF9zcGVlZDsgaXQgZ2V0cyBpZ25vcmVkIHdoZW4KCSAqICAgICAgYWx0X3NwZWVkPT0wLCAob3IpCgkgKiAgICAtIGNhbGwgVElPQ1NTRVJJQUwgaW9jdGwgd2l0aCAoc3RydWN0IHNlcmlhbF9zdHJ1Y3QpIHNldCBhcyBmb2xsb3dzOgoJICogICAgICBmbGFncyAmIEFTWU5DX1NQRF9NQVNLID09IEFTWU5DX1NQRF9bSEksIFZISSwgU0hJLCBXQVJQXSwgdGhpcyBqdXN0CgkgKiAgICAgIHNldHMgYWx0X3NwZWVkIHRvIChISTogNTc2MDAsIFZISTogMTE1MjAwLCBTSEk6IDIzMDQwMCwgV0FSUDogNDYwODAwKQoJICogKiogU3RlcHMgMSwgMiBhcmUgZG9uZSBjb3VydGVzeSBvZiB0dHlfZ2V0X2JhdWRfcmF0ZQoJICogMy4gWW91IGNhbiBhbHNvIHNldCBiYXVkIHJhdGUgYnkgc2V0dGluZyBjdXN0b20gZGl2aXNvciBhcyBmb2xsb3dzCgkgKiAgICAtIHNldCB0dHktPnRlcm1pb3MtPmNfY2ZsYWcgc3BlZWQgdG8gQjM4NDAwCgkgKiAgICAtIGNhbGwgVElPQ1NTRVJJQUwgaW9jdGwgd2l0aCAoc3RydWN0IHNlcmlhbF9zdHJ1Y3QpIHNldCBhcyBmb2xsb3dzOgoJICogICAgICBvIGZsYWdzICYgQVNZTkNfU1BEX01BU0sgPT0gQVNZTkNfU1BEX0NVU1QKCSAqICAgICAgbyBjdXN0b21fZGl2aXNvciBzZXQgdG8gYmF1ZF9iYXNlIC8geW91cl9uZXdfYmF1ZHJhdGUKCSAqICoqIFN0ZXAgMyBpcyBkb25lIGNvdXJ0ZXN5IG9mIGNvZGUgYm9ycm93ZWQgZnJvbSBzZXJpYWwuYyAtIEkgc2hvdWxkIHJlYWxseQoJICogICAgc3BlbmQgc29tZSB0aW1lIGFuZCBzZXBhcmF0ZSttb3ZlIHRoaXMgY29tbW9uIGNvZGUgdG8gc2VyaWFsLmMsIGl0IGlzCgkgKiAgICByZXBsaWNhdGVkIGluIG5lYXJseSBldmVyeSBzZXJpYWwgZHJpdmVyIHlvdSBzZWUuCgkgKi8KCgkvKiAxLiBHZXQgdGhlIGJhdWQgcmF0ZSBmcm9tIHRoZSB0dHkgc2V0dGluZ3MsIHRoaXMgb2JzZXJ2ZXMgYWx0X3NwZWVkIGhhY2sgKi8KCgliYXVkID0gdHR5X2dldF9iYXVkX3JhdGUocG9ydC0+dHR5KTsKCWRiZygiJXMgLSB0dHlfZ2V0X2JhdWRfcmF0ZSByZXBvcnRzIHNwZWVkICVkIiwgX19GVU5DVElPTl9fLCBiYXVkKTsKCgkvKiAyLiBPYnNlcnZlIGFzeW5jLWNvbXBhdGlibGUgY3VzdG9tX2Rpdmlzb3IgaGFjaywgdXBkYXRlIGJhdWRyYXRlIGlmIG5lZWRlZCAqLwoKCWlmIChiYXVkID09IDM4NDAwICYmCgkgICAgKChwcml2LT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfQ1VTVCkgJiYKCSAgICAgKHByaXYtPmN1c3RvbV9kaXZpc29yKSkgewoJCWJhdWQgPSBwcml2LT5iYXVkX2Jhc2UgLyBwcml2LT5jdXN0b21fZGl2aXNvcjsKCQlkYmcoIiVzIC0gY3VzdG9tIGRpdmlzb3IgJWQgc2V0cyBiYXVkIHJhdGUgdG8gJWQiLCBfX0ZVTkNUSU9OX18sIHByaXYtPmN1c3RvbV9kaXZpc29yLCBiYXVkKTsKCX0KCgkvKiAzLiBDb252ZXJ0IGJhdWRyYXRlIHRvIGRldmljZS1zcGVjaWZpYyBkaXZpc29yICovCgoJaWYgKCFiYXVkKSBiYXVkID0gOTYwMDsJCglzd2l0Y2gocHJpdi0+Y2hpcF90eXBlKSB7CgljYXNlIFNJTzogLyogU0lPIGNoaXAgKi8KCQlzd2l0Y2goYmF1ZCkgewoJCWNhc2UgMzAwOiBkaXZfdmFsdWUgPSBmdGRpX3Npb19iMzAwOyBicmVhazsKCQljYXNlIDYwMDogZGl2X3ZhbHVlID0gZnRkaV9zaW9fYjYwMDsgYnJlYWs7CgkJY2FzZSAxMjAwOiBkaXZfdmFsdWUgPSBmdGRpX3Npb19iMTIwMDsgYnJlYWs7CgkJY2FzZSAyNDAwOiBkaXZfdmFsdWUgPSBmdGRpX3Npb19iMjQwMDsgYnJlYWs7CgkJY2FzZSA0ODAwOiBkaXZfdmFsdWUgPSBmdGRpX3Npb19iNDgwMDsgYnJlYWs7CgkJY2FzZSA5NjAwOiBkaXZfdmFsdWUgPSBmdGRpX3Npb19iOTYwMDsgYnJlYWs7CgkJY2FzZSAxOTIwMDogZGl2X3ZhbHVlID0gZnRkaV9zaW9fYjE5MjAwOyBicmVhazsKCQljYXNlIDM4NDAwOiBkaXZfdmFsdWUgPSBmdGRpX3Npb19iMzg0MDA7IGJyZWFrOwoJCWNhc2UgNTc2MDA6IGRpdl92YWx1ZSA9IGZ0ZGlfc2lvX2I1NzYwMDsgIGJyZWFrOwoJCWNhc2UgMTE1MjAwOiBkaXZfdmFsdWUgPSBmdGRpX3Npb19iMTE1MjAwOyBicmVhazsKCQl9IC8qIGJhdWQgKi8KCQlpZiAoZGl2X3ZhbHVlID09IDApIHsKICAJCQlkYmcoIiVzIC0gQmF1ZHJhdGUgKCVkKSByZXF1ZXN0ZWQgaXMgbm90IHN1cHBvcnRlZCIsIF9fRlVOQ1RJT05fXywgIGJhdWQpOwoJCQlkaXZfdmFsdWUgPSBmdGRpX3Npb19iOTYwMDsKCQkJZGl2X29rYXkgPSAwOwoJCX0KCQlicmVhazsKCWNhc2UgRlQ4VTIzMkFNOiAvKiA4VTIzMkFNIGNoaXAgKi8KCQlpZiAoYmF1ZCA8PSAzMDAwMDAwKSB7CgkJCWRpdl92YWx1ZSA9IGZ0ZGlfMjMyYW1fYmF1ZF90b19kaXZpc29yKGJhdWQpOwoJCX0gZWxzZSB7CgkgICAgICAgICAgICAgICAgZGJnKCIlcyAtIEJhdWQgcmF0ZSB0b28gaGlnaCEiLCBfX0ZVTkNUSU9OX18pOwoJCQlkaXZfdmFsdWUgPSBmdGRpXzIzMmFtX2JhdWRfdG9fZGl2aXNvcig5NjAwKTsKCQkJZGl2X29rYXkgPSAwOwoJCX0KCQlicmVhazsKCWNhc2UgRlQyMzJCTTogLyogRlQyMzJCTSBjaGlwICovCgljYXNlIEZUMjIzMkM6IC8qIEZUMjIzMkMgY2hpcCAqLwoJCWlmIChiYXVkIDw9IDMwMDAwMDApIHsKCQkJZGl2X3ZhbHVlID0gZnRkaV8yMzJibV9iYXVkX3RvX2Rpdmlzb3IoYmF1ZCk7CgkJfSBlbHNlIHsKCSAgICAgICAgICAgICAgICBkYmcoIiVzIC0gQmF1ZCByYXRlIHRvbyBoaWdoISIsIF9fRlVOQ1RJT05fXyk7CgkJCWRpdl92YWx1ZSA9IGZ0ZGlfMjMyYm1fYmF1ZF90b19kaXZpc29yKDk2MDApOwoJCQlkaXZfb2theSA9IDA7CgkJfQoJCWJyZWFrOwoJfSAvKiBwcml2LT5jaGlwX3R5cGUgKi8KCglpZiAoZGl2X29rYXkpIHsKCQlkYmcoIiVzIC0gQmF1ZCByYXRlIHNldCB0byAlZCAoZGl2aXNvciAweCVsWCkgb24gY2hpcCAlcyIsCgkJCV9fRlVOQ1RJT05fXywgYmF1ZCwgKHVuc2lnbmVkIGxvbmcpZGl2X3ZhbHVlLAoJCQlmdGRpX2NoaXBfbmFtZVtwcml2LT5jaGlwX3R5cGVdKTsKCX0KCglyZXR1cm4oZGl2X3ZhbHVlKTsKfQoKCnN0YXRpYyBpbnQgZ2V0X3NlcmlhbF9pbmZvKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKiBwb3J0LCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKiByZXRpbmZvKQp7CglzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwoJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgdG1wOwoKCWlmICghcmV0aW5mbykKCQlyZXR1cm4gLUVGQVVMVDsKCW1lbXNldCgmdG1wLCAwLCBzaXplb2YodG1wKSk7Cgl0bXAuZmxhZ3MgPSBwcml2LT5mbGFnczsKCXRtcC5iYXVkX2Jhc2UgPSBwcml2LT5iYXVkX2Jhc2U7Cgl0bXAuY3VzdG9tX2Rpdmlzb3IgPSBwcml2LT5jdXN0b21fZGl2aXNvcjsKCWlmIChjb3B5X3RvX3VzZXIocmV0aW5mbywgJnRtcCwgc2l6ZW9mKCpyZXRpbmZvKSkpCgkJcmV0dXJuIC1FRkFVTFQ7CglyZXR1cm4gMDsKfSAvKiBnZXRfc2VyaWFsX2luZm8gKi8KCgpzdGF0aWMgaW50IHNldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICogcG9ydCwgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICogbmV3aW5mbykKeyAvKiBzZXRfc2VyaWFsX2luZm8gKi8KCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CglzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBuZXdfc2VyaWFsOwoJc3RydWN0IGZ0ZGlfcHJpdmF0ZSBvbGRfcHJpdjsKCglpZiAoY29weV9mcm9tX3VzZXIoJm5ld19zZXJpYWwsIG5ld2luZm8sIHNpemVvZihuZXdfc2VyaWFsKSkpCgkJcmV0dXJuIC1FRkFVTFQ7CglvbGRfcHJpdiA9ICogcHJpdjsKCgkvKiBEbyBlcnJvciBjaGVja2luZyBhbmQgcGVybWlzc2lvbiBjaGVja2luZyAqLwoKCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgewoJCWlmICgoKG5ld19zZXJpYWwuZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spICE9CgkJICAgICAocHJpdi0+ZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spKSkKCQkJcmV0dXJuIC1FUEVSTTsKCQlwcml2LT5mbGFncyA9ICgocHJpdi0+ZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spIHwKCQkJICAgICAgIChuZXdfc2VyaWFsLmZsYWdzICYgQVNZTkNfVVNSX01BU0spKTsKCQlwcml2LT5jdXN0b21fZGl2aXNvciA9IG5ld19zZXJpYWwuY3VzdG9tX2Rpdmlzb3I7CgkJZ290byBjaGVja19hbmRfZXhpdDsKCX0KCglpZiAoKG5ld19zZXJpYWwuYmF1ZF9iYXNlICE9IHByaXYtPmJhdWRfYmFzZSkgJiYKCSAgICAobmV3X3NlcmlhbC5iYXVkX2Jhc2UgPCA5NjAwKSkKCQlyZXR1cm4gLUVJTlZBTDsKCgkvKiBNYWtlIHRoZSBjaGFuZ2VzIC0gdGhlc2UgYXJlIHByaXZpbGVnZWQgY2hhbmdlcyEgKi8KCglwcml2LT5mbGFncyA9ICgocHJpdi0+ZmxhZ3MgJiB+QVNZTkNfRkxBR1MpIHwKCSAgICAgICAgICAgICAgIChuZXdfc2VyaWFsLmZsYWdzICYgQVNZTkNfRkxBR1MpKTsJCglwcml2LT5jdXN0b21fZGl2aXNvciA9IG5ld19zZXJpYWwuY3VzdG9tX2Rpdmlzb3I7CgoJcG9ydC0+dHR5LT5sb3dfbGF0ZW5jeSA9IChwcml2LT5mbGFncyAmIEFTWU5DX0xPV19MQVRFTkNZKSA/IDEgOiAwOwoKY2hlY2tfYW5kX2V4aXQ6CglpZiAoKG9sZF9wcml2LmZsYWdzICYgQVNZTkNfU1BEX01BU0spICE9CgkgICAgIChwcml2LT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSkgewoJCWlmICgocHJpdi0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX0hJKQoJCQlwb3J0LT50dHktPmFsdF9zcGVlZCA9IDU3NjAwOwoJCWVsc2UgaWYgKChwcml2LT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfVkhJKQoJCQlwb3J0LT50dHktPmFsdF9zcGVlZCA9IDExNTIwMDsKCQllbHNlIGlmICgocHJpdi0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1NISSkKCQkJcG9ydC0+dHR5LT5hbHRfc3BlZWQgPSAyMzA0MDA7CgkJZWxzZSBpZiAoKHByaXYtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9XQVJQKQoJCQlwb3J0LT50dHktPmFsdF9zcGVlZCA9IDQ2MDgwMDsKCQllbHNlCgkJCXBvcnQtPnR0eS0+YWx0X3NwZWVkID0gMDsKCX0KCWlmICgoKG9sZF9wcml2LmZsYWdzICYgQVNZTkNfU1BEX01BU0spICE9CgkgICAgIChwcml2LT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSkgfHwKCSAgICAoKChwcml2LT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfQ1VTVCkgJiYKCSAgICAgKG9sZF9wcml2LmN1c3RvbV9kaXZpc29yICE9IHByaXYtPmN1c3RvbV9kaXZpc29yKSkpIHsKCQljaGFuZ2Vfc3BlZWQocG9ydCk7Cgl9CgkKCXJldHVybiAoMCk7Cgp9IC8qIHNldF9zZXJpYWxfaW5mbyAqLwoKCi8qCiAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTeXNmcyBBdHRyaWJ1dGUKICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwoKc3RhdGljIHNzaXplX3Qgc2hvd19sYXRlbmN5X3RpbWVyKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQp7CglzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdG9fdXNiX3NlcmlhbF9wb3J0KGRldik7CglzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwoJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7Cgl1bnNpZ25lZCBzaG9ydCBsYXRlbmN5ID0gMDsKCWludCBydiA9IDA7CgkKCXVkZXYgPSB0b191c2JfZGV2aWNlKGRldik7CgkKCWRiZygiJXMiLF9fRlVOQ1RJT05fXyk7CgkKCXJ2ID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsCgkJCSAgICAgdXNiX3JjdmN0cmxwaXBlKHVkZXYsIDApLAoJCQkgICAgIEZURElfU0lPX0dFVF9MQVRFTkNZX1RJTUVSX1JFUVVFU1QsCgkJCSAgICAgRlRESV9TSU9fR0VUX0xBVEVOQ1lfVElNRVJfUkVRVUVTVF9UWVBFLAoJCQkgICAgIDAsIHByaXYtPmludGVyZmFjZSwgCgkJCSAgICAgKGNoYXIqKSAmbGF0ZW5jeSwgMSwgV0RSX1RJTUVPVVQpOwoJCglpZiAocnYgPCAwKSB7CgkJZGV2X2VycihkZXYsICJVbmFibGUgdG8gcmVhZCBsYXRlbmN5IHRpbWVyOiAlaSIsIHJ2KTsKCQlyZXR1cm4gLUVJTzsKCX0KCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVpXG4iLCBsYXRlbmN5KTsKfQoKLyogV3JpdGUgYSBuZXcgdmFsdWUgb2YgdGhlIGxhdGVuY3kgdGltZXIsIGluIHVuaXRzIG9mIG1pbGxpc2Vjb25kcy4gKi8Kc3RhdGljIHNzaXplX3Qgc3RvcmVfbGF0ZW5jeV90aW1lcihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKnZhbGJ1ZiwKCQkJCSAgIHNpemVfdCBjb3VudCkKewoJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHRvX3VzYl9zZXJpYWxfcG9ydChkZXYpOwoJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OwoJY2hhciBidWZbMV07CglpbnQgdiA9IHNpbXBsZV9zdHJ0b3VsKHZhbGJ1ZiwgTlVMTCwgMTApOwoJaW50IHJ2ID0gMDsKCQoJdWRldiA9IHRvX3VzYl9kZXZpY2UoZGV2KTsKCQoJZGJnKCIlczogc2V0dGluZyBsYXRlbmN5IHRpbWVyID0gJWkiLCBfX0ZVTkNUSU9OX18sIHYpOwoJCglydiA9IHVzYl9jb250cm9sX21zZyh1ZGV2LAoJCQkgICAgIHVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwKCQkJICAgICBGVERJX1NJT19TRVRfTEFURU5DWV9USU1FUl9SRVFVRVNULAoJCQkgICAgIEZURElfU0lPX1NFVF9MQVRFTkNZX1RJTUVSX1JFUVVFU1RfVFlQRSwKCQkJICAgICB2LCBwcml2LT5pbnRlcmZhY2UsIAoJCQkgICAgIGJ1ZiwgMCwgV0RSX1RJTUVPVVQpOwoJCglpZiAocnYgPCAwKSB7CgkJZGV2X2VycihkZXYsICJVbmFibGUgdG8gd3JpdGUgbGF0ZW5jeSB0aW1lcjogJWkiLCBydik7CgkJcmV0dXJuIC1FSU87Cgl9CgkKCXJldHVybiBjb3VudDsKfQoKLyogV3JpdGUgYW4gZXZlbnQgY2hhcmFjdGVyIGRpcmVjdGx5IHRvIHRoZSBGVERJIHJlZ2lzdGVyLiAgVGhlIEFTQ0lJCiAgIHZhbHVlIGlzIGluIHRoZSBsb3cgOCBiaXRzLCB3aXRoIHRoZSBlbmFibGUgYml0IGluIHRoZSA5dGggYml0LiAqLwpzdGF0aWMgc3NpemVfdCBzdG9yZV9ldmVudF9jaGFyKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqdmFsYnVmLAoJCQkJc2l6ZV90IGNvdW50KQp7CglzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdG9fdXNiX3NlcmlhbF9wb3J0KGRldik7CglzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwoJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CgljaGFyIGJ1ZlsxXTsKCWludCB2ID0gc2ltcGxlX3N0cnRvdWwodmFsYnVmLCBOVUxMLCAxMCk7CglpbnQgcnYgPSAwOwoJCgl1ZGV2ID0gdG9fdXNiX2RldmljZShkZXYpOwoJCglkYmcoIiVzOiBzZXR0aW5nIGV2ZW50IGNoYXIgPSAlaSIsIF9fRlVOQ1RJT05fXywgdik7CgkKCXJ2ID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsCgkJCSAgICAgdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApLAoJCQkgICAgIEZURElfU0lPX1NFVF9FVkVOVF9DSEFSX1JFUVVFU1QsCgkJCSAgICAgRlRESV9TSU9fU0VUX0VWRU5UX0NIQVJfUkVRVUVTVF9UWVBFLAoJCQkgICAgIHYsIHByaXYtPmludGVyZmFjZSwgCgkJCSAgICAgYnVmLCAwLCBXRFJfVElNRU9VVCk7CgkKCWlmIChydiA8IDApIHsKCQlkYmcoIlVuYWJsZSB0byB3cml0ZSBldmVudCBjaGFyYWN0ZXI6ICVpIiwgcnYpOwoJCXJldHVybiAtRUlPOwoJfQoJCglyZXR1cm4gY291bnQ7Cn0KCnN0YXRpYyBERVZJQ0VfQVRUUihsYXRlbmN5X3RpbWVyLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19sYXRlbmN5X3RpbWVyLCBzdG9yZV9sYXRlbmN5X3RpbWVyKTsKc3RhdGljIERFVklDRV9BVFRSKGV2ZW50X2NoYXIsIFNfSVdVU1IsIE5VTEwsIHN0b3JlX2V2ZW50X2NoYXIpOwoKc3RhdGljIHZvaWQgY3JlYXRlX3N5c2ZzX2F0dHJzKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCnsJCglzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2OwoJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CgoJZGJnKCIlcyIsX19GVU5DVElPTl9fKTsKCQoJcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbMF0pOwoJdWRldiA9IHNlcmlhbC0+ZGV2OwoJCgkvKiBYWFggSSd2ZSBubyBpZGVhIGlmIHRoZSBvcmlnaW5hbCBTSU8gc3VwcG9ydHMgdGhlIGV2ZW50X2NoYXIKCSAqIHN5c2ZzIHBhcmFtZXRlciwgc28gSSdtIHBsYXlpbmcgaXQgc2FmZS4gICovCglpZiAocHJpdi0+Y2hpcF90eXBlICE9IFNJTykgewoJCWRiZygic3lzZnMgYXR0cmlidXRlcyBmb3IgJXMiLCBmdGRpX2NoaXBfbmFtZVtwcml2LT5jaGlwX3R5cGVdKTsKCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJnVkZXYtPmRldiwgJmRldl9hdHRyX2V2ZW50X2NoYXIpOwoJCWlmIChwcml2LT5jaGlwX3R5cGUgPT0gRlQyMzJCTSB8fCBwcml2LT5jaGlwX3R5cGUgPT0gRlQyMjMyQykgewoJCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJnVkZXYtPmRldiwgJmRldl9hdHRyX2xhdGVuY3lfdGltZXIpOwoJCX0KCX0KfQoKc3RhdGljIHZvaWQgcmVtb3ZlX3N5c2ZzX2F0dHJzKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCnsKCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXY7CglzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKCglkYmcoIiVzIixfX0ZVTkNUSU9OX18pOwkKCglwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHNlcmlhbC0+cG9ydFswXSk7Cgl1ZGV2ID0gc2VyaWFsLT5kZXY7CgkKCS8qIFhYWCBzZWUgY3JlYXRlX3N5c2ZzX2F0dHJzICovCglpZiAocHJpdi0+Y2hpcF90eXBlICE9IFNJTykgewoJCWRldmljZV9yZW1vdmVfZmlsZSgmdWRldi0+ZGV2LCAmZGV2X2F0dHJfZXZlbnRfY2hhcik7CgkJaWYgKHByaXYtPmNoaXBfdHlwZSA9PSBGVDIzMkJNIHx8IHByaXYtPmNoaXBfdHlwZSA9PSBGVDIyMzJDKSB7CgkJCWRldmljZV9yZW1vdmVfZmlsZSgmdWRldi0+ZGV2LCAmZGV2X2F0dHJfbGF0ZW5jeV90aW1lcik7CgkJfQoJfQoJCn0KCi8qCiAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBGVERJIGRyaXZlciBzcGVjaWZpYyBmdW5jdGlvbnMKICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwoKLyogQ29tbW9uIHN0YXJ0dXAgc3Vicm91dGluZSAqLwovKiBDYWxsZWQgZnJvbSBmdGRpX1NJT19zdGFydHVwLCBldGMuICovCnN0YXRpYyBpbnQgZnRkaV9jb21tb25fc3RhcnR1cCAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKewoJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHNlcmlhbC0+cG9ydFswXTsKCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXY7CgkKCWRiZygiJXMiLF9fRlVOQ1RJT05fXyk7CgoJcHJpdiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmdGRpX3ByaXZhdGUpLCBHRlBfS0VSTkVMKTsKCWlmICghcHJpdil7CgkJZXJyKCIlcy0ga21hbGxvYyglWmQpIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18sIHNpemVvZihzdHJ1Y3QgZnRkaV9wcml2YXRlKSk7CgkJcmV0dXJuIC1FTk9NRU07Cgl9CgltZW1zZXQocHJpdiwgMCwgc2l6ZW9mKCpwcml2KSk7CgoJc3Bpbl9sb2NrX2luaXQoJnByaXYtPnJ4X2xvY2spOwogICAgICAgIGluaXRfd2FpdHF1ZXVlX2hlYWQoJnByaXYtPmRlbHRhX21zcl93YWl0KTsKCS8qIFRoaXMgd2lsbCBwdXNoIHRoZSBjaGFyYWN0ZXJzIHRocm91Z2ggaW1tZWRpYXRlbHkgcmF0aGVyCgkgICB0aGFuIHF1ZXVlIGEgdGFzayB0byBkZWxpdmVyIHRoZW0gKi8KCXByaXYtPmZsYWdzID0gQVNZTkNfTE9XX0xBVEVOQ1k7CgoJLyogSW5jcmVhc2UgdGhlIHNpemUgb2YgcmVhZCBidWZmZXJzICovCglrZnJlZShwb3J0LT5idWxrX2luX2J1ZmZlcik7Cglwb3J0LT5idWxrX2luX2J1ZmZlciA9IGttYWxsb2MgKEJVRlNaLCBHRlBfS0VSTkVMKTsKCWlmICghcG9ydC0+YnVsa19pbl9idWZmZXIpIHsKCQlrZnJlZSAocHJpdik7CgkJcmV0dXJuIC1FTk9NRU07Cgl9CglpZiAocG9ydC0+cmVhZF91cmIpIHsKCQlwb3J0LT5yZWFkX3VyYi0+dHJhbnNmZXJfYnVmZmVyID0gcG9ydC0+YnVsa19pbl9idWZmZXI7CgkJcG9ydC0+cmVhZF91cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBCVUZTWjsKCX0KCgkvKiBGcmVlIHBvcnQncyBleGlzdGluZyB3cml0ZSB1cmIgYW5kIHRyYW5zZmVyIGJ1ZmZlci4gKi8KCWlmIChwb3J0LT53cml0ZV91cmIpIHsKCQl1c2JfZnJlZV91cmIgKHBvcnQtPndyaXRlX3VyYik7CgkJcG9ydC0+d3JpdGVfdXJiID0gTlVMTDsKCX0KCWtmcmVlKHBvcnQtPmJ1bGtfb3V0X2J1ZmZlcik7Cglwb3J0LT5idWxrX291dF9idWZmZXIgPSBOVUxMOwoKCXVzYl9zZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbMF0sIHByaXYpOwoJCglyZXR1cm4gKDApOwp9CgoKLyogU3RhcnR1cCBmb3IgdGhlIFNJTyBjaGlwICovCi8qIENhbGxlZCBmcm9tIHVzYnNlcmlhbDpzZXJpYWxfcHJvYmUgKi8Kc3RhdGljIGludCBmdGRpX1NJT19zdGFydHVwIChzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQp7CglzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2OwoJaW50IGVycjsKCglkYmcoIiVzIixfX0ZVTkNUSU9OX18pOwoKCWVyciA9IGZ0ZGlfY29tbW9uX3N0YXJ0dXAoc2VyaWFsKTsKCWlmIChlcnIpewoJCXJldHVybiAoZXJyKTsKCX0KCglwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHNlcmlhbC0+cG9ydFswXSk7Cglwcml2LT5jaGlwX3R5cGUgPSBTSU87Cglwcml2LT5iYXVkX2Jhc2UgPSAxMjAwMDAwMCAvIDE2OwoJcHJpdi0+d3JpdGVfb2Zmc2V0ID0gMTsKCQoJcmV0dXJuICgwKTsKfQoKLyogU3RhcnR1cCBmb3IgdGhlIDhVMjMyQU0gY2hpcCAqLwovKiBDYWxsZWQgZnJvbSB1c2JzZXJpYWw6c2VyaWFsX3Byb2JlICovCnN0YXRpYyBpbnQgZnRkaV84VTIzMkFNX3N0YXJ0dXAgKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCnsgLyogZnRkaV84VTIzMkFNX3N0YXJ0dXAgKi8KCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXY7CglpbnQgZXJyOwoKCWRiZygiJXMiLF9fRlVOQ1RJT05fXyk7CgllcnIgPSBmdGRpX2NvbW1vbl9zdGFydHVwKHNlcmlhbCk7CglpZiAoZXJyKXsKCQlyZXR1cm4gKGVycik7Cgl9CgoJcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbMF0pOwoJcHJpdi0+Y2hpcF90eXBlID0gRlQ4VTIzMkFNOwoJcHJpdi0+YmF1ZF9iYXNlID0gNDgwMDAwMDAgLyAyOyAvKiBXb3VsZCBiZSAvIDE2LCBidXQgRlRESSBzdXBwb3J0cyAwLjEyNSwgMC4yNSBhbmQgMC41IGRpdmlzb3IgZnJhY3Rpb25zISAqLwoJCgljcmVhdGVfc3lzZnNfYXR0cnMoc2VyaWFsKTsKCQoJcmV0dXJuICgwKTsKfSAvKiBmdGRpXzhVMjMyQU1fc3RhcnR1cCAqLwoKLyogU3RhcnR1cCBmb3IgdGhlIEZUMjMyQk0gY2hpcCAqLwovKiBDYWxsZWQgZnJvbSB1c2JzZXJpYWw6c2VyaWFsX3Byb2JlICovCnN0YXRpYyBpbnQgZnRkaV9GVDIzMkJNX3N0YXJ0dXAgKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCnsgLyogZnRkaV9GVDIzMkJNX3N0YXJ0dXAgKi8KCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXY7CglpbnQgZXJyOwoKCWRiZygiJXMiLF9fRlVOQ1RJT05fXyk7CgllcnIgPSBmdGRpX2NvbW1vbl9zdGFydHVwKHNlcmlhbCk7CglpZiAoZXJyKXsKCQlyZXR1cm4gKGVycik7Cgl9CgoJcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbMF0pOwoJcHJpdi0+Y2hpcF90eXBlID0gRlQyMzJCTTsKCXByaXYtPmJhdWRfYmFzZSA9IDQ4MDAwMDAwIC8gMjsgLyogV291bGQgYmUgLyAxNiwgYnV0IEZUMjMyQk0gc3VwcG9ydHMgbXVsdGlwbGUgb2YgMC4xMjUgZGl2aXNvciBmcmFjdGlvbnMhICovCgkKCWNyZWF0ZV9zeXNmc19hdHRycyhzZXJpYWwpOwoKCXJldHVybiAoMCk7Cn0gLyogZnRkaV9GVDIzMkJNX3N0YXJ0dXAgKi8KCi8qIFN0YXJ0dXAgZm9yIHRoZSBGVDIyMzJDIGNoaXAgKi8KLyogQ2FsbGVkIGZyb20gdXNic2VyaWFsOnNlcmlhbF9wcm9iZSAqLwpzdGF0aWMgaW50IGZ0ZGlfRlQyMjMyQ19zdGFydHVwIChzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQp7IC8qIGZ0ZGlfRlQyMjMyQ19zdGFydHVwICovCglzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2OwoJaW50IGVycjsKCWludCBpbnRlcjsKCglkYmcoIiVzIixfX0ZVTkNUSU9OX18pOwoJZXJyID0gZnRkaV9jb21tb25fc3RhcnR1cChzZXJpYWwpOwoJaWYgKGVycil7CgkJcmV0dXJuIChlcnIpOwoJfQoKCXByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEoc2VyaWFsLT5wb3J0WzBdKTsKCXByaXYtPmNoaXBfdHlwZSA9IEZUMjIzMkM7CglpbnRlciA9IHNlcmlhbC0+aW50ZXJmYWNlLT5hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXI7CgoJaWYgKGludGVyKSB7CgkJcHJpdi0+aW50ZXJmYWNlID0gUElUX1NJT0I7Cgl9CgllbHNlICB7CgkJcHJpdi0+aW50ZXJmYWNlID0gUElUX1NJT0E7Cgl9Cglwcml2LT5iYXVkX2Jhc2UgPSA0ODAwMDAwMCAvIDI7IC8qIFdvdWxkIGJlIC8gMTYsIGJ1dCBGVDIyMzJDIHN1cHBvcnRzIG11bHRpcGxlIG9mIDAuMTI1IGRpdmlzb3IgZnJhY3Rpb25zISAqLwoJCgljcmVhdGVfc3lzZnNfYXR0cnMoc2VyaWFsKTsKCglyZXR1cm4gKDApOwp9IC8qIGZ0ZGlfRlQyMjMyQ19zdGFydHVwICovCgovKiBTdGFydHVwIGZvciB0aGUgVVNCLVVJUlQgZGV2aWNlLCB3aGljaCByZXF1aXJlcyBoYXJkd2lyZWQgYmF1ZHJhdGUgKDM4NDAwIGdldHMgbWFwcGVkIHRvIDMxMjUwMCkgKi8KLyogQ2FsbGVkIGZyb20gdXNic2VyaWFsOnNlcmlhbF9wcm9iZSAqLwpzdGF0aWMgaW50IGZ0ZGlfVVNCX1VJUlRfc3RhcnR1cCAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKeyAvKiBmdGRpX1VTQl9VSVJUX3N0YXJ0dXAgKi8KCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXY7CglpbnQgZXJyOwoKCWRiZygiJXMiLF9fRlVOQ1RJT05fXyk7CgllcnIgPSBmdGRpXzhVMjMyQU1fc3RhcnR1cChzZXJpYWwpOwoJaWYgKGVycil7CgkJcmV0dXJuIChlcnIpOwoJfQoKCXByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEoc2VyaWFsLT5wb3J0WzBdKTsKCXByaXYtPmZsYWdzIHw9IEFTWU5DX1NQRF9DVVNUOwoJcHJpdi0+Y3VzdG9tX2Rpdmlzb3IgPSA3NzsKCXByaXYtPmZvcmNlX2JhdWQgPSBCMzg0MDA7CgkKCXJldHVybiAoMCk7Cn0gLyogZnRkaV9VU0JfVUlSVF9zdGFydHVwICovCgovKiBTdGFydHVwIGZvciB0aGUgSEUtVElSQTEgZGV2aWNlLCB3aGljaCByZXF1aXJlcyBoYXJkd2lyZWQKICogYmF1ZHJhdGUgKDM4NDAwIGdldHMgbWFwcGVkIHRvIDEwMDAwMCkgKi8Kc3RhdGljIGludCBmdGRpX0hFX1RJUkExX3N0YXJ0dXAgKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCnsgLyogZnRkaV9IRV9USVJBMV9zdGFydHVwICovCglzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2OwoJaW50IGVycjsKCglkYmcoIiVzIixfX0ZVTkNUSU9OX18pOwoJZXJyID0gZnRkaV9GVDIzMkJNX3N0YXJ0dXAoc2VyaWFsKTsKCWlmIChlcnIpewoJCXJldHVybiAoZXJyKTsKCX0KCglwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHNlcmlhbC0+cG9ydFswXSk7Cglwcml2LT5mbGFncyB8PSBBU1lOQ19TUERfQ1VTVDsKCXByaXYtPmN1c3RvbV9kaXZpc29yID0gMjQwOwoJcHJpdi0+Zm9yY2VfYmF1ZCA9IEIzODQwMDsKCXByaXYtPmZvcmNlX3J0c2N0cyA9IDE7CgkKCXJldHVybiAoMCk7Cn0gLyogZnRkaV9IRV9USVJBMV9zdGFydHVwICovCgoKLyogZnRkaV9zaHV0ZG93biBpcyBjYWxsZWQgZnJvbSB1c2JzZXJpYWw6dXNiX3NlcmlhbF9kaXNjb25uZWN0IAogKiAgIGl0IGlzIGNhbGxlZCB3aGVuIHRoZSB1c2IgZGV2aWNlIGlzIGRpc2Nvbm5lY3RlZAogKgogKiAgIHVzYnNlcmlhbDp1c2Jfc2VyaWFsX2Rpc2Nvbm5lY3QKICogICAgICBjYWxscyBfX3NlcmlhbF9jbG9zZSBmb3IgZWFjaCBvcGVuIG9mIHRoZSBwb3J0CiAqICAgICAgc2h1dGRvd24gaXMgY2FsbGVkIHRoZW4gKGllIGZ0ZGlfc2h1dGRvd24pCiAqLwoKCnN0YXRpYyB2b2lkIGZ0ZGlfc2h1dGRvd24gKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCnsgLyogZnRkaV9zaHV0ZG93biAqLwoJCglzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gc2VyaWFsLT5wb3J0WzBdOwoJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKCglkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKCglyZW1vdmVfc3lzZnNfYXR0cnMoc2VyaWFsKTsKCQoJLyogYWxsIG9wZW4gcG9ydHMgYXJlIGNsb3NlZCBhdCB0aGlzIHBvaW50IAogICAgICAgICAqICAgIChieSB1c2JzZXJpYWwuYzpfX3NlcmlhbF9jbG9zZSwgd2hpY2ggY2FsbHMgZnRkaV9jbG9zZSkgIAoJICovCgoJaWYgKHByaXYpIHsKCQl1c2Jfc2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCwgTlVMTCk7CgkJa2ZyZWUocHJpdik7Cgl9Cn0gLyogZnRkaV9zaHV0ZG93biAqLwoKCnN0YXRpYyBpbnQgIGZ0ZGlfb3BlbiAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApCnsgLyogZnRkaV9vcGVuICovCglzdHJ1Y3QgdGVybWlvcyB0bXBfdGVybWlvczsKCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJCglpbnQgcmVzdWx0ID0gMDsKCWNoYXIgYnVmWzFdOyAvKiBOZWVkZWQgZm9yIHRoZSB1c2JfY29udHJvbF9tc2cgSSB0aGluayAqLwoKCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOwoKCglwb3J0LT50dHktPmxvd19sYXRlbmN5ID0gKHByaXYtPmZsYWdzICYgQVNZTkNfTE9XX0xBVEVOQ1kpID8gMSA6IDA7CgoJLyogTm8gZXJyb3IgY2hlY2tpbmcgZm9yIHRoaXMgKHdpbGwgZ2V0IGVycm9ycyBsYXRlciBhbnl3YXkpICovCgkvKiBTZWUgZnRkaV9zaW8uaCBmb3IgZGVzY3JpcHRpb24gb2Ygd2hhdCBpcyByZXNldCAqLwoJdXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3NuZGN0cmxwaXBlKGRldiwgMCksCgkJCUZURElfU0lPX1JFU0VUX1JFUVVFU1QsIEZURElfU0lPX1JFU0VUX1JFUVVFU1RfVFlQRSwgCgkJCUZURElfU0lPX1JFU0VUX1NJTywgCgkJCXByaXYtPmludGVyZmFjZSwgYnVmLCAwLCBXRFJfVElNRU9VVCk7CgoJLyogVGVybWlvcyBkZWZhdWx0cyBhcmUgc2V0IGJ5IHVzYl9zZXJpYWxfaW5pdC4gV2UgZG9uJ3QgY2hhbmdlCgkgICBwb3J0LT50dHktPnRlcm1pb3MgLSB0aGlzIHdvdWxkIGxvb3NlIHNwZWVkIHNldHRpbmdzLCBldGMuCgkgICBUaGlzIGlzIHNhbWUgYmVoYXZpb3VyIGFzIHNlcmlhbC5jL3JzX29wZW4oKSAtIEt1YmEgKi8KCgkvKiBmdGRpX3NldF90ZXJtaW9zICB3aWxsIHNlbmQgdXNiIGNvbnRyb2wgbWVzc2FnZXMgKi8KCWZ0ZGlfc2V0X3Rlcm1pb3MocG9ydCwgJnRtcF90ZXJtaW9zKTsKCgkvKiBGSVhNRTogRmxvdyBjb250cm9sIG1pZ2h0IGJlIGVuYWJsZWQsIHNvIGl0IHNob3VsZCBiZSBjaGVja2VkIC0KCSAgIHdlIGhhdmUgbm8gY29udHJvbCBvZiBkZWZhdWx0cyEgKi8KCS8qIFR1cm4gb24gUlRTIGFuZCBEVFIgc2luY2Ugd2UgYXJlIG5vdCBmbG93IGNvbnRyb2xsaW5nIGJ5IGRlZmF1bHQgKi8KCWlmIChzZXRfZHRyKHBvcnQsIEhJR0gpIDwgMCkgewoJCWVycigiJXMgRXJyb3IgZnJvbSBEVFIgSElHSCB1cmIiLCBfX0ZVTkNUSU9OX18pOwoJfQoJaWYgKHNldF9ydHMocG9ydCwgSElHSCkgPCAwKXsKCQllcnIoIiVzIEVycm9yIGZyb20gUlRTIEhJR0ggdXJiIiwgX19GVU5DVElPTl9fKTsKCX0KCgkvKiBOb3QgdGhyb3R0bGVkICovCglzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cnhfbG9jaywgZmxhZ3MpOwoJcHJpdi0+cnhfZmxhZ3MgJj0gfihUSFJPVFRMRUQgfCBBQ1RVQUxMWV9USFJPVFRMRUQpOwoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cnhfbG9jaywgZmxhZ3MpOwoKCS8qIFN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgZGV2aWNlICovCgl1c2JfZmlsbF9idWxrX3VyYihwb3J0LT5yZWFkX3VyYiwgZGV2LAoJCSAgICAgIHVzYl9yY3ZidWxrcGlwZShkZXYsIHBvcnQtPmJ1bGtfaW5fZW5kcG9pbnRBZGRyZXNzKSwKCQkgICAgICBwb3J0LT5yZWFkX3VyYi0+dHJhbnNmZXJfYnVmZmVyLCBwb3J0LT5yZWFkX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKCQkgICAgICBmdGRpX3JlYWRfYnVsa19jYWxsYmFjaywgcG9ydCk7CglyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5yZWFkX3VyYiwgR0ZQX0tFUk5FTCk7CglpZiAocmVzdWx0KQoJCWVycigiJXMgLSBmYWlsZWQgc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWQiLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CgoKCXJldHVybiByZXN1bHQ7Cn0gLyogZnRkaV9vcGVuICovCgoKCi8qIAogKiB1c2JzZXJpYWw6X19zZXJpYWxfY2xvc2UgIG9ubHkgY2FsbHMgZnRkaV9jbG9zZSBpZiB0aGUgcG9pbnQgaXMgb3BlbgogKgogKiAgIFRoaXMgb25seSBnZXRzIGNhbGxlZCB3aGVuIGl0IGlzIHRoZSBsYXN0IGNsb3NlCiAqICAgCiAqICAgCiAqLwoKc3RhdGljIHZvaWQgZnRkaV9jbG9zZSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApCnsgLyogZnRkaV9jbG9zZSAqLwoJdW5zaWduZWQgaW50IGNfY2ZsYWcgPSBwb3J0LT50dHktPnRlcm1pb3MtPmNfY2ZsYWc7CglzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwoJY2hhciBidWZbMV07CgoJZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CgoJaWYgKGNfY2ZsYWcgJiBIVVBDTCl7CgkJLyogRGlzYWJsZSBmbG93IGNvbnRyb2wgKi8KCQlpZiAodXNiX2NvbnRyb2xfbXNnKHBvcnQtPnNlcmlhbC0+ZGV2LCAKCQkJCSAgICB1c2Jfc25kY3RybHBpcGUocG9ydC0+c2VyaWFsLT5kZXYsIDApLAoJCQkJICAgIEZURElfU0lPX1NFVF9GTE9XX0NUUkxfUkVRVUVTVCwKCQkJCSAgICBGVERJX1NJT19TRVRfRkxPV19DVFJMX1JFUVVFU1RfVFlQRSwKCQkJCSAgICAwLCBwcml2LT5pbnRlcmZhY2UsIGJ1ZiwgMCwKCQkJCSAgICBXRFJfVElNRU9VVCkgPCAwKSB7CgkJCWVycigiZXJyb3IgZnJvbSBmbG93Y29udHJvbCB1cmIiKTsKCQl9CSAgICAKCgkJLyogZHJvcCBEVFIgKi8KCQlpZiAoc2V0X2R0cihwb3J0LCBMT1cpIDwgMCl7CgkJCWVycigiRXJyb3IgZnJvbSBEVFIgTE9XIHVyYiIpOwoJCX0KCQkvKiBkcm9wIFJUUyAqLwoJCWlmIChzZXRfcnRzKHBvcnQsIExPVykgPCAwKSB7CgkJCWVycigiRXJyb3IgZnJvbSBSVFMgTE9XIHVyYiIpOwoJCX0KCX0gLyogTm90ZSBjaGFuZ2Ugbm8gbGluZSBpZiBodXBjbCBpcyBvZmYgKi8KCQoJLyogc2h1dGRvd24gb3VyIGJ1bGsgcmVhZCAqLwoJaWYgKHBvcnQtPnJlYWRfdXJiKQoJCXVzYl9raWxsX3VyYihwb3J0LT5yZWFkX3VyYik7Cn0gLyogZnRkaV9jbG9zZSAqLwoKCiAgCi8qIFRoZSBTSU8gcmVxdWlyZXMgdGhlIGZpcnN0IGJ5dGUgdG8gaGF2ZToKICogIEIwIDEKICogIEIxIDAKICogIEIyLi43IGxlbmd0aCBvZiBtZXNzYWdlIGV4Y2x1ZGluZyBieXRlIDAKICoKICogVGhlIG5ldyBkZXZpY2VzIGRvIG5vdCByZXF1aXJlIHRoaXMgYnl0ZQogKi8Kc3RhdGljIGludCBmdGRpX3dyaXRlIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAoJCQkgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKeyAvKiBmdGRpX3dyaXRlICovCglzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwoJc3RydWN0IHVyYiAqdXJiOwoJdW5zaWduZWQgY2hhciAqYnVmZmVyOwoJaW50IGRhdGFfb2Zmc2V0IDsgICAgICAgLyogd2lsbCBiZSAxIGZvciB0aGUgU0lPIGFuZCAwIG90aGVyd2lzZSAqLwoJaW50IHN0YXR1czsKCWludCB0cmFuc2Zlcl9zaXplOwoKCWRiZygiJXMgcG9ydCAlZCwgJWQgYnl0ZXMiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlciwgY291bnQpOwoKCWlmIChjb3VudCA9PSAwKSB7CgkJZGJnKCJ3cml0ZSByZXF1ZXN0IG9mIDAgYnl0ZXMiKTsKCQlyZXR1cm4gMDsKCX0KCQoJZGF0YV9vZmZzZXQgPSBwcml2LT53cml0ZV9vZmZzZXQ7CiAgICAgICAgZGJnKCJkYXRhX29mZnNldCBzZXQgdG8gJWQiLGRhdGFfb2Zmc2V0KTsKCgkvKiBEZXRlcm1pbmUgdG90YWwgdHJhbnNmZXIgc2l6ZSAqLwoJdHJhbnNmZXJfc2l6ZSA9IGNvdW50OwoJaWYgKGRhdGFfb2Zmc2V0ID4gMCkgewoJCS8qIE9yaWdpbmFsIHNpbyBuZWVkcyBjb250cm9sIGJ5dGVzIHRvby4uLiAqLwoJCXRyYW5zZmVyX3NpemUgKz0gKGRhdGFfb2Zmc2V0ICoKCQkJCSgoY291bnQgKyAoUEtUU1ogLSAxIC0gZGF0YV9vZmZzZXQpKSAvCgkJCQkgKFBLVFNaIC0gZGF0YV9vZmZzZXQpKSk7Cgl9CgoJYnVmZmVyID0ga21hbGxvYyAodHJhbnNmZXJfc2l6ZSwgR0ZQX0FUT01JQyk7CglpZiAoIWJ1ZmZlcikgewoJCWVycigiJXMgcmFuIG91dCBvZiBrZXJuZWwgbWVtb3J5IGZvciB1cmIgLi4uIiwgX19GVU5DVElPTl9fKTsKCQlyZXR1cm4gLUVOT01FTTsKCX0KCgl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOwoJaWYgKCF1cmIpIHsKCQllcnIoIiVzIC0gbm8gbW9yZSBmcmVlIHVyYnMiLCBfX0ZVTkNUSU9OX18pOwoJCWtmcmVlIChidWZmZXIpOwoJCXJldHVybiAtRU5PTUVNOwoJfQoKCS8qIENvcHkgZGF0YSAqLwoJaWYgKGRhdGFfb2Zmc2V0ID4gMCkgewoJCS8qIE9yaWdpbmFsIHNpbyByZXF1aXJlcyBjb250cm9sIGJ5dGUgYXQgc3RhcnQgb2YgZWFjaCBwYWNrZXQuICovCgkJaW50IHVzZXJfcGt0c3ogPSBQS1RTWiAtIGRhdGFfb2Zmc2V0OwoJCWludCB0b2RvID0gY291bnQ7CgkJdW5zaWduZWQgY2hhciAqZmlyc3RfYnl0ZSA9IGJ1ZmZlcjsKCQljb25zdCB1bnNpZ25lZCBjaGFyICpjdXJyZW50X3Bvc2l0aW9uID0gYnVmOwoKCQl3aGlsZSAodG9kbyA+IDApIHsKCQkJaWYgKHVzZXJfcGt0c3ogPiB0b2RvKSB7CgkJCQl1c2VyX3BrdHN6ID0gdG9kbzsKCQkJfQoJCQkvKiBXcml0ZSB0aGUgY29udHJvbCBieXRlIGF0IHRoZSBmcm9udCBvZiB0aGUgcGFja2V0Ki8KCQkJKmZpcnN0X2J5dGUgPSAxIHwgKCh1c2VyX3BrdHN6KSA8PCAyKTsgCgkJCS8qIENvcHkgZGF0YSBmb3IgcGFja2V0ICovCgkJCW1lbWNweSAoZmlyc3RfYnl0ZSArIGRhdGFfb2Zmc2V0LAoJCQkJY3VycmVudF9wb3NpdGlvbiwgdXNlcl9wa3Rzeik7CgkJCWZpcnN0X2J5dGUgKz0gdXNlcl9wa3RzeiArIGRhdGFfb2Zmc2V0OwoJCQljdXJyZW50X3Bvc2l0aW9uICs9IHVzZXJfcGt0c3o7CgkJCXRvZG8gLT0gdXNlcl9wa3RzejsKCQl9Cgl9IGVsc2UgewoJCS8qIE5vIGNvbnRyb2wgYnl0ZSByZXF1aXJlZC4gKi8KCQkvKiBDb3B5IGluIHRoZSBkYXRhIHRvIHNlbmQgKi8KCQltZW1jcHkgKGJ1ZmZlciwgYnVmLCBjb3VudCk7Cgl9CgoJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sIHRyYW5zZmVyX3NpemUsIGJ1ZmZlcik7CgoJLyogZmlsbCB0aGUgYnVmZmVyIGFuZCBzZW5kIGl0ICovCgl1c2JfZmlsbF9idWxrX3VyYih1cmIsIHBvcnQtPnNlcmlhbC0+ZGV2LCAKCQkgICAgICB1c2Jfc25kYnVsa3BpcGUocG9ydC0+c2VyaWFsLT5kZXYsIHBvcnQtPmJ1bGtfb3V0X2VuZHBvaW50QWRkcmVzcyksCgkJICAgICAgYnVmZmVyLCB0cmFuc2Zlcl9zaXplLAoJCSAgICAgIGZ0ZGlfd3JpdGVfYnVsa19jYWxsYmFjaywgcG9ydCk7CgoJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKCWlmIChzdGF0dXMpIHsKCQllcnIoIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgd3JpdGUgdXJiLCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKCQljb3VudCA9IHN0YXR1czsKCQlrZnJlZSAoYnVmZmVyKTsKCX0KCgkvKiB3ZSBhcmUgZG9uZSB3aXRoIHRoaXMgdXJiLCBzbyBsZXQgdGhlIGhvc3QgZHJpdmVyCgkgKiByZWFsbHkgZnJlZSBpdCB3aGVuIGl0IGlzIGZpbmlzaGVkIHdpdGggaXQgKi8KCXVzYl9mcmVlX3VyYiAodXJiKTsKCglkYmcoIiVzIHdyaXRlIHJldHVybmluZzogJWQiLCBfX0ZVTkNUSU9OX18sIGNvdW50KTsKCXJldHVybiBjb3VudDsKfSAvKiBmdGRpX3dyaXRlICovCgoKLyogVGhpcyBmdW5jdGlvbiBtYXkgZ2V0IGNhbGxlZCB3aGVuIHRoZSBkZXZpY2UgaXMgY2xvc2VkICovCgpzdGF0aWMgdm9pZCBmdGRpX3dyaXRlX2J1bGtfY2FsbGJhY2sgKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCnsKCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKXVyYi0+Y29udGV4dDsKCgkvKiBmcmVlIHVwIHRoZSB0cmFuc2ZlciBidWZmZXIsIGFzIHVzYl9mcmVlX3VyYigpIGRvZXMgbm90IGRvIHRoaXMgKi8KCWtmcmVlICh1cmItPnRyYW5zZmVyX2J1ZmZlcik7CgoJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CgkKCWlmICh1cmItPnN0YXR1cykgewoJCWRiZygibm9uemVybyB3cml0ZSBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLCB1cmItPnN0YXR1cyk7CgkJcmV0dXJuOwoJfQoKCXNjaGVkdWxlX3dvcmsoJnBvcnQtPndvcmspOwp9IC8qIGZ0ZGlfd3JpdGVfYnVsa19jYWxsYmFjayAqLwoKCnN0YXRpYyBpbnQgZnRkaV93cml0ZV9yb29tKCBzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ICkKewoJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CgoJLyoKCSAqIFdlIHJlYWxseSBjYW4gdGFrZSBhbnl0aGluZyB0aGUgdXNlciB0aHJvd3MgYXQgdXMKCSAqIGJ1dCBsZXQncyBwaWNrIGEgbmljZSBiaWcgbnVtYmVyIHRvIHRlbGwgdGhlIHR0eQoJICogbGF5ZXIgdGhhdCB3ZSBoYXZlIGxvdHMgb2YgZnJlZSBzcGFjZQoJICovCglyZXR1cm4gMjA0ODsKfSAvKiBmdGRpX3dyaXRlX3Jvb20gKi8KCgpzdGF0aWMgaW50IGZ0ZGlfY2hhcnNfaW5fYnVmZmVyIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQp7IC8qIGZ0ZGlfY2hhcnNfaW5fYnVmZmVyICovCglkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKCgkvKiAKCSAqIFdlIGNhbid0IHJlYWxseSBhY2NvdW50IGZvciBob3cgbXVjaCBkYXRhIHdlCgkgKiBoYXZlIHNlbnQgb3V0LCBidXQgaGFzbid0IG1hZGUgaXQgdGhyb3VnaCB0byB0aGUKCSAqIGRldmljZSwgc28ganVzdCB0ZWxsIHRoZSB0dHkgbGF5ZXIgdGhhdCBldmVyeXRoaW5nCgkgKiBpcyBmbHVzaGVkLgoJICovCglyZXR1cm4gMDsKfSAvKiBmdGRpX2NoYXJzX2luX2J1ZmZlciAqLwoKCgpzdGF0aWMgdm9pZCBmdGRpX3JlYWRfYnVsa19jYWxsYmFjayAoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKeyAvKiBmdGRpX3JlYWRfYnVsa19jYWxsYmFjayAqLwoJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopdXJiLT5jb250ZXh0OwoJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXY7CgoJaWYgKHVyYi0+bnVtYmVyX29mX3BhY2tldHMgPiAwKSB7CgkJZXJyKCIlcyB0cmFuc2Zlcl9idWZmZXJfbGVuZ3RoICVkIGFjdHVhbF9sZW5ndGggJWQgbnVtYmVyIG9mIHBhY2tldHMgJWQiLF9fRlVOQ1RJT05fXywKCQkgICAgdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLCB1cmItPmFjdHVhbF9sZW5ndGgsIHVyYi0+bnVtYmVyX29mX3BhY2tldHMgKTsKCQllcnIoIiVzIHRyYW5zZmVyX2ZsYWdzICV4ICIsIF9fRlVOQ1RJT05fXyx1cmItPnRyYW5zZmVyX2ZsYWdzICk7Cgl9CgoJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CgoJaWYgKHBvcnQtPm9wZW5fY291bnQgPD0gMCkKCQlyZXR1cm47CgoJdHR5ID0gcG9ydC0+dHR5OwoJaWYgKCF0dHkpIHsKCQlkYmcoIiVzIC0gYmFkIHR0eSBwb2ludGVyIC0gZXhpdGluZyIsX19GVU5DVElPTl9fKTsKCQlyZXR1cm47Cgl9CgoJcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKCWlmICghcHJpdikgewoJCWRiZygiJXMgLSBiYWQgcG9ydCBwcml2YXRlIGRhdGEgcG9pbnRlciAtIGV4aXRpbmciLCBfX0ZVTkNUSU9OX18pOwoJCXJldHVybjsKCX0KCglpZiAodXJiICE9IHBvcnQtPnJlYWRfdXJiKSB7CgkJZXJyKCIlcyAtIE5vdCBteSB1cmIhIiwgX19GVU5DVElPTl9fKTsKCX0KCglpZiAodXJiLT5zdGF0dXMpIHsKCQkvKiBUaGlzIHdpbGwgaGFwcGVuIGF0IGNsb3NlIGV2ZXJ5IHRpbWUgc28gaXQgaXMgYSBkYmcgbm90IGFuIGVyciAqLwoJCWRiZygiKHRoaXMgaXMgb2sgb24gY2xvc2UpIG5vbnplcm8gcmVhZCBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLCB1cmItPnN0YXR1cyk7CgkJcmV0dXJuOwoJfQoKCS8qIElmIHRocm90dGxlZCwgZGVsYXkgcmVjZWl2ZSBwcm9jZXNzaW5nIHVudGlsIHVudGhyb3R0bGVkLiAqLwoJc3Bpbl9sb2NrKCZwcml2LT5yeF9sb2NrKTsKCWlmIChwcml2LT5yeF9mbGFncyAmIFRIUk9UVExFRCkgewoJCWRiZygiRGVmZXJyaW5nIHJlYWQgdXJiIHByb2Nlc3NpbmcgdW50aWwgdW50aHJvdHRsZWQiKTsKCQlwcml2LT5yeF9mbGFncyB8PSBBQ1RVQUxMWV9USFJPVFRMRUQ7CgkJc3Bpbl91bmxvY2soJnByaXYtPnJ4X2xvY2spOwoJCXJldHVybjsKCX0KCXNwaW5fdW5sb2NrKCZwcml2LT5yeF9sb2NrKTsKCglmdGRpX3Byb2Nlc3NfcmVhZChwb3J0KTsKCn0gLyogZnRkaV9yZWFkX2J1bGtfY2FsbGJhY2sgKi8KCgpzdGF0aWMgdm9pZCBmdGRpX3Byb2Nlc3NfcmVhZCAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKeyAvKiBmdGRpX3Byb2Nlc3NfcmVhZCAqLwoJc3RydWN0IHVyYiAqdXJiOwoJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXY7CgljaGFyIGVycm9yX2ZsYWc7CiAgICAgICAJdW5zaWduZWQgY2hhciAqZGF0YTsKCglpbnQgaTsKCWludCByZXN1bHQ7CglpbnQgbmVlZF9mbGlwOwoJaW50IHBhY2tldF9vZmZzZXQ7CgoJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CgoJaWYgKHBvcnQtPm9wZW5fY291bnQgPD0gMCkKCQlyZXR1cm47CgoJdHR5ID0gcG9ydC0+dHR5OwoJaWYgKCF0dHkpIHsKCQlkYmcoIiVzIC0gYmFkIHR0eSBwb2ludGVyIC0gZXhpdGluZyIsX19GVU5DVElPTl9fKTsKCQlyZXR1cm47Cgl9CgoJcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKCWlmICghcHJpdikgewoJCWRiZygiJXMgLSBiYWQgcG9ydCBwcml2YXRlIGRhdGEgcG9pbnRlciAtIGV4aXRpbmciLCBfX0ZVTkNUSU9OX18pOwoJCXJldHVybjsKCX0KCgl1cmIgPSBwb3J0LT5yZWFkX3VyYjsKCWlmICghdXJiKSB7CgkJZGJnKCIlcyAtIGJhZCByZWFkX3VyYiBwb2ludGVyIC0gZXhpdGluZyIsIF9fRlVOQ1RJT05fXyk7CgkJcmV0dXJuOwoJfQoKCWRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKCiAgICAgICAgLyogVGhlIGZpcnN0IHR3byBieXRlcyBvZiBldmVyeSByZWFkIHBhY2tldCBhcmUgc3RhdHVzICovCglpZiAodXJiLT5hY3R1YWxfbGVuZ3RoID4gMikgewoJCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19GVU5DVElPTl9fLCB1cmItPmFjdHVhbF9sZW5ndGgsIGRhdGEpOwoJfSBlbHNlIHsKICAgICAgICAgICAgICAgIGRiZygiU3RhdHVzIG9ubHk6ICUwM29vICUwM29vIixkYXRhWzBdLGRhdGFbMV0pOwogICAgICAgIH0KCgoJLyogVE8gRE8gLS0gY2hlY2sgZm9yIGh1bmcgdXAgbGluZSBhbmQgaGFuZGxlIGFwcHJvcHJpYXRlbHk6ICovCgkvKiAgIHNlbmQgaGFuZ3VwICAqLwoJLyogU2VlIGFjbS5jIC0geW91IGRvIGEgdHR5X2hhbmd1cCAgLSBlZyB0dHlfaGFuZ3VwKHR0eSkgKi8KCS8qIGlmIENEIGlzIGRyb3BwZWQgYW5kIHRoZSBsaW5lIGlzIG5vdCBDTE9DQUwgdGhlbiB3ZSBzaG91bGQgaGFuZ3VwICovCgoJbmVlZF9mbGlwID0gMDsKCWZvciAocGFja2V0X29mZnNldD0wOyBwYWNrZXRfb2Zmc2V0IDwgdXJiLT5hY3R1YWxfbGVuZ3RoOyBwYWNrZXRfb2Zmc2V0ICs9IFBLVFNaKSB7CgkJLyogQ29tcGFyZSBuZXcgbGluZSBzdGF0dXMgdG8gdGhlIG9sZCBvbmUsIHNpZ25hbCBpZiBkaWZmZXJlbnQgKi8KCQlpZiAocHJpdiAhPSBOVUxMKSB7CgkJCWNoYXIgbmV3X3N0YXR1cyA9IGRhdGFbcGFja2V0X29mZnNldCswXSAmIEZURElfU1RBVFVTX0IwX01BU0s7CgkJCWlmIChuZXdfc3RhdHVzICE9IHByaXYtPnByZXZfc3RhdHVzKSB7CgkJCQlwcml2LT5kaWZmX3N0YXR1cyB8PSBuZXdfc3RhdHVzIF4gcHJpdi0+cHJldl9zdGF0dXM7CgkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnByaXYtPmRlbHRhX21zcl93YWl0KTsKCQkJCXByaXYtPnByZXZfc3RhdHVzID0gbmV3X3N0YXR1czsKCQkJfQoJCX0KCgkJLyogSGFuZGxlIGVycm9ycyBhbmQgYnJlYWsgKi8KCQllcnJvcl9mbGFnID0gVFRZX05PUk1BTDsKCQkvKiBBbHRob3VnaCB0aGUgZGV2aWNlIHVzZXMgYSBiaXRtYXNrIGFuZCBoZW5jZSBjYW4gaGF2ZSBtdWx0aXBsZSAqLwoJCS8qIGVycm9ycyBvbiBhIHBhY2tldCAtIHRoZSBvcmRlciBoZXJlIHNldHMgdGhlIHByaW9yaXR5IHRoZSAqLwoJCS8qIGVycm9yIGlzIHJldHVybmVkIHRvIHRoZSB0dHkgbGF5ZXIgICovCgoJCWlmICggZGF0YVtwYWNrZXRfb2Zmc2V0KzFdICYgRlRESV9SU19PRSApIHsKCQkJZXJyb3JfZmxhZyA9IFRUWV9PVkVSUlVOOwoJCQlkYmcoIk9WRVJSUlVOIGVycm9yIik7CgkJfQoJCWlmICggZGF0YVtwYWNrZXRfb2Zmc2V0KzFdICYgRlRESV9SU19CSSApIHsKCQkJZXJyb3JfZmxhZyA9IFRUWV9CUkVBSzsKCQkJZGJnKCJCUkVBSyByZWNlaXZlZCIpOwoJCX0KCQlpZiAoIGRhdGFbcGFja2V0X29mZnNldCsxXSAmIEZURElfUlNfUEUgKSB7CgkJCWVycm9yX2ZsYWcgPSBUVFlfUEFSSVRZOwoJCQlkYmcoIlBBUklUWSBlcnJvciIpOwoJCX0KCQlpZiAoIGRhdGFbcGFja2V0X29mZnNldCsxXSAmIEZURElfUlNfRkUgKSB7CgkJCWVycm9yX2ZsYWcgPSBUVFlfRlJBTUU7CgkJCWRiZygiRlJBTUlORyBlcnJvciIpOwoJCX0KCQlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoID4gcGFja2V0X29mZnNldCArIDIpIHsKCQkJZm9yIChpID0gMjsgKGkgPCBQS1RTWikgJiYgKChpK3BhY2tldF9vZmZzZXQpIDwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsgKytpKSB7CgkJCQkvKiBoYXZlIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBvdmVyZmxvdyB0aGUgYnVmZmVyCgkJCQkgIHdpdGggdHR5X2luc2VydF9mbGlwX2NoYXIncyAqLwoJCQkJaWYodHR5LT5mbGlwLmNvdW50ID49IFRUWV9GTElQQlVGX1NJWkUpIHsKCQkJCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwoJCQkJfQoJCQkJLyogTm90ZSB0aGF0IHRoZSBlcnJvciBmbGFnIGlzIGR1cGxpY2F0ZWQgZm9yIAoJCQkJICAgZXZlcnkgY2hhcmFjdGVyIHJlY2VpdmVkIHNpbmNlIHdlIGRvbid0IGtub3cKCQkJCSAgIHdoaWNoIGNoYXJhY3RlciBpdCBhcHBsaWVkIHRvICovCgkJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGRhdGFbcGFja2V0X29mZnNldCtpXSwgZXJyb3JfZmxhZyk7CgkJCX0KCQkJbmVlZF9mbGlwID0gMTsKCQl9CgojaWZkZWYgTk9UX0NPUlJFQ1RfQlVUX0tFRVBJTkdfSVRfRk9SX05PVwoJCS8qIGlmIGEgcGFyaXR5IGVycm9yIGlzIGRldGVjdGVkIHlvdSBnZXQgc3RhdHVzIHBhY2tldHMgZm9yZXZlcgoJCSAgIHVudGlsIGEgY2hhcmFjdGVyIGlzIHNlbnQgd2l0aG91dCBhIHBhcml0eSBlcnJvci4KCQkgICBUaGlzIGRvZXNuJ3Qgd29yayB3ZWxsIHNpbmNlIHRoZSBhcHBsaWNhdGlvbiByZWNlaXZlcyBhIG5ldmVyCgkJICAgZW5kaW5nIHN0cmVhbSBvZiBiYWQgZGF0YSAtIGV2ZW4gdGhvdWdoIG5ldyBkYXRhIGhhc24ndCBiZWVuIHNlbnQuCgkJICAgVGhlcmVmb3JlIEkgKGJpbGwpIGhhdmUgdGFrZW4gdGhpcyBvdXQuCgkJICAgSG93ZXZlciAtIHRoaXMgbWlnaHQgbWFrZSBzZW5zZSBmb3IgZnJhbWluZyBlcnJvcnMgYW5kIHNvIG9uIAoJCSAgIHNvIEkgYW0gbGVhdmluZyB0aGUgY29kZSBpbiBmb3Igbm93LgoJCSovCgkJZWxzZSB7CgkJCWlmIChlcnJvcl9mbGFnICE9IFRUWV9OT1JNQUwpewoJCQkJZGJnKCJlcnJvcl9mbGFnIGlzIG5vdCBub3JtYWwiKTsKCQkJCS8qIEluIHRoaXMgY2FzZSBpdCBpcyBqdXN0IHN0YXR1cyAtIGlmIHRoYXQgaXMgYW4gZXJyb3Igc2VuZCBhIGJhZCBjaGFyYWN0ZXIgKi8KCQkJCWlmKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKSB7CgkJCQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKCQkJCX0KCQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMHhmZiwgZXJyb3JfZmxhZyk7CgkJCQluZWVkX2ZsaXAgPSAxOwoJCQl9CgkJfQojZW5kaWYKCX0gLyogImZvcihwYWNrZXRfb2Zmc2V0PTAuLi4iICovCgoJLyogTG93IGxhdGVuY3kgKi8KCWlmIChuZWVkX2ZsaXApIHsKCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwoJfQoKCS8qIGlmIHRoZSBwb3J0IGlzIGNsb3NlZCBzdG9wIHRyeWluZyB0byByZWFkICovCglpZiAocG9ydC0+b3Blbl9jb3VudCA+IDApewoJCS8qIENvbnRpbnVlIHRyeWluZyB0byBhbHdheXMgcmVhZCAgKi8KCQl1c2JfZmlsbF9idWxrX3VyYihwb3J0LT5yZWFkX3VyYiwgcG9ydC0+c2VyaWFsLT5kZXYsIAoJCQkgICAgICB1c2JfcmN2YnVsa3BpcGUocG9ydC0+c2VyaWFsLT5kZXYsIHBvcnQtPmJ1bGtfaW5fZW5kcG9pbnRBZGRyZXNzKSwKCQkJICAgICAgcG9ydC0+cmVhZF91cmItPnRyYW5zZmVyX2J1ZmZlciwgcG9ydC0+cmVhZF91cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsCgkJCSAgICAgIGZ0ZGlfcmVhZF9idWxrX2NhbGxiYWNrLCBwb3J0KTsKCgkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+cmVhZF91cmIsIEdGUF9BVE9NSUMpOwoJCWlmIChyZXN1bHQpCgkJCWVycigiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKCX0KCglyZXR1cm47Cn0gLyogZnRkaV9wcm9jZXNzX3JlYWQgKi8KCgpzdGF0aWMgdm9pZCBmdGRpX2JyZWFrX2N0bCggc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgaW50IGJyZWFrX3N0YXRlICkKewoJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKCV9fdTE2IHVyYl92YWx1ZSA9IDA7IAoJY2hhciBidWZbMV07CgkKCS8qIGJyZWFrX3N0YXRlID0gLTEgdG8gdHVybiBvbiBicmVhaywgYW5kIDAgdG8gdHVybiBvZmYgYnJlYWsgKi8KCS8qIHNlZSBkcml2ZXJzL2NoYXIvdHR5X2lvLmMgdG8gc2VlIGl0IHVzZWQgKi8KCS8qIGxhc3Rfc2V0X2RhdGFfdXJiX3ZhbHVlIE5FVkVSIGhhcyB0aGUgYnJlYWsgYml0IHNldCBpbiBpdCAqLwoKCWlmIChicmVha19zdGF0ZSkgewoJCXVyYl92YWx1ZSA9IHByaXYtPmxhc3Rfc2V0X2RhdGFfdXJiX3ZhbHVlIHwgRlRESV9TSU9fU0VUX0JSRUFLOwoJfSBlbHNlIHsKCQl1cmJfdmFsdWUgPSBwcml2LT5sYXN0X3NldF9kYXRhX3VyYl92YWx1ZTsgCgl9CgoJCglpZiAodXNiX2NvbnRyb2xfbXNnKHBvcnQtPnNlcmlhbC0+ZGV2LCB1c2Jfc25kY3RybHBpcGUocG9ydC0+c2VyaWFsLT5kZXYsIDApLAoJCQkgICAgRlRESV9TSU9fU0VUX0RBVEFfUkVRVUVTVCwgCgkJCSAgICBGVERJX1NJT19TRVRfREFUQV9SRVFVRVNUX1RZUEUsCgkJCSAgICB1cmJfdmFsdWUgLCBwcml2LT5pbnRlcmZhY2UsCgkJCSAgICBidWYsIDAsIFdEUl9USU1FT1VUKSA8IDApIHsKCQllcnIoIiVzIEZBSUxFRCB0byBlbmFibGUvZGlzYWJsZSBicmVhayBzdGF0ZSAoc3RhdGUgd2FzICVkKSIsIF9fRlVOQ1RJT05fXyxicmVha19zdGF0ZSk7Cgl9CSAgIAoKCWRiZygiJXMgYnJlYWsgc3RhdGUgaXMgJWQgLSB1cmIgaXMgJWQiLCBfX0ZVTkNUSU9OX18sYnJlYWtfc3RhdGUsIHVyYl92YWx1ZSk7CgkKfQoKCi8qIG9sZF90ZXJtaW9zIGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB0ZXJtaW9zIHNldHRpbmdzIGFuZCB0dHktPnRlcm1pb3MgY29udGFpbnMKICogdGhlIG5ldyBzZXR0aW5nIHRvIGJlIHVzZWQKICogV0FSTklORzogc2V0X3Rlcm1pb3MgY2FsbHMgdGhpcyB3aXRoIG9sZF90ZXJtaW9zIGluIGtlcm5lbCBzcGFjZQogKi8KCnN0YXRpYyB2b2lkIGZ0ZGlfc2V0X3Rlcm1pb3MgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcykKeyAvKiBmdGRpX3Rlcm1pb3MgKi8KCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKCXVuc2lnbmVkIGludCBjZmxhZyA9IHBvcnQtPnR0eS0+dGVybWlvcy0+Y19jZmxhZzsKCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CglfX3UxNiB1cmJfdmFsdWU7IC8qIHdpbGwgaG9sZCB0aGUgbmV3IGZsYWdzICovCgljaGFyIGJ1ZlsxXTsgLyogUGVyaGFwcyBJIHNob3VsZCBkeW5hbWljYWxseSBhbGxvYyB0aGlzPyAqLwoJCgkvLyBBZGRlZCBmb3IgeG9uL3hvZmYgc3VwcG9ydAoJdW5zaWduZWQgaW50IGlmbGFnID0gcG9ydC0+dHR5LT50ZXJtaW9zLT5jX2lmbGFnOwoJdW5zaWduZWQgY2hhciB2c3RvcDsKCXVuc2lnbmVkIGNoYXIgdnN0YXJ0OwoJCglkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKCgkvKiBGb3JjZSBiYXVkIHJhdGUgaWYgdGhpcyBkZXZpY2UgcmVxdWlyZXMgaXQsIHVubGVzcyBpdCBpcyBzZXQgdG8gQjAuICovCglpZiAocHJpdi0+Zm9yY2VfYmF1ZCAmJiAoKHBvcnQtPnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSAhPSBCMCkpIHsKCQlkYmcoIiVzOiBmb3JjaW5nIGJhdWQgcmF0ZSBmb3IgdGhpcyBkZXZpY2UiLCBfX0ZVTkNUSU9OX18pOwoJCXBvcnQtPnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmPSB+Q0JBVUQ7CgkJcG9ydC0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnIHw9IHByaXYtPmZvcmNlX2JhdWQ7Cgl9CgoJLyogRm9yY2UgUlRTLUNUUyBpZiB0aGlzIGRldmljZSByZXF1aXJlcyBpdC4gKi8KCWlmIChwcml2LT5mb3JjZV9ydHNjdHMpIHsKCQlkYmcoIiVzOiBmb3JjaW5nIHJ0c2N0cyBmb3IgdGhpcyBkZXZpY2UiLCBfX0ZVTkNUSU9OX18pOwoJCXBvcnQtPnR0eS0+dGVybWlvcy0+Y19jZmxhZyB8PSBDUlRTQ1RTOwoJfQoKCWNmbGFnID0gcG9ydC0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnOwoKCS8qIEZJWE1FIC1Gb3IgdGhpcyBjdXQgSSBkb24ndCBjYXJlIGlmIHRoZSBsaW5lIGlzIHJlYWxseSBjaGFuZ2luZyBvciAKCSAgIG5vdCAgLSBzbyBqdXN0IGRvIHRoZSBjaGFuZ2UgcmVnYXJkbGVzcyAgLSBzaG91bGQgYmUgYWJsZSB0byAKCSAgIGNvbXBhcmUgb2xkX3Rlcm1pb3MgYW5kIHR0eS0+dGVybWlvcyAqLwoJLyogTk9URSBUaGVzZSByb3V0aW5lcyBjYW4gZ2V0IGludGVycnVwdGVkIGJ5IAoJICAgZnRkaV9zaW9fcmVhZF9idWxrX2NhbGxiYWNrICAtIG5lZWQgdG8gZXhhbWluZSB3aGF0IHRoaXMgCiAgICAgICAgICAgbWVhbnMgLSBkb24ndCBzZWUgYW55IHByb2JsZW1zIHlldCAqLwoJCgkvKiBTZXQgbnVtYmVyIG9mIGRhdGEgYml0cywgcGFyaXR5LCBzdG9wIGJpdHMgKi8KCQoJdXJiX3ZhbHVlID0gMDsKCXVyYl92YWx1ZSB8PSAoY2ZsYWcgJiBDU1RPUEIgPyBGVERJX1NJT19TRVRfREFUQV9TVE9QX0JJVFNfMiA6CgkJICAgICAgRlRESV9TSU9fU0VUX0RBVEFfU1RPUF9CSVRTXzEpOwoJdXJiX3ZhbHVlIHw9IChjZmxhZyAmIFBBUkVOQiA/IAoJCSAgICAgIChjZmxhZyAmIFBBUk9ERCA/IEZURElfU0lPX1NFVF9EQVRBX1BBUklUWV9PREQgOiAKCQkgICAgICAgRlRESV9TSU9fU0VUX0RBVEFfUEFSSVRZX0VWRU4pIDoKCQkgICAgICBGVERJX1NJT19TRVRfREFUQV9QQVJJVFlfTk9ORSk7CglpZiAoY2ZsYWcgJiBDU0laRSkgewoJCXN3aXRjaCAoY2ZsYWcgJiBDU0laRSkgewoJCWNhc2UgQ1M1OiB1cmJfdmFsdWUgfD0gNTsgZGJnKCJTZXR0aW5nIENTNSIpOyBicmVhazsKCQljYXNlIENTNjogdXJiX3ZhbHVlIHw9IDY7IGRiZygiU2V0dGluZyBDUzYiKTsgYnJlYWs7CgkJY2FzZSBDUzc6IHVyYl92YWx1ZSB8PSA3OyBkYmcoIlNldHRpbmcgQ1M3Iik7IGJyZWFrOwoJCWNhc2UgQ1M4OiB1cmJfdmFsdWUgfD0gODsgZGJnKCJTZXR0aW5nIENTOCIpOyBicmVhazsKCQlkZWZhdWx0OgoJCQllcnIoIkNTSVpFIHdhcyBzZXQgYnV0IG5vdCBDUzUtQ1M4Iik7CgkJfQoJfQoKCS8qIFRoaXMgaXMgbmVlZGVkIGJ5IHRoZSBicmVhayBjb21tYW5kIHNpbmNlIGl0IHVzZXMgdGhlIHNhbWUgY29tbWFuZCAtIGJ1dCBpcwoJICogIG9yJ2VkIHdpdGggdGhpcyB2YWx1ZSAgKi8KCXByaXYtPmxhc3Rfc2V0X2RhdGFfdXJiX3ZhbHVlID0gdXJiX3ZhbHVlOwoJCglpZiAodXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3NuZGN0cmxwaXBlKGRldiwgMCksCgkJCSAgICBGVERJX1NJT19TRVRfREFUQV9SRVFVRVNULCAKCQkJICAgIEZURElfU0lPX1NFVF9EQVRBX1JFUVVFU1RfVFlQRSwKCQkJICAgIHVyYl92YWx1ZSAsIHByaXYtPmludGVyZmFjZSwKCQkJICAgIGJ1ZiwgMCwgMTAwKSA8IDApIHsKCQllcnIoIiVzIEZBSUxFRCB0byBzZXQgZGF0YWJpdHMvc3RvcGJpdHMvcGFyaXR5IiwgX19GVU5DVElPTl9fKTsKCX0JICAgCgoJLyogTm93IGRvIHRoZSBiYXVkcmF0ZSAqLwoJaWYgKChjZmxhZyAmIENCQVVEKSA9PSBCMCApIHsKCQkvKiBEaXNhYmxlIGZsb3cgY29udHJvbCAqLwoJCWlmICh1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKCQkJCSAgICBGVERJX1NJT19TRVRfRkxPV19DVFJMX1JFUVVFU1QsIAoJCQkJICAgIEZURElfU0lPX1NFVF9GTE9XX0NUUkxfUkVRVUVTVF9UWVBFLAoJCQkJICAgIDAsIHByaXYtPmludGVyZmFjZSwgCgkJCQkgICAgYnVmLCAwLCBXRFJfVElNRU9VVCkgPCAwKSB7CgkJCWVycigiJXMgZXJyb3IgZnJvbSBkaXNhYmxlIGZsb3djb250cm9sIHVyYiIsIF9fRlVOQ1RJT05fXyk7CgkJfQkgICAgCgkJLyogRHJvcCBSVFMgYW5kIERUUiAqLwoJCWlmIChzZXRfZHRyKHBvcnQsIExPVykgPCAwKXsKCQkJZXJyKCIlcyBFcnJvciBmcm9tIERUUiBMT1cgdXJiIiwgX19GVU5DVElPTl9fKTsKCQl9CgkJaWYgKHNldF9ydHMocG9ydCwgTE9XKSA8IDApewoJCQllcnIoIiVzIEVycm9yIGZyb20gUlRTIExPVyB1cmIiLCBfX0ZVTkNUSU9OX18pOwoJCX0JCgkJCgl9IGVsc2UgewoJCS8qIHNldCB0aGUgYmF1ZHJhdGUgZGV0ZXJtaW5lZCBiZWZvcmUgKi8KCQlpZiAoY2hhbmdlX3NwZWVkKHBvcnQpKSB7CgkJCWVycigiJXMgdXJiIGZhaWxlZCB0byBzZXQgYmF1cmRyYXRlIiwgX19GVU5DVElPTl9fKTsKCQl9CgkJLyogRW5zdXJlICBSVFMgYW5kIERUUiBhcmUgcmFpc2VkICovCgkJZWxzZSBpZiAoc2V0X2R0cihwb3J0LCBISUdIKSA8IDApewoJCQllcnIoIiVzIEVycm9yIGZyb20gRFRSIEhJR0ggdXJiIiwgX19GVU5DVElPTl9fKTsKCQl9CgkJZWxzZSBpZiAoc2V0X3J0cyhwb3J0LCBISUdIKSA8IDApewoJCQllcnIoIiVzIEVycm9yIGZyb20gUlRTIEhJR0ggdXJiIiwgX19GVU5DVElPTl9fKTsKCQl9CQoJfQoKCS8qIFNldCBmbG93IGNvbnRyb2wgKi8KCS8qIE5vdGUgZGV2aWNlIGFsc28gc3VwcG9ydHMgRFRSL0NEICh1Z2gpIGFuZCBYb24vWG9mZiBpbiBoYXJkd2FyZSAqLwoJaWYgKGNmbGFnICYgQ1JUU0NUUykgewoJCWRiZygiJXMgU2V0dGluZyB0byBDUlRTQ1RTIGZsb3cgY29udHJvbCIsIF9fRlVOQ1RJT05fXyk7CgkJaWYgKHVzYl9jb250cm9sX21zZyhkZXYsIAoJCQkJICAgIHVzYl9zbmRjdHJscGlwZShkZXYsIDApLAoJCQkJICAgIEZURElfU0lPX1NFVF9GTE9XX0NUUkxfUkVRVUVTVCwgCgkJCQkgICAgRlRESV9TSU9fU0VUX0ZMT1dfQ1RSTF9SRVFVRVNUX1RZUEUsCgkJCQkgICAgMCAsIChGVERJX1NJT19SVFNfQ1RTX0hTIHwgcHJpdi0+aW50ZXJmYWNlKSwKCQkJCSAgICBidWYsIDAsIFdEUl9USU1FT1VUKSA8IDApIHsKCQkJZXJyKCJ1cmIgZmFpbGVkIHRvIHNldCB0byBydHMvY3RzIGZsb3cgY29udHJvbCIpOwoJCX0JCQoJCQoJfSBlbHNlIHsgCgkJLyoKCQkgKiBYb24vWG9mZiBjb2RlCgkJICoKCQkgKiBDaGVjayB0aGUgSVhPRkYgc3RhdHVzIGluIHRoZSBpZmxhZyBjb21wb25lbnQgb2YgdGhlIHRlcm1pb3Mgc3RydWN0dXJlCgkJICogaWYgSVhPRkYgaXMgbm90IHNldCwgdGhlIHByZS14b24veG9mZiBjb2RlIGlzIGV4ZWN1dGVkLgoJCSovCgkJaWYgKGlmbGFnICYgSVhPRkYpIHsKCQkJZGJnKCIlcyAgcmVxdWVzdCB0byBlbmFibGUgeG9ueG9mZiBpZmxhZz0lMDR4IixfX0ZVTkNUSU9OX18saWZsYWcpOwoJCQkvLyBUcnkgdG8gZW5hYmxlIHRoZSBYT04vWE9GRiBvbiB0aGUgZnRkaV9zaW8KCQkJLy8gU2V0IHRoZSB2c3RhcnQgYW5kIHZzdG9wIC0tIGNvdWxkIGhhdmUgYmVlbiBkb25lIHVwIGFib3ZlIHdoZXJlCgkJCS8vIGEgbG90IG9mIG90aGVyIGRlcmVmZXJlbmNpbmcgaXMgZG9uZSBidXQgdGhhdCB3b3VsZCBiZSB2ZXJ5CgkJCS8vIGluZWZmaWNpZW50IGFzIHZzdGFydCBhbmQgdnN0b3AgYXJlIG5vdCBhbHdheXMgbmVlZGVkCgkJCXZzdGFydD1wb3J0LT50dHktPnRlcm1pb3MtPmNfY2NbVlNUQVJUXTsKCQkJdnN0b3A9cG9ydC0+dHR5LT50ZXJtaW9zLT5jX2NjW1ZTVE9QXTsKCQkJdXJiX3ZhbHVlPSh2c3RvcCA8PCA4KSB8ICh2c3RhcnQpOwoKCQkJaWYgKHVzYl9jb250cm9sX21zZyhkZXYsCgkJCQkJICAgIHVzYl9zbmRjdHJscGlwZShkZXYsIDApLAoJCQkJCSAgICBGVERJX1NJT19TRVRfRkxPV19DVFJMX1JFUVVFU1QsCgkJCQkJICAgIEZURElfU0lPX1NFVF9GTE9XX0NUUkxfUkVRVUVTVF9UWVBFLAoJCQkJCSAgICB1cmJfdmFsdWUgLCAoRlRESV9TSU9fWE9OX1hPRkZfSFMKCQkJCQkJCSB8IHByaXYtPmludGVyZmFjZSksCgkJCQkJICAgIGJ1ZiwgMCwgV0RSX1RJTUVPVVQpIDwgMCkgewoJCQkJZXJyKCJ1cmIgZmFpbGVkIHRvIHNldCB0byB4b24veG9mZiBmbG93IGNvbnRyb2wiKTsKCQkJfQoJCX0gZWxzZSB7CgkJCS8qIGVsc2UgY2xhdXNlIHRvIG9ubHkgcnVuIGlmIGNmYWcgISBDUlRTQ1RTIGFuZCBpZmxhZyAhIFhPRkYgKi8KCQkJLyogQ0hFQ0tNRSBBc3N1bWluZyBYT04vWE9GRiBoYW5kbGVkIGJ5IHR0eSBzdGFjayAtIG5vdCBieSBkZXZpY2UgKi8KCQkJZGJnKCIlcyBUdXJuaW5nIG9mZiBoYXJkd2FyZSBmbG93IGNvbnRyb2wiLCBfX0ZVTkNUSU9OX18pOwoJCQlpZiAodXNiX2NvbnRyb2xfbXNnKGRldiwgCgkJCQkJICAgIHVzYl9zbmRjdHJscGlwZShkZXYsIDApLAoJCQkJCSAgICBGVERJX1NJT19TRVRfRkxPV19DVFJMX1JFUVVFU1QsIAoJCQkJCSAgICBGVERJX1NJT19TRVRfRkxPV19DVFJMX1JFUVVFU1RfVFlQRSwKCQkJCQkgICAgMCwgcHJpdi0+aW50ZXJmYWNlLCAKCQkJCQkgICAgYnVmLCAwLCBXRFJfVElNRU9VVCkgPCAwKSB7CgkJCQllcnIoInVyYiBmYWlsZWQgdG8gY2xlYXIgZmxvdyBjb250cm9sIik7CgkJCX0JCQkJCgkJfQoJCQoJfQoJcmV0dXJuOwp9IC8qIGZ0ZGlfdGVybWlvcyAqLwoKCnN0YXRpYyBpbnQgZnRkaV90aW9jbWdldCAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUpCnsKCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7Cgl1bnNpZ25lZCBjaGFyIGJ1ZlsyXTsKCWludCByZXQ7CgoJZGJnKCIlcyBUSU9DTUdFVCIsIF9fRlVOQ1RJT05fXyk7Cglzd2l0Y2ggKHByaXYtPmNoaXBfdHlwZSkgewoJY2FzZSBTSU86CgkJLyogUmVxdWVzdCB0aGUgc3RhdHVzIGZyb20gdGhlIGRldmljZSAqLwoJCWlmICgocmV0ID0gdXNiX2NvbnRyb2xfbXNnKHBvcnQtPnNlcmlhbC0+ZGV2LCAKCQkJCQkgICB1c2JfcmN2Y3RybHBpcGUocG9ydC0+c2VyaWFsLT5kZXYsIDApLAoJCQkJCSAgIEZURElfU0lPX0dFVF9NT0RFTV9TVEFUVVNfUkVRVUVTVCwgCgkJCQkJICAgRlRESV9TSU9fR0VUX01PREVNX1NUQVRVU19SRVFVRVNUX1RZUEUsCgkJCQkJICAgMCwgMCwgCgkJCQkJICAgYnVmLCAxLCBXRFJfVElNRU9VVCkpIDwgMCApIHsKCQkJZXJyKCIlcyBDb3VsZCBub3QgZ2V0IG1vZGVtIHN0YXR1cyBvZiBkZXZpY2UgLSBlcnI6ICVkIiwgX19GVU5DVElPTl9fLAoJCQkgICAgcmV0KTsKCQkJcmV0dXJuKHJldCk7CgkJfQoJCWJyZWFrOwoJY2FzZSBGVDhVMjMyQU06CgljYXNlIEZUMjMyQk06CgljYXNlIEZUMjIzMkM6CgkJLyogdGhlIDhVMjMyQU0gcmV0dXJucyBhIHR3byBieXRlIHZhbHVlICh0aGUgc2lvIGlzIGEgMSBieXRlIHZhbHVlKSAtIGluIHRoZSBzYW1lCgkJICAgZm9ybWF0IGFzIHRoZSBkYXRhIHJldHVybmVkIGZyb20gdGhlIGluIHBvaW50ICovCgkJaWYgKChyZXQgPSB1c2JfY29udHJvbF9tc2cocG9ydC0+c2VyaWFsLT5kZXYsIAoJCQkJCSAgIHVzYl9yY3ZjdHJscGlwZShwb3J0LT5zZXJpYWwtPmRldiwgMCksCgkJCQkJICAgRlRESV9TSU9fR0VUX01PREVNX1NUQVRVU19SRVFVRVNULCAKCQkJCQkgICBGVERJX1NJT19HRVRfTU9ERU1fU1RBVFVTX1JFUVVFU1RfVFlQRSwKCQkJCQkgICAwLCBwcml2LT5pbnRlcmZhY2UsIAoJCQkJCSAgIGJ1ZiwgMiwgV0RSX1RJTUVPVVQpKSA8IDAgKSB7CgkJCWVycigiJXMgQ291bGQgbm90IGdldCBtb2RlbSBzdGF0dXMgb2YgZGV2aWNlIC0gZXJyOiAlZCIsIF9fRlVOQ1RJT05fXywKCQkJICAgIHJldCk7CgkJCXJldHVybihyZXQpOwoJCX0KCQlicmVhazsKCWRlZmF1bHQ6CgkJcmV0dXJuIC1FRkFVTFQ7CgkJYnJlYWs7Cgl9CgkKCXJldHVybiAgKGJ1ZlswXSAmIEZURElfU0lPX0RTUl9NQVNLID8gVElPQ01fRFNSIDogMCkgfAoJCShidWZbMF0gJiBGVERJX1NJT19DVFNfTUFTSyA/IFRJT0NNX0NUUyA6IDApIHwKCQkoYnVmWzBdICAmIEZURElfU0lPX1JJX01BU0sgID8gVElPQ01fUkkgIDogMCkgfAoJCShidWZbMF0gICYgRlRESV9TSU9fUkxTRF9NQVNLID8gVElPQ01fQ0QgIDogMCkgfAoJCXByaXYtPmxhc3RfZHRyX3J0czsJCQkKfQoKc3RhdGljIGludCBmdGRpX3Rpb2Ntc2V0KHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICogZmlsZSwgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQp7CglpbnQgcmV0OwoJCglkYmcoIiVzIFRJT0NNU0VUIiwgX19GVU5DVElPTl9fKTsKCWlmIChzZXQgJiBUSU9DTV9EVFIpewoJCWlmICgocmV0ID0gc2V0X2R0cihwb3J0LCBISUdIKSkgPCAwKSB7CgkJCWVycigiVXJiIHRvIHNldCBEVFIgZmFpbGVkIik7CgkJCXJldHVybihyZXQpOwoJCX0KCX0KCWlmIChzZXQgJiBUSU9DTV9SVFMpIHsKCQlpZiAoKHJldCA9IHNldF9ydHMocG9ydCwgSElHSCkpIDwgMCl7CgkJCWVycigiVXJiIHRvIHNldCBSVFMgZmFpbGVkIik7CgkJCXJldHVybihyZXQpOwoJCX0KCX0KCQoJaWYgKGNsZWFyICYgVElPQ01fRFRSKXsKCQlpZiAoKHJldCA9IHNldF9kdHIocG9ydCwgTE9XKSkgPCAwKXsKCQkJZXJyKCJVcmIgdG8gdW5zZXQgRFRSIGZhaWxlZCIpOwoJCQlyZXR1cm4ocmV0KTsKCQl9Cgl9CQoJaWYgKGNsZWFyICYgVElPQ01fUlRTKSB7CgkJaWYgKChyZXQgPSBzZXRfcnRzKHBvcnQsIExPVykpIDwgMCl7CgkJCWVycigiVXJiIHRvIHVuc2V0IFJUUyBmYWlsZWQiKTsKCQkJcmV0dXJuKHJldCk7CgkJfQoJfQoJcmV0dXJuKDApOwp9CgoKc3RhdGljIGludCBmdGRpX2lvY3RsIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqIGZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQp7CglzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwoKCWludCAgcmV0LCBtYXNrOwoJCglkYmcoIiVzIGNtZCAweCUwNHgiLCBfX0ZVTkNUSU9OX18sIGNtZCk7CgoJLyogQmFzZWQgb24gY29kZSBmcm9tIGFjbS5jIGFuZCBvdGhlcnMgKi8KCXN3aXRjaCAoY21kKSB7CgoJY2FzZSBUSU9DTUJJUzogLyogdHVybnMgb24gKFNldHMpIHRoZSBsaW5lcyBhcyBzcGVjaWZpZWQgYnkgdGhlIG1hc2sgKi8KCQlkYmcoIiVzIFRJT0NNQklTIiwgX19GVU5DVElPTl9fKTsKIAkgICAgICAgIGlmIChnZXRfdXNlcihtYXNrLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgYXJnKSkKCQkJcmV0dXJuIC1FRkFVTFQ7CiAgCSAgICAgICAgaWYgKG1hc2sgJiBUSU9DTV9EVFIpewoJCQlpZiAoKHJldCA9IHNldF9kdHIocG9ydCwgSElHSCkpIDwgMCkgewoJCQkJZXJyKCJVcmIgdG8gc2V0IERUUiBmYWlsZWQiKTsKCQkJCXJldHVybihyZXQpOwoJCQl9CgkJfQoJCWlmIChtYXNrICYgVElPQ01fUlRTKSB7CgkJCWlmICgocmV0ID0gc2V0X3J0cyhwb3J0LCBISUdIKSkgPCAwKXsKCQkJCWVycigiVXJiIHRvIHNldCBSVFMgZmFpbGVkIik7CgkJCQlyZXR1cm4ocmV0KTsKCQkJfQoJCX0KCQlyZXR1cm4oMCk7CgkJYnJlYWs7CgoJY2FzZSBUSU9DTUJJQzogLyogdHVybnMgb2ZmIChDbGVhcnMpIHRoZSBsaW5lcyBhcyBzcGVjaWZpZWQgYnkgdGhlIG1hc2sgKi8KCQlkYmcoIiVzIFRJT0NNQklDIiwgX19GVU5DVElPTl9fKTsKIAkgICAgICAgIGlmIChnZXRfdXNlcihtYXNrLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgYXJnKSkKCQkJcmV0dXJuIC1FRkFVTFQ7CiAgCSAgICAgICAgaWYgKG1hc2sgJiBUSU9DTV9EVFIpewoJCQlpZiAoKHJldCA9IHNldF9kdHIocG9ydCwgTE9XKSkgPCAwKXsKCQkJCWVycigiVXJiIHRvIHVuc2V0IERUUiBmYWlsZWQiKTsKCQkJCXJldHVybihyZXQpOwoJCQl9CgkJfQkKCQlpZiAobWFzayAmIFRJT0NNX1JUUykgewoJCQlpZiAoKHJldCA9IHNldF9ydHMocG9ydCwgTE9XKSkgPCAwKXsKCQkJCWVycigiVXJiIHRvIHVuc2V0IFJUUyBmYWlsZWQiKTsKCQkJCXJldHVybihyZXQpOwoJCQl9CgkJfQoJCXJldHVybigwKTsKCQlicmVhazsKCgkJLyoKCQkgKiBJIGhhZCBvcmlnaW5hbGx5IGltcGxlbWVudGVkIFRDU0VUe0EsU317LEYsV30gYW5kCgkJICogVENHRVR7QSxTfSBoZXJlIHNlcGFyYXRlbHksIGhvd2V2ZXIgd2hlbiB0ZXN0aW5nIEkKCQkgKiBmb3VuZCB0aGF0IHRoZSBoaWdoZXIgbGF5ZXJzIGFjdHVhbGx5IGRvIHRoZSB0ZXJtaW9zCgkJICogY29udmVyc2lvbnMgdGhlbXNlbHZlcyBhbmQgcGFzcyB0aGUgY2FsbCBvbnRvCgkJICogZnRkaV9zaW9fc2V0X3Rlcm1pb3MuIAoJCSAqCgkJICovCgoJY2FzZSBUSU9DR1NFUklBTDogLyogZ2V0cyBzZXJpYWwgcG9ydCBkYXRhICovCgkJcmV0dXJuIGdldF9zZXJpYWxfaW5mbyhwb3J0LCAoc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICopIGFyZyk7CgoJY2FzZSBUSU9DU1NFUklBTDogLyogc2V0cyBzZXJpYWwgcG9ydCBkYXRhICovCgkJcmV0dXJuIHNldF9zZXJpYWxfaW5mbyhwb3J0LCAoc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICopIGFyZyk7CgoJLyoKCSAqIFdhaXQgZm9yIGFueSBvZiB0aGUgNCBtb2RlbSBpbnB1dHMgKERDRCxSSSxEU1IsQ1RTKSB0byBjaGFuZ2UKCSAqIC0gbWFzayBwYXNzZWQgaW4gYXJnIGZvciBsaW5lcyBvZiBpbnRlcmVzdAoJICogICAodXNlIHwnZWQgVElPQ01fUk5HL0RTUi9DRC9DVFMgZm9yIG1hc2tpbmcpCgkgKiBDYWxsZXIgc2hvdWxkIHVzZSBUSU9DR0lDT1VOVCB0byBzZWUgd2hpY2ggb25lIGl0IHdhcy4KCSAqCgkgKiBUaGlzIGNvZGUgaXMgYm9ycm93ZWQgZnJvbSBsaW51eC9kcml2ZXJzL2NoYXIvc2VyaWFsLmMKCSAqLwoJY2FzZSBUSU9DTUlXQUlUOgoJCXdoaWxlIChwcml2ICE9IE5VTEwpIHsKCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmcHJpdi0+ZGVsdGFfbXNyX3dhaXQpOwoJCQkvKiBzZWUgaWYgYSBzaWduYWwgZGlkIGl0ICovCgkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKCQkJCXJldHVybiAtRVJFU1RBUlRTWVM7CgkJCWVsc2UgewoJCQkJY2hhciBkaWZmID0gcHJpdi0+ZGlmZl9zdGF0dXM7CgoJCQkJaWYgKGRpZmYgPT0gMCkgewoJCQkJCXJldHVybiAtRUlPOyAvKiBubyBjaGFuZ2UgPT4gZXJyb3IgKi8KCQkJCX0KCgkJCQkvKiBDb25zdW1lIGFsbCBldmVudHMgKi8KCQkJCXByaXYtPmRpZmZfc3RhdHVzID0gMDsKCgkJCQkvKiBSZXR1cm4gMCBpZiBjYWxsZXIgd2FudGVkIHRvIGtub3cgYWJvdXQgdGhlc2UgYml0cyAqLwoJCQkJaWYgKCAoKGFyZyAmIFRJT0NNX1JORykgJiYgKGRpZmYgJiBGVERJX1JTMF9SSSkpIHx8CgkJCQkgICAgICgoYXJnICYgVElPQ01fRFNSKSAmJiAoZGlmZiAmIEZURElfUlMwX0RTUikpIHx8CgkJCQkgICAgICgoYXJnICYgVElPQ01fQ0QpICAmJiAoZGlmZiAmIEZURElfUlMwX1JMU0QpKSB8fAoJCQkJICAgICAoKGFyZyAmIFRJT0NNX0NUUykgJiYgKGRpZmYgJiBGVERJX1JTMF9DVFMpKSApIHsKCQkJCQlyZXR1cm4gMDsKCQkJCX0KCQkJCS8qCgkJCQkgKiBPdGhlcndpc2UgY2FsbGVyIGNhbid0IGNhcmUgbGVzcyBhYm91dCB3aGF0IGhhcHBlbmVkLAoJCQkJICogYW5kIHNvIHdlIGNvbnRpbnVlIHRvIHdhaXQgZm9yIG1vcmUgZXZlbnRzLgoJCQkJICovCgkJCX0KCQl9CgkJcmV0dXJuKDApOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlicmVhazsKCQkKCX0KCgoJLyogVGhpcyBpcyBub3QgbmVjZXNzYXJpbHkgYW4gZXJyb3IgLSB0dXJucyBvdXQgdGhlIGhpZ2hlciBsYXllcnMgd2lsbCBkbyAKCSAqICBzb21lIGlvY3RscyBpdHNlbGYgKHNlZSBjb21tZW50IGFib3ZlKQoJICovCglkYmcoIiVzIGFyZyBub3Qgc3VwcG9ydGVkIC0gaXQgd2FzIDB4JTA0eCAtIGNoZWNrIC91c3IvaW5jbHVkZS9hc20vaW9jdGxzLmgiLCBfX0ZVTkNUSU9OX18sIGNtZCk7CgoJcmV0dXJuKC1FTk9JT0NUTENNRCk7Cn0gLyogZnRkaV9pb2N0bCAqLwoKCnN0YXRpYyB2b2lkIGZ0ZGlfdGhyb3R0bGUgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCnsKCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoKCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOwoKCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yeF9sb2NrLCBmbGFncyk7Cglwcml2LT5yeF9mbGFncyB8PSBUSFJPVFRMRUQ7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yeF9sb2NrLCBmbGFncyk7Cn0KCgpzdGF0aWMgdm9pZCBmdGRpX3VudGhyb3R0bGUgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCnsKCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CglpbnQgYWN0dWFsbHlfdGhyb3R0bGVkOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCglkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKCglzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cnhfbG9jaywgZmxhZ3MpOwoJYWN0dWFsbHlfdGhyb3R0bGVkID0gcHJpdi0+cnhfZmxhZ3MgJiBBQ1RVQUxMWV9USFJPVFRMRUQ7Cglwcml2LT5yeF9mbGFncyAmPSB+KFRIUk9UVExFRCB8IEFDVFVBTExZX1RIUk9UVExFRCk7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yeF9sb2NrLCBmbGFncyk7CgoJaWYgKGFjdHVhbGx5X3Rocm90dGxlZCkKCQlmdGRpX3Byb2Nlc3NfcmVhZChwb3J0KTsKfQoKc3RhdGljIGludCBfX2luaXQgZnRkaV9pbml0ICh2b2lkKQp7CglpbnQgcmV0dmFsOwoKCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOwoJcmV0dmFsID0gdXNiX3NlcmlhbF9yZWdpc3RlcigmZnRkaV9TSU9fZGV2aWNlKTsKCWlmIChyZXR2YWwpCgkJZ290byBmYWlsZWRfU0lPX3JlZ2lzdGVyOwoJcmV0dmFsID0gdXNiX3NlcmlhbF9yZWdpc3RlcigmZnRkaV84VTIzMkFNX2RldmljZSk7CglpZiAocmV0dmFsKQoJCWdvdG8gZmFpbGVkXzhVMjMyQU1fcmVnaXN0ZXI7CglyZXR2YWwgPSB1c2Jfc2VyaWFsX3JlZ2lzdGVyKCZmdGRpX0ZUMjMyQk1fZGV2aWNlKTsKCWlmIChyZXR2YWwpCgkJZ290byBmYWlsZWRfRlQyMzJCTV9yZWdpc3RlcjsKCXJldHZhbCA9IHVzYl9zZXJpYWxfcmVnaXN0ZXIoJmZ0ZGlfRlQyMjMyQ19kZXZpY2UpOwoJaWYgKHJldHZhbCkKCQlnb3RvIGZhaWxlZF9GVDIyMzJDX3JlZ2lzdGVyOwoJcmV0dmFsID0gdXNiX3NlcmlhbF9yZWdpc3RlcigmZnRkaV9VU0JfVUlSVF9kZXZpY2UpOwoJaWYgKHJldHZhbCkKCQlnb3RvIGZhaWxlZF9VU0JfVUlSVF9yZWdpc3RlcjsKCXJldHZhbCA9IHVzYl9zZXJpYWxfcmVnaXN0ZXIoJmZ0ZGlfSEVfVElSQTFfZGV2aWNlKTsKCWlmIChyZXR2YWwpCgkJZ290byBmYWlsZWRfSEVfVElSQTFfcmVnaXN0ZXI7CglyZXR2YWwgPSB1c2JfcmVnaXN0ZXIoJmZ0ZGlfZHJpdmVyKTsKCWlmIChyZXR2YWwpIAoJCWdvdG8gZmFpbGVkX3VzYl9yZWdpc3RlcjsKCglpbmZvKERSSVZFUl9WRVJTSU9OICI6IiBEUklWRVJfREVTQyk7CglyZXR1cm4gMDsKZmFpbGVkX3VzYl9yZWdpc3RlcjoKCXVzYl9zZXJpYWxfZGVyZWdpc3RlcigmZnRkaV9IRV9USVJBMV9kZXZpY2UpOwpmYWlsZWRfSEVfVElSQTFfcmVnaXN0ZXI6Cgl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIoJmZ0ZGlfVVNCX1VJUlRfZGV2aWNlKTsKZmFpbGVkX1VTQl9VSVJUX3JlZ2lzdGVyOgoJdXNiX3NlcmlhbF9kZXJlZ2lzdGVyKCZmdGRpX0ZUMjIzMkNfZGV2aWNlKTsKZmFpbGVkX0ZUMjIzMkNfcmVnaXN0ZXI6Cgl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIoJmZ0ZGlfRlQyMzJCTV9kZXZpY2UpOwpmYWlsZWRfRlQyMzJCTV9yZWdpc3RlcjoKCXVzYl9zZXJpYWxfZGVyZWdpc3RlcigmZnRkaV84VTIzMkFNX2RldmljZSk7CmZhaWxlZF84VTIzMkFNX3JlZ2lzdGVyOgoJdXNiX3NlcmlhbF9kZXJlZ2lzdGVyKCZmdGRpX1NJT19kZXZpY2UpOwpmYWlsZWRfU0lPX3JlZ2lzdGVyOgoJcmV0dXJuIHJldHZhbDsKfQoKCnN0YXRpYyB2b2lkIF9fZXhpdCBmdGRpX2V4aXQgKHZvaWQpCnsKCglkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKCgl1c2JfZGVyZWdpc3RlciAoJmZ0ZGlfZHJpdmVyKTsKCXVzYl9zZXJpYWxfZGVyZWdpc3RlciAoJmZ0ZGlfSEVfVElSQTFfZGV2aWNlKTsKCXVzYl9zZXJpYWxfZGVyZWdpc3RlciAoJmZ0ZGlfVVNCX1VJUlRfZGV2aWNlKTsKCXVzYl9zZXJpYWxfZGVyZWdpc3RlciAoJmZ0ZGlfRlQyMjMyQ19kZXZpY2UpOwoJdXNiX3NlcmlhbF9kZXJlZ2lzdGVyICgmZnRkaV9GVDIzMkJNX2RldmljZSk7Cgl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIgKCZmdGRpXzhVMjMyQU1fZGV2aWNlKTsKCXVzYl9zZXJpYWxfZGVyZWdpc3RlciAoJmZ0ZGlfU0lPX2RldmljZSk7Cgp9CgoKbW9kdWxlX2luaXQoZnRkaV9pbml0KTsKbW9kdWxlX2V4aXQoZnRkaV9leGl0KTsKCk1PRFVMRV9BVVRIT1IoIERSSVZFUl9BVVRIT1IgKTsKTU9EVUxFX0RFU0NSSVBUSU9OKCBEUklWRVJfREVTQyApOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7Cgptb2R1bGVfcGFyYW0oZGVidWcsIGJvb2wsIFNfSVJVR08gfCBTX0lXVVNSKTsKTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGVuYWJsZWQgb3Igbm90Iik7Cgo=