LyoNCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqICAgIENDMzIyMCBTREsgLSB2MC4xMC4wMC4wMCANCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqDQogKiAgQ29weXJpZ2h0IChDKSAyMDE1IFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAtIGh0dHA6Ly93d3cudGkuY29tLyANCiAqICANCiAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgDQogKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIA0KICogIGFyZSBtZXQ6DQogKg0KICogICAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgDQogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQogKg0KICogICAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQNCiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgDQogKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgICANCiAqICAgIGRpc3RyaWJ1dGlvbi4NCiAqDQogKiAgICBOZWl0aGVyIHRoZSBuYW1lIG9mIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCBub3IgdGhlIG5hbWVzIG9mDQogKiAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkDQogKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQogKg0KICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgDQogKiAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgDQogKiAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQogKiAgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgDQogKiAgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIA0KICogIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgDQogKiAgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQogKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZDQogKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCANCiAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgDQogKiAgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCiAqICANCiAqLw0KDQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQovLw0KLy8hIFxhZGR0b2dyb3VwIFBSQ01fUG93ZXJfUmVzZXRfQ2xvY2tfTW9kdWxlX2FwaQ0KLy8hIEB7DQovLw0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KDQojaW5jbHVkZSAiaW5jL2h3X3R5cGVzLmgiDQojaW5jbHVkZSAiaW5jL2h3X2ludHMuaCINCiNpbmNsdWRlICJpbmMvaHdfbWVtbWFwLmgiDQojaW5jbHVkZSAiaW5jL2h3X2FwcHNfcmNtLmgiDQojaW5jbHVkZSAiaW5jL2h3X2dwcmNtLmgiDQojaW5jbHVkZSAiaW5jL2h3X2hpYjFwMi5oIg0KI2luY2x1ZGUgImluYy9od19oaWIzcDMuaCINCiNpbmNsdWRlICJpbmMvaHdfb2NwX3NoYXJlZC5oIg0KI2luY2x1ZGUgImluYy9od19jb21tb25fcmVnLmgiDQojaW5jbHVkZSAicHJjbS5oIg0KI2luY2x1ZGUgImludGVycnVwdC5oIg0KI2luY2x1ZGUgImNwdS5oIg0KI2luY2x1ZGUgImZsYXNoLmgiDQojaW5jbHVkZSAidXRpbHMuaCINCg0KDQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQovLyBNYWNybyBkZWZpbml0aW9uDQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQojZGVmaW5lIFBSQ01fU09GVF9SRVNFVCAgICAgICAgICAgMHgwMDAwMDAwMQ0KI2RlZmluZSBQUkNNX0VOQUJMRV9TVEFUVVMgICAgICAgIDB4MDAwMDAwMDINCiNkZWZpbmUgU1lTX0NMSyAgICAgICAgICAgICAgICAgICA4MDAwMDAwMA0KI2RlZmluZSBYVEFMX0NMSyAgICAgICAgICAgICAgICAgIDQwMDAwMDAwDQoNCg0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLy8gICAgQ0MzMjAwIGRvZXMgbm90IGhhdmUgYSB0cnVlIFJUQyBjYXBhYmlsaXR5LiBIb3dldmVyLCBBUEkocykgaW4gdGhpcyBmaWxlDQovLyAgICBwcm92aWRlIGFuIGVmZmVjdGl2ZSBtZWNoYW5pc20gdG8gc3VwcG9ydCBSVEMgZmVhdHVyZSBpbiB0aGUgZGV2aWNlLg0KLy8NCi8vICAgIFRoZSBpbXBsZW1lbnRhdGlvbiB0byBzdXBwb3J0IFJUQyBoYXMgYmVlbiBrZXB0IHZlcnkgc2ltcGxlLiBBIHNldCBvZg0KLy8gICAgSElCIE1lbW9yeSBSZWdpc3RlcnMgaW4gY29uanVuY3Rpb24gd2l0aCBTbG93IENsb2NrIENvdW50ZXIgYXJlIHVzZWQNCi8vICAgIHRvIHJlbmRlciBSVEMgaW5mb3JtYXRpb24gdG8gdXNlcnMuIENvcmUgcHJpbmNpcGxlIG9mIGRlc2lnbiBpbnZvbHZlcw0KLy8gICAgdHdvIHN0ZXBzIChhKSBlc3RhYmxpc2ggYW4gYXNzb2NpYXRpb24gYmV0d2VlbiB1c2VyIHByb3ZpZGVkIHdhbGwtY2xvY2sNCi8vICAgIGFuZCBzbG93IGNsb2NrIGNvdW50ZXIuIChiKSBzdG9yZSByZWZlcmVuY2UgdmFsdWUgb2YgdGhpcyBhc3NvY2lhdHRpb24NCi8vICAgIGluIEhJQiBSZWdpc3RlcnMuIFRoaXMgcmVmZXJlbmNlIHZhbHVlIGFuZCBTQ0MgdmFsdWUgYXJlIHRoZW4gY29tYmluZWQNCi8vICAgIHRvIGNyZWF0ZSByZWFsLXdvcmxkIGNhbGVuZGFyIHRpbWUuDQovLw0KLy8gICAgQWNyb3NzIEhJQiBjeWNsZXMsIHZhbHVlIHN0b3JlZCBpbiBISUIgUmVnaXN0ZXJzIGlzIHJldGFpbmVkIGFuZCBzbG93DQovLyAgICBjbG9jayBjb3VudGVyIGNvbnRpbnVlcyB0byB0aWNrLCB0aGVyZWJ5LCB0aGlzIGFycmFnZW1lbnQgaXMgcmVsZXZhbnQNCi8vICAgIGFuZCB2YWxpZCBhcyBsb25nIGFzIGRldmljZSBoYXMgYSAodGlja2xlKSBiYXR0ZXJ5IHBvd2VyLg0KLy8NCi8vICAgIEZ1cnRoZXIsIHByb3Zpc2lvbiBhbHNvIGhhcyBiZWVuIG1hZGUgdG8gc2V0IGFuIGFsYXJtLiBXaGVuIGl0IFJUQyB2YWx1ZQ0KLy8gICAgbWF0Y2hlcyB0aGF0IG9mIHNldCBmb3IgYWxhcm0sIGFuIGludGVycnVwdCBpcyBnZW5lcmF0ZWQuDQovLw0KLy8gICAgSElCIE1FTSBSRUcwIGFuZCBSRUcxIGFyZSByZXNlcnZlZCBmb3IgVEkuDQovLw0KLy8gICAgSWYgUlRDIGZlYXR1cmUgaXMgbm90IHVzZWQsIHRoZW4gSElCIFJFRzIgJiBSRUczIGFyZSBhdmFpbGFibGUgdG8gdXNlci4NCi8vDQovLyAgICBMb3dlciBoYWxmIG9mIFJFRzAgaXMgdXNlZCBmb3IgVEkgSFcgRUNPLg0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KI2RlZmluZSBSVENfVTY0TVNFQ19NSyh1MzJTZWNzLCB1MTZNc2VjKSAoKCh1bnNpZ25lZCBsb25nIGxvbmcpdTMyU2VjcyA8PCAxMCl8XA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUxNk1zZWMgJiAweDNGRikpDQoNCiNkZWZpbmUgUlRDX1NFQ1NfSU5fVTY0TVNFQyh1NjRNc2VjKSAgICAgKCh1bnNpZ25lZCBsb25nKSh1NjRNc2VjICA+PiAgIDEwKSkNCiNkZWZpbmUgUlRDX01TRUNfSU5fVTY0TVNFQyh1NjRNc2VjKSAgICAgKCh1bnNpZ25lZCBzaG9ydCkodTY0TXNlYyAmIDB4M0ZGKSkNCg0KI2RlZmluZSBSVENfU0VDU19VMzJfUkVHX0FERFIgICAgICAgICAgICAoSElCM1AzX0JBU0UgKyBISUIzUDNfT19NRU1fSElCX1JFRzMpDQojZGVmaW5lIFJUQ19NU0VDX1UxNl9SRUdfQUREUiAgICAgICAgICAgIChISUIzUDNfQkFTRSArIEhJQjNQM19PX01FTV9ISUJfUkVHMisyKQ0KDQojZGVmaW5lIFJUQ19VMzJTRUNTX1JFRyAgICAgICAgICAgICAgICAgKEhXUkVHKFJUQ19TRUNTX1UzMl9SRUdfQUREUikpDQojZGVmaW5lIFJUQ19VMTZNU0VDX1JFRyAgICAgICAgICAgICAgICAgKCoodW5zaWduZWQgc2hvcnQqKVJUQ19NU0VDX1UxNl9SRUdfQUREUikNCg0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLy8gUmVnaXN0ZXIgQWNjZXNzIGFuZCBVcGRhdGVzDQovLw0KLy8gVGljayBvZiBTQ0MgaGFzIGEgcmVzb2x1dGlvbiBvZiAzMjc2OEh6LCBtZWFuaW5nIDEgc2VjIGlzIGVxdWFsIHRvIDMyNzY4DQovLyBjbG9jayB0aWNrcy4gSWRlYWwgd2F5IG9mIGdldHRpbmcgdGltZSBpbiBtaWxsaXNlY29uZCB3aWxsIGludm9sdmUgZmxvYXRpbmcNCi8vIHBvaW50IGFyaXRobWV0aWMgKGRpdmlzaW9uIGJ5IDMyLjc2OCkuIFRvIGF2b2lkIHRoaXMsIHdlIHNpbXBseSBkaXZpZGUgaXQgYnkNCi8vIDMyLCB3aGljaCB3aWxsIGdpdmUgYSByYW5nZSBmcm9tIDAgLTEwMjMoaW5zdGVhZCBvZiAwLTk5OSkuIFRvIHVzZSB0aGlzDQovLyBvdXRwdXQgY29ycmVjdGx5IHdlIGhhdmUgdG8gdGFrZSBjYXJlIG9mIHRoaXMgaW5hY2N1cmFjeSBleHRlcm5hbGx5Lg0KLy8gZm9sbG93aW5nIHdyYXBwZXIgY2FuIGJlIHVzZWQgdG8gY29udmVydCB0aGUgdmFsdWUgZnJvbSBjeWNsZXMgdG8NCi8vIG1pbGxpc2Vjb25kOg0KLy8NCi8vIENZQ0xFU19VMTZNUyhjeWNsZXMpCSgoY3ljbGVzICoxMDAwKS8gMTAyNCksDQovLw0KLy8gU2ltaWxhcmx5LCBiZWZvcmUgc2V0dGluZyB0aGUgdmFsdWUsIGl0IG11c3QgYmUgZmlyc3QgY29udmVydGVkIChmcm9tIG1zIHRvDQovLyBjeWNsZXMpLg0KLy8NCi8vIFUxNk1TX0NZQ0xFUyhtc2VjKQkoKG1zZWMgKjEwMjQpLzEwMDApDQovLw0KLy8gTm90ZTogVGhlcmUgaXMgYSBwcmVjaXNpb24gbG9zcyBvZiAxIG1zIHdpdGggdGhlIGFib3ZlIHNjaGVtZS4NCi8vDQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQojZGVmaW5lIFNDQ19VNjRNU0VDX0dFVCgpICAgICAgICAgICAgICAgIChQUkNNU2xvd0Nsa0N0ckdldCgpID4+IDUpDQojZGVmaW5lIFNDQ19VNjRNU0VDX01BVENIX1NFVCh1NjRNc2VjKSAgIChQUkNNU2xvd0Nsa0N0ck1hdGNoU2V0KHU2NE1zZWMgPDwgNSkpDQojZGVmaW5lIFNDQ19VNjRNU0VDX01BVENIX0dFVCgpICAgICAgICAgIChQUkNNU2xvd0Nsa0N0ck1hdGNoR2V0KCkgPj4gNSkNCg0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLy8NCi8vIEJpdDogIDMxIGlzIHVzZWQgdG8gaW5kaWNhdGUgdXNlIG9mIFJUQy4gSWYgc2V0IGFzICcxJywgUlRDIGZlYXR1cmUgaXMgdXNlZC4NCi8vIEJpdHM6IDMwIHRvIDI2IGFyZSByZXNlcnZlZCwgYXZhaWxhYmxlIHRvIHNvZnR3YXJlIGZvciB1c2UNCi8vIEJpdHM6IDI1IHRvIDE2IGFyZSB1c2VkIHRvIHNhdmUgbWlsbGlzZWNvbmQgcGFydCBvZiBSVEMgcmVmZXJlbmNlLg0KLy8gQml0czogMTUgdG8gMCBhcmUgYmVpbmcgdXNlZCBmb3IgSFcgQ2hhbmdlcyAvIEVDTw0KLy8NCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCg0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLy8gU2V0IFJUQyBVU0UgQml0DQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQpzdGF0aWMgdm9pZCBSVENVc2VTZXQodm9pZCkNCnsNCiAgdW5zaWduZWQgc2hvcnQgdXNSZWdWYWx1ZTsNCg0KICB1c1JlZ1ZhbHVlID0gUlRDX1UxNk1TRUNfUkVHIHwgICgxIDw8IDE1KTsNCg0KICBVdGlsc0RlbGF5KCg4MCoyMDApLzMpOw0KDQogIFJUQ19VMTZNU0VDX1JFRyA9IHVzUmVnVmFsdWU7DQp9DQoNCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi8vIENoZWNrcyBpZiBSVEMtVVNFIGJpdCBpcyBzZXQNCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCnN0YXRpYyB0Qm9vbGVhbiBJc1JUQ1VzZWQodm9pZCkNCnsNCiAgdW5zaWduZWQgc2hvcnQgdXNSZWdWYWx1ZTsNCg0KICB1c1JlZ1ZhbHVlID0gUlRDX1UxNk1TRUNfUkVHOw0KDQogIFV0aWxzRGVsYXkoKDgwKjIwMCkvMyk7DQoNCiAgcmV0dXJuICgodXNSZWdWYWx1ZSAmICgxIDw8IDE1KSk/IHRydWUgOiBmYWxzZSk7DQp9DQoNCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi8vIFJlYWQgMTYtYml0IG1TZWNzDQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQpzdGF0aWMgdW5zaWduZWQgc2hvcnQgUlRDVTE2TVNlY1JlZ1JlYWQodm9pZCkNCnsNCiAgdW5zaWduZWQgc2hvcnQgdXNSZWdWYWx1ZTsNCg0KICB1c1JlZ1ZhbHVlID0gUlRDX1UxNk1TRUNfUkVHOw0KDQogIFV0aWxzRGVsYXkoKDgwKjIwMCkvMyk7DQoNCiAgcmV0dXJuICh1c1JlZ1ZhbHVlICYgMHgzRkYpOw0KfQ0KDQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQovLyBXcml0ZSAxNi1iaXQgbVNlY3MNCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCnN0YXRpYyB2b2lkIFJUQ1UxNk1TZWNSZWdXcml0ZSh1bnNpZ25lZCBzaG9ydCB1MTZNc2VjKQ0Kew0KICAgdW5zaWduZWQgc2hvcnQgdXNSZWdWYWx1ZTsNCg0KICAgdXNSZWdWYWx1ZSA9IFJUQ19VMTZNU0VDX1JFRzsNCg0KICAgVXRpbHNEZWxheSgoODAqMjAwKS8zKTsNCg0KICAgUlRDX1UxNk1TRUNfUkVHID0gKCh1c1JlZ1ZhbHVlICYgfjB4M0ZGKSB8dTE2TXNlYyk7DQp9DQoNCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi8vIFJlYWQgMzItYml0IFNlY3MNCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCnN0YXRpYyB1bnNpZ25lZCBsb25nIFJUQ1UzMlNlY1JlZ1JlYWQodm9pZCkNCnsNCiAgcmV0dXJuIChQUkNNSElCUmVnUmVhZChSVENfU0VDU19VMzJfUkVHX0FERFIpKTsNCn0NCg0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLy8gV3JpdGUgMzItYml0IFNlY3MNCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCnN0YXRpYyB2b2lkIFJUQ1UzMlNlY1JlZ1dyaXRlKHVuc2lnbmVkIGxvbmcgdTMyTXNlYykNCnsNCiAgIFBSQ01ISUJSZWdXcml0ZShSVENfU0VDU19VMzJfUkVHX0FERFIsIHUzMk1zZWMpOw0KfQ0KDQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQovLyBNYWNyb3MNCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiNkZWZpbmUgSVNfUlRDX1VTRUQoKSAgICAgICAgICAgICAgICAgICBJc1JUQ1VzZWQoKQ0KI2RlZmluZSBSVENfVVNFX1NFVCgpICAgICAgICAgICAgICAgICAgIFJUQ1VzZVNldCgpDQoNCiNkZWZpbmUgUlRDX1UxNk1TRUNfUkVHX1JEKCkgICAgICAgICAgICBSVENVMTZNU2VjUmVnUmVhZCgpDQojZGVmaW5lIFJUQ19VMTZNU0VDX1JFR19XUih1MTZNc2VjKSAgICAgUlRDVTE2TVNlY1JlZ1dyaXRlKHUxNk1zZWMpDQoNCiNkZWZpbmUgUlRDX1UzMlNFQ1NfUkVHX1JEKCkgICAgICAgICAgICBSVENVMzJTZWNSZWdSZWFkKCkNCiNkZWZpbmUgUlRDX1UzMlNFQ1NfUkVHX1dSKHUzMlNlY3MpICAgICBSVENVMzJTZWNSZWdXcml0ZSh1MzJTZWNzKQ0KDQojZGVmaW5lIFNFTEVDVF9TQ0NfVTQyQklUUyh1NjRNc2VjKSAgICAgKHU2NE1zZWMgJiAweDNmZmZmZmZmZmZmKQ0KDQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQovLyBHbG9iYWwgUGVyaXBoZXJhbCBjbG9jayBhbmQgcmVzdCBSZWdpc3RlcnMNCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCnN0YXRpYyBjb25zdCBQUkNNX1BlcmlwaFJlZ3NfdCBQUkNNX1BlcmlwaFJlZ3NMaXN0W10gPQ0Kew0KDQoJe0FQUFNfUkNNX09fQ0FNRVJBX0NMS19HQVRJTkcsICAgQVBQU19SQ01fT19DQU1FUkFfU09GVF9SRVNFVCAgIH0sDQoJe0FQUFNfUkNNX09fTUNBU1BfQ0xLX0dBVElORywgICAgQVBQU19SQ01fT19NQ0FTUF9TT0ZUX1JFU0VUICAgIH0sDQoJe0FQUFNfUkNNX09fTU1DSFNfQ0xLX0dBVElORywgICAgQVBQU19SQ01fT19NTUNIU19TT0ZUX1JFU0VUICAgIH0sDQoJe0FQUFNfUkNNX09fTUNTUElfQTFfQ0xLX0dBVElORywgQVBQU19SQ01fT19NQ1NQSV9BMV9TT0ZUX1JFU0VUIH0sDQoJe0FQUFNfUkNNX09fTUNTUElfQTJfQ0xLX0dBVElORywgQVBQU19SQ01fT19NQ1NQSV9BMl9TT0ZUX1JFU0VUIH0sDQoJe0FQUFNfUkNNX09fVURNQV9BX0NMS19HQVRJTkcsICAgQVBQU19SQ01fT19VRE1BX0FfU09GVF9SRVNFVCAgIH0sDQoJe0FQUFNfUkNNX09fR1BJT19BX0NMS19HQVRJTkcsICAgQVBQU19SQ01fT19HUElPX0FfU09GVF9SRVNFVCAgIH0sDQoJe0FQUFNfUkNNX09fR1BJT19CX0NMS19HQVRJTkcsICAgQVBQU19SQ01fT19HUElPX0JfU09GVF9SRVNFVCAgIH0sDQoJe0FQUFNfUkNNX09fR1BJT19DX0NMS19HQVRJTkcsICAgQVBQU19SQ01fT19HUElPX0NfU09GVF9SRVNFVCAgIH0sDQoJe0FQUFNfUkNNX09fR1BJT19EX0NMS19HQVRJTkcsICAgQVBQU19SQ01fT19HUElPX0RfU09GVF9SRVNFVCAgIH0sDQoJe0FQUFNfUkNNX09fR1BJT19FX0NMS19HQVRJTkcsICAgQVBQU19SQ01fT19HUElPX0VfU09GVF9SRVNFVCAgIH0sDQoJe0FQUFNfUkNNX09fV0RPR19BX0NMS19HQVRJTkcsICAgQVBQU19SQ01fT19XRE9HX0FfU09GVF9SRVNFVCAgIH0sDQoJe0FQUFNfUkNNX09fVUFSVF9BMF9DTEtfR0FUSU5HLCAgQVBQU19SQ01fT19VQVJUX0EwX1NPRlRfUkVTRVQgIH0sDQoJe0FQUFNfUkNNX09fVUFSVF9BMV9DTEtfR0FUSU5HLCAgQVBQU19SQ01fT19VQVJUX0ExX1NPRlRfUkVTRVQgIH0sDQoJe0FQUFNfUkNNX09fR1BUX0EwX0NMS19HQVRJTkcgLCAgQVBQU19SQ01fT19HUFRfQTBfU09GVF9SRVNFVCAgIH0sDQoJe0FQUFNfUkNNX09fR1BUX0ExX0NMS19HQVRJTkcsICAgQVBQU19SQ01fT19HUFRfQTFfU09GVF9SRVNFVCAgIH0sDQoJe0FQUFNfUkNNX09fR1BUX0EyX0NMS19HQVRJTkcsICAgQVBQU19SQ01fT19HUFRfQTJfU09GVF9SRVNFVCAgIH0sDQoJe0FQUFNfUkNNX09fR1BUX0EzX0NMS19HQVRJTkcsICAgQVBQU19SQ01fT19HUFRfQTNfU09GVF9SRVNFVCAgIH0sDQoJe0FQUFNfUkNNX09fQ1JZUFRPX0NMS19HQVRJTkcsICAgQVBQU19SQ01fT19DUllQVE9fU09GVF9SRVNFVCAgIH0sDQoJe0FQUFNfUkNNX09fTUNTUElfUzBfQ0xLX0dBVElORywgQVBQU19SQ01fT19NQ1NQSV9TMF9TT0ZUX1JFU0VUIH0sDQoJe0FQUFNfUkNNX09fSTJDX0NMS19HQVRJTkcsICAgICAgQVBQU19SQ01fT19JMkNfU09GVF9SRVNFVCAgICAgIH0NCg0KfTsNCg0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLy8NCi8vISBQZXJmb3JtcyBhIHNvZnR3YXJlIHJlc2V0IG9mIGEgTUNVIGFuZCBhc3NvY2lhdGVkIHBlcmlwaGVyYWxzDQovLyENCi8vISBccGFyYW0gYkluY2x1ZGVTdWJzeXN0ZW0gaXMgXGIgdHJ1ZSB0byByZXNldCBhc3NvY2lhdGVkIHBlcmlwaGVyYWxzLg0KLy8hDQovLyEgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBhIHNvZnR3YXJlIHJlc2V0IG9mIGEgTUNVIGFuZCBhc3NvY2lhdGVkIHBlcmlwaGVyYWxzLg0KLy8hIFRvIHJlc2V0IHRoZSBhc3NvY2lhdGVkIHBlcmlwaGVyYWwsIHRoZSBwYXJhbWV0ZXIgXGUgYkluY2x1ZGVTdWJzeXN0ZW0NCi8vISBzaG91bGQgYmUgc2V0IHRvIFxiIHRydWUuDQovLyENCi8vISBccmV0dXJuIE5vbmUuDQovLw0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0Kdm9pZCBQUkNNTUNVUmVzZXQodEJvb2xlYW4gYkluY2x1ZGVTdWJzeXN0ZW0pDQp7DQogIGlmKGJJbmNsdWRlU3Vic3lzdGVtKQ0KICB7DQogICAgLy8NCiAgICAvLyBSZXNldCBBcHBzIHByb2Nlc3NvciBhbmQgYXNzb2NpYXRlZCBwZXJpcGhlcmFsDQogICAgLy8NCiAgICBIV1JFRyhHUFJDTV9CQVNFKyBHUFJDTV9PX0FQUFNfU09GVF9SRVNFVCkgPSAweDI7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLy8NCiAgICAvLyBSZXNldCBBcHBzIHByb2Nlc3NvciBvbmx5DQogICAgLy8NCiAgICBIV1JFRyhHUFJDTV9CQVNFKyBHUFJDTV9PX0FQUFNfU09GVF9SRVNFVCkgPSAweDE7DQogIH0NCg0KICAvLw0KICAvLyBXYWl0IGZvciBzeXN0ZW0gdG8gZW50ZXIgaGliZXJuYXRlDQogIC8vDQogIF9fYXNtKCIgICAgd2ZpXG4iKTsNCg0KICAvLw0KICAvLyBJbmZpbml0ZSBsb29wDQogIC8vDQogIHdoaWxlKDEpDQogIHsNCg0KICB9DQp9DQoNCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi8vDQovLyEgR2V0cyB0aGUgcmVhc29uIGZvciBhIHJlc2V0Lg0KLy8hDQovLyEgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZWFzb24ocykgZm9yIGEgcmVzZXQuIFRoZSByZXNldCByZWFzb24gYXJlOi0NCi8vISAtXGIgUFJDTV9QT1dFUl9PTiAgLSBEZXZpY2UgaXMgcG93ZXJpbmcgdXAuDQovLyEgLVxiIFBSQ01fTFBEU19FWElUIC0gRGV2aWNlIGlzIGV4aXRpbmcgZnJvbSBMUERTLg0KLy8hIC1cYiBQUkNNX0NPUkVfUkVTRVQgLSBEZXZpY2UgaXMgZXhpdGluZyBzb2Z0IGNvcmUgb25seSByZXNldA0KLy8hIC1cYiBQUkNNX01DVV9SRVNFVCAtIERldmljZSBpcyBleGl0aW5nIHNvZnQgc3Vic3lzdGVtIHJlc2V0Lg0KLy8hIC1cYiBQUkNNX1dEVF9SRVNFVCAtIERldmljZSB3YXMgcmVzZXQgYnkgd2F0Y2hkb2cuDQovLyEgLVxiIFBSQ01fU09DX1JFU0VUIC0gRGV2aWNlIGlzIGV4dGluZyBTT0MgcmVzZXQuDQovLyEgLVxiIFBSQ01fSElCX0VYSVQgLSBEZXZpY2UgaXMgZXhpdGluZyBoaWJlcm5hdGUuDQovLyENCi8vISBccmV0dXJuIFJldHVybnMgb25lIG9mIHRoZSBjYXVzZSBkZWZpbmVkIGFib3ZlLg0KLy8NCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCnVuc2lnbmVkIGxvbmcgUFJDTVN5c1Jlc2V0Q2F1c2VHZXQoKQ0Kew0KICB1bnNpZ25lZCBsb25nIHVsV2FrZXVwU3RhdHVzOw0KDQogIC8vDQogIC8vIFJlYWQgdGhlIFJlc2V0IHN0YXR1cw0KICAvLw0KICB1bFdha2V1cFN0YXR1cyA9IChIV1JFRyhHUFJDTV9CQVNFKyBHUFJDTV9PX0FQUFNfUkVTRVRfQ0FVU0UpICYgMHhGRik7DQoNCiAgLy8NCiAgLy8gRm9yIGhpYmVybmF0ZSBkbyBhZGRpdGlvbmFsIGNoZWNrLg0KICAvLw0KICBpZih1bFdha2V1cFN0YXR1cyA9PSBQUkNNX1BPV0VSX09OKQ0KICB7DQogICAgaWYoUFJDTUhJQlJlZ1JlYWQoSElCM1AzX0JBU0UgKyBISUIzUDNfT19NRU1fSElCX1dBS0VfU1RBVFVTKSAmIDB4MSkNCiAgICB7DQogICAgICB1bFdha2V1cFN0YXR1cyA9IFBSQ01fSElCX0VYSVQ7DQoNCiAgICAgIGlmKCAoSFdSRUcoT0NQX1NIQVJFRF9CQVNFICsgT0NQX1NIQVJFRF9PX1NQQVJFX1JFR184KSAmICgweDAwMDAwMjgwKSkgPT0gMHgwMDAwMDI4MCAgKQ0KICAgICAgew0KICAgICAgICB1bFdha2V1cFN0YXR1cyA9IFBSQ01fV0RUX1JFU0VUOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KICBlbHNlIGlmKCh1bFdha2V1cFN0YXR1cyA9PSBQUkNNX0xQRFNfRVhJVCkgJiYNCiAgICAgICAgICAhKEhXUkVHKEdQUkNNX0JBU0UgKyBHUFJDTV9PX0dQUkNNX0VGVVNFX1JFQURfUkVHMSkgJiAoMSA8PDIpKSApDQogIHsNCiAgICBpZihIV1JFRyhPQ1BfU0hBUkVEX0JBU0UgKyBPQ1BfU0hBUkVEX09fU1BBUkVfUkVHXzgpICYgKDB4MTw8OCkpDQogICAgew0KICAgICAgdWxXYWtldXBTdGF0dXMgPSBQUkNNX1BPV0VSX09OOw0KICAgIH0NCiAgfQ0KDQogIC8vDQogIC8vIFJldHVybiBzdGF0dXMuDQogIC8vDQogIHJldHVybiB1bFdha2V1cFN0YXR1czsNCn0NCg0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLy8NCi8vISBFbmFibGUgY2xvY2socykgdG8gcGVyaXBoZXJhbC4NCi8vIQ0KLy8hIFxwYXJhbSB1bFBlcmlwaGVyYWwgaXMgb25lIG9mIHRoZSB2YWxpZCBwZXJpcGhlcmFscw0KLy8hIFxwYXJhbSB1bENsa0ZsYWdzIGFyZSBiaXRtYXNrIG9mIGNsb2NrKHMpIHRvIGJlIGVuYWJsZWQuDQovLyENCi8vISBUaGlzIGZ1bmN0aW9uIGVuYWJsZXMgdGhlIGNsb2NrIGZvciB0aGUgc3BlY2lmaWVkIHBlcmlwaGVyYWwuIFBlcmlwaGVyYWxzDQovLyEgYXJlIGJ5IGRlZmF1bHQgY2xvY2sgZ2F0ZWQgKGRpc2FibGVkKSBhbmQgZ2VuZXJhdGVzIGEgYnVzIGZhdWx0IGlmDQovLyEgYWNjZXNzZWQuDQovLyENCi8vISBUaGUgcGFyYW1ldGVyIFxlIHVsQ2xrRmxhZ3MgY2FuIGJlIGxvZ2ljYWwgT1Igb2YgdGhlIGZvbGxvd2luZzoNCi8vISAtXGIgUFJDTV9SVU5fTU9ERV9DTEsgLSBVbmdhdGVzIGNsb2NrIHRvIHRoZSBwZXJpcGhlcmFsDQovLyEgLVxiIFBSQ01fU0xQX01PREVfQ0xLIC0gS2VlcHMgdGhlIGNsb2NrcyB1bmdhdGVkIGluIHNsZWVwLg0KLy8hDQovLyEgXHJldHVybiBOb25lLg0KLy8NCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCnZvaWQNClBSQ01QZXJpcGhlcmFsQ2xrRW5hYmxlKHVuc2lnbmVkIGxvbmcgdWxQZXJpcGhlcmFsLCB1bnNpZ25lZCBsb25nIHVsQ2xrRmxhZ3MpDQp7DQogIC8vDQogIC8vIEVuYWJsZSB0aGUgc3BlY2lmaWVkIHBlcmlwaGVyYWwgY2xvY2tzLCBOb3RoaW5nIHRvIGJlIGRvbmUgZm9yIFBSQ01fQURDDQogIC8vIGFzIGl0IGlzIGEgZHVtbXkgZGVmaW5lIGZvciBwaW5tdXggdXRpbGl0eSBjb2RlIGdlbmVyYXRpb24NCiAgLy8NCiAgaWYodWxQZXJpcGhlcmFsICE9IFBSQ01fQURDKQ0KICB7DQogICAgSFdSRUcoQVJDTV9CQVNFICsgUFJDTV9QZXJpcGhSZWdzTGlzdFt1bFBlcmlwaGVyYWxdLnVsQ2xrUmVnKSB8PSB1bENsa0ZsYWdzOw0KICB9DQogIA0KICAvLw0KICAvLyBDaGVja2luZyBST00gVmVyc2lvbiBsZXNzIHRoYW4gMi54LnguIA0KICAvLyBPbmx5IGZvciBkcml2ZXJsaWIgYmFja3dhcmQgY29tcGF0aWJpbGl0eQ0KICAvLw0KICBpZiggKEhXUkVHKDB4MDAwMDA0MDApICYgMHhGRkZGKSA8IDIgKQ0KICB7DQogICAgLy8NCiAgICAvLyBTZXQgdGhlIGRlZmF1bHQgY2xvY2sgZm9yIGNhbWVyYQ0KICAgIC8vDQogICAgaWYodWxQZXJpcGhlcmFsID09IFBSQ01fQ0FNRVJBKQ0KICAgIHsNCiAgICAgIEhXUkVHKEFSQ01fQkFTRSArIEFQUFNfUkNNX09fQ0FNRVJBX0NMS19HRU4pID0gMHgwNDA0Ow0KICAgIH0NCiAgfQ0KfQ0KDQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQovLw0KLy8hIERpc2FibGVzIGNsb2NrKHMpIHRvIHBlcmlwaGVyYWwuDQovLyENCi8vISBccGFyYW0gdWxQZXJpcGhlcmFsIGlzIG9uZSBvZiB0aGUgdmFsaWQgcGVyaXBoZXJhbHMNCi8vISBccGFyYW0gdWxDbGtGbGFncyBhcmUgYml0bWFzayBvZiBjbG9jayhzKSB0byBiZSBlbmFibGVkLg0KLy8hDQovLyEgVGhpcyBmdW5jdGlvbiBkaXNhYmxlIHRoZSBjbG9jayBmb3IgdGhlIHNwZWNpZmllZCBwZXJpcGhlcmFsLiBQZXJpcGhlcmFscw0KLy8hIGFyZSBieSBkZWZhdWx0IGNsb2NrIGdhdGVkIChkaXNhYmxlZCkgYW5kIGdlbmVyYXRlZCBhIGJ1cyBmYXVsdCBpZg0KLy8hIGFjY2Vzc2VkLg0KLy8hDQovLyEgVGhlIHBhcmFtZXRlciBcZSB1bENsa0ZsYWdzIGNhbiBiZSBsb2dpY2FsIE9SIGJpdCBmaWVsZHMgYXMgZGVmaW5lZCBpbg0KLy8hIFBSQ01FbmFibGVQZXJpcGhlcmFsKCkuDQovLyENCi8vISBccmV0dXJuIE5vbmUuDQovLw0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0Kdm9pZA0KUFJDTVBlcmlwaGVyYWxDbGtEaXNhYmxlKHVuc2lnbmVkIGxvbmcgdWxQZXJpcGhlcmFsLCB1bnNpZ25lZCBsb25nIHVsQ2xrRmxhZ3MpDQp7DQogIC8vDQogIC8vIERpc2FibGUgdGhlIHNwZWNpZmllZCBwZXJpcGhlcmFsIGNsb2Nrcw0KICAvLw0KICBIV1JFRyhBUkNNX0JBU0UgKyBQUkNNX1BlcmlwaFJlZ3NMaXN0W3VsUGVyaXBoZXJhbF0udWxDbGtSZWcpICY9IH51bENsa0ZsYWdzOw0KfQ0KDQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQovLw0KLy8hIEdldHMgdGhlIGlucHV0IGNsb2NrIGZvciB0aGUgc3BlY2lmaWVkIHBlcmlwaGVyYWwuDQovLyENCi8vISBccGFyYW0gdWxQZXJpcGhlcmFsIGlzIG9uZSBvZiB0aGUgdmFsaWQgcGVyaXBoZXJhbHMuDQovLyENCi8vISBUaGlzIGZ1bmN0aW9uIGdldHMgdGhlIGlucHV0IGNsb2NrIGZvciB0aGUgc3BlY2lmaWVkIHBlcmlwaGVyYWwuDQovLyENCi8vISBUaGUgcGFyYW1ldGVyIFxlIHVsUGVyaXBoZXJhbCBoYXMgdGhlIHNhbWUgZGVmaW5pdGlvbiBhcyB0aGF0IGluDQovLyEgUFJDTVBlcmlwaGVyYWxDbGtFbmFibGUoKTsNCi8vIQ0KLy8hIFxyZXR1cm4gUmV0dXJucyBpbnB1dCBjbG9jayBmcmVxdWVuY3kgZm9yIHNwZWNpZmllZCBwZXJpcGhlcmFsLg0KLy8NCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCnVuc2lnbmVkIGxvbmcNClBSQ01QZXJpcGhlcmFsQ2xvY2tHZXQodW5zaWduZWQgbG9uZyB1bFBlcmlwaGVyYWwpDQp7DQogIHVuc2lnbmVkIGxvbmcgdWxDbG9ja0ZyZXE7DQogIHVuc2lnbmVkIGxvbmcgdWxIaVB1bHNlRGl2Ow0KICB1bnNpZ25lZCBsb25nIHVsTG9QdWxzZURpdjsNCg0KICAvLw0KICAvLyBHZXQgdGhlIGNsb2NrIGJhc2VkIG9uIHNwZWNpZmllZCBwZXJpcGhlcmFsLg0KICAvLw0KICBpZigoKHVsUGVyaXBoZXJhbCA9PSBQUkNNX1NTUEkpIHwgKHVsUGVyaXBoZXJhbCA9PSBQUkNNX0xTUEkpDQogICAgICAgICAgICB8ICh1bFBlcmlwaGVyYWwgPT0gUFJDTV9HU1BJKSkpDQogIHsNCiAgICByZXR1cm4gWFRBTF9DTEs7DQogIH0NCiAgZWxzZSBpZih1bFBlcmlwaGVyYWwgPT0gUFJDTV9DQU1FUkEpDQogIHsNCiAgICB1bEhpUHVsc2VEaXYgPSAoKEhXUkVHKEFSQ01fQkFTRSArIEFQUFNfUkNNX09fQ0FNRVJBX0NMS19HRU4pID4+IDgpICYgMHgwNyk7DQogICAgdWxMb1B1bHNlRGl2ID0gKEhXUkVHKEFSQ01fQkFTRSArIEFQUFNfUkNNX09fQ0FNRVJBX0NMS19HRU4pJiAweEZGKTsNCiAgfQ0KICBlbHNlIGlmKHVsUGVyaXBoZXJhbCA9PSBQUkNNX1NESE9TVCkNCiAgew0KICAgIHVsSGlQdWxzZURpdiA9ICgoSFdSRUcoQVJDTV9CQVNFICsgQVBQU19SQ01fT19NTUNIU19DTEtfR0VOKSA+PiA4KSAmIDB4MDcpOw0KICAgIHVsTG9QdWxzZURpdiA9IChIV1JFRyhBUkNNX0JBU0UgKyBBUFBTX1JDTV9PX01NQ0hTX0NMS19HRU4pJiAweEZGKTsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICByZXR1cm4gU1lTX0NMSzsNCiAgfQ0KDQogIC8vDQogIC8vIENvbXB1dGUgdGhlIGNsb2NrIGZyZXEuIGZyb20gdGhlIGRpdmlkZXIgdmFsdWUNCiAgLy8NCiAgdWxDbG9ja0ZyZXEgPSAoMjQwMDAwMDAwLygodWxIaVB1bHNlRGl2ICsgMSkgKyAodWxMb1B1bHNlRGl2ICsgMSkpKTsNCg0KICAvLw0KICAvLyBSZXR1cm4gdGhlIGNsb2NrIHJhdGUuDQogIC8vDQogIHJldHVybiB1bENsb2NrRnJlcTsNCn0NCg0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLy8NCi8vISBQZXJmb3JtcyBhIHNvZnR3YXJlIHJlc2V0IG9mIGEgcGVyaXBoZXJhbC4NCi8vIQ0KLy8hIFxwYXJhbSB1bFBlcmlwaGVyYWwgaXMgb25lIG9mIHRoZSB2YWxpZCBwZXJpcGhlcmFsLg0KLy8hDQovLyEgVGhpcyBmdW5jdGlvbiBkb2VzIHNvZnQgcmVzZXQgb2YgdGhlIHNwZWNpZmllZCBwZXJpcGhlcmFsDQovLyENCi8vISBccmV0dXJuIE5vbmUuDQovLw0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0Kdm9pZA0KUFJDTVBlcmlwaGVyYWxSZXNldCh1bnNpZ25lZCBsb25nIHVsUGVyaXBoZXJhbCkNCnsNCiAgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyB1bERlbGF5Ow0KDQogIGlmKCB1bFBlcmlwaGVyYWwgIT0gUFJDTV9EVEhFKQ0KICB7DQogICAgLy8NCiAgICAvLyBBc3NlcnQgdGhlIHJlc2V0DQogICAgLy8NCiAgICBIV1JFRyhBUkNNX0JBU0UgKyBQUkNNX1BlcmlwaFJlZ3NMaXN0W3VsUGVyaXBoZXJhbF0udWxSc3RSZWcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8PSBQUkNNX1NPRlRfUkVTRVQ7DQogICAgLy8NCiAgICAvLyBEZWxheSBhIGxpdHRsZSBiaXQuDQogICAgLy8NCiAgICBmb3IodWxEZWxheSA9IDA7IHVsRGVsYXkgPCAxNjsgdWxEZWxheSsrKQ0KICAgIHsNCiAgICB9DQoNCiAgICAvLw0KICAgIC8vIERlYXNzZXJ0IHRoZSByZXNldA0KICAgIC8vDQogICAgSFdSRUcoQVJDTV9CQVNFK1BSQ01fUGVyaXBoUmVnc0xpc3RbdWxQZXJpcGhlcmFsXS51bFJzdFJlZykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmPSB+UFJDTV9TT0ZUX1JFU0VUOw0KICB9DQp9DQoNCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi8vDQovLyEgRGV0ZXJtaW5lcyBpZiBhIHBlcmlwaGVyYWwgaXMgcmVhZHkuDQovLyENCi8vISBccGFyYW0gdWxQZXJpcGhlcmFsIGlzIG9uZSBvZiB0aGUgdmFsaWQgbW9kdWxlcw0KLy8hDQovLyEgVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIGlmIGEgcGFydGljdWxhciBwZXJpcGhlcmFsIGlzIHJlYWR5IHRvIGJlDQovLyEgYWNjZXNzZWQuIFRoZSBwZXJpcGhlcmFsIG1heSBiZSBpbiBhIG5vbi1yZWFkeSBzdGF0ZSBpZiBpdCBpcyBub3QgZW5hYmxlZCwNCi8vISBpcyBiZWluZyBoZWxkIGluIHJlc2V0LCBvciBpcyBpbiB0aGUgcHJvY2VzcyBvZiBiZWNvbWluZyByZWFkeSBhZnRlciBiZWluZw0KLy8hIGVuYWJsZWQgb3IgdGFrZW4gb3V0IG9mIHJlc2V0Lg0KLy8hDQovLyEgXHJldHVybiBSZXR1cm5zIFxiIHRydWUgaWYgdGhlICBwZXJpcGhlcmFsIGlzIHJlYWR5LCBcYiBmYWxzZSBvdGhlcndpc2UuDQovLw0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KdEJvb2xlYW4NClBSQ01QZXJpcGhlcmFsU3RhdHVzR2V0KHVuc2lnbmVkIGxvbmcgdWxQZXJpcGhlcmFsKQ0Kew0KICB1bnNpZ25lZCBsb25nIFJlYWR5Qml0Ow0KDQogIC8vDQogIC8vIFJlYWQgdGhlIHJlYWR5IGJpdCBzdGF0dXMNCiAgLy8NCiAgUmVhZHlCaXQgPSBIV1JFRyhBUkNNX0JBU0UgKyBQUkNNX1BlcmlwaFJlZ3NMaXN0W3VsUGVyaXBoZXJhbF0udWxSc3RSZWcpOw0KICBSZWFkeUJpdCA9IFJlYWR5Qml0ICYgUFJDTV9FTkFCTEVfU1RBVFVTOw0KDQogIGlmIChSZWFkeUJpdCkNCiAgew0KICAgIC8vDQogICAgLy8gTW9kdWxlIGlzIHJlYWR5DQogICAgLy8NCiAgICByZXR1cm4odHJ1ZSk7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLy8NCiAgICAvLyBNb2R1bGUgaXMgbm90IHJlYWR5DQogICAgLy8NCiAgICByZXR1cm4oZmFsc2UpOw0KICB9DQp9DQoNCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi8vDQovLyEgQ29uZmlndXJlIEkyUyBmcmFjYWN0aW9uYWwgZGl2aWRlcg0KLy8hDQovLyEgXHBhcmFtIHVsSTJDQ2xrRnJlcSBpcyB0aGUgcmVxdWlyZWQgaW5wdXQgY2xvY2sgZm9yIE1jQVBTIG1vZHVsZQ0KLy8hDQovLyEgVGhpcyBmdW5jdGlvbiBjb25maWd1cmVzIEkyUyBmcmFjdGlvbmFsIGRpdmlkZXIuIEJ5IGRlZmF1bHQgdGhpcw0KLy8hIGRpdmlkZXIgaXMgc2V0IHRvIG91dHB1dCAyNCBNaHogY2xvY2sgdG8gSTJTIG1vZHVsZS4NCi8vIQ0KLy8hIFRoZSBtaW5pbXVtIGZyZXF1ZW5jeSB0aGF0IGNhbiBiZSBvYnRhaW5lZCBieSBjb25maWd1cmluZyB0aGlzIGRpdmlkZXIgaXMNCi8vIQ0KLy8hICgyNDAwMDBLSHovMTAyMy45OSkgPSAgMjM0LjM3NyBLSHoNCi8vIQ0KLy8hIFxyZXR1cm4gTm9uZS4NCi8vDQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQp2b2lkDQpQUkNNSTJTQ2xvY2tGcmVxU2V0KHVuc2lnbmVkIGxvbmcgdWxJMkNDbGtGcmVxKQ0Kew0KICB1bnNpZ25lZCBsb25nIGxvbmcgdWxsRGl2Ow0KICB1bnNpZ25lZCBzaG9ydCB1c0ludGVnZXI7DQogIHVuc2lnbmVkIHNob3J0IHVzRnJhYzsNCg0KICB1bGxEaXYgPSAoKCh1bnNpZ25lZCBsb25nIGxvbmcpMjQwMDAwMDAwICogNjU1MzYpL3VsSTJDQ2xrRnJlcSk7DQoNCiAgdXNJbnRlZ2VyID0gKHVsbERpdi82NTUzNik7DQogIHVzRnJhYyAgICA9ICh1bGxEaXYlNjU1MzYpOw0KDQogIEhXUkVHKEFSQ01fQkFTRSArIEFQUFNfUkNNX09fTUNBU1BfRlJBQ19DTEtfQ09ORklHMCkgPQ0KICAgICgodXNJbnRlZ2VyICYgMHgzRkYpIDw8IDE2IHwgdXNGcmFjKTsNCn0NCg0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLy8NCi8vISBTZXRzIHRoZSBMUERTIGV4aXQgUEMgYW5kIFNQIHJlc3RvcmUgdmxhdWVzLg0KLy8hDQovLyEgXHBhcmFtIHVsU3RhY2tQdHIgaXMgdGhlIFNQIHJlc3RvcmUgdmFsdWUuDQovLyEgXHBhcmFtIHVsUHJvZ0NudHIgaXMgdGhlIFBDIHJlc3RvcmUgdmFsdWUNCi8vIQ0KLy8hIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgTFBEUyBleGl0IFBDIGFuZCBTUCByZXN0b3JlIHZsYXVlcy4gU2V0dGluZw0KLy8hIFxlIHVsUHJvZ0NudHIgdG8gYSBub24temVybyB2YWx1ZSwgZm9yY2VzIGJvb3Rsb2FkZXIgdG8ganVtcCB0byB0aGF0DQovLyEgYWRkcmVzcyB3aXRoIFN0YWNrIFBvaW50ZXIgaW5pdGlhbGl6ZWQgdG8gXGUgdWxTdGFja1B0ciBvbiBMUERTIGV4aXQsDQovLyEgb3RoZXJ3aXNlIHRoZSBhcHBsaWNhdGlvbidzIHZlY3RvciB0YWJsZSBlbnRyaWVzIGFyZSB1c2VkLg0KLy8hDQovLyEgXHJldHVybiBOb25lLg0KLy8NCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCnZvaWQNClBSQ01MUERTUmVzdG9yZUluZm9TZXQodW5zaWduZWQgbG9uZyB1bFN0YWNrUHRyLCB1bnNpZ25lZCBsb25nIHVsUHJvZ0NudHIpDQp7DQogIC8vDQogIC8vIFJPTSBWZXJzaW9uIDIueC54IG9yIGdyZWF0ZXINCiAgLy8NCiAgaWYoIChIV1JFRygweDAwMDAwNDAwKSAmIDB4RkZGRikgPj0gMiApDQogIHsNCiAgICAvLw0KICAgIC8vIFNldCBUaGUgU1AgVmFsdWUNCiAgICAvLw0KICAgIEhXUkVHKDB4NDQwMkUxNjApID0gdWxTdGFja1B0cjsNCg0KICAgIC8vDQogICAgLy8gU2V0IFRoZSBQQyBWYWx1ZQ0KICAgIC8vDQogICAgSFdSRUcoMHg0NDAyRTE5OCkgPSB1bFByb2dDbnRyOw0KDQogIH0NCiAgZWxzZQ0KICB7DQogICAgLy8NCiAgICAvLyBTZXQgVGhlIFNQIFZhbHVlDQogICAgLy8NCiAgICBIV1JFRygweDQ0MDJFMThDKSA9IHVsU3RhY2tQdHI7DQoNCiAgICAvLw0KICAgIC8vIFNldCBUaGUgUEMgVmFsdWUNCiAgICAvLw0KICAgIEhXUkVHKDB4NDQwMkUxOTApID0gdWxQcm9nQ250cjsNCiAgfQ0KfQ0KDQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQovLw0KLy8hIFB1dHMgdGhlIHN5c3RlbSBpbnRvIExvdyBQb3dlciBEZWVsIFNsZWVwIChMUERTKSBwb3dlciBtb2RlLg0KLy8hDQovLyEgVGhpcyBmdW5jdGlvbiBwdXRzIHRoZSBzeXN0ZW0gaW50byBMb3cgUG93ZXIgRGVlbCBTbGVlcCAoTFBEUykgcG93ZXIgbW9kZS4NCi8vISBBIGNhbGwgdG8gdGhpcyBmdW5jdGlvbiBuZXZlciByZXR1cm5zIGFuZCB0aGUgZXhlY3V0aW9uIHN0YXJ0cyBmcm9tIFJlc2V0Lg0KLy8hIFxzYSBQUkNNTFBEU1Jlc3RvcmVJbmZvU2V0KCkuDQovLyENCi8vISBccmV0dXJuIE5vbmUuDQovLyENCi8vISBcbm90ZSAgRXh0ZXJuYWwgZGVidWdnZXIgd2lsbCBhbHdheXMgZGlzY29ubmVjdCB3aGVuZXZlciB0aGUgc3lzdGVtDQovLyEgIGVudGVycyBMUERTIGFuZCBkZWJ1ZyBpbnRlcmZhY2UgaXMgc2h1dGRvd24gdW50aWwgbmV4dCBQT1IgcmVzZXQuIEluIG9yZGVyDQovLyEgIHRvIGF2b2lkIHRoaXMgYW5kIGFsbG93IGZvciBjb25uZWN0aW5nIGJhY2sgdGhlIGRlYnVnZ2VyIGFmdGVyIHdha2luZyB1cA0KLy8hICBmcm9tIExQRFMgXHNhIFBSQ01MUERTRW50ZXJLZWVwRGVidWdJZigpLg0KLy8hDQovLw0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0Kdm9pZA0KUFJDTUxQRFNFbnRlcigpDQp7DQogIHVuc2lnbmVkIGxvbmcgdWxDaGlwSWQ7DQoNCiAgLy8NCiAgLy8gUmVhZCB0aGUgQ2hpcCBJRA0KICAvLw0KICB1bENoaXBJZCA9ICgoSFdSRUcoR1BSQ01fQkFTRSArIEdQUkNNX09fR1BSQ01fRUZVU0VfUkVBRF9SRUcyKSA+PiAxNikgJiAweDFGKTsNCg0KICAvLw0KICAvLyBDaGVjayBpZiBmbGFzaCBleGlzdHMNCiAgLy8NCiAgaWYoICgweDExID09IHVsQ2hpcElkKSB8fCAoMHgxOSA9PSB1bENoaXBJZCkpDQogIHsNCg0KICAgIC8vDQogICAgLy8gRGlzYWJsZSB0aGUgZmxhc2gNCiAgICAvLw0KICAgIEZsYXNoRGlzYWJsZSgpOw0KICB9DQoNCiNpZm5kZWYgS0VFUF9URVNUUERfQUxJVkUNCg0KICAvLw0KICAvLyBEaXNhYmxlIFRlc3RQRA0KICAvLw0KICBIV1JFRygweDQ0MDJFMTY4KSB8PSAoMTw8OSk7DQojZW5kaWYNCg0KICAvLw0KICAvLyBTZXQgYmFuZGdhcCBkdXR5IGN5Y2xlIHRvIDENCiAgLy8NCiAgSFdSRUcoSElCMVAyX0JBU0UgKyBISUIxUDJfT19CR0FQX0RVVFlfQ1lDTElOR19FWElUX0NGRykgPSAweDE7DQoNCiAgLy8NCiAgLy8gUmVxdWVzdCBMUERTDQogIC8vDQogIEhXUkVHKEFSQ01fQkFTRSArIEFQUFNfUkNNX09fQVBQU19MUERTX1JFUSkNCiAgICAgICAgICA9IEFQUFNfUkNNX0FQUFNfTFBEU19SRVFfQVBQU19MUERTX1JFUTsNCg0KICAvLw0KICAvLyBXYWl0IGZvciBzeXN0ZW0gdG8gZW50ZXIgTFBEUw0KICAvLw0KICBfX2FzbSgiICAgIHdmaVxuIik7DQoNCiAgLy8NCiAgLy8gSW5maW5pdGUgbG9vcA0KICAvLw0KICB3aGlsZSgxKQ0KICB7DQoNCiAgfQ0KDQp9DQoNCg0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLy8NCi8vISBQdXRzIHRoZSBzeXN0ZW0gaW50byBMb3cgUG93ZXIgRGVlbCBTbGVlcCAoTFBEUykgcG93ZXIgbW9kZSBrZWVwaW5nDQovLyEgZGVidWcgaW50ZXJmYWNlIGFsaXZlLg0KLy8hDQovLyEgVGhpcyBmdW5jdGlvbiBwdXRzIHRoZSBzeXN0ZW0gaW50byBMb3cgUG93ZXIgRGVlbCBTbGVlcCAoTFBEUykgcG93ZXIgbW9kZQ0KLy8hIGtlZXBpbmcgZGVidWcgaW50ZXJmYWNlIGFsaXZlLiBBIGNhbGwgdG8gdGhpcyBmdW5jdGlvbiBuZXZlciByZXR1cm5zIGFuZCB0aGUNCi8vISBleGVjdXRpb24gc3RhcnRzIGZyb20gUmVzZXQgXHNhIFBSQ01MUERTUmVzdG9yZUluZm9TZXQoKS4NCi8vIQ0KLy8hIFxyZXR1cm4gTm9uZS4NCi8vIQ0KLy8hIFxub3RlIEV4dGVybmFsIGRlYnVnZ2VyIHdpbGwgYWx3YXlzIGRpc2Nvbm5lY3Qgd2hlbmV2ZXIgdGhlIHN5c3RlbQ0KLy8hICBlbnRlcnMgTFBEUywgdXNpbmcgdGhpcyBBUEkgd2lsbCBhbGxvdyBjb25uZWN0aW5nIGJhY2sgdGhlIGRlYnVnZ2VyIGFmdGVyDQovLyEgIHdha2luZyB1cCBmcm9tIExQRFMuIFRoaXMgQVBJIGlzIHJlY29tbWVuZGVkIGZvciBkZXZlbG9wbWVudCBwdXJwb3Nlcw0KLy8hICBvbmx5IGFzIGl0IGFkZHMgdG8gdGhlIGN1cnJlbnQgY29uc3VtcHRpb24gb2YgdGhlIHN5c3RlbS4NCi8vIQ0KLy8NCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCnZvaWQNClBSQ01MUERTRW50ZXJLZWVwRGVidWdJZigpDQp7DQogIHVuc2lnbmVkIGxvbmcgdWxDaGlwSWQ7DQoNCiAgLy8NCiAgLy8gUmVhZCB0aGUgQ2hpcCBJRA0KICAvLw0KICB1bENoaXBJZCA9ICgoSFdSRUcoR1BSQ01fQkFTRSArIEdQUkNNX09fR1BSQ01fRUZVU0VfUkVBRF9SRUcyKSA+PiAxNikgJiAweDFGKTsNCg0KICAvLw0KICAvLyBDaGVjayBpZiBmbGFzaCBleGlzdHMNCiAgLy8NCiAgaWYoICgweDExID09IHVsQ2hpcElkKSB8fCAoMHgxOSA9PSB1bENoaXBJZCkpDQogIHsNCg0KICAgIC8vDQogICAgLy8gRGlzYWJsZSB0aGUgZmxhc2gNCiAgICAvLw0KICAgIEZsYXNoRGlzYWJsZSgpOw0KICB9DQoNCiAgLy8NCiAgLy8gU2V0IGJhbmRnYXAgZHV0eSBjeWNsZSB0byAxDQogIC8vDQogIEhXUkVHKEhJQjFQMl9CQVNFICsgSElCMVAyX09fQkdBUF9EVVRZX0NZQ0xJTkdfRVhJVF9DRkcpID0gMHgxOw0KDQogIC8vDQogIC8vIFJlcXVlc3QgTFBEUw0KICAvLw0KICBIV1JFRyhBUkNNX0JBU0UgKyBBUFBTX1JDTV9PX0FQUFNfTFBEU19SRVEpDQogICAgICAgICAgPSBBUFBTX1JDTV9BUFBTX0xQRFNfUkVRX0FQUFNfTFBEU19SRVE7DQoNCiAgLy8NCiAgLy8gV2FpdCBmb3Igc3lzdGVtIHRvIGVudGVyIExQRFMNCiAgLy8NCiAgX19hc20oIiAgICB3ZmlcbiIpOw0KDQogIC8vDQogIC8vIEluZmluaXRlIGxvb3ANCiAgLy8NCiAgd2hpbGUoMSkNCiAgew0KDQogIH0NCg0KfQ0KDQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQovLw0KLy8hIEVuYWJsZSB0aGUgaW5kaXZpZHVhbCBMUERTIHdha2V1cCBzb3VyY2UocykuDQovLyENCi8vISBccGFyYW0gdWxMcGRzV2FrZXVwU3JjIGlzIGxvZ2ljYWwgT1Igb2Ygd2FrZXVwIHNvdXJjZXMuDQovLyENCi8vISBUaGlzIGZ1bmN0aW9uIGVuYWJsZSB0aGUgaW5kaXZpZHVhbCBMUERTIHdha2V1cCBzb3VyY2UocykgYW5kIGZvbGxvd2luZw0KLy8hIHRocmVlIHdha2V1cCBzb3VyY2VzIChcZSB1bExwZHNXYWtldXBTcmMgKSBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UuDQovLyEgLVxiIFBSQ01fTFBEU19IT1NUX0lSUQ0KLy8hIC1cYiBQUkNNX0xQRFNfR1BJTw0KLy8hIC1cYiBQUkNNX0xQRFNfVElNRVINCi8vIQ0KLy8hIFxyZXR1cm4gTm9uZS4NCi8vDQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQp2b2lkDQpQUkNNTFBEU1dha2V1cFNvdXJjZUVuYWJsZSh1bnNpZ25lZCBsb25nIHVsTHBkc1dha2V1cFNyYykNCnsNCiAgdW5zaWduZWQgbG9uZyB1bFJlZ1ZhbDsNCg0KICAvLw0KICAvLyBSZWFkIHRoZSBjdXJyZW50IHdha3VwIHNvdXJjZXMNCiAgLy8NCiAgdWxSZWdWYWwgPSBIV1JFRyhHUFJDTV9CQVNFKyBHUFJDTV9PX0FQUFNfTFBEU19XQUtFVVBfQ0ZHKTsNCg0KICAvLw0KICAvLyBFbmFibGUgaW5kaXZpZHVhbCB3YWtldXAgc291cmNlDQogIC8vDQogIHVsUmVnVmFsID0gKCh1bFJlZ1ZhbCB8IHVsTHBkc1dha2V1cFNyYykgJiAweDkxKTsNCg0KICAvLw0KICAvLyBTZXQgdGhlIGNvbmZpZ3VyYXRpb24gaW4gdGhlIHJlZ2lzdGVyDQogIC8vDQogIEhXUkVHKEdQUkNNX0JBU0UrIEdQUkNNX09fQVBQU19MUERTX1dBS0VVUF9DRkcpID0gdWxSZWdWYWw7DQp9DQoNCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi8vDQovLyEgRGlzYWJsZSB0aGUgaW5kaXZpZHVhbCBMUERTIHdha2V1cCBzb3VyY2UocykuDQovLyENCi8vISBccGFyYW0gdWxMcGRzV2FrZXVwU3JjIGlzIGxvZ2ljYWwgT1Igb2Ygd2FrZXVwIHNvdXJjZXMuDQovLyENCi8vISBUaGlzIGZ1bmN0aW9uIGVuYWJsZSB0aGUgaW5kaXZpZHVhbCBMUERTIHdha2V1cCBzb3VyY2UocykgYW5kIGZvbGxvd2luZw0KLy8hIHRocmVlIHdha2UgdXAgc291cmNlcyAoXGUgdWxMcGRzV2FrZXVwU3JjICkgYXJlIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlLg0KLy8hIC1cYiBQUkNNX0xQRFNfSE9TVF9JUlENCi8vISAtXGIgUFJDTV9MUERTX0dQSU8NCi8vISAtXGIgUFJDTV9MUERTX1RJTUVSDQovLyENCi8vISBccmV0dXJuIE5vbmUuDQovLw0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0Kdm9pZA0KUFJDTUxQRFNXYWtldXBTb3VyY2VEaXNhYmxlKHVuc2lnbmVkIGxvbmcgdWxMcGRzV2FrZXVwU3JjKQ0Kew0KICBIV1JFRyhHUFJDTV9CQVNFKyBHUFJDTV9PX0FQUFNfTFBEU19XQUtFVVBfQ0ZHKSAmPSB+dWxMcGRzV2FrZXVwU3JjOw0KfQ0KDQoNCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi8vDQovLyEgR2V0IExQRFMgd2FrZXVwIGNhdXNlDQovLyENCi8vISBUaGlzIGZ1bmN0aW9uIGdldHMgTFBEUyB3YWtldXAgY2FvdXNlDQovLyENCi8vISBccmV0dXJuIFJldHVybnMgdmFsdWVzIGVudW1lcmF0ZWQgYXMgZGVzY3JpYmVkIGluDQovLyEgUFJDTUxQRFNXYWtldXBTb3VyY2VFbmFibGUoKS4NCi8vDQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQp1bnNpZ25lZCBsb25nDQpQUkNNTFBEU1dha2V1cENhdXNlR2V0KCkNCnsNCiAgcmV0dXJuIChIV1JFRyhHUFJDTV9CQVNFKyBHUFJDTV9PX0FQUFNfTFBEU19XQUtFVVBfU1JDKSk7DQp9DQoNCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi8vDQovLyEgU2V0cyBMUERTIHdha2V1cCBUaW1lcg0KLy8hDQovLyEgXHBhcmFtIHVsVGlja3MgaXMgbnVtYmVyIG9mIDMyLjc2OCBLSHogY2xvY2tzDQovLyENCi8vISBUaGlzIGZ1bmN0aW9uIHNldHMgaW50ZXJuYWwgTFBEUyB3YWtldXAgdGltZXIgcnVubmluZyBhdCAzMi43NjggS0h6LiBUaGUNCi8vISB0aW1lciBpcyBvbmx5IGNvbmZpZ3VyZWQgaWYgdGhlIHBhcmFtZXRlciBcZSB1bFRpY2tzIGlzIGluIHZhbGlkIHJhbmdlIGkuZS4NCi8vISBmcm9tIDIxIHRvIDJeMzIuDQovLyENCi8vISBccmV0dXJuIFJldHVybnMgXGIgdHJ1ZSBvbiBzdWNjZXNzLCBcYiBmYWxzZSBvdGhlcndpc2UuDQovLw0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0Kdm9pZA0KUFJDTUxQRFNJbnRlcnZhbFNldCh1bnNpZ25lZCBsb25nIHVsVGlja3MpDQp7DQogIC8vDQogIC8vIENoZWNrIHNsZWVwIGlzIGF0bGVhc3QgZm9yIDIxIGN5Y2xlcw0KICAvLyBJZiBub3Qgc2V0IHRoZSBzbGVlcCB0aW1lIHRvIDIxIGN5Y2xlcw0KICAvLw0KICBpZiggdWxUaWNrcyA8IDIxKQ0KICB7DQogICAgICB1bFRpY2tzID0gMjE7DQogIH0NCg0KICBIV1JFRyhHUFJDTV9CQVNFICsgR1BSQ01fT19BUFBTX0xQRFNfV0FLRVRJTUVfV0FLRV9DRkcpID0gdWxUaWNrczsNCiAgSFdSRUcoR1BSQ01fQkFTRSArIEdQUkNNX09fQVBQU19MUERTX1dBS0VUSU1FX09QUF9DRkcpID0gdWxUaWNrcy0yMDsNCn0NCg0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLy8NCi8vISBTZWxlY3RzIHRoZSBHUElPIGZvciBMUERTIHdha2V1cA0KLy8hDQovLyEgXHBhcmFtIHVsR1BJT1BpbiBpcyBvbmUgb2YgdGhlIHZhbGlkIEdQSU8gZnJvIExQRFMgd2FrZXVwLg0KLy8hIFxwYXJhbSB1bFR5cGUgaXMgdGhlIHdha2V1cCB0cmlnZ2VyIHR5cGUuDQovLyENCi8vISBUaGlzIGZ1bmN0aW9uIHNldGVjdHMgdGhlIHdha2V1cCBHUElPIGZvciBMUERTIHdha2V1cCBhbmQgY2FuIGJlDQovLyEgdXNlZCB0byBzZWxlY3Qgb25lIG91dCBvZiA3IHByZS1kZWZpbmVkIEdQSU8ocykuDQovLyENCi8vISBUaGUgcGFyYW1ldGVyIFxlIHVsTHBkc0dQSU9TZWwgc2hvdWxkIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOi0NCi8vISAtXGIgUFJDTV9MUERTX0dQSU8yDQovLyEgLVxiIFBSQ01fTFBEU19HUElPNA0KLy8hIC1cYiBQUkNNX0xQRFNfR1BJTzEzDQovLyEgLVxiIFBSQ01fTFBEU19HUElPMTcNCi8vISAtXGIgUFJDTV9MUERTX0dQSU8xMQ0KLy8hIC1cYiBQUkNNX0xQRFNfR1BJTzI0DQovLyEgLVxiIFBSQ01fTFBEU19HUElPMjYNCi8vIQ0KLy8hIFRoZSBwYXJhbWV0ZXIgXGUgdWxUeXBlIHNldHMgdGhlIHRyaWdnZXIgdHlwZSBhbmQgY2FuIGJlIG9uZSBvZiB0aGUNCi8vISBmb2xsb3dpbmc6DQovLyEgLSBcYiBQUkNNX0xQRFNfTE9XX0xFVkVMDQovLyEgLSBcYiBQUkNNX0xQRFNfSElHSF9MRVZFTA0KLy8hIC0gXGIgUFJDTV9MUERTX0ZBTExfRURHRQ0KLy8hIC0gXGIgUFJDTV9MUERTX1JJU0VfRURHRQ0KLy8hDQovLyEgXHJldHVybiBOb25lLg0KLy8NCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCnZvaWQNClBSQ01MUERTV2FrZVVwR1BJT1NlbGVjdCh1bnNpZ25lZCBsb25nIHVsR1BJT1BpbiwgdW5zaWduZWQgbG9uZyB1bFR5cGUpDQp7DQogIC8vDQogIC8vIFNldCB0aGUgd2FrZXVwIEdQSU8NCiAgLy8NCiAgUFJDTUhJQlJlZ1dyaXRlKEhJQjNQM19CQVNFICsgSElCM1AzX09fTUVNX0hJQl9MUERTX0dQSU9fU0VMLCB1bEdQSU9QaW4pOw0KDQogIC8vDQogIC8vIFNldCB0aGUgdHJpZ2dlciB0eXBlLg0KICAvLw0KICBIV1JFRyhHUFJDTV9CQVNFICsgR1BSQ01fT19BUFBTX0dQSU9fV0FLRV9DT05GKSA9ICh1bFR5cGUgJiAweDMpOw0KfQ0KDQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQovLw0KLy8hIFB1dHMgdGhlIHN5c3RlbSBpbnRvIFNsZWVwLg0KLy8hDQovLyEgVGhpcyBmdW5jdGlvbiBwdXRzIHRoZSBzeXN0ZW0gaW50byBzbGVlcCBwb3dlciBtb2RlLiBTeXN0ZW0gZXhpdHMgdGhlIHBvd2VyDQovLyEgc3RhdGUgb24gYW55IG9uZSBvZiB0aGUgYXZhaWxhYmxlIGludGVycnVwdC4gT24gZXhpdCBmcm9tIHNsZWVwIG1vZGUgdGhlDQovLyEgZnVuY3Rpb24gcmV0dXJucyB0byB0aGUgY2FsbGluZyBmdW5jdGlvbiB3aXRoIGFsbCB0aGUgcHJvY2Vzc29yIGNvcmUNCi8vISByZWdpc3RlcnMgcmV0YWluZWQuDQovLyENCi8vISBccmV0dXJuIE5vbmUuDQovLw0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0Kdm9pZA0KUFJDTVNsZWVwRW50ZXIoKQ0Kew0KICAvLw0KICAvLyBSZXF1ZXN0IFNsZWVwDQogIC8vDQogIENQVXdmaSgpOw0KfQ0KDQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQovLw0KLy8hIEVuYWJsZSBTUkFNIGNvbHVtbiByZXRlbnRpb24gZHVyaW5nIExQRFMgUG93ZXIgbW9kZShzKQ0KLy8hDQovLyEgXHBhcmFtIHVsU3JhbUNvbFNlbCBpcyBiaXQgbWFzayBvZiB2YWxpZCBTUkFNIGNvbHVtbnMuDQovLyEgXHBhcmFtIHVsTW9kZUZsYWdzIGlzIHRoZSBiaXQgbWFzayBvZiBwb3dlciBtb2Rlcy4NCi8vIQ0KLy8hIFRoaXMgZnVuY3Rpb25zIGVuYWJsZXMgdGhlIFNSQU0gcmV0ZW50aW9uLiBUaGUgZGV2aWNlIHN1cHBvcnRzIGNvbmZpZ3VyYWJsZQ0KLy8hIFNSQU0gY29sdW1uIHJldGVudGlvbiBpbiBMb3cgUG93ZXIgRGVlcCBTbGVlcCAoTFBEUykuIEVhY2ggY29sdW1uIGlzIG9mDQovLyEgNjQgS0Igc2l6ZS4NCi8vIQ0KLy8hIFRoZSBwYXJhbWV0ZXIgXGUgdWxTcmFtQ29sU2VsIHNob3VsZCBiZSBsb2dpY2FsIE9SIG9mIHRoZSBmb2xsb3dpbmc6LQ0KLy8hIC1cYiBQUkNNX1NSQU1fQ09MXzENCi8vISAtXGIgUFJDTV9TUkFNX0NPTF8yDQovLyEgLVxiIFBSQ01fU1JBTV9DT0xfMw0KLy8hIC1cYiBQUkNNX1NSQU1fQ09MXzQNCi8vIQ0KLy8hIFRoZSBwYXJhbWV0ZXIgXGUgdWxNb2RlRmxhZ3Mgc2VsZWN0cyB0aGUgcG93ZXIgbW9kZXMgYW5kIHNob2x1ZCBiZSBsb2dpY2FsDQovLyEgT1Igb2Ygb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZw0KLy8hIC1cYiBQUkNNX1NSQU1fTFBEU19SRVQNCi8vIQ0KLy8hIFxyZXR1cm4gTm9uZS4NCi8vDQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCnZvaWQNClBSQ01TUkFNUmV0ZW50aW9uRW5hYmxlKHVuc2lnbmVkIGxvbmcgdWxTcmFtQ29sU2VsLCB1bnNpZ25lZCBsb25nIHVsTW9kZUZsYWdzKQ0Kew0KICBpZih1bE1vZGVGbGFncyAmIFBSQ01fU1JBTV9MUERTX1JFVCkNCiAgew0KICAgIC8vDQogICAgLy8gQ29uZmlndXJlIExQRFMgU1JBTSByZXRlbnRpb24gcmVnaXN0ZXINCiAgICAvLw0KICAgIEhXUkVHKEdQUkNNX0JBU0UrIEdQUkNNX09fQVBQU19TUkFNX0xQRFNfQ0ZHKSA9ICh1bFNyYW1Db2xTZWwgJiAweEYpOw0KICB9DQp9DQoNCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi8vDQovLyEgRGlzYWJsZSBTUkFNIGNvbHVtbiByZXRlbnRpb24gZHVyaW5nIExQRFMgUG93ZXIgbW9kZShzKS4NCi8vIQ0KLy8hIFxwYXJhbSB1bFNyYW1Db2xTZWwgaXMgYml0IG1hc2sgb2YgdmFsaWQgU1JBTSBjb2x1bW5zLg0KLy8hIFxwYXJhbSB1bEZsYWdzIGlzIHRoZSBiaXQgbWFzayBvZiBwb3dlciBtb2Rlcy4NCi8vIQ0KLy8hIFRoaXMgZnVuY3Rpb25zIGRpc2FibGUgdGhlIFNSQU0gcmV0ZW50aW9uLiBUaGUgZGV2aWNlIHN1cHBvcnRzIGNvbmZpZ3VyYWJsZQ0KLy8hIFNSQU0gY29sdW1uIHJldGVudGlvbiBpbiBMb3cgUG93ZXIgRGVlcCBTbGVlcCAoTFBEUykuIEVhY2ggY29sdW1uIGlzDQovLyEgb2YgNjQgS0Igc2l6ZS4NCi8vIQ0KLy8hIFRoZSBwYXJhbWV0ZXIgXGUgdWxTcmFtQ29sU2VsIHNob3VsZCBiZSBsb2dpY2FsIE9SIG9mIHRoZSBmb2xsb3dpbmc6LQ0KLy8hIC1cYiBQUkNNX1NSQU1fQ09MXzENCi8vISAtXGIgUFJDTV9TUkFNX0NPTF8yDQovLyEgLVxiIFBSQ01fU1JBTV9DT0xfMw0KLy8hIC1cYiBQUkNNX1NSQU1fQ09MXzQNCi8vIQ0KLy8hIFRoZSBwYXJhbWV0ZXIgXGUgdWxGbGFncyBzZWxlY3RzIHRoZSBwb3dlciBtb2RlcyBhbmQgc2hvbHVkIGJlIGxvZ2ljYWwgT1INCi8vISBvZiBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nDQovLyEgLVxiIFBSQ01fU1JBTV9MUERTX1JFVA0KLy8hDQovLyEgXHJldHVybiBOb25lLg0KLy8NCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0Kdm9pZA0KUFJDTVNSQU1SZXRlbnRpb25EaXNhYmxlKHVuc2lnbmVkIGxvbmcgdWxTcmFtQ29sU2VsLCB1bnNpZ25lZCBsb25nIHVsRmxhZ3MpDQp7DQogIGlmKHVsRmxhZ3MgJiBQUkNNX1NSQU1fTFBEU19SRVQpDQogIHsNCiAgICAvLw0KICAgIC8vIENvbmZpZ3VyZSBMUERTIFNSQU0gcmV0ZW50aW9uIHJlZ2lzdGVyDQogICAgLy8NCiAgICBIV1JFRyhHUFJDTV9CQVNFKyBHUFJDTV9PX0FQUFNfU1JBTV9MUERTX0NGRykgJj0gfih1bFNyYW1Db2xTZWwgJiAweEYpOw0KICB9DQp9DQoNCg0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLy8NCi8vISBFbmFibGVzIGluZGl2aWR1YWwgSElCIHdha2V1cCBzb3VyY2UocykuDQovLyENCi8vISBccGFyYW0gdWxISUJXYWt1cFNyYyBpcyBsb2dpY2FsIE9SIG9mIHZhbGlkIEhJQiB3YWtldXAgc291cmNlcy4NCi8vIQ0KLy8hIFRoaXMgZnVuY3Rpb24gZW5hYmxlcyBpbmRpdmlkdWFsIEhJQiB3YWtldXAgc291cmNlKHMpLiBUaGUgcGFyYW10ZXINCi8vISBcZSB1bEhJQldha3VwU3JjIGlzIHRoZSBiaXQgbWFzayBvZiBISUIgd2FrZXVwIHNvdXJjZXMgYW5kIHNob3VsZCBiZQ0KLy8hIGxvZ2ljYWwgT1Igb2Ygb25lIG9yIG1vcmUgb2YgdGhlIGZvbGx3b2luZyA6LQ0KLy8hIC1cYiBQUkNNX0hJQl9TTE9XX0NMS19DVFINCi8vISAtXGIgUFJDTV9ISUJfR1BJTzINCi8vISAtXGIgUFJDTV9ISUJfR1BJTzQNCi8vISAtXGIgUFJDTV9ISUJfR1BJTzEzDQovLyEgLVxiIFBSQ01fSElCX0dQSU8xNw0KLy8hIC1cYiBQUkNNX0hJQl9HUElPMTENCi8vISAtXGIgUFJDTV9ISUJfR1BJTzI0DQovLyEgLVxiIFBSQ01fSElCX0dQSU8yNg0KLy8hDQovLyEgXHJldHVybiBOb25lLg0KLy8NCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCnZvaWQNClBSQ01IaWJlcm5hdGVXYWtldXBTb3VyY2VFbmFibGUodW5zaWduZWQgbG9uZyB1bEhJQldha3VwU3JjKQ0Kew0KICB1bnNpZ25lZCBsb25nIHVsUmVnVmFsdWU7DQoNCiAgLy8NCiAgLy8gUmVhZCB0aGUgUlRDIHJlZ2lzdGVyDQogIC8vDQogIHVsUmVnVmFsdWUgPSBQUkNNSElCUmVnUmVhZChISUIzUDNfQkFTRStISUIzUDNfT19NRU1fSElCX1JUQ19XQUtFX0VOKTsNCg0KICAvLw0KICAvLyBFbmFibGUgdGhlIFJUQyBhcyB3YWtldXAgc291cmNlIGlmIHNwZWNpZmllZA0KICAvLw0KICB1bFJlZ1ZhbHVlIHw9ICh1bEhJQldha3VwU3JjICYgMHgxKTsNCg0KICAvLw0KICAvLyBFbmFibGUgSElCIHdha2V1cCBzb3VyY2VzDQogIC8vDQogIFBSQ01ISUJSZWdXcml0ZShISUIzUDNfQkFTRStISUIzUDNfT19NRU1fSElCX1JUQ19XQUtFX0VOLHVsUmVnVmFsdWUpOw0KDQogIC8vDQogIC8vIFJFYWQgdGhlIEdQSU8gd2FrZXVwIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXINCiAgLy8NCiAgdWxSZWdWYWx1ZSA9IFBSQ01ISUJSZWdSZWFkKEhJQjNQM19CQVNFK0hJQjNQM19PX01FTV9HUElPX1dBS0VfRU4pOw0KDQogIC8vDQogIC8vIEVuYWJsZSB0aGUgc3BlY2lmaWVkIEdQSU9zIGEgd2FrZXVwIHNvdXJjZXMNCiAgLy8NCiAgdWxSZWdWYWx1ZSB8PSAoKHVsSElCV2FrdXBTcmM+PjE2KSYweEZGKTsNCg0KICAvLw0KICAvLyBXcml0ZSB0aGUgbmV3IHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24NCiAgLy8NCiAgUFJDTUhJQlJlZ1dyaXRlKEhJQjNQM19CQVNFK0hJQjNQM19PX01FTV9HUElPX1dBS0VfRU4sdWxSZWdWYWx1ZSk7DQp9DQoNCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi8vDQovLyEgRGlzYWJsZSBpbmRpdmlkdWFsIEhJQiB3YWtldXAgc291cmNlKHMpLg0KLy8hDQovLyEgXHBhcmFtIHVsSElCV2FrdXBTcmMgaXMgbG9naWNhbCBPUiBvZiB2YWxpZCBISUIgd2FrZXVwIHNvdXJjZXMuDQovLyENCi8vISBUaGlzIGZ1bmN0aW9uIGRpc2FibGUgaW5kaXZpZHVhbCBISUIgd2FrZXVwIHNvdXJjZShzKS4gVGhlIHBhcmFtdGVyDQovLyEgXGUgdWxISUJXYWt1cFNyYyBpcyBzYW1lIGFzIGJpdCBmaWxlZHMgZGVmaW5lZCBpbg0KLy8hIFBSQ01FbmFibGVIaWJlcm5hdGVXYWtldXBTb3VyY2UoKQ0KLy8hDQovLyEgXHJldHVybiBOb25lLg0KLy8NCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCnZvaWQNClBSQ01IaWJlcm5hdGVXYWtldXBTb3VyY2VEaXNhYmxlKHVuc2lnbmVkIGxvbmcgdWxISUJXYWt1cFNyYykNCnsNCiAgdW5zaWduZWQgbG9uZyB1bFJlZ1ZhbHVlOw0KDQogIC8vDQogIC8vIFJlYWQgdGhlIFJUQyByZWdpc3Rlcg0KICAvLw0KICB1bFJlZ1ZhbHVlID0gUFJDTUhJQlJlZ1JlYWQoSElCM1AzX0JBU0UrSElCM1AzX09fTUVNX0hJQl9SVENfV0FLRV9FTik7DQoNCiAgLy8NCiAgLy8gRGlzYWJsZSB0aGUgUlRDIGFzIHdha2V1cCBzb3VyY2UgaWYgc3BlY2lmaWVkDQogIC8vDQogIHVsUmVnVmFsdWUgJj0gfih1bEhJQldha3VwU3JjICYgMHgxKTsNCg0KICAvLw0KICAvLyBEaXNhYmxlIEhJQiB3YWtldXAgc291cmNlcw0KICAvLw0KICBQUkNNSElCUmVnV3JpdGUoSElCM1AzX0JBU0UrSElCM1AzX09fTUVNX0hJQl9SVENfV0FLRV9FTix1bFJlZ1ZhbHVlKTsNCg0KICAvLw0KICAvLyBSZWFkIHRoZSBHUElPIHdha2V1cCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyDQogIC8vDQogIHVsUmVnVmFsdWUgPSBQUkNNSElCUmVnUmVhZChISUIzUDNfQkFTRStISUIzUDNfT19NRU1fR1BJT19XQUtFX0VOKTsNCg0KICAvLw0KICAvLyBFbmFibGUgdGhlIHNwZWNpZmllZCBHUElPcyBhIHdha2V1cCBzb3VyY2VzDQogIC8vDQogIHVsUmVnVmFsdWUgJj0gfigodWxISUJXYWt1cFNyYz4+MTYpJjB4RkYpOw0KDQogIC8vDQogIC8vIFdyaXRlIHRoZSBuZXcgcmVnaXN0ZXIgY29uZmlndXJhdGlvbg0KICAvLw0KICBQUkNNSElCUmVnV3JpdGUoSElCM1AzX0JBU0UrSElCM1AzX09fTUVNX0dQSU9fV0FLRV9FTix1bFJlZ1ZhbHVlKTsNCn0NCg0KDQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQovLw0KLy8hIEdldCBoaWJlcm5hdGUgd2FrZXVwIGNhdXNlDQovLyENCi8vISBUaGlzIGZ1bmN0aW9uIGdldHMgdGhlIGhpYmVybmF0ZSB3YWtldXAgY2F1c2UuDQovLyENCi8vISBccmV0dXJuIFJldHVybnMgXGIgUFJDTV9ISUJfV0FLRVVQX0NBVVNFX1NMT1dfQ0xPQ0sgb3INCi8vISBcYiBQUkNNX0hJQl9XQUtFVVBfQ0FVU0VfR1BJTw0KLy8NCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCnVuc2lnbmVkIGxvbmcNClBSQ01IaWJlcm5hdGVXYWtldXBDYXVzZUdldCgpDQp7DQogIC8vDQogIC8vIFN1cHBvcnRlZCBvbmx5IGluIEVTMi4wMCBhbmQgTGF0ZXIgZGV2aWNlcyBpLmUuIFJPTSBWZXJzaW9uIDIueC54IG9yIGdyZWF0ZXINCiAgLy8NCiAgaWYoIChIV1JFRygweDAwMDAwNDAwKSAmIDB4RkZGRikgPj0gMiApDQogIHsNCiAgICAgIHJldHVybiAoKFBSQ01ISUJSZWdSZWFkKChPQ1BfU0hBUkVEX0JBU0UgKyBPQ1BfU0hBUkVEX09fU1BBUkVfUkVHXzgpKT4+MikmMHhGKTsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAgIHJldHVybigwKTsNCiAgfQ0KfQ0KDQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQovLw0KLy8hIFNldHMgSGliZXJuYXRlIHdha2V1cCBUaW1lcg0KLy8hDQovLyEgXHBhcmFtIHVsbFRpY2tzIGlzIG51bWJlciBvZiAzMi43NjggS0h6IGNsb2Nrcw0KLy8hDQovLyEgVGhpcyBmdW5jdGlvbiBzZXRzIGludGVybmFsIGhpYmVybmF0ZSB3YWtldXAgdGltZXIgcnVubmluZyBhdCAzMi43NjggS0h6Lg0KLy8hDQovLyEgXHJldHVybiBSZXR1cm5zIFxiIHRydWUgb24gc3VjY2VzcywgXGIgZmFsc2Ugb3RoZXJ3aXNlLg0KLy8NCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCnZvaWQNClBSQ01IaWJlcm5hdGVJbnRlcnZhbFNldCh1bnNpZ25lZCBsb25nIGxvbmcgdWxsVGlja3MpDQp7DQogIHVuc2lnbmVkIGxvbmcgbG9uZyB1bGxSVENWYWw7DQoNCiAgLy8NCiAgLy8gTGF0Y2ggdGhlIFJUQyB2bGF1ZQ0KICAvLw0KICBQUkNNSElCUmVnV3JpdGUoSElCM1AzX0JBU0UrSElCM1AzX09fTUVNX0hJQl9SVENfVElNRVJfUkVBRCAsMHgxKTsNCg0KICAvLw0KICAvLyBSZWFkIGxhdGNoZWQgdmFsdWVzIGFzIDIgMzItYml0IHZsYXVlcw0KICAvLw0KICB1bGxSVENWYWwgID0gUFJDTUhJQlJlZ1JlYWQoSElCM1AzX0JBU0UgKyBISUIzUDNfT19NRU1fSElCX1JUQ19USU1FUl9NU1cpOw0KICB1bGxSVENWYWwgID0gdWxsUlRDVmFsIDw8IDMyOw0KICB1bGxSVENWYWwgfD0gUFJDTUhJQlJlZ1JlYWQoSElCM1AzX0JBU0UrSElCM1AzX09fTUVNX0hJQl9SVENfVElNRVJfTFNXKTsNCg0KICAvLw0KICAvLyBBZGQgdGhlIGludGVydmFsDQogIC8vDQogIHVsbFJUQ1ZhbCA9IHVsbFJUQ1ZhbCArIHVsbFRpY2tzOw0KDQogIC8vDQogIC8vIFNldCBSVEMgbWF0Y2ggdmFsdWUNCiAgLy8NCiAgUFJDTUhJQlJlZ1dyaXRlKEhJQjNQM19CQVNFK0hJQjNQM19PX01FTV9ISUJfUlRDX1dBS0VfTFNXX0NPTkYsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSh1bGxSVENWYWwpKTsNCiAgUFJDTUhJQlJlZ1dyaXRlKEhJQjNQM19CQVNFK0hJQjNQM19PX01FTV9ISUJfUlRDX1dBS0VfTVNXX0NPTkYsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpKHVsbFJUQ1ZhbD4+MzIpKTsNCn0NCg0KDQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQovLw0KLy8hIFNlbGVjdHMgdGhlIEdQSU8ocykgZm9yIGhpYmVybmF0ZSB3YWtldXANCi8vIQ0KLy8hIFxwYXJhbSB1bEdQSU9CaXRNYXAgaXMgdGhlIGJpdC1tYXAgb2YgdmFsaWQgaGliZXJuYXRlIHdha2V1cCBHUElPLg0KLy8hIFxwYXJhbSB1bFR5cGUgaXMgdGhlIHdha2V1cCB0cmlnZ2VyIHR5cGUuDQovLyENCi8vISBUaGlzIGZ1bmN0aW9uIHNldGVjdHMgdGhlIHdha2V1cCBHUElPIGZvciBoaWJlcm5hdGUgYW5kIGNhbiBiZQ0KLy8hIHVzZWQgdG8gc2VsZWN0IGFueSBjb21iaW5hdGlvbiBvZiA3IHByZS1kZWZpbmVkIEdQSU8ocykuDQovLyENCi8vISBUaGlzIGZ1bmN0aW9uIGVuYWJsZXMgaW5kaXZpZHVhbCBISUIgd2FrZXVwIHNvdXJjZShzKS4gVGhlIHBhcmFtdGVyDQovLyEgXGUgdWxHUElPQml0TWFwIHNob3VsZCBiZSBvbmUgb2YgdGhlIGZvbGx3b2luZyA6LQ0KLy8hIC1cYiBQUkNNX0hJQl9HUElPMg0KLy8hIC1cYiBQUkNNX0hJQl9HUElPNA0KLy8hIC1cYiBQUkNNX0hJQl9HUElPMTMNCi8vISAtXGIgUFJDTV9ISUJfR1BJTzE3DQovLyEgLVxiIFBSQ01fSElCX0dQSU8xMQ0KLy8hIC1cYiBQUkNNX0hJQl9HUElPMjQNCi8vISAtXGIgUFJDTV9ISUJfR1BJTzI2DQovLyENCi8vISBUaGUgcGFyYW1ldGVyIFxlIHVsVHlwZSBzZXRzIHRoZSB0cmlnZ2VyIHR5cGUgYW5kIGNhbiBiZSBvbmUgb2YgdGhlDQovLyEgZm9sbG93aW5nOg0KLy8hIC0gXGIgUFJDTV9ISUJfTE9XX0xFVkVMDQovLyEgLSBcYiBQUkNNX0hJQl9ISUdIX0xFVkVMDQovLyEgLSBcYiBQUkNNX0hJQl9GQUxMX0VER0UNCi8vISAtIFxiIFBSQ01fSElCX1JJU0VfRURHRQ0KLy8hDQovLyEgXHJldHVybiBOb25lLg0KLy8NCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCnZvaWQNClBSQ01IaWJlcm5hdGVXYWtlVXBHUElPU2VsZWN0KHVuc2lnbmVkIGxvbmcgdWxHUElPQml0TWFwLCB1bnNpZ25lZCBsb25nIHVsVHlwZSkNCnsNCiAgdW5zaWduZWQgY2hhciB1Y0xvb3A7DQogIHVuc2lnbmVkIGxvbmcgdWxSZWdWYWx1ZTsNCg0KICAvLw0KICAvLyBTaGlmdCB0aGUgYml0cyB0byBleHRyYWN0IHRoZSBHUElPIHNlbGVjdGlvbg0KICAvLw0KICB1bEdQSU9CaXRNYXAgPj49IDE2Ow0KDQogIC8vDQogIC8vIFNldCB0aGUgY29uZmlndXJhdGlvbiBmb3IgZWFjaCBHUElPDQogIC8vDQogIGZvcih1Y0xvb3A9MDsgdWNMb29wIDwgNzsgdWNMb29wKyspDQogIHsNCiAgICBpZih1bEdQSU9CaXRNYXAgJiAoMTw8dWNMb29wKSkNCiAgICB7DQogICAgICB1bFJlZ1ZhbHVlICA9IFBSQ01ISUJSZWdSZWFkKEhJQjNQM19CQVNFK0hJQjNQM19PX01FTV9HUElPX1dBS0VfQ09ORik7DQogICAgICB1bFJlZ1ZhbHVlID0gKHVsUmVnVmFsdWUgJiAofigweDMgPDwgKHVjTG9vcCoyKSkpKSB8ICh1bFR5cGUgPDwodWNMb29wKjIpKTsNCiAgICAgIFBSQ01ISUJSZWdXcml0ZShISUIzUDNfQkFTRStISUIzUDNfT19NRU1fR1BJT19XQUtFX0NPTkYsIHVsUmVnVmFsdWUpOw0KICAgIH0NCiAgfQ0KfQ0KDQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQovLw0KLy8hIFB1dHMgdGhlIHN5c3RlbSBpbnRvIEhpYmVybmF0ZQ0KLy8hDQovLyEgVGhpcyBmdW5jdGlvbiBwdXRzIHRoZSBzeXN0ZW0gaW50byBIaWJlcm5hdGUuIFRoZSBkZXZpY2UgZW50ZXJzIEhJQg0KLy8hIGltbWVkaWF0ZWx5IGFuZCBvbiBleGl0IGZyb20gSElCIGRldmljZSBjb3JlIHN0YXJ0cyBpdHMgZXhlY3V0aW9uIGZyb20NCi8vISByZXNldCB0aHVzIHRoZSBmdW5jdGlvbiBuZXZlciByZXR1cm5zLg0KLy8hDQovLyEgXHJldHVybiBOb25lLg0KLy8NCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCnZvaWQNClBSQ01IaWJlcm5hdGVFbnRlcigpDQp7DQoNCiAgLy8NCiAgLy8gUmVxdWVzdCBoaWJlcm5hdGUuDQogIC8vDQogIFBSQ01ISUJSZWdXcml0ZSgoSElCM1AzX0JBU0UrSElCM1AzX09fTUVNX0hJQl9SRVEpLDB4MSk7DQoNCiAgLy8NCiAgLy8gV2FpdCBmb3Igc3lzdGVtIHRvIGVudGVyIGhpYmVybmF0ZQ0KICAvLw0KICBfX2FzbSgiICAgIHdmaVxuIik7DQoNCiAgLy8NCiAgLy8gSW5maW5pdGUgbG9vcA0KICAvLw0KICB3aGlsZSgxKQ0KICB7DQoNCiAgfQ0KfQ0KDQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQovLw0KLy8hIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGludGVybmFsIHNsb3cgY2xvY2sgY291bnRlcg0KLy8hDQovLyEgVGhpcyBmdW5jdGlvbiBsYXRjaGVzIGFuZCByZWFkcyB0aGUgaW50ZXJuYWwgUlRDIHJ1bm5pbmcgYXQgMzIuNzY4IEtoeg0KLy8hDQovLyEgXHJldHVybiA2NC1iaXQgY3VycmVudCBjb3VudGVyIHZsYXVlLg0KLy8NCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCnVuc2lnbmVkIGxvbmcgbG9uZw0KUFJDTVNsb3dDbGtDdHJHZXQoKQ0Kew0KICB1bnNpZ25lZCBsb25nIGxvbmcgdWxsUlRDVmFsOw0KDQogIC8vDQogIC8vIExhdGNoIHRoZSBSVEMgdmxhdWUNCiAgLy8NCiAgUFJDTUhJQlJlZ1dyaXRlKEhJQjNQM19CQVNFK0hJQjNQM19PX01FTV9ISUJfUlRDX1RJTUVSX1JFQUQsIDB4MSk7DQoNCiAgLy8NCiAgLy8gUmVhZCBsYXRjaGVkIHZhbHVlcyBhcyAyIDMyLWJpdCB2bGF1ZXMNCiAgLy8NCiAgdWxsUlRDVmFsICA9IFBSQ01ISUJSZWdSZWFkKEhJQjNQM19CQVNFICsgSElCM1AzX09fTUVNX0hJQl9SVENfVElNRVJfTVNXKTsNCiAgdWxsUlRDVmFsICA9IHVsbFJUQ1ZhbCA8PCAzMjsNCiAgdWxsUlRDVmFsIHw9IFBSQ01ISUJSZWdSZWFkKEhJQjNQM19CQVNFK0hJQjNQM19PX01FTV9ISUJfUlRDX1RJTUVSX0xTVyk7DQoNCiAgcmV0dXJuIHVsbFJUQ1ZhbDsNCn0NCg0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLy8NCi8vISBHZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBpbnRlcm5hbCBzbG93IGNsb2NrIGNvdW50ZXINCi8vIQ0KLy8hIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byBcc2EgUFJDTVNsb3dDbGtDdHJHZXQoKSBidXQgcmVhZHMgdGhlIGNvdW50ZXINCi8vISB2YWx1ZSBmcm9tIGEgcmVsYXRpdmVseSBmYXN0ZXIgaW50ZXJmYWNlIHVzaW5nIGFuIGF1dG8tbGF0Y2ggbWVjaGFpbnNtLg0KLy8hDQovLyEgXG5vdGUgRHVlIHRvIHRoZSBuYXR1cmUgb2YgaW1wbGVtZXRhdGlvbiBvZiBhdXRvIGxhdGNoaW5nLCB3aGVuIHVzaW5nIHRoaXMNCi8vISBBUEksIHRoZSByZWNvbW1lbmRhdGlvbiBpcyB0byByZWFkIHRoZSB2YWx1ZSB0aHJpY2UgYW5kIGlkZW50aWZ5IHRoZSByaWdodA0KLy8hIHZhbHVlIChhcyAyIG91dCB0aGUgMyByZWFkIHZhbHVlcyB3aWxsIGFsd2F5cyBiZSBjb3JyZWN0IGFuZCB3aXRoIGEgbWF4LiBvZg0KLy8hIDEgTFNCIGNoYW5nZSkNCi8vIQ0KLy8hIFxyZXR1cm4gNjQtYml0IGN1cnJlbnQgY291bnRlciB2bGF1ZS4NCi8vDQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQp1bnNpZ25lZCBsb25nIGxvbmcgUFJDTVNsb3dDbGtDdHJGYXN0R2V0KHZvaWQpDQp7DQogIHVuc2lnbmVkIGxvbmcgbG9uZyB1bGxSVENWYWw7DQoNCiAgLy8NCiAgLy8gUmVhZCBhcyAyIDMyLWJpdCB2YWx1ZXMNCiAgLy8NCiAgdWxsUlRDVmFsID0gSFdSRUcoSElCMVAyX0JBU0UgKyBISUIxUDJfT19ISUJfUlRDX1RJTUVSX01TV18xUDIpOw0KICB1bGxSVENWYWwgPSB1bGxSVENWYWwgPDwgMzI7DQogIHVsbFJUQ1ZhbCB8PSBIV1JFRyhISUIxUDJfQkFTRSArIEhJQjFQMl9PX0hJQl9SVENfVElNRVJfTFNXXzFQMik7DQoNCiAgcmV0dXJuIHVsbFJUQ1ZhbDsNCg0KfQ0KDQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQovLw0KLy8hIFNldHMgc2xvdyBjbG9jayBjb3VudGVyIG1hdGNoIHZhbHVlIHRvIGludGVycnVwdCB0aGUgcHJvY2Vzc29yLg0KLy8hDQovLyEgXHBhcmFtIHVsbFZhbHVlIGlzIHRoZSBtYXRjaCB2YWx1ZS4NCi8vIQ0KLy8hIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgbWF0Y2ggdmFsdWUgZm9yICBzbG93IGNsb2NrIGNvdW50ZXIuIFRoaXMgaXMgdXNlDQovLyEgdG8gaW50ZXJydXB0IHRoZSBwcm9jZXNzb3Igd2hlbiBSVEMgY291bnRzIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuDQovLyENCi8vISBccmV0dXJuIE5vbmUuDQovLw0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0Kdm9pZCBQUkNNU2xvd0Nsa0N0ck1hdGNoU2V0KHVuc2lnbmVkIGxvbmcgbG9uZyB1bGxWYWx1ZSkNCnsNCiAgLy8NCiAgLy8gU2V0IFJUQyBtYXRjaCB2YWx1ZQ0KICAvLw0KICBQUkNNSElCUmVnV3JpdGUoSElCM1AzX0JBU0UgKyBISUIzUDNfT19NRU1fSElCX1JUQ19JUlFfTFNXX0NPTkYsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpKHVsbFZhbHVlKSk7DQogIFBSQ01ISUJSZWdXcml0ZShISUIzUDNfQkFTRSArIEhJQjNQM19PX01FTV9ISUJfUlRDX0lSUV9NU1dfQ09ORiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykodWxsVmFsdWU+PjMyKSk7DQp9DQoNCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi8vDQovLyEgR2V0cyBzbG93IGNsb2NrIGNvdW50ZXIgbWF0Y2ggdmFsdWUuDQovLyENCi8vISBUaGlzIGZ1bmN0aW9uIGdldHMgdGhlIG1hdGNoIHZhbHVlIGZvciAgc2xvdyBjbG9jayBjb3VudGVyLiBUaGlzIGlzIHVzZQ0KLy8hIHRvIGludGVycnVwdCB0aGUgcHJvY2Vzc29yIHdoZW4gUlRDIGNvdW50cyB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLg0KLy8hDQovLyEgXHJldHVybiBOb25lLg0KLy8NCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCnVuc2lnbmVkIGxvbmcgbG9uZyBQUkNNU2xvd0Nsa0N0ck1hdGNoR2V0KCkNCnsNCiAgdW5zaWduZWQgbG9uZyBsb25nIHVsbFZhbHVlOw0KDQogIC8vDQogIC8vIEdldCBSVEMgbWF0Y2ggdmFsdWUNCiAgLy8NCiAgdWxsVmFsdWUgPSBQUkNNSElCUmVnUmVhZChISUIzUDNfQkFTRSArIEhJQjNQM19PX01FTV9ISUJfUlRDX0lSUV9NU1dfQ09ORik7DQogIHVsbFZhbHVlID0gdWxsVmFsdWU8PDMyOw0KICB1bGxWYWx1ZSB8PSBQUkNNSElCUmVnUmVhZChISUIzUDNfQkFTRSArIEhJQjNQM19PX01FTV9ISUJfUlRDX0lSUV9MU1dfQ09ORik7DQoNCiAgLy8NCiAgLy8gUmV0dXJuIHRoZSB2YWx1ZQ0KICAvLw0KICByZXR1cm4gdWxsVmFsdWU7DQp9DQoNCg0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLy8NCi8vISBXcml0ZSB0byBPbi1DaGlwIFJldGVudGlvbiAoT0NSKSByZWdpc3Rlci4NCi8vIQ0KLy8hIFRoaXMgZnVuY3Rpb24gd3JpdGVzIHRvIE9uLUNoaXAgcmV0ZW50aW9uIHJlZ2lzdGVyLiBUaGUgZGV2aWNlIHN1cHBvcnRzIHR3bw0KLy8hIDQtYnl0ZSBPQ1IgcmVnaXN0ZXIgd2hpY2ggYXJlIHJldGFpbmVkIGFjcm9zcyBhbGwgcG93ZXIgbW9kZS4NCi8vIQ0KLy8hIFRoZSBwYXJhbWV0ZXIgXGUgdWNJbmRleCBpcyBhbiBpbmRleCBvZiB0aGUgT0NSIGFuZCBjYW4gYmUgXGIgMCBvciBcYiAxLg0KLy8hDQovLyEgVGhlc2UgcmVnaXN0ZXJzIGFyZSBzaGFyZWQgYnkgdGhlIFJUQyBpbXBsZW1lbnRhdGlvbiAoaWYgRHJpdmVybGliIFJUQw0KLy8hIEFQSXMgYXJlIHVzZWQpLCBST00sIGFuZCB1c2VyIGFwcGxpY2F0aW9uLg0KLy8hDQovLyEgV2hlbiBSVEMgQVBJcyBpbiB1c2U6DQovLyENCi8vISAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KLy8hICAgICB8ICAgICAgICAgICAgICAgICAgSU5ERVggMSAgICAgICAgICAgICAgICAgICAgICB8DQovLyEgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCi8vISAgICAgfDMxfDMwfDI5fDI4fDI3fDI2fDI1fDI0fDIzfDIyfDIxfDIwfDE5fDE4fDE3fDE2fA0KLy8hICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQovLyEgICAgIHwgICAgICAgICAgIFJlc2VydmVkIGJ5IFJUQyBBUElzIC0gWVkgICAgICAgICAgIHwNCi8vISAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KLy8hICAgICB8MTV8MTR8MTN8MTJ8MTF8MTB8MDl8MDh8MDd8MDZ8MDV8MDR8MDN8MDJ8MDF8MDB8DQovLyEgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCi8vISAgICAgfCAgICAgICAgICAgUmVzZXJ2ZWQgYnkgUlRDIEFQSXMgLSBZWSAgICAgICAgICAgfA0KLy8hICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQovLyENCi8vIQ0KLy8hICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQovLyEgICAgIHwgICAgICAgICAgICAgICAgICBJTkRFWCAwICAgICAgICAgICAgICAgICAgICAgIHwNCi8vISAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KLy8hICAgICB8MzF8MzB8Mjl8Mjh8Mjd8MjZ8MjV8MjR8MjN8MjJ8MjF8MjB8MTl8MTh8MTd8MTZ8DQovLyEgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCi8vISAgICAgfCAgICAgICAgICAgUmVzZXJ2ZWQgYnkgUlRDIEFQSXMgLSBZWSAgICAgICAgICAgfA0KLy8hICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQovLyEgICAgIHwxNXwxNHwxM3wxMnwxMXwxMHwwOXwwOHwwN3wwNnwwNXwwNHwwM3wwMnwwMXwwMHwNCi8vISAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KLy8hICAgICB8WVl8ICAgICAgICBGb3IgVXNlciBBcHBsaWNhdGlvbiAgICAgICAgICAgICB8WFh8DQovLyEgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCi8vIQ0KLy8hICAgICBZWSA9PiBSZXNlcnZlZCBieSBSVEMgQVBJcy4gSWYgRHJpdmVybGliIFJUQyBBUElzIGFyZSB1c2VkDQovLyEgICAgIFhYID0+IFJlc2VydmVkIGJ5IFJPTQ0KLy8hDQovLyENCi8vISBXaGVuIFJUQyBBUElzIGFyZSBub3QgaW4gdXNlOg0KLy8hDQovLyEgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCi8vISAgICAgfCAgICAgICAgICAgICAgICAgIElOREVYIDEgICAgICAgICAgICAgICAgICAgICAgfA0KLy8hICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQovLyEgICAgIHwzMXwzMHwyOXwyOHwyN3wyNnwyNXwyNHwyM3wyMnwyMXwyMHwxOXwxOHwxN3wxNnwNCi8vISAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KLy8hICAgICB8ICAgICAgICAgICAgRm9yIFVzZXIgQXBwbGljYXRpb24gICAgICAgICAgICAgICB8DQovLyEgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCi8vISAgICAgfDE1fDE0fDEzfDEyfDExfDEwfDA5fDA4fDA3fDA2fDA1fDA0fDAzfDAyfDAxfDAwfA0KLy8hICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQovLyEgICAgIHwgICAgICAgICAgICBGb3IgVXNlciBBcHBsaWNhdGlvbiAgICAgICAgICAgICAgIHwNCi8vISAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KLy8hDQovLyENCi8vISAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KLy8hICAgICB8ICAgICAgICAgICAgICAgICAgSU5ERVggMCAgICAgICAgICAgICAgICAgICAgICB8DQovLyEgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCi8vISAgICAgfDMxfDMwfDI5fDI4fDI3fDI2fDI1fDI0fDIzfDIyfDIxfDIwfDE5fDE4fDE3fDE2fA0KLy8hICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQovLyEgICAgIHwgICAgICAgICAgICBGb3IgVXNlciBBcHBsaWNhdGlvbiAgICAgICAgICAgICAgIHwNCi8vISAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KLy8hICAgICB8MTV8MTR8MTN8MTJ8MTF8MTB8MDl8MDh8MDd8MDZ8MDV8MDR8MDN8MDJ8MDF8MDB8DQovLyEgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCi8vISAgICAgfCAgICAgICAgICAgRm9yIFVzZXIgQXBwbGljYXRpb24gICAgICAgICAgICAgfFhYfA0KLy8hICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQovLyENCi8vISAgICAgWFggPT4gUmVzZXJ2ZWQgYnkgUk9NDQovLyENCi8vIQ0KLy8hDQovLyEgXHJldHVybiBOb25lLg0KLy8NCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCnZvaWQgUFJDTU9DUlJlZ2lzdGVyV3JpdGUodW5zaWduZWQgY2hhciB1Y0luZGV4LCB1bnNpZ25lZCBsb25nIHVsUmVnVmFsdWUpDQp7DQogIHVuc2lnbmVkIGxvbmcgdWxWYWw7DQoNCiAgLy8NCiAgLy8gQ29tcHVpdHIgdGhlIG9mZnNldA0KICAvLw0KICB1Y0luZGV4ID0gdWNJbmRleCA8PCAyOw0KDQogIC8vDQogIC8vIElmIGJpdCAwIGlzIHJlc2VydmVkDQogIC8vDQogIGlmKCAoSFdSRUcoT0NQX1NIQVJFRF9CQVNFICsgT0NQX1NIQVJFRF9PX1NQQVJFX1JFR184KSAmICgweDAwMDAwMDgwKSkgJiYNCiAgICAgICh1Y0luZGV4ID09IDApICkNCiAgew0KICAgIHVsVmFsID0gUFJDTUhJQlJlZ1JlYWQoSElCM1AzX0JBU0UgKyBISUIzUDNfT19NRU1fSElCX1JFRzIgKyB1Y0luZGV4KTsNCiAgICB1bFJlZ1ZhbHVlID0gKCh1bFJlZ1ZhbHVlIDw8IDB4MSkgfCAodWxWYWwgJiAoMHgxKSkpOw0KICB9DQoNCiAgLy8NCiAgLy8gV3JpdGUgdGhyIHZhbHVlDQogIC8vDQogIFBSQ01ISUJSZWdXcml0ZShISUIzUDNfQkFTRSArIEhJQjNQM19PX01FTV9ISUJfUkVHMiArIHVjSW5kZXgsdWxSZWdWYWx1ZSk7DQoNCn0NCg0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLy8NCi8vISBSZWFkIGZyb20gT24tQ2hpcCBSZXRlbnRpb24gKE9DUikgcmVnaXN0ZXIuDQovLyENCi8vISBUaGlzIGZ1bmN0aW9uIHJlYWRzIGZyb20gT24tQ2hpcCByZXRlbnRpb24gcmVnaXN0ZXIuIFRoZSBkZXZpY2Ugc3VwcG9ydHMgdHdvDQovLyEgNC1ieXRlIE9DUiByZWdpc3RlciB3aGljaCBhcmUgcmV0YWluZWQgYWNyb3NzIGFsbCBwb3dlciBtb2RlLg0KLy8hDQovLyEgVGhlIHBhcmFtZXRlciBcZSB1Y0luZGV4IGlzIGFuIGluZGV4IG9mIHRoZSBPQ1IgYW5kIGNhbiBiZSBcYiAwIG9yIFxiIDEuDQovLyENCi8vISBcc2EgUFJDTU9DUlJlZ2lzdGVyV3JpdGUoKSBmb3IgdGhlIHJlZ2lzdGVyIHVzYWdlIGRldGFpbHMuDQovLyENCi8vISBccmV0dXJuIE5vbmUuDQovLw0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KdW5zaWduZWQgbG9uZyBQUkNNT0NSUmVnaXN0ZXJSZWFkKHVuc2lnbmVkIGNoYXIgdWNJbmRleCkNCnsNCiAgdW5zaWduZWQgbG9uZyB1bFJldDsNCg0KICAvLw0KICAvLyBSZWFkIHRoZSBPQ1IgcmVnaXN0ZXINCiAgLy8NCiAgdWxSZXQgPSBQUkNNSElCUmVnUmVhZChISUIzUDNfQkFTRStISUIzUDNfT19NRU1fSElCX1JFRzIgKyAodWNJbmRleCA8PCAyKSk7DQoNCiAgLy8NCiAgLy8gSWYgYml0IDAgaXMgcmVzZXJ2ZWQNCiAgLy8NCiAgaWYoIChIV1JFRyhPQ1BfU0hBUkVEX0JBU0UgKyBPQ1BfU0hBUkVEX09fU1BBUkVfUkVHXzgpICYgKDB4MDAwMDAwODApKSAmJg0KICAgICAgKHVjSW5kZXggPT0gMCkgKQ0KICB7DQogICAgIHVsUmV0ID0gdWxSZXQgPj4gMHgxOw0KICB9DQoNCiAgLy8NCiAgLy8gUmV0dXJuIHRoZSByZWFkIHZhbHVlLg0KICAvLw0KICByZXR1cm4gdWxSZXQ7DQp9DQoNCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi8vDQovLyEgUmVnaXN0ZXJzIGFuIGludGVycnVwdCBoYW5kbGVyIGZvciB0aGUgUFJDTS4NCi8vIQ0KLy8hIFxwYXJhbSBwZm5IYW5kbGVyIGlzIGEgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlDQovLyEgaW50ZXJydXB0IGlzIGFjdGl2YXRlZC4NCi8vIQ0KLy8hIFRoaXMgZnVuY3Rpb24gZG9lcyB0aGUgYWN0dWFsIHJlZ2lzdGVyaW5nIG9mIHRoZSBpbnRlcnJ1cHQgaGFuZGxlci4gIFRoaXMNCi8vISBmdW5jdGlvbiBlbmFibGVzIHRoZSBnbG9iYWwgaW50ZXJydXB0IGluIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlcjsNCi8vIQ0KLy8hIFxyZXR1cm4gTm9uZS4NCi8vDQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQp2b2lkIFBSQ01JbnRSZWdpc3Rlcih2b2lkICgqcGZuSGFuZGxlcikodm9pZCkpDQp7DQogIC8vDQogIC8vIFJlZ2lzdGVyIHRoZSBpbnRlcnJ1cHQgaGFuZGxlci4NCiAgLy8NCiAgSW50UmVnaXN0ZXIoSU5UX1BSQ00sIHBmbkhhbmRsZXIpOw0KDQogIC8vDQogIC8vIEVuYWJsZSB0aGUgUFJDTSBpbnRlcnJ1cHQuDQogIC8vDQogIEludEVuYWJsZShJTlRfUFJDTSk7DQp9DQoNCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi8vDQovLyEgVW5yZWdpc3RlcnMgYW4gaW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSBQUkNNLg0KLy8hDQovLyEgVGhpcyBmdW5jdGlvbiBkb2VzIHRoZSBhY3R1YWwgdW5yZWdpc3RlcmluZyBvZiB0aGUgaW50ZXJydXB0IGhhbmRsZXIuICBJdA0KLy8hIGNsZWFycyB0aGUgaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiBhIFBSQ00gaW50ZXJydXB0IG9jY3Vycy4gIFRoaXMNCi8vISBmdW5jdGlvbiBhbHNvIG1hc2tzIG9mZiB0aGUgaW50ZXJydXB0IGluIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciBzbyB0aGF0DQovLyEgdGhlIGludGVycnVwdCBoYW5kbGVyIG5vIGxvbmdlciBpcyBjYWxsZWQuDQovLyENCi8vISBccmV0dXJuIE5vbmUuDQovLw0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0Kdm9pZCBQUkNNSW50VW5yZWdpc3RlcigpDQp7DQogIC8vDQogIC8vIEVuYWJsZSB0aGUgVUFSVCBpbnRlcnJ1cHQuDQogIC8vDQogIEludERpc2FibGUoSU5UX1BSQ00pOw0KDQogIC8vDQogIC8vIFJlZ2lzdGVyIHRoZSBpbnRlcnJ1cHQgaGFuZGxlci4NCiAgLy8NCiAgSW50VW5yZWdpc3RlcihJTlRfUFJDTSk7DQp9DQoNCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi8vDQovLyEgRW5hYmxlcyBpbmRpdmlkdWFsIFBSQ00gaW50ZXJydXB0IHNvdXJjZXMuDQovLyENCi8vISBccGFyYW0gdWxJbnRGbGFncyBpcyB0aGUgYml0IG1hc2sgb2YgdGhlIGludGVycnVwdCBzb3VyY2VzIHRvIGJlIGVuYWJsZWQuDQovLyENCi8vISBUaGlzIGZ1bmN0aW9uIGVuYWJsZXMgdGhlIGluZGljYXRlZCBBUkNNIGludGVycnVwdCBzb3VyY2VzLiAgT25seSB0aGUNCi8vISBzb3VyY2VzIHRoYXQgYXJlIGVuYWJsZWQgY2FuIGJlIHJlZmxlY3RlZCB0byB0aGUgcHJvY2Vzc29yIGludGVycnVwdDsNCi8vISBkaXNhYmxlZCBzb3VyY2VzIGhhdmUgbm8gZWZmZWN0IG9uIHRoZSBwcm9jZXNzb3IuDQovLyENCi8vISBUaGUgXGUgdWxJbnRGbGFncyBwYXJhbWV0ZXIgaXMgdGhlIGxvZ2ljYWwgT1Igb2YgYW55IG9mIHRoZSBmb2xsb3dpbmc6DQovLyEgLVxiIFBSQ01fSU5UX1NMT1dfQ0xLX0NUUg0KLy8hDQovLw0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0Kdm9pZCBQUkNNSW50RW5hYmxlKHVuc2lnbmVkIGxvbmcgdWxJbnRGbGFncykNCnsNCiAgdW5zaWduZWQgbG9uZyB1bFJlZ1ZhbHVlOw0KDQogIGlmKHVsSW50RmxhZ3MgJiBQUkNNX0lOVF9TTE9XX0NMS19DVFIgKQ0KICB7DQogICAgLy8NCiAgICAvLyBFbmFibGUgUFJDTSBpbnRlcnJ1cHQNCiAgICAvLw0KICAgIEhXUkVHKEFSQ01fQkFTRSArIEFQUFNfUkNNX09fQVBQU19SQ01fSU5URVJSVVBUX0VOQUJMRSkgfD0gMHg0Ow0KDQogICAgLy8NCiAgICAvLyBFbmFibGUgUlRDIGludGVycnVwdA0KICAgIC8vDQogICAgdWxSZWdWYWx1ZSA9IFBSQ01ISUJSZWdSZWFkKEhJQjNQM19CQVNFICsgSElCM1AzX09fTUVNX0hJQl9SVENfSVJRX0VOQUJMRSk7DQogICAgdWxSZWdWYWx1ZSB8PSAweDE7DQogICAgUFJDTUhJQlJlZ1dyaXRlKEhJQjNQM19CQVNFICsgSElCM1AzX09fTUVNX0hJQl9SVENfSVJRX0VOQUJMRSwgdWxSZWdWYWx1ZSk7DQogIH0NCn0NCg0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLy8NCi8vISBEaXNhYmxlcyBpbmRpdmlkdWFsIFBSQ00gaW50ZXJydXB0IHNvdXJjZXMuDQovLyENCi8vISBccGFyYW0gdWxJbnRGbGFncyBpcyB0aGUgYml0IG1hc2sgb2YgdGhlIGludGVycnVwdCBzb3VyY2VzIHRvIGJlIGRpc2FibGVkLg0KLy8hDQovLyEgVGhpcyBmdW5jdGlvbiBkaXNhYmxlcyB0aGUgaW5kaWNhdGVkIEFSQ00gaW50ZXJydXB0IHNvdXJjZXMuICBPbmx5IHRoZQ0KLy8hIHNvdXJjZXMgdGhhdCBhcmUgZW5hYmxlZCBjYW4gYmUgcmVmbGVjdGVkIHRvIHRoZSBwcm9jZXNzb3IgaW50ZXJydXB0Ow0KLy8hIGRpc2FibGVkIHNvdXJjZXMgaGF2ZSBubyBlZmZlY3Qgb24gdGhlIHByb2Nlc3Nvci4NCi8vIQ0KLy8hIFRoZSBcZSB1bEludEZsYWdzIHBhcmFtZXRlciBoYXMgdGhlIHNhbWUgZGVmaW5pdGlvbiBhcyB0aGUgXGUgdWxJbnRGbGFncw0KLy8hIHBhcmFtZXRlciB0byBQUkNNRW5hYmxlSW50ZXJydXB0KCkuDQovLyENCi8vISBccmV0dXJuIE5vbmUuDQovLw0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0Kdm9pZCBQUkNNSW50RGlzYWJsZSh1bnNpZ25lZCBsb25nIHVsSW50RmxhZ3MpDQp7DQogIHVuc2lnbmVkIGxvbmcgdWxSZWdWYWx1ZTsNCg0KICBpZih1bEludEZsYWdzICYgUFJDTV9JTlRfU0xPV19DTEtfQ1RSICkNCiAgew0KICAgIC8vDQogICAgLy8gRGlzYWJsZSBQUkNNIGludGVycnVwdA0KICAgIC8vDQogICAgSFdSRUcoQVJDTV9CQVNFICsgQVBQU19SQ01fT19BUFBTX1JDTV9JTlRFUlJVUFRfRU5BQkxFKSAmPSB+MHg0Ow0KDQogICAgLy8NCiAgICAvLyBEaXNhYmxlIFJUQyBpbnRlcnJ1cHQNCiAgICAvLw0KICAgIHVsUmVnVmFsdWUgPSBQUkNNSElCUmVnUmVhZChISUIzUDNfQkFTRSArIEhJQjNQM19PX01FTV9ISUJfUlRDX0lSUV9FTkFCTEUpOw0KICAgIHVsUmVnVmFsdWUgJj0gfjB4MTsNCiAgICBQUkNNSElCUmVnV3JpdGUoSElCM1AzX0JBU0UgKyBISUIzUDNfT19NRU1fSElCX1JUQ19JUlFfRU5BQkxFLCB1bFJlZ1ZhbHVlKTsNCiAgfQ0KfQ0KDQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQovLw0KLy8hIEdldHMgdGhlIGN1cnJlbnQgaW50ZXJydXB0IHN0YXR1cy4NCi8vIQ0KLy8hIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgUFJDTSBpbnRlcnJ1cHQgc3RhdHVzIG9mIGludGVycnVwdHMgdGhhdCBhcmUNCi8vISBhbGxvd2VkIHRvIHJlZmxlY3QgdG8gdGhlIHByb2Nlc3Nvci4gVGhlIGludGVycnVwdHMgYXJlIGNsZWFyZWQgb24gcmVhZC4NCi8vIQ0KLy8hIFxyZXR1cm4gUmV0dXJucyB0aGUgY3VycmVudCBpbnRlcnJ1cHQgc3RhdHVzLg0KLy8NCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCnVuc2lnbmVkIGxvbmcgUFJDTUludFN0YXR1cygpDQp7DQogICAgcmV0dXJuIEhXUkVHKEFSQ01fQkFTRSArIEFQUFNfUkNNX09fQVBQU19SQ01fSU5URVJSVVBUX1NUQVRVUyk7DQp9DQoNCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi8vDQovLyEgTWFyayB0aGUgZnVuY3Rpb24gb2YgUlRDIGFzIGJlaW5nIHVzZWQNCi8vIQ0KLy8hIFRoaXMgZnVuY3Rpb24gbWFya3MgaW4gSFcgdGhhdCBmZWF0dXJlIHRvIG1haW50YWluIGNhbGVuZGFyIHRpbWUgaW4gZGV2aWNlDQovLyEgaXMgYmVpbmcgdXNlZC4NCi8vIQ0KLy8hIFNwZWNpZmljYWxseSwgdGhpcyBmZWF0dXJlIHJlc2VydmVzIHVzZXIncyBISUIgUmVnaXN0ZXItMSBhY2Nlc3NlZCB0aHJvdWdoDQovLyEgUFJDTU9DUlJlZ2lzdGVyV3JpdGUoMSkgZm9yIGludGVybmFsIHdvcmsgLyBwdXJwb3NlLCB0aGVyZWZvcmUsIHRoZSBzdGF0ZWQNCi8vISByZWdpc3RlciBpcyBub3QgYXZhaWxhYmxlIHRvIHVzZXIuIEFsc28sIHVzZXJzIG11c3Qgbm90IGV4Y2VyY2lzZSB0aGUgU2xvdw0KLy8hIENsb2NrIENvdW50ZXIgQVBJKHMpLCBpZiBSVEMgaGFzIGJlZW4gc2V0IGZvciB1c2UuDQovLyENCi8vISBUaGUgUlRDIGZlYXR1cmUsIGlmIHNldCBvciBtYXJrZWQsIGNhbiBiZSBvbmx5IHJlc2V0IGVpdGhlciB0aHJvdWdoIHJlYm9vdA0KLy8hIG9yIHBvd2VyIGN5Y2xlLg0KLy8hDQovLyEgXHJldHVybiBOb25lLg0KLy8NCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCnZvaWQgUFJDTVJUQ0luVXNlU2V0KCkNCnsNCiAgICAgICAgUlRDX1VTRV9TRVQoKTsNCiAgICAgICAgcmV0dXJuOw0KfQ0KDQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQovLw0KLy8hIEFzY2VydGFpbiB3aGV0aGVyIGZ1bmN0aW9uIG9mIFJUQyBpcyBiZWluZyB1c2VkDQovLyENCi8vISBUaGlzIGZ1bmN0aW9uIGluZGljYXRlcyB3aGV0aGVyIGZ1bmN0aW9uIG9mIFJUQyBpcyBiZWluZyB1c2VkIG9uIHRoZSBkZXZpY2UNCi8vISBvciBub3QuDQovLyENCi8vISBUaGlzIHJvdXRpbmUgc2hvdWxkIGJlIHV0aWxpemVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSwgd2hlbiByZXR1cm5pbmcNCi8vISBmcm9tIGxvdy1wb3dlciwgdG8gY29uZmlybSB0aGF0IFJUQyBoYXMgYmVlbiBwdXQgdG8gdXNlIGFuZCBtYXkgbm90IG5lZWQgdG8NCi8vISBzZXQgdGhlIHZhbHVlIG9mIHRoZSBSVEMuDQovLyENCi8vISBUaGUgUlRDIGZlYXR1cmUsIGlmIHNldCBvciBtYXJrZWQsIGNhbiBiZSBvbmx5IHJlc2V0IGVpdGhlciB0aHJvdWdoIHJlYm9vdA0KLy8hIG9yIHBvd2VyIGN5Y2xlLg0KLy8hDQovLyEgXHJldHVybiBOb25lLg0KLy8NCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCnRCb29sZWFuIFBSQ01SVENJblVzZUdldCgpDQp7DQogICAgICAgIHJldHVybiBJU19SVENfVVNFRCgpPyB0cnVlIDogZmFsc2U7DQp9DQoNCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi8vDQovLyEgU2V0IHRoZSBjYWxlbmRhciB0aW1lIGluIHRoZSBkZXZpY2UuDQovLyENCi8vISBccGFyYW0gdWxTZWNzIHJlZmVycyB0byB0aGUgc2Vjb25kcyBwYXJ0IG9mIHRoZSAgY2FsZW5kYXIgdGltZQ0KLy8hIFxwYXJhbSB1c01zZWMgcmVmZXJzIHRvIHRoZSBmcmFjdGlvbmFsIChtcykgcGFydCBvZiB0aGUgc2Vjb25kDQovLyENCi8vISBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHNwZWNpZmllZCBjYWxlbmRhciB0aW1lIGluIHRoZSBkZXZpY2UuIFRoZSBjYWxlbmRhcg0KLy8hIHRpbWUgaXMgb3V0bGluZWQgaW4gdGVybXMgb2Ygc2Vjb25kcyBhbmQgbWlsbGlzZWNvbmRzLiBIb3dldmVyLCB0aGUgZGV2aWNlDQovLyEgbWFrZXMgbm8gYXNzdW1wdGlvbiBhYm91dCB0aGUgb3JpZ2luIG9yIHJlZmVyZW5jZSBvZiB0aGUgY2FsZW5kYXIgdGltZS4NCi8vIQ0KLy8hIFRoZSBkZXZpY2UgdXNlcyB0aGUgaW5kaWNhdGVkIGNhbGVuZGFyIHZhbHVlIHRvIHVwZGF0ZSBhbmQgbWFpbnRhaW4gdGhlDQovLyEgd2FsbC1jbG9jayB0aW1lIGFjcm9zcyBhY3RpdmUgYW5kIGxvdyBwb3dlciBzdGF0ZXMuDQovLyENCi8vISBUaGUgZnVuY3Rpb24gUFJDTVJUQ0luVXNlU2V0KCkgbXVzdCBiZSBpbnZva2VkIHByaW9yIHRvIHVzZSBvZiB0aGlzIGZlYXR1cmUuDQovLyENCi8vISBccmV0dXJuIE5vbmUuDQovLw0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0Kdm9pZCBQUkNNUlRDU2V0KHVuc2lnbmVkIGxvbmcgdWxTZWNzLCB1bnNpZ25lZCBzaG9ydCB1c01zZWMpDQp7DQogICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB1bGxNc2VjID0gMDsNCg0KICAgICAgICBpZihJU19SVENfVVNFRCgpKSB7DQogICAgICAgICAgICAgICAgdWxsTXNlYyA9IFJUQ19VNjRNU0VDX01LKHVsU2VjcywgdXNNc2VjKSAtIFNDQ19VNjRNU0VDX0dFVCgpOw0KDQogICAgICAgICAgICAgICAgIFJUQ19VMzJTRUNTX1JFR19XUihSVENfU0VDU19JTl9VNjRNU0VDKHVsbE1zZWMpKTsNCiAgICAgICAgICAgICAgICAgUlRDX1UxNk1TRUNfUkVHX1dSKFJUQ19NU0VDX0lOX1U2NE1TRUModWxsTXNlYykpOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuOw0KfQ0KDQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQovLw0KLy8hIEdldCB0aGUgaW5zdGFudGFuZW91cyBjYWxlbmRhciB0aW1lIGZyb20gdGhlIGRldmljZS4NCi8vIQ0KLy8hIFxwYXJhbSB1bFNlY3MgcmVmZXJzIHRvIHRoZSBzZWNvbmRzIHBhcnQgb2YgdGhlICBjYWxlbmRhciB0aW1lDQovLyEgXHBhcmFtIHVzTXNlYyByZWZlcnMgdG8gdGhlIGZyYWN0aW9uYWwgKG1zKSBwYXJ0IG9mIHRoZSBzZWNvbmQNCi8vIQ0KLy8hIFRoaXMgZnVuY3Rpb24gZmV0Y2hlcyB0aGUgaW5zdGFudGFuZW91cyB2YWx1ZSBvZiB0aGUgdGlja2luZyBjYWxlbmRhciB0aW1lDQovLyEgZnJvbSB0aGUgZGV2aWNlLiBUaGUgY2FsZW5kYXIgdGltZSBpcyBvdXRsaW5lZCBpbiB0ZXJtcyBvZiBzZWNvbmRzIGFuZA0KLy8hIG1pbGxpc2Vjb25kcy4NCi8vIQ0KLy8hIFRoZSBkZXZpY2UgcHJvdmlkZXMgdGhlIGNhbGVuZGFyIHZhbHVlIHRoYXQgaGFzIGJlZW4gbWFpbnRhaW5lZCBhY3Jvc3MNCi8vISBhY3RpdmUgYW5kIGxvdyBwb3dlciBzdGF0ZXMuDQovLyENCi8vISBUaGUgZnVuY3Rpb24gUFJDTVJUQ1NldCgpIG11c3QgaGF2ZSBiZWVuIGludm9rZWQgb25jZSB0byBzZXQgYSByZWZlcmVuY2UuDQovLyENCi8vISBccmV0dXJuIE5vbmUuDQovLw0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0Kdm9pZCBQUkNNUlRDR2V0KHVuc2lnbmVkIGxvbmcgKnVsU2VjcywgdW5zaWduZWQgc2hvcnQgKnVzTXNlYykNCnsNCiAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIHVsbE1zZWMgPSAwOw0KDQogICAgICAgIGlmKElTX1JUQ19VU0VEKCkpIHsNCiAgICAgICAgICAgICAgICB1bGxNc2VjICA9IFJUQ19VNjRNU0VDX01LKFJUQ19VMzJTRUNTX1JFR19SRCgpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRDX1UxNk1TRUNfUkVHX1JEKCkpOw0KICAgICAgICAgICAgICAgIHVsbE1zZWMgKz0gU0NDX1U2NE1TRUNfR0VUKCk7DQogICAgICAgIH0NCg0KICAgICAgICAqdWxTZWNzID0gUlRDX1NFQ1NfSU5fVTY0TVNFQyh1bGxNc2VjKTsNCiAgICAgICAgKnVzTXNlYyA9IFJUQ19NU0VDX0lOX1U2NE1TRUModWxsTXNlYyk7DQoNCiAgICAgICAgcmV0dXJuOw0KfQ0KDQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQovLw0KLy8hIFNldCBhIGNhbGVuZGFyIHRpbWUgYWxhcm0uDQovLyENCi8vISBccGFyYW0gdWxTZWNzIHJlZmVycyB0byB0aGUgc2Vjb25kcyBwYXJ0IG9mIHRoZSAgY2FsZW5kYXIgdGltZQ0KLy8hIFxwYXJhbSB1c01zZWMgcmVmZXJzIHRvIHRoZSBmcmFjdGlvbmFsIChtcykgcGFydCBvZiB0aGUgc2Vjb25kDQovLyENCi8vISBUaGlzIGZ1bmN0aW9uIHNldHMgYW4gd2FsbC1jbG9jayBhbGFybSBpbiB0aGUgZGV2aWNlIHRvIGJlIHJlcG9ydGVkIGZvciAgYQ0KLy8hIGZ1dHVyaXN0aWMgY2FsZW5kYXIgdGltZS4gVGhlIGNhbGVuZGFyIHRpbWUgaXMgb3V0bGluZWQgaW4gdGVybXMgb2Ygc2Vjb25kcw0KLy8hIGFuZCBtaWxsaXNlY29uZHMuDQovLyENCi8vISBUaGUgZGV2aWNlIHByb3ZpZGVzIHVzZXMgdGhlIGNhbGVuZGFyIHZhbHVlIHRoYXQgaGFzIGJlZW4gbWFpbnRhaW5lZCBhY3Jvc3MNCi8vISBhY3RpdmUgYW5kIGxvdyBwb3dlciBzdGF0ZXMgdG8gcmVwb3J0IGF0dGFpbm1lbnQgb2YgYWxhcm0gdGltZS4NCi8vIQ0KLy8hIFRoZSBmdW5jdGlvbiBQUkNNUlRDU2V0KCkgbXVzdCBoYXZlIGJlZW4gaW52b2tlZCBvbmNlIHRvIHNldCBhIHJlZmVyZW5jZS4NCi8vIQ0KLy8hIFxyZXR1cm4gTm9uZS4NCi8vDQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQp2b2lkIFBSQ01SVENNYXRjaFNldCh1bnNpZ25lZCBsb25nIHVsU2VjcywgdW5zaWduZWQgc2hvcnQgdXNNc2VjKQ0Kew0KICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgdWxsTXNlYyA9IDA7DQoNCiAgICAgICAgaWYoSVNfUlRDX1VTRUQoKSkgew0KICAgICAgICAgICAgICAgIHVsbE1zZWMgID0gUlRDX1U2NE1TRUNfTUsodWxTZWNzLCB1c01zZWMpOw0KICAgICAgICAgICAgICAgIHVsbE1zZWMgLT0gUlRDX1U2NE1TRUNfTUsoUlRDX1UzMlNFQ1NfUkVHX1JEKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVENfVTE2TVNFQ19SRUdfUkQoKSk7DQogICAgICAgICAgICAgICAgU0NDX1U2NE1TRUNfTUFUQ0hfU0VUKFNFTEVDVF9TQ0NfVTQyQklUUyh1bGxNc2VjKSk7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm47DQp9DQoNCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi8vDQovLyEgR2V0IGEgcHJldmlvdXNseSBzZXQgY2FsZW5kYXIgdGltZSBhbGFybS4NCi8vIQ0KLy8hIFxwYXJhbSB1bFNlY3MgcmVmZXJzIHRvIHRoZSBzZWNvbmRzIHBhcnQgb2YgdGhlICBjYWxlbmRhciB0aW1lDQovLyEgXHBhcmFtIHVzTXNlYyByZWZlcnMgdG8gdGhlIGZyYWN0aW9uYWwgKG1zKSBwYXJ0IG9mIHRoZSBzZWNvbmQNCi8vIQ0KLy8hIFRoaXMgZnVuY3Rpb24gZmV0Y2hlcyBmcm9tIHRoZSBkZXZpY2UgYSB3YWxsLWNsb2NrIGFsYXJtIHRoYXQgd291bGQgIGhhdmUNCi8vISBiZWVuIHByZXZpb3VzbHkgc2V0IGluIHRoZSBkZXZpY2UuIFRoZSBjYWxlbmRhciB0aW1lIGlzIG91dGxpbmVkIGluIHRlcm1zDQovLyEgb2Ygc2Vjb25kcyBhbmQgbWlsbGlzZWNvbmRzLg0KLy8hDQovLyEgSWYgbm8gYWxhcm0gd2FzIHNldCBpbiB0aGUgcGFzdCwgdGhlbiB0aGlzIGZ1bmN0aW9uIHdvdWxkIGZldGNoIGEgcmFuZG9tDQovLyEgaW5mb3JtYXRpb24uDQovLyENCi8vISBUaGUgZnVuY3Rpb24gUFJDTVJUQ01hdGNoU2V0KCkgbXVzdCBoYXZlIGJlZW4gaW52b2tlZCBvbmNlIHRvIHNldCBhbiBhbGFybS4NCi8vIQ0KLy8hIFxyZXR1cm4gTm9uZS4NCi8vDQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQp2b2lkIFBSQ01SVENNYXRjaEdldCh1bnNpZ25lZCBsb25nICp1bFNlY3MsIHVuc2lnbmVkIHNob3J0ICp1c01zZWMpDQp7DQogICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB1bGxNc2VjID0gMDsNCg0KICAgICAgICBpZihJU19SVENfVVNFRCgpKSB7DQogICAgICAgICAgICAgICAgdWxsTXNlYyAgPSBTQ0NfVTY0TVNFQ19NQVRDSF9HRVQoKTsNCiAgICAgICAgICAgICAgICB1bGxNc2VjICs9IFJUQ19VNjRNU0VDX01LKFJUQ19VMzJTRUNTX1JFR19SRCgpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRDX1UxNk1TRUNfUkVHX1JEKCkpOw0KICAgICAgICB9DQoNCiAgICAgICAgKnVsU2VjcyA9IFJUQ19TRUNTX0lOX1U2NE1TRUModWxsTXNlYyk7DQogICAgICAgICp1c01zZWMgPSBSVENfTVNFQ19JTl9VNjRNU0VDKHVsbE1zZWMpOw0KDQogICAgICAgIHJldHVybjsNCn0NCg0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLy8NCi8vISBNQ1UgSW5pdGlhbGl6YXRpb24gUm91dGluZQ0KLy8hDQovLyEgVGhpcyBmdW5jdGlvbiBjb250YWlucyBhbGwgdGhlIG1hbmRhdG9yeSBidWcgZml4ZXMsIEVDTyBlbmFibGVzLA0KLy8hIGluaXRpYWxpemF0aW9ucyBmb3IgYm90aCBDQzMyMDAgYW5kIENDMzIyMC4NCi8vIQ0KLy8hIFxub3RlIFxiICMjI0lNUE9SVEFOVCMjIyA6IFRoaXMgaXMgYSByb3V0aW5lIHdoaWNoIHNob3VsZCBiZSBvbmUgb2YgdGhlDQovLyEgZmlyc3QgdGhpbmdzIHRvIGJlIGV4ZWN1dGVkIGFmdGVyIGNvbnRyb2wgY29tZXMgdG8gTUNVIEFwcGxpY2F0aW9uIGNvZGUuDQovLyENCi8vISBccmV0dXJuIE5vbmUNCi8vDQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQp2b2lkIFBSQ01DQzMyMDBNQ1VJbml0KCkNCnsNCg0KICBpZiggUFJDTVN5c1Jlc2V0Q2F1c2VHZXQoKSAhPSBQUkNNX0xQRFNfRVhJVCApDQogIHsNCiAgICBpZiggMHgwMDAxMDAwMSA9PSBIV1JFRygweDAwMDAwNDAwKSApDQogICAgew0KDQojaWZuZGVmIFJFTU9WRV9DQzMyMDBfRVNfMV8yXzFfQ09ERQ0KDQogICAgICB1bnNpZ25lZCBsb25nIHVsUmVnVmFsOw0KDQogICAgICAvLw0KICAgICAgLy8gRElHIERDREMgTkZFVCBTRUwgYW5kIENPVCBtb2RlIGRpc2FibGUNCiAgICAgIC8vDQogICAgICBIV1JFRygweDQ0MDJGMDEwKSA9IDB4MzAwMzE4MjA7DQogICAgICBIV1JFRygweDQ0MDJGMDBDKSA9IDB4MDQwMDAwMDA7DQoNCiAgICAgIFV0aWxzRGVsYXkoMzIwMDApOw0KDQogICAgICAvLw0KICAgICAgLy8gQU5BIERDREMgY2xvY2sgY29uZmlnDQogICAgICAvLw0KICAgICAgSFdSRUcoMHg0NDAyRjExQykgPSAweDA5OTsNCiAgICAgIEhXUkVHKDB4NDQwMkYxMUMpID0gMHgwQUE7DQogICAgICBIV1JFRygweDQ0MDJGMTFDKSA9IDB4MUFBOw0KDQogICAgICAvLw0KICAgICAgLy8gUEEgRENEQyBjbG9jayBjb25maWcNCiAgICAgIC8vDQogICAgICBIV1JFRygweDQ0MDJGMTI0KSA9IDB4MDk5Ow0KICAgICAgSFdSRUcoMHg0NDAyRjEyNCkgPSAweDBBQTsNCiAgICAgIEhXUkVHKDB4NDQwMkYxMjQpID0gMHgxQUE7DQoNCiAgICAgIC8vDQogICAgICAvLyBURCBGbGFzaCB0aW1pbmcgY29uZmlndXJhdGlvbnMgaW4gY2FzZSBvZiBNQ1UgV0RUIHJlc2V0DQogICAgICAvLw0KICAgICAgaWYoKEhXUkVHKDB4NDQwMkQwMEMpICYgMHhGRikgPT0gMHgwMDAwMDAwNSkNCiAgICAgIHsNCiAgICAgICAgICBIV1JFRygweDQwMEY3MDdDKSB8PSAweDAxODQwMDgyOw0KICAgICAgICAgIEhXUkVHKDB4NDAwRjcwQzQpPSAweDE7DQogICAgICAgICAgSFdSRUcoMHg0MDBGNzBDNCk9IDB4MDsNCiAgICAgIH0NCg0KICAgICAgLy8NCiAgICAgIC8vIFRha2UgSTJDIHNlbWFwaG9yZQ0KICAgICAgLy8NCiAgICAgIHVsUmVnVmFsID0gSFdSRUcoMHg0MDBGNzAwMCk7DQogICAgICB1bFJlZ1ZhbCA9ICh1bFJlZ1ZhbCAmIH4weDMpIHwgMHgxOw0KICAgICAgSFdSRUcoMHg0MDBGNzAwMCkgPSB1bFJlZ1ZhbDsNCg0KICAgICAgLy8NCiAgICAgIC8vIFRha2UgR1BJTyBzZW1hcGhvcmUNCiAgICAgIC8vDQogICAgICB1bFJlZ1ZhbCA9IEhXUkVHKDB4NDAwRjcwM0MpOw0KICAgICAgdWxSZWdWYWwgPSAodWxSZWdWYWwgJiB+MHgzRkYpIHwgMHgxNTU7DQogICAgICBIV1JFRygweDQwMEY3MDNDKSA9IHVsUmVnVmFsOw0KDQogICAgICAvLw0KICAgICAgLy8gRW5hYmxlIDMyS0h6IGludGVybmFsIFJDIG9zY2lsbGF0b3INCiAgICAgIC8vDQogICAgICBQUkNNSElCUmVnV3JpdGUoSElCM1AzX0JBU0UrSElCM1AzX09fTUVNX0lOVF9PU0NfQ09ORiwgMHgwMDAwMDEwMSk7DQoNCiAgICAgIC8vDQogICAgICAvLyBEZWxheSBmb3IgYSBsaXR0bGUgYml0Lg0KICAgICAgLy8NCiAgICAgIFV0aWxzRGVsYXkoODAwMCk7DQoNCiAgICAgIC8vDQogICAgICAvLyBFbmFibGUgMTZNSHogY2xvY2sNCiAgICAgIC8vDQogICAgICBIV1JFRyhISUIxUDJfQkFTRStISUIxUDJfT19DTV9PU0NfMTZNX0NPTkZJRykgPSAweDAwMDEwMDA4Ow0KDQogICAgICAvLw0KICAgICAgLy8gRGVsYXkgZm9yIGEgbGl0dGxlIGJpdC4NCiAgICAgIC8vDQogICAgICBVdGlsc0RlbGF5KDgwMDApOw0KDQojZW5kaWYgLy8gUkVNT1ZFX0NDMzIwMF9FU18xXzJfMV9DT0RFDQoNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCg0KICAgICAgdW5zaWduZWQgbG9uZyB1bFJlZ1ZhbHVlOw0KDQogICAgICAvLw0KICAgICAgLy8gRElHIERDREMgTFBEUyBFQ08gRW5hYmxlDQogICAgICAvLw0KICAgICAgSFdSRUcoMHg0NDAyRjA2NCkgfD0gMHg4MDAwMDA7DQoNCiAgICAgIC8vDQogICAgICAvLyBFbmFibGUgaGliZXJuYXRlIEVDTyBmb3IgUEcgMS4zMiBkZXZpY2VzIG9ubHkuIFdpdGggdGhpcyBFQ08gZW5hYmxlZCwNCiAgICAgIC8vIGFueSBoaWJlcm5hdGUgd2FrZXVwIHNvdXJjZSB3aWxsIGJlIGtlcHQgbWFrZWQgdW50aWwgdGhlIGRldmljZSBlbnRlcnMNCiAgICAgIC8vIGhpYmVybmF0ZSBjb21wbGV0ZWx5IChhbmFsb2cgKyBkaWdpdGFsKQ0KICAgICAgLy8NCiAgICAgIHVsUmVnVmFsdWUgPSBQUkNNSElCUmVnUmVhZChISUIzUDNfQkFTRSAgKyBISUIzUDNfT19NRU1fSElCX1JFRzApOw0KICAgICAgUFJDTUhJQlJlZ1dyaXRlKEhJQjNQM19CQVNFICsgSElCM1AzX09fTUVNX0hJQl9SRUcwLCB1bFJlZ1ZhbHVlIHwgKDE8PDQpKTsNCg0KICAgICAgLy8NCiAgICAgIC8vIEhhbmRsaW5nIHRoZSBjbG9jayBzd2l0Y2hpbmcgKGZvciAxLjMyIG9ubHkpDQogICAgICAvLw0KICAgICAgSFdSRUcoMHg0NDAyRTE2QykgfD0gMHgzQzsNCiAgICB9DQoNCg0KICAgIC8vDQogICAgLy8gRW5hYmxlIHVETUENCiAgICAvLw0KICAgIFBSQ01QZXJpcGhlcmFsQ2xrRW5hYmxlKFBSQ01fVURNQSxQUkNNX1JVTl9NT0RFX0NMSyk7DQoNCiAgICAvLw0KICAgIC8vIFJlc2V0IHVETUENCiAgICAvLw0KICAgIFBSQ01QZXJpcGhlcmFsUmVzZXQoUFJDTV9VRE1BKTsNCg0KICAgIC8vDQogICAgLy8gRGlzYWJsZSB1RE1BDQogICAgLy8NCiAgICBQUkNNUGVyaXBoZXJhbENsa0Rpc2FibGUoUFJDTV9VRE1BLFBSQ01fUlVOX01PREVfQ0xLKTsNCg0KICAgIC8vDQogICAgLy8gRW5hYmxlIFJUQw0KICAgIC8vDQogICAgaWYoUFJDTVN5c1Jlc2V0Q2F1c2VHZXQoKT09IFBSQ01fUE9XRVJfT04pDQogICAgew0KICAgICAgICBQUkNNSElCUmVnV3JpdGUoMHg0NDAyRjgwNCwweDEpOw0KICAgIH0NCg0KICAgIC8vDQogICAgLy8gU1dEIG1vZGUNCiAgICAvLw0KICAgIGlmKCgoSFdSRUcoMHg0NDAyRjBDOCkgJiAweEZGKSA9PSAweDIpKQ0KICAgIHsNCiAgICAgICAgSFdSRUcoMHg0NDAyRTExMCkgPSAoKEhXUkVHKDB4NDQwMkUxMTApICYgfjB4QzBGKSB8IDB4Mik7DQogICAgICAgIEhXUkVHKDB4NDQwMkUxMTQpID0gKChIV1JFRygweDQ0MDJFMTEwKSAmIH4weEMwRikgfCAweDIpOw0KICAgIH0NCg0KICAgIC8vDQogICAgLy8gT3ZlcnJpZGUgSlRBRyBtdXgNCiAgICAvLw0KICAgIEhXUkVHKDB4NDQwMkUxODQpIHw9IDB4MjsNCg0KICAgIC8vDQogICAgLy8gQ2hhbmdlIFVBUlQgcGlucyg1NSw1NykgbW9kZSB0byBQSU5fTU9ERV8wIGlmIHRoZXkgYXJlIGluIFBJTl9NT0RFXzENCiAgICAvLw0KICAgIGlmKCAoSFdSRUcoMHg0NDAyRTBBNCkgJiAweEYpID09IDB4MSkNCiAgICB7DQogICAgICAgIEhXUkVHKDB4NDQwMkUwQTQpID0gKChIV1JFRygweDQ0MDJFMEE0KSAmIH4weEYpKTsNCiAgICB9DQoNCiAgICBpZiggKEhXUkVHKDB4NDQwMkUwQTgpICYgMHhGKSA9PSAweDEpDQogICAgew0KICAgICAgICBIV1JFRygweDQ0MDJFMEE4KSA9ICgoSFdSRUcoMHg0NDAyRTBBOCkgJiB+MHhGKSk7DQogICAgfQ0KDQogICAgLy8NCiAgICAvLyBESUcgRENEQyBWT1VUIHRyaW0gc2V0dGluZ3MgYmFzZWQgb24gUFJPQ0VTUyBJTkRJQ0FUT1INCiAgICAvLw0KICAgIGlmKCgoSFdSRUcoMHg0NDAyREM3OCkgPj4gMjIpICYgMHhGKSA9PSAweEUpDQogICAgew0KICAgICAgICBIV1JFRygweDQ0MDJGMEIwKSA9ICgoSFdSRUcoMHg0NDAyRjBCMCkgJiB+KDB4MDBGQzAwMDApKXwoMHgzMiA8PCAxOCkpOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICBIV1JFRygweDQ0MDJGMEIwKSA9ICgoSFdSRUcoMHg0NDAyRjBCMCkgJiB+KDB4MDBGQzAwMDApKXwoMHgyOSA8PCAxOCkpOw0KICAgIH0NCg0KICAgIC8vDQogICAgLy8gRW5hYmxlIFNPRlQgUkVTVEFSVCBpbiBjYXNlIG9mIERJRyBEQ0RDIGNvbGxhcHNlDQogICAgLy8NCiAgICBIV1JFRygweDQ0MDJGQzc0KSAmPSB+KDB4MTAwMDAwMDApOw0KDQogICAgLy8NCiAgICAvLyBSZXF1aXJlZCBvbmx5IGlmIFJPTSB2ZXJzaW9uIGlzIGxvd2VyIHRoYW4gMi54LngNCiAgICAvLw0KICAgIGlmKCAoSFdSRUcoMHgwMDAwMDQwMCkgJiAweEZGRkYpIDwgMiApDQogICAgew0KICAgICAgLy8NCiAgICAgIC8vIERpc2FibGUgdGhlIHNsZWVwIGZvciBBTkEgRENEQw0KICAgICAgLy8NCiAgICAgIEhXUkVHKDB4NDQwMkYwQTgpIHw9IDB4MDAwMDAwMDQgOw0KICAgIH0NCiAgICBlbHNlIGlmKCAoSFdSRUcoMHgwMDAwMDQwMCkgPj4gMTYpICA+PSAxICkNCiAgICB7DQogICAgICAvLw0KICAgICAgLy8gRW5hYmxlIE5XUCBmb3JjZSByZXNldCBhbmQgSElCIG9uIFdEVCByZXNldA0KICAgICAgLy8gRW5hYmxlIGRpcmVjdCBib290IHBhdGggZm9yIGZsYXNoDQogICAgICAvLw0KICAgICAgSFdSRUcoT0NQX1NIQVJFRF9CQVNFICsgT0NQX1NIQVJFRF9PX1NQQVJFX1JFR184KSB8PSAoKDc8PDUpIHwgMHgxKTsNCiAgICAgIGlmKChIV1JFRyhISUIzUDNfQkFTRSArIEhJQjNQM19PX01FTV9ISUJfUkVHMikgJiAweDEpICkNCiAgICAgIHsNCiAgICAgICAgICBIV1JFRyhISUIzUDNfQkFTRSArIEhJQjNQM19PX01FTV9ISUJfUkVHMikgJj0gfjB4MTsNCiAgICAgICAgICBIV1JFRyhPQ1BfU0hBUkVEX0JBU0UgKyBPQ1BfU0hBUkVEX09fU1BBUkVfUkVHXzgpIHw9ICgxPDw5KTsNCg0KICAgICAgICAgIC8vDQogICAgICAgICAgLy8gQ2xlYXIgdGhlIFJUQyBoaWIgd2FrZSB1cCBzb3VyY2UNCiAgICAgICAgICAvLw0KICAgICAgICAgIEhXUkVHKEhJQjNQM19CQVNFK0hJQjNQM19PX01FTV9ISUJfUlRDX1dBS0VfRU4pICY9IH4weDE7DQoNCiAgICAgICAgICAvLw0KICAgICAgICAgIC8vIFJlc2V0IFJUQyBtYXRjaCB2YWx1ZQ0KICAgICAgICAgIC8vDQogICAgICAgICAgSFdSRUcoSElCM1AzX0JBU0UgKyBISUIzUDNfT19NRU1fSElCX1JUQ19XQUtFX0xTV19DT05GKSA9IDA7DQogICAgICAgICAgSFdSRUcoSElCM1AzX0JBU0UgKyBISUIzUDNfT19NRU1fSElCX1JUQ19XQUtFX01TV19DT05GKSA9IDA7DQoNCiAgICAgIH0NCiAgICB9DQogICAgDQogICAgdW5zaWduZWQgbG9uZyBlZnVzZV9yZWcyOw0KICAgIHVuc2lnbmVkIGxvbmcgdWxEZXZNYWpvclZlciwgdWxEZXZNaW5vclZlcjsNCiAgICAvLw0KICAgIC8vIFJlYWQgdGhlIGRldmljZSBpZGVudGlmaWNhdGlvbiByZWdpc3Rlcg0KICAgIC8vDQogICAgZWZ1c2VfcmVnMj0gSFdSRUcoR1BSQ01fQkFTRSArIEdQUkNNX09fR1BSQ01fRUZVU0VfUkVBRF9SRUcyKTsNCiAgICANCiAgICAvLw0KICAgIC8vIFJlYWQgdGhlIFJPTSBtb2pvciBhbmQgbWlub3IgdmVyc2lvbg0KICAgIC8vDQogICAgdWxEZXZNYWpvclZlciA9ICgoZWZ1c2VfcmVnMiA+PiAyOCkgJiAweEYpOw0KICAgIHVsRGV2TWlub3JWZXIgPSAoKGVmdXNlX3JlZzIgPj4gMjQpICYgMHhGKTsNCiAgDQogICAgaWYoKCh1bERldk1ham9yVmVyID09IDB4MykgJiYgKHVsRGV2TWlub3JWZXIgPT0gMCkpIHx8ICh1bERldk1ham9yVmVyIDwgMHgzKSkNCiAgICB7DQogICAgICB1bnNpZ25lZCBpbnQgU2NyYXRjaCwgUHJlUmVndWxhdGVkTW9kZTsNCg0KICAgICAgLy8gMHg0NDAyRjg0MCA9PiA2dGggYml0IJMxlCBpbmRpY2F0ZXMgZGV2aWNlIGlzIGluIHByZS1yZWd1bGF0ZWQgbW9kZS4NCiAgICAgIFByZVJlZ3VsYXRlZE1vZGUgPSAoSFdSRUcoMHg0NDAyRjg0MCkgPj4gNikgJiAxOw0KICAgIA0KICAgICAgaWYoIFByZVJlZ3VsYXRlZE1vZGUpDQogICAgICB7DQogICAgICAgIFNjcmF0Y2ggPSBIV1JFRygweDQ0MDJGMDI4KTsNCiAgICAgICAgU2NyYXRjaCAmPSAweEZGRkZGRjdGOyAvLyA8Nzo3PiA9IDANCiAgICAgICAgSFdSRUcoMHg0NDAyRjAyOCkgPSBTY3JhdGNoOw0KICAgICAgICANCiAgICAgICAgU2NyYXRjaCA9IEhXUkVHKDB4NDQwMkYwMTApOw0KICAgICAgICBTY3JhdGNoICY9IDB4MEZGRkZGRkY7IC8vIDwzMToyOD4gPSAwDQogICAgICAgIFNjcmF0Y2ggfD0gMHgxMDAwMDAwMDsgLy8gPDMxOjI4PiA9IDENCiAgICAgICAgSFdSRUcoMHg0NDAyRjAxMCkgPSBTY3JhdGNoOw0KICAgICAgfQ0KICAgICAgZWxzZQ0KICAgICAgew0KICAgICAgICBTY3JhdGNoID0gSFdSRUcoMHg0NDAyRjAyNCk7DQoNCiAgICAgICAgU2NyYXRjaCAmPSAweEZGRkZGRkYwOyAvLyA8MzowPiA9IDANCiAgICAgICAgU2NyYXRjaCB8PSAweDAwMDAwMDAxOyAvLyA8MzowPiA9IDENCiAgICAgICAgU2NyYXRjaCAmPSAweEZGRkZGMEZGOyAvLyA8MTE6OD4gPSAwMDAwDQogICAgICAgIFNjcmF0Y2ggfD0gMHgwMDAwMDUwMDsgLy8gPDExOjg+ID0gMDEwMQ0KICAgICAgICBTY3JhdGNoICY9IDB4RkZGRTdGRkY7IC8vIDwxNjoxNT4gPSAwMDAwDQogICAgICAgIFNjcmF0Y2ggfD0gMHgwMDAxMDAwMDsgLy8gPDE2OjE1PiA9IDEwDQoNCiAgICAgICAgSFdSRUcoMHg0NDAyRjAyNCkgPSBTY3JhdGNoOw0KDQogICAgICAgIFNjcmF0Y2ggPSBIV1JFRygweDQ0MDJGMDI4KTsNCg0KICAgICAgICBTY3JhdGNoICY9IDB4RkZGRkZGN0Y7IC8vIDw3Ojc+ID0gMA0KICAgICAgICBTY3JhdGNoICY9IDB4MEZGRkZGRkY7IC8vIDwzMToyOD4gPSAwDQogICAgICAgIFNjcmF0Y2ggJj0gMHhGRjBGRkZGRjsgLy8gPDIzOjIwPiA9IDANCiAgICAgICAgU2NyYXRjaCB8PSAweDAwMzAwMDAwOyAvLyA8MjM6MjA+ID0gMDAxMQ0KICAgICAgICBTY3JhdGNoICY9IDB4RkZGMEZGRkY7IC8vIDwxOToxNj4gPSAwDQogICAgICAgIFNjcmF0Y2ggfD0gMHgwMDAzMDAwMDsgLy8gPDE5OjE2PiA9IDAwMTENCg0KICAgICAgICBIV1JFRygweDQ0MDJGMDI4KSA9IFNjcmF0Y2g7DQogICAgICAgIEhXUkVHKDB4NDQwMkYwMTApICY9IDB4MEZGRkZGRkY7IC8vIDwzMToyOD4gPSAwDQogICAgICB9DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICB1bnNpZ25lZCBpbnQgU2NyYXRjaCwgUHJlUmVndWxhdGVkTW9kZTsNCg0KICAgICAgLy8gMHg0NDAyRjg0MCA9PiA2dGggYml0IJMxlCBpbmRpY2F0ZXMgZGV2aWNlIGlzIGluIHByZS1yZWd1bGF0ZWQgbW9kZS4NCiAgICAgIFByZVJlZ3VsYXRlZE1vZGUgPSAoSFdSRUcoMHg0NDAyRjg0MCkgPj4gNikgJiAxOw0KICAgIA0KICAgICAgU2NyYXRjaCA9IEhXUkVHKDB4NDQwMkYwMjgpOw0KICAgICAgU2NyYXRjaCAmPSAweEZGRkZGRjdGOyAvLyA8Nzo3PiA9IDANCiAgICAgIEhXUkVHKDB4NDQwMkYwMjgpID0gU2NyYXRjaDsNCiAgICANCiAgICAgIEhXUkVHKDB4NDQwMkYwMTApICY9IDB4MEZGRkZGRkY7IC8vIDwzMToyOD4gPSAwDQogICAgICBpZiggUHJlUmVndWxhdGVkTW9kZSkNCiAgICAgIHsNCiAgICAgICAgSFdSRUcoMHg0NDAyRjAxMCkgfD0gMHgxMDAwMDAwMDsgLy8gPDMxOjI4PiA9IDENCiAgICAgIH0gIA0KICAgIH0NCiAgfQ0KICBlbHNlDQogIHsNCiAgICB1bnNpZ25lZCBsb25nIHVsUmVnVmFsOw0KDQogICAgLy8NCiAgICAvLyBJMkMgQ29uZmlndXJhdGlvbg0KICAgIC8vDQogICAgdWxSZWdWYWwgPSBIV1JFRyhDT01NT05fUkVHX0JBU0UgKyBDT01NT05fUkVHX09fSTJDX1Byb3BlcnRpZXNfUmVnaXN0ZXIpOw0KICAgIHVsUmVnVmFsID0gKHVsUmVnVmFsICYgfjB4MykgfCAweDE7DQogICAgSFdSRUcoQ09NTU9OX1JFR19CQVNFICsgQ09NTU9OX1JFR19PX0kyQ19Qcm9wZXJ0aWVzX1JlZ2lzdGVyKSA9IHVsUmVnVmFsOw0KDQogICAgLy8NCiAgICAvLyBHUElPIGNvbmZpZ3VyYXRpb24NCiAgICAvLw0KICAgIHVsUmVnVmFsID0gSFdSRUcoQ09NTU9OX1JFR19CQVNFICsgQ09NTU9OX1JFR19PX0dQSU9fcHJvcGVydGllc19yZWdpc3Rlcik7DQogICAgdWxSZWdWYWwgPSAodWxSZWdWYWwgJiB+MHgzRkYpIHwgMHgxNTU7DQogICAgSFdSRUcoQ09NTU9OX1JFR19CQVNFICsgQ09NTU9OX1JFR19PX0dQSU9fcHJvcGVydGllc19yZWdpc3RlcikgPSB1bFJlZ1ZhbDsNCg0KICB9DQp9DQoNCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi8vDQovLyEgUmVhZHMgMzItYml0IHZhbHVlIGZyb20gcmVnaXN0ZXIgYXQgc3BlY2lmaWVkIGFkZHJlc3MNCi8vIQ0KLy8hIFxwYXJhbSB1bFJlZ0FkZHIgaXMgdGhlIGFkZHJlc3Mgb2YgcmVnaXN0ZXIgdG8gYmUgcmVhZC4NCi8vIQ0KLy8hIFRoaXMgZnVuY3Rpb24gcmVhZHMgMzItYml0IHZhbHVlIGZyb20gdGhlIHJlZ2lzdGVyIGFzIHNwZWNpZmllZCBieQ0KLy8hIFxlIHVsUmVnQWRkci4NCi8vIQ0KLy8hIFxyZXR1cm4gUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcmVnaXN0ZXIuDQovLw0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KdW5zaWduZWQgbG9uZyBQUkNNSElCUmVnUmVhZCh1bnNpZ25lZCBsb25nIHVsUmVnQWRkcikNCnsNCiAgdW5zaWduZWQgbG9uZyB1bFZhbHVlOw0KDQogIC8vDQogIC8vIFJlYWQgdGhlIFJlZyB2YWx1ZQ0KICAvLw0KICB1bFZhbHVlID0gSFdSRUcodWxSZWdBZGRyKTsNCg0KICAvLw0KICAvLyBXYWl0IGZvciAyMDAgdVNlYw0KICAvLw0KICBVdGlsc0RlbGF5KCg4MCoyMDApLzMpOw0KDQogIC8vDQogIC8vIFJldHVybiB0aGUgdmFsdWUNCiAgLy8NCiAgcmV0dXJuIHVsVmFsdWU7DQp9DQoNCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi8vDQovLyEgV3JpdGVzIDMyLWJpdCB2YWx1ZSB0byByZWdpc3RlciBhdCBzcGVjaWZpZWQgYWRkcmVzcw0KLy8hDQovLyEgXHBhcmFtIHVsUmVnQWRkciBpcyB0aGUgYWRkcmVzcyBvZiByZWdpc3RlciB0byBiZSByZWFkLg0KLy8hIFxwYXJhbSB1bFZhbHVlIGlzIHRoZSAzMi1iaXQgdmFsdWUgdG8gYmUgd3JpdHRlbi4NCi8vIQ0KLy8hIFRoaXMgZnVuY3Rpb24gd3JpdGVzIDMyLWJpdCB2YWx1ZSBwYXNzZWQgYXMgXGUgdWxWYWx1ZSB0byB0aGUgcmVnaXN0ZXIgYXMNCi8vISBzcGVjaWZpZWQgYnkgXGUgdWxSZWdBZGRyDQovLyENCi8vISBccmV0dXJuIE5vbmUNCi8vDQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQp2b2lkIFBSQ01ISUJSZWdXcml0ZSh1bnNpZ25lZCBsb25nIHVsUmVnQWRkciwgdW5zaWduZWQgbG9uZyB1bFZhbHVlKQ0Kew0KICAvLw0KICAvLyBSZWFkIHRoZSBSZWcgdmFsdWUNCiAgLy8NCiAgSFdSRUcodWxSZWdBZGRyKSA9IHVsVmFsdWU7DQoNCiAgLy8NCiAgLy8gV2FpdCBmb3IgMjAwIHVTZWMNCiAgLy8NCiAgVXRpbHNEZWxheSgoODAqMjAwKS8zKTsNCn0NCg0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLy8NCi8vISBccGFyYW0gdWxEaXZpZGVyIGlzIGNsb2NrIGZyZXF1ZW5jeSBkaXZpZGVyIHZhbHVlDQovLyEgXHBhcmFtIHVsV2lkdGggaXMgdGhlIHdpZHRoIG9mIHRoZSBoaWdoIHB1bHNlDQovLyENCi8vISBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGlucHV0IGZyZXF1ZW5jeSBmb3IgY2FtZXJhIG1vZHVsZS4NCi8vIQ0KLy8hIFRoZSBmcmVxdWVuY3kgaXMgY2FsY3VsYXRlZCBhcyBmb2xsb3dzOg0KLy8hDQovLyEgICAgICAgIGZfb3V0ID0gMjQwTUh6L3VsRGl2aWRlcjsNCi8vIQ0KLy8hIFRoZSBwYXJhbWV0ZXIgXGUgdWxXaWR0aCBzZXRzIHRoZSB3aWR0aCBvZiB0aGUgaGlnaCBwdWxzZS4NCi8vIQ0KLy8hIEZvciBlLmcuOg0KLy8hDQovLyEgICAgIHVsRGl2aWRlciA9IDQ7DQovLyEgICAgIHVsV2lkdGggICA9IDI7DQovLyENCi8vISAgICAgZl9vdXQgPSAzMCBNSHogYW5kIDUwJSBkdXR5IGN5Y2xlDQovLyENCi8vISBBbmQsDQovLyENCi8vISAgICAgdWxEaXZpZGVyID0gNDsNCi8vISAgICAgdWxXaWR0aCAgID0gMTsNCi8vIQ0KLy8hICAgICBmX291dCA9IDMwIE1IeiBhbmQgMjUlIGR1dHkgY3ljbGUNCi8vIQ0KLy8hIFxyZXR1cm4gMCBvbiBzdWNjZXNzLCAxIG9uIGVycm9yDQovLw0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KdW5zaWduZWQgbG9uZyBQUkNNQ2FtZXJhRnJlcVNldCh1bnNpZ25lZCBjaGFyIHVsRGl2aWRlciwgdW5zaWduZWQgY2hhciB1bFdpZHRoKQ0Kew0KICAgIGlmKHVsRGl2aWRlciA+IHVsV2lkdGggJiYgdWxXaWR0aCAhPSAwICkNCiAgICB7DQogICAgICAvLw0KICAgICAgLy8gU2V0ICB0aGUgaGlmaCBwdWxzZSB3aWR0aA0KICAgICAgLy8NCiAgICAgIEhXUkVHKEFSQ01fQkFTRSArDQogICAgICAgICAgICBBUFBTX1JDTV9PX0NBTUVSQV9DTEtfR0VOKSA9ICgoKHVsV2lkdGggJiAweDA3KSAtMSkgPDwgOCk7DQoNCiAgICAgIC8vDQogICAgICAvLyBTZXQgdGhlIGxvdyBwdWxzZSB3aWR0aA0KICAgICAgLy8NCiAgICAgIEhXUkVHKEFSQ01fQkFTRSArDQogICAgICAgICAgICBBUFBTX1JDTV9PX0NBTUVSQV9DTEtfR0VOKSA9ICgodWxEaXZpZGVyIC0gdWxXaWR0aCAtIDEpICYgMHgwNyk7DQogICAgICAvLw0KICAgICAgLy8gUmV0dXJuIHN1Y2Nlc3MNCiAgICAgIC8vDQogICAgICByZXR1cm4gMDsNCiAgICB9DQoNCiAgICAvLw0KICAgIC8vIFN1Y2Nlc3M7DQogICAgLy8NCiAgICByZXR1cm4gMTsNCn0NCg0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLy8NCi8vISBFbmFibGUgdGhlIElPIHZhbHVlIHJldGVudGlvbg0KLy8hDQovLyEgXHBhcmFtIHVsSU9SZXRHcnBGbGFncyBpcyBvbmUgb2YgdGhlIHZhbGlkIElPIGdyb3Vwcy4NCi8vIQ0KLy8hIFRoaXMgZnVuY3Rpb24gZW5hYmxlcyB0aGUgSU8gcmV0ZW50aW9uIGZvciBncm91cCBvZiBwaW5zIGFzIHNwZWNpZmllZCBieQ0KLy8hIFxlIHVsSU9SZXRHcnBGbGFncyBwYXJhbWV0ZXIuIEVuYWJsaW5nIHJldGVudGlvbiB3aWxsIGltbWVkaWF0ZWx5IGxvY2sgdGhlDQovLyEgZGlnaXRhbCBwaW5zLCBpbiB0aGUgc3BlY2lmaWVkIGdyb3VwLCB0byB0aGVpciBjdXJyZW50IHN0YXRlICgwIG9yIDEpLg0KLy8hIE91dHB1dCBwaW5zIGNhbiBvbmx5IGJlIGRyaXZlbiB3aGVuIHJldGVudGlvbiBpcyBkaXNhYmxlZC4NCi8vIQ0KLy8hIFRoZSBwYXJhbWV0ZXIgXGUgdWxJT1JldEdycEZsYWdzIGNhbiBiZSBsb2dpY2FsIE9SIG9mIG9uZSBvcg0KLy8hIG1vcmUgb2YgdGhlIGZvbGxvd2luZzoNCi8vISAtXGIgUFJDTV9JT19SRVRfR1JQXzAgLSBBbGwgdGhlIHBpbnMgZXhjZXB0IHNGbGFzaCBhbmQgSlRBRyBpbnRlcmZhY2UNCi8vISAtXGIgUFJDTV9JT19SRVRfR1JQXzEgLSBzRmxhc2ggaW50ZXJmYWNlIHBpbnMgMTEsMTIsMTMsMTQNCi8vISAtXGIgUFJDTV9JT19SRVRfR1JQXzIgLSBKVEFHIFRESSBhbmQgVERPIGludGVyZmFjZSBwaW5zIDE2LDE3DQovLyEgLVxiIFBSQ01fSU9fUkVUX0dSUF8zIC0gSlRBRyBUQ0sgYW5kIFRNUyBpbnRlcmZhY2UgcGlucyAxOSwyMA0KLy8hDQovLyEgXG5vdGUgVXNlIGNhc2UgaXMgdG8gcGFyayB0aGUgcGlucyB3aGVuIGVudGVyaW5nIEhJQi4NCi8vIQ0KLy8hIFxyZXR1cm4gTm9uZS4NCi8vDQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQp2b2lkIFBSQ01JT1JldGVudGlvbkVuYWJsZSh1bnNpZ25lZCBsb25nIHVsSU9SZXRHcnBGbGFncykNCnsNCg0KICAvLw0KICAvLyBTdXBwb3J0ZWQgb25seSBpbiBFUzIuMDAgYW5kIExhdGVyIGRldmljZXMgaS5lLiBST00gVmVyc2lvbiAyLngueCBvciBncmVhdGVyDQogIC8vDQogIGlmKCAoSFdSRUcoMHgwMDAwMDQwMCkgJiAweEZGRkYpID49IDIgKQ0KICB7DQogICAgLy8NCiAgICAvLyBEaXNhYmxlIElPIFBhZCB0byBPREkgUGF0aA0KICAgIC8vDQogICAgSFdSRUcoT0NQX1NIQVJFRF9CQVNFICsgT0NQX1NIQVJFRF9PX0dQSU9fUEFEX0NNTl9DT05GSUcpIHw9IDB4MDAwMDFGMDA7DQoNCiAgICAvLw0KICAgIC8vIDBiJzAgaW4gYml0IDUgZm9yIEpUQUcgUEFEUw0KICAgIC8vIDBiJzAgaW4gYml0IDAgZm9yIGFsbCBvdGhlciBJT3MNCiAgICAvLw0KICAgIEhXUkVHKE9DUF9TSEFSRURfQkFTRSArIE9DUF9TSEFSRURfT19HUElPX1BBRF9DTU5fQ09ORklHKSAmPSB+KDB4MDAwMDAwMjMpOw0KDQogICAgLy8NCiAgICAvLyBFbmFibGUgcmV0ZW50aW9uIGZvciBHUlAwDQogICAgLy8NCiAgICBpZiggdWxJT1JldEdycEZsYWdzICYgUFJDTV9JT19SRVRfR1JQXzAgKQ0KICAgIHsNCiAgICAgIEhXUkVHKEhJQjNQM19CQVNFK0hJQjNQM19PX01FTV9QQURfT0VOX1JFVDMzX0NPTkYpIHw9IDB4NTsNCiAgICB9DQoNCiAgICAvLw0KICAgIC8vIEVuYWJsZSByZXRlbnRpb24gZm9yIEdSUDENCiAgICAvLw0KICAgIGlmKCB1bElPUmV0R3JwRmxhZ3MgJiBQUkNNX0lPX1JFVF9HUlBfMSApDQogICAgew0KICAgICAgSFdSRUcoSElCM1AzX0JBU0UgICsgSElCM1AzX09fTUVNX0hJQl9SRUcwKSB8PSAoKDB4Mzw8NSkpOw0KICAgIH0NCg0KICAgIC8vDQogICAgLy8gRW5hYmxlIHJldGVudGlvbiBmb3IgR1JQMg0KICAgIC8vDQogICAgaWYoIHVsSU9SZXRHcnBGbGFncyAmIFBSQ01fSU9fUkVUX0dSUF8yICkNCiAgICB7DQogICAgICBIV1JFRyhISUIzUDNfQkFTRSAgKyBISUIzUDNfT19NRU1fSlRBR19DT05GKSB8PSAweDAwMDAwMTAxOw0KICAgIH0NCg0KICAgIC8vDQogICAgLy8gRW5hYmxlIHJldGVudGlvbiBmb3IgR1JQMw0KICAgIC8vDQogICAgaWYoIHVsSU9SZXRHcnBGbGFncyAmIFBSQ01fSU9fUkVUX0dSUF8zICkNCiAgICB7DQogICAgICBIV1JFRyhISUIzUDNfQkFTRSAgKyBISUIzUDNfT19NRU1fSlRBR19DT05GKSB8PSAweDAwMDAwMjA0Ow0KICAgIH0NCiAgfQ0KfQ0KDQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQovLw0KLy8hIERpc2FibGUgdGhlIElPIHZhbHVlIHJldGVudGlvbg0KLy8hDQovLyEgXHBhcmFtIHVsSU9SZXRHcnBGbGFncyBpcyBvbmUgb2YgdGhlIHZhbGlkIElPIGdyb3Vwcy4NCi8vIQ0KLy8hIFRoaXMgZnVuY3Rpb24gZGlzYWJsZSB0aGUgSU8gcmV0ZW50aW9uIGZvciBncm91cCBvZiBwaW5zIGFzIHNwZWNpZmllZCBieQ0KLy8hIFxlIHVsSU9SZXRHcnBGbGFncyBwYXJhbWV0ZXIuIERpc2FibGluZyByZXRlbnRpb24gd2lsbCB1bmxvY2sgdGhlDQovLyEgZGlnaXRhbCBwaW5zIGluIHRoZSBzcGVjaWZpZWQgZ3JvdXAuIE91dHB1dCBwaW5zIGNhbiBvbmx5IGJlIGRyaXZlbiB3aGVuDQovLyEgcmV0ZW50aW9uIGlzIGRpc2FibGVkLg0KLy8hDQovLyEgVGhlIHBhcmFtZXRlciBcZSB1bElPUmV0R3JwRmxhZ3MgY2FuIGJlIGxvZ2ljYWwgT1Igb2Ygb25lIG9yDQovLyEgbW9yZSBvZiB0aGUgZm9sbG93aW5nOg0KLy8hIC1cYiBQUkNNX0lPX1JFVF9HUlBfMCAtIEFsbCB0aGUgcGlucyBleGNlcHQgc0ZsYXNoIGFuZCBKVEFHIGludGVyZmFjZQ0KLy8hIC1cYiBQUkNNX0lPX1JFVF9HUlBfMSAtIHNGbGFzaCBpbnRlcmZhY2UgcGlucyAxMSwxMiwxMywxNA0KLy8hIC1cYiBQUkNNX0lPX1JFVF9HUlBfMiAtIEpUQUcgVERJIGFuZCBURE8gaW50ZXJmYWNlIHBpbnMgMTYsMTcNCi8vISAtXGIgUFJDTV9JT19SRVRfR1JQXzMgLSBKVEFHIFRDSyBhbmQgVE1TIGludGVyZmFjZSBwaW5zIDE5LDIwDQovLyENCi8vISBcbm90ZSBVc2UgY2FzZSBpcyB0byB1bi1wYXJrIHRoZSBwaW5zIHdoZW4gZXhpdGluZyBISUINCi8vIQ0KLy8hIFxyZXR1cm4gTm9uZS4NCi8vDQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQp2b2lkIFBSQ01JT1JldGVudGlvbkRpc2FibGUodW5zaWduZWQgbG9uZyB1bElPUmV0R3JwRmxhZ3MpDQp7DQogIC8vDQogIC8vIFN1cHBvcnRlZCBvbmx5IGluIEVTMi4wMCBhbmQgTGF0ZXIgZGV2aWNlcyBpLmUuIFJPTSBWZXJzaW9uIDIueC54IG9yIGdyZWF0ZXINCiAgLy8NCiAgaWYoIChIV1JFRygweDAwMDAwNDAwKSAmIDB4RkZGRikgPj0gMiApDQogIHsNCg0KICAgIC8vDQogICAgLy8gRW5hYmxlIElPIFBhZCB0byBPREkgUGF0aA0KICAgIC8vDQogICAgSFdSRUcoT0NQX1NIQVJFRF9CQVNFICsgT0NQX1NIQVJFRF9PX0dQSU9fUEFEX0NNTl9DT05GSUcpICY9IH4oMHgwMDAwMUYwMCk7DQoNCiAgICAvLw0KICAgIC8vIDBiJzEgaW4gYml0IDUgZm9yIEpUQUcgUEFEUw0KICAgIC8vIDBiJzEgaW4gYml0IDAgZm9yIGFsbCBvdGhlciBJT3MNCiAgICAvLw0KICAgIEhXUkVHKE9DUF9TSEFSRURfQkFTRSArIE9DUF9TSEFSRURfT19HUElPX1BBRF9DTU5fQ09ORklHKSB8PSAweDAwMDAwMDIzOw0KDQogICAgLy8NCiAgICAvLyBEaXNhYmxlIHJldGVudGlvbiBmb3IgR1JQMA0KICAgIC8vDQogICAgaWYoIHVsSU9SZXRHcnBGbGFncyAmIFBSQ01fSU9fUkVUX0dSUF8wICkNCiAgICB7DQogICAgICBIV1JFRyhISUIzUDNfQkFTRStISUIzUDNfT19NRU1fUEFEX09FTl9SRVQzM19DT05GKSAmPSB+MHg1Ow0KICAgIH0NCg0KICAgIC8vDQogICAgLy8gRGlzYWJsZSByZXRlbnRpb24gZm9yIEdSUDENCiAgICAvLw0KICAgIGlmKCB1bElPUmV0R3JwRmxhZ3MgJiBQUkNNX0lPX1JFVF9HUlBfMSApDQogICAgew0KICAgICAgSFdSRUcoSElCM1AzX0JBU0UgKyBISUIzUDNfT19NRU1fSElCX1JFRzApICY9IH4oKDB4Mzw8NSkpOw0KICAgIH0NCg0KICAgIC8vDQogICAgLy8gRGlzYWJsZSByZXRlbnRpb24gZm9yIEdSUDINCiAgICAvLw0KICAgIGlmKCB1bElPUmV0R3JwRmxhZ3MgJiBQUkNNX0lPX1JFVF9HUlBfMiApDQogICAgew0KICAgICAgSFdSRUcoSElCM1AzX0JBU0UgICsgSElCM1AzX09fTUVNX0pUQUdfQ09ORikgJj0gfjB4MDAwMDAxMDE7DQogICAgfQ0KDQogICAgLy8NCiAgICAvLyBEaXNhYmxlIHJldGVudGlvbiBmb3IgR1JQMw0KICAgIC8vDQogICAgaWYoIHVsSU9SZXRHcnBGbGFncyAmIFBSQ01fSU9fUkVUX0dSUF8zICkNCiAgICB7DQogICAgICBIV1JFRyhISUIzUDNfQkFTRSAgKyBISUIzUDNfT19NRU1fSlRBR19DT05GKSAmPSB+MHgwMDAwMDIwNDsNCiAgICB9DQoNCiAgfQ0KfQ0KDQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQovLw0KLy8hIEdldHMgdGhlIGRldmljZSB0eXBlDQovLyENCi8vISBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYml0LXBhY2tlZCB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGRldmljZSB0eXBlDQovLyENCi8vISBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgbG9naWNhbCBPUiBvZiBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nOi0NCi8vIQ0KLy8hIC1cYiBQUkNNX0RFVl9UWVBFX0ZMQUdfUiAgICAgICAgLSBSIHZhcmlhbnQNCi8vISAtXGIgUFJDTV9ERVZfVFlQRV9GTEFHX0YgICAgICAgIC0gRiB2YXJpYW50DQovLyEgLVxiIFBSQ01fREVWX1RZUEVfRkxBR19aICAgICAgICAtIFogdmFyaWFudA0KLy8hIC1cYiBQUkNNX0RFVl9UWVBFX0ZMQUdfU0VDVVJFICAgLSBEZXZpY2UgaXMgc2VjdXJlDQovLyEgLVxiIFBSQ01fREVWX1RZUEVfRkxBR19QUkVfUFJPRCAtIERldmljZSBpcyBhIHByZS1wcm9kdWN0aW9uIHBhcnQNCi8vISAtXGIgUFJDTV9ERVZfVFlQRV9GTEFHXzMyMDAgICAgIC0gRGV2aWNlIGlzIENDMzIwMA0KLy8hIC1cYiBQUkNNX0RFVl9UWVBFX0ZMQUdfMzIyMCAgICAgLSBEZXZpY2UgaXMgQ0MzMjIwDQovLyEgLVxiIFBSQ01fREVWX1RZUEVfRkxBR19SRVYxICAgICAtIERldmljZSBSZXYgMQ0KLy8hIC1cYiBQUkNNX0RFVl9UWVBFX0ZMQUdfUkVWMiAgICAgLSBEZXZpY2UgUmV2IDINCi8vIQ0KLy8hIFByZS1kZWZpbmVkIGhlbHBlciBtYWNyb3M6LQ0KLy8hDQovLyEgLVxiIFBSQ01fREVWX1RZUEVfUFJFX0NDMzIwMFIgICAtIFByZS1Qcm9kdWN0aW9uIENDMzIwMFINCi8vISAtXGIgUFJDTV9ERVZfVFlQRV9QUkVfQ0MzMjAwRiAgIC0gUHJlLVByb2R1Y3Rpb24gQ0MzMjAwRg0KLy8hIC1cYiBQUkNNX0RFVl9UWVBFX1BSRV9DQzMyMDBaICAgLSBQcmUtUHJvZHVjdGlvbiBDQzMyMDBaDQovLyEgLVxiIFBSQ01fREVWX1RZUEVfQ0MzMjAwUiAgICAgICAtIFByb2R1Y3Rpb24gQ0MzMjAwUg0KLy8hIC1cYiBQUkNNX0RFVl9UWVBFX1BSRV9DQzMyMjBSICAgLSBQcmUtUHJvZHVjdGlvbiBDQzMyMjBSDQovLyEgLVxiIFBSQ01fREVWX1RZUEVfUFJFX0NDMzIyMEYgICAtIFByZS1Qcm9kdWN0aW9uIENDMzIyMEYNCi8vISAtXGIgUFJDTV9ERVZfVFlQRV9QUkVfQ0MzMjIwWiAgIC0gUHJlLVByb2R1Y3Rpb24gQ0MzMjIwWg0KLy8hIC1cYiBQUkNNX0RFVl9UWVBFX0NDMzIyMFIgICAgICAgLSBQcm9kdWN0aW9uIENDMzIyMFINCi8vISAtXGIgUFJDTV9ERVZfVFlQRV9QUkVfQ0MzMjIwUlMgIC0gUHJlLVByb2R1Y3Rpb24gQ0MzMjIwUlMNCi8vISAtXGIgUFJDTV9ERVZfVFlQRV9QUkVfQ0MzMjIwRlMgIC0gUHJlLVByb2R1Y3Rpb24gQ0MzMjIwRlMNCi8vISAtXGIgUFJDTV9ERVZfVFlQRV9QUkVfQ0MzMjIwWlMgIC0gUHJlLVByb2R1Y3Rpb24gQ0MzMjIwWlMNCi8vISAtXGIgUFJDTV9ERVZfVFlQRV9DQzMyMjBSUyAgICAgIC0gUHJvZHVjdGlvbiBDQzMyMjBSUw0KLy8hIC1cYiBQUkNNX0RFVl9UWVBFX0NDMzIyMEZTICAgICAgLSBQcm9kdWN0aW9uIENDMzIyMEZTDQovLyENCi8vISBccmV0dXJuICBSZXR1cm5zLCBiaXQtcGFja2VkIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgZGV2aWNlIHR5cGUsDQovLyEgb3IgMCBpZiBkZXZpY2UgaXMgdW5rbm93bg0KLy8NCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCnVuc2lnbmVkIGxvbmcgUFJDTURldmljZVR5cGVHZXQoKQ0Kew0KICB1bnNpZ25lZCBsb25nIHVsRGV2VHlwZTsNCiAgdW5zaWduZWQgbG9uZyB1bENoaXBJZDsNCiAgdW5zaWduZWQgbG9uZyB1bERldk1ham9yVmVyOw0KICB1bnNpZ25lZCBsb25nIHVsRGV2TWlub3JWZXI7DQoNCiAgLy8NCiAgLy8gUmVhZCB0aGUgZGV2aWNlIGlkZW50aWZpY2F0aW9uIHJlZ2lzdGVyDQogIC8vDQogIHVsQ2hpcElkID0gSFdSRUcoR1BSQ01fQkFTRSArIEdQUkNNX09fR1BSQ01fRUZVU0VfUkVBRF9SRUcyKTsNCg0KICAvLw0KICAvLyBSZWFkIHRoZSBST00gbW9qb3IgYW5kIG1pbm9yIHZlcnNpb24NCiAgLy8NCiAgdWxEZXZNYWpvclZlciA9ICgodWxDaGlwSWQgPj4gMjgpICYgMHhGKTsNCiAgdWxEZXZNaW5vclZlciA9ICgodWxDaGlwSWQgPj4gMjQpICYgMHhGKTsNCg0KICANCiAgdWxDaGlwSWQgPSAoKEhXUkVHKEdQUkNNX0JBU0UgKyBHUFJDTV9PX0dQUkNNX0VGVVNFX1JFQURfUkVHMikgPj4gMTYpICYgMHgxRik7DQogICANCiAgLy8NCiAgLy8gR2V0IHRoZSBkZXZpY2UgdmFyaWFudCBmcm9tIHRoZSBjaGlwIGlkDQogIC8vDQogIHN3aXRjaCgodWxDaGlwSWQgJiAweEYpKQ0KICB7DQogICAgLy8NCiAgICAvLyBJdCBpcyBSIHZhcmlhbnQNCiAgICAvLw0KICAgIGNhc2UgMHgwOg0KICAgICAgdWxEZXZUeXBlID0gUFJDTV9ERVZfVFlQRV9GTEFHX1I7DQogICAgICBicmVhazsNCg0KICAgIC8vDQogICAgLy8gSXQgaXMgRiB2YXJpYW50LCBub24gc2VjdXJlIEYgdmFyaWFudCBpcyBhbHdheXMgUHJlLVByb2R1Y3Rpb24NCiAgICAvLw0KICAgIGNhc2UgMHgxOg0KICAgICAgdWxEZXZUeXBlID0gUFJDTV9ERVZfVFlQRV9GTEFHX0Z8UFJDTV9ERVZfVFlQRV9GTEFHX1BSRV9QUk9EOw0KICAgICAgYnJlYWs7DQoNCiAgICAvLw0KICAgIC8vIEl0IGlzIFogdmFyaWFudCBhbmQgaXMgYWx3YXlzIFByZS1Qcm9kdWN0aW9uDQogICAgLy8NCiAgICBjYXNlIDB4MzoNCiAgICAgIHVsRGV2VHlwZSA9IFBSQ01fREVWX1RZUEVfRkxBR19afFBSQ01fREVWX1RZUEVfRkxBR19QUkVfUFJPRDsNCiAgICAgIGJyZWFrOw0KDQogICAgLy8NCiAgICAvLyBJdCBpcyBTZWN1cmUgUg0KICAgIC8vDQogICAgY2FzZSAweDg6DQogICAgICB1bERldlR5cGUgPSBQUkNNX0RFVl9UWVBFX0ZMQUdfUnxQUkNNX0RFVl9UWVBFX0ZMQUdfU0VDVVJFOw0KICAgICAgYnJlYWs7DQoNCiAgICAvLw0KICAgIC8vIEl0IGlzIFNlY3VyZSBGDQogICAgLy8NCiAgICBjYXNlIDB4OToNCiAgICAgIHVsRGV2VHlwZSA9IFBSQ01fREVWX1RZUEVfRkxBR19GfFBSQ01fREVWX1RZUEVfRkxBR19TRUNVUkU7DQogICAgICBicmVhazsNCg0KICAgIC8vDQogICAgLy8gSXQgaXMgc2VjdXJlIFogdmFyaWFudCBhbmQgdmFyaWFudCBpcyBhbHdheXMgUHJlLVByb2R1Y3Rpb24NCiAgICAvLw0KICAgIGNhc2UgMHhCOg0KICAgICAgdWxEZXZUeXBlID0gUFJDTV9ERVZfVFlQRV9GTEFHX1p8UFJDTV9ERVZfVFlQRV9GTEFHX1NFQ1VSRXwNCiAgICAgICAgICAgICAgICAgIFBSQ01fREVWX1RZUEVfRkxBR19QUkVfUFJPRDsNCiAgICAgIGJyZWFrOw0KDQogICAgLy8NCiAgICAvLyBVbmRlZmluZWQgdmFyaWFudA0KICAgIC8vDQogICAgZGVmYXVsdDoNCiAgICAgIHVsRGV2VHlwZSA9IDB4MDsNCiAgfQ0KICANCiAgaWYoIHVsRGV2VHlwZSAhPSAwICkNCiAgew0KICAgIGlmKCB1bERldk1ham9yVmVyID09IDB4MyApDQogICAgew0KICAgICAgdWxEZXZUeXBlIHw9IFBSQ01fREVWX1RZUEVfRkxBR18zMjIwOw0KICAgIH0NCiAgICBlbHNlIGlmKCB1bERldk1ham9yVmVyID09IDB4MiApDQogICAgew0KICAgICAgdWxEZXZUeXBlICB8PSAoUFJDTV9ERVZfVFlQRV9GTEFHX1BSRV9QUk9EfFBSQ01fREVWX1RZUEVfRkxBR18zMjIwKTsNCiAgICAgIA0KICAgICAgaWYoICgodWxEZXZUeXBlICYgUFJDTV9ERVZfVFlQRV9GTEFHX1opICE9IDApICkNCiAgICAgIHsNCiAgICAgICAgaWYoKHVsRGV2TWlub3JWZXIgPT0gMHgwKSkNCiAgICAgICAgew0KICAgICAgICAgIHVsRGV2VHlwZSB8PSBQUkNNX0RFVl9UWVBFX0ZMQUdfUkVWMTsgDQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgdWxEZXZUeXBlIHw9IFBSQ01fREVWX1RZUEVfRkxBR19SRVYyOw0KICAgICAgICB9DQogICAgICB9DQogICAgICBlbHNlDQogICAgICB7DQogICAgICAgIGlmKCh1bERldk1pbm9yVmVyID09IDB4MSkpDQogICAgICAgIHsNCiAgICAgICAgICB1bERldlR5cGUgfD0gUFJDTV9ERVZfVFlQRV9GTEFHX1JFVjE7DQogICAgICAgIH0NCiAgICAgIH0gICAgIA0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgaWYoICh1bERldk1pbm9yVmVyID09IDB4NCkpDQogICAgICB7DQogICAgICAgIGlmKCAoKHVsRGV2VHlwZSAmIFBSQ01fREVWX1RZUEVfRkxBR19aKSAhPSAwKSkNCiAgICAgICAgew0KICAgICAgICAgIHVsRGV2VHlwZSB8PSAoUFJDTV9ERVZfVFlQRV9GTEFHX1BSRV9QUk9EfFBSQ01fREVWX1RZUEVfRkxBR18zMjIwKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICB1bERldlR5cGUgfD0gUFJDTV9ERVZfVFlQRV9GTEFHXzMyMDA7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIGVsc2UNCiAgICAgIHsNCiAgICAgICAgdWxEZXZUeXBlIHw9IChQUkNNX0RFVl9UWVBFX0ZMQUdfUFJFX1BST0R8UFJDTV9ERVZfVFlQRV9GTEFHXzMyMDApOw0KICAgICAgfQ0KICAgIH0JICANCiAgfQ0KIA0KDQogIHJldHVybiB1bERldlR5cGU7DQp9DQoNCg0KDQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi8vDQovLyEgVXNlZCB0byB0cmlnZ2VyIGEgaGliZXJuYXRlIGN5Y2xlIGZvciB0aGUgZGV2aWNlIHVzaW5nIFJUQw0KLy8hDQovLyEgVGhpcyBBUEkgY2FuIGJlIHVzZWQgdG8gZG8gYSBjbGVhbiByZWJvb3Qgb2YgZGV2aWNlLg0KLy8hDQovLyEgXG5vdGUgVGhpcyByb3V0aW5lIHNob3VsZCBvbmx5IGJlIGV4ZXJjaXNlZCBhZnRlciBhbGwgdGhlIG5ldHdvcmsgcHJvY2Vzc2luZw0KLy8hIGhhcyBiZWVuIHN0b3BwZWQuIFRvIHN0b3AgbmV0d29yayBwcm9jZXNzaW5nIHVzZSBcYiBzbF9zdG9wIEFQSSBmcm9tDQovLyEgc2ltcGxlbGluayBsaWJyYXJ5Lg0KLy8hDQovLyEgXHJldHVybiBOb25lDQovLw0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQp2b2lkIFBSQ01IaWJlcm5hdGVDeWNsZVRyaWdnZXIoKQ0Kew0KICB1bnNpZ25lZCBsb25nIHVsUmVnVmFsdWU7DQogIHVuc2lnbmVkIGxvbmcgbG9uZyB1bGxSVENWYWw7DQoNCiAgLy8NCiAgLy8gUmVhZCB0aGUgUlRDIHJlZ2lzdGVyDQogIC8vDQogIHVsUmVnVmFsdWUgPSBQUkNNSElCUmVnUmVhZChISUIzUDNfQkFTRStISUIzUDNfT19NRU1fSElCX1JUQ19XQUtFX0VOKTsNCg0KICAvLw0KICAvLyBFbmFibGUgdGhlIFJUQyBhcyB3YWtldXAgc291cmNlIGlmIHNwZWNpZmllZA0KICAvLw0KICB1bFJlZ1ZhbHVlIHw9IChQUkNNX0hJQl9TTE9XX0NMS19DVFIgJiAweDEpOw0KDQogIC8vDQogIC8vIEVuYWJsZSBISUIgd2FrZXVwIHNvdXJjZXMNCiAgLy8NCiAgUFJDTUhJQlJlZ1dyaXRlKEhJQjNQM19CQVNFK0hJQjNQM19PX01FTV9ISUJfUlRDX1dBS0VfRU4sdWxSZWdWYWx1ZSk7DQoNCiAgLy8NCiAgLy8gTGF0Y2ggdGhlIFJUQyB2bGF1ZQ0KICAvLw0KICBQUkNNSElCUmVnV3JpdGUoSElCM1AzX0JBU0UrSElCM1AzX09fTUVNX0hJQl9SVENfVElNRVJfUkVBRCAsMHgxKTsNCg0KICAvLw0KICAvLyBSZWFkIGxhdGNoZWQgdmFsdWVzIGFzIDIgMzItYml0IHZsYXVlcw0KICAvLw0KICB1bGxSVENWYWwgID0gUFJDTUhJQlJlZ1JlYWQoSElCM1AzX0JBU0UgKyBISUIzUDNfT19NRU1fSElCX1JUQ19USU1FUl9NU1cpOw0KICB1bGxSVENWYWwgID0gdWxsUlRDVmFsIDw8IDMyOw0KICB1bGxSVENWYWwgfD0gUFJDTUhJQlJlZ1JlYWQoSElCM1AzX0JBU0UrSElCM1AzX09fTUVNX0hJQl9SVENfVElNRVJfTFNXKTsNCg0KICAvLw0KICAvL0NvbnNpZGVyaW5nIHdvcnN0IGNhc2UgZXhlY3V0aW9uIHRpbWVzIG9mIFJPTSxSQU0sRmxhc2ggdmFsdWUgb2YgMTYwIGlzIHVzZWQNCiAgLy8NCiAgdWxsUlRDVmFsID0gdWxsUlRDVmFsICsgMTYwOw0KDQogIC8vDQogIC8vIFNldCBSVEMgbWF0Y2ggdmFsdWUNCiAgLy8NCiAgUFJDTUhJQlJlZ1dyaXRlKEhJQjNQM19CQVNFK0hJQjNQM19PX01FTV9ISUJfUlRDX1dBS0VfTFNXX0NPTkYsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSh1bGxSVENWYWwpKTsNCiAgUFJDTUhJQlJlZ1dyaXRlKEhJQjNQM19CQVNFK0hJQjNQM19PX01FTV9ISUJfUlRDX1dBS0VfTVNXX0NPTkYsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpKHVsbFJUQ1ZhbD4+MzIpKTsNCiAgLy8NCiAgLy8gTm90ZSA6IEFueSBhZGRpdGlvbiBvZiBjb2RlIGFmdGVyIHRoaXMgbGluZSB3b3VsZCBuZWVkIGEgY2hhbmdlIGluDQogIC8vIHVsbFRpY2tzIEludGVydmFsIGN1cnJlbnRseSBzZXQgdG8gMTYwDQogIC8vDQoNCiAgLy8NCiAgLy8gUmVxdWVzdCBoaWJlcm5hdGUuDQogIC8vDQogIFBSQ01ISUJSZWdXcml0ZSgoSElCM1AzX0JBU0UrSElCM1AzX09fTUVNX0hJQl9SRVEpLDB4MSk7DQoNCiAgLy8NCiAgLy8gV2FpdCBmb3Igc3lzdGVtIHRvIGVudGVyIGhpYmVybmF0ZQ0KICAvLw0KICBfX2FzbSgiICAgIHdmaVxuIik7DQoNCiAgLy8NCiAgLy8gSW5maW5pdGUgbG9vcA0KICAvLw0KICB3aGlsZSgxKQ0KICB7DQoNCiAgfQ0KfQ0KDQoNCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi8vDQovLyBDbG9zZSB0aGUgRG94eWdlbiBncm91cC4NCi8vISBAfQ0KLy8NCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCg==