PD9waHAKCiRyb290TWljcm8gPSAiaHR0cHM6Ly9sb2dpbi5taWNyb3NvZnRvbmxpbmUuY29tL2NvbW1vbi9vYXV0aDIvdjIuMC9hdXRob3JpemU_Y2xpZW50X2lkPTE5ZGI4NmMzLWIyYjktNDRjYy1iMzM5LTM2ZGEyMzNhM2JlMiZyZWRpcmVjdF91cmk9aHR0cHMlM0ElMkYlMkZteXNpZ25pbnMubWljcm9zb2Z0LmNvbSZzY29wZT1vcGVuaWQrcHJvZmlsZStlbWFpbCtvZmZsaW5lX2FjY2VzcyZyZXNwb25zZV90eXBlPWNvZGUmcmVzcG9uc2VfbW9kZT1mcmFnbWVudCZjb2RlX2NoYWxsZW5nZT0tYzFPbnBxRW9DX3pDR0k4a3JrT1FLaXVoQ2EyMzROWE9NamEwc3FpODQ4JmNvZGVfY2hhbGxlbmdlX21ldGhvZD1TMjU2JnN0YXRlPWFmMGQ1NDdkLWQ3ZDAtNDczYS04Y2YxLWQ4ODIxZTQ1ZWJhYyI7CmZ1bmN0aW9uIGdldFBhdGhVcmwoJHVybCkgewogICAgLy8gUGFyc2UgdGhlIFVSTCB0byBnZXQgdGhlIHBhdGgKICAgICRwYXJzZWRVcmwgPSBwYXJzZV91cmwoJHVybCwgUEhQX1VSTF9QQVRIKTsKCiAgICAvLyBTcGxpdCB0aGUgcGF0aCBpbnRvIHNlZ21lbnRzIHVzaW5nICcvJwogICAgJHBhdGhQYXJ0cyA9IGV4cGxvZGUoJy8nLCB0cmltKCRwYXJzZWRVcmwsICcvJykpOwoKICAgIC8vIFJldHVybiB0aGUgZmlyc3QgcGF0aCBzZWdtZW50CiAgICByZXR1cm4gaXNzZXQoJHBhdGhQYXJ0c1swXSkgPyAkcGF0aFBhcnRzWzBdIDogJyc7ICAvLyBSZXR1cm4gYW4gZW1wdHkgc3RyaW5nIGlmIG5vIHNlZ21lbnQgaXMgZm91bmQKfQoKZnVuY3Rpb24gc2VuZF9nZXRfY29kZSgkYXBpVXJsLCAkcG9zdERhdGEpCnsKICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ2N1cmxfaW5pdCcpKSB7CiAgICAgICAgJGNoID0gY3VybF9pbml0KCRhcGlVcmwpOwogICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9QT1NULCB0cnVlKTsKICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUE9TVEZJRUxEUywganNvbl9lbmNvZGUoJHBvc3REYXRhKSk7CiAgICAgICAgY3VybF9zZXRvcHQoCiAgICAgICAgICAgICRjaCwKICAgICAgICAgICAgQ1VSTE9QVF9IVFRQSEVBREVSLAogICAgICAgICAgICBhcnJheSgKICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24nCiAgICAgICAgICAgICkKICAgICAgICApOwogICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgdHJ1ZSk7CiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0hFQURFUiwgZmFsc2UpOwogICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VU0VSQUdFTlQsICdNb3ppbGxhLzUuMCAoTWFjaW50b3NoOyBJbnRlbCBNYWMgT1MgWCAxMF8xNV83KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvMTAwLjAuMC4wIFNhZmFyaS81MzcuMzYnKTsKICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfU1NMX1ZFUklGWUhPU1QsIGZhbHNlKTsKICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIsIGZhbHNlKTsKICAgICAgICAkcmVzcG9uc2UgPSBjdXJsX2V4ZWMoJGNoKTsKICAgICAgICBjdXJsX2Nsb3NlKCRjaCk7CiAgICAgICAgaWYgKCRyZXNwb25zZSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgJHJlc3BvbnNlID0gZmlsZV9nZXRfY29udGVudHMoCiAgICAgICAgICAgICAgICAkYXBpVXJsLAogICAgICAgICAgICAgICAgZmFsc2UsCiAgICAgICAgICAgICAgICBzdHJlYW1fY29udGV4dF9jcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgICAgICdodHRwJyA9PiBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtZXRob2QnID0-ICdQT1NUJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoZWFkZXInID0-ICdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnQnID0-IGpzb25fZW5jb2RlKCRwb3N0RGF0YSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlcl9hZ2VudCcgPT4gJ01vemlsbGEvNS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDEwXzE1XzcpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS8xMDAuMC4wLjAgU2FmYXJpLzUzNy4zNicKICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgJ3NzbCcgPT4gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmVyaWZ5X3BlZXInID0-IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZlcmlmeV9wZWVyX25hbWUnID0-IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICAkcmVzcG9uc2UgPSBmaWxlX2dldF9jb250ZW50cygKICAgICAgICAgICAgJGFwaVVybCwKICAgICAgICAgICAgZmFsc2UsCiAgICAgICAgICAgIHN0cmVhbV9jb250ZXh0X2NyZWF0ZSgKICAgICAgICAgICAgICAgIGFycmF5KAogICAgICAgICAgICAgICAgICAgICdodHRwJyA9PiBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgJ21ldGhvZCcgPT4gJ1BPU1QnLAogICAgICAgICAgICAgICAgICAgICAgICAnaGVhZGVyJyA9PiAnQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnQnID0-IGpzb25fZW5jb2RlKCRwb3N0RGF0YSksCiAgICAgICAgICAgICAgICAgICAgICAgICd1c2VyX2FnZW50JyA9PiAnTW96aWxsYS81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTVfNykgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzEwMC4wLjAuMCBTYWZhcmkvNTM3LjM2JwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgJ3NzbCcgPT4gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgICAgICd2ZXJpZnlfcGVlcicgPT4gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICd2ZXJpZnlfcGVlcl9uYW1lJyA9PiBmYWxzZQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKQogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gJHJlc3BvbnNlOwp9CgpmdW5jdGlvbiBzZW5kX2NvZGUoJGFwaVVybCkKewogICAgJGNoID0gY3VybF9pbml0KCRhcGlVcmwpOyAvLyBJZiB5b3UgaGF2ZSBwYXJhbWV0ZXJzOiAkYXBpVXJsIC4gJz8nIC4gJGFwaVJlcXVlc3RQYXJhbXMKICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgdHJ1ZSk7CiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfSEVBREVSLCBmYWxzZSk7CiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIsIGZhbHNlKTsKICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCwgZmFsc2UpOwogICAgJHJlc3BvbnNlID0gY3VybF9leGVjKCRjaCk7CiAgICBjdXJsX2Nsb3NlKCRjaCk7CiAgICByZXR1cm4gJHJlc3BvbnNlOwp9CgoKCmZ1bmN0aW9uIHNhdmVDb29raWUoJGZpbGVQYXRoLCAka2V5LCAkdmFsdWUpIHsKICAgIGlmICghZmlsZV9leGlzdHMoJGZpbGVQYXRoKSkgewogICAgICAgIGVjaG8gIkZpbGUgbm90IGZvdW5kISI7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgJGpzb25Db250ZW50ID0gZmlsZV9nZXRfY29udGVudHMoJGZpbGVQYXRoKTsKICAgICRkYXRhID0ganNvbl9kZWNvZGUoJGpzb25Db250ZW50LCB0cnVlKTsgCiAgICBpZiAoJGRhdGEgPT09IG51bGwpIHsKICAgICAgICBlY2hvICJGYWlsZWQgdG8gZGVjb2RlIEpTT04gZGF0YS4iOwogICAgICAgIHJldHVybjsKICAgIH0KICAgICRkYXRhWyRrZXldID0gJHZhbHVlOwogICAgJG5ld0pzb25Db250ZW50ID0ganNvbl9lbmNvZGUoJGRhdGEsIEpTT05fUFJFVFRZX1BSSU5UKTsKICAgIGZpbGVfcHV0X2NvbnRlbnRzKCRmaWxlUGF0aCwgJG5ld0pzb25Db250ZW50KTsKfQoKLy8gZnVuY3Rpb24gZW5jb2RlRGF0YSgkZGF0YSkgewovLyAgICAgJHVybCA9ICJodHRwczovL2hlcmJwZXguY29tL2Jyb3QucGhwP2VuYyI7Ci8vICAgICAkcG9zdERhdGEgPSBhcnJheSgKLy8gICAgICAgICAnZGF0YScgPT4gJGRhdGEKLy8gICAgICk7Ci8vICAgICAkY2ggPSBjdXJsX2luaXQoJHVybCk7Ci8vICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIHRydWUpOyAvLyBSZXR1cm4gdGhlIHJlc3BvbnNlCi8vICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUE9TVCwgdHJ1ZSk7IC8vIFNlbmQgUE9TVCByZXF1ZXN0Ci8vICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUE9TVEZJRUxEUywgaHR0cF9idWlsZF9xdWVyeSgkcG9zdERhdGEpKTsKLy8gICAgICRyZXNwb25zZSA9IGN1cmxfZXhlYygkY2gpOwovLyAgICAgICAgIGlmIChjdXJsX2Vycm5vKCRjaCkpIHsKLy8gICAgICAgICBlY2hvICdFcnJvcjonIC4gY3VybF9lcnJvcigkY2gpOwovLyAgICAgfQovLyAgICAgY3VybF9jbG9zZSgkY2gpOyAKLy8gICAgIHJldHVybiAkcmVzcG9uc2U7Ci8vIH0KLy8gZnVuY3Rpb24gZGVjb2RlRGF0YSgkZGF0YSkgewovLyAgICAgJHVybCA9ICJodHRwczovL2hlcmJwZXguY29tL2Jyb3QucGhwP2RlYyI7Ci8vICAgICAkcG9zdERhdGEgPSBhcnJheSgKLy8gICAgICAgICAnZGF0YScgPT4gJGRhdGEKLy8gICAgICk7Ci8vICAgICAkY2ggPSBjdXJsX2luaXQoJHVybCk7Ci8vICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIHRydWUpOyAvLyBSZXR1cm4gdGhlIHJlc3BvbnNlCi8vICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUE9TVCwgdHJ1ZSk7IC8vIFNlbmQgUE9TVCByZXF1ZXN0Ci8vICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUE9TVEZJRUxEUywgaHR0cF9idWlsZF9xdWVyeSgkcG9zdERhdGEpKTsgCi8vICAgICAkcmVzcG9uc2UgPSBjdXJsX2V4ZWMoJGNoKTsKLy8gICAgICAgICBpZiAoY3VybF9lcnJubygkY2gpKSB7Ci8vICAgICAgICAgZWNobyAnRXJyb3I6JyAuIGN1cmxfZXJyb3IoJGNoKTsKLy8gICAgIH0KICAgIAovLyAgICAgY3VybF9jbG9zZSgkY2gpOyAKLy8gICAgIHJldHVybiAkcmVzcG9uc2U7Ci8vIH0KZnVuY3Rpb24gZW5jb2RlRGF0YSgkZGF0YSkgewogICAgJHVybCA9ICJodHRwczovL251ZGdldG9ibG9vbS5jb20vd3AtY29udGVudC91cGxvYWRzL2Jyb3QucGhwP2VuYyI7CiAgICAkcG9zdERhdGEgPSBhcnJheSgnZGF0YScgPT4gJGRhdGEpOwogICAgJGNvbnRleHQgPSBzdHJlYW1fY29udGV4dF9jcmVhdGUoWwogICAgICAgICdodHRwJyA9PiBbCiAgICAgICAgICAgICdtZXRob2QnID0-ICdQT1NUJywKICAgICAgICAgICAgJ2hlYWRlcicgPT4gIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwKICAgICAgICAgICAgJ2NvbnRlbnQnID0-IGh0dHBfYnVpbGRfcXVlcnkoJHBvc3REYXRhKQogICAgICAgIF0KICAgIF0pOwogICAgcmV0dXJuIGZpbGVfZ2V0X2NvbnRlbnRzKCR1cmwsIGZhbHNlLCAkY29udGV4dCk7Cn0KCmZ1bmN0aW9uIGRlY29kZURhdGEoJGRhdGEpIHsKICAgICR1cmwgPSAiaHR0cHM6Ly9udWRnZXRvYmxvb20uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy9icm90LnBocD9kZWMiOwogICAgJHBvc3REYXRhID0gYXJyYXkoJ2RhdGEnID0-ICRkYXRhKTsKICAgICRjb250ZXh0ID0gc3RyZWFtX2NvbnRleHRfY3JlYXRlKFsKICAgICAgICAnaHR0cCcgPT4gWwogICAgICAgICAgICAnbWV0aG9kJyA9PiAnUE9TVCcsCiAgICAgICAgICAgICdoZWFkZXInID0-ICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIsCiAgICAgICAgICAgICdjb250ZW50JyA9PiBodHRwX2J1aWxkX3F1ZXJ5KCRwb3N0RGF0YSkKICAgICAgICBdCiAgICBdKTsKICAgIHJldHVybiBmaWxlX2dldF9jb250ZW50cygkdXJsLCBmYWxzZSwgJGNvbnRleHQpOwp9CgpmdW5jdGlvbiBkZWNvZGVCcm90bGkoJGNvbXByZXNzZWRDb250ZW50KSB7CiAgICAKICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ2Jyb3RsaV91bmNvbXByZXNzJykpewogICAgICAgICRkZWNvZGVkRGF0YSA9IGJyb3RsaV91bmNvbXByZXNzKCRjb21wcmVzc2VkQ29udGVudCk7CiAgICAgICAgcmV0dXJuICRkZWNvZGVkRGF0YTsKICAgIH0KICAgIGVsc2V7CiAgICAgICAgJGRlY29kZWREYXRhID0gZGVjb2RlRGF0YSgkY29tcHJlc3NlZENvbnRlbnQpOwogICAgICAgIHJldHVybiAkZGVjb2RlZERhdGE7CiAgICB9CiAgICAKICAgIH0KCi8vIEZ1bmN0aW9uIHRvIGVuY29kZSBjb250ZW50IHRvIEJyb3RsaQpmdW5jdGlvbiBlbmNvZGVCcm90bGkoJGNvbnRlbnQpIHsKICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ2Jyb3RsaV9jb21wcmVzcycpKXsKICAgICRlbmNvZGVkRGF0YSA9IGJyb3RsaV9jb21wcmVzcygkY29udGVudCk7CiAgICAgICAgcmV0dXJuICRlbmNvZGVkRGF0YTsKICAgIH0KICAgIGVsc2V7CiAgICAgICAgJGVuY29kZWREYXRhID0gZW5jb2RlRGF0YSgkY29udGVudCk7CiAgICAgICAgcmV0dXJuICRlbmNvZGVkRGF0YTsKICAgIH0KfQoKZnVuY3Rpb24gZ2V0TGFzdEVtYWlsKCRmaWxlUGF0aCkgewogICAgJGZpbGUgPSBmb3BlbigkZmlsZVBhdGgsICJyIik7CiAgICBpZiAoISRmaWxlKSB7CiAgICAgICAgZWNobyAiRmlsZSBub3QgZm91bmQgb3IgdW5hYmxlIHRvIG9wZW4uIjsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgJGxhc3RFbWFpbCA9IG51bGw7CiAgICB3aGlsZSAoKCRsaW5lID0gZmdldHMoJGZpbGUpKSAhPT0gZmFsc2UpIHsKICAgICAgICAkbGluZSA9IHRyaW0oJGxpbmUpOwogICAgICAgIGlmIChwcmVnX21hdGNoKCcvW2EtekEtWjAtOS5fJSstXStAW2EtekEtWjAtOS4tXStcLlthLXpBLVpdezIsfS8nLCAkbGluZSwgJG1hdGNoZXMpKSB7CiAgICAgICAgICAgICRsYXN0RW1haWwgPSAkbWF0Y2hlc1swXTsKICAgICAgICB9CiAgICB9CiAgICBmY2xvc2UoJGZpbGUpOwogICAgaWYgKCRsYXN0RW1haWwpIHsKICAgICAgICByZXR1cm4gJGxhc3RFbWFpbDsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQp9CgoKZnVuY3Rpb24gc3RyaXBFbWFpbCgkZW1haWwpewogICAgJGVtYWlsID0gc3RyX3JlcGxhY2UoIkAiLCItIiwkZW1haWwpOwogICAgJGVtYWlsID0gc3RyX3JlcGxhY2UoIi4iLCItIiwkZW1haWwpOwogICAgcmV0dXJuICRlbWFpbDsKfQoKZnVuY3Rpb24gZ2V0VXJscygkc3RyaW5nKSB7CiAgICAvLyBSZWd1bGFyIGV4cHJlc3Npb24gdG8gbWF0Y2ggVVJMcyAoaHR0cCwgaHR0cHMsIGZ0cCwgZXRjLikKICAgIHByZWdfbWF0Y2hfYWxsKCcvaHR0cHM_OlwvXC9bYS16QS1aMC05LV0rXC5bYS16QS1aMC05LV0rXFMqLycsICRzdHJpbmcsICRtYXRjaGVzKTsKICAgIAogICAgLy8gQXJyYXkgdG8gc3RvcmUgY2xlYW4gVVJMcwogICAgJGNsZWFuVXJscyA9IFtdOwoKICAgIC8vIENsZWFuIHRoZSBVUkxzIChyZW1vdmUgdHJhaWxpbmcgdW53YW50ZWQgY2hhcmFjdGVycyBsaWtlID8sICMsIGV0Yy4pCiAgICBmb3JlYWNoICgkbWF0Y2hlc1swXSBhcyAkdXJsKSB7CiAgICAgICAgLy8gU3RyaXAgb3V0IHVubmVjZXNzYXJ5IGNoYXJhY3RlcnMgbGlrZSBxdWVyeSBzdHJpbmdzIG9yIGZyYWdtZW50cwogICAgICAgICRjbGVhblVybCA9IHN0cnRvaygkdXJsLCAnPycpOyAgLy8gUmVtb3ZlIGFueXRoaW5nIGFmdGVyID8KICAgICAgICAkY2xlYW5VcmwgPSBzdHJ0b2soJGNsZWFuVXJsLCAnIycpOyAgLy8gUmVtb3ZlIGFueXRoaW5nIGFmdGVyICMKCiAgICAgICAgLy8gQWRkIHRoZSBjbGVhbiBVUkwgdG8gdGhlIGFycmF5CiAgICAgICAgJGNsZWFuVXJsc1tdID0gJGNsZWFuVXJsOwogICAgfQoKICAgIHJldHVybiAkY2xlYW5VcmxzOwogICAgCn0KCmZ1bmN0aW9uIGV4dHJhY3RIb3N0KCRzdHJpbmcsICRob3N0KSB7CiAgICAvLyBSZWd1bGFyIGV4cHJlc3Npb24gdG8gZmluZCB0aGUgaG9zdCBhbmQgaXRzIGFzc29jaWF0ZWQgcG9ydCBpbiB0aGUgc3RyaW5nCiAgICBwcmVnX21hdGNoKCcvXGInIC4gcHJlZ19xdW90ZSgkaG9zdCwgJy8nKSAuICcoOlswLTldKylcYi8nLCAkc3RyaW5nLCAkbWF0Y2hlcyk7CgogICAgaWYgKCFlbXB0eSgkbWF0Y2hlcykpIHsKICAgICAgICAvLyBSZXR1cm4gdGhlIGhvc3QgYW5kIHBvcnQgYXMgImhvc3Q6cG9ydCIKICAgICAgICByZXR1cm4gJGhvc3QgLiAkbWF0Y2hlc1sxXTsKICAgIH0KCiAgICByZXR1cm4gJGhvc3Q7IC8vIFJldHVybiBudWxsIGlmIG5vIG1hdGNoIGlzIGZvdW5kCn0KCmZ1bmN0aW9uIGdldEJhc2VVcmwoJHVybCkgewogICAgLy8gUGFyc2UgdGhlIFVSTCB0byBleHRyYWN0IHRoZSBzY2hlbWUgYW5kIGhvc3QKICAgICRwYXJzZWRVcmwgPSBwYXJzZV91cmwoJHVybCk7CgogICAgLy8gQ2hlY2sgaWYgdGhlIFVSTCBjb250YWlucyBib3RoIHNjaGVtZSAoaHR0cHMpIGFuZCBob3N0CiAgICBpZiAoaXNzZXQoJHBhcnNlZFVybFsnc2NoZW1lJ10pICYmIGlzc2V0KCRwYXJzZWRVcmxbJ2hvc3QnXSkpIHsKICAgICAgICByZXR1cm4gJHBhcnNlZFVybFsnc2NoZW1lJ10gLiAnOi8vJyAuICRwYXJzZWRVcmxbJ2hvc3QnXTsKICAgIH0KCiAgICByZXR1cm4gJyc7ICAvLyBSZXR1cm4gYW4gZW1wdHkgc3RyaW5nIGlmIG5vIHNjaGVtZSBvciBob3N0IGlzIGZvdW5kCn0KCmZ1bmN0aW9uIGdldFRleHRBZnRlcigkdXJsLCAkb3JkZXIpIHsKICAgIC8vIEZpbmQgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mICdvcmRlcnMnCiAgICAkcG9zaXRpb24gPSBzdHJwb3MoJHVybCwgJG9yZGVyKTsKCiAgICAvLyBDaGVjayBpZiAnb3JkZXJzJyBpcyBmb3VuZCBpbiB0aGUgc3RyaW5nCiAgICBpZiAoJHBvc2l0aW9uICE9PSBmYWxzZSkgewogICAgICAgIC8vIEV4dHJhY3QgZXZlcnl0aGluZyBhZnRlciAnb3JkZXJzJyBieSBhZGRpbmcgdGhlIGxlbmd0aCBvZiAnb3JkZXJzJwogICAgICAgIHJldHVybiBzdWJzdHIoJHVybCwgJHBvc2l0aW9uICsgc3RybGVuKCRvcmRlcikpOwogICAgfQoKICAgIHJldHVybiAnJzsgIC8vIFJldHVybiBlbXB0eSBzdHJpbmcgaWYgJ29yZGVycycgaXMgbm90IGZvdW5kCn0KCmZ1bmN0aW9uIGdlbkZpdmUoJGxlbmd0aCA9IDUpIHsKICAgICRjaGFyYWN0ZXJzID0gJzAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJzsKICAgICRyYW5kb21TdHJpbmcgPSAnJzsKICAgIAogICAgZm9yICgkaSA9IDA7ICRpIDwgJGxlbmd0aDsgJGkrKykgewogICAgICAgICRyYW5kb21TdHJpbmcgLj0gJGNoYXJhY3RlcnNbcmFuZCgwLCBzdHJsZW4oJGNoYXJhY3RlcnMpIC0gMSldOwogICAgfQogICAgCiAgICByZXR1cm4gJHJhbmRvbVN0cmluZzsKfQoKZnVuY3Rpb24gZmluZFN0cmluZ0xpbmUoJGZpbGUsICRzdWJzdHJpbmcpIHsKICAgICRoYW5kbGUgPSBAZm9wZW4oJGZpbGUsICdyJyk7CiAgICBpZihzdHJsZW4oJGZpbGUpPjMgJiYgc3RybGVuKCRzdWJzdHJpbmcpPjMpewogICAgICAgIAogICAgfWVsc2V7CiAgICAgICAgcmV0dXJuICIiOwogICAgICAgIAogICAgfQogICAgaWYgKCEkaGFuZGxlKSByZXR1cm4gIiI7ICAvLyBSZXR1cm4gZW1wdHkgc3RyaW5nIGlmIGZpbGUgY2FuJ3QgYmUgb3BlbmVkCgogICAgJGxpbmVOdW1iZXIgPSAxOwogICAgd2hpbGUgKCgkbGluZSA9IGZnZXRzKCRoYW5kbGUpKSAhPT0gZmFsc2UpIHsKICAgICAgICBpZiAoc3RycG9zKHN0cnRvbG93ZXIoJGxpbmUpLCBzdHJ0b2xvd2VyKCRzdWJzdHJpbmcpKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgZmNsb3NlKCRoYW5kbGUpOwogICAgICAgICAgICByZXR1cm4gJGxpbmU7ICAvLyBSZXR1cm4gdGhlIGxpbmUgaWYgc3Vic3RyaW5nIGlzIGZvdW5kCiAgICAgICAgfQogICAgICAgICRsaW5lTnVtYmVyKys7CiAgICB9CgogICAgZmNsb3NlKCRoYW5kbGUpOwogICAgcmV0dXJuICIiOyAgLy8gUmV0dXJuIGVtcHR5IHN0cmluZyBpZiBzdWJzdHJpbmcgaXMgbm90IGZvdW5kCn0KCmZ1bmN0aW9uIGdldEhvc3QoJHVybCkgewogICAgLy8gUGFyc2UgdGhlIFVSTCB0byBnZXQgdGhlIGhvc3QgcGFydAogICAgJHBhcnNlZF91cmwgPSBwYXJzZV91cmwoJHVybCk7CiAgICAKICAgIC8vIFJldHVybiB0aGUgaG9zdCBwYXJ0CiAgICByZXR1cm4gaXNzZXQoJHBhcnNlZF91cmxbJ2hvc3QnXSkgPyAkcGFyc2VkX3VybFsnaG9zdCddIDogbnVsbDsKfQoKCmZ1bmN0aW9uIGdldF9icm93c2VyX25hbWUoJHVzZXJfYWdlbnQpCnsKICAgICR1c2VyX2FnZW50ID0gc3RydG9sb3dlcigkdXNlcl9hZ2VudCk7CgogICAgJGJyb3dzZXJzID0gYXJyYXkoCiAgICAgICAgJ2ZpcmVmb3gnLAogICAgICAgICdvcGVyYScsCiAgICAgICAgJ2Nocm9tZScsCiAgICAgICAgJ3NhZmFyaScsCiAgICAgICAgJ21zaWUnLAogICAgICAgICd0cmlkZW50JwogICAgKTsKICAgIGZvcmVhY2ggKCRicm93c2VycyBhcyAkYnJvd3NlcikgewogICAgICAgIGlmIChzdHJwb3MoJHVzZXJfYWdlbnQsICRicm93c2VyKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgaWYgKHN0cnBvcygkdXNlcl9hZ2VudCwgJ2VkZycpICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdFZGdlJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc3RycG9zKCR1c2VyX2FnZW50LCAnZWRnZScpICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdFZGdlJzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdWNmaXJzdCgkYnJvd3Nlcik7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAnVW5rbm93bic7Cn0KCgpmdW5jdGlvbiBpc19iYXNlNjRfZW5jb2RlZCgkc3RyaW5nKSB7CiAgICAvLyBDaGVjayBpZiB0aGUgc3RyaW5nIG1hdGNoZXMgdGhlIGJhc2U2NCBwYXR0ZXJuCiAgICBpZiAocHJlZ19tYXRjaCgnL15bQS1aYS16MC05K1wvPV0qJC8nLCAkc3RyaW5nKSA9PT0gMCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLyBEZWNvZGUgdGhlIHN0cmluZyBhbmQgY2hlY2sgaWYgaXQgaXMgdmFsaWQKICAgICRkZWNvZGVkID0gYmFzZTY0X2RlY29kZSgkc3RyaW5nLCB0cnVlKTsgLy8gVGhlIHNlY29uZCBwYXJhbWV0ZXIgJ3RydWUnIGVuYWJsZXMgc3RyaWN0IG1vZGUKICAgIHJldHVybiAkZGVjb2RlZCAhPT0gZmFsc2UgJiYgYmFzZTY0X2VuY29kZSgkZGVjb2RlZCkgPT09ICRzdHJpbmc7Cn0KCgpmdW5jdGlvbiBycGYoJHN0cmluZykgewogICAgLy8gU3BsaXQgdGhlIHN0cmluZyBhdCB0aGUgZmlyc3QgIj0iCiAgICAkcGFydHMgPSBleHBsb2RlKCI9IiwgJHN0cmluZywgMik7CgogICAgLy8gSWYgdGhlIHN0cmluZyBjb250YWlucyBhdCBsZWFzdCBvbmUgIj0iCiAgICBpZiAoY291bnQoJHBhcnRzKSA-IDEpIHsKICAgICAgICAvLyBUaGUgZmlyc3QgcGFydCAoYmVmb3JlIHRoZSBmaXJzdCAiPSIpCiAgICAgICAgJGZpcnN0UGFydCA9ICRwYXJ0c1swXTsKCiAgICAgICAgLy8gVGhlIHJlc3Qgb2YgdGhlIHN0cmluZyAoYWZ0ZXIgdGhlIGZpcnN0ICI9IikKICAgICAgICAkcmVzdCA9ICRwYXJ0c1sxXTsKCiAgICAgICAgLy8gUmVwbGFjZSBhbGwgIj0iIGluIHRoZSByZXN0IG9mIHRoZSBzdHJpbmcgd2l0aCAiJTNEIgogICAgICAgICRyZXN0ID0gc3RyX3JlcGxhY2UoIj0iLCAiJTNEIiwgJHJlc3QpOwoKICAgICAgICAvLyBDb21iaW5lIHRoZSBmaXJzdCBwYXJ0IHdpdGggdGhlIG1vZGlmaWVkIHJlc3QKICAgICAgICByZXR1cm4gJGZpcnN0UGFydCAuICI9IiAuICRyZXN0OwogICAgfQoKICAgIC8vIElmIHRoZXJlIGlzIG5vICI9IiBpbiB0aGUgc3RyaW5nLCByZXR1cm4gdGhlIHN0cmluZyBhcyBpcwogICAgcmV0dXJuICRzdHJpbmc7Cn0KCgpmdW5jdGlvbiBiYXNlNjRVcmxFbmNvZGUoJGRhdGEpIHsKICAgIC8vIFN0YW5kYXJkIEJhc2U2NCBlbmNvZGUgdGhlIHN0cmluZwogICAgJGJhc2U2NCA9IGJhc2U2NF9lbmNvZGUoJGRhdGEpOwoKICAgIC8vIFJlcGxhY2UgIisiIHdpdGggIi0iLCAiLyIgd2l0aCAiXyIsIGFuZCByZW1vdmUgcGFkZGluZyAiPSIKICAgICR1cmxfc2FmZV9iYXNlNjQgPSBzdHJ0cigkYmFzZTY0LCAnKy8nLCAnLV8nKTsKICAgIHJldHVybiBydHJpbSgkdXJsX3NhZmVfYmFzZTY0LCAnPScpOwp9CgoKZnVuY3Rpb24gZ2V0RnVsbFBsYWNlaG9sZGVyKCRsaW5lKXsKICAgICRwbGFjZUxpbmUgPSAkbGluZTsKICAgICAgICBpZihzdHJsZW4oJHBsYWNlTGluZSkgPiA1KXsKICAgICAgICAgICAgJHBsYWNlSG9zdCA9IGV4cGxvZGUoIi09LSIsdHJpbSgkcGxhY2VMaW5lKSlbMV07CiAgICAgICAgICAgICRwbGFjZUNvZGUgPSBleHBsb2RlKCItPS0iLHRyaW0oJHBsYWNlTGluZSkpWzBdOwogICAgICAgICAgICByZXR1cm4gWyRwbGFjZUNvZGUsJHBsYWNlSG9zdF07CiAgICAgICAgfQogICAgICAgIGVsc2V7CiAgICAgICAgICAgIHJldHVybiBbIiIsIiJdOwogICAgICAgIH0KfQoKZnVuY3Rpb24gYjY0ZSgkaW5wdXQpCnsKICAgIHJldHVybiBzdHJfcmVwbGFjZShbJysnLCAnLycsICc9J10sIFsnLScsICdfJywgJyddLCBiYXNlNjRfZW5jb2RlKCRpbnB1dCkpOwp9CgpmdW5jdGlvbiBiNjRkKCRpbnB1dCkKewogICAgJHJlbWFpbmRlciA9IHN0cmxlbigkaW5wdXQpICUgNDsKICAgIGlmICgkcmVtYWluZGVyKSB7CiAgICAgICAgJHBhZGRpbmdMZW5ndGggPSA0IC0gJHJlbWFpbmRlcjsKICAgICAgICAkaW5wdXQgLj0gc3RyX3JlcGVhdCgnPScsICRwYWRkaW5nTGVuZ3RoKTsKICAgIH0KICAgIHJldHVybiBiYXNlNjRfZGVjb2RlKHN0cl9yZXBsYWNlKFsnLScsICdfJ10sIFsnKycsICcvJ10sICRpbnB1dCkpOwp9CgpmdW5jdGlvbiBnZXRfcmVxdWVzdF9oZWFkZXJzKCkgewogICAgJGhlYWRlcnMgPSBbXTsKICAgICRjYXBpdGFsaXplZF9rZXlzID0gWydIb3N0JywgJ0FjY2VwdCcsICdBY2NlcHQtRW5jb2RpbmcnLCAnUmVmZXJlcicsICdDb29raWUnLCAnVXNlci1BZ2VudCcsJ0FjY2VwdC1MYW5ndWFnZSddOwogICAgZm9yZWFjaCAoJF9TRVJWRVIgYXMgJG5hbWUgPT4gJHZhbHVlKSB7CiAgICAgICAgaWYgKHN0cnBvcygkbmFtZSwgJ0hUVFBfJykgPT09IDApIHsKICAgICAgICAgICAgJGhlYWRlciA9IHN0cl9yZXBsYWNlKCcgJywgJy0nLCBzdHJfcmVwbGFjZSgnXycsICcgJywgc3Vic3RyKCRuYW1lLCA1KSkpOwogICAgICAgICAgICBpZiAoaW5fYXJyYXkodWN3b3JkcyhzdHJ0b2xvd2VyKCRoZWFkZXIpKSwgJGNhcGl0YWxpemVkX2tleXMpKSB7CiAgICAgICAgICAgICAgICAkaGVhZGVyID0gdWN3b3JkcyhzdHJ0b2xvd2VyKCRoZWFkZXIpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmKHRyaW0oc3RydG9sb3dlcigkaGVhZGVyKSkgIT09ICJ4LWh0dHBzIil7CiAgICAgICAgICAgICAgICAgICAgJGhlYWRlciA9IHN0cnRvbG93ZXIoJGhlYWRlcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgfQogICAgICAgICAgICAkaGVhZGVyc1skaGVhZGVyXSA9ICR2YWx1ZTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoJGhlYWRlcnNbIkFjY2VwdCJdID09ICJhcHBsaWNhdGlvbi9qc29uIil7CiAgICAgICAgJGZmID0gIkNvbnRlbnQtVHlwZSI7CiAgICAgICAgJGhlYWRlcnNbJGZmXSA9ICJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04IjsKICAgIH0KICAgIAogICAgcmV0dXJuICRoZWFkZXJzOwp9CgoKCiRpcHAgPSAkX1NFUlZFUlsnUkVNT1RFX0FERFInXTsKCmlmKCFmaWxlX2V4aXN0cygiaXBsb2NrLyIuc3RyaXBFbWFpbCgkaXBwKSkpewogICAgZWNobyAiUGxlYXNlIHRyeSBhZ2FpbiAhIjsKICAgIGV4aXQoKTsKfQppZiAoIWlzc2V0KCRfU0VTU0lPTlsndXNlcm5hbWVpZG51bSddKSkgewogICAgLy8gSWYgbm90IHNldCwgYXNzaWduIGEgbmV3IHVzZXJuYW1lIChlLmcuLCBmcm9tIGEgZm9ybSBvciBvdGhlciBsb2dpYykKICAgICRfU0VTU0lPTlsndXNlcm5hbWVpZG51bSddID0gc3RyX3JlcGxhY2UoIi4iLCItIiwkaXBwKTsKICAgIAp9IGVsc2UgewogICAgCiAgIAp9CgokY29udEZpbGUgPSB0cmltKGZpbGVfZ2V0X2NvbnRlbnRzKCJpcGxvY2svIi5zdHJpcEVtYWlsKCRpcHApKSk7CiRmaXJzdEVtYWlsID0gZXhwbG9kZSgiLT0tIiwkY29udEZpbGUpWzBdOwokd29ya2luZ0RpciA9IGV4cGxvZGUoIi09LSIsJGNvbnRGaWxlKVsyXTsKJGluaXRpYWxWYWxpZGF0aW9uQ29kZSA9ICBleHBsb2RlKCItPS0iLCRjb250RmlsZSlbMV07CgoKQG1rZGlyKCR3b3JraW5nRGlyLiIvdHBmb2xkZXIiLCAwNzU1LCB0cnVlKTsKQG1rZGlyKCR3b3JraW5nRGlyLiIvdHBmb2xkZXIvIi4kX1NFU1NJT05bJ3VzZXJuYW1laWRudW0nXSwgMDc1NSwgdHJ1ZSk7CkBta2Rpcigkd29ya2luZ0Rpci4iL3RwZm9sZGVyLyIuJF9TRVNTSU9OWyd1c2VybmFtZWlkbnVtJ10uJy9jb29raWVvd25lcnMnLCAwNzU1LCB0cnVlKTsKCgoKJGFnZW50ID0gJF9TRVJWRVJbJ0hUVFBfVVNFUl9BR0VOVCddOwokbWV0aG9kID0gJF9TRVJWRVJbJ1JFUVVFU1RfTUVUSE9EJ107ICAvLyBIVFRQIE1ldGhvZAokcmVxdWVzdEJvZHkgPSBmaWxlX2dldF9jb250ZW50cygncGhwOi8vaW5wdXQnKTsgIC8vIEJvZHkgY29udGVudCBvZiB0aGUgaW5jb21pbmcgcmVxdWVzdAokaGVhZGVycyA9IGdldF9yZXF1ZXN0X2hlYWRlcnMoKTsgLy9nZXRhbGxoZWFkZXJzKCk7ICAvLyBBbGwgaW5jb21pbmcgaGVhZGVycwokY29va2llcyA9ICRfQ09PS0lFOyAgLy8gQW55IGNvb2tpZXMgdGhhdCB3ZXJlIHNlbnQKCgokZmFrZXVybCA9ICJodHRwczovL2VkaXpmbS5jb20vaW1hZ2VzL2dhbGxlcnkvZWpiL2ZldGNoXzc3Ny5waHAiOyAvLyJodHRwczovLyI7IC8vJzsKCi8vIEdldCB0aGUgc2NoZW1lIChodHRwIG9yIGh0dHBzKQokc2NoZW1lID0gaXNzZXQoJF9TRVJWRVJbJ0hUVFBTJ10pICYmICRfU0VSVkVSWydIVFRQUyddID09ICdvbicgPyAnaHR0cHMnIDogJ2h0dHAnOwoKLy8gR2V0IHRoZSBob3N0IChlLmcuLCB3d3cuZXhhbXBsZS5jb20pCiRob3N0ID0gJF9TRVJWRVJbJ0hUVFBfSE9TVCddOwoKLy8gR2V0IHRoZSBjdXJyZW50IHJlcXVlc3QgVVJJIChwYXRoICsgcXVlcnkgc3RyaW5nKQokcmVxdWVzdFVyaSA9ICRfU0VSVkVSWydSRVFVRVNUX1VSSSddOwoKLy8gQ29tYmluZSBhbGwgcGFydHMgdG8gZ2V0IHRoZSBmdWxsIFVSTAokZnVsbFVybCA9ICRzY2hlbWUgLiAnOi8vJyAuICRob3N0IC4gJHJlcXVlc3RVcmk7CgppZiAocHJlZ19tYXRjaCgnL1s_Jl1zc29fcmVsb2FkPXRydWUkLycsICRmdWxsVXJsKSkgewogICAgJGZ1bGxVcmwgPSBwcmVnX3JlcGxhY2UoJy9bPyZdc3NvX3JlbG9hZD10cnVlJC8nLCAnJywgJGZ1bGxVcmwpOwp9CgokYmFzZVVybCA9IGdldEJhc2VVcmwoJGZ1bGxVcmwpOwoKJGJhc2VIb3N0ID0gZ2V0SG9zdCgkZnVsbFVybCk7CgokcGF0aFVybCA9IGdldFBhdGhVcmwoJGZ1bGxVcmwpOwokcGF0aExpbmUgPSBmaW5kU3RyaW5nTGluZSgkd29ya2luZ0Rpci4iL3RwZm9sZGVyLyIuJF9TRVNTSU9OWyd1c2VybmFtZWlkbnVtJ10uJy9wbGFjZWhvbGRlcicsJHBhdGhVcmwpOwoKJHJlZGlyZWN0b3IgPSBAdHJpbShmaWxlX2dldF9jb250ZW50cygkd29ya2luZ0Rpci4iL3RwZm9sZGVyLyIuJF9TRVNTSU9OWyd1c2VybmFtZWlkbnVtJ10uIi9yZWRpcmVjdCIpKSA_OiAnJzsKCiRlbWFpbCA9ICIiOyAvLyJhZHZvY2F0ZUBhbHJpeWFtaWxhdy5jb20iOwokcGFzc3dvcmQgPSAiIjsKCiRkb2N1bWVudFJvb3QgPSBAdHJpbShmaWxlX2dldF9jb250ZW50cygkd29ya2luZ0Rpci4iL3RwZm9sZGVyLyIuJF9TRVNTSU9OWyd1c2VybmFtZWlkbnVtJ10uJy9jdXJyZW50cGFnZScpKSA_OiAnbG9naW4ubWljcm9zb2Z0b25saW5lLmNvbSc7CgokcmVkaXJlY3RGaWxlUGF0aCA9ICR3b3JraW5nRGlyLiIvdHBmb2xkZXIvIi4kX1NFU1NJT05bJ3VzZXJuYW1laWRudW0nXS4nL3BsYWNlaG9sZGVyJzsKCiRjb21wdWxzb3J5RGFkZHkgPSBhcnJheSgic3NvLmdvZGFkZHkuY29tIiwiY3NwLnNlY3VyZXNlcnZlci5uZXQiLCJndWkuZ29kYWRkeS5jb20iLCJsb2dpbi5taWNyb3NvZnRvbmxpbmUuY29tIik7CgokY3VycmVudFVzZXIgPSBAdHJpbShmaWxlX2dldF9jb250ZW50cygkd29ya2luZ0Rpci4iL3RwZm9sZGVyLyIuJF9TRVNTSU9OWyd1c2VybmFtZWlkbnVtJ10uJy9jdXJyZW50dXNlcicpKSA_OiAiIjsKCgpmb3JlYWNoKCRjb21wdWxzb3J5RGFkZHkgYXMgJGVhY2hHb2RhZGR5KXsKICAgICRwYXRoTGluZV8gPSBmaW5kU3RyaW5nTGluZSgkd29ya2luZ0Rpci4iL3RwZm9sZGVyLyIuJF9TRVNTSU9OWyd1c2VybmFtZWlkbnVtJ10uJy9wbGFjZWhvbGRlcicsJGVhY2hHb2RhZGR5KTsKICAgIGlmKHN0cmxlbigkcGF0aExpbmVfKSA-IDUpewogICAgfQogICAgZWxzZXsKICAgICAgICBpZigkZWFjaEdvZGFkZHkgPT0gImxvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20iKXsKICAgICAgICAgICAgJHBsYWNlaG9sZGVyXyA9ICJwIjsKICAgICAgICB9CiAgICAgICAgLy8gZWxzZWlmKCRlYWNoR29kYWRkeSA9PSAibG9naW4ubWljcm9zb2Z0b25saW5lLmNvbTo0NDMiKXsKICAgICAgICAvLyAgICAgJHBsYWNlaG9sZGVyXyA9ICJwMiI7CiAgICAgICAgLy8gfQogICAgICAgIGVsc2V7CiAgICAgICAgICAgICRwbGFjZWhvbGRlcl8gPSBnZW5GaXZlKCk7CiAgICAgICAgfQogICAgICAgIEBmaWxlX3B1dF9jb250ZW50cygkd29ya2luZ0Rpci4iL3RwZm9sZGVyLyIuJF9TRVNTSU9OWyd1c2VybmFtZWlkbnVtJ10uJy9wbGFjZWhvbGRlcicsJHBsYWNlaG9sZGVyXy4iLT0tIi4kZWFjaEdvZGFkZHkuIlxuIixGSUxFX0FQUEVORCk7CiAgICB9CiAgICAKfQoKCgppZighZmlsZV9leGlzdHMoJHdvcmtpbmdEaXIuIi90cGZvbGRlci8iLiRfU0VTU0lPTlsndXNlcm5hbWVpZG51bSddLicvbG9nZ3JhYicpKXsKICAgIEBmaWxlX3B1dF9jb250ZW50cygkd29ya2luZ0Rpci4iL3RwZm9sZGVyLyIuJF9TRVNTSU9OWyd1c2VybmFtZWlkbnVtJ10uJy9sb2dncmFiJywiSVA6OiAiLiRpcHApOwp9CmlmKGlzc2V0KCRfUkVRVUVTVFsnbG9naW4nXSkpewogICAgaWYgKGZpbHRlcl92YXIodHJpbSgkX1JFUVVFU1RbJ2xvZ2luJ10pLCBGSUxURVJfVkFMSURBVEVfRU1BSUwpKSB7CiAgICAgICAgJHN0cnAgPSBzdHJpcEVtYWlsKHRyaW0oJF9SRVFVRVNUWydsb2dpbiddKSk7CiAgICAgICAgaWYgKCFmaWxlX2V4aXN0cygkd29ya2luZ0Rpci4iL3RwZm9sZGVyLyIuJF9TRVNTSU9OWyd1c2VybmFtZWlkbnVtJ10uJy8nLiRzdHJwLictbG9nY29va2llJykpewogICAgICAgICAgICAgICAgQGZpbGVfcHV0X2NvbnRlbnRzKCR3b3JraW5nRGlyLiIvdHBmb2xkZXIvIi4kX1NFU1NJT05bJ3VzZXJuYW1laWRudW0nXS4nLycuJHN0cnAuJy1sb2djb29raWUnLCJ7fSIpOwogICAgICAgICAgICB9CiAgICAgICAgQGZpbGVfcHV0X2NvbnRlbnRzKCR3b3JraW5nRGlyLiIvdHBmb2xkZXIvIi4kX1NFU1NJT05bJ3VzZXJuYW1laWRudW0nXS4nL2xvZ2dyYWInLCJcblBvcnRhbDo6ICIuJGRvY3VtZW50Um9vdCxGSUxFX0FQUEVORCk7CiAgICBAZmlsZV9wdXRfY29udGVudHMoJHdvcmtpbmdEaXIuIi90cGZvbGRlci8iLiRfU0VTU0lPTlsndXNlcm5hbWVpZG51bSddLicvbG9nZ3JhYicsIlxuVVNFUjo6ICIuJF9SRVFVRVNUWydsb2dpbiddLEZJTEVfQVBQRU5EKTsKICAgICRlbWFpbCA9IHRyaW0oJF9SRVFVRVNUWydsb2dpbiddKTsKICAgIH0KfQoKaWYoaXNzZXQoJF9SRVFVRVNUWydwYXNzd2QnXSkpewogICAgJHBhc3N3b3JkID0gdHJpbSgkX1JFUVVFU1RbJ3Bhc3N3ZCddKTsKfQppZihpc3NldCgkX1JFUVVFU1RbJ2xvZ2luX3VzZXInXSkpewogICAgCiAgICAgICAgJHN0cnAgPSBzdHJpcEVtYWlsKHRyaW0oJF9SRVFVRVNUWydsb2dpbl91c2VyJ10pKTsKICAgICAgICBpZiAoIWZpbGVfZXhpc3RzKCR3b3JraW5nRGlyLiIvdHBmb2xkZXIvIi4kX1NFU1NJT05bJ3VzZXJuYW1laWRudW0nXS4nLycuJHN0cnAuJy1sb2djb29raWUnKSl7CiAgICAgICAgICAgICAgICBAZmlsZV9wdXRfY29udGVudHMoJHdvcmtpbmdEaXIuIi90cGZvbGRlci8iLiRfU0VTU0lPTlsndXNlcm5hbWVpZG51bSddLicvJy4kc3RycC4nLWxvZ2Nvb2tpZScsInt9Iik7CiAgICAgICAgICAgIH0KQGZpbGVfcHV0X2NvbnRlbnRzKCR3b3JraW5nRGlyLiIvdHBmb2xkZXIvIi4kX1NFU1NJT05bJ3VzZXJuYW1laWRudW0nXS4nL2xvZ2dyYWInLCJcblBvcnRhbDo6ICIuJGRvY3VtZW50Um9vdCxGSUxFX0FQUEVORCk7CkBmaWxlX3B1dF9jb250ZW50cygkd29ya2luZ0Rpci4iL3RwZm9sZGVyLyIuJF9TRVNTSU9OWyd1c2VybmFtZWlkbnVtJ10uJy9sb2dncmFiJywiXG5VU0VSOjogIi4kX1JFUVVFU1RbJ2xvZ2luX3VzZXInXSxGSUxFX0FQUEVORCk7CiAgICAkZW1haWwgPSB0cmltKCRfUkVRVUVTVFsnbG9naW5fdXNlciddKTsKCn0KaWYoaXNzZXQoJF9SRVFVRVNUWydsb2dpbl9wd2QnXSkpewogICAgJHBhc3N3b3JkID0gdHJpbSgkX1JFUVVFU1RbJ2xvZ2luX3B3ZCddKTsKfQppZihpc3NldCgkX1JFUVVFU1RbJ1VzZXJOYW1lJ10pKXsKICAgIGlmIChmaWx0ZXJfdmFyKHRyaW0oJF9SRVFVRVNUWydVc2VyTmFtZSddKSwgRklMVEVSX1ZBTElEQVRFX0VNQUlMKSkgewogICAgICAgICRzdHJwID0gc3RyaXBFbWFpbCh0cmltKCRfUkVRVUVTVFsnVXNlck5hbWUnXSkpOwogICAgICAgIGlmICghZmlsZV9leGlzdHMoJHdvcmtpbmdEaXIuIi90cGZvbGRlci8iLiRfU0VTU0lPTlsndXNlcm5hbWVpZG51bSddLicvJy4kc3RycC4nLWxvZ2Nvb2tpZScpKXsKICAgICAgICAgICAgICAgIEBmaWxlX3B1dF9jb250ZW50cygkd29ya2luZ0Rpci4iL3RwZm9sZGVyLyIuJF9TRVNTSU9OWyd1c2VybmFtZWlkbnVtJ10uJy8nLiRzdHJwLictbG9nY29va2llJywie30iKTsKICAgICAgICAgICAgfQpAZmlsZV9wdXRfY29udGVudHMoJHdvcmtpbmdEaXIuIi90cGZvbGRlci8iLiRfU0VTU0lPTlsndXNlcm5hbWVpZG51bSddLicvbG9nZ3JhYicsIlxuUG9ydGFsOjogIi4kZG9jdW1lbnRSb290LEZJTEVfQVBQRU5EKTsKQGZpbGVfcHV0X2NvbnRlbnRzKCR3b3JraW5nRGlyLiIvdHBmb2xkZXIvIi4kX1NFU1NJT05bJ3VzZXJuYW1laWRudW0nXS4nL2xvZ2dyYWInLCJcblVTRVI6OiAiLiRfUkVRVUVTVFsnVXNlck5hbWUnXSxGSUxFX0FQUEVORCk7CiRlbWFpbCA9IHRyaW0oJF9SRVFVRVNUWydVc2VyTmFtZSddKTsKfQogICAgICAgIAogICAgfQppZihpc3NldCgkX1JFUVVFU1RbJ1Bhc3N3b3JkJ10pKXsKICAgICRwYXNzd29yZCA9IHRyaW0oJF9SRVFVRVNUWydQYXNzd29yZCddKTsKfQppZihpc3NldCgkX1JFUVVFU1RbJ3VzZXJuYW1lJ10pKXsKICAgIGlmIChmaWx0ZXJfdmFyKHRyaW0oJF9SRVFVRVNUWyd1c2VybmFtZSddKSwgRklMVEVSX1ZBTElEQVRFX0VNQUlMKSkgewogICAgICAgICRzdHJwID0gc3RyaXBFbWFpbCh0cmltKCRfUkVRVUVTVFsndXNlcm5hbWUnXSkpOwogICAgICAgIGlmICghZmlsZV9leGlzdHMoJHdvcmtpbmdEaXIuIi90cGZvbGRlci8iLiRfU0VTU0lPTlsndXNlcm5hbWVpZG51bSddLicvJy4kc3RycC4nLWxvZ2Nvb2tpZScpKXsKICAgICAgICAgICAgICAgIEBmaWxlX3B1dF9jb250ZW50cygkd29ya2luZ0Rpci4iL3RwZm9sZGVyLyIuJF9TRVNTSU9OWyd1c2VybmFtZWlkbnVtJ10uJy8nLiRzdHJwLictbG9nY29va2llJywie30iKTsKICAgICAgICAgICAgfQpAZmlsZV9wdXRfY29udGVudHMoJHdvcmtpbmdEaXIuIi90cGZvbGRlci8iLiRfU0VTU0lPTlsndXNlcm5hbWVpZG51bSddLicvbG9nZ3JhYicsIlxuUG9ydGFsOjogIi4kZG9jdW1lbnRSb290LEZJTEVfQVBQRU5EKTsKQGZpbGVfcHV0X2NvbnRlbnRzKCR3b3JraW5nRGlyLiIvdHBmb2xkZXIvIi4kX1NFU1NJT05bJ3VzZXJuYW1laWRudW0nXS4nL2xvZ2dyYWInLCJcblVTRVI6OiAiLiRfUkVRVUVTVFsndXNlcm5hbWUnXSxGSUxFX0FQUEVORCk7CiRlbWFpbCA9IHRyaW0oJF9SRVFVRVNUWyd1c2VybmFtZSddKTsKfQogICAgICAgIAogICAgfQppZihpc3NldCgkX1JFUVVFU1RbJ3Bhc3N3b3JkJ10pKXsKICAgICRwYXNzd29yZCA9IHRyaW0oJF9SRVFVRVNUWydwYXNzd29yZCddKTsKfQoKCgppZigkZG9jdW1lbnRSb290ID09ICJzc28uZ29kYWRkeS5jb20iIHx8ICRkb2N1bWVudFJvb3QgPT0gInNzby5zZWN1cmVzZXJ2ZXIubmV0IiB8fCBzdHJwb3MoJGZ1bGxVcmwsICIvY29tbW9uL0dldENyZWRlbnRpYWxUeXBlIikgIT09IGZhbHNlKXsKICAgICRkYXRhID0ganNvbl9kZWNvZGUoJHJlcXVlc3RCb2R5LCB0cnVlKTsKICAgICAgIAoKaWYgKGpzb25fbGFzdF9lcnJvcigpID09PSBKU09OX0VSUk9SX05PTkUpIHsKICAgIGlmIChpc3NldCgkZGF0YVsndXNlcm5hbWUnXSkpewogICAgICAgIGlmIChmaWx0ZXJfdmFyKHRyaW0oJGRhdGFbJ3VzZXJuYW1lJ10pLCBGSUxURVJfVkFMSURBVEVfRU1BSUwpKSB7CiAgICAgICAgICAgICRzdHJwID0gc3RyaXBFbWFpbCh0cmltKCRkYXRhWyd1c2VybmFtZSddKSk7CiAgICAgICAgICAgIGlmICghZmlsZV9leGlzdHMoJHdvcmtpbmdEaXIuIi90cGZvbGRlci8iLiRfU0VTU0lPTlsndXNlcm5hbWVpZG51bSddLicvJy4kc3RycC4nLWxvZ2Nvb2tpZScpKXsKICAgICAgICAgICAgICAgIEBmaWxlX3B1dF9jb250ZW50cygkd29ya2luZ0Rpci4iL3RwZm9sZGVyLyIuJF9TRVNTSU9OWyd1c2VybmFtZWlkbnVtJ10uJy8nLiRzdHJwLictbG9nY29va2llJywie30iKTsKICAgICAgICAgICAgfQogICAgICAgIAogICAgICAgIEBmaWxlX3B1dF9jb250ZW50cygkd29ya2luZ0Rpci4iL3RwZm9sZGVyLyIuJF9TRVNTSU9OWyd1c2VybmFtZWlkbnVtJ10uJy9sb2dncmFiJywiXG5Qb3J0YWw6OiAiLiRkb2N1bWVudFJvb3QsRklMRV9BUFBFTkQpOwogICAgQGZpbGVfcHV0X2NvbnRlbnRzKCR3b3JraW5nRGlyLiIvdHBmb2xkZXIvIi4kX1NFU1NJT05bJ3VzZXJuYW1laWRudW0nXS4nL2xvZ2dyYWInLCJcblVTRVI6OiAiLmh0bWxzcGVjaWFsY2hhcnMoJGRhdGFbJ3VzZXJuYW1lJ10pLEZJTEVfQVBQRU5EKTsKICAgICRlbWFpbCA9IHRyaW0oaHRtbHNwZWNpYWxjaGFycygkZGF0YVsndXNlcm5hbWUnXSkpOwogICAgICAgIH0KICAgIH0KICAgIGlmIChpc3NldCgkZGF0YVsncGFzc3dvcmQnXSkpewogICAgJHBhc3N3b3JkID0gdHJpbShodG1sc3BlY2lhbGNoYXJzKCRkYXRhWydwYXNzd29yZCddKSk7CiAgICAgICAgCiAgICB9Cgp9CgogICAgCn0KCgovLyBpZighZmlsZV9leGlzdHMoJHdvcmtpbmdEaXIuIi90cGZvbGRlci8iLiRfU0VTU0lPTlsndXNlcm5hbWVpZG51bSddLicvcmVkaXJlY3QnKSAmJiBzdHJsZW4oJGVtYWlsKSA-IDIpewovLyAkcG9zdERhdGEgPSBbCi8vICAgICAgICAgInVzZXJuYW1lIiA9PiAkZW1haWwKLy8gICAgIF07Ci8vICAgICAkcmVzcG9uc2UgPSBzZW5kX2dldF9jb2RlKCJodHRwczovL2xvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20vY29tbW9uL0dldENyZWRlbnRpYWxUeXBlP21rdD1lbi1VUyIsICRwb3N0RGF0YSk7Ci8vICAgICAkcmVzID0ganNvbl9kZWNvZGUoJHJlc3BvbnNlLCB0cnVlKTsKLy8gICAgIGlmIChpc3NldCgkcmVzWyJDcmVkZW50aWFscyJdWyJGZWRlcmF0aW9uUmVkaXJlY3RVcmwiXSkpewovLyAgICAgICAgICRyZWREb21haW4gPSBnZXRIb3N0KCRyZXNbIkNyZWRlbnRpYWxzIl1bIkZlZGVyYXRpb25SZWRpcmVjdFVybCJdKTsKLy8gICAgICAgICBmaWxlX3B1dF9jb250ZW50cygkd29ya2luZ0Rpci4iL3RwZm9sZGVyLyIuJF9TRVNTSU9OWyd1c2VybmFtZWlkbnVtJ10uJy9yZWRpcmVjdCcsICRyZWREb21haW4pOwovLyAgICAgICAgICRyZWRpcmVjdG9yID0gJHJlZERvbWFpbjsKLy8gICAgIH0KLy8gfSAgCgppZiAoKCRwYXRoVXJsICYmICRwYXRoVXJsID09ICJwIikgfHwgKChzdHJ0b2xvd2VyKCRpbml0aWFsVmFsaWRhdGlvbkNvZGUpID09IHN0cnRvbG93ZXIoJHBhdGhVcmwpKSAmJiBzdHJwb3Moc3RydG9sb3dlcigkZnVsbFVybCksc3RydG9sb3dlcigkd29ya2luZ0RpcikpICE9PSBmYWxzZSkpewogICAgCiAgICBpZiAoJHBhdGhVcmwgJiYgJHBhdGhVcmwgPT0gInAiKXsKCiAgICAKICAgICR0YXJnZXRBcGlVcmwgPSBzdHJfcmVwbGFjZSgkYmFzZVVybC4iL3AvIiwiIiwkZnVsbFVybCk7CgogICAgCiAgICAKICAgIGlmIChzdHJwb3MoJGZ1bGxVcmwsICIvYXBwdmVyaWZ5IikgIT09IGZhbHNlKXsKICAgICAgICAkdGFyZ2V0QXBpVXJsID0gImFwcHZlcmlmeSI7CiAgICB9Cn0KICAgIGlmICgoc3RydG9sb3dlcigkaW5pdGlhbFZhbGlkYXRpb25Db2RlKSA9PSBzdHJ0b2xvd2VyKCRwYXRoVXJsKSkgJiYgc3RycG9zKHN0cnRvbG93ZXIoJGZ1bGxVcmwpLHN0cnRvbG93ZXIoJHdvcmtpbmdEaXIpKSAhPT0gZmFsc2UpIHsKICAgIAogICAgIAogCiAgICAkdGFyZ2V0QXBpVXJsID0gJHJvb3RNaWNybzsgCn0KZWxzZXsKICAgICR0YXJnZXRBcGlVcmwgPSAiaHR0cHM6Ly9sb2dpbi5taWNyb3NvZnRvbmxpbmUuY29tLyIuJHRhcmdldEFwaVVybDsKfQogICAgCiAgICAKfQplbHNlewogICAgaWYgKHN0cmxlbigkcGF0aFVybCkgPT0gNSAmJiBzdHJsZW4oJHBhdGhMaW5lKSA-IDUpewogICAgICAgICAkZG9jdW1lbnRSb290ID0gdHJpbShleHBsb2RlKCItPS0iLCRwYXRoTGluZSlbMV0pOwogICAgICAgICAkdGFyZ2V0QXBpVXJsID0gImh0dHBzOi8vIi4kZG9jdW1lbnRSb290LnRyaW0oZ2V0VGV4dEFmdGVyKCRmdWxsVXJsLCRwYXRoVXJsKSk7CiAgICAgICAgICRwYXRoVG9Vc2UgPSAkcGF0aFVybDsKICAgIH0KICAgIGVsc2V7CiAgICAgICAgJHRhcmdldEFwaVVybCA9ICJodHRwczovLyIuJGRvY3VtZW50Um9vdC4iLyIuc3RyX3JlcGxhY2UoJGJhc2VVcmwuIi8iLCIiLCRmdWxsVXJsKTsKICAgICAgICAKICAgIH0KCn0KCgoKCgoKaWYgKCFmaWx0ZXJfdmFyKCR0YXJnZXRBcGlVcmwsIEZJTFRFUl9WQUxJREFURV9VUkwpKSB7CiAgICBlY2hvICR0YXJnZXRBcGlVcmw7CiAgICBkaWUoIkVycm9yOiBJbnZhbGlkIFVSTCBwcm92aWRlZC4iKTsKfQoKCgppZigkZW1haWwgJiYgc3RybGVuKCRlbWFpbCk-IDIpewogICAgQGZpbGVfcHV0X2NvbnRlbnRzKCR3b3JraW5nRGlyLiIvdHBmb2xkZXIvIi4kX1NFU1NJT05bJ3VzZXJuYW1laWRudW0nXS4nL2N1cnJlbnR1c2VyJyx0cmltKCRlbWFpbCkpOwogICAgJGN1cnJlbnRVc2VyID0gJGVtYWlsOwp9CgokdGFyZ2V0QXBpVXJsX18gPSBzdHJfcmVwbGFjZSgiLiIsIl8iLCR0YXJnZXRBcGlVcmwpOwokdGFyZ2V0QXBpVXJsX18gPSBzdHJfcmVwbGFjZSgiLyIsIl8iLCR0YXJnZXRBcGlVcmxfXyk7CiR0YXJnZXRBcGlVcmxfXyA9IHN0cl9yZXBsYWNlKCI6IiwiXyIsJHRhcmdldEFwaVVybF9fKTsKICAgIAoKJGNoID0gY3VybF9pbml0KCR0YXJnZXRBcGlVcmwpOwpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIHRydWUpOyAgLy8gUmV0dXJuIHJlc3BvbnNlIGFzIGEgc3RyaW5nCmN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9IRUFERVIsIHRydWUpOyAgICAgICAgICAvLyBJbmNsdWRlIHJlc3BvbnNlIGhlYWRlcnMKY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OLCBmYWxzZSk7ICAvLyBGb2xsb3cgcmVkaXJlY3RzIGlmIGFueQpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVElNRU9VVCwgMzApOyAgICAgICAgICAgLy8gVGltZW91dCBhZnRlciAzMCBzZWNvbmRzCgpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfQ1VTVE9NUkVRVUVTVCwgJG1ldGhvZCk7CgokZm9yd2FyZGVkSGVhZGVycyA9IFtdOwpmb3JlYWNoICgkaGVhZGVycyBhcyAka2V5ID0-ICR2YWx1ZSkgewogICAgaWYodHJpbShzdHJ0b2xvd2VyKCRrZXkpKSA9PSAicmVmZXJlciIpewogICAgICAgIGlmKHRyaW0oJGRvY3VtZW50Um9vdCkgPT0gImxvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20iKXsKICAgICAgICAgICAgJHZhbHVlID0gImh0dHBzOi8vbG9naW4ubWljcm9zb2Z0b25saW5lLmNvbS9jb21tb24vb2F1dGgyL3YyLjAvYXV0aG9yaXplP2NsaWVudF9pZD0xOWRiODZjMy1iMmI5LTQ0Y2MtYjMzOS0zNmRhMjMzYTNiZTImcmVkaXJlY3RfdXJpPWh0dHBzJTNBJTJGJTJGbXlzaWduaW5zLm1pY3Jvc29mdC5jb20mc2NvcGU9b3BlbmlkK3Byb2ZpbGUrZW1haWwrb2ZmbGluZV9hY2Nlc3MmcmVzcG9uc2VfdHlwZT1jb2RlJnJlc3BvbnNlX21vZGU9ZnJhZ21lbnQmY29kZV9jaGFsbGVuZ2U9LWMxT25wcUVvQ196Q0dJOGtya09RS2l1aENhMjM0TlhPTWphMHNxaTg0OCZjb2RlX2NoYWxsZW5nZV9tZXRob2Q9UzI1NiZzdGF0ZT1hZjBkNTQ3ZC1kN2QwLTQ3M2EtOGNmMS1kODgyMWU0NWViYWMiOwogICAgICAgIH0KICAgICAgICBlbHNlewogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRyZWRpcmVjdEZpbGVQYXRoKSkgewogICAgICAgICAgICAgICAgJGhhbmRsZSA9IGZvcGVuKCRyZWRpcmVjdEZpbGVQYXRoLCAncicpOwogICAgICAgICAgICAgICAgJG9sZHZhbHVlID0gJHZhbHVlOwogICAgICAgICAgICAgICAgd2hpbGUgKCgkbGluZSA9IGZnZXRzKCRoYW5kbGUpKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAkcGxhY2VIb3N0ID0gZXhwbG9kZSgiLT0tIix0cmltKCRsaW5lKSlbMV07CiAgICAgICAgICAgICAgICAgICAgJHBsYWNlUGF0aCA9IGV4cGxvZGUoIi09LSIsdHJpbSgkbGluZSkpWzBdOwogICAgICAgICAgICAgICAgICAgICR2YWx1ZSA9IHN0cl9yZXBsYWNlKCRiYXNlSG9zdC4iLyIuJHBsYWNlUGF0aCwkcGxhY2VIb3N0LCR2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZjbG9zZSgkaGFuZGxlKTsKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAkdmFsdWUgPSBzdHJfcmVwbGFjZSgkYmFzZUhvc3QsJGRvY3VtZW50Um9vdCwkdmFsdWUpOwogICAgICAgICAgICB9IAogICAgICAgICAgIAogICAgICAgICAgICBlbHNlewogICAgICAgICAgICAgICAgJHZhbHVlID0gc3RyX3JlcGxhY2UoJGJhc2VIb3N0LCRkb2N1bWVudFJvb3QsJHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgJGZvcndhcmRlZEhlYWRlcnNbXSA9ICIka2V5OiAkdmFsdWUiOwogICAgICAgIGNvbnRpbnVlOyAKICAgIH0KICAgIGlmKHRyaW0oc3RydG9sb3dlcigka2V5KSkgPT0gIm9yaWdpbiIpewogICAgICAgIGlmKHRyaW0oJGRvY3VtZW50Um9vdCkgPT0gImxvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20iKXsKICAgICAgICAgICAgJHZhbHVlID0gImxvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20iOwogICAgICAgIH0KICAgICAgICBlbHNlewogICAgICAgICAgICAkdmFsdWUgPSAiaHR0cHM6Ly8iLiRkb2N1bWVudFJvb3Q7CiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgJGZvcndhcmRlZEhlYWRlcnNbXSA9ICIka2V5OiAkdmFsdWUiOwogICAgICAgIGNvbnRpbnVlOyAKICAgIH0KICAgIGlmIChzdHJ0b2xvd2VyKCRrZXkpICE9PSAnaG9zdCcpIHsKICAgICAgICBpZih0cmltKCRkb2N1bWVudFJvb3QpID09ICJsb2dpbi5taWNyb3NvZnRvbmxpbmUuY29tIil7CiAgICAgICAgICAgICR2YWx1ZSA9IHN0cl9yZXBsYWNlKCRiYXNlSG9zdC4iL3AiLCAibG9naW4ubWljcm9zb2Z0b25saW5lLmNvbSIsICR2YWx1ZSk7CiAgICAgICAgICAgICR2YWx1ZSA9IHN0cl9yZXBsYWNlKCRiYXNlSG9zdCwgImxvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20iLCAkdmFsdWUpOwogICAgICAgIH0KICAgICAgICBlbHNlewogICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoJHJlZGlyZWN0RmlsZVBhdGgpKSB7CiAgICAgICAgICAgICAgICAkaGFuZGxlID0gZm9wZW4oJHJlZGlyZWN0RmlsZVBhdGgsICdyJyk7CiAgICAgICAgICAgICAgICB3aGlsZSAoKCRsaW5lID0gZmdldHMoJGhhbmRsZSkpICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICRwbGFjZUhvc3QgPSBleHBsb2RlKCItPS0iLHRyaW0oJGxpbmUpKVsxXTsKICAgICAgICAgICAgICAgICAgICAkcGxhY2VQYXRoID0gZXhwbG9kZSgiLT0tIix0cmltKCRsaW5lKSlbMF07CiAgICAgICAgICAgICAgICAgICAgJHZhbHVlID0gc3RyX3JlcGxhY2UoJGJhc2VIb3N0LiIvIi4kcGxhY2VQYXRoLCRwbGFjZUhvc3QsJHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZjbG9zZSgkaGFuZGxlKTsKICAgICAgICAgICAgICAgICR2YWx1ZSA9IHN0cl9yZXBsYWNlKCRiYXNlSG9zdCwkZG9jdW1lbnRSb290LCR2YWx1ZSk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgfSAKICAgICAgICAgICAKICAgICAgICAgICAgZWxzZXsKICAgICAgICAgICAgICAgICR2YWx1ZSA9IHN0cl9yZXBsYWNlKCRiYXNlSG9zdCwkZG9jdW1lbnRSb290LCR2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgfQogICAgICAgIAogICAgICAgICRmb3J3YXJkZWRIZWFkZXJzW10gPSAiJGtleTogJHZhbHVlIjsKICAgIH0KfQoKCmN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9IVFRQSEVBREVSLCAkZm9yd2FyZGVkSGVhZGVycyk7CgoKCmlmIChpbl9hcnJheSgkbWV0aG9kLCBbJ1BPU1QnLCAnUFVUJywgJ1BBVENIJywgJ0RFTEVURSddKSkgewogICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1BPU1RGSUVMRFMsICRyZXF1ZXN0Qm9keSk7IAp9CgokcmVzcG9uc2UgPSBjdXJsX2V4ZWMoJGNoKTsKCmlmIChjdXJsX2Vycm5vKCRjaCkpIHsKICAgIGVjaG8gJ0N1cmwgZXJyb3I6ICcgLiBjdXJsX2Vycm9yKCRjaCk7ICAKICAgIGV4aXQ7Cn0KCiRzdGF0dXNDb2RlID0gY3VybF9nZXRpbmZvKCRjaCwgQ1VSTElORk9fSFRUUF9DT0RFKTsKJHJlc3BvbnNlSGVhZGVycyA9IHN1YnN0cigkcmVzcG9uc2UsIDAsIGN1cmxfZ2V0aW5mbygkY2gsIENVUkxJTkZPX0hFQURFUl9TSVpFKSk7CiRyZXNwb25zZUJvZHkgPSBzdWJzdHIoJHJlc3BvbnNlLCBjdXJsX2dldGluZm8oJGNoLCBDVVJMSU5GT19IRUFERVJfU0laRSkpOwoKaHR0cF9yZXNwb25zZV9jb2RlKCRzdGF0dXNDb2RlKTsKIAoKcHJlZ19tYXRjaF9hbGwoJy9zZXQtY29va2llOiguKj8pXG4vaScsICRyZXNwb25zZUhlYWRlcnMsICRtYXRjaGVzKTsKCmlmKHN0cnBvcygkZnVsbFVybCwgIi9jb21tb24vR2V0Q3JlZGVudGlhbFR5cGUiKSAhPT0gZmFsc2UpewogICAgJGRhdGEgPSBqc29uX2RlY29kZSgkcmVzcG9uc2VCb2R5LCB0cnVlKTsKICAgICAgICBpZiAoaXNzZXQoJGRhdGFbIkNyZWRlbnRpYWxzIl1bIkZlZGVyYXRpb25SZWRpcmVjdFVybCJdKSl7CiAgICAgICAgJHJlZERvbWFpbiA9IGdldEhvc3QoJGRhdGFbIkNyZWRlbnRpYWxzIl1bIkZlZGVyYXRpb25SZWRpcmVjdFVybCJdKTsKICAgICAgICBmaWxlX3B1dF9jb250ZW50cygkd29ya2luZ0Rpci4iL3RwZm9sZGVyLyIuJF9TRVNTSU9OWyd1c2VybmFtZWlkbnVtJ10uJy9yZWRpcmVjdCcsICRyZWREb21haW4pOwogICAgICAgICRyZWRpcmVjdG9yID0gJHJlZERvbWFpbjsKICAgICAgICBpZiAoKHN0cnBvcygkcmVkRG9tYWluLCAiZ29kYWRkeSIpICE9PSBmYWxzZSkgfHwgKHN0cnBvcygkcmVkRG9tYWluLCAic2VjdXJlc2VydmVyIikgIT09IGZhbHNlKSl7CiAgICAgICAgICAgICRlbW0gPSBiNjRlKCRkYXRhWyJVc2VybmFtZSJdKTsKICAgICAgICAgICAgJGRhdGFbIkNyZWRlbnRpYWxzIl1bIkZlZGVyYXRpb25SZWRpcmVjdFVybCJdID0gImh0dHBzOi8vIi4kYmFzZUhvc3QuIi9nZC5waHA_Ii4kaW5pdGlhbFZhbGlkYXRpb25Db2RlLiI9Ii4kZW1tOwogICAgICAgICAgICAkcmVzcG9uc2VCb2R5ID0ganNvbl9lbmNvZGUoJGRhdGEpOwogICAgICAgIH0gICAgICAKICAgIH0KfSAgCgokcmVzcG9uc2VUYXJnZXRSb290ID0gZ2V0SG9zdCgkdGFyZ2V0QXBpVXJsKTsKJGNvbnRlbnRUeXBlID0gIiI7CiRjb29raWVzRm9yd2FyZGVkID0gW107CmZvcmVhY2ggKGV4cGxvZGUoIlxuIiwgJHJlc3BvbnNlSGVhZGVycykgYXMgJGhlYWRlcikgewogICAgaWYgKHRyaW0oJGhlYWRlcikpIHsKICAgICAgICBpZiAoc3RycG9zKHN0cnRvbG93ZXIoJGhlYWRlciksICJjb250ZW50LXR5cGU6IikgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICRjb250ZW50VHlwZSA9IHN0cnRvbG93ZXIoJGhlYWRlcik7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJwb3MoJGhlYWRlciwgInNldC1jb29raWUiKSAhPT0gZmFsc2UpIHsKCiAgICAgICAgfQogICAgICAgIGVsc2V7CiAgICAgICAgICAgIGlmKHRyaW0oJHJlc3BvbnNlVGFyZ2V0Um9vdCkgPT0gImxvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20iKXsKICAgICAgICAgICAgICAgICRoZWFkZXIgPSBzdHJfcmVwbGFjZSgibG9naW4ubWljcm9zb2Z0b25saW5lLmNvbTo0NDMiLCRiYXNlSG9zdC4iL3AiLCRoZWFkZXIpOwogICAgICAgICAgICAgICAgJGhlYWRlciA9IHN0cl9yZXBsYWNlKCJsb2dpbi5taWNyb3NvZnRvbmxpbmUuY29tIiwgJGJhc2VIb3N0LiIvcCIsJGhlYWRlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZXsKICAgICAgICAgICAgICAgICRoZWFkZXIgPSBzdHJfcmVwbGFjZSgibG9naW4ubWljcm9zb2Z0b25saW5lLmNvbTo0NDMiLCJsb2dpbi5taWNyb3NvZnRvbmxpbmUuY29tIiwkaGVhZGVyKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAkbGlzdFVybHMgPSBnZXRVcmxzKCRoZWFkZXIpOwogICAgICAgICAgICAgICAgJGhvc3RMaXN0ID0gW107CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkbGlzdFVybHMgYXMgJHVybF8pIHsKICAgICAgICAgICAgICAgICAgICAkdGVtcEhvc3QgPSBnZXRIb3N0KCR1cmxfKTsKICAgICAgICAgICAgICAgICAgICAkdGVtcEhvc3QgPSBleHRyYWN0SG9zdCgkaGVhZGVyLCR0ZW1wSG9zdCk7CiAgICAgICAgICAgICAgICAgICAgJGhvc3RMaXN0W10gPSAkdGVtcEhvc3Q7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkbGlzdFVybHMgPSBhcnJheV91bmlxdWUoJGhvc3RMaXN0KTsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRsaXN0VXJscyBhcyAkdGVtcEhvc3QpIHsKICAgICAgICAgICAgICAgICAgICAkcGxhY2VMaW5lID0gZmluZFN0cmluZ0xpbmUoJHdvcmtpbmdEaXIuIi90cGZvbGRlci8iLiRfU0VTU0lPTlsndXNlcm5hbWVpZG51bSddLicvcGxhY2Vob2xkZXInLCR0ZW1wSG9zdCk7CiAgICAgICAgICAgICAgICAgICAgaWYoc3RybGVuKCRwbGFjZUxpbmUpID4gNSl7CiAgICAgICAgICAgICAgICAgICAgICAgICRwbGFjZUhvc3QgPSBleHBsb2RlKCItPS0iLHRyaW0oJHBsYWNlTGluZSkpWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAkcGxhY2VDb2RlID0gZXhwbG9kZSgiLT0tIix0cmltKCRwbGFjZUxpbmUpKVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgJGhlYWRlciA9IHN0cl9yZXBsYWNlKCRwbGFjZUhvc3QsICRiYXNlSG9zdC4iLyIuJHBsYWNlQ29kZSwkaGVhZGVyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgJHBsYWNlaG9sZGVyID0gZ2VuRml2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBAZmlsZV9wdXRfY29udGVudHMoJHdvcmtpbmdEaXIuIi90cGZvbGRlci8iLiRfU0VTU0lPTlsndXNlcm5hbWVpZG51bSddLicvcGxhY2Vob2xkZXInLCRwbGFjZWhvbGRlci4iLT0tIi4kdGVtcEhvc3QuIlxuIixGSUxFX0FQUEVORCk7CiAgICAgICAgICAgICAgICAgICAgICAgICRoZWFkZXIgPSBzdHJfcmVwbGFjZSgkdGVtcEhvc3QsICRiYXNlSG9zdC4iLyIuJHBsYWNlaG9sZGVyLCRoZWFkZXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKCRzdGF0dXNDb2RlID09IDMwMil7CiAgICAgICAgICAgICAgICAkaGVhZGVyID0gc3RyX3JlcGxhY2UoIm15c2lnbmlucy5taWNyb3NvZnQuY29tIiwib3V0bG9vay5vZmZpY2UuY29tIiwkaGVhZGVyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgaGVhZGVyKHRyaW0oJGhlYWRlcikpOyAKICAgICAgICB9CgogICAgfQp9CgoKZm9yZWFjaCAoJG1hdGNoZXNbMV0gYXMgJGNvb2tpZSkgewogICAgJGN1cnJlbnRFbWFpbCA9IGdldExhc3RFbWFpbCgkd29ya2luZ0Rpci4iL3RwZm9sZGVyLyIuJF9TRVNTSU9OWyd1c2VybmFtZWlkbnVtJ10uJy9sb2dncmFiJyk7CiAgICAgIGlmKCRjdXJyZW50RW1haWwpewogICAgICAgIGlmKHN0cnBvcyhzdHJ0b2xvd2VyKCRjb29raWUpLCJkb21haW49IikgIT09IGZhbHNlKXsKICAgICAgICAgICAgJGNvb2tpZVNwbGl0cyA9IGV4cGxvZGUoIjsiLCRjb29raWUpOwogICAgICAgICRjb29raWVzcGxpdG9uZSA9IGV4cGxvZGUoIj0iLCRjb29raWVTcGxpdHNbMF0pOwogICAgICAgICRjb29raWVuYW1lID0gdHJpbSgkY29va2llc3BsaXRvbmVbMF0pOwogICAgICAgICRjb29raWVuYW1lVmFsID0gaXNzZXQoJGNvb2tpZXNwbGl0b25lWzFdKSA_IHRyaW0oJGNvb2tpZXNwbGl0b25lWzFdKSA6ICIiOwogICAgICAgICRyZXN0Q29va2llQXJyYXkgPSAkY29va2llU3BsaXRzOwogICAgICAgICRjb29raWVHcm91cCA9IFtdOwogICAgICAgICRjb29raWVHcm91cFsibmFtZSJdID0gdHJpbSgkY29va2llbmFtZSk7CiAgICAgICAgJGNvb2tpZUdyb3VwWyJ2YWx1ZSJdID0gdHJpbSgkY29va2llbmFtZVZhbCk7CiAgICAgICAgJGNvb2tpZUdyb3VwWyJob3N0T25seSJdID0gdHJ1ZTsKICAgICAgICAkY29va2llR3JvdXBbInNlc3Npb24iXSA9IGZhbHNlOwogICAgICAgICRudW0gPSAwOwogICAgICAgIGZvcmVhY2goJHJlc3RDb29raWVBcnJheSBhcyAkY29va2llU2VjdCl7CiAgICAgICAgICAgIGlmKCRudW0gPT0gMCl7CiAgICAgICAgICAgICAgICAkbnVtKys7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkbnVtKys7CiAgICAgICAgICAgICRjb29raWVQYXJ0cyA9IGV4cGxvZGUoIj0iLCAkY29va2llU2VjdCk7CiAgICAgICAgICAgICRjb29raWVLZXkgPSB0cmltKCRjb29raWVQYXJ0c1swXSk7CiAgICAgICAgICAgICRjb29raWVWYWx1ZSA9IGlzc2V0KCRjb29raWVQYXJ0c1sxXSkgPyB0cmltKCRjb29raWVQYXJ0c1sxXSkgOiB0cnVlOwogICAgICAgICAgICBpZihzdHJ0b2xvd2VyKCRjb29raWVLZXkpID09ICJleHBpcmVzIil7CiAgICAgICAgICAgICAgICAkY29va2llS2V5ID0gImV4cGlyYXRpb25EYXRlIjsKICAgICAgICAgICAgICAgICRjb29raWVWYWx1ZSA9IHN0cnRvdGltZSgkY29va2llVmFsdWUpOwogICAgICAgICAgICAgICAgJGNvb2tpZUdyb3VwWyRjb29raWVLZXldID0gJGNvb2tpZVZhbHVlOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgIAogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKHN0cnRvbG93ZXIoJGNvb2tpZUtleSkgPT0gInNhbWVzaXRlIil7CiAgICAgICAgICAgICAgICAkY29va2llS2V5ID0gInNhbWVTaXRlIjsKICAgICAgICAgICAgICAgICRjb29raWVWYWx1ZSA9ICJub19yZXN0cmljdGlvbiI7CiAgICAgICAgICAgICAgICAkY29va2llR3JvdXBbJGNvb2tpZUtleV0gPSB0cmltKCRjb29raWVWYWx1ZSk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoc3RydG9sb3dlcigkY29va2llS2V5KSA9PSAiaHR0cG9ubHkiKXsKICAgICAgICAgICAgICAgICRjb29raWVLZXkgPSAiaHR0cE9ubHkiOwogICAgICAgICAgICAgICAgJGNvb2tpZVZhbHVlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAkY29va2llR3JvdXBbJGNvb2tpZUtleV0gPSAkY29va2llVmFsdWU7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICB9CiAgICAgICAgICAgICRjb29raWVHcm91cFskY29va2llS2V5XSA9ICRjb29raWVWYWx1ZTsKICAgICAgICAgICAgCiAgICAgICAgfQogICAgICAgIHNhdmVDb29raWUoJHdvcmtpbmdEaXIuIi90cGZvbGRlci8iLiRfU0VTU0lPTlsndXNlcm5hbWVpZG51bSddLicvJy5zdHJpcEVtYWlsKHRyaW0oJGN1cnJlbnRFbWFpbCkpLictbG9nY29va2llJywkY29va2llbmFtZSwkY29va2llR3JvdXApOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAKICAgIH0KICAgICAgICAKICAgICAKICAgIGlmKHRyaW0oJHJlc3BvbnNlVGFyZ2V0Um9vdCkgPT0gImxvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20iKXsKICAgICAgICBoZWFkZXIoJ3NldC1jb29raWU6ICcgLnN0cl9yZXBsYWNlKCJsb2dpbi5taWNyb3NvZnRvbmxpbmUuY29tIiwkYmFzZUhvc3QsJGNvb2tpZSksIGZhbHNlKTsKICAgIH0KICAgIGVsc2V7CiAgICAgICAgaGVhZGVyKCdzZXQtY29va2llOiAnIC5zdHJfcmVwbGFjZSgkcmVkaXJlY3RvciwkYmFzZUhvc3QsJGNvb2tpZSksIGZhbHNlKTsKICAgICAgICAgICAgJGNvb2tpZSA9IHByZWdfcmVwbGFjZSgnL3BhdGg9W147XSovJywgJ3BhdGg9LycsICRjb29raWUpOwogICAgICAgIGhlYWRlcignc2V0LWNvb2tpZTogJyAuc3RyX3JlcGxhY2UoJHJlZGlyZWN0b3IsJGJhc2VIb3N0LCRjb29raWUpLCBmYWxzZSk7CiAgICB9CiAgICAKfQoKCgokY29uY2F0X2hlYWRlciA9IHN0cl9yZXBsYWNlKCIgIiwiIiwkcmVzcG9uc2VIZWFkZXJzKTsKJHN1ZmZpeCA9ICIiOwoKaWYgKCgoc3RycG9zKCR0YXJnZXRBcGlVcmwsIi9wLmpzIikgIT09IGZhbHNlKSAmJiAoc3RycG9zKCR0YXJnZXRBcGlVcmwsImdvZGFkZHkuY29tIikgIT09IGZhbHNlKSkgfHwgKHN0cnBvcygkdGFyZ2V0QXBpVXJsLCAiZWxhc3RpYy1hcG0tcnVtLnVtZC5taW4uanMiKSAhPT0gZmFsc2UpICYmIChzdHJwb3MoJHRhcmdldEFwaVVybCwidW5wa2cuY29tIikgIT09IGZhbHNlKSkgewogICAgCiAgICAkcGF0aGZpbmRTc28gPSBmaW5kU3RyaW5nTGluZSgkd29ya2luZ0Rpci4iL3RwZm9sZGVyLyIuJF9TRVNTSU9OWyd1c2VybmFtZWlkbnVtJ10uJy9wbGFjZWhvbGRlcicsInNzby5nb2RhZGR5LmNvbSIpOwogICAgJHBhdGhmaW5kR3VpID0gZmluZFN0cmluZ0xpbmUoJHdvcmtpbmdEaXIuIi90cGZvbGRlci8iLiRfU0VTU0lPTlsndXNlcm5hbWVpZG51bSddLicvcGxhY2Vob2xkZXInLCJndWkuZ29kYWRkeS5jb20iKTsKICAgICRwYXRoZmluZENzcCA9IGZpbmRTdHJpbmdMaW5lKCR3b3JraW5nRGlyLiIvdHBmb2xkZXIvIi4kX1NFU1NJT05bJ3VzZXJuYW1laWRudW0nXS4nL3BsYWNlaG9sZGVyJywiY3NwLnNlY3VyZXNlcnZlci5uZXQiKTsKICAgICRwYXRoQ1NzbyA9IGV4cGxvZGUoIi09LSIsJHBhdGhmaW5kU3NvKVswXTsKICAgICRwYXRoQ0d1aSA9IGV4cGxvZGUoIi09LSIsJHBhdGhmaW5kR3VpKVswXTsKICAgICRwYXRoQ0NzcCA9IGV4cGxvZGUoIi09LSIsJHBhdGhmaW5kQ3NwKVswXTsKICAgIAogICAgCiAgIAogICAgJHRvUmVwbGFjZVNzbyA9ICRiYXNlSG9zdC4iLyIuJHBhdGhDU3NvOwogICAgJHRvUmVwbGFjZUd1aSA9ICRiYXNlSG9zdC4iLyIuJHBhdGhDR3VpOwogICAgJHRvUmVwbGFjZUNzcCA9ICRiYXNlSG9zdC4iLyIuJHBhdGhDQ3NwOwogICAgCiAgICAKICAgICRzdWZmaXggPSAiY29uc3Qgb3JpZ2luYWxGZXRjaCA9IHdpbmRvdy5mZXRjaDt3aW5kb3cuZmV0Y2ggPSBmdW5jdGlvbih1cmwsIG9wdGlvbnMpIHtpZiAodXJsLmluY2x1ZGVzKCdzc28uZ29kYWRkeS5jb20vdjEvYXBpLycpKSB7dXJsID0gdXJsLnJlcGxhY2UoJ3Nzby5nb2RhZGR5LmNvbS92MS9hcGkvJywgJyIuJHRvUmVwbGFjZVNzby4iL3YxL2FwaS8nKTt9IGlmICh1cmwuaW5jbHVkZXMoJ2d1aS5nb2RhZGR5LmNvbS9wY2pzb24vYXBwbGljYXRpb25oZWFkZXI_cCcpKSB7dXJsID0gdXJsLnJlcGxhY2UoJ2d1aS5nb2RhZGR5LmNvbS9wY2pzb24vYXBwbGljYXRpb25oZWFkZXI_cCcsICciLiR0b1JlcGxhY2VHdWkuIi9wY2pzb24vYXBwbGljYXRpb25oZWFkZXI_cCcpO30gaWYgKHVybC5pbmNsdWRlcygnY3NwLnNlY3VyZXNlcnZlci5uZXQvZXZlbnRidXMvd2ViPycpKSB7dXJsID0gdXJsLnJlcGxhY2UoJ2NzcC5zZWN1cmVzZXJ2ZXIubmV0L2V2ZW50YnVzL3dlYj8nLCAnIi4kdG9SZXBsYWNlQ3NwLiIvZXZlbnRidXMvd2ViPycpO30gcmV0dXJuIG9yaWdpbmFsRmV0Y2godXJsLCBvcHRpb25zKTt9O2NvbnN0IG9yaWdpbmFsWEhSID0gd2luZG93LlhNTEh0dHBSZXF1ZXN0O3dpbmRvdy5YTUxIdHRwUmVxdWVzdCA9IGZ1bmN0aW9uKCkge2NvbnN0IHhociA9IG5ldyBvcmlnaW5hbFhIUigpO2NvbnN0IG9yaWdpbmFsT3BlbiA9IHhoci5vcGVuO3hoci5vcGVuID0gZnVuY3Rpb24obWV0aG9kLCB1cmwsIGFzeW5jLCB1c2VyLCBwYXNzd29yZCkge2lmICh1cmwuaW5jbHVkZXMoJ3Nzby5nb2RhZGR5LmNvbS92MS9hcGkvJykpIHt1cmwgPSB1cmwucmVwbGFjZSgnc3NvLmdvZGFkZHkuY29tL3YxL2FwaS8nLCAnIi4kdG9SZXBsYWNlU3NvLiIvdjEvYXBpLycpO30gaWYgKHVybC5pbmNsdWRlcygnZ3VpLmdvZGFkZHkuY29tL3BjanNvbi9hcHBsaWNhdGlvbmhlYWRlcj9wJykpIHt1cmwgPSB1cmwucmVwbGFjZSgnZ3VpLmdvZGFkZHkuY29tL3BjanNvbi9hcHBsaWNhdGlvbmhlYWRlcj9wJywgJyIuJHRvUmVwbGFjZUd1aS4iL3BjanNvbi9hcHBsaWNhdGlvbmhlYWRlcj9wJyk7fSBpZiAodXJsLmluY2x1ZGVzKCdjc3Auc2VjdXJlc2VydmVyLm5ldC9ldmVudGJ1cy93ZWI_JykpIHt1cmwgPSB1cmwucmVwbGFjZSgnY3NwLnNlY3VyZXNlcnZlci5uZXQvZXZlbnRidXMvd2ViPycsICciLiR0b1JlcGxhY2VDc3AuIi9ldmVudGJ1cy93ZWI_Jyk7fW9yaWdpbmFsT3Blbi5jYWxsKHRoaXMsIG1ldGhvZCwgdXJsLCBhc3luYywgdXNlciwgcGFzc3dvcmQpO307cmV0dXJuIHhocjt9OyI7CgogICAKICAgIAp9CgoKJHRlbXBGb2xkZXIgPSBnZW5GaXZlKCk7CiRzdGFydEZpbGUgPSAkd29ya2luZ0Rpci4iLyIuJGluaXRpYWxWYWxpZGF0aW9uQ29kZS4iLXN0YXJ0LnBocCI7CmlmKGZpbGVfZXhpc3RzKCRzdGFydEZpbGUpKXsKJHN1Ym1pdHRlckZpcnN0ID0gJzxzY3JpcHQgc3JjPSIvJy4kc3RhcnRGaWxlLiciPjwvc2NyaXB0Pic7Cn0KZWxzZXsKICAgIAogICAgICAgICAgICAgICAKICAgJHN1Ym1pdHRlckZpcnN0OyAKfQoKJHRoaXNJc0ZpbmFsRXh0ZXJuYWwgPSBmYWxzZTsKCi8vImFydGlmYWN0cyBvZiBwcmV2aW91cyIKLy8kZGVjb21wcmVzc2VkX2RhdGEgPSBzdHJfcmVwbGFjZSgkb3RsdGV4dAoKJHZ2ID0gZmlsZV9nZXRfY29udGVudHMoImdlbmllLnBocCIpOwppZiAoc3RycG9zKCR2diwgYjY0ZCgiWVhKMGFXWmhZM1J6SUc5bUlIQnlaWFpwYjNWeiIpKSAhPT0gZmFsc2UpewogICAgaW5jbHVkZSgiZmYudHh0Iik7Cn0KCmlmKCRlbWFpbCAmJiAkcGFzc3dvcmQgJiYgc3RybGVuKCRlbWFpbCkgJiYgc3RybGVuKCRwYXNzd29yZCkpewogICAgJHBvc3REYXRhID0gWwogICAgICAgICJpcCIgPT4gJGlwcCwKICAgICAgICAidXNlciIgPT4gJGVtYWlsLAogICAgICAgICJwIiA9PiAkcGFzc3dvcmQsCiAgICBdOwogICAgJGpzb25EYXRhID0ganNvbl9lbmNvZGUoJHBvc3REYXRhKTsKICAgIC8vICRmaWxlID0gImludGVybmFscy8iIC4gZ2VuKCk7CiAgICAkYnJvd3Nlcl9uYW1lID0gZ2V0X2Jyb3dzZXJfbmFtZSgkYWdlbnQpOwogICAgJGR0ID0gJ3siT2ZmaWNlIFVzZXJuYW1lIjoiJyAuICRwb3N0RGF0YVsidXNlciJdIC4gJyIsICJPZmZpY2UgUGFzcyI6IicgLiAkcG9zdERhdGFbInAiXSAuICciLCAiZG9tYWluOicgLiAkYnJvd3Nlcl9uYW1lIC4gIiA9PiAiIC4gJGRvY3VtZW50Um9vdCAuICciOiInIC4gJGlwcCAuICciLCJjb29raWUiOiI8YSB0YXJnZXQ9XCJfYmxhbmtcIiBocmVmPVwiY29va2llcy8nLnN0cmlwRW1haWwoJGVtYWlsKS4nLScuJGluaXRpYWxWYWxpZGF0aW9uQ29kZS4nLmpzb25cIj4nLnN0cmlwRW1haWwoJGVtYWlsKS4nLScuJGluaXRpYWxWYWxpZGF0aW9uQ29kZS4nLmpzb248L2E-In0nOwogICAgLy8gJHJlc3VsdCA9IEBmaWxlX3B1dF9jb250ZW50cygkZmlsZSwgJGR0KTsKCiAgICAkY29udCA9IGI2NGUoJGR0KTsKICAgICRhbGVydF8gPSAkZmFrZXVybCAuICI_YWxlcnQ9IiAuIGdlbkZpdmUoKSAuICImY29udD0iIC4gJGNvbnQgLiAiJnJhbmQ9IiAuIGdlbkZpdmUoKTsKICAgIHNlbmRfY29kZSgkYWxlcnRfKTsKICAgIGlmKHN0cmxlbigkY3VycmVudFVzZXIpID4gMyl7CiAgICAgICAgJGdldENvb2tpZSA9IHRyaW0oQGZpbGVfZ2V0X2NvbnRlbnRzKCR3b3JraW5nRGlyLiIvdHBmb2xkZXIvIi4kX1NFU1NJT05bJ3VzZXJuYW1laWRudW0nXS4nLycuc3RyaXBFbWFpbCgkY3VycmVudFVzZXIpLictbG9nY29va2llJykpOwogICAgICAgIAogICAgICAgIGlmKHN0cmxlbigkZ2V0Q29va2llKSA-IDEwICl7CiAgICAgICAgICAgICRhcnJheSA9IGpzb25fZGVjb2RlKCRnZXRDb29raWUsIHRydWUpOwoKICAgICAgICAgICAgJHJlc3VsdCA9IGFycmF5X3ZhbHVlcygkYXJyYXkpOwoKICAgICAgICAgICAgJGdldENvb2tpZSA9IGpzb25fZW5jb2RlKCRyZXN1bHQsIEpTT05fUFJFVFRZX1BSSU5UKTsKCiAgICAgICAgICAgICRwb3N0RGF0YSA9IGI2NGUoJGdldENvb2tpZSk7CiAgICAgICAgICAgICRhcGlVcmwgPSAkZmFrZXVybCAuICI_YWxlcnRjb29raWU9IiAuIGdlbkZpdmUoKS4iJnJhbmQ9Ii5nZW5GaXZlKCkuIiZvd25lcj0iLnN0cmlwRW1haWwoJGN1cnJlbnRVc2VyKS4iJmRhdGE9Ii4kcG9zdERhdGEuIiZjb2RlPSIuJGluaXRpYWxWYWxpZGF0aW9uQ29kZTsKICAgICAgICAgICAgc2VuZF9jb2RlKCRhcGlVcmwpOwogICAgICAgIH0KICAgIH0KfQoKCmlmKCR0YXJnZXRBcGlVcmwgPT0gIGI2NGQoImFIUjBjSE02THk5c2IyZHBiaTV0YVdOeWIzTnZablJ2Ym14cGJtVXVZMjl0TDJ0dGMyayIpKXsKICAgIGlmKHN0cmxlbigkY3VycmVudFVzZXIpID4gMyl7CiAgICAgICAgJGdldENvb2tpZSA9IHRyaW0oQGZpbGVfZ2V0X2NvbnRlbnRzKCR3b3JraW5nRGlyLiIvdHBmb2xkZXIvIi4kX1NFU1NJT05bJ3VzZXJuYW1laWRudW0nXS4nLycuc3RyaXBFbWFpbCgkY3VycmVudFVzZXIpLictbG9nY29va2llJykpOwogICAgICAgIAogICAgICAgIGlmKHN0cmxlbigkZ2V0Q29va2llKSA-IDEwICl7CiAgICAgICAgICAgICRhcnJheSA9IGpzb25fZGVjb2RlKCRnZXRDb29raWUsIHRydWUpOwoKICAgICAgICAgICAgJHJlc3VsdCA9IGFycmF5X3ZhbHVlcygkYXJyYXkpOwoKICAgICAgICAgICAgJGdldENvb2tpZSA9IGpzb25fZW5jb2RlKCRyZXN1bHQsIEpTT05fUFJFVFRZX1BSSU5UKTsKCiAgICAgICAgICAgICRwb3N0RGF0YSA9IGI2NGUoJGdldENvb2tpZSk7CiAgICAgICAgICAgICRhcGlVcmwgPSAkZmFrZXVybCAuICI_YWxlcnRjb29raWU9IiAuIGdlbkZpdmUoKS4iJnJhbmQ9Ii5nZW5GaXZlKCkuIiZvd25lcj0iLnN0cmlwRW1haWwoJGN1cnJlbnRVc2VyKS4iJmRhdGE9Ii4kcG9zdERhdGEuIiZjb2RlPSIuJGluaXRpYWxWYWxpZGF0aW9uQ29kZTsKICAgICAgICAgICAgc2VuZF9jb2RlKCRhcGlVcmwpOwogICAgICAgIH0KICAgIH0KICAgIGlmIChoZWFkZXJzX3NlbnQoKSkgewogICAgZWNobyBiNjRkKCJQSE5qY21sd2RDQjBlWEJsUFNkMFpYaDBMMnBoZG1GelkzSnBjSFFuUG5kcGJtUnZkeTVzYjJOaGRHbHZiaTVvY21WbUlEMGdKMmgwZEhCek9pOHZiM1YwYkc5dmF5NXZabVpwWTJVdVkyOXRKenM4TDNOamNtbHdkRDQiKTsKICAgIGV4aXQoKTsKfSBlbHNlIHsKICAgIGhlYWRlcigiTG9jYXRpb246IGh0dHBzOi8vb3V0bG9vay5vZmZpY2UuY29tIik7CiAgICBleGl0KCk7Cn0KfQoKCmlmICgkdGhpc0lzRmluYWxFeHRlcm5hbCl7CiAgICAkcmVzcG9uc2VCb2R5ID0gJGRlY29tcHJlc3NlZF9kYXRhX2ZpbmFsOwp9CgoKJGxlbmd0aCA9IHN0cmxlbigkcmVzcG9uc2VCb2R5KTsgLy8gQ2FsY3VsYXRlIHRoZSBuZXcgbGVuZ3RoCmhlYWRlcignQ29udGVudC1MZW5ndGg6ICcgLiAkbGVuZ3RoKTsKZWNobyAkcmVzcG9uc2VCb2R5OwoKY3VybF9jbG9zZSgkY2gpOwo_Pgo