LyoKICogRGVmaW5pdGlvbnMgZm9yIFNOTVAgKFJGQyAxMDY3KSBhZ2VudCB2YXJpYWJsZSBmaW5kZXIuCiAqCiAqLwoKI2lmbmRlZiBfU05NUF9WQVJTX0hfCiNkZWZpbmUgX1NOTVBfVkFSU19IXwoKI2lmZGVmIF9fY3BsdXNwbHVzCmV4dGVybiAgICAgICAgICAiQyIgewojZW5kaWYKCi8qIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvcHlyaWdodChzKS4gIFNlZQogKiB0aGUgTmV0LVNOTVAncyBDT1BZSU5HIGZpbGUgZm9yIG1vcmUgZGV0YWlscyBhbmQgb3RoZXIgY29weXJpZ2h0cwogKiB0aGF0IG1heSBhcHBseToKICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoJQ29weXJpZ2h0IDE5ODgsIDE5ODkgYnkgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKCUNvcHlyaWdodCAxOTg5CVRHViwgSW5jb3Jwb3JhdGVkCgoJCSAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKClBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cwpkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCnByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCnN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgQ01VIGFuZCBUR1Ygbm90IGJlIHVzZWQKaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQp3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCgpDTVUgQU5EIFRHViBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwpFVkVOVCBTSEFMTCBDTVUgT1IgVEdWIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCkNPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKgogKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGNvcHlyaWdodGVkIGJ5OgogKiBDb3B5cmlnaHQgqSAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcyBzcGVjaWZpZWQgaW4gdGhlIENPUFlJTkcgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoZSBOZXQtU05NUCBwYWNrYWdlLgogKi8KCiAgICBzdHJ1Y3QgdmFyaWFibGU7CgogICAgLyoKICAgICAqIEZ1bmN0aW9uIHBvaW50ZXIgY2FsbGVkIGJ5IHRoZSBtYXN0ZXIgYWdlbnQgZm9yIHdyaXRlcy4gCiAgICAgKi8KICAgIHR5cGVkZWYgaW50ICAgICAoV3JpdGVNZXRob2QpIChpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2lkICogbmFtZSwgc2l6ZV90IGxlbmd0aCk7CgogICAgLyoKICAgICAqIEZ1bmN0aW9uIHBvaW50ZXIgY2FsbGVkIGJ5IHRoZSBtYXN0ZXIgYWdlbnQgZm9yIG1pYiBpbmZvcm1hdGlvbiByZXRyaWV2YWwgCiAgICAgKi8KICAgIHR5cGVkZWYgdV9jaGFyICooRmluZFZhck1ldGhvZCkgKHN0cnVjdCB2YXJpYWJsZSAqIHZwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleGFjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIHZhcl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0ZU1ldGhvZCAqKiB3cml0ZV9tZXRob2QpOwoKICAgIC8qCiAgICAgKiBGdW5jdGlvbiBwb2ludGVyIGNhbGxlZCBieSB0aGUgbWFzdGVyIGFnZW50IGZvciBzZXR0aW5nIHVwIHN1YmFnZW50IHJlcXVlc3RzIAogICAgICovCiAgICB0eXBlZGVmIGludCAgICAgKEFkZFZhck1ldGhvZCkgKG5ldHNubXBfYWdlbnRfc2Vzc2lvbiAqYXNwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YnApOwoKICAgIHN0cnVjdCBubGlzdDsKCiAgICBleHRlcm4gbG9uZyAgICAgbG9uZ19yZXR1cm47CiAgICBleHRlcm4gdV9jaGFyICAgcmV0dXJuX2J1ZltdOwoKICAgIGV4dGVybiBvaWQgICAgICBudWxsT2lkW107CiAgICBleHRlcm4gaW50ICAgICAgbnVsbE9pZExlbjsKCiNkZWZpbmUgSU5TVAkweEZGRkZGRkZGICAgICAgLyogdXNlZCB0byBmaWxsIG91dCB0aGUgaW5zdGFuY2UgZmllbGQgb2YgdGhlIHZhcmlhYmxlcyB0YWJsZSAqLwoKICAgIHN0cnVjdCB2YXJpYWJsZSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgIG1hZ2ljOyAgLyogcGFzc2VkIHRvIGZ1bmN0aW9uIGFzIGEgaGludCAqLwogICAgICAgIGNoYXIgICAgICAgICAgICB0eXBlOyAgIC8qIHR5cGUgb2YgdmFyaWFibGUgKi8KICAgICAgICAvKgogICAgICAgICAqIFNlZSBpbXBvcnRhbnQgY29tbWVudCBpbiBzbm1wX3ZhcnMuYyByZWxhdGluZyB0byBhY2wgCiAgICAgICAgICovCiAgICAgICAgdV9zaG9ydCAgICAgICAgIGFjbDsgICAgLyogYWNjZXNzIGNvbnRyb2wgbGlzdCBmb3IgdmFyaWFibGUgKi8KICAgICAgICBGaW5kVmFyTWV0aG9kICAqZmluZFZhcjsgICAgICAgIC8qIGZ1bmN0aW9uIHRoYXQgZmluZHMgdmFyaWFibGUgKi8KICAgICAgICB1X2NoYXIgICAgICAgICAgbmFtZWxlbjsgICAgICAgIC8qIGxlbmd0aCBvZiBhYm92ZSAqLwogICAgICAgIG9pZCAgICAgICAgICAgICBuYW1lW01BWF9PSURfTEVOXTsgICAgICAvKiBvYmplY3QgaWRlbnRpZmllciBvZiB2YXJpYWJsZSAqLwogICAgfTsKCiAgICBpbnQgICAgICAgICAgICAgaW5pdF9hZ2VudChjb25zdCBjaGFyICopOwogICAgdm9pZCAgICAgICAgICAgIHNodXRkb3duX2FnZW50KHZvaWQpOwoKICAgIGludCAgICAgICAgICAgICBzaG91bGRfaW5pdChjb25zdCBjaGFyICptb2R1bGVfbmFtZSk7CiAgICB2b2lkICAgICAgICAgICAgYWRkX3RvX2luaXRfbGlzdChjaGFyICptb2R1bGVfbGlzdCk7CgojaWZkZWYgVVNJTkdfQUdFTlRYX1NVQkFHRU5UX01PRFVMRQogICAgdm9pZCAgICAgICAgICAgIG5ldHNubXBfZW5hYmxlX3N1YmFnZW50KHZvaWQpOwojZW5kaWYKCiNpZm5kZWYgX0FHRU5UX1JFR0lTVFJZX0gKI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L2FnZW50X2hhbmRsZXIuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L3Zhcl9zdHJ1Y3QuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L2FnZW50X3JlZ2lzdHJ5Lmg+CiNlbmRpZgoKICAgIC8qCiAgICAgKiBmYWlsIG92ZXJsb2FkcyBub24tbmVnYXRpdmUgaW50ZWdlciB2YWx1ZS4gaXQgbXVzdCBiZSAtMSAhIAogICAgICovCiNkZWZpbmUgTUFUQ0hfRkFJTEVECSgtMSkKI2RlZmluZSBNQVRDSF9TVUNDRUVERUQJMAoKI2lmZGVmIF9fY3BsdXNwbHVzCn0KI2VuZGlmCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogX1NOTVBfVkFSU19IXyAqLwo=