LyoKICAgIE5ldFdpbmRlciBGbG9hdGluZyBQb2ludCBFbXVsYXRvcgogICAgKGMpIFJlYmVsLkNPTSwgMTk5OCwxOTk5CgogICAgRGlyZWN0IHF1ZXN0aW9ucywgY29tbWVudHMgdG8gU2NvdHQgQmFtYnJvdWdoIDxzY290dGJAbmV0d2luZGVyLm9yZz4KCiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKi8KCiNpZm5kZWYgX19GUE9QQ09ERV9IX18KI2RlZmluZSBfX0ZQT1BDT0RFX0hfXwoKLyoKQVJNIEZsb2F0aW5nIFBvaW50IEluc3RydWN0aW9uIENsYXNzZXMKfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgCnxjIG8gbiBkfDEgMSAwIFB8VXx1fFd8THwgICBSbiAgfHZ8ICBGZCB8MHwwfDB8MXwgIG8gZiBmIHMgZSB0ICB8IENQRFQKfGMgbyBuIGR8MSAxIDAgUHxVfHd8V3xMfCAgIFJuICB8eHwgIEZkIHwwfDB8MHwxfCAgbyBmIGYgcyBlIHQgIHwgQ1BEVAp8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCAKfGMgbyBuIGR8MSAxIDEgMHxhfGJ8Y3xkfGV8ICBGbiB8anwgIEZkIHwwfDB8MHwxfGZ8Z3xofDB8aXwgIEZtIHwgQ1BETwp8YyBvIG4gZHwxIDEgMSAwfGF8YnxjfEx8ZXwgIEZuIHwgICBSZCAgfDB8MHwwfDF8ZnxnfGh8MXxpfCAgRm0gfCBDUFJUCnxjIG8gbiBkfDEgMSAxIDB8YXxifGN8MXxlfCAgRm4gfDF8MXwxfDF8MHwwfDB8MXxmfGd8aHwxfGl8ICBGbSB8IGNvbXBhcmlzb25zCnwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IHwgfCB8IAoKQ1BEVAkJZGF0YSB0cmFuc2ZlciBpbnN0cnVjdGlvbnMKCQlMREYsIFNURiwgTEZNLCBTRk0KCQkKQ1BETwkJZHlhZGljIGFyaXRobWV0aWMgaW5zdHJ1Y3Rpb25zCgkJQURGLCBNVUYsIFNVRiwgUlNGLCBEVkYsIFJERiwKCQlQT1csIFJQVywgUk1GLCBGTUwsIEZEViwgRlJELCBQT0wKCkNQRE8JCW1vbmFkaWMgYXJpdGhtZXRpYyBpbnN0cnVjdGlvbnMKCQlNVkYsIE1ORiwgQUJTLCBSTkQsIFNRVCwgTE9HLCBMR04sIEVYUCwKCQlTSU4sIENPUywgVEFOLCBBU04sIEFDUywgQVROLCBVUkQsIE5STQoJCQpDUFJUCQlqb2ludCBhcml0aG1ldGljL2RhdGEgdHJhbnNmZXIgaW5zdHJ1Y3Rpb25zCgkJRklYIChhcml0aG1ldGljIGZvbGxvd2VkIGJ5IGxvYWQvc3RvcmUpCgkJRkxUIChsb2FkL3N0b3JlIGZvbGxvd2VkIGJ5IGFyaXRobWV0aWMpCgkJQ01GLCBDTkYgQ01GRSwgQ05GRSAoY29tcGFyaXNvbnMpCgkJV0ZTLCBSRlMgKHdyaXRlL3JlYWQgZmxvYXRpbmcgcG9pbnQgc3RhdHVzIHJlZ2lzdGVyKQoJCVdGQywgUkZDICh3cml0ZS9yZWFkIGZsb2F0aW5nIHBvaW50IGNvbnRyb2wgcmVnaXN0ZXIpCgpjb25kCQljb25kaXRpb24gY29kZXMKUAkJcHJlL3Bvc3QgaW5kZXggYml0OiAwID0gcG9zdGluZGV4LCAxID0gcHJlaW5kZXgKVQkJdXAvZG93biBiaXQ6IDAgPSBzdGFjayBncm93cyBkb3duLCAxID0gc3RhY2sgZ3Jvd3MgdXAKVwkJd3JpdGUgYmFjayBiaXQ6IDEgPSB1cGRhdGUgYmFzZSByZWdpc3RlciAoUm4pCkwJCWxvYWQvc3RvcmUgYml0OiAwID0gc3RvcmUsIDEgPSBsb2FkClJuCQliYXNlIHJlZ2lzdGVyClJkCQlkZXN0aW5hdGlvbi9zb3VyY2UgcmVnaXN0ZXIJCQpGZAkJZmxvYXRpbmcgcG9pbnQgZGVzdGluYXRpb24gcmVnaXN0ZXIKRm4JCWZsb2F0aW5nIHBvaW50IHNvdXJjZSByZWdpc3RlcgpGbQkJZmxvYXRpbmcgcG9pbnQgc291cmNlIHJlZ2lzdGVyIG9yIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50Cgp1dgkJdHJhbnNmZXIgbGVuZ3RoIChUQUJMRSAxKQp3eAkJcmVnaXN0ZXIgY291bnQgKFRBQkxFIDIpCmFiY2QJCWFyaXRobWV0aWMgb3Bjb2RlIChUQUJMRVMgMyAmIDQpCmVmCQlkZXN0aW5hdGlvbiBzaXplIChyb3VuZGluZyBwcmVjaXNpb24pIChUQUJMRSA1KQpnaAkJcm91bmRpbmcgbW9kZSAoVEFCTEUgNikKagkJZHlhZGljL21vbmFkaWMgYml0OiAwID0gZHlhZGljLCAxID0gbW9uYWRpYwppIAkJY29uc3RhbnQgYml0OiAxID0gY29uc3RhbnQgKFRBQkxFIDYpCiovCgovKgpUQUJMRSAxCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLSstLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSsKfCAgUHJlY2lzaW9uICAgICAgICAgICAgICB8IHUgfCB2IHwgRlBTUi5FUCB8IGxlbmd0aCAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0rLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rCnwgU2luZ2xlICAgICAgICAgICAgICAgICAgfCAwIPwgMCB8ICAgIHggICAgfCAxIHdvcmRzIHwKfCBEb3VibGUgICAgICAgICAgICAgICAgICB8IDEg/CAxIHwgICAgeCAgICB8IDIgd29yZHMgfAp8IEV4dGVuZGVkICAgICAgICAgICAgICAgIHwgMSD8IDEgfCAgICB4ICAgIHwgMyB3b3JkcyB8CnwgUGFja2VkIGRlY2ltYWwgICAgICAgICAgfCAxIPwgMSB8ICAgIDAgICAgfCAzIHdvcmRzIHwKfCBFeHBhbmRlZCBwYWNrZWQgZGVjaW1hbCB8IDEg/CAxIHwgICAgMSAgICB8IDQgd29yZHMgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0rLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rCk5vdGU6IHggPSBkb24ndCBjYXJlCiovCgovKgpUQUJMRSAyCistLS0rLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCB3IHwgeCB8IE51bWJlciBvZiByZWdpc3RlcnMgdG8gdHJhbnNmZXIgfAorLS0tKy0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgMCD8IDEgfCAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCAxIPwgMCB8ICAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IDEg/CAxIHwgIDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgMCD8IDAgfCAgNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLSstLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoqLwoKLyoKVEFCTEUgMzogRHlhZGljIEZsb2F0aW5nIFBvaW50IE9wY29kZXMKKy0tLSstLS0rLS0tKy0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGEgfCBiIHwgYyB8IGQgfCBNbmVtb25pYyB8IERlc2NyaXB0aW9uICAgICAgICAgICB8IE9wZXJhdGlvbiAgICAgICAgICAgICB8CistLS0rLS0tKy0tLSstLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCAwIHwgMCB8IDAgfCAwIHwgQURGICAgICAgfCBBZGQgICAgICAgICAgICAgICAgICAgfCBGZCA6PSBGbiArIEZtICAgICAgICAgfAp8IDAgfCAwIHwgMCB8IDEgfCBNVUYgICAgICB8IE11bHRpcGx5ICAgICAgICAgICAgICB8IEZkIDo9IEZuICogRm0gICAgICAgICB8CnwgMCB8IDAgfCAxIHwgMCB8IFNVRiAgICAgIHwgU3VidHJhY3QgICAgICAgICAgICAgIHwgRmQgOj0gRm4gLSBGbSAgICAgICAgIHwKfCAwIHwgMCB8IDEgfCAxIHwgUlNGICAgICAgfCBSZXZlcnNlIHN1YnRyYWN0ICAgICAgfCBGZCA6PSBGbSAtIEZuICAgICAgICAgfAp8IDAgfCAxIHwgMCB8IDAgfCBEVkYgICAgICB8IERpdmlkZSAgICAgICAgICAgICAgICB8IEZkIDo9IEZuIC8gRm0gICAgICAgICB8CnwgMCB8IDEgfCAwIHwgMSB8IFJERiAgICAgIHwgUmV2ZXJzZSBkaXZpZGUgICAgICAgIHwgRmQgOj0gRm0gLyBGbiAgICAgICAgIHwKfCAwIHwgMSB8IDEgfCAwIHwgUE9XICAgICAgfCBQb3dlciAgICAgICAgICAgICAgICAgfCBGZCA6PSBGbiBeIEZtICAgICAgICAgfAp8IDAgfCAxIHwgMSB8IDEgfCBSUFcgICAgICB8IFJldmVyc2UgcG93ZXIgICAgICAgICB8IEZkIDo9IEZtIF4gRm4gICAgICAgICB8CnwgMSB8IDAgfCAwIHwgMCB8IFJNRiAgICAgIHwgUmVtYWluZGVyICAgICAgICAgICAgIHwgRmQgOj0gSUVFRSByZW0oRm4vRm0pIHwKfCAxIHwgMCB8IDAgfCAxIHwgRk1MICAgICAgfCBGYXN0IE11bHRpcGx5ICAgICAgICAgfCBGZCA6PSBGbiAqIEZtICAgICAgICAgfAp8IDEgfCAwIHwgMSB8IDAgfCBGRFYgICAgICB8IEZhc3QgRGl2aWRlICAgICAgICAgICB8IEZkIDo9IEZuIC8gRm0gICAgICAgICB8CnwgMSB8IDAgfCAxIHwgMSB8IEZSRCAgICAgIHwgRmFzdCByZXZlcnNlIGRpdmlkZSAgIHwgRmQgOj0gRm0gLyBGbiAgICAgICAgIHwKfCAxIHwgMSB8IDAgfCAwIHwgUE9MICAgICAgfCBQb2xhciBhbmdsZSAoQXJjVGFuMikgfCBGZCA6PSBhcmN0YW4yKEZuLEZtKSAgfAp8IDEgfCAxIHwgMCB8IDEgfCAgICAgICAgICB8IHVuZGVmaW5lZCBpbnN0cnVjdGlvbiB8IHRyYXAgICAgICAgICAgICAgICAgICB8CnwgMSB8IDEgfCAxIHwgMCB8ICAgICAgICAgIHwgdW5kZWZpbmVkIGluc3RydWN0aW9uIHwgdHJhcCAgICAgICAgICAgICAgICAgIHwKfCAxIHwgMSB8IDEgfCAxIHwgICAgICAgICAgfCB1bmRlZmluZWQgaW5zdHJ1Y3Rpb24gfCB0cmFwICAgICAgICAgICAgICAgICAgfAorLS0tKy0tLSstLS0rLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCk5vdGU6IFBPVywgUlBXLCBQT0wgYXJlIGRlcHJlY2F0ZWQsIGFuZCBhcmUgYXZhaWxhYmxlIGZvciBiYWNrd2FyZHMKICAgICAgY29tcGF0aWJpbGl0eSBvbmx5LgoqLwoKLyoKVEFCTEUgNDogTW9uYWRpYyBGbG9hdGluZyBQb2ludCBPcGNvZGVzCistLS0rLS0tKy0tLSstLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBhIHwgYiB8IGMgfCBkIHwgTW5lbW9uaWMgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgfCBPcGVyYXRpb24gICAgICAgICAgICAgfAorLS0tKy0tLSstLS0rLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgMCB8IDAgfCAwIHwgMCB8IE1WRiAgICAgIHwgTW92ZSAgICAgICAgICAgICAgICAgIHwgRmQgOj0gRm0gICAgICAgICAgICAgIHwKfCAwIHwgMCB8IDAgfCAxIHwgTU5GICAgICAgfCBNb3ZlIG5lZ2F0ZWQgICAgICAgICAgfCBGZCA6PSAtIEZtICAgICAgICAgICAgfAp8IDAgfCAwIHwgMSB8IDAgfCBBQlMgICAgICB8IEFic29sdXRlIHZhbHVlICAgICAgICB8IEZkIDo9IGFicyhGbSkgICAgICAgICB8CnwgMCB8IDAgfCAxIHwgMSB8IFJORCAgICAgIHwgUm91bmQgdG8gaW50ZWdlciAgICAgIHwgRmQgOj0gaW50KEZtKSAgICAgICAgIHwKfCAwIHwgMSB8IDAgfCAwIHwgU1FUICAgICAgfCBTcXVhcmUgcm9vdCAgICAgICAgICAgfCBGZCA6PSBzcXJ0KEZtKSAgICAgICAgfAp8IDAgfCAxIHwgMCB8IDEgfCBMT0cgICAgICB8IExvZyBiYXNlIDEwICAgICAgICAgICB8IEZkIDo9IGxvZzEwKEZtKSAgICAgICB8CnwgMCB8IDEgfCAxIHwgMCB8IExHTiAgICAgIHwgTG9nIGJhc2UgZSAgICAgICAgICAgIHwgRmQgOj0gbG4oRm0pICAgICAgICAgIHwKfCAwIHwgMSB8IDEgfCAxIHwgRVhQICAgICAgfCBFeHBvbmVudCAgICAgICAgICAgICAgfCBGZCA6PSBlIF4gRm0gICAgICAgICAgfAp8IDEgfCAwIHwgMCB8IDAgfCBTSU4gICAgICB8IFNpbmUgICAgICAgICAgICAgICAgICB8IEZkIDo9IHNpbihGbSkgICAgICAgICB8CnwgMSB8IDAgfCAwIHwgMSB8IENPUyAgICAgIHwgQ29zaW5lICAgICAgICAgICAgICAgIHwgRmQgOj0gY29zKEZtKSAgICAgICAgIHwKfCAxIHwgMCB8IDEgfCAwIHwgVEFOICAgICAgfCBUYW5nZW50ICAgICAgICAgICAgICAgfCBGZCA6PSB0YW4oRm0pICAgICAgICAgfAp8IDEgfCAwIHwgMSB8IDEgfCBBU04gICAgICB8IEFyYyBTaW5lICAgICAgICAgICAgICB8IEZkIDo9IGFyY3NpbihGbSkgICAgICB8CnwgMSB8IDEgfCAwIHwgMCB8IEFDUyAgICAgIHwgQXJjIENvc2luZSAgICAgICAgICAgIHwgRmQgOj0gYXJjY29zKEZtKSAgICAgIHwKfCAxIHwgMSB8IDAgfCAxIHwgQVROICAgICAgfCBBcmMgVGFuZ2VudCAgICAgICAgICAgfCBGZCA6PSBhcmN0YW4oRm0pICAgICAgfAp8IDEgfCAxIHwgMSB8IDAgfCBVUkQgICAgICB8IFVubm9ybWFsaXplZCByb3VuZCAgICB8IEZkIDo9IGludChGbSkgICAgICAgICB8CnwgMSB8IDEgfCAxIHwgMSB8IE5STSAgICAgIHwgTm9ybWFsaXplICAgICAgICAgICAgIHwgRmQgOj0gbm9ybShGbSkgICAgICAgIHwKKy0tLSstLS0rLS0tKy0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwpOb3RlOiBMT0csIExHTiwgRVhQLCBTSU4sIENPUywgVEFOLCBBU04sIEFDUywgQVROIGFyZSBkZXByZWNhdGVkLCBhbmQgYXJlCiAgICAgIGF2YWlsYWJsZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb25seS4KKi8KCi8qClRBQkxFIDUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tKy0tLSsKfCAgUm91bmRpbmcgUHJlY2lzaW9uICAgICB8IGUgfCBmIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tKy0tLSsKfCBJRUVFIFNpbmdsZSBwcmVjaXNpb24gICB8IDAg/CAwIHwKfCBJRUVFIERvdWJsZSBwcmVjaXNpb24gICB8IDAg/CAxIHwKfCBJRUVFIEV4dGVuZGVkIHByZWNpc2lvbiB8IDEg/CAwIHwKfCB1bmRlZmluZWQgKHRyYXApICAgICAgICB8IDEg/CAxIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tKy0tLSsKKi8KCi8qClRBQkxFIDUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0rLS0tKwp8ICBSb3VuZGluZyBNb2RlICAgICAgICAgICAgICAgICAgfCBnIHwgaCB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tKy0tLSsKfCBSb3VuZCB0byBuZWFyZXN0IChkZWZhdWx0KSAgICAgIHwgMCD8IDAgfAp8IFJvdW5kIHRvd2FyZCBwbHVzIGluZmluaXR5ICAgICAgfCAwIPwgMSB8CnwgUm91bmQgdG93YXJkIG5lZ2F0aXZlIGluZmluaXR5ICB8IDEg/CAwIHwKfCBSb3VuZCB0b3dhcmQgemVybyAgICAgICAgICAgICAgIHwgMSD8IDEgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLSstLS0rCiovCgovKgo9PT0KPT09IERlZmluaXRpb25zIGZvciBsb2FkIGFuZCBzdG9yZSBpbnN0cnVjdGlvbnMKPT09CiovCgovKiBiaXQgbWFza3MgKi8KI2RlZmluZSBCSVRfUFJFSU5ERVgJMHgwMTAwMDAwMAojZGVmaW5lIEJJVF9VUAkJMHgwMDgwMDAwMAojZGVmaW5lIEJJVF9XUklURV9CQUNLCTB4MDAyMDAwMDAKI2RlZmluZSBCSVRfTE9BRAkweDAwMTAwMDAwCgovKiBtYXNrcyBmb3IgbG9hZC9zdG9yZSAqLwojZGVmaW5lIE1BU0tfQ1BEVAkJMHgwYzAwMDAwMCAgLyogZGF0YSBwcm9jZXNzaW5nIG9wY29kZSAqLwojZGVmaW5lIE1BU0tfT0ZGU0VUCQkweDAwMDAwMGZmCiNkZWZpbmUgTUFTS19UUkFOU0ZFUl9MRU5HVEgJMHgwMDQwODAwMAojZGVmaW5lIE1BU0tfUkVHSVNURVJfQ09VTlQJTUFTS19UUkFOU0ZFUl9MRU5HVEgKI2RlZmluZSBNQVNLX0NPUFJPQ0VTU09SCTB4MDAwMDBmMDAKCi8qIFRlc3RzIGZvciB0cmFuc2ZlciBsZW5ndGggKi8KI2RlZmluZSBUUkFOU0ZFUl9TSU5HTEUJCTB4MDAwMDAwMDAKI2RlZmluZSBUUkFOU0ZFUl9ET1VCTEUJCTB4MDAwMDgwMDAKI2RlZmluZSBUUkFOU0ZFUl9FWFRFTkRFRAkweDAwNDAwMDAwCiNkZWZpbmUgVFJBTlNGRVJfUEFDS0VECQlNQVNLX1RSQU5TRkVSX0xFTkdUSAoKLyogR2V0IHRoZSBjb3Byb2Nlc3NvciBudW1iZXIgZnJvbSB0aGUgb3Bjb2RlLiAqLwojZGVmaW5lIGdldENvcHJvY2Vzc29yTnVtYmVyKG9wY29kZSkJKChvcGNvZGUgJiBNQVNLX0NPUFJPQ0VTU09SKSA+PiA4KQoKLyogR2V0IHRoZSBvZmZzZXQgZnJvbSB0aGUgb3Bjb2RlLiAqLwojZGVmaW5lIGdldE9mZnNldChvcGNvZGUpCQkob3Bjb2RlICYgTUFTS19PRkZTRVQpCgovKiBUZXN0cyBmb3Igc3BlY2lmaWMgZGF0YSB0cmFuc2ZlciBsb2FkL3N0b3JlIG9wY29kZXMuICovCiNkZWZpbmUgVEVTVF9PUENPREUob3Bjb2RlLG1hc2spCSgoKG9wY29kZSkgJiAobWFzaykpID09IChtYXNrKSkKCiNkZWZpbmUgTE9BRF9PUChvcGNvZGUpICAgVEVTVF9PUENPREUoKG9wY29kZSksTUFTS19DUERUIHwgQklUX0xPQUQpCiNkZWZpbmUgU1RPUkVfT1Aob3Bjb2RlKSAgKChvcGNvZGUgJiAoTUFTS19DUERUIHwgQklUX0xPQUQpKSA9PSBNQVNLX0NQRFQpCgojZGVmaW5lIExERl9PUChvcGNvZGUpCShMT0FEX09QKG9wY29kZSkgJiYgKGdldENvcHJvY2Vzc29yTnVtYmVyKG9wY29kZSkgPT0gMSkpCiNkZWZpbmUgTEZNX09QKG9wY29kZSkJKExPQURfT1Aob3Bjb2RlKSAmJiAoZ2V0Q29wcm9jZXNzb3JOdW1iZXIob3Bjb2RlKSA9PSAyKSkKI2RlZmluZSBTVEZfT1Aob3Bjb2RlKQkoU1RPUkVfT1Aob3Bjb2RlKSAmJiAoZ2V0Q29wcm9jZXNzb3JOdW1iZXIob3Bjb2RlKSA9PSAxKSkKI2RlZmluZSBTRk1fT1Aob3Bjb2RlKQkoU1RPUkVfT1Aob3Bjb2RlKSAmJiAoZ2V0Q29wcm9jZXNzb3JOdW1iZXIob3Bjb2RlKSA9PSAyKSkKCiNkZWZpbmUgUFJFSU5ERVhFRChvcGNvZGUpCQkoKG9wY29kZSAmIEJJVF9QUkVJTkRFWCkgIT0gMCkKI2RlZmluZSBQT1NUSU5ERVhFRChvcGNvZGUpCQkoKG9wY29kZSAmIEJJVF9QUkVJTkRFWCkgPT0gMCkKI2RlZmluZSBCSVRfVVBfU0VUKG9wY29kZSkJCSgob3Bjb2RlICYgQklUX1VQKSAhPSAwKQojZGVmaW5lIEJJVF9VUF9DTEVBUihvcGNvZGUpCQkoKG9wY29kZSAmIEJJVF9ET1dOKSA9PSAwKQojZGVmaW5lIFdSSVRFX0JBQ0sob3Bjb2RlKQkJKChvcGNvZGUgJiBCSVRfV1JJVEVfQkFDSykgIT0gMCkKI2RlZmluZSBMT0FEKG9wY29kZSkJCQkoKG9wY29kZSAmIEJJVF9MT0FEKSAhPSAwKQojZGVmaW5lIFNUT1JFKG9wY29kZSkJCQkoKG9wY29kZSAmIEJJVF9MT0FEKSA9PSAwKQoKLyoKPT09Cj09PSBEZWZpbml0aW9ucyBmb3IgYXJpdGhtZXRpYyBpbnN0cnVjdGlvbnMKPT09CiovCi8qIGJpdCBtYXNrcyAqLwojZGVmaW5lIEJJVF9NT05BRElDCTB4MDAwMDgwMDAKI2RlZmluZSBCSVRfQ09OU1RBTlQJMHgwMDAwMDAwOAoKI2RlZmluZSBDT05TVEFOVF9GTShvcGNvZGUpCQkoKG9wY29kZSAmIEJJVF9DT05TVEFOVCkgIT0gMCkKI2RlZmluZSBNT05BRElDX0lOU1RSVUNUSU9OKG9wY29kZSkJKChvcGNvZGUgJiBCSVRfTU9OQURJQykgIT0gMCkKCi8qIGluc3RydWN0aW9uIGlkZW50aWZpY2F0aW9uIG1hc2tzICovCiNkZWZpbmUgTUFTS19DUERPCQkweDBlMDAwMDAwICAvKiBhcml0aG1ldGljIG9wY29kZSAqLwojZGVmaW5lIE1BU0tfQVJJVEhNRVRJQ19PUENPREUJMHgwMGYwODAwMAojZGVmaW5lIE1BU0tfREVTVElOQVRJT05fU0laRQkweDAwMDgwMDgwCgovKiBkeWFkaWMgYXJpdGhtZXRpYyBvcGNvZGVzLiAqLwojZGVmaW5lIEFERl9DT0RFCTB4MDAwMDAwMDAKI2RlZmluZSBNVUZfQ09ERQkweDAwMTAwMDAwCiNkZWZpbmUgU1VGX0NPREUJMHgwMDIwMDAwMAojZGVmaW5lIFJTRl9DT0RFCTB4MDAzMDAwMDAKI2RlZmluZSBEVkZfQ09ERQkweDAwNDAwMDAwCiNkZWZpbmUgUkRGX0NPREUJMHgwMDUwMDAwMAojZGVmaW5lIFBPV19DT0RFCTB4MDA2MDAwMDAKI2RlZmluZSBSUFdfQ09ERQkweDAwNzAwMDAwCiNkZWZpbmUgUk1GX0NPREUJMHgwMDgwMDAwMAojZGVmaW5lIEZNTF9DT0RFCTB4MDA5MDAwMDAKI2RlZmluZSBGRFZfQ09ERQkweDAwYTAwMDAwCiNkZWZpbmUgRlJEX0NPREUJMHgwMGIwMDAwMAojZGVmaW5lIFBPTF9DT0RFCTB4MDBjMDAwMDAKLyogMHgwMGQwMDAwMCBpcyBhbiBpbnZhbGlkIGR5YWRpYyBhcml0aG1ldGljIG9wY29kZSAqLwovKiAweDAwZTAwMDAwIGlzIGFuIGludmFsaWQgZHlhZGljIGFyaXRobWV0aWMgb3Bjb2RlICovCi8qIDB4MDBmMDAwMDAgaXMgYW4gaW52YWxpZCBkeWFkaWMgYXJpdGhtZXRpYyBvcGNvZGUgKi8KCi8qIG1vbmFkaWMgYXJpdGhtZXRpYyBvcGNvZGVzLiAqLwojZGVmaW5lIE1WRl9DT0RFCTB4MDAwMDgwMDAKI2RlZmluZSBNTkZfQ09ERQkweDAwMTA4MDAwCiNkZWZpbmUgQUJTX0NPREUJMHgwMDIwODAwMAojZGVmaW5lIFJORF9DT0RFCTB4MDAzMDgwMDAKI2RlZmluZSBTUVRfQ09ERQkweDAwNDA4MDAwCiNkZWZpbmUgTE9HX0NPREUJMHgwMDUwODAwMAojZGVmaW5lIExHTl9DT0RFCTB4MDA2MDgwMDAKI2RlZmluZSBFWFBfQ09ERQkweDAwNzA4MDAwCiNkZWZpbmUgU0lOX0NPREUJMHgwMDgwODAwMAojZGVmaW5lIENPU19DT0RFCTB4MDA5MDgwMDAKI2RlZmluZSBUQU5fQ09ERQkweDAwYTA4MDAwCiNkZWZpbmUgQVNOX0NPREUJMHgwMGIwODAwMAojZGVmaW5lIEFDU19DT0RFCTB4MDBjMDgwMDAKI2RlZmluZSBBVE5fQ09ERQkweDAwZDA4MDAwCiNkZWZpbmUgVVJEX0NPREUJMHgwMGUwODAwMAojZGVmaW5lIE5STV9DT0RFCTB4MDBmMDgwMDAKCi8qCj09PQo9PT0gRGVmaW5pdGlvbnMgZm9yIHJlZ2lzdGVyIHRyYW5zZmVyIGFuZCBjb21wYXJpc29uIGluc3RydWN0aW9ucwo9PT0KKi8KCiNkZWZpbmUgTUFTS19DUFJUCQkweDBlMDAwMDEwICAvKiByZWdpc3RlciB0cmFuc2ZlciBvcGNvZGUgKi8KI2RlZmluZSBNQVNLX0NQUlRfQ09ERQkJMHgwMGYwMDAwMAojZGVmaW5lIEZMVF9DT0RFCQkweDAwMDAwMDAwCiNkZWZpbmUgRklYX0NPREUJCTB4MDAxMDAwMDAKI2RlZmluZSBXRlNfQ09ERQkJMHgwMDIwMDAwMAojZGVmaW5lIFJGU19DT0RFCQkweDAwMzAwMDAwCiNkZWZpbmUgV0ZDX0NPREUJCTB4MDA0MDAwMDAKI2RlZmluZSBSRkNfQ09ERQkJMHgwMDUwMDAwMAojZGVmaW5lIENNRl9DT0RFCQkweDAwOTAwMDAwCiNkZWZpbmUgQ05GX0NPREUJCTB4MDBiMDAwMDAKI2RlZmluZSBDTUZFX0NPREUJCTB4MDBkMDAwMDAKI2RlZmluZSBDTkZFX0NPREUJCTB4MDBmMDAwMDAKCi8qCj09PQo9PT0gQ29tbW9uIGRlZmluaXRpb25zCj09PQoqLwoKLyogcmVnaXN0ZXIgbWFza3MgKi8KI2RlZmluZSBNQVNLX1JkCQkweDAwMDBmMDAwCiNkZWZpbmUgTUFTS19SbgkJMHgwMDBmMDAwMAojZGVmaW5lIE1BU0tfRmQJCTB4MDAwMDcwMDAKI2RlZmluZSBNQVNLX0ZtCQkweDAwMDAwMDA3CiNkZWZpbmUgTUFTS19GbgkJMHgwMDA3MDAwMAoKLyogY29uZGl0aW9uIGNvZGUgbWFza3MgKi8KI2RlZmluZSBDQ19NQVNLCQkweGYwMDAwMDAwCiNkZWZpbmUgQ0NfTkVHQVRJVkUJMHg4MDAwMDAwMAojZGVmaW5lIENDX1pFUk8JCTB4NDAwMDAwMDAKI2RlZmluZSBDQ19DQVJSWQkweDIwMDAwMDAwCiNkZWZpbmUgQ0NfT1ZFUkZMT1cJMHgxMDAwMDAwMAojZGVmaW5lIENDX0VRCQkweDAwMDAwMDAwCiNkZWZpbmUgQ0NfTkUJCTB4MTAwMDAwMDAKI2RlZmluZSBDQ19DUwkJMHgyMDAwMDAwMAojZGVmaW5lIENDX0hTCQlDQ19DUwojZGVmaW5lIENDX0NDCQkweDMwMDAwMDAwCiNkZWZpbmUgQ0NfTE8JCUNDX0NDCiNkZWZpbmUgQ0NfTUkJCTB4NDAwMDAwMDAKI2RlZmluZSBDQ19QTAkJMHg1MDAwMDAwMAojZGVmaW5lIENDX1ZTCQkweDYwMDAwMDAwCiNkZWZpbmUgQ0NfVkMJCTB4NzAwMDAwMDAKI2RlZmluZSBDQ19ISQkJMHg4MDAwMDAwMAojZGVmaW5lIENDX0xTCQkweDkwMDAwMDAwCiNkZWZpbmUgQ0NfR0UJCTB4YTAwMDAwMDAKI2RlZmluZSBDQ19MVAkJMHhiMDAwMDAwMAojZGVmaW5lIENDX0dUCQkweGMwMDAwMDAwCiNkZWZpbmUgQ0NfTEUJCTB4ZDAwMDAwMDAKI2RlZmluZSBDQ19BTAkJMHhlMDAwMDAwMAojZGVmaW5lIENDX05WCQkweGYwMDAwMDAwCgovKiByb3VuZGluZyBtYXNrcy92YWx1ZXMgKi8KI2RlZmluZSBNQVNLX1JPVU5ESU5HX01PREUJMHgwMDAwMDA2MAojZGVmaW5lIFJPVU5EX1RPX05FQVJFU1QJMHgwMDAwMDAwMAojZGVmaW5lIFJPVU5EX1RPX1BMVVNfSU5GSU5JVFkJMHgwMDAwMDAyMAojZGVmaW5lIFJPVU5EX1RPX01JTlVTX0lORklOSVRZCTB4MDAwMDAwNDAKI2RlZmluZSBST1VORF9UT19aRVJPCQkweDAwMDAwMDYwCgojZGVmaW5lIE1BU0tfUk9VTkRJTkdfUFJFQ0lTSU9OCTB4MDAwODAwODAKI2RlZmluZSBST1VORF9TSU5HTEUJCTB4MDAwMDAwMDAKI2RlZmluZSBST1VORF9ET1VCTEUJCTB4MDAwMDAwODAKI2RlZmluZSBST1VORF9FWFRFTkRFRAkJMHgwMDA4MDAwMAoKLyogR2V0IHRoZSBjb25kaXRpb24gY29kZSBmcm9tIHRoZSBvcGNvZGUuICovCiNkZWZpbmUgZ2V0Q29uZGl0aW9uKG9wY29kZSkJCShvcGNvZGUgPj4gMjgpCgovKiBHZXQgdGhlIHNvdXJjZSByZWdpc3RlciBmcm9tIHRoZSBvcGNvZGUuICovCiNkZWZpbmUgZ2V0Um4ob3Bjb2RlKQkJCSgob3Bjb2RlICYgTUFTS19SbikgPj4gMTYpCgovKiBHZXQgdGhlIGRlc3RpbmF0aW9uIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGZyb20gdGhlIG9wY29kZS4gKi8KI2RlZmluZSBnZXRGZChvcGNvZGUpCQkJKChvcGNvZGUgJiBNQVNLX0ZkKSA+PiAxMikKCi8qIEdldCB0aGUgZmlyc3Qgc291cmNlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGZyb20gdGhlIG9wY29kZS4gKi8KI2RlZmluZSBnZXRGbihvcGNvZGUpCQkoKG9wY29kZSAmIE1BU0tfRm4pID4+IDE2KQoKLyogR2V0IHRoZSBzZWNvbmQgc291cmNlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGZyb20gdGhlIG9wY29kZS4gKi8KI2RlZmluZSBnZXRGbShvcGNvZGUpCQkob3Bjb2RlICYgTUFTS19GbSkKCi8qIEdldCB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXIgZnJvbSB0aGUgb3Bjb2RlLiAqLwojZGVmaW5lIGdldFJkKG9wY29kZSkJCSgob3Bjb2RlICYgTUFTS19SZCkgPj4gMTIpCgovKiBHZXQgdGhlIHJvdW5kaW5nIG1vZGUgZnJvbSB0aGUgb3Bjb2RlLiAqLwojZGVmaW5lIGdldFJvdW5kaW5nTW9kZShvcGNvZGUpCQkoKG9wY29kZSAmIE1BU0tfUk9VTkRJTkdfTU9ERSkgPj4gNSkKCnN0YXRpYyBpbmxpbmUgY29uc3QgZmxvYXR4ODAgZ2V0RXh0ZW5kZWRDb25zdGFudChjb25zdCB1bnNpZ25lZCBpbnQgbkluZGV4KQp7CiAgIGV4dGVybiBjb25zdCBmbG9hdHg4MCBmbG9hdHg4MENvbnN0YW50W107CiAgIHJldHVybiBmbG9hdHg4MENvbnN0YW50W25JbmRleF07Cn0gCgpzdGF0aWMgaW5saW5lIGNvbnN0IGZsb2F0NjQgZ2V0RG91YmxlQ29uc3RhbnQoY29uc3QgdW5zaWduZWQgaW50IG5JbmRleCkKewogICBleHRlcm4gY29uc3QgZmxvYXQ2NCBmbG9hdDY0Q29uc3RhbnRbXTsKICAgcmV0dXJuIGZsb2F0NjRDb25zdGFudFtuSW5kZXhdOwp9IAoKc3RhdGljIGlubGluZSBjb25zdCBmbG9hdDMyIGdldFNpbmdsZUNvbnN0YW50KGNvbnN0IHVuc2lnbmVkIGludCBuSW5kZXgpCnsKICAgZXh0ZXJuIGNvbnN0IGZsb2F0MzIgZmxvYXQzMkNvbnN0YW50W107CiAgIHJldHVybiBmbG9hdDMyQ29uc3RhbnRbbkluZGV4XTsKfSAKCmV4dGVybiB1bnNpZ25lZCBpbnQgZ2V0UmVnaXN0ZXJDb3VudChjb25zdCB1bnNpZ25lZCBpbnQgb3Bjb2RlKTsKZXh0ZXJuIHVuc2lnbmVkIGludCBnZXREZXN0aW5hdGlvblNpemUoY29uc3QgdW5zaWduZWQgaW50IG9wY29kZSk7CgojZW5kaWYK