From a2fc7b47c1eb7f4552a6e2614f8be242a16dbf9a Mon Sep 17 00:00:00 2001 From: git_admin Date: Mon, 27 Apr 2026 06:54:05 +0000 Subject: [PATCH] Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) --- addons/cetmix_tower_server/tests/test_plan_line.py | 1 + 1 file changed, 1 insertion(+) create mode 100644 addons/cetmix_tower_server/tests/test_plan_line.py diff --git a/addons/cetmix_tower_server/tests/test_plan_line.py b/addons/cetmix_tower_server/tests/test_plan_line.py new file mode 100644 index 0000000..0435906 --- /dev/null +++ b/addons/cetmix_tower_server/tests/test_plan_line.py @@ -0,0 +1 @@ +IyBDb3B5cmlnaHQgKEMpIDIwMjUgQ2V0bWl4IE/DnAojIExpY2Vuc2UgQUdQTC0zLjAgb3IgbGF0ZXIgKGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsKS4KCmZyb20gb2Rvby5leGNlcHRpb25zIGltcG9ydCBBY2Nlc3NFcnJvcgoKZnJvbSAuY29tbW9uIGltcG9ydCBUZXN0VG93ZXJDb21tb24KCgpjbGFzcyBUZXN0VG93ZXJQbGFuTGluZShUZXN0VG93ZXJDb21tb24pOgogICAgIiIiVGVzdCB0aGUgY3gudG93ZXIucGxhbi5saW5lIG1vZGVsIGFjY2VzcyByaWdodHMuIiIiCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgogICAgICAgIHN1cGVyKCkuc2V0VXBDbGFzcygpCgogICAgICAgICMgQ3JlYXRlIGEgdGVzdCBwbGFuIHdpdGggYWNjZXNzIGxldmVsIDEgZm9yIHVzZXIgdGVzdHMKICAgICAgICBjbHMudGVzdF9wbGFuID0gY2xzLlBsYW4uY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IEFjY2VzcyBQbGFuIiwKICAgICAgICAgICAgICAgICJhY2Nlc3NfbGV2ZWwiOiAiMSIsCiAgICAgICAgICAgICAgICAidXNlcl9pZHMiOiBbKDYsIDAsIFtjbHMudXNlci5pZF0pXSwKICAgICAgICAgICAgICAgICJtYW5hZ2VyX2lkcyI6IFsoNiwgMCwgW2Nscy5tYW5hZ2VyLmlkXSldLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENyZWF0ZSBhIHRlc3QgcGxhbiBsaW5lCiAgICAgICAgY2xzLnRlc3RfbGluZSA9IGNscy5wbGFuX2xpbmUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAicGxhbl9pZCI6IGNscy50ZXN0X3BsYW4uaWQsCiAgICAgICAgICAgICAgICAiY29tbWFuZF9pZCI6IGNscy5jb21tYW5kX2NyZWF0ZV9kaXIuaWQsCiAgICAgICAgICAgICAgICAic2VxdWVuY2UiOiAxMCwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBDcmVhdGUgYWRkaXRpb25hbCBzZXJ2ZXJzIGZvciB0ZXN0aW5nIHNlcnZlci1iYXNlZCBhY2Nlc3MKICAgICAgICBjbHMuc2VydmVyXzIgPSBjbHMuU2VydmVyLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBTZXJ2ZXIgMiIsCiAgICAgICAgICAgICAgICAiaXBfdjRfYWRkcmVzcyI6ICJsb2NhbGhvc3QiLAogICAgICAgICAgICAgICAgInNzaF91c2VybmFtZSI6ICJ0ZXN0MiIsCiAgICAgICAgICAgICAgICAic3NoX3Bhc3N3b3JkIjogInRlc3QyIiwKICAgICAgICAgICAgICAgICJzc2hfcG9ydCI6IDIyLAogICAgICAgICAgICAgICAgInVzZXJfaWRzIjogWyg2LCAwLCBbXSldLAogICAgICAgICAgICAgICAgIm1hbmFnZXJfaWRzIjogWyg2LCAwLCBbXSldLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICBjbHMuc2VydmVyXzMgPSBjbHMuU2VydmVyLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBTZXJ2ZXIgMyIsCiAgICAgICAgICAgICAgICAiaXBfdjRfYWRkcmVzcyI6ICJsb2NhbGhvc3QiLAogICAgICAgICAgICAgICAgInNzaF91c2VybmFtZSI6ICJ0ZXN0MyIsCiAgICAgICAgICAgICAgICAic3NoX3Bhc3N3b3JkIjogInRlc3QzIiwKICAgICAgICAgICAgICAgICJzc2hfcG9ydCI6IDIyLAogICAgICAgICAgICAgICAgInVzZXJfaWRzIjogWyg2LCAwLCBbXSldLAogICAgICAgICAgICAgICAgIm1hbmFnZXJfaWRzIjogWyg2LCAwLCBbXSldLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3VzZXJfcmVhZF9hY2Nlc3Moc2VsZik6CiAgICAgICAgIiIiVGVzdCB1c2VyIHJlYWQgYWNjZXNzIHRvIHBsYW4gbGluZXMiIiIKICAgICAgICAjIENhc2UgMTogVXNlciBzaG91bGQgYmUgYWJsZSB0byByZWFkIGxpbmUgd2hlbjoKICAgICAgICAjIC0gYWNjZXNzX2xldmVsID09ICIxIgogICAgICAgICMgLSB1c2VyIGlzIGluIHBsYW4ncyB1c2VyX2lkcyBPUiBzZXJ2ZXIncyB1c2VyX2lkcwogICAgICAgIHJlY3MgPSBzZWxmLnBsYW5fbGluZS53aXRoX3VzZXIoc2VsZi51c2VyKS5zZWFyY2goCiAgICAgICAgICAgIFsoImlkIiwgIj0iLCBzZWxmLnRlc3RfbGluZS5pZCldCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgIHNlbGYudGVzdF9saW5lLAogICAgICAgICAgICByZWNzLAogICAgICAgICAgICAiVXNlciBzaG91bGQgYmUgYWJsZSB0byByZWFkIGxpbmUgd2hlbiBjb25kaXRpb25zIGFyZSBtZXQiLAogICAgICAgICkKCiAgICAgICAgIyBDYXNlIDI6IFVzZXIgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIHJlYWQgd2hlbiBhY2Nlc3NfbGV2ZWwgPiAiMSIKICAgICAgICBzZWxmLnRlc3RfcGxhbi53cml0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgImFjY2Vzc19sZXZlbCI6ICIyIiwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICByZWNzID0gc2VsZi5wbGFuX2xpbmUud2l0aF91c2VyKHNlbGYudXNlcikuc2VhcmNoKAogICAgICAgICAgICBbKCJpZCIsICI9Iiwgc2VsZi50ZXN0X2xpbmUuaWQpXQogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydE5vdEluKAogICAgICAgICAgICBzZWxmLnRlc3RfbGluZSwKICAgICAgICAgICAgcmVjcywKICAgICAgICAgICAgIlVzZXIgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIHJlYWQgbGluZSB3aGVuIGFjY2Vzc19sZXZlbCA+ICcxJyIsCiAgICAgICAgKQoKICAgICAgICAjIENhc2UgMzogVXNlciBzaG91bGQgYmUgYWJsZSB0byByZWFkIHdoZW4gaW4gc2VydmVyJ3MgdXNlcl9pZHMKICAgICAgICBzZWxmLnRlc3RfcGxhbi53cml0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgImFjY2Vzc19sZXZlbCI6ICIxIiwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWRzIjogWyg2LCAwLCBbc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkXSldLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHNlbGYuc2VydmVyX3Rlc3RfMS53cml0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInVzZXJfaWRzIjogWyg2LCAwLCBbc2VsZi51c2VyLmlkXSldLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHJlY3MgPSBzZWxmLnBsYW5fbGluZS53aXRoX3VzZXIoc2VsZi51c2VyKS5zZWFyY2goCiAgICAgICAgICAgIFsoImlkIiwgIj0iLCBzZWxmLnRlc3RfbGluZS5pZCldCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgIHNlbGYudGVzdF9saW5lLAogICAgICAgICAgICByZWNzLAogICAgICAgICAgICAiVXNlciBzaG91bGQgYmUgYWJsZSB0byByZWFkIGxpbmUgd2hlbiBpbiBzZXJ2ZXIncyB1c2VyX2lkcyIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3VzZXJfd3JpdGVfY3JlYXRlX3VubGlua19hY2Nlc3Moc2VsZik6CiAgICAgICAgIiIiVGVzdCB1c2VyIHdyaXRlL2NyZWF0ZS91bmxpbmsgYWNjZXNzIHJlc3RyaWN0aW9ucyIiIgogICAgICAgICMgVXNlcnMgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIGNyZWF0ZSBsaW5lcwogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQWNjZXNzRXJyb3IpOgogICAgICAgICAgICBzZWxmLnBsYW5fbGluZS53aXRoX3VzZXIoc2VsZi51c2VyKS5jcmVhdGUoCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInBsYW5faWQiOiBzZWxmLnRlc3RfcGxhbi5pZCwKICAgICAgICAgICAgICAgICAgICAiY29tbWFuZF9pZCI6IHNlbGYuY29tbWFuZF9jcmVhdGVfZGlyLmlkLAogICAgICAgICAgICAgICAgICAgICJzZXF1ZW5jZSI6IDIwLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApCgogICAgICAgICMgVXNlcnMgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIHdyaXRlIGxpbmVzCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBY2Nlc3NFcnJvcik6CiAgICAgICAgICAgIHNlbGYudGVzdF9saW5lLndpdGhfdXNlcihzZWxmLnVzZXIpLndyaXRlKHsic2VxdWVuY2UiOiAzMH0pCgogICAgICAgICMgVXNlcnMgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIHVubGluayBsaW5lcwogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQWNjZXNzRXJyb3IpOgogICAgICAgICAgICBzZWxmLnRlc3RfbGluZS53aXRoX3VzZXIoc2VsZi51c2VyKS51bmxpbmsoKQoKICAgIGRlZiB0ZXN0X21hbmFnZXJfcmVhZF9hY2Nlc3Moc2VsZik6CiAgICAgICAgIiIiVGVzdCBtYW5hZ2VyIHJlYWQgYWNjZXNzIHRvIHBsYW4gbGluZXMiIiIKICAgICAgICAjIENhc2UgMTogTWFuYWdlciBzaG91bGQgYmUgYWJsZSB0byByZWFkIHdoZW46CiAgICAgICAgIyAtIGFjY2Vzc19sZXZlbCA8PSAiMiIKICAgICAgICAjIC0gbWFuYWdlciBpcyBpbiBwbGFuJ3MgbWFuYWdlcl9pZHMgT1IgdXNlcl9pZHMKICAgICAgICByZWNzID0gc2VsZi5wbGFuX2xpbmUud2l0aF91c2VyKHNlbGYubWFuYWdlcikuc2VhcmNoKAogICAgICAgICAgICBbKCJpZCIsICI9Iiwgc2VsZi50ZXN0X2xpbmUuaWQpXQogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEluKAogICAgICAgICAgICBzZWxmLnRlc3RfbGluZSwKICAgICAgICAgICAgcmVjcywKICAgICAgICAgICAgIk1hbmFnZXIgc2hvdWxkIGJlIGFibGUgdG8gcmVhZCBsaW5lIHdoZW4gY29uZGl0aW9ucyBhcmUgbWV0IiwKICAgICAgICApCgogICAgICAgICMgQ2FzZSAyOiBNYW5hZ2VyIHNob3VsZCBub3QgYmUgYWJsZSB0byByZWFkIHdoZW4gYWNjZXNzX2xldmVsID4gIjIiCiAgICAgICAgc2VsZi50ZXN0X3BsYW4ud3JpdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJhY2Nlc3NfbGV2ZWwiOiAiMyIsCiAgICAgICAgICAgICAgICAibWFuYWdlcl9pZHMiOiBbKDUsIDAsIDApXSwgICMgUmVtb3ZlIGFsbCBtYW5hZ2VycwogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHJlY3MgPSBzZWxmLnBsYW5fbGluZS53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS5zZWFyY2goCiAgICAgICAgICAgIFsoImlkIiwgIj0iLCBzZWxmLnRlc3RfbGluZS5pZCldCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oCiAgICAgICAgICAgIHNlbGYudGVzdF9saW5lLAogICAgICAgICAgICByZWNzLAogICAgICAgICAgICAiTWFuYWdlciBzaG91bGQgbm90IGJlIGFibGUgdG8gcmVhZCBsaW5lIHdoZW4gYWNjZXNzX2xldmVsID4gJzInIiwKICAgICAgICApCgogICAgICAgICMgQ2FzZSAyLjU6IE1hbmFnZXIgbm90IG5vdCBiZSBhYmxlIHRvIHJlYWQgd2hlbiBub3QgaW4gcGxhbiBtYW5hZ2VycwogICAgICAgIHNlbGYudGVzdF9wbGFuLndyaXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiYWNjZXNzX2xldmVsIjogIjIiLAogICAgICAgICAgICAgICAgIm1hbmFnZXJfaWRzIjogWyg1LCAwLCAwKV0sICAjIFJlbW92ZSBhbGwgbWFuYWdlcnMKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWRzIjogWyg2LCAwLCBbc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkXSldLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHNlbGYuc2VydmVyX3Rlc3RfMS53cml0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInVzZXJfaWRzIjogWyg1LCAwLCAwKV0sICAjIFJlbW92ZSBhbGwgdXNlcnMKICAgICAgICAgICAgICAgICJtYW5hZ2VyX2lkcyI6IFsoNSwgMCwgMCldLCAgIyBSZW1vdmUgYWxsIG1hbmFnZXJzCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgcmVjcyA9IHNlbGYucGxhbl9saW5lLndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLnNlYXJjaCgKICAgICAgICAgICAgWygiaWQiLCAiPSIsIHNlbGYudGVzdF9saW5lLmlkKV0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnROb3RJbigKICAgICAgICAgICAgc2VsZi50ZXN0X2xpbmUsCiAgICAgICAgICAgIHJlY3MsCiAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCBub3QgYmUgYWJsZSB0byByZWFkIGxpbmUgd2hlbiBhY2Nlc3NfbGV2ZWwgPiAnMiciLAogICAgICAgICkKCiAgICAgICAgIyBDYXNlIDM6IE1hbmFnZXIgc2hvdWxkIGJlIGFibGUgdG8gcmVhZCB3aGVuIGluIHNlcnZlcidzIG1hbmFnZXJfaWRzCiAgICAgICAgc2VsZi50ZXN0X3BsYW4ud3JpdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJhY2Nlc3NfbGV2ZWwiOiAiMiIsCiAgICAgICAgICAgICAgICAic2VydmVyX2lkcyI6IFsoNiwgMCwgW3NlbGYuc2VydmVyX3Rlc3RfMS5pZF0pXSwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICBzZWxmLnNlcnZlcl90ZXN0XzEud3JpdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJtYW5hZ2VyX2lkcyI6IFsoNiwgMCwgW3NlbGYubWFuYWdlci5pZF0pXSwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICByZWNzID0gc2VsZi5wbGFuX2xpbmUud2l0aF91c2VyKHNlbGYubWFuYWdlcikuc2VhcmNoKAogICAgICAgICAgICBbKCJpZCIsICI9Iiwgc2VsZi50ZXN0X2xpbmUuaWQpXQogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEluKAogICAgICAgICAgICBzZWxmLnRlc3RfbGluZSwKICAgICAgICAgICAgcmVjcywKICAgICAgICAgICAgIk1hbmFnZXIgc2hvdWxkIGJlIGFibGUgdG8gcmVhZCBsaW5lIHdoZW4gaW4gc2VydmVyJ3MgbWFuYWdlcl9pZHMiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9tYW5hZ2VyX3dyaXRlX2NyZWF0ZV9hY2Nlc3Moc2VsZik6CiAgICAgICAgIiIiVGVzdCBtYW5hZ2VyIHdyaXRlL2NyZWF0ZSBhY2Nlc3MgdG8gcGxhbiBsaW5lcyIiIgogICAgICAgICMgQ2FzZSAxOiBNYW5hZ2VyIHNob3VsZCBiZSBhYmxlIHRvIGNyZWF0ZS93cml0ZSB3aGVuOgogICAgICAgICMgLSBhY2Nlc3NfbGV2ZWwgPD0gIjIiCiAgICAgICAgIyAtIG1hbmFnZXIgaXMgaW4gcGxhbidzIG1hbmFnZXJfaWRzCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIFRlc3QgY3JlYXRlCiAgICAgICAgICAgIHNlbGYucGxhbl9saW5lLndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLmNyZWF0ZSgKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAicGxhbl9pZCI6IHNlbGYudGVzdF9wbGFuLmlkLAogICAgICAgICAgICAgICAgICAgICJjb21tYW5kX2lkIjogc2VsZi5jb21tYW5kX2NyZWF0ZV9kaXIuaWQsCiAgICAgICAgICAgICAgICAgICAgInNlcXVlbmNlIjogMjAsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkKICAgICAgICAgICAgIyBUZXN0IHdyaXRlCiAgICAgICAgICAgIHNlbGYudGVzdF9saW5lLndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLndyaXRlKHsic2VxdWVuY2UiOiAzMH0pCiAgICAgICAgZXhjZXB0IEFjY2Vzc0Vycm9yOgogICAgICAgICAgICBzZWxmLmZhaWwoIk1hbmFnZXIgc2hvdWxkIGJlIGFibGUgdG8gY3JlYXRlL3dyaXRlIHdoZW4gY29uZGl0aW9ucyBhcmUgbWV0IikKCiAgICAgICAgIyBDYXNlIDI6IE1hbmFnZXIgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIGNyZWF0ZS93cml0ZSB3aGVuIGFjY2Vzc19sZXZlbCA+ICIyIgogICAgICAgIHNlbGYudGVzdF9wbGFuLndyaXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiYWNjZXNzX2xldmVsIjogIjMiLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQWNjZXNzRXJyb3IpOgogICAgICAgICAgICBzZWxmLnBsYW5fbGluZS53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS5jcmVhdGUoCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInBsYW5faWQiOiBzZWxmLnRlc3RfcGxhbi5pZCwKICAgICAgICAgICAgICAgICAgICAiY29tbWFuZF9pZCI6IHNlbGYuY29tbWFuZF9jcmVhdGVfZGlyLmlkLAogICAgICAgICAgICAgICAgICAgICJzZXF1ZW5jZSI6IDQwLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBY2Nlc3NFcnJvcik6CiAgICAgICAgICAgIHNlbGYudGVzdF9saW5lLndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLndyaXRlKHsic2VxdWVuY2UiOiA1MH0pCgogICAgZGVmIHRlc3RfbWFuYWdlcl91bmxpbmtfYWNjZXNzKHNlbGYpOgogICAgICAgICIiIlRlc3QgbWFuYWdlciB1bmxpbmsgYWNjZXNzIHRvIHBsYW4gbGluZXMiIiIKICAgICAgICAjIENyZWF0ZSBsaW5lIGFzIG1hbmFnZXIgdG8gdGVzdCB1bmxpbmsgcmlnaHRzCiAgICAgICAgbGluZSA9IHNlbGYucGxhbl9saW5lLndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInBsYW5faWQiOiBzZWxmLnRlc3RfcGxhbi5pZCwKICAgICAgICAgICAgICAgICJjb21tYW5kX2lkIjogc2VsZi5jb21tYW5kX2NyZWF0ZV9kaXIuaWQsCiAgICAgICAgICAgICAgICAic2VxdWVuY2UiOiAyMCwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBDYXNlIDE6IE1hbmFnZXIgc2hvdWxkIGJlIGFibGUgdG8gdW5saW5rIHdoZW46CiAgICAgICAgIyAtIGFjY2Vzc19sZXZlbCA8PSAiMiIKICAgICAgICAjIC0gbWFuYWdlciBpcyB0aGUgY3JlYXRvcgogICAgICAgICMgLSBtYW5hZ2VyIGlzIGluIHBsYW4ncyBtYW5hZ2VyX2lkcwogICAgICAgIHRyeToKICAgICAgICAgICAgbGluZS51bmxpbmsoKQogICAgICAgIGV4Y2VwdCBBY2Nlc3NFcnJvcjoKICAgICAgICAgICAgc2VsZi5mYWlsKCJNYW5hZ2VyIHNob3VsZCBiZSBhYmxlIHRvIHVubGluayB3aGVuIGNvbmRpdGlvbnMgYXJlIG1ldCIpCgogICAgICAgICMgQ2FzZSAyOiBNYW5hZ2VyIHNob3VsZCBub3QgYmUgYWJsZSB0byB1bmxpbmsgbGluZXMgY3JlYXRlZCBieSBvdGhlcnMKICAgICAgICBsaW5lID0gc2VsZi50ZXN0X2xpbmUgICMgQ3JlYXRlZCBieSBhZG1pbiBpbiBzZXRVcAogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQWNjZXNzRXJyb3IpOgogICAgICAgICAgICBsaW5lLndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLnVubGluaygpCgogICAgZGVmIHRlc3Rfcm9vdF91bnJlc3RyaWN0ZWRfcmVhZF9hY2Nlc3Moc2VsZik6CiAgICAgICAgIiIiVGVzdCByb290IHVzZXIgdW5yZXN0cmljdGVkIHJlYWQgYWNjZXNzIiIiCiAgICAgICAgIyBTZXQgbW9zdCByZXN0cmljdGl2ZSBjb25kaXRpb25zCiAgICAgICAgc2VsZi50ZXN0X3BsYW4ud3JpdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJhY2Nlc3NfbGV2ZWwiOiAiMyIsCiAgICAgICAgICAgICAgICAidXNlcl9pZHMiOiBbKDUsIDAsIDApXSwKICAgICAgICAgICAgICAgICJtYW5hZ2VyX2lkcyI6IFsoNSwgMCwgMCldLAogICAgICAgICAgICAgICAgInNlcnZlcl9pZHMiOiBbKDYsIDAsIFtzZWxmLnNlcnZlcl8yLmlkLCBzZWxmLnNlcnZlcl8zLmlkXSldLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIFJvb3Qgc2hvdWxkIHN0aWxsIGJlIGFibGUgdG8gcmVhZAogICAgICAgIHJlY3MgPSBzZWxmLnBsYW5fbGluZS53aXRoX3VzZXIoc2VsZi5yb290KS5zZWFyY2goCiAgICAgICAgICAgIFsoImlkIiwgIj0iLCBzZWxmLnRlc3RfbGluZS5pZCldCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgIHNlbGYudGVzdF9saW5lLAogICAgICAgICAgICByZWNzLAogICAgICAgICAgICAiUm9vdCBzaG91bGQgYmUgYWJsZSB0byByZWFkIHJlZ2FyZGxlc3Mgb2YgYWNjZXNzIHJlc3RyaWN0aW9ucyIsCiAgICAgICAgKQoKICAgICAgICAjIFJvb3Qgc2hvdWxkIGJlIGFibGUgdG8gcmVhZCBhbGwgcmVjb3JkcwogICAgICAgIGFsbF9yZWNzID0gc2VsZi5wbGFuX2xpbmUud2l0aF91c2VyKHNlbGYucm9vdCkuc2VhcmNoKFtdKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgIHNlbGYudGVzdF9saW5lLAogICAgICAgICAgICBhbGxfcmVjcywKICAgICAgICAgICAgIlJvb3Qgc2hvdWxkIGJlIGFibGUgdG8gcmVhZCBhbGwgcmVjb3JkcyIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3Jvb3RfdW5yZXN0cmljdGVkX3dyaXRlX2FjY2VzcyhzZWxmKToKICAgICAgICAiIiJUZXN0IHJvb3QgdXNlciB1bnJlc3RyaWN0ZWQgd3JpdGUgYWNjZXNzIiIiCiAgICAgICAgIyBTZXQgbW9zdCByZXN0cmljdGl2ZSBjb25kaXRpb25zCiAgICAgICAgc2VsZi50ZXN0X3BsYW4ud3JpdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJhY2Nlc3NfbGV2ZWwiOiAiMyIsCiAgICAgICAgICAgICAgICAidXNlcl9pZHMiOiBbKDUsIDAsIDApXSwKICAgICAgICAgICAgICAgICJtYW5hZ2VyX2lkcyI6IFsoNSwgMCwgMCldLAogICAgICAgICAgICAgICAgInNlcnZlcl9pZHMiOiBbKDYsIDAsIFtzZWxmLnNlcnZlcl8yLmlkLCBzZWxmLnNlcnZlcl8zLmlkXSldLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgVGVzdCBzaW5nbGUgZmllbGQgdXBkYXRlCiAgICAgICAgICAgIHNlbGYudGVzdF9saW5lLndpdGhfdXNlcihzZWxmLnJvb3QpLndyaXRlKHsic2VxdWVuY2UiOiAxMDB9KQoKICAgICAgICAgICAgIyBUZXN0IG11bHRpcGxlIGZpZWxkIHVwZGF0ZQogICAgICAgICAgICBzZWxmLnRlc3RfbGluZS53aXRoX3VzZXIoc2VsZi5yb290KS53cml0ZSgKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAic2VxdWVuY2UiOiAyMDAsCiAgICAgICAgICAgICAgICAgICAgInBhdGgiOiAiL3Rlc3QvcGF0aCIsCiAgICAgICAgICAgICAgICAgICAgInVzZV9zdWRvIjogVHJ1ZSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKQogICAgICAgIGV4Y2VwdCBBY2Nlc3NFcnJvcjoKICAgICAgICAgICAgc2VsZi5mYWlsKCJSb290IHNob3VsZCBiZSBhYmxlIHRvIHdyaXRlIHJlZ2FyZGxlc3Mgb2YgYWNjZXNzIHJlc3RyaWN0aW9ucyIpCgogICAgZGVmIHRlc3Rfcm9vdF91bnJlc3RyaWN0ZWRfY3JlYXRlX2FjY2VzcyhzZWxmKToKICAgICAgICAiIiJUZXN0IHJvb3QgdXNlciB1bnJlc3RyaWN0ZWQgY3JlYXRlIGFjY2VzcyIiIgogICAgICAgICMgU2V0IG1vc3QgcmVzdHJpY3RpdmUgY29uZGl0aW9ucwogICAgICAgIHNlbGYudGVzdF9wbGFuLndyaXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiYWNjZXNzX2xldmVsIjogIjMiLAogICAgICAgICAgICAgICAgInVzZXJfaWRzIjogWyg1LCAwLCAwKV0sCiAgICAgICAgICAgICAgICAibWFuYWdlcl9pZHMiOiBbKDUsIDAsIDApXSwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWRzIjogWyg2LCAwLCBbc2VsZi5zZXJ2ZXJfMi5pZCwgc2VsZi5zZXJ2ZXJfMy5pZF0pXSwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIFRlc3QgY3JlYXRlIHdpdGggbWluaW1hbCB2YWx1ZXMKICAgICAgICAgICAgbmV3X2xpbmVfMSA9IHNlbGYucGxhbl9saW5lLndpdGhfdXNlcihzZWxmLnJvb3QpLmNyZWF0ZSgKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAicGxhbl9pZCI6IHNlbGYudGVzdF9wbGFuLmlkLAogICAgICAgICAgICAgICAgICAgICJjb21tYW5kX2lkIjogc2VsZi5jb21tYW5kX2NyZWF0ZV9kaXIuaWQsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkKCiAgICAgICAgICAgICMgVGVzdCBjcmVhdGUgd2l0aCBhbGwgdmFsdWVzCiAgICAgICAgICAgIG5ld19saW5lXzIgPSBzZWxmLnBsYW5fbGluZS53aXRoX3VzZXIoc2VsZi5yb290KS5jcmVhdGUoCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInBsYW5faWQiOiBzZWxmLnRlc3RfcGxhbi5pZCwKICAgICAgICAgICAgICAgICAgICAiY29tbWFuZF9pZCI6IHNlbGYuY29tbWFuZF9jcmVhdGVfZGlyLmlkLAogICAgICAgICAgICAgICAgICAgICJzZXF1ZW5jZSI6IDMwMCwKICAgICAgICAgICAgICAgICAgICAicGF0aCI6ICIvYW5vdGhlci90ZXN0L3BhdGgiLAogICAgICAgICAgICAgICAgICAgICJ1c2Vfc3VkbyI6IFRydWUsCiAgICAgICAgICAgICAgICAgICAgImNvbmRpdGlvbiI6ICJ7eyB0ZXN0X2NvbmRpdGlvbiB9fSIsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkKCiAgICAgICAgICAgICMgVmVyaWZ5IGNyZWF0ZWQgcmVjb3JkcyBhcmUgcmVhZGFibGUKICAgICAgICAgICAgcmVjcyA9IHNlbGYucGxhbl9saW5lLndpdGhfdXNlcihzZWxmLnJvb3QpLnNlYXJjaCgKICAgICAgICAgICAgICAgIFsoImlkIiwgImluIiwgW25ld19saW5lXzEuaWQsIG5ld19saW5lXzIuaWRdKV0KICAgICAgICAgICAgKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICAgICAgbGVuKHJlY3MpLAogICAgICAgICAgICAgICAgMiwKICAgICAgICAgICAgICAgICJSb290IHNob3VsZCBiZSBhYmxlIHRvIHJlYWQgbmV3bHkgY3JlYXRlZCByZWNvcmRzIiwKICAgICAgICAgICAgKQogICAgICAgIGV4Y2VwdCBBY2Nlc3NFcnJvcjoKICAgICAgICAgICAgc2VsZi5mYWlsKCJSb290IHNob3VsZCBiZSBhYmxlIHRvIGNyZWF0ZSByZWdhcmRsZXNzIG9mIGFjY2VzcyByZXN0cmljdGlvbnMiKQoKICAgIGRlZiB0ZXN0X3Jvb3RfdW5yZXN0cmljdGVkX3VubGlua19hY2Nlc3Moc2VsZik6CiAgICAgICAgIiIiVGVzdCByb290IHVzZXIgdW5yZXN0cmljdGVkIHVubGluayBhY2Nlc3MiIiIKICAgICAgICAjIFNldCBtb3N0IHJlc3RyaWN0aXZlIGNvbmRpdGlvbnMKICAgICAgICBzZWxmLnRlc3RfcGxhbi53cml0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgImFjY2Vzc19sZXZlbCI6ICIzIiwKICAgICAgICAgICAgICAgICJ1c2VyX2lkcyI6IFsoNSwgMCwgMCldLAogICAgICAgICAgICAgICAgIm1hbmFnZXJfaWRzIjogWyg1LCAwLCAwKV0sCiAgICAgICAgICAgICAgICAic2VydmVyX2lkcyI6IFsoNiwgMCwgW3NlbGYuc2VydmVyXzIuaWQsIHNlbGYuc2VydmVyXzMuaWRdKV0sCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgQ3JlYXRlIHRlc3QgcmVjb3JkcwogICAgICAgIHRlc3RfbGluZXMgPSBzZWxmLnBsYW5fbGluZS53aXRoX3VzZXIoc2VsZi5yb290KS5jcmVhdGUoCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAicGxhbl9pZCI6IHNlbGYudGVzdF9wbGFuLmlkLAogICAgICAgICAgICAgICAgICAgICJjb21tYW5kX2lkIjogc2VsZi5jb21tYW5kX2NyZWF0ZV9kaXIuaWQsCiAgICAgICAgICAgICAgICAgICAgInNlcXVlbmNlIjogc2VxLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yIHNlcSBpbiByYW5nZSg0MDAsIDQwMykKICAgICAgICAgICAgXQogICAgICAgICkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIFRlc3Qgc2luZ2xlIHJlY29yZCB1bmxpbmsKICAgICAgICAgICAgdGVzdF9saW5lc1swXS53aXRoX3VzZXIoc2VsZi5yb290KS51bmxpbmsoKQoKICAgICAgICAgICAgIyBUZXN0IG11bHRpcGxlIHJlY29yZCB1bmxpbmsKICAgICAgICAgICAgdGVzdF9saW5lc1sxOl0ud2l0aF91c2VyKHNlbGYucm9vdCkudW5saW5rKCkKCiAgICAgICAgICAgICMgVmVyaWZ5IHJlY29yZHMgYXJlIGRlbGV0ZWQKICAgICAgICAgICAgcmVjcyA9IHNlbGYucGxhbl9saW5lLndpdGhfdXNlcihzZWxmLnJvb3QpLnNlYXJjaCgKICAgICAgICAgICAgICAgIFsoImlkIiwgImluIiwgdGVzdF9saW5lcy5pZHMpXQogICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgICAgICBsZW4ocmVjcyksCiAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgIlJvb3Qgc2hvdWxkIGJlIGFibGUgdG8gZGVsZXRlIHJlY29yZHMgY29tcGxldGVseSIsCiAgICAgICAgICAgICkKICAgICAgICBleGNlcHQgQWNjZXNzRXJyb3I6CiAgICAgICAgICAgIHNlbGYuZmFpbCgiUm9vdCBzaG91bGQgYmUgYWJsZSB0byB1bmxpbmsgcmVnYXJkbGVzcyBvZiBhY2Nlc3MgcmVzdHJpY3Rpb25zIikKCiAgICBkZWYgdGVzdF9tYW5hZ2VyX3NlcnZlcl9iYXNlZF9yZWFkX2FjY2VzcyhzZWxmKToKICAgICAgICAiIiJUZXN0IG1hbmFnZXIgcmVhZCBhY2Nlc3MgYmFzZWQgb24gc2VydmVyIHJlbGF0aW9uc2hpcHMiIiIKICAgICAgICAjIFJlbW92ZSBkaXJlY3QgbWFuYWdlciBhY2Nlc3MgZnJvbSBwbGFuCiAgICAgICAgc2VsZi50ZXN0X3BsYW4ud3JpdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJtYW5hZ2VyX2lkcyI6IFsoNSwgMCwgMCldLCAgIyBDbGVhciBtYW5hZ2VyX2lkcwogICAgICAgICAgICAgICAgImFjY2Vzc19sZXZlbCI6ICIyIiwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBDYXNlIDE6IE5vIHNlcnZlcnMgbGlua2VkIC0gc2hvdWxkIGhhdmUgYWNjZXNzCiAgICAgICAgcmVjcyA9IHNlbGYucGxhbl9saW5lLndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLnNlYXJjaCgKICAgICAgICAgICAgWygiaWQiLCAiPSIsIHNlbGYudGVzdF9saW5lLmlkKV0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRJbigKICAgICAgICAgICAgc2VsZi50ZXN0X2xpbmUsCiAgICAgICAgICAgIHJlY3MsCiAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCBiZSBhYmxlIHRvIHJlYWQgd2hlbiBubyBzZXJ2ZXJzIGFyZSBsaW5rZWQiLAogICAgICAgICkKCiAgICAgICAgIyBDYXNlIDI6IFNlcnZlciBsaW5rZWQgYnV0IG1hbmFnZXIgbm90IGluIHNlcnZlcidzIHVzZXJzL21hbmFnZXJzCiAgICAgICAgc2VsZi50ZXN0X3BsYW4ud3JpdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWRzIjogWyg2LCAwLCBbc2VsZi5zZXJ2ZXJfMi5pZF0pXSwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICByZWNzID0gc2VsZi5wbGFuX2xpbmUud2l0aF91c2VyKHNlbGYubWFuYWdlcikuc2VhcmNoKAogICAgICAgICAgICBbKCJpZCIsICI9Iiwgc2VsZi50ZXN0X2xpbmUuaWQpXQogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydE5vdEluKAogICAgICAgICAgICBzZWxmLnRlc3RfbGluZSwKICAgICAgICAgICAgcmVjcywKICAgICAgICAgICAgIk1hbmFnZXIgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIHJlYWQgd2hlbiBub3QgaW4gc2VydmVyJ3MgdXNlcnMvbWFuYWdlcnMiLAogICAgICAgICkKCiAgICAgICAgIyBDYXNlIDM6IE1hbmFnZXIgaW4gc2VydmVyJ3MgdXNlcl9pZHMKICAgICAgICBzZWxmLnNlcnZlcl8yLndyaXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidXNlcl9pZHMiOiBbKDYsIDAsIFtzZWxmLm1hbmFnZXIuaWRdKV0sCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgcmVjcyA9IHNlbGYucGxhbl9saW5lLndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLnNlYXJjaCgKICAgICAgICAgICAgWygiaWQiLCAiPSIsIHNlbGYudGVzdF9saW5lLmlkKV0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRJbigKICAgICAgICAgICAgc2VsZi50ZXN0X2xpbmUsCiAgICAgICAgICAgIHJlY3MsCiAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCBiZSBhYmxlIHRvIHJlYWQgd2hlbiBpbiBzZXJ2ZXIncyB1c2VyX2lkcyIsCiAgICAgICAgKQoKICAgICAgICAjIENhc2UgNDogTWFuYWdlciBpbiBzZXJ2ZXIncyBtYW5hZ2VyX2lkcwogICAgICAgIHNlbGYuc2VydmVyXzIud3JpdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJ1c2VyX2lkcyI6IFsoNSwgMCwgMCldLAogICAgICAgICAgICAgICAgIm1hbmFnZXJfaWRzIjogWyg2LCAwLCBbc2VsZi5tYW5hZ2VyLmlkXSldLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHJlY3MgPSBzZWxmLnBsYW5fbGluZS53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS5zZWFyY2goCiAgICAgICAgICAgIFsoImlkIiwgIj0iLCBzZWxmLnRlc3RfbGluZS5pZCldCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgIHNlbGYudGVzdF9saW5lLAogICAgICAgICAgICByZWNzLAogICAgICAgICAgICAiTWFuYWdlciBzaG91bGQgYmUgYWJsZSB0byByZWFkIHdoZW4gaW4gc2VydmVyJ3MgbWFuYWdlcl9pZHMiLAogICAgICAgICkKCiAgICAgICAgIyBDYXNlIDU6IE11bHRpcGxlIHNlcnZlcnMgLSBhY2Nlc3MgdGhyb3VnaCBvbmUgc2VydmVyCiAgICAgICAgc2VsZi50ZXN0X3BsYW4ud3JpdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWRzIjogWyg2LCAwLCBbc2VsZi5zZXJ2ZXJfMi5pZCwgc2VsZi5zZXJ2ZXJfMy5pZF0pXSwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICByZWNzID0gc2VsZi5wbGFuX2xpbmUud2l0aF91c2VyKHNlbGYubWFuYWdlcikuc2VhcmNoKAogICAgICAgICAgICBbKCJpZCIsICI9Iiwgc2VsZi50ZXN0X2xpbmUuaWQpXQogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEluKAogICAgICAgICAgICBzZWxmLnRlc3RfbGluZSwKICAgICAgICAgICAgcmVjcywKICAgICAgICAgICAgIk1hbmFnZXIgc2hvdWxkIGJlIGFibGUgdG8gcmVhZCB3aGVuIGluIGF0IGxlYXN0IG9uZSBzZXJ2ZXIncyBtYW5hZ2VyX2lkcyIsCiAgICAgICAgKQoKICAgICAgICAjIENhc2UgNjogTXVsdGlwbGUgc2VydmVycyAtIG5vIGFjY2VzcwogICAgICAgIHNlbGYuc2VydmVyXzIud3JpdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJtYW5hZ2VyX2lkcyI6IFsoNSwgMCwgMCldLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHJlY3MgPSBzZWxmLnBsYW5fbGluZS53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS5zZWFyY2goCiAgICAgICAgICAgIFsoImlkIiwgIj0iLCBzZWxmLnRlc3RfbGluZS5pZCldCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oCiAgICAgICAgICAgIHNlbGYudGVzdF9saW5lLAogICAgICAgICAgICByZWNzLAogICAgICAgICAgICAiTWFuYWdlciBzaG91bGQgbm90IGJlIGFibGUgdG8gcmVhZCB3aGVuIG5vdCAiCiAgICAgICAgICAgICJpbiBhbnkgc2VydmVyJ3MgdXNlcnMvbWFuYWdlcnMiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9tYW5hZ2VyX3NlcnZlcl9iYXNlZF93cml0ZV9hY2Nlc3Moc2VsZik6CiAgICAgICAgIiIiVGVzdCBtYW5hZ2VyIHdyaXRlIGFjY2VzcyBiYXNlZCBvbiBzZXJ2ZXIgcmVsYXRpb25zaGlwcyIiIgogICAgICAgICMgUmVtb3ZlIGRpcmVjdCBtYW5hZ2VyIGFjY2VzcyBmcm9tIHBsYW4KICAgICAgICBzZWxmLnRlc3RfcGxhbi53cml0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm1hbmFnZXJfaWRzIjogWyg1LCAwLCAwKV0sICAjIENsZWFyIG1hbmFnZXJfaWRzCiAgICAgICAgICAgICAgICAiYWNjZXNzX2xldmVsIjogIjIiLAogICAgICAgICAgICAgICAgInNlcnZlcl9pZHMiOiBbKDYsIDAsIFtzZWxmLnNlcnZlcl8yLmlkXSldLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENhc2UgMTogTm8gc2VydmVyIGFjY2VzcyAtIHNob3VsZCBub3QgYmUgYWJsZSB0byB3cml0ZQogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQWNjZXNzRXJyb3IpOgogICAgICAgICAgICBzZWxmLnRlc3RfbGluZS53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS53cml0ZSh7InNlcXVlbmNlIjogNDB9KQoKICAgICAgICAjIENhc2UgMjogTWFuYWdlciBpbiBzZXJ2ZXIncyBtYW5hZ2VyX2lkcyAtIHN0aWxsIHNob3VsZCBub3QgYmUgYWJsZSB0byB3cml0ZQogICAgICAgIHNlbGYuc2VydmVyXzIud3JpdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJtYW5hZ2VyX2lkcyI6IFsoNiwgMCwgW3NlbGYubWFuYWdlci5pZF0pXSwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEFjY2Vzc0Vycm9yKToKICAgICAgICAgICAgc2VsZi50ZXN0X2xpbmUud2l0aF91c2VyKHNlbGYubWFuYWdlcikud3JpdGUoeyJzZXF1ZW5jZSI6IDUwfSkKCiAgICAgICAgIyBDYXNlIDM6IE1hbmFnZXIgaW4gcGxhbidzIG1hbmFnZXJfaWRzIC0gc2hvdWxkIGJlIGFibGUgdG8gd3JpdGUKICAgICAgICBzZWxmLnRlc3RfcGxhbi53cml0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm1hbmFnZXJfaWRzIjogWyg2LCAwLCBbc2VsZi5tYW5hZ2VyLmlkXSldLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi50ZXN0X2xpbmUud2l0aF91c2VyKHNlbGYubWFuYWdlcikud3JpdGUoeyJzZXF1ZW5jZSI6IDYwfSkKICAgICAgICBleGNlcHQgQWNjZXNzRXJyb3I6CiAgICAgICAgICAgIHNlbGYuZmFpbCgiTWFuYWdlciBzaG91bGQgYmUgYWJsZSB0byB3cml0ZSB3aGVuIGluIHBsYW4ncyBtYW5hZ2VyX2lkcyIpCg== \ No newline at end of file