diff --git a/addons/cetmix_tower_git/models/cx_tower_git_project.py b/addons/cetmix_tower_git/models/cx_tower_git_project.py new file mode 100644 index 0000000..e8854fc --- /dev/null +++ b/addons/cetmix_tower_git/models/cx_tower_git_project.py @@ -0,0 +1 @@ +IyBDb3B5cmlnaHQgKEMpIDIwMjQgQ2V0bWl4IE/DnAojIExpY2Vuc2UgQUdQTC0zLjAgb3IgbGF0ZXIgKGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsKS4KCmltcG9ydCByZQoKZnJvbSBvZG9vIGltcG9ydCBfLCBhcGksIGZpZWxkcywgbW9kZWxzCgoKY2xhc3MgQ3hUb3dlckdpdFByb2plY3QobW9kZWxzLk1vZGVsKToKICAgICIiIgogICAgR2l0IFByb2plY3QuCiAgICBJbXBsZW1lbnRzIHByZS1kZWZpbmVkIGdpdCBjb25maWd1cmF0aW9uLgogICAgIiIiCgogICAgX25hbWUgPSAiY3gudG93ZXIuZ2l0LnByb2plY3QiCiAgICBfZGVzY3JpcHRpb24gPSAiQ2V0bWl4IFRvd2VyIEdpdCBQcm9qZWN0IgogICAgX29yZGVyID0gIm5hbWUiCgogICAgX2luaGVyaXQgPSBbCiAgICAgICAgImN4LnRvd2VyLnJlZmVyZW5jZS5taXhpbiIsCiAgICAgICAgImN4LnRvd2VyLnlhbWwubWl4aW4iLAogICAgICAgICJjeC50b3dlci5hY2Nlc3Mucm9sZS5taXhpbiIsCiAgICBdCgogICAgZGVmIF9nZXRfcG9zdF9jcmVhdGVfZmllbGRzKHNlbGYpOgogICAgICAgIHJlcyA9IHN1cGVyKCkuX2dldF9wb3N0X2NyZWF0ZV9maWVsZHMoKQogICAgICAgIHJldHVybiByZXMgKyBbCiAgICAgICAgICAgICJzb3VyY2VfaWRzIiwKICAgICAgICAgICAgImdpdF9wcm9qZWN0X3JlbF9pZHMiLAogICAgICAgICAgICAiZ2l0X3Byb2plY3RfZmlsZV90ZW1wbGF0ZV9yZWxfaWRzIiwKICAgICAgICBdCgogICAgYWN0aXZlID0gZmllbGRzLkJvb2xlYW4oZGVmYXVsdD1UcnVlKQogICAgIyBJTVBPUlRBTlQ6IFRoaXMgZmllbGQgbWF5IGNvbnRhaW4gZHVwbGljYXRlcyBiZWNhdXNlIG9mIHRoZSByZWxhdGlvbiBuYXR1cmUhCiAgICBzZXJ2ZXJfaWRzID0gZmllbGRzLk1hbnkybWFueSgKICAgICAgICBjb21vZGVsX25hbWU9ImN4LnRvd2VyLnNlcnZlciIsCiAgICAgICAgcmVsYXRpb249ImN4X3Rvd2VyX2dpdF9wcm9qZWN0X3NlcnZlcl9yZWwiLAogICAgICAgIHJlYWRvbmx5PVRydWUsCiAgICAgICAgY29weT1GYWxzZSwKICAgICAgICBjb21wdXRlPSJfY29tcHV0ZV9zZXJ2ZXJfaWRzIiwKICAgICAgICBzdG9yZT1UcnVlLAogICAgICAgIGNvbnRleHQ9eyJhY3RpdmVfdGVzdCI6IEZhbHNlfSwKICAgICAgICBoZWxwPSJTZXJ2ZXJzIGFyZSBhZGRlZCBhdXRvbWF0aWNhbGx5IGJhc2VkIG9uIHRoZSBmaWxlcyIKICAgICAgICAiIGxpbmtlZCB0byB0aGUgcHJvamVjdC4iLAogICAgKQogICAgc291cmNlX2lkcyA9IGZpZWxkcy5PbmUybWFueSgKICAgICAgICBjb21vZGVsX25hbWU9ImN4LnRvd2VyLmdpdC5zb3VyY2UiLAogICAgICAgIGludmVyc2VfbmFtZT0iZ2l0X3Byb2plY3RfaWQiLAogICAgICAgIHN0cmluZz0iU291cmNlcyIsCiAgICAgICAgYXV0b19qb2luPVRydWUsCiAgICAgICAgY29weT1UcnVlLAogICAgKQogICAgZ2l0X3Byb2plY3RfcmVsX2lkcyA9IGZpZWxkcy5PbmUybWFueSgKICAgICAgICBjb21vZGVsX25hbWU9ImN4LnRvd2VyLmdpdC5wcm9qZWN0LnJlbCIsCiAgICAgICAgaW52ZXJzZV9uYW1lPSJnaXRfcHJvamVjdF9pZCIsCiAgICAgICAgc3RyaW5nPSJHaXQgUHJvamVjdCBTZXJ2ZXIgRmlsZSBSZWxhdGlvbnMiLAogICAgICAgIGNvcHk9RmFsc2UsCiAgICApCiAgICAjIEhlbHBlciBmaWVsZCB0byBnZXQgYWxsIGZpbGVzIHJlbGF0ZWQgdG8gZ2l0IHByb2plY3QKICAgIGZpbGVfaWRzID0gZmllbGRzLk1hbnkybWFueSgKICAgICAgICBjb21vZGVsX25hbWU9ImN4LnRvd2VyLmZpbGUiLAogICAgICAgIHJlbGF0aW9uPSJjeF90b3dlcl9naXRfcHJvamVjdF9yZWwiLAogICAgICAgIGNvbHVtbjE9ImdpdF9wcm9qZWN0X2lkIiwKICAgICAgICBjb2x1bW4yPSJmaWxlX2lkIiwKICAgICAgICBzdHJpbmc9IkZpbGVzIiwKICAgICAgICByZWFkb25seT1UcnVlLAogICAgICAgIGRlcGVuZHM9WyJnaXRfcHJvamVjdF9yZWxfaWRzIl0sCiAgICAgICAgY29weT1GYWxzZSwKICAgICkKICAgIGdpdF9wcm9qZWN0X2ZpbGVfdGVtcGxhdGVfcmVsX2lkcyA9IGZpZWxkcy5PbmUybWFueSgKICAgICAgICBjb21vZGVsX25hbWU9ImN4LnRvd2VyLmdpdC5wcm9qZWN0LmZpbGUudGVtcGxhdGUucmVsIiwKICAgICAgICBpbnZlcnNlX25hbWU9ImdpdF9wcm9qZWN0X2lkIiwKICAgICAgICBzdHJpbmc9IkdpdCBQcm9qZWN0IEZpbGUgVGVtcGxhdGUgUmVsYXRpb25zIiwKICAgICAgICBjb3B5PUZhbHNlLAogICAgKQogICAgIyBIZWxwZXIgZmllbGQgdG8gZ2V0IGFsbCBmaWxlIHRlbXBsYXRlcyByZWxhdGVkIHRvIGdpdCBwcm9qZWN0CiAgICBmaWxlX3RlbXBsYXRlX2lkcyA9IGZpZWxkcy5NYW55Mm1hbnkoCiAgICAgICAgY29tb2RlbF9uYW1lPSJjeC50b3dlci5maWxlLnRlbXBsYXRlIiwKICAgICAgICByZWxhdGlvbj0iY3hfdG93ZXJfZ2l0X3Byb2plY3RfZmlsZV90ZW1wbGF0ZV9yZWwiLAogICAgICAgIGNvbHVtbjE9ImdpdF9wcm9qZWN0X2lkIiwKICAgICAgICBjb2x1bW4yPSJmaWxlX3RlbXBsYXRlX2lkIiwKICAgICAgICBzdHJpbmc9IkZpbGUgVGVtcGxhdGVzIiwKICAgICAgICByZWFkb25seT1UcnVlLAogICAgICAgIGRlcGVuZHM9WyJnaXRfcHJvamVjdF9maWxlX3RlbXBsYXRlX3JlbF9pZHMiXSwKICAgICAgICBjb3B5PUZhbHNlLAogICAgKQogICAgIyBIZWxwZXIgZmllbGQgdG8gZ2V0IGFsbCByZXBvc2l0b3JpZXMgdXNlZCBpbiB0aGlzIHByb2plY3QKICAgIHJlcG9faWRzID0gZmllbGRzLk1hbnkybWFueSgKICAgICAgICBjb21vZGVsX25hbWU9ImN4LnRvd2VyLmdpdC5yZXBvIiwKICAgICAgICByZWxhdGlvbj0iY3hfdG93ZXJfZ2l0X3JlcG9fcHJvamVjdF9yZWwiLAogICAgICAgIGNvbHVtbjE9InByb2plY3RfaWQiLAogICAgICAgIGNvbHVtbjI9InJlcG9faWQiLAogICAgICAgIHN0cmluZz0iUmVwb3NpdG9yaWVzIiwKICAgICAgICByZWFkb25seT1UcnVlLAogICAgICAgIGNvcHk9RmFsc2UsCiAgICAgICAgaGVscD0iUmVwb3NpdG9yaWVzIHVzZWQgaW4gdGhpcyBwcm9qZWN0IHRocm91Z2ggaXRzIHNvdXJjZXMgYW5kIHJlbW90ZXMiLAogICAgKQogICAgbm90ZSA9IGZpZWxkcy5UZXh0KCkKCiAgICAjIC0tLS0gQWNjZXNzLiBBZGQgcmVsYXRpb24gZm9yIG1peGluIGZpZWxkcwogICAgdXNlcl9pZHMgPSBmaWVsZHMuTWFueTJtYW55KAogICAgICAgIHJlbGF0aW9uPSJjeF90b3dlcl9naXRfcHJvamVjdF91c2VyX3JlbCIsCiAgICAgICAgY29tcHV0ZT0iX2NvbXB1dGVfdXNlcl9pZHMiLAogICAgICAgIHJlYWRvbmx5PUZhbHNlLAogICAgICAgIHN0b3JlPVRydWUsCiAgICAgICAgcHJlY29tcHV0ZT1UcnVlLAogICAgICAgIGRvbWFpbj1sYW1iZGEgc2VsZjogWwogICAgICAgICAgICAoImdyb3Vwc19pZCIsICJpbiIsIHNlbGYuZW52LnJlZigiY2V0bWl4X3Rvd2VyX3NlcnZlci5ncm91cF9tYW5hZ2VyIikuaWRzKQogICAgICAgIF0sCiAgICApCiAgICBtYW5hZ2VyX2lkcyA9IGZpZWxkcy5NYW55Mm1hbnkoCiAgICAgICAgcmVsYXRpb249ImN4X3Rvd2VyX2dpdF9wcm9qZWN0X21hbmFnZXJfcmVsIiwKICAgICAgICBjb21wdXRlPSJfY29tcHV0ZV91c2VyX2lkcyIsCiAgICAgICAgcmVhZG9ubHk9RmFsc2UsCiAgICAgICAgc3RvcmU9VHJ1ZSwKICAgICAgICBwcmVjb21wdXRlPVRydWUsCiAgICApCgogICAgIyAtLSBVSS9VWCBmaWVsZHMKICAgIGhhc19wcml2YXRlX3JlbW90ZXMgPSBmaWVsZHMuQm9vbGVhbigKICAgICAgICBjb21wdXRlPSJfY29tcHV0ZV9oYXNfcHJpdmF0ZV9yZW1vdGVzIiwKICAgICAgICBoZWxwPSJJbmRpY2F0ZXMgaWYgdGhlIHByb2plY3QgaGFzIGFueSBwcml2YXRlIHJlbW90ZXMuIiwKICAgICkKICAgIGhhc19wYXJ0aWFsbHlfcHJpdmF0ZV9yZW1vdGVzID0gZmllbGRzLkJvb2xlYW4oCiAgICAgICAgY29tcHV0ZT0iX2NvbXB1dGVfaGFzX3ByaXZhdGVfcmVtb3RlcyIsCiAgICAgICAgaGVscD0iSW5kaWNhdGVzIGlmIHRoZSBwcm9qZWN0IGhhcyBhbnkgcGFydGlhbGx5IHByaXZhdGUgcmVtb3Rlcy4iLAogICAgKQoKICAgICMgLS0gR2l0IEFnZ3JlZ2F0b3IgcmVsYXRlZCBmaWVsZHMKICAgIGdpdF9hZ2dyZWdhdG9yX3Jvb3RfZGlyID0gZmllbGRzLkNoYXIoCiAgICAgICAgaGVscD0iR2l0IGFnZ3JlZ2F0b3Igcm9vdCBkaXJlY3Rvcnkgd2hlcmUgc291cmNlcyB3aWxsIGJlIGNsb25lZC4iCiAgICAgICAgIiBFZyAnL3RtcC9naXQtYWdncmVnYXRvciciCiAgICAgICAgIiBXaWxsIHVzZSAnLicgaWYgbm90IHNldCIsCiAgICApCgogICAgZGVmIF9zZWxlY3Rpb25fcHJvamVjdF9mb3JtYXQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUG9zc2libGUgcHJvamVjdCBmb3JtYXRzLgogICAgICAgIEluaGVyaXQgYW5kIGV4dGVuZCB3aGVuIGFkZGluZyBuZXcgcHJvamVjdCBmb3JtYXRzLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBMaXN0IG9mIHR1cGxlczogKGNvZGUsIG5hbWUpCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgKCJnaXRfYWdncmVnYXRvciIsICJHaXQgQWdncmVnYXRvciIpLAogICAgICAgIF0KCiAgICBkZWYgX2RlZmF1bHRfcHJvamVjdF9mb3JtYXQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgRGVmYXVsdCBwcm9qZWN0IGZvcm1hdC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gImdpdF9hZ2dyZWdhdG9yIgoKICAgIEBhcGkuZGVwZW5kcygiZ2l0X3Byb2plY3RfcmVsX2lkcyIsICJnaXRfcHJvamVjdF9yZWxfaWRzLnNlcnZlcl9pZCIpCiAgICBkZWYgX2NvbXB1dGVfc2VydmVyX2lkcyhzZWxmKToKICAgICAgICAiIiJDb21wdXRlIHNlcnZlciBpZHMgZm9yIGdpdCBwcm9qZWN0cy4KCiAgICAgICAgV2h5PyBCZWNhdXNlIGEgZ2l0IHByb2plY3QgY2FuIGJlIGxpbmtlZCB0byBtdWx0aXBsZSBmaWxlcwogICAgICAgIG9uIHRoZSBzYW1lIHNlcnZlci4KICAgICAgICBTbyB3ZSBuZWVkIHRvIHVzZSBhIHNldCB0byBhdm9pZCBkdXBsaWNhdGVzIHNvIGV2ZXJ5IHNlcnZlcgogICAgICAgIGlzIGxpc3RlZCBvbmx5IG9uY2UuCiAgICAgICAgIiIiCiAgICAgICAgZm9yIHByb2plY3QgaW4gc2VsZjoKICAgICAgICAgICAgcHJvamVjdC5zZXJ2ZXJfaWRzID0gKAogICAgICAgICAgICAgICAgbGlzdChzZXQocHJvamVjdC5naXRfcHJvamVjdF9yZWxfaWRzLnNlcnZlcl9pZC5pZHMpKQogICAgICAgICAgICAgICAgaWYgcHJvamVjdC5naXRfcHJvamVjdF9yZWxfaWRzCiAgICAgICAgICAgICAgICBlbHNlIEZhbHNlCiAgICAgICAgICAgICkKCiAgICBAYXBpLmRlcGVuZHMoCiAgICAgICAgImdpdF9wcm9qZWN0X3JlbF9pZHMuc2VydmVyX2lkIiwKICAgICAgICAiZ2l0X3Byb2plY3RfcmVsX2lkcy5zZXJ2ZXJfaWQudXNlcl9pZHMiLAogICAgICAgICJnaXRfcHJvamVjdF9yZWxfaWRzLnNlcnZlcl9pZC5tYW5hZ2VyX2lkcyIsCiAgICApCiAgICBkZWYgX2NvbXB1dGVfdXNlcl9pZHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVXNlcnMuIEFsbCB1c2VycyB3aG8gaGF2ZSAiTWFuYWdlciIgZ3JvdXAgYW5kIGFyZSBlaXRoZXIgc2V0IGluICJVc2VycyIKICAgICAgICBvciBpbiAiTWFuYWdlcnMiIGluIGFsbCByZWxhdGVkIHNlcnZlcnMuCiAgICAgICAgTWFuYWdlcnMuIEFsbCB1c2VycyB3aG8gaGF2ZSAiTWFuYWdlciIgZ3JvdXAgYW5kIGFyZSBzZXQgYXMgIk1hbmFnZXJzIgogICAgICAgIGluIGFsbCByZWxhdGVkIHNlcnZlcnMuCgogICAgICAgIFRoaXMgaXMgZG9uZSB0byBhdm9pZCB1bnByZWRpY3RhYmxlIGNvbnNlcXVlbmNlcyB3aGVuIHNvbWUgb2YgdGhlIHNlcnZlcnMKICAgICAgICBhcmUgbm90IHVwZGF0ZWQgZHVlIHRvIGFjY2VzcyByZXN0cmljdGlvbnMgd2hlbiBhIHByb2plY3QgaXMgdXBkYXRlZC4KICAgICAgICAiIiIKICAgICAgICBmb3IgcHJvamVjdCBpbiBzZWxmOgogICAgICAgICAgICAjIERvIG5vdCBjb21wdXRlIGlmIG5vIHNlcnZlcnMgYXJlIHJlbGF0ZWQKICAgICAgICAgICAgc2VydmVyX2lkcyA9IHByb2plY3QuZ2l0X3Byb2plY3RfcmVsX2lkcy5zZXJ2ZXJfaWQKICAgICAgICAgICAgaWYgbm90IHNlcnZlcl9pZHM6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgIyBHZXQgYWxsIHVzZXIgYW5kIG1hbmFnZXIgaWRzIGZyb20gcmVsYXRlZCBzZXJ2ZXJzCiAgICAgICAgICAgIGFsbF91c2VyX2lkcyA9IHNlcnZlcl9pZHMudXNlcl9pZHMuZmlsdGVyZWQoCiAgICAgICAgICAgICAgICBsYW1iZGEgdTogdS5oYXNfZ3JvdXAoImNldG1peF90b3dlcl9zZXJ2ZXIuZ3JvdXBfbWFuYWdlciIpCiAgICAgICAgICAgICkuaWRzCiAgICAgICAgICAgIGFsbF9tYW5hZ2VyX2lkcyA9IHNlcnZlcl9pZHMubWFuYWdlcl9pZHMuaWRzCgogICAgICAgICAgICAjIENyZWF0ZSBhIGZpbmFsIGxpc3Qgb2YgdXNlciBhbmQgbWFuYWdlciBpZHMKICAgICAgICAgICAgdXNlcl9pZHMgPSBbXQogICAgICAgICAgICBtYW5hZ2VyX2lkcyA9IFtdCiAgICAgICAgICAgICMgQ2hlY2sgaWYgdXNlciBpcyBwcmVzZW50IGluIGFsbCBzZXJ2ZXJzCiAgICAgICAgICAgIGZvciB1c2VyX2lkIGluIGFsbF91c2VyX2lkczoKICAgICAgICAgICAgICAgIGlmIGFsbCgKICAgICAgICAgICAgICAgICAgICB1c2VyX2lkIGluIHNlcnZlci51c2VyX2lkcy5pZHMgb3IgdXNlcl9pZCBpbiBzZXJ2ZXIubWFuYWdlcl9pZHMuaWRzCiAgICAgICAgICAgICAgICAgICAgZm9yIHNlcnZlciBpbiBzZXJ2ZXJfaWRzCiAgICAgICAgICAgICAgICApOgogICAgICAgICAgICAgICAgICAgIHVzZXJfaWRzLmFwcGVuZCh1c2VyX2lkKQogICAgICAgICAgICAjIENoZWNrIGlmIG1hbmFnZXIgaXMgcHJlc2VudCBpbiBhbGwgc2VydmVycwogICAgICAgICAgICBmb3IgbWFuYWdlcl9pZCBpbiBhbGxfbWFuYWdlcl9pZHM6CiAgICAgICAgICAgICAgICBpZiBhbGwobWFuYWdlcl9pZCBpbiBzZXJ2ZXIubWFuYWdlcl9pZHMuaWRzIGZvciBzZXJ2ZXIgaW4gc2VydmVyX2lkcyk6CiAgICAgICAgICAgICAgICAgICAgbWFuYWdlcl9pZHMuYXBwZW5kKG1hbmFnZXJfaWQpCgogICAgICAgICAgICAjIFNldCB0aGUgZmluYWwgbGlzdHMKICAgICAgICAgICAgcHJvamVjdC51cGRhdGUoCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVzZXJfaWRzIjogWyg2LCAwLCB1c2VyX2lkcyldLAogICAgICAgICAgICAgICAgICAgICJtYW5hZ2VyX2lkcyI6IFsoNiwgMCwgbWFuYWdlcl9pZHMpXSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKQoKICAgIEBhcGkuZGVwZW5kcygKICAgICAgICAic291cmNlX2lkcyIsICJzb3VyY2VfaWRzLnJlbW90ZV9pZHMiLCAic291cmNlX2lkcy5yZW1vdGVfaWRzLmlzX3ByaXZhdGUiCiAgICApCiAgICBkZWYgX2NvbXB1dGVfaGFzX3ByaXZhdGVfcmVtb3RlcyhzZWxmKToKICAgICAgICBmb3IgcHJvamVjdCBpbiBzZWxmOgogICAgICAgICAgICBwcm9qZWN0Lmhhc19wcml2YXRlX3JlbW90ZXMgPSBhbnkoCiAgICAgICAgICAgICAgICBzb3VyY2UucmVtb3RlX2NvdW50ID4gMAogICAgICAgICAgICAgICAgYW5kIHNvdXJjZS5yZW1vdGVfY291bnRfcHJpdmF0ZSA9PSBzb3VyY2UucmVtb3RlX2NvdW50CiAgICAgICAgICAgICAgICBmb3Igc291cmNlIGluIHByb2plY3Quc291cmNlX2lkcwogICAgICAgICAgICApCiAgICAgICAgICAgIHByb2plY3QuaGFzX3BhcnRpYWxseV9wcml2YXRlX3JlbW90ZXMgPSBhbnkoCiAgICAgICAgICAgICAgICBzb3VyY2UucmVtb3RlX2NvdW50X3ByaXZhdGUgPiAwCiAgICAgICAgICAgICAgICBhbmQgc291cmNlLnJlbW90ZV9jb3VudF9wcml2YXRlICE9IHNvdXJjZS5yZW1vdGVfY291bnQKICAgICAgICAgICAgICAgIGZvciBzb3VyY2UgaW4gcHJvamVjdC5zb3VyY2VfaWRzCiAgICAgICAgICAgICkKCiAgICBAYXBpLm1vZGVsX2NyZWF0ZV9tdWx0aQogICAgZGVmIGNyZWF0ZShzZWxmLCB2YWxzX2xpc3QpOgogICAgICAgIHJlcyA9IHN1cGVyKCkuY3JlYXRlKHZhbHNfbGlzdCkKICAgICAgICAjIFVwZGF0ZSByZWxhdGVkIGZpbGVzIGFuZCB0ZW1wbGF0ZXMgb24gY3JlYXRlCiAgICAgICAgcmVzLl91cGRhdGVfcmVsYXRlZF9maWxlc19hbmRfdGVtcGxhdGVzKCkKICAgICAgICByZXR1cm4gcmVzCgogICAgZGVmIHdyaXRlKHNlbGYsIHZhbHMpOgogICAgICAgIHJlcyA9IHN1cGVyKCkud3JpdGUodmFscykKICAgICAgICAjIFVwZGF0ZSByZWxhdGVkIGZpbGVzIGFuZCB0ZW1wbGF0ZXMgb24gdXBkYXRlCiAgICAgICAgc2VsZi5fdXBkYXRlX3JlbGF0ZWRfZmlsZXNfYW5kX3RlbXBsYXRlcygpCiAgICAgICAgcmV0dXJuIHJlcwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIEhlbHBlciBtZXRob2RzCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZGVmIF91cGRhdGVfcmVsYXRlZF9maWxlc19hbmRfdGVtcGxhdGVzKHNlbGYpOgogICAgICAgICMgVXBkYXRlIHJlbGF0ZWQgZmlsZXMgYW5kIHRlbXBsYXRlcwogICAgICAgIGlmIHNlbGYuZ2l0X3Byb2plY3RfcmVsX2lkczoKICAgICAgICAgICAgc2VsZi5naXRfcHJvamVjdF9yZWxfaWRzLl9zYXZlX3RvX2ZpbGUoKQogICAgICAgIGlmIHNlbGYuZ2l0X3Byb2plY3RfZmlsZV90ZW1wbGF0ZV9yZWxfaWRzOgogICAgICAgICAgICBzZWxmLmdpdF9wcm9qZWN0X2ZpbGVfdGVtcGxhdGVfcmVsX2lkcy5fc2F2ZV90b19maWxlX3RlbXBsYXRlKCkKCiAgICBkZWYgX2V4dHJhY3RfdmFyaWFibGVzX2Zyb21fdGV4dChzZWxmLCB0ZXh0KToKICAgICAgICAiIiJFeHRyYWN0IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIHRleHQuCiAgICAgICAgSGVscGVyIG1ldGhvZCBmb3IgZmlsZSBjb250ZW50IGdlbmVyYXRpb24uCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIHRleHQgKHN0cik6IFRleHQgdG8gZXh0cmFjdCB2YXJpYWJsZXMgZnJvbQogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIExpc3Q6IExpc3Qgb2YgdmFyaWFibGVzCiAgICAgICAgIiIiCiAgICAgICAgdmFyaWFibGVzID0gcmUuZmluZGFsbChyIlwkKFtBLVowLTlfXSspIiwgdGV4dCkKICAgICAgICByZXR1cm4gc29ydGVkKGxpc3Qoc2V0KHZhcmlhYmxlcykpKQoKICAgIGRlZiBfY29tcG9zZV9jb3B5X25hbWUoc2VsZiwgc2VydmVyPUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBDb21wb3NlIGNvcHkgbmFtZSBvZiBhIGdpdCBwcm9qZWN0IGNvcHkuCiAgICAgICAgSGVscGVyIG1ldGhvZCB1c2VkIHdoZW4gY3JlYXRpbmcgYSBjb3B5IG9mIGEgZ2l0IHByb2plY3QuCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIHNlcnZlciAoY3gudG93ZXIuc2VydmVyKTogU2VydmVyIHRvIGdldCB0aGUgY29weSBuYW1lIGZvci4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQ2hhcjogQ29weSBuYW1lCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5lbnN1cmVfb25lKCkKICAgICAgICBpZiBzZXJ2ZXI6CiAgICAgICAgICAgIHJldHVybiBzZXJ2ZXIubmFtZQogICAgICAgIHJldHVybiBfKCIlKG5hbWUpcyAoY29weSkiLCBuYW1lPXNlbGYubmFtZSkKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBZQU1MIG1peGluIG1ldGhvZHMKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBkZWYgX2dldF9maWVsZHNfZm9yX3lhbWwoc2VsZik6CiAgICAgICAgcmVzID0gc3VwZXIoKS5fZ2V0X2ZpZWxkc19mb3JfeWFtbCgpCiAgICAgICAgcmVzICs9IFsKICAgICAgICAgICAgIm5hbWUiLAogICAgICAgICAgICAibm90ZSIsCiAgICAgICAgICAgICJzb3VyY2VfaWRzIiwKICAgICAgICAgICAgImdpdF9hZ2dyZWdhdG9yX3Jvb3RfZGlyIiwKICAgICAgICBdCiAgICAgICAgcmV0dXJuIHJlcwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBHaXQgQWdncmVnYXRvciByZWxhdGVkIG1ldGhvZHMKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZGVmIF9naXRfYWdncmVnYXRvcl9wcmVwYXJlX3JlY29yZChzZWxmKToKICAgICAgICAiIiJQcmVwYXJlIGpzb24gc3RydWN0dXJlIGZvciBnaXQgYWdncmVnYXRvci4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgRGljdDogSnNvbiBzdHJ1Y3R1cmUgZm9yIGdpdCBhZ2dyZWdhdG9yCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5lbnN1cmVfb25lKCkKICAgICAgICB2YWx1ZXMgPSB7fQogICAgICAgIGZvciBzb3VyY2UgaW4gc2VsZi5zb3VyY2VfaWRzOgogICAgICAgICAgICBpZiBzb3VyY2UuZW5hYmxlZCBhbmQgc291cmNlLnJlbW90ZV9jb3VudDoKICAgICAgICAgICAgICAgIHJvb3RfZGlyID0gc2VsZi5naXRfYWdncmVnYXRvcl9yb290X2RpciBvciAiLiIKICAgICAgICAgICAgICAgIHZhbHVlcy51cGRhdGUoCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmIi97c291cmNlLnJlZmVyZW5jZX0iCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHJvb3RfZGlyID09ICIvIgogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGYie3Jvb3RfZGlyfS97c291cmNlLnJlZmVyZW5jZX0iOiBzb3VyY2UuX2dpdF9hZ2dyZWdhdG9yX3ByZXBhcmVfcmVjb3JkKCkgICMgbm9xYTogRTUwMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICByZXR1cm4gdmFsdWVzCgogICAgZGVmIF9naXRfYWdncmVnYXRvcl9wcmVwYXJlX3lhbWxfY29tbWVudChzZWxmLCB5YW1sX2NvZGUpOgogICAgICAgICIiIkdlbmVyYXRlIGNvbW1lbnRhcnkgZm9yIHlhbWwgZmlsZS4KICAgICAgICBJdCBpbmNsdWRlcyBicmllZiBpbnN0cnVjdGlvbnMgZm9yIGdpdCBhZ2dyZWdhdG9yCiAgICAgICAgYW5kIGxpc3RzIGVudmlyb25tZW50IHZhcmlhYmxlcyB0aGF0IGFyZSByZXF1aXJlZC4KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgeWFtbF9jb2RlIChzdHIpOiBZYW1sIGNvZGUKCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQ2hhcjogY29tbWVudCB0ZXh0IG9yIE5vbmUKICAgICAgICAiIiIKCiAgICAgICAgY29tbWVudF90ZXh0ID0gXygKICAgICAgICAgICAgIiMgVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCB3aXRoIENldG1peCBUb3dlciBodHRwczovL2NldG1peC5jb20vdG93ZXJcbiIKICAgICAgICAgICAgIiMgSXQncyBkZXNpZ25lZCB0byBiZSB1c2VkIHdpdGggZ2l0LWFnZ3JlZ2F0b3IgdG9vbCBkZXZlbG9wZWQgYnkgQWNzb25lLlxuIgogICAgICAgICAgICAiIyBEb2N1bWVudGF0aW9uIGZvciBnaXQtYWdncmVnYXRvcjogaHR0cHM6Ly9naXRodWIuY29tL2Fjc29uZS9naXQtYWdncmVnYXRvclxuIgogICAgICAgICkKICAgICAgICB2YXJpYWJsZV9saXN0ID0gc2VsZi5fZXh0cmFjdF92YXJpYWJsZXNfZnJvbV90ZXh0KHlhbWxfY29kZSkKICAgICAgICBpZiB2YXJpYWJsZV9saXN0OgogICAgICAgICAgICBjb21tZW50X3RleHQgKz0gXygKICAgICAgICAgICAgICAgICJcbiMgWW91IG5lZWQgdG8gc2V0IHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGluIHlvdXIgZW52aXJvbm1lbnQ6XG4jICUodmFycylzXG4iICAjIG5vcWE6IEU1MDEKICAgICAgICAgICAgICAgICIjIGFuZCBydW4gZ2l0LWFnZ3JlZ2F0b3Igd2l0aCAnLS1leHBhbmQtZW52JyBwYXJhbWV0ZXIuXG4iLCAgIyBub3FhOiBFNTAxCiAgICAgICAgICAgICAgICB2YXJzPSgiLCAiLmpvaW4odmFyaWFibGVfbGlzdCkpLAogICAgICAgICAgICApCiAgICAgICAgcmV0dXJuIGNvbW1lbnRfdGV4dAoKICAgIGRlZiBfZ2VuZXJhdGVfY29kZV9naXRfYWdncmVnYXRvcihzZWxmLCByZWNvcmQpOgogICAgICAgICIiIkdlbmVyYXRlIGNvZGUgaW4gZ2l0LWFnZ3JlZ2F0b3IgZm9ybWF0LgoKICAgICAgICBBcmdzOgogICAgICAgICAgICByZWNvcmQgKHJlY29yZHNldCgpKTogTW9kZWwgcmVjb3JkIHRvIGdlbmVyYXRlIGNvZGUgZm9yLgogICAgICAgICAgICAgICAgbXVzdCBiZSBhIHNpbmdsZSByZWNvcmQgYW5kIGhhdmUgZ2l0X3Byb2plY3RfaWQgZmllbGQuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIFRleHQ6IFlhbWwgY29kZQogICAgICAgICIiIgogICAgICAgIHlhbWxfbWl4aW4gPSBzZWxmLmVudlsiY3gudG93ZXIueWFtbC5taXhpbiJdCgogICAgICAgICMgRG8gbm90IGdlbmVyYXRlIGNvZGUgaWYgcmVjb3JkIHZhbHVlcyBhcmUgZW1wdHkKICAgICAgICByZWNvcmRfdmFsdWVzID0gcmVjb3JkLmdpdF9wcm9qZWN0X2lkLl9naXRfYWdncmVnYXRvcl9wcmVwYXJlX3JlY29yZCgpCiAgICAgICAgaWYgcmVjb3JkX3ZhbHVlczoKICAgICAgICAgICAgeWFtbF9jb2RlID0geWFtbF9taXhpbi5fY29udmVydF9kaWN0X3RvX3lhbWwocmVjb3JkX3ZhbHVlcykKICAgICAgICAgICAgIyBQcmVwZW5kIGNvbW1lbnQgdG8geWFtbCBjb2RlCiAgICAgICAgICAgIGNvbW1lbnQgPSByZWNvcmQuZ2l0X3Byb2plY3RfaWQuX2dpdF9hZ2dyZWdhdG9yX3ByZXBhcmVfeWFtbF9jb21tZW50KAogICAgICAgICAgICAgICAgeWFtbF9jb2RlCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmV0dXJuIGYie2NvbW1lbnR9XG57eWFtbF9jb2RlfSIKICAgICAgICByZXR1cm4gIiIK \ No newline at end of file