cGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnNjbS5wcm92aWRlci5iYXphYXIuY29tbWFuZC5hZGQ7CgovKgogKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgogKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCiAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQogKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogKiB1bmRlciB0aGUgTGljZW5zZS4KICovCgppbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5zY20uU2NtRXhjZXB0aW9uOwppbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5zY20uU2NtRmlsZVNldDsKaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uc2NtLlNjbVJlc3VsdDsKaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uc2NtLmNvbW1hbmQuYWRkLkFic3RyYWN0QWRkQ29tbWFuZDsKaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uc2NtLmNvbW1hbmQuYWRkLkFkZFNjbVJlc3VsdDsKaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uc2NtLnByb3ZpZGVyLlNjbVByb3ZpZGVyUmVwb3NpdG9yeTsKaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uc2NtLnByb3ZpZGVyLmJhemFhci5CYXphYXJVdGlsczsKaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uc2NtLnByb3ZpZGVyLmJhemFhci5jb21tYW5kLkJhemFhckNvbW1hbmQ7CgppbXBvcnQgamF2YS5pby5GaWxlOwoKLyoqCiAqIEFkZCBubyByZWN1cnNpdmUuCiAqCiAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnRvcmJqb3JuQHNtb3JncmF2Lm9yZyI+VG9yYmr4cm4gRWlrbGkgU234cmdyYXY8L2E+CiAqLwpwdWJsaWMgY2xhc3MgQmF6YWFyQWRkQ29tbWFuZAogICAgZXh0ZW5kcyBBYnN0cmFjdEFkZENvbW1hbmQKICAgIGltcGxlbWVudHMgQmF6YWFyQ29tbWFuZAp7CiAgICBwcm90ZWN0ZWQgU2NtUmVzdWx0IGV4ZWN1dGVBZGRDb21tYW5kKCBTY21Qcm92aWRlclJlcG9zaXRvcnkgcmVwbywgU2NtRmlsZVNldCBmaWxlU2V0LCBTdHJpbmcgbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYmluYXJ5ICkKICAgICAgICB0aHJvd3MgU2NtRXhjZXB0aW9uCiAgICB7CiAgICAgICAgU3RyaW5nW10gYWRkQ21kID0gbmV3IFN0cmluZ1tde0FERF9DTUQsIE5PX1JFQ1VSU0VfT1BUSU9OfTsKICAgICAgICBhZGRDbWQgPSBCYXphYXJVdGlscy5leHBhbmRDb21tYW5kTGluZSggYWRkQ21kLCBmaWxlU2V0ICk7CgogICAgICAgIEZpbGUgd29ya2luZ0RpciA9IGZpbGVTZXQuZ2V0QmFzZWRpcigpOwogICAgICAgIEJhemFhckFkZENvbnN1bWVyIGNvbnN1bWVyID0gbmV3IEJhemFhckFkZENvbnN1bWVyKCBnZXRMb2dnZXIoKSwgd29ya2luZ0RpciApOwogICAgICAgIFNjbVJlc3VsdCByZXN1bHQgPSBCYXphYXJVdGlscy5leGVjdXRlKCBjb25zdW1lciwgZ2V0TG9nZ2VyKCksIHdvcmtpbmdEaXIsIGFkZENtZCApOwoKICAgICAgICByZXR1cm4gbmV3IEFkZFNjbVJlc3VsdCggY29uc3VtZXIuZ2V0QWRkZWRGaWxlcygpLCByZXN1bHQgKTsKICAgIH0KfQo=