ZGlmZiAtLWdpdCBhL3BsdWdpbnMvcmVxL29yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEuZ2RwcmFuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3BkcDRlbmcvcmVxL2dkcHJhbmFuYWx5c2lzL2ludGVybmFsL0Fic3RyYWN0TGF3ZnVsUmVxdWlyZW1lbnRCeUNyZWF0ZUNvbW1hbmQuamF2YSBiL3BsdWdpbnMvcmVxL29yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEuZ2RwcmFuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3BkcDRlbmcvcmVxL2dkcHJhbmFuYWx5c2lzL2ludGVybmFsL0Fic3RyYWN0TGF3ZnVsUmVxdWlyZW1lbnRCeUNyZWF0ZUNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjQ2M2IwCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9yZXEvb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5nZHByYW5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcGRwNGVuZy9yZXEvZ2RwcmFuYW5hbHlzaXMvaW50ZXJuYWwvQWJzdHJhY3RMYXdmdWxSZXF1aXJlbWVudEJ5Q3JlYXRlQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsMTcxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykyMDIwIENFQSBMSVNULCBDb21taXR0ZXIgTmFtZSwgYW5kIG90aGVycy4gCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLworICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICogQ29udHJpYnV0b3JzOgorICogQ0VBIExJU1QgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqIFBhdHJpY2sgVGVzc2llciAoQ0VBIExJU1QpIFBhdHJpY2sudGVzc2llckBjZWEuZnIgCisgKiBHYWJyaWVsIFBlZHJvemEgKENFQSBMSVNUKSBnYWJyaWVsLnBlZHJvemFAY2VhLmZyIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5wZHA0ZW5nLnJlcS5nZHByYW5hbmFseXNpcy5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5UcmVlSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5jb21tb24ucHJvZmlsZS5wZHA0ZW5nQ29tbW9uR0RQUi5EYXRhU3ViamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcuY29tbW9uLnByb2ZpbGUucGRwNGVuZ0NvbW1vbkdEUFIuUGVyc29uYWxEYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEubWV0YXJlcS5HRFBSUmVxdWlyZW1lbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5MYXdmdWw7CitpbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLlBlcnNvbmFsRGF0YVJlcXVpcmVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5Qcm9jZXNzUmVxdWlyZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLnBkcDRlbmdSZXFHRFBSUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnN5c21sMTQucmVxdWlyZW1lbnRzLlJlcXVpcmVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLnV0aWwuVU1MVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC51dGlsLlVNTFV0aWwuU3RlcmVvdHlwZUFwcGxpY2F0aW9uSGVscGVyOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RMYXdmdWxSZXF1aXJlbWVudEJ5Q3JlYXRlQ29tbWFuZCBleHRlbmRzIEJhc2ljR0RQUlJlcXVpcmVtZW50Q3JlYXRlQ29tbWFuZCB7CisKKwlwcml2YXRlIERhdGFTdWJqZWN0IGRhdGFTdWJqZWN0OworCXB1YmxpYyBBYnN0cmFjdExhd2Z1bFJlcXVpcmVtZW50QnlDcmVhdGVDb21tYW5kKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwgRWxlbWVudCBvd25lciwgU3RyaW5nIGlkLCBTdHJpbmcgdGV4dCxQcm9jZXNzUmVxdWlyZW1lbnQgcHJvY2Vzc1JlcXVpcmVtZW50LCBEYXRhU3ViamVjdCBkYXRhU3ViamVjdCkgeworCQlzdXBlcihkb21haW4sIG93bmVyLCBpZCwgdGV4dCxwcm9jZXNzUmVxdWlyZW1lbnQpOworCQl0aGlzLmRhdGFTdWJqZWN0PSBkYXRhU3ViamVjdDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVSZXF1aXJlbWVudChQYWNrYWdlIG93bmVyLCBTdHJpbmcgaWQsIFN0cmluZyB0ZXh0KSB7CisJCVN0ZXJlb3R5cGVBcHBsaWNhdGlvbkhlbHBlciBzdGVyZW90eXBlQXBwbGljYXRpb25IZWxwZXIgPSBTdGVyZW90eXBlQXBwbGljYXRpb25IZWxwZXIuZ2V0SW5zdGFuY2UobnVsbCk7CisJCUdEUFJSZXF1aXJlbWVudHMgZ2RwclJyZXF1aWVtZW50PSBuZXcgR0RQUlJlcXVpcmVtZW50cygpOworCisJCUNsYXNzIGxhd2Z1bGxSZXEgPW51bGw7CisJCS8vMS4gbG9vayBmb3IgTGF3ZnVsUmVxdWlyZW1lbnQKKwkJbGF3ZnVsbFJlcSA9IGxvb2tGb3JMYXdGdWxsUmVxdWlyZW1lbnQob3duZXIsIGxhd2Z1bGxSZXEpOworCisKKwkJLy8yLiBjcmVhdGUgdGhlIHN1YiByZXF1aXJlbWVudAorCQlPYmplY3QgbGF3ZnVsT2JqZWN0ID1nZXRMYXdmdWxPYmplY3QocHJvY2Vzc1JlcXVpcmVtZW50KTsKKwkJaWYoIGxhd2Z1bE9iamVjdCE9bnVsbCkgeworCisJCQkvLzEuMSBjcmVhdGUgdGhlIGNsYXNzCisJCQlDbGFzcyByZXF1aXJlbWVudENsYXNzID1VTUxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzcygpOworCisJCQkvLzIuMSBzZXQgdGhlIG93bmVyCisJCQlzZXRUaGVPd25lcihvd25lciwgbGF3ZnVsbFJlcSwgcmVxdWlyZW1lbnRDbGFzcyk7CisJCQkvLzMuIGFwcGx5IHRoZSBzdGVyZW90eXBlCisJCQlzdGVyZW90eXBlQXBwbGljYXRpb25IZWxwZXIuYXBwbHlTdGVyZW90eXBlKHJlcXVpcmVtZW50Q2xhc3Msb3JnLmVjbGlwc2UucGFweXJ1cy5zeXNtbDE0LnJlcXVpcmVtZW50cy5SZXF1aXJlbWVudHNQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXF1aXJlbWVudCgpLG51bGwgKTsKKwkJCVJlcXVpcmVtZW50IHJlcVN0ZXJlb3R5cGU9IChSZXF1aXJlbWVudClVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbihyZXF1aXJlbWVudENsYXNzLCBSZXF1aXJlbWVudC5jbGFzcyk7CisKKwkJCW9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5MYXdmdWwgbGF3ZnVsICA9IGFwcGx5U3RlcmVvdHlwZShzdGVyZW90eXBlQXBwbGljYXRpb25IZWxwZXIsIHJlcXVpcmVtZW50Q2xhc3MpOworCisJCQkvLzQuIHNldCBhdHRyaWJ1dGUgb2YgdGhlIGFwcGxpZWQgc3RlcmVvdHlwZQorCQkJc2V0QXR0cmlidXRlQXBwbGllZFN0ZXJlb3R5cGUoZ2RwclJyZXF1aWVtZW50LCBsYXdmdWxPYmplY3QsIHJlcVN0ZXJlb3R5cGUsIGxhd2Z1bCk7CisJCQkvLzUuc2V0IHRoZSBJRAorCQkJc2V0VGhlSUQoaWQsIGxhd2Z1bGxSZXEsIHJlcXVpcmVtZW50Q2xhc3MsIHJlcVN0ZXJlb3R5cGUpOworCQl9CisJfQorCisJcHJvdGVjdGVkIGFic3RyYWN0IExhd2Z1bCBhcHBseVN0ZXJlb3R5cGUoU3RlcmVvdHlwZUFwcGxpY2F0aW9uSGVscGVyIHN0ZXJlb3R5cGVBcHBsaWNhdGlvbkhlbHBlciwgQ2xhc3MgcmVxdWlyZW1lbnRDbGFzcyk7CisKKwkvKipnZXQgIHRoZSBsYXdmdWwgb2JqZWN0IHRvIHRoZSBhcHBsaWVkIHN0ZXJlb3R5cGUsIGZvcmUgZXhhbXBsZSBhIGNvbnRyYWN0IHRvIGxhd2Z1bEJ5Q29udHJhY3QKKwkgKiAKKwkgKiBAcmV0dXJuCisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IE9iamVjdCBnZXRMYXdmdWxPYmplY3QoUHJvY2Vzc1JlcXVpcmVtZW50IHByb2Nlc3MpOworCisJcHJpdmF0ZSB2b2lkIHNldEF0dHJpYnV0ZUFwcGxpZWRTdGVyZW90eXBlKEdEUFJSZXF1aXJlbWVudHMgZ2RwclJyZXF1aWVtZW50LCBPYmplY3QgbGF3ZnVsT2JqZWN0LCBSZXF1aXJlbWVudCByZXFTdGVyZW90eXBlLCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuTGF3ZnVsIGxhd2Z1bCkgeworCQlhc3NvY2lhdGVMYXdmdWxPYmplY3RUb0FwcGxpZWRTdGVyZW90eXBlKGxhd2Z1bCxsYXdmdWxPYmplY3QpOworCQlsYXdmdWwuc2V0RGF0YVN1YmplY3QoZGF0YVN1YmplY3QpOworCQlmb3IgKFBlcnNvbmFsRGF0YSBwZXJzb25hbERhdGEgOiBwcm9jZXNzUmVxdWlyZW1lbnQuZ2V0UGVyc29uYWxkYXRhKCkpIHsKKwkJCWxhd2Z1bC5nZXRQZXJzb25hbERhdGEoKS5hZGQoKFBlcnNvbmFsRGF0YVJlcXVpcmVtZW50KSBwZXJzb25hbERhdGEpOworCQl9CisJCWxhd2Z1bC5zZXRQcm9jZXNzKHRoaXMucHJvY2Vzc1JlcXVpcmVtZW50KTsKKworCQlzZXRUZXh0T25SZXF1aXJlbWVudCggZ2RwclJyZXF1aWVtZW50LHJlcVN0ZXJlb3R5cGUsIGxhd2Z1bCk7CisJfQorCQorCS8qKgorCSAqIGFwcGx5IHRleHQgb24gc3RlcmVvdHlwZSBieSB0YWtpbmcgdGhlIHR5cGUgb2YgdGhlIGxhd2Z1bEJ5CisJICogQHBhcmFtIHJlcVN0ZXJlb3R5cGUKKwkgKiBAcGFyYW0gbGF3ZnVsQnkKKwkgKi8KKwlwcm90ZWN0ZWQgIGFic3RyYWN0IHZvaWQgc2V0VGV4dE9uUmVxdWlyZW1lbnQoR0RQUlJlcXVpcmVtZW50cyBnZHByUnJlcXVpZW1lbnQsUmVxdWlyZW1lbnQgcmVxU3RlcmVvdHlwZSxFT2JqZWN0IGxhd2Z1bEJ5KTsKKworCS8qKnNldCB0aGUgbGF3ZnVsIG9iamVjdCB0byB0aGUgYXBwbGllZCBzdGVyZW90eXBlLCBmb3JlIGV4YW1wbGUgYSBjb250cmFjdCB0byBsYXdmdWxCeUNvbnRyYWN0CisJICogCisJICogQHBhcmFtIGxhd2Z1bEJ5Q29udHJhY3QKKwkgKiBAcGFyYW0gbGF3ZnVsT2JqZWN0CisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYXNzb2NpYXRlTGF3ZnVsT2JqZWN0VG9BcHBsaWVkU3RlcmVvdHlwZShFT2JqZWN0IGxhd2Z1bEJ5LCBPYmplY3QgbGF3ZnVsT2JqZWN0KTsKKworCS8qKgorCSAqIHNldCB0aGUgaWQgb2YgdGhlIHJlcXVpcmVtZW50CisJICogQHBhcmFtIGlkCisJICogQHBhcmFtIGxhd2Z1bGxSZXEKKwkgKiBAcGFyYW0gcmVxdWlyZW1lbnRDbGFzcworCSAqIEBwYXJhbSByZXFTdGVyZW90eXBlCisJICovCisJcHJpdmF0ZSB2b2lkIHNldFRoZUlEKFN0cmluZyBpZCwgQ2xhc3MgbGF3ZnVsbFJlcSwgQ2xhc3MgcmVxdWlyZW1lbnRDbGFzcywgUmVxdWlyZW1lbnQgcmVxU3RlcmVvdHlwZSkgeworCQlpZihsYXdmdWxsUmVxPT1udWxsKSB7CisJCQlyZXFTdGVyZW90eXBlLnNldElkKGlkKTsKKwkJCXJlcXVpcmVtZW50Q2xhc3Muc2V0TmFtZShpZCk7CisJCX0KKwkJZWxzZSB7CisJCQlyZXFTdGVyZW90eXBlLnNldElkKGxhd2Z1bGxSZXEuZ2V0TmFtZSgpKyIuIitsYXdmdWxsUmVxLmdldE5lc3RlZENsYXNzaWZpZXJzKCkuc2l6ZSgpKTsKKwkJCXJlcXVpcmVtZW50Q2xhc3Muc2V0TmFtZShsYXdmdWxsUmVxLmdldE5hbWUoKSsiLiIrbGF3ZnVsbFJlcS5nZXROZXN0ZWRDbGFzc2lmaWVycygpLnNpemUoKSk7CisJCX0KKwl9CisKKwkvKiogdFNldCB0aGUgb3duZXIgdGhlIG9mIHRoZSByZXF1aXJlbWVudAorCSAqIAorCSAqIEBwYXJhbSBvd25lcgorCSAqIEBwYXJhbSBsYXdmdWxsUmVxCisJICogQHBhcmFtIHJlcXVpcmVtZW50Q2xhc3MKKwkgKi8KKwlwcml2YXRlIHZvaWQgc2V0VGhlT3duZXIoUGFja2FnZSBvd25lciwgQ2xhc3MgbGF3ZnVsbFJlcSwgQ2xhc3MgcmVxdWlyZW1lbnRDbGFzcykgeworCQlpZihsYXdmdWxsUmVxPT1udWxsKSB7CisJCQlvd25lci5nZXRQYWNrYWdlZEVsZW1lbnRzKCkuYWRkKHJlcXVpcmVtZW50Q2xhc3MpOworCQl9CisJCWVsc2UgeworCQkJbGF3ZnVsbFJlcS5nZXROZXN0ZWRDbGFzc2lmaWVycygpLmFkZChyZXF1aXJlbWVudENsYXNzKTsKKworCQl9CisJfQorCisJLyoqCisJICogbG9vayBmb3IgbGF3ZnVsbCByZXF1aXJlbWVudCB0aGF0IGNvdWxkIGJlIHRoZSBvd25lcgorCSAqIEBwYXJhbSBvd25lcgorCSAqIEBwYXJhbSBsYXdmdWxsUmVxCisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgQ2xhc3MgbG9va0Zvckxhd0Z1bGxSZXF1aXJlbWVudChQYWNrYWdlIG93bmVyLCBDbGFzcyBsYXdmdWxsUmVxKSB7CisJCVRyZWVJdGVyYXRvcjxFT2JqZWN0PiBpdGVyYXRvcj0gb3duZXIuZUFsbENvbnRlbnRzKCk7CisJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7CisJCQkvL3Rlc3QgaWYgaXMgaXMgYSBjbGFzcworCQkJaWYgKGVPYmplY3QgaW5zdGFuY2VvZiBDbGFzcykgeworCQkJCUNsYXNzIGFjbGFzcz0oQ2xhc3MpZU9iamVjdDsKKwkJCQlvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuTGF3ZnVsIGxhd2Z1bD0gKG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5MYXdmdWwpVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24oYWNsYXNzLCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuTGF3ZnVsLmNsYXNzKTsKKwkJCQkvLyB0ZXN0IGlmIHRoaXMgaXMgYSBsYXdmdWxsIHJlcS4KKwkJCQlpZiggbGF3ZnVsIT1udWxsKSB7CisJCQkJCS8vdGVzdCBhdHRyaWJ1dGVzCisJCQkJCWlmKGxhd2Z1bC5nZXRQcm9jZXNzKCkuZXF1YWxzKHRoaXMucHJvY2Vzc1JlcXVpcmVtZW50KSAmJiBsYXdmdWwuZ2V0RGF0YVN1YmplY3QoKS5lcXVhbHModGhpcy5kYXRhU3ViamVjdCkpIHsKKwkJCQkJCWxhd2Z1bGxSZXE9KENsYXNzKWxhd2Z1bC5nZXRCYXNlX05hbWVkRWxlbWVudCgpOworCQkJCQkJcmV0dXJuIGxhd2Z1bGxSZXE7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJfQorCQlyZXR1cm4gbGF3ZnVsbFJlcTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvcmVxL29yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEuZ2RwcmFuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3BkcDRlbmcvcmVxL2dkcHJhbmFuYWx5c2lzL2ludGVybmFsL0xhd2Z1bFJlcXVpcmVtZW50QnlDb25zZW50Q3JlYXRlQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9yZXEvb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5nZHByYW5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcGRwNGVuZy9yZXEvZ2RwcmFuYW5hbHlzaXMvaW50ZXJuYWwvTGF3ZnVsUmVxdWlyZW1lbnRCeUNvbnNlbnRDcmVhdGVDb21tYW5kLmphdmEKaW5kZXggNDRiNzI0Ni4uYmU0OTQ2NCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9yZXEvb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5nZHByYW5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcGRwNGVuZy9yZXEvZ2RwcmFuYW5hbHlzaXMvaW50ZXJuYWwvTGF3ZnVsUmVxdWlyZW1lbnRCeUNvbnNlbnRDcmVhdGVDb21tYW5kLmphdmEKKysrIGIvcGx1Z2lucy9yZXEvb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5nZHByYW5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcGRwNGVuZy9yZXEvZ2RwcmFuYW5hbHlzaXMvaW50ZXJuYWwvTGF3ZnVsUmVxdWlyZW1lbnRCeUNvbnNlbnRDcmVhdGVDb21tYW5kLmphdmEKQEAgLTE3LDM5ICsxNywyOSBAQAogCiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlRyZWVJdGVyYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDE5IENFQSBMSVNULgotICogCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgdGhlIHByb3BlcnR5IG9mIHRoZSBDRUEuIAotICogQW55IHVzZSBpcyBzdWJqZWN0IHRvIHNwZWNpZmljIGFncmVlbWVudCB3aXRoIHRoZSBDRUEuCi0gKiBDb250cmlidXRvcnM6Ci0gKiAKLSAqIAkJUGF0cmljayBUZXNzaWVyIChDRUEgTElTVCkgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIAotICovCiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMuc3lzbWwxNC5yZXF1aXJlbWVudHMuUmVxdWlyZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC51dGlsLlVNTFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwudXRpbC5VTUxVdGlsLlN0ZXJlb3R5cGVBcHBsaWNhdGlvbkhlbHBlcjsKLQogaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5jb21tb24ucHJvZmlsZS5wZHA0ZW5nQ29tbW9uR0RQUi5Db25zZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5jb21tb24ucHJvZmlsZS5wZHA0ZW5nQ29tbW9uR0RQUi5EYXRhU3ViamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcuY29tbW9uLnByb2ZpbGUucGRwNGVuZ0NvbW1vbkdEUFIuUGVyc29uYWxEYXRhOwogaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5jb21tb24ucHJvZmlsZS5wZHA0ZW5nQ29tbW9uR0RQUi5QdXJwb3NlOwogaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEubWV0YXJlcS5HRFBSUmVxdWlyZW1lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5wZHA0ZW5nUmVxR0RQUlBhY2thZ2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLlBlcnNvbmFsRGF0YVJlcXVpcmVtZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5Qcm9jZXNzUmVxdWlyZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLnBkcDRlbmdSZXFHRFBSUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnN5c21sMTQucmVxdWlyZW1lbnRzLlJlcXVpcmVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLnV0aWwuVU1MVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC51dGlsLlVNTFV0aWwuU3RlcmVvdHlwZUFwcGxpY2F0aW9uSGVscGVyOwogCisvKioKKyAqIGNvbW1hbmQgZm9yIDYuMS5hCisgKgorICovCiBwdWJsaWMgY2xhc3MgTGF3ZnVsUmVxdWlyZW1lbnRCeUNvbnNlbnRDcmVhdGVDb21tYW5kIGV4dGVuZHMgQmFzaWNHRFBSUmVxdWlyZW1lbnRDcmVhdGVDb21tYW5kIHsKIAogCXByaXZhdGUgRGF0YVN1YmplY3QgZGF0YVN1YmplY3Q7CmRpZmYgLS1naXQgYS9wbHVnaW5zL3JlcS9vcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLmdkcHJhbmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wZHA0ZW5nL3JlcS9nZHByYW5hbmFseXNpcy9pbnRlcm5hbC9MYXdmdWxSZXF1aXJlbWVudEJ5Q29udHJhY3RDcmVhdGVDb21tYW5kLmphdmEgYi9wbHVnaW5zL3JlcS9vcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLmdkcHJhbmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wZHA0ZW5nL3JlcS9nZHByYW5hbmFseXNpcy9pbnRlcm5hbC9MYXdmdWxSZXF1aXJlbWVudEJ5Q29udHJhY3RDcmVhdGVDb21tYW5kLmphdmEKaW5kZXggMzM3OTY1Yi4uNGJjYmIzMiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9yZXEvb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5nZHByYW5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcGRwNGVuZy9yZXEvZ2RwcmFuYW5hbHlzaXMvaW50ZXJuYWwvTGF3ZnVsUmVxdWlyZW1lbnRCeUNvbnRyYWN0Q3JlYXRlQ29tbWFuZC5qYXZhCisrKyBiL3BsdWdpbnMvcmVxL29yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEuZ2RwcmFuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3BkcDRlbmcvcmVxL2dkcHJhbmFuYWx5c2lzL2ludGVybmFsL0xhd2Z1bFJlcXVpcmVtZW50QnlDb250cmFjdENyZWF0ZUNvbW1hbmQuamF2YQpAQCAtMTUsMTU0ICsxNSw1OCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5wZHA0ZW5nLnJlcS5nZHByYW5hbmFseXNpcy5pbnRlcm5hbDsKIAotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5UcmVlSXRlcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0vKioKLSAqIENvcHlyaWdodCAoYykgMjAxOSBDRUEgTElTVC4KLSAqIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIHRoZSBwcm9wZXJ0eSBvZiB0aGUgQ0VBLiAKLSAqIEFueSB1c2UgaXMgc3ViamVjdCB0byBzcGVjaWZpYyBhZ3JlZW1lbnQgd2l0aCB0aGUgQ0VBLgotICogQ29udHJpYnV0b3JzOgotICogCi0gKiAJCVBhdHJpY2sgVGVzc2llciAoQ0VBIExJU1QpIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAKLSAqLwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcuY29tbW9uLnByb2ZpbGUucGRwNGVuZ0NvbW1vbkdEUFIuQ29udHJhY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLmNvbW1vbi5wcm9maWxlLnBkcDRlbmdDb21tb25HRFBSLkRhdGFTdWJqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEubWV0YXJlcS5HRFBSUmVxdWlyZW1lbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5MYXdmdWw7CitpbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLkxhd2Z1bEJ5Q29udHJhY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLlByb2Nlc3NSZXF1aXJlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIucGRwNGVuZ1JlcUdEUFJQYWNrYWdlOwogaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMuc3lzbWwxNC5yZXF1aXJlbWVudHMuUmVxdWlyZW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3M7CiBpbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKIGltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC51dGlsLlVNTFV0aWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwudXRpbC5VTUxVdGlsLlN0ZXJlb3R5cGVBcHBsaWNhdGlvbkhlbHBlcjsKKy8qKgorICogY29tbWFuZCBmb3IgNi4xLmIKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBMYXdmdWxSZXF1aXJlbWVudEJ5Q29udHJhY3RDcmVhdGVDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RMYXdmdWxSZXF1aXJlbWVudEJ5Q3JlYXRlQ29tbWFuZHsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5jb21tb24ucHJvZmlsZS5wZHA0ZW5nQ29tbW9uR0RQUi5Db25zZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5jb21tb24ucHJvZmlsZS5wZHA0ZW5nQ29tbW9uR0RQUi5Db250cmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcuY29tbW9uLnByb2ZpbGUucGRwNGVuZ0NvbW1vbkdEUFIuRGF0YVN1YmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLmNvbW1vbi5wcm9maWxlLnBkcDRlbmdDb21tb25HRFBSLlBlcnNvbmFsRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcuY29tbW9uLnByb2ZpbGUucGRwNGVuZ0NvbW1vbkdEUFIuUHVycG9zZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLm1ldGFyZXEuR0RQUlJlcXVpcmVtZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIucGRwNGVuZ1JlcUdEUFJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5QZXJzb25hbERhdGFSZXF1aXJlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuUHJvY2Vzc1JlcXVpcmVtZW50OwotCi1wdWJsaWMgY2xhc3MgTGF3ZnVsUmVxdWlyZW1lbnRCeUNvbnRyYWN0Q3JlYXRlQ29tbWFuZCBleHRlbmRzIEJhc2ljR0RQUlJlcXVpcmVtZW50Q3JlYXRlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIERhdGFTdWJqZWN0IGRhdGFTdWJqZWN0OwogCXB1YmxpYyBMYXdmdWxSZXF1aXJlbWVudEJ5Q29udHJhY3RDcmVhdGVDb21tYW5kKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwgRWxlbWVudCBvd25lciwgU3RyaW5nIGlkLCBTdHJpbmcgdGV4dCxQcm9jZXNzUmVxdWlyZW1lbnQgcHJvY2Vzc1JlcXVpcmVtZW50LCBEYXRhU3ViamVjdCBkYXRhU3ViamVjdCkgewotCQlzdXBlcihkb21haW4sIG93bmVyLCBpZCwgdGV4dCxwcm9jZXNzUmVxdWlyZW1lbnQpOwotCQl0aGlzLmRhdGFTdWJqZWN0PSBkYXRhU3ViamVjdDsKKwkJc3VwZXIoZG9tYWluLCBvd25lciwgaWQsIHRleHQscHJvY2Vzc1JlcXVpcmVtZW50LCBkYXRhU3ViamVjdCk7CisJfQorCisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgT2JqZWN0IGdldExhd2Z1bE9iamVjdChQcm9jZXNzUmVxdWlyZW1lbnQgcHJvY2VzcykgeworCQlyZXR1cm4gcHJvY2Vzcy5nZXRQZXJmb3JtQUNvbnRyYWN0KCk7CiAJfQogCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlUmVxdWlyZW1lbnQoUGFja2FnZSBvd25lciwgU3RyaW5nIGlkLCBTdHJpbmcgdGV4dCkgewotCQlTdGVyZW90eXBlQXBwbGljYXRpb25IZWxwZXIgc3RlcmVvdHlwZUFwcGxpY2F0aW9uSGVscGVyID0gU3RlcmVvdHlwZUFwcGxpY2F0aW9uSGVscGVyLmdldEluc3RhbmNlKG51bGwpOwotCQlHRFBSUmVxdWlyZW1lbnRzIGdkcHJScmVxdWllbWVudD0gbmV3IEdEUFJSZXF1aXJlbWVudHMoKTsKKwlwcm90ZWN0ZWQgdm9pZCBzZXRUZXh0T25SZXF1aXJlbWVudChHRFBSUmVxdWlyZW1lbnRzIGdkcHJScmVxdWllbWVudCxSZXF1aXJlbWVudCByZXFTdGVyZW90eXBlLCBFT2JqZWN0IGxhd2Z1bEJ5KSB7CisJCWlmKCBsYXdmdWxCeSBpbnN0YW5jZW9mIExhd2Z1bEJ5Q29udHJhY3QpIHsKKwkJCUxhd2Z1bEJ5Q29udHJhY3QgbGF3ZnVsQnlDb250cmFjdCA9IChMYXdmdWxCeUNvbnRyYWN0KSBsYXdmdWxCeTsKKwkJCXJlcVN0ZXJlb3R5cGUuc2V0VGV4dCgiIitnZHByUnJlcXVpZW1lbnQuZ2V0RGVzY3JpcHRpb25Gb3JMYXdmdWxCeUNvbnRyYWN0KGxhd2Z1bEJ5Q29udHJhY3QpKTsKKwkJfQorCX0KIAotCQlDbGFzcyBsYXdmdWxsUmVxID1udWxsOwotCQkvLzEuIGxvb2sgZm9yIExhd2Z1bFJlcXVpcmVtZW50Ci0JCWxhd2Z1bGxSZXEgPSBsb29rRm9yTGF3RnVsbFJlcXVpcmVtZW50KG93bmVyLCBsYXdmdWxsUmVxKTsKLQotCi0JCS8vMi4gY3JlYXRlIHRoZSBzdWIgcmVxdWlyZW1lbnQKLQkJZm9yIChJdGVyYXRvcjxDb25zZW50PiBpdGVyYXRvckNvbnNlbnQgPSBkYXRhU3ViamVjdC5nZXRHaXZlbkNvbnNlbnQoKS5pdGVyYXRvcigpOyBpdGVyYXRvckNvbnNlbnQuaGFzTmV4dCgpOykgewotCQkJQ29udHJhY3QgYUNvbnRyYWN0ID10aGlzLnByb2Nlc3NSZXF1aXJlbWVudC5nZXRQZXJmb3JtQUNvbnRyYWN0KCk7Ci0JCQlpZiggYUNvbnRyYWN0IT1udWxsKSB7Ci0KLQkJCQkvLzEuMSBjcmVhdGUgdGhlIGNsYXNzCi0JCQkJQ2xhc3MgcmVxdWlyZW1lbnRDbGFzcyA9VU1MRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2xhc3MoKTsKLQotCQkJCS8vMi4xIHNldCB0aGUgb3duZXIKLQkJCQlzZXRUaGVPd25lcihvd25lciwgbGF3ZnVsbFJlcSwgcmVxdWlyZW1lbnRDbGFzcyk7Ci0JCQkJLy8zLiBhcHBseSB0aGUgc3RlcmVvdHlwZQotCQkJCXN0ZXJlb3R5cGVBcHBsaWNhdGlvbkhlbHBlci5hcHBseVN0ZXJlb3R5cGUocmVxdWlyZW1lbnRDbGFzcyxvcmcuZWNsaXBzZS5wYXB5cnVzLnN5c21sMTQucmVxdWlyZW1lbnRzLlJlcXVpcmVtZW50c1BhY2thZ2UuZUlOU1RBTkNFLmdldFJlcXVpcmVtZW50KCksbnVsbCApOwotCQkJCVJlcXVpcmVtZW50IHJlcVN0ZXJlb3R5cGU9IChSZXF1aXJlbWVudClVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbihyZXF1aXJlbWVudENsYXNzLCBSZXF1aXJlbWVudC5jbGFzcyk7Ci0JCQkJc3RlcmVvdHlwZUFwcGxpY2F0aW9uSGVscGVyLmFwcGx5U3RlcmVvdHlwZShyZXF1aXJlbWVudENsYXNzLHBkcDRlbmdSZXFHRFBSUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGF3ZnVsQnlDb25zZW50KCksbnVsbCApOwotCQkJCW9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5MYXdmdWxCeUNvbnRyYWN0IGxhd2Z1bFJieUNvbnRyYWN0PSAob3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLkxhd2Z1bEJ5Q29udHJhY3QpVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24ocmVxdWlyZW1lbnRDbGFzcywgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLkxhd2Z1bEJ5Q29udHJhY3QuY2xhc3MpOwotCQkJCS8vNC4gc2V0IGF0dHJpYnV0ZSBvZiB0aGUgYXBwbGllZCBzdGVyZW90eXBlCi0JCQkJc2V0QXR0cmlidXRlQXBwbGllZFN0ZXJlb3R5cGUoZ2RwclJyZXF1aWVtZW50LCBhQ29udHJhY3QsIHJlcVN0ZXJlb3R5cGUsIGxhd2Z1bFJieUNvbnRyYWN0KTsKLQkJCQkvLzUuc2V0IHRoZSBJRAotCQkJCXNldFRoZUlEKGlkLCBsYXdmdWxsUmVxLCByZXF1aXJlbWVudENsYXNzLCByZXFTdGVyZW90eXBlKTsKLQkJCX0KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBhc3NvY2lhdGVMYXdmdWxPYmplY3RUb0FwcGxpZWRTdGVyZW90eXBlKEVPYmplY3QgbGF3ZnVsQnksIE9iamVjdCBsYXdmdWxPYmplY3QpIHsKKwkJaWYoIGxhd2Z1bEJ5IGluc3RhbmNlb2YgTGF3ZnVsQnlDb250cmFjdCkgeworCQkJTGF3ZnVsQnlDb250cmFjdCBsYXdmdWxCeUNvbnRyYWN0ID0gKExhd2Z1bEJ5Q29udHJhY3QpIGxhd2Z1bEJ5OworCQkJbGF3ZnVsQnlDb250cmFjdC5zZXRDb250cmFjdCgoQ29udHJhY3QpbGF3ZnVsT2JqZWN0KTsKIAkJfQogCiAJfQogCi0JcHJpdmF0ZSB2b2lkIHNldEF0dHJpYnV0ZUFwcGxpZWRTdGVyZW90eXBlKEdEUFJSZXF1aXJlbWVudHMgZ2RwclJyZXF1aWVtZW50LCBDb250cmFjdCBhQ29udHJhY3QsIFJlcXVpcmVtZW50IHJlcVN0ZXJlb3R5cGUsIG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5MYXdmdWxCeUNvbnRyYWN0IGxhd2Z1bEJ5Q29udHJhY3QpIHsKLQkJbGF3ZnVsQnlDb250cmFjdC5zZXRDb250cmFjdChhQ29udHJhY3QpOwotCQlsYXdmdWxCeUNvbnRyYWN0LnNldERhdGFTdWJqZWN0KGRhdGFTdWJqZWN0KTsKLQkJZm9yIChQZXJzb25hbERhdGEgcGVyc29uYWxEYXRhIDogcHJvY2Vzc1JlcXVpcmVtZW50LmdldFBlcnNvbmFsZGF0YSgpKSB7Ci0JCQlsYXdmdWxCeUNvbnRyYWN0LmdldFBlcnNvbmFsRGF0YSgpLmFkZCgoUGVyc29uYWxEYXRhUmVxdWlyZW1lbnQpIHBlcnNvbmFsRGF0YSk7Ci0JCX0KLQkJbGF3ZnVsQnlDb250cmFjdC5zZXRQcm9jZXNzKHRoaXMucHJvY2Vzc1JlcXVpcmVtZW50KTsKLQkJcmVxU3RlcmVvdHlwZS5zZXRUZXh0KCIiK2dkcHJScmVxdWllbWVudC5nZXREZXNjcmlwdGlvbkZvckxhd2Z1bEJ5Q29uc2VudChsYXdmdWxCeUNvbnRyYWN0KSk7Ci0JfQogCi0JLyoqCi0JICogc2V0IHRoZSBpZCBvZiB0aGUgcmVxdWlyZW1lbnQKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcGFyYW0gbGF3ZnVsbFJlcQotCSAqIEBwYXJhbSByZXF1aXJlbWVudENsYXNzCi0JICogQHBhcmFtIHJlcVN0ZXJlb3R5cGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0VGhlSUQoU3RyaW5nIGlkLCBDbGFzcyBsYXdmdWxsUmVxLCBDbGFzcyByZXF1aXJlbWVudENsYXNzLCBSZXF1aXJlbWVudCByZXFTdGVyZW90eXBlKSB7Ci0JCWlmKGxhd2Z1bGxSZXE9PW51bGwpIHsKLQkJCXJlcVN0ZXJlb3R5cGUuc2V0SWQoaWQpOwotCQkJcmVxdWlyZW1lbnRDbGFzcy5zZXROYW1lKGlkKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlcVN0ZXJlb3R5cGUuc2V0SWQobGF3ZnVsbFJlcS5nZXROYW1lKCkrIi4iK2xhd2Z1bGxSZXEuZ2V0TmVzdGVkQ2xhc3NpZmllcnMoKS5zaXplKCkpOwotCQkJcmVxdWlyZW1lbnRDbGFzcy5zZXROYW1lKGxhd2Z1bGxSZXEuZ2V0TmFtZSgpKyIuIitsYXdmdWxsUmVxLmdldE5lc3RlZENsYXNzaWZpZXJzKCkuc2l6ZSgpKTsKLQkJfQotCX0KLQotCS8qKiB0U2V0IHRoZSBvd25lciB0aGUgb2YgdGhlIHJlcXVpcmVtZW50Ci0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGxhd2Z1bGxSZXEKLQkgKiBAcGFyYW0gcmVxdWlyZW1lbnRDbGFzcwotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRUaGVPd25lcihQYWNrYWdlIG93bmVyLCBDbGFzcyBsYXdmdWxsUmVxLCBDbGFzcyByZXF1aXJlbWVudENsYXNzKSB7Ci0JCWlmKGxhd2Z1bGxSZXE9PW51bGwpIHsKLQkJCW93bmVyLmdldFBhY2thZ2VkRWxlbWVudHMoKS5hZGQocmVxdWlyZW1lbnRDbGFzcyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlsYXdmdWxsUmVxLmdldE5lc3RlZENsYXNzaWZpZXJzKCkuYWRkKHJlcXVpcmVtZW50Q2xhc3MpOwotCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBsb29rIGZvciBsYXdmdWxsIHJlcXVpcmVtZW50IHRoYXQgY291bGQgYmUgdGhlIG93bmVyCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGxhd2Z1bGxSZXEKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBDbGFzcyBsb29rRm9yTGF3RnVsbFJlcXVpcmVtZW50KFBhY2thZ2Ugb3duZXIsIENsYXNzIGxhd2Z1bGxSZXEpIHsKLQkJVHJlZUl0ZXJhdG9yPEVPYmplY3Q+IGl0ZXJhdG9yPSBvd25lci5lQWxsQ29udGVudHMoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCS8vdGVzdCBpZiBpcyBpcyBhIGNsYXNzCi0JCQlpZiAoZU9iamVjdCBpbnN0YW5jZW9mIENsYXNzKSB7Ci0JCQkJQ2xhc3MgYWNsYXNzPShDbGFzcyllT2JqZWN0OwotCQkJCW9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5MYXdmdWwgbGF3ZnVsPSAob3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLkxhd2Z1bClVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbihhY2xhc3MsIG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5MYXdmdWwuY2xhc3MpOwotCQkJCS8vIHRlc3QgaWYgdGhpcyBpcyBhIGxhd2Z1bGwgcmVxLgotCQkJCWlmKCBsYXdmdWwhPW51bGwpIHsKLQkJCQkJLy90ZXN0IGF0dHJpYnV0ZXMKLQkJCQkJaWYobGF3ZnVsLmdldFByb2Nlc3MoKS5lcXVhbHModGhpcy5wcm9jZXNzUmVxdWlyZW1lbnQpICYmIGxhd2Z1bC5nZXREYXRhU3ViamVjdCgpLmVxdWFscyh0aGlzLmRhdGFTdWJqZWN0KSkgewotCQkJCQkJbGF3ZnVsbFJlcT0oQ2xhc3MpbGF3ZnVsLmdldEJhc2VfTmFtZWRFbGVtZW50KCk7Ci0JCQkJCQlyZXR1cm4gbGF3ZnVsbFJlcTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQl9Ci0JCXJldHVybiBsYXdmdWxsUmVxOworCUBPdmVycmlkZQorCXByb3RlY3RlZCBMYXdmdWwgYXBwbHlTdGVyZW90eXBlKFN0ZXJlb3R5cGVBcHBsaWNhdGlvbkhlbHBlciBzdGVyZW90eXBlQXBwbGljYXRpb25IZWxwZXIsIENsYXNzIHJlcXVpcmVtZW50Q2xhc3MpIHsKKwkJc3RlcmVvdHlwZUFwcGxpY2F0aW9uSGVscGVyLmFwcGx5U3RlcmVvdHlwZShyZXF1aXJlbWVudENsYXNzLCBwZHA0ZW5nUmVxR0RQUlBhY2thZ2UuZUlOU1RBTkNFLmdldExhd2Z1bEJ5Q29udHJhY3QoKSxudWxsKTsKKwkJcmV0dXJuIFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHJlcXVpcmVtZW50Q2xhc3MsIG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5MYXdmdWxCeUNvbnRyYWN0LmNsYXNzKTsKIAl9CiAKIH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvcmVxL29yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEuZ2RwcmFuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3BkcDRlbmcvcmVxL2dkcHJhbmFuYWx5c2lzL2ludGVybmFsL0xhd2Z1bFJlcXVpcmVtZW50QnlMZWdhbE9ibGlnYXRpb25DcmVhdGVDb21tYW5kLmphdmEgYi9wbHVnaW5zL3JlcS9vcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLmdkcHJhbmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wZHA0ZW5nL3JlcS9nZHByYW5hbmFseXNpcy9pbnRlcm5hbC9MYXdmdWxSZXF1aXJlbWVudEJ5TGVnYWxPYmxpZ2F0aW9uQ3JlYXRlQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NGMwMGMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3JlcS9vcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLmdkcHJhbmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wZHA0ZW5nL3JlcS9nZHByYW5hbmFseXNpcy9pbnRlcm5hbC9MYXdmdWxSZXF1aXJlbWVudEJ5TGVnYWxPYmxpZ2F0aW9uQ3JlYXRlQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKTIwMjAgQ0VBIExJU1QsIENvbW1pdHRlciBOYW1lLCBhbmQgb3RoZXJzLiAKKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBDRUEgTElTVCAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogUGF0cmljayBUZXNzaWVyIChDRUEgTElTVCkgUGF0cmljay50ZXNzaWVyQGNlYS5mciAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UucGRwNGVuZy5yZXEuZ2RwcmFuYW5hbHlzaXMuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47CitpbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLmNvbW1vbi5wcm9maWxlLnBkcDRlbmdDb21tb25HRFBSLkRhdGFTdWJqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5jb21tb24ucHJvZmlsZS5wZHA0ZW5nQ29tbW9uR0RQUi5MZWdhbE9ibGlnYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5tZXRhcmVxLkdEUFJSZXF1aXJlbWVudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLkxhd2Z1bDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuTGF3ZnVsQnlMZWdhbE9ibGlnYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLlByb2Nlc3NSZXF1aXJlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIucGRwNGVuZ1JlcUdEUFJQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMuc3lzbWwxNC5yZXF1aXJlbWVudHMuUmVxdWlyZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC51dGlsLlVNTFV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwudXRpbC5VTUxVdGlsLlN0ZXJlb3R5cGVBcHBsaWNhdGlvbkhlbHBlcjsKKworLyoqCisgKiBjb21tYW5kICBmb3IgNi4xLmMKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBMYXdmdWxSZXF1aXJlbWVudEJ5TGVnYWxPYmxpZ2F0aW9uQ3JlYXRlQ29tbWFuZCAgZXh0ZW5kcyBBYnN0cmFjdExhd2Z1bFJlcXVpcmVtZW50QnlDcmVhdGVDb21tYW5keworCisJcHVibGljIExhd2Z1bFJlcXVpcmVtZW50QnlMZWdhbE9ibGlnYXRpb25DcmVhdGVDb21tYW5kKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwgRWxlbWVudCBvd25lciwgU3RyaW5nIGlkLCBTdHJpbmcgdGV4dCxQcm9jZXNzUmVxdWlyZW1lbnQgcHJvY2Vzc1JlcXVpcmVtZW50LCBEYXRhU3ViamVjdCBkYXRhU3ViamVjdCkgeworCQlzdXBlcihkb21haW4sIG93bmVyLCBpZCwgdGV4dCxwcm9jZXNzUmVxdWlyZW1lbnQsIGRhdGFTdWJqZWN0KTsKKwl9CisKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBPYmplY3QgZ2V0TGF3ZnVsT2JqZWN0KFByb2Nlc3NSZXF1aXJlbWVudCBwcm9jZXNzKSB7CisJCXJldHVybiBwcm9jZXNzLmdldE5lZWRlZEZvckxlZ2FsT2JsaWdhdGlvbigpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFRleHRPblJlcXVpcmVtZW50KEdEUFJSZXF1aXJlbWVudHMgZ2RwclJyZXF1aWVtZW50LFJlcXVpcmVtZW50IHJlcVN0ZXJlb3R5cGUsIEVPYmplY3QgbGF3ZnVsQnkpIHsKKwkJaWYoIGxhd2Z1bEJ5IGluc3RhbmNlb2YgTGF3ZnVsQnlMZWdhbE9ibGlnYXRpb24pIHsKKwkJCUxhd2Z1bEJ5TGVnYWxPYmxpZ2F0aW9uIGxhd2Z1bEJ5TGVnYWxPYmxpZ2F0aW9uID0gKExhd2Z1bEJ5TGVnYWxPYmxpZ2F0aW9uKSBsYXdmdWxCeTsKKwkJCXJlcVN0ZXJlb3R5cGUuc2V0VGV4dCgiIitnZHByUnJlcXVpZW1lbnQuZ2V0RGVzY3JpcHRpb25Gb3JMYXdmdWxCeUxlZ2FsT2JsaWdhdGlvbihsYXdmdWxCeUxlZ2FsT2JsaWdhdGlvbikpOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYXNzb2NpYXRlTGF3ZnVsT2JqZWN0VG9BcHBsaWVkU3RlcmVvdHlwZShFT2JqZWN0IGxhd2Z1bEJ5LCBPYmplY3QgbGF3ZnVsT2JqZWN0KSB7CisJCWlmKCBsYXdmdWxCeSBpbnN0YW5jZW9mIExhd2Z1bEJ5TGVnYWxPYmxpZ2F0aW9uKSB7CisJCQlMYXdmdWxCeUxlZ2FsT2JsaWdhdGlvbiBsYXdmdWxCeUxlZ2FsT2JsaWdhdGlvbiA9IChMYXdmdWxCeUxlZ2FsT2JsaWdhdGlvbikgbGF3ZnVsQnk7CisJCQlsYXdmdWxCeUxlZ2FsT2JsaWdhdGlvbi5zZXRMZWdhbE9ibGlnYXRpb24oKExlZ2FsT2JsaWdhdGlvbilsYXdmdWxPYmplY3QpOworCQl9CisKKwl9CisKKworCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIExhd2Z1bCBhcHBseVN0ZXJlb3R5cGUoU3RlcmVvdHlwZUFwcGxpY2F0aW9uSGVscGVyIHN0ZXJlb3R5cGVBcHBsaWNhdGlvbkhlbHBlciwgQ2xhc3MgcmVxdWlyZW1lbnRDbGFzcykgeworCQlzdGVyZW90eXBlQXBwbGljYXRpb25IZWxwZXIuYXBwbHlTdGVyZW90eXBlKHJlcXVpcmVtZW50Q2xhc3MsIHBkcDRlbmdSZXFHRFBSUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGF3ZnVsQnlMZWdhbE9ibGlnYXRpb24oKSxudWxsKTsKKwkJcmV0dXJuIFVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHJlcXVpcmVtZW50Q2xhc3MsIG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5MYXdmdWxCeUxlZ2FsT2JsaWdhdGlvbi5jbGFzcyk7CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL3JlcS9vcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLmdkcHJhbmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wZHA0ZW5nL3JlcS9nZHByYW5hbmFseXNpcy9pbnRlcm5hbC9MYXdmdWxSZXF1aXJlbWVudEJ5TGVnaXRpbWF0ZUludGVyZXN0Q3JlYXRlQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9yZXEvb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5nZHByYW5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcGRwNGVuZy9yZXEvZ2RwcmFuYW5hbHlzaXMvaW50ZXJuYWwvTGF3ZnVsUmVxdWlyZW1lbnRCeUxlZ2l0aW1hdGVJbnRlcmVzdENyZWF0ZUNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWFmOWY5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9yZXEvb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5nZHByYW5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcGRwNGVuZy9yZXEvZ2RwcmFuYW5hbHlzaXMvaW50ZXJuYWwvTGF3ZnVsUmVxdWlyZW1lbnRCeUxlZ2l0aW1hdGVJbnRlcmVzdENyZWF0ZUNvbW1hbmQuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykyMDIwIENFQSBMSVNULCBDb21taXR0ZXIgTmFtZSwgYW5kIG90aGVycy4gCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLworICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICogQ29udHJpYnV0b3JzOgorICogQ0VBIExJU1QgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqIFBhdHJpY2sgVGVzc2llciAoQ0VBIExJU1QpIFBhdHJpY2sudGVzc2llckBjZWEuZnIgCisgKiBHYWJyaWVsIFBlZHJvemEgKENFQSBMSVNUKSBnYWJyaWVsLnBlZHJvemFAY2VhLmZyIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5wZHA0ZW5nLnJlcS5nZHByYW5hbmFseXNpcy5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcuY29tbW9uLnByb2ZpbGUucGRwNGVuZ0NvbW1vbkdEUFIuRGF0YVN1YmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLmNvbW1vbi5wcm9maWxlLnBkcDRlbmdDb21tb25HRFBSLkxlZ2l0aW1hdGVJbnRlcmVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLm1ldGFyZXEuR0RQUlJlcXVpcmVtZW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuTGF3ZnVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5MYXdmdWxCeUxlZ2l0aW1hdGVJbnRlcmVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuUHJvY2Vzc1JlcXVpcmVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5wZHA0ZW5nUmVxR0RQUlBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5zeXNtbDE0LnJlcXVpcmVtZW50cy5SZXF1aXJlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5FbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLnV0aWwuVU1MVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC51dGlsLlVNTFV0aWwuU3RlcmVvdHlwZUFwcGxpY2F0aW9uSGVscGVyOworCisvKioKKyAqIENvbW1hbmQgZm9yIDYuMS5mCisgKgorICovCitwdWJsaWMgY2xhc3MgTGF3ZnVsUmVxdWlyZW1lbnRCeUxlZ2l0aW1hdGVJbnRlcmVzdENyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdExhd2Z1bFJlcXVpcmVtZW50QnlDcmVhdGVDb21tYW5keworCisJcHVibGljIExhd2Z1bFJlcXVpcmVtZW50QnlMZWdpdGltYXRlSW50ZXJlc3RDcmVhdGVDb21tYW5kKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwgRWxlbWVudCBvd25lciwgU3RyaW5nIGlkLCBTdHJpbmcgdGV4dCxQcm9jZXNzUmVxdWlyZW1lbnQgcHJvY2Vzc1JlcXVpcmVtZW50LCBEYXRhU3ViamVjdCBkYXRhU3ViamVjdCkgeworCQlzdXBlcihkb21haW4sIG93bmVyLCBpZCwgdGV4dCxwcm9jZXNzUmVxdWlyZW1lbnQsIGRhdGFTdWJqZWN0KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgT2JqZWN0IGdldExhd2Z1bE9iamVjdChQcm9jZXNzUmVxdWlyZW1lbnQgcHJvY2VzcykgeworCQlyZXR1cm4gcHJvY2Vzcy5nZXROZWVkZWRGb3JMZWdpbWF0ZUludGVyZXN0KCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VGV4dE9uUmVxdWlyZW1lbnQoR0RQUlJlcXVpcmVtZW50cyBnZHByUnJlcXVpZW1lbnQsUmVxdWlyZW1lbnQgcmVxU3RlcmVvdHlwZSwgRU9iamVjdCBsYXdmdWxCeSkgeworCQlpZiggbGF3ZnVsQnkgaW5zdGFuY2VvZiBMYXdmdWxCeUxlZ2l0aW1hdGVJbnRlcmVzdCkgeworCQkJTGF3ZnVsQnlMZWdpdGltYXRlSW50ZXJlc3QgbGF3ZnVsQnlMZWdhbE9ibGlnYXRpb24gPSAoTGF3ZnVsQnlMZWdpdGltYXRlSW50ZXJlc3QpIGxhd2Z1bEJ5OworCQkJcmVxU3RlcmVvdHlwZS5zZXRUZXh0KCIiK2dkcHJScmVxdWllbWVudC5nZXREZXNjcmlwdGlvbkZvckxhd2Z1bEJ5TGVnaXRpbWF0ZUludGVyZXN0KGxhd2Z1bEJ5TGVnYWxPYmxpZ2F0aW9uKSk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBhc3NvY2lhdGVMYXdmdWxPYmplY3RUb0FwcGxpZWRTdGVyZW90eXBlKEVPYmplY3QgbGF3ZnVsQnksIE9iamVjdCBsYXdmdWxPYmplY3QpIHsKKwkJaWYoIGxhd2Z1bEJ5IGluc3RhbmNlb2YgTGF3ZnVsQnlMZWdpdGltYXRlSW50ZXJlc3QpIHsKKwkJCUxhd2Z1bEJ5TGVnaXRpbWF0ZUludGVyZXN0IGxhd2Z1bEJ5TGVnYWxPYmxpZ2F0aW9uID0gKExhd2Z1bEJ5TGVnaXRpbWF0ZUludGVyZXN0KSBsYXdmdWxCeTsKKwkJCWxhd2Z1bEJ5TGVnYWxPYmxpZ2F0aW9uLnNldExlZ2l0aW1hdGVJbnRlcmVzdCgoTGVnaXRpbWF0ZUludGVyZXN0KWxhd2Z1bE9iamVjdCk7CisJCX0KKworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBMYXdmdWwgYXBwbHlTdGVyZW90eXBlKFN0ZXJlb3R5cGVBcHBsaWNhdGlvbkhlbHBlciBzdGVyZW90eXBlQXBwbGljYXRpb25IZWxwZXIsIENsYXNzIHJlcXVpcmVtZW50Q2xhc3MpIHsKKwkJc3RlcmVvdHlwZUFwcGxpY2F0aW9uSGVscGVyLmFwcGx5U3RlcmVvdHlwZShyZXF1aXJlbWVudENsYXNzLCBwZHA0ZW5nUmVxR0RQUlBhY2thZ2UuZUlOU1RBTkNFLmdldExhd2Z1bEJ5TGVnaXRpbWF0ZUludGVyZXN0KCksbnVsbCk7CisJCXJldHVybiBVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbihyZXF1aXJlbWVudENsYXNzLCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuTGF3ZnVsQnlMZWdpdGltYXRlSW50ZXJlc3QuY2xhc3MpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3JlcS9vcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLmdkcHJhbmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wZHA0ZW5nL3JlcS9nZHByYW5hbmFseXNpcy9pbnRlcm5hbC9MYXdmdWxSZXF1aXJlbWVudEJ5UHVibGljSW50ZXJlc3RDcmVhdGVDb21tYW5kLmphdmEgYi9wbHVnaW5zL3JlcS9vcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLmdkcHJhbmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wZHA0ZW5nL3JlcS9nZHByYW5hbmFseXNpcy9pbnRlcm5hbC9MYXdmdWxSZXF1aXJlbWVudEJ5UHVibGljSW50ZXJlc3RDcmVhdGVDb21tYW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY5N2RjNQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvcmVxL29yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEuZ2RwcmFuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3BkcDRlbmcvcmVxL2dkcHJhbmFuYWx5c2lzL2ludGVybmFsL0xhd2Z1bFJlcXVpcmVtZW50QnlQdWJsaWNJbnRlcmVzdENyZWF0ZUNvbW1hbmQuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykyMDIwIENFQSBMSVNULCBDb21taXR0ZXIgTmFtZSwgYW5kIG90aGVycy4gCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLworICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICogQ29udHJpYnV0b3JzOgorICogQ0VBIExJU1QgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqIFBhdHJpY2sgVGVzc2llciAoQ0VBIExJU1QpIFBhdHJpY2sudGVzc2llckBjZWEuZnIgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnBkcDRlbmcucmVxLmdkcHJhbmFuYWx5c2lzLmludGVybmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5jb21tb24ucHJvZmlsZS5wZHA0ZW5nQ29tbW9uR0RQUi5EYXRhU3ViamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcuY29tbW9uLnByb2ZpbGUucGRwNGVuZ0NvbW1vbkdEUFIuUHVibGljSW50ZXJlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5tZXRhcmVxLkdEUFJSZXF1aXJlbWVudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLkxhd2Z1bDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuTGF3ZnVsQnlQdWJsaWNJbnRlcmVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuUHJvY2Vzc1JlcXVpcmVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5wZHA0ZW5nUmVxR0RQUlBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5zeXNtbDE0LnJlcXVpcmVtZW50cy5SZXF1aXJlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5FbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLnV0aWwuVU1MVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC51dGlsLlVNTFV0aWwuU3RlcmVvdHlwZUFwcGxpY2F0aW9uSGVscGVyOworCisvKioKKyAqIGNvbW1hbmQgZm9yIDYuMS5lCisgKiBAYXV0aG9yIFBUMjAyNzA3CisgKgorICovCitwdWJsaWMgY2xhc3MgTGF3ZnVsUmVxdWlyZW1lbnRCeVB1YmxpY0ludGVyZXN0Q3JlYXRlQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0TGF3ZnVsUmVxdWlyZW1lbnRCeUNyZWF0ZUNvbW1hbmR7CisKKwlwdWJsaWMgTGF3ZnVsUmVxdWlyZW1lbnRCeVB1YmxpY0ludGVyZXN0Q3JlYXRlQ29tbWFuZChUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4sIEVsZW1lbnQgb3duZXIsIFN0cmluZyBpZCwgU3RyaW5nIHRleHQsUHJvY2Vzc1JlcXVpcmVtZW50IHByb2Nlc3NSZXF1aXJlbWVudCwgRGF0YVN1YmplY3QgZGF0YVN1YmplY3QpIHsKKwkJc3VwZXIoZG9tYWluLCBvd25lciwgaWQsIHRleHQscHJvY2Vzc1JlcXVpcmVtZW50LCBkYXRhU3ViamVjdCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIE9iamVjdCBnZXRMYXdmdWxPYmplY3QoUHJvY2Vzc1JlcXVpcmVtZW50IHByb2Nlc3MpIHsKKwkJcmV0dXJuIHByb2Nlc3MuZ2V0TmVlZGVkRm9yUHVibGljSW50ZXJlc3QoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRUZXh0T25SZXF1aXJlbWVudChHRFBSUmVxdWlyZW1lbnRzIGdkcHJScmVxdWllbWVudCxSZXF1aXJlbWVudCByZXFTdGVyZW90eXBlLCBFT2JqZWN0IGxhd2Z1bEJ5KSB7CisJCWlmKCBsYXdmdWxCeSBpbnN0YW5jZW9mIExhd2Z1bEJ5UHVibGljSW50ZXJlc3QpIHsKKwkJCUxhd2Z1bEJ5UHVibGljSW50ZXJlc3QgbGF3ZnVsQnlQdWJsaWNJbnRlcmVzdCA9IChMYXdmdWxCeVB1YmxpY0ludGVyZXN0KSBsYXdmdWxCeTsKKwkJCXJlcVN0ZXJlb3R5cGUuc2V0VGV4dCgiIitnZHByUnJlcXVpZW1lbnQuZ2V0RGVzY3JpcHRpb25Gb3JMYXdmdWxCeVB1YmxpY0ludGVyZXN0KGxhd2Z1bEJ5UHVibGljSW50ZXJlc3QpKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFzc29jaWF0ZUxhd2Z1bE9iamVjdFRvQXBwbGllZFN0ZXJlb3R5cGUoRU9iamVjdCBsYXdmdWxCeSwgT2JqZWN0IGxhd2Z1bE9iamVjdCkgeworCQlpZiggbGF3ZnVsQnkgaW5zdGFuY2VvZiBMYXdmdWxCeVB1YmxpY0ludGVyZXN0KSB7CisJCQlMYXdmdWxCeVB1YmxpY0ludGVyZXN0IGxhd2Z1bEJ5UHVibGljSW50ZXJlc3QgPSAoTGF3ZnVsQnlQdWJsaWNJbnRlcmVzdCkgbGF3ZnVsQnk7CisJCQlsYXdmdWxCeVB1YmxpY0ludGVyZXN0LnNldFB1YmxpY0ludGVyZXN0KChQdWJsaWNJbnRlcmVzdClsYXdmdWxPYmplY3QpOworCQl9CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgTGF3ZnVsIGFwcGx5U3RlcmVvdHlwZShTdGVyZW90eXBlQXBwbGljYXRpb25IZWxwZXIgc3RlcmVvdHlwZUFwcGxpY2F0aW9uSGVscGVyLCBDbGFzcyByZXF1aXJlbWVudENsYXNzKSB7CisJCXN0ZXJlb3R5cGVBcHBsaWNhdGlvbkhlbHBlci5hcHBseVN0ZXJlb3R5cGUocmVxdWlyZW1lbnRDbGFzcywgcGRwNGVuZ1JlcUdEUFJQYWNrYWdlLmVJTlNUQU5DRS5nZXRMYXdmdWxCeVB1YmxpY0ludGVyZXN0KCksbnVsbCk7CisJCXJldHVybiBVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbihyZXF1aXJlbWVudENsYXNzLCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuTGF3ZnVsQnlQdWJsaWNJbnRlcmVzdC5jbGFzcyk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvcmVxL29yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEuZ2RwcmFuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3BkcDRlbmcvcmVxL2dkcHJhbmFuYWx5c2lzL2ludGVybmFsL0xhd2Z1bFJlcXVpcmVtZW50QnlTYWZlR3VhcmRDcmVhdGVDb21tYW5kLmphdmEgYi9wbHVnaW5zL3JlcS9vcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLmdkcHJhbmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wZHA0ZW5nL3JlcS9nZHByYW5hbmFseXNpcy9pbnRlcm5hbC9MYXdmdWxSZXF1aXJlbWVudEJ5U2FmZUd1YXJkQ3JlYXRlQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNmIwNjUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3JlcS9vcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLmdkcHJhbmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wZHA0ZW5nL3JlcS9nZHByYW5hbmFseXNpcy9pbnRlcm5hbC9MYXdmdWxSZXF1aXJlbWVudEJ5U2FmZUd1YXJkQ3JlYXRlQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsMTYxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykyMDIwIENFQSBMSVNULCBDb21taXR0ZXIgTmFtZSwgYW5kIG90aGVycy4gCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLworICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICogQ29udHJpYnV0b3JzOgorICogQ0VBIExJU1QgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqIFBhdHJpY2sgVGVzc2llciAoQ0VBIExJU1QpIFBhdHJpY2sudGVzc2llckBjZWEuZnIgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnBkcDRlbmcucmVxLmdkcHJhbmFuYWx5c2lzLmludGVybmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlRyZWVJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47CitpbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLmNvbW1vbi5wcm9maWxlLnBkcDRlbmdDb21tb25HRFBSLkRhdGFTdWJqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5jb21tb24ucHJvZmlsZS5wZHA0ZW5nQ29tbW9uR0RQUi5QZXJzb25hbERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5tZXRhcmVxLkdEUFJSZXF1aXJlbWVudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLlBlcnNvbmFsRGF0YVJlcXVpcmVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5Qcm9jZXNzUmVxdWlyZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLnBkcDRlbmdSZXFHRFBSUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnN5c21sMTQucmVxdWlyZW1lbnRzLlJlcXVpcmVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLnV0aWwuVU1MVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC51dGlsLlVNTFV0aWwuU3RlcmVvdHlwZUFwcGxpY2F0aW9uSGVscGVyOworCisvKioKKyAqIENvbW1hbmQgZm9yIHRoZSBhcnRpY2xlIDYuNAorICoKKyAqLworcHVibGljIGNsYXNzIExhd2Z1bFJlcXVpcmVtZW50QnlTYWZlR3VhcmRDcmVhdGVDb21tYW5kIGV4dGVuZHMgQmFzaWNHRFBSUmVxdWlyZW1lbnRDcmVhdGVDb21tYW5kIHsKKworCXByaXZhdGUgRGF0YVN1YmplY3QgZGF0YVN1YmplY3Q7CisJcHVibGljIExhd2Z1bFJlcXVpcmVtZW50QnlTYWZlR3VhcmRDcmVhdGVDb21tYW5kKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwgRWxlbWVudCBvd25lciwgU3RyaW5nIGlkLCBTdHJpbmcgdGV4dCxQcm9jZXNzUmVxdWlyZW1lbnQgcHJvY2Vzc1JlcXVpcmVtZW50LCBEYXRhU3ViamVjdCBkYXRhU3ViamVjdCkgeworCQlzdXBlcihkb21haW4sIG93bmVyLCBpZCwgdGV4dCxwcm9jZXNzUmVxdWlyZW1lbnQpOworCQl0aGlzLmRhdGFTdWJqZWN0PSBkYXRhU3ViamVjdDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVSZXF1aXJlbWVudChQYWNrYWdlIG93bmVyLCBTdHJpbmcgaWQsIFN0cmluZyB0ZXh0KSB7CisJCVN0ZXJlb3R5cGVBcHBsaWNhdGlvbkhlbHBlciBzdGVyZW90eXBlQXBwbGljYXRpb25IZWxwZXIgPSBTdGVyZW90eXBlQXBwbGljYXRpb25IZWxwZXIuZ2V0SW5zdGFuY2UobnVsbCk7CisJCUdEUFJSZXF1aXJlbWVudHMgZ2RwclJyZXF1aWVtZW50PSBuZXcgR0RQUlJlcXVpcmVtZW50cygpOworCisJCUNsYXNzIGxhd2Z1bGxSZXEgPW51bGw7CisJCS8vMS4gbG9vayBmb3IgTGF3ZnVsUmVxdWlyZW1lbnQKKwkJbGF3ZnVsbFJlcSA9IGxvb2tGb3JMYXdGdWxsUmVxdWlyZW1lbnQob3duZXIsIGxhd2Z1bGxSZXEpOworCQlpZihwcm9jZXNzUmVxdWlyZW1lbnQuZ2V0Q29udHJpYnV0ZWRUbygpLmdldENvbnNlbnQoKSE9bnVsbCkgeworCQkJcmV0dXJuOworCQl9CisJCWlmKCBwcm9jZXNzUmVxdWlyZW1lbnQuZ2V0UGVyZm9ybUFDb250cmFjdCgpIT1udWxsKSB7CisJCQlyZXR1cm47CisJCX0KKwkJaWYoIHByb2Nlc3NSZXF1aXJlbWVudC5nZXROZWVkZWRGb3JMZWdhbE9ibGlnYXRpb24oKSE9bnVsbCkgeworCQkJcmV0dXJuOworCQl9CisJCWlmKCBwcm9jZXNzUmVxdWlyZW1lbnQuZ2V0TmVlZGVkRm9yTGVnaW1hdGVJbnRlcmVzdCgpIT1udWxsKSB7CisJCQlyZXR1cm47CisJCX0KKwkJaWYoIHByb2Nlc3NSZXF1aXJlbWVudC5nZXROZWVkZWRGb3JQdWJsaWNJbnRlcmVzdCgpIT1udWxsKSB7CisJCQlyZXR1cm47CisJCX0KKwkJaWYoIHByb2Nlc3NSZXF1aXJlbWVudC5nZXROZWVkZWRGb3JWaXRhbEludGVyZXN0KCkhPW51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCQkvL3NhZmVndWFyZCBzaGFsbCBiZSBjcmVhdGVkCisJCS8vMi4gY3JlYXRlIHRoZSBzdWIgcmVxdWlyZW1lbnQKKwkJLy8xLjEgY3JlYXRlIHRoZSBjbGFzcworCQlDbGFzcyByZXF1aXJlbWVudENsYXNzID1VTUxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzcygpOworCisJCS8vMi4xIHNldCB0aGUgb3duZXIKKwkJc2V0VGhlT3duZXIob3duZXIsIGxhd2Z1bGxSZXEsIHJlcXVpcmVtZW50Q2xhc3MpOworCQkvLzMuIGFwcGx5IHRoZSBzdGVyZW90eXBlCisJCXN0ZXJlb3R5cGVBcHBsaWNhdGlvbkhlbHBlci5hcHBseVN0ZXJlb3R5cGUocmVxdWlyZW1lbnRDbGFzcyxvcmcuZWNsaXBzZS5wYXB5cnVzLnN5c21sMTQucmVxdWlyZW1lbnRzLlJlcXVpcmVtZW50c1BhY2thZ2UuZUlOU1RBTkNFLmdldFJlcXVpcmVtZW50KCksbnVsbCApOworCQlSZXF1aXJlbWVudCByZXFTdGVyZW90eXBlPSAoUmVxdWlyZW1lbnQpVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24ocmVxdWlyZW1lbnRDbGFzcywgUmVxdWlyZW1lbnQuY2xhc3MpOworCQlzdGVyZW90eXBlQXBwbGljYXRpb25IZWxwZXIuYXBwbHlTdGVyZW90eXBlKHJlcXVpcmVtZW50Q2xhc3MscGRwNGVuZ1JlcUdEUFJQYWNrYWdlLmVJTlNUQU5DRS5nZXRMYXdmdWxsQnlTYWZlR3VhcmQoKSxudWxsICk7CisJCW9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5MYXdmdWxsQnlTYWZlR3VhcmQgbGF3ZnVsbEJ5U2FmZUd1YXJkPSAob3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLkxhd2Z1bGxCeVNhZmVHdWFyZClVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbihyZXF1aXJlbWVudENsYXNzLCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuTGF3ZnVsbEJ5U2FmZUd1YXJkLmNsYXNzKTsKKwkJLy80LiBzZXQgYXR0cmlidXRlIG9mIHRoZSBhcHBsaWVkIHN0ZXJlb3R5cGUKKwkJc2V0QXR0cmlidXRlQXBwbGllZFN0ZXJlb3R5cGUoZ2RwclJyZXF1aWVtZW50LCByZXFTdGVyZW90eXBlLCBsYXdmdWxsQnlTYWZlR3VhcmQpOworCQkvLzUuc2V0IHRoZSBJRAorCQlzZXRUaGVJRChpZCwgbGF3ZnVsbFJlcSwgcmVxdWlyZW1lbnRDbGFzcywgcmVxU3RlcmVvdHlwZSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldEF0dHJpYnV0ZUFwcGxpZWRTdGVyZW90eXBlKEdEUFJSZXF1aXJlbWVudHMgZ2RwclJyZXF1aWVtZW50LCBSZXF1aXJlbWVudCByZXFTdGVyZW90eXBlLCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuTGF3ZnVsbEJ5U2FmZUd1YXJkIGxhd2Z1bGxCeVNhZmVHdWFyZCkgeworCQlsYXdmdWxsQnlTYWZlR3VhcmQuc2V0RGF0YVN1YmplY3QoZGF0YVN1YmplY3QpOworCQlmb3IgKFBlcnNvbmFsRGF0YSBwZXJzb25hbERhdGEgOiBwcm9jZXNzUmVxdWlyZW1lbnQuZ2V0UGVyc29uYWxkYXRhKCkpIHsKKwkJCWxhd2Z1bGxCeVNhZmVHdWFyZC5nZXRQZXJzb25hbERhdGEoKS5hZGQoKFBlcnNvbmFsRGF0YVJlcXVpcmVtZW50KSBwZXJzb25hbERhdGEpOworCQl9CisJCWxhd2Z1bGxCeVNhZmVHdWFyZC5zZXRQcm9jZXNzKHRoaXMucHJvY2Vzc1JlcXVpcmVtZW50KTsKKwkJcmVxU3RlcmVvdHlwZS5zZXRUZXh0KCIiK2dkcHJScmVxdWllbWVudC5nZXREZXNjcmlwdGlvbkZvckxhd2Z1bEJ5U2FmZUd1YXJkKGxhd2Z1bGxCeVNhZmVHdWFyZCkpOworCX0KKworCS8qKgorCSAqIHNldCB0aGUgaWQgb2YgdGhlIHJlcXVpcmVtZW50CisJICogQHBhcmFtIGlkCisJICogQHBhcmFtIGxhd2Z1bGxSZXEKKwkgKiBAcGFyYW0gcmVxdWlyZW1lbnRDbGFzcworCSAqIEBwYXJhbSByZXFTdGVyZW90eXBlCisJICovCisJcHJpdmF0ZSB2b2lkIHNldFRoZUlEKFN0cmluZyBpZCwgQ2xhc3MgbGF3ZnVsbFJlcSwgQ2xhc3MgcmVxdWlyZW1lbnRDbGFzcywgUmVxdWlyZW1lbnQgcmVxU3RlcmVvdHlwZSkgeworCQlpZihsYXdmdWxsUmVxPT1udWxsKSB7CisJCQlyZXFTdGVyZW90eXBlLnNldElkKGlkKTsKKwkJCXJlcXVpcmVtZW50Q2xhc3Muc2V0TmFtZShpZCk7CisJCX0KKwkJZWxzZSB7CisJCQlyZXFTdGVyZW90eXBlLnNldElkKGxhd2Z1bGxSZXEuZ2V0TmFtZSgpKyIuIitsYXdmdWxsUmVxLmdldE5lc3RlZENsYXNzaWZpZXJzKCkuc2l6ZSgpKTsKKwkJCXJlcXVpcmVtZW50Q2xhc3Muc2V0TmFtZShsYXdmdWxsUmVxLmdldE5hbWUoKSsiLiIrbGF3ZnVsbFJlcS5nZXROZXN0ZWRDbGFzc2lmaWVycygpLnNpemUoKSk7CisJCX0KKwl9CisKKwkvKiogdFNldCB0aGUgb3duZXIgdGhlIG9mIHRoZSByZXF1aXJlbWVudAorCSAqIAorCSAqIEBwYXJhbSBvd25lcgorCSAqIEBwYXJhbSBsYXdmdWxsUmVxCisJICogQHBhcmFtIHJlcXVpcmVtZW50Q2xhc3MKKwkgKi8KKwlwcml2YXRlIHZvaWQgc2V0VGhlT3duZXIoUGFja2FnZSBvd25lciwgQ2xhc3MgbGF3ZnVsbFJlcSwgQ2xhc3MgcmVxdWlyZW1lbnRDbGFzcykgeworCQlpZihsYXdmdWxsUmVxPT1udWxsKSB7CisJCQlvd25lci5nZXRQYWNrYWdlZEVsZW1lbnRzKCkuYWRkKHJlcXVpcmVtZW50Q2xhc3MpOworCQl9CisJCWVsc2UgeworCQkJbGF3ZnVsbFJlcS5nZXROZXN0ZWRDbGFzc2lmaWVycygpLmFkZChyZXF1aXJlbWVudENsYXNzKTsKKworCQl9CisJfQorCisJLyoqCisJICogbG9vayBmb3IgbGF3ZnVsbCByZXF1aXJlbWVudCB0aGF0IGNvdWxkIGJlIHRoZSBvd25lcgorCSAqIEBwYXJhbSBvd25lcgorCSAqIEBwYXJhbSBsYXdmdWxsUmVxCisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgQ2xhc3MgbG9va0Zvckxhd0Z1bGxSZXF1aXJlbWVudChQYWNrYWdlIG93bmVyLCBDbGFzcyBsYXdmdWxsUmVxKSB7CisJCVRyZWVJdGVyYXRvcjxFT2JqZWN0PiBpdGVyYXRvcj0gb3duZXIuZUFsbENvbnRlbnRzKCk7CisJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7CisJCQkvL3Rlc3QgaWYgaXMgaXMgYSBjbGFzcworCQkJaWYgKGVPYmplY3QgaW5zdGFuY2VvZiBDbGFzcykgeworCQkJCUNsYXNzIGFjbGFzcz0oQ2xhc3MpZU9iamVjdDsKKwkJCQlvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuTGF3ZnVsIGxhd2Z1bD0gKG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5MYXdmdWwpVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24oYWNsYXNzLCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuTGF3ZnVsLmNsYXNzKTsKKwkJCQkvLyB0ZXN0IGlmIHRoaXMgaXMgYSBsYXdmdWxsIHJlcS4KKwkJCQlpZiggbGF3ZnVsIT1udWxsKSB7CisJCQkJCS8vdGVzdCBhdHRyaWJ1dGVzCisJCQkJCWlmKGxhd2Z1bC5nZXRQcm9jZXNzKCkuZXF1YWxzKHRoaXMucHJvY2Vzc1JlcXVpcmVtZW50KSAmJiBsYXdmdWwuZ2V0RGF0YVN1YmplY3QoKS5lcXVhbHModGhpcy5kYXRhU3ViamVjdCkpIHsKKwkJCQkJCWxhd2Z1bGxSZXE9KENsYXNzKWxhd2Z1bC5nZXRCYXNlX05hbWVkRWxlbWVudCgpOworCQkJCQkJcmV0dXJuIGxhd2Z1bGxSZXE7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJfQorCQlyZXR1cm4gbGF3ZnVsbFJlcTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvcmVxL29yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEuZ2RwcmFuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3BkcDRlbmcvcmVxL2dkcHJhbmFuYWx5c2lzL2ludGVybmFsL0xhd2Z1bFJlcXVpcmVtZW50QnlWaXRhbEludGVyZXN0Q3JlYXRlQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9yZXEvb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5nZHByYW5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcGRwNGVuZy9yZXEvZ2RwcmFuYW5hbHlzaXMvaW50ZXJuYWwvTGF3ZnVsUmVxdWlyZW1lbnRCeVZpdGFsSW50ZXJlc3RDcmVhdGVDb21tYW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYxZDkxYwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvcmVxL29yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEuZ2RwcmFuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3BkcDRlbmcvcmVxL2dkcHJhbmFuYWx5c2lzL2ludGVybmFsL0xhd2Z1bFJlcXVpcmVtZW50QnlWaXRhbEludGVyZXN0Q3JlYXRlQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKTIwMjAgQ0VBIExJU1QsIENvbW1pdHRlciBOYW1lLCBhbmQgb3RoZXJzLiAKKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBDRUEgTElTVCAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogUGF0cmljayBUZXNzaWVyIChDRUEgTElTVCkgUGF0cmljay50ZXNzaWVyQGNlYS5mciAKKyAqIEdhYnJpZWwgUGVkcm96YSAoQ0VBIExJU1QpIGdhYnJpZWwucGVkcm96YUBjZWEuZnIgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnBkcDRlbmcucmVxLmdkcHJhbmFuYWx5c2lzLmludGVybmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5jb21tb24ucHJvZmlsZS5wZHA0ZW5nQ29tbW9uR0RQUi5EYXRhU3ViamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcuY29tbW9uLnByb2ZpbGUucGRwNGVuZ0NvbW1vbkdEUFIuVml0YWxJbnRlcmVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLm1ldGFyZXEuR0RQUlJlcXVpcmVtZW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuTGF3ZnVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5MYXdmdWxCeVZpdGFsSW50ZXJlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLlByb2Nlc3NSZXF1aXJlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIucGRwNGVuZ1JlcUdEUFJQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMuc3lzbWwxNC5yZXF1aXJlbWVudHMuUmVxdWlyZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC51dGlsLlVNTFV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwudXRpbC5VTUxVdGlsLlN0ZXJlb3R5cGVBcHBsaWNhdGlvbkhlbHBlcjsKKworLyoqCisgKiBjb21tYW5kIGZvciA2LjEuZAorICoKKyAqLworcHVibGljIGNsYXNzIExhd2Z1bFJlcXVpcmVtZW50QnlWaXRhbEludGVyZXN0Q3JlYXRlQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0TGF3ZnVsUmVxdWlyZW1lbnRCeUNyZWF0ZUNvbW1hbmR7CisKKwlwdWJsaWMgTGF3ZnVsUmVxdWlyZW1lbnRCeVZpdGFsSW50ZXJlc3RDcmVhdGVDb21tYW5kKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwgRWxlbWVudCBvd25lciwgU3RyaW5nIGlkLCBTdHJpbmcgdGV4dCxQcm9jZXNzUmVxdWlyZW1lbnQgcHJvY2Vzc1JlcXVpcmVtZW50LCBEYXRhU3ViamVjdCBkYXRhU3ViamVjdCkgeworCQlzdXBlcihkb21haW4sIG93bmVyLCBpZCwgdGV4dCxwcm9jZXNzUmVxdWlyZW1lbnQsIGRhdGFTdWJqZWN0KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgT2JqZWN0IGdldExhd2Z1bE9iamVjdChQcm9jZXNzUmVxdWlyZW1lbnQgcHJvY2VzcykgeworCQlyZXR1cm4gcHJvY2Vzcy5nZXROZWVkZWRGb3JWaXRhbEludGVyZXN0KCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VGV4dE9uUmVxdWlyZW1lbnQoR0RQUlJlcXVpcmVtZW50cyBnZHByUnJlcXVpZW1lbnQsUmVxdWlyZW1lbnQgcmVxU3RlcmVvdHlwZSwgRU9iamVjdCBsYXdmdWxCeSkgeworCQlpZiggbGF3ZnVsQnkgaW5zdGFuY2VvZiBMYXdmdWxCeVZpdGFsSW50ZXJlc3QpIHsKKwkJCUxhd2Z1bEJ5Vml0YWxJbnRlcmVzdCBsYXdmdWxCeVZpdGFsSW50ZXJlc3QgPSAoTGF3ZnVsQnlWaXRhbEludGVyZXN0KSBsYXdmdWxCeTsKKwkJCXJlcVN0ZXJlb3R5cGUuc2V0VGV4dCgiIitnZHByUnJlcXVpZW1lbnQuZ2V0RGVzY3JpcHRpb25Gb3JMYXdmdWxCeVZpdGFsSW50ZXJlc3QobGF3ZnVsQnlWaXRhbEludGVyZXN0KSk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBhc3NvY2lhdGVMYXdmdWxPYmplY3RUb0FwcGxpZWRTdGVyZW90eXBlKEVPYmplY3QgbGF3ZnVsQnksIE9iamVjdCBsYXdmdWxPYmplY3QpIHsKKwkJaWYoIGxhd2Z1bEJ5IGluc3RhbmNlb2YgTGF3ZnVsQnlWaXRhbEludGVyZXN0KSB7CisJCQlMYXdmdWxCeVZpdGFsSW50ZXJlc3QgbGF3ZnVsQnlWaXRhbEludGVyZXN0ID0gKExhd2Z1bEJ5Vml0YWxJbnRlcmVzdCkgbGF3ZnVsQnk7CisJCQlsYXdmdWxCeVZpdGFsSW50ZXJlc3Quc2V0Vml0YWxJbnRlcmVzdCgoVml0YWxJbnRlcmVzdClsYXdmdWxPYmplY3QpOworCQl9CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgTGF3ZnVsIGFwcGx5U3RlcmVvdHlwZShTdGVyZW90eXBlQXBwbGljYXRpb25IZWxwZXIgc3RlcmVvdHlwZUFwcGxpY2F0aW9uSGVscGVyLCBDbGFzcyByZXF1aXJlbWVudENsYXNzKSB7CisJCXN0ZXJlb3R5cGVBcHBsaWNhdGlvbkhlbHBlci5hcHBseVN0ZXJlb3R5cGUocmVxdWlyZW1lbnRDbGFzcywgcGRwNGVuZ1JlcUdEUFJQYWNrYWdlLmVJTlNUQU5DRS5nZXRMYXdmdWxCeUxlZ2l0aW1hdGVJbnRlcmVzdCgpLG51bGwpOworCQlyZXR1cm4gVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24ocmVxdWlyZW1lbnRDbGFzcywgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLkxhd2Z1bEJ5Vml0YWxJbnRlcmVzdC5jbGFzcyk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvcmVxL29yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEuZ2RwcmFuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3BkcDRlbmcvcmVxL2dkcHJhbmFuYWx5c2lzL2ludGVybmFsL1JlcXVpcmVtZW50VGVzdEdlbmVyYXRvckltcGwuamF2YSBiL3BsdWdpbnMvcmVxL29yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEuZ2RwcmFuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3BkcDRlbmcvcmVxL2dkcHJhbmFuYWx5c2lzL2ludGVybmFsL1JlcXVpcmVtZW50VGVzdEdlbmVyYXRvckltcGwuamF2YQppbmRleCA0YjljYjhjLi5hY2I0YTMwIDEwMDY0NAotLS0gYS9wbHVnaW5zL3JlcS9vcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLmdkcHJhbmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wZHA0ZW5nL3JlcS9nZHByYW5hbmFseXNpcy9pbnRlcm5hbC9SZXF1aXJlbWVudFRlc3RHZW5lcmF0b3JJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9yZXEvb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5nZHByYW5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcGRwNGVuZy9yZXEvZ2RwcmFuYW5hbHlzaXMvaW50ZXJuYWwvUmVxdWlyZW1lbnRUZXN0R2VuZXJhdG9ySW1wbC5qYXZhCkBAIC0zMDEsMzEgKzMwMSwxNTEgQEAKIAogCUBPdmVycmlkZQogCXB1YmxpYyBDb21tYW5kIGdlbmVyYXRlQXJ0aWNsZTYxYyhUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4sIFBhY2thZ2Ugb3duZXIpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKKwkJQ29tcG91bmRDb21tYW5kIGNvbXBvdW5kQ29tbWFuZD0gbmV3IENvbXBvdW5kQ29tbWFuZCgpOworCQlJdGVyYXRvcjxFT2JqZWN0PiBpdGVyYXRvcj1vd25lci5lQWxsQ29udGVudHMoKTsKKworCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgaXRlcmF0b3IubmV4dCgpOworCQkJaWYoIGVPYmplY3QgIGluc3RhbmNlb2YgTmFtZWRFbGVtZW50KSB7CisJCQkJTmFtZWRFbGVtZW50IG5hbWVkRWxlbWVudD0gKE5hbWVkRWxlbWVudCllT2JqZWN0OworCQkJCVByb2Nlc3NSZXF1aXJlbWVudCBwcm9jZXNzUmVxdWlyZW1lbnQ9IChQcm9jZXNzUmVxdWlyZW1lbnQpVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24obmFtZWRFbGVtZW50LCBQcm9jZXNzUmVxdWlyZW1lbnQuY2xhc3MpOworCQkJCWlmIChwcm9jZXNzUmVxdWlyZW1lbnQhPW51bGwpIHsKKwkJCQkJSGFzaFNldDxEYXRhU3ViamVjdD4gZGF0YVN1YmplY3RMaXN0PW5ldyBIYXNoU2V0PD4oKTsKKwkJCQkJZm9yIChQZXJzb25hbERhdGEgcGVyc29uYWxEYXRhIDogcHJvY2Vzc1JlcXVpcmVtZW50LmdldFBlcnNvbmFsZGF0YSgpKSB7CisJCQkJCQlkYXRhU3ViamVjdExpc3QuYWRkQWxsKHBlcnNvbmFsRGF0YS5nZXRSZWxhdGVkVG8oKSk7CisJCQkJCX0KKwkJCQkJZm9yIChEYXRhU3ViamVjdCBkYXRhU3ViamVjdCA6IGRhdGFTdWJqZWN0TGlzdCkgeworCQkJCQkJaW5kZXgrKzsKKwkJCQkJCVN0cmluZyBpZCA9IHByZWZpeCtpbmRleDsKKwkJCQkJCUNvbW1hbmQgY21kPW5ldyBMYXdmdWxSZXF1aXJlbWVudEJ5TGVnYWxPYmxpZ2F0aW9uQ3JlYXRlQ29tbWFuZChkb21haW4sIGxvb2tGb3JHZW5lcmF0ZWRyZXF1aXJlbWVudFBhY2thZ2Uob3duZXIpLCBpZCwgIiIscHJvY2Vzc1JlcXVpcmVtZW50LCBkYXRhU3ViamVjdCk7CisJCQkJCQljb21wb3VuZENvbW1hbmQuYXBwZW5kKGNtZCk7CisJCQkJCX0KKworCisJCQkJfQorCQkJfQorCisJCX0KKwkJcmV0dXJuIGNvbXBvdW5kQ29tbWFuZDsKIAl9CiAKIAlAT3ZlcnJpZGUKIAlwdWJsaWMgQ29tbWFuZCBnZW5lcmF0ZUFydGljbGU2MWQoVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluLCBQYWNrYWdlIG93bmVyKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7CisJCUNvbXBvdW5kQ29tbWFuZCBjb21wb3VuZENvbW1hbmQ9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKKwkJSXRlcmF0b3I8RU9iamVjdD4gaXRlcmF0b3I9b3duZXIuZUFsbENvbnRlbnRzKCk7CisKKwkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKKwkJCWlmKCBlT2JqZWN0ICBpbnN0YW5jZW9mIE5hbWVkRWxlbWVudCkgeworCQkJCU5hbWVkRWxlbWVudCBuYW1lZEVsZW1lbnQ9IChOYW1lZEVsZW1lbnQpZU9iamVjdDsKKwkJCQlQcm9jZXNzUmVxdWlyZW1lbnQgcHJvY2Vzc1JlcXVpcmVtZW50PSAoUHJvY2Vzc1JlcXVpcmVtZW50KVVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKG5hbWVkRWxlbWVudCwgUHJvY2Vzc1JlcXVpcmVtZW50LmNsYXNzKTsKKwkJCQlpZiAocHJvY2Vzc1JlcXVpcmVtZW50IT1udWxsKSB7CisJCQkJCUhhc2hTZXQ8RGF0YVN1YmplY3Q+IGRhdGFTdWJqZWN0TGlzdD1uZXcgSGFzaFNldDw+KCk7CisJCQkJCWZvciAoUGVyc29uYWxEYXRhIHBlcnNvbmFsRGF0YSA6IHByb2Nlc3NSZXF1aXJlbWVudC5nZXRQZXJzb25hbGRhdGEoKSkgeworCQkJCQkJZGF0YVN1YmplY3RMaXN0LmFkZEFsbChwZXJzb25hbERhdGEuZ2V0UmVsYXRlZFRvKCkpOworCQkJCQl9CisJCQkJCWZvciAoRGF0YVN1YmplY3QgZGF0YVN1YmplY3QgOiBkYXRhU3ViamVjdExpc3QpIHsKKwkJCQkJCWluZGV4Kys7CisJCQkJCQlTdHJpbmcgaWQgPSBwcmVmaXgraW5kZXg7CisJCQkJCQlDb21tYW5kIGNtZD1uZXcgTGF3ZnVsUmVxdWlyZW1lbnRCeVZpdGFsSW50ZXJlc3RDcmVhdGVDb21tYW5kKGRvbWFpbiwgbG9va0ZvckdlbmVyYXRlZHJlcXVpcmVtZW50UGFja2FnZShvd25lciksIGlkLCAiIixwcm9jZXNzUmVxdWlyZW1lbnQsIGRhdGFTdWJqZWN0KTsKKwkJCQkJCWNvbXBvdW5kQ29tbWFuZC5hcHBlbmQoY21kKTsKKwkJCQkJfQorCisKKwkJCQl9CisJCQl9CisKKwkJfQorCQlyZXR1cm4gY29tcG91bmRDb21tYW5kOwogCX0KIAogCUBPdmVycmlkZQogCXB1YmxpYyBDb21tYW5kIGdlbmVyYXRlQXJ0aWNsZTYxZShUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4sIFBhY2thZ2Ugb3duZXIpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKKwkJQ29tcG91bmRDb21tYW5kIGNvbXBvdW5kQ29tbWFuZD0gbmV3IENvbXBvdW5kQ29tbWFuZCgpOworCQlJdGVyYXRvcjxFT2JqZWN0PiBpdGVyYXRvcj1vd25lci5lQWxsQ29udGVudHMoKTsKKworCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgaXRlcmF0b3IubmV4dCgpOworCQkJaWYoIGVPYmplY3QgIGluc3RhbmNlb2YgTmFtZWRFbGVtZW50KSB7CisJCQkJTmFtZWRFbGVtZW50IG5hbWVkRWxlbWVudD0gKE5hbWVkRWxlbWVudCllT2JqZWN0OworCQkJCVByb2Nlc3NSZXF1aXJlbWVudCBwcm9jZXNzUmVxdWlyZW1lbnQ9IChQcm9jZXNzUmVxdWlyZW1lbnQpVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24obmFtZWRFbGVtZW50LCBQcm9jZXNzUmVxdWlyZW1lbnQuY2xhc3MpOworCQkJCWlmIChwcm9jZXNzUmVxdWlyZW1lbnQhPW51bGwpIHsKKwkJCQkJSGFzaFNldDxEYXRhU3ViamVjdD4gZGF0YVN1YmplY3RMaXN0PW5ldyBIYXNoU2V0PD4oKTsKKwkJCQkJZm9yIChQZXJzb25hbERhdGEgcGVyc29uYWxEYXRhIDogcHJvY2Vzc1JlcXVpcmVtZW50LmdldFBlcnNvbmFsZGF0YSgpKSB7CisJCQkJCQlkYXRhU3ViamVjdExpc3QuYWRkQWxsKHBlcnNvbmFsRGF0YS5nZXRSZWxhdGVkVG8oKSk7CisJCQkJCX0KKwkJCQkJZm9yIChEYXRhU3ViamVjdCBkYXRhU3ViamVjdCA6IGRhdGFTdWJqZWN0TGlzdCkgeworCQkJCQkJaW5kZXgrKzsKKwkJCQkJCVN0cmluZyBpZCA9IHByZWZpeCtpbmRleDsKKwkJCQkJCUNvbW1hbmQgY21kPW5ldyBMYXdmdWxSZXF1aXJlbWVudEJ5UHVibGljSW50ZXJlc3RDcmVhdGVDb21tYW5kKGRvbWFpbiwgbG9va0ZvckdlbmVyYXRlZHJlcXVpcmVtZW50UGFja2FnZShvd25lciksIGlkLCAiIixwcm9jZXNzUmVxdWlyZW1lbnQsIGRhdGFTdWJqZWN0KTsKKwkJCQkJCWNvbXBvdW5kQ29tbWFuZC5hcHBlbmQoY21kKTsKKwkJCQkJfQorCisKKwkJCQl9CisJCQl9CisKKwkJfQorCQlyZXR1cm4gY29tcG91bmRDb21tYW5kOwogCX0KIAogCUBPdmVycmlkZQogCXB1YmxpYyBDb21tYW5kIGdlbmVyYXRlQXJ0aWNsZTYxZihUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4sIFBhY2thZ2Ugb3duZXIpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKKwkJQ29tcG91bmRDb21tYW5kIGNvbXBvdW5kQ29tbWFuZD0gbmV3IENvbXBvdW5kQ29tbWFuZCgpOworCQlJdGVyYXRvcjxFT2JqZWN0PiBpdGVyYXRvcj1vd25lci5lQWxsQ29udGVudHMoKTsKKworCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgaXRlcmF0b3IubmV4dCgpOworCQkJaWYoIGVPYmplY3QgIGluc3RhbmNlb2YgTmFtZWRFbGVtZW50KSB7CisJCQkJTmFtZWRFbGVtZW50IG5hbWVkRWxlbWVudD0gKE5hbWVkRWxlbWVudCllT2JqZWN0OworCQkJCVByb2Nlc3NSZXF1aXJlbWVudCBwcm9jZXNzUmVxdWlyZW1lbnQ9IChQcm9jZXNzUmVxdWlyZW1lbnQpVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24obmFtZWRFbGVtZW50LCBQcm9jZXNzUmVxdWlyZW1lbnQuY2xhc3MpOworCQkJCWlmIChwcm9jZXNzUmVxdWlyZW1lbnQhPW51bGwpIHsKKwkJCQkJSGFzaFNldDxEYXRhU3ViamVjdD4gZGF0YVN1YmplY3RMaXN0PW5ldyBIYXNoU2V0PD4oKTsKKwkJCQkJZm9yIChQZXJzb25hbERhdGEgcGVyc29uYWxEYXRhIDogcHJvY2Vzc1JlcXVpcmVtZW50LmdldFBlcnNvbmFsZGF0YSgpKSB7CisJCQkJCQlkYXRhU3ViamVjdExpc3QuYWRkQWxsKHBlcnNvbmFsRGF0YS5nZXRSZWxhdGVkVG8oKSk7CisJCQkJCX0KKwkJCQkJZm9yIChEYXRhU3ViamVjdCBkYXRhU3ViamVjdCA6IGRhdGFTdWJqZWN0TGlzdCkgeworCQkJCQkJaW5kZXgrKzsKKwkJCQkJCVN0cmluZyBpZCA9IHByZWZpeCtpbmRleDsKKwkJCQkJCUNvbW1hbmQgY21kPW5ldyBMYXdmdWxSZXF1aXJlbWVudEJ5TGVnaXRpbWF0ZUludGVyZXN0Q3JlYXRlQ29tbWFuZChkb21haW4sIGxvb2tGb3JHZW5lcmF0ZWRyZXF1aXJlbWVudFBhY2thZ2Uob3duZXIpLCBpZCwgIiIscHJvY2Vzc1JlcXVpcmVtZW50LCBkYXRhU3ViamVjdCk7CisJCQkJCQljb21wb3VuZENvbW1hbmQuYXBwZW5kKGNtZCk7CisJCQkJCX0KKworCisJCQkJfQorCQkJfQorCisJCX0KKwkJcmV0dXJuIGNvbXBvdW5kQ29tbWFuZDsKIAl9CiAKIAlAT3ZlcnJpZGUKIAlwdWJsaWMgQ29tbWFuZCBnZW5lcmF0ZUFydGljbGU2NChUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4sIFBhY2thZ2Ugb3duZXIpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKKwkJQ29tcG91bmRDb21tYW5kIGNvbXBvdW5kQ29tbWFuZD0gbmV3IENvbXBvdW5kQ29tbWFuZCgpOworCQlJdGVyYXRvcjxFT2JqZWN0PiBpdGVyYXRvcj1vd25lci5lQWxsQ29udGVudHMoKTsKKworCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgaXRlcmF0b3IubmV4dCgpOworCQkJaWYoIGVPYmplY3QgIGluc3RhbmNlb2YgTmFtZWRFbGVtZW50KSB7CisJCQkJTmFtZWRFbGVtZW50IG5hbWVkRWxlbWVudD0gKE5hbWVkRWxlbWVudCllT2JqZWN0OworCQkJCVByb2Nlc3NSZXF1aXJlbWVudCBwcm9jZXNzUmVxdWlyZW1lbnQ9IChQcm9jZXNzUmVxdWlyZW1lbnQpVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24obmFtZWRFbGVtZW50LCBQcm9jZXNzUmVxdWlyZW1lbnQuY2xhc3MpOworCQkJCWlmIChwcm9jZXNzUmVxdWlyZW1lbnQhPW51bGwpIHsKKwkJCQkJSGFzaFNldDxEYXRhU3ViamVjdD4gZGF0YVN1YmplY3RMaXN0PW5ldyBIYXNoU2V0PD4oKTsKKwkJCQkJZm9yIChQZXJzb25hbERhdGEgcGVyc29uYWxEYXRhIDogcHJvY2Vzc1JlcXVpcmVtZW50LmdldFBlcnNvbmFsZGF0YSgpKSB7CisJCQkJCQlkYXRhU3ViamVjdExpc3QuYWRkQWxsKHBlcnNvbmFsRGF0YS5nZXRSZWxhdGVkVG8oKSk7CisJCQkJCX0KKwkJCQkJZm9yIChEYXRhU3ViamVjdCBkYXRhU3ViamVjdCA6IGRhdGFTdWJqZWN0TGlzdCkgeworCQkJCQkJaW5kZXgrKzsKKwkJCQkJCVN0cmluZyBpZCA9IHByZWZpeCtpbmRleDsKKwkJCQkJCUNvbW1hbmQgY21kPW5ldyBMYXdmdWxSZXF1aXJlbWVudEJ5U2FmZUd1YXJkQ3JlYXRlQ29tbWFuZChkb21haW4sIGxvb2tGb3JHZW5lcmF0ZWRyZXF1aXJlbWVudFBhY2thZ2Uob3duZXIpLCBpZCwgIiIscHJvY2Vzc1JlcXVpcmVtZW50LCBkYXRhU3ViamVjdCk7CisJCQkJCQljb21wb3VuZENvbW1hbmQuYXBwZW5kKGNtZCk7CisJCQkJCX0KKworCisJCQkJfQorCQkJfQorCisJCX0KKwkJcmV0dXJuIGNvbXBvdW5kQ29tbWFuZDsKIAl9CiB9CmRpZmYgLS1naXQgYS9wbHVnaW5zL3JlcS9vcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLm1ldGFyZXEvc3JjL29yZy9lY2xpcHNlL3BhcHlydXMvcGRwNGVuZy9yZXEvbWV0YXJlcS9HRFBSUmVxdWlyZW1lbnRzLnh0ZW5kIGIvcGx1Z2lucy9yZXEvb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5tZXRhcmVxL3NyYy9vcmcvZWNsaXBzZS9wYXB5cnVzL3BkcDRlbmcvcmVxL21ldGFyZXEvR0RQUlJlcXVpcmVtZW50cy54dGVuZAppbmRleCAzMWI2NDUzLi40NjZlNjdhIDEwMDY0NAotLS0gYS9wbHVnaW5zL3JlcS9vcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLm1ldGFyZXEvc3JjL29yZy9lY2xpcHNlL3BhcHlydXMvcGRwNGVuZy9yZXEvbWV0YXJlcS9HRFBSUmVxdWlyZW1lbnRzLnh0ZW5kCisrKyBiL3BsdWdpbnMvcmVxL29yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEubWV0YXJlcS9zcmMvb3JnL2VjbGlwc2UvcGFweXJ1cy9wZHA0ZW5nL3JlcS9tZXRhcmVxL0dEUFJSZXF1aXJlbWVudHMueHRlbmQKQEAgLTI2LDEzICsyNiwyMSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5EYXRhTWluaW1pc2F0aW9uCiBpbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLkxhd2Z1bEJ5Q29uc2VudAogaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5MYXdmdWxCeUNvbnRyYWN0CitpbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLkxhd2Z1bEJ5TGVnYWxPYmxpZ2F0aW9uCitpbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLmNvbW1vbi5wcm9maWxlLnBkcDRlbmdDb21tb25HRFBSLlZpdGFsSW50ZXJlc3QKK2ltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcuY29tbW9uLnByb2ZpbGUucGRwNGVuZ0NvbW1vbkdEUFIuUHVibGljSW50ZXJlc3QKK2ltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcuY29tbW9uLnByb2ZpbGUucGRwNGVuZ0NvbW1vbkdEUFIuTGVnaXRpbWF0ZUludGVyZXN0CitpbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLkxhd2Z1bEJ5Vml0YWxJbnRlcmVzdAoraW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5MYXdmdWxCeVB1YmxpY0ludGVyZXN0CitpbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLkxhd2Z1bEJ5TGVnaXRpbWF0ZUludGVyZXN0CitpbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLkxhd2Z1bGxCeVNhZmVHdWFyZAogCiBjbGFzcyBHRFBSUmVxdWlyZW1lbnRzIHsKIAkvKioKIAkgKiBnZXQgRGVzY3JpcHRpb24gZm9yIGxhd2Z1bGwgcmVxdWlyZW1lbnRzIGZyb20gcnRpY2xlNS4xCiAJICovCiAJIGRlZiBnZXREZXNjcmlwdGlvbkZvckxhd2Z1bFJlcXVpcmVtZW50KExhd2Z1bCBsYXdmdWwpewotCSAJJycnSUYgcHJvY2VzcyAiq2xhd2Z1bC5wcm9jZXNzLmJhc2VfTmFtZWRFbGVtZW50Lm5hbWW7IiBwcm9jZXNzZXMgIqtnZXRQZXJzb25hbERhdGFGcm9tUHJvY2VzcyhsYXdmdWwpuyIgb2YgIqtsYXdmdWwuZGF0YVN1YmplY3QuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIFRIRU4gdGhlIFByb2Nlc3MgIqtsYXdmdWwucHJvY2Vzcy5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgc2hhbGwgYmUgbGF3ZnVsbC4nJycKKwkgCScnJ0lGIHByb2Nlc3MgOiKrbGF3ZnVsLnByb2Nlc3MuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIHByb2Nlc3NlcyA6IqtnZXRQZXJzb25hbERhdGFGcm9tUHJvY2VzcyhsYXdmdWwpuyIgb2YgOiKrbGF3ZnVsLmRhdGFTdWJqZWN0LmJhc2VfTmFtZWRFbGVtZW50Lm5hbWW7IiBUSEVOIHRoZSBQcm9jZXNzIDoiq2xhd2Z1bC5wcm9jZXNzLmJhc2VfTmFtZWRFbGVtZW50Lm5hbWW7IiBzaGFsbCBiZSBsYXdmdWxsLicnJwogCSB9CiAJIAogCSAKQEAgLTQxLDIxICs0OSwyMSBAQAogCSAqLwogCSBkZWYgZ2V0RGVzY3JpcHRpb25Gb3JGYWlybHlSZXF1aXJlbWVudChGYWlybHkgZmFpcmx5KXsKIAkgCQotCSAJJycnSUYgcHJvY2VzcyAiq2ZhaXJseS5wcm9jZXNzLmJhc2VfTmFtZWRFbGVtZW50Lm5hbWW7IiBwcm9jZXNzZXMgIqtnZXRQZXJzb25hbERhdGFGcm9tUHJvY2VzcyhmYWlybHkpuyIgb2YgIqtmYWlybHkuZGF0YVN1YmplY3QuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIFRIRU4gdGhlIFByb2Nlc3MgIqtmYWlybHkucHJvY2Vzcy5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgc2hhbGwgYmUgZmFpcmx5LicnJworCSAJJycnSUYgcHJvY2VzcyA6IqtmYWlybHkucHJvY2Vzcy5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgcHJvY2Vzc2VzIDoiq2dldFBlcnNvbmFsRGF0YUZyb21Qcm9jZXNzKGZhaXJseSm7IiBvZiA6IqtmYWlybHkuZGF0YVN1YmplY3QuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIFRIRU4gdGhlIFByb2Nlc3MgOiKrZmFpcmx5LnByb2Nlc3MuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIHNoYWxsIGJlIGZhaXJseS4nJycKIAkgfQogCSAvKioKIAkgKiBnZXQgRGVzY3JpcHRpb24gZm9yIHRyYW5zcGFyZW50IHJlcXVpcmVtZW50cyBmcm9tIGFydGljbGU1LjEKIAkgKi8KIAkgZGVmIGdldERlc2NyaXB0aW9uRm9yVHJhbnNwYXJlbnRSZXF1aXJlbWVudChUcmFuc3BhcmVuY3kgdHJhbnNwYXJlbmN5KXsKIAkgCQotCSAJJycnSUYgcHJvY2VzcyAiq3RyYW5zcGFyZW5jeS5wcm9jZXNzLmJhc2VfTmFtZWRFbGVtZW50Lm5hbWW7IiBwcm9jZXNzZXMgIqtnZXRQZXJzb25hbERhdGFGcm9tUHJvY2Vzcyh0cmFuc3BhcmVuY3kpuyIgb2YgIqt0cmFuc3BhcmVuY3kuZGF0YVN1YmplY3QuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIFRIRU4gdGhlIFByb2Nlc3MgIqt0cmFuc3BhcmVuY3kucHJvY2Vzcy5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgc2hhbGwgYmUgdHJhbnNwYXJlbnQuJycnCisJIAknJydJRiBwcm9jZXNzIDoiq3RyYW5zcGFyZW5jeS5wcm9jZXNzLmJhc2VfTmFtZWRFbGVtZW50Lm5hbWW7IiBwcm9jZXNzZXMgOiKrZ2V0UGVyc29uYWxEYXRhRnJvbVByb2Nlc3ModHJhbnNwYXJlbmN5KbsiIG9mIDoiq3RyYW5zcGFyZW5jeS5kYXRhU3ViamVjdC5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgVEhFTiB0aGUgUHJvY2VzcyA6Iqt0cmFuc3BhcmVuY3kucHJvY2Vzcy5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgc2hhbGwgYmUgdHJhbnNwYXJlbnQuJycnCiAJIH0KIAkgLyoqCiAJICogZ2V0IERlc2NyaXB0aW9uIGZvciB0cmFuc3BhcmVudCByZXF1aXJlbWVudHMgZnJvbSBhcnRpY2xlNS4xLmIKIAkgKi8KIAkgZGVmIGdldERlc2NyaXB0aW9uRm9yUHVycG9zZUxpbWl0YXRpb24oUHVycG9zZUxpbWl0YXRpb24gcHVycG9zZUxpbWl0YXRpb24pewogCSAJCi0JIAknJydUaGUgcHVycG9zZSAiq3B1cnBvc2VMaW1pdGF0aW9uLnB1cnBvc2UuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIG9mIHRoZSBQZXJzb25hbERhdGEgIqtwdXJwb3NlTGltaXRhdGlvbi5wZXJzb25hbERhdGEuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIHNoYWxsIGJlIHNwZWNpZmllZCwgZXhwbGljaXQsIGxlZ2ltYXRlLCBhbmQgY29tcGF0aWJsZS4nJycKKwkgCScnJ1RoZSBwdXJwb3NlIDoiq3B1cnBvc2VMaW1pdGF0aW9uLnB1cnBvc2UuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIG9mIHRoZSBQZXJzb25hbERhdGEgOiKrcHVycG9zZUxpbWl0YXRpb24ucGVyc29uYWxEYXRhLmJhc2VfTmFtZWRFbGVtZW50Lm5hbWW7IiBzaGFsbCBiZSBzcGVjaWZpZWQsIGV4cGxpY2l0LCBsZWdpbWF0ZSwgYW5kIGNvbXBhdGlibGUuJycnCiAJIH0KIAkgCiAJIC8qKgpAQCAtNjMsMTkgKzcxLDE5IEBACiAJICovCiAJIGRlZiBnZXREZXNjcmlwdGlvbkZvckRhdGFNaW5pbWlzYXRpb24oRGF0YU1pbmltaXNhdGlvbiBkYXRhTWluaW1pc2F0aW9uKXsKIAkgCQotCSAJJycnUGVyc29uYWwgRGF0YSAiq2RhdGFNaW5pbWlzYXRpb24ucGVyc29uYWxEYXRhLmJhc2VfTmFtZWRFbGVtZW50Lm5hbWW7IiBzaGFsbCBiZSBhZGVxdWF0ZSwgcmVsZXZhbnQgYW5kIGxpbWl0ZWQgdG8gd2hhdCBpcyBuZWNlc3NhcnkgaW4gcmVsYXRpb24gdG8gdGhlIHB1cnBvc2UgIqtkYXRhTWluaW1pc2F0aW9uLnB1cnBvc2UuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIGZvciB3aGljaCB0aGV5IGFyZSBwcm9jZXNzZWQnJycKKwkgCScnJ1BlcnNvbmFsIERhdGEgOiKrZGF0YU1pbmltaXNhdGlvbi5wZXJzb25hbERhdGEuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIHNoYWxsIGJlIGFkZXF1YXRlLCByZWxldmFudCBhbmQgbGltaXRlZCB0byB3aGF0IGlzIG5lY2Vzc2FyeSBpbiByZWxhdGlvbiB0byB0aGUgcHVycG9zZSA6IqtkYXRhTWluaW1pc2F0aW9uLnB1cnBvc2UuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIGZvciB3aGljaCB0aGV5IGFyZSBwcm9jZXNzZWQnJycKIAkgfQogCSAvKioKIAkgKiBnZXQgRGVzY3JpcHRpb24gZm9yIHRyYW5zcGFyZW50IHJlcXVpcmVtZW50cyBmcm9tIGFydGljbGU1LjEuZAogCSAqLwogCSBkZWYgZ2V0RGVzY3JpcHRpb25Gb3JBY2N1cmF0ZShBY2N1cmFjeSBhY2N1cmFjeSl7Ci0JIAknJydQZXJzb25hbCBEYXRhICKrYWNjdXJhY3kucGVyc29uYWxEYXRhLmJhc2VfTmFtZWRFbGVtZW50Lm5hbWW7IiBzaGFsbCBiZSBhY2N1cmF0ZSBhbmQsIHdoZXJlIG5lY2Vzc2FyeSwga2VwdCB1cCB0byBkYXRlLiBJZiBwZXJzb25hbCBkYXRhICKrYWNjdXJhY3kucGVyc29uYWxEYXRhLmJhc2VfTmFtZWRFbGVtZW50Lm5hbWW7IiBhcmUgaW5hY2N1cmF0ZSwgaGF2aW5nIHJlZ2FyZCB0byB0aGUgcHVycG9zZXMgIqthY2N1cmFjeS5wdXJwb3NlLmJhc2VfTmFtZWRFbGVtZW50Lm5hbWW7IiBmb3Igd2hpY2ggdGhleSBhcmUgcHJvY2Vzc2VkLCBpdCBzaGFsbCAgZXJhc2VkIG9yIHJlY3RpZmllZCB3aXRob3V0IGRlbGF5LicnJworCSAJJycnUGVyc29uYWwgRGF0YSA6IqthY2N1cmFjeS5wZXJzb25hbERhdGEuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIHNoYWxsIGJlIGFjY3VyYXRlIGFuZCwgd2hlcmUgbmVjZXNzYXJ5LCBrZXB0IHVwIHRvIGRhdGUuIElmIHBlcnNvbmFsIGRhdGEgOiKrYWNjdXJhY3kucGVyc29uYWxEYXRhLmJhc2VfTmFtZWRFbGVtZW50Lm5hbWW7IiBhcmUgaW5hY2N1cmF0ZSwgaGF2aW5nIHJlZ2FyZCB0byB0aGUgcHVycG9zZXMgOiKrYWNjdXJhY3kucHVycG9zZS5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgZm9yIHdoaWNoIHRoZXkgYXJlIHByb2Nlc3NlZCwgaXQgc2hhbGwgIGVyYXNlZCBvciByZWN0aWZpZWQgd2l0aG91dCBkZWxheS4nJycKIAkgfQogCSAvKioKIAkgKiBnZXQgRGVzY3JpcHRpb24gZm9yIHRyYW5zcGFyZW50IHJlcXVpcmVtZW50cyBmcm9tIGFydGljbGU1LjEuZQogCSAqLwogCSBkZWYgZ2V0RGVzY3JpcHRpb25Gb3JTdG9yYWdlTGltaXRhdGlvbihTdG9yYWdlTGltaXRhdGlvbiBzdG9yYWdlTGltaXRhdGlvbil7Ci0JIAknJydQZXJzb25hbCBEYXRhICKrc3RvcmFnZUxpbWl0YXRpb24ucGVyc29uYWxEYXRhLmJhc2VfTmFtZWRFbGVtZW50Lm5hbWW7IiBzaGFsbCBiZSBrZXB0IGluIGEgZm9ybSB3aGljaCBwZXJtaXRzIGlkZW50aWZpY2F0aW9uIG9mIGRhdGEgc3ViamVjdCAiq3N0b3JhZ2VMaW1pdGF0aW9uLnBlcnNvbmFsRGF0YS5yZWxhdGVkVG8uZ2V0KDApLmJhc2VfTmFtZWRFbGVtZW50Lm5hbWW7IiBmb3Igbm8gbG9uZ2VyIHRoYW4gaXMgbmVjZXNzYXJ5IGZvciB0aGUgcHVycG9zZSAiq3N0b3JhZ2VMaW1pdGF0aW9uLnB1cnBvc2UuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIGZvciB3aGljaCB0aGUgcGVyc29uYWwgZGF0YSBhcmUgcHJvY2Vzc2VkJycnCisJIAknJydQZXJzb25hbCBEYXRhIDoiq3N0b3JhZ2VMaW1pdGF0aW9uLnBlcnNvbmFsRGF0YS5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgc2hhbGwgYmUga2VwdCBpbiBhIGZvcm0gd2hpY2ggcGVybWl0cyBpZGVudGlmaWNhdGlvbiBvZiBkYXRhIHN1YmplY3QgOiKrc3RvcmFnZUxpbWl0YXRpb24ucGVyc29uYWxEYXRhLnJlbGF0ZWRUby5nZXQoMCkuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIGZvciBubyBsb25nZXIgdGhhbiBpcyBuZWNlc3NhcnkgZm9yIHRoZSBwdXJwb3NlIDoiq3N0b3JhZ2VMaW1pdGF0aW9uLnB1cnBvc2UuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIGZvciB3aGljaCB0aGUgcGVyc29uYWwgZGF0YSBhcmUgcHJvY2Vzc2VkJycnCiAJIAkKIAkgfQogCSAKQEAgLTgzLDIzICs5MSw2MyBAQAogCSAqIGdldCBEZXNjcmlwdGlvbiBmb3IgdHJhbnNwYXJlbnQgcmVxdWlyZW1lbnRzIGZyb20gYXJ0aWNsZTUuMS5lCiAJICovCiAJIGRlZiBnZXREZXNjcmlwdGlvbkZvclNlY3VyaXR5U2FmZXR5KFNlY3VyaXR5U2FmZXR5IHNlY3VyaXR5U2FmZXR5KXsKLQkgCScnJ1BlcnNvbmFsIERhdGEgq2dldFBlcnNvbmFsRGF0YUZyb21Qcm9jZXNzKHNlY3VyaXR5U2FmZXR5KbsgIHNoYWxsIGJlIHByb2Nlc3NlZCBpbiBhIG1hbm5lciB0aGF0IGVuc3VyZXMgYXBwcm9wcmlhdGUgc2VjdXJpdHkuICcnJworCSAJJycnUGVyc29uYWwgRGF0YSCrZ2V0UGVyc29uYWxEYXRhRnJvbVByb2Nlc3Moc2VjdXJpdHlTYWZldHkpuyIgc2hhbGwgYmUgcHJvY2Vzc2VkIGluIGEgbWFubmVyIHRoYXQgZW5zdXJlcyBhcHByb3ByaWF0ZSBzZWN1cml0eS4gJycnCiAJIH0KLQkgCisJICAKIAkgLyoqCiAJICogZ2V0IERlc2NyaXB0aW9uIGZvciBsYXdmdWxsQnlDb25zZW50IHJlcXVpcmVtZW50cyBmcm9tIGFydGljbGU2LjEuYQogCSAqLwogCSBkZWYgZ2V0RGVzY3JpcHRpb25Gb3JMYXdmdWxCeUNvbnNlbnQoTGF3ZnVsQnlDb25zZW50IGxhd2Z1bEJ5Q29uc2VudCl7Ci0JIAknJydQcm9jZXNzaW5nICKrbGF3ZnVsQnlDb25zZW50LnByb2Nlc3MuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIHNoYWxsIGJlIGxhd2Z1bCBpZiB0aGUgZGF0YSBzdWJqZWN0ICKrbGF3ZnVsQnlDb25zZW50LmRhdGFTdWJqZWN0LmJhc2VfTmFtZWRFbGVtZW50Lm5hbWW7IiBoYXMgZ2l2ZW4gY29uc2VudCAiq2xhd2Z1bEJ5Q29uc2VudC5jb25zZW50LmJhc2VfTmFtZWRFbGVtZW50Lm5hbWW7IiB0byB0aGUgcHJvY2Vzc2luZyBvZiBoaXMgb3IgaGVyIHBlcnNvbmFsIGRhdGEgOiKrZ2V0UGVyc29uYWxEYXRhRnJvbVByb2Nlc3MobGF3ZnVsQnlDb25zZW50KbsiIGZvciBvbmUgb3IgbW9yZSBzcGVjaWZpYyBwdXJwb3NlcyCrbGF3ZnVsQnlDb25zZW50LnByb2Nlc3MuY29udHJpYnV0ZWRUby5iYXNlX05hbWVkRWxlbWVudC5uYW1luycnJworCSAJJycnUHJvY2Vzc2luZyA6IqtsYXdmdWxCeUNvbnNlbnQucHJvY2Vzcy5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgc2hhbGwgYmUgbGF3ZnVsIGlmIHRoZSBkYXRhIHN1YmplY3QgOiKrbGF3ZnVsQnlDb25zZW50LmRhdGFTdWJqZWN0LmJhc2VfTmFtZWRFbGVtZW50Lm5hbWW7IiBoYXMgZ2l2ZW4gY29uc2VudCA6IqtsYXdmdWxCeUNvbnNlbnQuY29uc2VudC5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgdG8gdGhlIHByb2Nlc3Npbmcgb2YgaGlzIG9yIGhlciBwZXJzb25hbCBkYXRhIDoiq2dldFBlcnNvbmFsRGF0YUZyb21Qcm9jZXNzKGxhd2Z1bEJ5Q29uc2VudCm7IiBmb3Igb25lIG9yIG1vcmUgc3BlY2lmaWMgcHVycG9zZXMgOiKrbGF3ZnVsQnlDb25zZW50LnByb2Nlc3MuY29udHJpYnV0ZWRUby5iYXNlX05hbWVkRWxlbWVudC5uYW1luyInJycKIAl9CiAJCiAJIC8qKgogCSAqIGdldCBEZXNjcmlwdGlvbiBmb3IgbGF3ZnVsbEJ5Q29udHJhY3QgcmVxdWlyZW1lbnRzIGZyb20gYXJ0aWNsZTYuMS5iCiAJICovCi0JIGRlZiBnZXREZXNjcmlwdGlvbkZvckxhd2Z1bEJ5Q29uc2VudChMYXdmdWxCeUNvbnRyYWN0IGxhd2Z1bEJ5Q29udHJhY3QpewotCSAJJycnUHJvY2Vzc2luZyAiq2xhd2Z1bEJ5Q29udHJhY3QucHJvY2Vzcy5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgc2hhbGwgYmUgbGF3ZnVsIGlmIHByb2Nlc3NpbmcgIqtsYXdmdWxCeUNvbnRyYWN0LnByb2Nlc3MuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBjb250cmFjdDoiq2xhd2Z1bEJ5Q29udHJhY3QuY29udHJhY3QuYmFzZV9OYW1lZEVsZW1lbnS7IiB0byB3aGljaCB0aGUgZGF0YSBzdWJqZWN0OiKrbGF3ZnVsQnlDb250cmFjdC5kYXRhU3ViamVjdC5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgaXMgcGFydHkgb3IgaW4gb3JkZXIgdG8gdGFrZSBzdGVwcyBhdCB0aGUgcmVxdWVzdCBvZiB0aGUgZGF0YSBzdWJqZWN0IHByaW9yIHRvIGVudGVyaW5nIGludG8gYSBjb250cmFjdCcnJworCSBkZWYgZ2V0RGVzY3JpcHRpb25Gb3JMYXdmdWxCeUNvbnRyYWN0KExhd2Z1bEJ5Q29udHJhY3QgbGF3ZnVsQnlDb250cmFjdCl7CisJIAknJydQcm9jZXNzaW5nIDoiq2xhd2Z1bEJ5Q29udHJhY3QucHJvY2Vzcy5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgc2hhbGwgYmUgbGF3ZnVsIGlmIHByb2Nlc3NpbmcgOiKrbGF3ZnVsQnlDb250cmFjdC5wcm9jZXNzLmJhc2VfTmFtZWRFbGVtZW50Lm5hbWW7IiBpcyBuZWNlc3NhcnkgZm9yIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgY29udHJhY3Q6IqtsYXdmdWxCeUNvbnRyYWN0LmNvbnRyYWN0LmJhc2VfTmFtZWRFbGVtZW50Lm5hbWW7IiB0byB3aGljaCB0aGUgZGF0YSBzdWJqZWN0OiKrbGF3ZnVsQnlDb250cmFjdC5kYXRhU3ViamVjdC5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgaXMgcGFydHkgb3IgaW4gb3JkZXIgdG8gdGFrZSBzdGVwcyBhdCB0aGUgcmVxdWVzdCBvZiB0aGUgZGF0YSBzdWJqZWN0IHByaW9yIHRvIGVudGVyaW5nIGludG8gYSBjb250cmFjdCcnJwogCX0KLQkgCisJCS8qKgorCSAqIGdldCBEZXNjcmlwdGlvbiBmb3IgbGF3ZnVsbEJ5Q29uc2VudCByZXF1aXJlbWVudHMgZnJvbSBhcnRpY2xlNi4xLmMKKwkgKi8KKwkgZGVmIGdldERlc2NyaXB0aW9uRm9yTGF3ZnVsQnlMZWdhbE9ibGlnYXRpb24oTGF3ZnVsQnlMZWdhbE9ibGlnYXRpb24gbGF3ZnVsQnlMZWdhbE9ibGlnYXRpb24peworCSAJJycnUHJvY2Vzc2luZyA6IqtsYXdmdWxCeUxlZ2FsT2JsaWdhdGlvbi5wcm9jZXNzLmJhc2VfTmFtZWRFbGVtZW50Lm5hbWW7IiBzaGFsbCBiZSBsYXdmdWwgaWYgcHJvY2Vzc2luZyBpcyBuZWNlc3NhcnkgZm9yIGNvbXBsaWFuY2Ugd2l0aCBhIGxlZ2FsIG9ibGlnYXRpb24gOiKrbGF3ZnVsQnlMZWdhbE9ibGlnYXRpb24ubGVnYWxPYmxpZ2F0aW9uLmJhc2VfTmFtZWRFbGVtZW50Lm5hbWW7InRvIHdoaWNoIHRoZSBjb250cm9sbGVyOiAiq2dldERhdGFDb250cm9sZXJGcm9tUHJvY2VzcyhsYXdmdWxCeUxlZ2FsT2JsaWdhdGlvbim7IiBpcyBzdWJqZWN0JycnCisJfQorCQorCS8qKgorCSAqIGdldCBEZXNjcmlwdGlvbiBmb3IgbGF3ZnVsbEJ5Q29uc2VudCByZXF1aXJlbWVudHMgZnJvbSBhcnRpY2xlNi4xLmQKKwkgKi8KKwkgZGVmIGdldERlc2NyaXB0aW9uRm9yTGF3ZnVsQnlWaXRhbEludGVyZXN0KExhd2Z1bEJ5Vml0YWxJbnRlcmVzdCBsYXdmdWxCeVZpdGFsSW50ZXJlc3QpeworCSAJJycnUHJvY2Vzc2luZyA6IqtsYXdmdWxCeVZpdGFsSW50ZXJlc3QucHJvY2Vzcy5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgc2hhbGwgYmUgbGF3ZnVsIGlmIHByb2Nlc3NpbmcgaXMgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIHByb3RlY3QgdGhlIHZpdGFsIGludGVyZXN0cyBvZiB0aGUgZGF0YSBzdWJqZWN0IDoiq2xhd2Z1bEJ5Vml0YWxJbnRlcmVzdC5kYXRhU3ViamVjdC5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgb3Igb2YgYW5vdGhlciBuYXR1cmFsIHBlcnNvbicnJworCX0KKwkvKioKKwkgKiBnZXQgRGVzY3JpcHRpb24gZm9yIGxhd2Z1bGxCeUNvbnNlbnQgcmVxdWlyZW1lbnRzIGZyb20gYXJ0aWNsZTYuMS5lCisJICovCisJIGRlZiBnZXREZXNjcmlwdGlvbkZvckxhd2Z1bEJ5UHVibGljSW50ZXJlc3QoTGF3ZnVsQnlQdWJsaWNJbnRlcmVzdCBsYXdmdWxCeVB1YmxpY0ludGVyZXN0KXsKKwkgCScnJ1Byb2Nlc3NpbmcgOiKrbGF3ZnVsQnlQdWJsaWNJbnRlcmVzdC5wcm9jZXNzLmJhc2VfTmFtZWRFbGVtZW50Lm5hbWW7IiBzaGFsbCBiZSBsYXdmdWwgaWYgcHJvY2Vzc2luZyBpcyBuZWNlc3NhcnkgZm9yIHRoZSBwZXJmb3JtYW5jZSBvZiBhIHRhc2sgY2FycmllZCBvdXQgaW4gdGhlIHB1YmxpYyBpbnRlcmVzdCBvciBpbiB0aGUgZXhlcmNpc2Ugb2Ygb2ZmaWNpYWwgYXV0aG9yaXR5IHZlc3RlZCBpbiB0aGUgY29udHJvbGxlciA6ICKrZ2V0RGF0YUNvbnRyb2xlckZyb21Qcm9jZXNzKGxhd2Z1bEJ5UHVibGljSW50ZXJlc3QpuyInJycKKwl9CisJLyoqCisJICogZ2V0IERlc2NyaXB0aW9uIGZvciBsYXdmdWxsQnlDb25zZW50IHJlcXVpcmVtZW50cyBmcm9tIGFydGljbGU2LjEuZgorCSAqLworCSBkZWYgZ2V0RGVzY3JpcHRpb25Gb3JMYXdmdWxCeUxlZ2l0aW1hdGVJbnRlcmVzdChMYXdmdWxCeUxlZ2l0aW1hdGVJbnRlcmVzdCBsYXdmdWxCeUxlZ2l0aW1hdGVJbnRlcmVzdCl7CisJIAknJydQcm9jZXNzaW5nIDoiq2xhd2Z1bEJ5TGVnaXRpbWF0ZUludGVyZXN0LnByb2Nlc3MuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIHNoYWxsIGJlIGxhd2Z1bCBpZiBwcm9jZXNzaW5nIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIHB1cnBvc2VzIG9mIHRoZSBsZWdpdGltYXRlIGludGVyZXN0cyA6IqtsYXdmdWxCeUxlZ2l0aW1hdGVJbnRlcmVzdC5sZWdpdGltYXRlSW50ZXJlc3QuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIHB1cnN1ZWQgYnkgdGhlIGNvbnRyb2xsZXIgOiKrZ2V0RGF0YUNvbnRyb2xlckZyb21Qcm9jZXNzKGxhd2Z1bEJ5TGVnaXRpbWF0ZUludGVyZXN0Kbsib3IgYnkgYSB0aGlyZCBwYXJ0eSwgZXhjZXB0IHdoZXJlIHN1Y2ggaW50ZXJlc3RzIGFyZSBvdmVycmlkZGVuIGJ5IHRoZSBpbnRlcmVzdHMgb3IgZnVuZGFtZW50YWwgcmlnaHRzIGFuZCBmcmVlZG9tcyBvZiB0aGUgZGF0YSBzdWJqZWN0IHdoaWNoIHJlcXVpcmUgcHJvdGVjdGlvbiBvZiBwZXJzb25hbCBkYXRhLCBpbiBwYXJ0aWN1bGFyIHdoZXJlIHRoZSBkYXRhIHN1YmplY3QgaXMgYSBjaGlsZC4KKycnJworCX0KKwkKKwkvKioKKwkgKiBnZXQgRGVzY3JpcHRpb24gZm9yIGxhd2Z1bGxCeUNvbnNlbnQgcmVxdWlyZW1lbnRzIGZyb20gYXJ0aWNsZTYuMS5mCisJICovCisJIGRlZiBnZXREZXNjcmlwdGlvbkZvckxhd2Z1bEJ5U2FmZUd1YXJkKExhd2Z1bGxCeVNhZmVHdWFyZCBsYXdmdWxsQnlTYWZlR3VhcmQpeworJycnV2hlcmUgdGhlIHByb2Nlc3NpbmcgOiKrbGF3ZnVsbEJ5U2FmZUd1YXJkLnByb2Nlc3MuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIGZvciBhIHB1cnBvc2UgOiKrbGF3ZnVsbEJ5U2FmZUd1YXJkLnByb2Nlc3MuY29udHJpYnV0ZWRUby5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgb3RoZXIgdGhhbiB0aGF0IGZvciB3aGljaCB0aGUgcGVyc29uYWwgZGF0YSA6IqtnZXRQZXJzb25hbERhdGFGcm9tUHJvY2VzcyhsYXdmdWxsQnlTYWZlR3VhcmQpuyIgaGF2ZSBiZWVuIGNvbGxlY3RlZCBpcyBub3QgYmFzZWQgb24gdGhlIGRhdGEgc3ViamVjdJJzIGNvbnNlbnQgb3IKK29uIGEgVW5pb24gb3IgTWVtYmVyIFN0YXRlIGxhdyB3aGljaCBjb25zdGl0dXRlcyBhIG5lY2Vzc2FyeSBhbmQgcHJvcG9ydGlvbmF0ZSBtZWFzdXJlIGluIGEgZGVtb2NyYXRpYyBzb2NpZXR5IHRvIHNhZmVndWFyZCB0aGUgb2JqZWN0aXZlcyByZWZlcnJlZCB0byBpbiBBcnRpY2xlIDIzKDEpLCB0aGUgY29udHJvbGxlciA6IqtnZXREYXRhQ29udHJvbGVyRnJvbVByb2Nlc3MobGF3ZnVsbEJ5U2FmZUd1YXJkKbsiIHNoYWxsLAoraW4gb3JkZXIgdG8gYXNjZXJ0YWluIHdoZXRoZXIgcHJvY2Vzc2luZyBmb3IgYW5vdGhlciBwdXJwb3NlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgcHVycG9zZSBmb3Igd2hpY2ggdGhlIHBlcnNvbmFsIGRhdGEgYXJlIGluaXRpYWxseSBjb2xsZWN0ZWQsIHRha2UgaW50byBhY2NvdW50LCBpbnRlciBhbGlhOgorYW55IGxpbmsgYmV0d2VlbiB0aGUgcHVycG9zZXMgq2xhd2Z1bGxCeVNhZmVHdWFyZC5wcm9jZXNzLmNvbnRyaWJ1dGVkVG8uYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiZm9yIHdoaWNoIHRoZSBwZXJzb25hbCBkYXRhIDoiq2dldFBlcnNvbmFsRGF0YUZyb21Qcm9jZXNzKGxhd2Z1bGxCeVNhZmVHdWFyZCm7ImhhdmUgYmVlbiBjb2xsZWN0ZWQgYW5kIHRoZSBwdXJwb3NlcyBvZiB0aGUgaW50ZW5kZWQgZnVydGhlciBwcm9jZXNzaW5nOworCSAJLSB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgcGVyc29uYWwgZGF0YTogIqtnZXRQZXJzb25hbERhdGFGcm9tUHJvY2VzcyhsYXdmdWxsQnlTYWZlR3VhcmQpuyIgIGhhdmUgYmVlbiBjb2xsZWN0ZWQsIGluIHBhcnRpY3VsYXIgcmVnYXJkaW5nIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBkYXRhIHN1YmplY3RzIDoiq2xhd2Z1bGxCeVNhZmVHdWFyZC5kYXRhU3ViamVjdC5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgYW5kIHRoZSBjb250cm9sbGVyOqtnZXREYXRhQ29udHJvbGVyRnJvbVByb2Nlc3MobGF3ZnVsbEJ5U2FmZUd1YXJkKbsKKwkgCS0gdGhlIG5hdHVyZSBvZiB0aGUgcGVyc29uYWwgZGF0YTogIqtnZXRQZXJzb25hbERhdGFGcm9tUHJvY2VzcyhsYXdmdWxsQnlTYWZlR3VhcmQpuyIiICwgaW4gcGFydGljdWxhciB3aGV0aGVyIHNwZWNpYWwgY2F0ZWdvcmllcyBvZiBwZXJzb25hbCBkYXRhIGFyZSBwcm9jZXNzZWQsIHB1cnN1YW50IHRvIEFydGljbGUgOSwgb3Igd2hldGhlciBwZXJzb25hbCBkYXRhIHJlbGF0ZWQgdG8gY3JpbWluYWwgY29udmljdGlvbnMgYW5kIG9mZmVuY2VzIGFyZSBwcm9jZXNzZWQsIHB1cnN1YW50IHRvIEFydGljbGUgMTA7CisJIAktIHRoZSBwb3NzaWJsZSBjb25zZXF1ZW5jZXMgb2YgdGhlIGludGVuZGVkIGZ1cnRoZXIgcHJvY2Vzc2luZyBmb3IgZGF0YSBzdWJqZWN0czoiq2xhd2Z1bGxCeVNhZmVHdWFyZC5kYXRhU3ViamVjdC5iYXNlX05hbWVkRWxlbWVudC5uYW1luworCSAJLSB0aGUgZXhpc3RlbmNlIG9mIGFwcHJvcHJpYXRlIHNhZmVndWFyZHMsIHdoaWNoIG1heSBpbmNsdWRlIGVuY3J5cHRpb24gb3IgcHNldWRvbnltaXNhdGlvbi4nJycKKwl9CisJCSAKIAkgZGVmIGdldFBlcnNvbmFsRGF0YUZyb21Qcm9jZXNzKFByb2Nlc3NQcmluY2lwbGUgUHJvY2Vzc1ByaW5jaXBsZSl7CiAJCXZhciByZXN1bHQgPSAiIgogCSAJCkBAIC0xMDksNSArMTU3LDE3IEBACiAJIAlyZXR1cm4gcmVzdWx0CiAJIH0KIAkgCisJICBkZWYgZ2V0RGF0YUNvbnRyb2xlckZyb21Qcm9jZXNzKFByb2Nlc3NQcmluY2lwbGUgUHJvY2Vzc1ByaW5jaXBsZSl7CisJCXZhciByZXN1bHQgPSAiIgorCSAJCisJIAlmb3IgKGRhdGEgOiBQcm9jZXNzUHJpbmNpcGxlLnBlcnNvbmFsRGF0YSkgeworCSAJCWlmKHJlc3VsdC5pbmRleE9mKCIiK2RhdGEucmVzcG9uc2libGUuYmFzZV9OYW1lZEVsZW1lbnQubmFtZSk9PS0xKXsKKwkgCQkJcmVzdWx0PXJlc3VsdCsgZGF0YS5yZXNwb25zaWJsZS5iYXNlX05hbWVkRWxlbWVudC5uYW1lKyIgIjsKKwkgCQl9CisJIAkJCisJIAl9CisJIAlyZXR1cm4gcmVzdWx0CisJIH0KKwkgCiAJIAogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvcmVxL29yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEubWV0YXJlcS94dGVuZC1nZW4vb3JnL2VjbGlwc2UvcGFweXJ1cy9wZHA0ZW5nL3JlcS9tZXRhcmVxL0dEUFJSZXF1aXJlbWVudHMuamF2YSBiL3BsdWdpbnMvcmVxL29yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEubWV0YXJlcS94dGVuZC1nZW4vb3JnL2VjbGlwc2UvcGFweXJ1cy9wZHA0ZW5nL3JlcS9tZXRhcmVxL0dEUFJSZXF1aXJlbWVudHMuamF2YQppbmRleCBmMTg1N2Y1Li4yMGE0YzdjIDEwMDY0NAotLS0gYS9wbHVnaW5zL3JlcS9vcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLm1ldGFyZXEveHRlbmQtZ2VuL29yZy9lY2xpcHNlL3BhcHlydXMvcGRwNGVuZy9yZXEvbWV0YXJlcS9HRFBSUmVxdWlyZW1lbnRzLmphdmEKKysrIGIvcGx1Z2lucy9yZXEvb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5tZXRhcmVxL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9wYXB5cnVzL3BkcDRlbmcvcmVxL21ldGFyZXEvR0RQUlJlcXVpcmVtZW50cy5qYXZhCkBAIC0yMiwxMyArMjIsMTcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuTGF3ZnVsOwogaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5MYXdmdWxCeUNvbnNlbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLkxhd2Z1bEJ5Q29udHJhY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLkxhd2Z1bEJ5TGVnYWxPYmxpZ2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5MYXdmdWxCeUxlZ2l0aW1hdGVJbnRlcmVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuTGF3ZnVsQnlQdWJsaWNJbnRlcmVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuTGF3ZnVsQnlWaXRhbEludGVyZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5MYXdmdWxsQnlTYWZlR3VhcmQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLlBlcnNvbmFsRGF0YVJlcXVpcmVtZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5Qcm9jZXNzUHJpbmNpcGxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5QdXJwb3NlTGltaXRhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuU2VjdXJpdHlTYWZldHk7CiBpbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLlN0b3JhZ2VMaW1pdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5UcmFuc3BhcmVuY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuTmFtZWRFbGVtZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kMi5saWIuU3RyaW5nQ29uY2F0ZW5hdGlvbjsKIAogQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCkBAIC0zOCwxNiArNDIsMTYgQEAKICAgICovCiAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0RGVzY3JpcHRpb25Gb3JMYXdmdWxSZXF1aXJlbWVudChmaW5hbCBMYXdmdWwgbGF3ZnVsKSB7CiAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlciA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7Ci0gICAgX2J1aWxkZXIuYXBwZW5kKCJJRiBwcm9jZXNzIFwiIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJJRiBwcm9jZXNzIDpcIiIpOwogICAgIFN0cmluZyBfbmFtZSA9IGxhd2Z1bC5nZXRQcm9jZXNzKCkuZ2V0QmFzZV9OYW1lZEVsZW1lbnQoKS5nZXROYW1lKCk7CiAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lKTsKLSAgICBfYnVpbGRlci5hcHBlbmQoIlwiIHByb2Nlc3NlcyBcIiIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXCIgcHJvY2Vzc2VzIDpcIiIpOwogICAgIFN0cmluZyBfcGVyc29uYWxEYXRhRnJvbVByb2Nlc3MgPSB0aGlzLmdldFBlcnNvbmFsRGF0YUZyb21Qcm9jZXNzKGxhd2Z1bCk7CiAgICAgX2J1aWxkZXIuYXBwZW5kKF9wZXJzb25hbERhdGFGcm9tUHJvY2Vzcyk7Ci0gICAgX2J1aWxkZXIuYXBwZW5kKCJcIiBvZiBcIiIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXCIgb2YgOlwiIik7CiAgICAgU3RyaW5nIF9uYW1lXzEgPSBsYXdmdWwuZ2V0RGF0YVN1YmplY3QoKS5nZXRCYXNlX05hbWVkRWxlbWVudCgpLmdldE5hbWUoKTsKICAgICBfYnVpbGRlci5hcHBlbmQoX25hbWVfMSk7Ci0gICAgX2J1aWxkZXIuYXBwZW5kKCJcIiBUSEVOIHRoZSBQcm9jZXNzIFwiIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcIiBUSEVOIHRoZSBQcm9jZXNzIDpcIiIpOwogICAgIFN0cmluZyBfbmFtZV8yID0gbGF3ZnVsLmdldFByb2Nlc3MoKS5nZXRCYXNlX05hbWVkRWxlbWVudCgpLmdldE5hbWUoKTsKICAgICBfYnVpbGRlci5hcHBlbmQoX25hbWVfMik7CiAgICAgX2J1aWxkZXIuYXBwZW5kKCJcIiBzaGFsbCBiZSBsYXdmdWxsLiIpOwpAQCAtNTksMTYgKzYzLDE2IEBACiAgICAqLwogICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldERlc2NyaXB0aW9uRm9yRmFpcmx5UmVxdWlyZW1lbnQoZmluYWwgRmFpcmx5IGZhaXJseSkgewogICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOwotICAgIF9idWlsZGVyLmFwcGVuZCgiSUYgcHJvY2VzcyBcIiIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiSUYgcHJvY2VzcyA6XCIiKTsKICAgICBTdHJpbmcgX25hbWUgPSBmYWlybHkuZ2V0UHJvY2VzcygpLmdldEJhc2VfTmFtZWRFbGVtZW50KCkuZ2V0TmFtZSgpOwogICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZSk7Ci0gICAgX2J1aWxkZXIuYXBwZW5kKCJcIiBwcm9jZXNzZXMgXCIiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlwiIHByb2Nlc3NlcyA6XCIiKTsKICAgICBTdHJpbmcgX3BlcnNvbmFsRGF0YUZyb21Qcm9jZXNzID0gdGhpcy5nZXRQZXJzb25hbERhdGFGcm9tUHJvY2VzcyhmYWlybHkpOwogICAgIF9idWlsZGVyLmFwcGVuZChfcGVyc29uYWxEYXRhRnJvbVByb2Nlc3MpOwotICAgIF9idWlsZGVyLmFwcGVuZCgiXCIgb2YgXCIiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlwiIG9mIDpcIiIpOwogICAgIFN0cmluZyBfbmFtZV8xID0gZmFpcmx5LmdldERhdGFTdWJqZWN0KCkuZ2V0QmFzZV9OYW1lZEVsZW1lbnQoKS5nZXROYW1lKCk7CiAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzEpOwotICAgIF9idWlsZGVyLmFwcGVuZCgiXCIgVEhFTiB0aGUgUHJvY2VzcyBcIiIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXCIgVEhFTiB0aGUgUHJvY2VzcyA6XCIiKTsKICAgICBTdHJpbmcgX25hbWVfMiA9IGZhaXJseS5nZXRQcm9jZXNzKCkuZ2V0QmFzZV9OYW1lZEVsZW1lbnQoKS5nZXROYW1lKCk7CiAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzIpOwogICAgIF9idWlsZGVyLmFwcGVuZCgiXCIgc2hhbGwgYmUgZmFpcmx5LiIpOwpAQCAtODAsMTYgKzg0LDE2IEBACiAgICAqLwogICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldERlc2NyaXB0aW9uRm9yVHJhbnNwYXJlbnRSZXF1aXJlbWVudChmaW5hbCBUcmFuc3BhcmVuY3kgdHJhbnNwYXJlbmN5KSB7CiAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlciA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7Ci0gICAgX2J1aWxkZXIuYXBwZW5kKCJJRiBwcm9jZXNzIFwiIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJJRiBwcm9jZXNzIDpcIiIpOwogICAgIFN0cmluZyBfbmFtZSA9IHRyYW5zcGFyZW5jeS5nZXRQcm9jZXNzKCkuZ2V0QmFzZV9OYW1lZEVsZW1lbnQoKS5nZXROYW1lKCk7CiAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lKTsKLSAgICBfYnVpbGRlci5hcHBlbmQoIlwiIHByb2Nlc3NlcyBcIiIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXCIgcHJvY2Vzc2VzIDpcIiIpOwogICAgIFN0cmluZyBfcGVyc29uYWxEYXRhRnJvbVByb2Nlc3MgPSB0aGlzLmdldFBlcnNvbmFsRGF0YUZyb21Qcm9jZXNzKHRyYW5zcGFyZW5jeSk7CiAgICAgX2J1aWxkZXIuYXBwZW5kKF9wZXJzb25hbERhdGFGcm9tUHJvY2Vzcyk7Ci0gICAgX2J1aWxkZXIuYXBwZW5kKCJcIiBvZiBcIiIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXCIgb2YgOlwiIik7CiAgICAgU3RyaW5nIF9uYW1lXzEgPSB0cmFuc3BhcmVuY3kuZ2V0RGF0YVN1YmplY3QoKS5nZXRCYXNlX05hbWVkRWxlbWVudCgpLmdldE5hbWUoKTsKICAgICBfYnVpbGRlci5hcHBlbmQoX25hbWVfMSk7Ci0gICAgX2J1aWxkZXIuYXBwZW5kKCJcIiBUSEVOIHRoZSBQcm9jZXNzIFwiIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcIiBUSEVOIHRoZSBQcm9jZXNzIDpcIiIpOwogICAgIFN0cmluZyBfbmFtZV8yID0gdHJhbnNwYXJlbmN5LmdldFByb2Nlc3MoKS5nZXRCYXNlX05hbWVkRWxlbWVudCgpLmdldE5hbWUoKTsKICAgICBfYnVpbGRlci5hcHBlbmQoX25hbWVfMik7CiAgICAgX2J1aWxkZXIuYXBwZW5kKCJcIiBzaGFsbCBiZSB0cmFuc3BhcmVudC4iKTsKQEAgLTEwMSwxMCArMTA1LDEwIEBACiAgICAqLwogICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldERlc2NyaXB0aW9uRm9yUHVycG9zZUxpbWl0YXRpb24oZmluYWwgUHVycG9zZUxpbWl0YXRpb24gcHVycG9zZUxpbWl0YXRpb24pIHsKICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKLSAgICBfYnVpbGRlci5hcHBlbmQoIlRoZSBwdXJwb3NlIFwiIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJUaGUgcHVycG9zZSA6XCIiKTsKICAgICBTdHJpbmcgX25hbWUgPSBwdXJwb3NlTGltaXRhdGlvbi5nZXRQdXJwb3NlKCkuZ2V0QmFzZV9OYW1lZEVsZW1lbnQoKS5nZXROYW1lKCk7CiAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lKTsKLSAgICBfYnVpbGRlci5hcHBlbmQoIlwiIG9mIHRoZSBQZXJzb25hbERhdGEgXCIiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlwiIG9mIHRoZSBQZXJzb25hbERhdGEgOlwiIik7CiAgICAgU3RyaW5nIF9uYW1lXzEgPSBwdXJwb3NlTGltaXRhdGlvbi5nZXRQZXJzb25hbERhdGEoKS5nZXRCYXNlX05hbWVkRWxlbWVudCgpLmdldE5hbWUoKTsKICAgICBfYnVpbGRlci5hcHBlbmQoX25hbWVfMSk7CiAgICAgX2J1aWxkZXIuYXBwZW5kKCJcIiBzaGFsbCBiZSBzcGVjaWZpZWQsIGV4cGxpY2l0LCBsZWdpbWF0ZSwgYW5kIGNvbXBhdGlibGUuIik7CkBAIC0xMTYsMTAgKzEyMCwxMCBAQAogICAgKi8KICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXREZXNjcmlwdGlvbkZvckRhdGFNaW5pbWlzYXRpb24oZmluYWwgRGF0YU1pbmltaXNhdGlvbiBkYXRhTWluaW1pc2F0aW9uKSB7CiAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlciA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7Ci0gICAgX2J1aWxkZXIuYXBwZW5kKCJQZXJzb25hbCBEYXRhIFwiIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJQZXJzb25hbCBEYXRhIDpcIiIpOwogICAgIFN0cmluZyBfbmFtZSA9IGRhdGFNaW5pbWlzYXRpb24uZ2V0UGVyc29uYWxEYXRhKCkuZ2V0QmFzZV9OYW1lZEVsZW1lbnQoKS5nZXROYW1lKCk7CiAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lKTsKLSAgICBfYnVpbGRlci5hcHBlbmQoIlwiIHNoYWxsIGJlIGFkZXF1YXRlLCByZWxldmFudCBhbmQgbGltaXRlZCB0byB3aGF0IGlzIG5lY2Vzc2FyeSBpbiByZWxhdGlvbiB0byB0aGUgcHVycG9zZSBcIiIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXCIgc2hhbGwgYmUgYWRlcXVhdGUsIHJlbGV2YW50IGFuZCBsaW1pdGVkIHRvIHdoYXQgaXMgbmVjZXNzYXJ5IGluIHJlbGF0aW9uIHRvIHRoZSBwdXJwb3NlIDpcIiIpOwogICAgIFN0cmluZyBfbmFtZV8xID0gZGF0YU1pbmltaXNhdGlvbi5nZXRQdXJwb3NlKCkuZ2V0QmFzZV9OYW1lZEVsZW1lbnQoKS5nZXROYW1lKCk7CiAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzEpOwogICAgIF9idWlsZGVyLmFwcGVuZCgiXCIgZm9yIHdoaWNoIHRoZXkgYXJlIHByb2Nlc3NlZCIpOwpAQCAtMTMxLDEzICsxMzUsMTMgQEAKICAgICovCiAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0RGVzY3JpcHRpb25Gb3JBY2N1cmF0ZShmaW5hbCBBY2N1cmFjeSBhY2N1cmFjeSkgewogICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOwotICAgIF9idWlsZGVyLmFwcGVuZCgiUGVyc29uYWwgRGF0YSBcIiIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiUGVyc29uYWwgRGF0YSA6XCIiKTsKICAgICBTdHJpbmcgX25hbWUgPSBhY2N1cmFjeS5nZXRQZXJzb25hbERhdGEoKS5nZXRCYXNlX05hbWVkRWxlbWVudCgpLmdldE5hbWUoKTsKICAgICBfYnVpbGRlci5hcHBlbmQoX25hbWUpOwotICAgIF9idWlsZGVyLmFwcGVuZCgiXCIgc2hhbGwgYmUgYWNjdXJhdGUgYW5kLCB3aGVyZSBuZWNlc3NhcnksIGtlcHQgdXAgdG8gZGF0ZS4gSWYgcGVyc29uYWwgZGF0YSBcIiIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXCIgc2hhbGwgYmUgYWNjdXJhdGUgYW5kLCB3aGVyZSBuZWNlc3NhcnksIGtlcHQgdXAgdG8gZGF0ZS4gSWYgcGVyc29uYWwgZGF0YSA6XCIiKTsKICAgICBTdHJpbmcgX25hbWVfMSA9IGFjY3VyYWN5LmdldFBlcnNvbmFsRGF0YSgpLmdldEJhc2VfTmFtZWRFbGVtZW50KCkuZ2V0TmFtZSgpOwogICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZV8xKTsKLSAgICBfYnVpbGRlci5hcHBlbmQoIlwiIGFyZSBpbmFjY3VyYXRlLCBoYXZpbmcgcmVnYXJkIHRvIHRoZSBwdXJwb3NlcyBcIiIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXCIgYXJlIGluYWNjdXJhdGUsIGhhdmluZyByZWdhcmQgdG8gdGhlIHB1cnBvc2VzIDpcIiIpOwogICAgIFN0cmluZyBfbmFtZV8yID0gYWNjdXJhY3kuZ2V0UHVycG9zZSgpLmdldEJhc2VfTmFtZWRFbGVtZW50KCkuZ2V0TmFtZSgpOwogICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZV8yKTsKICAgICBfYnVpbGRlci5hcHBlbmQoIlwiIGZvciB3aGljaCB0aGV5IGFyZSBwcm9jZXNzZWQsIGl0IHNoYWxsICBlcmFzZWQgb3IgcmVjdGlmaWVkIHdpdGhvdXQgZGVsYXkuIik7CkBAIC0xNDksMTMgKzE1MywxMyBAQAogICAgKi8KICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXREZXNjcmlwdGlvbkZvclN0b3JhZ2VMaW1pdGF0aW9uKGZpbmFsIFN0b3JhZ2VMaW1pdGF0aW9uIHN0b3JhZ2VMaW1pdGF0aW9uKSB7CiAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlciA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7Ci0gICAgX2J1aWxkZXIuYXBwZW5kKCJQZXJzb25hbCBEYXRhIFwiIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJQZXJzb25hbCBEYXRhIDpcIiIpOwogICAgIFN0cmluZyBfbmFtZSA9IHN0b3JhZ2VMaW1pdGF0aW9uLmdldFBlcnNvbmFsRGF0YSgpLmdldEJhc2VfTmFtZWRFbGVtZW50KCkuZ2V0TmFtZSgpOwogICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZSk7Ci0gICAgX2J1aWxkZXIuYXBwZW5kKCJcIiBzaGFsbCBiZSBrZXB0IGluIGEgZm9ybSB3aGljaCBwZXJtaXRzIGlkZW50aWZpY2F0aW9uIG9mIGRhdGEgc3ViamVjdCBcIiIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXCIgc2hhbGwgYmUga2VwdCBpbiBhIGZvcm0gd2hpY2ggcGVybWl0cyBpZGVudGlmaWNhdGlvbiBvZiBkYXRhIHN1YmplY3QgOlwiIik7CiAgICAgU3RyaW5nIF9uYW1lXzEgPSBzdG9yYWdlTGltaXRhdGlvbi5nZXRQZXJzb25hbERhdGEoKS5nZXRSZWxhdGVkVG8oKS5nZXQoMCkuZ2V0QmFzZV9OYW1lZEVsZW1lbnQoKS5nZXROYW1lKCk7CiAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzEpOwotICAgIF9idWlsZGVyLmFwcGVuZCgiXCIgZm9yIG5vIGxvbmdlciB0aGFuIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIHB1cnBvc2UgXCIiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlwiIGZvciBubyBsb25nZXIgdGhhbiBpcyBuZWNlc3NhcnkgZm9yIHRoZSBwdXJwb3NlIDpcIiIpOwogICAgIFN0cmluZyBfbmFtZV8yID0gc3RvcmFnZUxpbWl0YXRpb24uZ2V0UHVycG9zZSgpLmdldEJhc2VfTmFtZWRFbGVtZW50KCkuZ2V0TmFtZSgpOwogICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZV8yKTsKICAgICBfYnVpbGRlci5hcHBlbmQoIlwiIGZvciB3aGljaCB0aGUgcGVyc29uYWwgZGF0YSBhcmUgcHJvY2Vzc2VkIik7CkBAIC0xNzAsNyArMTc0LDcgQEAKICAgICBfYnVpbGRlci5hcHBlbmQoIlBlcnNvbmFsIERhdGEgIik7CiAgICAgU3RyaW5nIF9wZXJzb25hbERhdGFGcm9tUHJvY2VzcyA9IHRoaXMuZ2V0UGVyc29uYWxEYXRhRnJvbVByb2Nlc3Moc2VjdXJpdHlTYWZldHkpOwogICAgIF9idWlsZGVyLmFwcGVuZChfcGVyc29uYWxEYXRhRnJvbVByb2Nlc3MpOwotICAgIF9idWlsZGVyLmFwcGVuZCgiICBzaGFsbCBiZSBwcm9jZXNzZWQgaW4gYSBtYW5uZXIgdGhhdCBlbnN1cmVzIGFwcHJvcHJpYXRlIHNlY3VyaXR5LiAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlwiIHNoYWxsIGJlIHByb2Nlc3NlZCBpbiBhIG1hbm5lciB0aGF0IGVuc3VyZXMgYXBwcm9wcmlhdGUgc2VjdXJpdHkuICIpOwogICAgIHJldHVybiBfYnVpbGRlcjsKICAgfQogICAKQEAgLTE3OSw0NSArMTgzLDE3MSBAQAogICAgKi8KICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXREZXNjcmlwdGlvbkZvckxhd2Z1bEJ5Q29uc2VudChmaW5hbCBMYXdmdWxCeUNvbnNlbnQgbGF3ZnVsQnlDb25zZW50KSB7CiAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlciA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7Ci0gICAgX2J1aWxkZXIuYXBwZW5kKCJQcm9jZXNzaW5nIFwiIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJQcm9jZXNzaW5nIDpcIiIpOwogICAgIFN0cmluZyBfbmFtZSA9IGxhd2Z1bEJ5Q29uc2VudC5nZXRQcm9jZXNzKCkuZ2V0QmFzZV9OYW1lZEVsZW1lbnQoKS5nZXROYW1lKCk7CiAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lKTsKLSAgICBfYnVpbGRlci5hcHBlbmQoIlwiIHNoYWxsIGJlIGxhd2Z1bCBpZiB0aGUgZGF0YSBzdWJqZWN0IFwiIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcIiBzaGFsbCBiZSBsYXdmdWwgaWYgdGhlIGRhdGEgc3ViamVjdCA6XCIiKTsKICAgICBTdHJpbmcgX25hbWVfMSA9IGxhd2Z1bEJ5Q29uc2VudC5nZXREYXRhU3ViamVjdCgpLmdldEJhc2VfTmFtZWRFbGVtZW50KCkuZ2V0TmFtZSgpOwogICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZV8xKTsKLSAgICBfYnVpbGRlci5hcHBlbmQoIlwiIGhhcyBnaXZlbiBjb25zZW50IFwiIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcIiBoYXMgZ2l2ZW4gY29uc2VudCA6XCIiKTsKICAgICBTdHJpbmcgX25hbWVfMiA9IGxhd2Z1bEJ5Q29uc2VudC5nZXRDb25zZW50KCkuZ2V0QmFzZV9OYW1lZEVsZW1lbnQoKS5nZXROYW1lKCk7CiAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzIpOwogICAgIF9idWlsZGVyLmFwcGVuZCgiXCIgdG8gdGhlIHByb2Nlc3Npbmcgb2YgaGlzIG9yIGhlciBwZXJzb25hbCBkYXRhIDpcIiIpOwogICAgIFN0cmluZyBfcGVyc29uYWxEYXRhRnJvbVByb2Nlc3MgPSB0aGlzLmdldFBlcnNvbmFsRGF0YUZyb21Qcm9jZXNzKGxhd2Z1bEJ5Q29uc2VudCk7CiAgICAgX2J1aWxkZXIuYXBwZW5kKF9wZXJzb25hbERhdGFGcm9tUHJvY2Vzcyk7Ci0gICAgX2J1aWxkZXIuYXBwZW5kKCJcIiBmb3Igb25lIG9yIG1vcmUgc3BlY2lmaWMgcHVycG9zZXMgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcIiBmb3Igb25lIG9yIG1vcmUgc3BlY2lmaWMgcHVycG9zZXMgOlwiIik7CiAgICAgU3RyaW5nIF9uYW1lXzMgPSBsYXdmdWxCeUNvbnNlbnQuZ2V0UHJvY2VzcygpLmdldENvbnRyaWJ1dGVkVG8oKS5nZXRCYXNlX05hbWVkRWxlbWVudCgpLmdldE5hbWUoKTsKICAgICBfYnVpbGRlci5hcHBlbmQoX25hbWVfMyk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcIiIpOwogICAgIHJldHVybiBfYnVpbGRlcjsKICAgfQogICAKICAgLyoqCiAgICAqIGdldCBEZXNjcmlwdGlvbiBmb3IgbGF3ZnVsbEJ5Q29udHJhY3QgcmVxdWlyZW1lbnRzIGZyb20gYXJ0aWNsZTYuMS5iCiAgICAqLwotICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldERlc2NyaXB0aW9uRm9yTGF3ZnVsQnlDb25zZW50KGZpbmFsIExhd2Z1bEJ5Q29udHJhY3QgbGF3ZnVsQnlDb250cmFjdCkgeworICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldERlc2NyaXB0aW9uRm9yTGF3ZnVsQnlDb250cmFjdChmaW5hbCBMYXdmdWxCeUNvbnRyYWN0IGxhd2Z1bEJ5Q29udHJhY3QpIHsKICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKLSAgICBfYnVpbGRlci5hcHBlbmQoIlByb2Nlc3NpbmcgXCIiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlByb2Nlc3NpbmcgOlwiIik7CiAgICAgU3RyaW5nIF9uYW1lID0gbGF3ZnVsQnlDb250cmFjdC5nZXRQcm9jZXNzKCkuZ2V0QmFzZV9OYW1lZEVsZW1lbnQoKS5nZXROYW1lKCk7CiAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lKTsKLSAgICBfYnVpbGRlci5hcHBlbmQoIlwiIHNoYWxsIGJlIGxhd2Z1bCBpZiBwcm9jZXNzaW5nIFwiIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcIiBzaGFsbCBiZSBsYXdmdWwgaWYgcHJvY2Vzc2luZyA6XCIiKTsKICAgICBTdHJpbmcgX25hbWVfMSA9IGxhd2Z1bEJ5Q29udHJhY3QuZ2V0UHJvY2VzcygpLmdldEJhc2VfTmFtZWRFbGVtZW50KCkuZ2V0TmFtZSgpOwogICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZV8xKTsKICAgICBfYnVpbGRlci5hcHBlbmQoIlwiIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBjb250cmFjdDpcIiIpOwotICAgIE5hbWVkRWxlbWVudCBfYmFzZV9OYW1lZEVsZW1lbnQgPSBsYXdmdWxCeUNvbnRyYWN0LmdldENvbnRyYWN0KCkuZ2V0QmFzZV9OYW1lZEVsZW1lbnQoKTsKLSAgICBfYnVpbGRlci5hcHBlbmQoX2Jhc2VfTmFtZWRFbGVtZW50KTsKLSAgICBfYnVpbGRlci5hcHBlbmQoIlwiIHRvIHdoaWNoIHRoZSBkYXRhIHN1YmplY3Q6XCIiKTsKLSAgICBTdHJpbmcgX25hbWVfMiA9IGxhd2Z1bEJ5Q29udHJhY3QuZ2V0RGF0YVN1YmplY3QoKS5nZXRCYXNlX05hbWVkRWxlbWVudCgpLmdldE5hbWUoKTsKKyAgICBTdHJpbmcgX25hbWVfMiA9IGxhd2Z1bEJ5Q29udHJhY3QuZ2V0Q29udHJhY3QoKS5nZXRCYXNlX05hbWVkRWxlbWVudCgpLmdldE5hbWUoKTsKICAgICBfYnVpbGRlci5hcHBlbmQoX25hbWVfMik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcIiB0byB3aGljaCB0aGUgZGF0YSBzdWJqZWN0OlwiIik7CisgICAgU3RyaW5nIF9uYW1lXzMgPSBsYXdmdWxCeUNvbnRyYWN0LmdldERhdGFTdWJqZWN0KCkuZ2V0QmFzZV9OYW1lZEVsZW1lbnQoKS5nZXROYW1lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzMpOwogICAgIF9idWlsZGVyLmFwcGVuZCgiXCIgaXMgcGFydHkgb3IgaW4gb3JkZXIgdG8gdGFrZSBzdGVwcyBhdCB0aGUgcmVxdWVzdCBvZiB0aGUgZGF0YSBzdWJqZWN0IHByaW9yIHRvIGVudGVyaW5nIGludG8gYSBjb250cmFjdCIpOwogICAgIHJldHVybiBfYnVpbGRlcjsKICAgfQogICAKKyAgLyoqCisgICAqIGdldCBEZXNjcmlwdGlvbiBmb3IgbGF3ZnVsbEJ5Q29uc2VudCByZXF1aXJlbWVudHMgZnJvbSBhcnRpY2xlNi4xLmMKKyAgICovCisgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0RGVzY3JpcHRpb25Gb3JMYXdmdWxCeUxlZ2FsT2JsaWdhdGlvbihmaW5hbCBMYXdmdWxCeUxlZ2FsT2JsaWdhdGlvbiBsYXdmdWxCeUxlZ2FsT2JsaWdhdGlvbikgeworICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgIF9idWlsZGVyLmFwcGVuZCgiUHJvY2Vzc2luZyA6XCIiKTsKKyAgICBTdHJpbmcgX25hbWUgPSBsYXdmdWxCeUxlZ2FsT2JsaWdhdGlvbi5nZXRQcm9jZXNzKCkuZ2V0QmFzZV9OYW1lZEVsZW1lbnQoKS5nZXROYW1lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlwiIHNoYWxsIGJlIGxhd2Z1bCBpZiBwcm9jZXNzaW5nIGlzIG5lY2Vzc2FyeSBmb3IgY29tcGxpYW5jZSB3aXRoIGEgbGVnYWwgb2JsaWdhdGlvbiA6XCIiKTsKKyAgICBTdHJpbmcgX25hbWVfMSA9IGxhd2Z1bEJ5TGVnYWxPYmxpZ2F0aW9uLmdldExlZ2FsT2JsaWdhdGlvbigpLmdldEJhc2VfTmFtZWRFbGVtZW50KCkuZ2V0TmFtZSgpOworICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZV8xKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlwidG8gd2hpY2ggdGhlIGNvbnRyb2xsZXI6IFwiIik7CisgICAgU3RyaW5nIF9kYXRhQ29udHJvbGVyRnJvbVByb2Nlc3MgPSB0aGlzLmdldERhdGFDb250cm9sZXJGcm9tUHJvY2VzcyhsYXdmdWxCeUxlZ2FsT2JsaWdhdGlvbik7CisgICAgX2J1aWxkZXIuYXBwZW5kKF9kYXRhQ29udHJvbGVyRnJvbVByb2Nlc3MpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXCIgaXMgc3ViamVjdCIpOworICAgIHJldHVybiBfYnVpbGRlcjsKKyAgfQorICAKKyAgLyoqCisgICAqIGdldCBEZXNjcmlwdGlvbiBmb3IgbGF3ZnVsbEJ5Q29uc2VudCByZXF1aXJlbWVudHMgZnJvbSBhcnRpY2xlNi4xLmQKKyAgICovCisgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0RGVzY3JpcHRpb25Gb3JMYXdmdWxCeVZpdGFsSW50ZXJlc3QoZmluYWwgTGF3ZnVsQnlWaXRhbEludGVyZXN0IGxhd2Z1bEJ5Vml0YWxJbnRlcmVzdCkgeworICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgIF9idWlsZGVyLmFwcGVuZCgiUHJvY2Vzc2luZyA6XCIiKTsKKyAgICBTdHJpbmcgX25hbWUgPSBsYXdmdWxCeVZpdGFsSW50ZXJlc3QuZ2V0UHJvY2VzcygpLmdldEJhc2VfTmFtZWRFbGVtZW50KCkuZ2V0TmFtZSgpOworICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZSk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcIiBzaGFsbCBiZSBsYXdmdWwgaWYgcHJvY2Vzc2luZyBpcyBuZWNlc3NhcnkgaW4gb3JkZXIgdG8gcHJvdGVjdCB0aGUgdml0YWwgaW50ZXJlc3RzIG9mIHRoZSBkYXRhIHN1YmplY3QgOlwiIik7CisgICAgU3RyaW5nIF9uYW1lXzEgPSBsYXdmdWxCeVZpdGFsSW50ZXJlc3QuZ2V0RGF0YVN1YmplY3QoKS5nZXRCYXNlX05hbWVkRWxlbWVudCgpLmdldE5hbWUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoX25hbWVfMSk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcIiBvciBvZiBhbm90aGVyIG5hdHVyYWwgcGVyc29uIik7CisgICAgcmV0dXJuIF9idWlsZGVyOworICB9CisgIAorICAvKioKKyAgICogZ2V0IERlc2NyaXB0aW9uIGZvciBsYXdmdWxsQnlDb25zZW50IHJlcXVpcmVtZW50cyBmcm9tIGFydGljbGU2LjEuZQorICAgKi8KKyAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXREZXNjcmlwdGlvbkZvckxhd2Z1bEJ5UHVibGljSW50ZXJlc3QoZmluYWwgTGF3ZnVsQnlQdWJsaWNJbnRlcmVzdCBsYXdmdWxCeVB1YmxpY0ludGVyZXN0KSB7CisgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlciA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJQcm9jZXNzaW5nIDpcIiIpOworICAgIFN0cmluZyBfbmFtZSA9IGxhd2Z1bEJ5UHVibGljSW50ZXJlc3QuZ2V0UHJvY2VzcygpLmdldEJhc2VfTmFtZWRFbGVtZW50KCkuZ2V0TmFtZSgpOworICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZSk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcIiBzaGFsbCBiZSBsYXdmdWwgaWYgcHJvY2Vzc2luZyBpcyBuZWNlc3NhcnkgZm9yIHRoZSBwZXJmb3JtYW5jZSBvZiBhIHRhc2sgY2FycmllZCBvdXQgaW4gdGhlIHB1YmxpYyBpbnRlcmVzdCBvciBpbiB0aGUgZXhlcmNpc2Ugb2Ygb2ZmaWNpYWwgYXV0aG9yaXR5IHZlc3RlZCBpbiB0aGUgY29udHJvbGxlciA6IFwiIik7CisgICAgU3RyaW5nIF9kYXRhQ29udHJvbGVyRnJvbVByb2Nlc3MgPSB0aGlzLmdldERhdGFDb250cm9sZXJGcm9tUHJvY2VzcyhsYXdmdWxCeVB1YmxpY0ludGVyZXN0KTsKKyAgICBfYnVpbGRlci5hcHBlbmQoX2RhdGFDb250cm9sZXJGcm9tUHJvY2Vzcyk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcIiIpOworICAgIHJldHVybiBfYnVpbGRlcjsKKyAgfQorICAKKyAgLyoqCisgICAqIGdldCBEZXNjcmlwdGlvbiBmb3IgbGF3ZnVsbEJ5Q29uc2VudCByZXF1aXJlbWVudHMgZnJvbSBhcnRpY2xlNi4xLmYKKyAgICovCisgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0RGVzY3JpcHRpb25Gb3JMYXdmdWxCeUxlZ2l0aW1hdGVJbnRlcmVzdChmaW5hbCBMYXdmdWxCeUxlZ2l0aW1hdGVJbnRlcmVzdCBsYXdmdWxCeUxlZ2l0aW1hdGVJbnRlcmVzdCkgeworICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgIF9idWlsZGVyLmFwcGVuZCgiUHJvY2Vzc2luZyA6XCIiKTsKKyAgICBTdHJpbmcgX25hbWUgPSBsYXdmdWxCeUxlZ2l0aW1hdGVJbnRlcmVzdC5nZXRQcm9jZXNzKCkuZ2V0QmFzZV9OYW1lZEVsZW1lbnQoKS5nZXROYW1lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlwiIHNoYWxsIGJlIGxhd2Z1bCBpZiBwcm9jZXNzaW5nIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIHB1cnBvc2VzIG9mIHRoZSBsZWdpdGltYXRlIGludGVyZXN0cyA6XCIiKTsKKyAgICBTdHJpbmcgX25hbWVfMSA9IGxhd2Z1bEJ5TGVnaXRpbWF0ZUludGVyZXN0LmdldExlZ2l0aW1hdGVJbnRlcmVzdCgpLmdldEJhc2VfTmFtZWRFbGVtZW50KCkuZ2V0TmFtZSgpOworICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZV8xKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlwiIHB1cnN1ZWQgYnkgdGhlIGNvbnRyb2xsZXIgOlwiIik7CisgICAgU3RyaW5nIF9kYXRhQ29udHJvbGVyRnJvbVByb2Nlc3MgPSB0aGlzLmdldERhdGFDb250cm9sZXJGcm9tUHJvY2VzcyhsYXdmdWxCeUxlZ2l0aW1hdGVJbnRlcmVzdCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKF9kYXRhQ29udHJvbGVyRnJvbVByb2Nlc3MpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXCJvciBieSBhIHRoaXJkIHBhcnR5LCBleGNlcHQgd2hlcmUgc3VjaCBpbnRlcmVzdHMgYXJlIG92ZXJyaWRkZW4gYnkgdGhlIGludGVyZXN0cyBvciBmdW5kYW1lbnRhbCByaWdodHMgYW5kIGZyZWVkb21zIG9mIHRoZSBkYXRhIHN1YmplY3Qgd2hpY2ggcmVxdWlyZSBwcm90ZWN0aW9uIG9mIHBlcnNvbmFsIGRhdGEsIGluIHBhcnRpY3VsYXIgd2hlcmUgdGhlIGRhdGEgc3ViamVjdCBpcyBhIGNoaWxkLiIpOworICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgcmV0dXJuIF9idWlsZGVyOworICB9CisgIAorICAvKioKKyAgICogZ2V0IERlc2NyaXB0aW9uIGZvciBsYXdmdWxsQnlDb25zZW50IHJlcXVpcmVtZW50cyBmcm9tIGFydGljbGU2LjEuZgorICAgKi8KKyAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXREZXNjcmlwdGlvbkZvckxhd2Z1bEJ5U2FmZUd1YXJkKGZpbmFsIExhd2Z1bGxCeVNhZmVHdWFyZCBsYXdmdWxsQnlTYWZlR3VhcmQpIHsKKyAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIldoZXJlIHRoZSBwcm9jZXNzaW5nIDpcIiIpOworICAgIFN0cmluZyBfbmFtZSA9IGxhd2Z1bGxCeVNhZmVHdWFyZC5nZXRQcm9jZXNzKCkuZ2V0QmFzZV9OYW1lZEVsZW1lbnQoKS5nZXROYW1lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlwiIGZvciBhIHB1cnBvc2UgOlwiIik7CisgICAgU3RyaW5nIF9uYW1lXzEgPSBsYXdmdWxsQnlTYWZlR3VhcmQuZ2V0UHJvY2VzcygpLmdldENvbnRyaWJ1dGVkVG8oKS5nZXRCYXNlX05hbWVkRWxlbWVudCgpLmdldE5hbWUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoX25hbWVfMSk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcIiBvdGhlciB0aGFuIHRoYXQgZm9yIHdoaWNoIHRoZSBwZXJzb25hbCBkYXRhIDpcIiIpOworICAgIFN0cmluZyBfcGVyc29uYWxEYXRhRnJvbVByb2Nlc3MgPSB0aGlzLmdldFBlcnNvbmFsRGF0YUZyb21Qcm9jZXNzKGxhd2Z1bGxCeVNhZmVHdWFyZCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKF9wZXJzb25hbERhdGFGcm9tUHJvY2Vzcyk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcIiBoYXZlIGJlZW4gY29sbGVjdGVkIGlzIG5vdCBiYXNlZCBvbiB0aGUgZGF0YSBzdWJqZWN0knMgY29uc2VudCBvciIpOworICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJvbiBhIFVuaW9uIG9yIE1lbWJlciBTdGF0ZSBsYXcgd2hpY2ggY29uc3RpdHV0ZXMgYSBuZWNlc3NhcnkgYW5kIHByb3BvcnRpb25hdGUgbWVhc3VyZSBpbiBhIGRlbW9jcmF0aWMgc29jaWV0eSB0byBzYWZlZ3VhcmQgdGhlIG9iamVjdGl2ZXMgcmVmZXJyZWQgdG8gaW4gQXJ0aWNsZSAyMygxKSwgdGhlIGNvbnRyb2xsZXIgOlwiIik7CisgICAgU3RyaW5nIF9kYXRhQ29udHJvbGVyRnJvbVByb2Nlc3MgPSB0aGlzLmdldERhdGFDb250cm9sZXJGcm9tUHJvY2VzcyhsYXdmdWxsQnlTYWZlR3VhcmQpOworICAgIF9idWlsZGVyLmFwcGVuZChfZGF0YUNvbnRyb2xlckZyb21Qcm9jZXNzKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlwiIHNoYWxsLCIpOworICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJpbiBvcmRlciB0byBhc2NlcnRhaW4gd2hldGhlciBwcm9jZXNzaW5nIGZvciBhbm90aGVyIHB1cnBvc2UgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBwdXJwb3NlIGZvciB3aGljaCB0aGUgcGVyc29uYWwgZGF0YSBhcmUgaW5pdGlhbGx5IGNvbGxlY3RlZCwgdGFrZSBpbnRvIGFjY291bnQsIGludGVyIGFsaWE6Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiYW55IGxpbmsgYmV0d2VlbiB0aGUgcHVycG9zZXMgIik7CisgICAgU3RyaW5nIF9uYW1lXzIgPSBsYXdmdWxsQnlTYWZlR3VhcmQuZ2V0UHJvY2VzcygpLmdldENvbnRyaWJ1dGVkVG8oKS5nZXRCYXNlX05hbWVkRWxlbWVudCgpLmdldE5hbWUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoX25hbWVfMik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcImZvciB3aGljaCB0aGUgcGVyc29uYWwgZGF0YSA6XCIiKTsKKyAgICBTdHJpbmcgX3BlcnNvbmFsRGF0YUZyb21Qcm9jZXNzXzEgPSB0aGlzLmdldFBlcnNvbmFsRGF0YUZyb21Qcm9jZXNzKGxhd2Z1bGxCeVNhZmVHdWFyZCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKF9wZXJzb25hbERhdGFGcm9tUHJvY2Vzc18xKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlwiaGF2ZSBiZWVuIGNvbGxlY3RlZCBhbmQgdGhlIHB1cnBvc2VzIG9mIHRoZSBpbnRlbmRlZCBmdXJ0aGVyIHByb2Nlc3Npbmc7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0IFx0Iik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCItIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBwZXJzb25hbCBkYXRhOiBcIiIpOworICAgIFN0cmluZyBfcGVyc29uYWxEYXRhRnJvbVByb2Nlc3NfMiA9IHRoaXMuZ2V0UGVyc29uYWxEYXRhRnJvbVByb2Nlc3MobGF3ZnVsbEJ5U2FmZUd1YXJkKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoX3BlcnNvbmFsRGF0YUZyb21Qcm9jZXNzXzIsICJcdCBcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXCIgIGhhdmUgYmVlbiBjb2xsZWN0ZWQsIGluIHBhcnRpY3VsYXIgcmVnYXJkaW5nIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBkYXRhIHN1YmplY3RzIDpcIiIpOworICAgIFN0cmluZyBfbmFtZV8zID0gbGF3ZnVsbEJ5U2FmZUd1YXJkLmdldERhdGFTdWJqZWN0KCkuZ2V0QmFzZV9OYW1lZEVsZW1lbnQoKS5nZXROYW1lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzMsICJcdCBcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXCIgYW5kIHRoZSBjb250cm9sbGVyOiIpOworICAgIFN0cmluZyBfZGF0YUNvbnRyb2xlckZyb21Qcm9jZXNzXzEgPSB0aGlzLmdldERhdGFDb250cm9sZXJGcm9tUHJvY2VzcyhsYXdmdWxsQnlTYWZlR3VhcmQpOworICAgIF9idWlsZGVyLmFwcGVuZChfZGF0YUNvbnRyb2xlckZyb21Qcm9jZXNzXzEsICJcdCBcdCIpOworICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCBcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiLSB0aGUgbmF0dXJlIG9mIHRoZSBwZXJzb25hbCBkYXRhOiBcIiIpOworICAgIFN0cmluZyBfcGVyc29uYWxEYXRhRnJvbVByb2Nlc3NfMyA9IHRoaXMuZ2V0UGVyc29uYWxEYXRhRnJvbVByb2Nlc3MobGF3ZnVsbEJ5U2FmZUd1YXJkKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoX3BlcnNvbmFsRGF0YUZyb21Qcm9jZXNzXzMsICJcdCBcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXCJcIiAsIGluIHBhcnRpY3VsYXIgd2hldGhlciBzcGVjaWFsIGNhdGVnb3JpZXMgb2YgcGVyc29uYWwgZGF0YSBhcmUgcHJvY2Vzc2VkLCBwdXJzdWFudCB0byBBcnRpY2xlIDksIG9yIHdoZXRoZXIgcGVyc29uYWwgZGF0YSByZWxhdGVkIHRvIGNyaW1pbmFsIGNvbnZpY3Rpb25zIGFuZCBvZmZlbmNlcyBhcmUgcHJvY2Vzc2VkLCBwdXJzdWFudCB0byBBcnRpY2xlIDEwOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCBcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiLSB0aGUgcG9zc2libGUgY29uc2VxdWVuY2VzIG9mIHRoZSBpbnRlbmRlZCBmdXJ0aGVyIHByb2Nlc3NpbmcgZm9yIGRhdGEgc3ViamVjdHM6XCIiKTsKKyAgICBTdHJpbmcgX25hbWVfNCA9IGxhd2Z1bGxCeVNhZmVHdWFyZC5nZXREYXRhU3ViamVjdCgpLmdldEJhc2VfTmFtZWRFbGVtZW50KCkuZ2V0TmFtZSgpOworICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZV80LCAiXHQgXHQiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHQgXHQiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIi0gdGhlIGV4aXN0ZW5jZSBvZiBhcHByb3ByaWF0ZSBzYWZlZ3VhcmRzLCB3aGljaCBtYXkgaW5jbHVkZSBlbmNyeXB0aW9uIG9yIHBzZXVkb255bWlzYXRpb24uIik7CisgICAgcmV0dXJuIF9idWlsZGVyOworICB9CisgIAogICBwdWJsaWMgU3RyaW5nIGdldFBlcnNvbmFsRGF0YUZyb21Qcm9jZXNzKGZpbmFsIFByb2Nlc3NQcmluY2lwbGUgUHJvY2Vzc1ByaW5jaXBsZSkgewogICAgIFN0cmluZyByZXN1bHQgPSAiIjsKICAgICBFTGlzdDxQZXJzb25hbERhdGFSZXF1aXJlbWVudD4gX3BlcnNvbmFsRGF0YSA9IFByb2Nlc3NQcmluY2lwbGUuZ2V0UGVyc29uYWxEYXRhKCk7CkBAIC0yMjksNCArMzU5LDIyIEBACiAgICAgfQogICAgIHJldHVybiByZXN1bHQ7CiAgIH0KKyAgCisgIHB1YmxpYyBTdHJpbmcgZ2V0RGF0YUNvbnRyb2xlckZyb21Qcm9jZXNzKGZpbmFsIFByb2Nlc3NQcmluY2lwbGUgUHJvY2Vzc1ByaW5jaXBsZSkgeworICAgIFN0cmluZyByZXN1bHQgPSAiIjsKKyAgICBFTGlzdDxQZXJzb25hbERhdGFSZXF1aXJlbWVudD4gX3BlcnNvbmFsRGF0YSA9IFByb2Nlc3NQcmluY2lwbGUuZ2V0UGVyc29uYWxEYXRhKCk7CisgICAgZm9yIChmaW5hbCBQZXJzb25hbERhdGFSZXF1aXJlbWVudCBkYXRhIDogX3BlcnNvbmFsRGF0YSkgeworICAgICAgU3RyaW5nIF9uYW1lID0gZGF0YS5nZXRSZXNwb25zaWJsZSgpLmdldEJhc2VfTmFtZWRFbGVtZW50KCkuZ2V0TmFtZSgpOworICAgICAgU3RyaW5nIF9wbHVzID0gKCIiICsgX25hbWUpOworICAgICAgaW50IF9pbmRleE9mID0gcmVzdWx0LmluZGV4T2YoX3BsdXMpOworICAgICAgYm9vbGVhbiBfZXF1YWxzID0gKF9pbmRleE9mID09ICgtMSkpOworICAgICAgaWYgKF9lcXVhbHMpIHsKKyAgICAgICAgU3RyaW5nIF9uYW1lXzEgPSBkYXRhLmdldFJlc3BvbnNpYmxlKCkuZ2V0QmFzZV9OYW1lZEVsZW1lbnQoKS5nZXROYW1lKCk7CisgICAgICAgIFN0cmluZyBfcGx1c18xID0gKHJlc3VsdCArIF9uYW1lXzEpOworICAgICAgICBTdHJpbmcgX3BsdXNfMiA9IChfcGx1c18xICsgIiAiKTsKKyAgICAgICAgcmVzdWx0ID0gX3BsdXNfMjsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9yZXEvb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS51aS9zcmMvb3JnL2VjbGlwc2UvcGFweXJ1cy9wZHA0ZW5nL3JlcS91aS9HZW5lcmF0ZUdEUFJSZXF1aXJlbWVudEhhbmRsZXIuamF2YSBiL3BsdWdpbnMvcmVxL29yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEudWkvc3JjL29yZy9lY2xpcHNlL3BhcHlydXMvcGRwNGVuZy9yZXEvdWkvR2VuZXJhdGVHRFBSUmVxdWlyZW1lbnRIYW5kbGVyLmphdmEKaW5kZXggMWQxYmNjYS4uMzc5OGQ5YSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9yZXEvb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS51aS9zcmMvb3JnL2VjbGlwc2UvcGFweXJ1cy9wZHA0ZW5nL3JlcS91aS9HZW5lcmF0ZUdEUFJSZXF1aXJlbWVudEhhbmRsZXIuamF2YQorKysgYi9wbHVnaW5zL3JlcS9vcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnVpL3NyYy9vcmcvZWNsaXBzZS9wYXB5cnVzL3BkcDRlbmcvcmVxL3VpL0dlbmVyYXRlR0RQUlJlcXVpcmVtZW50SGFuZGxlci5qYXZhCkBAIC00NCw2ICs0NCwxMSBAQAogCQkJCXRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoZ2VuZXJhdG9yLmdlbmVyYXRlQXJ0aWNsZTUxZih0cmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiwgKFBhY2thZ2Upc2VsZWN0ZWRFbGVtZW50KSk7CiAJCQkJdHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShnZW5lcmF0b3IuZ2VuZXJhdGVBcnRpY2xlNjFhKHRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluLCAoUGFja2FnZSlzZWxlY3RlZEVsZW1lbnQpKTsKIAkJCQl0cmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGdlbmVyYXRvci5nZW5lcmF0ZUFydGljbGU2MWIodHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4sIChQYWNrYWdlKXNlbGVjdGVkRWxlbWVudCkpOworCQkJCXRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoZ2VuZXJhdG9yLmdlbmVyYXRlQXJ0aWNsZTYxYyh0cmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiwgKFBhY2thZ2Upc2VsZWN0ZWRFbGVtZW50KSk7CisJCQkJdHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShnZW5lcmF0b3IuZ2VuZXJhdGVBcnRpY2xlNjFkKHRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluLCAoUGFja2FnZSlzZWxlY3RlZEVsZW1lbnQpKTsKKwkJCQl0cmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGdlbmVyYXRvci5nZW5lcmF0ZUFydGljbGU2MWUodHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4sIChQYWNrYWdlKXNlbGVjdGVkRWxlbWVudCkpOworCQkJCXRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoZ2VuZXJhdG9yLmdlbmVyYXRlQXJ0aWNsZTYxZih0cmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiwgKFBhY2thZ2Upc2VsZWN0ZWRFbGVtZW50KSk7CisJCQkJdHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShnZW5lcmF0b3IuZ2VuZXJhdGVBcnRpY2xlNjQodHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4sIChQYWNrYWdlKXNlbGVjdGVkRWxlbWVudCkpOwogCQkJCQogCQkJfQogCQkJcmV0dXJuIG51bGw7Cg==