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