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

1 line
88 KiB
Python

IyBDb3B5cmlnaHQgKEMpIDIwMjQgQ2V0bWl4IE/DnAojIExpY2Vuc2UgQUdQTC0zLjAgb3IgbGF0ZXIgKGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsKS4KCmZyb20gdW5pdHRlc3QubW9jayBpbXBvcnQgcGF0Y2gKCmZyb20gb2RvbyBpbXBvcnQgZmllbGRzCmZyb20gb2Rvby5leGNlcHRpb25zIGltcG9ydCBBY2Nlc3NFcnJvciwgVmFsaWRhdGlvbkVycm9yCmZyb20gb2Rvby50b29scyBpbXBvcnQgbXV0ZV9sb2dnZXIKCmZyb20gLmNvbW1vbl9qZXRzIGltcG9ydCBUZXN0VG93ZXJKZXRzQ29tbW9uCgoKY2xhc3MgVGVzdFRvd2VySmV0KFRlc3RUb3dlckpldHNDb21tb24pOgogICAgIiIiCiAgICBUZXN0IHRoZSBKZXQgbW9kZWwgZnVuY3Rpb25hbGl0eQogICAgIiIiCgogICAgIyBBbGwgamV0LXJlbGF0ZWQgdGVzdCBkYXRhIGlzIG5vdyBpbmhlcml0ZWQgZnJvbSBUZXN0VG93ZXJKZXRzQ29tbW9uCgogICAgIyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiAgICAjICAgX29uX2lzX2F2YWlsYWJsZSBUZXN0cwogICAgIyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCgogICAgZGVmIHRlc3Rfb25faXNfYXZhaWxhYmxlX2V4cGxpY2l0X3JlcXVlc3RfbWFya2VkX3Byb2Nlc3NpbmdfYmVmb3JlX2Rpc3BhdGNoKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJlZ3Jlc3Npb246IGV4cGxpY2l0IHJlcXVlc3QgbXVzdCBiZSBhdHRhY2hlZCB0byB0aGUgamV0IGFuZCBzZXQgdG8KICAgICAgICBwcm9jZXNzaW5nIGJlZm9yZSB0cmFuc2l0aW9uIGRpc3BhdGNoIHN0YXJ0cy4KCiAgICAgICAgV2UgcGF0Y2ggX2JyaW5nX3RvX3N0YXRlICh0aGUgYWN0dWFsIGRpc3BhdGNoKSByYXRoZXIgdGhhbgogICAgICAgIF9zZXJ2ZV9qZXRfcmVxdWVzdCBzbyB0aGF0IF9zZXJ2ZV9qZXRfcmVxdWVzdCBydW5zIGZvciByZWFsIGFuZCBpdHMKICAgICAgICBzaWRlLWVmZmVjdHMgKHNlcnZlZF9qZXRfcmVxdWVzdF9pZCwgcmVxdWVzdC5zdGF0ZSkgYXJlIG9ic2VydmFibGUuCiAgICAgICAgQSBzaWRlX2VmZmVjdCBjYXB0dXJlcyBib3RoIHZhbHVlcyBhdCB0aGUgZXhhY3QgbW9tZW50IGRpc3BhdGNoIGlzCiAgICAgICAgdHJpZ2dlcmVkLCBwcm92aW5nIG9yZGVyaW5nIHJhdGhlciB0aGFuIGp1c3QgZXZlbnR1YWwgc3RhdGUuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5qZXRfdGVzdC53cml0ZSgKICAgICAgICAgICAgeyJzdGF0ZV9pZCI6IHNlbGYuc3RhdGVfaW5pdGlhbC5pZCwgInRhcmdldF9zdGF0ZV9pZCI6IEZhbHNlfQogICAgICAgICkKICAgICAgICAjIElzb2xhdGUgdGhlIHNjZW5hcmlvOiBrZWVwIG9ubHkgdGhlIHJlcXVlc3QgY3JlYXRlZCBpbiB0aGlzIHRlc3QuCiAgICAgICAgcHJlZXhpc3RpbmdfbmV3X3JlcXVlc3RzID0gc2VsZi5lbnZbImN4LnRvd2VyLmpldC5yZXF1ZXN0Il0uc2VhcmNoKAogICAgICAgICAgICBbKCJqZXRfaWQiLCAiPSIsIHNlbGYuamV0X3Rlc3QuaWQpLCAoInN0YXRlIiwgIj0iLCAibmV3IildCiAgICAgICAgKQogICAgICAgIGlmIHByZWV4aXN0aW5nX25ld19yZXF1ZXN0czoKICAgICAgICAgICAgcHJlZXhpc3RpbmdfbmV3X3JlcXVlc3RzLnVubGluaygpCiAgICAgICAgcmVxdWVzdCA9IHNlbGYuZW52WyJjeC50b3dlci5qZXQucmVxdWVzdCJdLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNlcnZlcl9pZCI6IHNlbGYuc2VydmVyX3Rlc3RfMS5pZCwKICAgICAgICAgICAgICAgICJqZXRfaWQiOiBzZWxmLmpldF90ZXN0LmlkLAogICAgICAgICAgICAgICAgImpldF90ZW1wbGF0ZV9pZCI6IHNlbGYuamV0X3Rlc3QuamV0X3RlbXBsYXRlX2lkLmlkLAogICAgICAgICAgICAgICAgInN0YXRlX3JlcXVlc3RlZF9pZCI6IHNlbGYuc3RhdGVfcnVubmluZy5pZCwKICAgICAgICAgICAgICAgICJzdGF0ZSI6ICJuZXciLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENhcHR1cmUgdGhlIG9ic2VydmFibGUgc3RhdGUgb2YgamV0ICsgcmVxdWVzdCBhdCBkaXNwYXRjaCB0aW1lLgogICAgICAgIG9ic2VydmVkID0ge30KCiAgICAgICAgZGVmIGNhcHR1cmUoamV0X3NlbGYsIHRhcmdldF9zdGF0ZSk6CiAgICAgICAgICAgIGpldF9zZWxmLmludmFsaWRhdGVfcmVjb3Jkc2V0KFsic2VydmVkX2pldF9yZXF1ZXN0X2lkIl0pCiAgICAgICAgICAgIHJlcXVlc3QuaW52YWxpZGF0ZV9yZWNvcmRzZXQoWyJzdGF0ZSJdKQogICAgICAgICAgICBvYnNlcnZlZFsic2VydmVkX3JlcXVlc3RfaWQiXSA9IGpldF9zZWxmLnNlcnZlZF9qZXRfcmVxdWVzdF9pZC5pZAogICAgICAgICAgICBvYnNlcnZlZFsicmVxdWVzdF9zdGF0ZSJdID0gcmVxdWVzdC5zdGF0ZQoKICAgICAgICB3aXRoIHBhdGNoKAogICAgICAgICAgICAib2Rvby5hZGRvbnMuY2V0bWl4X3Rvd2VyX3NlcnZlci5tb2RlbHMuY3hfdG93ZXJfamV0LkN4VG93ZXJKZXQuX2JyaW5nX3RvX3N0YXRlIiwKICAgICAgICAgICAgYXV0b3NwZWM9VHJ1ZSwKICAgICAgICAgICAgc2lkZV9lZmZlY3Q9Y2FwdHVyZSwKICAgICAgICApOgogICAgICAgICAgICBzZWxmLmpldF90ZXN0Ll9vbl9pc19hdmFpbGFibGUoKQoKICAgICAgICBzZWxmLmFzc2VydFRydWUoCiAgICAgICAgICAgIG9ic2VydmVkLAogICAgICAgICAgICAiX2JyaW5nX3RvX3N0YXRlIG11c3QgaGF2ZSBiZWVuIGNhbGxlZDsgY2hlY2sgdGhhdCB0aGUgcmVxdWVzdCAiCiAgICAgICAgICAgICJ0YXJnZXRzIGEgZGlmZmVyZW50IHN0YXRlIHRoYW4gdGhlIGpldCdzIGN1cnJlbnQgc3RhdGUiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBvYnNlcnZlZFsic2VydmVkX3JlcXVlc3RfaWQiXSwKICAgICAgICAgICAgcmVxdWVzdC5pZCwKICAgICAgICAgICAgIlJlcXVlc3QgbXVzdCBiZSBzYXZlZCB0byBzZXJ2ZWRfamV0X3JlcXVlc3RfaWQgYmVmb3JlIGRpc3BhdGNoIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgb2JzZXJ2ZWRbInJlcXVlc3Rfc3RhdGUiXSwKICAgICAgICAgICAgInByb2Nlc3NpbmciLAogICAgICAgICAgICAiUmVxdWVzdCBtdXN0IGJlIHNldCB0byAncHJvY2Vzc2luZycgYmVmb3JlIF9icmluZ190b19zdGF0ZSBpcyBjYWxsZWQiLAogICAgICAgICkKCiAgICAjICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKICAgICMgICBfY29tcHV0ZV9hdmFpbGFibGVfYWN0aW9ucyBUZXN0cwogICAgIyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCgogICAgZGVmIHRlc3RfY29tcHV0ZV9hdmFpbGFibGVfYWN0aW9uc19ub19zdGF0ZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IF9jb21wdXRlX2F2YWlsYWJsZV9hY3Rpb25zIHdoZW4gamV0IGhhcyBubyBjdXJyZW50IHN0YXRlCiAgICAgICAgIiIiCiAgICAgICAgIyBKZXQgaGFzIHRlbXBsYXRlIGJ1dCBubyBzdGF0ZQogICAgICAgIHNlbGYuamV0X3Rlc3Quc3RhdGVfaWQgPSBGYWxzZQoKICAgICAgICAjIGFjdGlvbl9hdmFpbGFibGVfaWRzIHNob3VsZCBpbmNsdWRlIG9ubHkgdGhlIGNyZWF0ZSBhY3Rpb24KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBsZW4oc2VsZi5qZXRfdGVzdC5hY3Rpb25fYXZhaWxhYmxlX2lkcyksCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgICJBdmFpbGFibGUgYWN0aW9ucyBzaG91bGQgaW5jbHVkZSBjcmVhdGUgYWN0aW9uIHdoZW4gamV0IGhhcyBubyBzdGF0ZSIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHthY3Rpb24uaWQgZm9yIGFjdGlvbiBpbiBzZWxmLmpldF90ZXN0LmFjdGlvbl9hdmFpbGFibGVfaWRzfSwKICAgICAgICAgICAge3NlbGYuYWN0aW9uX2NyZWF0ZS5pZH0sCiAgICAgICAgICAgICJBdmFpbGFibGUgYWN0aW9uIHNob3VsZCBiZSB0aGUgY3JlYXRlIGFjdGlvbiIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X2NvbXB1dGVfYXZhaWxhYmxlX2FjdGlvbnNfd2l0aF9zdGF0ZV9ydW5uaW5nKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgX2NvbXB1dGVfYXZhaWxhYmxlX2FjdGlvbnMgd2hlbiBqZXQgaGFzIHN0YXRlIHJ1bm5pbmcuCiAgICAgICAgQ3JlYXRlIGFjdGlvbiBpcyBub3QgYXZhaWxhYmxlIChubyBzdGF0ZV9mcm9tX2lkKTsgZGVzdHJveSBhbmQKICAgICAgICB0cmFuc2l0aW9uIGFjdGlvbnMgYXJlIGF2YWlsYWJsZS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmpldF90ZXN0LnN0YXRlX2lkID0gc2VsZi5zdGF0ZV9ydW5uaW5nCgogICAgICAgIGV4cGVjdGVkX2FjdGlvbnMgPSAoCiAgICAgICAgICAgIHNlbGYuYWN0aW9uX3J1bm5pbmdfdG9fc3RvcHBlZAogICAgICAgICAgICB8IHNlbGYuYWN0aW9uX3J1bm5pbmdfdG9fZXJyb3IKICAgICAgICAgICAgfCBzZWxmLmFjdGlvbl9kZXN0cm95CiAgICAgICAgKQogICAgICAgIGFjdHVhbF9pZHMgPSB7YWN0aW9uLmlkIGZvciBhY3Rpb24gaW4gc2VsZi5qZXRfdGVzdC5hY3Rpb25fYXZhaWxhYmxlX2lkc30KCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbGVuKGFjdHVhbF9pZHMpLAogICAgICAgICAgICAzLAogICAgICAgICAgICAiU2hvdWxkIGhhdmUgMyBhdmFpbGFibGUgYWN0aW9ucyBmcm9tIHJ1bm5pbmcgc3RhdGUiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydE5vdEluKAogICAgICAgICAgICBzZWxmLmFjdGlvbl9jcmVhdGUuaWQsCiAgICAgICAgICAgIGFjdHVhbF9pZHMsCiAgICAgICAgICAgICJDcmVhdGUgYWN0aW9uIHNob3VsZCBub3QgYmUgYXZhaWxhYmxlIHdoZW4gamV0IGhhcyBzdGF0ZSIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgIHNlbGYuYWN0aW9uX2Rlc3Ryb3kuaWQsCiAgICAgICAgICAgIGFjdHVhbF9pZHMsCiAgICAgICAgICAgICJEZXN0cm95IGFjdGlvbiBzaG91bGQgYmUgYXZhaWxhYmxlIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgYWN0dWFsX2lkcywKICAgICAgICAgICAge2FjdGlvbi5pZCBmb3IgYWN0aW9uIGluIGV4cGVjdGVkX2FjdGlvbnN9LAogICAgICAgICAgICAiU2hvdWxkIGhhdmUgZXhhY3Qgc2V0OiBydW5uaW5nX3RvX3N0b3BwZWQsIHJ1bm5pbmdfdG9fZXJyb3IsIGRlc3Ryb3kiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9jb21wdXRlX2F2YWlsYWJsZV9hY3Rpb25zX2NvbXBsZXhfc2NlbmFyaW8oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCBfY29tcHV0ZV9hdmFpbGFibGVfYWN0aW9ucyB3aXRoIGNvbXBsZXggc2NlbmFyaW8KICAgICAgICAiIiIKICAgICAgICAjIFVzZSBjb21tb24gYWN0aW9ucyBmcm9tIHNldHVwCgogICAgICAgICMgVGVzdCBkaWZmZXJlbnQgc3RhdGVzCiAgICAgICAgdGVzdF9jYXNlcyA9IFsKICAgICAgICAgICAgKHNlbGYuc3RhdGVfaW5pdGlhbCwgW3NlbGYuYWN0aW9uX2luaXRpYWxfdG9fcnVubmluZ10pLAogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICBzZWxmLnN0YXRlX3J1bm5pbmcsCiAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hY3Rpb25fcnVubmluZ190b19zdG9wcGVkLAogICAgICAgICAgICAgICAgICAgIHNlbGYuYWN0aW9uX3J1bm5pbmdfdG9fZXJyb3IsCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hY3Rpb25fZGVzdHJveSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICksCiAgICAgICAgICAgIChzZWxmLnN0YXRlX3N0b3BwZWQsIFtzZWxmLmFjdGlvbl9zdG9wcGVkX3RvX3J1bm5pbmddKSwKICAgICAgICAgICAgKHNlbGYuc3RhdGVfZXJyb3IsIFtzZWxmLmFjdGlvbl9lcnJvcl90b19ydW5uaW5nXSksCiAgICAgICAgXQoKICAgICAgICBmb3Igc3RhdGUsIGV4cGVjdGVkX2FjdGlvbnMgaW4gdGVzdF9jYXNlczoKICAgICAgICAgICAgc2VsZi5qZXRfdGVzdC5zdGF0ZV9pZCA9IHN0YXRlCiAgICAgICAgICAgIGFjdHVhbF9hY3Rpb25zID0gc2VsZi5qZXRfdGVzdC5hY3Rpb25fYXZhaWxhYmxlX2lkcwogICAgICAgICAgICBleHBlY3RlZF9hY3Rpb25zX3NldCA9IHthY3Rpb24uaWQgZm9yIGFjdGlvbiBpbiBleHBlY3RlZF9hY3Rpb25zfQogICAgICAgICAgICBhY3R1YWxfYWN0aW9uc19zZXQgPSB7YWN0aW9uLmlkIGZvciBhY3Rpb24gaW4gYWN0dWFsX2FjdGlvbnN9CgogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICAgICAgYWN0dWFsX2FjdGlvbnNfc2V0LAogICAgICAgICAgICAgICAgZXhwZWN0ZWRfYWN0aW9uc19zZXQsCiAgICAgICAgICAgICAgICBmIlN0YXRlIHtzdGF0ZS5uYW1lfSBzaG91bGQgaGF2ZSBjb3JyZWN0IGF2YWlsYWJsZSBhY3Rpb25zIiwKICAgICAgICAgICAgKQoKICAgIGRlZiB0ZXN0X2NvbXB1dGVfYXZhaWxhYmxlX2FjdGlvbnNfZGVwZW5kZW5jaWVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgdGhhdCBfY29tcHV0ZV9hdmFpbGFibGVfYWN0aW9ucyBoYXMgY29ycmVjdCBkZXBlbmRlbmNpZXMKICAgICAgICAiIiIKICAgICAgICAjIFVzZSBleGlzdGluZyBhY3Rpb24gZnJvbSBjb21tb24gc2V0dXAKICAgICAgICBhY3Rpb24gPSBzZWxmLmFjdGlvbl9ydW5uaW5nX3RvX3N0b3BwZWQKCiAgICAgICAgIyBTZXQgaW5pdGlhbCBzdGF0ZQogICAgICAgIHNlbGYuamV0X3Rlc3Quc3RhdGVfaWQgPSBzZWxmLnN0YXRlX3J1bm5pbmcKICAgICAgICAjIFNob3VsZCBoYXZlIGFsbCBhY3Rpb25zIGZyb20gcnVubmluZyBzdGF0ZQogICAgICAgIGV4cGVjdGVkX2FjdGlvbnMgPSAoCiAgICAgICAgICAgIHNlbGYuYWN0aW9uX3J1bm5pbmdfdG9fc3RvcHBlZAogICAgICAgICAgICB8IHNlbGYuYWN0aW9uX3J1bm5pbmdfdG9fZXJyb3IKICAgICAgICAgICAgfCBzZWxmLmFjdGlvbl9kZXN0cm95CiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHthY3Rpb24uaWQgZm9yIGFjdGlvbiBpbiBzZWxmLmpldF90ZXN0LmFjdGlvbl9hdmFpbGFibGVfaWRzfSwKICAgICAgICAgICAge2FjdGlvbi5pZCBmb3IgYWN0aW9uIGluIGV4cGVjdGVkX2FjdGlvbnN9LAogICAgICAgICAgICAiU2hvdWxkIGhhdmUgYWxsIGFjdGlvbnMgZnJvbSBydW5uaW5nIHN0YXRlIGluaXRpYWxseSIsCiAgICAgICAgKQoKICAgICAgICAjIENoYW5nZSBhY3Rpb24ncyBzdGF0ZV9mcm9tX2lkICh0aGlzIHNob3VsZCB0cmlnZ2VyIHJlY29tcHV0YXRpb24pCiAgICAgICAgYWN0aW9uLnN0YXRlX2Zyb21faWQgPSBzZWxmLnN0YXRlX3N0b3BwZWQKCiAgICAgICAgIyBKZXQgc2hvdWxkIG5vIGxvbmdlciBoYXZlIHRoaXMgc3BlY2lmaWMgYWN0aW9uIGF2YWlsYWJsZQogICAgICAgICMgYnV0IHNob3VsZCBzdGlsbCBoYXZlIG90aGVyIGFjdGlvbnMgZnJvbSBydW5uaW5nIHN0YXRlCiAgICAgICAgZXhwZWN0ZWRfcmVtYWluaW5nX2FjdGlvbnMgPSBzZWxmLmFjdGlvbl9ydW5uaW5nX3RvX2Vycm9yIHwgc2VsZi5hY3Rpb25fZGVzdHJveQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHthY3Rpb24uaWQgZm9yIGFjdGlvbiBpbiBzZWxmLmpldF90ZXN0LmFjdGlvbl9hdmFpbGFibGVfaWRzfSwKICAgICAgICAgICAge2FjdGlvbi5pZCBmb3IgYWN0aW9uIGluIGV4cGVjdGVkX3JlbWFpbmluZ19hY3Rpb25zfSwKICAgICAgICAgICAgIlNob3VsZCBoYXZlIHJlbWFpbmluZyBhY3Rpb25zIGFmdGVyIGNoYW5naW5nIG9uZSBhY3Rpb24ncyBzdGF0ZV9mcm9tX2lkIiwKICAgICAgICApCgogICAgICAgICMgQ2hhbmdlIGpldCBzdGF0ZSB0byBtYXRjaCBhY3Rpb24ncyBuZXcgc3RhdGVfZnJvbV9pZAogICAgICAgIHNlbGYuamV0X3Rlc3Quc3RhdGVfaWQgPSBzZWxmLnN0YXRlX3N0b3BwZWQKCiAgICAgICAgIyBOb3cgdGhlIG1vZGlmaWVkIGFjdGlvbiBzaG91bGQgYmUgYXZhaWxhYmxlIGFnYWluLAogICAgICAgICMgcGx1cyBhbnkgb3RoZXIgYWN0aW9ucyBmcm9tIHN0b3BwZWQgc3RhdGUKICAgICAgICBleHBlY3RlZF9hY3Rpb25zID0gYWN0aW9uIHwgc2VsZi5hY3Rpb25fc3RvcHBlZF90b19ydW5uaW5nCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAge2FjdGlvbi5pZCBmb3IgYWN0aW9uIGluIHNlbGYuamV0X3Rlc3QuYWN0aW9uX2F2YWlsYWJsZV9pZHN9LAogICAgICAgICAgICB7YWN0aW9uLmlkIGZvciBhY3Rpb24gaW4gZXhwZWN0ZWRfYWN0aW9uc30sCiAgICAgICAgICAgICJTaG91bGQgaGF2ZSB0aGUgbW9kaWZpZWQgYWN0aW9uIHBsdXMgb3RoZXIgYWN0aW9ucyBmcm9tIHN0b3BwZWQgc3RhdGUiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9jb21wdXRlX2F2YWlsYWJsZV9hY3Rpb25zX2Nyb3NzX3RlbXBsYXRlX2lzb2xhdGlvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHRoYXQgamV0cyBvbmx5IHNlZSBhY3Rpb25zIGZyb20gdGhlaXIgb3duIHRlbXBsYXRlCiAgICAgICAgIiIiCiAgICAgICAgIyBDcmVhdGUgYWN0aW9uIGZvciBPZG9vIHRlbXBsYXRlCiAgICAgICAgb2Rvb19hY3Rpb24gPSBzZWxmLkpldEFjdGlvbi5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIk9kb28gQWN0aW9uIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAib2Rvb19hY3Rpb24iLAogICAgICAgICAgICAgICAgImpldF90ZW1wbGF0ZV9pZCI6IHNlbGYuamV0X3RlbXBsYXRlX29kb28uaWQsCiAgICAgICAgICAgICAgICAic3RhdGVfZnJvbV9pZCI6IHNlbGYuc3RhdGVfcnVubmluZy5pZCwKICAgICAgICAgICAgICAgICJzdGF0ZV90b19pZCI6IHNlbGYuc3RhdGVfc3RvcHBlZC5pZCwKICAgICAgICAgICAgICAgICJzdGF0ZV90cmFuc2l0X2lkIjogc2VsZi5zdGF0ZV9zdG9wcGluZy5pZCwKICAgICAgICAgICAgICAgICJwcmlvcml0eSI6IDEwLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENyZWF0ZSBhY3Rpb24gZm9yIFdvcmRQcmVzcyB0ZW1wbGF0ZQogICAgICAgIHdwX2FjdGlvbiA9IHNlbGYuSmV0QWN0aW9uLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiV29yZFByZXNzIEFjdGlvbiIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIndvcmRwcmVzc19hY3Rpb24iLAogICAgICAgICAgICAgICAgImpldF90ZW1wbGF0ZV9pZCI6IHNlbGYuamV0X3RlbXBsYXRlX3dvcmRwcmVzcy5pZCwKICAgICAgICAgICAgICAgICJzdGF0ZV9mcm9tX2lkIjogc2VsZi5zdGF0ZV9ydW5uaW5nLmlkLAogICAgICAgICAgICAgICAgInN0YXRlX3RvX2lkIjogc2VsZi5zdGF0ZV9zdG9wcGVkLmlkLAogICAgICAgICAgICAgICAgInN0YXRlX3RyYW5zaXRfaWQiOiBzZWxmLnN0YXRlX3N0b3BwaW5nLmlkLAogICAgICAgICAgICAgICAgInByaW9yaXR5IjogMTAsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgU2V0IGJvdGggamV0cyB0byBydW5uaW5nIHN0YXRlCiAgICAgICAgc2VsZi5qZXRfb2Rvby5zdGF0ZV9pZCA9IHNlbGYuc3RhdGVfcnVubmluZwogICAgICAgIHNlbGYuamV0X3dvcmRwcmVzcy5zdGF0ZV9pZCA9IHNlbGYuc3RhdGVfcnVubmluZwoKICAgICAgICAjIEVhY2ggamV0IHNob3VsZCBvbmx5IHNlZSBpdHMgb3duIHRlbXBsYXRlJ3MgYWN0aW9ucwogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHthY3Rpb24uaWQgZm9yIGFjdGlvbiBpbiBzZWxmLmpldF9vZG9vLmFjdGlvbl9hdmFpbGFibGVfaWRzfSwKICAgICAgICAgICAge29kb29fYWN0aW9uLmlkfSwKICAgICAgICAgICAgIk9kb28gamV0IHNob3VsZCBvbmx5IHNlZSBPZG9vIGFjdGlvbnMiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICB7YWN0aW9uLmlkIGZvciBhY3Rpb24gaW4gc2VsZi5qZXRfd29yZHByZXNzLmFjdGlvbl9hdmFpbGFibGVfaWRzfSwKICAgICAgICAgICAge3dwX2FjdGlvbi5pZH0sCiAgICAgICAgICAgICJXb3JkUHJlc3MgamV0IHNob3VsZCBvbmx5IHNlZSBXb3JkUHJlc3MgYWN0aW9ucyIsCiAgICAgICAgKQoKICAgICAgICAjIE9kb28gamV0IHNob3VsZCBub3Qgc2VlIFdvcmRQcmVzcyBhY3Rpb25zCiAgICAgICAgc2VsZi5hc3NlcnROb3RJbigKICAgICAgICAgICAgd3BfYWN0aW9uLmlkLAogICAgICAgICAgICB7YWN0aW9uLmlkIGZvciBhY3Rpb24gaW4gc2VsZi5qZXRfb2Rvby5hY3Rpb25fYXZhaWxhYmxlX2lkc30sCiAgICAgICAgICAgICJPZG9vIGpldCBzaG91bGQgbm90IHNlZSBXb3JkUHJlc3MgYWN0aW9ucyIsCiAgICAgICAgKQogICAgICAgICMgV29yZFByZXNzIGpldCBzaG91bGQgbm90IHNlZSBPZG9vIGFjdGlvbnMKICAgICAgICBzZWxmLmFzc2VydE5vdEluKAogICAgICAgICAgICBvZG9vX2FjdGlvbi5pZCwKICAgICAgICAgICAge2FjdGlvbi5pZCBmb3IgYWN0aW9uIGluIHNlbGYuamV0X3dvcmRwcmVzcy5hY3Rpb25fYXZhaWxhYmxlX2lkc30sCiAgICAgICAgICAgICJXb3JkUHJlc3MgamV0IHNob3VsZCBub3Qgc2VlIE9kb28gYWN0aW9ucyIsCiAgICAgICAgKQoKICAgICMgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogICAgIyAgIENvbXBsZXggVGVtcGxhdGUgSGllcmFyY2h5IFRlc3RzCiAgICAjICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKCiAgICBkZWYgdGVzdF9qZXRfdGVtcGxhdGVfZG9tYWluX2NvbXB1dGF0aW9uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgX2NvbXB1dGVfamV0X3RlbXBsYXRlX2RvbWFpbiBtZXRob2QKICAgICAgICAiIiIKICAgICAgICAjIFRlc3Qgd2l0aCBzZXJ2ZXIgc2V0CiAgICAgICAgamV0X3dpdGhfc2VydmVyID0gc2VsZi5KZXQuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJKZXQgV2l0aCBTZXJ2ZXIiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJqZXRfd2l0aF9zZXJ2ZXIiLAogICAgICAgICAgICAgICAgImpldF90ZW1wbGF0ZV9pZCI6IHNlbGYuamV0X3RlbXBsYXRlX3Rlc3QuaWQsCiAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIGRvbWFpbiA9IGpldF93aXRoX3NlcnZlci5qZXRfdGVtcGxhdGVfZG9tYWluCiAgICAgICAgZXhwZWN0ZWRfZG9tYWluID0gWygic2VydmVyX2lkcyIsICJpbiIsIFtzZWxmLnNlcnZlcl90ZXN0XzEuaWRdKV0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRvbWFpbiwgZXhwZWN0ZWRfZG9tYWluLCAiRG9tYWluIHNob3VsZCBpbmNsdWRlIHNlcnZlciBmaWx0ZXIiKQoKICAgICAgICAjIFRlc3QgZG9tYWluIGNvbXB1dGF0aW9uIHdpdGggYSBkaWZmZXJlbnQgc2VydmVyCiAgICAgICAgc2VydmVyX3Rlc3RfMiA9IHNlbGYuU2VydmVyLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBTZXJ2ZXIgMiIsCiAgICAgICAgICAgICAgICAiaXBfdjRfYWRkcmVzcyI6ICIxOTIuMTY4LjEuMiIsCiAgICAgICAgICAgICAgICAic3NoX3VzZXJuYW1lIjogImFkbWluIiwKICAgICAgICAgICAgICAgICJzc2hfcGFzc3dvcmQiOiAicGFzc3dvcmQiLAogICAgICAgICAgICAgICAgInNzaF9hdXRoX21vZGUiOiAicCIsCiAgICAgICAgICAgICAgICAiaG9zdF9rZXkiOiAidGVzdF9rZXlfMiIsCiAgICAgICAgICAgICAgICAib3NfaWQiOiBzZWxmLm9zX2RlYmlhbl8xMC5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICBqZXRfd2l0aF9kaWZmZXJlbnRfc2VydmVyID0gc2VsZi5KZXQuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJKZXQgV2l0aCBEaWZmZXJlbnQgU2VydmVyIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiamV0X3dpdGhfZGlmZmVyZW50X3NlcnZlciIsCiAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2lkIjogc2VsZi5qZXRfdGVtcGxhdGVfdGVzdC5pZCwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWQiOiBzZXJ2ZXJfdGVzdF8yLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIGRvbWFpbiA9IGpldF93aXRoX2RpZmZlcmVudF9zZXJ2ZXIuamV0X3RlbXBsYXRlX2RvbWFpbgogICAgICAgIGV4cGVjdGVkX2RvbWFpbiA9IFsoInNlcnZlcl9pZHMiLCAiaW4iLCBbc2VydmVyX3Rlc3RfMi5pZF0pXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGRvbWFpbiwKICAgICAgICAgICAgZXhwZWN0ZWRfZG9tYWluLAogICAgICAgICAgICAiRG9tYWluIHNob3VsZCBpbmNsdWRlIHNlcnZlciBmaWx0ZXIgZm9yIGRpZmZlcmVudCBzZXJ2ZXIiLAogICAgICAgICkKCiAgICAgICAgIyBUZXN0IHRoZSBkb21haW4gY29tcHV0YXRpb24gbWV0aG9kIGRpcmVjdGx5IHRvIHZlcmlmeSB0aGUgZWxzZSBicmFuY2gKICAgICAgICAjIENyZWF0ZSBhIHRlbXBvcmFyeSBqZXQgb2JqZWN0IHRvIHRlc3QgdGhlIG1ldGhvZCB3aXRob3V0IHNhdmluZwogICAgICAgIHRlbXBfamV0ID0gc2VsZi5KZXQubmV3KAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZW1wIEpldCIsCiAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2lkIjogc2VsZi5qZXRfdGVtcGxhdGVfdGVzdC5pZCwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWQiOiBGYWxzZSwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICB0ZW1wX2pldC5fY29tcHV0ZV9qZXRfdGVtcGxhdGVfZG9tYWluKCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICB0ZW1wX2pldC5qZXRfdGVtcGxhdGVfZG9tYWluLAogICAgICAgICAgICBbXSwKICAgICAgICAgICAgIkRvbWFpbiBzaG91bGQgYmUgZW1wdHkgd2hlbiBzZXJ2ZXJfaWQgaXMgRmFsc2UiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9qZXRfcmVxdWlyZXNfaWRzX2NvbXB1dGF0aW9uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgX2NvbXB1dGVfamV0X3JlcXVpcmVzX2lkcyBtZXRob2Qgd2l0aCBjb21wbGV4IGRlcGVuZGVuY2llcwogICAgICAgICIiIgogICAgICAgICMgVGVzdCBPZG9vIGpldCBkZXBlbmRlbmNpZXMKICAgICAgICBvZG9vX2RlcHMgPSBzZWxmLmpldF9vZG9vLmpldF9yZXF1aXJlc19pZHMKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBsZW4ob2Rvb19kZXBzKSwgMiwgIk9kb28gamV0IHNob3VsZCBoYXZlIDIgZGlyZWN0IGRlcGVuZGVuY2llcyIKICAgICAgICApCgogICAgICAgICMgQ2hlY2sgdGhhdCBkZXBlbmRlbmNpZXMgYXJlIGZvciBwb3N0Z3JlcyBhbmQgbmdpbngKICAgICAgICBkZXBfdGVtcGxhdGVfaWRzID0gb2Rvb19kZXBzLm1hcHBlZCgKICAgICAgICAgICAgImpldF90ZW1wbGF0ZV9kZXBlbmRlbmN5X2lkLnRlbXBsYXRlX3JlcXVpcmVkX2lkLmlkIgogICAgICAgICkKICAgICAgICBleHBlY3RlZF9pZHMgPSB7c2VsZi5qZXRfdGVtcGxhdGVfcG9zdGdyZXMuaWQsIHNlbGYuamV0X3RlbXBsYXRlX25naW54LmlkfQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHNldChkZXBfdGVtcGxhdGVfaWRzKSwgZXhwZWN0ZWRfaWRzLCAiU2hvdWxkIGRlcGVuZCBvbiBwb3N0Z3JlcyBhbmQgbmdpbngiCiAgICAgICAgKQoKICAgICAgICAjIFRlc3QgV29vQ29tbWVyY2UgamV0IGRlcGVuZGVuY2llcwogICAgICAgICMgKHNob3VsZCBpbmNsdWRlIGJvdGggT2RvbyBhbmQgV29yZFByZXNzIGRlcHMpCiAgICAgICAgd29vY29tbWVyY2VfZGVwcyA9IHNlbGYuamV0X3dvb2NvbW1lcmNlLmpldF9yZXF1aXJlc19pZHMKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBsZW4od29vY29tbWVyY2VfZGVwcyksCiAgICAgICAgICAgIDIsCiAgICAgICAgICAgICJXb29Db21tZXJjZSBqZXQgc2hvdWxkIGhhdmUgMiBkaXJlY3QgZGVwZW5kZW5jaWVzIiwKICAgICAgICApCgogICAgICAgICMgQ2hlY2sgdGhhdCBkZXBlbmRlbmNpZXMgYXJlIGZvciB3b3JkcHJlc3MgYW5kIG9kb28KICAgICAgICBkZXBfdGVtcGxhdGVfaWRzID0gd29vY29tbWVyY2VfZGVwcy5tYXBwZWQoCiAgICAgICAgICAgICJqZXRfdGVtcGxhdGVfZGVwZW5kZW5jeV9pZC50ZW1wbGF0ZV9yZXF1aXJlZF9pZC5pZCIKICAgICAgICApCiAgICAgICAgZXhwZWN0ZWRfaWRzID0ge3NlbGYuamV0X3RlbXBsYXRlX3dvcmRwcmVzcy5pZCwgc2VsZi5qZXRfdGVtcGxhdGVfb2Rvby5pZH0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBzZXQoZGVwX3RlbXBsYXRlX2lkcyksIGV4cGVjdGVkX2lkcywgIlNob3VsZCBkZXBlbmQgb24gd29yZHByZXNzIGFuZCBvZG9vIgogICAgICAgICkKCiAgICBkZWYgdGVzdF9qZXRfbGltaXRfcGVyX3NlcnZlcl9zYW1lX3NlcnZlcl9yZWplY3RlZChzZWxmKToKICAgICAgICAiIiJDb25zdHJhaW50IHJlamVjdHMgY3JlYXRpbmcgbW9yZSBqZXRzIHRoYW4gdGVtcGxhdGUgbGltaXQgcGVyIHNlcnZlci4iIiIKICAgICAgICB0ZW1wbGF0ZSA9IHNlbGYuSmV0VGVtcGxhdGUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZW1wbGF0ZSBXaXRoIExpbWl0IiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAidGVtcGxhdGVfd2l0aF9saW1pdCIsCiAgICAgICAgICAgICAgICAibGltaXRfcGVyX3NlcnZlciI6IDEsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgc2VsZi5KZXQuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJMaW1pdGVkIEpldCAxIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAibGltaXRlZF9qZXRfMSIsCiAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2lkIjogdGVtcGxhdGUuaWQsCiAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVmFsaWRhdGlvbkVycm9yLCAiSmV0IGxpbWl0IHBlciBzZXJ2ZXIgcmVhY2hlZCIpOgogICAgICAgICAgICBzZWxmLkpldC5jcmVhdGUoCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiTGltaXRlZCBKZXQgMiIsCiAgICAgICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJsaW1pdGVkX2pldF8yIiwKICAgICAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2lkIjogdGVtcGxhdGUuaWQsCiAgICAgICAgICAgICAgICAgICAgInNlcnZlcl9pZCI6IHNlbGYuc2VydmVyX3Rlc3RfMS5pZCwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKQoKICAgIGRlZiB0ZXN0X2pldF9saW1pdF9wZXJfc2VydmVyX2RpZmZlcmVudF9zZXJ2ZXJzX2FsbG93ZWQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQ29uc3RyYWludCBhbGxvd3Mgc2FtZSB0ZW1wbGF0ZSBvbiBkaWZmZXJlbnQgc2VydmVycwogICAgICAgIGJ1dCB3aXRoaW4gcGVyLXNlcnZlciBsaW1pdC4KICAgICAgICAiIiIKICAgICAgICB0ZW1wbGF0ZSA9IHNlbGYuSmV0VGVtcGxhdGUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZW1wbGF0ZSBXaXRoIFBlci1TZXJ2ZXIgTGltaXQiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJ0ZW1wbGF0ZV93aXRoX3Blcl9zZXJ2ZXJfbGltaXQiLAogICAgICAgICAgICAgICAgImxpbWl0X3Blcl9zZXJ2ZXIiOiAxLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHNlcnZlcl90ZXN0XzIgPSBzZWxmLlNlcnZlci5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIkpldCBMaW1pdCBUZXN0IFNlcnZlciAyIiwKICAgICAgICAgICAgICAgICJpcF92NF9hZGRyZXNzIjogIjE5Mi4xNjguMS4yMiIsCiAgICAgICAgICAgICAgICAic3NoX3VzZXJuYW1lIjogImFkbWluIiwKICAgICAgICAgICAgICAgICJzc2hfcGFzc3dvcmQiOiAicGFzc3dvcmQiLAogICAgICAgICAgICAgICAgInNzaF9hdXRoX21vZGUiOiAicCIsCiAgICAgICAgICAgICAgICAiaG9zdF9rZXkiOiAiamV0X2xpbWl0X3Rlc3Rfc2VydmVyXzJfa2V5IiwKICAgICAgICAgICAgICAgICJvc19pZCI6IHNlbGYub3NfZGViaWFuXzEwLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICBqZXRfb25fc2VydmVyXzEgPSBzZWxmLkpldC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIkxpbWl0ZWQgSmV0IFNlcnZlciAxIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAibGltaXRlZF9qZXRfc2VydmVyXzEiLAogICAgICAgICAgICAgICAgImpldF90ZW1wbGF0ZV9pZCI6IHRlbXBsYXRlLmlkLAogICAgICAgICAgICAgICAgInNlcnZlcl9pZCI6IHNlbGYuc2VydmVyX3Rlc3RfMS5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICBqZXRfb25fc2VydmVyXzIgPSBzZWxmLkpldC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIkxpbWl0ZWQgSmV0IFNlcnZlciAyIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAibGltaXRlZF9qZXRfc2VydmVyXzIiLAogICAgICAgICAgICAgICAgImpldF90ZW1wbGF0ZV9pZCI6IHRlbXBsYXRlLmlkLAogICAgICAgICAgICAgICAgInNlcnZlcl9pZCI6IHNlcnZlcl90ZXN0XzIuaWQsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKICAgICAgICAgICAgamV0X29uX3NlcnZlcl8xLmV4aXN0cygpLCAiSmV0IG9uIGZpcnN0IHNlcnZlciBzaG91bGQgYmUgY3JlYXRlZCIKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAogICAgICAgICAgICBqZXRfb25fc2VydmVyXzIuZXhpc3RzKCksICJKZXQgb24gc2Vjb25kIHNlcnZlciBzaG91bGQgYmUgY3JlYXRlZCIKICAgICAgICApCgogICAgZGVmIHRlc3RfamV0X3JlcXVpcmVzX2lkc190ZW1wbGF0ZV9jaGFuZ2Uoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCBfY29tcHV0ZV9qZXRfcmVxdWlyZXNfaWRzIGZvciBkaWZmZXJlbnQgdGVtcGxhdGVzCiAgICAgICAgIiIiCiAgICAgICAgIyBDcmVhdGUgamV0cyBmb3IgZGlmZmVyZW50IHRlbXBsYXRlcwogICAgICAgIGpldF90b3dlcl9jb3JlID0gc2VsZi5KZXQuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUb3dlciBDb3JlIEpldCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogInRvd2VyX2NvcmVfamV0IiwKICAgICAgICAgICAgICAgICJqZXRfdGVtcGxhdGVfaWQiOiBzZWxmLmpldF90ZW1wbGF0ZV90b3dlcl9jb3JlLmlkLAogICAgICAgICAgICAgICAgInNlcnZlcl9pZCI6IHNlbGYuc2VydmVyX3Rlc3RfMS5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBsZW4oamV0X3Rvd2VyX2NvcmUuamV0X3JlcXVpcmVzX2lkcyksCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJUb3dlciBjb3JlIHNob3VsZCBoYXZlIG5vIGRlcGVuZGVuY2llcyIsCiAgICAgICAgKQoKICAgICAgICBqZXRfb2RvbyA9IHNlbGYuSmV0LmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiT2RvbyBKZXQgVGVzdCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIm9kb29famV0X3Rlc3QiLAogICAgICAgICAgICAgICAgImpldF90ZW1wbGF0ZV9pZCI6IHNlbGYuamV0X3RlbXBsYXRlX29kb28uaWQsCiAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGxlbihqZXRfb2Rvby5qZXRfcmVxdWlyZXNfaWRzKSwgMiwgIk9kb28gc2hvdWxkIGhhdmUgMiBkZXBlbmRlbmNpZXMiCiAgICAgICAgKQoKICAgICAgICBqZXRfd29vY29tbWVyY2UgPSBzZWxmLkpldC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIldvb0NvbW1lcmNlIEpldCBUZXN0IiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAid29vY29tbWVyY2VfamV0X3Rlc3QiLAogICAgICAgICAgICAgICAgImpldF90ZW1wbGF0ZV9pZCI6IHNlbGYuamV0X3RlbXBsYXRlX3dvb2NvbW1lcmNlX29kb28uaWQsCiAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGxlbihqZXRfd29vY29tbWVyY2UuamV0X3JlcXVpcmVzX2lkcyksCiAgICAgICAgICAgIDIsCiAgICAgICAgICAgICJXb29Db21tZXJjZSBzaG91bGQgaGF2ZSAyIGRlcGVuZGVuY2llcyIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X2pldF9yZXF1aXJlc19pZHNfZGVwZW5kZW5jeV9yZW1vdmFsKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgX2NvbXB1dGVfamV0X3JlcXVpcmVzX2lkcyB3aGVuIHRlbXBsYXRlIGRlcGVuZGVuY2llcyBhcmUgcmVtb3ZlZAogICAgICAgICIiIgogICAgICAgICMgQ3JlYXRlIGpldCB3aXRoIE9kb28gdGVtcGxhdGUKICAgICAgICBqZXRfb2RvbyA9IHNlbGYuSmV0LmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiT2RvbyBKZXQgVGVzdCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIm9kb29famV0X3Rlc3QiLAogICAgICAgICAgICAgICAgImpldF90ZW1wbGF0ZV9pZCI6IHNlbGYuamV0X3RlbXBsYXRlX29kb28uaWQsCiAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIGluaXRpYWxfZGVwcyA9IGxlbihqZXRfb2Rvby5qZXRfcmVxdWlyZXNfaWRzKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5pdGlhbF9kZXBzLCAyLCAiU2hvdWxkIGhhdmUgMiBkZXBlbmRlbmNpZXMgaW5pdGlhbGx5IikKCiAgICAgICAgIyBSZW1vdmUgb25lIGRlcGVuZGVuY3kgZnJvbSB0ZW1wbGF0ZQogICAgICAgIHBvc3RncmVzX2RlcCA9IHNlbGYuSmV0VGVtcGxhdGVEZXBlbmRlbmN5LnNlYXJjaCgKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgKCJ0ZW1wbGF0ZV9pZCIsICI9Iiwgc2VsZi5qZXRfdGVtcGxhdGVfb2Rvby5pZCksCiAgICAgICAgICAgICAgICAoInRlbXBsYXRlX3JlcXVpcmVkX2lkIiwgIj0iLCBzZWxmLmpldF90ZW1wbGF0ZV9wb3N0Z3Jlcy5pZCksCiAgICAgICAgICAgIF0KICAgICAgICApCiAgICAgICAgcG9zdGdyZXNfZGVwLnVubGluaygpCgogICAgICAgICMgSmV0IGRlcGVuZGVuY2llcyBzaG91bGQgYmUgdXBkYXRlZAogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGxlbihqZXRfb2Rvby5qZXRfcmVxdWlyZXNfaWRzKSwgMSwgIlNob3VsZCBoYXZlIDEgZGVwZW5kZW5jeSBhZnRlciByZW1vdmFsIgogICAgICAgICkKICAgICAgICByZW1haW5pbmdfZGVwID0gamV0X29kb28uamV0X3JlcXVpcmVzX2lkc1swXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHJlbWFpbmluZ19kZXAuamV0X3RlbXBsYXRlX2RlcGVuZGVuY3lfaWQudGVtcGxhdGVfcmVxdWlyZWRfaWQsCiAgICAgICAgICAgIHNlbGYuamV0X3RlbXBsYXRlX25naW54LAogICAgICAgICAgICAiUmVtYWluaW5nIGRlcGVuZGVuY3kgc2hvdWxkIGJlIG5naW54IiwKICAgICAgICApCgogICAgZGVmIHRlc3RfamV0X3JlcXVpcmVzX2lkc19kZXBlbmRlbmN5X2FkZGl0aW9uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgX2NvbXB1dGVfamV0X3JlcXVpcmVzX2lkcyB3aGVuIHRlbXBsYXRlIGRlcGVuZGVuY2llcyBhcmUgYWRkZWQKICAgICAgICAiIiIKICAgICAgICAjIENyZWF0ZSBqZXQgd2l0aCB0b3dlciBjb3JlIChubyBkZXBlbmRlbmNpZXMpCiAgICAgICAgamV0X3Rvd2VyX2NvcmUgPSBzZWxmLkpldC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRvd2VyIENvcmUgSmV0IiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAidG93ZXJfY29yZV9qZXQiLAogICAgICAgICAgICAgICAgImpldF90ZW1wbGF0ZV9pZCI6IHNlbGYuamV0X3RlbXBsYXRlX3Rvd2VyX2NvcmUuaWQsCiAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGxlbihqZXRfdG93ZXJfY29yZS5qZXRfcmVxdWlyZXNfaWRzKSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgIlNob3VsZCBoYXZlIG5vIGRlcGVuZGVuY2llcyBpbml0aWFsbHkiLAogICAgICAgICkKCiAgICAgICAgIyBBZGQgZGVwZW5kZW5jeSB0byB0b3dlciBjb3JlCiAgICAgICAgIyAodXNlIGEgdGVtcGxhdGUgdGhhdCB3b24ndCBjcmVhdGUgY2lyY3VsYXIgZGVwZW5kZW5jeSkKICAgICAgICBuZXdfZGVwID0gc2VsZi5KZXRUZW1wbGF0ZURlcGVuZGVuY3kuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidGVtcGxhdGVfaWQiOiBzZWxmLmpldF90ZW1wbGF0ZV90b3dlcl9jb3JlLmlkLAogICAgICAgICAgICAgICAgInRlbXBsYXRlX3JlcXVpcmVkX2lkIjogc2VsZi5qZXRfdGVtcGxhdGVfdGVzdC5pZCwKICAgICAgICAgICAgICAgICJzdGF0ZV9yZXF1aXJlZF9pZCI6IHNlbGYuc3RhdGVfcnVubmluZy5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBKZXQgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSB1cGRhdGVkCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbGVuKGpldF90b3dlcl9jb3JlLmpldF9yZXF1aXJlc19pZHMpLAogICAgICAgICAgICAxLAogICAgICAgICAgICAiU2hvdWxkIGhhdmUgMSBkZXBlbmRlbmN5IGFmdGVyIGFkZGl0aW9uIiwKICAgICAgICApCiAgICAgICAgYWRkZWRfZGVwID0gamV0X3Rvd2VyX2NvcmUuamV0X3JlcXVpcmVzX2lkc1swXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGFkZGVkX2RlcC5qZXRfdGVtcGxhdGVfZGVwZW5kZW5jeV9pZCwKICAgICAgICAgICAgbmV3X2RlcCwKICAgICAgICAgICAgIkFkZGVkIGRlcGVuZGVuY3kgc2hvdWxkIG1hdGNoIHRoZSBuZXcgZGVwZW5kZW5jeSIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X2pldF9yZXF1aXJlc19pZHNfbXVsdGlwbGVfamV0c19zYW1lX3RlbXBsYXRlKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgX2NvbXB1dGVfamV0X3JlcXVpcmVzX2lkcyB3aXRoIG11bHRpcGxlIGpldHMgdXNpbmcgc2FtZSB0ZW1wbGF0ZQogICAgICAgICIiIgogICAgICAgICMgQ3JlYXRlIGFub3RoZXIgT2RvbyBqZXQKICAgICAgICBqZXRfb2Rvb18yID0gc2VsZi5KZXQuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJPZG9vIEpldCAyIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAib2Rvb19qZXRfMiIsCiAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2lkIjogc2VsZi5qZXRfdGVtcGxhdGVfb2Rvby5pZCwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWQiOiBzZWxmLnNlcnZlcl90ZXN0XzEuaWQsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgQm90aCBqZXRzIHNob3VsZCBoYXZlIHNhbWUgZGVwZW5kZW5jaWVzCiAgICAgICAgZGVwc18xID0gc2VsZi5qZXRfb2Rvby5qZXRfcmVxdWlyZXNfaWRzCiAgICAgICAgZGVwc18yID0gamV0X29kb29fMi5qZXRfcmVxdWlyZXNfaWRzCgogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGxlbihkZXBzXzEpLAogICAgICAgICAgICBsZW4oZGVwc18yKSwKICAgICAgICAgICAgIkJvdGggamV0cyBzaG91bGQgaGF2ZSBzYW1lIG51bWJlciBvZiBkZXBlbmRlbmNpZXMiLAogICAgICAgICkKCiAgICAgICAgIyBDaGVjayB0aGF0IGRlcGVuZGVuY2llcyBhcmUgdGhlIHNhbWUKICAgICAgICBkZXBzXzFfdGVtcGxhdGVfaWRzID0gZGVwc18xLm1hcHBlZCgKICAgICAgICAgICAgImpldF90ZW1wbGF0ZV9kZXBlbmRlbmN5X2lkLnRlbXBsYXRlX3JlcXVpcmVkX2lkLmlkIgogICAgICAgICkKICAgICAgICBkZXBzXzJfdGVtcGxhdGVfaWRzID0gZGVwc18yLm1hcHBlZCgKICAgICAgICAgICAgImpldF90ZW1wbGF0ZV9kZXBlbmRlbmN5X2lkLnRlbXBsYXRlX3JlcXVpcmVkX2lkLmlkIgogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBzZXQoZGVwc18xX3RlbXBsYXRlX2lkcyksCiAgICAgICAgICAgIHNldChkZXBzXzJfdGVtcGxhdGVfaWRzKSwKICAgICAgICAgICAgIkJvdGggamV0cyBzaG91bGQgaGF2ZSBzYW1lIGRlcGVuZGVuY3kgdGVtcGxhdGVzIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfamV0X3JlcXVpcmVzX2lkc19jb25zaXN0ZW5jeV93aXRoX3RlbXBsYXRlKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgdGhhdCBqZXQgZGVwZW5kZW5jaWVzIGFyZSBjb25zaXN0ZW50IHdpdGggdGVtcGxhdGUgZGVwZW5kZW5jaWVzCiAgICAgICAgIiIiCiAgICAgICAgIyBUZXN0IHdpdGggZGlmZmVyZW50IHRlbXBsYXRlcwogICAgICAgIHRlbXBsYXRlc190b190ZXN0ID0gWwogICAgICAgICAgICAoc2VsZi5qZXRfdGVtcGxhdGVfdG93ZXJfY29yZSwgMCksCiAgICAgICAgICAgIChzZWxmLmpldF90ZW1wbGF0ZV9kb2NrZXIsIDEpLAogICAgICAgICAgICAoc2VsZi5qZXRfdGVtcGxhdGVfbmdpbngsIDEpLAogICAgICAgICAgICAoc2VsZi5qZXRfdGVtcGxhdGVfcG9zdGdyZXMsIDEpLAogICAgICAgICAgICAoc2VsZi5qZXRfdGVtcGxhdGVfbWFyaWFkYiwgMSksCiAgICAgICAgICAgIChzZWxmLmpldF90ZW1wbGF0ZV9vZG9vLCAyKSwKICAgICAgICAgICAgKHNlbGYuamV0X3RlbXBsYXRlX3dvcmRwcmVzcywgMiksCiAgICAgICAgICAgIChzZWxmLmpldF90ZW1wbGF0ZV93b29jb21tZXJjZV9vZG9vLCAyKSwKICAgICAgICBdCgogICAgICAgIGZvciB0ZW1wbGF0ZSwgZXhwZWN0ZWRfZGVwX2NvdW50IGluIHRlbXBsYXRlc190b190ZXN0OgogICAgICAgICAgICAjIENyZWF0ZSBhIGpldCB3aXRoIHRoaXMgdGVtcGxhdGUKICAgICAgICAgICAgdGVzdF9qZXQgPSBzZWxmLkpldC5jcmVhdGUoCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBmIlRlc3QgSmV0IGZvciB7dGVtcGxhdGUubmFtZX0iLAogICAgICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiBmInRlc3RfamV0X3t0ZW1wbGF0ZS5yZWZlcmVuY2V9IiwKICAgICAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2lkIjogdGVtcGxhdGUuaWQsCiAgICAgICAgICAgICAgICAgICAgInNlcnZlcl9pZCI6IHNlbGYuc2VydmVyX3Rlc3RfMS5pZCwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKQoKICAgICAgICAgICAgIyBDaGVjayBkZXBlbmRlbmN5IGNvdW50CiAgICAgICAgICAgIGFjdHVhbF9kZXBfY291bnQgPSBsZW4odGVzdF9qZXQuamV0X3JlcXVpcmVzX2lkcykKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgICAgIGFjdHVhbF9kZXBfY291bnQsCiAgICAgICAgICAgICAgICBleHBlY3RlZF9kZXBfY291bnQsCiAgICAgICAgICAgICAgICBmInt0ZW1wbGF0ZS5uYW1lfSBzaG91bGQgaGF2ZSB7ZXhwZWN0ZWRfZGVwX2NvdW50fSAiCiAgICAgICAgICAgICAgICBmImRlcGVuZGVuY2llcywgZ290IHthY3R1YWxfZGVwX2NvdW50fSIsCiAgICAgICAgICAgICkKCiAgICAgICAgICAgICMgVmVyaWZ5IHRoYXQgYWxsIGpldCBkZXBlbmRlbmNpZXMgY29ycmVzcG9uZCB0byB0ZW1wbGF0ZSBkZXBlbmRlbmNpZXMKICAgICAgICAgICAgdGVtcGxhdGVfZGVwcyA9IHRlbXBsYXRlLnRlbXBsYXRlX3JlcXVpcmVzX2lkcwogICAgICAgICAgICBqZXRfZGVwcyA9IHRlc3RfamV0LmpldF9yZXF1aXJlc19pZHMKCiAgICAgICAgICAgIGlmIHRlbXBsYXRlX2RlcHM6CiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICAgICAgICAgIGxlbihqZXRfZGVwcyksCiAgICAgICAgICAgICAgICAgICAgbGVuKHRlbXBsYXRlX2RlcHMpLAogICAgICAgICAgICAgICAgICAgICJKZXQgZGVwZW5kZW5jaWVzIGNvdW50IHNob3VsZCBtYXRjaCIKICAgICAgICAgICAgICAgICAgICBmIiB0ZW1wbGF0ZSBkZXBlbmRlbmNpZXMgZm9yIHt0ZW1wbGF0ZS5uYW1lfSIsCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgIyBDaGVjayB0aGF0IGVhY2ggamV0IGRlcGVuZGVuY3kgY29ycmVzcG9uZHMgdG8gYSB0ZW1wbGF0ZSBkZXBlbmRlbmN5CiAgICAgICAgICAgICAgICBqZXRfZGVwX3RlbXBsYXRlX2lkcyA9IGpldF9kZXBzLm1hcHBlZCgiamV0X3RlbXBsYXRlX2RlcGVuZGVuY3lfaWQuaWQiKQogICAgICAgICAgICAgICAgdGVtcGxhdGVfZGVwX2lkcyA9IHRlbXBsYXRlX2RlcHMuaWRzCiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICAgICAgICAgIHNldChqZXRfZGVwX3RlbXBsYXRlX2lkcyksCiAgICAgICAgICAgICAgICAgICAgc2V0KHRlbXBsYXRlX2RlcF9pZHMpLAogICAgICAgICAgICAgICAgICAgICJKZXQgZGVwZW5kZW5jaWVzIHNob3VsZCBtYXRjaCB0ZW1wbGF0ZSIKICAgICAgICAgICAgICAgICAgICBmIiBkZXBlbmRlbmNpZXMgZm9yIHt0ZW1wbGF0ZS5uYW1lfSIsCiAgICAgICAgICAgICAgICApCgogICAgIyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiAgICAjICAgYnJpbmdfdG9fc3RhdGUgVGVzdHMKICAgICMgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwoKICAgIGRlZiB0ZXN0X2JyaW5nX3RvX3N0YXRlX3N1Y2Nlc3NfdXNlcl9sZXZlbChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IGJyaW5nX3RvX3N0YXRlIHN1Y2NlZWRzIHdoZW4gdXNlciBoYXMgc3VmZmljaWVudCBhY2Nlc3MgbGV2ZWwuCiAgICAgICAgVXNlciAobGV2ZWwgMSkgY2FuIGFjY2VzcyBzdGF0ZSB3aXRoIGxldmVsIDEuCiAgICAgICAgIiIiCiAgICAgICAgIyBVc2UgZXhpc3Rpbmcgc3RhdGUgYW5kIHNldCBpdCB0byBVc2VyIGFjY2VzcyBsZXZlbCAoMSkKICAgICAgICBzZWxmLnN0YXRlX3J1bm5pbmcuYWNjZXNzX2xldmVsID0gIjEiCiAgICAgICAgc2VsZi5zdGF0ZV9ydW5uaW5nLmludmFsaWRhdGVfcmVjb3Jkc2V0KFsiYWNjZXNzX2xldmVsIl0pCgogICAgICAgICMgRW5zdXJlIHVzZXIgaGFzIGFjY2VzcyB0byB0aGUgamV0CiAgICAgICAgc2VsZi5qZXRfdGVzdC53cml0ZSh7InVzZXJfaWRzIjogWyg0LCBzZWxmLnVzZXIuaWQpXX0pCiAgICAgICAgc2VsZi5zZXJ2ZXJfdGVzdF8xLndyaXRlKHsidXNlcl9pZHMiOiBbKDQsIHNlbGYudXNlci5pZCldfSkKCiAgICAgICAgIyBTZXQgamV0IHRvIGluaXRpYWwgc3RhdGUKICAgICAgICBzZWxmLmpldF90ZXN0LndyaXRlKHsic3RhdGVfaWQiOiBzZWxmLnN0YXRlX2luaXRpYWwuaWR9KQogICAgICAgIHNlbGYuamV0X3Rlc3QuaW52YWxpZGF0ZV9yZWNvcmRzZXQoWyJzdGF0ZV9pZCJdKQoKICAgICAgICAjIFVzZXIgc2hvdWxkIGJlIGFibGUgdG8gYnJpbmcgamV0IHRvIHVzZXItbGV2ZWwgc3RhdGUKICAgICAgICBzZWxmLmpldF90ZXN0LndpdGhfdXNlcihzZWxmLnVzZXIpLndpdGhfY29udGV4dCgKICAgICAgICAgICAgY2V0bWl4X3Rvd2VyX25vX2NvbW1pdD1UcnVlCiAgICAgICAgKS5icmluZ190b19zdGF0ZSgidGVzdF9ydW5uaW5nIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBzZWxmLmpldF90ZXN0LnN0YXRlX2lkLAogICAgICAgICAgICBzZWxmLnN0YXRlX3J1bm5pbmcsCiAgICAgICAgICAgICJKZXQgc2hvdWxkIGJlIGJyb3VnaHQgdG8gdXNlci1sZXZlbCBzdGF0ZSBieSB1c2VyIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfYnJpbmdfdG9fc3RhdGVfc3VjY2Vzc19tYW5hZ2VyX2xldmVsKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgYnJpbmdfdG9fc3RhdGUgc3VjY2VlZHMgd2hlbiBtYW5hZ2VyIGhhcyBzdWZmaWNpZW50IGFjY2VzcyBsZXZlbC4KICAgICAgICBNYW5hZ2VyIChsZXZlbCAyKSBjYW4gYWNjZXNzIHN0YXRlIHdpdGggbGV2ZWwgMi4KICAgICAgICAiIiIKICAgICAgICAjIFVzZSBleGlzdGluZyBzdGF0ZSBhbmQgc2V0IGl0IHRvIE1hbmFnZXIgYWNjZXNzIGxldmVsICgyKQogICAgICAgIHNlbGYuc3RhdGVfc3RvcHBlZC5hY2Nlc3NfbGV2ZWwgPSAiMiIKICAgICAgICBzZWxmLnN0YXRlX3N0b3BwZWQuaW52YWxpZGF0ZV9yZWNvcmRzZXQoWyJhY2Nlc3NfbGV2ZWwiXSkKCiAgICAgICAgIyBFbnN1cmUgbWFuYWdlciBoYXMgYWNjZXNzIHRvIHRoZSBqZXQKICAgICAgICBzZWxmLmpldF90ZXN0LndyaXRlKHsibWFuYWdlcl9pZHMiOiBbKDQsIHNlbGYubWFuYWdlci5pZCldfSkKICAgICAgICBzZWxmLnNlcnZlcl90ZXN0XzEud3JpdGUoeyJtYW5hZ2VyX2lkcyI6IFsoNCwgc2VsZi5tYW5hZ2VyLmlkKV19KQoKICAgICAgICAjIFNldCBqZXQgdG8gcnVubmluZyBzdGF0ZSAod2hpY2ggaGFzIGFjdGlvbiB0byBzdG9wcGVkKQogICAgICAgIHNlbGYuamV0X3Rlc3Qud3JpdGUoeyJzdGF0ZV9pZCI6IHNlbGYuc3RhdGVfcnVubmluZy5pZH0pCiAgICAgICAgc2VsZi5qZXRfdGVzdC5pbnZhbGlkYXRlX3JlY29yZHNldChbInN0YXRlX2lkIl0pCgogICAgICAgICMgTWFuYWdlciBzaG91bGQgYmUgYWJsZSB0byBicmluZyBqZXQgdG8gbWFuYWdlci1sZXZlbCBzdGF0ZQogICAgICAgIHNlbGYuamV0X3Rlc3Qud2l0aF91c2VyKHNlbGYubWFuYWdlcikud2l0aF9jb250ZXh0KAogICAgICAgICAgICBjZXRtaXhfdG93ZXJfbm9fY29tbWl0PVRydWUKICAgICAgICApLmJyaW5nX3RvX3N0YXRlKCJ0ZXN0X3N0b3BwZWQiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHNlbGYuamV0X3Rlc3Quc3RhdGVfaWQsCiAgICAgICAgICAgIHNlbGYuc3RhdGVfc3RvcHBlZCwKICAgICAgICAgICAgIkpldCBzaG91bGQgYmUgYnJvdWdodCB0byBtYW5hZ2VyLWxldmVsIHN0YXRlIGJ5IG1hbmFnZXIiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9icmluZ190b19zdGF0ZV9zdWNjZXNzX3Jvb3RfbGV2ZWwoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCBicmluZ190b19zdGF0ZSBzdWNjZWVkcyB3aGVuIHJvb3QgaGFzIHN1ZmZpY2llbnQgYWNjZXNzIGxldmVsLgogICAgICAgIFJvb3QgKGxldmVsIDMpIGNhbiBhY2Nlc3Mgc3RhdGUgd2l0aCBsZXZlbCAzLgogICAgICAgICIiIgogICAgICAgICMgVXNlIGV4aXN0aW5nIHN0YXRlIGFuZCBzZXQgaXQgdG8gUm9vdCBhY2Nlc3MgbGV2ZWwgKDMpCiAgICAgICAgc2VsZi5zdGF0ZV9lcnJvci5hY2Nlc3NfbGV2ZWwgPSAiMyIKICAgICAgICBzZWxmLnN0YXRlX2Vycm9yLmludmFsaWRhdGVfcmVjb3Jkc2V0KFsiYWNjZXNzX2xldmVsIl0pCgogICAgICAgICMgUm9vdCBoYXMgZnVsbCBhY2Nlc3MsIGJ1dCBlbnN1cmUgYWNjZXNzIGZvciBjb25zaXN0ZW5jeQogICAgICAgIHNlbGYuamV0X3Rlc3Qud3JpdGUoeyJtYW5hZ2VyX2lkcyI6IFsoNCwgc2VsZi5yb290LmlkKV19KQogICAgICAgIHNlbGYuc2VydmVyX3Rlc3RfMS53cml0ZSh7Im1hbmFnZXJfaWRzIjogWyg0LCBzZWxmLnJvb3QuaWQpXX0pCgogICAgICAgICMgU2V0IGpldCB0byBydW5uaW5nIHN0YXRlICh3aGljaCBoYXMgYWN0aW9uIHRvIGVycm9yKQogICAgICAgIHNlbGYuamV0X3Rlc3Qud3JpdGUoeyJzdGF0ZV9pZCI6IHNlbGYuc3RhdGVfcnVubmluZy5pZH0pCiAgICAgICAgc2VsZi5qZXRfdGVzdC5pbnZhbGlkYXRlX3JlY29yZHNldChbInN0YXRlX2lkIl0pCgogICAgICAgICMgUm9vdCBzaG91bGQgYmUgYWJsZSB0byBicmluZyBqZXQgdG8gcm9vdC1sZXZlbCBzdGF0ZQogICAgICAgIHNlbGYuamV0X3Rlc3Qud2l0aF91c2VyKHNlbGYucm9vdCkud2l0aF9jb250ZXh0KAogICAgICAgICAgICBjZXRtaXhfdG93ZXJfbm9fY29tbWl0PVRydWUKICAgICAgICApLmJyaW5nX3RvX3N0YXRlKCJ0ZXN0X2Vycm9yIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBzZWxmLmpldF90ZXN0LnN0YXRlX2lkLAogICAgICAgICAgICBzZWxmLnN0YXRlX2Vycm9yLAogICAgICAgICAgICAiSmV0IHNob3VsZCBiZSBicm91Z2h0IHRvIHJvb3QtbGV2ZWwgc3RhdGUgYnkgcm9vdCIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X2JyaW5nX3RvX3N0YXRlX2FjY2Vzc19lcnJvcl91c2VyX3RvX21hbmFnZXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCBicmluZ190b19zdGF0ZSByYWlzZXMgQWNjZXNzRXJyb3Igd2hlbiB1c2VyIChsZXZlbCAxKQogICAgICAgIHRyaWVzIHRvIGFjY2VzcyBtYW5hZ2VyLWxldmVsIHN0YXRlIChsZXZlbCAyKS4KICAgICAgICAiIiIKICAgICAgICAjIFVzZSBleGlzdGluZyBzdGF0ZSBhbmQgc2V0IGl0IHRvIE1hbmFnZXIgYWNjZXNzIGxldmVsICgyKQogICAgICAgIHNlbGYuc3RhdGVfc3RvcHBlZC5hY2Nlc3NfbGV2ZWwgPSAiMiIKICAgICAgICBzZWxmLnN0YXRlX3N0b3BwZWQuaW52YWxpZGF0ZV9yZWNvcmRzZXQoWyJhY2Nlc3NfbGV2ZWwiXSkKCiAgICAgICAgIyBFbnN1cmUgdXNlciBoYXMgYWNjZXNzIHRvIHRoZSBqZXQgKGZvciB0aGUgYWNjZXNzIGNoZWNrIHRvIHdvcmspCiAgICAgICAgc2VsZi5qZXRfdGVzdC53cml0ZSh7InVzZXJfaWRzIjogWyg0LCBzZWxmLnVzZXIuaWQpXX0pCiAgICAgICAgc2VsZi5zZXJ2ZXJfdGVzdF8xLndyaXRlKHsidXNlcl9pZHMiOiBbKDQsIHNlbGYudXNlci5pZCldfSkKCiAgICAgICAgIyBTZXQgamV0IHRvIHJ1bm5pbmcgc3RhdGUgKHdoaWNoIGhhcyBhY3Rpb24gdG8gc3RvcHBlZCkKICAgICAgICBzZWxmLmpldF90ZXN0LndyaXRlKHsic3RhdGVfaWQiOiBzZWxmLnN0YXRlX3J1bm5pbmcuaWR9KQogICAgICAgIHNlbGYuamV0X3Rlc3QuaW52YWxpZGF0ZV9yZWNvcmRzZXQoWyJzdGF0ZV9pZCJdKQoKICAgICAgICAjIFVzZXIgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIGJyaW5nIGpldCB0byBtYW5hZ2VyLWxldmVsIHN0YXRlCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBY2Nlc3NFcnJvcikgYXMgY29udGV4dDoKICAgICAgICAgICAgc2VsZi5qZXRfdGVzdC53aXRoX3VzZXIoc2VsZi51c2VyKS53aXRoX2NvbnRleHQoCiAgICAgICAgICAgICAgICBjZXRtaXhfdG93ZXJfbm9fY29tbWl0PVRydWUKICAgICAgICAgICAgKS5icmluZ190b19zdGF0ZSgidGVzdF9zdG9wcGVkIikKCiAgICAgICAgc2VsZi5hc3NlcnRJbigKICAgICAgICAgICAgIllvdSBhcmUgbm90IGFsbG93ZWQgdG8gc2V0IHRoZSIsCiAgICAgICAgICAgIHN0cihjb250ZXh0LmV4Y2VwdGlvbiksCiAgICAgICAgICAgICJTaG91bGQgcmFpc2UgQWNjZXNzRXJyb3Igd2l0aCBhcHByb3ByaWF0ZSBtZXNzYWdlIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRJbigKICAgICAgICAgICAgc2VsZi5zdGF0ZV9zdG9wcGVkLm5hbWUsCiAgICAgICAgICAgIHN0cihjb250ZXh0LmV4Y2VwdGlvbiksCiAgICAgICAgICAgICJFcnJvciBtZXNzYWdlIHNob3VsZCBpbmNsdWRlIHN0YXRlIG5hbWUiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9icmluZ190b19zdGF0ZV9hY2Nlc3NfZXJyb3JfdXNlcl90b19yb290KHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgYnJpbmdfdG9fc3RhdGUgcmFpc2VzIEFjY2Vzc0Vycm9yIHdoZW4gdXNlciAobGV2ZWwgMSkKICAgICAgICB0cmllcyB0byBhY2Nlc3Mgcm9vdC1sZXZlbCBzdGF0ZSAobGV2ZWwgMykuCiAgICAgICAgIiIiCiAgICAgICAgIyBVc2UgZXhpc3Rpbmcgc3RhdGUgYW5kIHNldCBpdCB0byBSb290IGFjY2VzcyBsZXZlbCAoMykKICAgICAgICBzZWxmLnN0YXRlX2Vycm9yLmFjY2Vzc19sZXZlbCA9ICIzIgogICAgICAgIHNlbGYuc3RhdGVfZXJyb3IuaW52YWxpZGF0ZV9yZWNvcmRzZXQoWyJhY2Nlc3NfbGV2ZWwiXSkKCiAgICAgICAgIyBFbnN1cmUgdXNlciBoYXMgYWNjZXNzIHRvIHRoZSBqZXQgKGZvciB0aGUgYWNjZXNzIGNoZWNrIHRvIHdvcmspCiAgICAgICAgc2VsZi5qZXRfdGVzdC53cml0ZSh7InVzZXJfaWRzIjogWyg0LCBzZWxmLnVzZXIuaWQpXX0pCiAgICAgICAgc2VsZi5zZXJ2ZXJfdGVzdF8xLndyaXRlKHsidXNlcl9pZHMiOiBbKDQsIHNlbGYudXNlci5pZCldfSkKCiAgICAgICAgIyBTZXQgamV0IHRvIHJ1bm5pbmcgc3RhdGUgKHdoaWNoIGhhcyBhY3Rpb24gdG8gZXJyb3IpCiAgICAgICAgc2VsZi5qZXRfdGVzdC53cml0ZSh7InN0YXRlX2lkIjogc2VsZi5zdGF0ZV9ydW5uaW5nLmlkfSkKICAgICAgICBzZWxmLmpldF90ZXN0LmludmFsaWRhdGVfcmVjb3Jkc2V0KFsic3RhdGVfaWQiXSkKCiAgICAgICAgIyBVc2VyIHNob3VsZCBub3QgYmUgYWJsZSB0byBicmluZyBqZXQgdG8gcm9vdC1sZXZlbCBzdGF0ZQogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQWNjZXNzRXJyb3IpIGFzIGNvbnRleHQ6CiAgICAgICAgICAgIHNlbGYuamV0X3Rlc3Qud2l0aF91c2VyKHNlbGYudXNlcikud2l0aF9jb250ZXh0KAogICAgICAgICAgICAgICAgY2V0bWl4X3Rvd2VyX25vX2NvbW1pdD1UcnVlCiAgICAgICAgICAgICkuYnJpbmdfdG9fc3RhdGUoInRlc3RfZXJyb3IiKQoKICAgICAgICBzZWxmLmFzc2VydEluKAogICAgICAgICAgICAiWW91IGFyZSBub3QgYWxsb3dlZCB0byBzZXQgdGhlIiwKICAgICAgICAgICAgc3RyKGNvbnRleHQuZXhjZXB0aW9uKSwKICAgICAgICAgICAgIlNob3VsZCByYWlzZSBBY2Nlc3NFcnJvciB3aXRoIGFwcHJvcHJpYXRlIG1lc3NhZ2UiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEluKAogICAgICAgICAgICBzZWxmLnN0YXRlX2Vycm9yLm5hbWUsCiAgICAgICAgICAgIHN0cihjb250ZXh0LmV4Y2VwdGlvbiksCiAgICAgICAgICAgICJFcnJvciBtZXNzYWdlIHNob3VsZCBpbmNsdWRlIHN0YXRlIG5hbWUiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9icmluZ190b19zdGF0ZV9hY2Nlc3NfZXJyb3JfbWFuYWdlcl90b19yb290KHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgYnJpbmdfdG9fc3RhdGUgcmFpc2VzIEFjY2Vzc0Vycm9yIHdoZW4gbWFuYWdlciAobGV2ZWwgMikKICAgICAgICB0cmllcyB0byBhY2Nlc3Mgcm9vdC1sZXZlbCBzdGF0ZSAobGV2ZWwgMykuCiAgICAgICAgIiIiCiAgICAgICAgIyBVc2UgZXhpc3Rpbmcgc3RhdGUgYW5kIHNldCBpdCB0byBSb290IGFjY2VzcyBsZXZlbCAoMykKICAgICAgICBzZWxmLnN0YXRlX2Vycm9yLmFjY2Vzc19sZXZlbCA9ICIzIgogICAgICAgIHNlbGYuc3RhdGVfZXJyb3IuaW52YWxpZGF0ZV9yZWNvcmRzZXQoWyJhY2Nlc3NfbGV2ZWwiXSkKCiAgICAgICAgIyBFbnN1cmUgbWFuYWdlciBoYXMgYWNjZXNzIHRvIHRoZSBqZXQgKGZvciB0aGUgYWNjZXNzIGNoZWNrIHRvIHdvcmspCiAgICAgICAgc2VsZi5qZXRfdGVzdC53cml0ZSh7Im1hbmFnZXJfaWRzIjogWyg0LCBzZWxmLm1hbmFnZXIuaWQpXX0pCiAgICAgICAgc2VsZi5zZXJ2ZXJfdGVzdF8xLndyaXRlKHsibWFuYWdlcl9pZHMiOiBbKDQsIHNlbGYubWFuYWdlci5pZCldfSkKCiAgICAgICAgIyBTZXQgamV0IHRvIHJ1bm5pbmcgc3RhdGUgKHdoaWNoIGhhcyBhY3Rpb24gdG8gZXJyb3IpCiAgICAgICAgc2VsZi5qZXRfdGVzdC53cml0ZSh7InN0YXRlX2lkIjogc2VsZi5zdGF0ZV9ydW5uaW5nLmlkfSkKICAgICAgICBzZWxmLmpldF90ZXN0LmludmFsaWRhdGVfcmVjb3Jkc2V0KFsic3RhdGVfaWQiXSkKCiAgICAgICAgIyBNYW5hZ2VyIHNob3VsZCBub3QgYmUgYWJsZSB0byBicmluZyBqZXQgdG8gcm9vdC1sZXZlbCBzdGF0ZQogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQWNjZXNzRXJyb3IpIGFzIGNvbnRleHQ6CiAgICAgICAgICAgIHNlbGYuamV0X3Rlc3Qud2l0aF91c2VyKHNlbGYubWFuYWdlcikud2l0aF9jb250ZXh0KAogICAgICAgICAgICAgICAgY2V0bWl4X3Rvd2VyX25vX2NvbW1pdD1UcnVlCiAgICAgICAgICAgICkuYnJpbmdfdG9fc3RhdGUoInRlc3RfZXJyb3IiKQoKICAgICAgICBzZWxmLmFzc2VydEluKAogICAgICAgICAgICAiWW91IGFyZSBub3QgYWxsb3dlZCB0byBzZXQgdGhlIiwKICAgICAgICAgICAgc3RyKGNvbnRleHQuZXhjZXB0aW9uKSwKICAgICAgICAgICAgIlNob3VsZCByYWlzZSBBY2Nlc3NFcnJvciB3aXRoIGFwcHJvcHJpYXRlIG1lc3NhZ2UiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEluKAogICAgICAgICAgICBzZWxmLnN0YXRlX2Vycm9yLm5hbWUsCiAgICAgICAgICAgIHN0cihjb250ZXh0LmV4Y2VwdGlvbiksCiAgICAgICAgICAgICJFcnJvciBtZXNzYWdlIHNob3VsZCBpbmNsdWRlIHN0YXRlIG5hbWUiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9icmluZ190b19zdGF0ZV9tYW5hZ2VyX2Nhbl9hY2Nlc3NfdXNlcl9sZXZlbChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IGJyaW5nX3RvX3N0YXRlIHN1Y2NlZWRzIHdoZW4gbWFuYWdlciAobGV2ZWwgMikgd2hvIElTIGluIG1hbmFnZXJfaWRzCiAgICAgICAgYWNjZXNzZXMgdXNlci1sZXZlbCBzdGF0ZSAobGV2ZWwgMSkuCiAgICAgICAgSGlnaGVyIGFjY2VzcyBsZXZlbHMgY2FuIGFjY2VzcyBsb3dlciBsZXZlbCBzdGF0ZXMuCiAgICAgICAgIiIiCiAgICAgICAgIyBVc2UgZXhpc3Rpbmcgc3RhdGUgYW5kIHNldCBpdCB0byBVc2VyIGFjY2VzcyBsZXZlbCAoMSkKICAgICAgICBzZWxmLnN0YXRlX3J1bm5pbmcuYWNjZXNzX2xldmVsID0gIjEiCiAgICAgICAgc2VsZi5zdGF0ZV9ydW5uaW5nLmludmFsaWRhdGVfcmVjb3Jkc2V0KFsiYWNjZXNzX2xldmVsIl0pCgogICAgICAgICMgRW5zdXJlIG1hbmFnZXIgaGFzIGFjY2VzcyB0byB0aGUgamV0CiAgICAgICAgIyBNYW5hZ2VyIElTIGluIG1hbmFnZXJfaWRzLCBzbyB0aGV5IGtlZXAgdGhlaXIgbWFuYWdlciBhY2Nlc3MgbGV2ZWwgKDIpCiAgICAgICAgc2VsZi5qZXRfdGVzdC53cml0ZSh7Im1hbmFnZXJfaWRzIjogWyg0LCBzZWxmLm1hbmFnZXIuaWQpXX0pCiAgICAgICAgc2VsZi5zZXJ2ZXJfdGVzdF8xLndyaXRlKHsibWFuYWdlcl9pZHMiOiBbKDQsIHNlbGYubWFuYWdlci5pZCldfSkKCiAgICAgICAgIyBTZXQgamV0IHRvIGluaXRpYWwgc3RhdGUKICAgICAgICBzZWxmLmpldF90ZXN0LndyaXRlKHsic3RhdGVfaWQiOiBzZWxmLnN0YXRlX2luaXRpYWwuaWR9KQogICAgICAgIHNlbGYuamV0X3Rlc3QuaW52YWxpZGF0ZV9yZWNvcmRzZXQoWyJzdGF0ZV9pZCJdKQoKICAgICAgICAjIE1hbmFnZXIgc2hvdWxkIGJlIGFibGUgdG8gYnJpbmcgamV0IHRvIHVzZXItbGV2ZWwgc3RhdGUKICAgICAgICBzZWxmLmpldF90ZXN0LndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLndpdGhfY29udGV4dCgKICAgICAgICAgICAgY2V0bWl4X3Rvd2VyX25vX2NvbW1pdD1UcnVlCiAgICAgICAgKS5icmluZ190b19zdGF0ZSgidGVzdF9ydW5uaW5nIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBzZWxmLmpldF90ZXN0LnN0YXRlX2lkLAogICAgICAgICAgICBzZWxmLnN0YXRlX3J1bm5pbmcsCiAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCBiZSBhYmxlIHRvIGFjY2VzcyB1c2VyLWxldmVsIHN0YXRlIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfYnJpbmdfdG9fc3RhdGVfbWFuYWdlcl9ub3RfaW5fbWFuYWdlcl9pZHNfdHJlYXRlZF9hc191c2VyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgYnJpbmdfdG9fc3RhdGUgdHJlYXRzIG1hbmFnZXIgKGxldmVsIDIpIHdobyBpcyBOT1QgaW4gbWFuYWdlcl9pZHMKICAgICAgICBhcyB1c2VyIChsZXZlbCAxKS4KICAgICAgICBNYW5hZ2VyIHNob3VsZCBiZSBhYmxlIHRvIHNldCB1c2VyLWxldmVsIHN0YXRlIGJ1dCBub3QgbWFuYWdlci1sZXZlbCBzdGF0ZS4KICAgICAgICAiIiIKICAgICAgICAjIFVzZSBleGlzdGluZyBzdGF0ZSBhbmQgc2V0IGl0IHRvIFVzZXIgYWNjZXNzIGxldmVsICgxKQogICAgICAgIHNlbGYuc3RhdGVfcnVubmluZy5hY2Nlc3NfbGV2ZWwgPSAiMSIKICAgICAgICBzZWxmLnN0YXRlX3J1bm5pbmcuaW52YWxpZGF0ZV9yZWNvcmRzZXQoWyJhY2Nlc3NfbGV2ZWwiXSkKCiAgICAgICAgIyBFbnN1cmUgbWFuYWdlciBoYXMgYWNjZXNzIHRvIHRoZSBqZXQgdmlhIHVzZXJfaWRzIGJ1dCBOT1QgdmlhIG1hbmFnZXJfaWRzCiAgICAgICAgc2VsZi5qZXRfdGVzdC53cml0ZSh7InVzZXJfaWRzIjogWyg0LCBzZWxmLm1hbmFnZXIuaWQpXX0pCiAgICAgICAgc2VsZi5zZXJ2ZXJfdGVzdF8xLndyaXRlKHsidXNlcl9pZHMiOiBbKDQsIHNlbGYubWFuYWdlci5pZCldfSkKICAgICAgICAjIEV4cGxpY2l0bHkgZW5zdXJlIG1hbmFnZXIgaXMgTk9UIGluIG1hbmFnZXJfaWRzCiAgICAgICAgc2VsZi5qZXRfdGVzdC53cml0ZSh7Im1hbmFnZXJfaWRzIjogWyg1LCAwLCAwKV19KQoKICAgICAgICAjIFNldCBqZXQgdG8gaW5pdGlhbCBzdGF0ZQogICAgICAgIHNlbGYuamV0X3Rlc3Qud3JpdGUoeyJzdGF0ZV9pZCI6IHNlbGYuc3RhdGVfaW5pdGlhbC5pZH0pCiAgICAgICAgc2VsZi5qZXRfdGVzdC5pbnZhbGlkYXRlX3JlY29yZHNldChbInN0YXRlX2lkIl0pCgogICAgICAgICMgTWFuYWdlciAodHJlYXRlZCBhcyB1c2VyKSBzaG91bGQgYmUgYWJsZSB0byBicmluZyBqZXQgdG8gdXNlci1sZXZlbCBzdGF0ZQogICAgICAgIHNlbGYuamV0X3Rlc3Qud2l0aF91c2VyKHNlbGYubWFuYWdlcikud2l0aF9jb250ZXh0KAogICAgICAgICAgICBjZXRtaXhfdG93ZXJfbm9fY29tbWl0PVRydWUKICAgICAgICApLmJyaW5nX3RvX3N0YXRlKCJ0ZXN0X3J1bm5pbmciKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHNlbGYuamV0X3Rlc3Quc3RhdGVfaWQsCiAgICAgICAgICAgIHNlbGYuc3RhdGVfcnVubmluZywKICAgICAgICAgICAgIk1hbmFnZXIgbm90IGluIG1hbmFnZXJfaWRzIHNob3VsZCBiZSBhYmxlIHRvIGFjY2VzcyB1c2VyLWxldmVsIHN0YXRlIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfYnJpbmdfdG9fc3RhdGVfbWFuYWdlcl9ub3RfaW5fbWFuYWdlcl9pZHNfY2Fubm90X2FjY2Vzc19tYW5hZ2VyX2xldmVsKAogICAgICAgIHNlbGYKICAgICk6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCBicmluZ190b19zdGF0ZSByYWlzZXMgQWNjZXNzRXJyb3Igd2hlbiBtYW5hZ2VyIChsZXZlbCAyKSB3aG8gaXMgTk9UCiAgICAgICAgaW4gbWFuYWdlcl9pZHMgdHJpZXMgdG8gYWNjZXNzIG1hbmFnZXItbGV2ZWwgc3RhdGUgKGxldmVsIDIpLgogICAgICAgIE1hbmFnZXIgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgdXNlciAobGV2ZWwgMSkgYW5kIGNhbm5vdCBhY2Nlc3MgbGV2ZWwgMi4KICAgICAgICAiIiIKICAgICAgICAjIFVzZSBleGlzdGluZyBzdGF0ZSBhbmQgc2V0IGl0IHRvIE1hbmFnZXIgYWNjZXNzIGxldmVsICgyKQogICAgICAgIHNlbGYuc3RhdGVfc3RvcHBlZC5hY2Nlc3NfbGV2ZWwgPSAiMiIKICAgICAgICBzZWxmLnN0YXRlX3N0b3BwZWQuaW52YWxpZGF0ZV9yZWNvcmRzZXQoWyJhY2Nlc3NfbGV2ZWwiXSkKCiAgICAgICAgIyBFbnN1cmUgbWFuYWdlciBoYXMgYWNjZXNzIHRvIHRoZSBqZXQgdmlhIHVzZXJfaWRzIGJ1dCBOT1QgdmlhIG1hbmFnZXJfaWRzCiAgICAgICAgc2VsZi5qZXRfdGVzdC53cml0ZSh7InVzZXJfaWRzIjogWyg0LCBzZWxmLm1hbmFnZXIuaWQpXX0pCiAgICAgICAgc2VsZi5zZXJ2ZXJfdGVzdF8xLndyaXRlKHsidXNlcl9pZHMiOiBbKDQsIHNlbGYubWFuYWdlci5pZCldfSkKICAgICAgICAjIEV4cGxpY2l0bHkgZW5zdXJlIG1hbmFnZXIgaXMgTk9UIGluIG1hbmFnZXJfaWRzCiAgICAgICAgc2VsZi5qZXRfdGVzdC53cml0ZSh7Im1hbmFnZXJfaWRzIjogWyg1LCAwLCAwKV19KQoKICAgICAgICAjIFNldCBqZXQgdG8gcnVubmluZyBzdGF0ZSAod2hpY2ggaGFzIGFjdGlvbiB0byBzdG9wcGVkKQogICAgICAgIHNlbGYuamV0X3Rlc3Qud3JpdGUoeyJzdGF0ZV9pZCI6IHNlbGYuc3RhdGVfcnVubmluZy5pZH0pCiAgICAgICAgc2VsZi5qZXRfdGVzdC5pbnZhbGlkYXRlX3JlY29yZHNldChbInN0YXRlX2lkIl0pCgogICAgICAgICMgTWFuYWdlciAodHJlYXRlZCBhcyB1c2VyKSBzaG91bGQgbm90IGJlIGFibGUgdG8gYnJpbmcgamV0CiAgICAgICAgIyB0byBtYW5hZ2VyLWxldmVsIHN0YXRlCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBY2Nlc3NFcnJvcikgYXMgY29udGV4dDoKICAgICAgICAgICAgc2VsZi5qZXRfdGVzdC53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS53aXRoX2NvbnRleHQoCiAgICAgICAgICAgICAgICBjZXRtaXhfdG93ZXJfbm9fY29tbWl0PVRydWUKICAgICAgICAgICAgKS5icmluZ190b19zdGF0ZSgidGVzdF9zdG9wcGVkIikKCiAgICAgICAgc2VsZi5hc3NlcnRJbigKICAgICAgICAgICAgIllvdSBhcmUgbm90IGFsbG93ZWQgdG8gc2V0IHRoZSIsCiAgICAgICAgICAgIHN0cihjb250ZXh0LmV4Y2VwdGlvbiksCiAgICAgICAgICAgICJTaG91bGQgcmFpc2UgQWNjZXNzRXJyb3Igd2l0aCBhcHByb3ByaWF0ZSBtZXNzYWdlIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRJbigKICAgICAgICAgICAgc2VsZi5zdGF0ZV9zdG9wcGVkLm5hbWUsCiAgICAgICAgICAgIHN0cihjb250ZXh0LmV4Y2VwdGlvbiksCiAgICAgICAgICAgICJFcnJvciBtZXNzYWdlIHNob3VsZCBpbmNsdWRlIHN0YXRlIG5hbWUiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9icmluZ190b19zdGF0ZV9yb290X2Nhbl9hY2Nlc3NfbWFuYWdlcl9sZXZlbChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IGJyaW5nX3RvX3N0YXRlIHN1Y2NlZWRzIHdoZW4gcm9vdCAobGV2ZWwgMykKICAgICAgICBhY2Nlc3NlcyBtYW5hZ2VyLWxldmVsIHN0YXRlIChsZXZlbCAyKS4KICAgICAgICBIaWdoZXIgYWNjZXNzIGxldmVscyBjYW4gYWNjZXNzIGxvd2VyIGxldmVsIHN0YXRlcy4KICAgICAgICAiIiIKICAgICAgICAjIFVzZSBleGlzdGluZyBzdGF0ZSBhbmQgc2V0IGl0IHRvIE1hbmFnZXIgYWNjZXNzIGxldmVsICgyKQogICAgICAgIHNlbGYuc3RhdGVfc3RvcHBlZC5hY2Nlc3NfbGV2ZWwgPSAiMiIKICAgICAgICBzZWxmLnN0YXRlX3N0b3BwZWQuaW52YWxpZGF0ZV9yZWNvcmRzZXQoWyJhY2Nlc3NfbGV2ZWwiXSkKCiAgICAgICAgIyBSb290IGhhcyBmdWxsIGFjY2VzcywgYnV0IGVuc3VyZSBhY2Nlc3MgZm9yIGNvbnNpc3RlbmN5CiAgICAgICAgc2VsZi5qZXRfdGVzdC53cml0ZSh7Im1hbmFnZXJfaWRzIjogWyg0LCBzZWxmLnJvb3QuaWQpXX0pCiAgICAgICAgc2VsZi5zZXJ2ZXJfdGVzdF8xLndyaXRlKHsibWFuYWdlcl9pZHMiOiBbKDQsIHNlbGYucm9vdC5pZCldfSkKCiAgICAgICAgIyBTZXQgamV0IHRvIHJ1bm5pbmcgc3RhdGUgKHdoaWNoIGhhcyBhY3Rpb24gdG8gc3RvcHBlZCkKICAgICAgICBzZWxmLmpldF90ZXN0LndyaXRlKHsic3RhdGVfaWQiOiBzZWxmLnN0YXRlX3J1bm5pbmcuaWR9KQogICAgICAgIHNlbGYuamV0X3Rlc3QuaW52YWxpZGF0ZV9yZWNvcmRzZXQoWyJzdGF0ZV9pZCJdKQoKICAgICAgICAjIFJvb3Qgc2hvdWxkIGJlIGFibGUgdG8gYnJpbmcgamV0IHRvIG1hbmFnZXItbGV2ZWwgc3RhdGUKICAgICAgICBzZWxmLmpldF90ZXN0LndpdGhfdXNlcihzZWxmLnJvb3QpLndpdGhfY29udGV4dCgKICAgICAgICAgICAgY2V0bWl4X3Rvd2VyX25vX2NvbW1pdD1UcnVlCiAgICAgICAgKS5icmluZ190b19zdGF0ZSgidGVzdF9zdG9wcGVkIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBzZWxmLmpldF90ZXN0LnN0YXRlX2lkLAogICAgICAgICAgICBzZWxmLnN0YXRlX3N0b3BwZWQsCiAgICAgICAgICAgICJSb290IHNob3VsZCBiZSBhYmxlIHRvIGFjY2VzcyBtYW5hZ2VyLWxldmVsIHN0YXRlIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfYnJpbmdfdG9fc3RhdGVfaW52YWxpZF9yZWZlcmVuY2Uoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCBicmluZ190b19zdGF0ZSByYWlzZXMgVmFsaWRhdGlvbkVycm9yIHdoZW4gc3RhdGUgcmVmZXJlbmNlIGlzIGludmFsaWQuCiAgICAgICAgIiIiCiAgICAgICAgIyBTZXQgamV0IHRvIGluaXRpYWwgc3RhdGUKICAgICAgICBzZWxmLmpldF90ZXN0LnN0YXRlX2lkID0gc2VsZi5zdGF0ZV9pbml0aWFsCgogICAgICAgICMgU2hvdWxkIHJhaXNlIFZhbGlkYXRpb25FcnJvciBmb3IgaW52YWxpZCBzdGF0ZSByZWZlcmVuY2UKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbGlkYXRpb25FcnJvcikgYXMgY29udGV4dDoKICAgICAgICAgICAgc2VsZi5qZXRfdGVzdC53aXRoX2NvbnRleHQoY2V0bWl4X3Rvd2VyX25vX2NvbW1pdD1UcnVlKS5icmluZ190b19zdGF0ZSgKICAgICAgICAgICAgICAgICJpbnZhbGlkX3N0YXRlX3JlZmVyZW5jZSIKICAgICAgICAgICAgKQoKICAgICAgICBzZWxmLmFzc2VydEluKAogICAgICAgICAgICAiU3RhdGUgJ2ludmFsaWRfc3RhdGVfcmVmZXJlbmNlJyBub3QgZm91bmQiLAogICAgICAgICAgICBzdHIoY29udGV4dC5leGNlcHRpb24pLAogICAgICAgICAgICAiU2hvdWxkIHJhaXNlIFZhbGlkYXRpb25FcnJvciB3aXRoIGFwcHJvcHJpYXRlIG1lc3NhZ2UiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEluKAogICAgICAgICAgICBzZWxmLmpldF90ZXN0LmRpc3BsYXlfbmFtZSwKICAgICAgICAgICAgc3RyKGNvbnRleHQuZXhjZXB0aW9uKSwKICAgICAgICAgICAgIkVycm9yIG1lc3NhZ2Ugc2hvdWxkIGluY2x1ZGUgamV0IGRpc3BsYXkgbmFtZSIsCiAgICAgICAgKQoKICAgICMgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogICAgIyAgIF9nZXRfdXNlcl9lZmZlY3RpdmVfYWNjZXNzX2xldmVsIFRlc3RzCiAgICAjICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKCiAgICBkZWYgdGVzdF9nZXRfdXNlcl9lZmZlY3RpdmVfYWNjZXNzX2xldmVsX3VzZXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCBfZ2V0X3VzZXJfZWZmZWN0aXZlX2FjY2Vzc19sZXZlbCByZXR1cm5zICIxIiBmb3IgdXNlci4KICAgICAgICAiIiIKICAgICAgICAjIEVuc3VyZSB1c2VyIGhhcyBhY2Nlc3MgdG8gdGhlIGpldAogICAgICAgIHNlbGYuamV0X3Rlc3Qud3JpdGUoeyJ1c2VyX2lkcyI6IFsoNCwgc2VsZi51c2VyLmlkKV19KQoKICAgICAgICAjIFVzZXIgc2hvdWxkIGhhdmUgZWZmZWN0aXZlIGFjY2VzcyBsZXZlbCAiMSIKICAgICAgICBlZmZlY3RpdmVfbGV2ZWwgPSBzZWxmLmpldF90ZXN0LndpdGhfdXNlcigKICAgICAgICAgICAgc2VsZi51c2VyCiAgICAgICAgKS5fZ2V0X3VzZXJfZWZmZWN0aXZlX2FjY2Vzc19sZXZlbCgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgZWZmZWN0aXZlX2xldmVsLAogICAgICAgICAgICAiMSIsCiAgICAgICAgICAgICJVc2VyIHNob3VsZCBoYXZlIGVmZmVjdGl2ZSBhY2Nlc3MgbGV2ZWwgMSIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X2dldF91c2VyX2VmZmVjdGl2ZV9hY2Nlc3NfbGV2ZWxfbWFuYWdlcl9pbl9tYW5hZ2VyX2lkcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IF9nZXRfdXNlcl9lZmZlY3RpdmVfYWNjZXNzX2xldmVsIHJldHVybnMgIjIiIGZvciBtYW5hZ2VyCiAgICAgICAgd2hvIElTIGluIG1hbmFnZXJfaWRzLgogICAgICAgICIiIgogICAgICAgICMgRW5zdXJlIG1hbmFnZXIgaGFzIGFjY2VzcyB0byB0aGUgamV0IGFuZCBJUyBpbiBtYW5hZ2VyX2lkcwogICAgICAgIHNlbGYuamV0X3Rlc3Qud3JpdGUoeyJtYW5hZ2VyX2lkcyI6IFsoNCwgc2VsZi5tYW5hZ2VyLmlkKV19KQoKICAgICAgICAjIE1hbmFnZXIgaW4gbWFuYWdlcl9pZHMgc2hvdWxkIGhhdmUgZWZmZWN0aXZlIGFjY2VzcyBsZXZlbCAiMiIKICAgICAgICBlZmZlY3RpdmVfbGV2ZWwgPSBzZWxmLmpldF90ZXN0LndpdGhfdXNlcigKICAgICAgICAgICAgc2VsZi5tYW5hZ2VyCiAgICAgICAgKS5fZ2V0X3VzZXJfZWZmZWN0aXZlX2FjY2Vzc19sZXZlbCgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgZWZmZWN0aXZlX2xldmVsLAogICAgICAgICAgICAiMiIsCiAgICAgICAgICAgICJNYW5hZ2VyIGluIG1hbmFnZXJfaWRzIHNob3VsZCBoYXZlIGVmZmVjdGl2ZSBhY2Nlc3MgbGV2ZWwgMiIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X2dldF91c2VyX2VmZmVjdGl2ZV9hY2Nlc3NfbGV2ZWxfbWFuYWdlcl9ub3RfaW5fbWFuYWdlcl9pZHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCBfZ2V0X3VzZXJfZWZmZWN0aXZlX2FjY2Vzc19sZXZlbCByZXR1cm5zICIxIiBmb3IgbWFuYWdlcgogICAgICAgIHdobyBpcyBOT1QgaW4gbWFuYWdlcl9pZHMgKGRvd25ncmFkZWQgdG8gdXNlciBsZXZlbCkuCiAgICAgICAgIiIiCiAgICAgICAgIyBFbnN1cmUgbWFuYWdlciBoYXMgYWNjZXNzIHRvIHRoZSBqZXQgdmlhIHVzZXJfaWRzIGJ1dCBOT1QgdmlhIG1hbmFnZXJfaWRzCiAgICAgICAgc2VsZi5qZXRfdGVzdC53cml0ZSh7InVzZXJfaWRzIjogWyg0LCBzZWxmLm1hbmFnZXIuaWQpXX0pCiAgICAgICAgIyBFeHBsaWNpdGx5IGVuc3VyZSBtYW5hZ2VyIGlzIE5PVCBpbiBtYW5hZ2VyX2lkcwogICAgICAgIHNlbGYuamV0X3Rlc3Qud3JpdGUoeyJtYW5hZ2VyX2lkcyI6IFsoNSwgMCwgMCldfSkKCiAgICAgICAgIyBNYW5hZ2VyIG5vdCBpbiBtYW5hZ2VyX2lkcyBzaG91bGQgaGF2ZSBlZmZlY3RpdmUgYWNjZXNzIGxldmVsICIxIgogICAgICAgIGVmZmVjdGl2ZV9sZXZlbCA9IHNlbGYuamV0X3Rlc3Qud2l0aF91c2VyKAogICAgICAgICAgICBzZWxmLm1hbmFnZXIKICAgICAgICApLl9nZXRfdXNlcl9lZmZlY3RpdmVfYWNjZXNzX2xldmVsKCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBlZmZlY3RpdmVfbGV2ZWwsCiAgICAgICAgICAgICIxIiwKICAgICAgICAgICAgIk1hbmFnZXIgbm90IGluIG1hbmFnZXJfaWRzIHNob3VsZCBoYXZlIGVmZmVjdGl2ZSBhY2Nlc3MgbGV2ZWwgMSIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X2dldF91c2VyX2VmZmVjdGl2ZV9hY2Nlc3NfbGV2ZWxfcm9vdChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IF9nZXRfdXNlcl9lZmZlY3RpdmVfYWNjZXNzX2xldmVsIHJldHVybnMgIjMiIGZvciByb290LgogICAgICAgICIiIgogICAgICAgICMgUm9vdCBzaG91bGQgaGF2ZSBlZmZlY3RpdmUgYWNjZXNzIGxldmVsICIzIiByZWdhcmRsZXNzIG9mIG1hbmFnZXJfaWRzCiAgICAgICAgZWZmZWN0aXZlX2xldmVsID0gc2VsZi5qZXRfdGVzdC53aXRoX3VzZXIoCiAgICAgICAgICAgIHNlbGYucm9vdAogICAgICAgICkuX2dldF91c2VyX2VmZmVjdGl2ZV9hY2Nlc3NfbGV2ZWwoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGVmZmVjdGl2ZV9sZXZlbCwKICAgICAgICAgICAgIjMiLAogICAgICAgICAgICAiUm9vdCBzaG91bGQgaGF2ZSBlZmZlY3RpdmUgYWNjZXNzIGxldmVsIDMiLAogICAgICAgICkKCiAgICAjICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKICAgICMgICB1bmxpbmsgVGVzdHMKICAgICMgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwoKICAgIGRlZiB0ZXN0X3VubGlua19kZWxldGFibGVfamV0X3dpdGhfZmlsZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCB1bmxpbmsgc3VjY2VlZHMgd2hlbiBqZXQgaXMgZGVsZXRhYmxlIGFuZCBoYXMgZmlsZXMuCiAgICAgICAgRmlsZXMgc2hvdWxkIGJlIHVubGlua2VkIGFmdGVyIHRoZSBqZXQgaXMgZGVsZXRlZC4KICAgICAgICAiIiIKICAgICAgICAjIENyZWF0ZSBhIGRlbGV0YWJsZSBqZXQgKGRlbGV0YWJsZSBkZWZhdWx0cyB0byBUcnVlKQogICAgICAgIGpldCA9IHNlbGYuX2NyZWF0ZV9qZXQoCiAgICAgICAgICAgICJEZWxldGFibGUgSmV0IiwKICAgICAgICAgICAgImRlbGV0YWJsZV9qZXQiLAogICAgICAgICkKCiAgICAgICAgIyBDcmVhdGUgZmlsZXMgbGlua2VkIHRvIHRoZSBqZXQKICAgICAgICBmaWxlMSA9IHNlbGYuRmlsZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogInRlc3RfZmlsZV8xLnR4dCIsCiAgICAgICAgICAgICAgICAic291cmNlIjogInRvd2VyIiwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWQiOiBzZWxmLnNlcnZlcl90ZXN0XzEuaWQsCiAgICAgICAgICAgICAgICAic2VydmVyX2RpciI6ICIvdG1wIiwKICAgICAgICAgICAgICAgICJqZXRfaWQiOiBqZXQuaWQsCiAgICAgICAgICAgICAgICAiZmlsZV90eXBlIjogInRleHQiLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIGZpbGUyID0gc2VsZi5GaWxlLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAidGVzdF9maWxlXzIudHh0IiwKICAgICAgICAgICAgICAgICJzb3VyY2UiOiAidG93ZXIiLAogICAgICAgICAgICAgICAgInNlcnZlcl9pZCI6IHNlbGYuc2VydmVyX3Rlc3RfMS5pZCwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfZGlyIjogIi90bXAiLAogICAgICAgICAgICAgICAgImpldF9pZCI6IGpldC5pZCwKICAgICAgICAgICAgICAgICJmaWxlX3R5cGUiOiAidGV4dCIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgVmVyaWZ5IGZpbGVzIGV4aXN0CiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oamV0LmZpbGVfaWRzKSwgMiwgIkpldCBzaG91bGQgaGF2ZSAyIGZpbGVzIikKICAgICAgICBzZWxmLmFzc2VydEluKGZpbGUxLCBqZXQuZmlsZV9pZHMsICJGaWxlIDEgc2hvdWxkIGJlIGxpbmtlZCB0byBqZXQiKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oZmlsZTIsIGpldC5maWxlX2lkcywgIkZpbGUgMiBzaG91bGQgYmUgbGlua2VkIHRvIGpldCIpCgogICAgICAgICMgU3RvcmUgZmlsZSBJRHMgYmVmb3JlIGRlbGV0aW9uCiAgICAgICAgZmlsZV9pZHMgPSB7ZmlsZTEuaWQsIGZpbGUyLmlkfQoKICAgICAgICAjIFVubGluayB0aGUgamV0CiAgICAgICAgamV0LnVubGluaygpCgogICAgICAgICMgVmVyaWZ5IGpldCBpcyBkZWxldGVkCiAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShqZXQuZXhpc3RzKCksICJKZXQgc2hvdWxkIGJlIGRlbGV0ZWQiKQoKICAgICAgICAjIFZlcmlmeSBmaWxlcyBhcmUgYWxzbyBkZWxldGVkCiAgICAgICAgcmVtYWluaW5nX2ZpbGVzID0gc2VsZi5GaWxlLmJyb3dzZShsaXN0KGZpbGVfaWRzKSkKICAgICAgICBzZWxmLmFzc2VydEZhbHNlKAogICAgICAgICAgICByZW1haW5pbmdfZmlsZXMuZXhpc3RzKCksCiAgICAgICAgICAgICJGaWxlcyBzaG91bGQgYmUgdW5saW5rZWQgYWZ0ZXIgamV0IGRlbGV0aW9uIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfdW5saW5rX2RlbGV0YWJsZV9qZXRfd2l0aG91dF9maWxlcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHVubGluayBzdWNjZWVkcyB3aGVuIGpldCBpcyBkZWxldGFibGUgYnV0IGhhcyBubyBmaWxlcy4KICAgICAgICAiIiIKICAgICAgICAjIENyZWF0ZSBhIGRlbGV0YWJsZSBqZXQgd2l0aG91dCBmaWxlcyAoZGVsZXRhYmxlIGRlZmF1bHRzIHRvIFRydWUpCiAgICAgICAgamV0ID0gc2VsZi5fY3JlYXRlX2pldCgKICAgICAgICAgICAgIkRlbGV0YWJsZSBKZXQgTm8gRmlsZXMiLAogICAgICAgICAgICAiZGVsZXRhYmxlX2pldF9ub19maWxlcyIsCiAgICAgICAgKQoKICAgICAgICAjIFZlcmlmeSBqZXQgaGFzIG5vIGZpbGVzCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oamV0LmZpbGVfaWRzKSwgMCwgIkpldCBzaG91bGQgaGF2ZSBubyBmaWxlcyIpCgogICAgICAgICMgVW5saW5rIHRoZSBqZXQKICAgICAgICBqZXQudW5saW5rKCkKCiAgICAgICAgIyBWZXJpZnkgamV0IGlzIGRlbGV0ZWQKICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGpldC5leGlzdHMoKSwgIkpldCBzaG91bGQgYmUgZGVsZXRlZCIpCgogICAgZGVmIHRlc3RfdW5saW5rX25vdF9kZWxldGFibGVfamV0X3JhaXNlc19lcnJvcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHVubGluayByYWlzZXMgVmFsaWRhdGlvbkVycm9yIHdoZW4gamV0IGlzIG5vdCBkZWxldGFibGUuCiAgICAgICAgIiIiCiAgICAgICAgIyBDcmVhdGUgYSBub24tZGVsZXRhYmxlIGpldAogICAgICAgIGpldCA9IHNlbGYuX2NyZWF0ZV9qZXQoCiAgICAgICAgICAgICJOb3QgRGVsZXRhYmxlIEpldCIsCiAgICAgICAgICAgICJub3RfZGVsZXRhYmxlX2pldCIsCiAgICAgICAgKQogICAgICAgIGpldC53cml0ZSh7ImRlbGV0YWJsZSI6IEZhbHNlfSkKCiAgICAgICAgIyBBdHRlbXB0IHRvIHVubGluayBzaG91bGQgcmFpc2UgVmFsaWRhdGlvbkVycm9yCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWxpZGF0aW9uRXJyb3IpIGFzIGNvbnRleHQ6CiAgICAgICAgICAgIGpldC51bmxpbmsoKQoKICAgICAgICAjIFZlcmlmeSBlcnJvciBtZXNzYWdlIGNvbnRhaW5zIGpldCBkaXNwbGF5IG5hbWUKICAgICAgICBzZWxmLmFzc2VydEluKAogICAgICAgICAgICAiY2Fubm90IGJlIGRlbGV0ZWQiLAogICAgICAgICAgICBzdHIoY29udGV4dC5leGNlcHRpb24pLAogICAgICAgICAgICAiRXJyb3IgbWVzc2FnZSBzaG91bGQgbWVudGlvbiBkZWxldGlvbiByZXN0cmljdGlvbiIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgIGpldC5kaXNwbGF5X25hbWUsCiAgICAgICAgICAgIHN0cihjb250ZXh0LmV4Y2VwdGlvbiksCiAgICAgICAgICAgICJFcnJvciBtZXNzYWdlIHNob3VsZCBpbmNsdWRlIGpldCBkaXNwbGF5IG5hbWUiLAogICAgICAgICkKCiAgICAgICAgIyBWZXJpZnkgamV0IHN0aWxsIGV4aXN0cwogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShqZXQuZXhpc3RzKCksICJKZXQgc2hvdWxkIG5vdCBiZSBkZWxldGVkIikKCiAgICBkZWYgdGVzdF91bmxpbmtfbXVsdGlwbGVfamV0c19taXhlZF9kZWxldGFibGUoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCB1bmxpbmsgd2l0aCBtdWx0aXBsZSBqZXRzIHdoZXJlIHNvbWUgYXJlIGRlbGV0YWJsZSBhbmQgc29tZSBhcmUgbm90LgogICAgICAgIFNob3VsZCByYWlzZSBWYWxpZGF0aW9uRXJyb3IgbGlzdGluZyBub24tZGVsZXRhYmxlIGpldHMuCiAgICAgICAgIiIiCiAgICAgICAgIyBDcmVhdGUgZGVsZXRhYmxlIGpldCAoZGVsZXRhYmxlIGRlZmF1bHRzIHRvIFRydWUpCiAgICAgICAgZGVsZXRhYmxlX2pldCA9IHNlbGYuX2NyZWF0ZV9qZXQoCiAgICAgICAgICAgICJEZWxldGFibGUgSmV0IiwKICAgICAgICAgICAgImRlbGV0YWJsZV9qZXRfbXVsdGkiLAogICAgICAgICkKCiAgICAgICAgIyBDcmVhdGUgbm9uLWRlbGV0YWJsZSBqZXQKICAgICAgICBub3RfZGVsZXRhYmxlX2pldCA9IHNlbGYuX2NyZWF0ZV9qZXQoCiAgICAgICAgICAgICJOb3QgRGVsZXRhYmxlIEpldCIsCiAgICAgICAgICAgICJub3RfZGVsZXRhYmxlX2pldF9tdWx0aSIsCiAgICAgICAgKQogICAgICAgIG5vdF9kZWxldGFibGVfamV0LndyaXRlKHsiZGVsZXRhYmxlIjogRmFsc2V9KQoKICAgICAgICAjIEF0dGVtcHQgdG8gdW5saW5rIGJvdGggc2hvdWxkIHJhaXNlIFZhbGlkYXRpb25FcnJvcgogICAgICAgIGpldHMgPSBkZWxldGFibGVfamV0IHwgbm90X2RlbGV0YWJsZV9qZXQKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbGlkYXRpb25FcnJvcikgYXMgY29udGV4dDoKICAgICAgICAgICAgamV0cy51bmxpbmsoKQoKICAgICAgICAjIFZlcmlmeSBlcnJvciBtZXNzYWdlIGNvbnRhaW5zIG5vbi1kZWxldGFibGUgamV0IGRpc3BsYXkgbmFtZQogICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgICJjYW5ub3QgYmUgZGVsZXRlZCIsCiAgICAgICAgICAgIHN0cihjb250ZXh0LmV4Y2VwdGlvbiksCiAgICAgICAgICAgICJFcnJvciBtZXNzYWdlIHNob3VsZCBtZW50aW9uIGRlbGV0aW9uIHJlc3RyaWN0aW9uIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRJbigKICAgICAgICAgICAgbm90X2RlbGV0YWJsZV9qZXQuZGlzcGxheV9uYW1lLAogICAgICAgICAgICBzdHIoY29udGV4dC5leGNlcHRpb24pLAogICAgICAgICAgICAiRXJyb3IgbWVzc2FnZSBzaG91bGQgaW5jbHVkZSBub24tZGVsZXRhYmxlIGpldCBkaXNwbGF5IG5hbWUiLAogICAgICAgICkKCiAgICAgICAgIyBWZXJpZnkgYm90aCBqZXRzIHN0aWxsIGV4aXN0CiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRlbGV0YWJsZV9qZXQuZXhpc3RzKCksICJEZWxldGFibGUgamV0IHNob3VsZCBub3QgYmUgZGVsZXRlZCIpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAogICAgICAgICAgICBub3RfZGVsZXRhYmxlX2pldC5leGlzdHMoKSwgIk5vbi1kZWxldGFibGUgamV0IHNob3VsZCBub3QgYmUgZGVsZXRlZCIKICAgICAgICApCgogICAgIyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiAgICAjICAgY3JlYXRlX3dheXBvaW50IFRlc3RzCiAgICAjICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKCiAgICBkZWYgdGVzdF9jcmVhdGVfd2F5cG9pbnRfd2l0aF9yZWNvcmRfdGVtcGxhdGUoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCBjcmVhdGVfd2F5cG9pbnQgd2l0aCB3YXlwb2ludCB0ZW1wbGF0ZSByZWNvcmQKICAgICAgICAiIiIKICAgICAgICAjIEdldCB0aGUgZGVmYXVsdCBuYW1lIGZyb20gdGhlIGhlbHBlciBmdW5jdGlvbgogICAgICAgIGRlZmF1bHRfdmFscyA9IHNlbGYuamV0X3Rlc3QuX3ByZXBhcmVfd2F5cG9pbnRfdmFsdWVzKAogICAgICAgICAgICBzZWxmLndheXBvaW50X3RlbXBsYXRlLCBuYW1lPU5vbmUKICAgICAgICApCiAgICAgICAgZXhwZWN0ZWRfZGVmYXVsdF9uYW1lID0gZGVmYXVsdF92YWxzWyJuYW1lIl0KCiAgICAgICAgIyBDcmVhdGUgd2F5cG9pbnQgdXNpbmcgdGVtcGxhdGUgcmVjb3JkCiAgICAgICAgd2F5cG9pbnQgPSBzZWxmLmpldF90ZXN0LmNyZWF0ZV93YXlwb2ludChzZWxmLndheXBvaW50X3RlbXBsYXRlKQoKICAgICAgICAjIFNob3VsZCByZXR1cm4gYSB3YXlwb2ludCByZWNvcmQKICAgICAgICBzZWxmLmFzc2VydFRydWUod2F5cG9pbnQsICJTaG91bGQgcmV0dXJuIGEgd2F5cG9pbnQgcmVjb3JkIikKICAgICAgICBzZWxmLmFzc2VydFRydWUod2F5cG9pbnQuZXhpc3RzKCksICJXYXlwb2ludCBzaG91bGQgZXhpc3QiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHdheXBvaW50LmpldF9pZC5pZCwKICAgICAgICAgICAgc2VsZi5qZXRfdGVzdC5pZCwKICAgICAgICAgICAgIldheXBvaW50IHNob3VsZCBiZWxvbmcgdG8gdGhlIGpldCIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHdheXBvaW50LndheXBvaW50X3RlbXBsYXRlX2lkLmlkLAogICAgICAgICAgICBzZWxmLndheXBvaW50X3RlbXBsYXRlLmlkLAogICAgICAgICAgICAiV2F5cG9pbnQgc2hvdWxkIHVzZSB0aGUgY29ycmVjdCB0ZW1wbGF0ZSIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHdheXBvaW50Lm5hbWUsCiAgICAgICAgICAgIGV4cGVjdGVkX2RlZmF1bHRfbmFtZSwKICAgICAgICAgICAgIldheXBvaW50IHNob3VsZCBoYXZlIGRlZmF1bHQgbmFtZSBmcm9tIGhlbHBlciBmdW5jdGlvbiIsCiAgICAgICAgKQogICAgICAgICMgUmVmZXJlbmNlIGlzIGF1dG8tZ2VuZXJhdGVkLCBzbyBqdXN0IHZlcmlmeSBpdCBleGlzdHMgYW5kIGlzIG5vdCBlbXB0eQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKICAgICAgICAgICAgd2F5cG9pbnQucmVmZXJlbmNlLAogICAgICAgICAgICAiV2F5cG9pbnQgc2hvdWxkIGhhdmUgYW4gYXV0by1nZW5lcmF0ZWQgcmVmZXJlbmNlIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfY3JlYXRlX3dheXBvaW50X3dpdGhfc3RyaW5nX3JlZmVyZW5jZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IGNyZWF0ZV93YXlwb2ludCB3aXRoIHdheXBvaW50IHRlbXBsYXRlIHN0cmluZyByZWZlcmVuY2UKICAgICAgICAiIiIKICAgICAgICAjIFVzZSB0aGUgdGVtcGxhdGUncyByZWZlcmVuY2UgKG1hbmRhdG9yeSBmaWVsZCwgYWx3YXlzIHByZXNlbnQpCiAgICAgICAgdGVtcGxhdGVfcmVmZXJlbmNlID0gc2VsZi53YXlwb2ludF90ZW1wbGF0ZS5yZWZlcmVuY2UKCiAgICAgICAgIyBDcmVhdGUgd2F5cG9pbnQgdXNpbmcgc3RyaW5nIHJlZmVyZW5jZQogICAgICAgIHdheXBvaW50ID0gc2VsZi5qZXRfdGVzdC5jcmVhdGVfd2F5cG9pbnQodGVtcGxhdGVfcmVmZXJlbmNlKQoKICAgICAgICAjIFNob3VsZCByZXR1cm4gYSB3YXlwb2ludCByZWNvcmQKICAgICAgICBzZWxmLmFzc2VydFRydWUod2F5cG9pbnQsICJTaG91bGQgcmV0dXJuIGEgd2F5cG9pbnQgcmVjb3JkIikKICAgICAgICBzZWxmLmFzc2VydFRydWUod2F5cG9pbnQuZXhpc3RzKCksICJXYXlwb2ludCBzaG91bGQgZXhpc3QiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHdheXBvaW50LndheXBvaW50X3RlbXBsYXRlX2lkLmlkLAogICAgICAgICAgICBzZWxmLndheXBvaW50X3RlbXBsYXRlLmlkLAogICAgICAgICAgICAiV2F5cG9pbnQgc2hvdWxkIHVzZSB0aGUgY29ycmVjdCB0ZW1wbGF0ZSBmcm9tIHJlZmVyZW5jZSIsCiAgICAgICAgKQogICAgICAgICMgUmVmZXJlbmNlIGlzIGF1dG8tZ2VuZXJhdGVkLCBzbyBqdXN0IHZlcmlmeSBpdCBleGlzdHMgYW5kIGlzIG5vdCBlbXB0eQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKICAgICAgICAgICAgd2F5cG9pbnQucmVmZXJlbmNlLAogICAgICAgICAgICAiV2F5cG9pbnQgc2hvdWxkIGhhdmUgYW4gYXV0by1nZW5lcmF0ZWQgcmVmZXJlbmNlIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfY3JlYXRlX3dheXBvaW50X3dpdGhfbmFtZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IGNyZWF0ZV93YXlwb2ludCB3aXRoIGN1c3RvbSBuYW1lCiAgICAgICAgIiIiCiAgICAgICAgIyBDcmVhdGUgd2F5cG9pbnQgd2l0aCBjdXN0b20gbmFtZQogICAgICAgIHdheXBvaW50ID0gc2VsZi5qZXRfdGVzdC5jcmVhdGVfd2F5cG9pbnQoCiAgICAgICAgICAgIHNlbGYud2F5cG9pbnRfdGVtcGxhdGUsIG5hbWU9IkN1c3RvbSBXYXlwb2ludCBOYW1lIgogICAgICAgICkKCiAgICAgICAgIyBTaG91bGQgcmV0dXJuIGEgd2F5cG9pbnQgcmVjb3JkIHdpdGggY3VzdG9tIG5hbWUKICAgICAgICBzZWxmLmFzc2VydFRydWUod2F5cG9pbnQsICJTaG91bGQgcmV0dXJuIGEgd2F5cG9pbnQgcmVjb3JkIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICB3YXlwb2ludC5uYW1lLAogICAgICAgICAgICAiQ3VzdG9tIFdheXBvaW50IE5hbWUiLAogICAgICAgICAgICAiV2F5cG9pbnQgc2hvdWxkIGhhdmUgdGhlIGN1c3RvbSBuYW1lIiwKICAgICAgICApCiAgICAgICAgIyBSZWZlcmVuY2UgaXMgYXV0by1nZW5lcmF0ZWQsIHNvIGp1c3QgdmVyaWZ5IGl0IGV4aXN0cyBhbmQgaXMgbm90IGVtcHR5CiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAogICAgICAgICAgICB3YXlwb2ludC5yZWZlcmVuY2UsCiAgICAgICAgICAgICJXYXlwb2ludCBzaG91bGQgaGF2ZSBhbiBhdXRvLWdlbmVyYXRlZCByZWZlcmVuY2UiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9jcmVhdGVfd2F5cG9pbnRfd2l0aF9mbHlfaGVyZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IGNyZWF0ZV93YXlwb2ludCB3aXRoIGZseV9oZXJlIHBhcmFtZXRlcgogICAgICAgIE5vdGU6IGZseV9oZXJlIHNob3VsZCBzZXQgaXNfZGVzdGluYXRpb249VHJ1ZSwgYW5kIGFmdGVyIHByZXBhcmUoKQogICAgICAgIHRoZSB3YXlwb2ludCBzaG91bGQgYXV0b21hdGljYWxseSBmbHkgdG8gaWYgaXNfZGVzdGluYXRpb24gaXMgVHJ1ZQogICAgICAgICIiIgogICAgICAgICMgQ3JlYXRlIHdheXBvaW50IHdpdGggZmx5X2hlcmU9VHJ1ZQogICAgICAgIHdheXBvaW50ID0gc2VsZi5qZXRfdGVzdC5jcmVhdGVfd2F5cG9pbnQoc2VsZi53YXlwb2ludF90ZW1wbGF0ZSwgZmx5X2hlcmU9VHJ1ZSkKCiAgICAgICAgIyBTaG91bGQgcmV0dXJuIGEgd2F5cG9pbnQgcmVjb3JkCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdheXBvaW50LCAiU2hvdWxkIHJldHVybiBhIHdheXBvaW50IHJlY29yZCIpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdheXBvaW50LmV4aXN0cygpLCAiV2F5cG9pbnQgc2hvdWxkIGV4aXN0IikKCiAgICAgICAgIyBWZXJpZnkgdGhhdCB0aGUgd2F5cG9pbnQgZmxldyB0bwogICAgICAgICMgKHN0YXRlIHNob3VsZCBiZSAiY3VycmVudCIgaW4gc3luY2hyb25vdXMgdGVzdHMpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgd2F5cG9pbnQuc3RhdGUsCiAgICAgICAgICAgICJjdXJyZW50IiwKICAgICAgICAgICAgIldheXBvaW50IHNob3VsZCBoYXZlIGZsb3duIHRvIGFuZCAiCiAgICAgICAgICAgICJiZWNvbWUgY3VycmVudCAodGVzdHMgcnVuIHN5bmNocm9ub3VzbHkpIiwKICAgICAgICApCgogICAgICAgICMgVmVyaWZ5IGpldCdzIHdheXBvaW50X2lkIHdhcyB1cGRhdGVkCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgc2VsZi5qZXRfdGVzdC53YXlwb2ludF9pZC5pZCwKICAgICAgICAgICAgd2F5cG9pbnQuaWQsCiAgICAgICAgICAgICJKZXQncyB3YXlwb2ludF9pZCBzaG91bGQgYmUgdXBkYXRlZCB0byB0aGUgZmxvd24tdG8gd2F5cG9pbnQiLAogICAgICAgICkKCiAgICBAbXV0ZV9sb2dnZXIoIm9kb28uYWRkb25zLmNldG1peF90b3dlcl9zZXJ2ZXIubW9kZWxzLmN4X3Rvd2VyX2pldCIpCiAgICBkZWYgdGVzdF9jcmVhdGVfd2F5cG9pbnRfamV0X2J1c3koc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCBjcmVhdGVfd2F5cG9pbnQgd2hlbiBqZXQgaXMgYnVzeSAoaGFzIHRhcmdldF9zdGF0ZV9pZCkKICAgICAgICAiIiIKICAgICAgICAjIFNldCBqZXQgdG8gYnVzeSBzdGF0ZSAoaGFzIHRhcmdldF9zdGF0ZV9pZCkKICAgICAgICBzZWxmLmpldF90ZXN0LnRhcmdldF9zdGF0ZV9pZCA9IHNlbGYuc3RhdGVfcnVubmluZwoKICAgICAgICAjIFRyeSB0byBjcmVhdGUgd2F5cG9pbnQKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbGlkYXRpb25FcnJvcik6CiAgICAgICAgICAgIHNlbGYuamV0X3Rlc3QuY3JlYXRlX3dheXBvaW50KHNlbGYud2F5cG9pbnRfdGVtcGxhdGUpCgogICAgQG11dGVfbG9nZ2VyKCJvZG9vLmFkZG9ucy5jZXRtaXhfdG93ZXJfc2VydmVyLm1vZGVscy5jeF90b3dlcl9qZXQiKQogICAgZGVmIHRlc3RfY3JlYXRlX3dheXBvaW50X3RlbXBsYXRlX25vdF9mb3VuZChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IGNyZWF0ZV93YXlwb2ludCB3aXRoIG5vbi1leGlzdGVudCB0ZW1wbGF0ZSByZWZlcmVuY2UKICAgICAgICAiIiIKICAgICAgICAjIE11dGUgbG9nZ2VyIGVycm9yIGZvciB0aGlzIHRlc3QKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbGlkYXRpb25FcnJvcik6CiAgICAgICAgICAgIHNlbGYuamV0X3Rlc3QuY3JlYXRlX3dheXBvaW50KCJub25fZXhpc3RlbnRfcmVmZXJlbmNlIikKCiAgICBAbXV0ZV9sb2dnZXIoIm9kb28uYWRkb25zLmNldG1peF90b3dlcl9zZXJ2ZXIubW9kZWxzLmN4X3Rvd2VyX2pldCIpCiAgICBkZWYgdGVzdF9jcmVhdGVfd2F5cG9pbnRfdGVtcGxhdGVfd3JvbmdfamV0X3RlbXBsYXRlKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgY3JlYXRlX3dheXBvaW50IHdpdGggdGVtcGxhdGUgZnJvbSBkaWZmZXJlbnQgamV0IHRlbXBsYXRlCiAgICAgICAgIiIiCiAgICAgICAgIyBDcmVhdGUgYSB3YXlwb2ludCB0ZW1wbGF0ZSBmb3IgYSBkaWZmZXJlbnQgamV0IHRlbXBsYXRlCiAgICAgICAgb3RoZXJfamV0X3RlbXBsYXRlID0gc2VsZi5KZXRUZW1wbGF0ZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIk90aGVyIEpldCBUZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIm90aGVyX2pldF90ZW1wbGF0ZSIsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgb3RoZXJfd2F5cG9pbnRfdGVtcGxhdGUgPSBzZWxmLkpldFdheXBvaW50VGVtcGxhdGUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJPdGhlciBXYXlwb2ludCBUZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2lkIjogb3RoZXJfamV0X3RlbXBsYXRlLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIE11dGUgbG9nZ2VyIGVycm9yIGZvciB0aGlzIHRlc3QKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbGlkYXRpb25FcnJvcik6CiAgICAgICAgICAgICMgVHJ5IHRvIGNyZWF0ZSB3YXlwb2ludCB3aXRoIHRlbXBsYXRlIGZyb20gZGlmZmVyZW50IGpldCB0ZW1wbGF0ZQogICAgICAgICAgICBzZWxmLmpldF90ZXN0LmNyZWF0ZV93YXlwb2ludChvdGhlcl93YXlwb2ludF90ZW1wbGF0ZSkKCiAgICAjICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKICAgICMgICBDcmVhdGUgYSBXYXlwb2ludCBjb21tYW5kIChmbGlnaHQgcGxhbikgdGVzdHMKICAgICMgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwoKICAgIGRlZiB0ZXN0X2NyZWF0ZV93YXlwb2ludF9jb21tYW5kX3N1Y2Nlc3NfZmx5X2hlcmVfZmFsc2Uoc2VsZik6CiAgICAgICAgIiIiQ3JlYXRlIGEgV2F5cG9pbnQgY29tbWFuZCBmcm9tIGZsaWdodCBwbGFuOiB3YXlwb2ludCBjcmVhdGVkLCBsb2cKICAgICAgICBmaW5pc2hlZCBieSBjYWxsYmFjay4iIiIKICAgICAgICBjb21tYW5kID0gc2VsZi5Db21tYW5kLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiQ3JlYXRlIHdheXBvaW50IGNvbW1hbmQiLAogICAgICAgICAgICAgICAgImFjdGlvbiI6ICJjcmVhdGVfd2F5cG9pbnQiLAogICAgICAgICAgICAgICAgIndheXBvaW50X3RlbXBsYXRlX2lkIjogc2VsZi53YXlwb2ludF90ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgICAgICJmbHlfaGVyZSI6IEZhbHNlLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHBsYW4gPSBzZWxmLlBsYW4uY3JlYXRlKHsibmFtZSI6ICJQbGFuIGNyZWF0ZSB3YXlwb2ludCJ9KQogICAgICAgIHNlbGYucGxhbl9saW5lLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInBsYW5faWQiOiBwbGFuLmlkLAogICAgICAgICAgICAgICAgInNlcXVlbmNlIjogMTAsCiAgICAgICAgICAgICAgICAiY29tbWFuZF9pZCI6IGNvbW1hbmQuaWQsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgaW5pdGlhbF93YXlwb2ludF9jb3VudCA9IGxlbihzZWxmLmpldF90ZXN0LndheXBvaW50X2lkcykKICAgICAgICBwbGFuX2xvZyA9IHNlbGYuc2VydmVyX3Rlc3RfMS5zdWRvKCkucnVuX2ZsaWdodF9wbGFuKHBsYW4sIGpldD1zZWxmLmpldF90ZXN0KQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwbGFuX2xvZywgIlBsYW4gbG9nIHNob3VsZCBiZSBjcmVhdGVkIikKICAgICAgICBjb21tYW5kX2xvZ3MgPSBwbGFuX2xvZy5jb21tYW5kX2xvZ19pZHMuZmlsdGVyZWQoCiAgICAgICAgICAgIGxhbWJkYSBsb2c6IGxvZy5jb21tYW5kX2lkID09IGNvbW1hbmQKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbGVuKGNvbW1hbmRfbG9ncyksIDEsICJFeGFjdGx5IG9uZSBjb21tYW5kIGxvZyBmb3IgY3JlYXRlX3dheXBvaW50IgogICAgICAgICkKICAgICAgICBsb2dfcmVjb3JkID0gY29tbWFuZF9sb2dzWzBdCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAogICAgICAgICAgICBsb2dfcmVjb3JkLmZpbmlzaF9kYXRlLAogICAgICAgICAgICAiQ29tbWFuZCBsb2cgc2hvdWxkIGJlIGZpbmlzaGVkIGJ5IHdheXBvaW50IGNhbGxiYWNrIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbG9nX3JlY29yZC5jb21tYW5kX3N0YXR1cywKICAgICAgICAgICAgMCwKICAgICAgICAgICAgIkNvbW1hbmQgc2hvdWxkIGZpbmlzaCB3aXRoIHN1Y2Nlc3MiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBsZW4oc2VsZi5qZXRfdGVzdC53YXlwb2ludF9pZHMpLAogICAgICAgICAgICBpbml0aWFsX3dheXBvaW50X2NvdW50ICsgMSwKICAgICAgICAgICAgIk9uZSBuZXcgd2F5cG9pbnQgc2hvdWxkIGJlIGNyZWF0ZWQiLAogICAgICAgICkKICAgICAgICBuZXdfd2F5cG9pbnQgPSBzZWxmLmpldF90ZXN0LndheXBvaW50X2lkcy5maWx0ZXJlZCgKICAgICAgICAgICAgbGFtYmRhIHc6IHcuY3JlYXRlZF9mcm9tX2NvbW1hbmRfbG9nX2lkID09IGxvZ19yZWNvcmQKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obmV3X3dheXBvaW50KSwgMSwgIk9uZSB3YXlwb2ludCBsaW5rZWQgdG8gY29tbWFuZCBsb2ciKQogICAgICAgIG5ld193YXlwb2ludCA9IG5ld193YXlwb2ludFswXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIG5ld193YXlwb2ludC5zdGF0ZSwKICAgICAgICAgICAgInJlYWR5IiwKICAgICAgICAgICAgIldheXBvaW50IHNob3VsZCBiZSBpbiByZWFkeSBzdGF0ZSAoZmx5X2hlcmU9RmFsc2UpIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbmV3X3dheXBvaW50LmNyZWF0ZWRfZnJvbV9jb21tYW5kX2xvZ19pZCwKICAgICAgICAgICAgbG9nX3JlY29yZCwKICAgICAgICAgICAgIldheXBvaW50IHNob3VsZCByZWZlcmVuY2UgdGhlIGNvbW1hbmQgbG9nIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfY3JlYXRlX3dheXBvaW50X2NvbW1hbmRfc3VjY2Vzc19mbHlfaGVyZV90cnVlKHNlbGYpOgogICAgICAgICIiIkNyZWF0ZSBhIFdheXBvaW50IGNvbW1hbmQgd2l0aCBmbHlfaGVyZTogd2F5cG9pbnQgYmVjb21lcyBjdXJyZW50LiIiIgogICAgICAgIGNvbW1hbmQgPSBzZWxmLkNvbW1hbmQuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJDcmVhdGUgd2F5cG9pbnQgZmx5IGhlcmUiLAogICAgICAgICAgICAgICAgImFjdGlvbiI6ICJjcmVhdGVfd2F5cG9pbnQiLAogICAgICAgICAgICAgICAgIndheXBvaW50X3RlbXBsYXRlX2lkIjogc2VsZi53YXlwb2ludF90ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgICAgICJmbHlfaGVyZSI6IFRydWUsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgcGxhbiA9IHNlbGYuUGxhbi5jcmVhdGUoeyJuYW1lIjogIlBsYW4gY3JlYXRlIHdheXBvaW50IGZseSBoZXJlIn0pCiAgICAgICAgc2VsZi5wbGFuX2xpbmUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAicGxhbl9pZCI6IHBsYW4uaWQsCiAgICAgICAgICAgICAgICAic2VxdWVuY2UiOiAxMCwKICAgICAgICAgICAgICAgICJjb21tYW5kX2lkIjogY29tbWFuZC5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICBwbGFuX2xvZyA9IHNlbGYuc2VydmVyX3Rlc3RfMS5zdWRvKCkucnVuX2ZsaWdodF9wbGFuKHBsYW4sIGpldD1zZWxmLmpldF90ZXN0KQogICAgICAgIGNvbW1hbmRfbG9ncyA9IHBsYW5fbG9nLmNvbW1hbmRfbG9nX2lkcy5maWx0ZXJlZCgKICAgICAgICAgICAgbGFtYmRhIGxvZzogbG9nLmNvbW1hbmRfaWQgPT0gY29tbWFuZAogICAgICAgICkKICAgICAgICBsb2dfcmVjb3JkID0gY29tbWFuZF9sb2dzWzBdCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxvZ19yZWNvcmQuZmluaXNoX2RhdGUsICJDb21tYW5kIGxvZyBzaG91bGQgYmUgZmluaXNoZWQiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9nX3JlY29yZC5jb21tYW5kX3N0YXR1cywgMCwgIkNvbW1hbmQgc2hvdWxkIHN1Y2NlZWQiKQogICAgICAgIHdheXBvaW50c193aXRoX2xvZyA9IHNlbGYuamV0X3Rlc3Qud2F5cG9pbnRfaWRzLmZpbHRlcmVkKAogICAgICAgICAgICBsYW1iZGEgdzogdy5jcmVhdGVkX2Zyb21fY29tbWFuZF9sb2dfaWQgPT0gbG9nX3JlY29yZAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBsZW4od2F5cG9pbnRzX3dpdGhfbG9nKSwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgIk9uZSB3YXlwb2ludCBjcmVhdGVkIGZyb20gY29tbWFuZCIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHdheXBvaW50c193aXRoX2xvZy5zdGF0ZSwKICAgICAgICAgICAgImN1cnJlbnQiLAogICAgICAgICAgICAiV2F5cG9pbnQgc2hvdWxkIGJlIGN1cnJlbnQgd2hlbiBmbHlfaGVyZT1UcnVlIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgc2VsZi5qZXRfdGVzdC53YXlwb2ludF9pZCwKICAgICAgICAgICAgd2F5cG9pbnRzX3dpdGhfbG9nLAogICAgICAgICAgICAiSmV0IHdheXBvaW50X2lkIHNob3VsZCBwb2ludCB0byB0aGUgbmV3IHdheXBvaW50IiwKICAgICAgICApCgogICAgZGVmIHRlc3RfY3JlYXRlX3dheXBvaW50X2NvbW1hbmRfbm9famV0KHNlbGYpOgogICAgICAgICIiIkNyZWF0ZSBhIFdheXBvaW50IGNvbW1hbmQgcnVuIHdpdGhvdXQgamV0OiBjb21tYW5kIGxvZyBmaW5pc2hlZAogICAgICAgIHdpdGggSkVUX05PVF9GT1VORC4iIiIKICAgICAgICBmcm9tIC4ubW9kZWxzLmNvbnN0YW50cyBpbXBvcnQgSkVUX05PVF9GT1VORAoKICAgICAgICBjb21tYW5kID0gc2VsZi5Db21tYW5kLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiQ3JlYXRlIHdheXBvaW50IG5vIGpldCIsCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogImNyZWF0ZV93YXlwb2ludCIsCiAgICAgICAgICAgICAgICAid2F5cG9pbnRfdGVtcGxhdGVfaWQiOiBzZWxmLndheXBvaW50X3RlbXBsYXRlLmlkLAogICAgICAgICAgICAgICAgImZseV9oZXJlIjogRmFsc2UsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgcGxhbiA9IHNlbGYuUGxhbi5jcmVhdGUoeyJuYW1lIjogIlBsYW4gbm8gamV0In0pCiAgICAgICAgc2VsZi5wbGFuX2xpbmUuY3JlYXRlKAogICAgICAgICAgICB7InBsYW5faWQiOiBwbGFuLmlkLCAic2VxdWVuY2UiOiAxMCwgImNvbW1hbmRfaWQiOiBjb21tYW5kLmlkfQogICAgICAgICkKICAgICAgICBwbGFuX2xvZyA9IHNlbGYuc2VydmVyX3Rlc3RfMS5zdWRvKCkucnVuX2ZsaWdodF9wbGFuKHBsYW4pCiAgICAgICAgY29tbWFuZF9sb2dzID0gcGxhbl9sb2cuY29tbWFuZF9sb2dfaWRzLmZpbHRlcmVkKAogICAgICAgICAgICBsYW1iZGEgbG9nOiBsb2cuY29tbWFuZF9pZCA9PSBjb21tYW5kCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGNvbW1hbmRfbG9ncyksIDEpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgY29tbWFuZF9sb2dzLmNvbW1hbmRfc3RhdHVzLAogICAgICAgICAgICBKRVRfTk9UX0ZPVU5ELAogICAgICAgICAgICAiU2hvdWxkIGZpbmlzaCB3aXRoIEpFVF9OT1RfRk9VTkQgd2hlbiBubyBqZXQgaW4gcGxhbiIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb21tYW5kX2xvZ3MuZmluaXNoX2RhdGUpCgogICAgZGVmIHRlc3RfY3JlYXRlX3dheXBvaW50X2NvbW1hbmRfbm9fdGVtcGxhdGUoc2VsZik6CiAgICAgICAgIiIiQ3JlYXRlIGEgV2F5cG9pbnQgY29tbWFuZCB3aXRob3V0IHdheXBvaW50IHRlbXBsYXRlOgogICAgICAgIFdBWVBPSU5UX1RFTVBMQVRFX05PVF9GT1VORC4iIiIKICAgICAgICBmcm9tIC4ubW9kZWxzLmNvbnN0YW50cyBpbXBvcnQgV0FZUE9JTlRfVEVNUExBVEVfTk9UX0ZPVU5ECgogICAgICAgIGNvbW1hbmQgPSBzZWxmLkNvbW1hbmQuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJDcmVhdGUgd2F5cG9pbnQgbm8gdGVtcGxhdGUiLAogICAgICAgICAgICAgICAgImFjdGlvbiI6ICJjcmVhdGVfd2F5cG9pbnQiLAogICAgICAgICAgICAgICAgImZseV9oZXJlIjogRmFsc2UsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgcGxhbiA9IHNlbGYuUGxhbi5jcmVhdGUoeyJuYW1lIjogIlBsYW4gbm8gdGVtcGxhdGUifSkKICAgICAgICBzZWxmLnBsYW5fbGluZS5jcmVhdGUoCiAgICAgICAgICAgIHsicGxhbl9pZCI6IHBsYW4uaWQsICJzZXF1ZW5jZSI6IDEwLCAiY29tbWFuZF9pZCI6IGNvbW1hbmQuaWR9CiAgICAgICAgKQogICAgICAgIHBsYW5fbG9nID0gc2VsZi5zZXJ2ZXJfdGVzdF8xLnN1ZG8oKS5ydW5fZmxpZ2h0X3BsYW4ocGxhbiwgamV0PXNlbGYuamV0X3Rlc3QpCiAgICAgICAgY29tbWFuZF9sb2dzID0gcGxhbl9sb2cuY29tbWFuZF9sb2dfaWRzLmZpbHRlcmVkKAogICAgICAgICAgICBsYW1iZGEgbG9nOiBsb2cuY29tbWFuZF9pZCA9PSBjb21tYW5kCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGNvbW1hbmRfbG9ncyksIDEpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgY29tbWFuZF9sb2dzLmNvbW1hbmRfc3RhdHVzLAogICAgICAgICAgICBXQVlQT0lOVF9URU1QTEFURV9OT1RfRk9VTkQsCiAgICAgICAgICAgICJTaG91bGQgZmluaXNoIHdpdGggV0FZUE9JTlRfVEVNUExBVEVfTk9UX0ZPVU5EIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfY3JlYXRlX3dheXBvaW50X2NvbW1hbmRfamV0X2J1c3koc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQ3JlYXRlIGEgV2F5cG9pbnQgd2hlbiBqZXQgaXMgYnVzeSAoZS5nLiBmcm9tIGZsaWdodCBwbGFuKToKICAgICAgICBpZ25vcmVfYnVzeT1UcnVlLCB3YXlwb2ludCBjcmVhdGVkLCBsb2cgc3VjY2Vzcy4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmpldF90ZXN0LnRhcmdldF9zdGF0ZV9pZCA9IHNlbGYuc3RhdGVfcnVubmluZwogICAgICAgIGNvbW1hbmQgPSBzZWxmLkNvbW1hbmQuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJDcmVhdGUgd2F5cG9pbnQgamV0IGJ1c3kiLAogICAgICAgICAgICAgICAgImFjdGlvbiI6ICJjcmVhdGVfd2F5cG9pbnQiLAogICAgICAgICAgICAgICAgIndheXBvaW50X3RlbXBsYXRlX2lkIjogc2VsZi53YXlwb2ludF90ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgICAgICJmbHlfaGVyZSI6IEZhbHNlLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHBsYW4gPSBzZWxmLlBsYW4uY3JlYXRlKHsibmFtZSI6ICJQbGFuIGpldCBidXN5In0pCiAgICAgICAgc2VsZi5wbGFuX2xpbmUuY3JlYXRlKAogICAgICAgICAgICB7InBsYW5faWQiOiBwbGFuLmlkLCAic2VxdWVuY2UiOiAxMCwgImNvbW1hbmRfaWQiOiBjb21tYW5kLmlkfQogICAgICAgICkKICAgICAgICBpbml0aWFsX3dheXBvaW50X2NvdW50ID0gbGVuKHNlbGYuamV0X3Rlc3Qud2F5cG9pbnRfaWRzKQogICAgICAgIHdpdGggbXV0ZV9sb2dnZXIoIm9kb28uYWRkb25zLmNldG1peF90b3dlcl9zZXJ2ZXIubW9kZWxzLmN4X3Rvd2VyX2pldCIpOgogICAgICAgICAgICBwbGFuX2xvZyA9IHNlbGYuc2VydmVyX3Rlc3RfMS5zdWRvKCkucnVuX2ZsaWdodF9wbGFuKAogICAgICAgICAgICAgICAgcGxhbiwgamV0PXNlbGYuamV0X3Rlc3QKICAgICAgICAgICAgKQogICAgICAgIGNvbW1hbmRfbG9ncyA9IHBsYW5fbG9nLmNvbW1hbmRfbG9nX2lkcy5maWx0ZXJlZCgKICAgICAgICAgICAgbGFtYmRhIGxvZzogbG9nLmNvbW1hbmRfaWQgPT0gY29tbWFuZAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjb21tYW5kX2xvZ3MpLCAxKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKICAgICAgICAgICAgY29tbWFuZF9sb2dzLmZpbmlzaF9kYXRlLAogICAgICAgICAgICAiQ29tbWFuZCBsb2cgc2hvdWxkIGJlIGZpbmlzaGVkIGJ5IHdheXBvaW50IGNhbGxiYWNrIHdoZW4gamV0IGJ1c3kiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBjb21tYW5kX2xvZ3MuY29tbWFuZF9zdGF0dXMsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJDcmVhdGUgd2F5cG9pbnQgY29tbWFuZCBzaG91bGQgc3VjY2VlZCB3aGVuIGpldCBpcyBidXN5ICIKICAgICAgICAgICAgIihpZ25vcmVfYnVzeT1UcnVlKSIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGxlbihzZWxmLmpldF90ZXN0LndheXBvaW50X2lkcyksCiAgICAgICAgICAgIGluaXRpYWxfd2F5cG9pbnRfY291bnQgKyAxLAogICAgICAgICAgICAiT25lIG5ldyB3YXlwb2ludCBzaG91bGQgYmUgY3JlYXRlZCBkZXNwaXRlIGpldCBidXN5IiwKICAgICAgICApCiAgICAgICAgc2VsZi5qZXRfdGVzdC50YXJnZXRfc3RhdGVfaWQgPSBGYWxzZQoKICAgIGRlZiB0ZXN0X2NyZWF0ZV93YXlwb2ludF9jb21tYW5kX3dyb25nX2pldF90ZW1wbGF0ZShzZWxmKToKICAgICAgICAiIiJDcmVhdGUgYSBXYXlwb2ludCB3aXRoIHRlbXBsYXRlIGZvciBhbm90aGVyIGpldCB0ZW1wbGF0ZTogRmFsc2UKICAgICAgICBhbmQgV0FZUE9JTlRfQ1JFQVRFX0ZBSUxFRC4iIiIKICAgICAgICBmcm9tIC4ubW9kZWxzLmNvbnN0YW50cyBpbXBvcnQgV0FZUE9JTlRfQ1JFQVRFX0ZBSUxFRAoKICAgICAgICBvdGhlcl9qZXRfdGVtcGxhdGUgPSBzZWxmLkpldFRlbXBsYXRlLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiT3RoZXIgSmV0IFRlbXBsYXRlIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAib3RoZXJfamV0X3RlbXBsYXRlX2NtZCIsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgb3RoZXJfd2F5cG9pbnRfdGVtcGxhdGUgPSBzZWxmLkpldFdheXBvaW50VGVtcGxhdGUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJPdGhlciBXYXlwb2ludCBUZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2lkIjogb3RoZXJfamV0X3RlbXBsYXRlLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIGNvbW1hbmQgPSBzZWxmLkNvbW1hbmQuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJDcmVhdGUgd2F5cG9pbnQgd3JvbmcgdGVtcGxhdGUiLAogICAgICAgICAgICAgICAgImFjdGlvbiI6ICJjcmVhdGVfd2F5cG9pbnQiLAogICAgICAgICAgICAgICAgIndheXBvaW50X3RlbXBsYXRlX2lkIjogb3RoZXJfd2F5cG9pbnRfdGVtcGxhdGUuaWQsCiAgICAgICAgICAgICAgICAiZmx5X2hlcmUiOiBGYWxzZSwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICBwbGFuID0gc2VsZi5QbGFuLmNyZWF0ZSh7Im5hbWUiOiAiUGxhbiB3cm9uZyB0ZW1wbGF0ZSJ9KQogICAgICAgIHNlbGYucGxhbl9saW5lLmNyZWF0ZSgKICAgICAgICAgICAgeyJwbGFuX2lkIjogcGxhbi5pZCwgInNlcXVlbmNlIjogMTAsICJjb21tYW5kX2lkIjogY29tbWFuZC5pZH0KICAgICAgICApCiAgICAgICAgd2l0aCBtdXRlX2xvZ2dlcigib2Rvby5hZGRvbnMuY2V0bWl4X3Rvd2VyX3NlcnZlci5tb2RlbHMuY3hfdG93ZXJfamV0Iik6CiAgICAgICAgICAgIHBsYW5fbG9nID0gc2VsZi5zZXJ2ZXJfdGVzdF8xLnN1ZG8oKS5ydW5fZmxpZ2h0X3BsYW4oCiAgICAgICAgICAgICAgICBwbGFuLCBqZXQ9c2VsZi5qZXRfdGVzdAogICAgICAgICAgICApCiAgICAgICAgY29tbWFuZF9sb2dzID0gcGxhbl9sb2cuY29tbWFuZF9sb2dfaWRzLmZpbHRlcmVkKAogICAgICAgICAgICBsYW1iZGEgbG9nOiBsb2cuY29tbWFuZF9pZCA9PSBjb21tYW5kCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGNvbW1hbmRfbG9ncyksIDEpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgY29tbWFuZF9sb2dzLmNvbW1hbmRfc3RhdHVzLAogICAgICAgICAgICBXQVlQT0lOVF9DUkVBVEVfRkFJTEVELAogICAgICAgICAgICAiU2hvdWxkIGZpbmlzaCB3aXRoIFdBWVBPSU5UX0NSRUFURV9GQUlMRUQgd2hlbiB0ZW1wbGF0ZSBpcyAiCiAgICAgICAgICAgICJmb3IgYW5vdGhlciBqZXQgdGVtcGxhdGUiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydFRydWUoY29tbWFuZF9sb2dzLmZpbmlzaF9kYXRlKQoKICAgIGRlZiB0ZXN0X2NyZWF0ZV93YXlwb2ludF9jb21tYW5kX3dheXBvaW50X3JlYWNoZXNfZXJyb3Ioc2VsZik6CiAgICAgICAgIiIiQ3JlYXRlIHBsYW4gZmFpbHM6IHdheXBvaW50IGdvZXMgdG8gZXJyb3IsIGNhbGxiYWNrIGZpbmlzaGVzCiAgICAgICAgY29tbWFuZCBsb2cgd2l0aCBlcnJvci4iIiIKICAgICAgICBmcm9tIC4ubW9kZWxzLmNvbnN0YW50cyBpbXBvcnQgV0FZUE9JTlRfQ1JFQVRFX0ZBSUxFRAoKICAgICAgICBmYWlsX2NvbW1hbmQgPSBzZWxmLkNvbW1hbmQuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJGYWlsIGNvbW1hbmQiLAogICAgICAgICAgICAgICAgImFjdGlvbiI6ICJweXRob25fY29kZSIsCiAgICAgICAgICAgICAgICAiY29kZSI6ICJyZXN1bHQgPSB7J2V4aXRfY29kZSc6IDEsICdtZXNzYWdlJzogJ2ZhaWwnfSIsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgZmFpbF9wbGFuID0gc2VsZi5QbGFuLmNyZWF0ZSh7Im5hbWUiOiAiUGxhbiB0aGF0IGZhaWxzIn0pCiAgICAgICAgc2VsZi5wbGFuX2xpbmUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAicGxhbl9pZCI6IGZhaWxfcGxhbi5pZCwKICAgICAgICAgICAgICAgICJzZXF1ZW5jZSI6IDEwLAogICAgICAgICAgICAgICAgImNvbW1hbmRfaWQiOiBmYWlsX2NvbW1hbmQuaWQsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgd2F5cG9pbnRfdGVtcGxhdGVfd2l0aF9mYWlsaW5nX3BsYW4gPSBzZWxmLkpldFdheXBvaW50VGVtcGxhdGUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJXYXlwb2ludCB0ZW1wbGF0ZSB3aXRoIGZhaWxpbmcgY3JlYXRlIHBsYW4iLAogICAgICAgICAgICAgICAgImpldF90ZW1wbGF0ZV9pZCI6IHNlbGYuamV0X3RlbXBsYXRlX3Rlc3QuaWQsCiAgICAgICAgICAgICAgICAicGxhbl9jcmVhdGVfaWQiOiBmYWlsX3BsYW4uaWQsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgY29tbWFuZCA9IHNlbGYuQ29tbWFuZC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIkNyZWF0ZSB3YXlwb2ludCB3aXRoIGZhaWxpbmcgcGxhbiIsCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogImNyZWF0ZV93YXlwb2ludCIsCiAgICAgICAgICAgICAgICAid2F5cG9pbnRfdGVtcGxhdGVfaWQiOiB3YXlwb2ludF90ZW1wbGF0ZV93aXRoX2ZhaWxpbmdfcGxhbi5pZCwKICAgICAgICAgICAgICAgICJmbHlfaGVyZSI6IEZhbHNlLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHBsYW4gPSBzZWxmLlBsYW4uY3JlYXRlKHsibmFtZSI6ICJQbGFuIGNyZWF0ZSB3YXlwb2ludCBlcnJvciJ9KQogICAgICAgIHNlbGYucGxhbl9saW5lLmNyZWF0ZSgKICAgICAgICAgICAgeyJwbGFuX2lkIjogcGxhbi5pZCwgInNlcXVlbmNlIjogMTAsICJjb21tYW5kX2lkIjogY29tbWFuZC5pZH0KICAgICAgICApCiAgICAgICAgcGxhbl9sb2cgPSBzZWxmLnNlcnZlcl90ZXN0XzEuc3VkbygpLnJ1bl9mbGlnaHRfcGxhbihwbGFuLCBqZXQ9c2VsZi5qZXRfdGVzdCkKICAgICAgICBjb21tYW5kX2xvZ3MgPSBwbGFuX2xvZy5jb21tYW5kX2xvZ19pZHMuZmlsdGVyZWQoCiAgICAgICAgICAgIGxhbWJkYSBsb2c6IGxvZy5jb21tYW5kX2lkID09IGNvbW1hbmQKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oY29tbWFuZF9sb2dzKSwgMSkKICAgICAgICBsb2dfcmVjb3JkID0gY29tbWFuZF9sb2dzWzBdCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAogICAgICAgICAgICBsb2dfcmVjb3JkLmZpbmlzaF9kYXRlLAogICAgICAgICAgICAiQ29tbWFuZCBsb2cgc2hvdWxkIGJlIGZpbmlzaGVkIGJ5IHdheXBvaW50IGNhbGxiYWNrIHdoZW4gIgogICAgICAgICAgICAid2F5cG9pbnQgcmVhY2hlcyBlcnJvciIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoCiAgICAgICAgICAgIGxvZ19yZWNvcmQuY29tbWFuZF9zdGF0dXMsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJDb21tYW5kIHNob3VsZCBmaW5pc2ggd2l0aCBlcnJvciBzdGF0dXMiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBsb2dfcmVjb3JkLmNvbW1hbmRfc3RhdHVzLAogICAgICAgICAgICBXQVlQT0lOVF9DUkVBVEVfRkFJTEVELAogICAgICAgICAgICAiQ2FsbGJhY2sgc2hvdWxkIHVzZSBXQVlQT0lOVF9DUkVBVEVfRkFJTEVEIHdoZW4gcGxhbiBmYWlscyIsCiAgICAgICAgKQogICAgICAgIHdheXBvaW50c193aXRoX2xvZyA9IHNlbGYuamV0X3Rlc3Qud2F5cG9pbnRfaWRzLmZpbHRlcmVkKAogICAgICAgICAgICBsYW1iZGEgdzogdy5jcmVhdGVkX2Zyb21fY29tbWFuZF9sb2dfaWQgPT0gbG9nX3JlY29yZAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3YXlwb2ludHNfd2l0aF9sb2cpLCAxKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHdheXBvaW50c193aXRoX2xvZy5zdGF0ZSwKICAgICAgICAgICAgImVycm9yIiwKICAgICAgICAgICAgIldheXBvaW50IHNob3VsZCBiZSBpbiBlcnJvciBzdGF0ZSBhZnRlciBjcmVhdGUgcGxhbiBmYWlscyIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X2ZpbmFsaXplX2NyZWF0ZV93YXlwb2ludF9jb21tYW5kX2xvZ19kb3VibGVfZmluaXNoX2d1YXJkKHNlbGYpOgogICAgICAgICIiIkNhbGxpbmcgX2ZpbmFsaXplX2NyZWF0ZV93YXlwb2ludF9jb21tYW5kX2xvZyB0d2ljZSBkb2VzIG5vdAogICAgICAgIGRvdWJsZS1maW5pc2guIiIiCiAgICAgICAgd2F5cG9pbnQgPSBzZWxmLmpldF90ZXN0LmNyZWF0ZV93YXlwb2ludCgKICAgICAgICAgICAgc2VsZi53YXlwb2ludF90ZW1wbGF0ZSwKICAgICAgICAgICAgY3JlYXRlZF9mcm9tX2NvbW1hbmRfbG9nPU5vbmUsCiAgICAgICAgKQogICAgICAgIGxvZ19yZWNvcmQgPSBzZWxmLkNvbW1hbmRMb2cuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkLAogICAgICAgICAgICAgICAgImNvbW1hbmRfaWQiOiBzZWxmLkNvbW1hbmQuY3JlYXRlKAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiRHVtbXkgY3JlYXRlIHdheXBvaW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbiI6ICJjcmVhdGVfd2F5cG9pbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAid2F5cG9pbnRfdGVtcGxhdGVfaWQiOiBzZWxmLndheXBvaW50X3RlbXBsYXRlLmlkLAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkuaWQsCiAgICAgICAgICAgICAgICAic3RhcnRfZGF0ZSI6IGZpZWxkcy5EYXRldGltZS5ub3coKSwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICB3YXlwb2ludC5jcmVhdGVkX2Zyb21fY29tbWFuZF9sb2dfaWQgPSBsb2dfcmVjb3JkCiAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShsb2dfcmVjb3JkLmZpbmlzaF9kYXRlLCAiTG9nIHNob3VsZCBub3QgYmUgZmluaXNoZWQgeWV0IikKICAgICAgICB3YXlwb2ludC5fZmluYWxpemVfY3JlYXRlX3dheXBvaW50X2NvbW1hbmRfbG9nKHN1Y2Nlc3M9VHJ1ZSkKICAgICAgICBzZWxmLmFzc2VydFRydWUobG9nX3JlY29yZC5maW5pc2hfZGF0ZSwgIkxvZyBzaG91bGQgYmUgZmluaXNoZWQgb25jZSIpCiAgICAgICAgZmluaXNoX2RhdGVfZmlyc3QgPSBsb2dfcmVjb3JkLmZpbmlzaF9kYXRlCiAgICAgICAgd2F5cG9pbnQuX2ZpbmFsaXplX2NyZWF0ZV93YXlwb2ludF9jb21tYW5kX2xvZyhzdWNjZXNzPVRydWUpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbG9nX3JlY29yZC5maW5pc2hfZGF0ZSwKICAgICAgICAgICAgZmluaXNoX2RhdGVfZmlyc3QsCiAgICAgICAgICAgICJTZWNvbmQgY2FsbCBzaG91bGQgbm90IGNoYW5nZSBmaW5pc2hfZGF0ZSAoZ3VhcmQpIiwKICAgICAgICApCg==