PCEtLQogICAgCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAogICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgogICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICAgCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAgIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgotLT4KPCEtLSAkUmV2JCAkRGF0ZSQgLS0+CjxodG1sPgo8aGVhZD4KPHRpdGxlPlNlcnZpY2VNaXggV1NETC1GaXJzdCBFeGFtcGxlPC90aXRsZT4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp2YXIgdXJsVG9PcGVuID0gImh0dHA6Ly9sb2NhbGhvc3Q6ODA5Mi9QZXJzb25TZXJ2aWNlLyI7IC8vZGVmYXVsdCBVUkwgdG8gb3BlbgoKZnVuY3Rpb24gZ2V0SFRUUE9iamVjdCgpIHsKICB2YXIgeG1saHR0cCA9IGZhbHNlOwoKICAvKiBDb21waWxhdGlvbiBjb25kaXRpb25uZWxsZSBkJ0lFICovCiAgLypAY2Nfb24KICBAaWYgKEBfanNjcmlwdF92ZXJzaW9uID49IDUpCiAgICAgdHJ5IHsKICAgICAgICB4bWxodHRwID0gbmV3IEFjdGl2ZVhPYmplY3QoIk1zeG1sMi5YTUxIVFRQIik7CiAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgeG1saHR0cCA9IG5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpOwogICAgICAgIH0gY2F0Y2ggKEUpIHsKICAgICAgICAgICB4bWxodHRwID0gZmFsc2U7CiAgICAgICAgfQogICAgIH0KICBAZWxzZQogICAgIHhtbGh0dHAgPSBmYWxzZTsKICBAZW5kIEAqLwoKICAvKiBvbiBlc3NhaWUgZGUgY3LpZXIgbCdvYmpldCBzaSBjZSBuJ2VzdCBwYXMgZOlq4CBmYWl0ICovCiAgaWYgKCF4bWxodHRwICYmIHR5cGVvZiBYTUxIdHRwUmVxdWVzdCAhPSAndW5kZWZpbmVkJykgewogICAgIHRyeSB7CiAgICAgICAgeG1saHR0cCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICB4bWxodHRwID0gZmFsc2U7CiAgICAgfQogIH0KCiAgaWYgKHhtbGh0dHApIHsKICAgICAvKiBvbiBk6WZpbml0IGNlIHF1aSBkb2l0IHNlIHBhc3NlciBxdWFuZCBsYSBwYWdlIHLpcG9uZHJhICovCiAgICAgeG1saHR0cC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHhtbGh0dHAucmVhZHlTdGF0ZSA9PSA0KSB7IC8qIDQgOiDpdGF0ICJjb21wbGV0ZSIgKi8KICAgICAgICAgICB2YXIgcmVzcG9uc2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVzcG9uc2UiKTsKICAgICAgICAgICB2YXIgcmVzcG9uc2VTdGF0dXMgPSAiIjsKICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgcmVzcG9uc2VTdGF0dXMgPSB4bWxodHRwLnN0YXR1cyArICIiOwogICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgIHJlc3BvbnNlU3RhdHVzID0gIkVSUk9SIFdISUxFIFJFVFJJRVZJTkcgU1RBVFVTOyBNQVlCRSBVTkFCTEUgVE8gQ09OTkVDVC4iOwogICAgICAgICAgIH0KICAgICAgICAgICByZXNwb25zZS52YWx1ZSA9ICJTVEFUVVM6ICIgKyByZXNwb25zZVN0YXR1cyArICJcbiIgKyB4bWxodHRwLnJlc3BvbnNlVGV4dDsKICAgICAgICB9CiAgICAgfQogIH0KICByZXR1cm4geG1saHR0cDsKfQoKZnVuY3Rpb24gc2VuZCgpIHsKICBpZiAoKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ1cmxUb09wZW4iKS52YWx1ZSAhPSB1cmxUb09wZW4pICYmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidXJsVG9PcGVuIikudmFsdWUgIT0gIiIpKSB7CiAgICAvL3VzZSB1c2VyIGVudHJ5IG9ubHkgaWYgaXQgYXQgbGVhc3QgY2FuIGJlIG9rYXkKICAgIHVybFRvT3BlbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ1cmxUb09wZW4iKS52YWx1ZTsKICB9ICAKICB2YXIgeG1saHR0cCA9IGdldEhUVFBPYmplY3QoKTsKICBpZiAoIXhtbGh0dHApIHsKICAgIGFsZXJ0KCdjb3VuZCBub3QgY3JlYXRlIFhNTEh0dHBSZXF1ZXN0IG9iamVjdCcpOwogICAgcmV0dXJuOwogIH0KICB2YXIgcmVxdWVzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZXF1ZXN0Iik7CiAgdmFyIHJlc3BvbnNlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlc3BvbnNlIik7CiAgdHJ5IHsKICAgIG5ldHNjYXBlLnNlY3VyaXR5LlByaXZpbGVnZU1hbmFnZXIuZW5hYmxlUHJpdmlsZWdlKCJVbml2ZXJzYWxCcm93c2VyUmVhZCBVbml2ZXJzYWxCcm93c2VyV3JpdGUiKTsKICB9IGNhdGNoIChlKSB7CiAgfQogIHRyeSB7CiAgICB4bWxodHRwLm9wZW4oIlBPU1QiLCB1cmxUb09wZW4sIHRydWUpOwogIH0gY2F0Y2ggKGUpIHsKICAgIGFsZXJ0KCdlcnJvciBvcGVuaW5nJyk7CiAgfQogIHhtbGh0dHAuc2VuZChyZXF1ZXN0LnZhbHVlKTsKfQoKPC9zY3JpcHQ+CjwvaGVhZD4KCjxib2R5PgoKPGgxPlNlcnZpY2VNaXggV1NETC1GaXJzdCBFeGFtcGxlPC9oMT4KCjxwPldlbGNvbWUgdG8gdGhlIFdTREwtRmlyc3QgZXhhbXBsZSBmb3IgU2VydmljZU1peDwvcD4KCjxwPlBlcmZvcm0gYSBQT1NUIGludG8gdGhlIEhUVFAgYmluZGluZy4gVGhpcyByZXF1aXJlcyBKYXZhU2NyaXB0LjwvcD4gCjxwPlRhcmdldDogPGlucHV0IHR5cGU9InRleHQiIHNpemU9IjUwIiBpZD0idXJsVG9PcGVuIiB2YWx1ZT0iIj48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInVybFRvT3BlbiIpLnZhbHVlID0gdXJsVG9PcGVuOzwvc2NyaXB0Pi48L3A+CiAgCjx0YWJsZT4KICA8dHI+CiAgICA8dGQ+CiAgPHRleHRhcmVhIGlkPSJyZXF1ZXN0IiBzdHlsZT0id2lkdGg6NjAwcHg7aGVpZ2h0OjQwMHB4IiBvbktleVVwPSJzZW5kKCk7Ij48P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pgo8ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iCiAgICAgICAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vc2VydmljZW1peC5hcGFjaGUub3JnL3NhbXBsZXMvd3NkbC1maXJzdC90eXBlcyI+CiAgPGVudjpCb2R5PgogICAgPHRuczpHZXRQZXJzb24+CiAgICAgIDx0bnM6cGVyc29uSWQ+d29ybGQ8L3RuczpwZXJzb25JZD4KICAgIDwvdG5zOkdldFBlcnNvbj4KICA8L2VudjpCb2R5Pgo8L2VudjpFbnZlbG9wZT4KCiAgPC90ZXh0YXJlYT4KICAgIDwvdGQ+CiAgICA8dGQ+CiAgPHRleHRhcmVhIGlkPSJyZXNwb25zZSIgc3R5bGU9IndpZHRoOjYwMHB4O2hlaWdodDo0MDBweCI+CiAgPC90ZXh0YXJlYT4KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY29sc3Bhbj0yPgogIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJTZW5kIiBvbkNsaWNrPSJzZW5kKCk7Ii8+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CjwvYm9keT4KPC9odG1sPgo=