LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAogKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAogKiAKICogQ29udHJpYnV0b3JzOgogKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLnNlYXJjaC5jb3JlLnRlc3RzOwoKaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKCmltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVF1ZXJ5TGlzdGVuZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5OwppbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLk5ld1NlYXJjaFVJOwoKaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaDIuaW50ZXJuYWwudWkuSW50ZXJuYWxTZWFyY2hVSTsKCi8qKgogKiBAYXV0aG9yIFRob21hcyBN5GRlcgogKgogKi8KcHVibGljIGNsYXNzIFF1ZXJ5TWFuYWdlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CglwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlUXVlcnkoKSB7CgkJSVNlYXJjaFF1ZXJ5IHF1ZXJ5PSBuZXcgTnVsbFF1ZXJ5KCk7CgkJSW50ZXJuYWxTZWFyY2hVSS5nZXRJbnN0YW5jZSgpLmFkZFF1ZXJ5KHF1ZXJ5KTsKCQlJbnRlcm5hbFNlYXJjaFVJLmdldEluc3RhbmNlKCkucmVtb3ZlUXVlcnkocXVlcnkpOwoJCUlTZWFyY2hRdWVyeVtdIGFsbD0gSW50ZXJuYWxTZWFyY2hVSS5nZXRJbnN0YW5jZSgpLmdldFF1ZXJpZXMoKTsKCQlmb3IgKGludCBpPSAwOyBpIDwgYWxsLmxlbmd0aDsgaSsrKSB7CgkJCWlmIChxdWVyeSA9PSBhbGxbaV0pCgkJCQlhc3NlcnRUcnVlKGZhbHNlKTsKCQl9Cgl9CgoJcHVibGljIHZvaWQgdGVzdEFkZFF1ZXJ5KCkgewoJCUlTZWFyY2hRdWVyeSBxdWVyeT0gbmV3IE51bGxRdWVyeSgpOwoJCUludGVybmFsU2VhcmNoVUkuZ2V0SW5zdGFuY2UoKS5hZGRRdWVyeShxdWVyeSk7CgkJSVNlYXJjaFF1ZXJ5W10gYWxsPSBOZXdTZWFyY2hVSS5nZXRRdWVyaWVzKCk7CgkJZm9yIChpbnQgaT0gMDsgaSA8IGFsbC5sZW5ndGg7IGkrKykgewoJCQlpZiAocXVlcnkgPT0gYWxsW2ldKQoJCQkJcmV0dXJuOwoJCX0KCQlhc3NlcnRUcnVlKGZhbHNlKTsKCX0KCglwdWJsaWMgdm9pZCB0ZXN0UXVlcnlMaXN0ZW5lcigpIHsKCQlmaW5hbCBib29sZWFuIFtdIHdhc0FkZGVkPSB7IGZhbHNlIH07CgkJZmluYWwgYm9vbGVhbiBbXSB3YXNSZW1vdmVkPSB7IGZhbHNlIH07CgkJSVF1ZXJ5TGlzdGVuZXIgbD0gbmV3IElRdWVyeUxpc3RlbmVyKCkgewoJCQkvKiAobm9uLUphdmFkb2MpCgkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklRdWVyeUxpc3RlbmVyI3F1ZXJ5QWRkZWQob3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hRdWVyeSkKCQkJICovCgkJCXB1YmxpYyB2b2lkIHF1ZXJ5QWRkZWQoSVNlYXJjaFF1ZXJ5IHF1ZXJ5KSB7CgkJCQl3YXNBZGRlZFswXT0gdHJ1ZTsKCQkJfQoJCQkvKiAobm9uLUphdmFkb2MpCgkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklRdWVyeUxpc3RlbmVyI3F1ZXJ5UmVtb3ZlZChvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5KQoJCQkgKi8KCQkJcHVibGljIHZvaWQgcXVlcnlSZW1vdmVkKElTZWFyY2hRdWVyeSBxdWVyeSkgewoJCQkJd2FzUmVtb3ZlZFswXT0gdHJ1ZTsKCQkJfQoJCQlwdWJsaWMgdm9pZCBxdWVyeVN0YXJ0aW5nKElTZWFyY2hRdWVyeSBxdWVyeSkgewoJCQkJLy8gbm90IGludGVyZXN0ZWQKCQkJfQoJCQlwdWJsaWMgdm9pZCBxdWVyeUZpbmlzaGVkKElTZWFyY2hRdWVyeSBxdWVyeSkgewoJCQkJLy8gbm90IGludGVyZXN0ZWQKCQkJfQoJCX0gOwoJCU5ld1NlYXJjaFVJLmFkZFF1ZXJ5TGlzdGVuZXIobCk7CgkJSVNlYXJjaFF1ZXJ5IHF1ZXJ5PSBuZXcgTnVsbFF1ZXJ5KCk7CgkJSW50ZXJuYWxTZWFyY2hVSS5nZXRJbnN0YW5jZSgpLmFkZFF1ZXJ5KHF1ZXJ5KTsKCQlhc3NlcnRUcnVlKHdhc0FkZGVkWzBdKTsKCQlJbnRlcm5hbFNlYXJjaFVJLmdldEluc3RhbmNlKCkucmVtb3ZlUXVlcnkocXVlcnkpOwoJCWFzc2VydFRydWUod2FzUmVtb3ZlZFswXSk7CgkJSW50ZXJuYWxTZWFyY2hVSS5nZXRJbnN0YW5jZSgpLnJlbW92ZVF1ZXJ5TGlzdGVuZXIobCk7CgkJd2FzQWRkZWRbMF09IGZhbHNlOwoJCXdhc1JlbW92ZWRbMF09IGZhbHNlOwoJCUludGVybmFsU2VhcmNoVUkuZ2V0SW5zdGFuY2UoKS5hZGRRdWVyeShxdWVyeSk7CgkJYXNzZXJ0RmFsc2Uod2FzQWRkZWRbMF0pOwoJCUludGVybmFsU2VhcmNoVUkuZ2V0SW5zdGFuY2UoKS5yZW1vdmVRdWVyeShxdWVyeSk7CgkJYXNzZXJ0RmFsc2Uod2FzUmVtb3ZlZFswXSk7Cgl9CgkKCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVDYW5jZWxzKCkgewoJCUxvbmdRdWVyeSBxdWVyeT0gbmV3IExvbmdRdWVyeSgpOwoJCU5ld1NlYXJjaFVJLnJ1blF1ZXJ5KHF1ZXJ5KTsKCQl0cnkgewoJCQkvLyBnaXZlIHRoZSBvdGhlciB0aHJlYWQgc29tZSB0aW1lIHRvIGZpbmlzaC4KCQkJVGhyZWFkLnNsZWVwKDEwMDApOwoJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKCQkJLy8gc2hvdWxkIG5vdCBoYXBwZW4KCQl9CgkJYXNzZXJ0VHJ1ZShxdWVyeS5pc1J1bm5pbmcoKSk7CgkJYXNzZXJ0VHJ1ZShJbnRlcm5hbFNlYXJjaFVJLmdldEluc3RhbmNlKCkuaXNRdWVyeVJ1bm5pbmcocXVlcnkpKTsKCQlJbnRlcm5hbFNlYXJjaFVJLmdldEluc3RhbmNlKCkucmVtb3ZlUXVlcnkocXVlcnkpOwoJCXRyeSB7CgkJCS8vIGdpdmUgdGhlIG90aGVyIHRocmVhZCBzb21lIHRpbWUgdG8gZmluaXNoLgoJCQlUaHJlYWQuc2xlZXAoMTAwMCk7CgkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewoJCQkvLyBzaG91bGQgbm90IGhhcHBlbgoJCX0KCQlhc3NlcnRGYWxzZShxdWVyeS5pc1J1bm5pbmcoKSk7CgkJYXNzZXJ0RmFsc2UoSW50ZXJuYWxTZWFyY2hVSS5nZXRJbnN0YW5jZSgpLmlzUXVlcnlSdW5uaW5nKHF1ZXJ5KSk7Cgl9CgoJcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbENhbmNlbHMoKSB7CgkJTG9uZ1F1ZXJ5IHF1ZXJ5PSBuZXcgTG9uZ1F1ZXJ5KCk7CgkJTmV3U2VhcmNoVUkucnVuUXVlcnkocXVlcnkpOwoJCUludGVybmFsU2VhcmNoVUkuZ2V0SW5zdGFuY2UoKS5yZW1vdmVRdWVyeShxdWVyeSk7CgkJdHJ5IHsKCQkJLy8gZ2l2ZSB0aGUgb3RoZXIgdGhyZWFkIHNvbWUgdGltZSB0byBmaW5pc2guCgkJCVRocmVhZC5zbGVlcCgxMDAwKTsKCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CgkJCS8vIHNob3VsZCBub3QgaGFwcGVuCgkJfQoJCWFzc2VydEZhbHNlKHF1ZXJ5LmlzUnVubmluZygpKTsKCX0KfQo=