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