jM0X{"name":"EncodedFiles","files":[{"name":"messagehandlerAC2.html","size":16848,"type":"text/html","content":"Y2xhc3MgTWVzc2FnZUhhbmRsZXIgewogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5mZXRjaGVyID0gbmV3IEJsb2NrY2hhaW5GZXRjaGVyKCk7CiAgICAvLyBXZSByZWx5IG9uIHRoZSBDb3JlR2xvYmFscyBzdHlsZXMgZm9yIHVuaWZpZWQgc3R5bGluZwoKICAgIC8vIENsb3NlIGFueSBvcGVuIGRyb3Bkb3ducyB3aGVuIGNsaWNraW5nIG91dHNpZGUKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7CiAgICAgIGNvbnN0IGRyb3Bkb3ducyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcm9wZG93bi1tZW51Jyk7CiAgICAgIGNvbnN0IGJ1dHRvbnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZHJvcGRvd24tdG9nZ2xlJyk7CiAgICAgIAogICAgICBpZiAoZXZlbnQudGFyZ2V0LmNsb3Nlc3QoJy5kcm9wZG93bi1tZW51JykgfHwgQXJyYXkuZnJvbShidXR0b25zKS5pbmNsdWRlcyhldmVudC50YXJnZXQpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIAogICAgICBkcm9wZG93bnMuZm9yRWFjaChtZW51ID0+IHsKICAgICAgICBtZW51LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgIH0pOwogICAgfSk7CiAgfQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIFVuaWZpZWQgTWVzc2FnZSBGbG93CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBhc3luYyBvcGVuTWVzc2FnZSh0eGlkKSB7CiAgICB0cnkgewogICAgICAvLyBGZXRjaCB0cmFuc2FjdGlvbiBkYXRhIChzYW1lIGZvciBpbmJveCBhbmQgc2VudCkKICAgICAgY29uc3QgcmF3RGF0YSA9IGF3YWl0IHRoaXMuZmV0Y2hlci5mZXRjaFRyYW5zYWN0aW9uKHR4aWQpOwogICAgICAvLyBEZXRlcm1pbmUgaWYgdGhlIGN1cnJlbnQgZm9sZGVyIGlzICJzZW50IgogICAgICBjb25zdCBpc1NlbnRNZXNzYWdlID0gd2luZG93Lmdsb2JhbFN0YXRlLmN1cnJlbnRGb2xkZXIgPT09ICdzZW50JzsKICAgICAgLy8gVXNlIHRoZSBzYW1lIHBhcnNpbmcgJiByZW5kZXJpbmcgZmxvdyBmb3IgYm90aCBpbmJveCBhbmQgc2VudCBtZXNzYWdlcwogICAgICBhd2FpdCB0aGlzLnNob3dDb250ZW50KHJhd0RhdGEsIHR4aWQsIGlzU2VudE1lc3NhZ2UpOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgY29uc29sZS5lcnJvcigiRXJyb3IgZGlzcGxheWluZyBtZXNzYWdlOiIsIGVycm9yKTsKICAgICAgYWxlcnQoIkVycm9yIGRpc3BsYXlpbmcgbWVzc2FnZTogIiArIGVycm9yLm1lc3NhZ2UpOwogICAgfQogIH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBTZW50IEZvbGRlciBTcGVjaWZpYyBSZW5kZXJpbmcKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIHVwZGF0ZVNlbnRGb2xkZXIoKSB7CiAgICBjb25zdCBtZXNzYWdlTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtZXNzYWdlTGlzdCIpOwogICAgY29uc3Qgc2VudE1lc3NhZ2VzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgic2VudE1lc3NhZ2VzIikgfHwgIltdIik7Cgpjb25zb2xlLmxvZygiUmF3IHNlbnQgbWVzc2FnZXMgZnJvbSBzdG9yYWdlOiIsIHNlbnRNZXNzYWdlcyk7CiAgICAKICAgIC8vIFVzZSB0aGUgdW5pZmllZCBmb2xkZXItaGVhZGVyIGFuZCBmb2xkZXItY29udGVudCBjbGFzc2VzCiAgICBtZXNzYWdlTGlzdC5pbm5lckhUTUwgPSBgCiAgICAgIDxkaXYgY2xhc3M9ImZvbGRlci1oZWFkZXIiPgogICAgICAgIDxkaXYgY2xhc3M9ImZvbGRlci1oZWFkZXItbGVmdCIgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4OyI+CiAgICAgICAgICA8c3BhbiBjbGFzcz0iZm9sZGVyLWljb24iPiR7d2luZG93LmNvcmVHbG9iYWxzLnJlbmRlckVtb2ppKHdpbmRvdy5FTU9KSV9DT0RFUy5TRU5UKX08L3NwYW4+CiAgICAgICAgICA8aDIgc3R5bGU9Im1hcmdpbjogMDsiPlNlbnQgKCR7c2VudE1lc3NhZ2VzLmxlbmd0aH0pPC9oMj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImZvbGRlci1jb250ZW50Ij4KICAgICAgICAke3NlbnRNZXNzYWdlcy5tYXAobXNnID0+IGAKICAgICAgICAgIDxkaXYgY2xhc3M9Im1lc3NhZ2UtaXRlbSIgb25jbGljaz0id2luZG93Lm1lc3NhZ2VIYW5kbGVyLm9wZW5NZXNzYWdlKCR7SlNPTi5zdHJpbmdpZnkobXNnLnR4aWQpfSkiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0eGlkIj4ke21zZy50eGlkfTwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlLXRpbWUiPgogICAgICAgICAgICAgICR7bmV3IERhdGUobXNnLnRpbWVzdGFtcCkudG9Mb2NhbGVTdHJpbmcoKX0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICR7bXNnLm1lc3NhZ2VEYXRhPy5yZXdhcmREYXRhID8gCiAgICAgICAgICAgICAgYDxkaXYgY2xhc3M9InJld2FyZC1iYWRnZSI+8J+SsCBSZXdhcmQ6ICR7bXNnLm1lc3NhZ2VEYXRhLnJld2FyZERhdGEuYWN0dWFsUmV3YXJkfSBzYXRzPC9kaXY+YCAKICAgICAgICAgICAgICA6ICcnCiAgICAgICAgICAgIH0KICAgICAgICAgICAgPGJ1dHRvbiAKICAgICAgICAgICAgICBjbGFzcz0iYnRuIGJ0bi1kYW5nZXIiIAogICAgICAgICAgICAgIG9uY2xpY2s9IndpbmRvdy5tZXNzYWdlSGFuZGxlci5kZWxldGVTZW50TWVzc2FnZSgke0pTT04uc3RyaW5naWZ5KG1zZy50eGlkKX0pOyBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsiCiAgICAgICAgICAgID4KICAgICAgICAgICAgICDinYwKICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICBgKS5qb2luKCIiKX0KICAgICAgPC9kaXY+CiAgICBgOwogIH0KCiAgZGVsZXRlU2VudE1lc3NhZ2UodHhpZCkgewogICAgY29uc3Qgc2VudE1lc3NhZ2VzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgic2VudE1lc3NhZ2VzIikgfHwgIltdIik7CiAgICBjb25zdCB1cGRhdGVkID0gc2VudE1lc3NhZ2VzLmZpbHRlcihtc2cgPT4gbXNnLnR4aWQgIT09IHR4aWQpOwogICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oInNlbnRNZXNzYWdlcyIsIEpTT04uc3RyaW5naWZ5KHVwZGF0ZWQpKTsKICAgIHRoaXMudXBkYXRlU2VudEZvbGRlcigpOwogIH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBJbmJveCBNZXNzYWdlIEZsb3cKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGFzeW5jIHNob3dNZXNzYWdlKHR4aWQpIHsKICAgIC8vIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgY2FsbCB0aGUgdW5pZmllZCBtZXRob2QuCiAgICBhd2FpdCB0aGlzLm9wZW5NZXNzYWdlKHR4aWQpOwogIH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBTaGFyZWQgQ29udGVudCBEaXNwbGF5IChVc2VkIGZvciBib3RoIEluYm94ICYgU2VudCkKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGFzeW5jIHNob3dDb250ZW50KHJhd0RhdGEsIHR4aWQsIGlzU2VudE1lc3NhZ2UgPSBmYWxzZSkgewogICAgbGV0IGNvbnRlbnQ7CiAgICBsZXQgbWVzc2FnZURhdGEgPSBudWxsOwogICAgdHJ5IHsKICAgICAgLy8gQXR0ZW1wdCB0byBleHRyYWN0IEpTT04gZnJvbSB0aGUgcmF3IGhleCBkYXRhCiAgICAgIGNvbnN0IGpzb25TdGFydCA9IHJhd0RhdGEuaW5kZXhPZignN2IyMicpOyAvLyBoZXggZm9yICd7IicKICAgICAgaWYgKGpzb25TdGFydCA9PT0gLTEpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIEpTT04gZGF0YSBmb3VuZCcpOwogICAgICB9CiAgICAgIGNvbnN0IGpzb25IZXggPSByYXdEYXRhLnNsaWNlKGpzb25TdGFydCk7CiAgICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoCiAgICAgICAganNvbkhleC5tYXRjaCgvLnsxLDJ9L2cpLm1hcChieXRlID0+IHBhcnNlSW50KGJ5dGUsIDE2KSkKICAgICAgKTsKICAgICAgY29uc3QganNvblN0cmluZyA9IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShieXRlcyk7CiAgICAgIG1lc3NhZ2VEYXRhID0gSlNPTi5wYXJzZShqc29uU3RyaW5nKTsKICAgICAgaWYgKCFtZXNzYWdlRGF0YS5maWxlcyB8fCAhbWVzc2FnZURhdGEuZmlsZXNbMF0pIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbWVzc2FnZSBmb3JtYXQnKTsKICAgICAgfQogICAgICBjb250ZW50ID0gewogICAgICAgIGRhdGE6IG1lc3NhZ2VEYXRhLmZpbGVzWzBdLmNvbnRlbnQsCiAgICAgICAgdHlwZTogbWVzc2FnZURhdGEuZmlsZXNbMF0udHlwZSB8fCAndGV4dC9wbGFpbicsCiAgICAgICAgbmFtZTogbWVzc2FnZURhdGEuZmlsZXNbMF0ubmFtZQogICAgICB9OwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgLy8gRmFsbGJhY2sgdG8gdHJlYXRpbmcgcmF3RGF0YSBhcyBwbGFpbiB0ZXh0IGlmIEpTT04gcGFyc2luZyBmYWlscwogICAgICBjb250ZW50ID0gewogICAgICAgIGRhdGE6IHJhd0RhdGEsCiAgICAgICAgdHlwZTogJ3RleHQvcGxhaW4nLAogICAgICAgIG5hbWU6ICdtZXNzYWdlLnR4dCcKICAgICAgfTsKICAgIH0KCiAgICBjb25zdCBtYWlsdG9MaW5rID0gdGhpcy5jcmVhdGVNYWlsdG9MaW5rKHR4aWQsIGNvbnRlbnQuZGF0YSwgY29udGVudC50eXBlKTsKICAgIGNvbnN0IG1lc3NhZ2VMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21lc3NhZ2VMaXN0Jyk7CgogICAgLy8gQ2hvb3NlIHRoZSBhcHByb3ByaWF0ZSByZXdhcmQgZnVuY3Rpb25hbGl0eSBiYXNlZCBvbiB0aGUgZm9sZGVyCiAgICBjb25zdCByZXdhcmRGdW5jdGlvbiA9IGlzU2VudE1lc3NhZ2UgPyAnY2hlY2tBbmRTaG93UmVmdW5kT3B0aW9uJyA6ICdnZXRBbmRTaG93UmV3YXJkRGF0YSc7CiAgICBjb25zdCByZXdhcmRCdXR0b25UZXh0ID0gaXNTZW50TWVzc2FnZSA/ICdDaGVjay9SZWZ1bmQgUmV3YXJkJyA6ICdDaGVjay9DbGFpbSBSZXdhcmQnOwoKICAgIC8vIFJlbmRlciB0aGUgdmlldyB1c2luZyBDb3JlR2xvYmFscycgdW5pZmllZCBjbGFzc2VzCiAgICBtZXNzYWdlTGlzdC5pbm5lckhUTUwgPSBgCiAgICAgIDxkaXYgY2xhc3M9ImZvbGRlci1oZWFkZXIiPgogICAgICAgIDxkaXYgY2xhc3M9ImZvbGRlci1oZWFkZXItbGVmdCIgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7Ij4KICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBidG4tc2Vjb25kYXJ5IiBvbmNsaWNrPSJjbG9zZU1lc3NhZ2VMaXN0KCkiPkJhY2sgdG8gJHtpc1NlbnRNZXNzYWdlID8gJ1NlbnQnIDogJ0luYm94J308L2J1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJmb2xkZXItaGVhZGVyLXJpZ2h0IiBzdHlsZT0iZGlzcGxheTogZmxleDsgZ2FwOiAwLjVyZW07IGFsaWduLWl0ZW1zOiBjZW50ZXI7Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImRyb3Bkb3duIj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IiBvbmNsaWNrPSJ3aW5kb3cubWVzc2FnZUhhbmRsZXIudG9nZ2xlU2hhcmVEcm9wZG93bihldmVudCkiPlNoYXJlIHZpYSBFbWFpbDwvYnV0dG9uPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJkcm9wZG93bi1tZW51Ij4KICAgICAgICAgICAgICA8YSBjbGFzcz0iZHJvcGRvd24taXRlbSIgaHJlZj0iJHttYWlsdG9MaW5rLm1haWx0b30iIHRhcmdldD0iX2JsYW5rIj5EZWZhdWx0IEVtYWlsIENsaWVudDwvYT4KICAgICAgICAgICAgICA8YSBjbGFzcz0iZHJvcGRvd24taXRlbSIgaHJlZj0iJHttYWlsdG9MaW5rLmdtYWlsfSIgdGFyZ2V0PSJfYmxhbmsiPkdtYWlsPC9hPgogICAgICAgICAgICAgIDxhIGNsYXNzPSJkcm9wZG93bi1pdGVtIiBocmVmPSIke21haWx0b0xpbmsub3V0bG9va30iIHRhcmdldD0iX2JsYW5rIj5PdXRsb29rPC9hPgogICAgICAgICAgICAgIDxhIGNsYXNzPSJkcm9wZG93bi1pdGVtIiBocmVmPSIke21haWx0b0xpbmsueWFob299IiB0YXJnZXQ9Il9ibGFuayI+WWFob28gTWFpbDwvYT4KICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJkcm9wZG93bi1pdGVtIiBvbmNsaWNrPSJ3aW5kb3cubWVzc2FnZUhhbmRsZXIuY29weVRvQ2xpcGJvYXJkKCR7SlNPTi5zdHJpbmdpZnkobWFpbHRvTGluay5jb250ZW50KX0pIj5Db3B5IFNoYXJlIExpbms8L2J1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBidG4tcHJpbWFyeSIgb25jbGljaz0id2luZG93Lm1lc3NhZ2VIYW5kbGVyLiR7cmV3YXJkRnVuY3Rpb259KCR7SlNPTi5zdHJpbmdpZnkodHhpZCl9KSI+CiAgICAgICAgICAgICR7cmV3YXJkQnV0dG9uVGV4dH0KICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iZm9sZGVyLWNvbnRlbnQiPgogICAgICAgIDxkaXYgY2xhc3M9Im1lc3NhZ2UtaW5mbyIgc3R5bGU9Im1hcmdpbi1ib3R0b206IDFyZW07Ij4KICAgICAgICAgIDxkaXY+PHN0cm9uZz5GaWxlOjwvc3Ryb25nPiAke2NvbnRlbnQubmFtZX08L2Rpdj4KICAgICAgICAgIDxkaXY+PHN0cm9uZz5UeXBlOjwvc3Ryb25nPiAke2NvbnRlbnQudHlwZX08L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlLWNvbnRlbnQiPgogICAgICAgICAgJHt0aGlzLmZvcm1hdENvbnRlbnQoY29udGVudCl9CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBpZD0icmV3YXJkQ29udGFpbmVyIiBzdHlsZT0ibWFyZ2luLXRvcDogMXJlbTsiPjwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgfQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIFJld2FyZCBIYW5kbGluZyBNZXRob2RzCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBhc3luYyBnZXRBbmRTaG93UmV3YXJkRGF0YSh0eGlkKSB7CiAgICBjb25zdCByZXdhcmRDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmV3YXJkQ29udGFpbmVyJyk7CiAgICByZXdhcmRDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9ImxvYWRpbmciPkNoZWNraW5nIGZvciByZXdhcmQuLi48L2Rpdj4nOwoKICAgIHRyeSB7CiAgICAgIGNvbnN0IHJlc3VsdERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICByZXN1bHREaXYuaWQgPSAncmV3YXJkUmVzdWx0JzsKICAgICAgCiAgICAgIGF3YWl0IHdpbmRvdy50ZXN0R2V0UmV3YXJkRGF0YSh0eGlkLCByZXN1bHREaXYpOwogICAgICAKICAgICAgY29uc3QgcmV3YXJkRGF0YVRleHQgPSByZXN1bHREaXYucXVlcnlTZWxlY3RvcigncHJlJyk/LnRleHRDb250ZW50OwogICAgICBpZiAoIXJld2FyZERhdGFUZXh0KSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyByZXdhcmQgZGF0YSBmb3VuZCcpOwogICAgICB9CgogICAgICBjb25zdCByZXdhcmREYXRhID0gSlNPTi5wYXJzZShyZXdhcmREYXRhVGV4dCk7CiAgICAgIAogICAgICByZXdhcmRDb250YWluZXIuaW5uZXJIVE1MID0gYAogICAgICAgIDxkaXYgY2xhc3M9InJld2FyZC1jbGFpbS1jb250YWluZXIiPgogICAgICAgICAgPGRpdiBjbGFzcz0icmV3YXJkLWluZm8iPgogICAgICAgICAgICA8aDM+8J+SsCBSZXdhcmQgRm91bmQhPC9oMz4KICAgICAgICAgICAgPHA+QW1vdW50OiAke3Jld2FyZERhdGEuYWN0dWFsUmV3YXJkfSBzYXRvc2hpczwvcD4KICAgICAgICAgICAgPHA+QWRkcmVzczogJHtyZXdhcmREYXRhLnJld2FyZEFkZHJlc3N9PC9wPgogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiIGlkPSJjbGFpbUJ1dHRvbiI+Q2xhaW0gUmV3YXJkPC9idXR0b24+CiAgICAgICAgICAgIDxkaXYgaWQ9ImNsYWltU3RhdHVzIj48L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICBgOwoKICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsYWltQnV0dG9uJykub25jbGljayA9ICgpID0+IHRoaXMuY2xhaW1SZXdhcmQodHhpZCwgcmV3YXJkRGF0YSk7CgogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgY2hlY2tpbmcgcmV3YXJkOicsIGVycm9yKTsKICAgICAgcmV3YXJkQ29udGFpbmVyLmlubmVySFRNTCA9IGAKICAgICAgICA8ZGl2IGNsYXNzPSJyZXdhcmQtY2xhaW0tY29udGFpbmVyIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImVycm9yLW1lc3NhZ2UiPgogICAgICAgICAgICBFcnJvciBjaGVja2luZyByZXdhcmQ6ICR7ZXJyb3IubWVzc2FnZX0KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IiBvbmNsaWNrPSJ3aW5kb3cubWVzc2FnZUhhbmRsZXIuZ2V0QW5kU2hvd1Jld2FyZERhdGEoJHtKU09OLnN0cmluZ2lmeSh0eGlkKX0pIj4KICAgICAgICAgICAgICBUcnkgQWdhaW4KICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgYDsKICAgIH0KICB9CgogIGFzeW5jIGNoZWNrQW5kU2hvd1JlZnVuZE9wdGlvbih0eGlkKSB7CiAgICBjb25zdCByZXdhcmRDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmV3YXJkQ29udGFpbmVyJyk7CiAgICByZXdhcmRDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9ImxvYWRpbmciPkNoZWNraW5nIGZvciByZWZ1bmRhYmxlIHJld2FyZC4uLjwvZGl2Pic7CgogICAgdHJ5IHsKICAgICAgY29uc3QgcmVzdWx0RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgIHJlc3VsdERpdi5pZCA9ICdyZXdhcmRSZXN1bHQnOwogICAgICAKICAgICAgYXdhaXQgd2luZG93LnRlc3RHZXRSZXdhcmREYXRhKHR4aWQsIHJlc3VsdERpdik7CiAgICAgIAogICAgICBjb25zdCByZXdhcmREYXRhVGV4dCA9IHJlc3VsdERpdi5xdWVyeVNlbGVjdG9yKCdwcmUnKT8udGV4dENvbnRlbnQ7CiAgICAgIGlmICghcmV3YXJkRGF0YVRleHQpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHJld2FyZCBkYXRhIGZvdW5kJyk7CiAgICAgIH0KCiAgICAgIGNvbnN0IHJld2FyZERhdGEgPSBKU09OLnBhcnNlKHJld2FyZERhdGFUZXh0KTsKICAgICAgCiAgICAgIHJld2FyZENvbnRhaW5lci5pbm5lckhUTUwgPSBgCiAgICAgICAgPGRpdiBjbGFzcz0icmV3YXJkLWNsYWltLWNvbnRhaW5lciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJyZXdhcmQtaW5mbyI+CiAgICAgICAgICAgIDxoMz7wn5KwIFJlZnVuZGFibGUgUmV3YXJkIEZvdW5kITwvaDM+CiAgICAgICAgICAgIDxwPkFtb3VudDogJHtyZXdhcmREYXRhLmFjdHVhbFJld2FyZH0gc2F0b3NoaXM8L3A+CiAgICAgICAgICAgIDxwPkFkZHJlc3M6ICR7cmV3YXJkRGF0YS5yZXdhcmRBZGRyZXNzfTwvcD4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IiBpZD0icmVmdW5kQnV0dG9uIj5SZWZ1bmQgUmV3YXJkPC9idXR0b24+CiAgICAgICAgICAgIDxkaXYgaWQ9InJlZnVuZFN0YXR1cyI+PC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgYDsKCiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWZ1bmRCdXR0b24nKS5vbmNsaWNrID0gKCkgPT4gdGhpcy5oYW5kbGVSZWZ1bmQodHhpZCwgcmV3YXJkRGF0YSk7CgogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgY2hlY2tpbmcgcmVmdW5kYWJsZSByZXdhcmQ6JywgZXJyb3IpOwogICAgICByZXdhcmRDb250YWluZXIuaW5uZXJIVE1MID0gYAogICAgICAgIDxkaXYgY2xhc3M9InJld2FyZC1jbGFpbS1jb250YWluZXIiPgogICAgICAgICAgPGRpdiBjbGFzcz0iZXJyb3ItbWVzc2FnZSI+CiAgICAgICAgICAgIEVycm9yIGNoZWNraW5nIHJlZnVuZGFibGUgcmV3YXJkOiAke2Vycm9yLm1lc3NhZ2V9CiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBidG4tcHJpbWFyeSIgb25jbGljaz0id2luZG93Lm1lc3NhZ2VIYW5kbGVyLmNoZWNrQW5kU2hvd1JlZnVuZE9wdGlvbigke0pTT04uc3RyaW5naWZ5KHR4aWQpfSkiPgogICAgICAgICAgICAgIFRyeSBBZ2FpbgogICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICBgOwogICAgfQogIH0KCiAgYXN5bmMgY2xhaW1SZXdhcmQodHhpZCwgcmV3YXJkRGF0YSkgewogICAgY29uc3Qgc3RhdHVzRGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsYWltU3RhdHVzJyk7CiAgICBjb25zdCBjbGFpbUJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbGFpbUJ1dHRvbicpOwogICAgCiAgICB0cnkgewogICAgICBpZiAoIXR4aWQgfHwgIXJld2FyZERhdGE/LmFtb3VudCB8fCAhcmV3YXJkRGF0YT8ucmV3YXJkUHJpdmF0ZUtleVdJRikgewogICAgICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXF1aXJlZCByZXdhcmQgZGF0YSIpOwogICAgICB9CgogICAgICBjb25zdCByZWNpcGllbnRBZGRyZXNzID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oIndhbGxldEFkZHJlc3MiKTsKICAgICAgaWYgKCFyZWNpcGllbnRBZGRyZXNzKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJQbGVhc2UgcmVzdG9yZSB5b3VyIHdhbGxldCBmaXJzdCIpOwogICAgICB9CgogICAgICBjbGFpbUJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7CiAgICAgIGNsYWltQnV0dG9uLnRleHRDb250ZW50ID0gJ0NsYWltaW5nLi4uJzsKICAgICAgc3RhdHVzRGl2LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPSJsb2FkaW5nIj5Qcm9jZXNzaW5nIGNsYWltLi4uPC9kaXY+JzsKICAgICAgCiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdpbmRvdy5jbGFpbVJld2FyZCgKICAgICAgICB0eGlkLAogICAgICAgIDEsCiAgICAgICAgcmV3YXJkRGF0YS5hbW91bnQsCiAgICAgICAgcmV3YXJkRGF0YS5yZXdhcmRQcml2YXRlS2V5V0lGLAogICAgICAgIHJlY2lwaWVudEFkZHJlc3MKICAgICAgKTsKCiAgICAgIHN0YXR1c0Rpdi5pbm5lckhUTUwgPSBgCiAgICAgICAgPGRpdiBjbGFzcz0ic3VjY2Vzcy1tZXNzYWdlIj4KICAgICAgICAgIOKchSBSZXdhcmQgY2xhaW1lZCBzdWNjZXNzZnVsbHkhPGJyPgogICAgICAgICAgVHJhbnNhY3Rpb24gSUQ6ICR7cmVzdWx0fQogICAgICAgIDwvZGl2PgogICAgICBgOwogICAgICAKICAgICAgY2xhaW1CdXR0b24uc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgYXdhaXQgd2luZG93LnJlZnJlc2hJbmJveD8uKCk7CgogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgY29uc29sZS5lcnJvcignQ2xhaW0gZXJyb3I6JywgZXJyb3IpOwogICAgICBzdGF0dXNEaXYuaW5uZXJIVE1MID0gYAogICAgICAgIDxkaXYgY2xhc3M9ImVycm9yLW1lc3NhZ2UiPgogICAgICAgICAg4p2MIEZhaWxlZCB0byBjbGFpbSByZXdhcmQ6ICR7ZXJyb3IubWVzc2FnZX0KICAgICAgICA8L2Rpdj4KICAgICAgYDsKICAgICAgY2xhaW1CdXR0b24uZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgY2xhaW1CdXR0b24udGV4dENvbnRlbnQgPSAnVHJ5IEFnYWluJzsKICAgIH0KICB9CgogIGFzeW5jIGhhbmRsZVJlZnVuZCh0eGlkLCByZXdhcmREYXRhKSB7CiAgICBjb25zdCBzdGF0dXNEaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVmdW5kU3RhdHVzJyk7CiAgICBjb25zdCByZWZ1bmRCdXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVmdW5kQnV0dG9uJyk7CiAgICAKICAgIHRyeSB7CiAgICAgIGNvbnN0IHNlbmRlclByaXZhdGVLZXkgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgicHJpdmF0ZUtleSIpOwogICAgICBpZiAoIXNlbmRlclByaXZhdGVLZXkpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlBsZWFzZSByZXN0b3JlIHlvdXIgd2FsbGV0IGZpcnN0Iik7CiAgICAgIH0KCiAgICAgIHJlZnVuZEJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7CiAgICAgIHJlZnVuZEJ1dHRvbi50ZXh0Q29udGVudCA9ICdSZWZ1bmRpbmcuLi4nOwogICAgICBzdGF0dXNEaXYuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9ImxvYWRpbmciPlByb2Nlc3NpbmcgcmVmdW5kLi4uPC9kaXY+JzsKCiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdpbmRvdy5yZWZ1bmRSZXdhcmQoCiAgICAgICAgdHhpZCwKICAgICAgICAxLAogICAgICAgIHJld2FyZERhdGEuYW1vdW50LAogICAgICAgIHJld2FyZERhdGEucmV3YXJkUHJpdmF0ZUtleVdJRiwKICAgICAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgid2FsbGV0QWRkcmVzcyIpCiAgICAgICk7CgogICAgICBzdGF0dXNEaXYuaW5uZXJIVE1MID0gYAogICAgICAgIDxkaXYgY2xhc3M9InN1Y2Nlc3MtbWVzc2FnZSI+CiAgICAgICAgICDinIUgUmV3YXJkIHJlZnVuZGVkIHN1Y2Nlc3NmdWxseSE8YnI+CiAgICAgICAgICBUcmFuc2FjdGlvbiBJRDogJHtyZXN1bHR9CiAgICAgICAgPC9kaXY+CiAgICAgIGA7CiAgICAgIAogICAgICByZWZ1bmRCdXR0b24uc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgYXdhaXQgd2luZG93LnJlZnJlc2hJbmJveD8uKCk7CgogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgY29uc29sZS5lcnJvcignUmVmdW5kIGVycm9yOicsIGVycm9yKTsKICAgICAgc3RhdHVzRGl2LmlubmVySFRNTCA9IGAKICAgICAgICA8ZGl2IGNsYXNzPSJlcnJvci1tZXNzYWdlIj4KICAgICAgICAgIOKdjCBGYWlsZWQgdG8gcmVmdW5kIHJld2FyZDogJHtlcnJvci5tZXNzYWdlfQogICAgICAgIDwvZGl2PgogICAgICBgOwogICAgICByZWZ1bmRCdXR0b24uZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgcmVmdW5kQnV0dG9uLnRleHRDb250ZW50ID0gJ1RyeSBBZ2Fpbic7CiAgICB9CiAgfQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIFV0aWxpdHkgTWV0aG9kcwogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgdG9nZ2xlU2hhcmVEcm9wZG93bihldmVudCkgewogICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICBjb25zdCBtZW51ID0gZXZlbnQudGFyZ2V0Lm5leHRFbGVtZW50U2libGluZzsKICAgIG1lbnUuc3R5bGUuZGlzcGxheSA9IG1lbnUuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnID8gJ2Jsb2NrJyA6ICdub25lJzsKICB9CgogIGNyZWF0ZU1haWx0b0xpbmsodHhpZCwgY29udGVudCwgdHlwZSkgewogICAgY29uc3Qgc3ViamVjdCA9IGBCU1YgTWVzc2FnZTogJHt0eGlkfWA7CiAgICBjb25zdCBib2R5ID0gdHlwZS5zdGFydHNXaXRoKCdpbWFnZS8nKSB8fCB0eXBlLnN0YXJ0c1dpdGgoJ3ZpZGVvLycpIHx8IHR5cGUuc3RhcnRzV2l0aCgnYXVkaW8vJykgCiAgICAgID8gYEJsb2NrY2hhaW4gVHJhbnNhY3Rpb24gSUQ6ICR7dHhpZH1cblxuVGhpcyBtZXNzYWdlIGNvbnRhaW5zICR7dHlwZX0gY29udGVudCB3aGljaCBjYW4gYmUgdmlld2VkIGF0OlxuaHR0cHM6Ly93aGF0c29uY2hhaW4uY29tL3R4LyR7dHhpZH1gCiAgICAgIDogYEJsb2NrY2hhaW4gVHJhbnNhY3Rpb24gSUQ6ICR7dHhpZH1cblxuTWVzc2FnZSBDb250ZW50OlxuJHtjb250ZW50fVxuXG5WaWV3IG9uIGJsb2NrY2hhaW46XG5odHRwczovL3doYXRzb25jaGFpbi5jb20vdHgvJHt0eGlkfWA7CgogICAgcmV0dXJuIHsKICAgICAgbWFpbHRvOiBgbWFpbHRvOj9zdWJqZWN0PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHN1YmplY3QpfSZib2R5PSR7ZW5jb2RlVVJJQ29tcG9uZW50KGJvZHkpfWAsCiAgICAgIGdtYWlsOiBgaHR0cHM6Ly9tYWlsLmdvb2dsZS5jb20vbWFpbC8/dmlldz1jbSZmcz0xJnRvPSZzdT0ke2VuY29kZVVSSUNvbXBvbmVudChzdWJqZWN0KX0mYm9keT0ke2VuY29kZVVSSUNvbXBvbmVudChib2R5KX1gLAogICAgICBvdXRsb29rOiBgaHR0cHM6Ly9vdXRsb29rLmxpdmUuY29tL21haWwvMC9kZWVwbGluay9jb21wb3NlP3N1YmplY3Q9JHtlbmNvZGVVUklDb21wb25lbnQoc3ViamVjdCl9JmJvZHk9JHtlbmNvZGVVUklDb21wb25lbnQoYm9keSl9YCwKICAgICAgeWFob286IGBodHRwOi8vY29tcG9zZS5tYWlsLnlhaG9vLmNvbS8/c3ViamVjdD0ke2VuY29kZVVSSUNvbXBvbmVudChzdWJqZWN0KX0mYm9keT0ke2VuY29kZVVSSUNvbXBvbmVudChib2R5KX1gLAogICAgICBjb250ZW50OiBib2R5CiAgICB9OwogIH0KCiAgY29weVRvQ2xpcGJvYXJkKHRleHQpIHsKICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRleHQpCiAgICAgIC50aGVuKCgpID0+IGFsZXJ0KCdTaGFyZSBsaW5rIGNvcGllZCB0byBjbGlwYm9hcmQhJykpCiAgICAgIC5jYXRjaChlcnJvciA9PiBhbGVydCgnRmFpbGVkIHRvIGNvcHkgbGluazogJyArIGVycm9yLm1lc3NhZ2UpKTsKICB9CgogIGZvcm1hdENvbnRlbnQoY29udGVudCkgewogICAgdHJ5IHsKICAgICAgaWYgKGNvbnRlbnQudHlwZS5zdGFydHNXaXRoKCdpbWFnZS8nKSkgewogICAgICAgIHJldHVybiBgPGRpdiBzdHlsZT0ibWF4LXdpZHRoOiAxMDAlOyB0ZXh0LWFsaWduOiBjZW50ZXI7Ij4KICAgICAgICAgICAgICAgICAgPGltZyBzcmM9ImRhdGE6JHtjb250ZW50LnR5cGV9O2Jhc2U2NCwke2NvbnRlbnQuZGF0YX0iIGFsdD0iTWVzc2FnZSBJbWFnZSIgb25lcnJvcj0iY29uc29sZS5lcnJvcignSW1hZ2UgbG9hZCBmYWlsZWQ6JywgdGhpcy5zcmMpIiAvPgogICAgICAgICAgICAgICAgPC9kaXY+YDsKICAgICAgfQogICAgICAKICAgICAgaWYgKGNvbnRlbnQudHlwZS5zdGFydHNXaXRoKCd2aWRlby8nKSkgewogICAgICAgIHJldHVybiBgPGRpdiBzdHlsZT0ibWF4LXdpZHRoOiAxMDAlOyB0ZXh0LWFsaWduOiBjZW50ZXI7Ij4KICAgICAgICAgICAgICAgICAgPHZpZGVvIGNvbnRyb2xzIHN0eWxlPSJtYXgtd2lkdGg6IDEwMCU7IGhlaWdodDogYXV0bzsiIG9uZXJyb3I9ImNvbnNvbGUuZXJyb3IoJ1ZpZGVvIGxvYWQgZmFpbGVkJykiPgogICAgICAgICAgICAgICAgICAgIDxzb3VyY2Ugc3JjPSJkYXRhOiR7Y29udGVudC50eXBlfTtiYXNlNjQsJHtjb250ZW50LmRhdGF9IiB0eXBlPSIke2NvbnRlbnQudHlwZX0iPgogICAgICAgICAgICAgICAgICAgIFlvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHZpZGVvIHBsYXliYWNrLgogICAgICAgICAgICAgICAgICA8L3ZpZGVvPgogICAgICAgICAgICAgICAgPC9kaXY+YDsKICAgICAgfQogICAgICAKICAgICAgaWYgKGNvbnRlbnQudHlwZS5zdGFydHNXaXRoKCdhdWRpby8nKSkgewogICAgICAgIHJldHVybiBgPGRpdiBzdHlsZT0id2lkdGg6IDEwMCU7IHBhZGRpbmc6IDIwcHggMDsiPgogICAgICAgICAgICAgICAgICA8YXVkaW8gY29udHJvbHMgc3R5bGU9IndpZHRoOiAxMDAlOyIgb25lcnJvcj0iY29uc29sZS5lcnJvcignQXVkaW8gbG9hZCBmYWlsZWQnKSI+CiAgICAgICAgICAgICAgICAgICAgPHNvdXJjZSBzcmM9ImRhdGE6JHtjb250ZW50LnR5cGV9O2Jhc2U2NCwke2NvbnRlbnQuZGF0YX0iIHR5cGU9IiR7Y29udGVudC50eXBlfSI+CiAgICAgICAgICAgICAgICAgICAgWW91ciBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgYXVkaW8gcGxheWJhY2suCiAgICAgICAgICAgICAgICAgIDwvYXVkaW8+CiAgICAgICAgICAgICAgICA8L2Rpdj5gOwogICAgICB9CiAgICAgIAogICAgICBpZiAoY29udGVudC50eXBlID09PSAndGV4dC9odG1sJykgewogICAgICAgIHJldHVybiBgPGlmcmFtZSBjbGFzcz0iaWZyYW1lLWNvbnRhaW5lciIgc2FuZGJveD0iYWxsb3ctc2NyaXB0cyBhbGxvdy1zYW1lLW9yaWdpbiIgc3JjZG9jPSIke2NvbnRlbnQuZGF0YS5yZXBsYWNlKC8iL2csICcmcXVvdDsnKX0iPjwvaWZyYW1lPmA7CiAgICAgIH0KICAgICAgCiAgICAgIGlmIChjb250ZW50LnR5cGUgPT09ICdhcHBsaWNhdGlvbi9wZGYnKSB7CiAgICAgICAgcmV0dXJuIGA8aWZyYW1lIGNsYXNzPSJpZnJhbWUtY29udGFpbmVyIiBzcmM9ImRhdGE6JHtjb250ZW50LnR5cGV9O2Jhc2U2NCwke2NvbnRlbnQuZGF0YX0iPjwvaWZyYW1lPmA7CiAgICAgIH0KICAgICAgCiAgICAgIGlmIChjb250ZW50LnR5cGUuc3RhcnRzV2l0aCgndGV4dC8nKSkgewogICAgICAgIGNvbnN0IHRleHQgPSBjb250ZW50LmRhdGEKICAgICAgICAgIC5yZXBsYWNlKC8mL2csICcmYW1wOycpCiAgICAgICAgICAucmVwbGFjZSgvPC9nLCAnJmx0OycpCiAgICAgICAgICAucmVwbGFjZSgvPi9nLCAnJmd0OycpCiAgICAgICAgICAucmVwbGFjZSgvIi9nLCAnJnF1b3Q7JykKICAgICAgICAgIC5yZXBsYWNlKC8nL2csICcmIzAzOTsnKQogICAgICAgICAgLnJlcGxhY2UoLyhodHRwcz86XC9cL1teXHNdKykvZywgJzxhIGhyZWY9IiQxIiB0YXJnZXQ9Il9ibGFuayI+JDE8L2E+Jyk7CiAgICAgICAgcmV0dXJuIGA8cHJlPiR7dGV4dH08L3ByZT5gOwogICAgICB9CiAgICAgIAogICAgICByZXR1cm4gYDxwcmU+JHtjb250ZW50LmRhdGF9PC9wcmU+YDsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoJ0NvbnRlbnQgZm9ybWF0dGluZyBlcnJvcjonLCBlcnJvcik7CiAgICAgIHJldHVybiBgPGRpdiBjbGFzcz0iZXJyb3ItbWVzc2FnZSI+RXJyb3IgZGlzcGxheWluZyBjb250ZW50OiAke2Vycm9yLm1lc3NhZ2V9PC9kaXY+YDsKICAgIH0KICB9Cn0KCi8vIEdsb2JhbCB3cmFwcGVyIGZ1bmN0aW9ucyBmb3IgZWFzZSBvZiBhY2Nlc3MKZnVuY3Rpb24gc2hvd1NlbnRNZXNzYWdlKHR4aWQpIHsKICB3aW5kb3cubWVzc2FnZUhhbmRsZXIub3Blbk1lc3NhZ2UodHhpZCk7Cn0KCmZ1bmN0aW9uIHNob3dTZW50KCkgewogIHdpbmRvdy5tZXNzYWdlSGFuZGxlci51cGRhdGVTZW50Rm9sZGVyKCk7Cn0KCi8vIEluaXRpYWxpemUgdGhlIE1lc3NhZ2VIYW5kbGVyCndpbmRvdy5tZXNzYWdlSGFuZGxlciA9IG5ldyBNZXNzYWdlSGFuZGxlcigpOwoK"}]}
https://whatsonchain.com/tx/0db1a4af1ccd79d6cc9db12d26a53e5748a4205c19d6c7cfa58a0c714a2c842e