LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsOwoKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKCmltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CmltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLklNb25pdG9yOwppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwovKioKICogTW9uaXRvciB0YWJsZSBsYWJlbCBwcm92aWRlci4KICovCnB1YmxpYyBjbGFzcyBNb25pdG9yVGFibGVMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7CgkvKioKCSAqIE1vbml0b3JUYWJsZUxhYmVsUHJvdmlkZXIgY29uc3RydWN0b3IgY29tbWVudC4KCSAqLwoJcHVibGljIE1vbml0b3JUYWJsZUxhYmVsUHJvdmlkZXIoKSB7CgkJc3VwZXIoKTsKCX0KCgkvKioKCSAqIEFkZHMgYSBsaXN0ZW5lciB0byB0aGlzIGxhYmVsIHByb3ZpZGVyLiAKCSAqIEhhcyBubyBlZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC4KCSAqIDxwPgoJICogTGFiZWwgcHJvdmlkZXIgbGlzdGVuZXJzIGFyZSBpbmZvcm1lZCBhYm91dCBzdGF0ZSBjaGFuZ2VzIAoJICogdGhhdCBhZmZlY3QgdGhlIHJlbmRlcmluZyBvZiB0aGUgdmlld2VyIHRoYXQgdXNlcyB0aGlzIGxhYmVsIHByb3ZpZGVyLgoJICogPC9wPgoJICoKCSAqIEBwYXJhbSBsaXN0ZW5lciBhIGxhYmVsIHByb3ZpZGVyIGxpc3RlbmVyCgkgKi8KCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKCQkvLyBkbyBub3RoaW5nCgl9CgoJLyoqCgkgKiBEaXNwb3NlcyBvZiB0aGlzIGxhYmVsIHByb3ZpZGVyLiAgV2hlbiBhIGxhYmVsIHByb3ZpZGVyIGlzCgkgKiBhdHRhY2hlZCB0byBhIHZpZXdlciwgdGhlIHZpZXdlciB3aWxsIGF1dG9tYXRpY2FsbHkgY2FsbAoJICogdGhpcyBtZXRob2Qgd2hlbiB0aGUgdmlld2VyIGlzIGJlaW5nIGNsb3NlZC4gIFdoZW4gbGFiZWwgcHJvdmlkZXJzCgkgKiBhcmUgdXNlZCBvdXRzaWRlIG9mIHRoZSBjb250ZXh0IG9mIGEgdmlld2VyLCBpdCBpcyB0aGUgY2xpZW50J3MKCSAqIHJlc3BvbnNpYmlsaXR5IHRvIGVuc3VyZSB0aGF0IHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZQoJICogcHJvdmlkZXIgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KCSAqLwoJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKCQkvLyBkbyBub3RoaW5nCgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBsYWJlbCBpbWFnZSBmb3IgdGhlIGdpdmVuIGNvbHVtbiBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KCSAqCgkgKiBAcGFyYW0gZWxlbWVudCB0aGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZW50aXJlIHJvdywgb3IgCgkgKiAgICA8Y29kZT5udWxsPC9jb2RlPiBpbmRpY2F0aW5nIHRoYXQgbm8gaW5wdXQgb2JqZWN0IGlzIHNldAoJICogICAgaW4gdGhlIHZpZXdlcgoJICogQHBhcmFtIGNvbHVtbkluZGV4IHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSBjb2x1bW4gaW4gd2hpY2gKCSAqICAgdGhlIGxhYmVsIGFwcGVhcnMKCSAqLwoJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKCQlpZiAoY29sdW1uSW5kZXggPT0gMCkgewoJCQlJTW9uaXRvciBtb25pdG9yID0gKElNb25pdG9yKSBlbGVtZW50OwoJCQlpZiAobW9uaXRvci5pc1J1bm5pbmcoKSkKCQkJCXJldHVybiBNb25pdG9yVUlQbHVnaW4uZ2V0SW1hZ2UoTW9uaXRvclVJUGx1Z2luLklNR19NT05JVE9SX09OKTsKCQkJcmV0dXJuIE1vbml0b3JVSVBsdWdpbi5nZXRJbWFnZShNb25pdG9yVUlQbHVnaW4uSU1HX01PTklUT1JfT0ZGKTsKCQl9CgkJcmV0dXJuIG51bGw7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgZ2l2ZW4gY29sdW1uIG9mIHRoZSBnaXZlbiBlbGVtZW50LgoJICoKCSAqIEBwYXJhbSBlbGVtZW50IHRoZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBlbnRpcmUgcm93LCBvcgoJICogICA8Y29kZT5udWxsPC9jb2RlPiBpbmRpY2F0aW5nIHRoYXQgbm8gaW5wdXQgb2JqZWN0IGlzIHNldAoJICogICBpbiB0aGUgdmlld2VyCgkgKiBAcGFyYW0gY29sdW1uSW5kZXggdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIGNvbHVtbiBpbiB3aGljaCB0aGUgbGFiZWwgYXBwZWFycwoJICovCglwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewoJCUlNb25pdG9yIG1vbml0b3IgPSAoSU1vbml0b3IpIGVsZW1lbnQ7CgkJaWYgKGNvbHVtbkluZGV4ID09IDApIHsKCQkJaWYgKG1vbml0b3IuaXNSdW5uaW5nKCkpCgkJCQlyZXR1cm4gTW9uaXRvclVJUGx1Z2luLmdldFJlc291cmNlKCIlc3RhcnRlZCIpOwoJCQlyZXR1cm4gTW9uaXRvclVJUGx1Z2luLmdldFJlc291cmNlKCIlc3RvcHBlZCIpOwoJCX0gZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMSkKCQkJcmV0dXJuIG1vbml0b3IuZ2V0UmVtb3RlSG9zdCgpICsgIjoiICsgbW9uaXRvci5nZXRSZW1vdGVQb3J0KCk7CgkJZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMikKCQkJcmV0dXJuIG1vbml0b3IuZ2V0UHJvdG9jb2xBZGFwdGVyKCkuZ2V0TmFtZSgpOwoJCWVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDMpCgkJCXJldHVybiBtb25pdG9yLmdldExvY2FsUG9ydCgpICsgIiI7CgkJZWxzZQoJCQlyZXR1cm4gIlgiOwoJfQoJCglwcm90ZWN0ZWQgU3RyaW5nIG5vdE51bGwoU3RyaW5nIHMpIHsKCQlpZiAocyA9PSBudWxsKQoJCQlyZXR1cm4gIiI7CgkJCgkJcmV0dXJuIHM7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGxhYmVsIHdvdWxkIGJlIGFmZmVjdGVkIAoJICogYnkgYSBjaGFuZ2UgdG8gdGhlIGdpdmVuIHByb3BlcnR5IG9mIHRoZSBnaXZlbiBlbGVtZW50LgoJICogVGhpcyBjYW4gYmUgdXNlZCB0byBvcHRpbWl6ZSBhIG5vbi1zdHJ1Y3R1cmFsIHZpZXdlciB1cGRhdGUuCgkgKiBJZiB0aGUgcHJvcGVydHkgbWVudGlvbmVkIGluIHRoZSB1cGRhdGUgZG9lcyBub3QgYWZmZWN0IHRoZSBsYWJlbCwKCSAqIHRoZW4gdGhlIHZpZXdlciBuZWVkIG5vdCB1cGRhdGUgdGhlIGxhYmVsLgoJICoKCSAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50CgkgKiBAcGFyYW0gcHJvcGVydHkgdGhlIHByb3BlcnR5CgkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBsYWJlbCB3b3VsZCBiZSBhZmZlY3RlZCwKCSAqICAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgd291bGQgYmUgdW5hZmZlY3RlZAoJICovCglwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciB0byB0aGlzIGxhYmVsIHByb3ZpZGVyLgoJICogSGFzIG5vIGFmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQuCgkgKgoJICogQHBhcmFtIGxpc3RlbmVyIGEgbGFiZWwgcHJvdmlkZXIgbGlzdGVuZXIKCSAqLwoJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewoJCS8vIGRvIG5vdGhpbmcKCX0KfQ==