diff --git a/addons/cetmix_tower_server/tests/test_jet_template_install_access.py b/addons/cetmix_tower_server/tests/test_jet_template_install_access.py new file mode 100644 index 0000000..459e25f --- /dev/null +++ b/addons/cetmix_tower_server/tests/test_jet_template_install_access.py @@ -0,0 +1 @@ +IyBDb3B5cmlnaHQgKEMpIDIwMjUgQ2V0bWl4IE/DnAojIExpY2Vuc2UgQUdQTC0zLjAgb3IgbGF0ZXIgKGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsKS4KCmZyb20gb2Rvby5leGNlcHRpb25zIGltcG9ydCBBY2Nlc3NFcnJvcgoKZnJvbSAuY29tbW9uX2pldHMgaW1wb3J0IFRlc3RUb3dlckpldHNDb21tb24KCgpjbGFzcyBUZXN0VG93ZXJKZXRUZW1wbGF0ZUluc3RhbGxBY2Nlc3MoVGVzdFRvd2VySmV0c0NvbW1vbik6CiAgICAiIiIKICAgIFRlc3QgYWNjZXNzIHJ1bGVzIGZvciBKZXQgVGVtcGxhdGUgSW5zdGFsbCBtb2RlbAogICAgIiIiCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgogICAgICAgIHN1cGVyKCkuc2V0VXBDbGFzcygpCgogICAgICAgICMgQ3JlYXRlIGFkZGl0aW9uYWwgc2VydmVyIGZvciB0ZXN0aW5nCiAgICAgICAgY2xzLnNlcnZlcl90ZXN0XzIgPSBjbHMuU2VydmVyLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBTZXJ2ZXIgMiIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogInRlc3Rfc2VydmVyXzIiLAogICAgICAgICAgICAgICAgImlwX3Y0X2FkZHJlc3MiOiAiMTkyLjE2OC4xLjEwMiIsCiAgICAgICAgICAgICAgICAic3NoX3VzZXJuYW1lIjogImFkbWluIiwKICAgICAgICAgICAgICAgICJzc2hfcGFzc3dvcmQiOiAicGFzc3dvcmQiLAogICAgICAgICAgICAgICAgInNzaF9hdXRoX21vZGUiOiAicCIsCiAgICAgICAgICAgICAgICAib3NfaWQiOiBjbHMub3NfZGViaWFuXzEwLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgIGRlZiBfY3JlYXRlX2luc3RhbGxfcmVjb3JkKAogICAgICAgIHNlbGYsCiAgICAgICAgdGVtcGxhdGU9Tm9uZSwKICAgICAgICBzZXJ2ZXI9Tm9uZSwKICAgICAgICB0ZW1wbGF0ZV9hY2Nlc3NfbGV2ZWw9IjIiLAogICAgICAgIHRlbXBsYXRlX3VzZXJfaWRzPU5vbmUsCiAgICAgICAgdGVtcGxhdGVfbWFuYWdlcl9pZHM9Tm9uZSwKICAgICAgICBzZXJ2ZXJfdXNlcl9pZHM9Tm9uZSwKICAgICAgICBzZXJ2ZXJfbWFuYWdlcl9pZHM9Tm9uZSwKICAgICk6CiAgICAgICAgIiIiSGVscGVyIG1ldGhvZCB0byBjcmVhdGUgYSBqZXQgdGVtcGxhdGUgaW5zdGFsbCByZWNvcmQiIiIKICAgICAgICBpZiBub3QgdGVtcGxhdGU6CiAgICAgICAgICAgIHRlbXBsYXRlID0gc2VsZi5KZXRUZW1wbGF0ZS5jcmVhdGUoCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBUZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJ0ZXN0X3RlbXBsYXRlIiwKICAgICAgICAgICAgICAgICAgICAiYWNjZXNzX2xldmVsIjogdGVtcGxhdGVfYWNjZXNzX2xldmVsLAogICAgICAgICAgICAgICAgICAgICJ1c2VyX2lkcyI6IHRlbXBsYXRlX3VzZXJfaWRzCiAgICAgICAgICAgICAgICAgICAgaWYgdGVtcGxhdGVfdXNlcl9pZHMgaXMgbm90IE5vbmUKICAgICAgICAgICAgICAgICAgICBlbHNlIFsoNSwgMCwgMCldLAogICAgICAgICAgICAgICAgICAgICJtYW5hZ2VyX2lkcyI6IHRlbXBsYXRlX21hbmFnZXJfaWRzCiAgICAgICAgICAgICAgICAgICAgaWYgdGVtcGxhdGVfbWFuYWdlcl9pZHMgaXMgbm90IE5vbmUKICAgICAgICAgICAgICAgICAgICBlbHNlIFsoNSwgMCwgMCldLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApCgogICAgICAgIGlmIG5vdCBzZXJ2ZXI6CiAgICAgICAgICAgIHNlcnZlciA9IHNlbGYuc2VydmVyX3Rlc3RfMQoKICAgICAgICAjIFVwZGF0ZSBzZXJ2ZXIgYWNjZXNzIGlmIG5lZWRlZAogICAgICAgIGlmIHNlcnZlcl91c2VyX2lkcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VydmVyLndyaXRlKHsidXNlcl9pZHMiOiBzZXJ2ZXJfdXNlcl9pZHN9KQogICAgICAgIGlmIHNlcnZlcl9tYW5hZ2VyX2lkcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VydmVyLndyaXRlKHsibWFuYWdlcl9pZHMiOiBzZXJ2ZXJfbWFuYWdlcl9pZHN9KQoKICAgICAgICAjIENyZWF0ZSBpbnN0YWxsIHJlY29yZAogICAgICAgIGluc3RhbGxfcmVjb3JkID0gc2VsZi5KZXRUZW1wbGF0ZUluc3RhbGwuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2lkIjogdGVtcGxhdGUuaWQsCiAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogc2VydmVyLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICByZXR1cm4gdGVtcGxhdGUsIHNlcnZlciwgaW5zdGFsbF9yZWNvcmQKCiAgICAjID09PT09PT09PT09PT09PT09PT09PT0KICAgICMgTWFuYWdlciBSZWFkIEFjY2VzcyBUZXN0cwogICAgIyA9PT09PT09PT09PT09PT09PT09PT09CgogICAgZGVmIHRlc3RfbWFuYWdlcl9yZWFkX3NlcnZlcl91c2VyX2lkc190ZW1wbGF0ZV9hY2Nlc3NfbGV2ZWxfbWFuYWdlcihzZWxmKToKICAgICAgICAiIiJUZXN0IE1hbmFnZXI6IFJlYWQgd2hlbiBpbiBzZXJ2ZXIgdXNlcl9pZHMgYW5kIHRlbXBsYXRlIGFjY2Vzc19sZXZlbCA8PSAyIiIiCiAgICAgICAgXywgXywgaW5zdGFsbF9yZWNvcmQgPSBzZWxmLl9jcmVhdGVfaW5zdGFsbF9yZWNvcmQoCiAgICAgICAgICAgIHRlbXBsYXRlX2FjY2Vzc19sZXZlbD0iMiIsCiAgICAgICAgICAgIHNlcnZlcl91c2VyX2lkcz1bKDQsIHNlbGYubWFuYWdlci5pZCldLAogICAgICAgICkKCiAgICAgICAgcmVjb3JkcyA9IHNlbGYuSmV0VGVtcGxhdGVJbnN0YWxsLndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLnNlYXJjaCgKICAgICAgICAgICAgWygiaWQiLCAiPSIsIGluc3RhbGxfcmVjb3JkLmlkKV0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbGVuKHJlY29yZHMpLAogICAgICAgICAgICAxLAogICAgICAgICAgICAiTWFuYWdlciBzaG91bGQgcmVhZCB3aGVuIGluIHNlcnZlciB1c2VyX2lkcyIKICAgICAgICAgICAgIiBhbmQgdGVtcGxhdGUgYWNjZXNzX2xldmVsIDw9IDIiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9tYW5hZ2VyX3JlYWRfc2VydmVyX21hbmFnZXJfaWRzX3RlbXBsYXRlX2FjY2Vzc19sZXZlbF9tYW5hZ2VyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgTWFuYWdlcjogUmVhZCB3aGVuIGluIHNlcnZlciBtYW5hZ2VyX2lkcwogICAgICAgIGFuZCB0ZW1wbGF0ZSBhY2Nlc3NfbGV2ZWwgPD0gMi4KICAgICAgICAiIiIKICAgICAgICBfLCBfLCBpbnN0YWxsX3JlY29yZCA9IHNlbGYuX2NyZWF0ZV9pbnN0YWxsX3JlY29yZCgKICAgICAgICAgICAgdGVtcGxhdGVfYWNjZXNzX2xldmVsPSIyIiwKICAgICAgICAgICAgc2VydmVyX21hbmFnZXJfaWRzPVsoNCwgc2VsZi5tYW5hZ2VyLmlkKV0sCiAgICAgICAgKQoKICAgICAgICByZWNvcmRzID0gc2VsZi5KZXRUZW1wbGF0ZUluc3RhbGwud2l0aF91c2VyKHNlbGYubWFuYWdlcikuc2VhcmNoKAogICAgICAgICAgICBbKCJpZCIsICI9IiwgaW5zdGFsbF9yZWNvcmQuaWQpXQogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBsZW4ocmVjb3JkcyksCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCByZWFkIHdoZW4gaW4gc2VydmVyIG1hbmFnZXJfaWRzIgogICAgICAgICAgICAiIGFuZCB0ZW1wbGF0ZSBhY2Nlc3NfbGV2ZWwgPD0gMiIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X21hbmFnZXJfcmVhZF90ZW1wbGF0ZV91c2VyX2lkc19vdmVycmlkZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IE1hbmFnZXI6IFJlYWQgd2hlbiBpbiB0ZW1wbGF0ZSB1c2VyX2lkcyBvdmVycmlkZXMgYWNjZXNzX2xldmVsCiAgICAgICAgKHNlcnZlciB1c2VyX2lkcyBvciBtYW5hZ2VyX2lkcykuCiAgICAgICAgIiIiCiAgICAgICAgIyBUZXN0IHdpdGggc2VydmVyIHVzZXJfaWRzCiAgICAgICAgXywgXywgaW5zdGFsbF9yZWNvcmQxID0gc2VsZi5fY3JlYXRlX2luc3RhbGxfcmVjb3JkKAogICAgICAgICAgICB0ZW1wbGF0ZV9hY2Nlc3NfbGV2ZWw9IjMiLCAgIyBSb290IGxldmVsIC0gbm9ybWFsbHkgbm90IGFjY2Vzc2libGUKICAgICAgICAgICAgdGVtcGxhdGVfdXNlcl9pZHM9Wyg0LCBzZWxmLm1hbmFnZXIuaWQpXSwKICAgICAgICAgICAgc2VydmVyX3VzZXJfaWRzPVsoNCwgc2VsZi5tYW5hZ2VyLmlkKV0sCiAgICAgICAgKQoKICAgICAgICByZWNvcmRzID0gc2VsZi5KZXRUZW1wbGF0ZUluc3RhbGwud2l0aF91c2VyKHNlbGYubWFuYWdlcikuc2VhcmNoKAogICAgICAgICAgICBbKCJpZCIsICI9IiwgaW5zdGFsbF9yZWNvcmQxLmlkKV0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbGVuKHJlY29yZHMpLAogICAgICAgICAgICAxLAogICAgICAgICAgICAiTWFuYWdlciBzaG91bGQgcmVhZCB3aGVuIGluIHRlbXBsYXRlIHVzZXJfaWRzIiAiIGFuZCBzZXJ2ZXIgdXNlcl9pZHMiLAogICAgICAgICkKCiAgICAgICAgIyBUZXN0IHdpdGggc2VydmVyIG1hbmFnZXJfaWRzCiAgICAgICAgXywgXywgaW5zdGFsbF9yZWNvcmQyID0gc2VsZi5fY3JlYXRlX2luc3RhbGxfcmVjb3JkKAogICAgICAgICAgICB0ZW1wbGF0ZV9hY2Nlc3NfbGV2ZWw9IjMiLCAgIyBSb290IGxldmVsIC0gbm9ybWFsbHkgbm90IGFjY2Vzc2libGUKICAgICAgICAgICAgdGVtcGxhdGVfdXNlcl9pZHM9Wyg0LCBzZWxmLm1hbmFnZXIuaWQpXSwKICAgICAgICAgICAgc2VydmVyX21hbmFnZXJfaWRzPVsoNCwgc2VsZi5tYW5hZ2VyLmlkKV0sCiAgICAgICAgKQoKICAgICAgICByZWNvcmRzID0gc2VsZi5KZXRUZW1wbGF0ZUluc3RhbGwud2l0aF91c2VyKHNlbGYubWFuYWdlcikuc2VhcmNoKAogICAgICAgICAgICBbKCJpZCIsICI9IiwgaW5zdGFsbF9yZWNvcmQyLmlkKV0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbGVuKHJlY29yZHMpLAogICAgICAgICAgICAxLAogICAgICAgICAgICAiTWFuYWdlciBzaG91bGQgcmVhZCB3aGVuIGluIHRlbXBsYXRlIHVzZXJfaWRzIiAiIGFuZCBzZXJ2ZXIgbWFuYWdlcl9pZHMiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9tYW5hZ2VyX3JlYWRfbm9fYWNjZXNzX25vX3NlcnZlcl9hY2Nlc3Moc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCBNYW5hZ2VyOiBObyByZWFkIGFjY2VzcyB3aGVuIG5vdCBpbgogICAgICAgIHNlcnZlciB1c2VyX2lkcyBvciBtYW5hZ2VyX2lkcy4KICAgICAgICAiIiIKICAgICAgICBfLCBfLCBpbnN0YWxsX3JlY29yZCA9IHNlbGYuX2NyZWF0ZV9pbnN0YWxsX3JlY29yZCgKICAgICAgICAgICAgdGVtcGxhdGVfYWNjZXNzX2xldmVsPSIxIiwKICAgICAgICAgICAgc2VydmVyX3VzZXJfaWRzPVsoNSwgMCwgMCldLAogICAgICAgICAgICBzZXJ2ZXJfbWFuYWdlcl9pZHM9Wyg1LCAwLCAwKV0sCiAgICAgICAgKQoKICAgICAgICByZWNvcmRzID0gc2VsZi5KZXRUZW1wbGF0ZUluc3RhbGwud2l0aF91c2VyKHNlbGYubWFuYWdlcikuc2VhcmNoKAogICAgICAgICAgICBbKCJpZCIsICI9IiwgaW5zdGFsbF9yZWNvcmQuaWQpXQogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBsZW4ocmVjb3JkcyksCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCBub3QgcmVhZCB3aGVuIG5vdCBpbiBzZXJ2ZXIgdXNlcl9pZHMgb3IgbWFuYWdlcl9pZHMiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9tYW5hZ2VyX3JlYWRfbm9fYWNjZXNzX3RlbXBsYXRlX3Jvb3RfbGV2ZWwoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCBNYW5hZ2VyOiBObyByZWFkIGFjY2VzcyB3aGVuIHRlbXBsYXRlIGFjY2Vzc19sZXZlbAogICAgICAgIGlzIFJvb3QgYW5kIG5vdCBpbiB0ZW1wbGF0ZSB1c2VyX2lkcy4KICAgICAgICAiIiIKICAgICAgICBfLCBfLCBpbnN0YWxsX3JlY29yZCA9IHNlbGYuX2NyZWF0ZV9pbnN0YWxsX3JlY29yZCgKICAgICAgICAgICAgdGVtcGxhdGVfYWNjZXNzX2xldmVsPSIzIiwgICMgUm9vdCBsZXZlbAogICAgICAgICAgICB0ZW1wbGF0ZV91c2VyX2lkcz1bKDUsIDAsIDApXSwKICAgICAgICAgICAgc2VydmVyX3VzZXJfaWRzPVsoNCwgc2VsZi5tYW5hZ2VyLmlkKV0sCiAgICAgICAgKQoKICAgICAgICByZWNvcmRzID0gc2VsZi5KZXRUZW1wbGF0ZUluc3RhbGwud2l0aF91c2VyKHNlbGYubWFuYWdlcikuc2VhcmNoKAogICAgICAgICAgICBbKCJpZCIsICI9IiwgaW5zdGFsbF9yZWNvcmQuaWQpXQogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBsZW4ocmVjb3JkcyksCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCBub3QgcmVhZCB3aGVuIHRlbXBsYXRlIGFjY2Vzc19sZXZlbCIKICAgICAgICAgICAgIiBpcyBSb290IGFuZCBub3QgaW4gdGVtcGxhdGUgdXNlcl9pZHMiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9tYW5hZ2VyX3JlYWRfbm9fYWNjZXNzX3RlbXBsYXRlX21hbmFnZXJfbGV2ZWxfbm9fc2VydmVyX2FjY2VzcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IE1hbmFnZXI6IE5vIHJlYWQgYWNjZXNzIHdoZW4gdGVtcGxhdGUgYWNjZXNzX2xldmVsCiAgICAgICAgaXMgTWFuYWdlciBidXQgbm90IGluIHNlcnZlci4KICAgICAgICAiIiIKICAgICAgICBfLCBfLCBpbnN0YWxsX3JlY29yZCA9IHNlbGYuX2NyZWF0ZV9pbnN0YWxsX3JlY29yZCgKICAgICAgICAgICAgdGVtcGxhdGVfYWNjZXNzX2xldmVsPSIyIiwKICAgICAgICAgICAgc2VydmVyX3VzZXJfaWRzPVsoNSwgMCwgMCldLAogICAgICAgICAgICBzZXJ2ZXJfbWFuYWdlcl9pZHM9Wyg1LCAwLCAwKV0sCiAgICAgICAgKQoKICAgICAgICByZWNvcmRzID0gc2VsZi5KZXRUZW1wbGF0ZUluc3RhbGwud2l0aF91c2VyKHNlbGYubWFuYWdlcikuc2VhcmNoKAogICAgICAgICAgICBbKCJpZCIsICI9IiwgaW5zdGFsbF9yZWNvcmQuaWQpXQogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBsZW4ocmVjb3JkcyksCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCBub3QgcmVhZCB3aGVuIG5vdCBpbiBzZXJ2ZXIiCiAgICAgICAgICAgICIgZXZlbiBpZiB0ZW1wbGF0ZSBhY2Nlc3NfbGV2ZWwgaXMgTWFuYWdlciIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X21hbmFnZXJfd3JpdGVfZm9yYmlkZGVuKHNlbGYpOgogICAgICAgICIiIlRlc3QgTWFuYWdlcjogQ2Fubm90IHdyaXRlL2NyZWF0ZS9kZWxldGUgcmVjb3JkcyIiIgogICAgICAgIF8sIF8sIGluc3RhbGxfcmVjb3JkID0gc2VsZi5fY3JlYXRlX2luc3RhbGxfcmVjb3JkKAogICAgICAgICAgICB0ZW1wbGF0ZV9hY2Nlc3NfbGV2ZWw9IjIiLAogICAgICAgICAgICBzZXJ2ZXJfdXNlcl9pZHM9Wyg0LCBzZWxmLm1hbmFnZXIuaWQpXSwKICAgICAgICApCgogICAgICAgICMgTWFuYWdlciBzaG91bGQgbm90IGJlIGFibGUgdG8gd3JpdGUKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEFjY2Vzc0Vycm9yKToKICAgICAgICAgICAgaW5zdGFsbF9yZWNvcmQud2l0aF91c2VyKHNlbGYubWFuYWdlcikud3JpdGUoeyJzdGF0ZSI6ICJkb25lIn0pCgogICAgICAgICMgTWFuYWdlciBzaG91bGQgbm90IGJlIGFibGUgdG8gY3JlYXRlCiAgICAgICAgdGVtcGxhdGUgPSBzZWxmLkpldFRlbXBsYXRlLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiTmV3IFRlbXBsYXRlIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAibmV3X3RlbXBsYXRlIiwKICAgICAgICAgICAgICAgICJhY2Nlc3NfbGV2ZWwiOiAiMiIsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgc2VydmVyID0gc2VsZi5zZXJ2ZXJfdGVzdF8xCiAgICAgICAgc2VydmVyLndyaXRlKHsidXNlcl9pZHMiOiBbKDQsIHNlbGYubWFuYWdlci5pZCldfSkKCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBY2Nlc3NFcnJvcik6CiAgICAgICAgICAgIHNlbGYuSmV0VGVtcGxhdGVJbnN0YWxsLndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLmNyZWF0ZSgKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2lkIjogdGVtcGxhdGUuaWQsCiAgICAgICAgICAgICAgICAgICAgInNlcnZlcl9pZCI6IHNlcnZlci5pZCwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKQoKICAgICAgICAjIE1hbmFnZXIgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIGRlbGV0ZQogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQWNjZXNzRXJyb3IpOgogICAgICAgICAgICBpbnN0YWxsX3JlY29yZC53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS51bmxpbmsoKQoKICAgICMgPT09PT09PT09PT09PT09PT09PT09PQogICAgIyBSb290IEFjY2VzcyBUZXN0cwogICAgIyA9PT09PT09PT09PT09PT09PT09PT09CgogICAgZGVmIHRlc3Rfcm9vdF93cml0ZV9hY2Nlc3Moc2VsZik6CiAgICAgICAgIiIiVGVzdCBSb290OiBDYW4gd3JpdGUgYW55IHJlY29yZCIiIgogICAgICAgIF8sIF8sIGluc3RhbGxfcmVjb3JkID0gc2VsZi5fY3JlYXRlX2luc3RhbGxfcmVjb3JkKCkKCiAgICAgICAgIyBSb290IHNob3VsZCBiZSBhYmxlIHRvIHdyaXRlCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpbnN0YWxsX3JlY29yZC53aXRoX3VzZXIoc2VsZi5yb290KS53cml0ZSh7InN0YXRlIjogImRvbmUifSkKICAgICAgICAgICAgaW5zdGFsbF9yZWNvcmQuaW52YWxpZGF0ZV9yZWNvcmRzZXQoKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICAgICAgaW5zdGFsbF9yZWNvcmQuc3RhdGUsICJkb25lIiwgIlJvb3Qgc2hvdWxkIGJlIGFibGUgdG8gdXBkYXRlIgogICAgICAgICAgICApCiAgICAgICAgZXhjZXB0IEFjY2Vzc0Vycm9yOgogICAgICAgICAgICBzZWxmLmZhaWwoIlJvb3Qgc2hvdWxkIGJlIGFibGUgdG8gdXBkYXRlIGFueSByZWNvcmQiKQoKICAgIGRlZiB0ZXN0X3Jvb3RfY3JlYXRlX2FjY2VzcyhzZWxmKToKICAgICAgICAiIiJUZXN0IFJvb3Q6IENhbiBjcmVhdGUgYW55IHJlY29yZCIiIgogICAgICAgIHRlbXBsYXRlID0gc2VsZi5KZXRUZW1wbGF0ZS53aXRoX3VzZXIoc2VsZi5yb290KS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlJvb3QgVGVtcGxhdGUiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJyb290X3RlbXBsYXRlIiwKICAgICAgICAgICAgICAgICJhY2Nlc3NfbGV2ZWwiOiAiMyIsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgc2VydmVyID0gc2VsZi5zZXJ2ZXJfdGVzdF8xCgogICAgICAgICMgUm9vdCBzaG91bGQgYmUgYWJsZSB0byBjcmVhdGUKICAgICAgICB0cnk6CiAgICAgICAgICAgIGluc3RhbGxfcmVjb3JkID0gc2VsZi5KZXRUZW1wbGF0ZUluc3RhbGwud2l0aF91c2VyKHNlbGYucm9vdCkuY3JlYXRlKAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJqZXRfdGVtcGxhdGVfaWQiOiB0ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogc2VydmVyLmlkLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApCiAgICAgICAgICAgIHJlY29yZHMgPSBzZWxmLkpldFRlbXBsYXRlSW5zdGFsbC53aXRoX3VzZXIoc2VsZi5yb290KS5zZWFyY2goCiAgICAgICAgICAgICAgICBbKCJpZCIsICI9IiwgaW5zdGFsbF9yZWNvcmQuaWQpXQogICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlY29yZHMpLCAxLCAiUm9vdCBzaG91bGQgYmUgYWJsZSB0byBjcmVhdGUiKQogICAgICAgIGV4Y2VwdCBBY2Nlc3NFcnJvcjoKICAgICAgICAgICAgc2VsZi5mYWlsKCJSb290IHNob3VsZCBiZSBhYmxlIHRvIGNyZWF0ZSBhbnkgcmVjb3JkIikKCiAgICBkZWYgdGVzdF9yb290X2RlbGV0ZV9hY2Nlc3Moc2VsZik6CiAgICAgICAgIiIiVGVzdCBSb290OiBDYW4gZGVsZXRlIGFueSByZWNvcmQiIiIKICAgICAgICBfLCBfLCBpbnN0YWxsX3JlY29yZCA9IHNlbGYuX2NyZWF0ZV9pbnN0YWxsX3JlY29yZCgpCgogICAgICAgICMgUm9vdCBzaG91bGQgYmUgYWJsZSB0byBkZWxldGUKICAgICAgICB0cnk6CiAgICAgICAgICAgIGluc3RhbGxfcmVjb3JkLndpdGhfdXNlcihzZWxmLnJvb3QpLnVubGluaygpCiAgICAgICAgICAgIHJlY29yZHMgPSBzZWxmLkpldFRlbXBsYXRlSW5zdGFsbC53aXRoX3VzZXIoc2VsZi5yb290KS5zZWFyY2goCiAgICAgICAgICAgICAgICBbKCJpZCIsICI9IiwgaW5zdGFsbF9yZWNvcmQuaWQpXQogICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlY29yZHMpLCAwLCAiUm9vdCBzaG91bGQgYmUgYWJsZSB0byBkZWxldGUiKQogICAgICAgIGV4Y2VwdCBBY2Nlc3NFcnJvcjoKICAgICAgICAgICAgc2VsZi5mYWlsKCJSb290IHNob3VsZCBiZSBhYmxlIHRvIGRlbGV0ZSBhbnkgcmVjb3JkIikKCiAgICBkZWYgdGVzdF9yb290X2FjY2Vzc19hbGxfc2NlbmFyaW9zKHNlbGYpOgogICAgICAgICIiIlRlc3QgUm9vdCBjYW4gYWNjZXNzIHJlY29yZHMgaW4gYWxsIHNjZW5hcmlvcyIiIgogICAgICAgICMgVGVzdCB2YXJpb3VzIGNvbWJpbmF0aW9ucwogICAgICAgIHNjZW5hcmlvcyA9IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInRlbXBsYXRlX2FjY2Vzc19sZXZlbCI6ICIxIiwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfdXNlcl9pZHMiOiBbKDUsIDAsIDApXSwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfbWFuYWdlcl9pZHMiOiBbKDUsIDAsIDApXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInRlbXBsYXRlX2FjY2Vzc19sZXZlbCI6ICIyIiwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfdXNlcl9pZHMiOiBbKDUsIDAsIDApXSwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfbWFuYWdlcl9pZHMiOiBbKDUsIDAsIDApXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInRlbXBsYXRlX2FjY2Vzc19sZXZlbCI6ICIzIiwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfdXNlcl9pZHMiOiBbKDUsIDAsIDApXSwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfbWFuYWdlcl9pZHMiOiBbKDUsIDAsIDApXSwKICAgICAgICAgICAgfSwKICAgICAgICBdCgogICAgICAgIGZvciBzY2VuYXJpbyBpbiBzY2VuYXJpb3M6CiAgICAgICAgICAgIF8sIF8sIGluc3RhbGxfcmVjb3JkID0gc2VsZi5fY3JlYXRlX2luc3RhbGxfcmVjb3JkKCoqc2NlbmFyaW8pCiAgICAgICAgICAgIHJlY29yZHMgPSBzZWxmLkpldFRlbXBsYXRlSW5zdGFsbC53aXRoX3VzZXIoc2VsZi5yb290KS5zZWFyY2goCiAgICAgICAgICAgICAgICBbKCJpZCIsICI9IiwgaW5zdGFsbF9yZWNvcmQuaWQpXQogICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgICAgICBsZW4ocmVjb3JkcyksCiAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgZiJSb290IHNob3VsZCBiZSBhYmxlIHRvIHJlYWQgcmVjb3JkIHdpdGggc2NlbmFyaW86IHtzY2VuYXJpb30iLAogICAgICAgICAgICApCgogICAgIyA9PT09PT09PT09PT09PT09PT09PT09CiAgICAjIEVkZ2UgQ2FzZXMKICAgICMgPT09PT09PT09PT09PT09PT09PT09PQoKICAgIGRlZiB0ZXN0X21hbmFnZXJfcmVhZF9tdWx0aXBsZV9zZXJ2ZXJzKHNlbGYpOgogICAgICAgICIiIlRlc3QgTWFuYWdlciBhY2Nlc3MgYWNyb3NzIG11bHRpcGxlIHNlcnZlcnMiIiIKICAgICAgICAjIE1hbmFnZXIgaW4gc2VydmVyIDEsIHRlbXBsYXRlIGFjY2Vzc2libGUKICAgICAgICB0ZW1wbGF0ZTEsIF8sIGluc3RhbGwxID0gc2VsZi5fY3JlYXRlX2luc3RhbGxfcmVjb3JkKAogICAgICAgICAgICB0ZW1wbGF0ZV9hY2Nlc3NfbGV2ZWw9IjIiLAogICAgICAgICAgICBzZXJ2ZXJfdXNlcl9pZHM9Wyg0LCBzZWxmLm1hbmFnZXIuaWQpXSwKICAgICAgICApCgogICAgICAgICMgTWFuYWdlciBub3QgaW4gc2VydmVyIDIsIHNhbWUgdGVtcGxhdGUKICAgICAgICBfLCBfLCBpbnN0YWxsMiA9IHNlbGYuX2NyZWF0ZV9pbnN0YWxsX3JlY29yZCgKICAgICAgICAgICAgdGVtcGxhdGU9dGVtcGxhdGUxLAogICAgICAgICAgICBzZXJ2ZXI9c2VsZi5zZXJ2ZXJfdGVzdF8yLAogICAgICAgICAgICB0ZW1wbGF0ZV9hY2Nlc3NfbGV2ZWw9IjIiLAogICAgICAgICAgICBzZXJ2ZXJfdXNlcl9pZHM9Wyg1LCAwLCAwKV0sCiAgICAgICAgICAgIHNlcnZlcl9tYW5hZ2VyX2lkcz1bKDUsIDAsIDApXSwKICAgICAgICApCgogICAgICAgICMgTWFuYWdlciBzaG91bGQgb25seSBzZWUgaW5zdGFsbDEKICAgICAgICByZWNvcmRzID0gc2VsZi5KZXRUZW1wbGF0ZUluc3RhbGwud2l0aF91c2VyKHNlbGYubWFuYWdlcikuc2VhcmNoKAogICAgICAgICAgICBbKCJpZCIsICJpbiIsIFtpbnN0YWxsMS5pZCwgaW5zdGFsbDIuaWRdKV0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVjb3JkcyksIDEsICJNYW5hZ2VyIHNob3VsZCBvbmx5IHNlZSBhY2Nlc3NpYmxlIGluc3RhbGwiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVjb3Jkc1swXS5pZCwgaW5zdGFsbDEuaWQsICJNYW5hZ2VyIHNob3VsZCBzZWUgaW5zdGFsbDEiKQoKICAgIGRlZiB0ZXN0X21hbmFnZXJfcmVhZF9tdWx0aXBsZV90ZW1wbGF0ZXMoc2VsZik6CiAgICAgICAgIiIiVGVzdCBNYW5hZ2VyIGFjY2VzcyB3aXRoIG11bHRpcGxlIHRlbXBsYXRlcyIiIgogICAgICAgICMgVGVtcGxhdGUgMTogTWFuYWdlciBsZXZlbCwgTWFuYWdlciBpbiBzZXJ2ZXIKICAgICAgICBfLCBfLCBpbnN0YWxsMSA9IHNlbGYuX2NyZWF0ZV9pbnN0YWxsX3JlY29yZCgKICAgICAgICAgICAgdGVtcGxhdGVfYWNjZXNzX2xldmVsPSIyIiwKICAgICAgICAgICAgc2VydmVyX3VzZXJfaWRzPVsoNCwgc2VsZi5tYW5hZ2VyLmlkKV0sCiAgICAgICAgKQoKICAgICAgICAjIFRlbXBsYXRlIDI6IFJvb3QgbGV2ZWwsIE1hbmFnZXIgaW4gc2VydmVyIGJ1dCB0ZW1wbGF0ZSB1c2VyX2lkcwogICAgICAgIF8sIF8sIGluc3RhbGwyID0gc2VsZi5fY3JlYXRlX2luc3RhbGxfcmVjb3JkKAogICAgICAgICAgICB0ZW1wbGF0ZV9hY2Nlc3NfbGV2ZWw9IjMiLAogICAgICAgICAgICB0ZW1wbGF0ZV91c2VyX2lkcz1bKDQsIHNlbGYubWFuYWdlci5pZCldLAogICAgICAgICAgICBzZXJ2ZXJfdXNlcl9pZHM9Wyg0LCBzZWxmLm1hbmFnZXIuaWQpXSwKICAgICAgICApCgogICAgICAgICMgTWFuYWdlciBzaG91bGQgc2VlIGJvdGgKICAgICAgICByZWNvcmRzID0gc2VsZi5KZXRUZW1wbGF0ZUluc3RhbGwud2l0aF91c2VyKHNlbGYubWFuYWdlcikuc2VhcmNoKAogICAgICAgICAgICBbKCJpZCIsICJpbiIsIFtpbnN0YWxsMS5pZCwgaW5zdGFsbDIuaWRdKV0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVjb3JkcyksIDIsICJNYW5hZ2VyIHNob3VsZCBzZWUgYm90aCBpbnN0YWxscyIpCg== \ No newline at end of file