cGFja2FnZSBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5kZTsKCmltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5BbmFseXplcjsKaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLkxvd2VyQ2FzZUZpbHRlcjsKaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLlN0b3BGaWx0ZXI7CmltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5Ub2tlblN0cmVhbTsKaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLnN0YW5kYXJkLlN0YW5kYXJkRmlsdGVyOwppbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuc3RhbmRhcmQuU3RhbmRhcmRUb2tlbml6ZXI7CmltcG9ydCBqYXZhLmlvLkZpbGU7CmltcG9ydCBqYXZhLmlvLlJlYWRlcjsKaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CgovKioKICogQW5hbHl6ZXIgZm9yIGdlcm1hbiBsYW5ndWFnZS4gU3VwcG9ydHMgYW4gZXh0ZXJuYWwgbGlzdCBvZiBzdG9wd29yZHMgKHdvcmRzIHRoYXQKICogd2lsbCBub3QgYmUgaW5kZXhlZCBhdCBhbGwpIGFuZCBhbiBleHRlcm5hbCBsaXN0IG9mIGV4Y2x1c2lvbnMgKHdvcmQgdGhhdCB3aWxsCiAqIG5vdCBiZSBzdGVtbWVkLCBidXQgaW5kZXhlZCkuCiAqCiAqIEBhdXRob3IgICAgR2VyaGFyZCBTY2h3YXJ6CiAqIEB2ZXJzaW9uICAgJElkJAogKi8KcHVibGljIGZpbmFsIGNsYXNzIEdlcm1hbkFuYWx5emVyIGV4dGVuZHMgQW5hbHl6ZXIgewoKCS8qKgoJICogTGlzdCBvZiB0eXBpY2FsIGdlcm1hbiBzdG9wd29yZHMuCgkgKi8KCXByaXZhdGUgU3RyaW5nW10gR0VSTUFOX1NUT1BfV09SRFMgPSB7CgkJImVpbmVyIiwgImVpbmUiLCAiZWluZXMiLCAiZWluZW0iLCAiZWluZW4iLAoJCSJkZXIiLCAiZGllIiwgImRhcyIsICJkYXNzIiwgImRh3yIsCgkJImR1IiwgImVyIiwgInNpZSIsICJlcyIsCgkJIndhcyIsICJ3ZXIiLCAid2llIiwgIndpciIsCgkJInVuZCIsICJvZGVyIiwgIm9obmUiLCAibWl0IiwKCQkiYW0iLCAiaW0iLCAiaW4iLCAiYXVzIiwgImF1ZiIsCgkJImlzdCIsICJzZWluIiwgIndhciIsICJ3aXJkIiwKCQkiaWhyIiwgImlocmUiLCAiaWhyZXMiLAoJCSJhbHMiLCAiZvxyIiwgInZvbiIsICJtaXQiLAoJCSJkaWNoIiwgImRpciIsICJtaWNoIiwgIm1pciIsCgkJIm1laW4iLCAic2VpbiIsICJrZWluIiwKCQkiZHVyY2giLCAid2VnZW4iCgkJfTsKCQoJLyoqCgkgKiBDb250YWlucyB0aGUgc3RvcHdvcmRzIHVzZWQgd2l0aCB0aGUgU3RvcEZpbHRlci4KCSAqLwoJcHJpdmF0ZSBIYXNodGFibGUgc3RvcHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwoJLyoqCgkgKiBDb250YWlucyB3b3JkcyB0aGF0IHNob3VsZCBiZSBpbmRleGVkIGJ1dCBub3Qgc3RlbW1lZC4KCSAqLwoJcHJpdmF0ZSBIYXNodGFibGUgZXhjbHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwoJCgkvKioKCSAqIEJ1aWxkcyBhbiBhbmFseXplci4KCSAqLwoJcHVibGljIEdlcm1hbkFuYWx5emVyKCkgewoJCXN0b3B0YWJsZSA9IFN0b3BGaWx0ZXIubWFrZVN0b3BUYWJsZSggR0VSTUFOX1NUT1BfV09SRFMgKTsKCX0KCgkvKioKCSAqIEJ1aWxkcyBhbiBhbmFseXplciB3aXRoIHRoZSBnaXZlbiBzdG9wIHdvcmRzLgoJICovCglwdWJsaWMgR2VybWFuQW5hbHl6ZXIoIFN0cmluZ1tdIHN0b3B3b3JkcyApIHsKCQlzdG9wdGFibGUgPSBTdG9wRmlsdGVyLm1ha2VTdG9wVGFibGUoIHN0b3B3b3JkcyApOwoJfQoKCS8qKgoJICogQnVpbGRzIGFuIGFuYWx5emVyIHdpdGggdGhlIGdpdmVuIHN0b3Agd29yZHMuCgkgKi8KCXB1YmxpYyBHZXJtYW5BbmFseXplciggSGFzaHRhYmxlIHN0b3B3b3JkcyApIHsKCQlzdG9wdGFibGUgPSBzdG9wd29yZHM7Cgl9CgoJLyoqCgkgKiBCdWlsZHMgYW4gYW5hbHl6ZXIgd2l0aCB0aGUgZ2l2ZW4gc3RvcCB3b3Jkcy4KCSAqLwoJcHVibGljIEdlcm1hbkFuYWx5emVyKCBGaWxlIHN0b3B3b3JkcyApIHsKCQlzdG9wdGFibGUgPSBXb3JkbGlzdExvYWRlci5nZXRXb3JkdGFibGUoIHN0b3B3b3JkcyApOwoJfQoKCS8qKgoJICogQnVpbGRzIGFuIGV4Y2x1c2lvbmxpc3QgZnJvbSBhbiBhcnJheSBvZiBTdHJpbmdzLgoJICovCglwdWJsaWMgdm9pZCBzZXRTdGVtRXhjbHVzaW9uVGFibGUoIFN0cmluZ1tdIGV4Y2x1c2lvbmxpc3QgKSB7CgkJZXhjbHRhYmxlID0gU3RvcEZpbHRlci5tYWtlU3RvcFRhYmxlKCBleGNsdXNpb25saXN0ICk7Cgl9CgkvKioKCSAqIEJ1aWxkcyBhbiBleGNsdXNpb25saXN0IGZyb20gYSBIYXNodGFibGUuCgkgKi8KCXB1YmxpYyB2b2lkIHNldFN0ZW1FeGNsdXNpb25UYWJsZSggSGFzaHRhYmxlIGV4Y2x1c2lvbmxpc3QgKSB7CgkJZXhjbHRhYmxlID0gZXhjbHVzaW9ubGlzdDsKCX0KCS8qKgoJICogQnVpbGRzIGFuIGV4Y2x1c2lvbmxpc3QgZnJvbSB0aGUgd29yZHMgY29udGFpbmVkIGluIHRoZSBnaXZlbiBmaWxlLgoJICovCglwdWJsaWMgdm9pZCBzZXRTdGVtRXhjbHVzaW9uVGFibGUoIEZpbGUgZXhjbHVzaW9ubGlzdCApIHsKCQlleGNsdGFibGUgPSBXb3JkbGlzdExvYWRlci5nZXRXb3JkdGFibGUoIGV4Y2x1c2lvbmxpc3QgKTsKCX0KCQoJLyoqCgkgKiBDcmVhdGVzIGEgVG9rZW5TdHJlYW0gd2hpY2ggdG9rZW5pemVzIGFsbCB0aGUgdGV4dCBpbiB0aGUgcHJvdmlkZWQgUmVhZGVyLgoJICoKCSAqIEByZXR1cm4gIEEgVG9rZW5TdHJlYW0gYnVpbGQgZnJvbSBhIFN0YW5kYXJkVG9rZW5pemVyIGZpbHRlcmVkIHdpdGgKCSAqIAkJCVN0YW5kYXJkRmlsdGVyLCBTdG9wRmlsdGVyLCBHZXJtYW5TdGVtRmlsdGVyIGFuZCBMb3dlckNhc2VGaWx0ZXIuCgkgKi8KCXB1YmxpYyBmaW5hbCBUb2tlblN0cmVhbSB0b2tlblN0cmVhbShTdHJpbmcgZmllbGROYW1lLCBSZWFkZXIgcmVhZGVyKSB7CgkJVG9rZW5TdHJlYW0gcmVzdWx0ID0gbmV3IFN0YW5kYXJkVG9rZW5pemVyKCByZWFkZXIgKTsKCQlyZXN1bHQgPSBuZXcgU3RhbmRhcmRGaWx0ZXIoIHJlc3VsdCApOwoJCXJlc3VsdCA9IG5ldyBTdG9wRmlsdGVyKCByZXN1bHQsIHN0b3B0YWJsZSApOwoJCXJlc3VsdCA9IG5ldyBHZXJtYW5TdGVtRmlsdGVyKCByZXN1bHQsIGV4Y2x0YWJsZSApOwoJCS8vIENvbnZlcnQgdG8gbG93ZXJjYXNlIGFmdGVyIHN0ZW1taW5nIQoJCXJlc3VsdCA9IG5ldyBMb3dlckNhc2VGaWx0ZXIoIHJlc3VsdCApOwoJCXJldHVybiByZXN1bHQ7Cgl9Cn0KCg==