diff --git a/addons/cetmix_tower_yaml/wizards/cx_tower_yaml_import_wiz.py b/addons/cetmix_tower_yaml/wizards/cx_tower_yaml_import_wiz.py new file mode 100644 index 0000000..c20c884 --- /dev/null +++ b/addons/cetmix_tower_yaml/wizards/cx_tower_yaml_import_wiz.py @@ -0,0 +1 @@ +IyBDb3B5cmlnaHQgKEMpIDIwMjQgQ2V0bWl4IE/DnAojIExpY2Vuc2UgQUdQTC0zLjAgb3IgbGF0ZXIgKGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsKS4KCmltcG9ydCBjb3B5CmltcG9ydCBsb2dnaW5nCgppbXBvcnQgeWFtbApmcm9tIG1hcmt1cHNhZmUgaW1wb3J0IGVzY2FwZQoKZnJvbSBvZG9vIGltcG9ydCBfLCBhcGksIGZpZWxkcywgbW9kZWxzCmZyb20gb2Rvby5leGNlcHRpb25zIGltcG9ydCBWYWxpZGF0aW9uRXJyb3IKCl9sb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBDeFRvd2VyWWFtbEltcG9ydFdpeihtb2RlbHMuVHJhbnNpZW50TW9kZWwpOgogICAgIiIiCiAgICBQcm9jZXNzIFlBTUwgZGF0YSBhbmQgY3JlYXRlIHJlY29yZHMgaW4gT2Rvby4KICAgICIiIgoKICAgIF9uYW1lID0gImN4LnRvd2VyLnlhbWwuaW1wb3J0LndpeiIKICAgIF9kZXNjcmlwdGlvbiA9ICJDZXRtaXggVG93ZXIgWUFNTCBJbXBvcnQgV2l6YXJkIgoKICAgIHlhbWxfY29kZSA9IGZpZWxkcy5UZXh0KHJlYWRvbmx5PVRydWUpCiAgICBtb2RlbF9uYW1lcyA9IGZpZWxkcy5DaGFyKHJlYWRvbmx5PVRydWUsIGhlbHA9Ik1vZGVscyB0byBjcmVhdGUgcmVjb3JkcyBpbiIpCiAgICBpZl9yZWNvcmRfZXhpc3RzID0gZmllbGRzLlNlbGVjdGlvbigKICAgICAgICBzZWxlY3Rpb249WwogICAgICAgICAgICAoInNraXAiLCAiU2tpcCByZWNvcmQiKSwKICAgICAgICAgICAgKCJ1cGRhdGUiLCAiVXBkYXRlIGV4aXN0aW5nIHJlY29yZCIpLAogICAgICAgICAgICAoImNyZWF0ZSIsICJDcmVhdGUgYSBuZXcgcmVjb3JkIiksCiAgICAgICAgXSwKICAgICAgICBkZWZhdWx0PSJza2lwIiwKICAgICAgICByZXF1aXJlZD1UcnVlLAogICAgICAgIGhlbHA9IldoYXQgdG8gZG8gaWYgcmVjb3JkIHdpdGggdGhlIHNhbWUgcmVmZXJlbmNlIGFscmVhZHkgZXhpc3RzIiwKICAgICkKICAgIHNlY3JldF9saXN0ID0gZmllbGRzLkh0bWwoCiAgICAgICAgaGVscD0iTGlzdCBvZiBzZWNyZXRzIHByZXNlbnQgaW4gdGhlIFlBTUwgZmlsZSAoZm9ybWF0dGVkIGFzIEhUTUwgbGlzdCkiLAogICAgICAgIGNvbXB1dGU9Il9jb21wdXRlX3NlY3JldF9saXN0IiwKICAgICkKICAgIHByZXZpZXdfY29kZSA9IGZpZWxkcy5Cb29sZWFuKAogICAgICAgIGhlbHA9IlRvZ2dsZSB0byBzaG93IG9yIGhpZGUgWUFNTCBjb2RlIHByZXZpZXciLAogICAgKQogICAgbWFuaWZlc3RfbmFtZSA9IGZpZWxkcy5DaGFyKAogICAgICAgIHJlYWRvbmx5PVRydWUsIGNvbXB1dGU9Il9jb21wdXRlX3lhbWxfZGF0YSIsIHN0cmluZz0iU25pcHBldCBOYW1lIgogICAgKQogICAgbWFuaWZlc3Rfc3VtbWFyeSA9IGZpZWxkcy5DaGFyKAogICAgICAgIHJlYWRvbmx5PVRydWUsIGNvbXB1dGU9Il9jb21wdXRlX3lhbWxfZGF0YSIsIHN0cmluZz0iU3VtbWFyeSIKICAgICkKICAgIG1hbmlmZXN0X2Rlc2NyaXB0aW9uID0gZmllbGRzLlRleHQoCiAgICAgICAgcmVhZG9ubHk9VHJ1ZSwgY29tcHV0ZT0iX2NvbXB1dGVfeWFtbF9kYXRhIiwgc3RyaW5nPSJEZXNjcmlwdGlvbiIKICAgICkKICAgIG1hbmlmZXN0X2F1dGhvcl9zdHJpbmcgPSBmaWVsZHMuQ2hhcigKICAgICAgICByZWFkb25seT1UcnVlLAogICAgICAgIGNvbXB1dGU9Il9jb21wdXRlX3lhbWxfZGF0YSIsCiAgICAgICAgaGVscD0iQ29tbWEtc2VwYXJhdGVkIGxpc3QiLAogICAgICAgIHN0cmluZz0iQXV0aG9yIiwKICAgICkKICAgIG1hbmlmZXN0X3ZlcnNpb24gPSBmaWVsZHMuQ2hhcigKICAgICAgICByZWFkb25seT1UcnVlLCBjb21wdXRlPSJfY29tcHV0ZV95YW1sX2RhdGEiLCBzdHJpbmc9IlZlcnNpb24iCiAgICApCiAgICBtYW5pZmVzdF93ZWJzaXRlID0gZmllbGRzLkNoYXIoCiAgICAgICAgcmVhZG9ubHk9VHJ1ZSwgY29tcHV0ZT0iX2NvbXB1dGVfeWFtbF9kYXRhIiwgc3RyaW5nPSJXZWJzaXRlIgogICAgKQogICAgbWFuaWZlc3RfbGljZW5zZSA9IGZpZWxkcy5DaGFyKAogICAgICAgIHJlYWRvbmx5PVRydWUsIGNvbXB1dGU9Il9jb21wdXRlX3lhbWxfZGF0YSIsIHN0cmluZz0iTGljZW5zZSIKICAgICkKICAgIG1hbmlmZXN0X2xpY2Vuc2VfdGV4dCA9IGZpZWxkcy5UZXh0KAogICAgICAgIHJlYWRvbmx5PVRydWUsIGNvbXB1dGU9Il9jb21wdXRlX3lhbWxfZGF0YSIsIHN0cmluZz0iTGljZW5zZSB0ZXh0IgogICAgKQogICAgbWFuaWZlc3RfcHJpY2UgPSBmaWVsZHMuRmxvYXQoCiAgICAgICAgcmVhZG9ubHk9VHJ1ZSwgY29tcHV0ZT0iX2NvbXB1dGVfeWFtbF9kYXRhIiwgc3RyaW5nPSJQcmljZSIKICAgICkKICAgIG1hbmlmZXN0X2N1cnJlbmN5ID0gZmllbGRzLkNoYXIoCiAgICAgICAgcmVhZG9ubHk9VHJ1ZSwgY29tcHV0ZT0iX2NvbXB1dGVfeWFtbF9kYXRhIiwgc3RyaW5nPSJDdXJyZW5jeSIKICAgICkKCiAgICBAYXBpLmRlcGVuZHMoInlhbWxfY29kZSIpCiAgICBkZWYgX2NvbXB1dGVfc2VjcmV0X2xpc3Qoc2VsZik6CiAgICAgICAgIiIiQ29tcHV0ZSBsaXN0IG9mIHNlY3JldHMgcHJlc2VudCBpbiB0aGUgWUFNTCBmaWxlIiIiCiAgICAgICAgZm9yIHJlY29yZCBpbiBzZWxmOgogICAgICAgICAgICB5YW1sX2RhdGEgPSB5YW1sLnNhZmVfbG9hZChyZWNvcmQueWFtbF9jb2RlIG9yICJ7fSIpCiAgICAgICAgICAgIHNlY3JldF9saXN0ID0gc2VsZi5fZXh0cmFjdF9zZWNyZXRfbmFtZXMoeWFtbF9kYXRhKQogICAgICAgICAgICBpZiBub3Qgc2VjcmV0X2xpc3Q6CiAgICAgICAgICAgICAgICByZWNvcmQuc2VjcmV0X2xpc3QgPSBGYWxzZQogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgICMgQnVpbGQgZGV0ZXJtaW5pc3RpYyBIVE1MIGxpc3Qgb2Ygc2VjcmV0cwogICAgICAgICAgICBpdGVtcyA9ICIiLmpvaW4oZiI8bGk+e2VzY2FwZShuYW1lKX08L2xpPiIgZm9yIG5hbWUgaW4gc29ydGVkKHNlY3JldF9saXN0KSkKICAgICAgICAgICAgc2VjcmV0c19odG1sID0gZiI8dWw+e2l0ZW1zfTwvdWw+IgoKICAgICAgICAgICAgcmVjb3JkLnNlY3JldF9saXN0ID0gXygKICAgICAgICAgICAgICAgICJGb2xsb3dpbmcgc2VjcmV0cyBhcmUgdXNlZCBpbiB0aGUgY29kZTo8YnIvPiUoc2VjcmV0cylzIiwKICAgICAgICAgICAgICAgIHNlY3JldHM9c2VjcmV0c19odG1sLAogICAgICAgICAgICApCgogICAgQGFwaS5kZXBlbmRzKCJ5YW1sX2NvZGUiKQogICAgZGVmIF9jb21wdXRlX3lhbWxfZGF0YShzZWxmKToKICAgICAgICBmb3IgcmVjb3JkIGluIHNlbGY6CiAgICAgICAgICAgIGRhdGEgPSB5YW1sLnNhZmVfbG9hZChyZWNvcmQueWFtbF9jb2RlIG9yICJ7fSIpCgogICAgICAgICAgICBtYW5pZmVzdCA9IGRhdGEuZ2V0KCJtYW5pZmVzdCIsIHt9KSBpZiBpc2luc3RhbmNlKGRhdGEsIGRpY3QpIGVsc2Uge30KICAgICAgICAgICAgYXV0aG9ycyA9IG1hbmlmZXN0LmdldCgiYXV0aG9yIikKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhdXRob3JzLCBsaXN0IHwgdHVwbGUpOgogICAgICAgICAgICAgICAgbWFuaWZlc3RfYXV0aG9yX3N0cmluZyA9ICIsICIuam9pbihhdXRob3JzKQogICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UoYXV0aG9ycywgc3RyKToKICAgICAgICAgICAgICAgIG1hbmlmZXN0X2F1dGhvcl9zdHJpbmcgPSBhdXRob3JzCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBtYW5pZmVzdF9hdXRob3Jfc3RyaW5nID0gRmFsc2UKCiAgICAgICAgICAgIHJlY29yZC51cGRhdGUoCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm1hbmlmZXN0X25hbWUiOiBtYW5pZmVzdC5nZXQoIm5hbWUiKSwKICAgICAgICAgICAgICAgICAgICAibWFuaWZlc3Rfc3VtbWFyeSI6IG1hbmlmZXN0LmdldCgic3VtbWFyeSIpLAogICAgICAgICAgICAgICAgICAgICJtYW5pZmVzdF9kZXNjcmlwdGlvbiI6IG1hbmlmZXN0LmdldCgiZGVzY3JpcHRpb24iKSwKICAgICAgICAgICAgICAgICAgICAibWFuaWZlc3RfYXV0aG9yX3N0cmluZyI6IG1hbmlmZXN0X2F1dGhvcl9zdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgIm1hbmlmZXN0X3ZlcnNpb24iOiBtYW5pZmVzdC5nZXQoInZlcnNpb24iKSwKICAgICAgICAgICAgICAgICAgICAibWFuaWZlc3Rfd2Vic2l0ZSI6IG1hbmlmZXN0LmdldCgid2Vic2l0ZSIpLAogICAgICAgICAgICAgICAgICAgICJtYW5pZmVzdF9saWNlbnNlIjogbWFuaWZlc3QuZ2V0KCJsaWNlbnNlIiksCiAgICAgICAgICAgICAgICAgICAgIm1hbmlmZXN0X2xpY2Vuc2VfdGV4dCI6IG1hbmlmZXN0LmdldCgibGljZW5zZV90ZXh0IiksCiAgICAgICAgICAgICAgICAgICAgIm1hbmlmZXN0X3ByaWNlIjogbWFuaWZlc3QuZ2V0KCJwcmljZSIpLAogICAgICAgICAgICAgICAgICAgICJtYW5pZmVzdF9jdXJyZW5jeSI6IG1hbmlmZXN0LmdldCgiY3VycmVuY3kiKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKQoKICAgIGRlZiBfZ2V0X2ltcG9ydF9tb2RlbChzZWxmLCBtb2RlbF9uYW1lLCBtb2RlbF9jYWNoZSk6CiAgICAgICAgIiIiUmV0dXJuIGNhY2hlZCBtb2RlbCBjb25maWd1cmVkIGZvciBZQU1MIGltcG9ydC4iIiIKICAgICAgICBtb2RlbCA9IG1vZGVsX2NhY2hlLmdldChtb2RlbF9uYW1lKQogICAgICAgIGlmIG1vZGVsIGlzIE5vbmU6CiAgICAgICAgICAgIG1vZGVsID0gc2VsZi5lbnZbZiJjeC50b3dlci57bW9kZWxfbmFtZS5yZXBsYWNlKCdfJywgJy4nKX0iXS53aXRoX2NvbnRleHQoCiAgICAgICAgICAgICAgICBza2lwX3NzaF9zZXR0aW5nc19jaGVjaz0obW9kZWxfbmFtZSA9PSAic2VydmVyIikKICAgICAgICAgICAgKQogICAgICAgICAgICBtb2RlbF9jYWNoZVttb2RlbF9uYW1lXSA9IG1vZGVsCiAgICAgICAgcmV0dXJuIG1vZGVsCgogICAgZGVmIF9nZXRfaW1wb3J0X21vZGVsX2NvbnRleHQoCiAgICAgICAgc2VsZiwKICAgICAgICBkZWZlcnJlZF9tMm9fcXVldWUsCiAgICAgICAgZGVmZXJyZWRfeDJtX3F1ZXVlLAogICAgICAgIGZvcmNlX2NyZWF0ZV9yZWxhdGVkX3JlY29yZCwKICAgICk6CiAgICAgICAgIiIiQnVpbGQgY29udGV4dCB1c2VkIHdoaWxlIGNvbnZlcnRpbmcgWUFNTCB2YWx1ZXMgdG8gcmVjb3JkIHZhbHVlcy4iIiIKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAieWFtbF9kZWZlcnJlZF9tMm9fcXVldWUiOiBkZWZlcnJlZF9tMm9fcXVldWUsCiAgICAgICAgICAgICJ5YW1sX2RlZmVycmVkX3gybV9xdWV1ZSI6IGRlZmVycmVkX3gybV9xdWV1ZSwKICAgICAgICAgICAgImZvcmNlX2NyZWF0ZV9yZWxhdGVkX3JlY29yZCI6IGZvcmNlX2NyZWF0ZV9yZWxhdGVkX3JlY29yZCwKICAgICAgICB9CgogICAgZGVmIF9mb3JtYXRfZGVmZXJyZWRfcmVzb2x1dGlvbl9lcnJvcihzZWxmLCBpdGVtKToKICAgICAgICAiIiJGb3JtYXQgb25lIHVucmVzb2x2ZWQgZGVmZXJyZWQgcmVsYXRpb24gZW50cnkuIiIiCiAgICAgICAgcmV0dXJuIF8oCiAgICAgICAgICAgICJSZWNvcmQgJShyZWNvcmRfbW9kZWwpcyAnJShyZWNvcmRfcmVmZXJlbmNlKXMnOiBmaWVsZCAiCiAgICAgICAgICAgICInJShmaWVsZClzJyBjb3VsZCBub3QgcmVzb2x2ZSAiCiAgICAgICAgICAgICIlKHRhcmdldF9tb2RlbClzICclKHRhcmdldF9yZWZlcmVuY2UpcyciLAogICAgICAgICAgICByZWNvcmRfbW9kZWw9aXRlbVsicmVjb3JkX21vZGVsIl0sCiAgICAgICAgICAgIHJlY29yZF9yZWZlcmVuY2U9aXRlbVsicmVjb3JkX3JlZmVyZW5jZSJdLAogICAgICAgICAgICBmaWVsZD1pdGVtWyJmaWVsZF9uYW1lIl0sCiAgICAgICAgICAgIHRhcmdldF9tb2RlbD1pdGVtWyJ0YXJnZXRfbW9kZWwiXSwKICAgICAgICAgICAgdGFyZ2V0X3JlZmVyZW5jZT1pdGVtWyJ0YXJnZXRfcmVmZXJlbmNlIl0sCiAgICAgICAgKQoKICAgIGRlZiBfYXBwbHlfZGVmZXJyZWRfbTJvX2ltcG9ydHMoc2VsZiwgZGVmZXJyZWRfcXVldWUpOgogICAgICAgICIiIlJlc29sdmUgcXVldWVkIG0ybyBpbXBvcnRzIGFmdGVyIHRoZSBtYWluIGltcG9ydCBwYXNzLiIiIgogICAgICAgIHVucmVzb2x2ZWQgPSBbXQogICAgICAgIGZvciBpdGVtIGluIGRlZmVycmVkX3F1ZXVlOgogICAgICAgICAgICByZWNvcmRfaWQgPSBpdGVtLmdldCgicmVjb3JkX2lkIikKICAgICAgICAgICAgaWYgcmVjb3JkX2lkOgogICAgICAgICAgICAgICAgcmVjb3JkID0gc2VsZi5lbnZbaXRlbVsicmVjb3JkX21vZGVsIl1dLmJyb3dzZShyZWNvcmRfaWQpLmV4aXN0cygpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZWNvcmQgPSBzZWxmLmVudltpdGVtWyJyZWNvcmRfbW9kZWwiXV0uZ2V0X2J5X3JlZmVyZW5jZSgKICAgICAgICAgICAgICAgICAgICBpdGVtWyJyZWNvcmRfcmVmZXJlbmNlIl0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgdGFyZ2V0ID0gc2VsZi5lbnZbaXRlbVsidGFyZ2V0X21vZGVsIl1dLmdldF9ieV9yZWZlcmVuY2UoCiAgICAgICAgICAgICAgICBpdGVtWyJ0YXJnZXRfcmVmZXJlbmNlIl0KICAgICAgICAgICAgKQogICAgICAgICAgICBpZiBub3QgcmVjb3JkIG9yIG5vdCB0YXJnZXQ6CiAgICAgICAgICAgICAgICB1bnJlc29sdmVkLmFwcGVuZChpdGVtKQogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgcmVjb3JkLndpdGhfY29udGV4dChmcm9tX3lhbWw9VHJ1ZSkud3JpdGUoe2l0ZW1bImZpZWxkX25hbWUiXTogdGFyZ2V0LmlkfSkKCiAgICAgICAgaWYgdW5yZXNvbHZlZDoKICAgICAgICAgICAgZGV0YWlscyA9ICJcbiIuam9pbigKICAgICAgICAgICAgICAgIHNlbGYuX2Zvcm1hdF9kZWZlcnJlZF9yZXNvbHV0aW9uX2Vycm9yKGl0ZW0pIGZvciBpdGVtIGluIHVucmVzb2x2ZWQKICAgICAgICAgICAgKQogICAgICAgICAgICByYWlzZSBWYWxpZGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICBfKCJEZWZlcnJlZCByZWxhdGlvbiByZXNvbHV0aW9uIGZhaWxlZDpcbiUoZGV0YWlscylzIiwgZGV0YWlscz1kZXRhaWxzKQogICAgICAgICAgICApCgogICAgZGVmIF9mb3JtYXRfZGVmZXJyZWRfeDJtX3Jlc29sdXRpb25fZXJyb3Ioc2VsZiwgaXRlbSk6CiAgICAgICAgIiIiRm9ybWF0IG9uZSB1bnJlc29sdmVkIGRlZmVycmVkIHgybSBjaGlsZCBlbnRyeS4iIiIKICAgICAgICByZXR1cm4gXygKICAgICAgICAgICAgIlJlY29yZCAnJShyZWNvcmQpcyc6IGZpZWxkICclKGZpZWxkKXMnIGNvdWxkIG5vdCByZXNvbHZlICIKICAgICAgICAgICAgIiUodGFyZ2V0X21vZGVsKXMgJyUodGFyZ2V0X3JlZmVyZW5jZSlzJyIsCiAgICAgICAgICAgIHJlY29yZD1pdGVtWyJyZWNvcmRfcmVmZXJlbmNlIl0sCiAgICAgICAgICAgIGZpZWxkPWl0ZW1bImZpZWxkX25hbWUiXSwKICAgICAgICAgICAgdGFyZ2V0X21vZGVsPWl0ZW1bInRhcmdldF9tb2RlbCJdLAogICAgICAgICAgICB0YXJnZXRfcmVmZXJlbmNlPWl0ZW1bInRhcmdldF9yZWZlcmVuY2UiXSwKICAgICAgICApCgogICAgZGVmIF9hcHBseV9kZWZlcnJlZF94Mm1faW1wb3J0cyhzZWxmLCBkZWZlcnJlZF9xdWV1ZSk6CiAgICAgICAgIiIiQ3JlYXRlIHF1ZXVlZCB4Mm0gY2hpbGQgcmVjb3JkcyBhZnRlciB0aGUgbWFpbiBpbXBvcnQgcGFzcy4iIiIKICAgICAgICB1bnJlc29sdmVkID0gW10KICAgICAgICBmb3IgaXRlbSBpbiBkZWZlcnJlZF9xdWV1ZToKICAgICAgICAgICAgb3duZXJfbW9kZWwgPSBzZWxmLmVudltpdGVtWyJyZWNvcmRfbW9kZWwiXV0KICAgICAgICAgICAgcmVjb3JkX2lkID0gaXRlbS5nZXQoInJlY29yZF9pZCIpCiAgICAgICAgICAgIGlmIHJlY29yZF9pZDoKICAgICAgICAgICAgICAgIG93bmVyX3JlY29yZCA9IG93bmVyX21vZGVsLmJyb3dzZShyZWNvcmRfaWQpLmV4aXN0cygpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBvd25lcl9yZWNvcmQgPSBvd25lcl9tb2RlbC5nZXRfYnlfcmVmZXJlbmNlKGl0ZW1bInJlY29yZF9yZWZlcmVuY2UiXSkKICAgICAgICAgICAgdGFyZ2V0X3JlY29yZCA9IHNlbGYuZW52W2l0ZW1bInRhcmdldF9tb2RlbCJdXS5nZXRfYnlfcmVmZXJlbmNlKAogICAgICAgICAgICAgICAgaXRlbVsidGFyZ2V0X3JlZmVyZW5jZSJdCiAgICAgICAgICAgICkKICAgICAgICAgICAgaWYgbm90IG93bmVyX3JlY29yZCBvciBub3QgdGFyZ2V0X3JlY29yZDoKICAgICAgICAgICAgICAgIHVucmVzb2x2ZWQuYXBwZW5kKGl0ZW0pCiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgb3duZXJfZmllbGQgPSBvd25lcl9tb2RlbC5fZmllbGRzW2l0ZW1bImZpZWxkX25hbWUiXV0KICAgICAgICAgICAgaW52ZXJzZV9uYW1lID0gb3duZXJfZmllbGQuaW52ZXJzZV9uYW1lCiAgICAgICAgICAgIGNoaWxkX21vZGVsID0gc2VsZi5lbnZbaXRlbVsiY2hpbGRfbW9kZWwiXV0KICAgICAgICAgICAgY2hpbGRfdmFsdWVzID0gY2hpbGRfbW9kZWwud2l0aF9jb250ZXh0KAogICAgICAgICAgICAgICAgeWFtbF9kZWZlcnJlZF9tMm9fcXVldWU9W10sCiAgICAgICAgICAgICAgICB5YW1sX2RlZmVycmVkX3gybV9xdWV1ZT1bXSwKICAgICAgICAgICAgICAgIGZvcmNlX2NyZWF0ZV9yZWxhdGVkX3JlY29yZD1GYWxzZSwKICAgICAgICAgICAgKS5fcG9zdF9wcm9jZXNzX3lhbWxfZGljdF92YWx1ZXMoY29weS5kZWVwY29weShpdGVtWyJ2YWx1ZXMiXSkpCiAgICAgICAgICAgIGNoaWxkX3ZhbHVlc1tpbnZlcnNlX25hbWVdID0gb3duZXJfcmVjb3JkLmlkCiAgICAgICAgICAgIGlmIG5vdCBjaGlsZF92YWx1ZXMuZ2V0KGl0ZW1bImRlZmVycmVkX2ZpZWxkIl0pOgogICAgICAgICAgICAgICAgdW5yZXNvbHZlZC5hcHBlbmQoaXRlbSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAjIEd1YXJkIGFnYWluc3QgY3JlYXRpbmcgYSBkdXBsaWNhdGUgY2hpbGQgd2hlbiB0aGUgc2FtZQogICAgICAgICAgICAjIChvd25lciwgdGFyZ2V0KSBwYWlyIHdhcyBhbHJlYWR5IGluc2VydGVkIOKAlCBlLmcuIGJlY2F1c2UgYQogICAgICAgICAgICAjIGR1cGxpY2F0ZSBZQU1MIGVudHJ5IHF1ZXVlZCB0aGUgc2FtZSBpdGVtIHR3aWNlLCBvciB0aGUgY2hpbGQKICAgICAgICAgICAgIyB3YXMgY3JlYXRlZCBieSBhIGZpcnN0LXBhc3Mgd3JpdGUgYWZ0ZXIgdGhlIHF1ZXVlIHdhcyBidWlsdC4KICAgICAgICAgICAgZXhpc3RpbmcgPSBjaGlsZF9tb2RlbC5zZWFyY2goCiAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgKGludmVyc2VfbmFtZSwgIj0iLCBvd25lcl9yZWNvcmQuaWQpLAogICAgICAgICAgICAgICAgICAgIChpdGVtWyJkZWZlcnJlZF9maWVsZCJdLCAiPSIsIGNoaWxkX3ZhbHVlc1tpdGVtWyJkZWZlcnJlZF9maWVsZCJdXSksCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgbGltaXQ9MSwKICAgICAgICAgICAgKQogICAgICAgICAgICBpZiBleGlzdGluZzoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBjaGlsZF9tb2RlbC53aXRoX2NvbnRleHQoZnJvbV95YW1sPVRydWUpLmNyZWF0ZShjaGlsZF92YWx1ZXMpCgogICAgICAgIGlmIHVucmVzb2x2ZWQ6CiAgICAgICAgICAgIGRldGFpbHMgPSAiXG4iLmpvaW4oCiAgICAgICAgICAgICAgICBzZWxmLl9mb3JtYXRfZGVmZXJyZWRfeDJtX3Jlc29sdXRpb25fZXJyb3IoaXRlbSkgZm9yIGl0ZW0gaW4gdW5yZXNvbHZlZAogICAgICAgICAgICApCiAgICAgICAgICAgIHJhaXNlIFZhbGlkYXRpb25FcnJvcigKICAgICAgICAgICAgICAgIF8oIkRlZmVycmVkIHJlbGF0aW9uIHJlc29sdXRpb24gZmFpbGVkOlxuJShkZXRhaWxzKXMiLCBkZXRhaWxzPWRldGFpbHMpCiAgICAgICAgICAgICkKCiAgICBkZWYgX3RhZ19kZWZlcnJlZF9xdWV1ZV9pdGVtcyhzZWxmLCBxdWV1ZSwgc3RhcnQsIHJlY29yZF9pZCwgb3duZXJfbW9kZWxfbmFtZSk6CiAgICAgICAgIiIiU3RhbXAgZGVmZXJyZWQgcXVldWUgaXRlbXMgdGhhdCBiZWxvbmcgdG8gKm93bmVyX21vZGVsX25hbWUqLgoKICAgICAgICBOZXN0ZWQgaW1wb3J0cyBxdWV1ZSBkZWZlcnJlZCByZWxhdGlvbnMgZm9yIGlubmVyIG1vZGVscyAoZS5nLiBwbGFuIGxpbmVzKQogICAgICAgIHdoaWxlIGNyZWF0aW5nIGEgdG9wLWxldmVsIHJlY29yZCAoZS5nLiBqZXQgdGVtcGxhdGUpLiBPbmx5IGl0ZW1zIHdob3NlCiAgICAgICAgYGByZWNvcmRfbW9kZWxgYCBtYXRjaGVzIHRoZSByZWNvcmQgdGhhdCB3YXMganVzdCBjcmVhdGVkIG11c3QgcmVjZWl2ZQogICAgICAgIGBgcmVjb3JkX2lkYGA7IG90aGVycyBrZWVwIHJlZmVyZW5jZS1iYXNlZCByZXNvbHV0aW9uIGluIHRoZSBhcHBseSBwYXNzLgoKICAgICAgICBBcmdzOgogICAgICAgICAgICBxdWV1ZSAobGlzdCk6IFRoZSBkZWZlcnJlZCBpbXBvcnQgcXVldWUgKG0ybyBvciB4Mm0pLgogICAgICAgICAgICBzdGFydCAoaW50KTogSW5kZXggb2YgdGhlIGZpcnN0IGl0ZW0gYmVsb25naW5nIHRvIHRoZSBjdXJyZW50IGJhdGNoLgogICAgICAgICAgICByZWNvcmRfaWQgKGludCk6IERhdGFiYXNlIElEIG9mIHRoZSBuZXdseSBjcmVhdGVkL3VwZGF0ZWQgb3duZXIgcmVjb3JkLgogICAgICAgICAgICBvd25lcl9tb2RlbF9uYW1lIChzdHIpOiBUZWNobmljYWwgbmFtZSBvZiB0aGUgbW9kZWwgKnJlY29yZF9pZCogYmVsb25ncyB0by4KICAgICAgICAiIiIKICAgICAgICBmb3IgaXRlbSBpbiBxdWV1ZVtzdGFydDpdOgogICAgICAgICAgICBpZiBpdGVtWyJyZWNvcmRfbW9kZWwiXSA9PSBvd25lcl9tb2RlbF9uYW1lOgogICAgICAgICAgICAgICAgaXRlbVsicmVjb3JkX2lkIl0gPSByZWNvcmRfaWQKCiAgICBkZWYgYWN0aW9uX2ltcG9ydF95YW1sKHNlbGYpOgogICAgICAgICIiIlByb2Nlc3MgWUFNTCBkYXRhIGFuZCBjcmVhdGUgcmVjb3JkcyBpbiBPZG9vIiIiCgogICAgICAgIHNlbGYuZW5zdXJlX29uZSgpCgogICAgICAgICMgUGFyc2UgWUFNTCBjb2RlCiAgICAgICAgeWFtbF9kYXRhID0geWFtbC5zYWZlX2xvYWQoc2VsZi55YW1sX2NvZGUpCiAgICAgICAgcmVjb3JkcyA9IHlhbWxfZGF0YS5nZXQoInJlY29yZHMiKQogICAgICAgIGlmIG5vdCByZWNvcmRzOgogICAgICAgICAgICByYWlzZSBWYWxpZGF0aW9uRXJyb3IoXygiWUFNTCBmaWxlIGRvZXNuJ3QgY29udGFpbiBhbnkgcmVjb3JkcyIpKQoKICAgICAgICAjIENhY2hlIG1vZGVscwogICAgICAgIG1vZGVsX2NhY2hlID0ge30KICAgICAgICBvZG9vX3JlY29yZF9pZHMgPSBbXQogICAgICAgIGRlZmVycmVkX20yb19xdWV1ZSA9IFtdCiAgICAgICAgZGVmZXJyZWRfeDJtX3F1ZXVlID0gW10KCiAgICAgICAgd2l0aCBzZWxmLmVudi5jci5zYXZlcG9pbnQoKToKICAgICAgICAgICAgIyBQcm9jZXNzIGVhY2ggcmVjb3JkCiAgICAgICAgICAgIGZvciByZWNvcmQgaW4gcmVjb3JkczoKICAgICAgICAgICAgICAgIG0yb19zdGFydCA9IGxlbihkZWZlcnJlZF9tMm9fcXVldWUpCiAgICAgICAgICAgICAgICB4Mm1fc3RhcnQgPSBsZW4oZGVmZXJyZWRfeDJtX3F1ZXVlKQogICAgICAgICAgICAgICAgcmVjb3JkX3JlZmVyZW5jZSA9IHJlY29yZC5nZXQoInJlZmVyZW5jZSIpCiAgICAgICAgICAgICAgICBpZiBub3QgcmVjb3JkX3JlZmVyZW5jZToKICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWxpZGF0aW9uRXJyb3IoXygiUmVjb3JkIHJlZmVyZW5jZSBpcyBtaXNzaW5nIikpCiAgICAgICAgICAgICAgICBtb2RlbF9uYW1lID0gcmVjb3JkLmdldCgiY2V0bWl4X3Rvd2VyX21vZGVsIikKICAgICAgICAgICAgICAgIGlmIG5vdCBtb2RlbF9uYW1lOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbGlkYXRpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgXygiUmVjb3JkIG1vZGVsIGlzIG1pc3NpbmcgZm9yIHJlY29yZCAlcyIsIHJlY29yZF9yZWZlcmVuY2UpCiAgICAgICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgICMgR2V0IG1vZGVsIGZyb20gY2FjaGUgb3IgY3JlYXRlIG5ldyBvbmUKICAgICAgICAgICAgICAgIG1vZGVsID0gc2VsZi5fZ2V0X2ltcG9ydF9tb2RlbChtb2RlbF9uYW1lLCBtb2RlbF9jYWNoZSkKCiAgICAgICAgICAgICAgICAjIEdldCBleGlzdGluZyByZWNvcmQgYnkgcmVmZXJlbmNlCiAgICAgICAgICAgICAgICAjIE5PVEU6IHdlIGRvbid0IHZhbGlkYXRlIG1vZGVscyBoZXJlIGJlY2F1c2UgdGhleSBhcmUKICAgICAgICAgICAgICAgICMgYWxyZWFkeSB2YWxpZGF0ZWQgaW4gdGhlIGZpbGUgdXBsb2FkIHdpemFyZC4KICAgICAgICAgICAgICAgIG9kb29fcmVjb3JkID0gbW9kZWwuZ2V0X2J5X3JlZmVyZW5jZShyZWNvcmRfcmVmZXJlbmNlKQoKICAgICAgICAgICAgICAgICMgU2tpcAogICAgICAgICAgICAgICAgaWYgc2VsZi5pZl9yZWNvcmRfZXhpc3RzID09ICJza2lwIiBhbmQgb2Rvb19yZWNvcmQ6CiAgICAgICAgICAgICAgICAgICAgX2xvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAiU2tpcHBpbmcgcmVjb3JkICclcycgaW4gbW9kZWwgJyVzJyBiZWNhdXNlIGl0IGFscmVhZHkgZXhpc3RzIiwKICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkX3JlZmVyZW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfbmFtZSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgICAgICAjIFVwZGF0ZSBleGlzdGluZyByZWNvcmQKICAgICAgICAgICAgICAgIGlmIHNlbGYuaWZfcmVjb3JkX2V4aXN0cyA9PSAidXBkYXRlIiBhbmQgb2Rvb19yZWNvcmQ6CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRfdmFsdWVzID0gbW9kZWwud2l0aF9jb250ZXh0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKipzZWxmLl9nZXRfaW1wb3J0X21vZGVsX2NvbnRleHQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWRfbTJvX3F1ZXVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkX3gybV9xdWV1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZV9jcmVhdGVfcmVsYXRlZF9yZWNvcmQ9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICkuX3Bvc3RfcHJvY2Vzc195YW1sX2RpY3RfdmFsdWVzKHJlY29yZCkKICAgICAgICAgICAgICAgICAgICAgICAgb2Rvb19yZWNvcmQud2l0aF9jb250ZXh0KGZyb21feWFtbD1UcnVlKS53cml0ZShyZWNvcmRfdmFsdWVzKQogICAgICAgICAgICAgICAgICAgICAgICBvZG9vX3JlY29yZF9pZHMuYXBwZW5kKG9kb29fcmVjb3JkLmlkKQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsaWRhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgXygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgdXBkYXRpbmcgcmVjb3JkICUocmVmZXJlbmNlKXM6ICUoZXJyb3IpcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlPXJlY29yZF9yZWZlcmVuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I9ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgKSBmcm9tIGUKICAgICAgICAgICAgICAgICAgICBzZWxmLl90YWdfZGVmZXJyZWRfcXVldWVfaXRlbXMoCiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkX20yb19xdWV1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgbTJvX3N0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICBvZG9vX3JlY29yZC5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuX25hbWUsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHNlbGYuX3RhZ19kZWZlcnJlZF9xdWV1ZV9pdGVtcygKICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWRfeDJtX3F1ZXVlLAogICAgICAgICAgICAgICAgICAgICAgICB4Mm1fc3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgIG9kb29fcmVjb3JkLmlkLAogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5fbmFtZSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgX2xvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAiVXBkYXRlZCByZWNvcmQgJyVzJyBpbiBtb2RlbCAnJXMnIiwKICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkX3JlZmVyZW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfbmFtZSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgICAgICAjIE9yIGNyZWF0ZSBhIG5ldyByZWNvcmQKICAgICAgICAgICAgICAgIHJlY29yZF92YWx1ZXMgPSBtb2RlbC53aXRoX2NvbnRleHQoCiAgICAgICAgICAgICAgICAgICAgKipzZWxmLl9nZXRfaW1wb3J0X21vZGVsX2NvbnRleHQoCiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkX20yb19xdWV1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWRfeDJtX3F1ZXVlLAogICAgICAgICAgICAgICAgICAgICAgICBmb3JjZV9jcmVhdGVfcmVsYXRlZF9yZWNvcmQ9c2VsZi5pZl9yZWNvcmRfZXhpc3RzID09ICJjcmVhdGUiLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkuX3Bvc3RfcHJvY2Vzc195YW1sX2RpY3RfdmFsdWVzKHJlY29yZCkKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBvZG9vX3JlY29yZCA9IG1vZGVsLndpdGhfY29udGV4dChmcm9tX3lhbWw9VHJ1ZSkuY3JlYXRlKAogICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRfdmFsdWVzCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIG9kb29fcmVjb3JkX2lkcy5hcHBlbmQob2Rvb19yZWNvcmQuaWQpCiAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsaWRhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBfKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGNyZWF0aW5nIHJlY29yZCAnJShyZWZlcmVuY2UpcycgaW4gbW9kZWwiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICclKG1vZGVsKXMnOiAlKGVycm9yKXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlPXJlY29yZF9yZWZlcmVuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbD1tb2RlbF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I9ZSwKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICkgZnJvbSBlCiAgICAgICAgICAgICAgICBzZWxmLl90YWdfZGVmZXJyZWRfcXVldWVfaXRlbXMoCiAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWRfbTJvX3F1ZXVlLCBtMm9fc3RhcnQsIG9kb29fcmVjb3JkLmlkLCBtb2RlbC5fbmFtZQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgc2VsZi5fdGFnX2RlZmVycmVkX3F1ZXVlX2l0ZW1zKAogICAgICAgICAgICAgICAgICAgIGRlZmVycmVkX3gybV9xdWV1ZSwgeDJtX3N0YXJ0LCBvZG9vX3JlY29yZC5pZCwgbW9kZWwuX25hbWUKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIF9sb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICAgICAiQ3JlYXRlZCByZWNvcmQgJyVzJyBpbiBtb2RlbCAnJXMnIiwKICAgICAgICAgICAgICAgICAgICByZWNvcmRfcmVmZXJlbmNlLAogICAgICAgICAgICAgICAgICAgIG1vZGVsX25hbWUsCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICBzZWxmLl9hcHBseV9kZWZlcnJlZF9tMm9faW1wb3J0cyhkZWZlcnJlZF9tMm9fcXVldWUpCiAgICAgICAgICAgIHNlbGYuX2FwcGx5X2RlZmVycmVkX3gybV9pbXBvcnRzKGRlZmVycmVkX3gybV9xdWV1ZSkKCiAgICAgICAgIyBObyByZWNvcmRzIHdlcmUgY3JlYXRlZCBvciB1cGRhdGVkCiAgICAgICAgaWYgbm90IG9kb29fcmVjb3JkX2lkczoKICAgICAgICAgICAgYWN0aW9uID0gewogICAgICAgICAgICAgICAgInR5cGUiOiAiaXIuYWN0aW9ucy5jbGllbnQiLAogICAgICAgICAgICAgICAgInRhZyI6ICJkaXNwbGF5X25vdGlmaWNhdGlvbiIsCiAgICAgICAgICAgICAgICAicGFyYW1zIjogewogICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6IF8oIlJlY29yZCBJbXBvcnQiKSwKICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IF8oIk5vIHJlY29yZHMgd2VyZSBjcmVhdGVkIG9yIHVwZGF0ZWQiKSwKICAgICAgICAgICAgICAgICAgICAic3RpY2t5IjogVHJ1ZSwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ3YXJuaW5nIiwKICAgICAgICAgICAgICAgICAgICAibmV4dCI6IHsidHlwZSI6ICJpci5hY3Rpb25zLmFjdF93aW5kb3dfY2xvc2UifSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0KCiAgICAgICAgIyBBbGwgcmVjb3JkcyBmcm9tIHRoZSBzYW1lIG1vZGVsCiAgICAgICAgZWxpZiBsZW4obW9kZWxfY2FjaGUpID09IDE6CiAgICAgICAgICAgIG1vZGVsID0gbGlzdChtb2RlbF9jYWNoZS52YWx1ZXMoKSlbMF0KICAgICAgICAgICAgYWN0aW9uID0gewogICAgICAgICAgICAgICAgIm5hbWUiOiBfKCJJbXBvcnQgcmVzdWx0OiAlKG1vZGVsKXMiLCBtb2RlbD1tb2RlbC5fZGVzY3JpcHRpb24pLAogICAgICAgICAgICAgICAgInR5cGUiOiAiaXIuYWN0aW9ucy5hY3Rfd2luZG93IiwKICAgICAgICAgICAgICAgICJyZXNfbW9kZWwiOiBtb2RlbC5fbmFtZSwKICAgICAgICAgICAgICAgICJ0YXJnZXQiOiAiY3VycmVudCIsCiAgICAgICAgICAgICAgICAiZG9tYWluIjogWygiaWQiLCAiaW4iLCBvZG9vX3JlY29yZF9pZHMpXSwKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiBsZW4ob2Rvb19yZWNvcmRfaWRzKSA9PSAxOgogICAgICAgICAgICAgICAgIyBPcGVuIHNpbmdsZSByZWNvcmQgaW4gZm9ybSB2aWV3CiAgICAgICAgICAgICAgICBhY3Rpb25bInJlc19pZCJdID0gb2Rvb19yZWNvcmRfaWRzWzBdCiAgICAgICAgICAgICAgICBhY3Rpb25bInZpZXdfbW9kZSJdID0gImZvcm0iCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIE9wZW4gbGlzdCB2aWV3IG9mIGFsbCByZWNvcmRzCiAgICAgICAgICAgICAgICBhY3Rpb25bInZpZXdfbW9kZSJdID0gImxpc3QsZm9ybSIKCiAgICAgICAgIyBSZWNvcmRzIGZyb20gZGlmZmVyZW50IG1vZGVscwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG1vZGVsX25hbWVzID0gIiwgIi5qb2luKAogICAgICAgICAgICAgICAgZiIne21vZGVsLl9kZXNjcmlwdGlvbn0nIiBmb3IgbW9kZWwgaW4gbW9kZWxfY2FjaGUudmFsdWVzKCkKICAgICAgICAgICAgKQogICAgICAgICAgICBhY3Rpb24gPSB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJpci5hY3Rpb25zLmNsaWVudCIsCiAgICAgICAgICAgICAgICAidGFnIjogImRpc3BsYXlfbm90aWZpY2F0aW9uIiwKICAgICAgICAgICAgICAgICJwYXJhbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInRpdGxlIjogXygiUmVjb3JkIEltcG9ydCIpLAogICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogXygKICAgICAgICAgICAgICAgICAgICAgICAgIlJlY29yZHMgb2YgdGhlIGZvbGxvd2luZyBtb2RlbHMgd2VyZSBjcmVhdGVkICIKICAgICAgICAgICAgICAgICAgICAgICAgIm9yIHVwZGF0ZWQ6ICUobW9kZWxzKXMiLAogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbHM9bW9kZWxfbmFtZXMsCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAic3RpY2t5IjogVHJ1ZSwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdWNjZXNzIiwKICAgICAgICAgICAgICAgICAgICAibmV4dCI6IHsidHlwZSI6ICJpci5hY3Rpb25zLmFjdF93aW5kb3dfY2xvc2UifSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGFjdGlvbgoKICAgIGRlZiBfZXh0cmFjdF9zZWNyZXRfbmFtZXMoc2VsZiwgZGF0YTogZGljdCkgLT4gbGlzdDoKICAgICAgICAiIiJFeHRyYWN0IG5hbWVzIG9mIHNlY3JldHMgZnJvbSBZQU1MIGRhdGEuCgogICAgICAgIFN1cHBvcnRzIGJvdGggZm9ybWF0czoKICAgICAgICAtIHNlY3JldF9pZHMgLT4gW3tuYW1lOiAuLi59XQogICAgICAgIC0gc2VjcmV0X2lkcyAtPiBbe2tleV9pZDoge25hbWU6IC4uLn19XQogICAgICAgICIiIgogICAgICAgIHNlY3JldF9uYW1lcyA9IHNldCgpCgogICAgICAgIGRlZiBfcmVjdXJzaXZlX2V4dHJhY3Qobm9kZSk6CiAgICAgICAgICAgICIiIlJlY3Vyc2l2ZWx5IGV4dHJhY3Qgc2VjcmV0IG5hbWVzIGZyb20gbmVzdGVkIHN0cnVjdHVyZXMuIiIiCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgZGljdCk6CiAgICAgICAgICAgICAgICBpZiAic2VjcmV0X2lkcyIgaW4gbm9kZSBhbmQgaXNpbnN0YW5jZShub2RlWyJzZWNyZXRfaWRzIl0sIGxpc3QpOgogICAgICAgICAgICAgICAgICAgIGZvciBpdGVtIGluIG5vZGVbInNlY3JldF9pZHMiXToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoaXRlbSwgZGljdCk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgICAgICAgICAgICAgIyBGb3JtYXQgMTogZGlyZWN0IG5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgaWYgIm5hbWUiIGluIGl0ZW06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNyZXRfbmFtZXMuYWRkKGl0ZW1bIm5hbWUiXSkKICAgICAgICAgICAgICAgICAgICAgICAgIyBGb3JtYXQgMjogbmVzdGVkIGtleV9pZCAtPiBuYW1lCiAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImtleV9pZCIgaW4gaXRlbQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGlzaW5zdGFuY2UoaXRlbVsia2V5X2lkIl0sIGRpY3QpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgIm5hbWUiIGluIGl0ZW1bImtleV9pZCJdCiAgICAgICAgICAgICAgICAgICAgICAgICk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNyZXRfbmFtZXMuYWRkKGl0ZW1bImtleV9pZCJdWyJuYW1lIl0pCgogICAgICAgICAgICAgICAgIyBIYW5kbGUgc2luZ2xlIHNzaF9rZXlfaWQKICAgICAgICAgICAgICAgIGlmICJzc2hfa2V5X2lkIiBpbiBub2RlIGFuZCBpc2luc3RhbmNlKG5vZGVbInNzaF9rZXlfaWQiXSwgZGljdCk6CiAgICAgICAgICAgICAgICAgICAgaWYgIm5hbWUiIGluIG5vZGVbInNzaF9rZXlfaWQiXToKICAgICAgICAgICAgICAgICAgICAgICAgc2VjcmV0X25hbWVzLmFkZChub2RlWyJzc2hfa2V5X2lkIl1bIm5hbWUiXSkKCiAgICAgICAgICAgICAgICAjIFJlY3Vyc2l2ZWx5IHByb2Nlc3MgdGhlIHJlc3Qgb2YgdGhlIGRpY3Rpb25hcnkKICAgICAgICAgICAgICAgIGZvciB2YWx1ZSBpbiBub2RlLnZhbHVlcygpOgogICAgICAgICAgICAgICAgICAgIF9yZWN1cnNpdmVfZXh0cmFjdCh2YWx1ZSkKCiAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBsaXN0KToKICAgICAgICAgICAgICAgIGZvciBpdGVtIGluIG5vZGU6CiAgICAgICAgICAgICAgICAgICAgX3JlY3Vyc2l2ZV9leHRyYWN0KGl0ZW0pCgogICAgICAgIF9yZWN1cnNpdmVfZXh0cmFjdChkYXRhKQogICAgICAgIHJldHVybiBsaXN0KHNlY3JldF9uYW1lcykK \ No newline at end of file