I3ByYWdtYSBvbmNlDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogQ29weXJpZ2h0IChDKSAyMDE2IGJ5IFNhdm9pci1mYWlyZSBMaW51eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiBBdXRob3I6IErkZ2VyIE5pY29sYXMgPG5pY29sYXMuamFnZXJAc2F2b2lyZmFpcmVsaW51eC5jb20+ICAgICAgICAgICAgICAqDQoqIEF1dGhvcjogVHJhY3p5ayBBbmRyZWFzIDx0cmFjenlrLmFuZHJlYXNAc2F2b2lyZmFpcmVsaW51eC5jb20+ICAgICAgICAgICoNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgICAqDQoqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAgICoNCiogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgICAgICAgKg0KKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgKg0KKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAqDQoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAgICoNCiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQoqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAgICoNCiogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAgKg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp1c2luZyBuYW1lc3BhY2UgUGxhdGZvcm07DQp1c2luZyBuYW1lc3BhY2UgV2luZG93czo6VUk6OlhhbWw6OkRhdGE7DQoNCi8qIHN0cmluZ3MgcmVxdWlyZWQgYnkgV2luZG93czo6RGF0YTo6SnNvbi4gRGVmaW5lZCBoZXJlIG9uIHB1cHJvc2UgKi8NClN0cmluZ14gY29udmVyc2F0aW9uS2V5ID0gImNvbnZlcnNhdGlvbiI7DQpTdHJpbmdeIG1lc3NhZ2VLZXkgICAgICA9ICJtZXNzYWdlIjsNClN0cmluZ14gZGF0ZUtleSAgICAgICAgID0gImRhdGUiOw0KU3RyaW5nXiBmcm9tQ29udGFjdEtleSAgPSAiZnJvbUNvbnRhY3QiOw0KU3RyaW5nXiBwYXlsb2FkS2V5ICAgICAgPSAicGF5bG9hZCI7DQoNCm5hbWVzcGFjZSBSaW5nQ2xpZW50VVdQDQp7DQpwdWJsaWMgcmVmIGNsYXNzIENvbnZlcnNhdGlvbk1lc3NhZ2Ugc2VhbGVkDQp7DQpwdWJsaWM6DQogICAgcHJvcGVydHkgU3RyaW5nXiBEYXRlOw0KICAgIHByb3BlcnR5IGJvb2wgRnJvbUNvbnRhY3Q7DQogICAgcHJvcGVydHkgU3RyaW5nXiBQYXlsb2FkOw0KDQogICAgLyogZnVuY3Rpb25zICovDQogICAgSnNvbk9iamVjdF4gVG9Kc29uT2JqZWN0KCk7DQp9Ow0KDQpwdWJsaWMgcmVmIGNsYXNzIENvbnZlcnNhdGlvbiBzZWFsZWQNCnsNCnByaXZhdGU6DQoNCg0KcHVibGljOg0KICAgIC8qIGZ1bmN0aW9ucyAqLw0KICAgIENvbnZlcnNhdGlvbigpOw0KICAgIHZvaWQgYWRkTWVzc2FnZShTdHJpbmdeIGRhdGUsIGJvb2wgZnJvbUNvbnRhY3QsIFN0cmluZ14gcGF5bG9hZCk7DQoNCmludGVybmFsOg0KICAgIC8qIHByb3BlcnRpZXMgKi8NCiAgICBwcm9wZXJ0eSBWZWN0b3I8Q29udmVyc2F0aW9uTWVzc2FnZV4+XiBfbWVzc2FnZXMNCiAgICB7DQogICAgICAgIFZlY3RvcjxDb252ZXJzYXRpb25NZXNzYWdlXj5eIGdldCgpDQogICAgICAgIHsNCiAgICAgICAgICAgIHJldHVybiBtZXNzYWdlc0xpc3RfOw0KICAgICAgICB9DQogICAgfQ0KDQpwcml2YXRlOg0KICAgIC8qIG1lbWJlcnMgKi8NCiAgICBWZWN0b3I8Q29udmVyc2F0aW9uTWVzc2FnZV4+XiBtZXNzYWdlc0xpc3RfOw0KDQp9Ow0KI2RlZmluZSBNU0dfRlJPTV9DT05UQUNUIHRydWUNCiNkZWZpbmUgTVNHX0ZST01fTUUgZmFsc2UNCn0NCg0K