diff --git a/addons/cetmix_tower_server/models/cx_tower_command.py b/addons/cetmix_tower_server/models/cx_tower_command.py new file mode 100644 index 0000000..6f14e75 --- /dev/null +++ b/addons/cetmix_tower_server/models/cx_tower_command.py @@ -0,0 +1 @@ +IyBDb3B5cmlnaHQgKEMpIDIwMjIgQ2V0bWl4IE/DnAojIExpY2Vuc2UgQUdQTC0zLjAgb3IgbGF0ZXIgKGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsKS4KaW1wb3J0IGxvZ2dpbmcKZnJvbSB0eXBlcyBpbXBvcnQgU2ltcGxlTmFtZXNwYWNlCmZyb20gdXJsbGliIGltcG9ydCBwYXJzZQoKZnJvbSBkbnMgaW1wb3J0IGV4Y2VwdGlvbiwgcmVzb2x2ZXIsIHJldmVyc2VuYW1lCmZyb20gcHl0eiBpbXBvcnQgdGltZXpvbmUKCmZyb20gb2RvbyBpbXBvcnQgXywgYXBpLCBmaWVsZHMsIG1vZGVscywgdG9vbHMKZnJvbSBvZG9vLmV4Y2VwdGlvbnMgaW1wb3J0IFVzZXJFcnJvcgpmcm9tIG9kb28udG9vbHMgaW1wb3J0IG9ybWNhY2hlCmZyb20gb2Rvby50b29scy5mbG9hdF91dGlscyBpbXBvcnQgZmxvYXRfY29tcGFyZQpmcm9tIG9kb28udG9vbHMuc2FmZV9ldmFsIGltcG9ydCB3cmFwX21vZHVsZQoKZnJvbSAuY29uc3RhbnRzIGltcG9ydCBERUZBVUxUX1BZVEhPTl9DT0RFLCBERUZBVUxUX1BZVEhPTl9DT0RFX0hFTFAKCl9sb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCnJlcXVlc3RzID0gd3JhcF9tb2R1bGUoX19pbXBvcnRfXygicmVxdWVzdHMiKSwgWyJwb3N0IiwgImdldCIsICJkZWxldGUiLCAicmVxdWVzdCJdKQpqc29uID0gd3JhcF9tb2R1bGUoX19pbXBvcnRfXygianNvbiIpLCBbImR1bXBzIl0pCmhhc2hsaWIgPSB3cmFwX21vZHVsZSgKICAgIF9faW1wb3J0X18oImhhc2hsaWIiKSwKICAgIFsKICAgICAgICAic2hhMSIsCiAgICAgICAgInNoYTIyNCIsCiAgICAgICAgInNoYTI1NiIsCiAgICAgICAgInNoYTM4NCIsCiAgICAgICAgInNoYTUxMiIsCiAgICAgICAgInNoYTNfMjI0IiwKICAgICAgICAic2hhM18yNTYiLAogICAgICAgICJzaGEzXzM4NCIsCiAgICAgICAgInNoYTNfNTEyIiwKICAgICAgICAic2hha2VfMTI4IiwKICAgICAgICAic2hha2VfMjU2IiwKICAgICAgICAiYmxha2UyYiIsCiAgICAgICAgImJsYWtlMnMiLAogICAgICAgICJtZDUiLAogICAgICAgICJuZXciLAogICAgXSwKKQpyZSA9IHdyYXBfbW9kdWxlKAogICAgX19pbXBvcnRfXygicmUiKSwKICAgIFsKICAgICAgICAibWF0Y2giLAogICAgICAgICJmdWxsbWF0Y2giLAogICAgICAgICJzZWFyY2giLAogICAgICAgICJzdWIiLAogICAgICAgICJzdWJuIiwKICAgICAgICAic3BsaXQiLAogICAgICAgICJmaW5kYWxsIiwKICAgICAgICAiZmluZGl0ZXIiLAogICAgICAgICJjb21waWxlIiwKICAgICAgICAidGVtcGxhdGUiLAogICAgICAgICJlc2NhcGUiLAogICAgICAgICJlcnJvciIsCiAgICBdLAopCmhtYWMgPSB3cmFwX21vZHVsZSgKICAgIF9faW1wb3J0X18oImhtYWMiKSwKICAgIFsibmV3IiwgImNvbXBhcmVfZGlnZXN0Il0sCikKdXJsbGliX3BhcnNlID0gd3JhcF9tb2R1bGUoCiAgICBwYXJzZSwKICAgIFsKICAgICAgICAidXJscGFyc2UiLAogICAgICAgICJ1cmxqb2luIiwKICAgICAgICAidXJsdW5wYXJzZSIsCiAgICAgICAgInVybGVuY29kZSIsCiAgICAgICAgInVybHNwbGl0IiwKICAgICAgICAidXJsdW5zcGxpdCIsCiAgICAgICAgInBhcnNlX3FzIiwKICAgICAgICAicGFyc2VfcXNsIiwKICAgICAgICAicXVvdGUiLAogICAgICAgICJxdW90ZV9wbHVzIiwKICAgICAgICAicXVvdGVfZnJvbV9ieXRlcyIsCiAgICAgICAgInVucXVvdGUiLAogICAgICAgICJ1bnF1b3RlX3BsdXMiLAogICAgICAgICJ1bnF1b3RlX3RvX2J5dGVzIiwKICAgIF0sCikKdGxkZXh0cmFjdCA9IHdyYXBfbW9kdWxlKF9faW1wb3J0X18oInRsZGV4dHJhY3QiKSwgWyJleHRyYWN0Il0pCmRuc19yZXNvbHZlciA9IHdyYXBfbW9kdWxlKHJlc29sdmVyLCBbInJlc29sdmUiLCAicXVlcnkiXSkKZG5zX3JldmVyc2VuYW1lID0gd3JhcF9tb2R1bGUocmV2ZXJzZW5hbWUsIFsiZnJvbV9hZGRyZXNzIiwgInRvX2FkZHJlc3MiXSkKZG5zX2V4Y2VwdGlvbiA9IHdyYXBfbW9kdWxlKGV4Y2VwdGlvbiwgWyJETlNFeGNlcHRpb24iXSkKCgpkbnMgPSBTaW1wbGVOYW1lc3BhY2UoCiAgICByZXNvbHZlcj1kbnNfcmVzb2x2ZXIsCiAgICByZXZlcnNlbmFtZT1kbnNfcmV2ZXJzZW5hbWUsCiAgICBleGNlcHRpb249ZG5zX2V4Y2VwdGlvbiwKKQoKCmNsYXNzIEN4VG93ZXJDb21tYW5kKG1vZGVscy5Nb2RlbCk6CiAgICAiIiJDb21tYW5kIHRvIHJ1biBvbiBhIHNlcnZlciIiIgoKICAgIF9uYW1lID0gImN4LnRvd2VyLmNvbW1hbmQiCiAgICBfaW5oZXJpdCA9IFsKICAgICAgICAiY3gudG93ZXIudGVtcGxhdGUubWl4aW4iLAogICAgICAgICJjeC50b3dlci5yZWZlcmVuY2UubWl4aW4iLAogICAgICAgICJjeC50b3dlci5hY2Nlc3MubWl4aW4iLAogICAgICAgICJjeC50b3dlci5hY2Nlc3Mucm9sZS5taXhpbiIsCiAgICAgICAgImN4LnRvd2VyLmtleS5taXhpbiIsCiAgICAgICAgImN4LnRvd2VyLnRhZy5taXhpbiIsCiAgICBdCiAgICBfZGVzY3JpcHRpb24gPSAiQ2V0bWl4IFRvd2VyIENvbW1hbmQiCiAgICBfb3JkZXIgPSAibmFtZSIKCiAgICBhY3RpdmUgPSBmaWVsZHMuQm9vbGVhbihkZWZhdWx0PVRydWUpCiAgICBhbGxvd19wYXJhbGxlbF9ydW4gPSBmaWVsZHMuQm9vbGVhbigKICAgICAgICBoZWxwPSJJZiBlbmFibGVkLCBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgY29tbWFuZCAiCiAgICAgICAgImNhbiBiZSBydW4gb24gdGhlIHNhbWUgc2VydmVyIGF0IHRoZSBzYW1lIHRpbWUuXG4iCiAgICAgICAgIk90aGVyd2lzZSwgQU5PVEhFUl9DT01NQU5EX1JVTk5JTkcgc3RhdHVzIHdpbGwgYmUgcmV0dXJuZWQgaWYgYW5vdGhlciIKICAgICAgICAiIGluc3RhbmNlIG9mIHRoZSBzYW1lIGNvbW1hbmQgaXMgYWxyZWFkeSBydW5uaW5nIgogICAgKQogICAgc2VydmVyX2lkcyA9IGZpZWxkcy5NYW55Mm1hbnkoCiAgICAgICAgY29tb2RlbF9uYW1lPSJjeC50b3dlci5zZXJ2ZXIiLAogICAgICAgIHJlbGF0aW9uPSJjeF90b3dlcl9zZXJ2ZXJfY29tbWFuZF9yZWwiLAogICAgICAgIGNvbHVtbjE9ImNvbW1hbmRfaWQiLAogICAgICAgIGNvbHVtbjI9InNlcnZlcl9pZCIsCiAgICAgICAgc3RyaW5nPSJTZXJ2ZXJzIiwKICAgICAgICBoZWxwPSJTZXJ2ZXJzIG9uIHdoaWNoIHRoZSBjb21tYW5kIHdpbGwgYmUgcnVuLlxuIgogICAgICAgICJJZiBlbXB0eSwgY29tbWFuZCBjYW4gYmUgcnVuIG9uIGFsbCBzZXJ2ZXJzIiwKICAgICkKICAgIHRhZ19pZHMgPSBmaWVsZHMuTWFueTJtYW55KAogICAgICAgIHJlbGF0aW9uPSJjeF90b3dlcl9jb21tYW5kX3RhZ19yZWwiLAogICAgICAgIGNvbHVtbjE9ImNvbW1hbmRfaWQiLAogICAgICAgIGNvbHVtbjI9InRhZ19pZCIsCiAgICApCiAgICBvc19pZHMgPSBmaWVsZHMuTWFueTJtYW55KAogICAgICAgIGNvbW9kZWxfbmFtZT0iY3gudG93ZXIub3MiLAogICAgICAgIHJlbGF0aW9uPSJjeF90b3dlcl9vc19jb21tYW5kX3JlbCIsCiAgICAgICAgY29sdW1uMT0iY29tbWFuZF9pZCIsCiAgICAgICAgY29sdW1uMj0ib3NfaWQiLAogICAgICAgIHN0cmluZz0iT1NlcyIsCiAgICApCiAgICBub3RlID0gZmllbGRzLlRleHQoKQoKICAgIGFjdGlvbiA9IGZpZWxkcy5TZWxlY3Rpb24oCiAgICAgICAgc2VsZWN0aW9uPWxhbWJkYSBzZWxmOiBzZWxmLl9zZWxlY3Rpb25fYWN0aW9uKCksCiAgICAgICAgcmVxdWlyZWQ9VHJ1ZSwKICAgICAgICBkZWZhdWx0PWxhbWJkYSBzZWxmOiBzZWxmLl9zZWxlY3Rpb25fYWN0aW9uKClbMF1bMF0sCiAgICApCiAgICBwYXRoID0gZmllbGRzLkNoYXIoCiAgICAgICAgc3RyaW5nPSJEZWZhdWx0IFBhdGgiLAogICAgICAgIGhlbHA9IkxvY2F0aW9uIHdoZXJlIGNvbW1hbmQgd2lsbCBiZSBydW4uICIKICAgICAgICAiWW91IGNhbiB1c2Uge3sgdmFyaWFibGVzIH19IGluIHBhdGgiLAogICAgKQogICAgZmlsZV90ZW1wbGF0ZV9pZCA9IGZpZWxkcy5NYW55Mm9uZSgKICAgICAgICBjb21vZGVsX25hbWU9ImN4LnRvd2VyLmZpbGUudGVtcGxhdGUiLAogICAgICAgIGhlbHA9IlRoaXMgdGVtcGxhdGUgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBvciB1cGRhdGUgdGhlIHB1c2hlZCBmaWxlIiwKICAgICkKICAgIHRlbXBsYXRlX2NvZGUgPSBmaWVsZHMuVGV4dCgKICAgICAgICBzdHJpbmc9IlRlbXBsYXRlIENvZGUiLAogICAgICAgIHJlbGF0ZWQ9ImZpbGVfdGVtcGxhdGVfaWQuY29kZSIsCiAgICAgICAgcmVhZG9ubHk9VHJ1ZSwKICAgICAgICBoZWxwPSJDb2RlIG9mIHRoZSBhc3NvY2lhdGVkIGZpbGUgdGVtcGxhdGUiLAogICAgKQogICAgZmxpZ2h0X3BsYW5fbGluZV9pZHMgPSBmaWVsZHMuT25lMm1hbnkoCiAgICAgICAgY29tb2RlbF9uYW1lPSJjeC50b3dlci5wbGFuLmxpbmUiLAogICAgICAgIHJlbGF0ZWQ9ImZsaWdodF9wbGFuX2lkLmxpbmVfaWRzIiwKICAgICAgICByZWFkb25seT1UcnVlLAogICAgICAgIGhlbHA9IkxpbmVzIG9mIHRoZSBhc3NvY2lhdGVkIGZsaWdodCBwbGFuIiwKICAgICkKICAgIGNvZGUgPSBmaWVsZHMuVGV4dCgKICAgICAgICBjb21wdXRlPSJfY29tcHV0ZV9jb2RlIiwKICAgICAgICBzdG9yZT1UcnVlLAogICAgICAgIHJlYWRvbmx5PUZhbHNlLAogICAgKQogICAgY29tbWFuZF9oZWxwID0gZmllbGRzLkh0bWwoCiAgICAgICAgY29tcHV0ZT0iX2NvbXB1dGVfY29tbWFuZF9oZWxwIiwKICAgICAgICBjb21wdXRlX3N1ZG89VHJ1ZSwKICAgICkKICAgIGZsaWdodF9wbGFuX2lkID0gZmllbGRzLk1hbnkyb25lKAogICAgICAgIGNvbW9kZWxfbmFtZT0iY3gudG93ZXIucGxhbiIsCiAgICAgICAgaGVscD0iRmxpZ2h0IHBsYW4gcnVuIGJ5IHRoZSBjb21tYW5kIiwKICAgICkKICAgIGZsaWdodF9wbGFuX3VzZWRfaWRzID0gZmllbGRzLk1hbnkybWFueSgKICAgICAgICBjb21vZGVsX25hbWU9ImN4LnRvd2VyLnBsYW4iLAogICAgICAgIGhlbHA9IkZsaWdodCBwbGFuIHRoaXMgY29tbWFuZCBpcyB1c2VkIGluIiwKICAgICAgICByZWxhdGlvbj0iY3hfdG93ZXJfY29tbWFuZF9mbGlnaHRfcGxhbl91c2VkX2lkX3JlbCIsCiAgICAgICAgY29sdW1uMT0iY29tbWFuZF9pZCIsCiAgICAgICAgY29sdW1uMj0icGxhbl9pZCIsCiAgICAgICAgc3RvcmU9VHJ1ZSwKICAgICAgICBjb3B5PUZhbHNlLAogICAgKQogICAgZmxpZ2h0X3BsYW5fdXNlZF9pZHNfY291bnQgPSBmaWVsZHMuSW50ZWdlcigKICAgICAgICBjb21wdXRlPSJfY29tcHV0ZV9mbGlnaHRfcGxhbl91c2VkX2lkc19jb3VudCIsCiAgICAgICAgaGVscD0iRmxpZ2h0IHBsYW4gdGhpcyBjb21tYW5kIGlzIHVzZWQgaW4iLAogICAgKQogICAgc2VydmVyX3N0YXR1cyA9IGZpZWxkcy5TZWxlY3Rpb24oCiAgICAgICAgc2VsZWN0aW9uPWxhbWJkYSBzZWxmOiBzZWxmLmVudlsiY3gudG93ZXIuc2VydmVyIl0uX3NlbGVjdGlvbl9zdGF0dXMoKSwKICAgICAgICBoZWxwPSJTZXQgdGhlIGZvbGxvd2luZyBzdGF0dXMgaWYgY29tbWFuZCBmaW5pc2hlcyB3aXRoIHN1Y2Nlc3MuICIKICAgICAgICAiTGVhdmUgJ1VuZGVmaW5lZCcgaWYgeW91IGRvbid0IG5lZWQgdG8gdXBkYXRlIHRoZSBzdGF0dXMiLAogICAgKQogICAgbm9fc3BsaXRfZm9yX3N1ZG8gPSBmaWVsZHMuQm9vbGVhbigKICAgICAgICBzdHJpbmc9Ik5vIFNwbGl0IGZvciBzdWRvIiwKICAgICAgICBoZWxwPSJJZiBlbmFibGVkLCBkbyBub3Qgc3BsaXQgY29tbWFuZCBvbiAnJiYnIHdoZW4gdXNpbmcgc3Vkby4iCiAgICAgICAgIlByZXBlbmQgc3VkbyBvbmNlIHRvIHRoZSB3aG9sZSBjb21tYW5kLiIsCiAgICApCiAgICB2YXJpYWJsZV9pZHMgPSBmaWVsZHMuTWFueTJtYW55KAogICAgICAgIGNvbW9kZWxfbmFtZT0iY3gudG93ZXIudmFyaWFibGUiLAogICAgICAgIHJlbGF0aW9uPSJjeF90b3dlcl9jb21tYW5kX3ZhcmlhYmxlX3JlbCIsCiAgICAgICAgY29sdW1uMT0iY29tbWFuZF9pZCIsCiAgICAgICAgY29sdW1uMj0idmFyaWFibGVfaWQiLAogICAgKQoKICAgIGlmX2ZpbGVfZXhpc3RzID0gZmllbGRzLlNlbGVjdGlvbigKICAgICAgICBzZWxlY3Rpb249WwogICAgICAgICAgICAoInNraXAiLCAiU2tpcCIpLAogICAgICAgICAgICAoIm92ZXJ3cml0ZSIsICJPdmVyd3JpdGUiKSwKICAgICAgICAgICAgKCJyYWlzZSIsICJSYWlzZSBFcnJvciIpLAogICAgICAgIF0sCiAgICAgICAgZGVmYXVsdD0ic2tpcCIsCiAgICAgICAgaGVscD0iV2hhdCB0byBkbyBpZiBmaWxlIGFscmVhZHkgZXhpc3RzIG9uIHRoZSBzZXJ2ZXIuXG4iCiAgICAgICAgIi0gU2tpcDogRG8gbm90IGNyZWF0ZSBvciB1cGRhdGUgdGhlIGZpbGUuXG4iCiAgICAgICAgIi0gT3ZlcndyaXRlOiBSZXBsYWNlIHRoZSBleGlzdGluZyBmaWxlIHdpdGggdGhlIG5ldyBvbmUuXG4iCiAgICAgICAgIi0gUmFpc2UgRXJyb3I6IFJhaXNlIGFuIGVycm9yIGlmIHRoZSBmaWxlIGFscmVhZHkgZXhpc3RzLiIsCiAgICApCiAgICBkaXNjb25uZWN0X2ZpbGUgPSBmaWVsZHMuQm9vbGVhbigKICAgICAgICBzdHJpbmc9IkRpc2Nvbm5lY3QgZnJvbSBUZW1wbGF0ZSIsCiAgICAgICAgaGVscD0oCiAgICAgICAgICAgICJJZiBlbmFibGVkLCBkaXNjb25uZWN0cyB0aGUgZmlsZSBmcm9tIGl0cyB0ZW1wbGF0ZSAiCiAgICAgICAgICAgICJhZnRlciBydW5uaW5nIHRoZSBjb21tYW5kLlxuIgogICAgICAgICksCiAgICApCiAgICAjIC0tIEpldHMKICAgIGpldF90ZW1wbGF0ZV9pZCA9IGZpZWxkcy5NYW55Mm9uZSgKICAgICAgICBjb21vZGVsX25hbWU9ImN4LnRvd2VyLmpldC50ZW1wbGF0ZSIsCiAgICAgICAgaGVscD0iQWN0aW9uIHdpbGwgYmUgdHJpZ2dlcmVkIGZvciBhbGwgZGVwZW5kZW50IGpldHMiICIgb2YgdGhpcyB0ZW1wbGF0ZSIsCiAgICApCiAgICBqZXRfYWN0aW9uX2lkID0gZmllbGRzLk1hbnkyb25lKAogICAgICAgIGNvbW9kZWxfbmFtZT0iY3gudG93ZXIuamV0LmFjdGlvbiIsCiAgICAgICAgaGVscD0iQWN0aW9uIHRvIHRyaWdnZXIiLAogICAgICAgIGRvbWFpbj0iWygnamV0X3RlbXBsYXRlX2lkJywgJz0nLCBqZXRfdGVtcGxhdGVfaWQpXSIsCiAgICApCiAgICAjIC0tIFdheXBvaW50cwogICAgd2F5cG9pbnRfdGVtcGxhdGVfaWQgPSBmaWVsZHMuTWFueTJvbmUoCiAgICAgICAgY29tb2RlbF9uYW1lPSJjeC50b3dlci5qZXQud2F5cG9pbnQudGVtcGxhdGUiLAogICAgICAgIHN0cmluZz0iV2F5cG9pbnQgVGVtcGxhdGUiLAogICAgICAgIGhlbHA9IldheXBvaW50IHRlbXBsYXRlIHRvIGNyZWF0ZSB0aGUgd2F5cG9pbnQgZnJvbS4gVXNlZCB3aGVuIGFjdGlvbiBpcyAiCiAgICAgICAgIkNyZWF0ZSBhIFdheXBvaW50LiIsCiAgICApCiAgICBmbHlfaGVyZSA9IGZpZWxkcy5Cb29sZWFuKAogICAgICAgIGRlZmF1bHQ9RmFsc2UsCiAgICAgICAgaGVscD0iV2hlbiBlbmFibGVkLCB0aGUgY3JlYXRlZCB3YXlwb2ludCBpcyBzZXQgYXMgY3VycmVudCAoZmx5IHRvKSAiCiAgICAgICAgImFmdGVyIGNyZWF0aW9uLiIsCiAgICApCgogICAgIyAtLS0tIEFjY2Vzcy4gQWRkIHJlbGF0aW9uIGZvciBtaXhpbiBmaWVsZHMKICAgIHVzZXJfaWRzID0gZmllbGRzLk1hbnkybWFueSgKICAgICAgICByZWxhdGlvbj0iY3hfdG93ZXJfY29tbWFuZF91c2VyX3JlbCIsCiAgICApCiAgICBtYW5hZ2VyX2lkcyA9IGZpZWxkcy5NYW55Mm1hbnkoCiAgICAgICAgcmVsYXRpb249ImN4X3Rvd2VyX2NvbW1hbmRfbWFuYWdlcl9yZWwiLAogICAgKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9nZXRfZGVwZW5kc19maWVsZHMoY2xzKToKICAgICAgICAiIiIKICAgICAgICBEZWZpbmUgZGVwZW5kZW50IGZpZWxkcyBmb3IgY29tcHV0aW5nIGB2YXJpYWJsZV9pZHNgIGluIGNvbW1hbmQtcmVsYXRlZCBtb2RlbHMuCgogICAgICAgIFRoaXMgaW1wbGVtZW50YXRpb24gc3BlY2lmaWVzIHRoYXQgdGhlIGZpZWxkcyBgY29kZWAgYW5kIGBwYXRoYAogICAgICAgIGFyZSB1c2VkIHRvIGRldGVybWluZSB0aGUgdmFyaWFibGVzIGFzc29jaWF0ZWQgd2l0aCBhIGNvbW1hbmQuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIGxpc3Q6IEEgbGlzdCBvZiBmaWVsZCBuYW1lcyAoc3RyKSByZXByZXNlbnRpbmcgdGhlIGRlcGVuZGVuY2llcy4KCiAgICAgICAgRXhhbXBsZToKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBmaWVsZHMgdHJpZ2dlciByZWNvbXB1dGF0aW9uIG9mIGB2YXJpYWJsZV9pZHNgOgogICAgICAgICAgICAtIGBjb2RlYDogVGhlIGNvbW1hbmQncyBzY3JpcHQgb3IgcnVubmluZyBsb2dpYy4KICAgICAgICAgICAgLSBgcGF0aGA6IFRoZSBkZWZhdWx0IHJ1bm5pbmcgcGF0aCBmb3IgdGhlIGNvbW1hbmQuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIFsiY29kZSIsICJwYXRoIl0KCiAgICAjIC0tIFNlbGVjdGlvbgogICAgZGVmIF9zZWxlY3Rpb25fYWN0aW9uKHNlbGYpOgogICAgICAgICIiIkFjdGlvbnMgdGhhdCBjYW4gYmUgcnVuIGJ5IGEgY29tbWFuZC4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgTGlzdCBvZiB0dXBsZXM6IGF2YWlsYWJsZSBvcHRpb25zLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICgic3NoX2NvbW1hbmQiLCAiU1NIIENvbW1hbmQiKSwKICAgICAgICAgICAgKCJweXRob25fY29kZSIsICJQeXRob24gQ29kZSIpLAogICAgICAgICAgICAoImZpbGVfdXNpbmdfdGVtcGxhdGUiLCAiQ3JlYXRlL1VwZGF0ZSBGaWxlIiksCiAgICAgICAgICAgICgicGxhbiIsICJSdW4gRmxpZ2h0IFBsYW4iKSwKICAgICAgICAgICAgKCJqZXRfYWN0aW9uIiwgIlRyaWdnZXIgSmV0IEFjdGlvbiIpLAogICAgICAgICAgICAoImNyZWF0ZV93YXlwb2ludCIsICJDcmVhdGUgV2F5cG9pbnQiKSwKICAgICAgICBdCgogICAgIyAtLSBEZWZhdWx0cwogICAgZGVmIF9nZXRfZGVmYXVsdF9weXRob25fY29kZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBEZWZhdWx0IHB5dGhvbiBjb21tYW5kIGNvZGUKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gREVGQVVMVF9QWVRIT05fQ09ERQoKICAgIGRlZiBfZ2V0X2RlZmF1bHRfcHl0aG9uX2NvZGVfaGVscChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBEZWZhdWx0IHB5dGhvbiBjb2RlIGhlbHAKICAgICAgICAiIiIKCiAgICAgICAgIyBBdmFpbGFibGUgbGlicmFyaWVzIGFyZSBPZG9vIG9iamVjdHMgKyBQeXRob24gbGlicmFyaWVzCiAgICAgICAgYXZhaWxhYmxlX2xpYnJhcmllcyA9IHNlbGYuX2dldF9weXRob25fY29tbWFuZF9vZG9vX29iamVjdHMoKQogICAgICAgIGF2YWlsYWJsZV9saWJyYXJpZXMudXBkYXRlKHNlbGYuX2dldF9weXRob25fY29tbWFuZF9saWJyYXJpZXMoKSkKICAgICAgICBoZWxwX3RleHRfZnJhZ21lbnRzID0gW10KICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBhdmFpbGFibGVfbGlicmFyaWVzLml0ZW1zKCk6CiAgICAgICAgICAgIGhlbHBfdGV4dF9mcmFnbWVudHMuYXBwZW5kKGYiPGxpPjxjb2RlPntrZXl9PC9jb2RlPjoge3ZhbHVlWydoZWxwJ119PC9saT4iKQoKICAgICAgICBoZWxwX3RleHRfZnJhZ21lbnRzLmFwcGVuZCgKICAgICAgICAgICAgZiI8bGk+PGNvZGU+Y3VzdG9tX3ZhbHVlczwvY29kZT46IHtfKCdGbGlnaHQgcGxhbiBjdXN0b20gdmFsdWVzJyl9PC9saT4iCiAgICAgICAgKQoKICAgICAgICBoZWxwX3RleHQgPSAiPHVsPiIgKyAiIi5qb2luKGhlbHBfdGV4dF9mcmFnbWVudHMpICsgIjwvdWw+IgogICAgICAgIHJldHVybiBmIntERUZBVUxUX1BZVEhPTl9DT0RFX0hFTFB9e2hlbHBfdGV4dH0iCgogICAgIyAtLSBDb21wdXRlcwogICAgQGFwaS5kZXBlbmRzKCJhY3Rpb24iKQogICAgZGVmIF9jb21wdXRlX2NvZGUoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQ29tcHV0ZSBkZWZhdWx0IGNvZGUKICAgICAgICAiIiIKICAgICAgICBkZWZhdWx0X3B5dGhvbl9jb2RlID0gc2VsZi5fZ2V0X2RlZmF1bHRfcHl0aG9uX2NvZGUoKQogICAgICAgIGZvciBjb21tYW5kIGluIHNlbGY6CiAgICAgICAgICAgIGlmIGNvbW1hbmQuYWN0aW9uID09ICJweXRob25fY29kZSI6CiAgICAgICAgICAgICAgICBjb21tYW5kLmNvZGUgPSBkZWZhdWx0X3B5dGhvbl9jb2RlCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBjb21tYW5kLmNvZGUgPSBGYWxzZQoKICAgIEBhcGkuZGVwZW5kcygiYWN0aW9uIikKICAgIGRlZiBfY29tcHV0ZV9jb21tYW5kX2hlbHAoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQ29tcHV0ZSBjb21tYW5kIGhlbHAKICAgICAgICAiIiIKICAgICAgICBkZWZhdWx0X3B5dGhvbl9jb2RlX2hlbHAgPSBzZWxmLl9nZXRfZGVmYXVsdF9weXRob25fY29kZV9oZWxwKCkKICAgICAgICBmb3IgY29tbWFuZCBpbiBzZWxmOgogICAgICAgICAgICBpZiBjb21tYW5kLmFjdGlvbiA9PSAicHl0aG9uX2NvZGUiOgogICAgICAgICAgICAgICAgY29tbWFuZC5jb21tYW5kX2hlbHAgPSBkZWZhdWx0X3B5dGhvbl9jb2RlX2hlbHAKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGNvbW1hbmQuY29tbWFuZF9oZWxwID0gRmFsc2UKCiAgICBAYXBpLmRlcGVuZHMoImZsaWdodF9wbGFuX3VzZWRfaWRzIikKICAgIGRlZiBfY29tcHV0ZV9mbGlnaHRfcGxhbl91c2VkX2lkc19jb3VudChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDb21wdXRlIGZsaWdodCBwbGFuIGlkcyBjb3VudAogICAgICAgICIiIgogICAgICAgIGZvciBjb21tYW5kIGluIHNlbGY6CiAgICAgICAgICAgIGNvbW1hbmQuZmxpZ2h0X3BsYW5fdXNlZF9pZHNfY291bnQgPSBsZW4oY29tbWFuZC5mbGlnaHRfcGxhbl91c2VkX2lkcykKCiAgICBkZWYgYWN0aW9uX29wZW5fY29tbWFuZF9sb2dzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE9wZW4gY3VycmVudCBjdXJyZW50IGNvbW1hbmQgbG9nIHJlY29yZHMKICAgICAgICAiIiIKICAgICAgICBhY3Rpb24gPSBzZWxmLmVudlsiaXIuYWN0aW9ucy5hY3Rpb25zIl0uX2Zvcl94bWxfaWQoCiAgICAgICAgICAgICJjZXRtaXhfdG93ZXJfc2VydmVyLmFjdGlvbl9jeF90b3dlcl9jb21tYW5kX2xvZyIKICAgICAgICApCiAgICAgICAgYWN0aW9uWyJkb21haW4iXSA9IFsoImNvbW1hbmRfaWQiLCAiPSIsIHNlbGYuaWQpXQogICAgICAgIHJldHVybiBhY3Rpb24KCiAgICBkZWYgYWN0aW9uX29wZW5fcGxhbnMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgT3BlbiBwbGFucyB0aGlzIGNvbW1hbmQgaXMgdXNlZCBpbgogICAgICAgICIiIgogICAgICAgIGFjdGlvbiA9IHNlbGYuZW52WyJpci5hY3Rpb25zLmFjdGlvbnMiXS5fZm9yX3htbF9pZCgKICAgICAgICAgICAgImNldG1peF90b3dlcl9zZXJ2ZXIuYWN0aW9uX2N4X3Rvd2VyX3BsYW4iCiAgICAgICAgKQogICAgICAgIGFjdGlvblsiZG9tYWluIl0gPSBbKCJpZCIsICJpbiIsIHNlbGYuZmxpZ2h0X3BsYW5fdXNlZF9pZHMuaWRzKV0KICAgICAgICByZXR1cm4gYWN0aW9uCgogICAgZGVmIF9jaGVja19zZXJ2ZXJfY29tcGF0aWJpbGl0eShzZWxmLCBzZXJ2ZXIpOgogICAgICAgICIiIkNoZWNrIGlmIHRoZSBjb21tYW5kIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgc2VydmVyCiAgICAgICAgQXJnczoKICAgICAgICAgICAgc2VydmVyIChjeC50b3dlci5zZXJ2ZXIoKSk6IFNlcnZlciBvYmplY3QKCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgYm9vbDogVHJ1ZSBpZiB0aGUgY29tbWFuZCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHNlcnZlciwgRmFsc2Ugb3RoZXJ3aXNlCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5lbnN1cmVfb25lKCkKICAgICAgICByZXR1cm4gbm90IHNlbGYuc2VydmVyX2lkcyBvciBzZXJ2ZXIuaWQgaW4gc2VsZi5zZXJ2ZXJfaWRzLmlkcwoKICAgICMgLS0gQnVzaW5lc3MgbG9naWMKICAgIEBvcm1jYWNoZSgpCiAgICBAYXBpLm1vZGVsCiAgICBkZWYgX2dldF9weXRob25fY29tbWFuZF9saWJyYXJpZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgR2V0IGF2YWlsYWJsZSBweXRob24gaW1wb3J0cy4gVXNlIHRoaXMgbWV0aG9kIHRvIGltcG9ydCBweXRob24gbGlicmFyaWVzLgogICAgICAgIFBsZWFzZSBiZSBhZHZpc2VkLCB0aGF0IHRoaXMgbWV0aG9kIGlzIGNhY2hlZC4KICAgICAgICBJZiB5b3UgbmVlZCB0byB1c2UgYSBub24tY2FjaGVkIGltcG9ydCwgZWcgZm9yIE9kb28gb2JqZWN0cywKICAgICAgICB1c2UgdGhlIGBfZ2V0X3B5dGhvbl9jb21tYW5kX29kb29fb2JqZWN0c2AgbWV0aG9kIGluc3RlYWQuCgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBkaWN0OiBBdmFpbGFibGUgbGlicmFyaWVzOgogICAgICAgICAgICAgICAgeyI8bGlicmFyeV9uYW1lPiI6IHsKICAgICAgICAgICAgICAgICAgICAiaW1wb3J0IjogPGxpYnJhcnlfaW1wb3J0PiwKICAgICAgICAgICAgICAgICAgICAiaGVscCI6IDxsaWJyYXJ5X2hlbHBfaHRtbD4KICAgICAgICAgICAgICAgIH19CiAgICAgICAgIiIiCiAgICAgICAgcHl0aG9uX2xpYnJhcmllcyA9IHsKICAgICAgICAgICAgIl9sb2dnZXIiOiB7CiAgICAgICAgICAgICAgICAiaW1wb3J0IjogX2xvZ2dlciwKICAgICAgICAgICAgICAgICJoZWxwIjogXygKICAgICAgICAgICAgICAgICAgICAiTG9nZ2VyIG9iamVjdC4gVXNlIHdpdGggY2F1dGlvbiEgT25seSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLiIKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZSI6IHsKICAgICAgICAgICAgICAgICJpbXBvcnQiOiByZSwKICAgICAgICAgICAgICAgICJoZWxwIjogXygiUHl0aG9uICdyZScgbGlicmFyeSBmb3IgcmVnZXggb3BlcmF0aW9ucyIpLAogICAgICAgICAgICB9LAogICAgICAgICAgICAidGltZSI6IHsKICAgICAgICAgICAgICAgICJpbXBvcnQiOiB0b29scy5zYWZlX2V2YWwudGltZSwKICAgICAgICAgICAgICAgICJoZWxwIjogXygiUHl0aG9uICd0aW1lJyBsaWJyYXJ5IiksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkYXRldGltZSI6IHsKICAgICAgICAgICAgICAgICJpbXBvcnQiOiB0b29scy5zYWZlX2V2YWwuZGF0ZXRpbWUsCiAgICAgICAgICAgICAgICAiaGVscCI6IF8oIlB5dGhvbiAnZGF0ZXRpbWUnIGxpYnJhcnkiKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImRhdGV1dGlsIjogewogICAgICAgICAgICAgICAgImltcG9ydCI6IHRvb2xzLnNhZmVfZXZhbC5kYXRldXRpbCwKICAgICAgICAgICAgICAgICJoZWxwIjogXygiUHl0aG9uICdkYXRldXRpbCcgbGlicmFyeSIpLAogICAgICAgICAgICB9LAogICAgICAgICAgICAidGltZXpvbmUiOiB7CiAgICAgICAgICAgICAgICAiaW1wb3J0IjogdGltZXpvbmUsCiAgICAgICAgICAgICAgICAiaGVscCI6IF8oIlB5dGhvbiAndGltZXpvbmUnIGxpYnJhcnkiKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVlc3RzIjogewogICAgICAgICAgICAgICAgImltcG9ydCI6IHJlcXVlc3RzLAogICAgICAgICAgICAgICAgImhlbHAiOiBfKAogICAgICAgICAgICAgICAgICAgICJQeXRob24gJ3JlcXVlc3RzJyBsaWJyYXJ5LiBBdmFpbGFibGUgbWV0aG9kczogJ3Bvc3QnLCAnZ2V0JywiCiAgICAgICAgICAgICAgICAgICAgIiAnZGVsZXRlJywgJ3JlcXVlc3QnIgogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInVybGxpYl9wYXJzZSI6IHsKICAgICAgICAgICAgICAgICJpbXBvcnQiOiB1cmxsaWJfcGFyc2UsCiAgICAgICAgICAgICAgICAiaGVscCI6IF8oIlB5dGhvbiAndXJsbGliLnBhcnNlJyBsaWJyYXJ5IG1ldGhvZHMuIiksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJqc29uIjogewogICAgICAgICAgICAgICAgImltcG9ydCI6IGpzb24sCiAgICAgICAgICAgICAgICAiaGVscCI6IF8oIlB5dGhvbiAnanNvbicgbGlicmFyeS4gQXZhaWxhYmxlIG1ldGhvZHM6ICdkdW1wcyciKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImZsb2F0X2NvbXBhcmUiOiB7CiAgICAgICAgICAgICAgICAiaW1wb3J0IjogZmxvYXRfY29tcGFyZSwKICAgICAgICAgICAgICAgICJoZWxwIjogXygiRmxvYXQgY29tcGFyZS4gT2RvbyBoZWxwZXIgZnVuY3Rpb24gdG8gY29tcGFyZSBmbG9hdHMuIiksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJVc2VyRXJyb3IiOiB7CiAgICAgICAgICAgICAgICAiaW1wb3J0IjogVXNlckVycm9yLAogICAgICAgICAgICAgICAgImhlbHAiOiBfKCJVc2VyRXJyb3IuIEhlbHBlciB0byByYWlzZSBVc2VyRXJyb3IuIiksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJoYXNobGliIjogewogICAgICAgICAgICAgICAgImltcG9ydCI6IGhhc2hsaWIsCiAgICAgICAgICAgICAgICAiaGVscCI6IF8oCiAgICAgICAgICAgICAgICAgICAgIlB5dGhvbiAnaGFzaGxpYicgbGlicmFyeS4gIgogICAgICAgICAgICAgICAgICAgICI8YSBocmVmPSdodHRwczovL2RvY3MucHl0aG9uLm9yZy8zL2xpYnJhcnkvaGFzaGxpYi5odG1sJyIKICAgICAgICAgICAgICAgICAgICAiIHRhcmdldD0nX2JsYW5rJz5Eb2N1bWVudGF0aW9uPC9hPi4gIgogICAgICAgICAgICAgICAgICAgICJBdmFpbGFibGUgbWV0aG9kczogJ3NoYTEnLCAnc2hhMjI0JywgIgogICAgICAgICAgICAgICAgICAgICInc2hhMjU2JywgJ3NoYTM4NCcsIgogICAgICAgICAgICAgICAgICAgICIgJ3NoYTUxMicsICdzaGEzXzIyNCcsICdzaGEzXzI1NicsICdzaGEzXzM4NCcsICdzaGEzXzUxMicsICIKICAgICAgICAgICAgICAgICAgICAiJ3NoYWtlXzEyOCcsICdzaGFrZV8yNTYnLCIKICAgICAgICAgICAgICAgICAgICAiICdibGFrZTJiJywgJ2JsYWtlMnMnLCAnbWQ1JywgJ25ldyciCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICB9LAogICAgICAgICAgICAiaG1hYyI6IHsKICAgICAgICAgICAgICAgICJpbXBvcnQiOiBobWFjLAogICAgICAgICAgICAgICAgImhlbHAiOiBfKAogICAgICAgICAgICAgICAgICAgICJQeXRob24gJ2htYWMnIGxpYnJhcnkuICIKICAgICAgICAgICAgICAgICAgICAiPGEgaHJlZj0naHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMy9saWJyYXJ5L2htYWMuaHRtbCciCiAgICAgICAgICAgICAgICAgICAgIiB0YXJnZXQ9J19ibGFuayc+RG9jdW1lbnRhdGlvbjwvYT4uICIKICAgICAgICAgICAgICAgICAgICAiVXNlICduZXcnIHRvIGNyZWF0ZSBITUFDIG9iamVjdHMuICIKICAgICAgICAgICAgICAgICAgICAiQXZhaWxhYmxlIG1ldGhvZHMgb24gdGhlIEhNQUMgKm9iamVjdCo6ICd1cGRhdGUnLCAnY29weScsIgogICAgICAgICAgICAgICAgICAgICIgJ2RpZ2VzdCcsICdoZXhkaWdlc3QnLiAiCiAgICAgICAgICAgICAgICAgICAgIiBNb2R1bGUtbGV2ZWwgZnVuY3Rpb246ICdjb21wYXJlX2RpZ2VzdCcuIgogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInRsZGV4dHJhY3QiOiB7CiAgICAgICAgICAgICAgICAiaW1wb3J0IjogdGxkZXh0cmFjdCwKICAgICAgICAgICAgICAgICJoZWxwIjogXygKICAgICAgICAgICAgICAgICAgICAiUHl0aG9uICd0bGRleHRyYWN0JyBsaWJyYXJ5LiBVc2UgIgogICAgICAgICAgICAgICAgICAgICI8Y29kZT50bGRleHRyYWN0LmV4dHJhY3QoKTwvY29kZT4gdG8gcGFyc2UgZG9tYWlucy4gIgogICAgICAgICAgICAgICAgICAgICJDaGVjayA8YSBocmVmPSdodHRwczovL2dpdGh1Yi5jb20vam9obi1rdXJrb3dza2kvdGxkZXh0cmFjdCciCiAgICAgICAgICAgICAgICAgICAgIiB0YXJnZXQ9J19ibGFuayc+dGxkZXh0cmFjdDwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uIgogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImRucyI6IHsKICAgICAgICAgICAgICAgICJpbXBvcnQiOiBkbnMsCiAgICAgICAgICAgICAgICAiaGVscCI6IF8oCiAgICAgICAgICAgICAgICAgICAgIlB5dGhvbiAnZG5zcHl0aG9uJyBsaWJyYXJ5LiAiCiAgICAgICAgICAgICAgICAgICAgIjxhIGhyZWY9J2h0dHBzOi8vZG5zcHl0aG9uLnJlYWR0aGVkb2NzLmlvJyIKICAgICAgICAgICAgICAgICAgICAiIHRhcmdldD0nX2JsYW5rJz5Eb2N1bWVudGF0aW9uPC9hPi4iCiAgICAgICAgICAgICAgICAgICAgIjx1bD48bGk+PGNvZGU+ZG5zLnJlc29sdmVyPC9jb2RlPjogIgogICAgICAgICAgICAgICAgICAgICJ3cmFwcGVkIGRuc3B5dGhvbi4gVXNlICIKICAgICAgICAgICAgICAgICAgICAnPGNvZGU+ZG5zLnJlc29sdmVyLnJlc29sdmUoaG9zdG5hbWUsICJBIik8L2NvZGU+IGZvciAnCiAgICAgICAgICAgICAgICAgICAgIkROUyBsb29rdXBzLjwvbGk+IgogICAgICAgICAgICAgICAgICAgICI8bGk+PGNvZGU+ZG5zLnJldmVyc2VuYW1lPC9jb2RlPjogd3JhcHBlZCBkbnNweXRob24uICIKICAgICAgICAgICAgICAgICAgICAnVXNlIDxjb2RlPmRucy5yZXZlcnNlbmFtZS5mcm9tX2FkZHJlc3MoIjguOC44LjgiKTwvY29kZT4nCiAgICAgICAgICAgICAgICAgICAgIiB0byBidWlsZCBhbmQgcmV2ZXJzZSBQVFIgcmVjb3Jkcy48L2xpPiIKICAgICAgICAgICAgICAgICAgICAiPGxpPjxjb2RlPmRucy5leGNlcHRpb248L2NvZGU+OiB3cmFwcGVkIGRuc3B5dGhvbi4gIgogICAgICAgICAgICAgICAgICAgICJDYXRjaCAiCiAgICAgICAgICAgICAgICAgICAgIjxjb2RlPmRucy5leGNlcHRpb24uRE5TRXhjZXB0aW9uPC9jb2RlPiB0byBoYW5kbGUgIgogICAgICAgICAgICAgICAgICAgICJETlMtcmVsYXRlZCBlcnJvcnMuPC9saT4iCiAgICAgICAgICAgICAgICAgICAgIjwvdWw+IgogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgfSwKICAgICAgICB9CiAgICAgICAgY3VzdG9tX3B5dGhvbl9saWJyYXJpZXMgPSBzZWxmLl9jdXN0b21fcHl0aG9uX2xpYnJhcmllcygpCiAgICAgICAgZm9yIGxpYnJhcmllcyBpbiBjdXN0b21fcHl0aG9uX2xpYnJhcmllcy52YWx1ZXMoKToKICAgICAgICAgICAgcHl0aG9uX2xpYnJhcmllcy51cGRhdGUobGlicmFyaWVzKQogICAgICAgIHJldHVybiBweXRob25fbGlicmFyaWVzCgogICAgZGVmIF9nZXRfcHl0aG9uX2NvbW1hbmRfb2Rvb19vYmplY3RzKAogICAgICAgIHNlbGYsIHNlcnZlcj1Ob25lLCBqZXRfdGVtcGxhdGU9Tm9uZSwgamV0PU5vbmUsIHdheXBvaW50PU5vbmUKICAgICk6CiAgICAgICAgIiIiCiAgICAgICAgVGhpcyBtZXRob2QgaXMgdXNlZCB0byBpbXBvcnQgT2RvbyBvYmplY3RzLgogICAgICAgIEJlY2F1c2UgT2RvbyBvYmplY3RzIGNhbiBiZSByZWNvcmRzLCB0aGlzIG1ldGhvZCBpcyBub3QgY2FjaGVkLgogICAgICAgIFVzZSB0aGlzIG1ldGhvZCB0byBpbXBvcnQgT2RvbyBvYmplY3RzIHRoYXQgYXJlIG5vdCBjYWNoZWQuCiAgICAgICAgSWYgeW91IG5lZWQgdG8gaW1wb3J0IHNvbWUgc3RhdGljIG9iamVjdHMsIHVzZSB0aGUKICAgICAgICBgX2dldF9weXRob25fY29tbWFuZF9saWJyYXJpZXNgIG1ldGhvZCBpbnN0ZWFkLgoKICAgICAgICBBcmdzOgogICAgICAgICAgICBzZXJ2ZXI6IFNlcnZlciB0byBnZXQgdGhlIE9kb28gb2JqZWN0cyBmb3IuCiAgICAgICAgICAgIGpldF90ZW1wbGF0ZTogSmV0IHRlbXBsYXRlIHRvIGdldCB0aGUgT2RvbyBvYmplY3RzIGZvci4KICAgICAgICAgICAgamV0OiBKZXQgdG8gZ2V0IHRoZSBPZG9vIG9iamVjdHMgZm9yLgogICAgICAgICAgICB3YXlwb2ludDogV2F5cG9pbnQgdG8gZ2V0IHRoZSBPZG9vIG9iamVjdHMgZm9yLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBkaWN0OiBBdmFpbGFibGUgT2RvbyBvYmplY3RzOgogICAgICAgICAgICAgICAgeyI8b2JqZWN0X25hbWU+IjogewogICAgICAgICAgICAgICAgICAgICJpbXBvcnQiOiA8b2JqZWN0X2ltcG9ydD4sCiAgICAgICAgICAgICAgICAgICAgImhlbHAiOiA8b2JqZWN0X2hlbHBfaHRtbD4KICAgICAgICAgICAgICAgIH19CiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgInVpZCI6IHsiaW1wb3J0Ijogc2VsZi5fdWlkLCAiaGVscCI6IF8oIkN1cnJlbnQgT2RvbyB1c2VyIElEIil9LAogICAgICAgICAgICAidXNlciI6IHsiaW1wb3J0Ijogc2VsZi5lbnYudXNlciwgImhlbHAiOiBfKCJDdXJyZW50IE9kb28gdXNlciIpfSwKICAgICAgICAgICAgImVudiI6IHsiaW1wb3J0Ijogc2VsZi5lbnYsICJoZWxwIjogXygiT2RvbyBFbnZpcm9ubWVudCIpfSwKICAgICAgICAgICAgInNlcnZlciI6IHsKICAgICAgICAgICAgICAgICJpbXBvcnQiOiBzZXJ2ZXIsCiAgICAgICAgICAgICAgICAiaGVscCI6IF8oIkN1cnJlbnQgQ2V0bWl4IFRvd2VyIHNlcnZlciB0aGlzIGNvbW1hbmQgaXMgcnVubmluZyBvbiIpLAogICAgICAgICAgICB9LAogICAgICAgICAgICAiamV0X3RlbXBsYXRlIjogewogICAgICAgICAgICAgICAgImltcG9ydCI6IGpldF90ZW1wbGF0ZSwKICAgICAgICAgICAgICAgICJoZWxwIjogXygKICAgICAgICAgICAgICAgICAgICAiQ3VycmVudCBDZXRtaXggVG93ZXIgamV0IHRlbXBsYXRlIHRoaXMgY29tbWFuZCBpcyBydW5uaW5nIG9uIgogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImpldCI6IHsKICAgICAgICAgICAgICAgICJpbXBvcnQiOiBqZXQsCiAgICAgICAgICAgICAgICAiaGVscCI6IF8oIkN1cnJlbnQgQ2V0bWl4IFRvd2VyIGpldCB0aGlzIGNvbW1hbmQgaXMgcnVubmluZyBvbiIpLAogICAgICAgICAgICB9LAogICAgICAgICAgICAid2F5cG9pbnQiOiB7CiAgICAgICAgICAgICAgICAiaW1wb3J0Ijogd2F5cG9pbnQsCiAgICAgICAgICAgICAgICAiaGVscCI6IF8oCiAgICAgICAgICAgICAgICAgICAgIkN1cnJlbnQgQ2V0bWl4IFRvd2VyIEpldCB3YXlwb2ludCB0aGlzIGNvbW1hbmQgaXMgcnVubmluZyBvbiIKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ0b3dlciI6IHsKICAgICAgICAgICAgICAgICJpbXBvcnQiOiBzZWxmLmVudlsiY2V0bWl4LnRvd2VyIl0sCiAgICAgICAgICAgICAgICAiaGVscCI6IF8oCiAgICAgICAgICAgICAgICAgICAgIkNldG1peCBUb3dlciAiCiAgICAgICAgICAgICAgICAgICAgIjxhIGhyZWY9J2h0dHBzOi8vY2V0bWl4LmNvbS90b3dlci9kb2N1bWVudGF0aW9uL29kb29fYXV0b21hdGlvbiciCiAgICAgICAgICAgICAgICAgICAgIiB0YXJnZXQ9J19ibGFuayc+aGVscGVyIGNsYXNzPC9hPiBzaG9ydGN1dCIKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ0b3dlcl9zZXJ2ZXJzIjogewogICAgICAgICAgICAgICAgImltcG9ydCI6IHNlbGYuZW52WyJjeC50b3dlci5zZXJ2ZXIiXSwKICAgICAgICAgICAgICAgICJoZWxwIjogXygiQSBoZWxwZXIgc2hvcnRjdXQgdG8gPGNvZGU+ZW52WydjeC50b3dlci5zZXJ2ZXInXTwvY29kZT4iKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInRvd2VyX2pldHMiOiB7CiAgICAgICAgICAgICAgICAiaW1wb3J0Ijogc2VsZi5lbnZbImN4LnRvd2VyLmpldCJdLAogICAgICAgICAgICAgICAgImhlbHAiOiBfKCJBIGhlbHBlciBzaG9ydGN1dCB0byA8Y29kZT5lbnZbJ2N4LnRvd2VyLmpldCddPC9jb2RlPiIpLAogICAgICAgICAgICB9LAogICAgICAgICAgICAidG93ZXJfY29tbWFuZHMiOiB7CiAgICAgICAgICAgICAgICAiaW1wb3J0Ijogc2VsZi5lbnZbImN4LnRvd2VyLmNvbW1hbmQiXSwKICAgICAgICAgICAgICAgICJoZWxwIjogXygiQSBoZWxwZXIgc2hvcnRjdXQgdG8gPGNvZGU+ZW52WydjeC50b3dlci5jb21tYW5kJ108L2NvZGU+IiksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ0b3dlcl9wbGFucyI6IHsKICAgICAgICAgICAgICAgICJpbXBvcnQiOiBzZWxmLmVudlsiY3gudG93ZXIucGxhbiJdLAogICAgICAgICAgICAgICAgImhlbHAiOiBfKCJBIGhlbHBlciBzaG9ydGN1dCB0byA8Y29kZT5lbnZbJ2N4LnRvd2VyLnBsYW4nXTwvY29kZT4iKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInRvd2VyX3dheXBvaW50cyI6IHsKICAgICAgICAgICAgICAgICJpbXBvcnQiOiBzZWxmLmVudlsiY3gudG93ZXIuamV0LndheXBvaW50Il0sCiAgICAgICAgICAgICAgICAiaGVscCI6IF8oCiAgICAgICAgICAgICAgICAgICAgIkEgaGVscGVyIHNob3J0Y3V0IHRvIDxjb2RlPmVudlsnY3gudG93ZXIuamV0LndheXBvaW50J108L2NvZGU+IgogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgfSwKICAgICAgICB9CgogICAgZGVmIF9jdXN0b21fcHl0aG9uX2xpYnJhcmllcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgaW4gY3VzdG9tIG1vZHVsZXMKICAgICAgICBleHRlbmRpbmcgQ2V0bWl4IFRvd2VyIHRvIGFkZCAgY3VzdG9tIHB5dGhvbiBsaWJyYXJpZXMKICAgICAgICB0byB0aGUgZXZhbHVhdGlvbiBjb250ZXh0LgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBEaWN0OiBDdXN0b20gcHl0aG9uIGxpYnJhcmllcy4KCiAgICAgICAgVGhlIGZvbGxvd2luZyBmb3JtYXQgaXMgdXNlZDoKICAgICAgICB7CiAgICAgICAgICAgIDxtb2R1bGVfbmFtZT46IHsiPGxpYnJhcnlfbmFtZT4iOiB7CiAgICAgICAgICAgICAgICAiaW1wb3J0IjogPGxpYnJhcnlfaW1wb3J0PiwKICAgICAgICAgICAgICAgICJoZWxwIjogPGxpYnJhcnlfaGVscF9odG1sPgogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBXaGVyZToKCiAgICAgICAgPG1vZHVsZV9uYW1lPiBPZG9vIG1vZHVsZSB0ZWNobmljYWwgbmFtZS4KICAgICAgICA8bGlicmFyeV9uYW1lPiBpcyB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSBob3cgaXQgd2lsbCBiZSB1c2VkIGluIHRoZSBjb2RlLgoKICAgICAgICAgICAgPGxpYnJhcnlfaW1wb3J0PjogVGhlIGxpYnJhcnkgb2JqZWN0IHRvIGV4cG9zZS4KICAgICAgICAgICAgPGxpYnJhcnlfaGVscF9odG1sPjogSGVscCB0ZXh0IChIVE1MKSBzaG93biBpbiB0aGUgIkhlbHAiIHRhYi4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4ge30KCiAgICBkZWYgX2dldF9weXRob25fY29tbWFuZF9ldmFsX2NvbnRleHQoc2VsZiwgc2VydmVyPU5vbmUsICoqa3dhcmdzKToKICAgICAgICAiIiIKICAgICAgICBHZXQgdGhlIGV2YWx1YXRpb24gY29udGV4dCBmb3IgdGhlIHB5dGhvbiBjb21tYW5kLgogICAgICAgIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZ2V0IHRoZSBldmFsdWF0aW9uIGNvbnRleHQgZm9yIHRoZSBweXRob24gY29tbWFuZC4KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgc2VydmVyOiBTZXJ2ZXIgdG8gZ2V0IHRoZSBldmFsdWF0aW9uIGNvbnRleHQgZm9yLgogICAgICAgICAgICAqKmt3YXJnczogQWRkaXRpb25hbCBrZXl3b3JkIGFyZ3VtZW50cy4KICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBkaWN0OiBFdmFsdWF0aW9uIGNvbnRleHQgZm9yIHRoZSBweXRob24gY29tbWFuZC4KICAgICAgICAiIiIKCiAgICAgICAgIyBHZXQgdGhlIGpldCB0ZW1wbGF0ZSwgamV0IGFuZCB3YXlwb2ludCBmcm9tIGt3YXJncwogICAgICAgIGpldF90ZW1wbGF0ZSA9IGt3YXJncy5nZXQoImpldF90ZW1wbGF0ZSIpCiAgICAgICAgamV0ID0ga3dhcmdzLmdldCgiamV0IikKICAgICAgICB3YXlwb2ludCA9IGt3YXJncy5nZXQoIndheXBvaW50IikKCiAgICAgICAgIyBHZXQgdGhlIE9kb28gb2JqZWN0cyBmaXJzdAogICAgICAgIGltcG9ydHMgPSBzZWxmLl9nZXRfcHl0aG9uX2NvbW1hbmRfb2Rvb19vYmplY3RzKAogICAgICAgICAgICBzZXJ2ZXI9c2VydmVyLAogICAgICAgICAgICBqZXRfdGVtcGxhdGU9amV0X3RlbXBsYXRlLAogICAgICAgICAgICBqZXQ9amV0LAogICAgICAgICAgICB3YXlwb2ludD13YXlwb2ludCwKICAgICAgICApCgogICAgICAgICMgVXBkYXRlIHdpdGggdGhlIGxpYnJhcmllcwogICAgICAgIGltcG9ydHMudXBkYXRlKHNlbGYuX2dldF9weXRob25fY29tbWFuZF9saWJyYXJpZXMoKSkKICAgICAgICBldmFsX2NvbnRleHQgPSB7a2V5OiB2YWx1ZVsiaW1wb3J0Il0gZm9yIGtleSwgdmFsdWUgaW4gaW1wb3J0cy5pdGVtcygpfQoKICAgICAgICBldmFsX2NvbnRleHRbImN1c3RvbV92YWx1ZXMiXSA9IGt3YXJncy5nZXQoInZhcmlhYmxlX3ZhbHVlcyIpIG9yIHt9CiAgICAgICAgcmV0dXJuIGV2YWxfY29udGV4dAoKICAgIGRlZiBfZ2V0X2Jhbm5lZF9weXRob25fY29kZV9rZXl3b3JkcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBHZXQgdGhlIGJhbm5lZCBweXRob24gY29kZSBrZXl3b3JkcyBmb3IgdGhlIHB5dGhvbiBjb21tYW5kLgogICAgICAgIEV4dGVuZCB0aGlzIG1ldGhvZCB0byBhZGQgYmFubmVkIGtleXdvcmRzIHRvIHRoZSBsaXN0LgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBsaXN0OiBCYW5uZWQgcHl0aG9uIGNvZGUga2V5d29yZHMuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIFsiX3NldF9zZWNyZXRfdmFsdWVzKCIsICJfZ2V0X3NlY3JldF92YWx1ZSgiLCAiX2dldF9zZWNyZXRfdmFsdWVzKCJdCg== \ No newline at end of file