1 line
29 KiB
Python
1 line
29 KiB
Python
IyBDb3B5cmlnaHQgKEMpIDIwMjUgQ2V0bWl4IE/DnAojIExpY2Vuc2UgQUdQTC0zLjAgb3IgbGF0ZXIgKGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsKS4KCmltcG9ydCBqc29uCmZyb20gdW5pdHRlc3QubW9jayBpbXBvcnQgcGF0Y2gKCmZyb20gb2Rvby50ZXN0cyBpbXBvcnQgSHR0cENhc2UsIHRhZ2dlZAoKCkB0YWdnZWQoIi1hdF9pbnN0YWxsIiwgInBvc3RfaW5zdGFsbCIpCmNsYXNzIFRlc3RDeFRvd2VyV2ViaG9va0NvbnRyb2xsZXIoSHR0cENhc2UpOgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgogICAgICAgIHN1cGVyKCkuc2V0VXBDbGFzcygpCiAgICAgICAgZW52ID0gY2xzLmVudgogICAgICAgICMgQXV0aGVudGljYXRvciB0aGF0IGFsd2F5cyBhbGxvd3MgcmVxdWVzdHMKICAgICAgICBjbHMuYXV0aGVudGljYXRvciA9IGVudlsiY3gudG93ZXIud2ViaG9vay5hdXRoZW50aWNhdG9yIl0uY3JlYXRlKAogICAgICAgICAgICB7Im5hbWUiOiAiQWx3YXlzIE9LIiwgImNvZGUiOiAicmVzdWx0ID0geydhbGxvd2VkJzogVHJ1ZX0ifQogICAgICAgICkKICAgICAgICAjIFBPU1Qgd2ViaG9vawogICAgICAgIGNscy53ZWJob29rX3Bvc3QgPSBlbnZbImN4LnRvd2VyLndlYmhvb2siXS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgV2ViaG9vayBQT1NUIiwKICAgICAgICAgICAgICAgICJlbmRwb2ludCI6ICJ3ZWJob29rX3Bvc3QiLAogICAgICAgICAgICAgICAgIm1ldGhvZCI6ICJwb3N0IiwKICAgICAgICAgICAgICAgICJhdXRoZW50aWNhdG9yX2lkIjogY2xzLmF1dGhlbnRpY2F0b3IuaWQsCiAgICAgICAgICAgICAgICAiY29kZSI6ICJyZXN1bHQgPSB7J2V4aXRfY29kZSc6IDAsICdtZXNzYWdlJzogJ1BPU1Qgb2snfSIsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgIyBHRVQgd2ViaG9vawogICAgICAgIGNscy53ZWJob29rX2dldCA9IGVudlsiY3gudG93ZXIud2ViaG9vayJdLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBXZWJob29rIEdFVCIsCiAgICAgICAgICAgICAgICAiZW5kcG9pbnQiOiAid2ViaG9va19nZXQiLAogICAgICAgICAgICAgICAgIm1ldGhvZCI6ICJnZXQiLAogICAgICAgICAgICAgICAgImF1dGhlbnRpY2F0b3JfaWQiOiBjbHMuYXV0aGVudGljYXRvci5pZCwKICAgICAgICAgICAgICAgICJjb2RlIjogInJlc3VsdCA9IHsnZXhpdF9jb2RlJzogMCwgJ21lc3NhZ2UnOiAnR0VUIG9rJ30iLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgICMgTG9nIG1vZGVsCiAgICAgICAgY2xzLkxvZyA9IGVudlsiY3gudG93ZXIud2ViaG9vay5sb2ciXQoKICAgIGRlZiB1cmxfZm9yKHNlbGYsIGVuZHBvaW50KToKICAgICAgICAiIiJIZWxwZXIgdG8gYnVpbGQgd2ViaG9vayB1cmwiIiIKICAgICAgICB1cmwgPSBmIi9jZXRtaXhfdG93ZXJfd2ViaG9va3Mve2VuZHBvaW50fSIKICAgICAgICByZXR1cm4gc2VsZi5iYXNlX3VybCgpICsgdXJsCgogICAgZGVmIGFzc2VydF9sb2coc2VsZiwgbG9nPU5vbmUsIHJlcXVlc3RfcGF5bG9hZD1Ob25lLCAqKmV4cGVjdGVkKToKICAgICAgICAiIiIKICAgICAgICBVbml2ZXJzYWwgbG9nIGNoZWNrZXIgZm9yIHdlYmhvb2sgbG9nIG1vZGVsLgogICAgICAgIENoZWNrcyBleHBlY3RlZCBmaWVsZCB2YWx1ZXMgYW5kIHN1YnN0cmluZ3MuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5hc3NlcnRJc05vdE5vbmUobG9nLCAiTG9nIHJlY29yZCB3YXMgbm90IGNyZWF0ZWQiKQogICAgICAgIGlmIHJlcXVlc3RfcGF5bG9hZCBpcyBub3QgTm9uZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgbG9nX3BheWxvYWQgPSBsb2cucmVxdWVzdF9wYXlsb2FkCiAgICAgICAgICAgICAgICAjIHRyeSB0byBjb252ZXJ0IGJvdGggdG8gUHl0aG9uIGRpY3QgZm9yIGNvbXBhcmlzb24KICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobG9nX3BheWxvYWQsIHN0cik6CiAgICAgICAgICAgICAgICAgICAgbG9nX3BheWxvYWQgPSBsb2dfcGF5bG9hZC5zdHJpcCgpCiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydERpY3RFcXVhbCgKICAgICAgICAgICAgICAgICAgICBqc29uLmxvYWRzKAogICAgICAgICAgICAgICAgICAgICAgICBsb2dfcGF5bG9hZC5yZXBsYWNlKCInIiwgJyInKQogICAgICAgICAgICAgICAgICAgICksICAjIHRyeSB0byBtYWtlIEpTT04gZnJvbSBwb3NzaWJsZSBzdHIoZGljdCkKICAgICAgICAgICAgICAgICAgICBqc29uLmxvYWRzKHJlcXVlc3RfcGF5bG9hZCksCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXg6CiAgICAgICAgICAgICAgICBzZWxmLmZhaWwoCiAgICAgICAgICAgICAgICAgICAgZiJQYXlsb2FkIGNvbXBhcmlzb24gZmFpbGVkOiB7ZXh9XG5Mb2c6IHtsb2cucmVxdWVzdF9wYXlsb2FkfVxuRXhwZWN0ZWQ6IHtyZXF1ZXN0X3BheWxvYWR9IiAgIyBub3FhOiBFNTAxCiAgICAgICAgICAgICAgICApCiAgICAgICAgZm9yIGZpZWxkLCB2YWx1ZSBpbiBleHBlY3RlZC5pdGVtcygpOgogICAgICAgICAgICBpZiBmaWVsZCA9PSAicmVxdWVzdF9wYXlsb2FkIjoKICAgICAgICAgICAgICAgIGNvbnRpbnVlICAjIEFscmVhZHkgY2hlY2tlZAogICAgICAgICAgICBhY3R1YWwgPSBnZXRhdHRyKGxvZywgZmllbGQpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWN0dWFsLCB2YWx1ZSwgZiJ7ZmllbGR9OiBleHBlY3RlZCB7dmFsdWV9LCBnb3Qge2FjdHVhbH0iKQoKICAgIGRlZiB0ZXN0X3Bvc3Rfd2ViaG9va19zdWNjZXNzKHNlbGYpOgogICAgICAgICIiIlN1Y2Nlc3MgdGVzdCBmb3IgUE9TVCByZXF1ZXN0IHdpdGggY29ycmVjdCBwYXlsb2FkLiIiIgogICAgICAgIGRhdGEgPSBqc29uLmR1bXBzKHsic29tZSI6ICJkYXRhIn0pCiAgICAgICAgcmVzcG9uc2UgPSBzZWxmLnVybF9vcGVuKAogICAgICAgICAgICBzZWxmLnVybF9mb3Ioc2VsZi53ZWJob29rX3Bvc3QuZW5kcG9pbnQpLAogICAgICAgICAgICBkYXRhPWRhdGEsCiAgICAgICAgICAgIGhlYWRlcnM9eyJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24vanNvbiJ9LAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3BvbnNlLnN0YXR1c19jb2RlLCAyMDApCiAgICAgICAgc2VsZi5hc3NlcnRJbihiIlBPU1Qgb2siLCByZXNwb25zZS5jb250ZW50KQoKICAgICAgICBsb2cgPSBzZWxmLkxvZy5zZWFyY2goWygid2ViaG9va19pZCIsICI9Iiwgc2VsZi53ZWJob29rX3Bvc3QuaWQpXSkKICAgICAgICBzZWxmLmFzc2VydF9sb2coCiAgICAgICAgICAgIGxvZywKICAgICAgICAgICAgY29kZV9zdGF0dXM9InN1Y2Nlc3MiLAogICAgICAgICAgICBhdXRoZW50aWNhdGlvbl9zdGF0dXM9InN1Y2Nlc3MiLAogICAgICAgICAgICBodHRwX3N0YXR1cz0yMDAsCiAgICAgICAgICAgIGVuZHBvaW50PXNlbGYud2ViaG9va19wb3N0LmVuZHBvaW50LAogICAgICAgICAgICByZXF1ZXN0X3BheWxvYWQ9ZGF0YSwKICAgICAgICApCgogICAgZGVmIHRlc3RfZ2V0X3dlYmhvb2tfc3VjY2VzcyhzZWxmKToKICAgICAgICAiIiJTdWNjZXNzIHRlc3QgZm9yIEdFVCByZXF1ZXN0IHdpdGggY29ycmVjdCBwYXlsb2FkLiIiIgogICAgICAgIHJlc3BvbnNlID0gc2VsZi51cmxfb3BlbigKICAgICAgICAgICAgZiJ7c2VsZi51cmxfZm9yKHNlbGYud2ViaG9va19nZXQuZW5kcG9pbnQpfT9mb289YmFyIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNwb25zZS5zdGF0dXNfY29kZSwgMjAwKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oYiJHRVQgb2siLCByZXNwb25zZS5jb250ZW50KQoKICAgICAgICBsb2cgPSBzZWxmLkxvZy5zZWFyY2goWygid2ViaG9va19pZCIsICI9Iiwgc2VsZi53ZWJob29rX2dldC5pZCldKQogICAgICAgIHNlbGYuYXNzZXJ0X2xvZygKICAgICAgICAgICAgbG9nLAogICAgICAgICAgICBjb2RlX3N0YXR1cz0ic3VjY2VzcyIsCiAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uX3N0YXR1cz0ic3VjY2VzcyIsCiAgICAgICAgICAgIGh0dHBfc3RhdHVzPTIwMCwKICAgICAgICAgICAgZW5kcG9pbnQ9c2VsZi53ZWJob29rX2dldC5lbmRwb2ludCwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRJbigiZm9vIiwgbG9nLnJlcXVlc3RfcGF5bG9hZCkKCiAgICBkZWYgdGVzdF93ZWJob29rX25vdF9mb3VuZChzZWxmKToKICAgICAgICAiIiJUZXN0IHJlcXVlc3QgdG8gYSBub24tZXhpc3Rpbmcgd2ViaG9vayBlbmRwb2ludC4iIiIKICAgICAgICBkYXRhID0ganNvbi5kdW1wcyh7InRlc3QiOiAxfSkKICAgICAgICByZXNwb25zZSA9IHNlbGYudXJsX29wZW4oCiAgICAgICAgICAgIHNlbGYudXJsX2ZvcigibWlzc2luZyIpLAogICAgICAgICAgICBkYXRhPWRhdGEsCiAgICAgICAgICAgIGhlYWRlcnM9eyJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24vanNvbiJ9LAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3BvbnNlLnN0YXR1c19jb2RlLCA0MDQpCiAgICAgICAgc2VsZi5hc3NlcnRJbihiIldlYmhvb2sgbm90IGZvdW5kIiwgcmVzcG9uc2UuY29udGVudCkKCiAgICAgICAgbG9nID0gc2VsZi5Mb2cuc2VhcmNoKFsoIndlYmhvb2tfaWQiLCAiPSIsIEZhbHNlKV0pCiAgICAgICAgc2VsZi5hc3NlcnRfbG9nKAogICAgICAgICAgICBsb2csCiAgICAgICAgICAgIGNvZGVfc3RhdHVzPSJza2lwcGVkIiwKICAgICAgICAgICAgYXV0aGVudGljYXRpb25fc3RhdHVzPSJmYWlsZWQiLAogICAgICAgICAgICBodHRwX3N0YXR1cz00MDQsCiAgICAgICAgICAgIGVuZHBvaW50PSJtaXNzaW5nIiwKICAgICAgICAgICAgZXJyb3JfbWVzc2FnZT0iV2ViaG9vayBub3QgZm91bmQiLAogICAgICAgICAgICByZXF1ZXN0X3BheWxvYWQ9ZGF0YSwKICAgICAgICApCgogICAgZGVmIHRlc3Rfd3JvbmdfbWV0aG9kKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgR0VUIHJlcXVlc3QgdG8gUE9TVC1vbmx5IHdlYmhvb2suCiAgICAgICAgIiIiCiAgICAgICAgcmVzcG9uc2UgPSBzZWxmLnVybF9vcGVuKAogICAgICAgICAgICBzZWxmLnVybF9mb3Ioc2VsZi53ZWJob29rX3Bvc3QuZW5kcG9pbnQpLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3BvbnNlLnN0YXR1c19jb2RlLCA0MDQpCiAgICAgICAgc2VsZi5hc3NlcnRJbihiIldlYmhvb2sgbm90IGZvdW5kIiwgcmVzcG9uc2UuY29udGVudCkKCiAgICAgICAgbG9nID0gc2VsZi5Mb2cuc2VhcmNoKFsoIndlYmhvb2tfaWQiLCAiPSIsIEZhbHNlKV0pCiAgICAgICAgc2VsZi5hc3NlcnRfbG9nKAogICAgICAgICAgICBsb2csCiAgICAgICAgICAgIGNvZGVfc3RhdHVzPSJza2lwcGVkIiwKICAgICAgICAgICAgYXV0aGVudGljYXRpb25fc3RhdHVzPSJmYWlsZWQiLAogICAgICAgICAgICBodHRwX3N0YXR1cz00MDQsCiAgICAgICAgICAgIGVycm9yX21lc3NhZ2U9IldlYmhvb2sgbm90IGZvdW5kIiwKICAgICAgICAgICAgZW5kcG9pbnQ9c2VsZi53ZWJob29rX3Bvc3QuZW5kcG9pbnQsCiAgICAgICAgICAgIHJlcXVlc3RfbWV0aG9kPSJnZXQiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9taXNzaW5nX3BheWxvYWRfcG9zdChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IFBPU1QgcmVxdWVzdCB3aXRoIGVtcHR5IHBheWxvYWQuCiAgICAgICAgIiIiCiAgICAgICAgIyB1c2Ugb3BlbmVyIGluc3RlYWQgb2YgdXJsX29wZW4gdG8gYXZvaWQgY2hlY2tpbmcgb2YgZGF0YQogICAgICAgIHJlc3BvbnNlID0gc2VsZi5vcGVuZXIucG9zdCgKICAgICAgICAgICAgc2VsZi51cmxfZm9yKHNlbGYud2ViaG9va19wb3N0LmVuZHBvaW50KSwKICAgICAgICAgICAgdGltZW91dD0xMjAwMDAwLAogICAgICAgICAgICBoZWFkZXJzPXsiQ29udGVudC1UeXBlIjogImFwcGxpY2F0aW9uL2pzb24ifSwKICAgICAgICAgICAgYWxsb3dfcmVkaXJlY3RzPVRydWUsCiAgICAgICAgKQoKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3BvbnNlLnN0YXR1c19jb2RlLCAyMDApCiAgICAgICAgc2VsZi5hc3NlcnRJbihiIlBPU1Qgb2siLCByZXNwb25zZS5jb250ZW50KQoKICAgICAgICBsb2cgPSBzZWxmLkxvZy5zZWFyY2goWygid2ViaG9va19pZCIsICI9Iiwgc2VsZi53ZWJob29rX3Bvc3QuaWQpXSkKICAgICAgICBzZWxmLmFzc2VydF9sb2coCiAgICAgICAgICAgIGxvZywKICAgICAgICAgICAgY29kZV9zdGF0dXM9InN1Y2Nlc3MiLAogICAgICAgICAgICBhdXRoZW50aWNhdGlvbl9zdGF0dXM9InN1Y2Nlc3MiLAogICAgICAgICAgICBodHRwX3N0YXR1cz0yMDAsCiAgICAgICAgICAgIGVuZHBvaW50PXNlbGYud2ViaG9va19wb3N0LmVuZHBvaW50LAogICAgICAgICAgICByZXF1ZXN0X3BheWxvYWQ9Int9IiwKICAgICAgICApCgogICAgZGVmIHRlc3RfYXV0aGVudGljYXRpb25fZmFpbGVkKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgUE9TVCByZXF1ZXN0IHdpdGggYXV0aGVudGljYXRvciB0aGF0IGFsd2F5cyBkZW5pZXMuCiAgICAgICAgIiIiCiAgICAgICAgYmFkX2F1dGggPSBzZWxmLmVudlsiY3gudG93ZXIud2ViaG9vay5hdXRoZW50aWNhdG9yIl0uY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJOZXZlciBPSyIsCiAgICAgICAgICAgICAgICAiY29kZSI6ICJyZXN1bHQgPSB7J2FsbG93ZWQnOiBGYWxzZSwgJ2N1c3RvbV9tZXNzYWdlJzogJ0ZvcmJpZGRlbid9IiwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICB3ZWJob29rID0gc2VsZi5lbnZbImN4LnRvd2VyLndlYmhvb2siXS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIkZvcmJpZGRlbiBXZWJob29rIiwKICAgICAgICAgICAgICAgICJlbmRwb2ludCI6ICJmb3JiaWRkZW4iLAogICAgICAgICAgICAgICAgIm1ldGhvZCI6ICJwb3N0IiwKICAgICAgICAgICAgICAgICJhdXRoZW50aWNhdG9yX2lkIjogYmFkX2F1dGguaWQsCiAgICAgICAgICAgICAgICAiY29kZSI6ICJyZXN1bHQgPSB7J2V4aXRfY29kZSc6IDAsICdtZXNzYWdlJzogJ1Nob3VsZCBub3QgcnVuJ30iLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIGRhdGEgPSBqc29uLmR1bXBzKHsiZmFpbCI6IDF9KQogICAgICAgIHJlc3BvbnNlID0gc2VsZi51cmxfb3BlbigKICAgICAgICAgICAgc2VsZi51cmxfZm9yKHdlYmhvb2suZW5kcG9pbnQpLAogICAgICAgICAgICBkYXRhPWRhdGEsCiAgICAgICAgICAgIGhlYWRlcnM9eyJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24vanNvbiJ9LAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3BvbnNlLnN0YXR1c19jb2RlLCA0MDMpCiAgICAgICAgc2VsZi5hc3NlcnRJbihiIkF1dGhlbnRpY2F0aW9uIG5vdCBhbGxvd2VkIiwgcmVzcG9uc2UuY29udGVudCkKCiAgICAgICAgbG9nID0gc2VsZi5Mb2cuc2VhcmNoKFsoIndlYmhvb2tfaWQiLCAiPSIsIHdlYmhvb2suaWQpXSkKICAgICAgICBzZWxmLmFzc2VydF9sb2coCiAgICAgICAgICAgIGxvZywKICAgICAgICAgICAgY29kZV9zdGF0dXM9InNraXBwZWQiLAogICAgICAgICAgICBhdXRoZW50aWNhdGlvbl9zdGF0dXM9ImZhaWxlZCIsCiAgICAgICAgICAgIGh0dHBfc3RhdHVzPTQwMywKICAgICAgICAgICAgZW5kcG9pbnQ9d2ViaG9vay5lbmRwb2ludCwKICAgICAgICAgICAgcmVxdWVzdF9wYXlsb2FkPWRhdGEsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3dlYmhvb2tfY29kZV9mYWlsdXJlKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgUE9TVCByZXF1ZXN0IHRvIGEgd2ViaG9vayB0aGF0IHJhaXNlcyBhbiBleGNlcHRpb24gaW4gY29kZS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLndlYmhvb2tfcG9zdC5jb2RlID0gInJhaXNlIEV4Y2VwdGlvbignU29tZSBlcnJvciEnKSIKICAgICAgICByZXNwb25zZSA9IHNlbGYudXJsX29wZW4oCiAgICAgICAgICAgIHNlbGYudXJsX2ZvcihzZWxmLndlYmhvb2tfcG9zdC5lbmRwb2ludCksCiAgICAgICAgICAgIGRhdGE9anNvbi5kdW1wcyh7fSksCiAgICAgICAgICAgIGhlYWRlcnM9eyJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24vanNvbiJ9LAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3BvbnNlLnN0YXR1c19jb2RlLCA1MDApCiAgICAgICAgc2VsZi5hc3NlcnRJbihiIlNvbWUgZXJyb3IhIiwgcmVzcG9uc2UuY29udGVudCkKCiAgICAgICAgbG9nID0gc2VsZi5Mb2cuc2VhcmNoKFsoIndlYmhvb2tfaWQiLCAiPSIsIHNlbGYud2ViaG9va19wb3N0LmlkKV0pCiAgICAgICAgc2VsZi5hc3NlcnRfbG9nKAogICAgICAgICAgICBsb2csCiAgICAgICAgICAgIGNvZGVfc3RhdHVzPSJmYWlsZWQiLAogICAgICAgICAgICBhdXRoZW50aWNhdGlvbl9zdGF0dXM9InN1Y2Nlc3MiLAogICAgICAgICAgICBodHRwX3N0YXR1cz01MDAsCiAgICAgICAgICAgIGVuZHBvaW50PXNlbGYud2ViaG9va19wb3N0LmVuZHBvaW50LAogICAgICAgICAgICByZXF1ZXN0X3BheWxvYWQ9Int9IiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRJbigiU29tZSBlcnJvciEiLCBsb2cuZXJyb3JfbWVzc2FnZSkKCiAgICBkZWYgdGVzdF9qc29uX2hlYWRlcnNfYXJlX3N0b3JlZChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHRoYXQgcmVxdWVzdCBoZWFkZXJzIGFuZCBwYXlsb2FkIGFyZSBzYXZlZCBpbiB3ZWJob29rIGxvZyByZWNvcmQuCiAgICAgICAgIiIiCiAgICAgICAgcGF5bG9hZCA9IHsiZm9vIjogImJhciJ9CiAgICAgICAgaGVhZGVycyA9IHsiWC1UZXN0LUhlYWRlciI6ICJ4eHgiLCAiQ29udGVudC1UeXBlIjogImFwcGxpY2F0aW9uL2pzb24ifQogICAgICAgIHJlc3BvbnNlID0gc2VsZi51cmxfb3BlbigKICAgICAgICAgICAgc2VsZi51cmxfZm9yKHNlbGYud2ViaG9va19wb3N0LmVuZHBvaW50KSwKICAgICAgICAgICAgZGF0YT1qc29uLmR1bXBzKHBheWxvYWQpLAogICAgICAgICAgICBoZWFkZXJzPWhlYWRlcnMsCiAgICAgICAgKQoKICAgICAgICBsb2cgPSBzZWxmLkxvZy5zZWFyY2goWygid2ViaG9va19pZCIsICI9Iiwgc2VsZi53ZWJob29rX3Bvc3QuaWQpXSkKICAgICAgICBzZWxmLmFzc2VydF9sb2coCiAgICAgICAgICAgIGxvZywKICAgICAgICAgICAgY29kZV9zdGF0dXM9InN1Y2Nlc3MiLAogICAgICAgICAgICBhdXRoZW50aWNhdGlvbl9zdGF0dXM9InN1Y2Nlc3MiLAogICAgICAgICAgICBodHRwX3N0YXR1cz0yMDAsCiAgICAgICAgICAgIGVuZHBvaW50PXNlbGYud2ViaG9va19wb3N0LmVuZHBvaW50LAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEluKCJmb28iLCBsb2cucmVxdWVzdF9wYXlsb2FkKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oIlgtVGVzdC1IZWFkZXIiLCBsb2cucmVxdWVzdF9oZWFkZXJzKQogICAgICAgIHNlbGYuYXNzZXJ0SW4obG9nLnJlc3VsdF9tZXNzYWdlLCByZXNwb25zZS50ZXh0KQoKICAgIGRlZiB0ZXN0X2xvZ19jb250YWluc19pcChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHRoYXQgdGhlIGxvZyBjb250YWlucyB0aGUgY2xpZW50J3MgSVAgYWRkcmVzcyBhbmQgY291bnRyeSAoaWYgYXZhaWxhYmxlKS4KICAgICAgICAiIiIKICAgICAgICBwYXlsb2FkID0geyJjaGVjayI6ICJpcCJ9CiAgICAgICAgc2VsZi51cmxfb3BlbigKICAgICAgICAgICAgc2VsZi51cmxfZm9yKHNlbGYud2ViaG9va19wb3N0LmVuZHBvaW50KSwKICAgICAgICAgICAgZGF0YT1qc29uLmR1bXBzKHBheWxvYWQpLAogICAgICAgICAgICBoZWFkZXJzPXsiQ29udGVudC1UeXBlIjogImFwcGxpY2F0aW9uL2pzb24ifSwKICAgICAgICApCgogICAgICAgIGxvZyA9IHNlbGYuTG9nLnNlYXJjaChbKCJ3ZWJob29rX2lkIiwgIj0iLCBzZWxmLndlYmhvb2tfcG9zdC5pZCldKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsb2cuaXBfYWRkcmVzcykKCiAgICBkZWYgdGVzdF9pbmFjdGl2ZV93ZWJob29rKHNlbGYpOgogICAgICAgICIiIlRlc3QgdGhhdCBpbmFjdGl2ZSB3ZWJob29rcyBhcmUgbm90IGNhbGxhYmxlLiIiIgogICAgICAgIHNlbGYud2ViaG9va19wb3N0LmFjdGl2ZSA9IEZhbHNlCiAgICAgICAgcmVzcG9uc2UgPSBzZWxmLnVybF9vcGVuKAogICAgICAgICAgICBzZWxmLnVybF9mb3Ioc2VsZi53ZWJob29rX3Bvc3QuZW5kcG9pbnQpLAogICAgICAgICAgICBkYXRhPWpzb24uZHVtcHMoeyJhIjogMX0pLAogICAgICAgICAgICBoZWFkZXJzPXsiQ29udGVudC1UeXBlIjogImFwcGxpY2F0aW9uL2pzb24ifSwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNwb25zZS5zdGF0dXNfY29kZSwgNDA0KQogICAgICAgIHNlbGYuYXNzZXJ0SW4oYiJXZWJob29rIG5vdCBmb3VuZCIsIHJlc3BvbnNlLmNvbnRlbnQpCgogICAgZGVmIHRlc3RfYXV0aGVudGljYXRvcl9jb2RlX3JhaXNlcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHRoYXQgaWYgYXV0aGVudGljYXRvcidzIGNvZGUgcmFpc2VzIGFuIGVycm9yLAogICAgICAgIHByb3BlciBsb2cgaXMgY3JlYXRlZCBhbmQgNDAzIHJldHVybmVkLgogICAgICAgICIiIgogICAgICAgIGJhZF9hdXRoID0gc2VsZi5lbnZbImN4LnRvd2VyLndlYmhvb2suYXV0aGVudGljYXRvciJdLmNyZWF0ZSgKICAgICAgICAgICAgeyJuYW1lIjogIkJyb2tlbiBBdXRoIiwgImNvZGUiOiAicmFpc2UgRXhjZXB0aW9uKCdhdXRoIGZhaWwnKSJ9CiAgICAgICAgKQogICAgICAgIHdlYmhvb2sgPSBzZWxmLmVudlsiY3gudG93ZXIud2ViaG9vayJdLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiV2ViIHdpdGggYmFkIGF1dGgiLAogICAgICAgICAgICAgICAgImVuZHBvaW50IjogImJhZF9hdXRoIiwKICAgICAgICAgICAgICAgICJtZXRob2QiOiAicG9zdCIsCiAgICAgICAgICAgICAgICAiYXV0aGVudGljYXRvcl9pZCI6IGJhZF9hdXRoLmlkLAogICAgICAgICAgICAgICAgImNvZGUiOiAicmVzdWx0ID0geydleGl0X2NvZGUnOiAwLCAnbWVzc2FnZSc6ICdTaG91bGQgbm90IHJ1bid9IiwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICByZXNwb25zZSA9IHNlbGYudXJsX29wZW4oCiAgICAgICAgICAgIHNlbGYudXJsX2Zvcih3ZWJob29rLmVuZHBvaW50KSwKICAgICAgICAgICAgZGF0YT1qc29uLmR1bXBzKHsieCI6IDF9KSwKICAgICAgICAgICAgaGVhZGVycz17IkNvbnRlbnQtVHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uIn0sCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzcG9uc2Uuc3RhdHVzX2NvZGUsIDQwMykKICAgICAgICBzZWxmLmFzc2VydEluKGIiYXV0aCBmYWlsIiwgcmVzcG9uc2UuY29udGVudCkKCiAgICAgICAgbG9nID0gc2VsZi5Mb2cuc2VhcmNoKFsoIndlYmhvb2tfaWQiLCAiPSIsIHdlYmhvb2suaWQpXSkKICAgICAgICBzZWxmLmFzc2VydF9sb2coCiAgICAgICAgICAgIGxvZywKICAgICAgICAgICAgY29kZV9zdGF0dXM9InNraXBwZWQiLAogICAgICAgICAgICBhdXRoZW50aWNhdGlvbl9zdGF0dXM9ImZhaWxlZCIsCiAgICAgICAgICAgIGh0dHBfc3RhdHVzPTQwMywKICAgICAgICAgICAgZW5kcG9pbnQ9d2ViaG9vay5lbmRwb2ludCwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRJbigiYXV0aCBmYWlsIiwgbG9nLmVycm9yX21lc3NhZ2UpCgogICAgZGVmIHRlc3RfcG9zdF93ZWJob29rX2pzb25fY29udGVudF90eXBlKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgUE9TVCByZXF1ZXN0IHdpdGggY29udGVudF90eXBlIGpzb24uCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi53ZWJob29rX3Bvc3QuY29udGVudF90eXBlID0gImpzb24iCiAgICAgICAgc2VsZi53ZWJob29rX3Bvc3QuY29kZSA9ICJyZXN1bHQgPSB7J2V4aXRfY29kZSc6IDAsICdtZXNzYWdlJzogJ1BPU1QgSlNPTiBvayd9IgoKICAgICAgICBkYXRhID0ganNvbi5kdW1wcyh7Impzb25fdGVzdCI6ICJvayJ9KQogICAgICAgIHJlc3BvbnNlID0gc2VsZi51cmxfb3BlbigKICAgICAgICAgICAgc2VsZi51cmxfZm9yKHNlbGYud2ViaG9va19wb3N0LmVuZHBvaW50KSwKICAgICAgICAgICAgZGF0YT1kYXRhLAogICAgICAgICAgICBoZWFkZXJzPXsiQ29udGVudC1UeXBlIjogImFwcGxpY2F0aW9uL2pzb24ifSwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNwb25zZS5zdGF0dXNfY29kZSwgMjAwKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oYiJQT1NUIEpTT04gb2siLCByZXNwb25zZS5jb250ZW50KQoKICAgICAgICBsb2cgPSBzZWxmLkxvZy5zZWFyY2goWygid2ViaG9va19pZCIsICI9Iiwgc2VsZi53ZWJob29rX3Bvc3QuaWQpXSkKICAgICAgICBzZWxmLmFzc2VydF9sb2coCiAgICAgICAgICAgIGxvZywKICAgICAgICAgICAgY29kZV9zdGF0dXM9InN1Y2Nlc3MiLAogICAgICAgICAgICBhdXRoZW50aWNhdGlvbl9zdGF0dXM9InN1Y2Nlc3MiLAogICAgICAgICAgICBodHRwX3N0YXR1cz0yMDAsCiAgICAgICAgICAgIGVuZHBvaW50PXNlbGYud2ViaG9va19wb3N0LmVuZHBvaW50LAogICAgICAgICAgICByZXF1ZXN0X3BheWxvYWQ9ZGF0YSwKICAgICAgICApCgogICAgZGVmIHRlc3RfcG9zdF93ZWJob29rX2Zvcm1fY29udGVudF90eXBlKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgUE9TVCByZXF1ZXN0IHdpdGggY29udGVudF90eXBlIGZvcm0uCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi53ZWJob29rX3Bvc3QuY29udGVudF90eXBlID0gImZvcm0iCiAgICAgICAgc2VsZi53ZWJob29rX3Bvc3QuY29kZSA9ICJyZXN1bHQgPSB7J2V4aXRfY29kZSc6IDAsICdtZXNzYWdlJzogJ1BPU1QgRk9STSBvayd9IgoKICAgICAgICBkYXRhID0geyJmb3JtX2ZpZWxkIjogIm9rIn0KICAgICAgICByZXNwb25zZSA9IHNlbGYudXJsX29wZW4oCiAgICAgICAgICAgIHNlbGYudXJsX2ZvcihzZWxmLndlYmhvb2tfcG9zdC5lbmRwb2ludCksCiAgICAgICAgICAgIGRhdGE9ZGF0YSwKICAgICAgICAgICAgaGVhZGVycz17IkNvbnRlbnQtVHlwZSI6ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQifSwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNwb25zZS5zdGF0dXNfY29kZSwgMjAwKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oYiJQT1NUIEZPUk0gb2siLCByZXNwb25zZS5jb250ZW50KQoKICAgICAgICBsb2cgPSBzZWxmLkxvZy5zZWFyY2goWygid2ViaG9va19pZCIsICI9Iiwgc2VsZi53ZWJob29rX3Bvc3QuaWQpXSkKICAgICAgICBzZWxmLmFzc2VydEluKCJmb3JtX2ZpZWxkIiwgbG9nLnJlcXVlc3RfcGF5bG9hZCkKCiAgICBkZWYgdGVzdF9hdXRoZW50aWNhdG9yX2lwdjRfYW5kX2lwdjYoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCBJUCBmaWx0ZXIgZm9yIElQdjQsIElQdjYsIGFuZCBuZXR3b3JrcwogICAgICAgIGJ5IG1vbmtleXBhdGNoaW5nIFJFTU9URV9BRERSIGluIGVudmlyb24uCiAgICAgICAgIiIiCiAgICAgICAgYXV0aCA9IHNlbGYuZW52WyJjeC50b3dlci53ZWJob29rLmF1dGhlbnRpY2F0b3IiXS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIklQIFRlc3QiLAogICAgICAgICAgICAgICAgImFsbG93ZWRfaXBfYWRkcmVzc2VzIjogIjIwMy4wLjExMy41LDIwMDE6ZGI4Ojo0MiwxOTguNTEuMTAwLjAvMjQsMjAwMTpkYjg6YWJjZDo6LzQ4IiwgICMgbm9xYTogRTUwMQogICAgICAgICAgICAgICAgImNvZGUiOiAicmVzdWx0ID0geydhbGxvd2VkJzogVHJ1ZX0iLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHdlYmhvb2sgPSBzZWxmLmVudlsiY3gudG93ZXIud2ViaG9vayJdLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiSVAgV2ViaG9vayIsCiAgICAgICAgICAgICAgICAiZW5kcG9pbnQiOiAid2ViaG9va19pcHRlc3QiLAogICAgICAgICAgICAgICAgIm1ldGhvZCI6ICJwb3N0IiwKICAgICAgICAgICAgICAgICJhdXRoZW50aWNhdG9yX2lkIjogYXV0aC5pZCwKICAgICAgICAgICAgICAgICJjb2RlIjogInJlc3VsdCA9IHsnZXhpdF9jb2RlJzogMCwgJ21lc3NhZ2UnOiAnSVAgT0snfSIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgIGRhdGEgPSBqc29uLmR1bXBzKHsiaXAiOiAidGVzdCJ9KQoKICAgICAgICBkZWYgZG9fcmVxKGlwKToKICAgICAgICAgICAgIyBQYXRjaCBfZ2V0X3JlbW90ZV9hZGRyIHRvIHNpbXVsYXRlIHJlcXVlc3RzIGNvbWluZwogICAgICAgICAgICAjIGZyb20gZGlmZmVyZW50IElQIGFkZHJlc3NlcwogICAgICAgICAgICB3aXRoIHBhdGNoKAogICAgICAgICAgICAgICAgIm9kb28uYWRkb25zLmNldG1peF90b3dlcl93ZWJob29rLmNvbnRyb2xsZXJzLm1haW4uQ2V0bWl4VG93ZXJXZWJob29rQ29udHJvbGxlci5fZ2V0X3JlbW90ZV9hZGRyIiwKICAgICAgICAgICAgICAgIHJldHVybl92YWx1ZT1pcCwKICAgICAgICAgICAgKToKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnVybF9vcGVuKAogICAgICAgICAgICAgICAgICAgIHNlbGYudXJsX2Zvcih3ZWJob29rLmVuZHBvaW50KSwKICAgICAgICAgICAgICAgICAgICBkYXRhPWRhdGEsCiAgICAgICAgICAgICAgICAgICAgaGVhZGVycz17IkNvbnRlbnQtVHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uIn0sCiAgICAgICAgICAgICAgICApCgogICAgICAgICMgSVB2NCBhZGRyZXNzIGFsbG93ZWQKICAgICAgICByZXNwID0gZG9fcmVxKCIyMDMuMC4xMTMuNSIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNwLnN0YXR1c19jb2RlLCAyMDApCiAgICAgICAgc2VsZi5hc3NlcnRJbihiIklQIE9LIiwgcmVzcC5jb250ZW50KQoKICAgICAgICAjIElQdjYgYWRkcmVzcyBhbGxvd2VkCiAgICAgICAgcmVzcCA9IGRvX3JlcSgiMjAwMTpkYjg6OjQyIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3Auc3RhdHVzX2NvZGUsIDIwMCkKICAgICAgICBzZWxmLmFzc2VydEluKGIiSVAgT0siLCByZXNwLmNvbnRlbnQpCgogICAgICAgICMgSVB2NCBuZXR3b3JrIGFsbG93ZWQKICAgICAgICByZXNwID0gZG9fcmVxKCIxOTguNTEuMTAwLjk5IikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3Auc3RhdHVzX2NvZGUsIDIwMCkKICAgICAgICBzZWxmLmFzc2VydEluKGIiSVAgT0siLCByZXNwLmNvbnRlbnQpCgogICAgICAgICMgSVB2NiBuZXR3b3JrIGFsbG93ZWQKICAgICAgICByZXNwID0gZG9fcmVxKCIyMDAxOmRiODphYmNkOjphYmNkIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3Auc3RhdHVzX2NvZGUsIDIwMCkKICAgICAgICBzZWxmLmFzc2VydEluKGIiSVAgT0siLCByZXNwLmNvbnRlbnQpCgogICAgICAgICMgRGVuaWVkIElQdjQgYWRkcmVzcwogICAgICAgIHJlc3AgPSBkb19yZXEoIjIwMy4wLjExMy45OSIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNwLnN0YXR1c19jb2RlLCA0MDMpCiAgICAgICAgc2VsZi5hc3NlcnRJbihiIkFkZHJlc3Mgbm90IGFsbG93ZWQiLCByZXNwLmNvbnRlbnQpCgogICAgICAgICMgRGVuaWVkIElQdjYgYWRkcmVzcwogICAgICAgIHJlc3AgPSBkb19yZXEoIjIwMDE6ZGI4OmZmZmY6OjEiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzcC5zdGF0dXNfY29kZSwgNDAzKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oYiJBZGRyZXNzIG5vdCBhbGxvd2VkIiwgcmVzcC5jb250ZW50KQoKICAgIGRlZiBfbWFrZV9wcm94eV93ZWJob29rKAogICAgICAgIHNlbGYsCiAgICAgICAgYWxsb3dlZCwKICAgICAgICB0cnVzdGVkPU5vbmUsCiAgICAgICAgY29kZT0icmVzdWx0ID0geydleGl0X2NvZGUnOiAwLCAnbWVzc2FnZSc6ICdPSyB2aWEgcHJveHknfSIsCiAgICApOgogICAgICAgICIiIgogICAgICAgIEhlbHBlciB0byBjcmVhdGUgYSB3ZWJob29rIHdpdGggYSBkZWRpY2F0ZWQgYXV0aGVudGljYXRvciBjb25maWd1cmVkCiAgICAgICAgZm9yIHByb3h5LWF3YXJlIHRlc3RzLgogICAgICAgICIiIgogICAgICAgIGF1dGggPSBzZWxmLmVudlsiY3gudG93ZXIud2ViaG9vay5hdXRoZW50aWNhdG9yIl0uY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJQcm94eSBBd2FyZSIsCiAgICAgICAgICAgICAgICAiYWxsb3dlZF9pcF9hZGRyZXNzZXMiOiBhbGxvd2VkLAogICAgICAgICAgICAgICAgInRydXN0ZWRfcHJveHlfaXBzIjogdHJ1c3RlZCBvciAiIiwKICAgICAgICAgICAgICAgICJjb2RlIjogInJlc3VsdCA9IHsnYWxsb3dlZCc6IFRydWV9IiwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICB3aCA9IHNlbGYuZW52WyJjeC50b3dlci53ZWJob29rIl0uY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJQcm94eSBXZWJob29rIiwKICAgICAgICAgICAgICAgICJlbmRwb2ludCI6ICJwcm94eV93ZWJob29rIiwKICAgICAgICAgICAgICAgICJtZXRob2QiOiAicG9zdCIsCiAgICAgICAgICAgICAgICAiYXV0aGVudGljYXRvcl9pZCI6IGF1dGguaWQsCiAgICAgICAgICAgICAgICAiY29kZSI6IGNvZGUsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgcmV0dXJuIHdoLCBhdXRoCgogICAgZGVmIHRlc3RfcHJveHlfaGVhZGVyc19pZ25vcmVkX3dpdGhvdXRfdHJ1c3RlZF9wcm94eShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBXaGVuIHRydXN0ZWRfcHJveHlfaXBzIGlzIGVtcHR5LCBYRkYvWC1SZWFsLUlQIG11c3QgYmUgaWdub3JlZC4KICAgICAgICBXZSBmYWxsYmFjayB0byBpbW1lZGlhdGUgcGVlciAocHJveHkgSVApLCB3aGljaCBpcyBub3QgYWxsb3dlZCAtPiA0MDMuCiAgICAgICAgIiIiCiAgICAgICAgIyBBbGxvdyBvbmx5IHRoZSByZWFsIGNsaWVudCBuZXR3b3JrLCBub3QgdGhlIHByb3h5IGl0c2VsZgogICAgICAgIHdlYmhvb2ssIF9hdXRoID0gc2VsZi5fbWFrZV9wcm94eV93ZWJob29rKAogICAgICAgICAgICBhbGxvd2VkPSIyMDMuMC4xMTMuMC8yNCIsIHRydXN0ZWQ9Tm9uZQogICAgICAgICkKCiAgICAgICAgZGF0YSA9IGpzb24uZHVtcHMoeyJrIjogInYifSkKICAgICAgICBwcm94eV9pcCA9ICIxMC4wLjAuNSIgICMgaW1tZWRpYXRlIHBlZXIgKHVuZG9jdW1lbnRlZCBhcyB0cnVzdGVkKQogICAgICAgIGhlYWRlcnMgPSB7CiAgICAgICAgICAgICJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24vanNvbiIsCiAgICAgICAgICAgICJYLUZvcndhcmRlZC1Gb3IiOiAiMjAzLjAuMTEzLjcsIDEwLjAuMC41IiwgICMgc2hvdWxkIGJlIGlnbm9yZWQKICAgICAgICAgICAgIlgtUmVhbC1JUCI6ICIyMDMuMC4xMTMuNyIsICAjIHNob3VsZCBiZSBpZ25vcmVkCiAgICAgICAgfQogICAgICAgIHdpdGggcGF0Y2goCiAgICAgICAgICAgICJvZG9vLmFkZG9ucy5jZXRtaXhfdG93ZXJfd2ViaG9vay5jb250cm9sbGVycy5tYWluLkNldG1peFRvd2VyV2ViaG9va0NvbnRyb2xsZXIuX2dldF9yZW1vdGVfYWRkciIsCiAgICAgICAgICAgIHJldHVybl92YWx1ZT1wcm94eV9pcCwKICAgICAgICApOgogICAgICAgICAgICByZXNwID0gc2VsZi51cmxfb3BlbigKICAgICAgICAgICAgICAgIHNlbGYudXJsX2Zvcih3ZWJob29rLmVuZHBvaW50KSwgZGF0YT1kYXRhLCBoZWFkZXJzPWhlYWRlcnMKICAgICAgICAgICAgKQoKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3Auc3RhdHVzX2NvZGUsIDQwMykKICAgICAgICBzZWxmLmFzc2VydEluKGIiQWRkcmVzcyBub3QgYWxsb3dlZCIsIHJlc3AuY29udGVudCkKCiAgICBkZWYgdGVzdF9wcm94eV94ZmZfaG9ub3JlZF93aXRoX3RydXN0ZWRfcHJveHkoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgV2l0aCB0cnVzdGVkIHByb3h5IGNvbmZpZ3VyZWQsIHRha2UgdGhlIGxlZnQtbW9zdCBJUCBmcm9tIFgtRm9yd2FyZGVkLUZvci4KICAgICAgICAiIiIKICAgICAgICB3ZWJob29rLCBfYXV0aCA9IHNlbGYuX21ha2VfcHJveHlfd2ViaG9vaygKICAgICAgICAgICAgYWxsb3dlZD0iMjAzLjAuMTEzLjAvMjQiLAogICAgICAgICAgICB0cnVzdGVkPSIxMC4wLjAuNSIsCiAgICAgICAgICAgIGNvZGU9InJlc3VsdCA9IHsnZXhpdF9jb2RlJzogMCwgJ21lc3NhZ2UnOiAnT0sgWEZGJ30iLAogICAgICAgICkKCiAgICAgICAgZGF0YSA9IGpzb24uZHVtcHMoeyJrIjogInYifSkKICAgICAgICBwcm94eV9pcCA9ICIxMC4wLjAuNSIKICAgICAgICBoZWFkZXJzID0gewogICAgICAgICAgICAiQ29udGVudC1UeXBlIjogImFwcGxpY2F0aW9uL2pzb24iLAogICAgICAgICAgICAjIFhGRiBsaXN0OiBjbGllbnQsIHByb3h5CiAgICAgICAgICAgICJYLUZvcndhcmRlZC1Gb3IiOiAiMjAzLjAuMTEzLjcsIDEwLjAuMC41IiwKICAgICAgICB9CiAgICAgICAgd2l0aCBwYXRjaCgKICAgICAgICAgICAgIm9kb28uYWRkb25zLmNldG1peF90b3dlcl93ZWJob29rLmNvbnRyb2xsZXJzLm1haW4uQ2V0bWl4VG93ZXJXZWJob29rQ29udHJvbGxlci5fZ2V0X3JlbW90ZV9hZGRyIiwKICAgICAgICAgICAgcmV0dXJuX3ZhbHVlPXByb3h5X2lwLAogICAgICAgICk6CiAgICAgICAgICAgIHJlc3AgPSBzZWxmLnVybF9vcGVuKAogICAgICAgICAgICAgICAgc2VsZi51cmxfZm9yKHdlYmhvb2suZW5kcG9pbnQpLCBkYXRhPWRhdGEsIGhlYWRlcnM9aGVhZGVycwogICAgICAgICAgICApCgogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzcC5zdGF0dXNfY29kZSwgMjAwKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oYiJPSyBYRkYiLCByZXNwLmNvbnRlbnQpCgogICAgZGVmIHRlc3RfcHJveHlfeF9yZWFsX2lwX2ZhbGxiYWNrX3doZW5feGZmX21pc3Npbmcoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgSWYgWEZGIGlzIG1pc3NpbmcvaW52YWxpZCBidXQgdHJ1c3RlZCBwcm94eSBpcyBzZXQsIGZhbGwgYmFjayB0byBYLVJlYWwtSVAuCiAgICAgICAgIiIiCiAgICAgICAgd2ViaG9vaywgX2F1dGggPSBzZWxmLl9tYWtlX3Byb3h5X3dlYmhvb2soCiAgICAgICAgICAgIGFsbG93ZWQ9IjIwMy4wLjExMy4wLzI0IiwKICAgICAgICAgICAgdHJ1c3RlZD0iMTAuMC4wLjUiLAogICAgICAgICAgICBjb2RlPSJyZXN1bHQgPSB7J2V4aXRfY29kZSc6IDAsICdtZXNzYWdlJzogJ09LIFgtUmVhbC1JUCd9IiwKICAgICAgICApCgogICAgICAgIGRhdGEgPSBqc29uLmR1bXBzKHsiayI6ICJ2In0pCiAgICAgICAgcHJveHlfaXAgPSAiMTAuMC4wLjUiCiAgICAgICAgaGVhZGVycyA9IHsKICAgICAgICAgICAgIkNvbnRlbnQtVHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uIiwKICAgICAgICAgICAgIlgtRm9yd2FyZGVkLUZvciI6ICJnYXJiYWdlLCBub3RfYW5faXAiLCAgIyBpbnZhbGlkcyBzaG91bGQgYmUgc2tpcHBlZAogICAgICAgICAgICAiWC1SZWFsLUlQIjogIjIwMy4wLjExMy44IiwKICAgICAgICB9CiAgICAgICAgd2l0aCBwYXRjaCgKICAgICAgICAgICAgIm9kb28uYWRkb25zLmNldG1peF90b3dlcl93ZWJob29rLmNvbnRyb2xsZXJzLm1haW4uQ2V0bWl4VG93ZXJXZWJob29rQ29udHJvbGxlci5fZ2V0X3JlbW90ZV9hZGRyIiwKICAgICAgICAgICAgcmV0dXJuX3ZhbHVlPXByb3h5X2lwLAogICAgICAgICk6CiAgICAgICAgICAgIHJlc3AgPSBzZWxmLnVybF9vcGVuKAogICAgICAgICAgICAgICAgc2VsZi51cmxfZm9yKHdlYmhvb2suZW5kcG9pbnQpLCBkYXRhPWRhdGEsIGhlYWRlcnM9aGVhZGVycwogICAgICAgICAgICApCgogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzcC5zdGF0dXNfY29kZSwgMjAwKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oYiJPSyBYLVJlYWwtSVAiLCByZXNwLmNvbnRlbnQpCgogICAgZGVmIHRlc3RfcHJveHlfaW52YWxpZF9oZWFkZXJzX2ZhbGxfYmFja190b19pbW1lZGlhdGVfcGVlcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBJZiBoZWFkZXJzIGFyZSBpbnZhbGlkIGV2ZW4gd2l0aCB0cnVzdGVkIHByb3h5LCBmYWxsIGJhY2sgdG8gaW1tZWRpYXRlIHBlZXIuCiAgICAgICAgU2luY2UgdGhlIHByb3h5IElQIGlzIG5vdCBpbiBhbGxvd2xpc3QsIHRoZSByZXF1ZXN0IGlzIGRlbmllZC4KICAgICAgICAiIiIKICAgICAgICB3ZWJob29rLCBfYXV0aCA9IHNlbGYuX21ha2VfcHJveHlfd2ViaG9vaygKICAgICAgICAgICAgYWxsb3dlZD0iMjAzLjAuMTEzLjAvMjQiLCAgIyBkb2VzIE5PVCBpbmNsdWRlIHByb3h5IElQCiAgICAgICAgICAgIHRydXN0ZWQ9IjEwLjAuMC41IiwKICAgICAgICApCgogICAgICAgIGRhdGEgPSBqc29uLmR1bXBzKHsiayI6ICJ2In0pCiAgICAgICAgcHJveHlfaXAgPSAiMTAuMC4wLjUiCiAgICAgICAgaGVhZGVycyA9IHsKICAgICAgICAgICAgIkNvbnRlbnQtVHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uIiwKICAgICAgICAgICAgIlgtRm9yd2FyZGVkLUZvciI6ICJub3RfYW5faXAsIGFsc29fYmFkIiwKICAgICAgICAgICAgIlgtUmVhbC1JUCI6ICJiYWRfaXBfdmFsdWUiLAogICAgICAgIH0KICAgICAgICB3aXRoIHBhdGNoKAogICAgICAgICAgICAib2Rvby5hZGRvbnMuY2V0bWl4X3Rvd2VyX3dlYmhvb2suY29udHJvbGxlcnMubWFpbi5DZXRtaXhUb3dlcldlYmhvb2tDb250cm9sbGVyLl9nZXRfcmVtb3RlX2FkZHIiLAogICAgICAgICAgICByZXR1cm5fdmFsdWU9cHJveHlfaXAsCiAgICAgICAgKToKICAgICAgICAgICAgcmVzcCA9IHNlbGYudXJsX29wZW4oCiAgICAgICAgICAgICAgICBzZWxmLnVybF9mb3Iod2ViaG9vay5lbmRwb2ludCksIGRhdGE9ZGF0YSwgaGVhZGVycz1oZWFkZXJzCiAgICAgICAgICAgICkKCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNwLnN0YXR1c19jb2RlLCA0MDMpCiAgICAgICAgc2VsZi5hc3NlcnRJbihiIkFkZHJlc3Mgbm90IGFsbG93ZWQiLCByZXNwLmNvbnRlbnQpCgogICAgZGVmIHRlc3RfcHJveHlfYWxsb3dzX3ZpYV9pbW1lZGlhdGVfcGVlcl93aGVuX3Byb3h5X2lwX2luX2FsbG93bGlzdChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBJZiBoZWFkZXJzIGFyZSBpZ25vcmVkL2ludmFsaWQsIGJ1dCB0aGUgcHJveHkgSVAgaXRzZWxmIGlzIGFsbG93ZWQsCiAgICAgICAgYWNjZXNzIHNob3VsZCBiZSBncmFudGVkIGJhc2VkIG9uIGltbWVkaWF0ZSBwZWVyLgogICAgICAgICIiIgogICAgICAgIHdlYmhvb2ssIF9hdXRoID0gc2VsZi5fbWFrZV9wcm94eV93ZWJob29rKAogICAgICAgICAgICBhbGxvd2VkPSIxMC4wLjAuNSIsICAjIGFsbG93IHRoZSBwcm94eSBpdHNlbGYKICAgICAgICAgICAgdHJ1c3RlZD0iIiwgICMgbm8gdHJ1c3RlZCBwcm94aWVzID0+IGhlYWRlcnMgaWdub3JlZAogICAgICAgICAgICBjb2RlPSJyZXN1bHQgPSB7J2V4aXRfY29kZSc6IDAsICdtZXNzYWdlJzogJ09LIGltbWVkaWF0ZSBwZWVyJ30iLAogICAgICAgICkKCiAgICAgICAgZGF0YSA9IGpzb24uZHVtcHMoeyJrIjogInYifSkKICAgICAgICBwcm94eV9pcCA9ICIxMC4wLjAuNSIKICAgICAgICBoZWFkZXJzID0gewogICAgICAgICAgICAiQ29udGVudC1UeXBlIjogImFwcGxpY2F0aW9uL2pzb24iLAogICAgICAgICAgICAiWC1Gb3J3YXJkZWQtRm9yIjogIjIwMy4wLjExMy43IiwgICMgc2hvdWxkIGJlIGlnbm9yZWQKICAgICAgICB9CiAgICAgICAgd2l0aCBwYXRjaCgKICAgICAgICAgICAgIm9kb28uYWRkb25zLmNldG1peF90b3dlcl93ZWJob29rLmNvbnRyb2xsZXJzLm1haW4uQ2V0bWl4VG93ZXJXZWJob29rQ29udHJvbGxlci5fZ2V0X3JlbW90ZV9hZGRyIiwKICAgICAgICAgICAgcmV0dXJuX3ZhbHVlPXByb3h5X2lwLAogICAgICAgICk6CiAgICAgICAgICAgIHJlc3AgPSBzZWxmLnVybF9vcGVuKAogICAgICAgICAgICAgICAgc2VsZi51cmxfZm9yKHdlYmhvb2suZW5kcG9pbnQpLCBkYXRhPWRhdGEsIGhlYWRlcnM9aGVhZGVycwogICAgICAgICAgICApCgogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzcC5zdGF0dXNfY29kZSwgMjAwKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oYiJPSyBpbW1lZGlhdGUgcGVlciIsIHJlc3AuY29udGVudCkK |