From 2d317ebbd6c377841d937c13a5828f1ce2ea1932 Mon Sep 17 00:00:00 2001 From: Andrew Batallas Date: Tue, 3 Mar 2026 17:06:00 -0500 Subject: [PATCH] Set OOD VM tags --- bicep/files-to-load/create_cc_param.py | 2 ++ bicep/files-to-load/encoded/create_cc_param.py.base64 | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/bicep/files-to-load/create_cc_param.py b/bicep/files-to-load/create_cc_param.py index 34bf9f08..49606407 100644 --- a/bicep/files-to-load/create_cc_param.py +++ b/bicep/files-to-load/create_cc_param.py @@ -125,6 +125,8 @@ def set_ood_params(params, outputs): params['ood_entra_tenant_id'] = outputs['ood']['value'].get('tenantId') params['ood_nic'] = outputs['ood']['value'].get('nic') + params['NodeTags'] = slurm_params['NodeTags'] + class ClusterInitSpec: def __init__(self, project: str, version: str, spec: str, targets: typing.List[str]): self.project = project diff --git a/bicep/files-to-load/encoded/create_cc_param.py.base64 b/bicep/files-to-load/encoded/create_cc_param.py.base64 index bdec1203..3bd00842 100644 --- a/bicep/files-to-load/encoded/create_cc_param.py.base64 +++ b/bicep/files-to-load/encoded/create_cc_param.py.base64 @@ -1 +1 @@ -IyEvdXNyL2Jpbi9lbnYgcHl0aG9uDQoNCmltcG9ydCBhcmdwYXJzZQ0KaW1wb3J0IGhhc2hsaWINCmltcG9ydCBqc29uDQppbXBvcnQgb3MNCmltcG9ydCBzaHV0aWwNCmZyb20gc3VicHJvY2VzcyBpbXBvcnQgY2hlY2tfb3V0cHV0DQppbXBvcnQgc3lzDQppbXBvcnQgdHlwaW5nDQoNCg0KZGVmIGdldF9qc29uX2RpY3QoZmlsZV9uYW1lKToNCiAgICBhYnNfcGF0aCA9IG9zLnBhdGguYWJzcGF0aChmaWxlX25hbWUpDQogICAgd2l0aCBvcGVuKGFic19wYXRoKSBhcyBmcjoNCiAgICAgICAgcmV0dXJuIGpzb24ubG9hZChmcikNCg0KDQpkZWYgc2V0X3NsdXJtX3BhcmFtcyhwYXJhbXMsIGRiUGFzc3dvcmQsIG91dHB1dHMpOg0KICAgIHBhcmFtc1snUmVnaW9uJ10gPSBvdXRwdXRzWydsb2NhdGlvbiddWyd2YWx1ZSddDQogICAgaWYgb3V0cHV0c1sndm5ldCddWyd2YWx1ZSddWyd0eXBlJ10gPT0gJ25ldyc6DQogICAgICAgIHN1Ym5ldElEID0gb3V0cHV0c1sndm5ldCddWyd2YWx1ZSddWydjb21wdXRlU3VibmV0SWQnXQ0KICAgICAgICBzdWJuZXRfdG9rcyA9IHN1Ym5ldElELnNwbGl0KCIvIikNCiAgICAgICAgaWYgbGVuKHN1Ym5ldF90b2tzKSA+PSAxMToNCiAgICAgICAgICAgIHBhcmFtc1snU3VibmV0SWQnXSA9ICIvIi5qb2luKFtzdWJuZXRfdG9rc1s0XSwgc3VibmV0X3Rva3NbOF0sIHN1Ym5ldF90b2tzWzEwXV0pDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBwcmludChmIlVuZXhwZWN0ZWQgc3VibmV0IGlkIHtzdWJuZXRJRH0gLSBwYXNzaW5nIGFzIFN1Ym5ldElkIGRpcmVjdGx5IGluc3RlYWQgb2YgcmVzb3VyY2VfZ3JvdXAvdm5ldF9uYW1lL3N1Ym5ldF9uYW1lIiwgZmlsZT1zeXMuc3RkZXJyKQ0KICAgICAgICAgICAgcGFyYW1zWydTdWJuZXRJZCddID0gc3VibmV0SUQNCiAgICBlbHNlOg0KICAgICAgICBwYXJhbXNbJ1N1Ym5ldElkJ10gPSAnLycuam9pbihbb3V0cHV0c1sndm5ldCddWyd2YWx1ZSddWydyZyddLCBvdXRwdXRzWyd2bmV0J11bJ3ZhbHVlJ11bJ25hbWUnXSwgb3V0cHV0c1sndm5ldCddWyd2YWx1ZSddWydjb21wdXRlU3VibmV0TmFtZSddXSkNCiAgICAgICAgDQogICAgIyBEZWZpbmUgQXZhaWxhYmlsaXR5IFpvbmUNCiAgICBwYXJhbXNbJ0RlZmluZU5vZGVzQXZhaWxhYmlsaXR5Wm9uZSddID0gYW55KCdhdmFpbGFiaWxpdHlab25lJyBpbiB6b25lTGlzdCBmb3Igem9uZUxpc3QgaW4gW291dHB1dHNbJ3BhcnRpdGlvbnMnXVsndmFsdWUnXVsnaHRjJ10sIG91dHB1dHNbJ3BhcnRpdGlvbnMnXVsndmFsdWUnXVsnaHBjJ10sIG91dHB1dHNbJ3BhcnRpdGlvbnMnXVsndmFsdWUnXVsnZ3B1J11dKQ0KICAgIA0KICAgICNIVEMNCiAgICBwYXJhbXNbJ0hUQ01hY2hpbmVUeXBlJ10gPSBvdXRwdXRzWydwYXJ0aXRpb25zJ11bJ3ZhbHVlJ11bJ2h0YyddWydza3UnXQ0KICAgIHBhcmFtc1snTWF4SFRDRXhlY3V0ZU5vZGVDb3VudCddID0gaW50KG91dHB1dHNbJ3BhcnRpdGlvbnMnXVsndmFsdWUnXVsnaHRjJ11bJ21heE5vZGVzJ10pDQogICAgcGFyYW1zWydIVENJbWFnZU5hbWUnXSA9IG91dHB1dHNbJ3BhcnRpdGlvbnMnXVsndmFsdWUnXVsnaHRjJ11bJ29zSW1hZ2UnXQ0KICAgIHBhcmFtc1snSFRDVXNlTG93UHJpbyddID0gb3V0cHV0c1sncGFydGl0aW9ucyddWyd2YWx1ZSddWydodGMnXVsndXNlU3BvdCddDQogICAgcGFyYW1zWydIVENBdmFpbGFiaWxpdHlab25lJ10gPSBvdXRwdXRzWydwYXJ0aXRpb25zJ11bJ3ZhbHVlJ11bJ2h0YyddWydhdmFpbGFiaWxpdHlab25lJ10gaWYgcGFyYW1zWydEZWZpbmVOb2Rlc0F2YWlsYWJpbGl0eVpvbmUnXSBhbmQgJ2F2YWlsYWJpbGl0eVpvbmUnIGluIG91dHB1dHNbJ3BhcnRpdGlvbnMnXVsndmFsdWUnXVsnaHRjJ10gZWxzZSBOb25lDQogICAgDQogICAgI0hQQw0KICAgIHBhcmFtc1snSFBDTWFjaGluZVR5cGUnXSA9IG91dHB1dHNbJ3BhcnRpdGlvbnMnXVsndmFsdWUnXVsnaHBjJ11bJ3NrdSddDQogICAgcGFyYW1zWydNYXhIUENFeGVjdXRlTm9kZUNvdW50J10gPSBpbnQob3V0cHV0c1sncGFydGl0aW9ucyddWyd2YWx1ZSddWydocGMnXVsnbWF4Tm9kZXMnXSkNCiAgICBwYXJhbXNbJ0hQQ0ltYWdlTmFtZSddID0gb3V0cHV0c1sncGFydGl0aW9ucyddWyd2YWx1ZSddWydocGMnXVsnb3NJbWFnZSddDQogICAgcGFyYW1zWydIUENBdmFpbGFiaWxpdHlab25lJ10gPSBvdXRwdXRzWydwYXJ0aXRpb25zJ11bJ3ZhbHVlJ11bJ2hwYyddWydhdmFpbGFiaWxpdHlab25lJ10gaWYgcGFyYW1zWydEZWZpbmVOb2Rlc0F2YWlsYWJpbGl0eVpvbmUnXSBhbmQgJ2F2YWlsYWJpbGl0eVpvbmUnIGluIG91dHB1dHNbJ3BhcnRpdGlvbnMnXVsndmFsdWUnXVsnaHBjJ10gZWxzZSBOb25lDQoNCiAgICAjR1BVDQogICAgcGFyYW1zWydHUFVNYWNoaW5lVHlwZSddID0gb3V0cHV0c1sncGFydGl0aW9ucyddWyd2YWx1ZSddWydncHUnXVsnc2t1J10NCiAgICBwYXJhbXNbJ01heEdQVUV4ZWN1dGVOb2RlQ291bnQnXSA9IGludChvdXRwdXRzWydwYXJ0aXRpb25zJ11bJ3ZhbHVlJ11bJ2dwdSddWydtYXhOb2RlcyddKQ0KICAgIHBhcmFtc1snR1BVSW1hZ2VOYW1lJ10gPSBvdXRwdXRzWydwYXJ0aXRpb25zJ11bJ3ZhbHVlJ11bJ2dwdSddWydvc0ltYWdlJ10NCiAgICBwYXJhbXNbJ0dQVUF2YWlsYWJpbGl0eVpvbmUnXSA9IG91dHB1dHNbJ3BhcnRpdGlvbnMnXVsndmFsdWUnXVsnZ3B1J11bJ2F2YWlsYWJpbGl0eVpvbmUnXSBpZiBwYXJhbXNbJ0RlZmluZU5vZGVzQXZhaWxhYmlsaXR5Wm9uZSddIGFuZCAnYXZhaWxhYmlsaXR5Wm9uZScgaW4gb3V0cHV0c1sncGFydGl0aW9ucyddWyd2YWx1ZSddWydncHUnXSBlbHNlIE5vbmUNCg0KICAgICNzY2hlZHVsZXIgbm9kZQ0KICAgICNwYXJhbXNbJ3NsdXJtJ10gI2lzIHRoaXMgdGhlIHNsdXJtIHZlcnNpb24/Pz8gbm8sIHNvIHdoYXQgaXMgaXQ/DQogICAgcGFyYW1zWydTY2hlZHVsZXJNYWNoaW5lVHlwZSddID0gb3V0cHV0c1snc2NoZWR1bGVyTm9kZSddWyd2YWx1ZSddWydza3UnXQ0KICAgIHBhcmFtc1snU2NoZWR1bGVySW1hZ2VOYW1lJ10gPSBvdXRwdXRzWydzY2hlZHVsZXJOb2RlJ11bJ3ZhbHVlJ11bJ29zSW1hZ2UnXQ0KICAgIHBhcmFtc1snY29uZmlndXJhdGlvbl9zbHVybV92ZXJzaW9uJ10gPSBvdXRwdXRzWydzbHVybVNldHRpbmdzJ11bJ3ZhbHVlJ11bJ3ZlcnNpb24nXQ0KICAgICMgaWYgb3V0cHV0c1snc2x1cm1TZXR0aW5ncyddWyd2YWx1ZSddWydjYW5Vc2VTbHVybUhBJ106DQogICAgIyAgICAgcGFyYW1zWydjb25maWd1cmF0aW9uX3NsdXJtX2hhX2VuYWJsZWQnXSA9IG91dHB1dHNbJ3NsdXJtU2V0dGluZ3MnXVsndmFsdWUnXVsnc2x1cm1IQSddDQogICAgcGFyYW1zWydjb25maWd1cmF0aW9uX3NsdXJtX2FjY291bnRpbmdfZW5hYmxlZCddID0gYm9vbChvdXRwdXRzWydkYXRhYmFzZUluZm8nXVsndmFsdWUnXSkNCiAgICBpZiBwYXJhbXNbJ2NvbmZpZ3VyYXRpb25fc2x1cm1fYWNjb3VudGluZ19lbmFibGVkJ106DQogICAgICAgIHBhcmFtc1snY29uZmlndXJhdGlvbl9zbHVybV9hY2NvdW50aW5nX3VzZXInXSA9IG91dHB1dHNbJ2RhdGFiYXNlSW5mbyddWyd2YWx1ZSddWydkYXRhYmFzZVVzZXInXQ0KICAgIGlmIHBhcmFtc1snY29uZmlndXJhdGlvbl9zbHVybV9hY2NvdW50aW5nX2VuYWJsZWQnXToNCiAgICAgICAgcGFyYW1zWydjb25maWd1cmF0aW9uX3NsdXJtX2FjY291bnRpbmdfcGFzc3dvcmQnXSA9IGRiUGFzc3dvcmQNCiAgICBpZiBwYXJhbXNbJ2NvbmZpZ3VyYXRpb25fc2x1cm1fYWNjb3VudGluZ19lbmFibGVkJ106DQogICAgICAgIHBhcmFtc1snY29uZmlndXJhdGlvbl9zbHVybV9hY2NvdW50aW5nX3VybCddID0gb3V0cHV0c1snZGF0YWJhc2VJbmZvJ11bJ3ZhbHVlJ11bJ3VybCddDQogICAgI3BhcmFtc1snY29uZmlndXJhdGlvbl9zbHVybV9hY2NvdW50aW5nX2NlcnRpZmljYXRlX3VybCddDQoNCiAgICAjbG9naW4gbm9kZShzKQ0KICAgIHBhcmFtc1snbG9naW5NYWNoaW5lVHlwZSddID0gKG91dHB1dHNbJ2xvZ2luTm9kZXMnXVsndmFsdWUnXVsnc2t1J10pLnN0cmlwKCkNCiAgICBwYXJhbXNbJ051bWJlckxvZ2luTm9kZXMnXSA9IGludChvdXRwdXRzWydsb2dpbk5vZGVzJ11bJ3ZhbHVlJ11bJ2luaXRpYWxOb2RlcyddKQ0KICAgIHBhcmFtc1snTWF4TG9naW5Ob2RlQ291bnQnXSA9IGludChvdXRwdXRzWydsb2dpbk5vZGVzJ11bJ3ZhbHVlJ11bJ21heE5vZGVzJ10pDQogICAgcGFyYW1zWydMb2dpbkltYWdlTmFtZSddID0gb3V0cHV0c1snbG9naW5Ob2RlcyddWyd2YWx1ZSddWydvc0ltYWdlJ10NCiAgICBwYXJhbXNbJ0VuYWJsZU5vZGVIZWFsdGhDaGVja3MnXSA9IG91dHB1dHNbJ3NsdXJtU2V0dGluZ3MnXVsndmFsdWUnXVsnaGVhbHRoQ2hlY2tFbmFibGVkJ10NCg0KICAgICNFeGVjdXRlIG5vZGUgdGFncw0KICAgIHBhcmFtc1snTm9kZVRhZ3MnXSA9IG91dHB1dHNbJ25vZGVBcnJheVRhZ3MnXVsndmFsdWUnXQ0KDQogICAgI05ldHdvcmsgQXR0YWNoZWQgU3RvcmFnZQ0KICAgIHBhcmFtc1snVXNlQnVpbHRpblNoYXJlZCddID0gb3V0cHV0c1snZmlsZXJJbmZvRmluYWwnXVsndmFsdWUnXVsnaG9tZSddWyd0eXBlJ10gPT0gJ25mcy1uZXcnIA0KICAgIGlmIHBhcmFtc1snVXNlQnVpbHRpblNoYXJlZCddOg0KICAgICAgICBwYXJhbXNbJ0ZpbGVzeXN0ZW1TaXplJ10gPSBvdXRwdXRzWydmaWxlckluZm9GaW5hbCddWyd2YWx1ZSddWydob21lJ11bJ25mc0NhcGFjaXR5SW5HYiddDQogICAgZWxzZToNCiAgICAgICAgcGFyYW1zWydORlNUeXBlJ10gPSAnbmZzJyBpZiBvdXRwdXRzWydmaWxlckluZm9GaW5hbCddWyd2YWx1ZSddWydob21lJ11bJ3R5cGUnXSBpbiBbJ25mcy1leGlzdGluZycsJ2FuZi1uZXcnXSBlbHNlICdsdXN0cmUnDQogICAgICAgICMgV2Ugbm8gbG9uZ2VyIG5lZWQgdG8gaGFuZGxlIHRoZXNlIGRpZmZlcmVudGx5IGJhc2VkIG9uIHRoZSBmcyB0eXBlLCBhcyBlYWNoDQogICAgICAgICMgZnMgbW9kdWxlJ3MgY29tbW9uIG91dHB1dHMgbWFwIHRvIHRoZXNlLg0KICAgICAgICBwYXJhbXNbJ05GU1NoYXJlZEV4cG9ydFBhdGgnXSA9IG91dHB1dHNbJ2ZpbGVySW5mb0ZpbmFsJ11bJ3ZhbHVlJ11bJ2hvbWUnXVsnZXhwb3J0UGF0aCddDQogICAgICAgIHBhcmFtc1snTkZTU2hhcmVkTW91bnRPcHRpb25zJ10gPSBvdXRwdXRzWydmaWxlckluZm9GaW5hbCddWyd2YWx1ZSddWydob21lJ11bJ21vdW50T3B0aW9ucyddDQogICAgICAgIHBhcmFtc1snTkZTQWRkcmVzcyddID0gb3V0cHV0c1snZmlsZXJJbmZvRmluYWwnXVsndmFsdWUnXVsnaG9tZSddWydpcEFkZHJlc3MnXQ0KDQogICAgcGFyYW1zWydBZGRpdGlvbmFsTkZTJ10gPSBvdXRwdXRzWydmaWxlckluZm9GaW5hbCddWyd2YWx1ZSddWydhZGRpdGlvbmFsJ11bJ3R5cGUnXSAhPSAnZGlzYWJsZWQnDQogICAgaWYgcGFyYW1zWydBZGRpdGlvbmFsTkZTJ106DQogICAgICAgIHBhcmFtc1snQWRkaXRpb25hbE5GU1R5cGUnXSA9ICduZnMnIGlmIG91dHB1dHNbJ2ZpbGVySW5mb0ZpbmFsJ11bJ3ZhbHVlJ11bJ2FkZGl0aW9uYWwnXVsndHlwZSddIGluIFsnbmZzLWV4aXN0aW5nJywnYW5mLW5ldyddIGVsc2UgJ2x1c3RyZScNCiAgICAgICAgcGFyYW1zWydBZGRpdGlvbmFsTkZTTW91bnRQb2ludCddID0gb3V0cHV0c1snZmlsZXJJbmZvRmluYWwnXVsndmFsdWUnXVsnYWRkaXRpb25hbCddWydtb3VudFBhdGgnXQ0KICAgICAgICBwYXJhbXNbJ0FkZGl0aW9uYWxORlNFeHBvcnRQYXRoJ10gPSBvdXRwdXRzWydmaWxlckluZm9GaW5hbCddWyd2YWx1ZSddWydhZGRpdGlvbmFsJ11bJ2V4cG9ydFBhdGgnXQ0KICAgICAgICBwYXJhbXNbJ0FkZGl0aW9uYWxORlNNb3VudE9wdGlvbnMnXSA9IG91dHB1dHNbJ2ZpbGVySW5mb0ZpbmFsJ11bJ3ZhbHVlJ11bJ2FkZGl0aW9uYWwnXVsnbW91bnRPcHRpb25zJ10NCiAgICAgICAgcGFyYW1zWydBZGRpdGlvbmFsTkZTQWRkcmVzcyddID0gb3V0cHV0c1snZmlsZXJJbmZvRmluYWwnXVsndmFsdWUnXVsnYWRkaXRpb25hbCddWydpcEFkZHJlc3MnXQ0KICAgIA0KICAgICMgTW9uaXRvcmluZw0KICAgIHBhcmFtc1snY29uZmlndXJhdGlvbl9tb25pdG9yaW5nX2VuYWJsZWQnXSA9IG91dHB1dHNbJ21vbml0b3JpbmcnXVsndmFsdWUnXVsnZW5hYmxlZCddDQogICAgcGFyYW1zWydjb25maWd1cmF0aW9uX2lkZW50aXR5X2NsaWVudF9pZCddID0gb3V0cHV0c1snbW9uaXRvcmluZyddWyd2YWx1ZSddWydtYW5hZ2VkSWRlbnRpdHlDbGllbnRJZCddIGlmIHBhcmFtc1snY29uZmlndXJhdGlvbl9tb25pdG9yaW5nX2VuYWJsZWQnXSBlbHNlIE5vbmUNCiAgICBwYXJhbXNbJ2NvbmZpZ3VyYXRpb25faW5nZXN0aW9uX2VuZHBvaW50J10gPSBvdXRwdXRzWydtb25pdG9yaW5nJ11bJ3ZhbHVlJ11bJ2luZ2VzdGlvbkVuZHBvaW50J10gaWYgcGFyYW1zWydjb25maWd1cmF0aW9uX21vbml0b3JpbmdfZW5hYmxlZCddIGVsc2UgTm9uZQ0KDQoNCmRlZiBzZXRfb29kX3BhcmFtcyhwYXJhbXMsIG91dHB1dHMpOg0KICAgIHNsdXJtX3BhcmFtcyA9IGdldF9qc29uX2RpY3QoJ2luaXRpYWxfcGFyYW1zLmpzb24nKQ0KICAgICMgV2Ugd2FudCB0byBlc3NlbnRpYWxseSBpbmhlcml0IGNlcnRhaW4gc2V0dGluZ3MgZnJvbSB0aGUgc2x1cm0gY2x1c3Rlci4NCiAgICBzZXRfc2x1cm1fcGFyYW1zKHNsdXJtX3BhcmFtcywgIiIsIG91dHB1dHMpDQogICAgcGFyYW1zWydORlNBZGRyZXNzJ10gPSBzbHVybV9wYXJhbXMuZ2V0KCdORlNBZGRyZXNzJykgb3IgJ2Njdy1zY2hlZHVsZXInDQogICAgcGFyYW1zWydORlNTaGFyZWRFeHBvcnRQYXRoJ10gPSBzbHVybV9wYXJhbXMuZ2V0KCdORlNTaGFyZWRFeHBvcnRQYXRoJykgb3IgJy9zaGFyZWQnDQogICAgcGFyYW1zWydORlNTaGFyZWRNb3VudE9wdGlvbnMnXSA9IHNsdXJtX3BhcmFtcy5nZXQoJ05GU1NoYXJlZE1vdW50T3B0aW9ucycpDQogICAgcGFyYW1zWydTdWJuZXRJZCddID0gc2x1cm1fcGFyYW1zWyJTdWJuZXRJZCJdDQogICAgcGFyYW1zWydSZWdpb24nXSA9IHNsdXJtX3BhcmFtc1snUmVnaW9uJ10NCiAgICBwYXJhbXNbJ0NyZWRlbnRpYWxzJ10gPSBzbHVybV9wYXJhbXNbJ0NyZWRlbnRpYWxzJ10NCg0KICAgIHBhcmFtc1snTWFjaGluZVR5cGUnXSA9IG91dHB1dHNbJ29vZCddWyd2YWx1ZSddLmdldCgnc2t1JykNCiAgICBwYXJhbXNbJ01hbmFnZWRJZGVudGl0eSddID0gb3V0cHV0c1snb29kJ11bJ3ZhbHVlJ10uZ2V0KCdtYW5hZ2VkSWRlbnRpdHknKQ0KICAgIHBhcmFtc1snQm9vdERpc2tTaXplJ10gPSBvdXRwdXRzWydvb2QnXVsndmFsdWUnXS5nZXQoJ0Jvb3REaXNrU2l6ZScpDQogICAgcGFyYW1zWydJbWFnZU5hbWUnXSA9IG91dHB1dHNbJ29vZCddWyd2YWx1ZSddLmdldCgnb3NJbWFnZScpDQoNCiAgICBwYXJhbXNbJ29vZF9zZXJ2ZXJfbmFtZSddID0gb3V0cHV0c1snb29kJ11bJ3ZhbHVlJ10uZ2V0KCdmcWRuJywnJykNCiAgICBwYXJhbXNbJ29vZF9lbnRyYV91c2VyX21hcF9tYXRjaCddID0gb3V0cHV0c1snb29kJ11bJ3ZhbHVlJ10uZ2V0KCd1c2VyRG9tYWluJykNCiAgICBwYXJhbXNbJ29vZF9lbnRyYV9jbGllbnRfaWQnXSA9IG91dHB1dHNbJ29vZCddWyd2YWx1ZSddLmdldCgnY2xpZW50SWQnKQ0KICAgIHBhcmFtc1snb29kX2VudHJhX3RlbmFudF9pZCddID0gb3V0cHV0c1snb29kJ11bJ3ZhbHVlJ10uZ2V0KCd0ZW5hbnRJZCcpDQogICAgcGFyYW1zWydvb2RfbmljJ10gPSBvdXRwdXRzWydvb2QnXVsndmFsdWUnXS5nZXQoJ25pYycpDQoNCmNsYXNzIENsdXN0ZXJJbml0U3BlYzoNCiAgICBkZWYgX19pbml0X18oc2VsZiwgcHJvamVjdDogc3RyLCB2ZXJzaW9uOiBzdHIsIHNwZWM6IHN0ciwgdGFyZ2V0czogdHlwaW5nLkxpc3Rbc3RyXSk6DQogICAgICAgIHNlbGYucHJvamVjdCA9IHByb2plY3QNCiAgICAgICAgc2VsZi52ZXJzaW9uID0gdmVyc2lvbg0KICAgICAgICBzZWxmLnNwZWMgPSBzcGVjDQogICAgICAgIHNlbGYudGFyZ2V0cyA9IHRhcmdldHMNCiAgICAgICAgc2VsZi5jbHVzdGVyX2luaXRfa2V5ID0gZiJ7c2VsZi5wcm9qZWN0fTp7c2VsZi5zcGVjfTp7c2VsZi52ZXJzaW9ufSINCg0KDQpkZWYgZG93bmxvYWRfY2x1c3Rlcl9pbml0KG91dHB1dHMsIHJvb3RfZm9sZGVyLCBsb2NrZXIpIC0+IHR5cGluZy5MaXN0W0NsdXN0ZXJJbml0U3BlY106DQogICAgcmV0ID0gW10NCiAgICBmb3IgcmVjb3JkIGluIChvdXRwdXRzWydjbHVzdGVySW5pdFNwZWNzJ10uZ2V0KCJ2YWx1ZSIpIG9yIFtdKToNCiAgICAgICAgdXJsID0gX3N0cmlwX3RhZ3NfZnJvbV9naXRodWJfdXJsKHJlY29yZCkNCiAgICAgICAgdXJsX2hhc2ggPSBoYXNobGliLnNoYTI1Nih1cmwuZW5jb2RlKCkpDQogICAgICAgIA0KICAgICAgICBmb2xkZXIgPSBvcy5wYXRoLmpvaW4ocm9vdF9mb2xkZXIsIHVybF9oYXNoLmhleGRpZ2VzdCgpKQ0KICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZm9sZGVyKToNCiAgICAgICAgICAgICMgZG93bmxvYWQgYW5kIG1vdmUgdG8gYXZvaWQgcmVwZWF0ZWQgZmFpbHVyZXMgd2l0aCBwYXJ0aWFsIGRvd25sb2Fkcy91cGxvYWRzDQogICAgICAgICAgICBjaGVja19vdXRwdXQoWyIvdXNyL2xvY2FsL2Jpbi9jeWNsZWNsb3VkIiwgInByb2plY3QiLCAiZmV0Y2giLCB1cmwsIGZvbGRlciArICIudG1wIl0pDQogICAgICAgICAgICBjaGVja19vdXRwdXQoWyIvdXNyL2xvY2FsL2Jpbi9jeWNsZWNsb3VkIiwgInByb2plY3QiLCAidXBsb2FkIiwgbG9ja2VyXSwgY3dkPWZvbGRlciArICIudG1wIikNCiAgICAgICAgICAgIHNodXRpbC5tb3ZlKGZvbGRlciArICIudG1wIiwgZm9sZGVyKQ0KICAgICAgICAgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihmb2xkZXIsICJkb3dubG9hZC11cmwiKSwgInciKSBhcyBmdzoNCiAgICAgICAgICAgICAgICBmdy53cml0ZSh1cmwpDQogICAgICAgIHByb2pfaW5mb19yYXcgPSBjaGVja19vdXRwdXQoWyIvdXNyL2xvY2FsL2Jpbi9jeWNsZWNsb3VkIiwgInByb2plY3QiLCAiaW5mbyJdLCBjd2Q9Zm9sZGVyKS5kZWNvZGUoKQ0KICAgICAgICBwcm9qX2luZm8gPSB7fQ0KICAgICAgICBmb3IgbGluZSBpbiBwcm9qX2luZm9fcmF3LnNwbGl0bGluZXMoKToNCiAgICAgICAgICAgIGtleSwgcmVzdCA9IGxpbmUuc3BsaXQoIjoiLCAxKQ0KICAgICAgICAgICAgcHJval9pbmZvW2tleS5sb3dlcigpXSA9IHJlc3Quc3RyaXAoKQ0KICAgICAgICByZXQuYXBwZW5kKENsdXN0ZXJJbml0U3BlYyhwcm9qX2luZm9bIm5hbWUiXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJval9pbmZvWyJ2ZXJzaW9uIl0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZC5nZXQoInNwZWMiKSBvciAiZGVmYXVsdCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZFsidGFyZ2V0Il0pKQ0KICAgIHJldHVybiByZXQNCg0KDQpkZWYgX3N0cmlwX3RhZ3NfZnJvbV9naXRodWJfdXJsKHJlY29yZCk6DQogICAgdXJsID0gcmVjb3JkWyJnaXRIdWJSZWxlYXNlVVJMIl0NCiAgICBpZiAiL3RhZy8iIGluIHVybDoNCiAgICAgICAgcmV0dXJuIHVybC5yZXBsYWNlKCIvdGFnIiwgIiIpDQogICAgcmV0dXJuIHVybA0KDQoNCmRlZiBfdmVyc2lvbl9mcm9tX3VybChyZWNvcmQpOg0KICAgIGlmIHJlY29yZC5nZXQoInZlcnNpb24iKToNCiAgICAgICAgcmV0dXJuIHJlY29yZFsidmVyc2lvbiJdDQogICAgcmV0dXJuIHJlY29yZFsiZ2l0SHViUmVsZWFzZVVSTCJdLnNwbGl0KCIvIilbLTFdDQoNCg0KZGVmIHNldF9jbHVzdGVyX2luaXRfcGFyYW1zKHBhcmFtczogZGljdCwgc3BlY3M6IHR5cGluZy5MaXN0W0NsdXN0ZXJJbml0U3BlY10sIGNsdXN0ZXJfbmFtZTogc3RyLCB0YXJnZXRfcGFyYW1zOiBkaWN0KSAtPiBOb25lOg0KICAgIG9yZGVyID0gMTAwMDANCiAgICBmb3Igc3BlYyBpbiBzcGVjczoNCiAgICAgICAgZm9yIHRhcmdldCBpbiBzcGVjLnRhcmdldHM6DQogICAgICAgICAgICB0YXJnZXRfa2V5ID0gZiJ7dGFyZ2V0X3BhcmFtc1t0YXJnZXQubG93ZXIoKV19Ig0KICAgICAgICAgICAgaWYgbm90IHBhcmFtcy5nZXQodGFyZ2V0X2tleSk6DQogICAgICAgICAgICAgICAgcGFyYW1zW3RhcmdldF9rZXldID0ge30NCg0KICAgICAgICAgICAgcGFyYW1zW3RhcmdldF9rZXldW3NwZWMuY2x1c3Rlcl9pbml0X2tleV0gPSB7DQogICAgICAgICAgICAgICAgIk9yZGVyIjogb3JkZXIsDQogICAgICAgICAgICAgICAgIlNwZWMiOiBzcGVjLnNwZWMsDQogICAgICAgICAgICAgICAgIk5hbWUiOiBzcGVjLmNsdXN0ZXJfaW5pdF9rZXksDQogICAgICAgICAgICAgICAgIlByb2plY3QiOiBzcGVjLnByb2plY3QsDQogICAgICAgICAgICAgICAgIkxvY2tlciI6ICJhenVyZS1zdG9yYWdlIiwNCiAgICAgICAgICAgICAgICAiVmVyc2lvbiI6IHNwZWMudmVyc2lvbg0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgb3JkZXIgKz0gMTAwDQoNCg0KZGVmIG1haW4oKToNCiAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihkZXNjcmlwdGlvbj0iVE9ETyBSREgiKQ0KICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tbG9ja2VyIiwgZGVmYXVsdD0iYXp1cmUtc3RvcmFnZSIpDQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1jbHVzdGVyLWluaXQtd29ya2luZy1kaXIiLCBkZWZhdWx0PSJjbHVzdGVyLWluaXQiKQ0KICAgIHN1YnBhcnNlcnMgPSBwYXJzZXIuYWRkX3N1YnBhcnNlcnMoKQ0KICAgIGNjd19wYXJzZXIgPSBzdWJwYXJzZXJzLmFkZF9wYXJzZXIoInNsdXJtIikNCiAgICAjIFRPRE8gdGhpcyBuZWVkcyB0byBiZSBieSBjbHVzdGVyIHR5cGUNCiAgICB0YXJnZXRfcGFyYW1zID0gew0KICAgICAgICAibG9naW4iOiAiTG9naW5DbHVzdGVySW5pdFNwZWNzIiwNCiAgICAgICAgImdwdSI6ICJHUFVDbHVzdGVySW5pdFNwZWNzIiwNCiAgICAgICAgImhwYyI6ICJIUENDbHVzdGVySW5pdFNwZWNzIiwNCiAgICAgICAgImh0YyI6ICJIVENDbHVzdGVySW5pdFNwZWNzIiwNCiAgICAgICAgInNjaGVkdWxlciI6ICJTY2hlZHVsZXJDbHVzdGVySW5pdFNwZWNzIiwNCiAgICAgICAgImR5bmFtaWMiOiAiRHluYW1pY0NsdXN0ZXJJbml0U3BlY3MiLA0KICAgICAgICAib29kIjogIkNsdXN0ZXJJbml0U3BlY3MiDQogICAgfQ0KICAgIGNjd19wYXJzZXIuc2V0X2RlZmF1bHRzKGNsdXN0ZXJfdHlwZT0ic2x1cm0iLCB0YXJnZXRfcGFyYW1zPXRhcmdldF9wYXJhbXMpDQogICAgY2N3X3BhcnNlci5hZGRfYXJndW1lbnQoIi0tZGJQYXNzd29yZCIsIGRlc3Q9ImRiUGFzc3dvcmQiLCBkZWZhdWx0PSIiLCBoZWxwPSJNeVNRTCBkYXRhYmFzZSBwYXNzd29yZCIpDQogICAgDQogICAgb29kX3BhcnNlciA9IHN1YnBhcnNlcnMuYWRkX3BhcnNlcigib29kIikNCiAgICBvb2RfcGFyc2VyLnNldF9kZWZhdWx0cyhjbHVzdGVyX3R5cGU9Im9vZCIsIHRhcmdldF9wYXJhbXM9dGFyZ2V0X3BhcmFtcykNCiAgICANCiAgICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQ0KDQogICAgaWYgYXJncy5jbHVzdGVyX3R5cGUgPT0gInNsdXJtIjoNCiAgICAgICAgb3V0cHV0X3BhcmFtcyA9IGdldF9qc29uX2RpY3QoJ2luaXRpYWxfcGFyYW1zLmpzb24nKQ0KICAgIGVsc2U6DQogICAgICAgIG91dHB1dF9wYXJhbXMgPSB7fQ0KICAgIGNjd19vdXRwdXRzID0gZ2V0X2pzb25fZGljdCgnY2N3T3V0cHV0cy5qc29uJykNCg0KICAgIHNwZWNzID0gZG93bmxvYWRfY2x1c3Rlcl9pbml0KGNjd19vdXRwdXRzLCBvcy5wYXRoLmpvaW4ob3MuZ2V0Y3dkKCksIGFyZ3MuY2x1c3Rlcl9pbml0X3dvcmtpbmdfZGlyKSwgYXJncy5sb2NrZXIpDQogICAgc2V0X2NsdXN0ZXJfaW5pdF9wYXJhbXMob3V0cHV0X3BhcmFtcywgc3BlY3MsIGFyZ3MuY2x1c3Rlcl90eXBlLCBhcmdzLnRhcmdldF9wYXJhbXMpDQogICAgaWYgYXJncy5jbHVzdGVyX3R5cGUgPT0gInNsdXJtIjoNCiAgICAgICAgc2V0X3NsdXJtX3BhcmFtcyhvdXRwdXRfcGFyYW1zLCBhcmdzLmRiUGFzc3dvcmQsIGNjd19vdXRwdXRzKQ0KICAgIGVsc2U6DQogICAgICAgIHNldF9vb2RfcGFyYW1zKG91dHB1dF9wYXJhbXMsIGNjd19vdXRwdXRzKQ0KICAgIHByaW50KGpzb24uZHVtcHMob3V0cHV0X3BhcmFtcywgaW5kZW50PTQpKQ0KDQoNCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6DQogICAgbWFpbigp \ No newline at end of file +IyEvdXNyL2Jpbi9lbnYgcHl0aG9uDQoNCmltcG9ydCBhcmdwYXJzZQ0KaW1wb3J0IGhhc2hsaWINCmltcG9ydCBqc29uDQppbXBvcnQgb3MNCmltcG9ydCBzaHV0aWwNCmZyb20gc3VicHJvY2VzcyBpbXBvcnQgY2hlY2tfb3V0cHV0DQppbXBvcnQgc3lzDQppbXBvcnQgdHlwaW5nDQoNCg0KZGVmIGdldF9qc29uX2RpY3QoZmlsZV9uYW1lKToNCiAgICBhYnNfcGF0aCA9IG9zLnBhdGguYWJzcGF0aChmaWxlX25hbWUpDQogICAgd2l0aCBvcGVuKGFic19wYXRoKSBhcyBmcjoNCiAgICAgICAgcmV0dXJuIGpzb24ubG9hZChmcikNCg0KDQpkZWYgc2V0X3NsdXJtX3BhcmFtcyhwYXJhbXMsIGRiUGFzc3dvcmQsIG91dHB1dHMpOg0KICAgIHBhcmFtc1snUmVnaW9uJ10gPSBvdXRwdXRzWydsb2NhdGlvbiddWyd2YWx1ZSddDQogICAgaWYgb3V0cHV0c1sndm5ldCddWyd2YWx1ZSddWyd0eXBlJ10gPT0gJ25ldyc6DQogICAgICAgIHN1Ym5ldElEID0gb3V0cHV0c1sndm5ldCddWyd2YWx1ZSddWydjb21wdXRlU3VibmV0SWQnXQ0KICAgICAgICBzdWJuZXRfdG9rcyA9IHN1Ym5ldElELnNwbGl0KCIvIikNCiAgICAgICAgaWYgbGVuKHN1Ym5ldF90b2tzKSA+PSAxMToNCiAgICAgICAgICAgIHBhcmFtc1snU3VibmV0SWQnXSA9ICIvIi5qb2luKFtzdWJuZXRfdG9rc1s0XSwgc3VibmV0X3Rva3NbOF0sIHN1Ym5ldF90b2tzWzEwXV0pDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBwcmludChmIlVuZXhwZWN0ZWQgc3VibmV0IGlkIHtzdWJuZXRJRH0gLSBwYXNzaW5nIGFzIFN1Ym5ldElkIGRpcmVjdGx5IGluc3RlYWQgb2YgcmVzb3VyY2VfZ3JvdXAvdm5ldF9uYW1lL3N1Ym5ldF9uYW1lIiwgZmlsZT1zeXMuc3RkZXJyKQ0KICAgICAgICAgICAgcGFyYW1zWydTdWJuZXRJZCddID0gc3VibmV0SUQNCiAgICBlbHNlOg0KICAgICAgICBwYXJhbXNbJ1N1Ym5ldElkJ10gPSAnLycuam9pbihbb3V0cHV0c1sndm5ldCddWyd2YWx1ZSddWydyZyddLCBvdXRwdXRzWyd2bmV0J11bJ3ZhbHVlJ11bJ25hbWUnXSwgb3V0cHV0c1sndm5ldCddWyd2YWx1ZSddWydjb21wdXRlU3VibmV0TmFtZSddXSkNCiAgICAgICAgDQogICAgIyBEZWZpbmUgQXZhaWxhYmlsaXR5IFpvbmUNCiAgICBwYXJhbXNbJ0RlZmluZU5vZGVzQXZhaWxhYmlsaXR5Wm9uZSddID0gYW55KCdhdmFpbGFiaWxpdHlab25lJyBpbiB6b25lTGlzdCBmb3Igem9uZUxpc3QgaW4gW291dHB1dHNbJ3BhcnRpdGlvbnMnXVsndmFsdWUnXVsnaHRjJ10sIG91dHB1dHNbJ3BhcnRpdGlvbnMnXVsndmFsdWUnXVsnaHBjJ10sIG91dHB1dHNbJ3BhcnRpdGlvbnMnXVsndmFsdWUnXVsnZ3B1J11dKQ0KICAgIA0KICAgICNIVEMNCiAgICBwYXJhbXNbJ0hUQ01hY2hpbmVUeXBlJ10gPSBvdXRwdXRzWydwYXJ0aXRpb25zJ11bJ3ZhbHVlJ11bJ2h0YyddWydza3UnXQ0KICAgIHBhcmFtc1snTWF4SFRDRXhlY3V0ZU5vZGVDb3VudCddID0gaW50KG91dHB1dHNbJ3BhcnRpdGlvbnMnXVsndmFsdWUnXVsnaHRjJ11bJ21heE5vZGVzJ10pDQogICAgcGFyYW1zWydIVENJbWFnZU5hbWUnXSA9IG91dHB1dHNbJ3BhcnRpdGlvbnMnXVsndmFsdWUnXVsnaHRjJ11bJ29zSW1hZ2UnXQ0KICAgIHBhcmFtc1snSFRDVXNlTG93UHJpbyddID0gb3V0cHV0c1sncGFydGl0aW9ucyddWyd2YWx1ZSddWydodGMnXVsndXNlU3BvdCddDQogICAgcGFyYW1zWydIVENBdmFpbGFiaWxpdHlab25lJ10gPSBvdXRwdXRzWydwYXJ0aXRpb25zJ11bJ3ZhbHVlJ11bJ2h0YyddWydhdmFpbGFiaWxpdHlab25lJ10gaWYgcGFyYW1zWydEZWZpbmVOb2Rlc0F2YWlsYWJpbGl0eVpvbmUnXSBhbmQgJ2F2YWlsYWJpbGl0eVpvbmUnIGluIG91dHB1dHNbJ3BhcnRpdGlvbnMnXVsndmFsdWUnXVsnaHRjJ10gZWxzZSBOb25lDQogICAgDQogICAgI0hQQw0KICAgIHBhcmFtc1snSFBDTWFjaGluZVR5cGUnXSA9IG91dHB1dHNbJ3BhcnRpdGlvbnMnXVsndmFsdWUnXVsnaHBjJ11bJ3NrdSddDQogICAgcGFyYW1zWydNYXhIUENFeGVjdXRlTm9kZUNvdW50J10gPSBpbnQob3V0cHV0c1sncGFydGl0aW9ucyddWyd2YWx1ZSddWydocGMnXVsnbWF4Tm9kZXMnXSkNCiAgICBwYXJhbXNbJ0hQQ0ltYWdlTmFtZSddID0gb3V0cHV0c1sncGFydGl0aW9ucyddWyd2YWx1ZSddWydocGMnXVsnb3NJbWFnZSddDQogICAgcGFyYW1zWydIUENBdmFpbGFiaWxpdHlab25lJ10gPSBvdXRwdXRzWydwYXJ0aXRpb25zJ11bJ3ZhbHVlJ11bJ2hwYyddWydhdmFpbGFiaWxpdHlab25lJ10gaWYgcGFyYW1zWydEZWZpbmVOb2Rlc0F2YWlsYWJpbGl0eVpvbmUnXSBhbmQgJ2F2YWlsYWJpbGl0eVpvbmUnIGluIG91dHB1dHNbJ3BhcnRpdGlvbnMnXVsndmFsdWUnXVsnaHBjJ10gZWxzZSBOb25lDQoNCiAgICAjR1BVDQogICAgcGFyYW1zWydHUFVNYWNoaW5lVHlwZSddID0gb3V0cHV0c1sncGFydGl0aW9ucyddWyd2YWx1ZSddWydncHUnXVsnc2t1J10NCiAgICBwYXJhbXNbJ01heEdQVUV4ZWN1dGVOb2RlQ291bnQnXSA9IGludChvdXRwdXRzWydwYXJ0aXRpb25zJ11bJ3ZhbHVlJ11bJ2dwdSddWydtYXhOb2RlcyddKQ0KICAgIHBhcmFtc1snR1BVSW1hZ2VOYW1lJ10gPSBvdXRwdXRzWydwYXJ0aXRpb25zJ11bJ3ZhbHVlJ11bJ2dwdSddWydvc0ltYWdlJ10NCiAgICBwYXJhbXNbJ0dQVUF2YWlsYWJpbGl0eVpvbmUnXSA9IG91dHB1dHNbJ3BhcnRpdGlvbnMnXVsndmFsdWUnXVsnZ3B1J11bJ2F2YWlsYWJpbGl0eVpvbmUnXSBpZiBwYXJhbXNbJ0RlZmluZU5vZGVzQXZhaWxhYmlsaXR5Wm9uZSddIGFuZCAnYXZhaWxhYmlsaXR5Wm9uZScgaW4gb3V0cHV0c1sncGFydGl0aW9ucyddWyd2YWx1ZSddWydncHUnXSBlbHNlIE5vbmUNCg0KICAgICNzY2hlZHVsZXIgbm9kZQ0KICAgICNwYXJhbXNbJ3NsdXJtJ10gI2lzIHRoaXMgdGhlIHNsdXJtIHZlcnNpb24/Pz8gbm8sIHNvIHdoYXQgaXMgaXQ/DQogICAgcGFyYW1zWydTY2hlZHVsZXJNYWNoaW5lVHlwZSddID0gb3V0cHV0c1snc2NoZWR1bGVyTm9kZSddWyd2YWx1ZSddWydza3UnXQ0KICAgIHBhcmFtc1snU2NoZWR1bGVySW1hZ2VOYW1lJ10gPSBvdXRwdXRzWydzY2hlZHVsZXJOb2RlJ11bJ3ZhbHVlJ11bJ29zSW1hZ2UnXQ0KICAgIHBhcmFtc1snY29uZmlndXJhdGlvbl9zbHVybV92ZXJzaW9uJ10gPSBvdXRwdXRzWydzbHVybVNldHRpbmdzJ11bJ3ZhbHVlJ11bJ3ZlcnNpb24nXQ0KICAgICMgaWYgb3V0cHV0c1snc2x1cm1TZXR0aW5ncyddWyd2YWx1ZSddWydjYW5Vc2VTbHVybUhBJ106DQogICAgIyAgICAgcGFyYW1zWydjb25maWd1cmF0aW9uX3NsdXJtX2hhX2VuYWJsZWQnXSA9IG91dHB1dHNbJ3NsdXJtU2V0dGluZ3MnXVsndmFsdWUnXVsnc2x1cm1IQSddDQogICAgcGFyYW1zWydjb25maWd1cmF0aW9uX3NsdXJtX2FjY291bnRpbmdfZW5hYmxlZCddID0gYm9vbChvdXRwdXRzWydkYXRhYmFzZUluZm8nXVsndmFsdWUnXSkNCiAgICBpZiBwYXJhbXNbJ2NvbmZpZ3VyYXRpb25fc2x1cm1fYWNjb3VudGluZ19lbmFibGVkJ106DQogICAgICAgIHBhcmFtc1snY29uZmlndXJhdGlvbl9zbHVybV9hY2NvdW50aW5nX3VzZXInXSA9IG91dHB1dHNbJ2RhdGFiYXNlSW5mbyddWyd2YWx1ZSddWydkYXRhYmFzZVVzZXInXQ0KICAgIGlmIHBhcmFtc1snY29uZmlndXJhdGlvbl9zbHVybV9hY2NvdW50aW5nX2VuYWJsZWQnXToNCiAgICAgICAgcGFyYW1zWydjb25maWd1cmF0aW9uX3NsdXJtX2FjY291bnRpbmdfcGFzc3dvcmQnXSA9IGRiUGFzc3dvcmQNCiAgICBpZiBwYXJhbXNbJ2NvbmZpZ3VyYXRpb25fc2x1cm1fYWNjb3VudGluZ19lbmFibGVkJ106DQogICAgICAgIHBhcmFtc1snY29uZmlndXJhdGlvbl9zbHVybV9hY2NvdW50aW5nX3VybCddID0gb3V0cHV0c1snZGF0YWJhc2VJbmZvJ11bJ3ZhbHVlJ11bJ3VybCddDQogICAgI3BhcmFtc1snY29uZmlndXJhdGlvbl9zbHVybV9hY2NvdW50aW5nX2NlcnRpZmljYXRlX3VybCddDQoNCiAgICAjbG9naW4gbm9kZShzKQ0KICAgIHBhcmFtc1snbG9naW5NYWNoaW5lVHlwZSddID0gKG91dHB1dHNbJ2xvZ2luTm9kZXMnXVsndmFsdWUnXVsnc2t1J10pLnN0cmlwKCkNCiAgICBwYXJhbXNbJ051bWJlckxvZ2luTm9kZXMnXSA9IGludChvdXRwdXRzWydsb2dpbk5vZGVzJ11bJ3ZhbHVlJ11bJ2luaXRpYWxOb2RlcyddKQ0KICAgIHBhcmFtc1snTWF4TG9naW5Ob2RlQ291bnQnXSA9IGludChvdXRwdXRzWydsb2dpbk5vZGVzJ11bJ3ZhbHVlJ11bJ21heE5vZGVzJ10pDQogICAgcGFyYW1zWydMb2dpbkltYWdlTmFtZSddID0gb3V0cHV0c1snbG9naW5Ob2RlcyddWyd2YWx1ZSddWydvc0ltYWdlJ10NCiAgICBwYXJhbXNbJ0VuYWJsZU5vZGVIZWFsdGhDaGVja3MnXSA9IG91dHB1dHNbJ3NsdXJtU2V0dGluZ3MnXVsndmFsdWUnXVsnaGVhbHRoQ2hlY2tFbmFibGVkJ10NCg0KICAgICNFeGVjdXRlIG5vZGUgdGFncw0KICAgIHBhcmFtc1snTm9kZVRhZ3MnXSA9IG91dHB1dHNbJ25vZGVBcnJheVRhZ3MnXVsndmFsdWUnXQ0KDQogICAgI05ldHdvcmsgQXR0YWNoZWQgU3RvcmFnZQ0KICAgIHBhcmFtc1snVXNlQnVpbHRpblNoYXJlZCddID0gb3V0cHV0c1snZmlsZXJJbmZvRmluYWwnXVsndmFsdWUnXVsnaG9tZSddWyd0eXBlJ10gPT0gJ25mcy1uZXcnIA0KICAgIGlmIHBhcmFtc1snVXNlQnVpbHRpblNoYXJlZCddOg0KICAgICAgICBwYXJhbXNbJ0ZpbGVzeXN0ZW1TaXplJ10gPSBvdXRwdXRzWydmaWxlckluZm9GaW5hbCddWyd2YWx1ZSddWydob21lJ11bJ25mc0NhcGFjaXR5SW5HYiddDQogICAgZWxzZToNCiAgICAgICAgcGFyYW1zWydORlNUeXBlJ10gPSAnbmZzJyBpZiBvdXRwdXRzWydmaWxlckluZm9GaW5hbCddWyd2YWx1ZSddWydob21lJ11bJ3R5cGUnXSBpbiBbJ25mcy1leGlzdGluZycsJ2FuZi1uZXcnXSBlbHNlICdsdXN0cmUnDQogICAgICAgICMgV2Ugbm8gbG9uZ2VyIG5lZWQgdG8gaGFuZGxlIHRoZXNlIGRpZmZlcmVudGx5IGJhc2VkIG9uIHRoZSBmcyB0eXBlLCBhcyBlYWNoDQogICAgICAgICMgZnMgbW9kdWxlJ3MgY29tbW9uIG91dHB1dHMgbWFwIHRvIHRoZXNlLg0KICAgICAgICBwYXJhbXNbJ05GU1NoYXJlZEV4cG9ydFBhdGgnXSA9IG91dHB1dHNbJ2ZpbGVySW5mb0ZpbmFsJ11bJ3ZhbHVlJ11bJ2hvbWUnXVsnZXhwb3J0UGF0aCddDQogICAgICAgIHBhcmFtc1snTkZTU2hhcmVkTW91bnRPcHRpb25zJ10gPSBvdXRwdXRzWydmaWxlckluZm9GaW5hbCddWyd2YWx1ZSddWydob21lJ11bJ21vdW50T3B0aW9ucyddDQogICAgICAgIHBhcmFtc1snTkZTQWRkcmVzcyddID0gb3V0cHV0c1snZmlsZXJJbmZvRmluYWwnXVsndmFsdWUnXVsnaG9tZSddWydpcEFkZHJlc3MnXQ0KDQogICAgcGFyYW1zWydBZGRpdGlvbmFsTkZTJ10gPSBvdXRwdXRzWydmaWxlckluZm9GaW5hbCddWyd2YWx1ZSddWydhZGRpdGlvbmFsJ11bJ3R5cGUnXSAhPSAnZGlzYWJsZWQnDQogICAgaWYgcGFyYW1zWydBZGRpdGlvbmFsTkZTJ106DQogICAgICAgIHBhcmFtc1snQWRkaXRpb25hbE5GU1R5cGUnXSA9ICduZnMnIGlmIG91dHB1dHNbJ2ZpbGVySW5mb0ZpbmFsJ11bJ3ZhbHVlJ11bJ2FkZGl0aW9uYWwnXVsndHlwZSddIGluIFsnbmZzLWV4aXN0aW5nJywnYW5mLW5ldyddIGVsc2UgJ2x1c3RyZScNCiAgICAgICAgcGFyYW1zWydBZGRpdGlvbmFsTkZTTW91bnRQb2ludCddID0gb3V0cHV0c1snZmlsZXJJbmZvRmluYWwnXVsndmFsdWUnXVsnYWRkaXRpb25hbCddWydtb3VudFBhdGgnXQ0KICAgICAgICBwYXJhbXNbJ0FkZGl0aW9uYWxORlNFeHBvcnRQYXRoJ10gPSBvdXRwdXRzWydmaWxlckluZm9GaW5hbCddWyd2YWx1ZSddWydhZGRpdGlvbmFsJ11bJ2V4cG9ydFBhdGgnXQ0KICAgICAgICBwYXJhbXNbJ0FkZGl0aW9uYWxORlNNb3VudE9wdGlvbnMnXSA9IG91dHB1dHNbJ2ZpbGVySW5mb0ZpbmFsJ11bJ3ZhbHVlJ11bJ2FkZGl0aW9uYWwnXVsnbW91bnRPcHRpb25zJ10NCiAgICAgICAgcGFyYW1zWydBZGRpdGlvbmFsTkZTQWRkcmVzcyddID0gb3V0cHV0c1snZmlsZXJJbmZvRmluYWwnXVsndmFsdWUnXVsnYWRkaXRpb25hbCddWydpcEFkZHJlc3MnXQ0KICAgIA0KICAgICMgTW9uaXRvcmluZw0KICAgIHBhcmFtc1snY29uZmlndXJhdGlvbl9tb25pdG9yaW5nX2VuYWJsZWQnXSA9IG91dHB1dHNbJ21vbml0b3JpbmcnXVsndmFsdWUnXVsnZW5hYmxlZCddDQogICAgcGFyYW1zWydjb25maWd1cmF0aW9uX2lkZW50aXR5X2NsaWVudF9pZCddID0gb3V0cHV0c1snbW9uaXRvcmluZyddWyd2YWx1ZSddWydtYW5hZ2VkSWRlbnRpdHlDbGllbnRJZCddIGlmIHBhcmFtc1snY29uZmlndXJhdGlvbl9tb25pdG9yaW5nX2VuYWJsZWQnXSBlbHNlIE5vbmUNCiAgICBwYXJhbXNbJ2NvbmZpZ3VyYXRpb25faW5nZXN0aW9uX2VuZHBvaW50J10gPSBvdXRwdXRzWydtb25pdG9yaW5nJ11bJ3ZhbHVlJ11bJ2luZ2VzdGlvbkVuZHBvaW50J10gaWYgcGFyYW1zWydjb25maWd1cmF0aW9uX21vbml0b3JpbmdfZW5hYmxlZCddIGVsc2UgTm9uZQ0KDQoNCmRlZiBzZXRfb29kX3BhcmFtcyhwYXJhbXMsIG91dHB1dHMpOg0KICAgIHNsdXJtX3BhcmFtcyA9IGdldF9qc29uX2RpY3QoJ2luaXRpYWxfcGFyYW1zLmpzb24nKQ0KICAgICMgV2Ugd2FudCB0byBlc3NlbnRpYWxseSBpbmhlcml0IGNlcnRhaW4gc2V0dGluZ3MgZnJvbSB0aGUgc2x1cm0gY2x1c3Rlci4NCiAgICBzZXRfc2x1cm1fcGFyYW1zKHNsdXJtX3BhcmFtcywgIiIsIG91dHB1dHMpDQogICAgcGFyYW1zWydORlNBZGRyZXNzJ10gPSBzbHVybV9wYXJhbXMuZ2V0KCdORlNBZGRyZXNzJykgb3IgJ2Njdy1zY2hlZHVsZXInDQogICAgcGFyYW1zWydORlNTaGFyZWRFeHBvcnRQYXRoJ10gPSBzbHVybV9wYXJhbXMuZ2V0KCdORlNTaGFyZWRFeHBvcnRQYXRoJykgb3IgJy9zaGFyZWQnDQogICAgcGFyYW1zWydORlNTaGFyZWRNb3VudE9wdGlvbnMnXSA9IHNsdXJtX3BhcmFtcy5nZXQoJ05GU1NoYXJlZE1vdW50T3B0aW9ucycpDQogICAgcGFyYW1zWydTdWJuZXRJZCddID0gc2x1cm1fcGFyYW1zWyJTdWJuZXRJZCJdDQogICAgcGFyYW1zWydSZWdpb24nXSA9IHNsdXJtX3BhcmFtc1snUmVnaW9uJ10NCiAgICBwYXJhbXNbJ0NyZWRlbnRpYWxzJ10gPSBzbHVybV9wYXJhbXNbJ0NyZWRlbnRpYWxzJ10NCg0KICAgIHBhcmFtc1snTWFjaGluZVR5cGUnXSA9IG91dHB1dHNbJ29vZCddWyd2YWx1ZSddLmdldCgnc2t1JykNCiAgICBwYXJhbXNbJ01hbmFnZWRJZGVudGl0eSddID0gb3V0cHV0c1snb29kJ11bJ3ZhbHVlJ10uZ2V0KCdtYW5hZ2VkSWRlbnRpdHknKQ0KICAgIHBhcmFtc1snQm9vdERpc2tTaXplJ10gPSBvdXRwdXRzWydvb2QnXVsndmFsdWUnXS5nZXQoJ0Jvb3REaXNrU2l6ZScpDQogICAgcGFyYW1zWydJbWFnZU5hbWUnXSA9IG91dHB1dHNbJ29vZCddWyd2YWx1ZSddLmdldCgnb3NJbWFnZScpDQoNCiAgICBwYXJhbXNbJ29vZF9zZXJ2ZXJfbmFtZSddID0gb3V0cHV0c1snb29kJ11bJ3ZhbHVlJ10uZ2V0KCdmcWRuJywnJykNCiAgICBwYXJhbXNbJ29vZF9lbnRyYV91c2VyX21hcF9tYXRjaCddID0gb3V0cHV0c1snb29kJ11bJ3ZhbHVlJ10uZ2V0KCd1c2VyRG9tYWluJykNCiAgICBwYXJhbXNbJ29vZF9lbnRyYV9jbGllbnRfaWQnXSA9IG91dHB1dHNbJ29vZCddWyd2YWx1ZSddLmdldCgnY2xpZW50SWQnKQ0KICAgIHBhcmFtc1snb29kX2VudHJhX3RlbmFudF9pZCddID0gb3V0cHV0c1snb29kJ11bJ3ZhbHVlJ10uZ2V0KCd0ZW5hbnRJZCcpDQogICAgcGFyYW1zWydvb2RfbmljJ10gPSBvdXRwdXRzWydvb2QnXVsndmFsdWUnXS5nZXQoJ25pYycpDQoNCiAgICBwYXJhbXNbJ05vZGVUYWdzJ10gPSBzbHVybV9wYXJhbXNbJ05vZGVUYWdzJ10NCg0KY2xhc3MgQ2x1c3RlckluaXRTcGVjOg0KICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm9qZWN0OiBzdHIsIHZlcnNpb246IHN0ciwgc3BlYzogc3RyLCB0YXJnZXRzOiB0eXBpbmcuTGlzdFtzdHJdKToNCiAgICAgICAgc2VsZi5wcm9qZWN0ID0gcHJvamVjdA0KICAgICAgICBzZWxmLnZlcnNpb24gPSB2ZXJzaW9uDQogICAgICAgIHNlbGYuc3BlYyA9IHNwZWMNCiAgICAgICAgc2VsZi50YXJnZXRzID0gdGFyZ2V0cw0KICAgICAgICBzZWxmLmNsdXN0ZXJfaW5pdF9rZXkgPSBmIntzZWxmLnByb2plY3R9OntzZWxmLnNwZWN9OntzZWxmLnZlcnNpb259Ig0KDQoNCmRlZiBkb3dubG9hZF9jbHVzdGVyX2luaXQob3V0cHV0cywgcm9vdF9mb2xkZXIsIGxvY2tlcikgLT4gdHlwaW5nLkxpc3RbQ2x1c3RlckluaXRTcGVjXToNCiAgICByZXQgPSBbXQ0KICAgIGZvciByZWNvcmQgaW4gKG91dHB1dHNbJ2NsdXN0ZXJJbml0U3BlY3MnXS5nZXQoInZhbHVlIikgb3IgW10pOg0KICAgICAgICB1cmwgPSBfc3RyaXBfdGFnc19mcm9tX2dpdGh1Yl91cmwocmVjb3JkKQ0KICAgICAgICB1cmxfaGFzaCA9IGhhc2hsaWIuc2hhMjU2KHVybC5lbmNvZGUoKSkNCiAgICAgICAgDQogICAgICAgIGZvbGRlciA9IG9zLnBhdGguam9pbihyb290X2ZvbGRlciwgdXJsX2hhc2guaGV4ZGlnZXN0KCkpDQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhmb2xkZXIpOg0KICAgICAgICAgICAgIyBkb3dubG9hZCBhbmQgbW92ZSB0byBhdm9pZCByZXBlYXRlZCBmYWlsdXJlcyB3aXRoIHBhcnRpYWwgZG93bmxvYWRzL3VwbG9hZHMNCiAgICAgICAgICAgIGNoZWNrX291dHB1dChbIi91c3IvbG9jYWwvYmluL2N5Y2xlY2xvdWQiLCAicHJvamVjdCIsICJmZXRjaCIsIHVybCwgZm9sZGVyICsgIi50bXAiXSkNCiAgICAgICAgICAgIGNoZWNrX291dHB1dChbIi91c3IvbG9jYWwvYmluL2N5Y2xlY2xvdWQiLCAicHJvamVjdCIsICJ1cGxvYWQiLCBsb2NrZXJdLCBjd2Q9Zm9sZGVyICsgIi50bXAiKQ0KICAgICAgICAgICAgc2h1dGlsLm1vdmUoZm9sZGVyICsgIi50bXAiLCBmb2xkZXIpDQogICAgICAgICAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKGZvbGRlciwgImRvd25sb2FkLXVybCIpLCAidyIpIGFzIGZ3Og0KICAgICAgICAgICAgICAgIGZ3LndyaXRlKHVybCkNCiAgICAgICAgcHJval9pbmZvX3JhdyA9IGNoZWNrX291dHB1dChbIi91c3IvbG9jYWwvYmluL2N5Y2xlY2xvdWQiLCAicHJvamVjdCIsICJpbmZvIl0sIGN3ZD1mb2xkZXIpLmRlY29kZSgpDQogICAgICAgIHByb2pfaW5mbyA9IHt9DQogICAgICAgIGZvciBsaW5lIGluIHByb2pfaW5mb19yYXcuc3BsaXRsaW5lcygpOg0KICAgICAgICAgICAga2V5LCByZXN0ID0gbGluZS5zcGxpdCgiOiIsIDEpDQogICAgICAgICAgICBwcm9qX2luZm9ba2V5Lmxvd2VyKCldID0gcmVzdC5zdHJpcCgpDQogICAgICAgIHJldC5hcHBlbmQoQ2x1c3RlckluaXRTcGVjKHByb2pfaW5mb1sibmFtZSJdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qX2luZm9bInZlcnNpb24iXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkLmdldCgic3BlYyIpIG9yICJkZWZhdWx0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkWyJ0YXJnZXQiXSkpDQogICAgcmV0dXJuIHJldA0KDQoNCmRlZiBfc3RyaXBfdGFnc19mcm9tX2dpdGh1Yl91cmwocmVjb3JkKToNCiAgICB1cmwgPSByZWNvcmRbImdpdEh1YlJlbGVhc2VVUkwiXQ0KICAgIGlmICIvdGFnLyIgaW4gdXJsOg0KICAgICAgICByZXR1cm4gdXJsLnJlcGxhY2UoIi90YWciLCAiIikNCiAgICByZXR1cm4gdXJsDQoNCg0KZGVmIF92ZXJzaW9uX2Zyb21fdXJsKHJlY29yZCk6DQogICAgaWYgcmVjb3JkLmdldCgidmVyc2lvbiIpOg0KICAgICAgICByZXR1cm4gcmVjb3JkWyJ2ZXJzaW9uIl0NCiAgICByZXR1cm4gcmVjb3JkWyJnaXRIdWJSZWxlYXNlVVJMIl0uc3BsaXQoIi8iKVstMV0NCg0KDQpkZWYgc2V0X2NsdXN0ZXJfaW5pdF9wYXJhbXMocGFyYW1zOiBkaWN0LCBzcGVjczogdHlwaW5nLkxpc3RbQ2x1c3RlckluaXRTcGVjXSwgY2x1c3Rlcl9uYW1lOiBzdHIsIHRhcmdldF9wYXJhbXM6IGRpY3QpIC0+IE5vbmU6DQogICAgb3JkZXIgPSAxMDAwMA0KICAgIGZvciBzcGVjIGluIHNwZWNzOg0KICAgICAgICBmb3IgdGFyZ2V0IGluIHNwZWMudGFyZ2V0czoNCiAgICAgICAgICAgIHRhcmdldF9rZXkgPSBmInt0YXJnZXRfcGFyYW1zW3RhcmdldC5sb3dlcigpXX0iDQogICAgICAgICAgICBpZiBub3QgcGFyYW1zLmdldCh0YXJnZXRfa2V5KToNCiAgICAgICAgICAgICAgICBwYXJhbXNbdGFyZ2V0X2tleV0gPSB7fQ0KDQogICAgICAgICAgICBwYXJhbXNbdGFyZ2V0X2tleV1bc3BlYy5jbHVzdGVyX2luaXRfa2V5XSA9IHsNCiAgICAgICAgICAgICAgICAiT3JkZXIiOiBvcmRlciwNCiAgICAgICAgICAgICAgICAiU3BlYyI6IHNwZWMuc3BlYywNCiAgICAgICAgICAgICAgICAiTmFtZSI6IHNwZWMuY2x1c3Rlcl9pbml0X2tleSwNCiAgICAgICAgICAgICAgICAiUHJvamVjdCI6IHNwZWMucHJvamVjdCwNCiAgICAgICAgICAgICAgICAiTG9ja2VyIjogImF6dXJlLXN0b3JhZ2UiLA0KICAgICAgICAgICAgICAgICJWZXJzaW9uIjogc3BlYy52ZXJzaW9uDQogICAgICAgICAgICB9DQogICAgICAgICAgICBvcmRlciArPSAxMDANCg0KDQpkZWYgbWFpbigpOg0KICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKGRlc2NyaXB0aW9uPSJUT0RPIFJESCIpDQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1sb2NrZXIiLCBkZWZhdWx0PSJhenVyZS1zdG9yYWdlIikNCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLWNsdXN0ZXItaW5pdC13b3JraW5nLWRpciIsIGRlZmF1bHQ9ImNsdXN0ZXItaW5pdCIpDQogICAgc3VicGFyc2VycyA9IHBhcnNlci5hZGRfc3VicGFyc2VycygpDQogICAgY2N3X3BhcnNlciA9IHN1YnBhcnNlcnMuYWRkX3BhcnNlcigic2x1cm0iKQ0KICAgICMgVE9ETyB0aGlzIG5lZWRzIHRvIGJlIGJ5IGNsdXN0ZXIgdHlwZQ0KICAgIHRhcmdldF9wYXJhbXMgPSB7DQogICAgICAgICJsb2dpbiI6ICJMb2dpbkNsdXN0ZXJJbml0U3BlY3MiLA0KICAgICAgICAiZ3B1IjogIkdQVUNsdXN0ZXJJbml0U3BlY3MiLA0KICAgICAgICAiaHBjIjogIkhQQ0NsdXN0ZXJJbml0U3BlY3MiLA0KICAgICAgICAiaHRjIjogIkhUQ0NsdXN0ZXJJbml0U3BlY3MiLA0KICAgICAgICAic2NoZWR1bGVyIjogIlNjaGVkdWxlckNsdXN0ZXJJbml0U3BlY3MiLA0KICAgICAgICAiZHluYW1pYyI6ICJEeW5hbWljQ2x1c3RlckluaXRTcGVjcyIsDQogICAgICAgICJvb2QiOiAiQ2x1c3RlckluaXRTcGVjcyINCiAgICB9DQogICAgY2N3X3BhcnNlci5zZXRfZGVmYXVsdHMoY2x1c3Rlcl90eXBlPSJzbHVybSIsIHRhcmdldF9wYXJhbXM9dGFyZ2V0X3BhcmFtcykNCiAgICBjY3dfcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1kYlBhc3N3b3JkIiwgZGVzdD0iZGJQYXNzd29yZCIsIGRlZmF1bHQ9IiIsIGhlbHA9Ik15U1FMIGRhdGFiYXNlIHBhc3N3b3JkIikNCiAgICANCiAgICBvb2RfcGFyc2VyID0gc3VicGFyc2Vycy5hZGRfcGFyc2VyKCJvb2QiKQ0KICAgIG9vZF9wYXJzZXIuc2V0X2RlZmF1bHRzKGNsdXN0ZXJfdHlwZT0ib29kIiwgdGFyZ2V0X3BhcmFtcz10YXJnZXRfcGFyYW1zKQ0KICAgIA0KICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpDQoNCiAgICBpZiBhcmdzLmNsdXN0ZXJfdHlwZSA9PSAic2x1cm0iOg0KICAgICAgICBvdXRwdXRfcGFyYW1zID0gZ2V0X2pzb25fZGljdCgnaW5pdGlhbF9wYXJhbXMuanNvbicpDQogICAgZWxzZToNCiAgICAgICAgb3V0cHV0X3BhcmFtcyA9IHt9DQogICAgY2N3X291dHB1dHMgPSBnZXRfanNvbl9kaWN0KCdjY3dPdXRwdXRzLmpzb24nKQ0KDQogICAgc3BlY3MgPSBkb3dubG9hZF9jbHVzdGVyX2luaXQoY2N3X291dHB1dHMsIG9zLnBhdGguam9pbihvcy5nZXRjd2QoKSwgYXJncy5jbHVzdGVyX2luaXRfd29ya2luZ19kaXIpLCBhcmdzLmxvY2tlcikNCiAgICBzZXRfY2x1c3Rlcl9pbml0X3BhcmFtcyhvdXRwdXRfcGFyYW1zLCBzcGVjcywgYXJncy5jbHVzdGVyX3R5cGUsIGFyZ3MudGFyZ2V0X3BhcmFtcykNCiAgICBpZiBhcmdzLmNsdXN0ZXJfdHlwZSA9PSAic2x1cm0iOg0KICAgICAgICBzZXRfc2x1cm1fcGFyYW1zKG91dHB1dF9wYXJhbXMsIGFyZ3MuZGJQYXNzd29yZCwgY2N3X291dHB1dHMpDQogICAgZWxzZToNCiAgICAgICAgc2V0X29vZF9wYXJhbXMob3V0cHV0X3BhcmFtcywgY2N3X291dHB1dHMpDQogICAgcHJpbnQoanNvbi5kdW1wcyhvdXRwdXRfcGFyYW1zLCBpbmRlbnQ9NCkpDQoNCg0KaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoNCiAgICBtYWluKCk= \ No newline at end of file