LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKgogKiBDb250cmlidXRvcnM6CiAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLmh0dHA7CgppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5JTW9uaXRvcjsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuUmVxdWVzdDsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuTW9uaXRvcjsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuVHJhY2U7CgppbXBvcnQgamF2YS51dGlsLkxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwovKioKICogTWFuYWdlcyBhIG1vbml0b3Igc2VydmVyIGNvbm5lY3Rpb24gYmV0d2VlbiB0d28gaG9zdHMuIFRoaXMKICogY29ubmVjdGlvbiBtYXkgc3Bhd24gb25lIG9yIG1vcmUgVENQL0lQIHJlcXVlc3RzIHRvIGJlIGRpc3BsYXllZAogKiBpbiB0aGUgbW9uaXRvciBzZXJ2ZXIgdmlldy4KICovCnB1YmxpYyBjbGFzcyBIVFRQQ29ubmVjdGlvbiB7Cglwcm90ZWN0ZWQgSU1vbml0b3IgbW9uaXRvcjsKCglwcm90ZWN0ZWQgaW50IHJlcSA9IC0xOwoJcHJvdGVjdGVkIGludCByZXNwID0gLTE7CgoJcHJvdGVjdGVkIExpc3QgcmVxdWVzdHMgPSBuZXcgQXJyYXlMaXN0KCk7CgoJLyoqCgkgKiBNb25pdG9ySFRUUENvbm5lY3Rpb24gY29uc3RydWN0b3IgY29tbWVudC4KCSAqLwoJcHVibGljIEhUVFBDb25uZWN0aW9uKElNb25pdG9yIG1vbml0b3IpIHsKCQlzdXBlcigpOwoJCXRoaXMubW9uaXRvciA9IG1vbml0b3I7CgkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIlRDUC9JUCBtb25pdG9yIGNvbm5lY3Rpb24gb3BlbmVkICIgKyBtb25pdG9yKTsKCX0KCgkvKioKCSAqIEFkZCBhIHJlcXVlc3QuCgkgKiBAcGFyYW0gcmVxIGJ5dGVbXQoJICogQHBhcmFtIGlzTmV3IGJvb2xlYW4KCSAqLwoJcHVibGljIHZvaWQgYWRkUmVxdWVzdChieXRlW10gYiwgYm9vbGVhbiBpc05ldykgewoJCWlmIChpc05ldykKCQkJcmVxICsrOwoJCUhUVFBSZXF1ZXN0IHJlcXVlc3QgPSAoSFRUUFJlcXVlc3QpIGdldFJlcXVlc3RSZXNwb25zZShyZXEpOwoJCXJlcXVlc3QuYWRkVG9SZXF1ZXN0KGIpOwoJfQoKCS8qKgoJICogQWRkIGEgcmVzcG9uc2UuCgkgKiBAcGFyYW0gcmVxIGJ5dGVbXQoJICogQHBhcmFtIGlzTmV3IGJvb2xlYW4KCSAqLwoJcHVibGljIHZvaWQgYWRkUmVzcG9uc2UoYnl0ZVtdIGIsIGJvb2xlYW4gaXNOZXcpIHsKCQlpZiAoaXNOZXcpCgkJCXJlc3AgKys7CgkJSFRUUFJlcXVlc3QgcmVxdWVzdCA9IChIVFRQUmVxdWVzdCkgZ2V0UmVxdWVzdFJlc3BvbnNlKHJlc3ApOwoJCXJlcXVlc3QuYWRkVG9SZXNwb25zZShiKTsKCX0KCgkvKioKCSAqIAoJICovCglwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKCQlSZXF1ZXN0IHJlcXVlc3QgPSBnZXRSZXF1ZXN0UmVzcG9uc2UocmVxKTsKCQlyZXF1ZXN0LnNldFByb3BlcnR5KGtleSwgdmFsdWUpOwoJfQoKCS8qKgoJICogCgkgKi8KCXB1YmxpYyBSZXF1ZXN0IGdldFJlcXVlc3RSZXNwb25zZShib29sZWFuIGlzUmVxdWVzdCkgewoJCWlmIChpc1JlcXVlc3QpCgkJCXJldHVybiBnZXRSZXF1ZXN0UmVzcG9uc2UocmVxKTsKCQkKCQlyZXR1cm4gZ2V0UmVxdWVzdFJlc3BvbnNlKHJlc3ApOwoJfQoKCS8qKgoJICogCgkgKi8KCXByb3RlY3RlZCBSZXF1ZXN0IGdldFJlcXVlc3RSZXNwb25zZShpbnQgaSkgewoJCXN5bmNocm9uaXplZCAodGhpcykgewoJCQl3aGlsZSAoaSA+PSByZXF1ZXN0cy5zaXplKCkpIHsKCQkJCVJlcXVlc3QgcmVxdWVzdCA9IG5ldyBIVFRQUmVxdWVzdCgoTW9uaXRvcikgbW9uaXRvciwgbW9uaXRvci5nZXRMb2NhbFBvcnQoKSwgbW9uaXRvci5nZXRSZW1vdGVIb3N0KCksIG1vbml0b3IuZ2V0UmVtb3RlUG9ydCgpKTsKCQkJCXJlcXVlc3RzLmFkZChyZXF1ZXN0KTsKCQkJCXJldHVybiByZXF1ZXN0OwoJCQl9CgkJCXJldHVybiAoUmVxdWVzdCkgcmVxdWVzdHMuZ2V0KGkpOwoJCX0KCX0KCgkvKioKCSAqIFNldCB0aGUgdGl0bGUKCSAqIEBwYXJhbSByZXEgYnl0ZVtdCgkgKiBAcGFyYW0gaXNOZXcgYm9vbGVhbgoJICovCglwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgdGl0bGUsIGJvb2xlYW4gaXNOZXcpIHsKCQlpZiAoaXNOZXcpCgkJCXJlcSArKzsKCQlIVFRQUmVxdWVzdCByZXF1ZXN0ID0gKEhUVFBSZXF1ZXN0KSBnZXRSZXF1ZXN0UmVzcG9uc2UocmVxKTsKCQlyZXF1ZXN0LnNldE5hbWUodGl0bGUpOwoJfQp9