LyoNCiAgICBGcmVlUlRPUyBWNy40LjAgLSBDb3B5cmlnaHQgKEMpIDIwMTMgUmVhbCBUaW1lIEVuZ2luZWVycyBMdGQuDQoNCiAgICBGRUFUVVJFUyBBTkQgUE9SVFMgQVJFIEFEREVEIFRPIEZSRUVSVE9TIEFMTCBUSEUgVElNRS4gIFBMRUFTRSBWSVNJVA0KICAgIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnIFRPIEVOU1VSRSBZT1UgQVJFIFVTSU5HIFRIRSBMQVRFU1QgVkVSU0lPTi4NCg0KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQogICAgICogICAgRnJlZVJUT1MgdHV0b3JpYWwgYm9va3MgYXJlIGF2YWlsYWJsZSBpbiBwZGYgYW5kIHBhcGVyYmFjay4gICAgICAgICoNCiAgICAgKiAgICBDb21wbGV0ZSwgcmV2aXNlZCwgYW5kIGVkaXRlZCBwZGYgcmVmZXJlbmNlIG1hbnVhbHMgYXJlIGFsc28gICAgICAgKg0KICAgICAqICAgIGF2YWlsYWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAgICAgKiAgICBQdXJjaGFzaW5nIEZyZWVSVE9TIGRvY3VtZW50YXRpb24gd2lsbCBub3Qgb25seSBoZWxwIHlvdSwgYnkgICAgICAgKg0KICAgICAqICAgIGVuc3VyaW5nIHlvdSBnZXQgcnVubmluZyBhcyBxdWlja2x5IGFzIHBvc3NpYmxlIGFuZCB3aXRoIGFuICAgICAgICAqDQogICAgICogICAgaW4tZGVwdGgga25vd2xlZGdlIG9mIGhvdyB0byB1c2UgRnJlZVJUT1MsIGl0IHdpbGwgYWxzbyBoZWxwICAgICAgICoNCiAgICAgKiAgICB0aGUgRnJlZVJUT1MgcHJvamVjdCB0byBjb250aW51ZSB3aXRoIGl0cyBtaXNzaW9uIG9mIHByb3ZpZGluZyAgICAgKg0KICAgICAqICAgIHByb2Zlc3Npb25hbCBncmFkZSwgY3Jvc3MgcGxhdGZvcm0sIGRlIGZhY3RvIHN0YW5kYXJkIHNvbHV0aW9ucyAgICAqDQogICAgICogICAgZm9yIG1pY3JvY29udHJvbGxlcnMgLSBjb21wbGV0ZWx5IGZyZWUgb2YgY2hhcmdlISAgICAgICAgICAgICAgICAgICoNCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICAgICAqICAgID4+PiBTZWUgaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcvRG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscy4gPDw8ICAgICAqDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAgICAgKiAgICBUaGFuayB5b3UgZm9yIHVzaW5nIEZyZWVSVE9TLCBhbmQgdGhhbmsgeW91IGZvciB5b3VyIHN1cHBvcnQhICAgICAgKg0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoNCg0KICAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlUlRPUyBkaXN0cmlidXRpb24uDQoNCiAgICBGcmVlUlRPUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyDQogICAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAodmVyc2lvbiAyKSBhcyBwdWJsaXNoZWQgYnkgdGhlDQogICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIEFORCBNT0RJRklFRCBCWSB0aGUgRnJlZVJUT1MgZXhjZXB0aW9uLg0KDQogICAgPj4+Pj4+Tk9URTw8PDw8PCBUaGUgbW9kaWZpY2F0aW9uIHRvIHRoZSBHUEwgaXMgaW5jbHVkZWQgdG8gYWxsb3cgeW91IHRvDQogICAgZGlzdHJpYnV0ZSBhIGNvbWJpbmVkIHdvcmsgdGhhdCBpbmNsdWRlcyBGcmVlUlRPUyB3aXRob3V0IGJlaW5nIG9ibGlnZWQgdG8NCiAgICBwcm92aWRlIHRoZSBzb3VyY2UgY29kZSBmb3IgcHJvcHJpZXRhcnkgY29tcG9uZW50cyBvdXRzaWRlIG9mIHRoZSBGcmVlUlRPUw0KICAgIGtlcm5lbC4NCg0KICAgIEZyZWVSVE9TIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQ0KICAgIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MNCiAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlDQogICAgZGV0YWlscy4gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiAgICBhbmQgdGhlIEZyZWVSVE9TIGxpY2Vuc2UgZXhjZXB0aW9uIGFsb25nIHdpdGggRnJlZVJUT1M7IGlmIG5vdCBpdGNhbiBiZQ0KICAgIHZpZXdlZCBoZXJlOiBodHRwOi8vd3d3LmZyZWVydG9zLm9yZy9hMDAxMTQuaHRtbCBhbmQgYWxzbyBvYnRhaW5lZCBieQ0KICAgIHdyaXRpbmcgdG8gUmVhbCBUaW1lIEVuZ2luZWVycyBMdGQuLCBjb250YWN0IGRldGFpbHMgZm9yIHdob20gYXJlIGF2YWlsYWJsZQ0KICAgIG9uIHRoZSBGcmVlUlRPUyBXRUIgc2l0ZS4NCg0KICAgIDEgdGFiID09IDQgc3BhY2VzIQ0KDQogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAgICAgKiAgICBIYXZpbmcgYSBwcm9ibGVtPyAgU3RhcnQgYnkgcmVhZGluZyB0aGUgRkFRICJNeSBhcHBsaWNhdGlvbiBkb2VzICAgKg0KICAgICAqICAgIG5vdCBydW4sIHdoYXQgY291bGQgYmUgd3Jvbmc/IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAgICAgKiAgICBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZy9GQVFIZWxwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoNCg0KICAgIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnIC0gRG9jdW1lbnRhdGlvbiwgYm9va3MsIHRyYWluaW5nLCBsYXRlc3QgdmVyc2lvbnMsIA0KICAgIGxpY2Vuc2UgYW5kIFJlYWwgVGltZSBFbmdpbmVlcnMgTHRkLiBjb250YWN0IGRldGFpbHMuDQoNCiAgICBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZy9wbHVzIC0gQSBzZWxlY3Rpb24gb2YgRnJlZVJUT1MgZWNvc3lzdGVtIHByb2R1Y3RzLA0KICAgIGluY2x1ZGluZyBGcmVlUlRPUytUcmFjZSAtIGFuIGluZGlzcGVuc2FibGUgcHJvZHVjdGl2aXR5IHRvb2wsIGFuZCBvdXIgbmV3DQogICAgZnVsbHkgdGhyZWFkIGF3YXJlIGFuZCByZWVudHJhbnQgVURQL0lQIHN0YWNrLg0KDQogICAgaHR0cDovL3d3dy5PcGVuUlRPUy5jb20gLSBSZWFsIFRpbWUgRW5naW5lZXJzIGx0ZCBsaWNlbnNlIEZyZWVSVE9TIHRvIEhpZ2ggDQogICAgSW50ZWdyaXR5IFN5c3RlbXMsIHdobyBzZWxsIHRoZSBjb2RlIHdpdGggY29tbWVyY2lhbCBzdXBwb3J0LCANCiAgICBpbmRlbW5pZmljYXRpb24gYW5kIG1pZGRsZXdhcmUsIHVuZGVyIHRoZSBPcGVuUlRPUyBicmFuZC4NCiAgICANCiAgICBodHRwOi8vd3d3LlNhZmVSVE9TLmNvbSAtIEhpZ2ggSW50ZWdyaXR5IFN5c3RlbXMgYWxzbyBwcm92aWRlIGEgc2FmZXR5IA0KICAgIGVuZ2luZWVyZWQgYW5kIGluZGVwZW5kZW50bHkgU0lMMyBjZXJ0aWZpZWQgdmVyc2lvbiBmb3IgdXNlIGluIHNhZmV0eSBhbmQgDQogICAgbWlzc2lvbiBjcml0aWNhbCBhcHBsaWNhdGlvbnMgdGhhdCByZXF1aXJlIHByb3ZhYmxlIGRlcGVuZGFiaWxpdHkuDQoqLw0KDQovKiBTdGFuZGFyZCBpbmNsdWRlcy4gKi8NCiNpbmNsdWRlIDxzdHJpbmcuaD4NCg0KLyogU2NoZWR1bGVyIGluY2x1ZGVzLiAqLw0KI2luY2x1ZGUgIkZyZWVSVE9TLmgiDQojaW5jbHVkZSAic2VtcGhyLmgiDQojaW5jbHVkZSAidGFzay5oIg0KDQovKiBEZW1vIGFwcGxpY2F0aW9uIGluY2x1ZGVzLiAqLw0KI2luY2x1ZGUgIlNBTTdfRU1BQy5oIg0KDQovKiB1SVAgaW5jbHVkZXMuICovDQojaW5jbHVkZSAidWlwLmgiDQoNCi8qIEhhcmR3YXJlIHNwZWNpZmljIGluY2x1ZGVzLiAqLw0KI2luY2x1ZGUgIkVtYWMuaCINCiNpbmNsdWRlICJtaWkuaCINCiNpbmNsdWRlICJBVDkxU0FNN1gyNTYuaCINCg0KDQovKiBVU0VfUk1JSV9JTlRFUkZBQ0UgbXVzdCBiZSBkZWZpbmVkIGFzIDEgdG8gdXNlIGFuIFJNSUkgaW50ZXJmYWNlLCBvciAwDQp0byB1c2UgYW4gTUlJIGludGVyZmFjZS4gKi8NCiNkZWZpbmUgVVNFX1JNSUlfSU5URVJGQUNFIDANCg0KLyogVGhlIGJ1ZmZlciBhZGRyZXNzZXMgd3JpdHRlbiBpbnRvIHRoZSBkZXNjcmlwdG9ycyBtdXN0IGJlIGFsaWduZWQgc28gdGhlDQpsYXN0IGZldyBiaXRzIGFyZSB6ZXJvLiAgVGhlc2UgYml0cyBoYXZlIHNwZWNpYWwgbWVhbmluZyBmb3IgdGhlIEVNQUMNCnBlcmlwaGVyYWwgYW5kIGNhbm5vdCBiZSB1c2VkIGFzIHBhcnQgb2YgdGhlIGFkZHJlc3MuICovDQojZGVmaW5lIGVtYWNBRERSRVNTX01BU0sJCQkoICggdW5zaWduZWQgbG9uZyApIDB4RkZGRkZGRkMgKQ0KDQovKiBCaXQgdXNlZCB3aXRoaW4gdGhlIGFkZHJlc3Mgc3RvcmVkIGluIHRoZSBkZXNjcmlwdG9yIHRvIG1hcmsgdGhlIGxhc3QNCmRlc2NyaXB0b3IgaW4gdGhlIGFycmF5LiAqLw0KI2RlZmluZSBlbWFjUlhfV1JBUF9CSVQJCQkJKCAoIHVuc2lnbmVkIGxvbmcgKSAweDAyICkNCg0KLyogQml0IHVzZWQgd2l0aGluIHRoZSBUeCBkZXNjcmlwdG9yIHN0YXR1cyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZQ0KZGVzY3JpcHRvciBpcyB1bmRlciB0aGUgY29udHJvbCBvZiB0aGUgRU1BQyBvciB0aGUgc29mdHdhcmUuICovDQojZGVmaW5lIGVtYWNUWF9CVUZfVVNFRAkJCQkoICggdW5zaWduZWQgbG9uZyApIDB4ODAwMDAwMDAgKQ0KDQovKiBBIHNob3J0IGRlbGF5IGlzIHVzZWQgdG8gd2FpdCBmb3IgYSBidWZmZXIgdG8gYmVjb21lIGF2YWlsYWJsZSwgc2hvdWxkDQpvbmUgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB3aGVuIHRyeWluZyB0byB0cmFuc21pdCBhIGZyYW1lLiAqLw0KI2RlZmluZSBlbWFjQlVGRkVSX1dBSVRfREVMQVkJCSggMiApDQojZGVmaW5lIGVtYWNNQVhfV0FJVF9DWUNMRVMJCQkoIGNvbmZpZ1RJQ0tfUkFURV9IWiAvIDQwICkNCg0KLyogTWlzYyBkZWZpbmVzLiAqLw0KI2RlZmluZSBlbWFjSU5URVJSVVBUX0xFVkVMCQkJKCA1ICkNCiNkZWZpbmUgZW1hY05PX0RFTEFZCQkJCSggMCApDQojZGVmaW5lIGVtYWNUT1RBTF9GUkFNRV9IRUFERVJfU0laRQkoIDU0ICkNCiNkZWZpbmUgZW1hY1BIWV9JTklUX0RFTEFZCQkJKCA1MDAwIC8gcG9ydFRJQ0tfUkFURV9NUyApDQojZGVmaW5lIGVtYWNSRVNFVF9LRVkJCQkJKCAoIHVuc2lnbmVkIGxvbmcgKSAweEE1MDAwMDAwICkNCiNkZWZpbmUgZW1hY1JFU0VUX0xFTkdUSAkJCSggKCB1bnNpZ25lZCBsb25nICkgKCAweDAxIDw8IDggKSApDQoNCi8qIFRoZSBBdG1lbCBoZWFkZXIgZmlsZSBvbmx5IGRlZmluZXMgdGhlIFRYIGZyYW1lIGxlbmd0aCBtYXNrLiAqLw0KI2RlZmluZSBlbWFjUlhfTEVOR1RIX0ZSQU1FCQkJKCAweGZmZiApDQoNCi8qIFBlcmlwaGVyYWwgc2V0dXAgZm9yIHRoZSBFTUFDLiAqLw0KI2RlZmluZSBlbWFjUEVSSVBIRVJBTF9BX1NFVFVQIAkJKCAoIHVuc2lnbmVkIGxvbmcgKSBBVDkxQ19QQjJfRVRYMAkJCSkgfCBcDQoJCQkJCQkJCQkoICggdW5zaWduZWQgbG9uZyApIEFUOTFDX1BCMTJfRVRYRVIJCSkgfCBcDQoJCQkJCQkJCQkoICggdW5zaWduZWQgbG9uZyApIEFUOTFDX1BCMTZfRUNPTAkJCSkgfCBcDQoJCQkJCQkJCQkoICggdW5zaWduZWQgbG9uZyApIEFUOTFDX1BCMTFfRVRYMwkJCSkgfCBcDQoJCQkJCQkJCQkoICggdW5zaWduZWQgbG9uZyApIEFUOTFDX1BCNl9FUlgxCQkJKSB8IFwNCgkJCQkJCQkJCSggKCB1bnNpZ25lZCBsb25nICkgQVQ5MUNfUEIxNV9FUlhEVgkJKSB8IFwNCgkJCQkJCQkJCSggKCB1bnNpZ25lZCBsb25nICkgQVQ5MUNfUEIxM19FUlgyCQkJKSB8IFwNCgkJCQkJCQkJCSggKCB1bnNpZ25lZCBsb25nICkgQVQ5MUNfUEIzX0VUWDEJCQkpIHwgXA0KCQkJCQkJCQkJKCAoIHVuc2lnbmVkIGxvbmcgKSBBVDkxQ19QQjhfRU1EQwkJCSkgfCBcDQoJCQkJCQkJCQkoICggdW5zaWduZWQgbG9uZyApIEFUOTFDX1BCNV9FUlgwCQkJKSB8IFwNCgkJCQkJCQkJCSggKCB1bnNpZ25lZCBsb25nICkgQVQ5MUNfUEIxNF9FUlgzCQkJKSB8IFwNCgkJCQkJCQkJCSggKCB1bnNpZ25lZCBsb25nICkgQVQ5MUNfUEI0X0VDUlNfRUNSU0RWCSkgfCBcDQoJCQkJCQkJCQkoICggdW5zaWduZWQgbG9uZyApIEFUOTFDX1BCMV9FVFhFTgkJCSkgfCBcDQoJCQkJCQkJCQkoICggdW5zaWduZWQgbG9uZyApIEFUOTFDX1BCMTBfRVRYMgkJCSkgfCBcDQoJCQkJCQkJCQkoICggdW5zaWduZWQgbG9uZyApIEFUOTFDX1BCMF9FVFhDS19FUkVGQ0sJKSB8IFwNCgkJCQkJCQkJCSggKCB1bnNpZ25lZCBsb25nICkgQVQ5MUNfUEI5X0VNRElPCQkJKSB8IFwNCgkJCQkJCQkJCSggKCB1bnNpZ25lZCBsb25nICkgQVQ5MUNfUEI3X0VSWEVSCQkJKSB8IFwNCgkJCQkJCQkJCSggKCB1bnNpZ25lZCBsb25nICkgQVQ5MUNfUEIxN19FUlhDSwkJKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qDQogKiBQcm90b3R5cGUgZm9yIHRoZSBFTUFDIGludGVycnVwdCBmdW5jdGlvbiAtIGNhbGxlZCBieSB0aGUgYXNtIHdyYXBwZXIuDQogKi8NCmV4dGVybiB2b2lkIHZFTUFDSVNSX1dyYXBwZXIoIHZvaWQgKSBfX2F0dHJpYnV0ZV9fKChuYWtlZCkpOw0KDQovKg0KICogSW5pdGlhbGlzZSBib3RoIHRoZSBUeCBhbmQgUnggZGVzY3JpcHRvcnMgdXNlZCBieSB0aGUgRU1BQy4NCiAqLw0Kc3RhdGljIHZvaWQgcHJ2U2V0dXBEZXNjcmlwdG9ycyh2b2lkKTsNCg0KLyoNCiAqIFdyaXRlIG91ciBNQUMgYWRkcmVzcyBpbnRvIHRoZSBFTUFDLiAgVGhlIE1BQyBhZGRyZXNzIGlzIHNldCBhcyBvbmUgb2YgdGhlDQogKiB1aXAgb3B0aW9ucy4NCiAqLw0Kc3RhdGljIHZvaWQgcHJ2U2V0dXBNQUNBZGRyZXNzKCB2b2lkICk7DQoNCi8qDQogKiBDb25maWd1cmUgdGhlIEVNQUMgYW5kIEFJQyBmb3IgRU1BQyBpbnRlcnJ1cHRzLg0KICovDQpzdGF0aWMgdm9pZCBwcnZTZXR1cEVNQUNJbnRlcnJ1cHQoIHZvaWQgKTsNCg0KLyoNCiAqIFNvbWUgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb25zIHRha2VuIGZyb20gdGhlIEF0bWVsIEVNQUMgc2FtcGxlIGNvZGUuDQogKi8NCnN0YXRpYyB2b2lkIHZSZWFkUEhZKCB1bnNpZ25lZCBjaGFyIHVjUEhZQWRkcmVzcywgdW5zaWduZWQgY2hhciB1Y0FkZHJlc3MsIHVuc2lnbmVkIGxvbmcgKnB1bFZhbHVlICk7DQojaWYgVVNFX1JNSUlfSU5URVJGQUNFICE9IDENCglzdGF0aWMgdm9pZCB2V3JpdGVQSFkoIHVuc2lnbmVkIGNoYXIgdWNQSFlBZGRyZXNzLCB1bnNpZ25lZCBjaGFyIHVjQWRkcmVzcywgdW5zaWduZWQgbG9uZyB1bFZhbHVlKTsNCiNlbmRpZg0Kc3RhdGljIHBvcnRCQVNFX1RZUEUgeEdldExpbmtTcGVlZCggdm9pZCApOw0Kc3RhdGljIHBvcnRCQVNFX1RZUEUgcHJ2UHJvYmVQSFkoIHZvaWQgKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qIEJ1ZmZlciB3cml0dGVuIHRvIGJ5IHRoZSBFTUFDIERNQS4gIE11c3QgYmUgYWxpZ25lZCBhcyBkZXNjcmliZWQgYnkgdGhlDQpjb21tZW50IGFib3ZlIHRoZSBlbWFjQUREUkVTU19NQVNLIGRlZmluaXRpb24uICovDQojcHJhZ21hIGRhdGFfYWxpZ25tZW50PTgNCnN0YXRpYyB2b2xhdGlsZSBjaGFyIHBjUnhCdWZmZXJbIE5CX1JYX0JVRkZFUlMgKiBFVEhfUlhfQlVGRkVSX1NJWkUgXTsNCg0KLyogQnVmZmVyIHJlYWQgYnkgdGhlIEVNQUMgRE1BLiAgTXVzdCBiZSBhbGlnbmVkIGFzIGRlc2NyaWJlZCBieSBoZSBjb21tZW50DQphYm92ZSB0aGUgZW1hY0FERFJFU1NfTUFTSyBkZWZpbml0aW9uLiAqLw0KI3ByYWdtYSBkYXRhX2FsaWdubWVudD04DQpzdGF0aWMgY2hhciBwY1R4QnVmZmVyWyBOQl9UWF9CVUZGRVJTICogRVRIX1RYX0JVRkZFUl9TSVpFIF07DQoNCi8qIERlc2NyaXB0b3JzIHVzZWQgdG8gY29tbXVuaWNhdGUgYmV0d2VlbiB0aGUgcHJvZ3JhbSBhbmQgdGhlIEVNQUMgcGVyaXBoZXJhbC4NClRoZXNlIGRlc2NyaXB0b3JzIGhvbGQgdGhlIGxvY2F0aW9ucyBhbmQgc3RhdGUgb2YgdGhlIFJ4IGFuZCBUeCBidWZmZXJzLiAqLw0Kc3RhdGljIHZvbGF0aWxlIEFUOTFTX1R4VGREZXNjcmlwdG9yIHhUeERlc2NyaXB0b3JzWyBOQl9UWF9CVUZGRVJTIF07DQpzdGF0aWMgdm9sYXRpbGUgQVQ5MVNfUnhUZERlc2NyaXB0b3IgeFJ4RGVzY3JpcHRvcnNbIE5CX1JYX0JVRkZFUlMgXTsNCg0KLyogVGhlIElQIGFuZCBFdGhlcm5ldCBhZGRyZXNzZXMgYXJlIHJlYWQgZnJvbSB0aGUgdUlQIHNldHVwLiAqLw0KY29uc3QgY2hhciBjTUFDQWRkcmVzc1sgNiBdID0geyB1aXBNQUNfQUREUjAsIHVpcE1BQ19BRERSMSwgdWlwTUFDX0FERFIyLCB1aXBNQUNfQUREUjMsIHVpcE1BQ19BRERSNCwgdWlwTUFDX0FERFI1IH07DQpjb25zdCB1bnNpZ25lZCBjaGFyIHVjSVBBZGRyZXNzWyA0IF0gID0geyB1aXBJUF9BRERSMCwgdWlwSVBfQUREUjEsIHVpcElQX0FERFIyLCB1aXBJUF9BRERSMyB9Ow0KDQovKiBUaGUgc2VtYXBob3JlIHVzZWQgYnkgdGhlIEVNQUMgSVNSIHRvIHdha2UgdGhlIEVNQUMgdGFzay4gKi8NCnN0YXRpYyB4U2VtYXBob3JlSGFuZGxlIHhTZW1hcGhvcmUgPSBOVUxMOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KeFNlbWFwaG9yZUhhbmRsZSB4RU1BQ0luaXQoIHZvaWQgKQ0Kew0KCS8qIENvZGUgc3VwcGxpZWQgYnkgQXRtZWwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCgkvKiBEaXNhYmxlIHB1bGwgdXAgb24gUlhEViA9PiBQSFkgbm9ybWFsIG1vZGUgKG5vdCBpbiB0ZXN0IG1vZGUpLA0KCVBIWSBoYXMgaW50ZXJuYWwgcHVsbCBkb3duLiAqLw0KCUFUOTFDX0JBU0VfUElPQi0+UElPX1BQVURSID0gMSA8PCAxNTsNCg0KCSNpZiBVU0VfUk1JSV9JTlRFUkZBQ0UgIT0gMQ0KCSAgCS8qIFBIWSBoYXMgaW50ZXJuYWwgcHVsbCBkb3duIDogc2V0IE1JSSBtb2RlLiAqLw0KCSAgCUFUOTFDX0JBU0VfUElPQi0+UElPX1BQVURSID0gMSA8PCAxNjsNCgkjZW5kaWYNCg0KCS8qIENsZWFyIFBCMTggPD0+IFBIWSBwb3dlcmRvd24uICovDQogICAJQVQ5MUNfQkFTRV9QSU9CLT5QSU9fUEVSID0gMSA8PCAxODsNCglBVDkxQ19CQVNFX1BJT0ItPlBJT19PRVIgPSAxIDw8IDE4Ow0KCUFUOTFDX0JBU0VfUElPQi0+UElPX0NPRFIgPSAxIDw8IDE4Ow0KDQoJLyogQWZ0ZXIgUEhZIHBvd2VyIHVwLCBoYXJkd2FyZSByZXNldC4gKi8NCglBVDkxQ19CQVNFX1JTVEMtPlJTVENfUk1SID0gZW1hY1JFU0VUX0tFWSB8IGVtYWNSRVNFVF9MRU5HVEg7DQoJQVQ5MUNfQkFTRV9SU1RDLT5SU1RDX1JDUiA9IGVtYWNSRVNFVF9LRVkgfCBBVDkxQ19SU1RDX0VYVFJTVDsNCg0KCS8qIFdhaXQgZm9yIGhhcmR3YXJlIHJlc2V0IGVuZC4gKi8NCgl3aGlsZSggISggQVQ5MUNfQkFTRV9SU1RDLT5SU1RDX1JTUiAmIEFUOTFDX1JTVENfTlJTVEwgKSApDQoJew0KCQlfX2FzbSB2b2xhdGlsZSAoICJOT1AiICk7DQoJfQ0KICAgIF9fYXNtIHZvbGF0aWxlICggIk5PUCIgKTsNCg0KCS8qIFNldHVwIHRoZSBwaW5zLiAqLw0KCUFUOTFDX0JBU0VfUElPQi0+UElPX0FTUiA9IGVtYWNQRVJJUEhFUkFMX0FfU0VUVVA7DQoJQVQ5MUNfQkFTRV9QSU9CLT5QSU9fUERSID0gZW1hY1BFUklQSEVSQUxfQV9TRVRVUDsNCg0KCS8qIEVuYWJsZSBjb20gYmV0d2VlbiBFTUFDIFBIWS4NCg0KCUVuYWJsZSBtYW5hZ2VtZW50IHBvcnQuICovDQoJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX05DUiB8PSBBVDkxQ19FTUFDX01QRTsJDQoNCgkvKiBNREMgPSBNQ0svMzIuICovDQoJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX05DRkdSIHw9ICggMiApIDw8IDEwOwkNCg0KCS8qIFdhaXQgZm9yIFBIWSBhdXRvIGluaXQgZW5kIChyYXRoZXIgY3J1ZGUgZGVsYXkhKS4gKi8NCgl2VGFza0RlbGF5KCBlbWFjUEhZX0lOSVRfREVMQVkgKTsNCg0KCS8qIFBIWSBjb25maWd1cmF0aW9uLiAqLw0KCSNpZiBVU0VfUk1JSV9JTlRFUkZBQ0UgIT0gMQ0KCXsNCgkJdW5zaWduZWQgbG9uZyB1bENvbnRyb2w7DQoNCgkJLyogUEhZIGhhcyBpbnRlcm5hbCBwdWxsIGRvd24gOiBkaXNhYmxlIE1JSSBpc29sYXRlLiAqLw0KCQl2UmVhZFBIWSggQVQ5MUNfUEhZX0FERFIsIE1JSV9CTUNSLCAmdWxDb250cm9sICk7DQoJCXZSZWFkUEhZKCBBVDkxQ19QSFlfQUREUiwgTUlJX0JNQ1IsICZ1bENvbnRyb2wgKTsNCgkJdWxDb250cm9sICY9IH5CTUNSX0lTT0xBVEU7DQoJCXZXcml0ZVBIWSggQVQ5MUNfUEhZX0FERFIsIE1JSV9CTUNSLCB1bENvbnRyb2wgKTsNCgl9DQoJI2VuZGlmDQoNCgkvKiBEaXNhYmxlIG1hbmFnZW1lbnQgcG9ydCBhZ2Fpbi4gKi8NCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNSICY9IH5BVDkxQ19FTUFDX01QRTsNCg0KCSNpZiBVU0VfUk1JSV9JTlRFUkZBQ0UgIT0gMQ0KCQkvKiBFbmFibGUgRU1BQyBpbiBNSUkgbW9kZSwgZW5hYmxlIGNsb2NrIEVSWENLIGFuZCBFVFhDSy4gKi8NCgkJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX1VTUklPID0gQVQ5MUNfRU1BQ19DTEtFTiA7DQoJI2Vsc2UNCgkJLyogRW5hYmxlIEVNQUMgaW4gUk1JSSBtb2RlLCBlbmFibGUgUk1JSSBjbG9jayAoNTBNSHogZnJvbSBvc2NpbGxhdG9yDQoJCW9uIEVSRkNLKS4gKi8NCgkJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX1VTUklPID0gQVQ5MUNfRU1BQ19STUlJIHwgQVQ5MUNfRU1BQ19DTEtFTiA7DQoJI2VuZGlmDQoNCgkvKiBFbmQgb2YgY29kZSBzdXBwbGllZCBieSBBdG1lbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQoJLyogU2V0dXAgdGhlIGJ1ZmZlcnMgYW5kIGRlc2NyaXB0b3JzLiAqLw0KCXBydlNldHVwRGVzY3JpcHRvcnMoKTsNCgkNCgkvKiBMb2FkIG91ciBNQUMgYWRkcmVzcyBpbnRvIHRoZSBFTUFDLiAqLw0KCXBydlNldHVwTUFDQWRkcmVzcygpOw0KDQoJLyogQXJlIHdlIGNvbm5lY3RlZD8gKi8NCglpZiggcHJ2UHJvYmVQSFkoKSApDQoJew0KCQkvKiBFbmFibGUgdGhlIGludGVycnVwdCEgKi8NCgkJcG9ydEVOVEVSX0NSSVRJQ0FMKCk7DQoJCXsNCgkJCXBydlNldHVwRU1BQ0ludGVycnVwdCgpOw0KCQkJdlBhc3NFTUFDU2VtYXBob3JlKCB4U2VtYXBob3JlICk7DQoJCX0NCgkJcG9ydEVYSVRfQ1JJVElDQUwoKTsNCgl9DQoNCglyZXR1cm4geFNlbWFwaG9yZTsNCn0NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQpsb25nIGxFTUFDU2VuZCggdm9pZCApDQp7DQpzdGF0aWMgdW5zaWduZWQgcG9ydEJBU0VfVFlQRSB1eFR4QnVmZmVySW5kZXggPSAwOw0KcG9ydEJBU0VfVFlQRSB4V2FpdEN5Y2xlcyA9IDA7DQpsb25nIGxSZXR1cm4gPSBwZFBBU1M7DQpjaGFyICpwY0J1ZmZlcjsNCg0KCS8qIElzIGEgYnVmZmVyIGF2YWlsYWJsZT8gKi8NCgl3aGlsZSggISggeFR4RGVzY3JpcHRvcnNbIHV4VHhCdWZmZXJJbmRleCBdLlVfU3RhdHVzLnN0YXR1cyAmIEFUOTFDX1RSQU5TTUlUX09LICkgKQ0KCXsNCgkJLyogVGhlcmUgaXMgbm8gcm9vbSB0byB3cml0ZSB0aGUgVHggZGF0YSB0byB0aGUgVHggYnVmZmVyLiAgV2FpdCBhDQoJCXNob3J0IHdoaWxlLCB0aGVuIHRyeSBhZ2Fpbi4gKi8NCgkJeFdhaXRDeWNsZXMrKzsNCgkJaWYoIHhXYWl0Q3ljbGVzID4gZW1hY01BWF9XQUlUX0NZQ0xFUyApDQoJCXsNCgkJCS8qIEdpdmUgdXAuICovDQoJCQlsUmV0dXJuID0gcGRGQUlMOw0KCQkJYnJlYWs7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQl2VGFza0RlbGF5KCBlbWFjQlVGRkVSX1dBSVRfREVMQVkgKTsNCgkJfQ0KCX0NCg0KCS8qIGxSZXR1cm4gd2lsbCBvbmx5IGJlIHBkUEFTUyBpZiBhIGJ1ZmZlciBpcyBhdmFpbGFibGUuICovDQoJaWYoIGxSZXR1cm4gPT0gcGRQQVNTICkNCgl7DQoJCS8qIENvcHkgdGhlIGhlYWRlcnMgaW50byB0aGUgVHggYnVmZmVyLiAgVGhlc2Ugd2lsbCBiZSBpbiB0aGUgdUlQIGJ1ZmZlci4gKi8NCgkJcGNCdWZmZXIgPSAoIGNoYXIgKiApIHhUeERlc2NyaXB0b3JzWyB1eFR4QnVmZmVySW5kZXggXS5hZGRyOw0KCQltZW1jcHkoICggdm9pZCAqICkgcGNCdWZmZXIsICggdm9pZCAqICkgdWlwX2J1ZiwgZW1hY1RPVEFMX0ZSQU1FX0hFQURFUl9TSVpFICk7DQoNCgkJLyogSWYgdGhlcmUgaXMgcm9vbSwgYWxzbyBjb3B5IGluIHRoZSBhcHBsaWNhdGlvbiBkYXRhIGlmIGFueS4gKi8NCgkJaWYoICggdWlwX2xlbiA+IGVtYWNUT1RBTF9GUkFNRV9IRUFERVJfU0laRSApICYmICggdWlwX2xlbiA8PSAoIEVUSF9UWF9CVUZGRVJfU0laRSAtIGVtYWNUT1RBTF9GUkFNRV9IRUFERVJfU0laRSApICkgKQ0KCQl7DQoJCQltZW1jcHkoICggdm9pZCAqICkgJiggcGNCdWZmZXJbIGVtYWNUT1RBTF9GUkFNRV9IRUFERVJfU0laRSBdICksICggdm9pZCAqICkgdWlwX2FwcGRhdGEsICggdWlwX2xlbiAtIGVtYWNUT1RBTF9GUkFNRV9IRUFERVJfU0laRSApICk7DQoJCX0NCg0KCQkvKiBTZW5kLiAqLwkNCgkJcG9ydEVOVEVSX0NSSVRJQ0FMKCk7DQoJCXsNCgkJCWlmKCB1eFR4QnVmZmVySW5kZXggPj0gKCBOQl9UWF9CVUZGRVJTIC0gMSApICkNCgkJCXsNCgkJCQkvKiBGaWxsIG91dCB0aGUgbmVjZXNzYXJ5IGluIHRoZSBkZXNjcmlwdG9yIHRvIGdldCB0aGUgZGF0YSBzZW50LiAqLw0KCQkJCXhUeERlc2NyaXB0b3JzWyB1eFR4QnVmZmVySW5kZXggXS5VX1N0YXR1cy5zdGF0dXMgPSAJKCB1aXBfbGVuICYgKCB1bnNpZ25lZCBsb25nICkgQVQ5MUNfTEVOR1RIX0ZSQU1FICkNCgkJCQkJCQkJCQkJCQkJCQkJCXwgQVQ5MUNfTEFTVF9CVUZGRVINCgkJCQkJCQkJCQkJCQkJCQkJCXwgQVQ5MUNfVFJBTlNNSVRfV1JBUDsNCgkJCQl1eFR4QnVmZmVySW5kZXggPSAwOw0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCS8qIEZpbGwgb3V0IHRoZSBuZWNlc3NhcnkgaW4gdGhlIGRlc2NyaXB0b3IgdG8gZ2V0IHRoZSBkYXRhIHNlbnQuICovDQoJCQkJeFR4RGVzY3JpcHRvcnNbIHV4VHhCdWZmZXJJbmRleCBdLlVfU3RhdHVzLnN0YXR1cyA9IAkoIHVpcF9sZW4gJiAoIHVuc2lnbmVkIGxvbmcgKSBBVDkxQ19MRU5HVEhfRlJBTUUgKQ0KCQkJCQkJCQkJCQkJCQkJCQkJfCBBVDkxQ19MQVNUX0JVRkZFUjsNCgkJCQl1eFR4QnVmZmVySW5kZXgrKzsNCgkJCX0NCgkNCgkJCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OQ1IgfD0gQVQ5MUNfRU1BQ19UU1RBUlQ7DQoJCX0NCgkJcG9ydEVYSVRfQ1JJVElDQUwoKTsNCgl9DQoNCglyZXR1cm4gbFJldHVybjsNCn0NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQp1bnNpZ25lZCBsb25nIHVsRU1BQ1BvbGwoIHZvaWQgKQ0Kew0Kc3RhdGljIHVuc2lnbmVkIHBvcnRCQVNFX1RZUEUgdWxOZXh0UnhCdWZmZXIgPSAwOw0KdW5zaWduZWQgbG9uZyB1bFNlY3Rpb25MZW5ndGggPSAwLCB1bExlbmd0aFNvRmFyID0gMCwgdWxFT0YgPSBwZEZBTFNFOw0KY2hhciAqcGNTb3VyY2U7DQoNCgkvKiBTa2lwIGFueSBmcmFnbWVudHMuICovDQoJd2hpbGUoICggeFJ4RGVzY3JpcHRvcnNbIHVsTmV4dFJ4QnVmZmVyIF0uYWRkciAmIEFUOTFDX09XTkVSU0hJUF9CSVQgKSAmJiAhKCB4UnhEZXNjcmlwdG9yc1sgdWxOZXh0UnhCdWZmZXIgXS5VX1N0YXR1cy5zdGF0dXMgJiBBVDkxQ19TT0YgKSApDQoJew0KCQkvKiBNYXJrIHRoZSBidWZmZXIgYXMgZnJlZSBhZ2Fpbi4gKi8NCgkJeFJ4RGVzY3JpcHRvcnNbIHVsTmV4dFJ4QnVmZmVyIF0uYWRkciAmPSB+KCBBVDkxQ19PV05FUlNISVBfQklUICk7CQkNCgkJdWxOZXh0UnhCdWZmZXIrKzsNCgkJaWYoIHVsTmV4dFJ4QnVmZmVyID49IE5CX1JYX0JVRkZFUlMgKQ0KCQl7DQoJCQl1bE5leHRSeEJ1ZmZlciA9IDA7DQoJCX0NCgl9DQoNCgkvKiBJcyB0aGVyZSBhIHBhY2tldCByZWFkeT8gKi8NCg0KCXdoaWxlKCAoIHhSeERlc2NyaXB0b3JzWyB1bE5leHRSeEJ1ZmZlciBdLmFkZHIgJiBBVDkxQ19PV05FUlNISVBfQklUICkgJiYgIXVsU2VjdGlvbkxlbmd0aCApDQoJew0KCQlwY1NvdXJjZSA9ICggY2hhciAqICkoIHhSeERlc2NyaXB0b3JzWyB1bE5leHRSeEJ1ZmZlciBdLmFkZHIgJiBlbWFjQUREUkVTU19NQVNLICk7DQoJCXVsU2VjdGlvbkxlbmd0aCA9IHhSeERlc2NyaXB0b3JzWyB1bE5leHRSeEJ1ZmZlciBdLlVfU3RhdHVzLnN0YXR1cyAmIGVtYWNSWF9MRU5HVEhfRlJBTUU7DQoNCgkJaWYoIHVsU2VjdGlvbkxlbmd0aCA9PSAwICkNCgkJew0KCQkJLyogVGhlIGZyYW1lIGlzIGxvbmdlciB0aGFuIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieSB0aGlzDQoJCQlkZXNjcmlwdG9yIHNvIGNvcHkgdGhlIGVudGlyZSBidWZmZXIgdG8gdUlQIC0gdGhlbiBtb3ZlIG9udG8NCgkJCXRoZSBuZXh0IGRlc2NyaXB0b3IgdG8gZ2V0IHRoZSByZXN0IG9mIHRoZSBmcmFtZS4gKi8NCgkJCWlmKCAoIHVsTGVuZ3RoU29GYXIgKyBFVEhfUlhfQlVGRkVSX1NJWkUgKSA8PSBVSVBfQlVGU0laRSApDQoJCQl7DQoJCQkJbWVtY3B5KCAmKCB1aXBfYnVmWyB1bExlbmd0aFNvRmFyIF0gKSwgcGNTb3VyY2UsIEVUSF9SWF9CVUZGRVJfU0laRSApOw0KCQkJCXVsTGVuZ3RoU29GYXIgKz0gRVRIX1JYX0JVRkZFUl9TSVpFOw0KCQkJfQkJCQ0KCQl9DQoJCWVsc2UNCgkJew0KCQkJLyogVGhpcyBpcyB0aGUgbGFzdCBzZWN0aW9uIG9mIHRoZSBmcmFtZS4gIENvcHkgdGhlIHNlY3Rpb24gdG8NCgkJCXVJUC4gKi8NCgkJCWlmKCB1bFNlY3Rpb25MZW5ndGggPCBVSVBfQlVGU0laRSApDQoJCQl7DQoJCQkJLyogVGhlIHNlY3Rpb24gbGVuZ3RoIGhvbGRzIHRoZSBsZW5ndGggb2YgdGhlIGVudGlyZSBmcmFtZS4NCgkJCQl1bExlbmd0aFNvRmFyIGhvbGRzIHRoZSBsZW5ndGggb2YgdGhlIGZyYW1lIHNlY3Rpb25zIGFscmVhZHkNCgkJCQljb3BpZWQgdG8gdUlQLCBzbyB0aGUgbGVuZ3RoIG9mIHRoZSBmaW5hbCBzZWN0aW9uIGlzDQoJCQkJdWxTZWN0aW9uTGVuZ3RoIC0gdWxMZW5ndGhTb0ZhcjsgKi8NCgkJCQlpZiggdWxTZWN0aW9uTGVuZ3RoID4gdWxMZW5ndGhTb0ZhciApDQoJCQkJew0KCQkJCQltZW1jcHkoICYoIHVpcF9idWZbIHVsTGVuZ3RoU29GYXIgXSApLCBwY1NvdXJjZSwgKCB1bFNlY3Rpb25MZW5ndGggLSB1bExlbmd0aFNvRmFyICkgKTsNCgkJCQl9DQoJCQl9CQkJDQoNCgkJCS8qIElzIHRoaXMgdGhlIGxhc3QgYnVmZmVyIGZvciB0aGUgZnJhbWU/ICBJZiBub3Qgd2h5PyAqLw0KCQkJdWxFT0YgPSB4UnhEZXNjcmlwdG9yc1sgdWxOZXh0UnhCdWZmZXIgXS5VX1N0YXR1cy5zdGF0dXMgJiBBVDkxQ19FT0Y7DQoJCX0NCg0KCQkvKiBNYXJrIHRoZSBidWZmZXIgYXMgZnJlZSBhZ2Fpbi4gKi8NCgkJeFJ4RGVzY3JpcHRvcnNbIHVsTmV4dFJ4QnVmZmVyIF0uYWRkciAmPSB+KCBBVDkxQ19PV05FUlNISVBfQklUICk7DQoNCgkJLyogSW5jcmVtZW50IHRvIHRoZSBuZXh0IGJ1ZmZlciwgd3JhcHBpbmcgaWYgbmVjZXNzYXJ5LiAqLw0KCQl1bE5leHRSeEJ1ZmZlcisrOw0KCQlpZiggdWxOZXh0UnhCdWZmZXIgPj0gTkJfUlhfQlVGRkVSUyApDQoJCXsNCgkJCXVsTmV4dFJ4QnVmZmVyID0gMDsNCgkJfQ0KCX0NCg0KCS8qIElmIHdlIG9idGFpbmVkIGRhdGEgYnV0IGZvciBzb21lIHJlYXNvbiBkaWQgbm90IGZpbmQgdGhlIGVuZCBvZiB0aGUNCglmcmFtZSB0aGVuIGRpc2NhcmQgdGhlIGRhdGEgYXMgaXQgbXVzdCBjb250YWluIGFuIGVycm9yLiAqLw0KCWlmKCAhdWxFT0YgKQ0KCXsNCgkJdWxTZWN0aW9uTGVuZ3RoID0gMDsNCgl9DQoNCglyZXR1cm4gdWxTZWN0aW9uTGVuZ3RoOw0KfQ0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCnN0YXRpYyB2b2lkIHBydlNldHVwRGVzY3JpcHRvcnModm9pZCkNCnsNCnVuc2lnbmVkIHBvcnRCQVNFX1RZUEUgeEluZGV4Ow0KdW5zaWduZWQgbG9uZyB1bEFkZHJlc3M7DQoNCgkvKiBJbml0aWFsaXNlIHhSeERlc2NyaXB0b3JzIGRlc2NyaXB0b3IuICovDQoJZm9yKCB4SW5kZXggPSAwOyB4SW5kZXggPCBOQl9SWF9CVUZGRVJTOyArK3hJbmRleCApDQoJew0KCQkvKiBDYWxjdWxhdGUgdGhlIGFkZHJlc3Mgb2YgdGhlIG50aCBidWZmZXIgd2l0aGluIHRoZSBhcnJheS4gKi8NCgkJdWxBZGRyZXNzID0gKCB1bnNpZ25lZCBsb25nICkoIHBjUnhCdWZmZXIgKyAoIHhJbmRleCAqIEVUSF9SWF9CVUZGRVJfU0laRSApICk7DQoNCgkJLyogV3JpdGUgdGhlIGJ1ZmZlciBhZGRyZXNzIGludG8gdGhlIGRlc2NyaXB0b3IuICBUaGUgRE1BIHdpbGwgcGxhY2UNCgkJdGhlIGRhdGEgYXQgdGhpcyBhZGRyZXNzIHdoZW4gdGhpcyBkZXNjcmlwdG9yIGlzIGJlaW5nIHVzZWQuICBNYXNrIG9mZg0KCQl0aGUgYm90dG9tIGJpdHMgb2YgdGhlIGFkZHJlc3MgYXMgdGhlc2UgaGF2ZSBzcGVjaWFsIG1lYW5pbmcuICovDQoJCXhSeERlc2NyaXB0b3JzWyB4SW5kZXggXS5hZGRyID0gdWxBZGRyZXNzICYgZW1hY0FERFJFU1NfTUFTSzsNCgl9CQ0KDQoJLyogVGhlIGxhc3QgYnVmZmVyIGhhcyB0aGUgd3JhcCBiaXQgc2V0IHNvIHRoZSBFTUFDIGtub3dzIHRvIHdyYXAgYmFjaw0KCXRvIHRoZSBmaXJzdCBidWZmZXIuICovDQoJeFJ4RGVzY3JpcHRvcnNbIE5CX1JYX0JVRkZFUlMgLSAxIF0uYWRkciB8PSBlbWFjUlhfV1JBUF9CSVQ7DQoNCgkvKiBJbml0aWFsaXNlIHhUeERlc2NyaXB0b3JzLiAqLw0KCWZvciggeEluZGV4ID0gMDsgeEluZGV4IDwgTkJfVFhfQlVGRkVSUzsgKyt4SW5kZXggKQ0KCXsNCgkJLyogQ2FsY3VsYXRlIHRoZSBhZGRyZXNzIG9mIHRoZSBudGggYnVmZmVyIHdpdGhpbiB0aGUgYXJyYXkuICovDQoJCXVsQWRkcmVzcyA9ICggdW5zaWduZWQgbG9uZyApKCBwY1R4QnVmZmVyICsgKCB4SW5kZXggKiBFVEhfVFhfQlVGRkVSX1NJWkUgKSApOw0KDQoJCS8qIFdyaXRlIHRoZSBidWZmZXIgYWRkcmVzcyBpbnRvIHRoZSBkZXNjcmlwdG9yLiAgVGhlIERNQSB3aWxsIHJlYWQNCgkJZGF0YSBmcm9tIGhlcmUgd2hlbiB0aGUgZGVzY3JpcHRvciBpcyBiZWluZyB1c2VkLiAqLw0KCQl4VHhEZXNjcmlwdG9yc1sgeEluZGV4IF0uYWRkciA9IHVsQWRkcmVzcyAmIGVtYWNBRERSRVNTX01BU0s7DQoJCXhUeERlc2NyaXB0b3JzWyB4SW5kZXggXS5VX1N0YXR1cy5zdGF0dXMgPSBBVDkxQ19UUkFOU01JVF9PSzsNCgl9CQ0KDQoJLyogVGhlIGxhc3QgYnVmZmVyIGhhcyB0aGUgd3JhcCBiaXQgc2V0IHNvIHRoZSBFTUFDIGtub3dzIHRvIHdyYXAgYmFjaw0KCXRvIHRoZSBmaXJzdCBidWZmZXIuICovDQoJeFR4RGVzY3JpcHRvcnNbIE5CX1RYX0JVRkZFUlMgLSAxIF0uVV9TdGF0dXMuc3RhdHVzID0gQVQ5MUNfVFJBTlNNSVRfV1JBUCB8IEFUOTFDX1RSQU5TTUlUX09LOw0KDQoJLyogVGVsbCB0aGUgRU1BQyB3aGVyZSB0byBmaW5kIHRoZSBkZXNjcmlwdG9ycy4gKi8NCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfUkJRUCA9ICggdW5zaWduZWQgbG9uZyApIHhSeERlc2NyaXB0b3JzOw0KCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19UQlFQID0gKCB1bnNpZ25lZCBsb25nICkgeFR4RGVzY3JpcHRvcnM7DQoJDQoJLyogQ2xlYXIgYWxsIHRoZSBiaXRzIGluIHRoZSByZWNlaXZlIHN0YXR1cyByZWdpc3Rlci4gKi8NCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfUlNSID0gKCBBVDkxQ19FTUFDX09WUiB8IEFUOTFDX0VNQUNfUkVDIHwgQVQ5MUNfRU1BQ19CTkEgKTsNCg0KCS8qIEVuYWJsZSB0aGUgY29weSBvZiBkYXRhIGludG8gdGhlIGJ1ZmZlcnMsIGlnbm9yZSBicm9hZGNhc3RzLA0KCWFuZCBkb24ndCBjb3B5IEZDUy4gKi8NCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNGR1IgfD0gKCBBVDkxQ19FTUFDX0NBRiB8IEFUOTFDX0VNQUNfTkJDIHwgQVQ5MUNfRU1BQ19EUkZDUyk7DQoNCgkvKiBFbmFibGUgUnggYW5kIFR4LCBwbHVzIHRoZSBzdGF0cyByZWdpc3Rlci4gKi8NCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNSIHw9ICggQVQ5MUNfRU1BQ19URSB8IEFUOTFDX0VNQUNfUkUgfCBBVDkxQ19FTUFDX1dFU1RBVCApOw0KfQkNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQpzdGF0aWMgdm9pZCBwcnZTZXR1cE1BQ0FkZHJlc3MoIHZvaWQgKQ0Kew0KCS8qIE11c3QgYmUgd3JpdHRlbiBTQTFMIHRoZW4gU0ExSC4gKi8NCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfU0ExTCA9CSggKCB1bnNpZ25lZCBsb25nICkgY01BQ0FkZHJlc3NbIDMgXSA8PCAyNCApIHwNCgkJCQkJCQkJCSggKCB1bnNpZ25lZCBsb25nICkgY01BQ0FkZHJlc3NbIDIgXSA8PCAxNiApIHwNCgkJCQkJCQkJCSggKCB1bnNpZ25lZCBsb25nICkgY01BQ0FkZHJlc3NbIDEgXSA8PCA4ICApIHwNCgkJCQkJCQkJCWNNQUNBZGRyZXNzWyAwIF07DQoNCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfU0ExSCA9CSggKCB1bnNpZ25lZCBsb25nICkgY01BQ0FkZHJlc3NbIDUgXSA8PCA4ICkgfA0KCQkJCQkJCQkJY01BQ0FkZHJlc3NbIDQgXTsNCn0NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQpzdGF0aWMgdm9pZCBwcnZTZXR1cEVNQUNJbnRlcnJ1cHQoIHZvaWQgKQ0Kew0KCS8qIENyZWF0ZSB0aGUgc2VtYXBob3JlIHVzZWQgdG8gdHJpZ2dlciB0aGUgRU1BQyB0YXNrLiAqLw0KCXZTZW1hcGhvcmVDcmVhdGVCaW5hcnkoIHhTZW1hcGhvcmUgKTsNCglpZiggeFNlbWFwaG9yZSApDQoJew0KCQkvKiBXZSBzdGFydCBieSAndGFraW5nJyB0aGUgc2VtYXBob3JlIHNvIHRoZSBJU1IgY2FuICdnaXZlJyBpdCB3aGVuIHRoZQ0KCQlmaXJzdCBpbnRlcnJ1cHQgb2NjdXJzLiAqLw0KCQl4U2VtYXBob3JlVGFrZSggeFNlbWFwaG9yZSwgZW1hY05PX0RFTEFZICk7DQoJCXBvcnRFTlRFUl9DUklUSUNBTCgpOw0KCQl7DQoJCQkvKiBXZSB3YW50IHRvIGludGVycnVwdCBvbiBSeCBldmVudHMuICovDQoJCQlBVDkxQ19CQVNFX0VNQUMtPkVNQUNfSUVSID0gQVQ5MUNfRU1BQ19SQ09NUDsNCg0KCQkJLyogRW5hYmxlIHRoZSBpbnRlcnJ1cHRzIGluIHRoZSBBSUMuICovDQoJCQlBVDkxRl9BSUNfQ29uZmlndXJlSXQoIEFUOTFDX0lEX0VNQUMsIGVtYWNJTlRFUlJVUFRfTEVWRUwsIEFUOTFDX0FJQ19TUkNUWVBFX0lOVF9ISUdIX0xFVkVMLCAoIHZvaWQgKCopKCB2b2lkICkgKSB2RU1BQ0lTUl9XcmFwcGVyICk7DQoJCQlBVDkxQ19CQVNFX0FJQy0+QUlDX0lFQ1IgPSAweDEgPDwgQVQ5MUNfSURfRU1BQzsNCgkJfQ0KCQlwb3J0RVhJVF9DUklUSUNBTCgpOw0KCX0NCn0NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQoNCg0KDQovKg0KICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9ucyB0YWtlbiBmcm9tIHRoZSBBdG1lbA0KICogRU1BQyBzYW1wbGUgY29kZS4NCiAqLw0KDQpzdGF0aWMgcG9ydEJBU0VfVFlQRSBwcnZQcm9iZVBIWSggdm9pZCApDQp7DQp1bnNpZ25lZCBsb25nIHVsUEhZSWQxLCB1bFBIWUlkMiwgdWxTdGF0dXM7DQpwb3J0QkFTRV9UWVBFIHhSZXR1cm4gPSBwZFBBU1M7DQoJDQoJLyogQ29kZSBzdXBwbGllZCBieSBBdG1lbCAocmVmb3JtYXR0ZWQpIC0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KCS8qIEVuYWJsZSBtYW5hZ2VtZW50IHBvcnQgKi8NCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNSIHw9IEFUOTFDX0VNQUNfTVBFOwkNCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNGR1IgfD0gKCAyICkgPDwgMTA7DQoNCgkvKiBSZWFkIHRoZSBQSFkgSUQuICovDQoJdlJlYWRQSFkoIEFUOTFDX1BIWV9BRERSLCBNSUlfUEhZU0lEMSwgJnVsUEhZSWQxICk7DQoJdlJlYWRQSFkoIEFUOTFDX1BIWV9BRERSLCBNSUlfUEhZU0lEMiwgJnVsUEhZSWQyICk7DQoNCgkvKiBBTUQgQU03OUM4NzU6DQoJCQlQSFlfSUQxID0gMHgwMDIyDQoJCQlQSFlfSUQyID0gMHg1NTQxDQoJCQlCaXRzIDM6MCBSZXZpc2lvbiBOdW1iZXIgRm91ciBiaXQgbWFudWZhY3R1cmVyknMgcmV2aXNpb24gbnVtYmVyLg0KCQkJCTAwMDEgc3RhbmRzIGZvciBSZXYuIEEsIGV0Yy4NCgkqLw0KCWlmKCAoICggdWxQSFlJZDEgPDwgMTYgKSB8ICggdWxQSFlJZDIgJiAweGZmZjAgKSApICE9IE1JSV9ETTkxNjFfSUQgKQ0KCXsNCgkJLyogRGlkIG5vdCBleHBlY3QgdGhpcyBJRC4gKi8NCgkJeFJldHVybiA9IHBkRkFJTDsNCgl9DQoJZWxzZQ0KCXsNCgkJdWxTdGF0dXMgPSB4R2V0TGlua1NwZWVkKCk7DQoNCgkJaWYoIHVsU3RhdHVzICE9IHBkUEFTUyApDQoJCXsNCgkJCXhSZXR1cm4gPSBwZEZBSUw7DQoJCX0NCgl9DQoNCgkvKiBEaXNhYmxlIG1hbmFnZW1lbnQgcG9ydCAqLw0KCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OQ1IgJj0gfkFUOTFDX0VNQUNfTVBFOwkNCg0KCS8qIEVuZCBvZiBjb2RlIHN1cHBsaWVkIGJ5IEF0bWVsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCglyZXR1cm4geFJldHVybjsNCn0NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQpzdGF0aWMgdm9pZCB2UmVhZFBIWSggdW5zaWduZWQgY2hhciB1Y1BIWUFkZHJlc3MsIHVuc2lnbmVkIGNoYXIgdWNBZGRyZXNzLCB1bnNpZ25lZCBsb25nICpwdWxWYWx1ZSApDQp7DQoJLyogQ29kZSBzdXBwbGllZCBieSBBdG1lbCAocmVmb3JtYXR0ZWQpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQoJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX01BTiA9IAkoQVQ5MUNfRU1BQ19TT0YgJiAoMHgwMTw8MzApKQ0KCQkJCQkJCQkJfCAoMiA8PCAxNikgfCAoMiA8PCAyOCkNCgkJCQkJCQkJCXwgKCh1Y1BIWUFkZHJlc3MgJiAweDFmKSA8PCAyMykNCgkJCQkJCQkJCXwgKHVjQWRkcmVzcyA8PCAxOCk7DQoNCgkvKiBXYWl0IHVudGlsIElETEUgYml0IGluIE5ldHdvcmsgU3RhdHVzIHJlZ2lzdGVyIGlzIGNsZWFyZWQuICovDQoJd2hpbGUoICEoIEFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OU1IgJiBBVDkxQ19FTUFDX0lETEUgKSApDQoJew0KCQlfX2FzbSggIk5PUCIgKTsNCgl9DQoNCgkqcHVsVmFsdWUgPSAoIEFUOTFDX0JBU0VfRU1BQy0+RU1BQ19NQU4gJiAweDAwMDBmZmZmICk7CQ0KDQoJLyogRW5kIG9mIGNvZGUgc3VwcGxpZWQgYnkgQXRtZWwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCn0NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQojaWYgVVNFX1JNSUlfSU5URVJGQUNFICE9IDENCnN0YXRpYyB2b2lkIHZXcml0ZVBIWSggdW5zaWduZWQgY2hhciB1Y1BIWUFkZHJlc3MsIHVuc2lnbmVkIGNoYXIgdWNBZGRyZXNzLCB1bnNpZ25lZCBsb25nIHVsVmFsdWUgKQ0Kew0KCS8qIENvZGUgc3VwcGxpZWQgYnkgQXRtZWwgKHJlZm9ybWF0dGVkKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19NQU4gPSAoKCBBVDkxQ19FTUFDX1NPRiAmICgweDAxPDwzMCkpDQoJCQkJCQkJCXwgKDIgPDwgMTYpIHwgKDEgPDwgMjgpDQoJCQkJCQkJCXwgKCh1Y1BIWUFkZHJlc3MgJiAweDFmKSA8PCAyMykNCgkJCQkJCQkJfCAodWNBZGRyZXNzIDw8IDE4KSkNCgkJCQkJCQkJfCAodWxWYWx1ZSAmIDB4ZmZmZik7DQoNCgkvKiBXYWl0IHVudGlsIElETEUgYml0IGluIE5ldHdvcmsgU3RhdHVzIHJlZ2lzdGVyIGlzIGNsZWFyZWQgKi8NCgl3aGlsZSggISggQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX05TUiAmIEFUOTFDX0VNQUNfSURMRSApICkNCgl7DQoJCV9fYXNtKCAiTk9QIiApOw0KCX07DQoNCgkvKiBFbmQgb2YgY29kZSBzdXBwbGllZCBieSBBdG1lbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KfQ0KI2VuZGlmDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0Kc3RhdGljIHBvcnRCQVNFX1RZUEUgeEdldExpbmtTcGVlZCggdm9pZCApDQp7DQoJdW5zaWduZWQgbG9uZyB1bEJNU1IsIHVsQk1DUiwgdWxMUEEsIHVsTUFDQ2ZnLCB1bFNwZWVkLCB1bER1cGxleDsNCg0KCS8qIENvZGUgc3VwcGxpZWQgYnkgQXRtZWwgKHJlZm9ybWF0dGVkKSAtLS0tLS0tLS0tLS0tLS0tLSovDQoNCgkvKiBMaW5rIHN0YXR1cyBpcyBsYXRjaGVkLCBzbyByZWFkIHR3aWNlIHRvIGdldCBjdXJyZW50IHZhbHVlICovDQoJdlJlYWRQSFkoQVQ5MUNfUEhZX0FERFIsIE1JSV9CTVNSLCAmdWxCTVNSKTsNCgl2UmVhZFBIWShBVDkxQ19QSFlfQUREUiwgTUlJX0JNU1IsICZ1bEJNU1IpOw0KDQoJaWYoICEoIHVsQk1TUiAmIEJNU1JfTFNUQVRVUyApICkNCgl7CQ0KCQkvKiBObyBMaW5rLiAqLw0KCQlyZXR1cm4gcGRGQUlMOw0KCX0NCg0KCXZSZWFkUEhZKEFUOTFDX1BIWV9BRERSLCBNSUlfQk1DUiwgJnVsQk1DUik7DQoJaWYgKHVsQk1DUiAmIEJNQ1JfQU5FTkFCTEUpDQoJewkJCQkNCgkJLyogQXV0b05lZ290aWF0aW9uIGlzIGVuYWJsZWQuICovDQoJCWlmICghKHVsQk1TUiAmIEJNU1JfQU5FR0NPTVBMRVRFKSkNCgkJew0KCQkJLyogQXV0by1uZWdvdGlhdGlvbiBpbiBwcm9ncmVzcy4gKi8NCgkJCXJldHVybiBwZEZBSUw7CQkJCQ0KCQl9CQkNCg0KCQl2UmVhZFBIWShBVDkxQ19QSFlfQUREUiwgTUlJX0xQQSwgJnVsTFBBKTsNCgkJaWYoICggdWxMUEEgJiBMUEFfMTAwRlVMTCApIHx8ICggdWxMUEEgJiBMUEFfMTAwSEFMRiApICkNCgkJew0KCQkJdWxTcGVlZCA9IFNQRUVEXzEwMDsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCXVsU3BlZWQgPSBTUEVFRF8xMDsNCgkJfQ0KDQoJCWlmKCAoIHVsTFBBICYgTFBBXzEwMEZVTEwgKSB8fCAoIHVsTFBBICYgTFBBXzEwRlVMTCApICkNCgkJew0KCQkJdWxEdXBsZXggPSBEVVBMRVhfRlVMTDsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCXVsRHVwbGV4ID0gRFVQTEVYX0hBTEY7DQoJCX0NCgl9DQoJZWxzZQ0KCXsNCgkJdWxTcGVlZCA9ICggdWxCTUNSICYgQk1DUl9TUEVFRDEwMCApID8gU1BFRURfMTAwIDogU1BFRURfMTA7DQoJCXVsRHVwbGV4ID0gKCB1bEJNQ1IgJiBCTUNSX0ZVTExEUExYICkgPyBEVVBMRVhfRlVMTCA6IERVUExFWF9IQUxGOw0KCX0NCg0KCS8qIFVwZGF0ZSB0aGUgTUFDICovDQoJdWxNQUNDZmcgPSBBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNGR1IgJiB+KCBBVDkxQ19FTUFDX1NQRCB8IEFUOTFDX0VNQUNfRkQgKTsNCglpZiggdWxTcGVlZCA9PSBTUEVFRF8xMDAgKQ0KCXsNCgkJaWYoIHVsRHVwbGV4ID09IERVUExFWF9GVUxMICkNCgkJew0KCQkJLyogMTAwIEZ1bGwgRHVwbGV4ICovDQoJCQlBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNGR1IgPSB1bE1BQ0NmZyB8IEFUOTFDX0VNQUNfU1BEIHwgQVQ5MUNfRU1BQ19GRDsNCgkJfQ0KCQllbHNlDQoJCXsJCQkJCQ0KCQkJLyogMTAwIEhhbGYgRHVwbGV4ICovDQoJCQlBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNGR1IgPSB1bE1BQ0NmZyB8IEFUOTFDX0VNQUNfU1BEOw0KCQl9DQoJfQ0KCWVsc2UNCgl7DQoJCWlmICh1bER1cGxleCA9PSBEVVBMRVhfRlVMTCkNCgkJew0KCQkJLyogMTAgRnVsbCBEdXBsZXggKi8NCgkJCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OQ0ZHUiA9IHVsTUFDQ2ZnIHwgQVQ5MUNfRU1BQ19GRDsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCS8qIDEwIEhhbGYgRHVwbGV4ICovDQoJCQlBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNGR1IgPSB1bE1BQ0NmZzsNCgkJfQ0KCX0NCg0KCS8qIEVuZCBvZiBjb2RlIHN1cHBsaWVkIGJ5IEF0bWVsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCglyZXR1cm4gcGRQQVNTOw0KfQ0K