Files
odoo-addons/addons/cetmix_tower_server/tests/test_command.py

1 line
90 KiB
Python

IyBDb3B5cmlnaHQgKEMpIDIwMjIgQ2V0bWl4IE/DnAojIExpY2Vuc2UgQUdQTC0zLjAgb3IgbGF0ZXIgKGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsKS4KZnJvbSBkYXRldGltZSBpbXBvcnQgdGltZWRlbHRhCmZyb20gdW5pdHRlc3QubW9jayBpbXBvcnQgcGF0Y2gKCmZyb20gb2Rvby5leGNlcHRpb25zIGltcG9ydCBBY2Nlc3NFcnJvciwgVmFsaWRhdGlvbkVycm9yCmZyb20gb2Rvby5maWVsZHMgaW1wb3J0IERhdGV0aW1lCmZyb20gb2Rvby50ZXN0cy5jb21tb24gaW1wb3J0IEZvcm0KZnJvbSBvZG9vLnRvb2xzIGltcG9ydCBtdXRlX2xvZ2dlcgoKZnJvbSAuLm1vZGVscy5jb25zdGFudHMgaW1wb3J0ICgKICAgIEFOT1RIRVJfQ09NTUFORF9SVU5OSU5HLAogICAgQ09NTUFORF9USU1FRF9PVVQsCiAgICBDT01NQU5EX1RJTUVEX09VVF9NRVNTQUdFLAogICAgR0VORVJBTF9FUlJPUiwKKQpmcm9tIC5jb21tb24gaW1wb3J0IFRlc3RUb3dlckNvbW1vbgoKCmNsYXNzIFRlc3RUb3dlckNvbW1hbmQoVGVzdFRvd2VyQ29tbW9uKToKICAgICIiIgogICAgVGVzdCB0aGUgY29tbWFuZCBtb2RlbC4KCiAgICBJbXBvcnRhbnQhCiAgICBBcyB0aGlzIG1vZGVsIGluaGVyaXRzIGZyb20gdGhlIGBjeC50b3dlci50ZW1wbGF0ZS5taXhpbmAKICAgIHdlIHdpbGwgdGVzdHMgdGVtcGxhdGUgcmVuZGVyaW5nIG1ldGhvZHMgaW4gdGhpcyBjbGFzcyB0b28uCgogICAgIiIiCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgogICAgICAgIHN1cGVyKCkuc2V0VXBDbGFzcygpCgogICAgICAgICMgU2F2ZSB2YXJpYWJsZSB2YWx1ZXMgZm9yIFNlcnZlciAxCiAgICAgICAgd2l0aCBGb3JtKGNscy5zZXJ2ZXJfdGVzdF8xKSBhcyBmOgogICAgICAgICAgICB3aXRoIGYudmFyaWFibGVfdmFsdWVfaWRzLm5ldygpIGFzIGxpbmU6CiAgICAgICAgICAgICAgICBsaW5lLnZhcmlhYmxlX2lkID0gY2xzLnZhcmlhYmxlX2RpcgogICAgICAgICAgICAgICAgbGluZS52YWx1ZV9jaGFyID0gInRlc3Qtb2Rvby0xIgogICAgICAgICAgICB3aXRoIGYudmFyaWFibGVfdmFsdWVfaWRzLm5ldygpIGFzIGxpbmU6CiAgICAgICAgICAgICAgICBsaW5lLnZhcmlhYmxlX2lkID0gY2xzLnZhcmlhYmxlX3BhdGgKICAgICAgICAgICAgICAgIGxpbmUudmFsdWVfY2hhciA9ICIvb3B0L3Rvd2VyIgogICAgICAgICAgICBmLnNhdmUoKQoKICAgICAgICAjIFNlY3JldCBrZXkKICAgICAgICBjbHMuc2VjcmV0X2ZvbGRlcl9rZXkgPSBjbHMuS2V5LmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiRm9sZGVyIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiRk9MREVSIiwKICAgICAgICAgICAgICAgICJzZWNyZXRfdmFsdWUiOiAic2VjcmV0Rm9sZGVyIiwKICAgICAgICAgICAgICAgICJrZXlfdHlwZSI6ICJzIiwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICBjbHMuc2VjcmV0X3B5dGhvbl9rZXkgPSBjbHMuS2V5LmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAicHl0aG9uIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiUFlUSE9OIiwKICAgICAgICAgICAgICAgICJzZWNyZXRfdmFsdWUiOiAic2VjcmV0UHl0aG9uQ29kZSIsCiAgICAgICAgICAgICAgICAia2V5X3R5cGUiOiAicyIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgc2VjcmV0IHZhbHVlIGFzIG11bHRpIGxpbmUgc3RyaW5nCiAgICAgICAgY2xzLnB5dGhvbl9zc2hfa2V5ID0gY2xzLktleS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgUHl0aG9uIFNTSCBLZXkiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJ0ZXN0X3B5dGhvbl9zc2hfa2V5IiwKICAgICAgICAgICAgICAgICJrZXlfdHlwZSI6ICJzIiwKICAgICAgICAgICAgICAgICJzZWNyZXRfdmFsdWUiOiAiIiIKICAgICAgICAgICAgICAgIFB5dGhvbgogICAgICAgICAgICAgICAgbXVjaAogICAgICAgICAgICAgICAga2V5CiAgICAgICAgICAgICAgICAiIiIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgIGNscy5zZWNyZXRfdGVzdF9yc2Ffa2V5ID0gY2xzLktleS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogInRlc3QgcnNhIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAidGVzdF9yc2EiLAogICAgICAgICAgICAgICAgInNlY3JldF92YWx1ZSI6ICIiIi0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS0KVmVyeU11Y2hOaWNlS2V5Ci0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tICIiIiwKICAgICAgICAgICAgICAgICJrZXlfdHlwZSI6ICJzIiwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICAjIENvbW1hbmQKICAgICAgICBjbHMuY29tbWFuZF9jcmVhdGVfbmV3X2NvbW1hbmQgPSBjbHMuQ29tbWFuZC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIkNyZWF0ZSBuZXcgY29tbWFuZCIsCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogInB5dGhvbl9jb2RlIiwKICAgICAgICAgICAgICAgICJjb2RlIjogIiIiCnNlcnZlcl9uYW1lID0ge3sgdG93ZXIuc2VydmVyLm5hbWUgfX0KaWYgc2VydmVyX25hbWUgYW5kICMhY3h0b3dlci5zZWNyZXQuRk9MREVSISMgPT0gInNlY3JldEZvbGRlciI6CiAgICAjIFdlIGRvbid0IGFjdHVhbGx5IGNyZWF0ZSBhIG5ldyBjb21tYW5kIGJlY2F1c2UgaXQgd2lsbCByYWlzZQogICAgIyBhY2Nlc3MgZXJyb3IgaWYgdXNlciBkb2Vzbid0IGhhdmUgYWNjZXNzIHRvICdjcmVhdGUnIG9wZXJhdGlvbi4KICAgICMgSW5zdGVhZCB3ZSBqdXN0IHJldHVybiBhIGR1bW15IGNvbW1hbmQgcmVzdWx0LgogICAgY29tbWFuZCA9ICJuZXcgY29tbWFuZCIKICAgIHJlc3VsdCA9IHsiZXhpdF9jb2RlIjogMCwgIm1lc3NhZ2UiOiAiTmV3IGNvbW1hbmQgd2FzIGNyZWF0ZWQifQplbHNlOgogICAgcmVzdWx0ID0geyJleGl0X2NvZGUiOiAlcywgIm1lc3NhZ2UiOiAiZXJyb3IifQogICAgIiIiCiAgICAgICAgICAgICAgICAlIEdFTkVSQUxfRVJST1IsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgIGNscy5jb21tYW5kX3B5dGhvbl9jb21tYW5kXzEgPSBjbHMuQ29tbWFuZC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlB5dGhvbiBjb21tYW5kIHdpdGggc2VjcmV0ICMxIiwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAicHl0aG9uX2NvZGUiLAogICAgICAgICAgICAgICAgImNvZGUiOiAiIiIKcmVzdWx0ID0gewogICAgImV4aXRfY29kZSI6IDAsCiAgICAibWVzc2FnZSI6ICMhY3h0b3dlci5zZWNyZXQuUFlUSE9OISMsCn0KICAgICIiIiwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgY2xzLmNvbW1hbmRfcHl0aG9uX2NvbW1hbmRfMiA9IGNscy5Db21tYW5kLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiUHl0aG9uIGNvbW1hbmQgd2l0aCBzZWNyZXQgIzIiLAogICAgICAgICAgICAgICAgImFjdGlvbiI6ICJweXRob25fY29kZSIsCiAgICAgICAgICAgICAgICAiY29kZSI6ICIiIgpyZXN1bHQgPSB7CiAgICAiZXhpdF9jb2RlIjogMCwKICAgICJtZXNzYWdlIjogJ1dlIHVzZSAjIWN4dG93ZXIuc2VjcmV0LlBZVEhPTiEjJyAsCn0KICAgICIiIiwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgY2xzLmNvbW1hbmRfcHl0aG9uX2NvbW1hbmRfMyA9IGNscy5Db21tYW5kLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiUHl0aG9uIGNvbW1hbmQgd2l0aCBzZWNyZXQgIzMiLAogICAgICAgICAgICAgICAgImFjdGlvbiI6ICJweXRob25fY29kZSIsCiAgICAgICAgICAgICAgICAiY29kZSI6ICIiIgpyZXN1bHQgPSB7CiAgICAiZXhpdF9jb2RlIjogMCwKICAgICJtZXNzYWdlIjogIiIjIWN4dG93ZXIuc2VjcmV0LnRlc3RfcnNhISMiIiAsCn0KICAgICIiIiwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgY2xzLmNvbW1hbmRfcHl0aG9uX2NvbW1hbmRfNCA9IGNscy5Db21tYW5kLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiUHl0aG9uIGNvbW1hbmQgd2l0aCBzZWNyZXQgIzQiLAogICAgICAgICAgICAgICAgImFjdGlvbiI6ICJweXRob25fY29kZSIsCiAgICAgICAgICAgICAgICAiY29kZSI6ICIiIgp0b3Bfc2VjcmV0ID0gIyFjeHRvd2VyLnNlY3JldC50ZXN0X3B5dGhvbl9zc2hfa2V5ISMKcmVzdWx0ID0gewogICAgImV4aXRfY29kZSI6IDAsCiAgICAibWVzc2FnZSI6IHRvcF9zZWNyZXQgLAp9CiAgICAiIiIsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgY2xzLnNlcnZlciA9IGNscy5TZXJ2ZXIuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IFNlcnZlciIsCiAgICAgICAgICAgICAgICAidXNlcl9pZHMiOiBbKDYsIDAsIFtjbHMudXNlci5pZF0pXSwKICAgICAgICAgICAgICAgICJtYW5hZ2VyX2lkcyI6IFsoNiwgMCwgW2Nscy5tYW5hZ2VyLmlkXSldLAogICAgICAgICAgICAgICAgInNzaF91c2VybmFtZSI6ICJ0ZXN0IiwKICAgICAgICAgICAgICAgICJzc2hfcGFzc3dvcmQiOiAidGVzdCIsCiAgICAgICAgICAgICAgICAiaXBfdjRfYWRkcmVzcyI6ICIxMjcuMC4wLjEiLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgIGRlZiBfY3JlYXRlX2NvbW1hbmQoc2VsZiwgKiprd2FyZ3MpOgogICAgICAgICIiIkhlbHBlciB0byBjcmVhdGUgYSBjb21tYW5kIHJlY29yZCB3aXRoIGRlZmF1bHQgdmFsdWVzLiIiIgogICAgICAgIHZhbHMgPSB7CiAgICAgICAgICAgICJuYW1lIjogIlRlc3QgQ29tbWFuZCIsCiAgICAgICAgICAgICJhY2Nlc3NfbGV2ZWwiOiAiMSIsICAjIG92ZXJyaWRlIGRlZmF1bHQKICAgICAgICAgICAgInVzZXJfaWRzIjogWyg2LCAwLCBbXSldLAogICAgICAgICAgICAibWFuYWdlcl9pZHMiOiBbKDYsIDAsIFtdKV0sCiAgICAgICAgICAgICJzZXJ2ZXJfaWRzIjogWyg2LCAwLCBbXSldLAogICAgICAgIH0KICAgICAgICBpZiBrd2FyZ3M6CiAgICAgICAgICAgIHZhbHMudXBkYXRlKGt3YXJncykKICAgICAgICByZXR1cm4gc2VsZi5Db21tYW5kLmNyZWF0ZSh2YWxzKQoKICAgIGRlZiB0ZXN0X3VzZXJfcmVhZF9hY2Nlc3Moc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgRm9yIGEgdXNlcjoKICAgICAgICAgIFJlYWQgYWNjZXNzIGlzIGFsbG93ZWQgaWYgYWNjZXNzX2xldmVsID09ICIxIiBhbmQgZWl0aGVyIHRoZSBjb21tYW5kJ3MKICAgICAgICAgIG93biB1c2VyX2lkcyBpbmNsdWRlcyB0aGUgdXNlciBPUiBhIHJlbGF0ZWQgc2VydmVyICh2aWEgc2VydmVyX2lkcykKICAgICAgICAgIGluY2x1ZGVzIHRoZSB1c2VyIGluIGl0cyB1c2VyX2lkcy4KICAgICAgICAiIiIKICAgICAgICAjIENhc2UgMTogQ29tbWFuZCB3aXRoIGFjY2Vzc19sZXZlbCAiMSIgYW5kIHVzZXIgaW4gY29tbWFuZC51c2VyX2lkcy4KICAgICAgICBjbWQxID0gc2VsZi5fY3JlYXRlX2NvbW1hbmQoCiAgICAgICAgICAgICoqewogICAgICAgICAgICAgICAgImFjY2Vzc19sZXZlbCI6ICIxIiwKICAgICAgICAgICAgICAgICJ1c2VyX2lkcyI6IFsoNiwgMCwgW3NlbGYudXNlci5pZF0pXSwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICByZWNzMSA9IHNlbGYuQ29tbWFuZC53aXRoX3VzZXIoc2VsZi51c2VyKS5zZWFyY2goWygiaWQiLCAiPSIsIGNtZDEuaWQpXSkKICAgICAgICBzZWxmLmFzc2VydEluKAogICAgICAgICAgICBjbWQxLAogICAgICAgICAgICByZWNzMSwKICAgICAgICAgICAgIlVzZXIgc2hvdWxkIHNlZSB0aGUgY29tbWFuZCBpZiBpbiBjb21tYW5kLnVzZXJfaWRzIgogICAgICAgICAgICAiIGFuZCBhY2Nlc3NfbGV2ZWwgPT0gJzEnLiIsCiAgICAgICAgKQoKICAgICAgICAjIENhc2UgMjogQ29tbWFuZCB3aXRoIGFjY2Vzc19sZXZlbCAiMSIgYW5kIHVzZXIgbm90IGluIGNvbW1hbmQudXNlcl9pZHMKICAgICAgICAjIGJ1dCBpbiBhIHJlbGF0ZWQgc2VydmVyLgogICAgICAgIGNtZDIgPSBzZWxmLl9jcmVhdGVfY29tbWFuZCgKICAgICAgICAgICAgKip7CiAgICAgICAgICAgICAgICAiYWNjZXNzX2xldmVsIjogIjEiLAogICAgICAgICAgICAgICAgInVzZXJfaWRzIjogWyg2LCAwLCBbXSldLAogICAgICAgICAgICAgICAgInNlcnZlcl9pZHMiOiBbKDYsIDAsIFtzZWxmLnNlcnZlci5pZF0pXSwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICByZWNzMiA9IHNlbGYuQ29tbWFuZC53aXRoX3VzZXIoc2VsZi51c2VyKS5zZWFyY2goWygiaWQiLCAiPSIsIGNtZDIuaWQpXSkKICAgICAgICBzZWxmLmFzc2VydEluKAogICAgICAgICAgICBjbWQyLAogICAgICAgICAgICByZWNzMiwKICAgICAgICAgICAgIlVzZXIgc2hvdWxkIHNlZSB0aGUgY29tbWFuZCBpZiByZWxhdGVkIHNlcnZlci51c2VyX2lkcyBpbmNsdWRlcyB0aGUgdXNlci4iLAogICAgICAgICkKCiAgICAgICAgIyBOZWdhdGl2ZTogSWYgYWNjZXNzX2xldmVsIGlzICIxIiBidXQgbmVpdGhlciBjb21tYW5kLnVzZXJfaWRzCiAgICAgICAgIyBub3Igc2VydmVyX2lkcy51c2VyX2lkcyBpbmNsdWRlcyB0aGUgdXNlci4KICAgICAgICBjbWQzID0gc2VsZi5fY3JlYXRlX2NvbW1hbmQoCiAgICAgICAgICAgICoqewogICAgICAgICAgICAgICAgImFjY2Vzc19sZXZlbCI6ICIxIiwKICAgICAgICAgICAgICAgICJ1c2VyX2lkcyI6IFsoNiwgMCwgW10pXSwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWRzIjogWyg2LCAwLCBbXSldLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHJlY3MzID0gc2VsZi5Db21tYW5kLndpdGhfdXNlcihzZWxmLnVzZXIpLnNlYXJjaChbKCJpZCIsICI9IiwgY21kMy5pZCldKQogICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oCiAgICAgICAgICAgIGNtZDMsCiAgICAgICAgICAgIHJlY3MzLAogICAgICAgICAgICAiVXNlciBzaG91bGQgbm90IHNlZSB0aGUgY29tbWFuZCBpZiBub3QgZ3JhbnRlZCBhY2Nlc3MuIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfbWFuYWdlcl9yZWFkX2FjY2VzcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBGb3IgYSBtYW5hZ2VyOgogICAgICAgICAgQWxsb3dlZCB0byByZWFkIGEgY29tbWFuZCBpZiBhY2Nlc3NfbGV2ZWwgPD0gIjIiIEFORAogICAgICAgICAgKGVpdGhlciB0aGUgY29tbWFuZCBpdHNlbGYgZ3JhbnRzIGFjY2VzcyB2aWEgdXNlcl9pZHMgb3IgbWFuYWdlcl9pZHMKICAgICAgICAgICBPUiB0aGVyZSBhcmUgbm8gcmVsYXRlZCBzZXJ2ZXJzIE9SIGEgcmVsYXRlZCBzZXJ2ZXIgZ3JhbnRzIGFjY2VzcyB2aWEKICAgICAgICAgICAgaXRzIHVzZXJfaWRzIG9yIG1hbmFnZXJfaWRzKS4KICAgICAgICAiIiIKICAgICAgICAjIENhc2UgMTogQ29tbWFuZCB3aXRoIGFjY2Vzc19sZXZlbCAiMiIgYW5kIGNvbW1hbmQubWFuYWdlcl9pZHMKICAgICAgICAjICBpbmNsdWRlcyB0aGUgbWFuYWdlciBidXQgdGhlIHNlcnZlciBpcyBub3QgcmVsYXRlZCB0byB0aGUgY29tbWFuZC4KICAgICAgICBhbm90aGVyX3NlcnZlciA9IHNlbGYuU2VydmVyLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiQW5vdGhlciBTZXJ2ZXIiLAogICAgICAgICAgICAgICAgImlwX3Y0X2FkZHJlc3MiOiAiMTI3LjAuMC4yIiwKICAgICAgICAgICAgICAgICJzc2hfdXNlcm5hbWUiOiAidGVzdCIsCiAgICAgICAgICAgICAgICAic3NoX3Bhc3N3b3JkIjogInRlc3QiLAogICAgICAgICAgICAgICAgInVzZXJfaWRzIjogWyg2LCAwLCBbXSldLAogICAgICAgICAgICAgICAgIm1hbmFnZXJfaWRzIjogWyg2LCAwLCBbXSldLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIGNtZDEgPSBzZWxmLl9jcmVhdGVfY29tbWFuZCgKICAgICAgICAgICAgKip7CiAgICAgICAgICAgICAgICAiYWNjZXNzX2xldmVsIjogIjIiLAogICAgICAgICAgICAgICAgIm1hbmFnZXJfaWRzIjogWyg2LCAwLCBbc2VsZi5tYW5hZ2VyLmlkXSldLAogICAgICAgICAgICAgICAgInNlcnZlcl9pZHMiOiBbKDYsIDAsIFthbm90aGVyX3NlcnZlci5pZF0pXSwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICByZWNzMSA9IHNlbGYuQ29tbWFuZC53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS5zZWFyY2goWygiaWQiLCAiPSIsIGNtZDEuaWQpXSkKICAgICAgICBzZWxmLmFzc2VydEluKAogICAgICAgICAgICBjbWQxLAogICAgICAgICAgICByZWNzMSwKICAgICAgICAgICAgIk1hbmFnZXIgc2hvdWxkIHNlZSB0aGUgY29tbWFuZCBpZiBpbiBjb21tYW5kLm1hbmFnZXJfaWRzIgogICAgICAgICAgICAiIGFuZCBhY2Nlc3NfbGV2ZWwgPD0gJzInLiIsCiAgICAgICAgKQoKICAgICAgICAjIENhc2UgMjogQ29tbWFuZCB3aXRoIGFjY2Vzc19sZXZlbCAiMiIgdGhhdCBkb2VzIG5vdCBncmFudCBhY2Nlc3MKICAgICAgICAjICBvbiB0aGUgY29tbWFuZCBpdHNlbGYsIGJ1dCBhIHJlbGF0ZWQgc2VydmVyIGdyYW50cyBhY2Nlc3MgdmlhCiAgICAgICAgIyBidXQgYSByZWxhdGVkIHNlcnZlciBncmFudHMgYWNjZXNzIHZpYSBpdHMgbWFuYWdlcl9pZHMuCiAgICAgICAgY21kMiA9IHNlbGYuX2NyZWF0ZV9jb21tYW5kKAogICAgICAgICAgICAqKnsKICAgICAgICAgICAgICAgICJhY2Nlc3NfbGV2ZWwiOiAiMiIsCiAgICAgICAgICAgICAgICAidXNlcl9pZHMiOiBbKDYsIDAsIFtdKV0sCiAgICAgICAgICAgICAgICAibWFuYWdlcl9pZHMiOiBbKDYsIDAsIFtdKV0sCiAgICAgICAgICAgICAgICAic2VydmVyX2lkcyI6IFsoNiwgMCwgW3NlbGYuc2VydmVyLmlkXSldLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHJlY3MyID0gc2VsZi5Db21tYW5kLndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLnNlYXJjaChbKCJpZCIsICI9IiwgY21kMi5pZCldKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgIGNtZDIsCiAgICAgICAgICAgIHJlY3MyLAogICAgICAgICAgICAiTWFuYWdlciBzaG91bGQgc2VlIHRoZSBjb21tYW5kIGlmIHJlbGF0ZWQgc2VydmVyLm1hbmFnZXJfaWRzIgogICAgICAgICAgICAiIGluY2x1ZGVzIHRoZSBtYW5hZ2VyLiIsCiAgICAgICAgKQoKICAgICAgICAjIFBvc2l0aXZlOiBDb21tYW5kIHdpdGggYWNjZXNzX2xldmVsICIyIiB3aXRob3V0IGFueSBncmFudGVkIGFjY2Vzcy4KICAgICAgICBjbWQzID0gc2VsZi5fY3JlYXRlX2NvbW1hbmQoCiAgICAgICAgICAgICoqewogICAgICAgICAgICAgICAgImFjY2Vzc19sZXZlbCI6ICIyIiwKICAgICAgICAgICAgICAgICJ1c2VyX2lkcyI6IFsoNiwgMCwgW10pXSwKICAgICAgICAgICAgICAgICJtYW5hZ2VyX2lkcyI6IFsoNiwgMCwgW10pXSwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWRzIjogWyg2LCAwLCBbXSldLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHJlY3MzID0gc2VsZi5Db21tYW5kLndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLnNlYXJjaChbKCJpZCIsICI9IiwgY21kMy5pZCldKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgIGNtZDMsCiAgICAgICAgICAgIHJlY3MzLAogICAgICAgICAgICAiTWFuYWdlciBzaG91bGQgc2VlIHRoZSBjb21tYW5kIGlmIG5vdCBncmFudGVkIGFjY2VzcyAiCiAgICAgICAgICAgICJidXQgbm90IHJlbGF0ZWQgdG8gYW55IHNlcnZlci4iLAogICAgICAgICkKCiAgICAgICAgIyBDYXNlIDM6IFJlbW92ZSBmcm9tIG1hbmFnZXIgaW4gdGhlIGNtZDEuCiAgICAgICAgIyBTaG91bGQgbm90IHNlZSB0aGUgY29tbWFuZCBiZWNhdXNlIGl0IGJlbG9uZ3MgdG8gYW5vdGhlciBzZXJ2ZXIuCiAgICAgICAgY21kMS5tYW5hZ2VyX2lkcyA9IFsoMywgc2VsZi5tYW5hZ2VyLmlkKV0KICAgICAgICByZWNzNCA9IHNlbGYuQ29tbWFuZC53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS5zZWFyY2goWygiaWQiLCAiPSIsIGNtZDEuaWQpXSkKICAgICAgICBzZWxmLmFzc2VydE5vdEluKAogICAgICAgICAgICBjbWQxLAogICAgICAgICAgICByZWNzNCwKICAgICAgICAgICAgIk1hbmFnZXIgc2hvdWxkIG5vdCBzZWUgdGhlIGNvbW1hbmQgaWYgIgogICAgICAgICAgICAicmVtb3ZlZCBmcm9tIGNvbW1hbmQubWFuYWdlcl9pZHMuIgogICAgICAgICAgICAiIGFuZCBjb21tYW5kIGJlbG9uZ3MgdG8gYW5vdGhlciBzZXJ2ZXIuIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfbWFuYWdlcl93cml0ZV9jcmVhdGVfYWNjZXNzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEZvciBhIG1hbmFnZXI6CiAgICAgICAgICBBbGxvd2VkIHRvIHdyaXRlIGFuZCBjcmVhdGUgYSBjb21tYW5kIGlmIGFjY2Vzc19sZXZlbCA8PSAiMiIgQU5ECiAgICAgICAgICB0aGUgY29tbWFuZCdzIG93biBtYW5hZ2VyX2lkcyBpbmNsdWRlcyB0aGUgbWFuYWdlci4KICAgICAgICAiIiIKICAgICAgICAjIENhc2U6IENvbW1hbmQgd2l0aCBhY2Nlc3NfbGV2ZWwgIjIiIGFuZCBtYW5hZ2VyX2lkcyBpbmNsdWRlcyB0aGUgbWFuYWdlci4KICAgICAgICBjbWQxID0gc2VsZi5fY3JlYXRlX2NvbW1hbmQoCiAgICAgICAgICAgICoqewogICAgICAgICAgICAgICAgImFjY2Vzc19sZXZlbCI6ICIyIiwKICAgICAgICAgICAgICAgICJtYW5hZ2VyX2lkcyI6IFsoNiwgMCwgW3NlbGYubWFuYWdlci5pZF0pXSwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNtZDEud2l0aF91c2VyKHNlbGYubWFuYWdlcikud3JpdGUoeyJuYW1lIjogIk1hbmFnZXIgVXBkYXRlZCBDb21tYW5kIn0pCiAgICAgICAgZXhjZXB0IEFjY2Vzc0Vycm9yOgogICAgICAgICAgICBzZWxmLmZhaWwoCiAgICAgICAgICAgICAgICAiTWFuYWdlciBzaG91bGQgYmUgYWJsZSB0byB1cGRhdGUgdGhlIGNvbW1hbmQgIgogICAgICAgICAgICAgICAgImlmIGluIGNvbW1hbmQubWFuYWdlcl9pZHMuIgogICAgICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQxLndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLm5hbWUsICJNYW5hZ2VyIFVwZGF0ZWQgQ29tbWFuZCIpCgogICAgICAgICMgQXR0ZW1wdCB0byBjcmVhdGUgYSBjb21tYW5kIGFzIG1hbmFnZXIgd2l0aG91dCBpbmNsdWRpbmcgdGhlaXIgSUQKICAgICAgICAjICBpbiBtYW5hZ2VyX2lkcyBzaG91bGQgZmFpbC4KICAgICAgICBjbWRfaW52YWxpZF92YWxzID0gewogICAgICAgICAgICAibmFtZSI6ICJJbnZhbGlkIE1hbmFnZXIgQ3JlYXRlIiwKICAgICAgICAgICAgImFjY2Vzc19sZXZlbCI6ICIyIiwKICAgICAgICAgICAgIm1hbmFnZXJfaWRzIjogWyg2LCAwLCBbXSldLAogICAgICAgICAgICAiYWN0aW9uIjogInB5dGhvbl9jb2RlIiwKICAgICAgICAgICAgImNvZGUiOiAicHJpbnQoJ2R1bW15JykiLAogICAgICAgIH0KICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEFjY2Vzc0Vycm9yKToKICAgICAgICAgICAgc2VsZi5Db21tYW5kLndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLmNyZWF0ZShjbWRfaW52YWxpZF92YWxzKQoKICAgIGRlZiB0ZXN0X21hbmFnZXJfdW5saW5rX2FjY2VzcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBGb3IgYSBtYW5hZ2VyOgogICAgICAgICAgQWxsb3dlZCB0byBkZWxldGUgYSBjb21tYW5kIGlmIGFjY2Vzc19sZXZlbCA8PSAiMiIsCiAgICAgICAgICB0aGUgY3VycmVudCB1c2VyIGlzIHRoZSByZWNvcmQgY3JlYXRvciwKICAgICAgICAgIEFORCB0aGUgY29tbWFuZCdzIG93biBtYW5hZ2VyX2lkcyBpbmNsdWRlcyB0aGUgbWFuYWdlci4KICAgICAgICAiIiIKICAgICAgICAjIFNjZW5hcmlvIDE6IENvbW1hbmQgY3JlYXRlZCBieSB0aGUgbWFuYWdlciB3aXRoIG1hbmFnZXJfaWRzCiAgICAgICAgIyBpbmNsdWRpbmcgdGhlIG1hbmFnZXIuCiAgICAgICAgY21kMSA9IHNlbGYuQ29tbWFuZC53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIk1hbmFnZXIgQ3JlYXRlZCBDb21tYW5kIiwKICAgICAgICAgICAgICAgICJhY2Nlc3NfbGV2ZWwiOiAiMiIsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjbWQxLnVubGluaygpCiAgICAgICAgZXhjZXB0IEFjY2Vzc0Vycm9yOgogICAgICAgICAgICBzZWxmLmZhaWwoCiAgICAgICAgICAgICAgICAiTWFuYWdlciBzaG91bGQgYmUgYWJsZSB0byBkZWxldGUgYSBjb21tYW5kICIKICAgICAgICAgICAgICAgICJ0aGV5IGNyZWF0ZWQgaWYgaW4gY29tbWFuZC5tYW5hZ2VyX2lkcy4iCiAgICAgICAgICAgICkKCiAgICAgICAgIyBTY2VuYXJpbyAyOiBDb21tYW5kIGNyZWF0ZWQgYnkgc29tZW9uZSBlbHNlCiAgICAgICAgIyBldmVuIGlmIG1hbmFnZXJfaWRzIGluY2x1ZGVzIHRoZSBtYW5hZ2VyLgogICAgICAgIGNtZDIgPSBzZWxmLl9jcmVhdGVfY29tbWFuZCgKICAgICAgICAgICAgKip7CiAgICAgICAgICAgICAgICAiYWNjZXNzX2xldmVsIjogIjIiLAogICAgICAgICAgICAgICAgIm1hbmFnZXJfaWRzIjogWyg2LCAwLCBbc2VsZi5tYW5hZ2VyLmlkXSldLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQWNjZXNzRXJyb3IpOgogICAgICAgICAgICBjbWQyLndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLnVubGluaygpCgogICAgZGVmIHRlc3Rfcm9vdF91bnJlc3RyaWN0ZWRfYWNjZXNzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEZvciBhIHJvb3QgdXNlcjoKICAgICAgICAgIFVubGltaXRlZCBhY2Nlc3M6IHJvb3QgY2FuIHJlYWQsIHdyaXRlLCBjcmVhdGUsIGFuZCBkZWxldGUgY29tbWFuZHMKICAgICAgICAgIHJlZ2FyZGxlc3Mgb2YgYWNjZXNzX2xldmVsIG9yIHJlbGF0ZWQgc2VydmVycy4KICAgICAgICAiIiIKICAgICAgICBjbWQgPSBzZWxmLl9jcmVhdGVfY29tbWFuZCgKICAgICAgICAgICAgKip7CiAgICAgICAgICAgICAgICAiYWNjZXNzX2xldmVsIjogIjMiLCAgIyBhYm92ZSB0aGUgdGhyZXNob2xkIGZvciBtYW5hZ2VycwogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHJlY3MgPSBzZWxmLkNvbW1hbmQud2l0aF91c2VyKHNlbGYucm9vdCkuc2VhcmNoKFsoImlkIiwgIj0iLCBjbWQuaWQpXSkKICAgICAgICBzZWxmLmFzc2VydEluKAogICAgICAgICAgICBjbWQsCiAgICAgICAgICAgIHJlY3MsCiAgICAgICAgICAgICJSb290IHNob3VsZCBzZWUgdGhlIGNvbW1hbmQgcmVnYXJkbGVzcyBvZiByZXN0cmljdGlvbnMuIiwKICAgICAgICApCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjbWQud2l0aF91c2VyKHNlbGYucm9vdCkud3JpdGUoeyJuYW1lIjogIlJvb3QgVXBkYXRlZCBDb21tYW5kIn0pCiAgICAgICAgZXhjZXB0IEFjY2Vzc0Vycm9yOgogICAgICAgICAgICBzZWxmLmZhaWwoCiAgICAgICAgICAgICAgICAiUm9vdCBzaG91bGQgYmUgYWJsZSB0byB1cGRhdGUgdGhlIGNvbW1hbmQgIiAid2l0aG91dCByZXN0cmljdGlvbnMuIgogICAgICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQud2l0aF91c2VyKHNlbGYucm9vdCkubmFtZSwgIlJvb3QgVXBkYXRlZCBDb21tYW5kIikKICAgICAgICBjbWQyID0gc2VsZi5Db21tYW5kLndpdGhfdXNlcihzZWxmLnJvb3QpLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiUm9vdCBDcmVhdGVkIENvbW1hbmQiLAogICAgICAgICAgICAgICAgImFjY2Vzc19sZXZlbCI6ICIzIiwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAicHl0aG9uX2NvZGUiLAogICAgICAgICAgICAgICAgImNvZGUiOiAicHJpbnQoJ3Jvb3QnKSIsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAogICAgICAgICAgICBjbWQyLAogICAgICAgICAgICAiUm9vdCBzaG91bGQgYmUgYWJsZSB0byBjcmVhdGUgYSBjb21tYW5kICIgIndpdGhvdXQgcmVzdHJpY3Rpb25zLiIsCiAgICAgICAgKQogICAgICAgIGNtZDIud2l0aF91c2VyKHNlbGYucm9vdCkudW5saW5rKCkKICAgICAgICByZWNzX2FmdGVyID0gc2VsZi5Db21tYW5kLndpdGhfdXNlcihzZWxmLnJvb3QpLnNlYXJjaChbKCJpZCIsICI9IiwgY21kMi5pZCldKQogICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoCiAgICAgICAgICAgIHJlY3NfYWZ0ZXIsCiAgICAgICAgICAgICJSb290IHNob3VsZCBiZSBhYmxlIHRvIGRlbGV0ZSB0aGUgY29tbWFuZCB3aXRob3V0IHJlc3RyaWN0aW9ucy4iLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9zc2hfY29tbWFuZF9wcmVwYXJlX21ldGhvZF93aXRob3V0X3BhdGgoc2VsZik6CiAgICAgICAgIiIiVGVzdCBzc2ggY29tbWFuZCBwcmVwYXJhdGlvbiBpbiBkaWZmZXJlbnQgbW9kZXMgd2l0aG91dCBwYXRoIiIiCgogICAgICAgIHNlcnZlciA9IHNlbGYuc2VydmVyX3Rlc3RfMQoKICAgICAgICBzaW5nbGVfY29tbWFuZCA9ICJscyAtYSAvdG1wIgogICAgICAgIG11bHRpcGxlX2NvbW1hbmRzID0gImxzIC1hIC90bXAgJiYgbWtkaXIgL3RtcC90ZXN0IgoKICAgICAgICBzdWRvX21vZGUgPSAicCIKCiAgICAgICAgIyBQcmVwYXJlIHNpbmdsZSBjb21tYW5kIGZvciBzdWRvIHdpdGggcGFzc3dvcmQKICAgICAgICBjbWQgPSBzZXJ2ZXIuX3ByZXBhcmVfc3NoX2NvbW1hbmQoc2luZ2xlX2NvbW1hbmQsIHBhdGg9Tm9uZSwgc3Vkbz1zdWRvX21vZGUpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgY21kLAogICAgICAgICAgICBbZiJ7c2VsZi5zdWRvX3ByZWZpeH0ge3NpbmdsZV9jb21tYW5kfSJdLAogICAgICAgICAgICBtc2c9KAogICAgICAgICAgICAgICAgIlNpbmdsZSBjb21tYW5kIGZvciBzdWRvIHdpdGggcGFzc3dvcmQgc2hvdWxkIGJlICIKICAgICAgICAgICAgICAgICJlcXVhbCB0byBsaXN0IHdpdGggdGhlIG9yaWdpbmFsIGNvbW1hbmQiCiAgICAgICAgICAgICAgICAiYXMgYW4gb25seSBlbGVtZW50IgogICAgICAgICAgICApLAogICAgICAgICkKCiAgICAgICAgIyBQcmVwYXJlIG11bHRpcGxlIGNvbW1hbmRzIGZvciBzdWRvIHdpdGggcGFzc3dvcmQKICAgICAgICBjbWQgPSBzZXJ2ZXIuX3ByZXBhcmVfc3NoX2NvbW1hbmQobXVsdGlwbGVfY29tbWFuZHMsIHBhdGg9Tm9uZSwgc3Vkbz1zdWRvX21vZGUpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgY21kLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICBmIntzZWxmLnN1ZG9fcHJlZml4fSBscyAtYSAvdG1wIiwKICAgICAgICAgICAgICAgIGYie3NlbGYuc3Vkb19wcmVmaXh9IG1rZGlyIC90bXAvdGVzdCIsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIG1zZz0oCiAgICAgICAgICAgICAgICAiTXVsdGlwbGUgY29tbWFuZHMgd2l0aCBzdWRvIHdpdGggcGFzc3dvcmQgc2hvdWxkIGJlICIKICAgICAgICAgICAgICAgICJhIGxpc3Qgb2Ygc2VwYXJhdGVkIGNvbW1hbmRzIGZyb20gb3JpZ2luYWwgbGluZSIKICAgICAgICAgICAgKSwKICAgICAgICApCgogICAgICAgIHN1ZG9fbW9kZSA9ICJuIgoKICAgICAgICAjIFByZXBhcmUgc2luZ2xlIGNvbW1hbmQgZm9yIHN1ZG8gd2l0aG91dCBwYXNzd29yZAogICAgICAgIGNtZCA9IHNlcnZlci5fcHJlcGFyZV9zc2hfY29tbWFuZChzaW5nbGVfY29tbWFuZCwgcGF0aD1Ob25lLCBzdWRvPXN1ZG9fbW9kZSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBjbWQsCiAgICAgICAgICAgIGYie3NlbGYuc3Vkb19wcmVmaXh9IHtzaW5nbGVfY29tbWFuZH0iLAogICAgICAgICAgICBtc2c9KAogICAgICAgICAgICAgICAgIlNpbmdsZSBjb21tYW5kIHdpdGggc3VkbyB3aXRob3V0IHBhc3N3b3JkIHNob3VsZCBiZSAiCiAgICAgICAgICAgICAgICBmJ2VxdWFsIHRvIHRoZSBvcmlnaW5hbCBjb21tYW5kIHByZWZpeGVkIHdpdGggIntzZWxmLnN1ZG9fcHJlZml4fSInCiAgICAgICAgICAgICksCiAgICAgICAgKQoKICAgICAgICAjIFByZXBhcmUgbXVsdGlwbGUgY29tbWFuZHMgZm9yIHN1ZG8gd2l0aG91dCBwYXNzd29yZAogICAgICAgIGNtZCA9IHNlcnZlci5fcHJlcGFyZV9zc2hfY29tbWFuZChtdWx0aXBsZV9jb21tYW5kcywgcGF0aD1Ob25lLCBzdWRvPXN1ZG9fbW9kZSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBjbWQsCiAgICAgICAgICAgIGYie3NlbGYuc3Vkb19wcmVmaXh9IGxzIC1hIC90bXAgJiYge3NlbGYuc3Vkb19wcmVmaXh9IG1rZGlyIC90bXAvdGVzdCIsCiAgICAgICAgICAgIG1zZz0oCiAgICAgICAgICAgICAgICAiTXVsdGlwbGUgY29tbWFuZHMgd2l0aCBzdWRvIHdpdGggcGFzc3dvcmQgc2hvdWxkIGJlICIKICAgICAgICAgICAgICAgICJhIHJlLWpvaW5lZCBzdHJpbmcgZnJvbSBsaXN0IG9mIHNlcGFyYXRlZCBvcmlnaW5hbCAiCiAgICAgICAgICAgICAgICBmJ2VhY2ggcHJlZml4ZWQgd2l0aCAie3NlbGYuc3Vkb19wcmVmaXh9IicKICAgICAgICAgICAgKSwKICAgICAgICApCgogICAgICAgICMgUHJlcGFyZSBzaW5nbGUgY29tbWFuZCB3aXRob3V0IHN1ZG8KICAgICAgICBjbWQgPSBzZXJ2ZXIuX3ByZXBhcmVfc3NoX2NvbW1hbmQoc2luZ2xlX2NvbW1hbmQpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgY21kLAogICAgICAgICAgICBzaW5nbGVfY29tbWFuZCwKICAgICAgICAgICAgbXNnPSgKICAgICAgICAgICAgICAgICJTaW5nbGUgY29tbWFuZCB3aXRob3V0IHN1ZG8gc2hvdWxkIGJlICIKICAgICAgICAgICAgICAgICJlcXVhbCB0byB0aGUgb3JpZ2luYWwgY29tbWFuZCAiCiAgICAgICAgICAgICksCiAgICAgICAgKQoKICAgICAgICAjIFByZXBhcmUgbXVsdGlwbGUgd2l0aG91dCBzdWRvCiAgICAgICAgY21kID0gc2VydmVyLl9wcmVwYXJlX3NzaF9jb21tYW5kKG11bHRpcGxlX2NvbW1hbmRzKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGNtZCwKICAgICAgICAgICAgbXVsdGlwbGVfY29tbWFuZHMsCiAgICAgICAgICAgIG1zZz0oCiAgICAgICAgICAgICAgICAiTXVsdGlwbGUgY29tbWFuZHMgd2l0aG91dCBzdWRvIHNob3VsZCBiZSAiCiAgICAgICAgICAgICAgICAiZXF1YWwgdG8gdGhlIG9yaWdpbmFsIGxpbmUgb2YgY29tbWFuZHMiCiAgICAgICAgICAgICksCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3NzaF9jb21tYW5kX3ByZXBhcmVfbWV0aG9kX3dpdGhfcGF0aChzZWxmKToKICAgICAgICAiIiJUZXN0IGNvbW1hbmQgcHJlcGFyYXRpb24gaW4gZGlmZmVyZW50IG1vZGVzIHdpdGhvdXQgcGF0aCIiIgoKICAgICAgICBzZXJ2ZXIgPSBzZWxmLnNlcnZlcl90ZXN0XzEKCiAgICAgICAgc2luZ2xlX2NvbW1hbmQgPSAibHMgLWEgL3RtcCIKICAgICAgICBtdWx0aXBsZV9jb21tYW5kcyA9ICJscyAtYSAvdG1wICYmIG1rZGlyIC90bXAvdGVzdCIKICAgICAgICBwYXRoID0gIi9ob21lL2RvZ2UiCgogICAgICAgIHN1ZG9fbW9kZSA9ICJwIgoKICAgICAgICAjIFByZXBhcmUgc2luZ2xlIGNvbW1hbmQgZm9yIHN1ZG8gd2l0aCBwYXNzd29yZAogICAgICAgIGNtZCA9IHNlcnZlci5fcHJlcGFyZV9zc2hfY29tbWFuZChzaW5nbGVfY29tbWFuZCwgcGF0aD1wYXRoLCBzdWRvPXN1ZG9fbW9kZSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBjbWQsCiAgICAgICAgICAgIFtmImNkIHtwYXRofSIsIGYie3NlbGYuc3Vkb19wcmVmaXh9IHtzaW5nbGVfY29tbWFuZH0iXSwKICAgICAgICAgICAgbXNnPSgKICAgICAgICAgICAgICAgICJTaW5nbGUgY29tbWFuZCBmb3Igc3VkbyB3aXRoIHBhc3N3b3JkIHNob3VsZCBiZSAiCiAgICAgICAgICAgICAgICAiZXF1YWwgdG8gbGlzdCBvZiB0d28gZWxlbWVudHM6IgogICAgICAgICAgICAgICAgIiBjaGFuZ2UgZGlyZWN0b3J5IGFuZCBvcmlnaW5hbCBjb21tYW5kIgogICAgICAgICAgICApLAogICAgICAgICkKCiAgICAgICAgIyBQcmVwYXJlIG11bHRpcGxlIGNvbW1hbmRzIGZvciBzdWRvIHdpdGggcGFzc3dvcmQKICAgICAgICBjbWQgPSBzZXJ2ZXIuX3ByZXBhcmVfc3NoX2NvbW1hbmQobXVsdGlwbGVfY29tbWFuZHMsIHBhdGg9cGF0aCwgc3Vkbz1zdWRvX21vZGUpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgY21kLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICBmImNkIHtwYXRofSIsCiAgICAgICAgICAgICAgICBmIntzZWxmLnN1ZG9fcHJlZml4fSBscyAtYSAvdG1wIiwKICAgICAgICAgICAgICAgIGYie3NlbGYuc3Vkb19wcmVmaXh9IG1rZGlyIC90bXAvdGVzdCIsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIG1zZz0oCiAgICAgICAgICAgICAgICAiTXVsdGlwbGUgY29tbWFuZHMgd2l0aCBzdWRvIHdpdGggcGFzc3dvcmQgc2hvdWxkIGJlICIKICAgICAgICAgICAgICAgICJhIGxpc3Qgb2Ygc2VwYXJhdGVkIGNvbW1hbmRzIGZyb20gb3JpZ2luYWwgbGluZSIKICAgICAgICAgICAgKSwKICAgICAgICApCgogICAgICAgIHN1ZG9fbW9kZSA9ICJuIgoKICAgICAgICAjIFByZXBhcmUgc2luZ2xlIGNvbW1hbmQgZm9yIHN1ZG8gd2l0aG91dCBwYXNzd29yZAogICAgICAgIGNtZCA9IHNlcnZlci5fcHJlcGFyZV9zc2hfY29tbWFuZChzaW5nbGVfY29tbWFuZCwgcGF0aD1wYXRoLCBzdWRvPXN1ZG9fbW9kZSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBjbWQsCiAgICAgICAgICAgIGYiY2Qge3BhdGh9ICYmIHtzZWxmLnN1ZG9fcHJlZml4fSB7c2luZ2xlX2NvbW1hbmR9IiwKICAgICAgICAgICAgbXNnPSgKICAgICAgICAgICAgICAgICJTaW5nbGUgY29tbWFuZCB3aXRoIHN1ZG8gd2l0aG91dCBwYXNzd29yZCBzaG91bGQgYmUgIgogICAgICAgICAgICAgICAgZidlcXVhbCB0byB0aGUgb3JpZ2luYWwgY29tbWFuZCBwcmVmaXhlZCB3aXRoICJ7c2VsZi5zdWRvX3ByZWZpeH0iJwogICAgICAgICAgICApLAogICAgICAgICkKCiAgICAgICAgIyBQcmVwYXJlIG11bHRpcGxlIGNvbW1hbmRzIGZvciBzdWRvIHdpdGhvdXQgcGFzc3dvcmQKICAgICAgICBjbWQgPSBzZXJ2ZXIuX3ByZXBhcmVfc3NoX2NvbW1hbmQobXVsdGlwbGVfY29tbWFuZHMsIHBhdGg9cGF0aCwgc3Vkbz1zdWRvX21vZGUpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgY21kLAogICAgICAgICAgICBmImNkIHtwYXRofSAmJiB7c2VsZi5zdWRvX3ByZWZpeH0gbHMgLWEgL3RtcCAmJiB7c2VsZi5zdWRvX3ByZWZpeH0gbWtkaXIgL3RtcC90ZXN0IiwgICMgbm9xYQogICAgICAgICAgICBtc2c9KAogICAgICAgICAgICAgICAgIk11bHRpcGxlIGNvbW1hbmRzIHdpdGggc3VkbyB3aXRoIHBhc3N3b3JkIHNob3VsZCBiZSAiCiAgICAgICAgICAgICAgICAiYSByZS1qb2luZWQgc3RyaW5nIGZyb20gbGlzdCBvZiBzZXBhcmF0ZWQgb3JpZ2luYWwgIgogICAgICAgICAgICAgICAgZidlYWNoIHByZWZpeGVkIHdpdGggIntzZWxmLnN1ZG9fcHJlZml4fSInCiAgICAgICAgICAgICksCiAgICAgICAgKQoKICAgICAgICAjIFByZXBhcmUgc2luZ2xlIGNvbW1hbmQgd2l0aG91dCBzdWRvCiAgICAgICAgY21kID0gc2VydmVyLl9wcmVwYXJlX3NzaF9jb21tYW5kKHNpbmdsZV9jb21tYW5kLCBwYXRoPXBhdGgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgY21kLAogICAgICAgICAgICBmImNkIHtwYXRofSAmJiB7c2luZ2xlX2NvbW1hbmR9IiwKICAgICAgICAgICAgbXNnPSgKICAgICAgICAgICAgICAgICJTaW5nbGUgY29tbWFuZCBmb3Igd2l0aG91dCBzdWRvIHNob3VsZCBiZSAiCiAgICAgICAgICAgICAgICAiZXF1YWwgdG8gdGhlIHRoZSBvcmlnaW5hbCBjb21tYW5kIgogICAgICAgICAgICAgICAgIndpdGggJ2NkIHt7IHBhdGggfX0gJiYgJyBwcmVmaXgiCiAgICAgICAgICAgICksCiAgICAgICAgKQoKICAgICAgICAjIFByZXBhcmUgbXVsdGlwbGUgY29tbWFuZHMgd2l0aG91dCBzdWRvCiAgICAgICAgY21kID0gc2VydmVyLl9wcmVwYXJlX3NzaF9jb21tYW5kKG11bHRpcGxlX2NvbW1hbmRzLCBwYXRoPXBhdGgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgY21kLAogICAgICAgICAgICBmImNkIHtwYXRofSAmJiB7bXVsdGlwbGVfY29tbWFuZHN9IiwgICMgbm9xYQogICAgICAgICAgICBtc2c9KAogICAgICAgICAgICAgICAgIk11bHRpcGxlIGNvbW1hbmRzIHdpdGhvdXQgc3VkbyBzaG91bGQgYmUgIgogICAgICAgICAgICAgICAgIm9yaWdpbmFsIGNvbW1hbmQgd2l0aCAnY2hhbmdlIGRpcmVjdG9yeScgY29tbWFuZCBwcmVwZW5kZWQiCiAgICAgICAgICAgICksCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3NzaF9jb21tYW5kX25vX3NwbGl0X2Zvcl9zdWRvX3dpdGhvdXRfcGF0aChzZWxmKToKICAgICAgICAiIiJJZiBub19zcGxpdF9mb3Jfc3Vkbz1UcnVlLCBldmVuICcmJicgc2hvdWxkbuKAmXQgc3BsaXQgaW50byBhIGxpc3QuIiIiCiAgICAgICAgc2VydmVyID0gc2VsZi5zZXJ2ZXJfdGVzdF8xCiAgICAgICAgY21kX2xpbmUgPSAiZWNobyBhICYmIGVjaG8gYiIKICAgICAgICBzdWRvX21vZGUgPSAicCIKICAgICAgICByZXN1bHQgPSBzZXJ2ZXIuX3ByZXBhcmVfc3NoX2NvbW1hbmQoCiAgICAgICAgICAgIGNtZF9saW5lLCBzdWRvPXN1ZG9fbW9kZSwgbm9fc3BsaXRfZm9yX3N1ZG89VHJ1ZQogICAgICAgICkKICAgICAgICBleHBlY3RlZCA9IFtmIntzZWxmLnN1ZG9fcHJlZml4fSB7Y21kX2xpbmV9Il0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICByZXN1bHQsIGV4cGVjdGVkLCAiV2l0aCBub19zcGxpdF9mb3Jfc3VkbywgJyYmJyBtdXN0IG5vdCBwcm9kdWNlIGEgbGlzdCIKICAgICAgICApCgogICAgZGVmIHRlc3Rfc3NoX2NvbW1hbmRfbm9fc3BsaXRfZm9yX3N1ZG9fd2l0aF9wYXRoKHNlbGYpOgogICAgICAgICIiIlNhbWUsIGJ1dCB3aXRoIGEgY3VzdG9tIGN3ZCBwcmVmaXguIiIiCiAgICAgICAgc2VydmVyID0gc2VsZi5zZXJ2ZXJfdGVzdF8xCiAgICAgICAgY21kX2xpbmUgPSAiZWNobyBhICYmIGVjaG8gYiIKICAgICAgICBwYXRoID0gIi90bXAiCiAgICAgICAgc3Vkb19tb2RlID0gInAiCiAgICAgICAgcmVzdWx0ID0gc2VydmVyLl9wcmVwYXJlX3NzaF9jb21tYW5kKAogICAgICAgICAgICBjbWRfbGluZSwgcGF0aD1wYXRoLCBzdWRvPXN1ZG9fbW9kZSwgbm9fc3BsaXRfZm9yX3N1ZG89VHJ1ZQogICAgICAgICkKICAgICAgICBleHBlY3RlZCA9IFtmImNkIHtwYXRofSIsIGYie3NlbGYuc3Vkb19wcmVmaXh9IHtjbWRfbGluZX0iXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHJlc3VsdCwKICAgICAgICAgICAgZXhwZWN0ZWQsCiAgICAgICAgICAgICJXaXRoIG5vX3NwbGl0X2Zvcl9zdWRvIGFuZCBwYXRoLCB0aGUgZW50aXJlICcmJicgc3RyaW5nIHJlbWFpbnMgdW4tc3BsaXQiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9zZXJ2ZXJfcmVuZGVyX2NvbW1hbmQoc2VsZik6CiAgICAgICAgIiIiVGVzdCByZW5kZXJpbmcgY29tbWFuZCB1c2luZyBgX3JlbmRlcl9jb21tYW5kYCBtZXRob2QKICAgICAgICBvZiBjeC50b3dlci5zZXJ2ZXIKICAgICAgICAiIiIKCiAgICAgICAgIyAtLSAxIC0tCiAgICAgICAgIyBUZXN0IHdpdGggZGVmYXVsdCBwYXRoCiAgICAgICAgcmVuZGVyZWRfY29tbWFuZCA9IHNlbGYuc2VydmVyX3Rlc3RfMS5fcmVuZGVyX2NvbW1hbmQoc2VsZi5jb21tYW5kX2NyZWF0ZV9kaXIpCiAgICAgICAgcmVuZGVyZWRfY29kZV9leHBlY3RlZCA9ICJjZCAvb3B0L3Rvd2VyICYmIG1rZGlyIHRlc3Qtb2Rvby0xIgogICAgICAgIHJlbmRlcmVkX3BhdGhfZXhwZWN0ZWQgPSBmIi9ob21lL3tzZWxmLnNlcnZlcl90ZXN0XzEuc3NoX3VzZXJuYW1lfSIKCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgcmVuZGVyZWRfY29tbWFuZFsicmVuZGVyZWRfY29kZSJdLAogICAgICAgICAgICByZW5kZXJlZF9jb2RlX2V4cGVjdGVkLAogICAgICAgICAgICAiUmVuZGVyZWQgY29kZSBkb2Vzbid0IG1hdGNoIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgcmVuZGVyZWRfY29tbWFuZFsicmVuZGVyZWRfcGF0aCJdLAogICAgICAgICAgICByZW5kZXJlZF9wYXRoX2V4cGVjdGVkLAogICAgICAgICAgICAiUmVuZGVyZWQgcGF0aCBkb2Vzbid0IG1hdGNoIiwKICAgICAgICApCgogICAgICAgICMgLS0gMiAtLQogICAgICAgICMgVGVzdCB3aXRoIGN1c3RvbSBwYXRoCiAgICAgICAgcmVuZGVyZWRfY29tbWFuZCA9IHNlbGYuc2VydmVyX3Rlc3RfMS5fcmVuZGVyX2NvbW1hbmQoCiAgICAgICAgICAgIHNlbGYuY29tbWFuZF9jcmVhdGVfZGlyLCBwYXRoPSIvc3VjaC9tdWNoL3BhdGgiCiAgICAgICAgKQogICAgICAgIHJlbmRlcmVkX2NvZGVfZXhwZWN0ZWQgPSAiY2QgL29wdC90b3dlciAmJiBta2RpciB0ZXN0LW9kb28tMSIKICAgICAgICByZW5kZXJlZF9wYXRoX2V4cGVjdGVkID0gIi9zdWNoL211Y2gvcGF0aCIKCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgcmVuZGVyZWRfY29tbWFuZFsicmVuZGVyZWRfY29kZSJdLAogICAgICAgICAgICByZW5kZXJlZF9jb2RlX2V4cGVjdGVkLAogICAgICAgICAgICAiUmVuZGVyZWQgY29kZSBkb2Vzbid0IG1hdGNoIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgcmVuZGVyZWRfY29tbWFuZFsicmVuZGVyZWRfcGF0aCJdLAogICAgICAgICAgICByZW5kZXJlZF9wYXRoX2V4cGVjdGVkLAogICAgICAgICAgICAiUmVuZGVyZWQgcGF0aCBkb2Vzbid0IG1hdGNoIiwKICAgICAgICApCgogICAgICAgICMgLS0gMyAtLQogICAgICAgICMgU2V0IHZhcmlhYmxlX3BhdGggdG8gTm9uZSBhbmQgY2hlY2sgYWdhaW4KICAgICAgICB2YXJpYWJsZV92YWx1ZV9wYXRoID0gc2VsZi5zZXJ2ZXJfdGVzdF8xLnZhcmlhYmxlX3ZhbHVlX2lkcy5maWx0ZXJlZCgKICAgICAgICAgICAgbGFtYmRhIHZhcl92YWw6IHZhcl92YWwudmFyaWFibGVfaWQuaWQgPT0gc2VsZi52YXJpYWJsZV9wYXRoLmlkCiAgICAgICAgKQogICAgICAgIHZhcmlhYmxlX3ZhbHVlX3BhdGgudmFsdWVfY2hhciA9IE5vbmUKICAgICAgICByZW5kZXJlZF9jb21tYW5kID0gc2VsZi5zZXJ2ZXJfdGVzdF8xLl9yZW5kZXJfY29tbWFuZChzZWxmLmNvbW1hbmRfY3JlYXRlX2RpcikKICAgICAgICByZW5kZXJlZF9jb2RlX2V4cGVjdGVkID0gImNkIEZhbHNlICYmIG1rZGlyIHRlc3Qtb2Rvby0xIgogICAgICAgIHJlbmRlcmVkX3BhdGhfZXhwZWN0ZWQgPSBmIi9ob21lL3tzZWxmLnNlcnZlcl90ZXN0XzEuc3NoX3VzZXJuYW1lfSIKCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgcmVuZGVyZWRfY29tbWFuZFsicmVuZGVyZWRfY29kZSJdLAogICAgICAgICAgICByZW5kZXJlZF9jb2RlX2V4cGVjdGVkLAogICAgICAgICAgICAiUmVuZGVyZWQgY29kZSBkb2Vzbid0IG1hdGNoIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgcmVuZGVyZWRfY29tbWFuZFsicmVuZGVyZWRfcGF0aCJdLAogICAgICAgICAgICByZW5kZXJlZF9wYXRoX2V4cGVjdGVkLAogICAgICAgICAgICAiUmVuZGVyZWQgcGF0aCBkb2Vzbid0IG1hdGNoIiwKICAgICAgICApCgogICAgICAgICMgLS0gNCAtLQogICAgICAgICMgU2V0IGJvdGggcGF0aCBhbmQgY29kZSB0byBOb25lCiAgICAgICAgc2VsZi53cml0ZV9hbmRfaW52YWxpZGF0ZSgKICAgICAgICAgICAgc2VsZi5jb21tYW5kX2NyZWF0ZV9kaXIsICoqeyJjb2RlIjogTm9uZSwgInBhdGgiOiBOb25lfQogICAgICAgICkKICAgICAgICByZW5kZXJlZF9jb21tYW5kID0gc2VsZi5zZXJ2ZXJfdGVzdF8xLl9yZW5kZXJfY29tbWFuZChzZWxmLmNvbW1hbmRfY3JlYXRlX2RpcikKCiAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgKICAgICAgICAgICAgcmVuZGVyZWRfY29tbWFuZFsicmVuZGVyZWRfY29kZSJdLCAiUmVuZGVyZWQgY29kZSBkb2Vzbid0IG1hdGNoIgogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEZhbHNlKAogICAgICAgICAgICByZW5kZXJlZF9jb21tYW5kWyJyZW5kZXJlZF9wYXRoIl0sICJSZW5kZXJlZCBwYXRoIGRvZXNuJ3QgbWF0Y2giCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3NlcnZlcl9yZW5kZXJfY29tbWFuZF93aXRoX2N1c3RvbV92YXJpYWJsZV92YWx1ZXMoc2VsZik6CiAgICAgICAgIiIiVGVzdCByZW5kZXJpbmcgY29tbWFuZCB1c2luZyBgX3JlbmRlcl9jb21tYW5kYCBtZXRob2QKICAgICAgICBvZiBjeC50b3dlci5zZXJ2ZXIgd2l0aCBjdXN0b20gdmFyaWFibGUgdmFsdWVzCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi53cml0ZV9hbmRfaW52YWxpZGF0ZSgKICAgICAgICAgICAgc2VsZi5zZXJ2ZXJfdGVzdF8xLAogICAgICAgICAgICAqKnsidXNlcl9pZHMiOiBbKDQsIHNlbGYudXNlci5pZCldLCAibWFuYWdlcl9pZHMiOiBbKDQsIHNlbGYubWFuYWdlci5pZCldfSwKICAgICAgICApCiAgICAgICAgIyAtLSAxIC0tCiAgICAgICAgIyBTZXQgY3VzdG9tIHZhcmlhYmxlIHZhbHVlcwogICAgICAgIGN1c3RvbV92YXJpYWJsZV92YWx1ZXMgPSB7CiAgICAgICAgICAgICJ0ZXN0X3BhdGhfIjogIi9wZXBlL21lbWVzIiwKICAgICAgICAgICAgIm90aGVyX3BhdGgiOiAiL2V0Yy9jaGFkIiwKICAgICAgICB9CgogICAgICAgICMgTW9kaWZ5IGNvbW1hbmQgcGF0aAogICAgICAgIHNlbGYud3JpdGVfYW5kX2ludmFsaWRhdGUoCiAgICAgICAgICAgIHNlbGYuY29tbWFuZF9jcmVhdGVfZGlyLAogICAgICAgICAgICAqKnsicGF0aCI6ICJ7eyBvdGhlcl9wYXRoIH19L3t7IHRvd2VyLnNlcnZlci51c2VybmFtZSB9fSJ9LAogICAgICAgICkKCiAgICAgICAgIyBSZW5kZXIgY29tbWFuZAogICAgICAgIHJlbmRlcmVkX2NvbW1hbmQgPSBzZWxmLnNlcnZlcl90ZXN0XzEud2l0aF91c2VyKHNlbGYubWFuYWdlcikuX3JlbmRlcl9jb21tYW5kKAogICAgICAgICAgICBzZWxmLmNvbW1hbmRfY3JlYXRlX2RpciwgY3VzdG9tX3ZhcmlhYmxlX3ZhbHVlcz1jdXN0b21fdmFyaWFibGVfdmFsdWVzCiAgICAgICAgKQogICAgICAgIHJlbmRlcmVkX2NvZGVfZXhwZWN0ZWQgPSAiY2QgL3BlcGUvbWVtZXMgJiYgbWtkaXIgdGVzdC1vZG9vLTEiCiAgICAgICAgcmVuZGVyZWRfcGF0aF9leHBlY3RlZCA9IGYiL2V0Yy9jaGFkL3tzZWxmLnNlcnZlcl90ZXN0XzEuc3NoX3VzZXJuYW1lfSIKCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgcmVuZGVyZWRfY29tbWFuZFsicmVuZGVyZWRfY29kZSJdLAogICAgICAgICAgICByZW5kZXJlZF9jb2RlX2V4cGVjdGVkLAogICAgICAgICAgICAiUmVuZGVyZWQgY29kZSBkb2Vzbid0IG1hdGNoIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgcmVuZGVyZWRfY29tbWFuZFsicmVuZGVyZWRfcGF0aCJdLAogICAgICAgICAgICByZW5kZXJlZF9wYXRoX2V4cGVjdGVkLAogICAgICAgICAgICAiUmVuZGVyZWQgcGF0aCBkb2Vzbid0IG1hdGNoIiwKICAgICAgICApCgogICAgICAgICMgLS0gMiAtLQogICAgICAgICMgVGVzdCB3aXRoIHVzZXIgd2hvIGRvZXNuJ3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIHNlcnZlcgogICAgICAgIHJlbmRlcmVkX2NvbW1hbmQgPSBzZWxmLnNlcnZlcl90ZXN0XzEud2l0aF91c2VyKHNlbGYudXNlcikuX3JlbmRlcl9jb21tYW5kKAogICAgICAgICAgICBzZWxmLmNvbW1hbmRfY3JlYXRlX2RpciwgY3VzdG9tX3ZhcmlhYmxlX3ZhbHVlcz1jdXN0b21fdmFyaWFibGVfdmFsdWVzCiAgICAgICAgKQogICAgICAgIHJlbmRlcmVkX2NvZGVfZXhwZWN0ZWQgPSAiY2QgL29wdC90b3dlciAmJiBta2RpciB0ZXN0LW9kb28tMSIKICAgICAgICByZW5kZXJlZF9wYXRoX2V4cGVjdGVkID0gZiJOb25lL3tzZWxmLnNlcnZlcl90ZXN0XzEuc3NoX3VzZXJuYW1lfSIKCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgcmVuZGVyZWRfY29tbWFuZFsicmVuZGVyZWRfY29kZSJdLAogICAgICAgICAgICByZW5kZXJlZF9jb2RlX2V4cGVjdGVkLAogICAgICAgICAgICAiUmVuZGVyZWQgY29kZSBkb2Vzbid0IG1hdGNoIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgcmVuZGVyZWRfY29tbWFuZFsicmVuZGVyZWRfcGF0aCJdLAogICAgICAgICAgICByZW5kZXJlZF9wYXRoX2V4cGVjdGVkLAogICAgICAgICAgICAiUmVuZGVyZWQgcGF0aCBkb2Vzbid0IG1hdGNoIiwKICAgICAgICApCgogICAgZGVmIHRlc3Rfc2VydmVyX3JlbmRlcl9jb21tYW5kX3ZhcmlhYmxlX3dpdGhfdmFsdWVfbW9kaWZpZXIoc2VsZik6CiAgICAgICAgIiIiVGVzdCByZW5kZXJpbmcgY29tbWFuZCB1c2luZyBgX3JlbmRlcl9jb21tYW5kYCBtZXRob2QKICAgICAgICBvZiBjeC50b3dlci5zZXJ2ZXIuCiAgICAgICAgVXNlIHZhcmlhYmxlIHdpdGggdmFsdWUgbW9kaWZpZXIgZm9yIHRlc3RpbmcuCiAgICAgICAgIiIiCgogICAgICAgICMgLS0gMSAtLQogICAgICAgICMgU2V0IG1vZGlmaWVycyBmb3IgdmFyaWFibGVzCiAgICAgICAgbW9kaWZpZXJfZm9yX3BhdGggPSAiIiIKaWYgJ29wdCcgaW4gdmFsdWU6CiAgICByZXN1bHQgPSB2YWx1ZS5yZXBsYWNlKCdvcHQnLCAnaG9tZScpCmVsc2U6CiAgICByZXN1bHQgPSB2YWx1ZQoiIiIKICAgICAgICBzZWxmLnZhcmlhYmxlX3BhdGguYXBwbGllZF9leHByZXNzaW9uID0gbW9kaWZpZXJfZm9yX3BhdGgKCiAgICAgICAgbW9kaWZpZXJfZm9yX2RpciA9ICIiIgpwYXR0ZXJuID0gcicoP2kpb2RvbycKcmVwbGFjZW1lbnQgPSAnc2FwJwpyZXN1bHQgPSByZS5zdWIocGF0dGVybiwgcmVwbGFjZW1lbnQsIHZhbHVlKQoiIiIKICAgICAgICBzZWxmLnZhcmlhYmxlX2Rpci5hcHBsaWVkX2V4cHJlc3Npb24gPSBtb2RpZmllcl9mb3JfZGlyCgogICAgICAgICMgLS0gMSAtLQogICAgICAgICMgVGVzdCB3aXRoIGRlZmF1bHQgcGF0aAogICAgICAgIHJlbmRlcmVkX2NvbW1hbmQgPSBzZWxmLnNlcnZlcl90ZXN0XzEuX3JlbmRlcl9jb21tYW5kKHNlbGYuY29tbWFuZF9jcmVhdGVfZGlyKQogICAgICAgIHJlbmRlcmVkX2NvZGVfZXhwZWN0ZWQgPSAiY2QgL2hvbWUvdG93ZXIgJiYgbWtkaXIgdGVzdC1zYXAtMSIKICAgICAgICByZW5kZXJlZF9wYXRoX2V4cGVjdGVkID0gZiIvaG9tZS97c2VsZi5zZXJ2ZXJfdGVzdF8xLnNzaF91c2VybmFtZX0iCgogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHJlbmRlcmVkX2NvbW1hbmRbInJlbmRlcmVkX2NvZGUiXSwKICAgICAgICAgICAgcmVuZGVyZWRfY29kZV9leHBlY3RlZCwKICAgICAgICAgICAgIlJlbmRlcmVkIGNvZGUgZG9lc24ndCBtYXRjaCIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHJlbmRlcmVkX2NvbW1hbmRbInJlbmRlcmVkX3BhdGgiXSwKICAgICAgICAgICAgcmVuZGVyZWRfcGF0aF9leHBlY3RlZCwKICAgICAgICAgICAgIlJlbmRlcmVkIHBhdGggZG9lc24ndCBtYXRjaCIsCiAgICAgICAgKQoKICAgICAgICAjIC0tIDIgLS0KICAgICAgICAjIFNldCBpbnZhbGlkIGV4cHJlc3Npb24gbW9kaWZpZXIKICAgICAgICBzZWxmLnZhcmlhYmxlX3BhdGguYXBwbGllZF9leHByZXNzaW9uID0gImludmFsaWQiCiAgICAgICAgd2l0aCBtdXRlX2xvZ2dlcigib2Rvby5hZGRvbnMuY2V0bWl4X3Rvd2VyX3NlcnZlci5tb2RlbHMuY3hfdG93ZXJfdmFyaWFibGUiKToKICAgICAgICAgICAgcmVuZGVyZWRfY29tbWFuZCA9IHNlbGYuc2VydmVyX3Rlc3RfMS5fcmVuZGVyX2NvbW1hbmQoCiAgICAgICAgICAgICAgICBzZWxmLmNvbW1hbmRfY3JlYXRlX2RpcgogICAgICAgICAgICApCiAgICAgICAgcmVuZGVyZWRfY29kZV9leHBlY3RlZCA9ICJjZCAvb3B0L3Rvd2VyICYmIG1rZGlyIHRlc3Qtc2FwLTEiCiAgICAgICAgcmVuZGVyZWRfcGF0aF9leHBlY3RlZCA9IGYiL2hvbWUve3NlbGYuc2VydmVyX3Rlc3RfMS5zc2hfdXNlcm5hbWV9IgoKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICByZW5kZXJlZF9jb21tYW5kWyJyZW5kZXJlZF9jb2RlIl0sCiAgICAgICAgICAgIHJlbmRlcmVkX2NvZGVfZXhwZWN0ZWQsCiAgICAgICAgICAgICJSZW5kZXJlZCBjb2RlIGRvZXNuJ3QgbWF0Y2giLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICByZW5kZXJlZF9jb21tYW5kWyJyZW5kZXJlZF9wYXRoIl0sCiAgICAgICAgICAgIHJlbmRlcmVkX3BhdGhfZXhwZWN0ZWQsCiAgICAgICAgICAgICJSZW5kZXJlZCBwYXRoIGRvZXNuJ3QgbWF0Y2giLAogICAgICAgICkKCiAgICAgICAgIyAtLSAzIC0tCiAgICAgICAgIyBUZXN0IHdpdGggdmFyaWFibGUgaW4gdmFyaWFibGUgdmFsdWUKICAgICAgICBjb21wbGV4X3ZhcmlhYmxlID0gc2VsZi5WYXJpYWJsZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIkNvbXBsZXggVmFyaWFibGUiLAogICAgICAgICAgICAgICAgImFwcGxpZWRfZXhwcmVzc2lvbiI6ICJyZXN1bHQgPSB2YWx1ZS5yZXBsYWNlKCdvcHQnLCAnbWVtZScpIiwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICAjIENyZWF0ZSBhIGNvbXBsZXggdmFyaWFibGUgdmFsdWUKICAgICAgICBzZWxmLlZhcmlhYmxlVmFsdWUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidmFyaWFibGVfaWQiOiBjb21wbGV4X3ZhcmlhYmxlLmlkLAogICAgICAgICAgICAgICAgInZhbHVlX2NoYXIiOiAie3sgdGVzdF9wYXRoXyB9fS97eyB0ZXN0X2RpciB9fSIsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgY29tbWFuZF93aXRoX2NvbXBsZXhfdmFyaWFibGUgPSBzZWxmLkNvbW1hbmQuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJDb21tYW5kIHdpdGggY29tcGxleCB2YXJpYWJsZSIsCiAgICAgICAgICAgICAgICAiY29kZSI6ICJjZCB7eyBjb21wbGV4X3ZhcmlhYmxlIH19IiwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAic3NoX2NvbW1hbmQiLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHdpdGggbXV0ZV9sb2dnZXIoIm9kb28uYWRkb25zLmNldG1peF90b3dlcl9zZXJ2ZXIubW9kZWxzLmN4X3Rvd2VyX3ZhcmlhYmxlIik6CiAgICAgICAgICAgIHJlbmRlcmVkX2NvbW1hbmQgPSBzZWxmLnNlcnZlcl90ZXN0XzEuX3JlbmRlcl9jb21tYW5kKAogICAgICAgICAgICAgICAgY29tbWFuZF93aXRoX2NvbXBsZXhfdmFyaWFibGUKICAgICAgICAgICAgKQogICAgICAgIHJlbmRlcmVkX2NvZGVfZXhwZWN0ZWQgPSAiY2QgL21lbWUvdG93ZXIvdGVzdC1zYXAtMSIKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICByZW5kZXJlZF9jb21tYW5kWyJyZW5kZXJlZF9jb2RlIl0sCiAgICAgICAgICAgIHJlbmRlcmVkX2NvZGVfZXhwZWN0ZWQsCiAgICAgICAgICAgICJSZW5kZXJlZCBjb2RlIGRvZXNuJ3QgbWF0Y2giLAogICAgICAgICkKCiAgICAgICAgIyAtLSA0IC0tCiAgICAgICAgIyBSZW1vdmUgbW9kaWZpZXIgZnJvbSB2YXJpYWJsZSAiUGF0aCIgYW5kIGNoZWNrIGFnYWluCiAgICAgICAgc2VsZi52YXJpYWJsZV9kaXIuYXBwbGllZF9leHByZXNzaW9uID0gTm9uZQogICAgICAgIHdpdGggbXV0ZV9sb2dnZXIoIm9kb28uYWRkb25zLmNldG1peF90b3dlcl9zZXJ2ZXIubW9kZWxzLmN4X3Rvd2VyX3ZhcmlhYmxlIik6CiAgICAgICAgICAgIHJlbmRlcmVkX2NvbW1hbmQgPSBzZWxmLnNlcnZlcl90ZXN0XzEuX3JlbmRlcl9jb21tYW5kKAogICAgICAgICAgICAgICAgY29tbWFuZF93aXRoX2NvbXBsZXhfdmFyaWFibGUKICAgICAgICAgICAgKQogICAgICAgIHJlbmRlcmVkX2NvZGVfZXhwZWN0ZWQgPSAiY2QgL21lbWUvdG93ZXIvdGVzdC1vZG9vLTEiCgogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHJlbmRlcmVkX2NvbW1hbmRbInJlbmRlcmVkX2NvZGUiXSwKICAgICAgICAgICAgcmVuZGVyZWRfY29kZV9leHBlY3RlZCwKICAgICAgICAgICAgIlJlbmRlcmVkIGNvZGUgZG9lc24ndCBtYXRjaCIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3JlbmRlcl9jb2RlX2dlbmVyaWMoc2VsZik6CiAgICAgICAgIiIiVGVzdCBnZW5lcmljIChha2Egc3NoKSBjb2RlIHRlbXBsYXRlIGRpcmVjdCByZW5kZXJpbmciIiIKCiAgICAgICAgIyBPbmx5ICd0ZXN0X3BhdGhfJyBtdXN0IGJlIHJlbmRlcmVkCiAgICAgICAgYXJncyA9IHsidGVzdF9wYXRoXyI6ICIvdG1wIiwgInRlc3Rfb3MiOiAiZGViaWFuIn0KICAgICAgICByZXMgPSBzZWxmLmNvbW1hbmRfY3JlYXRlX2Rpci5yZW5kZXJfY29kZSgqKmFyZ3MpCiAgICAgICAgcmVuZGVyZWRfY29kZSA9IHJlcy5nZXQoc2VsZi5jb21tYW5kX2NyZWF0ZV9kaXIuaWQpCiAgICAgICAgcmVuZGVyZWRfY29kZV9leHBlY3RlZCA9ICJjZCAvdG1wICYmIG1rZGlyICIKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICByZW5kZXJlZF9jb2RlLAogICAgICAgICAgICByZW5kZXJlZF9jb2RlX2V4cGVjdGVkLAogICAgICAgICAgICBtc2c9ZiJNdXN0IGJlIHJlbmRlcmVkIGFzICd7cmVuZGVyZWRfY29kZV9leHBlY3RlZH0nIiwKICAgICAgICApCgogICAgICAgICMgJ3Rlc3RfcGF0aF8nIGFuZCAnZGlyJyBtdXN0IGJlIHJlbmRlcmVkCiAgICAgICAgYXJncyA9IHsidGVzdF9wYXRoXyI6ICIvdG1wIiwgIm9zIjogImRlYmlhbiIsICJ0ZXN0X2RpciI6ICJvZG9vIn0KICAgICAgICByZXMgPSBzZWxmLmNvbW1hbmRfY3JlYXRlX2Rpci5yZW5kZXJfY29kZSgqKmFyZ3MpCiAgICAgICAgcmVuZGVyZWRfY29kZSA9IHJlcy5nZXQoc2VsZi5jb21tYW5kX2NyZWF0ZV9kaXIuaWQpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgcmVuZGVyZWRfY29kZSwKICAgICAgICAgICAgImNkIC90bXAgJiYgbWtkaXIgb2RvbyIsCiAgICAgICAgICAgIG1zZz0iTXVzdCBiZSByZW5kZXJlZCBhcyAnY2QgL3RtcCAmJiBta2RpciBvZG9vJyIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3J1bl9jb21tYW5kX3dpdGhfdmFyaWFibGVzKHNlbGYpOgogICAgICAgICIiIlRlc3QgY29kZSBleGVjdXRpb24gdXNpbmcgY29tbWFuZCBsb2cgcmVjb3JkcyIiIgoKICAgICAgICB4ID0gMSAgIyBVc2VkIHRvIGRpc3Rpbmd1aXNoIGxhYmVscwoKICAgICAgICAjIENoZWNrIHdpdGggYWxsIGF2YWlsYWJsZSAic3VkbyIgb3B0aW9uCiAgICAgICAgZm9yIHN1ZG8gaW4gW0ZhbHNlLCAibiIsICJwIl06CiAgICAgICAgICAgICMgQWRkIGxhYmVsIHRvIHRyYWNrIGNvbW1hbmQgbG9nCiAgICAgICAgICAgIHNlbGYuc2VydmVyX3Rlc3RfMS51c2Vfc3VkbyA9IHN1ZG8KICAgICAgICAgICAgY29tbWFuZF9sYWJlbCA9IGYiVGVzdCBDb21tYW5kIHt4fSIKICAgICAgICAgICAgY3VzdG9tX3ZhbHVlcyA9IHsibG9nIjogeyJsYWJlbCI6IGNvbW1hbmRfbGFiZWx9fQoKICAgICAgICAgICAgIyBSdW4gY29tbWFuZCBmb3IgU2VydmVyIDEKICAgICAgICAgICAgc2VsZi5zZXJ2ZXJfdGVzdF8xLnJ1bl9jb21tYW5kKAogICAgICAgICAgICAgICAgc2VsZi5jb21tYW5kX2NyZWF0ZV9kaXIsIHN1ZG89c3VkbywgKipjdXN0b21fdmFsdWVzCiAgICAgICAgICAgICkKCiAgICAgICAgICAgICMgRXhwZWN0ZWQgcmVuZGVyZWQgY29tbWFuZCBjb2RlCiAgICAgICAgICAgIHJlbmRlcmVkX2NvZGVfZXhwZWN0ZWQgPSAiY2QgL29wdC90b3dlciAmJiBta2RpciB0ZXN0LW9kb28tMSIKCiAgICAgICAgICAgICMgR2V0IGNvbW1hbmQgbG9nCiAgICAgICAgICAgIGxvZ19yZWNvcmQgPSBzZWxmLkNvbW1hbmRMb2cuc2VhcmNoKFsoImxhYmVsIiwgIj0iLCBjb21tYW5kX2xhYmVsKV0pCgogICAgICAgICAgICAjIENoZWNrIGxvZyB2YWx1ZXMKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obG9nX3JlY29yZCksIDEsIG1zZz0iTXVzdCBiZSBhIHNpbmdsZSBsb2cgcmVjb3JkIikKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgICAgIGxvZ19yZWNvcmQuc2VydmVyX2lkLmlkLAogICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkLAogICAgICAgICAgICAgICAgbXNnPSJSZWNvcmQgbXVzdCBiZWxvbmcgdG8gVGVzdCAxIiwKICAgICAgICAgICAgKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICAgICAgbG9nX3JlY29yZC5jb21tYW5kX2lkLmlkLAogICAgICAgICAgICAgICAgc2VsZi5jb21tYW5kX2NyZWF0ZV9kaXIuaWQsCiAgICAgICAgICAgICAgICBtc2c9IlJlY29yZCBtdXN0IGJlbG9uZyB0byBjb21tYW5kICdDcmVhdGUgZGlyJyIsCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgICAgIGxvZ19yZWNvcmQuY29kZSwKICAgICAgICAgICAgICAgIHJlbmRlcmVkX2NvZGVfZXhwZWN0ZWQsCiAgICAgICAgICAgICAgICBtc2c9ZiJSZW5kZXJlZCBjb2RlIG11c3QgYmUgJ3tyZW5kZXJlZF9jb2RlX2V4cGVjdGVkfSciLAogICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgICAgICBsb2dfcmVjb3JkLmNvbW1hbmRfc3RhdHVzLCAwLCBtc2c9IkNvbW1hbmQgc3RhdHVzIG11c3QgYmUgZXF1YWwgdG8gMCIKICAgICAgICAgICAgKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICAgICAgbG9nX3JlY29yZC51c2Vfc3VkbywKICAgICAgICAgICAgICAgIHN1ZG8sCiAgICAgICAgICAgICAgICBtc2c9IidzdWRvJyBwYXJhbSBpbiBsb2cgZG9lc24ndCBtYXRjaCB0aGUgY29tbWFuZCBvbmUiLAogICAgICAgICAgICApCgogICAgICAgICAgICAjIEluY3JlbWVudCBsYWJlbCBjb3VudGVyCiAgICAgICAgICAgIHggKz0gMQoKICAgIGRlZiB0ZXN0X3J1bl9jb21tYW5kX3dpdGhfa2V5cyhzZWxmKToKICAgICAgICAiIiJUZXN0IGNvbW1hbmQgd2l0aCBrZXlzIGluIGNvZGUiIiIKCiAgICAgICAgIyBDb21tYW5kCiAgICAgICAgY29kZSA9ICJjZCB7eyB0ZXN0X3BhdGhfIH19ICYmIG1rZGlyICMhY3h0b3dlci5zZWNyZXQuRk9MREVSISMiCiAgICAgICAgY29tbWFuZF93aXRoX2tleXMgPSBzZWxmLkNvbW1hbmQuY3JlYXRlKAogICAgICAgICAgICB7Im5hbWUiOiAiQ29tbWFuZCB3aXRoIGtleXMiLCAiY29kZSI6IGNvZGV9CiAgICAgICAgKQoKICAgICAgICAjIFBhcnNlIGNvbW1hbmQgd2l0aCBrZXkgcGFyc2VyIHRvIGVuc3VyZSBrZXkgaXMgcGFyc2VkIGNvcnJlY3RseQogICAgICAgIGNvZGVfcGFyc2VkX2V4cGVjdGVkID0gImNkIHt7IHRlc3RfcGF0aF8gfX0gJiYgbWtkaXIgc2VjcmV0Rm9sZGVyIgogICAgICAgIGNvZGVfcGFyc2VkID0gc2VsZi5LZXkuX3BhcnNlX2NvZGUoY29kZSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBjb2RlX3BhcnNlZCwKICAgICAgICAgICAgY29kZV9wYXJzZWRfZXhwZWN0ZWQsCiAgICAgICAgICAgIG1zZz0iUGFyc2VkIGNvZGUgZG9lc24ndCBtYXRjaCBleHBlY3RlZCBvbmUiLAogICAgICAgICkKCiAgICAgICAgIyBBZGQgbGFiZWwgdG8gdHJhY2sgY29tbWFuZCBsb2cKICAgICAgICBjb21tYW5kX2xhYmVsID0gIlRlc3QgQ29tbWFuZCB3aXRoIGtleXMiCiAgICAgICAgY3VzdG9tX3ZhbHVlcyA9IHsibG9nIjogeyJsYWJlbCI6IGNvbW1hbmRfbGFiZWx9fQoKICAgICAgICAjIFJ1biBjb21tYW5kIGZvciBTZXJ2ZXIgMQogICAgICAgIHNlbGYuc2VydmVyX3Rlc3RfMS5ydW5fY29tbWFuZChjb21tYW5kX3dpdGhfa2V5cywgKipjdXN0b21fdmFsdWVzKQoKICAgICAgICAjIEV4cGVjdGVkIHJlbmRlcmVkIGNvbW1hbmQgY29kZQogICAgICAgIHJlbmRlcmVkX2NvZGVfZXhwZWN0ZWQgPSAiY2QgL29wdC90b3dlciAmJiBta2RpciAjIWN4dG93ZXIuc2VjcmV0LkZPTERFUiEjIgoKICAgICAgICAjIEdldCBjb21tYW5kIGxvZwogICAgICAgIGxvZ19yZWNvcmQgPSBzZWxmLkNvbW1hbmRMb2cuc2VhcmNoKFsoImxhYmVsIiwgIj0iLCBjb21tYW5kX2xhYmVsKV0pCgogICAgICAgICMgQ2hlY2sgbG9nIHZhbHVlcwogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxvZ19yZWNvcmQpLCAxLCBtc2c9Ik11c3QgYmUgYSBzaW5nbGUgbG9nIHJlY29yZCIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbG9nX3JlY29yZC5zZXJ2ZXJfaWQuaWQsCiAgICAgICAgICAgIHNlbGYuc2VydmVyX3Rlc3RfMS5pZCwKICAgICAgICAgICAgbXNnPSgiUmVjb3JkIG11c3QgYmVsb25nICVzIiwgc2VsZi5zZXJ2ZXJfdGVzdF8xLm5hbWUpLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBsb2dfcmVjb3JkLmNvbW1hbmRfaWQuaWQsCiAgICAgICAgICAgIGNvbW1hbmRfd2l0aF9rZXlzLmlkLAogICAgICAgICAgICBtc2c9KCJSZWNvcmQgbXVzdCBiZWxvbmcgdG8gY29tbWFuZCAlcyIsIGNvbW1hbmRfd2l0aF9rZXlzLm5hbWUpLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBsb2dfcmVjb3JkLmNvZGUsCiAgICAgICAgICAgIHJlbmRlcmVkX2NvZGVfZXhwZWN0ZWQsCiAgICAgICAgICAgIG1zZz1mIlJlbmRlcmVkIGNvZGUgbXVzdCBiZSAne3JlbmRlcmVkX2NvZGVfZXhwZWN0ZWR9JyIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGxvZ19yZWNvcmQuY29tbWFuZF9zdGF0dXMsIDAsIG1zZz0iQ29tbWFuZCBzdGF0dXMgbXVzdCBiZSBlcXVhbCB0byAwIgogICAgICAgICkKCiAgICBkZWYgdGVzdF9wYXJzZV9zc2hfY29tbWFuZF9yZXN1bHQoc2VsZik6CiAgICAgICAgIiIiVGVzdCBzc2ggY29tbWFuZCByZXN1bHQgcGFyc2luZyIiIgoKICAgICAgICBwbGFjZWhvbGRlciA9IHNlbGYuS2V5LlNFQ1JFVF9WQUxVRV9QTEFDRUhPTERFUgogICAgICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICMgQ2FzZSAxOiByZWd1bGFyIGNvbW1hbmQgZXhlY3V0aW9uIHJlc3VsdCB3aXRoIG5vIGVycm9yCiAgICAgICAgIyBXZSBhcmUgdGVzdGluZyBzZWNyZXQgdmFsdWUgcGxhY2Vob2xkZXIgaGVyZQogICAgICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIHN0YXR1cyA9IDAKICAgICAgICByZXNwb25zZSA9IFsiU3VjaCBtdWNoIiwgZiJEb2dlIGxpa2UgU1NIIHtwbGFjZWhvbGRlcn0iXQogICAgICAgIGVycm9yID0gW10KCiAgICAgICAgc3NoX2NvbW1hbmRfcmVzdWx0ID0gc2VsZi5TZXJ2ZXIuX3BhcnNlX2NvbW1hbmRfcmVzdWx0cygKICAgICAgICAgICAgc3RhdHVzLCByZXNwb25zZSwgZXJyb3IsIGtleV92YWx1ZXM9W2Yie3NlbGYuc2VjcmV0XzIuc2VjcmV0X3ZhbHVlfSJdCiAgICAgICAgKQoKICAgICAgICAjIEdldCByZXN1bHQKICAgICAgICByZXN1bHRfc3RhdHVzID0gc3NoX2NvbW1hbmRfcmVzdWx0WyJzdGF0dXMiXQogICAgICAgIHJlc3VsdF9yZXNwb25zZSA9IHNzaF9jb21tYW5kX3Jlc3VsdFsicmVzcG9uc2UiXQogICAgICAgIHJlc3VsdF9lcnJvciA9IHNzaF9jb21tYW5kX3Jlc3VsdFsiZXJyb3IiXQoKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICByZXN1bHRfc3RhdHVzLAogICAgICAgICAgICByZXN1bHRfc3RhdHVzLAogICAgICAgICAgICAiU3RhdHVzIGluIHJlc3VsdCBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBpbml0aWFsIG9uZSIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHJlc3VsdF9yZXNwb25zZSwKICAgICAgICAgICAgZiJTdWNoIG11Y2hEb2dlIGxpa2UgU1NIIHtwbGFjZWhvbGRlcn0iLAogICAgICAgICAgICAiUmVzcG9uc2UgaW4gcmVzdWx0IGRvZXNuJ3QgbWF0Y2ggZXhwZWN0ZWQiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydElzTm9uZShyZXN1bHRfZXJyb3IsICJFcnJvciBpbiByZXNwb25zZSBtdXN0IGJlIHNldCB0byBOb25lIikKCiAgICAgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIyBDYXNlIDI6IG5vIHJlc3BvbnNlIGJ1dCBhbiBlcnJvcgogICAgICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIHN0YXR1cyA9IDEKICAgICAgICByZXNwb25zZSA9IFtdCiAgICAgICAgZXJyb3IgPSBbIk9vb3BzIiwgIkkgZGlkIiwgIml0IGFnYWluIl0KCiAgICAgICAgc3NoX2NvbW1hbmRfcmVzdWx0ID0gc2VsZi5TZXJ2ZXIuX3BhcnNlX2NvbW1hbmRfcmVzdWx0cyhzdGF0dXMsIHJlc3BvbnNlLCBlcnJvcikKCiAgICAgICAgIyBHZXQgcmVzdWx0CiAgICAgICAgcmVzdWx0X3N0YXR1cyA9IHNzaF9jb21tYW5kX3Jlc3VsdFsic3RhdHVzIl0KICAgICAgICByZXN1bHRfcmVzcG9uc2UgPSBzc2hfY29tbWFuZF9yZXN1bHRbInJlc3BvbnNlIl0KICAgICAgICByZXN1bHRfZXJyb3IgPSBzc2hfY29tbWFuZF9yZXN1bHRbImVycm9yIl0KCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgcmVzdWx0X3N0YXR1cywKICAgICAgICAgICAgcmVzdWx0X3N0YXR1cywKICAgICAgICAgICAgIlN0YXR1cyBpbiByZXN1bHQgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgaW5pdGlhbCBvbmUiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydElzTm9uZShyZXN1bHRfcmVzcG9uc2UsICJSZXNwb25zZSBpbiByZXNwb25zZSBtdXN0IGJlIHNldCB0byBOb25lIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICByZXN1bHRfZXJyb3IsICJPb29wc0kgZGlkaXQgYWdhaW4iLCAiRXJyb3IgaW4gcmVzdWx0IGRvZXNuJ3QgbWF0Y2ggZXhwZWN0ZWQiCiAgICAgICAgKQoKICAgICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAjIENhc2UgMzogc2V2ZXJhbCBjb2RlcyBhbGwgMCwgbm8gcmVzcG9uc2UgYnV0IGFuIGVycm9yCiAgICAgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgc3RhdHVzID0gWzAsIDAsIDBdCiAgICAgICAgcmVzcG9uc2UgPSBbXQogICAgICAgIGVycm9yID0gWyJPb29wcyIsICJJIGRpZCIsICJpdCBhZ2FpbiJdCgogICAgICAgIHNzaF9jb21tYW5kX3Jlc3VsdCA9IHNlbGYuU2VydmVyLl9wYXJzZV9jb21tYW5kX3Jlc3VsdHMoc3RhdHVzLCByZXNwb25zZSwgZXJyb3IpCgogICAgICAgICMgR2V0IHJlc3VsdAogICAgICAgIHJlc3VsdF9zdGF0dXMgPSBzc2hfY29tbWFuZF9yZXN1bHRbInN0YXR1cyJdCiAgICAgICAgcmVzdWx0X3Jlc3BvbnNlID0gc3NoX2NvbW1hbmRfcmVzdWx0WyJyZXNwb25zZSJdCiAgICAgICAgcmVzdWx0X2Vycm9yID0gc3NoX2NvbW1hbmRfcmVzdWx0WyJlcnJvciJdCgogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHJlc3VsdF9zdGF0dXMsIDAsICJTdGF0dXMgaW4gcmVzdWx0IGRvZXNuJ3QgbWF0Y2ggZXhwZWN0ZWQgb25lIgogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydElzTm9uZShyZXN1bHRfcmVzcG9uc2UsICJSZXNwb25zZSBpbiByZXNwb25zZSBtdXN0IGJlIHNldCB0byBOb25lIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICByZXN1bHRfZXJyb3IsICJPb29wc0kgZGlkaXQgYWdhaW4iLCAiRXJyb3IgaW4gcmVzdWx0IGRvZXNuJ3QgbWF0Y2ggZXhwZWN0ZWQiCiAgICAgICAgKQoKICAgICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAjIENhc2UgNDogY29kZXMgWzAsMSwwLDQsMF0sIG5vIHJlc3BvbnNlIGJ1dCBhbiBlcnJvcgogICAgICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIHN0YXR1cyA9IFswLCAxLCAwLCA0LCAwXQogICAgICAgIHJlc3BvbnNlID0gW10KICAgICAgICBlcnJvciA9IFsiT29vcHMiLCAiSSBkaWQiLCAiaXQgYWdhaW4iXQoKICAgICAgICBzc2hfY29tbWFuZF9yZXN1bHQgPSBzZWxmLlNlcnZlci5fcGFyc2VfY29tbWFuZF9yZXN1bHRzKHN0YXR1cywgcmVzcG9uc2UsIGVycm9yKQoKICAgICAgICAjIEdldCByZXN1bHQKICAgICAgICByZXN1bHRfc3RhdHVzID0gc3NoX2NvbW1hbmRfcmVzdWx0WyJzdGF0dXMiXQogICAgICAgIHJlc3VsdF9yZXNwb25zZSA9IHNzaF9jb21tYW5kX3Jlc3VsdFsicmVzcG9uc2UiXQogICAgICAgIHJlc3VsdF9lcnJvciA9IHNzaF9jb21tYW5kX3Jlc3VsdFsiZXJyb3IiXQoKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICByZXN1bHRfc3RhdHVzLCA0LCAiU3RhdHVzIGluIHJlc3VsdCBkb2Vzbid0IG1hdGNoIGV4cGVjdGVkIG9uZSIKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocmVzdWx0X3Jlc3BvbnNlLCAiUmVzcG9uc2UgaW4gcmVzcG9uc2UgbXVzdCBiZSBzZXQgdG8gTm9uZSIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgcmVzdWx0X2Vycm9yLCAiT29vcHNJIGRpZGl0IGFnYWluIiwgIkVycm9yIGluIHJlc3VsdCBkb2Vzbid0IG1hdGNoIGV4cGVjdGVkIgogICAgICAgICkKCiAgICAgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIyBDYXNlIDU6IHJlZ3VsYXIgY29tbWFuZCBleGVjdXRpb24gcmVzdWx0IHdpdGggbm8gZXJyb3IKICAgICAgICAjIEhvd2V2ZXIgdGhlIGNvbW1hbmQgcmVzdWx0IGlzIHNhdmVkIGluIHRoZSAiZXJyb3IiIHZhbHVlLgogICAgICAgICMgRm9yIGV4YW1wbGUgdGhpcyBoYXBwZW5zIGluICdkb2NrZXIgYnVpbGQnLgogICAgICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIHN0YXR1cyA9IDAKICAgICAgICBlcnJvciA9IFsiU3VjaCBtdWNoIiwgZiJEb2dlIGxpa2UgU1NIIHtwbGFjZWhvbGRlcn0iXQogICAgICAgIHJlc3BvbnNlID0gW10KCiAgICAgICAgc3NoX2NvbW1hbmRfcmVzdWx0ID0gc2VsZi5TZXJ2ZXIuX3BhcnNlX2NvbW1hbmRfcmVzdWx0cygKICAgICAgICAgICAgc3RhdHVzLCByZXNwb25zZSwgZXJyb3IsIGtleV92YWx1ZXM9W2Yie3NlbGYuc2VjcmV0XzIuc2VjcmV0X3ZhbHVlfSJdCiAgICAgICAgKQoKICAgICAgICAjIEdldCByZXN1bHQKICAgICAgICByZXN1bHRfc3RhdHVzID0gc3NoX2NvbW1hbmRfcmVzdWx0WyJzdGF0dXMiXQogICAgICAgIHJlc3VsdF9yZXNwb25zZSA9IHNzaF9jb21tYW5kX3Jlc3VsdFsicmVzcG9uc2UiXQogICAgICAgIHJlc3VsdF9lcnJvciA9IHNzaF9jb21tYW5kX3Jlc3VsdFsiZXJyb3IiXQoKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICByZXN1bHRfc3RhdHVzLAogICAgICAgICAgICByZXN1bHRfc3RhdHVzLAogICAgICAgICAgICAiU3RhdHVzIGluIHJlc3VsdCBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBpbml0aWFsIG9uZSIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHJlc3VsdF9lcnJvciwKICAgICAgICAgICAgZiJTdWNoIG11Y2hEb2dlIGxpa2UgU1NIIHtwbGFjZWhvbGRlcn0iLAogICAgICAgICAgICAiUmVzcG9uc2UgaW4gcmVzdWx0IGRvZXNuJ3QgbWF0Y2ggZXhwZWN0ZWQiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydElzTm9uZShyZXN1bHRfcmVzcG9uc2UsICJFcnJvciBpbiByZXNwb25zZSBtdXN0IGJlIHNldCB0byBOb25lIikKCiAgICBkZWYgdGVzdF90b3dlcl9jb21tYW5kX2FjdGlvbl9maWxlX3VzaW5nX3RlbXBsYXRlKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgYWN0aW9uIGZpbGUgdXNpbmcgdGVtcGxhdGUgZm9yIHRvd2VyIHNvdXJjZQogICAgICAgICIiIgogICAgICAgIHdpdGggcGF0Y2goCiAgICAgICAgICAgICJvZG9vLmFkZG9ucy5jZXRtaXhfdG93ZXJfc2VydmVyLm1vZGVscy5jeF90b3dlcl9zZXJ2ZXIuQ3hUb3dlclNlcnZlci51cGxvYWRfZmlsZSIsCiAgICAgICAgICAgIHJldHVybl92YWx1ZT0ib2siLAogICAgICAgICk6CiAgICAgICAgICAgIHNlbGYuc2VydmVyX3Rlc3RfMS5ydW5fY29tbWFuZCgKICAgICAgICAgICAgICAgIHNlbGYuY29tbWFuZF9jcmVhdGVfZmlsZV93aXRoX3RlbXBsYXRlX3Rvd2VyX3NvdXJjZQogICAgICAgICAgICApCgogICAgICAgIGxvZ190ZXh0X2NyZWF0ZV9zdWNjZXNzID0gIkZpbGUgY3JlYXRlZCBhbmQgdXBsb2FkZWQgc3VjY2Vzc2Z1bGx5IgogICAgICAgIGxvZ190ZXh0X2ZpbGVfZXhpc3RzID0gIkFuIGVycm9yIG9jY3VycmVkOiBGaWxlIGFscmVhZHkgZXhpc3RzIG9uIHNlcnZlci4iCgogICAgICAgICMgR2V0IGNvbW1hbmQgbG9nCiAgICAgICAgbG9nX3JlY29yZCA9IHNlbGYuQ29tbWFuZExvZy5zZWFyY2goCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICgic2VydmVyX2lkIiwgIj0iLCBzZWxmLnNlcnZlcl90ZXN0XzEuaWQpLAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICJjb21tYW5kX2lkIiwKICAgICAgICAgICAgICAgICAgICAiPSIsCiAgICAgICAgICAgICAgICAgICAgc2VsZi5jb21tYW5kX2NyZWF0ZV9maWxlX3dpdGhfdGVtcGxhdGVfdG93ZXJfc291cmNlLmlkLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICgiY29tbWFuZF9yZXNwb25zZSIsICI9IiwgbG9nX3RleHRfY3JlYXRlX3N1Y2Nlc3MpLAogICAgICAgICAgICBdCiAgICAgICAgKQoKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsb2dfcmVjb3JkKSwgMSwgbXNnPSJNdXN0IGJlIGEgc2luZ2xlIGxvZyByZWNvcmQiKQoKICAgICAgICB3aXRoIHBhdGNoKAogICAgICAgICAgICAib2Rvby5hZGRvbnMuY2V0bWl4X3Rvd2VyX3NlcnZlci5tb2RlbHMuY3hfdG93ZXJfc2VydmVyLkN4VG93ZXJTZXJ2ZXIudXBsb2FkX2ZpbGUiLAogICAgICAgICAgICByZXR1cm5fdmFsdWU9Im9rIiwKICAgICAgICApOgogICAgICAgICAgICBzZWxmLnNlcnZlcl90ZXN0XzEucnVuX2NvbW1hbmQoCiAgICAgICAgICAgICAgICBzZWxmLmNvbW1hbmRfY3JlYXRlX2ZpbGVfd2l0aF90ZW1wbGF0ZV90b3dlcl9zb3VyY2UKICAgICAgICAgICAgKQoKICAgICAgICBsb2dfcmVjb3JkXzIgPSBzZWxmLkNvbW1hbmRMb2cuc2VhcmNoKAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAoInNlcnZlcl9pZCIsICI9Iiwgc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkKSwKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAiY29tbWFuZF9pZCIsCiAgICAgICAgICAgICAgICAgICAgIj0iLAogICAgICAgICAgICAgICAgICAgIHNlbGYuY29tbWFuZF9jcmVhdGVfZmlsZV93aXRoX3RlbXBsYXRlX3Rvd2VyX3NvdXJjZS5pZCwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAoImNvbW1hbmRfZXJyb3IiLCAiPSIsIGxvZ190ZXh0X2ZpbGVfZXhpc3RzKSwKICAgICAgICAgICAgXQogICAgICAgICkKCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obG9nX3JlY29yZF8yKSwgMSwgbXNnPSJNdXN0IGJlIGEgc2luZ2xlIGxvZyByZWNvcmQiKQoKICAgIGRlZiB0ZXN0X3NlcnZlcl9jb21tYW5kX2FjdGlvbl9maWxlX3VzaW5nX3RlbXBsYXRlKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgYWN0aW9uIGZpbGUgdXNpbmcgdGVtcGxhdGUgZm9yIHNlcnZlciBzb3VyY2UKICAgICAgICAiIiIKICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYudGVtcGxhdGVfZmlsZV9zZXJ2ZXIuZmlsZV9pZHMpCgogICAgICAgIGRlZiBkb3dubG9hZF9maWxlKHRoaXMsIHJlbW90ZV9wYXRoKToKICAgICAgICAgICAgcmV0dXJuIGIiSGVsbG8sIHdvcmxkISIKCiAgICAgICAgY3hfdG93ZXJfc2VydmVyX29iaiA9IHNlbGYucmVnaXN0cnlbImN4LnRvd2VyLnNlcnZlciJdCgogICAgICAgIHdpdGggcGF0Y2gub2JqZWN0KGN4X3Rvd2VyX3NlcnZlcl9vYmosICJkb3dubG9hZF9maWxlIiwgZG93bmxvYWRfZmlsZSk6CiAgICAgICAgICAgIHNlbGYuc2VydmVyX3Rlc3RfMS5ydW5fY29tbWFuZCgKICAgICAgICAgICAgICAgIHNlbGYuY29tbWFuZF9jcmVhdGVfZmlsZV93aXRoX3RlbXBsYXRlX3NlcnZlcl9zb3VyY2UKICAgICAgICAgICAgKQoKICAgICAgICBsb2dfdGV4dF9jcmVhdGVfc3VjY2VzcyA9ICJGaWxlIGNyZWF0ZWQgYW5kIHVwbG9hZGVkIHN1Y2Nlc3NmdWxseSIKICAgICAgICBsb2dfdGV4dF9maWxlX2V4aXN0cyA9ICJBbiBlcnJvciBvY2N1cnJlZDogRmlsZSBhbHJlYWR5IGV4aXN0cyBvbiBzZXJ2ZXIuIgoKICAgICAgICAjIEdldCBjb21tYW5kIGxvZwogICAgICAgIGxvZ19yZWNvcmQgPSBzZWxmLkNvbW1hbmRMb2cuc2VhcmNoKAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAoInNlcnZlcl9pZCIsICI9Iiwgc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkKSwKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAiY29tbWFuZF9pZCIsCiAgICAgICAgICAgICAgICAgICAgIj0iLAogICAgICAgICAgICAgICAgICAgIHNlbGYuY29tbWFuZF9jcmVhdGVfZmlsZV93aXRoX3RlbXBsYXRlX3NlcnZlcl9zb3VyY2UuaWQsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgKCJjb21tYW5kX3Jlc3BvbnNlIiwgIj0iLCBsb2dfdGV4dF9jcmVhdGVfc3VjY2VzcyksCiAgICAgICAgICAgIF0KICAgICAgICApCgogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxvZ19yZWNvcmQpLCAxLCBtc2c9Ik11c3QgYmUgYSBzaW5nbGUgbG9nIHJlY29yZCIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbGVuKHNlbGYudGVtcGxhdGVfZmlsZV9zZXJ2ZXIuZmlsZV9pZHMpLCAxLCBtc2c9Ik11c3QgYmUgb25lIGZpbGUhIgogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBzZWxmLnRlbXBsYXRlX2ZpbGVfc2VydmVyLmZpbGVfaWRzLnNvdXJjZSwKICAgICAgICAgICAgInNlcnZlciIsCiAgICAgICAgICAgIG1zZz0iVGhlIEZpbGUgc291cmNlIG11c3QgYmUgJ3NlcnZlciciLAogICAgICAgICkKCiAgICAgICAgd2l0aCBwYXRjaC5vYmplY3QoY3hfdG93ZXJfc2VydmVyX29iaiwgImRvd25sb2FkX2ZpbGUiLCBkb3dubG9hZF9maWxlKToKICAgICAgICAgICAgc2VsZi5zZXJ2ZXJfdGVzdF8xLnJ1bl9jb21tYW5kKAogICAgICAgICAgICAgICAgc2VsZi5jb21tYW5kX2NyZWF0ZV9maWxlX3dpdGhfdGVtcGxhdGVfc2VydmVyX3NvdXJjZQogICAgICAgICAgICApCgogICAgICAgIGxvZ19yZWNvcmRfMiA9IHNlbGYuQ29tbWFuZExvZy5zZWFyY2goCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICgic2VydmVyX2lkIiwgIj0iLCBzZWxmLnNlcnZlcl90ZXN0XzEuaWQpLAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICJjb21tYW5kX2lkIiwKICAgICAgICAgICAgICAgICAgICAiPSIsCiAgICAgICAgICAgICAgICAgICAgc2VsZi5jb21tYW5kX2NyZWF0ZV9maWxlX3dpdGhfdGVtcGxhdGVfc2VydmVyX3NvdXJjZS5pZCwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAoImNvbW1hbmRfZXJyb3IiLCAiPSIsIGxvZ190ZXh0X2ZpbGVfZXhpc3RzKSwKICAgICAgICAgICAgXQogICAgICAgICkKCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obG9nX3JlY29yZF8yKSwgMSwgbXNnPSJNdXN0IGJlIGEgc2luZ2xlIGxvZyByZWNvcmQiKQoKICAgIGRlZiB0ZXN0X3J1bl9jb21tYW5kX25vX2NvbW1hbmRfbG9nKHNlbGYpOgogICAgICAgICIiIlJ1biBjb21tYW5kIHdpdGhvdXQgY3JlYXRpbmcgYSBsb2cgcmVjb3JkLgogICAgICAgIFN1Y2ggY29tbWFuZHMgcmV0dXJuIGV4ZWN1dGlvbiByZXN1bHQgZGlyZWN0bHkuCiAgICAgICAgIiIiCiAgICAgICAgIyBBZGQgbGFiZWwgdG8gdHJhY2sgY29tbWFuZCBsb2cKICAgICAgICBjb21tYW5kX2xhYmVsID0gIlRlc3QgQ29tbWFuZCB3aXRoIGtleXMiCiAgICAgICAgY3VzdG9tX3ZhbHVlcyA9IHsibG9nIjogeyJsYWJlbCI6IGNvbW1hbmRfbGFiZWx9fQoKICAgICAgICAjIFJ1biBjb21tYW5kIGZvciBTZXJ2ZXIgMQogICAgICAgIGNvbW1hbmRfcmVzdWx0ID0gc2VsZi5zZXJ2ZXJfdGVzdF8xLndpdGhfY29udGV4dCgKICAgICAgICAgICAgbm9fY29tbWFuZF9sb2c9VHJ1ZQogICAgICAgICkucnVuX2NvbW1hbmQoc2VsZi5jb21tYW5kX2NyZWF0ZV9kaXIsICoqY3VzdG9tX3ZhbHVlcykKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBjb21tYW5kX3Jlc3VsdFsic3RhdHVzIl0sIDAsICJDb21tYW5kIHN0YXR1cyBkb2Vzbid0IG1hdGNoIGV4cGVjdGVkIG9uZSIKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgY29tbWFuZF9yZXN1bHRbInJlc3BvbnNlIl0sCiAgICAgICAgICAgICJvayIsCiAgICAgICAgICAgICJDb21tYW5kIHJlc3BvbnNlIGRvZXNuJ3QgbWF0Y2ggZXhwZWN0ZWQgb25lIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoCiAgICAgICAgICAgIGNvbW1hbmRfcmVzdWx0WyJlcnJvciJdLCAiQ29tbWFuZCBlcnJvciBkb2Vzbid0IG1hdGNoIGV4cGVjdGVkIG9uZSIKICAgICAgICApCgogICAgZGVmIHRlc3RfYW5vdGhlcl9jb21tYW5kX2lzX3J1bm5pbmcoc2VsZik6CiAgICAgICAgIiIiVGVzdCBhIGNhc2Ugd2hlbiBhbm90aGVyIGNvbW1hbmQgaXMgcnVubmluZyBvbiB0aGUgc2FtZSBzZXJ2ZXIiIiIKCiAgICAgICAgIyBSZW1vdmUgYWxsIGV4aXN0aW5nIGNvbW1hbmQgbG9ncwogICAgICAgIHNlbGYuQ29tbWFuZExvZy5zZWFyY2goW10pLnVubGluaygpCgogICAgICAgICMgQ3JlYXRlIGEgbmV3IGNvbW1hbmQgbG9nCiAgICAgICAgaW5pdGlhbF9jb21tYW5kX2xvZyA9IHNlbGYuQ29tbWFuZExvZy5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWQiOiBzZWxmLnNlcnZlcl90ZXN0XzEuaWQsCiAgICAgICAgICAgICAgICAiY29tbWFuZF9pZCI6IHNlbGYuY29tbWFuZF9jcmVhdGVfbmV3X2NvbW1hbmQuaWQsCiAgICAgICAgICAgICAgICAic3RhcnRfZGF0ZSI6IERhdGV0aW1lLm5vdygpLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIFJ1biB0aGUgY29tbWFuZCB3aXRob3V0IGNyZWF0aW5nIGEgbG9nIHJlY29yZAogICAgICAgIGNvbW1hbmRfcmVzdWx0ID0gc2VsZi5zZXJ2ZXJfdGVzdF8xLndpdGhfY29udGV4dCgKICAgICAgICAgICAgbm9fY29tbWFuZF9sb2c9VHJ1ZQogICAgICAgICkucnVuX2NvbW1hbmQoc2VsZi5jb21tYW5kX2NyZWF0ZV9uZXdfY29tbWFuZCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbW1hbmRfcmVzdWx0WyJzdGF0dXMiXSwgQU5PVEhFUl9DT01NQU5EX1JVTk5JTkcpCgogICAgICAgICMgUnVuIHRoZSBjb21tYW5kIHdpdGggY3JlYXRpbmcgYSBsb2cgcmVjb3JkCiAgICAgICAgY29tbWFuZF9yZXN1bHQgPSBzZWxmLnNlcnZlcl90ZXN0XzEucnVuX2NvbW1hbmQoc2VsZi5jb21tYW5kX2NyZWF0ZV9uZXdfY29tbWFuZCkKCiAgICAgICAgIyBHZXQgdGhlIGNvbW1hbmQgbG9nCiAgICAgICAgY29tbWFuZF9sb2cgPSBzZWxmLkNvbW1hbmRMb2cuc2VhcmNoKAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAoInNlcnZlcl9pZCIsICI9Iiwgc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkKSwKICAgICAgICAgICAgICAgICgiY29tbWFuZF9pZCIsICI9Iiwgc2VsZi5jb21tYW5kX2NyZWF0ZV9uZXdfY29tbWFuZC5pZCksCiAgICAgICAgICAgICAgICAoImlkIiwgIiE9IiwgaW5pdGlhbF9jb21tYW5kX2xvZy5pZCksCiAgICAgICAgICAgIF0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oY29tbWFuZF9sb2cpLCAxLCAiTXVzdCBiZSBhIHNpbmdsZSBsb2cgcmVjb3JkIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbW1hbmRfbG9nLmNvbW1hbmRfc3RhdHVzLCBBTk9USEVSX0NPTU1BTkRfUlVOTklORykKCiAgICBkZWYgdGVzdF9maWxlX3VzaW5nX3RlbXBsYXRlX2NyZWF0ZV9pZl9leGlzdHMoc2VsZik6CiAgICAgICAgIiIiVGVzdCB1cGxvYWRpbmcgZmlsZSB1c2luZyB0ZW1wbGF0ZSBpZiBpdCBleGlzdHMgb24gc2VydmVyLiIiIgoKICAgICAgICBjb21tYW5kID0gc2VsZi5jb21tYW5kX2NyZWF0ZV9maWxlX3dpdGhfdGVtcGxhdGVfc2VydmVyX3NvdXJjZQogICAgICAgIGNvbW1hbmQud3JpdGUoeyJpZl9maWxlX2V4aXN0cyI6ICJza2lwIn0pCgogICAgICAgICMgQ3JlYXRlIGZpbGUgdG8gbWFrZSBzdXJlIHRoYXQgaXQgZXhpc3RzIG9uIHRoZSBzZXJ2ZXIKICAgICAgICBmaWxlX3RlbXBsYXRlID0gY29tbWFuZC5maWxlX3RlbXBsYXRlX2lkCiAgICAgICAgb3JpZ19maWxlID0gZmlsZV90ZW1wbGF0ZS5jcmVhdGVfZmlsZSgKICAgICAgICAgICAgc2VydmVyPXNlbGYuc2VydmVyX3Rlc3RfMSwKICAgICAgICAgICAgc2VydmVyX2Rpcj1maWxlX3RlbXBsYXRlLnNlcnZlcl9kaXIsCiAgICAgICAgICAgIGlmX2ZpbGVfZXhpc3RzPWNvbW1hbmQuaWZfZmlsZV9leGlzdHMsCiAgICAgICAgKQoKICAgICAgICBzZWxmLmFzc2VydFRydWUob3JpZ19maWxlLCAiRmlsZSBtdXN0IGJlIGNyZWF0ZWQgb24gdGhlIHNlcnZlciIpCgogICAgICAgICMgVGVzdCBpZiBmaWxlIGV4aXN0cyBhbmQgY29tbWFuZCBpcyBzZXQgdG8gInNraXAiCiAgICAgICAgc2tpcHBlZF9maWxlID0gZmlsZV90ZW1wbGF0ZS5jcmVhdGVfZmlsZSgKICAgICAgICAgICAgc2VydmVyPXNlbGYuc2VydmVyX3Rlc3RfMSwKICAgICAgICAgICAgc2VydmVyX2Rpcj1maWxlX3RlbXBsYXRlLnNlcnZlcl9kaXIsCiAgICAgICAgICAgIGlmX2ZpbGVfZXhpc3RzPWNvbW1hbmQuaWZfZmlsZV9leGlzdHMsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIG9yaWdfZmlsZSwKICAgICAgICAgICAgc2tpcHBlZF9maWxlLAogICAgICAgICAgICAiU2tpcCBzaG91bGQgcmV0dXJuIHRoZSBleGlzdGluZyBmaWxlLCBub3QgY3JlYXRlIGEgbmV3IG9uZSIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHNlbGYuZW52WyJjeC50b3dlci5maWxlIl0uc2VhcmNoX2NvdW50KAogICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICgidGVtcGxhdGVfaWQiLCAiPSIsIGZpbGVfdGVtcGxhdGUuaWQpLAogICAgICAgICAgICAgICAgICAgICgic2VydmVyX2lkIiwgIj0iLCBzZWxmLnNlcnZlcl90ZXN0XzEuaWQpLAogICAgICAgICAgICAgICAgXQogICAgICAgICAgICApLAogICAgICAgICAgICAxLAogICAgICAgICAgICAiVGhlcmUgbXVzdCBiZSBleGFjdGx5IG9uZSBwaHlzaWNhbCBmaWxlIHJlY29yZCBhZnRlciBza2lwIiwKICAgICAgICApCgogICAgICAgICMgQ2hhbmdlIGNvbW1hbmQgdG8gcmFpc2UgYW4gZXJyb3IgaWYgZmlsZSBleGlzdHMKICAgICAgICBjb21tYW5kLndyaXRlKHsiaWZfZmlsZV9leGlzdHMiOiAicmFpc2UifSkKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoCiAgICAgICAgICAgIFZhbGlkYXRpb25FcnJvciwKICAgICAgICAgICAgIkZpbGUgYWxyZWFkeSBleGlzdHMgb24gc2VydmVyLiIsCiAgICAgICAgKToKICAgICAgICAgICAgZmlsZV90ZW1wbGF0ZS5jcmVhdGVfZmlsZSgKICAgICAgICAgICAgICAgIHNlcnZlcj1zZWxmLnNlcnZlcl90ZXN0XzEsCiAgICAgICAgICAgICAgICBzZXJ2ZXJfZGlyPWZpbGVfdGVtcGxhdGUuc2VydmVyX2RpciwKICAgICAgICAgICAgICAgIGlmX2ZpbGVfZXhpc3RzPWNvbW1hbmQuaWZfZmlsZV9leGlzdHMsCiAgICAgICAgICAgICkKICAgICAgICAjIENoYW5nZSBjb21tYW5kIHRvICJvdmVyd3JpdGUiIGZpbGUgaWYgaXQgZXhpc3RzCiAgICAgICAgY29tbWFuZC53cml0ZSh7ImlmX2ZpbGVfZXhpc3RzIjogIm92ZXJ3cml0ZSJ9KQogICAgICAgICMgUnVuIGNvbW1hbmQgYWdhaW4sIGl0IHNob3VsZCBvdmVyd3JpdGUgdGhlIGZpbGUKICAgICAgICBmaWxlX3RlbXBsYXRlLmNyZWF0ZV9maWxlKAogICAgICAgICAgICBzZXJ2ZXI9c2VsZi5zZXJ2ZXJfdGVzdF8xLAogICAgICAgICAgICBzZXJ2ZXJfZGlyPWZpbGVfdGVtcGxhdGUuc2VydmVyX2RpciwKICAgICAgICAgICAgaWZfZmlsZV9leGlzdHM9Y29tbWFuZC5pZl9maWxlX2V4aXN0cywKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgc2VsZi5lbnZbImN4LnRvd2VyLmZpbGUiXS5zZWFyY2hfY291bnQoCiAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgKCJ0ZW1wbGF0ZV9pZCIsICI9IiwgZmlsZV90ZW1wbGF0ZS5pZCksCiAgICAgICAgICAgICAgICAgICAgKCJzZXJ2ZXJfaWQiLCAiPSIsIHNlbGYuc2VydmVyX3Rlc3RfMS5pZCksCiAgICAgICAgICAgICAgICAgICAgKCJzZXJ2ZXJfZGlyIiwgIj0iLCBmaWxlX3RlbXBsYXRlLnNlcnZlcl9kaXIpLAogICAgICAgICAgICAgICAgXQogICAgICAgICAgICApLAogICAgICAgICAgICAxLAogICAgICAgICAgICAiVGhlcmUgbXVzdCBiZSBleGFjdGx5IG9uZSBwaHlzaWNhbCBmaWxlIHJlY29yZCBhZnRlciBvdmVyd3JpdGUiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBvcmlnX2ZpbGUuY29kZSwKICAgICAgICAgICAgZmlsZV90ZW1wbGF0ZS5jb2RlLAogICAgICAgICAgICAiRmlsZSBjb2RlIG11c3QgbWF0Y2ggdGVtcGxhdGUgYWZ0ZXIgb3ZlcndyaXRlIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgb3JpZ19maWxlLm5hbWUsCiAgICAgICAgICAgIGZpbGVfdGVtcGxhdGUuZmlsZV9uYW1lLAogICAgICAgICAgICAiRmlsZSBuYW1lIG11c3QgbWF0Y2ggdGVtcGxhdGUgYWZ0ZXIgb3ZlcndyaXRlIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgb3JpZ19maWxlLnNvdXJjZSwKICAgICAgICAgICAgZmlsZV90ZW1wbGF0ZS5zb3VyY2UsCiAgICAgICAgICAgICJGaWxlIHNvdXJjZSBtdXN0IG1hdGNoIHRlbXBsYXRlIGFmdGVyIG92ZXJ3cml0ZSIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X2lzX2ZpbGVfZGlzY29ubmVjdGVkX2Zyb21fdGVtcGxhdGUoc2VsZik6CiAgICAgICAgIiIiVGVzdCBpZiBmaWxlIGlzIGRpc2Nvbm5lY3RlZCBmcm9tIHRlbXBsYXRlIGFmdGVyIGJlaW5nIGNyZWF0ZWQuIiIiCgogICAgICAgIGluaXRpYWxfZmlsZXMgPSBzZWxmLnNlcnZlcl90ZXN0XzEuZmlsZV9pZHMKICAgICAgICBjb21tYW5kID0gc2VsZi5jb21tYW5kX2NyZWF0ZV9maWxlX3dpdGhfdGVtcGxhdGVfc2VydmVyX3NvdXJjZQoKICAgICAgICBjb21tYW5kLmRpc2Nvbm5lY3RfZmlsZSA9IFRydWUKICAgICAgICBzZWxmLnNlcnZlcl90ZXN0XzEucnVuX2NvbW1hbmQoY29tbWFuZD1jb21tYW5kKQoKICAgICAgICBuZXdfZmlsZXMgPSBzZWxmLnNlcnZlcl90ZXN0XzEuZmlsZV9pZHMgLSBpbml0aWFsX2ZpbGVzCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obmV3X2ZpbGVzKSwgMSwgIk11c3QgYmUgb25lIG5ldyBmaWxlIGNyZWF0ZWQiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIG5ld19maWxlcy5jb2RlX29uX3NlcnZlciwKICAgICAgICAgICAgY29tbWFuZC5maWxlX3RlbXBsYXRlX2lkLmNvZGUsCiAgICAgICAgICAgICJGaWxlIGNvZGUgbXVzdCBtYXRjaCB0ZW1wbGF0ZSIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoCiAgICAgICAgICAgIG5ld19maWxlcy50ZW1wbGF0ZV9pZCwgIkZpbGUgbXVzdCBiZSBkaXNjb25uZWN0ZWQgZnJvbSB0ZW1wbGF0ZSIKICAgICAgICApCgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgKioqKioqKioqKioqKioqKioqKioqCiAgICAjICAgUHl0aG9uIGNvbW1hbmRzCiAgICAjICoqKioqKioqKioqKioqKioqKioqKgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBkZWYgdGVzdF9yZW5kZXJfY29kZV9weXRob24oc2VsZik6CiAgICAgICAgIiIiVGVzdCBQeXRob24gY29kZSB0ZW1wbGF0ZSBkaXJlY3QgcmVuZGVyaW5nIiIiCgogICAgICAgIHJlbmRlcmVkX2NvbW1hbmQgPSBzZWxmLnNlcnZlcl90ZXN0XzEuX3JlbmRlcl9jb21tYW5kKAogICAgICAgICAgICBzZWxmLmNvbW1hbmRfY3JlYXRlX25ld19jb21tYW5kCiAgICAgICAgKQoKICAgICAgICAjIE5vdGU6IHRoaXMgaXMgcmVuZGVyZWQgYXMgZm9yIFNlcnZlciBUZXN0IDEKICAgICAgICByZW5kZXJlZF9jb2RlX3B5dGhvbmljID0gKAogICAgICAgICAgICBmIiIiCnNlcnZlcl9uYW1lID0gIntzZWxmLnNlcnZlcl90ZXN0XzEubmFtZX0iCmlmIHNlcnZlcl9uYW1lIGFuZCAjIWN4dG93ZXIuc2VjcmV0LkZPTERFUiEjID09ICJzZWNyZXRGb2xkZXIiOgogICAgIyBXZSBkb24ndCBhY3R1YWxseSBjcmVhdGUgYSBuZXcgY29tbWFuZCBiZWNhdXNlIGl0IHdpbGwgcmFpc2UKICAgICMgYWNjZXNzIGVycm9yIGlmIHVzZXIgZG9lc24ndCBoYXZlIGFjY2VzcyB0byAnY3JlYXRlJyBvcGVyYXRpb24uCiAgICAjIEluc3RlYWQgd2UganVzdCByZXR1cm4gYSBkdW1teSBjb21tYW5kIHJlc3VsdC4KICAgIGNvbW1hbmQgPSAibmV3IGNvbW1hbmQiCiAgICByZXN1bHQgPSB7eyJleGl0X2NvZGUiOiAwLCAibWVzc2FnZSI6ICJOZXcgY29tbWFuZCB3YXMgY3JlYXRlZCJ9fQplbHNlOgogICAgcmVzdWx0ID0ge3siZXhpdF9jb2RlIjogJXMsICJtZXNzYWdlIjogImVycm9yIn19CiAgICAiIiIKICAgICAgICAgICAgJSBHRU5FUkFMX0VSUk9SCiAgICAgICAgKQoKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICByZW5kZXJlZF9jb21tYW5kWyJyZW5kZXJlZF9jb2RlIl0sCiAgICAgICAgICAgIHJlbmRlcmVkX2NvZGVfcHl0aG9uaWMsCiAgICAgICAgICAgICJSZW5kZXJlZCBjb2RlIGRvZXNuJ3QgbWF0Y2giLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9leGVjdXRlX3B5dGhvbl9jb21tYW5kKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJ1biBjb21tYW5kIHdpdGggcHl0aG9uIGFjdGlvbi4KICAgICAgICAiIiIKICAgICAgICBjb21tYW5kX3Jlc3VsdCA9IHNlbGYuc2VydmVyX3Rlc3RfMS53aXRoX2NvbnRleHQoCiAgICAgICAgICAgIG5vX2NvbW1hbmRfbG9nPVRydWUKICAgICAgICApLnJ1bl9jb21tYW5kKHNlbGYuY29tbWFuZF9jcmVhdGVfbmV3X2NvbW1hbmQpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgY29tbWFuZF9yZXN1bHRbInN0YXR1cyJdLCAwLCAiVGhlIGNvbW1hbmQgcmVzdWx0IHN0YXR1cyBtdXN0IGJlIDAiCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGNvbW1hbmRfcmVzdWx0WyJyZXNwb25zZSJdLAogICAgICAgICAgICAiTmV3IGNvbW1hbmQgd2FzIGNyZWF0ZWQiLAogICAgICAgICAgICAiVGhlIHJlc3BvbnNlIG11c3QgYmUgdGV4dCIsCiAgICAgICAgKQoKICAgICAgICAjIENoZWNrIGVycm9yIGlzIHJhaXNlcwogICAgICAgIHNlbGYuc2VjcmV0X2ZvbGRlcl9rZXkuc2VjcmV0X3ZhbHVlID0gIm5vdF9hX3NlY3JldEZvbGRlciIKICAgICAgICBjb21tYW5kX3Jlc3VsdCA9IHNlbGYuc2VydmVyX3Rlc3RfMS53aXRoX2NvbnRleHQoCiAgICAgICAgICAgIG5vX2NvbW1hbmRfbG9nPVRydWUKICAgICAgICApLnJ1bl9jb21tYW5kKHNlbGYuY29tbWFuZF9jcmVhdGVfbmV3X2NvbW1hbmQpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgY29tbWFuZF9yZXN1bHRbInN0YXR1cyJdLAogICAgICAgICAgICBHRU5FUkFMX0VSUk9SLAogICAgICAgICAgICAiVGhlIGNvbW1hbmQgcmVzdWx0IHN0YXR1cyBtdXN0IGJlIEdFTkVSQUxfRVJST1IiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBjb21tYW5kX3Jlc3VsdFsiZXJyb3IiXSwKICAgICAgICAgICAgImVycm9yIiwKICAgICAgICAgICAgIlRoZSBlcnJvciByZXNwb25zZSBtdXN0IGJlIGNvbnRhaW4gdGV4dCAtIGVycm9yIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfcnVuX3B5dGhvbl9jb2RlX2Jhbm5lZF9rZXl3b3JkcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHRoYXQgX3J1bl9weXRob25fY29kZSByYWlzZXMgVmFsaWRhdGlvbkVycm9yIHdoZW4gY29kZSBjb250YWlucwogICAgICAgIGJhbm5lZCBrZXl3b3JkcyAoZS5nLiBfc2V0X3NlY3JldF92YWx1ZXMsIF9nZXRfc2VjcmV0X3ZhbHVlLAogICAgICAgIF9nZXRfc2VjcmV0X3ZhbHVlcykuCiAgICAgICAgIiIiCiAgICAgICAgYmFubmVkX2tleXdvcmRzID0gc2VsZi5Db21tYW5kLl9nZXRfYmFubmVkX3B5dGhvbl9jb2RlX2tleXdvcmRzKCkKICAgICAgICBmb3IgYmFubmVkX2tleXdvcmQgaW4gYmFubmVkX2tleXdvcmRzOgogICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChiYW5uZWRfa2V5d29yZD1iYW5uZWRfa2V5d29yZCk6CiAgICAgICAgICAgICAgICBjb2RlID0gZiIiIgpyZXN1bHQgPSB7eyJleGl0X2NvZGUiOiAwLCAibWVzc2FnZSI6ICJvayJ9fQojIEJhbm5lZDoge2Jhbm5lZF9rZXl3b3JkfQoiIiIKICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsaWRhdGlvbkVycm9yKSBhcyBjbToKICAgICAgICAgICAgICAgICAgICBzZWxmLnNlcnZlcl90ZXN0XzEuX3J1bl9weXRob25fY29kZShjb2RlLCByYWlzZV9vbl9lcnJvcj1UcnVlKQogICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigKICAgICAgICAgICAgICAgICAgICBiYW5uZWRfa2V5d29yZCwKICAgICAgICAgICAgICAgICAgICBzdHIoY20uZXhjZXB0aW9uKSwKICAgICAgICAgICAgICAgICAgICAiVmFsaWRhdGlvbkVycm9yIG11c3QgbWVudGlvbiB0aGUgYmFubmVkIGtleXdvcmQiLAogICAgICAgICAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3J1bl9weXRob25fY29kZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHB5dGhvbiBleGVjdXRpb24gY29kZQogICAgICAgICIiIgogICAgICAgIHJlbmRlcmVkX2NvbW1hbmQgPSBzZWxmLnNlcnZlcl90ZXN0XzEuX3JlbmRlcl9jb21tYW5kKAogICAgICAgICAgICBzZWxmLmNvbW1hbmRfY3JlYXRlX25ld19jb21tYW5kCiAgICAgICAgKQoKICAgICAgICBjb21tYW5kX3Jlc3VsdCA9IHNlbGYuc2VydmVyX3Rlc3RfMS5fcnVuX3B5dGhvbl9jb2RlKAogICAgICAgICAgICByZW5kZXJlZF9jb21tYW5kWyJyZW5kZXJlZF9jb2RlIl0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgY29tbWFuZF9yZXN1bHRbInN0YXR1cyJdLCAwLCAiVGhlIGNvbW1hbmQgcmVzdWx0IHN0YXR1cyBtdXN0IGJlIDAiCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGNvbW1hbmRfcmVzdWx0WyJyZXNwb25zZSJdLAogICAgICAgICAgICAiTmV3IGNvbW1hbmQgd2FzIGNyZWF0ZWQiLAogICAgICAgICAgICAiVGhlIHJlc3BvbnNlIG11c3QgYmUgdGV4dCIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKAogICAgICAgICAgICBjb21tYW5kX3Jlc3VsdFsiZXJyb3IiXSwKICAgICAgICAgICAgIkVycm9yIGluIGNvbW1hbmQgcmVzdWx0IG11c3QgYmUgc2V0IHRvIE5vbmUiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9ydW5fY29tbWFuZF93aXRob3V0X3NldF9zZXJ2ZXJfc3RhdHVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgY29tbWFuZCBleGVjdXRpb24gd2l0aG91dCBzZXR0aW5nIHNlcnZlciBzdGF0dXMKICAgICAgICAiIiIKICAgICAgICAjIFNldCBjb21tYW5kIGFjY2VzcyBsZXZlbCB0byAidXNlciIKICAgICAgICBzZWxmLmNvbW1hbmRfY3JlYXRlX25ld19jb21tYW5kLndyaXRlKHsiYWNjZXNzX2xldmVsIjogIjEifSkKCiAgICAgICAgIyBBZGQgdXNlciB0byBjb21tYW5kCiAgICAgICAgc2VsZi53cml0ZV9hbmRfaW52YWxpZGF0ZSgKICAgICAgICAgICAgc2VsZi5zZXJ2ZXJfdGVzdF8xLCAqKnsidXNlcl9pZHMiOiBbKDQsIHNlbGYudXNlci5pZCldfQogICAgICAgICkKCiAgICAgICAgIyBSZXNldCBhY2Nlc3MgcnVsZSBjYWNoZQogICAgICAgIHNlbGYuZW52WyJpci5ydWxlIl0uaW52YWxpZGF0ZV9yZWNvcmRzZXQoKQoKICAgICAgICAjIFJ1biBjb21tYW5kCiAgICAgICAgc2VydmVyX3N0YXR1cyA9IHNlbGYuc2VydmVyX3Rlc3RfMS5zdGF0dXMKCiAgICAgICAgcmVzdWx0ID0gKAogICAgICAgICAgICBzZWxmLnNlcnZlcl90ZXN0XzEud2l0aF9jb250ZXh0KG5vX2NvbW1hbmRfbG9nPVRydWUpCiAgICAgICAgICAgIC53aXRoX3VzZXIoc2VsZi51c2VyKQogICAgICAgICAgICAucnVuX2NvbW1hbmQoc2VsZi5jb21tYW5kX2NyZWF0ZV9uZXdfY29tbWFuZCkKICAgICAgICApCgogICAgICAgICMgQ2hlY2sgY29tbWFuZCByZXN1bHQKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdFsic3RhdHVzIl0sIDAsICJDb21tYW5kIHN0YXR1cyBtdXN0IGJlIDAiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHNlbGYuc2VydmVyX3Rlc3RfMS5zdGF0dXMsIHNlcnZlcl9zdGF0dXMsICJTZXJ2ZXIgc3RhdHVzIG11c3QgYmUgJ3J1bm5pbmcnIgogICAgICAgICkKCiAgICBkZWYgdGVzdF9ydW5fY29tbWFuZF93aXRoX3NldF9zZXJ2ZXJfc3RhdHVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgY29tbWFuZCBleGVjdXRpb24gd2l0aCBzZXR0aW5nIHNlcnZlciBzdGF0dXMKICAgICAgICAiIiIKICAgICAgICAjIFNldCBzZXJ2ZXIgc3RhdHVzIHRvICJkb3duIgogICAgICAgIHNlbGYuY29tbWFuZF9jcmVhdGVfbmV3X2NvbW1hbmQud3JpdGUoeyJzZXJ2ZXJfc3RhdHVzIjogInN0b3BwaW5nIn0pCgogICAgICAgICMgUnVuIGNvbW1hbmQKICAgICAgICBzZWxmLnNlcnZlcl90ZXN0XzEud2l0aF9jb250ZXh0KG5vX2NvbW1hbmRfbG9nPVRydWUpLnJ1bl9jb21tYW5kKAogICAgICAgICAgICBzZWxmLmNvbW1hbmRfY3JlYXRlX25ld19jb21tYW5kCiAgICAgICAgKQoKICAgICAgICAjIENoZWNrIGNvbW1hbmQgcmVzdWx0CiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgc2VsZi5zZXJ2ZXJfdGVzdF8xLnN0YXR1cywgInN0b3BwaW5nIiwgIlNlcnZlciBzdGF0dXMgbXVzdCBiZSAnc3RvcHBpbmcnIgogICAgICAgICkKCiAgICBkZWYgdGVzdF9ydW5fcHl0aG9uX2NvZGVfd2l0aF9zZWNyZXQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCBleGVjdXRpb24gb2YgUHl0aG9uIGNvZGUgd2l0aCBhIHNlY3JldCB2YWx1ZS4KICAgICAgICBUaGlzIHRlc3QgZW5zdXJlcyB0aGF0IGEgY29tbWFuZCBpcyByZW5kZXJlZCBhbmQgZXhlY3V0ZWQgY29ycmVjdGx5LAogICAgICAgIGFuZCB0aGF0IHRoZSBzZWNyZXQgdmFsdWUgaXMgY29ycmVjdGx5IGhhbmRsZWQgYW5kIHJlcGxhY2VkIGluIHRoZSBvdXRwdXQuCiAgICAgICAgIiIiCgogICAgICAgIHBsYWNlaG9sZGVyID0gc2VsZi5LZXkuU0VDUkVUX1ZBTFVFX1BMQUNFSE9MREVSCiAgICAgICAgIyBDYXNlIDEKICAgICAgICAjIFJlbmRlciB0aGUgY29tbWFuZCB1c2luZyBzZXJ2ZXJfdGVzdF8xCiAgICAgICAgcmVuZGVyZWRfY29tbWFuZCA9IHNlbGYuc2VydmVyX3Rlc3RfMS5fcmVuZGVyX2NvbW1hbmQoCiAgICAgICAgICAgIHNlbGYuY29tbWFuZF9weXRob25fY29tbWFuZF8xCiAgICAgICAgKQoKICAgICAgICAjIFJ1biB0aGUgcmVuZGVyZWQgUHl0aG9uIGNvZGUKICAgICAgICBjb21tYW5kX3Jlc3VsdCA9IHNlbGYuc2VydmVyX3Rlc3RfMS5fcnVuX3B5dGhvbl9jb2RlKAogICAgICAgICAgICByZW5kZXJlZF9jb21tYW5kWyJyZW5kZXJlZF9jb2RlIl0KICAgICAgICApCgogICAgICAgICMgQXNzZXJ0IHRoYXQgdGhlIGNvbW1hbmQgZXhlY3V0aW9uIHN0YXR1cyBpcyAwIChpbmRpY2F0aW5nIHN1Y2Nlc3MpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgY29tbWFuZF9yZXN1bHRbInN0YXR1cyJdLCAwLCAiVGhlIGNvbW1hbmQgcmVzdWx0IHN0YXR1cyBtdXN0IGJlIDAiCiAgICAgICAgKQoKICAgICAgICAjIEFzc2VydCB0aGF0IHRoZSByZXNwb25zZSBjb250YWlucyB0aGUgc2VjcmV0IHNwb2lsZXIgdGV4dAogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGNvbW1hbmRfcmVzdWx0WyJyZXNwb25zZSJdLAogICAgICAgICAgICBwbGFjZWhvbGRlciwKICAgICAgICAgICAgIlRoZSByZXNwb25zZSBtdXN0IGNvcnJlY3RseSBpbmNsdWRlIHRoZSBzZWNyZXQgdmFsdWUgcGxhY2Vob2xkZXIiLAogICAgICAgICkKCiAgICAgICAgIyBBc3NlcnQgdGhhdCBubyBlcnJvciBvY2N1cnJlZCBkdXJpbmcgZXhlY3V0aW9uIChlcnJvciBzaG91bGQgYmUgTm9uZSkKICAgICAgICBzZWxmLmFzc2VydElzTm9uZSgKICAgICAgICAgICAgY29tbWFuZF9yZXN1bHRbImVycm9yIl0sCiAgICAgICAgICAgICJUaGUgZXJyb3IgaW4gY29tbWFuZCByZXN1bHQgbXVzdCBiZSBOb25lIiwKICAgICAgICApCgogICAgICAgICMgQ2FzZSAyCiAgICAgICAgIyBSZW5kZXIgdGhlIGNvbW1hbmQgdXNpbmcgc2VydmVyX3Rlc3RfMQogICAgICAgIHJlbmRlcmVkX2NvbW1hbmQgPSBzZWxmLnNlcnZlcl90ZXN0XzEuX3JlbmRlcl9jb21tYW5kKAogICAgICAgICAgICBzZWxmLmNvbW1hbmRfcHl0aG9uX2NvbW1hbmRfMgogICAgICAgICkKCiAgICAgICAgIyBSdW4gdGhlIHJlbmRlcmVkIFB5dGhvbiBjb2RlCiAgICAgICAgY29tbWFuZF9yZXN1bHQgPSBzZWxmLnNlcnZlcl90ZXN0XzEuX3J1bl9weXRob25fY29kZSgKICAgICAgICAgICAgcmVuZGVyZWRfY29tbWFuZFsicmVuZGVyZWRfY29kZSJdCiAgICAgICAgKQoKICAgICAgICAjIEFzc2VydCB0aGF0IHRoZSBjb21tYW5kIGV4ZWN1dGlvbiBzdGF0dXMgaXMgMCAoaW5kaWNhdGluZyBzdWNjZXNzKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGNvbW1hbmRfcmVzdWx0WyJzdGF0dXMiXSwgMCwgIlRoZSBjb21tYW5kIHJlc3VsdCBzdGF0dXMgbXVzdCBiZSAwIgogICAgICAgICkKCiAgICAgICAgIyBBc3NlcnQgdGhhdCB0aGUgcmVzcG9uc2UgY29udGFpbnMgdGhlIHNlY3JldCBzcG9pbGVyIHRleHQKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBjb21tYW5kX3Jlc3VsdFsicmVzcG9uc2UiXSwKICAgICAgICAgICAgZidXZSB1c2UgIntwbGFjZWhvbGRlcn0iJywKICAgICAgICAgICAgIlRoZSByZXNwb25zZSBtdXN0IGNvcnJlY3RseSBpbmNsdWRlIHRoZSBzZWNyZXQgdmFsdWUgcGxhY2Vob2xkZXIiLAogICAgICAgICkKCiAgICAgICAgIyBBc3NlcnQgdGhhdCBubyBlcnJvciBvY2N1cnJlZCBkdXJpbmcgZXhlY3V0aW9uIChlcnJvciBzaG91bGQgYmUgTm9uZSkKICAgICAgICBzZWxmLmFzc2VydElzTm9uZSgKICAgICAgICAgICAgY29tbWFuZF9yZXN1bHRbImVycm9yIl0sCiAgICAgICAgICAgICJUaGUgZXJyb3IgaW4gY29tbWFuZCByZXN1bHQgbXVzdCBiZSBOb25lIiwKICAgICAgICApCgogICAgICAgICMgQ2FzZSAzCiAgICAgICAgIyBSZW5kZXIgdGhlIGNvbW1hbmQgdXNpbmcgc2VydmVyX3Rlc3RfMQogICAgICAgIHJlbmRlcmVkX2NvbW1hbmQgPSBzZWxmLnNlcnZlcl90ZXN0XzEuX3JlbmRlcl9jb21tYW5kKAogICAgICAgICAgICBzZWxmLmNvbW1hbmRfcHl0aG9uX2NvbW1hbmRfMwogICAgICAgICkKCiAgICAgICAgIyBSdW4gdGhlIHJlbmRlcmVkIFB5dGhvbiBjb2RlCiAgICAgICAgY29tbWFuZF9yZXN1bHQgPSBzZWxmLnNlcnZlcl90ZXN0XzEuX3J1bl9weXRob25fY29kZSgKICAgICAgICAgICAgcmVuZGVyZWRfY29tbWFuZFsicmVuZGVyZWRfY29kZSJdCiAgICAgICAgKQoKICAgICAgICAjIEFzc2VydCB0aGF0IHRoZSBjb21tYW5kIGV4ZWN1dGlvbiBzdGF0dXMgaXMgMCAoaW5kaWNhdGluZyBzdWNjZXNzKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGNvbW1hbmRfcmVzdWx0WyJzdGF0dXMiXSwgMCwgIlRoZSBjb21tYW5kIHJlc3VsdCBzdGF0dXMgbXVzdCBiZSAwIgogICAgICAgICkKCiAgICAgICAgIyBBc3NlcnQgdGhhdCB0aGUgcmVzcG9uc2UgY29udGFpbnMgdGhlIHNlY3JldCBzcG9pbGVyIHRleHQKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBjb21tYW5kX3Jlc3VsdFsicmVzcG9uc2UiXSwKICAgICAgICAgICAgcGxhY2Vob2xkZXIsCiAgICAgICAgICAgICJUaGUgcmVzcG9uc2UgbXVzdCBjb3JyZWN0bHkgaW5jbHVkZSB0aGUgc2VjcmV0IHZhbHVlIHBsYWNlaG9sZGVyIiwKICAgICAgICApCgogICAgICAgICMgQXNzZXJ0IHRoYXQgbm8gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGV4ZWN1dGlvbiAoZXJyb3Igc2hvdWxkIGJlIE5vbmUpCiAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoCiAgICAgICAgICAgIGNvbW1hbmRfcmVzdWx0WyJlcnJvciJdLAogICAgICAgICAgICAiVGhlIGVycm9yIGluIGNvbW1hbmQgcmVzdWx0IG11c3QgYmUgTm9uZSIsCiAgICAgICAgKQoKICAgICAgICAjIENhc2UgNAogICAgICAgICMgUmVuZGVyIHRoZSBjb21tYW5kIHVzaW5nIHNlcnZlcl90ZXN0XzEKICAgICAgICByZW5kZXJlZF9jb21tYW5kID0gc2VsZi5zZXJ2ZXJfdGVzdF8xLl9yZW5kZXJfY29tbWFuZCgKICAgICAgICAgICAgc2VsZi5jb21tYW5kX3B5dGhvbl9jb21tYW5kXzQKICAgICAgICApCgogICAgICAgICMgUnVuIHRoZSByZW5kZXJlZCBQeXRob24gY29kZQogICAgICAgICMgU1NIIGtleXMgYXJlIG5vdCBwYXJzZWQgaW5saW5lLCBzbyB3ZSBzaG91bGQgcmFpc2UgYSB2YWxpZGF0aW9uIGVycm9yCiAgICAgICAgY29tbWFuZF9yZXN1bHQgPSBzZWxmLnNlcnZlcl90ZXN0XzEuX3J1bl9weXRob25fY29kZSgKICAgICAgICAgICAgcmVuZGVyZWRfY29tbWFuZFsicmVuZGVyZWRfY29kZSJdCiAgICAgICAgKQoKICAgICAgICAjIEFzc2VydCB0aGF0IHRoZSBjb21tYW5kIGV4ZWN1dGlvbiBzdGF0dXMgaXMgMCAoaW5kaWNhdGluZyBzdWNjZXNzKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGNvbW1hbmRfcmVzdWx0WyJzdGF0dXMiXSwgMCwgIlRoZSBjb21tYW5kIHJlc3VsdCBzdGF0dXMgbXVzdCBiZSAwIgogICAgICAgICkKCiAgICAgICAgIyBBc3NlcnQgdGhhdCB0aGUgcmVzcG9uc2UgY29udGFpbnMgdGhlIHNlY3JldCBzcG9pbGVyIHRleHQKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBjb21tYW5kX3Jlc3VsdFsicmVzcG9uc2UiXSwKICAgICAgICAgICAgcGxhY2Vob2xkZXIsCiAgICAgICAgICAgICJUaGUgcmVzcG9uc2UgbXVzdCBjb3JyZWN0bHkgaW5jbHVkZSB0aGUgc2VjcmV0IHZhbHVlIHBsYWNlaG9sZGVyIiwKICAgICAgICApCgogICAgICAgICMgQXNzZXJ0IHRoYXQgbm8gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGV4ZWN1dGlvbiAoZXJyb3Igc2hvdWxkIGJlIE5vbmUpCiAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoCiAgICAgICAgICAgIGNvbW1hbmRfcmVzdWx0WyJlcnJvciJdLAogICAgICAgICAgICAiVGhlIGVycm9yIGluIGNvbW1hbmQgcmVzdWx0IG11c3QgYmUgTm9uZSIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X2NvbW1hbmRfd2l0aF9zZWNyZXQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCBjYXNlIHRvIHZlcmlmeSB0aGF0IHdoZW4gYSBjb21tYW5kIGluY2x1ZGVzIGEgc2VjcmV0IHJlZmVyZW5jZSwKICAgICAgICB0aGUgc2VjcmV0IGtleSBpcyBhdXRvbWF0aWNhbGx5IGxpbmtlZCB3aXRoIHRoZSBjb21tYW5kLgogICAgICAgICIiIgoKICAgICAgICAjIENvbW1hbmQgd2l0aCBhIHNlY3JldCByZWZlcmVuY2UKICAgICAgICBjb2RlID0gImNkIHt7IHRlc3RfcGF0aF8gfX0gJiYgbWtkaXIgIyFjeHRvd2VyLnNlY3JldC5GT0xERVIhIyIKCiAgICAgICAgc2VjcmV0cyA9IHNlbGYuQ29tbWFuZC5fZXh0cmFjdF9zZWNyZXRfaWRzKGNvZGUpCiAgICAgICAgc2VjcmV0X2ZvbGRlcl9rZXkgPSBzZWxmLnNlY3JldF9mb2xkZXJfa2V5CiAgICAgICAgc2VsZi5hc3NlcnRJbigKICAgICAgICAgICAgc2VjcmV0X2ZvbGRlcl9rZXksCiAgICAgICAgICAgIHNlY3JldHMsCiAgICAgICAgICAgIG1zZz0oCiAgICAgICAgICAgICAgICBmIlRoZSBleHBlY3RlZCBzZWNyZXQgSUQgI3tzZWNyZXRfZm9sZGVyX2tleS5pZH0gIgogICAgICAgICAgICAgICAgIndhcyBub3QgZm91bmQgaW4gdGhlIHByb3ZpZGVkIGNvZGUuIgogICAgICAgICAgICApLAogICAgICAgICkKCiAgICAgICAgY29tbWFuZF93aXRoX2tleXMgPSBzZWxmLkNvbW1hbmQuY3JlYXRlKAogICAgICAgICAgICB7Im5hbWUiOiAiQ29tbWFuZCB3aXRoIGtleXMiLCAiY29kZSI6IGNvZGV9CiAgICAgICAgKQoKICAgICAgICAjIC0tIDEgLS0KICAgICAgICAjIEFzc2VydCB0aGF0IHRoZSBzZWNyZXQga2V5IGlzIGxpbmtlZCB3aXRoIHRoZSBjb21tYW5kCiAgICAgICAgc2VsZi5hc3NlcnRJbigKICAgICAgICAgICAgc2VjcmV0X2ZvbGRlcl9rZXksCiAgICAgICAgICAgIGNvbW1hbmRfd2l0aF9rZXlzLnNlY3JldF9pZHMsCiAgICAgICAgICAgIG1zZz0iVGhlIHNlY3JldCBrZXkgaXMgbm90IGxpbmtlZCB3aXRoIHRoZSBjb21tYW5kLiIsCiAgICAgICAgKQoKICAgICAgICAjIC0tIDIgLS0KICAgICAgICAjICBVcGRhdGUgdGhlIGNvbW1hbmQncyBjb2RlIHRvIHJlbW92ZSB0aGUgc2VjcmV0IHJlZmVyZW5jZQogICAgICAgIHVwZGF0ZWRfY29kZSA9ICJjZCB7eyB0ZXN0X3BhdGhfIH19ICYmIG1rZGlyIG5ld19mb2xkZXIiCiAgICAgICAgY29tbWFuZF93aXRoX2tleXMuY29kZSA9IHVwZGF0ZWRfY29kZQoKICAgICAgICBzZWxmLmFzc2VydEZhbHNlKAogICAgICAgICAgICBjb21tYW5kX3dpdGhfa2V5cy5zZWNyZXRfaWRzLAogICAgICAgICAgICBtc2c9KAogICAgICAgICAgICAgICAgIlRoZSBzZWNyZXRfaWRzIGZpZWxkIHNob3VsZCBiZSBlbXB0eSBhZnRlciAiCiAgICAgICAgICAgICAgICAicmVtb3ZpbmcgdGhlIHNlY3JldCByZWZlcmVuY2UgZnJvbSBjb21tYW5kLiIKICAgICAgICAgICAgKSwKICAgICAgICApCgogICAgICAgICMgLS0gMyAtLQogICAgICAgICMgQ3JlYXRlIGEgc2VjcmV0IHdpdGggdGhlIHNhbWUgcmVmZXJlbmNlIGJ1dCBjb25uZWN0ZWQgdG8gYW5vdGhlciBzZXJ2ZXIKICAgICAgICBhbm90aGVyX3NlcnZlciA9IHNlbGYuc2VydmVyX3Rlc3RfMS5jb3B5KHsibmFtZSI6ICJhbm90aGVyIHNlcnZlciJ9KQogICAgICAgIGFub3RoZXJfc2VjcmV0ID0gc2VsZi5LZXkuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJhbm90aGVyIHNlY3JldCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogc2VjcmV0X2ZvbGRlcl9rZXkucmVmZXJlbmNlLAogICAgICAgICAgICAgICAgImtleV90eXBlIjogInMiLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIGFub3RoZXJfc2VjcmV0X3ZhbHVlID0gc2VsZi5LZXlWYWx1ZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJrZXlfaWQiOiBhbm90aGVyX3NlY3JldC5pZCwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWQiOiBhbm90aGVyX3NlcnZlci5pZCwKICAgICAgICAgICAgICAgICJzZWNyZXRfdmFsdWUiOiAiYW5vdGhlciBzZWNyZXQgdmFsdWUiLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgICMgU2V0IG9yaWdpbmFsIGNvZGUgYWdhaW4KICAgICAgICBjb21tYW5kX3dpdGhfa2V5cy5jb2RlID0gY29kZQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGxlbihjb21tYW5kX3dpdGhfa2V5cy5zZWNyZXRfaWRzKSwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgbXNnPSJNdXN0IGJlIG9ubHkgb25lIHNlY3JldCIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgIHNlY3JldF9mb2xkZXJfa2V5LAogICAgICAgICAgICBjb21tYW5kX3dpdGhfa2V5cy5zZWNyZXRfaWRzLAogICAgICAgICAgICBtc2c9IlRoZSBzZWNyZXQga2V5IGlzIG5vdCBsaW5rZWQgd2l0aCB0aGUgY29tbWFuZC4iLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydE5vdEluKAogICAgICAgICAgICBhbm90aGVyX3NlY3JldCwKICAgICAgICAgICAgY29tbWFuZF93aXRoX2tleXMuc2VjcmV0X2lkcywKICAgICAgICAgICAgbXNnPSJUaGUgYW5vdGhlciBzZWNyZXQgaXMgbGlua2VkIHdpdGggdGhlIGNvbW1hbmQuIiwKICAgICAgICApCgogICAgICAgICMgLS0gNCAtLQogICAgICAgICMgQ29ubmVjdCBjb21tYW5kIHRvIHNlcnZlciBhbmQgc2VjcmV0IHRvIGFub3RoZXIgc2VydmVyCiAgICAgICAgIyBhbmQgZW5zdXJlIGl0J3MgdW5saW5rZWQgZnJvbSB0aGUgY29tbWFuZC4KICAgICAgICB5ZXRfb25lX21vcmVfc2VydmVyID0gc2VsZi5zZXJ2ZXJfdGVzdF8xLmNvcHkoeyJuYW1lIjogInlldCBvbmUgbW9yZSBzZXJ2ZXIifSkKCiAgICAgICAgc2VsZi53cml0ZV9hbmRfaW52YWxpZGF0ZSgKICAgICAgICAgICAgYW5vdGhlcl9zZWNyZXRfdmFsdWUsICoqeyJzZXJ2ZXJfaWQiOiB5ZXRfb25lX21vcmVfc2VydmVyLmlkfQogICAgICAgICkKICAgICAgICBzZWxmLndyaXRlX2FuZF9pbnZhbGlkYXRlKAogICAgICAgICAgICBjb21tYW5kX3dpdGhfa2V5cywgKip7InNlcnZlcl9pZHMiOiBzZWxmLnNlcnZlcl90ZXN0XzF9CiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGxlbihjb21tYW5kX3dpdGhfa2V5cy5zZWNyZXRfaWRzKSwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgbXNnPSJNdXN0IGJlIG9uZSBzZWNyZXQiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9jaGVja196b21iaWVfY29tbWFuZHMoc2VsZik6CiAgICAgICAgIiIiVGVzdCBjaGVja2luZyBhbmQgbWFya2luZyB6b21iaWUgY29tbWFuZHMiIiIKICAgICAgICAjIENyZWF0ZSB0ZXN0IGNvbW1hbmRzCiAgICAgICAgc3NoX2NvbW1hbmQgPSBzZWxmLkNvbW1hbmQuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IFNTSCBDb21tYW5kIiwKICAgICAgICAgICAgICAgICJjb2RlIjogImxzIC1sYSIsCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogInNzaF9jb21tYW5kIiwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICBweXRob25fY29tbWFuZCA9IHNlbGYuQ29tbWFuZC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgUHl0aG9uIENvbW1hbmQiLAogICAgICAgICAgICAgICAgImNvZGUiOiAicHJpbnQoJ3Rlc3QnKSIsCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogInB5dGhvbl9jb2RlIiwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICBwbGFuX2NvbW1hbmQgPSBzZWxmLkNvbW1hbmQuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IFBsYW4gQ29tbWFuZCIsCiAgICAgICAgICAgICAgICAiY29kZSI6ICJ0ZXN0IHBsYW4iLAogICAgICAgICAgICAgICAgImFjdGlvbiI6ICJwbGFuIiwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBTZXQgY29tbWFuZCB0aW1lb3V0IHRvIDEwIHNlY29uZHMKICAgICAgICBzZWxmLmVudlsiaXIuY29uZmlnX3BhcmFtZXRlciJdLnN1ZG8oKS5zZXRfcGFyYW0oCiAgICAgICAgICAgICJjZXRtaXhfdG93ZXJfc2VydmVyLmNvbW1hbmRfdGltZW91dCIsICIxMCIKICAgICAgICApCgogICAgICAgICMgQ3JlYXRlIGNvbW1hbmQgbG9ncyB3aXRoIGRpZmZlcmVudCBzdGFydCB0aW1lcwogICAgICAgIG5vdyA9IERhdGV0aW1lLm5vdygpCiAgICAgICAgb2xkX3RpbWUgPSBub3cgLSB0aW1lZGVsdGEoc2Vjb25kcz0yMCkgICMgT2xkZXIgdGhhbiB0aW1lb3V0CiAgICAgICAgcmVjZW50X3RpbWUgPSBub3cgLSB0aW1lZGVsdGEoc2Vjb25kcz01KSAgIyBXaXRoaW4gdGltZW91dAoKICAgICAgICAjIENyZWF0ZSB6b21iaWUgU1NIIGNvbW1hbmQgbG9nCiAgICAgICAgem9tYmllX3NzaF9sb2cgPSBzZWxmLkNvbW1hbmRMb2cuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiY29tbWFuZF9pZCI6IHNzaF9jb21tYW5kLmlkLAogICAgICAgICAgICAgICAgInNlcnZlcl9pZCI6IHNlbGYuc2VydmVyX3Rlc3RfMS5pZCwKICAgICAgICAgICAgICAgICJzdGFydF9kYXRlIjogb2xkX3RpbWUsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgQ3JlYXRlIHpvbWJpZSBQeXRob24gY29tbWFuZCBsb2cKICAgICAgICB6b21iaWVfcHl0aG9uX2xvZyA9IHNlbGYuQ29tbWFuZExvZy5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJjb21tYW5kX2lkIjogcHl0aG9uX2NvbW1hbmQuaWQsCiAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkLAogICAgICAgICAgICAgICAgInN0YXJ0X2RhdGUiOiBvbGRfdGltZSwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBDcmVhdGUgbm9uLXpvbWJpZSBjb21tYW5kIGxvZ3MKICAgICAgICBhY3RpdmVfc3NoX2xvZyA9IHNlbGYuQ29tbWFuZExvZy5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJjb21tYW5kX2lkIjogc3NoX2NvbW1hbmQuaWQsCiAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkLAogICAgICAgICAgICAgICAgInN0YXJ0X2RhdGUiOiByZWNlbnRfdGltZSwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgcGxhbl9sb2cgPSBzZWxmLkNvbW1hbmRMb2cuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiY29tbWFuZF9pZCI6IHBsYW5fY29tbWFuZC5pZCwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWQiOiBzZWxmLnNlcnZlcl90ZXN0XzEuaWQsCiAgICAgICAgICAgICAgICAic3RhcnRfZGF0ZSI6IG9sZF90aW1lLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIFRlc3Qgd2l0aCB0aW1lb3V0IHNldAogICAgICAgIHNlbGYuc2VydmVyX3Rlc3RfMS5fY2hlY2tfem9tYmllX2NvbW1hbmRzKCkKCiAgICAgICAgIyBDaGVjayB6b21iaWUgY29tbWFuZHMgYXJlIG1hcmtlZCBhcyBmaW5pc2hlZAogICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoCiAgICAgICAgICAgIHpvbWJpZV9zc2hfbG9nLmlzX3J1bm5pbmcsICJab21iaWUgU1NIIGNvbW1hbmQgc2hvdWxkIGJlIG1hcmtlZCBhcyBmaW5pc2hlZCIKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgKICAgICAgICAgICAgem9tYmllX3B5dGhvbl9sb2cuaXNfcnVubmluZywKICAgICAgICAgICAgIlpvbWJpZSBQeXRob24gY29tbWFuZCBzaG91bGQgYmUgbWFya2VkIGFzIGZpbmlzaGVkIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgem9tYmllX3NzaF9sb2cuY29tbWFuZF9zdGF0dXMsCiAgICAgICAgICAgIENPTU1BTkRfVElNRURfT1VULAogICAgICAgICAgICAiWm9tYmllIFNTSCBjb21tYW5kIHNob3VsZCBoYXZlIHRpbWVkIG91dCBzdGF0dXMiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICB6b21iaWVfcHl0aG9uX2xvZy5jb21tYW5kX2Vycm9yLAogICAgICAgICAgICBDT01NQU5EX1RJTUVEX09VVF9NRVNTQUdFLAogICAgICAgICAgICAiWm9tYmllIFB5dGhvbiBjb21tYW5kIHNob3VsZCBoYXZlIHRpbWVvdXQgZXJyb3IgbWVzc2FnZSIsCiAgICAgICAgKQoKICAgICAgICAjIENoZWNrIG5vbi16b21iaWUgY29tbWFuZHMgYXJlIHN0aWxsIHJ1bm5pbmcKICAgICAgICBzZWxmLmFzc2VydFRydWUoCiAgICAgICAgICAgIGFjdGl2ZV9zc2hfbG9nLmlzX3J1bm5pbmcsICJSZWNlbnQgY29tbWFuZCBzaG91bGQgc3RpbGwgYmUgcnVubmluZyIKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAogICAgICAgICAgICBwbGFuX2xvZy5pc19ydW5uaW5nLCAiUGxhbiBjb21tYW5kIHNob3VsZCBub3QgYmUgYWZmZWN0ZWQgYnkgdGltZW91dCIKICAgICAgICApCgogICAgICAgICMgVGVzdCB3aXRoIHRpbWVvdXQgZGlzYWJsZWQKICAgICAgICBzZWxmLmVudlsiaXIuY29uZmlnX3BhcmFtZXRlciJdLnN1ZG8oKS5zZXRfcGFyYW0oCiAgICAgICAgICAgICJjZXRtaXhfdG93ZXJfc2VydmVyLmNvbW1hbmRfdGltZW91dCIsICIwIgogICAgICAgICkKCiAgICAgICAgIyBDcmVhdGUgbmV3IHpvbWJpZSBjb21tYW5kIGxvZwogICAgICAgIG5ld196b21iaWVfbG9nID0gc2VsZi5Db21tYW5kTG9nLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgImNvbW1hbmRfaWQiOiBzc2hfY29tbWFuZC5pZCwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWQiOiBzZWxmLnNlcnZlcl90ZXN0XzEuaWQsCiAgICAgICAgICAgICAgICAic3RhcnRfZGF0ZSI6IG9sZF90aW1lLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICBzZWxmLnNlcnZlcl90ZXN0XzEuX2NoZWNrX3pvbWJpZV9jb21tYW5kcygpCiAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbCgKICAgICAgICAgICAgbmV3X3pvbWJpZV9sb2cuY29tbWFuZF9zdGF0dXMsCiAgICAgICAgICAgIENPTU1BTkRfVElNRURfT1VULAogICAgICAgICAgICAiQ29tbWFuZHMgc2hvdWxkIG5vdCBiZSBtYXJrZWQgYXMgdGltZWQgb3V0IHdoZW4gdGltZW91dCBpcyBkaXNhYmxlZCIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X2NvbW1hbmRfd2l0aF9tYWxmb3JtZWRfY29kZShzZWxmKToKICAgICAgICAiIiJUZXN0IHJlbmRlcmluZyBjb21tYW5kIHVzaW5nIGBfcmVuZGVyX2NvbW1hbmRgIG1ldGhvZAogICAgICAgIG9mIGN4LnRvd2VyLnNlcnZlciB3aXRoIG1hbGZvcm1lZCBjb2RlCiAgICAgICAgIiIiCgogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsaWRhdGlvbkVycm9yKToKICAgICAgICAgICAgc2VsZi5Db21tYW5kLmNyZWF0ZSgKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IE1hbGZvcm1lZCBDb21tYW5kIiwKICAgICAgICAgICAgICAgICAgICAiY29kZSI6ICJjZCB7eyAhQDIzODIwMyB9fSAmJiBta2RpciAjIWN4dG93ZXIuc2VjcmV0LkZPTERFUiEjIiwKICAgICAgICAgICAgICAgICAgICAiYWN0aW9uIjogInNzaF9jb21tYW5kIiwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3NlcnZlcl9yZW5kZXJfY29tbWFuZF93aXRoX2pldChzZWxmKToKICAgICAgICAiIiJUZXN0IHJlbmRlcmluZyBjb21tYW5kIHVzaW5nIGBfcmVuZGVyX2NvbW1hbmRgIG1ldGhvZAogICAgICAgIG9mIGN4LnRvd2VyLnNlcnZlcgogICAgICAgICIiIgoKICAgICAgICAjIC0tIDEgLS0KICAgICAgICAjIFRlc3Qgd2l0aCBkZWZhdWx0IHBhdGggYW5kIGpldAogICAgICAgIHJlbmRlcmVkX2NvbW1hbmQgPSBzZWxmLnNlcnZlcl90ZXN0XzEuX3JlbmRlcl9jb21tYW5kKAogICAgICAgICAgICBjb21tYW5kPXNlbGYuY29tbWFuZF9jcmVhdGVfZGlyLAogICAgICAgICAgICBqZXRfdGVtcGxhdGU9c2VsZi5qZXRfdGVtcGxhdGVfc2FtcGxlLAogICAgICAgICAgICBqZXQ9c2VsZi5qZXRfc2FtcGxlLAogICAgICAgICkKICAgICAgICByZW5kZXJlZF9jb2RlX2V4cGVjdGVkID0gImNkIC9qZXRzL2pldDEgJiYgbWtkaXIgamV0X3RlbXBsYXRlcyIKICAgICAgICByZW5kZXJlZF9wYXRoX2V4cGVjdGVkID0gZiIvaG9tZS97c2VsZi5zZXJ2ZXJfdGVzdF8xLnNzaF91c2VybmFtZX0iCgogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHJlbmRlcmVkX2NvbW1hbmRbInJlbmRlcmVkX2NvZGUiXSwKICAgICAgICAgICAgcmVuZGVyZWRfY29kZV9leHBlY3RlZCwKICAgICAgICAgICAgIlJlbmRlcmVkIGNvZGUgZG9lc24ndCBtYXRjaCIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHJlbmRlcmVkX2NvbW1hbmRbInJlbmRlcmVkX3BhdGgiXSwKICAgICAgICAgICAgcmVuZGVyZWRfcGF0aF9leHBlY3RlZCwKICAgICAgICAgICAgIlJlbmRlcmVkIHBhdGggZG9lc24ndCBtYXRjaCIsCiAgICAgICAgKQoKICAgICAgICAjIC0tIDIgLS0KICAgICAgICAjIFRlc3Qgd2l0aCBjdXN0b20gdmFyaWFibGUgdmFsdWVzCiAgICAgICAgY3VzdG9tX3ZhcmlhYmxlX3ZhbHVlcyA9IHsidGVzdF9wYXRoXyI6ICIvc3VjaC9tdWNoL2pldCJ9CiAgICAgICAgcmVuZGVyZWRfY29tbWFuZCA9IHNlbGYuc2VydmVyX3Rlc3RfMS5fcmVuZGVyX2NvbW1hbmQoCiAgICAgICAgICAgIGNvbW1hbmQ9c2VsZi5jb21tYW5kX2NyZWF0ZV9kaXIsCiAgICAgICAgICAgIGpldF90ZW1wbGF0ZT1zZWxmLmpldF90ZW1wbGF0ZV9zYW1wbGUsCiAgICAgICAgICAgIGpldD1zZWxmLmpldF9zYW1wbGUsCiAgICAgICAgICAgIGN1c3RvbV92YXJpYWJsZV92YWx1ZXM9Y3VzdG9tX3ZhcmlhYmxlX3ZhbHVlcywKICAgICAgICApCiAgICAgICAgcmVuZGVyZWRfY29kZV9leHBlY3RlZCA9ICJjZCAvc3VjaC9tdWNoL2pldCAmJiBta2RpciBqZXRfdGVtcGxhdGVzIgogICAgICAgIHJlbmRlcmVkX3BhdGhfZXhwZWN0ZWQgPSBmIi9ob21lL3tzZWxmLnNlcnZlcl90ZXN0XzEuc3NoX3VzZXJuYW1lfSIKCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgcmVuZGVyZWRfY29tbWFuZFsicmVuZGVyZWRfY29kZSJdLAogICAgICAgICAgICByZW5kZXJlZF9jb2RlX2V4cGVjdGVkLAogICAgICAgICAgICAiUmVuZGVyZWQgY29kZSBkb2Vzbid0IG1hdGNoIiwKICAgICAgICApCg==