LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWw7CgppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKaW1wb3J0IGphdmEudXRpbC5EYXRlOwppbXBvcnQgamF2YS51dGlsLkxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07CmltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLklQcm90b2NvbEFkYXB0ZXI7CmltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLklSZXF1ZXN0OwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5JUmVzZW5kUmVxdWVzdDsKLyoqCiAqIEEgc2luZ2xlIFRDUC9JUCByZXF1ZXN0L3Jlc3BvbnNlIHBhaXIuCiAqLwpwdWJsaWMgY2xhc3MgUmVxdWVzdCBpbXBsZW1lbnRzIElSZXF1ZXN0IHsKCXByb3RlY3RlZCBEYXRlIGRhdGU7Cglwcm90ZWN0ZWQgbG9uZyByZXNwb25zZVRpbWUgPSAtMTsKCXByb3RlY3RlZCBpbnQgbG9jYWxQb3J0OwoJcHJvdGVjdGVkIFN0cmluZyByZW1vdGVIb3N0OwoJcHJvdGVjdGVkIGludCByZW1vdGVQb3J0OwoJcHJvdGVjdGVkIGJ5dGVbXSByZXF1ZXN0OwoJcHJvdGVjdGVkIGJ5dGVbXSByZXNwb25zZTsKCQoJcHJvdGVjdGVkIFN0cmluZyBsYWJlbDsKCXByb3RlY3RlZCBJUHJvdG9jb2xBZGFwdGVyIHR5cGU7CgoJcHJvdGVjdGVkIFByb3BlcnRpZXMgcHJvcGVydGllczsKCQoJcHJvdGVjdGVkIExpc3QgcmVzZW5kUmVxdWVzdHMgPSBuZXcgQXJyYXlMaXN0KCk7CgoKCS8qKgoJICogUmVxdWVzdFJlc3BvbnNlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCgkgKi8KCXB1YmxpYyBSZXF1ZXN0KElQcm90b2NvbEFkYXB0ZXIgdHlwZSwgaW50IGxvY2FsUG9ydCwgU3RyaW5nIHJlbW90ZUhvc3QsIGludCByZW1vdGVQb3J0KSB7CgkJc3VwZXIoKTsKCQl0aGlzLnR5cGUgPSB0eXBlOwoJCXRoaXMubG9jYWxQb3J0ID0gbG9jYWxQb3J0OwoJCXRoaXMucmVtb3RlSG9zdCA9IHJlbW90ZUhvc3Q7CgkJdGhpcy5yZW1vdGVQb3J0ID0gcmVtb3RlUG9ydDsKCQlkYXRlID0gbmV3IERhdGUoKTsKCQlwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKCQlNb25pdG9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFJlcXVlc3QodGhpcyk7Cgl9CgkKCXB1YmxpYyBJUHJvdG9jb2xBZGFwdGVyIGdldFByb3RvY29sQWRhcHRlcigpIHsKCQlyZXR1cm4gdHlwZTsKCX0KCgkvKioKCSAqIEFkZCB0byB0aGUgcmVxdWVzdC4KCSAqCgkgKiBAcGFyYW0gYWRkUmVxdWVzdCBieXRlW10KCSAqLwoJcHVibGljIHZvaWQgYWRkVG9SZXF1ZXN0KGJ5dGVbXSBhZGRSZXF1ZXN0KSB7CgkJaWYgKGFkZFJlcXVlc3QgPT0gbnVsbCB8fCBhZGRSZXF1ZXN0Lmxlbmd0aCA9PSAwKQoJCQlyZXR1cm47CgkKCQlpZiAocmVxdWVzdCA9PSBudWxsIHx8IHJlcXVlc3QubGVuZ3RoID09IDApIHsKCQkJc2V0UmVxdWVzdChhZGRSZXF1ZXN0KTsKCQkJcmV0dXJuOwoJCX0KCQoJCWludCBzaXplID0gcmVxdWVzdC5sZW5ndGggKyBhZGRSZXF1ZXN0Lmxlbmd0aDsKCQlieXRlW10gYiA9IG5ldyBieXRlW3NpemVdOwoJCVN5c3RlbS5hcnJheWNvcHkocmVxdWVzdCwgMCwgYiwgMCwgcmVxdWVzdC5sZW5ndGgpOwoJCVN5c3RlbS5hcnJheWNvcHkoYWRkUmVxdWVzdCwgMCwgYiwgcmVxdWVzdC5sZW5ndGgsIGFkZFJlcXVlc3QubGVuZ3RoKTsKCQlyZXF1ZXN0ID0gYjsKCX0KCgkvKioKCSAqIEFkZCB0byB0aGUgcmVzcG9uc2UuCgkgKgoJICogQHBhcmFtIGFkZFJlc3BvbnNlIGJ5dGVbXQoJICovCglwdWJsaWMgdm9pZCBhZGRUb1Jlc3BvbnNlKGJ5dGVbXSBhZGRSZXNwb25zZSkgewoJCWlmIChhZGRSZXNwb25zZSA9PSBudWxsIHx8IGFkZFJlc3BvbnNlLmxlbmd0aCA9PSAwKQoJCQlyZXR1cm47CgkKCQlpZiAocmVzcG9uc2UgPT0gbnVsbCB8fCByZXNwb25zZS5sZW5ndGggPT0gMCkgewoJCQlzZXRSZXNwb25zZShhZGRSZXNwb25zZSk7CgkJCXJldHVybjsKCQl9CgkKCQlpbnQgc2l6ZSA9IHJlc3BvbnNlLmxlbmd0aCArIGFkZFJlc3BvbnNlLmxlbmd0aDsKCQlieXRlW10gYiA9IG5ldyBieXRlW3NpemVdOwoJCVN5c3RlbS5hcnJheWNvcHkocmVzcG9uc2UsIDAsIGIsIDAsIHJlc3BvbnNlLmxlbmd0aCk7CgkJU3lzdGVtLmFycmF5Y29weShhZGRSZXNwb25zZSwgMCwgYiwgcmVzcG9uc2UubGVuZ3RoLCBhZGRSZXNwb25zZS5sZW5ndGgpOwoJCXJlc3BvbnNlID0gYjsKCX0KCgkvKioKCSAqIFJldHVybiB0aGUgZGF0ZS90aW1lIG9mIHRoaXMgcmVxdWVzdC4KCSAqCgkgKiBAcmV0dXJuIGphdmEudXRpbC5EYXRlCgkgKi8KCXB1YmxpYyBEYXRlIGdldERhdGUoKSB7CgkJcmV0dXJuIGRhdGU7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBsb2NhbCBwb3J0LgoJICoKCSAqIEByZXR1cm4gaW50CgkgKi8KCXB1YmxpYyBpbnQgZ2V0TG9jYWxQb3J0KCkgewoJCXJldHVybiBsb2NhbFBvcnQ7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSByZW1vdGUgaG9zdC4KCSAqCgkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKCSAqLwoJcHVibGljIFN0cmluZyBnZXRSZW1vdGVIb3N0KCkgewoJCXJldHVybiByZW1vdGVIb3N0OwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgcmVtb3RlIHBvcnQuCgkgKgoJICogQHJldHVybiBpbnQKCSAqLwoJcHVibGljIGludCBnZXRSZW1vdGVQb3J0KCkgewoJCXJldHVybiByZW1vdGVQb3J0OwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgcmVxdWVzdCBhcyBhIGJ5dGUgYXJyYXkuCgkgKgoJICogQHJldHVybiBieXRlW10KCSAqLwoJcHVibGljIGJ5dGVbXSBnZXRSZXF1ZXN0KGludCB0eXBlMikgewoJCXJldHVybiByZXF1ZXN0OwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgcmVzcG9uc2UgYXMgYSBieXRlIGFycmF5LgoJICoKCSAqIEByZXR1cm4gYnl0ZVtdCgkgKi8KCXB1YmxpYyBieXRlW10gZ2V0UmVzcG9uc2UoaW50IHR5cGUyKSB7CgkJcmV0dXJuIHJlc3BvbnNlOwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgcmVzcG9uc2UgdGltZSBpbiBtaWxsaXNlY29uZHMuCgkgKgoJICogQHJldHVybiBsb25nCgkgKi8KCXB1YmxpYyBsb25nIGdldFJlc3BvbnNlVGltZSgpIHsKCQlyZXR1cm4gcmVzcG9uc2VUaW1lOwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgdGl0bGUsIGlmIG9uZSBleGlzdHMuCgkgKgoJICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCgkgKi8KCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7CgkJaWYgKGxhYmVsID09IG51bGwpCgkJCXJldHVybiBnZXRSZW1vdGVIb3N0KCkgKyAiOiIgKyBnZXRSZW1vdGVQb3J0KCk7CgkJCgkJcmV0dXJuIGxhYmVsOwoJfQoKCS8qKgoJICogU2V0IHRoZSByZXF1ZXN0LgoJICoKCSAqIEBwYXJhbSByZXF1ZXN0IGJ5dGVbXQoJICovCglwcm90ZWN0ZWQgdm9pZCBzZXRSZXF1ZXN0KGJ5dGVbXSByZXF1ZXN0KSB7CgkJaWYgKHJlcXVlc3QgPT0gbnVsbCB8fCByZXF1ZXN0Lmxlbmd0aCA9PSAwKQoJCQlyZXR1cm47CgkKCQl0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OwoJCgkJTW9uaXRvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZXF1ZXN0Q2hhbmdlZCh0aGlzKTsKCX0KCgkvKioKCSAqIFNldCB0aGUgcmVzcG9uc2UuCgkgKgoJICogQHBhcmFtIHJlc3BvbnNlIGJ5dGVbXQoJICovCglwcm90ZWN0ZWQgdm9pZCBzZXRSZXNwb25zZShieXRlW10gcmVzcG9uc2UpIHsKCQlpZiAocmVzcG9uc2UgPT0gbnVsbCB8fCByZXNwb25zZS5sZW5ndGggPT0gMCkKCQkJcmV0dXJuOwoJCgkJdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlOwoJCgkJcmVzcG9uc2VUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBkYXRlLmdldFRpbWUoKTsKCQoJCU1vbml0b3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVxdWVzdENoYW5nZWQodGhpcyk7Cgl9CgoJLyoqCgkgKiBTZXRzIHRoZSB0aXRsZS4KCSAqCgkgKiBAcGFyYW0gcyBqYXZhLmxhbmcuU3RyaW5nCgkgKi8KCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBzKSB7CgkJLy8gcHJvcGVydHkgY2FuIG9ubHkgYmUgc2V0IG9uY2UKCQlpZiAobGFiZWwgIT0gbnVsbCkKCQkJcmV0dXJuOwoJCgkJbGFiZWwgPSBzOwoJCU1vbml0b3JNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVxdWVzdENoYW5nZWQodGhpcyk7Cgl9CgkKCS8qKgoJICogCgkgKi8KCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5KFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgewoJCXRyeSB7CgkJCWlmIChwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KGtleSkpCgkJCQlwcm9wZXJ0aWVzLnJlbW92ZShrZXkpOwoJCQlwcm9wZXJ0aWVzLnB1dChrZXksIHZhbHVlKTsKCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgYWRkIHByb3BlcnR5IiwgZSk7CgkJfQoJfQoJCgkvKioKCSAqIAoJICovCglwdWJsaWMgU3RyaW5nIGdldFN0cmluZ1Byb3BlcnR5KFN0cmluZyBrZXkpIHsKCQl0cnkgewoJCQlyZXR1cm4gKFN0cmluZykgcHJvcGVydGllcy5nZXQoa2V5KTsKCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQlyZXR1cm4gIiI7CgkJfQoJfQoJCgkvKioKCSAqIAoJICovCglwdWJsaWMgSW50ZWdlciBnZXRJbnRlZ2VyUHJvcGVydHkoU3RyaW5nIGtleSkgewoJCXRyeSB7CgkJCXJldHVybiAoSW50ZWdlcikgcHJvcGVydGllcy5nZXQoa2V5KTsKCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgkKCS8qKgoJICogCgkgKi8KCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0UHJvcGVydHkoU3RyaW5nIGtleSkgewoJCXRyeSB7CgkJCXJldHVybiBwcm9wZXJ0aWVzLmdldChrZXkpOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCQoJcHVibGljIHZvaWQgZmlyZUNoYW5nZWRFdmVudCgpIHsKCQlNb25pdG9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlcXVlc3RDaGFuZ2VkKHRoaXMpOwoJfQoJCgkvKiAobm9uLUphdmFkb2MpCgkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuSVJlcXVlc3QjYWRkUmVzZW5kUmVxdWVzdChvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLklSZXF1ZXN0KQoJICovCglwdWJsaWMgdm9pZCBhZGRSZXNlbmRSZXF1ZXN0KElSZXF1ZXN0IHJlc2VuZFJlcSkgewoJCWlmIChyZXNlbmRSZXEgIT0gbnVsbCkKCQkJcmVzZW5kUmVxdWVzdHMuYWRkKHJlc2VuZFJlcSk7Cgl9CgkKCS8qIChub24tSmF2YWRvYykKCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5JUmVxdWVzdCNnZXRSZXNlbmRSZXF1ZXN0cygpCgkgKi8KCXB1YmxpYyBJUmVzZW5kUmVxdWVzdFtdIGdldFJlc2VuZFJlcXVlc3RzKCkgewoJCUlSZXNlbmRSZXF1ZXN0W10gcnIgPSBuZXcgSVJlc2VuZFJlcXVlc3RbcmVzZW5kUmVxdWVzdHMuc2l6ZSgpXTsKCQlyZXNlbmRSZXF1ZXN0cy50b0FycmF5KHJyKTsKCQlyZXR1cm4gcnI7Cgl9CgkKCS8qIChub24tSmF2YWRvYykKCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUjZ2V0QWRhcHRlcihqYXZhLmxhbmcuQ2xhc3MpCgkgKi8KCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7CgkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0aGlzLCBhZGFwdGVyKTsKICAgIH0KfQ==