cGFja2FnZSBvcGVubmxwLnRvb2xzLnBhcnNlX3RoaWNrZXQubWF0Y2hpbmc7DQoNCmltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KDQppbXBvcnQgb3Blbm5scC50b29scy5wYXJzZV90aGlja2V0LlBhcnNlVGhpY2tldDsNCmltcG9ydCBvcGVubmxwLnRvb2xzLnBhcnNlX3RoaWNrZXQuV29yZFdvcmRJbnRlclNlbnRlbmNlUmVsYXRpb25BcmM7DQppbXBvcnQgb3Blbm5scC50b29scy50ZXh0c2ltaWxhcml0eS5QYXJzZVRyZWVDaHVuazsNCmltcG9ydCBvcGVubmxwLnRvb2xzLnRleHRzaW1pbGFyaXR5LlNlbnRlbmNlUGFpck1hdGNoUmVzdWx0Ow0KaW1wb3J0IG9wZW5ubHAudG9vbHMudGV4dHNpbWlsYXJpdHkuY2h1bmtlcjJtYXRjaGVyLlBhcnNlckNodW5rZXIyTWF0Y2hlclByb2Nlc3NvcjsNCmltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQoNCnB1YmxpYyBjbGFzcyBQYWlyd2lzZU1hdGNoZXJUZXN0IGV4dGVuZHMgVGVzdENhc2Ugew0KCXB1YmxpYyB2b2lkIHRlc3RNYXRjaFR3b1BhcmFUZXN0UmVkdWNlZCgpew0KCQlTdHJpbmcgcSA9ICJJIGFtIGEgVVMgY2l0aXplbiBsaXZpbmcgYWJyb2FkLCBhbmQgY29uY2VybmVkIGFib3V0IHRoZSBoZWFsdGggcmVmb3JtIHJlZ3VsYXRpb24gb2YgMjAxNC4gSSBkbyBub3Qgd2FudCB0byB3YWl0IHRpbGwgSSBhbSBzaWNrIHRvIGJ1eSBoZWFsdGggaW5zdXJhbmNlLiBJIGFtIGFmcmFpZCBJIHdpbGwgZW5kIHVwIHBheWluZyB0aGUgdGF4LiI7DQoJCVN0cmluZyBhID0gIlBlb3BsZSBhcmUgd29ycmllZCBhYm91dCBoYXZpbmcgdG8gcGF5IGEgZmluZSBmb3Igbm90IGNhcnJ5aW5nIGhlYWx0aCBpbnN1cmFuY2UgY292ZXJhZ2UgZ290IG1vcmUgZ3VpZGFuY2UgdGhpcyB3ZWVrIHdpdGggc29tZSBuZXcgZmVkZXJhbCByZWd1bGF0aW9ucy4gIisNCgkJCQkiSGFyZGx5IGFueW9uZSB3aWxsIGVuZCB1cCBwYXlpbmcgdGhlIHRheCB3aGVuIHRoZSBoZWFsdGggcmVmb3JtIGxhdyB0YWtlcyBmdWxsIGVmZmVjdCBpbiAyMDE0LiAiKw0KCQkJCSJUaGUgaW5kaXZpZHVhbCBtYW5kYXRlIG1ha2VzIHN1cmUgdGhhdCBwZW9wbGUgZG9uknQgd2FpdCB1bnRpbCB0aGV5IGFyZSBzaWNrIHRvIGJ1eSBoZWFsdGggaW5zdXJhbmNlLiAiKw0KCQkJCSJQZW9wbGUgYXJlIGV4ZW1wdCBmcm9tIGhlYWx0aCBpbnN1cmFuY2UgZmluZSBpZiB0aGV5IG1ha2UgdG9vIGxpdHRsZSBtb25leSB0byBmaWxlIGFuIGluY29tZSB0YXggcmV0dXJuLCBvciBVUyBjaXRpemVucyBsaXZpbmcgYWJyb2FkLiI7IA0KCQlQYXJzZXJDaHVua2VyMk1hdGNoZXJQcm9jZXNzb3Igc20gPSBQYXJzZXJDaHVua2VyMk1hdGNoZXJQcm9jZXNzb3IuZ2V0SW5zdGFuY2UoKTsNCgkJU2VudGVuY2VQYWlyTWF0Y2hSZXN1bHQgcmVzMSA9IHNtLmFzc2Vzc1JlbGV2YW5jZShhLCBxKTsNCgkJU3lzdGVtLm91dC5wcmludChyZXMxLmdldE1hdGNoUmVzdWx0KCkpOw0KCQlTeXN0ZW0ub3V0LnByaW50KHJlczEpOw0KCQlhc3NlcnRUcnVlKHJlczEhPW51bGwpOw0KCQlhc3NlcnRUcnVlKHJlczEuZ2V0TWF0Y2hSZXN1bHQoKS5zaXplKCk+MCk7DQoJDQoJfQ0KDQoJDQoNCn0NCg0KDQo=