LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogICAgICAgICBTQU0gU29mdHdhcmUgUGFja2FnZSBMaWNlbnNlDQogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKiBDb3B5cmlnaHQgKGMpIDIwMTMsIEF0bWVsIENvcnBvcmF0aW9uDQogKg0KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCiAqDQogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0Og0KICoNCiAqIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLA0KICogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBkaXNjbGFpbWVyIGJlbG93Lg0KICoNCiAqIEF0bWVsJ3MgbmFtZSBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCiAqDQogKiBESVNDTEFJTUVSOiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFUTUVMICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SDQogKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GDQogKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UIEFSRQ0KICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVRNRUwgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwNCiAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCiAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLA0KICogT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRg0KICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcNCiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwNCiAqIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKi8NCg0KLyoqIFxhZGR0b2dyb3VwIGFlc19tb2R1bGUgV29ya2luZyB3aXRoIEFFUw0KICogXGluZ3JvdXAgcGVyaXBoZXJhbHNfbW9kdWxlDQogKiBUaGUgQUVTIGRyaXZlciBwcm92aWRlcyB0aGUgaW50ZXJmYWNlIHRvIGNvbmZpZ3VyZSBhbmQgdXNlIHRoZSBBRVMgcGVyaXBoZXJhbC4NCiAqIFxuDQogKg0KICogVGhlIEFkdmFuY2VkIEVuY3J5cHRpb24gU3RhbmRhcmQgKEFFUykgc3BlY2lmaWVzIGEgRklQUy1hcHByb3ZlZCBjcnlwdG9ncmFwaGljIGFsZ29yaXRobQ0KICogdGhhdCBjYW4gYmUgdXNlZCB0byBwcm90ZWN0IGVsZWN0cm9uaWMgZGF0YS4gVGhlIEFFUyBhbGdvcml0aG0gaXMgYSBzeW1tZXRyaWMgYmxvY2sgDQogKiBjaXBoZXIgdGhhdCBjYW4gZW5jcnlwdCAoZW5jaXBoZXIpIGFuZCBkZWNyeXB0IChkZWNpcGhlcikgaW5mb3JtYXRpb24uDQogKiBFbmNyeXB0aW9uIGNvbnZlcnRzIGRhdGEgdG8gYW4gdW5pbnRlbGxpZ2libGUgZm9ybSBjYWxsZWQgY2lwaGVydGV4dC4gDQogKiBEZWNyeXB0aW5nIHRoZSBjaXBoZXJ0ZXh0IGNvbnZlcnRzIHRoZSBkYXRhIGJhY2sgaW50byBpdHMgb3JpZ2luYWwgZm9ybSwgDQogKiBjYWxsZWQgcGxhaW50ZXh0LiBUaGUgQ0lQSEVSIGJpdCBpbiB0aGUgQUVTIE1vZGUgUmVnaXN0ZXIgKEFFU19NUikgYWxsb3dzIHNlbGVjdGlvbiANCiAqIGJldHdlZW4gdGhlIGVuY3J5cHRpb24gYW5kIHRoZSBkZWNyeXB0aW9uIHByb2Nlc3Nlcy4gVGhlIEFFUyBpcyBjYXBhYmxlIG9mIHVzaW5nIGNyeXB0b2dyYXBoaWMgDQogKiBrZXlzIG9mIDEyOC8xOTIvMjU2IGJpdHMgdG8gZW5jcnlwdCBhbmQgZGVjcnlwdCBkYXRhIGluIGJsb2NrcyBvZiAxMjggYml0cy4gDQogKiBUaGlzIDEyOC1iaXQvMTkyLWJpdC8yNTYtYml0IGtleSBpcyBkZWZpbmVkIGluIHRoZSBLZXkgUmVnaXN0ZXJzIChBRVNfS0VZV1J4KSBhbmQgc2V0IGJ5IA0KICogQUVTX1dyaXRlS2V5KCkuIFRoZSBpbnB1dCB0byB0aGUgZW5jcnlwdGlvbiBwcm9jZXNzZXMgb2YgdGhlIENCQywgQ0ZCLCBhbmQgT0ZCIG1vZGVzIGluY2x1ZGVzLA0KICogaW4gYWRkaXRpb24gdG8gdGhlIHBsYWludGV4dCwgYSAxMjgtYml0IGRhdGEgYmxvY2sgY2FsbGVkIHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgKElWKSwgDQogKiB3aGljaCBtdXN0IGJlIHNldCB3aXRoIEFFU19TZXRWZWN0b3IoKS4gDQogKiBUaGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIGlzIHVzZWQgaW4gYW4gaW5pdGlhbCBzdGVwIGluIHRoZSBlbmNyeXB0aW9uIG9mIGEgbWVzc2FnZSBhbmQgDQogKiBpbiB0aGUgY29ycmVzcG9uZGluZyBkZWNyeXB0aW9uIG9mIHRoZSBtZXNzYWdlLiBUaGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yIFJlZ2lzdGVycyBhcmUgDQogKiBhbHNvIHVzZWQgYnkgdGhlIENUUiBtb2RlIHRvIHNldCB0aGUgY291bnRlciB2YWx1ZS4NCiAqDQogKiBUbyBFbmFibGUgYSBBRVMgZW5jcnlwdGlvbiBhbmQgZGVjcnlwdGlvbix0aGUgdXNlciBoYXMgdG8gZm9sbG93IHRoZXNlIGZldyBzdGVwczoNCiAqIDx1bD4NCiAqIDxsaT4gQSBzb2Z0d2FyZSB0cmlnZ2VyZWQgaGFyZHdhcmUgcmVzZXQgb2YgdGhlIEFFUyBpbnRlcmZhY2UgaXMgcGVyZm9ybWVkIGJ5IEFFU19Tb2Z0UmVzZXQoKS48L2xpPg0KICogPGxpPiBDb25maWd1cmUgQUVTIGFsZ29yaXRobSBtb2RlLCBrZXkgbW9kZSwgc3RhcnQgbW9kZSBhbmQgb3BlcmF0aW9uIG1vZGUgYnkgQUVTX0NvbmZpZ3VyZSgpLiA8L2xpPg0KICogPGxpPiBJbnB1dCBBRVMgZGF0YSBmb3IgZW5jcnlwdGlvbiBhbmQgZGVjcnlwdGlvbiB3aXRoIGZ1bmN0aW9uIEFFU19TZXRJbnB1dCgpIDwvbGk+DQogKiA8bGk+IFNldCBBRVMga2V5IHdpdGggZnVuY3Rpb24gQUVTX1dyaXRlS2V5KCkuIDwvbGk+DQogKiA8bGk+IFRvIHN0YXJ0IHRoZSBlbmNyeXB0aW9uIG9yIHRoZSBkZWNyeXB0aW9uIHByb2Nlc3Mgd2l0aCBBRVNfU3RhcnQoKTwvbGk+DQogKiA8bGk+IFRvIGdldCB0aGUgZW5jcnlwdGlvbiBvciBkZWNyeXB0aW9uIHJlc3VsdCBieSBBRVNfR2V0T3V0cHV0KCkgPC9saT4NCiAqIDwvdWw+DQogKg0KICoNCiAqIEZvciBtb3JlIGFjY3VyYXRlIGluZm9ybWF0aW9uLCBwbGVhc2UgbG9vayBhdCB0aGUgQUVTIHNlY3Rpb24gb2YgdGhlDQogKiBEYXRhc2hlZXQuDQogKg0KICogUmVsYXRlZCBmaWxlcyA6XG4NCiAqIFxyZWYgYWVzLmNcbg0KICogXHJlZiBhZXMuaFxuDQogKi8NCi8qQHsqLw0KLypAfSovDQoNCg0KLyoqDQogKiBcZmlsZQ0KICoNCiAqIEltcGxlbWVudGF0aW9uIG9mIEFkdmFuY2VkIEVuY3J5cHRpb24gU3RhbmRhcmQgKEFFUykNCiAqDQogKi8NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKiAgICAgICAgSGVhZGVycw0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KI2luY2x1ZGUgImNoaXAuaCINCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKiAgICAgICAgRXhwb3J0ZWQgZnVuY3Rpb25zDQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKioNCiAqIFxicmllZiBTdGFydHMgTWFudWFsIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBwcm9jZXNzLg0KICovDQp2b2lkIEFFU19TdGFydCh2b2lkKQ0Kew0KICAgIEFFUy0+QUVTX0NSID0gQUVTX0NSX1NUQVJUOw0KfQ0KDQovKioNCiAqIFxicmllZiBSZXNldHMgdGhlIEFFUy4gQSBzb2Z0d2FyZSB0cmlnZ2VyZWQgaGFyZHdhcmUgcmVzZXQgb2YgdGhlIEFFUyBpbnRlcmZhY2UgaXMgcGVyZm9ybWVkLg0KICovDQp2b2lkIEFFU19Tb2Z0UmVzZXQodm9pZCkNCnsNCiAgICBBRVMtPkFFU19DUiA9IEFFU19DUl9TV1JTVDsNCn0NCg0KDQovKioNCiAqIFxicmllZiBDb25maWd1cmVzIGFuIEFFUyBwZXJpcGhlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLg0KICogIFxwYXJhbSBtb2RlICBEZXNpcmVkIHZhbHVlIGZvciB0aGUgQUVTIG1vZGUgcmVnaXN0ZXIgKHNlZSB0aGUgZGF0YXNoZWV0KS4NCiAqLw0Kdm9pZCBBRVNfQ29uZmlndXJlKHVpbnQzMl90IG1vZGUpDQp7DQogICAgQUVTLT5BRVNfTVIgPSBtb2RlOyANCn0NCg0KLyoqDQogKiBcYnJpZWYgRW5hYmxlcyB0aGUgc2VsZWN0ZWQgaW50ZXJydXB0cyBzb3VyY2VzIG9uIGEgQUVTIHBlcmlwaGVyYWwuDQogKiBccGFyYW0gc291cmNlcyAgQml0d2lzZSBPUiBvZiBzZWxlY3RlZCBpbnRlcnJ1cHQgc291cmNlcy4NCiAqLw0Kdm9pZCBBRVNfRW5hYmxlSXQodWludDMyX3Qgc291cmNlcykNCnsNCiAgICBBRVMtPkFFU19JRVIgPSBzb3VyY2VzOw0KfQ0KDQovKioNCiAqIFxicmllZiBEaXNhYmxlcyB0aGUgc2VsZWN0ZWQgaW50ZXJydXB0cyBzb3VyY2VzIG9uIGEgQUVTIHBlcmlwaGVyYWwuDQogKiBccGFyYW0gc291cmNlcyAgQml0d2lzZSBPUiBvZiBzZWxlY3RlZCBpbnRlcnJ1cHQgc291cmNlcy4NCiAqLw0Kdm9pZCBBRVNfRGlzYWJsZUl0KHVpbnQzMl90IHNvdXJjZXMpDQp7DQogICAgQUVTLT5BRVNfSURSID0gc291cmNlczsNCn0NCg0KLyoqDQogKiBcYnJpZWYgR2V0IHRoZSBjdXJyZW50IHN0YXR1cyByZWdpc3RlciBvZiB0aGUgZ2l2ZW4gQUVTIHBlcmlwaGVyYWwuDQogKiBccmV0dXJuICBBRVMgc3RhdHVzIHJlZ2lzdGVyLg0KICovDQp1aW50MzJfdCBBRVNfR2V0U3RhdHVzKHZvaWQpDQp7DQogICAgcmV0dXJuIEFFUy0+QUVTX0lTUjsNCn0NCg0KLyoqDQogKiBcYnJpZWYgU2V0IHRoZSAxMjgtYml0LzE5Mi1iaXQvMjU2LWJpdCBjcnlwdG9ncmFwaGljIGtleSB1c2VkIGZvciBlbmNyeXB0aW9uL2RlY3J5cHRpb24uDQogKiBccGFyYW0gcEtleSBQb2ludGVyIHRvIGEgMTYvMjQvMzIgYnl0ZXMgY2lwaGVyIGtleS4NCiAqIFxwYXJhbSBrZXlMZW5ndGggbGVuZ3RoIG9mIGtleQ0KICovDQp2b2lkIEFFU19Xcml0ZUtleShjb25zdCB1aW50MzJfdCAqcEtleSwgdWludDMyX3Qga2V5TGVuZ3RoKQ0Kew0KICAgIEFFUy0+QUVTX0tFWVdSWzBdID0gcEtleVswXTsNCiAgICBBRVMtPkFFU19LRVlXUlsxXSA9IHBLZXlbMV07DQogICAgQUVTLT5BRVNfS0VZV1JbMl0gPSBwS2V5WzJdOw0KICAgIEFFUy0+QUVTX0tFWVdSWzNdID0gcEtleVszXTsNCg0KICAgIGlmKCBrZXlMZW5ndGggPj0gMjQgKSB7DQogICAgICAgIEFFUy0+QUVTX0tFWVdSWzRdID0gcEtleVs0XTsNCiAgICAgICAgQUVTLT5BRVNfS0VZV1JbNV0gPSBwS2V5WzVdOw0KICAgIH0NCiAgICBpZigga2V5TGVuZ3RoID09IDMyICkgew0KICAgICAgICBBRVMtPkFFU19LRVlXUls2XSA9IHBLZXlbNl07DQogICAgICAgIEFFUy0+QUVTX0tFWVdSWzddID0gcEtleVs3XTsNCiAgICB9DQp9DQoNCi8qKg0KICogXGJyaWVmIFNldCB0aGUgZm9yIDMyLWJpdCBpbnB1dCBEYXRhIGFsbG93IHRvIHNldCB0aGUgMTI4LWJpdCBkYXRhIGJsb2NrIHVzZWQgZm9yIGVuY3J5cHRpb24vZGVjcnlwdGlvbi4NCiAqIFxwYXJhbSBkYXRhIFBvaW50ZXIgdG8gdGhlIDE2LWJ5dGVzIGRhdGEgdG8gY2lwaGVyL2RlY2lwaGVyLg0KICovDQp2b2lkIEFFU19TZXRJbnB1dCh1aW50MzJfdCAqZGF0YSkNCnsNCiAgICB1aW50OF90IGk7DQogICAgZm9yIChpID0gMDsgaTwgNDsgaSsrKQ0KICAgICAgICBBRVMtPkFFU19JREFUQVJbaV0gPSBkYXRhW2ldOw0KfQ0KDQovKioNCiAqIFxicmllZiBHZXQgdGhlIGZvdXIgMzItYml0IGRhdGEgY29udGFpbiB0aGUgMTI4LWJpdCBkYXRhIGJsb2NrIHdoaWNoIGhhcyBiZWVuIGVuY3J5cHRlZC9kZWNyeXB0ZWQuDQogKiBccGFyYW0gZGF0YSBwb2ludGVyIHRvIHRoZSB3b3JkIHRoYXQgaGFzIGJlZW4gZW5jcnlwdGVkL2RlY3J5cHRlZC4uDQogKi8NCnZvaWQgQUVTX0dldE91dHB1dCh1aW50MzJfdCAqZGF0YSkNCnsNCiAgICB1aW50OF90IGk7DQogICAgZm9yIChpID0gMDsgaTwgNDsgaSsrKSANCiAgICAgICAgZGF0YVtpXSA9IEFFUy0+QUVTX09EQVRBUltpXTsNCn0NCg0KLyoqDQogKiBcYnJpZWYgU2V0IGZvdXIgNjQtYml0IGluaXRpYWxpemF0aW9uIHZlY3RvciBkYXRhIGJsb2NrLCB3aGljaCBpcyB1c2VkIGJ5IHNvbWUNCiAqIG1vZGVzIG9mIG9wZXJhdGlvbiBhcyBhbiBhZGRpdGlvbmFsIGluaXRpYWwgaW5wdXQuDQogKiBccGFyYW0gcFZlY3RvciBwb2ludCB0byB0aGUgd29yZCBvZiB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yLg0KICovDQp2b2lkIEFFU19TZXRWZWN0b3IoY29uc3QgdWludDMyX3QgKnBWZWN0b3IpDQp7DQogICAgQUVTLT5BRVNfSVZSWzBdID0gcFZlY3RvclswXTsNCiAgICBBRVMtPkFFU19JVlJbMV0gPSBwVmVjdG9yWzFdOw0KICAgIEFFUy0+QUVTX0lWUlsyXSA9IHBWZWN0b3JbMl07DQogICAgQUVTLT5BRVNfSVZSWzNdID0gcFZlY3RvclszXTsNCn0NCg0KDQovKioNCiAqIFxicmllZiBTZXQgTGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBBQUQgZGF0YSB0aGF0IGlzIHRvIGJlIHByb2Nlc3NlZC4NCiAqIFxwYXJhbSBsZW4gTGVuZ3RoLg0KICovDQp2b2lkIEFFU19TZXRBYWRMZW4odWludDMyX3QgbGVuKQ0Kew0KICAgIEFFUy0+QUVTX0FBRExFTlIgPSBsZW47DQp9DQoNCi8qKg0KICogXGJyaWVmIFNldCBMZW5ndGggaW4gYnl0ZXMgb2YgdGhlIExlbmd0aCBpbiBieXRlcyBvZiB0aGUgDQogKiBwbGFpbnRleHQvY2lwaGVydGV4dCAoQykgZGF0YSB0aGF0IGlzIHRvIGJlIHByb2Nlc3NlZC4uDQogKiBccGFyYW0gbGVuIExlbmd0aC4NCiAqLw0Kdm9pZCBBRVNfU2V0RGF0YUxlbih1aW50MzJfdCBsZW4pDQp7DQogICAgQUVTLT5BRVNfQ0xFTlIgPSBsZW47DQp9DQoNCi8qKg0KICogXGJyaWVmIFNldCBUaGUgZm91ciAzMi1iaXQgSGFzaCBXb3JkIHJlZ2lzdGVycyBleHBvc2UgdGhlIGludGVybWVkaWF0ZSBHSEFTSCB2YWx1ZS4gDQogKiBNYXkgYmUgcmVhZCB0byBzYXZlIHRoZSBjdXJyZW50IEdIQVNIIHZhbHVlIHNvIHByb2Nlc3NpbmcgY2FuIGxhdGVyIGJlIHJlc3VtZWQsIA0KICogcHJlc3VtYWJseSBvbiBhIGxhdGVyIG1lc3NhZ2UgZnJhZ21lbnQuIG1vZGVzIG9mIG9wZXJhdGlvbiBhcyBhbiBhZGRpdGlvbmFsIGluaXRpYWwgaW5wdXQuDQogKiBccGFyYW0gaGFzaCBwb2ludCB0byB0aGUgd29yZCBvZiB0aGUgaGFzaC4NCiAqLw0Kdm9pZCBBRVNfU2V0R2NtSGFzaCh1aW50MzJfdCAqIGhhc2gpDQp7DQogICAgdWludDhfdCBpOw0KICAgIGZvciAoaSA9IDA7IGk8IDQ7IGkrKykgDQogICAgICAgIEFFUy0+QUVTX0dIQVNIUltpXSA9IGhhc2hbaV07DQp9DQoNCg0KLyoqDQogKiBcYnJpZWYgR2V0IFRoZSBmb3VyIDMyLWJpdCBUYWcgd2hpY2ggY29udGFpbiB0aGUgZmluYWwgMTI4LWJpdCBHQ00gQXV0aGVudGljYXRpb24gdGFnIA0KICogobBUobEgd2hlbiBHQ00gcHJvY2Vzc2luZyBpcyBjb21wbGV0ZS4NCiAqIFxwYXJhbSB0YWcgcG9pbnQgdG8gdGhlIHdvcmQgb2YgdGhlIHRhZy4NCiAqLw0Kdm9pZCBBRVNfR2V0R2NtVGFnKHVpbnQzMl90ICogdGFnKQ0Kew0KICAgIHVpbnQ4X3QgaTsNCiAgICBmb3IgKGkgPSAwOyBpPCA0OyBpKyspIA0KICAgICAgICB0YWdbaV0gPSBBRVMtPkFFU19UQUdSW2ldIDsNCn0NCg0KLyoqDQogKiBcYnJpZWYgUmVwb3J0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgMzItYml0IEdDTSBjb3VudGVyDQogKiBccGFyYW0gY291bnRlciBQb2ludCB0byB2YWx1ZSBvZiBHQ00gY291bnRlci4NCiAqLw0Kdm9pZCBBRVNfR2V0R2NtQ291bnRlcih1aW50MzJfdCAqIGNvdW50ZXIpDQp7DQogICAgKmNvdW50ZXIgPSBBRVMtPkFFU19DVFJSOw0KfQ0KDQoNCi8qKg0KICogXGJyaWVmIEdldCB0aGUgZm91ciAzMi1iaXQgZGF0YSBjb250YWluIHRoZSAxMjgtYml0IEggdmFsdWUgY29tcHV0ZWQgZnJvbSB0aGUgS0VZVyB2YWx1ZQ0KICogXHBhcmFtIGRhdGEgcG9pbnQgdG8gdGhlIHdvcmQgdGhhdCBoYXMgYmVlbiBlbmNyeXB0ZWQvZGVjcnlwdGVkLi4NCiAqLw0Kdm9pZCBBRVNfR2V0R2NtSCh1aW50MzJfdCAqaCkNCnsNCiAgICB1aW50OF90IGk7DQogICAgZm9yIChpID0gMDsgaTwgNDsgaSsrKSANCiAgICAgICAgaFtpXSA9IEFFUy0+QUVTX0dDTUhSW2ldOw0KfQ0KDQoNCg==