From c717460cead8bf2b30fe8aa8f6b01498fd267e75 Mon Sep 17 00:00:00 2001 From: git_admin Date: Mon, 27 Apr 2026 06:54:04 +0000 Subject: [PATCH] Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) --- addons/cetmix_tower_server/tests/test_plan.py | 1 + 1 file changed, 1 insertion(+) create mode 100644 addons/cetmix_tower_server/tests/test_plan.py diff --git a/addons/cetmix_tower_server/tests/test_plan.py b/addons/cetmix_tower_server/tests/test_plan.py new file mode 100644 index 0000000..f04627f --- /dev/null +++ b/addons/cetmix_tower_server/tests/test_plan.py @@ -0,0 +1 @@ +IyBDb3B5cmlnaHQgKEMpIDIwMjIgQ2V0bWl4IE/DnAojIExpY2Vuc2UgQUdQTC0zLjAgb3IgbGF0ZXIgKGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsKS4KZnJvbSB1bml0dGVzdC5tb2NrIGltcG9ydCBwYXRjaAoKZnJvbSBvZG9vIGltcG9ydCBfLCBmaWVsZHMKZnJvbSBvZG9vLmV4Y2VwdGlvbnMgaW1wb3J0IEFjY2Vzc0Vycm9yLCBWYWxpZGF0aW9uRXJyb3IKZnJvbSBvZG9vLnRvb2xzLm1pc2MgaW1wb3J0IG11dGVfbG9nZ2VyCgpmcm9tIC4ubW9kZWxzLmNvbnN0YW50cyBpbXBvcnQgKAogICAgQU5PVEhFUl9QTEFOX1JVTk5JTkcsCiAgICBHRU5FUkFMX0VSUk9SLAogICAgUExBTl9JU19FTVBUWSwKICAgIFBMQU5fTElORV9DT05ESVRJT05fQ0hFQ0tfRkFJTEVELAogICAgUExBTl9OT1RfQ09NUEFUSUJMRV9XSVRIX1NFUlZFUiwKICAgIFBMQU5fU1RPUFBFRCwKKQpmcm9tIC5jb21tb24gaW1wb3J0IFRlc3RUb3dlckNvbW1vbgoKCmNsYXNzIFRlc3RUb3dlclBsYW4oVGVzdFRvd2VyQ29tbW9uKToKICAgICIiIlRlc3QgdGhlIGN4LnRvd2VyLnBsYW4gbW9kZWwuIiIiCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgogICAgICAgIHN1cGVyKCkuc2V0VXBDbGFzcygpCgogICAgICAgICMgQ29tbWFuZHMKICAgICAgICBjbHMuY29tbWFuZF9ydW5fZmxpZ2h0X3BsYW5fMSA9IGNscy5Db21tYW5kLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiUnVuIEZsaWdodCBQbGFuIiwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAicGxhbiIsCiAgICAgICAgICAgICAgICAiZmxpZ2h0X3BsYW5faWQiOiBjbHMucGxhbl8xLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIGNscy5jb21tYW5kX3B5dGhvbl9jdXN0b21fdmFyaWFibGVfdmFsdWVzXzEgPSBjbHMuQ29tbWFuZC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlB5dGhvbiBjb21tYW5kIHRvIHNldCBjdXN0b20gdmFyaWFibGUgdmFsdWVzIiwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAicHl0aG9uX2NvZGUiLAogICAgICAgICAgICAgICAgImNvZGUiOiAiIiIKY3VzdG9tX3ZhbHVlc1sndGVzdF9wYXRoXyddID0gJy90ZXN0X3BhdGgnCmN1c3RvbV92YWx1ZXNbJ3Rlc3RfZGlyJ10gPSAndGVzdF9kaXInCmN1c3RvbV92YWx1ZXNbJ19teV92YWx1ZSddID0gJ0p1c3QgVG8gVGVzdCcKIiIiLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIGNscy5jb21tYW5kX3B5dGhvbl9jdXN0b21fdmFyaWFibGVfdmFsdWVzXzIgPSBjbHMuQ29tbWFuZC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlB5dGhvbiBjb21tYW5kIHRvIHVwZGF0ZSBjdXN0b20gdmFyaWFibGUgdmFsdWVzIiwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAicHl0aG9uX2NvZGUiLAogICAgICAgICAgICAgICAgImNvZGUiOiBmIiIiCmN1c3RvbV92YWx1ZXNbJ3Rlc3RfcGF0aF8nXSA9ICcvYW5vdGhlcl90ZXN0X3BhdGgnCmN1c3RvbV92YWx1ZXNbJ3JhbmRvbV92YXJfcmVmZXJlbmNlJ10gPSAncmFuZG9tX3Zhcl92YWx1ZScKY3VzdG9tX3ZhbHVlc1sne2Nscy52YXJpYWJsZV91cmwucmVmZXJlbmNlfSddID0gJ2h0dHBzOi8vd3d3LmNldG1peC5jb20nCiIiIiwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICAjIEZsaWdodCBwbGFuCiAgICAgICAgY2xzLnBsYW5fMiA9IGNscy5QbGFuLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBwbGFuIDIiLAogICAgICAgICAgICAgICAgIm5vdGUiOiAiUnVuIGFub3RoZXIgZmxpZ2h0IHBsYW4iLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIGNscy5wbGFuXzJfbGluZV8xID0gY2xzLnBsYW5fbGluZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzZXF1ZW5jZSI6IDUsCiAgICAgICAgICAgICAgICAicGxhbl9pZCI6IGNscy5wbGFuXzIuaWQsCiAgICAgICAgICAgICAgICAiY29tbWFuZF9pZCI6IGNscy5jb21tYW5kX3J1bl9mbGlnaHRfcGxhbl8xLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIGNscy5wbGFuXzJfbGluZV8yID0gY2xzLnBsYW5fbGluZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzZXF1ZW5jZSI6IDEwLAogICAgICAgICAgICAgICAgInBsYW5faWQiOiBjbHMucGxhbl8yLmlkLAogICAgICAgICAgICAgICAgImNvbW1hbmRfaWQiOiBjbHMuY29tbWFuZF9jcmVhdGVfZGlyLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgICMgRmxpZ2h0IHBsYW4gd2l0aCBhY2Nlc3MgbGV2ZWwgMSB0byB0ZXN0IHVzZXIgYWNjZXNzIHJpZ2h0cwogICAgICAgIGNscy5wbGFuXzMgPSBjbHMuUGxhbi5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgcGxhbiAzIiwKICAgICAgICAgICAgICAgICJub3RlIjogIlRlc3QgdXNlciBhY2Nlc3MgcmlnaHRzIiwKICAgICAgICAgICAgICAgICJhY2Nlc3NfbGV2ZWwiOiAiMSIsCiAgICAgICAgICAgICAgICAibGluZV9pZHMiOiBbCiAgICAgICAgICAgICAgICAgICAgKDAsIDAsIHsiY29tbWFuZF9pZCI6IGNscy5jb21tYW5kX2NyZWF0ZV9kaXIuaWQsICJzZXF1ZW5jZSI6IDF9KSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgIyBDcmVhdGUgbGluZSBmb3IgcGxhbiAzCiAgICAgICAgY2xzLnBsYW5fM19saW5lXzEgPSBjbHMucGxhbl9saW5lLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInBsYW5faWQiOiBjbHMucGxhbl8zLmlkLAogICAgICAgICAgICAgICAgImNvbW1hbmRfaWQiOiBjbHMuY29tbWFuZF9jcmVhdGVfZGlyLmlkLAogICAgICAgICAgICAgICAgInNlcXVlbmNlIjogMTAsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgY2xzLnBsYW5fM19saW5lXzFfYWN0aW9uID0gY2xzLmVudlsiY3gudG93ZXIucGxhbi5saW5lLmFjdGlvbiJdLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgImxpbmVfaWQiOiBjbHMucGxhbl8zX2xpbmVfMS5pZCwKICAgICAgICAgICAgICAgICJjb25kaXRpb24iOiAiPT0iLAogICAgICAgICAgICAgICAgInZhbHVlX2NoYXIiOiAidGVzdCIsCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogImUiLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIGNscy52YXJpYWJsZV92YWx1ZSA9IGNscy5lbnZbImN4LnRvd2VyLnZhcmlhYmxlLnZhbHVlIl0uY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidmFyaWFibGVfaWQiOiBjbHMudmFyaWFibGVfb3MuaWQsCiAgICAgICAgICAgICAgICAidmFsdWVfY2hhciI6ICJXaW5kb3dzIDJrIiwKICAgICAgICAgICAgICAgICJwbGFuX2xpbmVfYWN0aW9uX2lkIjogY2xzLnBsYW5fM19saW5lXzFfYWN0aW9uLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIGNscy5zZXJ2ZXIgPSBjbHMuU2VydmVyLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiUGxhbiBUZXN0IFNlcnZlciIsCiAgICAgICAgICAgICAgICAic3NoX3VzZXJuYW1lIjogInRlc3QiLAogICAgICAgICAgICAgICAgInNzaF9wYXNzd29yZCI6ICJ0ZXN0IiwKICAgICAgICAgICAgICAgICJpcF92NF9hZGRyZXNzIjogImxvY2FsaG9zdCIsCiAgICAgICAgICAgICAgICAic3NoX3BvcnQiOiAyMiwKICAgICAgICAgICAgICAgICJ1c2VyX2lkcyI6IFsoNiwgMCwgW2Nscy51c2VyLmlkXSldLAogICAgICAgICAgICAgICAgIm1hbmFnZXJfaWRzIjogWyg2LCAwLCBbY2xzLm1hbmFnZXIuaWRdKV0sCiAgICAgICAgICAgICAgICAic2tpcF9ob3N0X2tleSI6IFRydWUsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgZGVmIF9jcmVhdGVfcGxhbihzZWxmLCAqKmt3YXJncyk6CiAgICAgICAgIiIiSGVscGVyIG1ldGhvZCB0byBjcmVhdGUgYSBmbGlnaHQgcGxhbi4iIiIKICAgICAgICB2YWxzID0gewogICAgICAgICAgICAibmFtZSI6ICJUZXN0IEZsaWdodCBQbGFuIiwKICAgICAgICAgICAgImFjY2Vzc19sZXZlbCI6ICIxIiwgICMgb3ZlcnJpZGUgZGVmYXVsdCBmb3IgdXNlciB0ZXN0cwogICAgICAgICAgICAidXNlcl9pZHMiOiBbKDYsIDAsIFtdKV0sCiAgICAgICAgICAgICJtYW5hZ2VyX2lkcyI6IFsoNiwgMCwgW10pXSwKICAgICAgICAgICAgInNlcnZlcl9pZHMiOiBbKDYsIDAsIFtdKV0sCiAgICAgICAgfQogICAgICAgIGlmIGt3YXJnczoKICAgICAgICAgICAgdmFscy51cGRhdGUoa3dhcmdzKQogICAgICAgIHJldHVybiBzZWxmLlBsYW4uY3JlYXRlKHZhbHMpCgogICAgZGVmIHRlc3RfdXNlcl9yZWFkX2FjY2VzcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBGb3IgYSB1c2VyOgogICAgICAgICAgUmVhZCBhY2Nlc3MgaXMgYWxsb3dlZCBpZiBhY2Nlc3NfbGV2ZWwgPT0gIjEiIGFuZAogICAgICAgICAgZWl0aGVyIHRoZSBwbGFuJ3Mgb3duIHVzZXJfaWRzIGluY2x1ZGVzIHRoZSB1c2VyCiAgICAgICAgICBPUiBhdCBsZWFzdCBvbmUgcmVsYXRlZCBzZXJ2ZXIgKHZpYSBzZXJ2ZXJfaWRzKQogICAgICAgICAgaW5jbHVkZXMgdGhlIHVzZXIgaW4gaXRzIHVzZXJfaWRzLgogICAgICAgICIiIgogICAgICAgICMgQ2FzZSAxOiBQbGFuIHdpdGggYWNjZXNzX2xldmVsICIxIiBhbmQgdXNlcgogICAgICAgICMgaW5jbHVkZWQgaW4gcGxhbi51c2VyX2lkcy4KICAgICAgICBwbGFuMSA9IHNlbGYuX2NyZWF0ZV9wbGFuKAogICAgICAgICAgICAqKnsKICAgICAgICAgICAgICAgICJhY2Nlc3NfbGV2ZWwiOiAiMSIsCiAgICAgICAgICAgICAgICAidXNlcl9pZHMiOiBbKDYsIDAsIFtzZWxmLnVzZXIuaWRdKV0sCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgcmVjczEgPSBzZWxmLlBsYW4ud2l0aF91c2VyKHNlbGYudXNlcikuc2VhcmNoKFsoImlkIiwgIj0iLCBwbGFuMS5pZCldKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgIHBsYW4xLAogICAgICAgICAgICByZWNzMSwKICAgICAgICAgICAgIlVzZXIgc2hvdWxkIHNlZSB0aGUgcGxhbiBpZiBpbiAiICJwbGFuLnVzZXJfaWRzIGFuZCBhY2Nlc3NfbGV2ZWwgPT0gJzEnLiIsCiAgICAgICAgKQoKICAgICAgICAjIENhc2UgMjogUGxhbiB3aXRoIGFjY2Vzc19sZXZlbCAiMSIgd2l0aCBubyBkaXJlY3QgdXNlcl9pZHMsCiAgICAgICAgIyBidXQgd2l0aCBhIHJlbGF0ZWQgc2VydmVyIHRoYXQgZ3JhbnRzIGFjY2Vzcy4KICAgICAgICBwbGFuMiA9IHNlbGYuX2NyZWF0ZV9wbGFuKAogICAgICAgICAgICAqKnsKICAgICAgICAgICAgICAgICJhY2Nlc3NfbGV2ZWwiOiAiMSIsCiAgICAgICAgICAgICAgICAidXNlcl9pZHMiOiBbKDYsIDAsIFtdKV0sCiAgICAgICAgICAgICAgICAic2VydmVyX2lkcyI6IFsoNiwgMCwgW3NlbGYuc2VydmVyLmlkXSldLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHJlY3MyID0gc2VsZi5QbGFuLndpdGhfdXNlcihzZWxmLnVzZXIpLnNlYXJjaChbKCJpZCIsICI9IiwgcGxhbjIuaWQpXSkKICAgICAgICBzZWxmLmFzc2VydEluKAogICAgICAgICAgICBwbGFuMiwKICAgICAgICAgICAgcmVjczIsCiAgICAgICAgICAgICJVc2VyIHNob3VsZCBzZWUgdGhlIHBsYW4gaWYgYSAiCiAgICAgICAgICAgICJyZWxhdGVkIHNlcnZlci51c2VyX2lkcyBpbmNsdWRlcyB0aGUgdXNlci4iLAogICAgICAgICkKCiAgICAgICAgIyBOZWdhdGl2ZTogUGxhbiB3aXRoIGFjY2Vzc19sZXZlbCAiMSIKICAgICAgICAjIHdpdGggbmVpdGhlciBkaXJlY3Qgbm9yIHNlcnZlci1iYXNlZCBhY2Nlc3MuCiAgICAgICAgcGxhbjMgPSBzZWxmLl9jcmVhdGVfcGxhbigKICAgICAgICAgICAgKip7CiAgICAgICAgICAgICAgICAiYWNjZXNzX2xldmVsIjogIjEiLAogICAgICAgICAgICAgICAgInVzZXJfaWRzIjogWyg2LCAwLCBbXSldLAogICAgICAgICAgICAgICAgInNlcnZlcl9pZHMiOiBbKDYsIDAsIFtdKV0sCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgcmVjczMgPSBzZWxmLlBsYW4ud2l0aF91c2VyKHNlbGYudXNlcikuc2VhcmNoKFsoImlkIiwgIj0iLCBwbGFuMy5pZCldKQogICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oCiAgICAgICAgICAgIHBsYW4zLAogICAgICAgICAgICByZWNzMywKICAgICAgICAgICAgIlVzZXIgc2hvdWxkIG5vdCBzZWUgdGhlIHBsYW4gaWYgbm90IGdyYW50ZWQgYWNjZXNzLiIsCiAgICAgICAgKQoKICAgICAgICAjIEFsc28sIGEgdXNlciBzaG91bGQgbm90IGJlIGFsbG93ZWQgdG8gY3JlYXRlIGEgcGxhbi4KICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEFjY2Vzc0Vycm9yKToKICAgICAgICAgICAgc2VsZi5QbGFuLndpdGhfdXNlcihzZWxmLnVzZXIpLmNyZWF0ZSgKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IFBsYW4iLAogICAgICAgICAgICAgICAgICAgICJhY2Nlc3NfbGV2ZWwiOiAiMSIsCiAgICAgICAgICAgICAgICAgICAgInVzZXJfaWRzIjogWyg2LCAwLCBbc2VsZi51c2VyLmlkXSldLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApCiAgICAgICAgIyAuLi5hbmQgbW9kaWZ5IGEgcGxhbiB0aGF0IHRoZXkgaGF2ZSBhY2Nlc3MgdG8uCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBY2Nlc3NFcnJvcik6CiAgICAgICAgICAgIHBsYW4xLndpdGhfdXNlcihzZWxmLnVzZXIpLndyaXRlKHsibmFtZSI6ICJVc2VyIFVwZGF0ZWQgUGxhbiJ9KQoKICAgIGRlZiB0ZXN0X21hbmFnZXJfcmVhZF9hY2Nlc3Moc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgRm9yIGEgbWFuYWdlcjoKICAgICAgICAgIFJlYWQgYWNjZXNzIGlzIGFsbG93ZWQgaWYgYWNjZXNzX2xldmVsIDw9ICIyIiBBTkQKICAgICAgICAgIEVJVEhFUiB0aGUgcGxhbiBpdHNlbGYgZ3JhbnRzIGFjY2VzcwogICAgICAgICAgKGl0cyB1c2VyX2lkcyBvciBtYW5hZ2VyX2lkcyBpbmNsdWRlcyB0aGUgbWFuYWdlcikKICAgICAgICAgIE9SIGVpdGhlciB0aGVyZSBhcmUgbm8gcmVsYXRlZCBzZXJ2ZXJzIE9SIGEgcmVsYXRlZCBzZXJ2ZXIKICAgICAgICAgIGdyYW50cyBhY2Nlc3MgKGl0cyB1c2VyX2lkcyBvciBtYW5hZ2VyX2lkcyBpbmNsdWRlcyB0aGUgbWFuYWdlcikuCiAgICAgICAgIiIiCiAgICAgICAgIyBDYXNlIDE6IFBsYW4gd2l0aCBhY2Nlc3NfbGV2ZWwgIjIiIGFuZCBwbGFuLm1hbmFnZXJfaWRzCiAgICAgICAgIyBpbmNsdWRlcyB0aGUgbWFuYWdlci4KICAgICAgICBwbGFuMSA9IHNlbGYuX2NyZWF0ZV9wbGFuKAogICAgICAgICAgICAqKnsKICAgICAgICAgICAgICAgICJhY2Nlc3NfbGV2ZWwiOiAiMiIsCiAgICAgICAgICAgICAgICAibWFuYWdlcl9pZHMiOiBbKDYsIDAsIFtzZWxmLm1hbmFnZXIuaWRdKV0sCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgcmVjczEgPSBzZWxmLlBsYW4ud2l0aF91c2VyKHNlbGYubWFuYWdlcikuc2VhcmNoKFsoImlkIiwgIj0iLCBwbGFuMS5pZCldKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgIHBsYW4xLAogICAgICAgICAgICByZWNzMSwKICAgICAgICAgICAgIk1hbmFnZXIgc2hvdWxkIHNlZSB0aGUgcGxhbiBpZiBpbiAiCiAgICAgICAgICAgICJwbGFuLm1hbmFnZXJfaWRzIGFuZCBhY2Nlc3NfbGV2ZWwgPD0gJzInLiIsCiAgICAgICAgKQoKICAgICAgICAjIENhc2UgMjogUGxhbiB3aXRoIGFjY2Vzc19sZXZlbCAiMiIgdGhhdCBkb2VzIG5vdCBncmFudCBkaXJlY3QgYWNjZXNzLAogICAgICAgICMgYnV0IGEgcmVsYXRlZCBzZXJ2ZXIgZ3JhbnRzIGFjY2VzcyB2aWEgaXRzIG1hbmFnZXJfaWRzLgogICAgICAgIHBsYW4yID0gc2VsZi5fY3JlYXRlX3BsYW4oCiAgICAgICAgICAgICoqewogICAgICAgICAgICAgICAgImFjY2Vzc19sZXZlbCI6ICIyIiwKICAgICAgICAgICAgICAgICJ1c2VyX2lkcyI6IFsoNiwgMCwgW10pXSwKICAgICAgICAgICAgICAgICJtYW5hZ2VyX2lkcyI6IFsoNiwgMCwgW10pXSwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWRzIjogWyg2LCAwLCBbc2VsZi5zZXJ2ZXIuaWRdKV0sCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgcmVjczIgPSBzZWxmLlBsYW4ud2l0aF91c2VyKHNlbGYubWFuYWdlcikuc2VhcmNoKFsoImlkIiwgIj0iLCBwbGFuMi5pZCldKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgIHBsYW4yLAogICAgICAgICAgICByZWNzMiwKICAgICAgICAgICAgIk1hbmFnZXIgc2hvdWxkIHNlZSB0aGUgcGxhbiBpZiByZWxhdGVkICIKICAgICAgICAgICAgInNlcnZlci5tYW5hZ2VyX2lkcyBpbmNsdWRlcyB0aGUgbWFuYWdlci4iLAogICAgICAgICkKCiAgICAgICAgIyBDYXNlIDMgbmVnYXRpdmU6IFBsYW4gd2l0aCBhY2Nlc3NfbGV2ZWwgIjIiIHdpdGggbm8gZ3JhbnRlZCBhY2Nlc3MKICAgICAgICAjIGlmIGl0J3MgbGlua2VkIHRvIGEgc2VydmVyIHRoYXQgZG9lcyBub3QgZ3JhbnQgYWNjZXNzLgogICAgICAgIHBsYW4zID0gc2VsZi5fY3JlYXRlX3BsYW4oCiAgICAgICAgICAgICoqewogICAgICAgICAgICAgICAgImFjY2Vzc19sZXZlbCI6ICIyIiwKICAgICAgICAgICAgICAgICJ1c2VyX2lkcyI6IFsoNiwgMCwgW10pXSwKICAgICAgICAgICAgICAgICJtYW5hZ2VyX2lkcyI6IFsoNiwgMCwgW10pXSwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWRzIjogWyg2LCAwLCBbc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkXSldLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHJlY3MzID0gc2VsZi5QbGFuLndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLnNlYXJjaChbKCJpZCIsICI9IiwgcGxhbjMuaWQpXSkKICAgICAgICBzZWxmLmFzc2VydE5vdEluKAogICAgICAgICAgICBwbGFuMywKICAgICAgICAgICAgcmVjczMsCiAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCBub3Qgc2VlIHRoZSBwbGFuICIKICAgICAgICAgICAgImlmIG5vdCBncmFudGVkIGFjY2VzcyB0byByZWxhdGVkIHNlcnZlci4iLAogICAgICAgICkKCiAgICAgICAgIyBDYXNlIDQgcG9zaXRpdmU6IFBsYW4gd2l0aCBhY2Nlc3NfbGV2ZWwgIjIiIHdpdGggbm8gbGlua2VkIHNlcnZlcnMKICAgICAgICAjIGFuZCBubyByZWxhdGVkIHNlcnZlcnMgdGhhdCBncmFudCBhY2Nlc3MuCiAgICAgICAgcGxhbjQgPSBzZWxmLl9jcmVhdGVfcGxhbigKICAgICAgICAgICAgKip7CiAgICAgICAgICAgICAgICAiYWNjZXNzX2xldmVsIjogIjIiLAogICAgICAgICAgICAgICAgInVzZXJfaWRzIjogWyg2LCAwLCBbXSldLAogICAgICAgICAgICAgICAgIm1hbmFnZXJfaWRzIjogWyg2LCAwLCBbXSldLAogICAgICAgICAgICAgICAgInNlcnZlcl9pZHMiOiBbKDYsIDAsIFtdKV0sCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgcmVjczQgPSBzZWxmLlBsYW4ud2l0aF91c2VyKHNlbGYubWFuYWdlcikuc2VhcmNoKFsoImlkIiwgIj0iLCBwbGFuNC5pZCldKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgIHBsYW40LAogICAgICAgICAgICByZWNzNCwKICAgICAgICAgICAgIk1hbmFnZXIgc2hvdWxkIHNlZSB0aGUgcGxhbiBpZiBub3QgbGlua2VkIHRvIGFueSBzZXJ2ZXJzLiIsCiAgICAgICAgKQoKICAgICAgICAjIENhc2UgNSBuZWdhdGl2ZTogcmFpc2UgYWNjZXNzIGxldmVsIHRvIDMKICAgICAgICAjIGFuZCBjaGVjayBpZiBtYW5hZ2VyIGNhbiBzZWUgdGhlIHBsYW4KICAgICAgICBwbGFuNC5hY2Nlc3NfbGV2ZWwgPSAiMyIKICAgICAgICByZWNzNSA9IHNlbGYuUGxhbi53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS5zZWFyY2goWygiaWQiLCAiPSIsIHBsYW40LmlkKV0pCiAgICAgICAgc2VsZi5hc3NlcnROb3RJbigKICAgICAgICAgICAgcGxhbjQsCiAgICAgICAgICAgIHJlY3M1LAogICAgICAgICAgICAiTWFuYWdlciBzaG91bGQgbm90IHNlZSB0aGUgcGxhbiAiICJpZiBhY2Nlc3MgbGV2ZWwgaXMgcmFpc2VkIHRvIDMuIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfbWFuYWdlcl93cml0ZV9jcmVhdGVfYWNjZXNzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEZvciBhIG1hbmFnZXI6CiAgICAgICAgICBXcml0ZSAodXBkYXRlKSBhbmQgY3JlYXRlIGFjY2VzcyBhcmUgYWxsb3dlZCBpZiBhY2Nlc3NfbGV2ZWwgPD0gIjIiIEFORAogICAgICAgICAgdGhlIHBsYW4ncyBvd24gbWFuYWdlcl9pZHMgaW5jbHVkZXMgdGhlIG1hbmFnZXIuCiAgICAgICAgIiIiCiAgICAgICAgIyBDYXNlIDE6IFBsYW4gd2l0aCBhY2Nlc3NfbGV2ZWwgIjIiIGFuZCBwbGFuLm1hbmFnZXJfaWRzCiAgICAgICAgIyAgaW5jbHVkZXMgdGhlIG1hbmFnZXIgc2hvdWxkIGFsbG93IHRvIHVwZGF0ZSB0aGUgcGxhbi4KICAgICAgICBwbGFuMSA9IHNlbGYuX2NyZWF0ZV9wbGFuKAogICAgICAgICAgICAqKnsKICAgICAgICAgICAgICAgICJhY2Nlc3NfbGV2ZWwiOiAiMiIsCiAgICAgICAgICAgICAgICAibWFuYWdlcl9pZHMiOiBbKDYsIDAsIFtzZWxmLm1hbmFnZXIuaWRdKV0sCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgdHJ5OgogICAgICAgICAgICBwbGFuMS53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS53cml0ZSh7Im5hbWUiOiAiTWFuYWdlciBVcGRhdGVkIFBsYW4ifSkKICAgICAgICBleGNlcHQgQWNjZXNzRXJyb3I6CiAgICAgICAgICAgIHNlbGYuZmFpbCgKICAgICAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCBiZSBhYmxlIHRvIHVwZGF0ZSB0aGUgcGxhbiBpZiAiICJpbiBwbGFuLm1hbmFnZXJfaWRzLiIsCiAgICAgICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBwbGFuMS53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS5uYW1lLAogICAgICAgICAgICAiTWFuYWdlciBVcGRhdGVkIFBsYW4iLAogICAgICAgICkKCiAgICAgICAgIyBDYXNlIDI6IEF0dGVtcHQgdG8gY3JlYXRlIGEgcGxhbiBhcyBhIG1hbmFnZXIgd2l0aG91dAogICAgICAgICMgIGluY2x1ZGluZyB0aGVpciBJRCBpbiBtYW5hZ2VyX2lkcyBzaG91bGQgZmFpbC4KICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEFjY2Vzc0Vycm9yKToKICAgICAgICAgICAgc2VsZi5QbGFuLndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLmNyZWF0ZSgKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJNYW5hZ2VyIENyZWF0ZWQgUGxhbiIsCiAgICAgICAgICAgICAgICAgICAgImFjY2Vzc19sZXZlbCI6ICIyIiwKICAgICAgICAgICAgICAgICAgICAibWFuYWdlcl9pZHMiOiBbKDYsIDAsIFtdKV0sCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkKCiAgICAgICAgIyBDYXNlIDM6IENyZWF0ZSBhIHBsYW4gd2l0aCBtYW5hZ2VyIGFkZGVkIHRvIG1hbmFnZXJfaWRzCiAgICAgICAgIyBzaG91bGQgYmUgYWxsb3dlZC4KICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuUGxhbi53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS5jcmVhdGUoCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiTWFuYWdlciBDcmVhdGVkIFBsYW4iLAogICAgICAgICAgICAgICAgICAgICJhY2Nlc3NfbGV2ZWwiOiAiMiIsCiAgICAgICAgICAgICAgICAgICAgIm1hbmFnZXJfaWRzIjogWyg2LCAwLCBbc2VsZi5tYW5hZ2VyLmlkXSldLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApCiAgICAgICAgZXhjZXB0IEFjY2Vzc0Vycm9yOgogICAgICAgICAgICBzZWxmLmZhaWwoCiAgICAgICAgICAgICAgICAiTWFuYWdlciBzaG91bGQgYmUgYWJsZSB0byBjcmVhdGUgYSBwbGFuICIKICAgICAgICAgICAgICAgICJ3aXRoIGhpbXNlbGYgYWRkZWQgdG8gbWFuYWdlcl9pZHMuIiwKICAgICAgICAgICAgKQoKICAgIGRlZiB0ZXN0X21hbmFnZXJfdW5saW5rX2FjY2VzcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBGb3IgYSBtYW5hZ2VyOgogICAgICAgICAgVW5saW5rIChkZWxldGUpIGFjY2VzcyBpcyBhbGxvd2VkIGlmIGFjY2Vzc19sZXZlbCA8PSAiMiIsCiAgICAgICAgICB0aGUgY3VycmVudCB1c2VyIGlzIHRoZSByZWNvcmQgY3JlYXRvciwKICAgICAgICAgIEFORCB0aGUgcGxhbidzIG93biBtYW5hZ2VyX2lkcyBpbmNsdWRlcyB0aGUgbWFuYWdlci4KICAgICAgICAiIiIKICAgICAgICAjIFNjZW5hcmlvIDE6IFBsYW4gY3JlYXRlZCBieSB0aGUgbWFuYWdlciB3aXRoIHBsYW4ubWFuYWdlcl9pZHMKICAgICAgICAjIGluY2x1ZGluZyB0aGUgbWFuYWdlci4KICAgICAgICBwbGFuMSA9IHNlbGYuUGxhbi53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIk1hbmFnZXIgQ3JlYXRlZCBQbGFuIiwKICAgICAgICAgICAgICAgICJhY2Nlc3NfbGV2ZWwiOiAiMiIsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgdHJ5OgogICAgICAgICAgICBwbGFuMS51bmxpbmsoKQogICAgICAgIGV4Y2VwdCBBY2Nlc3NFcnJvcjoKICAgICAgICAgICAgc2VsZi5mYWlsKAogICAgICAgICAgICAgICAgIk1hbmFnZXIgc2hvdWxkIGJlIGFibGUgdG8gZGVsZXRlIHRoZSBwbGFuICIKICAgICAgICAgICAgICAgICJ0aGV5IGNyZWF0ZWQgaWYgaW4gcGxhbi5tYW5hZ2VyX2lkcy4iLAogICAgICAgICAgICApCgogICAgICAgICMgU2NlbmFyaW8gMjogUGxhbiBjcmVhdGVkIGJ5IGFub3RoZXIgdXNlciwgZXZlbiBpZgogICAgICAgICMgcGxhbi5tYW5hZ2VyX2lkcyBpbmNsdWRlcyB0aGUgbWFuYWdlci4KICAgICAgICBwbGFuMiA9IHNlbGYuX2NyZWF0ZV9wbGFuKAogICAgICAgICAgICAqKnsKICAgICAgICAgICAgICAgICJhY2Nlc3NfbGV2ZWwiOiAiMiIsCiAgICAgICAgICAgICAgICAibWFuYWdlcl9pZHMiOiBbKDYsIDAsIFtzZWxmLm1hbmFnZXIuaWRdKV0sCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBY2Nlc3NFcnJvcik6CiAgICAgICAgICAgIHBsYW4yLndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLnVubGluaygpCgogICAgZGVmIHRlc3Rfcm9vdF91bnJlc3RyaWN0ZWRfYWNjZXNzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEZvciBhIHJvb3QgdXNlcjoKICAgICAgICAgIFVubGltaXRlZCBhY2Nlc3M6IHJvb3QgY2FuIHJlYWQsIHdyaXRlLCBjcmVhdGUsIGFuZCBkZWxldGUgcGxhbnMKICAgICAgICAgICByZWdhcmRsZXNzIG9mIGFjY2Vzc19sZXZlbCBvciByZWxhdGVkIHNlcnZlcnMuCiAgICAgICAgIiIiCiAgICAgICAgcGxhbiA9IHNlbGYuX2NyZWF0ZV9wbGFuKAogICAgICAgICAgICAqKnsKICAgICAgICAgICAgICAgICJhY2Nlc3NfbGV2ZWwiOiAiMyIsICAjIGFib3ZlIHRocmVzaG9sZCBmb3IgbWFuYWdlcnMKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICByZWNzID0gc2VsZi5QbGFuLndpdGhfdXNlcihzZWxmLnJvb3QpLnNlYXJjaChbKCJpZCIsICI9IiwgcGxhbi5pZCldKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgIHBsYW4sCiAgICAgICAgICAgIHJlY3MsCiAgICAgICAgICAgICJSb290IHNob3VsZCBzZWUgdGhlIHBsYW4gcmVnYXJkbGVzcyBvZiByZXN0cmljdGlvbnMuIiwKICAgICAgICApCiAgICAgICAgdHJ5OgogICAgICAgICAgICBwbGFuLndpdGhfdXNlcihzZWxmLnJvb3QpLndyaXRlKHsibmFtZSI6ICJSb290IFVwZGF0ZWQgUGxhbiJ9KQogICAgICAgIGV4Y2VwdCBBY2Nlc3NFcnJvcjoKICAgICAgICAgICAgc2VsZi5mYWlsKCJSb290IHNob3VsZCBiZSBhYmxlIHRvIHVwZGF0ZSB0aGUgcGxhbiB3aXRob3V0IHJlc3RyaWN0aW9ucy4iKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGxhbi53aXRoX3VzZXIoc2VsZi5yb290KS5uYW1lLCAiUm9vdCBVcGRhdGVkIFBsYW4iKQogICAgICAgIHBsYW4yID0gc2VsZi5QbGFuLndpdGhfdXNlcihzZWxmLnJvb3QpLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiUm9vdCBDcmVhdGVkIFBsYW4iLAogICAgICAgICAgICAgICAgImFjY2Vzc19sZXZlbCI6ICIzIiwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydFRydWUoCiAgICAgICAgICAgIHBsYW4yLAogICAgICAgICAgICAiUm9vdCBzaG91bGQgYmUgYWJsZSB0byBjcmVhdGUgYSBwbGFuIHdpdGhvdXQgcmVzdHJpY3Rpb25zLiIsCiAgICAgICAgKQogICAgICAgIHBsYW4yLndpdGhfdXNlcihzZWxmLnJvb3QpLnVubGluaygpCiAgICAgICAgcmVjc19hZnRlciA9IHNlbGYuUGxhbi53aXRoX3VzZXIoc2VsZi5yb290KS5zZWFyY2goWygiaWQiLCAiPSIsIHBsYW4yLmlkKV0pCiAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgKICAgICAgICAgICAgcmVjc19hZnRlciwKICAgICAgICAgICAgIlJvb3Qgc2hvdWxkIGJlIGFibGUgdG8gZGVsZXRlIHRoZSBwbGFuIHdpdGhvdXQgcmVzdHJpY3Rpb25zLiIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3BsYW5fbGluZV9hY3Rpb25fbmFtZShzZWxmKToKICAgICAgICAiIiJUZXN0IHBsYW4gbGluZSBhY3Rpb24gbmFtaW5nIiIiCgogICAgICAgICMgQWRkIG5ldyBsaW5lCiAgICAgICAgcGxhbl9saW5lXzEgPSBzZWxmLnBsYW5fbGluZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJwbGFuX2lkIjogc2VsZi5wbGFuXzEuaWQsCiAgICAgICAgICAgICAgICAiY29tbWFuZF9pZCI6IHNlbGYuY29tbWFuZF9jcmVhdGVfZGlyLmlkLAogICAgICAgICAgICAgICAgInNlcXVlbmNlIjogMTAsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgQWRkIG5ldyBhY3Rpb24gd2l0aCBjdXN0b20KICAgICAgICBhY3Rpb25fMSA9IHNlbGYucGxhbl9saW5lX2FjdGlvbi5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJsaW5lX2lkIjogcGxhbl9saW5lXzEuaWQsCiAgICAgICAgICAgICAgICAiY29uZGl0aW9uIjogIj09IiwKICAgICAgICAgICAgICAgICJ2YWx1ZV9jaGFyIjogIjM1IiwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiZSIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgQ2hlY2sgaWYgYWN0aW9uIG5hbWUgaXMgY29tcG9zZWQgY29ycmVjdGx5CiAgICAgICAgZXhwZWN0ZWRfYWN0aW9uX3N0cmluZyA9IF8oCiAgICAgICAgICAgICJJZiBleGl0IGNvZGUgPT0gMzUgdGhlbiBFeGl0IHdpdGggY29tbWFuZCBleGl0IGNvZGUiCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGFjdGlvbl8xLm5hbWUsCiAgICAgICAgICAgIGV4cGVjdGVkX2FjdGlvbl9zdHJpbmcsCiAgICAgICAgICAgIG1zZz0iQWN0aW9uIG5hbWUgZG9lc24ndCBtYXRjaCBleHBlY3RlZCBvbmUiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9wbGFuX2dldF9uZXh0X2FjdGlvbl92YWx1ZXMoc2VsZik6CiAgICAgICAgIiIiVGVzdCBfZ2V0X25leHRfYWN0aW9uX3ZhbHVlcygpCgogICAgICAgIE5COiBUaGlzIHRlc3QgcmVsaWVzIG9uIGRlbW8gZGF0YSBhbmQgbWlnaHQgZmFpbCBpZiBpdCBpcyBtb2RpZmllZAogICAgICAgICIiIgogICAgICAgICMgRW5zdXJlIGRlbW8gZGF0ZSBpbnRlZ3JpdHkganVzdCBpbiBjYXNlIGRlbW8gZGF0ZSBpcyBtb2RpZmllZAogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHNlbGYucGxhbl8xLmxpbmVfaWRzWzBdLmFjdGlvbl9pZHNbMV0uY3VzdG9tX2V4aXRfY29kZSwKICAgICAgICAgICAgMjU1LAogICAgICAgICAgICAiUGxhbiAxIGxpbmUgIzEgYWN0aW9uICMyIGN1c3RvbSBleGl0IGNvZGUgbXVzdCBiZSBlcXVhbCB0byAyNTUiLAogICAgICAgICkKCiAgICAgICAgIyBDcmVhdGUgYSBuZXcgcGxhbiBsb2cuCiAgICAgICAgcGxhbl9saW5lXzEgPSBzZWxmLnBsYW5fMS5saW5lX2lkc1swXSAgIyBVc2luZyBjb21tYW5kIDEgZnJvbSBQbGFuIDEKICAgICAgICBwbGFuX2xvZyA9IHNlbGYuUGxhbkxvZy5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWQiOiBzZWxmLnNlcnZlcl90ZXN0XzEuaWQsCiAgICAgICAgICAgICAgICAicGxhbl9pZCI6IHNlbGYucGxhbl8xLmlkLAogICAgICAgICAgICAgICAgImlzX3J1bm5pbmciOiBUcnVlLAogICAgICAgICAgICAgICAgInN0YXJ0X2RhdGUiOiBmaWVsZHMuRGF0ZXRpbWUubm93KCksCiAgICAgICAgICAgICAgICAicGxhbl9saW5lX2V4ZWN1dGVkX2lkIjogcGxhbl9saW5lXzEuaWQsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgIyBUZXN0IHdpdGggZXhpdCBjb2RlID09IDAKICAgICAgICAjIE11c3QgcnVuIHRoZSBuZXh0IGNvbW1hbmQKICAgICAgICAjICoqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgIGNvbW1hbmRfbG9nID0gc2VsZi5Db21tYW5kTG9nLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInBsYW5fbG9nX2lkIjogcGxhbl9sb2cuaWQsCiAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkLAogICAgICAgICAgICAgICAgImNvbW1hbmRfaWQiOiBwbGFuX2xpbmVfMS5jb21tYW5kX2lkLmlkLAogICAgICAgICAgICAgICAgImNvbW1hbmRfcmVzcG9uc2UiOiAiT2siLAogICAgICAgICAgICAgICAgImNvbW1hbmRfc3RhdHVzIjogMCwgICMgRXJyb3IgY29kZQogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIGFjdGlvbiwgZXhpdF9jb2RlLCBuZXh0X2xpbmVfaWQgPSBzZWxmLnBsYW5fMS5fZ2V0X25leHRfYWN0aW9uX3ZhbHVlcygKICAgICAgICAgICAgY29tbWFuZF9sb2cKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3Rpb24sICJuIiwgbXNnPSJBY3Rpb24gbXVzdCBiZSAnUnVuIG5leHQgYWN0aW9uJyIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleGl0X2NvZGUsIDAsIG1zZz0iRXhpdCBjb2RlIG11c3QgYmUgZXF1YWwgdG8gMCIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbmV4dF9saW5lX2lkLAogICAgICAgICAgICBzZWxmLnBsYW5fbGluZV8yLAogICAgICAgICAgICBtc2c9Ik5leHQgbGluZSBtdXN0IGJlIExpbmUgIzIiLAogICAgICAgICkKCiAgICAgICAgIyAqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICAjIFRlc3Qgd2l0aCBleGl0IGNvZGUgPT0gOAogICAgICAgICMgTXVzdCBleGl0IHdpdGggY3VzdG9tIGNvZGUKICAgICAgICAjICoqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgIGNvbW1hbmRfbG9nLmNvbW1hbmRfc3RhdHVzID0gOAoKICAgICAgICBhY3Rpb24sIGV4aXRfY29kZSwgbmV4dF9saW5lX2lkID0gc2VsZi5wbGFuXzEuX2dldF9uZXh0X2FjdGlvbl92YWx1ZXMoCiAgICAgICAgICAgIGNvbW1hbmRfbG9nCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWN0aW9uLCAiZWMiLCBtc2c9IkFjdGlvbiBtdXN0IGJlICdFeGl0IHdpdGggY3VzdG9tIGNvZGUnIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4aXRfY29kZSwgMjU1LCBtc2c9IkV4aXQgY29kZSBtdXN0IGJlIGVxdWFsIHRvIDI1NSIpCiAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUobmV4dF9saW5lX2lkLCBtc2c9Ik5leHQgbGluZSBtdXN0IGJlIE5vbmUiKQoKICAgICAgICAjICoqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICMgVGVzdCB3aXRoIGV4aXQgY29kZSA9PSAtMTIKICAgICAgICAjIFBsYW4gb24gZXJyb3IgYWN0aW9uIG11c3QgYmUgdHJpZ2dlcmVkIGJlY2F1c2Ugbm8gYWN0aW9uIGNvbmRpdGlvbiBpcyBtYXRjaGVkCiAgICAgICAgIyAqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICBjb21tYW5kX2xvZy5jb21tYW5kX3N0YXR1cyA9IC0xMgoKICAgICAgICBhY3Rpb24sIGV4aXRfY29kZSwgbmV4dF9saW5lX2lkID0gc2VsZi5wbGFuXzEuX2dldF9uZXh0X2FjdGlvbl92YWx1ZXMoCiAgICAgICAgICAgIGNvbW1hbmRfbG9nCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWN0aW9uLCAiZSIsIG1zZz0iQWN0aW9uIG11c3QgYmUgJ0V4aXQgd2l0aCBjb21tYW5kIGNvZGUnIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4aXRfY29kZSwgLTEyLCBtc2c9IkV4aXQgY29kZSBtdXN0IGJlIGVxdWFsIHRvIC0xMiIpCiAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUobmV4dF9saW5lX2lkLCBtc2c9Ik5leHQgbGluZSBtdXN0IGJlIE5vbmUiKQoKICAgICAgICAjICoqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICMgQ2hhbmdlIFBsYW4gJ09uIGVycm9yIGFjdGlvbicgb2YgdGhlIHBsYW4gdG8gJ1J1biBuZXh0IGNvbW1hbmQnCiAgICAgICAgIyBOZXh0IGxpbmUgbXVzdCBiZSBMaW5lICMyCiAgICAgICAgIyAqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICAgICAgY29tbWFuZF9sb2cuY29tbWFuZF9zdGF0dXMgPSAtMTIKICAgICAgICBzZWxmLnBsYW5fMS5vbl9lcnJvcl9hY3Rpb24gPSAibiIKCiAgICAgICAgYWN0aW9uLCBleGl0X2NvZGUsIG5leHRfbGluZV9pZCA9IHNlbGYucGxhbl8xLl9nZXRfbmV4dF9hY3Rpb25fdmFsdWVzKAogICAgICAgICAgICBjb21tYW5kX2xvZwogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFjdGlvbiwgIm4iLCBtc2c9IkFjdGlvbiBtdXN0IGJlICdSdW4gbmV4dCBhY3Rpb24nIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4aXRfY29kZSwgLTEyLCBtc2c9IkV4aXQgY29kZSBtdXN0IGJlIGVxdWFsIHRvIC0xMiIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbmV4dF9saW5lX2lkLAogICAgICAgICAgICBzZWxmLnBsYW5fbGluZV8yLAogICAgICAgICAgICBtc2c9Ik5leHQgbGluZSBtdXN0IGJlIExpbmUgIzIiLAogICAgICAgICkKCiAgICAgICAgIyAqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICAjIFJ1biBMaW5lIDIgKHRoZSBsYXN0IG9uZSkuCiAgICAgICAgIyBBY3Rpb24gMiB3aWxsIGJlIHRyaWdnZXJlZCB3aGljaCBpcyAiUnVuIG5leHQgbGluZSIuCiAgICAgICAgIyBIb3dldmVyIGJlY2F1c2UgdGhpcyBpcyB0aGUgbGFzdCBsaW5lIG9mIHRoZSBwbGFuIG11c3QgZXhpdCB3aXRoIGNvbW1hbmQgY29kZS4KICAgICAgICAjICoqKioqKioqKioqKioqKioqKioqKioqKgoKICAgICAgICBwbGFuX2xpbmVfMiA9IHNlbGYucGxhbl8xLmxpbmVfaWRzWzFdCiAgICAgICAgcGxhbl9sb2cucGxhbl9saW5lX2V4ZWN1dGVkX2lkID0gcGxhbl9saW5lXzIuaWQKICAgICAgICBjb21tYW5kX2xvZy5jb21tYW5kX3N0YXR1cyA9IDMKCiAgICAgICAgYWN0aW9uLCBleGl0X2NvZGUsIG5leHRfbGluZV9pZCA9IHNlbGYucGxhbl8xLl9nZXRfbmV4dF9hY3Rpb25fdmFsdWVzKAogICAgICAgICAgICBjb21tYW5kX2xvZwogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFjdGlvbiwgImUiLCBtc2c9IkFjdGlvbiBtdXN0IGJlICdFeGl0IHdpdGggY29tbWFuZCBjb2RlJyIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleGl0X2NvZGUsIDMsIG1zZz0iRXhpdCBjb2RlIG11c3QgYmUgZXF1YWwgdG8gMyIpCiAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUobmV4dF9saW5lX2lkLCBtc2c9Ik5leHQgbGluZSBtdXN0IGJlIE5vbmUiKQoKICAgICAgICAjICoqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICMgUnVuIExpbmUgMiAodGhlIGxhc3Qgb25lKS4KICAgICAgICAjIEZhbGxiYWNrIHBsYW4gYWN0aW9uIG11c3QgYmUgdHJpZ2dlcmVkIGJlY2F1c2Ugbm8gYWN0aW9uIGNvbmRpdGlvbiBpcyBtYXRjaGVkCiAgICAgICAgIyBIb3dldmVyIGJlY2F1c2UgdGhpcyBpcyB0aGUgbGFzdCBsaW5lIG9mIHRoZSBwbGFuIG11c3QgZXhpdCB3aXRoIGNvbW1hbmQgY29kZS4KICAgICAgICAjICoqKioqKioqKioqKioqKioqKioqKioqKgoKICAgICAgICBjb21tYW5kX2xvZy5jb21tYW5kX3N0YXR1cyA9IDEKCiAgICAgICAgYWN0aW9uLCBleGl0X2NvZGUsIG5leHRfbGluZV9pZCA9IHNlbGYucGxhbl8xLl9nZXRfbmV4dF9hY3Rpb25fdmFsdWVzKAogICAgICAgICAgICBjb21tYW5kX2xvZwogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFjdGlvbiwgImUiLCBtc2c9IkFjdGlvbiBtdXN0IGJlICdFeGl0IHdpdGggY29tbWFuZCBjb2RlJyIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleGl0X2NvZGUsIDEsIG1zZz0iRXhpdCBjb2RlIG11c3QgYmUgZXF1YWwgdG8gMSIpCiAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUobmV4dF9saW5lX2lkLCBtc2c9Ik5leHQgbGluZSBtdXN0IGJlIE5vbmUiKQoKICAgIGRlZiB0ZXN0X3BsYW5fcnVuX3NpbmdsZShzZWxmKToKICAgICAgICAiIiJUZXN0IHBsYW4gZXhlY3V0aW9uIHJlc3VsdHMiIiIKCiAgICAgICAgIyBBZGQgdXNlciBhcyB1c2VyIHRvIFNlcnZlcjEKICAgICAgICBzZWxmLnNlcnZlcl90ZXN0XzEudXNlcl9pZHMgPSBbKDQsIHNlbGYudXNlcl9ib2IuaWQpXQoKICAgICAgICAjIEVuc3VyZSB0aGF0IGFjY2VzcyBlcnJvciBpcyByYWlzZWQKICAgICAgICAjIEJlY2F1c2UgdXNlcl9ib2IgaXMgbm90IGluIGFueSBUb3dlciBncm91cAogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQWNjZXNzRXJyb3IpOgogICAgICAgICAgICBzZWxmLnBsYW5fMS53aXRoX3VzZXIoc2VsZi51c2VyX2JvYikuX3J1bl9zaW5nbGUoc2VsZi5zZXJ2ZXJfdGVzdF8xKQoKICAgICAgICAjIEFkZCB1c2VyIHRvIHRoZSAiVXNlciIgZ3JvdXAKICAgICAgICBzZWxmLmFkZF90b19ncm91cChzZWxmLnVzZXJfYm9iLCAiY2V0bWl4X3Rvd2VyX3NlcnZlci5ncm91cF91c2VyIikKCiAgICAgICAgIyBFbnN1cmUgdGhhdCBhY2Nlc3MgZXJyb3IgaXMgcmFpc2VkCiAgICAgICAgIyBCZWNhdXNlIHBsYW4gYWNjZXNzIGxldmVsIGlzICJNYW5hZ2VyIiBhbmQgdXNlcl9ib2IgaXMgaW4gIlVzZXIiIGdyb3VwCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBY2Nlc3NFcnJvcik6CiAgICAgICAgICAgIHNlbGYucGxhbl8xLndpdGhfdXNlcihzZWxmLnVzZXJfYm9iKS5fcnVuX3NpbmdsZShzZWxmLnNlcnZlcl90ZXN0XzEpCgogICAgICAgICMgU2V0IGFjY2VzcyBsZXZlbCB0byAxIGFuZCBsaW5rIHRvIHNlcnZlcjEKICAgICAgICAjIHNvIEJvYiBjYW4gZXhlY3V0ZSB0aGUgcGxhbgogICAgICAgIHNlbGYud3JpdGVfYW5kX2ludmFsaWRhdGUoCiAgICAgICAgICAgIHNlbGYucGxhbl8xLAogICAgICAgICAgICAqKnsiYWNjZXNzX2xldmVsIjogIjEiLCAic2VydmVyX2lkcyI6IFsoNCwgc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkKV19LAogICAgICAgICkKCiAgICAgICAgc2VsZi5lbnZbImlyLnJ1bGUiXS5pbnZhbGlkYXRlX21vZGVsKCkKICAgICAgICAjIFJ1biBwbGFuCiAgICAgICAgc2VsZi5wbGFuXzEud2l0aF91c2VyKHNlbGYudXNlcl9ib2IpLl9ydW5fc2luZ2xlKHNlbGYuc2VydmVyX3Rlc3RfMSkKCiAgICAgICAgIyBDaGVjayBwbGFuIGxvZwogICAgICAgIHBsYW5fbG9nX3JlYyA9IHNlbGYuUGxhbkxvZy5zZWFyY2goWygic2VydmVyX2lkIiwgIj0iLCBzZWxmLnNlcnZlcl90ZXN0XzEuaWQpXSkKCiAgICAgICAgIyBNdXN0IGJlIGEgc2luZ2xlIHJlY29yZAogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHBsYW5fbG9nX3JlYyksIDEsIG1zZz0iTXVzdCBiZSBhIHNpbmdsZSBwbGFuIHJlY29yZCIpCgogICAgICAgICMgRW5zdXJlIGFsbCBjb21tYW5kcyB3ZXJlIHRyaWdnZXJlZAogICAgICAgIGV4cGVjdGVkX2NvbW1hbmRfY291bnQgPSAyCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbGVuKHBsYW5fbG9nX3JlYy5jb21tYW5kX2xvZ19pZHMpLAogICAgICAgICAgICBleHBlY3RlZF9jb21tYW5kX2NvdW50LAogICAgICAgICAgICBtc2c9ZiJNdXN0IHJ1biB7ZXhwZWN0ZWRfY29tbWFuZF9jb3VudH0gY29tbWFuZHMiLAogICAgICAgICkKCiAgICAgICAgIyBDaGVjayBwbGFuIHN0YXR1cwogICAgICAgIGV4cGVjdGVkX3BsYW5fc3RhdHVzID0gMAogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHBsYW5fbG9nX3JlYy5wbGFuX3N0YXR1cywKICAgICAgICAgICAgZXhwZWN0ZWRfcGxhbl9zdGF0dXMsCiAgICAgICAgICAgIG1zZz1mIlBsYW4gc3RhdHVzIG11c3QgYmUgZXF1YWwgdG8ge2V4cGVjdGVkX3BsYW5fc3RhdHVzfSIsCiAgICAgICAgKQoKICAgICAgICAjICoqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICMgQ2hhbmdlIGNvbmRpdGlvbiBpbiBsaW5lICMxLgogICAgICAgICMgQWN0aW9uIDEgd2lsbCBiZSB0cmlnZ2VyZWQgd2hpY2ggaXMgIkV4aXQgd2l0aCBjdXN0b20gY29kZSIgMjkuCiAgICAgICAgIyAqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICBhY3Rpb25fdG9fdHdlYWsgPSBzZWxmLnBsYW5fbGluZV8xX2FjdGlvbl8xCiAgICAgICAgYWN0aW9uX3RvX3R3ZWFrLndyaXRlKHsiY3VzdG9tX2V4aXRfY29kZSI6IDI5LCAiYWN0aW9uIjogImVjIn0pCgogICAgICAgICMgUnVuIHBsYW4KICAgICAgICBzZWxmLnBsYW5fMS5fcnVuX3NpbmdsZShzZWxmLnNlcnZlcl90ZXN0XzEpCgogICAgICAgICMgQ2hlY2sgcGxhbiBsb2cKICAgICAgICBwbGFuX2xvZ19yZWNvcmRzID0gc2VsZi5QbGFuTG9nLnNlYXJjaCgKICAgICAgICAgICAgWygic2VydmVyX2lkIiwgIj0iLCBzZWxmLnNlcnZlcl90ZXN0XzEuaWQpXQogICAgICAgICkKCiAgICAgICAgIyBNdXN0IGJlIHR3byBwbGFuIGxvZyByZWNvcmQKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihwbGFuX2xvZ19yZWNvcmRzKSwgMiwgbXNnPSJNdXN0IGJlIDIgcGxhbiBsb2cgcmVjb3JkcyIpCiAgICAgICAgcGxhbl9sb2dfcmVjID0gcGxhbl9sb2dfcmVjb3Jkc1swXQoKICAgICAgICAjIEVuc3VyZSBhbGwgY29tbWFuZHMgd2VyZSB0cmlnZ2VyZWQKICAgICAgICBleHBlY3RlZF9jb21tYW5kX2NvdW50ID0gMQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGxlbihwbGFuX2xvZ19yZWMuY29tbWFuZF9sb2dfaWRzKSwKICAgICAgICAgICAgZXhwZWN0ZWRfY29tbWFuZF9jb3VudCwKICAgICAgICAgICAgbXNnPWYiTXVzdCBydW4ge2V4cGVjdGVkX2NvbW1hbmRfY291bnR9IGNvbW1hbmRzIiwKICAgICAgICApCgogICAgICAgICMgQ2hlY2sgcGxhbiBzdGF0dXMKICAgICAgICBleHBlY3RlZF9wbGFuX3N0YXR1cyA9IDI5CiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgcGxhbl9sb2dfcmVjLnBsYW5fc3RhdHVzLAogICAgICAgICAgICBleHBlY3RlZF9wbGFuX3N0YXR1cywKICAgICAgICAgICAgbXNnPWYiUGxhbiBzdGF0dXMgbXVzdCBiZSBlcXVhbCB0byB7ZXhwZWN0ZWRfcGxhbl9zdGF0dXN9IiwKICAgICAgICApCgogICAgICAgICMgRW5zdXJlICdwYXRoJyB3YXMgc3Vic3RpdHV0ZWQgd2l0aCB0aGUgcGxhbiBsaW5lIGN1c3RvbSAncGF0aCcKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBzZWxmLnBsYW5fbGluZV8xLnBhdGgsCiAgICAgICAgICAgIHBsYW5fbG9nX3JlYy5jb21tYW5kX2xvZ19pZHMucGF0aCwKICAgICAgICAgICAgIlBhdGggaW4gY29tbWFuZCBsb2cgbXVzdCBiZSB0aGUgc2FtZSBhcyBpbiB0aGUgZmxpZ2h0IHBsYW4gbGluZSIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3BsYW5fYW5kX2NvbW1hbmRfYWNjZXNzX2xldmVsKHNlbGYpOgogICAgICAgICMgUmVtb3ZlIHVzZXJib2IgZnJvbSBhbGwgY3h0b3dlcl9zZXJ2ZXIgZ3JvdXBzCiAgICAgICAgc2VsZi5yZW1vdmVfZnJvbV9ncm91cCgKICAgICAgICAgICAgc2VsZi51c2VyX2JvYiwKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgImNldG1peF90b3dlcl9zZXJ2ZXIuZ3JvdXBfdXNlciIsCiAgICAgICAgICAgICAgICAiY2V0bWl4X3Rvd2VyX3NlcnZlci5ncm91cF9tYW5hZ2VyIiwKICAgICAgICAgICAgICAgICJjZXRtaXhfdG93ZXJfc2VydmVyLmdyb3VwX3Jvb3QiLAogICAgICAgICAgICBdLAogICAgICAgICkKCiAgICAgICAgIyBBZGQgdXNlcl9ib2IgdG8gZ3JvdXBfbWFuYWdlcgogICAgICAgIHNlbGYuYWRkX3RvX2dyb3VwKHNlbGYudXNlcl9ib2IsICJjZXRtaXhfdG93ZXJfc2VydmVyLmdyb3VwX21hbmFnZXIiKQoKICAgICAgICAjIEFkZCB1c2VyX2JvYiBhcyBtYW5hZ2VyIHRvIHRoZSBwbGFuCiAgICAgICAgc2VsZi5wbGFuXzEubWFuYWdlcl9pZHMgPSBbKDQsIHNlbGYudXNlcl9ib2IuaWQpXQoKICAgICAgICAjIGNoZWNrIGlmIHBsYW4gYW5kIGNvbW1hbmRzIGluY2x1ZGVkIGhhcyBzYW1lIGFjY2VzcyBsZXZlbAogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wbGFuXzEuYWNjZXNzX2xldmVsLCAiMiIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbW1hbmRfY3JlYXRlX2Rpci5hY2Nlc3NfbGV2ZWwsICIyIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29tbWFuZF9saXN0X2Rpci5hY2Nlc3NfbGV2ZWwsICIyIikKCiAgICAgICAgIyBjaGVjayB0aGF0IGlmIHdlIG1vZGlmeSBwbGFuIGFjY2VzcyBsZXZlbCB0byBtYWtlIGl0IGxvd2VyIHRoYW4gdGhlCiAgICAgICAgIyBhY2Nlc3NfbGV2ZWwgb2YgdGhlIGNvbW1hbmRzIHJlbGF0ZWQgd2l0aCBpdCBhY2Nlc3MgbGV2ZWwsCiAgICAgICAgIyBhY2Nlc3NfbGV2ZWxfd2Fybl9tc2cgd2lsbCBiZSBjcmVhdGVkCiAgICAgICAgc2VsZi5wbGFuXzEud2l0aF91c2VyKHNlbGYudXNlcl9ib2IpLndyaXRlKHsiYWNjZXNzX2xldmVsIjogIjEifSkKICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5wbGFuXzEuYWNjZXNzX2xldmVsX3dhcm5fbXNnKQoKICAgICAgICAjIEFkZCB1c2VyX2JvYiB0byBncm91cF9yb290CiAgICAgICAgc2VsZi5hZGRfdG9fZ3JvdXAoc2VsZi51c2VyX2JvYiwgImNldG1peF90b3dlcl9zZXJ2ZXIuZ3JvdXBfcm9vdCIpCgogICAgICAgICMgY2hlY2sgaWYgdXNlcl9ib2IgY2FuIG1ha2UgcGxhbiBhY2Nlc3MgbGV2ZSBoaWdoZXIgdGhhbiBjb21tYW5kcyBhY2Nlc3MgbGV2ZWwKICAgICAgICBzZWxmLnBsYW5fMS53aXRoX3VzZXIoc2VsZi51c2VyX2JvYikud3JpdGUoeyJhY2Nlc3NfbGV2ZWwiOiAiMyJ9KQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wbGFuXzEuYWNjZXNzX2xldmVsLCAiMyIpCgogICAgICAgICMgY2hlY2sgdGhhdCBpZiB3ZSBjcmVhdGUgYSBuZXcgcGxhbiB3aXRoIGFuIGFjY2Vzc19sZXZlbCBsb3dlciB0aGFuCiAgICAgICAgIyB0aGUgYWNjZXNzX2xldmVsIG9mIHRoZSBjb21tYW5kIHJlbGF0ZWQgd2l0aCBhY2Nlc3NfbGV2ZWxfd2Fybl9tc2cKICAgICAgICAjICB3aWxsIGJlIGNyZWF0ZWQKICAgICAgICBjb21tYW5kXzEgPSBzZWxmLkNvbW1hbmQuY3JlYXRlKAogICAgICAgICAgICB7Im5hbWUiOiAiTmV3IFRlc3QgQ29tbWFuZCIsICJhY2Nlc3NfbGV2ZWwiOiAiMyJ9CiAgICAgICAgKQoKICAgICAgICBzZWxmLnBsYW5fMiA9IHNlbGYuUGxhbi5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgcGxhbiAyIiwKICAgICAgICAgICAgICAgICJub3RlIjogIkNyZWF0ZSBkaXJlY3RvcnkgYW5kIGxpc3QgaXRzIGNvbnRlbnQiLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHNlbGYucGxhbl9saW5lXzJfMSA9IHNlbGYucGxhbl9saW5lLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNlcXVlbmNlIjogNSwKICAgICAgICAgICAgICAgICJwbGFuX2lkIjogc2VsZi5wbGFuXzIuaWQsCiAgICAgICAgICAgICAgICAiY29tbWFuZF9pZCI6IGNvbW1hbmRfMS5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5wbGFuXzIuYWNjZXNzX2xldmVsX3dhcm5fbXNnKQoKICAgIGRlZiB0ZXN0X211bHRpcGxlX3BsYW5fY3JlYXRlX3dyaXRlKHNlbGYpOgogICAgICAgICIiIlRlc3QgbXVsdGlwbGUgcGxhbiBjcmVhdGUvd3JpdGUgY2FzZXMiIiIKICAgICAgICAjIENyZWF0ZSBtdWx0aXBsZSBwbGFucyBhdCBvbmNlCiAgICAgICAgcGxhbnNfZGF0YSA9IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBQbGFuIDEiLAogICAgICAgICAgICAgICAgIm5vdGUiOiAiUGxhbiAxIE5vdGUiLAogICAgICAgICAgICAgICAgInRhZ19pZHMiOiBbKDYsIDAsIFtzZWxmLnRhZ190ZXN0X3N0YWdpbmcuaWRdKV0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgUGxhbiAyIiwKICAgICAgICAgICAgICAgICJub3RlIjogIlBsYW4gMiBOb3RlIiwKICAgICAgICAgICAgICAgICJ0YWdfaWRzIjogWyg2LCAwLCBbc2VsZi50YWdfdGVzdF9wcm9kdWN0aW9uLmlkXSldLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IFBsYW4gMyIsCiAgICAgICAgICAgICAgICAibm90ZSI6ICJQbGFuIDMgTm90ZSIsCiAgICAgICAgICAgICAgICAidGFnX2lkcyI6IFsoNiwgMCwgW3NlbGYudGFnX3Rlc3Rfc3RhZ2luZy5pZF0pXSwKICAgICAgICAgICAgfSwKICAgICAgICBdCiAgICAgICAgY3JlYXRlZF9wbGFucyA9IHNlbGYuUGxhbi5jcmVhdGUocGxhbnNfZGF0YSkKICAgICAgICAjIENoZWNrIHRoYXQgYWxsIHBsYW5zIGFyZSBjcmVhdGVkIHN1Y2Nlc3NmdWxseQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhbGwoY3JlYXRlZF9wbGFucykpCiAgICAgICAgIyBVcGRhdGUgdGhlIGFjY2VzcyBsZXZlbCBvZiB0aGUgY3JlYXRlZCBwbGFucwogICAgICAgIGNyZWF0ZWRfcGxhbnMud3JpdGUoeyJhY2Nlc3NfbGV2ZWwiOiAiMyJ9KQogICAgICAgICMgQ2hlY2sgdGhhdCBhbGwgcGxhbnMgYXJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5CiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFsbChwbGFuLmFjY2Vzc19sZXZlbCA9PSAiMyIgZm9yIHBsYW4gaW4gY3JlYXRlZF9wbGFucykpCgogICAgZGVmIHRlc3RfcGxhbl93aXRoX2ZpcnN0X25vdF9leGVjdXRhYmxlX2NvbmRpdGlvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHBsYW4gd2l0aCBub3QgZXhlY3V0YWJsZSBjb25kaXRpb24gZm9yIGZpcnN0IHBsYW4gbGluZQogICAgICAgICIiIgogICAgICAgICMgQWRkIGNvbmRpdGlvbiBmb3IgdGhlIGZpcnN0IHBsYW4gbGluZQogICAgICAgIHNlbGYucGxhbl9saW5lXzEuY29uZGl0aW9uID0gInt7IG9kb29fdmVyc2lvbiB9fSA9PSAnMTQuMCciCiAgICAgICAgIyBSdW4gcGxhbgogICAgICAgIHNlbGYucGxhbl8xLl9ydW5fc2luZ2xlKHNlbGYuc2VydmVyX3Rlc3RfMSkKICAgICAgICAjIENoZWNrIHBsYW4gbG9nCiAgICAgICAgcGxhbl9sb2dfcmVjb3JkcyA9IHNlbGYuUGxhbkxvZy5zZWFyY2goCiAgICAgICAgICAgIFsoInNlcnZlcl9pZCIsICI9Iiwgc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkKV0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbGVuKHBsYW5fbG9nX3JlY29yZHMuY29tbWFuZF9sb2dfaWRzKSwKICAgICAgICAgICAgMiwKICAgICAgICAgICAgbXNnPSJNdXN0IGJlIHR3byBjb21tYW5kIHJlY29yZHMiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydFRydWUoCiAgICAgICAgICAgIHBsYW5fbG9nX3JlY29yZHMuY29tbWFuZF9sb2dfaWRzWzBdLmlzX3NraXBwZWQsCiAgICAgICAgICAgIG1zZz0iRmlyc3QgY29tbWFuZCBtdXN0IGJlIHNraXBwZWQiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEZhbHNlKAogICAgICAgICAgICBwbGFuX2xvZ19yZWNvcmRzLmNvbW1hbmRfbG9nX2lkc1sxXS5pc19za2lwcGVkLAogICAgICAgICAgICBtc2c9IlNlY29uZCBjb21tYW5kIG5vdCBtdXN0IGJlIHNraXBwZWQiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9wbGFuX3dpdGhfc2Vjb25kX25vdF9leGVjdXRhYmxlX2NvbmRpdGlvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHBsYW4gd2l0aCBub3QgZXhlY3V0YWJsZSBjb25kaXRpb24gZm9yIHNlY29uZCBwbGFuIGxpbmUKICAgICAgICAiIiIKICAgICAgICAjIEFkZCBjb25kaXRpb24gZm9yIHNlY29uZCBwbGFuIGxpbmUKICAgICAgICBzZWxmLnBsYW5fbGluZV8yLmNvbmRpdGlvbiA9ICJ7eyBvZG9vX3ZlcnNpb24gfX0gPT0gJzE0LjAnIgogICAgICAgICMgUnVuIHBsYW4KICAgICAgICBzZWxmLnBsYW5fMS5fcnVuX3NpbmdsZShzZWxmLnNlcnZlcl90ZXN0XzEpCiAgICAgICAgIyBDaGVjayBwbGFuIGxvZwogICAgICAgIHBsYW5fbG9nX3JlY29yZHMgPSBzZWxmLlBsYW5Mb2cuc2VhcmNoKAogICAgICAgICAgICBbKCJzZXJ2ZXJfaWQiLCAiPSIsIHNlbGYuc2VydmVyX3Rlc3RfMS5pZCldCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGxlbihwbGFuX2xvZ19yZWNvcmRzLmNvbW1hbmRfbG9nX2lkcyksCiAgICAgICAgICAgIDIsCiAgICAgICAgICAgIG1zZz0iTXVzdCBiZSB0d28gY29tbWFuZCByZWNvcmRzIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAogICAgICAgICAgICBwbGFuX2xvZ19yZWNvcmRzLmNvbW1hbmRfbG9nX2lkc1sxXS5pc19za2lwcGVkLAogICAgICAgICAgICBtc2c9IlNlY29uZCBjb21tYW5kIG11c3QgYmUgc2tpcHBlZCIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoCiAgICAgICAgICAgIHBsYW5fbG9nX3JlY29yZHMuY29tbWFuZF9sb2dfaWRzWzBdLmlzX3NraXBwZWQsCiAgICAgICAgICAgIG1zZz0iRmlyc3QgY29tbWFuZCBub3QgbXVzdCBiZSBza2lwcGVkIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfcGxhbl93aXRoX2V4ZWN1dGFibGVfY29uZGl0aW9uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgcGxhbiB3aXRoIGV4ZWN1dGFibGUgY29uZGl0aW9uIGZvciBwbGFuIGxpbmUKICAgICAgICAiIiIKICAgICAgICAjIEFkZCBjb25kaXRpb24gZm9yIGZpcnN0IHBsYW4gbGluZQogICAgICAgIHNlbGYucGxhbl9saW5lXzEuY29uZGl0aW9uID0gIjEgPT0gMSIKICAgICAgICAjIENyZWF0ZSBhIGdsb2JhbCB2YWx1ZSBmb3IgdGhlICdWZXJzaW9uJyB2YXJpYWJsZQogICAgICAgIHNlbGYuVmFyaWFibGVWYWx1ZS5jcmVhdGUoCiAgICAgICAgICAgIHsidmFyaWFibGVfaWQiOiBzZWxmLnZhcmlhYmxlX3ZlcnNpb24uaWQsICJ2YWx1ZV9jaGFyIjogIjE0LjAifQogICAgICAgICkKICAgICAgICAjIEFkZCBjb25kaXRpb24gd2l0aCB2YXJpYWJsZQogICAgICAgIHNlbGYucGxhbl9saW5lXzIuY29uZGl0aW9uID0gKAogICAgICAgICAgICAie3sgIiArIHNlbGYudmFyaWFibGVfdmVyc2lvbi5uYW1lICsgIiB9fSA9PSAnMTQuMCciCiAgICAgICAgKQogICAgICAgICMgUnVuIHBsYW4KICAgICAgICBzZWxmLnBsYW5fMS5fcnVuX3NpbmdsZShzZWxmLnNlcnZlcl90ZXN0XzEpCiAgICAgICAgIyBDaGVjayBjb21tYW5kcwogICAgICAgIHBsYW5fbG9nX3JlY29yZHMgPSBzZWxmLlBsYW5Mb2cuc2VhcmNoKAogICAgICAgICAgICBbKCJzZXJ2ZXJfaWQiLCAiPSIsIHNlbGYuc2VydmVyX3Rlc3RfMS5pZCldCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGxlbihwbGFuX2xvZ19yZWNvcmRzLmNvbW1hbmRfbG9nX2lkcyksCiAgICAgICAgICAgIDIsCiAgICAgICAgICAgIG1zZz0iTXVzdCBiZSB0d28gY29tbWFuZCByZWNvcmRzIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAogICAgICAgICAgICBhbGwobm90IGNvbW1hbmQuaXNfc2tpcHBlZCBmb3IgY29tbWFuZCBpbiBwbGFuX2xvZ19yZWNvcmRzLmNvbW1hbmRfbG9nX2lkcyksCiAgICAgICAgICAgIG1zZz0iQWxsIGNvbW1hbmQgc2hvdWxkIGJlIGV4ZWN1dGVkIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfcGxhbl93aXRoX3VwZGF0ZV92YXJpYWJsZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCBwbGFuIHVwZGF0ZXMgY3VzdG9tIChpbi1mbGlnaHQpIHZhbHVlcwogICAgICAgICIiIgogICAgICAgICMgQWRkIG5ldyB2YXJpYWJsZSB0byBzZXJ2ZXIKICAgICAgICBzZWxmLlZhcmlhYmxlVmFsdWUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidmFyaWFibGVfaWQiOiBzZWxmLnZhcmlhYmxlX3ZlcnNpb24uaWQsCiAgICAgICAgICAgICAgICAidmFsdWVfY2hhciI6ICIxNC4wIiwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWQiOiBzZWxmLnNlcnZlcl90ZXN0XzEuaWQsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgIyBDcmVhdGUgbmV3IHZhcmlhYmxlIHZhbHVlIG9uIGFjdGlvbgogICAgICAgIHNlbGYuVmFyaWFibGVWYWx1ZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJ2YXJpYWJsZV9pZCI6IHNlbGYudmFyaWFibGVfdmVyc2lvbi5pZCwKICAgICAgICAgICAgICAgICJ2YWx1ZV9jaGFyIjogIjE2LjAiLAogICAgICAgICAgICAgICAgInBsYW5fbGluZV9hY3Rpb25faWQiOiBzZWxmLnBsYW5fbGluZV8xX2FjdGlvbl8xLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgICMgQWRkIGEgbmV3IHZhcmlhYmxlIHZhbHVlIG9uIGFjdGlvbiBmb3IgYSB2YXJpYWJsZSBhYnNlbnQgb24gdGhlIHNlcnZlcgogICAgICAgIHNlbGYuVmFyaWFibGVWYWx1ZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJ2YXJpYWJsZV9pZCI6IHNlbGYudmFyaWFibGVfb3MuaWQsCiAgICAgICAgICAgICAgICAidmFsdWVfY2hhciI6ICJVYnVudHUiLAogICAgICAgICAgICAgICAgInBsYW5fbGluZV9hY3Rpb25faWQiOiBzZWxmLnBsYW5fbGluZV8xX2FjdGlvbl8xLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgICMgUHJlLXJ1biBzYW5pdHk6IHNlcnZlciBob2xkcyBpbml0aWFsIHZhbHVlIGFuZCBubyBPUyB2YWx1ZQogICAgICAgIGV4aXN0X3NlcnZlcl92YWx1ZXMgPSBzZWxmLnNlcnZlcl90ZXN0XzEudmFyaWFibGVfdmFsdWVfaWRzLmZpbHRlcmVkKAogICAgICAgICAgICBsYW1iZGEgcmVjOiByZWMudmFyaWFibGVfaWQgPT0gc2VsZi52YXJpYWJsZV92ZXJzaW9uCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGxlbihleGlzdF9zZXJ2ZXJfdmFsdWVzKSwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgIlRoZSBzZXJ2ZXIgc2hvdWxkIGhhdmUgb25seSBvbmUgdmFsdWUgZm9yIHRoZSB2YXJpYWJsZSIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGV4aXN0X3NlcnZlcl92YWx1ZXMudmFsdWVfY2hhciwKICAgICAgICAgICAgIjE0LjAiLAogICAgICAgICAgICAiVGhlIHNlcnZlciB2YXJpYWJsZSB2YWx1ZSBzaG91bGQgYmUgJzE0LjAnIiwKICAgICAgICApCiAgICAgICAgZXhpc3Rfc2VydmVyX3ZhbHVlcyA9IHNlbGYuc2VydmVyX3Rlc3RfMS52YXJpYWJsZV92YWx1ZV9pZHMuZmlsdGVyZWQoCiAgICAgICAgICAgIGxhbWJkYSByZWM6IHJlYy52YXJpYWJsZV9pZCA9PSBzZWxmLnZhcmlhYmxlX29zCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoCiAgICAgICAgICAgIGV4aXN0X3NlcnZlcl92YWx1ZXMsICJUaGUgc2VydmVyIHNob3VsZCBub3QgaGF2ZSB0aGlzIHZhcmlhYmxlIgogICAgICAgICkKICAgICAgICAjIFJ1biBwbGFuCiAgICAgICAgc2VsZi5wbGFuXzEuX3J1bl9zaW5nbGUoc2VsZi5zZXJ2ZXJfdGVzdF8xKQogICAgICAgICMgQWZ0ZXIgcnVuOiBzZXJ2ZXIgdmFsdWVzIE1VU1QgcmVtYWluIHVuY2hhbmdlZAogICAgICAgIHNlcnZlcl92ZXJzaW9uX3ZhbCA9IHNlbGYuc2VydmVyX3Rlc3RfMS52YXJpYWJsZV92YWx1ZV9pZHMuZmlsdGVyZWQoCiAgICAgICAgICAgIGxhbWJkYSByZWM6IHJlYy52YXJpYWJsZV9pZCA9PSBzZWxmLnZhcmlhYmxlX3ZlcnNpb24KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgc2VydmVyX3ZlcnNpb25fdmFsLnZhbHVlX2NoYXIsCiAgICAgICAgICAgICIxNC4wIiwKICAgICAgICAgICAgIlNlcnZlciB2YXJpYWJsZSB2YWx1ZSBtdXN0IHJlbWFpbiB1bmNoYW5nZWQiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEZhbHNlKAogICAgICAgICAgICBzZWxmLnNlcnZlcl90ZXN0XzEudmFyaWFibGVfdmFsdWVfaWRzLmZpbHRlcmVkKAogICAgICAgICAgICAgICAgbGFtYmRhIHJlYzogcmVjLnZhcmlhYmxlX2lkID09IHNlbGYudmFyaWFibGVfb3MKICAgICAgICAgICAgKSwKICAgICAgICAgICAgIlNlcnZlciBtdXN0IG5vdCByZWNlaXZlIG5ldyB2YXJpYWJsZSBmcm9tIGFjdGlvbiIsCiAgICAgICAgKQoKICAgICAgICAjIEJ1dCBjdXN0b20gKGluLWZsaWdodCkgdmFsdWVzIE1VU1QgYmUgdXBkYXRlZCBpbiBsb2dzCiAgICAgICAgcGxhbl9sb2cgPSBzZWxmLlBsYW5Mb2cuc2VhcmNoKAogICAgICAgICAgICBbKCJzZXJ2ZXJfaWQiLCAiPSIsIHNlbGYuc2VydmVyX3Rlc3RfMS5pZCldLCBvcmRlcj0iaWQgZGVzYyIsIGxpbWl0PTEKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBsYW5fbG9nLCAiUGxhbiBsb2cgc2hvdWxkIGV4aXN0IGFmdGVyIHJ1biIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgcGxhbl9sb2cudmFyaWFibGVfdmFsdWVzW3NlbGYudmFyaWFibGVfdmVyc2lvbi5yZWZlcmVuY2VdLAogICAgICAgICAgICAiMTYuMCIsCiAgICAgICAgICAgICJQbGFuIGxvZyBtdXN0IGNvbnRhaW4gdXBkYXRlZCBjdXN0b20gdmFsdWUiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBwbGFuX2xvZy52YXJpYWJsZV92YWx1ZXNbc2VsZi52YXJpYWJsZV9vcy5yZWZlcmVuY2VdLAogICAgICAgICAgICAiVWJ1bnR1IiwKICAgICAgICAgICAgIlBsYW4gbG9nIG11c3QgY29udGFpbiBuZXcgY3VzdG9tIHZhbHVlIiwKICAgICAgICApCgogICAgICAgIGxhc3RfY29tbWFuZF9sb2cgPSBwbGFuX2xvZy5jb21tYW5kX2xvZ19pZHMgYW5kIHBsYW5fbG9nLmNvbW1hbmRfbG9nX2lkc1stMV0KICAgICAgICBzZWxmLmFzc2VydFRydWUobGFzdF9jb21tYW5kX2xvZywgIkNvbW1hbmQgbG9nIHNob3VsZCBleGlzdCBhZnRlciBydW4iKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGxhc3RfY29tbWFuZF9sb2cudmFyaWFibGVfdmFsdWVzW3NlbGYudmFyaWFibGVfdmVyc2lvbi5yZWZlcmVuY2VdLAogICAgICAgICAgICAiMTYuMCIsCiAgICAgICAgICAgICJDb21tYW5kIGxvZyBtdXN0IGNvbnRhaW4gdXBkYXRlZCBjdXN0b20gdmFsdWUiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9wbGFuX3dpdGhfYWN0aW9uX3ZhcmlhYmxlc19mb3JfY29uZGl0aW9uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgcGxhbiB3aXRoIHVwZGF0ZSBzZXJ2ZXIgdmFyaWFibGVzIGFuZCB1c2UgbmV3CiAgICAgICAgdmFsdWUgYXMgY29uZGl0aW9uIGZvciBuZXh0IHBsYW4gbGluZQogICAgICAgICIiIgogICAgICAgICMgQWRkIG5ldyB2YXJpYWJsZSB0byBzZXJ2ZXIKICAgICAgICBzZWxmLlZhcmlhYmxlVmFsdWUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidmFyaWFibGVfaWQiOiBzZWxmLnZhcmlhYmxlX3ZlcnNpb24uaWQsCiAgICAgICAgICAgICAgICAidmFsdWVfY2hhciI6ICIxNC4wIiwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWQiOiBzZWxmLnNlcnZlcl90ZXN0XzEuaWQsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgIyBDcmVhdGUgbmV3IHZhcmlhYmxlIHZhbHVlIHRvIGFjdGlvbiB0byB1cGRhdGUgZXhpc3Rpbmcgc2VydmVyIHZhcmlhYmxlCiAgICAgICAgc2VsZi5WYXJpYWJsZVZhbHVlLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInZhcmlhYmxlX2lkIjogc2VsZi52YXJpYWJsZV92ZXJzaW9uLmlkLAogICAgICAgICAgICAgICAgInZhbHVlX2NoYXIiOiAiMTYuMCIsCiAgICAgICAgICAgICAgICAicGxhbl9saW5lX2FjdGlvbl9pZCI6IHNlbGYucGxhbl9saW5lXzFfYWN0aW9uXzEuaWQsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgIyBBZGQgY29uZGl0aW9uIHdpdGggdmFyaWFibGUKICAgICAgICBzZWxmLnBsYW5fbGluZV8yLmNvbmRpdGlvbiA9ICgKICAgICAgICAgICAgInt7ICIgKyBzZWxmLnZhcmlhYmxlX3ZlcnNpb24ubmFtZSArICIgfX0gPT0gJzE0LjAnIgogICAgICAgICkKICAgICAgICAjIFJ1biBwbGFuCiAgICAgICAgc2VsZi5wbGFuXzEuX3J1bl9zaW5nbGUoc2VsZi5zZXJ2ZXJfdGVzdF8xKQogICAgICAgICMgQ2hlY2sgY29tbWFuZHMKICAgICAgICBwbGFuX2xvZ19yZWNvcmRzID0gc2VsZi5QbGFuTG9nLnNlYXJjaCgKICAgICAgICAgICAgWygic2VydmVyX2lkIiwgIj0iLCBzZWxmLnNlcnZlcl90ZXN0XzEuaWQpXQogICAgICAgICkKICAgICAgICAjIFRoZSBzZWNvbmQgbGluZSBvZiB0aGUgcGxhbiBzaG91bGQgYmUgc2tpcHBlZCBiZWNhdXNlIHRoZQogICAgICAgICMgZmlyc3QgbGluZSBvZiB0aGUgcGxhbiB1cGRhdGVkIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUKICAgICAgICBzZWxmLmFzc2VydFRydWUoCiAgICAgICAgICAgIHBsYW5fbG9nX3JlY29yZHMuY29tbWFuZF9sb2dfaWRzWzFdLmlzX3NraXBwZWQsCiAgICAgICAgICAgIG1zZz0iU2Vjb25kIGNvbW1hbmQgbXVzdCBiZSBza2lwcGVkIiwKICAgICAgICApCgogICAgICAgICMgQ2hhbmdlIGNvbmRpdGlvbiBmb3IgcGxhbiBsaW5lCiAgICAgICAgc2VsZi5wbGFuX2xpbmVfMi5jb25kaXRpb24gPSAoCiAgICAgICAgICAgICJ7eyAiICsgc2VsZi52YXJpYWJsZV92ZXJzaW9uLm5hbWUgKyAiIH19ID09ICcxNi4wJyIKICAgICAgICApCiAgICAgICAgIyBSdW4gcGxhbgogICAgICAgIHNlbGYucGxhbl8xLl9ydW5fc2luZ2xlKHNlbGYuc2VydmVyX3Rlc3RfMSkKICAgICAgICAjIENoZWNrIGNvbW1hbmRzCiAgICAgICAgbmV3X3BsYW5fbG9nX3JlY29yZHMgPSAoCiAgICAgICAgICAgIHNlbGYuUGxhbkxvZy5zZWFyY2goWygic2VydmVyX2lkIiwgIj0iLCBzZWxmLnNlcnZlcl90ZXN0XzEuaWQpXSkKICAgICAgICAgICAgLSBwbGFuX2xvZ19yZWNvcmRzCiAgICAgICAgKQogICAgICAgICMgVGhlIHNlY29uZCBsaW5lIG9mIHRoZSBwbGFuIHNob3VsZCBiZSBza2lwcGVkIGJlY2F1c2UgdGhlCiAgICAgICAgIyBmaXJzdCBsaW5lIG9mIHRoZSBwbGFuIHVwZGF0ZWQgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZQogICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoCiAgICAgICAgICAgIG5ld19wbGFuX2xvZ19yZWNvcmRzLmNvbW1hbmRfbG9nX2lkc1sxXS5pc19za2lwcGVkLAogICAgICAgICAgICBtc2c9IlRoZSBzZWNvbmQgcGxhbiBsaW5lIHNob3VsZCBub3QgYmUgc2tpcHBlZCIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X2ZsaWdodF9wbGFuX2NvcHkoc2VsZik6CiAgICAgICAgIiIiVGVzdCBkdXBsaWNhdGluZyBhIEZsaWdodCBQbGFuIHdpdGggbGluZXMsIGFjdGlvbnMsIGFuZCB2YXJpYWJsZSB2YWx1ZXMiIiIKCiAgICAgICAgIyBDcmVhdGUgYSBGbGlnaHQgUGxhbgogICAgICAgIHBsYW4gPSBzZWxmLlBsYW4uY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IEZsaWdodCBQbGFuIiwKICAgICAgICAgICAgICAgICJub3RlIjogIlRlc3QgTm90ZSIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgQ3JlYXRlIGEgY29tbWFuZCBmb3IgdGhlIHBsYW4gbGluZQogICAgICAgIGNvbW1hbmQgPSBzZWxmLkNvbW1hbmQuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IENvbW1hbmQiLAogICAgICAgICAgICAgICAgIyBDb21tYW5kIHRvIGdldCBMaW51eCBrZXJuZWwgdmVyc2lvbgogICAgICAgICAgICAgICAgImNvZGUiOiAidW5hbWUgLXIiLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENyZWF0ZSBhIEZsaWdodCBQbGFuIExpbmUKICAgICAgICBwbGFuX2xpbmUgPSBzZWxmLnBsYW5fbGluZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJwbGFuX2lkIjogcGxhbi5pZCwKICAgICAgICAgICAgICAgICJjb21tYW5kX2lkIjogY29tbWFuZC5pZCwKICAgICAgICAgICAgICAgICJwYXRoIjogIi90ZXN0L3BhdGgiLAogICAgICAgICAgICAgICAgIyBDb25kaXRpb24gYmFzZWQgb24gTGludXggdmVyc2lvbgogICAgICAgICAgICAgICAgImNvbmRpdGlvbiI6ICd7eyB0ZXN0X2xpbnV4X3ZlcnNpb24gfX0gPj0gIjUuMCInLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENyZWF0ZSBhIHZhcmlhYmxlIGZvciB0aGUgYWN0aW9uCiAgICAgICAgdmFyaWFibGUgPSBzZWxmLlZhcmlhYmxlLmNyZWF0ZSh7Im5hbWUiOiAidGVzdF9saW51eF92ZXJzaW9uIn0pCgogICAgICAgICMgQ3JlYXRlIGFuIEFjdGlvbiBmb3IgdGhlIFBsYW4gTGluZQogICAgICAgIGFjdGlvbiA9IHNlbGYucGxhbl9saW5lX2FjdGlvbi5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJsaW5lX2lkIjogcGxhbl9saW5lLmlkLAogICAgICAgICAgICAgICAgImFjdGlvbiI6ICJuIiwgICMgbmV4dCBhY3Rpb24KICAgICAgICAgICAgICAgICJjb25kaXRpb24iOiAiPT0iLAogICAgICAgICAgICAgICAgInZhbHVlX2NoYXIiOiAiMCIsICAjIGNvbmRpdGlvbiBmb3Igc3VjY2VzcwogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENyZWF0ZSBhIFZhcmlhYmxlIFZhbHVlIGZvciB0aGUgQWN0aW9uCiAgICAgICAgc2VsZi5lbnZbImN4LnRvd2VyLnZhcmlhYmxlLnZhbHVlIl0uY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidmFyaWFibGVfaWQiOiB2YXJpYWJsZS5pZCwKICAgICAgICAgICAgICAgICJ2YWx1ZV9jaGFyIjogIjUuMCIsCiAgICAgICAgICAgICAgICAicGxhbl9saW5lX2FjdGlvbl9pZCI6IGFjdGlvbi5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBEdXBsaWNhdGUgdGhlIEZsaWdodCBQbGFuCiAgICAgICAgY29waWVkX3BsYW4gPSBwbGFuLmNvcHkoKQoKICAgICAgICAjIEVuc3VyZSB0aGUgbmV3IEZsaWdodCBQbGFuIHdhcyBjcmVhdGVkIHdpdGggYSBuZXcgSUQKICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKAogICAgICAgICAgICBjb3BpZWRfcGxhbi5pZCwKICAgICAgICAgICAgcGxhbi5pZCwKICAgICAgICAgICAgIkNvcGllZCBwbGFuIHNob3VsZCBoYXZlIGEgZGlmZmVyZW50IElEIGZyb20gdGhlIG9yaWdpbmFsIiwKICAgICAgICApCgogICAgICAgICMgQ2hlY2sgdGhhdCB0aGUgY29waWVkIHBsYW4gaGFzIHRoZSBzYW1lIG51bWJlciBvZiBsaW5lcwogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGxlbihjb3BpZWRfcGxhbi5saW5lX2lkcyksCiAgICAgICAgICAgIGxlbihwbGFuLmxpbmVfaWRzKSwKICAgICAgICAgICAgIkNvcGllZCBwbGFuIHNob3VsZCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBsaW5lcyBhcyB0aGUgb3JpZ2luYWwiLAogICAgICAgICkKCiAgICAgICAgIyBDaGVjayB0aGF0IHRoZSBjb3BpZWQgcGxhbidzIGxpbmVzIGhhdmUgdGhlIHNhbWUgYWN0aW9ucyBhcyB0aGUgb3JpZ2luYWwKICAgICAgICBvcmlnaW5hbF9saW5lID0gcGxhbi5saW5lX2lkcwogICAgICAgIGNvcGllZF9saW5lID0gY29waWVkX3BsYW4ubGluZV9pZHMKCiAgICAgICAgIyBFbnN1cmUgdGhlIGNvbW1hbmQsIGNvbmRpdGlvbiwgYW5kIGN1c3RvbSBwYXRoIGFyZSBjb3BpZWQgY29ycmVjdGx5CiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgY29waWVkX2xpbmUuY29tbWFuZF9pZC5pZCwKICAgICAgICAgICAgb3JpZ2luYWxfbGluZS5jb21tYW5kX2lkLmlkLAogICAgICAgICAgICAiQ29tbWFuZCBzaG91bGQgYmUgdGhlIHNhbWUgaW4gY29waWVkIGxpbmUiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBjb3BpZWRfbGluZS5wYXRoLAogICAgICAgICAgICBvcmlnaW5hbF9saW5lLnBhdGgsCiAgICAgICAgICAgICJDdXN0b20gcGF0aCBzaG91bGQgYmUgdGhlIHNhbWUgaW4gY29waWVkIGxpbmUiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBjb3BpZWRfbGluZS5jb25kaXRpb24sCiAgICAgICAgICAgIG9yaWdpbmFsX2xpbmUuY29uZGl0aW9uLAogICAgICAgICAgICAiQ29uZGl0aW9uIHNob3VsZCBiZSB0aGUgc2FtZSBpbiBjb3BpZWQgbGluZSIsCiAgICAgICAgKQoKICAgICAgICAjIEVuc3VyZSBhY3Rpb25zIHdlcmUgY29waWVkIGNvcnJlY3RseQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGxlbihjb3BpZWRfbGluZS5hY3Rpb25faWRzKSwKICAgICAgICAgICAgbGVuKG9yaWdpbmFsX2xpbmUuYWN0aW9uX2lkcyksCiAgICAgICAgICAgICJOdW1iZXIgb2YgYWN0aW9ucyBzaG91bGQgYmUgdGhlIHNhbWUgaW4gdGhlIGNvcGllZCBsaW5lIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgY29waWVkX2xpbmUuYWN0aW9uX2lkcy5hY3Rpb24sCiAgICAgICAgICAgIG9yaWdpbmFsX2xpbmUuYWN0aW9uX2lkcy5hY3Rpb24sCiAgICAgICAgICAgICJBY3Rpb24gc2hvdWxkIGJlIHRoZSBzYW1lIGluIHRoZSBjb3BpZWQgbGluZSIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGNvcGllZF9saW5lLmFjdGlvbl9pZHMuY29uZGl0aW9uLAogICAgICAgICAgICBvcmlnaW5hbF9saW5lLmFjdGlvbl9pZHMuY29uZGl0aW9uLAogICAgICAgICAgICAiQWN0aW9uIGNvbmRpdGlvbiBzaG91bGQgYmUgdGhlIHNhbWUgaW4gdGhlIGNvcGllZCBsaW5lIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgY29waWVkX2xpbmUuYWN0aW9uX2lkcy52YWx1ZV9jaGFyLAogICAgICAgICAgICBvcmlnaW5hbF9saW5lLmFjdGlvbl9pZHMudmFsdWVfY2hhciwKICAgICAgICAgICAgIkFjdGlvbiB2YWx1ZSBzaG91bGQgYmUgdGhlIHNhbWUgaW4gdGhlIGNvcGllZCBsaW5lIiwKICAgICAgICApCgogICAgICAgICMgQ2hlY2sgdGhhdCB2YXJpYWJsZSB2YWx1ZXMgd2VyZSBjb3BpZWQgY29ycmVjdGx5CiAgICAgICAgb3JpZ2luYWxfYWN0aW9uID0gb3JpZ2luYWxfbGluZS5hY3Rpb25faWRzCiAgICAgICAgY29waWVkX2FjdGlvbiA9IGNvcGllZF9saW5lLmFjdGlvbl9pZHMKCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbGVuKGNvcGllZF9hY3Rpb24udmFyaWFibGVfdmFsdWVfaWRzKSwKICAgICAgICAgICAgbGVuKG9yaWdpbmFsX2FjdGlvbi52YXJpYWJsZV92YWx1ZV9pZHMpLAogICAgICAgICAgICAiTnVtYmVyIG9mIHZhcmlhYmxlIHZhbHVlcyBzaG91bGQgYmUgdGhlIHNhbWUgaW4gdGhlIGNvcGllZCBhY3Rpb24iLAogICAgICAgICkKCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgY29waWVkX2FjdGlvbi52YXJpYWJsZV92YWx1ZV9pZHMudmFyaWFibGVfaWQuaWQsCiAgICAgICAgICAgIG9yaWdpbmFsX2FjdGlvbi52YXJpYWJsZV92YWx1ZV9pZHMudmFyaWFibGVfaWQuaWQsCiAgICAgICAgICAgICJWYXJpYWJsZSBzaG91bGQgYmUgdGhlIHNhbWUgaW4gdGhlIGNvcGllZCBhY3Rpb24iLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBjb3BpZWRfYWN0aW9uLnZhcmlhYmxlX3ZhbHVlX2lkcy52YWx1ZV9jaGFyLAogICAgICAgICAgICBvcmlnaW5hbF9hY3Rpb24udmFyaWFibGVfdmFsdWVfaWRzLnZhbHVlX2NoYXIsCiAgICAgICAgICAgICJWYXJpYWJsZSB2YWx1ZSBzaG91bGQgYmUgdGhlIHNhbWUgaW4gdGhlIGNvcGllZCBhY3Rpb24iLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9wbGFuX3dpdGhfYW5vdGhlcl9wbGFuKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgdG8gY2hlY2sgcnVubmluZyBhbm90aGVyIHBsYW4gZnJvbSBjdXJyZW50IHBsYW4KICAgICAgICAiIiIKICAgICAgICAjIENoZWNrIHBsYW4gbG9ncwogICAgICAgIHBsYW5fbG9nX3JlY29yZHMgPSBzZWxmLlBsYW5Mb2cuc2VhcmNoKAogICAgICAgICAgICBbKCJzZXJ2ZXJfaWQiLCAiPSIsIHNlbGYuc2VydmVyX3Rlc3RfMS5pZCldCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHBsYW5fbG9nX3JlY29yZHMpLCAwLCAiUGxhbiBsb2dzIHNob3VsZCBiZSBlbXB0eSIpCiAgICAgICAgIyBSdW4gcGxhbgogICAgICAgIHNlbGYucGxhbl8yLl9ydW5fc2luZ2xlKHNlbGYuc2VydmVyX3Rlc3RfMSkKICAgICAgICAjIENoZWNrIHBsYW4gbG9ncyBhZnRlciBleGVjdXRlIGNvbW1hbmQgd2l0aCBwbGFuIGFjdGlvbgogICAgICAgIHBsYW5fbG9nX3JlY29yZHMgPSBzZWxmLlBsYW5Mb2cuc2VhcmNoKAogICAgICAgICAgICBbKCJzZXJ2ZXJfaWQiLCAiPSIsIHNlbGYuc2VydmVyX3Rlc3RfMS5pZCldCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHBsYW5fbG9nX3JlY29yZHMpLCAyLCBtc2c9IlNob3VsZCBiZSAyIHBsYW4gbG9ncyIpCgogICAgICAgIHBhcmVudF9wbGFuX2xvZyA9IHBsYW5fbG9nX3JlY29yZHMuZmlsdGVyZWQoCiAgICAgICAgICAgIGxhbWJkYSByZWM6IHJlYy5wbGFuX2lkID09IHNlbGYucGxhbl8yCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwYXJlbnRfcGxhbl9sb2csICJUaGUgbG9nIGZvciBQbGFuIDIgbXVzdCBleGlzdCEiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHBhcmVudF9wbGFuX2xvZy5wbGFuX3N0YXR1cywgMCwgIlBsYW4gbG9nIHNob3VsZCBzdWNjZXNzIHN0YXR1cyIKICAgICAgICApCgogICAgICAgIGNoaWxkX3BsYW5fbG9nID0gcGxhbl9sb2dfcmVjb3JkcyAtIHBhcmVudF9wbGFuX2xvZwogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGNoaWxkX3BsYW5fbG9nLnBhcmVudF9mbGlnaHRfcGxhbl9sb2dfaWQsCiAgICAgICAgICAgIHBhcmVudF9wbGFuX2xvZywKICAgICAgICAgICAgIlNlY29uZCBwbGFuIGxvZyBzaG91bGQgY29udGFpbiBwYXJlbnQgbG9nIGxpbmsiLAogICAgICAgICkKICAgICAgICB0cmlnZ2VyaW5nID0gcGFyZW50X3BsYW5fbG9nLmNvbW1hbmRfbG9nX2lkcy5maWx0ZXJlZCgKICAgICAgICAgICAgbGFtYmRhIGxvZzogbG9nLnRyaWdnZXJlZF9wbGFuX2xvZ19pZAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBsZW4odHJpZ2dlcmluZyksIDEsICJFeHBlY3RlZCBleGFjdGx5IG9uZSB0cmlnZ2VyaW5nIGNvbW1hbmQgbG9nIgogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBjaGlsZF9wbGFuX2xvZy5wbGFuX3N0YXR1cywKICAgICAgICAgICAgdHJpZ2dlcmluZy5jb21tYW5kX3N0YXR1cywKICAgICAgICAgICAgIlBhcmVudCBydW4tcGxhbiBjb21tYW5kIHN0YXR1cyBtdXN0IGVxdWFsIGNoaWxkIHBsYW4gc3RhdHVzIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgcGFyZW50X3BsYW5fbG9nLmNvbW1hbmRfbG9nX2lkcy50cmlnZ2VyZWRfcGxhbl9sb2dfaWQsCiAgICAgICAgICAgIGNoaWxkX3BsYW5fbG9nLAogICAgICAgICAgICAiVGhlIGNvbW1hbmQgdHJpZ2dlcmVkIHBsYW4gbGluZSBzaG91bGQgYmUgZXF1YWwgdG8gY2hpbGQgcGxhbiIsCiAgICAgICAgKQoKICAgICAgICAjIENoZWNrIHRoYXQgd2UgY2Fubm90IGFkZCByZWN1cnNpdmUgcGxhbgogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleCgKICAgICAgICAgICAgVmFsaWRhdGlvbkVycm9yLCAiUmVjdXJzaXZlIHBsYW4gY2FsbCBkZXRlY3RlZCBpbiBwbGFuLioiCiAgICAgICAgKToKICAgICAgICAgICAgc2VsZi5wbGFuX2xpbmUuY3JlYXRlKAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJzZXF1ZW5jZSI6IDIwLAogICAgICAgICAgICAgICAgICAgICJwbGFuX2lkIjogc2VsZi5wbGFuXzEuaWQsCiAgICAgICAgICAgICAgICAgICAgImNvbW1hbmRfaWQiOiBzZWxmLmNvbW1hbmRfcnVuX2ZsaWdodF9wbGFuXzEuaWQsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkKCiAgICAgICAgIyBEZWxldGUgcGxhbiBsaW5lcyBmcm9tIGZpcnN0IHBsYW4KICAgICAgICBzZWxmLnBsYW5fMS5saW5lX2lkcyA9IEZhbHNlCiAgICAgICAgIyBSdW4gcGxhbgogICAgICAgIHNlbGYucGxhbl8yLl9ydW5fc2luZ2xlKHNlbGYuc2VydmVyX3Rlc3RfMSkKICAgICAgICBwbGFuX2xvZ19yZWNvcmRzID0gKAogICAgICAgICAgICBzZWxmLlBsYW5Mb2cuc2VhcmNoKFsoInNlcnZlcl9pZCIsICI9Iiwgc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkKV0pCiAgICAgICAgICAgIC0gcGxhbl9sb2dfcmVjb3JkcwogICAgICAgICkKCiAgICAgICAgcGFyZW50X3BsYW5fbG9nID0gcGxhbl9sb2dfcmVjb3Jkcy5maWx0ZXJlZCgKICAgICAgICAgICAgbGFtYmRhIHJlYzogcmVjLnBsYW5faWQgPT0gc2VsZi5wbGFuXzIKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBhcmVudF9wbGFuX2xvZywgIlRoZSBsb2cgZm9yIFBsYW4gMiBtdXN0IGV4aXN0ISIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgcGFyZW50X3BsYW5fbG9nLnBsYW5fc3RhdHVzLCBQTEFOX0lTX0VNUFRZLCAiUGxhbiBsb2cgc2hvdWxkIGZhaWxlZCBzdGF0dXMiCiAgICAgICAgKQoKICAgICAgICBjaGlsZF9wbGFuX2xvZyA9IHBsYW5fbG9nX3JlY29yZHMgLSBwYXJlbnRfcGxhbl9sb2cKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBjaGlsZF9wbGFuX2xvZy5wYXJlbnRfZmxpZ2h0X3BsYW5fbG9nX2lkLAogICAgICAgICAgICBwYXJlbnRfcGxhbl9sb2csCiAgICAgICAgICAgICJTZWNvbmQgcGxhbiBsb2cgc2hvdWxkIGNvbnRhaW4gcGFyZW50IGxvZyBsaW5rIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgY2hpbGRfcGxhbl9sb2cucGxhbl9zdGF0dXMsCiAgICAgICAgICAgIHBhcmVudF9wbGFuX2xvZy5jb21tYW5kX2xvZ19pZHMuY29tbWFuZF9zdGF0dXMsCiAgICAgICAgICAgICJUaGUgY29tbWFuZCBzdGF0dXMgb2YgcGFyZW50IHBsYW4gc2hvdWxkIGJlIGVxdWFsICIKICAgICAgICAgICAgIm9mIHN0YXR1cyBzZWNvbmQgZmxpZ2h0IHBsYW4iLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9wbGFuX3dpdGhfdHdvX3BsYW5zKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgdG8gY2hlY2sgdHdvIHBsYW5zIGZyb20gcGxhbgogICAgICAgICIiIgogICAgICAgIHNlbGYucGxhbl9saW5lLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNlcXVlbmNlIjogMTUsCiAgICAgICAgICAgICAgICAicGxhbl9pZCI6IHNlbGYucGxhbl8yLmlkLAogICAgICAgICAgICAgICAgImNvbW1hbmRfaWQiOiBzZWxmLmNvbW1hbmRfcnVuX2ZsaWdodF9wbGFuXzEuaWQsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgIyBDaGVjayBwbGFuIGxvZ3MKICAgICAgICBwbGFuX2xvZ19yZWNvcmRzID0gc2VsZi5QbGFuTG9nLnNlYXJjaCgKICAgICAgICAgICAgWygic2VydmVyX2lkIiwgIj0iLCBzZWxmLnNlcnZlcl90ZXN0XzEuaWQpXQogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihwbGFuX2xvZ19yZWNvcmRzKSwgMCwgIlBsYW4gbG9ncyBzaG91bGQgYmUgZW1wdHkiKQogICAgICAgICMgUnVuIHBsYW4KICAgICAgICBzZWxmLnBsYW5fMi5fcnVuX3NpbmdsZShzZWxmLnNlcnZlcl90ZXN0XzEpCiAgICAgICAgIyBDaGVjayBwbGFuIGxvZ3MgYWZ0ZXIgZXhlY3V0ZSBjb21tYW5kIHdpdGggcGxhbiBhY3Rpb24KICAgICAgICBwbGFuX2xvZ19yZWNvcmRzID0gc2VsZi5QbGFuTG9nLnNlYXJjaCgKICAgICAgICAgICAgWygic2VydmVyX2lkIiwgIj0iLCBzZWxmLnNlcnZlcl90ZXN0XzEuaWQpXQogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihwbGFuX2xvZ19yZWNvcmRzKSwgMywgbXNnPSJTaG91bGQgYmUgMyBwbGFuIGxvZ3MiKQoKICAgIGRlZiB0ZXN0X3BsYW5fd2l0aF9uZXN0ZWRfcGxhbnMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCB0byBjaGVjayB0d28gcGxhbnMgZnJvbSBwbGFuCiAgICAgICAgIiIiCiAgICAgICAgY29tbWFuZF9ydW5fZmxpZ2h0X3BsYW5fMiA9IHNlbGYuQ29tbWFuZC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlJ1biBGbGlnaHQgUGxhbiIsCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogInBsYW4iLAogICAgICAgICAgICAgICAgImZsaWdodF9wbGFuX2lkIjogc2VsZi5wbGFuXzIuaWQsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgcGxhbl8zID0gc2VsZi5QbGFuLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBwbGFuIDMiLAogICAgICAgICAgICAgICAgIm5vdGUiOiAiUnVuIGZsaWdodCBwbGFuIDIiLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHNlbGYucGxhbl9saW5lLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNlcXVlbmNlIjogNSwKICAgICAgICAgICAgICAgICJwbGFuX2lkIjogcGxhbl8zLmlkLAogICAgICAgICAgICAgICAgImNvbW1hbmRfaWQiOiBjb21tYW5kX3J1bl9mbGlnaHRfcGxhbl8yLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgICMgQ2hlY2sgcGxhbiBsb2dzCiAgICAgICAgcGxhbl9sb2dfcmVjb3JkcyA9IHNlbGYuUGxhbkxvZy5zZWFyY2goCiAgICAgICAgICAgIFsoInNlcnZlcl9pZCIsICI9Iiwgc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkKV0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocGxhbl9sb2dfcmVjb3JkcyksIDAsICJQbGFuIGxvZ3Mgc2hvdWxkIGJlIGVtcHR5IikKICAgICAgICAjIFJ1biBwbGFuCiAgICAgICAgcGxhbl8zLl9ydW5fc2luZ2xlKHNlbGYuc2VydmVyX3Rlc3RfMSkKICAgICAgICAjIENoZWNrIHBsYW4gbG9ncyBhZnRlciBleGVjdXRlIGNvbW1hbmQgd2l0aCBwbGFuIGFjdGlvbgogICAgICAgIHBsYW5fbG9nX3JlY29yZHMgPSBzZWxmLlBsYW5Mb2cuc2VhcmNoKAogICAgICAgICAgICBbKCJzZXJ2ZXJfaWQiLCAiPSIsIHNlbGYuc2VydmVyX3Rlc3RfMS5pZCldCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHBsYW5fbG9nX3JlY29yZHMpLCAzLCBtc2c9IlNob3VsZCBiZSAzIHBsYW4gbG9ncyIpCgogICAgICAgIGxhc3RfY2hpbGRfcGxhbl9sb2cgPSBwbGFuX2xvZ19yZWNvcmRzLmZpbHRlcmVkKAogICAgICAgICAgICBsYW1iZGEgcmVjOiByZWMucGxhbl9pZCA9PSBzZWxmLnBsYW5fMQogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydFRydWUobGFzdF9jaGlsZF9wbGFuX2xvZywgIlRoZSBsb2cgZm9yIFBsYW4gMSBtdXN0IGV4aXN0ISIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbGFzdF9jaGlsZF9wbGFuX2xvZy5wbGFuX3N0YXR1cywgMCwgIlBsYW4gbG9nIHNob3VsZCBzdWNjZXNzIHN0YXR1cyIKICAgICAgICApCgogICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgIGxhc3RfY2hpbGRfcGxhbl9sb2cucGFyZW50X2ZsaWdodF9wbGFuX2xvZ19pZCwKICAgICAgICAgICAgcGxhbl9sb2dfcmVjb3JkcywKICAgICAgICAgICAgIlBhcmVudCBwbGFuIGxvZ3Mgc2hvdWxkIGV4aXN0IiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbGFzdF9jaGlsZF9wbGFuX2xvZy5wYXJlbnRfZmxpZ2h0X3BsYW5fbG9nX2lkLnBsYW5faWQsCiAgICAgICAgICAgIHNlbGYucGxhbl8yLAogICAgICAgICAgICAiUGFyZW50IHBsYW4gc2hvdWxkIGJlIGVxdWFsIHRvIHBsYW4gMiIsCiAgICAgICAgKQoKICAgICAgICBjaGlsZF9wbGFuX2xvZyA9IHBsYW5fbG9nX3JlY29yZHMuZmlsdGVyZWQoCiAgICAgICAgICAgIGxhbWJkYSByZWM6IHJlYy5wbGFuX2lkID09IHNlbGYucGxhbl8yCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgIGNoaWxkX3BsYW5fbG9nLnBhcmVudF9mbGlnaHRfcGxhbl9sb2dfaWQsCiAgICAgICAgICAgIHBsYW5fbG9nX3JlY29yZHMsCiAgICAgICAgICAgICJQYXJlbnQgcGxhbiBsb2dzIHNob3VsZCBleGlzdCIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGNoaWxkX3BsYW5fbG9nLnBhcmVudF9mbGlnaHRfcGxhbl9sb2dfaWQucGxhbl9pZCwKICAgICAgICAgICAgcGxhbl8zLAogICAgICAgICAgICAiUGFyZW50IHBsYW4gc2hvdWxkIGJlIGVxdWFsIHRvIHBsYW4gMyIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGNoaWxkX3BsYW5fbG9nLmNvbW1hbmRfbG9nX2lkcy50cmlnZ2VyZWRfcGxhbl9sb2dfaWQsCiAgICAgICAgICAgIGxhc3RfY2hpbGRfcGxhbl9sb2csCiAgICAgICAgICAgICJUaGUgY29tbWFuZCB0cmlnZ2VyZWQgcGxhbiBsaW5lIHNob3VsZCBiZSBlcXVhbCB0byBsYXN0IGNoaWxkIHBsYW4iLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBjaGlsZF9wbGFuX2xvZy5jb21tYW5kX2xvZ19pZHMudHJpZ2dlcmVkX3BsYW5fbG9nX2lkLAogICAgICAgICAgICBsYXN0X2NoaWxkX3BsYW5fbG9nLAogICAgICAgICAgICAiVGhlIGNvbW1hbmQgdHJpZ2dlcmVkIHBsYW4gbGluZSBzaG91bGQgYmUgZXF1YWwgdG8gbGFzdCBjaGlsZCBwbGFuIiwKICAgICAgICApCiAgICAgICAgcGFyZW50X3BsYW5fbG9nID0gcGxhbl9sb2dfcmVjb3JkcyAtIGNoaWxkX3BsYW5fbG9nIC0gbGFzdF9jaGlsZF9wbGFuX2xvZwogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHBhcmVudF9wbGFuX2xvZy5jb21tYW5kX2xvZ19pZHMudHJpZ2dlcmVkX3BsYW5fbG9nX2lkLAogICAgICAgICAgICBjaGlsZF9wbGFuX2xvZywKICAgICAgICAgICAgIlRoZSBjb21tYW5kIHRyaWdnZXJlZCBwbGFuIGxpbmUgZnJvbSBwYXJlbnQgcGxhbiAiCiAgICAgICAgICAgICJzaG91bGQgYmUgZXF1YWwgdG8gY2hpbGQgcGxhbiIsCiAgICAgICAgKQoKICAgICAgICAjIENoZWNrIHRoYXQgd2UgY2Fubm90IGNoYW5nZSBjb21tYW5kIHdpdGggZXhpc3RpbmcgcGxhbiwKICAgICAgICAjIGJlY2F1c2UgaXQncyByZWN1cnNpdmUgcGxhbgogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleCgKICAgICAgICAgICAgVmFsaWRhdGlvbkVycm9yLCAiUmVjdXJzaXZlIHBsYW4gY2FsbCBkZXRlY3RlZCBpbiBwbGFuLioiCiAgICAgICAgKToKICAgICAgICAgICAgc2VsZi5wbGFuX2xpbmVfMS53cml0ZSgKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiY29tbWFuZF9pZCI6IGNvbW1hbmRfcnVuX2ZsaWdodF9wbGFuXzIuaWQsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkKCiAgICAgICAgIyBTZXQgdGhlIHByZXZpb3VzIGNvbW1hbmQgYmFjawoKICAgICAgICBzZWxmLnBsYW5fbGluZV8xLndyaXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiY29tbWFuZF9pZCI6IHNlbGYuY29tbWFuZF9jcmVhdGVfZGlyLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgICMgLS0tIENoZWNrIHNlcnZlciBkZXBlbmRlbmN5IGhhbmRsaW5nCgogICAgICAgICMgUmVtb3ZlIGFsbCBleGlzdGluZyBmbGlnaHQgcGxhbiBsb2dzCiAgICAgICAgc2VsZi5QbGFuTG9nLnNlYXJjaChbXSkudW5saW5rKCkKCiAgICAgICAgIyBTZXQgc2VydmVyIGRlcGVuZGVuY3kgZm9yIHBsYW4gMgogICAgICAgIHNlbGYucGxhbl8yLndyaXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2VydmVyX2lkcyI6IFsoNiwgMCwgW3NlbGYuc2VydmVyLmlkXSldLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHBsYW5fbG9nID0gc2VsZi5zZXJ2ZXJfdGVzdF8xLnJ1bl9mbGlnaHRfcGxhbihzZWxmLnBsYW5fMikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBsYW5fbG9nLnBsYW5fc3RhdHVzLCBQTEFOX05PVF9DT01QQVRJQkxFX1dJVEhfU0VSVkVSKQoKICAgICAgICAjIFJ1biBwbGFuIG9uIGFsbG93ZWQgc2VydmVyCiAgICAgICAgcGxhbl9sb2cgPSBzZWxmLnNlcnZlci5ydW5fZmxpZ2h0X3BsYW4oc2VsZi5wbGFuXzIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwbGFuX2xvZy5wbGFuX3N0YXR1cywgMCkKCiAgICBkZWYgdGVzdF9mYWlsZWRfZmlyc3RfY2hpbGRfcGxhbl93aXRoX2Fub3RoZXJfcGxhbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDaGVjayB0aGF0IGNoaWxkIHBsYW4gd2FzIGZhaWxlZCB0aGVuIHBhcmVudCBwbGFuIGlzIGZhaWxlZCB0b28KICAgICAgICAiIiIKICAgICAgICAjIEFkZCBuZXcgcGxhbiBsaW5lCiAgICAgICAgc2VsZi5wbGFuX2xpbmUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2VxdWVuY2UiOiAxNSwKICAgICAgICAgICAgICAgICJwbGFuX2lkIjogc2VsZi5wbGFuXzIuaWQsCiAgICAgICAgICAgICAgICAiY29tbWFuZF9pZCI6IHNlbGYuY29tbWFuZF9ydW5fZmxpZ2h0X3BsYW5fMS5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICAjIENoZWNrIHBsYW4gbG9ncwogICAgICAgIHBsYW5fbG9nX3JlY29yZHMgPSBzZWxmLlBsYW5Mb2cuc2VhcmNoKAogICAgICAgICAgICBbKCJzZXJ2ZXJfaWQiLCAiPSIsIHNlbGYuc2VydmVyX3Rlc3RfMS5pZCldCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHBsYW5fbG9nX3JlY29yZHMpLCAwLCAiUGxhbiBsb2dzIHNob3VsZCBiZSBlbXB0eSIpCgogICAgICAgICMgU2ltdWxhdGUgYSBmYWlsZWQgUGxhbiAxLiBUbyBhY2hpZXZlIHRoaXMsIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBjb21tYW5kCiAgICAgICAgIyBhc3NvY2lhdGVkIHdpdGggUGxhbiAxIHRvIGFwcGx5IHRoZSBkZXNpcmVkIHNpZGUgZWZmZWN0LgogICAgICAgIHNlbGYucGxhbl8xLmxpbmVfaWRzLmNvbW1hbmRfaWRbMF0uY29kZSA9ICJmYWlsIgoKICAgICAgICAjIFJ1biBwbGFuCiAgICAgICAgc2VsZi5wbGFuXzIuX3J1bl9zaW5nbGUoc2VsZi5zZXJ2ZXJfdGVzdF8xKQoKICAgICAgICAjIENoZWNrIHBsYW4gbG9ncyBhZnRlciBleGVjdXRlIGNvbW1hbmQgd2l0aCBwbGFuIGFjdGlvbgogICAgICAgIHBsYW5fbG9nX3JlY29yZHMgPSBzZWxmLlBsYW5Mb2cuc2VhcmNoKAogICAgICAgICAgICBbKCJzZXJ2ZXJfaWQiLCAiPSIsIHNlbGYuc2VydmVyX3Rlc3RfMS5pZCldCiAgICAgICAgKQogICAgICAgICMgMiBsb2dzIG9ubHkgYmVjYXVzZSBwbGFuIHNob3VsZCBleGlzdCB3aXRoIGVycm9yIGFmdGVyIGZpcnN0IGZhaWxlZCBjb21tYW5kCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocGxhbl9sb2dfcmVjb3JkcyksIDIsIG1zZz0iU2hvdWxkIGJlIDIgcGxhbiBsb2dzIikKCiAgICAgICAgcGFyZW50X3BsYW5fbG9nID0gcGxhbl9sb2dfcmVjb3Jkcy5maWx0ZXJlZCgKICAgICAgICAgICAgbGFtYmRhIHJlYzogcmVjLnBsYW5faWQgPT0gc2VsZi5wbGFuXzIKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBhcmVudF9wbGFuX2xvZywgIlRoZSBsb2cgZm9yIFBsYW4gMiBtdXN0IGV4aXN0ISIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgcGFyZW50X3BsYW5fbG9nLnBsYW5fc3RhdHVzLCBHRU5FUkFMX0VSUk9SLCAiUGxhbiBsb2cgc2hvdWxkIGZhaWxlZCBzdGF0dXMiCiAgICAgICAgKQoKICAgICAgICBjaGlsZF9wbGFuX2xvZyA9IHBsYW5fbG9nX3JlY29yZHMgLSBwYXJlbnRfcGxhbl9sb2cKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBjaGlsZF9wbGFuX2xvZy5wYXJlbnRfZmxpZ2h0X3BsYW5fbG9nX2lkLAogICAgICAgICAgICBwYXJlbnRfcGxhbl9sb2csCiAgICAgICAgICAgICJTZWNvbmQgcGxhbiBsb2cgc2hvdWxkIGNvbnRhaW4gcGFyZW50IGxvZyBsaW5rIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgY2hpbGRfcGxhbl9sb2cucGxhbl9zdGF0dXMsCiAgICAgICAgICAgIHBhcmVudF9wbGFuX2xvZy5jb21tYW5kX2xvZ19pZHMuY29tbWFuZF9zdGF0dXMsCiAgICAgICAgICAgICJUaGUgY29tbWFuZCBzdGF0dXMgb2YgbWFpbiBwbGFuIHNob3VsZCBiZSBlcXVhbCAiCiAgICAgICAgICAgICJvZiBzdGF0dXMgc2Vjb25kIGZsaWdodCBwbGFuIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfZmFpbGVkX3NlY29uZF9jaGlsZF9wbGFuX3dpdGhfYW5vdGhlcl9wbGFuKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIENoZWNrIHRoYXQgY2hpbGQgcGxhbiB3YXMgZmFpbGVkIHRoZW4gcGFyZW50IHBsYW4gaXMgZmFpbGVkIHRvbwogICAgICAgICIiIgogICAgICAgICMgQWRkIG5ldyBwbGFuIGxpbmUKICAgICAgICBsaW5lID0gc2VsZi5wbGFuX2xpbmUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2VxdWVuY2UiOiAxNSwKICAgICAgICAgICAgICAgICJwbGFuX2lkIjogc2VsZi5wbGFuXzIuaWQsCiAgICAgICAgICAgICAgICAiY29tbWFuZF9pZCI6IHNlbGYuY29tbWFuZF9ydW5fZmxpZ2h0X3BsYW5fMS5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgY3hfdG93ZXJfcGxhbl9vYmogPSBzZWxmLnJlZ2lzdHJ5WyJjeC50b3dlci5wbGFuIl0KICAgICAgICBfcnVuX3NpbmdsZV9zdXBlciA9IGN4X3Rvd2VyX3BsYW5fb2JqLl9ydW5fc2luZ2xlCgogICAgICAgIGRlZiBfcnVuX3NpbmdsZSh0aGlzLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICB0aGlzID09IHNlbGYucGxhbl8xCiAgICAgICAgICAgICAgICBhbmQgdGhpcy5lbnZbImN4LnRvd2VyLnBsYW4ubG9nIl0KICAgICAgICAgICAgICAgIC5icm93c2Uoa3dhcmdzWyJsb2ciXVsicGxhbl9sb2dfaWQiXSkKICAgICAgICAgICAgICAgIC5wbGFuX2xpbmVfZXhlY3V0ZWRfaWQKICAgICAgICAgICAgICAgID09IGxpbmUKICAgICAgICAgICAgKToKICAgICAgICAgICAgICAgICMgU2ltdWxhdGUgYSBmYWlsZWQgUGxhbiAxLiBUbyBhY2hpZXZlIHRoaXMsIHdlIG5lZWQgdG8gdXBkYXRlCiAgICAgICAgICAgICAgICAjIHRoZSBjb21tYW5kIGFzc29jaWF0ZWQgd2l0aCBQbGFuIDEgdG8gYXBwbHkgdGhlIGRlc2lyZWQgc2lkZSBlZmZlY3QuCiAgICAgICAgICAgICAgICBzZWxmLnBsYW5fMS5saW5lX2lkcy5jb21tYW5kX2lkWzBdLmNvZGUgPSAiZmFpbCIKICAgICAgICAgICAgcmV0dXJuIF9ydW5fc2luZ2xlX3N1cGVyKHRoaXMsICphcmdzLCAqKmt3YXJncykKCiAgICAgICAgd2l0aCBwYXRjaC5vYmplY3QoY3hfdG93ZXJfcGxhbl9vYmosICJfcnVuX3NpbmdsZSIsIF9ydW5fc2luZ2xlKToKICAgICAgICAgICAgIyBSdW4gcGxhbgogICAgICAgICAgICBzZWxmLnBsYW5fMi5fcnVuX3NpbmdsZShzZWxmLnNlcnZlcl90ZXN0XzEpCgogICAgICAgICMgQ2hlY2sgcGxhbiBsb2dzIGFmdGVyIGV4ZWN1dGUgY29tbWFuZCB3aXRoIHBsYW4gYWN0aW9uCiAgICAgICAgcGxhbl9sb2dfcmVjb3JkcyA9IHNlbGYuUGxhbkxvZy5zZWFyY2goCiAgICAgICAgICAgIFsoInNlcnZlcl9pZCIsICI9Iiwgc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkKV0KICAgICAgICApCiAgICAgICAgIyAzIGxvZ3MgYmVjYXVzZSBwbGFuIHNob3VsZCBleGlzdCB3aXRoIGVycm9yIGFmdGVyIHNlY29uZCBmYWlsZWQgY29tbWFuZAogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHBsYW5fbG9nX3JlY29yZHMpLCAzLCBtc2c9IlNob3VsZCBiZSAzIHBsYW4gbG9ncyIpCgogICAgICAgIHBhcmVudF9wbGFuX2xvZyA9IHBsYW5fbG9nX3JlY29yZHMuZmlsdGVyZWQoCiAgICAgICAgICAgIGxhbWJkYSByZWM6IHJlYy5wbGFuX2lkID09IHNlbGYucGxhbl8yCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwYXJlbnRfcGxhbl9sb2csICJUaGUgbG9nIGZvciBQbGFuIDIgbXVzdCBleGlzdCEiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHBhcmVudF9wbGFuX2xvZy5wbGFuX3N0YXR1cywgR0VORVJBTF9FUlJPUiwgIlBsYW4gbG9nIHNob3VsZCBmYWlsZWQgc3RhdHVzIgogICAgICAgICkKCiAgICAgICAgY2hpbGRfcGxhbl9sb2cgPSBwbGFuX2xvZ19yZWNvcmRzIC0gcGFyZW50X3BsYW5fbG9nCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgY2hpbGRfcGxhbl9sb2cucGFyZW50X2ZsaWdodF9wbGFuX2xvZ19pZCwKICAgICAgICAgICAgcGFyZW50X3BsYW5fbG9nLAogICAgICAgICAgICAiU2Vjb25kIHBsYW4gbG9nIHNob3VsZCBjb250YWluIHBhcmVudCBsb2cgbGluayIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGxlbihjaGlsZF9wbGFuX2xvZyksCiAgICAgICAgICAgIDIsCiAgICAgICAgICAgICJNdXN0IGJlIDIgY2hpbGQgcGxhbiBsb2dzIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRJbigKICAgICAgICAgICAgR0VORVJBTF9FUlJPUiwKICAgICAgICAgICAgY2hpbGRfcGxhbl9sb2cubWFwcGVkKCJwbGFuX3N0YXR1cyIpLAogICAgICAgICAgICAiT25lIG9mIHBsYW4gc3RhdHVzIG9mIGNoaWxkIHBsYW4gbXVzdCBiZSBHRU5FUkFMX0VSUk9SIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRJbigKICAgICAgICAgICAgMCwKICAgICAgICAgICAgY2hpbGRfcGxhbl9sb2cubWFwcGVkKCJwbGFuX3N0YXR1cyIpLAogICAgICAgICAgICAiT25lIG9mIHBsYW4gc3RhdHVzIG9mIGNoaWxkIHBsYW4gbXVzdCBiZSBHRU5FUkFMX0VSUk9SIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfcGxhbl93aXRoX2Fub3RoZXJfcGxhbl93aXRoX2NvbmRpdGlvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHRoYXQgcGFyZW50IHBsYW4gd2lsbCBzdWNjZXNzIGZpbmlzaGVkCiAgICAgICAgaWYgY2hpbGQgcGxhbiBleGVjdXRhYmxlIGJ5IGNvbmRpdGlvbgogICAgICAgICIiIgogICAgICAgICMgQWRkIGNvbmRpdGlvbiBmb3IgZmlyc3QgcGxhbiBsaW5lCiAgICAgICAgc2VsZi5wbGFuX2xpbmVfMS5jb25kaXRpb24gPSAiMSA9PSAxIgogICAgICAgICMgQ2hlY2sgcGxhbiBsb2dzCiAgICAgICAgcGxhbl9sb2dfcmVjb3JkcyA9IHNlbGYuUGxhbkxvZy5zZWFyY2goCiAgICAgICAgICAgIFsoInNlcnZlcl9pZCIsICI9Iiwgc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkKV0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocGxhbl9sb2dfcmVjb3JkcyksIDAsICJQbGFuIGxvZ3Mgc2hvdWxkIGJlIGVtcHR5IikKICAgICAgICAjIFJ1biBwbGFuCiAgICAgICAgc2VsZi5wbGFuXzIuX3J1bl9zaW5nbGUoc2VsZi5zZXJ2ZXJfdGVzdF8xKQogICAgICAgICMgQ2hlY2sgcGxhbiBsb2dzIGFmdGVyIGV4ZWN1dGUgY29tbWFuZCB3aXRoIHBsYW4gYWN0aW9uCiAgICAgICAgcGxhbl9sb2dfcmVjb3JkcyA9IHNlbGYuUGxhbkxvZy5zZWFyY2goCiAgICAgICAgICAgIFsoInNlcnZlcl9pZCIsICI9Iiwgc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkKV0KICAgICAgICApCgogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHBsYW5fbG9nX3JlY29yZHMpLCAyLCBtc2c9IlNob3VsZCBiZSAyIHBsYW4gbG9ncyIpCgogICAgICAgIHBhcmVudF9wbGFuX2xvZyA9IHBsYW5fbG9nX3JlY29yZHMuZmlsdGVyZWQoCiAgICAgICAgICAgIGxhbWJkYSByZWM6IHJlYy5wbGFuX2lkID09IHNlbGYucGxhbl8yCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwYXJlbnRfcGxhbl9sb2csICJUaGUgbG9nIGZvciBQbGFuIDIgbXVzdCBleGlzdCEiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHBhcmVudF9wbGFuX2xvZy5wbGFuX3N0YXR1cywgMCwgIlBsYW4gbG9nIHNob3VsZCBzdWNjZXNzIHN0YXR1cyIKICAgICAgICApCgogICAgICAgIGNoaWxkX3BsYW5fbG9nID0gcGxhbl9sb2dfcmVjb3JkcyAtIHBhcmVudF9wbGFuX2xvZwogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGNoaWxkX3BsYW5fbG9nLnBhcmVudF9mbGlnaHRfcGxhbl9sb2dfaWQsCiAgICAgICAgICAgIHBhcmVudF9wbGFuX2xvZywKICAgICAgICAgICAgIlNlY29uZCBwbGFuIGxvZyBzaG91bGQgY29udGFpbiBwYXJlbnQgbG9nIGxpbmsiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBjaGlsZF9wbGFuX2xvZy5wbGFuX3N0YXR1cywKICAgICAgICAgICAgcGFyZW50X3BsYW5fbG9nLmNvbW1hbmRfbG9nX2lkcy5maWx0ZXJlZCgKICAgICAgICAgICAgICAgIGxhbWJkYSBsb2c6IGxvZy50cmlnZ2VyZWRfcGxhbl9sb2dfaWQKICAgICAgICAgICAgKS5jb21tYW5kX3N0YXR1cywKICAgICAgICAgICAgIlRoZSBjb21tYW5kIHN0YXR1cyBvZiBtYWluIHBsYW4gc2hvdWxkIGJlIGVxdWFsICIKICAgICAgICAgICAgIm9mIHN0YXR1cyBzZWNvbmQgZmxpZ2h0IHBsYW4iLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9wbGFuX3dpdGhfYW5vdGhlcl9wbGFuX3dpdGhfbm90X2V4ZWN1dGFibGVfY29uZGl0aW9uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgcGxhbiB3aXRoIG5vdCBleGVjdXRhYmxlIGNvbmRpdGlvbiBmb3Igc2Vjb25kIHBsYW4gbGluZQogICAgICAgICIiIgogICAgICAgICMgQWRkIGNvbmRpdGlvbiBmb3IgZmlyc3QgcGxhbiBsaW5lCiAgICAgICAgc2VsZi5wbGFuX2xpbmVfMS5jb25kaXRpb24gPSAie3sgb2Rvb192ZXJzaW9uIH19ID09ICcxNC4wJyIKICAgICAgICAjIENoZWNrIHBsYW4gbG9ncwogICAgICAgIHBsYW5fbG9nX3JlY29yZHMgPSBzZWxmLlBsYW5Mb2cuc2VhcmNoKAogICAgICAgICAgICBbKCJzZXJ2ZXJfaWQiLCAiPSIsIHNlbGYuc2VydmVyX3Rlc3RfMS5pZCldCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHBsYW5fbG9nX3JlY29yZHMpLCAwLCAiUGxhbiBsb2dzIHNob3VsZCBiZSBlbXB0eSIpCiAgICAgICAgIyBSdW4gcGxhbgogICAgICAgIHNlbGYucGxhbl8yLl9ydW5fc2luZ2xlKHNlbGYuc2VydmVyX3Rlc3RfMSkKCiAgICAgICAgIyBDaGVjayBwbGFuIGxvZ3MgYWZ0ZXIgZXhlY3V0ZSBjb21tYW5kIHdpdGggcGxhbiBhY3Rpb24KICAgICAgICBwbGFuX2xvZ19yZWNvcmRzID0gc2VsZi5QbGFuTG9nLnNlYXJjaCgKICAgICAgICAgICAgWygic2VydmVyX2lkIiwgIj0iLCBzZWxmLnNlcnZlcl90ZXN0XzEuaWQpXQogICAgICAgICkKCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocGxhbl9sb2dfcmVjb3JkcyksIDIsIG1zZz0iU2hvdWxkIGJlIDIgcGxhbiBsb2dzIikKCiAgICAgICAgc2VsZi5hc3NlcnRJbigKICAgICAgICAgICAgUExBTl9MSU5FX0NPTkRJVElPTl9DSEVDS19GQUlMRUQsCiAgICAgICAgICAgIHBsYW5fbG9nX3JlY29yZHMuY29tbWFuZF9sb2dfaWRzLm1hcHBlZCgiY29tbWFuZF9zdGF0dXMiKSwKICAgICAgICAgICAgIk9uZSBvZiBjb21tYW5kcyBzaG91bGQgYmUgc2tpcHBlZCIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3BsYW5fd2l0aF9hbm90aGVyX3BsYW5fd2l0aF9hbGxfbm90X2V4ZWN1dGFibGVfY29uZGl0aW9uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgcGxhbiB3aXRoIG5vdCBleGVjdXRhYmxlIGNvbmRpdGlvbiBmb3Igc2Vjb25kIHBsYW4gbGluZQogICAgICAgICIiIgogICAgICAgICMgQWRkIGNvbmRpdGlvbiBmb3IgYWxsIHBsYW4gbGluZXMKICAgICAgICBzZWxmLnBsYW5fbGluZV8xLmNvbmRpdGlvbiA9ICJ7eyBvZG9vX3ZlcnNpb24gfX0gPT0gJzE0LjAnIgogICAgICAgIHNlbGYucGxhbl9saW5lXzIuY29uZGl0aW9uID0gInt7IG9kb29fdmVyc2lvbiB9fSA9PSAnMTQuMCciCgogICAgICAgIHNlbGYucGxhbl8yX2xpbmVfMS5jb25kaXRpb24gPSAie3sgb2Rvb192ZXJzaW9uIH19ID09ICcxNC4wJyIKICAgICAgICBzZWxmLnBsYW5fMl9saW5lXzIuY29uZGl0aW9uID0gInt7IG9kb29fdmVyc2lvbiB9fSA9PSAnMTQuMCciCgogICAgICAgIHNlbGYucGxhbl8yLl9ydW5fc2luZ2xlKHNlbGYuc2VydmVyX3Rlc3RfMSkKCiAgICAgICAgIyBDaGVjayBwbGFuIGxvZ3MgYWZ0ZXIgZXhlY3V0ZSBjb21tYW5kIHdpdGggcGxhbiBhY3Rpb24KICAgICAgICBwbGFuX2xvZ19yZWNvcmRzID0gc2VsZi5QbGFuTG9nLnNlYXJjaCgKICAgICAgICAgICAgWygic2VydmVyX2lkIiwgIj0iLCBzZWxmLnNlcnZlcl90ZXN0XzEuaWQpXQogICAgICAgICkKCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocGxhbl9sb2dfcmVjb3JkcyksIDEsIG1zZz0iU2hvdWxkIGJlIDEgcGxhbiBsb2dzIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBQTEFOX0xJTkVfQ09ORElUSU9OX0NIRUNLX0ZBSUxFRCwKICAgICAgICAgICAgcGxhbl9sb2dfcmVjb3Jkcy5jb21tYW5kX2xvZ19pZHMuZmlsdGVyZWQoCiAgICAgICAgICAgICAgICBsYW1iZGEgbG9nOiBsb2cuY29tbWFuZF9pZCA9PSBzZWxmLmNvbW1hbmRfcnVuX2ZsaWdodF9wbGFuXzEKICAgICAgICAgICAgKS5jb21tYW5kX3N0YXR1cywKICAgICAgICAgICAgIkNvbW1hbmQgc3RhdHVzIHNob3VsZCBiZSBza2lwcGVkIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfcGxhbl91bmxpbmsoc2VsZik6CiAgICAgICAgcGxhbiA9IHNlbGYucGxhbl8xLmNvcHkoKQogICAgICAgIHBsYW5faWQgPSBwbGFuLmlkCiAgICAgICAgcGxhbl9saW5lX2lkcyA9IHBsYW4ubGluZV9pZHMKICAgICAgICBwbGFuX2xpbmVfYWN0aW9uX2lkcyA9IHBsYW4ubWFwcGVkKCJsaW5lX2lkcy5hY3Rpb25faWRzIikKCiAgICAgICAgcGxhbi51bmxpbmsoKQoKICAgICAgICBzZWxmLmFzc2VydEZhbHNlKAogICAgICAgICAgICBzZWxmLlBsYW4uc2VhcmNoKFsoImlkIiwgIj0iLCBwbGFuX2lkKV0pLCBtc2c9IlBsYW4gc2hvdWxkIGJlIGRlbGV0ZWQiCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoCiAgICAgICAgICAgIHNlbGYucGxhbl9saW5lLnNlYXJjaChbKCJpZCIsICJpbiIsIHBsYW5fbGluZV9pZHMuaWRzKV0pLAogICAgICAgICAgICBtc2c9IlBsYW4gbGluZSBzaG91bGQgYmUgZGVsZXRlZCB3aGVuIFBsYW4gaXMgZGVsZXRlZCIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoCiAgICAgICAgICAgIHNlbGYucGxhbl9saW5lX2FjdGlvbi5zZWFyY2goWygiaWQiLCAiaW4iLCBwbGFuX2xpbmVfYWN0aW9uX2lkcy5pZHMpXSksCiAgICAgICAgICAgIG1zZz0iUGxhbiBsaW5lIGFjdGlvbiBzaG91bGQgYmUgZGVsZXRlZCB3aGVuIFBsYW4gbGluZSBpcyBkZWxldGVkIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfcGxhbl9jb21tYW5kX3NlcnZlcl9jb21wYXRpYmlsaXR5KHNlbGYpOgogICAgICAgICIiIlRlc3QgcGxhbiBleGVjdXRpb24gd2l0aCBzZXJ2ZXItcmVzdHJpY3RlZCBmbGlnaHQgcGxhbnMiIiIKICAgICAgICAjIENyZWF0ZSBhIG5ldyB0ZXN0IHNlcnZlcgogICAgICAgIHRlc3Rfc2VydmVyID0gc2VsZi5TZXJ2ZXIuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IFNlcnZlciIsCiAgICAgICAgICAgICAgICAiaXBfdjRfYWRkcmVzcyI6ICJsb2NhbGhvc3QiLAogICAgICAgICAgICAgICAgInNzaF91c2VybmFtZSI6ICJhZG1pbiIsCiAgICAgICAgICAgICAgICAic3NoX3Bhc3N3b3JkIjogInBhc3N3b3JkIiwKICAgICAgICAgICAgICAgICJzc2hfYXV0aF9tb2RlIjogInAiLAogICAgICAgICAgICAgICAgImhvc3Rfa2V5IjogInRlc3Rfa2V5IiwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBDcmVhdGUgYSBmbGlnaHQgcGxhbiByZXN0cmljdGVkIHRvIHRoZSB0ZXN0IHNlcnZlcgogICAgICAgIHBsYW4gPSBzZWxmLlBsYW4uY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJTZXJ2ZXIgUmVzdHJpY3RlZCBQbGFuIiwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWRzIjogWyg2LCAwLCBbdGVzdF9zZXJ2ZXIuaWRdKV0sCiAgICAgICAgICAgICAgICAibGluZV9pZHMiOiBbCiAgICAgICAgICAgICAgICAgICAgKDAsIDAsIHsiY29tbWFuZF9pZCI6IHNlbGYuY29tbWFuZF9jcmVhdGVfZGlyLmlkLCAic2VxdWVuY2UiOiAxfSkKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgU2hvdWxkIGZhaWwgd2hlbiBleGVjdXRpbmcgb24gbm9uLWFsbG93ZWQgc2VydmVyCiAgICAgICAgcGxhbl9sb2cgPSBwbGFuLl9ydW5fc2luZ2xlKHNlbGYuc2VydmVyX3Rlc3RfMSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBsYW5fbG9nLnBsYW5fc3RhdHVzLCBQTEFOX05PVF9DT01QQVRJQkxFX1dJVEhfU0VSVkVSKQoKICAgICAgICAjIFNob3VsZCB3b3JrIG9uIGFsbG93ZWQgc2VydmVyCiAgICAgICAgcGxhbi5fcnVuX3NpbmdsZSh0ZXN0X3NlcnZlcikKICAgICAgICBwbGFuX2xvZyA9IHNlbGYuUGxhbkxvZy5zZWFyY2goCiAgICAgICAgICAgIFsoInBsYW5faWQiLCAiPSIsIHBsYW4uaWQpLCAoInNlcnZlcl9pZCIsICI9IiwgdGVzdF9zZXJ2ZXIuaWQpXSwgbGltaXQ9MQogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBsYW5fbG9nLmNvbW1hbmRfbG9nX2lkcy5jb21tYW5kX3N0YXR1cywgMCkKCiAgICBkZWYgdGVzdF9hbm90aGVyX3BsYW5fcnVubmluZyhzZWxmKToKICAgICAgICAiIiJUZXN0IHRoZSBwYXJhbGxlbCBwbGFuIHJ1bm5pbmciIiIKCiAgICAgICAgIyBFbnN1cmUgdGhhdCB0aGUgcGxhbiBkb2Vzbid0IGFsbG93IHBhcmFsbGVsIHJ1bm5pbmcKICAgICAgICBzZWxmLnBsYW5fMS53cml0ZSh7ImFsbG93X3BhcmFsbGVsX3J1biI6IEZhbHNlfSkKCiAgICAgICAgIyBDcmVhdGUgYSBuZXcgcGxhbiBsb2cgd2l0aCBhIHBsYW4gdGhhdCBpcyBhbHJlYWR5IHJ1bm5pbmcKICAgICAgICBzZWxmLlBsYW5Mb2cuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAicGxhbl9pZCI6IHNlbGYucGxhbl8xLmlkLAogICAgICAgICAgICAgICAgInNlcnZlcl9pZCI6IHNlbGYuc2VydmVyX3Rlc3RfMS5pZCwKICAgICAgICAgICAgICAgICJzdGFydF9kYXRlIjogZmllbGRzLkRhdGV0aW1lLm5vdygpLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIExhdW5jaCB0aGUgc2FtZSBwbGFuIG9uIHRoZSBzYW1lIHNlcnZlcgogICAgICAgIHBsYW5fbG9nID0gc2VsZi5zZXJ2ZXJfdGVzdF8xLnJ1bl9mbGlnaHRfcGxhbihzZWxmLnBsYW5fMSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBsYW5fbG9nLnBsYW5fc3RhdHVzLCBBTk9USEVSX1BMQU5fUlVOTklORykKCiAgICAgICAgIyBOb3cgYWxsb3cgcGFyYWxsZWwgcnVubmluZwogICAgICAgIHNlbGYucGxhbl8xLndyaXRlKHsiYWxsb3dfcGFyYWxsZWxfcnVuIjogVHJ1ZX0pCgogICAgICAgICMgTGF1bmNoIHRoZSBzYW1lIHBsYW4gb24gdGhlIHNhbWUgc2VydmVyCiAgICAgICAgcGxhbl9sb2cgPSBzZWxmLnNlcnZlcl90ZXN0XzEucnVuX2ZsaWdodF9wbGFuKHNlbGYucGxhbl8xKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGxhbl9sb2cucGxhbl9zdGF0dXMsIDApCgogICAgZGVmIHRlc3RfcGxhbl9jdXN0b21fdmFyaWFibGVzKHNlbGYpOgogICAgICAgICIiIlRlc3QgcGxhbiB3aXRoIGN1c3RvbSB2YXJpYWJsZXMiIiIKICAgICAgICBjb21tYW5kX3B5dGhvbl8xX2lkID0gc2VsZi5jb21tYW5kX3B5dGhvbl9jdXN0b21fdmFyaWFibGVfdmFsdWVzXzEuaWQKICAgICAgICBjb21tYW5kX3B5dGhvbl8yX2lkID0gc2VsZi5jb21tYW5kX3B5dGhvbl9jdXN0b21fdmFyaWFibGVfdmFsdWVzXzIuaWQKCiAgICAgICAgcGxhbiA9IHNlbGYuX2NyZWF0ZV9wbGFuKAogICAgICAgICAgICAqKnsKICAgICAgICAgICAgICAgICJuYW1lIjogIlBsYW4gd2l0aCBjdXN0b20gdmFyaWFibGVzIiwKICAgICAgICAgICAgICAgICJsaW5lX2lkcyI6IFsKICAgICAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21tYW5kX2lkIjogY29tbWFuZF9weXRob25fMV9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXF1ZW5jZSI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAoMCwgMCwgeyJjb21tYW5kX2lkIjogc2VsZi5jb21tYW5kX2NyZWF0ZV9kaXIuaWQsICJzZXF1ZW5jZSI6IDJ9KSwKICAgICAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21tYW5kX2lkIjogY29tbWFuZF9weXRob25fMl9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXF1ZW5jZSI6IDMsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAoMCwgMCwgeyJjb21tYW5kX2lkIjogc2VsZi5jb21tYW5kX2NyZWF0ZV9kaXIuaWQsICJzZXF1ZW5jZSI6IDR9KSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgUnVuIHBsYW4KICAgICAgICBwbGFuX2xvZyA9IHNlbGYuc2VydmVyX3Rlc3RfMS5ydW5fZmxpZ2h0X3BsYW4ocGxhbikKCiAgICAgICAgIyBDaGVjayB0aGF0IGN1c3RvbSB2YXJpYWJsZSB2YWx1ZXMgd2VyZSB1cGRhdGVkIGNvcnJlY3RseQogICAgICAgICMgKFRoZSBsb2cgb2YgcGxhbiBzaG91bGQgY29udGFpbiB0aGUgbGFzdCB1cGRhdGVkdmFsdWVzKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGxhbl9sb2cudmFyaWFibGVfdmFsdWVzWyJ0ZXN0X3BhdGhfIl0sICIvYW5vdGhlcl90ZXN0X3BhdGgiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGxhbl9sb2cudmFyaWFibGVfdmFsdWVzWyJ0ZXN0X2RpciJdLCAidGVzdF9kaXIiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHBsYW5fbG9nLnZhcmlhYmxlX3ZhbHVlc1sicmFuZG9tX3Zhcl9yZWZlcmVuY2UiXSwgInJhbmRvbV92YXJfdmFsdWUiCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGxhbl9sb2cudmFyaWFibGVfdmFsdWVzWyJfbXlfdmFsdWUiXSwgIkp1c3QgVG8gVGVzdCIpCgogICAgICAgIGNvbW1hbmRfbG9ncyA9IHBsYW5fbG9nLmNvbW1hbmRfbG9nX2lkcwogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGxlbihjb21tYW5kX2xvZ3MpLAogICAgICAgICAgICBsZW4ocGxhbi5saW5lX2lkcyksCiAgICAgICAgICAgIGYiU2hvdWxkIGJlIHtsZW4ocGxhbi5saW5lX2lkcyl9IGNvbW1hbmQgbG9ncy4iLAogICAgICAgICkKCiAgICAgICAgIyBDaGVjayB0aGF0IGN1c3RvbSB2YXJpYWJsZSB2YWx1ZXMgd2VyZSBjcmVhdGVkIGNvcnJlY3RseQogICAgICAgICMgaW4gZmlyc3QgcHl0aG9uIGNvbW1hbmQgbG9nCiAgICAgICAgY29tbWFuZF9weXRob25fY29tbWFuZF8xX2xvZyA9IGNvbW1hbmRfbG9ncy5maWx0ZXJlZCgKICAgICAgICAgICAgbGFtYmRhIGxvZzogbG9nLmNvbW1hbmRfaWQuaWQgPT0gY29tbWFuZF9weXRob25fMV9pZAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBjb21tYW5kX3B5dGhvbl9jb21tYW5kXzFfbG9nLnZhcmlhYmxlX3ZhbHVlc1sidGVzdF9wYXRoXyJdLCAiL3Rlc3RfcGF0aCIKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgY29tbWFuZF9weXRob25fY29tbWFuZF8xX2xvZy52YXJpYWJsZV92YWx1ZXNbInRlc3RfZGlyIl0sICJ0ZXN0X2RpciIKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgY29tbWFuZF9weXRob25fY29tbWFuZF8xX2xvZy52YXJpYWJsZV92YWx1ZXNbIl9teV92YWx1ZSJdLCAiSnVzdCBUbyBUZXN0IgogICAgICAgICkKCiAgICAgICAgIyBDaGVjayB0aGF0IGN1c3RvbSB2YXJpYWJsZSB2YWx1ZXMgdXNlZCBpbiByZW5kZXJlZCBjb21tYW5kIGNvZGUKICAgICAgICBjb21tYW5kX2NyZWF0ZV9kaXJfbG9ncyA9IGNvbW1hbmRfbG9ncy5maWx0ZXJlZCgKICAgICAgICAgICAgbGFtYmRhIGxvZzogbG9nLmNvbW1hbmRfaWQgPT0gc2VsZi5jb21tYW5kX2NyZWF0ZV9kaXIKICAgICAgICApCiAgICAgICAgZmlyc3RfY29tbWFuZF9jcmVhdGVfZGlyX2xvZyA9IGNvbW1hbmRfY3JlYXRlX2Rpcl9sb2dzWzBdCiAgICAgICAgc2Vjb25kX2NvbW1hbmRfY3JlYXRlX2Rpcl9sb2cgPSBjb21tYW5kX2NyZWF0ZV9kaXJfbG9nc1sxXQoKICAgICAgICAjIHRoZSBmaXJzdF9jb21tYW5kX2NyZWF0ZV9kaXJfbG9nLmNvZGUgaXMgZXF1YWwgdG8KICAgICAgICAjICdjZCAvdGVzdF9wYXRoICYmIG1rZGlyIHRlc3RfZGlyJwogICAgICAgICMgYmVjYXVzZSByZW5kZXJlZCBjb2RlIGNvbnRhaW5zIGN1c3RvbSB2YXJpYWJsZSB2YWx1ZXMgdXBkYXRlZAogICAgICAgICMgZnJvbSBmaXJzdCBweXRob24gY29tbWFuZAogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGZpcnN0X2NvbW1hbmRfY3JlYXRlX2Rpcl9sb2cuY29kZSwgImNkIC90ZXN0X3BhdGggJiYgbWtkaXIgdGVzdF9kaXIiCiAgICAgICAgKQoKICAgICAgICAjIENoZWNrIHRoYXQgY3VzdG9tIHZhcmlhYmxlIHZhbHVlcyB3ZXJlIHVwZGF0ZWQgY29ycmVjdGx5IGluIGNvbW1hbmQgbG9ncwogICAgICAgIGNvbW1hbmRfcHl0aG9uX2NvbW1hbmRfMl9sb2cgPSBjb21tYW5kX2xvZ3MuZmlsdGVyZWQoCiAgICAgICAgICAgIGxhbWJkYSBsb2c6IGxvZy5jb21tYW5kX2lkLmlkID09IGNvbW1hbmRfcHl0aG9uXzJfaWQKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgY29tbWFuZF9weXRob25fY29tbWFuZF8yX2xvZy52YXJpYWJsZV92YWx1ZXNbInRlc3RfcGF0aF8iXSwKICAgICAgICAgICAgIi9hbm90aGVyX3Rlc3RfcGF0aCIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGNvbW1hbmRfcHl0aG9uX2NvbW1hbmRfMl9sb2cudmFyaWFibGVfdmFsdWVzWyJ0ZXN0X2RpciJdLCAidGVzdF9kaXIiCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGNvbW1hbmRfcHl0aG9uX2NvbW1hbmRfMl9sb2cudmFyaWFibGVfdmFsdWVzWyJyYW5kb21fdmFyX3JlZmVyZW5jZSJdLAogICAgICAgICAgICAicmFuZG9tX3Zhcl92YWx1ZSIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGNvbW1hbmRfcHl0aG9uX2NvbW1hbmRfMl9sb2cudmFyaWFibGVfdmFsdWVzWyJfbXlfdmFsdWUiXSwgIkp1c3QgVG8gVGVzdCIKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgY29tbWFuZF9weXRob25fY29tbWFuZF8yX2xvZy52YXJpYWJsZV92YWx1ZXNbc2VsZi52YXJpYWJsZV91cmwucmVmZXJlbmNlXSwKICAgICAgICAgICAgImh0dHBzOi8vd3d3LmNldG1peC5jb20iLAogICAgICAgICkKCiAgICAgICAgIyB0aGUgc2Vjb25kX2NvbW1hbmRfY3JlYXRlX2Rpcl9sb2cuY29kZSBpcyBlcXVhbCB0bwogICAgICAgICMgJ2NkIC9hbm90aGVyX3Rlc3RfcGF0aCAmJiBta2RpciB0ZXN0X2RpcicKICAgICAgICAjIGJlY2F1c2UgcmVuZGVyZWQgY29kZSBjb250YWlucyBjdXN0b20gdmFyaWFibGUgdmFsdWVzIHVwZGF0ZWQKICAgICAgICAjIGZyb20gc2Vjb25kIHB5dGhvbiBjb21tYW5kCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgc2Vjb25kX2NvbW1hbmRfY3JlYXRlX2Rpcl9sb2cuY29kZSwKICAgICAgICAgICAgImNkIC9hbm90aGVyX3Rlc3RfcGF0aCAmJiBta2RpciB0ZXN0X2RpciIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3BsYW5fY3VzdG9tX3ZhcmlhYmxlc193aXphcmQoc2VsZik6CiAgICAgICAgIiIiVGVzdCBwbGFuIHdpdGggY3VzdG9tIHZhcmlhYmxlcyBmcm9tIHdpemFyZCIiIgogICAgICAgIGNvbW1hbmRfcHl0aG9uXzFfaWQgPSBzZWxmLmNvbW1hbmRfcHl0aG9uX2N1c3RvbV92YXJpYWJsZV92YWx1ZXNfMS5pZAogICAgICAgIGNvbW1hbmRfcHl0aG9uXzJfaWQgPSBzZWxmLmNvbW1hbmRfcHl0aG9uX2N1c3RvbV92YXJpYWJsZV92YWx1ZXNfMi5pZAogICAgICAgIHBsYW4gPSBzZWxmLl9jcmVhdGVfcGxhbigKICAgICAgICAgICAgKip7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJQbGFuIHdpdGggY3VzdG9tIHZhcmlhYmxlcyIsCiAgICAgICAgICAgICAgICAibGluZV9pZHMiOiBbCiAgICAgICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tbWFuZF9pZCI6IGNvbW1hbmRfcHl0aG9uXzFfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VxdWVuY2UiOiAxLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgKDAsIDAsIHsiY29tbWFuZF9pZCI6IHNlbGYuY29tbWFuZF9jcmVhdGVfZGlyLmlkLCAic2VxdWVuY2UiOiAyfSksCiAgICAgICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tbWFuZF9pZCI6IGNvbW1hbmRfcHl0aG9uXzJfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VxdWVuY2UiOiAzLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgKDAsIDAsIHsiY29tbWFuZF9pZCI6IHNlbGYuY29tbWFuZF9jcmVhdGVfZGlyLmlkLCAic2VxdWVuY2UiOiA0fSksCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENyZWF0ZSB3aXphcmQgd2l0aCBjdXN0b20gdmFyaWFibGUgdmFsdWVzCiAgICAgICAgd2l6YXJkID0gc2VsZi5lbnZbImN4LnRvd2VyLnBsYW4ucnVuLndpemFyZCJdLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInBsYW5faWQiOiBwbGFuLmlkLAogICAgICAgICAgICAgICAgInNlcnZlcl9pZHMiOiBbKDYsIDAsIFtzZWxmLnNlcnZlcl90ZXN0XzEuaWRdKV0sCiAgICAgICAgICAgICAgICAiY3VzdG9tX3ZhcmlhYmxlX3ZhbHVlX2lkcyI6IFsKICAgICAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YXJpYWJsZV9pZCI6IHNlbGYudmFyaWFibGVfdmVyc2lvbi5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZV9jaGFyIjogIjE2LjAiLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIFJ1biB3aXphcmQKICAgICAgICBhY3Rpb24gPSB3aXphcmQucnVuX2ZsaWdodF9wbGFuKCkKICAgICAgICBwbGFuX2xvZyA9IHNlbGYuUGxhbkxvZy5zZWFyY2goCiAgICAgICAgICAgIFsoImxhYmVsIiwgIj0iLCBhY3Rpb25bImNvbnRleHQiXVsic2VhcmNoX2RlZmF1bHRfbGFiZWwiXSldLAogICAgICAgICAgICBsaW1pdD0xLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydFRydWUocGxhbl9sb2csICJQbGFuIGxvZyBzaG91bGQgYmUgY3JlYXRlZCIpCgogICAgICAgICMgQ2hlY2sgdGhhdCBjdXN0b20gdmFyaWFibGUgdmFsdWVzIHdlcmUgdXBkYXRlZCBjb3JyZWN0bHkKICAgICAgICAjIChUaGUgbG9nIG9mIHBsYW4gc2hvdWxkIGNvbnRhaW4gdGhlIGxhc3QgdXBkYXRlZAogICAgICAgICMgdmFsdWVzICsgY3VzdG9tIHZhcmlhYmxlIHZhbHVlIGZyb20gd2l6YXJkKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGxhbl9sb2cudmFyaWFibGVfdmFsdWVzWyJ0ZXN0X3BhdGhfIl0sICIvYW5vdGhlcl90ZXN0X3BhdGgiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGxhbl9sb2cudmFyaWFibGVfdmFsdWVzWyJ0ZXN0X2RpciJdLCAidGVzdF9kaXIiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHBsYW5fbG9nLnZhcmlhYmxlX3ZhbHVlc1sicmFuZG9tX3Zhcl9yZWZlcmVuY2UiXSwgInJhbmRvbV92YXJfdmFsdWUiCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGxhbl9sb2cudmFyaWFibGVfdmFsdWVzWyJfbXlfdmFsdWUiXSwgIkp1c3QgVG8gVGVzdCIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgcGxhbl9sb2cudmFyaWFibGVfdmFsdWVzW3NlbGYudmFyaWFibGVfdmVyc2lvbi5yZWZlcmVuY2VdLCAiMTYuMCIKICAgICAgICApCgogICAgZGVmIHRlc3RfcGxhbl93aXRoX2Fub3RoZXJfcGxhbl9jdXN0b21fdmFyaWFibGVzKHNlbGYpOgogICAgICAgICIiIlRlc3QgcGxhbiB3aXRoIGFub3RoZXIgcGxhbiB3aXRoIGN1c3RvbSB2YXJpYWJsZXMiIiIKICAgICAgICAjIENyZWF0ZSBwbGFuIHdpdGggbmV4dCBzdHJ1Y3R1cmU6CiAgICAgICAgIyBQbGFuIDE6CiAgICAgICAgIyAtIENvbW1hbmQgMTogUnVuIHBsYW4gMgogICAgICAgICMgLSBDb21tYW5kIDI6IFJ1biBQeXRob24gY29tbWFuZCB0byBzZXQgY3VzdG9tIHZhcmlhYmxlIHZhbHVlcwogICAgICAgICMgLSBDb21tYW5kIDM6IENyZWF0ZSBkaXJlY3RvcnkKICAgICAgICAjIFBsYW4gMjoKICAgICAgICAjIC0gQ29tbWFuZCAxOiBQeXRob24gY29tbWFuZCB0byBzZXQgY3VzdG9tIHZhcmlhYmxlIHZhbHVlcwogICAgICAgICMgLSBDb21tYW5kIDI6IENyZWF0ZSBkaXJlY3RvcnkKICAgICAgICAjIC0gQ29tbWFuZCAzOiBQeXRob24gY29tbWFuZCB0byB1cGRhdGUgY3VzdG9tIHZhcmlhYmxlIHZhbHVlcwoKICAgICAgICBjb21tYW5kX3B5dGhvbl8xX2lkID0gc2VsZi5jb21tYW5kX3B5dGhvbl9jdXN0b21fdmFyaWFibGVfdmFsdWVzXzEuaWQKICAgICAgICBjb21tYW5kX3B5dGhvbl8yX2lkID0gc2VsZi5jb21tYW5kX3B5dGhvbl9jdXN0b21fdmFyaWFibGVfdmFsdWVzXzIuaWQKICAgICAgICBwbGFuMiA9IHNlbGYuX2NyZWF0ZV9wbGFuKAogICAgICAgICAgICAqKnsKICAgICAgICAgICAgICAgICJuYW1lIjogIlBsYW4gMiIsCiAgICAgICAgICAgICAgICAibGluZV9pZHMiOiBbCiAgICAgICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tbWFuZF9pZCI6IGNvbW1hbmRfcHl0aG9uXzFfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VxdWVuY2UiOiAxLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgKDAsIDAsIHsiY29tbWFuZF9pZCI6IHNlbGYuY29tbWFuZF9jcmVhdGVfZGlyLmlkLCAic2VxdWVuY2UiOiAyfSksCiAgICAgICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tbWFuZF9pZCI6IGNvbW1hbmRfcHl0aG9uXzJfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VxdWVuY2UiOiAzLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICBjb21tYW5kX3J1bl9wbGFuXzIgPSBzZWxmLkNvbW1hbmQuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJSdW4gRmxpZ2h0IFBsYW4iLAogICAgICAgICAgICAgICAgImFjdGlvbiI6ICJwbGFuIiwKICAgICAgICAgICAgICAgICJmbGlnaHRfcGxhbl9pZCI6IHBsYW4yLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIGNvbW1hbmRfcHl0aG9uX2N1c3RvbV92YXJpYWJsZV92YWx1ZXNfMyA9IHNlbGYuQ29tbWFuZC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlB5dGhvbiBjb21tYW5kIHRvIHVwZGF0ZSBjdXN0b20gdmFyaWFibGUgdmFsdWVzIiwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAicHl0aG9uX2NvZGUiLAogICAgICAgICAgICAgICAgImNvZGUiOiAiIiIKY3VzdG9tX3ZhbHVlc1sncmFuZG9tX3Zhcl9yZWZlcmVuY2UnXSA9ICdhbm90aGVyX3JhbmRvbV92YXJfdmFsdWUnCiIiIiwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgcGxhbjEgPSBzZWxmLl9jcmVhdGVfcGxhbigKICAgICAgICAgICAgKip7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJQbGFuIDEiLAogICAgICAgICAgICAgICAgImxpbmVfaWRzIjogWwogICAgICAgICAgICAgICAgICAgICgwLCAwLCB7ImNvbW1hbmRfaWQiOiBjb21tYW5kX3J1bl9wbGFuXzIuaWQsICJzZXF1ZW5jZSI6IDF9KSwKICAgICAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21tYW5kX2lkIjogY29tbWFuZF9weXRob25fY3VzdG9tX3ZhcmlhYmxlX3ZhbHVlc18zLmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlcXVlbmNlIjogMiwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICgwLCAwLCB7ImNvbW1hbmRfaWQiOiBzZWxmLmNvbW1hbmRfY3JlYXRlX2Rpci5pZCwgInNlcXVlbmNlIjogM30pLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBDcmVhdGUgd2l6YXJkIHdpdGggY3VzdG9tIHZhcmlhYmxlIHZhbHVlcwogICAgICAgIHdpemFyZCA9IHNlbGYuZW52WyJjeC50b3dlci5wbGFuLnJ1bi53aXphcmQiXS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJwbGFuX2lkIjogcGxhbjEuaWQsCiAgICAgICAgICAgICAgICAic2VydmVyX2lkcyI6IFsoNiwgMCwgW3NlbGYuc2VydmVyX3Rlc3RfMS5pZF0pXSwKICAgICAgICAgICAgICAgICJjdXN0b21fdmFyaWFibGVfdmFsdWVfaWRzIjogWwogICAgICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhcmlhYmxlX2lkIjogc2VsZi52YXJpYWJsZV92ZXJzaW9uLmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlX2NoYXIiOiAiMTYuMCIsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YXJpYWJsZV9pZCI6IHNlbGYudmFyaWFibGVfdXJsLmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlX2NoYXIiOiAiaHR0cHM6Ly93d3cudGVzdC5jb20iLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIFJ1biB3aXphcmQKICAgICAgICBhY3Rpb24gPSB3aXphcmQucnVuX2ZsaWdodF9wbGFuKCkKICAgICAgICBwbGFuX2xvZyA9IHNlbGYuUGxhbkxvZy5zZWFyY2goCiAgICAgICAgICAgIFsoImxhYmVsIiwgIj0iLCBhY3Rpb25bImNvbnRleHQiXVsic2VhcmNoX2RlZmF1bHRfbGFiZWwiXSldLAogICAgICAgICAgICBsaW1pdD0xLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydFRydWUocGxhbl9sb2csICJQbGFuIGxvZyBzaG91bGQgYmUgY3JlYXRlZCIpCgogICAgICAgIGNvbW1hbmRfbG9ncyA9IHBsYW5fbG9nLmNvbW1hbmRfbG9nX2lkcwogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGxlbihjb21tYW5kX2xvZ3MpLAogICAgICAgICAgICBsZW4ocGxhbjEubGluZV9pZHMpLAogICAgICAgICAgICBmIlNob3VsZCBiZSB7bGVuKHBsYW4xLmxpbmVfaWRzKX0gY29tbWFuZCBsb2dzLiIsCiAgICAgICAgKQoKICAgICAgICAjIEZpcnN0IGNvbW1hbmQgbG9nIGlzIHJ1biBwbGFuIDIgbG9nIHRoYXQgY29udGFpbnMgY3VzdG9tIHZhcmlhYmxlIHZhbHVlcwogICAgICAgICMgdXBkYXRlZCBmcm9tIHBsYW4gMi4gVGhpcyBjb21tYW5kIGxvZyBzaG91bGQgY29udGFpbiB0aGUgc2FtZSBjdXN0b20KICAgICAgICAjIHZhcmlhYmxlIHZhbHVlcyBhcyBmcm9tIHBsYW4gMiBsb2cKICAgICAgICBydW5fcGxhbjJfY29tbWFuZF9sb2cgPSBjb21tYW5kX2xvZ3NbMF0KICAgICAgICBydW5fcGxhbjJfY29tbWFuZF9sb2dfdmFyaWFibGVfdmFsdWVzID0gcnVuX3BsYW4yX2NvbW1hbmRfbG9nLnZhcmlhYmxlX3ZhbHVlcwoKICAgICAgICBwbGFuMl9sb2cgPSBydW5fcGxhbjJfY29tbWFuZF9sb2cudHJpZ2dlcmVkX3BsYW5fbG9nX2lkCiAgICAgICAgcGxhbjJfbG9nX3ZhcmlhYmxlX3ZhbHVlcyA9IHBsYW4yX2xvZy52YXJpYWJsZV92YWx1ZXMKCiAgICAgICAgIyBjaGVjayB0aGF0IHZhcmlhYmxlIHZhbHVlcyBhcmUgdGhlIHNhbWUKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBydW5fcGxhbjJfY29tbWFuZF9sb2dfdmFyaWFibGVfdmFsdWVzLCBwbGFuMl9sb2dfdmFyaWFibGVfdmFsdWVzCiAgICAgICAgKQoKICAgICAgICAjIEJlZm9yZSBmaW5pc2hlZCBjb21tYW5kIChydW4gY2hpbGQgcGxhbik6IHdlIGhhdmUgbmV4dCB2YXJpYWJsZSB2YWx1ZXM6CiAgICAgICAgIyB7J3Rlc3RfdmVyc2lvbic6ICcxNi4wJywgJ3Rlc3RfdXJsJzogJ2h0dHBzOi8vd3d3LnRlc3QuY29tJ30KCiAgICAgICAgIyBBZnRlciBmaW5pc2hlZCBjb21tYW5kIChydW4gY2hpbGQgcGxhbik6IHdlIGhhdmUgbmV4dCB2YXJpYWJsZSB2YWx1ZXM6CiAgICAgICAgIyB7CiAgICAgICAgIyAgICAgJ3Rlc3RfdmVyc2lvbic6ICcxNi4wJywKICAgICAgICAjICAgICAndGVzdF91cmwnOiAnaHR0cHM6Ly93d3cuY2V0bWl4LmNvbScsCiAgICAgICAgIyAgICAgJ3Rlc3RfcGF0aF8nOiAnL2Fub3RoZXJfdGVzdF9wYXRoJywKICAgICAgICAjICAgICAndGVzdF9kaXInOiAndGVzdF9kaXInLAogICAgICAgICMgICAgICdfbXlfdmFsdWUnOiAnSnVzdCBUbyBUZXN0JywKICAgICAgICAjICAgICAncmFuZG9tX3Zhcl9yZWZlcmVuY2UnOiAncmFuZG9tX3Zhcl92YWx1ZScKICAgICAgICAjIH0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBydW5fcGxhbjJfY29tbWFuZF9sb2dfdmFyaWFibGVfdmFsdWVzWyJ0ZXN0X3BhdGhfIl0sICIvYW5vdGhlcl90ZXN0X3BhdGgiCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocnVuX3BsYW4yX2NvbW1hbmRfbG9nX3ZhcmlhYmxlX3ZhbHVlc1sidGVzdF9kaXIiXSwgInRlc3RfZGlyIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBydW5fcGxhbjJfY29tbWFuZF9sb2dfdmFyaWFibGVfdmFsdWVzWyJfbXlfdmFsdWUiXSwgIkp1c3QgVG8gVGVzdCIKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgcnVuX3BsYW4yX2NvbW1hbmRfbG9nX3ZhcmlhYmxlX3ZhbHVlc1sicmFuZG9tX3Zhcl9yZWZlcmVuY2UiXSwKICAgICAgICAgICAgInJhbmRvbV92YXJfdmFsdWUiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBydW5fcGxhbjJfY29tbWFuZF9sb2dfdmFyaWFibGVfdmFsdWVzW3NlbGYudmFyaWFibGVfdmVyc2lvbi5yZWZlcmVuY2VdLAogICAgICAgICAgICAiMTYuMCIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHJ1bl9wbGFuMl9jb21tYW5kX2xvZ192YXJpYWJsZV92YWx1ZXNbc2VsZi52YXJpYWJsZV91cmwucmVmZXJlbmNlXSwKICAgICAgICAgICAgImh0dHBzOi8vd3d3LmNldG1peC5jb20iLAogICAgICAgICkKCiAgICAgICAgIyBBZnRlciBmaW5pc2hlZCBtYWluIHBsYW46IHdlIGhhdmUgbmV4dCB2YXJpYWJsZSB2YWx1ZXM6CiAgICAgICAgIyB7CiAgICAgICAgIyAgICAgJ3Rlc3RfdmVyc2lvbic6ICcxNi4wJywKICAgICAgICAjICAgICAndGVzdF91cmwnOiAnaHR0cHM6Ly93d3cuY2V0bWl4LmNvbScsCiAgICAgICAgIyAgICAgJ3Rlc3RfcGF0aF8nOiAnL2Fub3RoZXJfdGVzdF9wYXRoJywKICAgICAgICAjICAgICAndGVzdF9kaXInOiAndGVzdF9kaXInLAogICAgICAgICMgICAgICdfbXlfdmFsdWUnOiAnSnVzdCBUbyBUZXN0JywKICAgICAgICAjICAgICAncmFuZG9tX3Zhcl9yZWZlcmVuY2UnOiAnYW5vdGhlcl9yYW5kb21fdmFyX3ZhbHVlJwogICAgICAgICMgfQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGxhbl9sb2cudmFyaWFibGVfdmFsdWVzWyJ0ZXN0X3BhdGhfIl0sICIvYW5vdGhlcl90ZXN0X3BhdGgiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGxhbl9sb2cudmFyaWFibGVfdmFsdWVzWyJ0ZXN0X2RpciJdLCAidGVzdF9kaXIiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGxhbl9sb2cudmFyaWFibGVfdmFsdWVzWyJfbXlfdmFsdWUiXSwgIkp1c3QgVG8gVGVzdCIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgcGxhbl9sb2cudmFyaWFibGVfdmFsdWVzWyJyYW5kb21fdmFyX3JlZmVyZW5jZSJdLCAiYW5vdGhlcl9yYW5kb21fdmFyX3ZhbHVlIgogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBwbGFuX2xvZy52YXJpYWJsZV92YWx1ZXNbc2VsZi52YXJpYWJsZV92ZXJzaW9uLnJlZmVyZW5jZV0sICIxNi4wIgogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBwbGFuX2xvZy52YXJpYWJsZV92YWx1ZXNbc2VsZi52YXJpYWJsZV91cmwucmVmZXJlbmNlXSwKICAgICAgICAgICAgImh0dHBzOi8vd3d3LmNldG1peC5jb20iLAogICAgICAgICkKCiAgICBAbXV0ZV9sb2dnZXIoIm9kb28uYWRkb25zLmNldG1peF90b3dlcl9zZXJ2ZXIubW9kZWxzLmNldG1peF90b3dlciIpCiAgICBkZWYgdGVzdF9wbGFuX3JlbmRlcl9qZXRfdGVtcGxhdGUoc2VsZik6CiAgICAgICAgIiIiVGVzdCBwbGFuIHJlbmRlcmluZyBqZXQgdGVtcGxhdGUiIiIKICAgICAgICBwbGFuX2xvZ19yZWNvcmRfY291bnQgPSBzZWxmLlBsYW5Mb2cuc2VhcmNoX2NvdW50KAogICAgICAgICAgICBbKCJzZXJ2ZXJfaWQiLCAiPSIsIHNlbGYuc2VydmVyX3Rlc3RfMS5pZCldCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGxhbl9sb2dfcmVjb3JkX2NvdW50LCAwLCAiUGxhbiBsb2dzIHNob3VsZCBiZSBlbXB0eSIpCgogICAgICAgICMgU2V0IHZhcmlhYmxlIHZhbHVlcyBmb3IgdGhlIHNlcnZlcgogICAgICAgIHJlcyA9IHNlbGYuQ2V0bWl4VG93ZXIuc2VydmVyX3NldF92YXJpYWJsZV92YWx1ZSgKICAgICAgICAgICAgc2VsZi5zZXJ2ZXJfdGVzdF8xLnJlZmVyZW5jZSwgInRlc3RfcGF0aF8iLCAiL29wdC90b3dlciIKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbImV4aXRfY29kZSJdLCAwLCAiVmFyaWFibGUgJ3Rlc3RfcGF0aF8nIG5vdCBmb3VuZC91cGRhdGVkIikKICAgICAgICByZXMgPSBzZWxmLkNldG1peFRvd2VyLnNlcnZlcl9zZXRfdmFyaWFibGVfdmFsdWUoCiAgICAgICAgICAgIHNlbGYuc2VydmVyX3Rlc3RfMS5yZWZlcmVuY2UsICJ0ZXN0X2RpciIsICJzZXJ2ZXIxIgogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc1siZXhpdF9jb2RlIl0sIDAsICJWYXJpYWJsZSAndGVzdF9kaXInIG5vdCBmb3VuZC91cGRhdGVkIikKCiAgICAgICAgIyAtLSAxLS0KICAgICAgICAjIFJ1biBwbGFuIHdpdGhvdXQgamV0IHRlbXBsYXRlCiAgICAgICAgc2VsZi5zZXJ2ZXJfdGVzdF8xLnJ1bl9mbGlnaHRfcGxhbihzZWxmLnBsYW5fMikKCiAgICAgICAgcGxhbl9sb2cgPSBzZWxmLlBsYW5Mb2cuc2VhcmNoKAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAoInBsYW5faWQiLCAiPSIsIHNlbGYucGxhbl8yLmlkKSwKICAgICAgICAgICAgICAgICgic2VydmVyX2lkIiwgIj0iLCBzZWxmLnNlcnZlcl90ZXN0XzEuaWQpLAogICAgICAgICAgICBdLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihwbGFuX2xvZyksIDEsICJBIHNpbmdsZSBwbGFuIGxvZyBzaG91bGQgYmUgY3JlYXRlZCIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbGVuKHBsYW5fbG9nLmNvbW1hbmRfbG9nX2lkcyksIDIsICJUd28gY29tbWFuZHMgc2hvdWxkIGJlIGV4ZWN1dGVkIgogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHBsYW5fbG9nLmpldF90ZW1wbGF0ZV9pZCwgIkpldCB0ZW1wbGF0ZSBzaG91bGQgYmUgZW1wdHkiKQoKICAgICAgICAjIENoZWNrIHRoZSBTU0ggY29tbWFuZCBvdXRwdXQuIFNlY29uZCBjb21tYW5kCiAgICAgICAgcmVuZGVyZWRfY29kZV9leHBlY3RlZCA9ICJjZCAvb3B0L3Rvd2VyICYmIG1rZGlyIHNlcnZlcjEiCiAgICAgICAgc3NoX2NvbW1hbmRfbG9nID0gcGxhbl9sb2cuY29tbWFuZF9sb2dfaWRzWzFdCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgc3NoX2NvbW1hbmRfbG9nLmNvZGUsIHJlbmRlcmVkX2NvZGVfZXhwZWN0ZWQsICJTU0ggY29tbWFuZCBzaG91bGQgc3VjY2VlZCIKICAgICAgICApCgogICAgICAgICMgQ2hlY2sgdGhlIG5lc3RlZCBwbGFuIGNvbW1hbmQgb3V0cHV0LgogICAgICAgICMgVGhpcyBpcyBuZWVkZWQgdG8gZW5zdXJlIHRoYXQgdGhlIG5lc3RlZCBwbGFuIGNvbW1hbmRzCiAgICAgICAgIyBhcmUgcmVuZGVyZWQgcHJvcGVybHkuCiAgICAgICAgbmVzdGVkX3NzaF9jb21tYW5kX2xvZyA9IHBsYW5fbG9nLmNvbW1hbmRfbG9nX2lkc1sKICAgICAgICAgICAgMAogICAgICAgIF0udHJpZ2dlcmVkX3BsYW5fbG9nX2lkLmNvbW1hbmRfbG9nX2lkc1swXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIG5lc3RlZF9zc2hfY29tbWFuZF9sb2cuY29kZSwKICAgICAgICAgICAgcmVuZGVyZWRfY29kZV9leHBlY3RlZCwKICAgICAgICAgICAgIlNTSCBjb21tYW5kIHNob3VsZCBzdWNjZWVkIiwKICAgICAgICApCgogICAgICAgICMgLS0gMiAtLQogICAgICAgICMgUnVuIHBsYW4gd2l0aCBqZXQgdGVtcGxhdGUKCiAgICAgICAgIyBEZWxldGUgcHJldmlvdXMgcGxhbiBsb2cKICAgICAgICBwbGFuX2xvZy51bmxpbmsoKQoKICAgICAgICBzZWxmLnNlcnZlcl90ZXN0XzEucnVuX2ZsaWdodF9wbGFuKAogICAgICAgICAgICBzZWxmLnBsYW5fMiwgamV0X3RlbXBsYXRlPXNlbGYuamV0X3RlbXBsYXRlX3NhbXBsZQogICAgICAgICkKCiAgICAgICAgcGxhbl9sb2cgPSBzZWxmLlBsYW5Mb2cuc2VhcmNoKAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAoInBsYW5faWQiLCAiPSIsIHNlbGYucGxhbl8yLmlkKSwKICAgICAgICAgICAgICAgICgic2VydmVyX2lkIiwgIj0iLCBzZWxmLnNlcnZlcl90ZXN0XzEuaWQpLAogICAgICAgICAgICBdLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihwbGFuX2xvZyksIDEsICJBIHNpbmdsZSBwbGFuIGxvZyBzaG91bGQgYmUgY3JlYXRlZCIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbGVuKHBsYW5fbG9nLmNvbW1hbmRfbG9nX2lkcyksIDIsICJUd28gY29tbWFuZHMgc2hvdWxkIGJlIGV4ZWN1dGVkIgogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBwbGFuX2xvZy5qZXRfdGVtcGxhdGVfaWQsCiAgICAgICAgICAgIHNlbGYuamV0X3RlbXBsYXRlX3NhbXBsZSwKICAgICAgICAgICAgIkpldCB0ZW1wbGF0ZSBkb2Vzbid0IG1hdGNoIiwKICAgICAgICApCgogICAgICAgICMgQ2hlY2sgdGhlIFNTSCBjb21tYW5kIG91dHB1dC4gU2Vjb25kIGNvbW1hbmQKICAgICAgICByZW5kZXJlZF9jb2RlX2V4cGVjdGVkID0gImNkIC9qZXRzL3RlbXBsYXRlcy90ZW1wbGF0ZTEgJiYgbWtkaXIgamV0X3RlbXBsYXRlcyIKICAgICAgICBzc2hfY29tbWFuZF9sb2cgPSBwbGFuX2xvZy5jb21tYW5kX2xvZ19pZHNbMV0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBzc2hfY29tbWFuZF9sb2cuY29kZSwgcmVuZGVyZWRfY29kZV9leHBlY3RlZCwgIlNTSCBjb21tYW5kIHNob3VsZCBzdWNjZWVkIgogICAgICAgICkKCiAgICAgICAgIyBDaGVjayB0aGUgbmVzdGVkIHBsYW4gY29tbWFuZCBvdXRwdXQuCiAgICAgICAgIyBUaGlzIGlzIG5lZWRlZCB0byBlbnN1cmUgdGhhdCB0aGUgbmVzdGVkIHBsYW4gY29tbWFuZHMKICAgICAgICAjIGFyZSByZW5kZXJlZCBwcm9wZXJseS4KICAgICAgICBuZXN0ZWRfc3NoX2NvbW1hbmRfbG9nID0gcGxhbl9sb2cuY29tbWFuZF9sb2dfaWRzWwogICAgICAgICAgICAwCiAgICAgICAgXS50cmlnZ2VyZWRfcGxhbl9sb2dfaWQuY29tbWFuZF9sb2dfaWRzWzBdCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbmVzdGVkX3NzaF9jb21tYW5kX2xvZy5jb2RlLAogICAgICAgICAgICByZW5kZXJlZF9jb2RlX2V4cGVjdGVkLAogICAgICAgICAgICAiU1NIIGNvbW1hbmQgc2hvdWxkIHN1Y2NlZWQiLAogICAgICAgICkKCiAgICAgICAgIyAtLSAzIC0tCiAgICAgICAgIyBSdW4gcGxhbiB3aXRoIGpldAogICAgICAgICMgRGVsZXRlIHByZXZpb3VzIHBsYW4gbG9nCiAgICAgICAgcGxhbl9sb2cudW5saW5rKCkKCiAgICAgICAgc2VsZi5zZXJ2ZXJfdGVzdF8xLnJ1bl9mbGlnaHRfcGxhbihzZWxmLnBsYW5fMiwgamV0PXNlbGYuamV0X3NhbXBsZSkKCiAgICAgICAgcGxhbl9sb2cgPSBzZWxmLlBsYW5Mb2cuc2VhcmNoKAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAoInBsYW5faWQiLCAiPSIsIHNlbGYucGxhbl8yLmlkKSwKICAgICAgICAgICAgICAgICgic2VydmVyX2lkIiwgIj0iLCBzZWxmLnNlcnZlcl90ZXN0XzEuaWQpLAogICAgICAgICAgICBdLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihwbGFuX2xvZyksIDEsICJBIHNpbmdsZSBwbGFuIGxvZyBzaG91bGQgYmUgY3JlYXRlZCIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbGVuKHBsYW5fbG9nLmNvbW1hbmRfbG9nX2lkcyksIDIsICJUd28gY29tbWFuZHMgc2hvdWxkIGJlIGV4ZWN1dGVkIgogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBwbGFuX2xvZy5qZXRfdGVtcGxhdGVfaWQsCiAgICAgICAgICAgIHNlbGYuamV0X3RlbXBsYXRlX3NhbXBsZSwKICAgICAgICAgICAgIkpldCB0ZW1wbGF0ZSBkb2Vzbid0IG1hdGNoIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwbGFuX2xvZy5qZXRfaWQsIHNlbGYuamV0X3NhbXBsZSwgIkpldCBkb2Vzbid0IG1hdGNoIikKCiAgICAgICAgIyBDaGVjayB0aGUgU1NIIGNvbW1hbmQgb3V0cHV0LiBTZWNvbmQgY29tbWFuZAogICAgICAgIHJlbmRlcmVkX2NvZGVfZXhwZWN0ZWQgPSAiY2QgL2pldHMvamV0MSAmJiBta2RpciBqZXRfdGVtcGxhdGVzIgogICAgICAgIHNzaF9jb21tYW5kX2xvZyA9IHBsYW5fbG9nLmNvbW1hbmRfbG9nX2lkc1sxXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHNzaF9jb21tYW5kX2xvZy5jb2RlLCByZW5kZXJlZF9jb2RlX2V4cGVjdGVkLCAiU1NIIGNvbW1hbmQgc2hvdWxkIHN1Y2NlZWQiCiAgICAgICAgKQoKICAgICAgICAjIENoZWNrIHRoZSBuZXN0ZWQgcGxhbiBjb21tYW5kIG91dHB1dC4KICAgICAgICAjIFRoaXMgaXMgbmVlZGVkIHRvIGVuc3VyZSB0aGF0IHRoZSBuZXN0ZWQgcGxhbiBjb21tYW5kcwogICAgICAgICMgYXJlIHJlbmRlcmVkIHByb3Blcmx5LgogICAgICAgIG5lc3RlZF9zc2hfY29tbWFuZF9sb2cgPSBwbGFuX2xvZy5jb21tYW5kX2xvZ19pZHNbCiAgICAgICAgICAgIDAKICAgICAgICBdLnRyaWdnZXJlZF9wbGFuX2xvZ19pZC5jb21tYW5kX2xvZ19pZHNbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBuZXN0ZWRfc3NoX2NvbW1hbmRfbG9nLmNvZGUsCiAgICAgICAgICAgIHJlbmRlcmVkX2NvZGVfZXhwZWN0ZWQsCiAgICAgICAgICAgICJTU0ggY29tbWFuZCBzaG91bGQgc3VjY2VlZCIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3BsYW5fd2l0aF9jdXN0b21fdmFsdWVzX2luX2NvbmRpdGlvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBFbnN1cmUgdGhhdCBwbGFuIGxpbmUgY29uZGl0aW9ucyBzZWUgdXBkYXRlZCBjdXN0b21fdmFsdWVzCiAgICAgICAgcHJvZHVjZWQgYnkgcHJldmlvdXMgY29tbWFuZHMuCgogICAgICAgIDEpIHB5dGhvbiBzZXRzIHRlc3RfcGF0aF8gPSAnL3Rlc3RfcGF0aCcKICAgICAgICAyKSBjcmVhdGVfZGlyIHdpdGggY29uZGl0aW9uICJ7eyB0ZXN0X3BhdGhfIH19ID09ICcvdGVzdF9wYXRoJyIgLT4gZXhlY3V0ZXMKICAgICAgICAzKSBweXRob24gdXBkYXRlcyB0ZXN0X3BhdGhfID0gJy9hbm90aGVyX3Rlc3RfcGF0aCcKICAgICAgICA0KSBjcmVhdGVfZGlyIHdpdGggY29uZGl0aW9uICJ7eyB0ZXN0X3BhdGhfIH19ID09ICcvYW5vdGhlcl90ZXN0X3BhdGgnIgogICAgICAgICAgIC0+IGV4ZWN1dGVzCiAgICAgICAgVGhlbiBpbnZlcnQgY29uZGl0aW9ucyBhbmQgY2hlY2sgYm90aCBsaW5lcyBhcmUgc2tpcHBlZCBhcHByb3ByaWF0ZWx5LgogICAgICAgICIiIgogICAgICAgIGNvbW1hbmRfcHl0aG9uXzFfaWQgPSBzZWxmLmNvbW1hbmRfcHl0aG9uX2N1c3RvbV92YXJpYWJsZV92YWx1ZXNfMS5pZAogICAgICAgIGNvbW1hbmRfcHl0aG9uXzJfaWQgPSBzZWxmLmNvbW1hbmRfcHl0aG9uX2N1c3RvbV92YXJpYWJsZV92YWx1ZXNfMi5pZAoKICAgICAgICBwbGFuID0gc2VsZi5fY3JlYXRlX3BsYW4oCiAgICAgICAgICAgICoqewogICAgICAgICAgICAgICAgIm5hbWUiOiAiUGxhbiB3aXRoIGN1c3RvbV92YWx1ZXMgaW4gY29uZGl0aW9uIiwKICAgICAgICAgICAgICAgICJsaW5lX2lkcyI6IFsKICAgICAgICAgICAgICAgICAgICAoMCwgMCwgeyJjb21tYW5kX2lkIjogY29tbWFuZF9weXRob25fMV9pZCwgInNlcXVlbmNlIjogMX0pLAogICAgICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbW1hbmRfaWQiOiBzZWxmLmNvbW1hbmRfY3JlYXRlX2Rpci5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXF1ZW5jZSI6IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uZGl0aW9uIjogInt7IHRlc3RfcGF0aF8gfX0gPT0gJy90ZXN0X3BhdGgnIiwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICgwLCAwLCB7ImNvbW1hbmRfaWQiOiBjb21tYW5kX3B5dGhvbl8yX2lkLCAic2VxdWVuY2UiOiAzfSksCiAgICAgICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tbWFuZF9pZCI6IHNlbGYuY29tbWFuZF9jcmVhdGVfZGlyLmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlcXVlbmNlIjogNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25kaXRpb24iOiAie3sgdGVzdF9wYXRoXyB9fSA9PSAnL2Fub3RoZXJfdGVzdF9wYXRoJyIsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgIHBsYW5fbG9nID0gc2VsZi5zZXJ2ZXJfdGVzdF8xLnJ1bl9mbGlnaHRfcGxhbihwbGFuKQoKICAgICAgICBsb2dzID0gcGxhbl9sb2cuY29tbWFuZF9sb2dfaWRzCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obG9ncyksIDQsICJTaG91bGQgYmUgNCBjb21tYW5kIGxvZ3MiKQoKICAgICAgICBjcmVhdGVfZGlyX2xvZ3MgPSBsb2dzLmZpbHRlcmVkKAogICAgICAgICAgICBsYW1iZGEgbGluZTogbGluZS5jb21tYW5kX2lkID09IHNlbGYuY29tbWFuZF9jcmVhdGVfZGlyCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGNyZWF0ZV9kaXJfbG9ncyksIDIsICJTaG91bGQgYmUgMiBjcmVhdGVfZGlyIGxvZ3MiKQoKICAgICAgICBzZWxmLmFzc2VydEZhbHNlKAogICAgICAgICAgICBjcmVhdGVfZGlyX2xvZ3NbMF0uaXNfc2tpcHBlZCwgIkZpcnN0IGNyZWF0ZV9kaXIgbXVzdCBiZSBleGVjdXRlZCIKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgKICAgICAgICAgICAgY3JlYXRlX2Rpcl9sb2dzWzFdLmlzX3NraXBwZWQsICJTZWNvbmQgY3JlYXRlX2RpciBtdXN0IGJlIGV4ZWN1dGVkIgogICAgICAgICkKCiAgICAgICAgc2VsZi5hc3NlcnRJbigiL3Rlc3RfcGF0aCIsIGNyZWF0ZV9kaXJfbG9nc1swXS5jb2RlKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oIi9hbm90aGVyX3Rlc3RfcGF0aCIsIGNyZWF0ZV9kaXJfbG9nc1sxXS5jb2RlKQoKICAgIGRlZiB0ZXN0X3BsYW5fc3RvcF9taWRfZXhlY3V0aW9uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgdGhhdCBwbGFuIGlzIGNvcnJlY3RseSBtYXJrZWQgYXMgc3RvcHBlZCBhbmQKICAgICAgICBmdXJ0aGVyIGNvbW1hbmRzIGFyZSBub3QgZXhlY3V0ZWQuCiAgICAgICAgIiIiCiAgICAgICAgcGxhbiA9IHNlbGYuX2NyZWF0ZV9wbGFuKAogICAgICAgICAgICBuYW1lPSJUZXN0IFBsYW4gU3RvcCIsCiAgICAgICAgICAgIGxpbmVfaWRzPVsKICAgICAgICAgICAgICAgICgwLCAwLCB7ImNvbW1hbmRfaWQiOiBzZWxmLmNvbW1hbmRfY3JlYXRlX2Rpci5pZCwgInNlcXVlbmNlIjogMX0pLAogICAgICAgICAgICAgICAgKDAsIDAsIHsiY29tbWFuZF9pZCI6IHNlbGYuY29tbWFuZF9saXN0X2Rpci5pZCwgInNlcXVlbmNlIjogMn0pLAogICAgICAgICAgICBdLAogICAgICAgICkKICAgICAgICBzZXJ2ZXIgPSBzZWxmLnNlcnZlcl90ZXN0XzEKCiAgICAgICAgY3hfdG93ZXJfcGxhbl9saW5lX29iaiA9IHNlbGYucmVnaXN0cnlbImN4LnRvd2VyLnBsYW4ubGluZSJdCiAgICAgICAgX3J1bl9zdXBlciA9IGN4X3Rvd2VyX3BsYW5fbGluZV9vYmouX3J1bgoKICAgICAgICAjIFNhdmUgcGxhbl9sb2cgZm9yIGNvbnRyb2wgaXNfcnVubmluZwogICAgICAgIHBsYW5fbG9nX2hvbGRlciA9IHt9CgogICAgICAgIGRlZiBmYWtlX3J1bihzZWxmLCBzZXJ2ZXIsIHBsYW5fbG9nX3JlY29yZCwgKiprd2FyZ3MpOgogICAgICAgICAgICAjIFNhdmUgcGxhbl9sb2cgZm9yIGNvbnRyb2wgaXNfcnVubmluZwogICAgICAgICAgICBwbGFuX2xvZ19ob2xkZXJbImxvZyJdID0gcGxhbl9sb2dfcmVjb3JkCgogICAgICAgICAgICAjIENhbGwgc3RvcCgpIGFmdGVyIGZpcnN0IGNvbW1hbmQKICAgICAgICAgICAgaWYgbGVuKHBsYW5fbG9nX3JlY29yZC5jb21tYW5kX2xvZ19pZHMpID09IDA6CiAgICAgICAgICAgICAgICBwbGFuX2xvZ19yZWNvcmQuc3RvcCgpCiAgICAgICAgICAgICAgICAjIEFmdGVyIHRoaXMgY2FsbCBwbGFuX2xvZyBzaG91bGQgYmUgc3RvcHBlZCwKICAgICAgICAgICAgICAgICMgYW5kIGZpbmlzaF9kYXRlIHNob3VsZCBiZSBmaWxsZWQKICAgICAgICAgICAgIyBDb250aW51ZSBleGVjdXRpb24gaW4gc3RhbmRhcmQgd2F5CiAgICAgICAgICAgIHJldHVybiBfcnVuX3N1cGVyKHNlbGYsIHNlcnZlciwgcGxhbl9sb2dfcmVjb3JkLCAqKmt3YXJncykKCiAgICAgICAgd2l0aCBwYXRjaC5vYmplY3QoY3hfdG93ZXJfcGxhbl9saW5lX29iaiwgIl9ydW4iLCBuZXc9ZmFrZV9ydW4pOgogICAgICAgICAgICBwbGFuX2xvZyA9IHBsYW4uX3J1bl9zaW5nbGUoc2VydmVyKQoKICAgICAgICBzZWxmLmFzc2VydFRydWUocGxhbl9sb2cuaXNfc3RvcHBlZCwgIlBsYW4gc2hvdWxkIGJlIHN0b3BwZWQiKQogICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocGxhbl9sb2cuaXNfcnVubmluZywgIlBsYW4gc2hvdWxkIG5vdCBiZSBpbiBydW5uaW5nIHN0YXR1cyIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgcGxhbl9sb2cucGxhbl9zdGF0dXMsIFBMQU5fU1RPUFBFRCwgIlN0YXR1cyBzaG91bGQgYmUgUExBTl9TVE9QUEVEIgogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydFRydWUocGxhbl9sb2cuZmluaXNoX2RhdGUsICJGaW5pc2ggZGF0ZSBzaG91bGQgYmUgZmlsbGVkIikKICAgICAgICBzZWxmLmFzc2VydExlc3NFcXVhbCgKICAgICAgICAgICAgbGVuKHBsYW5fbG9nLmNvbW1hbmRfbG9nX2lkcyksCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgICJUaGVyZSBzaG91bGQgYmUgbWF4aW11bSBvbmUgY29tbWFuZCBpbiB0aGUgbG9nIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfZmxpZ2h0X3BsYW5fcmVmZXJlbmNlX3VwZGF0ZShzZWxmKToKICAgICAgICAiIiJUZXN0IGZsaWdodCBwbGFuIHJlZmVyZW5jZSB1cGRhdGUgY2FzY2FkZXMgdG8gZGVwZW5kZW50IG1vZGVscyIiIgogICAgICAgICMgMS4gQWRkIGEgdmFyaWFibGUgdmFsdWUgdG8gcGxhbl9saW5lXzFfYWN0aW9uXzIKICAgICAgICB2YXJpYWJsZV92YWx1ZSA9IHNlbGYuVmFyaWFibGVWYWx1ZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJ2YXJpYWJsZV9pZCI6IHNlbGYudmFyaWFibGVfb3MuaWQsCiAgICAgICAgICAgICAgICAidmFsdWVfY2hhciI6ICJVYnVudHUgMjAuMDQiLAogICAgICAgICAgICAgICAgInBsYW5fbGluZV9hY3Rpb25faWQiOiBzZWxmLnBsYW5fbGluZV8xX2FjdGlvbl8yLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIFN0b3JlIG9yaWdpbmFsIHJlZmVyZW5jZXMgZm9yIGNvbXBhcmlzb24KICAgICAgICBvcmlnaW5hbF9wbGFuX3JlZmVyZW5jZSA9IHNlbGYucGxhbl8xLnJlZmVyZW5jZQogICAgICAgIG9yaWdpbmFsX3BsYW5fbGluZV8xX3JlZmVyZW5jZSA9IHNlbGYucGxhbl9saW5lXzEucmVmZXJlbmNlCiAgICAgICAgb3JpZ2luYWxfcGxhbl9saW5lXzJfcmVmZXJlbmNlID0gc2VsZi5wbGFuX2xpbmVfMi5yZWZlcmVuY2UKICAgICAgICBvcmlnaW5hbF9wbGFuX2xpbmVfMV9hY3Rpb25fMV9yZWZlcmVuY2UgPSBzZWxmLnBsYW5fbGluZV8xX2FjdGlvbl8xLnJlZmVyZW5jZQogICAgICAgIG9yaWdpbmFsX3BsYW5fbGluZV8xX2FjdGlvbl8yX3JlZmVyZW5jZSA9IHNlbGYucGxhbl9saW5lXzFfYWN0aW9uXzIucmVmZXJlbmNlCiAgICAgICAgb3JpZ2luYWxfcGxhbl9saW5lXzJfYWN0aW9uXzFfcmVmZXJlbmNlID0gc2VsZi5wbGFuX2xpbmVfMl9hY3Rpb25fMS5yZWZlcmVuY2UKICAgICAgICBvcmlnaW5hbF9wbGFuX2xpbmVfMl9hY3Rpb25fMl9yZWZlcmVuY2UgPSBzZWxmLnBsYW5fbGluZV8yX2FjdGlvbl8yLnJlZmVyZW5jZQogICAgICAgIG9yaWdpbmFsX3ZhcmlhYmxlX3ZhbHVlX3JlZmVyZW5jZSA9IHZhcmlhYmxlX3ZhbHVlLnJlZmVyZW5jZQoKICAgICAgICAjIDIuIENoYW5nZSB0aGUgcmVmZXJlbmNlIGZvciBwbGFuXzEgdG8gIm5pY2VfbmV3X3BsYW4iCiAgICAgICAgc2VsZi5wbGFuXzEud3JpdGUoeyJyZWZlcmVuY2UiOiAibmljZV9uZXdfcGxhbiJ9KQoKICAgICAgICAjIDMuIFZlcmlmeSB0aGF0IHJlZmVyZW5jZXMgYXJlIHVwZGF0ZWQgZm9yIHBsYW4gbGluZXMKICAgICAgICAjIEludmFsaWRhdGUgbW9kZWxzIHRvIHJlZnJlc2ggYWxsIHJlZmVyZW5jZXMKICAgICAgICBzZWxmLmVudlsiY3gudG93ZXIucGxhbiJdLmludmFsaWRhdGVfbW9kZWwoWyJyZWZlcmVuY2UiXSkKICAgICAgICBzZWxmLmVudlsiY3gudG93ZXIucGxhbi5saW5lIl0uaW52YWxpZGF0ZV9tb2RlbChbInJlZmVyZW5jZSJdKQogICAgICAgIHNlbGYuZW52WyJjeC50b3dlci5wbGFuLmxpbmUuYWN0aW9uIl0uaW52YWxpZGF0ZV9tb2RlbChbInJlZmVyZW5jZSJdKQogICAgICAgIHNlbGYuZW52WyJjeC50b3dlci52YXJpYWJsZS52YWx1ZSJdLmludmFsaWRhdGVfbW9kZWwoWyJyZWZlcmVuY2UiXSkKCiAgICAgICAgIyBDaGVjayB0aGF0IHBsYW4gcmVmZXJlbmNlIHdhcyB1cGRhdGVkCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBsYW5fMS5yZWZlcmVuY2UsICJuaWNlX25ld19wbGFuIikKICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNlbGYucGxhbl8xLnJlZmVyZW5jZSwgb3JpZ2luYWxfcGxhbl9yZWZlcmVuY2UpCgogICAgICAgICMgQ2hlY2sgdGhhdCBwbGFuIGxpbmUgcmVmZXJlbmNlcyB3ZXJlIHVwZGF0ZWQgdG8gaW5jbHVkZSB0aGUgbmV3IHBsYW4gcmVmZXJlbmNlCiAgICAgICAgc2VsZi5hc3NlcnRJbigibmljZV9uZXdfcGxhbiIsIHNlbGYucGxhbl9saW5lXzEucmVmZXJlbmNlKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oIm5pY2VfbmV3X3BsYW4iLCBzZWxmLnBsYW5fbGluZV8yLnJlZmVyZW5jZSkKICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNlbGYucGxhbl9saW5lXzEucmVmZXJlbmNlLCBvcmlnaW5hbF9wbGFuX2xpbmVfMV9yZWZlcmVuY2UpCiAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChzZWxmLnBsYW5fbGluZV8yLnJlZmVyZW5jZSwgb3JpZ2luYWxfcGxhbl9saW5lXzJfcmVmZXJlbmNlKQoKICAgICAgICAjIENoZWNrIHRoYXQgcGxhbiBsaW5lIGFjdGlvbiByZWZlcmVuY2VzIHdlcmUgdXBkYXRlZAogICAgICAgIHNlbGYuYXNzZXJ0SW4oIm5pY2VfbmV3X3BsYW4iLCBzZWxmLnBsYW5fbGluZV8xX2FjdGlvbl8xLnJlZmVyZW5jZSkKICAgICAgICBzZWxmLmFzc2VydEluKCJuaWNlX25ld19wbGFuIiwgc2VsZi5wbGFuX2xpbmVfMV9hY3Rpb25fMi5yZWZlcmVuY2UpCiAgICAgICAgc2VsZi5hc3NlcnRJbigibmljZV9uZXdfcGxhbiIsIHNlbGYucGxhbl9saW5lXzJfYWN0aW9uXzEucmVmZXJlbmNlKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oIm5pY2VfbmV3X3BsYW4iLCBzZWxmLnBsYW5fbGluZV8yX2FjdGlvbl8yLnJlZmVyZW5jZSkKICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKAogICAgICAgICAgICBzZWxmLnBsYW5fbGluZV8xX2FjdGlvbl8xLnJlZmVyZW5jZSwgb3JpZ2luYWxfcGxhbl9saW5lXzFfYWN0aW9uXzFfcmVmZXJlbmNlCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoCiAgICAgICAgICAgIHNlbGYucGxhbl9saW5lXzFfYWN0aW9uXzIucmVmZXJlbmNlLCBvcmlnaW5hbF9wbGFuX2xpbmVfMV9hY3Rpb25fMl9yZWZlcmVuY2UKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbCgKICAgICAgICAgICAgc2VsZi5wbGFuX2xpbmVfMl9hY3Rpb25fMS5yZWZlcmVuY2UsIG9yaWdpbmFsX3BsYW5fbGluZV8yX2FjdGlvbl8xX3JlZmVyZW5jZQogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKAogICAgICAgICAgICBzZWxmLnBsYW5fbGluZV8yX2FjdGlvbl8yLnJlZmVyZW5jZSwgb3JpZ2luYWxfcGxhbl9saW5lXzJfYWN0aW9uXzJfcmVmZXJlbmNlCiAgICAgICAgKQoKICAgICAgICAjIENoZWNrIHRoYXQgdmFyaWFibGUgdmFsdWUgcmVmZXJlbmNlIHdhcyB1cGRhdGVkCiAgICAgICAgIyAgdG8gaW5jbHVkZSB0aGUgbmV3IHBsYW4gcmVmZXJlbmNlCiAgICAgICAgc2VsZi5hc3NlcnRJbigibmljZV9uZXdfcGxhbiIsIHZhcmlhYmxlX3ZhbHVlLnJlZmVyZW5jZSkKICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHZhcmlhYmxlX3ZhbHVlLnJlZmVyZW5jZSwgb3JpZ2luYWxfdmFyaWFibGVfdmFsdWVfcmVmZXJlbmNlKQoKICAgICAgICAjIFZlcmlmeSB0aGUgcmVmZXJlbmNlIHBhdHRlcm4gZm9yIHZhcmlhYmxlIHZhbHVlIGZvbGxvd3MgdGhlIGV4cGVjdGVkIGZvcm1hdDoKICAgICAgICAjIDx2YXJpYWJsZV9yZWZlcmVuY2U+Xzxtb2RlbF9nZW5lcmljX3JlZmVyZW5jZT5fPGxpbmtlZF9tb2RlbF9nZW5lcmljX3JlZmVyZW5jZT5fPGxpbmtlZF9yZWNvcmRfcmVmZXJlbmNlPiAgIyBub3FhOiBFNTAxCiAgICAgICAgZXhwZWN0ZWRfcGF0dGVybiA9ICgKICAgICAgICAgICAgZiJ7c2VsZi52YXJpYWJsZV9vcy5yZWZlcmVuY2V9X3ZhcmlhYmxlX3ZhbHVlX3BsYW5fbGluZV9hY3Rpb25fIgogICAgICAgICAgICBmIntzZWxmLnBsYW5fbGluZV8xX2FjdGlvbl8yLnJlZmVyZW5jZX0iCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFyaWFibGVfdmFsdWUucmVmZXJlbmNlLCBleHBlY3RlZF9wYXR0ZXJuKQoKICAgIGRlZiB0ZXN0X2ZsaWdodF9wbGFuX3dpdGhfY2hpbGRfcGxhbl9jb21tYW5kX2V4Y2VwdGlvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IGZsaWdodCBwbGFuIHdpdGggY2hpbGQgcGxhbiB3aGVyZSBjb21tYW5kIGV4Y2VwdGlvbiBvY2N1cnMuCgogICAgICAgIFNjZW5hcmlvOgogICAgICAgIC0gTWFpbiBmbGlnaHQgcGxhbiBoYXMgMiBjb21tYW5kczoKICAgICAgICAgIDEuIFNpbXBsZSBweXRob24gY29tbWFuZCAoc3VjY2VzcykKICAgICAgICAgIDIuIENoaWxkIGZsaWdodCBwbGFuIHdpdGggMiBjb21tYW5kcyB3aGVyZSBmaXJzdCBmYWlscyB3aXRoIGNvbW1hbmQgZXhjZXB0aW9uCiAgICAgICAgLSBWZXJpZnkgZXJyb3IgcHJvcGFnYXRpb246IGNvbW1hbmQgLT4gY2hpbGQgcGxhbiAtPiBtYWluIHBsYW4KICAgICAgICAtIFRoZSBjb21tYW5kIGV4Y2VwdGlvbiBpcyBzaW11bGF0ZWQgdXNpbmcgdGhlIGV4aXN0aW5nIG1vY2tpbmcgc3lzdGVtCiAgICAgICAgIHRoYXQgcmFpc2VzIGV4Y2VwdGlvbnMgd2hlbiBjb21tYW5kcyBjb250YWluICJyYWlzZSIKICAgICAgICAiIiIKCiAgICAgICAgIyBDcmVhdGUgY2hpbGQgZmxpZ2h0IHBsYW4gd2l0aCAyIGNvbW1hbmRzCiAgICAgICAgY2hpbGRfcGxhbiA9IHNlbGYuUGxhbi5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIkNoaWxkIFBsYW4gd2l0aCBFcnJvciIsCiAgICAgICAgICAgICAgICAibm90ZSI6ICJDaGlsZCBwbGFuIHRoYXQgd2lsbCBmYWlsIG9uIGZpcnN0IGNvbW1hbmQiLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENvbW1hbmQgMSBvZiBjaGlsZCBwbGFuIC0gd2lsbCBmYWlsIHdpdGggY29tbWFuZCBleGNlcHRpb24KICAgICAgICBjaGlsZF9jb21tYW5kXzEgPSBzZWxmLkNvbW1hbmQuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJDaGlsZCBDb21tYW5kIDEgLSBDb21tYW5kIEV4Y2VwdGlvbiIsCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogInNzaF9jb21tYW5kIiwKICAgICAgICAgICAgICAgICJjb2RlIjogInJhaXNlIiwgICMgVGhpcyB3aWxsIHRyaWdnZXIgY29tbWFuZCBleGNlcHRpb24gaW4gbW9jawogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENvbW1hbmQgMiBvZiBjaGlsZCBwbGFuIC0gc2hvdWxkIG5vdCBleGVjdXRlIGR1ZSB0byBlcnJvciBpbiBjb21tYW5kIDEKICAgICAgICBjaGlsZF9jb21tYW5kXzIgPSBzZWxmLkNvbW1hbmQuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJDaGlsZCBDb21tYW5kIDIgLSBTaG91bGQgTm90IFJ1biIsCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogInB5dGhvbl9jb2RlIiwKICAgICAgICAgICAgICAgICJjb2RlIjogIiIiCnJlc3VsdCA9IHsKICAgICJleGl0X2NvZGUiOiAwLAogICAgIm1lc3NhZ2UiOiAiVGhpcyBzaG91bGQgbm90IGV4ZWN1dGUiCn0KICAgICAgICAgICAgIiIiLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENyZWF0ZSBwbGFuIGxpbmVzIGZvciBjaGlsZCBwbGFuCiAgICAgICAgc2VsZi5wbGFuX2xpbmUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2VxdWVuY2UiOiAxMCwKICAgICAgICAgICAgICAgICJwbGFuX2lkIjogY2hpbGRfcGxhbi5pZCwKICAgICAgICAgICAgICAgICJjb21tYW5kX2lkIjogY2hpbGRfY29tbWFuZF8xLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHNlbGYucGxhbl9saW5lLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNlcXVlbmNlIjogMjAsCiAgICAgICAgICAgICAgICAicGxhbl9pZCI6IGNoaWxkX3BsYW4uaWQsCiAgICAgICAgICAgICAgICAiY29tbWFuZF9pZCI6IGNoaWxkX2NvbW1hbmRfMi5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBDcmVhdGUgY29tbWFuZCB0byBydW4gY2hpbGQgcGxhbgogICAgICAgIHJ1bl9jaGlsZF9wbGFuX2NvbW1hbmQgPSBzZWxmLkNvbW1hbmQuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJSdW4gQ2hpbGQgUGxhbiIsCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogInBsYW4iLAogICAgICAgICAgICAgICAgImZsaWdodF9wbGFuX2lkIjogY2hpbGRfcGxhbi5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBDcmVhdGUgbWFpbiBmbGlnaHQgcGxhbiB3aXRoIDIgY29tbWFuZHMKICAgICAgICBtYWluX3BsYW4gPSBzZWxmLlBsYW4uY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJNYWluIFBsYW4gd2l0aCBDaGlsZCBQbGFuIiwKICAgICAgICAgICAgICAgICJub3RlIjogIk1haW4gcGxhbiB3aXRoIHB5dGhvbiBjb21tYW5kIGFuZCBjaGlsZCBwbGFuIiwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBDb21tYW5kIDEgb2YgbWFpbiBwbGFuIC0gc2ltcGxlIHB5dGhvbiBjb21tYW5kIChzaG91bGQgc3VjY2VlZCkKICAgICAgICBtYWluX2NvbW1hbmRfMSA9IHNlbGYuQ29tbWFuZC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIk1haW4gQ29tbWFuZCAxIC0gUHl0aG9uIFN1Y2Nlc3MiLAogICAgICAgICAgICAgICAgImFjdGlvbiI6ICJweXRob25fY29kZSIsCiAgICAgICAgICAgICAgICAiY29kZSI6ICIiIgpyZXN1bHQgPSB7CiAgICAiZXhpdF9jb2RlIjogMCwKICAgICJtZXNzYWdlIjogIk1haW4gcGxhbiBweXRob24gY29tbWFuZCBleGVjdXRlZCBzdWNjZXNzZnVsbHkiCn0KICAgICAgICAgICAgIiIiLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENvbW1hbmQgMiBvZiBtYWluIHBsYW4gLSBydW4gY2hpbGQgcGxhbiAod2lsbCBmYWlsKQogICAgICAgIG1haW5fY29tbWFuZF8yID0gcnVuX2NoaWxkX3BsYW5fY29tbWFuZAoKICAgICAgICAjIENyZWF0ZSBwbGFuIGxpbmVzIGZvciBtYWluIHBsYW4KICAgICAgICBzZWxmLnBsYW5fbGluZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzZXF1ZW5jZSI6IDEwLAogICAgICAgICAgICAgICAgInBsYW5faWQiOiBtYWluX3BsYW4uaWQsCiAgICAgICAgICAgICAgICAiY29tbWFuZF9pZCI6IG1haW5fY29tbWFuZF8xLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHNlbGYucGxhbl9saW5lLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNlcXVlbmNlIjogMjAsCiAgICAgICAgICAgICAgICAicGxhbl9pZCI6IG1haW5fcGxhbi5pZCwKICAgICAgICAgICAgICAgICJjb21tYW5kX2lkIjogbWFpbl9jb21tYW5kXzIuaWQsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgIyBSdW4gdGhlIGZpcnN0IGNvbW1hbmQgYWdhaW4KICAgICAgICBzZWxmLnBsYW5fbGluZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzZXF1ZW5jZSI6IDMwLAogICAgICAgICAgICAgICAgInBsYW5faWQiOiBtYWluX3BsYW4uaWQsCiAgICAgICAgICAgICAgICAiY29tbWFuZF9pZCI6IG1haW5fY29tbWFuZF8xLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIFJ1biB0aGUgbWFpbiBmbGlnaHQgcGxhbgogICAgICAgIHBsYW5fbG9nID0gc2VsZi5zZXJ2ZXJfdGVzdF8xLnJ1bl9mbGlnaHRfcGxhbihtYWluX3BsYW4pCgogICAgICAgICMgVmVyaWZ5IG1haW4gcGxhbiBmaW5pc2hlZCB3aXRoIGVycm9yCiAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbCgKICAgICAgICAgICAgcGxhbl9sb2cucGxhbl9zdGF0dXMsIDAsICJNYWluIHBsYW4gc2hvdWxkIG5vdCBmaW5pc2ggc3VjY2Vzc2Z1bGx5IgogICAgICAgICkKCiAgICAgICAgIyBHZXQgYWxsIHBsYW4gbG9ncyBmb3IgdmVyaWZpY2F0aW9uCiAgICAgICAgYWxsX3BsYW5fbG9ncyA9IHBsYW5fbG9nIHwgc2VsZi5QbGFuTG9nLnNlYXJjaCgKICAgICAgICAgICAgWygicGFyZW50X2ZsaWdodF9wbGFuX2xvZ19pZCIsICI9IiwgcGxhbl9sb2cuaWQpXQogICAgICAgICkKCiAgICAgICAgIyBTaG91bGQgaGF2ZSAyIHBsYW4gbG9nczogbWFpbiBwbGFuIGFuZCBjaGlsZCBwbGFuCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbGVuKGFsbF9wbGFuX2xvZ3MpLCAyLCAiU2hvdWxkIGhhdmUgMiBwbGFuIGxvZ3M6IG1haW4gYW5kIGNoaWxkIgogICAgICAgICkKCiAgICAgICAgbWFpbl9wbGFuX2xvZyA9IGFsbF9wbGFuX2xvZ3MuZmlsdGVyZWQobGFtYmRhIGxvZzogbG9nLnBsYW5faWQgPT0gbWFpbl9wbGFuKQogICAgICAgIGNoaWxkX3BsYW5fbG9nID0gYWxsX3BsYW5fbG9ncy5maWx0ZXJlZCgKICAgICAgICAgICAgbGFtYmRhIGxvZzogbG9nLnBhcmVudF9mbGlnaHRfcGxhbl9sb2dfaWQgPT0gbWFpbl9wbGFuX2xvZwogICAgICAgICkKCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1haW5fcGxhbl9sb2csICJNYWluIHBsYW4gbG9nIHNob3VsZCBleGlzdCIpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNoaWxkX3BsYW5fbG9nLCAiQ2hpbGQgcGxhbiBsb2cgc2hvdWxkIGV4aXN0IikKCiAgICAgICAgIyBWZXJpZnkgY2hpbGQgcGxhbiBmaW5pc2hlZCB3aXRoIGVycm9yCiAgICAgICAgIyBUaGUgY2hpbGQgcGxhbiBzaG91bGQgZmluaXNoIHdpdGggYW4gZXJyb3IKICAgICAgICAjIChlaXRoZXIgU1NIX0NPTk5FQ1RJT05fRVJST1Igb3IgR0VORVJBTF9FUlJPUikKICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKAogICAgICAgICAgICBjaGlsZF9wbGFuX2xvZy5wbGFuX3N0YXR1cywKICAgICAgICAgICAgMCwKICAgICAgICAgICAgIkNoaWxkIHBsYW4gc2hvdWxkIG5vdCBmaW5pc2ggc3VjY2Vzc2Z1bGx5IiwKICAgICAgICApCgogICAgICAgICMgR2V0IGNvbW1hbmQgbG9ncyBmb3IgdmVyaWZpY2F0aW9uCiAgICAgICAgYWxsX2NvbW1hbmRfbG9ncyA9IHNlbGYuQ29tbWFuZExvZy5zZWFyY2goCiAgICAgICAgICAgIFsoInBsYW5fbG9nX2lkIiwgImluIiwgYWxsX3BsYW5fbG9ncy5pZHMpXQogICAgICAgICkKCiAgICAgICAgIyBTaG91bGQgaGF2ZSAzIGNvbW1hbmQgbG9nczogbWFpbiBweXRob24sCiAgICAgICAgIyBydW4gY2hpbGQgcGxhbiwgY2hpbGQgY29tbWFuZCBleGNlcHRpb24KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihhbGxfY29tbWFuZF9sb2dzKSwgMywgIlNob3VsZCBoYXZlIDMgY29tbWFuZCBsb2dzIikKCiAgICAgICAgIyBGaW5kIHNwZWNpZmljIGNvbW1hbmQgbG9ncwogICAgICAgIG1haW5fcHl0aG9uX2xvZyA9IGFsbF9jb21tYW5kX2xvZ3MuZmlsdGVyZWQoCiAgICAgICAgICAgIGxhbWJkYSBsb2c6IGxvZy5jb21tYW5kX2lkID09IG1haW5fY29tbWFuZF8xCiAgICAgICAgKQogICAgICAgIHJ1bl9jaGlsZF9wbGFuX2xvZyA9IGFsbF9jb21tYW5kX2xvZ3MuZmlsdGVyZWQoCiAgICAgICAgICAgIGxhbWJkYSBsb2c6IGxvZy5jb21tYW5kX2lkID09IG1haW5fY29tbWFuZF8yCiAgICAgICAgKQogICAgICAgIGNoaWxkX3NzaF9lcnJvcl9sb2cgPSBhbGxfY29tbWFuZF9sb2dzLmZpbHRlcmVkKAogICAgICAgICAgICBsYW1iZGEgbG9nOiBsb2cuY29tbWFuZF9pZCA9PSBjaGlsZF9jb21tYW5kXzEKICAgICAgICApCgogICAgICAgICMgVmVyaWZ5IG1haW4gcHl0aG9uIGNvbW1hbmQgc3VjY2VlZGVkCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbWFpbl9weXRob25fbG9nLmNvbW1hbmRfc3RhdHVzLCAwLCAiTWFpbiBweXRob24gY29tbWFuZCBzaG91bGQgc3VjY2VlZCIKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbWFpbl9weXRob25fbG9nLmNvbW1hbmRfcmVzcG9uc2UsCiAgICAgICAgICAgICJNYWluIHBsYW4gcHl0aG9uIGNvbW1hbmQgZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5IiwKICAgICAgICAgICAgIk1haW4gcHl0aG9uIGNvbW1hbmQgc2hvdWxkIGhhdmUgY29ycmVjdCByZXNwb25zZSIsCiAgICAgICAgKQoKICAgICAgICAjIFZlcmlmeSBydW4gY2hpbGQgcGxhbiBjb21tYW5kIGZhaWxlZAogICAgICAgICMgVGhlIGNvbW1hbmQgc2hvdWxkIGZhaWwgd2l0aCBhbiBlcnJvcgogICAgICAgICMgKGVpdGhlciBTU0hfQ09OTkVDVElPTl9FUlJPUiBvciBHRU5FUkFMX0VSUk9SKQogICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoCiAgICAgICAgICAgIHJ1bl9jaGlsZF9wbGFuX2xvZy5jb21tYW5kX3N0YXR1cywKICAgICAgICAgICAgMCwKICAgICAgICAgICAgIlJ1biBjaGlsZCBwbGFuIGNvbW1hbmQgc2hvdWxkIGZhaWwiLAogICAgICAgICkKCiAgICAgICAgIyBWZXJpZnkgY2hpbGQgU1NIIGNvbW1hbmQgZmFpbGVkCiAgICAgICAgIyBUaGUgU1NIIGNvbW1hbmQgc2hvdWxkIGZhaWwgd2l0aCBhbiBlcnJvciBzdGF0dXMKICAgICAgICAjIChjb3VsZCBiZSBHRU5FUkFMX0VSUk9SIC0xMDAgb3IgMjU1IGRlcGVuZGluZyBvbiBob3cgdGhlIGV4Y2VwdGlvbiBpcyBoYW5kbGVkKQogICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoCiAgICAgICAgICAgIGNoaWxkX3NzaF9lcnJvcl9sb2cuY29tbWFuZF9zdGF0dXMsIDAsICJDaGlsZCBTU0ggY29tbWFuZCBzaG91bGQgZmFpbCIKICAgICAgICApCiAgICAgICAgIyBUaGUgZXJyb3IgbWVzc2FnZSBzaG91bGQgY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dAogICAgICAgICMgdGhlIFNTSCBjb25uZWN0aW9uIGZhaWx1cmUKICAgICAgICAjIFRoZSBleGFjdCBlcnJvciBtZXNzYWdlIG1heSB2YXJ5IGRlcGVuZGluZwogICAgICAgICMgb24gaG93IHRoZSBleGNlcHRpb24gaXMgaGFuZGxlZAogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKICAgICAgICAgICAgY2hpbGRfc3NoX2Vycm9yX2xvZy5jb21tYW5kX2Vycm9yLAogICAgICAgICAgICAiQ2hpbGQgU1NIIGNvbW1hbmQgc2hvdWxkIGhhdmUgYW4gZXJyb3IgbWVzc2FnZSIsCiAgICAgICAgKQoKICAgICAgICAjIFZlcmlmeSB0aGF0IGNoaWxkIGNvbW1hbmQgMiB3YXMgbm90IGV4ZWN1dGVkIChubyBsb2cgZm9yIGl0KQogICAgICAgIGNoaWxkX2NvbW1hbmRfMl9sb2cgPSBhbGxfY29tbWFuZF9sb2dzLmZpbHRlcmVkKAogICAgICAgICAgICBsYW1iZGEgbG9nOiBsb2cuY29tbWFuZF9pZCA9PSBjaGlsZF9jb21tYW5kXzIKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgKICAgICAgICAgICAgY2hpbGRfY29tbWFuZF8yX2xvZywgIkNoaWxkIGNvbW1hbmQgMiBzaG91bGQgbm90IGhhdmUgYmVlbiBleGVjdXRlZCIKICAgICAgICApCgogICAgICAgICMgVmVyaWZ5IHBsYW4gbG9nIHJlbGF0aW9uc2hpcHMKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBtYWluX3BsYW5fbG9nLmNvbW1hbmRfbG9nX2lkcywKICAgICAgICAgICAgbWFpbl9weXRob25fbG9nIHwgcnVuX2NoaWxkX3BsYW5fbG9nLAogICAgICAgICAgICAiTWFpbiBwbGFuIHNob3VsZCBoYXZlIGNvcnJlY3QgY29tbWFuZCBsb2dzIiwKICAgICAgICApCgogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGNoaWxkX3BsYW5fbG9nLmNvbW1hbmRfbG9nX2lkcywKICAgICAgICAgICAgY2hpbGRfc3NoX2Vycm9yX2xvZywKICAgICAgICAgICAgIkNoaWxkIHBsYW4gc2hvdWxkIGhhdmUgb25seSB0aGUgZmFpbGVkIGNvbW1hbmQgbG9nIiwKICAgICAgICApCgogICAgICAgICMgVmVyaWZ5IHRoYXQgdGhlIGVycm9yIHByb3BhZ2F0ZWQgY29ycmVjdGx5IHRocm91Z2ggdGhlIGhpZXJhcmNoeQogICAgICAgICMgVGhlIGVycm9yIHNob3VsZCBwcm9wYWdhdGUgZnJvbSBjb21tYW5kIC0+IGNoaWxkIHBsYW4gLT4gbWFpbiBwbGFuCiAgICAgICAgIyBUaGUgc3BlY2lmaWMgZXJyb3IgY29kZXMgbWF5IHZhcnkgZGVwZW5kaW5nCiAgICAgICAgIyBvbiBob3cgdGhlIHN5c3RlbSBoYW5kbGVzIHRoZSBlcnJvcgogICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoCiAgICAgICAgICAgIG1haW5fcGxhbl9sb2cucGxhbl9zdGF0dXMsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJFcnJvciBzaG91bGQgcHJvcGFnYXRlIGZyb20gY2hpbGQgdG8gbWFpbiBwbGFuIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbCgKICAgICAgICAgICAgY2hpbGRfcGxhbl9sb2cucGxhbl9zdGF0dXMsIDAsICJFcnJvciBzaG91bGQgYmUgcHJlc2VudCBpbiBjaGlsZCBwbGFuIgogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKAogICAgICAgICAgICBjaGlsZF9zc2hfZXJyb3JfbG9nLmNvbW1hbmRfc3RhdHVzLAogICAgICAgICAgICAwLAogICAgICAgICAgICAiU1NIIGNvbW1hbmQgc2hvdWxkIGhhdmUgYW4gZXJyb3Igc3RhdHVzIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgY2hpbGRfc3NoX2Vycm9yX2xvZy5jb21tYW5kX3N0YXR1cywKICAgICAgICAgICAgY2hpbGRfcGxhbl9sb2cucGxhbl9zdGF0dXMsCiAgICAgICAgICAgICJDaGlsZCBwbGFuIHNob3VsZCBoYXZlIHRoZSBzYW1lIGVycm9yIHN0YXR1cyBhcyB0aGUgU1NIIGNvbW1hbmQiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBjaGlsZF9zc2hfZXJyb3JfbG9nLmNvbW1hbmRfc3RhdHVzLAogICAgICAgICAgICBtYWluX3BsYW5fbG9nLnBsYW5fc3RhdHVzLAogICAgICAgICAgICAiTWFpbiBwbGFuIHNob3VsZCBoYXZlIHRoZSBzYW1lIGVycm9yIHN0YXR1cyBhcyB0aGUgU1NIIGNvbW1hbmQiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9za2lwX2NvbW1hbmRfZXJyb3JfZmxvdyhzZWxmKToKICAgICAgICAiIiJQbGFuIGZsb3c6CiAgICAgICAgMSkgc3VjY2VzcywgMikgc3VjY2VzcywgMykgZXJyb3IgLT4gc2V0cyBjb21tYW5kX2Vycm9yIHZhcmlhYmxlLAogICAgICAgIDQpIHNraXBwZWQgaWYgbm90IHZhciwgNSkgcnVucyBpZiB2YXIgYW5kIGV4aXRzIC0xLgogICAgICAgICIiIgogICAgICAgICMgQ3JlYXRlIGNvbW1hbmRzCiAgICAgICAgY29tbWFuZF9zdWNjZXNzID0gc2VsZi5Db21tYW5kLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiQ29tbWFuZCAtPiBTdWNjZXNzIiwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAicHl0aG9uX2NvZGUiLAogICAgICAgICAgICAgICAgImNvZGUiOiAiIyBKdXN0IHJldHVybiBkZWZhdWx0IHZhbHVlcyIsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgY29tbWFuZF9lcnJvciA9IHNlbGYuQ29tbWFuZC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIkNvbW1hbmQgLT4gRXJyb3IiLAogICAgICAgICAgICAgICAgImFjdGlvbiI6ICJweXRob25fY29kZSIsCiAgICAgICAgICAgICAgICAiY29kZSI6ICJyZXN1bHQgPSB7J2V4aXRfY29kZSc6IC0xMDAsICdtZXNzYWdlJzogJ0Vycm9yJ30iLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIGNvbW1hbmRfYWZ0ZXJfZmFpbGVkID0gc2VsZi5Db21tYW5kLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiQ29tbWFuZCAtPiBBZnRlciBmYWlsZWQiLAogICAgICAgICAgICAgICAgImFjdGlvbiI6ICJweXRob25fY29kZSIsCiAgICAgICAgICAgICAgICAiY29kZSI6ICgKICAgICAgICAgICAgICAgICAgICAibmFtZSA9IHNlcnZlci5uYW1lICsgJyAtLWFmdGVyLWZhaWxlZC0tICdcbiIKICAgICAgICAgICAgICAgICAgICAic2VydmVyLndyaXRlKHsnbmFtZSc6IG5hbWV9KSIKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgY29tbWFuZF9sYXN0X29uZSA9IHNlbGYuQ29tbWFuZC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIkNvbW1hbmQgLT4gVGhlIGxhc3Qgb25lIiwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAicHl0aG9uX2NvZGUiLAogICAgICAgICAgICAgICAgImNvZGUiOiAoCiAgICAgICAgICAgICAgICAgICAgIm5hbWUgPSBzZXJ2ZXIubmFtZSArICcgLS1sYXN0LW9uZS0tICdcbiIKICAgICAgICAgICAgICAgICAgICAic2VydmVyLndyaXRlKHsnbmFtZSc6IG5hbWV9KSIKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgVmFyaWFibGUgdXNlZCBpbiBjb25kaXRpb25zCiAgICAgICAgdmFyaWFibGVfY29tbWFuZF9lcnJvciA9IHNlbGYuVmFyaWFibGUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJjb21tYW5kX2Vycm9yIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAidGVzdF9jb21tYW5kX2Vycm9yIiwKICAgICAgICAgICAgICAgICJ2YXJpYWJsZV90eXBlIjogInMiLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIFBsYW4gYW5kIGxpbmVzCiAgICAgICAgcGxhbiA9IHNlbGYuUGxhbi5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3Qgc2tpcCBjb21tYW5kIGVycm9yIiwKICAgICAgICAgICAgICAgICJvbl9lcnJvcl9hY3Rpb24iOiAiZSIsCiAgICAgICAgICAgICAgICAiY3VzdG9tX2V4aXRfY29kZSI6IDAsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgIHNlbGYucGxhbl9saW5lLmNyZWF0ZSgKICAgICAgICAgICAgeyJzZXF1ZW5jZSI6IDEwLCAicGxhbl9pZCI6IHBsYW4uaWQsICJjb21tYW5kX2lkIjogY29tbWFuZF9zdWNjZXNzLmlkfQogICAgICAgICkKICAgICAgICBzZWxmLnBsYW5fbGluZS5jcmVhdGUoCiAgICAgICAgICAgIHsic2VxdWVuY2UiOiAyMCwgInBsYW5faWQiOiBwbGFuLmlkLCAiY29tbWFuZF9pZCI6IGNvbW1hbmRfc3VjY2Vzcy5pZH0KICAgICAgICApCgogICAgICAgIGxpbmUzID0gc2VsZi5wbGFuX2xpbmUuY3JlYXRlKAogICAgICAgICAgICB7InNlcXVlbmNlIjogMzAsICJwbGFuX2lkIjogcGxhbi5pZCwgImNvbW1hbmRfaWQiOiBjb21tYW5kX2Vycm9yLmlkfQogICAgICAgICkKICAgICAgICBhY3Rpb24zID0gc2VsZi5wbGFuX2xpbmVfYWN0aW9uLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgImxpbmVfaWQiOiBsaW5lMy5pZCwKICAgICAgICAgICAgICAgICJzZXF1ZW5jZSI6IDEwLAogICAgICAgICAgICAgICAgImNvbmRpdGlvbiI6ICIhPSIsCiAgICAgICAgICAgICAgICAidmFsdWVfY2hhciI6ICIwIiwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAibiIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgIHNlbGYuVmFyaWFibGVWYWx1ZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJ2YXJpYWJsZV9pZCI6IHZhcmlhYmxlX2NvbW1hbmRfZXJyb3IuaWQsCiAgICAgICAgICAgICAgICAidmFsdWVfY2hhciI6ICIxIiwKICAgICAgICAgICAgICAgICJwbGFuX2xpbmVfYWN0aW9uX2lkIjogYWN0aW9uMy5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgc2VsZi5wbGFuX2xpbmUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2VxdWVuY2UiOiA0MCwKICAgICAgICAgICAgICAgICJwbGFuX2lkIjogcGxhbi5pZCwKICAgICAgICAgICAgICAgICJjb21tYW5kX2lkIjogY29tbWFuZF9hZnRlcl9mYWlsZWQuaWQsCiAgICAgICAgICAgICAgICAiY29uZGl0aW9uIjogIm5vdCB7eyB0ZXN0X2NvbW1hbmRfZXJyb3IgfX0iLAogICAgICAgICAgICAgICAgInZhcmlhYmxlX2lkcyI6IFsoNiwgMCwgW3ZhcmlhYmxlX2NvbW1hbmRfZXJyb3IuaWRdKV0sCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgIGxpbmU1ID0gc2VsZi5wbGFuX2xpbmUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2VxdWVuY2UiOiA1MCwKICAgICAgICAgICAgICAgICJwbGFuX2lkIjogcGxhbi5pZCwKICAgICAgICAgICAgICAgICJjb21tYW5kX2lkIjogY29tbWFuZF9sYXN0X29uZS5pZCwKICAgICAgICAgICAgICAgICJjb25kaXRpb24iOiAie3sgdGVzdF9jb21tYW5kX2Vycm9yIH19IiwKICAgICAgICAgICAgICAgICJ2YXJpYWJsZV9pZHMiOiBbKDYsIDAsIFt2YXJpYWJsZV9jb21tYW5kX2Vycm9yLmlkXSldLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHNlbGYucGxhbl9saW5lX2FjdGlvbi5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJsaW5lX2lkIjogbGluZTUuaWQsCiAgICAgICAgICAgICAgICAic2VxdWVuY2UiOiAxMCwKICAgICAgICAgICAgICAgICJjb25kaXRpb24iOiAiPT0iLAogICAgICAgICAgICAgICAgInZhbHVlX2NoYXIiOiAiMCIsCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogImVjIiwKICAgICAgICAgICAgICAgICJjdXN0b21fZXhpdF9jb2RlIjogLTEsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgIHBsYW5fbG9nID0gc2VsZi5zZXJ2ZXJfdGVzdF8xLnJ1bl9mbGlnaHRfcGxhbihwbGFuKQoKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihwbGFuX2xvZy5jb21tYW5kX2xvZ19pZHMpLCA1KQogICAgICAgIGxvZ3MgPSBwbGFuX2xvZy5jb21tYW5kX2xvZ19pZHMKICAgICAgICBzZWxmLmFzc2VydFRydWUoCiAgICAgICAgICAgIGFsbCgKICAgICAgICAgICAgICAgIGxvZy5jb21tYW5kX3N0YXR1cyA9PSAwCiAgICAgICAgICAgICAgICBmb3IgbG9nIGluIGxvZ3MuZmlsdGVyZWQobGFtYmRhIGxvZzogbG9nLmNvbW1hbmRfaWQgPT0gY29tbWFuZF9zdWNjZXNzKQogICAgICAgICAgICApCiAgICAgICAgKQoKICAgICAgICBlcnJvcl9sb2cgPSBsb2dzLmZpbHRlcmVkKGxhbWJkYSBsb2c6IGxvZy5jb21tYW5kX2lkID09IGNvbW1hbmRfZXJyb3IpCiAgICAgICAgc2VsZi5hc3NlcnRJbih2YXJpYWJsZV9jb21tYW5kX2Vycm9yLnJlZmVyZW5jZSwgZXJyb3JfbG9nLnZhcmlhYmxlX3ZhbHVlcykKICAgICAgICBzZWxmLmFzc2VydFRydWUoZXJyb3JfbG9nLmNvbW1hbmRfc3RhdHVzID09IEdFTkVSQUxfRVJST1IpCgogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKICAgICAgICAgICAgbG9ncy5maWx0ZXJlZChsYW1iZGEgbG9nOiBsb2cuY29tbWFuZF9pZCA9PSBjb21tYW5kX2FmdGVyX2ZhaWxlZCkubWFwcGVkKAogICAgICAgICAgICAgICAgImNvbW1hbmRfc3RhdHVzIgogICAgICAgICAgICApWzBdCiAgICAgICAgICAgID09IFBMQU5fTElORV9DT05ESVRJT05fQ0hFQ0tfRkFJTEVECiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKICAgICAgICAgICAgbG9ncy5maWx0ZXJlZChsYW1iZGEgbG9nOiBsb2cuY29tbWFuZF9pZCA9PSBjb21tYW5kX2xhc3Rfb25lKS5tYXBwZWQoCiAgICAgICAgICAgICAgICAiY29tbWFuZF9zdGF0dXMiCiAgICAgICAgICAgIClbMF0KICAgICAgICAgICAgPT0gMAogICAgICAgICkKCiAgICAgICAgIyBGaW5hbCBwbGFuIHN0YXR1cyBtdXN0IGJlIGN1c3RvbSBleGl0IGNvZGUgLTEgZnJvbSBsaW5lIDUgYWN0aW9uCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwbGFuX2xvZy5wbGFuX3N0YXR1cywgLTEpCgogICAgZGVmIHRlc3RfcGxhbl9saW5lX2NvbmRpdGlvbl9lcnJvcihzZWxmKToKICAgICAgICAiIiJUZXN0IHBsYW4gbGluZSBjb25kaXRpb24gZXJyb3IKICAgICAgICBGaXJzdCBsaW5lIGlzIHNraXBwZWQgYmVjYXVzZSBvZiBjb25kaXRpb24gZXJyb3IKICAgICAgICBTZWNvbmQgbGluZSBpcyBleGVjdXRlZCBzdWNjZXNzZnVsbHkKICAgICAgICAiIiIKICAgICAgICAjIENyZWF0ZSBjb21tYW5kcwogICAgICAgIGNvbW1hbmRfc3VjY2VzcyA9IHNlbGYuQ29tbWFuZC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIkNvbW1hbmQgLT4gU3VjY2VzcyIsCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogInB5dGhvbl9jb2RlIiwKICAgICAgICAgICAgICAgICJjb2RlIjogIiMgSnVzdCByZXR1cm4gZGVmYXVsdCB2YWx1ZXMiLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIFBsYW4gYW5kIGxpbmVzCiAgICAgICAgcGxhbiA9IHNlbGYuUGxhbi5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgcGxhbiBsaW5lIGNvbmRpdGlvbiBlcnJvciIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgIHNlbGYucGxhbl9saW5lLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNlcXVlbmNlIjogMTAsCiAgICAgICAgICAgICAgICAicGxhbl9pZCI6IHBsYW4uaWQsCiAgICAgICAgICAgICAgICAiY29tbWFuZF9pZCI6IGNvbW1hbmRfc3VjY2Vzcy5pZCwKICAgICAgICAgICAgICAgICJjb25kaXRpb24iOiAiPXEiLAogICAgICAgICAgICB9LAogICAgICAgICkKICAgICAgICBzZWxmLnBsYW5fbGluZS5jcmVhdGUoCiAgICAgICAgICAgIHsic2VxdWVuY2UiOiAyMCwgInBsYW5faWQiOiBwbGFuLmlkLCAiY29tbWFuZF9pZCI6IGNvbW1hbmRfc3VjY2Vzcy5pZH0KICAgICAgICApCgogICAgICAgIHdpdGggbXV0ZV9sb2dnZXIoIm9kb28uYWRkb25zLmNldG1peF90b3dlcl9zZXJ2ZXIubW9kZWxzLmN4X3Rvd2VyX3BsYW5fbGluZSIpOgogICAgICAgICAgICBwbGFuX2xvZyA9IHNlbGYuc2VydmVyX3Rlc3RfMS5ydW5fZmxpZ2h0X3BsYW4ocGxhbikKCiAgICAgICAgIyBNdXN0IGJlIDIgY29tbWFuZCBsb2dzCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocGxhbl9sb2cuY29tbWFuZF9sb2dfaWRzKSwgMikKICAgICAgICBsb2dzID0gcGxhbl9sb2cuY29tbWFuZF9sb2dfaWRzCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxvZ3NbMF0uaXNfc2tpcHBlZCkKICAgICAgICBzZWxmLmFzc2VydFRydWUobG9nc1sxXS5jb21tYW5kX3N0YXR1cyA9PSAwKQoKICAgIGRlZiB0ZXN0X2N1c3RvbV92YWx1ZXNfbm90X2RlZmluZWRfYnV0X3VwZGF0ZWQoc2VsZik6CiAgICAgICAgIiIiVGVzdCBjdXN0b20gdmFsdWVzIG5vdCBkZWZpbmVkIGJ1dCB1cGRhdGVkCiAgICAgICAgRmlyc3QgY29tbWFuZCBpcyBleGVjdXRlZCBzdWNjZXNzZnVsbHkKICAgICAgICBTZWNvbmQgY29tbWFuZCBpcyBleGVjdXRlZCBzdWNjZXNzZnVsbHkgYW5kIHVwZGF0ZXMgY3VzdG9tIHZhbHVlcwogICAgICAgICIiIgogICAgICAgICMgQ3JlYXRlIGNvbW1hbmRzCiAgICAgICAgY29tbWFuZF8xID0gc2VsZi5Db21tYW5kLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiQ29tbWFuZCAtPiBTdWNjZXNzIiwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAicHl0aG9uX2NvZGUiLAogICAgICAgICAgICAgICAgImNvZGUiOiAiIyBKdXN0IHJldHVybiBkZWZhdWx0IHZhbHVlcyIsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgY29tbWFuZF8yID0gc2VsZi5Db21tYW5kLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiQ29tbWFuZCAtPiBTdWNjZXNzIiwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAicHl0aG9uX2NvZGUiLAogICAgICAgICAgICAgICAgImNvZGUiOiAiY3VzdG9tX3ZhbHVlcy51cGRhdGUoeydzb21lX3ZhbHVlJzogJzEnfSkiLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIFBsYW4gYW5kIGxpbmVzCiAgICAgICAgcGxhbiA9IHNlbGYuUGxhbi5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgY3VzdG9tIHZhbHVlcyBub3QgZGVmaW5lZCBidXQgdXBkYXRlZCIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgIHNlbGYucGxhbl9saW5lLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNlcXVlbmNlIjogMTAsCiAgICAgICAgICAgICAgICAicGxhbl9pZCI6IHBsYW4uaWQsCiAgICAgICAgICAgICAgICAiY29tbWFuZF9pZCI6IGNvbW1hbmRfMS5pZCwKICAgICAgICAgICAgfSwKICAgICAgICApCgogICAgICAgIHNlbGYucGxhbl9saW5lLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNlcXVlbmNlIjogMjAsCiAgICAgICAgICAgICAgICAicGxhbl9pZCI6IHBsYW4uaWQsCiAgICAgICAgICAgICAgICAiY29tbWFuZF9pZCI6IGNvbW1hbmRfMi5pZCwKICAgICAgICAgICAgfSwKICAgICAgICApCiAgICAgICAgcGxhbl9sb2cgPSBzZWxmLnNlcnZlcl90ZXN0XzEucnVuX2ZsaWdodF9wbGFuKHBsYW4pCgogICAgICAgICMgTXVzdCBiZSAyIGNvbW1hbmQgbG9ncwogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHBsYW5fbG9nLmNvbW1hbmRfbG9nX2lkcyksIDIpCiAgICAgICAgbG9ncyA9IHBsYW5fbG9nLmNvbW1hbmRfbG9nX2lkcwogICAgICAgICMgQm90aCBjb21tYW5kcyBzaG91bGQgYmUgc3VjY2Vzc2Z1bAogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9nc1swXS5jb21tYW5kX3N0YXR1cywgMCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvZ3NbMV0uY29tbWFuZF9zdGF0dXMsIDApCiAgICAgICAgIyBDdXN0b20gdmFsdWVzIHNob3VsZCBiZSB1cGRhdGVkCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwbGFuX2xvZy52YXJpYWJsZV92YWx1ZXMsIHsic29tZV92YWx1ZSI6ICIxIn0pCgogICAgZGVmIHRlc3RfbGFzdF9mbGlnaHRfcGxhbl9saW5lX3Bvc3RfcnVuX2FjdGlvbl9pc19leGVjdXRlZChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IGxhc3QgZmxpZ2h0IHBsYW4gbGluZSBwb3N0IHJ1biBhY3Rpb24gaXMgZXhlY3V0ZWQKICAgICAgICAiIiIKICAgICAgICAjIENyZWF0ZSBjb21tYW5kcwogICAgICAgIGNvbW1hbmRfZXJyb3IgPSBzZWxmLkNvbW1hbmQuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJDb21tYW5kIC0+IEVycm9yIiwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAicHl0aG9uX2NvZGUiLAogICAgICAgICAgICAgICAgImNvZGUiOiAicmVzdWx0ID0geydleGl0X2NvZGUnOiAtMTAwLCAnbWVzc2FnZSc6ICdFcnJvcid9IiwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBQbGFuIGFuZCBsaW5lcwogICAgICAgIHBsYW4gPSBzZWxmLlBsYW4uY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IHBvc3QgcnVuIGFjdGlvbiIsCiAgICAgICAgICAgICAgICAib25fZXJyb3JfYWN0aW9uIjogImUiLAogICAgICAgICAgICAgICAgImN1c3RvbV9leGl0X2NvZGUiOiAwLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICBsaW5lMSA9IHNlbGYucGxhbl9saW5lLmNyZWF0ZSgKICAgICAgICAgICAgeyJzZXF1ZW5jZSI6IDEwLCAicGxhbl9pZCI6IHBsYW4uaWQsICJjb21tYW5kX2lkIjogY29tbWFuZF9lcnJvci5pZH0KICAgICAgICApCiAgICAgICAgc2VsZi5wbGFuX2xpbmVfYWN0aW9uLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgImxpbmVfaWQiOiBsaW5lMS5pZCwKICAgICAgICAgICAgICAgICJzZXF1ZW5jZSI6IDEwLAogICAgICAgICAgICAgICAgImNvbmRpdGlvbiI6ICIhPSIsCiAgICAgICAgICAgICAgICAidmFsdWVfY2hhciI6ICIwIiwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAibiIsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgbGluZTIgPSBzZWxmLnBsYW5fbGluZS5jcmVhdGUoCiAgICAgICAgICAgIHsic2VxdWVuY2UiOiAyMCwgInBsYW5faWQiOiBwbGFuLmlkLCAiY29tbWFuZF9pZCI6IGNvbW1hbmRfZXJyb3IuaWR9CiAgICAgICAgKQogICAgICAgIHNlbGYucGxhbl9saW5lX2FjdGlvbi5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJsaW5lX2lkIjogbGluZTIuaWQsCiAgICAgICAgICAgICAgICAic2VxdWVuY2UiOiAxMCwKICAgICAgICAgICAgICAgICJjb25kaXRpb24iOiAiIT0iLAogICAgICAgICAgICAgICAgInZhbHVlX2NoYXIiOiAiMCIsCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogImVjIiwKICAgICAgICAgICAgICAgICJjdXN0b21fZXhpdF9jb2RlIjogMCwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgcGxhbl9sb2cgPSBzZWxmLnNlcnZlcl90ZXN0XzEucnVuX2ZsaWdodF9wbGFuKHBsYW4pCgogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHBsYW5fbG9nLmNvbW1hbmRfbG9nX2lkcyksIDIpCgogICAgICAgICMgRmluYWwgcGxhbiBzdGF0dXMgbXVzdCBiZSBjdXN0b20gZXhpdCBjb2RlIDAKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBsYW5fbG9nLnBsYW5fc3RhdHVzLCAwKQo= \ No newline at end of file