LS0gJElkOiB0ZXN0ZXMvZmlsZXMubHVhICQKLS0gU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gZmlsZSBhbGwubHVhCgpsb2NhbCBkZWJ1ZyA9IHJlcXVpcmUgImRlYnVnIgoKbG9jYWwgbWF4aW50ID0gbWF0aC5tYXhpbnRlZ2VyCgphc3NlcnQodHlwZShvcy5nZXRlbnYiUEFUSCIpID09ICJzdHJpbmciKQoKYXNzZXJ0KGlvLmlucHV0KGlvLnN0ZGluKSA9PSBpby5zdGRpbikKYXNzZXJ0KG5vdCBwY2FsbChpby5pbnB1dCwgIm5vbi1leGlzdGVudC1maWxlIikpCmFzc2VydChpby5vdXRwdXQoaW8uc3Rkb3V0KSA9PSBpby5zdGRvdXQpCgoKbG9jYWwgZnVuY3Rpb24gdGVzdGVyciAobXNnLCBmLCAuLi4pCiAgbG9jYWwgc3RhdCwgZXJyID0gcGNhbGwoZiwgLi4uKQogIHJldHVybiAobm90IHN0YXQgYW5kIHN0cmluZy5maW5kKGVyciwgbXNnLCAxLCB0cnVlKSkKZW5kCgoKbG9jYWwgZnVuY3Rpb24gY2hlY2tlcnIgKG1zZywgZiwgLi4uKQogIGFzc2VydCh0ZXN0ZXJyKG1zZywgZiwgLi4uKSkKZW5kCgoKLS0gY2Fubm90IGNsb3NlIHN0YW5kYXJkIGZpbGVzCmFzc2VydChub3QgaW8uY2xvc2UoaW8uc3RkaW4pIGFuZAogICAgICAgbm90IGlvLnN0ZG91dDpjbG9zZSgpIGFuZAogICAgICAgbm90IGlvLnN0ZGVycjpjbG9zZSgpKQoKLS0gY2Fubm90IGNhbGwgY2xvc2UgbWV0aG9kIHdpdGhvdXQgYW4gYXJndW1lbnQgKG5ldyBpbiA1LjMuNSkKY2hlY2tlcnIoImdvdCBubyB2YWx1ZSIsIGlvLnN0ZGluLmNsb3NlKQoKCmFzc2VydCh0eXBlKGlvLmlucHV0KCkpID09ICJ1c2VyZGF0YSIgYW5kIGlvLnR5cGUoaW8ub3V0cHV0KCkpID09ICJmaWxlIikKYXNzZXJ0KHR5cGUoaW8uc3RkaW4pID09ICJ1c2VyZGF0YSIgYW5kIGlvLnR5cGUoaW8uc3RkZXJyKSA9PSAiZmlsZSIpCmFzc2VydChub3QgaW8udHlwZSg4KSkKbG9jYWwgYSA9IHt9OyBzZXRtZXRhdGFibGUoYSwge30pCmFzc2VydChub3QgaW8udHlwZShhKSkKCmFzc2VydChnZXRtZXRhdGFibGUoaW8uaW5wdXQoKSkuX19uYW1lID09ICJGSUxFKiIpCgpsb2NhbCBhLGIsYyA9IGlvLm9wZW4oJ3h1eHVfbmFvX2V4aXN0ZScpCmFzc2VydChub3QgYSBhbmQgdHlwZShiKSA9PSAic3RyaW5nIiBhbmQgdHlwZShjKSA9PSAibnVtYmVyIikKCmEsYixjID0gaW8ub3BlbignL2EvYi9jL2QnLCAndycpCmFzc2VydChub3QgYSBhbmQgdHlwZShiKSA9PSAic3RyaW5nIiBhbmQgdHlwZShjKSA9PSAibnVtYmVyIikKCmxvY2FsIGZpbGUgPSBvcy50bXBuYW1lKCkKbG9jYWwgZiwgbXNnID0gaW8ub3BlbihmaWxlLCAidyIpCmlmIG5vdCBmIHRoZW4KICAoTWVzc2FnZSBvciBwcmludCkoIidvcy50bXBuYW1lJyBmaWxlIGNhbm5vdCBiZSBvcGVuOyBza2lwcGluZyBmaWxlIHRlc3RzIikKCmVsc2UgIC0teyAgbW9zdCB0ZXN0cyBoZXJlIG5lZWQgdG1wbmFtZQpmOmNsb3NlKCkKCnByaW50KCd0ZXN0aW5nIGkvbycpCgpsb2NhbCBvdGhlcmZpbGUgPSBvcy50bXBuYW1lKCkKCmNoZWNrZXJyKCJpbnZhbGlkIG1vZGUiLCBpby5vcGVuLCBmaWxlLCAicnciKQpjaGVja2VycigiaW52YWxpZCBtb2RlIiwgaW8ub3BlbiwgZmlsZSwgInJiKyIpCmNoZWNrZXJyKCJpbnZhbGlkIG1vZGUiLCBpby5vcGVuLCBmaWxlLCAicitiayIpCmNoZWNrZXJyKCJpbnZhbGlkIG1vZGUiLCBpby5vcGVuLCBmaWxlLCAiIikKY2hlY2tlcnIoImludmFsaWQgbW9kZSIsIGlvLm9wZW4sIGZpbGUsICIrIikKY2hlY2tlcnIoImludmFsaWQgbW9kZSIsIGlvLm9wZW4sIGZpbGUsICJiIikKYXNzZXJ0KGlvLm9wZW4oZmlsZSwgInIrYiIpKTpjbG9zZSgpCmFzc2VydChpby5vcGVuKGZpbGUsICJyKyIpKTpjbG9zZSgpCmFzc2VydChpby5vcGVuKGZpbGUsICJyYiIpKTpjbG9zZSgpCgphc3NlcnQob3Muc2V0bG9jYWxlKCdDJywgJ2FsbCcpKQoKaW8uaW5wdXQoaW8uc3RkaW4pOyBpby5vdXRwdXQoaW8uc3Rkb3V0KTsKCm9zLnJlbW92ZShmaWxlKQphc3NlcnQobm90IGxvYWRmaWxlKGZpbGUpKQpjaGVja2VycigiIiwgZG9maWxlLCBmaWxlKQphc3NlcnQobm90IGlvLm9wZW4oZmlsZSkpCmlvLm91dHB1dChmaWxlKQphc3NlcnQoaW8ub3V0cHV0KCkgfj0gaW8uc3Rkb3V0KQoKaWYgbm90IF9wb3J0IHRoZW4gICAtLSBpbnZhbGlkIHNlZWsKICBsb2NhbCBzdGF0dXMsIG1zZywgY29kZSA9IGlvLnN0ZGluOnNlZWsoInNldCIsIDEwMDApCiAgYXNzZXJ0KG5vdCBzdGF0dXMgYW5kIHR5cGUobXNnKSA9PSAic3RyaW5nIiBhbmQgdHlwZShjb2RlKSA9PSAibnVtYmVyIikKZW5kCgphc3NlcnQoaW8ub3V0cHV0KCk6c2VlaygpID09IDApCmFzc2VydChpby53cml0ZSgiYWxvIGFsbyIpOnNlZWsoKSA9PSBzdHJpbmcubGVuKCJhbG8gYWxvIikpCmFzc2VydChpby5vdXRwdXQoKTpzZWVrKCJjdXIiLCAtMykgPT0gc3RyaW5nLmxlbigiYWxvIGFsbyIpLTMpCmFzc2VydChpby53cml0ZSgiam9hbyIpKQphc3NlcnQoaW8ub3V0cHV0KCk6c2VlaygiZW5kIikgPT0gc3RyaW5nLmxlbigiYWxvIGpvYW8iKSkKCmFzc2VydChpby5vdXRwdXQoKTpzZWVrKCJzZXQiKSA9PSAwKQoKYXNzZXJ0KGlvLndyaXRlKCci4WxvIicsICJ7YX1cbiIsICJzZWNvbmQgbGluZVxuIiwgInRoaXJkIGxpbmUgXG4iKSkKYXNzZXJ0KGlvLndyaXRlKCfnZm91cnRoX2xpbmUnKSkKaW8ub3V0cHV0KGlvLnN0ZG91dCkKY29sbGVjdGdhcmJhZ2UoKSAgLS0gZmlsZSBzaG91bGQgYmUgY2xvc2VkIGJ5IEdDCmFzc2VydChpby5pbnB1dCgpID09IGlvLnN0ZGluIGFuZCByYXdlcXVhbChpby5vdXRwdXQoKSwgaW8uc3Rkb3V0KSkKcHJpbnQoJysnKQoKLS0gdGVzdCBHQyBmb3IgZmlsZXMKY29sbGVjdGdhcmJhZ2UoKQpmb3IgaT0xLDEyMCBkbwogIGZvciBpPTEsNSBkbwogICAgaW8uaW5wdXQoZmlsZSkKICAgIGFzc2VydChpby5vcGVuKGZpbGUsICdyJykpCiAgICBpby5saW5lcyhmaWxlKQogIGVuZAogIGNvbGxlY3RnYXJiYWdlKCkKZW5kCgppby5pbnB1dCgpOmNsb3NlKCkKaW8uY2xvc2UoKQoKYXNzZXJ0KG9zLnJlbmFtZShmaWxlLCBvdGhlcmZpbGUpKQphc3NlcnQobm90IG9zLnJlbmFtZShmaWxlLCBvdGhlcmZpbGUpKQoKaW8ub3V0cHV0KGlvLm9wZW4ob3RoZXJmaWxlLCAiYWIiKSkKYXNzZXJ0KGlvLndyaXRlKCJcblxuXHRcdCAgIiwgMzQ1MCwgIlxuIikpOwppby5jbG9zZSgpCgotLSB0ZXN0IHdyaXRpbmcvcmVhZGluZyBudW1iZXJzCmYgPSBhc3NlcnQoaW8ub3BlbihmaWxlLCAidyIpKQpmOndyaXRlKG1heGludCwgJ1xuJykKZjp3cml0ZShzdHJpbmcuZm9ybWF0KCIwWCV4XG4iLCBtYXhpbnQpKQpmOndyaXRlKCIweEFCQ3AtMyIsICdcbicpCmY6d3JpdGUoMCwgJ1xuJykKZjp3cml0ZSgtbWF4aW50LCAnXG4nKQpmOndyaXRlKHN0cmluZy5mb3JtYXQoIjB4JVhcbiIsIC1tYXhpbnQpKQpmOndyaXRlKCItMHhBQkNwLTMiLCAnXG4nKQphc3NlcnQoZjpjbG9zZSgpKQpmID0gYXNzZXJ0KGlvLm9wZW4oZmlsZSwgInIiKSkKYXNzZXJ0KGY6cmVhZCgibiIpID09IG1heGludCkKYXNzZXJ0KGY6cmVhZCgibiIpID09IG1heGludCkKYXNzZXJ0KGY6cmVhZCgibiIpID09IDB4QUJDcC0zKQphc3NlcnQoZjpyZWFkKCJuIikgPT0gMCkKYXNzZXJ0KGY6cmVhZCgiKm4iKSA9PSAtbWF4aW50KSAgICAgICAgICAgIC0tIHRlc3Qgb2xkIGZvcm1hdCAod2l0aCAnKicpCmFzc2VydChmOnJlYWQoIm4iKSA9PSAtbWF4aW50KQphc3NlcnQoZjpyZWFkKCIqbiIpID09IC0weEFCQ3AtMykgICAgICAgICAgICAtLSB0ZXN0IG9sZCBmb3JtYXQgKHdpdGggJyonKQphc3NlcnQoZjpjbG9zZSgpKQphc3NlcnQob3MucmVtb3ZlKGZpbGUpKQoKCi0tIHRlc3RpbmcgbXVsdGlwbGUgYXJndW1lbnRzIHRvIGlvLnJlYWQKZG8KICBsb2NhbCBmID0gYXNzZXJ0KGlvLm9wZW4oZmlsZSwgInciKSkKICBmOndyaXRlW1sKYSBsaW5lCmFub3RoZXIgbGluZQoxMjM0CjMuNDUKb25lCnR3bwp0aHJlZQpdXQogIGxvY2FsIGwxLCBsMiwgbDMsIGw0LCBuMSwgbjIsIGMsIGR1bW15CiAgYXNzZXJ0KGY6Y2xvc2UoKSkKICBmID0gYXNzZXJ0KGlvLm9wZW4oZmlsZSwgInIiKSkKICBsMSwgbDIsIG4xLCBuMiwgZHVtbXkgPSBmOnJlYWQoImwiLCAiTCIsICJuIiwgIm4iKQogIGFzc2VydChsMSA9PSAiYSBsaW5lIiBhbmQgbDIgPT0gImFub3RoZXIgbGluZVxuIiBhbmQKICAgICAgICAgbjEgPT0gMTIzNCBhbmQgbjIgPT0gMy40NSBhbmQgZHVtbXkgPT0gbmlsKQogIGFzc2VydChmOmNsb3NlKCkpCiAgZiA9IGFzc2VydChpby5vcGVuKGZpbGUsICJyIikpCiAgbDEsIGwyLCBuMSwgbjIsIGMsIGwzLCBsNCwgZHVtbXkgPSBmOnJlYWQoNywgImwiLCAibiIsICJuIiwgMSwgImwiLCAibCIpCiAgYXNzZXJ0KGwxID09ICJhIGxpbmVcbiIgYW5kIGwyID09ICJhbm90aGVyIGxpbmUiIGFuZCBjID09ICdcbicgYW5kCiAgICAgICAgIG4xID09IDEyMzQgYW5kIG4yID09IDMuNDUgYW5kIGwzID09ICJvbmUiIGFuZCBsNCA9PSAidHdvIgogICAgICAgICBhbmQgZHVtbXkgPT0gbmlsKQogIGFzc2VydChmOmNsb3NlKCkpCiAgZiA9IGFzc2VydChpby5vcGVuKGZpbGUsICJyIikpCiAgLS0gc2Vjb25kIGl0ZW0gZmFpbGluZwogIGwxLCBuMSwgbjIsIGR1bW15ID0gZjpyZWFkKCJsIiwgIm4iLCAibiIsICJsIikKICBhc3NlcnQobDEgPT0gImEgbGluZSIgYW5kIG4xID09IG5pbCkKICBhc3NlcnQoZjpjbG9zZSgpKQogIGFzc2VydChvcy5yZW1vdmUoZmlsZSkpCmVuZAoKCgotLSB0ZXN0IHlpZWxkaW5nIGR1cmluZyAnZG9maWxlJwpmID0gYXNzZXJ0KGlvLm9wZW4oZmlsZSwgInciKSkKZjp3cml0ZVtbCmxvY2FsIHgsIHogPSBjb3JvdXRpbmUueWllbGQoMTApCmxvY2FsIHkgPSBjb3JvdXRpbmUueWllbGQoMjApCnJldHVybiB4ICsgeSAqIHoKXV0KYXNzZXJ0KGY6Y2xvc2UoKSkKZiA9IGNvcm91dGluZS53cmFwKGRvZmlsZSkKYXNzZXJ0KGYoZmlsZSkgPT0gMTApCnByaW50KGYoMTAwLCAxMDEpID09IDIwKQphc3NlcnQoZigyMDApID09IDEwMCArIDIwMCAqIDEwMSkKYXNzZXJ0KG9zLnJlbW92ZShmaWxlKSkKCgpmID0gYXNzZXJ0KGlvLm9wZW4oZmlsZSwgInciKSkKLS0gdGVzdCBudW1iZXIgdGVybWluYXRpb24KZjp3cml0ZVtbCi0xMi4zLQktMHhmZmZmKyAgLjN8NS5FLTNYICArMjM0ZSsxM0UgMHhERUFEQkVFRkRFQURCRUVGeAoweDEuMTNBcCszZQpdXQotLSB2ZXJ5IGxvbmcgbnVtYmVyCmY6d3JpdGUoIjEyMzQiKTsgZm9yIGkgPSAxLCAxMDAwIGRvIGY6d3JpdGUoIjAiKSBlbmQ7ICBmOndyaXRlKCJcbiIpCi0tIGludmFsaWQgc2VxdWVuY2VzIChtdXN0IHJlYWQgYW5kIGRpc2NhcmQgdmFsaWQgcHJlZml4ZXMpCmY6d3JpdGVbWwouZSsJMC5lOwktLTsgIDB4WDsKXV0KYXNzZXJ0KGY6Y2xvc2UoKSkKZiA9IGFzc2VydChpby5vcGVuKGZpbGUsICJyIikpCmFzc2VydChmOnJlYWQoIm4iKSA9PSAtMTIuMyk7IGFzc2VydChmOnJlYWQoMSkgPT0gIi0iKQphc3NlcnQoZjpyZWFkKCJuIikgPT0gLTB4ZmZmZik7IGFzc2VydChmOnJlYWQoMikgPT0gIisgIikKYXNzZXJ0KGY6cmVhZCgibiIpID09IDAuMyk7IGFzc2VydChmOnJlYWQoMSkgPT0gInwiKQphc3NlcnQoZjpyZWFkKCJuIikgPT0gNWUtMyk7IGFzc2VydChmOnJlYWQoMSkgPT0gIlgiKQphc3NlcnQoZjpyZWFkKCJuIikgPT0gMjM0ZTEzKTsgYXNzZXJ0KGY6cmVhZCgxKSA9PSAiRSIpCmFzc2VydChmOnJlYWQoIm4iKSA9PSAwWGRlYWRiZWVmZGVhZGJlZWYpOyBhc3NlcnQoZjpyZWFkKDIpID09ICJ4XG4iKQphc3NlcnQoZjpyZWFkKCJuIikgPT0gMHgxLjEzYVAzKTsgYXNzZXJ0KGY6cmVhZCgxKSA9PSAiZSIpCgpkbyAgIC0tIGF0dGVtcHQgdG8gcmVhZCB0b28gbG9uZyBudW1iZXIKICBhc3NlcnQoZjpyZWFkKCJuIikgPT0gbmlsKSAgLS0gZmFpbHMKICBsb2NhbCBzID0gZjpyZWFkKCJMIikgICAtLSByZWFkIHJlc3Qgb2YgbGluZQogIGFzc2VydChzdHJpbmcuZmluZChzLCAiXjAwKlxuJCIpKSAgLS0gbG90cyBvZiAwJ3MgbGVmdAplbmQKCmFzc2VydChub3QgZjpyZWFkKCJuIikpOyBhc3NlcnQoZjpyZWFkKDIpID09ICJlKyIpCmFzc2VydChub3QgZjpyZWFkKCJuIikpOyBhc3NlcnQoZjpyZWFkKDEpID09ICI7IikKYXNzZXJ0KG5vdCBmOnJlYWQoIm4iKSk7IGFzc2VydChmOnJlYWQoMikgPT0gIi07IikKYXNzZXJ0KG5vdCBmOnJlYWQoIm4iKSk7IGFzc2VydChmOnJlYWQoMSkgPT0gIlgiKQphc3NlcnQobm90IGY6cmVhZCgibiIpKTsgYXNzZXJ0KGY6cmVhZCgxKSA9PSAiOyIpCmFzc2VydChub3QgZjpyZWFkKCJuIikpOyBhc3NlcnQobm90IGY6cmVhZCgwKSkgICAtLSBlbmQgb2YgZmlsZQphc3NlcnQoZjpjbG9zZSgpKQphc3NlcnQob3MucmVtb3ZlKGZpbGUpKQoKCi0tIHRlc3QgbGluZSBnZW5lcmF0b3JzCmFzc2VydChub3QgcGNhbGwoaW8ubGluZXMsICJub24tZXhpc3RlbnQtZmlsZSIpKQphc3NlcnQob3MucmVuYW1lKG90aGVyZmlsZSwgZmlsZSkpCmlvLm91dHB1dChvdGhlcmZpbGUpCmxvY2FsIG4gPSAwCmxvY2FsIGYgPSBpby5saW5lcyhmaWxlKQp3aGlsZSBmKCkgZG8gbiA9IG4gKyAxIGVuZDsKYXNzZXJ0KG4gPT0gNikgICAtLSBudW1iZXIgb2YgbGluZXMgaW4gdGhlIGZpbGUKY2hlY2tlcnIoImZpbGUgaXMgYWxyZWFkeSBjbG9zZWQiLCBmKQpjaGVja2VycigiZmlsZSBpcyBhbHJlYWR5IGNsb3NlZCIsIGYpCi0tIGNvcHkgZnJvbSBmaWxlIHRvIG90aGVyZmlsZQpuID0gMApmb3IgbCBpbiBpby5saW5lcyhmaWxlKSBkbyBpby53cml0ZShsLCAiXG4iKTsgbiA9IG4gKyAxIGVuZAppby5jbG9zZSgpCmFzc2VydChuID09IDYpCi0tIGNvcHkgZnJvbSBvdGhlcmZpbGUgYmFjayB0byBmaWxlCmxvY2FsIGYgPSBhc3NlcnQoaW8ub3BlbihvdGhlcmZpbGUpKQphc3NlcnQoaW8udHlwZShmKSA9PSAiZmlsZSIpCmlvLm91dHB1dChmaWxlKQphc3NlcnQobm90IGlvLm91dHB1dCgpOnJlYWQoKSkKbiA9IDAKZm9yIGwgaW4gZjpsaW5lcygpIGRvIGlvLndyaXRlKGwsICJcbiIpOyBuID0gbiArIDEgZW5kCmFzc2VydCh0b3N0cmluZyhmKTpzdWIoMSwgNSkgPT0gImZpbGUgIikKYXNzZXJ0KGY6Y2xvc2UoKSk7IGlvLmNsb3NlKCkKYXNzZXJ0KG4gPT0gNikKY2hlY2tlcnIoImNsb3NlZCBmaWxlIiwgaW8uY2xvc2UsIGYpCmFzc2VydCh0b3N0cmluZyhmKSA9PSAiZmlsZSAoY2xvc2VkKSIpCmFzc2VydChpby50eXBlKGYpID09ICJjbG9zZWQgZmlsZSIpCmlvLmlucHV0KGZpbGUpCmYgPSBpby5vcGVuKG90aGVyZmlsZSk6bGluZXMoKQpuID0gMApmb3IgbCBpbiBpby5saW5lcygpIGRvIGFzc2VydChsID09IGYoKSk7IG4gPSBuICsgMSBlbmQKZiA9IG5pbDsgY29sbGVjdGdhcmJhZ2UoKQphc3NlcnQobiA9PSA2KQphc3NlcnQob3MucmVtb3ZlKG90aGVyZmlsZSkpCgpkbyAgLS0gYnVnIGluIDUuMy4xCiAgaW8ub3V0cHV0KG90aGVyZmlsZSkKICBpby53cml0ZShzdHJpbmcucmVwKCJhIiwgMzAwKSwgIlxuIikKICBpby5jbG9zZSgpCiAgbG9jYWwgdCA9e307IGZvciBpID0gMSwgMjUwIGRvIHRbaV0gPSAxIGVuZAogIHQgPSB7aW8ubGluZXMob3RoZXJmaWxlLCB0YWJsZS51bnBhY2sodCkpKCl9CiAgLS0gZXZlcnl0aGluZyBvayBoZXJlCiAgYXNzZXJ0KCN0ID09IDI1MCBhbmQgdFsxXSA9PSAnYScgYW5kIHRbI3RdID09ICdhJykKICB0WyN0ICsgMV0gPSAxICAgIC0tIG9uZSB0b28gbWFueQogIGNoZWNrZXJyKCJ0b28gbWFueSBhcmd1bWVudHMiLCBpby5saW5lcywgb3RoZXJmaWxlLCB0YWJsZS51bnBhY2sodCkpCiAgY29sbGVjdGdhcmJhZ2UoKSAgIC0tIGVuc3VyZSAnb3RoZXJmaWxlJyBpcyBjbG9zZWQKICBhc3NlcnQob3MucmVtb3ZlKG90aGVyZmlsZSkpCmVuZAoKaW8uaW5wdXQoZmlsZSkKZG8gIC0tIHRlc3QgZXJyb3IgcmV0dXJucwogIGxvY2FsIGEsYixjID0gaW8uaW5wdXQoKTp3cml0ZSgieHV4dSIpCiAgYXNzZXJ0KG5vdCBhIGFuZCB0eXBlKGIpID09ICJzdHJpbmciIGFuZCB0eXBlKGMpID09ICJudW1iZXIiKQplbmQKY2hlY2tlcnIoImludmFsaWQgZm9ybWF0IiwgaW8ucmVhZCwgIngiKQphc3NlcnQoaW8ucmVhZCgwKSA9PSAiIikgICAtLSBub3QgZW9mCmFzc2VydChpby5yZWFkKDUsICdsJykgPT0gJyLhbG8iJykKYXNzZXJ0KGlvLnJlYWQoMCkgPT0gIiIpCmFzc2VydChpby5yZWFkKCkgPT0gInNlY29uZCBsaW5lIikKbG9jYWwgeCA9IGlvLmlucHV0KCk6c2VlaygpCmFzc2VydChpby5yZWFkKCkgPT0gInRoaXJkIGxpbmUgIikKYXNzZXJ0KGlvLmlucHV0KCk6c2Vlaygic2V0IiwgeCkpCmFzc2VydChpby5yZWFkKCdMJykgPT0gInRoaXJkIGxpbmUgXG4iKQphc3NlcnQoaW8ucmVhZCgxKSA9PSAi5yIpCmFzc2VydChpby5yZWFkKHN0cmluZy5sZW4iZm91cnRoX2xpbmUiKSA9PSAiZm91cnRoX2xpbmUiKQphc3NlcnQoaW8uaW5wdXQoKTpzZWVrKCJjdXIiLCAtc3RyaW5nLmxlbiJmb3VydGhfbGluZSIpKQphc3NlcnQoaW8ucmVhZCgpID09ICJmb3VydGhfbGluZSIpCmFzc2VydChpby5yZWFkKCkgPT0gIiIpICAtLSBlbXB0eSBsaW5lCmFzc2VydChpby5yZWFkKCduJykgPT0gMzQ1MCkKYXNzZXJ0KGlvLnJlYWQoMSkgPT0gJ1xuJykKYXNzZXJ0KGlvLnJlYWQoMCkgPT0gbmlsKSAgLS0gZW5kIG9mIGZpbGUKYXNzZXJ0KGlvLnJlYWQoMSkgPT0gbmlsKSAgLS0gZW5kIG9mIGZpbGUKYXNzZXJ0KGlvLnJlYWQoMzAwMDApID09IG5pbCkgIC0tIGVuZCBvZiBmaWxlCmFzc2VydCgoe2lvLnJlYWQoMSl9KVsyXSA9PSB1bmRlZikKYXNzZXJ0KGlvLnJlYWQoKSA9PSBuaWwpICAtLSBlbmQgb2YgZmlsZQphc3NlcnQoKHtpby5yZWFkKCl9KVsyXSA9PSB1bmRlZikKYXNzZXJ0KGlvLnJlYWQoJ24nKSA9PSBuaWwpICAtLSBlbmQgb2YgZmlsZQphc3NlcnQoKHtpby5yZWFkKCduJyl9KVsyXSA9PSB1bmRlZikKYXNzZXJ0KGlvLnJlYWQoJ2EnKSA9PSAnJykgIC0tIGVuZCBvZiBmaWxlIChPSyBmb3IgJ2EnKQphc3NlcnQoaW8ucmVhZCgnYScpID09ICcnKSAgLS0gZW5kIG9mIGZpbGUgKE9LIGZvciAnYScpCmNvbGxlY3RnYXJiYWdlKCkKcHJpbnQoJysnKQppby5jbG9zZShpby5pbnB1dCgpKQpjaGVja2VycigiIGlucHV0IGZpbGUgaXMgY2xvc2VkIiwgaW8ucmVhZCkKCmFzc2VydChvcy5yZW1vdmUoZmlsZSkpCgpsb2NhbCB0ID0gJzAxMjM0NTY3ODknCmZvciBpPTEsMTAgZG8gdCA9IHQuLnQ7IGVuZAphc3NlcnQoc3RyaW5nLmxlbih0KSA9PSAxMCoyXjEwKQoKaW8ub3V0cHV0KGZpbGUpCmlvLndyaXRlKCJhbG8iKTp3cml0ZSgiXG4iKQppby5jbG9zZSgpCmNoZWNrZXJyKCIgb3V0cHV0IGZpbGUgaXMgY2xvc2VkIiwgaW8ud3JpdGUpCmxvY2FsIGYgPSBpby5vcGVuKGZpbGUsICJhK2IiKQppby5vdXRwdXQoZikKY29sbGVjdGdhcmJhZ2UoKQoKYXNzZXJ0KGlvLndyaXRlKCcgJyAuLiB0IC4uICcgJykpCmFzc2VydChpby53cml0ZSgnOycsICdlbmQgb2YgZmlsZVxuJykpCmY6Zmx1c2goKTsgaW8uZmx1c2goKQpmOmNsb3NlKCkKcHJpbnQoJysnKQoKaW8uaW5wdXQoZmlsZSkKYXNzZXJ0KGlvLnJlYWQoKSA9PSAiYWxvIikKYXNzZXJ0KGlvLnJlYWQoMSkgPT0gJyAnKQphc3NlcnQoaW8ucmVhZChzdHJpbmcubGVuKHQpKSA9PSB0KQphc3NlcnQoaW8ucmVhZCgxKSA9PSAnICcpCmFzc2VydChpby5yZWFkKDApKQphc3NlcnQoaW8ucmVhZCgnYScpID09ICc7ZW5kIG9mIGZpbGVcbicpCmFzc2VydChpby5yZWFkKDApID09IG5pbCkKYXNzZXJ0KGlvLmNsb3NlKGlvLmlucHV0KCkpKQoKCi0tIHRlc3QgZXJyb3JzIGluIHJlYWQvd3JpdGUKZG8KICBsb2NhbCBmdW5jdGlvbiBpc21zZyAobSkKICAgIC0tIGVycm9yIG1lc3NhZ2UgaXMgbm90IGEgY29kZSBudW1iZXIKICAgIHJldHVybiAodHlwZShtKSA9PSAic3RyaW5nIiBhbmQgdG9udW1iZXIobSkgPT0gbmlsKQogIGVuZAoKICAtLSByZWFkCiAgbG9jYWwgZiA9IGlvLm9wZW4oZmlsZSwgInciKQogIGxvY2FsIHIsIG0sIGMgPSBmOnJlYWQoKQogIGFzc2VydChub3QgciBhbmQgaXNtc2cobSkgYW5kIHR5cGUoYykgPT0gIm51bWJlciIpCiAgYXNzZXJ0KGY6Y2xvc2UoKSkKICAtLSB3cml0ZQogIGYgPSBpby5vcGVuKGZpbGUsICJyIikKICByLCBtLCBjID0gZjp3cml0ZSgid2hhdGV2ZXIiKQogIGFzc2VydChub3QgciBhbmQgaXNtc2cobSkgYW5kIHR5cGUoYykgPT0gIm51bWJlciIpCiAgYXNzZXJ0KGY6Y2xvc2UoKSkKICAtLSBsaW5lcwogIGYgPSBpby5vcGVuKGZpbGUsICJ3IikKICByLCBtID0gcGNhbGwoZjpsaW5lcygpKQogIGFzc2VydChyID09IGZhbHNlIGFuZCBpc21zZyhtKSkKICBhc3NlcnQoZjpjbG9zZSgpKQplbmQKCmFzc2VydChvcy5yZW1vdmUoZmlsZSkpCgotLSB0ZXN0IGZvciBMIGZvcm1hdAppby5vdXRwdXQoZmlsZSk7IGlvLndyaXRlIlxuXG5saW5lXG5vdGhlciI6Y2xvc2UoKQppby5pbnB1dChmaWxlKQphc3NlcnQoaW8ucmVhZCJMIiA9PSAiXG4iKQphc3NlcnQoaW8ucmVhZCJMIiA9PSAiXG4iKQphc3NlcnQoaW8ucmVhZCJMIiA9PSAibGluZVxuIikKYXNzZXJ0KGlvLnJlYWQiTCIgPT0gIm90aGVyIikKYXNzZXJ0KGlvLnJlYWQiTCIgPT0gbmlsKQppby5pbnB1dCgpOmNsb3NlKCkKCmxvY2FsIGYgPSBhc3NlcnQoaW8ub3BlbihmaWxlKSkKbG9jYWwgcyA9ICIiCmZvciBsIGluIGY6bGluZXMoIkwiKSBkbyBzID0gcyAuLiBsIGVuZAphc3NlcnQocyA9PSAiXG5cbmxpbmVcbm90aGVyIikKZjpjbG9zZSgpCgppby5pbnB1dChmaWxlKQpzID0gIiIKZm9yIGwgaW4gaW8ubGluZXMobmlsLCAiTCIpIGRvIHMgPSBzIC4uIGwgZW5kCmFzc2VydChzID09ICJcblxubGluZVxub3RoZXIiKQppby5pbnB1dCgpOmNsb3NlKCkKCnMgPSAiIgpmb3IgbCBpbiBpby5saW5lcyhmaWxlLCAiTCIpIGRvIHMgPSBzIC4uIGwgZW5kCmFzc2VydChzID09ICJcblxubGluZVxub3RoZXIiKQoKcyA9ICIiCmZvciBsIGluIGlvLmxpbmVzKGZpbGUsICJsIikgZG8gcyA9IHMgLi4gbCBlbmQKYXNzZXJ0KHMgPT0gImxpbmVvdGhlciIpCgppby5vdXRwdXQoZmlsZSk7IGlvLndyaXRlImEgPSAxMCArIDM0XG5hID0gMiphXG5hID0gLWFcbiI6Y2xvc2UoKQpsb2NhbCB0ID0ge30KYXNzZXJ0KGxvYWQoaW8ubGluZXMoZmlsZSwgIkwiKSwgbmlsLCBuaWwsIHQpKSgpCmFzc2VydCh0LmEgPT0gLSgoMTAgKyAzNCkgKiAyKSkKCgotLSB0ZXN0IGZvciBtdWx0aXBlIGFyZ3VtZW50cyBpbiAnbGluZXMnCmlvLm91dHB1dChmaWxlKTsgaW8ud3JpdGUiMDEyMzQ1Njc4OVxuIjpjbG9zZSgpCmZvciBhLGIgaW4gaW8ubGluZXMoZmlsZSwgMSwgMSkgZG8KICBpZiBhID09ICJcbiIgdGhlbiBhc3NlcnQoYiA9PSBuaWwpCiAgZWxzZSBhc3NlcnQodG9udW1iZXIoYSkgPT0gdG9udW1iZXIoYikgLSAxKQogIGVuZAplbmQKCmZvciBhLGIsYyBpbiBpby5saW5lcyhmaWxlLCAxLCAyLCAiYSIpIGRvCiAgYXNzZXJ0KGEgPT0gIjAiIGFuZCBiID09ICIxMiIgYW5kIGMgPT0gIjM0NTY3ODlcbiIpCmVuZAoKZm9yIGEsYixjIGluIGlvLmxpbmVzKGZpbGUsICJhIiwgMCwgMSkgZG8KICBpZiBhID09ICIiIHRoZW4gYnJlYWsgZW5kCiAgYXNzZXJ0KGEgPT0gIjAxMjM0NTY3ODlcbiIgYW5kIGIgPT0gbmlsIGFuZCBjID09IG5pbCkKZW5kCmNvbGxlY3RnYXJiYWdlKCkgICAtLSB0byBjbG9zZSBmaWxlIGluIHByZXZpb3VzIGl0ZXJhdGlvbgoKaW8ub3V0cHV0KGZpbGUpOyBpby53cml0ZSIwMFxuMTBcbjIwXG4zMFxuNDBcbiI6Y2xvc2UoKQpmb3IgYSwgYiBpbiBpby5saW5lcyhmaWxlLCAibiIsICJuIikgZG8KICBpZiBhID09IDQwIHRoZW4gYXNzZXJ0KGIgPT0gbmlsKQogIGVsc2UgYXNzZXJ0KGEgPT0gYiAtIDEwKQogIGVuZAplbmQKCgotLSB0ZXN0IGxvYWQgeCBsaW5lcwppby5vdXRwdXQoZmlsZSk7CmlvLndyaXRlW1sKbG9jYWwgeQo9IFgKWCA9ClggKgoyICsKWDsKWCA9ClgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTsKXV06Y2xvc2UoKQpfRy5YID0gMQphc3NlcnQobm90IGxvYWQoaW8ubGluZXMoZmlsZSkpKQpjb2xsZWN0Z2FyYmFnZSgpICAgLS0gdG8gY2xvc2UgZmlsZSBpbiBwcmV2aW91cyBpdGVyYXRpb24KbG9hZChpby5saW5lcyhmaWxlLCAiTCIpKSgpCmFzc2VydChfRy5YID09IDIpCmxvYWQoaW8ubGluZXMoZmlsZSwgMSkpKCkKYXNzZXJ0KF9HLlggPT0gNCkKbG9hZChpby5saW5lcyhmaWxlLCAzKSkoKQphc3NlcnQoX0cuWCA9PSA4KQoKcHJpbnQoJysnKQoKbG9jYWwgeDEgPSAic3RyaW5nXG5cblxcY29tIFwiXCInJ2NvaXNhcyBbW2VzdHJhbmhhc11dIF1dJyIKaW8ub3V0cHV0KGZpbGUpCmFzc2VydChpby53cml0ZShzdHJpbmcuZm9ybWF0KCJ4MiA9ICVxXG4tLSBjb21tZW50IHdpdGhvdXQgZW5kaW5nIEVPUyIsIHgxKSkpCmlvLmNsb3NlKCkKYXNzZXJ0KGxvYWRmaWxlKGZpbGUpKSgpCmFzc2VydCh4MSA9PSB4MikKcHJpbnQoJysnKQphc3NlcnQob3MucmVtb3ZlKGZpbGUpKQphc3NlcnQobm90IG9zLnJlbW92ZShmaWxlKSkKYXNzZXJ0KG5vdCBvcy5yZW1vdmUob3RoZXJmaWxlKSkKCi0tIHRlc3RpbmcgbG9hZGZpbGUKbG9jYWwgZnVuY3Rpb24gdGVzdGxvYWRmaWxlIChzLCBleHByZXMpCiAgaW8ub3V0cHV0KGZpbGUpCiAgaWYgcyB0aGVuIGlvLndyaXRlKHMpIGVuZAogIGlvLmNsb3NlKCkKICBsb2NhbCByZXMgPSBhc3NlcnQobG9hZGZpbGUoZmlsZSkpKCkKICBhc3NlcnQob3MucmVtb3ZlKGZpbGUpKQogIGFzc2VydChyZXMgPT0gZXhwcmVzKQplbmQKCi0tIGxvYWRpbmcgZW1wdHkgZmlsZQp0ZXN0bG9hZGZpbGUobmlsLCBuaWwpCgotLSBsb2FkaW5nIGZpbGUgd2l0aCBpbml0aWFsIGNvbW1lbnQgd2l0aG91dCBlbmQgb2YgbGluZQp0ZXN0bG9hZGZpbGUoIiMgYSBub24tZW5kaW5nIGNvbW1lbnQiLCBuaWwpCgoKLS0gY2hlY2tpbmcgVW5pY29kZSBCT00gaW4gZmlsZXMKdGVzdGxvYWRmaWxlKCJceEVGXHhCQlx4QkYjIHNvbWUgY29tbWVudFxucmV0dXJuIDIzNCIsIDIzNCkKdGVzdGxvYWRmaWxlKCJceEVGXHhCQlx4QkZyZXR1cm4gMjM5IiwgMjM5KQp0ZXN0bG9hZGZpbGUoIlx4RUZceEJCXHhCRiIsIG5pbCkgICAtLSBlbXB0eSBmaWxlIHdpdGggYSBCT00KCgotLSBjaGVja2luZyBsaW5lIG51bWJlcnMgaW4gZmlsZXMgd2l0aCBpbml0aWFsIGNvbW1lbnRzCnRlc3Rsb2FkZmlsZSgiIyBhIGNvbW1lbnRcbnJldHVybiByZXF1aXJlJ2RlYnVnJy5nZXRpbmZvKDEpLmN1cnJlbnRsaW5lIiwgMikKCgotLSBsb2FkaW5nIGJpbmFyeSBmaWxlCmlvLm91dHB1dChpby5vcGVuKGZpbGUsICJ3YiIpKQphc3NlcnQoaW8ud3JpdGUoc3RyaW5nLmR1bXAoZnVuY3Rpb24gKCkgcmV0dXJuIDEwLCAnXDBhbG9cMjU1JywgJ2hpJyBlbmQpKSkKaW8uY2xvc2UoKQphLCBiLCBjID0gYXNzZXJ0KGxvYWRmaWxlKGZpbGUpKSgpCmFzc2VydChhID09IDEwIGFuZCBiID09ICJcMGFsb1wyNTUiIGFuZCBjID09ICJoaSIpCmFzc2VydChvcy5yZW1vdmUoZmlsZSkpCgotLSBidWcgaW4gNS4yLjEKZG8KICBpby5vdXRwdXQoaW8ub3BlbihmaWxlLCAid2IiKSkKICAtLSBzYXZlIGZ1bmN0aW9uIHdpdGggbm8gdXB2YWx1ZXMKICBhc3NlcnQoaW8ud3JpdGUoc3RyaW5nLmR1bXAoZnVuY3Rpb24gKCkgcmV0dXJuIDEgZW5kKSkpCiAgaW8uY2xvc2UoKQogIGYgPSBhc3NlcnQobG9hZGZpbGUoZmlsZSwgImIiLCB7fSkpCiAgYXNzZXJ0KHR5cGUoZikgPT0gImZ1bmN0aW9uIiBhbmQgZigpID09IDEpCiAgYXNzZXJ0KG9zLnJlbW92ZShmaWxlKSkKZW5kCgotLSBsb2FkaW5nIGJpbmFyeSBmaWxlIHdpdGggaW5pdGlhbCBjb21tZW50CmlvLm91dHB1dChpby5vcGVuKGZpbGUsICJ3YiIpKQphc3NlcnQoaW8ud3JpdGUoIiN0aGlzIGlzIGEgY29tbWVudCBmb3IgYSBiaW5hcnkgZmlsZVwwXG4iLAogICAgICAgICAgICAgICAgc3RyaW5nLmR1bXAoZnVuY3Rpb24gKCkgcmV0dXJuIDIwLCAnXDBcMFwwJyBlbmQpKSkKaW8uY2xvc2UoKQphLCBiLCBjID0gYXNzZXJ0KGxvYWRmaWxlKGZpbGUpKSgpCmFzc2VydChhID09IDIwIGFuZCBiID09ICJcMFwwXDAiIGFuZCBjID09IG5pbCkKYXNzZXJ0KG9zLnJlbW92ZShmaWxlKSkKCgotLSAnbG9hZGZpbGUnIHdpdGggJ2VudicKZG8KICBsb2NhbCBmID0gaW8ub3BlbihmaWxlLCAndycpCiAgZjp3cml0ZVtbCiAgICBpZiAoLi4uKSB0aGVuIGEgPSAxNTsgcmV0dXJuIGIsIGMsIGQKICAgIGVsc2UgcmV0dXJuIF9FTlYKICAgIGVuZAogIF1dCiAgZjpjbG9zZSgpCiAgbG9jYWwgdCA9IHtiID0gMTIsIGMgPSAieHV4dSIsIGQgPSBwcmludH0KICBsb2NhbCBmID0gYXNzZXJ0KGxvYWRmaWxlKGZpbGUsICd0JywgdCkpCiAgbG9jYWwgYiwgYywgZCA9IGYoMSkKICBhc3NlcnQodC5hID09IDE1IGFuZCBiID09IDEyIGFuZCBjID09IHQuYyBhbmQgZCA9PSBwcmludCkKICBhc3NlcnQoZigpID09IHQpCiAgZiA9IGFzc2VydChsb2FkZmlsZShmaWxlLCAndCcsIG5pbCkpCiAgYXNzZXJ0KGYoKSA9PSBuaWwpCiAgZiA9IGFzc2VydChsb2FkZmlsZShmaWxlKSkKICBhc3NlcnQoZigpID09IF9HKQogIGFzc2VydChvcy5yZW1vdmUoZmlsZSkpCmVuZAoKCi0tICdsb2FkZmlsZScgeCBtb2RlcwpkbwogIGlvLm9wZW4oZmlsZSwgJ3cnKTp3cml0ZSgicmV0dXJuIDEwIik6Y2xvc2UoKQogIGxvY2FsIHMsIG0gPSBsb2FkZmlsZShmaWxlLCAnYicpCiAgYXNzZXJ0KG5vdCBzIGFuZCBzdHJpbmcuZmluZChtLCAiYSB0ZXh0IGNodW5rIikpCiAgaW8ub3BlbihmaWxlLCAndycpOndyaXRlKCJcMjcgcmV0dXJuIDEwIik6Y2xvc2UoKQogIGxvY2FsIHMsIG0gPSBsb2FkZmlsZShmaWxlLCAndCcpCiAgYXNzZXJ0KG5vdCBzIGFuZCBzdHJpbmcuZmluZChtLCAiYSBiaW5hcnkgY2h1bmsiKSkKICBhc3NlcnQob3MucmVtb3ZlKGZpbGUpKQplbmQKCgppby5vdXRwdXQoZmlsZSkKYXNzZXJ0KGlvLndyaXRlKCJxdWFscXVlciBjb2lzYVxuIikpCmFzc2VydChpby53cml0ZSgibWFpcyBxdWFscXVlciBjb2lzYSIpKQppby5jbG9zZSgpCmFzc2VydChpby5vdXRwdXQoYXNzZXJ0KGlvLm9wZW4ob3RoZXJmaWxlLCAnd2InKSkpCiAgICAgICA6d3JpdGUoIm91dHJhIGNvaXNhXDBcMVwzXDBcMFwwXDBcMjU1XDAiKQogICAgICAgOmNsb3NlKCkpCgpsb2NhbCBmaWxlaGFuZGxlID0gYXNzZXJ0KGlvLm9wZW4oZmlsZSwgJ3IrJykpCmxvY2FsIG90aGVyZmlsZWhhbmRsZSA9IGFzc2VydChpby5vcGVuKG90aGVyZmlsZSwgJ3JiJykpCmFzc2VydChmaWxlaGFuZGxlIH49IG90aGVyZmlsZWhhbmRsZSkKYXNzZXJ0KHR5cGUoZmlsZWhhbmRsZSkgPT0gInVzZXJkYXRhIikKYXNzZXJ0KGZpbGVoYW5kbGU6cmVhZCgnbCcpID09ICJxdWFscXVlciBjb2lzYSIpCmlvLmlucHV0KG90aGVyZmlsZWhhbmRsZSkKYXNzZXJ0KGlvLnJlYWQoc3RyaW5nLmxlbiJvdXRyYSBjb2lzYSIpID09ICJvdXRyYSBjb2lzYSIpCmFzc2VydChmaWxlaGFuZGxlOnJlYWQoJ2wnKSA9PSAibWFpcyBxdWFscXVlciBjb2lzYSIpCmZpbGVoYW5kbGU6Y2xvc2UoKTsKYXNzZXJ0KHR5cGUoZmlsZWhhbmRsZSkgPT0gInVzZXJkYXRhIikKaW8uaW5wdXQob3RoZXJmaWxlaGFuZGxlKQphc3NlcnQoaW8ucmVhZCg0KSA9PSAiXDBcMVwzXDAiKQphc3NlcnQoaW8ucmVhZCgzKSA9PSAiXDBcMFwwIikKYXNzZXJ0KGlvLnJlYWQoMCkgPT0gIiIpICAgICAgICAtLSAyNTUgaXMgbm90IGVvZgphc3NlcnQoaW8ucmVhZCgxKSA9PSAiXDI1NSIpCmFzc2VydChpby5yZWFkKCdhJykgPT0gIlwwIikKYXNzZXJ0KG5vdCBpby5yZWFkKDApKQphc3NlcnQob3RoZXJmaWxlaGFuZGxlID09IGlvLmlucHV0KCkpCm90aGVyZmlsZWhhbmRsZTpjbG9zZSgpCmFzc2VydChvcy5yZW1vdmUoZmlsZSkpCmFzc2VydChvcy5yZW1vdmUob3RoZXJmaWxlKSkKY29sbGVjdGdhcmJhZ2UoKQoKaW8ub3V0cHV0KGZpbGUpCiAgOndyaXRlW1sKIDEyMy40CS01NmUtMiAgbm90IGEgbnVtYmVyCnNlY29uZCBsaW5lCnRoaXJkIGxpbmUKCmFuZCB0aGUgcmVzdCBvZiB0aGUgZmlsZQpdXQogIDpjbG9zZSgpCmlvLmlucHV0KGZpbGUpCmxvY2FsIF8sYSxiLGMsZCxlLGgsX18gPSBpby5yZWFkKDEsICduJywgJ24nLCAnbCcsICdsJywgJ2wnLCAnYScsIDEwKQphc3NlcnQoaW8uY2xvc2UoaW8uaW5wdXQoKSkpCmFzc2VydChfID09ICcgJyBhbmQgX18gPT0gbmlsKQphc3NlcnQodHlwZShhKSA9PSAnbnVtYmVyJyBhbmQgYT09MTIzLjQgYW5kIGI9PS01NmUtMikKYXNzZXJ0KGQ9PSdzZWNvbmQgbGluZScgYW5kIGU9PSd0aGlyZCBsaW5lJykKYXNzZXJ0KGg9PVtbCgphbmQgdGhlIHJlc3Qgb2YgdGhlIGZpbGUKXV0pCmFzc2VydChvcy5yZW1vdmUoZmlsZSkpCmNvbGxlY3RnYXJiYWdlKCkKCi0tIHRlc3RpbmcgYnVmZmVycwpkbwogIGxvY2FsIGYgPSBhc3NlcnQoaW8ub3BlbihmaWxlLCAidyIpKQogIGxvY2FsIGZyID0gYXNzZXJ0KGlvLm9wZW4oZmlsZSwgInIiKSkKICBhc3NlcnQoZjpzZXR2YnVmKCJmdWxsIiwgMjAwMCkpCiAgZjp3cml0ZSgieCIpCiAgYXNzZXJ0KGZyOnJlYWQoImFsbCIpID09ICIiKSAgLS0gZnVsbCBidWZmZXI7IG91dHB1dCBub3Qgd3JpdHRlbiB5ZXQKICBmOmNsb3NlKCkKICBmcjpzZWVrKCJzZXQiKQogIGFzc2VydChmcjpyZWFkKCJhbGwiKSA9PSAieCIpICAgLS0gYGNsb3NlJyBmbHVzaGVzIGl0CiAgZiA9IGFzc2VydChpby5vcGVuKGZpbGUpLCAidyIpCiAgYXNzZXJ0KGY6c2V0dmJ1Zigibm8iKSkKICBmOndyaXRlKCJ4IikKICBmcjpzZWVrKCJzZXQiKQogIGFzc2VydChmcjpyZWFkKCJhbGwiKSA9PSAieCIpICAtLSBubyBidWZmZXI7IG91dHB1dCBpcyByZWFkeQogIGY6Y2xvc2UoKQogIGYgPSBhc3NlcnQoaW8ub3BlbihmaWxlLCAiYSIpKQogIGFzc2VydChmOnNldHZidWYoImxpbmUiKSkKICBmOndyaXRlKCJ4IikKICBmcjpzZWVrKCJzZXQiLCAxKQogIGFzc2VydChmcjpyZWFkKCJhbGwiKSA9PSAiIikgICAtLSBsaW5lIGJ1ZmZlcjsgbm8gb3V0cHV0IHdpdGhvdXQgYFxuJwogIGY6d3JpdGUoImFcbiIpOnNlZWsoInNldCIsIDEpCiAgYXNzZXJ0KGZyOnJlYWQoImFsbCIpID09ICJ4YVxuIikgIC0tIG5vdyB3ZSBoYXZlIGEgd2hvbGUgbGluZQogIGY6Y2xvc2UoKTsgZnI6Y2xvc2UoKQogIGFzc2VydChvcy5yZW1vdmUoZmlsZSkpCmVuZAoKCmlmIG5vdCBfc29mdCB0aGVuCiAgcHJpbnQoInRlc3RpbmcgbGFyZ2UgZmlsZXMgKD4gQlVGU0laKSIpCiAgaW8ub3V0cHV0KGZpbGUpCiAgZm9yIGk9MSw1MDAxIGRvIGlvLndyaXRlKCcwMTIzNDU2Nzg5MTIzJykgZW5kCiAgaW8ud3JpdGUoJ1xuMTIzNDYnKTpjbG9zZSgpCiAgaW8uaW5wdXQoZmlsZSkKICBsb2NhbCB4ID0gaW8ucmVhZCgnYScpCiAgaW8uaW5wdXQoKTpzZWVrKCdzZXQnLCAwKQogIGxvY2FsIHkgPSBpby5yZWFkKDMwMDAxKS4uaW8ucmVhZCgxMDA1KS4uaW8ucmVhZCgwKS4uCiAgICAgICAgICAgIGlvLnJlYWQoMSkuLmlvLnJlYWQoMTAwMDAzKQogIGFzc2VydCh4ID09IHkgYW5kIHN0cmluZy5sZW4oeCkgPT0gNTAwMSoxMyArIDYpCiAgaW8uaW5wdXQoKTpzZWVrKCdzZXQnLCAwKQogIHkgPSBpby5yZWFkKCkgIC0tIGh1Z2UgbGluZQogIGFzc2VydCh4ID09IHkuLidcbicuLmlvLnJlYWQoKSkKICBhc3NlcnQoaW8ucmVhZCgpID09IG5pbCkKICBpby5jbG9zZShpby5pbnB1dCgpKQogIGFzc2VydChvcy5yZW1vdmUoZmlsZSkpCiAgeCA9IG5pbDsgeSA9IG5pbAplbmQKCmlmIG5vdCBfcG9ydCB0aGVuCiAgbG9jYWwgcHJvZ25hbWUKICBkbyAgLS0gZ2V0IG5hbWUgb2YgcnVubmluZyBleGVjdXRhYmxlCiAgICBsb2NhbCBhcmcgPSBhcmcgb3IgQVJHCiAgICBsb2NhbCBpID0gMAogICAgd2hpbGUgYXJnW2ldIGRvIGkgPSBpIC0gMSBlbmQKICAgIHByb2duYW1lID0gJyInIC4uIGFyZ1tpICsgMV0gLi4gJyInCiAgZW5kCiAgcHJpbnQoInRlc3RpbmcgcG9wZW4vcGNsb3NlIGFuZCBleGVjdXRlIikKICBsb2NhbCB0ZXN0cyA9IHsKICAgIC0tIGNvbW1hbmQsICAgd2hhdCwgIGNvZGUKICAgIHsibHMgPiAvZGV2L251bGwiLCAib2sifSwKICAgIHsibm90LXRvLWJlLWZvdW5kLWNvbW1hbmQiLCAiZXhpdCJ9LAogICAgeyJleGl0IDMiLCAiZXhpdCIsIDN9LAogICAgeyJleGl0IDEyOSIsICJleGl0IiwgMTI5fSwKICAgIHsia2lsbCAtcyBIVVAgJCQiLCAic2lnbmFsIiwgMX0sCiAgICB7ImtpbGwgLXMgS0lMTCAkJCIsICJzaWduYWwiLCA5fSwKICAgIHsic2ggLWMgJ2tpbGwgLXMgSFVQICQkJyIsICJleGl0In0sCiAgICB7cHJvZ25hbWUgLi4gJyAtZSAiICInLCAib2sifSwKICAgIHtwcm9nbmFtZSAuLiAnIC1lICJvcy5leGl0KDAsIHRydWUpIicsICJvayJ9LAogICAge3Byb2duYW1lIC4uICcgLWUgIm9zLmV4aXQoMjAsIHRydWUpIicsICJleGl0IiwgMjB9LAogIH0KICBwcmludCgiXG4oc29tZSBlcnJvciBtZXNzYWdlcyBhcmUgZXhwZWN0ZWQgbm93KSIpCiAgZm9yIF8sIHYgaW4gaXBhaXJzKHRlc3RzKSBkbwogICAgbG9jYWwgeCwgeSwgeiA9IGlvLnBvcGVuKHZbMV0pOmNsb3NlKCkKICAgIGxvY2FsIHgxLCB5MSwgejEgPSBvcy5leGVjdXRlKHZbMV0pCiAgICBhc3NlcnQoeCA9PSB4MSBhbmQgeSA9PSB5MSBhbmQgeiA9PSB6MSkKICAgIGlmIHZbMl0gPT0gIm9rIiB0aGVuCiAgICAgIGFzc2VydCh4IGFuZCB5ID09ICdleGl0JyBhbmQgeiA9PSAwKQogICAgZWxzZQogICAgICBhc3NlcnQobm90IHggYW5kIHkgPT0gdlsyXSkgICAtLSBjb3JyZWN0IHN0YXR1cyBhbmQgJ3doYXQnCiAgICAgIC0tIGNvcnJlY3QgY29kZSBpZiBrbm93biAoYnV0IGFsd2F5cyBkaWZmZXJlbnQgZnJvbSAwKQogICAgICBhc3NlcnQoKHZbM10gPT0gbmlsIGFuZCB6ID4gMCkgb3IgdlszXSA9PSB6KQogICAgZW5kCiAgZW5kCmVuZAoKCi0tIHRlc3RpbmcgdG1wZmlsZQpmID0gaW8udG1wZmlsZSgpCmFzc2VydChpby50eXBlKGYpID09ICJmaWxlIikKZjp3cml0ZSgiYWxvIikKZjpzZWVrKCJzZXQiKQphc3NlcnQoZjpyZWFkImEiID09ICJhbG8iKQoKZW5kIC0tfQoKcHJpbnQnKycKCnByaW50KCJ0ZXN0aW5nIGRhdGUvdGltZSIpCgphc3NlcnQob3MuZGF0ZSgiIikgPT0gIiIpCmFzc2VydChvcy5kYXRlKCIhIikgPT0gIiIpCmFzc2VydChvcy5kYXRlKCJcMFwwIikgPT0gIlwwXDAiKQphc3NlcnQob3MuZGF0ZSgiIVwwXDAiKSA9PSAiXDBcMCIpCmxvY2FsIHggPSBzdHJpbmcucmVwKCJhIiwgMTAwMDApCmFzc2VydChvcy5kYXRlKHgpID09IHgpCmxvY2FsIHQgPSBvcy50aW1lKCkKRCA9IG9zLmRhdGUoIip0IiwgdCkKYXNzZXJ0KG9zLmRhdGUoc3RyaW5nLnJlcCgiJWQiLCAxMDAwKSwgdCkgPT0KICAgICAgIHN0cmluZy5yZXAob3MuZGF0ZSgiJWQiLCB0KSwgMTAwMCkpCmFzc2VydChvcy5kYXRlKHN0cmluZy5yZXAoIiUiLCAyMDApKSA9PSBzdHJpbmcucmVwKCIlIiwgMTAwKSkKCmxvY2FsIHQgPSBvcy50aW1lKCkKRCA9IG9zLmRhdGUoIip0IiwgdCkKbG9hZChvcy5kYXRlKFtbYXNzZXJ0KEQueWVhcj09JVkgYW5kIEQubW9udGg9PSVtIGFuZCBELmRheT09JWQgYW5kCiAgRC5ob3VyPT0lSCBhbmQgRC5taW49PSVNIGFuZCBELnNlYz09JVMgYW5kCiAgRC53ZGF5PT0ldysxIGFuZCBELnlkYXk9PSVqIGFuZCB0eXBlKEQuaXNkc3QpID09ICdib29sZWFuJyldXSwgdCkpKCkKCmNoZWNrZXJyKCJpbnZhbGlkIGNvbnZlcnNpb24gc3BlY2lmaWVyIiwgb3MuZGF0ZSwgIiUiKQpjaGVja2VycigiaW52YWxpZCBjb252ZXJzaW9uIHNwZWNpZmllciIsIG9zLmRhdGUsICIlOSIpCmNoZWNrZXJyKCJpbnZhbGlkIGNvbnZlcnNpb24gc3BlY2lmaWVyIiwgb3MuZGF0ZSwgIiUiKQpjaGVja2VycigiaW52YWxpZCBjb252ZXJzaW9uIHNwZWNpZmllciIsIG9zLmRhdGUsICIlTyIpCmNoZWNrZXJyKCJpbnZhbGlkIGNvbnZlcnNpb24gc3BlY2lmaWVyIiwgb3MuZGF0ZSwgIiVFIikKY2hlY2tlcnIoImludmFsaWQgY29udmVyc2lvbiBzcGVjaWZpZXIiLCBvcy5kYXRlLCAiJUVhIikKCmNoZWNrZXJyKCJub3QgYW4gaW50ZWdlciIsIG9zLnRpbWUsIHt5ZWFyPTEwMDAsIG1vbnRoPTEsIGRheT0xLCBob3VyPSd4J30pCmNoZWNrZXJyKCJub3QgYW4gaW50ZWdlciIsIG9zLnRpbWUsIHt5ZWFyPTEwMDAsIG1vbnRoPTEsIGRheT0xLCBob3VyPTEuNX0pCgpjaGVja2VycigibWlzc2luZyIsIG9zLnRpbWUsIHtob3VyID0gMTJ9KSAgIC0tIG1pc3NpbmcgZGF0ZQoKaWYgbm90IF9wb3J0IHRoZW4KICAtLSB0ZXN0IFBvc2l4LXNwZWNpZmljIG1vZGlmaWVycwogIGFzc2VydCh0eXBlKG9zLmRhdGUoIiVFeCIpKSA9PSAnc3RyaW5nJykKICBhc3NlcnQodHlwZShvcy5kYXRlKCIlT3kiKSkgPT0gJ3N0cmluZycpCgoKICAtLSB0ZXN0IG91dC1vZi1yYW5nZSBkYXRlcyAoYXQgbGVhc3QgZm9yIFVuaXgpCiAgaWYgbWF4aW50ID49IDJeNjIgdGhlbiAgLS0gY2Fubm90IGRvIHRoZXNlIHRlc3RzIGluIFNtYWxsIEx1YQogICAgLS0gbm8gYXJpdGggb3ZlcmZsb3dzCiAgICBjaGVja2Vycigib3V0LW9mLWJvdW5kIiwgb3MudGltZSwge3llYXIgPSAtbWF4aW50LCBtb250aCA9IDEsIGRheSA9IDF9KQogICAgaWYgc3RyaW5nLnBhY2tzaXplKCJpIikgPT0gNCB0aGVuICAgLS0gNC1ieXRlIGludHMKICAgICAgaWYgdGVzdGVycigib3V0LW9mLWJvdW5kIiwgb3MuZGF0ZSwgIiVZIiwgMl40MCkgdGhlbgogICAgICAgIC0tIHRpbWVfdCBoYXMgNCBieXRlcyBhbmQgdGhlcmVmb3JlIGNhbm5vdCByZXByZXNlbnQgeWVhciA0MDAwCiAgICAgICAgcHJpbnQoIiAgNC1ieXRlIHRpbWVfdCIpCiAgICAgICAgY2hlY2tlcnIoImNhbm5vdCBiZSByZXByZXNlbnRlZCIsIG9zLnRpbWUsIHt5ZWFyPTQwMDAsIG1vbnRoPTEsIGRheT0xfSkKICAgICAgZWxzZQogICAgICAgIC0tIHRpbWVfdCBoYXMgOCBieXRlczsgYW4gaW50IHllYXIgY2Fubm90IHJlcHJlc2VudCBhIGh1Z2UgdGltZQogICAgICAgIHByaW50KCIgIDgtYnl0ZSB0aW1lX3QiKQogICAgICAgIGNoZWNrZXJyKCJjYW5ub3QgYmUgcmVwcmVzZW50ZWQiLCBvcy5kYXRlLCAiJVkiLCAyXjYwKQogICAgICAgIC0tIGl0IHNob3VsZCBoYXZlIG5vIHByb2JsZW1zIHdpdGggeWVhciA0MDAwCiAgICAgICAgYXNzZXJ0KHRvbnVtYmVyKG9zLnRpbWV7eWVhcj00MDAwLCBtb250aD0xLCBkYXk9MX0pKQogICAgICBlbmQKICAgIGVsc2UgICAgLS0gOC1ieXRlIGludHMKICAgICAgLS0gYXNzdW1lIHRpbWVfdCBoYXMgOCBieXRlcyB0b28KICAgICAgcHJpbnQoIiAgOC1ieXRlIHRpbWVfdCIpCiAgICAgIGFzc2VydCh0b251bWJlcihvcy5kYXRlKCIlWSIsIDJeNjApKSkKICAgICAgLS0gYnV0IHN0aWxsIGNhbm5vdCByZXByZXNlbnQgYSBodWdlIHllYXIKICAgICAgY2hlY2tlcnIoImNhbm5vdCBiZSByZXByZXNlbnRlZCIsIG9zLnRpbWUsIHt5ZWFyPTJeNjAsIG1vbnRoPTEsIGRheT0xfSkKICAgIGVuZAogIGVuZAplbmQKCgpEID0gb3MuZGF0ZSgiISp0IiwgdCkKbG9hZChvcy5kYXRlKFtbIWFzc2VydChELnllYXI9PSVZIGFuZCBELm1vbnRoPT0lbSBhbmQgRC5kYXk9PSVkIGFuZAogIEQuaG91cj09JUggYW5kIEQubWluPT0lTSBhbmQgRC5zZWM9PSVTIGFuZAogIEQud2RheT09JXcrMSBhbmQgRC55ZGF5PT0laiBhbmQgdHlwZShELmlzZHN0KSA9PSAnYm9vbGVhbicpXV0sIHQpKSgpCgpkbwogIGxvY2FsIEQgPSBvcy5kYXRlKCIqdCIpCiAgbG9jYWwgdCA9IG9zLnRpbWUoRCkKICBhc3NlcnQodHlwZShELmlzZHN0KSA9PSAnYm9vbGVhbicpCiAgRC5pc2RzdCA9IG5pbAogIGxvY2FsIHQxID0gb3MudGltZShEKQogIGFzc2VydCh0ID09IHQxKSAgIC0tIGlmIGlzZHN0IGlzIGFic2VudCB1c2VzIGNvcnJlY3QgZGVmYXVsdAplbmQKCnQgPSBvcy50aW1lKEQpCkQueWVhciA9IEQueWVhci0xOwpsb2NhbCB0MSA9IG9zLnRpbWUoRCkKLS0gYWxsb3cgZm9yIGxlYXAgeWVhcnMKYXNzZXJ0KG1hdGguYWJzKG9zLmRpZmZ0aW1lKHQsdDEpLygyNCozNjAwKSAtIDM2NSkgPCAyKQoKLS0gc2hvdWxkIG5vdCB0YWtlIG1vcmUgdGhhbiAxIHNlY29uZCB0byBleGVjdXRlIHRoZXNlIHR3byBsaW5lcwp0ID0gb3MudGltZSgpCnQxID0gb3MudGltZShvcy5kYXRlKCIqdCIpKQpsb2NhbCBkaWZmID0gb3MuZGlmZnRpbWUodDEsdCkKYXNzZXJ0KDAgPD0gZGlmZiBhbmQgZGlmZiA8PSAxKQpkaWZmID0gb3MuZGlmZnRpbWUodCx0MSkKYXNzZXJ0KC0xIDw9IGRpZmYgYW5kIGRpZmYgPD0gMCkKCmxvY2FsIHQxID0gb3MudGltZXt5ZWFyPTIwMDAsIG1vbnRoPTEwLCBkYXk9MSwgaG91cj0yMywgbWluPTEyfQpsb2NhbCB0MiA9IG9zLnRpbWV7eWVhcj0yMDAwLCBtb250aD0xMCwgZGF5PTEsIGhvdXI9MjMsIG1pbj0xMCwgc2VjPTE5fQphc3NlcnQob3MuZGlmZnRpbWUodDEsdDIpID09IDYwKjItMTkpCgotLSBzaW5jZSA1LjMuMywgJ29zLnRpbWUnIG5vcm1hbGl6ZXMgdGFibGUgZmllbGRzCnQxID0ge3llYXIgPSAyMDA1LCBtb250aCA9IDEsIGRheSA9IDEsIGhvdXIgPSAxLCBtaW4gPSAwLCBzZWMgPSAtMzYwMn0Kb3MudGltZSh0MSkKYXNzZXJ0KHQxLmRheSA9PSAzMSBhbmQgdDEubW9udGggPT0gMTIgYW5kIHQxLnllYXIgPT0gMjAwNCBhbmQKICAgICAgIHQxLmhvdXIgPT0gMjMgYW5kIHQxLm1pbiA9PSA1OSBhbmQgdDEuc2VjID09IDU4IGFuZAogICAgICAgdDEueWRheSA9PSAzNjYpCgppby5vdXRwdXQoaW8uc3Rkb3V0KQpsb2NhbCB0ID0gb3MuZGF0ZSgnJWQgJW0gJVkgJUggJU0gJVMnKQpsb2NhbCBkLCBtLCBhLCBoLCBtaW4sIHMgPSBzdHJpbmcubWF0Y2godCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKCVkKykgKCVkKykgKCVkKykgKCVkKykgKCVkKykgKCVkKykiKQpkID0gdG9udW1iZXIoZCkKbSA9IHRvbnVtYmVyKG0pCmEgPSB0b251bWJlcihhKQpoID0gdG9udW1iZXIoaCkKbWluID0gdG9udW1iZXIobWluKQpzID0gdG9udW1iZXIocykKaW8ud3JpdGUoc3RyaW5nLmZvcm1hdCgndGVzdCBkb25lIG9uICUyLjJkLyUyLjJkLyVkJywgZCwgbSwgYSkpCmlvLndyaXRlKHN0cmluZy5mb3JtYXQoJywgYXQgJTIuMmQ6JTIuMmQ6JTIuMmRcbicsIGgsIG1pbiwgcykpCmlvLndyaXRlKHN0cmluZy5mb3JtYXQoJyVzXG4nLCBfVkVSU0lPTikpCgoK