LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA4IEplc3BlciBTdGVlbiBN+GxsZXIKICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKICoKICogQ29udHJpYnV0b3JzOgogKiAgICAgSmVzcGVyIFN0ZWVuIE34bGxlciAtIGluaXRpYWwgWFNMIGxhdW5jaGluZyB0ZXN0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy50ZXN0cy50ZXN0Y2FzZTsKCmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwppbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKCmltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CmltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwppbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKCmltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CgppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7CmltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnUGx1Z2luOwppbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoOwppbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7CmltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy50ZXN0cy5UZXN0RW52aXJvbm1lbnQ7CmltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKCnB1YmxpYyBjbGFzcyBYU0xMYXVuY2hpbmdUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKCQoJcHJpdmF0ZSBUZXN0RW52aXJvbm1lbnQgX2VudjsKCXByaXZhdGUgSVByb2plY3QJCV90ZXN0UHJvamVjdDsKCglwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewoJCXN1cGVyLnNldFVwKCk7CgkJX2VudiA9IG5ldyBUZXN0RW52aXJvbm1lbnQoKTsKCQlfdGVzdFByb2plY3QgPSBfZW52LmNyZWF0ZVByb2plY3QoIlhTTFRlc3RQcm9qZWN0Iik7Cgl9CgoJcHVibGljIHZvaWQgdGVzdEJ1aWxkQ29uZmlnKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLCBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKCQlJUGF0aCBmb2xkZXIgPSBfdGVzdFByb2plY3QuZ2V0RnVsbFBhdGgoKTsKCQlfZW52LmFkZEZpbGVGcm9tUmVzb3VyY2UoZm9sZGVyLCAiaW5wdXQueG1sIiwgIjEtaW5wdXQueG1sIik7CgkJX2Vudi5hZGRGaWxlRnJvbVJlc291cmNlKGZvbGRlciwgInRyYW5zZm9ybS54c2wiLCAiMS10cmFuc2Zvcm0ueHNsIik7Ci8vCi8vCQlTdHJpbmcgbGF1bmNoWG1sID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCIgc3RhbmRhbG9uZT1cIm5vXCI/PlxyXG4iICsgCi8vCQkJCSI8bGF1bmNoQ29uZmlndXJhdGlvbiB0eXBlPVwib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcubGF1bmNoQ29uZmlndXJhdGlvblR5cGVcIj5cclxuIiArIAovLwkJCQkiPHN0cmluZ0F0dHJpYnV0ZSBrZXk9XCJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5BVFRSX0lOUFVUX0ZJTEVcIiB2YWx1ZT1cIiR7d29ya3NwYWNlX2xvYzovWFNMVGVzdFByb2plY3QvaW5wdXQueG1sfVwiLz5cclxuIiArIAovLwkJCQkiPGJvb2xlYW5BdHRyaWJ1dGUga2V5PVwib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuQVRUUl9PUEVOX0ZJTEVcIiB2YWx1ZT1cImZhbHNlXCIvPlxyXG4iICsgCi8vCQkJCSI8c3RyaW5nQXR0cmlidXRlIGtleT1cIm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLkFUVFJfT1VUUFVUX0ZJTEVcIiB2YWx1ZT1cIiR7d29ya3NwYWNlX2xvYzovWFNMVGVzdFByb2plY3R9L291dHB1dC54bWxcIi8+XHJcbiIgKyAKLy8JCQkJIjxzdHJpbmdBdHRyaWJ1dGUga2V5PVwib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuQVRUUl9PVVRQVVRfUFJPUEVSVElFU1wiIHZhbHVlPVwiJmx0Oz94bWwgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsgZW5jb2Rpbmc9JnF1b3Q7VVRGLTgmcXVvdDsgc3RhbmRhbG9uZT0mcXVvdDtubyZxdW90Oz8mZ3Q7JiMxMzsmIzEwOyZsdDtQcm9wZXJ0aWVzJmd0OyYjMTM7JiMxMDsmbHQ7UHJvcGVydHkgbmFtZT0mcXVvdDtpbmRlbnQmcXVvdDsgdmFsdWU9JnF1b3Q7eWVzJnF1b3Q7LyZndDsmIzEzOyYjMTA7Jmx0Oy9Qcm9wZXJ0aWVzJmd0OyYjMTM7JiMxMDtcIi8+XHJcbiIgKyAKLy8JCQkJIjxzdHJpbmdBdHRyaWJ1dGUga2V5PVwib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuQVRUUl9QSVBFTElORVwiIHZhbHVlPVwiJmx0Oz94bWwgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsgZW5jb2Rpbmc9JnF1b3Q7VVRGLTgmcXVvdDsgc3RhbmRhbG9uZT0mcXVvdDtubyZxdW90Oz8mZ3Q7JiMxMzsmIzEwOyZsdDtQaXBlbGluZSZndDsmIzEzOyYjMTA7Jmx0O091dHB1dFByb3BlcnRpZXMvJmd0OyYjMTM7JiMxMDsmbHQ7VHJhbnNmb3JtIHBhdGg9JnF1b3Q7L1hTTFRlc3RQcm9qZWN0L3RyYW5zZm9ybS54c2wmcXVvdDsgcGF0aFR5cGU9JnF1b3Q7cmVzb3VyY2UmcXVvdDsgdXJpUmVzb2x2ZXI9JnF1b3Q7JnF1b3Q7Jmd0OyYjMTM7JiMxMDsmbHQ7UGFyYW1ldGVycy8mZ3Q7JiMxMzsmIzEwOyZsdDsvVHJhbnNmb3JtJmd0OyYjMTM7JiMxMDsmbHQ7L1BpcGVsaW5lJmd0OyYjMTM7JiMxMDtcIi8+XHJcbiIgKyAKLy8JCQkJIjxzdHJpbmdBdHRyaWJ1dGUga2V5PVwib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuQVRUUl9QUk9DRVNTT1JcIiB2YWx1ZT1cIm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmpyZS5kZWZhdWx0XCIvPlxyXG4iICsgCi8vCQkJCSI8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9XCJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5BVFRSX1VTRV9ERUZBVUxUX09VVFBVVF9GSUxFXCIgdmFsdWU9XCJmYWxzZVwiLz5cclxuIiArIAovLwkJCQkiPGJvb2xlYW5BdHRyaWJ1dGUga2V5PVwib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuQVRUUl9VU0VfREVGQVVMVF9QUk9DRVNTT1JcIiB2YWx1ZT1cImZhbHNlXCIvPlxyXG4iICsgCi8vCQkJCSI8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9XCJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5BVFRSX1VTRV9GRUFUVVJFU19GUk9NX1BSRUZFUkVOQ0VTXCIgdmFsdWU9XCJ0cnVlXCIvPlxyXG4iICsgCi8vCQkJCSI8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9XCJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5BVFRSX1VTRV9QUk9QRVJUSUVTX0ZST01fUFJFRkVSRU5DRVNcIiB2YWx1ZT1cInRydWVcIi8+XHJcbiIgKyAKLy8JCQkJIjxzdHJpbmdBdHRyaWJ1dGUga2V5PVwib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuSU5WT0tFUl9ERVNDUklQVE9SXCIgdmFsdWU9XCJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5qYXhwLmludm9rZVwiLz5cclxuIiArIAovLwkJCQkiPC9sYXVuY2hDb25maWd1cmF0aW9uPiI7CgkJCgkJU3RyaW5nIGxhdW5jaFhtbCA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiIHN0YW5kYWxvbmU9XCJub1wiPz4iICsKCQkiPGxhdW5jaENvbmZpZ3VyYXRpb24gdHlwZT1cIm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlXCI+IiArCgkJIjxzdHJpbmdBdHRyaWJ1dGUga2V5PVwib3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5BVFRSX0FUVFJJQlVURVNcIiB2YWx1ZT1cIiZsdDs/eG1sIHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7IGVuY29kaW5nPSZxdW90O1VURi04JnF1b3Q7IHN0YW5kYWxvbmU9JnF1b3Q7bm8mcXVvdDs/Jmd0OyYjMTM7JiMxMDsmbHQ7QXR0cmlidXRlcy8mZ3Q7JiMxMzsmIzEwO1wiLz4iICsKCQkiPHN0cmluZ0F0dHJpYnV0ZSBrZXk9XCJvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLkFUVFJfT1VUUFVUX1BST1BFUlRJRVNcIiB2YWx1ZT1cIiZsdDs/eG1sIHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7IGVuY29kaW5nPSZxdW90O1VURi04JnF1b3Q7IHN0YW5kYWxvbmU9JnF1b3Q7bm8mcXVvdDs/Jmd0OyYjMTM7JiMxMDsmbHQ7UHJvcGVydGllcy8mZ3Q7JiMxMzsmIzEwO1wiLz4iICsKCQkiPGJvb2xlYW5BdHRyaWJ1dGUga2V5PVwib3JnLmVjbGlwc2Uud3N0LnhzbC5qYXhwLmxhdW5jaGluZy5BVFRSX1VTRV9ERUZBVUxUX1BST0NFU1NPUlwiIHZhbHVlPVwidHJ1ZVwiLz4iICsKCQkiPHN0cmluZ0F0dHJpYnV0ZSBrZXk9XCJvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLklOVk9LRVJfREVTQ1JJUFRPUlwiIHZhbHVlPVwib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuamF4cC5pbnZva2VcIi8+IiArCgkJIjxib29sZWFuQXR0cmlidXRlIGtleT1cIm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLkFUVFJfRk9STUFUX0ZJTEVcIiB2YWx1ZT1cImZhbHNlXCIvPiIgKwoJCSI8c3RyaW5nQXR0cmlidXRlIGtleT1cIm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLkFUVFJfSU5QVVRfRklMRVwiIHZhbHVlPVwiJHt3b3Jrc3BhY2VfbG9jOi9YU0xUZXN0UHJvamVjdC9pbnB1dC54bWx9XCIvPiIgKwoJCSI8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9XCJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5BVFRSX09QRU5fRklMRVwiIHZhbHVlPVwidHJ1ZVwiLz4iICsKCQkiPHN0cmluZ0F0dHJpYnV0ZSBrZXk9XCJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5BVFRSX09VVFBVVF9GSUxFTkFNRVwiIHZhbHVlPVwib3V0cHV0LnhtbFwiLz4iICsKCQkiPHN0cmluZ0F0dHJpYnV0ZSBrZXk9XCJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5BVFRSX1BJUEVMSU5FXCIgdmFsdWU9XCImbHQ7P3htbCB2ZXJzaW9uPSZxdW90OzEuMCZxdW90OyBlbmNvZGluZz0mcXVvdDtVVEYtOCZxdW90OyBzdGFuZGFsb25lPSZxdW90O25vJnF1b3Q7PyZndDsmIzEzOyYjMTA7Jmx0O1BpcGVsaW5lJmd0OyYjMTM7JiMxMDsmbHQ7T3V0cHV0UHJvcGVydGllcy8mZ3Q7JiMxMzsmIzEwOyZsdDtUcmFuc2Zvcm0gcGF0aD0mcXVvdDsvWFNMVGVzdFByb2plY3QvdHJhbnNmb3JtLnhzbCZxdW90OyBwYXRoVHlwZT0mcXVvdDtyZXNvdXJjZSZxdW90OyZndDsmIzEzOyYjMTA7Jmx0O1BhcmFtZXRlcnMvJmd0OyYjMTM7JiMxMDsmbHQ7L1RyYW5zZm9ybSZndDsmIzEzOyYjMTA7Jmx0Oy9QaXBlbGluZSZndDsmIzEzOyYjMTA7XCIvPiIgKwoJCSI8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9XCJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5BVFRSX1VTRV9ERUZBVUxUX09VVFBVVF9GSUxFXCIgdmFsdWU9XCJmYWxzZVwiLz4iICsKCQkiPHN0cmluZ0F0dHJpYnV0ZSBrZXk9XCJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5BVFRSX09VVFBVVF9GT0xERVJcIiB2YWx1ZT1cIiR7d29ya3NwYWNlX2xvYzovWFNMVGVzdFByb2plY3R9XCIvPiIgKwoJCSI8L2xhdW5jaENvbmZpZ3VyYXRpb24+IjsKCgkJCgkJU3RyaW5nIG5hbWUgPSAibGF1bmNoIiArIChpbnQpKE1hdGgucmFuZG9tKCkqMTAwMCk7CgkJX2Vudi5hZGRGaWxlKGZvbGRlciwgbmFtZSArICIubGF1bmNoIiwgbGF1bmNoWG1sKTsKCQkKCQlJTGF1bmNoTWFuYWdlciBtZ3IgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF1bmNoTWFuYWdlcigpOyAgCgkJSUxhdW5jaENvbmZpZ3VyYXRpb25bXSBhbGxDb25maWdzID0gbWdyLmdldExhdW5jaENvbmZpZ3VyYXRpb25zKCk7CgkJSUxhdW5jaENvbmZpZ3VyYXRpb24gbWluZSA9IG51bGw7CgkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwoJCWZvciAoSUxhdW5jaENvbmZpZ3VyYXRpb24gbGMgOiBhbGxDb25maWdzKSB7CgkJCWlmIChsYy5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7CgkJCQlmb3VuZCA9IHRydWU7CgkJCQltaW5lID0gbGM7CgkJCQlhc3NlcnRFcXVhbHMoImJhZCBsYXVuY2ggY29uZmlnIHR5cGU/IiwgIm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIiwgbGMuZ2V0VHlwZSgpLmdldElkZW50aWZpZXIoKSk7CgkJCQlhc3NlcnRFcXVhbHMoImJhZCBsYXVuY2ggY29uZmlnIHBsdWdpbj8iLCAib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmciLCBsYy5nZXRUeXBlKCkuZ2V0UGx1Z2luSWRlbnRpZmllcigpKTsKCQkJfQoJCX0KCQlhc3NlcnRUcnVlKCJleHBlY3RlZCB0byBmaW5kIHRoZSBsYXVuY2ggY29uZmlnIHdlIGp1c3QgYWRkZWQiLCBmb3VuZCk7CgoJCUlMYXVuY2ggbGF1bmNoID0gbWluZS5sYXVuY2goSUxhdW5jaE1hbmFnZXIuUlVOX01PREUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgMjAwICYmICEgbGF1bmNoLmlzVGVybWluYXRlZCgpOyArK2kpIHsKCQkJU3lzdGVtLm91dC5wcmludGxuKCJ3YWl0aW5nIik7CgkJCVRocmVhZC5zbGVlcCgxMDApOwoJCX0KCQlhc3NlcnRUcnVlKCJMYXVuY2ggZGlkIG5vdCBjb21wbGV0ZSB3aXRoaW4gYSAyMCBzZWNvbmQgdGltZSBwZXJpb2QiLCBsYXVuY2guaXNUZXJtaW5hdGVkKCkpOwoKCQlfdGVzdFByb2plY3QucmVmcmVzaExvY2FsKDIsIG51bGwpOwoJCUlGaWxlIG91dHB1dCA9IF90ZXN0UHJvamVjdC5nZXRGaWxlKCJvdXRwdXQueG1sIik7CgkJRG9jdW1lbnQgZG9jID0gcGFyc2VYbWwob3V0cHV0LmdldENvbnRlbnRzKHRydWUpKTsKCQkKCQlhc3NlcnRFcXVhbHMoInJvb3Qtb3V0IiwgZG9jLmdldERvY3VtZW50RWxlbWVudCgpLmdldE5vZGVOYW1lKCkpOwoJfQoJCglwdWJsaWMgdm9pZCB0ZXN0Tm90aGluZygpIHsJCgl9CgkKCXN0YXRpYyBwcml2YXRlIERvY3VtZW50IHBhcnNlWG1sKElucHV0U3RyZWFtIGNvbnRlbnRzKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CgkJRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBidWlsZGVyRmFjdG9yeSA9CgkJCSAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwoJCQlEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9CgkJCSAgYnVpbGRlckZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7CgkJCQoJCQlyZXR1cm4gYnVpbGRlci5wYXJzZShjb250ZW50cyk7Cgl9CgoJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKCQlfZW52LmRpc3Bvc2UoKTsKCQlzdXBlci50ZWFyRG93bigpOwoJfQp9Cg==