LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCiAqIAogKiBDb250cmlidXRvcnM6CiAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkczsKCmltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7CmltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwppbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYVByb2plY3Q7CmltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuQ29ubmVjdGlvblByb2ZpbGU7CmltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuU2NoZW1hOwppbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLlRhYmxlOwppbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC5FbnRpdHlHZW5lcmF0b3I7CmltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLlBhY2thZ2VHZW5lcmF0b3I7CmltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKCnB1YmxpYyBjbGFzcyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkIGV4dGVuZHMgV2l6YXJkIHsJCgoJcHJpdmF0ZSBJSnBhUHJvamVjdCBqcGFQcm9qZWN0OwoKCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOwoKCS8qKiB0aGlzIHBhZ2UgaXMgb25seSBidWlsdCB3aGVuIHRoZSBwcm9qZWN0IGlzIG5vdCBjb25uZWN0ZWQgdG8gdGhlIGRiICovCglwcml2YXRlIERhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZSBkYlNldHRpbmdzUGFnZTsKCglwcml2YXRlIEdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlIGdlbmVyYXRlRW50aXRpZXNQYWdlOwoKCXByaXZhdGUgUGFja2FnZUdlbmVyYXRvci5Db25maWcgcGFja2FnZUdlbmVyYXRvckNvbmZpZzsKCglwcml2YXRlIEVudGl0eUdlbmVyYXRvci5Db25maWcgZW50aXR5R2VuZXJhdG9yQ29uZmlnOwoKCXByaXZhdGUgYm9vbGVhbiBzeW5jaHJvbml6ZVBlcnNpc3RlbmNlWG1sOwoJCglwcml2YXRlIENvbGxlY3Rpb248VGFibGU+IHNlbGVjdGVkVGFibGVzOwoKCXB1YmxpYyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkKCBJSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKCQlzdXBlcigpOwoJCXRoaXMuanBhUHJvamVjdCA9IGpwYVByb2plY3Q7CgkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247CgkJdGhpcy5wYWNrYWdlR2VuZXJhdG9yQ29uZmlnID0gbmV3IFBhY2thZ2VHZW5lcmF0b3IuQ29uZmlnKCk7CgkJdGhpcy5lbnRpdHlHZW5lcmF0b3JDb25maWcgPSBuZXcgRW50aXR5R2VuZXJhdG9yLkNvbmZpZygpOwoJCXRoaXMuc2V0V2luZG93VGl0bGUoIEpwdFVpTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9nZW5lcmF0ZUVudGl0aWVzKTsKCX0KCQoJcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7CgkJc3VwZXIuYWRkUGFnZXMoKTsKCQl0aGlzLmRiU2V0dGluZ3NQYWdlID0gbmV3IERhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZSggdGhpcy5qcGFQcm9qZWN0KTsKCQl0aGlzLmFkZFBhZ2UodGhpcy5kYlNldHRpbmdzUGFnZSk7CgkJdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZSA9IG5ldyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZSgpOwoJCXRoaXMuYWRkUGFnZSggdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZSk7CgkJdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5pbml0KCB0aGlzLnNlbGVjdGlvbik7Cgl9CgkKCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7CgkJdGhpcy5wYWNrYWdlR2VuZXJhdG9yQ29uZmlnLnNldFBhY2thZ2VGcmFnbWVudCggdGhpcy5idWlsZFBhY2thZ2VGcmFnbWVudCgpKTsKCgkJdGhpcy5lbnRpdHlHZW5lcmF0b3JDb25maWcuc2V0Q29udmVydFRvQ2FtZWxDYXNlKCB0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLmNvbnZlcnRUb0NhbWVsQ2FzZSgpKTsKCQl0aGlzLmVudGl0eUdlbmVyYXRvckNvbmZpZy5zZXRGaWVsZEFjY2Vzc1R5cGUoIHRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2UuZmllbGRBY2Nlc3NUeXBlKCkpOwoJCXRoaXMuZW50aXR5R2VuZXJhdG9yQ29uZmlnLnNldENvbGxlY3Rpb25UeXBlTmFtZSggdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5nZXRDb2xsZWN0aW9uVHlwZU5hbWUoKSk7CgkJdGhpcy5lbnRpdHlHZW5lcmF0b3JDb25maWcuc2V0RmllbGRWaXNpYmlsaXR5KCB0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLmdldEZpZWxkVmlzaWJpbGl0eSgpKTsKCQl0aGlzLmVudGl0eUdlbmVyYXRvckNvbmZpZy5zZXRNZXRob2RWaXNpYmlsaXR5KCB0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLmdldE1ldGhvZFZpc2liaWxpdHkoKSk7CgkJdGhpcy5lbnRpdHlHZW5lcmF0b3JDb25maWcuc2V0R2VuZXJhdGVHZXR0ZXJzQW5kU2V0dGVycyggdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5nZW5lcmF0ZUdldHRlcnNBbmRTZXR0ZXJzKCkpOwoJCXRoaXMuZW50aXR5R2VuZXJhdG9yQ29uZmlnLnNldEdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yKCB0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLmdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yKCkpOwoJCXRoaXMuZW50aXR5R2VuZXJhdG9yQ29uZmlnLnNldFNlcmlhbGl6YWJsZSggdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5zZXJpYWxpemFibGUoKSk7CgkJdGhpcy5lbnRpdHlHZW5lcmF0b3JDb25maWcuc2V0R2VuZXJhdGVTZXJpYWxWZXJzaW9uVUlEKCB0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLmdlbmVyYXRlU2VyaWFsVmVyc2lvblVJRCgpKTsKCQl0aGlzLmVudGl0eUdlbmVyYXRvckNvbmZpZy5zZXRHZW5lcmF0ZUVtYmVkZGVkSWRGb3JDb21wb3VuZFBLKCB0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLmdlbmVyYXRlRW1iZWRkZWRJZEZvckNvbXBvdW5kUEsoKSk7CgkJdGhpcy5lbnRpdHlHZW5lcmF0b3JDb25maWcuc2V0T3ZlcnJpZGVFbnRpdHlOYW1lcyggdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5nZXRPdmVycmlkZUVudGl0eU5hbWVzKCkpOwoKCQl0aGlzLnN5bmNocm9uaXplUGVyc2lzdGVuY2VYbWwgPSB0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLnN5bmNocm9uaXplUGVyc2lzdGVuY2VYbWwoKTsKCQkKCQl0aGlzLnNlbGVjdGVkVGFibGVzID0gdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5nZXRTZWxlY3RlZFRhYmxlcygpOwoJCXJldHVybiB0cnVlOwoJfQoJCglwcml2YXRlIElQYWNrYWdlRnJhZ21lbnQgYnVpbGRQYWNrYWdlRnJhZ21lbnQoKSB7CgkJSVBhY2thZ2VGcmFnbWVudFJvb3QgcGFja2FnZUZyYWdtZW50Um9vdCA9IHRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2UuZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpOwoJCUlQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50ID0gdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5nZXRQYWNrYWdlRnJhZ21lbnQoKTsKCQkKCQlpZiAoIHBhY2thZ2VGcmFnbWVudCA9PSBudWxsKSB7CgkJCXBhY2thZ2VGcmFnbWVudD0gcGFja2FnZUZyYWdtZW50Um9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoICIiKTsgLy8kTk9OLU5MUy0xJAoJCX0KCQkKCQlpZiAoIHBhY2thZ2VGcmFnbWVudC5leGlzdHMoKSkgewoJCQlyZXR1cm4gcGFja2FnZUZyYWdtZW50OwoJCX0KCgkJdHJ5IHsKCQkJcmV0dXJuIHBhY2thZ2VGcmFnbWVudFJvb3QuY3JlYXRlUGFja2FnZUZyYWdtZW50KCBwYWNrYWdlRnJhZ21lbnQuZ2V0RWxlbWVudE5hbWUoKSwgdHJ1ZSwgbnVsbCk7CgkJfSAKCQljYXRjaCAoIEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewoJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggZXgpOwoJCX0KCX0KCQoJQ29sbGVjdGlvbjxUYWJsZT4gZ2V0UG9zc2libGVUYWJsZXMoKSB7CgkJaWYgKCB0aGlzLmRiU2V0dGluZ3NQYWdlICE9IG51bGwpIHsKCQkJcmV0dXJuIHRoaXMuZGJTZXR0aW5nc1BhZ2UuZ2V0VGFibGVzKCk7CgkJfQoJCXJldHVybiAoIHRoaXMucHJvamVjdERlZmF1bHRTY2hlbWFFeGlzdHMoKSkgPyBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbiggdGhpcy5nZXREZWZhdWx0U2NoZW1hKCkudGFibGVzKCkpIDogQ29sbGVjdGlvbnMuPFRhYmxlPmVtcHR5TGlzdCgpOwoJfQoJCglDb25uZWN0aW9uUHJvZmlsZSBnZXRQcm9qZWN0Q29ubmVjdGlvblByb2ZpbGUoKSB7CgkJcmV0dXJuIHRoaXMuanBhUHJvamVjdC5jb25uZWN0aW9uUHJvZmlsZSgpOwoJfQoJCglJSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCl7CgkJcmV0dXJuIHRoaXMuanBhUHJvamVjdDsKCX0KCglTY2hlbWEgZ2V0RGVmYXVsdFNjaGVtYSgpIHsKCQlDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlID0gZ2V0UHJvamVjdENvbm5lY3Rpb25Qcm9maWxlKCk7CgkJcmV0dXJuIHByb2ZpbGUuZ2V0RGF0YWJhc2UoKS5zY2hlbWFOYW1lZCggcHJvZmlsZS5nZXREZWZhdWx0U2NoZW1hKCkpOwoJfQoJCglwdWJsaWMgUGFja2FnZUdlbmVyYXRvci5Db25maWcgZ2V0UGFja2FnZUdlbmVyYXRvckNvbmZpZygpIHsKCQlyZXR1cm4gdGhpcy5wYWNrYWdlR2VuZXJhdG9yQ29uZmlnOwoJfQoKCXB1YmxpYyBFbnRpdHlHZW5lcmF0b3IuQ29uZmlnIGdldEVudGl0eUdlbmVyYXRvckNvbmZpZygpIHsKCQlyZXR1cm4gdGhpcy5lbnRpdHlHZW5lcmF0b3JDb25maWc7Cgl9CgoJcHVibGljIENvbGxlY3Rpb248VGFibGU+IGdldFNlbGVjdGVkVGFibGVzKCkgewoJCXJldHVybiB0aGlzLnNlbGVjdGVkVGFibGVzOwoJfQoJCglwdWJsaWMgYm9vbGVhbiBzeW5jaHJvbml6ZVBlcnNpc3RlbmNlWG1sKCl7CgkJcmV0dXJuIHRoaXMuc3luY2hyb25pemVQZXJzaXN0ZW5jZVhtbDsKCX0KCQogICAgcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewogICAgICAgIGJvb2xlYW4gY2FuRmluaXNoID0gdHJ1ZTsKICAgICAgICBpZiAoICEgdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5pc1BhZ2VDb21wbGV0ZSgpKSB7CiAgICAgICAgCWNhbkZpbmlzaCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY2FuRmluaXNoOwogICAgfQogICAgCglwcml2YXRlIGJvb2xlYW4ganBhUHJvamVjdElzQ29ubmVjdGVkKCkgewoJCXJldHVybiB0aGlzLmdldFByb2plY3RDb25uZWN0aW9uUHJvZmlsZSgpLmlzQ29ubmVjdGVkKCk7Cgl9CgoJcHJpdmF0ZSBib29sZWFuIHByb2plY3REZWZhdWx0U2NoZW1hRXhpc3RzKCkgewoJCXJldHVybiAoIHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpICE9IG51bGwpOwoJfQoJCgkvKioKCSAqIHVwZGF0ZVBvc3NpYmxlVGFibGVzIGlzIGNhbGxlZCB3aGVuIHNjaGVtYZJzIFBvc3NpYmxlVGFibGVzIGNoYW5nZWQuCgkgKiBUaGUgZGJTZXR0aW5nc1BhZ2UgaXMgbWFpbmx5IHRoZSBzb3VyY2Ugb2YgY2hhbmdlcywgCgkgKiBhbmQgdGhlIGdlbmVyYXRlRW50aXRpZXNQYWdlIG5lZWRzIHRvIGJlIGtlcHQgaW4gc3luYy4KCSAqLwoJdm9pZCB1cGRhdGVQb3NzaWJsZVRhYmxlcyggQ29sbGVjdGlvbjxUYWJsZT4gcG9zc2libGVUYWJsZXMpIHsKCQl0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLnVwZGF0ZVRhYmxlc0xpc3RWaWV3ZXIoIHBvc3NpYmxlVGFibGVzKTsKCX0KCn0K