ZnVuY3Rpb24gZ2V0UGFnZUtpbmQoKSB7CiAgICB2YXIgcGFyZW50Tm9kZVR4dCA9ICQoJyNzZWxlY3RlZE1haW5OYXYnKS50ZXh0KCk7CiAgICBwYXJlbnROb2RlVHh0ID0gcGFyZW50Tm9kZVR4dC5yZXBsYWNlKCIvXG4iLCIiKTsKICAgIHBhcmVudE5vZGVUeHQgPSBwYXJlbnROb2RlVHh0LnJlcGxhY2UoIrsiLCIiKTsKICAgIHBhcmVudE5vZGVUeHQgPSBwYXJlbnROb2RlVHh0LnRyaW0oKTsKICAgIGlmIChwYXJlbnROb2RlVHh0Lmxlbmd0aCA+IDAgJiYgcGFyZW50Tm9kZVR4dC5jaGFyQXQocGFyZW50Tm9kZVR4dC5sZW5ndGgtMSk9PSdzJykgewogICAgICAgICAgICBwYXJlbnROb2RlVHh0ID0gcGFyZW50Tm9kZVR4dC5zdWJzdHJpbmcoMCwgcGFyZW50Tm9kZVR4dC5sZW5ndGgtMSk7CiAgICB9CiAgICByZXR1cm4gcGFyZW50Tm9kZVR4dDsKfQoKZnVuY3Rpb24gZ2V0T2JqZWN0UXVlcnkoKSB7CiAgICB2YXIgc2VsZWN0ZWROb2RlVHh0ID0gJCgnI2N1cnJlbnRPcmlnaW5hbE5vZGUnKS50ZXh0KCk7CiAgICBzZWxlY3RlZE5vZGVUeHQgPSBzZWxlY3RlZE5vZGVUeHQudHJpbSgpOwogICAgc2VsZWN0ZWROb2RlVHh0ID0gc2VsZWN0ZWROb2RlVHh0LnNwbGl0KCcgJykuam9pbignJyk7Ly9zZWxlY3RlZE5vZGVUeHQucmVwbGFjZSgiICIsICIiKQogICAgcGFyZW50Tm9kZVR4dCA9IGdldFBhZ2VLaW5kKCk7CgogICAgaWYgKHBhcmVudE5vZGVUeHQgPT0gIlNsaWNlIikgewogICAgICAgIHJldHVybiAiJnNsaWNlPSIgKyBzZWxlY3RlZE5vZGVUeHQ7CiAgICB9IGVsc2UgaWYgKHBhcmVudE5vZGVUeHQgPT0gIlNpdGUiKSB7CiAgICAgICAgcmV0dXJuICImc2l0ZT0iICsgc2VsZWN0ZWROb2RlVHh0OwogICAgfSBlbHNlIGlmIChwYXJlbnROb2RlVHh0ID09ICJOb2RlIikgewogICAgICAgIHJldHVybiAiJm5vZGU9IiArIHNlbGVjdGVkTm9kZVR4dDsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuICIiOwogICAgfQp9CgoKZnVuY3Rpb24gc2V0UGFnZVN0YXRJbnQobGFiZWxOYW1lLCB2YWx1ZU5hbWUsIGxlZ2VuZCwgdW5pdHMsIHZhbHVlKSB7CiAgICAkKGxhYmVsTmFtZSkudGV4dChsZWdlbmQpLnNob3coKTsKICAgICQodmFsdWVOYW1lKS50ZXh0KE1hdGgucm91bmQodmFsdWUpK3VuaXRzKS5zaG93KCk7Cn0KCmZ1bmN0aW9uIHNldFBhZ2VTdGF0RmxvYXQobGFiZWxOYW1lLCB2YWx1ZU5hbWUsIGxlZ2VuZCwgdW5pdHMsIHZhbHVlLCBkcCkgewogICAgJChsYWJlbE5hbWUpLnRleHQobGVnZW5kKS5zaG93KCk7CiAgICAkKHZhbHVlTmFtZSkudGV4dChOdW1iZXIodmFsdWUpLnRvRml4ZWQoZHApK3VuaXRzKS5zaG93KCk7Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gbm9kZSBjb3VudCBhbmQgYXZlcmFnZSBjcHUgdXRpbGl6YXRpb24KCmZ1bmN0aW9uIHVwZGF0ZVBhZ2VBbmFseXRpY3NEYXRhKHN1bW1hcnlEYXRhKSB7CiAgICB3aW5kb3cucGFnZUFuYWx5dGljc1VybCA9IHN1bW1hcnlEYXRhWyJkYXRhU291cmNlVXJsIl07CiAgICBsYXN0Um93ID0gc3VtbWFyeURhdGEucm93cy5sZW5ndGgtMTsKCiAgICBzZXRQYWdlU3RhdEludCgiLm5vZGVzTGFiZWwiLCAiLm5vZGVzVmFsdWUiLCAiTm9kZSBDb3VudCIsICIiLCBzdW1tYXJ5RGF0YS5yb3dzW2xhc3RSb3ddWyJjb3VudF9ob3N0bmFtZSJdKTsKICAgIHNldFBhZ2VTdGF0SW50KCIuY3B1TGFiZWwiLCAiLmNwdVZhbHVlIiwgIkF2ZyBMb2FkIiwgIiUiLCBzdW1tYXJ5RGF0YS5yb3dzW2xhc3RSb3ddWyJhdmdfY3B1Il0pOwoKICAgIC8vTmV3IG1pbmlEYXNoYm9hcmQKICAgIHNldFBhZ2VTdGF0SW50KCIjbWluaURhc2hOb2RlQ291bnRMYWJlbCIsICIjbWluaURhc2hOb2RlQ291bnQiLCAiTm9kZSBDb3VudCIsICIiLCBzdW1tYXJ5RGF0YS5yb3dzW2xhc3RSb3ddWyJjb3VudF9ob3N0bmFtZSJdKTsKICAgIHNldFBhZ2VTdGF0SW50KCIjbWluaURhc2hBdmdMb2FkTGFiZWwiLCAiI21pbmlEYXNoQXZnTG9hZCIsICJBdmcgTG9hZCIsICIlIiwgc3VtbWFyeURhdGEucm93c1tsYXN0Um93XVsiYXZnX2NwdSJdKTsKfQoKZnVuY3Rpb24gdXBkYXRlUGFnZUFuYWx5dGljcygpIHsKICAgIHZhciB1cmw9ICcvYW5hbHl0aWNzL2JpZ3F1ZXJ5Lz9hdmc9JWNwdSZjb3VudD0laG9zdG5hbWUmY2FjaGVkPWRlZmF1bHQnICsgZ2V0T2JqZWN0UXVlcnkoKTsKICAgIGNvbnNvbGUubG9nKHVybCk7CiAgICAkLmFqYXgoewogICAgdXJsOiB1cmwsCiAgICBkYXRhVHlwZSA6ICdqc29uJywKICAgIHR5cGUgOiAnR0VUJywKICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKG5ld0RhdGEpCiAgICB7CiAgICAgICAgdXBkYXRlUGFnZUFuYWx5dGljc0RhdGEobmV3RGF0YSk7CiAgICB9Cn0pOwogICAgc2V0VGltZW91dCh1cGRhdGVQYWdlQW5hbHl0aWNzLCAzMDAwMCk7Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gYmFuZHdpZHRoCgpmdW5jdGlvbiB1cGRhdGVQYWdlQmFuZHdpZHRoRGF0YShzdW1tYXJ5RGF0YSkgewogICAgd2luZG93LnBhZ2VCYW5kd2lkdGhVcmwgPSBzdW1tYXJ5RGF0YVsiZGF0YVNvdXJjZVVybCJdOwogICAgbGFzdFJvdyA9IHN1bW1hcnlEYXRhLnJvd3MubGVuZ3RoLTE7CiAgICBzZXRQYWdlU3RhdEZsb2F0KCIuYmFuZHdpZHRoTGFiZWwiLCAiLmJhbmR3aWR0aFZhbHVlIiwgIkJhbmR3aWR0aCIsICIgR2JwcyIsIHN1bW1hcnlEYXRhLnJvd3NbbGFzdFJvd11bInN1bV9jb21wdXRlZF9ieXRlc19zZW50X2Rpdl9lbGFwc2VkIl0qOC4wLzEwMjQvMTAyNC8xMDI0LDIpOwogICAgc2V0UGFnZVN0YXRGbG9hdCgiI21pbmlEYXNoQmFuZHdpZHRoTGFiZWwiLCAiI21pbmlEYXNoQmFuZHdpZHRoIiwgIkJhbmR3aWR0aCIsICIgR2JwcyIsIHN1bW1hcnlEYXRhLnJvd3NbbGFzdFJvd11bInN1bV9jb21wdXRlZF9ieXRlc19zZW50X2Rpdl9lbGFwc2VkIl0qOC4wLzEwMjQvMTAyNC8xMDI0LDIpOwp9CgpmdW5jdGlvbiB1cGRhdGVQYWdlQmFuZHdpZHRoKCkgewogICAgdmFyIHVybD0nL2FuYWx5dGljcy9iaWdxdWVyeS8/Y29tcHV0ZWQ9JWJ5dGVzX3NlbnQvJWVsYXBzZWQmY2FjaGVkPWRlZmF1bHQnICsgZ2V0T2JqZWN0UXVlcnkoKTsKCiAgICBpZiAoZ2V0UGFnZUtpbmQoKSE9IlNsaWNlIikgewogICAgICAgIHVybCA9IHVybCArICImZXZlbnQ9bm9kZV9oZWFydGJlYXQiOwogICAgfQoKICAgICQuYWpheCh7CiAgICB1cmwgOiB1cmwsCiAgICBkYXRhVHlwZSA6ICdqc29uJywKICAgIHR5cGUgOiAnR0VUJywKICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKG5ld0RhdGEpCiAgICB7CiAgICAgICAgdXBkYXRlUGFnZUJhbmR3aWR0aERhdGEobmV3RGF0YSk7CiAgICB9Cn0pOwogICAgc2V0VGltZW91dCh1cGRhdGVQYWdlQmFuZHdpZHRoLCAzMDAwMCk7Cn0KCiQoIGRvY3VtZW50ICkucmVhZHkoZnVuY3Rpb24oKSB7CiAgICB1cGRhdGVQYWdlQW5hbHl0aWNzKCk7CiAgICB1cGRhdGVQYWdlQmFuZHdpZHRoKCk7Cn0pOw0KCg==