Files
odoo-addons/addons/cetmix_tower_server/models/cx_tower_variable_value.py

1 line
28 KiB
Python

IyBDb3B5cmlnaHQgKEMpIDIwMjIgQ2V0bWl4IE/DnAojIExpY2Vuc2UgQUdQTC0zLjAgb3IgbGF0ZXIgKGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsKS4KCmltcG9ydCByZQoKZnJvbSBvZG9vIGltcG9ydCBfLCBhcGksIGZpZWxkcywgbW9kZWxzCmZyb20gb2Rvby5leGNlcHRpb25zIGltcG9ydCBWYWxpZGF0aW9uRXJyb3IKCiMgQ29udGV4dCBrZXlzIHRvIHJlbW92ZSBvbiByZWNvcmQgY3JlYXRpb24uCiMgVGhpcyBpcyBuZWVkZWQgdG8gYXZvaWQgdmFsdWVzIGJlaW5nIHNldCBmcm9tIGNvbnRleHQga2V5cwpDT05URVhUX0tFWVNfVE9fUkVNT1ZFID0gWwogICAgImRlZmF1bHRfc2VydmVyX2lkIiwKICAgICJkZWZhdWx0X2pldF90ZW1wbGF0ZV9pZCIsCiAgICAiZGVmYXVsdF9wbGFuX2xpbmVfYWN0aW9uX2lkIiwKICAgICJkZWZhdWx0X2pldF9pZCIsCiAgICAiZGVmYXVsdF9zZXJ2ZXJfdGVtcGxhdGVfaWQiLApdCgoKY2xhc3MgVG93ZXJWYXJpYWJsZVZhbHVlKG1vZGVscy5Nb2RlbCk6CiAgICAiIiIKICAgIFRoaXMgbW9kZWwgaXMgdXNlZCB0byBzdG9yZSB2YXJpYWJsZSB2YWx1ZXMuCiAgICAiIiIKCiAgICBfbmFtZSA9ICJjeC50b3dlci52YXJpYWJsZS52YWx1ZSIKICAgIF9kZXNjcmlwdGlvbiA9ICJDZXRtaXggVG93ZXIgVmFyaWFibGUgVmFsdWVzIgogICAgX2luaGVyaXQgPSBbCiAgICAgICAgImN4LnRvd2VyLnJlZmVyZW5jZS5taXhpbiIsCiAgICAgICAgImN4LnRvd2VyLmFjY2Vzcy5taXhpbiIsCiAgICBdCiAgICBfcmVjX25hbWUgPSAidmFyaWFibGVfcmVmZXJlbmNlIgogICAgX29yZGVyID0gInNlcXVlbmNlLCB2YXJpYWJsZV9yZWZlcmVuY2UiCgogICAgc2VxdWVuY2UgPSBmaWVsZHMuSW50ZWdlcihkZWZhdWx0PTEwKQogICAgYWNjZXNzX2xldmVsID0gZmllbGRzLlNlbGVjdGlvbigKICAgICAgICBjb21wdXRlPSJfY29tcHV0ZV9hY2Nlc3NfbGV2ZWwiLAogICAgICAgIHJlYWRvbmx5PUZhbHNlLAogICAgICAgIHN0b3JlPVRydWUsCiAgICAgICAgZGVmYXVsdD1Ob25lLAogICAgKQogICAgdmFyaWFibGVfaWQgPSBmaWVsZHMuTWFueTJvbmUoCiAgICAgICAgc3RyaW5nPSJWYXJpYWJsZSIsCiAgICAgICAgY29tb2RlbF9uYW1lPSJjeC50b3dlci52YXJpYWJsZSIsCiAgICAgICAgcmVxdWlyZWQ9VHJ1ZSwKICAgICAgICBvbmRlbGV0ZT0iY2FzY2FkZSIsCiAgICApCiAgICBuYW1lID0gZmllbGRzLkNoYXIocmVsYXRlZD0idmFyaWFibGVfaWQubmFtZSIsIHJlYWRvbmx5PVRydWUpCiAgICB2YXJpYWJsZV9yZWZlcmVuY2UgPSBmaWVsZHMuQ2hhcigKICAgICAgICBzdHJpbmc9IlZhcmlhYmxlIFJlZmVyZW5jZSIsCiAgICAgICAgcmVsYXRlZD0idmFyaWFibGVfaWQucmVmZXJlbmNlIiwKICAgICAgICBzdG9yZT1UcnVlLAogICAgICAgIGluZGV4PVRydWUsCiAgICApCiAgICBpc19nbG9iYWwgPSBmaWVsZHMuQm9vbGVhbigKICAgICAgICBzdHJpbmc9Ikdsb2JhbCIsCiAgICAgICAgY29tcHV0ZT0iX2NvbXB1dGVfaXNfZ2xvYmFsIiwKICAgICAgICBpbnZlcnNlPSJfaW52ZXJzZV9pc19nbG9iYWwiLAogICAgICAgIHN0b3JlPVRydWUsCiAgICApCiAgICBub3RlID0gZmllbGRzLlRleHQocmVsYXRlZD0idmFyaWFibGVfaWQubm90ZSIsIHJlYWRvbmx5PVRydWUpCiAgICBhY3RpdmUgPSBmaWVsZHMuQm9vbGVhbihkZWZhdWx0PVRydWUpCiAgICB2YXJpYWJsZV90eXBlID0gZmllbGRzLlNlbGVjdGlvbigKICAgICAgICByZWxhdGVkPSJ2YXJpYWJsZV9pZC52YXJpYWJsZV90eXBlIiwKICAgICAgICByZWFkb25seT1UcnVlLAogICAgKQogICAgb3B0aW9uX2lkID0gZmllbGRzLk1hbnkyb25lKAogICAgICAgIGNvbW9kZWxfbmFtZT0iY3gudG93ZXIudmFyaWFibGUub3B0aW9uIiwKICAgICAgICBvbmRlbGV0ZT0icmVzdHJpY3QiLAogICAgICAgIGRvbWFpbj0iWygndmFyaWFibGVfaWQnLCAnPScsIHZhcmlhYmxlX2lkKV0iLAogICAgKQogICAgdmFsdWVfY2hhciA9IGZpZWxkcy5DaGFyKAogICAgICAgIHN0cmluZz0iVmFsdWUiLAogICAgICAgIGNvbXB1dGU9Il9jb21wdXRlX3ZhbHVlX2NoYXIiLAogICAgICAgIGludmVyc2U9Il9pbnZlcnNlX3ZhbHVlX2NoYXIiLAogICAgICAgIHN0b3JlPVRydWUsCiAgICAgICAgcmVhZG9ubHk9RmFsc2UsCiAgICApCgogICAgIyBEaXJlY3QgbW9kZWwgcmVsYXRpb25zLgogICAgIyBGb2xsb3dpbmcgZnVuY3Rpb25zIHNob3VsZCBiZSB1cGRhdGVkIHdoZW4gYSBuZXcgbTJvIGZpZWxkIGlzIGFkZGVkOgogICAgIyAgIC0gIGBfdXNlZF9pbl9tb2RlbHMoKWAKICAgICMgICAtICBgX2NvbXB1dGVfaXNfZ2xvYmFsKClgOiBhZGQgeW91IGZpZWxkIHRvICdkZXBlbmRzJwogICAgIyBEZWZpbmUgYSBgdW5pcXVlYCBjb25zdHJhaW50IGZvciBuZXcgbW9kZWwgdG9vLgogICAgc2VydmVyX2lkID0gZmllbGRzLk1hbnkyb25lKAogICAgICAgIGNvbW9kZWxfbmFtZT0iY3gudG93ZXIuc2VydmVyIiwgaW5kZXg9VHJ1ZSwgb25kZWxldGU9ImNhc2NhZGUiCiAgICApCiAgICBwbGFuX2xpbmVfYWN0aW9uX2lkID0gZmllbGRzLk1hbnkyb25lKAogICAgICAgIGNvbW9kZWxfbmFtZT0iY3gudG93ZXIucGxhbi5saW5lLmFjdGlvbiIsIGluZGV4PVRydWUsIG9uZGVsZXRlPSJjYXNjYWRlIgogICAgKQogICAgc2VydmVyX3RlbXBsYXRlX2lkID0gZmllbGRzLk1hbnkyb25lKAogICAgICAgIGNvbW9kZWxfbmFtZT0iY3gudG93ZXIuc2VydmVyLnRlbXBsYXRlIiwgaW5kZXg9VHJ1ZSwgb25kZWxldGU9ImNhc2NhZGUiCiAgICApCiAgICBqZXRfaWQgPSBmaWVsZHMuTWFueTJvbmUoCiAgICAgICAgY29tb2RlbF9uYW1lPSJjeC50b3dlci5qZXQiLAogICAgICAgIHN0cmluZz0iSmV0IiwKICAgICAgICBvbmRlbGV0ZT0iY2FzY2FkZSIsCiAgICAgICAgaW5kZXg9VHJ1ZSwKICAgICkKCiAgICBqZXRfdGVtcGxhdGVfaWQgPSBmaWVsZHMuTWFueTJvbmUoCiAgICAgICAgY29tb2RlbF9uYW1lPSJjeC50b3dlci5qZXQudGVtcGxhdGUiLAogICAgICAgIHN0cmluZz0iSmV0IFRlbXBsYXRlIiwKICAgICAgICBvbmRlbGV0ZT0iY2FzY2FkZSIsCiAgICAgICAgaW5kZXg9VHJ1ZSwKICAgICkKICAgIHZhcmlhYmxlX2lkcyA9IGZpZWxkcy5NYW55Mm1hbnkoCiAgICAgICAgY29tb2RlbF9uYW1lPSJjeC50b3dlci52YXJpYWJsZSIsCiAgICAgICAgcmVsYXRpb249ImN4X3Rvd2VyX3ZhcmlhYmxlX3ZhbHVlX3ZhcmlhYmxlX3JlbCIsCiAgICAgICAgY29sdW1uMT0idmFyaWFibGVfdmFsdWVfaWQiLAogICAgICAgIGNvbHVtbjI9InZhcmlhYmxlX2lkIiwKICAgICAgICBzdHJpbmc9IlZhcmlhYmxlcyIsCiAgICAgICAgY29tcHV0ZT0iX2NvbXB1dGVfdmFyaWFibGVfaWRzIiwKICAgICAgICBzdG9yZT1UcnVlLAogICAgICAgIGNvcHk9RmFsc2UsCiAgICApCiAgICByZXF1aXJlZCA9IGZpZWxkcy5Cb29sZWFuKCkKCiAgICBfc3FsX2NvbnN0cmFpbnRzID0gWwogICAgICAgICgKICAgICAgICAgICAgInRvd2VyX3ZhcmlhYmxlX3ZhbHVlX3VuaXEiLAogICAgICAgICAgICAidW5pcXVlICh2YXJpYWJsZV9pZCwgc2VydmVyX2lkLCBzZXJ2ZXJfdGVtcGxhdGVfaWQsICIKICAgICAgICAgICAgInBsYW5fbGluZV9hY3Rpb25faWQsIGlzX2dsb2JhbCkiLAogICAgICAgICAgICAiVmFyaWFibGUgY2FuIGJlIGRlY2xhcmVkIG9ubHkgb25jZSBmb3IgdGhlIHNhbWUgcmVjb3JkISIsCiAgICAgICAgKSwKICAgICAgICAoCiAgICAgICAgICAgICJ1bmlxdWVfdmFyaWFibGVfdmFsdWVfdGVtcGxhdGUiLAogICAgICAgICAgICAidW5pcXVlICh2YXJpYWJsZV9pZCwgc2VydmVyX3RlbXBsYXRlX2lkKSIsCiAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICJBIHZhcmlhYmxlIHZhbHVlIGNhbm5vdCBiZSBhc3NpZ25lZCBtdWx0aXBsZSIKICAgICAgICAgICAgICAgICIgdGltZXMgdG8gdGhlIHNhbWUgc2VydmVyIHRlbXBsYXRlISIKICAgICAgICAgICAgKSwKICAgICAgICApLAogICAgICAgICgKICAgICAgICAgICAgInVuaXF1ZV92YXJpYWJsZV92YWx1ZV9hY3Rpb24iLAogICAgICAgICAgICAidW5pcXVlICh2YXJpYWJsZV9pZCwgcGxhbl9saW5lX2FjdGlvbl9pZCkiLAogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAiQSB2YXJpYWJsZSB2YWx1ZSBjYW5ub3QgYmUgYXNzaWduZWQgbXVsdGlwbGUiCiAgICAgICAgICAgICAgICAiIHRpbWVzIHRvIHRoZSBzYW1lIHBsYW4gbGluZSBhY3Rpb24hIgogICAgICAgICAgICApLAogICAgICAgICksCiAgICAgICAgKAogICAgICAgICAgICAidW5pcXVlX3ZhcmlhYmxlX3ZhbHVlX2pldF90ZW1wbGF0ZSIsCiAgICAgICAgICAgICJ1bmlxdWUgKHZhcmlhYmxlX2lkLCBqZXRfdGVtcGxhdGVfaWQpIiwKICAgICAgICAgICAgIkEgdmFyaWFibGUgdmFsdWUgY2Fubm90IGJlIGFzc2lnbmVkIG11bHRpcGxlIHRpbWVzIHRvICIKICAgICAgICAgICAgInRoZSBzYW1lIGpldCB0ZW1wbGF0ZSEiLAogICAgICAgICksCiAgICAgICAgKAogICAgICAgICAgICAidW5pcXVlX3ZhcmlhYmxlX3ZhbHVlX2pldCIsCiAgICAgICAgICAgICJ1bmlxdWUgKHZhcmlhYmxlX2lkLCBqZXRfaWQpIiwKICAgICAgICAgICAgIkEgdmFyaWFibGUgdmFsdWUgY2Fubm90IGJlIGFzc2lnbmVkIG11bHRpcGxlIHRpbWVzIHRvIHRoZSBzYW1lIGpldCEiLAogICAgICAgICksCiAgICBdCgogICAgIyAtLSBDb21wdXRlIGZpZWxkcyAtLQoKICAgIEBhcGkuZGVwZW5kcygidmFyaWFibGVfaWQiLCAidmFyaWFibGVfaWQuYWNjZXNzX2xldmVsIikKICAgIGRlZiBfY29tcHV0ZV9hY2Nlc3NfbGV2ZWwoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQXV0b21hdGljYWxseSBzZXQgdGhlIGFjY2Vzc19sZXZlbCBiYXNlZCBvbiBWYXJpYWJsZSBhY2Nlc3MgbGV2ZWwKICAgICAgICAiIiIKICAgICAgICBmb3IgcmVjIGluIHNlbGY6CiAgICAgICAgICAgIGlmIHJlYy52YXJpYWJsZV9pZDoKICAgICAgICAgICAgICAgIHJlYy5hY2Nlc3NfbGV2ZWwgPSByZWMudmFyaWFibGVfaWQuYWNjZXNzX2xldmVsCgogICAgQGFwaS5kZXBlbmRzKAogICAgICAgICJzZXJ2ZXJfaWQiLAogICAgICAgICJzZXJ2ZXJfdGVtcGxhdGVfaWQiLAogICAgICAgICJwbGFuX2xpbmVfYWN0aW9uX2lkIiwKICAgICAgICAiamV0X2lkIiwKICAgICAgICAiamV0X3RlbXBsYXRlX2lkIiwKICAgICkKICAgIGRlZiBfY29tcHV0ZV9pc19nbG9iYWwoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgSWYgdmFyaWFibGUgY29uc2lkZXJlZCBgZ2xvYmFsYCB3aGVuIGl0J3Mgbm90IGxpbmtlZCB0byBhbnkgcmVjb3JkLgogICAgICAgICIiIgogICAgICAgIGZvciByZWMgaW4gc2VsZjoKICAgICAgICAgICAgcmVjLmlzX2dsb2JhbCA9IHJlYy5fY2hlY2tfaXNfZ2xvYmFsKCkKCiAgICBAYXBpLmRlcGVuZHMoIm9wdGlvbl9pZCIsICJ2YXJpYWJsZV9pZC5vcHRpb25faWRzIikKICAgIGRlZiBfY29tcHV0ZV92YWx1ZV9jaGFyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIENvbXB1dGUgdGhlICd2YWx1ZV9jaGFyJyBmaWVsZCwgd2hpY2ggaG9sZHMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbgogICAgICAgIG9mIHRoZSBzZWxlY3RlZCBvcHRpb24gZm9yIHRoZSB2YXJpYWJsZS4KICAgICAgICAiIiIKICAgICAgICBmb3IgcmVjIGluIHNlbGY6CiAgICAgICAgICAgIGlmIG5vdCByZWMudmFyaWFibGVfaWQub3B0aW9uX2lkczoKICAgICAgICAgICAgICAgIHJlYy52YWx1ZV9jaGFyID0gcmVjLnZhbHVlX2NoYXIgb3IgRmFsc2UKICAgICAgICAgICAgICAgIHJlYy5vcHRpb25faWQgPSBGYWxzZQogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgcmVjLm9wdGlvbl9pZDoKICAgICAgICAgICAgICAgIHJlYy52YWx1ZV9jaGFyID0gcmVjLm9wdGlvbl9pZC52YWx1ZV9jaGFyCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZWMudmFsdWVfY2hhciA9IEZhbHNlCgogICAgQGFwaS5kZXBlbmRzKCJ2YWx1ZV9jaGFyIikKICAgIGRlZiBfY29tcHV0ZV92YXJpYWJsZV9pZHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQ29tcHV0ZSB2YXJpYWJsZV9pZHMgYmFzZWQgb24gdmFsdWVfY2hhciBmaWVsZC4KICAgICAgICAiIiIKICAgICAgICB0ZW1wbGF0ZV9taXhpbl9vYmogPSBzZWxmLmVudlsiY3gudG93ZXIudGVtcGxhdGUubWl4aW4iXQogICAgICAgIGZvciByZWNvcmQgaW4gc2VsZjoKICAgICAgICAgICAgcmVjb3JkLnZhcmlhYmxlX2lkcyA9IHRlbXBsYXRlX21peGluX29iai5fcHJlcGFyZV92YXJpYWJsZV9jb21tYW5kcygKICAgICAgICAgICAgICAgIFsidmFsdWVfY2hhciJdLCBmb3JjZV9yZWNvcmQ9cmVjb3JkCiAgICAgICAgICAgICkKCiAgICAjIC0tIENvbnN0cmFpbnRzIC0tCgogICAgQGFwaS5jb25zdHJhaW5zKCJhY2Nlc3NfbGV2ZWwiLCAidmFyaWFibGVfaWQiKQogICAgZGVmIF9jaGVja19hY2Nlc3NfbGV2ZWxfY29uc2lzdGVuY3koc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgRW5zdXJlIHRoYXQgdmFyaWFibGUgdmFsdWUgYWNjZXNzIGxldmVsIGlzIGRlZmluZWQuCiAgICAgICAgRW5zdXJlIHRoYXQgdGhlIGFjY2VzcyBsZXZlbCBvZiB0aGUgdmFyaWFibGUgdmFsdWUgaXMgbm90IGxvd2VyIHRoYW4KICAgICAgICB0aGUgYWNjZXNzIGxldmVsIG9mIHRoZSBhc3NvY2lhdGVkIHZhcmlhYmxlLgogICAgICAgICIiIgogICAgICAgIGFjY2Vzc19sZXZlbF9kaWN0ID0gZGljdCgKICAgICAgICAgICAgc2VsZi5maWVsZHNfZ2V0KFsiYWNjZXNzX2xldmVsIl0pWyJhY2Nlc3NfbGV2ZWwiXVsic2VsZWN0aW9uIl0KICAgICAgICApCiAgICAgICAgZm9yIHJlYyBpbiBzZWxmOgogICAgICAgICAgICBpZiBub3QgcmVjLnZhcmlhYmxlX2lkOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgbm90IHJlYy5hY2Nlc3NfbGV2ZWw6CiAgICAgICAgICAgICAgICByYWlzZSBWYWxpZGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgXygKICAgICAgICAgICAgICAgICAgICAgICAgIkFjY2VzcyBsZXZlbCBpcyBub3QgZGVmaW5lZCBmb3IgJyUodmFyaWFibGUpcyciLAogICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZT1yZWMubmFtZSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGlmIHJlYy5hY2Nlc3NfbGV2ZWwgPCByZWMudmFyaWFibGVfaWQuYWNjZXNzX2xldmVsOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsaWRhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgIF8oCiAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgYWNjZXNzIGxldmVsIGZvciBWYXJpYWJsZSBWYWx1ZSAnJSh2YWx1ZSlzJyAiCiAgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgYmUgbG93ZXIgdGhhbiB0aGUgYWNjZXNzIGxldmVsIG9mIGl0cyAiCiAgICAgICAgICAgICAgICAgICAgICAgICJWYXJpYWJsZSAnJSh2YXJpYWJsZSlzJy5cbiIKICAgICAgICAgICAgICAgICAgICAgICAgIlZhcmlhYmxlIEFjY2VzcyBMZXZlbDogJSh2YXJfbGV2ZWwpc1xuIgogICAgICAgICAgICAgICAgICAgICAgICAiVmFyaWFibGUgVmFsdWUgQWNjZXNzIExldmVsOiAlKHZhbF9sZXZlbClzIiwKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9cmVjLnZhbHVlX2NoYXIsCiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlPXJlYy52YXJpYWJsZV9pZC5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICB2YXJfbGV2ZWw9YWNjZXNzX2xldmVsX2RpY3RbcmVjLnZhcmlhYmxlX2lkLmFjY2Vzc19sZXZlbF0sCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbF9sZXZlbD1hY2Nlc3NfbGV2ZWxfZGljdFtyZWMuYWNjZXNzX2xldmVsXSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCgogICAgQGFwaS5jb25zdHJhaW5zKCJpc19nbG9iYWwiLCAidmFsdWVfY2hhciIpCiAgICBkZWYgX2NvbnN0cmFpbnRfZ2xvYmFsX3VuaXF1ZShzZWxmKToKICAgICAgICAiIiJFbnN1cmUgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBnbG9iYWwgdmFsdWUgZXhpc3QgZm9yIHRoZSBzYW1lIHZhcmlhYmxlCgogICAgICAgIEhpbnQgdG8gZGV2czoKICAgICAgICAgICAgYHVuaXF1ZSBudWxscyBub3QgZGlzdGluY3QgKHZhcmlhYmxlX2lkLHNlcnZlcl9pZCxnbG9iYWxfaWQpYAogICAgICAgICAgICBjYW4gYmUgdXNlZCBpbnN0ZWFkIGluIFBHIDE1LjArCiAgICAgICAgIiIiCiAgICAgICAgZm9yIHJlYyBpbiBzZWxmOgogICAgICAgICAgICBpZiByZWMuaXNfZ2xvYmFsOgogICAgICAgICAgICAgICAgdmFsX2NvdW50ID0gc2VsZi5zZWFyY2hfY291bnQoCiAgICAgICAgICAgICAgICAgICAgWygidmFyaWFibGVfaWQiLCAiPSIsIHJlYy52YXJpYWJsZV9pZC5pZCksICgiaXNfZ2xvYmFsIiwgIj0iLCBUcnVlKV0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGlmIHZhbF9jb3VudCA+IDE6CiAgICAgICAgICAgICAgICAgICAgIyBOQjogdGhlcmUgaXMgYSB2YWx1ZSBjaGVjayBpbiB0ZXN0cyBmb3IgdGhpcyBtZXNzYWdlLgogICAgICAgICAgICAgICAgICAgICMgVXBkYXRlIGB0ZXN0X3ZhcmlhYmxlX3ZhbHVlX3RvZ2dsZV9nbG9iYWxgCiAgICAgICAgICAgICAgICAgICAgIyBpZiB5b3UgbW9kaWZ5IHRoaXMgbWVzc2FnZSBpbiB5b3VyIGNvZGUuCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsaWRhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBfKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9ubHkgb25lIGdsb2JhbCB2YWx1ZSBjYW4gYmUgZGVmaW5lZCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZm9yIHZhcmlhYmxlICclKHZhcilzJyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXI9cmVjLnZhcmlhYmxlX2lkLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICApCgogICAgQGFwaS5jb25zdHJhaW5zKCJ2YWx1ZV9jaGFyIiwgIm9wdGlvbl9pZCIpCiAgICBkZWYgX2NoZWNrX3ZhbHVlX2NoYXJfYW5kX29wdGlvbl9pZChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDaGVjayBpZiB0aGUgdmFsdWVfY2hhciBpcyB2YWxpZCBmb3IgdGhlIHZhcmlhYmxlLgogICAgICAgICIiIgogICAgICAgIGZvciByZWMgaW4gc2VsZjoKICAgICAgICAgICAgaWYgbm90IHJlYy52YXJpYWJsZV9pZDoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIHZhbGlkLCBtZXNzYWdlID0gcmVjLnZhcmlhYmxlX2lkLl92YWxpZGF0ZV92YWx1ZShyZWMudmFsdWVfY2hhcikKICAgICAgICAgICAgaWYgbm90IHZhbGlkOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsaWRhdGlvbkVycm9yKG1lc3NhZ2UpCiAgICAgICAgICAgIGlmIHJlYy5vcHRpb25faWQ6CiAgICAgICAgICAgICAgICBpZiByZWMub3B0aW9uX2lkLnZhcmlhYmxlX2lkICE9IHJlYy52YXJpYWJsZV9pZDoKICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWxpZGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIF8oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3B0aW9uICclKHZhbClzJyBpcyBub3QgYXZhaWxhYmxlIGZvciB2YXJpYWJsZSAnJSh2YXIpcyciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsPXJlYy52YWx1ZV9jaGFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyPXJlYy52YXJpYWJsZV9pZC5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgKQoKICAgIEBhcGkuY29uc3RyYWlucygKICAgICAgICAic2VydmVyX2lkIiwKICAgICAgICAic2VydmVyX3RlbXBsYXRlX2lkIiwKICAgICAgICAicGxhbl9saW5lX2FjdGlvbl9pZCIsCiAgICAgICAgImpldF9pZCIsCiAgICAgICAgImpldF90ZW1wbGF0ZV9pZCIsCiAgICApCiAgICBkZWYgX2NoZWNrX2Fzc2lnbm1lbnQoc2VsZik6CiAgICAgICAgIiIiRW5zdXJlIHRoYXQgYSB2YXJpYWJsZSBpcyBvbmx5IGFzc2lnbmVkIHRvIG9uZSBtb2RlbCBhdCBhIHRpbWUuIiIiCiAgICAgICAgZm9yIHJlY29yZCBpbiBzZWxmOgogICAgICAgICAgICAjIENoZWNrIGhvdyBtYW55IG9mIHRoZSBmaWVsZHMgYXJlIHNldAogICAgICAgICAgICBjb3VudF9hc3NpZ25lZCA9ICgKICAgICAgICAgICAgICAgIGJvb2wocmVjb3JkLnNlcnZlcl9pZCkKICAgICAgICAgICAgICAgICsgYm9vbChyZWNvcmQuc2VydmVyX3RlbXBsYXRlX2lkKQogICAgICAgICAgICAgICAgKyBib29sKHJlY29yZC5wbGFuX2xpbmVfYWN0aW9uX2lkKQogICAgICAgICAgICAgICAgKyBib29sKHJlY29yZC5qZXRfaWQpCiAgICAgICAgICAgICAgICArIGJvb2wocmVjb3JkLmpldF90ZW1wbGF0ZV9pZCkKICAgICAgICAgICAgKQogICAgICAgICAgICBpZiBjb3VudF9hc3NpZ25lZCA+IDE6CiAgICAgICAgICAgICAgICByYWlzZSBWYWxpZGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgXygKICAgICAgICAgICAgICAgICAgICAgICAgIlZhcmlhYmxlICclKHZhcilzJyBjYW4gb25seSBiZSBhc3NpZ25lZCB0byBvbmUgb2YgdGhlIG1vZGVscyAiCiAgICAgICAgICAgICAgICAgICAgICAgICJhdCBhIHRpbWU6ICIKICAgICAgICAgICAgICAgICAgICAgICAgIlNlcnZlciwgSmV0LCBKZXQgVGVtcGxhdGUsIFNlcnZlciBUZW1wbGF0ZSwgb3IgIgogICAgICAgICAgICAgICAgICAgICAgICAiUGxhbiBMaW5lIEFjdGlvbi4iLAogICAgICAgICAgICAgICAgICAgICAgICB2YXI9cmVjb3JkLnZhcmlhYmxlX2lkLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgKQoKICAgIEBhcGkuY29uc3RyYWlucygKICAgICAgICAic2VydmVyX2lkIiwgInNlcnZlcl90ZW1wbGF0ZV9pZCIsICJqZXRfaWQiLCAiamV0X3RlbXBsYXRlX2lkIiwgInZhcmlhYmxlX2lkIgogICAgKQogICAgZGVmIF9jaGVja191bmlxdWVfZm9yX3NlcnZlcl9ub19qZXRfbm9famV0X3RlbXBsYXRlKHNlbGYpOgogICAgICAgICIiIkVuc3VyZSB1bmlxdWVuZXNzIG9mIHZhcmlhYmxlK3NlcnZlciB3aGVuIGJvdGggamV0IGZpZWxkcyBhcmUgZW1wdHkiIiIKICAgICAgICAjIEZpbHRlciByZWNvcmRzIHRoYXQgaGF2ZSBib3RoIGpldCBmaWVsZHMgZW1wdHkKICAgICAgICByZWNvcmRzX3RvX2NoZWNrID0gc2VsZi5maWx0ZXJlZCgKICAgICAgICAgICAgbGFtYmRhIHI6IG5vdCByLmpldF9pZCBhbmQgbm90IHIuamV0X3RlbXBsYXRlX2lkCiAgICAgICAgKQoKICAgICAgICBpZiBub3QgcmVjb3Jkc190b19jaGVjazoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgVXNlIHJlYWRfZ3JvdXAgdG8gZmluZCBkdXBsaWNhdGVzIGVmZmljaWVudGx5CiAgICAgICAgZG9tYWluID0gWwogICAgICAgICAgICAoImpldF9pZCIsICI9IiwgRmFsc2UpLAogICAgICAgICAgICAoImpldF90ZW1wbGF0ZV9pZCIsICI9IiwgRmFsc2UpLAogICAgICAgICAgICAoInZhcmlhYmxlX2lkIiwgImluIiwgcmVjb3Jkc190b19jaGVjay5tYXBwZWQoInZhcmlhYmxlX2lkIikuaWRzKSwKICAgICAgICAgICAgKCJzZXJ2ZXJfaWQiLCAiaW4iLCByZWNvcmRzX3RvX2NoZWNrLm1hcHBlZCgic2VydmVyX2lkIikuaWRzKSwKICAgICAgICBdCgogICAgICAgIGdyb3VwZWRfZGF0YSA9IHNlbGYucmVhZF9ncm91cCgKICAgICAgICAgICAgZG9tYWluPWRvbWFpbiwKICAgICAgICAgICAgZmllbGRzPVsidmFyaWFibGVfaWQiLCAic2VydmVyX2lkIl0sCiAgICAgICAgICAgIGdyb3VwYnk9WyJ2YXJpYWJsZV9pZCIsICJzZXJ2ZXJfaWQiXSwKICAgICAgICAgICAgbGF6eT1GYWxzZSwKICAgICAgICApCgogICAgICAgICMgQ2hlY2sgZm9yIGdyb3VwcyB3aXRoIG1vcmUgdGhhbiAxIHJlY29yZAogICAgICAgIGZvciBncm91cCBpbiBncm91cGVkX2RhdGE6CiAgICAgICAgICAgIGlmIGdyb3VwWyJfX2NvdW50Il0gPiAxOgogICAgICAgICAgICAgICAgdmFyaWFibGVfbmFtZSA9ICgKICAgICAgICAgICAgICAgICAgICBncm91cC5nZXQoInZhcmlhYmxlX2lkIiwgWyIiLCAiVW5rbm93biJdKVsxXQogICAgICAgICAgICAgICAgICAgIGlmIGdyb3VwLmdldCgidmFyaWFibGVfaWQiKQogICAgICAgICAgICAgICAgICAgIGVsc2UgIlVua25vd24iCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBzZXJ2ZXJfbmFtZSA9ICgKICAgICAgICAgICAgICAgICAgICBncm91cC5nZXQoInNlcnZlcl9pZCIsIFsiIiwgIlVua25vd24iXSlbMV0KICAgICAgICAgICAgICAgICAgICBpZiBncm91cC5nZXQoInNlcnZlcl9pZCIpCiAgICAgICAgICAgICAgICAgICAgZWxzZSAiVW5rbm93biIKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHJhaXNlIFZhbGlkYXRpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICBfKAogICAgICAgICAgICAgICAgICAgICAgICAiTXVsdGlwbGUgcmVjb3JkcyBmb3VuZCB3aXRoIFZhcmlhYmxlICclKHZhcmlhYmxlX25hbWUpcyciCiAgICAgICAgICAgICAgICAgICAgICAgICIgYW5kIFNlcnZlciAnJShzZXJ2ZXJfbmFtZSlzJyAiCiAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoIGJvdGggSmV0IGFuZCBKZXQgVGVtcGxhdGUgZW1wdHkuIiwKICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVfbmFtZT12YXJpYWJsZV9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfbmFtZT1zZXJ2ZXJfbmFtZSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCgogICAgIyAtLSBPbmNoYW5nZSAtLQoKICAgIEBhcGkub25jaGFuZ2UoInZhcmlhYmxlX2lkIikKICAgIGRlZiBfb25jaGFuZ2VfdmFyaWFibGVfaWQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmVzZXQgb3B0aW9uX2lkIHdoZW4gdmFyaWFibGUgY2hhbmdlcyBvcgogICAgICAgIGRvZXNuJ3QgaGF2ZSBvcHRpb25zCiAgICAgICAgIiIiCiAgICAgICAgZm9yIHJlYyBpbiBzZWxmOgogICAgICAgICAgICByZWMudXBkYXRlKHsib3B0aW9uX2lkIjogRmFsc2UsICJ2YWx1ZV9jaGFyIjogRmFsc2V9KQoKICAgIEBhcGkub25jaGFuZ2UoInZhbHVlX2NoYXIiKQogICAgZGVmIF9vbmNoYW5nZV92YWx1ZV9jaGFyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIENoZWNrIHZhbHVlIGJlZm9yZSBzYXZpbmcKICAgICAgICAiIiIKICAgICAgICBpZiBub3QgKHNlbGYudmFyaWFibGVfaWQgYW5kIHNlbGYudmFsdWVfY2hhcik6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi52YXJpYWJsZV9pZC5fdmFsaWRhdGVfdmFsdWUoc2VsZi52YWx1ZV9jaGFyKQogICAgICAgIGV4Y2VwdCBWYWxpZGF0aW9uRXJyb3IgYXMgZToKICAgICAgICAgICAgcmV0dXJuIHsid2FybmluZyI6IHsidGl0bGUiOiBfKCJWYWx1ZSBpcyBpbnZhbGlkIiksICJtZXNzYWdlIjogc3RyKGUpfX0KCiAgICAjIC0tIEludmVyc2UgLS0KCiAgICBkZWYgX2ludmVyc2VfaXNfZ2xvYmFsKHNlbGYpOgogICAgICAgICIiIlRyaWdnZXJlZCB3aGVuIGBpc19nbG9iYWxgIGlzIHVwZGF0ZWQiIiIKICAgICAgICBnbG9iYWxfdmFsdWVzID0gc2VsZi5maWx0ZXJlZCgiaXNfZ2xvYmFsIikKICAgICAgICBpZiBnbG9iYWxfdmFsdWVzOgogICAgICAgICAgICB2YWx1ZXNfdG9fc2V0ID0ge30KCiAgICAgICAgICAgICMgU2V0IG0ybyBmaWVsZHMgcmVsYXRlZCB0byB2YXJpYWJsZSB1c2luZyBtb2RlbHMgdG8gJ0ZhbHNlJwogICAgICAgICAgICBmb3IgcmVsYXRlZF9tb2RlbF9pbmZvIGluIHNlbGYuX3VzZWRfaW5fbW9kZWxzKCkudmFsdWVzKCk6CiAgICAgICAgICAgICAgICBtMm9fZmllbGQgPSByZWxhdGVkX21vZGVsX2luZm9bMF0KICAgICAgICAgICAgICAgIHZhbHVlc190b19zZXQudXBkYXRlKHttMm9fZmllbGQ6IEZhbHNlfSkKICAgICAgICAgICAgZ2xvYmFsX3ZhbHVlcy53cml0ZSh2YWx1ZXNfdG9fc2V0KQoKICAgICAgICAjIENoZWNrIGlmIHdlIGFyZSB0cnlpbmcgdG8gcmVtb3ZlICdnbG9iYWwnIGZyb20gdmFsdWUKICAgICAgICAjICB0aGF0IGRvZXNuJ3QgYmVsb25nIHRvIGFueSByZWNvcmQuCiAgICAgICAgcmVjb3JkX3JlbGF0ZWRfdmFsdWVzID0gc2VsZiAtIGdsb2JhbF92YWx1ZXMKICAgICAgICBmb3IgcmVjb3JkIGluIHJlY29yZF9yZWxhdGVkX3ZhbHVlczoKICAgICAgICAgICAgaWYgcmVjb3JkLl9jaGVja19pc19nbG9iYWwoKToKICAgICAgICAgICAgICAgICMgTkI6IHRoZXJlIGlzIGEgdmFsdWUgY2hlY2sgaW4gdGVzdHMgZm9yIHRoaXMgbWVzc2FnZS4KICAgICAgICAgICAgICAgICMgVXBkYXRlIGB0ZXN0X3ZhcmlhYmxlX3ZhbHVlX3RvZ2dsZV9nbG9iYWxgIGlmIHlvdSBtb2RpZnkgdGhpcyBtZXNzYWdlLgogICAgICAgICAgICAgICAgcmFpc2UgVmFsaWRhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgIF8oCiAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgY2hhbmdlICdnbG9iYWwnIHN0YXR1cyBmb3IgIgogICAgICAgICAgICAgICAgICAgICAgICAiJyUodmFyKXMnIHdpdGggdmFsdWUgJyUodmFsKXMnLiIKICAgICAgICAgICAgICAgICAgICAgICAgIlxuVHJ5IHRvIGFzc2lnbnMgaXQgdG8gYSByZWNvcmQgaW5zdGVhZC4iLAogICAgICAgICAgICAgICAgICAgICAgICB2YXI9cmVjb3JkLnZhcmlhYmxlX2lkLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbD1yZWNvcmQudmFsdWVfY2hhciwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCgogICAgZGVmIF9pbnZlcnNlX3ZhbHVlX2NoYXIoc2VsZik6CiAgICAgICAgIiIiU2V0IG9wdGlvbl9pZCBiYXNlZCBvbiB2YWx1ZV9jaGFyIiIiCiAgICAgICAgZm9yIHJlYyBpbiBzZWxmOgogICAgICAgICAgICBpZiByZWMudmFyaWFibGVfdHlwZSA9PSAibyIgYW5kICgKICAgICAgICAgICAgICAgIG5vdCByZWMub3B0aW9uX2lkIG9yIHJlYy5vcHRpb25faWQudmFsdWVfY2hhciAhPSByZWMudmFsdWVfY2hhcgogICAgICAgICAgICApOgogICAgICAgICAgICAgICAgb3B0aW9uID0gcmVjLnZhcmlhYmxlX2lkLm9wdGlvbl9pZHMuZmlsdGVyZWQoCiAgICAgICAgICAgICAgICAgICAgbGFtYmRhIHgsIHY9cmVjLnZhbHVlX2NoYXI6IHgudmFsdWVfY2hhciA9PSB2CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICByZWMub3B0aW9uX2lkID0gb3B0aW9uIGFuZCBvcHRpb24uaWQKCiAgICAjIC0tIENyZWF0ZS93cml0ZS91bmxpbmsgLS0KCiAgICBAYXBpLm1vZGVsX2NyZWF0ZV9tdWx0aQogICAgZGVmIGNyZWF0ZShzZWxmLCB2YWxzX2xpc3QpOgogICAgICAgICIiIgogICAgICAgIFdvcmthcm91bmQgZm9yIHRoZSBkZWZhdWx0IHZhbHVlIG5vdCBiZWluZyBzZXQKICAgICAgICAiIiIKICAgICAgICAjIFJlbW92ZSBhbGwgJ2RlZmF1bHRfJyBrZXlzIGZyb20gY29udGV4dAogICAgICAgICMgVGhpcyBpcyBuZWVkZWQgdG8gYXZvaWQgdmFsdWVzIGJlaW5nIHNldCBmcm9tIGNvbnRleHQga2V5cwogICAgICAgICMgRWcgJ2RlZmF1bHRfc2VydmVyX2lkJyB3aWxsIHNldCB0aGUgc2VydmVyX2lkIGV2ZW4gaWYgaXQncwogICAgICAgICMgbm90IHByb3ZpZGVkIGluIHZhbHNfbGlzdC4KICAgICAgICAjIFRoaXMgaXMgYSB3b3JrYXJvdW5kIHRvIGF2b2lkIHRoZSBpc3N1ZS4KCiAgICAgICAgc2VsZiA9IHNlbGYuX3NlbGZfd2l0aF9jbGVhbl9jb250ZXh0KCkKCiAgICAgICAgdmFyaWFibGVfb2JqID0gc2VsZi5lbnZbImN4LnRvd2VyLnZhcmlhYmxlIl0KICAgICAgICBmb3IgdmFscyBpbiB2YWxzX2xpc3Q6CiAgICAgICAgICAgICMgU2V0IGFjY2VzcyBsZXZlbCBmcm9tIHRoZSB2YXJpYWJsZQogICAgICAgICAgICAjIGlmIG5vdCBwcm92aWRlZCBleHBsaWNpdGx5CiAgICAgICAgICAgIGFjY2Vzc19sZXZlbCA9IHZhbHMuZ2V0KCJhY2Nlc3NfbGV2ZWwiKQogICAgICAgICAgICBpZiBhY2Nlc3NfbGV2ZWw6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICB2YXJpYWJsZV9pZCA9IHZhbHMuZ2V0KCJ2YXJpYWJsZV9pZCIpCiAgICAgICAgICAgIGlmIHZhcmlhYmxlX2lkOgogICAgICAgICAgICAgICAgdmFyaWFibGUgPSB2YXJpYWJsZV9vYmouYnJvd3NlKHZhcmlhYmxlX2lkKQogICAgICAgICAgICAgICAgdmFsc1siYWNjZXNzX2xldmVsIl0gPSB2YXJpYWJsZS5hY2Nlc3NfbGV2ZWwKICAgICAgICByZXR1cm4gc3VwZXIoKS5jcmVhdGUodmFsc19saXN0KQoKICAgICMgLS0gQnVzaW5lc3MgbG9naWMgLS0KCiAgICBkZWYgX3NlbGZfd2l0aF9jbGVhbl9jb250ZXh0KHNlbGYpOgogICAgICAgICIiIgogICAgICAgIENsZWFuIGNvbnRleHQgdG8gYXZvaWQgdmFsdWVzIGJlaW5nIHNldCBmcm9tIGNvbnRleHQga2V5cwoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBzZWxmOiB3aXRoIGNvbnRleHQgY2xlYW5lZAogICAgICAgICIiIgogICAgICAgIGNvbnRleHQgPSBzZWxmLmVudi5jb250ZXh0LmNvcHkoKQogICAgICAgIGZvciBrZXkgaW4gQ09OVEVYVF9LRVlTX1RPX1JFTU9WRToKICAgICAgICAgICAgY29udGV4dC5wb3Aoa2V5LCBOb25lKQogICAgICAgIHJldHVybiBzZWxmLndpdGhfY29udGV4dChjb250ZXh0KSAgIyBweWxpbnQ6IGRpc2FibGU9Y29udGV4dC1vdmVycmlkZGVuCgogICAgZGVmIF91c2VkX2luX21vZGVscyhzZWxmKToKICAgICAgICAiIiJSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IG1vZGVscyB3aGljaCB1c2UgdGhpcyBtaXhpbi4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgZGljdCgpOiBvZiB0aGUgZm9sbG93aW5nIGZvcm1hdDoKICAgICAgICAgICAgICAgIHsibW9kZWwubmFtZSI6ICgibTJvX2ZpZWxkX25hbWUiLCAibW9kZWxfZGVzY3JpcHRpb24iKX0KICAgICAgICAgICAgRWc6CiAgICAgICAgICAgICAgICB7Im15LmN1c3RvbS5tb2RlbCI6ICgibXVjaF9tb2RlbF9pZCIsICJNdWNoIE1vZGVsIil9CiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgImN4LnRvd2VyLnNlcnZlciI6ICgic2VydmVyX2lkIiwgIlNlcnZlciIpLAogICAgICAgICAgICAiY3gudG93ZXIucGxhbi5saW5lLmFjdGlvbiI6ICgicGxhbl9saW5lX2FjdGlvbl9pZCIsICJBY3Rpb24iKSwKICAgICAgICAgICAgImN4LnRvd2VyLnNlcnZlci50ZW1wbGF0ZSI6ICgic2VydmVyX3RlbXBsYXRlX2lkIiwgIlNlcnZlciBUZW1wbGF0ZSIpLAogICAgICAgICAgICAiY3gudG93ZXIuamV0LnRlbXBsYXRlIjogKCJqZXRfdGVtcGxhdGVfaWQiLCAiSmV0IFRlbXBsYXRlIiksCiAgICAgICAgICAgICJjeC50b3dlci5qZXQiOiAoImpldF9pZCIsICJKZXQiKSwKICAgICAgICB9CgogICAgZGVmIF9jaGVja19pc19nbG9iYWwoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiB1c2VkIHRvIGRlZmluZQogICAgICAgICB3aGljaCB2YXJpYWJsZXMgYXJlIGNvbnNpZGVyZWQgJ0dsb2JhbCcKICAgICAgICBPdmVycmlkZSBpdCB0byBpbXBsZW1lbnQgeW91ciBjdXN0b20gbG9naWMuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIGJvb2w6ICBUcnVlIGlmIGdsb2JhbCBlbHNlIEZhbHNlCiAgICAgICAgIiIiCgogICAgICAgIHNlbGYuZW5zdXJlX29uZSgpCiAgICAgICAgaXNfZ2xvYmFsID0gVHJ1ZQoKICAgICAgICAjIEdldCBtMm8gZmllbGQgdmFsdWVzIGZvciBhbGwgbW9kZWxzIHRoYXQgdXNlIHZhcmlhYmxlcy4KICAgICAgICAjIElmIG5vbmUgb2YgdGhlbSBpcyBzZXQgc3VjaCB2YWx1ZSBpcyBjb25zaWRlcmVkICdnbG9iYWwnLgogICAgICAgIGZvciByZWxhdGVkX21vZGVsX2luZm8gaW4gc2VsZi5fdXNlZF9pbl9tb2RlbHMoKS52YWx1ZXMoKToKICAgICAgICAgICAgbTJvX2ZpZWxkID0gcmVsYXRlZF9tb2RlbF9pbmZvWzBdCiAgICAgICAgICAgIGlmIHNlbGZbbTJvX2ZpZWxkXToKICAgICAgICAgICAgICAgIGlzX2dsb2JhbCA9IEZhbHNlCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIHJldHVybiBpc19nbG9iYWwKCiAgICBkZWYgX2dldF9leHRyYV92YWxzX2ZpZWxkcyhzZWxmKToKICAgICAgICAiIiJDaGVjayBjeC50b3dlci5yZWZlcmVuY2UubWl4aW4gZm9yIHRoZSBmdW5jdGlvbiBkb2N1bWVudGF0aW9uIiIiCgogICAgICAgICMgVXNlIF91c2VkX2luX21vZGVscyBhcyBhIHNvdXJjZSBvZiB0cnV0aAogICAgICAgIHJldHVybiBbZmxkX3ZhbFswXSBmb3IgZmxkX3ZhbCBpbiBzZWxmLl91c2VkX2luX21vZGVscygpLnZhbHVlcygpXQoKICAgIGRlZiBfcHJlX3BvcHVsYXRlX3JlZmVyZW5jZXMoc2VsZiwgbW9kZWxfbmFtZSwgZmllbGRfbmFtZSwgdmFsc19saXN0KToKICAgICAgICAiIiIKICAgICAgICBHZW5lcmF0ZSBtb2RlbC1zY29wZWQgcmVmZXJlbmNlcyBmb3IgdmFyaWFibGUgdmFsdWVzLgoKICAgICAgICBPdmVycmlkZXMgdGhlIG1peGluIG1ldGhvZCB0byBpbXBsZW1lbnQgYSBtb2RlbC1kZXBlbmRlbnQgcmVmZXJlbmNlIHBhdHRlcm4uCgogICAgICAgIFBhdHRlcm46CiAgICAgICAgICAgIDx2YXJpYWJsZV9yZWZlcmVuY2U+Xzxtb2RlbF9nZW5lcmljX3JlZmVyZW5jZT5fPGxpbmtlZF9tb2RlbF9nZW5lcmljX3JlZmVyZW5jZT5fPGxpbmtlZF9yZWNvcmRfcmVmZXJlbmNlPgogICAgICAgIEdsb2JhbDoKICAgICAgICAgICAgPHZhcmlhYmxlX3JlZmVyZW5jZT5fPG1vZGVsX2dlbmVyaWNfcmVmZXJlbmNlPl9nbG9iYWwKICAgICAgICAiIiIKICAgICAgICAjIENvbGxlY3QgcGFyZW50IHZhcmlhYmxlIHJlZmVyZW5jZXMKICAgICAgICBwYXJlbnRfcmVjb3JkX3JlZnMgPSBzZWxmLl9wcmVwYXJlX3JlZmVyZW5jZXMobW9kZWxfbmFtZSwgZmllbGRfbmFtZSwgdmFsc19saXN0KQogICAgICAgIG1vZGVsX3JlZmVyZW5jZSA9IHNlbGYuX2dldF9tb2RlbF9nZW5lcmljX3JlZmVyZW5jZSgpCgogICAgICAgICMgUHJlcGFyZSBtYXBwaW5ncyBmb3IgbGlua2VkIG1vZGVscyBkZWZpbmVkIGluIF91c2VkX2luX21vZGVscwogICAgICAgIHVzZWRfbW9kZWxzID0gc2VsZi5fdXNlZF9pbl9tb2RlbHMoKSBvciB7fQogICAgICAgICMgTWFwIG0ybyBmaWVsZCAtPiBtb2RlbCBuYW1lCiAgICAgICAgbTJvX3RvX21vZGVsID0ge2luZm9bMF06IG1vZGVsIGZvciBtb2RlbCwgaW5mbyBpbiB1c2VkX21vZGVscy5pdGVtcygpfQogICAgICAgICMgUHJlY29tcHV0ZSBsaW5rZWQgbW9kZWwgZ2VuZXJpYyByZWZzIGFuZCByZWNvcmQgcmVmcwogICAgICAgIGxpbmtlZF9nZW5lcmljX2J5X2ZpZWxkID0ge30KICAgICAgICBsaW5rZWRfcmVmc19ieV9maWVsZCA9IHt9CiAgICAgICAgZm9yIG1vZGVsLCAobTJvX2ZpZWxkLCBfZGVzYykgaW4gdXNlZF9tb2RlbHMuaXRlbXMoKToKICAgICAgICAgICAgbGlua2VkX2dlbmVyaWNfYnlfZmllbGRbbTJvX2ZpZWxkXSA9IHNlbGYuZW52WwogICAgICAgICAgICAgICAgbW9kZWwKICAgICAgICAgICAgXS5fZ2V0X21vZGVsX2dlbmVyaWNfcmVmZXJlbmNlKCkKICAgICAgICAgICAgbGlua2VkX3JlZnNfYnlfZmllbGRbbTJvX2ZpZWxkXSA9IHNlbGYuX3ByZXBhcmVfcmVmZXJlbmNlcygKICAgICAgICAgICAgICAgIG1vZGVsLCBtMm9fZmllbGQsIHZhbHNfbGlzdAogICAgICAgICAgICApCgogICAgICAgIGZvciB2YWxzIGluIHZhbHNfbGlzdDoKICAgICAgICAgICAgIyBSZXNwZWN0IGV4cGxpY2l0bHkgcHJvdmlkZWQgcmVmZXJlbmNlcyB3aXRoIGF0IGxlYXN0IG9uZSB2YWxpZCBzeW1ib2wKICAgICAgICAgICAgZXhpc3RpbmdfcmVmZXJlbmNlID0gdmFscy5nZXQoInJlZmVyZW5jZSIpCiAgICAgICAgICAgIGlmIGV4aXN0aW5nX3JlZmVyZW5jZSBhbmQgYm9vbCgKICAgICAgICAgICAgICAgIHJlLnNlYXJjaChzZWxmLlJFRkVSRU5DRV9QUkVMSU1JTkFSWV9QQVRURVJOLCBleGlzdGluZ19yZWZlcmVuY2UpCiAgICAgICAgICAgICk6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgdmFyaWFibGVfaWQgPSB2YWxzLmdldChmaWVsZF9uYW1lKQogICAgICAgICAgICB2YXJpYWJsZV9yZWZlcmVuY2UgPSBwYXJlbnRfcmVjb3JkX3JlZnMuZ2V0KHZhcmlhYmxlX2lkKQogICAgICAgICAgICBpZiBub3QgdmFyaWFibGVfcmVmZXJlbmNlOgogICAgICAgICAgICAgICAgIyBGYWxsYmFjayB0byBnZW5lcmljIHZhcmlhYmxlIHJlZmVyZW5jZSBpZiBwYXJlbnQgcmVmZXJlbmNlIG1pc3NpbmcKICAgICAgICAgICAgICAgIHZhcmlhYmxlX3JlZmVyZW5jZSA9IHNlbGYuZW52W21vZGVsX25hbWVdLl9nZXRfbW9kZWxfZ2VuZXJpY19yZWZlcmVuY2UoKQoKICAgICAgICAgICAgIyBEZXRlcm1pbmUgd2hpY2ggcmVsYXRlZCBtb2RlbCB0aGUgdmFsdWUgaXMgbGlua2VkIHRvCiAgICAgICAgICAgIGxpbmtlZF9tMm9fZmllbGQgPSBuZXh0KAogICAgICAgICAgICAgICAgKGYgZm9yIGYgaW4gbTJvX3RvX21vZGVsLmtleXMoKSBpZiB2YWxzLmdldChmKSksIE5vbmUKICAgICAgICAgICAgKQoKICAgICAgICAgICAgaWYgbGlua2VkX20yb19maWVsZDoKICAgICAgICAgICAgICAgIGxpbmtlZF9tb2RlbF9nZW5lcmljID0gbGlua2VkX2dlbmVyaWNfYnlfZmllbGQuZ2V0KGxpbmtlZF9tMm9fZmllbGQpCiAgICAgICAgICAgICAgICBsaW5rZWRfcmVjb3JkX2lkID0gdmFscy5nZXQobGlua2VkX20yb19maWVsZCkKICAgICAgICAgICAgICAgIGxpbmtlZF9yZWNvcmRfcmVmZXJlbmNlID0gbGlua2VkX3JlZnNfYnlfZmllbGQuZ2V0KAogICAgICAgICAgICAgICAgICAgIGxpbmtlZF9tMm9fZmllbGQsIHt9CiAgICAgICAgICAgICAgICApLmdldChsaW5rZWRfcmVjb3JkX2lkKQogICAgICAgICAgICAgICAgdmFsc1sicmVmZXJlbmNlIl0gPSAoCiAgICAgICAgICAgICAgICAgICAgZiJ7dmFyaWFibGVfcmVmZXJlbmNlfV8iCiAgICAgICAgICAgICAgICAgICAgZiJ7bW9kZWxfcmVmZXJlbmNlfV8iCiAgICAgICAgICAgICAgICAgICAgZiJ7bGlua2VkX21vZGVsX2dlbmVyaWN9XyIKICAgICAgICAgICAgICAgICAgICBmIntsaW5rZWRfcmVjb3JkX3JlZmVyZW5jZX0iCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIEdsb2JhbCB2YWx1ZSAobm90IGxpbmtlZCB0byBhbnkgcmVjb3JkKQogICAgICAgICAgICAgICAgdmFsc1sicmVmZXJlbmNlIl0gPSBmInt2YXJpYWJsZV9yZWZlcmVuY2V9X3ttb2RlbF9yZWZlcmVuY2V9X2dsb2JhbCIKCiAgICAgICAgcmV0dXJuIHZhbHNfbGlzdAoKICAgIGRlZiBfZ2V0X3ByZV9wb3B1bGF0ZWRfbW9kZWxfZGF0YShzZWxmKToKICAgICAgICAiIiJDaGVjayBjeC50b3dlci5yZWZlcmVuY2UubWl4aW4gZm9yIHRoZSBmdW5jdGlvbiBkb2N1bWVudGF0aW9uIiIiCiAgICAgICAgcmVzID0gc3VwZXIoKS5fZ2V0X3ByZV9wb3B1bGF0ZWRfbW9kZWxfZGF0YSgpCiAgICAgICAgcmVzLnVwZGF0ZSh7ImN4LnRvd2VyLnZhcmlhYmxlLnZhbHVlIjogWyJjeC50b3dlci52YXJpYWJsZSIsICJ2YXJpYWJsZV9pZCJdfSkKICAgICAgICByZXR1cm4gcmVzCg==