LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKoCoKICogQ29udHJpYnV0b3JzOgogKiAgICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlOwoKaW1wb3J0IGphdmEubmV0LlVSTDsKCmltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CgppbXBvcnQgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZVRlc3RDYXNlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBsdWdpbi5XU1BsdWdpbjsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcmVmZXJlbmNlcy5QZXJzaXN0ZW50V1NJQ29udGV4dDsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuSVZhbGlkYXRpb25SZXBvcnQ7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLmVjbGlwc2UuV1NETFZhbGlkYXRvcjsKCnB1YmxpYyBjbGFzcyBWYWxpZGF0ZVN0b2NrUXVvdGVXU0lUZXN0Q2FzZSBleHRlbmRzIFBlcmZvcm1hbmNlVGVzdENhc2UKewogIHByaXZhdGUgV1NETFZhbGlkYXRvciB2YWxpZGF0b3I7CiAgCiAgLyogKG5vbi1KYXZhZG9jKQogICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKICAgKi8KICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gCiAgewogICAgc3VwZXIuc2V0VXAoKTsKICAgIC8vIFNldCB0aGUgV1MtSSBwcmVmZXJlbmNlIHRvIGlnbm9yZSBzbyBvbmx5IFdTREwgZXJyb3JzIHdpbGwgYmUgdGVzdGVkLgogICAgV1NQbHVnaW4gd3N1aSA9IFdTUGx1Z2luLmdldEluc3RhbmNlKCk7CiAgICBQZXJzaXN0ZW50V1NJQ29udGV4dCB3c2ljb250ZXh0ID0gd3N1aS5nZXRXU0lTU0JQQ29udGV4dCgpOwogICAgd3NpY29udGV4dC51cGRhdGVXU0lDb21wbGlhbmNlcyhQZXJzaXN0ZW50V1NJQ29udGV4dC5TVE9QX05PTl9XU0kpOwogICAgd3NpY29udGV4dCA9IHdzdWkuZ2V0V1NJQVBDb250ZXh0KCk7CiAgICB3c2ljb250ZXh0LnVwZGF0ZVdTSUNvbXBsaWFuY2VzKFBlcnNpc3RlbnRXU0lDb250ZXh0LlNUT1BfTk9OX1dTSSk7CiAgfSAgCiAgCiAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKICB7CiAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShWYWxpZGF0ZVN0b2NrUXVvdGVXU0lUZXN0Q2FzZS5jbGFzcywgIlZhbGlkYXRlU3RvY2tRdW90ZVdTSVRlc3RDYXNlIik7CiAgfQogIAogIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZVN0b2NrUXVvdGVXU0koKSB0aHJvd3MgRXhjZXB0aW9uCiAgewoJdmFsaWRhdG9yID0gV1NETFZhbGlkYXRvci5nZXRJbnN0YW5jZSgpOwogICAgVVJMIHdzZGwgPSBQZXJmb3JtYW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoImRhdGEvU3RvY2tRdW90ZS9TdG9ja1F1b3RlLndzZGwiKTsKICAgIFN0cmluZyBwYXRoID0gd3NkbC50b1N0cmluZygpOwoJCiAgICBzdGFydE1lYXN1cmluZygpOwkKICAgIElWYWxpZGF0aW9uUmVwb3J0IHZhbHJlcG9ydCA9IHZhbGlkYXRvci52YWxpZGF0ZShwYXRoKTsKCXN0b3BNZWFzdXJpbmcoKTsKCWNvbW1pdE1lYXN1cmVtZW50cygpOwoJYXNzZXJ0UGVyZm9ybWFuY2UoKTsKICB9Cn0K