LS0gJElkOiB0ZXN0ZXMvZmlsZXMubHVhICQKLS0gU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gZmlsZSBhbGwubHVhCgpsb2NhbCBkZWJ1ZyA9IHJlcXVpcmUgImRlYnVnIgoKbG9jYWwgbWF4aW50ID0gbWF0aC5tYXhpbnRlZ2VyCgphc3NlcnQodHlwZShvcy5nZXRlbnYiUEFUSCIpID09ICJzdHJpbmciKQoKYXNzZXJ0KGlvLmlucHV0KGlvLnN0ZGluKSA9PSBpby5zdGRpbikKYXNzZXJ0KG5vdCBwY2FsbChpby5pbnB1dCwgIm5vbi1leGlzdGVudC1maWxlIikpCmFzc2VydChpby5vdXRwdXQoaW8uc3Rkb3V0KSA9PSBpby5zdGRvdXQpCgoKbG9jYWwgZnVuY3Rpb24gdGVzdGVyciAobXNnLCBmLCAuLi4pCiAgbG9jYWwgc3RhdCwgZXJyID0gcGNhbGwoZiwgLi4uKQogIHJldHVybiAobm90IHN0YXQgYW5kIHN0cmluZy5maW5kKGVyciwgbXNnLCAxLCB0cnVlKSkKZW5kCgoKbG9jYWwgZnVuY3Rpb24gY2hlY2tlcnIgKG1zZywgZiwgLi4uKQogIGFzc2VydCh0ZXN0ZXJyKG1zZywgZiwgLi4uKSkKZW5kCgoKLS0gY2Fubm90IGNsb3NlIHN0YW5kYXJkIGZpbGVzCmFzc2VydChub3QgaW8uY2xvc2UoaW8uc3RkaW4pIGFuZAogICAgICAgbm90IGlvLnN0ZG91dDpjbG9zZSgpIGFuZAogICAgICAgbm90IGlvLnN0ZGVycjpjbG9zZSgpKQoKLS0gY2Fubm90IGNhbGwgY2xvc2UgbWV0aG9kIHdpdGhvdXQgYW4gYXJndW1lbnQgKG5ldyBpbiA1LjMuNSkKY2hlY2tlcnIoImdvdCBubyB2YWx1ZSIsIGlvLnN0ZGluLmNsb3NlKQoKCmFzc2VydCh0eXBlKGlvLmlucHV0KCkpID09ICJ1c2VyZGF0YSIgYW5kIGlvLnR5cGUoaW8ub3V0cHV0KCkpID09ICJmaWxlIikKYXNzZXJ0KHR5cGUoaW8uc3RkaW4pID09ICJ1c2VyZGF0YSIgYW5kIGlvLnR5cGUoaW8uc3RkZXJyKSA9PSAiZmlsZSIpCmFzc2VydChub3QgaW8udHlwZSg4KSkKbG9jYWwgYSA9IHt9OyBzZXRtZXRhdGFibGUoYSwge30pCmFzc2VydChub3QgaW8udHlwZShhKSkKCmFzc2VydChnZXRtZXRhdGFibGUoaW8uaW5wdXQoKSkuX19uYW1lID09ICJGSUxFKiIpCgpsb2NhbCBhLGIsYyA9IGlvLm9wZW4oJ3h1eHVfbmFvX2V4aXN0ZScpCmFzc2VydChub3QgYSBhbmQgdHlwZShiKSA9PSAic3RyaW5nIiBhbmQgdHlwZShjKSA9PSAibnVtYmVyIikKCmEsYixjID0gaW8ub3BlbignL2EvYi9jL2QnLCAndycpCmFzc2VydChub3QgYSBhbmQgdHlwZShiKSA9PSAic3RyaW5nIiBhbmQgdHlwZShjKSA9PSAibnVtYmVyIikKCmxvY2FsIGZpbGUgPSBvcy50bXBuYW1lKCkKbG9jYWwgZiwgbXNnID0gaW8ub3BlbihmaWxlLCAidyIpCmlmIG5vdCBmIHRoZW4KICAoTWVzc2FnZSBvciBwcmludCkoIidvcy50bXBuYW1lJyBmaWxlIGNhbm5vdCBiZSBvcGVuOyBza2lwcGluZyBmaWxlIHRlc3RzIikKCmVsc2UgIC0teyAgbW9zdCB0ZXN0cyBoZXJlIG5lZWQgdG1wbmFtZQpmOmNsb3NlKCkKCnByaW50KCd0ZXN0aW5nIGkvbycpCgpsb2NhbCBvdGhlcmZpbGUgPSBvcy50bXBuYW1lKCkKCmNoZWNrZXJyKCJpbnZhbGlkIG1vZGUiLCBpby5vcGVuLCBmaWxlLCAicnciKQpjaGVja2VycigiaW52YWxpZCBtb2RlIiwgaW8ub3BlbiwgZmlsZSwgInJiKyIpCmNoZWNrZXJyKCJpbnZhbGlkIG1vZGUiLCBpby5vcGVuLCBmaWxlLCAicitiayIpCmNoZWNrZXJyKCJpbnZhbGlkIG1vZGUiLCBpby5vcGVuLCBmaWxlLCAiIikKY2hlY2tlcnIoImludmFsaWQgbW9kZSIsIGlvLm9wZW4sIGZpbGUsICIrIikKY2hlY2tlcnIoImludmFsaWQgbW9kZSIsIGlvLm9wZW4sIGZpbGUsICJiIikKYXNzZXJ0KGlvLm9wZW4oZmlsZSwgInIrYiIpKTpjbG9zZSgpCmFzc2VydChpby5vcGVuKGZpbGUsICJyKyIpKTpjbG9zZSgpCmFzc2VydChpby5vcGVuKGZpbGUsICJyYiIpKTpjbG9zZSgpCgphc3NlcnQob3Muc2V0bG9jYWxlKCdDJywgJ2FsbCcpKQoKaW8uaW5wdXQoaW8uc3RkaW4pOyBpby5vdXRwdXQoaW8uc3Rkb3V0KTsKCm9zLnJlbW92ZShmaWxlKQphc3NlcnQobm90IGxvYWRmaWxlKGZpbGUpKQpjaGVja2VycigiIiwgZG9maWxlLCBmaWxlKQphc3NlcnQobm90IGlvLm9wZW4oZmlsZSkpCmlvLm91dHB1dChmaWxlKQphc3NlcnQoaW8ub3V0cHV0KCkgfj0gaW8uc3Rkb3V0KQoKaWYgbm90IF9wb3J0IHRoZW4gICAtLSBpbnZhbGlkIHNlZWsKICBsb2NhbCBzdGF0dXMsIG1zZywgY29kZSA9IGlvLnN0ZGluOnNlZWsoInNldCIsIDEwMDApCiAgYXNzZXJ0KG5vdCBzdGF0dXMgYW5kIHR5cGUobXNnKSA9PSAic3RyaW5nIiBhbmQgdHlwZShjb2RlKSA9PSAibnVtYmVyIikKZW5kCgphc3NlcnQoaW8ub3V0cHV0KCk6c2VlaygpID09IDApCmFzc2VydChpby53cml0ZSgiYWxvIGFsbyIpOnNlZWsoKSA9PSBzdHJpbmcubGVuKCJhbG8gYWxvIikpCmFzc2VydChpby5vdXRwdXQoKTpzZWVrKCJjdXIiLCAtMykgPT0gc3RyaW5nLmxlbigiYWxvIGFsbyIpLTMpCmFzc2VydChpby53cml0ZSgiam9hbyIpKQphc3NlcnQoaW8ub3V0cHV0KCk6c2VlaygiZW5kIikgPT0gc3RyaW5nLmxlbigiYWxvIGpvYW8iKSkKCmFzc2VydChpby5vdXRwdXQoKTpzZWVrKCJzZXQiKSA9PSAwKQoKYXNzZXJ0KGlvLndyaXRlKCci4WxvIicsICJ7YX1cbiIsICJzZWNvbmQgbGluZVxuIiwgInRoaXJkIGxpbmUgXG4iKSkKYXNzZXJ0KGlvLndyaXRlKCfnZm91cnRoX2xpbmUnKSkKaW8ub3V0cHV0KGlvLnN0ZG91dCkKY29sbGVjdGdhcmJhZ2UoKSAgLS0gZmlsZSBzaG91bGQgYmUgY2xvc2VkIGJ5IEdDCmFzc2VydChpby5pbnB1dCgpID09IGlvLnN0ZGluIGFuZCByYXdlcXVhbChpby5vdXRwdXQoKSwgaW8uc3Rkb3V0KSkKcHJpbnQoJysnKQoKLS0gdGVzdCBHQyBmb3IgZmlsZXMKY29sbGVjdGdhcmJhZ2UoKQpmb3IgaT0xLDEyMCBkbwogIGZvciBpPTEsNSBkbwogICAgaW8uaW5wdXQoZmlsZSkKICAgIGFzc2VydChpby5vcGVuKGZpbGUsICdyJykpCiAgICBpby5saW5lcyhmaWxlKQogIGVuZAogIGNvbGxlY3RnYXJiYWdlKCkKZW5kCgppby5pbnB1dCgpOmNsb3NlKCkKaW8uY2xvc2UoKQoKYXNzZXJ0KG9zLnJlbmFtZShmaWxlLCBvdGhlcmZpbGUpKQphc3NlcnQobm90IG9zLnJlbmFtZShmaWxlLCBvdGhlcmZpbGUpKQoKaW8ub3V0cHV0KGlvLm9wZW4ob3RoZXJmaWxlLCAiYWIiKSkKYXNzZXJ0KGlvLndyaXRlKCJcblxuXHRcdCAgIiwgMzQ1MCwgIlxuIikpOwppby5jbG9zZSgpCgoKZG8KICAtLSBjbG9zaW5nIGZpbGUgYnkgc2NvcGUKICBsb2NhbCBGID0gbmlsCiAgZG8KICAgIGxvY2FsIDx0b2Nsb3NlPiBmID0gYXNzZXJ0KGlvLm9wZW4oZmlsZSwgInciKSkKICAgIEYgPSBmCiAgZW5kCiAgYXNzZXJ0KHRvc3RyaW5nKEYpID09ICJmaWxlIChjbG9zZWQpIikKZW5kCmFzc2VydChvcy5yZW1vdmUoZmlsZSkpCgoKZG8KICAtLSB0ZXN0IHdyaXRpbmcvcmVhZGluZyBudW1iZXJzCiAgbG9jYWwgPHRvY2xvc2U+IGYgPSBhc3NlcnQoaW8ub3BlbihmaWxlLCAidyIpKQogIGY6d3JpdGUobWF4aW50LCAnXG4nKQogIGY6d3JpdGUoc3RyaW5nLmZvcm1hdCgiMFgleFxuIiwgbWF4aW50KSkKICBmOndyaXRlKCIweEFCQ3AtMyIsICdcbicpCiAgZjp3cml0ZSgwLCAnXG4nKQogIGY6d3JpdGUoLW1heGludCwgJ1xuJykKICBmOndyaXRlKHN0cmluZy5mb3JtYXQoIjB4JVhcbiIsIC1tYXhpbnQpKQogIGY6d3JpdGUoIi0weEFCQ3AtMyIsICdcbicpCiAgYXNzZXJ0KGY6Y2xvc2UoKSkKICBmID0gYXNzZXJ0KGlvLm9wZW4oZmlsZSwgInIiKSkKICBhc3NlcnQoZjpyZWFkKCJuIikgPT0gbWF4aW50KQogIGFzc2VydChmOnJlYWQoIm4iKSA9PSBtYXhpbnQpCiAgYXNzZXJ0KGY6cmVhZCgibiIpID09IDB4QUJDcC0zKQogIGFzc2VydChmOnJlYWQoIm4iKSA9PSAwKQogIGFzc2VydChmOnJlYWQoIipuIikgPT0gLW1heGludCkgICAgICAgICAgICAtLSB0ZXN0IG9sZCBmb3JtYXQgKHdpdGggJyonKQogIGFzc2VydChmOnJlYWQoIm4iKSA9PSAtbWF4aW50KQogIGFzc2VydChmOnJlYWQoIipuIikgPT0gLTB4QUJDcC0zKSAgICAgICAgICAgIC0tIHRlc3Qgb2xkIGZvcm1hdCAod2l0aCAnKicpCmVuZAphc3NlcnQob3MucmVtb3ZlKGZpbGUpKQoKCi0tIHRlc3RpbmcgbXVsdGlwbGUgYXJndW1lbnRzIHRvIGlvLnJlYWQKZG8KICBsb2NhbCA8dG9jbG9zZT4gZiA9IGFzc2VydChpby5vcGVuKGZpbGUsICJ3IikpCiAgZjp3cml0ZVtbCmEgbGluZQphbm90aGVyIGxpbmUKMTIzNAozLjQ1Cm9uZQp0d28KdGhyZWUKXV0KICBsb2NhbCBsMSwgbDIsIGwzLCBsNCwgbjEsIG4yLCBjLCBkdW1teQogIGFzc2VydChmOmNsb3NlKCkpCiAgZiA9IGFzc2VydChpby5vcGVuKGZpbGUsICJyIikpCiAgbDEsIGwyLCBuMSwgbjIsIGR1bW15ID0gZjpyZWFkKCJsIiwgIkwiLCAibiIsICJuIikKICBhc3NlcnQobDEgPT0gImEgbGluZSIgYW5kIGwyID09ICJhbm90aGVyIGxpbmVcbiIgYW5kCiAgICAgICAgIG4xID09IDEyMzQgYW5kIG4yID09IDMuNDUgYW5kIGR1bW15ID09IG5pbCkKICBhc3NlcnQoZjpjbG9zZSgpKQogIGYgPSBhc3NlcnQoaW8ub3BlbihmaWxlLCAiciIpKQogIGwxLCBsMiwgbjEsIG4yLCBjLCBsMywgbDQsIGR1bW15ID0gZjpyZWFkKDcsICJsIiwgIm4iLCAibiIsIDEsICJsIiwgImwiKQogIGFzc2VydChsMSA9PSAiYSBsaW5lXG4iIGFuZCBsMiA9PSAiYW5vdGhlciBsaW5lIiBhbmQgYyA9PSAnXG4nIGFuZAogICAgICAgICBuMSA9PSAxMjM0IGFuZCBuMiA9PSAzLjQ1IGFuZCBsMyA9PSAib25lIiBhbmQgbDQgPT0gInR3byIKICAgICAgICAgYW5kIGR1bW15ID09IG5pbCkKICBhc3NlcnQoZjpjbG9zZSgpKQogIGYgPSBhc3NlcnQoaW8ub3BlbihmaWxlLCAiciIpKQogIC0tIHNlY29uZCBpdGVtIGZhaWxpbmcKICBsMSwgbjEsIG4yLCBkdW1teSA9IGY6cmVhZCgibCIsICJuIiwgIm4iLCAibCIpCiAgYXNzZXJ0KGwxID09ICJhIGxpbmUiIGFuZCBuMSA9PSBuaWwpCmVuZAphc3NlcnQob3MucmVtb3ZlKGZpbGUpKQoKCgotLSB0ZXN0IHlpZWxkaW5nIGR1cmluZyAnZG9maWxlJwpmID0gYXNzZXJ0KGlvLm9wZW4oZmlsZSwgInciKSkKZjp3cml0ZVtbCmxvY2FsIHgsIHogPSBjb3JvdXRpbmUueWllbGQoMTApCmxvY2FsIHkgPSBjb3JvdXRpbmUueWllbGQoMjApCnJldHVybiB4ICsgeSAqIHoKXV0KYXNzZXJ0KGY6Y2xvc2UoKSkKZiA9IGNvcm91dGluZS53cmFwKGRvZmlsZSkKYXNzZXJ0KGYoZmlsZSkgPT0gMTApCmFzc2VydChmKDEwMCwgMTAxKSA9PSAyMCkKYXNzZXJ0KGYoMjAwKSA9PSAxMDAgKyAyMDAgKiAxMDEpCmFzc2VydChvcy5yZW1vdmUoZmlsZSkpCgoKZiA9IGFzc2VydChpby5vcGVuKGZpbGUsICJ3IikpCi0tIHRlc3QgbnVtYmVyIHRlcm1pbmF0aW9uCmY6d3JpdGVbWwotMTIuMy0JLTB4ZmZmZisgIC4zfDUuRS0zWCAgKzIzNGUrMTNFIDB4REVBREJFRUZERUFEQkVFRngKMHgxLjEzQXArM2UKXV0KLS0gdmVyeSBsb25nIG51bWJlcgpmOndyaXRlKCIxMjM0Iik7IGZvciBpID0gMSwgMTAwMCBkbyBmOndyaXRlKCIwIikgZW5kOyAgZjp3cml0ZSgiXG4iKQotLSBpbnZhbGlkIHNlcXVlbmNlcyAobXVzdCByZWFkIGFuZCBkaXNjYXJkIHZhbGlkIHByZWZpeGVzKQpmOndyaXRlW1sKLmUrCTAuZTsJLS07ICAweFg7Cl1dCmFzc2VydChmOmNsb3NlKCkpCmYgPSBhc3NlcnQoaW8ub3BlbihmaWxlLCAiciIpKQphc3NlcnQoZjpyZWFkKCJuIikgPT0gLTEyLjMpOyBhc3NlcnQoZjpyZWFkKDEpID09ICItIikKYXNzZXJ0KGY6cmVhZCgibiIpID09IC0weGZmZmYpOyBhc3NlcnQoZjpyZWFkKDIpID09ICIrICIpCmFzc2VydChmOnJlYWQoIm4iKSA9PSAwLjMpOyBhc3NlcnQoZjpyZWFkKDEpID09ICJ8IikKYXNzZXJ0KGY6cmVhZCgibiIpID09IDVlLTMpOyBhc3NlcnQoZjpyZWFkKDEpID09ICJYIikKYXNzZXJ0KGY6cmVhZCgibiIpID09IDIzNGUxMyk7IGFzc2VydChmOnJlYWQoMSkgPT0gIkUiKQphc3NlcnQoZjpyZWFkKCJuIikgPT0gMFhkZWFkYmVlZmRlYWRiZWVmKTsgYXNzZXJ0KGY6cmVhZCgyKSA9PSAieFxuIikKYXNzZXJ0KGY6cmVhZCgibiIpID09IDB4MS4xM2FQMyk7IGFzc2VydChmOnJlYWQoMSkgPT0gImUiKQoKZG8gICAtLSBhdHRlbXB0IHRvIHJlYWQgdG9vIGxvbmcgbnVtYmVyCiAgYXNzZXJ0KGY6cmVhZCgibiIpID09IG5pbCkgIC0tIGZhaWxzCiAgbG9jYWwgcyA9IGY6cmVhZCgiTCIpICAgLS0gcmVhZCByZXN0IG9mIGxpbmUKICBhc3NlcnQoc3RyaW5nLmZpbmQocywgIl4wMCpcbiQiKSkgIC0tIGxvdHMgb2YgMCdzIGxlZnQKZW5kCgphc3NlcnQobm90IGY6cmVhZCgibiIpKTsgYXNzZXJ0KGY6cmVhZCgyKSA9PSAiZSsiKQphc3NlcnQobm90IGY6cmVhZCgibiIpKTsgYXNzZXJ0KGY6cmVhZCgxKSA9PSAiOyIpCmFzc2VydChub3QgZjpyZWFkKCJuIikpOyBhc3NlcnQoZjpyZWFkKDIpID09ICItOyIpCmFzc2VydChub3QgZjpyZWFkKCJuIikpOyBhc3NlcnQoZjpyZWFkKDEpID09ICJYIikKYXNzZXJ0KG5vdCBmOnJlYWQoIm4iKSk7IGFzc2VydChmOnJlYWQoMSkgPT0gIjsiKQphc3NlcnQobm90IGY6cmVhZCgibiIpKTsgYXNzZXJ0KG5vdCBmOnJlYWQoMCkpICAgLS0gZW5kIG9mIGZpbGUKYXNzZXJ0KGY6Y2xvc2UoKSkKYXNzZXJ0KG9zLnJlbW92ZShmaWxlKSkKCgotLSB0ZXN0IGxpbmUgZ2VuZXJhdG9ycwphc3NlcnQobm90IHBjYWxsKGlvLmxpbmVzLCAibm9uLWV4aXN0ZW50LWZpbGUiKSkKYXNzZXJ0KG9zLnJlbmFtZShvdGhlcmZpbGUsIGZpbGUpKQppby5vdXRwdXQob3RoZXJmaWxlKQpsb2NhbCBuID0gMApsb2NhbCBmID0gaW8ubGluZXMoZmlsZSkKd2hpbGUgZigpIGRvIG4gPSBuICsgMSBlbmQ7CmFzc2VydChuID09IDYpICAgLS0gbnVtYmVyIG9mIGxpbmVzIGluIHRoZSBmaWxlCmNoZWNrZXJyKCJmaWxlIGlzIGFscmVhZHkgY2xvc2VkIiwgZikKY2hlY2tlcnIoImZpbGUgaXMgYWxyZWFkeSBjbG9zZWQiLCBmKQotLSBjb3B5IGZyb20gZmlsZSB0byBvdGhlcmZpbGUKbiA9IDAKZm9yIGwgaW4gaW8ubGluZXMoZmlsZSkgZG8gaW8ud3JpdGUobCwgIlxuIik7IG4gPSBuICsgMSBlbmQKaW8uY2xvc2UoKQphc3NlcnQobiA9PSA2KQotLSBjb3B5IGZyb20gb3RoZXJmaWxlIGJhY2sgdG8gZmlsZQpsb2NhbCBmID0gYXNzZXJ0KGlvLm9wZW4ob3RoZXJmaWxlKSkKYXNzZXJ0KGlvLnR5cGUoZikgPT0gImZpbGUiKQppby5vdXRwdXQoZmlsZSkKYXNzZXJ0KG5vdCBpby5vdXRwdXQoKTpyZWFkKCkpCm4gPSAwCmZvciBsIGluIGY6bGluZXMoKSBkbyBpby53cml0ZShsLCAiXG4iKTsgbiA9IG4gKyAxIGVuZAphc3NlcnQodG9zdHJpbmcoZik6c3ViKDEsIDUpID09ICJmaWxlICIpCmFzc2VydChmOmNsb3NlKCkpOyBpby5jbG9zZSgpCmFzc2VydChuID09IDYpCmNoZWNrZXJyKCJjbG9zZWQgZmlsZSIsIGlvLmNsb3NlLCBmKQphc3NlcnQodG9zdHJpbmcoZikgPT0gImZpbGUgKGNsb3NlZCkiKQphc3NlcnQoaW8udHlwZShmKSA9PSAiY2xvc2VkIGZpbGUiKQppby5pbnB1dChmaWxlKQpmID0gaW8ub3BlbihvdGhlcmZpbGUpOmxpbmVzKCkKbiA9IDAKZm9yIGwgaW4gaW8ubGluZXMoKSBkbyBhc3NlcnQobCA9PSBmKCkpOyBuID0gbiArIDEgZW5kCmYgPSBuaWw7IGNvbGxlY3RnYXJiYWdlKCkKYXNzZXJ0KG4gPT0gNikKYXNzZXJ0KG9zLnJlbW92ZShvdGhlcmZpbGUpKQoKZG8gIC0tIGJ1ZyBpbiA1LjMuMQogIGlvLm91dHB1dChvdGhlcmZpbGUpCiAgaW8ud3JpdGUoc3RyaW5nLnJlcCgiYSIsIDMwMCksICJcbiIpCiAgaW8uY2xvc2UoKQogIGxvY2FsIHQgPXt9OyBmb3IgaSA9IDEsIDI1MCBkbyB0W2ldID0gMSBlbmQKICB0ID0ge2lvLmxpbmVzKG90aGVyZmlsZSwgdGFibGUudW5wYWNrKHQpKSgpfQogIC0tIGV2ZXJ5dGhpbmcgb2sgaGVyZQogIGFzc2VydCgjdCA9PSAyNTAgYW5kIHRbMV0gPT0gJ2EnIGFuZCB0WyN0XSA9PSAnYScpCiAgdFsjdCArIDFdID0gMSAgICAtLSBvbmUgdG9vIG1hbnkKICBjaGVja2VycigidG9vIG1hbnkgYXJndW1lbnRzIiwgaW8ubGluZXMsIG90aGVyZmlsZSwgdGFibGUudW5wYWNrKHQpKQogIGNvbGxlY3RnYXJiYWdlKCkgICAtLSBlbnN1cmUgJ290aGVyZmlsZScgaXMgY2xvc2VkCiAgYXNzZXJ0KG9zLnJlbW92ZShvdGhlcmZpbGUpKQplbmQKCmlvLmlucHV0KGZpbGUpCmRvICAtLSB0ZXN0IGVycm9yIHJldHVybnMKICBsb2NhbCBhLGIsYyA9IGlvLmlucHV0KCk6d3JpdGUoInh1eHUiKQogIGFzc2VydChub3QgYSBhbmQgdHlwZShiKSA9PSAic3RyaW5nIiBhbmQgdHlwZShjKSA9PSAibnVtYmVyIikKZW5kCmNoZWNrZXJyKCJpbnZhbGlkIGZvcm1hdCIsIGlvLnJlYWQsICJ4IikKYXNzZXJ0KGlvLnJlYWQoMCkgPT0gIiIpICAgLS0gbm90IGVvZgphc3NlcnQoaW8ucmVhZCg1LCAnbCcpID09ICci4WxvIicpCmFzc2VydChpby5yZWFkKDApID09ICIiKQphc3NlcnQoaW8ucmVhZCgpID09ICJzZWNvbmQgbGluZSIpCmxvY2FsIHggPSBpby5pbnB1dCgpOnNlZWsoKQphc3NlcnQoaW8ucmVhZCgpID09ICJ0aGlyZCBsaW5lICIpCmFzc2VydChpby5pbnB1dCgpOnNlZWsoInNldCIsIHgpKQphc3NlcnQoaW8ucmVhZCgnTCcpID09ICJ0aGlyZCBsaW5lIFxuIikKYXNzZXJ0KGlvLnJlYWQoMSkgPT0gIuciKQphc3NlcnQoaW8ucmVhZChzdHJpbmcubGVuImZvdXJ0aF9saW5lIikgPT0gImZvdXJ0aF9saW5lIikKYXNzZXJ0KGlvLmlucHV0KCk6c2VlaygiY3VyIiwgLXN0cmluZy5sZW4iZm91cnRoX2xpbmUiKSkKYXNzZXJ0KGlvLnJlYWQoKSA9PSAiZm91cnRoX2xpbmUiKQphc3NlcnQoaW8ucmVhZCgpID09ICIiKSAgLS0gZW1wdHkgbGluZQphc3NlcnQoaW8ucmVhZCgnbicpID09IDM0NTApCmFzc2VydChpby5yZWFkKDEpID09ICdcbicpCmFzc2VydChpby5yZWFkKDApID09IG5pbCkgIC0tIGVuZCBvZiBmaWxlCmFzc2VydChpby5yZWFkKDEpID09IG5pbCkgIC0tIGVuZCBvZiBmaWxlCmFzc2VydChpby5yZWFkKDMwMDAwKSA9PSBuaWwpICAtLSBlbmQgb2YgZmlsZQphc3NlcnQoKHtpby5yZWFkKDEpfSlbMl0gPT0gdW5kZWYpCmFzc2VydChpby5yZWFkKCkgPT0gbmlsKSAgLS0gZW5kIG9mIGZpbGUKYXNzZXJ0KCh7aW8ucmVhZCgpfSlbMl0gPT0gdW5kZWYpCmFzc2VydChpby5yZWFkKCduJykgPT0gbmlsKSAgLS0gZW5kIG9mIGZpbGUKYXNzZXJ0KCh7aW8ucmVhZCgnbicpfSlbMl0gPT0gdW5kZWYpCmFzc2VydChpby5yZWFkKCdhJykgPT0gJycpICAtLSBlbmQgb2YgZmlsZSAoT0sgZm9yICdhJykKYXNzZXJ0KGlvLnJlYWQoJ2EnKSA9PSAnJykgIC0tIGVuZCBvZiBmaWxlIChPSyBmb3IgJ2EnKQpjb2xsZWN0Z2FyYmFnZSgpCnByaW50KCcrJykKaW8uY2xvc2UoaW8uaW5wdXQoKSkKY2hlY2tlcnIoIiBpbnB1dCBmaWxlIGlzIGNsb3NlZCIsIGlvLnJlYWQpCgphc3NlcnQob3MucmVtb3ZlKGZpbGUpKQoKbG9jYWwgdCA9ICcwMTIzNDU2Nzg5Jwpmb3IgaT0xLDEwIGRvIHQgPSB0Li50OyBlbmQKYXNzZXJ0KHN0cmluZy5sZW4odCkgPT0gMTAqMl4xMCkKCmlvLm91dHB1dChmaWxlKQppby53cml0ZSgiYWxvIik6d3JpdGUoIlxuIikKaW8uY2xvc2UoKQpjaGVja2VycigiIG91dHB1dCBmaWxlIGlzIGNsb3NlZCIsIGlvLndyaXRlKQpsb2NhbCBmID0gaW8ub3BlbihmaWxlLCAiYStiIikKaW8ub3V0cHV0KGYpCmNvbGxlY3RnYXJiYWdlKCkKCmFzc2VydChpby53cml0ZSgnICcgLi4gdCAuLiAnICcpKQphc3NlcnQoaW8ud3JpdGUoJzsnLCAnZW5kIG9mIGZpbGVcbicpKQpmOmZsdXNoKCk7IGlvLmZsdXNoKCkKZjpjbG9zZSgpCnByaW50KCcrJykKCmlvLmlucHV0KGZpbGUpCmFzc2VydChpby5yZWFkKCkgPT0gImFsbyIpCmFzc2VydChpby5yZWFkKDEpID09ICcgJykKYXNzZXJ0KGlvLnJlYWQoc3RyaW5nLmxlbih0KSkgPT0gdCkKYXNzZXJ0KGlvLnJlYWQoMSkgPT0gJyAnKQphc3NlcnQoaW8ucmVhZCgwKSkKYXNzZXJ0KGlvLnJlYWQoJ2EnKSA9PSAnO2VuZCBvZiBmaWxlXG4nKQphc3NlcnQoaW8ucmVhZCgwKSA9PSBuaWwpCmFzc2VydChpby5jbG9zZShpby5pbnB1dCgpKSkKCgotLSB0ZXN0IGVycm9ycyBpbiByZWFkL3dyaXRlCmRvCiAgbG9jYWwgZnVuY3Rpb24gaXNtc2cgKG0pCiAgICAtLSBlcnJvciBtZXNzYWdlIGlzIG5vdCBhIGNvZGUgbnVtYmVyCiAgICByZXR1cm4gKHR5cGUobSkgPT0gInN0cmluZyIgYW5kIHRvbnVtYmVyKG0pID09IG5pbCkKICBlbmQKCiAgLS0gcmVhZAogIGxvY2FsIGYgPSBpby5vcGVuKGZpbGUsICJ3IikKICBsb2NhbCByLCBtLCBjID0gZjpyZWFkKCkKICBhc3NlcnQobm90IHIgYW5kIGlzbXNnKG0pIGFuZCB0eXBlKGMpID09ICJudW1iZXIiKQogIGFzc2VydChmOmNsb3NlKCkpCiAgLS0gd3JpdGUKICBmID0gaW8ub3BlbihmaWxlLCAiciIpCiAgciwgbSwgYyA9IGY6d3JpdGUoIndoYXRldmVyIikKICBhc3NlcnQobm90IHIgYW5kIGlzbXNnKG0pIGFuZCB0eXBlKGMpID09ICJudW1iZXIiKQogIGFzc2VydChmOmNsb3NlKCkpCiAgLS0gbGluZXMKICBmID0gaW8ub3BlbihmaWxlLCAidyIpCiAgciwgbSA9IHBjYWxsKGY6bGluZXMoKSkKICBhc3NlcnQociA9PSBmYWxzZSBhbmQgaXNtc2cobSkpCiAgYXNzZXJ0KGY6Y2xvc2UoKSkKZW5kCgphc3NlcnQob3MucmVtb3ZlKGZpbGUpKQoKLS0gdGVzdCBmb3IgTCBmb3JtYXQKaW8ub3V0cHV0KGZpbGUpOyBpby53cml0ZSJcblxubGluZVxub3RoZXIiOmNsb3NlKCkKaW8uaW5wdXQoZmlsZSkKYXNzZXJ0KGlvLnJlYWQiTCIgPT0gIlxuIikKYXNzZXJ0KGlvLnJlYWQiTCIgPT0gIlxuIikKYXNzZXJ0KGlvLnJlYWQiTCIgPT0gImxpbmVcbiIpCmFzc2VydChpby5yZWFkIkwiID09ICJvdGhlciIpCmFzc2VydChpby5yZWFkIkwiID09IG5pbCkKaW8uaW5wdXQoKTpjbG9zZSgpCgpsb2NhbCBmID0gYXNzZXJ0KGlvLm9wZW4oZmlsZSkpCmxvY2FsIHMgPSAiIgpmb3IgbCBpbiBmOmxpbmVzKCJMIikgZG8gcyA9IHMgLi4gbCBlbmQKYXNzZXJ0KHMgPT0gIlxuXG5saW5lXG5vdGhlciIpCmY6Y2xvc2UoKQoKaW8uaW5wdXQoZmlsZSkKcyA9ICIiCmZvciBsIGluIGlvLmxpbmVzKG5pbCwgIkwiKSBkbyBzID0gcyAuLiBsIGVuZAphc3NlcnQocyA9PSAiXG5cbmxpbmVcbm90aGVyIikKaW8uaW5wdXQoKTpjbG9zZSgpCgpzID0gIiIKZm9yIGwgaW4gaW8ubGluZXMoZmlsZSwgIkwiKSBkbyBzID0gcyAuLiBsIGVuZAphc3NlcnQocyA9PSAiXG5cbmxpbmVcbm90aGVyIikKCnMgPSAiIgpmb3IgbCBpbiBpby5saW5lcyhmaWxlLCAibCIpIGRvIHMgPSBzIC4uIGwgZW5kCmFzc2VydChzID09ICJsaW5lb3RoZXIiKQoKaW8ub3V0cHV0KGZpbGUpOyBpby53cml0ZSJhID0gMTAgKyAzNFxuYSA9IDIqYVxuYSA9IC1hXG4iOmNsb3NlKCkKbG9jYWwgdCA9IHt9CmFzc2VydChsb2FkKGlvLmxpbmVzKGZpbGUsICJMIiksIG5pbCwgbmlsLCB0KSkoKQphc3NlcnQodC5hID09IC0oKDEwICsgMzQpICogMikpCgoKZG8gICAtLSB0ZXN0aW5nIGNsb3NpbmcgZmlsZSBpbiBsaW5lIGl0ZXJhdGlvbgoKICAtLSBnZXQgdGhlIHRvLWJlLWNsb3NlZCB2YXJpYWJsZSBmcm9tIGEgbG9vcAogIGxvY2FsIGZ1bmN0aW9uIGdldHRvY2xvc2UgKGx2KQogICAgbHYgPSBsdiArIDEKICAgIGZvciBpID0gMSwgbWF0aC5tYXhpbnRlZ2VyIGRvCiAgICAgIGxvY2FsIG4sIHYgPSBkZWJ1Zy5nZXRsb2NhbChsdiwgaSkKICAgICAgaWYgbiA9PSAiKGZvciB0b2Nsb3NlKSIgdGhlbgogICAgICAgIHJldHVybiB2CiAgICAgIGVuZAogICAgZW5kCiAgZW5kCgogIGxvY2FsIGYKICBmb3IgbCBpbiBpby5saW5lcyhmaWxlKSBkbwogICAgZiA9IGdldHRvY2xvc2UoMSkKICAgIGFzc2VydChpby50eXBlKGYpID09ICJmaWxlIikKICAgIGJyZWFrCiAgZW5kCiAgYXNzZXJ0KGlvLnR5cGUoZikgPT0gImNsb3NlZCBmaWxlIikKCiAgZiA9IG5pbAogIGxvY2FsIGZ1bmN0aW9uIGZvbyAobmFtZSkKICAgIGZvciBsIGluIGlvLmxpbmVzKG5hbWUpIGRvCiAgICAgIGYgPSBnZXR0b2Nsb3NlKDEpCiAgICAgIGFzc2VydChpby50eXBlKGYpID09ICJmaWxlIikKICAgICAgZXJyb3IoZikgICAtLSBleGl0IGxvb3Agd2l0aCBhbiBlcnJvcgogICAgZW5kCiAgZW5kCiAgbG9jYWwgc3QsIG1zZyA9IHBjYWxsKGZvbywgZmlsZSkKICBhc3NlcnQoc3QgPT0gZmFsc2UgYW5kIGlvLnR5cGUobXNnKSA9PSAiY2xvc2VkIGZpbGUiKQoKZW5kCgoKLS0gdGVzdCBmb3IgbXVsdGlwZSBhcmd1bWVudHMgaW4gJ2xpbmVzJwppby5vdXRwdXQoZmlsZSk7IGlvLndyaXRlIjAxMjM0NTY3ODlcbiI6Y2xvc2UoKQpmb3IgYSxiIGluIGlvLmxpbmVzKGZpbGUsIDEsIDEpIGRvCiAgaWYgYSA9PSAiXG4iIHRoZW4gYXNzZXJ0KGIgPT0gbmlsKQogIGVsc2UgYXNzZXJ0KHRvbnVtYmVyKGEpID09IHRvbnVtYmVyKGIpIC0gMSkKICBlbmQKZW5kCgpmb3IgYSxiLGMgaW4gaW8ubGluZXMoZmlsZSwgMSwgMiwgImEiKSBkbwogIGFzc2VydChhID09ICIwIiBhbmQgYiA9PSAiMTIiIGFuZCBjID09ICIzNDU2Nzg5XG4iKQplbmQKCmZvciBhLGIsYyBpbiBpby5saW5lcyhmaWxlLCAiYSIsIDAsIDEpIGRvCiAgaWYgYSA9PSAiIiB0aGVuIGJyZWFrIGVuZAogIGFzc2VydChhID09ICIwMTIzNDU2Nzg5XG4iIGFuZCBiID09IG5pbCBhbmQgYyA9PSBuaWwpCmVuZApjb2xsZWN0Z2FyYmFnZSgpICAgLS0gdG8gY2xvc2UgZmlsZSBpbiBwcmV2aW91cyBpdGVyYXRpb24KCmlvLm91dHB1dChmaWxlKTsgaW8ud3JpdGUiMDBcbjEwXG4yMFxuMzBcbjQwXG4iOmNsb3NlKCkKZm9yIGEsIGIgaW4gaW8ubGluZXMoZmlsZSwgIm4iLCAibiIpIGRvCiAgaWYgYSA9PSA0MCB0aGVuIGFzc2VydChiID09IG5pbCkKICBlbHNlIGFzc2VydChhID09IGIgLSAxMCkKICBlbmQKZW5kCgoKLS0gdGVzdCBsb2FkIHggbGluZXMKaW8ub3V0cHV0KGZpbGUpOwppby53cml0ZVtbCmxvY2FsIHkKPSBYClggPQpYICoKMiArClg7ClggPQpYCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk7Cl1dOmNsb3NlKCkKX0cuWCA9IDEKYXNzZXJ0KG5vdCBsb2FkKChpby5saW5lcyhmaWxlKSkpKQpjb2xsZWN0Z2FyYmFnZSgpICAgLS0gdG8gY2xvc2UgZmlsZSBpbiBwcmV2aW91cyBpdGVyYXRpb24KbG9hZCgoaW8ubGluZXMoZmlsZSwgIkwiKSkpKCkKYXNzZXJ0KF9HLlggPT0gMikKbG9hZCgoaW8ubGluZXMoZmlsZSwgMSkpKSgpCmFzc2VydChfRy5YID09IDQpCmxvYWQoKGlvLmxpbmVzKGZpbGUsIDMpKSkoKQphc3NlcnQoX0cuWCA9PSA4KQoKcHJpbnQoJysnKQoKbG9jYWwgeDEgPSAic3RyaW5nXG5cblxcY29tIFwiXCInJ2NvaXNhcyBbW2VzdHJhbmhhc11dIF1dJyIKaW8ub3V0cHV0KGZpbGUpCmFzc2VydChpby53cml0ZShzdHJpbmcuZm9ybWF0KCJ4MiA9ICVxXG4tLSBjb21tZW50IHdpdGhvdXQgZW5kaW5nIEVPUyIsIHgxKSkpCmlvLmNsb3NlKCkKYXNzZXJ0KGxvYWRmaWxlKGZpbGUpKSgpCmFzc2VydCh4MSA9PSB4MikKcHJpbnQoJysnKQphc3NlcnQob3MucmVtb3ZlKGZpbGUpKQphc3NlcnQobm90IG9zLnJlbW92ZShmaWxlKSkKYXNzZXJ0KG5vdCBvcy5yZW1vdmUob3RoZXJmaWxlKSkKCi0tIHRlc3RpbmcgbG9hZGZpbGUKbG9jYWwgZnVuY3Rpb24gdGVzdGxvYWRmaWxlIChzLCBleHByZXMpCiAgaW8ub3V0cHV0KGZpbGUpCiAgaWYgcyB0aGVuIGlvLndyaXRlKHMpIGVuZAogIGlvLmNsb3NlKCkKICBsb2NhbCByZXMgPSBhc3NlcnQobG9hZGZpbGUoZmlsZSkpKCkKICBhc3NlcnQob3MucmVtb3ZlKGZpbGUpKQogIGFzc2VydChyZXMgPT0gZXhwcmVzKQplbmQKCi0tIGxvYWRpbmcgZW1wdHkgZmlsZQp0ZXN0bG9hZGZpbGUobmlsLCBuaWwpCgotLSBsb2FkaW5nIGZpbGUgd2l0aCBpbml0aWFsIGNvbW1lbnQgd2l0aG91dCBlbmQgb2YgbGluZQp0ZXN0bG9hZGZpbGUoIiMgYSBub24tZW5kaW5nIGNvbW1lbnQiLCBuaWwpCgoKLS0gY2hlY2tpbmcgVW5pY29kZSBCT00gaW4gZmlsZXMKdGVzdGxvYWRmaWxlKCJceEVGXHhCQlx4QkYjIHNvbWUgY29tbWVudFxucmV0dXJuIDIzNCIsIDIzNCkKdGVzdGxvYWRmaWxlKCJceEVGXHhCQlx4QkZyZXR1cm4gMjM5IiwgMjM5KQp0ZXN0bG9hZGZpbGUoIlx4RUZceEJCXHhCRiIsIG5pbCkgICAtLSBlbXB0eSBmaWxlIHdpdGggYSBCT00KCgotLSBjaGVja2luZyBsaW5lIG51bWJlcnMgaW4gZmlsZXMgd2l0aCBpbml0aWFsIGNvbW1lbnRzCnRlc3Rsb2FkZmlsZSgiIyBhIGNvbW1lbnRcbnJldHVybiByZXF1aXJlJ2RlYnVnJy5nZXRpbmZvKDEpLmN1cnJlbnRsaW5lIiwgMikKCgotLSBsb2FkaW5nIGJpbmFyeSBmaWxlCmlvLm91dHB1dChpby5vcGVuKGZpbGUsICJ3YiIpKQphc3NlcnQoaW8ud3JpdGUoc3RyaW5nLmR1bXAoZnVuY3Rpb24gKCkgcmV0dXJuIDEwLCAnXDBhbG9cMjU1JywgJ2hpJyBlbmQpKSkKaW8uY2xvc2UoKQphLCBiLCBjID0gYXNzZXJ0KGxvYWRmaWxlKGZpbGUpKSgpCmFzc2VydChhID09IDEwIGFuZCBiID09ICJcMGFsb1wyNTUiIGFuZCBjID09ICJoaSIpCmFzc2VydChvcy5yZW1vdmUoZmlsZSkpCgotLSBidWcgaW4gNS4yLjEKZG8KICBpby5vdXRwdXQoaW8ub3BlbihmaWxlLCAid2IiKSkKICAtLSBzYXZlIGZ1bmN0aW9uIHdpdGggbm8gdXB2YWx1ZXMKICBhc3NlcnQoaW8ud3JpdGUoc3RyaW5nLmR1bXAoZnVuY3Rpb24gKCkgcmV0dXJuIDEgZW5kKSkpCiAgaW8uY2xvc2UoKQogIGYgPSBhc3NlcnQobG9hZGZpbGUoZmlsZSwgImIiLCB7fSkpCiAgYXNzZXJ0KHR5cGUoZikgPT0gImZ1bmN0aW9uIiBhbmQgZigpID09IDEpCiAgYXNzZXJ0KG9zLnJlbW92ZShmaWxlKSkKZW5kCgotLSBsb2FkaW5nIGJpbmFyeSBmaWxlIHdpdGggaW5pdGlhbCBjb21tZW50CmlvLm91dHB1dChpby5vcGVuKGZpbGUsICJ3YiIpKQphc3NlcnQoaW8ud3JpdGUoIiN0aGlzIGlzIGEgY29tbWVudCBmb3IgYSBiaW5hcnkgZmlsZVwwXG4iLAogICAgICAgICAgICAgICAgc3RyaW5nLmR1bXAoZnVuY3Rpb24gKCkgcmV0dXJuIDIwLCAnXDBcMFwwJyBlbmQpKSkKaW8uY2xvc2UoKQphLCBiLCBjID0gYXNzZXJ0KGxvYWRmaWxlKGZpbGUpKSgpCmFzc2VydChhID09IDIwIGFuZCBiID09ICJcMFwwXDAiIGFuZCBjID09IG5pbCkKYXNzZXJ0KG9zLnJlbW92ZShmaWxlKSkKCgotLSAnbG9hZGZpbGUnIHdpdGggJ2VudicKZG8KICBsb2NhbCBmID0gaW8ub3BlbihmaWxlLCAndycpCiAgZjp3cml0ZVtbCiAgICBpZiAoLi4uKSB0aGVuIGEgPSAxNTsgcmV0dXJuIGIsIGMsIGQKICAgIGVsc2UgcmV0dXJuIF9FTlYKICAgIGVuZAogIF1dCiAgZjpjbG9zZSgpCiAgbG9jYWwgdCA9IHtiID0gMTIsIGMgPSAieHV4dSIsIGQgPSBwcmludH0KICBsb2NhbCBmID0gYXNzZXJ0KGxvYWRmaWxlKGZpbGUsICd0JywgdCkpCiAgbG9jYWwgYiwgYywgZCA9IGYoMSkKICBhc3NlcnQodC5hID09IDE1IGFuZCBiID09IDEyIGFuZCBjID09IHQuYyBhbmQgZCA9PSBwcmludCkKICBhc3NlcnQoZigpID09IHQpCiAgZiA9IGFzc2VydChsb2FkZmlsZShmaWxlLCAndCcsIG5pbCkpCiAgYXNzZXJ0KGYoKSA9PSBuaWwpCiAgZiA9IGFzc2VydChsb2FkZmlsZShmaWxlKSkKICBhc3NlcnQoZigpID09IF9HKQogIGFzc2VydChvcy5yZW1vdmUoZmlsZSkpCmVuZAoKCi0tICdsb2FkZmlsZScgeCBtb2RlcwpkbwogIGlvLm9wZW4oZmlsZSwgJ3cnKTp3cml0ZSgicmV0dXJuIDEwIik6Y2xvc2UoKQogIGxvY2FsIHMsIG0gPSBsb2FkZmlsZShmaWxlLCAnYicpCiAgYXNzZXJ0KG5vdCBzIGFuZCBzdHJpbmcuZmluZChtLCAiYSB0ZXh0IGNodW5rIikpCiAgaW8ub3BlbihmaWxlLCAndycpOndyaXRlKCJcMjcgcmV0dXJuIDEwIik6Y2xvc2UoKQogIGxvY2FsIHMsIG0gPSBsb2FkZmlsZShmaWxlLCAndCcpCiAgYXNzZXJ0KG5vdCBzIGFuZCBzdHJpbmcuZmluZChtLCAiYSBiaW5hcnkgY2h1bmsiKSkKICBhc3NlcnQob3MucmVtb3ZlKGZpbGUpKQplbmQKCgppby5vdXRwdXQoZmlsZSkKYXNzZXJ0KGlvLndyaXRlKCJxdWFscXVlciBjb2lzYVxuIikpCmFzc2VydChpby53cml0ZSgibWFpcyBxdWFscXVlciBjb2lzYSIpKQppby5jbG9zZSgpCmFzc2VydChpby5vdXRwdXQoYXNzZXJ0KGlvLm9wZW4ob3RoZXJmaWxlLCAnd2InKSkpCiAgICAgICA6d3JpdGUoIm91dHJhIGNvaXNhXDBcMVwzXDBcMFwwXDBcMjU1XDAiKQogICAgICAgOmNsb3NlKCkpCgpsb2NhbCBmaWxlaGFuZGxlID0gYXNzZXJ0KGlvLm9wZW4oZmlsZSwgJ3IrJykpCmxvY2FsIG90aGVyZmlsZWhhbmRsZSA9IGFzc2VydChpby5vcGVuKG90aGVyZmlsZSwgJ3JiJykpCmFzc2VydChmaWxlaGFuZGxlIH49IG90aGVyZmlsZWhhbmRsZSkKYXNzZXJ0KHR5cGUoZmlsZWhhbmRsZSkgPT0gInVzZXJkYXRhIikKYXNzZXJ0KGZpbGVoYW5kbGU6cmVhZCgnbCcpID09ICJxdWFscXVlciBjb2lzYSIpCmlvLmlucHV0KG90aGVyZmlsZWhhbmRsZSkKYXNzZXJ0KGlvLnJlYWQoc3RyaW5nLmxlbiJvdXRyYSBjb2lzYSIpID09ICJvdXRyYSBjb2lzYSIpCmFzc2VydChmaWxlaGFuZGxlOnJlYWQoJ2wnKSA9PSAibWFpcyBxdWFscXVlciBjb2lzYSIpCmZpbGVoYW5kbGU6Y2xvc2UoKTsKYXNzZXJ0KHR5cGUoZmlsZWhhbmRsZSkgPT0gInVzZXJkYXRhIikKaW8uaW5wdXQob3RoZXJmaWxlaGFuZGxlKQphc3NlcnQoaW8ucmVhZCg0KSA9PSAiXDBcMVwzXDAiKQphc3NlcnQoaW8ucmVhZCgzKSA9PSAiXDBcMFwwIikKYXNzZXJ0KGlvLnJlYWQoMCkgPT0gIiIpICAgICAgICAtLSAyNTUgaXMgbm90IGVvZgphc3NlcnQoaW8ucmVhZCgxKSA9PSAiXDI1NSIpCmFzc2VydChpby5yZWFkKCdhJykgPT0gIlwwIikKYXNzZXJ0KG5vdCBpby5yZWFkKDApKQphc3NlcnQob3RoZXJmaWxlaGFuZGxlID09IGlvLmlucHV0KCkpCm90aGVyZmlsZWhhbmRsZTpjbG9zZSgpCmFzc2VydChvcy5yZW1vdmUoZmlsZSkpCmFzc2VydChvcy5yZW1vdmUob3RoZXJmaWxlKSkKY29sbGVjdGdhcmJhZ2UoKQoKaW8ub3V0cHV0KGZpbGUpCiAgOndyaXRlW1sKIDEyMy40CS01NmUtMiAgbm90IGEgbnVtYmVyCnNlY29uZCBsaW5lCnRoaXJkIGxpbmUKCmFuZCB0aGUgcmVzdCBvZiB0aGUgZmlsZQpdXQogIDpjbG9zZSgpCmlvLmlucHV0KGZpbGUpCmxvY2FsIF8sYSxiLGMsZCxlLGgsX18gPSBpby5yZWFkKDEsICduJywgJ24nLCAnbCcsICdsJywgJ2wnLCAnYScsIDEwKQphc3NlcnQoaW8uY2xvc2UoaW8uaW5wdXQoKSkpCmFzc2VydChfID09ICcgJyBhbmQgX18gPT0gbmlsKQphc3NlcnQodHlwZShhKSA9PSAnbnVtYmVyJyBhbmQgYT09MTIzLjQgYW5kIGI9PS01NmUtMikKYXNzZXJ0KGQ9PSdzZWNvbmQgbGluZScgYW5kIGU9PSd0aGlyZCBsaW5lJykKYXNzZXJ0KGg9PVtbCgphbmQgdGhlIHJlc3Qgb2YgdGhlIGZpbGUKXV0pCmFzc2VydChvcy5yZW1vdmUoZmlsZSkpCmNvbGxlY3RnYXJiYWdlKCkKCi0tIHRlc3RpbmcgYnVmZmVycwpkbwogIGxvY2FsIGYgPSBhc3NlcnQoaW8ub3BlbihmaWxlLCAidyIpKQogIGxvY2FsIGZyID0gYXNzZXJ0KGlvLm9wZW4oZmlsZSwgInIiKSkKICBhc3NlcnQoZjpzZXR2YnVmKCJmdWxsIiwgMjAwMCkpCiAgZjp3cml0ZSgieCIpCiAgYXNzZXJ0KGZyOnJlYWQoImFsbCIpID09ICIiKSAgLS0gZnVsbCBidWZmZXI7IG91dHB1dCBub3Qgd3JpdHRlbiB5ZXQKICBmOmNsb3NlKCkKICBmcjpzZWVrKCJzZXQiKQogIGFzc2VydChmcjpyZWFkKCJhbGwiKSA9PSAieCIpICAgLS0gYGNsb3NlJyBmbHVzaGVzIGl0CiAgZiA9IGFzc2VydChpby5vcGVuKGZpbGUpLCAidyIpCiAgYXNzZXJ0KGY6c2V0dmJ1Zigibm8iKSkKICBmOndyaXRlKCJ4IikKICBmcjpzZWVrKCJzZXQiKQogIGFzc2VydChmcjpyZWFkKCJhbGwiKSA9PSAieCIpICAtLSBubyBidWZmZXI7IG91dHB1dCBpcyByZWFkeQogIGY6Y2xvc2UoKQogIGYgPSBhc3NlcnQoaW8ub3BlbihmaWxlLCAiYSIpKQogIGFzc2VydChmOnNldHZidWYoImxpbmUiKSkKICBmOndyaXRlKCJ4IikKICBmcjpzZWVrKCJzZXQiLCAxKQogIGFzc2VydChmcjpyZWFkKCJhbGwiKSA9PSAiIikgICAtLSBsaW5lIGJ1ZmZlcjsgbm8gb3V0cHV0IHdpdGhvdXQgYFxuJwogIGY6d3JpdGUoImFcbiIpOnNlZWsoInNldCIsIDEpCiAgYXNzZXJ0KGZyOnJlYWQoImFsbCIpID09ICJ4YVxuIikgIC0tIG5vdyB3ZSBoYXZlIGEgd2hvbGUgbGluZQogIGY6Y2xvc2UoKTsgZnI6Y2xvc2UoKQogIGFzc2VydChvcy5yZW1vdmUoZmlsZSkpCmVuZAoKCmlmIG5vdCBfc29mdCB0aGVuCiAgcHJpbnQoInRlc3RpbmcgbGFyZ2UgZmlsZXMgKD4gQlVGU0laKSIpCiAgaW8ub3V0cHV0KGZpbGUpCiAgZm9yIGk9MSw1MDAxIGRvIGlvLndyaXRlKCcwMTIzNDU2Nzg5MTIzJykgZW5kCiAgaW8ud3JpdGUoJ1xuMTIzNDYnKTpjbG9zZSgpCiAgaW8uaW5wdXQoZmlsZSkKICBsb2NhbCB4ID0gaW8ucmVhZCgnYScpCiAgaW8uaW5wdXQoKTpzZWVrKCdzZXQnLCAwKQogIGxvY2FsIHkgPSBpby5yZWFkKDMwMDAxKS4uaW8ucmVhZCgxMDA1KS4uaW8ucmVhZCgwKS4uCiAgICAgICAgICAgIGlvLnJlYWQoMSkuLmlvLnJlYWQoMTAwMDAzKQogIGFzc2VydCh4ID09IHkgYW5kIHN0cmluZy5sZW4oeCkgPT0gNTAwMSoxMyArIDYpCiAgaW8uaW5wdXQoKTpzZWVrKCdzZXQnLCAwKQogIHkgPSBpby5yZWFkKCkgIC0tIGh1Z2UgbGluZQogIGFzc2VydCh4ID09IHkuLidcbicuLmlvLnJlYWQoKSkKICBhc3NlcnQoaW8ucmVhZCgpID09IG5pbCkKICBpby5jbG9zZShpby5pbnB1dCgpKQogIGFzc2VydChvcy5yZW1vdmUoZmlsZSkpCiAgeCA9IG5pbDsgeSA9IG5pbAplbmQKCmlmIG5vdCBfcG9ydCB0aGVuCiAgbG9jYWwgcHJvZ25hbWUKICBkbyAgLS0gZ2V0IG5hbWUgb2YgcnVubmluZyBleGVjdXRhYmxlCiAgICBsb2NhbCBhcmcgPSBhcmcgb3IgQVJHCiAgICBsb2NhbCBpID0gMAogICAgd2hpbGUgYXJnW2ldIGRvIGkgPSBpIC0gMSBlbmQKICAgIHByb2duYW1lID0gJyInIC4uIGFyZ1tpICsgMV0gLi4gJyInCiAgZW5kCiAgcHJpbnQoInRlc3RpbmcgcG9wZW4vcGNsb3NlIGFuZCBleGVjdXRlIikKICBsb2NhbCB0ZXN0cyA9IHsKICAgIC0tIGNvbW1hbmQsICAgd2hhdCwgIGNvZGUKICAgIHsibHMgPiAvZGV2L251bGwiLCAib2sifSwKICAgIHsibm90LXRvLWJlLWZvdW5kLWNvbW1hbmQiLCAiZXhpdCJ9LAogICAgeyJleGl0IDMiLCAiZXhpdCIsIDN9LAogICAgeyJleGl0IDEyOSIsICJleGl0IiwgMTI5fSwKICAgIHsia2lsbCAtcyBIVVAgJCQiLCAic2lnbmFsIiwgMX0sCiAgICB7ImtpbGwgLXMgS0lMTCAkJCIsICJzaWduYWwiLCA5fSwKICAgIHsic2ggLWMgJ2tpbGwgLXMgSFVQICQkJyIsICJleGl0In0sCiAgICB7cHJvZ25hbWUgLi4gJyAtZSAiICInLCAib2sifSwKICAgIHtwcm9nbmFtZSAuLiAnIC1lICJvcy5leGl0KDAsIHRydWUpIicsICJvayJ9LAogICAge3Byb2duYW1lIC4uICcgLWUgIm9zLmV4aXQoMjAsIHRydWUpIicsICJleGl0IiwgMjB9LAogIH0KICBwcmludCgiXG4oc29tZSBlcnJvciBtZXNzYWdlcyBhcmUgZXhwZWN0ZWQgbm93KSIpCiAgZm9yIF8sIHYgaW4gaXBhaXJzKHRlc3RzKSBkbwogICAgbG9jYWwgeCwgeSwgeiA9IGlvLnBvcGVuKHZbMV0pOmNsb3NlKCkKICAgIGxvY2FsIHgxLCB5MSwgejEgPSBvcy5leGVjdXRlKHZbMV0pCiAgICBhc3NlcnQoeCA9PSB4MSBhbmQgeSA9PSB5MSBhbmQgeiA9PSB6MSkKICAgIGlmIHZbMl0gPT0gIm9rIiB0aGVuCiAgICAgIGFzc2VydCh4IGFuZCB5ID09ICdleGl0JyBhbmQgeiA9PSAwKQogICAgZWxzZQogICAgICBhc3NlcnQobm90IHggYW5kIHkgPT0gdlsyXSkgICAtLSBjb3JyZWN0IHN0YXR1cyBhbmQgJ3doYXQnCiAgICAgIC0tIGNvcnJlY3QgY29kZSBpZiBrbm93biAoYnV0IGFsd2F5cyBkaWZmZXJlbnQgZnJvbSAwKQogICAgICBhc3NlcnQoKHZbM10gPT0gbmlsIGFuZCB6ID4gMCkgb3IgdlszXSA9PSB6KQogICAgZW5kCiAgZW5kCmVuZAoKCi0tIHRlc3RpbmcgdG1wZmlsZQpmID0gaW8udG1wZmlsZSgpCmFzc2VydChpby50eXBlKGYpID09ICJmaWxlIikKZjp3cml0ZSgiYWxvIikKZjpzZWVrKCJzZXQiKQphc3NlcnQoZjpyZWFkImEiID09ICJhbG8iKQoKZW5kIC0tfQoKcHJpbnQnKycKCnByaW50KCJ0ZXN0aW5nIGRhdGUvdGltZSIpCgphc3NlcnQob3MuZGF0ZSgiIikgPT0gIiIpCmFzc2VydChvcy5kYXRlKCIhIikgPT0gIiIpCmFzc2VydChvcy5kYXRlKCJcMFwwIikgPT0gIlwwXDAiKQphc3NlcnQob3MuZGF0ZSgiIVwwXDAiKSA9PSAiXDBcMCIpCmxvY2FsIHggPSBzdHJpbmcucmVwKCJhIiwgMTAwMDApCmFzc2VydChvcy5kYXRlKHgpID09IHgpCmxvY2FsIHQgPSBvcy50aW1lKCkKRCA9IG9zLmRhdGUoIip0IiwgdCkKYXNzZXJ0KG9zLmRhdGUoc3RyaW5nLnJlcCgiJWQiLCAxMDAwKSwgdCkgPT0KICAgICAgIHN0cmluZy5yZXAob3MuZGF0ZSgiJWQiLCB0KSwgMTAwMCkpCmFzc2VydChvcy5kYXRlKHN0cmluZy5yZXAoIiUiLCAyMDApKSA9PSBzdHJpbmcucmVwKCIlIiwgMTAwKSkKCmxvY2FsIHQgPSBvcy50aW1lKCkKRCA9IG9zLmRhdGUoIip0IiwgdCkKbG9hZChvcy5kYXRlKFtbYXNzZXJ0KEQueWVhcj09JVkgYW5kIEQubW9udGg9PSVtIGFuZCBELmRheT09JWQgYW5kCiAgRC5ob3VyPT0lSCBhbmQgRC5taW49PSVNIGFuZCBELnNlYz09JVMgYW5kCiAgRC53ZGF5PT0ldysxIGFuZCBELnlkYXk9PSVqKV1dLCB0KSkoKQoKY2hlY2tlcnIoImludmFsaWQgY29udmVyc2lvbiBzcGVjaWZpZXIiLCBvcy5kYXRlLCAiJSIpCmNoZWNrZXJyKCJpbnZhbGlkIGNvbnZlcnNpb24gc3BlY2lmaWVyIiwgb3MuZGF0ZSwgIiU5IikKY2hlY2tlcnIoImludmFsaWQgY29udmVyc2lvbiBzcGVjaWZpZXIiLCBvcy5kYXRlLCAiJSIpCmNoZWNrZXJyKCJpbnZhbGlkIGNvbnZlcnNpb24gc3BlY2lmaWVyIiwgb3MuZGF0ZSwgIiVPIikKY2hlY2tlcnIoImludmFsaWQgY29udmVyc2lvbiBzcGVjaWZpZXIiLCBvcy5kYXRlLCAiJUUiKQpjaGVja2VycigiaW52YWxpZCBjb252ZXJzaW9uIHNwZWNpZmllciIsIG9zLmRhdGUsICIlRWEiKQoKY2hlY2tlcnIoIm5vdCBhbiBpbnRlZ2VyIiwgb3MudGltZSwge3llYXI9MTAwMCwgbW9udGg9MSwgZGF5PTEsIGhvdXI9J3gnfSkKY2hlY2tlcnIoIm5vdCBhbiBpbnRlZ2VyIiwgb3MudGltZSwge3llYXI9MTAwMCwgbW9udGg9MSwgZGF5PTEsIGhvdXI9MS41fSkKCmNoZWNrZXJyKCJtaXNzaW5nIiwgb3MudGltZSwge2hvdXIgPSAxMn0pICAgLS0gbWlzc2luZyBkYXRlCgppZiBub3QgX3BvcnQgdGhlbgogIC0tIHRlc3QgUG9zaXgtc3BlY2lmaWMgbW9kaWZpZXJzCiAgYXNzZXJ0KHR5cGUob3MuZGF0ZSgiJUV4IikpID09ICdzdHJpbmcnKQogIGFzc2VydCh0eXBlKG9zLmRhdGUoIiVPeSIpKSA9PSAnc3RyaW5nJykKCgogIC0tIHRlc3Qgb3V0LW9mLXJhbmdlIGRhdGVzIChhdCBsZWFzdCBmb3IgVW5peCkKICBpZiBtYXhpbnQgPj0gMl42MiB0aGVuICAtLSBjYW5ub3QgZG8gdGhlc2UgdGVzdHMgaW4gU21hbGwgTHVhCiAgICAtLSBubyBhcml0aCBvdmVyZmxvd3MKICAgIGNoZWNrZXJyKCJvdXQtb2YtYm91bmQiLCBvcy50aW1lLCB7eWVhciA9IC1tYXhpbnQsIG1vbnRoID0gMSwgZGF5ID0gMX0pCiAgICBpZiBzdHJpbmcucGFja3NpemUoImkiKSA9PSA0IHRoZW4gICAtLSA0LWJ5dGUgaW50cwogICAgICBpZiB0ZXN0ZXJyKCJvdXQtb2YtYm91bmQiLCBvcy5kYXRlLCAiJVkiLCAyXjQwKSB0aGVuCiAgICAgICAgLS0gdGltZV90IGhhcyA0IGJ5dGVzIGFuZCB0aGVyZWZvcmUgY2Fubm90IHJlcHJlc2VudCB5ZWFyIDQwMDAKICAgICAgICBwcmludCgiICA0LWJ5dGUgdGltZV90IikKICAgICAgICBjaGVja2VycigiY2Fubm90IGJlIHJlcHJlc2VudGVkIiwgb3MudGltZSwge3llYXI9NDAwMCwgbW9udGg9MSwgZGF5PTF9KQogICAgICBlbHNlCiAgICAgICAgLS0gdGltZV90IGhhcyA4IGJ5dGVzOyBhbiBpbnQgeWVhciBjYW5ub3QgcmVwcmVzZW50IGEgaHVnZSB0aW1lCiAgICAgICAgcHJpbnQoIiAgOC1ieXRlIHRpbWVfdCIpCiAgICAgICAgY2hlY2tlcnIoImNhbm5vdCBiZSByZXByZXNlbnRlZCIsIG9zLmRhdGUsICIlWSIsIDJeNjApCiAgICAgICAgLS0gaXQgc2hvdWxkIGhhdmUgbm8gcHJvYmxlbXMgd2l0aCB5ZWFyIDQwMDAKICAgICAgICBhc3NlcnQodG9udW1iZXIob3MudGltZXt5ZWFyPTQwMDAsIG1vbnRoPTEsIGRheT0xfSkpCiAgICAgIGVuZAogICAgZWxzZSAgICAtLSA4LWJ5dGUgaW50cwogICAgICAtLSBhc3N1bWUgdGltZV90IGhhcyA4IGJ5dGVzIHRvbwogICAgICBwcmludCgiICA4LWJ5dGUgdGltZV90IikKICAgICAgYXNzZXJ0KHRvbnVtYmVyKG9zLmRhdGUoIiVZIiwgMl42MCkpKQogICAgICAtLSBidXQgc3RpbGwgY2Fubm90IHJlcHJlc2VudCBhIGh1Z2UgeWVhcgogICAgICBjaGVja2VycigiY2Fubm90IGJlIHJlcHJlc2VudGVkIiwgb3MudGltZSwge3llYXI9Ml42MCwgbW9udGg9MSwgZGF5PTF9KQogICAgZW5kCiAgZW5kCmVuZAoKCkQgPSBvcy5kYXRlKCIhKnQiLCB0KQpsb2FkKG9zLmRhdGUoW1shYXNzZXJ0KEQueWVhcj09JVkgYW5kIEQubW9udGg9PSVtIGFuZCBELmRheT09JWQgYW5kCiAgRC5ob3VyPT0lSCBhbmQgRC5taW49PSVNIGFuZCBELnNlYz09JVMgYW5kCiAgRC53ZGF5PT0ldysxIGFuZCBELnlkYXk9PSVqKV1dLCB0KSkoKQoKZG8KICBsb2NhbCBEID0gb3MuZGF0ZSgiKnQiKQogIGxvY2FsIHQgPSBvcy50aW1lKEQpCiAgaWYgRC5pc2RzdCA9PSBuaWwgdGhlbgogICAgcHJpbnQoIm5vIGRheWxpZ2h0IHNhdmluZyBpbmZvcm1hdGlvbiIpCiAgZWxzZQogICAgYXNzZXJ0KHR5cGUoRC5pc2RzdCkgPT0gJ2Jvb2xlYW4nKQogIGVuZAogIEQuaXNkc3QgPSBuaWwKICBsb2NhbCB0MSA9IG9zLnRpbWUoRCkKICBhc3NlcnQodCA9PSB0MSkgICAtLSBpZiBpc2RzdCBpcyBhYnNlbnQgdXNlcyBjb3JyZWN0IGRlZmF1bHQKZW5kCgp0ID0gb3MudGltZShEKQpELnllYXIgPSBELnllYXItMTsKbG9jYWwgdDEgPSBvcy50aW1lKEQpCi0tIGFsbG93IGZvciBsZWFwIHllYXJzCmFzc2VydChtYXRoLmFicyhvcy5kaWZmdGltZSh0LHQxKS8oMjQqMzYwMCkgLSAzNjUpIDwgMikKCi0tIHNob3VsZCBub3QgdGFrZSBtb3JlIHRoYW4gMSBzZWNvbmQgdG8gZXhlY3V0ZSB0aGVzZSB0d28gbGluZXMKdCA9IG9zLnRpbWUoKQp0MSA9IG9zLnRpbWUob3MuZGF0ZSgiKnQiKSkKbG9jYWwgZGlmZiA9IG9zLmRpZmZ0aW1lKHQxLHQpCmFzc2VydCgwIDw9IGRpZmYgYW5kIGRpZmYgPD0gMSkKZGlmZiA9IG9zLmRpZmZ0aW1lKHQsdDEpCmFzc2VydCgtMSA8PSBkaWZmIGFuZCBkaWZmIDw9IDApCgpsb2NhbCB0MSA9IG9zLnRpbWV7eWVhcj0yMDAwLCBtb250aD0xMCwgZGF5PTEsIGhvdXI9MjMsIG1pbj0xMn0KbG9jYWwgdDIgPSBvcy50aW1le3llYXI9MjAwMCwgbW9udGg9MTAsIGRheT0xLCBob3VyPTIzLCBtaW49MTAsIHNlYz0xOX0KYXNzZXJ0KG9zLmRpZmZ0aW1lKHQxLHQyKSA9PSA2MCoyLTE5KQoKLS0gc2luY2UgNS4zLjMsICdvcy50aW1lJyBub3JtYWxpemVzIHRhYmxlIGZpZWxkcwp0MSA9IHt5ZWFyID0gMjAwNSwgbW9udGggPSAxLCBkYXkgPSAxLCBob3VyID0gMSwgbWluID0gMCwgc2VjID0gLTM2MDJ9Cm9zLnRpbWUodDEpCmFzc2VydCh0MS5kYXkgPT0gMzEgYW5kIHQxLm1vbnRoID09IDEyIGFuZCB0MS55ZWFyID09IDIwMDQgYW5kCiAgICAgICB0MS5ob3VyID09IDIzIGFuZCB0MS5taW4gPT0gNTkgYW5kIHQxLnNlYyA9PSA1OCBhbmQKICAgICAgIHQxLnlkYXkgPT0gMzY2KQoKaW8ub3V0cHV0KGlvLnN0ZG91dCkKbG9jYWwgdCA9IG9zLmRhdGUoJyVkICVtICVZICVIICVNICVTJykKbG9jYWwgZCwgbSwgYSwgaCwgbWluLCBzID0gc3RyaW5nLm1hdGNoKHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiglZCspICglZCspICglZCspICglZCspICglZCspICglZCspIikKZCA9IHRvbnVtYmVyKGQpCm0gPSB0b251bWJlcihtKQphID0gdG9udW1iZXIoYSkKaCA9IHRvbnVtYmVyKGgpCm1pbiA9IHRvbnVtYmVyKG1pbikKcyA9IHRvbnVtYmVyKHMpCmlvLndyaXRlKHN0cmluZy5mb3JtYXQoJ3Rlc3QgZG9uZSBvbiAlMi4yZC8lMi4yZC8lZCcsIGQsIG0sIGEpKQppby53cml0ZShzdHJpbmcuZm9ybWF0KCcsIGF0ICUyLjJkOiUyLjJkOiUyLjJkXG4nLCBoLCBtaW4sIHMpKQppby53cml0ZShzdHJpbmcuZm9ybWF0KCclc1xuJywgX1ZFUlNJT04pKQoKCg==