LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCiAqIAogKiBDb250cmlidXRvcnM6CiAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLmludGVybmFsLmRyaXZlcjsKCmltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwppbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwppbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5EYXRhYmFzZTsKCmNsYXNzIFN5YmFzZQoJZXh0ZW5kcyBBYnN0cmFjdERUUERyaXZlckFkYXB0ZXIKewoJU3liYXNlKERhdGFiYXNlIGRhdGFiYXNlKSB7CgkJc3VwZXIoZGF0YWJhc2UpOwoJfQoKCUBPdmVycmlkZQoJQ2F0YWxvZ1N0cmF0ZWd5IGJ1aWxkQ2F0YWxvZ1N0cmF0ZWd5KCkgewoJCXJldHVybiBuZXcgU2ltcGxlQ2F0YWxvZ1N0cmF0ZWd5KHRoaXMuZGF0YWJhc2UuZ2V0RFRQRGF0YWJhc2UoKSk7Cgl9CgoJQE92ZXJyaWRlCglGb2xkaW5nU3RyYXRlZ3kgYnVpbGRGb2xkaW5nU3RyYXRlZ3koKSB7CgkJcmV0dXJuIE5vbkZvbGRpbmdTdHJhdGVneS5pbnN0YW5jZSgpOwoJfQoKCS8qKgoJICogQnkgZGVmYXVsdCwgU3liYXNlIGlkZW50aWZpZXJzIGFyZSBjYXNlLXNlbnNpdGl2ZSwgZXZlbiB3aXRob3V0CgkgKiBkZWxpbWl0ZXJzLiBUaGlzIGNhbiBkZXBlbmQgb24gdGhlIGNvbGxhdGlvbiBzZXR0aW5nLi4uLgoJICovCgkvL1RPRE8gcXVlcnkgZGF0YWJhc2UgZm9yIGNvbGxhdGlvbiBzZXR0aW5nCglAT3ZlcnJpZGUKCWJvb2xlYW4gcmVndWxhck5hbWVzTWF0Y2goU3RyaW5nIG5hbWUxLCBTdHJpbmcgbmFtZTIpIHsKCQlyZXR1cm4gbmFtZTEuZXF1YWxzKG5hbWUyKTsKCX0KCgkvKioKCSAqIFN5YmFzZSB3aWxsIHVzZSB0aGUgdXNlci1yZXF1ZXN0ZWQgZGF0YWJhc2U7IGlmIHRoYXQgZGF0YWJhc2UgaXMgbm90CgkgKiBmb3VuZCwgaXQgd2lsbCBkZWZhdWx0IHRvIDxjb2RlPm1hc3RlcjwvY29kZT4uCgkgKi8KCUBPdmVycmlkZQoJdm9pZCBhZGREZWZhdWx0Q2F0YWxvZ05hbWVzVG8oQXJyYXlMaXN0PFN0cmluZz4gbmFtZXMpIHsKCQluYW1lcy5hZGQodGhpcy5kYXRhYmFzZS5nZXROYW1lKCkpOwoJCW5hbWVzLmFkZChNQVNURVJfQ0FUQUxPR19OQU1FKTsKCX0KCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQVNURVJfQ0FUQUxPR19OQU1FID0gIm1hc3RlciI7ICAvLyROT04tTkxTLTEkCgoJLyoqCgkgKiBUaGUgdHlwaWNhbCBkZWZhdWx0IHNjaGVtYSBvbiBTeWJhc2UgZm9yIGFueSBkYXRhYmFzZSAoY2F0YWxvZykgaXMKCSAqIDxjb2RlPmRibzwvY29kZT4uCgkgKiA8YnI+CgkgKiBBY3R1YWxseSwgdGhlIGRlZmF1bHQgc2NoZW1hIGlzIG1vcmUgbGlrZSBhIHNlYXJjaCBwYXRoOgoJICogVGhlIHNlcnZlciBsb29rcyBmb3IgYSBzY2hlbWEgb2JqZWN0IChlLmcuIGEgdGFibGUpIGZpcnN0IGluIHRoZSB1c2VyJ3MKCSAqIHNjaGVtYSwgdGhlbiBpdCBsb29rcyBmb3IgdGhlIHNjaGVtYSBvYmplY3QgaW4gdGhlIGRhdGFiYXNlIG93bmVyJ3MKCSAqIHNjaGVtYSAoPGNvZGU+ZGJvPC9jb2RlPikuIEFzIGEgcmVzdWx0LCBpdCdzIHJlYWxseSBub3QgcG9zc2libGUgdG8gc3BlY2lmeQoJICogdGhlICJkZWZhdWx0IiBzY2hlbWEgd2l0aG91dCBrbm93aW5nIHRoZSBzY2hlbWEgb2JqZWN0IHdlIGFyZQoJICogbG9va2luZyBmb3IuCgkgKiA8YnI+CgkgKiAoTm90ZTogdGhlIGN1cnJlbnQgJ3VzZXInIGlzIG5vdCB0aGUgc2FtZSB0aGluZyBhcyB0aGUgY3VycmVudAoJICogJ2xvZ2luJyAtIHNlZSBzcF9hZGR1c2VyIGFuZCBzcF9hZGRsb2dpbjsgc28gd2UgcHJvYmFibHkgY2FuJ3QKCSAqIHVzZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db25uZWN0aW9uUHJvZmlsZSNnZXRVc2VyTmFtZSgpfS4pCgkgKi8KCUBPdmVycmlkZQoJdm9pZCBhZGREZWZhdWx0U2NoZW1hTmFtZXNUbyhBcnJheUxpc3Q8U3RyaW5nPiBuYW1lcykgewoJCW5hbWVzLmFkZChERUZBVUxUX1NDSEVNQV9OQU1FKTsKCX0KCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NDSEVNQV9OQU1FID0gImRibyI7ICAvLyROT04tTkxTLTEkCgoJQE92ZXJyaWRlCgljaGFyW10gZ2V0RXh0ZW5kZWRSZWd1bGFyTmFtZVN0YXJ0Q2hhcmFjdGVycygpIHsKCQlyZXR1cm4gRVhURU5ERURfUkVHVUxBUl9OQU1FX1NUQVJUX0NIQVJBQ1RFUlM7Cgl9Cglwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gRVhURU5ERURfUkVHVUxBUl9OQU1FX1NUQVJUX0NIQVJBQ1RFUlMgPSBuZXcgY2hhcltdIHsgJ18nLCAnQCcgfTsKCglAT3ZlcnJpZGUKCWNoYXJbXSBnZXRFeHRlbmRlZFJlZ3VsYXJOYW1lUGFydENoYXJhY3RlcnMoKSB7CgkJcmV0dXJuIEVYVEVOREVEX1JFR1VMQVJfTkFNRV9QQVJUX0NIQVJBQ1RFUlM7Cgl9Cglwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gRVhURU5ERURfUkVHVUxBUl9OQU1FX1BBUlRfQ0hBUkFDVEVSUyA9IG5ldyBjaGFyW10geyAnJCcsICelJywgJ6MnLCAnIycgfTsKCgkvL1RPRE8gcXVlcnkgZGF0YWJhc2UgZm9yIGRlbGltaXRlciBzZXR0aW5nCglAT3ZlcnJpZGUKCVN0cmluZyBkZWxpbWl0TmFtZShTdHJpbmcgbmFtZSkgewoJCXJldHVybiAnWycgKyBuYW1lICsgJ10nOwoJfQoKCS8qKgoJICogQnkgZGVmYXVsdCwgU3liYXNlIGRlbGltaXRzIGlkZW50aWZpZXJzIHdpdGggYnJhY2tldHMKCSAqICg8Y29kZT5bXTwvY29kZT4pOyBidXQgaXQKCSAqIGNhbiBhbHNvIGJlIGNvbmZpZ3VyZWQgdG8gdXNlIGRvdWJsZS1xdW90ZXMuCgkgKi8KCS8vVE9ETyBxdWVyeSBkYXRhYmFzZSBmb3IgZGVsaW1pdGVyIHNldHRpbmcKCUBPdmVycmlkZQoJYm9vbGVhbiBpZGVudGlmaWVySXNEZWxpbWl0ZWQoU3RyaW5nIGlkZW50aWZpZXIpIHsKCQlyZXR1cm4gU3RyaW5nVG9vbHMuc3RyaW5nSXNCcmFja2V0ZWQoaWRlbnRpZmllcikKCQkJCQl8fCBzdXBlci5pZGVudGlmaWVySXNEZWxpbWl0ZWQoaWRlbnRpZmllcik7Cgl9CgoKCS8vICoqKioqKioqKiogZmFjdG9yeSAqKioqKioqKioqCgoJc3RhdGljIGNsYXNzIEZhY3RvcnkgaW1wbGVtZW50cyBEVFBEcml2ZXJBZGFwdGVyRmFjdG9yeSB7CgkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gVkVORE9SUyA9IHsKCQkJCSJTeWJhc2VfQVNBIiwgLy8kTk9OLU5MUy0xJAoJCQkJIlN5YmFzZV9BU0UiIC8vJE5PTi1OTFMtMSQKCQkJfTsKCQlwdWJsaWMgU3RyaW5nW10gZ2V0U3VwcG9ydGVkVmVuZG9ycygpIHsKCQkJcmV0dXJuIFZFTkRPUlM7CgkJfQoJCXB1YmxpYyBEVFBEcml2ZXJBZGFwdGVyIGJ1aWxkQWRhcHRlcihEYXRhYmFzZSBkYXRhYmFzZSkgewoJCQlyZXR1cm4gbmV3IFN5YmFzZShkYXRhYmFzZSk7CgkJfQoJfQp9Cg==