LyogdXRpbC5jIC0gdmFyaW91cyB1dGlsaXR5IGZ1bmN0aW9ucw0KICoNCiAqIENvcHlyaWdodCAoQykgMjAwNS0yMDEwIEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4NCiAqDQogKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4NCiAqDQogKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZA0KICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcw0KICogYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4NCiAqDQogKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwNCiAqIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQNCiAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoNCiAqDQogKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdA0KICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUNCiAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQ0KICogICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4NCiAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlDQogKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuDQogKiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLg0KICovDQoNCiNpbmNsdWRlICJtb2R1bGUuaCINCiNpbmNsdWRlICJjb25uZWN0aW9uLmgiDQoNCmludCBweXNxbGl0ZV9zdGVwKHNxbGl0ZTNfc3RtdCogc3RhdGVtZW50LCBweXNxbGl0ZV9Db25uZWN0aW9uKiBjb25uZWN0aW9uKQ0Kew0KICAgIGludCByYzsNCg0KICAgIGlmIChzdGF0ZW1lbnQgPT0gTlVMTCkgew0KICAgICAgICAvKiB0aGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IgU1FMaXRlIDMuNSBhbmQgbGF0ZXIuIGl0IG5vdyBhcHBhcmVudGx5DQogICAgICAgICAqIHJldHVybnMgTlVMTCBmb3IgIm5vLW9wZXJhdGlvbiIgc3RhdGVtZW50cyAqLw0KICAgICAgICByYyA9IFNRTElURV9PSzsNCiAgICB9IGVsc2Ugew0KICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTDQogICAgICAgIHJjID0gc3FsaXRlM19zdGVwKHN0YXRlbWVudCk7DQogICAgICAgIFB5X0VORF9BTExPV19USFJFQURTDQogICAgfQ0KDQogICAgcmV0dXJuIHJjOw0KfQ0KDQovKioNCiAqIENoZWNrcyB0aGUgU1FMaXRlIGVycm9yIGNvZGUgYW5kIHNldHMgdGhlIGFwcHJvcHJpYXRlIERCLUFQSSBleGNlcHRpb24uDQogKiBSZXR1cm5zIHRoZSBlcnJvciBjb2RlICgwIG1lYW5zIG5vIGVycm9yIG9jY3VycmVkKS4NCiAqLw0KaW50IF9weXNxbGl0ZV9zZXRlcnJvcihzcWxpdGUzKiBkYiwgc3FsaXRlM19zdG10KiBzdCkNCnsNCiAgICBpbnQgZXJyb3Jjb2RlOw0KDQogICAgLyogU1FMaXRlIG9mdGVuIGRvZXNuJ3QgcmVwb3J0IGFueXRoaW5nIHVzZWZ1bCwgdW5sZXNzIHlvdSByZXNldCB0aGUgc3RhdGVtZW50IGZpcnN0ICovDQogICAgaWYgKHN0ICE9IE5VTEwpIHsNCiAgICAgICAgKHZvaWQpc3FsaXRlM19yZXNldChzdCk7DQogICAgfQ0KDQogICAgZXJyb3Jjb2RlID0gc3FsaXRlM19lcnJjb2RlKGRiKTsNCg0KICAgIHN3aXRjaCAoZXJyb3Jjb2RlKQ0KICAgIHsNCiAgICAgICAgY2FzZSBTUUxJVEVfT0s6DQogICAgICAgICAgICBQeUVycl9DbGVhcigpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgU1FMSVRFX0lOVEVSTkFMOg0KICAgICAgICBjYXNlIFNRTElURV9OT1RGT1VORDoNCiAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhweXNxbGl0ZV9JbnRlcm5hbEVycm9yLCBzcWxpdGUzX2Vycm1zZyhkYikpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgU1FMSVRFX05PTUVNOg0KICAgICAgICAgICAgKHZvaWQpUHlFcnJfTm9NZW1vcnkoKTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlIFNRTElURV9FUlJPUjoNCiAgICAgICAgY2FzZSBTUUxJVEVfUEVSTToNCiAgICAgICAgY2FzZSBTUUxJVEVfQUJPUlQ6DQogICAgICAgIGNhc2UgU1FMSVRFX0JVU1k6DQogICAgICAgIGNhc2UgU1FMSVRFX0xPQ0tFRDoNCiAgICAgICAgY2FzZSBTUUxJVEVfUkVBRE9OTFk6DQogICAgICAgIGNhc2UgU1FMSVRFX0lOVEVSUlVQVDoNCiAgICAgICAgY2FzZSBTUUxJVEVfSU9FUlI6DQogICAgICAgIGNhc2UgU1FMSVRFX0ZVTEw6DQogICAgICAgIGNhc2UgU1FMSVRFX0NBTlRPUEVOOg0KICAgICAgICBjYXNlIFNRTElURV9QUk9UT0NPTDoNCiAgICAgICAgY2FzZSBTUUxJVEVfRU1QVFk6DQogICAgICAgIGNhc2UgU1FMSVRFX1NDSEVNQToNCiAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhweXNxbGl0ZV9PcGVyYXRpb25hbEVycm9yLCBzcWxpdGUzX2Vycm1zZyhkYikpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgU1FMSVRFX0NPUlJVUFQ6DQogICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcocHlzcWxpdGVfRGF0YWJhc2VFcnJvciwgc3FsaXRlM19lcnJtc2coZGIpKTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlIFNRTElURV9UT09CSUc6DQogICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcocHlzcWxpdGVfRGF0YUVycm9yLCBzcWxpdGUzX2Vycm1zZyhkYikpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgU1FMSVRFX0NPTlNUUkFJTlQ6DQogICAgICAgIGNhc2UgU1FMSVRFX01JU01BVENIOg0KICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHB5c3FsaXRlX0ludGVncml0eUVycm9yLCBzcWxpdGUzX2Vycm1zZyhkYikpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgU1FMSVRFX01JU1VTRToNCiAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhweXNxbGl0ZV9Qcm9ncmFtbWluZ0Vycm9yLCBzcWxpdGUzX2Vycm1zZyhkYikpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcocHlzcWxpdGVfRGF0YWJhc2VFcnJvciwgc3FsaXRlM19lcnJtc2coZGIpKTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgIH0NCg0KICAgIHJldHVybiBlcnJvcmNvZGU7DQp9DQoNCg==