LyoKICogVVNCIEZUREkgU0lPIGRyaXZlcgogKgogKglDb3B5cmlnaHQgKEMpIDE5OTkgLSAyMDAxCiAqCSAgICBHcmVnIEtyb2FoLUhhcnRtYW4gKGdyZWdAa3JvYWguY29tKQogKiAgICAgICAgICBCaWxsIFJ5ZGVyIChicnlkZXJAc2dpLmNvbSkKICoJQ29weXJpZ2h0IChDKSAyMDAyCiAqCSAgICBLdWJhIE9iZXIgKGt1YmFAbWFyZWltYnJpdW0ub3JnKQogKgogKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBTZWUgRG9jdW1lbnRhdGlvbi91c2IvdXNiLXNlcmlhbC50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdXNpbmcgdGhpcyBkcml2ZXIKICoKICogU2VlIGh0dHA6Ly9mdGRpLXVzYi1zaW8uc291cmNlZm9yZ2UubmV0IGZvciB1cHRvIGRhdGUgdGVzdGluZyBpbmZvCiAqCWFuZCBleHRyYSBkb2N1bWVudGF0aW9uCiAqCiAqICgyMS9KdWwvMjAwNCkgSWFuIEFiYm90dAogKiAgICAgIEluY29ycG9yYXRlZCBTdGV2ZW4gVHVybmVyJ3MgY29kZSB0byBhZGQgc3VwcG9ydCBmb3IgdGhlIEZUMjIzMkMgY2hpcC4KICogICAgICBUaGUgcHJlbGltaWxhcnkgcG9ydCB0byB0aGUgMi42IGtlcm5lbCB3YXMgYnkgUnVzIFYuIEJydXNoa29mZi4gIEkgaGF2ZQogKiAgICAgIGZpeGVkIGEgY291cGxlIG9mIHRoaW5ncy4KICoKICogKDI3L01heS8yMDA0KSBJYW4gQWJib3R0CiAqICAgICAgSW1wcm92ZWQgdGhyb3R0bGluZyBjb2RlLCBtb3N0bHkgc3RvbGVuIGZyb20gdGhlIFdoaXRlSEVBVCBkcml2ZXIuCiAqCiAqICgyNi9NYXIvMjAwNCkgSmFuIENhcGVrCiAqICAgICAgQWRkZWQgUElEJ3MgZm9yIElDRC1VMjAvSUNELVU0MCAtIGluY2lyY3VpdCBQSUMgZGVidWdnZXJzIGZyb20gQ0NTIEluYy4KICoKICogKDA5L0ZlYi8yMDA0KSBJYW4gQWJib3R0CiAqICAgICAgQ2hhbmdlZCBmdWxsIG5hbWUgb2YgVVNCLVVJUlQgZGV2aWNlIHRvIGF2b2lkICIvIiBjaGFyYWN0ZXIuCiAqICAgICAgQWRkZWQgRlRESSdzIGFsdGVybmF0ZSBQSUQgKDB4NjAwNikgZm9yIEZUMjMyLzI0NSBkZXZpY2VzLgogKiAgICAgIEFkZGVkIFBJRCBmb3IgIkVMViBVU0IgTW9kdWxlIFVPMTAwIiBmcm9tIFN0ZWZhbiBGcmluZ3MuCiAqCiAqICgyMS9PY3QvMjAwMykgSWFuIEFiYm90dAogKiAgICAgIFJlbmFtZWQgc29tZSBWSUQvUElEIG1hY3JvcyBmb3IgTWF0cml4IE9yYml0YWwgYW5kIFBlcmxlIFN5c3RlbXMKICogICAgICBkZXZpY2VzLiAgUmVtb3ZlZCBNYXRyaXggT3JiaXRhbCBhbmQgUGVybGUgU3lzdGVtcyBkZXZpY2VzIGZyb20gdGhlCiAqICAgICAgOFUyMzJBTSBkZXZpY2UgdGFibGUsIGJ1dCBsZWZ0IHRoZW0gaW4gdGhlIEZUMjMyQk0gdGFibGUsIGFzIHRoZXkgYXJlCiAqICAgICAga25vd24gdG8gdXNlIG9ubHkgRlQyMzJCTS4KICoKICogKDE3L09jdC8yMDAzKSBTY290dCBBbGxlbgogKiAgICAgIEFkZGVkIHZpZC9waWQgZm9yIFBlcmxlIFN5c3RlbXMgVWx0cmFQb3J0IFVTQiBzZXJpYWwgY29udmVydGVycwogKgogKiAoMjEvU2VwLzIwMDMpIElhbiBBYmJvdHQKICogICAgICBBZGRlZCBWSUQvUElEIGZvciBPbW5pZGlyZWN0aW9uYWwgQ29udHJvbCBUZWNobm9sb2d5IFVTMTAxIFVTQiB0bwogKiAgICAgIFJTLTIzMiBhZGFwdGVyIChhbHNvIHJlYmFkZ2VkIGFzIERpY2sgU21pdGggRWxlY3Ryb25pY3MgWEg2MzgxKS4KICogICAgICBWSUQvUElEIHN1cHBsaWVkIGJ5IERvbmFsZCBHb3Jkb24uCiAqCiAqICgxOS9BdWcvMjAwMykgSWFuIEFiYm90dAogKiAgICAgIEZyZWVkIHVyYidzIHRyYW5zZmVyIGJ1ZmZlciBpbiB3cml0ZSBidWxrIGNhbGxiYWNrLgogKiAgICAgIE9taXR0ZWQgc29tZSBwYXJhbm9pZCBjaGVja3MgaW4gd3JpdGUgYnVsayBjYWxsYmFjayB0aGF0IGRvbid0IG1hdHRlci4KICogICAgICBTY2hlZHVsZWQgd29yayBpbiB3cml0ZSBidWxrIGNhbGxiYWNrIHJlZ2FyZGxlc3Mgb2YgcG9ydCdzIG9wZW4gY291bnQuCiAqCiAqICgwNS9BdWcvMjAwMykgSWFuIEFiYm90dAogKiAgICAgIEFkZGVkIFZJRC9QSUQgZm9yIElEIFRFQ0ggSURUMTIyMVUgVVNCIHRvIFJTLTIzMiBhZGFwdGVyLgogKiAgICAgIFZJRC9QSUQgcHJvdmlkZWQgYnkgU3RldmUgQnJpZ2dzLgogKgogKiAoMjMvSnVsLzIwMDMpIElhbiBBYmJvdHQKICogICAgICBBZGRlZCBQSURzIGZvciBDcnlzdGFsRm9udHogNTQ3LCA2MzMsIDYzMSwgNjM1LCA2NDAgYW5kIDY0MCBmcm9tCiAqICAgICAgV2F5bmUgV3lsdXBza2kuCiAqCiAqICgxMC9KdWwvMjAwMykgRGF2aWQgR2xhbmNlCiAqICAgICAgQWRkZWQgUElEIGZvciBEU1MtMjAgU3luY1N0YXRpb24gY3JhZGxlIGZvciBTb255LUVyaWNzc29uIFA4MDAuCiAqCiAqICgyNy9KdW4vMjAwMykgSWFuIEFiYm90dAogKglSZXdvcmtlZCB0aGUgdXJiIGhhbmRsaW5nIGxvZ2ljLiAgV2UgaGF2ZSBubyBtb3JlIHBvb2wsIGJ1dCBkeW5hbWljYWxseQogKglhbGxvY2F0ZSB0aGUgdXJiIGFuZCB0aGUgdHJhbnNmZXIgYnVmZmVyIG9uIHRoZSBmbHkuICBJbiB0ZXN0aW5nIHRoaXMKICoJZG9lcyBub3QgaW5jdXJlIGFueSBtZWFzdXJhYmxlIG92ZXJoZWFkLiAgVGhpcyBhbHNvIHJlbGllcyBvbiB0aGUgZmFjdAogKgl0aGF0IHdlIGhhdmUgcHJvcGVyIHJlZmVyZW5jZSBjb3VudGluZyBsb2dpYyBmb3IgdXJicy4gIEkgbmlja2VkIHRoaXMKICoJZnJvbSBHcmVnIEtIJ3MgVmlzb3IgZHJpdmVyLgogKgogKiAoMjMvSnVuLzIwMDMpIElhbiBBYmJvdHQKICogICAgICBSZWR1Y2VkIGZsaXAgYnVmZmVyIHB1c2hlcyBhbmQgY29ycmVjdGVkIGEgZGF0YSBsZW5ndGggdGVzdCBpbgogKiAgICAgIGZ0ZGlfcmVhZF9idWxrX2NhbGxiYWNrLgogKiAgICAgIERlZmVyZXJlbmNlIHBvaW50ZXJzIGFmdGVyIGFueSBwYXJhbm9pZCBjaGVja3MsIG5vdCBiZWZvcmUuCiAqCiAqICgyMS9KdW4vMjAwMykgRXJpayBOeWdyZW4KICogICAgICBBZGRlZCBzdXBwb3J0IGZvciBIb21lIEVsZWN0cm9uaWNzIFRpcmEtMSBJUiB0cmFuc2NlaXZlciB1c2luZyBGVDIzMkJNIGNoaXAuCiAqICAgICAgU2VlIDxodHRwOi8vd3d3LmhvbWUtZWxlY3Ryby5jb20vdGlyYTEuaHRtPi4gIE9ubHkgb3BlcmF0ZXMgcHJvcGVybHkKICogICAgICBhdCAxMDAwMDAgYW5kIFJUUy1DVFMsIHNvIHNldCBjdXN0b20gZGl2aXNvciBtb2RlIG9uIHN0YXJ0dXAuCiAqICAgICAgQWxzbyBmb3JjZSB0aGUgVGlyYS0xIGFuZCBVU0ItVUlSVCB0byBvbmx5IHVzZSB0aGVpciBjdXN0b20gYmF1ZCByYXRlcy4KICoKICogKDE4L0p1bi8yMDAzKSBJYW4gQWJib3R0CiAqICAgICAgQWRkZWQgRGV2aWNlIElEIG9mIHRoZSBVU0IgcmVsYWlzIGZyb20gUnVkb2xmIEd1Z2xlciAoYmFja3BvcnRlZCBmcm9tCiAqICAgICAgUGhpbGlwcCBH/GhyaW5nJ3MgcGF0Y2ggZm9yIDIuNS54IGtlcm5lbCkuCiAqICAgICAgTW92ZWQgcmVhZCB0cmFuc2ZlciBidWZmZXIgcmVhbGxvY2F0aW9uIGludG8gc3RhcnR1cCBmdW5jdGlvbi4KICogICAgICBGcmVlIGV4aXN0aW5nIHdyaXRlIHVyYiBhbmQgdHJhbnNmZXIgYnVmZmVyIGluIHN0YXJ0dXAgZnVuY3Rpb24uCiAqICAgICAgT25seSB1c2UgdXJicyBpbiB3cml0ZSB1cmIgcG9vbCB0aGF0IHdlcmUgc3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZC4KICogICAgICBNb3ZlZCBzb21lIGNvbnN0YW50IG1hY3JvcyBvdXQgb2YgZnVuY3Rpb25zLgogKiAgICAgIE1pbm9yIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnQgY2hhbmdlcy4KICoKICogKDEyL0p1bi8yMDAzKSBEYXZpZCBOb3J3b29kCiAqICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgVVNCLVVJUlQgSVIgdHJhbnNjZWl2ZXIgdXNpbmcgOFUyMzJBTSBjaGlwLgogKiAgICAgIFNlZSA8aHR0cDovL2hvbWUuZWFydGhsaW5rLm5ldC9+anJoZWVzL1VTQlVJUlQvaW5kZXguaHRtPi4gIE9ubHkKICogICAgICBvcGVyYXRlcyBwcm9wZXJseSBhdCAzMTI1MDAsIHNvIHNldCBjdXN0b20gZGl2aXNvciBtb2RlIG9uIHN0YXJ0dXAuCiAqCiAqICgxMi9KdW4vMjAwMykgSWFuIEFiYm90dAogKiAgICAgIEFkZGVkIFNlYWxldmVsIFNlYUxJTksrIDIxMHgsIDIyMHgsIDI0MHgsIDI4MHggdmlkL3BpZHMgZnJvbSBUdWFuIEhvYW5nCiAqICAgICAgLSBJJ3ZlIGVsaW1pbmF0ZWQgc29tZSB0aGF0IGRvbid0IHNlZW0gdG8gZXhpc3QhCiAqICAgICAgQWRkZWQgSG9tZSBFbGVjdHJvbmljcyBUaXJhLTEgSVIgdHJhbnNjZWl2ZXIgcGlkIGZyb20gQ2hyaXMgSG9ybgogKiAgICAgIFNvbWUgd2hpdGVzcGFjZS9jb2Rpbmctc3R5bGUgY2xlYW51cHMKICoKICogKDExL0p1bi8yMDAzKSBJYW4gQWJib3R0CiAqICAgICAgRml4ZWQgdW5zYWZlIHNwaW5sb2NrIHVzYWdlIGluIGZ0ZGlfd3JpdGUKICoKICogKDI0L0ZlYi8yMDAzKSBSaWNoYXJkIFNob290ZXIKICogICAgICBJbmNyZWFzZSByZWFkIGJ1ZmZlciBzaXplIHRvIGltcHJvdmUgcmVhZCBzcGVlZHMgYXQgaGlnaGVyIGJhdWQgcmF0ZXMKICogICAgICAoc3BlY2lmaWNhbGx5IHRlc3RlZCB3aXRoIHVwIHRvIDFNYi9zZWMgYXQgMS41TSBiYXVkKQogKgogKiAoMjMvRmViLzIwMDMpIEpvaG4gV2lsa2lucwogKiAgICAgIEFkZGVkIFhvbi94b2ZmIGZsb3cgY29udHJvbCAoYWN0aXZhdGluZyBzdXBwb3J0IGluIHRoZSBmdGRpIGRldmljZSkKICogICAgICBBZGRlZCB2aWQvcGlkIGZvciBWaWRlb25ldHdvcmtzL0hvbWVjaG9pY2UgKFVLIElTUCkKICoKICogKDIzL0ZlYi8yMDAzKSBCaWxsIFJ5ZGVyCiAqICAgICAgQWRkZWQgbWF0cml4IG9yYiBkZXZpY2UgdmlkL3BpZHMgZnJvbSBXYXluZSBXeWx1cHNraQogKgogKiAoMTkvRmViLzIwMDMpIElhbiBBYmJvdHQKICogICAgICBGb3IgVElPQ1NTRVJJQUwsIHNldCBhbHRfc3BlZWQgdG8gMCB3aGVuIEFTWU5DX1NQRF9NQVNLIHZhbHVlIGhhcwogKiAgICAgIGNoYW5nZWQgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gQVNZTkNfU1BEX0hJLCBBU1lOQ19TUERfVkhJLAogKiAgICAgIEFTWU5DX1NQRF9TSEkgb3IgQVNZTkNfU1BEX1dBUlAuICBBbHNvLCB1bmxlc3MgQVNZTkNfU1BEX0NVU1QgaXMgaW4KICogICAgICBmb3JjZSwgZG9uJ3QgYm90aGVyIGNoYW5naW5nIGJhdWQgcmF0ZSB3aGVuIGN1c3RvbV9kaXZpc29yIGhhcyBjaGFuZ2VkLgogKgogKiAoMTgvRmViLzIwMDMpIElhbiBBYmJvdHQKICogICAgICBGaXhlZCBUSU9DTUdFVCBoYW5kbGluZyB0byBpbmNsdWRlIHN0YXRlIG9mIERUUiBhbmQgUlRTLCB0aGUgc3RhdGUKICogICAgICBvZiB3aGljaCBhcmUgbm93IHNhdmVkIGJ5IHNldF9kdHIoKSBhbmQgc2V0X3J0cygpLgogKiAgICAgIEZpeGVkIGltcHJvcGVyIHN0b3JhZ2UgY2xhc3MgZm9yIGJ1ZiBpbiBzZXRfZHRyKCkgYW5kIHNldF9ydHMoKS4KICogICAgICBBZGRlZCBGVDIzMkJNIGNoaXAgdHlwZSBhbmQgc3VwcG9ydCBmb3IgaXRzIGV4dHJhIGJhdWQgcmF0ZXMgKGNvbXBhcmVkCiAqICAgICAgdG8gRlQ4VTIzMkFNKS4KICogICAgICBUb29rIGFjY291bnQgb2Ygc3BlY2lhbCBjYXNlIGRpdmlzb3IgdmFsdWVzIGZvciBoaWdoZXN0IGJhdWQgcmF0ZXMgb2YKICogICAgICBGVDhVMjMyQU0gYW5kIEZUMjMyQk0uCiAqICAgICAgRm9yIFRJT0NTU0VSSUFMLCBmb3JjZWQgYWx0X3NwZWVkIHRvIDAgd2hlbiBBU1lOQ19TUERfQ1VTVCBrbHVkZ2UgdXNlZCwKICogICAgICBhcyBwcmV2aW91cyBhbHRfc3BlZWQgc2V0dGluZyBpcyBub3cgc3RhbGUuCiAqICAgICAgTW92ZWQgc3RhcnR1cCBjb2RlIGNvbW1vbiBiZXR3ZWVuIHRoZSBzdGFydHVwIHJvdXRpbmVzIGZvciB0aGUKICogICAgICBkaWZmZXJlbnQgY2hpcCB0eXBlcyBpbnRvIGEgY29tbW9uIHN1YnJvdXRpbmUuCiAqCiAqICgxNy9GZWIvMjAwMykgQmlsbCBSeWRlcgogKiAgICAgIEFkZGVkIHdyaXRlIHVyYiBidWZmZXIgcG9vbCBvbiBhIHBlciBkZXZpY2UgYmFzaXMKICogICAgICBBZGRlZCBtb3JlIGNoZWNraW5nIGZvciBvcGVuIGZpbGUgb24gY2FsbGJhY2tzIChmaXhlZCBPT1BTKQogKiAgICAgIEFkZGVkIENyeXN0YWxGb250eiA2MzIgYW5kIDYzNCBQSURzCiAqICAgICAgICAgKHRoYW54IHRvIENyeXN0YWxGb250eiBmb3IgdGhlIHNhbXBsZSBkZXZpY2VzIC0gdGhleSBmbHVzaGVkIG91dAogKiAgICAgICAgICAgc29tZSBkcml2ZXIgYnVncykKICogICAgICBNaW5vciBkZWJ1Z2dpbmcgbWVzc2FnZSBjaGFuZ2VzCiAqICAgICAgQWRkZWQgdGhyb3R0bGUsIHVudGhyb3R0bGUgYW5kIGNoYXJzX2luX2J1ZmZlciBmdW5jdGlvbnMKICogICAgICBGaXhlZCBGVERJX1NJTyAodGhlIG9yaWdpbmFsIGRldmljZSkgYnVnCiAqICAgICAgRml4ZWQgc29tZSBzaHV0ZG93biBoYW5kbGluZwogKgogKgogKgogKgogKiAoMDcvSnVuLzIwMDIpIEt1YmEgT2JlcgogKglDaGFuZ2VkIEZURElfU0lPX0JBU0VfQkFVRF9UT19ESVZJU09SIG1hY3JvIGludG8gZnRkaV9iYXVkX3RvX2Rpdmlzb3IKICoJZnVuY3Rpb24uIEl0IHdhcyBnZXR0aW5nIHRvbyBjb21wbGV4LgogKglGaXggdGhlIGRpdmlzb3IgY2FsY3VsYXRpb24gbG9naWMgd2hpY2ggd2FzIHNldHRpbmcgZGl2aXNvciBvZiAwLjEyNQogKglpbnN0ZWFkIG9mIDAuNSBmb3IgZnJhY3Rpb25hbCBwYXJ0cyBvZiBkaXZpc29yIGVxdWFsIHRvIDUvOCwgNi84LCA3LzguCiAqCUFsc28gbWFrZSBpdCBidW1wIHVwIHRoZSBkaXZpc29yIHRvIG5leHQgaW50ZWdlciBpbiBjYXNlIG9mIDcvOCAtIGl0J3MKICoJYSBiZXR0ZXIgYXBwcm94aW1hdGlvbi4KICoKICogKDI1L0p1bC8yMDAyKSBCaWxsIFJ5ZGVyIGluc2VydGVkIERtaXRyaSdzIFRJT0NNSVdBSVQgcGF0Y2gKICogICAgICBOb3QgdGVzdGVkIGJ5IG1lIGJ1dCBpdCBkb2Vzbid0IGJyZWFrIGFueXRoaW5nIEkgdXNlLgogKgogKiAoMDQvSmFuLzIwMDIpIEt1YmEgT2JlcgogKglJbXBsZW1lbnRlZCAzODQwMCBiYXVkcmF0ZSBrbHVkZ2UsIHdoZXJlIGl0IGNhbiBiZSBzdWJzdGl0dXRlZCB3aXRoIG90aGVyCiAqCSAgdmFsdWVzLiBUaGF0J3MgdGhlIG9ubHkgd2F5IHRvIHNldCBjdXN0b20gYmF1ZHJhdGVzLgogKglJbXBsZW1lbnRlZCBUSU9DU1NFUklBTCwgVElPQ0dTRVJJQUwgaW9jdGwncyBzbyB0aGF0IHNldHNlcmlhbCBpcyBoYXBweS4KICoJRklYTUU6IGJvdGggYmF1ZHJhdGUgdGhpbmdzIHNob3VsZCBldmVudHVhbGx5IGdvIHRvIHVzYnNlcmlhbC5jIGFzIG90aGVyCiAqCSAgZGV2aWNlcyBtYXkgbmVlZCB0aGF0IGZ1bmN0aW9uYWxpdHkgdG9vLiBBY3R1YWxseSwgaXQgY2FuIHByb2JhYmx5IGJlCiAqCSAgbWVyZ2VkIGluIHNlcmlhbC5jIHNvbWVob3cgLSB0b28gbWFueSBkcml2ZXJzIHJlcGVhdCB0aGlzIGNvZGUgb3ZlcgogKgkgIGFuZCBvdmVyLgogKglGaXhlZCBiYXVkcmF0ZSBmb3JnZXRmdWxuZXNzIC0gb3BlbigpIHVzZWQgdG8gcmVzZXQgYmF1ZHJhdGUgdG8gOTYwMCBldmVyeSB0aW1lLgogKglEaXZpc29ycyBmb3IgYmF1ZHJhdGVzIGFyZSBjYWxjdWxhdGVkIGJ5IGEgbWFjcm8uCiAqCVNtYWxsIGNvZGUgY2xlYW51cHMuIFVnbHkgd2hpdGVzcGFjZSBjaGFuZ2VzIGZvciBQbGF0bydzIHNha2Ugb25seSA7LV0uCiAqCiAqICgwNC9Ob3YvMjAwMSkgQmlsbCBSeWRlcgogKglGaXhlZCBidWcgaW4gcmVhZF9idWxrX2NhbGxiYWNrIHdoZXJlIGluY29ycmVjdCB1cmIgYnVmZmVyIHdhcyB1c2VkLgogKglDbGVhbmVkIHVwIHdyaXRlIG9mZnNldCBjYWxjdWxhdGlvbgogKglBZGRlZCB3cml0ZV9yb29tIHNpbmNlIGRlZmF1bHQgdmFsdWVzIGNhbiBiZSBpbmNvcnJlY3QgZm9yIHNpbwogKglDaGFuZ2VkIHdyaXRlX2J1bGtfY2FsbGJhY2sgdG8gdXNlIHNhbWUgcXVldWVfdGFzayBhcyBvdGhlciBkcml2ZXJzCiAqICAgICAgICAodGhlIHByZXZpb3VzIHZlcnNpb24gY2F1c2VkIHBhbmljcykKICoJUmVtb3ZlZCBwb3J0IGl0ZXJhdGlvbiBjb2RlIHNpbmNlIHRoZSBkZXZpY2Ugb25seSBoYXMgb25lIEkvTyBwb3J0IGFuZCBpdAogKgkgIHdhcyB3cm9uZyBhbnl3YXkuCiAqCiAqICgzMS9NYXkvMjAwMSkgZ2toCiAqCVN3aXRjaGVkIGZyb20gdXNpbmcgc3BpbmxvY2sgdG8gYSBzZW1hcGhvcmUsIHdoaWNoIGZpeGVzIGxvdHMgb2YgcHJvYmxlbXMuCiAqCiAqICgyMy9NYXkvMjAwMSkgICBCaWxsIFJ5ZGVyCiAqCUFkZGVkIHJ1bnRpbWUgZGVidWcgcGF0Y2ggKHRoYW54IFR5c29uIEQgU2F3eWVyKS4KICoJQ2xlYW5lZCB1cCBjb21tZW50cyBmb3IgOFUyMzIKICoJQWRkZWQgcGFyaXR5LCBmcmFtaW5nIGFuZCBvdmVycnVuIGVycm9yIGhhbmRsaW5nCiAqCUFkZGVkIHJlY2VpdmUgYnJlYWsgaGFuZGxpbmcuCiAqCiAqICgwNC8wOC8yMDAxKSBnYgogKglJZGVudGlmeSB2ZXJzaW9uIG9uIG1vZHVsZSBsb2FkLgogKgogKiAoMTgvTWFyY2gvMjAwMSkgQmlsbCBSeWRlcgogKgkoTm90IHJlbGVhc2VkKQogKglBZGRlZCBzZW5kIGJyZWFrIGhhbmRsaW5nLiAocmVxdWlyZXMga2VybmVsIHBhdGNoIHRvbykKICoJRml4ZWQgOFUyMzJBTSBoYXJkd2FyZSBSVFMvQ1RTIGV0YyBzdGF0dXMgcmVwb3J0aW5nLgogKglBZGRlZCBmbGlwYnVmIGZpeCBjb3BpZWQgZnJvbSBnZW5lcmljIGRldmljZQogKgogKiAoMTIvMy8yMDAwKSBCaWxsIFJ5ZGVyCiAqCUFkZGVkIHN1cHBvcnQgZm9yIDhVMjMyQU0gZGV2aWNlLgogKglNb3ZlZCBQSUQgYW5kIFZJRHMgaW50byBoZWFkZXIgZmlsZSBvbmx5LgogKglUdXJuZWQgb24gbG93LWxhdGVuY3kgZm9yIHRoZSB0dHkgKGRldmljZSB3aWxsIGRvIGhpZ2ggYmF1ZHJhdGVzKQogKglBZGRlZCBzaHV0ZG93biByb3V0aW5lIHRvIGNsb3NlIGZpbGVzIHdoZW4gZGV2aWNlIHJlbW92ZWQuCiAqCU1vcmUgZGVidWcgYW5kIGVycm9yIG1lc3NhZ2UgY2xlYW51cHMuCiAqCiAqICgxMS8xMy8yMDAwKSBCaWxsIFJ5ZGVyCiAqCUFkZGVkIHNwaW5sb2NrIHByb3RlY3RlZCBvcGVuIGNvZGUgYW5kIGNsb3NlIGNvZGUuCiAqCU11bHRpcGxlIG9wZW5zIHdvcmsgKHNvcnQgb2YgLSBzZWUgd2VicGFnZSBtZW50aW9uZWQgYWJvdmUpLgogKglDbGVhbmVkIHVwIGNvbW1lbnRzLiBSZW1vdmVkIG11bHRpcGxlIFBJRC9WSUQgZGVmaW5pdGlvbnMuCiAqCUZhY3RvcmlzZWQgY3RzL2R0ciBjb2RlCiAqCU1hZGUgdXNlIG9mIF9fRlVOQ1RJT05fXyBpbiBkYmcncwogKgogKiAoMTEvMDEvMjAwMCkgQWRhbSBKLiBSaWNodGVyCiAqCXVzYl9kZXZpY2VfaWQgdGFibGUgc3VwcG9ydAogKgogKiAoMTAvMDUvMjAwMCkgZ2toCiAqCUZpeGVkIGJ1ZyB3aXRoIHVyYi0+ZGV2IG5vdCBiZWluZyBzZXQgcHJvcGVybHksIG5vdyB0aGF0IHRoZSB1c2IKICoJY29yZSBuZWVkcyBpdC4KICoKICogKDA5LzExLzIwMDApIGdraAogKglSZW1vdmVkIERFQlVHICNpZmRlZnMgd2l0aCBjYWxsIHRvIHVzYl9zZXJpYWxfZGVidWdfZGF0YQogKgogKiAoMDcvMTkvMjAwMCkgZ2toCiAqCUFkZGVkIG1vZHVsZV9pbml0IGFuZCBtb2R1bGVfZXhpdCBmdW5jdGlvbnMgdG8gaGFuZGxlIHRoZSBmYWN0IHRoYXQgdGhpcwogKglkcml2ZXIgaXMgYSBsb2FkYWJsZSBtb2R1bGUgbm93LgogKgogKiAoMDQvMDQvMjAwMCkgQmlsbCBSeWRlcgogKglGaXhlZCBidWdzIGluIFRDR0VUL1RDU0VUIGlvY3RscyAoYnkgcmVtb3ZpbmcgdGhlbSAtIHRoZXkgYXJlCiAqICAgICAgICBoYW5kbGVkIGVsc2V3aGVyZSBpbiB0aGUgdHR5IGlvIGRyaXZlciBjaGFpbikuCiAqCiAqICgwMy8zMC8yMDAwKSBCaWxsIFJ5ZGVyCiAqCUltcGxlbWVudGVkIGxvdHMgb2YgaW9jdGxzCiAqCUZpeGVkIGEgcmFjZSBjb25kaXRpb24gaW4gd3JpdGUKICoJQ2hhbmdlZCBzb21lIGRiZydzIHRvIGVycnMKICoKICogKDAzLzI2LzIwMDApIGdraAogKglTcGxpdCBkcml2ZXIgdXAgaW50byBkZXZpY2Ugc3BlY2lmaWMgcGllY2VzLgogKgogKi8KCi8qIEJpbGwgUnlkZXIgLSBicnlkZXJAc2dpLmNvbSAtIHdyb3RlIHRoZSBGVERJX1NJTyBpbXBsZW1lbnRhdGlvbiAqLwovKiBUaGFueCB0byBGVERJIGZvciBzbyBraW5kbHkgcHJvdmlkaW5nIGRldGFpbHMgb2YgdGhlIHByb3RvY29sIHJlcXVpcmVkICovCi8qICAgdG8gdGFsayB0byB0aGUgZGV2aWNlICovCi8qIFRoYW54IHRvIGdraCBhbmQgdGhlIHJlc3Qgb2YgdGhlIHVzYiBkZXYgZ3JvdXAgZm9yIGFsbCBjb2RlIEkgaGF2ZSBhc3NpbWlsYXRlZCA6LSkgKi8KCiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiNpbmNsdWRlIDxsaW51eC90dHkuaD4KI2luY2x1ZGUgPGxpbnV4L3R0eV9kcml2ZXIuaD4KI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgojaW5jbHVkZSA8bGludXgvdXNiLmg+CiNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KI2luY2x1ZGUgPGxpbnV4L3VzYi9zZXJpYWwuaD4KI2luY2x1ZGUgImZ0ZGlfc2lvLmgiCgovKgogKiBWZXJzaW9uIEluZm9ybWF0aW9uCiAqLwojZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2MS40LjMiCiNkZWZpbmUgRFJJVkVSX0FVVEhPUiAiR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4sIEJpbGwgUnlkZXIgPGJyeWRlckBzZ2kuY29tPiwgS3ViYSBPYmVyIDxrdWJhQG1hcmVpbWJyaXVtLm9yZz4iCiNkZWZpbmUgRFJJVkVSX0RFU0MgIlVTQiBGVERJIFNlcmlhbCBDb252ZXJ0ZXJzIERyaXZlciIKCnN0YXRpYyBpbnQgZGVidWc7CnN0YXRpYyBfX3UxNiB2ZW5kb3IgPSBGVERJX1ZJRDsKc3RhdGljIF9fdTE2IHByb2R1Y3Q7CgovKiBzdHJ1Y3QgZnRkaV9zaW9fcXVpcmsgaXMgdXNlZCBieSBkZXZpY2VzIHJlcXVpcmluZyBzcGVjaWFsIGF0dGVudGlvbi4gKi8Kc3RydWN0IGZ0ZGlfc2lvX3F1aXJrIHsKCXZvaWQgKCpzZXR1cCkoc3RydWN0IHVzYl9zZXJpYWwgKik7IC8qIFNwZWNpYWwgc2V0dGluZ3MgZHVyaW5nIHN0YXJ0dXAuICovCn07CgpzdGF0aWMgdm9pZCAgZnRkaV9VU0JfVUlSVF9zZXR1cAkoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCk7CnN0YXRpYyB2b2lkICBmdGRpX0hFX1RJUkExX3NldHVwCShzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKTsKCnN0YXRpYyBzdHJ1Y3QgZnRkaV9zaW9fcXVpcmsgZnRkaV9VU0JfVUlSVF9xdWlyayA9IHsKCS5zZXR1cCA9IGZ0ZGlfVVNCX1VJUlRfc2V0dXAsCn07CgpzdGF0aWMgc3RydWN0IGZ0ZGlfc2lvX3F1aXJrIGZ0ZGlfSEVfVElSQTFfcXVpcmsgPSB7Cgkuc2V0dXAgPSBmdGRpX0hFX1RJUkExX3NldHVwLAp9OwoKLyoKICogVGhlIDhVMjMyQU0gaGFzIHRoZSBzYW1lIEFQSSBhcyB0aGUgc2lvIGV4Y2VwdCBmb3I6CiAqIC0gaXQgY2FuIHN1cHBvcnQgTVVDSCBoaWdoZXIgYmF1ZHJhdGVzOyB1cCB0bzoKICogICBvIDkyMTYwMCBmb3IgUlMyMzIgYW5kIDIwMDAwMDAgZm9yIFJTNDIyLzQ4NSBhdCA0OE1IegogKiAgIG8gMjMwNDAwIGF0IDEyTUh6CiAqICAgc28gLi4gOFUyMzJBTSdzIGJhdWRyYXRlIHNldHRpbmcgY29kZXMgYXJlIGRpZmZlcmVudAogKiAtIGl0IGhhcyBhIHR3byBieXRlIHN0YXR1cyBjb2RlLgogKiAtIGl0IHJldHVybnMgY2hhcmFjdGVycyBldmVyeSAxNm1zICh0aGUgRlRESSBkb2VzIGl0IGV2ZXJ5IDQwbXMpCiAqCiAqIHRoZSBiY2REZXZpY2UgdmFsdWUgaXMgdXNlZCB0byBkaWZmZXJlbnRpYXRlIEZUMjMyQk0gYW5kIEZUMjQ1Qk0gZnJvbQogKiB0aGUgZWFybGllciBGVDhVMjMyQU0gYW5kIEZUOFUyMzJCTS4gIEZvciBub3csIGluY2x1ZGUgYWxsIGtub3duIFZJRC9QSUQKICogY29tYmluYXRpb25zIGluIGJvdGggdGFibGVzLgogKiBGSVhNRTogcGVyaGFwcyBiY2REZXZpY2UgY2FuIGFsc28gaWRlbnRpZnkgMTJNSHogRlQ4VTIzMkFNIGRldmljZXMsCiAqIGJ1dCBJIGRvbid0IGtub3cgaWYgdGhvc2UgZXZlciB3ZW50IGludG8gbWFzcyBwcm9kdWN0aW9uLiBbSWFuIEFiYm90dF0KICovCgoKCnN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBpZF90YWJsZV9jb21iaW5lZCBbXSA9IHsKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9BTUMyMzJfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0NBTlVTQl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfQUNUWldBVkVfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0lSVFJBTlNfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0lQTFVTX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9ETVg0QUxMKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1NJT19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfOFUyMzJBTV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfOFUyMzJBTV9BTFRfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJXzhVMjIzMkNfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX01JQ1JPX0NIQU1FTEVPTl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfUkVMQUlTX1BJRCkgfSwKCXsgVVNCX0RFVklDRShJTlRFUkJJT01FVFJJQ1NfVklELCBJTlRFUkJJT01FVFJJQ1NfSU9CT0FSRF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoSU5URVJCSU9NRVRSSUNTX1ZJRCwgSU5URVJCSU9NRVRSSUNTX01JTklfSU9CT0FSRF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfWEZfNjMyX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9YRl82MzRfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1hGXzU0N19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfWEZfNjMzX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9YRl82MzFfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1hGXzYzNV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfWEZfNjQwX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9YRl82NDJfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0RTUzIwX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX05GX1JJQ19WSUQsIEZURElfTkZfUklDX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9WTkhDUENVU0JfRF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfTVRYT1JCXzBfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX01UWE9SQl8xX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9NVFhPUkJfMl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfTVRYT1JCXzNfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX01UWE9SQl80X1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9NVFhPUkJfNV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfTVRYT1JCXzZfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1BFUkxFX1VMVFJBUE9SVF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfUElFR1JPVVBfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1ROQ19YX1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzIxMDFfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjEwMl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMTAzX1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzIxMDRfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjEwNl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMjAxXzFfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjIwMV8yX1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzIyMDJfMV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMjAyXzJfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjIwM18xX1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzIyMDNfMl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAxXzFfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwMV8yX1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDFfM19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAxXzRfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwMl8xX1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDJfMl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAyXzNfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwMl80X1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDNfMV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAzXzJfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwM18zX1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDNfNF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAxXzFfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMV8yX1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDFfM19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAxXzRfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMV81X1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDFfNl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAxXzdfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMV84X1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDJfMV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAyXzJfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMl8zX1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDJfNF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAyXzVfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMl82X1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDJfN19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAyXzhfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwM18xX1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDNfMl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAzXzNfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwM180X1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDNfNV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAzXzZfUElEKSB9LAoJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwM183X1BJRCkgfSwKCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDNfOF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoSURURUNIX1ZJRCwgSURURUNIX0lEVDEyMjFVX1BJRCkgfSwKCXsgVVNCX0RFVklDRShPQ1RfVklELCBPQ1RfVVMxMDFfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0hFX1RJUkExX1BJRCksCgkJLmRyaXZlcl9pbmZvID0gKGtlcm5lbF91bG9uZ190KSZmdGRpX0hFX1RJUkExX3F1aXJrIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfVVNCX1VJUlRfUElEKSwKCQkuZHJpdmVyX2luZm8gPSAoa2VybmVsX3Vsb25nX3QpJmZ0ZGlfVVNCX1VJUlRfcXVpcmsgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgUFJPVEVHT19TUEVDSUFMXzEpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIFBST1RFR09fUjJYMCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgUFJPVEVHT19TUEVDSUFMXzMpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIFBST1RFR09fU1BFQ0lBTF80KSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0dVREVBRFNfRTgwOF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODA5X1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4MEFfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0dVREVBRFNfRTgwQl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODBDX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4MERfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0dVREVBRFNfRTgwRV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODBGX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4ODhfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0dVREVBRFNfRTg4OV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODhBX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4OEJfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0dVREVBRFNfRTg4Q19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfR1VERUFEU19FODhEX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4OEVfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0dVREVBRFNfRTg4Rl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX1VPMTAwX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfVU0xMDBfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9VUjEwMF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX0FMQzg1MDBfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1BZUkFNSURfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9GSFoxMDAwUENfUElEKSB9LAoJLyoKCSAqIFRoZXNlIHdpbGwgcHJvYmFibHkgdXNlIHVzZXItc3BhY2UgZHJpdmVycy4gIFVuY29tbWVudCB0aGVtIGlmCgkgKiB5b3UgbmVlZCB0aGVtIG9yIHVzZSB0aGUgdXNlci1zcGVjaWZpZWQgdmVuZG9yL3Byb2R1Y3QgbW9kdWxlCgkgKiBwYXJhbWV0ZXJzIChzZWUgZnRkaV9zaW8uaCBmb3IgdGhlIG51bWJlcnMpLiAgTWFrZSBhIGZ1c3MgaWYKCSAqIHlvdSB0aGluayB0aGUgZHJpdmVyIHNob3VsZCByZWNvZ25pemUgYW55IG9mIHRoZW0gYnkgZGVmYXVsdC4KCSAqLwoJLyogeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9DTEk3MDAwX1BJRCkgfSwgKi8KCS8qIHsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfUFBTNzMzMF9QSUQpIH0sICovCgkvKiB7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX1RGTTEwMF9QSUQpIH0sICovCgkvKiB7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX1VERjc3X1BJRCkgfSwgKi8KCS8qIHsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfVUlPODhfUElEKSB9LCAqLwoJLyogeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9VQUQ4X1BJRCkgfSwgKi8KCS8qIHsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfVURBN19QSUQpIH0sICovCgkvKiB7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX1VTSTJfUElEKSB9LCAqLwoJLyogeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9UMTEwMF9QSUQpIH0sICovCgkvKiB7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX1BDRDIwMF9QSUQpIH0sICovCgkvKiB7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX1VMQTIwMF9QSUQpIH0sICovCgkvKiB7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX0NTSThfUElEKSB9LCAqLwoJLyogeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9FTTEwMDBETF9QSUQpIH0sICovCgkvKiB7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX1BDSzEwMF9QSUQpIH0sICovCgkvKiB7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX1JGUDUwMF9QSUQpIH0sICovCgkvKiB7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUxWX0ZTMjBTSUdfUElEKSB9LCAqLwoJLyogeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9XUzMwMFBDX1BJRCkgfSwgKi8KCS8qIHsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfRkhaMTMwMFBDX1BJRCkgfSwgKi8KCS8qIHsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfV1M1MDBfUElEKSB9LCAqLwoJeyBVU0JfREVWSUNFKEZURElfVklELCBMSU5YX1NETVVTQlFTU19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIExJTlhfTUFTVEVSREVWRUwyX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgTElOWF9GVVRVUkVfMF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIExJTlhfRlVUVVJFXzFfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBMSU5YX0ZVVFVSRV8yX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9DQ1NJQ0RVMjBfMF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfQ0NTSUNEVTQwXzFfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBJTlNJREVfQUNDRVNTTykgfSwKCXsgVVNCX0RFVklDRShJTlRSRVBJRF9WSUQsIElOVFJFUElEX1ZBTFVFQ0FOX1BJRCkgfSwKCXsgVVNCX0RFVklDRShJTlRSRVBJRF9WSUQsIElOVFJFUElEX05FT1ZJX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGQUxDT01fVklELCBGQUxDT01fVFdJU1RfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZBTENPTV9WSUQsIEZBTENPTV9TQU1CQV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfU1VVTlRPX1NQT1JUU19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfUk1fQ0FOVklFV19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoQkFOREJfVklELCBCQU5EQl9VU09UTDRfUElEKSB9LAoJeyBVU0JfREVWSUNFKEJBTkRCX1ZJRCwgQkFOREJfVVNUTDRfUElEKSB9LAoJeyBVU0JfREVWSUNFKEJBTkRCX1ZJRCwgQkFOREJfVVNPOU1MMl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEVWRVJfRUNPX1BST19DRFMpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfNE5fR0FMQVhZX0RFXzBfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJXzROX0dBTEFYWV9ERV8xX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV80Tl9HQUxBWFlfREVfMl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIFhTRU5TX0NPTlZFUlRFUl8wX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgWFNFTlNfQ09OVkVSVEVSXzFfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBYU0VOU19DT05WRVJURVJfMl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIFhTRU5TX0NPTlZFUlRFUl8zX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgWFNFTlNfQ09OVkVSVEVSXzRfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBYU0VOU19DT05WRVJURVJfNV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIFhTRU5TX0NPTlZFUlRFUl82X1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgWFNFTlNfQ09OVkVSVEVSXzdfUElEKSB9LAoJeyBVU0JfREVWSUNFKE1PQklMSVRZX1ZJRCwgTU9CSUxJVFlfVVNCX1NFUklBTF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfQUNUSVZFX1JPQk9UU19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfTUhBTV9LV19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfTUhBTV9ZU19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfTUhBTV9ZNl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfTUhBTV9ZOF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfTUhBTV9JQ19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfTUhBTV9EQjlfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX01IQU1fUlMyMzJfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX01IQU1fWTlfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1RFUkFUUk9OSUtfVkNQX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9URVJBVFJPTklLX0QyWFhfUElEKSB9LAoJeyBVU0JfREVWSUNFKEVWT0xVVElPTl9WSUQsIEVWT0xVVElPTl9FUjFfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0FSVEVNSVNfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0FUSUtfQVRLMTZfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0FUSUtfQVRLMTZDX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9BVElLX0FUSzE2SFJfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0FUSUtfQVRLMTZIUkNfUElEKSB9LAoJeyBVU0JfREVWSUNFKEtPQklMX1ZJRCwgS09CSUxfQ09OVl9CMV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoS09CSUxfVklELCBLT0JJTF9DT05WX0tBQU5fUElEKSB9LAoJeyBVU0JfREVWSUNFKFBPU0lGTEVYX1ZJRCwgUE9TSUZMRVhfUFA3MDAwX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9UVFVTQl9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRUNMT19DT01fMVdJUkVfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1dFU1RSRVhfTU9ERUxfNzc3X1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9XRVNUUkVYX01PREVMXzg5MDBGX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9QQ0RKX0RBQzJfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1JSQ0lSS0lUU19MT0NPQlVGRkVSX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9BU0tfUkRSNDAwX1BJRCkgfSwKCXsgVVNCX0RFVklDRShJQ09NX0lEMV9WSUQsIElDT01fSUQxX1BJRCkgfSwKCXsgVVNCX0RFVklDRShQQVBPVUNIX1ZJRCwgUEFQT1VDSF9UTVVfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0FDR19IRkRVQUxfUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1lFSV9TRVJWT0NFTlRFUjMxX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9USE9STEFCU19QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoVEVTVE9fVklELCBURVNUT19VU0JfSU5URVJGQUNFX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9HQU1NQV9TQ09VVF9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfVEFDVFJJWF9PUEVOUE9SVF8xM01fUElEKSB9LAoJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1RBQ1RSSVhfT1BFTlBPUlRfMTNTX1BJRCkgfSwKCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9UQUNUUklYX09QRU5QT1JUXzEzVV9QSUQpIH0sCgl7IFVTQl9ERVZJQ0UoRUxFS1RPUl9WSUQsIEVMRUtUT1JfRlQzMjNSX1BJRCkgfSwKCXsgfSwJCQkJCS8qIE9wdGlvbmFsIHBhcmFtZXRlciBlbnRyeSAqLwoJeyB9CQkJCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwp9OwoKTU9EVUxFX0RFVklDRV9UQUJMRSAodXNiLCBpZF90YWJsZV9jb21iaW5lZCk7CgpzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgZnRkaV9kcml2ZXIgPSB7CgkubmFtZSA9CQkiZnRkaV9zaW8iLAoJLnByb2JlID0JdXNiX3NlcmlhbF9wcm9iZSwKCS5kaXNjb25uZWN0ID0JdXNiX3NlcmlhbF9kaXNjb25uZWN0LAoJLmlkX3RhYmxlID0JaWRfdGFibGVfY29tYmluZWQsCgkubm9fZHluYW1pY19pZCA9CTEsCn07CgpzdGF0aWMgY29uc3QgY2hhciAqZnRkaV9jaGlwX25hbWVbXSA9IHsKCVtTSU9dID0gIlNJTyIsCS8qIHRoZSBzZXJpYWwgcGFydCBvZiBGVDhVMTAwQVggKi8KCVtGVDhVMjMyQU1dID0gIkZUOFUyMzJBTSIsCglbRlQyMzJCTV0gPSAiRlQyMzJCTSIsCglbRlQyMjMyQ10gPSAiRlQyMjMyQyIsCn07CgoKLyogQ29uc3RhbnRzIGZvciByZWFkIHVyYiBhbmQgd3JpdGUgdXJiICovCiNkZWZpbmUgQlVGU1ogNTEyCiNkZWZpbmUgUEtUU1ogNjQKCi8qIHJ4X2ZsYWdzICovCiNkZWZpbmUgVEhST1RUTEVECQkweDAxCiNkZWZpbmUgQUNUVUFMTFlfVEhST1RUTEVECTB4MDIKCnN0cnVjdCBmdGRpX3ByaXZhdGUgewoJZnRkaV9jaGlwX3R5cGVfdCBjaGlwX3R5cGU7CgkJCQkvKiB0eXBlIG9mIHRoZSBkZXZpY2UsIGVpdGhlciBTSU8gb3IgRlQ4VTIzMkFNICovCglpbnQgYmF1ZF9iYXNlOwkJLyogYmF1ZCBiYXNlIGNsb2NrIGZvciBkaXZpc29yIHNldHRpbmcgKi8KCWludCBjdXN0b21fZGl2aXNvcjsJLyogY3VzdG9tX2Rpdmlzb3Iga2x1ZGdlLCB0aGlzIGlzIGZvciBiYXVkX2Jhc2UgKGRpZmZlcmVudCBmcm9tIHdoYXQgZ29lcyB0byB0aGUgY2hpcCEpICovCglfX3UxNiBsYXN0X3NldF9kYXRhX3VyYl92YWx1ZSA7CgkJCQkvKiB0aGUgbGFzdCBkYXRhIHN0YXRlIHNldCAtIG5lZWRlZCBmb3IgZG9pbmcgYSBicmVhayAqLwogICAgICAgIGludCB3cml0ZV9vZmZzZXQ7ICAgICAgIC8qIFRoaXMgaXMgdGhlIG9mZnNldCBpbiB0aGUgdXNiIGRhdGEgYmxvY2sgdG8gd3JpdGUgdGhlIHNlcmlhbCBkYXRhIC0KCQkJCSAqIGl0IGlzIGRpZmZlcmVudCBiZXR3ZWVuIGRldmljZXMKCQkJCSAqLwoJaW50IGZsYWdzOwkJLyogc29tZSBBU1lOQ194eHh4IGZsYWdzIGFyZSBzdXBwb3J0ZWQgKi8KCXVuc2lnbmVkIGxvbmcgbGFzdF9kdHJfcnRzOwkvKiBzYXZlZCBtb2RlbSBjb250cm9sIG91dHB1dHMgKi8KICAgICAgICB3YWl0X3F1ZXVlX2hlYWRfdCBkZWx0YV9tc3Jfd2FpdDsgLyogVXNlZCBmb3IgVElPQ01JV0FJVCAqLwoJY2hhciBwcmV2X3N0YXR1cywgZGlmZl9zdGF0dXM7ICAgICAgICAvKiBVc2VkIGZvciBUSU9DTUlXQUlUICovCglfX3U4IHJ4X2ZsYWdzOwkJLyogcmVjZWl2ZSBzdGF0ZSBmbGFncyAodGhyb3R0bGluZykgKi8KCXNwaW5sb2NrX3QgcnhfbG9jazsJLyogc3BpbmxvY2sgZm9yIHJlY2VpdmUgc3RhdGUgKi8KCXN0cnVjdCB3b3JrX3N0cnVjdCByeF93b3JrOwoJaW50IHJ4X3Byb2Nlc3NlZDsKCXVuc2lnbmVkIGxvbmcgcnhfYnl0ZXM7CgoJX191MTYgaW50ZXJmYWNlOwkvKiBGVDIyMzJDIHBvcnQgaW50ZXJmYWNlICgwIGZvciBGVDIzMi8yNDUpICovCgoJaW50IGZvcmNlX2JhdWQ7CQkvKiBpZiBub24temVybywgZm9yY2UgdGhlIGJhdWQgcmF0ZSB0byB0aGlzIHZhbHVlICovCglpbnQgZm9yY2VfcnRzY3RzOwkvKiBpZiBub24temVybywgZm9yY2UgUlRTLUNUUyB0byBhbHdheXMgYmUgZW5hYmxlZCAqLwoKCXNwaW5sb2NrX3QgdHhfbG9jazsJLyogc3BpbmxvY2sgZm9yIHRyYW5zbWl0IHN0YXRlICovCgl1bnNpZ25lZCBsb25nIHR4X2J5dGVzOwoJdW5zaWduZWQgbG9uZyB0eF9vdXRzdGFuZGluZ19ieXRlczsKCXVuc2lnbmVkIGxvbmcgdHhfb3V0c3RhbmRpbmdfdXJiczsKfTsKCi8qIFVzZWQgZm9yIFRJT0NNSVdBSVQgKi8KI2RlZmluZSBGVERJX1NUQVRVU19CMF9NQVNLCShGVERJX1JTMF9DVFMgfCBGVERJX1JTMF9EU1IgfCBGVERJX1JTMF9SSSB8IEZURElfUlMwX1JMU0QpCiNkZWZpbmUgRlRESV9TVEFUVVNfQjFfTUFTSwkoRlRESV9SU19CSSkKLyogRW5kIFRJT0NNSVdBSVQgKi8KCiNkZWZpbmUgRlRESV9JTVBMX0FTWU5DX0ZMQUdTID0gKCBBU1lOQ19TUERfSEkgfCBBU1lOQ19TUERfVkhJIFwKIEFTWU5DX1NQRF9DVVNUIHwgQVNZTkNfU1BEX1NISSB8IEFTWU5DX1NQRF9XQVJQICkKCi8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yIGEgRlRESSBzZXJpYWwgY29udmVydGVyICovCnN0YXRpYyBpbnQgIGZ0ZGlfc2lvX3Byb2JlCShzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpOwpzdGF0aWMgaW50ICBmdGRpX3Npb19hdHRhY2gJCShzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKTsKc3RhdGljIHZvaWQgZnRkaV9zaHV0ZG93bgkJKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpOwpzdGF0aWMgaW50ICBmdGRpX29wZW4JCQkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApOwpzdGF0aWMgdm9pZCBmdGRpX2Nsb3NlCQkJKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKTsKc3RhdGljIGludCAgZnRkaV93cml0ZQkJCShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCk7CnN0YXRpYyBpbnQgIGZ0ZGlfd3JpdGVfcm9vbQkJKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpOwpzdGF0aWMgaW50ICBmdGRpX2NoYXJzX2luX2J1ZmZlcgkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCk7CnN0YXRpYyB2b2lkIGZ0ZGlfd3JpdGVfYnVsa19jYWxsYmFjawkoc3RydWN0IHVyYiAqdXJiKTsKc3RhdGljIHZvaWQgZnRkaV9yZWFkX2J1bGtfY2FsbGJhY2sJKHN0cnVjdCB1cmIgKnVyYik7CnN0YXRpYyB2b2lkIGZ0ZGlfcHJvY2Vzc19yZWFkCQkodm9pZCAqcGFyYW0pOwpzdGF0aWMgdm9pZCBmdGRpX3NldF90ZXJtaW9zCQkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IHRlcm1pb3MgKiBvbGQpOwpzdGF0aWMgaW50ICBmdGRpX3Rpb2NtZ2V0ICAgICAgICAgICAgICAgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxlKTsKc3RhdGljIGludCAgZnRkaV90aW9jbXNldAkJKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICogZmlsZSwgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKTsKc3RhdGljIGludCAgZnRkaV9pb2N0bAkJCShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqIGZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKc3RhdGljIHZvaWQgZnRkaV9icmVha19jdGwJCShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBpbnQgYnJlYWtfc3RhdGUgKTsKc3RhdGljIHZvaWQgZnRkaV90aHJvdHRsZQkJKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpOwpzdGF0aWMgdm9pZCBmdGRpX3VudGhyb3R0bGUJCShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKCnN0YXRpYyB1bnNpZ25lZCBzaG9ydCBpbnQgZnRkaV8yMzJhbV9iYXVkX2Jhc2VfdG9fZGl2aXNvciAoaW50IGJhdWQsIGludCBiYXNlKTsKc3RhdGljIHVuc2lnbmVkIHNob3J0IGludCBmdGRpXzIzMmFtX2JhdWRfdG9fZGl2aXNvciAoaW50IGJhdWQpOwpzdGF0aWMgX191MzIgZnRkaV8yMzJibV9iYXVkX2Jhc2VfdG9fZGl2aXNvciAoaW50IGJhdWQsIGludCBiYXNlKTsKc3RhdGljIF9fdTMyIGZ0ZGlfMjMyYm1fYmF1ZF90b19kaXZpc29yIChpbnQgYmF1ZCk7CgpzdGF0aWMgc3RydWN0IHVzYl9zZXJpYWxfZHJpdmVyIGZ0ZGlfc2lvX2RldmljZSA9IHsKCS5kcml2ZXIgPSB7CgkJLm93bmVyID0JVEhJU19NT0RVTEUsCgkJLm5hbWUgPQkJImZ0ZGlfc2lvIiwKCX0sCgkuZGVzY3JpcHRpb24gPQkJIkZUREkgVVNCIFNlcmlhbCBEZXZpY2UiLAoJLmlkX3RhYmxlID0JCWlkX3RhYmxlX2NvbWJpbmVkLAoJLm51bV9pbnRlcnJ1cHRfaW4gPQkwLAoJLm51bV9idWxrX2luID0JCTEsCgkubnVtX2J1bGtfb3V0ID0JCTEsCgkubnVtX3BvcnRzID0JCTEsCgkucHJvYmUgPQkJZnRkaV9zaW9fcHJvYmUsCgkub3BlbiA9CQkJZnRkaV9vcGVuLAoJLmNsb3NlID0JCWZ0ZGlfY2xvc2UsCgkudGhyb3R0bGUgPQkJZnRkaV90aHJvdHRsZSwKCS51bnRocm90dGxlID0JCWZ0ZGlfdW50aHJvdHRsZSwKCS53cml0ZSA9CQlmdGRpX3dyaXRlLAoJLndyaXRlX3Jvb20gPQkJZnRkaV93cml0ZV9yb29tLAoJLmNoYXJzX2luX2J1ZmZlciA9CWZ0ZGlfY2hhcnNfaW5fYnVmZmVyLAoJLnJlYWRfYnVsa19jYWxsYmFjayA9CWZ0ZGlfcmVhZF9idWxrX2NhbGxiYWNrLAoJLndyaXRlX2J1bGtfY2FsbGJhY2sgPQlmdGRpX3dyaXRlX2J1bGtfY2FsbGJhY2ssCgkudGlvY21nZXQgPSAgICAgICAgICAgICBmdGRpX3Rpb2NtZ2V0LAoJLnRpb2Ntc2V0ID0gICAgICAgICAgICAgZnRkaV90aW9jbXNldCwKCS5pb2N0bCA9CQlmdGRpX2lvY3RsLAoJLnNldF90ZXJtaW9zID0JCWZ0ZGlfc2V0X3Rlcm1pb3MsCgkuYnJlYWtfY3RsID0JCWZ0ZGlfYnJlYWtfY3RsLAoJLmF0dGFjaCA9CQlmdGRpX3Npb19hdHRhY2gsCgkuc2h1dGRvd24gPQkJZnRkaV9zaHV0ZG93biwKfTsKCgojZGVmaW5lIFdEUl9USU1FT1VUIDUwMDAgLyogZGVmYXVsdCB1cmIgdGltZW91dCAqLwojZGVmaW5lIFdEUl9TSE9SVF9USU1FT1VUIDEwMDAJLyogc2hvcnRlciB1cmIgdGltZW91dCAqLwoKLyogSGlnaCBhbmQgbG93IGFyZSBmb3IgRFRSLCBSVFMgZXRjIGV0YyAqLwojZGVmaW5lIEhJR0ggMQojZGVmaW5lIExPVyAwCgovKiBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgdXJicyB0byBwcmV2ZW50IHVzZXJzcGFjZSBEb1MgZnJvbSBoYXBwZW5pbmcgKi8KI2RlZmluZSBVUkJfVVBQRVJfTElNSVQJNDIKCi8qCiAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBVdGxpdHkgZnVuY3Rpb25zCiAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8KCnN0YXRpYyB1bnNpZ25lZCBzaG9ydCBpbnQgZnRkaV8yMzJhbV9iYXVkX2Jhc2VfdG9fZGl2aXNvcihpbnQgYmF1ZCwgaW50IGJhc2UpCnsKCXVuc2lnbmVkIHNob3J0IGludCBkaXZpc29yOwoJaW50IGRpdmlzb3IzID0gYmFzZSAvIDIgLyBiYXVkOyAvLyBkaXZpc29yIHNoaWZ0ZWQgMyBiaXRzIHRvIHRoZSBsZWZ0CglpZiAoKGRpdmlzb3IzICYgMHg3KSA9PSA3KSBkaXZpc29yMyArKzsgLy8gcm91bmQgeC43LzggdXAgdG8geCsxCglkaXZpc29yID0gZGl2aXNvcjMgPj4gMzsKCWRpdmlzb3IzICY9IDB4NzsKCWlmIChkaXZpc29yMyA9PSAxKSBkaXZpc29yIHw9IDB4YzAwMDsgZWxzZSAvLyAwLjEyNQoJaWYgKGRpdmlzb3IzID49IDQpIGRpdmlzb3IgfD0gMHg0MDAwOyBlbHNlIC8vIDAuNQoJaWYgKGRpdmlzb3IzICE9IDApIGRpdmlzb3IgfD0gMHg4MDAwOyAgICAgIC8vIDAuMjUKCWlmIChkaXZpc29yID09IDEpIGRpdmlzb3IgPSAwOwkvKiBzcGVjaWFsIGNhc2UgZm9yIG1heGltdW0gYmF1ZCByYXRlICovCglyZXR1cm4gZGl2aXNvcjsKfQoKc3RhdGljIHVuc2lnbmVkIHNob3J0IGludCBmdGRpXzIzMmFtX2JhdWRfdG9fZGl2aXNvcihpbnQgYmF1ZCkKewoJIHJldHVybihmdGRpXzIzMmFtX2JhdWRfYmFzZV90b19kaXZpc29yKGJhdWQsIDQ4MDAwMDAwKSk7Cn0KCnN0YXRpYyBfX3UzMiBmdGRpXzIzMmJtX2JhdWRfYmFzZV90b19kaXZpc29yKGludCBiYXVkLCBpbnQgYmFzZSkKewoJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZGl2ZnJhY1s4XSA9IHsgMCwgMywgMiwgNCwgMSwgNSwgNiwgNyB9OwoJX191MzIgZGl2aXNvcjsKCWludCBkaXZpc29yMyA9IGJhc2UgLyAyIC8gYmF1ZDsgLy8gZGl2aXNvciBzaGlmdGVkIDMgYml0cyB0byB0aGUgbGVmdAoJZGl2aXNvciA9IGRpdmlzb3IzID4+IDM7CglkaXZpc29yIHw9IChfX3UzMilkaXZmcmFjW2Rpdmlzb3IzICYgMHg3XSA8PCAxNDsKCS8qIERlYWwgd2l0aCBzcGVjaWFsIGNhc2VzIGZvciBoaWdoZXN0IGJhdWQgcmF0ZXMuICovCglpZiAoZGl2aXNvciA9PSAxKSBkaXZpc29yID0gMDsgZWxzZQkvLyAxLjAKCWlmIChkaXZpc29yID09IDB4NDAwMSkgZGl2aXNvciA9IDE7CS8vIDEuNQoJcmV0dXJuIGRpdmlzb3I7Cn0KCnN0YXRpYyBfX3UzMiBmdGRpXzIzMmJtX2JhdWRfdG9fZGl2aXNvcihpbnQgYmF1ZCkKewoJIHJldHVybihmdGRpXzIzMmJtX2JhdWRfYmFzZV90b19kaXZpc29yKGJhdWQsIDQ4MDAwMDAwKSk7Cn0KCiNkZWZpbmUgc2V0X21jdHJsKHBvcnQsIHNldCkJCXVwZGF0ZV9tY3RybCgocG9ydCksIChzZXQpLCAwKQojZGVmaW5lIGNsZWFyX21jdHJsKHBvcnQsIGNsZWFyKQl1cGRhdGVfbWN0cmwoKHBvcnQpLCAwLCAoY2xlYXIpKQoKc3RhdGljIGludCB1cGRhdGVfbWN0cmwoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQp7CglzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwoJY2hhciAqYnVmOwoJdW5zaWduZWQgdXJiX3ZhbHVlOwoJaW50IHJ2OwoKCWlmICgoKHNldCB8IGNsZWFyKSAmIChUSU9DTV9EVFIgfCBUSU9DTV9SVFMpKSA9PSAwKSB7CgkJZGJnKCIlcyAtIERUUnxSVFMgbm90IGJlaW5nIHNldHxjbGVhcmVkIiwgX19GVU5DVElPTl9fKTsKCQlyZXR1cm4gMDsJLyogbm8gY2hhbmdlICovCgl9CgoJYnVmID0ga21hbGxvYygxLCBHRlBfTk9JTyk7CglpZiAoIWJ1ZikgewoJCXJldHVybiAtRU5PTUVNOwoJfQoKCWNsZWFyICY9IH5zZXQ7CS8qICdzZXQnIHRha2VzIHByZWNlZGVuY2Ugb3ZlciAnY2xlYXInICovCgl1cmJfdmFsdWUgPSAwOwoJaWYgKGNsZWFyICYgVElPQ01fRFRSKQoJCXVyYl92YWx1ZSB8PSBGVERJX1NJT19TRVRfRFRSX0xPVzsKCWlmIChjbGVhciAmIFRJT0NNX1JUUykKCQl1cmJfdmFsdWUgfD0gRlRESV9TSU9fU0VUX1JUU19MT1c7CglpZiAoc2V0ICYgVElPQ01fRFRSKQoJCXVyYl92YWx1ZSB8PSBGVERJX1NJT19TRVRfRFRSX0hJR0g7CglpZiAoc2V0ICYgVElPQ01fUlRTKQoJCXVyYl92YWx1ZSB8PSBGVERJX1NJT19TRVRfUlRTX0hJR0g7CglydiA9IHVzYl9jb250cm9sX21zZyhwb3J0LT5zZXJpYWwtPmRldiwKCQkJICAgICAgIHVzYl9zbmRjdHJscGlwZShwb3J0LT5zZXJpYWwtPmRldiwgMCksCgkJCSAgICAgICBGVERJX1NJT19TRVRfTU9ERU1fQ1RSTF9SRVFVRVNULAoJCQkgICAgICAgRlRESV9TSU9fU0VUX01PREVNX0NUUkxfUkVRVUVTVF9UWVBFLAoJCQkgICAgICAgdXJiX3ZhbHVlLCBwcml2LT5pbnRlcmZhY2UsCgkJCSAgICAgICBidWYsIDAsIFdEUl9USU1FT1VUKTsKCglrZnJlZShidWYpOwoJaWYgKHJ2IDwgMCkgewoJCWVycigiJXMgRXJyb3IgZnJvbSBNT0RFTV9DVFJMIHVyYjogRFRSICVzLCBSVFMgJXMiLAoJCQkJX19GVU5DVElPTl9fLAoJCQkJKHNldCAmIFRJT0NNX0RUUikgPyAiSElHSCIgOgoJCQkJKGNsZWFyICYgVElPQ01fRFRSKSA/ICJMT1ciIDogInVuY2hhbmdlZCIsCgkJCQkoc2V0ICYgVElPQ01fUlRTKSA/ICJISUdIIiA6CgkJCQkoY2xlYXIgJiBUSU9DTV9SVFMpID8gIkxPVyIgOiAidW5jaGFuZ2VkIik7Cgl9IGVsc2UgewoJCWRiZygiJXMgLSBEVFIgJXMsIFJUUyAlcyIsIF9fRlVOQ1RJT05fXywKCQkJCShzZXQgJiBUSU9DTV9EVFIpID8gIkhJR0giIDoKCQkJCShjbGVhciAmIFRJT0NNX0RUUikgPyAiTE9XIiA6ICJ1bmNoYW5nZWQiLAoJCQkJKHNldCAmIFRJT0NNX1JUUykgPyAiSElHSCIgOgoJCQkJKGNsZWFyICYgVElPQ01fUlRTKSA/ICJMT1ciIDogInVuY2hhbmdlZCIpOwoJCXByaXYtPmxhc3RfZHRyX3J0cyA9IChwcml2LT5sYXN0X2R0cl9ydHMgJiB+Y2xlYXIpIHwgc2V0OwoJfQoJcmV0dXJuIHJ2Owp9CgoKc3RhdGljIF9fdTMyIGdldF9mdGRpX2Rpdmlzb3Ioc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqIHBvcnQpOwoKCnN0YXRpYyBpbnQgY2hhbmdlX3NwZWVkKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCnsKCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CgljaGFyICpidWY7CiAgICAgICAgX191MTYgdXJiX3ZhbHVlOwoJX191MTYgdXJiX2luZGV4OwoJX191MzIgdXJiX2luZGV4X3ZhbHVlOwoJaW50IHJ2OwoKCWJ1ZiA9IGttYWxsb2MoMSwgR0ZQX05PSU8pOwoJaWYgKCFidWYpCgkJcmV0dXJuIC1FTk9NRU07CgoJdXJiX2luZGV4X3ZhbHVlID0gZ2V0X2Z0ZGlfZGl2aXNvcihwb3J0KTsKCXVyYl92YWx1ZSA9IChfX3UxNil1cmJfaW5kZXhfdmFsdWU7Cgl1cmJfaW5kZXggPSAoX191MTYpKHVyYl9pbmRleF92YWx1ZSA+PiAxNik7CglpZiAocHJpdi0+aW50ZXJmYWNlKSB7CS8qIEZUMjIzMkMgKi8KCQl1cmJfaW5kZXggPSAoX191MTYpKCh1cmJfaW5kZXggPDwgOCkgfCBwcml2LT5pbnRlcmZhY2UpOwoJfQoKCXJ2ID0gdXNiX2NvbnRyb2xfbXNnKHBvcnQtPnNlcmlhbC0+ZGV2LAoJCQkgICAgdXNiX3NuZGN0cmxwaXBlKHBvcnQtPnNlcmlhbC0+ZGV2LCAwKSwKCQkJICAgIEZURElfU0lPX1NFVF9CQVVEUkFURV9SRVFVRVNULAoJCQkgICAgRlRESV9TSU9fU0VUX0JBVURSQVRFX1JFUVVFU1RfVFlQRSwKCQkJICAgIHVyYl92YWx1ZSwgdXJiX2luZGV4LAoJCQkgICAgYnVmLCAwLCBXRFJfU0hPUlRfVElNRU9VVCk7CgoJa2ZyZWUoYnVmKTsKCXJldHVybiBydjsKfQoKCnN0YXRpYyBfX3UzMiBnZXRfZnRkaV9kaXZpc29yKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKiBwb3J0KQp7IC8qIGdldF9mdGRpX2Rpdmlzb3IgKi8KCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CglfX3UzMiBkaXZfdmFsdWUgPSAwOwoJaW50IGRpdl9va2F5ID0gMTsKCWludCBiYXVkOwoKCS8qCgkgKiBUaGUgbG9naWMgaW52b2x2ZWQgaW4gc2V0dGluZyB0aGUgYmF1ZHJhdGUgY2FuIGJlIGNsZWFubHkgc3BsaXQgaW4gMyBzdGVwcy4KCSAqIE9idGFpbmluZyB0aGUgYWN0dWFsIGJhdWQgcmF0ZSBpcyBhIGxpdHRsZSB0cmlja3kgc2luY2UgdW5peCB0cmFkaXRpb25hbGx5CgkgKiBzb21laG93IGlnbm9yZWQgdGhlIHBvc3NpYmlsaXR5IHRvIHNldCBub24tc3RhbmRhcmQgYmF1ZCByYXRlcy4KCSAqIDEuIFN0YW5kYXJkIGJhdWQgcmF0ZXMgYXJlIHNldCBpbiB0dHktPnRlcm1pb3MtPmNfY2ZsYWcKCSAqIDIuIElmIHRoZXNlIGFyZSBub3QgZW5vdWdoLCB5b3UgY2FuIHNldCBhbnkgc3BlZWQgdXNpbmcgYWx0X3NwZWVkIGFzIGZvbGxvd3M6CgkgKiAgICAtIHNldCB0dHktPnRlcm1pb3MtPmNfY2ZsYWcgc3BlZWQgdG8gQjM4NDAwCgkgKiAgICAtIHNldCB5b3VyIHJlYWwgc3BlZWQgaW4gdHR5LT5hbHRfc3BlZWQ7IGl0IGdldHMgaWdub3JlZCB3aGVuCgkgKiAgICAgIGFsdF9zcGVlZD09MCwgKG9yKQoJICogICAgLSBjYWxsIFRJT0NTU0VSSUFMIGlvY3RsIHdpdGggKHN0cnVjdCBzZXJpYWxfc3RydWN0KSBzZXQgYXMgZm9sbG93czoKCSAqICAgICAgZmxhZ3MgJiBBU1lOQ19TUERfTUFTSyA9PSBBU1lOQ19TUERfW0hJLCBWSEksIFNISSwgV0FSUF0sIHRoaXMganVzdAoJICogICAgICBzZXRzIGFsdF9zcGVlZCB0byAoSEk6IDU3NjAwLCBWSEk6IDExNTIwMCwgU0hJOiAyMzA0MDAsIFdBUlA6IDQ2MDgwMCkKCSAqICoqIFN0ZXBzIDEsIDIgYXJlIGRvbmUgY291cnRlc3kgb2YgdHR5X2dldF9iYXVkX3JhdGUKCSAqIDMuIFlvdSBjYW4gYWxzbyBzZXQgYmF1ZCByYXRlIGJ5IHNldHRpbmcgY3VzdG9tIGRpdmlzb3IgYXMgZm9sbG93cwoJICogICAgLSBzZXQgdHR5LT50ZXJtaW9zLT5jX2NmbGFnIHNwZWVkIHRvIEIzODQwMAoJICogICAgLSBjYWxsIFRJT0NTU0VSSUFMIGlvY3RsIHdpdGggKHN0cnVjdCBzZXJpYWxfc3RydWN0KSBzZXQgYXMgZm9sbG93czoKCSAqICAgICAgbyBmbGFncyAmIEFTWU5DX1NQRF9NQVNLID09IEFTWU5DX1NQRF9DVVNUCgkgKiAgICAgIG8gY3VzdG9tX2Rpdmlzb3Igc2V0IHRvIGJhdWRfYmFzZSAvIHlvdXJfbmV3X2JhdWRyYXRlCgkgKiAqKiBTdGVwIDMgaXMgZG9uZSBjb3VydGVzeSBvZiBjb2RlIGJvcnJvd2VkIGZyb20gc2VyaWFsLmMgLSBJIHNob3VsZCByZWFsbHkKCSAqICAgIHNwZW5kIHNvbWUgdGltZSBhbmQgc2VwYXJhdGUrbW92ZSB0aGlzIGNvbW1vbiBjb2RlIHRvIHNlcmlhbC5jLCBpdCBpcwoJICogICAgcmVwbGljYXRlZCBpbiBuZWFybHkgZXZlcnkgc2VyaWFsIGRyaXZlciB5b3Ugc2VlLgoJICovCgoJLyogMS4gR2V0IHRoZSBiYXVkIHJhdGUgZnJvbSB0aGUgdHR5IHNldHRpbmdzLCB0aGlzIG9ic2VydmVzIGFsdF9zcGVlZCBoYWNrICovCgoJYmF1ZCA9IHR0eV9nZXRfYmF1ZF9yYXRlKHBvcnQtPnR0eSk7CglkYmcoIiVzIC0gdHR5X2dldF9iYXVkX3JhdGUgcmVwb3J0cyBzcGVlZCAlZCIsIF9fRlVOQ1RJT05fXywgYmF1ZCk7CgoJLyogMi4gT2JzZXJ2ZSBhc3luYy1jb21wYXRpYmxlIGN1c3RvbV9kaXZpc29yIGhhY2ssIHVwZGF0ZSBiYXVkcmF0ZSBpZiBuZWVkZWQgKi8KCglpZiAoYmF1ZCA9PSAzODQwMCAmJgoJICAgICgocHJpdi0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX0NVU1QpICYmCgkgICAgIChwcml2LT5jdXN0b21fZGl2aXNvcikpIHsKCQliYXVkID0gcHJpdi0+YmF1ZF9iYXNlIC8gcHJpdi0+Y3VzdG9tX2Rpdmlzb3I7CgkJZGJnKCIlcyAtIGN1c3RvbSBkaXZpc29yICVkIHNldHMgYmF1ZCByYXRlIHRvICVkIiwgX19GVU5DVElPTl9fLCBwcml2LT5jdXN0b21fZGl2aXNvciwgYmF1ZCk7Cgl9CgoJLyogMy4gQ29udmVydCBiYXVkcmF0ZSB0byBkZXZpY2Utc3BlY2lmaWMgZGl2aXNvciAqLwoKCWlmICghYmF1ZCkgYmF1ZCA9IDk2MDA7Cglzd2l0Y2gocHJpdi0+Y2hpcF90eXBlKSB7CgljYXNlIFNJTzogLyogU0lPIGNoaXAgKi8KCQlzd2l0Y2goYmF1ZCkgewoJCWNhc2UgMzAwOiBkaXZfdmFsdWUgPSBmdGRpX3Npb19iMzAwOyBicmVhazsKCQljYXNlIDYwMDogZGl2X3ZhbHVlID0gZnRkaV9zaW9fYjYwMDsgYnJlYWs7CgkJY2FzZSAxMjAwOiBkaXZfdmFsdWUgPSBmdGRpX3Npb19iMTIwMDsgYnJlYWs7CgkJY2FzZSAyNDAwOiBkaXZfdmFsdWUgPSBmdGRpX3Npb19iMjQwMDsgYnJlYWs7CgkJY2FzZSA0ODAwOiBkaXZfdmFsdWUgPSBmdGRpX3Npb19iNDgwMDsgYnJlYWs7CgkJY2FzZSA5NjAwOiBkaXZfdmFsdWUgPSBmdGRpX3Npb19iOTYwMDsgYnJlYWs7CgkJY2FzZSAxOTIwMDogZGl2X3ZhbHVlID0gZnRkaV9zaW9fYjE5MjAwOyBicmVhazsKCQljYXNlIDM4NDAwOiBkaXZfdmFsdWUgPSBmdGRpX3Npb19iMzg0MDA7IGJyZWFrOwoJCWNhc2UgNTc2MDA6IGRpdl92YWx1ZSA9IGZ0ZGlfc2lvX2I1NzYwMDsgIGJyZWFrOwoJCWNhc2UgMTE1MjAwOiBkaXZfdmFsdWUgPSBmdGRpX3Npb19iMTE1MjAwOyBicmVhazsKCQl9IC8qIGJhdWQgKi8KCQlpZiAoZGl2X3ZhbHVlID09IDApIHsKCQkJZGJnKCIlcyAtIEJhdWRyYXRlICglZCkgcmVxdWVzdGVkIGlzIG5vdCBzdXBwb3J0ZWQiLCBfX0ZVTkNUSU9OX18sICBiYXVkKTsKCQkJZGl2X3ZhbHVlID0gZnRkaV9zaW9fYjk2MDA7CgkJCWRpdl9va2F5ID0gMDsKCQl9CgkJYnJlYWs7CgljYXNlIEZUOFUyMzJBTTogLyogOFUyMzJBTSBjaGlwICovCgkJaWYgKGJhdWQgPD0gMzAwMDAwMCkgewoJCQlkaXZfdmFsdWUgPSBmdGRpXzIzMmFtX2JhdWRfdG9fZGl2aXNvcihiYXVkKTsKCQl9IGVsc2UgewoJICAgICAgICAgICAgICAgIGRiZygiJXMgLSBCYXVkIHJhdGUgdG9vIGhpZ2ghIiwgX19GVU5DVElPTl9fKTsKCQkJZGl2X3ZhbHVlID0gZnRkaV8yMzJhbV9iYXVkX3RvX2Rpdmlzb3IoOTYwMCk7CgkJCWRpdl9va2F5ID0gMDsKCQl9CgkJYnJlYWs7CgljYXNlIEZUMjMyQk06IC8qIEZUMjMyQk0gY2hpcCAqLwoJY2FzZSBGVDIyMzJDOiAvKiBGVDIyMzJDIGNoaXAgKi8KCQlpZiAoYmF1ZCA8PSAzMDAwMDAwKSB7CgkJCWRpdl92YWx1ZSA9IGZ0ZGlfMjMyYm1fYmF1ZF90b19kaXZpc29yKGJhdWQpOwoJCX0gZWxzZSB7CgkgICAgICAgICAgICAgICAgZGJnKCIlcyAtIEJhdWQgcmF0ZSB0b28gaGlnaCEiLCBfX0ZVTkNUSU9OX18pOwoJCQlkaXZfdmFsdWUgPSBmdGRpXzIzMmJtX2JhdWRfdG9fZGl2aXNvcig5NjAwKTsKCQkJZGl2X29rYXkgPSAwOwoJCX0KCQlicmVhazsKCX0gLyogcHJpdi0+Y2hpcF90eXBlICovCgoJaWYgKGRpdl9va2F5KSB7CgkJZGJnKCIlcyAtIEJhdWQgcmF0ZSBzZXQgdG8gJWQgKGRpdmlzb3IgMHglbFgpIG9uIGNoaXAgJXMiLAoJCQlfX0ZVTkNUSU9OX18sIGJhdWQsICh1bnNpZ25lZCBsb25nKWRpdl92YWx1ZSwKCQkJZnRkaV9jaGlwX25hbWVbcHJpdi0+Y2hpcF90eXBlXSk7Cgl9CgoJcmV0dXJuKGRpdl92YWx1ZSk7Cn0KCgpzdGF0aWMgaW50IGdldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICogcG9ydCwgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICogcmV0aW5mbykKewoJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKCXN0cnVjdCBzZXJpYWxfc3RydWN0IHRtcDsKCglpZiAoIXJldGluZm8pCgkJcmV0dXJuIC1FRkFVTFQ7CgltZW1zZXQoJnRtcCwgMCwgc2l6ZW9mKHRtcCkpOwoJdG1wLmZsYWdzID0gcHJpdi0+ZmxhZ3M7Cgl0bXAuYmF1ZF9iYXNlID0gcHJpdi0+YmF1ZF9iYXNlOwoJdG1wLmN1c3RvbV9kaXZpc29yID0gcHJpdi0+Y3VzdG9tX2Rpdmlzb3I7CglpZiAoY29weV90b191c2VyKHJldGluZm8sICZ0bXAsIHNpemVvZigqcmV0aW5mbykpKQoJCXJldHVybiAtRUZBVUxUOwoJcmV0dXJuIDA7Cn0gLyogZ2V0X3NlcmlhbF9pbmZvICovCgoKc3RhdGljIGludCBzZXRfc2VyaWFsX2luZm8oc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqIHBvcnQsIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqIG5ld2luZm8pCnsgLyogc2V0X3NlcmlhbF9pbmZvICovCglzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwoJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgbmV3X3NlcmlhbDsKCXN0cnVjdCBmdGRpX3ByaXZhdGUgb2xkX3ByaXY7CgoJaWYgKGNvcHlfZnJvbV91c2VyKCZuZXdfc2VyaWFsLCBuZXdpbmZvLCBzaXplb2YobmV3X3NlcmlhbCkpKQoJCXJldHVybiAtRUZBVUxUOwoJb2xkX3ByaXYgPSAqIHByaXY7CgoJLyogRG8gZXJyb3IgY2hlY2tpbmcgYW5kIHBlcm1pc3Npb24gY2hlY2tpbmcgKi8KCglpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKCQlpZiAoKChuZXdfc2VyaWFsLmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSAhPQoJCSAgICAgKHByaXYtPmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSkpCgkJCXJldHVybiAtRVBFUk07CgkJcHJpdi0+ZmxhZ3MgPSAoKHByaXYtPmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSB8CgkJCSAgICAgICAobmV3X3NlcmlhbC5mbGFncyAmIEFTWU5DX1VTUl9NQVNLKSk7CgkJcHJpdi0+Y3VzdG9tX2Rpdmlzb3IgPSBuZXdfc2VyaWFsLmN1c3RvbV9kaXZpc29yOwoJCWdvdG8gY2hlY2tfYW5kX2V4aXQ7Cgl9CgoJaWYgKChuZXdfc2VyaWFsLmJhdWRfYmFzZSAhPSBwcml2LT5iYXVkX2Jhc2UpICYmCgkgICAgKG5ld19zZXJpYWwuYmF1ZF9iYXNlIDwgOTYwMCkpCgkJcmV0dXJuIC1FSU5WQUw7CgoJLyogTWFrZSB0aGUgY2hhbmdlcyAtIHRoZXNlIGFyZSBwcml2aWxlZ2VkIGNoYW5nZXMhICovCgoJcHJpdi0+ZmxhZ3MgPSAoKHByaXYtPmZsYWdzICYgfkFTWU5DX0ZMQUdTKSB8CgkgICAgICAgICAgICAgICAobmV3X3NlcmlhbC5mbGFncyAmIEFTWU5DX0ZMQUdTKSk7Cglwcml2LT5jdXN0b21fZGl2aXNvciA9IG5ld19zZXJpYWwuY3VzdG9tX2Rpdmlzb3I7CgoJcG9ydC0+dHR5LT5sb3dfbGF0ZW5jeSA9IChwcml2LT5mbGFncyAmIEFTWU5DX0xPV19MQVRFTkNZKSA/IDEgOiAwOwoKY2hlY2tfYW5kX2V4aXQ6CglpZiAoKG9sZF9wcml2LmZsYWdzICYgQVNZTkNfU1BEX01BU0spICE9CgkgICAgIChwcml2LT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSkgewoJCWlmICgocHJpdi0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX0hJKQoJCQlwb3J0LT50dHktPmFsdF9zcGVlZCA9IDU3NjAwOwoJCWVsc2UgaWYgKChwcml2LT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfVkhJKQoJCQlwb3J0LT50dHktPmFsdF9zcGVlZCA9IDExNTIwMDsKCQllbHNlIGlmICgocHJpdi0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1NISSkKCQkJcG9ydC0+dHR5LT5hbHRfc3BlZWQgPSAyMzA0MDA7CgkJZWxzZSBpZiAoKHByaXYtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9XQVJQKQoJCQlwb3J0LT50dHktPmFsdF9zcGVlZCA9IDQ2MDgwMDsKCQllbHNlCgkJCXBvcnQtPnR0eS0+YWx0X3NwZWVkID0gMDsKCX0KCWlmICgoKG9sZF9wcml2LmZsYWdzICYgQVNZTkNfU1BEX01BU0spICE9CgkgICAgIChwcml2LT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSkgfHwKCSAgICAoKChwcml2LT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfQ1VTVCkgJiYKCSAgICAgKG9sZF9wcml2LmN1c3RvbV9kaXZpc29yICE9IHByaXYtPmN1c3RvbV9kaXZpc29yKSkpIHsKCQljaGFuZ2Vfc3BlZWQocG9ydCk7Cgl9CgoJcmV0dXJuICgwKTsKCn0gLyogc2V0X3NlcmlhbF9pbmZvICovCgoKLyogRGV0ZXJtaW5lIHR5cGUgb2YgRlRESSBjaGlwIGJhc2VkIG9uIFVTQiBjb25maWcgYW5kIGRlc2NyaXB0b3IuICovCnN0YXRpYyB2b2lkIGZ0ZGlfZGV0ZXJtaW5lX3R5cGUoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKewoJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CglzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHNlcmlhbC0+ZGV2OwoJdW5zaWduZWQgdmVyc2lvbjsKCXVuc2lnbmVkIGludGVyZmFjZXM7CgoJLyogQXNzdW1lIGl0IGlzIG5vdCB0aGUgb3JpZ2luYWwgU0lPIGRldmljZSBmb3Igbm93LiAqLwoJcHJpdi0+YmF1ZF9iYXNlID0gNDgwMDAwMDAgLyAyOwoJcHJpdi0+d3JpdGVfb2Zmc2V0ID0gMDsKCgl2ZXJzaW9uID0gbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5iY2REZXZpY2UpOwoJaW50ZXJmYWNlcyA9IHVkZXYtPmFjdGNvbmZpZy0+ZGVzYy5iTnVtSW50ZXJmYWNlczsKCWRiZygiJXM6IGJjZERldmljZSA9IDB4JXgsIGJOdW1JbnRlcmZhY2VzID0gJXUiLCBfX0ZVTkNUSU9OX18sCgkJCXZlcnNpb24sIGludGVyZmFjZXMpOwoJaWYgKGludGVyZmFjZXMgPiAxKSB7CgkJaW50IGludGVyOwoKCQkvKiBNdWx0aXBsZSBpbnRlcmZhY2VzLiAgQXNzdW1lIEZUMjIzMkMuICovCgkJcHJpdi0+Y2hpcF90eXBlID0gRlQyMjMyQzsKCQkvKiBEZXRlcm1pbmUgaW50ZXJmYWNlIGNvZGUuICovCgkJaW50ZXIgPSBzZXJpYWwtPmludGVyZmFjZS0+YWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyOwoJCWlmIChpbnRlciA9PSAwKSB7CgkJCXByaXYtPmludGVyZmFjZSA9IFBJVF9TSU9BOwoJCX0gZWxzZSB7CgkJCXByaXYtPmludGVyZmFjZSA9IFBJVF9TSU9COwoJCX0KCQkvKiBCTS10eXBlIGRldmljZXMgaGF2ZSBhIGJ1ZyB3aGVyZSBiY2REZXZpY2UgZ2V0cyBzZXQKCQkgKiB0byAweDIwMCB3aGVuIGlTZXJpYWxOdW1iZXIgaXMgMC4gICovCgkJaWYgKHZlcnNpb24gPCAweDUwMCkgewoJCQlkYmcoIiVzOiBzb21ldGhpbmcgZmlzaHkgLSBiY2REZXZpY2UgdG9vIGxvdyBmb3IgbXVsdGktaW50ZXJmYWNlIGRldmljZSIsCgkJCQkJX19GVU5DVElPTl9fKTsKCQl9Cgl9IGVsc2UgaWYgKHZlcnNpb24gPCAweDIwMCkgewoJCS8qIE9sZCBkZXZpY2UuICBBc3N1bWUgaXRzIHRoZSBvcmlnaW5hbCBTSU8uICovCgkJcHJpdi0+Y2hpcF90eXBlID0gU0lPOwoJCXByaXYtPmJhdWRfYmFzZSA9IDEyMDAwMDAwIC8gMTY7CgkJcHJpdi0+d3JpdGVfb2Zmc2V0ID0gMTsKCX0gZWxzZSBpZiAodmVyc2lvbiA8IDB4NDAwKSB7CgkJLyogQXNzdW1lIGl0cyBhbiBGVDhVMjMyQU0gKG9yIEZUOFUyNDVBTSkgKi8KCQkvKiAoSXQgbWlnaHQgYmUgYSBCTSBiZWNhdXNlIG9mIHRoZSBpU2VyaWFsTnVtYmVyIGJ1ZywKCQkgKiBidXQgaXQgd2lsbCBzdGlsbCB3b3JrIGFzIGFuIEFNIGRldmljZS4pICovCgkJcHJpdi0+Y2hpcF90eXBlID0gRlQ4VTIzMkFNOwoJfSBlbHNlIHsKCQkvKiBBc3N1bWUgaXRzIGFuIEZUMjMyQk0gKG9yIEZUMjQ1Qk0pICovCgkJcHJpdi0+Y2hpcF90eXBlID0gRlQyMzJCTTsKCX0KCWluZm8oIkRldGVjdGVkICVzIiwgZnRkaV9jaGlwX25hbWVbcHJpdi0+Y2hpcF90eXBlXSk7Cn0KCgovKgogKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU3lzZnMgQXR0cmlidXRlCiAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8KCnN0YXRpYyBzc2l6ZV90IHNob3dfbGF0ZW5jeV90aW1lcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCnsKCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB0b191c2Jfc2VyaWFsX3BvcnQoZGV2KTsKCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CglzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKCXVuc2lnbmVkIHNob3J0IGxhdGVuY3kgPSAwOwoJaW50IHJ2ID0gMDsKCgl1ZGV2ID0gdG9fdXNiX2RldmljZShkZXYpOwoKCWRiZygiJXMiLF9fRlVOQ1RJT05fXyk7CgoJcnYgPSB1c2JfY29udHJvbF9tc2codWRldiwKCQkJICAgICB1c2JfcmN2Y3RybHBpcGUodWRldiwgMCksCgkJCSAgICAgRlRESV9TSU9fR0VUX0xBVEVOQ1lfVElNRVJfUkVRVUVTVCwKCQkJICAgICBGVERJX1NJT19HRVRfTEFURU5DWV9USU1FUl9SRVFVRVNUX1RZUEUsCgkJCSAgICAgMCwgcHJpdi0+aW50ZXJmYWNlLAoJCQkgICAgIChjaGFyKikgJmxhdGVuY3ksIDEsIFdEUl9USU1FT1VUKTsKCglpZiAocnYgPCAwKSB7CgkJZGV2X2VycihkZXYsICJVbmFibGUgdG8gcmVhZCBsYXRlbmN5IHRpbWVyOiAlaSIsIHJ2KTsKCQlyZXR1cm4gLUVJTzsKCX0KCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVpXG4iLCBsYXRlbmN5KTsKfQoKLyogV3JpdGUgYSBuZXcgdmFsdWUgb2YgdGhlIGxhdGVuY3kgdGltZXIsIGluIHVuaXRzIG9mIG1pbGxpc2Vjb25kcy4gKi8Kc3RhdGljIHNzaXplX3Qgc3RvcmVfbGF0ZW5jeV90aW1lcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICp2YWxidWYsCgkJCQkgICBzaXplX3QgY291bnQpCnsKCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB0b191c2Jfc2VyaWFsX3BvcnQoZGV2KTsKCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CglzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKCWNoYXIgYnVmWzFdOwoJaW50IHYgPSBzaW1wbGVfc3RydG91bCh2YWxidWYsIE5VTEwsIDEwKTsKCWludCBydiA9IDA7CgoJdWRldiA9IHRvX3VzYl9kZXZpY2UoZGV2KTsKCglkYmcoIiVzOiBzZXR0aW5nIGxhdGVuY3kgdGltZXIgPSAlaSIsIF9fRlVOQ1RJT05fXywgdik7CgoJcnYgPSB1c2JfY29udHJvbF9tc2codWRldiwKCQkJICAgICB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksCgkJCSAgICAgRlRESV9TSU9fU0VUX0xBVEVOQ1lfVElNRVJfUkVRVUVTVCwKCQkJICAgICBGVERJX1NJT19TRVRfTEFURU5DWV9USU1FUl9SRVFVRVNUX1RZUEUsCgkJCSAgICAgdiwgcHJpdi0+aW50ZXJmYWNlLAoJCQkgICAgIGJ1ZiwgMCwgV0RSX1RJTUVPVVQpOwoKCWlmIChydiA8IDApIHsKCQlkZXZfZXJyKGRldiwgIlVuYWJsZSB0byB3cml0ZSBsYXRlbmN5IHRpbWVyOiAlaSIsIHJ2KTsKCQlyZXR1cm4gLUVJTzsKCX0KCglyZXR1cm4gY291bnQ7Cn0KCi8qIFdyaXRlIGFuIGV2ZW50IGNoYXJhY3RlciBkaXJlY3RseSB0byB0aGUgRlRESSByZWdpc3Rlci4gIFRoZSBBU0NJSQogICB2YWx1ZSBpcyBpbiB0aGUgbG93IDggYml0cywgd2l0aCB0aGUgZW5hYmxlIGJpdCBpbiB0aGUgOXRoIGJpdC4gKi8Kc3RhdGljIHNzaXplX3Qgc3RvcmVfZXZlbnRfY2hhcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICp2YWxidWYsCgkJCQlzaXplX3QgY291bnQpCnsKCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB0b191c2Jfc2VyaWFsX3BvcnQoZGV2KTsKCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CglzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKCWNoYXIgYnVmWzFdOwoJaW50IHYgPSBzaW1wbGVfc3RydG91bCh2YWxidWYsIE5VTEwsIDEwKTsKCWludCBydiA9IDA7CgoJdWRldiA9IHRvX3VzYl9kZXZpY2UoZGV2KTsKCglkYmcoIiVzOiBzZXR0aW5nIGV2ZW50IGNoYXIgPSAlaSIsIF9fRlVOQ1RJT05fXywgdik7CgoJcnYgPSB1c2JfY29udHJvbF9tc2codWRldiwKCQkJICAgICB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksCgkJCSAgICAgRlRESV9TSU9fU0VUX0VWRU5UX0NIQVJfUkVRVUVTVCwKCQkJICAgICBGVERJX1NJT19TRVRfRVZFTlRfQ0hBUl9SRVFVRVNUX1RZUEUsCgkJCSAgICAgdiwgcHJpdi0+aW50ZXJmYWNlLAoJCQkgICAgIGJ1ZiwgMCwgV0RSX1RJTUVPVVQpOwoKCWlmIChydiA8IDApIHsKCQlkYmcoIlVuYWJsZSB0byB3cml0ZSBldmVudCBjaGFyYWN0ZXI6ICVpIiwgcnYpOwoJCXJldHVybiAtRUlPOwoJfQoKCXJldHVybiBjb3VudDsKfQoKc3RhdGljIERFVklDRV9BVFRSKGxhdGVuY3lfdGltZXIsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2xhdGVuY3lfdGltZXIsIHN0b3JlX2xhdGVuY3lfdGltZXIpOwpzdGF0aWMgREVWSUNFX0FUVFIoZXZlbnRfY2hhciwgU19JV1VTUiwgTlVMTCwgc3RvcmVfZXZlbnRfY2hhcik7CgpzdGF0aWMgaW50IGNyZWF0ZV9zeXNmc19hdHRycyhzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQp7CglzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2OwoJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CglpbnQgcmV0dmFsID0gMDsKCglkYmcoIiVzIixfX0ZVTkNUSU9OX18pOwoKCXByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEoc2VyaWFsLT5wb3J0WzBdKTsKCXVkZXYgPSBzZXJpYWwtPmRldjsKCgkvKiBYWFggSSd2ZSBubyBpZGVhIGlmIHRoZSBvcmlnaW5hbCBTSU8gc3VwcG9ydHMgdGhlIGV2ZW50X2NoYXIKCSAqIHN5c2ZzIHBhcmFtZXRlciwgc28gSSdtIHBsYXlpbmcgaXQgc2FmZS4gICovCglpZiAocHJpdi0+Y2hpcF90eXBlICE9IFNJTykgewoJCWRiZygic3lzZnMgYXR0cmlidXRlcyBmb3IgJXMiLCBmdGRpX2NoaXBfbmFtZVtwcml2LT5jaGlwX3R5cGVdKTsKCQlyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnVkZXYtPmRldiwgJmRldl9hdHRyX2V2ZW50X2NoYXIpOwoJCWlmICgoIXJldHZhbCkgJiYKCQkgICAgKHByaXYtPmNoaXBfdHlwZSA9PSBGVDIzMkJNIHx8IHByaXYtPmNoaXBfdHlwZSA9PSBGVDIyMzJDKSkgewoJCQlyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnVkZXYtPmRldiwKCQkJCQkJICAgICZkZXZfYXR0cl9sYXRlbmN5X3RpbWVyKTsKCQl9Cgl9CglyZXR1cm4gcmV0dmFsOwp9CgpzdGF0aWMgdm9pZCByZW1vdmVfc3lzZnNfYXR0cnMoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKewoJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdjsKCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OwoKCWRiZygiJXMiLF9fRlVOQ1RJT05fXyk7CgoJcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbMF0pOwoJdWRldiA9IHNlcmlhbC0+ZGV2OwoKCS8qIFhYWCBzZWUgY3JlYXRlX3N5c2ZzX2F0dHJzICovCglpZiAocHJpdi0+Y2hpcF90eXBlICE9IFNJTykgewoJCWRldmljZV9yZW1vdmVfZmlsZSgmdWRldi0+ZGV2LCAmZGV2X2F0dHJfZXZlbnRfY2hhcik7CgkJaWYgKHByaXYtPmNoaXBfdHlwZSA9PSBGVDIzMkJNIHx8IHByaXYtPmNoaXBfdHlwZSA9PSBGVDIyMzJDKSB7CgkJCWRldmljZV9yZW1vdmVfZmlsZSgmdWRldi0+ZGV2LCAmZGV2X2F0dHJfbGF0ZW5jeV90aW1lcik7CgkJfQoJfQoKfQoKLyoKICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEZUREkgZHJpdmVyIHNwZWNpZmljIGZ1bmN0aW9ucwogKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCgovKiBQcm9iZSBmdW5jdGlvbiB0byBjaGVjayBmb3Igc3BlY2lhbCBkZXZpY2VzICovCnN0YXRpYyBpbnQgZnRkaV9zaW9fcHJvYmUgKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKewoJdXNiX3NldF9zZXJpYWxfZGF0YShzZXJpYWwsICh2b2lkICopaWQtPmRyaXZlcl9pbmZvKTsKCglyZXR1cm4gKDApOwp9CgovKiBhdHRhY2ggc3Vicm91dGluZSAqLwpzdGF0aWMgaW50IGZ0ZGlfc2lvX2F0dGFjaCAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKewoJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHNlcmlhbC0+cG9ydFswXTsKCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXY7CglzdHJ1Y3QgZnRkaV9zaW9fcXVpcmsgKnF1aXJrOwoJaW50IHJldHZhbDsKCglkYmcoIiVzIixfX0ZVTkNUSU9OX18pOwoKCXByaXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZnRkaV9wcml2YXRlKSwgR0ZQX0tFUk5FTCk7CglpZiAoIXByaXYpewoJCWVycigiJXMtIGttYWxsb2MoJVpkKSBmYWlsZWQuIiwgX19GVU5DVElPTl9fLCBzaXplb2Yoc3RydWN0IGZ0ZGlfcHJpdmF0ZSkpOwoJCXJldHVybiAtRU5PTUVNOwoJfQoKCXNwaW5fbG9ja19pbml0KCZwcml2LT5yeF9sb2NrKTsKCXNwaW5fbG9ja19pbml0KCZwcml2LT50eF9sb2NrKTsKICAgICAgICBpbml0X3dhaXRxdWV1ZV9oZWFkKCZwcml2LT5kZWx0YV9tc3Jfd2FpdCk7CgkvKiBUaGlzIHdpbGwgcHVzaCB0aGUgY2hhcmFjdGVycyB0aHJvdWdoIGltbWVkaWF0ZWx5IHJhdGhlcgoJICAgdGhhbiBxdWV1ZSBhIHRhc2sgdG8gZGVsaXZlciB0aGVtICovCglwcml2LT5mbGFncyA9IEFTWU5DX0xPV19MQVRFTkNZOwoKCS8qIEluY3JlYXNlIHRoZSBzaXplIG9mIHJlYWQgYnVmZmVycyAqLwoJa2ZyZWUocG9ydC0+YnVsa19pbl9idWZmZXIpOwoJcG9ydC0+YnVsa19pbl9idWZmZXIgPSBrbWFsbG9jIChCVUZTWiwgR0ZQX0tFUk5FTCk7CglpZiAoIXBvcnQtPmJ1bGtfaW5fYnVmZmVyKSB7CgkJa2ZyZWUgKHByaXYpOwoJCXJldHVybiAtRU5PTUVNOwoJfQoJaWYgKHBvcnQtPnJlYWRfdXJiKSB7CgkJcG9ydC0+cmVhZF91cmItPnRyYW5zZmVyX2J1ZmZlciA9IHBvcnQtPmJ1bGtfaW5fYnVmZmVyOwoJCXBvcnQtPnJlYWRfdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gQlVGU1o7Cgl9CgoJSU5JVF9XT1JLKCZwcml2LT5yeF93b3JrLCBmdGRpX3Byb2Nlc3NfcmVhZCwgcG9ydCk7CgoJLyogRnJlZSBwb3J0J3MgZXhpc3Rpbmcgd3JpdGUgdXJiIGFuZCB0cmFuc2ZlciBidWZmZXIuICovCglpZiAocG9ydC0+d3JpdGVfdXJiKSB7CgkJdXNiX2ZyZWVfdXJiIChwb3J0LT53cml0ZV91cmIpOwoJCXBvcnQtPndyaXRlX3VyYiA9IE5VTEw7Cgl9CglrZnJlZShwb3J0LT5idWxrX291dF9idWZmZXIpOwoJcG9ydC0+YnVsa19vdXRfYnVmZmVyID0gTlVMTDsKCgl1c2Jfc2V0X3NlcmlhbF9wb3J0X2RhdGEoc2VyaWFsLT5wb3J0WzBdLCBwcml2KTsKCglmdGRpX2RldGVybWluZV90eXBlIChzZXJpYWwtPnBvcnRbMF0pOwoJcmV0dmFsID0gY3JlYXRlX3N5c2ZzX2F0dHJzKHNlcmlhbCk7CglpZiAocmV0dmFsKQoJCWRldl9lcnIoJnNlcmlhbC0+ZGV2LT5kZXYsICJFcnJvciBjcmVhdGluZyBzeXNmcyBmaWxlcywgIgoJCQkiY29udGludWluZ1xuIik7CgoJLyogQ2hlY2sgZm9yIGRldmljZSByZXF1aXJpbmcgc3BlY2lhbCBzZXQgdXAuICovCglxdWlyayA9IChzdHJ1Y3QgZnRkaV9zaW9fcXVpcmsgKil1c2JfZ2V0X3NlcmlhbF9kYXRhKHNlcmlhbCk7CglpZiAocXVpcmsgJiYgcXVpcmstPnNldHVwKSB7CgkJcXVpcmstPnNldHVwKHNlcmlhbCk7Cgl9CgoJcmV0dXJuIDA7Cn0gLyogZnRkaV9zaW9fYXR0YWNoICovCgoKLyogU2V0dXAgZm9yIHRoZSBVU0ItVUlSVCBkZXZpY2UsIHdoaWNoIHJlcXVpcmVzIGhhcmR3aXJlZAogKiBiYXVkcmF0ZSAoMzg0MDAgZ2V0cyBtYXBwZWQgdG8gMzEyNTAwKSAqLwovKiBDYWxsZWQgZnJvbSB1c2JzZXJpYWw6c2VyaWFsX3Byb2JlICovCnN0YXRpYyB2b2lkIGZ0ZGlfVVNCX1VJUlRfc2V0dXAgKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCnsKCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXY7CgoJZGJnKCIlcyIsX19GVU5DVElPTl9fKTsKCglwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHNlcmlhbC0+cG9ydFswXSk7Cglwcml2LT5mbGFncyB8PSBBU1lOQ19TUERfQ1VTVDsKCXByaXYtPmN1c3RvbV9kaXZpc29yID0gNzc7Cglwcml2LT5mb3JjZV9iYXVkID0gQjM4NDAwOwp9IC8qIGZ0ZGlfVVNCX1VJUlRfc2V0dXAgKi8KCi8qIFNldHVwIGZvciB0aGUgSEUtVElSQTEgZGV2aWNlLCB3aGljaCByZXF1aXJlcyBoYXJkd2lyZWQKICogYmF1ZHJhdGUgKDM4NDAwIGdldHMgbWFwcGVkIHRvIDEwMDAwMCkgYW5kIFJUUy1DVFMgZW5hYmxlZC4gICovCnN0YXRpYyB2b2lkIGZ0ZGlfSEVfVElSQTFfc2V0dXAgKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCnsKCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXY7CgoJZGJnKCIlcyIsX19GVU5DVElPTl9fKTsKCglwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHNlcmlhbC0+cG9ydFswXSk7Cglwcml2LT5mbGFncyB8PSBBU1lOQ19TUERfQ1VTVDsKCXByaXYtPmN1c3RvbV9kaXZpc29yID0gMjQwOwoJcHJpdi0+Zm9yY2VfYmF1ZCA9IEIzODQwMDsKCXByaXYtPmZvcmNlX3J0c2N0cyA9IDE7Cn0gLyogZnRkaV9IRV9USVJBMV9zZXR1cCAqLwoKCi8qIGZ0ZGlfc2h1dGRvd24gaXMgY2FsbGVkIGZyb20gdXNic2VyaWFsOnVzYl9zZXJpYWxfZGlzY29ubmVjdAogKiAgIGl0IGlzIGNhbGxlZCB3aGVuIHRoZSB1c2IgZGV2aWNlIGlzIGRpc2Nvbm5lY3RlZAogKgogKiAgIHVzYnNlcmlhbDp1c2Jfc2VyaWFsX2Rpc2Nvbm5lY3QKICogICAgICBjYWxscyBfX3NlcmlhbF9jbG9zZSBmb3IgZWFjaCBvcGVuIG9mIHRoZSBwb3J0CiAqICAgICAgc2h1dGRvd24gaXMgY2FsbGVkIHRoZW4gKGllIGZ0ZGlfc2h1dGRvd24pCiAqLwoKCnN0YXRpYyB2b2lkIGZ0ZGlfc2h1dGRvd24gKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCnsgLyogZnRkaV9zaHV0ZG93biAqLwoKCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSBzZXJpYWwtPnBvcnRbMF07CglzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwoKCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOwoKCXJlbW92ZV9zeXNmc19hdHRycyhzZXJpYWwpOwoKCS8qIGFsbCBvcGVuIHBvcnRzIGFyZSBjbG9zZWQgYXQgdGhpcyBwb2ludAogICAgICAgICAqICAgIChieSB1c2JzZXJpYWwuYzpfX3NlcmlhbF9jbG9zZSwgd2hpY2ggY2FsbHMgZnRkaV9jbG9zZSkKCSAqLwoKCWlmIChwcml2KSB7CgkJdXNiX3NldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQsIE5VTEwpOwoJCWtmcmVlKHByaXYpOwoJfQp9IC8qIGZ0ZGlfc2h1dGRvd24gKi8KCgpzdGF0aWMgaW50ICBmdGRpX29wZW4gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKQp7IC8qIGZ0ZGlfb3BlbiAqLwoJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OwoJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJaW50IHJlc3VsdCA9IDA7CgljaGFyIGJ1ZlsxXTsgLyogTmVlZGVkIGZvciB0aGUgdXNiX2NvbnRyb2xfbXNnIEkgdGhpbmsgKi8KCglkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKCglzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+dHhfbG9jaywgZmxhZ3MpOwoJcHJpdi0+dHhfYnl0ZXMgPSAwOwoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbG9jaywgZmxhZ3MpOwoJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJ4X2xvY2ssIGZsYWdzKTsKCXByaXYtPnJ4X2J5dGVzID0gMDsKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJ4X2xvY2ssIGZsYWdzKTsKCglpZiAocG9ydC0+dHR5KQoJCXBvcnQtPnR0eS0+bG93X2xhdGVuY3kgPSAocHJpdi0+ZmxhZ3MgJiBBU1lOQ19MT1dfTEFURU5DWSkgPyAxIDogMDsKCgkvKiBObyBlcnJvciBjaGVja2luZyBmb3IgdGhpcyAod2lsbCBnZXQgZXJyb3JzIGxhdGVyIGFueXdheSkgKi8KCS8qIFNlZSBmdGRpX3Npby5oIGZvciBkZXNjcmlwdGlvbiBvZiB3aGF0IGlzIHJlc2V0ICovCgl1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKCQkJRlRESV9TSU9fUkVTRVRfUkVRVUVTVCwgRlRESV9TSU9fUkVTRVRfUkVRVUVTVF9UWVBFLAoJCQlGVERJX1NJT19SRVNFVF9TSU8sCgkJCXByaXYtPmludGVyZmFjZSwgYnVmLCAwLCBXRFJfVElNRU9VVCk7CgoJLyogVGVybWlvcyBkZWZhdWx0cyBhcmUgc2V0IGJ5IHVzYl9zZXJpYWxfaW5pdC4gV2UgZG9uJ3QgY2hhbmdlCgkgICBwb3J0LT50dHktPnRlcm1pb3MgLSB0aGlzIHdvdWxkIGxvb3NlIHNwZWVkIHNldHRpbmdzLCBldGMuCgkgICBUaGlzIGlzIHNhbWUgYmVoYXZpb3VyIGFzIHNlcmlhbC5jL3JzX29wZW4oKSAtIEt1YmEgKi8KCgkvKiBmdGRpX3NldF90ZXJtaW9zICB3aWxsIHNlbmQgdXNiIGNvbnRyb2wgbWVzc2FnZXMgKi8KCWlmIChwb3J0LT50dHkpCgkJZnRkaV9zZXRfdGVybWlvcyhwb3J0LCBOVUxMKTsKCgkvKiBGSVhNRTogRmxvdyBjb250cm9sIG1pZ2h0IGJlIGVuYWJsZWQsIHNvIGl0IHNob3VsZCBiZSBjaGVja2VkIC0KCSAgIHdlIGhhdmUgbm8gY29udHJvbCBvZiBkZWZhdWx0cyEgKi8KCS8qIFR1cm4gb24gUlRTIGFuZCBEVFIgc2luY2Ugd2UgYXJlIG5vdCBmbG93IGNvbnRyb2xsaW5nIGJ5IGRlZmF1bHQgKi8KCXNldF9tY3RybChwb3J0LCBUSU9DTV9EVFIgfCBUSU9DTV9SVFMpOwoKCS8qIE5vdCB0aHJvdHRsZWQgKi8KCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yeF9sb2NrLCBmbGFncyk7Cglwcml2LT5yeF9mbGFncyAmPSB+KFRIUk9UVExFRCB8IEFDVFVBTExZX1RIUk9UVExFRCk7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yeF9sb2NrLCBmbGFncyk7CgoJLyogU3RhcnQgcmVhZGluZyBmcm9tIHRoZSBkZXZpY2UgKi8KCXByaXYtPnJ4X3Byb2Nlc3NlZCA9IDA7Cgl1c2JfZmlsbF9idWxrX3VyYihwb3J0LT5yZWFkX3VyYiwgZGV2LAoJCSAgICAgIHVzYl9yY3ZidWxrcGlwZShkZXYsIHBvcnQtPmJ1bGtfaW5fZW5kcG9pbnRBZGRyZXNzKSwKCQkgICAgICBwb3J0LT5yZWFkX3VyYi0+dHJhbnNmZXJfYnVmZmVyLCBwb3J0LT5yZWFkX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKCQkgICAgICBmdGRpX3JlYWRfYnVsa19jYWxsYmFjaywgcG9ydCk7CglyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5yZWFkX3VyYiwgR0ZQX0tFUk5FTCk7CglpZiAocmVzdWx0KQoJCWVycigiJXMgLSBmYWlsZWQgc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWQiLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CgoKCXJldHVybiByZXN1bHQ7Cn0gLyogZnRkaV9vcGVuICovCgoKCi8qCiAqIHVzYnNlcmlhbDpfX3NlcmlhbF9jbG9zZSAgb25seSBjYWxscyBmdGRpX2Nsb3NlIGlmIHRoZSBwb2ludCBpcyBvcGVuCiAqCiAqICAgVGhpcyBvbmx5IGdldHMgY2FsbGVkIHdoZW4gaXQgaXMgdGhlIGxhc3QgY2xvc2UKICoKICoKICovCgpzdGF0aWMgdm9pZCBmdGRpX2Nsb3NlIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCkKeyAvKiBmdGRpX2Nsb3NlICovCgl1bnNpZ25lZCBpbnQgY19jZmxhZyA9IHBvcnQtPnR0eS0+dGVybWlvcy0+Y19jZmxhZzsKCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CgljaGFyIGJ1ZlsxXTsKCglkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKCglpZiAoY19jZmxhZyAmIEhVUENMKXsKCQkvKiBEaXNhYmxlIGZsb3cgY29udHJvbCAqLwoJCWlmICh1c2JfY29udHJvbF9tc2cocG9ydC0+c2VyaWFsLT5kZXYsCgkJCQkgICAgdXNiX3NuZGN0cmxwaXBlKHBvcnQtPnNlcmlhbC0+ZGV2LCAwKSwKCQkJCSAgICBGVERJX1NJT19TRVRfRkxPV19DVFJMX1JFUVVFU1QsCgkJCQkgICAgRlRESV9TSU9fU0VUX0ZMT1dfQ1RSTF9SRVFVRVNUX1RZUEUsCgkJCQkgICAgMCwgcHJpdi0+aW50ZXJmYWNlLCBidWYsIDAsCgkJCQkgICAgV0RSX1RJTUVPVVQpIDwgMCkgewoJCQllcnIoImVycm9yIGZyb20gZmxvd2NvbnRyb2wgdXJiIik7CgkJfQoKCQkvKiBkcm9wIFJUUyBhbmQgRFRSICovCgkJY2xlYXJfbWN0cmwocG9ydCwgVElPQ01fRFRSIHwgVElPQ01fUlRTKTsKCX0gLyogTm90ZSBjaGFuZ2Ugbm8gbGluZSBpZiBodXBjbCBpcyBvZmYgKi8KCgkvKiBjYW5jZWwgYW55IHNjaGVkdWxlZCByZWFkaW5nICovCgljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5yeF93b3JrKTsKCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CgoJLyogc2h1dGRvd24gb3VyIGJ1bGsgcmVhZCAqLwoJdXNiX2tpbGxfdXJiKHBvcnQtPnJlYWRfdXJiKTsKfSAvKiBmdGRpX2Nsb3NlICovCgoKCi8qIFRoZSBTSU8gcmVxdWlyZXMgdGhlIGZpcnN0IGJ5dGUgdG8gaGF2ZToKICogIEIwIDEKICogIEIxIDAKICogIEIyLi43IGxlbmd0aCBvZiBtZXNzYWdlIGV4Y2x1ZGluZyBieXRlIDAKICoKICogVGhlIG5ldyBkZXZpY2VzIGRvIG5vdCByZXF1aXJlIHRoaXMgYnl0ZQogKi8Kc3RhdGljIGludCBmdGRpX3dyaXRlIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAoJCQkgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKeyAvKiBmdGRpX3dyaXRlICovCglzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwoJc3RydWN0IHVyYiAqdXJiOwoJdW5zaWduZWQgY2hhciAqYnVmZmVyOwoJaW50IGRhdGFfb2Zmc2V0IDsgICAgICAgLyogd2lsbCBiZSAxIGZvciB0aGUgU0lPIGFuZCAwIG90aGVyd2lzZSAqLwoJaW50IHN0YXR1czsKCWludCB0cmFuc2Zlcl9zaXplOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCglkYmcoIiVzIHBvcnQgJWQsICVkIGJ5dGVzIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIsIGNvdW50KTsKCglpZiAoY291bnQgPT0gMCkgewoJCWRiZygid3JpdGUgcmVxdWVzdCBvZiAwIGJ5dGVzIik7CgkJcmV0dXJuIDA7Cgl9CglzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+dHhfbG9jaywgZmxhZ3MpOwoJaWYgKHByaXYtPnR4X291dHN0YW5kaW5nX3VyYnMgPiBVUkJfVVBQRVJfTElNSVQpIHsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eF9sb2NrLCBmbGFncyk7CgkJZGJnKCIlcyAtIHdyaXRlIGxpbWl0IGhpdFxuIiwgX19GVU5DVElPTl9fKTsKCQlyZXR1cm4gMDsKCX0KCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4X2xvY2ssIGZsYWdzKTsKCglkYXRhX29mZnNldCA9IHByaXYtPndyaXRlX29mZnNldDsKICAgICAgICBkYmcoImRhdGFfb2Zmc2V0IHNldCB0byAlZCIsZGF0YV9vZmZzZXQpOwoKCS8qIERldGVybWluZSB0b3RhbCB0cmFuc2ZlciBzaXplICovCgl0cmFuc2Zlcl9zaXplID0gY291bnQ7CglpZiAoZGF0YV9vZmZzZXQgPiAwKSB7CgkJLyogT3JpZ2luYWwgc2lvIG5lZWRzIGNvbnRyb2wgYnl0ZXMgdG9vLi4uICovCgkJdHJhbnNmZXJfc2l6ZSArPSAoZGF0YV9vZmZzZXQgKgoJCQkJKChjb3VudCArIChQS1RTWiAtIDEgLSBkYXRhX29mZnNldCkpIC8KCQkJCSAoUEtUU1ogLSBkYXRhX29mZnNldCkpKTsKCX0KCglidWZmZXIgPSBrbWFsbG9jICh0cmFuc2Zlcl9zaXplLCBHRlBfQVRPTUlDKTsKCWlmICghYnVmZmVyKSB7CgkJZXJyKCIlcyByYW4gb3V0IG9mIGtlcm5lbCBtZW1vcnkgZm9yIHVyYiAuLi4iLCBfX0ZVTkNUSU9OX18pOwoJCXJldHVybiAtRU5PTUVNOwoJfQoKCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7CglpZiAoIXVyYikgewoJCWVycigiJXMgLSBubyBtb3JlIGZyZWUgdXJicyIsIF9fRlVOQ1RJT05fXyk7CgkJa2ZyZWUgKGJ1ZmZlcik7CgkJcmV0dXJuIC1FTk9NRU07Cgl9CgoJLyogQ29weSBkYXRhICovCglpZiAoZGF0YV9vZmZzZXQgPiAwKSB7CgkJLyogT3JpZ2luYWwgc2lvIHJlcXVpcmVzIGNvbnRyb2wgYnl0ZSBhdCBzdGFydCBvZiBlYWNoIHBhY2tldC4gKi8KCQlpbnQgdXNlcl9wa3RzeiA9IFBLVFNaIC0gZGF0YV9vZmZzZXQ7CgkJaW50IHRvZG8gPSBjb3VudDsKCQl1bnNpZ25lZCBjaGFyICpmaXJzdF9ieXRlID0gYnVmZmVyOwoJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmN1cnJlbnRfcG9zaXRpb24gPSBidWY7CgoJCXdoaWxlICh0b2RvID4gMCkgewoJCQlpZiAodXNlcl9wa3RzeiA+IHRvZG8pIHsKCQkJCXVzZXJfcGt0c3ogPSB0b2RvOwoJCQl9CgkJCS8qIFdyaXRlIHRoZSBjb250cm9sIGJ5dGUgYXQgdGhlIGZyb250IG9mIHRoZSBwYWNrZXQqLwoJCQkqZmlyc3RfYnl0ZSA9IDEgfCAoKHVzZXJfcGt0c3opIDw8IDIpOwoJCQkvKiBDb3B5IGRhdGEgZm9yIHBhY2tldCAqLwoJCQltZW1jcHkgKGZpcnN0X2J5dGUgKyBkYXRhX29mZnNldCwKCQkJCWN1cnJlbnRfcG9zaXRpb24sIHVzZXJfcGt0c3opOwoJCQlmaXJzdF9ieXRlICs9IHVzZXJfcGt0c3ogKyBkYXRhX29mZnNldDsKCQkJY3VycmVudF9wb3NpdGlvbiArPSB1c2VyX3BrdHN6OwoJCQl0b2RvIC09IHVzZXJfcGt0c3o7CgkJfQoJfSBlbHNlIHsKCQkvKiBObyBjb250cm9sIGJ5dGUgcmVxdWlyZWQuICovCgkJLyogQ29weSBpbiB0aGUgZGF0YSB0byBzZW5kICovCgkJbWVtY3B5IChidWZmZXIsIGJ1ZiwgY291bnQpOwoJfQoKCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19GVU5DVElPTl9fLCB0cmFuc2Zlcl9zaXplLCBidWZmZXIpOwoKCS8qIGZpbGwgdGhlIGJ1ZmZlciBhbmQgc2VuZCBpdCAqLwoJdXNiX2ZpbGxfYnVsa191cmIodXJiLCBwb3J0LT5zZXJpYWwtPmRldiwKCQkgICAgICB1c2Jfc25kYnVsa3BpcGUocG9ydC0+c2VyaWFsLT5kZXYsIHBvcnQtPmJ1bGtfb3V0X2VuZHBvaW50QWRkcmVzcyksCgkJICAgICAgYnVmZmVyLCB0cmFuc2Zlcl9zaXplLAoJCSAgICAgIGZ0ZGlfd3JpdGVfYnVsa19jYWxsYmFjaywgcG9ydCk7CgoJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKCWlmIChzdGF0dXMpIHsKCQllcnIoIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgd3JpdGUgdXJiLCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKCQljb3VudCA9IHN0YXR1czsKCQlrZnJlZSAoYnVmZmVyKTsKCX0gZWxzZSB7CgkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnR4X2xvY2ssIGZsYWdzKTsKCQkrK3ByaXYtPnR4X291dHN0YW5kaW5nX3VyYnM7CgkJcHJpdi0+dHhfb3V0c3RhbmRpbmdfYnl0ZXMgKz0gY291bnQ7CgkJcHJpdi0+dHhfYnl0ZXMgKz0gY291bnQ7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbG9jaywgZmxhZ3MpOwoJfQoKCS8qIHdlIGFyZSBkb25lIHdpdGggdGhpcyB1cmIsIHNvIGxldCB0aGUgaG9zdCBkcml2ZXIKCSAqIHJlYWxseSBmcmVlIGl0IHdoZW4gaXQgaXMgZmluaXNoZWQgd2l0aCBpdCAqLwoJdXNiX2ZyZWVfdXJiICh1cmIpOwoKCWRiZygiJXMgd3JpdGUgcmV0dXJuaW5nOiAlZCIsIF9fRlVOQ1RJT05fXywgY291bnQpOwoJcmV0dXJuIGNvdW50Owp9IC8qIGZ0ZGlfd3JpdGUgKi8KCgovKiBUaGlzIGZ1bmN0aW9uIG1heSBnZXQgY2FsbGVkIHdoZW4gdGhlIGRldmljZSBpcyBjbG9zZWQgKi8KCnN0YXRpYyB2b2lkIGZ0ZGlfd3JpdGVfYnVsa19jYWxsYmFjayAoc3RydWN0IHVyYiAqdXJiKQp7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopdXJiLT5jb250ZXh0OwoJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdjsKCWludCBkYXRhX29mZnNldDsgICAgICAgLyogd2lsbCBiZSAxIGZvciB0aGUgU0lPIGFuZCAwIG90aGVyd2lzZSAqLwoJdW5zaWduZWQgbG9uZyBjb3VudGJhY2s7CgoJLyogZnJlZSB1cCB0aGUgdHJhbnNmZXIgYnVmZmVyLCBhcyB1c2JfZnJlZV91cmIoKSBkb2VzIG5vdCBkbyB0aGlzICovCglrZnJlZSAodXJiLT50cmFuc2Zlcl9idWZmZXIpOwoKCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOwoKCWlmICh1cmItPnN0YXR1cykgewoJCWRiZygibm9uemVybyB3cml0ZSBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLCB1cmItPnN0YXR1cyk7CgkJcmV0dXJuOwoJfQoKCXByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CglpZiAoIXByaXYpIHsKCQlkYmcoIiVzIC0gYmFkIHBvcnQgcHJpdmF0ZSBkYXRhIHBvaW50ZXIgLSBleGl0aW5nIiwgX19GVU5DVElPTl9fKTsKCQlyZXR1cm47Cgl9CgkvKiBhY2NvdW50IGZvciB0cmFuc2ZlcnJlZCBkYXRhICovCgljb3VudGJhY2sgPSB1cmItPmFjdHVhbF9sZW5ndGg7CglkYXRhX29mZnNldCA9IHByaXYtPndyaXRlX29mZnNldDsKCWlmIChkYXRhX29mZnNldCA+IDApIHsKCQkvKiBTdWJ0cmFjdCB0aGUgY29udHJvbCBieXRlcyAqLwoJCWNvdW50YmFjayAtPSAoZGF0YV9vZmZzZXQgKiAoKGNvdW50YmFjayArIChQS1RTWiAtIDEpKSAvIFBLVFNaKSk7Cgl9CglzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+dHhfbG9jaywgZmxhZ3MpOwoJLS1wcml2LT50eF9vdXRzdGFuZGluZ191cmJzOwoJcHJpdi0+dHhfb3V0c3RhbmRpbmdfYnl0ZXMgLT0gY291bnRiYWNrOwoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbG9jaywgZmxhZ3MpOwoKCXVzYl9zZXJpYWxfcG9ydF9zb2Z0aW50KHBvcnQpOwp9IC8qIGZ0ZGlfd3JpdGVfYnVsa19jYWxsYmFjayAqLwoKCnN0YXRpYyBpbnQgZnRkaV93cml0ZV9yb29tKCBzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ICkKewoJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKCWludCByb29tOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCglkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKCglzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+dHhfbG9jaywgZmxhZ3MpOwoJaWYgKHByaXYtPnR4X291dHN0YW5kaW5nX3VyYnMgPCBVUkJfVVBQRVJfTElNSVQpIHsKCQkvKgoJCSAqIFdlIHJlYWxseSBjYW4gdGFrZSBhbnl0aGluZyB0aGUgdXNlciB0aHJvd3MgYXQgdXMKCQkgKiBidXQgbGV0J3MgcGljayBhIG5pY2UgYmlnIG51bWJlciB0byB0ZWxsIHRoZSB0dHkKCQkgKiBsYXllciB0aGF0IHdlIGhhdmUgbG90cyBvZiBmcmVlIHNwYWNlCgkJICovCgkJcm9vbSA9IDIwNDg7Cgl9IGVsc2UgewoJCXJvb20gPSAwOwoJfQoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbG9jaywgZmxhZ3MpOwoJcmV0dXJuIHJvb207Cn0gLyogZnRkaV93cml0ZV9yb29tICovCgoKc3RhdGljIGludCBmdGRpX2NoYXJzX2luX2J1ZmZlciAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKeyAvKiBmdGRpX2NoYXJzX2luX2J1ZmZlciAqLwoJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKCWludCBidWZmZXJlZDsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CgoJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnR4X2xvY2ssIGZsYWdzKTsKCWJ1ZmZlcmVkID0gKGludClwcml2LT50eF9vdXRzdGFuZGluZ19ieXRlczsKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4X2xvY2ssIGZsYWdzKTsKCWlmIChidWZmZXJlZCA8IDApIHsKCQllcnIoIiVzIG91dHN0YW5kaW5nIHR4IGJ5dGVzIGlzIG5lZ2F0aXZlISIsIF9fRlVOQ1RJT05fXyk7CgkJYnVmZmVyZWQgPSAwOwoJfQoJcmV0dXJuIGJ1ZmZlcmVkOwp9IC8qIGZ0ZGlfY2hhcnNfaW5fYnVmZmVyICovCgoKCnN0YXRpYyB2b2lkIGZ0ZGlfcmVhZF9idWxrX2NhbGxiYWNrIChzdHJ1Y3QgdXJiICp1cmIpCnsgLyogZnRkaV9yZWFkX2J1bGtfY2FsbGJhY2sgKi8KCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKXVyYi0+Y29udGV4dDsKCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CglzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2OwoJdW5zaWduZWQgbG9uZyBjb3VudHJlYWQ7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoKCWlmICh1cmItPm51bWJlcl9vZl9wYWNrZXRzID4gMCkgewoJCWVycigiJXMgdHJhbnNmZXJfYnVmZmVyX2xlbmd0aCAlZCBhY3R1YWxfbGVuZ3RoICVkIG51bWJlciBvZiBwYWNrZXRzICVkIixfX0ZVTkNUSU9OX18sCgkJICAgIHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwgdXJiLT5hY3R1YWxfbGVuZ3RoLCB1cmItPm51bWJlcl9vZl9wYWNrZXRzICk7CgkJZXJyKCIlcyB0cmFuc2Zlcl9mbGFncyAleCAiLCBfX0ZVTkNUSU9OX18sdXJiLT50cmFuc2Zlcl9mbGFncyApOwoJfQoKCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOwoKCWlmIChwb3J0LT5vcGVuX2NvdW50IDw9IDApCgkJcmV0dXJuOwoKCXR0eSA9IHBvcnQtPnR0eTsKCWlmICghdHR5KSB7CgkJZGJnKCIlcyAtIGJhZCB0dHkgcG9pbnRlciAtIGV4aXRpbmciLF9fRlVOQ1RJT05fXyk7CgkJcmV0dXJuOwoJfQoKCXByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CglpZiAoIXByaXYpIHsKCQlkYmcoIiVzIC0gYmFkIHBvcnQgcHJpdmF0ZSBkYXRhIHBvaW50ZXIgLSBleGl0aW5nIiwgX19GVU5DVElPTl9fKTsKCQlyZXR1cm47Cgl9CgoJaWYgKHVyYiAhPSBwb3J0LT5yZWFkX3VyYikgewoJCWVycigiJXMgLSBOb3QgbXkgdXJiISIsIF9fRlVOQ1RJT05fXyk7Cgl9CgoJaWYgKHVyYi0+c3RhdHVzKSB7CgkJLyogVGhpcyB3aWxsIGhhcHBlbiBhdCBjbG9zZSBldmVyeSB0aW1lIHNvIGl0IGlzIGEgZGJnIG5vdCBhbiBlcnIgKi8KCQlkYmcoIih0aGlzIGlzIG9rIG9uIGNsb3NlKSBub256ZXJvIHJlYWQgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgdXJiLT5zdGF0dXMpOwoJCXJldHVybjsKCX0KCgkvKiBjb3VudCBkYXRhIGJ5dGVzLCBidXQgbm90IHN0YXR1cyBieXRlcyAqLwoJY291bnRyZWFkID0gdXJiLT5hY3R1YWxfbGVuZ3RoOwoJY291bnRyZWFkIC09IDIgKiAoKGNvdW50cmVhZCArIChQS1RTWiAtIDEpKSAvIFBLVFNaKTsKCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yeF9sb2NrLCBmbGFncyk7Cglwcml2LT5yeF9ieXRlcyArPSBjb3VudHJlYWQ7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yeF9sb2NrLCBmbGFncyk7CgoJZnRkaV9wcm9jZXNzX3JlYWQocG9ydCk7Cgp9IC8qIGZ0ZGlfcmVhZF9idWxrX2NhbGxiYWNrICovCgoKc3RhdGljIHZvaWQgZnRkaV9wcm9jZXNzX3JlYWQgKHZvaWQgKnBhcmFtKQp7IC8qIGZ0ZGlfcHJvY2Vzc19yZWFkICovCglzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQqKXBhcmFtOwoJc3RydWN0IHVyYiAqdXJiOwoJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXY7CgljaGFyIGVycm9yX2ZsYWc7Cgl1bnNpZ25lZCBjaGFyICpkYXRhOwoKCWludCBpOwoJaW50IHJlc3VsdDsKCWludCBuZWVkX2ZsaXA7CglpbnQgcGFja2V0X29mZnNldDsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CgoJaWYgKHBvcnQtPm9wZW5fY291bnQgPD0gMCkKCQlyZXR1cm47CgoJdHR5ID0gcG9ydC0+dHR5OwoJaWYgKCF0dHkpIHsKCQlkYmcoIiVzIC0gYmFkIHR0eSBwb2ludGVyIC0gZXhpdGluZyIsX19GVU5DVElPTl9fKTsKCQlyZXR1cm47Cgl9CgoJcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKCWlmICghcHJpdikgewoJCWRiZygiJXMgLSBiYWQgcG9ydCBwcml2YXRlIGRhdGEgcG9pbnRlciAtIGV4aXRpbmciLCBfX0ZVTkNUSU9OX18pOwoJCXJldHVybjsKCX0KCgl1cmIgPSBwb3J0LT5yZWFkX3VyYjsKCWlmICghdXJiKSB7CgkJZGJnKCIlcyAtIGJhZCByZWFkX3VyYiBwb2ludGVyIC0gZXhpdGluZyIsIF9fRlVOQ1RJT05fXyk7CgkJcmV0dXJuOwoJfQoKCWRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKCglpZiAocHJpdi0+cnhfcHJvY2Vzc2VkKSB7CgkJZGJnKCIlcyAtIGFscmVhZHkgcHJvY2Vzc2VkOiAlZCBieXRlcywgJWQgcmVtYWluIiwgX19GVU5DVElPTl9fLAoJCQkJcHJpdi0+cnhfcHJvY2Vzc2VkLAoJCQkJdXJiLT5hY3R1YWxfbGVuZ3RoIC0gcHJpdi0+cnhfcHJvY2Vzc2VkKTsKCX0gZWxzZSB7CgkJLyogVGhlIGZpcnN0IHR3byBieXRlcyBvZiBldmVyeSByZWFkIHBhY2tldCBhcmUgc3RhdHVzICovCgkJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA+IDIpIHsKCQkJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sIHVyYi0+YWN0dWFsX2xlbmd0aCwgZGF0YSk7CgkJfSBlbHNlIHsKCQkJZGJnKCJTdGF0dXMgb25seTogJTAzb28gJTAzb28iLGRhdGFbMF0sZGF0YVsxXSk7CgkJfQoJfQoKCgkvKiBUTyBETyAtLSBjaGVjayBmb3IgaHVuZyB1cCBsaW5lIGFuZCBoYW5kbGUgYXBwcm9wcmlhdGVseTogKi8KCS8qICAgc2VuZCBoYW5ndXAgICovCgkvKiBTZWUgYWNtLmMgLSB5b3UgZG8gYSB0dHlfaGFuZ3VwICAtIGVnIHR0eV9oYW5ndXAodHR5KSAqLwoJLyogaWYgQ0QgaXMgZHJvcHBlZCBhbmQgdGhlIGxpbmUgaXMgbm90IENMT0NBTCB0aGVuIHdlIHNob3VsZCBoYW5ndXAgKi8KCgluZWVkX2ZsaXAgPSAwOwoJZm9yIChwYWNrZXRfb2Zmc2V0ID0gcHJpdi0+cnhfcHJvY2Vzc2VkOyBwYWNrZXRfb2Zmc2V0IDwgdXJiLT5hY3R1YWxfbGVuZ3RoOyBwYWNrZXRfb2Zmc2V0ICs9IFBLVFNaKSB7CgkJaW50IGxlbmd0aDsKCgkJLyogQ29tcGFyZSBuZXcgbGluZSBzdGF0dXMgdG8gdGhlIG9sZCBvbmUsIHNpZ25hbCBpZiBkaWZmZXJlbnQgKi8KCQkvKiBOLkIuIHBhY2tldCBtYXkgYmUgcHJvY2Vzc2VkIG1vcmUgdGhhbiBvbmNlLCBidXQgZGlmZmVyZW5jZXMKCQkgKiBhcmUgb25seSBwcm9jZXNzZWQgb25jZS4gICovCgkJaWYgKHByaXYgIT0gTlVMTCkgewoJCQljaGFyIG5ld19zdGF0dXMgPSBkYXRhW3BhY2tldF9vZmZzZXQrMF0gJiBGVERJX1NUQVRVU19CMF9NQVNLOwoJCQlpZiAobmV3X3N0YXR1cyAhPSBwcml2LT5wcmV2X3N0YXR1cykgewoJCQkJcHJpdi0+ZGlmZl9zdGF0dXMgfD0gbmV3X3N0YXR1cyBeIHByaXYtPnByZXZfc3RhdHVzOwoJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcml2LT5kZWx0YV9tc3Jfd2FpdCk7CgkJCQlwcml2LT5wcmV2X3N0YXR1cyA9IG5ld19zdGF0dXM7CgkJCX0KCQl9CgoJCWxlbmd0aCA9IG1pbihQS1RTWiwgdXJiLT5hY3R1YWxfbGVuZ3RoLXBhY2tldF9vZmZzZXQpLTI7CgkJaWYgKGxlbmd0aCA8IDApIHsKCQkJZXJyKCIlcyAtIGJhZCBwYWNrZXQgbGVuZ3RoOiAlZCIsIF9fRlVOQ1RJT05fXywgbGVuZ3RoKzIpOwoJCQlsZW5ndGggPSAwOwoJCX0KCgkJaWYgKHByaXYtPnJ4X2ZsYWdzICYgVEhST1RUTEVEKSB7CgkJCWRiZygiJXMgLSB0aHJvdHRsZWQiLCBfX0ZVTkNUSU9OX18pOwoJCQlicmVhazsKCQl9CgkJaWYgKHR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHR0eSwgbGVuZ3RoKSA8IGxlbmd0aCkgewoJCQkvKiBicmVhayBvdXQgJiB3YWl0IGZvciB0aHJvdHRsaW5nL3VudGhyb3R0bGluZyB0byBoYXBwZW4gKi8KCQkJZGJnKCIlcyAtIHJlY2VpdmUgcm9vbSBsb3ciLCBfX0ZVTkNUSU9OX18pOwoJCQlicmVhazsKCQl9CgoJCS8qIEhhbmRsZSBlcnJvcnMgYW5kIGJyZWFrICovCgkJZXJyb3JfZmxhZyA9IFRUWV9OT1JNQUw7CgkJLyogQWx0aG91Z2ggdGhlIGRldmljZSB1c2VzIGEgYml0bWFzayBhbmQgaGVuY2UgY2FuIGhhdmUgbXVsdGlwbGUgKi8KCQkvKiBlcnJvcnMgb24gYSBwYWNrZXQgLSB0aGUgb3JkZXIgaGVyZSBzZXRzIHRoZSBwcmlvcml0eSB0aGUgKi8KCQkvKiBlcnJvciBpcyByZXR1cm5lZCB0byB0aGUgdHR5IGxheWVyICAqLwoKCQlpZiAoIGRhdGFbcGFja2V0X29mZnNldCsxXSAmIEZURElfUlNfT0UgKSB7CgkJCWVycm9yX2ZsYWcgPSBUVFlfT1ZFUlJVTjsKCQkJZGJnKCJPVkVSUlJVTiBlcnJvciIpOwoJCX0KCQlpZiAoIGRhdGFbcGFja2V0X29mZnNldCsxXSAmIEZURElfUlNfQkkgKSB7CgkJCWVycm9yX2ZsYWcgPSBUVFlfQlJFQUs7CgkJCWRiZygiQlJFQUsgcmVjZWl2ZWQiKTsKCQl9CgkJaWYgKCBkYXRhW3BhY2tldF9vZmZzZXQrMV0gJiBGVERJX1JTX1BFICkgewoJCQllcnJvcl9mbGFnID0gVFRZX1BBUklUWTsKCQkJZGJnKCJQQVJJVFkgZXJyb3IiKTsKCQl9CgkJaWYgKCBkYXRhW3BhY2tldF9vZmZzZXQrMV0gJiBGVERJX1JTX0ZFICkgewoJCQllcnJvcl9mbGFnID0gVFRZX0ZSQU1FOwoJCQlkYmcoIkZSQU1JTkcgZXJyb3IiKTsKCQl9CgkJaWYgKGxlbmd0aCA+IDApIHsKCQkJZm9yIChpID0gMjsgaSA8IGxlbmd0aCsyOyBpKyspIHsKCQkJCS8qIE5vdGUgdGhhdCB0aGUgZXJyb3IgZmxhZyBpcyBkdXBsaWNhdGVkIGZvcgoJCQkJICAgZXZlcnkgY2hhcmFjdGVyIHJlY2VpdmVkIHNpbmNlIHdlIGRvbid0IGtub3cKCQkJCSAgIHdoaWNoIGNoYXJhY3RlciBpdCBhcHBsaWVkIHRvICovCgkJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGRhdGFbcGFja2V0X29mZnNldCtpXSwgZXJyb3JfZmxhZyk7CgkJCX0KCQkJbmVlZF9mbGlwID0gMTsKCQl9CgojaWZkZWYgTk9UX0NPUlJFQ1RfQlVUX0tFRVBJTkdfSVRfRk9SX05PVwoJCS8qIGlmIGEgcGFyaXR5IGVycm9yIGlzIGRldGVjdGVkIHlvdSBnZXQgc3RhdHVzIHBhY2tldHMgZm9yZXZlcgoJCSAgIHVudGlsIGEgY2hhcmFjdGVyIGlzIHNlbnQgd2l0aG91dCBhIHBhcml0eSBlcnJvci4KCQkgICBUaGlzIGRvZXNuJ3Qgd29yayB3ZWxsIHNpbmNlIHRoZSBhcHBsaWNhdGlvbiByZWNlaXZlcyBhIG5ldmVyCgkJICAgZW5kaW5nIHN0cmVhbSBvZiBiYWQgZGF0YSAtIGV2ZW4gdGhvdWdoIG5ldyBkYXRhIGhhc24ndCBiZWVuIHNlbnQuCgkJICAgVGhlcmVmb3JlIEkgKGJpbGwpIGhhdmUgdGFrZW4gdGhpcyBvdXQuCgkJICAgSG93ZXZlciAtIHRoaXMgbWlnaHQgbWFrZSBzZW5zZSBmb3IgZnJhbWluZyBlcnJvcnMgYW5kIHNvIG9uCgkJICAgc28gSSBhbSBsZWF2aW5nIHRoZSBjb2RlIGluIGZvciBub3cuCgkJKi8KCQllbHNlIHsKCQkJaWYgKGVycm9yX2ZsYWcgIT0gVFRZX05PUk1BTCl7CgkJCQlkYmcoImVycm9yX2ZsYWcgaXMgbm90IG5vcm1hbCIpOwoJCQkJLyogSW4gdGhpcyBjYXNlIGl0IGlzIGp1c3Qgc3RhdHVzIC0gaWYgdGhhdCBpcyBhbiBlcnJvciBzZW5kIGEgYmFkIGNoYXJhY3RlciAqLwoJCQkJaWYodHR5LT5mbGlwLmNvdW50ID49IFRUWV9GTElQQlVGX1NJWkUpIHsKCQkJCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwoJCQkJfQoJCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCAweGZmLCBlcnJvcl9mbGFnKTsKCQkJCW5lZWRfZmxpcCA9IDE7CgkJCX0KCQl9CiNlbmRpZgoJfSAvKiAiZm9yKHBhY2tldF9vZmZzZXQ9MC4uLiIgKi8KCgkvKiBMb3cgbGF0ZW5jeSAqLwoJaWYgKG5lZWRfZmxpcCkgewoJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7Cgl9CgoJaWYgKHBhY2tldF9vZmZzZXQgPCB1cmItPmFjdHVhbF9sZW5ndGgpIHsKCQkvKiBub3QgY29tcGxldGVseSBwcm9jZXNzZWQgLSByZWNvcmQgcHJvZ3Jlc3MgKi8KCQlwcml2LT5yeF9wcm9jZXNzZWQgPSBwYWNrZXRfb2Zmc2V0OwoJCWRiZygiJXMgLSBpbmNvbXBsZXRlLCAlZCBieXRlcyBwcm9jZXNzZWQsICVkIHJlbWFpbiIsCgkJCQlfX0ZVTkNUSU9OX18sIHBhY2tldF9vZmZzZXQsCgkJCQl1cmItPmFjdHVhbF9sZW5ndGggLSBwYWNrZXRfb2Zmc2V0KTsKCQkvKiBjaGVjayBpZiB3ZSB3ZXJlIHRocm90dGxlZCB3aGlsZSBwcm9jZXNzaW5nICovCgkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJ4X2xvY2ssIGZsYWdzKTsKCQlpZiAocHJpdi0+cnhfZmxhZ3MgJiBUSFJPVFRMRUQpIHsKCQkJcHJpdi0+cnhfZmxhZ3MgfD0gQUNUVUFMTFlfVEhST1RUTEVEOwoJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yeF9sb2NrLCBmbGFncyk7CgkJCWRiZygiJXMgLSBkZWZlcnJpbmcgcmVtYWluZGVyIHVudGlsIHVudGhyb3R0bGVkIiwKCQkJCQlfX0ZVTkNUSU9OX18pOwoJCQlyZXR1cm47CgkJfQoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJ4X2xvY2ssIGZsYWdzKTsKCQkvKiBpZiB0aGUgcG9ydCBpcyBjbG9zZWQgc3RvcCB0cnlpbmcgdG8gcmVhZCAqLwoJCWlmIChwb3J0LT5vcGVuX2NvdW50ID4gMCl7CgkJCS8qIGRlbGF5IHByb2Nlc3Npbmcgb2YgcmVtYWluZGVyICovCgkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcHJpdi0+cnhfd29yaywgMSk7CgkJfSBlbHNlIHsKCQkJZGJnKCIlcyAtIHBvcnQgaXMgY2xvc2VkIiwgX19GVU5DVElPTl9fKTsKCQl9CgkJcmV0dXJuOwoJfQoKCS8qIHVyYiBpcyBjb21wbGV0ZWx5IHByb2Nlc3NlZCAqLwoJcHJpdi0+cnhfcHJvY2Vzc2VkID0gMDsKCgkvKiBpZiB0aGUgcG9ydCBpcyBjbG9zZWQgc3RvcCB0cnlpbmcgdG8gcmVhZCAqLwoJaWYgKHBvcnQtPm9wZW5fY291bnQgPiAwKXsKCQkvKiBDb250aW51ZSB0cnlpbmcgdG8gYWx3YXlzIHJlYWQgICovCgkJdXNiX2ZpbGxfYnVsa191cmIocG9ydC0+cmVhZF91cmIsIHBvcnQtPnNlcmlhbC0+ZGV2LAoJCQkgICAgICB1c2JfcmN2YnVsa3BpcGUocG9ydC0+c2VyaWFsLT5kZXYsIHBvcnQtPmJ1bGtfaW5fZW5kcG9pbnRBZGRyZXNzKSwKCQkJICAgICAgcG9ydC0+cmVhZF91cmItPnRyYW5zZmVyX2J1ZmZlciwgcG9ydC0+cmVhZF91cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsCgkJCSAgICAgIGZ0ZGlfcmVhZF9idWxrX2NhbGxiYWNrLCBwb3J0KTsKCgkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+cmVhZF91cmIsIEdGUF9BVE9NSUMpOwoJCWlmIChyZXN1bHQpCgkJCWVycigiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKCX0KCglyZXR1cm47Cn0gLyogZnRkaV9wcm9jZXNzX3JlYWQgKi8KCgpzdGF0aWMgdm9pZCBmdGRpX2JyZWFrX2N0bCggc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgaW50IGJyZWFrX3N0YXRlICkKewoJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKCV9fdTE2IHVyYl92YWx1ZSA9IDA7CgljaGFyIGJ1ZlsxXTsKCgkvKiBicmVha19zdGF0ZSA9IC0xIHRvIHR1cm4gb24gYnJlYWssIGFuZCAwIHRvIHR1cm4gb2ZmIGJyZWFrICovCgkvKiBzZWUgZHJpdmVycy9jaGFyL3R0eV9pby5jIHRvIHNlZSBpdCB1c2VkICovCgkvKiBsYXN0X3NldF9kYXRhX3VyYl92YWx1ZSBORVZFUiBoYXMgdGhlIGJyZWFrIGJpdCBzZXQgaW4gaXQgKi8KCglpZiAoYnJlYWtfc3RhdGUpIHsKCQl1cmJfdmFsdWUgPSBwcml2LT5sYXN0X3NldF9kYXRhX3VyYl92YWx1ZSB8IEZURElfU0lPX1NFVF9CUkVBSzsKCX0gZWxzZSB7CgkJdXJiX3ZhbHVlID0gcHJpdi0+bGFzdF9zZXRfZGF0YV91cmJfdmFsdWU7Cgl9CgoKCWlmICh1c2JfY29udHJvbF9tc2cocG9ydC0+c2VyaWFsLT5kZXYsIHVzYl9zbmRjdHJscGlwZShwb3J0LT5zZXJpYWwtPmRldiwgMCksCgkJCSAgICBGVERJX1NJT19TRVRfREFUQV9SRVFVRVNULAoJCQkgICAgRlRESV9TSU9fU0VUX0RBVEFfUkVRVUVTVF9UWVBFLAoJCQkgICAgdXJiX3ZhbHVlICwgcHJpdi0+aW50ZXJmYWNlLAoJCQkgICAgYnVmLCAwLCBXRFJfVElNRU9VVCkgPCAwKSB7CgkJZXJyKCIlcyBGQUlMRUQgdG8gZW5hYmxlL2Rpc2FibGUgYnJlYWsgc3RhdGUgKHN0YXRlIHdhcyAlZCkiLCBfX0ZVTkNUSU9OX18sYnJlYWtfc3RhdGUpOwoJfQoKCWRiZygiJXMgYnJlYWsgc3RhdGUgaXMgJWQgLSB1cmIgaXMgJWQiLCBfX0ZVTkNUSU9OX18sYnJlYWtfc3RhdGUsIHVyYl92YWx1ZSk7Cgp9CgoKLyogb2xkX3Rlcm1pb3MgY29udGFpbnMgdGhlIG9yaWdpbmFsIHRlcm1pb3Mgc2V0dGluZ3MgYW5kIHR0eS0+dGVybWlvcyBjb250YWlucwogKiB0aGUgbmV3IHNldHRpbmcgdG8gYmUgdXNlZAogKiBXQVJOSU5HOiBzZXRfdGVybWlvcyBjYWxscyB0aGlzIHdpdGggb2xkX3Rlcm1pb3MgaW4ga2VybmVsIHNwYWNlCiAqLwoKc3RhdGljIHZvaWQgZnRkaV9zZXRfdGVybWlvcyAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQp7IC8qIGZ0ZGlfdGVybWlvcyAqLwoJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OwoJdW5zaWduZWQgaW50IGNmbGFnID0gcG9ydC0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnOwoJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKCV9fdTE2IHVyYl92YWx1ZTsgLyogd2lsbCBob2xkIHRoZSBuZXcgZmxhZ3MgKi8KCWNoYXIgYnVmWzFdOyAvKiBQZXJoYXBzIEkgc2hvdWxkIGR5bmFtaWNhbGx5IGFsbG9jIHRoaXM/ICovCgoJLy8gQWRkZWQgZm9yIHhvbi94b2ZmIHN1cHBvcnQKCXVuc2lnbmVkIGludCBpZmxhZyA9IHBvcnQtPnR0eS0+dGVybWlvcy0+Y19pZmxhZzsKCXVuc2lnbmVkIGNoYXIgdnN0b3A7Cgl1bnNpZ25lZCBjaGFyIHZzdGFydDsKCglkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKCgkvKiBGb3JjZSBiYXVkIHJhdGUgaWYgdGhpcyBkZXZpY2UgcmVxdWlyZXMgaXQsIHVubGVzcyBpdCBpcyBzZXQgdG8gQjAuICovCglpZiAocHJpdi0+Zm9yY2VfYmF1ZCAmJiAoKHBvcnQtPnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSAhPSBCMCkpIHsKCQlkYmcoIiVzOiBmb3JjaW5nIGJhdWQgcmF0ZSBmb3IgdGhpcyBkZXZpY2UiLCBfX0ZVTkNUSU9OX18pOwoJCXBvcnQtPnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmPSB+Q0JBVUQ7CgkJcG9ydC0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnIHw9IHByaXYtPmZvcmNlX2JhdWQ7Cgl9CgoJLyogRm9yY2UgUlRTLUNUUyBpZiB0aGlzIGRldmljZSByZXF1aXJlcyBpdC4gKi8KCWlmIChwcml2LT5mb3JjZV9ydHNjdHMpIHsKCQlkYmcoIiVzOiBmb3JjaW5nIHJ0c2N0cyBmb3IgdGhpcyBkZXZpY2UiLCBfX0ZVTkNUSU9OX18pOwoJCXBvcnQtPnR0eS0+dGVybWlvcy0+Y19jZmxhZyB8PSBDUlRTQ1RTOwoJfQoKCWNmbGFnID0gcG9ydC0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnOwoKCS8qIEZJWE1FIC1Gb3IgdGhpcyBjdXQgSSBkb24ndCBjYXJlIGlmIHRoZSBsaW5lIGlzIHJlYWxseSBjaGFuZ2luZyBvcgoJICAgbm90ICAtIHNvIGp1c3QgZG8gdGhlIGNoYW5nZSByZWdhcmRsZXNzICAtIHNob3VsZCBiZSBhYmxlIHRvCgkgICBjb21wYXJlIG9sZF90ZXJtaW9zIGFuZCB0dHktPnRlcm1pb3MgKi8KCS8qIE5PVEUgVGhlc2Ugcm91dGluZXMgY2FuIGdldCBpbnRlcnJ1cHRlZCBieQoJICAgZnRkaV9zaW9fcmVhZF9idWxrX2NhbGxiYWNrICAtIG5lZWQgdG8gZXhhbWluZSB3aGF0IHRoaXMKICAgICAgICAgICBtZWFucyAtIGRvbid0IHNlZSBhbnkgcHJvYmxlbXMgeWV0ICovCgoJLyogU2V0IG51bWJlciBvZiBkYXRhIGJpdHMsIHBhcml0eSwgc3RvcCBiaXRzICovCgoJdXJiX3ZhbHVlID0gMDsKCXVyYl92YWx1ZSB8PSAoY2ZsYWcgJiBDU1RPUEIgPyBGVERJX1NJT19TRVRfREFUQV9TVE9QX0JJVFNfMiA6CgkJICAgICAgRlRESV9TSU9fU0VUX0RBVEFfU1RPUF9CSVRTXzEpOwoJdXJiX3ZhbHVlIHw9IChjZmxhZyAmIFBBUkVOQiA/CgkJICAgICAgKGNmbGFnICYgUEFST0REID8gRlRESV9TSU9fU0VUX0RBVEFfUEFSSVRZX09ERCA6CgkJICAgICAgIEZURElfU0lPX1NFVF9EQVRBX1BBUklUWV9FVkVOKSA6CgkJICAgICAgRlRESV9TSU9fU0VUX0RBVEFfUEFSSVRZX05PTkUpOwoJaWYgKGNmbGFnICYgQ1NJWkUpIHsKCQlzd2l0Y2ggKGNmbGFnICYgQ1NJWkUpIHsKCQljYXNlIENTNTogdXJiX3ZhbHVlIHw9IDU7IGRiZygiU2V0dGluZyBDUzUiKTsgYnJlYWs7CgkJY2FzZSBDUzY6IHVyYl92YWx1ZSB8PSA2OyBkYmcoIlNldHRpbmcgQ1M2Iik7IGJyZWFrOwoJCWNhc2UgQ1M3OiB1cmJfdmFsdWUgfD0gNzsgZGJnKCJTZXR0aW5nIENTNyIpOyBicmVhazsKCQljYXNlIENTODogdXJiX3ZhbHVlIHw9IDg7IGRiZygiU2V0dGluZyBDUzgiKTsgYnJlYWs7CgkJZGVmYXVsdDoKCQkJZXJyKCJDU0laRSB3YXMgc2V0IGJ1dCBub3QgQ1M1LUNTOCIpOwoJCX0KCX0KCgkvKiBUaGlzIGlzIG5lZWRlZCBieSB0aGUgYnJlYWsgY29tbWFuZCBzaW5jZSBpdCB1c2VzIHRoZSBzYW1lIGNvbW1hbmQgLSBidXQgaXMKCSAqICBvcidlZCB3aXRoIHRoaXMgdmFsdWUgICovCglwcml2LT5sYXN0X3NldF9kYXRhX3VyYl92YWx1ZSA9IHVyYl92YWx1ZTsKCglpZiAodXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3NuZGN0cmxwaXBlKGRldiwgMCksCgkJCSAgICBGVERJX1NJT19TRVRfREFUQV9SRVFVRVNULAoJCQkgICAgRlRESV9TSU9fU0VUX0RBVEFfUkVRVUVTVF9UWVBFLAoJCQkgICAgdXJiX3ZhbHVlICwgcHJpdi0+aW50ZXJmYWNlLAoJCQkgICAgYnVmLCAwLCBXRFJfU0hPUlRfVElNRU9VVCkgPCAwKSB7CgkJZXJyKCIlcyBGQUlMRUQgdG8gc2V0IGRhdGFiaXRzL3N0b3BiaXRzL3Bhcml0eSIsIF9fRlVOQ1RJT05fXyk7Cgl9CgoJLyogTm93IGRvIHRoZSBiYXVkcmF0ZSAqLwoJaWYgKChjZmxhZyAmIENCQVVEKSA9PSBCMCApIHsKCQkvKiBEaXNhYmxlIGZsb3cgY29udHJvbCAqLwoJCWlmICh1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKCQkJCSAgICBGVERJX1NJT19TRVRfRkxPV19DVFJMX1JFUVVFU1QsCgkJCQkgICAgRlRESV9TSU9fU0VUX0ZMT1dfQ1RSTF9SRVFVRVNUX1RZUEUsCgkJCQkgICAgMCwgcHJpdi0+aW50ZXJmYWNlLAoJCQkJICAgIGJ1ZiwgMCwgV0RSX1RJTUVPVVQpIDwgMCkgewoJCQllcnIoIiVzIGVycm9yIGZyb20gZGlzYWJsZSBmbG93Y29udHJvbCB1cmIiLCBfX0ZVTkNUSU9OX18pOwoJCX0KCQkvKiBEcm9wIFJUUyBhbmQgRFRSICovCgkJY2xlYXJfbWN0cmwocG9ydCwgVElPQ01fRFRSIHwgVElPQ01fUlRTKTsKCX0gZWxzZSB7CgkJLyogc2V0IHRoZSBiYXVkcmF0ZSBkZXRlcm1pbmVkIGJlZm9yZSAqLwoJCWlmIChjaGFuZ2Vfc3BlZWQocG9ydCkpIHsKCQkJZXJyKCIlcyB1cmIgZmFpbGVkIHRvIHNldCBiYXVkcmF0ZSIsIF9fRlVOQ1RJT05fXyk7CgkJfQoJCS8qIEVuc3VyZSBSVFMgYW5kIERUUiBhcmUgcmFpc2VkIHdoZW4gYmF1ZHJhdGUgY2hhbmdlZCBmcm9tIDAgKi8KCQlpZiAoIW9sZF90ZXJtaW9zIHx8IChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSA9PSBCMCkgewoJCQlzZXRfbWN0cmwocG9ydCwgVElPQ01fRFRSIHwgVElPQ01fUlRTKTsKCQl9Cgl9CgoJLyogU2V0IGZsb3cgY29udHJvbCAqLwoJLyogTm90ZSBkZXZpY2UgYWxzbyBzdXBwb3J0cyBEVFIvQ0QgKHVnaCkgYW5kIFhvbi9Yb2ZmIGluIGhhcmR3YXJlICovCglpZiAoY2ZsYWcgJiBDUlRTQ1RTKSB7CgkJZGJnKCIlcyBTZXR0aW5nIHRvIENSVFNDVFMgZmxvdyBjb250cm9sIiwgX19GVU5DVElPTl9fKTsKCQlpZiAodXNiX2NvbnRyb2xfbXNnKGRldiwKCQkJCSAgICB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKCQkJCSAgICBGVERJX1NJT19TRVRfRkxPV19DVFJMX1JFUVVFU1QsCgkJCQkgICAgRlRESV9TSU9fU0VUX0ZMT1dfQ1RSTF9SRVFVRVNUX1RZUEUsCgkJCQkgICAgMCAsIChGVERJX1NJT19SVFNfQ1RTX0hTIHwgcHJpdi0+aW50ZXJmYWNlKSwKCQkJCSAgICBidWYsIDAsIFdEUl9USU1FT1VUKSA8IDApIHsKCQkJZXJyKCJ1cmIgZmFpbGVkIHRvIHNldCB0byBydHMvY3RzIGZsb3cgY29udHJvbCIpOwoJCX0KCgl9IGVsc2UgewoJCS8qCgkJICogWG9uL1hvZmYgY29kZQoJCSAqCgkJICogQ2hlY2sgdGhlIElYT0ZGIHN0YXR1cyBpbiB0aGUgaWZsYWcgY29tcG9uZW50IG9mIHRoZSB0ZXJtaW9zIHN0cnVjdHVyZQoJCSAqIGlmIElYT0ZGIGlzIG5vdCBzZXQsIHRoZSBwcmUteG9uL3hvZmYgY29kZSBpcyBleGVjdXRlZC4KCQkqLwoJCWlmIChpZmxhZyAmIElYT0ZGKSB7CgkJCWRiZygiJXMgIHJlcXVlc3QgdG8gZW5hYmxlIHhvbnhvZmYgaWZsYWc9JTA0eCIsX19GVU5DVElPTl9fLGlmbGFnKTsKCQkJLy8gVHJ5IHRvIGVuYWJsZSB0aGUgWE9OL1hPRkYgb24gdGhlIGZ0ZGlfc2lvCgkJCS8vIFNldCB0aGUgdnN0YXJ0IGFuZCB2c3RvcCAtLSBjb3VsZCBoYXZlIGJlZW4gZG9uZSB1cCBhYm92ZSB3aGVyZQoJCQkvLyBhIGxvdCBvZiBvdGhlciBkZXJlZmVyZW5jaW5nIGlzIGRvbmUgYnV0IHRoYXQgd291bGQgYmUgdmVyeQoJCQkvLyBpbmVmZmljaWVudCBhcyB2c3RhcnQgYW5kIHZzdG9wIGFyZSBub3QgYWx3YXlzIG5lZWRlZAoJCQl2c3RhcnQ9cG9ydC0+dHR5LT50ZXJtaW9zLT5jX2NjW1ZTVEFSVF07CgkJCXZzdG9wPXBvcnQtPnR0eS0+dGVybWlvcy0+Y19jY1tWU1RPUF07CgkJCXVyYl92YWx1ZT0odnN0b3AgPDwgOCkgfCAodnN0YXJ0KTsKCgkJCWlmICh1c2JfY29udHJvbF9tc2coZGV2LAoJCQkJCSAgICB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKCQkJCQkgICAgRlRESV9TSU9fU0VUX0ZMT1dfQ1RSTF9SRVFVRVNULAoJCQkJCSAgICBGVERJX1NJT19TRVRfRkxPV19DVFJMX1JFUVVFU1RfVFlQRSwKCQkJCQkgICAgdXJiX3ZhbHVlICwgKEZURElfU0lPX1hPTl9YT0ZGX0hTCgkJCQkJCQkgfCBwcml2LT5pbnRlcmZhY2UpLAoJCQkJCSAgICBidWYsIDAsIFdEUl9USU1FT1VUKSA8IDApIHsKCQkJCWVycigidXJiIGZhaWxlZCB0byBzZXQgdG8geG9uL3hvZmYgZmxvdyBjb250cm9sIik7CgkJCX0KCQl9IGVsc2UgewoJCQkvKiBlbHNlIGNsYXVzZSB0byBvbmx5IHJ1biBpZiBjZmFnICEgQ1JUU0NUUyBhbmQgaWZsYWcgISBYT0ZGICovCgkJCS8qIENIRUNLTUUgQXNzdW1pbmcgWE9OL1hPRkYgaGFuZGxlZCBieSB0dHkgc3RhY2sgLSBub3QgYnkgZGV2aWNlICovCgkJCWRiZygiJXMgVHVybmluZyBvZmYgaGFyZHdhcmUgZmxvdyBjb250cm9sIiwgX19GVU5DVElPTl9fKTsKCQkJaWYgKHVzYl9jb250cm9sX21zZyhkZXYsCgkJCQkJICAgIHVzYl9zbmRjdHJscGlwZShkZXYsIDApLAoJCQkJCSAgICBGVERJX1NJT19TRVRfRkxPV19DVFJMX1JFUVVFU1QsCgkJCQkJICAgIEZURElfU0lPX1NFVF9GTE9XX0NUUkxfUkVRVUVTVF9UWVBFLAoJCQkJCSAgICAwLCBwcml2LT5pbnRlcmZhY2UsCgkJCQkJICAgIGJ1ZiwgMCwgV0RSX1RJTUVPVVQpIDwgMCkgewoJCQkJZXJyKCJ1cmIgZmFpbGVkIHRvIGNsZWFyIGZsb3cgY29udHJvbCIpOwoJCQl9CgkJfQoKCX0KCXJldHVybjsKfSAvKiBmdGRpX3Rlcm1pb3MgKi8KCgpzdGF0aWMgaW50IGZ0ZGlfdGlvY21nZXQgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxlKQp7CglzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwoJdW5zaWduZWQgY2hhciBidWZbMl07CglpbnQgcmV0OwoKCWRiZygiJXMgVElPQ01HRVQiLCBfX0ZVTkNUSU9OX18pOwoJc3dpdGNoIChwcml2LT5jaGlwX3R5cGUpIHsKCWNhc2UgU0lPOgoJCS8qIFJlcXVlc3QgdGhlIHN0YXR1cyBmcm9tIHRoZSBkZXZpY2UgKi8KCQlpZiAoKHJldCA9IHVzYl9jb250cm9sX21zZyhwb3J0LT5zZXJpYWwtPmRldiwKCQkJCQkgICB1c2JfcmN2Y3RybHBpcGUocG9ydC0+c2VyaWFsLT5kZXYsIDApLAoJCQkJCSAgIEZURElfU0lPX0dFVF9NT0RFTV9TVEFUVVNfUkVRVUVTVCwKCQkJCQkgICBGVERJX1NJT19HRVRfTU9ERU1fU1RBVFVTX1JFUVVFU1RfVFlQRSwKCQkJCQkgICAwLCAwLAoJCQkJCSAgIGJ1ZiwgMSwgV0RSX1RJTUVPVVQpKSA8IDAgKSB7CgkJCWVycigiJXMgQ291bGQgbm90IGdldCBtb2RlbSBzdGF0dXMgb2YgZGV2aWNlIC0gZXJyOiAlZCIsIF9fRlVOQ1RJT05fXywKCQkJICAgIHJldCk7CgkJCXJldHVybihyZXQpOwoJCX0KCQlicmVhazsKCWNhc2UgRlQ4VTIzMkFNOgoJY2FzZSBGVDIzMkJNOgoJY2FzZSBGVDIyMzJDOgoJCS8qIHRoZSA4VTIzMkFNIHJldHVybnMgYSB0d28gYnl0ZSB2YWx1ZSAodGhlIHNpbyBpcyBhIDEgYnl0ZSB2YWx1ZSkgLSBpbiB0aGUgc2FtZQoJCSAgIGZvcm1hdCBhcyB0aGUgZGF0YSByZXR1cm5lZCBmcm9tIHRoZSBpbiBwb2ludCAqLwoJCWlmICgocmV0ID0gdXNiX2NvbnRyb2xfbXNnKHBvcnQtPnNlcmlhbC0+ZGV2LAoJCQkJCSAgIHVzYl9yY3ZjdHJscGlwZShwb3J0LT5zZXJpYWwtPmRldiwgMCksCgkJCQkJICAgRlRESV9TSU9fR0VUX01PREVNX1NUQVRVU19SRVFVRVNULAoJCQkJCSAgIEZURElfU0lPX0dFVF9NT0RFTV9TVEFUVVNfUkVRVUVTVF9UWVBFLAoJCQkJCSAgIDAsIHByaXYtPmludGVyZmFjZSwKCQkJCQkgICBidWYsIDIsIFdEUl9USU1FT1VUKSkgPCAwICkgewoJCQllcnIoIiVzIENvdWxkIG5vdCBnZXQgbW9kZW0gc3RhdHVzIG9mIGRldmljZSAtIGVycjogJWQiLCBfX0ZVTkNUSU9OX18sCgkJCSAgICByZXQpOwoJCQlyZXR1cm4ocmV0KTsKCQl9CgkJYnJlYWs7CglkZWZhdWx0OgoJCXJldHVybiAtRUZBVUxUOwoJCWJyZWFrOwoJfQoKCXJldHVybiAgKGJ1ZlswXSAmIEZURElfU0lPX0RTUl9NQVNLID8gVElPQ01fRFNSIDogMCkgfAoJCShidWZbMF0gJiBGVERJX1NJT19DVFNfTUFTSyA/IFRJT0NNX0NUUyA6IDApIHwKCQkoYnVmWzBdICAmIEZURElfU0lPX1JJX01BU0sgID8gVElPQ01fUkkgIDogMCkgfAoJCShidWZbMF0gICYgRlRESV9TSU9fUkxTRF9NQVNLID8gVElPQ01fQ0QgIDogMCkgfAoJCXByaXYtPmxhc3RfZHRyX3J0czsKfQoKc3RhdGljIGludCBmdGRpX3Rpb2Ntc2V0KHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICogZmlsZSwgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQp7CglkYmcoIiVzIFRJT0NNU0VUIiwgX19GVU5DVElPTl9fKTsKCXJldHVybiB1cGRhdGVfbWN0cmwocG9ydCwgc2V0LCBjbGVhcik7Cn0KCgpzdGF0aWMgaW50IGZ0ZGlfaW9jdGwgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICogZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCnsKCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CgoJZGJnKCIlcyBjbWQgMHglMDR4IiwgX19GVU5DVElPTl9fLCBjbWQpOwoKCS8qIEJhc2VkIG9uIGNvZGUgZnJvbSBhY20uYyBhbmQgb3RoZXJzICovCglzd2l0Y2ggKGNtZCkgewoKCWNhc2UgVElPQ0dTRVJJQUw6IC8qIGdldHMgc2VyaWFsIHBvcnQgZGF0YSAqLwoJCXJldHVybiBnZXRfc2VyaWFsX2luZm8ocG9ydCwgKHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqKSBhcmcpOwoKCWNhc2UgVElPQ1NTRVJJQUw6IC8qIHNldHMgc2VyaWFsIHBvcnQgZGF0YSAqLwoJCXJldHVybiBzZXRfc2VyaWFsX2luZm8ocG9ydCwgKHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqKSBhcmcpOwoKCS8qCgkgKiBXYWl0IGZvciBhbnkgb2YgdGhlIDQgbW9kZW0gaW5wdXRzIChEQ0QsUkksRFNSLENUUykgdG8gY2hhbmdlCgkgKiAtIG1hc2sgcGFzc2VkIGluIGFyZyBmb3IgbGluZXMgb2YgaW50ZXJlc3QKCSAqICAgKHVzZSB8J2VkIFRJT0NNX1JORy9EU1IvQ0QvQ1RTIGZvciBtYXNraW5nKQoJICogQ2FsbGVyIHNob3VsZCB1c2UgVElPQ0dJQ09VTlQgdG8gc2VlIHdoaWNoIG9uZSBpdCB3YXMuCgkgKgoJICogVGhpcyBjb2RlIGlzIGJvcnJvd2VkIGZyb20gbGludXgvZHJpdmVycy9jaGFyL3NlcmlhbC5jCgkgKi8KCWNhc2UgVElPQ01JV0FJVDoKCQl3aGlsZSAocHJpdiAhPSBOVUxMKSB7CgkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJnByaXYtPmRlbHRhX21zcl93YWl0KTsKCQkJLyogc2VlIGlmIGEgc2lnbmFsIGRpZCBpdCAqLwoJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCgkJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwoJCQllbHNlIHsKCQkJCWNoYXIgZGlmZiA9IHByaXYtPmRpZmZfc3RhdHVzOwoKCQkJCWlmIChkaWZmID09IDApIHsKCQkJCQlyZXR1cm4gLUVJTzsgLyogbm8gY2hhbmdlID0+IGVycm9yICovCgkJCQl9CgoJCQkJLyogQ29uc3VtZSBhbGwgZXZlbnRzICovCgkJCQlwcml2LT5kaWZmX3N0YXR1cyA9IDA7CgoJCQkJLyogUmV0dXJuIDAgaWYgY2FsbGVyIHdhbnRlZCB0byBrbm93IGFib3V0IHRoZXNlIGJpdHMgKi8KCQkJCWlmICggKChhcmcgJiBUSU9DTV9STkcpICYmIChkaWZmICYgRlRESV9SUzBfUkkpKSB8fAoJCQkJICAgICAoKGFyZyAmIFRJT0NNX0RTUikgJiYgKGRpZmYgJiBGVERJX1JTMF9EU1IpKSB8fAoJCQkJICAgICAoKGFyZyAmIFRJT0NNX0NEKSAgJiYgKGRpZmYgJiBGVERJX1JTMF9STFNEKSkgfHwKCQkJCSAgICAgKChhcmcgJiBUSU9DTV9DVFMpICYmIChkaWZmICYgRlRESV9SUzBfQ1RTKSkgKSB7CgkJCQkJcmV0dXJuIDA7CgkJCQl9CgkJCQkvKgoJCQkJICogT3RoZXJ3aXNlIGNhbGxlciBjYW4ndCBjYXJlIGxlc3MgYWJvdXQgd2hhdCBoYXBwZW5lZCwKCQkJCSAqIGFuZCBzbyB3ZSBjb250aW51ZSB0byB3YWl0IGZvciBtb3JlIGV2ZW50cy4KCQkJCSAqLwoJCQl9CgkJfQoJCXJldHVybigwKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJYnJlYWs7CgoJfQoKCgkvKiBUaGlzIGlzIG5vdCBuZWNlc3NhcmlseSBhbiBlcnJvciAtIHR1cm5zIG91dCB0aGUgaGlnaGVyIGxheWVycyB3aWxsIGRvCgkgKiAgc29tZSBpb2N0bHMgaXRzZWxmIChzZWUgY29tbWVudCBhYm92ZSkKCSAqLwoJZGJnKCIlcyBhcmcgbm90IHN1cHBvcnRlZCAtIGl0IHdhcyAweCUwNHggLSBjaGVjayAvdXNyL2luY2x1ZGUvYXNtL2lvY3Rscy5oIiwgX19GVU5DVElPTl9fLCBjbWQpOwoKCXJldHVybigtRU5PSU9DVExDTUQpOwp9IC8qIGZ0ZGlfaW9jdGwgKi8KCgpzdGF0aWMgdm9pZCBmdGRpX3Rocm90dGxlIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQp7CglzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCglkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKCglzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cnhfbG9jaywgZmxhZ3MpOwoJcHJpdi0+cnhfZmxhZ3MgfD0gVEhST1RUTEVEOwoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cnhfbG9jaywgZmxhZ3MpOwp9CgoKc3RhdGljIHZvaWQgZnRkaV91bnRocm90dGxlIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQp7CglzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwoJaW50IGFjdHVhbGx5X3Rocm90dGxlZDsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CgoJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJ4X2xvY2ssIGZsYWdzKTsKCWFjdHVhbGx5X3Rocm90dGxlZCA9IHByaXYtPnJ4X2ZsYWdzICYgQUNUVUFMTFlfVEhST1RUTEVEOwoJcHJpdi0+cnhfZmxhZ3MgJj0gfihUSFJPVFRMRUQgfCBBQ1RVQUxMWV9USFJPVFRMRUQpOwoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cnhfbG9jaywgZmxhZ3MpOwoKCWlmIChhY3R1YWxseV90aHJvdHRsZWQpCgkJc2NoZWR1bGVfd29yaygmcHJpdi0+cnhfd29yayk7Cn0KCnN0YXRpYyBpbnQgX19pbml0IGZ0ZGlfaW5pdCAodm9pZCkKewoJaW50IHJldHZhbDsKCglkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKCWlmICh2ZW5kb3IgPiAwICYmIHByb2R1Y3QgPiAwKSB7CgkJLyogQWRkIHVzZXIgc3BlY2lmaWVkIFZJRC9QSUQgdG8gcmVzZXJ2ZWQgZWxlbWVudCBvZiB0YWJsZS4gKi8KCQlpbnQgaTsKCQlmb3IgKGkgPSAwOyBpZF90YWJsZV9jb21iaW5lZFtpXS5pZFZlbmRvcjsgaSsrKQoJCQk7CgkJaWRfdGFibGVfY29tYmluZWRbaV0ubWF0Y2hfZmxhZ3MgPSBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRTsKCQlpZF90YWJsZV9jb21iaW5lZFtpXS5pZFZlbmRvciA9IHZlbmRvcjsKCQlpZF90YWJsZV9jb21iaW5lZFtpXS5pZFByb2R1Y3QgPSBwcm9kdWN0OwoJfQoJcmV0dmFsID0gdXNiX3NlcmlhbF9yZWdpc3RlcigmZnRkaV9zaW9fZGV2aWNlKTsKCWlmIChyZXR2YWwpCgkJZ290byBmYWlsZWRfc2lvX3JlZ2lzdGVyOwoJcmV0dmFsID0gdXNiX3JlZ2lzdGVyKCZmdGRpX2RyaXZlcik7CglpZiAocmV0dmFsKQoJCWdvdG8gZmFpbGVkX3VzYl9yZWdpc3RlcjsKCglpbmZvKERSSVZFUl9WRVJTSU9OICI6IiBEUklWRVJfREVTQyk7CglyZXR1cm4gMDsKZmFpbGVkX3VzYl9yZWdpc3RlcjoKCXVzYl9zZXJpYWxfZGVyZWdpc3RlcigmZnRkaV9zaW9fZGV2aWNlKTsKZmFpbGVkX3Npb19yZWdpc3RlcjoKCXJldHVybiByZXR2YWw7Cn0KCgpzdGF0aWMgdm9pZCBfX2V4aXQgZnRkaV9leGl0ICh2b2lkKQp7CgoJZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CgoJdXNiX2RlcmVnaXN0ZXIgKCZmdGRpX2RyaXZlcik7Cgl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIgKCZmdGRpX3Npb19kZXZpY2UpOwoKfQoKCm1vZHVsZV9pbml0KGZ0ZGlfaW5pdCk7Cm1vZHVsZV9leGl0KGZ0ZGlfZXhpdCk7CgpNT0RVTEVfQVVUSE9SKCBEUklWRVJfQVVUSE9SICk7Ck1PRFVMRV9ERVNDUklQVElPTiggRFJJVkVSX0RFU0MgKTsKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwoKbW9kdWxlX3BhcmFtKGRlYnVnLCBib29sLCBTX0lSVUdPIHwgU19JV1VTUik7Ck1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1ZyBlbmFibGVkIG9yIG5vdCIpOwptb2R1bGVfcGFyYW0odmVuZG9yLCB1c2hvcnQsIDApOwpNT0RVTEVfUEFSTV9ERVNDKHZlbmRvciwgIlVzZXIgc3BlY2lmaWVkIHZlbmRvciBJRCAoZGVmYXVsdD0iCgkJX19NT0RVTEVfU1RSSU5HKEZURElfVklEKSIpIik7Cm1vZHVsZV9wYXJhbShwcm9kdWN0LCB1c2hvcnQsIDApOwpNT0RVTEVfUEFSTV9ERVNDKHZlbmRvciwgIlVzZXIgc3BlY2lmaWVkIHByb2R1Y3QgSUQiKTsKCg==