Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 海阔视界规则分享,当前分享的是:网页插件¥js_url¥global_秒传链接提取@base64://Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUg56eS5Lyg6ZO+5o6l5o+Q5Y+WCi8vIEB2ZXJzaW9uIDIuNS4yCi8vIEBhdXRob3IgbWVuZ3pvbmVmaXJlCi8vIEBkZXNjcmlwdGlvbiDnlKjkuo7mj5Dlj5blkoznlJ/miJDnmb7luqbnvZHnm5jnp5LkvKDpk77mjqUKLy8gQGhvbWVwYWdlIGh0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvemgtQ04vc2NyaXB0cy80MjQ1NzQKLy8gQHN1cHBvcnRVUkwgaHR0cHM6Ly9naXRodWIuY29tL21lbmd6b25lZmlyZS9yYXBpZC11cGxvYWQtdXNlcnNjcmlwdC9pc3N1ZXMKLy8gQG1hdGNoICo6Ly9wYW4uYmFpZHUuY29tL2Rpc2svaG9tZSoKLy8gQG1hdGNoICo6Ly9wYW4uYmFpZHUuY29tL2Rpc2svbWFpbioKLy8gQG1hdGNoICo6Ly95dW4uYmFpZHUuY29tL2Rpc2svaG9tZSoKLy8gQG1hdGNoICo6Ly95dW4uYmFpZHUuY29tL2Rpc2svbWFpbioKLy8gQG1hdGNoICo6Ly93YW5ncGFuLmJhaWR1LmNvbS9kaXNrL2hvbWUqCi8vIEBtYXRjaCAqOi8vd2FuZ3Bhbi5iYWlkdS5jb20vZGlzay9tYWluKgovLyBAbmFtZTplbiByYXBpZHVwbG9hZC11c2Vyc2NyaXB0Ci8vIEBsaWNlbnNlIEdQTHYzCi8vIEBpY29uIGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUJCVWxFUVZSNEFaVFRKUkJVVVJUSDRUdER3WHVQZFByZ2JoSFhpa3NmM0NQdWNSTlNjSGQzZDNkM3VPOWJLZXU3Yjc5K2Z1bjhRMTdDTkh5TU1VcWFpUEU0ZkV5WVZqakdOS25Od1E0bHBnVjhsTWFuRWZ3Zm9zTEhFR1BVMU4zWm5BdjRxbFQrTmlRNTZ1UFdTaktCcnp0VVNuSWFCNjZzWTF2Z3hneG9NWEI1TmJzQ0I5cnhjQjVmTjJNNS8xNm5DRnhlUzZZVGV6cHpzQjFQdS9DMk83Lzc4Lzk5ZVlCWUhYaCtncWRIT2JHSUs0R0hnZXZqVkl0MUFnQW5odkU0Y0dlOGV1b0hiaXpnWXVEMlJHZ3g4TzBScHdJUFJtc21KREdxY3JBTmQzcExvL3FWcjAzaFVsY3BmU3dmMC92RDNKd2tQZFBLNS96aGtPeisvZjFGSUR2L1Jjbk9BRWp5d0gvRGhnQURBQUFBQUVsRlRrU3VRbUNDCi8vIEBuYW1lc3BhY2UgbW9lLmNhbmdrdS5tZW5nem9uZWZpcmUKLy8gQGhvbWVwYWdlVVJMIGh0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvemgtQ04vc2NyaXB0cy80MjQ1NzQKLy8gQGNvbnRyaWJ1dGlvblVSTCBodHRwczovL2FmZGlhbi5uZXQvQG1lbmd6b25lZmlyZQovLyBAZGVzY3JpcHRpb246ZW4gaW5wdXQgYmRsaW5rIHRvIGdldCBmaWxlcyBvciBnZXQgYmRsaW5rIGZvciBCYWlkdeKEoiBXZWJEaXNrLgovLyBAY29tcGF0aWJsZSBmaXJlZm94IFZpb2xlbnRtb25rZXkKLy8gQGNvbXBhdGlibGUgZmlyZWZveCBUYW1wZXJtb25rZXkKLy8gQGNvbXBhdGlibGUgY2hyb21lIFZpb2xlbnRtb25rZXkKLy8gQGNvbXBhdGlibGUgY2hyb21lIFRhbXBlcm1vbmtleQovLyBAY29tcGF0aWJsZSBlZGdlIFZpb2xlbnRtb25rZXkKLy8gQGNvbXBhdGlibGUgZWRnZSBUYW1wZXJtb25rZXkKLy8gQGdyYW50IEdNX3NldFZhbHVlCi8vIEBncmFudCBHTV9nZXRWYWx1ZQovLyBAZ3JhbnQgR01fZGVsZXRlVmFsdWUKLy8gQGdyYW50IEdNX3NldENsaXBib2FyZAovLyBAZ3JhbnQgR01fZ2V0UmVzb3VyY2VUZXh0Ci8vIEBncmFudCBHTV9hZGRTdHlsZQovLyBAZ3JhbnQgR01feG1saHR0cFJlcXVlc3QKLy8gQGdyYW50IHVuc2FmZVdpbmRvdwovLyBAcnVuLWF0IGRvY3VtZW50LWJvZHkKLy8gQGNvbm5lY3QgYmFpZHUuY29tCi8vIEBjb25uZWN0IGJhaWR1cGNzLmNvbQovLyBAY29ubmVjdCBjZG4uanNkZWxpdnIubmV0Ci8vIEBjb25uZWN0ICoKLy8gPT0vVXNlclNjcmlwdD09CgovKioqKioqLyAoKCkgPT4geyAvLyB3ZWJwYWNrQm9vdHN0cmFwCi8qKioqKiovIAl2YXIgX193ZWJwYWNrX21vZHVsZXNfXyA9ICh7CgovKioqLyAzMjI6Ci8qKiovICgobW9kdWxlKSA9PiB7CgooZnVuY3Rpb24gKGZhY3RvcnkpIHsKICAgIGlmICh0cnVlKSB7CiAgICAgICAgLy8gTm9kZS9Db21tb25KUwogICAgICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpOwogICAgfSBlbHNlIHsgdmFyIGdsb2I7IH0KfShmdW5jdGlvbiAodW5kZWZpbmVkKSB7CgogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8qCiAgICAgKiBGYXN0ZXN0IG1kNSBpbXBsZW1lbnRhdGlvbiBhcm91bmQgKEpLTSBtZDUpLgogICAgICogQ3JlZGl0czogSm9zZXBoIE15ZXJzCiAgICAgKgogICAgICogQHNlZSBodHRwOi8vd3d3Lm15ZXJzZGFpbHkub3JnL2pvc2VwaC9qYXZhc2NyaXB0L21kNS10ZXh0Lmh0bWwKICAgICAqIEBzZWUgaHR0cDovL2pzcGVyZi5jb20vbWQ1LXNob290b3V0LzcKICAgICAqLwoKICAgIC8qIHRoaXMgZnVuY3Rpb24gaXMgbXVjaCBmYXN0ZXIsCiAgICAgIHNvIGlmIHBvc3NpYmxlIHdlIHVzZSBpdC4gU29tZSBJRXMKICAgICAgYXJlIHRoZSBvbmx5IG9uZXMgSSBrbm93IG9mIHRoYXQKICAgICAgbmVlZCB0aGUgaWRpb3RpYyBzZWNvbmQgZnVuY3Rpb24sCiAgICAgIGdlbmVyYXRlZCBieSBhbiBpZiBjbGF1c2UuICAqLwogICAgdmFyIGFkZDMyID0gZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgICByZXR1cm4gKGEgKyBiKSAmIDB4RkZGRkZGRkY7CiAgICB9LAogICAgICAgIGhleF9jaHIgPSBbJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLCAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnXTsKCgogICAgZnVuY3Rpb24gY21uKHEsIGEsIGIsIHgsIHMsIHQpIHsKICAgICAgICBhID0gYWRkMzIoYWRkMzIoYSwgcSksIGFkZDMyKHgsIHQpKTsKICAgICAgICByZXR1cm4gYWRkMzIoKGEgPDwgcykgfCAoYSA+Pj4gKDMyIC0gcykpLCBiKTsKICAgIH0KCiAgICBmdW5jdGlvbiBtZDVjeWNsZSh4LCBrKSB7CiAgICAgICAgdmFyIGEgPSB4WzBdLAogICAgICAgICAgICBiID0geFsxXSwKICAgICAgICAgICAgYyA9IHhbMl0sCiAgICAgICAgICAgIGQgPSB4WzNdOwoKICAgICAgICBhICs9IChiICYgYyB8IH5iICYgZCkgKyBrWzBdIC0gNjgwODc2OTM2IHwgMDsKICAgICAgICBhICA9IChhIDw8IDcgfCBhID4+PiAyNSkgKyBiIHwgMDsKICAgICAgICBkICs9IChhICYgYiB8IH5hICYgYykgKyBrWzFdIC0gMzg5NTY0NTg2IHwgMDsKICAgICAgICBkICA9IChkIDw8IDEyIHwgZCA+Pj4gMjApICsgYSB8IDA7CiAgICAgICAgYyArPSAoZCAmIGEgfCB+ZCAmIGIpICsga1syXSArIDYwNjEwNTgxOSB8IDA7CiAgICAgICAgYyAgPSAoYyA8PCAxNyB8IGMgPj4+IDE1KSArIGQgfCAwOwogICAgICAgIGIgKz0gKGMgJiBkIHwgfmMgJiBhKSArIGtbM10gLSAxMDQ0NTI1MzMwIHwgMDsKICAgICAgICBiICA9IChiIDw8IDIyIHwgYiA+Pj4gMTApICsgYyB8IDA7CiAgICAgICAgYSArPSAoYiAmIGMgfCB+YiAmIGQpICsga1s0XSAtIDE3NjQxODg5NyB8IDA7CiAgICAgICAgYSAgPSAoYSA8PCA3IHwgYSA+Pj4gMjUpICsgYiB8IDA7CiAgICAgICAgZCArPSAoYSAmIGIgfCB+YSAmIGMpICsga1s1XSArIDEyMDAwODA0MjYgfCAwOwogICAgICAgIGQgID0gKGQgPDwgMTIgfCBkID4+PiAyMCkgKyBhIHwgMDsKICAgICAgICBjICs9IChkICYgYSB8IH5kICYgYikgKyBrWzZdIC0gMTQ3MzIzMTM0MSB8IDA7CiAgICAgICAgYyAgPSAoYyA8PCAxNyB8IGMgPj4+IDE1KSArIGQgfCAwOwogICAgICAgIGIgKz0gKGMgJiBkIHwgfmMgJiBhKSArIGtbN10gLSA0NTcwNTk4MyB8IDA7CiAgICAgICAgYiAgPSAoYiA8PCAyMiB8IGIgPj4+IDEwKSArIGMgfCAwOwogICAgICAgIGEgKz0gKGIgJiBjIHwgfmIgJiBkKSArIGtbOF0gKyAxNzcwMDM1NDE2IHwgMDsKICAgICAgICBhICA9IChhIDw8IDcgfCBhID4+PiAyNSkgKyBiIHwgMDsKICAgICAgICBkICs9IChhICYgYiB8IH5hICYgYykgKyBrWzldIC0gMTk1ODQxNDQxNyB8IDA7CiAgICAgICAgZCAgPSAoZCA8PCAxMiB8IGQgPj4+IDIwKSArIGEgfCAwOwogICAgICAgIGMgKz0gKGQgJiBhIHwgfmQgJiBiKSArIGtbMTBdIC0gNDIwNjMgfCAwOwogICAgICAgIGMgID0gKGMgPDwgMTcgfCBjID4+PiAxNSkgKyBkIHwgMDsKICAgICAgICBiICs9IChjICYgZCB8IH5jICYgYSkgKyBrWzExXSAtIDE5OTA0MDQxNjIgfCAwOwogICAgICAgIGIgID0gKGIgPDwgMjIgfCBiID4+PiAxMCkgKyBjIHwgMDsKICAgICAgICBhICs9IChiICYgYyB8IH5iICYgZCkgKyBrWzEyXSArIDE4MDQ2MDM2ODIgfCAwOwogICAgICAgIGEgID0gKGEgPDwgNyB8IGEgPj4+IDI1KSArIGIgfCAwOwogICAgICAgIGQgKz0gKGEgJiBiIHwgfmEgJiBjKSArIGtbMTNdIC0gNDAzNDExMDEgfCAwOwogICAgICAgIGQgID0gKGQgPDwgMTIgfCBkID4+PiAyMCkgKyBhIHwgMDsKICAgICAgICBjICs9IChkICYgYSB8IH5kICYgYikgKyBrWzE0XSAtIDE1MDIwMDIyOTAgfCAwOwogICAgICAgIGMgID0gKGMgPDwgMTcgfCBjID4+PiAxNSkgKyBkIHwgMDsKICAgICAgICBiICs9IChjICYgZCB8IH5jICYgYSkgKyBrWzE1XSArIDEyMzY1MzUzMjkgfCAwOwogICAgICAgIGIgID0gKGIgPDwgMjIgfCBiID4+PiAxMCkgKyBjIHwgMDsKCiAgICAgICAgYSArPSAoYiAmIGQgfCBjICYgfmQpICsga1sxXSAtIDE2NTc5NjUxMCB8IDA7CiAgICAgICAgYSAgPSAoYSA8PCA1IHwgYSA+Pj4gMjcpICsgYiB8IDA7CiAgICAgICAgZCArPSAoYSAmIGMgfCBiICYgfmMpICsga1s2XSAtIDEwNjk1MDE2MzIgfCAwOwogICAgICAgIGQgID0gKGQgPDwgOSB8IGQgPj4+IDIzKSArIGEgfCAwOwogICAgICAgIGMgKz0gKGQgJiBiIHwgYSAmIH5iKSArIGtbMTFdICsgNjQzNzE3NzEzIHwgMDsKICAgICAgICBjICA9IChjIDw8IDE0IHwgYyA+Pj4gMTgpICsgZCB8IDA7CiAgICAgICAgYiArPSAoYyAmIGEgfCBkICYgfmEpICsga1swXSAtIDM3Mzg5NzMwMiB8IDA7CiAgICAgICAgYiAgPSAoYiA8PCAyMCB8IGIgPj4+IDEyKSArIGMgfCAwOwogICAgICAgIGEgKz0gKGIgJiBkIHwgYyAmIH5kKSArIGtbNV0gLSA3MDE1NTg2OTEgfCAwOwogICAgICAgIGEgID0gKGEgPDwgNSB8IGEgPj4+IDI3KSArIGIgfCAwOwogICAgICAgIGQgKz0gKGEgJiBjIHwgYiAmIH5jKSArIGtbMTBdICsgMzgwMTYwODMgfCAwOwogICAgICAgIGQgID0gKGQgPDwgOSB8IGQgPj4+IDIzKSArIGEgfCAwOwogICAgICAgIGMgKz0gKGQgJiBiIHwgYSAmIH5iKSArIGtbMTVdIC0gNjYwNDc4MzM1IHwgMDsKICAgICAgICBjICA9IChjIDw8IDE0IHwgYyA+Pj4gMTgpICsgZCB8IDA7CiAgICAgICAgYiArPSAoYyAmIGEgfCBkICYgfmEpICsga1s0XSAtIDQwNTUzNzg0OCB8IDA7CiAgICAgICAgYiAgPSAoYiA8PCAyMCB8IGIgPj4+IDEyKSArIGMgfCAwOwogICAgICAgIGEgKz0gKGIgJiBkIHwgYyAmIH5kKSArIGtbOV0gKyA1Njg0NDY0MzggfCAwOwogICAgICAgIGEgID0gKGEgPDwgNSB8IGEgPj4+IDI3KSArIGIgfCAwOwogICAgICAgIGQgKz0gKGEgJiBjIHwgYiAmIH5jKSArIGtbMTRdIC0gMTAxOTgwMzY5MCB8IDA7CiAgICAgICAgZCAgPSAoZCA8PCA5IHwgZCA+Pj4gMjMpICsgYSB8IDA7CiAgICAgICAgYyArPSAoZCAmIGIgfCBhICYgfmIpICsga1szXSAtIDE4NzM2Mzk2MSB8IDA7CiAgICAgICAgYyAgPSAoYyA8PCAxNCB8IGMgPj4+IDE4KSArIGQgfCAwOwogICAgICAgIGIgKz0gKGMgJiBhIHwgZCAmIH5hKSArIGtbOF0gKyAxMTYzNTMxNTAxIHwgMDsKICAgICAgICBiICA9IChiIDw8IDIwIHwgYiA+Pj4gMTIpICsgYyB8IDA7CiAgICAgICAgYSArPSAoYiAmIGQgfCBjICYgfmQpICsga1sxM10gLSAxNDQ0NjgxNDY3IHwgMDsKICAgICAgICBhICA9IChhIDw8IDUgfCBhID4+PiAyNykgKyBiIHwgMDsKICAgICAgICBkICs9IChhICYgYyB8IGIgJiB+YykgKyBrWzJdIC0gNTE0MDM3ODQgfCAwOwogICAgICAgIGQgID0gKGQgPDwgOSB8IGQgPj4+IDIzKSArIGEgfCAwOwogICAgICAgIGMgKz0gKGQgJiBiIHwgYSAmIH5iKSArIGtbN10gKyAxNzM1MzI4NDczIHwgMDsKICAgICAgICBjICA9IChjIDw8IDE0IHwgYyA+Pj4gMTgpICsgZCB8IDA7CiAgICAgICAgYiArPSAoYyAmIGEgfCBkICYgfmEpICsga1sxMl0gLSAxOTI2NjA3NzM0IHwgMDsKICAgICAgICBiICA9IChiIDw8IDIwIHwgYiA+Pj4gMTIpICsgYyB8IDA7CgogICAgICAgIGEgKz0gKGIgXiBjIF4gZCkgKyBrWzVdIC0gMzc4NTU4IHwgMDsKICAgICAgICBhICA9IChhIDw8IDQgfCBhID4+PiAyOCkgKyBiIHwgMDsKICAgICAgICBkICs9IChhIF4gYiBeIGMpICsga1s4XSAtIDIwMjI1NzQ0NjMgfCAwOwogICAgICAgIGQgID0gKGQgPDwgMTEgfCBkID4+PiAyMSkgKyBhIHwgMDsKICAgICAgICBjICs9IChkIF4gYSBeIGIpICsga1sxMV0gKyAxODM5MDMwNTYyIHwgMDsKICAgICAgICBjICA9IChjIDw8IDE2IHwgYyA+Pj4gMTYpICsgZCB8IDA7CiAgICAgICAgYiArPSAoYyBeIGQgXiBhKSArIGtbMTRdIC0gMzUzMDk1NTYgfCAwOwogICAgICAgIGIgID0gKGIgPDwgMjMgfCBiID4+PiA5KSArIGMgfCAwOwogICAgICAgIGEgKz0gKGIgXiBjIF4gZCkgKyBrWzFdIC0gMTUzMDk5MjA2MCB8IDA7CiAgICAgICAgYSAgPSAoYSA8PCA0IHwgYSA+Pj4gMjgpICsgYiB8IDA7CiAgICAgICAgZCArPSAoYSBeIGIgXiBjKSArIGtbNF0gKyAxMjcyODkzMzUzIHwgMDsKICAgICAgICBkICA9IChkIDw8IDExIHwgZCA+Pj4gMjEpICsgYSB8IDA7CiAgICAgICAgYyArPSAoZCBeIGEgXiBiKSArIGtbN10gLSAxNTU0OTc2MzIgfCAwOwogICAgICAgIGMgID0gKGMgPDwgMTYgfCBjID4+PiAxNikgKyBkIHwgMDsKICAgICAgICBiICs9IChjIF4gZCBeIGEpICsga1sxMF0gLSAxMDk0NzMwNjQwIHwgMDsKICAgICAgICBiICA9IChiIDw8IDIzIHwgYiA+Pj4gOSkgKyBjIHwgMDsKICAgICAgICBhICs9IChiIF4gYyBeIGQpICsga1sxM10gKyA2ODEyNzkxNzQgfCAwOwogICAgICAgIGEgID0gKGEgPDwgNCB8IGEgPj4+IDI4KSArIGIgfCAwOwogICAgICAgIGQgKz0gKGEgXiBiIF4gYykgKyBrWzBdIC0gMzU4NTM3MjIyIHwgMDsKICAgICAgICBkICA9IChkIDw8IDExIHwgZCA+Pj4gMjEpICsgYSB8IDA7CiAgICAgICAgYyArPSAoZCBeIGEgXiBiKSArIGtbM10gLSA3MjI1MjE5NzkgfCAwOwogICAgICAgIGMgID0gKGMgPDwgMTYgfCBjID4+PiAxNikgKyBkIHwgMDsKICAgICAgICBiICs9IChjIF4gZCBeIGEpICsga1s2XSArIDc2MDI5MTg5IHwgMDsKICAgICAgICBiICA9IChiIDw8IDIzIHwgYiA+Pj4gOSkgKyBjIHwgMDsKICAgICAgICBhICs9IChiIF4gYyBeIGQpICsga1s5XSAtIDY0MDM2NDQ4NyB8IDA7CiAgICAgICAgYSAgPSAoYSA8PCA0IHwgYSA+Pj4gMjgpICsgYiB8IDA7CiAgICAgICAgZCArPSAoYSBeIGIgXiBjKSArIGtbMTJdIC0gNDIxODE1ODM1IHwgMDsKICAgICAgICBkICA9IChkIDw8IDExIHwgZCA+Pj4gMjEpICsgYSB8IDA7CiAgICAgICAgYyArPSAoZCBeIGEgXiBiKSArIGtbMTVdICsgNTMwNzQyNTIwIHwgMDsKICAgICAgICBjICA9IChjIDw8IDE2IHwgYyA+Pj4gMTYpICsgZCB8IDA7CiAgICAgICAgYiArPSAoYyBeIGQgXiBhKSArIGtbMl0gLSA5OTUzMzg2NTEgfCAwOwogICAgICAgIGIgID0gKGIgPDwgMjMgfCBiID4+PiA5KSArIGMgfCAwOwoKICAgICAgICBhICs9IChjIF4gKGIgfCB+ZCkpICsga1swXSAtIDE5ODYzMDg0NCB8IDA7CiAgICAgICAgYSAgPSAoYSA8PCA2IHwgYSA+Pj4gMjYpICsgYiB8IDA7CiAgICAgICAgZCArPSAoYiBeIChhIHwgfmMpKSArIGtbN10gKyAxMTI2ODkxNDE1IHwgMDsKICAgICAgICBkICA9IChkIDw8IDEwIHwgZCA+Pj4gMjIpICsgYSB8IDA7CiAgICAgICAgYyArPSAoYSBeIChkIHwgfmIpKSArIGtbMTRdIC0gMTQxNjM1NDkwNSB8IDA7CiAgICAgICAgYyAgPSAoYyA8PCAxNSB8IGMgPj4+IDE3KSArIGQgfCAwOwogICAgICAgIGIgKz0gKGQgXiAoYyB8IH5hKSkgKyBrWzVdIC0gNTc0MzQwNTUgfCAwOwogICAgICAgIGIgID0gKGIgPDwgMjEgfGIgPj4+IDExKSArIGMgfCAwOwogICAgICAgIGEgKz0gKGMgXiAoYiB8IH5kKSkgKyBrWzEyXSArIDE3MDA0ODU1NzEgfCAwOwogICAgICAgIGEgID0gKGEgPDwgNiB8IGEgPj4+IDI2KSArIGIgfCAwOwogICAgICAgIGQgKz0gKGIgXiAoYSB8IH5jKSkgKyBrWzNdIC0gMTg5NDk4NjYwNiB8IDA7CiAgICAgICAgZCAgPSAoZCA8PCAxMCB8IGQgPj4+IDIyKSArIGEgfCAwOwogICAgICAgIGMgKz0gKGEgXiAoZCB8IH5iKSkgKyBrWzEwXSAtIDEwNTE1MjMgfCAwOwogICAgICAgIGMgID0gKGMgPDwgMTUgfCBjID4+PiAxNykgKyBkIHwgMDsKICAgICAgICBiICs9IChkIF4gKGMgfCB+YSkpICsga1sxXSAtIDIwNTQ5MjI3OTkgfCAwOwogICAgICAgIGIgID0gKGIgPDwgMjEgfGIgPj4+IDExKSArIGMgfCAwOwogICAgICAgIGEgKz0gKGMgXiAoYiB8IH5kKSkgKyBrWzhdICsgMTg3MzMxMzM1OSB8IDA7CiAgICAgICAgYSAgPSAoYSA8PCA2IHwgYSA+Pj4gMjYpICsgYiB8IDA7CiAgICAgICAgZCArPSAoYiBeIChhIHwgfmMpKSArIGtbMTVdIC0gMzA2MTE3NDQgfCAwOwogICAgICAgIGQgID0gKGQgPDwgMTAgfCBkID4+PiAyMikgKyBhIHwgMDsKICAgICAgICBjICs9IChhIF4gKGQgfCB+YikpICsga1s2XSAtIDE1NjAxOTgzODAgfCAwOwogICAgICAgIGMgID0gKGMgPDwgMTUgfCBjID4+PiAxNykgKyBkIHwgMDsKICAgICAgICBiICs9IChkIF4gKGMgfCB+YSkpICsga1sxM10gKyAxMzA5MTUxNjQ5IHwgMDsKICAgICAgICBiICA9IChiIDw8IDIxIHxiID4+PiAxMSkgKyBjIHwgMDsKICAgICAgICBhICs9IChjIF4gKGIgfCB+ZCkpICsga1s0XSAtIDE0NTUyMzA3MCB8IDA7CiAgICAgICAgYSAgPSAoYSA8PCA2IHwgYSA+Pj4gMjYpICsgYiB8IDA7CiAgICAgICAgZCArPSAoYiBeIChhIHwgfmMpKSArIGtbMTFdIC0gMTEyMDIxMDM3OSB8IDA7CiAgICAgICAgZCAgPSAoZCA8PCAxMCB8IGQgPj4+IDIyKSArIGEgfCAwOwogICAgICAgIGMgKz0gKGEgXiAoZCB8IH5iKSkgKyBrWzJdICsgNzE4Nzg3MjU5IHwgMDsKICAgICAgICBjICA9IChjIDw8IDE1IHwgYyA+Pj4gMTcpICsgZCB8IDA7CiAgICAgICAgYiArPSAoZCBeIChjIHwgfmEpKSArIGtbOV0gLSAzNDM0ODU1NTEgfCAwOwogICAgICAgIGIgID0gKGIgPDwgMjEgfCBiID4+PiAxMSkgKyBjIHwgMDsKCiAgICAgICAgeFswXSA9IGEgKyB4WzBdIHwgMDsKICAgICAgICB4WzFdID0gYiArIHhbMV0gfCAwOwogICAgICAgIHhbMl0gPSBjICsgeFsyXSB8IDA7CiAgICAgICAgeFszXSA9IGQgKyB4WzNdIHwgMDsKICAgIH0KCiAgICBmdW5jdGlvbiBtZDVibGsocykgewogICAgICAgIHZhciBtZDVibGtzID0gW10sCiAgICAgICAgICAgIGk7IC8qIEFuZHkgS2luZyBzYWlkIGRvIGl0IHRoaXMgd2F5LiAqLwoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkgKz0gNCkgewogICAgICAgICAgICBtZDVibGtzW2kgPj4gMl0gPSBzLmNoYXJDb2RlQXQoaSkgKyAocy5jaGFyQ29kZUF0KGkgKyAxKSA8PCA4KSArIChzLmNoYXJDb2RlQXQoaSArIDIpIDw8IDE2KSArIChzLmNoYXJDb2RlQXQoaSArIDMpIDw8IDI0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG1kNWJsa3M7CiAgICB9CgogICAgZnVuY3Rpb24gbWQ1YmxrX2FycmF5KGEpIHsKICAgICAgICB2YXIgbWQ1YmxrcyA9IFtdLAogICAgICAgICAgICBpOyAvKiBBbmR5IEtpbmcgc2FpZCBkbyBpdCB0aGlzIHdheS4gKi8KCiAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpICs9IDQpIHsKICAgICAgICAgICAgbWQ1Ymxrc1tpID4+IDJdID0gYVtpXSArIChhW2kgKyAxXSA8PCA4KSArIChhW2kgKyAyXSA8PCAxNikgKyAoYVtpICsgM10gPDwgMjQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbWQ1YmxrczsKICAgIH0KCiAgICBmdW5jdGlvbiBtZDUxKHMpIHsKICAgICAgICB2YXIgbiA9IHMubGVuZ3RoLAogICAgICAgICAgICBzdGF0ZSA9IFsxNzMyNTg0MTkzLCAtMjcxNzMzODc5LCAtMTczMjU4NDE5NCwgMjcxNzMzODc4XSwKICAgICAgICAgICAgaSwKICAgICAgICAgICAgbGVuZ3RoLAogICAgICAgICAgICB0YWlsLAogICAgICAgICAgICB0bXAsCiAgICAgICAgICAgIGxvLAogICAgICAgICAgICBoaTsKCiAgICAgICAgZm9yIChpID0gNjQ7IGkgPD0gbjsgaSArPSA2NCkgewogICAgICAgICAgICBtZDVjeWNsZShzdGF0ZSwgbWQ1YmxrKHMuc3Vic3RyaW5nKGkgLSA2NCwgaSkpKTsKICAgICAgICB9CiAgICAgICAgcyA9IHMuc3Vic3RyaW5nKGkgLSA2NCk7CiAgICAgICAgbGVuZ3RoID0gcy5sZW5ndGg7CiAgICAgICAgdGFpbCA9IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXTsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHsKICAgICAgICAgICAgdGFpbFtpID4+IDJdIHw9IHMuY2hhckNvZGVBdChpKSA8PCAoKGkgJSA0KSA8PCAzKTsKICAgICAgICB9CiAgICAgICAgdGFpbFtpID4+IDJdIHw9IDB4ODAgPDwgKChpICUgNCkgPDwgMyk7CiAgICAgICAgaWYgKGkgPiA1NSkgewogICAgICAgICAgICBtZDVjeWNsZShzdGF0ZSwgdGFpbCk7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSArPSAxKSB7CiAgICAgICAgICAgICAgICB0YWlsW2ldID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gQmV3YXJlIHRoYXQgdGhlIGZpbmFsIGxlbmd0aCBtaWdodCBub3QgZml0IGluIDMyIGJpdHMgc28gd2UgdGFrZSBjYXJlIG9mIHRoYXQKICAgICAgICB0bXAgPSBuICogODsKICAgICAgICB0bXAgPSB0bXAudG9TdHJpbmcoMTYpLm1hdGNoKC8oLio/KSguezAsOH0pJC8pOwogICAgICAgIGxvID0gcGFyc2VJbnQodG1wWzJdLCAxNik7CiAgICAgICAgaGkgPSBwYXJzZUludCh0bXBbMV0sIDE2KSB8fCAwOwoKICAgICAgICB0YWlsWzE0XSA9IGxvOwogICAgICAgIHRhaWxbMTVdID0gaGk7CgogICAgICAgIG1kNWN5Y2xlKHN0YXRlLCB0YWlsKTsKICAgICAgICByZXR1cm4gc3RhdGU7CiAgICB9CgogICAgZnVuY3Rpb24gbWQ1MV9hcnJheShhKSB7CiAgICAgICAgdmFyIG4gPSBhLmxlbmd0aCwKICAgICAgICAgICAgc3RhdGUgPSBbMTczMjU4NDE5MywgLTI3MTczMzg3OSwgLTE3MzI1ODQxOTQsIDI3MTczMzg3OF0sCiAgICAgICAgICAgIGksCiAgICAgICAgICAgIGxlbmd0aCwKICAgICAgICAgICAgdGFpbCwKICAgICAgICAgICAgdG1wLAogICAgICAgICAgICBsbywKICAgICAgICAgICAgaGk7CgogICAgICAgIGZvciAoaSA9IDY0OyBpIDw9IG47IGkgKz0gNjQpIHsKICAgICAgICAgICAgbWQ1Y3ljbGUoc3RhdGUsIG1kNWJsa19hcnJheShhLnN1YmFycmF5KGkgLSA2NCwgaSkpKTsKICAgICAgICB9CgogICAgICAgIC8vIE5vdCBzdXJlIGlmIGl0IGlzIGEgYnVnLCBob3dldmVyIElFMTAgd2lsbCBhbHdheXMgcHJvZHVjZSBhIHN1YiBhcnJheSBvZiBsZW5ndGggMQogICAgICAgIC8vIGNvbnRhaW5pbmcgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgcGFyZW50IGFycmF5IGlmIHRoZSBzdWIgYXJyYXkgc3BlY2lmaWVkIHN0YXJ0cwogICAgICAgIC8vIGJleW9uZCB0aGUgbGVuZ3RoIG9mIHRoZSBwYXJlbnQgYXJyYXkgLSB3ZWlyZC4KICAgICAgICAvLyBodHRwczovL2Nvbm5lY3QubWljcm9zb2Z0LmNvbS9JRS9mZWVkYmFjay9kZXRhaWxzLzc3MTQ1Mi90eXBlZC1hcnJheS1zdWJhcnJheS1pc3N1ZQogICAgICAgIGEgPSAoaSAtIDY0KSA8IG4gPyBhLnN1YmFycmF5KGkgLSA2NCkgOiBuZXcgVWludDhBcnJheSgwKTsKCiAgICAgICAgbGVuZ3RoID0gYS5sZW5ndGg7CiAgICAgICAgdGFpbCA9IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXTsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHsKICAgICAgICAgICAgdGFpbFtpID4+IDJdIHw9IGFbaV0gPDwgKChpICUgNCkgPDwgMyk7CiAgICAgICAgfQoKICAgICAgICB0YWlsW2kgPj4gMl0gfD0gMHg4MCA8PCAoKGkgJSA0KSA8PCAzKTsKICAgICAgICBpZiAoaSA+IDU1KSB7CiAgICAgICAgICAgIG1kNWN5Y2xlKHN0YXRlLCB0YWlsKTsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpICs9IDEpIHsKICAgICAgICAgICAgICAgIHRhaWxbaV0gPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBCZXdhcmUgdGhhdCB0aGUgZmluYWwgbGVuZ3RoIG1pZ2h0IG5vdCBmaXQgaW4gMzIgYml0cyBzbyB3ZSB0YWtlIGNhcmUgb2YgdGhhdAogICAgICAgIHRtcCA9IG4gKiA4OwogICAgICAgIHRtcCA9IHRtcC50b1N0cmluZygxNikubWF0Y2goLyguKj8pKC57MCw4fSkkLyk7CiAgICAgICAgbG8gPSBwYXJzZUludCh0bXBbMl0sIDE2KTsKICAgICAgICBoaSA9IHBhcnNlSW50KHRtcFsxXSwgMTYpIHx8IDA7CgogICAgICAgIHRhaWxbMTRdID0gbG87CiAgICAgICAgdGFpbFsxNV0gPSBoaTsKCiAgICAgICAgbWQ1Y3ljbGUoc3RhdGUsIHRhaWwpOwoKICAgICAgICByZXR1cm4gc3RhdGU7CiAgICB9CgogICAgZnVuY3Rpb24gcmhleChuKSB7CiAgICAgICAgdmFyIHMgPSAnJywKICAgICAgICAgICAgajsKICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaiArPSAxKSB7CiAgICAgICAgICAgIHMgKz0gaGV4X2NoclsobiA+PiAoaiAqIDggKyA0KSkgJiAweDBGXSArIGhleF9jaHJbKG4gPj4gKGogKiA4KSkgJiAweDBGXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHM7CiAgICB9CgogICAgZnVuY3Rpb24gaGV4KHgpIHsKICAgICAgICB2YXIgaTsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkgKz0gMSkgewogICAgICAgICAgICB4W2ldID0gcmhleCh4W2ldKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHguam9pbignJyk7CiAgICB9CgogICAgLy8gSW4gc29tZSBjYXNlcyB0aGUgZmFzdCBhZGQzMiBmdW5jdGlvbiBjYW5ub3QgYmUgdXNlZC4uCiAgICBpZiAoaGV4KG1kNTEoJ2hlbGxvJykpICE9PSAnNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTInKSB7CiAgICAgICAgYWRkMzIgPSBmdW5jdGlvbiAoeCwgeSkgewogICAgICAgICAgICB2YXIgbHN3ID0gKHggJiAweEZGRkYpICsgKHkgJiAweEZGRkYpLAogICAgICAgICAgICAgICAgbXN3ID0gKHggPj4gMTYpICsgKHkgPj4gMTYpICsgKGxzdyA+PiAxNik7CiAgICAgICAgICAgIHJldHVybiAobXN3IDw8IDE2KSB8IChsc3cgJiAweEZGRkYpOwogICAgICAgIH07CiAgICB9CgogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgLyoqCiAgICAgKiBBcnJheUJ1ZmZlciBzbGljZSBwb2x5ZmlsbC4KICAgICAqCiAgICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90dGF1YmVydC9ub2RlLWFycmF5YnVmZmVyLXNsaWNlCiAgICAgKi8KCiAgICBpZiAodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiAhQXJyYXlCdWZmZXIucHJvdG90eXBlLnNsaWNlKSB7CiAgICAgICAgKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgZnVuY3Rpb24gY2xhbXAodmFsLCBsZW5ndGgpIHsKICAgICAgICAgICAgICAgIHZhbCA9ICh2YWwgfCAwKSB8fCAwOwoKICAgICAgICAgICAgICAgIGlmICh2YWwgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KHZhbCArIGxlbmd0aCwgMCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgubWluKHZhbCwgbGVuZ3RoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQXJyYXlCdWZmZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gKGZyb20sIHRvKSB7CiAgICAgICAgICAgICAgICB2YXIgbGVuZ3RoID0gdGhpcy5ieXRlTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgIGJlZ2luID0gY2xhbXAoZnJvbSwgbGVuZ3RoKSwKICAgICAgICAgICAgICAgICAgICBlbmQgPSBsZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgbnVtLAogICAgICAgICAgICAgICAgICAgIHRhcmdldCwKICAgICAgICAgICAgICAgICAgICB0YXJnZXRBcnJheSwKICAgICAgICAgICAgICAgICAgICBzb3VyY2VBcnJheTsKCiAgICAgICAgICAgICAgICBpZiAodG8gIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgIGVuZCA9IGNsYW1wKHRvLCBsZW5ndGgpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChiZWdpbiA+IGVuZCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlCdWZmZXIoMCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbnVtID0gZW5kIC0gYmVnaW47CiAgICAgICAgICAgICAgICB0YXJnZXQgPSBuZXcgQXJyYXlCdWZmZXIobnVtKTsKICAgICAgICAgICAgICAgIHRhcmdldEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkodGFyZ2V0KTsKCiAgICAgICAgICAgICAgICBzb3VyY2VBcnJheSA9IG5ldyBVaW50OEFycmF5KHRoaXMsIGJlZ2luLCBudW0pOwogICAgICAgICAgICAgICAgdGFyZ2V0QXJyYXkuc2V0KHNvdXJjZUFycmF5KTsKCiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICAgICAgICB9OwogICAgICAgIH0pKCk7CiAgICB9CgogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgLyoqCiAgICAgKiBIZWxwZXJzLgogICAgICovCgogICAgZnVuY3Rpb24gdG9VdGY4KHN0cikgewogICAgICAgIGlmICgvW1x1MDA4MC1cdUZGRkZdLy50ZXN0KHN0cikpIHsKICAgICAgICAgICAgc3RyID0gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHN0cikpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHN0cjsKICAgIH0KCiAgICBmdW5jdGlvbiB1dGY4U3RyMkFycmF5QnVmZmVyKHN0ciwgcmV0dXJuVUludDhBcnJheSkgewogICAgICAgIHZhciBsZW5ndGggPSBzdHIubGVuZ3RoLAogICAgICAgICAgIGJ1ZmYgPSBuZXcgQXJyYXlCdWZmZXIobGVuZ3RoKSwKICAgICAgICAgICBhcnIgPSBuZXcgVWludDhBcnJheShidWZmKSwKICAgICAgICAgICBpOwoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHsKICAgICAgICAgICAgYXJyW2ldID0gc3RyLmNoYXJDb2RlQXQoaSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmV0dXJuVUludDhBcnJheSA/IGFyciA6IGJ1ZmY7CiAgICB9CgogICAgZnVuY3Rpb24gYXJyYXlCdWZmZXIyVXRmOFN0cihidWZmKSB7CiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgbmV3IFVpbnQ4QXJyYXkoYnVmZikpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbmNhdGVuYXRlQXJyYXlCdWZmZXJzKGZpcnN0LCBzZWNvbmQsIHJldHVyblVJbnQ4QXJyYXkpIHsKICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoZmlyc3QuYnl0ZUxlbmd0aCArIHNlY29uZC5ieXRlTGVuZ3RoKTsKCiAgICAgICAgcmVzdWx0LnNldChuZXcgVWludDhBcnJheShmaXJzdCkpOwogICAgICAgIHJlc3VsdC5zZXQobmV3IFVpbnQ4QXJyYXkoc2Vjb25kKSwgZmlyc3QuYnl0ZUxlbmd0aCk7CgogICAgICAgIHJldHVybiByZXR1cm5VSW50OEFycmF5ID8gcmVzdWx0IDogcmVzdWx0LmJ1ZmZlcjsKICAgIH0KCiAgICBmdW5jdGlvbiBoZXhUb0JpbmFyeVN0cmluZyhoZXgpIHsKICAgICAgICB2YXIgYnl0ZXMgPSBbXSwKICAgICAgICAgICAgbGVuZ3RoID0gaGV4Lmxlbmd0aCwKICAgICAgICAgICAgeDsKCiAgICAgICAgZm9yICh4ID0gMDsgeCA8IGxlbmd0aCAtIDE7IHggKz0gMikgewogICAgICAgICAgICBieXRlcy5wdXNoKHBhcnNlSW50KGhleC5zdWJzdHIoeCwgMiksIDE2KSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGJ5dGVzKTsKICAgIH0KCiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAvKioKICAgICAqIFNwYXJrTUQ1IE9PUCBpbXBsZW1lbnRhdGlvbi4KICAgICAqCiAgICAgKiBVc2UgdGhpcyBjbGFzcyB0byBwZXJmb3JtIGFuIGluY3JlbWVudGFsIG1kNSwgb3RoZXJ3aXNlIHVzZSB0aGUKICAgICAqIHN0YXRpYyBtZXRob2RzIGluc3RlYWQuCiAgICAgKi8KCiAgICBmdW5jdGlvbiBTcGFya01ENSgpIHsKICAgICAgICAvLyBjYWxsIHJlc2V0IHRvIGluaXQgdGhlIGluc3RhbmNlCiAgICAgICAgdGhpcy5yZXNldCgpOwogICAgfQoKICAgIC8qKgogICAgICogQXBwZW5kcyBhIHN0cmluZy4KICAgICAqIEEgY29udmVyc2lvbiB3aWxsIGJlIGFwcGxpZWQgaWYgYW4gdXRmOCBzdHJpbmcgaXMgZGV0ZWN0ZWQuCiAgICAgKgogICAgICogQHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgc3RyaW5nIHRvIGJlIGFwcGVuZGVkCiAgICAgKgogICAgICogQHJldHVybiB7U3BhcmtNRDV9IFRoZSBpbnN0YW5jZSBpdHNlbGYKICAgICAqLwogICAgU3BhcmtNRDUucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uIChzdHIpIHsKICAgICAgICAvLyBDb252ZXJ0cyB0aGUgc3RyaW5nIHRvIHV0ZjggYnl0ZXMgaWYgbmVjZXNzYXJ5CiAgICAgICAgLy8gVGhlbiBhcHBlbmQgYXMgYmluYXJ5CiAgICAgICAgdGhpcy5hcHBlbmRCaW5hcnkodG9VdGY4KHN0cikpOwoKICAgICAgICByZXR1cm4gdGhpczsKICAgIH07CgogICAgLyoqCiAgICAgKiBBcHBlbmRzIGEgYmluYXJ5IHN0cmluZy4KICAgICAqCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29udGVudHMgVGhlIGJpbmFyeSBzdHJpbmcgdG8gYmUgYXBwZW5kZWQKICAgICAqCiAgICAgKiBAcmV0dXJuIHtTcGFya01ENX0gVGhlIGluc3RhbmNlIGl0c2VsZgogICAgICovCiAgICBTcGFya01ENS5wcm90b3R5cGUuYXBwZW5kQmluYXJ5ID0gZnVuY3Rpb24gKGNvbnRlbnRzKSB7CiAgICAgICAgdGhpcy5fYnVmZiArPSBjb250ZW50czsKICAgICAgICB0aGlzLl9sZW5ndGggKz0gY29udGVudHMubGVuZ3RoOwoKICAgICAgICB2YXIgbGVuZ3RoID0gdGhpcy5fYnVmZi5sZW5ndGgsCiAgICAgICAgICAgIGk7CgogICAgICAgIGZvciAoaSA9IDY0OyBpIDw9IGxlbmd0aDsgaSArPSA2NCkgewogICAgICAgICAgICBtZDVjeWNsZSh0aGlzLl9oYXNoLCBtZDVibGsodGhpcy5fYnVmZi5zdWJzdHJpbmcoaSAtIDY0LCBpKSkpOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5fYnVmZiA9IHRoaXMuX2J1ZmYuc3Vic3RyaW5nKGkgLSA2NCk7CgogICAgICAgIHJldHVybiB0aGlzOwogICAgfTsKCiAgICAvKioKICAgICAqIEZpbmlzaGVzIHRoZSBpbmNyZW1lbnRhbCBjb21wdXRhdGlvbiwgcmVzZXRpbmcgdGhlIGludGVybmFsIHN0YXRlIGFuZAogICAgICogcmV0dXJuaW5nIHRoZSByZXN1bHQuCiAgICAgKgogICAgICogQHBhcmFtIHtCb29sZWFufSByYXcgVHJ1ZSB0byBnZXQgdGhlIHJhdyBzdHJpbmcsIGZhbHNlIHRvIGdldCB0aGUgaGV4IHN0cmluZwogICAgICoKICAgICAqIEByZXR1cm4ge1N0cmluZ30gVGhlIHJlc3VsdAogICAgICovCiAgICBTcGFya01ENS5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKHJhdykgewogICAgICAgIHZhciBidWZmID0gdGhpcy5fYnVmZiwKICAgICAgICAgICAgbGVuZ3RoID0gYnVmZi5sZW5ndGgsCiAgICAgICAgICAgIGksCiAgICAgICAgICAgIHRhaWwgPSBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF0sCiAgICAgICAgICAgIHJldDsKCiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7CiAgICAgICAgICAgIHRhaWxbaSA+PiAyXSB8PSBidWZmLmNoYXJDb2RlQXQoaSkgPDwgKChpICUgNCkgPDwgMyk7CiAgICAgICAgfQoKICAgICAgICB0aGlzLl9maW5pc2godGFpbCwgbGVuZ3RoKTsKICAgICAgICByZXQgPSBoZXgodGhpcy5faGFzaCk7CgogICAgICAgIGlmIChyYXcpIHsKICAgICAgICAgICAgcmV0ID0gaGV4VG9CaW5hcnlTdHJpbmcocmV0KTsKICAgICAgICB9CgogICAgICAgIHRoaXMucmVzZXQoKTsKCiAgICAgICAgcmV0dXJuIHJldDsKICAgIH07CgogICAgLyoqCiAgICAgKiBSZXNldHMgdGhlIGludGVybmFsIHN0YXRlIG9mIHRoZSBjb21wdXRhdGlvbi4KICAgICAqCiAgICAgKiBAcmV0dXJuIHtTcGFya01ENX0gVGhlIGluc3RhbmNlIGl0c2VsZgogICAgICovCiAgICBTcGFya01ENS5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdGhpcy5fYnVmZiA9ICcnOwogICAgICAgIHRoaXMuX2xlbmd0aCA9IDA7CiAgICAgICAgdGhpcy5faGFzaCA9IFsxNzMyNTg0MTkzLCAtMjcxNzMzODc5LCAtMTczMjU4NDE5NCwgMjcxNzMzODc4XTsKCiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwoKICAgIC8qKgogICAgICogR2V0cyB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIGNvbXB1dGF0aW9uLgogICAgICoKICAgICAqIEByZXR1cm4ge09iamVjdH0gVGhlIHN0YXRlCiAgICAgKi8KICAgIFNwYXJrTUQ1LnByb3RvdHlwZS5nZXRTdGF0ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBidWZmOiB0aGlzLl9idWZmLAogICAgICAgICAgICBsZW5ndGg6IHRoaXMuX2xlbmd0aCwKICAgICAgICAgICAgaGFzaDogdGhpcy5faGFzaC5zbGljZSgpCiAgICAgICAgfTsKICAgIH07CgogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgY29tcHV0YXRpb24uCiAgICAgKgogICAgICogQHBhcmFtIHtPYmplY3R9IHN0YXRlIFRoZSBzdGF0ZQogICAgICoKICAgICAqIEByZXR1cm4ge1NwYXJrTUQ1fSBUaGUgaW5zdGFuY2UgaXRzZWxmCiAgICAgKi8KICAgIFNwYXJrTUQ1LnByb3RvdHlwZS5zZXRTdGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZSkgewogICAgICAgIHRoaXMuX2J1ZmYgPSBzdGF0ZS5idWZmOwogICAgICAgIHRoaXMuX2xlbmd0aCA9IHN0YXRlLmxlbmd0aDsKICAgICAgICB0aGlzLl9oYXNoID0gc3RhdGUuaGFzaDsKCiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwoKICAgIC8qKgogICAgICogUmVsZWFzZXMgbWVtb3J5IHVzZWQgYnkgdGhlIGluY3JlbWVudGFsIGJ1ZmZlciBhbmQgb3RoZXIgYWRkaXRpb25hbAogICAgICogcmVzb3VyY2VzLiBJZiB5b3UgcGxhbiB0byB1c2UgdGhlIGluc3RhbmNlIGFnYWluLCB1c2UgcmVzZXQgaW5zdGVhZC4KICAgICAqLwogICAgU3BhcmtNRDUucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgZGVsZXRlIHRoaXMuX2hhc2g7CiAgICAgICAgZGVsZXRlIHRoaXMuX2J1ZmY7CiAgICAgICAgZGVsZXRlIHRoaXMuX2xlbmd0aDsKICAgIH07CgogICAgLyoqCiAgICAgKiBGaW5pc2ggdGhlIGZpbmFsIGNhbGN1bGF0aW9uIGJhc2VkIG9uIHRoZSB0YWlsLgogICAgICoKICAgICAqIEBwYXJhbSB7QXJyYXl9ICB0YWlsICAgVGhlIHRhaWwgKHdpbGwgYmUgbW9kaWZpZWQpCiAgICAgKiBAcGFyYW0ge051bWJlcn0gbGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHJlbWFpbmluZyBidWZmZXIKICAgICAqLwogICAgU3BhcmtNRDUucHJvdG90eXBlLl9maW5pc2ggPSBmdW5jdGlvbiAodGFpbCwgbGVuZ3RoKSB7CiAgICAgICAgdmFyIGkgPSBsZW5ndGgsCiAgICAgICAgICAgIHRtcCwKICAgICAgICAgICAgbG8sCiAgICAgICAgICAgIGhpOwoKICAgICAgICB0YWlsW2kgPj4gMl0gfD0gMHg4MCA8PCAoKGkgJSA0KSA8PCAzKTsKICAgICAgICBpZiAoaSA+IDU1KSB7CiAgICAgICAgICAgIG1kNWN5Y2xlKHRoaXMuX2hhc2gsIHRhaWwpOwogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkgKz0gMSkgewogICAgICAgICAgICAgICAgdGFpbFtpXSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIERvIHRoZSBmaW5hbCBjb21wdXRhdGlvbiBiYXNlZCBvbiB0aGUgdGFpbCBhbmQgbGVuZ3RoCiAgICAgICAgLy8gQmV3YXJlIHRoYXQgdGhlIGZpbmFsIGxlbmd0aCBtYXkgbm90IGZpdCBpbiAzMiBiaXRzIHNvIHdlIHRha2UgY2FyZSBvZiB0aGF0CiAgICAgICAgdG1wID0gdGhpcy5fbGVuZ3RoICogODsKICAgICAgICB0bXAgPSB0bXAudG9TdHJpbmcoMTYpLm1hdGNoKC8oLio/KSguezAsOH0pJC8pOwogICAgICAgIGxvID0gcGFyc2VJbnQodG1wWzJdLCAxNik7CiAgICAgICAgaGkgPSBwYXJzZUludCh0bXBbMV0sIDE2KSB8fCAwOwoKICAgICAgICB0YWlsWzE0XSA9IGxvOwogICAgICAgIHRhaWxbMTVdID0gaGk7CiAgICAgICAgbWQ1Y3ljbGUodGhpcy5faGFzaCwgdGFpbCk7CiAgICB9OwoKICAgIC8qKgogICAgICogUGVyZm9ybXMgdGhlIG1kNSBoYXNoIG9uIGEgc3RyaW5nLgogICAgICogQSBjb252ZXJzaW9uIHdpbGwgYmUgYXBwbGllZCBpZiB1dGY4IHN0cmluZyBpcyBkZXRlY3RlZC4KICAgICAqCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gIHN0ciBUaGUgc3RyaW5nCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtyYXddIFRydWUgdG8gZ2V0IHRoZSByYXcgc3RyaW5nLCBmYWxzZSB0byBnZXQgdGhlIGhleCBzdHJpbmcKICAgICAqCiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSByZXN1bHQKICAgICAqLwogICAgU3BhcmtNRDUuaGFzaCA9IGZ1bmN0aW9uIChzdHIsIHJhdykgewogICAgICAgIC8vIENvbnZlcnRzIHRoZSBzdHJpbmcgdG8gdXRmOCBieXRlcyBpZiBuZWNlc3NhcnkKICAgICAgICAvLyBUaGVuIGNvbXB1dGUgaXQgdXNpbmcgdGhlIGJpbmFyeSBmdW5jdGlvbgogICAgICAgIHJldHVybiBTcGFya01ENS5oYXNoQmluYXJ5KHRvVXRmOChzdHIpLCByYXcpOwogICAgfTsKCiAgICAvKioKICAgICAqIFBlcmZvcm1zIHRoZSBtZDUgaGFzaCBvbiBhIGJpbmFyeSBzdHJpbmcuCiAgICAgKgogICAgICogQHBhcmFtIHtTdHJpbmd9ICBjb250ZW50IFRoZSBiaW5hcnkgc3RyaW5nCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtyYXddICAgICBUcnVlIHRvIGdldCB0aGUgcmF3IHN0cmluZywgZmFsc2UgdG8gZ2V0IHRoZSBoZXggc3RyaW5nCiAgICAgKgogICAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgcmVzdWx0CiAgICAgKi8KICAgIFNwYXJrTUQ1Lmhhc2hCaW5hcnkgPSBmdW5jdGlvbiAoY29udGVudCwgcmF3KSB7CiAgICAgICAgdmFyIGhhc2ggPSBtZDUxKGNvbnRlbnQpLAogICAgICAgICAgICByZXQgPSBoZXgoaGFzaCk7CgogICAgICAgIHJldHVybiByYXcgPyBoZXhUb0JpbmFyeVN0cmluZyhyZXQpIDogcmV0OwogICAgfTsKCiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAvKioKICAgICAqIFNwYXJrTUQ1IE9PUCBpbXBsZW1lbnRhdGlvbiBmb3IgYXJyYXkgYnVmZmVycy4KICAgICAqCiAgICAgKiBVc2UgdGhpcyBjbGFzcyB0byBwZXJmb3JtIGFuIGluY3JlbWVudGFsIG1kNSBPTkxZIGZvciBhcnJheSBidWZmZXJzLgogICAgICovCiAgICBTcGFya01ENS5BcnJheUJ1ZmZlciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAvLyBjYWxsIHJlc2V0IHRvIGluaXQgdGhlIGluc3RhbmNlCiAgICAgICAgdGhpcy5yZXNldCgpOwogICAgfTsKCiAgICAvKioKICAgICAqIEFwcGVuZHMgYW4gYXJyYXkgYnVmZmVyLgogICAgICoKICAgICAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGFyciBUaGUgYXJyYXkgdG8gYmUgYXBwZW5kZWQKICAgICAqCiAgICAgKiBAcmV0dXJuIHtTcGFya01ENS5BcnJheUJ1ZmZlcn0gVGhlIGluc3RhbmNlIGl0c2VsZgogICAgICovCiAgICBTcGFya01ENS5BcnJheUJ1ZmZlci5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24gKGFycikgewogICAgICAgIHZhciBidWZmID0gY29uY2F0ZW5hdGVBcnJheUJ1ZmZlcnModGhpcy5fYnVmZi5idWZmZXIsIGFyciwgdHJ1ZSksCiAgICAgICAgICAgIGxlbmd0aCA9IGJ1ZmYubGVuZ3RoLAogICAgICAgICAgICBpOwoKICAgICAgICB0aGlzLl9sZW5ndGggKz0gYXJyLmJ5dGVMZW5ndGg7CgogICAgICAgIGZvciAoaSA9IDY0OyBpIDw9IGxlbmd0aDsgaSArPSA2NCkgewogICAgICAgICAgICBtZDVjeWNsZSh0aGlzLl9oYXNoLCBtZDVibGtfYXJyYXkoYnVmZi5zdWJhcnJheShpIC0gNjQsIGkpKSk7CiAgICAgICAgfQoKICAgICAgICB0aGlzLl9idWZmID0gKGkgLSA2NCkgPCBsZW5ndGggPyBuZXcgVWludDhBcnJheShidWZmLmJ1ZmZlci5zbGljZShpIC0gNjQpKSA6IG5ldyBVaW50OEFycmF5KDApOwoKICAgICAgICByZXR1cm4gdGhpczsKICAgIH07CgogICAgLyoqCiAgICAgKiBGaW5pc2hlcyB0aGUgaW5jcmVtZW50YWwgY29tcHV0YXRpb24sIHJlc2V0aW5nIHRoZSBpbnRlcm5hbCBzdGF0ZSBhbmQKICAgICAqIHJldHVybmluZyB0aGUgcmVzdWx0LgogICAgICoKICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gcmF3IFRydWUgdG8gZ2V0IHRoZSByYXcgc3RyaW5nLCBmYWxzZSB0byBnZXQgdGhlIGhleCBzdHJpbmcKICAgICAqCiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSByZXN1bHQKICAgICAqLwogICAgU3BhcmtNRDUuQXJyYXlCdWZmZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIChyYXcpIHsKICAgICAgICB2YXIgYnVmZiA9IHRoaXMuX2J1ZmYsCiAgICAgICAgICAgIGxlbmd0aCA9IGJ1ZmYubGVuZ3RoLAogICAgICAgICAgICB0YWlsID0gWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdLAogICAgICAgICAgICBpLAogICAgICAgICAgICByZXQ7CgogICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkgewogICAgICAgICAgICB0YWlsW2kgPj4gMl0gfD0gYnVmZltpXSA8PCAoKGkgJSA0KSA8PCAzKTsKICAgICAgICB9CgogICAgICAgIHRoaXMuX2ZpbmlzaCh0YWlsLCBsZW5ndGgpOwogICAgICAgIHJldCA9IGhleCh0aGlzLl9oYXNoKTsKCiAgICAgICAgaWYgKHJhdykgewogICAgICAgICAgICByZXQgPSBoZXhUb0JpbmFyeVN0cmluZyhyZXQpOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5yZXNldCgpOwoKICAgICAgICByZXR1cm4gcmV0OwogICAgfTsKCiAgICAvKioKICAgICAqIFJlc2V0cyB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIGNvbXB1dGF0aW9uLgogICAgICoKICAgICAqIEByZXR1cm4ge1NwYXJrTUQ1LkFycmF5QnVmZmVyfSBUaGUgaW5zdGFuY2UgaXRzZWxmCiAgICAgKi8KICAgIFNwYXJrTUQ1LkFycmF5QnVmZmVyLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB0aGlzLl9idWZmID0gbmV3IFVpbnQ4QXJyYXkoMCk7CiAgICAgICAgdGhpcy5fbGVuZ3RoID0gMDsKICAgICAgICB0aGlzLl9oYXNoID0gWzE3MzI1ODQxOTMsIC0yNzE3MzM4NzksIC0xNzMyNTg0MTk0LCAyNzE3MzM4NzhdOwoKICAgICAgICByZXR1cm4gdGhpczsKICAgIH07CgogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgY29tcHV0YXRpb24uCiAgICAgKgogICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgc3RhdGUKICAgICAqLwogICAgU3BhcmtNRDUuQXJyYXlCdWZmZXIucHJvdG90eXBlLmdldFN0YXRlID0gZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBzdGF0ZSA9IFNwYXJrTUQ1LnByb3RvdHlwZS5nZXRTdGF0ZS5jYWxsKHRoaXMpOwoKICAgICAgICAvLyBDb252ZXJ0IGJ1ZmZlciB0byBhIHN0cmluZwogICAgICAgIHN0YXRlLmJ1ZmYgPSBhcnJheUJ1ZmZlcjJVdGY4U3RyKHN0YXRlLmJ1ZmYpOwoKICAgICAgICByZXR1cm4gc3RhdGU7CiAgICB9OwoKICAgIC8qKgogICAgICogR2V0cyB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIGNvbXB1dGF0aW9uLgogICAgICoKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZSBUaGUgc3RhdGUKICAgICAqCiAgICAgKiBAcmV0dXJuIHtTcGFya01ENS5BcnJheUJ1ZmZlcn0gVGhlIGluc3RhbmNlIGl0c2VsZgogICAgICovCiAgICBTcGFya01ENS5BcnJheUJ1ZmZlci5wcm90b3R5cGUuc2V0U3RhdGUgPSBmdW5jdGlvbiAoc3RhdGUpIHsKICAgICAgICAvLyBDb252ZXJ0IHN0cmluZyB0byBidWZmZXIKICAgICAgICBzdGF0ZS5idWZmID0gdXRmOFN0cjJBcnJheUJ1ZmZlcihzdGF0ZS5idWZmLCB0cnVlKTsKCiAgICAgICAgcmV0dXJuIFNwYXJrTUQ1LnByb3RvdHlwZS5zZXRTdGF0ZS5jYWxsKHRoaXMsIHN0YXRlKTsKICAgIH07CgogICAgU3BhcmtNRDUuQXJyYXlCdWZmZXIucHJvdG90eXBlLmRlc3Ryb3kgPSBTcGFya01ENS5wcm90b3R5cGUuZGVzdHJveTsKCiAgICBTcGFya01ENS5BcnJheUJ1ZmZlci5wcm90b3R5cGUuX2ZpbmlzaCA9IFNwYXJrTUQ1LnByb3RvdHlwZS5fZmluaXNoOwoKICAgIC8qKgogICAgICogUGVyZm9ybXMgdGhlIG1kNSBoYXNoIG9uIGFuIGFycmF5IGJ1ZmZlci4KICAgICAqCiAgICAgKiBAcGFyYW0ge0FycmF5QnVmZmVyfSBhcnIgVGhlIGFycmF5IGJ1ZmZlcgogICAgICogQHBhcmFtIHtCb29sZWFufSAgICAgW3Jhd10gVHJ1ZSB0byBnZXQgdGhlIHJhdyBzdHJpbmcsIGZhbHNlIHRvIGdldCB0aGUgaGV4IG9uZQogICAgICoKICAgICAqIEByZXR1cm4ge1N0cmluZ30gVGhlIHJlc3VsdAogICAgICovCiAgICBTcGFya01ENS5BcnJheUJ1ZmZlci5oYXNoID0gZnVuY3Rpb24gKGFyciwgcmF3KSB7CiAgICAgICAgdmFyIGhhc2ggPSBtZDUxX2FycmF5KG5ldyBVaW50OEFycmF5KGFycikpLAogICAgICAgICAgICByZXQgPSBoZXgoaGFzaCk7CgogICAgICAgIHJldHVybiByYXcgPyBoZXhUb0JpbmFyeVN0cmluZyhyZXQpIDogcmV0OwogICAgfTsKCiAgICByZXR1cm4gU3BhcmtNRDU7Cn0pKTsKCgovKioqLyB9KSwKCi8qKiovIDQ1NToKLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkgewoKLyohCiogc3dlZXRhbGVydDIgdjExLjQuMTYKKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuCiovCihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7CiAgIHRydWUgPyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKSA6CiAgMDsKfSh0aGlzLCBmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsKCiAgY29uc3QgY29uc29sZVByZWZpeCA9ICdTd2VldEFsZXJ0MjonOwogIC8qKgogICAqIEZpbHRlciB0aGUgdW5pcXVlIHZhbHVlcyBpbnRvIGEgbmV3IGFycmF5CiAgICogQHBhcmFtIGFycgogICAqLwoKICBjb25zdCB1bmlxdWVBcnJheSA9IGFyciA9PiB7CiAgICBjb25zdCByZXN1bHQgPSBbXTsKCiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgewogICAgICBpZiAocmVzdWx0LmluZGV4T2YoYXJyW2ldKSA9PT0gLTEpIHsKICAgICAgICByZXN1bHQucHVzaChhcnJbaV0pOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHJlc3VsdDsKICB9OwogIC8qKgogICAqIENhcGl0YWxpemUgdGhlIGZpcnN0IGxldHRlciBvZiBhIHN0cmluZwogICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIKICAgKiBAcmV0dXJucyB7c3RyaW5nfQogICAqLwoKICBjb25zdCBjYXBpdGFsaXplRmlyc3RMZXR0ZXIgPSBzdHIgPT4gc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpOwogIC8qKgogICAqIEBwYXJhbSB7Tm9kZUxpc3QgfCBIVE1MQ29sbGVjdGlvbiB8IE5hbWVkTm9kZU1hcCB8IERPTVRva2VuTGlzdH0gbm9kZUxpc3QKICAgKiBAcmV0dXJucyB7YXJyYXl9CiAgICovCgogIGNvbnN0IHRvQXJyYXkgPSBub2RlTGlzdCA9PiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChub2RlTGlzdCk7CiAgLyoqCiAgICogU3RhbmRhcmRpemUgY29uc29sZSB3YXJuaW5ncwogICAqIEBwYXJhbSB7c3RyaW5nIHwgYXJyYXl9IG1lc3NhZ2UKICAgKi8KCiAgY29uc3Qgd2FybiA9IG1lc3NhZ2UgPT4gewogICAgY29uc29sZS53YXJuKCIiLmNvbmNhdChjb25zb2xlUHJlZml4LCAiICIpLmNvbmNhdCh0eXBlb2YgbWVzc2FnZSA9PT0gJ29iamVjdCcgPyBtZXNzYWdlLmpvaW4oJyAnKSA6IG1lc3NhZ2UpKTsKICB9OwogIC8qKgogICAqIFN0YW5kYXJkaXplIGNvbnNvbGUgZXJyb3JzCiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UKICAgKi8KCiAgY29uc3QgZXJyb3IgPSBtZXNzYWdlID0+IHsKICAgIGNvbnNvbGUuZXJyb3IoIiIuY29uY2F0KGNvbnNvbGVQcmVmaXgsICIgIikuY29uY2F0KG1lc3NhZ2UpKTsKICB9OwogIC8qKgogICAqIFByaXZhdGUgZ2xvYmFsIHN0YXRlIGZvciBgd2Fybk9uY2VgCiAgICogQHR5cGUge0FycmF5fQogICAqIEBwcml2YXRlCiAgICovCgogIGNvbnN0IHByZXZpb3VzV2Fybk9uY2VNZXNzYWdlcyA9IFtdOwogIC8qKgogICAqIFNob3cgYSBjb25zb2xlIHdhcm5pbmcsIGJ1dCBvbmx5IGlmIGl0IGhhc24ndCBhbHJlYWR5IGJlZW4gc2hvd24KICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZQogICAqLwoKICBjb25zdCB3YXJuT25jZSA9IG1lc3NhZ2UgPT4gewogICAgaWYgKCFwcmV2aW91c1dhcm5PbmNlTWVzc2FnZXMuaW5jbHVkZXMobWVzc2FnZSkpIHsKICAgICAgcHJldmlvdXNXYXJuT25jZU1lc3NhZ2VzLnB1c2gobWVzc2FnZSk7CiAgICAgIHdhcm4obWVzc2FnZSk7CiAgICB9CiAgfTsKICAvKioKICAgKiBTaG93IGEgb25lLXRpbWUgY29uc29sZSB3YXJuaW5nIGFib3V0IGRlcHJlY2F0ZWQgcGFyYW1zL21ldGhvZHMKICAgKi8KCiAgY29uc3Qgd2FybkFib3V0RGVwcmVjYXRpb24gPSAoZGVwcmVjYXRlZFBhcmFtLCB1c2VJbnN0ZWFkKSA9PiB7CiAgICB3YXJuT25jZSgiXCIiLmNvbmNhdChkZXByZWNhdGVkUGFyYW0sICJcIiBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS4gUGxlYXNlIHVzZSBcIiIpLmNvbmNhdCh1c2VJbnN0ZWFkLCAiXCIgaW5zdGVhZC4iKSk7CiAgfTsKICAvKioKICAgKiBJZiBgYXJnYCBpcyBhIGZ1bmN0aW9uLCBjYWxsIGl0ICh3aXRoIG5vIGFyZ3VtZW50cyBvciBjb250ZXh0KSBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCiAgICogT3RoZXJ3aXNlLCBqdXN0IHBhc3MgdGhlIHZhbHVlIHRocm91Z2gKICAgKiBAcGFyYW0gYXJnCiAgICovCgogIGNvbnN0IGNhbGxJZkZ1bmN0aW9uID0gYXJnID0+IHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbicgPyBhcmcoKSA6IGFyZzsKICBjb25zdCBoYXNUb1Byb21pc2VGbiA9IGFyZyA9PiBhcmcgJiYgdHlwZW9mIGFyZy50b1Byb21pc2UgPT09ICdmdW5jdGlvbic7CiAgY29uc3QgYXNQcm9taXNlID0gYXJnID0+IGhhc1RvUHJvbWlzZUZuKGFyZykgPyBhcmcudG9Qcm9taXNlKCkgOiBQcm9taXNlLnJlc29sdmUoYXJnKTsKICBjb25zdCBpc1Byb21pc2UgPSBhcmcgPT4gYXJnICYmIFByb21pc2UucmVzb2x2ZShhcmcpID09PSBhcmc7CiAgY29uc3QgZ2V0UmFuZG9tRWxlbWVudCA9IGFyciA9PiBhcnJbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYXJyLmxlbmd0aCldOwoKICBjb25zdCBkZWZhdWx0UGFyYW1zID0gewogICAgdGl0bGU6ICcnLAogICAgdGl0bGVUZXh0OiAnJywKICAgIHRleHQ6ICcnLAogICAgaHRtbDogJycsCiAgICBmb290ZXI6ICcnLAogICAgaWNvbjogdW5kZWZpbmVkLAogICAgaWNvbkNvbG9yOiB1bmRlZmluZWQsCiAgICBpY29uSHRtbDogdW5kZWZpbmVkLAogICAgdGVtcGxhdGU6IHVuZGVmaW5lZCwKICAgIHRvYXN0OiBmYWxzZSwKICAgIHNob3dDbGFzczogewogICAgICBwb3B1cDogJ3N3YWwyLXNob3cnLAogICAgICBiYWNrZHJvcDogJ3N3YWwyLWJhY2tkcm9wLXNob3cnLAogICAgICBpY29uOiAnc3dhbDItaWNvbi1zaG93JwogICAgfSwKICAgIGhpZGVDbGFzczogewogICAgICBwb3B1cDogJ3N3YWwyLWhpZGUnLAogICAgICBiYWNrZHJvcDogJ3N3YWwyLWJhY2tkcm9wLWhpZGUnLAogICAgICBpY29uOiAnc3dhbDItaWNvbi1oaWRlJwogICAgfSwKICAgIGN1c3RvbUNsYXNzOiB7fSwKICAgIHRhcmdldDogJ2JvZHknLAogICAgY29sb3I6IHVuZGVmaW5lZCwKICAgIGJhY2tkcm9wOiB0cnVlLAogICAgaGVpZ2h0QXV0bzogdHJ1ZSwKICAgIGFsbG93T3V0c2lkZUNsaWNrOiB0cnVlLAogICAgYWxsb3dFc2NhcGVLZXk6IHRydWUsCiAgICBhbGxvd0VudGVyS2V5OiB0cnVlLAogICAgc3RvcEtleWRvd25Qcm9wYWdhdGlvbjogdHJ1ZSwKICAgIGtleWRvd25MaXN0ZW5lckNhcHR1cmU6IGZhbHNlLAogICAgc2hvd0NvbmZpcm1CdXR0b246IHRydWUsCiAgICBzaG93RGVueUJ1dHRvbjogZmFsc2UsCiAgICBzaG93Q2FuY2VsQnV0dG9uOiBmYWxzZSwKICAgIHByZUNvbmZpcm06IHVuZGVmaW5lZCwKICAgIHByZURlbnk6IHVuZGVmaW5lZCwKICAgIGNvbmZpcm1CdXR0b25UZXh0OiAnT0snLAogICAgY29uZmlybUJ1dHRvbkFyaWFMYWJlbDogJycsCiAgICBjb25maXJtQnV0dG9uQ29sb3I6IHVuZGVmaW5lZCwKICAgIGRlbnlCdXR0b25UZXh0OiAnTm8nLAogICAgZGVueUJ1dHRvbkFyaWFMYWJlbDogJycsCiAgICBkZW55QnV0dG9uQ29sb3I6IHVuZGVmaW5lZCwKICAgIGNhbmNlbEJ1dHRvblRleHQ6ICdDYW5jZWwnLAogICAgY2FuY2VsQnV0dG9uQXJpYUxhYmVsOiAnJywKICAgIGNhbmNlbEJ1dHRvbkNvbG9yOiB1bmRlZmluZWQsCiAgICBidXR0b25zU3R5bGluZzogdHJ1ZSwKICAgIHJldmVyc2VCdXR0b25zOiBmYWxzZSwKICAgIGZvY3VzQ29uZmlybTogdHJ1ZSwKICAgIGZvY3VzRGVueTogZmFsc2UsCiAgICBmb2N1c0NhbmNlbDogZmFsc2UsCiAgICByZXR1cm5Gb2N1czogdHJ1ZSwKICAgIHNob3dDbG9zZUJ1dHRvbjogZmFsc2UsCiAgICBjbG9zZUJ1dHRvbkh0bWw6ICcmdGltZXM7JywKICAgIGNsb3NlQnV0dG9uQXJpYUxhYmVsOiAnQ2xvc2UgdGhpcyBkaWFsb2cnLAogICAgbG9hZGVySHRtbDogJycsCiAgICBzaG93TG9hZGVyT25Db25maXJtOiBmYWxzZSwKICAgIHNob3dMb2FkZXJPbkRlbnk6IGZhbHNlLAogICAgaW1hZ2VVcmw6IHVuZGVmaW5lZCwKICAgIGltYWdlV2lkdGg6IHVuZGVmaW5lZCwKICAgIGltYWdlSGVpZ2h0OiB1bmRlZmluZWQsCiAgICBpbWFnZUFsdDogJycsCiAgICB0aW1lcjogdW5kZWZpbmVkLAogICAgdGltZXJQcm9ncmVzc0JhcjogZmFsc2UsCiAgICB3aWR0aDogdW5kZWZpbmVkLAogICAgcGFkZGluZzogdW5kZWZpbmVkLAogICAgYmFja2dyb3VuZDogdW5kZWZpbmVkLAogICAgaW5wdXQ6IHVuZGVmaW5lZCwKICAgIGlucHV0UGxhY2Vob2xkZXI6ICcnLAogICAgaW5wdXRMYWJlbDogJycsCiAgICBpbnB1dFZhbHVlOiAnJywKICAgIGlucHV0T3B0aW9uczoge30sCiAgICBpbnB1dEF1dG9UcmltOiB0cnVlLAogICAgaW5wdXRBdHRyaWJ1dGVzOiB7fSwKICAgIGlucHV0VmFsaWRhdG9yOiB1bmRlZmluZWQsCiAgICByZXR1cm5JbnB1dFZhbHVlT25EZW55OiBmYWxzZSwKICAgIHZhbGlkYXRpb25NZXNzYWdlOiB1bmRlZmluZWQsCiAgICBncm93OiBmYWxzZSwKICAgIHBvc2l0aW9uOiAnY2VudGVyJywKICAgIHByb2dyZXNzU3RlcHM6IFtdLAogICAgY3VycmVudFByb2dyZXNzU3RlcDogdW5kZWZpbmVkLAogICAgcHJvZ3Jlc3NTdGVwc0Rpc3RhbmNlOiB1bmRlZmluZWQsCiAgICB3aWxsT3BlbjogdW5kZWZpbmVkLAogICAgZGlkT3BlbjogdW5kZWZpbmVkLAogICAgZGlkUmVuZGVyOiB1bmRlZmluZWQsCiAgICB3aWxsQ2xvc2U6IHVuZGVmaW5lZCwKICAgIGRpZENsb3NlOiB1bmRlZmluZWQsCiAgICBkaWREZXN0cm95OiB1bmRlZmluZWQsCiAgICBzY3JvbGxiYXJQYWRkaW5nOiB0cnVlCiAgfTsKICBjb25zdCB1cGRhdGFibGVQYXJhbXMgPSBbJ2FsbG93RXNjYXBlS2V5JywgJ2FsbG93T3V0c2lkZUNsaWNrJywgJ2JhY2tncm91bmQnLCAnYnV0dG9uc1N0eWxpbmcnLCAnY2FuY2VsQnV0dG9uQXJpYUxhYmVsJywgJ2NhbmNlbEJ1dHRvbkNvbG9yJywgJ2NhbmNlbEJ1dHRvblRleHQnLCAnY2xvc2VCdXR0b25BcmlhTGFiZWwnLCAnY2xvc2VCdXR0b25IdG1sJywgJ2NvbG9yJywgJ2NvbmZpcm1CdXR0b25BcmlhTGFiZWwnLCAnY29uZmlybUJ1dHRvbkNvbG9yJywgJ2NvbmZpcm1CdXR0b25UZXh0JywgJ2N1cnJlbnRQcm9ncmVzc1N0ZXAnLCAnY3VzdG9tQ2xhc3MnLCAnZGVueUJ1dHRvbkFyaWFMYWJlbCcsICdkZW55QnV0dG9uQ29sb3InLCAnZGVueUJ1dHRvblRleHQnLCAnZGlkQ2xvc2UnLCAnZGlkRGVzdHJveScsICdmb290ZXInLCAnaGlkZUNsYXNzJywgJ2h0bWwnLCAnaWNvbicsICdpY29uQ29sb3InLCAnaWNvbkh0bWwnLCAnaW1hZ2VBbHQnLCAnaW1hZ2VIZWlnaHQnLCAnaW1hZ2VVcmwnLCAnaW1hZ2VXaWR0aCcsICdwcmVDb25maXJtJywgJ3ByZURlbnknLCAncHJvZ3Jlc3NTdGVwcycsICdyZXR1cm5Gb2N1cycsICdyZXZlcnNlQnV0dG9ucycsICdzaG93Q2FuY2VsQnV0dG9uJywgJ3Nob3dDbG9zZUJ1dHRvbicsICdzaG93Q29uZmlybUJ1dHRvbicsICdzaG93RGVueUJ1dHRvbicsICd0ZXh0JywgJ3RpdGxlJywgJ3RpdGxlVGV4dCcsICd3aWxsQ2xvc2UnXTsKICBjb25zdCBkZXByZWNhdGVkUGFyYW1zID0ge307CiAgY29uc3QgdG9hc3RJbmNvbXBhdGlibGVQYXJhbXMgPSBbJ2FsbG93T3V0c2lkZUNsaWNrJywgJ2FsbG93RW50ZXJLZXknLCAnYmFja2Ryb3AnLCAnZm9jdXNDb25maXJtJywgJ2ZvY3VzRGVueScsICdmb2N1c0NhbmNlbCcsICdyZXR1cm5Gb2N1cycsICdoZWlnaHRBdXRvJywgJ2tleWRvd25MaXN0ZW5lckNhcHR1cmUnXTsKICAvKioKICAgKiBJcyB2YWxpZCBwYXJhbWV0ZXIKICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1OYW1lCiAgICovCgogIGNvbnN0IGlzVmFsaWRQYXJhbWV0ZXIgPSBwYXJhbU5hbWUgPT4gewogICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkZWZhdWx0UGFyYW1zLCBwYXJhbU5hbWUpOwogIH07CiAgLyoqCiAgICogSXMgdmFsaWQgcGFyYW1ldGVyIGZvciBTd2FsLnVwZGF0ZSgpIG1ldGhvZAogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbU5hbWUKICAgKi8KCiAgY29uc3QgaXNVcGRhdGFibGVQYXJhbWV0ZXIgPSBwYXJhbU5hbWUgPT4gewogICAgcmV0dXJuIHVwZGF0YWJsZVBhcmFtcy5pbmRleE9mKHBhcmFtTmFtZSkgIT09IC0xOwogIH07CiAgLyoqCiAgICogSXMgZGVwcmVjYXRlZCBwYXJhbWV0ZXIKICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1OYW1lCiAgICovCgogIGNvbnN0IGlzRGVwcmVjYXRlZFBhcmFtZXRlciA9IHBhcmFtTmFtZSA9PiB7CiAgICByZXR1cm4gZGVwcmVjYXRlZFBhcmFtc1twYXJhbU5hbWVdOwogIH07CgogIGNvbnN0IGNoZWNrSWZQYXJhbUlzVmFsaWQgPSBwYXJhbSA9PiB7CiAgICBpZiAoIWlzVmFsaWRQYXJhbWV0ZXIocGFyYW0pKSB7CiAgICAgIHdhcm4oIlVua25vd24gcGFyYW1ldGVyIFwiIi5jb25jYXQocGFyYW0sICJcIiIpKTsKICAgIH0KICB9OwoKICBjb25zdCBjaGVja0lmVG9hc3RQYXJhbUlzVmFsaWQgPSBwYXJhbSA9PiB7CiAgICBpZiAodG9hc3RJbmNvbXBhdGlibGVQYXJhbXMuaW5jbHVkZXMocGFyYW0pKSB7CiAgICAgIHdhcm4oIlRoZSBwYXJhbWV0ZXIgXCIiLmNvbmNhdChwYXJhbSwgIlwiIGlzIGluY29tcGF0aWJsZSB3aXRoIHRvYXN0cyIpKTsKICAgIH0KICB9OwoKICBjb25zdCBjaGVja0lmUGFyYW1Jc0RlcHJlY2F0ZWQgPSBwYXJhbSA9PiB7CiAgICBpZiAoaXNEZXByZWNhdGVkUGFyYW1ldGVyKHBhcmFtKSkgewogICAgICB3YXJuQWJvdXREZXByZWNhdGlvbihwYXJhbSwgaXNEZXByZWNhdGVkUGFyYW1ldGVyKHBhcmFtKSk7CiAgICB9CiAgfTsKICAvKioKICAgKiBTaG93IHJlbGV2YW50IHdhcm5pbmdzIGZvciBnaXZlbiBwYXJhbXMKICAgKgogICAqIEBwYXJhbSBwYXJhbXMKICAgKi8KCgogIGNvbnN0IHNob3dXYXJuaW5nc0ZvclBhcmFtcyA9IHBhcmFtcyA9PiB7CiAgICBpZiAoIXBhcmFtcy5iYWNrZHJvcCAmJiBwYXJhbXMuYWxsb3dPdXRzaWRlQ2xpY2spIHsKICAgICAgd2FybignImFsbG93T3V0c2lkZUNsaWNrIiBwYXJhbWV0ZXIgcmVxdWlyZXMgYGJhY2tkcm9wYCBwYXJhbWV0ZXIgdG8gYmUgc2V0IHRvIGB0cnVlYCcpOwogICAgfQoKICAgIGZvciAoY29uc3QgcGFyYW0gaW4gcGFyYW1zKSB7CiAgICAgIGNoZWNrSWZQYXJhbUlzVmFsaWQocGFyYW0pOwoKICAgICAgaWYgKHBhcmFtcy50b2FzdCkgewogICAgICAgIGNoZWNrSWZUb2FzdFBhcmFtSXNWYWxpZChwYXJhbSk7CiAgICAgIH0KCiAgICAgIGNoZWNrSWZQYXJhbUlzRGVwcmVjYXRlZChwYXJhbSk7CiAgICB9CiAgfTsKCiAgY29uc3Qgc3dhbFByZWZpeCA9ICdzd2FsMi0nOwogIGNvbnN0IHByZWZpeCA9IGl0ZW1zID0+IHsKICAgIGNvbnN0IHJlc3VsdCA9IHt9OwoKICAgIGZvciAoY29uc3QgaSBpbiBpdGVtcykgewogICAgICByZXN1bHRbaXRlbXNbaV1dID0gc3dhbFByZWZpeCArIGl0ZW1zW2ldOwogICAgfQoKICAgIHJldHVybiByZXN1bHQ7CiAgfTsKICBjb25zdCBzd2FsQ2xhc3NlcyA9IHByZWZpeChbJ2NvbnRhaW5lcicsICdzaG93bicsICdoZWlnaHQtYXV0bycsICdpb3NmaXgnLCAncG9wdXAnLCAnbW9kYWwnLCAnbm8tYmFja2Ryb3AnLCAnbm8tdHJhbnNpdGlvbicsICd0b2FzdCcsICd0b2FzdC1zaG93bicsICdzaG93JywgJ2hpZGUnLCAnY2xvc2UnLCAndGl0bGUnLCAnaHRtbC1jb250YWluZXInLCAnYWN0aW9ucycsICdjb25maXJtJywgJ2RlbnknLCAnY2FuY2VsJywgJ2RlZmF1bHQtb3V0bGluZScsICdmb290ZXInLCAnaWNvbicsICdpY29uLWNvbnRlbnQnLCAnaW1hZ2UnLCAnaW5wdXQnLCAnZmlsZScsICdyYW5nZScsICdzZWxlY3QnLCAncmFkaW8nLCAnY2hlY2tib3gnLCAnbGFiZWwnLCAndGV4dGFyZWEnLCAnaW5wdXRlcnJvcicsICdpbnB1dC1sYWJlbCcsICd2YWxpZGF0aW9uLW1lc3NhZ2UnLCAncHJvZ3Jlc3Mtc3RlcHMnLCAnYWN0aXZlLXByb2dyZXNzLXN0ZXAnLCAncHJvZ3Jlc3Mtc3RlcCcsICdwcm9ncmVzcy1zdGVwLWxpbmUnLCAnbG9hZGVyJywgJ2xvYWRpbmcnLCAnc3R5bGVkJywgJ3RvcCcsICd0b3Atc3RhcnQnLCAndG9wLWVuZCcsICd0b3AtbGVmdCcsICd0b3AtcmlnaHQnLCAnY2VudGVyJywgJ2NlbnRlci1zdGFydCcsICdjZW50ZXItZW5kJywgJ2NlbnRlci1sZWZ0JywgJ2NlbnRlci1yaWdodCcsICdib3R0b20nLCAnYm90dG9tLXN0YXJ0JywgJ2JvdHRvbS1lbmQnLCAnYm90dG9tLWxlZnQnLCAnYm90dG9tLXJpZ2h0JywgJ2dyb3ctcm93JywgJ2dyb3ctY29sdW1uJywgJ2dyb3ctZnVsbHNjcmVlbicsICdydGwnLCAndGltZXItcHJvZ3Jlc3MtYmFyJywgJ3RpbWVyLXByb2dyZXNzLWJhci1jb250YWluZXInLCAnc2Nyb2xsYmFyLW1lYXN1cmUnLCAnaWNvbi1zdWNjZXNzJywgJ2ljb24td2FybmluZycsICdpY29uLWluZm8nLCAnaWNvbi1xdWVzdGlvbicsICdpY29uLWVycm9yJywgJ25vLXdhciddKTsKICBjb25zdCBpY29uVHlwZXMgPSBwcmVmaXgoWydzdWNjZXNzJywgJ3dhcm5pbmcnLCAnaW5mbycsICdxdWVzdGlvbicsICdlcnJvciddKTsKCiAgLyoqCiAgICogR2V0cyB0aGUgcG9wdXAgY29udGFpbmVyIHdoaWNoIGNvbnRhaW5zIHRoZSBiYWNrZHJvcCBhbmQgdGhlIHBvcHVwIGl0c2VsZi4KICAgKgogICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudCB8IG51bGx9CiAgICovCgogIGNvbnN0IGdldENvbnRhaW5lciA9ICgpID0+IGRvY3VtZW50LmJvZHkucXVlcnlTZWxlY3RvcigiLiIuY29uY2F0KHN3YWxDbGFzc2VzLmNvbnRhaW5lcikpOwogIC8qKgogICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclN0cmluZwogICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudCB8IG51bGx9CiAgICovCgogIGNvbnN0IGVsZW1lbnRCeVNlbGVjdG9yID0gc2VsZWN0b3JTdHJpbmcgPT4gewogICAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7CiAgICByZXR1cm4gY29udGFpbmVyID8gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3JTdHJpbmcpIDogbnVsbDsKICB9OwogIC8qKgogICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUKICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnQgfCBudWxsfQogICAqLwoKICBjb25zdCBlbGVtZW50QnlDbGFzcyA9IGNsYXNzTmFtZSA9PiB7CiAgICByZXR1cm4gZWxlbWVudEJ5U2VsZWN0b3IoIi4iLmNvbmNhdChjbGFzc05hbWUpKTsKICB9OwogIC8qKgogICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudCB8IG51bGx9CiAgICovCgoKICBjb25zdCBnZXRQb3B1cCA9ICgpID0+IGVsZW1lbnRCeUNsYXNzKHN3YWxDbGFzc2VzLnBvcHVwKTsKICAvKioKICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnQgfCBudWxsfQogICAqLwoKICBjb25zdCBnZXRJY29uID0gKCkgPT4gZWxlbWVudEJ5Q2xhc3Moc3dhbENsYXNzZXMuaWNvbik7CiAgLyoqCiAgICogQHJldHVybnMge0hUTUxFbGVtZW50IHwgbnVsbH0KICAgKi8KCiAgY29uc3QgZ2V0VGl0bGUgPSAoKSA9PiBlbGVtZW50QnlDbGFzcyhzd2FsQ2xhc3Nlcy50aXRsZSk7CiAgLyoqCiAgICogQHJldHVybnMge0hUTUxFbGVtZW50IHwgbnVsbH0KICAgKi8KCiAgY29uc3QgZ2V0SHRtbENvbnRhaW5lciA9ICgpID0+IGVsZW1lbnRCeUNsYXNzKHN3YWxDbGFzc2VzWydodG1sLWNvbnRhaW5lciddKTsKICAvKioKICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnQgfCBudWxsfQogICAqLwoKICBjb25zdCBnZXRJbWFnZSA9ICgpID0+IGVsZW1lbnRCeUNsYXNzKHN3YWxDbGFzc2VzLmltYWdlKTsKICAvKioKICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnQgfCBudWxsfQogICAqLwoKICBjb25zdCBnZXRQcm9ncmVzc1N0ZXBzID0gKCkgPT4gZWxlbWVudEJ5Q2xhc3Moc3dhbENsYXNzZXNbJ3Byb2dyZXNzLXN0ZXBzJ10pOwogIC8qKgogICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudCB8IG51bGx9CiAgICovCgogIGNvbnN0IGdldFZhbGlkYXRpb25NZXNzYWdlID0gKCkgPT4gZWxlbWVudEJ5Q2xhc3Moc3dhbENsYXNzZXNbJ3ZhbGlkYXRpb24tbWVzc2FnZSddKTsKICAvKioKICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnQgfCBudWxsfQogICAqLwoKICBjb25zdCBnZXRDb25maXJtQnV0dG9uID0gKCkgPT4gZWxlbWVudEJ5U2VsZWN0b3IoIi4iLmNvbmNhdChzd2FsQ2xhc3Nlcy5hY3Rpb25zLCAiIC4iKS5jb25jYXQoc3dhbENsYXNzZXMuY29uZmlybSkpOwogIC8qKgogICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudCB8IG51bGx9CiAgICovCgogIGNvbnN0IGdldERlbnlCdXR0b24gPSAoKSA9PiBlbGVtZW50QnlTZWxlY3RvcigiLiIuY29uY2F0KHN3YWxDbGFzc2VzLmFjdGlvbnMsICIgLiIpLmNvbmNhdChzd2FsQ2xhc3Nlcy5kZW55KSk7CiAgLyoqCiAgICogQHJldHVybnMge0hUTUxFbGVtZW50IHwgbnVsbH0KICAgKi8KCiAgY29uc3QgZ2V0SW5wdXRMYWJlbCA9ICgpID0+IGVsZW1lbnRCeUNsYXNzKHN3YWxDbGFzc2VzWydpbnB1dC1sYWJlbCddKTsKICAvKioKICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnQgfCBudWxsfQogICAqLwoKICBjb25zdCBnZXRMb2FkZXIgPSAoKSA9PiBlbGVtZW50QnlTZWxlY3RvcigiLiIuY29uY2F0KHN3YWxDbGFzc2VzLmxvYWRlcikpOwogIC8qKgogICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudCB8IG51bGx9CiAgICovCgogIGNvbnN0IGdldENhbmNlbEJ1dHRvbiA9ICgpID0+IGVsZW1lbnRCeVNlbGVjdG9yKCIuIi5jb25jYXQoc3dhbENsYXNzZXMuYWN0aW9ucywgIiAuIikuY29uY2F0KHN3YWxDbGFzc2VzLmNhbmNlbCkpOwogIC8qKgogICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudCB8IG51bGx9CiAgICovCgogIGNvbnN0IGdldEFjdGlvbnMgPSAoKSA9PiBlbGVtZW50QnlDbGFzcyhzd2FsQ2xhc3Nlcy5hY3Rpb25zKTsKICAvKioKICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnQgfCBudWxsfQogICAqLwoKICBjb25zdCBnZXRGb290ZXIgPSAoKSA9PiBlbGVtZW50QnlDbGFzcyhzd2FsQ2xhc3Nlcy5mb290ZXIpOwogIC8qKgogICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudCB8IG51bGx9CiAgICovCgogIGNvbnN0IGdldFRpbWVyUHJvZ3Jlc3NCYXIgPSAoKSA9PiBlbGVtZW50QnlDbGFzcyhzd2FsQ2xhc3Nlc1sndGltZXItcHJvZ3Jlc3MtYmFyJ10pOwogIC8qKgogICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudCB8IG51bGx9CiAgICovCgogIGNvbnN0IGdldENsb3NlQnV0dG9uID0gKCkgPT4gZWxlbWVudEJ5Q2xhc3Moc3dhbENsYXNzZXMuY2xvc2UpOyAvLyBodHRwczovL2dpdGh1Yi5jb20vamt1cC9mb2N1c2FibGUvYmxvYi9tYXN0ZXIvaW5kZXguanMKCiAgY29uc3QgZm9jdXNhYmxlID0gIlxuICBhW2hyZWZdLFxuICBhcmVhW2hyZWZdLFxuICBpbnB1dDpub3QoW2Rpc2FibGVkXSksXG4gIHNlbGVjdDpub3QoW2Rpc2FibGVkXSksXG4gIHRleHRhcmVhOm5vdChbZGlzYWJsZWRdKSxcbiAgYnV0dG9uOm5vdChbZGlzYWJsZWRdKSxcbiAgaWZyYW1lLFxuICBvYmplY3QsXG4gIGVtYmVkLFxuICBbdGFiaW5kZXg9XCIwXCJdLFxuICBbY29udGVudGVkaXRhYmxlXSxcbiAgYXVkaW9bY29udHJvbHNdLFxuICB2aWRlb1tjb250cm9sc10sXG4gIHN1bW1hcnlcbiI7CiAgLyoqCiAgICogQHJldHVybnMge0hUTUxFbGVtZW50W119CiAgICovCgogIGNvbnN0IGdldEZvY3VzYWJsZUVsZW1lbnRzID0gKCkgPT4gewogICAgY29uc3QgZm9jdXNhYmxlRWxlbWVudHNXaXRoVGFiaW5kZXggPSB0b0FycmF5KGdldFBvcHVwKCkucXVlcnlTZWxlY3RvckFsbCgnW3RhYmluZGV4XTpub3QoW3RhYmluZGV4PSItMSJdKTpub3QoW3RhYmluZGV4PSIwIl0pJykpIC8vIHNvcnQgYWNjb3JkaW5nIHRvIHRhYmluZGV4CiAgICAuc29ydCgoYSwgYikgPT4gewogICAgICBjb25zdCB0YWJpbmRleEEgPSBwYXJzZUludChhLmdldEF0dHJpYnV0ZSgndGFiaW5kZXgnKSk7CiAgICAgIGNvbnN0IHRhYmluZGV4QiA9IHBhcnNlSW50KGIuZ2V0QXR0cmlidXRlKCd0YWJpbmRleCcpKTsKCiAgICAgIGlmICh0YWJpbmRleEEgPiB0YWJpbmRleEIpIHsKICAgICAgICByZXR1cm4gMTsKICAgICAgfSBlbHNlIGlmICh0YWJpbmRleEEgPCB0YWJpbmRleEIpIHsKICAgICAgICByZXR1cm4gLTE7CiAgICAgIH0KCiAgICAgIHJldHVybiAwOwogICAgfSk7CiAgICBjb25zdCBvdGhlckZvY3VzYWJsZUVsZW1lbnRzID0gdG9BcnJheShnZXRQb3B1cCgpLnF1ZXJ5U2VsZWN0b3JBbGwoZm9jdXNhYmxlKSkuZmlsdGVyKGVsID0+IGVsLmdldEF0dHJpYnV0ZSgndGFiaW5kZXgnKSAhPT0gJy0xJyk7CiAgICByZXR1cm4gdW5pcXVlQXJyYXkoZm9jdXNhYmxlRWxlbWVudHNXaXRoVGFiaW5kZXguY29uY2F0KG90aGVyRm9jdXNhYmxlRWxlbWVudHMpKS5maWx0ZXIoZWwgPT4gaXNWaXNpYmxlKGVsKSk7CiAgfTsKICAvKioKICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0KICAgKi8KCiAgY29uc3QgaXNNb2RhbCA9ICgpID0+IHsKICAgIHJldHVybiBoYXNDbGFzcyhkb2N1bWVudC5ib2R5LCBzd2FsQ2xhc3Nlcy5zaG93bikgJiYgIWhhc0NsYXNzKGRvY3VtZW50LmJvZHksIHN3YWxDbGFzc2VzWyd0b2FzdC1zaG93biddKSAmJiAhaGFzQ2xhc3MoZG9jdW1lbnQuYm9keSwgc3dhbENsYXNzZXNbJ25vLWJhY2tkcm9wJ10pOwogIH07CiAgLyoqCiAgICogQHJldHVybnMge2Jvb2xlYW59CiAgICovCgogIGNvbnN0IGlzVG9hc3QgPSAoKSA9PiB7CiAgICByZXR1cm4gZ2V0UG9wdXAoKSAmJiBoYXNDbGFzcyhnZXRQb3B1cCgpLCBzd2FsQ2xhc3Nlcy50b2FzdCk7CiAgfTsKICAvKioKICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0KICAgKi8KCiAgY29uc3QgaXNMb2FkaW5nID0gKCkgPT4gewogICAgcmV0dXJuIGdldFBvcHVwKCkuaGFzQXR0cmlidXRlKCdkYXRhLWxvYWRpbmcnKTsKICB9OwoKICBjb25zdCBzdGF0ZXMgPSB7CiAgICBwcmV2aW91c0JvZHlQYWRkaW5nOiBudWxsCiAgfTsKICAvKioKICAgKiBTZWN1cmVseSBzZXQgaW5uZXJIVE1MIG9mIGFuIGVsZW1lbnQKICAgKiBodHRwczovL2dpdGh1Yi5jb20vc3dlZXRhbGVydDIvc3dlZXRhbGVydDIvaXNzdWVzLzE5MjYKICAgKgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW0KICAgKiBAcGFyYW0ge3N0cmluZ30gaHRtbAogICAqLwoKICBjb25zdCBzZXRJbm5lckh0bWwgPSAoZWxlbSwgaHRtbCkgPT4gewogICAgZWxlbS50ZXh0Q29udGVudCA9ICcnOwoKICAgIGlmIChodG1sKSB7CiAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTsKICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhodG1sLCAidGV4dC9odG1sIik7CiAgICAgIHRvQXJyYXkocGFyc2VkLnF1ZXJ5U2VsZWN0b3IoJ2hlYWQnKS5jaGlsZE5vZGVzKS5mb3JFYWNoKGNoaWxkID0+IHsKICAgICAgICBlbGVtLmFwcGVuZENoaWxkKGNoaWxkKTsKICAgICAgfSk7CiAgICAgIHRvQXJyYXkocGFyc2VkLnF1ZXJ5U2VsZWN0b3IoJ2JvZHknKS5jaGlsZE5vZGVzKS5mb3JFYWNoKGNoaWxkID0+IHsKICAgICAgICBlbGVtLmFwcGVuZENoaWxkKGNoaWxkKTsKICAgICAgfSk7CiAgICB9CiAgfTsKICAvKioKICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtCiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZQogICAqIEByZXR1cm5zIHtib29sZWFufQogICAqLwoKICBjb25zdCBoYXNDbGFzcyA9IChlbGVtLCBjbGFzc05hbWUpID0+IHsKICAgIGlmICghY2xhc3NOYW1lKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBjb25zdCBjbGFzc0xpc3QgPSBjbGFzc05hbWUuc3BsaXQoL1xzKy8pOwoKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2xhc3NMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICghZWxlbS5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NMaXN0W2ldKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiB0cnVlOwogIH07CiAgLyoqCiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbQogICAqIEBwYXJhbSB7U3dlZXRBbGVydE9wdGlvbnN9IHBhcmFtcwogICAqLwoKICBjb25zdCByZW1vdmVDdXN0b21DbGFzc2VzID0gKGVsZW0sIHBhcmFtcykgPT4gewogICAgdG9BcnJheShlbGVtLmNsYXNzTGlzdCkuZm9yRWFjaChjbGFzc05hbWUgPT4gewogICAgICBpZiAoIU9iamVjdC52YWx1ZXMoc3dhbENsYXNzZXMpLmluY2x1ZGVzKGNsYXNzTmFtZSkgJiYgIU9iamVjdC52YWx1ZXMoaWNvblR5cGVzKS5pbmNsdWRlcyhjbGFzc05hbWUpICYmICFPYmplY3QudmFsdWVzKHBhcmFtcy5zaG93Q2xhc3MpLmluY2x1ZGVzKGNsYXNzTmFtZSkpIHsKICAgICAgICBlbGVtLmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTsKICAgICAgfQogICAgfSk7CiAgfTsKICAvKioKICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0T3B0aW9uc30gcGFyYW1zCiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZQogICAqLwoKCiAgY29uc3QgYXBwbHlDdXN0b21DbGFzcyA9IChlbGVtLCBwYXJhbXMsIGNsYXNzTmFtZSkgPT4gewogICAgcmVtb3ZlQ3VzdG9tQ2xhc3NlcyhlbGVtLCBwYXJhbXMpOwoKICAgIGlmIChwYXJhbXMuY3VzdG9tQ2xhc3MgJiYgcGFyYW1zLmN1c3RvbUNsYXNzW2NsYXNzTmFtZV0pIHsKICAgICAgaWYgKHR5cGVvZiBwYXJhbXMuY3VzdG9tQ2xhc3NbY2xhc3NOYW1lXSAhPT0gJ3N0cmluZycgJiYgIXBhcmFtcy5jdXN0b21DbGFzc1tjbGFzc05hbWVdLmZvckVhY2gpIHsKICAgICAgICByZXR1cm4gd2FybigiSW52YWxpZCB0eXBlIG9mIGN1c3RvbUNsYXNzLiIuY29uY2F0KGNsYXNzTmFtZSwgIiEgRXhwZWN0ZWQgc3RyaW5nIG9yIGl0ZXJhYmxlIG9iamVjdCwgZ290IFwiIikuY29uY2F0KHR5cGVvZiBwYXJhbXMuY3VzdG9tQ2xhc3NbY2xhc3NOYW1lXSwgIlwiIikpOwogICAgICB9CgogICAgICBhZGRDbGFzcyhlbGVtLCBwYXJhbXMuY3VzdG9tQ2xhc3NbY2xhc3NOYW1lXSk7CiAgICB9CiAgfTsKICAvKioKICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBwb3B1cAogICAqIEBwYXJhbSB7aW1wb3J0KCcuL3JlbmRlcmVycy9yZW5kZXJJbnB1dCcpLklucHV0Q2xhc3N9IGlucHV0Q2xhc3MKICAgKiBAcmV0dXJucyB7SFRNTElucHV0RWxlbWVudCB8IG51bGx9CiAgICovCgogIGNvbnN0IGdldElucHV0ID0gKHBvcHVwLCBpbnB1dENsYXNzKSA9PiB7CiAgICBpZiAoIWlucHV0Q2xhc3MpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgc3dpdGNoIChpbnB1dENsYXNzKSB7CiAgICAgIGNhc2UgJ3NlbGVjdCc6CiAgICAgIGNhc2UgJ3RleHRhcmVhJzoKICAgICAgY2FzZSAnZmlsZSc6CiAgICAgICAgcmV0dXJuIHBvcHVwLnF1ZXJ5U2VsZWN0b3IoIi4iLmNvbmNhdChzd2FsQ2xhc3Nlcy5wb3B1cCwgIiA+IC4iKS5jb25jYXQoc3dhbENsYXNzZXNbaW5wdXRDbGFzc10pKTsKCiAgICAgIGNhc2UgJ2NoZWNrYm94JzoKICAgICAgICByZXR1cm4gcG9wdXAucXVlcnlTZWxlY3RvcigiLiIuY29uY2F0KHN3YWxDbGFzc2VzLnBvcHVwLCAiID4gLiIpLmNvbmNhdChzd2FsQ2xhc3Nlcy5jaGVja2JveCwgIiBpbnB1dCIpKTsKCiAgICAgIGNhc2UgJ3JhZGlvJzoKICAgICAgICByZXR1cm4gcG9wdXAucXVlcnlTZWxlY3RvcigiLiIuY29uY2F0KHN3YWxDbGFzc2VzLnBvcHVwLCAiID4gLiIpLmNvbmNhdChzd2FsQ2xhc3Nlcy5yYWRpbywgIiBpbnB1dDpjaGVja2VkIikpIHx8IHBvcHVwLnF1ZXJ5U2VsZWN0b3IoIi4iLmNvbmNhdChzd2FsQ2xhc3Nlcy5wb3B1cCwgIiA+IC4iKS5jb25jYXQoc3dhbENsYXNzZXMucmFkaW8sICIgaW5wdXQ6Zmlyc3QtY2hpbGQiKSk7CgogICAgICBjYXNlICdyYW5nZSc6CiAgICAgICAgcmV0dXJuIHBvcHVwLnF1ZXJ5U2VsZWN0b3IoIi4iLmNvbmNhdChzd2FsQ2xhc3Nlcy5wb3B1cCwgIiA+IC4iKS5jb25jYXQoc3dhbENsYXNzZXMucmFuZ2UsICIgaW5wdXQiKSk7CgogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBwb3B1cC5xdWVyeVNlbGVjdG9yKCIuIi5jb25jYXQoc3dhbENsYXNzZXMucG9wdXAsICIgPiAuIikuY29uY2F0KHN3YWxDbGFzc2VzLmlucHV0KSk7CiAgICB9CiAgfTsKICAvKioKICAgKiBAcGFyYW0ge0hUTUxJbnB1dEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50IHwgSFRNTFNlbGVjdEVsZW1lbnR9IGlucHV0CiAgICovCgogIGNvbnN0IGZvY3VzSW5wdXQgPSBpbnB1dCA9PiB7CiAgICBpbnB1dC5mb2N1cygpOyAvLyBwbGFjZSBjdXJzb3IgYXQgZW5kIG9mIHRleHQgaW4gdGV4dCBpbnB1dAoKICAgIGlmIChpbnB1dC50eXBlICE9PSAnZmlsZScpIHsKICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjM0NTkxNQogICAgICBjb25zdCB2YWwgPSBpbnB1dC52YWx1ZTsKICAgICAgaW5wdXQudmFsdWUgPSAnJzsKICAgICAgaW5wdXQudmFsdWUgPSB2YWw7CiAgICB9CiAgfTsKICAvKioKICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50IHwgSFRNTEVsZW1lbnRbXSB8IG51bGx9IHRhcmdldAogICAqIEBwYXJhbSB7c3RyaW5nIHwgc3RyaW5nW10gfCByZWFkb25seSBzdHJpbmdbXX0gY2xhc3NMaXN0CiAgICogQHBhcmFtIHtib29sZWFufSBjb25kaXRpb24KICAgKi8KCiAgY29uc3QgdG9nZ2xlQ2xhc3MgPSAodGFyZ2V0LCBjbGFzc0xpc3QsIGNvbmRpdGlvbikgPT4gewogICAgaWYgKCF0YXJnZXQgfHwgIWNsYXNzTGlzdCkgewogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKHR5cGVvZiBjbGFzc0xpc3QgPT09ICdzdHJpbmcnKSB7CiAgICAgIGNsYXNzTGlzdCA9IGNsYXNzTGlzdC5zcGxpdCgvXHMrLykuZmlsdGVyKEJvb2xlYW4pOwogICAgfQoKICAgIGNsYXNzTGlzdC5mb3JFYWNoKGNsYXNzTmFtZSA9PiB7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRhcmdldCkpIHsKICAgICAgICB0YXJnZXQuZm9yRWFjaChlbGVtID0+IHsKICAgICAgICAgIGNvbmRpdGlvbiA/IGVsZW0uY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpIDogZWxlbS5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSk7CiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uZGl0aW9uID8gdGFyZ2V0LmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKSA6IHRhcmdldC5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSk7CiAgICAgIH0KICAgIH0pOwogIH07CiAgLyoqCiAgICogQHBhcmFtIHtIVE1MRWxlbWVudCB8IEhUTUxFbGVtZW50W10gfCBudWxsfSB0YXJnZXQKICAgKiBAcGFyYW0ge3N0cmluZyB8IHN0cmluZ1tdIHwgcmVhZG9ubHkgc3RyaW5nW119IGNsYXNzTGlzdAogICAqLwoKICBjb25zdCBhZGRDbGFzcyA9ICh0YXJnZXQsIGNsYXNzTGlzdCkgPT4gewogICAgdG9nZ2xlQ2xhc3ModGFyZ2V0LCBjbGFzc0xpc3QsIHRydWUpOwogIH07CiAgLyoqCiAgICogQHBhcmFtIHtIVE1MRWxlbWVudCB8IEhUTUxFbGVtZW50W10gfCBudWxsfSB0YXJnZXQKICAgKiBAcGFyYW0ge3N0cmluZyB8IHN0cmluZ1tdIHwgcmVhZG9ubHkgc3RyaW5nW119IGNsYXNzTGlzdAogICAqLwoKICBjb25zdCByZW1vdmVDbGFzcyA9ICh0YXJnZXQsIGNsYXNzTGlzdCkgPT4gewogICAgdG9nZ2xlQ2xhc3ModGFyZ2V0LCBjbGFzc0xpc3QsIGZhbHNlKTsKICB9OwogIC8qKgogICAqIEdldCBkaXJlY3QgY2hpbGQgb2YgYW4gZWxlbWVudCBieSBjbGFzcyBuYW1lCiAgICoKICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtCiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZQogICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudCB8IG51bGx9CiAgICovCgogIGNvbnN0IGdldERpcmVjdENoaWxkQnlDbGFzcyA9IChlbGVtLCBjbGFzc05hbWUpID0+IHsKICAgIGNvbnN0IGNoaWxkTm9kZXMgPSB0b0FycmF5KGVsZW0uY2hpbGROb2Rlcyk7CgogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmIChoYXNDbGFzcyhjaGlsZE5vZGVzW2ldLCBjbGFzc05hbWUpKSB7CiAgICAgICAgcmV0dXJuIGNoaWxkTm9kZXNbaV07CiAgICAgIH0KICAgIH0KICB9OwogIC8qKgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW0KICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkKICAgKiBAcGFyYW0geyp9IHZhbHVlCiAgICovCgogIGNvbnN0IGFwcGx5TnVtZXJpY2FsU3R5bGUgPSAoZWxlbSwgcHJvcGVydHksIHZhbHVlKSA9PiB7CiAgICBpZiAodmFsdWUgPT09ICIiLmNvbmNhdChwYXJzZUludCh2YWx1ZSkpKSB7CiAgICAgIHZhbHVlID0gcGFyc2VJbnQodmFsdWUpOwogICAgfQoKICAgIGlmICh2YWx1ZSB8fCBwYXJzZUludCh2YWx1ZSkgPT09IDApIHsKICAgICAgZWxlbS5zdHlsZVtwcm9wZXJ0eV0gPSB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInID8gIiIuY29uY2F0KHZhbHVlLCAicHgiKSA6IHZhbHVlOwogICAgfSBlbHNlIHsKICAgICAgZWxlbS5zdHlsZS5yZW1vdmVQcm9wZXJ0eShwcm9wZXJ0eSk7CiAgICB9CiAgfTsKICAvKioKICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtCiAgICogQHBhcmFtIHtzdHJpbmd9IGRpc3BsYXkKICAgKi8KCiAgY29uc3Qgc2hvdyA9IGZ1bmN0aW9uIChlbGVtKSB7CiAgICBsZXQgZGlzcGxheSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogJ2ZsZXgnOwogICAgZWxlbS5zdHlsZS5kaXNwbGF5ID0gZGlzcGxheTsKICB9OwogIC8qKgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW0KICAgKi8KCiAgY29uc3QgaGlkZSA9IGVsZW0gPT4gewogICAgZWxlbS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogIH07CiAgLyoqCiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcGFyZW50CiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yCiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5CiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlCiAgICovCgogIGNvbnN0IHNldFN0eWxlID0gKHBhcmVudCwgc2VsZWN0b3IsIHByb3BlcnR5LCB2YWx1ZSkgPT4gewogICAgLyoqIEB0eXBlIHtIVE1MRWxlbWVudH0gKi8KICAgIGNvbnN0IGVsID0gcGFyZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpOwoKICAgIGlmIChlbCkgewogICAgICBlbC5zdHlsZVtwcm9wZXJ0eV0gPSB2YWx1ZTsKICAgIH0KICB9OwogIC8qKgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW0KICAgKiBAcGFyYW0ge2FueX0gY29uZGl0aW9uCiAgICogQHBhcmFtIHtzdHJpbmd9IGRpc3BsYXkKICAgKi8KCiAgY29uc3QgdG9nZ2xlID0gZnVuY3Rpb24gKGVsZW0sIGNvbmRpdGlvbikgewogICAgbGV0IGRpc3BsYXkgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6ICdmbGV4JzsKICAgIGNvbmRpdGlvbiA/IHNob3coZWxlbSwgZGlzcGxheSkgOiBoaWRlKGVsZW0pOwogIH07CiAgLyoqCiAgICogYm9ycm93ZWQgZnJvbSBqcXVlcnkgJChlbGVtKS5pcygnOnZpc2libGUnKSBpbXBsZW1lbnRhdGlvbgogICAqCiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbQogICAqIEByZXR1cm5zIHtib29sZWFufQogICAqLwoKICBjb25zdCBpc1Zpc2libGUgPSBlbGVtID0+ICEhKGVsZW0gJiYgKGVsZW0ub2Zmc2V0V2lkdGggfHwgZWxlbS5vZmZzZXRIZWlnaHQgfHwgZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCkpOwogIC8qKgogICAqIEByZXR1cm5zIHtib29sZWFufQogICAqLwoKICBjb25zdCBhbGxCdXR0b25zQXJlSGlkZGVuID0gKCkgPT4gIWlzVmlzaWJsZShnZXRDb25maXJtQnV0dG9uKCkpICYmICFpc1Zpc2libGUoZ2V0RGVueUJ1dHRvbigpKSAmJiAhaXNWaXNpYmxlKGdldENhbmNlbEJ1dHRvbigpKTsKICAvKioKICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0KICAgKi8KCiAgY29uc3QgaXNTY3JvbGxhYmxlID0gZWxlbSA9PiAhIShlbGVtLnNjcm9sbEhlaWdodCA+IGVsZW0uY2xpZW50SGVpZ2h0KTsKICAvKioKICAgKiBib3Jyb3dlZCBmcm9tIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS80NjM1MjExOQogICAqCiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbQogICAqIEByZXR1cm5zIHtib29sZWFufQogICAqLwoKICBjb25zdCBoYXNDc3NBbmltYXRpb24gPSBlbGVtID0+IHsKICAgIGNvbnN0IHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbSk7CiAgICBjb25zdCBhbmltRHVyYXRpb24gPSBwYXJzZUZsb2F0KHN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2FuaW1hdGlvbi1kdXJhdGlvbicpIHx8ICcwJyk7CiAgICBjb25zdCB0cmFuc0R1cmF0aW9uID0gcGFyc2VGbG9hdChzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCd0cmFuc2l0aW9uLWR1cmF0aW9uJykgfHwgJzAnKTsKICAgIHJldHVybiBhbmltRHVyYXRpb24gPiAwIHx8IHRyYW5zRHVyYXRpb24gPiAwOwogIH07CiAgLyoqCiAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWVyCiAgICogQHBhcmFtIHtib29sZWFufSByZXNldAogICAqLwoKICBjb25zdCBhbmltYXRlVGltZXJQcm9ncmVzc0JhciA9IGZ1bmN0aW9uICh0aW1lcikgewogICAgbGV0IHJlc2V0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTsKICAgIGNvbnN0IHRpbWVyUHJvZ3Jlc3NCYXIgPSBnZXRUaW1lclByb2dyZXNzQmFyKCk7CgogICAgaWYgKGlzVmlzaWJsZSh0aW1lclByb2dyZXNzQmFyKSkgewogICAgICBpZiAocmVzZXQpIHsKICAgICAgICB0aW1lclByb2dyZXNzQmFyLnN0eWxlLnRyYW5zaXRpb24gPSAnbm9uZSc7CiAgICAgICAgdGltZXJQcm9ncmVzc0Jhci5zdHlsZS53aWR0aCA9ICcxMDAlJzsKICAgICAgfQoKICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgdGltZXJQcm9ncmVzc0Jhci5zdHlsZS50cmFuc2l0aW9uID0gIndpZHRoICIuY29uY2F0KHRpbWVyIC8gMTAwMCwgInMgbGluZWFyIik7CiAgICAgICAgdGltZXJQcm9ncmVzc0Jhci5zdHlsZS53aWR0aCA9ICcwJSc7CiAgICAgIH0sIDEwKTsKICAgIH0KICB9OwogIGNvbnN0IHN0b3BUaW1lclByb2dyZXNzQmFyID0gKCkgPT4gewogICAgY29uc3QgdGltZXJQcm9ncmVzc0JhciA9IGdldFRpbWVyUHJvZ3Jlc3NCYXIoKTsKICAgIGNvbnN0IHRpbWVyUHJvZ3Jlc3NCYXJXaWR0aCA9IHBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRpbWVyUHJvZ3Jlc3NCYXIpLndpZHRoKTsKICAgIHRpbWVyUHJvZ3Jlc3NCYXIuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ3RyYW5zaXRpb24nKTsKICAgIHRpbWVyUHJvZ3Jlc3NCYXIuc3R5bGUud2lkdGggPSAnMTAwJSc7CiAgICBjb25zdCB0aW1lclByb2dyZXNzQmFyRnVsbFdpZHRoID0gcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUodGltZXJQcm9ncmVzc0Jhcikud2lkdGgpOwogICAgY29uc3QgdGltZXJQcm9ncmVzc0JhclBlcmNlbnQgPSB0aW1lclByb2dyZXNzQmFyV2lkdGggLyB0aW1lclByb2dyZXNzQmFyRnVsbFdpZHRoICogMTAwOwogICAgdGltZXJQcm9ncmVzc0Jhci5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgndHJhbnNpdGlvbicpOwogICAgdGltZXJQcm9ncmVzc0Jhci5zdHlsZS53aWR0aCA9ICIiLmNvbmNhdCh0aW1lclByb2dyZXNzQmFyUGVyY2VudCwgIiUiKTsKICB9OwoKICAvKioKICAgKiBEZXRlY3QgTm9kZSBlbnYKICAgKgogICAqIEByZXR1cm5zIHtib29sZWFufQogICAqLwogIGNvbnN0IGlzTm9kZUVudiA9ICgpID0+IHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCc7CgogIGNvbnN0IFJFU1RPUkVfRk9DVVNfVElNRU9VVCA9IDEwMDsKCiAgLyoqIEB0eXBlIHtHbG9iYWxTdGF0ZX0gKi8KCiAgY29uc3QgZ2xvYmFsU3RhdGUgPSB7fTsKCiAgY29uc3QgZm9jdXNQcmV2aW91c0FjdGl2ZUVsZW1lbnQgPSAoKSA9PiB7CiAgICBpZiAoZ2xvYmFsU3RhdGUucHJldmlvdXNBY3RpdmVFbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHsKICAgICAgZ2xvYmFsU3RhdGUucHJldmlvdXNBY3RpdmVFbGVtZW50LmZvY3VzKCk7CiAgICAgIGdsb2JhbFN0YXRlLnByZXZpb3VzQWN0aXZlRWxlbWVudCA9IG51bGw7CiAgICB9IGVsc2UgaWYgKGRvY3VtZW50LmJvZHkpIHsKICAgICAgZG9jdW1lbnQuYm9keS5mb2N1cygpOwogICAgfQogIH07CiAgLyoqCiAgICogUmVzdG9yZSBwcmV2aW91cyBhY3RpdmUgKGZvY3VzZWQpIGVsZW1lbnQKICAgKgogICAqIEBwYXJhbSB7Ym9vbGVhbn0gcmV0dXJuRm9jdXMKICAgKiBAcmV0dXJucyB7UHJvbWlzZX0KICAgKi8KCgogIGNvbnN0IHJlc3RvcmVBY3RpdmVFbGVtZW50ID0gcmV0dXJuRm9jdXMgPT4gewogICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gewogICAgICBpZiAoIXJldHVybkZvY3VzKSB7CiAgICAgICAgcmV0dXJuIHJlc29sdmUoKTsKICAgICAgfQoKICAgICAgY29uc3QgeCA9IHdpbmRvdy5zY3JvbGxYOwogICAgICBjb25zdCB5ID0gd2luZG93LnNjcm9sbFk7CiAgICAgIGdsb2JhbFN0YXRlLnJlc3RvcmVGb2N1c1RpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICBmb2N1c1ByZXZpb3VzQWN0aXZlRWxlbWVudCgpOwogICAgICAgIHJlc29sdmUoKTsKICAgICAgfSwgUkVTVE9SRV9GT0NVU19USU1FT1VUKTsgLy8gaXNzdWVzLzkwMAoKICAgICAgd2luZG93LnNjcm9sbFRvKHgsIHkpOwogICAgfSk7CiAgfTsKCiAgY29uc3Qgc3dlZXRIVE1MID0gIlxuIDxkaXYgYXJpYS1sYWJlbGxlZGJ5PVwiIi5jb25jYXQoc3dhbENsYXNzZXMudGl0bGUsICJcIiBhcmlhLWRlc2NyaWJlZGJ5PVwiIikuY29uY2F0KHN3YWxDbGFzc2VzWydodG1sLWNvbnRhaW5lciddLCAiXCIgY2xhc3M9XCIiKS5jb25jYXQoc3dhbENsYXNzZXMucG9wdXAsICJcIiB0YWJpbmRleD1cIi0xXCI+XG4gICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIiIpLmNvbmNhdChzd2FsQ2xhc3Nlcy5jbG9zZSwgIlwiPjwvYnV0dG9uPlxuICAgPHVsIGNsYXNzPVwiIikuY29uY2F0KHN3YWxDbGFzc2VzWydwcm9ncmVzcy1zdGVwcyddLCAiXCI+PC91bD5cbiAgIDxkaXYgY2xhc3M9XCIiKS5jb25jYXQoc3dhbENsYXNzZXMuaWNvbiwgIlwiPjwvZGl2PlxuICAgPGltZyBjbGFzcz1cIiIpLmNvbmNhdChzd2FsQ2xhc3Nlcy5pbWFnZSwgIlwiIC8+XG4gICA8aDIgY2xhc3M9XCIiKS5jb25jYXQoc3dhbENsYXNzZXMudGl0bGUsICJcIiBpZD1cIiIpLmNvbmNhdChzd2FsQ2xhc3Nlcy50aXRsZSwgIlwiPjwvaDI+XG4gICA8ZGl2IGNsYXNzPVwiIikuY29uY2F0KHN3YWxDbGFzc2VzWydodG1sLWNvbnRhaW5lciddLCAiXCIgaWQ9XCIiKS5jb25jYXQoc3dhbENsYXNzZXNbJ2h0bWwtY29udGFpbmVyJ10sICJcIj48L2Rpdj5cbiAgIDxpbnB1dCBjbGFzcz1cIiIpLmNvbmNhdChzd2FsQ2xhc3Nlcy5pbnB1dCwgIlwiIC8+XG4gICA8aW5wdXQgdHlwZT1cImZpbGVcIiBjbGFzcz1cIiIpLmNvbmNhdChzd2FsQ2xhc3Nlcy5maWxlLCAiXCIgLz5cbiAgIDxkaXYgY2xhc3M9XCIiKS5jb25jYXQoc3dhbENsYXNzZXMucmFuZ2UsICJcIj5cbiAgICAgPGlucHV0IHR5cGU9XCJyYW5nZVwiIC8+XG4gICAgIDxvdXRwdXQ+PC9vdXRwdXQ+XG4gICA8L2Rpdj5cbiAgIDxzZWxlY3QgY2xhc3M9XCIiKS5jb25jYXQoc3dhbENsYXNzZXMuc2VsZWN0LCAiXCI+PC9zZWxlY3Q+XG4gICA8ZGl2IGNsYXNzPVwiIikuY29uY2F0KHN3YWxDbGFzc2VzLnJhZGlvLCAiXCI+PC9kaXY+XG4gICA8bGFiZWwgZm9yPVwiIikuY29uY2F0KHN3YWxDbGFzc2VzLmNoZWNrYm94LCAiXCIgY2xhc3M9XCIiKS5jb25jYXQoc3dhbENsYXNzZXMuY2hlY2tib3gsICJcIj5cbiAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIC8+XG4gICAgIDxzcGFuIGNsYXNzPVwiIikuY29uY2F0KHN3YWxDbGFzc2VzLmxhYmVsLCAiXCI+PC9zcGFuPlxuICAgPC9sYWJlbD5cbiAgIDx0ZXh0YXJlYSBjbGFzcz1cIiIpLmNvbmNhdChzd2FsQ2xhc3Nlcy50ZXh0YXJlYSwgIlwiPjwvdGV4dGFyZWE+XG4gICA8ZGl2IGNsYXNzPVwiIikuY29uY2F0KHN3YWxDbGFzc2VzWyd2YWxpZGF0aW9uLW1lc3NhZ2UnXSwgIlwiIGlkPVwiIikuY29uY2F0KHN3YWxDbGFzc2VzWyd2YWxpZGF0aW9uLW1lc3NhZ2UnXSwgIlwiPjwvZGl2PlxuICAgPGRpdiBjbGFzcz1cIiIpLmNvbmNhdChzd2FsQ2xhc3Nlcy5hY3Rpb25zLCAiXCI+XG4gICAgIDxkaXYgY2xhc3M9XCIiKS5jb25jYXQoc3dhbENsYXNzZXMubG9hZGVyLCAiXCI+PC9kaXY+XG4gICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiIikuY29uY2F0KHN3YWxDbGFzc2VzLmNvbmZpcm0sICJcIj48L2J1dHRvbj5cbiAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCIiKS5jb25jYXQoc3dhbENsYXNzZXMuZGVueSwgIlwiPjwvYnV0dG9uPlxuICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIiIpLmNvbmNhdChzd2FsQ2xhc3Nlcy5jYW5jZWwsICJcIj48L2J1dHRvbj5cbiAgIDwvZGl2PlxuICAgPGRpdiBjbGFzcz1cIiIpLmNvbmNhdChzd2FsQ2xhc3Nlcy5mb290ZXIsICJcIj48L2Rpdj5cbiAgIDxkaXYgY2xhc3M9XCIiKS5jb25jYXQoc3dhbENsYXNzZXNbJ3RpbWVyLXByb2dyZXNzLWJhci1jb250YWluZXInXSwgIlwiPlxuICAgICA8ZGl2IGNsYXNzPVwiIikuY29uY2F0KHN3YWxDbGFzc2VzWyd0aW1lci1wcm9ncmVzcy1iYXInXSwgIlwiPjwvZGl2PlxuICAgPC9kaXY+XG4gPC9kaXY+XG4iKS5yZXBsYWNlKC8oXnxcbilccyovZywgJycpOwogIC8qKgogICAqIEByZXR1cm5zIHtib29sZWFufQogICAqLwoKICBjb25zdCByZXNldE9sZENvbnRhaW5lciA9ICgpID0+IHsKICAgIGNvbnN0IG9sZENvbnRhaW5lciA9IGdldENvbnRhaW5lcigpOwoKICAgIGlmICghb2xkQ29udGFpbmVyKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBvbGRDb250YWluZXIucmVtb3ZlKCk7CiAgICByZW1vdmVDbGFzcyhbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBkb2N1bWVudC5ib2R5XSwgW3N3YWxDbGFzc2VzWyduby1iYWNrZHJvcCddLCBzd2FsQ2xhc3Nlc1sndG9hc3Qtc2hvd24nXSwgc3dhbENsYXNzZXNbJ2hhcy1jb2x1bW4nXV0pOwogICAgcmV0dXJuIHRydWU7CiAgfTsKCiAgY29uc3QgcmVzZXRWYWxpZGF0aW9uTWVzc2FnZSA9ICgpID0+IHsKICAgIGdsb2JhbFN0YXRlLmN1cnJlbnRJbnN0YW5jZS5yZXNldFZhbGlkYXRpb25NZXNzYWdlKCk7CiAgfTsKCiAgY29uc3QgYWRkSW5wdXRDaGFuZ2VMaXN0ZW5lcnMgPSAoKSA9PiB7CiAgICBjb25zdCBwb3B1cCA9IGdldFBvcHVwKCk7CiAgICBjb25zdCBpbnB1dCA9IGdldERpcmVjdENoaWxkQnlDbGFzcyhwb3B1cCwgc3dhbENsYXNzZXMuaW5wdXQpOwogICAgY29uc3QgZmlsZSA9IGdldERpcmVjdENoaWxkQnlDbGFzcyhwb3B1cCwgc3dhbENsYXNzZXMuZmlsZSk7CiAgICAvKiogQHR5cGUge0hUTUxJbnB1dEVsZW1lbnR9ICovCgogICAgY29uc3QgcmFuZ2UgPSBwb3B1cC5xdWVyeVNlbGVjdG9yKCIuIi5jb25jYXQoc3dhbENsYXNzZXMucmFuZ2UsICIgaW5wdXQiKSk7CiAgICAvKiogQHR5cGUge0hUTUxPdXRwdXRFbGVtZW50fSAqLwoKICAgIGNvbnN0IHJhbmdlT3V0cHV0ID0gcG9wdXAucXVlcnlTZWxlY3RvcigiLiIuY29uY2F0KHN3YWxDbGFzc2VzLnJhbmdlLCAiIG91dHB1dCIpKTsKICAgIGNvbnN0IHNlbGVjdCA9IGdldERpcmVjdENoaWxkQnlDbGFzcyhwb3B1cCwgc3dhbENsYXNzZXMuc2VsZWN0KTsKICAgIC8qKiBAdHlwZSB7SFRNTElucHV0RWxlbWVudH0gKi8KCiAgICBjb25zdCBjaGVja2JveCA9IHBvcHVwLnF1ZXJ5U2VsZWN0b3IoIi4iLmNvbmNhdChzd2FsQ2xhc3Nlcy5jaGVja2JveCwgIiBpbnB1dCIpKTsKICAgIGNvbnN0IHRleHRhcmVhID0gZ2V0RGlyZWN0Q2hpbGRCeUNsYXNzKHBvcHVwLCBzd2FsQ2xhc3Nlcy50ZXh0YXJlYSk7CiAgICBpbnB1dC5vbmlucHV0ID0gcmVzZXRWYWxpZGF0aW9uTWVzc2FnZTsKICAgIGZpbGUub25jaGFuZ2UgPSByZXNldFZhbGlkYXRpb25NZXNzYWdlOwogICAgc2VsZWN0Lm9uY2hhbmdlID0gcmVzZXRWYWxpZGF0aW9uTWVzc2FnZTsKICAgIGNoZWNrYm94Lm9uY2hhbmdlID0gcmVzZXRWYWxpZGF0aW9uTWVzc2FnZTsKICAgIHRleHRhcmVhLm9uaW5wdXQgPSByZXNldFZhbGlkYXRpb25NZXNzYWdlOwoKICAgIHJhbmdlLm9uaW5wdXQgPSAoKSA9PiB7CiAgICAgIHJlc2V0VmFsaWRhdGlvbk1lc3NhZ2UoKTsKICAgICAgcmFuZ2VPdXRwdXQudmFsdWUgPSByYW5nZS52YWx1ZTsKICAgIH07CgogICAgcmFuZ2Uub25jaGFuZ2UgPSAoKSA9PiB7CiAgICAgIHJlc2V0VmFsaWRhdGlvbk1lc3NhZ2UoKTsKICAgICAgcmFuZ2VPdXRwdXQudmFsdWUgPSByYW5nZS52YWx1ZTsKICAgIH07CiAgfTsKICAvKioKICAgKiBAcGFyYW0ge3N0cmluZyB8IEhUTUxFbGVtZW50fSB0YXJnZXQKICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR9CiAgICovCgoKICBjb25zdCBnZXRUYXJnZXQgPSB0YXJnZXQgPT4gdHlwZW9mIHRhcmdldCA9PT0gJ3N0cmluZycgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRhcmdldCkgOiB0YXJnZXQ7CiAgLyoqCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0T3B0aW9uc30gcGFyYW1zCiAgICovCgoKICBjb25zdCBzZXR1cEFjY2Vzc2liaWxpdHkgPSBwYXJhbXMgPT4gewogICAgY29uc3QgcG9wdXAgPSBnZXRQb3B1cCgpOwogICAgcG9wdXAuc2V0QXR0cmlidXRlKCdyb2xlJywgcGFyYW1zLnRvYXN0ID8gJ2FsZXJ0JyA6ICdkaWFsb2cnKTsKICAgIHBvcHVwLnNldEF0dHJpYnV0ZSgnYXJpYS1saXZlJywgcGFyYW1zLnRvYXN0ID8gJ3BvbGl0ZScgOiAnYXNzZXJ0aXZlJyk7CgogICAgaWYgKCFwYXJhbXMudG9hc3QpIHsKICAgICAgcG9wdXAuc2V0QXR0cmlidXRlKCdhcmlhLW1vZGFsJywgJ3RydWUnKTsKICAgIH0KICB9OwogIC8qKgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHRhcmdldEVsZW1lbnQKICAgKi8KCgogIGNvbnN0IHNldHVwUlRMID0gdGFyZ2V0RWxlbWVudCA9PiB7CiAgICBpZiAod2luZG93LmdldENvbXB1dGVkU3R5bGUodGFyZ2V0RWxlbWVudCkuZGlyZWN0aW9uID09PSAncnRsJykgewogICAgICBhZGRDbGFzcyhnZXRDb250YWluZXIoKSwgc3dhbENsYXNzZXMucnRsKTsKICAgIH0KICB9OwogIC8qKgogICAqIEFkZCBtb2RhbCArIGJhY2tkcm9wICsgbm8td2FyIG1lc3NhZ2UgZm9yIFJ1c3NpYW5zIHRvIERPTQogICAqCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0T3B0aW9uc30gcGFyYW1zCiAgICovCgoKICBjb25zdCBpbml0ID0gcGFyYW1zID0+IHsKICAgIC8vIENsZWFuIHVwIHRoZSBvbGQgcG9wdXAgY29udGFpbmVyIGlmIGl0IGV4aXN0cwogICAgY29uc3Qgb2xkQ29udGFpbmVyRXhpc3RlZCA9IHJlc2V0T2xkQ29udGFpbmVyKCk7CiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KCiAgICBpZiAoaXNOb2RlRW52KCkpIHsKICAgICAgZXJyb3IoJ1N3ZWV0QWxlcnQyIHJlcXVpcmVzIGRvY3VtZW50IHRvIGluaXRpYWxpemUnKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgY29udGFpbmVyLmNsYXNzTmFtZSA9IHN3YWxDbGFzc2VzLmNvbnRhaW5lcjsKCiAgICBpZiAob2xkQ29udGFpbmVyRXhpc3RlZCkgewogICAgICBhZGRDbGFzcyhjb250YWluZXIsIHN3YWxDbGFzc2VzWyduby10cmFuc2l0aW9uJ10pOwogICAgfQoKICAgIHNldElubmVySHRtbChjb250YWluZXIsIHN3ZWV0SFRNTCk7CiAgICBjb25zdCB0YXJnZXRFbGVtZW50ID0gZ2V0VGFyZ2V0KHBhcmFtcy50YXJnZXQpOwogICAgdGFyZ2V0RWxlbWVudC5hcHBlbmRDaGlsZChjb250YWluZXIpOwogICAgc2V0dXBBY2Nlc3NpYmlsaXR5KHBhcmFtcyk7CiAgICBzZXR1cFJUTCh0YXJnZXRFbGVtZW50KTsKICAgIGFkZElucHV0Q2hhbmdlTGlzdGVuZXJzKCk7CiAgICBub1dhck1lc3NhZ2VGb3JSdXNzaWFucyhjb250YWluZXIsIHBhcmFtcyk7CiAgfTsKICAvKioKICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjb250YWluZXIKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnRPcHRpb25zfSBwYXJhbXMKICAgKi8KCiAgY29uc3Qgbm9XYXJNZXNzYWdlRm9yUnVzc2lhbnMgPSAoY29udGFpbmVyLCBwYXJhbXMpID0+IHsKICAgIGlmIChwYXJhbXMudG9hc3QpIHsKICAgICAgcmV0dXJuOwogICAgfSAvLyBUaGlzIG1lc3NhZ2UgaXMgdGFyZ2V0ZWQgYXQgcGVvcGxlIHdobyBhcmUgY29ycnVwdGVkIGJ5IHByb3BhZ2FuZGEsIGV2ZXJ5Ym9keSBlbHNlCiAgICAvLyBpcyBhbHJlYWR5IGFnYWluc3Qgd2FyIGVpdGhlciBzaWxlbnRseSBvciBhY3RpdmVseS4KICAgIC8vCiAgICAvLyBUaGUgcG9pbnQgaXMgdG8gd3JhcCB0aGUgdHJ1dGgtYm9tYiBpbnRvIGEgcGF0cmlvdGljIHRpdGxlIHNvIHRoZXkgd2lsbCBhY3R1YWxseSBjbGljayBpdAogICAgLy8gYW5kIGxpc3RlbiB0byB0aGUgdW5jb21mb3J0YWJsZSB0cnV0aCBhYm91dCB0aGUgd2FyIGZyb20gdGhlIHBlb3BsZSB0aGV5IGxvdmUgb3IgcmVzcGVjdC4KCgogICAgY29uc3QgbWVzc2FnZSA9IGdldFJhbmRvbUVsZW1lbnQoW3sKICAgICAgdGV4dDogJ9Co0JLQkNCg0KbQldCd0JXQk9CT0JXQoCDQvtCx0YDQsNGC0LjQu9GB0Y8gPGJyPiDQuiDQoNCj0KHQodCa0J7QnNCjINCd0JDQoNCe0JTQoyDQviDQstC+0LnQvdC1JywKICAgICAgLy8gQXJub2xkIGlzIGxvdmVkIGluIFJ1c3NpYSBieSBhbGwgcGVvcGxlIGluY2x1ZGluZyB0aG9zZSB3aG8gYXJlIGZvciB0aGlzIHdhcgogICAgICAvLyBIaXMgc3BlZWNoIG1pZ2h0IGNoYW5nZSB0aGUgbWluZCBvZiB0aG9zZSB3aG8gYXJlIGJyYWlud2FzaGVkIGJ5IHByb3BhZ2FuZGEKICAgICAgeW91dHViZUlkOiAnZldDbFhaZDljNzgnCiAgICB9LCB7CiAgICAgIHRleHQ6ICfQoNCj0KHQodCa0JjQmSDQn9CQ0KLQoNCY0J7QoiA8YnI+INC+0YLQutGA0YvQuyDQs9C70LDQstC90YPRjiDRgtCw0LnQvdGDINGB0L/QtdGG0L7Qv9C10YDQsNGG0LjQuCcsCiAgICAgIC8vIEluIHRoaXMgdmlkZW8gb25lIG9mIHRoZSBtb3N0IGZhbW91cyBSdXNzaWFuIG5hdGlvbmFsaXN0IGxlYWRlcnMsIERtaXRyeSBEZW11c2hraW4sCiAgICAgIC8vIGV4cGxhaW5zIHRoYXQgdGhpcyB3YXIgaGFzIG5vIHNlbnNlIGFuZCBwcm9kdWNlcyB0aGUgZXhhY3Qgb3Bwb3NpdGUgcmVzdWx0IG9mIHdoYXQKICAgICAgLy8gaXQgd2FzIGludGVuZGVkIHRvIGRvLgogICAgICB5b3V0dWJlSWQ6ICdfUmpCTmtuODh5QScKICAgIH0sIHsKICAgICAgdGV4dDogJ9CT0JXQoNCe0Jkg0J3QntCS0J7QoNCe0KHQodCY0Jgg0KHQotCg0JXQm9Ca0J7QkiA8YnI+INC00LDQuyDQvtGG0LXQvdC60YMg0YXQvtC00YMg0YHQv9C10YbQvtC/0LXRgNCw0YbQuNC4JywKICAgICAgLy8gSW4gdGhpcyB2aWRlbyBJZ29yIEdpcmtpbiwgd2hvIHBsYXllZCBhIGtleSByb2xlIGluIHRoZSBhbm5leGF0aW9uIG9mIENyaW1lYSwKICAgICAgLy8gZXhwbGFpbnMgdGhhdCB0aGlzIHdhciBoYXMgZmFpbGVkIGFscmVhZHkgYW5kIGFsbCBwb3NzaWJsZSBvdXRjb21lcyBhcmUgYmFkIGZvciBSdXNzaWEuCiAgICAgIHlvdXR1YmVJZDogJ3lVbXpRVDRDOEpZJwogICAgfSwgewogICAgICB0ZXh0OiAn0KTQmNCd0KHQmtCY0Jkg0JTQoNCj0JMg0KDQntCh0KHQmNCYIDxicj4g0LPQvtCy0L7RgNC40YIg0J/Qni3QoNCj0KHQodCa0Jgg0L4g0YHQv9C10YbQvtC/0LXRgNCw0YbQuNC4JywKICAgICAgeW91dHViZUlkOiAnaGtDWWI2ZWRVclEnCiAgICB9LCB7CiAgICAgIHRleHQ6ICfQrtCg0JjQmSDQn9Ce0JTQntCb0K/QmtCQINGH0LXRgdGC0L3QviA8YnI+INC+INCz0LXQvdC10YDQsNC70LDRhSDQoNCj0KHQodCa0J7QmSDQkNCg0JzQmNCYJywKICAgICAgeW91dHViZUlkOiAndzQtXzhCSktmcGsnCiAgICB9LCB7CiAgICAgIHRleHQ6ICfQn9C+0LvQutC+0LLQvdC40Log0KTQodCRINCh0KLQoNCV0JvQmtCe0JIgPGJyPiDQvtCxINGD0YHQv9C10YXQsNGFINCg0J7QodCh0JjQmCDQsiDRgdC/0LXRhtC+0L/QtdGA0LDRhtC40LgnLAogICAgICB5b3V0dWJlSWQ6ICdzYUs1VVRLcm9EQScKICAgIH1dKTsgLy8gVGhlIG1lc3NhZ2Ugd2lsbCBvbmx5IGJlIHNob3duIHRvIFJ1c3NpYW4gdXNlcnMgdmlzaXRpbmcgUnVzc2lhbiBzaXRlcwoKICAgIGlmIChuYXZpZ2F0b3IubGFuZ3VhZ2UgPT09ICdydScgJiYgbG9jYXRpb24uaG9zdC5tYXRjaCgvXC4ocnV8c3V8eG4tLXAxYWkpJC8pKSB7CiAgICAgIGNvbnN0IG5vV2FyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgIG5vV2FyLmNsYXNzTmFtZSA9IHN3YWxDbGFzc2VzWyduby13YXInXTsKICAgICAgc2V0SW5uZXJIdG1sKG5vV2FyLCAiPGEgaHJlZj1cImh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9Ii5jb25jYXQobWVzc2FnZS55b3V0dWJlSWQsICJcIiB0YXJnZXQ9XCJfYmxhbmtcIj4iKS5jb25jYXQobWVzc2FnZS50ZXh0LCAiPC9hPiIpKTsKICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKG5vV2FyKTsKICAgICAgY29udGFpbmVyLnN0eWxlLnBhZGRpbmdUb3AgPSAnNGVtJzsKICAgIH0KICB9OwoKICAvKioKICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50IHwgb2JqZWN0IHwgc3RyaW5nfSBwYXJhbQogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHRhcmdldAogICAqLwoKICBjb25zdCBwYXJzZUh0bWxUb0NvbnRhaW5lciA9IChwYXJhbSwgdGFyZ2V0KSA9PiB7CiAgICAvLyBET00gZWxlbWVudAogICAgaWYgKHBhcmFtIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHsKICAgICAgdGFyZ2V0LmFwcGVuZENoaWxkKHBhcmFtKTsKICAgIH0gLy8gT2JqZWN0CiAgICBlbHNlIGlmICh0eXBlb2YgcGFyYW0gPT09ICdvYmplY3QnKSB7CiAgICAgIGhhbmRsZU9iamVjdChwYXJhbSwgdGFyZ2V0KTsKICAgIH0gLy8gUGxhaW4gc3RyaW5nCiAgICBlbHNlIGlmIChwYXJhbSkgewogICAgICBzZXRJbm5lckh0bWwodGFyZ2V0LCBwYXJhbSk7CiAgICB9CiAgfTsKICAvKioKICAgKiBAcGFyYW0ge29iamVjdH0gcGFyYW0KICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSB0YXJnZXQKICAgKi8KCiAgY29uc3QgaGFuZGxlT2JqZWN0ID0gKHBhcmFtLCB0YXJnZXQpID0+IHsKICAgIC8vIEpRdWVyeSBlbGVtZW50KHMpCiAgICBpZiAocGFyYW0uanF1ZXJ5KSB7CiAgICAgIGhhbmRsZUpxdWVyeUVsZW0odGFyZ2V0LCBwYXJhbSk7CiAgICB9IC8vIEZvciBvdGhlciBvYmplY3RzIHVzZSB0aGVpciBzdHJpbmcgcmVwcmVzZW50YXRpb24KICAgIGVsc2UgewogICAgICBzZXRJbm5lckh0bWwodGFyZ2V0LCBwYXJhbS50b1N0cmluZygpKTsKICAgIH0KICB9OwogIC8qKgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHRhcmdldAogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW0KICAgKi8KCgogIGNvbnN0IGhhbmRsZUpxdWVyeUVsZW0gPSAodGFyZ2V0LCBlbGVtKSA9PiB7CiAgICB0YXJnZXQudGV4dENvbnRlbnQgPSAnJzsKCiAgICBpZiAoMCBpbiBlbGVtKSB7CiAgICAgIGZvciAobGV0IGkgPSAwOyAoaSBpbiBlbGVtKTsgaSsrKSB7CiAgICAgICAgdGFyZ2V0LmFwcGVuZENoaWxkKGVsZW1baV0uY2xvbmVOb2RlKHRydWUpKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGFyZ2V0LmFwcGVuZENoaWxkKGVsZW0uY2xvbmVOb2RlKHRydWUpKTsKICAgIH0KICB9OwoKICAvKioKICAgKiBAcmV0dXJucyB7J3dlYmtpdEFuaW1hdGlvbkVuZCcgfCAnYW5pbWF0aW9uZW5kJyB8IGZhbHNlfQogICAqLwoKICBjb25zdCBhbmltYXRpb25FbmRFdmVudCA9ICgoKSA9PiB7CiAgICAvLyBQcmV2ZW50IHJ1biBpbiBOb2RlIGVudgoKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgaWYgKGlzTm9kZUVudigpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBjb25zdCB0ZXN0RWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIGNvbnN0IHRyYW5zRW5kRXZlbnROYW1lcyA9IHsKICAgICAgV2Via2l0QW5pbWF0aW9uOiAnd2Via2l0QW5pbWF0aW9uRW5kJywKICAgICAgLy8gQ2hyb21lLCBTYWZhcmkgYW5kIE9wZXJhCiAgICAgIGFuaW1hdGlvbjogJ2FuaW1hdGlvbmVuZCcgLy8gU3RhbmRhcmQgc3ludGF4CgogICAgfTsKCiAgICBmb3IgKGNvbnN0IGkgaW4gdHJhbnNFbmRFdmVudE5hbWVzKSB7CiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodHJhbnNFbmRFdmVudE5hbWVzLCBpKSAmJiB0eXBlb2YgdGVzdEVsLnN0eWxlW2ldICE9PSAndW5kZWZpbmVkJykgewogICAgICAgIHJldHVybiB0cmFuc0VuZEV2ZW50TmFtZXNbaV07CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gZmFsc2U7CiAgfSkoKTsKCiAgLyoqCiAgICogTWVhc3VyZSBzY3JvbGxiYXIgd2lkdGggZm9yIHBhZGRpbmcgYm9keSBkdXJpbmcgbW9kYWwgc2hvdy9oaWRlCiAgICogaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL2pzL3NyYy9tb2RhbC5qcwogICAqCiAgICogQHJldHVybnMge251bWJlcn0KICAgKi8KCiAgY29uc3QgbWVhc3VyZVNjcm9sbGJhciA9ICgpID0+IHsKICAgIGNvbnN0IHNjcm9sbERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgc2Nyb2xsRGl2LmNsYXNzTmFtZSA9IHN3YWxDbGFzc2VzWydzY3JvbGxiYXItbWVhc3VyZSddOwogICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzY3JvbGxEaXYpOwogICAgY29uc3Qgc2Nyb2xsYmFyV2lkdGggPSBzY3JvbGxEaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggLSBzY3JvbGxEaXYuY2xpZW50V2lkdGg7CiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHNjcm9sbERpdik7CiAgICByZXR1cm4gc2Nyb2xsYmFyV2lkdGg7CiAgfTsKCiAgLyoqCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0Mn0gaW5zdGFuY2UKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnRPcHRpb25zfSBwYXJhbXMKICAgKi8KCiAgY29uc3QgcmVuZGVyQWN0aW9ucyA9IChpbnN0YW5jZSwgcGFyYW1zKSA9PiB7CiAgICBjb25zdCBhY3Rpb25zID0gZ2V0QWN0aW9ucygpOwogICAgY29uc3QgbG9hZGVyID0gZ2V0TG9hZGVyKCk7IC8vIEFjdGlvbnMgKGJ1dHRvbnMpIHdyYXBwZXIKCiAgICBpZiAoIXBhcmFtcy5zaG93Q29uZmlybUJ1dHRvbiAmJiAhcGFyYW1zLnNob3dEZW55QnV0dG9uICYmICFwYXJhbXMuc2hvd0NhbmNlbEJ1dHRvbikgewogICAgICBoaWRlKGFjdGlvbnMpOwogICAgfSBlbHNlIHsKICAgICAgc2hvdyhhY3Rpb25zKTsKICAgIH0gLy8gQ3VzdG9tIGNsYXNzCgoKICAgIGFwcGx5Q3VzdG9tQ2xhc3MoYWN0aW9ucywgcGFyYW1zLCAnYWN0aW9ucycpOyAvLyBSZW5kZXIgYWxsIHRoZSBidXR0b25zCgogICAgcmVuZGVyQnV0dG9ucyhhY3Rpb25zLCBsb2FkZXIsIHBhcmFtcyk7IC8vIExvYWRlcgoKICAgIHNldElubmVySHRtbChsb2FkZXIsIHBhcmFtcy5sb2FkZXJIdG1sKTsKICAgIGFwcGx5Q3VzdG9tQ2xhc3MobG9hZGVyLCBwYXJhbXMsICdsb2FkZXInKTsKICB9OwogIC8qKgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGFjdGlvbnMKICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBsb2FkZXIKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnRPcHRpb25zfSBwYXJhbXMKICAgKi8KCiAgZnVuY3Rpb24gcmVuZGVyQnV0dG9ucyhhY3Rpb25zLCBsb2FkZXIsIHBhcmFtcykgewogICAgY29uc3QgY29uZmlybUJ1dHRvbiA9IGdldENvbmZpcm1CdXR0b24oKTsKICAgIGNvbnN0IGRlbnlCdXR0b24gPSBnZXREZW55QnV0dG9uKCk7CiAgICBjb25zdCBjYW5jZWxCdXR0b24gPSBnZXRDYW5jZWxCdXR0b24oKTsgLy8gUmVuZGVyIGJ1dHRvbnMKCiAgICByZW5kZXJCdXR0b24oY29uZmlybUJ1dHRvbiwgJ2NvbmZpcm0nLCBwYXJhbXMpOwogICAgcmVuZGVyQnV0dG9uKGRlbnlCdXR0b24sICdkZW55JywgcGFyYW1zKTsKICAgIHJlbmRlckJ1dHRvbihjYW5jZWxCdXR0b24sICdjYW5jZWwnLCBwYXJhbXMpOwogICAgaGFuZGxlQnV0dG9uc1N0eWxpbmcoY29uZmlybUJ1dHRvbiwgZGVueUJ1dHRvbiwgY2FuY2VsQnV0dG9uLCBwYXJhbXMpOwoKICAgIGlmIChwYXJhbXMucmV2ZXJzZUJ1dHRvbnMpIHsKICAgICAgaWYgKHBhcmFtcy50b2FzdCkgewogICAgICAgIGFjdGlvbnMuaW5zZXJ0QmVmb3JlKGNhbmNlbEJ1dHRvbiwgY29uZmlybUJ1dHRvbik7CiAgICAgICAgYWN0aW9ucy5pbnNlcnRCZWZvcmUoZGVueUJ1dHRvbiwgY29uZmlybUJ1dHRvbik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYWN0aW9ucy5pbnNlcnRCZWZvcmUoY2FuY2VsQnV0dG9uLCBsb2FkZXIpOwogICAgICAgIGFjdGlvbnMuaW5zZXJ0QmVmb3JlKGRlbnlCdXR0b24sIGxvYWRlcik7CiAgICAgICAgYWN0aW9ucy5pbnNlcnRCZWZvcmUoY29uZmlybUJ1dHRvbiwgbG9hZGVyKTsKICAgICAgfQogICAgfQogIH0KICAvKioKICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjb25maXJtQnV0dG9uCiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZGVueUJ1dHRvbgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNhbmNlbEJ1dHRvbgogICAqIEBwYXJhbSB7U3dlZXRBbGVydE9wdGlvbnN9IHBhcmFtcwogICAqLwoKCiAgZnVuY3Rpb24gaGFuZGxlQnV0dG9uc1N0eWxpbmcoY29uZmlybUJ1dHRvbiwgZGVueUJ1dHRvbiwgY2FuY2VsQnV0dG9uLCBwYXJhbXMpIHsKICAgIGlmICghcGFyYW1zLmJ1dHRvbnNTdHlsaW5nKSB7CiAgICAgIHJldHVybiByZW1vdmVDbGFzcyhbY29uZmlybUJ1dHRvbiwgZGVueUJ1dHRvbiwgY2FuY2VsQnV0dG9uXSwgc3dhbENsYXNzZXMuc3R5bGVkKTsKICAgIH0KCiAgICBhZGRDbGFzcyhbY29uZmlybUJ1dHRvbiwgZGVueUJ1dHRvbiwgY2FuY2VsQnV0dG9uXSwgc3dhbENsYXNzZXMuc3R5bGVkKTsgLy8gQnV0dG9ucyBiYWNrZ3JvdW5kIGNvbG9ycwoKICAgIGlmIChwYXJhbXMuY29uZmlybUJ1dHRvbkNvbG9yKSB7CiAgICAgIGNvbmZpcm1CdXR0b24uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gcGFyYW1zLmNvbmZpcm1CdXR0b25Db2xvcjsKICAgICAgYWRkQ2xhc3MoY29uZmlybUJ1dHRvbiwgc3dhbENsYXNzZXNbJ2RlZmF1bHQtb3V0bGluZSddKTsKICAgIH0KCiAgICBpZiAocGFyYW1zLmRlbnlCdXR0b25Db2xvcikgewogICAgICBkZW55QnV0dG9uLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHBhcmFtcy5kZW55QnV0dG9uQ29sb3I7CiAgICAgIGFkZENsYXNzKGRlbnlCdXR0b24sIHN3YWxDbGFzc2VzWydkZWZhdWx0LW91dGxpbmUnXSk7CiAgICB9CgogICAgaWYgKHBhcmFtcy5jYW5jZWxCdXR0b25Db2xvcikgewogICAgICBjYW5jZWxCdXR0b24uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gcGFyYW1zLmNhbmNlbEJ1dHRvbkNvbG9yOwogICAgICBhZGRDbGFzcyhjYW5jZWxCdXR0b24sIHN3YWxDbGFzc2VzWydkZWZhdWx0LW91dGxpbmUnXSk7CiAgICB9CiAgfQogIC8qKgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGJ1dHRvbgogICAqIEBwYXJhbSB7J2NvbmZpcm0nIHwgJ2RlbnknIHwgJ2NhbmNlbCd9IGJ1dHRvblR5cGUKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnRPcHRpb25zfSBwYXJhbXMKICAgKi8KCgogIGZ1bmN0aW9uIHJlbmRlckJ1dHRvbihidXR0b24sIGJ1dHRvblR5cGUsIHBhcmFtcykgewogICAgdG9nZ2xlKGJ1dHRvbiwgcGFyYW1zWyJzaG93Ii5jb25jYXQoY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKGJ1dHRvblR5cGUpLCAiQnV0dG9uIildLCAnaW5saW5lLWJsb2NrJyk7CiAgICBzZXRJbm5lckh0bWwoYnV0dG9uLCBwYXJhbXNbIiIuY29uY2F0KGJ1dHRvblR5cGUsICJCdXR0b25UZXh0IildKTsgLy8gU2V0IGNhcHRpb24gdGV4dAoKICAgIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCBwYXJhbXNbIiIuY29uY2F0KGJ1dHRvblR5cGUsICJCdXR0b25BcmlhTGFiZWwiKV0pOyAvLyBBUklBIGxhYmVsCiAgICAvLyBBZGQgYnV0dG9ucyBjdXN0b20gY2xhc3NlcwoKICAgIGJ1dHRvbi5jbGFzc05hbWUgPSBzd2FsQ2xhc3Nlc1tidXR0b25UeXBlXTsKICAgIGFwcGx5Q3VzdG9tQ2xhc3MoYnV0dG9uLCBwYXJhbXMsICIiLmNvbmNhdChidXR0b25UeXBlLCAiQnV0dG9uIikpOwogICAgYWRkQ2xhc3MoYnV0dG9uLCBwYXJhbXNbIiIuY29uY2F0KGJ1dHRvblR5cGUsICJCdXR0b25DbGFzcyIpXSk7CiAgfQoKICAvKioKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnQyfSBpbnN0YW5jZQogICAqIEBwYXJhbSB7U3dlZXRBbGVydE9wdGlvbnN9IHBhcmFtcwogICAqLwoKICBjb25zdCByZW5kZXJDb250YWluZXIgPSAoaW5zdGFuY2UsIHBhcmFtcykgPT4gewogICAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7CgogICAgaWYgKCFjb250YWluZXIpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGhhbmRsZUJhY2tkcm9wUGFyYW0oY29udGFpbmVyLCBwYXJhbXMuYmFja2Ryb3ApOwogICAgaGFuZGxlUG9zaXRpb25QYXJhbShjb250YWluZXIsIHBhcmFtcy5wb3NpdGlvbik7CiAgICBoYW5kbGVHcm93UGFyYW0oY29udGFpbmVyLCBwYXJhbXMuZ3Jvdyk7IC8vIEN1c3RvbSBjbGFzcwoKICAgIGFwcGx5Q3VzdG9tQ2xhc3MoY29udGFpbmVyLCBwYXJhbXMsICdjb250YWluZXInKTsKICB9OwogIC8qKgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbnRhaW5lcgogICAqIEBwYXJhbSB7U3dlZXRBbGVydE9wdGlvbnNbJ2JhY2tkcm9wJ119IGJhY2tkcm9wCiAgICovCgogIGZ1bmN0aW9uIGhhbmRsZUJhY2tkcm9wUGFyYW0oY29udGFpbmVyLCBiYWNrZHJvcCkgewogICAgaWYgKHR5cGVvZiBiYWNrZHJvcCA9PT0gJ3N0cmluZycpIHsKICAgICAgY29udGFpbmVyLnN0eWxlLmJhY2tncm91bmQgPSBiYWNrZHJvcDsKICAgIH0gZWxzZSBpZiAoIWJhY2tkcm9wKSB7CiAgICAgIGFkZENsYXNzKFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIGRvY3VtZW50LmJvZHldLCBzd2FsQ2xhc3Nlc1snbm8tYmFja2Ryb3AnXSk7CiAgICB9CiAgfQogIC8qKgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbnRhaW5lcgogICAqIEBwYXJhbSB7U3dlZXRBbGVydE9wdGlvbnNbJ3Bvc2l0aW9uJ119IHBvc2l0aW9uCiAgICovCgoKICBmdW5jdGlvbiBoYW5kbGVQb3NpdGlvblBhcmFtKGNvbnRhaW5lciwgcG9zaXRpb24pIHsKICAgIGlmIChwb3NpdGlvbiBpbiBzd2FsQ2xhc3NlcykgewogICAgICBhZGRDbGFzcyhjb250YWluZXIsIHN3YWxDbGFzc2VzW3Bvc2l0aW9uXSk7CiAgICB9IGVsc2UgewogICAgICB3YXJuKCdUaGUgInBvc2l0aW9uIiBwYXJhbWV0ZXIgaXMgbm90IHZhbGlkLCBkZWZhdWx0aW5nIHRvICJjZW50ZXIiJyk7CiAgICAgIGFkZENsYXNzKGNvbnRhaW5lciwgc3dhbENsYXNzZXMuY2VudGVyKTsKICAgIH0KICB9CiAgLyoqCiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY29udGFpbmVyCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0T3B0aW9uc1snZ3JvdyddfSBncm93CiAgICovCgoKICBmdW5jdGlvbiBoYW5kbGVHcm93UGFyYW0oY29udGFpbmVyLCBncm93KSB7CiAgICBpZiAoZ3JvdyAmJiB0eXBlb2YgZ3JvdyA9PT0gJ3N0cmluZycpIHsKICAgICAgY29uc3QgZ3Jvd0NsYXNzID0gImdyb3ctIi5jb25jYXQoZ3Jvdyk7CgogICAgICBpZiAoZ3Jvd0NsYXNzIGluIHN3YWxDbGFzc2VzKSB7CiAgICAgICAgYWRkQ2xhc3MoY29udGFpbmVyLCBzd2FsQ2xhc3Nlc1tncm93Q2xhc3NdKTsKICAgICAgfQogICAgfQogIH0KCiAgLyoqCiAgICogVGhpcyBtb2R1bGUgY29udGFpbnMgYFdlYWtNYXBgcyBmb3IgZWFjaCBlZmZlY3RpdmVseS0icHJpdmF0ZSAgcHJvcGVydHkiIHRoYXQgYSBgU3dhbGAgaGFzLgogICAqIEZvciBleGFtcGxlLCB0byBzZXQgdGhlIHByaXZhdGUgcHJvcGVydHkgImZvbyIgb2YgYHRoaXNgIHRvICJiYXIiLCB5b3UgY2FuIGBwcml2YXRlUHJvcHMuZm9vLnNldCh0aGlzLCAnYmFyJylgCiAgICogVGhpcyBpcyB0aGUgYXBwcm9hY2ggdGhhdCBCYWJlbCB3aWxsIHByb2JhYmx5IHRha2UgdG8gaW1wbGVtZW50IHByaXZhdGUgbWV0aG9kcy9maWVsZHMKICAgKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXByaXZhdGUtbWV0aG9kcwogICAqICAgaHR0cHM6Ly9naXRodWIuY29tL2JhYmVsL2JhYmVsL3B1bGwvNzU1NQogICAqIE9uY2Ugd2UgaGF2ZSB0aGUgY2hhbmdlcyBmcm9tIHRoYXQgUFIgaW4gQmFiZWwsIGFuZCBvdXIgY29yZSBjbGFzcyBmaXRzIHJlYXNvbmFibGUgaW4gKm9uZSBtb2R1bGUqCiAgICogICB0aGVuIHdlIGNhbiB1c2UgdGhhdCBsYW5ndWFnZSBmZWF0dXJlLgogICAqLwogIHZhciBwcml2YXRlUHJvcHMgPSB7CiAgICBhd2FpdGluZ1Byb21pc2U6IG5ldyBXZWFrTWFwKCksCiAgICBwcm9taXNlOiBuZXcgV2Vha01hcCgpLAogICAgaW5uZXJQYXJhbXM6IG5ldyBXZWFrTWFwKCksCiAgICBkb21DYWNoZTogbmV3IFdlYWtNYXAoKQogIH07CgogIC8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uLy4uLy4uL3N3ZWV0YWxlcnQyLmQudHMiLz4KICAvKiogQHR5cGUge0lucHV0Q2xhc3NbXX0gKi8KCiAgY29uc3QgaW5wdXRDbGFzc2VzID0gWydpbnB1dCcsICdmaWxlJywgJ3JhbmdlJywgJ3NlbGVjdCcsICdyYWRpbycsICdjaGVja2JveCcsICd0ZXh0YXJlYSddOwogIC8qKgogICAqIEBwYXJhbSB7U3dlZXRBbGVydDJ9IGluc3RhbmNlCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0T3B0aW9uc30gcGFyYW1zCiAgICovCgogIGNvbnN0IHJlbmRlcklucHV0ID0gKGluc3RhbmNlLCBwYXJhbXMpID0+IHsKICAgIGNvbnN0IHBvcHVwID0gZ2V0UG9wdXAoKTsKICAgIGNvbnN0IGlubmVyUGFyYW1zID0gcHJpdmF0ZVByb3BzLmlubmVyUGFyYW1zLmdldChpbnN0YW5jZSk7CiAgICBjb25zdCByZXJlbmRlciA9ICFpbm5lclBhcmFtcyB8fCBwYXJhbXMuaW5wdXQgIT09IGlubmVyUGFyYW1zLmlucHV0OwogICAgaW5wdXRDbGFzc2VzLmZvckVhY2goaW5wdXRDbGFzcyA9PiB7CiAgICAgIGNvbnN0IGlucHV0Q29udGFpbmVyID0gZ2V0RGlyZWN0Q2hpbGRCeUNsYXNzKHBvcHVwLCBzd2FsQ2xhc3Nlc1tpbnB1dENsYXNzXSk7IC8vIHNldCBhdHRyaWJ1dGVzCgogICAgICBzZXRBdHRyaWJ1dGVzKGlucHV0Q2xhc3MsIHBhcmFtcy5pbnB1dEF0dHJpYnV0ZXMpOyAvLyBzZXQgY2xhc3MKCiAgICAgIGlucHV0Q29udGFpbmVyLmNsYXNzTmFtZSA9IHN3YWxDbGFzc2VzW2lucHV0Q2xhc3NdOwoKICAgICAgaWYgKHJlcmVuZGVyKSB7CiAgICAgICAgaGlkZShpbnB1dENvbnRhaW5lcik7CiAgICAgIH0KICAgIH0pOwoKICAgIGlmIChwYXJhbXMuaW5wdXQpIHsKICAgICAgaWYgKHJlcmVuZGVyKSB7CiAgICAgICAgc2hvd0lucHV0KHBhcmFtcyk7CiAgICAgIH0gLy8gc2V0IGN1c3RvbSBjbGFzcwoKCiAgICAgIHNldEN1c3RvbUNsYXNzKHBhcmFtcyk7CiAgICB9CiAgfTsKICAvKioKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnRPcHRpb25zfSBwYXJhbXMKICAgKi8KCiAgY29uc3Qgc2hvd0lucHV0ID0gcGFyYW1zID0+IHsKICAgIGlmICghcmVuZGVySW5wdXRUeXBlW3BhcmFtcy5pbnB1dF0pIHsKICAgICAgcmV0dXJuIGVycm9yKCJVbmV4cGVjdGVkIHR5cGUgb2YgaW5wdXQhIEV4cGVjdGVkIFwidGV4dFwiLCBcImVtYWlsXCIsIFwicGFzc3dvcmRcIiwgXCJudW1iZXJcIiwgXCJ0ZWxcIiwgXCJzZWxlY3RcIiwgXCJyYWRpb1wiLCBcImNoZWNrYm94XCIsIFwidGV4dGFyZWFcIiwgXCJmaWxlXCIgb3IgXCJ1cmxcIiwgZ290IFwiIi5jb25jYXQocGFyYW1zLmlucHV0LCAiXCIiKSk7CiAgICB9CgogICAgY29uc3QgaW5wdXRDb250YWluZXIgPSBnZXRJbnB1dENvbnRhaW5lcihwYXJhbXMuaW5wdXQpOwogICAgY29uc3QgaW5wdXQgPSByZW5kZXJJbnB1dFR5cGVbcGFyYW1zLmlucHV0XShpbnB1dENvbnRhaW5lciwgcGFyYW1zKTsKICAgIHNob3coaW5wdXRDb250YWluZXIpOyAvLyBpbnB1dCBhdXRvZm9jdXMKCiAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgZm9jdXNJbnB1dChpbnB1dCk7CiAgICB9KTsKICB9OwogIC8qKgogICAqIEBwYXJhbSB7SFRNTElucHV0RWxlbWVudH0gaW5wdXQKICAgKi8KCgogIGNvbnN0IHJlbW92ZUF0dHJpYnV0ZXMgPSBpbnB1dCA9PiB7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0LmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgY29uc3QgYXR0ck5hbWUgPSBpbnB1dC5hdHRyaWJ1dGVzW2ldLm5hbWU7CgogICAgICBpZiAoIVsndHlwZScsICd2YWx1ZScsICdzdHlsZSddLmluY2x1ZGVzKGF0dHJOYW1lKSkgewogICAgICAgIGlucHV0LnJlbW92ZUF0dHJpYnV0ZShhdHRyTmFtZSk7CiAgICAgIH0KICAgIH0KICB9OwogIC8qKgogICAqIEBwYXJhbSB7SW5wdXRDbGFzc30gaW5wdXRDbGFzcwogICAqIEBwYXJhbSB7U3dlZXRBbGVydE9wdGlvbnNbJ2lucHV0QXR0cmlidXRlcyddfSBpbnB1dEF0dHJpYnV0ZXMKICAgKi8KCgogIGNvbnN0IHNldEF0dHJpYnV0ZXMgPSAoaW5wdXRDbGFzcywgaW5wdXRBdHRyaWJ1dGVzKSA9PiB7CiAgICBjb25zdCBpbnB1dCA9IGdldElucHV0KGdldFBvcHVwKCksIGlucHV0Q2xhc3MpOwoKICAgIGlmICghaW5wdXQpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJlbW92ZUF0dHJpYnV0ZXMoaW5wdXQpOwoKICAgIGZvciAoY29uc3QgYXR0ciBpbiBpbnB1dEF0dHJpYnV0ZXMpIHsKICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKGF0dHIsIGlucHV0QXR0cmlidXRlc1thdHRyXSk7CiAgICB9CiAgfTsKICAvKioKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnRPcHRpb25zfSBwYXJhbXMKICAgKi8KCgogIGNvbnN0IHNldEN1c3RvbUNsYXNzID0gcGFyYW1zID0+IHsKICAgIGNvbnN0IGlucHV0Q29udGFpbmVyID0gZ2V0SW5wdXRDb250YWluZXIocGFyYW1zLmlucHV0KTsKCiAgICBpZiAodHlwZW9mIHBhcmFtcy5jdXN0b21DbGFzcyA9PT0gJ29iamVjdCcpIHsKICAgICAgYWRkQ2xhc3MoaW5wdXRDb250YWluZXIsIHBhcmFtcy5jdXN0b21DbGFzcy5pbnB1dCk7CiAgICB9CiAgfTsKICAvKioKICAgKiBAcGFyYW0ge0hUTUxJbnB1dEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50fSBpbnB1dAogICAqIEBwYXJhbSB7U3dlZXRBbGVydE9wdGlvbnN9IHBhcmFtcwogICAqLwoKCiAgY29uc3Qgc2V0SW5wdXRQbGFjZWhvbGRlciA9IChpbnB1dCwgcGFyYW1zKSA9PiB7CiAgICBpZiAoIWlucHV0LnBsYWNlaG9sZGVyIHx8IHBhcmFtcy5pbnB1dFBsYWNlaG9sZGVyKSB7CiAgICAgIGlucHV0LnBsYWNlaG9sZGVyID0gcGFyYW1zLmlucHV0UGxhY2Vob2xkZXI7CiAgICB9CiAgfTsKICAvKioKICAgKiBAcGFyYW0ge0lucHV0fSBpbnB1dAogICAqIEBwYXJhbSB7SW5wdXR9IHByZXBlbmRUbwogICAqIEBwYXJhbSB7U3dlZXRBbGVydE9wdGlvbnN9IHBhcmFtcwogICAqLwoKCiAgY29uc3Qgc2V0SW5wdXRMYWJlbCA9IChpbnB1dCwgcHJlcGVuZFRvLCBwYXJhbXMpID0+IHsKICAgIGlmIChwYXJhbXMuaW5wdXRMYWJlbCkgewogICAgICBpbnB1dC5pZCA9IHN3YWxDbGFzc2VzLmlucHV0OwogICAgICBjb25zdCBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7CiAgICAgIGNvbnN0IGxhYmVsQ2xhc3MgPSBzd2FsQ2xhc3Nlc1snaW5wdXQtbGFiZWwnXTsKICAgICAgbGFiZWwuc2V0QXR0cmlidXRlKCdmb3InLCBpbnB1dC5pZCk7CiAgICAgIGxhYmVsLmNsYXNzTmFtZSA9IGxhYmVsQ2xhc3M7CgogICAgICBpZiAodHlwZW9mIHBhcmFtcy5jdXN0b21DbGFzcyA9PT0gJ29iamVjdCcpIHsKICAgICAgICBhZGRDbGFzcyhsYWJlbCwgcGFyYW1zLmN1c3RvbUNsYXNzLmlucHV0TGFiZWwpOwogICAgICB9CgogICAgICBsYWJlbC5pbm5lclRleHQgPSBwYXJhbXMuaW5wdXRMYWJlbDsKICAgICAgcHJlcGVuZFRvLmluc2VydEFkamFjZW50RWxlbWVudCgnYmVmb3JlYmVnaW4nLCBsYWJlbCk7CiAgICB9CiAgfTsKICAvKioKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnRPcHRpb25zWydpbnB1dCddfSBpbnB1dFR5cGUKICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR9CiAgICovCgoKICBjb25zdCBnZXRJbnB1dENvbnRhaW5lciA9IGlucHV0VHlwZSA9PiB7CiAgICByZXR1cm4gZ2V0RGlyZWN0Q2hpbGRCeUNsYXNzKGdldFBvcHVwKCksIHN3YWxDbGFzc2VzW2lucHV0VHlwZV0gfHwgc3dhbENsYXNzZXMuaW5wdXQpOwogIH07CiAgLyoqCiAgICogQHBhcmFtIHtIVE1MSW5wdXRFbGVtZW50IHwgSFRNTE91dHB1dEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50fSBpbnB1dAogICAqIEBwYXJhbSB7U3dlZXRBbGVydE9wdGlvbnNbJ2lucHV0VmFsdWUnXX0gaW5wdXRWYWx1ZQogICAqLwoKCiAgY29uc3QgY2hlY2tBbmRTZXRJbnB1dFZhbHVlID0gKGlucHV0LCBpbnB1dFZhbHVlKSA9PiB7CiAgICBpZiAoWydzdHJpbmcnLCAnbnVtYmVyJ10uaW5jbHVkZXModHlwZW9mIGlucHV0VmFsdWUpKSB7CiAgICAgIGlucHV0LnZhbHVlID0gIiIuY29uY2F0KGlucHV0VmFsdWUpOwogICAgfSBlbHNlIGlmICghaXNQcm9taXNlKGlucHV0VmFsdWUpKSB7CiAgICAgIHdhcm4oIlVuZXhwZWN0ZWQgdHlwZSBvZiBpbnB1dFZhbHVlISBFeHBlY3RlZCBcInN0cmluZ1wiLCBcIm51bWJlclwiIG9yIFwiUHJvbWlzZVwiLCBnb3QgXCIiLmNvbmNhdCh0eXBlb2YgaW5wdXRWYWx1ZSwgIlwiIikpOwogICAgfQogIH07CiAgLyoqIEB0eXBlIFJlY29yZDxzdHJpbmcsIChpbnB1dDogSW5wdXQgfCBIVE1MRWxlbWVudCwgcGFyYW1zOiBTd2VldEFsZXJ0T3B0aW9ucykgPT4gSW5wdXQ+ICovCgoKICBjb25zdCByZW5kZXJJbnB1dFR5cGUgPSB7fTsKICAvKioKICAgKiBAcGFyYW0ge0hUTUxJbnB1dEVsZW1lbnR9IGlucHV0CiAgICogQHBhcmFtIHtTd2VldEFsZXJ0T3B0aW9uc30gcGFyYW1zCiAgICogQHJldHVybnMge0hUTUxJbnB1dEVsZW1lbnR9CiAgICovCgogIHJlbmRlcklucHV0VHlwZS50ZXh0ID0gcmVuZGVySW5wdXRUeXBlLmVtYWlsID0gcmVuZGVySW5wdXRUeXBlLnBhc3N3b3JkID0gcmVuZGVySW5wdXRUeXBlLm51bWJlciA9IHJlbmRlcklucHV0VHlwZS50ZWwgPSByZW5kZXJJbnB1dFR5cGUudXJsID0gKGlucHV0LCBwYXJhbXMpID0+IHsKICAgIGNoZWNrQW5kU2V0SW5wdXRWYWx1ZShpbnB1dCwgcGFyYW1zLmlucHV0VmFsdWUpOwogICAgc2V0SW5wdXRMYWJlbChpbnB1dCwgaW5wdXQsIHBhcmFtcyk7CiAgICBzZXRJbnB1dFBsYWNlaG9sZGVyKGlucHV0LCBwYXJhbXMpOwogICAgaW5wdXQudHlwZSA9IHBhcmFtcy5pbnB1dDsKICAgIHJldHVybiBpbnB1dDsKICB9OwogIC8qKgogICAqIEBwYXJhbSB7SFRNTElucHV0RWxlbWVudH0gaW5wdXQKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnRPcHRpb25zfSBwYXJhbXMKICAgKiBAcmV0dXJucyB7SFRNTElucHV0RWxlbWVudH0KICAgKi8KCgogIHJlbmRlcklucHV0VHlwZS5maWxlID0gKGlucHV0LCBwYXJhbXMpID0+IHsKICAgIHNldElucHV0TGFiZWwoaW5wdXQsIGlucHV0LCBwYXJhbXMpOwogICAgc2V0SW5wdXRQbGFjZWhvbGRlcihpbnB1dCwgcGFyYW1zKTsKICAgIHJldHVybiBpbnB1dDsKICB9OwogIC8qKgogICAqIEBwYXJhbSB7SFRNTElucHV0RWxlbWVudH0gcmFuZ2UKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnRPcHRpb25zfSBwYXJhbXMKICAgKiBAcmV0dXJucyB7SFRNTElucHV0RWxlbWVudH0KICAgKi8KCgogIHJlbmRlcklucHV0VHlwZS5yYW5nZSA9IChyYW5nZSwgcGFyYW1zKSA9PiB7CiAgICBjb25zdCByYW5nZUlucHV0ID0gcmFuZ2UucXVlcnlTZWxlY3RvcignaW5wdXQnKTsKICAgIGNvbnN0IHJhbmdlT3V0cHV0ID0gcmFuZ2UucXVlcnlTZWxlY3Rvcignb3V0cHV0Jyk7CiAgICBjaGVja0FuZFNldElucHV0VmFsdWUocmFuZ2VJbnB1dCwgcGFyYW1zLmlucHV0VmFsdWUpOwogICAgcmFuZ2VJbnB1dC50eXBlID0gcGFyYW1zLmlucHV0OwogICAgY2hlY2tBbmRTZXRJbnB1dFZhbHVlKHJhbmdlT3V0cHV0LCBwYXJhbXMuaW5wdXRWYWx1ZSk7CiAgICBzZXRJbnB1dExhYmVsKHJhbmdlSW5wdXQsIHJhbmdlLCBwYXJhbXMpOwogICAgcmV0dXJuIHJhbmdlOwogIH07CiAgLyoqCiAgICogQHBhcmFtIHtIVE1MU2VsZWN0RWxlbWVudH0gc2VsZWN0CiAgICogQHBhcmFtIHtTd2VldEFsZXJ0T3B0aW9uc30gcGFyYW1zCiAgICogQHJldHVybnMge0hUTUxTZWxlY3RFbGVtZW50fQogICAqLwoKCiAgcmVuZGVySW5wdXRUeXBlLnNlbGVjdCA9IChzZWxlY3QsIHBhcmFtcykgPT4gewogICAgc2VsZWN0LnRleHRDb250ZW50ID0gJyc7CgogICAgaWYgKHBhcmFtcy5pbnB1dFBsYWNlaG9sZGVyKSB7CiAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7CiAgICAgIHNldElubmVySHRtbChwbGFjZWhvbGRlciwgcGFyYW1zLmlucHV0UGxhY2Vob2xkZXIpOwogICAgICBwbGFjZWhvbGRlci52YWx1ZSA9ICcnOwogICAgICBwbGFjZWhvbGRlci5kaXNhYmxlZCA9IHRydWU7CiAgICAgIHBsYWNlaG9sZGVyLnNlbGVjdGVkID0gdHJ1ZTsKICAgICAgc2VsZWN0LmFwcGVuZENoaWxkKHBsYWNlaG9sZGVyKTsKICAgIH0KCiAgICBzZXRJbnB1dExhYmVsKHNlbGVjdCwgc2VsZWN0LCBwYXJhbXMpOwogICAgcmV0dXJuIHNlbGVjdDsKICB9OwogIC8qKgogICAqIEBwYXJhbSB7SFRNTElucHV0RWxlbWVudH0gcmFkaW8KICAgKiBAcmV0dXJucyB7SFRNTElucHV0RWxlbWVudH0KICAgKi8KCgogIHJlbmRlcklucHV0VHlwZS5yYWRpbyA9IHJhZGlvID0+IHsKICAgIHJhZGlvLnRleHRDb250ZW50ID0gJyc7CiAgICByZXR1cm4gcmFkaW87CiAgfTsKICAvKioKICAgKiBAcGFyYW0ge0hUTUxMYWJlbEVsZW1lbnR9IGNoZWNrYm94Q29udGFpbmVyCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0T3B0aW9uc30gcGFyYW1zCiAgICogQHJldHVybnMge0hUTUxJbnB1dEVsZW1lbnR9CiAgICovCgoKICByZW5kZXJJbnB1dFR5cGUuY2hlY2tib3ggPSAoY2hlY2tib3hDb250YWluZXIsIHBhcmFtcykgPT4gewogICAgY29uc3QgY2hlY2tib3ggPSBnZXRJbnB1dChnZXRQb3B1cCgpLCAnY2hlY2tib3gnKTsKICAgIGNoZWNrYm94LnZhbHVlID0gJzEnOwogICAgY2hlY2tib3guaWQgPSBzd2FsQ2xhc3Nlcy5jaGVja2JveDsKICAgIGNoZWNrYm94LmNoZWNrZWQgPSBCb29sZWFuKHBhcmFtcy5pbnB1dFZhbHVlKTsKICAgIGNvbnN0IGxhYmVsID0gY2hlY2tib3hDb250YWluZXIucXVlcnlTZWxlY3Rvcignc3BhbicpOwogICAgc2V0SW5uZXJIdG1sKGxhYmVsLCBwYXJhbXMuaW5wdXRQbGFjZWhvbGRlcik7CiAgICByZXR1cm4gY2hlY2tib3g7CiAgfTsKICAvKioKICAgKiBAcGFyYW0ge0hUTUxUZXh0QXJlYUVsZW1lbnR9IHRleHRhcmVhCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0T3B0aW9uc30gcGFyYW1zCiAgICogQHJldHVybnMge0hUTUxUZXh0QXJlYUVsZW1lbnR9CiAgICovCgoKICByZW5kZXJJbnB1dFR5cGUudGV4dGFyZWEgPSAodGV4dGFyZWEsIHBhcmFtcykgPT4gewogICAgY2hlY2tBbmRTZXRJbnB1dFZhbHVlKHRleHRhcmVhLCBwYXJhbXMuaW5wdXRWYWx1ZSk7CiAgICBzZXRJbnB1dFBsYWNlaG9sZGVyKHRleHRhcmVhLCBwYXJhbXMpOwogICAgc2V0SW5wdXRMYWJlbCh0ZXh0YXJlYSwgdGV4dGFyZWEsIHBhcmFtcyk7CiAgICAvKioKICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsCiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfQogICAgICovCgogICAgY29uc3QgZ2V0TWFyZ2luID0gZWwgPT4gcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwpLm1hcmdpbkxlZnQpICsgcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwpLm1hcmdpblJpZ2h0KTsgLy8gaHR0cHM6Ly9naXRodWIuY29tL3N3ZWV0YWxlcnQyL3N3ZWV0YWxlcnQyL2lzc3Vlcy8yMjkxCgoKICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vc3dlZXRhbGVydDIvc3dlZXRhbGVydDIvaXNzdWVzLzE2OTkKICAgICAgaWYgKCdNdXRhdGlvbk9ic2VydmVyJyBpbiB3aW5kb3cpIHsKICAgICAgICBjb25zdCBpbml0aWFsUG9wdXBXaWR0aCA9IHBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGdldFBvcHVwKCkpLndpZHRoKTsKCiAgICAgICAgY29uc3QgdGV4dGFyZWFSZXNpemVIYW5kbGVyID0gKCkgPT4gewogICAgICAgICAgY29uc3QgdGV4dGFyZWFXaWR0aCA9IHRleHRhcmVhLm9mZnNldFdpZHRoICsgZ2V0TWFyZ2luKHRleHRhcmVhKTsKCiAgICAgICAgICBpZiAodGV4dGFyZWFXaWR0aCA+IGluaXRpYWxQb3B1cFdpZHRoKSB7CiAgICAgICAgICAgIGdldFBvcHVwKCkuc3R5bGUud2lkdGggPSAiIi5jb25jYXQodGV4dGFyZWFXaWR0aCwgInB4Iik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBnZXRQb3B1cCgpLnN0eWxlLndpZHRoID0gbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBuZXcgTXV0YXRpb25PYnNlcnZlcih0ZXh0YXJlYVJlc2l6ZUhhbmRsZXIpLm9ic2VydmUodGV4dGFyZWEsIHsKICAgICAgICAgIGF0dHJpYnV0ZXM6IHRydWUsCiAgICAgICAgICBhdHRyaWJ1dGVGaWx0ZXI6IFsnc3R5bGUnXQogICAgICAgIH0pOwogICAgICB9CiAgICB9KTsKICAgIHJldHVybiB0ZXh0YXJlYTsKICB9OwoKICAvKioKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnQyfSBpbnN0YW5jZQogICAqIEBwYXJhbSB7U3dlZXRBbGVydE9wdGlvbnN9IHBhcmFtcwogICAqLwoKICBjb25zdCByZW5kZXJDb250ZW50ID0gKGluc3RhbmNlLCBwYXJhbXMpID0+IHsKICAgIGNvbnN0IGh0bWxDb250YWluZXIgPSBnZXRIdG1sQ29udGFpbmVyKCk7CiAgICBhcHBseUN1c3RvbUNsYXNzKGh0bWxDb250YWluZXIsIHBhcmFtcywgJ2h0bWxDb250YWluZXInKTsgLy8gQ29udGVudCBhcyBIVE1MCgogICAgaWYgKHBhcmFtcy5odG1sKSB7CiAgICAgIHBhcnNlSHRtbFRvQ29udGFpbmVyKHBhcmFtcy5odG1sLCBodG1sQ29udGFpbmVyKTsKICAgICAgc2hvdyhodG1sQ29udGFpbmVyLCAnYmxvY2snKTsKICAgIH0gLy8gQ29udGVudCBhcyBwbGFpbiB0ZXh0CiAgICBlbHNlIGlmIChwYXJhbXMudGV4dCkgewogICAgICBodG1sQ29udGFpbmVyLnRleHRDb250ZW50ID0gcGFyYW1zLnRleHQ7CiAgICAgIHNob3coaHRtbENvbnRhaW5lciwgJ2Jsb2NrJyk7CiAgICB9IC8vIE5vIGNvbnRlbnQKICAgIGVsc2UgewogICAgICBoaWRlKGh0bWxDb250YWluZXIpOwogICAgfQoKICAgIHJlbmRlcklucHV0KGluc3RhbmNlLCBwYXJhbXMpOwogIH07CgogIC8qKgogICAqIEBwYXJhbSB7U3dlZXRBbGVydDJ9IGluc3RhbmNlCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0T3B0aW9uc30gcGFyYW1zCiAgICovCgogIGNvbnN0IHJlbmRlckZvb3RlciA9IChpbnN0YW5jZSwgcGFyYW1zKSA9PiB7CiAgICBjb25zdCBmb290ZXIgPSBnZXRGb290ZXIoKTsKICAgIHRvZ2dsZShmb290ZXIsIHBhcmFtcy5mb290ZXIpOwoKICAgIGlmIChwYXJhbXMuZm9vdGVyKSB7CiAgICAgIHBhcnNlSHRtbFRvQ29udGFpbmVyKHBhcmFtcy5mb290ZXIsIGZvb3Rlcik7CiAgICB9IC8vIEN1c3RvbSBjbGFzcwoKCiAgICBhcHBseUN1c3RvbUNsYXNzKGZvb3RlciwgcGFyYW1zLCAnZm9vdGVyJyk7CiAgfTsKCiAgLyoqCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0Mn0gaW5zdGFuY2UKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnRPcHRpb25zfSBwYXJhbXMKICAgKi8KCiAgY29uc3QgcmVuZGVyQ2xvc2VCdXR0b24gPSAoaW5zdGFuY2UsIHBhcmFtcykgPT4gewogICAgY29uc3QgY2xvc2VCdXR0b24gPSBnZXRDbG9zZUJ1dHRvbigpOwogICAgc2V0SW5uZXJIdG1sKGNsb3NlQnV0dG9uLCBwYXJhbXMuY2xvc2VCdXR0b25IdG1sKTsgLy8gQ3VzdG9tIGNsYXNzCgogICAgYXBwbHlDdXN0b21DbGFzcyhjbG9zZUJ1dHRvbiwgcGFyYW1zLCAnY2xvc2VCdXR0b24nKTsKICAgIHRvZ2dsZShjbG9zZUJ1dHRvbiwgcGFyYW1zLnNob3dDbG9zZUJ1dHRvbik7CiAgICBjbG9zZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCBwYXJhbXMuY2xvc2VCdXR0b25BcmlhTGFiZWwpOwogIH07CgogIC8qKgogICAqIEBwYXJhbSB7U3dlZXRBbGVydDJ9IGluc3RhbmNlCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0T3B0aW9uc30gcGFyYW1zCiAgICovCgogIGNvbnN0IHJlbmRlckljb24gPSAoaW5zdGFuY2UsIHBhcmFtcykgPT4gewogICAgY29uc3QgaW5uZXJQYXJhbXMgPSBwcml2YXRlUHJvcHMuaW5uZXJQYXJhbXMuZ2V0KGluc3RhbmNlKTsKICAgIGNvbnN0IGljb24gPSBnZXRJY29uKCk7IC8vIGlmIHRoZSBnaXZlbiBpY29uIGFscmVhZHkgcmVuZGVyZWQsIGFwcGx5IHRoZSBzdHlsaW5nIHdpdGhvdXQgcmUtcmVuZGVyaW5nIHRoZSBpY29uCgogICAgaWYgKGlubmVyUGFyYW1zICYmIHBhcmFtcy5pY29uID09PSBpbm5lclBhcmFtcy5pY29uKSB7CiAgICAgIC8vIEN1c3RvbSBvciBkZWZhdWx0IGNvbnRlbnQKICAgICAgc2V0Q29udGVudChpY29uLCBwYXJhbXMpOwogICAgICBhcHBseVN0eWxlcyhpY29uLCBwYXJhbXMpOwogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCFwYXJhbXMuaWNvbiAmJiAhcGFyYW1zLmljb25IdG1sKSB7CiAgICAgIHJldHVybiBoaWRlKGljb24pOwogICAgfQoKICAgIGlmIChwYXJhbXMuaWNvbiAmJiBPYmplY3Qua2V5cyhpY29uVHlwZXMpLmluZGV4T2YocGFyYW1zLmljb24pID09PSAtMSkgewogICAgICBlcnJvcigiVW5rbm93biBpY29uISBFeHBlY3RlZCBcInN1Y2Nlc3NcIiwgXCJlcnJvclwiLCBcIndhcm5pbmdcIiwgXCJpbmZvXCIgb3IgXCJxdWVzdGlvblwiLCBnb3QgXCIiLmNvbmNhdChwYXJhbXMuaWNvbiwgIlwiIikpOwogICAgICByZXR1cm4gaGlkZShpY29uKTsKICAgIH0KCiAgICBzaG93KGljb24pOyAvLyBDdXN0b20gb3IgZGVmYXVsdCBjb250ZW50CgogICAgc2V0Q29udGVudChpY29uLCBwYXJhbXMpOwogICAgYXBwbHlTdHlsZXMoaWNvbiwgcGFyYW1zKTsgLy8gQW5pbWF0ZSBpY29uCgogICAgYWRkQ2xhc3MoaWNvbiwgcGFyYW1zLnNob3dDbGFzcy5pY29uKTsKICB9OwogIC8qKgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGljb24KICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnRPcHRpb25zfSBwYXJhbXMKICAgKi8KCiAgY29uc3QgYXBwbHlTdHlsZXMgPSAoaWNvbiwgcGFyYW1zKSA9PiB7CiAgICBmb3IgKGNvbnN0IGljb25UeXBlIGluIGljb25UeXBlcykgewogICAgICBpZiAocGFyYW1zLmljb24gIT09IGljb25UeXBlKSB7CiAgICAgICAgcmVtb3ZlQ2xhc3MoaWNvbiwgaWNvblR5cGVzW2ljb25UeXBlXSk7CiAgICAgIH0KICAgIH0KCiAgICBhZGRDbGFzcyhpY29uLCBpY29uVHlwZXNbcGFyYW1zLmljb25dKTsgLy8gSWNvbiBjb2xvcgoKICAgIHNldENvbG9yKGljb24sIHBhcmFtcyk7IC8vIFN1Y2Nlc3MgaWNvbiBiYWNrZ3JvdW5kIGNvbG9yCgogICAgYWRqdXN0U3VjY2Vzc0ljb25CYWNrZ3JvdW5kQ29sb3IoKTsgLy8gQ3VzdG9tIGNsYXNzCgogICAgYXBwbHlDdXN0b21DbGFzcyhpY29uLCBwYXJhbXMsICdpY29uJyk7CiAgfTsgLy8gQWRqdXN0IHN1Y2Nlc3MgaWNvbiBiYWNrZ3JvdW5kIGNvbG9yIHRvIG1hdGNoIHRoZSBwb3B1cCBiYWNrZ3JvdW5kIGNvbG9yCgoKICBjb25zdCBhZGp1c3RTdWNjZXNzSWNvbkJhY2tncm91bmRDb2xvciA9ICgpID0+IHsKICAgIGNvbnN0IHBvcHVwID0gZ2V0UG9wdXAoKTsKICAgIGNvbnN0IHBvcHVwQmFja2dyb3VuZENvbG9yID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUocG9wdXApLmdldFByb3BlcnR5VmFsdWUoJ2JhY2tncm91bmQtY29sb3InKTsKICAgIC8qKiBAdHlwZSB7Tm9kZUxpc3RPZjxIVE1MRWxlbWVudD59ICovCgogICAgY29uc3Qgc3VjY2Vzc0ljb25QYXJ0cyA9IHBvcHVwLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tjbGFzc149c3dhbDItc3VjY2Vzcy1jaXJjdWxhci1saW5lXSwgLnN3YWwyLXN1Y2Nlc3MtZml4Jyk7CgogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdWNjZXNzSWNvblBhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHN1Y2Nlc3NJY29uUGFydHNbaV0uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gcG9wdXBCYWNrZ3JvdW5kQ29sb3I7CiAgICB9CiAgfTsKCiAgY29uc3Qgc3VjY2Vzc0ljb25IdG1sID0gIlxuICA8ZGl2IGNsYXNzPVwic3dhbDItc3VjY2Vzcy1jaXJjdWxhci1saW5lLWxlZnRcIj48L2Rpdj5cbiAgPHNwYW4gY2xhc3M9XCJzd2FsMi1zdWNjZXNzLWxpbmUtdGlwXCI+PC9zcGFuPiA8c3BhbiBjbGFzcz1cInN3YWwyLXN1Y2Nlc3MtbGluZS1sb25nXCI+PC9zcGFuPlxuICA8ZGl2IGNsYXNzPVwic3dhbDItc3VjY2Vzcy1yaW5nXCI+PC9kaXY+IDxkaXYgY2xhc3M9XCJzd2FsMi1zdWNjZXNzLWZpeFwiPjwvZGl2PlxuICA8ZGl2IGNsYXNzPVwic3dhbDItc3VjY2Vzcy1jaXJjdWxhci1saW5lLXJpZ2h0XCI+PC9kaXY+XG4iOwogIGNvbnN0IGVycm9ySWNvbkh0bWwgPSAiXG4gIDxzcGFuIGNsYXNzPVwic3dhbDIteC1tYXJrXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJzd2FsMi14LW1hcmstbGluZS1sZWZ0XCI+PC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPVwic3dhbDIteC1tYXJrLWxpbmUtcmlnaHRcIj48L3NwYW4+XG4gIDwvc3Bhbj5cbiI7CiAgLyoqCiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gaWNvbgogICAqIEBwYXJhbSB7U3dlZXRBbGVydE9wdGlvbnN9IHBhcmFtcwogICAqLwoKICBjb25zdCBzZXRDb250ZW50ID0gKGljb24sIHBhcmFtcykgPT4gewogICAgaWNvbi50ZXh0Q29udGVudCA9ICcnOwoKICAgIGlmIChwYXJhbXMuaWNvbkh0bWwpIHsKICAgICAgc2V0SW5uZXJIdG1sKGljb24sIGljb25Db250ZW50KHBhcmFtcy5pY29uSHRtbCkpOwogICAgfSBlbHNlIGlmIChwYXJhbXMuaWNvbiA9PT0gJ3N1Y2Nlc3MnKSB7CiAgICAgIHNldElubmVySHRtbChpY29uLCBzdWNjZXNzSWNvbkh0bWwpOwogICAgfSBlbHNlIGlmIChwYXJhbXMuaWNvbiA9PT0gJ2Vycm9yJykgewogICAgICBzZXRJbm5lckh0bWwoaWNvbiwgZXJyb3JJY29uSHRtbCk7CiAgICB9IGVsc2UgewogICAgICBjb25zdCBkZWZhdWx0SWNvbkh0bWwgPSB7CiAgICAgICAgcXVlc3Rpb246ICc/JywKICAgICAgICB3YXJuaW5nOiAnIScsCiAgICAgICAgaW5mbzogJ2knCiAgICAgIH07CiAgICAgIHNldElubmVySHRtbChpY29uLCBpY29uQ29udGVudChkZWZhdWx0SWNvbkh0bWxbcGFyYW1zLmljb25dKSk7CiAgICB9CiAgfTsKICAvKioKICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBpY29uCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0T3B0aW9uc30gcGFyYW1zCiAgICovCgoKICBjb25zdCBzZXRDb2xvciA9IChpY29uLCBwYXJhbXMpID0+IHsKICAgIGlmICghcGFyYW1zLmljb25Db2xvcikgewogICAgICByZXR1cm47CiAgICB9CgogICAgaWNvbi5zdHlsZS5jb2xvciA9IHBhcmFtcy5pY29uQ29sb3I7CiAgICBpY29uLnN0eWxlLmJvcmRlckNvbG9yID0gcGFyYW1zLmljb25Db2xvcjsKCiAgICBmb3IgKGNvbnN0IHNlbCBvZiBbJy5zd2FsMi1zdWNjZXNzLWxpbmUtdGlwJywgJy5zd2FsMi1zdWNjZXNzLWxpbmUtbG9uZycsICcuc3dhbDIteC1tYXJrLWxpbmUtbGVmdCcsICcuc3dhbDIteC1tYXJrLWxpbmUtcmlnaHQnXSkgewogICAgICBzZXRTdHlsZShpY29uLCBzZWwsICdiYWNrZ3JvdW5kQ29sb3InLCBwYXJhbXMuaWNvbkNvbG9yKTsKICAgIH0KCiAgICBzZXRTdHlsZShpY29uLCAnLnN3YWwyLXN1Y2Nlc3MtcmluZycsICdib3JkZXJDb2xvcicsIHBhcmFtcy5pY29uQ29sb3IpOwogIH07CiAgLyoqCiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQKICAgKi8KCgogIGNvbnN0IGljb25Db250ZW50ID0gY29udGVudCA9PiAiPGRpdiBjbGFzcz1cIiIuY29uY2F0KHN3YWxDbGFzc2VzWydpY29uLWNvbnRlbnQnXSwgIlwiPiIpLmNvbmNhdChjb250ZW50LCAiPC9kaXY+Iik7CgogIC8qKgogICAqIEBwYXJhbSB7U3dlZXRBbGVydDJ9IGluc3RhbmNlCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0T3B0aW9uc30gcGFyYW1zCiAgICovCgogIGNvbnN0IHJlbmRlckltYWdlID0gKGluc3RhbmNlLCBwYXJhbXMpID0+IHsKICAgIGNvbnN0IGltYWdlID0gZ2V0SW1hZ2UoKTsKCiAgICBpZiAoIXBhcmFtcy5pbWFnZVVybCkgewogICAgICByZXR1cm4gaGlkZShpbWFnZSk7CiAgICB9CgogICAgc2hvdyhpbWFnZSwgJycpOyAvLyBTcmMsIGFsdAoKICAgIGltYWdlLnNldEF0dHJpYnV0ZSgnc3JjJywgcGFyYW1zLmltYWdlVXJsKTsKICAgIGltYWdlLnNldEF0dHJpYnV0ZSgnYWx0JywgcGFyYW1zLmltYWdlQWx0KTsgLy8gV2lkdGgsIGhlaWdodAoKICAgIGFwcGx5TnVtZXJpY2FsU3R5bGUoaW1hZ2UsICd3aWR0aCcsIHBhcmFtcy5pbWFnZVdpZHRoKTsKICAgIGFwcGx5TnVtZXJpY2FsU3R5bGUoaW1hZ2UsICdoZWlnaHQnLCBwYXJhbXMuaW1hZ2VIZWlnaHQpOyAvLyBDbGFzcwoKICAgIGltYWdlLmNsYXNzTmFtZSA9IHN3YWxDbGFzc2VzLmltYWdlOwogICAgYXBwbHlDdXN0b21DbGFzcyhpbWFnZSwgcGFyYW1zLCAnaW1hZ2UnKTsKICB9OwoKICAvKioKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnQyfSBpbnN0YW5jZQogICAqIEBwYXJhbSB7U3dlZXRBbGVydE9wdGlvbnN9IHBhcmFtcwogICAqLwoKICBjb25zdCByZW5kZXJQcm9ncmVzc1N0ZXBzID0gKGluc3RhbmNlLCBwYXJhbXMpID0+IHsKICAgIGNvbnN0IHByb2dyZXNzU3RlcHNDb250YWluZXIgPSBnZXRQcm9ncmVzc1N0ZXBzKCk7CgogICAgaWYgKCFwYXJhbXMucHJvZ3Jlc3NTdGVwcyB8fCBwYXJhbXMucHJvZ3Jlc3NTdGVwcy5sZW5ndGggPT09IDApIHsKICAgICAgcmV0dXJuIGhpZGUocHJvZ3Jlc3NTdGVwc0NvbnRhaW5lcik7CiAgICB9CgogICAgc2hvdyhwcm9ncmVzc1N0ZXBzQ29udGFpbmVyKTsKICAgIHByb2dyZXNzU3RlcHNDb250YWluZXIudGV4dENvbnRlbnQgPSAnJzsKCiAgICBpZiAocGFyYW1zLmN1cnJlbnRQcm9ncmVzc1N0ZXAgPj0gcGFyYW1zLnByb2dyZXNzU3RlcHMubGVuZ3RoKSB7CiAgICAgIHdhcm4oJ0ludmFsaWQgY3VycmVudFByb2dyZXNzU3RlcCBwYXJhbWV0ZXIsIGl0IHNob3VsZCBiZSBsZXNzIHRoYW4gcHJvZ3Jlc3NTdGVwcy5sZW5ndGggJyArICcoY3VycmVudFByb2dyZXNzU3RlcCBsaWtlIEpTIGFycmF5cyBzdGFydHMgZnJvbSAwKScpOwogICAgfQoKICAgIHBhcmFtcy5wcm9ncmVzc1N0ZXBzLmZvckVhY2goKHN0ZXAsIGluZGV4KSA9PiB7CiAgICAgIGNvbnN0IHN0ZXBFbCA9IGNyZWF0ZVN0ZXBFbGVtZW50KHN0ZXApOwogICAgICBwcm9ncmVzc1N0ZXBzQ29udGFpbmVyLmFwcGVuZENoaWxkKHN0ZXBFbCk7CgogICAgICBpZiAoaW5kZXggPT09IHBhcmFtcy5jdXJyZW50UHJvZ3Jlc3NTdGVwKSB7CiAgICAgICAgYWRkQ2xhc3Moc3RlcEVsLCBzd2FsQ2xhc3Nlc1snYWN0aXZlLXByb2dyZXNzLXN0ZXAnXSk7CiAgICAgIH0KCiAgICAgIGlmIChpbmRleCAhPT0gcGFyYW1zLnByb2dyZXNzU3RlcHMubGVuZ3RoIC0gMSkgewogICAgICAgIGNvbnN0IGxpbmVFbCA9IGNyZWF0ZUxpbmVFbGVtZW50KHBhcmFtcyk7CiAgICAgICAgcHJvZ3Jlc3NTdGVwc0NvbnRhaW5lci5hcHBlbmRDaGlsZChsaW5lRWwpOwogICAgICB9CiAgICB9KTsKICB9OwogIC8qKgogICAqIEBwYXJhbSB7c3RyaW5nfSBzdGVwCiAgICogQHJldHVybnMge0hUTUxMSUVsZW1lbnR9CiAgICovCgogIGNvbnN0IGNyZWF0ZVN0ZXBFbGVtZW50ID0gc3RlcCA9PiB7CiAgICBjb25zdCBzdGVwRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpOwogICAgYWRkQ2xhc3Moc3RlcEVsLCBzd2FsQ2xhc3Nlc1sncHJvZ3Jlc3Mtc3RlcCddKTsKICAgIHNldElubmVySHRtbChzdGVwRWwsIHN0ZXApOwogICAgcmV0dXJuIHN0ZXBFbDsKICB9OwogIC8qKgogICAqIEBwYXJhbSB7U3dlZXRBbGVydE9wdGlvbnN9IHBhcmFtcwogICAqIEByZXR1cm5zIHtIVE1MTElFbGVtZW50fQogICAqLwoKCiAgY29uc3QgY3JlYXRlTGluZUVsZW1lbnQgPSBwYXJhbXMgPT4gewogICAgY29uc3QgbGluZUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTsKICAgIGFkZENsYXNzKGxpbmVFbCwgc3dhbENsYXNzZXNbJ3Byb2dyZXNzLXN0ZXAtbGluZSddKTsKCiAgICBpZiAocGFyYW1zLnByb2dyZXNzU3RlcHNEaXN0YW5jZSkgewogICAgICBhcHBseU51bWVyaWNhbFN0eWxlKGxpbmVFbCwgJ3dpZHRoJywgcGFyYW1zLnByb2dyZXNzU3RlcHNEaXN0YW5jZSk7CiAgICB9CgogICAgcmV0dXJuIGxpbmVFbDsKICB9OwoKICAvKioKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnQyfSBpbnN0YW5jZQogICAqIEBwYXJhbSB7U3dlZXRBbGVydE9wdGlvbnN9IHBhcmFtcwogICAqLwoKICBjb25zdCByZW5kZXJUaXRsZSA9IChpbnN0YW5jZSwgcGFyYW1zKSA9PiB7CiAgICBjb25zdCB0aXRsZSA9IGdldFRpdGxlKCk7CiAgICB0b2dnbGUodGl0bGUsIHBhcmFtcy50aXRsZSB8fCBwYXJhbXMudGl0bGVUZXh0LCAnYmxvY2snKTsKCiAgICBpZiAocGFyYW1zLnRpdGxlKSB7CiAgICAgIHBhcnNlSHRtbFRvQ29udGFpbmVyKHBhcmFtcy50aXRsZSwgdGl0bGUpOwogICAgfQoKICAgIGlmIChwYXJhbXMudGl0bGVUZXh0KSB7CiAgICAgIHRpdGxlLmlubmVyVGV4dCA9IHBhcmFtcy50aXRsZVRleHQ7CiAgICB9IC8vIEN1c3RvbSBjbGFzcwoKCiAgICBhcHBseUN1c3RvbUNsYXNzKHRpdGxlLCBwYXJhbXMsICd0aXRsZScpOwogIH07CgogIC8qKgogICAqIEBwYXJhbSB7U3dlZXRBbGVydDJ9IGluc3RhbmNlCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0T3B0aW9uc30gcGFyYW1zCiAgICovCgogIGNvbnN0IHJlbmRlclBvcHVwID0gKGluc3RhbmNlLCBwYXJhbXMpID0+IHsKICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lcigpOwogICAgY29uc3QgcG9wdXAgPSBnZXRQb3B1cCgpOyAvLyBXaWR0aAogICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3N3ZWV0YWxlcnQyL3N3ZWV0YWxlcnQyL2lzc3Vlcy8yMTcwCgogICAgaWYgKHBhcmFtcy50b2FzdCkgewogICAgICBhcHBseU51bWVyaWNhbFN0eWxlKGNvbnRhaW5lciwgJ3dpZHRoJywgcGFyYW1zLndpZHRoKTsKICAgICAgcG9wdXAuc3R5bGUud2lkdGggPSAnMTAwJSc7CiAgICAgIHBvcHVwLmluc2VydEJlZm9yZShnZXRMb2FkZXIoKSwgZ2V0SWNvbigpKTsKICAgIH0gZWxzZSB7CiAgICAgIGFwcGx5TnVtZXJpY2FsU3R5bGUocG9wdXAsICd3aWR0aCcsIHBhcmFtcy53aWR0aCk7CiAgICB9IC8vIFBhZGRpbmcKCgogICAgYXBwbHlOdW1lcmljYWxTdHlsZShwb3B1cCwgJ3BhZGRpbmcnLCBwYXJhbXMucGFkZGluZyk7IC8vIENvbG9yCgogICAgaWYgKHBhcmFtcy5jb2xvcikgewogICAgICBwb3B1cC5zdHlsZS5jb2xvciA9IHBhcmFtcy5jb2xvcjsKICAgIH0gLy8gQmFja2dyb3VuZAoKCiAgICBpZiAocGFyYW1zLmJhY2tncm91bmQpIHsKICAgICAgcG9wdXAuc3R5bGUuYmFja2dyb3VuZCA9IHBhcmFtcy5iYWNrZ3JvdW5kOwogICAgfQoKICAgIGhpZGUoZ2V0VmFsaWRhdGlvbk1lc3NhZ2UoKSk7IC8vIENsYXNzZXMKCiAgICBhZGRDbGFzc2VzKHBvcHVwLCBwYXJhbXMpOwogIH07CiAgLyoqCiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcG9wdXAKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnRPcHRpb25zfSBwYXJhbXMKICAgKi8KCiAgY29uc3QgYWRkQ2xhc3NlcyA9IChwb3B1cCwgcGFyYW1zKSA9PiB7CiAgICAvLyBEZWZhdWx0IENsYXNzICsgc2hvd0NsYXNzIHdoZW4gdXBkYXRpbmcgU3dhbC51cGRhdGUoe30pCiAgICBwb3B1cC5jbGFzc05hbWUgPSAiIi5jb25jYXQoc3dhbENsYXNzZXMucG9wdXAsICIgIikuY29uY2F0KGlzVmlzaWJsZShwb3B1cCkgPyBwYXJhbXMuc2hvd0NsYXNzLnBvcHVwIDogJycpOwoKICAgIGlmIChwYXJhbXMudG9hc3QpIHsKICAgICAgYWRkQ2xhc3MoW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgZG9jdW1lbnQuYm9keV0sIHN3YWxDbGFzc2VzWyd0b2FzdC1zaG93biddKTsKICAgICAgYWRkQ2xhc3MocG9wdXAsIHN3YWxDbGFzc2VzLnRvYXN0KTsKICAgIH0gZWxzZSB7CiAgICAgIGFkZENsYXNzKHBvcHVwLCBzd2FsQ2xhc3Nlcy5tb2RhbCk7CiAgICB9IC8vIEN1c3RvbSBjbGFzcwoKCiAgICBhcHBseUN1c3RvbUNsYXNzKHBvcHVwLCBwYXJhbXMsICdwb3B1cCcpOwoKICAgIGlmICh0eXBlb2YgcGFyYW1zLmN1c3RvbUNsYXNzID09PSAnc3RyaW5nJykgewogICAgICBhZGRDbGFzcyhwb3B1cCwgcGFyYW1zLmN1c3RvbUNsYXNzKTsKICAgIH0gLy8gSWNvbiBjbGFzcyAoIzE4NDIpCgoKICAgIGlmIChwYXJhbXMuaWNvbikgewogICAgICBhZGRDbGFzcyhwb3B1cCwgc3dhbENsYXNzZXNbImljb24tIi5jb25jYXQocGFyYW1zLmljb24pXSk7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0Mn0gaW5zdGFuY2UKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnRPcHRpb25zfSBwYXJhbXMKICAgKi8KCiAgY29uc3QgcmVuZGVyID0gKGluc3RhbmNlLCBwYXJhbXMpID0+IHsKICAgIHJlbmRlclBvcHVwKGluc3RhbmNlLCBwYXJhbXMpOwogICAgcmVuZGVyQ29udGFpbmVyKGluc3RhbmNlLCBwYXJhbXMpOwogICAgcmVuZGVyUHJvZ3Jlc3NTdGVwcyhpbnN0YW5jZSwgcGFyYW1zKTsKICAgIHJlbmRlckljb24oaW5zdGFuY2UsIHBhcmFtcyk7CiAgICByZW5kZXJJbWFnZShpbnN0YW5jZSwgcGFyYW1zKTsKICAgIHJlbmRlclRpdGxlKGluc3RhbmNlLCBwYXJhbXMpOwogICAgcmVuZGVyQ2xvc2VCdXR0b24oaW5zdGFuY2UsIHBhcmFtcyk7CiAgICByZW5kZXJDb250ZW50KGluc3RhbmNlLCBwYXJhbXMpOwogICAgcmVuZGVyQWN0aW9ucyhpbnN0YW5jZSwgcGFyYW1zKTsKICAgIHJlbmRlckZvb3RlcihpbnN0YW5jZSwgcGFyYW1zKTsKCiAgICBpZiAodHlwZW9mIHBhcmFtcy5kaWRSZW5kZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgcGFyYW1zLmRpZFJlbmRlcihnZXRQb3B1cCgpKTsKICAgIH0KICB9OwoKICBjb25zdCBEaXNtaXNzUmVhc29uID0gT2JqZWN0LmZyZWV6ZSh7CiAgICBjYW5jZWw6ICdjYW5jZWwnLAogICAgYmFja2Ryb3A6ICdiYWNrZHJvcCcsCiAgICBjbG9zZTogJ2Nsb3NlJywKICAgIGVzYzogJ2VzYycsCiAgICB0aW1lcjogJ3RpbWVyJwogIH0pOwoKICAvLyBBZGRpbmcgYXJpYS1oaWRkZW49InRydWUiIHRvIGVsZW1lbnRzIG91dHNpZGUgb2YgdGhlIGFjdGl2ZSBtb2RhbCBkaWFsb2cgZW5zdXJlcyB0aGF0CiAgLy8gZWxlbWVudHMgbm90IHdpdGhpbiB0aGUgYWN0aXZlIG1vZGFsIGRpYWxvZyB3aWxsIG5vdCBiZSBzdXJmYWNlZCBpZiBhIHVzZXIgb3BlbnMgYSBzY3JlZW4KICAvLyByZWFkZXLigJlzIGxpc3Qgb2YgZWxlbWVudHMgKGhlYWRpbmdzLCBmb3JtIGNvbnRyb2xzLCBsYW5kbWFya3MsIGV0Yy4pIGluIHRoZSBkb2N1bWVudC4KCiAgY29uc3Qgc2V0QXJpYUhpZGRlbiA9ICgpID0+IHsKICAgIGNvbnN0IGJvZHlDaGlsZHJlbiA9IHRvQXJyYXkoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7CiAgICBib2R5Q2hpbGRyZW4uZm9yRWFjaChlbCA9PiB7CiAgICAgIGlmIChlbCA9PT0gZ2V0Q29udGFpbmVyKCkgfHwgZWwuY29udGFpbnMoZ2V0Q29udGFpbmVyKCkpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBpZiAoZWwuaGFzQXR0cmlidXRlKCdhcmlhLWhpZGRlbicpKSB7CiAgICAgICAgZWwuc2V0QXR0cmlidXRlKCdkYXRhLXByZXZpb3VzLWFyaWEtaGlkZGVuJywgZWwuZ2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicpKTsKICAgICAgfQoKICAgICAgZWwuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7CiAgICB9KTsKICB9OwogIGNvbnN0IHVuc2V0QXJpYUhpZGRlbiA9ICgpID0+IHsKICAgIGNvbnN0IGJvZHlDaGlsZHJlbiA9IHRvQXJyYXkoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7CiAgICBib2R5Q2hpbGRyZW4uZm9yRWFjaChlbCA9PiB7CiAgICAgIGlmIChlbC5oYXNBdHRyaWJ1dGUoJ2RhdGEtcHJldmlvdXMtYXJpYS1oaWRkZW4nKSkgewogICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCBlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcHJldmlvdXMtYXJpYS1oaWRkZW4nKSk7CiAgICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXByZXZpb3VzLWFyaWEtaGlkZGVuJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWhpZGRlbicpOwogICAgICB9CiAgICB9KTsKICB9OwoKICBjb25zdCBzd2FsU3RyaW5nUGFyYW1zID0gWydzd2FsLXRpdGxlJywgJ3N3YWwtaHRtbCcsICdzd2FsLWZvb3RlciddOwogIGNvbnN0IGdldFRlbXBsYXRlUGFyYW1zID0gcGFyYW1zID0+IHsKICAgIGNvbnN0IHRlbXBsYXRlID0gdHlwZW9mIHBhcmFtcy50ZW1wbGF0ZSA9PT0gJ3N0cmluZycgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHBhcmFtcy50ZW1wbGF0ZSkgOiBwYXJhbXMudGVtcGxhdGU7CgogICAgaWYgKCF0ZW1wbGF0ZSkgewogICAgICByZXR1cm4ge307CiAgICB9CiAgICAvKiogQHR5cGUge0RvY3VtZW50RnJhZ21lbnR9ICovCgoKICAgIGNvbnN0IHRlbXBsYXRlQ29udGVudCA9IHRlbXBsYXRlLmNvbnRlbnQ7CiAgICBzaG93V2FybmluZ3NGb3JFbGVtZW50cyh0ZW1wbGF0ZUNvbnRlbnQpOwogICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmFzc2lnbihnZXRTd2FsUGFyYW1zKHRlbXBsYXRlQ29udGVudCksIGdldFN3YWxCdXR0b25zKHRlbXBsYXRlQ29udGVudCksIGdldFN3YWxJbWFnZSh0ZW1wbGF0ZUNvbnRlbnQpLCBnZXRTd2FsSWNvbih0ZW1wbGF0ZUNvbnRlbnQpLCBnZXRTd2FsSW5wdXQodGVtcGxhdGVDb250ZW50KSwgZ2V0U3dhbFN0cmluZ1BhcmFtcyh0ZW1wbGF0ZUNvbnRlbnQsIHN3YWxTdHJpbmdQYXJhbXMpKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfTsKICAvKioKICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IHRlbXBsYXRlQ29udGVudAogICAqLwoKICBjb25zdCBnZXRTd2FsUGFyYW1zID0gdGVtcGxhdGVDb250ZW50ID0+IHsKICAgIGNvbnN0IHJlc3VsdCA9IHt9OwogICAgdG9BcnJheSh0ZW1wbGF0ZUNvbnRlbnQucXVlcnlTZWxlY3RvckFsbCgnc3dhbC1wYXJhbScpKS5mb3JFYWNoKHBhcmFtID0+IHsKICAgICAgc2hvd1dhcm5pbmdzRm9yQXR0cmlidXRlcyhwYXJhbSwgWyduYW1lJywgJ3ZhbHVlJ10pOwogICAgICBjb25zdCBwYXJhbU5hbWUgPSBwYXJhbS5nZXRBdHRyaWJ1dGUoJ25hbWUnKTsKICAgICAgY29uc3QgdmFsdWUgPSBwYXJhbS5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJyk7CgogICAgICBpZiAodHlwZW9mIGRlZmF1bHRQYXJhbXNbcGFyYW1OYW1lXSA9PT0gJ2Jvb2xlYW4nICYmIHZhbHVlID09PSAnZmFsc2UnKSB7CiAgICAgICAgcmVzdWx0W3BhcmFtTmFtZV0gPSBmYWxzZTsKICAgICAgfQoKICAgICAgaWYgKHR5cGVvZiBkZWZhdWx0UGFyYW1zW3BhcmFtTmFtZV0gPT09ICdvYmplY3QnKSB7CiAgICAgICAgcmVzdWx0W3BhcmFtTmFtZV0gPSBKU09OLnBhcnNlKHZhbHVlKTsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH07CiAgLyoqCiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSB0ZW1wbGF0ZUNvbnRlbnQKICAgKi8KCgogIGNvbnN0IGdldFN3YWxCdXR0b25zID0gdGVtcGxhdGVDb250ZW50ID0+IHsKICAgIGNvbnN0IHJlc3VsdCA9IHt9OwogICAgdG9BcnJheSh0ZW1wbGF0ZUNvbnRlbnQucXVlcnlTZWxlY3RvckFsbCgnc3dhbC1idXR0b24nKSkuZm9yRWFjaChidXR0b24gPT4gewogICAgICBzaG93V2FybmluZ3NGb3JBdHRyaWJ1dGVzKGJ1dHRvbiwgWyd0eXBlJywgJ2NvbG9yJywgJ2FyaWEtbGFiZWwnXSk7CiAgICAgIGNvbnN0IHR5cGUgPSBidXR0b24uZ2V0QXR0cmlidXRlKCd0eXBlJyk7CiAgICAgIHJlc3VsdFsiIi5jb25jYXQodHlwZSwgIkJ1dHRvblRleHQiKV0gPSBidXR0b24uaW5uZXJIVE1MOwogICAgICByZXN1bHRbInNob3ciLmNvbmNhdChjYXBpdGFsaXplRmlyc3RMZXR0ZXIodHlwZSksICJCdXR0b24iKV0gPSB0cnVlOwoKICAgICAgaWYgKGJ1dHRvbi5oYXNBdHRyaWJ1dGUoJ2NvbG9yJykpIHsKICAgICAgICByZXN1bHRbIiIuY29uY2F0KHR5cGUsICJCdXR0b25Db2xvciIpXSA9IGJ1dHRvbi5nZXRBdHRyaWJ1dGUoJ2NvbG9yJyk7CiAgICAgIH0KCiAgICAgIGlmIChidXR0b24uaGFzQXR0cmlidXRlKCdhcmlhLWxhYmVsJykpIHsKICAgICAgICByZXN1bHRbIiIuY29uY2F0KHR5cGUsICJCdXR0b25BcmlhTGFiZWwiKV0gPSBidXR0b24uZ2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJyk7CiAgICAgIH0KICAgIH0pOwogICAgcmV0dXJuIHJlc3VsdDsKICB9OwogIC8qKgogICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gdGVtcGxhdGVDb250ZW50CiAgICovCgoKICBjb25zdCBnZXRTd2FsSW1hZ2UgPSB0ZW1wbGF0ZUNvbnRlbnQgPT4gewogICAgY29uc3QgcmVzdWx0ID0ge307CiAgICAvKiogQHR5cGUge0hUTUxFbGVtZW50fSAqLwoKICAgIGNvbnN0IGltYWdlID0gdGVtcGxhdGVDb250ZW50LnF1ZXJ5U2VsZWN0b3IoJ3N3YWwtaW1hZ2UnKTsKCiAgICBpZiAoaW1hZ2UpIHsKICAgICAgc2hvd1dhcm5pbmdzRm9yQXR0cmlidXRlcyhpbWFnZSwgWydzcmMnLCAnd2lkdGgnLCAnaGVpZ2h0JywgJ2FsdCddKTsKCiAgICAgIGlmIChpbWFnZS5oYXNBdHRyaWJ1dGUoJ3NyYycpKSB7CiAgICAgICAgcmVzdWx0LmltYWdlVXJsID0gaW1hZ2UuZ2V0QXR0cmlidXRlKCdzcmMnKTsKICAgICAgfQoKICAgICAgaWYgKGltYWdlLmhhc0F0dHJpYnV0ZSgnd2lkdGgnKSkgewogICAgICAgIHJlc3VsdC5pbWFnZVdpZHRoID0gaW1hZ2UuZ2V0QXR0cmlidXRlKCd3aWR0aCcpOwogICAgICB9CgogICAgICBpZiAoaW1hZ2UuaGFzQXR0cmlidXRlKCdoZWlnaHQnKSkgewogICAgICAgIHJlc3VsdC5pbWFnZUhlaWdodCA9IGltYWdlLmdldEF0dHJpYnV0ZSgnaGVpZ2h0Jyk7CiAgICAgIH0KCiAgICAgIGlmIChpbWFnZS5oYXNBdHRyaWJ1dGUoJ2FsdCcpKSB7CiAgICAgICAgcmVzdWx0LmltYWdlQWx0ID0gaW1hZ2UuZ2V0QXR0cmlidXRlKCdhbHQnKTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiByZXN1bHQ7CiAgfTsKICAvKioKICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IHRlbXBsYXRlQ29udGVudAogICAqLwoKCiAgY29uc3QgZ2V0U3dhbEljb24gPSB0ZW1wbGF0ZUNvbnRlbnQgPT4gewogICAgY29uc3QgcmVzdWx0ID0ge307CiAgICAvKiogQHR5cGUge0hUTUxFbGVtZW50fSAqLwoKICAgIGNvbnN0IGljb24gPSB0ZW1wbGF0ZUNvbnRlbnQucXVlcnlTZWxlY3Rvcignc3dhbC1pY29uJyk7CgogICAgaWYgKGljb24pIHsKICAgICAgc2hvd1dhcm5pbmdzRm9yQXR0cmlidXRlcyhpY29uLCBbJ3R5cGUnLCAnY29sb3InXSk7CgogICAgICBpZiAoaWNvbi5oYXNBdHRyaWJ1dGUoJ3R5cGUnKSkgewogICAgICAgIHJlc3VsdC5pY29uID0gaWNvbi5nZXRBdHRyaWJ1dGUoJ3R5cGUnKTsKICAgICAgfQoKICAgICAgaWYgKGljb24uaGFzQXR0cmlidXRlKCdjb2xvcicpKSB7CiAgICAgICAgcmVzdWx0Lmljb25Db2xvciA9IGljb24uZ2V0QXR0cmlidXRlKCdjb2xvcicpOwogICAgICB9CgogICAgICByZXN1bHQuaWNvbkh0bWwgPSBpY29uLmlubmVySFRNTDsKICAgIH0KCiAgICByZXR1cm4gcmVzdWx0OwogIH07CiAgLyoqCiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSB0ZW1wbGF0ZUNvbnRlbnQKICAgKi8KCgogIGNvbnN0IGdldFN3YWxJbnB1dCA9IHRlbXBsYXRlQ29udGVudCA9PiB7CiAgICBjb25zdCByZXN1bHQgPSB7fTsKICAgIC8qKiBAdHlwZSB7SFRNTEVsZW1lbnR9ICovCgogICAgY29uc3QgaW5wdXQgPSB0ZW1wbGF0ZUNvbnRlbnQucXVlcnlTZWxlY3Rvcignc3dhbC1pbnB1dCcpOwoKICAgIGlmIChpbnB1dCkgewogICAgICBzaG93V2FybmluZ3NGb3JBdHRyaWJ1dGVzKGlucHV0LCBbJ3R5cGUnLCAnbGFiZWwnLCAncGxhY2Vob2xkZXInLCAndmFsdWUnXSk7CiAgICAgIHJlc3VsdC5pbnB1dCA9IGlucHV0LmdldEF0dHJpYnV0ZSgndHlwZScpIHx8ICd0ZXh0JzsKCiAgICAgIGlmIChpbnB1dC5oYXNBdHRyaWJ1dGUoJ2xhYmVsJykpIHsKICAgICAgICByZXN1bHQuaW5wdXRMYWJlbCA9IGlucHV0LmdldEF0dHJpYnV0ZSgnbGFiZWwnKTsKICAgICAgfQoKICAgICAgaWYgKGlucHV0Lmhhc0F0dHJpYnV0ZSgncGxhY2Vob2xkZXInKSkgewogICAgICAgIHJlc3VsdC5pbnB1dFBsYWNlaG9sZGVyID0gaW5wdXQuZ2V0QXR0cmlidXRlKCdwbGFjZWhvbGRlcicpOwogICAgICB9CgogICAgICBpZiAoaW5wdXQuaGFzQXR0cmlidXRlKCd2YWx1ZScpKSB7CiAgICAgICAgcmVzdWx0LmlucHV0VmFsdWUgPSBpbnB1dC5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJyk7CiAgICAgIH0KICAgIH0KCiAgICBjb25zdCBpbnB1dE9wdGlvbnMgPSB0ZW1wbGF0ZUNvbnRlbnQucXVlcnlTZWxlY3RvckFsbCgnc3dhbC1pbnB1dC1vcHRpb24nKTsKCiAgICBpZiAoaW5wdXRPcHRpb25zLmxlbmd0aCkgewogICAgICByZXN1bHQuaW5wdXRPcHRpb25zID0ge307CiAgICAgIHRvQXJyYXkoaW5wdXRPcHRpb25zKS5mb3JFYWNoKG9wdGlvbiA9PiB7CiAgICAgICAgc2hvd1dhcm5pbmdzRm9yQXR0cmlidXRlcyhvcHRpb24sIFsndmFsdWUnXSk7CiAgICAgICAgY29uc3Qgb3B0aW9uVmFsdWUgPSBvcHRpb24uZ2V0QXR0cmlidXRlKCd2YWx1ZScpOwogICAgICAgIGNvbnN0IG9wdGlvbk5hbWUgPSBvcHRpb24uaW5uZXJIVE1MOwogICAgICAgIHJlc3VsdC5pbnB1dE9wdGlvbnNbb3B0aW9uVmFsdWVdID0gb3B0aW9uTmFtZTsKICAgICAgfSk7CiAgICB9CgogICAgcmV0dXJuIHJlc3VsdDsKICB9OwogIC8qKgogICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gdGVtcGxhdGVDb250ZW50CiAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGFyYW1OYW1lcwogICAqLwoKCiAgY29uc3QgZ2V0U3dhbFN0cmluZ1BhcmFtcyA9ICh0ZW1wbGF0ZUNvbnRlbnQsIHBhcmFtTmFtZXMpID0+IHsKICAgIGNvbnN0IHJlc3VsdCA9IHt9OwoKICAgIGZvciAoY29uc3QgaSBpbiBwYXJhbU5hbWVzKSB7CiAgICAgIGNvbnN0IHBhcmFtTmFtZSA9IHBhcmFtTmFtZXNbaV07CiAgICAgIC8qKiBAdHlwZSB7SFRNTEVsZW1lbnR9ICovCgogICAgICBjb25zdCB0YWcgPSB0ZW1wbGF0ZUNvbnRlbnQucXVlcnlTZWxlY3RvcihwYXJhbU5hbWUpOwoKICAgICAgaWYgKHRhZykgewogICAgICAgIHNob3dXYXJuaW5nc0ZvckF0dHJpYnV0ZXModGFnLCBbXSk7CiAgICAgICAgcmVzdWx0W3BhcmFtTmFtZS5yZXBsYWNlKC9ec3dhbC0vLCAnJyldID0gdGFnLmlubmVySFRNTC50cmltKCk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gcmVzdWx0OwogIH07CiAgLyoqCiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSB0ZW1wbGF0ZUNvbnRlbnQKICAgKi8KCgogIGNvbnN0IHNob3dXYXJuaW5nc0ZvckVsZW1lbnRzID0gdGVtcGxhdGVDb250ZW50ID0+IHsKICAgIGNvbnN0IGFsbG93ZWRFbGVtZW50cyA9IHN3YWxTdHJpbmdQYXJhbXMuY29uY2F0KFsnc3dhbC1wYXJhbScsICdzd2FsLWJ1dHRvbicsICdzd2FsLWltYWdlJywgJ3N3YWwtaWNvbicsICdzd2FsLWlucHV0JywgJ3N3YWwtaW5wdXQtb3B0aW9uJ10pOwogICAgdG9BcnJheSh0ZW1wbGF0ZUNvbnRlbnQuY2hpbGRyZW4pLmZvckVhY2goZWwgPT4gewogICAgICBjb25zdCB0YWdOYW1lID0gZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpOwoKICAgICAgaWYgKGFsbG93ZWRFbGVtZW50cy5pbmRleE9mKHRhZ05hbWUpID09PSAtMSkgewogICAgICAgIHdhcm4oIlVucmVjb2duaXplZCBlbGVtZW50IDwiLmNvbmNhdCh0YWdOYW1lLCAiPiIpKTsKICAgICAgfQogICAgfSk7CiAgfTsKICAvKioKICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbAogICAqIEBwYXJhbSB7c3RyaW5nW119IGFsbG93ZWRBdHRyaWJ1dGVzCiAgICovCgoKICBjb25zdCBzaG93V2FybmluZ3NGb3JBdHRyaWJ1dGVzID0gKGVsLCBhbGxvd2VkQXR0cmlidXRlcykgPT4gewogICAgdG9BcnJheShlbC5hdHRyaWJ1dGVzKS5mb3JFYWNoKGF0dHJpYnV0ZSA9PiB7CiAgICAgIGlmIChhbGxvd2VkQXR0cmlidXRlcy5pbmRleE9mKGF0dHJpYnV0ZS5uYW1lKSA9PT0gLTEpIHsKICAgICAgICB3YXJuKFsiVW5yZWNvZ25pemVkIGF0dHJpYnV0ZSBcIiIuY29uY2F0KGF0dHJpYnV0ZS5uYW1lLCAiXCIgb24gPCIpLmNvbmNhdChlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCksICI+LiIpLCAiIi5jb25jYXQoYWxsb3dlZEF0dHJpYnV0ZXMubGVuZ3RoID8gIkFsbG93ZWQgYXR0cmlidXRlcyBhcmU6ICIuY29uY2F0KGFsbG93ZWRBdHRyaWJ1dGVzLmpvaW4oJywgJykpIDogJ1RvIHNldCB0aGUgdmFsdWUsIHVzZSBIVE1MIHdpdGhpbiB0aGUgZWxlbWVudC4nKV0pOwogICAgICB9CiAgICB9KTsKICB9OwoKICB2YXIgZGVmYXVsdElucHV0VmFsaWRhdG9ycyA9IHsKICAgIGVtYWlsOiAoc3RyaW5nLCB2YWxpZGF0aW9uTWVzc2FnZSkgPT4gewogICAgICByZXR1cm4gL15bYS16QS1aMC05LitfLV0rQFthLXpBLVowLTkuLV0rXC5bYS16QS1aMC05LV17MiwyNH0kLy50ZXN0KHN0cmluZykgPyBQcm9taXNlLnJlc29sdmUoKSA6IFByb21pc2UucmVzb2x2ZSh2YWxpZGF0aW9uTWVzc2FnZSB8fCAnSW52YWxpZCBlbWFpbCBhZGRyZXNzJyk7CiAgICB9LAogICAgdXJsOiAoc3RyaW5nLCB2YWxpZGF0aW9uTWVzc2FnZSkgPT4gewogICAgICAvLyB0YWtlbiBmcm9tIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zODA5NDM1IHdpdGggYSBzbWFsbCBjaGFuZ2UgZnJvbSAjMTMwNiBhbmQgIzIwMTMKICAgICAgcmV0dXJuIC9eaHR0cHM/OlwvXC8od3d3XC4pP1stYS16QS1aMC05QDolLl8rfiM9XXsxLDI1Nn1cLlthLXpdezIsNjN9XGIoWy1hLXpBLVowLTlAOiVfKy5+Iz8mLz1dKikkLy50ZXN0KHN0cmluZykgPyBQcm9taXNlLnJlc29sdmUoKSA6IFByb21pc2UucmVzb2x2ZSh2YWxpZGF0aW9uTWVzc2FnZSB8fCAnSW52YWxpZCBVUkwnKTsKICAgIH0KICB9OwoKICBmdW5jdGlvbiBzZXREZWZhdWx0SW5wdXRWYWxpZGF0b3JzKHBhcmFtcykgewogICAgLy8gVXNlIGRlZmF1bHQgYGlucHV0VmFsaWRhdG9yYCBmb3Igc3VwcG9ydGVkIGlucHV0IHR5cGVzIGlmIG5vdCBwcm92aWRlZAogICAgaWYgKCFwYXJhbXMuaW5wdXRWYWxpZGF0b3IpIHsKICAgICAgT2JqZWN0LmtleXMoZGVmYXVsdElucHV0VmFsaWRhdG9ycykuZm9yRWFjaChrZXkgPT4gewogICAgICAgIGlmIChwYXJhbXMuaW5wdXQgPT09IGtleSkgewogICAgICAgICAgcGFyYW1zLmlucHV0VmFsaWRhdG9yID0gZGVmYXVsdElucHV0VmFsaWRhdG9yc1trZXldOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB2YWxpZGF0ZUN1c3RvbVRhcmdldEVsZW1lbnQocGFyYW1zKSB7CiAgICAvLyBEZXRlcm1pbmUgaWYgdGhlIGN1c3RvbSB0YXJnZXQgZWxlbWVudCBpcyB2YWxpZAogICAgaWYgKCFwYXJhbXMudGFyZ2V0IHx8IHR5cGVvZiBwYXJhbXMudGFyZ2V0ID09PSAnc3RyaW5nJyAmJiAhZG9jdW1lbnQucXVlcnlTZWxlY3RvcihwYXJhbXMudGFyZ2V0KSB8fCB0eXBlb2YgcGFyYW1zLnRhcmdldCAhPT0gJ3N0cmluZycgJiYgIXBhcmFtcy50YXJnZXQuYXBwZW5kQ2hpbGQpIHsKICAgICAgd2FybignVGFyZ2V0IHBhcmFtZXRlciBpcyBub3QgdmFsaWQsIGRlZmF1bHRpbmcgdG8gImJvZHkiJyk7CiAgICAgIHBhcmFtcy50YXJnZXQgPSAnYm9keSc7CiAgICB9CiAgfQogIC8qKgogICAqIFNldCB0eXBlLCB0ZXh0IGFuZCBhY3Rpb25zIG9uIHBvcHVwCiAgICoKICAgKiBAcGFyYW0gcGFyYW1zCiAgICovCgoKICBmdW5jdGlvbiBzZXRQYXJhbWV0ZXJzKHBhcmFtcykgewogICAgc2V0RGVmYXVsdElucHV0VmFsaWRhdG9ycyhwYXJhbXMpOyAvLyBzaG93TG9hZGVyT25Db25maXJtICYmIHByZUNvbmZpcm0KCiAgICBpZiAocGFyYW1zLnNob3dMb2FkZXJPbkNvbmZpcm0gJiYgIXBhcmFtcy5wcmVDb25maXJtKSB7CiAgICAgIHdhcm4oJ3Nob3dMb2FkZXJPbkNvbmZpcm0gaXMgc2V0IHRvIHRydWUsIGJ1dCBwcmVDb25maXJtIGlzIG5vdCBkZWZpbmVkLlxuJyArICdzaG93TG9hZGVyT25Db25maXJtIHNob3VsZCBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggcHJlQ29uZmlybSwgc2VlIHVzYWdlIGV4YW1wbGU6XG4nICsgJ2h0dHBzOi8vc3dlZXRhbGVydDIuZ2l0aHViLmlvLyNhamF4LXJlcXVlc3QnKTsKICAgIH0KCiAgICB2YWxpZGF0ZUN1c3RvbVRhcmdldEVsZW1lbnQocGFyYW1zKTsgLy8gUmVwbGFjZSBuZXdsaW5lcyB3aXRoIDxicj4gaW4gdGl0bGUKCiAgICBpZiAodHlwZW9mIHBhcmFtcy50aXRsZSA9PT0gJ3N0cmluZycpIHsKICAgICAgcGFyYW1zLnRpdGxlID0gcGFyYW1zLnRpdGxlLnNwbGl0KCdcbicpLmpvaW4oJzxiciAvPicpOwogICAgfQoKICAgIGluaXQocGFyYW1zKTsKICB9CgogIGNsYXNzIFRpbWVyIHsKICAgIGNvbnN0cnVjdG9yKGNhbGxiYWNrLCBkZWxheSkgewogICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7CiAgICAgIHRoaXMucmVtYWluaW5nID0gZGVsYXk7CiAgICAgIHRoaXMucnVubmluZyA9IGZhbHNlOwogICAgICB0aGlzLnN0YXJ0KCk7CiAgICB9CgogICAgc3RhcnQoKSB7CiAgICAgIGlmICghdGhpcy5ydW5uaW5nKSB7CiAgICAgICAgdGhpcy5ydW5uaW5nID0gdHJ1ZTsKICAgICAgICB0aGlzLnN0YXJ0ZWQgPSBuZXcgRGF0ZSgpOwogICAgICAgIHRoaXMuaWQgPSBzZXRUaW1lb3V0KHRoaXMuY2FsbGJhY2ssIHRoaXMucmVtYWluaW5nKTsKICAgICAgfQoKICAgICAgcmV0dXJuIHRoaXMucmVtYWluaW5nOwogICAgfQoKICAgIHN0b3AoKSB7CiAgICAgIGlmICh0aGlzLnJ1bm5pbmcpIHsKICAgICAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTsKICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5pZCk7CiAgICAgICAgdGhpcy5yZW1haW5pbmcgLT0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLSB0aGlzLnN0YXJ0ZWQuZ2V0VGltZSgpOwogICAgICB9CgogICAgICByZXR1cm4gdGhpcy5yZW1haW5pbmc7CiAgICB9CgogICAgaW5jcmVhc2UobikgewogICAgICBjb25zdCBydW5uaW5nID0gdGhpcy5ydW5uaW5nOwoKICAgICAgaWYgKHJ1bm5pbmcpIHsKICAgICAgICB0aGlzLnN0b3AoKTsKICAgICAgfQoKICAgICAgdGhpcy5yZW1haW5pbmcgKz0gbjsKCiAgICAgIGlmIChydW5uaW5nKSB7CiAgICAgICAgdGhpcy5zdGFydCgpOwogICAgICB9CgogICAgICByZXR1cm4gdGhpcy5yZW1haW5pbmc7CiAgICB9CgogICAgZ2V0VGltZXJMZWZ0KCkgewogICAgICBpZiAodGhpcy5ydW5uaW5nKSB7CiAgICAgICAgdGhpcy5zdG9wKCk7CiAgICAgICAgdGhpcy5zdGFydCgpOwogICAgICB9CgogICAgICByZXR1cm4gdGhpcy5yZW1haW5pbmc7CiAgICB9CgogICAgaXNSdW5uaW5nKCkgewogICAgICByZXR1cm4gdGhpcy5ydW5uaW5nOwogICAgfQoKICB9CgogIGNvbnN0IGZpeFNjcm9sbGJhciA9ICgpID0+IHsKICAgIC8vIGZvciBxdWV1ZXMsIGRvIG5vdCBkbyB0aGlzIG1vcmUgdGhhbiBvbmNlCiAgICBpZiAoc3RhdGVzLnByZXZpb3VzQm9keVBhZGRpbmcgIT09IG51bGwpIHsKICAgICAgcmV0dXJuOwogICAgfSAvLyBpZiB0aGUgYm9keSBoYXMgb3ZlcmZsb3cKCgogICAgaWYgKGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0ID4gd2luZG93LmlubmVySGVpZ2h0KSB7CiAgICAgIC8vIGFkZCBwYWRkaW5nIHNvIHRoZSBjb250ZW50IGRvZXNuJ3Qgc2hpZnQgYWZ0ZXIgcmVtb3ZhbCBvZiBzY3JvbGxiYXIKICAgICAgc3RhdGVzLnByZXZpb3VzQm9keVBhZGRpbmcgPSBwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5nZXRQcm9wZXJ0eVZhbHVlKCdwYWRkaW5nLXJpZ2h0JykpOwogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9ICIiLmNvbmNhdChzdGF0ZXMucHJldmlvdXNCb2R5UGFkZGluZyArIG1lYXN1cmVTY3JvbGxiYXIoKSwgInB4Iik7CiAgICB9CiAgfTsKICBjb25zdCB1bmRvU2Nyb2xsYmFyID0gKCkgPT4gewogICAgaWYgKHN0YXRlcy5wcmV2aW91c0JvZHlQYWRkaW5nICE9PSBudWxsKSB7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0ID0gIiIuY29uY2F0KHN0YXRlcy5wcmV2aW91c0JvZHlQYWRkaW5nLCAicHgiKTsKICAgICAgc3RhdGVzLnByZXZpb3VzQm9keVBhZGRpbmcgPSBudWxsOwogICAgfQogIH07CgogIC8qIGlzdGFuYnVsIGlnbm9yZSBmaWxlICovCgogIGNvbnN0IGlPU2ZpeCA9ICgpID0+IHsKICAgIGNvbnN0IGlPUyA9IC8vIEB0cy1pZ25vcmUKICAgIC9pUGFkfGlQaG9uZXxpUG9kLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmICF3aW5kb3cuTVNTdHJlYW0gfHwgbmF2aWdhdG9yLnBsYXRmb3JtID09PSAnTWFjSW50ZWwnICYmIG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyA+IDE7CgogICAgaWYgKGlPUyAmJiAhaGFzQ2xhc3MoZG9jdW1lbnQuYm9keSwgc3dhbENsYXNzZXMuaW9zZml4KSkgewogICAgICBjb25zdCBvZmZzZXQgPSBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcDsKICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS50b3AgPSAiIi5jb25jYXQob2Zmc2V0ICogLTEsICJweCIpOwogICAgICBhZGRDbGFzcyhkb2N1bWVudC5ib2R5LCBzd2FsQ2xhc3Nlcy5pb3NmaXgpOwogICAgICBsb2NrQm9keVNjcm9sbCgpOwogICAgICBhZGRCb3R0b21QYWRkaW5nRm9yVGFsbFBvcHVwcygpOwogICAgfQogIH07CiAgLyoqCiAgICogaHR0cHM6Ly9naXRodWIuY29tL3N3ZWV0YWxlcnQyL3N3ZWV0YWxlcnQyL2lzc3Vlcy8xOTQ4CiAgICovCgogIGNvbnN0IGFkZEJvdHRvbVBhZGRpbmdGb3JUYWxsUG9wdXBzID0gKCkgPT4gewogICAgY29uc3QgdWEgPSBuYXZpZ2F0b3IudXNlckFnZW50OwogICAgY29uc3QgaU9TID0gISF1YS5tYXRjaCgvaVBhZC9pKSB8fCAhIXVhLm1hdGNoKC9pUGhvbmUvaSk7CiAgICBjb25zdCB3ZWJraXQgPSAhIXVhLm1hdGNoKC9XZWJLaXQvaSk7CiAgICBjb25zdCBpT1NTYWZhcmkgPSBpT1MgJiYgd2Via2l0ICYmICF1YS5tYXRjaCgvQ3JpT1MvaSk7CgogICAgaWYgKGlPU1NhZmFyaSkgewogICAgICBjb25zdCBib3R0b21QYW5lbEhlaWdodCA9IDQ0OwoKICAgICAgaWYgKGdldFBvcHVwKCkuc2Nyb2xsSGVpZ2h0ID4gd2luZG93LmlubmVySGVpZ2h0IC0gYm90dG9tUGFuZWxIZWlnaHQpIHsKICAgICAgICBnZXRDb250YWluZXIoKS5zdHlsZS5wYWRkaW5nQm90dG9tID0gIiIuY29uY2F0KGJvdHRvbVBhbmVsSGVpZ2h0LCAicHgiKTsKICAgICAgfQogICAgfQogIH07CiAgLyoqCiAgICogaHR0cHM6Ly9naXRodWIuY29tL3N3ZWV0YWxlcnQyL3N3ZWV0YWxlcnQyL2lzc3Vlcy8xMjQ2CiAgICovCgoKICBjb25zdCBsb2NrQm9keVNjcm9sbCA9ICgpID0+IHsKICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lcigpOwogICAgbGV0IHByZXZlbnRUb3VjaE1vdmU7CgogICAgY29udGFpbmVyLm9udG91Y2hzdGFydCA9IGUgPT4gewogICAgICBwcmV2ZW50VG91Y2hNb3ZlID0gc2hvdWxkUHJldmVudFRvdWNoTW92ZShlKTsKICAgIH07CgogICAgY29udGFpbmVyLm9udG91Y2htb3ZlID0gZSA9PiB7CiAgICAgIGlmIChwcmV2ZW50VG91Y2hNb3ZlKSB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIH0KICAgIH07CiAgfTsKCiAgY29uc3Qgc2hvdWxkUHJldmVudFRvdWNoTW92ZSA9IGV2ZW50ID0+IHsKICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDsKICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lcigpOwoKICAgIGlmIChpc1N0eWx1cyhldmVudCkgfHwgaXNab29tKGV2ZW50KSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgaWYgKHRhcmdldCA9PT0gY29udGFpbmVyKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIGlmICghaXNTY3JvbGxhYmxlKGNvbnRhaW5lcikgJiYgdGFyZ2V0LnRhZ05hbWUgIT09ICdJTlBVVCcgJiYgLy8gIzE2MDMKICAgIHRhcmdldC50YWdOYW1lICE9PSAnVEVYVEFSRUEnICYmIC8vICMyMjY2CiAgICAhKGlzU2Nyb2xsYWJsZShnZXRIdG1sQ29udGFpbmVyKCkpICYmIC8vICMxOTQ0CiAgICBnZXRIdG1sQ29udGFpbmVyKCkuY29udGFpbnModGFyZ2V0KSkpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwogIH07CiAgLyoqCiAgICogaHR0cHM6Ly9naXRodWIuY29tL3N3ZWV0YWxlcnQyL3N3ZWV0YWxlcnQyL2lzc3Vlcy8xNzg2CiAgICoKICAgKiBAcGFyYW0geyp9IGV2ZW50CiAgICogQHJldHVybnMge2Jvb2xlYW59CiAgICovCgoKICBjb25zdCBpc1N0eWx1cyA9IGV2ZW50ID0+IHsKICAgIHJldHVybiBldmVudC50b3VjaGVzICYmIGV2ZW50LnRvdWNoZXMubGVuZ3RoICYmIGV2ZW50LnRvdWNoZXNbMF0udG91Y2hUeXBlID09PSAnc3R5bHVzJzsKICB9OwogIC8qKgogICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zd2VldGFsZXJ0Mi9zd2VldGFsZXJ0Mi9pc3N1ZXMvMTg5MQogICAqCiAgICogQHBhcmFtIHtUb3VjaEV2ZW50fSBldmVudAogICAqIEByZXR1cm5zIHtib29sZWFufQogICAqLwoKCiAgY29uc3QgaXNab29tID0gZXZlbnQgPT4gewogICAgcmV0dXJuIGV2ZW50LnRvdWNoZXMgJiYgZXZlbnQudG91Y2hlcy5sZW5ndGggPiAxOwogIH07CgogIGNvbnN0IHVuZG9JT1NmaXggPSAoKSA9PiB7CiAgICBpZiAoaGFzQ2xhc3MoZG9jdW1lbnQuYm9keSwgc3dhbENsYXNzZXMuaW9zZml4KSkgewogICAgICBjb25zdCBvZmZzZXQgPSBwYXJzZUludChkb2N1bWVudC5ib2R5LnN0eWxlLnRvcCwgMTApOwogICAgICByZW1vdmVDbGFzcyhkb2N1bWVudC5ib2R5LCBzd2FsQ2xhc3Nlcy5pb3NmaXgpOwogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnRvcCA9ICcnOwogICAgICBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCA9IG9mZnNldCAqIC0xOwogICAgfQogIH07CgogIGNvbnN0IFNIT1dfQ0xBU1NfVElNRU9VVCA9IDEwOwogIC8qKgogICAqIE9wZW4gcG9wdXAsIGFkZCBuZWNlc3NhcnkgY2xhc3NlcyBhbmQgc3R5bGVzLCBmaXggc2Nyb2xsYmFyCiAgICoKICAgKiBAcGFyYW0gcGFyYW1zCiAgICovCgogIGNvbnN0IG9wZW5Qb3B1cCA9IHBhcmFtcyA9PiB7CiAgICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXIoKTsKICAgIGNvbnN0IHBvcHVwID0gZ2V0UG9wdXAoKTsKCiAgICBpZiAodHlwZW9mIHBhcmFtcy53aWxsT3BlbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBwYXJhbXMud2lsbE9wZW4ocG9wdXApOwogICAgfQoKICAgIGNvbnN0IGJvZHlTdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KTsKICAgIGNvbnN0IGluaXRpYWxCb2R5T3ZlcmZsb3cgPSBib2R5U3R5bGVzLm92ZXJmbG93WTsKICAgIGFkZENsYXNzZXMkMShjb250YWluZXIsIHBvcHVwLCBwYXJhbXMpOyAvLyBzY3JvbGxpbmcgaXMgJ2hpZGRlbicgdW50aWwgYW5pbWF0aW9uIGlzIGRvbmUsIGFmdGVyIHRoYXQgJ2F1dG8nCgogICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgIHNldFNjcm9sbGluZ1Zpc2liaWxpdHkoY29udGFpbmVyLCBwb3B1cCk7CiAgICB9LCBTSE9XX0NMQVNTX1RJTUVPVVQpOwoKICAgIGlmIChpc01vZGFsKCkpIHsKICAgICAgZml4U2Nyb2xsQ29udGFpbmVyKGNvbnRhaW5lciwgcGFyYW1zLnNjcm9sbGJhclBhZGRpbmcsIGluaXRpYWxCb2R5T3ZlcmZsb3cpOwogICAgICBzZXRBcmlhSGlkZGVuKCk7CiAgICB9CgogICAgaWYgKCFpc1RvYXN0KCkgJiYgIWdsb2JhbFN0YXRlLnByZXZpb3VzQWN0aXZlRWxlbWVudCkgewogICAgICBnbG9iYWxTdGF0ZS5wcmV2aW91c0FjdGl2ZUVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50OwogICAgfQoKICAgIGlmICh0eXBlb2YgcGFyYW1zLmRpZE9wZW4gPT09ICdmdW5jdGlvbicpIHsKICAgICAgc2V0VGltZW91dCgoKSA9PiBwYXJhbXMuZGlkT3Blbihwb3B1cCkpOwogICAgfQoKICAgIHJlbW92ZUNsYXNzKGNvbnRhaW5lciwgc3dhbENsYXNzZXNbJ25vLXRyYW5zaXRpb24nXSk7CiAgfTsKCiAgY29uc3Qgc3dhbE9wZW5BbmltYXRpb25GaW5pc2hlZCA9IGV2ZW50ID0+IHsKICAgIGNvbnN0IHBvcHVwID0gZ2V0UG9wdXAoKTsKCiAgICBpZiAoZXZlbnQudGFyZ2V0ICE9PSBwb3B1cCkgewogICAgICByZXR1cm47CiAgICB9CgogICAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7CiAgICBwb3B1cC5yZW1vdmVFdmVudExpc3RlbmVyKGFuaW1hdGlvbkVuZEV2ZW50LCBzd2FsT3BlbkFuaW1hdGlvbkZpbmlzaGVkKTsKICAgIGNvbnRhaW5lci5zdHlsZS5vdmVyZmxvd1kgPSAnYXV0byc7CiAgfTsKCiAgY29uc3Qgc2V0U2Nyb2xsaW5nVmlzaWJpbGl0eSA9IChjb250YWluZXIsIHBvcHVwKSA9PiB7CiAgICBpZiAoYW5pbWF0aW9uRW5kRXZlbnQgJiYgaGFzQ3NzQW5pbWF0aW9uKHBvcHVwKSkgewogICAgICBjb250YWluZXIuc3R5bGUub3ZlcmZsb3dZID0gJ2hpZGRlbic7CiAgICAgIHBvcHVwLmFkZEV2ZW50TGlzdGVuZXIoYW5pbWF0aW9uRW5kRXZlbnQsIHN3YWxPcGVuQW5pbWF0aW9uRmluaXNoZWQpOwogICAgfSBlbHNlIHsKICAgICAgY29udGFpbmVyLnN0eWxlLm92ZXJmbG93WSA9ICdhdXRvJzsKICAgIH0KICB9OwoKICBjb25zdCBmaXhTY3JvbGxDb250YWluZXIgPSAoY29udGFpbmVyLCBzY3JvbGxiYXJQYWRkaW5nLCBpbml0aWFsQm9keU92ZXJmbG93KSA9PiB7CiAgICBpT1NmaXgoKTsKCiAgICBpZiAoc2Nyb2xsYmFyUGFkZGluZyAmJiBpbml0aWFsQm9keU92ZXJmbG93ICE9PSAnaGlkZGVuJykgewogICAgICBmaXhTY3JvbGxiYXIoKTsKICAgIH0gLy8gc3dlZXRhbGVydDIvaXNzdWVzLzEyNDcKCgogICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgIGNvbnRhaW5lci5zY3JvbGxUb3AgPSAwOwogICAgfSk7CiAgfTsKCiAgY29uc3QgYWRkQ2xhc3NlcyQxID0gKGNvbnRhaW5lciwgcG9wdXAsIHBhcmFtcykgPT4gewogICAgYWRkQ2xhc3MoY29udGFpbmVyLCBwYXJhbXMuc2hvd0NsYXNzLmJhY2tkcm9wKTsgLy8gdGhpcyB3b3JrYXJvdW5kIHdpdGggb3BhY2l0eSBpcyBuZWVkZWQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9zd2VldGFsZXJ0Mi9zd2VldGFsZXJ0Mi9pc3N1ZXMvMjA1OQoKICAgIHBvcHVwLnN0eWxlLnNldFByb3BlcnR5KCdvcGFjaXR5JywgJzAnLCAnaW1wb3J0YW50Jyk7CiAgICBzaG93KHBvcHVwLCAnZ3JpZCcpOwogICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgIC8vIEFuaW1hdGUgcG9wdXAgcmlnaHQgYWZ0ZXIgc2hvd2luZyBpdAogICAgICBhZGRDbGFzcyhwb3B1cCwgcGFyYW1zLnNob3dDbGFzcy5wb3B1cCk7IC8vIGFuZCByZW1vdmUgdGhlIG9wYWNpdHkgd29ya2Fyb3VuZAoKICAgICAgcG9wdXAuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ29wYWNpdHknKTsKICAgIH0sIFNIT1dfQ0xBU1NfVElNRU9VVCk7IC8vIDEwbXMgaW4gb3JkZXIgdG8gZml4ICMyMDYyCgogICAgYWRkQ2xhc3MoW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgZG9jdW1lbnQuYm9keV0sIHN3YWxDbGFzc2VzLnNob3duKTsKCiAgICBpZiAocGFyYW1zLmhlaWdodEF1dG8gJiYgcGFyYW1zLmJhY2tkcm9wICYmICFwYXJhbXMudG9hc3QpIHsKICAgICAgYWRkQ2xhc3MoW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgZG9jdW1lbnQuYm9keV0sIHN3YWxDbGFzc2VzWydoZWlnaHQtYXV0byddKTsKICAgIH0KICB9OwoKICAvKioKICAgKiBTaG93cyBsb2FkZXIgKHNwaW5uZXIpLCB0aGlzIGlzIHVzZWZ1bCB3aXRoIEFKQVggcmVxdWVzdHMuCiAgICogQnkgZGVmYXVsdCB0aGUgbG9hZGVyIGJlIHNob3duIGluc3RlYWQgb2YgdGhlICJDb25maXJtIiBidXR0b24uCiAgICovCgogIGNvbnN0IHNob3dMb2FkaW5nID0gYnV0dG9uVG9SZXBsYWNlID0+IHsKICAgIGxldCBwb3B1cCA9IGdldFBvcHVwKCk7CgogICAgaWYgKCFwb3B1cCkgewogICAgICBuZXcgU3dhbCgpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ldwogICAgfQoKICAgIHBvcHVwID0gZ2V0UG9wdXAoKTsKICAgIGNvbnN0IGxvYWRlciA9IGdldExvYWRlcigpOwoKICAgIGlmIChpc1RvYXN0KCkpIHsKICAgICAgaGlkZShnZXRJY29uKCkpOwogICAgfSBlbHNlIHsKICAgICAgcmVwbGFjZUJ1dHRvbihwb3B1cCwgYnV0dG9uVG9SZXBsYWNlKTsKICAgIH0KCiAgICBzaG93KGxvYWRlcik7CiAgICBwb3B1cC5zZXRBdHRyaWJ1dGUoJ2RhdGEtbG9hZGluZycsICd0cnVlJyk7CiAgICBwb3B1cC5zZXRBdHRyaWJ1dGUoJ2FyaWEtYnVzeScsICd0cnVlJyk7CiAgICBwb3B1cC5mb2N1cygpOwogIH07CgogIGNvbnN0IHJlcGxhY2VCdXR0b24gPSAocG9wdXAsIGJ1dHRvblRvUmVwbGFjZSkgPT4gewogICAgY29uc3QgYWN0aW9ucyA9IGdldEFjdGlvbnMoKTsKICAgIGNvbnN0IGxvYWRlciA9IGdldExvYWRlcigpOwoKICAgIGlmICghYnV0dG9uVG9SZXBsYWNlICYmIGlzVmlzaWJsZShnZXRDb25maXJtQnV0dG9uKCkpKSB7CiAgICAgIGJ1dHRvblRvUmVwbGFjZSA9IGdldENvbmZpcm1CdXR0b24oKTsKICAgIH0KCiAgICBzaG93KGFjdGlvbnMpOwoKICAgIGlmIChidXR0b25Ub1JlcGxhY2UpIHsKICAgICAgaGlkZShidXR0b25Ub1JlcGxhY2UpOwogICAgICBsb2FkZXIuc2V0QXR0cmlidXRlKCdkYXRhLWJ1dHRvbi10by1yZXBsYWNlJywgYnV0dG9uVG9SZXBsYWNlLmNsYXNzTmFtZSk7CiAgICB9CgogICAgbG9hZGVyLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGxvYWRlciwgYnV0dG9uVG9SZXBsYWNlKTsKICAgIGFkZENsYXNzKFtwb3B1cCwgYWN0aW9uc10sIHN3YWxDbGFzc2VzLmxvYWRpbmcpOwogIH07CgogIGNvbnN0IGhhbmRsZUlucHV0T3B0aW9uc0FuZFZhbHVlID0gKGluc3RhbmNlLCBwYXJhbXMpID0+IHsKICAgIGlmIChwYXJhbXMuaW5wdXQgPT09ICdzZWxlY3QnIHx8IHBhcmFtcy5pbnB1dCA9PT0gJ3JhZGlvJykgewogICAgICBoYW5kbGVJbnB1dE9wdGlvbnMoaW5zdGFuY2UsIHBhcmFtcyk7CiAgICB9IGVsc2UgaWYgKFsndGV4dCcsICdlbWFpbCcsICdudW1iZXInLCAndGVsJywgJ3RleHRhcmVhJ10uaW5jbHVkZXMocGFyYW1zLmlucHV0KSAmJiAoaGFzVG9Qcm9taXNlRm4ocGFyYW1zLmlucHV0VmFsdWUpIHx8IGlzUHJvbWlzZShwYXJhbXMuaW5wdXRWYWx1ZSkpKSB7CiAgICAgIHNob3dMb2FkaW5nKGdldENvbmZpcm1CdXR0b24oKSk7CiAgICAgIGhhbmRsZUlucHV0VmFsdWUoaW5zdGFuY2UsIHBhcmFtcyk7CiAgICB9CiAgfTsKICBjb25zdCBnZXRJbnB1dFZhbHVlID0gKGluc3RhbmNlLCBpbm5lclBhcmFtcykgPT4gewogICAgY29uc3QgaW5wdXQgPSBpbnN0YW5jZS5nZXRJbnB1dCgpOwoKICAgIGlmICghaW5wdXQpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgc3dpdGNoIChpbm5lclBhcmFtcy5pbnB1dCkgewogICAgICBjYXNlICdjaGVja2JveCc6CiAgICAgICAgcmV0dXJuIGdldENoZWNrYm94VmFsdWUoaW5wdXQpOwoKICAgICAgY2FzZSAncmFkaW8nOgogICAgICAgIHJldHVybiBnZXRSYWRpb1ZhbHVlKGlucHV0KTsKCiAgICAgIGNhc2UgJ2ZpbGUnOgogICAgICAgIHJldHVybiBnZXRGaWxlVmFsdWUoaW5wdXQpOwoKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gaW5uZXJQYXJhbXMuaW5wdXRBdXRvVHJpbSA/IGlucHV0LnZhbHVlLnRyaW0oKSA6IGlucHV0LnZhbHVlOwogICAgfQogIH07CgogIGNvbnN0IGdldENoZWNrYm94VmFsdWUgPSBpbnB1dCA9PiBpbnB1dC5jaGVja2VkID8gMSA6IDA7CgogIGNvbnN0IGdldFJhZGlvVmFsdWUgPSBpbnB1dCA9PiBpbnB1dC5jaGVja2VkID8gaW5wdXQudmFsdWUgOiBudWxsOwoKICBjb25zdCBnZXRGaWxlVmFsdWUgPSBpbnB1dCA9PiBpbnB1dC5maWxlcy5sZW5ndGggPyBpbnB1dC5nZXRBdHRyaWJ1dGUoJ211bHRpcGxlJykgIT09IG51bGwgPyBpbnB1dC5maWxlcyA6IGlucHV0LmZpbGVzWzBdIDogbnVsbDsKCiAgY29uc3QgaGFuZGxlSW5wdXRPcHRpb25zID0gKGluc3RhbmNlLCBwYXJhbXMpID0+IHsKICAgIGNvbnN0IHBvcHVwID0gZ2V0UG9wdXAoKTsKCiAgICBjb25zdCBwcm9jZXNzSW5wdXRPcHRpb25zID0gaW5wdXRPcHRpb25zID0+IHBvcHVsYXRlSW5wdXRPcHRpb25zW3BhcmFtcy5pbnB1dF0ocG9wdXAsIGZvcm1hdElucHV0T3B0aW9ucyhpbnB1dE9wdGlvbnMpLCBwYXJhbXMpOwoKICAgIGlmIChoYXNUb1Byb21pc2VGbihwYXJhbXMuaW5wdXRPcHRpb25zKSB8fCBpc1Byb21pc2UocGFyYW1zLmlucHV0T3B0aW9ucykpIHsKICAgICAgc2hvd0xvYWRpbmcoZ2V0Q29uZmlybUJ1dHRvbigpKTsKICAgICAgYXNQcm9taXNlKHBhcmFtcy5pbnB1dE9wdGlvbnMpLnRoZW4oaW5wdXRPcHRpb25zID0+IHsKICAgICAgICBpbnN0YW5jZS5oaWRlTG9hZGluZygpOwogICAgICAgIHByb2Nlc3NJbnB1dE9wdGlvbnMoaW5wdXRPcHRpb25zKTsKICAgICAgfSk7CiAgICB9IGVsc2UgaWYgKHR5cGVvZiBwYXJhbXMuaW5wdXRPcHRpb25zID09PSAnb2JqZWN0JykgewogICAgICBwcm9jZXNzSW5wdXRPcHRpb25zKHBhcmFtcy5pbnB1dE9wdGlvbnMpOwogICAgfSBlbHNlIHsKICAgICAgZXJyb3IoIlVuZXhwZWN0ZWQgdHlwZSBvZiBpbnB1dE9wdGlvbnMhIEV4cGVjdGVkIG9iamVjdCwgTWFwIG9yIFByb21pc2UsIGdvdCAiLmNvbmNhdCh0eXBlb2YgcGFyYW1zLmlucHV0T3B0aW9ucykpOwogICAgfQogIH07CgogIGNvbnN0IGhhbmRsZUlucHV0VmFsdWUgPSAoaW5zdGFuY2UsIHBhcmFtcykgPT4gewogICAgY29uc3QgaW5wdXQgPSBpbnN0YW5jZS5nZXRJbnB1dCgpOwogICAgaGlkZShpbnB1dCk7CiAgICBhc1Byb21pc2UocGFyYW1zLmlucHV0VmFsdWUpLnRoZW4oaW5wdXRWYWx1ZSA9PiB7CiAgICAgIGlucHV0LnZhbHVlID0gcGFyYW1zLmlucHV0ID09PSAnbnVtYmVyJyA/IHBhcnNlRmxvYXQoaW5wdXRWYWx1ZSkgfHwgMCA6ICIiLmNvbmNhdChpbnB1dFZhbHVlKTsKICAgICAgc2hvdyhpbnB1dCk7CiAgICAgIGlucHV0LmZvY3VzKCk7CiAgICAgIGluc3RhbmNlLmhpZGVMb2FkaW5nKCk7CiAgICB9KS5jYXRjaChlcnIgPT4gewogICAgICBlcnJvcigiRXJyb3IgaW4gaW5wdXRWYWx1ZSBwcm9taXNlOiAiLmNvbmNhdChlcnIpKTsKICAgICAgaW5wdXQudmFsdWUgPSAnJzsKICAgICAgc2hvdyhpbnB1dCk7CiAgICAgIGlucHV0LmZvY3VzKCk7CiAgICAgIGluc3RhbmNlLmhpZGVMb2FkaW5nKCk7CiAgICB9KTsKICB9OwoKICBjb25zdCBwb3B1bGF0ZUlucHV0T3B0aW9ucyA9IHsKICAgIHNlbGVjdDogKHBvcHVwLCBpbnB1dE9wdGlvbnMsIHBhcmFtcykgPT4gewogICAgICBjb25zdCBzZWxlY3QgPSBnZXREaXJlY3RDaGlsZEJ5Q2xhc3MocG9wdXAsIHN3YWxDbGFzc2VzLnNlbGVjdCk7CgogICAgICBjb25zdCByZW5kZXJPcHRpb24gPSAocGFyZW50LCBvcHRpb25MYWJlbCwgb3B0aW9uVmFsdWUpID0+IHsKICAgICAgICBjb25zdCBvcHRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTsKICAgICAgICBvcHRpb24udmFsdWUgPSBvcHRpb25WYWx1ZTsKICAgICAgICBzZXRJbm5lckh0bWwob3B0aW9uLCBvcHRpb25MYWJlbCk7CiAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gaXNTZWxlY3RlZChvcHRpb25WYWx1ZSwgcGFyYW1zLmlucHV0VmFsdWUpOwogICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChvcHRpb24pOwogICAgICB9OwoKICAgICAgaW5wdXRPcHRpb25zLmZvckVhY2goaW5wdXRPcHRpb24gPT4gewogICAgICAgIGNvbnN0IG9wdGlvblZhbHVlID0gaW5wdXRPcHRpb25bMF07CiAgICAgICAgY29uc3Qgb3B0aW9uTGFiZWwgPSBpbnB1dE9wdGlvblsxXTsgLy8gPG9wdGdyb3VwPiBzcGVjOgogICAgICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNDAxL2ludGVyYWN0L2Zvcm1zLmh0bWwjaC0xNy42CiAgICAgICAgLy8gIi4uLmFsbCBPUFRHUk9VUCBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBkaXJlY3RseSB3aXRoaW4gYSBTRUxFQ1QgZWxlbWVudCAoaS5lLiwgZ3JvdXBzIG1heSBub3QgYmUgbmVzdGVkKS4uLiIKICAgICAgICAvLyBjaGVjayB3aGV0aGVyIHRoaXMgaXMgYSA8b3B0Z3JvdXA+CgogICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbkxhYmVsKSkgewogICAgICAgICAgLy8gaWYgaXQgaXMgYW4gYXJyYXksIHRoZW4gaXQgaXMgYW4gPG9wdGdyb3VwPgogICAgICAgICAgY29uc3Qgb3B0Z3JvdXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRncm91cCcpOwogICAgICAgICAgb3B0Z3JvdXAubGFiZWwgPSBvcHRpb25WYWx1ZTsKICAgICAgICAgIG9wdGdyb3VwLmRpc2FibGVkID0gZmFsc2U7IC8vIG5vdCBjb25maWd1cmFibGUgZm9yIG5vdwoKICAgICAgICAgIHNlbGVjdC5hcHBlbmRDaGlsZChvcHRncm91cCk7CiAgICAgICAgICBvcHRpb25MYWJlbC5mb3JFYWNoKG8gPT4gcmVuZGVyT3B0aW9uKG9wdGdyb3VwLCBvWzFdLCBvWzBdKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIGNhc2Ugb2YgPG9wdGlvbj4KICAgICAgICAgIHJlbmRlck9wdGlvbihzZWxlY3QsIG9wdGlvbkxhYmVsLCBvcHRpb25WYWx1ZSk7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgc2VsZWN0LmZvY3VzKCk7CiAgICB9LAogICAgcmFkaW86IChwb3B1cCwgaW5wdXRPcHRpb25zLCBwYXJhbXMpID0+IHsKICAgICAgY29uc3QgcmFkaW8gPSBnZXREaXJlY3RDaGlsZEJ5Q2xhc3MocG9wdXAsIHN3YWxDbGFzc2VzLnJhZGlvKTsKICAgICAgaW5wdXRPcHRpb25zLmZvckVhY2goaW5wdXRPcHRpb24gPT4gewogICAgICAgIGNvbnN0IHJhZGlvVmFsdWUgPSBpbnB1dE9wdGlvblswXTsKICAgICAgICBjb25zdCByYWRpb0xhYmVsID0gaW5wdXRPcHRpb25bMV07CiAgICAgICAgY29uc3QgcmFkaW9JbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7CiAgICAgICAgY29uc3QgcmFkaW9MYWJlbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsYWJlbCcpOwogICAgICAgIHJhZGlvSW5wdXQudHlwZSA9ICdyYWRpbyc7CiAgICAgICAgcmFkaW9JbnB1dC5uYW1lID0gc3dhbENsYXNzZXMucmFkaW87CiAgICAgICAgcmFkaW9JbnB1dC52YWx1ZSA9IHJhZGlvVmFsdWU7CgogICAgICAgIGlmIChpc1NlbGVjdGVkKHJhZGlvVmFsdWUsIHBhcmFtcy5pbnB1dFZhbHVlKSkgewogICAgICAgICAgcmFkaW9JbnB1dC5jaGVja2VkID0gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIGNvbnN0IGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgICAgIHNldElubmVySHRtbChsYWJlbCwgcmFkaW9MYWJlbCk7CiAgICAgICAgbGFiZWwuY2xhc3NOYW1lID0gc3dhbENsYXNzZXMubGFiZWw7CiAgICAgICAgcmFkaW9MYWJlbEVsZW1lbnQuYXBwZW5kQ2hpbGQocmFkaW9JbnB1dCk7CiAgICAgICAgcmFkaW9MYWJlbEVsZW1lbnQuYXBwZW5kQ2hpbGQobGFiZWwpOwogICAgICAgIHJhZGlvLmFwcGVuZENoaWxkKHJhZGlvTGFiZWxFbGVtZW50KTsKICAgICAgfSk7CiAgICAgIGNvbnN0IHJhZGlvcyA9IHJhZGlvLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0Jyk7CgogICAgICBpZiAocmFkaW9zLmxlbmd0aCkgewogICAgICAgIHJhZGlvc1swXS5mb2N1cygpOwogICAgICB9CiAgICB9CiAgfTsKICAvKioKICAgKiBDb252ZXJ0cyBgaW5wdXRPcHRpb25zYCBpbnRvIGFuIGFycmF5IG9mIGBbdmFsdWUsIGxhYmVsXWBzCiAgICogQHBhcmFtIGlucHV0T3B0aW9ucwogICAqLwoKICBjb25zdCBmb3JtYXRJbnB1dE9wdGlvbnMgPSBpbnB1dE9wdGlvbnMgPT4gewogICAgY29uc3QgcmVzdWx0ID0gW107CgogICAgaWYgKHR5cGVvZiBNYXAgIT09ICd1bmRlZmluZWQnICYmIGlucHV0T3B0aW9ucyBpbnN0YW5jZW9mIE1hcCkgewogICAgICBpbnB1dE9wdGlvbnMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4gewogICAgICAgIGxldCB2YWx1ZUZvcm1hdHRlZCA9IHZhbHVlOwoKICAgICAgICBpZiAodHlwZW9mIHZhbHVlRm9ybWF0dGVkID09PSAnb2JqZWN0JykgewogICAgICAgICAgLy8gY2FzZSBvZiA8b3B0Z3JvdXA+CiAgICAgICAgICB2YWx1ZUZvcm1hdHRlZCA9IGZvcm1hdElucHV0T3B0aW9ucyh2YWx1ZUZvcm1hdHRlZCk7CiAgICAgICAgfQoKICAgICAgICByZXN1bHQucHVzaChba2V5LCB2YWx1ZUZvcm1hdHRlZF0pOwogICAgICB9KTsKICAgIH0gZWxzZSB7CiAgICAgIE9iamVjdC5rZXlzKGlucHV0T3B0aW9ucykuZm9yRWFjaChrZXkgPT4gewogICAgICAgIGxldCB2YWx1ZUZvcm1hdHRlZCA9IGlucHV0T3B0aW9uc1trZXldOwoKICAgICAgICBpZiAodHlwZW9mIHZhbHVlRm9ybWF0dGVkID09PSAnb2JqZWN0JykgewogICAgICAgICAgLy8gY2FzZSBvZiA8b3B0Z3JvdXA+CiAgICAgICAgICB2YWx1ZUZvcm1hdHRlZCA9IGZvcm1hdElucHV0T3B0aW9ucyh2YWx1ZUZvcm1hdHRlZCk7CiAgICAgICAgfQoKICAgICAgICByZXN1bHQucHVzaChba2V5LCB2YWx1ZUZvcm1hdHRlZF0pOwogICAgICB9KTsKICAgIH0KCiAgICByZXR1cm4gcmVzdWx0OwogIH07CgogIGNvbnN0IGlzU2VsZWN0ZWQgPSAob3B0aW9uVmFsdWUsIGlucHV0VmFsdWUpID0+IHsKICAgIHJldHVybiBpbnB1dFZhbHVlICYmIGlucHV0VmFsdWUudG9TdHJpbmcoKSA9PT0gb3B0aW9uVmFsdWUudG9TdHJpbmcoKTsKICB9OwoKICAvKioKICAgKiBIaWRlcyBsb2FkZXIgYW5kIHNob3dzIGJhY2sgdGhlIGJ1dHRvbiB3aGljaCB3YXMgaGlkZGVuIGJ5IC5zaG93TG9hZGluZygpCiAgICovCgogIGZ1bmN0aW9uIGhpZGVMb2FkaW5nKCkgewogICAgLy8gZG8gbm90aGluZyBpZiBwb3B1cCBpcyBjbG9zZWQKICAgIGNvbnN0IGlubmVyUGFyYW1zID0gcHJpdmF0ZVByb3BzLmlubmVyUGFyYW1zLmdldCh0aGlzKTsKCiAgICBpZiAoIWlubmVyUGFyYW1zKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBjb25zdCBkb21DYWNoZSA9IHByaXZhdGVQcm9wcy5kb21DYWNoZS5nZXQodGhpcyk7CiAgICBoaWRlKGRvbUNhY2hlLmxvYWRlcik7CgogICAgaWYgKGlzVG9hc3QoKSkgewogICAgICBpZiAoaW5uZXJQYXJhbXMuaWNvbikgewogICAgICAgIHNob3coZ2V0SWNvbigpKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgc2hvd1JlbGF0ZWRCdXR0b24oZG9tQ2FjaGUpOwogICAgfQoKICAgIHJlbW92ZUNsYXNzKFtkb21DYWNoZS5wb3B1cCwgZG9tQ2FjaGUuYWN0aW9uc10sIHN3YWxDbGFzc2VzLmxvYWRpbmcpOwogICAgZG9tQ2FjaGUucG9wdXAucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWJ1c3knKTsKICAgIGRvbUNhY2hlLnBvcHVwLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1sb2FkaW5nJyk7CiAgICBkb21DYWNoZS5jb25maXJtQnV0dG9uLmRpc2FibGVkID0gZmFsc2U7CiAgICBkb21DYWNoZS5kZW55QnV0dG9uLmRpc2FibGVkID0gZmFsc2U7CiAgICBkb21DYWNoZS5jYW5jZWxCdXR0b24uZGlzYWJsZWQgPSBmYWxzZTsKICB9CgogIGNvbnN0IHNob3dSZWxhdGVkQnV0dG9uID0gZG9tQ2FjaGUgPT4gewogICAgY29uc3QgYnV0dG9uVG9SZXBsYWNlID0gZG9tQ2FjaGUucG9wdXAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShkb21DYWNoZS5sb2FkZXIuZ2V0QXR0cmlidXRlKCdkYXRhLWJ1dHRvbi10by1yZXBsYWNlJykpOwoKICAgIGlmIChidXR0b25Ub1JlcGxhY2UubGVuZ3RoKSB7CiAgICAgIHNob3coYnV0dG9uVG9SZXBsYWNlWzBdLCAnaW5saW5lLWJsb2NrJyk7CiAgICB9IGVsc2UgaWYgKGFsbEJ1dHRvbnNBcmVIaWRkZW4oKSkgewogICAgICBoaWRlKGRvbUNhY2hlLmFjdGlvbnMpOwogICAgfQogIH07CgogIC8qKgogICAqIEdldHMgdGhlIGlucHV0IERPTSBub2RlLCB0aGlzIG1ldGhvZCB3b3JrcyB3aXRoIGlucHV0IHBhcmFtZXRlci4KICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnQgfCBudWxsfQogICAqLwoKICBmdW5jdGlvbiBnZXRJbnB1dCQxKGluc3RhbmNlKSB7CiAgICBjb25zdCBpbm5lclBhcmFtcyA9IHByaXZhdGVQcm9wcy5pbm5lclBhcmFtcy5nZXQoaW5zdGFuY2UgfHwgdGhpcyk7CiAgICBjb25zdCBkb21DYWNoZSA9IHByaXZhdGVQcm9wcy5kb21DYWNoZS5nZXQoaW5zdGFuY2UgfHwgdGhpcyk7CgogICAgaWYgKCFkb21DYWNoZSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICByZXR1cm4gZ2V0SW5wdXQoZG9tQ2FjaGUucG9wdXAsIGlubmVyUGFyYW1zLmlucHV0KTsKICB9CgogIC8qKgogICAqIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGBXZWFrTWFwYHMgZm9yIGVhY2ggZWZmZWN0aXZlbHktInByaXZhdGUgIHByb3BlcnR5IiB0aGF0IGEgYFN3YWxgIGhhcy4KICAgKiBGb3IgZXhhbXBsZSwgdG8gc2V0IHRoZSBwcml2YXRlIHByb3BlcnR5ICJmb28iIG9mIGB0aGlzYCB0byAiYmFyIiwgeW91IGNhbiBgcHJpdmF0ZVByb3BzLmZvby5zZXQodGhpcywgJ2JhcicpYAogICAqIFRoaXMgaXMgdGhlIGFwcHJvYWNoIHRoYXQgQmFiZWwgd2lsbCBwcm9iYWJseSB0YWtlIHRvIGltcGxlbWVudCBwcml2YXRlIG1ldGhvZHMvZmllbGRzCiAgICogICBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1wcml2YXRlLW1ldGhvZHMKICAgKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9iYWJlbC9iYWJlbC9wdWxsLzc1NTUKICAgKiBPbmNlIHdlIGhhdmUgdGhlIGNoYW5nZXMgZnJvbSB0aGF0IFBSIGluIEJhYmVsLCBhbmQgb3VyIGNvcmUgY2xhc3MgZml0cyByZWFzb25hYmxlIGluICpvbmUgbW9kdWxlKgogICAqICAgdGhlbiB3ZSBjYW4gdXNlIHRoYXQgbGFuZ3VhZ2UgZmVhdHVyZS4KICAgKi8KICB2YXIgcHJpdmF0ZU1ldGhvZHMgPSB7CiAgICBzd2FsUHJvbWlzZVJlc29sdmU6IG5ldyBXZWFrTWFwKCksCiAgICBzd2FsUHJvbWlzZVJlamVjdDogbmV3IFdlYWtNYXAoKQogIH07CgogIC8qCiAgICogR2xvYmFsIGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBTd2VldEFsZXJ0MiBwb3B1cCBpcyBzaG93bgogICAqLwoKICBjb25zdCBpc1Zpc2libGUkMSA9ICgpID0+IHsKICAgIHJldHVybiBpc1Zpc2libGUoZ2V0UG9wdXAoKSk7CiAgfTsKICAvKgogICAqIEdsb2JhbCBmdW5jdGlvbiB0byBjbGljayAnQ29uZmlybScgYnV0dG9uCiAgICovCgogIGNvbnN0IGNsaWNrQ29uZmlybSA9ICgpID0+IGdldENvbmZpcm1CdXR0b24oKSAmJiBnZXRDb25maXJtQnV0dG9uKCkuY2xpY2soKTsKICAvKgogICAqIEdsb2JhbCBmdW5jdGlvbiB0byBjbGljayAnRGVueScgYnV0dG9uCiAgICovCgogIGNvbnN0IGNsaWNrRGVueSA9ICgpID0+IGdldERlbnlCdXR0b24oKSAmJiBnZXREZW55QnV0dG9uKCkuY2xpY2soKTsKICAvKgogICAqIEdsb2JhbCBmdW5jdGlvbiB0byBjbGljayAnQ2FuY2VsJyBidXR0b24KICAgKi8KCiAgY29uc3QgY2xpY2tDYW5jZWwgPSAoKSA9PiBnZXRDYW5jZWxCdXR0b24oKSAmJiBnZXRDYW5jZWxCdXR0b24oKS5jbGljaygpOwoKICAvKioKICAgKiBAcGFyYW0ge0dsb2JhbFN0YXRlfSBnbG9iYWxTdGF0ZQogICAqLwoKICBjb25zdCByZW1vdmVLZXlkb3duSGFuZGxlciA9IGdsb2JhbFN0YXRlID0+IHsKICAgIGlmIChnbG9iYWxTdGF0ZS5rZXlkb3duVGFyZ2V0ICYmIGdsb2JhbFN0YXRlLmtleWRvd25IYW5kbGVyQWRkZWQpIHsKICAgICAgZ2xvYmFsU3RhdGUua2V5ZG93blRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZ2xvYmFsU3RhdGUua2V5ZG93bkhhbmRsZXIsIHsKICAgICAgICBjYXB0dXJlOiBnbG9iYWxTdGF0ZS5rZXlkb3duTGlzdGVuZXJDYXB0dXJlCiAgICAgIH0pOwogICAgICBnbG9iYWxTdGF0ZS5rZXlkb3duSGFuZGxlckFkZGVkID0gZmFsc2U7CiAgICB9CiAgfTsKICAvKioKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnQyfSBpbnN0YW5jZQogICAqIEBwYXJhbSB7R2xvYmFsU3RhdGV9IGdsb2JhbFN0YXRlCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0T3B0aW9uc30gaW5uZXJQYXJhbXMKICAgKiBAcGFyYW0geyp9IGRpc21pc3NXaXRoCiAgICovCgogIGNvbnN0IGFkZEtleWRvd25IYW5kbGVyID0gKGluc3RhbmNlLCBnbG9iYWxTdGF0ZSwgaW5uZXJQYXJhbXMsIGRpc21pc3NXaXRoKSA9PiB7CiAgICByZW1vdmVLZXlkb3duSGFuZGxlcihnbG9iYWxTdGF0ZSk7CgogICAgaWYgKCFpbm5lclBhcmFtcy50b2FzdCkgewogICAgICBnbG9iYWxTdGF0ZS5rZXlkb3duSGFuZGxlciA9IGUgPT4ga2V5ZG93bkhhbmRsZXIoaW5zdGFuY2UsIGUsIGRpc21pc3NXaXRoKTsKCiAgICAgIGdsb2JhbFN0YXRlLmtleWRvd25UYXJnZXQgPSBpbm5lclBhcmFtcy5rZXlkb3duTGlzdGVuZXJDYXB0dXJlID8gd2luZG93IDogZ2V0UG9wdXAoKTsKICAgICAgZ2xvYmFsU3RhdGUua2V5ZG93bkxpc3RlbmVyQ2FwdHVyZSA9IGlubmVyUGFyYW1zLmtleWRvd25MaXN0ZW5lckNhcHR1cmU7CiAgICAgIGdsb2JhbFN0YXRlLmtleWRvd25UYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGdsb2JhbFN0YXRlLmtleWRvd25IYW5kbGVyLCB7CiAgICAgICAgY2FwdHVyZTogZ2xvYmFsU3RhdGUua2V5ZG93bkxpc3RlbmVyQ2FwdHVyZQogICAgICB9KTsKICAgICAgZ2xvYmFsU3RhdGUua2V5ZG93bkhhbmRsZXJBZGRlZCA9IHRydWU7CiAgICB9CiAgfTsKICAvKioKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnRPcHRpb25zfSBpbm5lclBhcmFtcwogICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleAogICAqIEBwYXJhbSB7bnVtYmVyfSBpbmNyZW1lbnQKICAgKi8KCiAgY29uc3Qgc2V0Rm9jdXMgPSAoaW5uZXJQYXJhbXMsIGluZGV4LCBpbmNyZW1lbnQpID0+IHsKICAgIGNvbnN0IGZvY3VzYWJsZUVsZW1lbnRzID0gZ2V0Rm9jdXNhYmxlRWxlbWVudHMoKTsgLy8gc2VhcmNoIGZvciB2aXNpYmxlIGVsZW1lbnRzIGFuZCBzZWxlY3QgdGhlIG5leHQgcG9zc2libGUgbWF0Y2gKCiAgICBpZiAoZm9jdXNhYmxlRWxlbWVudHMubGVuZ3RoKSB7CiAgICAgIGluZGV4ID0gaW5kZXggKyBpbmNyZW1lbnQ7IC8vIHJvbGxvdmVyIHRvIGZpcnN0IGl0ZW0KCiAgICAgIGlmIChpbmRleCA9PT0gZm9jdXNhYmxlRWxlbWVudHMubGVuZ3RoKSB7CiAgICAgICAgaW5kZXggPSAwOyAvLyBnbyB0byBsYXN0IGl0ZW0KICAgICAgfSBlbHNlIGlmIChpbmRleCA9PT0gLTEpIHsKICAgICAgICBpbmRleCA9IGZvY3VzYWJsZUVsZW1lbnRzLmxlbmd0aCAtIDE7CiAgICAgIH0KCiAgICAgIHJldHVybiBmb2N1c2FibGVFbGVtZW50c1tpbmRleF0uZm9jdXMoKTsKICAgIH0gLy8gbm8gdmlzaWJsZSBmb2N1c2FibGUgZWxlbWVudHMsIGZvY3VzIHRoZSBwb3B1cAoKCiAgICBnZXRQb3B1cCgpLmZvY3VzKCk7CiAgfTsKICBjb25zdCBhcnJvd0tleXNOZXh0QnV0dG9uID0gWydBcnJvd1JpZ2h0JywgJ0Fycm93RG93biddOwogIGNvbnN0IGFycm93S2V5c1ByZXZpb3VzQnV0dG9uID0gWydBcnJvd0xlZnQnLCAnQXJyb3dVcCddOwogIC8qKgogICAqIEBwYXJhbSB7U3dlZXRBbGVydDJ9IGluc3RhbmNlCiAgICogQHBhcmFtIHtLZXlib2FyZEV2ZW50fSBlCiAgICogQHBhcmFtIHtmdW5jdGlvbn0gZGlzbWlzc1dpdGgKICAgKi8KCiAgY29uc3Qga2V5ZG93bkhhbmRsZXIgPSAoaW5zdGFuY2UsIGUsIGRpc21pc3NXaXRoKSA9PiB7CiAgICBjb25zdCBpbm5lclBhcmFtcyA9IHByaXZhdGVQcm9wcy5pbm5lclBhcmFtcy5nZXQoaW5zdGFuY2UpOwoKICAgIGlmICghaW5uZXJQYXJhbXMpIHsKICAgICAgcmV0dXJuOyAvLyBUaGlzIGluc3RhbmNlIGhhcyBhbHJlYWR5IGJlZW4gZGVzdHJveWVkCiAgICB9IC8vIElnbm9yZSBrZXlkb3duIGR1cmluZyBJTUUgY29tcG9zaXRpb24KICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Eb2N1bWVudC9rZXlkb3duX2V2ZW50I2lnbm9yaW5nX2tleWRvd25fZHVyaW5nX2ltZV9jb21wb3NpdGlvbgogICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3N3ZWV0YWxlcnQyL3N3ZWV0YWxlcnQyL2lzc3Vlcy83MjAKICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9zd2VldGFsZXJ0Mi9zd2VldGFsZXJ0Mi9pc3N1ZXMvMjQwNgoKCiAgICBpZiAoZS5pc0NvbXBvc2luZyB8fCBlLmtleUNvZGUgPT09IDIyOSkgewogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKGlubmVyUGFyYW1zLnN0b3BLZXlkb3duUHJvcGFnYXRpb24pIHsKICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgIH0gLy8gRU5URVIKCgogICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSB7CiAgICAgIGhhbmRsZUVudGVyKGluc3RhbmNlLCBlLCBpbm5lclBhcmFtcyk7CiAgICB9IC8vIFRBQgogICAgZWxzZSBpZiAoZS5rZXkgPT09ICdUYWInKSB7CiAgICAgIGhhbmRsZVRhYihlLCBpbm5lclBhcmFtcyk7CiAgICB9IC8vIEFSUk9XUyAtIHN3aXRjaCBmb2N1cyBiZXR3ZWVuIGJ1dHRvbnMKICAgIGVsc2UgaWYgKFsuLi5hcnJvd0tleXNOZXh0QnV0dG9uLCAuLi5hcnJvd0tleXNQcmV2aW91c0J1dHRvbl0uaW5jbHVkZXMoZS5rZXkpKSB7CiAgICAgIGhhbmRsZUFycm93cyhlLmtleSk7CiAgICB9IC8vIEVTQwogICAgZWxzZSBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSB7CiAgICAgIGhhbmRsZUVzYyhlLCBpbm5lclBhcmFtcywgZGlzbWlzc1dpdGgpOwogICAgfQogIH07CiAgLyoqCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0Mn0gaW5zdGFuY2UKICAgKiBAcGFyYW0ge0tleWJvYXJkRXZlbnR9IGUKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnRPcHRpb25zfSBpbm5lclBhcmFtcwogICAqLwoKCiAgY29uc3QgaGFuZGxlRW50ZXIgPSAoaW5zdGFuY2UsIGUsIGlubmVyUGFyYW1zKSA9PiB7CiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vc3dlZXRhbGVydDIvc3dlZXRhbGVydDIvaXNzdWVzLzIzODYKICAgIGlmICghY2FsbElmRnVuY3Rpb24oaW5uZXJQYXJhbXMuYWxsb3dFbnRlcktleSkpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmIChlLnRhcmdldCAmJiBpbnN0YW5jZS5nZXRJbnB1dCgpICYmIGUudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgZS50YXJnZXQub3V0ZXJIVE1MID09PSBpbnN0YW5jZS5nZXRJbnB1dCgpLm91dGVySFRNTCkgewogICAgICBpZiAoWyd0ZXh0YXJlYScsICdmaWxlJ10uaW5jbHVkZXMoaW5uZXJQYXJhbXMuaW5wdXQpKSB7CiAgICAgICAgcmV0dXJuOyAvLyBkbyBub3Qgc3VibWl0CiAgICAgIH0KCiAgICAgIGNsaWNrQ29uZmlybSgpOwogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICB9CiAgfTsKICAvKioKICAgKiBAcGFyYW0ge0tleWJvYXJkRXZlbnR9IGUKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnRPcHRpb25zfSBpbm5lclBhcmFtcwogICAqLwoKCiAgY29uc3QgaGFuZGxlVGFiID0gKGUsIGlubmVyUGFyYW1zKSA9PiB7CiAgICBjb25zdCB0YXJnZXRFbGVtZW50ID0gZS50YXJnZXQ7CiAgICBjb25zdCBmb2N1c2FibGVFbGVtZW50cyA9IGdldEZvY3VzYWJsZUVsZW1lbnRzKCk7CiAgICBsZXQgYnRuSW5kZXggPSAtMTsKCiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZvY3VzYWJsZUVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh0YXJnZXRFbGVtZW50ID09PSBmb2N1c2FibGVFbGVtZW50c1tpXSkgewogICAgICAgIGJ0bkluZGV4ID0gaTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfSAvLyBDeWNsZSB0byB0aGUgbmV4dCBidXR0b24KCgogICAgaWYgKCFlLnNoaWZ0S2V5KSB7CiAgICAgIHNldEZvY3VzKGlubmVyUGFyYW1zLCBidG5JbmRleCwgMSk7CiAgICB9IC8vIEN5Y2xlIHRvIHRoZSBwcmV2IGJ1dHRvbgogICAgZWxzZSB7CiAgICAgIHNldEZvY3VzKGlubmVyUGFyYW1zLCBidG5JbmRleCwgLTEpOwogICAgfQoKICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgfTsKICAvKioKICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5CiAgICovCgoKICBjb25zdCBoYW5kbGVBcnJvd3MgPSBrZXkgPT4gewogICAgY29uc3QgY29uZmlybUJ1dHRvbiA9IGdldENvbmZpcm1CdXR0b24oKTsKICAgIGNvbnN0IGRlbnlCdXR0b24gPSBnZXREZW55QnV0dG9uKCk7CiAgICBjb25zdCBjYW5jZWxCdXR0b24gPSBnZXRDYW5jZWxCdXR0b24oKTsKCiAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmICFbY29uZmlybUJ1dHRvbiwgZGVueUJ1dHRvbiwgY2FuY2VsQnV0dG9uXS5pbmNsdWRlcyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSkgewogICAgICByZXR1cm47CiAgICB9CgogICAgY29uc3Qgc2libGluZyA9IGFycm93S2V5c05leHRCdXR0b24uaW5jbHVkZXMoa2V5KSA/ICduZXh0RWxlbWVudFNpYmxpbmcnIDogJ3ByZXZpb3VzRWxlbWVudFNpYmxpbmcnOwogICAgbGV0IGJ1dHRvblRvRm9jdXMgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50OwoKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ2V0QWN0aW9ucygpLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgIGJ1dHRvblRvRm9jdXMgPSBidXR0b25Ub0ZvY3VzW3NpYmxpbmddOwoKICAgICAgaWYgKCFidXR0b25Ub0ZvY3VzKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBpZiAoYnV0dG9uVG9Gb2N1cyBpbnN0YW5jZW9mIEhUTUxCdXR0b25FbGVtZW50ICYmIGlzVmlzaWJsZShidXR0b25Ub0ZvY3VzKSkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CgogICAgaWYgKGJ1dHRvblRvRm9jdXMgaW5zdGFuY2VvZiBIVE1MQnV0dG9uRWxlbWVudCkgewogICAgICBidXR0b25Ub0ZvY3VzLmZvY3VzKCk7CiAgICB9CiAgfTsKICAvKioKICAgKiBAcGFyYW0ge0tleWJvYXJkRXZlbnR9IGUKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnRPcHRpb25zfSBpbm5lclBhcmFtcwogICAqIEBwYXJhbSB7ZnVuY3Rpb259IGRpc21pc3NXaXRoCiAgICovCgoKICBjb25zdCBoYW5kbGVFc2MgPSAoZSwgaW5uZXJQYXJhbXMsIGRpc21pc3NXaXRoKSA9PiB7CiAgICBpZiAoY2FsbElmRnVuY3Rpb24oaW5uZXJQYXJhbXMuYWxsb3dFc2NhcGVLZXkpKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgZGlzbWlzc1dpdGgoRGlzbWlzc1JlYXNvbi5lc2MpOwogICAgfQogIH07CgogIC8qCiAgICogSW5zdGFuY2UgbWV0aG9kIHRvIGNsb3NlIHN3ZWV0QWxlcnQKICAgKi8KCiAgZnVuY3Rpb24gcmVtb3ZlUG9wdXBBbmRSZXNldFN0YXRlKGluc3RhbmNlLCBjb250YWluZXIsIHJldHVybkZvY3VzLCBkaWRDbG9zZSkgewogICAgaWYgKGlzVG9hc3QoKSkgewogICAgICB0cmlnZ2VyRGlkQ2xvc2VBbmREaXNwb3NlKGluc3RhbmNlLCBkaWRDbG9zZSk7CiAgICB9IGVsc2UgewogICAgICByZXN0b3JlQWN0aXZlRWxlbWVudChyZXR1cm5Gb2N1cykudGhlbigoKSA9PiB0cmlnZ2VyRGlkQ2xvc2VBbmREaXNwb3NlKGluc3RhbmNlLCBkaWRDbG9zZSkpOwogICAgICByZW1vdmVLZXlkb3duSGFuZGxlcihnbG9iYWxTdGF0ZSk7CiAgICB9CgogICAgY29uc3QgaXNTYWZhcmkgPSAvXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpOyAvLyB3b3JrYXJvdW5kIGZvciAjMjA4OAogICAgLy8gZm9yIHNvbWUgcmVhc29uIHJlbW92aW5nIHRoZSBjb250YWluZXIgaW4gU2FmYXJpIHdpbGwgc2Nyb2xsIHRoZSBkb2N1bWVudCB0byBib3R0b20KCiAgICBpZiAoaXNTYWZhcmkpIHsKICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnZGlzcGxheTpub25lICFpbXBvcnRhbnQnKTsKICAgICAgY29udGFpbmVyLnJlbW92ZUF0dHJpYnV0ZSgnY2xhc3MnKTsKICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnOwogICAgfSBlbHNlIHsKICAgICAgY29udGFpbmVyLnJlbW92ZSgpOwogICAgfQoKICAgIGlmIChpc01vZGFsKCkpIHsKICAgICAgdW5kb1Njcm9sbGJhcigpOwogICAgICB1bmRvSU9TZml4KCk7CiAgICAgIHVuc2V0QXJpYUhpZGRlbigpOwogICAgfQoKICAgIHJlbW92ZUJvZHlDbGFzc2VzKCk7CiAgfQoKICBmdW5jdGlvbiByZW1vdmVCb2R5Q2xhc3NlcygpIHsKICAgIHJlbW92ZUNsYXNzKFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIGRvY3VtZW50LmJvZHldLCBbc3dhbENsYXNzZXMuc2hvd24sIHN3YWxDbGFzc2VzWydoZWlnaHQtYXV0byddLCBzd2FsQ2xhc3Nlc1snbm8tYmFja2Ryb3AnXSwgc3dhbENsYXNzZXNbJ3RvYXN0LXNob3duJ11dKTsKICB9CgogIGZ1bmN0aW9uIGNsb3NlKHJlc29sdmVWYWx1ZSkgewogICAgcmVzb2x2ZVZhbHVlID0gcHJlcGFyZVJlc29sdmVWYWx1ZShyZXNvbHZlVmFsdWUpOwogICAgY29uc3Qgc3dhbFByb21pc2VSZXNvbHZlID0gcHJpdmF0ZU1ldGhvZHMuc3dhbFByb21pc2VSZXNvbHZlLmdldCh0aGlzKTsKICAgIGNvbnN0IGRpZENsb3NlID0gdHJpZ2dlckNsb3NlUG9wdXAodGhpcyk7CgogICAgaWYgKHRoaXMuaXNBd2FpdGluZ1Byb21pc2UoKSkgewogICAgICAvLyBBIHN3YWwgYXdhaXRpbmcgZm9yIGEgcHJvbWlzZSAoYWZ0ZXIgYSBjbGljayBvbiBDb25maXJtIG9yIERlbnkpIGNhbm5vdCBiZSBkaXNtaXNzZWQgYW55bW9yZSAjMjMzNQogICAgICBpZiAoIXJlc29sdmVWYWx1ZS5pc0Rpc21pc3NlZCkgewogICAgICAgIGhhbmRsZUF3YWl0aW5nUHJvbWlzZSh0aGlzKTsKICAgICAgICBzd2FsUHJvbWlzZVJlc29sdmUocmVzb2x2ZVZhbHVlKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChkaWRDbG9zZSkgewogICAgICAvLyBSZXNvbHZlIFN3YWwgcHJvbWlzZQogICAgICBzd2FsUHJvbWlzZVJlc29sdmUocmVzb2x2ZVZhbHVlKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gaXNBd2FpdGluZ1Byb21pc2UoKSB7CiAgICByZXR1cm4gISFwcml2YXRlUHJvcHMuYXdhaXRpbmdQcm9taXNlLmdldCh0aGlzKTsKICB9CgogIGNvbnN0IHRyaWdnZXJDbG9zZVBvcHVwID0gaW5zdGFuY2UgPT4gewogICAgY29uc3QgcG9wdXAgPSBnZXRQb3B1cCgpOwoKICAgIGlmICghcG9wdXApIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIGNvbnN0IGlubmVyUGFyYW1zID0gcHJpdmF0ZVByb3BzLmlubmVyUGFyYW1zLmdldChpbnN0YW5jZSk7CgogICAgaWYgKCFpbm5lclBhcmFtcyB8fCBoYXNDbGFzcyhwb3B1cCwgaW5uZXJQYXJhbXMuaGlkZUNsYXNzLnBvcHVwKSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgcmVtb3ZlQ2xhc3MocG9wdXAsIGlubmVyUGFyYW1zLnNob3dDbGFzcy5wb3B1cCk7CiAgICBhZGRDbGFzcyhwb3B1cCwgaW5uZXJQYXJhbXMuaGlkZUNsYXNzLnBvcHVwKTsKICAgIGNvbnN0IGJhY2tkcm9wID0gZ2V0Q29udGFpbmVyKCk7CiAgICByZW1vdmVDbGFzcyhiYWNrZHJvcCwgaW5uZXJQYXJhbXMuc2hvd0NsYXNzLmJhY2tkcm9wKTsKICAgIGFkZENsYXNzKGJhY2tkcm9wLCBpbm5lclBhcmFtcy5oaWRlQ2xhc3MuYmFja2Ryb3ApOwogICAgaGFuZGxlUG9wdXBBbmltYXRpb24oaW5zdGFuY2UsIHBvcHVwLCBpbm5lclBhcmFtcyk7CiAgICByZXR1cm4gdHJ1ZTsKICB9OwoKICBmdW5jdGlvbiByZWplY3RQcm9taXNlKGVycm9yKSB7CiAgICBjb25zdCByZWplY3RQcm9taXNlID0gcHJpdmF0ZU1ldGhvZHMuc3dhbFByb21pc2VSZWplY3QuZ2V0KHRoaXMpOwogICAgaGFuZGxlQXdhaXRpbmdQcm9taXNlKHRoaXMpOwoKICAgIGlmIChyZWplY3RQcm9taXNlKSB7CiAgICAgIC8vIFJlamVjdCBTd2FsIHByb21pc2UKICAgICAgcmVqZWN0UHJvbWlzZShlcnJvcik7CiAgICB9CiAgfQogIGNvbnN0IGhhbmRsZUF3YWl0aW5nUHJvbWlzZSA9IGluc3RhbmNlID0+IHsKICAgIGlmIChpbnN0YW5jZS5pc0F3YWl0aW5nUHJvbWlzZSgpKSB7CiAgICAgIHByaXZhdGVQcm9wcy5hd2FpdGluZ1Byb21pc2UuZGVsZXRlKGluc3RhbmNlKTsgLy8gVGhlIGluc3RhbmNlIG1pZ2h0IGhhdmUgYmVlbiBwcmV2aW91c2x5IHBhcnRseSBkZXN0cm95ZWQsIHdlIG11c3QgcmVzdW1lIHRoZSBkZXN0cm95IHByb2Nlc3MgaW4gdGhpcyBjYXNlICMyMzM1CgogICAgICBpZiAoIXByaXZhdGVQcm9wcy5pbm5lclBhcmFtcy5nZXQoaW5zdGFuY2UpKSB7CiAgICAgICAgaW5zdGFuY2UuX2Rlc3Ryb3koKTsKICAgICAgfQogICAgfQogIH07CgogIGNvbnN0IHByZXBhcmVSZXNvbHZlVmFsdWUgPSByZXNvbHZlVmFsdWUgPT4gewogICAgLy8gV2hlbiB1c2VyIGNhbGxzIFN3YWwuY2xvc2UoKQogICAgaWYgKHR5cGVvZiByZXNvbHZlVmFsdWUgPT09ICd1bmRlZmluZWQnKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgaXNDb25maXJtZWQ6IGZhbHNlLAogICAgICAgIGlzRGVuaWVkOiBmYWxzZSwKICAgICAgICBpc0Rpc21pc3NlZDogdHJ1ZQogICAgICB9OwogICAgfQoKICAgIHJldHVybiBPYmplY3QuYXNzaWduKHsKICAgICAgaXNDb25maXJtZWQ6IGZhbHNlLAogICAgICBpc0RlbmllZDogZmFsc2UsCiAgICAgIGlzRGlzbWlzc2VkOiBmYWxzZQogICAgfSwgcmVzb2x2ZVZhbHVlKTsKICB9OwoKICBjb25zdCBoYW5kbGVQb3B1cEFuaW1hdGlvbiA9IChpbnN0YW5jZSwgcG9wdXAsIGlubmVyUGFyYW1zKSA9PiB7CiAgICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXIoKTsgLy8gSWYgYW5pbWF0aW9uIGlzIHN1cHBvcnRlZCwgYW5pbWF0ZQoKICAgIGNvbnN0IGFuaW1hdGlvbklzU3VwcG9ydGVkID0gYW5pbWF0aW9uRW5kRXZlbnQgJiYgaGFzQ3NzQW5pbWF0aW9uKHBvcHVwKTsKCiAgICBpZiAodHlwZW9mIGlubmVyUGFyYW1zLndpbGxDbG9zZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBpbm5lclBhcmFtcy53aWxsQ2xvc2UocG9wdXApOwogICAgfQoKICAgIGlmIChhbmltYXRpb25Jc1N1cHBvcnRlZCkgewogICAgICBhbmltYXRlUG9wdXAoaW5zdGFuY2UsIHBvcHVwLCBjb250YWluZXIsIGlubmVyUGFyYW1zLnJldHVybkZvY3VzLCBpbm5lclBhcmFtcy5kaWRDbG9zZSk7CiAgICB9IGVsc2UgewogICAgICAvLyBPdGhlcndpc2UsIHJlbW92ZSBpbW1lZGlhdGVseQogICAgICByZW1vdmVQb3B1cEFuZFJlc2V0U3RhdGUoaW5zdGFuY2UsIGNvbnRhaW5lciwgaW5uZXJQYXJhbXMucmV0dXJuRm9jdXMsIGlubmVyUGFyYW1zLmRpZENsb3NlKTsKICAgIH0KICB9OwoKICBjb25zdCBhbmltYXRlUG9wdXAgPSAoaW5zdGFuY2UsIHBvcHVwLCBjb250YWluZXIsIHJldHVybkZvY3VzLCBkaWRDbG9zZSkgPT4gewogICAgZ2xvYmFsU3RhdGUuc3dhbENsb3NlRXZlbnRGaW5pc2hlZENhbGxiYWNrID0gcmVtb3ZlUG9wdXBBbmRSZXNldFN0YXRlLmJpbmQobnVsbCwgaW5zdGFuY2UsIGNvbnRhaW5lciwgcmV0dXJuRm9jdXMsIGRpZENsb3NlKTsKICAgIHBvcHVwLmFkZEV2ZW50TGlzdGVuZXIoYW5pbWF0aW9uRW5kRXZlbnQsIGZ1bmN0aW9uIChlKSB7CiAgICAgIGlmIChlLnRhcmdldCA9PT0gcG9wdXApIHsKICAgICAgICBnbG9iYWxTdGF0ZS5zd2FsQ2xvc2VFdmVudEZpbmlzaGVkQ2FsbGJhY2soKTsKICAgICAgICBkZWxldGUgZ2xvYmFsU3RhdGUuc3dhbENsb3NlRXZlbnRGaW5pc2hlZENhbGxiYWNrOwogICAgICB9CiAgICB9KTsKICB9OwoKICBjb25zdCB0cmlnZ2VyRGlkQ2xvc2VBbmREaXNwb3NlID0gKGluc3RhbmNlLCBkaWRDbG9zZSkgPT4gewogICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgIGlmICh0eXBlb2YgZGlkQ2xvc2UgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICBkaWRDbG9zZS5iaW5kKGluc3RhbmNlLnBhcmFtcykoKTsKICAgICAgfQoKICAgICAgaW5zdGFuY2UuX2Rlc3Ryb3koKTsKICAgIH0pOwogIH07CgogIGZ1bmN0aW9uIHNldEJ1dHRvbnNEaXNhYmxlZChpbnN0YW5jZSwgYnV0dG9ucywgZGlzYWJsZWQpIHsKICAgIGNvbnN0IGRvbUNhY2hlID0gcHJpdmF0ZVByb3BzLmRvbUNhY2hlLmdldChpbnN0YW5jZSk7CiAgICBidXR0b25zLmZvckVhY2goYnV0dG9uID0+IHsKICAgICAgZG9tQ2FjaGVbYnV0dG9uXS5kaXNhYmxlZCA9IGRpc2FibGVkOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBzZXRJbnB1dERpc2FibGVkKGlucHV0LCBkaXNhYmxlZCkgewogICAgaWYgKCFpbnB1dCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgaWYgKGlucHV0LnR5cGUgPT09ICdyYWRpbycpIHsKICAgICAgY29uc3QgcmFkaW9zQ29udGFpbmVyID0gaW5wdXQucGFyZW50Tm9kZS5wYXJlbnROb2RlOwogICAgICBjb25zdCByYWRpb3MgPSByYWRpb3NDb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQnKTsKCiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmFkaW9zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgcmFkaW9zW2ldLmRpc2FibGVkID0gZGlzYWJsZWQ7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlucHV0LmRpc2FibGVkID0gZGlzYWJsZWQ7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBlbmFibGVCdXR0b25zKCkgewogICAgc2V0QnV0dG9uc0Rpc2FibGVkKHRoaXMsIFsnY29uZmlybUJ1dHRvbicsICdkZW55QnV0dG9uJywgJ2NhbmNlbEJ1dHRvbiddLCBmYWxzZSk7CiAgfQogIGZ1bmN0aW9uIGRpc2FibGVCdXR0b25zKCkgewogICAgc2V0QnV0dG9uc0Rpc2FibGVkKHRoaXMsIFsnY29uZmlybUJ1dHRvbicsICdkZW55QnV0dG9uJywgJ2NhbmNlbEJ1dHRvbiddLCB0cnVlKTsKICB9CiAgZnVuY3Rpb24gZW5hYmxlSW5wdXQoKSB7CiAgICByZXR1cm4gc2V0SW5wdXREaXNhYmxlZCh0aGlzLmdldElucHV0KCksIGZhbHNlKTsKICB9CiAgZnVuY3Rpb24gZGlzYWJsZUlucHV0KCkgewogICAgcmV0dXJuIHNldElucHV0RGlzYWJsZWQodGhpcy5nZXRJbnB1dCgpLCB0cnVlKTsKICB9CgogIGZ1bmN0aW9uIHNob3dWYWxpZGF0aW9uTWVzc2FnZShlcnJvcikgewogICAgY29uc3QgZG9tQ2FjaGUgPSBwcml2YXRlUHJvcHMuZG9tQ2FjaGUuZ2V0KHRoaXMpOwogICAgY29uc3QgcGFyYW1zID0gcHJpdmF0ZVByb3BzLmlubmVyUGFyYW1zLmdldCh0aGlzKTsKICAgIHNldElubmVySHRtbChkb21DYWNoZS52YWxpZGF0aW9uTWVzc2FnZSwgZXJyb3IpOwogICAgZG9tQ2FjaGUudmFsaWRhdGlvbk1lc3NhZ2UuY2xhc3NOYW1lID0gc3dhbENsYXNzZXNbJ3ZhbGlkYXRpb24tbWVzc2FnZSddOwoKICAgIGlmIChwYXJhbXMuY3VzdG9tQ2xhc3MgJiYgcGFyYW1zLmN1c3RvbUNsYXNzLnZhbGlkYXRpb25NZXNzYWdlKSB7CiAgICAgIGFkZENsYXNzKGRvbUNhY2hlLnZhbGlkYXRpb25NZXNzYWdlLCBwYXJhbXMuY3VzdG9tQ2xhc3MudmFsaWRhdGlvbk1lc3NhZ2UpOwogICAgfQoKICAgIHNob3coZG9tQ2FjaGUudmFsaWRhdGlvbk1lc3NhZ2UpOwogICAgY29uc3QgaW5wdXQgPSB0aGlzLmdldElucHV0KCk7CgogICAgaWYgKGlucHV0KSB7CiAgICAgIGlucHV0LnNldEF0dHJpYnV0ZSgnYXJpYS1pbnZhbGlkJywgdHJ1ZSk7CiAgICAgIGlucHV0LnNldEF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScsIHN3YWxDbGFzc2VzWyd2YWxpZGF0aW9uLW1lc3NhZ2UnXSk7CiAgICAgIGZvY3VzSW5wdXQoaW5wdXQpOwogICAgICBhZGRDbGFzcyhpbnB1dCwgc3dhbENsYXNzZXMuaW5wdXRlcnJvcik7CiAgICB9CiAgfSAvLyBIaWRlIGJsb2NrIHdpdGggdmFsaWRhdGlvbiBtZXNzYWdlCgogIGZ1bmN0aW9uIHJlc2V0VmFsaWRhdGlvbk1lc3NhZ2UkMSgpIHsKICAgIGNvbnN0IGRvbUNhY2hlID0gcHJpdmF0ZVByb3BzLmRvbUNhY2hlLmdldCh0aGlzKTsKCiAgICBpZiAoZG9tQ2FjaGUudmFsaWRhdGlvbk1lc3NhZ2UpIHsKICAgICAgaGlkZShkb21DYWNoZS52YWxpZGF0aW9uTWVzc2FnZSk7CiAgICB9CgogICAgY29uc3QgaW5wdXQgPSB0aGlzLmdldElucHV0KCk7CgogICAgaWYgKGlucHV0KSB7CiAgICAgIGlucHV0LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1pbnZhbGlkJyk7CiAgICAgIGlucHV0LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScpOwogICAgICByZW1vdmVDbGFzcyhpbnB1dCwgc3dhbENsYXNzZXMuaW5wdXRlcnJvcik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBnZXRQcm9ncmVzc1N0ZXBzJDEoKSB7CiAgICBjb25zdCBkb21DYWNoZSA9IHByaXZhdGVQcm9wcy5kb21DYWNoZS5nZXQodGhpcyk7CiAgICByZXR1cm4gZG9tQ2FjaGUucHJvZ3Jlc3NTdGVwczsKICB9CgogIC8qKgogICAqIFVwZGF0ZXMgcG9wdXAgcGFyYW1ldGVycy4KICAgKi8KCiAgZnVuY3Rpb24gdXBkYXRlKHBhcmFtcykgewogICAgY29uc3QgcG9wdXAgPSBnZXRQb3B1cCgpOwogICAgY29uc3QgaW5uZXJQYXJhbXMgPSBwcml2YXRlUHJvcHMuaW5uZXJQYXJhbXMuZ2V0KHRoaXMpOwoKICAgIGlmICghcG9wdXAgfHwgaGFzQ2xhc3MocG9wdXAsIGlubmVyUGFyYW1zLmhpZGVDbGFzcy5wb3B1cCkpIHsKICAgICAgcmV0dXJuIHdhcm4oIllvdSdyZSB0cnlpbmcgdG8gdXBkYXRlIHRoZSBjbG9zZWQgb3IgY2xvc2luZyBwb3B1cCwgdGhhdCB3b24ndCB3b3JrLiBVc2UgdGhlIHVwZGF0ZSgpIG1ldGhvZCBpbiBwcmVDb25maXJtIHBhcmFtZXRlciBvciBzaG93IGEgbmV3IHBvcHVwLiIpOwogICAgfQoKICAgIGNvbnN0IHZhbGlkVXBkYXRhYmxlUGFyYW1zID0gZmlsdGVyVmFsaWRQYXJhbXMocGFyYW1zKTsKICAgIGNvbnN0IHVwZGF0ZWRQYXJhbXMgPSBPYmplY3QuYXNzaWduKHt9LCBpbm5lclBhcmFtcywgdmFsaWRVcGRhdGFibGVQYXJhbXMpOwogICAgcmVuZGVyKHRoaXMsIHVwZGF0ZWRQYXJhbXMpOwogICAgcHJpdmF0ZVByb3BzLmlubmVyUGFyYW1zLnNldCh0aGlzLCB1cGRhdGVkUGFyYW1zKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHsKICAgICAgcGFyYW1zOiB7CiAgICAgICAgdmFsdWU6IE9iamVjdC5hc3NpZ24oe30sIHRoaXMucGFyYW1zLCBwYXJhbXMpLAogICAgICAgIHdyaXRhYmxlOiBmYWxzZSwKICAgICAgICBlbnVtZXJhYmxlOiB0cnVlCiAgICAgIH0KICAgIH0pOwogIH0KCiAgY29uc3QgZmlsdGVyVmFsaWRQYXJhbXMgPSBwYXJhbXMgPT4gewogICAgY29uc3QgdmFsaWRVcGRhdGFibGVQYXJhbXMgPSB7fTsKICAgIE9iamVjdC5rZXlzKHBhcmFtcykuZm9yRWFjaChwYXJhbSA9PiB7CiAgICAgIGlmIChpc1VwZGF0YWJsZVBhcmFtZXRlcihwYXJhbSkpIHsKICAgICAgICB2YWxpZFVwZGF0YWJsZVBhcmFtc1twYXJhbV0gPSBwYXJhbXNbcGFyYW1dOwogICAgICB9IGVsc2UgewogICAgICAgIHdhcm4oIkludmFsaWQgcGFyYW1ldGVyIHRvIHVwZGF0ZTogIi5jb25jYXQocGFyYW0pKTsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gdmFsaWRVcGRhdGFibGVQYXJhbXM7CiAgfTsKCiAgZnVuY3Rpb24gX2Rlc3Ryb3koKSB7CiAgICBjb25zdCBkb21DYWNoZSA9IHByaXZhdGVQcm9wcy5kb21DYWNoZS5nZXQodGhpcyk7CiAgICBjb25zdCBpbm5lclBhcmFtcyA9IHByaXZhdGVQcm9wcy5pbm5lclBhcmFtcy5nZXQodGhpcyk7CgogICAgaWYgKCFpbm5lclBhcmFtcykgewogICAgICBkaXNwb3NlV2Vha01hcHModGhpcyk7IC8vIFRoZSBXZWFrTWFwcyBtaWdodCBoYXZlIGJlZW4gcGFydGx5IGRlc3Ryb3llZCwgd2UgbXVzdCByZWNhbGwgaXQgdG8gZGlzcG9zZSBhbnkgcmVtYWluaW5nIFdlYWtNYXBzICMyMzM1CgogICAgICByZXR1cm47IC8vIFRoaXMgaW5zdGFuY2UgaGFzIGFscmVhZHkgYmVlbiBkZXN0cm95ZWQKICAgIH0gLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYW5vdGhlciBTd2FsIGNsb3NpbmcKCgogICAgaWYgKGRvbUNhY2hlLnBvcHVwICYmIGdsb2JhbFN0YXRlLnN3YWxDbG9zZUV2ZW50RmluaXNoZWRDYWxsYmFjaykgewogICAgICBnbG9iYWxTdGF0ZS5zd2FsQ2xvc2VFdmVudEZpbmlzaGVkQ2FsbGJhY2soKTsKICAgICAgZGVsZXRlIGdsb2JhbFN0YXRlLnN3YWxDbG9zZUV2ZW50RmluaXNoZWRDYWxsYmFjazsKICAgIH0KCiAgICBpZiAodHlwZW9mIGlubmVyUGFyYW1zLmRpZERlc3Ryb3kgPT09ICdmdW5jdGlvbicpIHsKICAgICAgaW5uZXJQYXJhbXMuZGlkRGVzdHJveSgpOwogICAgfQoKICAgIGRpc3Bvc2VTd2FsKHRoaXMpOwogIH0KICAvKioKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnQyfSBpbnN0YW5jZQogICAqLwoKICBjb25zdCBkaXNwb3NlU3dhbCA9IGluc3RhbmNlID0+IHsKICAgIGRpc3Bvc2VXZWFrTWFwcyhpbnN0YW5jZSk7IC8vIFVuc2V0IHRoaXMucGFyYW1zIHNvIEdDIHdpbGwgZGlzcG9zZSBpdCAoIzE1NjkpCiAgICAvLyBAdHMtaWdub3JlCgogICAgZGVsZXRlIGluc3RhbmNlLnBhcmFtczsgLy8gVW5zZXQgZ2xvYmFsU3RhdGUgcHJvcHMgc28gR0Mgd2lsbCBkaXNwb3NlIGdsb2JhbFN0YXRlICgjMTU2OSkKCiAgICBkZWxldGUgZ2xvYmFsU3RhdGUua2V5ZG93bkhhbmRsZXI7CiAgICBkZWxldGUgZ2xvYmFsU3RhdGUua2V5ZG93blRhcmdldDsgLy8gVW5zZXQgY3VycmVudEluc3RhbmNlCgogICAgZGVsZXRlIGdsb2JhbFN0YXRlLmN1cnJlbnRJbnN0YW5jZTsKICB9OwogIC8qKgogICAqIEBwYXJhbSB7U3dlZXRBbGVydDJ9IGluc3RhbmNlCiAgICovCgoKICBjb25zdCBkaXNwb3NlV2Vha01hcHMgPSBpbnN0YW5jZSA9PiB7CiAgICAvLyBJZiB0aGUgY3VycmVudCBpbnN0YW5jZSBpcyBhd2FpdGluZyBhIHByb21pc2UgcmVzdWx0LCB3ZSBrZWVwIHRoZSBwcml2YXRlTWV0aG9kcyB0byBjYWxsIHRoZW0gb25jZSB0aGUgcHJvbWlzZSByZXN1bHQgaXMgcmV0cmlldmVkICMyMzM1CiAgICAvLyBAdHMtaWdub3JlCiAgICBpZiAoaW5zdGFuY2UuaXNBd2FpdGluZ1Byb21pc2UoKSkgewogICAgICB1bnNldFdlYWtNYXBzKHByaXZhdGVQcm9wcywgaW5zdGFuY2UpOwogICAgICBwcml2YXRlUHJvcHMuYXdhaXRpbmdQcm9taXNlLnNldChpbnN0YW5jZSwgdHJ1ZSk7CiAgICB9IGVsc2UgewogICAgICB1bnNldFdlYWtNYXBzKHByaXZhdGVNZXRob2RzLCBpbnN0YW5jZSk7CiAgICAgIHVuc2V0V2Vha01hcHMocHJpdmF0ZVByb3BzLCBpbnN0YW5jZSk7CiAgICB9CiAgfTsKICAvKioKICAgKiBAcGFyYW0ge29iamVjdH0gb2JqCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0Mn0gaW5zdGFuY2UKICAgKi8KCgogIGNvbnN0IHVuc2V0V2Vha01hcHMgPSAob2JqLCBpbnN0YW5jZSkgPT4gewogICAgZm9yIChjb25zdCBpIGluIG9iaikgewogICAgICBvYmpbaV0uZGVsZXRlKGluc3RhbmNlKTsKICAgIH0KICB9OwoKCgogIHZhciBpbnN0YW5jZU1ldGhvZHMgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7CiAgICBoaWRlTG9hZGluZzogaGlkZUxvYWRpbmcsCiAgICBkaXNhYmxlTG9hZGluZzogaGlkZUxvYWRpbmcsCiAgICBnZXRJbnB1dDogZ2V0SW5wdXQkMSwKICAgIGNsb3NlOiBjbG9zZSwKICAgIGlzQXdhaXRpbmdQcm9taXNlOiBpc0F3YWl0aW5nUHJvbWlzZSwKICAgIHJlamVjdFByb21pc2U6IHJlamVjdFByb21pc2UsCiAgICBoYW5kbGVBd2FpdGluZ1Byb21pc2U6IGhhbmRsZUF3YWl0aW5nUHJvbWlzZSwKICAgIGNsb3NlUG9wdXA6IGNsb3NlLAogICAgY2xvc2VNb2RhbDogY2xvc2UsCiAgICBjbG9zZVRvYXN0OiBjbG9zZSwKICAgIGVuYWJsZUJ1dHRvbnM6IGVuYWJsZUJ1dHRvbnMsCiAgICBkaXNhYmxlQnV0dG9uczogZGlzYWJsZUJ1dHRvbnMsCiAgICBlbmFibGVJbnB1dDogZW5hYmxlSW5wdXQsCiAgICBkaXNhYmxlSW5wdXQ6IGRpc2FibGVJbnB1dCwKICAgIHNob3dWYWxpZGF0aW9uTWVzc2FnZTogc2hvd1ZhbGlkYXRpb25NZXNzYWdlLAogICAgcmVzZXRWYWxpZGF0aW9uTWVzc2FnZTogcmVzZXRWYWxpZGF0aW9uTWVzc2FnZSQxLAogICAgZ2V0UHJvZ3Jlc3NTdGVwczogZ2V0UHJvZ3Jlc3NTdGVwcyQxLAogICAgdXBkYXRlOiB1cGRhdGUsCiAgICBfZGVzdHJveTogX2Rlc3Ryb3kKICB9KTsKCiAgY29uc3QgaGFuZGxlQ29uZmlybUJ1dHRvbkNsaWNrID0gaW5zdGFuY2UgPT4gewogICAgY29uc3QgaW5uZXJQYXJhbXMgPSBwcml2YXRlUHJvcHMuaW5uZXJQYXJhbXMuZ2V0KGluc3RhbmNlKTsKICAgIGluc3RhbmNlLmRpc2FibGVCdXR0b25zKCk7CgogICAgaWYgKGlubmVyUGFyYW1zLmlucHV0KSB7CiAgICAgIGhhbmRsZUNvbmZpcm1PckRlbnlXaXRoSW5wdXQoaW5zdGFuY2UsICdjb25maXJtJyk7CiAgICB9IGVsc2UgewogICAgICBjb25maXJtKGluc3RhbmNlLCB0cnVlKTsKICAgIH0KICB9OwogIGNvbnN0IGhhbmRsZURlbnlCdXR0b25DbGljayA9IGluc3RhbmNlID0+IHsKICAgIGNvbnN0IGlubmVyUGFyYW1zID0gcHJpdmF0ZVByb3BzLmlubmVyUGFyYW1zLmdldChpbnN0YW5jZSk7CiAgICBpbnN0YW5jZS5kaXNhYmxlQnV0dG9ucygpOwoKICAgIGlmIChpbm5lclBhcmFtcy5yZXR1cm5JbnB1dFZhbHVlT25EZW55KSB7CiAgICAgIGhhbmRsZUNvbmZpcm1PckRlbnlXaXRoSW5wdXQoaW5zdGFuY2UsICdkZW55Jyk7CiAgICB9IGVsc2UgewogICAgICBkZW55KGluc3RhbmNlLCBmYWxzZSk7CiAgICB9CiAgfTsKICBjb25zdCBoYW5kbGVDYW5jZWxCdXR0b25DbGljayA9IChpbnN0YW5jZSwgZGlzbWlzc1dpdGgpID0+IHsKICAgIGluc3RhbmNlLmRpc2FibGVCdXR0b25zKCk7CiAgICBkaXNtaXNzV2l0aChEaXNtaXNzUmVhc29uLmNhbmNlbCk7CiAgfTsKCiAgY29uc3QgaGFuZGxlQ29uZmlybU9yRGVueVdpdGhJbnB1dCA9IChpbnN0YW5jZSwgdHlwZQogIC8qICdjb25maXJtJyB8ICdkZW55JyAqLwogICkgPT4gewogICAgY29uc3QgaW5uZXJQYXJhbXMgPSBwcml2YXRlUHJvcHMuaW5uZXJQYXJhbXMuZ2V0KGluc3RhbmNlKTsKCiAgICBpZiAoIWlubmVyUGFyYW1zLmlucHV0KSB7CiAgICAgIHJldHVybiBlcnJvcigiVGhlIFwiaW5wdXRcIiBwYXJhbWV0ZXIgaXMgbmVlZGVkIHRvIGJlIHNldCB3aGVuIHVzaW5nIHJldHVybklucHV0VmFsdWVPbiIuY29uY2F0KGNhcGl0YWxpemVGaXJzdExldHRlcih0eXBlKSkpOwogICAgfQoKICAgIGNvbnN0IGlucHV0VmFsdWUgPSBnZXRJbnB1dFZhbHVlKGluc3RhbmNlLCBpbm5lclBhcmFtcyk7CgogICAgaWYgKGlubmVyUGFyYW1zLmlucHV0VmFsaWRhdG9yKSB7CiAgICAgIGhhbmRsZUlucHV0VmFsaWRhdG9yKGluc3RhbmNlLCBpbnB1dFZhbHVlLCB0eXBlKTsKICAgIH0gZWxzZSBpZiAoIWluc3RhbmNlLmdldElucHV0KCkuY2hlY2tWYWxpZGl0eSgpKSB7CiAgICAgIGluc3RhbmNlLmVuYWJsZUJ1dHRvbnMoKTsKICAgICAgaW5zdGFuY2Uuc2hvd1ZhbGlkYXRpb25NZXNzYWdlKGlubmVyUGFyYW1zLnZhbGlkYXRpb25NZXNzYWdlKTsKICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2RlbnknKSB7CiAgICAgIGRlbnkoaW5zdGFuY2UsIGlucHV0VmFsdWUpOwogICAgfSBlbHNlIHsKICAgICAgY29uZmlybShpbnN0YW5jZSwgaW5wdXRWYWx1ZSk7CiAgICB9CiAgfTsKCiAgY29uc3QgaGFuZGxlSW5wdXRWYWxpZGF0b3IgPSAoaW5zdGFuY2UsIGlucHV0VmFsdWUsIHR5cGUKICAvKiAnY29uZmlybScgfCAnZGVueScgKi8KICApID0+IHsKICAgIGNvbnN0IGlubmVyUGFyYW1zID0gcHJpdmF0ZVByb3BzLmlubmVyUGFyYW1zLmdldChpbnN0YW5jZSk7CiAgICBpbnN0YW5jZS5kaXNhYmxlSW5wdXQoKTsKICAgIGNvbnN0IHZhbGlkYXRpb25Qcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiBhc1Byb21pc2UoaW5uZXJQYXJhbXMuaW5wdXRWYWxpZGF0b3IoaW5wdXRWYWx1ZSwgaW5uZXJQYXJhbXMudmFsaWRhdGlvbk1lc3NhZ2UpKSk7CiAgICB2YWxpZGF0aW9uUHJvbWlzZS50aGVuKHZhbGlkYXRpb25NZXNzYWdlID0+IHsKICAgICAgaW5zdGFuY2UuZW5hYmxlQnV0dG9ucygpOwogICAgICBpbnN0YW5jZS5lbmFibGVJbnB1dCgpOwoKICAgICAgaWYgKHZhbGlkYXRpb25NZXNzYWdlKSB7CiAgICAgICAgaW5zdGFuY2Uuc2hvd1ZhbGlkYXRpb25NZXNzYWdlKHZhbGlkYXRpb25NZXNzYWdlKTsKICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnZGVueScpIHsKICAgICAgICBkZW55KGluc3RhbmNlLCBpbnB1dFZhbHVlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25maXJtKGluc3RhbmNlLCBpbnB1dFZhbHVlKTsKICAgICAgfQogICAgfSk7CiAgfTsKCiAgY29uc3QgZGVueSA9IChpbnN0YW5jZSwgdmFsdWUpID0+IHsKICAgIGNvbnN0IGlubmVyUGFyYW1zID0gcHJpdmF0ZVByb3BzLmlubmVyUGFyYW1zLmdldChpbnN0YW5jZSB8fCB1bmRlZmluZWQpOwoKICAgIGlmIChpbm5lclBhcmFtcy5zaG93TG9hZGVyT25EZW55KSB7CiAgICAgIHNob3dMb2FkaW5nKGdldERlbnlCdXR0b24oKSk7CiAgICB9CgogICAgaWYgKGlubmVyUGFyYW1zLnByZURlbnkpIHsKICAgICAgcHJpdmF0ZVByb3BzLmF3YWl0aW5nUHJvbWlzZS5zZXQoaW5zdGFuY2UgfHwgdW5kZWZpbmVkLCB0cnVlKTsgLy8gRmxhZ2dpbmcgdGhlIGluc3RhbmNlIGFzIGF3YWl0aW5nIGEgcHJvbWlzZSBzbyBpdCdzIG93biBwcm9taXNlJ3MgcmVqZWN0L3Jlc29sdmUgbWV0aG9kcyBkb2Vzbid0IGdldCBkZXN0cm95ZWQgdW50aWwgdGhlIHJlc3VsdCBmcm9tIHRoaXMgcHJlRGVueSdzIHByb21pc2UgaXMgcmVjZWl2ZWQKCiAgICAgIGNvbnN0IHByZURlbnlQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiBhc1Byb21pc2UoaW5uZXJQYXJhbXMucHJlRGVueSh2YWx1ZSwgaW5uZXJQYXJhbXMudmFsaWRhdGlvbk1lc3NhZ2UpKSk7CiAgICAgIHByZURlbnlQcm9taXNlLnRoZW4ocHJlRGVueVZhbHVlID0+IHsKICAgICAgICBpZiAocHJlRGVueVZhbHVlID09PSBmYWxzZSkgewogICAgICAgICAgaW5zdGFuY2UuaGlkZUxvYWRpbmcoKTsKICAgICAgICAgIGhhbmRsZUF3YWl0aW5nUHJvbWlzZShpbnN0YW5jZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGluc3RhbmNlLmNsb3NlUG9wdXAoewogICAgICAgICAgICBpc0RlbmllZDogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IHR5cGVvZiBwcmVEZW55VmFsdWUgPT09ICd1bmRlZmluZWQnID8gdmFsdWUgOiBwcmVEZW55VmFsdWUKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSkuY2F0Y2goZXJyb3IkJDEgPT4gcmVqZWN0V2l0aChpbnN0YW5jZSB8fCB1bmRlZmluZWQsIGVycm9yJCQxKSk7CiAgICB9IGVsc2UgewogICAgICBpbnN0YW5jZS5jbG9zZVBvcHVwKHsKICAgICAgICBpc0RlbmllZDogdHJ1ZSwKICAgICAgICB2YWx1ZQogICAgICB9KTsKICAgIH0KICB9OwoKICBjb25zdCBzdWNjZWVkV2l0aCA9IChpbnN0YW5jZSwgdmFsdWUpID0+IHsKICAgIGluc3RhbmNlLmNsb3NlUG9wdXAoewogICAgICBpc0NvbmZpcm1lZDogdHJ1ZSwKICAgICAgdmFsdWUKICAgIH0pOwogIH07CgogIGNvbnN0IHJlamVjdFdpdGggPSAoaW5zdGFuY2UsIGVycm9yJCQxKSA9PiB7CiAgICBpbnN0YW5jZS5yZWplY3RQcm9taXNlKGVycm9yJCQxKTsKICB9OwoKICBjb25zdCBjb25maXJtID0gKGluc3RhbmNlLCB2YWx1ZSkgPT4gewogICAgY29uc3QgaW5uZXJQYXJhbXMgPSBwcml2YXRlUHJvcHMuaW5uZXJQYXJhbXMuZ2V0KGluc3RhbmNlIHx8IHVuZGVmaW5lZCk7CgogICAgaWYgKGlubmVyUGFyYW1zLnNob3dMb2FkZXJPbkNvbmZpcm0pIHsKICAgICAgc2hvd0xvYWRpbmcoKTsKICAgIH0KCiAgICBpZiAoaW5uZXJQYXJhbXMucHJlQ29uZmlybSkgewogICAgICBpbnN0YW5jZS5yZXNldFZhbGlkYXRpb25NZXNzYWdlKCk7CiAgICAgIHByaXZhdGVQcm9wcy5hd2FpdGluZ1Byb21pc2Uuc2V0KGluc3RhbmNlIHx8IHVuZGVmaW5lZCwgdHJ1ZSk7IC8vIEZsYWdnaW5nIHRoZSBpbnN0YW5jZSBhcyBhd2FpdGluZyBhIHByb21pc2Ugc28gaXQncyBvd24gcHJvbWlzZSdzIHJlamVjdC9yZXNvbHZlIG1ldGhvZHMgZG9lc24ndCBnZXQgZGVzdHJveWVkIHVudGlsIHRoZSByZXN1bHQgZnJvbSB0aGlzIHByZUNvbmZpcm0ncyBwcm9taXNlIGlzIHJlY2VpdmVkCgogICAgICBjb25zdCBwcmVDb25maXJtUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gYXNQcm9taXNlKGlubmVyUGFyYW1zLnByZUNvbmZpcm0odmFsdWUsIGlubmVyUGFyYW1zLnZhbGlkYXRpb25NZXNzYWdlKSkpOwogICAgICBwcmVDb25maXJtUHJvbWlzZS50aGVuKHByZUNvbmZpcm1WYWx1ZSA9PiB7CiAgICAgICAgaWYgKGlzVmlzaWJsZShnZXRWYWxpZGF0aW9uTWVzc2FnZSgpKSB8fCBwcmVDb25maXJtVmFsdWUgPT09IGZhbHNlKSB7CiAgICAgICAgICBpbnN0YW5jZS5oaWRlTG9hZGluZygpOwogICAgICAgICAgaGFuZGxlQXdhaXRpbmdQcm9taXNlKGluc3RhbmNlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3VjY2VlZFdpdGgoaW5zdGFuY2UsIHR5cGVvZiBwcmVDb25maXJtVmFsdWUgPT09ICd1bmRlZmluZWQnID8gdmFsdWUgOiBwcmVDb25maXJtVmFsdWUpOwogICAgICAgIH0KICAgICAgfSkuY2F0Y2goZXJyb3IkJDEgPT4gcmVqZWN0V2l0aChpbnN0YW5jZSB8fCB1bmRlZmluZWQsIGVycm9yJCQxKSk7CiAgICB9IGVsc2UgewogICAgICBzdWNjZWVkV2l0aChpbnN0YW5jZSwgdmFsdWUpOwogICAgfQogIH07CgogIGNvbnN0IGhhbmRsZVBvcHVwQ2xpY2sgPSAoaW5zdGFuY2UsIGRvbUNhY2hlLCBkaXNtaXNzV2l0aCkgPT4gewogICAgY29uc3QgaW5uZXJQYXJhbXMgPSBwcml2YXRlUHJvcHMuaW5uZXJQYXJhbXMuZ2V0KGluc3RhbmNlKTsKCiAgICBpZiAoaW5uZXJQYXJhbXMudG9hc3QpIHsKICAgICAgaGFuZGxlVG9hc3RDbGljayhpbnN0YW5jZSwgZG9tQ2FjaGUsIGRpc21pc3NXaXRoKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIElnbm9yZSBjbGljayBldmVudHMgdGhhdCBoYWQgbW91c2Vkb3duIG9uIHRoZSBwb3B1cCBidXQgbW91c2V1cCBvbiB0aGUgY29udGFpbmVyCiAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHRoZSB1c2VyIGRyYWdzIGEgc2xpZGVyCiAgICAgIGhhbmRsZU1vZGFsTW91c2Vkb3duKGRvbUNhY2hlKTsgLy8gSWdub3JlIGNsaWNrIGV2ZW50cyB0aGF0IGhhZCBtb3VzZWRvd24gb24gdGhlIGNvbnRhaW5lciBidXQgbW91c2V1cCBvbiB0aGUgcG9wdXAKCiAgICAgIGhhbmRsZUNvbnRhaW5lck1vdXNlZG93bihkb21DYWNoZSk7CiAgICAgIGhhbmRsZU1vZGFsQ2xpY2soaW5zdGFuY2UsIGRvbUNhY2hlLCBkaXNtaXNzV2l0aCk7CiAgICB9CiAgfTsKCiAgY29uc3QgaGFuZGxlVG9hc3RDbGljayA9IChpbnN0YW5jZSwgZG9tQ2FjaGUsIGRpc21pc3NXaXRoKSA9PiB7CiAgICAvLyBDbG9zaW5nIHRvYXN0IGJ5IGludGVybmFsIGNsaWNrCiAgICBkb21DYWNoZS5wb3B1cC5vbmNsaWNrID0gKCkgPT4gewogICAgICBjb25zdCBpbm5lclBhcmFtcyA9IHByaXZhdGVQcm9wcy5pbm5lclBhcmFtcy5nZXQoaW5zdGFuY2UpOwoKICAgICAgaWYgKGlubmVyUGFyYW1zICYmIChpc0FueUJ1dHRvblNob3duKGlubmVyUGFyYW1zKSB8fCBpbm5lclBhcmFtcy50aW1lciB8fCBpbm5lclBhcmFtcy5pbnB1dCkpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGRpc21pc3NXaXRoKERpc21pc3NSZWFzb24uY2xvc2UpOwogICAgfTsKICB9OwogIC8qKgogICAqIEBwYXJhbSB7Kn0gaW5uZXJQYXJhbXMKICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0KICAgKi8KCgogIGNvbnN0IGlzQW55QnV0dG9uU2hvd24gPSBpbm5lclBhcmFtcyA9PiB7CiAgICByZXR1cm4gaW5uZXJQYXJhbXMuc2hvd0NvbmZpcm1CdXR0b24gfHwgaW5uZXJQYXJhbXMuc2hvd0RlbnlCdXR0b24gfHwgaW5uZXJQYXJhbXMuc2hvd0NhbmNlbEJ1dHRvbiB8fCBpbm5lclBhcmFtcy5zaG93Q2xvc2VCdXR0b247CiAgfTsKCiAgbGV0IGlnbm9yZU91dHNpZGVDbGljayA9IGZhbHNlOwoKICBjb25zdCBoYW5kbGVNb2RhbE1vdXNlZG93biA9IGRvbUNhY2hlID0+IHsKICAgIGRvbUNhY2hlLnBvcHVwLm9ubW91c2Vkb3duID0gKCkgPT4gewogICAgICBkb21DYWNoZS5jb250YWluZXIub25tb3VzZXVwID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICBkb21DYWNoZS5jb250YWluZXIub25tb3VzZXVwID0gdW5kZWZpbmVkOyAvLyBXZSBvbmx5IGNoZWNrIGlmIHRoZSBtb3VzZXVwIHRhcmdldCBpcyB0aGUgY29udGFpbmVyIGJlY2F1c2UgdXN1YWxseSBpdCBkb2Vzbid0CiAgICAgICAgLy8gaGF2ZSBhbnkgb3RoZXIgZGlyZWN0IGNoaWxkcmVuIGFzaWRlIG9mIHRoZSBwb3B1cAoKICAgICAgICBpZiAoZS50YXJnZXQgPT09IGRvbUNhY2hlLmNvbnRhaW5lcikgewogICAgICAgICAgaWdub3JlT3V0c2lkZUNsaWNrID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH07CiAgICB9OwogIH07CgogIGNvbnN0IGhhbmRsZUNvbnRhaW5lck1vdXNlZG93biA9IGRvbUNhY2hlID0+IHsKICAgIGRvbUNhY2hlLmNvbnRhaW5lci5vbm1vdXNlZG93biA9ICgpID0+IHsKICAgICAgZG9tQ2FjaGUucG9wdXAub25tb3VzZXVwID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICBkb21DYWNoZS5wb3B1cC5vbm1vdXNldXAgPSB1bmRlZmluZWQ7IC8vIFdlIGFsc28gbmVlZCB0byBjaGVjayBpZiB0aGUgbW91c2V1cCB0YXJnZXQgaXMgYSBjaGlsZCBvZiB0aGUgcG9wdXAKCiAgICAgICAgaWYgKGUudGFyZ2V0ID09PSBkb21DYWNoZS5wb3B1cCB8fCBkb21DYWNoZS5wb3B1cC5jb250YWlucyhlLnRhcmdldCkpIHsKICAgICAgICAgIGlnbm9yZU91dHNpZGVDbGljayA9IHRydWU7CiAgICAgICAgfQogICAgICB9OwogICAgfTsKICB9OwoKICBjb25zdCBoYW5kbGVNb2RhbENsaWNrID0gKGluc3RhbmNlLCBkb21DYWNoZSwgZGlzbWlzc1dpdGgpID0+IHsKICAgIGRvbUNhY2hlLmNvbnRhaW5lci5vbmNsaWNrID0gZSA9PiB7CiAgICAgIGNvbnN0IGlubmVyUGFyYW1zID0gcHJpdmF0ZVByb3BzLmlubmVyUGFyYW1zLmdldChpbnN0YW5jZSk7CgogICAgICBpZiAoaWdub3JlT3V0c2lkZUNsaWNrKSB7CiAgICAgICAgaWdub3JlT3V0c2lkZUNsaWNrID0gZmFsc2U7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBpZiAoZS50YXJnZXQgPT09IGRvbUNhY2hlLmNvbnRhaW5lciAmJiBjYWxsSWZGdW5jdGlvbihpbm5lclBhcmFtcy5hbGxvd091dHNpZGVDbGljaykpIHsKICAgICAgICBkaXNtaXNzV2l0aChEaXNtaXNzUmVhc29uLmJhY2tkcm9wKTsKICAgICAgfQogICAgfTsKICB9OwoKICBjb25zdCBpc0pxdWVyeUVsZW1lbnQgPSBlbGVtID0+IHR5cGVvZiBlbGVtID09PSAnb2JqZWN0JyAmJiBlbGVtLmpxdWVyeTsKCiAgY29uc3QgaXNFbGVtZW50ID0gZWxlbSA9PiBlbGVtIGluc3RhbmNlb2YgRWxlbWVudCB8fCBpc0pxdWVyeUVsZW1lbnQoZWxlbSk7CgogIGNvbnN0IGFyZ3NUb1BhcmFtcyA9IGFyZ3MgPT4gewogICAgY29uc3QgcGFyYW1zID0ge307CgogICAgaWYgKHR5cGVvZiBhcmdzWzBdID09PSAnb2JqZWN0JyAmJiAhaXNFbGVtZW50KGFyZ3NbMF0pKSB7CiAgICAgIE9iamVjdC5hc3NpZ24ocGFyYW1zLCBhcmdzWzBdKTsKICAgIH0gZWxzZSB7CiAgICAgIFsndGl0bGUnLCAnaHRtbCcsICdpY29uJ10uZm9yRWFjaCgobmFtZSwgaW5kZXgpID0+IHsKICAgICAgICBjb25zdCBhcmcgPSBhcmdzW2luZGV4XTsKCiAgICAgICAgaWYgKHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnIHx8IGlzRWxlbWVudChhcmcpKSB7CiAgICAgICAgICBwYXJhbXNbbmFtZV0gPSBhcmc7CiAgICAgICAgfSBlbHNlIGlmIChhcmcgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgZXJyb3IoIlVuZXhwZWN0ZWQgdHlwZSBvZiAiLmNvbmNhdChuYW1lLCAiISBFeHBlY3RlZCBcInN0cmluZ1wiIG9yIFwiRWxlbWVudFwiLCBnb3QgIikuY29uY2F0KHR5cGVvZiBhcmcpKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQoKICAgIHJldHVybiBwYXJhbXM7CiAgfTsKCiAgZnVuY3Rpb24gZmlyZSgpIHsKICAgIGNvbnN0IFN3YWwgPSB0aGlzOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzCgogICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07CiAgICB9CgogICAgcmV0dXJuIG5ldyBTd2FsKC4uLmFyZ3MpOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyBhbiBleHRlbmRlZCB2ZXJzaW9uIG9mIGBTd2FsYCBjb250YWluaW5nIGBwYXJhbXNgIGFzIGRlZmF1bHRzLgogICAqIFVzZWZ1bCBmb3IgcmV1c2luZyBTd2FsIGNvbmZpZ3VyYXRpb24uCiAgICoKICAgKiBGb3IgZXhhbXBsZToKICAgKgogICAqIEJlZm9yZToKICAgKiBjb25zdCB0ZXh0UHJvbXB0T3B0aW9ucyA9IHsgaW5wdXQ6ICd0ZXh0Jywgc2hvd0NhbmNlbEJ1dHRvbjogdHJ1ZSB9CiAgICogY29uc3Qge3ZhbHVlOiBmaXJzdE5hbWV9ID0gYXdhaXQgU3dhbC5maXJlKHsgLi4udGV4dFByb21wdE9wdGlvbnMsIHRpdGxlOiAnV2hhdCBpcyB5b3VyIGZpcnN0IG5hbWU/JyB9KQogICAqIGNvbnN0IHt2YWx1ZTogbGFzdE5hbWV9ID0gYXdhaXQgU3dhbC5maXJlKHsgLi4udGV4dFByb21wdE9wdGlvbnMsIHRpdGxlOiAnV2hhdCBpcyB5b3VyIGxhc3QgbmFtZT8nIH0pCiAgICoKICAgKiBBZnRlcjoKICAgKiBjb25zdCBUZXh0UHJvbXB0ID0gU3dhbC5taXhpbih7IGlucHV0OiAndGV4dCcsIHNob3dDYW5jZWxCdXR0b246IHRydWUgfSkKICAgKiBjb25zdCB7dmFsdWU6IGZpcnN0TmFtZX0gPSBhd2FpdCBUZXh0UHJvbXB0KCdXaGF0IGlzIHlvdXIgZmlyc3QgbmFtZT8nKQogICAqIGNvbnN0IHt2YWx1ZTogbGFzdE5hbWV9ID0gYXdhaXQgVGV4dFByb21wdCgnV2hhdCBpcyB5b3VyIGxhc3QgbmFtZT8nKQogICAqCiAgICogQHBhcmFtIG1peGluUGFyYW1zCiAgICovCiAgZnVuY3Rpb24gbWl4aW4obWl4aW5QYXJhbXMpIHsKICAgIGNsYXNzIE1peGluU3dhbCBleHRlbmRzIHRoaXMgewogICAgICBfbWFpbihwYXJhbXMsIHByaW9yaXR5TWl4aW5QYXJhbXMpIHsKICAgICAgICByZXR1cm4gc3VwZXIuX21haW4ocGFyYW1zLCBPYmplY3QuYXNzaWduKHt9LCBtaXhpblBhcmFtcywgcHJpb3JpdHlNaXhpblBhcmFtcykpOwogICAgICB9CgogICAgfQoKICAgIHJldHVybiBNaXhpblN3YWw7CiAgfQoKICAvKioKICAgKiBJZiBgdGltZXJgIHBhcmFtZXRlciBpcyBzZXQsIHJldHVybnMgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvZiB0aW1lciByZW1haW5lZC4KICAgKiBPdGhlcndpc2UsIHJldHVybnMgdW5kZWZpbmVkLgogICAqLwoKICBjb25zdCBnZXRUaW1lckxlZnQgPSAoKSA9PiB7CiAgICByZXR1cm4gZ2xvYmFsU3RhdGUudGltZW91dCAmJiBnbG9iYWxTdGF0ZS50aW1lb3V0LmdldFRpbWVyTGVmdCgpOwogIH07CiAgLyoqCiAgICogU3RvcCB0aW1lci4gUmV0dXJucyBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9mIHRpbWVyIHJlbWFpbmVkLgogICAqIElmIGB0aW1lcmAgcGFyYW1ldGVyIGlzbid0IHNldCwgcmV0dXJucyB1bmRlZmluZWQuCiAgICovCgogIGNvbnN0IHN0b3BUaW1lciA9ICgpID0+IHsKICAgIGlmIChnbG9iYWxTdGF0ZS50aW1lb3V0KSB7CiAgICAgIHN0b3BUaW1lclByb2dyZXNzQmFyKCk7CiAgICAgIHJldHVybiBnbG9iYWxTdGF0ZS50aW1lb3V0LnN0b3AoKTsKICAgIH0KICB9OwogIC8qKgogICAqIFJlc3VtZSB0aW1lci4gUmV0dXJucyBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9mIHRpbWVyIHJlbWFpbmVkLgogICAqIElmIGB0aW1lcmAgcGFyYW1ldGVyIGlzbid0IHNldCwgcmV0dXJucyB1bmRlZmluZWQuCiAgICovCgogIGNvbnN0IHJlc3VtZVRpbWVyID0gKCkgPT4gewogICAgaWYgKGdsb2JhbFN0YXRlLnRpbWVvdXQpIHsKICAgICAgY29uc3QgcmVtYWluaW5nID0gZ2xvYmFsU3RhdGUudGltZW91dC5zdGFydCgpOwogICAgICBhbmltYXRlVGltZXJQcm9ncmVzc0JhcihyZW1haW5pbmcpOwogICAgICByZXR1cm4gcmVtYWluaW5nOwogICAgfQogIH07CiAgLyoqCiAgICogUmVzdW1lIHRpbWVyLiBSZXR1cm5zIG51bWJlciBvZiBtaWxsaXNlY29uZHMgb2YgdGltZXIgcmVtYWluZWQuCiAgICogSWYgYHRpbWVyYCBwYXJhbWV0ZXIgaXNuJ3Qgc2V0LCByZXR1cm5zIHVuZGVmaW5lZC4KICAgKi8KCiAgY29uc3QgdG9nZ2xlVGltZXIgPSAoKSA9PiB7CiAgICBjb25zdCB0aW1lciA9IGdsb2JhbFN0YXRlLnRpbWVvdXQ7CiAgICByZXR1cm4gdGltZXIgJiYgKHRpbWVyLnJ1bm5pbmcgPyBzdG9wVGltZXIoKSA6IHJlc3VtZVRpbWVyKCkpOwogIH07CiAgLyoqCiAgICogSW5jcmVhc2UgdGltZXIuIFJldHVybnMgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvZiBhbiB1cGRhdGVkIHRpbWVyLgogICAqIElmIGB0aW1lcmAgcGFyYW1ldGVyIGlzbid0IHNldCwgcmV0dXJucyB1bmRlZmluZWQuCiAgICovCgogIGNvbnN0IGluY3JlYXNlVGltZXIgPSBuID0+IHsKICAgIGlmIChnbG9iYWxTdGF0ZS50aW1lb3V0KSB7CiAgICAgIGNvbnN0IHJlbWFpbmluZyA9IGdsb2JhbFN0YXRlLnRpbWVvdXQuaW5jcmVhc2Uobik7CiAgICAgIGFuaW1hdGVUaW1lclByb2dyZXNzQmFyKHJlbWFpbmluZywgdHJ1ZSk7CiAgICAgIHJldHVybiByZW1haW5pbmc7CiAgICB9CiAgfTsKICAvKioKICAgKiBDaGVjayBpZiB0aW1lciBpcyBydW5uaW5nLiBSZXR1cm5zIHRydWUgaWYgdGltZXIgaXMgcnVubmluZwogICAqIG9yIGZhbHNlIGlmIHRpbWVyIGlzIHBhdXNlZCBvciBzdG9wcGVkLgogICAqIElmIGB0aW1lcmAgcGFyYW1ldGVyIGlzbid0IHNldCwgcmV0dXJucyB1bmRlZmluZWQKICAgKi8KCiAgY29uc3QgaXNUaW1lclJ1bm5pbmcgPSAoKSA9PiB7CiAgICByZXR1cm4gZ2xvYmFsU3RhdGUudGltZW91dCAmJiBnbG9iYWxTdGF0ZS50aW1lb3V0LmlzUnVubmluZygpOwogIH07CgogIGxldCBib2R5Q2xpY2tMaXN0ZW5lckFkZGVkID0gZmFsc2U7CiAgY29uc3QgY2xpY2tIYW5kbGVycyA9IHt9OwogIGZ1bmN0aW9uIGJpbmRDbGlja0hhbmRsZXIoKSB7CiAgICBsZXQgYXR0ciA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJ2RhdGEtc3dhbC10ZW1wbGF0ZSc7CiAgICBjbGlja0hhbmRsZXJzW2F0dHJdID0gdGhpczsKCiAgICBpZiAoIWJvZHlDbGlja0xpc3RlbmVyQWRkZWQpIHsKICAgICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGJvZHlDbGlja0xpc3RlbmVyKTsKICAgICAgYm9keUNsaWNrTGlzdGVuZXJBZGRlZCA9IHRydWU7CiAgICB9CiAgfQoKICBjb25zdCBib2R5Q2xpY2tMaXN0ZW5lciA9IGV2ZW50ID0+IHsKICAgIGZvciAobGV0IGVsID0gZXZlbnQudGFyZ2V0OyBlbCAmJiBlbCAhPT0gZG9jdW1lbnQ7IGVsID0gZWwucGFyZW50Tm9kZSkgewogICAgICBmb3IgKGNvbnN0IGF0dHIgaW4gY2xpY2tIYW5kbGVycykgewogICAgICAgIGNvbnN0IHRlbXBsYXRlID0gZWwuZ2V0QXR0cmlidXRlKGF0dHIpOwoKICAgICAgICBpZiAodGVtcGxhdGUpIHsKICAgICAgICAgIGNsaWNrSGFuZGxlcnNbYXR0cl0uZmlyZSh7CiAgICAgICAgICAgIHRlbXBsYXRlCiAgICAgICAgICB9KTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9OwoKCgogIHZhciBzdGF0aWNNZXRob2RzID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoewogICAgaXNWYWxpZFBhcmFtZXRlcjogaXNWYWxpZFBhcmFtZXRlciwKICAgIGlzVXBkYXRhYmxlUGFyYW1ldGVyOiBpc1VwZGF0YWJsZVBhcmFtZXRlciwKICAgIGlzRGVwcmVjYXRlZFBhcmFtZXRlcjogaXNEZXByZWNhdGVkUGFyYW1ldGVyLAogICAgYXJnc1RvUGFyYW1zOiBhcmdzVG9QYXJhbXMsCiAgICBpc1Zpc2libGU6IGlzVmlzaWJsZSQxLAogICAgY2xpY2tDb25maXJtOiBjbGlja0NvbmZpcm0sCiAgICBjbGlja0Rlbnk6IGNsaWNrRGVueSwKICAgIGNsaWNrQ2FuY2VsOiBjbGlja0NhbmNlbCwKICAgIGdldENvbnRhaW5lcjogZ2V0Q29udGFpbmVyLAogICAgZ2V0UG9wdXA6IGdldFBvcHVwLAogICAgZ2V0VGl0bGU6IGdldFRpdGxlLAogICAgZ2V0SHRtbENvbnRhaW5lcjogZ2V0SHRtbENvbnRhaW5lciwKICAgIGdldEltYWdlOiBnZXRJbWFnZSwKICAgIGdldEljb246IGdldEljb24sCiAgICBnZXRJbnB1dExhYmVsOiBnZXRJbnB1dExhYmVsLAogICAgZ2V0Q2xvc2VCdXR0b246IGdldENsb3NlQnV0dG9uLAogICAgZ2V0QWN0aW9uczogZ2V0QWN0aW9ucywKICAgIGdldENvbmZpcm1CdXR0b246IGdldENvbmZpcm1CdXR0b24sCiAgICBnZXREZW55QnV0dG9uOiBnZXREZW55QnV0dG9uLAogICAgZ2V0Q2FuY2VsQnV0dG9uOiBnZXRDYW5jZWxCdXR0b24sCiAgICBnZXRMb2FkZXI6IGdldExvYWRlciwKICAgIGdldEZvb3RlcjogZ2V0Rm9vdGVyLAogICAgZ2V0VGltZXJQcm9ncmVzc0JhcjogZ2V0VGltZXJQcm9ncmVzc0JhciwKICAgIGdldEZvY3VzYWJsZUVsZW1lbnRzOiBnZXRGb2N1c2FibGVFbGVtZW50cywKICAgIGdldFZhbGlkYXRpb25NZXNzYWdlOiBnZXRWYWxpZGF0aW9uTWVzc2FnZSwKICAgIGlzTG9hZGluZzogaXNMb2FkaW5nLAogICAgZmlyZTogZmlyZSwKICAgIG1peGluOiBtaXhpbiwKICAgIHNob3dMb2FkaW5nOiBzaG93TG9hZGluZywKICAgIGVuYWJsZUxvYWRpbmc6IHNob3dMb2FkaW5nLAogICAgZ2V0VGltZXJMZWZ0OiBnZXRUaW1lckxlZnQsCiAgICBzdG9wVGltZXI6IHN0b3BUaW1lciwKICAgIHJlc3VtZVRpbWVyOiByZXN1bWVUaW1lciwKICAgIHRvZ2dsZVRpbWVyOiB0b2dnbGVUaW1lciwKICAgIGluY3JlYXNlVGltZXI6IGluY3JlYXNlVGltZXIsCiAgICBpc1RpbWVyUnVubmluZzogaXNUaW1lclJ1bm5pbmcsCiAgICBiaW5kQ2xpY2tIYW5kbGVyOiBiaW5kQ2xpY2tIYW5kbGVyCiAgfSk7CgogIGxldCBjdXJyZW50SW5zdGFuY2U7CgogIGNsYXNzIFN3ZWV0QWxlcnQgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIC8vIFByZXZlbnQgcnVuIGluIE5vZGUgZW52CiAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykgewogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgY3VycmVudEluc3RhbmNlID0gdGhpczsgLy8gQHRzLWlnbm9yZQoKICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CiAgICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTsKICAgICAgfQoKICAgICAgY29uc3Qgb3V0ZXJQYXJhbXMgPSBPYmplY3QuZnJlZXplKHRoaXMuY29uc3RydWN0b3IuYXJnc1RvUGFyYW1zKGFyZ3MpKTsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcywgewogICAgICAgIHBhcmFtczogewogICAgICAgICAgdmFsdWU6IG91dGVyUGFyYW1zLAogICAgICAgICAgd3JpdGFibGU6IGZhbHNlLAogICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgICAgIH0KICAgICAgfSk7IC8vIEB0cy1pZ25vcmUKCiAgICAgIGNvbnN0IHByb21pc2UgPSBjdXJyZW50SW5zdGFuY2UuX21haW4oY3VycmVudEluc3RhbmNlLnBhcmFtcyk7CgogICAgICBwcml2YXRlUHJvcHMucHJvbWlzZS5zZXQodGhpcywgcHJvbWlzZSk7CiAgICB9CgogICAgX21haW4odXNlclBhcmFtcykgewogICAgICBsZXQgbWl4aW5QYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9OwogICAgICBzaG93V2FybmluZ3NGb3JQYXJhbXMoT2JqZWN0LmFzc2lnbih7fSwgbWl4aW5QYXJhbXMsIHVzZXJQYXJhbXMpKTsKCiAgICAgIGlmIChnbG9iYWxTdGF0ZS5jdXJyZW50SW5zdGFuY2UpIHsKICAgICAgICAvLyBAdHMtaWdub3JlCiAgICAgICAgZ2xvYmFsU3RhdGUuY3VycmVudEluc3RhbmNlLl9kZXN0cm95KCk7CgogICAgICAgIGlmIChpc01vZGFsKCkpIHsKICAgICAgICAgIHVuc2V0QXJpYUhpZGRlbigpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZ2xvYmFsU3RhdGUuY3VycmVudEluc3RhbmNlID0gY3VycmVudEluc3RhbmNlOwogICAgICBjb25zdCBpbm5lclBhcmFtcyA9IHByZXBhcmVQYXJhbXModXNlclBhcmFtcywgbWl4aW5QYXJhbXMpOwogICAgICBzZXRQYXJhbWV0ZXJzKGlubmVyUGFyYW1zKTsKICAgICAgT2JqZWN0LmZyZWV6ZShpbm5lclBhcmFtcyk7IC8vIGNsZWFyIHRoZSBwcmV2aW91cyB0aW1lcgoKICAgICAgaWYgKGdsb2JhbFN0YXRlLnRpbWVvdXQpIHsKICAgICAgICBnbG9iYWxTdGF0ZS50aW1lb3V0LnN0b3AoKTsKICAgICAgICBkZWxldGUgZ2xvYmFsU3RhdGUudGltZW91dDsKICAgICAgfSAvLyBjbGVhciB0aGUgcmVzdG9yZSBmb2N1cyB0aW1lb3V0CgoKICAgICAgY2xlYXJUaW1lb3V0KGdsb2JhbFN0YXRlLnJlc3RvcmVGb2N1c1RpbWVvdXQpOwogICAgICBjb25zdCBkb21DYWNoZSA9IHBvcHVsYXRlRG9tQ2FjaGUoY3VycmVudEluc3RhbmNlKTsKICAgICAgcmVuZGVyKGN1cnJlbnRJbnN0YW5jZSwgaW5uZXJQYXJhbXMpOwogICAgICBwcml2YXRlUHJvcHMuaW5uZXJQYXJhbXMuc2V0KGN1cnJlbnRJbnN0YW5jZSwgaW5uZXJQYXJhbXMpOwogICAgICByZXR1cm4gc3dhbFByb21pc2UoY3VycmVudEluc3RhbmNlLCBkb21DYWNoZSwgaW5uZXJQYXJhbXMpOwogICAgfSAvLyBgY2F0Y2hgIGNhbm5vdCBiZSB0aGUgbmFtZSBvZiBhIG1vZHVsZSBleHBvcnQsIHNvIHdlIGRlZmluZSBvdXIgdGhlbmFibGUgbWV0aG9kcyBoZXJlIGluc3RlYWQKCgogICAgdGhlbihvbkZ1bGZpbGxlZCkgewogICAgICBjb25zdCBwcm9taXNlID0gcHJpdmF0ZVByb3BzLnByb21pc2UuZ2V0KHRoaXMpOwogICAgICByZXR1cm4gcHJvbWlzZS50aGVuKG9uRnVsZmlsbGVkKTsKICAgIH0KCiAgICBmaW5hbGx5KG9uRmluYWxseSkgewogICAgICBjb25zdCBwcm9taXNlID0gcHJpdmF0ZVByb3BzLnByb21pc2UuZ2V0KHRoaXMpOwogICAgICByZXR1cm4gcHJvbWlzZS5maW5hbGx5KG9uRmluYWxseSk7CiAgICB9CgogIH0KCiAgY29uc3Qgc3dhbFByb21pc2UgPSAoaW5zdGFuY2UsIGRvbUNhY2hlLCBpbm5lclBhcmFtcykgPT4gewogICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgLy8gZnVuY3Rpb25zIHRvIGhhbmRsZSBhbGwgY2xvc2luZ3MvZGlzbWlzc2FscwogICAgICBjb25zdCBkaXNtaXNzV2l0aCA9IGRpc21pc3MgPT4gewogICAgICAgIGluc3RhbmNlLmNsb3NlUG9wdXAoewogICAgICAgICAgaXNEaXNtaXNzZWQ6IHRydWUsCiAgICAgICAgICBkaXNtaXNzCiAgICAgICAgfSk7CiAgICAgIH07CgogICAgICBwcml2YXRlTWV0aG9kcy5zd2FsUHJvbWlzZVJlc29sdmUuc2V0KGluc3RhbmNlLCByZXNvbHZlKTsKICAgICAgcHJpdmF0ZU1ldGhvZHMuc3dhbFByb21pc2VSZWplY3Quc2V0KGluc3RhbmNlLCByZWplY3QpOwoKICAgICAgZG9tQ2FjaGUuY29uZmlybUJ1dHRvbi5vbmNsaWNrID0gKCkgPT4gaGFuZGxlQ29uZmlybUJ1dHRvbkNsaWNrKGluc3RhbmNlKTsKCiAgICAgIGRvbUNhY2hlLmRlbnlCdXR0b24ub25jbGljayA9ICgpID0+IGhhbmRsZURlbnlCdXR0b25DbGljayhpbnN0YW5jZSk7CgogICAgICBkb21DYWNoZS5jYW5jZWxCdXR0b24ub25jbGljayA9ICgpID0+IGhhbmRsZUNhbmNlbEJ1dHRvbkNsaWNrKGluc3RhbmNlLCBkaXNtaXNzV2l0aCk7CgogICAgICBkb21DYWNoZS5jbG9zZUJ1dHRvbi5vbmNsaWNrID0gKCkgPT4gZGlzbWlzc1dpdGgoRGlzbWlzc1JlYXNvbi5jbG9zZSk7CgogICAgICBoYW5kbGVQb3B1cENsaWNrKGluc3RhbmNlLCBkb21DYWNoZSwgZGlzbWlzc1dpdGgpOwogICAgICBhZGRLZXlkb3duSGFuZGxlcihpbnN0YW5jZSwgZ2xvYmFsU3RhdGUsIGlubmVyUGFyYW1zLCBkaXNtaXNzV2l0aCk7CiAgICAgIGhhbmRsZUlucHV0T3B0aW9uc0FuZFZhbHVlKGluc3RhbmNlLCBpbm5lclBhcmFtcyk7CiAgICAgIG9wZW5Qb3B1cChpbm5lclBhcmFtcyk7CiAgICAgIHNldHVwVGltZXIoZ2xvYmFsU3RhdGUsIGlubmVyUGFyYW1zLCBkaXNtaXNzV2l0aCk7CiAgICAgIGluaXRGb2N1cyhkb21DYWNoZSwgaW5uZXJQYXJhbXMpOyAvLyBTY3JvbGwgY29udGFpbmVyIHRvIHRvcCBvbiBvcGVuICgjMTI0NywgIzE5NDYpCgogICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICBkb21DYWNoZS5jb250YWluZXIuc2Nyb2xsVG9wID0gMDsKICAgICAgfSk7CiAgICB9KTsKICB9OwoKICBjb25zdCBwcmVwYXJlUGFyYW1zID0gKHVzZXJQYXJhbXMsIG1peGluUGFyYW1zKSA9PiB7CiAgICBjb25zdCB0ZW1wbGF0ZVBhcmFtcyA9IGdldFRlbXBsYXRlUGFyYW1zKHVzZXJQYXJhbXMpOwogICAgY29uc3QgcGFyYW1zID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFBhcmFtcywgbWl4aW5QYXJhbXMsIHRlbXBsYXRlUGFyYW1zLCB1c2VyUGFyYW1zKTsgLy8gcHJlY2VkZW5jZSBpcyBkZXNjcmliZWQgaW4gIzIxMzEKCiAgICBwYXJhbXMuc2hvd0NsYXNzID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFBhcmFtcy5zaG93Q2xhc3MsIHBhcmFtcy5zaG93Q2xhc3MpOwogICAgcGFyYW1zLmhpZGVDbGFzcyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRQYXJhbXMuaGlkZUNsYXNzLCBwYXJhbXMuaGlkZUNsYXNzKTsKICAgIHJldHVybiBwYXJhbXM7CiAgfTsKICAvKioKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnQyfSBpbnN0YW5jZQogICAqIEByZXR1cm5zIHtEb21DYWNoZX0KICAgKi8KCgogIGNvbnN0IHBvcHVsYXRlRG9tQ2FjaGUgPSBpbnN0YW5jZSA9PiB7CiAgICBjb25zdCBkb21DYWNoZSA9IHsKICAgICAgcG9wdXA6IGdldFBvcHVwKCksCiAgICAgIGNvbnRhaW5lcjogZ2V0Q29udGFpbmVyKCksCiAgICAgIGFjdGlvbnM6IGdldEFjdGlvbnMoKSwKICAgICAgY29uZmlybUJ1dHRvbjogZ2V0Q29uZmlybUJ1dHRvbigpLAogICAgICBkZW55QnV0dG9uOiBnZXREZW55QnV0dG9uKCksCiAgICAgIGNhbmNlbEJ1dHRvbjogZ2V0Q2FuY2VsQnV0dG9uKCksCiAgICAgIGxvYWRlcjogZ2V0TG9hZGVyKCksCiAgICAgIGNsb3NlQnV0dG9uOiBnZXRDbG9zZUJ1dHRvbigpLAogICAgICB2YWxpZGF0aW9uTWVzc2FnZTogZ2V0VmFsaWRhdGlvbk1lc3NhZ2UoKSwKICAgICAgcHJvZ3Jlc3NTdGVwczogZ2V0UHJvZ3Jlc3NTdGVwcygpCiAgICB9OwogICAgcHJpdmF0ZVByb3BzLmRvbUNhY2hlLnNldChpbnN0YW5jZSwgZG9tQ2FjaGUpOwogICAgcmV0dXJuIGRvbUNhY2hlOwogIH07CiAgLyoqCiAgICogQHBhcmFtIHtHbG9iYWxTdGF0ZX0gZ2xvYmFsU3RhdGUKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnRPcHRpb25zfSBpbm5lclBhcmFtcwogICAqIEBwYXJhbSB7ZnVuY3Rpb259IGRpc21pc3NXaXRoCiAgICovCgoKICBjb25zdCBzZXR1cFRpbWVyID0gKGdsb2JhbFN0YXRlJCQxLCBpbm5lclBhcmFtcywgZGlzbWlzc1dpdGgpID0+IHsKICAgIGNvbnN0IHRpbWVyUHJvZ3Jlc3NCYXIgPSBnZXRUaW1lclByb2dyZXNzQmFyKCk7CiAgICBoaWRlKHRpbWVyUHJvZ3Jlc3NCYXIpOwoKICAgIGlmIChpbm5lclBhcmFtcy50aW1lcikgewogICAgICBnbG9iYWxTdGF0ZSQkMS50aW1lb3V0ID0gbmV3IFRpbWVyKCgpID0+IHsKICAgICAgICBkaXNtaXNzV2l0aCgndGltZXInKTsKICAgICAgICBkZWxldGUgZ2xvYmFsU3RhdGUkJDEudGltZW91dDsKICAgICAgfSwgaW5uZXJQYXJhbXMudGltZXIpOwoKICAgICAgaWYgKGlubmVyUGFyYW1zLnRpbWVyUHJvZ3Jlc3NCYXIpIHsKICAgICAgICBzaG93KHRpbWVyUHJvZ3Jlc3NCYXIpOwogICAgICAgIGFwcGx5Q3VzdG9tQ2xhc3ModGltZXJQcm9ncmVzc0JhciwgaW5uZXJQYXJhbXMsICd0aW1lclByb2dyZXNzQmFyJyk7CiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICBpZiAoZ2xvYmFsU3RhdGUkJDEudGltZW91dCAmJiBnbG9iYWxTdGF0ZSQkMS50aW1lb3V0LnJ1bm5pbmcpIHsKICAgICAgICAgICAgLy8gdGltZXIgY2FuIGJlIGFscmVhZHkgc3RvcHBlZCBvciB1bnNldCBhdCB0aGlzIHBvaW50CiAgICAgICAgICAgIGFuaW1hdGVUaW1lclByb2dyZXNzQmFyKGlubmVyUGFyYW1zLnRpbWVyKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgfQogIH07CiAgLyoqCiAgICogQHBhcmFtIHtEb21DYWNoZX0gZG9tQ2FjaGUKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnRPcHRpb25zfSBpbm5lclBhcmFtcwogICAqLwoKCiAgY29uc3QgaW5pdEZvY3VzID0gKGRvbUNhY2hlLCBpbm5lclBhcmFtcykgPT4gewogICAgaWYgKGlubmVyUGFyYW1zLnRvYXN0KSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoIWNhbGxJZkZ1bmN0aW9uKGlubmVyUGFyYW1zLmFsbG93RW50ZXJLZXkpKSB7CiAgICAgIHJldHVybiBibHVyQWN0aXZlRWxlbWVudCgpOwogICAgfQoKICAgIGlmICghZm9jdXNCdXR0b24oZG9tQ2FjaGUsIGlubmVyUGFyYW1zKSkgewogICAgICBzZXRGb2N1cyhpbm5lclBhcmFtcywgLTEsIDEpOwogICAgfQogIH07CiAgLyoqCiAgICogQHBhcmFtIHtEb21DYWNoZX0gZG9tQ2FjaGUKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnRPcHRpb25zfSBpbm5lclBhcmFtcwogICAqIEByZXR1cm5zIHtib29sZWFufQogICAqLwoKCiAgY29uc3QgZm9jdXNCdXR0b24gPSAoZG9tQ2FjaGUsIGlubmVyUGFyYW1zKSA9PiB7CiAgICBpZiAoaW5uZXJQYXJhbXMuZm9jdXNEZW55ICYmIGlzVmlzaWJsZShkb21DYWNoZS5kZW55QnV0dG9uKSkgewogICAgICBkb21DYWNoZS5kZW55QnV0dG9uLmZvY3VzKCk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIGlmIChpbm5lclBhcmFtcy5mb2N1c0NhbmNlbCAmJiBpc1Zpc2libGUoZG9tQ2FjaGUuY2FuY2VsQnV0dG9uKSkgewogICAgICBkb21DYWNoZS5jYW5jZWxCdXR0b24uZm9jdXMoKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgaWYgKGlubmVyUGFyYW1zLmZvY3VzQ29uZmlybSAmJiBpc1Zpc2libGUoZG9tQ2FjaGUuY29uZmlybUJ1dHRvbikpIHsKICAgICAgZG9tQ2FjaGUuY29uZmlybUJ1dHRvbi5mb2N1cygpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICByZXR1cm4gZmFsc2U7CiAgfTsKCiAgY29uc3QgYmx1ckFjdGl2ZUVsZW1lbnQgPSAoKSA9PiB7CiAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHR5cGVvZiBkb2N1bWVudC5hY3RpdmVFbGVtZW50LmJsdXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5ibHVyKCk7CiAgICB9CiAgfTsgLy8gQXNzaWduIGluc3RhbmNlIG1ldGhvZHMgZnJvbSBzcmMvaW5zdGFuY2VNZXRob2RzLyouanMgdG8gcHJvdG90eXBlCgoKICBPYmplY3QuYXNzaWduKFN3ZWV0QWxlcnQucHJvdG90eXBlLCBpbnN0YW5jZU1ldGhvZHMpOyAvLyBBc3NpZ24gc3RhdGljIG1ldGhvZHMgZnJvbSBzcmMvc3RhdGljTWV0aG9kcy8qLmpzIHRvIGNvbnN0cnVjdG9yCgogIE9iamVjdC5hc3NpZ24oU3dlZXRBbGVydCwgc3RhdGljTWV0aG9kcyk7IC8vIFByb3h5IHRvIGluc3RhbmNlIG1ldGhvZHMgdG8gY29uc3RydWN0b3IsIGZvciBub3csIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQoKICBPYmplY3Qua2V5cyhpbnN0YW5jZU1ldGhvZHMpLmZvckVhY2goa2V5ID0+IHsKICAgIFN3ZWV0QWxlcnRba2V5XSA9IGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKGN1cnJlbnRJbnN0YW5jZSkgewogICAgICAgIHJldHVybiBjdXJyZW50SW5zdGFuY2Vba2V5XSguLi5hcmd1bWVudHMpOwogICAgICB9CiAgICB9OwogIH0pOwogIFN3ZWV0QWxlcnQuRGlzbWlzc1JlYXNvbiA9IERpc21pc3NSZWFzb247CiAgU3dlZXRBbGVydC52ZXJzaW9uID0gJzExLjQuMTYnOwoKICBjb25zdCBTd2FsID0gU3dlZXRBbGVydDsgLy8gQHRzLWlnbm9yZQoKICBTd2FsLmRlZmF1bHQgPSBTd2FsOwoKICByZXR1cm4gU3dhbDsKCn0pKTsKaWYgKHR5cGVvZiB0aGlzICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLlN3ZWV0YWxlcnQyKXsgIHRoaXMuc3dhbCA9IHRoaXMuc3dlZXRBbGVydCA9IHRoaXMuU3dhbCA9IHRoaXMuU3dlZXRBbGVydCA9IHRoaXMuU3dlZXRhbGVydDJ9CgoidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50JiZmdW5jdGlvbihlLHQpe3ZhciBuPWUuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtpZihlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0uYXBwZW5kQ2hpbGQobiksbi5zdHlsZVNoZWV0KW4uc3R5bGVTaGVldC5kaXNhYmxlZHx8KG4uc3R5bGVTaGVldC5jc3NUZXh0PXQpO2Vsc2UgdHJ5e24uaW5uZXJIVE1MPXR9Y2F0Y2goZSl7bi5pbm5lclRleHQ9dH19KGRvY3VtZW50LCIuc3dhbDItcG9wdXAuc3dhbDItdG9hc3R7Ym94LXNpemluZzpib3JkZXItYm94O2dyaWQtY29sdW1uOjEvNCFpbXBvcnRhbnQ7Z3JpZC1yb3c6MS80IWltcG9ydGFudDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6MWZyIDk5ZnIgMWZyO3BhZGRpbmc6MWVtO292ZXJmbG93LXk6aGlkZGVuO2JhY2tncm91bmQ6I2ZmZjtib3gtc2hhZG93OjAgMCAxcHggaHNsYSgwZGVnLDAlLDAlLC4wNzUpLDAgMXB4IDJweCBoc2xhKDBkZWcsMCUsMCUsLjA3NSksMXB4IDJweCA0cHggaHNsYSgwZGVnLDAlLDAlLC4wNzUpLDFweCAzcHggOHB4IGhzbGEoMGRlZywwJSwwJSwuMDc1KSwycHggNHB4IDE2cHggaHNsYSgwZGVnLDAlLDAlLC4wNzUpO3BvaW50ZXItZXZlbnRzOmFsbH0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3Q+KntncmlkLWNvbHVtbjoyfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItdGl0bGV7bWFyZ2luOi41ZW0gMWVtO3BhZGRpbmc6MDtmb250LXNpemU6MWVtO3RleHQtYWxpZ246aW5pdGlhbH0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWxvYWRpbmd7anVzdGlmeS1jb250ZW50OmNlbnRlcn0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWlucHV0e2hlaWdodDoyZW07bWFyZ2luOi41ZW07Zm9udC1zaXplOjFlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXZhbGlkYXRpb24tbWVzc2FnZXtmb250LXNpemU6MWVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItZm9vdGVye21hcmdpbjouNWVtIDAgMDtwYWRkaW5nOi41ZW0gMCAwO2ZvbnQtc2l6ZTouOGVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItY2xvc2V7Z3JpZC1jb2x1bW46My8zO2dyaWQtcm93OjEvOTk7YWxpZ24tc2VsZjpjZW50ZXI7d2lkdGg6LjhlbTtoZWlnaHQ6LjhlbTttYXJnaW46MDtmb250LXNpemU6MmVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItaHRtbC1jb250YWluZXJ7bWFyZ2luOi41ZW0gMWVtO3BhZGRpbmc6MDtmb250LXNpemU6MWVtO3RleHQtYWxpZ246aW5pdGlhbH0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWh0bWwtY29udGFpbmVyOmVtcHR5e3BhZGRpbmc6MH0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWxvYWRlcntncmlkLWNvbHVtbjoxO2dyaWQtcm93OjEvOTk7YWxpZ24tc2VsZjpjZW50ZXI7d2lkdGg6MmVtO2hlaWdodDoyZW07bWFyZ2luOi4yNWVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItaWNvbntncmlkLWNvbHVtbjoxO2dyaWQtcm93OjEvOTk7YWxpZ24tc2VsZjpjZW50ZXI7d2lkdGg6MmVtO21pbi13aWR0aDoyZW07aGVpZ2h0OjJlbTttYXJnaW46MCAuNWVtIDAgMH0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWljb24gLnN3YWwyLWljb24tY29udGVudHtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2ZvbnQtc2l6ZToxLjhlbTtmb250LXdlaWdodDo3MDB9LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1pY29uLnN3YWwyLXN1Y2Nlc3MgLnN3YWwyLXN1Y2Nlc3MtcmluZ3t3aWR0aDoyZW07aGVpZ2h0OjJlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWljb24uc3dhbDItZXJyb3IgW2NsYXNzXj1zd2FsMi14LW1hcmstbGluZV17dG9wOi44NzVlbTt3aWR0aDoxLjM3NWVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItaWNvbi5zd2FsMi1lcnJvciBbY2xhc3NePXN3YWwyLXgtbWFyay1saW5lXVtjbGFzcyQ9bGVmdF17bGVmdDouMzEyNWVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItaWNvbi5zd2FsMi1lcnJvciBbY2xhc3NePXN3YWwyLXgtbWFyay1saW5lXVtjbGFzcyQ9cmlnaHRde3JpZ2h0Oi4zMTI1ZW19LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1hY3Rpb25ze2p1c3RpZnktY29udGVudDpmbGV4LXN0YXJ0O2hlaWdodDphdXRvO21hcmdpbjowO21hcmdpbi10b3A6LjVlbTtwYWRkaW5nOjAgLjVlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN0eWxlZHttYXJnaW46LjI1ZW0gLjVlbTtwYWRkaW5nOi40ZW0gLjZlbTtmb250LXNpemU6MWVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2Vzc3tib3JkZXItY29sb3I6I2E1ZGM4Nn0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj1zd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmVde3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjEuNmVtO2hlaWdodDozZW07dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyk7Ym9yZGVyLXJhZGl1czo1MCV9LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1jaXJjdWxhci1saW5lXVtjbGFzcyQ9bGVmdF17dG9wOi0uOGVtO2xlZnQ6LS41ZW07dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpO3RyYW5zZm9ybS1vcmlnaW46MmVtIDJlbTtib3JkZXItcmFkaXVzOjRlbSAwIDAgNGVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2VzcyBbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtY2lyY3VsYXItbGluZV1bY2xhc3MkPXJpZ2h0XXt0b3A6LS4yNWVtO2xlZnQ6LjkzNzVlbTt0cmFuc2Zvcm0tb3JpZ2luOjAgMS41ZW07Ym9yZGVyLXJhZGl1czowIDRlbSA0ZW0gMH0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3MgLnN3YWwyLXN1Y2Nlc3MtcmluZ3t3aWR0aDoyZW07aGVpZ2h0OjJlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3MgLnN3YWwyLXN1Y2Nlc3MtZml4e3RvcDowO2xlZnQ6LjQzNzVlbTt3aWR0aDouNDM3NWVtO2hlaWdodDoyLjY4NzVlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj1zd2FsMi1zdWNjZXNzLWxpbmVde2hlaWdodDouMzEyNWVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2VzcyBbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtbGluZV1bY2xhc3MkPXRpcF17dG9wOjEuMTI1ZW07bGVmdDouMTg3NWVtO3dpZHRoOi43NWVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2VzcyBbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtbGluZV1bY2xhc3MkPWxvbmdde3RvcDouOTM3NWVtO3JpZ2h0Oi4xODc1ZW07d2lkdGg6MS4zNzVlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3Muc3dhbDItaWNvbi1zaG93IC5zd2FsMi1zdWNjZXNzLWxpbmUtdGlwey13ZWJraXQtYW5pbWF0aW9uOnN3YWwyLXRvYXN0LWFuaW1hdGUtc3VjY2Vzcy1saW5lLXRpcCAuNzVzO2FuaW1hdGlvbjpzd2FsMi10b2FzdC1hbmltYXRlLXN1Y2Nlc3MtbGluZS10aXAgLjc1c30uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3Muc3dhbDItaWNvbi1zaG93IC5zd2FsMi1zdWNjZXNzLWxpbmUtbG9uZ3std2Via2l0LWFuaW1hdGlvbjpzd2FsMi10b2FzdC1hbmltYXRlLXN1Y2Nlc3MtbGluZS1sb25nIC43NXM7YW5pbWF0aW9uOnN3YWwyLXRvYXN0LWFuaW1hdGUtc3VjY2Vzcy1saW5lLWxvbmcgLjc1c30uc3dhbDItcG9wdXAuc3dhbDItdG9hc3Quc3dhbDItc2hvd3std2Via2l0LWFuaW1hdGlvbjpzd2FsMi10b2FzdC1zaG93IC41czthbmltYXRpb246c3dhbDItdG9hc3Qtc2hvdyAuNXN9LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0LnN3YWwyLWhpZGV7LXdlYmtpdC1hbmltYXRpb246c3dhbDItdG9hc3QtaGlkZSAuMXMgZm9yd2FyZHM7YW5pbWF0aW9uOnN3YWwyLXRvYXN0LWhpZGUgLjFzIGZvcndhcmRzfS5zd2FsMi1jb250YWluZXJ7ZGlzcGxheTpncmlkO3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTA2MDt0b3A6MDtyaWdodDowO2JvdHRvbTowO2xlZnQ6MDtib3gtc2l6aW5nOmJvcmRlci1ib3g7Z3JpZC10ZW1wbGF0ZS1hcmVhczpcInRvcC1zdGFydCAgICAgdG9wICAgICAgICAgICAgdG9wLWVuZFwiIFwiY2VudGVyLXN0YXJ0ICBjZW50ZXIgICAgICAgICBjZW50ZXItZW5kXCIgXCJib3R0b20tc3RhcnQgIGJvdHRvbS1jZW50ZXIgIGJvdHRvbS1lbmRcIjtncmlkLXRlbXBsYXRlLXJvd3M6bWlubWF4KC13ZWJraXQtbWluLWNvbnRlbnQsYXV0bykgbWlubWF4KC13ZWJraXQtbWluLWNvbnRlbnQsYXV0bykgbWlubWF4KC13ZWJraXQtbWluLWNvbnRlbnQsYXV0byk7Z3JpZC10ZW1wbGF0ZS1yb3dzOm1pbm1heChtaW4tY29udGVudCxhdXRvKSBtaW5tYXgobWluLWNvbnRlbnQsYXV0bykgbWlubWF4KG1pbi1jb250ZW50LGF1dG8pO2hlaWdodDoxMDAlO3BhZGRpbmc6LjYyNWVtO292ZXJmbG93LXg6aGlkZGVuO3RyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciAuMXM7LXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6dG91Y2h9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1iYWNrZHJvcC1zaG93LC5zd2FsMi1jb250YWluZXIuc3dhbDItbm9hbmltYXRpb257YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC40KX0uc3dhbDItY29udGFpbmVyLnN3YWwyLWJhY2tkcm9wLWhpZGV7YmFja2dyb3VuZDowIDAhaW1wb3J0YW50fS5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLXN0YXJ0LC5zd2FsMi1jb250YWluZXIuc3dhbDItY2VudGVyLXN0YXJ0LC5zd2FsMi1jb250YWluZXIuc3dhbDItdG9wLXN0YXJ0e2dyaWQtdGVtcGxhdGUtY29sdW1uczptaW5tYXgoMCwxZnIpIGF1dG8gYXV0b30uc3dhbDItY29udGFpbmVyLnN3YWwyLWJvdHRvbSwuc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlciwuc3dhbDItY29udGFpbmVyLnN3YWwyLXRvcHtncmlkLXRlbXBsYXRlLWNvbHVtbnM6YXV0byBtaW5tYXgoMCwxZnIpIGF1dG99LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tZW5kLC5zd2FsMi1jb250YWluZXIuc3dhbDItY2VudGVyLWVuZCwuc3dhbDItY29udGFpbmVyLnN3YWwyLXRvcC1lbmR7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOmF1dG8gYXV0byBtaW5tYXgoMCwxZnIpfS5zd2FsMi1jb250YWluZXIuc3dhbDItdG9wLXN0YXJ0Pi5zd2FsMi1wb3B1cHthbGlnbi1zZWxmOnN0YXJ0fS5zd2FsMi1jb250YWluZXIuc3dhbDItdG9wPi5zd2FsMi1wb3B1cHtncmlkLWNvbHVtbjoyO2FsaWduLXNlbGY6c3RhcnQ7anVzdGlmeS1zZWxmOmNlbnRlcn0uc3dhbDItY29udGFpbmVyLnN3YWwyLXRvcC1lbmQ+LnN3YWwyLXBvcHVwLC5zd2FsMi1jb250YWluZXIuc3dhbDItdG9wLXJpZ2h0Pi5zd2FsMi1wb3B1cHtncmlkLWNvbHVtbjozO2FsaWduLXNlbGY6c3RhcnQ7anVzdGlmeS1zZWxmOmVuZH0uc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlci1sZWZ0Pi5zd2FsMi1wb3B1cCwuc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlci1zdGFydD4uc3dhbDItcG9wdXB7Z3JpZC1yb3c6MjthbGlnbi1zZWxmOmNlbnRlcn0uc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlcj4uc3dhbDItcG9wdXB7Z3JpZC1jb2x1bW46MjtncmlkLXJvdzoyO2FsaWduLXNlbGY6Y2VudGVyO2p1c3RpZnktc2VsZjpjZW50ZXJ9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXItZW5kPi5zd2FsMi1wb3B1cCwuc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlci1yaWdodD4uc3dhbDItcG9wdXB7Z3JpZC1jb2x1bW46MztncmlkLXJvdzoyO2FsaWduLXNlbGY6Y2VudGVyO2p1c3RpZnktc2VsZjplbmR9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tbGVmdD4uc3dhbDItcG9wdXAsLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tc3RhcnQ+LnN3YWwyLXBvcHVwe2dyaWQtY29sdW1uOjE7Z3JpZC1yb3c6MzthbGlnbi1zZWxmOmVuZH0uc3dhbDItY29udGFpbmVyLnN3YWwyLWJvdHRvbT4uc3dhbDItcG9wdXB7Z3JpZC1jb2x1bW46MjtncmlkLXJvdzozO2p1c3RpZnktc2VsZjpjZW50ZXI7YWxpZ24tc2VsZjplbmR9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tZW5kPi5zd2FsMi1wb3B1cCwuc3dhbDItY29udGFpbmVyLnN3YWwyLWJvdHRvbS1yaWdodD4uc3dhbDItcG9wdXB7Z3JpZC1jb2x1bW46MztncmlkLXJvdzozO2FsaWduLXNlbGY6ZW5kO2p1c3RpZnktc2VsZjplbmR9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ncm93LWZ1bGxzY3JlZW4+LnN3YWwyLXBvcHVwLC5zd2FsMi1jb250YWluZXIuc3dhbDItZ3Jvdy1yb3c+LnN3YWwyLXBvcHVwe2dyaWQtY29sdW1uOjEvNDt3aWR0aDoxMDAlfS5zd2FsMi1jb250YWluZXIuc3dhbDItZ3Jvdy1jb2x1bW4+LnN3YWwyLXBvcHVwLC5zd2FsMi1jb250YWluZXIuc3dhbDItZ3Jvdy1mdWxsc2NyZWVuPi5zd2FsMi1wb3B1cHtncmlkLXJvdzoxLzQ7YWxpZ24tc2VsZjpzdHJldGNofS5zd2FsMi1jb250YWluZXIuc3dhbDItbm8tdHJhbnNpdGlvbnt0cmFuc2l0aW9uOm5vbmUhaW1wb3J0YW50fS5zd2FsMi1wb3B1cHtkaXNwbGF5Om5vbmU7cG9zaXRpb246cmVsYXRpdmU7Ym94LXNpemluZzpib3JkZXItYm94O2dyaWQtdGVtcGxhdGUtY29sdW1uczptaW5tYXgoMCwxMDAlKTt3aWR0aDozMmVtO21heC13aWR0aDoxMDAlO3BhZGRpbmc6MCAwIDEuMjVlbTtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjVweDtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzU0NTQ1NDtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZToxcmVtfS5zd2FsMi1wb3B1cDpmb2N1c3tvdXRsaW5lOjB9LnN3YWwyLXBvcHVwLnN3YWwyLWxvYWRpbmd7b3ZlcmZsb3cteTpoaWRkZW59LnN3YWwyLXRpdGxle3Bvc2l0aW9uOnJlbGF0aXZlO21heC13aWR0aDoxMDAlO21hcmdpbjowO3BhZGRpbmc6LjhlbSAxZW0gMDtjb2xvcjppbmhlcml0O2ZvbnQtc2l6ZToxLjg3NWVtO2ZvbnQtd2VpZ2h0OjYwMDt0ZXh0LWFsaWduOmNlbnRlcjt0ZXh0LXRyYW5zZm9ybTpub25lO3dvcmQtd3JhcDpicmVhay13b3JkfS5zd2FsMi1hY3Rpb25ze2Rpc3BsYXk6ZmxleDt6LWluZGV4OjE7Ym94LXNpemluZzpib3JkZXItYm94O2ZsZXgtd3JhcDp3cmFwO2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3dpZHRoOmF1dG87bWFyZ2luOjEuMjVlbSBhdXRvIDA7cGFkZGluZzowfS5zd2FsMi1hY3Rpb25zOm5vdCguc3dhbDItbG9hZGluZykgLnN3YWwyLXN0eWxlZFtkaXNhYmxlZF17b3BhY2l0eTouNH0uc3dhbDItYWN0aW9uczpub3QoLnN3YWwyLWxvYWRpbmcpIC5zd2FsMi1zdHlsZWQ6aG92ZXJ7YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQocmdiYSgwLDAsMCwuMSkscmdiYSgwLDAsMCwuMSkpfS5zd2FsMi1hY3Rpb25zOm5vdCguc3dhbDItbG9hZGluZykgLnN3YWwyLXN0eWxlZDphY3RpdmV7YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQocmdiYSgwLDAsMCwuMikscmdiYSgwLDAsMCwuMikpfS5zd2FsMi1sb2FkZXJ7ZGlzcGxheTpub25lO2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3dpZHRoOjIuMmVtO2hlaWdodDoyLjJlbTttYXJnaW46MCAxLjg3NWVtOy13ZWJraXQtYW5pbWF0aW9uOnN3YWwyLXJvdGF0ZS1sb2FkaW5nIDEuNXMgbGluZWFyIDBzIGluZmluaXRlIG5vcm1hbDthbmltYXRpb246c3dhbDItcm90YXRlLWxvYWRpbmcgMS41cyBsaW5lYXIgMHMgaW5maW5pdGUgbm9ybWFsO2JvcmRlci13aWR0aDouMjVlbTtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXJhZGl1czoxMDAlO2JvcmRlci1jb2xvcjojMjc3OGM0IHRyYW5zcGFyZW50ICMyNzc4YzQgdHJhbnNwYXJlbnR9LnN3YWwyLXN0eWxlZHttYXJnaW46LjMxMjVlbTtwYWRkaW5nOi42MjVlbSAxLjFlbTt0cmFuc2l0aW9uOmJveC1zaGFkb3cgLjFzO2JveC1zaGFkb3c6MCAwIDAgM3B4IHRyYW5zcGFyZW50O2ZvbnQtd2VpZ2h0OjUwMH0uc3dhbDItc3R5bGVkOm5vdChbZGlzYWJsZWRdKXtjdXJzb3I6cG9pbnRlcn0uc3dhbDItc3R5bGVkLnN3YWwyLWNvbmZpcm17Ym9yZGVyOjA7Ym9yZGVyLXJhZGl1czouMjVlbTtiYWNrZ3JvdW5kOmluaXRpYWw7YmFja2dyb3VuZC1jb2xvcjojNzA2NmUwO2NvbG9yOiNmZmY7Zm9udC1zaXplOjFlbX0uc3dhbDItc3R5bGVkLnN3YWwyLWNvbmZpcm06Zm9jdXN7Ym94LXNoYWRvdzowIDAgMCAzcHggcmdiYSgxMTIsMTAyLDIyNCwuNSl9LnN3YWwyLXN0eWxlZC5zd2FsMi1kZW55e2JvcmRlcjowO2JvcmRlci1yYWRpdXM6LjI1ZW07YmFja2dyb3VuZDppbml0aWFsO2JhY2tncm91bmQtY29sb3I6I2RjMzc0MTtjb2xvcjojZmZmO2ZvbnQtc2l6ZToxZW19LnN3YWwyLXN0eWxlZC5zd2FsMi1kZW55OmZvY3Vze2JveC1zaGFkb3c6MCAwIDAgM3B4IHJnYmEoMjIwLDU1LDY1LC41KX0uc3dhbDItc3R5bGVkLnN3YWwyLWNhbmNlbHtib3JkZXI6MDtib3JkZXItcmFkaXVzOi4yNWVtO2JhY2tncm91bmQ6aW5pdGlhbDtiYWNrZ3JvdW5kLWNvbG9yOiM2ZTc4ODE7Y29sb3I6I2ZmZjtmb250LXNpemU6MWVtfS5zd2FsMi1zdHlsZWQuc3dhbDItY2FuY2VsOmZvY3Vze2JveC1zaGFkb3c6MCAwIDAgM3B4IHJnYmEoMTEwLDEyMCwxMjksLjUpfS5zd2FsMi1zdHlsZWQuc3dhbDItZGVmYXVsdC1vdXRsaW5lOmZvY3Vze2JveC1zaGFkb3c6MCAwIDAgM3B4IHJnYmEoMTAwLDE1MCwyMDAsLjUpfS5zd2FsMi1zdHlsZWQ6Zm9jdXN7b3V0bGluZTowfS5zd2FsMi1zdHlsZWQ6Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9LnN3YWwyLWZvb3RlcntqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO21hcmdpbjoxZW0gMCAwO3BhZGRpbmc6MWVtIDFlbSAwO2JvcmRlci10b3A6MXB4IHNvbGlkICNlZWU7Y29sb3I6aW5oZXJpdDtmb250LXNpemU6MWVtfS5zd2FsMi10aW1lci1wcm9ncmVzcy1iYXItY29udGFpbmVye3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjA7Ym90dG9tOjA7bGVmdDowO2dyaWQtY29sdW1uOmF1dG8haW1wb3J0YW50O292ZXJmbG93OmhpZGRlbjtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czo1cHg7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czo1cHh9LnN3YWwyLXRpbWVyLXByb2dyZXNzLWJhcnt3aWR0aDoxMDAlO2hlaWdodDouMjVlbTtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjIpfS5zd2FsMi1pbWFnZXttYXgtd2lkdGg6MTAwJTttYXJnaW46MmVtIGF1dG8gMWVtfS5zd2FsMi1jbG9zZXt6LWluZGV4OjI7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7d2lkdGg6MS4yZW07aGVpZ2h0OjEuMmVtO21hcmdpbi10b3A6MDttYXJnaW4tcmlnaHQ6MDttYXJnaW4tYm90dG9tOi0xLjJlbTtwYWRkaW5nOjA7b3ZlcmZsb3c6aGlkZGVuO3RyYW5zaXRpb246Y29sb3IgLjFzLGJveC1zaGFkb3cgLjFzO2JvcmRlcjpub25lO2JvcmRlci1yYWRpdXM6NXB4O2JhY2tncm91bmQ6MCAwO2NvbG9yOiNjY2M7Zm9udC1mYW1pbHk6c2VyaWY7Zm9udC1mYW1pbHk6bW9ub3NwYWNlO2ZvbnQtc2l6ZToyLjVlbTtjdXJzb3I6cG9pbnRlcjtqdXN0aWZ5LXNlbGY6ZW5kfS5zd2FsMi1jbG9zZTpob3Zlcnt0cmFuc2Zvcm06bm9uZTtiYWNrZ3JvdW5kOjAgMDtjb2xvcjojZjI3NDc0fS5zd2FsMi1jbG9zZTpmb2N1c3tvdXRsaW5lOjA7Ym94LXNoYWRvdzppbnNldCAwIDAgMCAzcHggcmdiYSgxMDAsMTUwLDIwMCwuNSl9LnN3YWwyLWNsb3NlOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5zd2FsMi1odG1sLWNvbnRhaW5lcnt6LWluZGV4OjE7anVzdGlmeS1jb250ZW50OmNlbnRlcjttYXJnaW46MWVtIDEuNmVtIC4zZW07cGFkZGluZzowO292ZXJmbG93OmF1dG87Y29sb3I6aW5oZXJpdDtmb250LXNpemU6MS4xMjVlbTtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6bm9ybWFsO3RleHQtYWxpZ246Y2VudGVyO3dvcmQtd3JhcDpicmVhay13b3JkO3dvcmQtYnJlYWs6YnJlYWstd29yZH0uc3dhbDItY2hlY2tib3gsLnN3YWwyLWZpbGUsLnN3YWwyLWlucHV0LC5zd2FsMi1yYWRpbywuc3dhbDItc2VsZWN0LC5zd2FsMi10ZXh0YXJlYXttYXJnaW46MWVtIDJlbSAzcHh9LnN3YWwyLWZpbGUsLnN3YWwyLWlucHV0LC5zd2FsMi10ZXh0YXJlYXtib3gtc2l6aW5nOmJvcmRlci1ib3g7d2lkdGg6YXV0bzt0cmFuc2l0aW9uOmJvcmRlci1jb2xvciAuMXMsYm94LXNoYWRvdyAuMXM7Ym9yZGVyOjFweCBzb2xpZCAjZDlkOWQ5O2JvcmRlci1yYWRpdXM6LjE4NzVlbTtiYWNrZ3JvdW5kOjAgMDtib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNiksMCAwIDAgM3B4IHRyYW5zcGFyZW50O2NvbG9yOmluaGVyaXQ7Zm9udC1zaXplOjEuMTI1ZW19LnN3YWwyLWZpbGUuc3dhbDItaW5wdXRlcnJvciwuc3dhbDItaW5wdXQuc3dhbDItaW5wdXRlcnJvciwuc3dhbDItdGV4dGFyZWEuc3dhbDItaW5wdXRlcnJvcntib3JkZXItY29sb3I6I2YyNzQ3NCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMnB4ICNmMjc0NzQhaW1wb3J0YW50fS5zd2FsMi1maWxlOmZvY3VzLC5zd2FsMi1pbnB1dDpmb2N1cywuc3dhbDItdGV4dGFyZWE6Zm9jdXN7Ym9yZGVyOjFweCBzb2xpZCAjYjRkYmVkO291dGxpbmU6MDtib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNiksMCAwIDAgM3B4IHJnYmEoMTAwLDE1MCwyMDAsLjUpfS5zd2FsMi1maWxlOjotbW96LXBsYWNlaG9sZGVyLC5zd2FsMi1pbnB1dDo6LW1vei1wbGFjZWhvbGRlciwuc3dhbDItdGV4dGFyZWE6Oi1tb3otcGxhY2Vob2xkZXJ7Y29sb3I6I2NjY30uc3dhbDItZmlsZTotbXMtaW5wdXQtcGxhY2Vob2xkZXIsLnN3YWwyLWlucHV0Oi1tcy1pbnB1dC1wbGFjZWhvbGRlciwuc3dhbDItdGV4dGFyZWE6LW1zLWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOiNjY2N9LnN3YWwyLWZpbGU6OnBsYWNlaG9sZGVyLC5zd2FsMi1pbnB1dDo6cGxhY2Vob2xkZXIsLnN3YWwyLXRleHRhcmVhOjpwbGFjZWhvbGRlcntjb2xvcjojY2NjfS5zd2FsMi1yYW5nZXttYXJnaW46MWVtIDJlbSAzcHg7YmFja2dyb3VuZDojZmZmfS5zd2FsMi1yYW5nZSBpbnB1dHt3aWR0aDo4MCV9LnN3YWwyLXJhbmdlIG91dHB1dHt3aWR0aDoyMCU7Y29sb3I6aW5oZXJpdDtmb250LXdlaWdodDo2MDA7dGV4dC1hbGlnbjpjZW50ZXJ9LnN3YWwyLXJhbmdlIGlucHV0LC5zd2FsMi1yYW5nZSBvdXRwdXR7aGVpZ2h0OjIuNjI1ZW07cGFkZGluZzowO2ZvbnQtc2l6ZToxLjEyNWVtO2xpbmUtaGVpZ2h0OjIuNjI1ZW19LnN3YWwyLWlucHV0e2hlaWdodDoyLjYyNWVtO3BhZGRpbmc6MCAuNzVlbX0uc3dhbDItZmlsZXt3aWR0aDo3NSU7bWFyZ2luLXJpZ2h0OmF1dG87bWFyZ2luLWxlZnQ6YXV0bztiYWNrZ3JvdW5kOjAgMDtmb250LXNpemU6MS4xMjVlbX0uc3dhbDItdGV4dGFyZWF7aGVpZ2h0OjYuNzVlbTtwYWRkaW5nOi43NWVtfS5zd2FsMi1zZWxlY3R7bWluLXdpZHRoOjUwJTttYXgtd2lkdGg6MTAwJTtwYWRkaW5nOi4zNzVlbSAuNjI1ZW07YmFja2dyb3VuZDowIDA7Y29sb3I6aW5oZXJpdDtmb250LXNpemU6MS4xMjVlbX0uc3dhbDItY2hlY2tib3gsLnN3YWwyLXJhZGlve2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjppbmhlcml0fS5zd2FsMi1jaGVja2JveCBsYWJlbCwuc3dhbDItcmFkaW8gbGFiZWx7bWFyZ2luOjAgLjZlbTtmb250LXNpemU6MS4xMjVlbX0uc3dhbDItY2hlY2tib3ggaW5wdXQsLnN3YWwyLXJhZGlvIGlucHV0e2ZsZXgtc2hyaW5rOjA7bWFyZ2luOjAgLjRlbX0uc3dhbDItaW5wdXQtbGFiZWx7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7bWFyZ2luOjFlbSBhdXRvIDB9LnN3YWwyLXZhbGlkYXRpb24tbWVzc2FnZXthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjttYXJnaW46MWVtIDAgMDtwYWRkaW5nOi42MjVlbTtvdmVyZmxvdzpoaWRkZW47YmFja2dyb3VuZDojZjBmMGYwO2NvbG9yOiM2NjY7Zm9udC1zaXplOjFlbTtmb250LXdlaWdodDozMDB9LnN3YWwyLXZhbGlkYXRpb24tbWVzc2FnZTo6YmVmb3Jle2NvbnRlbnQ6XCIhXCI7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MS41ZW07bWluLXdpZHRoOjEuNWVtO2hlaWdodDoxLjVlbTttYXJnaW46MCAuNjI1ZW07Ym9yZGVyLXJhZGl1czo1MCU7YmFja2dyb3VuZC1jb2xvcjojZjI3NDc0O2NvbG9yOiNmZmY7Zm9udC13ZWlnaHQ6NjAwO2xpbmUtaGVpZ2h0OjEuNWVtO3RleHQtYWxpZ246Y2VudGVyfS5zd2FsMi1pY29ue3Bvc2l0aW9uOnJlbGF0aXZlO2JveC1zaXppbmc6Y29udGVudC1ib3g7anVzdGlmeS1jb250ZW50OmNlbnRlcjt3aWR0aDo1ZW07aGVpZ2h0OjVlbTttYXJnaW46Mi41ZW0gYXV0byAuNmVtO2JvcmRlcjouMjVlbSBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItcmFkaXVzOjUwJTtib3JkZXItY29sb3I6IzAwMDtmb250LWZhbWlseTppbmhlcml0O2xpbmUtaGVpZ2h0OjVlbTtjdXJzb3I6ZGVmYXVsdDstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmV9LnN3YWwyLWljb24gLnN3YWwyLWljb24tY29udGVudHtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2ZvbnQtc2l6ZTozLjc1ZW19LnN3YWwyLWljb24uc3dhbDItZXJyb3J7Ym9yZGVyLWNvbG9yOiNmMjc0NzQ7Y29sb3I6I2YyNzQ3NH0uc3dhbDItaWNvbi5zd2FsMi1lcnJvciAuc3dhbDIteC1tYXJre3Bvc2l0aW9uOnJlbGF0aXZlO2ZsZXgtZ3JvdzoxfS5zd2FsMi1pY29uLnN3YWwyLWVycm9yIFtjbGFzc149c3dhbDIteC1tYXJrLWxpbmVde2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7dG9wOjIuMzEyNWVtO3dpZHRoOjIuOTM3NWVtO2hlaWdodDouMzEyNWVtO2JvcmRlci1yYWRpdXM6LjEyNWVtO2JhY2tncm91bmQtY29sb3I6I2YyNzQ3NH0uc3dhbDItaWNvbi5zd2FsMi1lcnJvciBbY2xhc3NePXN3YWwyLXgtbWFyay1saW5lXVtjbGFzcyQ9bGVmdF17bGVmdDoxLjA2MjVlbTt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKX0uc3dhbDItaWNvbi5zd2FsMi1lcnJvciBbY2xhc3NePXN3YWwyLXgtbWFyay1saW5lXVtjbGFzcyQ9cmlnaHRde3JpZ2h0OjFlbTt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyl9LnN3YWwyLWljb24uc3dhbDItZXJyb3Iuc3dhbDItaWNvbi1zaG93ey13ZWJraXQtYW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtZXJyb3ItaWNvbiAuNXM7YW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtZXJyb3ItaWNvbiAuNXN9LnN3YWwyLWljb24uc3dhbDItZXJyb3Iuc3dhbDItaWNvbi1zaG93IC5zd2FsMi14LW1hcmt7LXdlYmtpdC1hbmltYXRpb246c3dhbDItYW5pbWF0ZS1lcnJvci14LW1hcmsgLjVzO2FuaW1hdGlvbjpzd2FsMi1hbmltYXRlLWVycm9yLXgtbWFyayAuNXN9LnN3YWwyLWljb24uc3dhbDItd2FybmluZ3tib3JkZXItY29sb3I6I2ZhY2VhODtjb2xvcjojZjhiYjg2fS5zd2FsMi1pY29uLnN3YWwyLXdhcm5pbmcuc3dhbDItaWNvbi1zaG93ey13ZWJraXQtYW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtZXJyb3ItaWNvbiAuNXM7YW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtZXJyb3ItaWNvbiAuNXN9LnN3YWwyLWljb24uc3dhbDItd2FybmluZy5zd2FsMi1pY29uLXNob3cgLnN3YWwyLWljb24tY29udGVudHstd2Via2l0LWFuaW1hdGlvbjpzd2FsMi1hbmltYXRlLWktbWFyayAuNXM7YW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtaS1tYXJrIC41c30uc3dhbDItaWNvbi5zd2FsMi1pbmZve2JvcmRlci1jb2xvcjojOWRlMGY2O2NvbG9yOiMzZmMzZWV9LnN3YWwyLWljb24uc3dhbDItaW5mby5zd2FsMi1pY29uLXNob3d7LXdlYmtpdC1hbmltYXRpb246c3dhbDItYW5pbWF0ZS1lcnJvci1pY29uIC41czthbmltYXRpb246c3dhbDItYW5pbWF0ZS1lcnJvci1pY29uIC41c30uc3dhbDItaWNvbi5zd2FsMi1pbmZvLnN3YWwyLWljb24tc2hvdyAuc3dhbDItaWNvbi1jb250ZW50ey13ZWJraXQtYW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtaS1tYXJrIC44czthbmltYXRpb246c3dhbDItYW5pbWF0ZS1pLW1hcmsgLjhzfS5zd2FsMi1pY29uLnN3YWwyLXF1ZXN0aW9ue2JvcmRlci1jb2xvcjojYzlkYWUxO2NvbG9yOiM4N2FkYmR9LnN3YWwyLWljb24uc3dhbDItcXVlc3Rpb24uc3dhbDItaWNvbi1zaG93ey13ZWJraXQtYW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtZXJyb3ItaWNvbiAuNXM7YW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtZXJyb3ItaWNvbiAuNXN9LnN3YWwyLWljb24uc3dhbDItcXVlc3Rpb24uc3dhbDItaWNvbi1zaG93IC5zd2FsMi1pY29uLWNvbnRlbnR7LXdlYmtpdC1hbmltYXRpb246c3dhbDItYW5pbWF0ZS1xdWVzdGlvbi1tYXJrIC44czthbmltYXRpb246c3dhbDItYW5pbWF0ZS1xdWVzdGlvbi1tYXJrIC44c30uc3dhbDItaWNvbi5zd2FsMi1zdWNjZXNze2JvcmRlci1jb2xvcjojYTVkYzg2O2NvbG9yOiNhNWRjODZ9LnN3YWwyLWljb24uc3dhbDItc3VjY2VzcyBbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtY2lyY3VsYXItbGluZV17cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6My43NWVtO2hlaWdodDo3LjVlbTt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKTtib3JkZXItcmFkaXVzOjUwJX0uc3dhbDItaWNvbi5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1jaXJjdWxhci1saW5lXVtjbGFzcyQ9bGVmdF17dG9wOi0uNDM3NWVtO2xlZnQ6LTIuMDYzNWVtO3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKTt0cmFuc2Zvcm0tb3JpZ2luOjMuNzVlbSAzLjc1ZW07Ym9yZGVyLXJhZGl1czo3LjVlbSAwIDAgNy41ZW19LnN3YWwyLWljb24uc3dhbDItc3VjY2VzcyBbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtY2lyY3VsYXItbGluZV1bY2xhc3MkPXJpZ2h0XXt0b3A6LS42ODc1ZW07bGVmdDoxLjg3NWVtO3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKTt0cmFuc2Zvcm0tb3JpZ2luOjAgMy43NWVtO2JvcmRlci1yYWRpdXM6MCA3LjVlbSA3LjVlbSAwfS5zd2FsMi1pY29uLnN3YWwyLXN1Y2Nlc3MgLnN3YWwyLXN1Y2Nlc3MtcmluZ3twb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjI7dG9wOi0uMjVlbTtsZWZ0Oi0uMjVlbTtib3gtc2l6aW5nOmNvbnRlbnQtYm94O3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7Ym9yZGVyOi4yNWVtIHNvbGlkIHJnYmEoMTY1LDIyMCwxMzQsLjMpO2JvcmRlci1yYWRpdXM6NTAlfS5zd2FsMi1pY29uLnN3YWwyLXN1Y2Nlc3MgLnN3YWwyLXN1Y2Nlc3MtZml4e3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTt0b3A6LjVlbTtsZWZ0OjEuNjI1ZW07d2lkdGg6LjQzNzVlbTtoZWlnaHQ6NS42MjVlbTt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyl9LnN3YWwyLWljb24uc3dhbDItc3VjY2VzcyBbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtbGluZV17ZGlzcGxheTpibG9jaztwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjI7aGVpZ2h0Oi4zMTI1ZW07Ym9yZGVyLXJhZGl1czouMTI1ZW07YmFja2dyb3VuZC1jb2xvcjojYTVkYzg2fS5zd2FsMi1pY29uLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj1zd2FsMi1zdWNjZXNzLWxpbmVdW2NsYXNzJD10aXBde3RvcDoyLjg3NWVtO2xlZnQ6LjgxMjVlbTt3aWR0aDoxLjU2MjVlbTt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKX0uc3dhbDItaWNvbi5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1saW5lXVtjbGFzcyQ9bG9uZ117dG9wOjIuMzc1ZW07cmlnaHQ6LjVlbTt3aWR0aDoyLjkzNzVlbTt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyl9LnN3YWwyLWljb24uc3dhbDItc3VjY2Vzcy5zd2FsMi1pY29uLXNob3cgLnN3YWwyLXN1Y2Nlc3MtbGluZS10aXB7LXdlYmtpdC1hbmltYXRpb246c3dhbDItYW5pbWF0ZS1zdWNjZXNzLWxpbmUtdGlwIC43NXM7YW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtc3VjY2Vzcy1saW5lLXRpcCAuNzVzfS5zd2FsMi1pY29uLnN3YWwyLXN1Y2Nlc3Muc3dhbDItaWNvbi1zaG93IC5zd2FsMi1zdWNjZXNzLWxpbmUtbG9uZ3std2Via2l0LWFuaW1hdGlvbjpzd2FsMi1hbmltYXRlLXN1Y2Nlc3MtbGluZS1sb25nIC43NXM7YW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtc3VjY2Vzcy1saW5lLWxvbmcgLjc1c30uc3dhbDItaWNvbi5zd2FsMi1zdWNjZXNzLnN3YWwyLWljb24tc2hvdyAuc3dhbDItc3VjY2Vzcy1jaXJjdWxhci1saW5lLXJpZ2h0ey13ZWJraXQtYW5pbWF0aW9uOnN3YWwyLXJvdGF0ZS1zdWNjZXNzLWNpcmN1bGFyLWxpbmUgNC4yNXMgZWFzZS1pbjthbmltYXRpb246c3dhbDItcm90YXRlLXN1Y2Nlc3MtY2lyY3VsYXItbGluZSA0LjI1cyBlYXNlLWlufS5zd2FsMi1wcm9ncmVzcy1zdGVwc3tmbGV4LXdyYXA6d3JhcDthbGlnbi1pdGVtczpjZW50ZXI7bWF4LXdpZHRoOjEwMCU7bWFyZ2luOjEuMjVlbSBhdXRvO3BhZGRpbmc6MDtiYWNrZ3JvdW5kOjAgMDtmb250LXdlaWdodDo2MDB9LnN3YWwyLXByb2dyZXNzLXN0ZXBzIGxpe2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlfS5zd2FsMi1wcm9ncmVzcy1zdGVwcyAuc3dhbDItcHJvZ3Jlc3Mtc3RlcHt6LWluZGV4OjIwO2ZsZXgtc2hyaW5rOjA7d2lkdGg6MmVtO2hlaWdodDoyZW07Ym9yZGVyLXJhZGl1czoyZW07YmFja2dyb3VuZDojMjc3OGM0O2NvbG9yOiNmZmY7bGluZS1oZWlnaHQ6MmVtO3RleHQtYWxpZ246Y2VudGVyfS5zd2FsMi1wcm9ncmVzcy1zdGVwcyAuc3dhbDItcHJvZ3Jlc3Mtc3RlcC5zd2FsMi1hY3RpdmUtcHJvZ3Jlc3Mtc3RlcHtiYWNrZ3JvdW5kOiMyNzc4YzR9LnN3YWwyLXByb2dyZXNzLXN0ZXBzIC5zd2FsMi1wcm9ncmVzcy1zdGVwLnN3YWwyLWFjdGl2ZS1wcm9ncmVzcy1zdGVwfi5zd2FsMi1wcm9ncmVzcy1zdGVwe2JhY2tncm91bmQ6I2FkZDhlNjtjb2xvcjojZmZmfS5zd2FsMi1wcm9ncmVzcy1zdGVwcyAuc3dhbDItcHJvZ3Jlc3Mtc3RlcC5zd2FsMi1hY3RpdmUtcHJvZ3Jlc3Mtc3RlcH4uc3dhbDItcHJvZ3Jlc3Mtc3RlcC1saW5le2JhY2tncm91bmQ6I2FkZDhlNn0uc3dhbDItcHJvZ3Jlc3Mtc3RlcHMgLnN3YWwyLXByb2dyZXNzLXN0ZXAtbGluZXt6LWluZGV4OjEwO2ZsZXgtc2hyaW5rOjA7d2lkdGg6Mi41ZW07aGVpZ2h0Oi40ZW07bWFyZ2luOjAgLTFweDtiYWNrZ3JvdW5kOiMyNzc4YzR9W2NsYXNzXj1zd2FsMl17LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50fS5zd2FsMi1zaG93ey13ZWJraXQtYW5pbWF0aW9uOnN3YWwyLXNob3cgLjNzO2FuaW1hdGlvbjpzd2FsMi1zaG93IC4zc30uc3dhbDItaGlkZXstd2Via2l0LWFuaW1hdGlvbjpzd2FsMi1oaWRlIC4xNXMgZm9yd2FyZHM7YW5pbWF0aW9uOnN3YWwyLWhpZGUgLjE1cyBmb3J3YXJkc30uc3dhbDItbm9hbmltYXRpb257dHJhbnNpdGlvbjpub25lfS5zd2FsMi1zY3JvbGxiYXItbWVhc3VyZXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTk5OTlweDt3aWR0aDo1MHB4O2hlaWdodDo1MHB4O292ZXJmbG93OnNjcm9sbH0uc3dhbDItcnRsIC5zd2FsMi1jbG9zZXttYXJnaW4tcmlnaHQ6aW5pdGlhbDttYXJnaW4tbGVmdDowfS5zd2FsMi1ydGwgLnN3YWwyLXRpbWVyLXByb2dyZXNzLWJhcntyaWdodDowO2xlZnQ6YXV0b30uc3dhbDItbm8td2Fye2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwNjE7dG9wOjA7bGVmdDowO2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3dpZHRoOjEwMCU7aGVpZ2h0OjMuMzc1ZW07YmFja2dyb3VuZDojMjAyMzJhO2NvbG9yOiNmZmY7dGV4dC1hbGlnbjpjZW50ZXJ9LnN3YWwyLW5vLXdhciBhe2NvbG9yOiM2MWRhZmI7dGV4dC1kZWNvcmF0aW9uOm5vbmV9LnN3YWwyLW5vLXdhciBhOmhvdmVye3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmV9QC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLXRvYXN0LXNob3d7MCV7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLS42MjVlbSkgcm90YXRlWigyZGVnKX0zMyV7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCkgcm90YXRlWigtMmRlZyl9NjYle3RyYW5zZm9ybTp0cmFuc2xhdGVZKC4zMTI1ZW0pIHJvdGF0ZVooMmRlZyl9MTAwJXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgwKSByb3RhdGVaKDApfX1Aa2V5ZnJhbWVzIHN3YWwyLXRvYXN0LXNob3d7MCV7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLS42MjVlbSkgcm90YXRlWigyZGVnKX0zMyV7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCkgcm90YXRlWigtMmRlZyl9NjYle3RyYW5zZm9ybTp0cmFuc2xhdGVZKC4zMTI1ZW0pIHJvdGF0ZVooMmRlZyl9MTAwJXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgwKSByb3RhdGVaKDApfX1ALXdlYmtpdC1rZXlmcmFtZXMgc3dhbDItdG9hc3QtaGlkZXsxMDAle3RyYW5zZm9ybTpyb3RhdGVaKDFkZWcpO29wYWNpdHk6MH19QGtleWZyYW1lcyBzd2FsMi10b2FzdC1oaWRlezEwMCV7dHJhbnNmb3JtOnJvdGF0ZVooMWRlZyk7b3BhY2l0eTowfX1ALXdlYmtpdC1rZXlmcmFtZXMgc3dhbDItdG9hc3QtYW5pbWF0ZS1zdWNjZXNzLWxpbmUtdGlwezAle3RvcDouNTYyNWVtO2xlZnQ6LjA2MjVlbTt3aWR0aDowfTU0JXt0b3A6LjEyNWVtO2xlZnQ6LjEyNWVtO3dpZHRoOjB9NzAle3RvcDouNjI1ZW07bGVmdDotLjI1ZW07d2lkdGg6MS42MjVlbX04NCV7dG9wOjEuMDYyNWVtO2xlZnQ6Ljc1ZW07d2lkdGg6LjVlbX0xMDAle3RvcDoxLjEyNWVtO2xlZnQ6LjE4NzVlbTt3aWR0aDouNzVlbX19QGtleWZyYW1lcyBzd2FsMi10b2FzdC1hbmltYXRlLXN1Y2Nlc3MtbGluZS10aXB7MCV7dG9wOi41NjI1ZW07bGVmdDouMDYyNWVtO3dpZHRoOjB9NTQle3RvcDouMTI1ZW07bGVmdDouMTI1ZW07d2lkdGg6MH03MCV7dG9wOi42MjVlbTtsZWZ0Oi0uMjVlbTt3aWR0aDoxLjYyNWVtfTg0JXt0b3A6MS4wNjI1ZW07bGVmdDouNzVlbTt3aWR0aDouNWVtfTEwMCV7dG9wOjEuMTI1ZW07bGVmdDouMTg3NWVtO3dpZHRoOi43NWVtfX1ALXdlYmtpdC1rZXlmcmFtZXMgc3dhbDItdG9hc3QtYW5pbWF0ZS1zdWNjZXNzLWxpbmUtbG9uZ3swJXt0b3A6MS42MjVlbTtyaWdodDoxLjM3NWVtO3dpZHRoOjB9NjUle3RvcDoxLjI1ZW07cmlnaHQ6LjkzNzVlbTt3aWR0aDowfTg0JXt0b3A6LjkzNzVlbTtyaWdodDowO3dpZHRoOjEuMTI1ZW19MTAwJXt0b3A6LjkzNzVlbTtyaWdodDouMTg3NWVtO3dpZHRoOjEuMzc1ZW19fUBrZXlmcmFtZXMgc3dhbDItdG9hc3QtYW5pbWF0ZS1zdWNjZXNzLWxpbmUtbG9uZ3swJXt0b3A6MS42MjVlbTtyaWdodDoxLjM3NWVtO3dpZHRoOjB9NjUle3RvcDoxLjI1ZW07cmlnaHQ6LjkzNzVlbTt3aWR0aDowfTg0JXt0b3A6LjkzNzVlbTtyaWdodDowO3dpZHRoOjEuMTI1ZW19MTAwJXt0b3A6LjkzNzVlbTtyaWdodDouMTg3NWVtO3dpZHRoOjEuMzc1ZW19fUAtd2Via2l0LWtleWZyYW1lcyBzd2FsMi1zaG93ezAle3RyYW5zZm9ybTpzY2FsZSguNyl9NDUle3RyYW5zZm9ybTpzY2FsZSgxLjA1KX04MCV7dHJhbnNmb3JtOnNjYWxlKC45NSl9MTAwJXt0cmFuc2Zvcm06c2NhbGUoMSl9fUBrZXlmcmFtZXMgc3dhbDItc2hvd3swJXt0cmFuc2Zvcm06c2NhbGUoLjcpfTQ1JXt0cmFuc2Zvcm06c2NhbGUoMS4wNSl9ODAle3RyYW5zZm9ybTpzY2FsZSguOTUpfTEwMCV7dHJhbnNmb3JtOnNjYWxlKDEpfX1ALXdlYmtpdC1rZXlmcmFtZXMgc3dhbDItaGlkZXswJXt0cmFuc2Zvcm06c2NhbGUoMSk7b3BhY2l0eToxfTEwMCV7dHJhbnNmb3JtOnNjYWxlKC41KTtvcGFjaXR5OjB9fUBrZXlmcmFtZXMgc3dhbDItaGlkZXswJXt0cmFuc2Zvcm06c2NhbGUoMSk7b3BhY2l0eToxfTEwMCV7dHJhbnNmb3JtOnNjYWxlKC41KTtvcGFjaXR5OjB9fUAtd2Via2l0LWtleWZyYW1lcyBzd2FsMi1hbmltYXRlLXN1Y2Nlc3MtbGluZS10aXB7MCV7dG9wOjEuMTg3NWVtO2xlZnQ6LjA2MjVlbTt3aWR0aDowfTU0JXt0b3A6MS4wNjI1ZW07bGVmdDouMTI1ZW07d2lkdGg6MH03MCV7dG9wOjIuMTg3NWVtO2xlZnQ6LS4zNzVlbTt3aWR0aDozLjEyNWVtfTg0JXt0b3A6M2VtO2xlZnQ6MS4zMTI1ZW07d2lkdGg6MS4wNjI1ZW19MTAwJXt0b3A6Mi44MTI1ZW07bGVmdDouODEyNWVtO3dpZHRoOjEuNTYyNWVtfX1Aa2V5ZnJhbWVzIHN3YWwyLWFuaW1hdGUtc3VjY2Vzcy1saW5lLXRpcHswJXt0b3A6MS4xODc1ZW07bGVmdDouMDYyNWVtO3dpZHRoOjB9NTQle3RvcDoxLjA2MjVlbTtsZWZ0Oi4xMjVlbTt3aWR0aDowfTcwJXt0b3A6Mi4xODc1ZW07bGVmdDotLjM3NWVtO3dpZHRoOjMuMTI1ZW19ODQle3RvcDozZW07bGVmdDoxLjMxMjVlbTt3aWR0aDoxLjA2MjVlbX0xMDAle3RvcDoyLjgxMjVlbTtsZWZ0Oi44MTI1ZW07d2lkdGg6MS41NjI1ZW19fUAtd2Via2l0LWtleWZyYW1lcyBzd2FsMi1hbmltYXRlLXN1Y2Nlc3MtbGluZS1sb25nezAle3RvcDozLjM3NWVtO3JpZ2h0OjIuODc1ZW07d2lkdGg6MH02NSV7dG9wOjMuMzc1ZW07cmlnaHQ6Mi44NzVlbTt3aWR0aDowfTg0JXt0b3A6Mi4xODc1ZW07cmlnaHQ6MDt3aWR0aDozLjQzNzVlbX0xMDAle3RvcDoyLjM3NWVtO3JpZ2h0Oi41ZW07d2lkdGg6Mi45Mzc1ZW19fUBrZXlmcmFtZXMgc3dhbDItYW5pbWF0ZS1zdWNjZXNzLWxpbmUtbG9uZ3swJXt0b3A6My4zNzVlbTtyaWdodDoyLjg3NWVtO3dpZHRoOjB9NjUle3RvcDozLjM3NWVtO3JpZ2h0OjIuODc1ZW07d2lkdGg6MH04NCV7dG9wOjIuMTg3NWVtO3JpZ2h0OjA7d2lkdGg6My40Mzc1ZW19MTAwJXt0b3A6Mi4zNzVlbTtyaWdodDouNWVtO3dpZHRoOjIuOTM3NWVtfX1ALXdlYmtpdC1rZXlmcmFtZXMgc3dhbDItcm90YXRlLXN1Y2Nlc3MtY2lyY3VsYXItbGluZXswJXt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyl9NSV7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpfTEyJXt0cmFuc2Zvcm06cm90YXRlKC00MDVkZWcpfTEwMCV7dHJhbnNmb3JtOnJvdGF0ZSgtNDA1ZGVnKX19QGtleWZyYW1lcyBzd2FsMi1yb3RhdGUtc3VjY2Vzcy1jaXJjdWxhci1saW5lezAle3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKX01JXt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyl9MTIle3RyYW5zZm9ybTpyb3RhdGUoLTQwNWRlZyl9MTAwJXt0cmFuc2Zvcm06cm90YXRlKC00MDVkZWcpfX1ALXdlYmtpdC1rZXlmcmFtZXMgc3dhbDItYW5pbWF0ZS1lcnJvci14LW1hcmt7MCV7bWFyZ2luLXRvcDoxLjYyNWVtO3RyYW5zZm9ybTpzY2FsZSguNCk7b3BhY2l0eTowfTUwJXttYXJnaW4tdG9wOjEuNjI1ZW07dHJhbnNmb3JtOnNjYWxlKC40KTtvcGFjaXR5OjB9ODAle21hcmdpbi10b3A6LS4zNzVlbTt0cmFuc2Zvcm06c2NhbGUoMS4xNSl9MTAwJXttYXJnaW4tdG9wOjA7dHJhbnNmb3JtOnNjYWxlKDEpO29wYWNpdHk6MX19QGtleWZyYW1lcyBzd2FsMi1hbmltYXRlLWVycm9yLXgtbWFya3swJXttYXJnaW4tdG9wOjEuNjI1ZW07dHJhbnNmb3JtOnNjYWxlKC40KTtvcGFjaXR5OjB9NTAle21hcmdpbi10b3A6MS42MjVlbTt0cmFuc2Zvcm06c2NhbGUoLjQpO29wYWNpdHk6MH04MCV7bWFyZ2luLXRvcDotLjM3NWVtO3RyYW5zZm9ybTpzY2FsZSgxLjE1KX0xMDAle21hcmdpbi10b3A6MDt0cmFuc2Zvcm06c2NhbGUoMSk7b3BhY2l0eToxfX1ALXdlYmtpdC1rZXlmcmFtZXMgc3dhbDItYW5pbWF0ZS1lcnJvci1pY29uezAle3RyYW5zZm9ybTpyb3RhdGVYKDEwMGRlZyk7b3BhY2l0eTowfTEwMCV7dHJhbnNmb3JtOnJvdGF0ZVgoMCk7b3BhY2l0eToxfX1Aa2V5ZnJhbWVzIHN3YWwyLWFuaW1hdGUtZXJyb3ItaWNvbnswJXt0cmFuc2Zvcm06cm90YXRlWCgxMDBkZWcpO29wYWNpdHk6MH0xMDAle3RyYW5zZm9ybTpyb3RhdGVYKDApO29wYWNpdHk6MX19QC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLXJvdGF0ZS1sb2FkaW5nezAle3RyYW5zZm9ybTpyb3RhdGUoMCl9MTAwJXt0cmFuc2Zvcm06cm90YXRlKDM2MGRlZyl9fUBrZXlmcmFtZXMgc3dhbDItcm90YXRlLWxvYWRpbmd7MCV7dHJhbnNmb3JtOnJvdGF0ZSgwKX0xMDAle3RyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKX19QC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLWFuaW1hdGUtcXVlc3Rpb24tbWFya3swJXt0cmFuc2Zvcm06cm90YXRlWSgtMzYwZGVnKX0xMDAle3RyYW5zZm9ybTpyb3RhdGVZKDApfX1Aa2V5ZnJhbWVzIHN3YWwyLWFuaW1hdGUtcXVlc3Rpb24tbWFya3swJXt0cmFuc2Zvcm06cm90YXRlWSgtMzYwZGVnKX0xMDAle3RyYW5zZm9ybTpyb3RhdGVZKDApfX1ALXdlYmtpdC1rZXlmcmFtZXMgc3dhbDItYW5pbWF0ZS1pLW1hcmt7MCV7dHJhbnNmb3JtOnJvdGF0ZVooNDVkZWcpO29wYWNpdHk6MH0yNSV7dHJhbnNmb3JtOnJvdGF0ZVooLTI1ZGVnKTtvcGFjaXR5Oi40fTUwJXt0cmFuc2Zvcm06cm90YXRlWigxNWRlZyk7b3BhY2l0eTouOH03NSV7dHJhbnNmb3JtOnJvdGF0ZVooLTVkZWcpO29wYWNpdHk6MX0xMDAle3RyYW5zZm9ybTpyb3RhdGVYKDApO29wYWNpdHk6MX19QGtleWZyYW1lcyBzd2FsMi1hbmltYXRlLWktbWFya3swJXt0cmFuc2Zvcm06cm90YXRlWig0NWRlZyk7b3BhY2l0eTowfTI1JXt0cmFuc2Zvcm06cm90YXRlWigtMjVkZWcpO29wYWNpdHk6LjR9NTAle3RyYW5zZm9ybTpyb3RhdGVaKDE1ZGVnKTtvcGFjaXR5Oi44fTc1JXt0cmFuc2Zvcm06cm90YXRlWigtNWRlZyk7b3BhY2l0eToxfTEwMCV7dHJhbnNmb3JtOnJvdGF0ZVgoMCk7b3BhY2l0eToxfX1ib2R5LnN3YWwyLXNob3duOm5vdCguc3dhbDItbm8tYmFja2Ryb3ApOm5vdCguc3dhbDItdG9hc3Qtc2hvd24pe292ZXJmbG93OmhpZGRlbn1ib2R5LnN3YWwyLWhlaWdodC1hdXRve2hlaWdodDphdXRvIWltcG9ydGFudH1ib2R5LnN3YWwyLW5vLWJhY2tkcm9wIC5zd2FsMi1jb250YWluZXJ7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCFpbXBvcnRhbnQ7cG9pbnRlci1ldmVudHM6bm9uZX1ib2R5LnN3YWwyLW5vLWJhY2tkcm9wIC5zd2FsMi1jb250YWluZXIgLnN3YWwyLXBvcHVwe3BvaW50ZXItZXZlbnRzOmFsbH1ib2R5LnN3YWwyLW5vLWJhY2tkcm9wIC5zd2FsMi1jb250YWluZXIgLnN3YWwyLW1vZGFse2JveC1zaGFkb3c6MCAwIDEwcHggcmdiYSgwLDAsMCwuNCl9QG1lZGlhIHByaW50e2JvZHkuc3dhbDItc2hvd246bm90KC5zd2FsMi1uby1iYWNrZHJvcCk6bm90KC5zd2FsMi10b2FzdC1zaG93bil7b3ZlcmZsb3cteTpzY3JvbGwhaW1wb3J0YW50fWJvZHkuc3dhbDItc2hvd246bm90KC5zd2FsMi1uby1iYWNrZHJvcCk6bm90KC5zd2FsMi10b2FzdC1zaG93bik+W2FyaWEtaGlkZGVuPXRydWVde2Rpc3BsYXk6bm9uZX1ib2R5LnN3YWwyLXNob3duOm5vdCguc3dhbDItbm8tYmFja2Ryb3ApOm5vdCguc3dhbDItdG9hc3Qtc2hvd24pIC5zd2FsMi1jb250YWluZXJ7cG9zaXRpb246c3RhdGljIWltcG9ydGFudH19Ym9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVye2JveC1zaXppbmc6Ym9yZGVyLWJveDt3aWR0aDozNjBweDttYXgtd2lkdGg6MTAwJTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O3BvaW50ZXItZXZlbnRzOm5vbmV9Ym9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLXRvcHt0b3A6MDtyaWdodDphdXRvO2JvdHRvbTphdXRvO2xlZnQ6NTAlO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpfWJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3AtZW5kLGJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3AtcmlnaHR7dG9wOjA7cmlnaHQ6MDtib3R0b206YXV0bztsZWZ0OmF1dG99Ym9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLXRvcC1sZWZ0LGJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3Atc3RhcnR7dG9wOjA7cmlnaHQ6YXV0bztib3R0b206YXV0bztsZWZ0OjB9Ym9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlci1sZWZ0LGJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXItc3RhcnR7dG9wOjUwJTtyaWdodDphdXRvO2JvdHRvbTphdXRvO2xlZnQ6MDt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKX1ib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItY2VudGVye3RvcDo1MCU7cmlnaHQ6YXV0bztib3R0b206YXV0bztsZWZ0OjUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlKC01MCUsLTUwJSl9Ym9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlci1lbmQsYm9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlci1yaWdodHt0b3A6NTAlO3JpZ2h0OjA7Ym90dG9tOmF1dG87bGVmdDphdXRvO3RyYW5zZm9ybTp0cmFuc2xhdGVZKC01MCUpfWJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tbGVmdCxib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLXN0YXJ0e3RvcDphdXRvO3JpZ2h0OmF1dG87Ym90dG9tOjA7bGVmdDowfWJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b217dG9wOmF1dG87cmlnaHQ6YXV0bztib3R0b206MDtsZWZ0OjUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKX1ib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLWVuZCxib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLXJpZ2h0e3RvcDphdXRvO3JpZ2h0OjA7Ym90dG9tOjA7bGVmdDphdXRvfSIpOwoKLyoqKi8gfSksCgovKioqLyA2NToKLyoqKi8gKChtb2R1bGUpID0+IHsKCm1vZHVsZS5leHBvcnRzID0gIi5temZfYnRue3RleHQtYWxpZ246Y2VudGVyO2ZvbnQtc2l6ZTouODVlbTtjb2xvcjojMDlhYWZmO2JvcmRlcjoycHggc29saWQgI2MzZWFmZjtib3JkZXItcmFkaXVzOjRweDttYXJnaW4tbGVmdDo1cHg7cGFkZGluZzoxMHB4O3BhZGRpbmctdG9wOjVweDtwYWRkaW5nLWJvdHRvbTo1cHg7Y3Vyc29yOnBvaW50ZXJ9Lm16Zl9idG4ye3RleHQtYWxpZ246Y2VudGVyO2NvbG9yOiMwOWFhZmY7bWFyZ2luLWxlZnQ6NXB4O2N1cnNvcjpwb2ludGVyfS5temZfbGlua3tmb250LWZhbWlseTppbmhlcml0O2NvbG9yOiMwOWFhZmY7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dmVydGljYWwtYWxpZ246YmFzZWxpbmV9Lm16Zl90ZXh0e2ZvbnQtZmVhdHVyZS1zZXR0aW5nczpcImxudW1cIjstd2Via2l0LWZvbnQtc21vb3RoaW5nOmFudGlhbGlhc2VkO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Y29sb3I6IzU0NTQ1NDtmb250LXdlaWdodDo0MDA7d29yZC1icmVhazpicmVhay13b3JkOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDttYXJnaW46MDtwYWRkaW5nOjA7d2lkdGg6MTAwJTtoZWlnaHQ6MzRweDtkaXNwbGF5OmJsb2NrO2xpbmUtaGVpZ2h0OjM0cHg7dGV4dC1hbGlnbjpjZW50ZXI7d2hpdGUtc3BhY2U6bm93cmFwfS5temZfbmV3X2J0bnstd2Via2l0LWZvbnQtc21vb3RoaW5nOmFudGlhbGlhc2VkOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7Zm9udDppbmhlcml0O292ZXJmbG93OnZpc2libGU7dGV4dC10cmFuc2Zvcm06bm9uZTtmb250LWZhbWlseTpTRlVJVGV4dCxQaW5nRmFuZ1NDLVJlZ3VsYXIsSGVsdmV0aWNhIE5ldWUsSGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWY7ZGlzcGxheTppbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6MTt3aGl0ZS1zcGFjZTpub3dyYXA7Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZDojZmZmO3RleHQtYWxpZ246Y2VudGVyO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdXRsaW5lOjA7bWFyZ2luOjA7dHJhbnNpdGlvbjouMXM7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiMwNmE3ZmY7Zm9udC13ZWlnaHQ6NzAwO3BhZGRpbmc6OHB4IDI0cHg7aGVpZ2h0OjMycHg7Zm9udC1zaXplOjE0cHg7Ym9yZGVyLXJhZGl1czoxNnB4O2JvcmRlcjpub25lfXN2Z3ttYXJnaW4tcmlnaHQ6NXB4O3RyYW5zZm9ybTpyb3RhdGUoMTgwZGVnKTt0cmFuc2l0aW9uOnRyYW5zZm9ybSAuMnM7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5temZfZGV0YWlsc3tjdXJzb3I6cG9pbnRlcn0ubXpmX2NvbnRlbnR7bWF4LWhlaWdodDowO21hcmdpbjowO3RyYW5zaXRpb246bWF4LWhlaWdodCAuNXM7b3ZlcmZsb3c6aGlkZGVufS5temZfZGV0YWlsc1tvcGVuXT5zdW1tYXJ5PnN2Z3t0cmFuc2Zvcm06cm90YXRlKDBkZWcpfS5temZfZGV0YWlsc1tvcGVuXSsubXpmX2NvbnRlbnR7bWF4LWhlaWdodDoxMDAlfS5temZfaHRtbF9jb250YWluZXJ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOm1pbm1heCgwLCAxMDAlKTthbGlnbi1zZWxmOmNlbnRlcjtqdXN0aWZ5LXNlbGY6Y2VudGVyO3dpZHRoOjMyZW07bWF4LXdpZHRoOjEwMCV9Lm16Zl91cGRhdGVJbmZve2JvcmRlcjoxcHggIzAwMDt3aWR0aDoxMDAlO21hcmdpbjowIGF1dG99Lm16Zl91cGRhdGVJbmZvIHNwYW57dmVydGljYWwtYWxpZ246YmFzZWxpbmV9IgoKLyoqKi8gfSksCgovKioqLyAxODQ6Ci8qKiovICgobW9kdWxlKSA9PiB7Cgptb2R1bGUuZXhwb3J0cyA9ICI8ZGl2IGNsYXNzPVwicGFuZWwtYm9keVwiIHN0eWxlPVwiaGVpZ2h0OiAyMjBweDtcIj5cclxuICA8ZGl2IGNsYXNzPVwibXpmX3VwZGF0ZUluZm9cIj5cclxuICAgIDxwPuabtOaWsOaXpeW/lzo8L3A+XHJcbiAgICA8cD7kv67lpI3kvb/nlKjlm73lpJZpcOi9rOWtmOaWh+S7tuaXtuaKpemUmSMzMTAzOeeahOmXrumimDwvcD5cclxuICAgIDxwPijor6bop4E8YSBocmVmPVwiaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy96aC1DTi9zY3JpcHRzLzQyNDU3NFwiIGNsYXNzPVwibXpmX2xpbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCJcclxuICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIj7ov5HmnJ/pgJrnn6U8L2E+KTwvcD5cclxuICAgIDwvYnI+XHJcbiAgICA8dWw+XHJcbiAgICAgIDxsaT7lhbPogZQ6IDxhIGhyZWY9XCJodHRwczovL2FmZGlhbi5uZXQvQG1lbmd6b25lZmlyZVwiIGNsYXNzPVwibXpmX2xpbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCJcclxuICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiPui1nuWKqemhtTwvYT5cclxuICAgICAgICA8YSBocmVmPVwiaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy96aC1DTi9zY3JpcHRzLzQyNDU3NFwiIGNsYXNzPVwibXpmX2xpbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCJcclxuICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiPuWPjemmiOmhtTwvYT5cclxuICAgICAgPC9saT5cclxuICAgICAgPGxpPuenkuS8oOaWh+ahozogPGEgaHJlZj1cImh0dHBzOi8vbWVuZ3pvbmVmaXJlLmNvZGUubWlzYWthbmV0LmNuL3JhcGlkLXVwbG9hZC11c2Vyc2NyaXB0LWRvY1wiIGNsYXNzPVwibXpmX2xpbmtcIlxyXG4gICAgICAgICAgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiIHRhcmdldD1cIl9ibGFua1wiPui9veeCuTE8L2E+XHJcbiAgICAgICAgPGEgaHJlZj1cImh0dHBzOi8veHRzYXQuZ2l0aHViLmlvL3JhcGlkLXVwbG9hZC11c2Vyc2NyaXB0LWRvY1wiIGNsYXNzPVwibXpmX2xpbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCJcclxuICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiPui9veeCuTI8L2E+XHJcbiAgICAgIDwvbGk+XHJcbiAgICAgIDxsaT7ohJrmnKzmm7TmlrDljoblj7I6IDxhIGhyZWY9XCJodHRwczovL21lbmd6b25lZmlyZS5jb2RlLm1pc2FrYW5ldC5jbi9yYXBpZC11cGxvYWQtdXNlcnNjcmlwdC1kb2MvZGV2ZWxvcG1lbnQv6ISa5pys5pu05paw5pel5b+XXCJcclxuICAgICAgICAgIGNsYXNzPVwibXpmX2xpbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCIgdGFyZ2V0PVwiX2JsYW5rXCI+6L2954K5MTwvYT5cclxuICAgICAgICA8YSBocmVmPVwiaHR0cHM6Ly94dHNhdC5naXRodWIuaW8vcmFwaWQtdXBsb2FkLXVzZXJzY3JpcHQtZG9jL2RldmVsb3BtZW50L+iEmuacrOabtOaWsOaXpeW/l1wiIGNsYXNzPVwibXpmX2xpbmtcIlxyXG4gICAgICAgICAgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiIHRhcmdldD1cIl9ibGFua1wiPui9veeCuTI8L2E+XHJcbiAgICAgIDwvbGk+XHJcbiAgICAgIDxsaT7np5LkvKDnvZHpobXniYjlt6Xlhbc6IDxhIGhyZWY9XCJodHRwczovL3JhcGlkYWNnLmdtZ2FyZC5tb2UvXCIgY2xhc3M9XCJtemZfbGlua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIlxyXG4gICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCI+6L2954K5MTwvYT5cclxuICAgICAgICA8YSBocmVmPVwiaHR0cHM6Ly9tZW5nem9uZWZpcmUuZ2l0aHViLmlvL2JhaWR1cGFuLXJhcGlkdXBsb2FkXCIgY2xhc3M9XCJtemZfbGlua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIlxyXG4gICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCI+6L2954K5MjwvYT5cclxuICAgICAgICA8YSBocmVmPVwiaHR0cHM6Ly9tZW5nem9uZWZpcmUuY29kZS5taXNha2FuZXQuY24vYmFpZHVwYW4tcmFwaWR1cGxvYWRcIiBjbGFzcz1cIm16Zl9saW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiXHJcbiAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIj7ovb3ngrkzPC9hPlxyXG4gICAgICA8L2xpPlxyXG4gICAgICA8bGk+6aG555uu5rqQ56CBOiA8YSBocmVmPVwiaHR0cHM6Ly9naXRodWIuY29tL21lbmd6b25lZmlyZS9yYXBpZC11cGxvYWQtdXNlcnNjcmlwdFwiIGNsYXNzPVwibXpmX2xpbmtcIlxyXG4gICAgICAgICAgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiIHRhcmdldD1cIl9ibGFua1wiPuenkuS8oOiEmuacrDwvYT5cclxuICAgICAgICA8YSBocmVmPVwiaHR0cHM6Ly9naXRodWIuY29tL1hUc2F0L3JhcGlkLXVwbG9hZC11c2Vyc2NyaXB0LWRvY1wiIGNsYXNzPVwibXpmX2xpbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCJcclxuICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiPuenkuS8oOaWh+ahozwvYT5cclxuICAgICAgICA8YSBocmVmPVwiaHR0cHM6Ly9naXRodWIuY29tL21lbmd6b25lZmlyZS9iYWlkdXBhbi1yYXBpZHVwbG9hZFwiIGNsYXNzPVwibXpmX2xpbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCJcclxuICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiPuenkuS8oOe9kemhteeJiOW3peWFtzwvYT5cclxuICAgICAgPC9saT5cclxuICAgIDwvdWw+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PiIKCi8qKiovIH0pLAoKLyoqKi8gMTczOgovKioqLyAoKG1vZHVsZSkgPT4gewoKbW9kdWxlLmV4cG9ydHMgPSAiLnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0e2JveC1zaXppbmc6Ym9yZGVyLWJveDtncmlkLWNvbHVtbjoxLzQhaW1wb3J0YW50O2dyaWQtcm93OjEvNCFpbXBvcnRhbnQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmciA5OWZyIDFmcjtwYWRkaW5nOjFlbTtvdmVyZmxvdy15OmhpZGRlbjtiYWNrZ3JvdW5kOiNmZmY7Ym94LXNoYWRvdzowIDAgMXB4IGhzbGEoMGRlZywwJSwwJSwuMDc1KSwwIDFweCAycHggaHNsYSgwZGVnLDAlLDAlLC4wNzUpLDFweCAycHggNHB4IGhzbGEoMGRlZywwJSwwJSwuMDc1KSwxcHggM3B4IDhweCBoc2xhKDBkZWcsMCUsMCUsLjA3NSksMnB4IDRweCAxNnB4IGhzbGEoMGRlZywwJSwwJSwuMDc1KTtwb2ludGVyLWV2ZW50czphbGx9LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0Pip7Z3JpZC1jb2x1bW46Mn0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXRpdGxle21hcmdpbjouNWVtIDFlbTtwYWRkaW5nOjA7Zm9udC1zaXplOjFlbTt0ZXh0LWFsaWduOmluaXRpYWx9LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1sb2FkaW5ne2p1c3RpZnktY29udGVudDpjZW50ZXJ9LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1pbnB1dHtoZWlnaHQ6MmVtO21hcmdpbjouNWVtO2ZvbnQtc2l6ZToxZW19LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi12YWxpZGF0aW9uLW1lc3NhZ2V7Zm9udC1zaXplOjFlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWZvb3RlcnttYXJnaW46LjVlbSAwIDA7cGFkZGluZzouNWVtIDAgMDtmb250LXNpemU6LjhlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWNsb3Nle2dyaWQtY29sdW1uOjMvMztncmlkLXJvdzoxLzk5O2FsaWduLXNlbGY6Y2VudGVyO3dpZHRoOi44ZW07aGVpZ2h0Oi44ZW07bWFyZ2luOjA7Zm9udC1zaXplOjJlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWh0bWwtY29udGFpbmVye21hcmdpbjouNWVtIDFlbTtwYWRkaW5nOjA7Zm9udC1zaXplOjFlbTt0ZXh0LWFsaWduOmluaXRpYWx9LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1odG1sLWNvbnRhaW5lcjplbXB0eXtwYWRkaW5nOjB9LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1sb2FkZXJ7Z3JpZC1jb2x1bW46MTtncmlkLXJvdzoxLzk5O2FsaWduLXNlbGY6Y2VudGVyO3dpZHRoOjJlbTtoZWlnaHQ6MmVtO21hcmdpbjouMjVlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWljb257Z3JpZC1jb2x1bW46MTtncmlkLXJvdzoxLzk5O2FsaWduLXNlbGY6Y2VudGVyO3dpZHRoOjJlbTttaW4td2lkdGg6MmVtO2hlaWdodDoyZW07bWFyZ2luOjAgLjVlbSAwIDB9LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1pY29uIC5zd2FsMi1pY29uLWNvbnRlbnR7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtmb250LXNpemU6MS44ZW07Zm9udC13ZWlnaHQ6NzAwfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItaWNvbi5zd2FsMi1zdWNjZXNzIC5zd2FsMi1zdWNjZXNzLXJpbmd7d2lkdGg6MmVtO2hlaWdodDoyZW19LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1pY29uLnN3YWwyLWVycm9yIFtjbGFzc149c3dhbDIteC1tYXJrLWxpbmVde3RvcDouODc1ZW07d2lkdGg6MS4zNzVlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWljb24uc3dhbDItZXJyb3IgW2NsYXNzXj1zd2FsMi14LW1hcmstbGluZV1bY2xhc3MkPWxlZnRde2xlZnQ6LjMxMjVlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWljb24uc3dhbDItZXJyb3IgW2NsYXNzXj1zd2FsMi14LW1hcmstbGluZV1bY2xhc3MkPXJpZ2h0XXtyaWdodDouMzEyNWVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItYWN0aW9uc3tqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydDtoZWlnaHQ6YXV0bzttYXJnaW46MDttYXJnaW4tdG9wOi41ZW07cGFkZGluZzowIC41ZW19LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1zdHlsZWR7bWFyZ2luOi4yNWVtIC41ZW07cGFkZGluZzouNGVtIC42ZW07Zm9udC1zaXplOjFlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3N7Ym9yZGVyLWNvbG9yOiNhNWRjODZ9LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1jaXJjdWxhci1saW5lXXtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxLjZlbTtoZWlnaHQ6M2VtO3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpO2JvcmRlci1yYWRpdXM6NTAlfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2VzcyBbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtY2lyY3VsYXItbGluZV1bY2xhc3MkPWxlZnRde3RvcDotLjhlbTtsZWZ0Oi0uNWVtO3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKTt0cmFuc2Zvcm0tb3JpZ2luOjJlbSAyZW07Ym9yZGVyLXJhZGl1czo0ZW0gMCAwIDRlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj1zd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmVdW2NsYXNzJD1yaWdodF17dG9wOi0uMjVlbTtsZWZ0Oi45Mzc1ZW07dHJhbnNmb3JtLW9yaWdpbjowIDEuNWVtO2JvcmRlci1yYWRpdXM6MCA0ZW0gNGVtIDB9LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1zdWNjZXNzIC5zd2FsMi1zdWNjZXNzLXJpbmd7d2lkdGg6MmVtO2hlaWdodDoyZW19LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1zdWNjZXNzIC5zd2FsMi1zdWNjZXNzLWZpeHt0b3A6MDtsZWZ0Oi40Mzc1ZW07d2lkdGg6LjQzNzVlbTtoZWlnaHQ6Mi42ODc1ZW19LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1saW5lXXtoZWlnaHQ6LjMxMjVlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj1zd2FsMi1zdWNjZXNzLWxpbmVdW2NsYXNzJD10aXBde3RvcDoxLjEyNWVtO2xlZnQ6LjE4NzVlbTt3aWR0aDouNzVlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj1zd2FsMi1zdWNjZXNzLWxpbmVdW2NsYXNzJD1sb25nXXt0b3A6LjkzNzVlbTtyaWdodDouMTg3NWVtO3dpZHRoOjEuMzc1ZW19LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1zdWNjZXNzLnN3YWwyLWljb24tc2hvdyAuc3dhbDItc3VjY2Vzcy1saW5lLXRpcHstd2Via2l0LWFuaW1hdGlvbjpzd2FsMi10b2FzdC1hbmltYXRlLXN1Y2Nlc3MtbGluZS10aXAgLjc1czthbmltYXRpb246c3dhbDItdG9hc3QtYW5pbWF0ZS1zdWNjZXNzLWxpbmUtdGlwIC43NXN9LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1zdWNjZXNzLnN3YWwyLWljb24tc2hvdyAuc3dhbDItc3VjY2Vzcy1saW5lLWxvbmd7LXdlYmtpdC1hbmltYXRpb246c3dhbDItdG9hc3QtYW5pbWF0ZS1zdWNjZXNzLWxpbmUtbG9uZyAuNzVzO2FuaW1hdGlvbjpzd2FsMi10b2FzdC1hbmltYXRlLXN1Y2Nlc3MtbGluZS1sb25nIC43NXN9LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0LnN3YWwyLXNob3d7LXdlYmtpdC1hbmltYXRpb246c3dhbDItdG9hc3Qtc2hvdyAuNXM7YW5pbWF0aW9uOnN3YWwyLXRvYXN0LXNob3cgLjVzfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdC5zd2FsMi1oaWRley13ZWJraXQtYW5pbWF0aW9uOnN3YWwyLXRvYXN0LWhpZGUgLjFzIGZvcndhcmRzO2FuaW1hdGlvbjpzd2FsMi10b2FzdC1oaWRlIC4xcyBmb3J3YXJkc30uc3dhbDItY29udGFpbmVye2Rpc3BsYXk6Z3JpZDtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwNjA7dG9wOjA7cmlnaHQ6MDtib3R0b206MDtsZWZ0OjA7Ym94LXNpemluZzpib3JkZXItYm94O2dyaWQtdGVtcGxhdGUtYXJlYXM6XCJ0b3Atc3RhcnQgICAgIHRvcCAgICAgICAgICAgIHRvcC1lbmRcIiBcImNlbnRlci1zdGFydCAgY2VudGVyICAgICAgICAgY2VudGVyLWVuZFwiIFwiYm90dG9tLXN0YXJ0ICBib3R0b20tY2VudGVyICBib3R0b20tZW5kXCI7Z3JpZC10ZW1wbGF0ZS1yb3dzOm1pbm1heCgtd2Via2l0LW1pbi1jb250ZW50LGF1dG8pIG1pbm1heCgtd2Via2l0LW1pbi1jb250ZW50LGF1dG8pIG1pbm1heCgtd2Via2l0LW1pbi1jb250ZW50LGF1dG8pO2dyaWQtdGVtcGxhdGUtcm93czptaW5tYXgobWluLWNvbnRlbnQsYXV0bykgbWlubWF4KG1pbi1jb250ZW50LGF1dG8pIG1pbm1heChtaW4tY29udGVudCxhdXRvKTtoZWlnaHQ6MTAwJTtwYWRkaW5nOi42MjVlbTtvdmVyZmxvdy14OmhpZGRlbjt0cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgLjFzOy13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOnRvdWNofS5zd2FsMi1jb250YWluZXIuc3dhbDItYmFja2Ryb3Atc2hvdywuc3dhbDItY29udGFpbmVyLnN3YWwyLW5vYW5pbWF0aW9ue2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuNCl9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1iYWNrZHJvcC1oaWRle2JhY2tncm91bmQ6MCAwIWltcG9ydGFudH0uc3dhbDItY29udGFpbmVyLnN3YWwyLWJvdHRvbS1zdGFydCwuc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlci1zdGFydCwuc3dhbDItY29udGFpbmVyLnN3YWwyLXRvcC1zdGFydHtncmlkLXRlbXBsYXRlLWNvbHVtbnM6bWlubWF4KDAsMWZyKSBhdXRvIGF1dG99LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20sLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXIsLnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3B7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOmF1dG8gbWlubWF4KDAsMWZyKSBhdXRvfS5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLWVuZCwuc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlci1lbmQsLnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3AtZW5ke2dyaWQtdGVtcGxhdGUtY29sdW1uczphdXRvIGF1dG8gbWlubWF4KDAsMWZyKX0uc3dhbDItY29udGFpbmVyLnN3YWwyLXRvcC1zdGFydD4uc3dhbDItcG9wdXB7YWxpZ24tc2VsZjpzdGFydH0uc3dhbDItY29udGFpbmVyLnN3YWwyLXRvcD4uc3dhbDItcG9wdXB7Z3JpZC1jb2x1bW46MjthbGlnbi1zZWxmOnN0YXJ0O2p1c3RpZnktc2VsZjpjZW50ZXJ9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3AtZW5kPi5zd2FsMi1wb3B1cCwuc3dhbDItY29udGFpbmVyLnN3YWwyLXRvcC1yaWdodD4uc3dhbDItcG9wdXB7Z3JpZC1jb2x1bW46MzthbGlnbi1zZWxmOnN0YXJ0O2p1c3RpZnktc2VsZjplbmR9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXItbGVmdD4uc3dhbDItcG9wdXAsLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXItc3RhcnQ+LnN3YWwyLXBvcHVwe2dyaWQtcm93OjI7YWxpZ24tc2VsZjpjZW50ZXJ9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXI+LnN3YWwyLXBvcHVwe2dyaWQtY29sdW1uOjI7Z3JpZC1yb3c6MjthbGlnbi1zZWxmOmNlbnRlcjtqdXN0aWZ5LXNlbGY6Y2VudGVyfS5zd2FsMi1jb250YWluZXIuc3dhbDItY2VudGVyLWVuZD4uc3dhbDItcG9wdXAsLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXItcmlnaHQ+LnN3YWwyLXBvcHVwe2dyaWQtY29sdW1uOjM7Z3JpZC1yb3c6MjthbGlnbi1zZWxmOmNlbnRlcjtqdXN0aWZ5LXNlbGY6ZW5kfS5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLWxlZnQ+LnN3YWwyLXBvcHVwLC5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLXN0YXJ0Pi5zd2FsMi1wb3B1cHtncmlkLWNvbHVtbjoxO2dyaWQtcm93OjM7YWxpZ24tc2VsZjplbmR9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20+LnN3YWwyLXBvcHVwe2dyaWQtY29sdW1uOjI7Z3JpZC1yb3c6MztqdXN0aWZ5LXNlbGY6Y2VudGVyO2FsaWduLXNlbGY6ZW5kfS5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLWVuZD4uc3dhbDItcG9wdXAsLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tcmlnaHQ+LnN3YWwyLXBvcHVwe2dyaWQtY29sdW1uOjM7Z3JpZC1yb3c6MzthbGlnbi1zZWxmOmVuZDtqdXN0aWZ5LXNlbGY6ZW5kfS5zd2FsMi1jb250YWluZXIuc3dhbDItZ3Jvdy1mdWxsc2NyZWVuPi5zd2FsMi1wb3B1cCwuc3dhbDItY29udGFpbmVyLnN3YWwyLWdyb3ctcm93Pi5zd2FsMi1wb3B1cHtncmlkLWNvbHVtbjoxLzQ7d2lkdGg6MTAwJX0uc3dhbDItY29udGFpbmVyLnN3YWwyLWdyb3ctY29sdW1uPi5zd2FsMi1wb3B1cCwuc3dhbDItY29udGFpbmVyLnN3YWwyLWdyb3ctZnVsbHNjcmVlbj4uc3dhbDItcG9wdXB7Z3JpZC1yb3c6MS80O2FsaWduLXNlbGY6c3RyZXRjaH0uc3dhbDItY29udGFpbmVyLnN3YWwyLW5vLXRyYW5zaXRpb257dHJhbnNpdGlvbjpub25lIWltcG9ydGFudH0uc3dhbDItcG9wdXB7ZGlzcGxheTpub25lO3Bvc2l0aW9uOnJlbGF0aXZlO2JveC1zaXppbmc6Ym9yZGVyLWJveDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6bWlubWF4KDAsMTAwJSk7d2lkdGg6MzJlbTttYXgtd2lkdGg6MTAwJTtwYWRkaW5nOjAgMCAxLjI1ZW07Ym9yZGVyOm5vbmU7Ym9yZGVyLXJhZGl1czo1cHg7YmFja2dyb3VuZDojZmZmO2NvbG9yOiM1NDU0NTQ7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6MXJlbX0uc3dhbDItcG9wdXA6Zm9jdXN7b3V0bGluZTowfS5zd2FsMi1wb3B1cC5zd2FsMi1sb2FkaW5ne292ZXJmbG93LXk6aGlkZGVufS5zd2FsMi10aXRsZXtwb3NpdGlvbjpyZWxhdGl2ZTttYXgtd2lkdGg6MTAwJTttYXJnaW46MDtwYWRkaW5nOi44ZW0gMWVtIDA7Y29sb3I6aW5oZXJpdDtmb250LXNpemU6MS44NzVlbTtmb250LXdlaWdodDo2MDA7dGV4dC1hbGlnbjpjZW50ZXI7dGV4dC10cmFuc2Zvcm06bm9uZTt3b3JkLXdyYXA6YnJlYWstd29yZH0uc3dhbDItYWN0aW9uc3tkaXNwbGF5OmZsZXg7ei1pbmRleDoxO2JveC1zaXppbmc6Ym9yZGVyLWJveDtmbGV4LXdyYXA6d3JhcDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjt3aWR0aDphdXRvO21hcmdpbjoxLjI1ZW0gYXV0byAwO3BhZGRpbmc6MH0uc3dhbDItYWN0aW9uczpub3QoLnN3YWwyLWxvYWRpbmcpIC5zd2FsMi1zdHlsZWRbZGlzYWJsZWRde29wYWNpdHk6LjR9LnN3YWwyLWFjdGlvbnM6bm90KC5zd2FsMi1sb2FkaW5nKSAuc3dhbDItc3R5bGVkOmhvdmVye2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHJnYmEoMCwwLDAsLjEpLHJnYmEoMCwwLDAsLjEpKX0uc3dhbDItYWN0aW9uczpub3QoLnN3YWwyLWxvYWRpbmcpIC5zd2FsMi1zdHlsZWQ6YWN0aXZle2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHJnYmEoMCwwLDAsLjIpLHJnYmEoMCwwLDAsLjIpKX0uc3dhbDItbG9hZGVye2Rpc3BsYXk6bm9uZTthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjt3aWR0aDoyLjJlbTtoZWlnaHQ6Mi4yZW07bWFyZ2luOjAgMS44NzVlbTstd2Via2l0LWFuaW1hdGlvbjpzd2FsMi1yb3RhdGUtbG9hZGluZyAxLjVzIGxpbmVhciAwcyBpbmZpbml0ZSBub3JtYWw7YW5pbWF0aW9uOnN3YWwyLXJvdGF0ZS1sb2FkaW5nIDEuNXMgbGluZWFyIDBzIGluZmluaXRlIG5vcm1hbDtib3JkZXItd2lkdGg6LjI1ZW07Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci1yYWRpdXM6MTAwJTtib3JkZXItY29sb3I6IzI3NzhjNCB0cmFuc3BhcmVudCAjMjc3OGM0IHRyYW5zcGFyZW50fS5zd2FsMi1zdHlsZWR7bWFyZ2luOi4zMTI1ZW07cGFkZGluZzouNjI1ZW0gMS4xZW07dHJhbnNpdGlvbjpib3gtc2hhZG93IC4xcztib3gtc2hhZG93OjAgMCAwIDNweCB0cmFuc3BhcmVudDtmb250LXdlaWdodDo1MDB9LnN3YWwyLXN0eWxlZDpub3QoW2Rpc2FibGVkXSl7Y3Vyc29yOnBvaW50ZXJ9LnN3YWwyLXN0eWxlZC5zd2FsMi1jb25maXJte2JvcmRlcjowO2JvcmRlci1yYWRpdXM6LjI1ZW07YmFja2dyb3VuZDppbml0aWFsO2JhY2tncm91bmQtY29sb3I6IzcwNjZlMDtjb2xvcjojZmZmO2ZvbnQtc2l6ZToxZW19LnN3YWwyLXN0eWxlZC5zd2FsMi1jb25maXJtOmZvY3Vze2JveC1zaGFkb3c6MCAwIDAgM3B4IHJnYmEoMTEyLDEwMiwyMjQsLjUpfS5zd2FsMi1zdHlsZWQuc3dhbDItZGVueXtib3JkZXI6MDtib3JkZXItcmFkaXVzOi4yNWVtO2JhY2tncm91bmQ6aW5pdGlhbDtiYWNrZ3JvdW5kLWNvbG9yOiNkYzM3NDE7Y29sb3I6I2ZmZjtmb250LXNpemU6MWVtfS5zd2FsMi1zdHlsZWQuc3dhbDItZGVueTpmb2N1c3tib3gtc2hhZG93OjAgMCAwIDNweCByZ2JhKDIyMCw1NSw2NSwuNSl9LnN3YWwyLXN0eWxlZC5zd2FsMi1jYW5jZWx7Ym9yZGVyOjA7Ym9yZGVyLXJhZGl1czouMjVlbTtiYWNrZ3JvdW5kOmluaXRpYWw7YmFja2dyb3VuZC1jb2xvcjojNmU3ODgxO2NvbG9yOiNmZmY7Zm9udC1zaXplOjFlbX0uc3dhbDItc3R5bGVkLnN3YWwyLWNhbmNlbDpmb2N1c3tib3gtc2hhZG93OjAgMCAwIDNweCByZ2JhKDExMCwxMjAsMTI5LC41KX0uc3dhbDItc3R5bGVkLnN3YWwyLWRlZmF1bHQtb3V0bGluZTpmb2N1c3tib3gtc2hhZG93OjAgMCAwIDNweCByZ2JhKDEwMCwxNTAsMjAwLC41KX0uc3dhbDItc3R5bGVkOmZvY3Vze291dGxpbmU6MH0uc3dhbDItc3R5bGVkOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5zd2FsMi1mb290ZXJ7anVzdGlmeS1jb250ZW50OmNlbnRlcjttYXJnaW46MWVtIDAgMDtwYWRkaW5nOjFlbSAxZW0gMDtib3JkZXItdG9wOjFweCBzb2xpZCAjZWVlO2NvbG9yOmluaGVyaXQ7Zm9udC1zaXplOjFlbX0uc3dhbDItdGltZXItcHJvZ3Jlc3MtYmFyLWNvbnRhaW5lcntwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDowO2JvdHRvbTowO2xlZnQ6MDtncmlkLWNvbHVtbjphdXRvIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW47Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6NXB4O2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6NXB4fS5zd2FsMi10aW1lci1wcm9ncmVzcy1iYXJ7d2lkdGg6MTAwJTtoZWlnaHQ6LjI1ZW07YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4yKX0uc3dhbDItaW1hZ2V7bWF4LXdpZHRoOjEwMCU7bWFyZ2luOjJlbSBhdXRvIDFlbX0uc3dhbDItY2xvc2V7ei1pbmRleDoyO2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3dpZHRoOjEuMmVtO2hlaWdodDoxLjJlbTttYXJnaW4tdG9wOjA7bWFyZ2luLXJpZ2h0OjA7bWFyZ2luLWJvdHRvbTotMS4yZW07cGFkZGluZzowO292ZXJmbG93OmhpZGRlbjt0cmFuc2l0aW9uOmNvbG9yIC4xcyxib3gtc2hhZG93IC4xcztib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjVweDtiYWNrZ3JvdW5kOjAgMDtjb2xvcjojY2NjO2ZvbnQtZmFtaWx5OnNlcmlmO2ZvbnQtZmFtaWx5Om1vbm9zcGFjZTtmb250LXNpemU6Mi41ZW07Y3Vyc29yOnBvaW50ZXI7anVzdGlmeS1zZWxmOmVuZH0uc3dhbDItY2xvc2U6aG92ZXJ7dHJhbnNmb3JtOm5vbmU7YmFja2dyb3VuZDowIDA7Y29sb3I6I2YyNzQ3NH0uc3dhbDItY2xvc2U6Zm9jdXN7b3V0bGluZTowO2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgM3B4IHJnYmEoMTAwLDE1MCwyMDAsLjUpfS5zd2FsMi1jbG9zZTo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0uc3dhbDItaHRtbC1jb250YWluZXJ7ei1pbmRleDoxO2p1c3RpZnktY29udGVudDpjZW50ZXI7bWFyZ2luOjFlbSAxLjZlbSAuM2VtO3BhZGRpbmc6MDtvdmVyZmxvdzphdXRvO2NvbG9yOmluaGVyaXQ7Zm9udC1zaXplOjEuMTI1ZW07Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0Om5vcm1hbDt0ZXh0LWFsaWduOmNlbnRlcjt3b3JkLXdyYXA6YnJlYWstd29yZDt3b3JkLWJyZWFrOmJyZWFrLXdvcmR9LnN3YWwyLWNoZWNrYm94LC5zd2FsMi1maWxlLC5zd2FsMi1pbnB1dCwuc3dhbDItcmFkaW8sLnN3YWwyLXNlbGVjdCwuc3dhbDItdGV4dGFyZWF7bWFyZ2luOjFlbSAyZW0gM3B4fS5zd2FsMi1maWxlLC5zd2FsMi1pbnB1dCwuc3dhbDItdGV4dGFyZWF7Ym94LXNpemluZzpib3JkZXItYm94O3dpZHRoOmF1dG87dHJhbnNpdGlvbjpib3JkZXItY29sb3IgLjFzLGJveC1zaGFkb3cgLjFzO2JvcmRlcjoxcHggc29saWQgI2Q5ZDlkOTtib3JkZXItcmFkaXVzOi4xODc1ZW07YmFja2dyb3VuZDowIDA7Ym94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDYpLDAgMCAwIDNweCB0cmFuc3BhcmVudDtjb2xvcjppbmhlcml0O2ZvbnQtc2l6ZToxLjEyNWVtfS5zd2FsMi1maWxlLnN3YWwyLWlucHV0ZXJyb3IsLnN3YWwyLWlucHV0LnN3YWwyLWlucHV0ZXJyb3IsLnN3YWwyLXRleHRhcmVhLnN3YWwyLWlucHV0ZXJyb3J7Ym9yZGVyLWNvbG9yOiNmMjc0NzQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDJweCAjZjI3NDc0IWltcG9ydGFudH0uc3dhbDItZmlsZTpmb2N1cywuc3dhbDItaW5wdXQ6Zm9jdXMsLnN3YWwyLXRleHRhcmVhOmZvY3Vze2JvcmRlcjoxcHggc29saWQgI2I0ZGJlZDtvdXRsaW5lOjA7Ym94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDYpLDAgMCAwIDNweCByZ2JhKDEwMCwxNTAsMjAwLC41KX0uc3dhbDItZmlsZTo6LW1vei1wbGFjZWhvbGRlciwuc3dhbDItaW5wdXQ6Oi1tb3otcGxhY2Vob2xkZXIsLnN3YWwyLXRleHRhcmVhOjotbW96LXBsYWNlaG9sZGVye2NvbG9yOiNjY2N9LnN3YWwyLWZpbGU6LW1zLWlucHV0LXBsYWNlaG9sZGVyLC5zd2FsMi1pbnB1dDotbXMtaW5wdXQtcGxhY2Vob2xkZXIsLnN3YWwyLXRleHRhcmVhOi1tcy1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjojY2NjfS5zd2FsMi1maWxlOjpwbGFjZWhvbGRlciwuc3dhbDItaW5wdXQ6OnBsYWNlaG9sZGVyLC5zd2FsMi10ZXh0YXJlYTo6cGxhY2Vob2xkZXJ7Y29sb3I6I2NjY30uc3dhbDItcmFuZ2V7bWFyZ2luOjFlbSAyZW0gM3B4O2JhY2tncm91bmQ6I2ZmZn0uc3dhbDItcmFuZ2UgaW5wdXR7d2lkdGg6ODAlfS5zd2FsMi1yYW5nZSBvdXRwdXR7d2lkdGg6MjAlO2NvbG9yOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NjAwO3RleHQtYWxpZ246Y2VudGVyfS5zd2FsMi1yYW5nZSBpbnB1dCwuc3dhbDItcmFuZ2Ugb3V0cHV0e2hlaWdodDoyLjYyNWVtO3BhZGRpbmc6MDtmb250LXNpemU6MS4xMjVlbTtsaW5lLWhlaWdodDoyLjYyNWVtfS5zd2FsMi1pbnB1dHtoZWlnaHQ6Mi42MjVlbTtwYWRkaW5nOjAgLjc1ZW19LnN3YWwyLWZpbGV7d2lkdGg6NzUlO21hcmdpbi1yaWdodDphdXRvO21hcmdpbi1sZWZ0OmF1dG87YmFja2dyb3VuZDowIDA7Zm9udC1zaXplOjEuMTI1ZW19LnN3YWwyLXRleHRhcmVhe2hlaWdodDo2Ljc1ZW07cGFkZGluZzouNzVlbX0uc3dhbDItc2VsZWN0e21pbi13aWR0aDo1MCU7bWF4LXdpZHRoOjEwMCU7cGFkZGluZzouMzc1ZW0gLjYyNWVtO2JhY2tncm91bmQ6MCAwO2NvbG9yOmluaGVyaXQ7Zm9udC1zaXplOjEuMTI1ZW19LnN3YWwyLWNoZWNrYm94LC5zd2FsMi1yYWRpb3thbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6aW5oZXJpdH0uc3dhbDItY2hlY2tib3ggbGFiZWwsLnN3YWwyLXJhZGlvIGxhYmVse21hcmdpbjowIC42ZW07Zm9udC1zaXplOjEuMTI1ZW19LnN3YWwyLWNoZWNrYm94IGlucHV0LC5zd2FsMi1yYWRpbyBpbnB1dHtmbGV4LXNocmluazowO21hcmdpbjowIC40ZW19LnN3YWwyLWlucHV0LWxhYmVse2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO21hcmdpbjoxZW0gYXV0byAwfS5zd2FsMi12YWxpZGF0aW9uLW1lc3NhZ2V7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7bWFyZ2luOjFlbSAwIDA7cGFkZGluZzouNjI1ZW07b3ZlcmZsb3c6aGlkZGVuO2JhY2tncm91bmQ6I2YwZjBmMDtjb2xvcjojNjY2O2ZvbnQtc2l6ZToxZW07Zm9udC13ZWlnaHQ6MzAwfS5zd2FsMi12YWxpZGF0aW9uLW1lc3NhZ2U6OmJlZm9yZXtjb250ZW50OlwiIVwiO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjEuNWVtO21pbi13aWR0aDoxLjVlbTtoZWlnaHQ6MS41ZW07bWFyZ2luOjAgLjYyNWVtO2JvcmRlci1yYWRpdXM6NTAlO2JhY2tncm91bmQtY29sb3I6I2YyNzQ3NDtjb2xvcjojZmZmO2ZvbnQtd2VpZ2h0OjYwMDtsaW5lLWhlaWdodDoxLjVlbTt0ZXh0LWFsaWduOmNlbnRlcn0uc3dhbDItaWNvbntwb3NpdGlvbjpyZWxhdGl2ZTtib3gtc2l6aW5nOmNvbnRlbnQtYm94O2p1c3RpZnktY29udGVudDpjZW50ZXI7d2lkdGg6NWVtO2hlaWdodDo1ZW07bWFyZ2luOjIuNWVtIGF1dG8gLjZlbTtib3JkZXI6LjI1ZW0gc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXJhZGl1czo1MCU7Ym9yZGVyLWNvbG9yOiMwMDA7Zm9udC1mYW1pbHk6aW5oZXJpdDtsaW5lLWhlaWdodDo1ZW07Y3Vyc29yOmRlZmF1bHQ7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lfS5zd2FsMi1pY29uIC5zd2FsMi1pY29uLWNvbnRlbnR7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtmb250LXNpemU6My43NWVtfS5zd2FsMi1pY29uLnN3YWwyLWVycm9ye2JvcmRlci1jb2xvcjojZjI3NDc0O2NvbG9yOiNmMjc0NzR9LnN3YWwyLWljb24uc3dhbDItZXJyb3IgLnN3YWwyLXgtbWFya3twb3NpdGlvbjpyZWxhdGl2ZTtmbGV4LWdyb3c6MX0uc3dhbDItaWNvbi5zd2FsMi1lcnJvciBbY2xhc3NePXN3YWwyLXgtbWFyay1saW5lXXtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO3RvcDoyLjMxMjVlbTt3aWR0aDoyLjkzNzVlbTtoZWlnaHQ6LjMxMjVlbTtib3JkZXItcmFkaXVzOi4xMjVlbTtiYWNrZ3JvdW5kLWNvbG9yOiNmMjc0NzR9LnN3YWwyLWljb24uc3dhbDItZXJyb3IgW2NsYXNzXj1zd2FsMi14LW1hcmstbGluZV1bY2xhc3MkPWxlZnRde2xlZnQ6MS4wNjI1ZW07dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyl9LnN3YWwyLWljb24uc3dhbDItZXJyb3IgW2NsYXNzXj1zd2FsMi14LW1hcmstbGluZV1bY2xhc3MkPXJpZ2h0XXtyaWdodDoxZW07dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpfS5zd2FsMi1pY29uLnN3YWwyLWVycm9yLnN3YWwyLWljb24tc2hvd3std2Via2l0LWFuaW1hdGlvbjpzd2FsMi1hbmltYXRlLWVycm9yLWljb24gLjVzO2FuaW1hdGlvbjpzd2FsMi1hbmltYXRlLWVycm9yLWljb24gLjVzfS5zd2FsMi1pY29uLnN3YWwyLWVycm9yLnN3YWwyLWljb24tc2hvdyAuc3dhbDIteC1tYXJrey13ZWJraXQtYW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtZXJyb3IteC1tYXJrIC41czthbmltYXRpb246c3dhbDItYW5pbWF0ZS1lcnJvci14LW1hcmsgLjVzfS5zd2FsMi1pY29uLnN3YWwyLXdhcm5pbmd7Ym9yZGVyLWNvbG9yOiNmYWNlYTg7Y29sb3I6I2Y4YmI4Nn0uc3dhbDItaWNvbi5zd2FsMi13YXJuaW5nLnN3YWwyLWljb24tc2hvd3std2Via2l0LWFuaW1hdGlvbjpzd2FsMi1hbmltYXRlLWVycm9yLWljb24gLjVzO2FuaW1hdGlvbjpzd2FsMi1hbmltYXRlLWVycm9yLWljb24gLjVzfS5zd2FsMi1pY29uLnN3YWwyLXdhcm5pbmcuc3dhbDItaWNvbi1zaG93IC5zd2FsMi1pY29uLWNvbnRlbnR7LXdlYmtpdC1hbmltYXRpb246c3dhbDItYW5pbWF0ZS1pLW1hcmsgLjVzO2FuaW1hdGlvbjpzd2FsMi1hbmltYXRlLWktbWFyayAuNXN9LnN3YWwyLWljb24uc3dhbDItaW5mb3tib3JkZXItY29sb3I6IzlkZTBmNjtjb2xvcjojM2ZjM2VlfS5zd2FsMi1pY29uLnN3YWwyLWluZm8uc3dhbDItaWNvbi1zaG93ey13ZWJraXQtYW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtZXJyb3ItaWNvbiAuNXM7YW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtZXJyb3ItaWNvbiAuNXN9LnN3YWwyLWljb24uc3dhbDItaW5mby5zd2FsMi1pY29uLXNob3cgLnN3YWwyLWljb24tY29udGVudHstd2Via2l0LWFuaW1hdGlvbjpzd2FsMi1hbmltYXRlLWktbWFyayAuOHM7YW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtaS1tYXJrIC44c30uc3dhbDItaWNvbi5zd2FsMi1xdWVzdGlvbntib3JkZXItY29sb3I6I2M5ZGFlMTtjb2xvcjojODdhZGJkfS5zd2FsMi1pY29uLnN3YWwyLXF1ZXN0aW9uLnN3YWwyLWljb24tc2hvd3std2Via2l0LWFuaW1hdGlvbjpzd2FsMi1hbmltYXRlLWVycm9yLWljb24gLjVzO2FuaW1hdGlvbjpzd2FsMi1hbmltYXRlLWVycm9yLWljb24gLjVzfS5zd2FsMi1pY29uLnN3YWwyLXF1ZXN0aW9uLnN3YWwyLWljb24tc2hvdyAuc3dhbDItaWNvbi1jb250ZW50ey13ZWJraXQtYW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtcXVlc3Rpb24tbWFyayAuOHM7YW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtcXVlc3Rpb24tbWFyayAuOHN9LnN3YWwyLWljb24uc3dhbDItc3VjY2Vzc3tib3JkZXItY29sb3I6I2E1ZGM4Njtjb2xvcjojYTVkYzg2fS5zd2FsMi1pY29uLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj1zd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmVde3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjMuNzVlbTtoZWlnaHQ6Ny41ZW07dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyk7Ym9yZGVyLXJhZGl1czo1MCV9LnN3YWwyLWljb24uc3dhbDItc3VjY2VzcyBbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtY2lyY3VsYXItbGluZV1bY2xhc3MkPWxlZnRde3RvcDotLjQzNzVlbTtsZWZ0Oi0yLjA2MzVlbTt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyk7dHJhbnNmb3JtLW9yaWdpbjozLjc1ZW0gMy43NWVtO2JvcmRlci1yYWRpdXM6Ny41ZW0gMCAwIDcuNWVtfS5zd2FsMi1pY29uLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj1zd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmVdW2NsYXNzJD1yaWdodF17dG9wOi0uNjg3NWVtO2xlZnQ6MS44NzVlbTt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyk7dHJhbnNmb3JtLW9yaWdpbjowIDMuNzVlbTtib3JkZXItcmFkaXVzOjAgNy41ZW0gNy41ZW0gMH0uc3dhbDItaWNvbi5zd2FsMi1zdWNjZXNzIC5zd2FsMi1zdWNjZXNzLXJpbmd7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoyO3RvcDotLjI1ZW07bGVmdDotLjI1ZW07Ym94LXNpemluZzpjb250ZW50LWJveDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JvcmRlcjouMjVlbSBzb2xpZCByZ2JhKDE2NSwyMjAsMTM0LC4zKTtib3JkZXItcmFkaXVzOjUwJX0uc3dhbDItaWNvbi5zd2FsMi1zdWNjZXNzIC5zd2FsMi1zdWNjZXNzLWZpeHtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjE7dG9wOi41ZW07bGVmdDoxLjYyNWVtO3dpZHRoOi40Mzc1ZW07aGVpZ2h0OjUuNjI1ZW07dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpfS5zd2FsMi1pY29uLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj1zd2FsMi1zdWNjZXNzLWxpbmVde2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoyO2hlaWdodDouMzEyNWVtO2JvcmRlci1yYWRpdXM6LjEyNWVtO2JhY2tncm91bmQtY29sb3I6I2E1ZGM4Nn0uc3dhbDItaWNvbi5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1saW5lXVtjbGFzcyQ9dGlwXXt0b3A6Mi44NzVlbTtsZWZ0Oi44MTI1ZW07d2lkdGg6MS41NjI1ZW07dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyl9LnN3YWwyLWljb24uc3dhbDItc3VjY2VzcyBbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtbGluZV1bY2xhc3MkPWxvbmdde3RvcDoyLjM3NWVtO3JpZ2h0Oi41ZW07d2lkdGg6Mi45Mzc1ZW07dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpfS5zd2FsMi1pY29uLnN3YWwyLXN1Y2Nlc3Muc3dhbDItaWNvbi1zaG93IC5zd2FsMi1zdWNjZXNzLWxpbmUtdGlwey13ZWJraXQtYW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtc3VjY2Vzcy1saW5lLXRpcCAuNzVzO2FuaW1hdGlvbjpzd2FsMi1hbmltYXRlLXN1Y2Nlc3MtbGluZS10aXAgLjc1c30uc3dhbDItaWNvbi5zd2FsMi1zdWNjZXNzLnN3YWwyLWljb24tc2hvdyAuc3dhbDItc3VjY2Vzcy1saW5lLWxvbmd7LXdlYmtpdC1hbmltYXRpb246c3dhbDItYW5pbWF0ZS1zdWNjZXNzLWxpbmUtbG9uZyAuNzVzO2FuaW1hdGlvbjpzd2FsMi1hbmltYXRlLXN1Y2Nlc3MtbGluZS1sb25nIC43NXN9LnN3YWwyLWljb24uc3dhbDItc3VjY2Vzcy5zd2FsMi1pY29uLXNob3cgLnN3YWwyLXN1Y2Nlc3MtY2lyY3VsYXItbGluZS1yaWdodHstd2Via2l0LWFuaW1hdGlvbjpzd2FsMi1yb3RhdGUtc3VjY2Vzcy1jaXJjdWxhci1saW5lIDQuMjVzIGVhc2UtaW47YW5pbWF0aW9uOnN3YWwyLXJvdGF0ZS1zdWNjZXNzLWNpcmN1bGFyLWxpbmUgNC4yNXMgZWFzZS1pbn0uc3dhbDItcHJvZ3Jlc3Mtc3RlcHN7ZmxleC13cmFwOndyYXA7YWxpZ24taXRlbXM6Y2VudGVyO21heC13aWR0aDoxMDAlO21hcmdpbjoxLjI1ZW0gYXV0bztwYWRkaW5nOjA7YmFja2dyb3VuZDowIDA7Zm9udC13ZWlnaHQ6NjAwfS5zd2FsMi1wcm9ncmVzcy1zdGVwcyBsaXtkaXNwbGF5OmlubGluZS1ibG9jaztwb3NpdGlvbjpyZWxhdGl2ZX0uc3dhbDItcHJvZ3Jlc3Mtc3RlcHMgLnN3YWwyLXByb2dyZXNzLXN0ZXB7ei1pbmRleDoyMDtmbGV4LXNocmluazowO3dpZHRoOjJlbTtoZWlnaHQ6MmVtO2JvcmRlci1yYWRpdXM6MmVtO2JhY2tncm91bmQ6IzI3NzhjNDtjb2xvcjojZmZmO2xpbmUtaGVpZ2h0OjJlbTt0ZXh0LWFsaWduOmNlbnRlcn0uc3dhbDItcHJvZ3Jlc3Mtc3RlcHMgLnN3YWwyLXByb2dyZXNzLXN0ZXAuc3dhbDItYWN0aXZlLXByb2dyZXNzLXN0ZXB7YmFja2dyb3VuZDojMjc3OGM0fS5zd2FsMi1wcm9ncmVzcy1zdGVwcyAuc3dhbDItcHJvZ3Jlc3Mtc3RlcC5zd2FsMi1hY3RpdmUtcHJvZ3Jlc3Mtc3RlcH4uc3dhbDItcHJvZ3Jlc3Mtc3RlcHtiYWNrZ3JvdW5kOiNhZGQ4ZTY7Y29sb3I6I2ZmZn0uc3dhbDItcHJvZ3Jlc3Mtc3RlcHMgLnN3YWwyLXByb2dyZXNzLXN0ZXAuc3dhbDItYWN0aXZlLXByb2dyZXNzLXN0ZXB+LnN3YWwyLXByb2dyZXNzLXN0ZXAtbGluZXtiYWNrZ3JvdW5kOiNhZGQ4ZTZ9LnN3YWwyLXByb2dyZXNzLXN0ZXBzIC5zd2FsMi1wcm9ncmVzcy1zdGVwLWxpbmV7ei1pbmRleDoxMDtmbGV4LXNocmluazowO3dpZHRoOjIuNWVtO2hlaWdodDouNGVtO21hcmdpbjowIC0xcHg7YmFja2dyb3VuZDojMjc3OGM0fVtjbGFzc149c3dhbDJdey13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudH0uc3dhbDItc2hvd3std2Via2l0LWFuaW1hdGlvbjpzd2FsMi1zaG93IC4zczthbmltYXRpb246c3dhbDItc2hvdyAuM3N9LnN3YWwyLWhpZGV7LXdlYmtpdC1hbmltYXRpb246c3dhbDItaGlkZSAuMTVzIGZvcndhcmRzO2FuaW1hdGlvbjpzd2FsMi1oaWRlIC4xNXMgZm9yd2FyZHN9LnN3YWwyLW5vYW5pbWF0aW9ue3RyYW5zaXRpb246bm9uZX0uc3dhbDItc2Nyb2xsYmFyLW1lYXN1cmV7cG9zaXRpb246YWJzb2x1dGU7dG9wOi05OTk5cHg7d2lkdGg6NTBweDtoZWlnaHQ6NTBweDtvdmVyZmxvdzpzY3JvbGx9LnN3YWwyLXJ0bCAuc3dhbDItY2xvc2V7bWFyZ2luLXJpZ2h0OmluaXRpYWw7bWFyZ2luLWxlZnQ6MH0uc3dhbDItcnRsIC5zd2FsMi10aW1lci1wcm9ncmVzcy1iYXJ7cmlnaHQ6MDtsZWZ0OmF1dG99LnN3YWwyLW5vLXdhcntkaXNwbGF5OmZsZXg7cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDYxO3RvcDowO2xlZnQ6MDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjt3aWR0aDoxMDAlO2hlaWdodDozLjM3NWVtO2JhY2tncm91bmQ6IzIwMjMyYTtjb2xvcjojZmZmO3RleHQtYWxpZ246Y2VudGVyfS5zd2FsMi1uby13YXIgYXtjb2xvcjojNjFkYWZiO3RleHQtZGVjb3JhdGlvbjpub25lfS5zd2FsMi1uby13YXIgYTpob3Zlcnt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lfUAtd2Via2l0LWtleWZyYW1lcyBzd2FsMi10b2FzdC1zaG93ezAle3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0uNjI1ZW0pIHJvdGF0ZVooMmRlZyl9MzMle3RyYW5zZm9ybTp0cmFuc2xhdGVZKDApIHJvdGF0ZVooLTJkZWcpfTY2JXt0cmFuc2Zvcm06dHJhbnNsYXRlWSguMzEyNWVtKSByb3RhdGVaKDJkZWcpfTEwMCV7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCkgcm90YXRlWigwKX19QGtleWZyYW1lcyBzd2FsMi10b2FzdC1zaG93ezAle3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0uNjI1ZW0pIHJvdGF0ZVooMmRlZyl9MzMle3RyYW5zZm9ybTp0cmFuc2xhdGVZKDApIHJvdGF0ZVooLTJkZWcpfTY2JXt0cmFuc2Zvcm06dHJhbnNsYXRlWSguMzEyNWVtKSByb3RhdGVaKDJkZWcpfTEwMCV7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCkgcm90YXRlWigwKX19QC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLXRvYXN0LWhpZGV7MTAwJXt0cmFuc2Zvcm06cm90YXRlWigxZGVnKTtvcGFjaXR5OjB9fUBrZXlmcmFtZXMgc3dhbDItdG9hc3QtaGlkZXsxMDAle3RyYW5zZm9ybTpyb3RhdGVaKDFkZWcpO29wYWNpdHk6MH19QC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLXRvYXN0LWFuaW1hdGUtc3VjY2Vzcy1saW5lLXRpcHswJXt0b3A6LjU2MjVlbTtsZWZ0Oi4wNjI1ZW07d2lkdGg6MH01NCV7dG9wOi4xMjVlbTtsZWZ0Oi4xMjVlbTt3aWR0aDowfTcwJXt0b3A6LjYyNWVtO2xlZnQ6LS4yNWVtO3dpZHRoOjEuNjI1ZW19ODQle3RvcDoxLjA2MjVlbTtsZWZ0Oi43NWVtO3dpZHRoOi41ZW19MTAwJXt0b3A6MS4xMjVlbTtsZWZ0Oi4xODc1ZW07d2lkdGg6Ljc1ZW19fUBrZXlmcmFtZXMgc3dhbDItdG9hc3QtYW5pbWF0ZS1zdWNjZXNzLWxpbmUtdGlwezAle3RvcDouNTYyNWVtO2xlZnQ6LjA2MjVlbTt3aWR0aDowfTU0JXt0b3A6LjEyNWVtO2xlZnQ6LjEyNWVtO3dpZHRoOjB9NzAle3RvcDouNjI1ZW07bGVmdDotLjI1ZW07d2lkdGg6MS42MjVlbX04NCV7dG9wOjEuMDYyNWVtO2xlZnQ6Ljc1ZW07d2lkdGg6LjVlbX0xMDAle3RvcDoxLjEyNWVtO2xlZnQ6LjE4NzVlbTt3aWR0aDouNzVlbX19QC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLXRvYXN0LWFuaW1hdGUtc3VjY2Vzcy1saW5lLWxvbmd7MCV7dG9wOjEuNjI1ZW07cmlnaHQ6MS4zNzVlbTt3aWR0aDowfTY1JXt0b3A6MS4yNWVtO3JpZ2h0Oi45Mzc1ZW07d2lkdGg6MH04NCV7dG9wOi45Mzc1ZW07cmlnaHQ6MDt3aWR0aDoxLjEyNWVtfTEwMCV7dG9wOi45Mzc1ZW07cmlnaHQ6LjE4NzVlbTt3aWR0aDoxLjM3NWVtfX1Aa2V5ZnJhbWVzIHN3YWwyLXRvYXN0LWFuaW1hdGUtc3VjY2Vzcy1saW5lLWxvbmd7MCV7dG9wOjEuNjI1ZW07cmlnaHQ6MS4zNzVlbTt3aWR0aDowfTY1JXt0b3A6MS4yNWVtO3JpZ2h0Oi45Mzc1ZW07d2lkdGg6MH04NCV7dG9wOi45Mzc1ZW07cmlnaHQ6MDt3aWR0aDoxLjEyNWVtfTEwMCV7dG9wOi45Mzc1ZW07cmlnaHQ6LjE4NzVlbTt3aWR0aDoxLjM3NWVtfX1ALXdlYmtpdC1rZXlmcmFtZXMgc3dhbDItc2hvd3swJXt0cmFuc2Zvcm06c2NhbGUoLjcpfTQ1JXt0cmFuc2Zvcm06c2NhbGUoMS4wNSl9ODAle3RyYW5zZm9ybTpzY2FsZSguOTUpfTEwMCV7dHJhbnNmb3JtOnNjYWxlKDEpfX1Aa2V5ZnJhbWVzIHN3YWwyLXNob3d7MCV7dHJhbnNmb3JtOnNjYWxlKC43KX00NSV7dHJhbnNmb3JtOnNjYWxlKDEuMDUpfTgwJXt0cmFuc2Zvcm06c2NhbGUoLjk1KX0xMDAle3RyYW5zZm9ybTpzY2FsZSgxKX19QC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLWhpZGV7MCV7dHJhbnNmb3JtOnNjYWxlKDEpO29wYWNpdHk6MX0xMDAle3RyYW5zZm9ybTpzY2FsZSguNSk7b3BhY2l0eTowfX1Aa2V5ZnJhbWVzIHN3YWwyLWhpZGV7MCV7dHJhbnNmb3JtOnNjYWxlKDEpO29wYWNpdHk6MX0xMDAle3RyYW5zZm9ybTpzY2FsZSguNSk7b3BhY2l0eTowfX1ALXdlYmtpdC1rZXlmcmFtZXMgc3dhbDItYW5pbWF0ZS1zdWNjZXNzLWxpbmUtdGlwezAle3RvcDoxLjE4NzVlbTtsZWZ0Oi4wNjI1ZW07d2lkdGg6MH01NCV7dG9wOjEuMDYyNWVtO2xlZnQ6LjEyNWVtO3dpZHRoOjB9NzAle3RvcDoyLjE4NzVlbTtsZWZ0Oi0uMzc1ZW07d2lkdGg6My4xMjVlbX04NCV7dG9wOjNlbTtsZWZ0OjEuMzEyNWVtO3dpZHRoOjEuMDYyNWVtfTEwMCV7dG9wOjIuODEyNWVtO2xlZnQ6LjgxMjVlbTt3aWR0aDoxLjU2MjVlbX19QGtleWZyYW1lcyBzd2FsMi1hbmltYXRlLXN1Y2Nlc3MtbGluZS10aXB7MCV7dG9wOjEuMTg3NWVtO2xlZnQ6LjA2MjVlbTt3aWR0aDowfTU0JXt0b3A6MS4wNjI1ZW07bGVmdDouMTI1ZW07d2lkdGg6MH03MCV7dG9wOjIuMTg3NWVtO2xlZnQ6LS4zNzVlbTt3aWR0aDozLjEyNWVtfTg0JXt0b3A6M2VtO2xlZnQ6MS4zMTI1ZW07d2lkdGg6MS4wNjI1ZW19MTAwJXt0b3A6Mi44MTI1ZW07bGVmdDouODEyNWVtO3dpZHRoOjEuNTYyNWVtfX1ALXdlYmtpdC1rZXlmcmFtZXMgc3dhbDItYW5pbWF0ZS1zdWNjZXNzLWxpbmUtbG9uZ3swJXt0b3A6My4zNzVlbTtyaWdodDoyLjg3NWVtO3dpZHRoOjB9NjUle3RvcDozLjM3NWVtO3JpZ2h0OjIuODc1ZW07d2lkdGg6MH04NCV7dG9wOjIuMTg3NWVtO3JpZ2h0OjA7d2lkdGg6My40Mzc1ZW19MTAwJXt0b3A6Mi4zNzVlbTtyaWdodDouNWVtO3dpZHRoOjIuOTM3NWVtfX1Aa2V5ZnJhbWVzIHN3YWwyLWFuaW1hdGUtc3VjY2Vzcy1saW5lLWxvbmd7MCV7dG9wOjMuMzc1ZW07cmlnaHQ6Mi44NzVlbTt3aWR0aDowfTY1JXt0b3A6My4zNzVlbTtyaWdodDoyLjg3NWVtO3dpZHRoOjB9ODQle3RvcDoyLjE4NzVlbTtyaWdodDowO3dpZHRoOjMuNDM3NWVtfTEwMCV7dG9wOjIuMzc1ZW07cmlnaHQ6LjVlbTt3aWR0aDoyLjkzNzVlbX19QC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLXJvdGF0ZS1zdWNjZXNzLWNpcmN1bGFyLWxpbmV7MCV7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpfTUle3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKX0xMiV7dHJhbnNmb3JtOnJvdGF0ZSgtNDA1ZGVnKX0xMDAle3RyYW5zZm9ybTpyb3RhdGUoLTQwNWRlZyl9fUBrZXlmcmFtZXMgc3dhbDItcm90YXRlLXN1Y2Nlc3MtY2lyY3VsYXItbGluZXswJXt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyl9NSV7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpfTEyJXt0cmFuc2Zvcm06cm90YXRlKC00MDVkZWcpfTEwMCV7dHJhbnNmb3JtOnJvdGF0ZSgtNDA1ZGVnKX19QC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLWFuaW1hdGUtZXJyb3IteC1tYXJrezAle21hcmdpbi10b3A6MS42MjVlbTt0cmFuc2Zvcm06c2NhbGUoLjQpO29wYWNpdHk6MH01MCV7bWFyZ2luLXRvcDoxLjYyNWVtO3RyYW5zZm9ybTpzY2FsZSguNCk7b3BhY2l0eTowfTgwJXttYXJnaW4tdG9wOi0uMzc1ZW07dHJhbnNmb3JtOnNjYWxlKDEuMTUpfTEwMCV7bWFyZ2luLXRvcDowO3RyYW5zZm9ybTpzY2FsZSgxKTtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgc3dhbDItYW5pbWF0ZS1lcnJvci14LW1hcmt7MCV7bWFyZ2luLXRvcDoxLjYyNWVtO3RyYW5zZm9ybTpzY2FsZSguNCk7b3BhY2l0eTowfTUwJXttYXJnaW4tdG9wOjEuNjI1ZW07dHJhbnNmb3JtOnNjYWxlKC40KTtvcGFjaXR5OjB9ODAle21hcmdpbi10b3A6LS4zNzVlbTt0cmFuc2Zvcm06c2NhbGUoMS4xNSl9MTAwJXttYXJnaW4tdG9wOjA7dHJhbnNmb3JtOnNjYWxlKDEpO29wYWNpdHk6MX19QC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLWFuaW1hdGUtZXJyb3ItaWNvbnswJXt0cmFuc2Zvcm06cm90YXRlWCgxMDBkZWcpO29wYWNpdHk6MH0xMDAle3RyYW5zZm9ybTpyb3RhdGVYKDApO29wYWNpdHk6MX19QGtleWZyYW1lcyBzd2FsMi1hbmltYXRlLWVycm9yLWljb257MCV7dHJhbnNmb3JtOnJvdGF0ZVgoMTAwZGVnKTtvcGFjaXR5OjB9MTAwJXt0cmFuc2Zvcm06cm90YXRlWCgwKTtvcGFjaXR5OjF9fUAtd2Via2l0LWtleWZyYW1lcyBzd2FsMi1yb3RhdGUtbG9hZGluZ3swJXt0cmFuc2Zvcm06cm90YXRlKDApfTEwMCV7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpfX1Aa2V5ZnJhbWVzIHN3YWwyLXJvdGF0ZS1sb2FkaW5nezAle3RyYW5zZm9ybTpyb3RhdGUoMCl9MTAwJXt0cmFuc2Zvcm06cm90YXRlKDM2MGRlZyl9fUAtd2Via2l0LWtleWZyYW1lcyBzd2FsMi1hbmltYXRlLXF1ZXN0aW9uLW1hcmt7MCV7dHJhbnNmb3JtOnJvdGF0ZVkoLTM2MGRlZyl9MTAwJXt0cmFuc2Zvcm06cm90YXRlWSgwKX19QGtleWZyYW1lcyBzd2FsMi1hbmltYXRlLXF1ZXN0aW9uLW1hcmt7MCV7dHJhbnNmb3JtOnJvdGF0ZVkoLTM2MGRlZyl9MTAwJXt0cmFuc2Zvcm06cm90YXRlWSgwKX19QC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLWFuaW1hdGUtaS1tYXJrezAle3RyYW5zZm9ybTpyb3RhdGVaKDQ1ZGVnKTtvcGFjaXR5OjB9MjUle3RyYW5zZm9ybTpyb3RhdGVaKC0yNWRlZyk7b3BhY2l0eTouNH01MCV7dHJhbnNmb3JtOnJvdGF0ZVooMTVkZWcpO29wYWNpdHk6Ljh9NzUle3RyYW5zZm9ybTpyb3RhdGVaKC01ZGVnKTtvcGFjaXR5OjF9MTAwJXt0cmFuc2Zvcm06cm90YXRlWCgwKTtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgc3dhbDItYW5pbWF0ZS1pLW1hcmt7MCV7dHJhbnNmb3JtOnJvdGF0ZVooNDVkZWcpO29wYWNpdHk6MH0yNSV7dHJhbnNmb3JtOnJvdGF0ZVooLTI1ZGVnKTtvcGFjaXR5Oi40fTUwJXt0cmFuc2Zvcm06cm90YXRlWigxNWRlZyk7b3BhY2l0eTouOH03NSV7dHJhbnNmb3JtOnJvdGF0ZVooLTVkZWcpO29wYWNpdHk6MX0xMDAle3RyYW5zZm9ybTpyb3RhdGVYKDApO29wYWNpdHk6MX19Ym9keS5zd2FsMi1zaG93bjpub3QoLnN3YWwyLW5vLWJhY2tkcm9wKTpub3QoLnN3YWwyLXRvYXN0LXNob3duKXtvdmVyZmxvdzpoaWRkZW59Ym9keS5zd2FsMi1oZWlnaHQtYXV0b3toZWlnaHQ6YXV0byFpbXBvcnRhbnR9Ym9keS5zd2FsMi1uby1iYWNrZHJvcCAuc3dhbDItY29udGFpbmVye2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQhaW1wb3J0YW50O3BvaW50ZXItZXZlbnRzOm5vbmV9Ym9keS5zd2FsMi1uby1iYWNrZHJvcCAuc3dhbDItY29udGFpbmVyIC5zd2FsMi1wb3B1cHtwb2ludGVyLWV2ZW50czphbGx9Ym9keS5zd2FsMi1uby1iYWNrZHJvcCAuc3dhbDItY29udGFpbmVyIC5zd2FsMi1tb2RhbHtib3gtc2hhZG93OjAgMCAxMHB4IHJnYmEoMCwwLDAsLjQpfUBtZWRpYSBwcmludHtib2R5LnN3YWwyLXNob3duOm5vdCguc3dhbDItbm8tYmFja2Ryb3ApOm5vdCguc3dhbDItdG9hc3Qtc2hvd24pe292ZXJmbG93LXk6c2Nyb2xsIWltcG9ydGFudH1ib2R5LnN3YWwyLXNob3duOm5vdCguc3dhbDItbm8tYmFja2Ryb3ApOm5vdCguc3dhbDItdG9hc3Qtc2hvd24pPlthcmlhLWhpZGRlbj10cnVlXXtkaXNwbGF5Om5vbmV9Ym9keS5zd2FsMi1zaG93bjpub3QoLnN3YWwyLW5vLWJhY2tkcm9wKTpub3QoLnN3YWwyLXRvYXN0LXNob3duKSAuc3dhbDItY29udGFpbmVye3Bvc2l0aW9uOnN0YXRpYyFpbXBvcnRhbnR9fWJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lcntib3gtc2l6aW5nOmJvcmRlci1ib3g7d2lkdGg6MzYwcHg7bWF4LXdpZHRoOjEwMCU7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtwb2ludGVyLWV2ZW50czpub25lfWJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3B7dG9wOjA7cmlnaHQ6YXV0bztib3R0b206YXV0bztsZWZ0OjUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKX1ib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItdG9wLWVuZCxib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItdG9wLXJpZ2h0e3RvcDowO3JpZ2h0OjA7Ym90dG9tOmF1dG87bGVmdDphdXRvfWJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3AtbGVmdCxib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItdG9wLXN0YXJ0e3RvcDowO3JpZ2h0OmF1dG87Ym90dG9tOmF1dG87bGVmdDowfWJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXItbGVmdCxib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItY2VudGVyLXN0YXJ0e3RvcDo1MCU7cmlnaHQ6YXV0bztib3R0b206YXV0bztsZWZ0OjA7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTUwJSl9Ym9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlcnt0b3A6NTAlO3JpZ2h0OmF1dG87Ym90dG9tOmF1dG87bGVmdDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpfWJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXItZW5kLGJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXItcmlnaHR7dG9wOjUwJTtyaWdodDowO2JvdHRvbTphdXRvO2xlZnQ6YXV0bzt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKX1ib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLWxlZnQsYm9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLWJvdHRvbS1zdGFydHt0b3A6YXV0bztyaWdodDphdXRvO2JvdHRvbTowO2xlZnQ6MH1ib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9te3RvcDphdXRvO3JpZ2h0OmF1dG87Ym90dG9tOjA7bGVmdDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSl9Ym9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLWJvdHRvbS1lbmQsYm9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLWJvdHRvbS1yaWdodHt0b3A6YXV0bztyaWdodDowO2JvdHRvbTowO2xlZnQ6YXV0b30iCgovKioqLyB9KQoKLyoqKioqKi8gCX0pOwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqLyAJLy8gVGhlIG1vZHVsZSBjYWNoZQovKioqKioqLyAJdmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9OwovKioqKioqLyAJCi8qKioqKiovIAkvLyBUaGUgcmVxdWlyZSBmdW5jdGlvbgovKioqKioqLyAJZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkgewovKioqKioqLyAJCS8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZQovKioqKioqLyAJCXZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdOwovKioqKioqLyAJCWlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkgewovKioqKioqLyAJCQlyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7Ci8qKioqKiovIAkJfQovKioqKioqLyAJCS8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpCi8qKioqKiovIAkJdmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7Ci8qKioqKiovIAkJCS8vIG5vIG1vZHVsZS5pZCBuZWVkZWQKLyoqKioqKi8gCQkJLy8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWQKLyoqKioqKi8gCQkJZXhwb3J0czoge30KLyoqKioqKi8gCQl9OwovKioqKioqLyAJCi8qKioqKiovIAkJLy8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uCi8qKioqKiovIAkJX193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7Ci8qKioqKiovIAkKLyoqKioqKi8gCQkvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZQovKioqKioqLyAJCXJldHVybiBtb2R1bGUuZXhwb3J0czsKLyoqKioqKi8gCX0KLyoqKioqKi8gCQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqLyAJLyogd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQgKi8KLyoqKioqKi8gCSgoKSA9PiB7Ci8qKioqKiovIAkJLy8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXMKLyoqKioqKi8gCQlfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7Ci8qKioqKiovIAkJCXZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgPwovKioqKioqLyAJCQkJKCkgPT4gKG1vZHVsZVsnZGVmYXVsdCddKSA6Ci8qKioqKiovIAkJCQkoKSA9PiAobW9kdWxlKTsKLyoqKioqKi8gCQkJX193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7Ci8qKioqKiovIAkJCXJldHVybiBnZXR0ZXI7Ci8qKioqKiovIAkJfTsKLyoqKioqKi8gCX0pKCk7Ci8qKioqKiovIAkKLyoqKioqKi8gCS8qIHdlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyAqLwovKioqKioqLyAJKCgpID0+IHsKLyoqKioqKi8gCQkvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzCi8qKioqKiovIAkJX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHsKLyoqKioqKi8gCQkJZm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikgewovKioqKioqLyAJCQkJaWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7Ci8qKioqKiovIAkJCQkJT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTsKLyoqKioqKi8gCQkJCX0KLyoqKioqKi8gCQkJfQovKioqKioqLyAJCX07Ci8qKioqKiovIAl9KSgpOwovKioqKioqLyAJCi8qKioqKiovIAkvKiB3ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kICovCi8qKioqKiovIAkoKCkgPT4gewovKioqKioqLyAJCV9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkKLyoqKioqKi8gCX0pKCk7Ci8qKioqKiovIAkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdmFyIF9fd2VicGFja19leHBvcnRzX18gPSB7fTsKLy8gVGhpcyBlbnRyeSBuZWVkIHRvIGJlIHdyYXBwZWQgaW4gYW4gSUlGRSBiZWNhdXNlIGl0IG5lZWQgdG8gYmUgaW4gc3RyaWN0IG1vZGUuCigoKSA9PiB7CiJ1c2Ugc3RyaWN0IjsKCi8vIEVYVEVSTkFMIE1PRFVMRTogLi9zcmMvY3NzL2FwcC5zY3NzCnZhciBhcHAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1KTsKdmFyIGFwcF9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihhcHApOwovLyBFWFRFUk5BTCBNT0RVTEU6IC4vc3JjL2Nzcy9zd2VldGFsZXJ0Mi5taW4uY3NzCnZhciBzd2VldGFsZXJ0Ml9taW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3Myk7CnZhciBzd2VldGFsZXJ0Ml9taW5fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oc3dlZXRhbGVydDJfbWluKTsKOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2NvbW1vbi9jb25zdC50c3gKdmFyIHZlcnNpb24gPSAiMi41LjIiOyAvLyDlvZPliY3niYjmnKzlj7cKdmFyIHVwZGF0ZURhdGUgPSAiMjIuMTIuNSI7IC8vIOabtOaWsOW8ueeql+eahOaXpeacnwp2YXIgdXBkYXRlSW5mb1ZlciA9ICIyLjUuMCI7IC8vIOabtOaWsOW8ueeql+eahOeJiOacrCwg5rKh5b+F6KaB5o+Q56S655qE6Z2e5Yqf6IO95oCn5pu05paw5bCx5LiN5by556qX5LqGCnZhciBzd2FsQ3NzVmVyID0gIjEuNy40IjsgLy8g55Sx5LqO5YW25LuW5Li76aKY55qEQ3Nz5Luj56CB5Lya57yT5a2Y5Yiw5pys5ZywLCDmlYXmm7TmlrDkuLvpopjljIXniYjmnKwodXJsKeaXtiwg6ZyA6KaB5ZCM5pe25pu05paw6K+l5a2X5q615Lul5Yi35paw57yT5a2YCnZhciBkb25hdGVWZXIgPSAiMi4zLjAiOyAvLyDnlKjkuo7mo4DmtYvlj6/lhbPpl63nmoTotZ7liqnmj5DnpLrnmoTniYjmnKzlj7cKdmFyIGZlZWRiYWNrVmVyID0gIjIuMy4wIjsgLy8g55So5LqO5qOA5rWL5Y+v5YWz6Zet55qE5Y+N6aaI5o+Q56S655qE54mI5pys5Y+3CnZhciBsb2NVcmwgPSBsb2NhdGlvbi5ocmVmOwp2YXIgYmFpZHVOZXdQYWdlID0gImJhaWR1LmNvbS9kaXNrL21haW4iOyAvLyDljLnphY3mlrDniYjluqbnm5jnlYzpnaIKdmFyIFRBRyA9ICJb56eS5Lyg6ZO+5o6l5o+Q5Y+WIGJ5IG1lbmd6b25lZmlyZV0iOwp2YXIgaG9tZVBhZ2UgPSAiaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy96aC1DTi9zY3JpcHRzLzQyNDU3NCI7CnZhciBkb25hdGVQYWdlID0gImh0dHBzOi8vYWZkaWFuLm5ldC9AbWVuZ3pvbmVmaXJlIjsKdmFyIGFqYXhFcnJvciA9IDUxNDsgLy8g6Ieq5a6a5LmJYWpheOivt+axguWksei0peaXtueahOmUmeivr+eggSjkuI3og73kuI5odHRwIHN0YXR1c0NvZGXlhrLnqoEpCnZhciBiZGxpbmtQcmVmaXggPSAiaHR0cHM6Ly9wYW4uYmFpZHUuY29tLyNiZGxpbms9IjsgLy8g5LiA6ZSu56eS5Lyg6ZO+5o6l55qE5YmN57yACnZhciBjb21tYW5kTGlzdCA9IFsic2V0IiwgImdlbiIsICJpbmZvIl07IC8vIOi9rOWtmOi+k+WFpeahhuWGheaUr+aMgei+k+WFpeeahOWRveS7pAp2YXIgVUEgPSAibmV0ZGlzazsyLjIuNTEuNjtuZXRkaXNrOzEwLjAuNjM7UEM7YW5kcm9pZC1hbmRyb2lkO1FUUC8xLjAuMzIuMiI7IC8vIOiHquWumuS5iVVzZXItQWdlbnQKdmFyIGV4dENzc1VybCA9IHsKICAgIERlZmF1bHQ6ICIiLAogICAgRGFyazogImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHN3ZWV0YWxlcnQyL3RoZW1lLWRhcmtANS9kYXJrLm1pbi5jc3MiLAogICAgIldvcmRQcmVzcyBBZG1pbiI6ICJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0Bzd2VldGFsZXJ0Mi90aGVtZS13b3JkcHJlc3MtYWRtaW5ANS93b3JkcHJlc3MtYWRtaW4ubWluLmNzcyIsCiAgICAiTWF0ZXJpYWwgVUkiOiAiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac3dlZXRhbGVydDIvdGhlbWUtbWF0ZXJpYWwtdWlANS9tYXRlcmlhbC11aS5taW4uY3NzIiwKICAgIEJ1bG1hOiAiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac3dlZXRhbGVydDIvdGhlbWUtYnVsbWFANS9idWxtYS5taW4uY3NzIiwKICAgICJCb290c3RyYXAgNCI6ICJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0Bzd2VldGFsZXJ0Mi90aGVtZS1ib290c3RyYXAtNC9ib290c3RyYXAtNC5taW4uY3NzIiwKfTsgLy8g5ZCE5Li76aKY5YyF5a+55bqU55qEdXJsCnZhciBhcHBFcnJvciA9IHsKICAgIFN3YWxDc3NJbnZhbGlkOiAiXHU2ODM3XHU1RjBGXHU1MzA1XHU2NTcwXHU2MzZFXHU5NTE5XHU4QkVGLCBcdThCRjdcdTUyNERcdTVGODBcdTgxMUFcdTY3MkNcdTk4NzVcdTUzQ0RcdTk5ODg6XG4iICsgaG9tZVBhZ2UsCiAgICBTd2FsQ3NzRXJyUmVxOiAiXHU2ODM3XHU1RjBGXHU1MzA1XHU1MkEwXHU4RjdEXHU1OTMxXHU4RDI1LCBcdThCRjdcdTUyNERcdTVGODBcdTgxMUFcdTY3MkNcdTk4NzVcdTUzQ0RcdTk5ODg6XG4iICsgaG9tZVBhZ2UgKyAiXG5cdTk1MTlcdThCRUZcdTRFRTNcdTc4MDE6ICIsCiAgICBDbGlwYm9hcmRQcmVtaXNzaW9uRXJyOiAn5L2/55SoICLnm5HlkKzliarotLTmnb8iIOWKn+iDvemcgOimgeWFgeiuuOWJqui0tOadv+adg+mZkCFcbuivpeWKn+iDveWPquaUr+aMgUNocm9tZeezuy9FZGdlL09wZXJh5rWP6KeI5ZmoLCDkuI3mlK/mjIFGaXJlZm94LCDlkIzml7bms6jmhI/kvb/nlKhodHRwc+iuv+mXrumhtemdoiAoaHR0cOiuv+mXruS8muWvvOiHtOa1j+iniOWZqOebtOaOpeemgeatouWJqui0tOadv+adg+mZkCknLAp9OyAvLyDkuLvnqIvluo/lvILluLgKdmFyIGFwcFdhcm5pbmcgPSB7CiAgICBmYXN0R2VuZXJhdGVXYXJuOiAn5L2/55SoICLmnoHpgJ/nlJ/miJAiIOWKn+iDveivt+azqOaEjzpcbuS8mOeCuTpcbjEuIOaegeWkp+W5heW6puaPkOmrmOenkuS8oOeUn+aIkOmAn+W6plxuMi4g5pyJ5pWI6YG/5YWNICJtZDXojrflj5blpLHotKUoIzk5NikiICLmjqXlj6PpmZDliLborr/pl64oIzQwMykiXG7nvLrngrk6XG4xLiDnlJ/miJDlkozosJDmlofku7bnp5LkvKDml7blpKfmpoLnjofmraPluLjnlJ/miJAgKOmdnuaegemAn+eUn+aIkOWImeS8muaKpemUmSMxOTE5KVxuMi4g55Sf5oiQ55qE56eS5Lyg5qC85byP5Li6566A5YyW54mILCDlj6rkv53or4HmnIDmlrDniYjnmoQg56eS5Lyg6ISa5pysIOWSjCDnp5LkvKDnvZHpobXniYgg5pSv5oyB6L2s5a2YXG5cbiog5q2k5Yqf6IO95Li6YmV0Yea1i+ivlSwg6Iul5Ye6546w6Zeu6aKY6K+35qC55o2u6K6+572u6aG15YaF55qEICLor7TmmI7mlofmoaMiIOi/m+ihjOWPjemmiCcsCn07IC8vIOS4u+eoi+W6j+WQhOWKn+iDveitpuWRii/mj5DphpIKdmFyIGRvY1ByZWZpeCA9ICJodHRwczovL21lbmd6b25lZmlyZS5jb2RlLm1pc2FrYW5ldC5jbi9yYXBpZC11cGxvYWQtdXNlcnNjcmlwdC1kb2MvZG9jdW1lbnQiOwp2YXIgZG9jUHJlZml4MiA9ICJodHRwczovL3h0c2F0LmdpdGh1Yi5pby9yYXBpZC11cGxvYWQtdXNlcnNjcmlwdC1kb2MvZG9jdW1lbnQiOwp2YXIgZG9jID0gewogICAgc2hhcmVEb2M6IGRvY1ByZWZpeCArICIvRkFRL1x1OTUxOVx1OEJFRlx1NEVFM1x1NzgwMSIsCiAgICBsaW5rVHlwZURvYzogZG9jUHJlZml4ICsgIi9JbmZvL1x1NzlEMlx1NEYyMFx1NjgzQ1x1NUYwRiIsCiAgICBiZGxpbmtEb2M6IGRvY1ByZWZpeCArICIvXHU3OUQyXHU0RjIwXHU5NEZFXHU2M0E1XHU3NTFGXHU2MjEwL1x1NEUwMFx1OTUyRVx1NzlEMlx1NEYyMCIsCiAgICBmYXN0R2VuRG9jOiBkb2NQcmVmaXggKyAiL1x1NzlEMlx1NEYyMFx1OTRGRVx1NjNBNVx1NzUxRlx1NjIxMC9cdTY3ODFcdTkwMUZcdTc1MUZcdTYyMTAiLAp9OyAvLyDmlofmoaPovb3ngrkxCnZhciBkb2MyID0gewogICAgc2hhcmVEb2M6IGRvY1ByZWZpeDIgKyAiL0ZBUS9cdTk1MTlcdThCRUZcdTRFRTNcdTc4MDEiLAogICAgbGlua1R5cGVEb2M6IGRvY1ByZWZpeDIgKyAiL0luZm8vXHU3OUQyXHU0RjIwXHU2ODNDXHU1RjBGIiwKICAgIGJkbGlua0RvYzogZG9jUHJlZml4MiArICIvXHU3OUQyXHU0RjIwXHU5NEZFXHU2M0E1XHU3NTFGXHU2MjEwL1x1NEUwMFx1OTUyRVx1NzlEMlx1NEYyMCIsCiAgICBmYXN0R2VuRG9jOiBkb2NQcmVmaXgyICsgIi9cdTc5RDJcdTRGMjBcdTk0RkVcdTYzQTVcdTc1MUZcdTYyMTAvXHU2NzgxXHU5MDFGXHU3NTFGXHU2MjEwIiwKfTsgLy8g5paH5qGj6L2954K5Mgp2YXIgbGlua1N0eWxlID0gJ2NsYXNzPSJtemZfbGluayIgcmVsPSJub29wZW5lciBub3JlZmVycmVyIiB0YXJnZXQ9Il9ibGFuayInOwp2YXIgYnRuU3R5bGUgPSAnY2xhc3M9Im16Zl9idG4iIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciIgdGFyZ2V0PSJfYmxhbmsiJzsKdmFyIGJkbGlua1BhdHRlcm4gPSAvI2JkbGluaz0oW1xkYS16QS1aKy89XSspLzsgLy8gYjY05Y+v6IO95Ye6546w55qE5a2X56ymOiDlpKflsI/lhpnlrZfmr41hLXpBLVosIOaVsOWtlzAtOSwgKywgLywgPSAoPeeUqOS6juacq+WwvuihpeS9jSkKdmFyIGh0bWxDaGVja01kNSA9ICI8cCBjbGFzcz1cIm16Zl90ZXh0XCI+XHU2RDRCXHU4QkQ1XHU3OUQyXHU0RjIwIFx1NTNFRlx1OTYzMlx1NkI2Mlx1NzlEMlx1NEYyMFx1NTkzMVx1NjU0ODxhIGlkPVwiY2hlY2tfbWQ1X2J0blwiIGNsYXNzPVwibXpmX2J0blwiPjxzcGFuIGNsYXNzPVwidGV4dFwiIHN0eWxlPVwid2lkdGg6IGF1dG87XCI+XHU2RDRCXHU4QkQ1PC9zcGFuPjwvYT48L3A+IjsKdmFyIGh0bWxEb2N1bWVudCA9ICI8cCBjbGFzcz1cIm16Zl90ZXh0XCI+XHU3OUQyXHU0RjIwXHU2NUUwXHU2NTQ4LFx1OTYzMlx1NTQ4Q1x1OEMxMFx1N0I0OSBcdTUzRUZcdTUzQzJcdTgwMDNcdTc5RDJcdTRGMjBcdTY1ODdcdTY4NjM8YSBocmVmPVwiIiArIGRvYy5zaGFyZURvYyArICJcIiAiICsgYnRuU3R5bGUgKyAiPjxzcGFuIGNsYXNzPVwidGV4dFwiIHN0eWxlPVwid2lkdGg6IGF1dG87XCI+XHU4RjdEXHU3MEI5MTwvc3Bhbj48L2E+PGEgaHJlZj1cIiIgKyBkb2MyLnNoYXJlRG9jICsgIlwiICIgKyBidG5TdHlsZSArICI+PHNwYW4gY2xhc3M9XCJ0ZXh0XCIgc3R5bGU9XCJ3aWR0aDogYXV0bztcIj5cdThGN0RcdTcwQjkyPC9zcGFuPjwvYT48L3A+IjsKdmFyIGh0bWxEb25hdGUgPSAiPHAgaWQ9XCJtemZfZG9uYXRlXCIgY2xhc3M9XCJtemZfdGV4dFwiPlx1ODJFNVx1NTU5Q1x1NkIyMlx1OEJFNVx1ODExQVx1NjcyQywgXHU1M0VGXHU1MjREXHU1RjgwIDxhIGhyZWY9XCIiICsgZG9uYXRlUGFnZSArICJcIiAiICsgbGlua1N0eWxlICsgIj5cdThENUVcdTUyQTlcdTk4NzU8L2E+IFx1NjUyRlx1NjMwMVx1NEY1Q1x1ODAwNTxhIGlkPVwia2lsbF9kb25hdGVcIiBjbGFzcz1cIm16Zl9idG5cIj5cdTRFMERcdTUxOERcdTY2M0VcdTc5M0E8L2E+PC9wPiI7CnZhciBodG1sRmVlZGJhY2sgPSAiPHAgaWQ9XCJtemZfZmVlZGJhY2tcIiBjbGFzcz1cIm16Zl90ZXh0XCI+XHU4MkU1XHU2NzA5XHU0RUZCXHU0RjU1XHU3NTkxXHU5NUVFLCBcdTUzRUZcdTUyNERcdTVGODAgPGEgaHJlZj1cIiIgKyBob21lUGFnZSArICJcIiAiICsgbGlua1N0eWxlICsgIj5cdTgxMUFcdTY3MkNcdTRFM0JcdTk4NzU8L2E+IFx1NTNDRFx1OTk4ODxhIGlkPVwia2lsbF9mZWVkYmFja1wiIGNsYXNzPVwibXpmX2J0blwiPlx1NEUwRFx1NTE4RFx1NjYzRVx1NzkzQTwvYT48L3A+IjsKdmFyIGh0bWxBYm91dEJkbGluayA9ICJcdTRFQzBcdTRFNDhcdTY2MkZcdTRFMDBcdTk1MkVcdTc5RDJcdTRGMjA/OiA8YSBocmVmPVwiIiArIGRvYy5iZGxpbmtEb2MgKyAiXCIgIiArIGxpbmtTdHlsZSArICI+XHU2NTg3XHU2ODYzXHU4RjdEXHU3MEI5MTwvYT4gPGEgaHJlZj1cIiIgKyBkb2MyLmJkbGlua0RvYyArICJcIiAiICsgbGlua1N0eWxlICsgIj5cdTY1ODdcdTY4NjNcdThGN0RcdTcwQjkyPC9hPiI7CnZhciBjb3B5RmFpbExpc3QgPSAnPGEgaWQ9ImNvcHlfZmFpbF9saXN0IiBjbGFzcz0ibXpmX2J0bjIiPuWkjeWItuWIl+ihqDwvYT48L3A+JzsKdmFyIGNvcHlGYWlsQnJhbmNoTGlzdCA9ICc8YSBpZD0iY29weV9mYWlsX2JyYW5jaF9saXN0IiBjbGFzcz0ibXpmX2J0bjIiPuWkjeWItuWIl+ihqDwvYT48L3A+JzsKdmFyIGNvcHlTdWNjZXNzTGlzdCA9ICc8YSBpZD0iY29weV9zdWNjZXNzX2xpc3QiIGNsYXNzPSJtemZfYnRuMiI+5aSN5Yi25YiX6KGoPC9hPjwvcD4nOwoKOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2NvbW1vbi9kdVBhcnNlci50c3gKLyoKICogQEF1dGhvcjogbWVuZ3pvbmVmaXJlCiAqIEBEYXRlOiAyMDIxLTA4LTI2IDEyOjAxOjI4CiAqIEBMYXN0RWRpdFRpbWU6IDIwMjItMDgtMjkgMTA6MjE6MDUKICogQExhc3RFZGl0b3JzOiBtZW5nem9uZWZpcmUKICogQERlc2NyaXB0aW9uOiDlkITnp43op6PmnpDlmagKICovCgoKLyoqCiAqIEBkZXNjcmlwdGlvbjog5LuOdXJs5Lit6Kej5p6Q56eS5Lyg6ZO+5o6lCiAqLwpmdW5jdGlvbiBwYXJzZVF1ZXJ5TGluayh1cmwpIHsKICAgIHZhciBiZGxpbmtCNjQgPSB1cmwubWF0Y2goYmRsaW5rUGF0dGVybik7CiAgICByZXR1cm4gYmRsaW5rQjY0ID8gYmRsaW5rQjY0WzFdLmZyb21CYXNlNjQoKSA6ICIiOwp9Ci8qKgogKiBAZGVzY3JpcHRpb246IOenkuS8oOmTvuaOpeino+aekOWZqAogKi8KZnVuY3Rpb24gRHVQYXJzZXIoKSB7IH0KRHVQYXJzZXIucGFyc2UgPSBmdW5jdGlvbiBnZW5lcmFsRHVDb2RlUGFyc2Uoc3pVcmwpIHsKICAgIHZhciByOwogICAgaWYgKHN6VXJsLmluZGV4T2YoImJkcGFuIikgPT09IDApIHsKICAgICAgICByID0gRHVQYXJzZXIucGFyc2VEdV92MShzelVybCk7CiAgICAgICAgci52ZXIgPSAiUGFuREwiOwogICAgfQogICAgZWxzZSBpZiAoc3pVcmwuaW5kZXhPZigiQmFpZHVQQ1MtR28iKSA9PT0gMCkgewogICAgICAgIHIgPSBEdVBhcnNlci5wYXJzZUR1X3YyKHN6VXJsKTsKICAgICAgICByLnZlciA9ICJQQ1MtR28iOwogICAgfQogICAgZWxzZSBpZiAoc3pVcmwuaW5kZXhPZigiQkRMSU5LIikgPT09IDApIHsKICAgICAgICByID0gRHVQYXJzZXIucGFyc2VEdV92MyhzelVybCk7CiAgICAgICAgci52ZXIgPSAi5ri45L6gIHYxIjsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHIgPSBEdVBhcnNlci5wYXJzZUR1X3Y0KHN6VXJsKTsKICAgICAgICByLnZlciA9ICLmoqblp6zmoIflh4YiOwogICAgfQogICAgcmV0dXJuIHI7Cn07CkR1UGFyc2VyLnBhcnNlRHVfdjEgPSBmdW5jdGlvbiBwYXJzZUR1X3YxKHN6VXJsKSB7CiAgICByZXR1cm4gc3pVcmwKICAgICAgICAucmVwbGFjZSgvXHMqYmRwYW46XC9cLy9nLCAiICIpCiAgICAgICAgLnRyaW0oKQogICAgICAgIC5zcGxpdCgiICIpCiAgICAgICAgLm1hcChmdW5jdGlvbiAoeikgewogICAgICAgIHJldHVybiB6CiAgICAgICAgICAgIC50cmltKCkKICAgICAgICAgICAgLmZyb21CYXNlNjQoKQogICAgICAgICAgICAubWF0Y2goLyhbXHNcU10rKVx8KFtcZF17MSwyMH0pXHwoW1xkYS1mXXszMn0pXHwoW1xkYS1mXXszMn0pL2kpOwogICAgfSkKICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uICh6KSB7CiAgICAgICAgcmV0dXJuIHo7CiAgICB9KQogICAgICAgIC5tYXAoZnVuY3Rpb24gKGluZm8pIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBtZDU6IGluZm9bM10sCiAgICAgICAgICAgIG1kNXM6IGluZm9bNF0sCiAgICAgICAgICAgIHNpemU6IGluZm9bMl0sCiAgICAgICAgICAgIHBhdGg6IGluZm9bMV0sCiAgICAgICAgfTsKICAgIH0pOwp9OwpEdVBhcnNlci5wYXJzZUR1X3YyID0gZnVuY3Rpb24gcGFyc2VEdV92MihzelVybCkgewogICAgcmV0dXJuIHN6VXJsCiAgICAgICAgLnNwbGl0KCJcbiIpCiAgICAgICAgLm1hcChmdW5jdGlvbiAoeikgewogICAgICAgIC8vIHVuc2lnbmVkIGxvbmcgbG9uZzogMH4xODQ0Njc0NDA3MzcwOTU1MTYxNQogICAgICAgIHJldHVybiB6CiAgICAgICAgICAgIC50cmltKCkKICAgICAgICAgICAgLm1hdGNoKC8tbGVuZ3RoPShbXGRdezEsMjB9KSAtbWQ1PShbXGRhLWZdezMyfSkgLXNsaWNlbWQ1PShbXGRhLWZdezMyfSlbXHNcU10rIihbXHNcU10rKSIvaSk7CiAgICB9KQogICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKHopIHsKICAgICAgICByZXR1cm4gejsKICAgIH0pCiAgICAgICAgLm1hcChmdW5jdGlvbiAoaW5mbykgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIG1kNTogaW5mb1syXSwKICAgICAgICAgICAgbWQ1czogaW5mb1szXSwKICAgICAgICAgICAgc2l6ZTogaW5mb1sxXSwKICAgICAgICAgICAgcGF0aDogaW5mb1s0XSwKICAgICAgICB9OwogICAgfSk7Cn07CkR1UGFyc2VyLnBhcnNlRHVfdjMgPSBmdW5jdGlvbiBwYXJzZUR1X3YzKHN6VXJsKSB7CiAgICB2YXIgcmF3ID0gYXRvYihzelVybC5zbGljZSg2KS5yZXBsYWNlKC9ccy9nLCAiIikpOwogICAgaWYgKHJhdy5zbGljZSgwLCA1KSAhPT0gIkJERlNceDAwIikgewogICAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgdmFyIGJ1ZiA9IG5ldyBTaW1wbGVCdWZmZXIocmF3KTsKICAgIHZhciBwdHIgPSA5OwogICAgdmFyIGFyckZpbGVzID0gW107CiAgICB2YXIgZmlsZUluZm8sIG5hbWVTaXplOwogICAgdmFyIHRvdGFsID0gYnVmLnJlYWRVSW50KDUpOwogICAgdmFyIGk7CiAgICBmb3IgKGkgPSAwOyBpIDwgdG90YWw7IGkrKykgewogICAgICAgIC8vIOWkp+WwjyAoOCBieXRlcykKICAgICAgICAvLyBNRDUgKyBNRDVTICgweDIwKQogICAgICAgIC8vIG5hbWVTaXplICg0IGJ5dGVzKQogICAgICAgIC8vIE5hbWUgKHVuaWNvZGUpCiAgICAgICAgZmlsZUluZm8gPSB7fTsKICAgICAgICBmaWxlSW5mby5zaXplID0gYnVmLnJlYWRVTG9uZyhwdHIgKyAwKTsKICAgICAgICBmaWxlSW5mby5tZDUgPSBidWYucmVhZEhleChwdHIgKyA4LCAweDEwKTsKICAgICAgICBmaWxlSW5mby5tZDVzID0gYnVmLnJlYWRIZXgocHRyICsgMHgxOCwgMHgxMCk7CiAgICAgICAgbmFtZVNpemUgPSBidWYucmVhZFVJbnQocHRyICsgMHgyOCkgPDwgMTsKICAgICAgICBmaWxlSW5mby5uYW1lU2l6ZSA9IG5hbWVTaXplOwogICAgICAgIHB0ciArPSAweDJjOwogICAgICAgIGZpbGVJbmZvLnBhdGggPSBidWYucmVhZFVuaWNvZGUocHRyLCBuYW1lU2l6ZSk7CiAgICAgICAgYXJyRmlsZXMucHVzaChmaWxlSW5mbyk7CiAgICAgICAgcHRyICs9IG5hbWVTaXplOwogICAgfQogICAgcmV0dXJuIGFyckZpbGVzOwp9OwpEdVBhcnNlci5wYXJzZUR1X3Y0ID0gZnVuY3Rpb24gcGFyc2VEdV92MyhzelVybCkgewogICAgcmV0dXJuIHN6VXJsCiAgICAgICAgLnNwbGl0KCJcbiIpCiAgICAgICAgLm1hcChmdW5jdGlvbiAoeikgewogICAgICAgIHJldHVybiB6CiAgICAgICAgICAgIC50cmltKCkKICAgICAgICAgICAgLm1hdGNoKC9eKFtcZGEtZl17OX1bXGRhLXpdW1xkYS1mXXsyMn0pIyg/OihbXGRhLWZdezMyfSkjKT8oW1xkXXsxLDIwfSkjKFtcc1xTXSspL2kpOyAvLyAyMi44LjI55paw5aKe5pSv5oyB56ysMTDkvY3kuLpnLXrnmoTliqDlr4ZtZDUsIOi+k+WFpeWQjuiHquWKqOino+Wvhui9rOWtmAogICAgfSkKICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uICh6KSB7CiAgICAgICAgcmV0dXJuIHo7CiAgICB9KQogICAgICAgIC5tYXAoZnVuY3Rpb24gKGluZm8pIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAvLyDmoIflh4bnoIEgLyDnn63niYjmoIflh4bnoIEo5pegbWQ1cykKICAgICAgICAgICAgbWQ1OiBkZWNyeXB0TWQ1KGluZm9bMV0udG9Mb3dlckNhc2UoKSksCiAgICAgICAgICAgIG1kNXM6IGluZm9bMl0gfHwgIiIsCiAgICAgICAgICAgIHNpemU6IGluZm9bM10sCiAgICAgICAgICAgIHBhdGg6IGluZm9bNF0sCiAgICAgICAgfTsKICAgIH0pOwp9OwovKioKICog5LiA5Liq566A5Y2V55qE57G75Ly85LqOIE5vZGVKUyBCdWZmZXIg55qE5a6e546wLgogKiDnlKjkuo7op6PmnpDmuLjkvqDluqblqJjmj5Dlj5bnoIHjgIIKICogQHBhcmFtIHtTaW1wbGVCdWZmZXJ9CiAqLwpmdW5jdGlvbiBTaW1wbGVCdWZmZXIoc3RyKSB7CiAgICB0aGlzLmZyb21TdHJpbmcoc3RyKTsKfQpTaW1wbGVCdWZmZXIudG9TdGRIZXggPSBmdW5jdGlvbiB0b1N0ZEhleChuKSB7CiAgICByZXR1cm4gKCIwIiArIG4udG9TdHJpbmcoMTYpKS5zbGljZSgtMik7Cn07ClNpbXBsZUJ1ZmZlci5wcm90b3R5cGUuZnJvbVN0cmluZyA9IGZ1bmN0aW9uIGZyb21TdHJpbmcoc3RyKSB7CiAgICB2YXIgbGVuID0gc3RyLmxlbmd0aDsKICAgIHRoaXMuYnVmID0gbmV3IFVpbnQ4QXJyYXkobGVuKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICB0aGlzLmJ1ZltpXSA9IHN0ci5jaGFyQ29kZUF0KGkpOwogICAgfQp9OwpTaW1wbGVCdWZmZXIucHJvdG90eXBlLnJlYWRVbmljb2RlID0gZnVuY3Rpb24gcmVhZFVuaWNvZGUoaW5kZXgsIHNpemUpIHsKICAgIGlmIChzaXplICYgMSkgewogICAgICAgIHNpemUrKzsKICAgIH0KICAgIHZhciBidWZUZXh0ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlCiAgICAgICAgLmNhbGwodGhpcy5idWYsIGluZGV4LCBpbmRleCArIHNpemUpCiAgICAgICAgLm1hcChTaW1wbGVCdWZmZXIudG9TdGRIZXgpOwogICAgdmFyIGJ1ZiA9IFsiIl07CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkgKz0gMikgewogICAgICAgIGJ1Zi5wdXNoKGJ1ZlRleHRbaSArIDFdICsgYnVmVGV4dFtpXSk7CiAgICB9CiAgICByZXR1cm4gSlNPTi5wYXJzZSgnIicgKyBidWYuam9pbigiXFx1IikgKyAnIicpOwp9OwpTaW1wbGVCdWZmZXIucHJvdG90eXBlLnJlYWROdW1iZXIgPSBmdW5jdGlvbiByZWFkTnVtYmVyKGluZGV4LCBzaXplKSB7CiAgICB2YXIgcmV0ID0gMDsKICAgIGZvciAodmFyIGkgPSBpbmRleCArIHNpemU7IGkgPiBpbmRleDspIHsKICAgICAgICByZXQgPSB0aGlzLmJ1ZlstLWldICsgcmV0ICogMjU2OwogICAgfQogICAgcmV0dXJuIHJldDsKfTsKU2ltcGxlQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludCA9IGZ1bmN0aW9uIHJlYWRVSW50KGluZGV4KSB7CiAgICByZXR1cm4gdGhpcy5yZWFkTnVtYmVyKGluZGV4LCA0KTsKfTsKU2ltcGxlQnVmZmVyLnByb3RvdHlwZS5yZWFkVUxvbmcgPSBmdW5jdGlvbiByZWFkVUxvbmcoaW5kZXgpIHsKICAgIHJldHVybiB0aGlzLnJlYWROdW1iZXIoaW5kZXgsIDgpOwp9OwpTaW1wbGVCdWZmZXIucHJvdG90eXBlLnJlYWRIZXggPSBmdW5jdGlvbiByZWFkSGV4KGluZGV4LCBzaXplKSB7CiAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlCiAgICAgICAgLmNhbGwodGhpcy5idWYsIGluZGV4LCBpbmRleCArIHNpemUpCiAgICAgICAgLm1hcChTaW1wbGVCdWZmZXIudG9TdGRIZXgpCiAgICAgICAgLmpvaW4oIiIpOwp9OwoKLy8gRVhURVJOQUwgTU9EVUxFOiAuL3NyYy9jb21wb25lbnRzL3VwZGF0ZUluZm8uaHRtbAp2YXIgdXBkYXRlSW5mbyA9IF9fd2VicGFja19yZXF1aXJlX18oMTg0KTsKdmFyIHVwZGF0ZUluZm9fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4odXBkYXRlSW5mbyk7CjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9jb21tb24vU3dhbENvbmZpZy50c3gKCgovLyDlkIRTd2Fs5by556qX55qE5Zu65a6a5Y+C5pWw6YWN572uOgp2YXIgU3dhbENvbmZpZyA9IHsKICAgIGlucHV0VmlldzogewogICAgICAgIHRpdGxlOiAi6K+36L6T5YWl56eS5LygJuS/neWtmOi3r+W+hCIsCiAgICAgICAgc2hvd0NhbmNlbEJ1dHRvbjogdHJ1ZSwKICAgICAgICBodG1sOiAiPHRleHRhcmVhIGlkPVwibXpmLXJhcGlkLWlucHV0XCIgY2xhc3M9XCJzd2FsMi10ZXh0YXJlYVwiIHBsYWNlaG9sZGVyPVwiXHUwMEI3IFx1NjUyRlx1NjMwMVx1NjI3OVx1OTFDRlx1OEY2Q1x1NUI1OFx1NTkxQVx1Njc2MVx1NzlEMlx1NEYyMChcdTYzNjJcdTg4NENcdTUyMDZcdTk2OTQpXG5cdTAwQjcgXHU2NTJGXHU2MzAxUGFuREwvXHU2RTM4XHU0RkEwL1x1NjgwN1x1NTFDNlx1NzgwMS9QQ1MtR09cdTY4M0NcdTVGMEZcblx1MDBCNyBcdTY1MkZcdTYzMDFcdThGOTNcdTUxNjVcdTRFMDBcdTk1MkVcdTc5RDJcdTRGMjAoXHU4MUVBXHU1MkE4XHU4RjZDXHU2MzYyXHU0RTNBXHU2NjZFXHU5MDFBXHU3OUQyXHU0RjIwKVxuXHUwMEI3IFx1NTNFRlx1NTcyOFx1OEJCRVx1N0Y2RVx1OTg3NVx1NUYwMFx1NTQyRlx1NzZEMVx1NTQyQ1x1NTI2QVx1OEQzNFx1Njc3RixcdTgxRUFcdTUyQThcdTdDOThcdThEMzRcdTc5RDJcdTRGMjBcblx1MDBCNyBcdThGOTNcdTUxNjVzZXRcdThGREJcdTUxNjVcdThCQkVcdTdGNkVcdTk4NzUsZ2VuXHU4RkRCXHU1MTY1XHU3NTFGXHU2MjEwXHU5ODc1LGluZm9cdThGREJcdTUxNjVcdTcyNDhcdTY3MkNcdTRGRTFcdTYwNkZcdTk4NzVcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7cGFkZGluZzogMC40ZW07XCI+PC90ZXh0YXJlYT5cbiAgICA8aW5wdXQgaWQ9XCJtemYtcGF0aC1pbnB1dFwiIGNsYXNzPVwic3dhbDItaW5wdXRcIiBwbGFjZWhvbGRlcj1cIlx1NEZERFx1NUI1OFx1OERFRlx1NUY4NCwgXHU3OTNBXHU0RjhCOiAvR1RBNS8sIFx1NzU1OVx1N0E3QVx1NEZERFx1NUI1OFx1NTcyOFx1NUY1M1x1NTI0RFx1NzZFRVx1NUY1NVwiIHN0eWxlPVwiZGlzcGxheTogZmxleDttYXJnaW4tdG9wOiAxMHB4O1wiPiIsCiAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICLnoa7lrpoiLAogICAgICAgIGNhbmNlbEJ1dHRvblRleHQ6ICLlj5bmtogiLAogICAgICAgIGN1c3RvbUNsYXNzOiB7IGh0bWxDb250YWluZXI6ICJtemZfaHRtbF9jb250YWluZXIiIH0sCiAgICB9LAogICAgcHJvY2Vzc1ZpZXc6IHsKICAgICAgICBzaG93Q2xvc2VCdXR0b246IHRydWUsCiAgICAgICAgc2hvd0NvbmZpcm1CdXR0b246IGZhbHNlLAogICAgICAgIGFsbG93T3V0c2lkZUNsaWNrOiBmYWxzZSwKICAgIH0sCiAgICBmaW5pc2hWaWV3OiB7CiAgICAgICAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLAogICAgICAgIGFsbG93T3V0c2lkZUNsaWNrOiBmYWxzZSwKICAgIH0sCiAgICBnZW5VbmZpbmlzaDogewogICAgICAgIHRpdGxlOiAi5qOA5rWL5Yiw5LiK5qyh5pyq5a6M5oiQ55qE56eS5Lyg5Lu75YqhIiwKICAgICAgICB0ZXh0OiAi5piv5ZCm57un57ut6K+l5Lu75YqhPyIsCiAgICAgICAgc2hvd0NhbmNlbEJ1dHRvbjogdHJ1ZSwKICAgICAgICBhbGxvd091dHNpZGVDbGljazogZmFsc2UsCiAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICLmmK8iLAogICAgICAgIGNhbmNlbEJ1dHRvblRleHQ6ICLlkKYiLAogICAgfSwKICAgIGdlblVuZmluaXNoMjogewogICAgICAgIHRpdGxlOiAi5qOA5rWL5Yiw5LiK5qyh5pyq5q2j5bi46YCA5Ye655qE56eS5Lyg5Lu75YqhIiwKICAgICAgICB0ZXh0OiAi5piv5ZCm5oGi5aSN6K+l5Lu75YqhPyIsCiAgICAgICAgc2hvd0NhbmNlbEJ1dHRvbjogdHJ1ZSwKICAgICAgICBhbGxvd091dHNpZGVDbGljazogZmFsc2UsCiAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICLmmK8iLAogICAgICAgIGNhbmNlbEJ1dHRvblRleHQ6ICLlkKYiLAogICAgfSwKICAgIGdlblZpZXc6IHsKICAgICAgICB0aXRsZTogIuivt+i+k+WFpemcgOimgeeUn+aIkOeahOaWh+S7tui3r+W+hCIsCiAgICAgICAgaW5wdXQ6ICJ0ZXh0YXJlYSIsCiAgICAgICAgc2hvd0NhbmNlbEJ1dHRvbjogdHJ1ZSwKICAgICAgICBzaG93Q2xvc2VCdXR0b246IHRydWUsCiAgICAgICAgaW5wdXRQbGFjZWhvbGRlcjogIlvmlK/mjIHmibnph48o5o2i6KGM5YiG6ZqUKV0iLAogICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAi56Gu5a6aIiwKICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiAi5Y+W5raIIiwKICAgICAgICBpbnB1dFZhbGlkYXRvcjogZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgIGlmICghdmFsdWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAi5paH5Lu26Lev5b6E5LiN6IO95Li656m6IjsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICB9LAogICAgdXBkYXRlSW5mbzogewogICAgICAgIHRpdGxlOiAiXHU3OUQyXHU0RjIwXHU5NEZFXHU2M0E1XHU2M0QwXHU1M0Q2IHYiICsgdmVyc2lvbiArICIgKCIgKyB1cGRhdGVEYXRlICsgIikiLAogICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSwKICAgICAgICBhbGxvd091dHNpZGVDbGljazogZmFsc2UsCiAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICLnn6XpgZPkuoYiLAogICAgICAgIGh0bWw6ICh1cGRhdGVJbmZvX2RlZmF1bHQoKSksCiAgICB9LAogICAgY2hlY2tSZWN1cnNpdmU6IHsKICAgICAgICBpY29uOiAiaW5mbyIsCiAgICAgICAgdGl0bGU6ICLljIXlkKvmlofku7blpLksIOaYr+WQpumAkuW9kueUn+aIkD8iLAogICAgICAgIHRleHQ6ICLoi6XpgInmmK8sIOWwhuWQjOaXtueUn+aIkOWQhOe6p+WtkOaWh+S7tuWkueS4i+eahOaWh+S7tiIsCiAgICAgICAgYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLAogICAgICAgIGZvY3VzQ2FuY2VsOiB0cnVlLAogICAgICAgIHNob3dDYW5jZWxCdXR0b246IHRydWUsCiAgICAgICAgcmV2ZXJzZUJ1dHRvbnM6IHRydWUsCiAgICAgICAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLAogICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAi5pivIiwKICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiAi5ZCmIiwKICAgIH0sCiAgICBjaGVja01kNVdhcm5pbmc6IHsKICAgICAgICB0aXRsZTogIuS9v+eUqOWJjeivt+azqOaEjyIsCiAgICAgICAgdGV4dDogIua1i+ivleenkuS8oOS8mui9rOWtmOW5tuimhuebluaWh+S7tizoi6XlnKjnlJ/miJDmnJ/pl7Tkv67mlLnov4flkIzlkI3mlofku7Ys5Li66YG/5YWN5L+u5pS555qE5paH5Lu25Lii5aSxLOivt+S4jeimgeS9v+eUqOatpOWKn+iDvSEiLAogICAgICAgIGlucHV0OiAiY2hlY2tib3giLAogICAgICAgIGlucHV0UGxhY2Vob2xkZXI6ICLkuI3lho3mmL7npLoiLAogICAgICAgIHNob3dDYW5jZWxCdXR0b246IHRydWUsCiAgICAgICAgYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLAogICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAi56Gu5a6aIiwKICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiAi6L+U5ZueIiwKICAgIH0sCiAgICBzZXR0aW5nVmlldzogewogICAgICAgIHRpdGxlOiAi56eS5Lyg6ZO+5o6l5o+Q5Y+WIOiuvue9rumhtSIsCiAgICAgICAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLAogICAgICAgIHNob3dDYW5jZWxCdXR0b246IHRydWUsCiAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICLnoa7lrpoiLAogICAgICAgIGNhbmNlbEJ1dHRvblRleHQ6ICLlj5bmtogiLAogICAgICAgIGFsbG93T3V0c2lkZUNsaWNrOiBmYWxzZSwKICAgICAgICBodG1sOiAiPHNlbGVjdCBjbGFzcz1cInN3YWwyLXNlbGVjdFwiIGlkPVwibXpmLXRoZW1lXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4O2JvcmRlci13aWR0aDogMXB4O2JvcmRlci1zdHlsZTogc29saWQ7XCI+IDxvcHRpb24gdmFsdWU9XCJEZWZhdWx0XCI+RGVmYXVsdCBcdTc2N0RcdTgyNzJcdTRFM0JcdTk4OTgoXHU5RUQ4XHU4QkE0KTwvb3B0aW9uPiA8b3B0aW9uIHZhbHVlPVwiQnVsbWFcIj5CdWxtYSBcdTc2N0RcdTgyNzJcdTdCODBcdTdFQTY8L29wdGlvbj4gPG9wdGlvbiB2YWx1ZT1cIkJvb3RzdHJhcCA0XCI+Qm9vdHN0cmFwNCBcdTc2N0RcdTgyNzJcdTdCODBcdTdFQTY8L29wdGlvbj4gPG9wdGlvbiB2YWx1ZT1cIk1hdGVyaWFsIFVJXCI+TWF0ZXJpYWxVSSBcdTc2N0RcdTgyNzJcdTRFM0JcdTk4OTg8L29wdGlvbj4gPG9wdGlvbiB2YWx1ZT1cIkRhcmtcIj5EYXJrIFx1OUVEMVx1ODI3Mlx1NEUzQlx1OTg5ODwvb3B0aW9uPiA8b3B0aW9uIHZhbHVlPVwiV29yZFByZXNzIEFkbWluXCI+V29yZFByZXNzQWRtaW4gXHU3MDcwXHU4MjcyXHU0RTNCXHU5ODk4PC9vcHRpb24+IDwvc2VsZWN0PiA8bGFiZWwgZm9yPVwibXpmLWZhc3QtZ2VuZXJhdGVcIiBjbGFzcz1cInN3YWwyLWNoZWNrYm94XCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4O1wiPjxzcGFuIGNsYXNzPVwic3dhbDItbGFiZWxcIj5cdTY3ODFcdTkwMUZcdTc1MUZcdTYyMTAgXHU4QkY0XHU2NjBFXHU2NTg3XHU2ODYzOiA8YSBocmVmPVwiIiArIGRvYy5mYXN0R2VuRG9jICsgIlwiICIgKyBsaW5rU3R5bGUgKyAiPlx1OEY3RFx1NzBCOTE8L2E+IDxhIGhyZWY9XCIiICsgZG9jMi5mYXN0R2VuRG9jICsgIlwiICIgKyBsaW5rU3R5bGUgKyAiPlx1OEY3RFx1NzBCOTI8L2E+PC9zcGFuPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiB2YWx1ZT1cIjFcIiBpZD1cIm16Zi1mYXN0LWdlbmVyYXRlXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDogMjBweDtcIj48L2xhYmVsPiA8bGFiZWwgZm9yPVwibXpmLWxpc3Rlbi1jbGlwYm9hcmRcIiBjbGFzcz1cInN3YWwyLWNoZWNrYm94XCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4O1wiPjxzcGFuIGNsYXNzPVwic3dhbDItbGFiZWxcIj5cdTc2RDFcdTU0MkNcdTUyNkFcdThEMzRcdTY3N0YgKFx1OTcwMFx1ODk4MVx1NTE0MVx1OEJCOFx1NTI2QVx1OEQzNFx1Njc3Rlx1Njc0M1x1OTY1MCk8L3NwYW4+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIHZhbHVlPVwiMVwiIGlkPVwibXpmLWxpc3Rlbi1jbGlwYm9hcmRcIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiAyMHB4O1wiPjwvbGFiZWw+IiwKICAgIH0sCiAgICBzZXR0aW5nV2FybmluZzogewogICAgICAgIHRpdGxlOiAi6K6+572u5oiQ5YqfIOWIt+aWsOmhtemdoueUn+aViCIsCiAgICAgICAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLAogICAgICAgIGFsbG93T3V0c2lkZUNsaWNrOiBmYWxzZSwKICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogIuefpemBk+S6hiIsCiAgICB9LAogICAgc2VsZWN0Tm9GaWxlV2FybmluZzogewogICAgICAgIHRpdGxlOiAi6K+35Yu+6YCJ6KaB55Sf5oiQ56eS5Lyg55qE5paH5Lu2L+aWh+S7tuWkuSIsCiAgICAgICAgaWNvbjogImVycm9yIiwKICAgICAgICBzaG93Q2xvc2VCdXR0b246IHRydWUsCiAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICLnn6XpgZPkuoYiLAogICAgfSwKfTsKCi8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvc3dlZXRhbGVydDIvZGlzdC9zd2VldGFsZXJ0Mi5hbGwuanMKdmFyIHN3ZWV0YWxlcnQyX2FsbCA9IF9fd2VicGFja19yZXF1aXJlX18oNDU1KTsKdmFyIHN3ZWV0YWxlcnQyX2FsbF9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihzd2VldGFsZXJ0Ml9hbGwpOwo7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvY29tbW9uL3N3YWxCYXNlLnRzeAovKgogKiBAQXV0aG9yOiBtZW5nem9uZWZpcmUKICogQERhdGU6IDIwMjEtMDgtMjUgMDg6MzQ6NDYKICogQExhc3RFZGl0VGltZTogMjAyMi0xMS0xMCAyMzozMDo1NgogKiBATGFzdEVkaXRvcnM6IG1lbmd6b25lZmlyZQogKiBARGVzY3JpcHRpb246IOWumuS5ieWFqOWll+eahOWJjeWPsOW8ueeql+mAu+i+kSwg5ZyoU3dhbOeahOWbnuiwg+WHveaVsOWGheiwg+eUqCoqKlRhc2vnsbvlhoXlrprkuYnnmoTku7vliqHku6PnoIEKICovCnZhciBfX2Fzc2lnbiA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fYXNzaWduKSB8fCBmdW5jdGlvbiAoKSB7CiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkgewogICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykgewogICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldOwogICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpCiAgICAgICAgICAgICAgICB0W3BdID0gc1twXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHQ7CiAgICB9OwogICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cn07CnZhciBfX2F3YWl0ZXIgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHsKICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfQogICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfQogICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yWyJ0aHJvdyJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0KICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfQogICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTsKICAgIH0pOwp9Owp2YXIgX19nZW5lcmF0b3IgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX2dlbmVyYXRvcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIGJvZHkpIHsKICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7CiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgInRocm93IjogdmVyYigxKSwgInJldHVybiI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZzsKICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfQogICAgZnVuY3Rpb24gc3RlcChvcCkgewogICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuIik7CiAgICAgICAgd2hpbGUgKF8pIHRyeSB7CiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbInJldHVybiJdIDogb3BbMF0gPyB5WyJ0aHJvdyJdIHx8ICgodCA9IHlbInJldHVybiJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDsKICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdOwogICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7CiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07CiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7CiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfQogICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfQogICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTsKICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pOwogICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH0KICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTsKICAgIH0KfTsKdmFyIF9fc3ByZWFkQXJyYXkgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX3NwcmVhZEFycmF5KSB8fCBmdW5jdGlvbiAodG8sIGZyb20pIHsKICAgIGZvciAodmFyIGkgPSAwLCBpbCA9IGZyb20ubGVuZ3RoLCBqID0gdG8ubGVuZ3RoOyBpIDwgaWw7IGkrKywgaisrKQogICAgICAgIHRvW2pdID0gZnJvbVtpXTsKICAgIHJldHVybiB0bzsKfTsKCgoKCgoKCnZhciBTd2FsYmFzZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKICAgIGZ1bmN0aW9uIFN3YWxiYXNlKHJhcGlkdXBsb2FkVGFzaywgZ2VuZXJhdGViZGxpbmtUYXNrKSB7CiAgICAgICAgdGhpcy5yYXBpZHVwbG9hZFRhc2sgPSByYXBpZHVwbG9hZFRhc2s7CiAgICAgICAgdGhpcy5nZW5lcmF0ZWJkbGlua1Rhc2sgPSBnZW5lcmF0ZWJkbGlua1Rhc2s7CiAgICB9CiAgICAvLyDlkIjlubZzd2Fs5Y+C5pWwCiAgICBTd2FsYmFzZS5wcm90b3R5cGUubWVyZ2VBcmcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGlucHV0QXJncyA9IFtdOwogICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICAgIGlucHV0QXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldOwogICAgICAgIH0KICAgICAgICB2YXIgb3V0cHV0ID0ge307CiAgICAgICAgdmFyIHN3YWxDZmdBcmdzID0gewogICAgICAgICAgICAvLyDnpoHnlKhiYWNrZHJvcOWKqOeUuywg6Zi75q2i5aSa5qyh5by556qX5pe255qE5bGP6ZeqCiAgICAgICAgICAgIHNob3dDbGFzczogeyBiYWNrZHJvcDogInN3YWwyLW5vYW5pbWF0aW9uIiB9LAogICAgICAgICAgICBoaWRlQ2xhc3M6IHsgYmFja2Ryb3A6ICJzd2FsMi1ub2FuaW1hdGlvbiIgfSwKICAgICAgICB9OwogICAgICAgICQuZXh0ZW5kLmFwcGx5KCQsIF9fc3ByZWFkQXJyYXkoW291dHB1dCwgdGhpcy5zd2FsR2xvYmFsQXJncywgc3dhbENmZ0FyZ3NdLCBpbnB1dEFyZ3MpKTsKICAgICAgICByZXR1cm4gb3V0cHV0OwogICAgfTsKICAgIC8vIOeCueWHuyAi56eS5Lyg6ZO+5o6lIiDlkI7mmL7npLrnmoTlvLnnqpcKICAgIFN3YWxiYXNlLnByb3RvdHlwZS5pbnB1dFZpZXcgPSBmdW5jdGlvbiAoaW5wdXRWYWx1ZSkgewogICAgICAgIGlmIChpbnB1dFZhbHVlID09PSB2b2lkIDApIHsgaW5wdXRWYWx1ZSA9ICIiOyB9CiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgcGF0aFZhbHVlLCBwcmVDb25maXJtLCB3aWxsT3BlbjsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkgewogICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoR01fZ2V0VmFsdWUoImxpc3Rlbi1jbGlwYm9hcmQiKSAmJiAhaW5wdXRWYWx1ZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBwYXJzZUNsaXBib2FyZCgpXTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOagh+W/l+S9jXRydWUg5LiUIGlucHV0VmFsdWXkuLrnqboo6Z2e5LiA6ZSu56eS5Lyg6L+b5YWl5pe2KSDku47liarotLTmnb/or7vlj5bmnInmlYjnmoTnp5LkvKDpk77mjqUKICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRWYWx1ZSA9IF9hLnNlbnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAyOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFZhbHVlID0gR01fZ2V0VmFsdWUoImxhc3RfZGlyIikgfHwgIiI7CiAgICAgICAgICAgICAgICAgICAgICAgIHByZUNvbmZpcm0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDmiYvliqjor7vlj5ZNdWx0aXBsZSBpbnB1dHPlhoXnmoTmlbDmja4sIOeUseS6juacquiuvue9rmlucHV05Y+C5pWwLCDljp/nlJ9WYWxpZGF0b3LkuI3nlJ/mlYgsIOiHquihjOa3u+WKoFZhbGlkYXRvcumAu+i+kQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRWYWx1ZSA9ICQoIiNtemYtcmFwaWQtaW5wdXQiKVswXS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhWYWx1ZSA9ICQoIiNtemYtcGF0aC1pbnB1dCIpWzBdLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnB1dFZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dlZXRhbGVydDJfYWxsX2RlZmF1bHQoKS5zaG93VmFsaWRhdGlvbk1lc3NhZ2UoIuenkuS8oOS4jeiDveS4uuepuiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21tYW5kTGlzdC5pbmNsdWRlcyhpbnB1dFZhbHVlLnRyaW0oKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDovpPlhaXmlK/mjIHnmoTlkb3ku6QsIOi3s+WHuuajgOafpQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0VmFsdWUgPSBpbnB1dFZhbHVlLnRyaW0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUR1UGFyc2VyLnBhcnNlKGlucHV0VmFsdWUpLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3ZWV0YWxlcnQyX2FsbF9kZWZhdWx0KCkuc2hvd1ZhbGlkYXRpb25NZXNzYWdlKCI8cD5cdTY3MkFcdThCQzZcdTUyMkJcdTUyMzBcdTZCNjNcdTc4NkVcdTc2ODRcdTk0RkVcdTYzQTUgPGEgaHJlZj1cIiIgKyBkb2MubGlua1R5cGVEb2MgKyAiXCIgIiArIGxpbmtTdHlsZSArICI+XHU2N0U1XHU3NzBCXHU2NTJGXHU2MzAxXHU2ODNDXHU1RjBGPC9hPjwvcD4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGF0aFZhbHVlLm1hdGNoKGlsbGVnYWxQYXRoUGF0dGVybikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2VldGFsZXJ0Ml9hbGxfZGVmYXVsdCgpLnNob3dWYWxpZGF0aW9uTWVzc2FnZSgn5L+d5a2Y6Lev5b6E5LiN6IO95ZCr5pyJ5a2X56ymXFwiOio/PD58LCDnpLrkvovvvJovR1RBNS8nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHdpbGxPcGVuID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgiI3N3YWwyLWh0bWwtY29udGFpbmVyIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3NzKCJmb250LXNpemUiLCAiMXJlbSIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNzcygiZGlzcGxheSIsICJncmlkIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3NzKCJtYXJnaW4iLCAiMCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgiI216Zi1yYXBpZC1pbnB1dCIpWzBdLnZhbHVlID0gaW5wdXRWYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoIiNtemYtcGF0aC1pbnB1dCIpWzBdLnZhbHVlID0gcGF0aFZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgiI216Zi1yYXBpZC1pbnB1dCIpLm9uKCJpbnB1dCIsIGZ1bmN0aW9uIChldmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBwYXJzZVF1ZXJ5TGluayhldmVudC50YXJnZXQudmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEdVBhcnNlci5wYXJzZShyZXN1bHQpLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7IC8vIOe7keWumui+k+WFpeahhuS6i+S7tiwg6L6T5YWl5LiA6ZSu56eS5Lyg5ZCO5bCd6K+V6L2s5o2i5Li65pmu6YCa56eS5LygCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHN3ZWV0YWxlcnQyX2FsbF9kZWZhdWx0KCkuZmlyZSh0aGlzLm1lcmdlQXJnKFN3YWxDb25maWcuaW5wdXRWaWV3LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVDb25maXJtOiBwcmVDb25maXJtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbE9wZW46IHdpbGxPcGVuLAogICAgICAgICAgICAgICAgICAgICAgICB9KSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzQ29uZmlybWVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09ICJzZXQiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5zZXR0aW5nVmlldygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlucHV0VmFsdWUgPT09ICJnZW4iKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5nZW5WaWV3KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaW5wdXRWYWx1ZSA9PT0gImluZm8iKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy51cGRhdGVJbmZvKGZ1bmN0aW9uICgpIHsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnJhcGlkdXBsb2FkVGFzay5yZXNldCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5yYXBpZHVwbG9hZFRhc2suZmlsZUluZm9MaXN0ID0gRHVQYXJzZXIucGFyc2UoaW5wdXRWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCJsYXN0X2RpciIsIHBhdGhWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGF0aFZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDot6/lvoTnlZnnqboKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnJhcGlkdXBsb2FkVGFzay5pc0RlZmF1bHRQYXRoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub3dQYXRoID0gbG9jYXRpb24uaHJlZi5tYXRjaCgvcGF0aD0oLis/KSg/OiZ8JCkvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3dQYXRoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhWYWx1ZSA9IGRlY29kZVVSSUNvbXBvbmVudChub3dQYXRoWzFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoVmFsdWUgPSAiLyI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGhWYWx1ZS5jaGFyQXQocGF0aFZhbHVlLmxlbmd0aCAtIDEpICE9PSAiLyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoVmFsdWUgKz0gIi8iOyAvLyDooaXlhajot6/lvoTnu5PlsL7nmoQgIi8iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJcdTc5RDJcdTRGMjBcdTY1ODdcdTRFRjZcdTRGRERcdTVCNThcdTUyMzA6ICIgKyBwYXRoVmFsdWUpOyAvLyBkZWJ1ZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5yYXBpZHVwbG9hZFRhc2suc2F2ZVBhdGggPSBwYXRoVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnByb2Nlc3NWaWV3KGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgfTsKICAgIC8vIOi9rOWtmC/nlJ/miJDov4fnqIvkuK3nmoTlvLnnqpcKICAgIFN3YWxiYXNlLnByb3RvdHlwZS5wcm9jZXNzVmlldyA9IGZ1bmN0aW9uIChpc0dlbikgewogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgdmFyIHN3YWxBcmcgPSB7CiAgICAgICAgICAgIHRpdGxlOiBpc0dlbgogICAgICAgICAgICAgICAgPyAi56eS5Lyg55Sf5oiQ5LitIgogICAgICAgICAgICAgICAgOiAiXHU2NTg3XHU0RUY2IiArICh0aGlzLnJhcGlkdXBsb2FkVGFzay5jaGVja01vZGUgPyAi5rWL6K+VIiA6ICLmj5Dlj5YiKSArICJcdTRFMkQiLAogICAgICAgICAgICBodG1sOiBpc0dlbgogICAgICAgICAgICAgICAgPyAiPHA+5q2j5Zyo55Sf5oiQ56ysIDxmaWxlX251bT4wPC9maWxlX251bT4g5LiqPC9wPjxwPjxnZW5fcHJvZz7mraPlnKjojrflj5bmlofku7bliJfooaguLi48L2dlbl9wcm9nPjwvcD4iCiAgICAgICAgICAgICAgICA6ICJcdTZCNjNcdTU3MjgiICsgKHRoaXMucmFwaWR1cGxvYWRUYXNrLmNoZWNrTW9kZSA/ICLmtYvor5UiIDogIui9rOWtmCIpICsgIlx1N0IyQyA8ZmlsZV9udW0+MDwvZmlsZV9udW0+IFx1NEUyQSIsCiAgICAgICAgICAgIHdpbGxPcGVuOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBzd2VldGFsZXJ0Ml9hbGxfZGVmYXVsdCgpLnNob3dMb2FkaW5nKCk7CiAgICAgICAgICAgICAgICBpc0dlbiB8fCBfdGhpcy5zYXZlRmlsZVdvcmsoKTsKICAgICAgICAgICAgfSwKICAgICAgICB9OwogICAgICAgIHN3ZWV0YWxlcnQyX2FsbF9kZWZhdWx0KCkuZmlyZSh0aGlzLm1lcmdlQXJnKFN3YWxDb25maWcucHJvY2Vzc1ZpZXcsIHN3YWxBcmcpKTsKICAgIH07CiAgICAvLyDovazlrZgv55Sf5oiQL+a1i+ivleenkuS8oOWujOaIkOeahOW8ueeqlwogICAgU3dhbGJhc2UucHJvdG90eXBlLmZpbmlzaFZpZXcgPSBmdW5jdGlvbiAoaXNHZW4pIHsKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgIHZhciBhY3Rpb24gPSBpc0dlbgogICAgICAgICAgICA/ICLnlJ/miJAiCiAgICAgICAgICAgIDogdGhpcy5yYXBpZHVwbG9hZFRhc2suY2hlY2tNb2RlCiAgICAgICAgICAgICAgICA/ICLmtYvor5UiCiAgICAgICAgICAgICAgICA6ICLovazlrZgiOwogICAgICAgIHZhciBmaWxlSW5mb0xpc3QgPSBpc0dlbgogICAgICAgICAgICA/IHRoaXMuZ2VuZXJhdGViZGxpbmtUYXNrLmZpbGVJbmZvTGlzdAogICAgICAgICAgICA6IHRoaXMucmFwaWR1cGxvYWRUYXNrLmZpbGVJbmZvTGlzdDsKICAgICAgICB2YXIgcGFyc2VSZXN1bHQgPSBwYXJzZWZpbGVJbmZvKGZpbGVJbmZvTGlzdCwgdGhpcy5yYXBpZHVwbG9hZFRhc2suY2hlY2tNb2RlKTsKICAgICAgICB0aGlzLnBhcnNlUmVzdWx0ID0gcGFyc2VSZXN1bHQ7CiAgICAgICAgaWYgKGlzR2VuKSB7CiAgICAgICAgICAgIHRoaXMucmFwaWR1cGxvYWRUYXNrLnJlc2V0KCk7CiAgICAgICAgICAgIHRoaXMucmFwaWR1cGxvYWRUYXNrLmZpbGVJbmZvTGlzdCA9IHBhcnNlUmVzdWx0LnN1Y2Nlc3NMaXN0OwogICAgICAgIH0KICAgICAgICB2YXIgY2hlY2tib3hBcmcgPSB7CiAgICAgICAgICAgIGlucHV0OiAiY2hlY2tib3giLAogICAgICAgICAgICBpbnB1dFZhbHVlOiBHTV9nZXRWYWx1ZSgid2l0aF9wYXRoIiksCiAgICAgICAgICAgIGlucHV0UGxhY2Vob2xkZXI6ICLlr7zlh7rmlofku7blpLnnm67lvZXnu5PmnoQiLAogICAgICAgIH07IC8vIOWFqOmDqOWksei0peS4jeaYvuekuuatpGNoZWNrYm94LCAyMi41LjIyOiDlhajpg6jlpLHotKXkuZ/mmL7npLoKICAgICAgICB2YXIgaHRtbCA9IChpc0dlbgogICAgICAgICAgICA/IChwYXJzZVJlc3VsdC5mYWlsTGlzdC5sZW5ndGggIT0gZmlsZUluZm9MaXN0Lmxlbmd0aAogICAgICAgICAgICAgICAgPyBodG1sQ2hlY2tNZDUKICAgICAgICAgICAgICAgIDogIiIpICsgLy8g5re75Yqg5rWL6K+V56eS5Lyg5YWl5Y+jLCDoi6Xlhajpg6jlpLHotKXliJnkuI3mt7vliqAKICAgICAgICAgICAgICAgIGh0bWxEb2N1bWVudCAvLyDmt7vliqDmlofmoaPlhaXlj6MKICAgICAgICAgICAgOiAiIikgKwogICAgICAgICAgICAocGFyc2VSZXN1bHQuaHRtbEluZm8gJiYgaXNHZW4gPyAiPHA+PGJyPjwvcD4iIDogIiIpICsKICAgICAgICAgICAgcGFyc2VSZXN1bHQuaHRtbEluZm87IC8vIOa3u+WKoOWksei0peWIl+ihqCwg55Sf5oiQ5qih5byP5LiL5re75Yqg6aG26YOo56m66KGM5YiG6ZqUCiAgICAgICAgdmFyIGh0bWxGb290ZXIgPSAiIjsKICAgICAgICBpZiAoIUdNX2dldFZhbHVlKGRvbmF0ZVZlciArICJfa2lsbF9kb25hdGUiKSkKICAgICAgICAgICAgaHRtbEZvb3RlciArPSBodG1sRG9uYXRlOyAvLyDmt7vliqDotZ7liqnlhaXlj6Pmj5DnpLoKICAgICAgICBpZiAoIUdNX2dldFZhbHVlKGZlZWRiYWNrVmVyICsgIl9raWxsX2RvbmF0ZSIpKQogICAgICAgICAgICBodG1sRm9vdGVyICs9IGh0bWxGZWVkYmFjazsgLy8g5re75Yqg5Y+N6aaI5YWl5Y+j5o+Q56S6CiAgICAgICAgaWYgKGh0bWxGb290ZXIpCiAgICAgICAgICAgIGh0bWxGb290ZXIgPSAiPHA+PGJyPjwvcD4iICsgaHRtbEZvb3RlcjsgLy8g5re75Yqg5bqV6YOo56m66KGM5YiG6ZqUCiAgICAgICAgdmFyIHN3YWxBcmcgPSBfX2Fzc2lnbihfX2Fzc2lnbih7IHRpdGxlOiBhY3Rpb24gKyAiXHU1QjhDXHU2QkQ1IFx1NTE3MSIgKyBmaWxlSW5mb0xpc3QubGVuZ3RoICsgIlx1NEUyQSwgXHU1OTMxXHU4RDI1IiArIHBhcnNlUmVzdWx0LmZhaWxMaXN0Lmxlbmd0aCArICJcdTRFMkEhIiwgY29uZmlybUJ1dHRvblRleHQ6IGlzR2VuIHx8IHRoaXMucmFwaWR1cGxvYWRUYXNrLmNoZWNrTW9kZSA/ICLlpI3liLbnp5LkvKDku6PnoIEiIDogIuehruiupCIsIHNob3dEZW55QnV0dG9uOiBpc0dlbiB8fCB0aGlzLnJhcGlkdXBsb2FkVGFzay5jaGVja01vZGUsIGRlbnlCdXR0b25UZXh0OiAi5aSN5Yi25LiA6ZSu56eS5LygIiwgZGVueUJ1dHRvbkNvbG9yOiAiI2VjYWUzYyIsIHJldmVyc2VCdXR0b25zOiB0cnVlLCBodG1sOiBodG1sICsgaHRtbEZvb3RlciB9LCAoKGlzR2VuIHx8IHRoaXMucmFwaWR1cGxvYWRUYXNrLmNoZWNrTW9kZSkgJiYgY2hlY2tib3hBcmcpKSwgeyB3aWxsT3BlbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKCFpc0dlbiAmJiAhX3RoaXMucmFwaWR1cGxvYWRUYXNrLmNoZWNrTW9kZSkKICAgICAgICAgICAgICAgICAgICBfdGhpcy5hZGRPcGVuRGlyQnRuKCk7IC8vIOi9rOWtmOaooeW8j+aXtua3u+WKoCAi5omT5byA55uu5b2VIiDmjInpkq4KICAgICAgICAgICAgICAgIGlmIChpc0dlbiB8fCBfdGhpcy5yYXBpZHVwbG9hZFRhc2suY2hlY2tNb2RlKQogICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCJ1bkNsb3NlIiwgdHJ1ZSk7IC8vIOeUn+aIkOaooeW8j+iuvue9rue7k+aenOeql+WPo+acquWFs+mXreeahOagh+iusAogICAgICAgICAgICB9LCBwcmVEZW55OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgd2l0aF9wYXRoID0gJCgiI3N3YWwyLWNoZWNrYm94IilbMF0uY2hlY2tlZDsKICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCJ3aXRoX3BhdGgiLCB3aXRoX3BhdGgpOwogICAgICAgICAgICAgICAgaWYgKCF3aXRoX3BhdGgpCiAgICAgICAgICAgICAgICAgICAgR01fc2V0Q2xpcGJvYXJkKGJkbGlua1ByZWZpeCArIHBhcnNlUmVzdWx0LmJkY29kZS5yZXBsYWNlKC9cLy4rXC8vZywgIiIpLnRvQmFzZTY0KCkpOwogICAgICAgICAgICAgICAgLy8g5Y676Zmk55uu5b2V57uT5p6ELCDlubbovazmjaLkuLrkuIDplK7np5LkvKAKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBHTV9zZXRDbGlwYm9hcmQoYmRsaW5rUHJlZml4ICsgcGFyc2VSZXN1bHQuYmRjb2RlLnRvQmFzZTY0KCkpOyAvLyDovazmjaLkuLrkuIDplK7np5LkvKAKICAgICAgICAgICAgICAgIHN3ZWV0YWxlcnQyX2FsbF9kZWZhdWx0KCkuZ2V0RGVueUJ1dHRvbigpLmlubmVyVGV4dCA9ICLlpI3liLbmiJDlip8s54K55Ye75Y+z5LiK5YWz6ZetIjsKICAgICAgICAgICAgICAgIHZhciBmb290ZXIgPSBzd2VldGFsZXJ0Ml9hbGxfZGVmYXVsdCgpLmdldEZvb3RlcigpOwogICAgICAgICAgICAgICAgZm9vdGVyLmlubmVySFRNTCA9IGh0bWxBYm91dEJkbGluazsKICAgICAgICAgICAgICAgIGZvb3Rlci5zdHlsZS5kaXNwbGF5ID0gImZsZXgiOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9LCBwcmVDb25maXJtOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBpZiAoaXNHZW4gfHwgX3RoaXMucmFwaWR1cGxvYWRUYXNrLmNoZWNrTW9kZSkgewogICAgICAgICAgICAgICAgICAgIC8vIOeUn+aIkC/mtYvor5XmqKHlvI8sICLlpI3liLbnp5LkvKDku6PnoIEi5oyJ6ZKuCiAgICAgICAgICAgICAgICAgICAgdmFyIHdpdGhfcGF0aCA9ICQoIiNzd2FsMi1jaGVja2JveCIpWzBdLmNoZWNrZWQ7CiAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoIndpdGhfcGF0aCIsIHdpdGhfcGF0aCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aXRoX3BhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldENsaXBib2FyZChwYXJzZVJlc3VsdC5iZGNvZGUucmVwbGFjZSgvXC8uK1wvL2csICIiKSk7CiAgICAgICAgICAgICAgICAgICAgLy8g5Y676Zmk56eS5Lyg6ZO+5o6l5Lit55qE55uu5b2V57uT5p6EKOS7heS/neeVmeaWh+S7tuWQjSkKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldENsaXBib2FyZChwYXJzZVJlc3VsdC5iZGNvZGUpOyAvLyDkv53nlZnlrozmlbTnmoTmlofku7bot6/lvoQKICAgICAgICAgICAgICAgICAgICBzd2VldGFsZXJ0Ml9hbGxfZGVmYXVsdCgpLmdldENvbmZpcm1CdXR0b24oKS5pbm5lclRleHQgPSAi5aSN5Yi25oiQ5YqfLOeCueWHu+WPs+S4iuWFs+mXrSI7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8g6L2s5a2Y5qih5byPLCAi56Gu5a6aIiDmjInpkq4KICAgICAgICAgICAgICAgICAgICByZWZyZXNoTGlzdCgpOyAvLyDosIPnlKjliLfmlrDmlofku7bliJfooajnmoTmlrnms5UKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IH0pOwogICAgICAgIHN3ZWV0YWxlcnQyX2FsbF9kZWZhdWx0KCkuZmlyZSh0aGlzLm1lcmdlQXJnKFN3YWxDb25maWcuZmluaXNoVmlldywgc3dhbEFyZykpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkgewogICAgICAgICAgICBpZiAocmVzdWx0LmlzRGlzbWlzc2VkIHx8IHJlc3VsdC5kaXNtaXNzID09PSAoc3dlZXRhbGVydDJfYWxsX2RlZmF1bHQoKSkuRGlzbWlzc1JlYXNvbi5jbG9zZSkgewogICAgICAgICAgICAgICAgR01fZGVsZXRlVmFsdWUoInVuZmluaXNoIik7IC8vIOeCueWHu+S6huWPs+S4iuinkueahOWFs+mXreaMiemSriwg5riF6Zmk5Lu75Yqh6L+b5bqm5pWw5o2uCiAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgidW5DbG9zZSIsIGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfTsKICAgIC8vIOeUn+aIkOaWh+S7tuWkueenkuS8oCwg5piv5ZCm6YCS5b2S55Sf5oiQ5o+Q56S6CiAgICBTd2FsYmFzZS5wcm90b3R5cGUuY2hlY2tSZWN1cnNpdmUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICBzd2VldGFsZXJ0Ml9hbGxfZGVmYXVsdCgpLmZpcmUodGhpcy5tZXJnZUFyZyhTd2FsQ29uZmlnLmNoZWNrUmVjdXJzaXZlKSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgICAgIGlmIChyZXN1bHQuaXNDb25maXJtZWQpIHsKICAgICAgICAgICAgICAgIF90aGlzLmdlbmVyYXRlYmRsaW5rVGFzay5yZWN1cnNpdmUgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdC5kaXNtaXNzID09PSAoc3dlZXRhbGVydDJfYWxsX2RlZmF1bHQoKSkuRGlzbWlzc1JlYXNvbi5jYW5jZWwpCiAgICAgICAgICAgICAgICBfdGhpcy5nZW5lcmF0ZWJkbGlua1Rhc2sucmVjdXJzaXZlID0gZmFsc2U7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgX3RoaXMucHJvY2Vzc1ZpZXcodHJ1ZSk7CiAgICAgICAgICAgIF90aGlzLmdlbmVyYXRlYmRsaW5rVGFzay5zY2FuRmlsZSgwKTsKICAgICAgICB9KTsKICAgIH07CiAgICAvLyDorr7nva7pobUKICAgIFN3YWxiYXNlLnByb3RvdHlwZS5zZXR0aW5nVmlldyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgIHZhciB3aWxsT3BlbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgJCgiI3N3YWwyLWh0bWwtY29udGFpbmVyIikKICAgICAgICAgICAgICAgIC5jc3MoImZvbnQtc2l6ZSIsICIxcmVtIikKICAgICAgICAgICAgICAgIC5jc3MoImRpc3BsYXkiLCAiZ3JpZCIpCiAgICAgICAgICAgICAgICAuY3NzKCJtYXJnaW4iLCAiMCIpOwogICAgICAgICAgICAkKCIjbXpmLXRoZW1lIilbMF0udmFsdWUgPSBHTV9nZXRWYWx1ZSgic3dhbFRoZW1lcyIpIHx8ICJEZWZhdWx0IjsKICAgICAgICAgICAgJCgiI216Zi1saXN0ZW4tY2xpcGJvYXJkIilbMF0uY2hlY2tlZCA9IEJvb2xlYW4oR01fZ2V0VmFsdWUoImxpc3Rlbi1jbGlwYm9hcmQiKSk7CiAgICAgICAgICAgICQoIiNtemYtZmFzdC1nZW5lcmF0ZSIpWzBdLmNoZWNrZWQgPSBCb29sZWFuKEdNX2dldFZhbHVlKCJmYXN0LWdlbmVyYXRlIikpOwogICAgICAgIH07CiAgICAgICAgdmFyIHByZUNvbmZpcm0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfX2F3YWl0ZXIoX3RoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBlcnJvcl8xOwogICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAvLyDorr7nva7kuLvpopgKICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoInN3YWxUaGVtZXMiLCAkKCIjbXpmLXRoZW1lIilbMF0udmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISQoIiNtemYtbGlzdGVuLWNsaXBib2FyZCIpWzBdLmNoZWNrZWQpIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdOwogICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzEsIDMsICwgNF0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBuYXZpZ2F0b3IuY2xpcGJvYXJkLnJlYWRUZXh0KCldOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpOwogICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgibGlzdGVuLWNsaXBib2FyZCIsICQoIiNtemYtbGlzdGVuLWNsaXBib2FyZCIpWzBdLmNoZWNrZWQpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yXzEgPSBfYS5zZW50KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dBbGVydChhcHBFcnJvci5DbGlwYm9hcmRQcmVtaXNzaW9uRXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgLy8g6K6+572u5p6B6YCf55Sf5oiQLCDoi6XlvIDlkK/liJnlvLnlh7rmlofmnKzmj5DphpIKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQoIiNtemYtZmFzdC1nZW5lcmF0ZSIpWzBdLmNoZWNrZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93QWxlcnQoYXBwV2FybmluZy5mYXN0R2VuZXJhdGVXYXJuKTsKICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoImZhc3QtZ2VuZXJhdGUiLCAkKCIjbXpmLWZhc3QtZ2VuZXJhdGUiKVswXS5jaGVja2VkKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9KTsgfTsKICAgICAgICBzd2VldGFsZXJ0Ml9hbGxfZGVmYXVsdCgpLmZpcmUodGhpcy5tZXJnZUFyZyhTd2FsQ29uZmlnLnNldHRpbmdWaWV3LCB7CiAgICAgICAgICAgIHdpbGxPcGVuOiB3aWxsT3BlbiwKICAgICAgICAgICAgcHJlQ29uZmlybTogcHJlQ29uZmlybSwKICAgICAgICB9KSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgICAgIGlmIChyZXN1bHQuaXNDb25maXJtZWQpCiAgICAgICAgICAgICAgICBzd2VldGFsZXJ0Ml9hbGxfZGVmYXVsdCgpLmZpcmUoX3RoaXMubWVyZ2VBcmcoU3dhbENvbmZpZy5zZXR0aW5nV2FybmluZykpOwogICAgICAgIH0pOwogICAgfTsKICAgIC8vIOeUn+aIkOmhtSAo6L6T5YWl6Lev5b6E5YiX6KGo6L+b6KGM56eS5Lyg55Sf5oiQKQogICAgU3dhbGJhc2UucHJvdG90eXBlLmdlblZpZXcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICBzd2VldGFsZXJ0Ml9hbGxfZGVmYXVsdCgpLmZpcmUodGhpcy5tZXJnZUFyZyhTd2FsQ29uZmlnLmdlblZpZXcpKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsKICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0NvbmZpcm1lZCkgewogICAgICAgICAgICAgICAgX3RoaXMuZ2VuZXJhdGViZGxpbmtUYXNrLnJlc2V0KCk7CiAgICAgICAgICAgICAgICByZXN1bHQudmFsdWUuc3BsaXQoIlxuIikuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkgewogICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLmNoYXJBdCgwKSAhPT0gIi8iKQogICAgICAgICAgICAgICAgICAgICAgICBpdGVtID0gIi8iICsgaXRlbTsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5nZW5lcmF0ZWJkbGlua1Rhc2suZmlsZUluZm9MaXN0LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBpdGVtLAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBfdGhpcy5wcm9jZXNzVmlldyh0cnVlKTsgLy8g5pi+56S66L+b5bqm5by556qXCiAgICAgICAgICAgICAgICBfdGhpcy5nZW5GaWxlV29yayhmYWxzZSwgdHJ1ZSk7IC8vIOi3s+i/h+iOt+WPlumAieaLqeaWh+S7tuWIl+ihqOWSjOaJq+aPj+aWh+S7tuWkueeahOatpemqpAogICAgICAgICAgICAgICAgX3RoaXMuZ2VuZXJhdGViZGxpbmtUYXNrLmdlbmVyYXRlQmRsaW5rKDApOyAvLyDlvIDlp4vnlJ/miJDku7vliqEKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfTsKICAgIC8vIOeUn+aIkOenkuS8oOacquWujOaIkOS7u+WKoeaPkOekugogICAgU3dhbGJhc2UucHJvdG90eXBlLmdlblVuZmluaXNoID0gZnVuY3Rpb24gKG9uQ29uZmlybSwgb25DYW5jZWwpIHsKICAgICAgICBzd2VldGFsZXJ0Ml9hbGxfZGVmYXVsdCgpLmZpcmUodGhpcy5tZXJnZUFyZyhHTV9nZXRWYWx1ZSgidW5DbG9zZSIpCiAgICAgICAgICAgID8gU3dhbENvbmZpZy5nZW5VbmZpbmlzaDIKICAgICAgICAgICAgOiBTd2FsQ29uZmlnLmdlblVuZmluaXNoKSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgICAgIGlmIChyZXN1bHQuaXNDb25maXJtZWQpCiAgICAgICAgICAgICAgICBvbkNvbmZpcm0oKTsKICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0LmRpc21pc3MgPT09IChzd2VldGFsZXJ0Ml9hbGxfZGVmYXVsdCgpKS5EaXNtaXNzUmVhc29uLmNhbmNlbCkKICAgICAgICAgICAgICAgIG9uQ2FuY2VsKCk7CiAgICAgICAgfSk7CiAgICB9OwogICAgLy8g5rWL6K+V56eS5Lyg6KaG55uW5paH5Lu25o+Q56S6CiAgICBTd2FsYmFzZS5wcm90b3R5cGUuY2hlY2tNZDVXYXJuaW5nID0gZnVuY3Rpb24gKG9uQ29uZmlybSwgb25DYW5jZWwpIHsKICAgICAgICBzd2VldGFsZXJ0Ml9hbGxfZGVmYXVsdCgpLmZpcmUodGhpcy5tZXJnZUFyZyhTd2FsQ29uZmlnLmNoZWNrTWQ1V2FybmluZykpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkgewogICAgICAgICAgICBpZiAocmVzdWx0LmlzQ29uZmlybWVkKSB7CiAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgiY2hlY2tfbWQ1X3dhcm5pbmciLCByZXN1bHQudmFsdWUpOwogICAgICAgICAgICAgICAgb25Db25maXJtKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0LmRpc21pc3MgPT09IChzd2VldGFsZXJ0Ml9hbGxfZGVmYXVsdCgpKS5EaXNtaXNzUmVhc29uLmNhbmNlbCkKICAgICAgICAgICAgICAgIG9uQ2FuY2VsKCk7CiAgICAgICAgfSk7CiAgICB9OwogICAgLy8g55Sf5oiQ56eS5LygLCDmnKrpgInmi6nku7vkvZXmlofku7bnmoTmj5DnpLoKICAgIFN3YWxiYXNlLnByb3RvdHlwZS5zZWxlY3ROb0ZpbGVXYXJuaW5nID0gZnVuY3Rpb24gKCkgewogICAgICAgIHN3ZWV0YWxlcnQyX2FsbF9kZWZhdWx0KCkuZmlyZSh0aGlzLm1lcmdlQXJnKFN3YWxDb25maWcuc2VsZWN0Tm9GaWxlV2FybmluZykpOwogICAgfTsKICAgIC8vIOabtOaWsOS/oeaBr+mhtQogICAgU3dhbGJhc2UucHJvdG90eXBlLnVwZGF0ZUluZm8gPSBmdW5jdGlvbiAob25Db25maXJtKSB7CiAgICAgICAgc3dlZXRhbGVydDJfYWxsX2RlZmF1bHQoKS5maXJlKHRoaXMubWVyZ2VBcmcoU3dhbENvbmZpZy51cGRhdGVJbmZvKSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgICAgIGlmIChyZXN1bHQuaXNDb25maXJtZWQpCiAgICAgICAgICAgICAgICBvbkNvbmZpcm0oKTsKICAgICAgICB9KTsKICAgIH07CiAgICAvLyDku6XkuIvnmoTmlrnms5Xpg73mmK/ku7vliqHmk43kvZzpgLvovpEsIOS4jeaYr+W8ueeql+mAu+i+kQogICAgU3dhbGJhc2UucHJvdG90eXBlLnNhdmVGaWxlV29yayA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgIHRoaXMucmFwaWR1cGxvYWRUYXNrLm9uRmluaXNoID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMuZmluaXNoVmlldyhmYWxzZSk7IH07CiAgICAgICAgdGhpcy5yYXBpZHVwbG9hZFRhc2sub25Qcm9jZXNzID0gZnVuY3Rpb24gKGksIGZpbGVJbmZvTGlzdCkgewogICAgICAgICAgICBzd2VldGFsZXJ0Ml9hbGxfZGVmYXVsdCgpLmdldEh0bWxDb250YWluZXIoKS5xdWVyeVNlbGVjdG9yKCJmaWxlX251bSIpLnRleHRDb250ZW50ID0gaSArIDEgKyAiIC8gIiArIGZpbGVJbmZvTGlzdC5sZW5ndGg7CiAgICAgICAgfTsKICAgICAgICB0aGlzLnJhcGlkdXBsb2FkVGFzay5zdGFydCgpOyAvLyDlvIDlp4vovazlrZjku7vliqEKICAgIH07CiAgICBTd2FsYmFzZS5wcm90b3R5cGUuZ2VuRmlsZVdvcmsgPSBmdW5jdGlvbiAoaXNVbmZpbmlzaCwgaXNHZW5WaWV3KSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICBpZiAoIWlzR2VuVmlldykKICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZWJkbGlua1Rhc2suc2VsZWN0TGlzdCA9IGdldFNlbGVjdGVkRmlsZUxpc3QoKTsKICAgICAgICBpZiAoCiAgICAgICAgLy8g5pyq6YCJ5oup5paH5Lu2ICsg5peg5pyq5a6M5oiQ55qE55Sf5oiQ5Lu75YqhICsg5LiN5Zyo55Sf5oiQ6aG1IC0+IOW8ueWHuuacqumAieaLqeeUn+aIkOaWh+S7tueahOitpuWRiuW8ueWHugogICAgICAgICF0aGlzLmdlbmVyYXRlYmRsaW5rVGFzay5zZWxlY3RMaXN0Lmxlbmd0aCAmJgogICAgICAgICAgICAhaXNHZW5WaWV3ICYmCiAgICAgICAgICAgICFpc1VuZmluaXNoKSB7CiAgICAgICAgICAgIHRoaXMuc2VsZWN0Tm9GaWxlV2FybmluZygpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMuZ2VuZXJhdGViZGxpbmtUYXNrLm9uUHJvY2VzcyA9IGZ1bmN0aW9uIChpLCBmaWxlSW5mb0xpc3QpIHsKICAgICAgICAgICAgc3dlZXRhbGVydDJfYWxsX2RlZmF1bHQoKS5nZXRIdG1sQ29udGFpbmVyKCkucXVlcnlTZWxlY3RvcigiZmlsZV9udW0iKS50ZXh0Q29udGVudCA9IGkgKyAxICsgIiAvICIgKyBmaWxlSW5mb0xpc3QubGVuZ3RoOwogICAgICAgICAgICBzd2VldGFsZXJ0Ml9hbGxfZGVmYXVsdCgpLmdldEh0bWxDb250YWluZXIoKS5xdWVyeVNlbGVjdG9yKCJnZW5fcHJvZyIpLnRleHRDb250ZW50ID0gIjAlIjsKICAgICAgICB9OwogICAgICAgIHRoaXMuZ2VuZXJhdGViZGxpbmtUYXNrLm9uUHJvZ3Jlc3MgPSBmdW5jdGlvbiAoZSwgdGV4dCkgewogICAgICAgICAgICBpZiAodGV4dCA9PT0gdm9pZCAwKSB7IHRleHQgPSAiIjsgfQogICAgICAgICAgICBpZiAodGV4dCkgewogICAgICAgICAgICAgICAgLy8g5pi+56S66Ieq5a6a5LmJ5paH5pysCiAgICAgICAgICAgICAgICBzd2VldGFsZXJ0Ml9hbGxfZGVmYXVsdCgpLmdldEh0bWxDb250YWluZXIoKS5xdWVyeVNlbGVjdG9yKCJnZW5fcHJvZyIpLnRleHRDb250ZW50ID0gdGV4dDsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWUgfHwgdHlwZW9mIGUudG90YWwgIT09ICJudW1iZXIiKQogICAgICAgICAgICAgICAgcmV0dXJuOyAvLyDlj4LmlbDmlbDmja7kuI3mraPnoa4g6Lez6L+HCiAgICAgICAgICAgIHN3ZWV0YWxlcnQyX2FsbF9kZWZhdWx0KCkuZ2V0SHRtbENvbnRhaW5lcigpLnF1ZXJ5U2VsZWN0b3IoImdlbl9wcm9nIikudGV4dENvbnRlbnQgPSAoKGUubG9hZGVkIC8gZS50b3RhbCkgKgogICAgICAgICAgICAgICAgMTAwKS50b0ZpeGVkKCkgKyAiJSI7CiAgICAgICAgfTsKICAgICAgICB0aGlzLmdlbmVyYXRlYmRsaW5rVGFzay5vbkhhc05vRGlyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBfdGhpcy5wcm9jZXNzVmlldyh0cnVlKTsKICAgICAgICAgICAgX3RoaXMuZ2VuZXJhdGViZGxpbmtUYXNrLmdlbmVyYXRlQmRsaW5rKDApOwogICAgICAgIH07CiAgICAgICAgdGhpcy5nZW5lcmF0ZWJkbGlua1Rhc2sub25IYXNEaXIgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5jaGVja1JlY3Vyc2l2ZSgpOyB9OwogICAgICAgIHRoaXMuZ2VuZXJhdGViZGxpbmtUYXNrLm9uRmluaXNoID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMuZmluaXNoVmlldyh0cnVlKTsgfTsKICAgICAgICBpZiAoIWlzVW5maW5pc2ggJiYgIWlzR2VuVmlldykKICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZWJkbGlua1Rhc2suc3RhcnQoKTsgLy8g5omn6KGM5paw5Lu75Yqh5Yid5aeL5YyWCiAgICB9OwogICAgU3dhbGJhc2UucHJvdG90eXBlLmNoZWNrVW5maW5pc2ggPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICBpZiAoR01fZ2V0VmFsdWUoInVuZmluaXNoIikpIHsKICAgICAgICAgICAgdGhpcy5nZW5VbmZpbmlzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBfdGhpcy5wcm9jZXNzVmlldyh0cnVlKTsKICAgICAgICAgICAgICAgIF90aGlzLmdlbkZpbGVXb3JrKHRydWUsIGZhbHNlKTsKICAgICAgICAgICAgICAgIHZhciB1bmZpbmlzaEluZm8gPSBHTV9nZXRWYWx1ZSgidW5maW5pc2giKTsKICAgICAgICAgICAgICAgIF90aGlzLmdlbmVyYXRlYmRsaW5rVGFzay5maWxlSW5mb0xpc3QgPSB1bmZpbmlzaEluZm8uZmlsZV9pbmZvX2xpc3Q7CiAgICAgICAgICAgICAgICB1bmZpbmlzaEluZm8uaXNDaGVja01kNQogICAgICAgICAgICAgICAgICAgID8gX3RoaXMuZ2VuZXJhdGViZGxpbmtUYXNrLmNoZWNrTWQ1KHVuZmluaXNoSW5mby5maWxlX2lkKQogICAgICAgICAgICAgICAgICAgIDogX3RoaXMuZ2VuZXJhdGViZGxpbmtUYXNrLmdlbmVyYXRlQmRsaW5rKHVuZmluaXNoSW5mby5maWxlX2lkKTsKICAgICAgICAgICAgfSwgLy8g56Gu6K6k57un57ut5pyq5a6M5oiQ5Lu75YqhCiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIEdNX2RlbGV0ZVZhbHVlKCJ1bmZpbmlzaCIpOwogICAgICAgICAgICAgICAgX3RoaXMuZ2VuRmlsZVdvcmsoZmFsc2UsIGZhbHNlKTsKICAgICAgICAgICAgfSAvLyDkuI3nu6fnu63mnKrlrozmiJDku7vliqEsIOa4hemZpOaVsOaNriwg5byA5ZCv5paw5Lu75YqhCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aGlzLmdlbkZpbGVXb3JrKGZhbHNlLCBmYWxzZSk7CiAgICAgICAgfSAvLyDmsqHmnInmnKrlrozmiJDku7vliqEsIOebtOaOpeW8gOWQr+aWsOS7u+WKoQogICAgfTsKICAgIFN3YWxiYXNlLnByb3RvdHlwZS5jaGVja01kNSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgIHRoaXMucmFwaWR1cGxvYWRUYXNrLmNoZWNrTW9kZSA9IHRydWU7CiAgICAgICAgaWYgKCFHTV9nZXRWYWx1ZSgiY2hlY2tfbWQ1X3dhcm5pbmciKSkgewogICAgICAgICAgICB0aGlzLmNoZWNrTWQ1V2FybmluZyhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBfdGhpcy5wcm9jZXNzVmlldyhmYWxzZSk7CiAgICAgICAgICAgIH0sIC8vIOeCueWHu+ehruWumuaMiemSriwg5byA5aeL5rWL6K+V6L2s5a2YCiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIF90aGlzLmZpbmlzaFZpZXcodHJ1ZSk7CiAgICAgICAgICAgIH0gLy8g54K55Ye76L+U5Zue5oyJ6ZKuLCDlm57liLDnlJ/miJDlrozmiJDnmoTnlYzpnaIKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgICB0aGlzLnByb2Nlc3NWaWV3KGZhbHNlKTsgLy8g5bey5Yu+6YCJIuS4jeWGjeaPkOekuiIsIOebtOaOpeW8gOWni+a1i+ivlei9rOWtmAogICAgfTsKICAgIC8vIOa3u+WKoCAi5omT5byA55uu5b2VIiDmjInpkq4KICAgIFN3YWxiYXNlLnByb3RvdHlwZS5hZGRPcGVuRGlyQnRuID0gZnVuY3Rpb24gKCkgewogICAgICAgIGlmICghdGhpcy5yYXBpZHVwbG9hZFRhc2suaXNEZWZhdWx0UGF0aCkgewogICAgICAgICAgICB2YXIgX2Rpcl8xID0gKHRoaXMucmFwaWR1cGxvYWRUYXNrLnNhdmVQYXRoIHx8ICIiKS5yZXBsYWNlKC9cLyQvLCAiIik7IC8vIOWOu+mZpOi3r+W+hOe7k+WwvueahCIvIgogICAgICAgICAgICBpZiAoX2Rpcl8xLmNoYXJBdCgwKSAhPT0gIi8iKQogICAgICAgICAgICAgICAgX2Rpcl8xID0gIi8iICsgX2Rpcl8xOyAvLyDooaXpvZDot6/lvoTlvIDlpLTnmoQiLyIKICAgICAgICAgICAgdmFyIGNCdG4gPSBzd2VldGFsZXJ0Ml9hbGxfZGVmYXVsdCgpLmdldENvbmZpcm1CdXR0b24oKTsKICAgICAgICAgICAgdmFyIGJ0biA9IGNCdG4uY2xvbmVOb2RlKCk7CiAgICAgICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICLmiZPlvIDnm67lvZUiOwogICAgICAgICAgICBidG4uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gIiNlY2FlM2MiOwogICAgICAgICAgICBidG4ub25jbGljayA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBwYXRoID0gbG9jYXRpb24uaHJlZi5tYXRjaCgvKHBhdGg9KC4rPykpKD86JnwkKS8pOwogICAgICAgICAgICAgICAgaWYgKHBhdGgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAocGF0aFsyXSAhPT0gZW5jb2RlVVJJQ29tcG9uZW50KF9kaXJfMSkpCiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLmhyZWYgPSBsb2NhdGlvbi5ocmVmLnJlcGxhY2UoCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOS7heabv+aNonBhdGjlj4LmlbAsIOS4jeS/ruaUueWFtuS7luWPguaVsAogICAgICAgICAgICAgICAgICAgICAgICBwYXRoWzFdLCAicGF0aD0iICsgZW5jb2RlVVJJQ29tcG9uZW50KF9kaXJfMSkpOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaExpc3QoKTsgLy8gcGF0aOWPguaVsOebuOWQjCwg5bey5Zyo55uu5qCH55uu5b2V5LiLLCDosIPnlKjliLfmlrDlh73mlbAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZhciBjb25uZWN0Q2hhciA9IGxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoIj8iKSA/ICImIiA6ICI/IjsgLy8g56Gu5a6a5Y+C5pWw55qE6L+e5o6l56ymCiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24uaHJlZiArPSBjb25uZWN0Q2hhciArICJwYXRoPSIgKyBlbmNvZGVVUklDb21wb25lbnQoX2Rpcl8xKTsKICAgICAgICAgICAgICAgIH0gLy8g5rKh5pyJ5om+5YiwcGF0aOWPguaVsCwg55u05o6l5re75YqgCiAgICAgICAgICAgICAgICBzd2VldGFsZXJ0Ml9hbGxfZGVmYXVsdCgpLmNsb3NlKCk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGNCdG4uYmVmb3JlKGJ0bik7CiAgICAgICAgfQogICAgfTsKICAgIHJldHVybiBTd2FsYmFzZTsKfSgpKTsKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBjb25zdCBzd2FsQmFzZSA9IChTd2FsYmFzZSk7Cgo7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvY29tbW9uL2FqYXgudHN4Ci8qCiAqIEBBdXRob3I6IG1lbmd6b25lZmlyZQogKiBARGF0ZTogMjAyMS0wOC0yNyAxNDo0ODoyNAogKiBATGFzdEVkaXRUaW1lOiAyMDIyLTExLTE0IDA1OjUwOjM1CiAqIEBMYXN0RWRpdG9yczogbWVuZ3pvbmVmaXJlCiAqIEBEZXNjcmlwdGlvbjog6Ieq5bCB6KOFSlEgYWpheOaWueazlQogKi8KdmFyIGFqYXhfYXNzaWduID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHsKICAgIGFqYXhfYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbih0KSB7CiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07CiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkKICAgICAgICAgICAgICAgIHRbcF0gPSBzW3BdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdDsKICAgIH07CiAgICByZXR1cm4gYWpheF9hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKfTsKCmZ1bmN0aW9uIGFqYXgoY29uZmlnLCBjYWxsYmFjaywgZmFpbGJhY2spIHsKICAgIEdNX3htbGh0dHBSZXF1ZXN0KGFqYXhfYXNzaWduKGFqYXhfYXNzaWduKHt9LCBjb25maWcpLCB7IG9ubG9hZDogZnVuY3Rpb24gKHIpIHsKICAgICAgICAgICAgLy8gY29uc29sZS5sb2cocik7IC8vIGRlYnVnCiAgICAgICAgICAgIGlmIChNYXRoLmZsb29yKHIuc3RhdHVzIC8gMTAwKSA9PT0gMikKICAgICAgICAgICAgICAgIGNhbGxiYWNrKHIpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBmYWlsYmFjayhyLnN0YXR1cyk7CiAgICAgICAgfSwgb25lcnJvcjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICBmYWlsYmFjayhhamF4RXJyb3IpOwogICAgICAgIH0gfSkpOwp9Cgo7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvYmFpZHUvY29tbW9uL3JhcGlkdXBsb2FkVGFzay50c3gKLyoKICogQEF1dGhvcjogbWVuZ3pvbmVmaXJlCiAqIEBEYXRlOiAyMDIxLTA4LTI1IDAxOjMwOjI5CiAqIEBMYXN0RWRpdFRpbWU6IDIwMjItMTItMDUgMTQ6MzM6NDMKICogQExhc3RFZGl0b3JzOiBtZW5nem9uZWZpcmUKICogQERlc2NyaXB0aW9uOiDnmb7luqbnvZHnm5gg56eS5Lyg6L2s5a2Y5Lu75Yqh5a6e546wCiAqLwoKCgp2YXIgUmFwaWR1cGxvYWRUYXNrID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkgewogICAgZnVuY3Rpb24gUmFwaWR1cGxvYWRUYXNrKCkgewogICAgfQogICAgUmFwaWR1cGxvYWRUYXNrLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB0aGlzLmJkc3Rva2VuID0gZ2V0QmRzdG9rZW4oKTsKICAgICAgICBjb25zb2xlLmxvZygiYmRzdG9rZW5cdTcyQjZcdTYwMDE6ICIgKyAodGhpcy5iZHN0b2tlbiA/ICLojrflj5bmiJDlip8iIDogIuiOt+WPluWksei0pSIpKTsgLy8gZGVidWcKICAgICAgICB0aGlzLmZpbGVJbmZvTGlzdCA9IFtdOwogICAgICAgIHRoaXMuc2F2ZVBhdGggPSAiIjsKICAgICAgICB0aGlzLmNoZWNrTW9kZSA9IGZhbHNlOwogICAgICAgIHRoaXMuaXNEZWZhdWx0UGF0aCA9IGZhbHNlOwogICAgICAgIHRoaXMub25GaW5pc2ggPSBmdW5jdGlvbiAoKSB7IH07CiAgICAgICAgdGhpcy5vblByb2Nlc3MgPSBmdW5jdGlvbiAoKSB7IH07CiAgICB9OwogICAgUmFwaWR1cGxvYWRUYXNrLnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAodGhpcy5jaGVja01vZGUpCiAgICAgICAgICAgIHRoaXMuc2F2ZVBhdGggPSAiIjsKICAgICAgICB0aGlzLnNhdmVGaWxlVjIoMCk7CiAgICB9OwogICAgLyoqCiAgICAgKiBAZGVzY3JpcHRpb246IOi9rOWtmOenkuS8oCDmjqXlj6MyCiAgICAgKiBAcGFyYW0ge251bWJlcn0gaQogICAgICovCiAgICBSYXBpZHVwbG9hZFRhc2sucHJvdG90eXBlLnNhdmVGaWxlVjIgPSBmdW5jdGlvbiAoaSkgewogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgaWYgKGkgPj0gdGhpcy5maWxlSW5mb0xpc3QubGVuZ3RoKSB7CiAgICAgICAgICAgIHRoaXMub25GaW5pc2godGhpcy5maWxlSW5mb0xpc3QpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMub25Qcm9jZXNzKGksIHRoaXMuZmlsZUluZm9MaXN0KTsKICAgICAgICB2YXIgZmlsZSA9IHRoaXMuZmlsZUluZm9MaXN0W2ldOwogICAgICAgIC8vIOaWh+S7tuWQjeWQq+aciemdnuazleWtl+espiAvIOaWh+S7tuWQjeS4uuepugogICAgICAgIGlmIChmaWxlLnBhdGgubWF0Y2goL1siXFxcOio/PD58XS8pIHx8IGZpbGUucGF0aCA9PT0gIi8iKSB7CiAgICAgICAgICAgIGZpbGUuZXJybm8gPSAtNzsKICAgICAgICAgICAgdGhpcy5zYXZlRmlsZVYyKGkgKyAxKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgb25GYWlsZWQgPSBmdW5jdGlvbiAoc3RhdHVzQ29kZSkgewogICAgICAgICAgICBmaWxlLmVycm5vID0gc3RhdHVzQ29kZTsKICAgICAgICAgICAgX3RoaXMuc2F2ZUZpbGVWMihpICsgMSk7CiAgICAgICAgfTsKICAgICAgICBwcmVjcmVhdGVGaWxlVjIuY2FsbCh0aGlzLCBmaWxlLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICBkYXRhID0gZGF0YS5yZXNwb25zZTsKICAgICAgICAgICAgaWYgKDAgPT09IGRhdGEuZXJybm8pIHsKICAgICAgICAgICAgICAgIGlmICgwID09PSBkYXRhLmJsb2NrX2xpc3QubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuY3JlYXRlRmlsZVYyKGZpbGUsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLnJlc3BvbnNlOwogICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmVycm5vID0gMiA9PT0gZGF0YS5lcnJubyA/IDExNCA6IGRhdGEuZXJybm87CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuZXJybm8gPSAzMTE5MCA9PT0gZmlsZS5lcnJubyA/IDQwNCA6IGZpbGUuZXJybm87CiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnNhdmVGaWxlVjIoaSArIDEpOwogICAgICAgICAgICAgICAgICAgIH0sIG9uRmFpbGVkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGZpbGUuZXJybm8gPSA0MDQ7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuc2F2ZUZpbGVWMihpICsgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBmaWxlLmVycm5vID0gZGF0YS5lcnJubzsKICAgICAgICAgICAgICAgIF90aGlzLnNhdmVGaWxlVjIoaSArIDEpOwogICAgICAgICAgICB9CiAgICAgICAgfSwgb25GYWlsZWQpOwogICAgfTsKICAgIC8vIOatpOaOpeWPo+a1i+ivlee7k+aenOWmguS4izog6ZSZ6K+vbWQ1LT7ov5Tlm54iZXJybm8iOiAzMTE5MCwg5q2j56GubWQ1K+mUmeivr3NpemUtPui/lOWbniJlcnJubyI6IDIKICAgIC8vIOatpOWkliwg5Y2z5L2/bWQ15ZKMc2l6ZeWdh+ato+ehriwg6L+e57ut6K+35rGC5pe25L6d5pen5pyJ5bCP5qaC546H6L+U5ZueImVycm5vIjogMiwg5pWF5bu66K6u5Yqg5YWlcmV0cnnnrZbnlaUKICAgIFJhcGlkdXBsb2FkVGFzay5wcm90b3R5cGUuY3JlYXRlRmlsZVYyID0gZnVuY3Rpb24gKGZpbGUsIG9uUmVzcG9uc2VkLCBvbkZhaWxlZCwgcmV0cnkpIHsKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgIGlmIChyZXRyeSA9PT0gdm9pZCAwKSB7IHJldHJ5ID0gMDsgfQogICAgICAgIGFqYXgoewogICAgICAgICAgICB1cmw6ICIiICsgY3JlYXRlX3VybCArICh0aGlzLmJkc3Rva2VuICYmICImYmRzdG9rZW49IiArIHRoaXMuYmRzdG9rZW4pLAogICAgICAgICAgICBtZXRob2Q6ICJQT1NUIiwKICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAianNvbiIsCiAgICAgICAgICAgIGRhdGE6IGNvbnZlcnREYXRhKHsKICAgICAgICAgICAgICAgIGJsb2NrX2xpc3Q6IEpTT04uc3RyaW5naWZ5KFtmaWxlLm1kNS50b0xvd2VyQ2FzZSgpXSksCiAgICAgICAgICAgICAgICBwYXRoOiB0aGlzLnNhdmVQYXRoICsgZmlsZS5wYXRoLAogICAgICAgICAgICAgICAgc2l6ZTogZmlsZS5zaXplLAogICAgICAgICAgICAgICAgaXNkaXI6IDAsCiAgICAgICAgICAgICAgICBydHlwZTogdGhpcy5jaGVja01vZGUgPyAzIDogMCwgLy8gcnR5cGU9M+imhuebluaWh+S7tiwgcnR5cGU9MOWImei/lOWbnuaKpemUmSwg5LiN6KaG55uW5paH5Lu2LCDpu5jorqTkuLpydHlwZT0xKOiHquWKqOmHjeWRveWQjSkKICAgICAgICAgICAgfSksCiAgICAgICAgfSwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgLy8gY29uc29sZS5sb2coZGF0YS5yZXNwb25zZSk7IC8vIGRlYnVnCiAgICAgICAgICAgIGlmICgzMTAzOSA9PT0gZGF0YS5yZXNwb25zZS5lcnJubyAmJiAzMTAzOSAhPSBmaWxlLmVycm5vKSB7CiAgICAgICAgICAgICAgICBmaWxlLmVycm5vID0gMzEwMzk7CiAgICAgICAgICAgICAgICBmaWxlLnBhdGggPSBzdWZmaXhDaGFuZ2UoZmlsZS5wYXRoKTsKICAgICAgICAgICAgICAgIF90aGlzLmNyZWF0ZUZpbGVWMihmaWxlLCBvblJlc3BvbnNlZCwgb25GYWlsZWQsIHJldHJ5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICgyID09PSBkYXRhLnJlc3BvbnNlLmVycm5vICYmIHJldHJ5IDwgcmV0cnlNYXhfYXBpVjIpCiAgICAgICAgICAgICAgICBfdGhpcy5jcmVhdGVGaWxlVjIoZmlsZSwgb25SZXNwb25zZWQsIG9uRmFpbGVkLCArK3JldHJ5KTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgb25SZXNwb25zZWQoZGF0YSk7CiAgICAgICAgfSwgb25GYWlsZWQpOwogICAgfTsKICAgIHJldHVybiBSYXBpZHVwbG9hZFRhc2s7Cn0oKSk7Ci8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gY29uc3QgcmFwaWR1cGxvYWRUYXNrID0gKCgvKiB1bnVzZWQgcHVyZSBleHByZXNzaW9uIG9yIHN1cGVyICovIG51bGwgJiYgKFJhcGlkdXBsb2FkVGFzaykpKTsKLy8g5q2k5o6l5Y+j5rWL6K+V57uT5p6c5aaC5LiLOiDplJnor69tZDUtPui/lOWbnmJsb2NrX2xpc3Q6IFswXSwg5q2j56GubWQ1K+ato+ehri/plJnor69zaXplLT7ov5Tlm55ibG9ja19saXN0OiBbXQpmdW5jdGlvbiBwcmVjcmVhdGVGaWxlVjIoZmlsZSwgb25SZXNwb25zZWQsIG9uRmFpbGVkKSB7CiAgICBhamF4KHsKICAgICAgICB1cmw6ICIiICsgcHJlY3JlYXRlX3VybCArICh0aGlzLmJkc3Rva2VuICYmICImYmRzdG9rZW49IiArIHRoaXMuYmRzdG9rZW4pLAogICAgICAgIG1ldGhvZDogIlBPU1QiLAogICAgICAgIHJlc3BvbnNlVHlwZTogImpzb24iLAogICAgICAgIGRhdGE6IGNvbnZlcnREYXRhKHsKICAgICAgICAgICAgYmxvY2tfbGlzdDogSlNPTi5zdHJpbmdpZnkoW2ZpbGUubWQ1LnRvTG93ZXJDYXNlKCldKSwKICAgICAgICAgICAgcGF0aDogdGhpcy5zYXZlUGF0aCArIGZpbGUucGF0aCwKICAgICAgICAgICAgc2l6ZTogZmlsZS5zaXplLAogICAgICAgICAgICBpc2RpcjogMCwKICAgICAgICAgICAgYXV0b2luaXQ6IDEsCiAgICAgICAgfSksCiAgICB9LCBvblJlc3BvbnNlZCwgb25GYWlsZWQpOwp9CgovLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3NwYXJrLW1kNS9zcGFyay1tZDUuanMKdmFyIHNwYXJrX21kNSA9IF9fd2VicGFja19yZXF1aXJlX18oMzIyKTsKdmFyIHNwYXJrX21kNV9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihzcGFya19tZDUpOwo7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvYmFpZHUvY29tbW9uL0dlbmVyYXRlYmRsaW5rVGFzay50c3gKLyoKICogQEF1dGhvcjogbWVuZ3pvbmVmaXJlCiAqIEBEYXRlOiAyMDIxLTA4LTI1IDAxOjMxOjAxCiAqIEBMYXN0RWRpdFRpbWU6IDIwMjItMTEtMTEgMDI6MDI6MzgKICogQExhc3RFZGl0b3JzOiBtZW5nem9uZWZpcmUKICogQERlc2NyaXB0aW9uOiDnmb7luqbnvZHnm5gg56eS5Lyg55Sf5oiQ5Lu75Yqh5a6e546wCiAqLwoKCgoKCgovLyDmma7pgJrnlJ/miJA6CnZhciBHZW5lcmF0ZWJkbGlua1Rhc2sgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiBHZW5lcmF0ZWJkbGlua1Rhc2soKSB7CiAgICB9CiAgICBHZW5lcmF0ZWJkbGlua1Rhc2sucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkgewogICAgICAgIHRoaXMuaXNHZW5WaWV3ID0gZmFsc2U7IC8vIOagh+iusOaYr+WQpuS9v+eUqOeUn+aIkOmhteeUn+aIkAogICAgICAgIHRoaXMuaXNGYXN0ID0gR01fZ2V0VmFsdWUoImZhc3QtZ2VuZXJhdGUiKTsKICAgICAgICB0aGlzLnNhdmVQYXRoID0gIiI7CiAgICAgICAgdGhpcy5yZWN1cnNpdmUgPSBmYWxzZTsKICAgICAgICB0aGlzLmJkc3Rva2VuID0gZ2V0QmRzdG9rZW4oKTsKICAgICAgICB0aGlzLmRpckxpc3QgPSBbXTsKICAgICAgICB0aGlzLnNlbGVjdExpc3QgPSBbXTsKICAgICAgICB0aGlzLmZpbGVJbmZvTGlzdCA9IFtdOwogICAgICAgIHRoaXMub25GaW5pc2ggPSBmdW5jdGlvbiAoKSB7IH07CiAgICAgICAgdGhpcy5vblByb2Nlc3MgPSBmdW5jdGlvbiAoKSB7IH07CiAgICAgICAgdGhpcy5vblByb2dyZXNzID0gZnVuY3Rpb24gKCkgeyB9OwogICAgICAgIHRoaXMub25IYXNEaXIgPSBmdW5jdGlvbiAoKSB7IH07CiAgICAgICAgdGhpcy5vbkhhc05vRGlyID0gZnVuY3Rpb24gKCkgeyB9OwogICAgfTsKICAgIC8qKgogICAgICogQGRlc2NyaXB0aW9uOiDmiafooYzmlrDku7vliqHnmoTliJ3lp4vljJbmraXpqqQg5omr5o+P6YCJ5oup55qE5paH5Lu25YiX6KGoCiAgICAgKi8KICAgIEdlbmVyYXRlYmRsaW5rVGFzay5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICB0aGlzLnNlbGVjdExpc3QuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkgewogICAgICAgICAgICBpZiAoaXRlbS5pc2RpcikKICAgICAgICAgICAgICAgIF90aGlzLmRpckxpc3QucHVzaChpdGVtLnBhdGgpOwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIF90aGlzLmZpbGVJbmZvTGlzdC5wdXNoKHsKICAgICAgICAgICAgICAgICAgICBwYXRoOiBpdGVtLnBhdGgsCiAgICAgICAgICAgICAgICAgICAgc2l6ZTogaXRlbS5zaXplLAogICAgICAgICAgICAgICAgICAgIGZzX2lkOiBpdGVtLmZzX2lkLAogICAgICAgICAgICAgICAgICAgIC8vIOW3suW8gOWQr+aegemAn+eUn+aIkCwg55u05o6l5Y+WbWV0YeWGheeahG1kNQogICAgICAgICAgICAgICAgICAgIG1kNTogX3RoaXMuaXNGYXN0ID8gZGVjcnlwdE1kNShpdGVtLm1kNS50b0xvd2VyQ2FzZSgpKSA6ICIiLAogICAgICAgICAgICAgICAgICAgIG1kNXM6ICIiLAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBpZiAodGhpcy5kaXJMaXN0Lmxlbmd0aCkKICAgICAgICAgICAgdGhpcy5vbkhhc0RpcigpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgdGhpcy5vbkhhc05vRGlyKCk7CiAgICB9OwogICAgLyoqCiAgICAgKiBAZGVzY3JpcHRpb246IOmAieaLqeeahOWIl+ihqOWMheWQq+aWh+S7tuWkuSwg6I635Y+W5paH5Lu25aS55LiL55qE5a2Q5paH5Lu2CiAgICAgKiBAcGFyYW0ge251bWJlcn0gaSDmnaHnm65pbmRleAogICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IOWIl+ihqOaOpeWPo+ajgOe0oui1t+eCuQogICAgICovCiAgICBHZW5lcmF0ZWJkbGlua1Rhc2sucHJvdG90eXBlLnNjYW5GaWxlID0gZnVuY3Rpb24gKGksIHN0YXJ0KSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICBpZiAoc3RhcnQgPT09IHZvaWQgMCkgeyBzdGFydCA9IDA7IH0KICAgICAgICBpZiAoaSA+PSB0aGlzLmRpckxpc3QubGVuZ3RoKSB7CiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVCZGxpbmsoMCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgYWpheCh7CiAgICAgICAgICAgIHVybDogbGlzdF91cmwgKyAiJnBhdGg9IiArIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLmRpckxpc3RbaV0pICsgIiZyZWN1cnNpb249IiArICh0aGlzLnJlY3Vyc2l2ZSA/IDEgOiAwKSArICImc3RhcnQ9IiArIHN0YXJ0LAogICAgICAgICAgICBtZXRob2Q6ICJHRVQiLAogICAgICAgICAgICByZXNwb25zZVR5cGU6ICJqc29uIiwKICAgICAgICB9LCAvLyBsaXN05o6l5Y+j6Ieq5bim6YCS5b2S5Y+C5pWwcmVjdXJzaW9uCiAgICAgICAgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgZGF0YSA9IGRhdGEucmVzcG9uc2U7CiAgICAgICAgICAgIGlmICghZGF0YS5lcnJubykgewogICAgICAgICAgICAgICAgaWYgKCFkYXRhLmxpc3QubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgIF90aGlzLnNjYW5GaWxlKGkgKyAxKTsgLy8g6L+U5Zue5YiX6KGo5Li656m6LCDljbPmraTmlofku7blpLnmlofku7blhajpg6jmiavmj4/lrozmiJAKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGRhdGEubGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uaXNkaXIgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmZpbGVJbmZvTGlzdC5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBpdGVtLnBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogaXRlbS5zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzX2lkOiBpdGVtLmZzX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kNTogX3RoaXMuaXNGYXN0ID8gZGVjcnlwdE1kNShpdGVtLm1kNS50b0xvd2VyQ2FzZSgpKSA6ICIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kNXM6ICIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7IC8vIOetm+mAieaWh+S7tihpc2Rpcj0wKQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIF90aGlzLnNjYW5GaWxlKGksIHN0YXJ0ICsgbGlzdExpbWl0KTsgLy8g5LuO5LiL5LiA5Liq6LW354K557un57ut5qOA57Si5YiX6KGoCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBfdGhpcy5maWxlSW5mb0xpc3QucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgcGF0aDogX3RoaXMuZGlyTGlzdFtpXSwKICAgICAgICAgICAgICAgICAgICBlcnJubzogZGF0YS5lcnJubywKICAgICAgICAgICAgICAgIH0pOyAvLyBsaXN05o6l5Y+j6K6/6Zeu5aSx6LSlLCDmt7vliqDlpLHotKXkv6Hmga8KICAgICAgICAgICAgICAgIF90aGlzLnNjYW5GaWxlKGkgKyAxKTsKICAgICAgICAgICAgfQogICAgICAgIH0sIGZ1bmN0aW9uIChzdGF0dXNDb2RlKSB7CiAgICAgICAgICAgIF90aGlzLmZpbGVJbmZvTGlzdC5wdXNoKHsKICAgICAgICAgICAgICAgIHBhdGg6IF90aGlzLmRpckxpc3RbaV0sCiAgICAgICAgICAgICAgICBlcnJubzogc3RhdHVzQ29kZSA9PT0gNTAwID8gOTAxIDogc3RhdHVzQ29kZSwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIF90aGlzLnNjYW5GaWxlKGkgKyAxKTsKICAgICAgICB9KTsKICAgIH07CiAgICAvKioKICAgICAqIEBkZXNjcmlwdGlvbjog6aG65bqP5omn6KGM55Sf5oiQ5Lu75YqhCiAgICAgKiBAcGFyYW0ge251bWJlcn0gaQogICAgICovCiAgICBHZW5lcmF0ZWJkbGlua1Rhc2sucHJvdG90eXBlLmdlbmVyYXRlQmRsaW5rID0gZnVuY3Rpb24gKGkpIHsKICAgICAgICAvLyDkv53lrZjku7vliqHov5vluqbmlbDmja4KICAgICAgICBHTV9zZXRWYWx1ZSgidW5maW5pc2giLCB7CiAgICAgICAgICAgIGZpbGVfaW5mb19saXN0OiB0aGlzLmZpbGVJbmZvTGlzdCwKICAgICAgICAgICAgZmlsZV9pZDogaSwKICAgICAgICB9KTsKICAgICAgICAvLyDnlJ/miJDlrozmiJAKICAgICAgICBpZiAoaSA+PSB0aGlzLmZpbGVJbmZvTGlzdC5sZW5ndGgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuaXNGYXN0KQogICAgICAgICAgICAgICAgdGhpcy5jaGVja01kNSgwKTsgLy8g5bey5byA5ZCvICLmnoHpgJ/nlJ/miJAiLCDmiafooYxtZDXmo4Dmn6UKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgdGhpcy5vbkZpbmlzaCh0aGlzLmZpbGVJbmZvTGlzdCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLy8g55Sf5oiQ6YC76L6RCiAgICAgICAgaWYgKCF0aGlzLmlzRmFzdCkKICAgICAgICAgICAgdGhpcy5vblByb2Nlc3MoaSwgdGhpcy5maWxlSW5mb0xpc3QpOyAvLyDmnKrlvIDlkK8gIuaegemAn+eUn+aIkCIsIOWIt+aWsOW8ueeql+WGheeahOS7u+WKoei/m+W6pgogICAgICAgIHZhciBmaWxlID0gdGhpcy5maWxlSW5mb0xpc3RbaV07CiAgICAgICAgLy8g6Lez6L+H5omr5o+P5aSx6LSl55qE55uu5b2V6Lev5b6ECiAgICAgICAgaWYgKGZpbGUuZXJybm8pIHsKICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUJkbGluayhpICsgMSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLy8g5bey5byA5ZCvICLmnoHpgJ/nlJ/miJAiIOS4lOW3suiOt+WPluWIsG1kNSwg6Lez6L+H5pmu6YCa55Sf5oiQ5q2l6aqkCiAgICAgICAgaWYgKHRoaXMuaXNGYXN0ICYmIGZpbGUubWQ1KQogICAgICAgICAgICB0aGlzLmdlbmVyYXRlQmRsaW5rKGkgKyAxKTsKICAgICAgICAvLyDmma7pgJrnlJ/miJDmraXpqqQKICAgICAgICBlbHNlCiAgICAgICAgICAgIHRoaXMuZ2V0RGxpbmsoaSk7CiAgICB9OwogICAgLyoqCiAgICAgKiBAZGVzY3JpcHRpb246IOiOt+WPluaWh+S7tuS/oeaBrzogc2l6ZSwgbWQ1KOWPr+iDvemUmeivryksIGZzX2lkCiAgICAgKiBAcGFyYW0ge251bWJlcn0gaQogICAgICovCiAgICBHZW5lcmF0ZWJkbGlua1Rhc2sucHJvdG90eXBlLmdldEZpbGVJbmZvID0gZnVuY3Rpb24gKGkpIHsKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgIHZhciBmaWxlID0gdGhpcy5maWxlSW5mb0xpc3RbaV07CiAgICAgICAgYWpheCh7CiAgICAgICAgICAgIHVybDogbWV0YV91cmwgKyBlbmNvZGVVUklDb21wb25lbnQoZmlsZS5wYXRoKSwKICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAianNvbiIsCiAgICAgICAgICAgIG1ldGhvZDogIkdFVCIsCiAgICAgICAgfSwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgZGF0YSA9IGRhdGEucmVzcG9uc2U7CiAgICAgICAgICAgIGlmICghZGF0YS5lcnJubykgewogICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coZGF0YS5saXN0WzBdKTsgLy8gZGVidWcKICAgICAgICAgICAgICAgIGlmIChkYXRhLmxpc3RbMF0uaXNkaXIpIHsKICAgICAgICAgICAgICAgICAgICBmaWxlLmVycm5vID0gOTAwOwogICAgICAgICAgICAgICAgICAgIF90aGlzLmdlbmVyYXRlQmRsaW5rKGkgKyAxKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmaWxlLnNpemUgPSBkYXRhLmxpc3RbMF0uc2l6ZTsKICAgICAgICAgICAgICAgIGZpbGUuZnNfaWQgPSBkYXRhLmxpc3RbMF0uZnNfaWQ7CiAgICAgICAgICAgICAgICAvLyDlt7LlvIDlkK/mnoHpgJ/nlJ/miJAsIOebtOaOpeWPlm1ldGHlhoXnmoRtZDUKICAgICAgICAgICAgICAgIGZpbGUubWQ1ID0gX3RoaXMuaXNGYXN0CiAgICAgICAgICAgICAgICAgICAgPyBkZWNyeXB0TWQ1KGRhdGEubGlzdFswXS5tZDUudG9Mb3dlckNhc2UoKSkKICAgICAgICAgICAgICAgICAgICA6ICIiOwogICAgICAgICAgICAgICAgZmlsZS5tZDVzID0gIiI7CiAgICAgICAgICAgICAgICBfdGhpcy5nZXREbGluayhpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGZpbGUuZXJybm8gPSBkYXRhLmVycm5vOwogICAgICAgICAgICAgICAgX3RoaXMuZ2VuZXJhdGVCZGxpbmsoaSArIDEpOwogICAgICAgICAgICB9CiAgICAgICAgfSwgZnVuY3Rpb24gKHN0YXR1c0NvZGUpIHsKICAgICAgICAgICAgZmlsZS5lcnJubyA9IHN0YXR1c0NvZGUgPT09IDQwNCA/IDkwOSA6IHN0YXR1c0NvZGU7CiAgICAgICAgICAgIF90aGlzLmdlbmVyYXRlQmRsaW5rKGkgKyAxKTsKICAgICAgICB9KTsKICAgIH07CiAgICAvKioKICAgICAqIEBkZXNjcmlwdGlvbjog6I635Y+W5paH5Lu2ZGxpbmso5LiL6L2955u06ZO+KQogICAgICogQHBhcmFtIHtudW1iZXJ9IGkKICAgICAqLwogICAgR2VuZXJhdGViZGxpbmtUYXNrLnByb3RvdHlwZS5nZXREbGluayA9IGZ1bmN0aW9uIChpKSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICB2YXIgZmlsZSA9IHRoaXMuZmlsZUluZm9MaXN0W2ldOwogICAgICAgIC8vIOS9v+eUqOeUn+aIkOmhteaXtuS7heaciXBhdGjmsqHmnIlmc19pZCwg6Lez6L2s5Yiw6I635Y+WZnNfaWQKICAgICAgICBpZiAoIWZpbGUuZnNfaWQpIHsKICAgICAgICAgICAgdGhpcy5nZXRGaWxlSW5mbyhpKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBhamF4KHsKICAgICAgICAgICAgdXJsOiBtZXRhX3VybDIgKyBKU09OLnN0cmluZ2lmeShbZmlsZS5mc19pZF0pLAogICAgICAgICAgICByZXNwb25zZVR5cGU6ICJqc29uIiwKICAgICAgICAgICAgbWV0aG9kOiAiR0VUIiwKICAgICAgICB9LCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICBkYXRhID0gZGF0YS5yZXNwb25zZTsKICAgICAgICAgICAgLy8g6K+35rGC5q2j5bi4CiAgICAgICAgICAgIGlmICghZGF0YS5lcnJubykgewogICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coZGF0YS5saXN0WzBdKTsgLy8gZGVidWcKICAgICAgICAgICAgICAgIF90aGlzLmRvd25sb2FkRmlsZURhdGEoaSwgZGF0YS5saXN0WzBdLmRsaW5rKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyDor7fmsYLmiqXplJkKICAgICAgICAgICAgZmlsZS5lcnJubyA9IGRhdGEuZXJybm87CiAgICAgICAgICAgIF90aGlzLmlzRmFzdCA/IF90aGlzLmNoZWNrTWQ1KGkgKyAxKSA6IF90aGlzLmdlbmVyYXRlQmRsaW5rKGkgKyAxKTsKICAgICAgICB9LCBmdW5jdGlvbiAoc3RhdHVzQ29kZSkgewogICAgICAgICAgICBmaWxlLmVycm5vID0gc3RhdHVzQ29kZTsKICAgICAgICAgICAgX3RoaXMuaXNGYXN0ID8gX3RoaXMuY2hlY2tNZDUoaSArIDEpIDogX3RoaXMuZ2VuZXJhdGVCZGxpbmsoaSArIDEpOwogICAgICAgIH0pOwogICAgfTsKICAgIC8qKgogICAgICogQGRlc2NyaXB0aW9uOiDosIPnlKjkuIvovb3nm7Tpk74KICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGxpbmsKICAgICAqLwogICAgR2VuZXJhdGViZGxpbmtUYXNrLnByb3RvdHlwZS5kb3dubG9hZEZpbGVEYXRhID0gZnVuY3Rpb24gKGksIGRsaW5rKSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICB2YXIgZGxTaXplLCBmaWxlID0gdGhpcy5maWxlSW5mb0xpc3RbaV07CiAgICAgICAgaWYgKHRoaXMuaXNGYXN0KQogICAgICAgICAgICBkbFNpemUgPSAxOyAvLyAi5p6B6YCf5LiL6L29IiDkuI3pnIDopoHnlJ/miJBzbGljZS1tZDUsIOaVheaXoOmcgOS4i+i9veaWh+S7tuaVsOaNrgogICAgICAgIGVsc2UKICAgICAgICAgICAgZGxTaXplID0gZmlsZS5zaXplIDwgMjYyMTQ0ID8gMSA6IDI2MjE0MzsgLy9zbGljZS1tZDU6IOaWh+S7tuWJjTI1NktpQueahG1kNSwgc2l6ZTwyNTZLaULliJnnm7TmjqXlj5ZtZDXljbPlj68sIOaXoOmcgOS4i+i9veaWh+S7tuaVsOaNrgogICAgICAgIGFqYXgoewogICAgICAgICAgICB1cmw6IGRsaW5rLAogICAgICAgICAgICBtZXRob2Q6ICJHRVQiLAogICAgICAgICAgICByZXNwb25zZVR5cGU6ICJhcnJheWJ1ZmZlciIsCiAgICAgICAgICAgIGhlYWRlcnM6IHsKICAgICAgICAgICAgICAgIFJhbmdlOiAiYnl0ZXM9MC0iICsgZGxTaXplLAogICAgICAgICAgICAgICAgIlVzZXItQWdlbnQiOiBVQSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgb25wcm9ncmVzczogdGhpcy5pc0Zhc3QgPyBmdW5jdGlvbiAoKSB7IH0gOiB0aGlzLm9uUHJvZ3Jlc3MsCiAgICAgICAgfSwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgaWYgKCFfdGhpcy5pc0Zhc3QpCiAgICAgICAgICAgICAgICBfdGhpcy5vblByb2dyZXNzKHsgbG9hZGVkOiAxMDAsIHRvdGFsOiAxMDAgfSk7IC8vIDEwMCUKICAgICAgICAgICAgX3RoaXMucGFyc2VEb3dubG9hZERhdGEoaSwgZGF0YSk7CiAgICAgICAgfSwgZnVuY3Rpb24gKHN0YXR1c0NvZGUpIHsKICAgICAgICAgICAgaWYgKHN0YXR1c0NvZGUgPT09IDQwNCkKICAgICAgICAgICAgICAgIGZpbGUuZXJybm8gPSA5MDk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGZpbGUuZXJybm8gPSBzdGF0dXNDb2RlOwogICAgICAgICAgICBfdGhpcy5pc0Zhc3QgPyBfdGhpcy5jaGVja01kNShpICsgMSkgOiBfdGhpcy5nZW5lcmF0ZUJkbGluayhpICsgMSk7CiAgICAgICAgfSk7CiAgICB9OwogICAgLyoqCiAgICAgKiBAZGVzY3JpcHRpb246IOino+aekOebtOmTvuivt+axgui/lOWbnueahOaVsOaNrgogICAgICogQHBhcmFtIHtudW1iZXJ9IGkKICAgICAqIEBwYXJhbSB7YW55fSBkYXRhCiAgICAgKi8KICAgIEdlbmVyYXRlYmRsaW5rVGFzay5wcm90b3R5cGUucGFyc2VEb3dubG9hZERhdGEgPSBmdW5jdGlvbiAoaSwgZGF0YSkgewogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgdmFyIGZpbGUgPSB0aGlzLmZpbGVJbmZvTGlzdFtpXTsKICAgICAgICBjb25zb2xlLmxvZygiZGxfdXJsOiAiICsgZGF0YS5maW5hbFVybCk7IC8vIGRlYnVnCiAgICAgICAgLy8g5LiL6L2955u06ZO+6YeN5a6a5ZCR5Yiw5q2k5Z+f5ZCNLCDliKTlrprkuLrmlofku7blkozosJAKICAgICAgICBpZiAoZGF0YS5maW5hbFVybC5pbmNsdWRlcygiaXNzdWVjZG4uYmFpZHVwY3MuY29tIikpIHsKICAgICAgICAgICAgZmlsZS5lcnJubyA9IDE5MTk7CiAgICAgICAgICAgIHRoaXMuaXNGYXN0ID8gdGhpcy5jaGVja01kNShpICsgMSkgOiB0aGlzLmdlbmVyYXRlQmRsaW5rKGkgKyAxKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvLyDku47kuIvovb3mjqXlj6Pojrflj5ZtZDUsIOatpOatpemqpOWPr+ehruS/neiOt+WPluWIsOato+ehrm1kNQogICAgICAgIC8vIGNvbnNvbGUubG9nKGRhdGEucmVzcG9uc2VIZWFkZXJzKTsgLy8gZGVidWcKICAgICAgICB2YXIgZmlsZU1kNSA9IGRhdGEucmVzcG9uc2VIZWFkZXJzLm1hdGNoKC9jb250ZW50LW1kNTogKFtcZGEtZl17MzJ9KS9pKTsKICAgICAgICBpZiAoZmlsZU1kNSkKICAgICAgICAgICAgZmlsZS5tZDUgPSBmaWxlTWQ1WzFdLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgZWxzZSBpZiAoZmlsZS5zaXplIDw9IDM5MDAwMDAwMDAgJiYgIWZpbGUucmV0cnlfOTk2KSB7CiAgICAgICAgICAgIC8vIOm7mOiupOS4i+i9veaOpeWPo+acquaLv+WIsG1kNSwg5bCd6K+V5L2/55So5pen5LiL6L295o6l5Y+jLCDml6fmjqXlj6Por7fmsYLmlofku7ZzaXpl5aSn5LqOMy45R+S8mui/lOWbnjQwMwogICAgICAgICAgICBmaWxlLnJldHJ5Xzk5NiA9IHRydWU7CiAgICAgICAgICAgIHRoaXMuZG93bmxvYWRGaWxlRGF0YShpLCBwY3NfdXJsICsgKCImcGF0aD0iICsgZW5jb2RlVVJJQ29tcG9uZW50KGZpbGUucGF0aCkpKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLy8g5Lik5Liq5LiL6L295o6l5Y+j5Z2H5pyq5ou/5YiwbWQ1LCDlpLHotKXot7Plh7oKICAgICAgICAgICAgZmlsZS5lcnJubyA9IDk5NjsKICAgICAgICAgICAgdGhpcy5pc0Zhc3QgPyB0aGlzLmNoZWNrTWQ1KGkgKyAxKSA6IHRoaXMuZ2VuZXJhdGVCZGxpbmsoaSArIDEpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIC8vIOiOt+WPlm1kNXMsICLmnoHpgJ/nlJ/miJAiIOi3s+i/h+atpOatpQogICAgICAgIGlmICghdGhpcy5pc0Zhc3QpIHsKICAgICAgICAgICAgaWYgKGZpbGUuc2l6ZSA8IDI2MjE0NCkKICAgICAgICAgICAgICAgIGZpbGUubWQ1cyA9IGZpbGUubWQ1OyAvLyDmraTml7ZtZDVzPW1kNQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIOiuoeeul21kNXMKICAgICAgICAgICAgICAgIHZhciBzcGFyayA9IG5ldyAoc3BhcmtfbWQ1X2RlZmF1bHQoKSkuQXJyYXlCdWZmZXIoKTsKICAgICAgICAgICAgICAgIHNwYXJrLmFwcGVuZChkYXRhLnJlc3BvbnNlKTsKICAgICAgICAgICAgICAgIHZhciBzbGljZU1kNSA9IHNwYXJrLmVuZCgpOwogICAgICAgICAgICAgICAgZmlsZS5tZDVzID0gc2xpY2VNZDU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGludGVydmFsID0gdGhpcy5maWxlSW5mb0xpc3QubGVuZ3RoID4gMSA/IDIwMDAgOiAxMDAwOwogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIF90aGlzLmdlbmVyYXRlQmRsaW5rKGkgKyAxKTsKICAgICAgICAgICAgfSwgaW50ZXJ2YWwpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICAgIHRoaXMuY2hlY2tNZDUoaSArIDEpOwogICAgfTsKICAgIC8qKgogICAgICogQGRlc2NyaXB0aW9uOiAi5p6B6YCf55Sf5oiQIiDlj6/og73lvpfliLDplJnor69tZDUsIOaVheaJp+ihjOmqjOivgeatpemqpCwg6Iul6aqM6K+B5LiN6YCa6L+H5YiZ5omn6KGM5pmu6YCa55Sf5oiQCiAgICAgKiBAcGFyYW0ge251bWJlcn0gaQogICAgICovCiAgICBHZW5lcmF0ZWJkbGlua1Rhc2sucHJvdG90eXBlLmNoZWNrTWQ1ID0gZnVuY3Rpb24gKGkpIHsKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgIGlmIChpID49IHRoaXMuZmlsZUluZm9MaXN0Lmxlbmd0aCkgewogICAgICAgICAgICB0aGlzLm9uRmluaXNoKHRoaXMuZmlsZUluZm9MaXN0KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLm9uUHJvY2VzcyhpLCB0aGlzLmZpbGVJbmZvTGlzdCk7CiAgICAgICAgdGhpcy5vblByb2dyZXNzKGZhbHNlLCAi5p6B6YCf55Sf5oiQ5LitLi4uIik7CiAgICAgICAgdmFyIGZpbGUgPSB0aGlzLmZpbGVJbmZvTGlzdFtpXTsKICAgICAgICBwcmVjcmVhdGVGaWxlVjIuY2FsbCh0aGlzLCBmaWxlLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICBkYXRhID0gZGF0YS5yZXNwb25zZTsKICAgICAgICAgICAgaWYgKDAgPT09IGRhdGEuZXJybm8pIHsKICAgICAgICAgICAgICAgIGlmICgwID09PSBkYXRhLmJsb2NrX2xpc3QubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgIF90aGlzLmNoZWNrTWQ1KGkgKyAxKTsgLy8gbWQ16aqM6K+B5oiQ5YqfCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvLyBtZDXpqozor4HlpLHotKUsIOaJp+ihjOaZrumAmueUn+aIkCwg5LuF5Zyo5q2k5aSE5L+d5a2Y5Lu75Yqh6L+b5bqmCiAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoInVuZmluaXNoIiwgewogICAgICAgICAgICAgICAgICAgICAgICBmaWxlX2luZm9fbGlzdDogX3RoaXMuZmlsZUluZm9MaXN0LAogICAgICAgICAgICAgICAgICAgICAgICBmaWxlX2lkOiBpLAogICAgICAgICAgICAgICAgICAgICAgICBpc0NoZWNrTWQ1OiB0cnVlLAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIF90aGlzLmdldERsaW5rKGkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLy8g5o6l5Y+j6K6/6Zeu5aSx6LSlCiAgICAgICAgICAgICAgICBmaWxlLmVycm5vID0gZGF0YS5lcnJubzsKICAgICAgICAgICAgICAgIF90aGlzLmNoZWNrTWQ1KGkgKyAxKTsKICAgICAgICAgICAgfQogICAgICAgIH0sIGZ1bmN0aW9uIChzdGF0dXNDb2RlKSB7CiAgICAgICAgICAgIGZpbGUuZXJybm8gPSBzdGF0dXNDb2RlOwogICAgICAgICAgICBfdGhpcy5jaGVja01kNShpICsgMSk7CiAgICAgICAgfSk7CiAgICB9OwogICAgcmV0dXJuIEdlbmVyYXRlYmRsaW5rVGFzazsKfSgpKTsKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBjb25zdCBjb21tb25fR2VuZXJhdGViZGxpbmtUYXNrID0gKEdlbmVyYXRlYmRsaW5rVGFzayk7Cgo7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvYmFpZHUvY29tbW9uL1JhcGlkdXBsb2FkVGFzay50c3gKLyoKICogQEF1dGhvcjogbWVuZ3pvbmVmaXJlCiAqIEBEYXRlOiAyMDIxLTA4LTI1IDAxOjMwOjI5CiAqIEBMYXN0RWRpdFRpbWU6IDIwMjItMTItMDUgMTQ6MzM6NDMKICogQExhc3RFZGl0b3JzOiBtZW5nem9uZWZpcmUKICogQERlc2NyaXB0aW9uOiDnmb7luqbnvZHnm5gg56eS5Lyg6L2s5a2Y5Lu75Yqh5a6e546wCiAqLwoKCgp2YXIgUmFwaWR1cGxvYWRUYXNrX1JhcGlkdXBsb2FkVGFzayA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKICAgIGZ1bmN0aW9uIFJhcGlkdXBsb2FkVGFzaygpIHsKICAgIH0KICAgIFJhcGlkdXBsb2FkVGFzay5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdGhpcy5iZHN0b2tlbiA9IGdldEJkc3Rva2VuKCk7CiAgICAgICAgY29uc29sZS5sb2coImJkc3Rva2VuXHU3MkI2XHU2MDAxOiAiICsgKHRoaXMuYmRzdG9rZW4gPyAi6I635Y+W5oiQ5YqfIiA6ICLojrflj5blpLHotKUiKSk7IC8vIGRlYnVnCiAgICAgICAgdGhpcy5maWxlSW5mb0xpc3QgPSBbXTsKICAgICAgICB0aGlzLnNhdmVQYXRoID0gIiI7CiAgICAgICAgdGhpcy5jaGVja01vZGUgPSBmYWxzZTsKICAgICAgICB0aGlzLmlzRGVmYXVsdFBhdGggPSBmYWxzZTsKICAgICAgICB0aGlzLm9uRmluaXNoID0gZnVuY3Rpb24gKCkgeyB9OwogICAgICAgIHRoaXMub25Qcm9jZXNzID0gZnVuY3Rpb24gKCkgeyB9OwogICAgfTsKICAgIFJhcGlkdXBsb2FkVGFzay5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKHRoaXMuY2hlY2tNb2RlKQogICAgICAgICAgICB0aGlzLnNhdmVQYXRoID0gIiI7CiAgICAgICAgdGhpcy5zYXZlRmlsZVYyKDApOwogICAgfTsKICAgIC8qKgogICAgICogQGRlc2NyaXB0aW9uOiDovazlrZjnp5LkvKAg5o6l5Y+jMgogICAgICogQHBhcmFtIHtudW1iZXJ9IGkKICAgICAqLwogICAgUmFwaWR1cGxvYWRUYXNrLnByb3RvdHlwZS5zYXZlRmlsZVYyID0gZnVuY3Rpb24gKGkpIHsKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgIGlmIChpID49IHRoaXMuZmlsZUluZm9MaXN0Lmxlbmd0aCkgewogICAgICAgICAgICB0aGlzLm9uRmluaXNoKHRoaXMuZmlsZUluZm9MaXN0KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLm9uUHJvY2VzcyhpLCB0aGlzLmZpbGVJbmZvTGlzdCk7CiAgICAgICAgdmFyIGZpbGUgPSB0aGlzLmZpbGVJbmZvTGlzdFtpXTsKICAgICAgICAvLyDmlofku7blkI3lkKvmnInpnZ7ms5XlrZfnrKYgLyDmlofku7blkI3kuLrnqboKICAgICAgICBpZiAoZmlsZS5wYXRoLm1hdGNoKC9bIlxcXDoqPzw+fF0vKSB8fCBmaWxlLnBhdGggPT09ICIvIikgewogICAgICAgICAgICBmaWxlLmVycm5vID0gLTc7CiAgICAgICAgICAgIHRoaXMuc2F2ZUZpbGVWMihpICsgMSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdmFyIG9uRmFpbGVkID0gZnVuY3Rpb24gKHN0YXR1c0NvZGUpIHsKICAgICAgICAgICAgZmlsZS5lcnJubyA9IHN0YXR1c0NvZGU7CiAgICAgICAgICAgIF90aGlzLnNhdmVGaWxlVjIoaSArIDEpOwogICAgICAgIH07CiAgICAgICAgUmFwaWR1cGxvYWRUYXNrX3ByZWNyZWF0ZUZpbGVWMi5jYWxsKHRoaXMsIGZpbGUsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIGRhdGEgPSBkYXRhLnJlc3BvbnNlOwogICAgICAgICAgICBpZiAoMCA9PT0gZGF0YS5lcnJubykgewogICAgICAgICAgICAgICAgaWYgKDAgPT09IGRhdGEuYmxvY2tfbGlzdC5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5jcmVhdGVGaWxlVjIoZmlsZSwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEucmVzcG9uc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuZXJybm8gPSAyID09PSBkYXRhLmVycm5vID8gMTE0IDogZGF0YS5lcnJubzsKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5lcnJubyA9IDMxMTkwID09PSBmaWxlLmVycm5vID8gNDA0IDogZmlsZS5lcnJubzsKICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuc2F2ZUZpbGVWMihpICsgMSk7CiAgICAgICAgICAgICAgICAgICAgfSwgb25GYWlsZWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZmlsZS5lcnJubyA9IDQwNDsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5zYXZlRmlsZVYyKGkgKyAxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGZpbGUuZXJybm8gPSBkYXRhLmVycm5vOwogICAgICAgICAgICAgICAgX3RoaXMuc2F2ZUZpbGVWMihpICsgMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LCBvbkZhaWxlZCk7CiAgICB9OwogICAgLy8g5q2k5o6l5Y+j5rWL6K+V57uT5p6c5aaC5LiLOiDplJnor69tZDUtPui/lOWbniJlcnJubyI6IDMxMTkwLCDmraPnoa5tZDUr6ZSZ6K+vc2l6ZS0+6L+U5ZueImVycm5vIjogMgogICAgLy8g5q2k5aSWLCDljbPkvb9tZDXlkoxzaXpl5Z2H5q2j56GuLCDov57nu63or7fmsYLml7bkvp3ml6fmnInlsI/mpoLnjofov5Tlm54iZXJybm8iOiAyLCDmlYXlu7rorq7liqDlhaVyZXRyeeetlueVpQogICAgUmFwaWR1cGxvYWRUYXNrLnByb3RvdHlwZS5jcmVhdGVGaWxlVjIgPSBmdW5jdGlvbiAoZmlsZSwgb25SZXNwb25zZWQsIG9uRmFpbGVkLCByZXRyeSkgewogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgaWYgKHJldHJ5ID09PSB2b2lkIDApIHsgcmV0cnkgPSAwOyB9CiAgICAgICAgYWpheCh7CiAgICAgICAgICAgIHVybDogIiIgKyBjcmVhdGVfdXJsICsgKHRoaXMuYmRzdG9rZW4gJiYgIiZiZHN0b2tlbj0iICsgdGhpcy5iZHN0b2tlbiksCiAgICAgICAgICAgIG1ldGhvZDogIlBPU1QiLAogICAgICAgICAgICByZXNwb25zZVR5cGU6ICJqc29uIiwKICAgICAgICAgICAgZGF0YTogY29udmVydERhdGEoewogICAgICAgICAgICAgICAgYmxvY2tfbGlzdDogSlNPTi5zdHJpbmdpZnkoW2ZpbGUubWQ1LnRvTG93ZXJDYXNlKCldKSwKICAgICAgICAgICAgICAgIHBhdGg6IHRoaXMuc2F2ZVBhdGggKyBmaWxlLnBhdGgsCiAgICAgICAgICAgICAgICBzaXplOiBmaWxlLnNpemUsCiAgICAgICAgICAgICAgICBpc2RpcjogMCwKICAgICAgICAgICAgICAgIHJ0eXBlOiB0aGlzLmNoZWNrTW9kZSA/IDMgOiAwLCAvLyBydHlwZT0z6KaG55uW5paH5Lu2LCBydHlwZT0w5YiZ6L+U5Zue5oql6ZSZLCDkuI3opobnm5bmlofku7YsIOm7mOiupOS4unJ0eXBlPTEo6Ieq5Yqo6YeN5ZG95ZCNKQogICAgICAgICAgICB9KSwKICAgICAgICB9LCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhkYXRhLnJlc3BvbnNlKTsgLy8gZGVidWcKICAgICAgICAgICAgaWYgKDMxMDM5ID09PSBkYXRhLnJlc3BvbnNlLmVycm5vICYmIDMxMDM5ICE9IGZpbGUuZXJybm8pIHsKICAgICAgICAgICAgICAgIGZpbGUuZXJybm8gPSAzMTAzOTsKICAgICAgICAgICAgICAgIGZpbGUucGF0aCA9IHN1ZmZpeENoYW5nZShmaWxlLnBhdGgpOwogICAgICAgICAgICAgICAgX3RoaXMuY3JlYXRlRmlsZVYyKGZpbGUsIG9uUmVzcG9uc2VkLCBvbkZhaWxlZCwgcmV0cnkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKDIgPT09IGRhdGEucmVzcG9uc2UuZXJybm8gJiYgcmV0cnkgPCByZXRyeU1heF9hcGlWMikKICAgICAgICAgICAgICAgIF90aGlzLmNyZWF0ZUZpbGVWMihmaWxlLCBvblJlc3BvbnNlZCwgb25GYWlsZWQsICsrcmV0cnkpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBvblJlc3BvbnNlZChkYXRhKTsKICAgICAgICB9LCBvbkZhaWxlZCk7CiAgICB9OwogICAgcmV0dXJuIFJhcGlkdXBsb2FkVGFzazsKfSgpKTsKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBjb25zdCBjb21tb25fUmFwaWR1cGxvYWRUYXNrID0gKFJhcGlkdXBsb2FkVGFza19SYXBpZHVwbG9hZFRhc2spOwovLyDmraTmjqXlj6PmtYvor5Xnu5PmnpzlpoLkuIs6IOmUmeivr21kNS0+6L+U5ZueYmxvY2tfbGlzdDogWzBdLCDmraPnoa5tZDUr5q2j56GuL+mUmeivr3NpemUtPui/lOWbnmJsb2NrX2xpc3Q6IFtdCmZ1bmN0aW9uIFJhcGlkdXBsb2FkVGFza19wcmVjcmVhdGVGaWxlVjIoZmlsZSwgb25SZXNwb25zZWQsIG9uRmFpbGVkKSB7CiAgICBhamF4KHsKICAgICAgICB1cmw6ICIiICsgcHJlY3JlYXRlX3VybCArICh0aGlzLmJkc3Rva2VuICYmICImYmRzdG9rZW49IiArIHRoaXMuYmRzdG9rZW4pLAogICAgICAgIG1ldGhvZDogIlBPU1QiLAogICAgICAgIHJlc3BvbnNlVHlwZTogImpzb24iLAogICAgICAgIGRhdGE6IGNvbnZlcnREYXRhKHsKICAgICAgICAgICAgYmxvY2tfbGlzdDogSlNPTi5zdHJpbmdpZnkoW2ZpbGUubWQ1LnRvTG93ZXJDYXNlKCldKSwKICAgICAgICAgICAgcGF0aDogdGhpcy5zYXZlUGF0aCArIGZpbGUucGF0aCwKICAgICAgICAgICAgc2l6ZTogZmlsZS5zaXplLAogICAgICAgICAgICBpc2RpcjogMCwKICAgICAgICAgICAgYXV0b2luaXQ6IDEsCiAgICAgICAgfSksCiAgICB9LCBvblJlc3BvbnNlZCwgb25GYWlsZWQpOwp9Cgo7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvYmFpZHUvY29tbW9uL2NvbnN0LnRzeAoKCgoKdmFyIGhvc3QgPSBsb2NhdGlvbi5ob3N0Owp2YXIgbGlzdExpbWl0ID0gMTAwMDA7CnZhciBjcmVhdGVfdXJsID0gImh0dHBzOi8vIiArIGhvc3QgKyAiL3Jlc3QvMi4wL3hwYW4vZmlsZT9tZXRob2Q9Y3JlYXRlIjsKdmFyIHByZWNyZWF0ZV91cmwgPSAiaHR0cHM6Ly8iICsgaG9zdCArICIvcmVzdC8yLjAveHBhbi9maWxlP21ldGhvZD1wcmVjcmVhdGUiOwp2YXIgbGlzdF91cmwgPSAiaHR0cHM6Ly8iICsgaG9zdCArICIvcmVzdC8yLjAveHBhbi9tdWx0aW1lZGlhP21ldGhvZD1saXN0YWxsJm9yZGVyPW5hbWUmbGltaXQ9IiArIGxpc3RMaW1pdDsKLy8g5bey55+l5q2k5o6l5Y+j5pyJ6ZmQ5Yi2OiBsaW1pdOWtl+autSjljbPljZXmrKHojrflj5bnmoTmlofku7bmlbAp5LiN6IO95aSn5LqOMTAwMDAsIOWQpuWImeebtOaOpei/lOWbnumUmeivrywg6LaF6L+HMXfnmoTmlofku7bpgJrov4dzdGFydOWtl+auteiOt+WPlgp2YXIgbWV0YV91cmwgPSAiaHR0cHM6Ly8iICsgaG9zdCArICIvcmVzdC8yLjAveHBhbi9maWxlP2FwcF9pZD03Nzg3NTAmbWV0aG9kPW1ldGEmcGF0aD0iOwp2YXIgbWV0YV91cmwyID0gImh0dHBzOi8vIiArIGhvc3QgKyAiL3Jlc3QvMi4wL3hwYW4vbXVsdGltZWRpYT9tZXRob2Q9ZmlsZW1ldGFzJmRsaW5rPTEmZnNpZHM9IjsKdmFyIHBjc191cmwgPSAiaHR0cHM6Ly9wY3MuYmFpZHUuY29tL3Jlc3QvMi4wL3Bjcy9maWxlP2FwcF9pZD03Nzg3NTAmbWV0aG9kPWRvd25sb2FkIjsKdmFyIGlsbGVnYWxQYXRoUGF0dGVybiA9IC9bXFwiOio/PD58XS87IC8vIOWMuemFjei3r+W+hOS4reeahOmdnuazleWtl+espgp2YXIgZ2V0QmRzdG9rZW47IC8vIOiOt+WPlmJkc3Rva2Vu55qE5a6e546wCmZ1bmN0aW9uIHNldEdldEJkc3Rva2VuKGZ1bmMpIHsKICAgIGdldEJkc3Rva2VuID0gZnVuYzsKfQp2YXIgcmVmcmVzaExpc3Q7IC8vIOWIt+aWsOaWh+S7tuWIl+ihqOeahOWunueOsApmdW5jdGlvbiBzZXRSZWZyZXNoTGlzdChmdW5jKSB7CiAgICByZWZyZXNoTGlzdCA9IGZ1bmM7Cn0KdmFyIGdldFNlbGVjdGVkRmlsZUxpc3Q7IC8vIOiOt+WPlumAieS4reeahOaWh+S7tuWIl+ihqOeahOWunueOsApmdW5jdGlvbiBzZXRHZXRTZWxlY3RlZEZpbGVMaXN0KGZ1bmMpIHsKICAgIGdldFNlbGVjdGVkRmlsZUxpc3QgPSBmdW5jOwp9CnZhciBzd2FsSW5zdGFuY2UgPSBuZXcgc3dhbEJhc2UobmV3IGNvbW1vbl9SYXBpZHVwbG9hZFRhc2soKSwgbmV3IGNvbW1vbl9HZW5lcmF0ZWJkbGlua1Rhc2soKSk7CnZhciBodG1sVGFnTmV3ID0gImRpdi5uZC1maWxlLWxpc3QtdG9vbGJhcl9fYWN0aW9ucyI7IC8vIOaWsOeJiOeVjOmdouenkuS8oOaMiemSrueahGh0bWzniLblr7nosaEKdmFyIGh0bWxUYWdOZXcyID0gImRpdi53cC1zLWFnaWxlLXRvb2wtYmFyX19oZWFkZXIiOyAvLyAyMi41LjI0OiDmlrDniYjnlYzpnaLmlrDlop7nmoTkuIDkuKrniLblr7nosaEKdmFyIGh0bWxUYWdMZWdhY3kgPSAiZGl2LnRjdUxBdSI7IC8vIOaXp+eJiOeVjOmdouenkuS8oOaMiemSrueahGh0bWzniLblr7nosaEKdmFyIGh0bWxCdG5SYXBpZE5ldyA9IC8vIOaWsOeJiOeVjOmdouenkuS8oOaMiemSrueahGh0bWzlhYPntKAKICc8YnV0dG9uIGlkPSJiZGxpbmtfYnRuIiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDhweDsiIGNsYXNzPSJtemZfbmV3X2J0biI+PC9pPjxzcGFuPuenkuS8oDwvc3Bhbj48L2J1dHRvbj4nOwp2YXIgaHRtbEJ0bkdlbk5ldyA9IC8vIOaWsOeJiOeVjOmdouenkuS8oOeUn+aIkOaMiemSrueahGh0bWzlhYPntKAKICc8YnV0dG9uIGlkPSJnZW5fYmRsaW5rX2J0biIgc3R5bGU9Im1hcmdpbi1sZWZ0OiA4cHg7IiBjbGFzcz0ibXpmX25ld19idG4iPjwvaT48c3Bhbj7nlJ/miJDnp5LkvKA8L3NwYW4+PC9idXR0b24+JzsKdmFyIGh0bWxCdG5SYXBpZExlZ2FjeSA9IC8vIOaXp+eJiOeVjOmdouenkuS8oOaMiemSrueahGh0bWzlhYPntKAKICc8YSBjbGFzcz0iZy1idXR0b24gZy1idXR0b24tYmx1ZSIgaWQ9ImJkbGlua19idG4iIHRpdGxlPSLnp5LkvKDpk77mjqUiIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IiI+PHNwYW4gY2xhc3M9ImctYnV0dG9uLXJpZ2h0Ij48ZW0gY2xhc3M9Imljb24gaWNvbi1kaXNrIiB0aXRsZT0i56eS5Lyg6ZO+5o6l5o+Q5Y+WIj48L2VtPjxzcGFuIGNsYXNzPSJ0ZXh0IiBzdHlsZT0id2lkdGg6IGF1dG87Ij7np5LkvKDpk77mjqU8L3NwYW4+PC9zcGFuPjwvYT4nOwp2YXIgaHRtbEJ0bkdlbkxlZ2FjeSA9IC8vIOaXp+eJiOeVjOmdouenkuS8oOeUn+aIkOaMiemSrueahGh0bWzlhYPntKAKICc8YSBjbGFzcz0iZy1idXR0b24iIGlkPSJnZW5fYmRsaW5rX2J0biI+PHNwYW4gY2xhc3M9ImctYnV0dG9uLXJpZ2h0Ij48ZW0gY2xhc3M9Imljb24gaWNvbi1zaGFyZSI+PC9lbT48c3BhbiBjbGFzcz0idGV4dCIgc3R5bGU9IndpZHRoOiBhdXRvOyI+55Sf5oiQ56eS5LygPC9zcGFuPjwvc3Bhbj48L2E+JzsKZnVuY3Rpb24gYmFpZHVFcnJubyhlcnJubykgewogICAgc3dpdGNoIChlcnJubykgewogICAgICAgIGNhc2UgLTY6CiAgICAgICAgICAgIHJldHVybiAiXHU4QkE0XHU4QkMxXHU1OTMxXHU4RDI1KFx1OEJGN1x1NzcwQlx1NjU4N1x1Njg2Mzo8YSBocmVmPVwiIiArIGRvYy5zaGFyZURvYyArICIjXHU4QkE0XHU4QkMxXHU1OTMxXHU4RDI1LTZcIiAiICsgbGlua1N0eWxlICsgIj5cdThGN0RcdTcwQjkxPC9hPiA8YSBocmVmPVwiIiArIGRvYzIuc2hhcmVEb2MgKyAiI1x1OEJBNFx1OEJDMVx1NTkzMVx1OEQyNS02XCIgIiArIGxpbmtTdHlsZSArICI+XHU4RjdEXHU3MEI5MjwvYT4pIjsKICAgICAgICBjYXNlIC03OgogICAgICAgICAgICByZXR1cm4gIlx1OEY2Q1x1NUI1OFx1OERFRlx1NUY4NFx1NTQyQlx1NjcwOVx1OTc1RVx1NkNENVx1NUI1N1x1N0IyNihcdThCRjdcdTc3MEJcdTY1ODdcdTY4NjM6PGEgaHJlZj1cIiIgKyBkb2Muc2hhcmVEb2MgKyAiI1x1OEY2Q1x1NUI1OFx1OERFRlx1NUY4NFx1NTQyQlx1NjcwOVx1OTc1RVx1NkNENVx1NUI1N1x1N0IyNi03XCIgIiArIGxpbmtTdHlsZSArICI+XHU4RjdEXHU3MEI5MTwvYT4gPGEgaHJlZj1cIiIgKyBkb2MyLnNoYXJlRG9jICsgIiNcdThGNkNcdTVCNThcdThERUZcdTVGODRcdTU0MkJcdTY3MDlcdTk3NUVcdTZDRDVcdTVCNTdcdTdCMjYtN1wiICIgKyBsaW5rU3R5bGUgKyAiPlx1OEY3RFx1NzBCOTI8L2E+KSI7CiAgICAgICAgY2FzZSAtODoKICAgICAgICAgICAgcmV0dXJuICLot6/lvoTkuIvlrZjlnKjlkIzlkI3mlofku7YiOwogICAgICAgIGNhc2UgNDAwOgogICAgICAgICAgICByZXR1cm4gIlx1OEJGN1x1NkM0Mlx1OTUxOVx1OEJFRihcdThCRjdcdTc3MEJcdTY1ODdcdTY4NjM6PGEgaHJlZj1cIiIgKyBkb2Muc2hhcmVEb2MgKyAiI1x1OEJGN1x1NkM0Mlx1OTUxOVx1OEJFRi00MDBcIiAiICsgbGlua1N0eWxlICsgIj5cdThGN0RcdTcwQjkxPC9hPiA8YSBocmVmPVwiIiArIGRvYzIuc2hhcmVEb2MgKyAiI1x1OEJGN1x1NkM0Mlx1OTUxOVx1OEJFRi00MDBcIiAiICsgbGlua1N0eWxlICsgIj5cdThGN0RcdTcwQjkyPC9hPikiOwogICAgICAgIGNhc2UgNDAzOgogICAgICAgICAgICByZXR1cm4gIlx1NjNBNVx1NTNFM1x1OTY1MFx1NTIzNlx1OEJCRlx1OTVFRShcdThCRjdcdTc3MEJcdTY1ODdcdTY4NjM6PGEgaHJlZj1cIiIgKyBkb2Muc2hhcmVEb2MgKyAiI1x1NjNBNVx1NTNFM1x1OTY1MFx1NTIzNlx1OEJCRlx1OTVFRS00MDNcIiAiICsgbGlua1N0eWxlICsgIj5cdThGN0RcdTcwQjkxPC9hPiA8YSBocmVmPVwiIiArIGRvYzIuc2hhcmVEb2MgKyAiI1x1NjNBNVx1NTNFM1x1OTY1MFx1NTIzNlx1OEJCRlx1OTVFRS00MDNcIiAiICsgbGlua1N0eWxlICsgIj5cdThGN0RcdTcwQjkyPC9hPikiOwogICAgICAgIGNhc2UgNDA0OgogICAgICAgICAgICByZXR1cm4gIlx1NzlEMlx1NEYyMFx1NjcyQVx1NzUxRlx1NjU0OChcdThCRjdcdTc3MEJcdTY1ODdcdTY4NjM6PGEgaHJlZj1cIiIgKyBkb2Muc2hhcmVEb2MgKyAiI1x1NzlEMlx1NEYyMFx1NjcyQVx1NzUxRlx1NjU0OC00MDRcIiAiICsgbGlua1N0eWxlICsgIj5cdThGN0RcdTcwQjkxPC9hPiA8YSBocmVmPVwiIiArIGRvYzIuc2hhcmVEb2MgKyAiI1x1NzlEMlx1NEYyMFx1NjcyQVx1NzUxRlx1NjU0OC00MDRcIiAiICsgbGlua1N0eWxlICsgIj5cdThGN0RcdTcwQjkyPC9hPikiOwogICAgICAgIGNhc2UgMTE0OgogICAgICAgICAgICByZXR1cm4gIlx1OEY2Q1x1NUI1OFx1NTkzMVx1OEQyNS12Mlx1NjNBNVx1NTNFMyhcdThCRjdcdTc3MEJcdTY1ODdcdTY4NjM6PGEgaHJlZj1cIiIgKyBkb2Muc2hhcmVEb2MgKyAiI1x1OEY2Q1x1NUI1OFx1NTkzMVx1OEQyNS12Mlx1NjNBNVx1NTNFMy0xMTRcIiAiICsgbGlua1N0eWxlICsgIj5cdThGN0RcdTcwQjkxPC9hPiA8YSBocmVmPVwiIiArIGRvYzIuc2hhcmVEb2MgKyAiI1x1OEY2Q1x1NUI1OFx1NTkzMVx1OEQyNS12Mlx1NjNBNVx1NTNFMy0xMTRcIiAiICsgbGlua1N0eWxlICsgIj5cdThGN0RcdTcwQjkyPC9hPikiOwogICAgICAgIGNhc2UgNTE0OgogICAgICAgICAgICByZXR1cm4gIlx1OEJGN1x1NkM0Mlx1NTkzMVx1OEQyNShcdThCRjdcdTc3MEJcdTY1ODdcdTY4NjM6PGEgaHJlZj1cIiIgKyBkb2Muc2hhcmVEb2MgKyAiI1x1OEJGN1x1NkM0Mlx1NTkzMVx1OEQyNS01MTRcIiAiICsgbGlua1N0eWxlICsgIj5cdThGN0RcdTcwQjkxPC9hPiA8YSBocmVmPVwiIiArIGRvYzIuc2hhcmVEb2MgKyAiI1x1OEJGN1x1NkM0Mlx1NTkzMVx1OEQyNS01MTRcIiAiICsgbGlua1N0eWxlICsgIj5cdThGN0RcdTcwQjkyPC9hPikiOwogICAgICAgIGNhc2UgMTkxOToKICAgICAgICAgICAgcmV0dXJuICJcdTY1ODdcdTRFRjZcdTVERjJcdTg4QUJcdTU0OENcdThDMTAoXHU4QkY3XHU3NzBCXHU2NTg3XHU2ODYzOjxhIGhyZWY9XCIiICsgZG9jLnNoYXJlRG9jICsgIiNcdTY1ODdcdTRFRjZcdTVERjJcdTg4QUJcdTU0OENcdThDMTAtMTkxOVwiICIgKyBsaW5rU3R5bGUgKyAiPlx1OEY3RFx1NzBCOTE8L2E+IDxhIGhyZWY9XCIiICsgZG9jMi5zaGFyZURvYyArICIjXHU2NTg3XHU0RUY2XHU1REYyXHU4OEFCXHU1NDhDXHU4QzEwLTE5MTlcIiAiICsgbGlua1N0eWxlICsgIj5cdThGN0RcdTcwQjkyPC9hPikiOwogICAgICAgIGNhc2UgOTk2OgogICAgICAgICAgICByZXR1cm4gIm1kNVx1ODNCN1x1NTNENlx1NTkzMVx1OEQyNShcdThCRjdcdTc3MEJcdTY1ODdcdTY4NjM6PGEgaHJlZj1cIiIgKyBkb2Muc2hhcmVEb2MgKyAiI21kNS1cdTgzQjdcdTUzRDZcdTU5MzFcdThEMjUtOTk2XCIgIiArIGxpbmtTdHlsZSArICI+XHU4RjdEXHU3MEI5MTwvYT4gPGEgaHJlZj1cIiIgKyBkb2MyLnNoYXJlRG9jICsgIiNtZDUtXHU4M0I3XHU1M0Q2XHU1OTMxXHU4RDI1LTk5NlwiICIgKyBsaW5rU3R5bGUgKyAiPlx1OEY3RFx1NzBCOTI8L2E+KSI7CiAgICAgICAgY2FzZSAyOgogICAgICAgICAgICByZXR1cm4gIlx1OEY2Q1x1NUI1OFx1NTkzMVx1OEQyNS12MVx1NjNBNVx1NTNFMyhcdThCRjdcdTc3MEJcdTY1ODdcdTY4NjM6PGEgaHJlZj1cIiIgKyBkb2Muc2hhcmVEb2MgKyAiI1x1OEY2Q1x1NUI1OFx1NTkzMVx1OEQyNS12MVx1NjNBNVx1NTNFMy0yXCIgIiArIGxpbmtTdHlsZSArICI+XHU4RjdEXHU3MEI5MTwvYT4gPGEgaHJlZj1cIiIgKyBkb2MyLnNoYXJlRG9jICsgIiNcdThGNkNcdTVCNThcdTU5MzFcdThEMjUtdjFcdTYzQTVcdTUzRTMtMlwiICIgKyBsaW5rU3R5bGUgKyAiPlx1OEY3RFx1NzBCOTI8L2E+KSI7CiAgICAgICAgY2FzZSAtMTA6CiAgICAgICAgICAgIHJldHVybiAi572R55uY5a656YeP5bey5ruhIjsKICAgICAgICBjYXNlIDUwMDoKICAgICAgICBjYXNlIDUwMjoKICAgICAgICBjYXNlIDUwMzoKICAgICAgICAgICAgcmV0dXJuICJcdTY3MERcdTUyQTFcdTU2NjhcdTk1MTlcdThCRUYoXHU4QkY3XHU3NzBCXHU2NTg3XHU2ODYzOjxhIGhyZWY9XCIiICsgZG9jLnNoYXJlRG9jICsgIiNcdTY3MERcdTUyQTFcdTU2NjhcdTk1MTlcdThCRUYtNTB4XCIgIiArIGxpbmtTdHlsZSArICI+XHU4RjdEXHU3MEI5MTwvYT4gPGEgaHJlZj1cIiIgKyBkb2MyLnNoYXJlRG9jICsgIiNcdTY3MERcdTUyQTFcdTU2NjhcdTk1MTlcdThCRUYtNTB4XCIgIiArIGxpbmtTdHlsZSArICI+XHU4RjdEXHU3MEI5MjwvYT4pIjsKICAgICAgICBjYXNlIDkwOToKICAgICAgICAgICAgcmV0dXJuICLot6/lvoTkuI3lrZjlnKgv5LqR56uv5paH5Lu25bey5o2f5Z2PIjsKICAgICAgICBjYXNlIDkwMDoKICAgICAgICAgICAgcmV0dXJuICLot6/lvoTkuLrmlofku7blpLksIOS4jeaUr+aMgeeUn+aIkOenkuS8oCI7CiAgICAgICAgY2FzZSA5MDE6CiAgICAgICAgICAgIHJldHVybiAi5YyF5ZCr55qE5paH5Lu25pWw6YeP6LaF5Ye66ZmQ5Yi2KDF35LiqKSI7CiAgICAgICAgY2FzZSAzMTAzOToKICAgICAgICAgICAgcmV0dXJuICJcdTY3MERcdTUyQTFcdTU2NjhcdTk1MTlcdThCRUYoXHU4QkY3XHU3NzBCXHU2NTg3XHU2ODYzOjxhIGhyZWY9XCIiICsgZG9jLnNoYXJlRG9jICsgIiNcdTY3MERcdTUyQTFcdTU2NjhcdTk1MTlcdThCRUYtMzEwMzlcIiAiICsgbGlua1N0eWxlICsgIj5cdThGN0RcdTcwQjkxPC9hPiA8YSBocmVmPVwiIiArIGRvYzIuc2hhcmVEb2MgKyAiI1x1NjcwRFx1NTJBMVx1NTY2OFx1OTUxOVx1OEJFRi0zMTAzOVwiICIgKyBsaW5rU3R5bGUgKyAiPlx1OEY3RFx1NzBCOTI8L2E+KSI7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuICJcdTY3MkFcdTc3RTVcdTk1MTlcdThCRUYoXHU4QkY3XHU3NzBCXHU2NTg3XHU2ODYzOjxhIGhyZWY9XCIiICsgZG9jLnNoYXJlRG9jICsgIiNcdTY3MkFcdTc3RTVcdTk1MTlcdThCRUZcIiAiICsgbGlua1N0eWxlICsgIj5cdThGN0RcdTcwQjkxPC9hPiA8YSBocmVmPVwiIiArIGRvYzIuc2hhcmVEb2MgKyAiI1x1NjcyQVx1NzdFNVx1OTUxOVx1OEJFRlwiICIgKyBsaW5rU3R5bGUgKyAiPlx1OEY3RFx1NzBCOTI8L2E+KSI7CiAgICB9Cn0gLy8g6Ieq5a6a5LmJ55m+5bqmYXBp6L+U5ZueZXJybm/nmoTmiqXplJkKdmFyIHJldHJ5TWF4X2FwaVYyID0gMjsgLy8gdjLovazlrZjmjqXlj6PnmoTmnIDlpKfph43or5XmrKHmlbAKCjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9jb21tb24vdXRpbHMudHN4CnZhciB1dGlsc19hd2FpdGVyID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7CiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH0KICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0KICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvclsidGhyb3ciXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9CiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH0KICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7CiAgICB9KTsKfTsKdmFyIHV0aWxzX2dlbmVyYXRvciA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fZ2VuZXJhdG9yKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgYm9keSkgewogICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZzsKICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCAidGhyb3ciOiB2ZXJiKDEpLCAicmV0dXJuIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnOwogICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9CiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7CiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy4iKTsKICAgICAgICB3aGlsZSAoXykgdHJ5IHsKICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVsicmV0dXJuIl0gOiBvcFswXSA/IHlbInRocm93Il0gfHwgKCh0ID0geVsicmV0dXJuIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0OwogICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07CiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHsKICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTsKICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTsKICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH0KICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH0KICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpOwogICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7CiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfQogICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9OwogICAgfQp9OwoKCgovKioKICogQGRlc2NyaXB0aW9uOiDlvLnlh7rkuIDkuKrmlofmnKzmj5DnpLrmoYYKICogQHBhcmFtIHtzdHJpbmd9IHRleHQKICovCmZ1bmN0aW9uIHNob3dBbGVydCh0ZXh0KSB7CiAgICBhbGVydChUQUcgKyAiOlxuIiArIHRleHQpOwp9Ci8qKgogKiBAZGVzY3JpcHRpb246IOino+aekOaWh+S7tuS/oeaBrywg6L+U5Zue6L2s5a2Y57uT5p6c5YiX6KGoaHRtbCwg56eS5Lyg6ZO+5o6lLCDlpLHotKXmlofku7bkuKrmlbAsIOaIkOWKn+eahOaWh+S7tuS/oeaBr+WIl+ihqCwg5aSx6LSl55qE5paH5Lu25L+h5oGv5YiX6KGoCiAqIEBwYXJhbSB7QXJyYXl9IGZpbGVJbmZvTGlzdCDmlofku7bkv6Hmga/mlbDmja7liJfooagKICogQHBhcmFtIHtCb29sZWFufSBjaGVja01vZGUg5piv5ZCm5Li65rWL6K+V5qih5byPLCDoi6XkuLrmmK/liJnlv73nlaXovazlrZjlpLHotKUKICovCmZ1bmN0aW9uIHBhcnNlZmlsZUluZm8oZmlsZUluZm9MaXN0LCBjaGVja01vZGUpIHsKICAgIGlmIChjaGVja01vZGUgPT09IHZvaWQgMCkgeyBjaGVja01vZGUgPSBmYWxzZTsgfQogICAgdmFyIGJkY29kZSA9ICIiOwogICAgdmFyIHN1Y2Nlc3NJbmZvID0gIiI7CiAgICB2YXIgZmFpbGVkSW5mbyA9ICIiOwogICAgdmFyIHN1Y2Nlc3NMaXN0ID0gW107CiAgICB2YXIgZmFpbExpc3QgPSBbXTsKICAgIHZhciBmYWlsQ29kZURpYyA9IHt9OwogICAgZmlsZUluZm9MaXN0LmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAvLyDmiJDlip/mlofku7YKICAgICAgICBpZiAoMCA9PT0gaXRlbS5lcnJubyB8fCB1bmRlZmluZWQgPT09IGl0ZW0uZXJybm8pIHsKICAgICAgICAgICAgc3VjY2Vzc0luZm8gKz0gIjxwPiIgKyBpdGVtLnBhdGggKyAiPC9wPiI7CiAgICAgICAgICAgIGJkY29kZSArPSAiIiArIGl0ZW0ubWQ1ICsgKGl0ZW0ubWQ1cyAmJiAiIyIgKyBpdGVtLm1kNXMpICsgIiMiICsgaXRlbS5zaXplICsgIiMiICsgaXRlbS5wYXRoICsgIlxuIjsKICAgICAgICAgICAgc3VjY2Vzc0xpc3QucHVzaChpdGVtKTsKICAgICAgICB9CiAgICAgICAgLy8g5aSx6LSl5paH5Lu2CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGZhaWxMaXN0LnB1c2goaXRlbSk7CiAgICAgICAgICAgIGlmIChTdHJpbmcoaXRlbS5lcnJubykgaW4gZmFpbENvZGVEaWMpCiAgICAgICAgICAgICAgICBmYWlsQ29kZURpY1tTdHJpbmcoaXRlbS5lcnJubyldLnB1c2goaXRlbSk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGZhaWxDb2RlRGljW1N0cmluZyhpdGVtLmVycm5vKV0gPSBbaXRlbV07CiAgICAgICAgICAgIGlmIChjaGVja01vZGUpCiAgICAgICAgICAgICAgICBiZGNvZGUgKz0gIiIgKyBpdGVtLm1kNSArIChpdGVtLm1kNXMgJiYgIiMiICsgaXRlbS5tZDVzKSArICIjIiArIGl0ZW0uc2l6ZSArICIjIiArIGl0ZW0ucGF0aCArICJcbiI7IC8vIOa1i+ivleaooeW8j+S4i+S4jeWGjeaOkumZpOa1i+ivleWksei0peaWh+S7tueahOenkuS8oOaVsOaNrgogICAgICAgIH0KICAgIH0pOwogICAgdmFyIF9sb29wXzEgPSBmdW5jdGlvbiAoZmFpbENvZGUpIHsKICAgICAgICB2YXIgZmFpbEJyYW5jaEluZm8gPSAiIjsKICAgICAgICB2YXIgZmFpbEJyYW5jaExpc3QgPSBmYWlsQ29kZURpY1tmYWlsQ29kZV07CiAgICAgICAgZmFpbEJyYW5jaExpc3QuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkgewogICAgICAgICAgICBmYWlsQnJhbmNoSW5mbyArPSAiPHA+IiArIGl0ZW0ucGF0aCArICI8L3A+IjsKICAgICAgICB9KTsKICAgICAgICBmYWlsZWRJbmZvICs9ICI8ZGV0YWlscyBjbGFzcz1cIm16Zl9kZXRhaWxzIG16Zl9kZXRhaWxzX2JyYW5jaFwiPjxzdW1tYXJ5Pjxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjdcIj48cG9seWxpbmUgcG9pbnRzPVwiMCwwIDgsNyAxNiwwXCIvPjwvc3ZnPjxiPiIgKyBiYWlkdUVycm5vKE51bWJlcihmYWlsQ29kZSkpICsgIigjIiArIE51bWJlcihmYWlsQ29kZSkgKyAiKTo8L2I+IiArIGNvcHlGYWlsQnJhbmNoTGlzdCArICI8L3N1bW1hcnk+PC9kZXRhaWxzPjxkaXYgY2xhc3M9XCJtemZfY29udGVudFwiPiIgKyBmYWlsQnJhbmNoSW5mbyArICI8L2Rpdj4iOwogICAgfTsKICAgIGZvciAodmFyIGZhaWxDb2RlIGluIGZhaWxDb2RlRGljKSB7CiAgICAgICAgX2xvb3BfMShmYWlsQ29kZSk7CiAgICB9CiAgICBpZiAoZmFpbGVkSW5mbykKICAgICAgICBmYWlsZWRJbmZvID0gIjxkZXRhaWxzIGNsYXNzPVwibXpmX2RldGFpbHNcIj48c3VtbWFyeT48c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCI3XCI+PHBvbHlsaW5lIHBvaW50cz1cIjAsMCA4LDcgMTYsMFwiLz48L3N2Zz48Yj5cdTU5MzFcdThEMjVcdTY1ODdcdTRFRjZcdTUyMTdcdTg4NjgoXHU3MEI5XHU1MUZCXHU1QzU1XHU1RjAwKTo8L2I+IiArIGNvcHlGYWlsTGlzdCArICI8L3N1bW1hcnk+PC9kZXRhaWxzPjxkaXYgY2xhc3M9XCJtemZfY29udGVudFwiPiIgKyBmYWlsZWRJbmZvICsgIjwvZGl2PiI7CiAgICBpZiAoc3VjY2Vzc0luZm8pCiAgICAgICAgc3VjY2Vzc0luZm8gPSAiPGRldGFpbHMgY2xhc3M9XCJtemZfZGV0YWlsc1wiPjxzdW1tYXJ5Pjxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjdcIj48cG9seWxpbmUgcG9pbnRzPVwiMCwwIDgsNyAxNiwwXCIvPjwvc3ZnPjxiPlx1NjIxMFx1NTI5Rlx1NjU4N1x1NEVGNlx1NTIxN1x1ODg2OChcdTcwQjlcdTUxRkJcdTVDNTVcdTVGMDApOjwvYj4iICsgY29weVN1Y2Nlc3NMaXN0ICsgIjwvc3VtbWFyeT48L2RldGFpbHM+PGRpdiBjbGFzcz1cIm16Zl9jb250ZW50XCI+IiArIHN1Y2Nlc3NJbmZvICsgIjwvZGl2PiI7CiAgICBiZGNvZGUgPSBiZGNvZGUudHJpbSgpOwogICAgcmV0dXJuIHsKICAgICAgICBodG1sSW5mbzogc3VjY2Vzc0luZm8gJiYgZmFpbGVkSW5mbwogICAgICAgICAgICA/IHN1Y2Nlc3NJbmZvICsgIjxwPjxiciAvPjwvcD4iICsgZmFpbGVkSW5mbwogICAgICAgICAgICA6IHN1Y2Nlc3NJbmZvICsgZmFpbGVkSW5mbywKICAgICAgICBiZGNvZGU6IGJkY29kZSwKICAgICAgICBzdWNjZXNzTGlzdDogc3VjY2Vzc0xpc3QsCiAgICAgICAgZmFpbExpc3Q6IGZhaWxMaXN0LAogICAgfTsKfQovKioKICogQGRlc2NyaXB0aW9uOiDojrflj5bpgInmi6nnmoTmlofku7bliJfooago5pen54mI55WM6Z2iKQogKi8KZnVuY3Rpb24gZ2V0U2VsZWN0ZWRGaWxlTGlzdExlZ2FjeSgpIHsKICAgIHJldHVybiB1bnNhZmVXaW5kb3cKICAgICAgICAucmVxdWlyZSgic3lzdGVtLWNvcmU6Y29udGV4dC9jb250ZXh0LmpzIikKICAgICAgICAuaW5zdGFuY2VGb3JTeXN0ZW0ubGlzdC5nZXRTZWxlY3RlZCgpOwp9Ci8qKgogKiBAZGVzY3JpcHRpb246IOiOt+WPlumAieaLqeeahOaWh+S7tuWIl+ihqCjmlrDniYjnlYzpnaIpCiAqIOaIkeS7jui/memHjOaKhOeahCwg6LCi6LCi5L2gOiBodHRwczovL2dyZWFzeWZvcmsub3JnL3poLUNOL3NjcmlwdHMvNDM2NDQ2CiAqLwpmdW5jdGlvbiBnZXRTZWxlY3RlZEZpbGVMaXN0TmV3KCkgewogICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5uZC1tYWluLWxpc3QsIC5uZC1uZXctbWFpbi1saXN0IikuX192dWVfXwogICAgICAgIC5zZWxlY3RlZExpc3Q7Cn0KLyoqCiAqIEBkZXNjcmlwdGlvbjog5bCGZGF0YemUruWAvOWvuei9rOaNouS4unF1ZXJ55a2X56ym5LiyCiAqIEBwYXJhbSB7YW55fSBkYXRhCiAqIEByZXR1cm4ge3N0cmluZ30gcXVlcnkKICovCmZ1bmN0aW9uIGNvbnZlcnREYXRhKGRhdGEpIHsKICAgIHZhciBxdWVyeSA9ICIiOwogICAgZm9yICh2YXIga2V5IGluIGRhdGEpCiAgICAgICAgcXVlcnkgKz0gIiYiICsga2V5ICsgIj0iICsgZW5jb2RlVVJJQ29tcG9uZW50KGRhdGFba2V5XSk7CiAgICByZXR1cm4gcXVlcnk7Cn0KLyoqCiAqIEBkZXNjcmlwdGlvbjog5LuO5Ymq6LS05p2/6I635Y+W5a2X56ym5Liy5pWw5o2uCiAqIEByZXR1cm4ge3N0cmluZ30gYmRsaW5rCiAqLwpmdW5jdGlvbiBwYXJzZUNsaXBib2FyZCgpIHsKICAgIHJldHVybiB1dGlsc19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGJkbGluaywgZXJyb3JfMTsKICAgICAgICByZXR1cm4gdXRpbHNfZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkgewogICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7CiAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFswLCAyLCAsIDNdKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBuYXZpZ2F0b3IuY2xpcGJvYXJkLnJlYWRUZXh0KCldOwogICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgIGJkbGluayA9IF9hLnNlbnQoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIUR1UGFyc2VyLnBhcnNlKGJkbGluaykubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgIiJdOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBiZGxpbmtdOwogICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgIGVycm9yXzEgPSBfYS5zZW50KCk7CiAgICAgICAgICAgICAgICAgICAgc2hvd0FsZXJ0KGFwcEVycm9yLkNsaXBib2FyZFByZW1pc3Npb25FcnIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCAiIl07CiAgICAgICAgICAgICAgICBjYXNlIDM6IHJldHVybiBbMiAvKnJldHVybiovXTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfSk7Cn0KLyoqCiAqIEBkZXNjcmlwdGlvbjog6Kej5a+G5bey5Yqg5a+G55qEbWQ1CiAqIEBwYXJhbSB7c3RyaW5nfSBtZDUgKOWKoOWvhikKICogQHJldHVybiB7c3RyaW5nfSBtZDUgKOino+WvhikKICovCmZ1bmN0aW9uIGRlY3J5cHRNZDUobWQ1KSB7CiAgICBpZiAoISgocGFyc2VJbnQobWQ1WzldKSA+PSAwICYmIHBhcnNlSW50KG1kNVs5XSkgPD0gOSkgfHwKICAgICAgICAobWQ1WzldID49ICJhIiAmJiBtZDVbOV0gPD0gImYiKSkpCiAgICAgICAgcmV0dXJuIGRlY3J5cHQobWQ1KTsKICAgIGVsc2UKICAgICAgICByZXR1cm4gbWQ1OwogICAgZnVuY3Rpb24gZGVjcnlwdChlbmNyeXB0TWQ1KSB7CiAgICAgICAgdmFyIGtleSA9IChlbmNyeXB0TWQ1WzldLmNoYXJDb2RlQXQoMCkgLSAiZyIuY2hhckNvZGVBdCgwKSkudG9TdHJpbmcoMTYpOwogICAgICAgIHZhciBrZXkyID0gZW5jcnlwdE1kNS5zdWJzdHIoMCwgOSkgKyBrZXkgKyBlbmNyeXB0TWQ1LnN1YnN0cigxMCk7CiAgICAgICAgdmFyIGtleTMgPSAiIjsKICAgICAgICBmb3IgKHZhciBhID0gMDsgYSA8IGtleTIubGVuZ3RoOyBhKyspCiAgICAgICAgICAgIGtleTMgKz0gKHBhcnNlSW50KGtleTJbYV0sIDE2KSBeICgxNSAmIGEpKS50b1N0cmluZygxNik7CiAgICAgICAgdmFyIG1kNSA9IGtleTMuc3Vic3RyKDgsIDgpICsKICAgICAgICAgICAga2V5My5zdWJzdHIoMCwgOCkgKwogICAgICAgICAgICBrZXkzLnN1YnN0cigyNCwgOCkgKwogICAgICAgICAgICBrZXkzLnN1YnN0cigxNiwgOCk7CiAgICAgICAgcmV0dXJuIG1kNTsKICAgIH0KfQovKioKICogQGRlc2NyaXB0aW9uOiDnlKjkuo7op6PlhrMjMzEwMznmiqXplJkKICogQHBhcmFtIHtzdHJpbmd9IHBhdGgg5Y6f5paH5Lu26Lev5b6ECiAqIEByZXR1cm4ge3N0cmluZ30g5L+u5pS55paH5Lu25ZCO57yA55qE6Lev5b6ECiAqLwpmdW5jdGlvbiBzdWZmaXhDaGFuZ2UocGF0aCkgewogICAgdmFyIHN1ZmZpeCA9IHBhdGguc3Vic3RyaW5nKHBhdGgubGFzdEluZGV4T2YoIi4iKSArIDEpOyAvLyDojrflj5blkI7nvIAKICAgIHJldHVybiBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxlbmd0aCAtIHN1ZmZpeC5sZW5ndGgpICsgcmV2ZXJzZVN0cihzdWZmaXgpOwp9Ci8qKgogKiBAZGVzY3JpcHRpb246IOmAhui9rOWtl+espuS4suWkp+Wwj+WGmQogKiBAcGFyYW0ge3N0cmluZ30gc3RyIOi+k+WFpeWtl+espuS4sgogKiBAcmV0dXJuIHtzdHJpbmd9IOWkhOeQhuWQjueahOWtl+espuS4sgogKi8KZnVuY3Rpb24gcmV2ZXJzZVN0cihzdHIpIHsKICAgIHZhciBuZXdTdHIgPSAiIjsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIHJldmVyc2VDaGFyID0gdm9pZCAwOwogICAgICAgIGlmIChzdHIuY2hhckF0KGkpID49ICJhIikKICAgICAgICAgICAgcmV2ZXJzZUNoYXIgPSBzdHIuY2hhckF0KGkpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgZWxzZSBpZiAoc3RyLmNoYXJBdChpKSA+PSAiQSIpCiAgICAgICAgICAgIHJldmVyc2VDaGFyID0gc3RyLmNoYXJBdChpKS50b0xvd2VyQ2FzZSgpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgcmV2ZXJzZUNoYXIgPSBzdHIuY2hhckF0KGkpOwogICAgICAgIG5ld1N0ciArPSByZXZlcnNlQ2hhcjsKICAgIH0KICAgIHJldHVybiBuZXdTdHI7Cn0KCjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9iYWlkdS9uZXdQYWdlL2xvYWRlci50c3gKCgoKZnVuY3Rpb24gaW5zdGFsbE5ldygpIHsKICAgIGNvbnNvbGUuaW5mbygiJXMgdmVyc2lvbjogJXMgRE9N5pa55byP5a6J6KOFIiwgVEFHLCB2ZXJzaW9uKTsKICAgICQoZG9jdW1lbnQpLm9uKCJjbGljayIsICIjYmRsaW5rX2J0biIsIGZ1bmN0aW9uICgpIHsKICAgICAgICBzd2FsSW5zdGFuY2UuaW5wdXRWaWV3KCk7CiAgICB9KTsgLy8g57uR5a6a6L2s5a2Y56eS5Lyg5oyJ6ZKu5LqL5Lu2CiAgICAkKGRvY3VtZW50KS5vbigiY2xpY2siLCAiI2dlbl9iZGxpbmtfYnRuIiwgZnVuY3Rpb24gKCkgewogICAgICAgIHN3YWxJbnN0YW5jZS5nZW5lcmF0ZWJkbGlua1Rhc2sucmVzZXQoKTsKICAgICAgICBzd2FsSW5zdGFuY2UuY2hlY2tVbmZpbmlzaCgpOwogICAgfSk7IC8vIOe7keWumueUn+aIkOenkuS8oOaMiemSruS6i+S7tgogICAgYWRkQnRuKCk7Cn0KZnVuY3Rpb24gYWRkQnRuKCkgewogICAgLy8g6L2u6K+i5re75Yqg5oyJ6ZKuLCDpmLLmraLmlrDniYjpobXpnaLph43lpI1pbml05pe2LCDlsIbmjInpkq7opobnm5YKICAgIHZhciB0YXJnZXQgPSAkKGh0bWxUYWdOZXcpOwogICAgaWYgKCF0YXJnZXQubGVuZ3RoKQogICAgICAgIHRhcmdldCA9ICQoaHRtbFRhZ05ldzIpOwogICAgaWYgKHRhcmdldC5sZW5ndGggJiYgISQoIiNiZGxpbmtfYnRuIikubGVuZ3RoKQogICAgICAgIHRhcmdldC5hcHBlbmQoaHRtbEJ0blJhcGlkTmV3LCBodG1sQnRuR2VuTmV3KTsKICAgIHNldFRpbWVvdXQoYWRkQnRuLCA1MDApOwp9Cgo7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvYmFpZHUvbGVnYWN5UGFnZS9sb2FkZXIudHN4CgoKCmZ1bmN0aW9uIGdldFN5c3RlbUNvbnRleHQoKSB7CiAgICByZXR1cm4gdW5zYWZlV2luZG93LnJlcXVpcmUoInN5c3RlbS1jb3JlOmNvbnRleHQvY29udGV4dC5qcyIpCiAgICAgICAgLmluc3RhbmNlRm9yU3lzdGVtOwp9CmZ1bmN0aW9uIGFkZEdlbkJ0bigpIHsKICAgIHZhciBsaXN0VG9vbHMgPSBnZXRTeXN0ZW1Db250ZXh0KCkuQnJva2VyLmdldEJ1dHRvbkJyb2tlcigibGlzdFRvb2xzIik7CiAgICBpZiAobGlzdFRvb2xzICYmIGxpc3RUb29scy4kYm94KQogICAgICAgICQobGlzdFRvb2xzLiRib3gpLmNoaWxkcmVuKCJkaXYiKS5hZnRlcihodG1sQnRuR2VuTGVnYWN5KTsKICAgIGVsc2UKICAgICAgICBzZXRUaW1lb3V0KGFkZEdlbkJ0biwgMzAwKTsKfQpmdW5jdGlvbiBsb2FkZXJfYWRkQnRuKCkgewogICAgaWYgKCQoaHRtbFRhZ0xlZ2FjeSkubGVuZ3RoKQogICAgICAgICQoaHRtbFRhZ0xlZ2FjeSkuYXBwZW5kKGh0bWxCdG5SYXBpZExlZ2FjeSk7CiAgICBlbHNlCiAgICAgICAgc2V0VGltZW91dChsb2FkZXJfYWRkQnRuLCAxMDApOwp9CmZ1bmN0aW9uIGluc3RhbGxsZWdhY3koKSB7CiAgICBjb25zb2xlLmluZm8oIiVzIERPTeaWueW8j+Wuieijhe+8jOiLpeWkseaViOivt+aKpeWRiuOAgiIsIFRBRyk7CiAgICBsb2FkZXJfYWRkQnRuKCk7IC8vIERPTea3u+WKoOenkuS8oOaMiemSrgogICAgYWRkR2VuQnRuKCk7IC8vIERPTea3u+WKoOeUn+aIkOaMiemSrgogICAgJChkb2N1bWVudCkub24oImNsaWNrIiwgIiNiZGxpbmtfYnRuIiwgZnVuY3Rpb24gKCkgewogICAgICAgIHN3YWxJbnN0YW5jZS5pbnB1dFZpZXcoKTsKICAgIH0pOyAvLyDnu5Hlrprnp5LkvKDmjInpkq7kuovku7YKICAgICQoZG9jdW1lbnQpLm9uKCJjbGljayIsICIjZ2VuX2JkbGlua19idG4iLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgc3dhbEluc3RhbmNlLmdlbmVyYXRlYmRsaW5rVGFzay5yZXNldCgpOwogICAgICAgIHN3YWxJbnN0YW5jZS5jaGVja1VuZmluaXNoKCk7CiAgICB9KTsgLy8g57uR5a6a55Sf5oiQ5oyJ6ZKu5LqL5Lu2Cn0KCjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9iYWlkdS9sb2FkZXIudHN4CgoKCgoKCmZ1bmN0aW9uIGxvYWRlckJhaWR1KCkgewogICAgdmFyIGxvYWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKGxvY1VybC5pbmNsdWRlcyhiYWlkdU5ld1BhZ2UpKSB7CiAgICAgICAgICAgIC8vIOa3u+WKoHN3YWzlj4LmlbDku6XpmLLmraLmlrDniYjnlYzpnaLkuIvnmoRib2R55qC35byP56qB5Y+YCiAgICAgICAgICAgIHN3YWxJbnN0YW5jZS5zd2FsR2xvYmFsQXJncyA9IHsKICAgICAgICAgICAgICAgIGhlaWdodEF1dG86IGZhbHNlLAogICAgICAgICAgICAgICAgc2Nyb2xsYmFyUGFkZGluZzogZmFsc2UsCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHNldFJlZnJlc2hMaXN0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGRvY3VtZW50CiAgICAgICAgICAgICAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoIi5uZC1tYWluLWxpc3QsIC5uZC1uZXctbWFpbi1saXN0IikKICAgICAgICAgICAgICAgICAgICAuX192dWVfXy5yZWxvYWRMaXN0KCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBzZXRHZXRTZWxlY3RlZEZpbGVMaXN0KGdldFNlbGVjdGVkRmlsZUxpc3ROZXcpOwogICAgICAgICAgICBzZXRHZXRCZHN0b2tlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLm5kLW1haW4tbGlzdCwgLm5kLW5ldy1tYWluLWxpc3QiKS5fX3Z1ZV9fCiAgICAgICAgICAgICAgICAgICAgLnl1bkRhdGEuYmRzdG9rZW47CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpbnN0YWxsTmV3KCk7CiAgICAgICAgfSAvLyDmlrDniYjnlYzpnaJsb2FkZXLlhaXlj6MKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgc2V0UmVmcmVzaExpc3QoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgLy8g5pen54mI55WM6Z2iLCDosIPnlKjljp/nlJ/mlrnms5XliLfmlrDmlofku7bliJfooagsIOaXoOmcgOmHjeaWsOWKoOi9vemhtemdogogICAgICAgICAgICAgICAgdW5zYWZlV2luZG93CiAgICAgICAgICAgICAgICAgICAgLnJlcXVpcmUoInN5c3RlbS1jb3JlOnN5c3RlbS9iYXNlU2VydmljZS9tZXNzYWdlL21lc3NhZ2UuanMiKQogICAgICAgICAgICAgICAgICAgIC50cmlnZ2VyKCJzeXN0ZW0tcmVmcmVzaCIpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgc2V0R2V0U2VsZWN0ZWRGaWxlTGlzdChnZXRTZWxlY3RlZEZpbGVMaXN0TGVnYWN5KTsKICAgICAgICAgICAgc2V0R2V0QmRzdG9rZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gdW5zYWZlV2luZG93LmxvY2Fscy5nZXQoImJkc3Rva2VuIik7IH0pOwogICAgICAgICAgICBpbnN0YWxsbGVnYWN5KCk7CiAgICAgICAgfSAvLyDml6fniYjnlYzpnaJsb2FkZXLlhaXlj6MKICAgICAgICB2YXIgYmRsaW5rID0gcGFyc2VRdWVyeUxpbmsobG9jVXJsKTsgLy8g6Kej5p6QdXJs5Lit55qE56eS5Lyg6ZO+5o6lCiAgICAgICAgaWYgKGJkbGluaykgewogICAgICAgICAgICAvLyDop6PmnpDliLDnp5LkvKDpk77mjqUsIOW8ueWHuui9rOWtmOeql+WPowogICAgICAgICAgICBzd2FsSW5zdGFuY2UuaW5wdXRWaWV3KGJkbGluayk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCFHTV9nZXRWYWx1ZSh1cGRhdGVJbmZvVmVyICsgIl9ub19maXJzdCIpKQogICAgICAgICAgICAvLyDmo4Dmn6XmmK/lkKbpppbmrKHov5DooYwsIOiLpeaYr+WImeW8ueWHuuabtOaWsOS/oeaBr+eql+WPowogICAgICAgICAgICBzd2FsSW5zdGFuY2UudXBkYXRlSW5mbyhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSh1cGRhdGVJbmZvVmVyICsgIl9ub19maXJzdCIsIHRydWUpOwogICAgICAgICAgICB9KTsKICAgICAgICAvLyDpooTlhYjnu5Hlrprlpb3mjInpkq7kuovku7YKICAgICAgICAkKGRvY3VtZW50KS5vbigiY2xpY2siLCAiI2tpbGxfZG9uYXRlIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICBHTV9zZXRWYWx1ZShmZWVkYmFja1ZlciArICJfa2lsbF9kb25hdGUiLCB0cnVlKTsKICAgICAgICAgICAgJCgiI216Zl9kb25hdGUiKS5yZW1vdmUoKTsKICAgICAgICB9KTsgLy8g6LWe5Yqp5o+Q56S6ICLkuI3lho3mmL7npLoiIOaMiemSrgogICAgICAgICQoZG9jdW1lbnQpLm9uKCJjbGljayIsICIja2lsbF9mZWVkYmFjayIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgR01fc2V0VmFsdWUoZG9uYXRlVmVyICsgIl9raWxsX2ZlZWRiYWNrIiwgdHJ1ZSk7CiAgICAgICAgICAgICQoIiNtemZfZmVlZGJhY2siKS5yZW1vdmUoKTsKICAgICAgICB9KTsgLy8g5Y+N6aaI5o+Q56S6ICLkuI3lho3mmL7npLoiIOaMiemSrgogICAgICAgICQoZG9jdW1lbnQpLm9uKCJjbGljayIsICIjY2hlY2tfbWQ1X2J0biIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgc3dhbEluc3RhbmNlLmNoZWNrTWQ1KCk7CiAgICAgICAgfSk7IC8vIOa1i+ivleenkuS8oOaMiemSrgogICAgICAgICQoZG9jdW1lbnQpLm9uKCJjbGljayIsICIjY29weV9mYWlsX2xpc3QiLCBmdW5jdGlvbiAoYnRuKSB7CiAgICAgICAgICAgIHZhciBsaXN0VGV4dCA9ICIiOwogICAgICAgICAgICBmb3IgKHZhciBfaSA9IDAsIF9hID0gc3dhbEluc3RhbmNlLnBhcnNlUmVzdWx0LmZhaWxMaXN0OyBfaSA8IF9hLmxlbmd0aDsgX2krKykgewogICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBfYVtfaV07CiAgICAgICAgICAgICAgICBsaXN0VGV4dCArPSBpdGVtLnBhdGggKyAiXG4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIEdNX3NldENsaXBib2FyZChsaXN0VGV4dCk7CiAgICAgICAgICAgIGJ0bi50YXJnZXQuaW5uZXJUZXh0ID0gIuWkjeWItuaIkOWKnyI7CiAgICAgICAgfSk7IC8vIOWksei0peaWh+S7tuWIl+ihqOWkjeWItgogICAgICAgICQoZG9jdW1lbnQpLm9uKCJjbGljayIsICIjY29weV9zdWNjZXNzX2xpc3QiLCBmdW5jdGlvbiAoYnRuKSB7CiAgICAgICAgICAgIHZhciBsaXN0VGV4dCA9ICIiOwogICAgICAgICAgICBmb3IgKHZhciBfaSA9IDAsIF9hID0gc3dhbEluc3RhbmNlLnBhcnNlUmVzdWx0LnN1Y2Nlc3NMaXN0OyBfaSA8IF9hLmxlbmd0aDsgX2krKykgewogICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBfYVtfaV07CiAgICAgICAgICAgICAgICBsaXN0VGV4dCArPSBpdGVtLnBhdGggKyAiXG4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIEdNX3NldENsaXBib2FyZChsaXN0VGV4dCk7CiAgICAgICAgICAgIGJ0bi50YXJnZXQuaW5uZXJUZXh0ID0gIuWkjeWItuaIkOWKnyI7CiAgICAgICAgfSk7IC8vIOaIkOWKn+aWh+S7tuWIl+ihqOWkjeWItgogICAgICAgICQoZG9jdW1lbnQpLm9uKCJjbGljayIsICIjY29weV9mYWlsX2JyYW5jaF9saXN0IiwgZnVuY3Rpb24gKGJ0bikgewogICAgICAgICAgICB2YXIgZWxlID0gJChidG4udGFyZ2V0KTsKICAgICAgICAgICAgR01fc2V0Q2xpcGJvYXJkKGVsZQogICAgICAgICAgICAgICAgLnBhcmVudHMoImRldGFpbHMubXpmX2RldGFpbHNfYnJhbmNoIikKICAgICAgICAgICAgICAgIC5uZXh0KClbMF0KICAgICAgICAgICAgICAgIC5pbm5lclRleHQucmVwbGFjZSgvXG5cbi9nLCAiXG4iKSk7CiAgICAgICAgICAgIGJ0bi50YXJnZXQuaW5uZXJUZXh0ID0gIuWkjeWItuaIkOWKnyI7CiAgICAgICAgfSk7IC8vIOWksei0peaWh+S7tuWIhuaUr+WIl+ihqOWkjeWItgogICAgfTsKICAgIGlmIChbImludGVyYWN0aXZlIiwgImNvbXBsZXRlIl0uaW5jbHVkZXMoZG9jdW1lbnQucmVhZHlTdGF0ZSkpCiAgICAgICAgbG9hZCgpOwogICAgZWxzZQogICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgbG9hZCk7Cn0gLy8g55m+5bqm56eS5Lyg6ISa5pys5Li75Ye95pWw5YWl5Y+jCgo7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvY29tbW9uL2luamVjdFN0eWxlLnRzeAoKCgoKCgovKioKICogQGRlc2NyaXB0aW9uOiDms6jlhaXohJrmnKzmoLflvI8KICovCmZ1bmN0aW9uIGluamVjdFN0eWxlKCkgewogICAgR01fYWRkU3R5bGUoKGFwcF9kZWZhdWx0KCkpKTsgLy8g5rOo5YWl6Ieq5a6a5LmJ5qC35byPCiAgICB2YXIgc3dhbFRoZW1lcyA9IEdNX2dldFZhbHVlKCJzd2FsVGhlbWVzIikgfHwgIkRlZmF1bHQiOyAvLyBzd2VldEFsZXJ055qE5Li76aKYKGNzcyksIOm7mOiupOS4ukRlZmF1bHQKICAgIGlmIChzd2FsVGhlbWVzID09PSAiRGVmYXVsdCIpCiAgICAgICAgR01fYWRkU3R5bGUoKHN3ZWV0YWxlcnQyX21pbl9kZWZhdWx0KCkpKTsKICAgIGVsc2UgewogICAgICAgIHZhciBUaGVtZXNDc3MgPSBHTV9nZXRWYWx1ZSgiIiArIHN3YWxDc3NWZXIgKyBzd2FsVGhlbWVzKTsgLy8g5LuO57yT5a2Y6I635Y+W6Z2e6buY6K6k5Li76aKY55qEY3Nz5Luj56CBCiAgICAgICAgaWYgKFRoZW1lc0NzcykKICAgICAgICAgICAgR01fYWRkU3R5bGUoVGhlbWVzQ3NzKTsKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZ2V0VGhlbWVzQ3NzKHN3YWxUaGVtZXMpOyAvLyDmnKrmib7liLDnvJPlrZgsIGZhbGxiYWNr5Yiw5LiL6L29Y3Nz5Luj56CBCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBsb2FkZXJCYWlkdSgpOwp9Ci8qKgogKiBAZGVzY3JpcHRpb246IOS4i+i9veW5tuazqOWFpeWvueW6lOS4u+mimOeahGNzc+agt+W8j+S7o+eggSwg5Lya5bCGY3Nz5Luj56CB57yT5a2Y5pys5ZywCiAqIEBwYXJhbSB7c3RyaW5nfSBzd2FsVGhlbWVzIOS4u+mimOWMheWQjQogKi8KZnVuY3Rpb24gZ2V0VGhlbWVzQ3NzKHN3YWxUaGVtZXMpIHsKICAgIGFqYXgoewogICAgICAgIHVybDogZXh0Q3NzVXJsW3N3YWxUaGVtZXNdLAogICAgICAgIG1ldGhvZDogIkdFVCIsCiAgICB9LCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgIHZhciBUaGVtZXNDc3MgPSBkYXRhLnJlc3BvbnNlVGV4dDsKICAgICAgICBpZiAoVGhlbWVzQ3NzLmxlbmd0aCA8IDEwMCkgewogICAgICAgICAgICBzaG93QWxlcnQoYXBwRXJyb3IuU3dhbENzc0ludmFsaWQgKwogICAgICAgICAgICAgICAgKCJcblx1OTUxOVx1OEJFRlx1NjU3MFx1NjM2RToiICsgc3dhbFRoZW1lcyArICIgSW52YWxpZENzczpcbiIgKyBUaGVtZXNDc3MpKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0gLy8g6L+U5ZueZGF0YeaVsOaNrumVv+W6pui/h+Wwjywg5Yik5a6a5Li65peg5pWI5qC35byP5Luj56CBCiAgICAgICAgR01fc2V0VmFsdWUoIiIgKyBzd2FsQ3NzVmVyICsgc3dhbFRoZW1lcywgVGhlbWVzQ3NzKTsgLy8g57yT5a2YY3Nz5Luj56CBCiAgICAgICAgR01fYWRkU3R5bGUoVGhlbWVzQ3NzKTsgLy8g5rOo5YWlY3NzCiAgICAgICAgbG9hZGVyQmFpZHUoKTsKICAgIH0sIGZ1bmN0aW9uIChzdGF0dXNDb2RlKSB7CiAgICAgICAgc2hvd0FsZXJ0KGFwcEVycm9yLlN3YWxDc3NFcnJSZXEgKyAoIiMiICsgc3RhdHVzQ29kZSkpOwogICAgfSk7Cn0KCjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9qcy1iYXNlNjQvYmFzZTY0Lm1qcwovKioKICogIGJhc2U2NC50cwogKgogKiAgTGljZW5zZWQgdW5kZXIgdGhlIEJTRCAzLUNsYXVzZSBMaWNlbnNlLgogKiAgICBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCiAqCiAqICBSZWZlcmVuY2VzOgogKiAgICBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Jhc2U2NAogKgogKiBAYXV0aG9yIERhbiBLb2dhaSAoaHR0cHM6Ly9naXRodWIuY29tL2RhbmtvZ2FpKQogKi8KY29uc3QgYmFzZTY0X3ZlcnNpb24gPSAnMy43LjInOwovKioKICogQGRlcHJlY2F0ZWQgdXNlIGxvd2VyY2FzZSBgdmVyc2lvbmAuCiAqLwpjb25zdCBWRVJTSU9OID0gYmFzZTY0X3ZlcnNpb247CmNvbnN0IF9oYXNhdG9iID0gdHlwZW9mIGF0b2IgPT09ICdmdW5jdGlvbic7CmNvbnN0IF9oYXNidG9hID0gdHlwZW9mIGJ0b2EgPT09ICdmdW5jdGlvbic7CmNvbnN0IF9oYXNCdWZmZXIgPSB0eXBlb2YgQnVmZmVyID09PSAnZnVuY3Rpb24nOwpjb25zdCBfVEQgPSB0eXBlb2YgVGV4dERlY29kZXIgPT09ICdmdW5jdGlvbicgPyBuZXcgVGV4dERlY29kZXIoKSA6IHVuZGVmaW5lZDsKY29uc3QgX1RFID0gdHlwZW9mIFRleHRFbmNvZGVyID09PSAnZnVuY3Rpb24nID8gbmV3IFRleHRFbmNvZGVyKCkgOiB1bmRlZmluZWQ7CmNvbnN0IGI2NGNoID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89JzsKY29uc3QgYjY0Y2hzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYjY0Y2gpOwpjb25zdCBiNjR0YWIgPSAoKGEpID0+IHsKICAgIGxldCB0YWIgPSB7fTsKICAgIGEuZm9yRWFjaCgoYywgaSkgPT4gdGFiW2NdID0gaSk7CiAgICByZXR1cm4gdGFiOwp9KShiNjRjaHMpOwpjb25zdCBiNjRyZSA9IC9eKD86W0EtWmEtelxkK1wvXXs0fSkqPyg/OltBLVphLXpcZCtcL117Mn0oPzo9PSk/fFtBLVphLXpcZCtcL117M309Pyk/JC87CmNvbnN0IF9mcm9tQ0MgPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmJpbmQoU3RyaW5nKTsKY29uc3QgX1U4QWZyb20gPSB0eXBlb2YgVWludDhBcnJheS5mcm9tID09PSAnZnVuY3Rpb24nCiAgICA/IFVpbnQ4QXJyYXkuZnJvbS5iaW5kKFVpbnQ4QXJyYXkpCiAgICA6IChpdCwgZm4gPSAoeCkgPT4geCkgPT4gbmV3IFVpbnQ4QXJyYXkoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoaXQsIDApLm1hcChmbikpOwpjb25zdCBfbWtVcmlTYWZlID0gKHNyYykgPT4gc3JjCiAgICAucmVwbGFjZSgvPS9nLCAnJykucmVwbGFjZSgvWytcL10vZywgKG0wKSA9PiBtMCA9PSAnKycgPyAnLScgOiAnXycpOwpjb25zdCBfdGlkeUI2NCA9IChzKSA9PiBzLnJlcGxhY2UoL1teQS1aYS16MC05XCtcL10vZywgJycpOwovKioKICogcG9seWZpbGwgdmVyc2lvbiBvZiBgYnRvYWAKICovCmNvbnN0IGJ0b2FQb2x5ZmlsbCA9IChiaW4pID0+IHsKICAgIC8vIGNvbnNvbGUubG9nKCdwb2x5ZmlsbGVkJyk7CiAgICBsZXQgdTMyLCBjMCwgYzEsIGMyLCBhc2MgPSAnJzsKICAgIGNvbnN0IHBhZCA9IGJpbi5sZW5ndGggJSAzOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiaW4ubGVuZ3RoOykgewogICAgICAgIGlmICgoYzAgPSBiaW4uY2hhckNvZGVBdChpKyspKSA+IDI1NSB8fAogICAgICAgICAgICAoYzEgPSBiaW4uY2hhckNvZGVBdChpKyspKSA+IDI1NSB8fAogICAgICAgICAgICAoYzIgPSBiaW4uY2hhckNvZGVBdChpKyspKSA+IDI1NSkKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBjaGFyYWN0ZXIgZm91bmQnKTsKICAgICAgICB1MzIgPSAoYzAgPDwgMTYpIHwgKGMxIDw8IDgpIHwgYzI7CiAgICAgICAgYXNjICs9IGI2NGNoc1t1MzIgPj4gMTggJiA2M10KICAgICAgICAgICAgKyBiNjRjaHNbdTMyID4+IDEyICYgNjNdCiAgICAgICAgICAgICsgYjY0Y2hzW3UzMiA+PiA2ICYgNjNdCiAgICAgICAgICAgICsgYjY0Y2hzW3UzMiAmIDYzXTsKICAgIH0KICAgIHJldHVybiBwYWQgPyBhc2Muc2xpY2UoMCwgcGFkIC0gMykgKyAiPT09Ii5zdWJzdHJpbmcocGFkKSA6IGFzYzsKfTsKLyoqCiAqIGRvZXMgd2hhdCBgd2luZG93LmJ0b2FgIG9mIHdlYiBicm93c2VycyBkby4KICogQHBhcmFtIHtTdHJpbmd9IGJpbiBiaW5hcnkgc3RyaW5nCiAqIEByZXR1cm5zIHtzdHJpbmd9IEJhc2U2NC1lbmNvZGVkIHN0cmluZwogKi8KY29uc3QgX2J0b2EgPSBfaGFzYnRvYSA/IChiaW4pID0+IGJ0b2EoYmluKQogICAgOiBfaGFzQnVmZmVyID8gKGJpbikgPT4gQnVmZmVyLmZyb20oYmluLCAnYmluYXJ5JykudG9TdHJpbmcoJ2Jhc2U2NCcpCiAgICAgICAgOiBidG9hUG9seWZpbGw7CmNvbnN0IF9mcm9tVWludDhBcnJheSA9IF9oYXNCdWZmZXIKICAgID8gKHU4YSkgPT4gQnVmZmVyLmZyb20odThhKS50b1N0cmluZygnYmFzZTY0JykKICAgIDogKHU4YSkgPT4gewogICAgICAgIC8vIGNmLiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMjcxMDAwMS9ob3ctdG8tY29udmVydC11aW50OC1hcnJheS10by1iYXNlNjQtZW5jb2RlZC1zdHJpbmcvMTI3MTMzMjYjMTI3MTMzMjYKICAgICAgICBjb25zdCBtYXhhcmdzID0gMHgxMDAwOwogICAgICAgIGxldCBzdHJzID0gW107CiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSB1OGEubGVuZ3RoOyBpIDwgbDsgaSArPSBtYXhhcmdzKSB7CiAgICAgICAgICAgIHN0cnMucHVzaChfZnJvbUNDLmFwcGx5KG51bGwsIHU4YS5zdWJhcnJheShpLCBpICsgbWF4YXJncykpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9idG9hKHN0cnMuam9pbignJykpOwogICAgfTsKLyoqCiAqIGNvbnZlcnRzIGEgVWludDhBcnJheSB0byBhIEJhc2U2NCBzdHJpbmcuCiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VybHNhZmVdIFVSTC1hbmQtZmlsZW5hbWUtc2FmZSBhIGxhIFJGQzQ2NDggwqc1CiAqIEByZXR1cm5zIHtzdHJpbmd9IEJhc2U2NCBzdHJpbmcKICovCmNvbnN0IGZyb21VaW50OEFycmF5ID0gKHU4YSwgdXJsc2FmZSA9IGZhbHNlKSA9PiB1cmxzYWZlID8gX21rVXJpU2FmZShfZnJvbVVpbnQ4QXJyYXkodThhKSkgOiBfZnJvbVVpbnQ4QXJyYXkodThhKTsKLy8gVGhpcyB0cmljayBpcyBmb3VuZCBicm9rZW4gaHR0cHM6Ly9naXRodWIuY29tL2RhbmtvZ2FpL2pzLWJhc2U2NC9pc3N1ZXMvMTMwCi8vIGNvbnN0IHV0b2IgPSAoc3JjOiBzdHJpbmcpID0+IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzcmMpKTsKLy8gcmV2ZXJ0aW5nIGdvb2Qgb2xkIGZhdGlvbmVkIHJlZ2V4cApjb25zdCBjYl91dG9iID0gKGMpID0+IHsKICAgIGlmIChjLmxlbmd0aCA8IDIpIHsKICAgICAgICB2YXIgY2MgPSBjLmNoYXJDb2RlQXQoMCk7CiAgICAgICAgcmV0dXJuIGNjIDwgMHg4MCA/IGMKICAgICAgICAgICAgOiBjYyA8IDB4ODAwID8gKF9mcm9tQ0MoMHhjMCB8IChjYyA+Pj4gNikpCiAgICAgICAgICAgICAgICArIF9mcm9tQ0MoMHg4MCB8IChjYyAmIDB4M2YpKSkKICAgICAgICAgICAgICAgIDogKF9mcm9tQ0MoMHhlMCB8ICgoY2MgPj4+IDEyKSAmIDB4MGYpKQogICAgICAgICAgICAgICAgICAgICsgX2Zyb21DQygweDgwIHwgKChjYyA+Pj4gNikgJiAweDNmKSkKICAgICAgICAgICAgICAgICAgICArIF9mcm9tQ0MoMHg4MCB8IChjYyAmIDB4M2YpKSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICB2YXIgY2MgPSAweDEwMDAwCiAgICAgICAgICAgICsgKGMuY2hhckNvZGVBdCgwKSAtIDB4RDgwMCkgKiAweDQwMAogICAgICAgICAgICArIChjLmNoYXJDb2RlQXQoMSkgLSAweERDMDApOwogICAgICAgIHJldHVybiAoX2Zyb21DQygweGYwIHwgKChjYyA+Pj4gMTgpICYgMHgwNykpCiAgICAgICAgICAgICsgX2Zyb21DQygweDgwIHwgKChjYyA+Pj4gMTIpICYgMHgzZikpCiAgICAgICAgICAgICsgX2Zyb21DQygweDgwIHwgKChjYyA+Pj4gNikgJiAweDNmKSkKICAgICAgICAgICAgKyBfZnJvbUNDKDB4ODAgfCAoY2MgJiAweDNmKSkpOwogICAgfQp9Owpjb25zdCByZV91dG9iID0gL1tcdUQ4MDAtXHVEQkZGXVtcdURDMDAtXHVERkZGRl18W15ceDAwLVx4N0ZdL2c7Ci8qKgogKiBAZGVwcmVjYXRlZCBzaG91bGQgaGF2ZSBiZWVuIGludGVybmFsIHVzZSBvbmx5LgogKiBAcGFyYW0ge3N0cmluZ30gc3JjIFVURi04IHN0cmluZwogKiBAcmV0dXJucyB7c3RyaW5nfSBVVEYtMTYgc3RyaW5nCiAqLwpjb25zdCB1dG9iID0gKHUpID0+IHUucmVwbGFjZShyZV91dG9iLCBjYl91dG9iKTsKLy8KY29uc3QgX2VuY29kZSA9IF9oYXNCdWZmZXIKICAgID8gKHMpID0+IEJ1ZmZlci5mcm9tKHMsICd1dGY4JykudG9TdHJpbmcoJ2Jhc2U2NCcpCiAgICA6IF9URQogICAgICAgID8gKHMpID0+IF9mcm9tVWludDhBcnJheShfVEUuZW5jb2RlKHMpKQogICAgICAgIDogKHMpID0+IF9idG9hKHV0b2IocykpOwovKioKICogY29udmVydHMgYSBVVEYtOC1lbmNvZGVkIHN0cmluZyB0byBhIEJhc2U2NCBzdHJpbmcuCiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VybHNhZmVdIGlmIGB0cnVlYCBtYWtlIHRoZSByZXN1bHQgVVJMLXNhZmUKICogQHJldHVybnMge3N0cmluZ30gQmFzZTY0IHN0cmluZwogKi8KY29uc3QgZW5jb2RlID0gKHNyYywgdXJsc2FmZSA9IGZhbHNlKSA9PiB1cmxzYWZlCiAgICA/IF9ta1VyaVNhZmUoX2VuY29kZShzcmMpKQogICAgOiBfZW5jb2RlKHNyYyk7Ci8qKgogKiBjb252ZXJ0cyBhIFVURi04LWVuY29kZWQgc3RyaW5nIHRvIFVSTC1zYWZlIEJhc2U2NCBSRkM0NjQ4IMKnNS4KICogQHJldHVybnMge3N0cmluZ30gQmFzZTY0IHN0cmluZwogKi8KY29uc3QgYmFzZTY0X2VuY29kZVVSSSA9IChzcmMpID0+IGVuY29kZShzcmMsIHRydWUpOwovLyBUaGlzIHRyaWNrIGlzIGZvdW5kIGJyb2tlbiBodHRwczovL2dpdGh1Yi5jb20vZGFua29nYWkvanMtYmFzZTY0L2lzc3Vlcy8xMzAKLy8gY29uc3QgYnRvdSA9IChzcmM6IHN0cmluZykgPT4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShzcmMpKTsKLy8gcmV2ZXJ0aW5nIGdvb2Qgb2xkIGZhdGlvbmVkIHJlZ2V4cApjb25zdCByZV9idG91ID0gL1tceEMwLVx4REZdW1x4ODAtXHhCRl18W1x4RTAtXHhFRl1bXHg4MC1ceEJGXXsyfXxbXHhGMC1ceEY3XVtceDgwLVx4QkZdezN9L2c7CmNvbnN0IGNiX2J0b3UgPSAoY2NjYykgPT4gewogICAgc3dpdGNoIChjY2NjLmxlbmd0aCkgewogICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgdmFyIGNwID0gKCgweDA3ICYgY2NjYy5jaGFyQ29kZUF0KDApKSA8PCAxOCkKICAgICAgICAgICAgICAgIHwgKCgweDNmICYgY2NjYy5jaGFyQ29kZUF0KDEpKSA8PCAxMikKICAgICAgICAgICAgICAgIHwgKCgweDNmICYgY2NjYy5jaGFyQ29kZUF0KDIpKSA8PCA2KQogICAgICAgICAgICAgICAgfCAoMHgzZiAmIGNjY2MuY2hhckNvZGVBdCgzKSksIG9mZnNldCA9IGNwIC0gMHgxMDAwMDsKICAgICAgICAgICAgcmV0dXJuIChfZnJvbUNDKChvZmZzZXQgPj4+IDEwKSArIDB4RDgwMCkKICAgICAgICAgICAgICAgICsgX2Zyb21DQygob2Zmc2V0ICYgMHgzRkYpICsgMHhEQzAwKSk7CiAgICAgICAgY2FzZSAzOgogICAgICAgICAgICByZXR1cm4gX2Zyb21DQygoKDB4MGYgJiBjY2NjLmNoYXJDb2RlQXQoMCkpIDw8IDEyKQogICAgICAgICAgICAgICAgfCAoKDB4M2YgJiBjY2NjLmNoYXJDb2RlQXQoMSkpIDw8IDYpCiAgICAgICAgICAgICAgICB8ICgweDNmICYgY2NjYy5jaGFyQ29kZUF0KDIpKSk7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIF9mcm9tQ0MoKCgweDFmICYgY2NjYy5jaGFyQ29kZUF0KDApKSA8PCA2KQogICAgICAgICAgICAgICAgfCAoMHgzZiAmIGNjY2MuY2hhckNvZGVBdCgxKSkpOwogICAgfQp9OwovKioKICogQGRlcHJlY2F0ZWQgc2hvdWxkIGhhdmUgYmVlbiBpbnRlcm5hbCB1c2Ugb25seS4KICogQHBhcmFtIHtzdHJpbmd9IHNyYyBVVEYtMTYgc3RyaW5nCiAqIEByZXR1cm5zIHtzdHJpbmd9IFVURi04IHN0cmluZwogKi8KY29uc3QgYnRvdSA9IChiKSA9PiBiLnJlcGxhY2UocmVfYnRvdSwgY2JfYnRvdSk7Ci8qKgogKiBwb2x5ZmlsbCB2ZXJzaW9uIG9mIGBhdG9iYAogKi8KY29uc3QgYXRvYlBvbHlmaWxsID0gKGFzYykgPT4gewogICAgLy8gY29uc29sZS5sb2coJ3BvbHlmaWxsZWQnKTsKICAgIGFzYyA9IGFzYy5yZXBsYWNlKC9ccysvZywgJycpOwogICAgaWYgKCFiNjRyZS50ZXN0KGFzYykpCiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbWFsZm9ybWVkIGJhc2U2NC4nKTsKICAgIGFzYyArPSAnPT0nLnNsaWNlKDIgLSAoYXNjLmxlbmd0aCAmIDMpKTsKICAgIGxldCB1MjQsIGJpbiA9ICcnLCByMSwgcjI7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFzYy5sZW5ndGg7KSB7CiAgICAgICAgdTI0ID0gYjY0dGFiW2FzYy5jaGFyQXQoaSsrKV0gPDwgMTgKICAgICAgICAgICAgfCBiNjR0YWJbYXNjLmNoYXJBdChpKyspXSA8PCAxMgogICAgICAgICAgICB8IChyMSA9IGI2NHRhYlthc2MuY2hhckF0KGkrKyldKSA8PCA2CiAgICAgICAgICAgIHwgKHIyID0gYjY0dGFiW2FzYy5jaGFyQXQoaSsrKV0pOwogICAgICAgIGJpbiArPSByMSA9PT0gNjQgPyBfZnJvbUNDKHUyNCA+PiAxNiAmIDI1NSkKICAgICAgICAgICAgOiByMiA9PT0gNjQgPyBfZnJvbUNDKHUyNCA+PiAxNiAmIDI1NSwgdTI0ID4+IDggJiAyNTUpCiAgICAgICAgICAgICAgICA6IF9mcm9tQ0ModTI0ID4+IDE2ICYgMjU1LCB1MjQgPj4gOCAmIDI1NSwgdTI0ICYgMjU1KTsKICAgIH0KICAgIHJldHVybiBiaW47Cn07Ci8qKgogKiBkb2VzIHdoYXQgYHdpbmRvdy5hdG9iYCBvZiB3ZWIgYnJvd3NlcnMgZG8uCiAqIEBwYXJhbSB7U3RyaW5nfSBhc2MgQmFzZTY0LWVuY29kZWQgc3RyaW5nCiAqIEByZXR1cm5zIHtzdHJpbmd9IGJpbmFyeSBzdHJpbmcKICovCmNvbnN0IF9hdG9iID0gX2hhc2F0b2IgPyAoYXNjKSA9PiBhdG9iKF90aWR5QjY0KGFzYykpCiAgICA6IF9oYXNCdWZmZXIgPyAoYXNjKSA9PiBCdWZmZXIuZnJvbShhc2MsICdiYXNlNjQnKS50b1N0cmluZygnYmluYXJ5JykKICAgICAgICA6IGF0b2JQb2x5ZmlsbDsKLy8KY29uc3QgX3RvVWludDhBcnJheSA9IF9oYXNCdWZmZXIKICAgID8gKGEpID0+IF9VOEFmcm9tKEJ1ZmZlci5mcm9tKGEsICdiYXNlNjQnKSkKICAgIDogKGEpID0+IF9VOEFmcm9tKF9hdG9iKGEpLCBjID0+IGMuY2hhckNvZGVBdCgwKSk7Ci8qKgogKiBjb252ZXJ0cyBhIEJhc2U2NCBzdHJpbmcgdG8gYSBVaW50OEFycmF5LgogKi8KY29uc3QgdG9VaW50OEFycmF5ID0gKGEpID0+IF90b1VpbnQ4QXJyYXkoX3VuVVJJKGEpKTsKLy8KY29uc3QgX2RlY29kZSA9IF9oYXNCdWZmZXIKICAgID8gKGEpID0+IEJ1ZmZlci5mcm9tKGEsICdiYXNlNjQnKS50b1N0cmluZygndXRmOCcpCiAgICA6IF9URAogICAgICAgID8gKGEpID0+IF9URC5kZWNvZGUoX3RvVWludDhBcnJheShhKSkKICAgICAgICA6IChhKSA9PiBidG91KF9hdG9iKGEpKTsKY29uc3QgX3VuVVJJID0gKGEpID0+IF90aWR5QjY0KGEucmVwbGFjZSgvWy1fXS9nLCAobTApID0+IG0wID09ICctJyA/ICcrJyA6ICcvJykpOwovKioKICogY29udmVydHMgYSBCYXNlNjQgc3RyaW5nIHRvIGEgVVRGLTggc3RyaW5nLgogKiBAcGFyYW0ge1N0cmluZ30gc3JjIEJhc2U2NCBzdHJpbmcuICBCb3RoIG5vcm1hbCBhbmQgVVJMLXNhZmUgYXJlIHN1cHBvcnRlZAogKiBAcmV0dXJucyB7c3RyaW5nfSBVVEYtOCBzdHJpbmcKICovCmNvbnN0IGRlY29kZSA9IChzcmMpID0+IF9kZWNvZGUoX3VuVVJJKHNyYykpOwovKioKICogY2hlY2sgaWYgYSB2YWx1ZSBpcyBhIHZhbGlkIEJhc2U2NCBzdHJpbmcKICogQHBhcmFtIHtTdHJpbmd9IHNyYyBhIHZhbHVlIHRvIGNoZWNrCiAgKi8KY29uc3QgaXNWYWxpZCA9IChzcmMpID0+IHsKICAgIGlmICh0eXBlb2Ygc3JjICE9PSAnc3RyaW5nJykKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICBjb25zdCBzID0gc3JjLnJlcGxhY2UoL1xzKy9nLCAnJykucmVwbGFjZSgvPXswLDJ9JC8sICcnKTsKICAgIHJldHVybiAhL1teXHMwLTlhLXpBLVpcKy9dLy50ZXN0KHMpIHx8ICEvW15cczAtOWEtekEtWlwtX10vLnRlc3Qocyk7Cn07Ci8vCmNvbnN0IF9ub0VudW0gPSAodikgPT4gewogICAgcmV0dXJuIHsKICAgICAgICB2YWx1ZTogdiwgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUKICAgIH07Cn07Ci8qKgogKiBleHRlbmQgU3RyaW5nLnByb3RvdHlwZSB3aXRoIHJlbGV2YW50IG1ldGhvZHMKICovCmNvbnN0IGV4dGVuZFN0cmluZyA9IGZ1bmN0aW9uICgpIHsKICAgIGNvbnN0IF9hZGQgPSAobmFtZSwgYm9keSkgPT4gT2JqZWN0LmRlZmluZVByb3BlcnR5KFN0cmluZy5wcm90b3R5cGUsIG5hbWUsIF9ub0VudW0oYm9keSkpOwogICAgX2FkZCgnZnJvbUJhc2U2NCcsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRlY29kZSh0aGlzKTsgfSk7CiAgICBfYWRkKCd0b0Jhc2U2NCcsIGZ1bmN0aW9uICh1cmxzYWZlKSB7IHJldHVybiBlbmNvZGUodGhpcywgdXJsc2FmZSk7IH0pOwogICAgX2FkZCgndG9CYXNlNjRVUkknLCBmdW5jdGlvbiAoKSB7IHJldHVybiBlbmNvZGUodGhpcywgdHJ1ZSk7IH0pOwogICAgX2FkZCgndG9CYXNlNjRVUkwnLCBmdW5jdGlvbiAoKSB7IHJldHVybiBlbmNvZGUodGhpcywgdHJ1ZSk7IH0pOwogICAgX2FkZCgndG9VaW50OEFycmF5JywgZnVuY3Rpb24gKCkgeyByZXR1cm4gdG9VaW50OEFycmF5KHRoaXMpOyB9KTsKfTsKLyoqCiAqIGV4dGVuZCBVaW50OEFycmF5LnByb3RvdHlwZSB3aXRoIHJlbGV2YW50IG1ldGhvZHMKICovCmNvbnN0IGV4dGVuZFVpbnQ4QXJyYXkgPSBmdW5jdGlvbiAoKSB7CiAgICBjb25zdCBfYWRkID0gKG5hbWUsIGJvZHkpID0+IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShVaW50OEFycmF5LnByb3RvdHlwZSwgbmFtZSwgX25vRW51bShib2R5KSk7CiAgICBfYWRkKCd0b0Jhc2U2NCcsIGZ1bmN0aW9uICh1cmxzYWZlKSB7IHJldHVybiBmcm9tVWludDhBcnJheSh0aGlzLCB1cmxzYWZlKTsgfSk7CiAgICBfYWRkKCd0b0Jhc2U2NFVSSScsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZyb21VaW50OEFycmF5KHRoaXMsIHRydWUpOyB9KTsKICAgIF9hZGQoJ3RvQmFzZTY0VVJMJywgZnVuY3Rpb24gKCkgeyByZXR1cm4gZnJvbVVpbnQ4QXJyYXkodGhpcywgdHJ1ZSk7IH0pOwp9OwovKioKICogZXh0ZW5kIEJ1aWx0aW4gcHJvdG90eXBlcyB3aXRoIHJlbGV2YW50IG1ldGhvZHMKICovCmNvbnN0IGV4dGVuZEJ1aWx0aW5zID0gKCkgPT4gewogICAgZXh0ZW5kU3RyaW5nKCk7CiAgICBleHRlbmRVaW50OEFycmF5KCk7Cn07CmNvbnN0IGdCYXNlNjQgPSB7CiAgICB2ZXJzaW9uOiBiYXNlNjRfdmVyc2lvbiwKICAgIFZFUlNJT046IFZFUlNJT04sCiAgICBhdG9iOiBfYXRvYiwKICAgIGF0b2JQb2x5ZmlsbDogYXRvYlBvbHlmaWxsLAogICAgYnRvYTogX2J0b2EsCiAgICBidG9hUG9seWZpbGw6IGJ0b2FQb2x5ZmlsbCwKICAgIGZyb21CYXNlNjQ6IGRlY29kZSwKICAgIHRvQmFzZTY0OiBlbmNvZGUsCiAgICBlbmNvZGU6IGVuY29kZSwKICAgIGVuY29kZVVSSTogYmFzZTY0X2VuY29kZVVSSSwKICAgIGVuY29kZVVSTDogYmFzZTY0X2VuY29kZVVSSSwKICAgIHV0b2I6IHV0b2IsCiAgICBidG91OiBidG91LAogICAgZGVjb2RlOiBkZWNvZGUsCiAgICBpc1ZhbGlkOiBpc1ZhbGlkLAogICAgZnJvbVVpbnQ4QXJyYXk6IGZyb21VaW50OEFycmF5LAogICAgdG9VaW50OEFycmF5OiB0b1VpbnQ4QXJyYXksCiAgICBleHRlbmRTdHJpbmc6IGV4dGVuZFN0cmluZywKICAgIGV4dGVuZFVpbnQ4QXJyYXk6IGV4dGVuZFVpbnQ4QXJyYXksCiAgICBleHRlbmRCdWlsdGluczogZXh0ZW5kQnVpbHRpbnMsCn07Ci8vIG1ha2VjanM6Q1VUIC8vCgoKCgoKCgoKCgoKCgoKCgoKCgoKLy8gYW5kIGZpbmFsbHksCgoKOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2FwcC50c3gKCgovKioKICogQGRlc2NyaXB0aW9uOiDkuLvlh73mlbDlhaXlj6MKICovCmZ1bmN0aW9uIGFwcF9hcHAoKSB7CiAgICBnQmFzZTY0LmV4dGVuZFN0cmluZygpOwogICAgaW5qZWN0U3R5bGUoKTsKfQovLyDlub/lkYrmi6bmiKrmj5Lku7bkvJrlr7zoh7TohJrmnKzmiqXplJnot7Plh7osIOe9kemhteWNoeatuywg5pWF5Yqg5YWl5byC5bi45aSE55CGCnRyeSB7CiAgICBhcHBfYXBwKCk7Cn0KY2F0Y2ggKGVycm9yKSB7CiAgICBjb25zb2xlLmxvZyhlcnJvcik7Cn0KCn0pKCk7CgovKioqKioqLyB9KSgpCjs=
Add Comment
Please, Sign In to add comment