LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIENvcHlyaWdodCAoYykgMjAxNiBGdW5kYWNp824gVGVjbmFsaWEgUmVzZWFyY2ggJiBJbm5vdmF0aW9uLg0KICoNCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjIuMA0KICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCiAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLTIuMC9FUEwtMi4wLmh0bWwNCiAqDQogKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMA0KICoNCiAqIENvbnRyaWJ1dG9yczoNCiAqICAgSHVhc2NhciBFc3Bpbm96YSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KICogICBBbGVqYW5kcmEgUnXteiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KICogICBJZG95YSBEZWwgUu1vIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKiAgIE1hcmkgQ2FybWVuIFBhbGFjaW9zIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKiAgIEFuZ2VsIEzzcGV6IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qKg0KICovDQpwYWNrYWdlIG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnOw0KDQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KDQovKioNCiAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQogKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Bc3NlcnRlZCBJbmZlcmVuY2U8L2I+PC9lbT4nLg0KICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQogKg0KICogPHA+DQogKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6DQogKiA8dWw+DQogKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuQXNzZXJ0ZWRJbmZlcmVuY2UjZ2V0TXVsdGlleHRlbnNpb24gPGVtPk11bHRpZXh0ZW5zaW9uPC9lbT59PC9saT4NCiAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vcGVuY2VydC5zYW0uYXJnLmFyZy5Bc3NlcnRlZEluZmVyZW5jZSNnZXRDYXJkaW5hbGl0eSA8ZW0+Q2FyZGluYWxpdHk8L2VtPn08L2xpPg0KICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLkFzc2VydGVkSW5mZXJlbmNlI2dldFNvdXJjZSA8ZW0+U291cmNlPC9lbT59PC9saT4NCiAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vcGVuY2VydC5zYW0uYXJnLmFyZy5Bc3NlcnRlZEluZmVyZW5jZSNnZXRUYXJnZXQgPGVtPlRhcmdldDwvZW0+fTwvbGk+DQogKiA8L3VsPg0KICogPC9wPg0KICoNCiAqIEBzZWUgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuQXJnUGFja2FnZSNnZXRBc3NlcnRlZEluZmVyZW5jZSgpDQogKiBAbW9kZWwgYW5ub3RhdGlvbj0iZ21mLmxpbmsgY29sb3I9JzAsMCwwJyBzb3VyY2U9J3NvdXJjZScgdGFyZ2V0PSd0YXJnZXQnIHRhcmdldC5jb25zdHJhaW50PSdzZWxmLm9jbElzVHlwZU9mKENsYWltKSBvciBzZWxmLm9jbElzVHlwZU9mKEFyZ3VtZW50YXRpb24pIG9yIHNlbGYub2NsSXNUeXBlT2YoQXJndW1lbnRSZWFzb25pbmcpIG9yIHNlbGYub2NsSXNUeXBlT2YoQWdyZWVtZW50KScgc291cmNlLmNvbnN0cmFpbnQ9J3NlbGYub2NsSXNUeXBlT2YoQ2hvaWNlKSBvciBzZWxmLm9jbElzVHlwZU9mKENsYWltKSBvciBzZWxmLm9jbElzVHlwZU9mKEFyZ3VtZW50RWxlbWVudENpdGF0aW9uKSBvciBzZWxmLm9jbElzVHlwZU9mKEFyZ3VtZW50YXRpb24pIG9yIHNlbGYub2NsSXNUeXBlT2YoQXJndW1lbnRSZWFzb25pbmcpJyBzdHlsZT0nc29saWQnIHdpZHRoPScxJyB0YXJnZXQuZGVjb3JhdGlvbj0nZmlsbGVkY2xvc2VkYXJyb3cnIHRvb2wuc21hbGwucGF0aD0nR1NOX3Rvb2xpbmdfaWNvbnMvc29sdmVkQnkuZ2lmJyB0b29sLmxhcmdlLnBhdGg9J0dTTl90b29saW5nX2ljb25zL3NvbHZlZEJ5LmdpZicgdG9vbC5zbWFsbC5idW5kbGU9J29yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcnIHRvb2wubGFyZ2UuYnVuZGxlPSdvcmcuZWNsaXBzZS5vcGVuY2VydC5zYW0uYXJnJyBsYWJlbD0nY2FyZGluYWxpdHknIg0KICogQGdlbmVyYXRlZA0KICovDQpwdWJsaWMgaW50ZXJmYWNlIEFzc2VydGVkSW5mZXJlbmNlIGV4dGVuZHMgQXNzZXJ0ZWRSZWxhdGlvbnNoaXAgew0KCS8qKg0KCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk11bHRpZXh0ZW5zaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQoJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuQXNzZXJ0ZWRCeU11bHRpcGxpY2l0eUV4dGVuc2lvbn0uDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8cD4NCgkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NdWx0aWV4dGVuc2lvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQoJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KCSAqIDwvcD4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NdWx0aWV4dGVuc2lvbjwvZW0+JyBhdHRyaWJ1dGUuDQoJICogQHNlZSBvcmcuZWNsaXBzZS5vcGVuY2VydC5zYW0uYXJnLmFyZy5Bc3NlcnRlZEJ5TXVsdGlwbGljaXR5RXh0ZW5zaW9uDQoJICogQHNlZSAjc2V0TXVsdGlleHRlbnNpb24oQXNzZXJ0ZWRCeU11bHRpcGxpY2l0eUV4dGVuc2lvbikNCgkgKiBAc2VlIG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLkFyZ1BhY2thZ2UjZ2V0QXNzZXJ0ZWRJbmZlcmVuY2VfTXVsdGlleHRlbnNpb24oKQ0KCSAqIEBtb2RlbA0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglBc3NlcnRlZEJ5TXVsdGlwbGljaXR5RXh0ZW5zaW9uIGdldE11bHRpZXh0ZW5zaW9uKCk7DQoNCgkvKioNCgkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vcGVuY2VydC5zYW0uYXJnLmFyZy5Bc3NlcnRlZEluZmVyZW5jZSNnZXRNdWx0aWV4dGVuc2lvbiA8ZW0+TXVsdGlleHRlbnNpb248L2VtPn0nIGF0dHJpYnV0ZS4NCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk11bHRpZXh0ZW5zaW9uPC9lbT4nIGF0dHJpYnV0ZS4NCgkgKiBAc2VlIG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLkFzc2VydGVkQnlNdWx0aXBsaWNpdHlFeHRlbnNpb24NCgkgKiBAc2VlICNnZXRNdWx0aWV4dGVuc2lvbigpDQoJICogQGdlbmVyYXRlZA0KCSAqLw0KCXZvaWQgc2V0TXVsdGlleHRlbnNpb24oQXNzZXJ0ZWRCeU11bHRpcGxpY2l0eUV4dGVuc2lvbiB2YWx1ZSk7DQoNCgkvKioNCgkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYXJkaW5hbGl0eTwvYj48L2VtPicgYXR0cmlidXRlLg0KCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4NCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDxwPg0KCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhcmRpbmFsaXR5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCgkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQoJICogPC9wPg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhcmRpbmFsaXR5PC9lbT4nIGF0dHJpYnV0ZS4NCgkgKiBAc2VlICNzZXRDYXJkaW5hbGl0eShTdHJpbmcpDQoJICogQHNlZSBvcmcuZWNsaXBzZS5vcGVuY2VydC5zYW0uYXJnLmFyZy5BcmdQYWNrYWdlI2dldEFzc2VydGVkSW5mZXJlbmNlX0NhcmRpbmFsaXR5KCkNCgkgKiBAbW9kZWwgZGVmYXVsdD0iIg0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglTdHJpbmcgZ2V0Q2FyZGluYWxpdHkoKTsNCg0KCS8qKg0KCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLkFzc2VydGVkSW5mZXJlbmNlI2dldENhcmRpbmFsaXR5IDxlbT5DYXJkaW5hbGl0eTwvZW0+fScgYXR0cmlidXRlLg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FyZGluYWxpdHk8L2VtPicgYXR0cmlidXRlLg0KCSAqIEBzZWUgI2dldENhcmRpbmFsaXR5KCkNCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJdm9pZCBzZXRDYXJkaW5hbGl0eShTdHJpbmcgdmFsdWUpOw0KDQoJLyoqDQoJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U291cmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4NCgkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuQXJndW1lbnRhdGlvbkVsZW1lbnR9Lg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogPHA+DQoJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U291cmNlPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLA0KCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCgkgKiA8L3A+DQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U291cmNlPC9lbT4nIHJlZmVyZW5jZSBsaXN0Lg0KCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuQXJnUGFja2FnZSNnZXRBc3NlcnRlZEluZmVyZW5jZV9Tb3VyY2UoKQ0KCSAqIEBtb2RlbA0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglFTGlzdDxBcmd1bWVudGF0aW9uRWxlbWVudD4gZ2V0U291cmNlKCk7DQoNCgkvKioNCgkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UYXJnZXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0Lg0KCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5vcGVuY2VydC5zYW0uYXJnLmFyZy5Bcmd1bWVudGF0aW9uRWxlbWVudH0uDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8cD4NCgkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UYXJnZXQ8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsDQoJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KCSAqIDwvcD4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYXJnZXQ8L2VtPicgcmVmZXJlbmNlIGxpc3QuDQoJICogQHNlZSBvcmcuZWNsaXBzZS5vcGVuY2VydC5zYW0uYXJnLmFyZy5BcmdQYWNrYWdlI2dldEFzc2VydGVkSW5mZXJlbmNlX1RhcmdldCgpDQoJICogQG1vZGVsDQoJICogQGdlbmVyYXRlZA0KCSAqLw0KCUVMaXN0PEFyZ3VtZW50YXRpb25FbGVtZW50PiBnZXRUYXJnZXQoKTsNCg0KfSAvLyBBc3NlcnRlZEluZmVyZW5jZQ0K