LS0gJElkOiB0ZXN0ZXMvZGIubHVhICQKLS0gU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gZmlsZSBhbGwubHVhCgotLSB0ZXN0aW5nIGRlYnVnIGxpYnJhcnkKCmxvY2FsIGRlYnVnID0gcmVxdWlyZSAiZGVidWciCgpsb2NhbCBmdW5jdGlvbiBkb3N0cmluZyhzKSByZXR1cm4gYXNzZXJ0KGxvYWQocykpKCkgZW5kCgpwcmludCJ0ZXN0aW5nIGRlYnVnIGxpYnJhcnkgYW5kIGRlYnVnIGluZm9ybWF0aW9uIgoKZG8KbG9jYWwgYT0xCmVuZAoKYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRob29rKCkpCgpsb2NhbCB0ZXN0bGluZSA9IDE5ICAgICAgICAgLS0gbGluZSB3aGVyZSAndGVzdCcgaXMgZGVmaW5lZApmdW5jdGlvbiB0ZXN0IChzLCBsLCBwKSAgICAgLS0gdGhpcyBtdXN0IGJlIGxpbmUgMTkKICBjb2xsZWN0Z2FyYmFnZSgpICAgLS0gYXZvaWQgZ2MgZHVyaW5nIHRyYWNlCiAgbG9jYWwgZnVuY3Rpb24gZiAoZXZlbnQsIGxpbmUpCiAgICBhc3NlcnQoZXZlbnQgPT0gJ2xpbmUnKQogICAgbG9jYWwgbCA9IHRhYmxlLnJlbW92ZShsLCAxKQogICAgaWYgcCB0aGVuIHByaW50KGwsIGxpbmUpIGVuZAogICAgYXNzZXJ0KGwgPT0gbGluZSwgIndyb25nIHRyYWNlISEiKQogIGVuZAogIGRlYnVnLnNldGhvb2soZiwibCIpOyBsb2FkKHMpKCk7IGRlYnVnLnNldGhvb2soKQogIGFzc2VydCgjbCA9PSAwKQplbmQKCgpkbwogIGFzc2VydChub3QgcGNhbGwoZGVidWcuZ2V0aW5mbywgcHJpbnQsICJYIikpICAgLS0gaW52YWxpZCBvcHRpb24KICBhc3NlcnQobm90IGRlYnVnLmdldGluZm8oMTAwMCkpICAgLS0gb3V0IG9mIHJhbmdlIGxldmVsCiAgYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRpbmZvKC0xKSkgICAgIC0tIG91dCBvZiByYW5nZSBsZXZlbAogIGxvY2FsIGEgPSBkZWJ1Zy5nZXRpbmZvKHByaW50KQogIGFzc2VydChhLndoYXQgPT0gIkMiIGFuZCBhLnNob3J0X3NyYyA9PSAiW0NdIikKICBhID0gZGVidWcuZ2V0aW5mbyhwcmludCwgIkwiKQogIGFzc2VydChhLmFjdGl2ZWxpbmVzID09IG5pbCkKICBsb2NhbCBiID0gZGVidWcuZ2V0aW5mbyh0ZXN0LCAiU2ZMIikKICBhc3NlcnQoYi5uYW1lID09IG5pbCBhbmQgYi53aGF0ID09ICJMdWEiIGFuZCBiLmxpbmVkZWZpbmVkID09IHRlc3RsaW5lIGFuZAogICAgICAgICBiLmxhc3RsaW5lZGVmaW5lZCA9PSBiLmxpbmVkZWZpbmVkICsgMTAgYW5kCiAgICAgICAgIGIuZnVuYyA9PSB0ZXN0IGFuZCBub3Qgc3RyaW5nLmZpbmQoYi5zaG9ydF9zcmMsICIlWyIpKQogIGFzc2VydChiLmFjdGl2ZWxpbmVzW2IubGluZWRlZmluZWQgKyAxXSBhbmQKICAgICAgICAgYi5hY3RpdmVsaW5lc1tiLmxhc3RsaW5lZGVmaW5lZF0pCiAgYXNzZXJ0KG5vdCBiLmFjdGl2ZWxpbmVzW2IubGluZWRlZmluZWRdIGFuZAogICAgICAgICBub3QgYi5hY3RpdmVsaW5lc1tiLmxhc3RsaW5lZGVmaW5lZCArIDFdKQplbmQKCgotLSB0ZXN0IGZpbGUgYW5kIHN0cmluZyBuYW1lcyB0cnVuY2F0aW9uCmEgPSAiZnVuY3Rpb24gZiAoKSBlbmQiCmxvY2FsIGZ1bmN0aW9uIGRvc3RyaW5nIChzLCB4KSByZXR1cm4gbG9hZChzLCB4KSgpIGVuZApkb3N0cmluZyhhKQphc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gc3RyaW5nLmZvcm1hdCgnW3N0cmluZyAiJXMiXScsIGEpKQpkb3N0cmluZyhhLi5zdHJpbmcuZm9ybWF0KCI7ICVzXG49MSIsIHN0cmluZy5yZXAoJ3AnLCA0MDApKSkKYXNzZXJ0KHN0cmluZy5maW5kKGRlYnVnLmdldGluZm8oZikuc2hvcnRfc3JjLCAnXiVbc3RyaW5nIFteXG5dKiUuJS4lLiIlXSQnKSkKZG9zdHJpbmcoYS4uc3RyaW5nLmZvcm1hdCgiOyAlcz0xIiwgc3RyaW5nLnJlcCgncCcsIDQwMCkpKQphc3NlcnQoc3RyaW5nLmZpbmQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMsICdeJVtzdHJpbmcgW15cbl0qJS4lLiUuIiVdJCcpKQpkb3N0cmluZygiXG4iLi5hKQphc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gJ1tzdHJpbmcgIi4uLiJdJykKZG9zdHJpbmcoYSwgIiIpCmFzc2VydChkZWJ1Zy5nZXRpbmZvKGYpLnNob3J0X3NyYyA9PSAnW3N0cmluZyAiIl0nKQpkb3N0cmluZyhhLCAiQHh1eHUiKQphc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gInh1eHUiKQpkb3N0cmluZyhhLCAiQCIuLnN0cmluZy5yZXAoJ3AnLCAxMDAwKS4uJ3QnKQphc3NlcnQoc3RyaW5nLmZpbmQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMsICJeJS4lLiUucCp0JCIpKQpkb3N0cmluZyhhLCAiPXh1eHUiKQphc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gInh1eHUiKQpkb3N0cmluZyhhLCBzdHJpbmcuZm9ybWF0KCI9JXMiLCBzdHJpbmcucmVwKCd4JywgNTAwKSkpCmFzc2VydChzdHJpbmcuZmluZChkZWJ1Zy5nZXRpbmZvKGYpLnNob3J0X3NyYywgIl54KiQiKSkKZG9zdHJpbmcoYSwgIj0iKQphc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gIiIpCmEgPSBuaWw7IGYgPSBuaWw7CgoKcmVwZWF0CiAgbG9jYWwgZyA9IHt4ID0gZnVuY3Rpb24gKCkKICAgIGxvY2FsIGEgPSBkZWJ1Zy5nZXRpbmZvKDIpCiAgICBhc3NlcnQoYS5uYW1lID09ICdmJyBhbmQgYS5uYW1ld2hhdCA9PSAnbG9jYWwnKQogICAgYSA9IGRlYnVnLmdldGluZm8oMSkKICAgIGFzc2VydChhLm5hbWUgPT0gJ3gnIGFuZCBhLm5hbWV3aGF0ID09ICdmaWVsZCcpCiAgICByZXR1cm4gJ3hpeGknCiAgZW5kfQogIGxvY2FsIGYgPSBmdW5jdGlvbiAoKSByZXR1cm4gMSsxIGFuZCAobm90IDEgb3IgZy54KCkpIGVuZAogIGFzc2VydChmKCkgPT0gJ3hpeGknKQogIGcgPSBkZWJ1Zy5nZXRpbmZvKGYpCiAgYXNzZXJ0KGcud2hhdCA9PSAiTHVhIiBhbmQgZy5mdW5jID09IGYgYW5kIGcubmFtZXdoYXQgPT0gIiIgYW5kIG5vdCBnLm5hbWUpCgogIGZ1bmN0aW9uIGYgKHgsIG5hbWUpICAgLS0gbG9jYWwhCiAgICBuYW1lID0gbmFtZSBvciAnZicKICAgIGxvY2FsIGEgPSBkZWJ1Zy5nZXRpbmZvKDEpCiAgICBhc3NlcnQoYS5uYW1lID09IG5hbWUgYW5kIGEubmFtZXdoYXQgPT0gJ2xvY2FsJykKICAgIHJldHVybiB4CiAgZW5kCgogIC0tIGJyZWFrcyBpbiBkaWZmZXJlbnQgY29uZGl0aW9ucwogIGlmIDM+NCB0aGVuIGJyZWFrIGVuZDsgZigpCiAgaWYgMzw0IHRoZW4gYT0xIGVsc2UgYnJlYWsgZW5kOyBmKCkKICB3aGlsZSAxIGRvIGxvY2FsIHg9MTA7IGJyZWFrIGVuZDsgZigpCiAgbG9jYWwgYiA9IDEKICBpZiAzPjQgdGhlbiByZXR1cm4gbWF0aC5zaW4oMSkgZW5kOyBmKCkKICBhID0gMzw0OyBmKCkKICBhID0gMzw0IG9yIDE7IGYoKQogIHJlcGVhdCBsb2NhbCB4PTIwOyBpZiA0PjMgdGhlbiBmKCkgZWxzZSBicmVhayBlbmQ7IGYoKSB1bnRpbCAxCiAgZyA9IHt9CiAgZihnKS54ID0gZigyKSBhbmQgZigxMCkrZig5KQogIGFzc2VydChnLnggPT0gZigxOSkpCiAgZnVuY3Rpb24gZyh4KSBpZiBub3QgeCB0aGVuIHJldHVybiAzIGVuZCByZXR1cm4gKHgoJ2EnLCAneCcpKSBlbmQKICBhc3NlcnQoZyhmKSA9PSAnYScpCnVudGlsIDEKCnRlc3QoW1tpZgptYXRoLnNpbigxKQp0aGVuCiAgYT0xCmVsc2UKICBhPTIKZW5kCl1dLCB7MiwzLDQsN30pCgp0ZXN0KFtbLS0KaWYgbmlsIHRoZW4KICBhPTEKZWxzZQogIGE9MgplbmQKXV0sIHsyLDUsNn0pCgp0ZXN0KFtbYT0xCnJlcGVhdAogIGE9YSsxCnVudGlsIGE9PTMKXV0sIHsxLDMsNCwzLDR9KQoKdGVzdChbWyBkbwogIHJldHVybgplbmQKXV0sIHsyfSkKCnRlc3QoW1tsb2NhbCBhCmE9MQp3aGlsZSBhPD0zIGRvCiAgYT1hKzEKZW5kCl1dLCB7MSwyLDMsNCwzLDQsMyw0LDMsNX0pCgp0ZXN0KFtbd2hpbGUgbWF0aC5zaW4oMSkgZG8KICBpZiBtYXRoLnNpbigxKQogIHRoZW4gYnJlYWsKICBlbmQKZW5kCmE9MV1dLCB7MSwyLDMsNn0pCgp0ZXN0KFtbZm9yIGk9MSwzIGRvCiAgYT1pCmVuZApdXSwgezEsMiwxLDIsMSwyLDEsM30pCgp0ZXN0KFtbZm9yIGksdiBpbiBwYWlyc3snYScsJ2InfSBkbwogIGE9dG9zdHJpbmcoaSkgLi4gdgplbmQKXV0sIHsxLDIsMSwyLDEsM30pCgp0ZXN0KFtbZm9yIGk9MSw0IGRvIGE9MSBlbmRdXSwgezEsMSwxLDF9KQoKCmRvICAgLS0gdGVzdGluZyBsaW5lIGluZm8vdHJhY2Ugd2l0aCBsYXJnZSBnYXBzIGluIHNvdXJjZQoKICBsb2NhbCBhID0gezEsIDIsIDMsIDEwLCAxMjQsIDEyNSwgMTI2LCAxMjcsIDEyOCwgMTI5LCAxMzAsCiAgICAgICAgICAgICAyNTUsIDI1NiwgMjU3LCA1MDAsIDEwMDB9CiAgbG9jYWwgcyA9IFtbCiAgICAgbG9jYWwgYiA9IHsxMH0KICAgICBhID0gYlsxXSBYICsgWSBiWzFdCiAgICAgYiA9IDQKICBdXQogIGZvciBfLCBpIGluIGlwYWlycyhhKSBkbwogICAgbG9jYWwgc3VicyA9IHtYID0gc3RyaW5nLnJlcCgiXG4iLCBpKX0KICAgIGZvciBfLCBqIGluIGlwYWlycyhhKSBkbwogICAgICBzdWJzLlkgPSBzdHJpbmcucmVwKCJcbiIsIGopCiAgICAgIGxvY2FsIHMgPSBzdHJpbmcuZ3N1YihzLCAiW1hZXSIsIHN1YnMpCiAgICAgIHRlc3QocywgezEsIDIgKyBpLCAyICsgaSArIGosIDIgKyBpLCAyICsgaSArIGosIDMgKyBpICsgan0pCiAgICBlbmQKICBlbmQKZW5kCgpwcmludCcrJwoKLS0gaW52YWxpZCBsZXZlbHMgaW4gW2dzXWV0bG9jYWwKYXNzZXJ0KG5vdCBwY2FsbChkZWJ1Zy5nZXRsb2NhbCwgMjAsIDEpKQphc3NlcnQobm90IHBjYWxsKGRlYnVnLnNldGxvY2FsLCAtMSwgMSwgMTApKQoKCi0tIHBhcmFtZXRlciBuYW1lcwpsb2NhbCBmdW5jdGlvbiBmb28gKGEsYiwuLi4pIGxvY2FsIGQsIGUgZW5kCmxvY2FsIGNvID0gY29yb3V0aW5lLmNyZWF0ZShmb28pCgphc3NlcnQoZGVidWcuZ2V0bG9jYWwoZm9vLCAxKSA9PSAnYScpCmFzc2VydChkZWJ1Zy5nZXRsb2NhbChmb28sIDIpID09ICdiJykKYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRsb2NhbChmb28sIDMpKQphc3NlcnQoZGVidWcuZ2V0bG9jYWwoY28sIGZvbywgMSkgPT0gJ2EnKQphc3NlcnQoZGVidWcuZ2V0bG9jYWwoY28sIGZvbywgMikgPT0gJ2InKQphc3NlcnQobm90IGRlYnVnLmdldGxvY2FsKGNvLCBmb28sIDMpKQoKYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRsb2NhbChwcmludCwgMSkpCgoKbG9jYWwgZnVuY3Rpb24gZm9vICgpIHJldHVybiAoZGVidWcuZ2V0bG9jYWwoMSwgLTEpKSBlbmQKYXNzZXJ0KG5vdCBmb28oMTApKQoKCi0tIHZhcmFyZ3MKbG9jYWwgZnVuY3Rpb24gZm9vIChhLCAuLi4pCiAgbG9jYWwgdCA9IHRhYmxlLnBhY2soLi4uKQogIGZvciBpID0gMSwgdC5uIGRvCiAgICBsb2NhbCBuLCB2ID0gZGVidWcuZ2V0bG9jYWwoMSwgLWkpCiAgICBhc3NlcnQobiA9PSAiKHZhcmFyZykiIGFuZCB2ID09IHRbaV0pCiAgZW5kCiAgYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRsb2NhbCgxLCAtKHQubiArIDEpKSkKICBhc3NlcnQobm90IGRlYnVnLnNldGxvY2FsKDEsIC0odC5uICsgMSksIDMwKSkKICBpZiB0Lm4gPiAwIHRoZW4KICAgIChmdW5jdGlvbiAoeCkKICAgICAgYXNzZXJ0KGRlYnVnLnNldGxvY2FsKDIsIC0xLCB4KSA9PSAiKHZhcmFyZykiKQogICAgICBhc3NlcnQoZGVidWcuc2V0bG9jYWwoMiwgLXQubiwgeCkgPT0gIih2YXJhcmcpIikKICAgICBlbmQpKDQzMCkKICAgICBhc3NlcnQoLi4uID09IDQzMCkKICBlbmQKZW5kCgpmb28oKQpmb28ocHJpbnQpCmZvbygyMDAsIDMsIDQpCmxvY2FsIGEgPSB7fQpmb3IgaSA9IDEsIChfc29mdCBhbmQgMTAwIG9yIDEwMDApIGRvIGFbaV0gPSBpIGVuZApmb28odGFibGUudW5wYWNrKGEpKQphID0gbmlsCgoKCmRvICAgLS0gdGVzdCBob29rIHByZXNlbmNlIGluIGRlYnVnIGluZm8KICBhc3NlcnQobm90IGRlYnVnLmdldGhvb2soKSkKICBsb2NhbCBjb3VudCA9IDAKICBsb2NhbCBmdW5jdGlvbiBmICgpCiAgICBhc3NlcnQoZGVidWcuZ2V0aW5mbygxKS5uYW1ld2hhdCA9PSAiaG9vayIpCiAgICBsb2NhbCBzbmRsaW5lID0gc3RyaW5nLm1hdGNoKGRlYnVnLnRyYWNlYmFjaygpLCAiXG4oLi0pXG4iKQogICAgYXNzZXJ0KHN0cmluZy5maW5kKHNuZGxpbmUsICJob29rIikpCiAgICBjb3VudCA9IGNvdW50ICsgMQogIGVuZAogIGRlYnVnLnNldGhvb2soZiwgImwiKQogIGxvY2FsIGEgPSAwCiAgX0VOVi5hID0gYQogIGEgPSAxCiAgZGVidWcuc2V0aG9vaygpCiAgYXNzZXJ0KGNvdW50ID09IDQpCmVuZAoKCi0tIGhvb2sgdGFibGUgaGFzIHdlYWsga2V5cwphc3NlcnQoZ2V0bWV0YXRhYmxlKGRlYnVnLmdldHJlZ2lzdHJ5KCkuX0hPT0tLRVkpLl9fbW9kZSA9PSAnaycpCgoKYSA9IHt9OyBMID0gbmlsCmxvY2FsIGdsb2IgPSAxCmxvY2FsIG9sZGdsb2IgPSBnbG9iCmRlYnVnLnNldGhvb2soZnVuY3Rpb24gKGUsbCkKICBjb2xsZWN0Z2FyYmFnZSgpICAgLS0gZm9yY2UgR0MgZHVyaW5nIGEgaG9vawogIGxvY2FsIGYsIG0sIGMgPSBkZWJ1Zy5nZXRob29rKCkKICBhc3NlcnQobSA9PSAnY3JsJyBhbmQgYyA9PSAwKQogIGlmIGUgPT0gImxpbmUiIHRoZW4KICAgIGlmIGdsb2Igfj0gb2xkZ2xvYiB0aGVuCiAgICAgIEwgPSBsLTEgICAtLSBnZXQgdGhlIGZpcnN0IGxpbmUgd2hlcmUgImdsb2IiIGhhcyBjaGFuZ2VkCiAgICAgIG9sZGdsb2IgPSBnbG9iCiAgICBlbmQKICBlbHNlaWYgZSA9PSAiY2FsbCIgdGhlbgogICAgICBsb2NhbCBmID0gZGVidWcuZ2V0aW5mbygyLCAiZiIpLmZ1bmMKICAgICAgYVtmXSA9IDEKICBlbHNlIGFzc2VydChlID09ICJyZXR1cm4iKQogIGVuZAplbmQsICJjcmwiKQoKCmZ1bmN0aW9uIGYoYSxiKQogIGNvbGxlY3RnYXJiYWdlKCkKICBsb2NhbCBfLCB4ID0gZGVidWcuZ2V0bG9jYWwoMSwgMSkKICBsb2NhbCBfLCB5ID0gZGVidWcuZ2V0bG9jYWwoMSwgMikKICBhc3NlcnQoeCA9PSBhIGFuZCB5ID09IGIpCiAgYXNzZXJ0KGRlYnVnLnNldGxvY2FsKDIsIDMsICJwZXJhIikgPT0gIkFBIi4uIkFBIikKICBhc3NlcnQoZGVidWcuc2V0bG9jYWwoMiwgNCwgIm1h5+MiKSA9PSAiQiIpCiAgeCA9IGRlYnVnLmdldGluZm8oMikKICBhc3NlcnQoeC5mdW5jID09IGcgYW5kIHgud2hhdCA9PSAiTHVhIiBhbmQgeC5uYW1lID09ICdnJyBhbmQKICAgICAgICAgeC5udXBzID09IDIgYW5kIHN0cmluZy5maW5kKHguc291cmNlLCAiXkAuKmRiJS5sdWEkIikpCiAgZ2xvYiA9IGdsb2IrMQogIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDEsICJsIikuY3VycmVudGxpbmUgPT0gTCsxKQogIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDEsICJsIikuY3VycmVudGxpbmUgPT0gTCsyKQplbmQKCmZ1bmN0aW9uIGZvbygpCiAgZ2xvYiA9IGdsb2IrMQogIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDEsICJsIikuY3VycmVudGxpbmUgPT0gTCsxKQplbmQ7IGZvbygpICAtLSBzZXQgTAotLSBjaGVjayBsaW5lIGNvdW50aW5nIGluc2lkZSBzdHJpbmdzIGFuZCBlbXB0eSBsaW5lcwoKXyA9ICdhbG9cCmFsbycgLi4gW1sKCl1dCi0tW1sKXV0KYXNzZXJ0KGRlYnVnLmdldGluZm8oMSwgImwiKS5jdXJyZW50bGluZSA9PSBMKzExKSAgLS0gY2hlY2sgY291bnQgb2YgbGluZXMKCgpmdW5jdGlvbiBnICguLi4pCiAgbG9jYWwgYXJnID0gey4uLn0KICBkbyBsb2NhbCBhLGIsYzsgYT1tYXRoLnNpbig0MCk7IGVuZAogIGxvY2FsIGZlaWphbwogIGxvY2FsIEFBQUEsQiA9ICJ4dXh1IiwgIm1hbeNvIgogIGYoQUFBQSxCKQogIGFzc2VydChBQUFBID09ICJwZXJhIiBhbmQgQiA9PSAibWHn4yIpCiAgZG8KICAgICBsb2NhbCBCID0gMTMKICAgICBsb2NhbCB4LHkgPSBkZWJ1Zy5nZXRsb2NhbCgxLDUpCiAgICAgYXNzZXJ0KHggPT0gJ0InIGFuZCB5ID09IDEzKQogIGVuZAplbmQKCmcoKQoKCmFzc2VydChhW2ZdIGFuZCBhW2ddIGFuZCBhW2Fzc2VydF0gYW5kIGFbZGVidWcuZ2V0bG9jYWxdIGFuZCBub3QgYVtwcmludF0pCgoKLS0gdGVzdHMgZm9yIG1hbmlwdWxhdGluZyBub24tcmVnaXN0ZXJlZCBsb2NhbHMgKEMgYW5kIEx1YSB0ZW1wb3JhcmllcykKCmxvY2FsIG4sIHYgPSBkZWJ1Zy5nZXRsb2NhbCgwLCAxKQphc3NlcnQodiA9PSAwIGFuZCBuID09ICIoQyB0ZW1wb3JhcnkpIikKbG9jYWwgbiwgdiA9IGRlYnVnLmdldGxvY2FsKDAsIDIpCmFzc2VydCh2ID09IDIgYW5kIG4gPT0gIihDIHRlbXBvcmFyeSkiKQphc3NlcnQobm90IGRlYnVnLmdldGxvY2FsKDAsIDMpKQphc3NlcnQobm90IGRlYnVnLmdldGxvY2FsKDAsIDApKQoKZnVuY3Rpb24gZigpCiAgYXNzZXJ0KHNlbGVjdCgyLCBkZWJ1Zy5nZXRsb2NhbCgyLDMpKSA9PSAxKQogIGFzc2VydChub3QgZGVidWcuZ2V0bG9jYWwoMiw0KSkKICBkZWJ1Zy5zZXRsb2NhbCgyLCAzLCAxMCkKICByZXR1cm4gMjAKZW5kCgpmdW5jdGlvbiBnKGEsYikgcmV0dXJuIChhKzEpICsgZigpIGVuZAoKYXNzZXJ0KGcoMCwwKSA9PSAzMCkKIAoKZGVidWcuc2V0aG9vayhuaWwpOwphc3NlcnQobm90IGRlYnVnLmdldGhvb2soKSkKCgotLSBtaW5pbWFsIHRlc3RzIGZvciBzZXR1c2VydmFsdWUvZ2V0dXNlcnZhbHVlCmRvCiAgYXNzZXJ0KG5vdCBkZWJ1Zy5zZXR1c2VydmFsdWUoaW8uc3RkaW4sIDEwKSkKICBsb2NhbCBhLCBiID0gZGVidWcuZ2V0dXNlcnZhbHVlKGlvLnN0ZGluLCAxMCkKICBhc3NlcnQoYSA9PSBuaWwgYW5kIG5vdCBiKQplbmQKCi0tIHRlc3RpbmcgaXRlcmFjdGlvbiBiZXR3ZWVuIG11bHRpcGxlIHZhbHVlcyB4IGhvb2tzCmRvCiAgbG9jYWwgZnVuY3Rpb24gZiguLi4pIHJldHVybiAzLCAuLi4gZW5kCiAgbG9jYWwgY291bnQgPSAwCiAgbG9jYWwgYSA9IHt9CiAgZm9yIGkgPSAxLCAxMDAgZG8gYVtpXSA9IGkgZW5kCiAgZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoKSBjb3VudCA9IGNvdW50ICsgMSBlbmQsICIiLCAxKQogIGxvY2FsIHQgPSB7dGFibGUudW5wYWNrKGEpfQogIGFzc2VydCgjdCA9PSAxMDApCiAgdCA9IHt0YWJsZS51bnBhY2soYSwgMSwgMyl9CiAgYXNzZXJ0KCN0ID09IDMpCiAgdCA9IHtmKHRhYmxlLnVucGFjayhhLCAxLCAzMCkpfQogIGFzc2VydCgjdCA9PSAzMSkKZW5kCgoKLS0gdGVzdGluZyBhY2Nlc3MgdG8gZnVuY3Rpb24gYXJndW1lbnRzCgpsb2NhbCBmdW5jdGlvbiBjb2xsZWN0bG9jYWxzIChsZXZlbCkKICBsb2NhbCB0YWIgPSB7fQogIGZvciBpID0gMSwgbWF0aC5odWdlIGRvCiAgICBsb2NhbCBuLCB2ID0gZGVidWcuZ2V0bG9jYWwobGV2ZWwgKyAxLCBpKQogICAgaWYgbm90IChuIGFuZCBzdHJpbmcuZmluZChuLCAiXlthLXpBLVowLTlfXSskIikpIHRoZW4KICAgICAgIGJyZWFrICAgLS0gY29uc2lkZXIgb25seSByZWFsIHZhcmlhYmxlcwogICAgZW5kCiAgICB0YWJbbl0gPSB2CiAgZW5kCiAgcmV0dXJuIHRhYgplbmQKCgpYID0gbmlsCmEgPSB7fQpmdW5jdGlvbiBhOmYgKGEsIGIsIC4uLikgbG9jYWwgYXJnID0gey4uLn07IGxvY2FsIGMgPSAxMyBlbmQKZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoZSkKICBhc3NlcnQoZSA9PSAiY2FsbCIpCiAgZG9zdHJpbmcoIlhYID0gMTIiKSAgLS0gdGVzdCBkb3N0cmluZyBpbnNpZGUgaG9va3MKICAtLSB0ZXN0aW5nIGVycm9ycyBpbnNpZGUgaG9va3MKICBhc3NlcnQobm90IHBjYWxsKGxvYWQoImE9J2pvYW8nKzEiKSkpCiAgZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoZSwgbCkgCiAgICBhc3NlcnQoZGVidWcuZ2V0aW5mbygyLCAibCIpLmN1cnJlbnRsaW5lID09IGwpCiAgICBsb2NhbCBmLG0sYyA9IGRlYnVnLmdldGhvb2soKQogICAgYXNzZXJ0KGUgPT0gImxpbmUiKQogICAgYXNzZXJ0KG0gPT0gJ2wnIGFuZCBjID09IDApCiAgICBkZWJ1Zy5zZXRob29rKG5pbCkgIC0tIGhvb2sgaXMgY2FsbGVkIG9ubHkgb25jZQogICAgYXNzZXJ0KG5vdCBYKSAgICAgICAtLSBjaGVjayB0aGF0CiAgICBYID0gY29sbGVjdGxvY2FscygyKQogIGVuZCwgImwiKQplbmQsICJjIikKCmE6ZigxLDIsMyw0LDUpCmFzc2VydChYLnNlbGYgPT0gYSBhbmQgWC5hID09IDEgICBhbmQgWC5iID09IDIgYW5kIFguYyA9PSBuaWwpCmFzc2VydChYWCA9PSAxMikKYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRob29rKCkpCgoKLS0gdGVzdGluZyBhY2Nlc3MgdG8gbG9jYWwgdmFyaWFibGVzIGluIHJldHVybiBob29rIChidWcgaW4gNS4yKQpkbwogIGxvY2FsIFggPSBmYWxzZQoKICBsb2NhbCBmdW5jdGlvbiBmb28gKGEsIGIsIC4uLikKICAgIGRvIGxvY2FsIHgseSx6IGVuZAogICAgbG9jYWwgYywgZCA9IDEwLCAyMAogICAgcmV0dXJuCiAgZW5kCgogIGxvY2FsIGZ1bmN0aW9uIGF1eCAoKQogICAgaWYgZGVidWcuZ2V0aW5mbygyKS5uYW1lID09ICJmb28iIHRoZW4KICAgICAgWCA9IHRydWUgICAtLSB0byBzaWduYWwgdGhhdCBpdCBmb3VuZCAnZm9vJwogICAgICBsb2NhbCB0YWIgPSB7YSA9IDEwMCwgYiA9IDIwMCwgYyA9IDEwLCBkID0gMjB9CiAgICAgIGZvciBuLCB2IGluIHBhaXJzKGNvbGxlY3Rsb2NhbHMoMikpIGRvCiAgICAgICAgYXNzZXJ0KHRhYltuXSA9PSB2KQogICAgICAgIHRhYltuXSA9IHVuZGVmCiAgICAgIGVuZAogICAgICBhc3NlcnQobmV4dCh0YWIpID09IG5pbCkgICAgLS0gJ3RhYicgbXVzdCBiZSBlbXB0eQogICAgZW5kCiAgZW5kCgogIGRlYnVnLnNldGhvb2soYXV4LCAiciIpOyBmb28oMTAwLCAyMDApOyBkZWJ1Zy5zZXRob29rKCkKICBhc3NlcnQoWCkKCmVuZAoKCmxvY2FsIGZ1bmN0aW9uIGVxc2VxICh0MSwgdDIpCiAgYXNzZXJ0KCN0MSA9PSAjdDIpCiAgZm9yIGkgPSAxLCAjdDEgZG8KICAgIGFzc2VydCh0MVtpXSA9PSB0MltpXSkKICBlbmQKZW5kCgoKZG8gIHByaW50KCJ0ZXN0aW5nIGluc3BlY3Rpb24gb2YgcGFyYW1ldGVycy9yZXR1cm5lZCB2YWx1ZXMiKQogIGxvY2FsIG9uID0gZmFsc2UKICBsb2NhbCBpbnAsIG91dAoKICBsb2NhbCBmdW5jdGlvbiBob29rIChldmVudCkKICAgIGlmIG5vdCBvbiB0aGVuIHJldHVybiBlbmQKICAgIGxvY2FsIGFyID0gZGVidWcuZ2V0aW5mbygyLCAicnVTIikKICAgIGxvY2FsIHQgPSB7fQogICAgZm9yIGkgPSBhci5mdHJhbnNmZXIsIGFyLmZ0cmFuc2ZlciArIGFyLm50cmFuc2ZlciAtIDEgZG8KICAgICAgbG9jYWwgXywgdiA9IGRlYnVnLmdldGxvY2FsKDIsIGkpCiAgICAgIHRbI3QgKyAxXSA9IHYgCiAgICBlbmQKICAgIGlmIGV2ZW50ID09ICJyZXR1cm4iIHRoZW4KICAgICAgb3V0ID0gdAogICAgZWxzZQogICAgICBpbnAgPSB0CiAgICBlbmQKICBlbmQKCiAgZGVidWcuc2V0aG9vayhob29rLCAiY3IiKQoKICBvbiA9IHRydWU7IG1hdGguc2luKDMpOyBvbiA9IGZhbHNlCiAgZXFzZXEoaW5wLCB7M30pOyBlcXNlcShvdXQsIHttYXRoLnNpbigzKX0pCgogIG9uID0gdHJ1ZTsgc2VsZWN0KDIsIDEwLCAyMCwgMzAsIDQwKTsgb24gPSBmYWxzZQogIGVxc2VxKGlucCwgezIsIDEwLCAyMCwgMzAsIDQwfSk7IGVxc2VxKG91dCwgezIwLCAzMCwgNDB9KQoKICBsb2NhbCBmdW5jdGlvbiBmb28gKGEsIC4uLikgcmV0dXJuIC4uLiBlbmQKICBsb2NhbCBmdW5jdGlvbiBmb28xICgpIG9uID0gbm90IG9uOyByZXR1cm4gZm9vKDIwLCAxMCwgMCkgZW5kCiAgZm9vMSgpOyBvbiA9IGZhbHNlCiAgZXFzZXEoaW5wLCB7MjB9KTsgZXFzZXEob3V0LCB7MTAsIDB9KQoKICBkZWJ1Zy5zZXRob29rKCkKZW5kCgoKCi0tIHRlc3RpbmcgdXB2YWx1ZSBhY2Nlc3MKbG9jYWwgZnVuY3Rpb24gZ2V0dXB2YWx1ZXMgKGYpCiAgbG9jYWwgdCA9IHt9CiAgbG9jYWwgaSA9IDEKICB3aGlsZSB0cnVlIGRvCiAgICBsb2NhbCBuYW1lLCB2YWx1ZSA9IGRlYnVnLmdldHVwdmFsdWUoZiwgaSkKICAgIGlmIG5vdCBuYW1lIHRoZW4gYnJlYWsgZW5kCiAgICBhc3NlcnQobm90IHRbbmFtZV0pCiAgICB0W25hbWVdID0gdmFsdWUKICAgIGkgPSBpICsgMQogIGVuZAogIHJldHVybiB0CmVuZAoKbG9jYWwgYSxiLGMgPSAxLDIsMwpsb2NhbCBmdW5jdGlvbiBmb28xIChhKSBiID0gYTsgcmV0dXJuIGMgZW5kCmxvY2FsIGZ1bmN0aW9uIGZvbzIgKHgpIGEgPSB4OyByZXR1cm4gYytiIGVuZAphc3NlcnQobm90IGRlYnVnLmdldHVwdmFsdWUoZm9vMSwgMykpCmFzc2VydChub3QgZGVidWcuZ2V0dXB2YWx1ZShmb28xLCAwKSkKYXNzZXJ0KG5vdCBkZWJ1Zy5zZXR1cHZhbHVlKGZvbzEsIDMsICJ4dXh1IikpCmxvY2FsIHQgPSBnZXR1cHZhbHVlcyhmb28xKQphc3NlcnQodC5hID09IG5pbCBhbmQgdC5iID09IDIgYW5kIHQuYyA9PSAzKQp0ID0gZ2V0dXB2YWx1ZXMoZm9vMikKYXNzZXJ0KHQuYSA9PSAxIGFuZCB0LmIgPT0gMiBhbmQgdC5jID09IDMpCmFzc2VydChkZWJ1Zy5zZXR1cHZhbHVlKGZvbzEsIDEsICJ4dXh1IikgPT0gImIiKQphc3NlcnQoKHtkZWJ1Zy5nZXR1cHZhbHVlKGZvbzIsIDMpfSlbMl0gPT0gInh1eHUiKQotLSB1cHZhbHVlcyBvZiBDIGZ1bmN0aW9ucyBhcmUgYWxsd2F5cyAiY2FsbGVkIiAiIiAodGhlIGVtcHR5IHN0cmluZykKYXNzZXJ0KGRlYnVnLmdldHVwdmFsdWUoc3RyaW5nLmdtYXRjaCgieCIsICJ4IiksIDEpID09ICIiKSAgCgoKLS0gdGVzdGluZyBjb3VudCBob29rcwpsb2NhbCBhPTAKZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoZSkgYT1hKzEgZW5kLCAiIiwgMSkKYT0wOyBmb3IgaT0xLDEwMDAgZG8gZW5kOyBhc3NlcnQoMTAwMCA8IGEgYW5kIGEgPCAxMDEyKQpkZWJ1Zy5zZXRob29rKGZ1bmN0aW9uIChlKSBhPWErMSBlbmQsICIiLCA0KQphPTA7IGZvciBpPTEsMTAwMCBkbyBlbmQ7IGFzc2VydCgyNTAgPCBhIGFuZCBhIDwgMjU1KQpsb2NhbCBmLG0sYyA9IGRlYnVnLmdldGhvb2soKQphc3NlcnQobSA9PSAiIiBhbmQgYyA9PSA0KQpkZWJ1Zy5zZXRob29rKGZ1bmN0aW9uIChlKSBhPWErMSBlbmQsICIiLCA0MDAwKQphPTA7IGZvciBpPTEsMTAwMCBkbyBlbmQ7IGFzc2VydChhID09IDApCgpkbwogIGRlYnVnLnNldGhvb2socHJpbnQsICIiLCAyXjI0IC0gMSkgICAtLSBjb3VudCB1cHBlcmJvdW5kCiAgbG9jYWwgZixtLGMgPSBkZWJ1Zy5nZXRob29rKCkKICBhc3NlcnQoKHtkZWJ1Zy5nZXRob29rKCl9KVszXSA9PSAyXjI0IC0gMSkKZW5kCgpkZWJ1Zy5zZXRob29rKCkKCgotLSB0ZXN0cyBmb3IgdGFpbCBjYWxscwpsb2NhbCBmdW5jdGlvbiBmICh4KQogIGlmIHggdGhlbgogICAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMSwgIlMiKS53aGF0ID09ICJMdWEiKQogICAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMSwgInQiKS5pc3RhaWxjYWxsID09IHRydWUpCiAgICBsb2NhbCB0YWlsID0gZGVidWcuZ2V0aW5mbygyKQogICAgYXNzZXJ0KHRhaWwuZnVuYyA9PSBnMSBhbmQgdGFpbC5pc3RhaWxjYWxsID09IHRydWUpCiAgICBhc3NlcnQoZGVidWcuZ2V0aW5mbygzLCAiUyIpLndoYXQgPT0gIm1haW4iKQogICAgcHJpbnQiKyIKICAgIGVuZAplbmQKCmZ1bmN0aW9uIGcoeCkgcmV0dXJuIGYoeCkgZW5kCgpmdW5jdGlvbiBnMSh4KSBnKHgpIGVuZAoKbG9jYWwgZnVuY3Rpb24gaCAoeCkgbG9jYWwgZj1nMTsgcmV0dXJuIGYoeCkgZW5kCgpoKHRydWUpCgpsb2NhbCBiID0ge30KZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoZSkgdGFibGUuaW5zZXJ0KGIsIGUpIGVuZCwgImNyIikKaChmYWxzZSkKZGVidWcuc2V0aG9vaygpCmxvY2FsIHJlcyA9IHsicmV0dXJuIiwgICAtLSBmaXJzdCByZXR1cm4gKGZyb20gc2V0aG9vaykKICAiY2FsbCIsICJ0YWlsIGNhbGwiLCAiY2FsbCIsICJ0YWlsIGNhbGwiLAogICJyZXR1cm4iLCAicmV0dXJuIiwKICAiY2FsbCIsICAgIC0tIGxhc3QgY2FsbCAodG8gc2V0aG9vaykKfQpmb3IgaSA9IDEsICNyZXMgZG8gYXNzZXJ0KHJlc1tpXSA9PSB0YWJsZS5yZW1vdmUoYiwgMSkpIGVuZAoKYiA9IDAKZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoZSkKICAgICAgICAgICAgICAgIGlmIGUgPT0gInRhaWwgY2FsbCIgdGhlbgogICAgICAgICAgICAgICAgICBiID0gYiArIDEKICAgICAgICAgICAgICAgICAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMiwgInQiKS5pc3RhaWxjYWxsID09IHRydWUpCiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDIsICJ0IikuaXN0YWlsY2FsbCA9PSBmYWxzZSkKICAgICAgICAgICAgICAgIGVuZAogICAgICAgICAgICAgIGVuZCwgImMiKQpoKGZhbHNlKQpkZWJ1Zy5zZXRob29rKCkKYXNzZXJ0KGIgPT0gMikgICAtLSB0d28gdGFpbCBjYWxscwoKbGltID0gX3NvZnQgYW5kIDMwMDAgb3IgMzAwMDAKbG9jYWwgZnVuY3Rpb24gZm9vICh4KQogIGlmIHg9PTAgdGhlbgogICAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMikud2hhdCA9PSAibWFpbiIpCiAgICBsb2NhbCBpbmZvID0gZGVidWcuZ2V0aW5mbygxKQogICAgYXNzZXJ0KGluZm8uaXN0YWlsY2FsbCA9PSB0cnVlIGFuZCBpbmZvLmZ1bmMgPT0gZm9vKQogIGVsc2UgcmV0dXJuIGZvbyh4LTEpCiAgZW5kCmVuZAoKZm9vKGxpbSkKCgpwcmludCIrIgoKCi0tIHRlc3RpbmcgbG9jYWwgZnVuY3Rpb24gaW5mb3JtYXRpb24KY28gPSBsb2FkW1sKICBsb2NhbCBBID0gZnVuY3Rpb24gKCkKICAgIHJldHVybiB4CiAgZW5kCiAgcmV0dXJuCl1dCgpsb2NhbCBhID0gMAotLSAnQScgc2hvdWxkIGJlIHZpc2libGUgdG8gZGVidWdnZXIgb25seSBhZnRlciBpdHMgY29tcGxldGUgZGVmaW5pdGlvbgpkZWJ1Zy5zZXRob29rKGZ1bmN0aW9uIChlLCBsKQogIGlmIGwgPT0gMyB0aGVuIGEgPSBhICsgMTsgYXNzZXJ0KGRlYnVnLmdldGxvY2FsKDIsIDEpID09ICIodGVtcG9yYXJ5KSIpCiAgZWxzZWlmIGwgPT0gNCB0aGVuIGEgPSBhICsgMTsgYXNzZXJ0KGRlYnVnLmdldGxvY2FsKDIsIDEpID09ICJBIikKICBlbmQKZW5kLCAibCIpCmNvKCkgIC0tIHJ1biBsb2NhbCBmdW5jdGlvbiBkZWZpbml0aW9uCmRlYnVnLnNldGhvb2soKSAgLS0gdHVybiBvZmYgaG9vawphc3NlcnQoYSA9PSAyKSAgIC0tIGVuc3VyZSBhbGwgdHdvIGxpbmVzIHdoZXJlIGhvb2tlZAoKLS0gdGVzdGluZyB0cmFjZWJhY2sKCmFzc2VydChkZWJ1Zy50cmFjZWJhY2socHJpbnQpID09IHByaW50KQphc3NlcnQoZGVidWcudHJhY2ViYWNrKHByaW50LCA0KSA9PSBwcmludCkKYXNzZXJ0KHN0cmluZy5maW5kKGRlYnVnLnRyYWNlYmFjaygiaGkiLCA0KSwgIl5oaVxuIikpCmFzc2VydChzdHJpbmcuZmluZChkZWJ1Zy50cmFjZWJhY2soImhpIiksICJeaGlcbiIpKQphc3NlcnQobm90IHN0cmluZy5maW5kKGRlYnVnLnRyYWNlYmFjaygiaGkiKSwgIidkZWJ1Zy50cmFjZWJhY2snIikpCmFzc2VydChzdHJpbmcuZmluZChkZWJ1Zy50cmFjZWJhY2soImhpIiwgMCksICInZGVidWcudHJhY2ViYWNrJyIpKQphc3NlcnQoc3RyaW5nLmZpbmQoZGVidWcudHJhY2ViYWNrKCksICJec3RhY2sgdHJhY2ViYWNrOlxuIikpCgpkbyAgLS0gQy1mdW5jdGlvbiBuYW1lcyBpbiB0cmFjZWJhY2sKICBsb2NhbCBzdCwgbXNnID0gKGZ1bmN0aW9uICgpIHJldHVybiBwY2FsbCBlbmQpKCkoZGVidWcudHJhY2ViYWNrKQogIGFzc2VydChzdCA9PSB0cnVlIGFuZCBzdHJpbmcuZmluZChtc2csICJwY2FsbCIpKQplbmQKCgotLSB0ZXN0aW5nIG5wYXJhbXMsIG51cHMgZSBpc3ZhcmFyZwpsb2NhbCB0ID0gZGVidWcuZ2V0aW5mbyhwcmludCwgInUiKQphc3NlcnQodC5pc3ZhcmFyZyA9PSB0cnVlIGFuZCB0Lm5wYXJhbXMgPT0gMCBhbmQgdC5udXBzID09IDApCgp0ID0gZGVidWcuZ2V0aW5mbyhmdW5jdGlvbiAoYSxiLGMpIGVuZCwgInUiKQphc3NlcnQodC5pc3ZhcmFyZyA9PSBmYWxzZSBhbmQgdC5ucGFyYW1zID09IDMgYW5kIHQubnVwcyA9PSAwKQoKdCA9IGRlYnVnLmdldGluZm8oZnVuY3Rpb24gKGEsYiwuLi4pIHJldHVybiB0W2FdIGVuZCwgInUiKQphc3NlcnQodC5pc3ZhcmFyZyA9PSB0cnVlIGFuZCB0Lm5wYXJhbXMgPT0gMiBhbmQgdC5udXBzID09IDEpCgp0ID0gZGVidWcuZ2V0aW5mbygxKSAgIC0tIG1haW4KYXNzZXJ0KHQuaXN2YXJhcmcgPT0gdHJ1ZSBhbmQgdC5ucGFyYW1zID09IDAgYW5kIHQubnVwcyA9PSAxIGFuZAogICAgICAgZGVidWcuZ2V0dXB2YWx1ZSh0LmZ1bmMsIDEpID09ICJfRU5WIikKCgoKCi0tIHRlc3RpbmcgZGVidWdnaW5nIG9mIGNvcm91dGluZXMKCmxvY2FsIGZ1bmN0aW9uIGNoZWNrdHJhY2ViYWNrIChjbywgcCwgbGV2ZWwpCiAgbG9jYWwgdGIgPSBkZWJ1Zy50cmFjZWJhY2soY28sIG5pbCwgbGV2ZWwpCiAgbG9jYWwgaSA9IDAKICBmb3IgbCBpbiBzdHJpbmcuZ21hdGNoKHRiLCAiW15cbl0rXG4/IikgZG8KICAgIGFzc2VydChpID09IDAgb3Igc3RyaW5nLmZpbmQobCwgcFtpXSkpCiAgICBpID0gaSsxCiAgZW5kCiAgYXNzZXJ0KHBbaV0gPT0gdW5kZWYpCmVuZAoKCmxvY2FsIGZ1bmN0aW9uIGYgKG4pCiAgaWYgbiA+IDAgdGhlbiBmKG4tMSkKICBlbHNlIGNvcm91dGluZS55aWVsZCgpIGVuZAplbmQKCmxvY2FsIGNvID0gY29yb3V0aW5lLmNyZWF0ZShmKQpjb3JvdXRpbmUucmVzdW1lKGNvLCAzKQpjaGVja3RyYWNlYmFjayhjbywgeyJ5aWVsZCIsICJkYi5sdWEiLCAiZGIubHVhIiwgImRiLmx1YSIsICJkYi5sdWEifSkKY2hlY2t0cmFjZWJhY2soY28sIHsiZGIubHVhIiwgImRiLmx1YSIsICJkYi5sdWEiLCAiZGIubHVhIn0sIDEpCmNoZWNrdHJhY2ViYWNrKGNvLCB7ImRiLmx1YSIsICJkYi5sdWEiLCAiZGIubHVhIn0sIDIpCmNoZWNrdHJhY2ViYWNrKGNvLCB7ImRiLmx1YSJ9LCA0KQpjaGVja3RyYWNlYmFjayhjbywge30sIDQwKQoKCmNvID0gY29yb3V0aW5lLmNyZWF0ZShmdW5jdGlvbiAoeCkKICAgICAgIGxvY2FsIGEgPSAxCiAgICAgICBjb3JvdXRpbmUueWllbGQoZGVidWcuZ2V0aW5mbygxLCAibCIpKQogICAgICAgY29yb3V0aW5lLnlpZWxkKGRlYnVnLmdldGluZm8oMSwgImwiKS5jdXJyZW50bGluZSkKICAgICAgIHJldHVybiBhCiAgICAgZW5kKQoKbG9jYWwgdHIgPSB7fQpsb2NhbCBmb28gPSBmdW5jdGlvbiAoZSwgbCkgaWYgbCB0aGVuIHRhYmxlLmluc2VydCh0ciwgbCkgZW5kIGVuZApkZWJ1Zy5zZXRob29rKGNvLCBmb28sICJsY3IiKQoKbG9jYWwgXywgbCA9IGNvcm91dGluZS5yZXN1bWUoY28sIDEwKQpsb2NhbCB4ID0gZGVidWcuZ2V0aW5mbyhjbywgMSwgImxmTFMiKQphc3NlcnQoeC5jdXJyZW50bGluZSA9PSBsLmN1cnJlbnRsaW5lIGFuZCB4LmFjdGl2ZWxpbmVzW3guY3VycmVudGxpbmVdKQphc3NlcnQodHlwZSh4LmZ1bmMpID09ICJmdW5jdGlvbiIpCmZvciBpPXgubGluZWRlZmluZWQgKyAxLCB4Lmxhc3RsaW5lZGVmaW5lZCBkbwogIGFzc2VydCh4LmFjdGl2ZWxpbmVzW2ldKQogIHguYWN0aXZlbGluZXNbaV0gPSB1bmRlZgplbmQKYXNzZXJ0KG5leHQoeC5hY3RpdmVsaW5lcykgPT0gbmlsKSAgIC0tIG5vICdleHRyYScgZWxlbWVudHMKYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRpbmZvKGNvLCAyKSkKbG9jYWwgYSxiID0gZGVidWcuZ2V0bG9jYWwoY28sIDEsIDEpCmFzc2VydChhID09ICJ4IiBhbmQgYiA9PSAxMCkKYSxiID0gZGVidWcuZ2V0bG9jYWwoY28sIDEsIDIpCmFzc2VydChhID09ICJhIiBhbmQgYiA9PSAxKQpkZWJ1Zy5zZXRsb2NhbChjbywgMSwgMiwgImhpIikKYXNzZXJ0KGRlYnVnLmdldGhvb2soY28pID09IGZvbykKYXNzZXJ0KCN0ciA9PSAyIGFuZAogICAgICAgdHJbMV0gPT0gbC5jdXJyZW50bGluZS0xIGFuZCB0clsyXSA9PSBsLmN1cnJlbnRsaW5lKQoKYSxiLGMgPSBwY2FsbChjb3JvdXRpbmUucmVzdW1lLCBjbykKYXNzZXJ0KGEgYW5kIGIgYW5kIGMgPT0gbC5jdXJyZW50bGluZSsxKQpjaGVja3RyYWNlYmFjayhjbywgeyJ5aWVsZCIsICJpbiBmdW5jdGlvbiA8In0pCgphLGIgPSBjb3JvdXRpbmUucmVzdW1lKGNvKQphc3NlcnQoYSBhbmQgYiA9PSAiaGkiKQphc3NlcnQoI3RyID09IDQgYW5kIHRyWzRdID09IGwuY3VycmVudGxpbmUrMikKYXNzZXJ0KGRlYnVnLmdldGhvb2soY28pID09IGZvbykKYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRob29rKCkpCmNoZWNrdHJhY2ViYWNrKGNvLCB7fSkKCgotLSBjaGVjayBnZXQvc2V0bG9jYWwgaW4gY29yb3V0aW5lcwpjbyA9IGNvcm91dGluZS5jcmVhdGUoZnVuY3Rpb24gKHgpCiAgbG9jYWwgYSwgYiA9IGNvcm91dGluZS55aWVsZCh4KQogIGFzc2VydChhID09IDEwMCBhbmQgYiA9PSBuaWwpCiAgcmV0dXJuIHgKZW5kKQphLCBiID0gY29yb3V0aW5lLnJlc3VtZShjbywgMTApCmFzc2VydChhIGFuZCBiID09IDEwKQphLCBiID0gZGVidWcuZ2V0bG9jYWwoY28sIDEsIDEpCmFzc2VydChhID09ICJ4IiBhbmQgYiA9PSAxMCkKYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRsb2NhbChjbywgMSwgNSkpCmFzc2VydChkZWJ1Zy5zZXRsb2NhbChjbywgMSwgMSwgMzApID09ICJ4IikKYXNzZXJ0KG5vdCBkZWJ1Zy5zZXRsb2NhbChjbywgMSwgNSwgNDApKQphLCBiID0gY29yb3V0aW5lLnJlc3VtZShjbywgMTAwKQphc3NlcnQoYSBhbmQgYiA9PSAzMCkKCgotLSBjaGVjayB0cmFjZWJhY2sgb2Ygc3VzcGVuZGVkIChvciBkZWFkIHdpdGggZXJyb3IpIGNvcm91dGluZXMKCmZ1bmN0aW9uIGYoaSkKICBpZiBpID09IDAgdGhlbiBlcnJvcihpKQogIGVsc2UgY29yb3V0aW5lLnlpZWxkKCk7IGYoaS0xKQogIGVuZAplbmQKCgpjbyA9IGNvcm91dGluZS5jcmVhdGUoZnVuY3Rpb24gKHgpIGYoeCkgZW5kKQphLCBiID0gY29yb3V0aW5lLnJlc3VtZShjbywgMykKdCA9IHsiJ2Nvcm91dGluZS55aWVsZCciLCAiJ2YnIiwgImluIGZ1bmN0aW9uIDwifQp3aGlsZSBjb3JvdXRpbmUuc3RhdHVzKGNvKSA9PSAic3VzcGVuZGVkIiBkbwogIGNoZWNrdHJhY2ViYWNrKGNvLCB0KQogIGEsIGIgPSBjb3JvdXRpbmUucmVzdW1lKGNvKQogIHRhYmxlLmluc2VydCh0LCAyLCAiJ2YnIikgICAtLSBvbmUgbW9yZSByZWN1cnNpdmUgY2FsbCB0byAnZicKZW5kCnRbMV0gPSAiJ2Vycm9yJyIKY2hlY2t0cmFjZWJhY2soY28sIHQpCgoKLS0gdGVzdCBhY2Vzc2luZyBsaW5lIG51bWJlcnMgb2YgYSBjb3JvdXRpbmUgZnJvbSBhIHJlc3VtZSBpbnNpZGUKLS0gYSBDIGZ1bmN0aW9uICh0aGlzIGlzIGEga25vd24gYnVnIGluIEx1YSA1LjApCgpsb2NhbCBmdW5jdGlvbiBnKHgpCiAgICBjb3JvdXRpbmUueWllbGQoeCkKZW5kCgpsb2NhbCBmdW5jdGlvbiBmIChpKQogIGRlYnVnLnNldGhvb2soZnVuY3Rpb24gKCkgZW5kLCAibCIpCiAgZm9yIGo9MSwxMDAwIGRvCiAgICBnKGkraikKICBlbmQKZW5kCgpsb2NhbCBjbyA9IGNvcm91dGluZS53cmFwKGYpCmNvKDEwKQpwY2FsbChjbykKcGNhbGwoY28pCgoKYXNzZXJ0KHR5cGUoZGVidWcuZ2V0cmVnaXN0cnkoKSkgPT0gInRhYmxlIikKCgotLSB0ZXN0IHRhZ21ldGhvZCBpbmZvcm1hdGlvbgpsb2NhbCBhID0ge30KbG9jYWwgZnVuY3Rpb24gZiAodCkKICBsb2NhbCBpbmZvID0gZGVidWcuZ2V0aW5mbygxKTsKICBhc3NlcnQoaW5mby5uYW1ld2hhdCA9PSAibWV0YW1ldGhvZCIpCiAgYS5vcCA9IGluZm8ubmFtZQogIHJldHVybiBpbmZvLm5hbWUKZW5kCnNldG1ldGF0YWJsZShhLCB7CiAgX19pbmRleCA9IGY7IF9fYWRkID0gZjsgX19kaXYgPSBmOyBfX21vZCA9IGY7IF9fY29uY2F0ID0gZjsgX19wb3cgPSBmOwogIF9fbXVsID0gZjsgX19pZGl2ID0gZjsgX191bm0gPSBmOyBfX2xlbiA9IGY7IF9fc3ViID0gZjsKICBfX3NobCA9IGY7IF9fc2hyID0gZjsgX19ib3IgPSBmOyBfX2J4b3IgPSBmOwogIF9fZXEgPSBmOyBfX2xlID0gZjsgX19sdCA9IGY7IF9fdW5tID0gZjsgX19sZW4gPSBmOyBfX2JhbmQgPSBmOwogIF9fYm5vdCA9IGY7Cn0pCgpsb2NhbCBiID0gc2V0bWV0YXRhYmxlKHt9LCBnZXRtZXRhdGFibGUoYSkpCgphc3NlcnQoYVszXSA9PSAiaW5kZXgiIGFuZCBhXjMgPT0gInBvdyIgYW5kIGEuLmEgPT0gImNvbmNhdCIpCmFzc2VydChhLzMgPT0gImRpdiIgYW5kIDMlYSA9PSAibW9kIikKYXNzZXJ0KGErMyA9PSAiYWRkIiBhbmQgMy1hID09ICJzdWIiIGFuZCBhKjMgPT0gIm11bCIgYW5kCiAgICAgICAtYSA9PSAidW5tIiBhbmQgI2EgPT0gImxlbiIgYW5kIGEmMyA9PSAiYmFuZCIpCmFzc2VydChhICsgMzAwMDAgPT0gImFkZCIgYW5kIGEgLSAzLjAgPT0gInN1YiIgYW5kIGEgKiAzLjAgPT0gIm11bCIgYW5kCiAgICAgICAtYSA9PSAidW5tIiBhbmQgI2EgPT0gImxlbiIgYW5kIGEgJiAzID09ICJiYW5kIikKYXNzZXJ0KGF8MyA9PSAiYm9yIiBhbmQgM35hID09ICJieG9yIiBhbmQgYTw8MyA9PSAic2hsIiBhbmQgYT4+MSA9PSAic2hyIikKYXNzZXJ0IChhPT1iIGFuZCBhLm9wID09ICJlcSIpCmFzc2VydCAoYT49YiBhbmQgYS5vcCA9PSAib3JkZXIiKQphc3NlcnQgKGE+YiBhbmQgYS5vcCA9PSAib3JkZXIiKQphc3NlcnQofmEgPT0gImJub3QiKQoKZG8gICAtLSB0ZXN0aW5nIGZvci1pdGVyYXRvciBuYW1lCiAgbG9jYWwgZnVuY3Rpb24gZigpCiAgICBhc3NlcnQoZGVidWcuZ2V0aW5mbygxKS5uYW1lID09ICJmb3IgaXRlcmF0b3IiKQogIGVuZAoKICBmb3IgaSBpbiBmIGRvIGVuZAplbmQKCgpkbyAgIC0tIHRlc3RpbmcgZGVidWcgaW5mbyBmb3IgZmluYWxpemVycwogIGxvY2FsIG5hbWUgPSBuaWwKCiAgLS0gY3JlYXRlIGEgcGllY2Ugb2YgZ2FyYmFnZSB3aXRoIGEgZmluYWxpemVyCiAgc2V0bWV0YXRhYmxlKHt9LCB7X19nYyA9IGZ1bmN0aW9uICgpCiAgICBsb2NhbCB0ID0gZGVidWcuZ2V0aW5mbygyKSAgIC0tIGdldCBjYWxsZWUgaW5mb3JtYXRpb24KICAgIGFzc2VydCh0Lm5hbWV3aGF0ID09ICJtZXRhbWV0aG9kIikKICAgIG5hbWUgPSB0Lm5hbWUKICBlbmR9KQoKICAtLSByZXBlYXQgdW50aWwgcHJldmlvdXMgZmluYWxpemVyIHJ1bnMgKHNldHRpbmcgJ25hbWUnKQogIHJlcGVhdCBsb2NhbCBhID0ge30gdW50aWwgbmFtZQogIGFzc2VydChuYW1lID09ICJfX2djIikKZW5kCgoKZG8KICBwcmludCgidGVzdGluZyB0cmFjZWJhY2sgc2l6ZXMiKQoKICBsb2NhbCBmdW5jdGlvbiBjb3VudGxpbmVzIChzKQogICAgcmV0dXJuIHNlbGVjdCgyLCBzdHJpbmcuZ3N1YihzLCAiXG4iLCAiIikpCiAgZW5kCgogIGxvY2FsIGZ1bmN0aW9uIGRlZXAgKGx2bCwgbikKICAgIGlmIGx2bCA9PSAwIHRoZW4KICAgICAgcmV0dXJuIChkZWJ1Zy50cmFjZWJhY2soIm1lc3NhZ2UiLCBuKSkKICAgIGVsc2UKICAgICAgcmV0dXJuIChkZWVwKGx2bC0xLCBuKSkKICAgIGVuZAogIGVuZAoKICBsb2NhbCBmdW5jdGlvbiBjaGVja2RlZXAgKHRvdGFsLCBzdGFydCkKICAgIGxvY2FsIHMgPSBkZWVwKHRvdGFsLCBzdGFydCkKICAgIGxvY2FsIHJlc3QgPSBzdHJpbmcubWF0Y2gocywgIl5tZXNzYWdlXG5zdGFjayB0cmFjZWJhY2s6XG4oLiopJCIpCiAgICBsb2NhbCBjbCA9IGNvdW50bGluZXMocmVzdCkKICAgIC0tIGF0IG1vc3QgMTAgbGluZXMgaW4gZmlyc3QgcGFydCwgMTEgaW4gc2Vjb25kLCBwbHVzICcuLi4nCiAgICBhc3NlcnQoY2wgPD0gMTAgKyAxMSArIDEpCiAgICBsb2NhbCBicmsgPSBzdHJpbmcuZmluZChyZXN0LCAiJS4lLiUuIikKICAgIGlmIGJyayB0aGVuICAgLS0gZG9lcyBtZXNzYWdlIGhhdmUgJy4uLic/CiAgICAgIGxvY2FsIHJlc3QxID0gc3RyaW5nLnN1YihyZXN0LCAxLCBicmspCiAgICAgIGxvY2FsIHJlc3QyID0gc3RyaW5nLnN1YihyZXN0LCBicmssICNyZXN0KQogICAgICBhc3NlcnQoY291bnRsaW5lcyhyZXN0MSkgPT0gMTAgYW5kIGNvdW50bGluZXMocmVzdDIpID09IDExKQogICAgZWxzZQogICAgICBhc3NlcnQoY2wgPT0gdG90YWwgLSBzdGFydCArIDIpCiAgICBlbmQKICBlbmQKCiAgZm9yIGQgPSAxLCA1MSwgMTAgZG8KICAgIGZvciBsID0gMSwgZCBkbwogICAgICAtLSB1c2UgY29yb3V0aW5lcyB0byBlbnN1cmUgY29tcGxldGUgY29udHJvbCBvZiB0aGUgc3RhY2sKICAgICAgY29yb3V0aW5lLndyYXAoY2hlY2tkZWVwKShkLCBsKQogICAgZW5kCiAgZW5kCgplbmQKCgpwcmludCgidGVzdGluZyBkZWJ1ZyBmdW5jdGlvbnMgb24gY2h1bmsgd2l0aG91dCBkZWJ1ZyBpbmZvIikKcHJvZyA9IFtbLS0gcHJvZ3JhbSB0byBiZSBsb2FkZWQgd2l0aG91dCBkZWJ1ZyBpbmZvcm1hdGlvbgpsb2NhbCBkZWJ1ZyA9IHJlcXVpcmUnZGVidWcnCmxvY2FsIGEgPSAxMiAgLS0gYSBsb2NhbCB2YXJpYWJsZQoKbG9jYWwgbiwgdiA9IGRlYnVnLmdldGxvY2FsKDEsIDEpCmFzc2VydChuID09ICIodGVtcG9yYXJ5KSIgYW5kIHYgPT0gZGVidWcpICAgLS0gdW5rb3duIG5hbWUgYnV0IGtub3duIHZhbHVlCm4sIHYgPSBkZWJ1Zy5nZXRsb2NhbCgxLCAyKQphc3NlcnQobiA9PSAiKHRlbXBvcmFyeSkiIGFuZCB2ID09IDEyKSAgIC0tIHVua293biBuYW1lIGJ1dCBrbm93biB2YWx1ZQoKLS0gYSBmdW5jdGlvbiB3aXRoIGFuIHVwdmFsdWUKbG9jYWwgZiA9IGZ1bmN0aW9uICgpIGxvY2FsIHg7IHJldHVybiBhIGVuZApuLCB2ID0gZGVidWcuZ2V0dXB2YWx1ZShmLCAxKQphc3NlcnQobiA9PSAiKG5vIG5hbWUpIiBhbmQgdiA9PSAxMikKYXNzZXJ0KGRlYnVnLnNldHVwdmFsdWUoZiwgMSwgMTMpID09ICIobm8gbmFtZSkiKQphc3NlcnQoYSA9PSAxMykKCmxvY2FsIHQgPSBkZWJ1Zy5nZXRpbmZvKGYpCmFzc2VydCh0Lm5hbWUgPT0gbmlsIGFuZCB0LmxpbmVkZWZpbmVkID4gMCBhbmQKICAgICAgIHQubGFzdGxpbmVkZWZpbmVkID09IHQubGluZWRlZmluZWQgYW5kCiAgICAgICB0LnNob3J0X3NyYyA9PSAiPyIpCmFzc2VydChkZWJ1Zy5nZXRpbmZvKDEpLmN1cnJlbnRsaW5lID09IC0xKQoKdCA9IGRlYnVnLmdldGluZm8oZiwgIkwiKS5hY3RpdmVsaW5lcwphc3NlcnQobmV4dCh0KSA9PSBuaWwpICAgIC0tIGFjdGl2ZSBsaW5lcyBhcmUgZW1wdHkKCi0tIGR1bXAvbG9hZCBhIGZ1bmN0aW9uIHdpdGhvdXQgZGVidWcgaW5mbwpmID0gbG9hZChzdHJpbmcuZHVtcChmKSkKCnQgPSBkZWJ1Zy5nZXRpbmZvKGYpCmFzc2VydCh0Lm5hbWUgPT0gbmlsIGFuZCB0LmxpbmVkZWZpbmVkID4gMCBhbmQKICAgICAgIHQubGFzdGxpbmVkZWZpbmVkID09IHQubGluZWRlZmluZWQgYW5kCiAgICAgICB0LnNob3J0X3NyYyA9PSAiPyIpCmFzc2VydChkZWJ1Zy5nZXRpbmZvKDEpLmN1cnJlbnRsaW5lID09IC0xKQoKcmV0dXJuIGEKXV0KCgotLSBsb2FkICdwcm9nJyB3aXRob3V0IGRlYnVnIGluZm8KbG9jYWwgZiA9IGFzc2VydChsb2FkKHN0cmluZy5kdW1wKGxvYWQocHJvZyksIHRydWUpKSkKCmFzc2VydChmKCkgPT0gMTMpCgpkbyAgIC0tIHRlc3RzIGZvciAnc291cmNlJyBpbiBiaW5hcnkgZHVtcHMKICBsb2NhbCBwcm9nID0gW1sKICAgIHJldHVybiBmdW5jdGlvbiAoeCkKICAgICAgcmV0dXJuIGZ1bmN0aW9uICh5KSAKICAgICAgICByZXR1cm4geCArIHkKICAgICAgZW5kCiAgICBlbmQKICBdXQogIGxvY2FsIG5hbWUgPSBzdHJpbmcucmVwKCJ4IiwgMTAwMCkKICBsb2NhbCBwID0gYXNzZXJ0KGxvYWQocHJvZywgbmFtZSkpCiAgLS0gbG9hZCAncCcgYXMgYSBiaW5hcnkgY2h1bmsgd2l0aCBkZWJ1ZyBpbmZvcm1hdGlvbgogIGxvY2FsIGMgPSBzdHJpbmcuZHVtcChwKQogIGFzc2VydCgjYyA+IDEwMDAgYW5kICNjIDwgMjAwMCkgICAtLSBubyByZXBldGl0aW9uIG9mICdzb3VyY2UnIGluIGR1bXAKICBsb2NhbCBmID0gYXNzZXJ0KGxvYWQoYykpCiAgbG9jYWwgZyA9IGYoKQogIGxvY2FsIGggPSBnKDMpCiAgYXNzZXJ0KGgoNSkgPT0gOCkKICBhc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zb3VyY2UgPT0gbmFtZSBhbmQgICAtLSBhbGwgZnVuY3Rpb25zIGhhdmUgJ3NvdXJjZScKICAgICAgICAgZGVidWcuZ2V0aW5mbyhnKS5zb3VyY2UgPT0gbmFtZSBhbmQgCiAgICAgICAgIGRlYnVnLmdldGluZm8oaCkuc291cmNlID09IG5hbWUpCiAgLS0gYWdhaW4sIHdpdGhvdXQgZGVidWcgaW5mbwogIGxvY2FsIGMgPSBzdHJpbmcuZHVtcChwLCB0cnVlKQogIGFzc2VydCgjYyA8IDUwMCkgICAtLSBubyAnc291cmNlJyBpbiBkdW1wCiAgbG9jYWwgZiA9IGFzc2VydChsb2FkKGMpKQogIGxvY2FsIGcgPSBmKCkKICBsb2NhbCBoID0gZygzMCkKICBhc3NlcnQoaCg1MCkgPT0gODApCiAgYXNzZXJ0KGRlYnVnLmdldGluZm8oZikuc291cmNlID09ICc9PycgYW5kICAgLS0gbm8gZnVuY3Rpb24gaGFzICdzb3VyY2UnCiAgICAgICAgIGRlYnVnLmdldGluZm8oZykuc291cmNlID09ICc9PycgYW5kIAogICAgICAgICBkZWJ1Zy5nZXRpbmZvKGgpLnNvdXJjZSA9PSAnPT8nKQplbmQKCnByaW50Ik9LIgoK