LyoKICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMuamVsbHkuYW50LnRhc2s7CgppbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwoKLyoKCjx0YXNrZGVmCiAgIG5hbWU9Im5lc3RlZCIKICAgY2xhc3NuYW1lPSJqZWxseWJ1Zy5OZXN0ZWRUYXNrIgo+CiAgIDxjbGFzc3BhdGg+CiAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSJzb21ld2hlcmUiLz4KICAgPC9jbGFzc3BhdGg+CjwvdGFza2RlZj4KCjxuZXN0ZWQ+CiAgIDxkaW5nLz4KICAgPGRhbmcvPgogICA8ZG9uZy8+CiAgIDxoaXBob3AvPgogICA8d29udHN0b3AvPgogICA8dGlsbHlvdWRyb3AvPgogICA8aGlwSG9wLz4KICAgPHdvbnRTdG9wLz4KICAgPHRpbGxZb3VEcm9wLz4KPC9uZXN0ZWQ+CgpBbnQ6CiAgIFtuZXN0ZWRdIGEKICAgW25lc3RlZF0gYgogICBbbmVzdGVkXSBjCiAgIFtuZXN0ZWRdIGQKICAgW25lc3RlZF0gZQogICBbbmVzdGVkXSBmCiAgIFtuZXN0ZWRdIGcKICAgW25lc3RlZF0gaAogICBbbmVzdGVkXSBpCgpNYXZlbi9KZWxseToKYQpiCmMKZAplCmYKZwpoCmkKCiovCgovKioKICogQSBzYW1wbGUgVGFzayB0byB0ZXN0IG91dCB0aGUgQW50IGludHJvc3BlY3Rpb24gbG9naWMKICoKICogQGF1dGhvciBBc2xhayBIZWxsZXP4eSAoYXNsYWsuaGVsbGVzb3lAYmVray5ubykKICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjggJAogKi8KcHVibGljIGNsYXNzIER1bW15VGFzayBleHRlbmRzIFRhc2sgewogICAgcHJpdmF0ZSBpbnQgaSA9IDA7CiAgICBwcml2YXRlIFN0cmluZ1tdIG1lc3NhZ2VzID0geyAiYSIsICJiIiwgImMiLCAiZCIsICJlIiwgImYiLCAiZyIsICJoIiwgImkiIH07CiAgICBwcml2YXRlIGJvb2xlYW4gZm9yY2U7CgogICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgaWYgKCFmb3JjZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlNob3VsZCBoYXZlIHNldCBmb3JjZSB0byBiZSB0cnVlISIpOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgVGhpbmd5IGNyZWF0ZURpbmcoKSB7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjcmVhdGVEaW5nOiAiICsgbWVzc2FnZXNbaSsrXSk7CiAgICAgICAgcmV0dXJuIG5ldyBUaGluZ3koKTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBhZGREYW5nKFRoaW5neSB0aGluZ3kpIHsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImFkZERhbmc6ICIgKyBtZXNzYWdlc1tpKytdKTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkRG9uZyhUaGluZ3kgdGhpbmd5KSB7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJhZGRDb25maWd1cmVkRG9uZzogIiArIG1lc3NhZ2VzW2krK10pOwogICAgfQoKICAgIHB1YmxpYyBUaGluZ3kgY3JlYXRlSGlwSG9wKCkgewogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY3JlYXRlSGlwSG9wOiAiICsgbWVzc2FnZXNbaSsrXSk7CiAgICAgICAgcmV0dXJuIG5ldyBUaGluZ3koKTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBhZGRXb250U3RvcChUaGluZ3kgdGhpbmd5KSB7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJhZGRXb250U3RvcDogIiArIG1lc3NhZ2VzW2krK10pOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWRUaWxsWW91RHJvcChUaGluZ3kgdGhpbmd5KSB7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJhZGRDb25maWd1cmVkVGlsbFlvdURyb3A6ICIgKyBtZXNzYWdlc1tpKytdKTsKICAgIH0KCiAgICBwdWJsaWMgYm9vbGVhbiBpc0ZvcmNlKCkgewogICAgICAgIHJldHVybiBmb3JjZTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBzZXRGb3JjZShib29sZWFuIGZvcmNlKSB7CiAgICAgICAgdGhpcy5mb3JjZSA9IGZvcmNlOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGhpbmd5IHsKICAgIH0KfQ==