cGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQ7Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIENvcHlyaWdodCAoYykgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuSVRvbWNhdENvbmZpZ3VyYXRpb247CmltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLklUb21jYXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7CmltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLldlYk1vZHVsZTsKaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0UGx1Z2luOwoKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyQ29uZmlndXJhdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklUYXNrTW9kZWw7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5UYXNrOwovKioKICogVGFzayB0byBtb2RpZnkgdGhlIHBhdGggb2YgYSBXZWIgbW9kdWxlLgogKi8KcHVibGljIGNsYXNzIFNldFdlYk1vZHVsZVBhdGhUYXNrIGV4dGVuZHMgVGFzayB7Cglwcm90ZWN0ZWQgaW50IGluZGV4OwoJcHJvdGVjdGVkIFdlYk1vZHVsZSBvbGRNb2R1bGU7Cglwcm90ZWN0ZWQgU3RyaW5nIHBhdGg7CgoJLyoqCgkgKiBTZXRXZWJNb2R1bGVQYXRoVGFzayBjb25zdHJ1Y3RvciBjb21tZW50LgoJICovCglwdWJsaWMgU2V0V2ViTW9kdWxlUGF0aFRhc2soaW50IGluZGV4LCBTdHJpbmcgY29udGV4dFJvb3QpIHsKCQlzdXBlcigpOwoJCXRoaXMuaW5kZXggPSBpbmRleDsKCQl0aGlzLnBhdGggPSBjb250ZXh0Um9vdDsKCX0KCQoJLyoqCgkgKiBFeGVjdXRlIHRoZSBjb21tYW5kLgoJICogQHJldHVybiBib29sZWFuCgkgKi8KCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CgkJSVNlcnZlckNvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSB3YyA9IChJU2VydmVyQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5KSBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoSVRhc2tNb2RlbC5UQVNLX1NFUlZFUl9DT05GSUdVUkFUSU9OKTsKCQlJVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24gPSAoSVRvbWNhdENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSkgd2MuZ2V0V29ya2luZ0NvcHlEZWxlZ2F0ZSgpOwoJCW9sZE1vZHVsZSA9IChXZWJNb2R1bGUpIGNvbmZpZ3VyYXRpb24uZ2V0V2ViTW9kdWxlcygpLmdldChpbmRleCk7CgkJY29uZmlndXJhdGlvbi5yZW1vdmVXZWJNb2R1bGUoaW5kZXgpOwoJCQoJCVdlYk1vZHVsZSBtb2R1bGUgPSBuZXcgV2ViTW9kdWxlKHBhdGgsIG9sZE1vZHVsZS5nZXREb2N1bWVudEJhc2UoKSwgb2xkTW9kdWxlLmdldE1lbWVudG8oKSwgb2xkTW9kdWxlLmlzUmVsb2FkYWJsZSgpKTsKCQljb25maWd1cmF0aW9uLmFkZFdlYk1vZHVsZShpbmRleCwgbW9kdWxlKTsKCX0KCgkvKioKCSAqIFJldHVybnMgdGhpcyBjb21tYW5kJ3MgZGVzY3JpcHRpb24uCgkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKCSAqLwoJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKCQlpZiAob2xkTW9kdWxlID09IG51bGwpIHsKCQkJSVNlcnZlckNvbmZpZ3VyYXRpb24gY29uZmlnID0gKElTZXJ2ZXJDb25maWd1cmF0aW9uKSBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoSVRhc2tNb2RlbC5UQVNLX1NFUlZFUl9DT05GSUdVUkFUSU9OKTsKCQkJSVRvbWNhdENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IChJVG9tY2F0Q29uZmlndXJhdGlvbikgY29uZmlnLmdldERlbGVnYXRlKCk7CgkJCW9sZE1vZHVsZSA9IChXZWJNb2R1bGUpIGNvbmZpZ3VyYXRpb24uZ2V0V2ViTW9kdWxlcygpLmdldChpbmRleCk7CgkJfQoJCQoJCXJldHVybiBUb21jYXRQbHVnaW4uZ2V0UmVzb3VyY2UoIiVjb25maWd1cmF0aW9uRWRpdG9yQWN0aW9uRWRpdFdlYk1vZHVsZURlc2NyaXB0aW9uIiwgb2xkTW9kdWxlLmdldFBhdGgoKSwgcGF0aCk7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoaXMgY29tbWFuZCdzIGxhYmVsLgoJICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCgkgKi8KCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKCQlyZXR1cm4gVG9tY2F0UGx1Z2luLmdldFJlc291cmNlKCIlY29uZmlndXJhdGlvbkVkaXRvckFjdGlvbkVkaXRXZWJNb2R1bGVQYXRoIik7Cgl9CgoJLyoqCgkgKiBVbmRvIHRoZSBjb21tYW5kLgoJICovCglwdWJsaWMgdm9pZCB1bmRvKCkgewoJCXRyeSB7CgkJCUlTZXJ2ZXJDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgd2MgPSAoSVNlcnZlckNvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSkgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KElUYXNrTW9kZWwuVEFTS19TRVJWRVJfQ09ORklHVVJBVElPTik7CgkJCUlUb21jYXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbiA9IChJVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5KSB3Yy5nZXRXb3JraW5nQ29weURlbGVnYXRlKCk7CgkJCWNvbmZpZ3VyYXRpb24ucmVtb3ZlV2ViTW9kdWxlKGluZGV4KTsKCQkJY29uZmlndXJhdGlvbi5hZGRXZWJNb2R1bGUoaW5kZXgsIG9sZE1vZHVsZSk7CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgfQoJfQp9