LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKoCoKICogQ29udHJpYnV0b3JzOgogKiAgICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlOwoKaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07CmltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwppbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50cm8uSUludHJvTWFuYWdlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludHJvLklJbnRyb1BhcnQ7CgpwdWJsaWMgY2xhc3MgT3BlblN0b2NrUXVvdGVXU0RMU2V0dXAgZXh0ZW5kcyBUZXN0Q2FzZQp7CiAgcHVibGljIHN0YXRpYyBTdHJpbmcgUFJPSkVDVF9OQU1FID0gIlByb2plY3QiOwoKICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQogIHsKICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKE9wZW5TdG9ja1F1b3RlV1NETFNldHVwLmNsYXNzLCAiT3BlblN0b2NrUXVvdGVXU0RMU2V0dXAiKTsKICB9CgogIHByb3RlY3RlZCB2b2lkIGNsb3NlSW50cm8oKQogIHsKICAgIElJbnRyb01hbmFnZXIgaW50cm9NYW5hZ2VyID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRJbnRyb01hbmFnZXIoKTsKICAgIElJbnRyb1BhcnQgaW50cm9QYXJ0ID0gaW50cm9NYW5hZ2VyLmdldEludHJvKCk7CiAgICBpZiAoaW50cm9QYXJ0ICE9IG51bGwpCiAgICAgIGludHJvTWFuYWdlci5jbG9zZUludHJvKGludHJvUGFydCk7CiAgfQoKICBwcm90ZWN0ZWQgSVByb2plY3QgY3JlYXRlU2ltcGxlUHJvamVjdChTdHJpbmcgbmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24KICB7CiAgICBJUHJvamVjdCBzaW1wbGVQcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KG5hbWUpOwogICAgc2ltcGxlUHJvamVjdC5jcmVhdGUobnVsbCk7CiAgICBzaW1wbGVQcm9qZWN0Lm9wZW4obnVsbCk7CiAgICByZXR1cm4gc2ltcGxlUHJvamVjdDsKICB9CgogIHByb3RlY3RlZCB2b2lkIGNvcHlGaWxlKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBzb3VyY2UsIFN0cmluZyBkZXN0KSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24KICB7CiAgICBJRmlsZSBmaWxlID0gcHJvamVjdC5nZXRGaWxlKGRlc3QpOwogICAgZmlsZS5jcmVhdGUoUGVyZm9ybWFuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KHNvdXJjZSkub3BlblN0cmVhbSgpLCB0cnVlLCBudWxsKTsKICB9CgogIHByb3RlY3RlZCB2b2lkIGpvaW5BdXRvQnVpbGQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgogIHsKICAgIGJvb2xlYW4gaW50ZXJydXB0ZWQgPSB0cnVlOwogICAgd2hpbGUgKGludGVycnVwdGVkKQogICAgewogICAgICB0cnkKICAgICAgewogICAgICAgIFBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7CiAgICAgICAgaW50ZXJydXB0ZWQgPSBmYWxzZTsKICAgICAgfQogICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkKICAgICAgewogICAgICAgIGludGVycnVwdGVkID0gdHJ1ZTsKICAgICAgfQogICAgfQogIH0KCiAgcHVibGljIHZvaWQgdGVzdFNldHVwKCkgdGhyb3dzIEV4Y2VwdGlvbgogIHsKICAgIGNsb3NlSW50cm8oKTsKICAgIElQcm9qZWN0IHByb2plY3QgPSBjcmVhdGVTaW1wbGVQcm9qZWN0KFBST0pFQ1RfTkFNRSk7CiAgICBjb3B5RmlsZShwcm9qZWN0LCAiZGF0YS9TdG9ja1F1b3RlL1N0b2NrUXVvdGUud3NkbCIsICJTdG9ja1F1b3RlLndzZGwiKTsKICAgIGpvaW5BdXRvQnVpbGQoKTsKICB9Cn0K