IyAtKi0gY29kaW5nOiBpc28tODg1OS0xIC0qLQ0KIyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYgTWFydGluIHZvbiBM9ndpcw0KIyBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQuDQojIFRoZSBiZGlzdF93aW5pbnN0IGNvbW1hbmQgcHJvcGVyDQojIGJhc2VkIG9uIGJkaXN0X3dpbmluc3QNCiIiIg0KSW1wbGVtZW50cyB0aGUgYmRpc3RfbXNpIGNvbW1hbmQuDQoiIiINCmltcG9ydCBzeXMsIG9zDQpmcm9tIHN5c2NvbmZpZyBpbXBvcnQgZ2V0X3B5dGhvbl92ZXJzaW9uDQoNCmZyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IENvbW1hbmQNCmZyb20gZGlzdHV0aWxzLmRpcl91dGlsIGltcG9ydCByZW1vdmVfdHJlZQ0KZnJvbSBkaXN0dXRpbHMudmVyc2lvbiBpbXBvcnQgU3RyaWN0VmVyc2lvbg0KZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNPcHRpb25FcnJvcg0KZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZw0KZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgZ2V0X3BsYXRmb3JtDQoNCmltcG9ydCBtc2lsaWINCmZyb20gbXNpbGliIGltcG9ydCBzY2hlbWEsIHNlcXVlbmNlLCB0ZXh0DQpmcm9tIG1zaWxpYiBpbXBvcnQgRGlyZWN0b3J5LCBGZWF0dXJlLCBEaWFsb2csIGFkZF9kYXRhDQoNCmNsYXNzIFB5RGlhbG9nKERpYWxvZyk6DQogICAgIiIiRGlhbG9nIGNsYXNzIHdpdGggYSBmaXhlZCBsYXlvdXQ6IGNvbnRyb2xzIGF0IHRoZSB0b3AsIHRoZW4gYSBydWxlciwNCiAgICB0aGVuIGEgbGlzdCBvZiBidXR0b25zOiBiYWNrLCBuZXh0LCBjYW5jZWwuIE9wdGlvbmFsbHkgYSBiaXRtYXAgYXQgdGhlDQogICAgbGVmdC4iIiINCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpOg0KICAgICAgICAiIiJEaWFsb2coZGF0YWJhc2UsIG5hbWUsIHgsIHksIHcsIGgsIGF0dHJpYnV0ZXMsIHRpdGxlLCBmaXJzdCwNCiAgICAgICAgZGVmYXVsdCwgY2FuY2VsLCBiaXRtYXA9dHJ1ZSkiIiINCiAgICAgICAgRGlhbG9nLl9faW5pdF9fKHNlbGYsICphcmdzKQ0KICAgICAgICBydWxlciA9IHNlbGYuaCAtIDM2DQogICAgICAgICNpZiBrdy5nZXQoImJpdG1hcCIsIFRydWUpOg0KICAgICAgICAjICAgIHNlbGYuYml0bWFwKCJCaXRtYXAiLCAwLCAwLCBibXdpZHRoLCBydWxlciwgIlB5dGhvbldpbiIpDQogICAgICAgIHNlbGYubGluZSgiQm90dG9tTGluZSIsIDAsIHJ1bGVyLCBzZWxmLncsIDApDQoNCiAgICBkZWYgdGl0bGUoc2VsZiwgdGl0bGUpOg0KICAgICAgICAiU2V0IHRoZSB0aXRsZSB0ZXh0IG9mIHRoZSBkaWFsb2cgYXQgdGhlIHRvcC4iDQogICAgICAgICMgbmFtZSwgeCwgeSwgdywgaCwgZmxhZ3M9VmlzaWJsZXxFbmFibGVkfFRyYW5zcGFyZW50fE5vUHJlZml4LA0KICAgICAgICAjIHRleHQsIGluIFZlcmRhbmFCb2xkMTANCiAgICAgICAgc2VsZi50ZXh0KCJUaXRsZSIsIDE1LCAxMCwgMzIwLCA2MCwgMHgzMDAwMywNCiAgICAgICAgICAgICAgICAgIHIie1xWZXJkYW5hQm9sZDEwfSVzIiAlIHRpdGxlKQ0KDQogICAgZGVmIGJhY2soc2VsZiwgdGl0bGUsIG5leHQsIG5hbWUgPSAiQmFjayIsIGFjdGl2ZSA9IDEpOg0KICAgICAgICAiIiJBZGQgYSBiYWNrIGJ1dHRvbiB3aXRoIGEgZ2l2ZW4gdGl0bGUsIHRoZSB0YWItbmV4dCBidXR0b24sDQogICAgICAgIGl0cyBuYW1lIGluIHRoZSBDb250cm9sIHRhYmxlLCBwb3NzaWJseSBpbml0aWFsbHkgZGlzYWJsZWQuDQoNCiAgICAgICAgUmV0dXJuIHRoZSBidXR0b24sIHNvIHRoYXQgZXZlbnRzIGNhbiBiZSBhc3NvY2lhdGVkIiIiDQogICAgICAgIGlmIGFjdGl2ZToNCiAgICAgICAgICAgIGZsYWdzID0gMyAjIFZpc2libGV8RW5hYmxlZA0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgZmxhZ3MgPSAxICMgVmlzaWJsZQ0KICAgICAgICByZXR1cm4gc2VsZi5wdXNoYnV0dG9uKG5hbWUsIDE4MCwgc2VsZi5oLTI3ICwgNTYsIDE3LCBmbGFncywgdGl0bGUsIG5leHQpDQoNCiAgICBkZWYgY2FuY2VsKHNlbGYsIHRpdGxlLCBuZXh0LCBuYW1lID0gIkNhbmNlbCIsIGFjdGl2ZSA9IDEpOg0KICAgICAgICAiIiJBZGQgYSBjYW5jZWwgYnV0dG9uIHdpdGggYSBnaXZlbiB0aXRsZSwgdGhlIHRhYi1uZXh0IGJ1dHRvbiwNCiAgICAgICAgaXRzIG5hbWUgaW4gdGhlIENvbnRyb2wgdGFibGUsIHBvc3NpYmx5IGluaXRpYWxseSBkaXNhYmxlZC4NCg0KICAgICAgICBSZXR1cm4gdGhlIGJ1dHRvbiwgc28gdGhhdCBldmVudHMgY2FuIGJlIGFzc29jaWF0ZWQiIiINCiAgICAgICAgaWYgYWN0aXZlOg0KICAgICAgICAgICAgZmxhZ3MgPSAzICMgVmlzaWJsZXxFbmFibGVkDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBmbGFncyA9IDEgIyBWaXNpYmxlDQogICAgICAgIHJldHVybiBzZWxmLnB1c2hidXR0b24obmFtZSwgMzA0LCBzZWxmLmgtMjcsIDU2LCAxNywgZmxhZ3MsIHRpdGxlLCBuZXh0KQ0KDQogICAgZGVmIG5leHQoc2VsZiwgdGl0bGUsIG5leHQsIG5hbWUgPSAiTmV4dCIsIGFjdGl2ZSA9IDEpOg0KICAgICAgICAiIiJBZGQgYSBOZXh0IGJ1dHRvbiB3aXRoIGEgZ2l2ZW4gdGl0bGUsIHRoZSB0YWItbmV4dCBidXR0b24sDQogICAgICAgIGl0cyBuYW1lIGluIHRoZSBDb250cm9sIHRhYmxlLCBwb3NzaWJseSBpbml0aWFsbHkgZGlzYWJsZWQuDQoNCiAgICAgICAgUmV0dXJuIHRoZSBidXR0b24sIHNvIHRoYXQgZXZlbnRzIGNhbiBiZSBhc3NvY2lhdGVkIiIiDQogICAgICAgIGlmIGFjdGl2ZToNCiAgICAgICAgICAgIGZsYWdzID0gMyAjIFZpc2libGV8RW5hYmxlZA0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgZmxhZ3MgPSAxICMgVmlzaWJsZQ0KICAgICAgICByZXR1cm4gc2VsZi5wdXNoYnV0dG9uKG5hbWUsIDIzNiwgc2VsZi5oLTI3LCA1NiwgMTcsIGZsYWdzLCB0aXRsZSwgbmV4dCkNCg0KICAgIGRlZiB4YnV0dG9uKHNlbGYsIG5hbWUsIHRpdGxlLCBuZXh0LCB4cG9zKToNCiAgICAgICAgIiIiQWRkIGEgYnV0dG9uIHdpdGggYSBnaXZlbiB0aXRsZSwgdGhlIHRhYi1uZXh0IGJ1dHRvbiwNCiAgICAgICAgaXRzIG5hbWUgaW4gdGhlIENvbnRyb2wgdGFibGUsIGdpdmluZyBpdHMgeCBwb3NpdGlvbjsgdGhlDQogICAgICAgIHktcG9zaXRpb24gaXMgYWxpZ25lZCB3aXRoIHRoZSBvdGhlciBidXR0b25zLg0KDQogICAgICAgIFJldHVybiB0aGUgYnV0dG9uLCBzbyB0aGF0IGV2ZW50cyBjYW4gYmUgYXNzb2NpYXRlZCIiIg0KICAgICAgICByZXR1cm4gc2VsZi5wdXNoYnV0dG9uKG5hbWUsIGludChzZWxmLncqeHBvcyAtIDI4KSwgc2VsZi5oLTI3LCA1NiwgMTcsIDMsIHRpdGxlLCBuZXh0KQ0KDQpjbGFzcyBiZGlzdF9tc2kgKENvbW1hbmQpOg0KDQogICAgZGVzY3JpcHRpb24gPSAiY3JlYXRlIGEgTWljcm9zb2Z0IEluc3RhbGxlciAoLm1zaSkgYmluYXJ5IGRpc3RyaWJ1dGlvbiINCg0KICAgIHVzZXJfb3B0aW9ucyA9IFsoJ2JkaXN0LWRpcj0nLCBOb25lLA0KICAgICAgICAgICAgICAgICAgICAgInRlbXBvcmFyeSBkaXJlY3RvcnkgZm9yIGNyZWF0aW5nIHRoZSBkaXN0cmlidXRpb24iKSwNCiAgICAgICAgICAgICAgICAgICAgKCdwbGF0LW5hbWU9JywgJ3AnLA0KICAgICAgICAgICAgICAgICAgICAgInBsYXRmb3JtIG5hbWUgdG8gZW1iZWQgaW4gZ2VuZXJhdGVkIGZpbGVuYW1lcyAiDQogICAgICAgICAgICAgICAgICAgICAiKGRlZmF1bHQ6ICVzKSIgJSBnZXRfcGxhdGZvcm0oKSksDQogICAgICAgICAgICAgICAgICAgICgna2VlcC10ZW1wJywgJ2snLA0KICAgICAgICAgICAgICAgICAgICAgImtlZXAgdGhlIHBzZXVkby1pbnN0YWxsYXRpb24gdHJlZSBhcm91bmQgYWZ0ZXIgIiArDQogICAgICAgICAgICAgICAgICAgICAiY3JlYXRpbmcgdGhlIGRpc3RyaWJ1dGlvbiBhcmNoaXZlIiksDQogICAgICAgICAgICAgICAgICAgICgndGFyZ2V0LXZlcnNpb249JywgTm9uZSwNCiAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlIGEgc3BlY2lmaWMgcHl0aG9uIHZlcnNpb24iICsNCiAgICAgICAgICAgICAgICAgICAgICIgb24gdGhlIHRhcmdldCBzeXN0ZW0iKSwNCiAgICAgICAgICAgICAgICAgICAgKCduby10YXJnZXQtY29tcGlsZScsICdjJywNCiAgICAgICAgICAgICAgICAgICAgICJkbyBub3QgY29tcGlsZSAucHkgdG8gLnB5YyBvbiB0aGUgdGFyZ2V0IHN5c3RlbSIpLA0KICAgICAgICAgICAgICAgICAgICAoJ25vLXRhcmdldC1vcHRpbWl6ZScsICdvJywNCiAgICAgICAgICAgICAgICAgICAgICJkbyBub3QgY29tcGlsZSAucHkgdG8gLnB5byAob3B0aW1pemVkKSINCiAgICAgICAgICAgICAgICAgICAgICJvbiB0aGUgdGFyZ2V0IHN5c3RlbSIpLA0KICAgICAgICAgICAgICAgICAgICAoJ2Rpc3QtZGlyPScsICdkJywNCiAgICAgICAgICAgICAgICAgICAgICJkaXJlY3RvcnkgdG8gcHV0IGZpbmFsIGJ1aWx0IGRpc3RyaWJ1dGlvbnMgaW4iKSwNCiAgICAgICAgICAgICAgICAgICAgKCdza2lwLWJ1aWxkJywgTm9uZSwNCiAgICAgICAgICAgICAgICAgICAgICJza2lwIHJlYnVpbGRpbmcgZXZlcnl0aGluZyAoZm9yIHRlc3RpbmcvZGVidWdnaW5nKSIpLA0KICAgICAgICAgICAgICAgICAgICAoJ2luc3RhbGwtc2NyaXB0PScsIE5vbmUsDQogICAgICAgICAgICAgICAgICAgICAiYmFzZW5hbWUgb2YgaW5zdGFsbGF0aW9uIHNjcmlwdCB0byBiZSBydW4gYWZ0ZXIiDQogICAgICAgICAgICAgICAgICAgICAiaW5zdGFsbGF0aW9uIG9yIGJlZm9yZSBkZWluc3RhbGxhdGlvbiIpLA0KICAgICAgICAgICAgICAgICAgICAoJ3ByZS1pbnN0YWxsLXNjcmlwdD0nLCBOb25lLA0KICAgICAgICAgICAgICAgICAgICAgIkZ1bGx5IHF1YWxpZmllZCBmaWxlbmFtZSBvZiBhIHNjcmlwdCB0byBiZSBydW4gYmVmb3JlICINCiAgICAgICAgICAgICAgICAgICAgICJhbnkgZmlsZXMgYXJlIGluc3RhbGxlZC4gIFRoaXMgc2NyaXB0IG5lZWQgbm90IGJlIGluIHRoZSAiDQogICAgICAgICAgICAgICAgICAgICAiZGlzdHJpYnV0aW9uIiksDQogICAgICAgICAgICAgICAgICAgXQ0KDQogICAgYm9vbGVhbl9vcHRpb25zID0gWydrZWVwLXRlbXAnLCAnbm8tdGFyZ2V0LWNvbXBpbGUnLCAnbm8tdGFyZ2V0LW9wdGltaXplJywNCiAgICAgICAgICAgICAgICAgICAgICAgJ3NraXAtYnVpbGQnXQ0KDQogICAgYWxsX3ZlcnNpb25zID0gWycyLjAnLCAnMi4xJywgJzIuMicsICcyLjMnLCAnMi40JywNCiAgICAgICAgICAgICAgICAgICAgJzIuNScsICcyLjYnLCAnMi43JywgJzIuOCcsICcyLjknLA0KICAgICAgICAgICAgICAgICAgICAnMy4wJywgJzMuMScsICczLjInLCAnMy4zJywgJzMuNCcsDQogICAgICAgICAgICAgICAgICAgICczLjUnLCAnMy42JywgJzMuNycsICczLjgnLCAnMy45J10NCiAgICBvdGhlcl92ZXJzaW9uID0gJ1gnDQoNCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zIChzZWxmKToNCiAgICAgICAgc2VsZi5iZGlzdF9kaXIgPSBOb25lDQogICAgICAgIHNlbGYucGxhdF9uYW1lID0gTm9uZQ0KICAgICAgICBzZWxmLmtlZXBfdGVtcCA9IDANCiAgICAgICAgc2VsZi5ub190YXJnZXRfY29tcGlsZSA9IDANCiAgICAgICAgc2VsZi5ub190YXJnZXRfb3B0aW1pemUgPSAwDQogICAgICAgIHNlbGYudGFyZ2V0X3ZlcnNpb24gPSBOb25lDQogICAgICAgIHNlbGYuZGlzdF9kaXIgPSBOb25lDQogICAgICAgIHNlbGYuc2tpcF9idWlsZCA9IDANCiAgICAgICAgc2VsZi5pbnN0YWxsX3NjcmlwdCA9IE5vbmUNCiAgICAgICAgc2VsZi5wcmVfaW5zdGFsbF9zY3JpcHQgPSBOb25lDQogICAgICAgIHNlbGYudmVyc2lvbnMgPSBOb25lDQoNCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyAoc2VsZik6DQogICAgICAgIGlmIHNlbGYuYmRpc3RfZGlyIGlzIE5vbmU6DQogICAgICAgICAgICBiZGlzdF9iYXNlID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2JkaXN0JykuYmRpc3RfYmFzZQ0KICAgICAgICAgICAgc2VsZi5iZGlzdF9kaXIgPSBvcy5wYXRoLmpvaW4oYmRpc3RfYmFzZSwgJ21zaScpDQogICAgICAgIHNob3J0X3ZlcnNpb24gPSBnZXRfcHl0aG9uX3ZlcnNpb24oKQ0KICAgICAgICBpZiAobm90IHNlbGYudGFyZ2V0X3ZlcnNpb24pIGFuZCBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfZXh0X21vZHVsZXMoKToNCiAgICAgICAgICAgIHNlbGYudGFyZ2V0X3ZlcnNpb24gPSBzaG9ydF92ZXJzaW9uDQogICAgICAgIGlmIHNlbGYudGFyZ2V0X3ZlcnNpb246DQogICAgICAgICAgICBzZWxmLnZlcnNpb25zID0gW3NlbGYudGFyZ2V0X3ZlcnNpb25dDQogICAgICAgICAgICBpZiBub3Qgc2VsZi5za2lwX2J1aWxkIGFuZCBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfZXh0X21vZHVsZXMoKVwNCiAgICAgICAgICAgICAgIGFuZCBzZWxmLnRhcmdldF92ZXJzaW9uICE9IHNob3J0X3ZlcnNpb246DQogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IsIFwNCiAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0IHZlcnNpb24gY2FuIG9ubHkgYmUgJXMsIG9yIHRoZSAnLS1za2lwLWJ1aWxkJyIgXA0KICAgICAgICAgICAgICAgICAgICAgICIgb3B0aW9uIG11c3QgYmUgc3BlY2lmaWVkIiAlIChzaG9ydF92ZXJzaW9uLCkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYudmVyc2lvbnMgPSBsaXN0KHNlbGYuYWxsX3ZlcnNpb25zKQ0KDQogICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKCdiZGlzdCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnZGlzdF9kaXInLCAnZGlzdF9kaXInKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdwbGF0X25hbWUnLCAncGxhdF9uYW1lJyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCg0KICAgICAgICBpZiBzZWxmLnByZV9pbnN0YWxsX3NjcmlwdDoNCiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yLCAidGhlIHByZS1pbnN0YWxsLXNjcmlwdCBmZWF0dXJlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQiDQoNCiAgICAgICAgaWYgc2VsZi5pbnN0YWxsX3NjcmlwdDoNCiAgICAgICAgICAgIGZvciBzY3JpcHQgaW4gc2VsZi5kaXN0cmlidXRpb24uc2NyaXB0czoNCiAgICAgICAgICAgICAgICBpZiBzZWxmLmluc3RhbGxfc2NyaXB0ID09IG9zLnBhdGguYmFzZW5hbWUoc2NyaXB0KToNCiAgICAgICAgICAgICAgICAgICAgYnJlYWsNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IsIFwNCiAgICAgICAgICAgICAgICAgICAgICAiaW5zdGFsbF9zY3JpcHQgJyVzJyBub3QgZm91bmQgaW4gc2NyaXB0cyIgJSBcDQogICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbnN0YWxsX3NjcmlwdA0KICAgICAgICBzZWxmLmluc3RhbGxfc2NyaXB0X2tleSA9IE5vbmUNCiAgICAjIGZpbmFsaXplX29wdGlvbnMoKQ0KDQoNCiAgICBkZWYgcnVuIChzZWxmKToNCiAgICAgICAgaWYgbm90IHNlbGYuc2tpcF9idWlsZDoNCiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2J1aWxkJykNCg0KICAgICAgICBpbnN0YWxsID0gc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZCgnaW5zdGFsbCcsIHJlaW5pdF9zdWJjb21tYW5kcz0xKQ0KICAgICAgICBpbnN0YWxsLnByZWZpeCA9IHNlbGYuYmRpc3RfZGlyDQogICAgICAgIGluc3RhbGwuc2tpcF9idWlsZCA9IHNlbGYuc2tpcF9idWlsZA0KICAgICAgICBpbnN0YWxsLndhcm5fZGlyID0gMA0KDQogICAgICAgIGluc3RhbGxfbGliID0gc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZCgnaW5zdGFsbF9saWInKQ0KICAgICAgICAjIHdlIGRvIG5vdCB3YW50IHRvIGluY2x1ZGUgcHljIG9yIHB5byBmaWxlcw0KICAgICAgICBpbnN0YWxsX2xpYi5jb21waWxlID0gMA0KICAgICAgICBpbnN0YWxsX2xpYi5vcHRpbWl6ZSA9IDANCg0KICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfZXh0X21vZHVsZXMoKToNCiAgICAgICAgICAgICMgSWYgd2UgYXJlIGJ1aWxkaW5nIGFuIGluc3RhbGxlciBmb3IgYSBQeXRob24gdmVyc2lvbiBvdGhlcg0KICAgICAgICAgICAgIyB0aGFuIHRoZSBvbmUgd2UgYXJlIGN1cnJlbnRseSBydW5uaW5nLCB0aGVuIHdlIG5lZWQgdG8gZW5zdXJlDQogICAgICAgICAgICAjIG91ciBidWlsZF9saWIgcmVmbGVjdHMgdGhlIG90aGVyIFB5dGhvbiB2ZXJzaW9uIHJhdGhlciB0aGFuIG91cnMuDQogICAgICAgICAgICAjIE5vdGUgdGhhdCBmb3IgdGFyZ2V0X3ZlcnNpb24hPXN5cy52ZXJzaW9uLCB3ZSBtdXN0IGhhdmUgc2tpcHBlZCB0aGUNCiAgICAgICAgICAgICMgYnVpbGQgc3RlcCwgc28gdGhlcmUgaXMgbm8gaXNzdWUgd2l0aCBlbmZvcmNpbmcgdGhlIGJ1aWxkIG9mIHRoaXMNCiAgICAgICAgICAgICMgdmVyc2lvbi4NCiAgICAgICAgICAgIHRhcmdldF92ZXJzaW9uID0gc2VsZi50YXJnZXRfdmVyc2lvbg0KICAgICAgICAgICAgaWYgbm90IHRhcmdldF92ZXJzaW9uOg0KICAgICAgICAgICAgICAgIGFzc2VydCBzZWxmLnNraXBfYnVpbGQsICJTaG91bGQgaGF2ZSBhbHJlYWR5IGNoZWNrZWQgdGhpcyINCiAgICAgICAgICAgICAgICB0YXJnZXRfdmVyc2lvbiA9IHN5cy52ZXJzaW9uWzA6M10NCiAgICAgICAgICAgIHBsYXRfc3BlY2lmaWVyID0gIi4lcy0lcyIgJSAoc2VsZi5wbGF0X25hbWUsIHRhcmdldF92ZXJzaW9uKQ0KICAgICAgICAgICAgYnVpbGQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGQnKQ0KICAgICAgICAgICAgYnVpbGQuYnVpbGRfbGliID0gb3MucGF0aC5qb2luKGJ1aWxkLmJ1aWxkX2Jhc2UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpYicgKyBwbGF0X3NwZWNpZmllcikNCg0KICAgICAgICBsb2cuaW5mbygiaW5zdGFsbGluZyB0byAlcyIsIHNlbGYuYmRpc3RfZGlyKQ0KICAgICAgICBpbnN0YWxsLmVuc3VyZV9maW5hbGl6ZWQoKQ0KDQogICAgICAgICMgYXZvaWQgd2FybmluZyBvZiAnaW5zdGFsbF9saWInIGFib3V0IGluc3RhbGxpbmcNCiAgICAgICAgIyBpbnRvIGEgZGlyZWN0b3J5IG5vdCBpbiBzeXMucGF0aA0KICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgb3MucGF0aC5qb2luKHNlbGYuYmRpc3RfZGlyLCAnUFVSRUxJQicpKQ0KDQogICAgICAgIGluc3RhbGwucnVuKCkNCg0KICAgICAgICBkZWwgc3lzLnBhdGhbMF0NCg0KICAgICAgICBzZWxmLm1rcGF0aChzZWxmLmRpc3RfZGlyKQ0KICAgICAgICBmdWxsbmFtZSA9IHNlbGYuZGlzdHJpYnV0aW9uLmdldF9mdWxsbmFtZSgpDQogICAgICAgIGluc3RhbGxlcl9uYW1lID0gc2VsZi5nZXRfaW5zdGFsbGVyX2ZpbGVuYW1lKGZ1bGxuYW1lKQ0KICAgICAgICBpbnN0YWxsZXJfbmFtZSA9IG9zLnBhdGguYWJzcGF0aChpbnN0YWxsZXJfbmFtZSkNCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoaW5zdGFsbGVyX25hbWUpOiBvcy51bmxpbmsoaW5zdGFsbGVyX25hbWUpDQoNCiAgICAgICAgbWV0YWRhdGEgPSBzZWxmLmRpc3RyaWJ1dGlvbi5tZXRhZGF0YQ0KICAgICAgICBhdXRob3IgPSBtZXRhZGF0YS5hdXRob3INCiAgICAgICAgaWYgbm90IGF1dGhvcjoNCiAgICAgICAgICAgIGF1dGhvciA9IG1ldGFkYXRhLm1haW50YWluZXINCiAgICAgICAgaWYgbm90IGF1dGhvcjoNCiAgICAgICAgICAgIGF1dGhvciA9ICJVTktOT1dOIg0KICAgICAgICB2ZXJzaW9uID0gbWV0YWRhdGEuZ2V0X3ZlcnNpb24oKQ0KICAgICAgICAjIFByb2R1Y3RWZXJzaW9uIG11c3QgYmUgc3RyaWN0bHkgbnVtZXJpYw0KICAgICAgICAjIFhYWCBuZWVkIHRvIGRlYWwgd2l0aCBwcmVyZWxlYXNlIHZlcnNpb25zDQogICAgICAgIHN2ZXJzaW9uID0gIiVkLiVkLiVkIiAlIFN0cmljdFZlcnNpb24odmVyc2lvbikudmVyc2lvbg0KICAgICAgICAjIFByZWZpeCBQcm9kdWN0TmFtZSB3aXRoIFB5dGhvbiB4LnksIHNvIHRoYXQNCiAgICAgICAgIyBpdCBzb3J0cyB0b2dldGhlciB3aXRoIHRoZSBvdGhlciBQeXRob24gcGFja2FnZXMNCiAgICAgICAgIyBpbiBBZGQtUmVtb3ZlLVByb2dyYW1zIChBUFIpDQogICAgICAgIGZ1bGxuYW1lID0gc2VsZi5kaXN0cmlidXRpb24uZ2V0X2Z1bGxuYW1lKCkNCiAgICAgICAgaWYgc2VsZi50YXJnZXRfdmVyc2lvbjoNCiAgICAgICAgICAgIHByb2R1Y3RfbmFtZSA9ICJQeXRob24gJXMgJXMiICUgKHNlbGYudGFyZ2V0X3ZlcnNpb24sIGZ1bGxuYW1lKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcHJvZHVjdF9uYW1lID0gIlB5dGhvbiAlcyIgJSAoZnVsbG5hbWUpDQogICAgICAgIHNlbGYuZGIgPSBtc2lsaWIuaW5pdF9kYXRhYmFzZShpbnN0YWxsZXJfbmFtZSwgc2NoZW1hLA0KICAgICAgICAgICAgICAgIHByb2R1Y3RfbmFtZSwgbXNpbGliLmdlbl91dWlkKCksDQogICAgICAgICAgICAgICAgc3ZlcnNpb24sIGF1dGhvcikNCiAgICAgICAgbXNpbGliLmFkZF90YWJsZXMoc2VsZi5kYiwgc2VxdWVuY2UpDQogICAgICAgIHByb3BzID0gWygnRGlzdFZlcnNpb24nLCB2ZXJzaW9uKV0NCiAgICAgICAgZW1haWwgPSBtZXRhZGF0YS5hdXRob3JfZW1haWwgb3IgbWV0YWRhdGEubWFpbnRhaW5lcl9lbWFpbA0KICAgICAgICBpZiBlbWFpbDoNCiAgICAgICAgICAgIHByb3BzLmFwcGVuZCgoIkFSUENPTlRBQ1QiLCBlbWFpbCkpDQogICAgICAgIGlmIG1ldGFkYXRhLnVybDoNCiAgICAgICAgICAgIHByb3BzLmFwcGVuZCgoIkFSUFVSTElORk9BQk9VVCIsIG1ldGFkYXRhLnVybCkpDQogICAgICAgIGlmIHByb3BzOg0KICAgICAgICAgICAgYWRkX2RhdGEoc2VsZi5kYiwgJ1Byb3BlcnR5JywgcHJvcHMpDQoNCiAgICAgICAgc2VsZi5hZGRfZmluZF9weXRob24oKQ0KICAgICAgICBzZWxmLmFkZF9maWxlcygpDQogICAgICAgIHNlbGYuYWRkX3NjcmlwdHMoKQ0KICAgICAgICBzZWxmLmFkZF91aSgpDQogICAgICAgIHNlbGYuZGIuQ29tbWl0KCkNCg0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYuZGlzdHJpYnV0aW9uLCAnZGlzdF9maWxlcycpOg0KICAgICAgICAgICAgdHVwID0gJ2JkaXN0X21zaScsIHNlbGYudGFyZ2V0X3ZlcnNpb24gb3IgJ2FueScsIGZ1bGxuYW1lDQogICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbi5kaXN0X2ZpbGVzLmFwcGVuZCh0dXApDQoNCiAgICAgICAgaWYgbm90IHNlbGYua2VlcF90ZW1wOg0KICAgICAgICAgICAgcmVtb3ZlX3RyZWUoc2VsZi5iZGlzdF9kaXIsIGRyeV9ydW49c2VsZi5kcnlfcnVuKQ0KDQogICAgZGVmIGFkZF9maWxlcyhzZWxmKToNCiAgICAgICAgZGIgPSBzZWxmLmRiDQogICAgICAgIGNhYiA9IG1zaWxpYi5DQUIoImRpc3RmaWxlcyIpDQogICAgICAgIHJvb3RkaXIgPSBvcy5wYXRoLmFic3BhdGgoc2VsZi5iZGlzdF9kaXIpDQoNCiAgICAgICAgcm9vdCA9IERpcmVjdG9yeShkYiwgY2FiLCBOb25lLCByb290ZGlyLCAiVEFSR0VURElSIiwgIlNvdXJjZURpciIpDQogICAgICAgIGYgPSBGZWF0dXJlKGRiLCAiUHl0aG9uIiwgIlB5dGhvbiIsICJFdmVyeXRoaW5nIiwNCiAgICAgICAgICAgICAgICAgICAgMCwgMSwgZGlyZWN0b3J5PSJUQVJHRVRESVIiKQ0KDQogICAgICAgIGl0ZW1zID0gWyhmLCByb290LCAnJyldDQogICAgICAgIGZvciB2ZXJzaW9uIGluIHNlbGYudmVyc2lvbnMgKyBbc2VsZi5vdGhlcl92ZXJzaW9uXToNCiAgICAgICAgICAgIHRhcmdldCA9ICJUQVJHRVRESVIiICsgdmVyc2lvbg0KICAgICAgICAgICAgbmFtZSA9IGRlZmF1bHQgPSAiUHl0aG9uIiArIHZlcnNpb24NCiAgICAgICAgICAgIGRlc2MgPSAiRXZlcnl0aGluZyINCiAgICAgICAgICAgIGlmIHZlcnNpb24gaXMgc2VsZi5vdGhlcl92ZXJzaW9uOg0KICAgICAgICAgICAgICAgIHRpdGxlID0gIlB5dGhvbiBmcm9tIGFub3RoZXIgbG9jYXRpb24iDQogICAgICAgICAgICAgICAgbGV2ZWwgPSAyDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHRpdGxlID0gIlB5dGhvbiAlcyBmcm9tIHJlZ2lzdHJ5IiAlIHZlcnNpb24NCiAgICAgICAgICAgICAgICBsZXZlbCA9IDENCiAgICAgICAgICAgIGYgPSBGZWF0dXJlKGRiLCBuYW1lLCB0aXRsZSwgZGVzYywgMSwgbGV2ZWwsIGRpcmVjdG9yeT10YXJnZXQpDQogICAgICAgICAgICBkaXIgPSBEaXJlY3RvcnkoZGIsIGNhYiwgcm9vdCwgcm9vdGRpciwgdGFyZ2V0LCBkZWZhdWx0KQ0KICAgICAgICAgICAgaXRlbXMuYXBwZW5kKChmLCBkaXIsIHZlcnNpb24pKQ0KICAgICAgICBkYi5Db21taXQoKQ0KDQogICAgICAgIHNlZW4gPSB7fQ0KICAgICAgICBmb3IgZmVhdHVyZSwgZGlyLCB2ZXJzaW9uIGluIGl0ZW1zOg0KICAgICAgICAgICAgdG9kbyA9IFtkaXJdDQogICAgICAgICAgICB3aGlsZSB0b2RvOg0KICAgICAgICAgICAgICAgIGRpciA9IHRvZG8ucG9wKCkNCiAgICAgICAgICAgICAgICBmb3IgZmlsZSBpbiBvcy5saXN0ZGlyKGRpci5hYnNvbHV0ZSk6DQogICAgICAgICAgICAgICAgICAgIGFmaWxlID0gb3MucGF0aC5qb2luKGRpci5hYnNvbHV0ZSwgZmlsZSkNCiAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihhZmlsZSk6DQogICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCA9ICIlc3wlcyIgJSAoZGlyLm1ha2Vfc2hvcnQoZmlsZSksIGZpbGUpDQogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0ID0gZmlsZSArIHZlcnNpb24NCiAgICAgICAgICAgICAgICAgICAgICAgIG5ld2RpciA9IERpcmVjdG9yeShkYiwgY2FiLCBkaXIsIGZpbGUsIGRlZmF1bHQsIHNob3J0KQ0KICAgICAgICAgICAgICAgICAgICAgICAgdG9kby5hcHBlbmQobmV3ZGlyKQ0KICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGRpci5jb21wb25lbnQ6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyLnN0YXJ0X2NvbXBvbmVudChkaXIubG9naWNhbCwgZmVhdHVyZSwgMCkNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGFmaWxlIG5vdCBpbiBzZWVuOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IHNlZW5bYWZpbGVdID0gZGlyLmFkZF9maWxlKGZpbGUpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZmlsZT09c2VsZi5pbnN0YWxsX3NjcmlwdDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5pbnN0YWxsX3NjcmlwdF9rZXk6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNdWx0aXBsZSBmaWxlcyB3aXRoIG5hbWUgJXMiICUgZmlsZSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbnN0YWxsX3NjcmlwdF9rZXkgPSAnWyMlc10nICUga2V5DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IHNlZW5bYWZpbGVdDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2RhdGEoc2VsZi5kYiwgIkR1cGxpY2F0ZUZpbGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKGtleSArIHZlcnNpb24sIGRpci5jb21wb25lbnQsIGtleSwgTm9uZSwgZGlyLmxvZ2ljYWwpXSkNCiAgICAgICAgICAgIGRiLkNvbW1pdCgpDQogICAgICAgIGNhYi5jb21taXQoZGIpDQoNCiAgICBkZWYgYWRkX2ZpbmRfcHl0aG9uKHNlbGYpOg0KICAgICAgICAiIiJBZGRzIGNvZGUgdG8gdGhlIGluc3RhbGxlciB0byBjb21wdXRlIHRoZSBsb2NhdGlvbiBvZiBQeXRob24uDQoNCiAgICAgICAgUHJvcGVydGllcyBQWVRIT04uTUFDSElORS5YLlkgYW5kIFBZVEhPTi5VU0VSLlguWSB3aWxsIGJlIHNldCBmcm9tIHRoZQ0KICAgICAgICByZWdpc3RyeSBmb3IgZWFjaCB2ZXJzaW9uIG9mIFB5dGhvbi4NCg0KICAgICAgICBQcm9wZXJ0aWVzIFRBUkdFVERJUlguWSB3aWxsIGJlIHNldCBmcm9tIFBZVEhPTi5VU0VSLlguWSBpZiBkZWZpbmVkLA0KICAgICAgICBlbHNlIGZyb20gUFlUSE9OLk1BQ0hJTkUuWC5ZLg0KDQogICAgICAgIFByb3BlcnRpZXMgUFlUSE9OWC5ZIHdpbGwgYmUgc2V0IHRvIFRBUkdFVERJUlguWVxccHl0aG9uLmV4ZSIiIg0KDQogICAgICAgIHN0YXJ0ID0gNDAyDQogICAgICAgIGZvciB2ZXIgaW4gc2VsZi52ZXJzaW9uczoNCiAgICAgICAgICAgIGluc3RhbGxfcGF0aCA9IHIiU09GVFdBUkVcUHl0aG9uXFB5dGhvbkNvcmVcJXNcSW5zdGFsbFBhdGgiICUgdmVyDQogICAgICAgICAgICBtYWNoaW5lX3JlZyA9ICJweXRob24ubWFjaGluZS4iICsgdmVyDQogICAgICAgICAgICB1c2VyX3JlZyA9ICJweXRob24udXNlci4iICsgdmVyDQogICAgICAgICAgICBtYWNoaW5lX3Byb3AgPSAiUFlUSE9OLk1BQ0hJTkUuIiArIHZlcg0KICAgICAgICAgICAgdXNlcl9wcm9wID0gIlBZVEhPTi5VU0VSLiIgKyB2ZXINCiAgICAgICAgICAgIG1hY2hpbmVfYWN0aW9uID0gIlB5dGhvbkZyb21NYWNoaW5lIiArIHZlcg0KICAgICAgICAgICAgdXNlcl9hY3Rpb24gPSAiUHl0aG9uRnJvbVVzZXIiICsgdmVyDQogICAgICAgICAgICBleGVfYWN0aW9uID0gIlB5dGhvbkV4ZSIgKyB2ZXINCiAgICAgICAgICAgIHRhcmdldF9kaXJfcHJvcCA9ICJUQVJHRVRESVIiICsgdmVyDQogICAgICAgICAgICBleGVfcHJvcCA9ICJQWVRIT04iICsgdmVyDQogICAgICAgICAgICBpZiBtc2lsaWIuV2luNjQ6DQogICAgICAgICAgICAgICAgIyB0eXBlOiBtc2lkYkxvY2F0b3JUeXBlUmF3VmFsdWUgKyBtc2lkYkxvY2F0b3JUeXBlNjRiaXQNCiAgICAgICAgICAgICAgICBUeXBlID0gMisxNg0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBUeXBlID0gMg0KICAgICAgICAgICAgYWRkX2RhdGEoc2VsZi5kYiwgIlJlZ0xvY2F0b3IiLA0KICAgICAgICAgICAgICAgICAgICBbKG1hY2hpbmVfcmVnLCAyLCBpbnN0YWxsX3BhdGgsIE5vbmUsIFR5cGUpLA0KICAgICAgICAgICAgICAgICAgICAgKHVzZXJfcmVnLCAxLCBpbnN0YWxsX3BhdGgsIE5vbmUsIFR5cGUpXSkNCiAgICAgICAgICAgIGFkZF9kYXRhKHNlbGYuZGIsICJBcHBTZWFyY2giLA0KICAgICAgICAgICAgICAgICAgICBbKG1hY2hpbmVfcHJvcCwgbWFjaGluZV9yZWcpLA0KICAgICAgICAgICAgICAgICAgICAgKHVzZXJfcHJvcCwgdXNlcl9yZWcpXSkNCiAgICAgICAgICAgIGFkZF9kYXRhKHNlbGYuZGIsICJDdXN0b21BY3Rpb24iLA0KICAgICAgICAgICAgICAgICAgICBbKG1hY2hpbmVfYWN0aW9uLCA1MSsyNTYsIHRhcmdldF9kaXJfcHJvcCwgIlsiICsgbWFjaGluZV9wcm9wICsgIl0iKSwNCiAgICAgICAgICAgICAgICAgICAgICh1c2VyX2FjdGlvbiwgNTErMjU2LCB0YXJnZXRfZGlyX3Byb3AsICJbIiArIHVzZXJfcHJvcCArICJdIiksDQogICAgICAgICAgICAgICAgICAgICAoZXhlX2FjdGlvbiwgNTErMjU2LCBleGVfcHJvcCwgIlsiICsgdGFyZ2V0X2Rpcl9wcm9wICsgIl1cXHB5dGhvbi5leGUiKSwNCiAgICAgICAgICAgICAgICAgICAgXSkNCiAgICAgICAgICAgIGFkZF9kYXRhKHNlbGYuZGIsICJJbnN0YWxsRXhlY3V0ZVNlcXVlbmNlIiwNCiAgICAgICAgICAgICAgICAgICAgWyhtYWNoaW5lX2FjdGlvbiwgbWFjaGluZV9wcm9wLCBzdGFydCksDQogICAgICAgICAgICAgICAgICAgICAodXNlcl9hY3Rpb24sIHVzZXJfcHJvcCwgc3RhcnQgKyAxKSwNCiAgICAgICAgICAgICAgICAgICAgIChleGVfYWN0aW9uLCBOb25lLCBzdGFydCArIDIpLA0KICAgICAgICAgICAgICAgICAgICBdKQ0KICAgICAgICAgICAgYWRkX2RhdGEoc2VsZi5kYiwgIkluc3RhbGxVSVNlcXVlbmNlIiwNCiAgICAgICAgICAgICAgICAgICAgWyhtYWNoaW5lX2FjdGlvbiwgbWFjaGluZV9wcm9wLCBzdGFydCksDQogICAgICAgICAgICAgICAgICAgICAodXNlcl9hY3Rpb24sIHVzZXJfcHJvcCwgc3RhcnQgKyAxKSwNCiAgICAgICAgICAgICAgICAgICAgIChleGVfYWN0aW9uLCBOb25lLCBzdGFydCArIDIpLA0KICAgICAgICAgICAgICAgICAgICBdKQ0KICAgICAgICAgICAgYWRkX2RhdGEoc2VsZi5kYiwgIkNvbmRpdGlvbiIsDQogICAgICAgICAgICAgICAgICAgIFsoIlB5dGhvbiIgKyB2ZXIsIDAsICJOT1QgVEFSR0VURElSIiArIHZlcildKQ0KICAgICAgICAgICAgc3RhcnQgKz0gNA0KICAgICAgICAgICAgYXNzZXJ0IHN0YXJ0IDwgNTAwDQoNCiAgICBkZWYgYWRkX3NjcmlwdHMoc2VsZik6DQogICAgICAgIGlmIHNlbGYuaW5zdGFsbF9zY3JpcHQ6DQogICAgICAgICAgICBzdGFydCA9IDY4MDANCiAgICAgICAgICAgIGZvciB2ZXIgaW4gc2VsZi52ZXJzaW9ucyArIFtzZWxmLm90aGVyX3ZlcnNpb25dOg0KICAgICAgICAgICAgICAgIGluc3RhbGxfYWN0aW9uID0gImluc3RhbGxfc2NyaXB0LiIgKyB2ZXINCiAgICAgICAgICAgICAgICBleGVfcHJvcCA9ICJQWVRIT04iICsgdmVyDQogICAgICAgICAgICAgICAgYWRkX2RhdGEoc2VsZi5kYiwgIkN1c3RvbUFjdGlvbiIsDQogICAgICAgICAgICAgICAgICAgICAgICBbKGluc3RhbGxfYWN0aW9uLCA1MCwgZXhlX3Byb3AsIHNlbGYuaW5zdGFsbF9zY3JpcHRfa2V5KV0pDQogICAgICAgICAgICAgICAgYWRkX2RhdGEoc2VsZi5kYiwgIkluc3RhbGxFeGVjdXRlU2VxdWVuY2UiLA0KICAgICAgICAgICAgICAgICAgICAgICAgWyhpbnN0YWxsX2FjdGlvbiwgIiZQeXRob24lcz0zIiAlIHZlciwgc3RhcnQpXSkNCiAgICAgICAgICAgICAgICBzdGFydCArPSAxDQogICAgICAgICMgWFhYIHByZS1pbnN0YWxsIHNjcmlwdHMgYXJlIGN1cnJlbnRseSByZWZ1c2VkIGluIGZpbmFsaXplX29wdGlvbnMoKQ0KICAgICAgICAjICAgICBidXQgaWYgdGhpcyBmZWF0dXJlIGlzIGNvbXBsZXRlZCwgaXQgd2lsbCBhbHNvIG5lZWQgdG8gYWRkDQogICAgICAgICMgICAgIGVudHJpZXMgZm9yIGVhY2ggdmVyc2lvbiBhcyB0aGUgYWJvdmUgY29kZSBkb2VzDQogICAgICAgIGlmIHNlbGYucHJlX2luc3RhbGxfc2NyaXB0Og0KICAgICAgICAgICAgc2NyaXB0Zm4gPSBvcy5wYXRoLmpvaW4oc2VsZi5iZGlzdF9kaXIsICJwcmVpbnN0YWxsLmJhdCIpDQogICAgICAgICAgICBmID0gb3BlbihzY3JpcHRmbiwgInciKQ0KICAgICAgICAgICAgIyBUaGUgYmF0Y2ggZmlsZSB3aWxsIGJlIGV4ZWN1dGVkIHdpdGggW1BZVEhPTl0sIHNvIHRoYXQgJTENCiAgICAgICAgICAgICMgaXMgdGhlIHBhdGggdG8gdGhlIFB5dGhvbiBpbnRlcnByZXRlcjsgJTAgd2lsbCBiZSB0aGUgcGF0aA0KICAgICAgICAgICAgIyBvZiB0aGUgYmF0Y2ggZmlsZS4NCiAgICAgICAgICAgICMgcmVtID0iIiINCiAgICAgICAgICAgICMgJTEgJTANCiAgICAgICAgICAgICMgZXhpdA0KICAgICAgICAgICAgIyAiIiINCiAgICAgICAgICAgICMgPGFjdHVhbCBzY3JpcHQ+DQogICAgICAgICAgICBmLndyaXRlKCdyZW0gPSIiIlxuJTEgJTBcbmV4aXRcbiIiIlxuJykNCiAgICAgICAgICAgIGYud3JpdGUob3BlbihzZWxmLnByZV9pbnN0YWxsX3NjcmlwdCkucmVhZCgpKQ0KICAgICAgICAgICAgZi5jbG9zZSgpDQogICAgICAgICAgICBhZGRfZGF0YShzZWxmLmRiLCAiQmluYXJ5IiwNCiAgICAgICAgICAgICAgICBbKCJQcmVJbnN0YWxsIiwgbXNpbGliLkJpbmFyeShzY3JpcHRmbikpDQogICAgICAgICAgICAgICAgXSkNCiAgICAgICAgICAgIGFkZF9kYXRhKHNlbGYuZGIsICJDdXN0b21BY3Rpb24iLA0KICAgICAgICAgICAgICAgIFsoIlByZUluc3RhbGwiLCAyLCAiUHJlSW5zdGFsbCIsIE5vbmUpDQogICAgICAgICAgICAgICAgXSkNCiAgICAgICAgICAgIGFkZF9kYXRhKHNlbGYuZGIsICJJbnN0YWxsRXhlY3V0ZVNlcXVlbmNlIiwNCiAgICAgICAgICAgICAgICAgICAgWygiUHJlSW5zdGFsbCIsICJOT1QgSW5zdGFsbGVkIiwgNDUwKV0pDQoNCg0KICAgIGRlZiBhZGRfdWkoc2VsZik6DQogICAgICAgIGRiID0gc2VsZi5kYg0KICAgICAgICB4ID0geSA9IDUwDQogICAgICAgIHcgPSAzNzANCiAgICAgICAgaCA9IDMwMA0KICAgICAgICB0aXRsZSA9ICJbUHJvZHVjdE5hbWVdIFNldHVwIg0KDQogICAgICAgICMgc2VlICJEaWFsb2cgU3R5bGUgQml0cyINCiAgICAgICAgbW9kYWwgPSAzICAgICAgIyB2aXNpYmxlIHwgbW9kYWwNCiAgICAgICAgbW9kZWxlc3MgPSAxICAgIyB2aXNpYmxlDQoNCiAgICAgICAgIyBVSSBjdXN0b21pemF0aW9uIHByb3BlcnRpZXMNCiAgICAgICAgYWRkX2RhdGEoZGIsICJQcm9wZXJ0eSIsDQogICAgICAgICAgICAgICAgICMgU2VlICJEZWZhdWx0VUlGb250IFByb3BlcnR5Ig0KICAgICAgICAgICAgICAgICBbKCJEZWZhdWx0VUlGb250IiwgIkRsZ0ZvbnQ4IiksDQogICAgICAgICAgICAgICAgICAjIFNlZSAiRXJyb3JEaWFsb2cgU3R5bGUgQml0Ig0KICAgICAgICAgICAgICAgICAgKCJFcnJvckRpYWxvZyIsICJFcnJvckRsZyIpLA0KICAgICAgICAgICAgICAgICAgKCJQcm9ncmVzczEiLCAiSW5zdGFsbCIpLCAgICMgbW9kaWZpZWQgaW4gbWFpbnRlbmFuY2UgdHlwZSBkbGcNCiAgICAgICAgICAgICAgICAgICgiUHJvZ3Jlc3MyIiwgImluc3RhbGxzIiksDQogICAgICAgICAgICAgICAgICAoIk1haW50ZW5hbmNlRm9ybV9BY3Rpb24iLCAiUmVwYWlyIiksDQogICAgICAgICAgICAgICAgICAjIHBvc3NpYmxlIHZhbHVlczogQUxMLCBKVVNUTUUNCiAgICAgICAgICAgICAgICAgICgiV2hpY2hVc2VycyIsICJBTEwiKQ0KICAgICAgICAgICAgICAgICBdKQ0KDQogICAgICAgICMgRm9udHMsIHNlZSAiVGV4dFN0eWxlIFRhYmxlIg0KICAgICAgICBhZGRfZGF0YShkYiwgIlRleHRTdHlsZSIsDQogICAgICAgICAgICAgICAgIFsoIkRsZ0ZvbnQ4IiwgIlRhaG9tYSIsIDksIE5vbmUsIDApLA0KICAgICAgICAgICAgICAgICAgKCJEbGdGb250Qm9sZDgiLCAiVGFob21hIiwgOCwgTm9uZSwgMSksICNib2xkDQogICAgICAgICAgICAgICAgICAoIlZlcmRhbmFCb2xkMTAiLCAiVmVyZGFuYSIsIDEwLCBOb25lLCAxKSwNCiAgICAgICAgICAgICAgICAgICgiVmVyZGFuYVJlZDkiLCAiVmVyZGFuYSIsIDksIDI1NSwgMCksDQogICAgICAgICAgICAgICAgIF0pDQoNCiAgICAgICAgIyBVSSBTZXF1ZW5jZXMsIHNlZSAiSW5zdGFsbFVJU2VxdWVuY2UgVGFibGUiLCAiVXNpbmcgYSBTZXF1ZW5jZSBUYWJsZSINCiAgICAgICAgIyBOdW1iZXJzIGluZGljYXRlIHNlcXVlbmNlOyBzZWUgc2VxdWVuY2UucHkgZm9yIGhvdyB0aGVzZSBhY3Rpb24gaW50ZWdyYXRlDQogICAgICAgIGFkZF9kYXRhKGRiLCAiSW5zdGFsbFVJU2VxdWVuY2UiLA0KICAgICAgICAgICAgICAgICBbKCJQcmVwYXJlRGxnIiwgIk5vdCBQcml2aWxlZ2VkIG9yIFdpbmRvd3M5eCBvciBJbnN0YWxsZWQiLCAxNDApLA0KICAgICAgICAgICAgICAgICAgKCJXaGljaFVzZXJzRGxnIiwgIlByaXZpbGVnZWQgYW5kIG5vdCBXaW5kb3dzOXggYW5kIG5vdCBJbnN0YWxsZWQiLCAxNDEpLA0KICAgICAgICAgICAgICAgICAgIyBJbiB0aGUgdXNlciBpbnRlcmZhY2UsIGFzc3VtZSBhbGwtdXNlcnMgaW5zdGFsbGF0aW9uIGlmIHByaXZpbGVnZWQuDQogICAgICAgICAgICAgICAgICAoIlNlbGVjdEZlYXR1cmVzRGxnIiwgIk5vdCBJbnN0YWxsZWQiLCAxMjMwKSwNCiAgICAgICAgICAgICAgICAgICMgWFhYIG5vIHN1cHBvcnQgZm9yIHJlc3VtZSBpbnN0YWxsYXRpb25zIHlldA0KICAgICAgICAgICAgICAgICAgIygiUmVzdW1lRGxnIiwgIkluc3RhbGxlZCBBTkQgKFJFU1VNRSBPUiBQcmVzZWxlY3RlZCkiLCAxMjQwKSwNCiAgICAgICAgICAgICAgICAgICgiTWFpbnRlbmFuY2VUeXBlRGxnIiwgIkluc3RhbGxlZCBBTkQgTk9UIFJFU1VNRSBBTkQgTk9UIFByZXNlbGVjdGVkIiwgMTI1MCksDQogICAgICAgICAgICAgICAgICAoIlByb2dyZXNzRGxnIiwgTm9uZSwgMTI4MCldKQ0KDQogICAgICAgIGFkZF9kYXRhKGRiLCAnQWN0aW9uVGV4dCcsIHRleHQuQWN0aW9uVGV4dCkNCiAgICAgICAgYWRkX2RhdGEoZGIsICdVSVRleHQnLCB0ZXh0LlVJVGV4dCkNCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogICAgICAgICMgU3RhbmRhcmQgZGlhbG9nczogRmF0YWxFcnJvciwgVXNlckV4aXQsIEV4aXREaWFsb2cNCiAgICAgICAgZmF0YWw9UHlEaWFsb2coZGIsICJGYXRhbEVycm9yIiwgeCwgeSwgdywgaCwgbW9kYWwsIHRpdGxlLA0KICAgICAgICAgICAgICAgICAgICAgIkZpbmlzaCIsICJGaW5pc2giLCAiRmluaXNoIikNCiAgICAgICAgZmF0YWwudGl0bGUoIltQcm9kdWN0TmFtZV0gSW5zdGFsbGVyIGVuZGVkIHByZW1hdHVyZWx5IikNCiAgICAgICAgZmF0YWwuYmFjaygiPCBCYWNrIiwgIkZpbmlzaCIsIGFjdGl2ZSA9IDApDQogICAgICAgIGZhdGFsLmNhbmNlbCgiQ2FuY2VsIiwgIkJhY2siLCBhY3RpdmUgPSAwKQ0KICAgICAgICBmYXRhbC50ZXh0KCJEZXNjcmlwdGlvbjEiLCAxNSwgNzAsIDMyMCwgODAsIDB4MzAwMDMsDQogICAgICAgICAgICAgICAgICAgIltQcm9kdWN0TmFtZV0gc2V0dXAgZW5kZWQgcHJlbWF0dXJlbHkgYmVjYXVzZSBvZiBhbiBlcnJvci4gIFlvdXIgc3lzdGVtIGhhcyBub3QgYmVlbiBtb2RpZmllZC4gIFRvIGluc3RhbGwgdGhpcyBwcm9ncmFtIGF0IGEgbGF0ZXIgdGltZSwgcGxlYXNlIHJ1biB0aGUgaW5zdGFsbGF0aW9uIGFnYWluLiIpDQogICAgICAgIGZhdGFsLnRleHQoIkRlc2NyaXB0aW9uMiIsIDE1LCAxNTUsIDMyMCwgMjAsIDB4MzAwMDMsDQogICAgICAgICAgICAgICAgICAgIkNsaWNrIHRoZSBGaW5pc2ggYnV0dG9uIHRvIGV4aXQgdGhlIEluc3RhbGxlci4iKQ0KICAgICAgICBjPWZhdGFsLm5leHQoIkZpbmlzaCIsICJDYW5jZWwiLCBuYW1lPSJGaW5pc2giKQ0KICAgICAgICBjLmV2ZW50KCJFbmREaWFsb2ciLCAiRXhpdCIpDQoNCiAgICAgICAgdXNlcl9leGl0PVB5RGlhbG9nKGRiLCAiVXNlckV4aXQiLCB4LCB5LCB3LCBoLCBtb2RhbCwgdGl0bGUsDQogICAgICAgICAgICAgICAgICAgICAiRmluaXNoIiwgIkZpbmlzaCIsICJGaW5pc2giKQ0KICAgICAgICB1c2VyX2V4aXQudGl0bGUoIltQcm9kdWN0TmFtZV0gSW5zdGFsbGVyIHdhcyBpbnRlcnJ1cHRlZCIpDQogICAgICAgIHVzZXJfZXhpdC5iYWNrKCI8IEJhY2siLCAiRmluaXNoIiwgYWN0aXZlID0gMCkNCiAgICAgICAgdXNlcl9leGl0LmNhbmNlbCgiQ2FuY2VsIiwgIkJhY2siLCBhY3RpdmUgPSAwKQ0KICAgICAgICB1c2VyX2V4aXQudGV4dCgiRGVzY3JpcHRpb24xIiwgMTUsIDcwLCAzMjAsIDgwLCAweDMwMDAzLA0KICAgICAgICAgICAgICAgICAgICJbUHJvZHVjdE5hbWVdIHNldHVwIHdhcyBpbnRlcnJ1cHRlZC4gIFlvdXIgc3lzdGVtIGhhcyBub3QgYmVlbiBtb2RpZmllZC4gICINCiAgICAgICAgICAgICAgICAgICAiVG8gaW5zdGFsbCB0aGlzIHByb2dyYW0gYXQgYSBsYXRlciB0aW1lLCBwbGVhc2UgcnVuIHRoZSBpbnN0YWxsYXRpb24gYWdhaW4uIikNCiAgICAgICAgdXNlcl9leGl0LnRleHQoIkRlc2NyaXB0aW9uMiIsIDE1LCAxNTUsIDMyMCwgMjAsIDB4MzAwMDMsDQogICAgICAgICAgICAgICAgICAgIkNsaWNrIHRoZSBGaW5pc2ggYnV0dG9uIHRvIGV4aXQgdGhlIEluc3RhbGxlci4iKQ0KICAgICAgICBjID0gdXNlcl9leGl0Lm5leHQoIkZpbmlzaCIsICJDYW5jZWwiLCBuYW1lPSJGaW5pc2giKQ0KICAgICAgICBjLmV2ZW50KCJFbmREaWFsb2ciLCAiRXhpdCIpDQoNCiAgICAgICAgZXhpdF9kaWFsb2cgPSBQeURpYWxvZyhkYiwgIkV4aXREaWFsb2ciLCB4LCB5LCB3LCBoLCBtb2RhbCwgdGl0bGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaW5pc2giLCAiRmluaXNoIiwgIkZpbmlzaCIpDQogICAgICAgIGV4aXRfZGlhbG9nLnRpdGxlKCJDb21wbGV0aW5nIHRoZSBbUHJvZHVjdE5hbWVdIEluc3RhbGxlciIpDQogICAgICAgIGV4aXRfZGlhbG9nLmJhY2soIjwgQmFjayIsICJGaW5pc2giLCBhY3RpdmUgPSAwKQ0KICAgICAgICBleGl0X2RpYWxvZy5jYW5jZWwoIkNhbmNlbCIsICJCYWNrIiwgYWN0aXZlID0gMCkNCiAgICAgICAgZXhpdF9kaWFsb2cudGV4dCgiRGVzY3JpcHRpb24iLCAxNSwgMjM1LCAzMjAsIDIwLCAweDMwMDAzLA0KICAgICAgICAgICAgICAgICAgICJDbGljayB0aGUgRmluaXNoIGJ1dHRvbiB0byBleGl0IHRoZSBJbnN0YWxsZXIuIikNCiAgICAgICAgYyA9IGV4aXRfZGlhbG9nLm5leHQoIkZpbmlzaCIsICJDYW5jZWwiLCBuYW1lPSJGaW5pc2giKQ0KICAgICAgICBjLmV2ZW50KCJFbmREaWFsb2ciLCAiUmV0dXJuIikNCg0KICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgICAgICAgIyBSZXF1aXJlZCBkaWFsb2c6IEZpbGVzSW5Vc2UsIEVycm9yRGxnDQogICAgICAgIGludXNlID0gUHlEaWFsb2coZGIsICJGaWxlc0luVXNlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICB4LCB5LCB3LCBoLA0KICAgICAgICAgICAgICAgICAgICAgICAgIDE5LCAgICAgICAgICAgICAgICAjIEtlZXBNb2RlbGVzc3xNb2RhbHxWaXNpYmxlDQogICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgIlJldHJ5IiwgIlJldHJ5IiwgIlJldHJ5IiwgYml0bWFwPUZhbHNlKQ0KICAgICAgICBpbnVzZS50ZXh0KCJUaXRsZSIsIDE1LCA2LCAyMDAsIDE1LCAweDMwMDAzLA0KICAgICAgICAgICAgICAgICAgIHIie1xEbGdGb250Qm9sZDh9RmlsZXMgaW4gVXNlIikNCiAgICAgICAgaW51c2UudGV4dCgiRGVzY3JpcHRpb24iLCAyMCwgMjMsIDI4MCwgMjAsIDB4MzAwMDMsDQogICAgICAgICAgICAgICAiU29tZSBmaWxlcyB0aGF0IG5lZWQgdG8gYmUgdXBkYXRlZCBhcmUgY3VycmVudGx5IGluIHVzZS4iKQ0KICAgICAgICBpbnVzZS50ZXh0KCJUZXh0IiwgMjAsIDU1LCAzMzAsIDUwLCAzLA0KICAgICAgICAgICAgICAgICAgICJUaGUgZm9sbG93aW5nIGFwcGxpY2F0aW9ucyBhcmUgdXNpbmcgZmlsZXMgdGhhdCBuZWVkIHRvIGJlIHVwZGF0ZWQgYnkgdGhpcyBzZXR1cC4gQ2xvc2UgdGhlc2UgYXBwbGljYXRpb25zIGFuZCB0aGVuIGNsaWNrIFJldHJ5IHRvIGNvbnRpbnVlIHRoZSBpbnN0YWxsYXRpb24gb3IgQ2FuY2VsIHRvIGV4aXQgaXQuIikNCiAgICAgICAgaW51c2UuY29udHJvbCgiTGlzdCIsICJMaXN0Qm94IiwgMjAsIDEwNywgMzMwLCAxMzAsIDcsICJGaWxlSW5Vc2VQcm9jZXNzIiwNCiAgICAgICAgICAgICAgICAgICAgICBOb25lLCBOb25lLCBOb25lKQ0KICAgICAgICBjPWludXNlLmJhY2soIkV4aXQiLCAiSWdub3JlIiwgbmFtZT0iRXhpdCIpDQogICAgICAgIGMuZXZlbnQoIkVuZERpYWxvZyIsICJFeGl0IikNCiAgICAgICAgYz1pbnVzZS5uZXh0KCJJZ25vcmUiLCAiUmV0cnkiLCBuYW1lPSJJZ25vcmUiKQ0KICAgICAgICBjLmV2ZW50KCJFbmREaWFsb2ciLCAiSWdub3JlIikNCiAgICAgICAgYz1pbnVzZS5jYW5jZWwoIlJldHJ5IiwgIkV4aXQiLCBuYW1lPSJSZXRyeSIpDQogICAgICAgIGMuZXZlbnQoIkVuZERpYWxvZyIsIlJldHJ5IikNCg0KICAgICAgICAjIFNlZSAiRXJyb3IgRGlhbG9nIi4gU2VlICJJQ0UyMCIgZm9yIHRoZSByZXF1aXJlZCBuYW1lcyBvZiB0aGUgY29udHJvbHMuDQogICAgICAgIGVycm9yID0gRGlhbG9nKGRiLCAiRXJyb3JEbGciLA0KICAgICAgICAgICAgICAgICAgICAgICA1MCwgMTAsIDMzMCwgMTAxLA0KICAgICAgICAgICAgICAgICAgICAgICA2NTU0MywgICAgICAgIyBFcnJvcnxNaW5pbWl6ZXxNb2RhbHxWaXNpYmxlDQogICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLA0KICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3JUZXh0IiwgTm9uZSwgTm9uZSkNCiAgICAgICAgZXJyb3IudGV4dCgiRXJyb3JUZXh0IiwgNTAsOSwyODAsNDgsMywgIiIpDQogICAgICAgICNlcnJvci5jb250cm9sKCJFcnJvckljb24iLCAiSWNvbiIsIDE1LCA5LCAyNCwgMjQsIDUyNDI4ODEsIE5vbmUsICJweS5pY28iLCBOb25lLCBOb25lKQ0KICAgICAgICBlcnJvci5wdXNoYnV0dG9uKCJOIiwxMjAsNzIsODEsMjEsMywiTm8iLE5vbmUpLmV2ZW50KCJFbmREaWFsb2ciLCJFcnJvck5vIikNCiAgICAgICAgZXJyb3IucHVzaGJ1dHRvbigiWSIsMjQwLDcyLDgxLDIxLDMsIlllcyIsTm9uZSkuZXZlbnQoIkVuZERpYWxvZyIsIkVycm9yWWVzIikNCiAgICAgICAgZXJyb3IucHVzaGJ1dHRvbigiQSIsMCw3Miw4MSwyMSwzLCJBYm9ydCIsTm9uZSkuZXZlbnQoIkVuZERpYWxvZyIsIkVycm9yQWJvcnQiKQ0KICAgICAgICBlcnJvci5wdXNoYnV0dG9uKCJDIiw0Miw3Miw4MSwyMSwzLCJDYW5jZWwiLE5vbmUpLmV2ZW50KCJFbmREaWFsb2ciLCJFcnJvckNhbmNlbCIpDQogICAgICAgIGVycm9yLnB1c2hidXR0b24oIkkiLDgxLDcyLDgxLDIxLDMsIklnbm9yZSIsTm9uZSkuZXZlbnQoIkVuZERpYWxvZyIsIkVycm9ySWdub3JlIikNCiAgICAgICAgZXJyb3IucHVzaGJ1dHRvbigiTyIsMTU5LDcyLDgxLDIxLDMsIk9rIixOb25lKS5ldmVudCgiRW5kRGlhbG9nIiwiRXJyb3JPayIpDQogICAgICAgIGVycm9yLnB1c2hidXR0b24oIlIiLDE5OCw3Miw4MSwyMSwzLCJSZXRyeSIsTm9uZSkuZXZlbnQoIkVuZERpYWxvZyIsIkVycm9yUmV0cnkiKQ0KDQogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICAgICAgICAjIEdsb2JhbCAiUXVlcnkgQ2FuY2VsIiBkaWFsb2cNCiAgICAgICAgY2FuY2VsID0gRGlhbG9nKGRiLCAiQ2FuY2VsRGxnIiwgNTAsIDEwLCAyNjAsIDg1LCAzLCB0aXRsZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICJObyIsICJObyIsICJObyIpDQogICAgICAgIGNhbmNlbC50ZXh0KCJUZXh0IiwgNDgsIDE1LCAxOTQsIDMwLCAzLA0KICAgICAgICAgICAgICAgICAgICAiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNhbmNlbCBbUHJvZHVjdE5hbWVdIGluc3RhbGxhdGlvbj8iKQ0KICAgICAgICAjY2FuY2VsLmNvbnRyb2woIkljb24iLCAiSWNvbiIsIDE1LCAxNSwgMjQsIDI0LCA1MjQyODgxLCBOb25lLA0KICAgICAgICAjICAgICAgICAgICAgICAgInB5LmljbyIsIE5vbmUsIE5vbmUpDQogICAgICAgIGM9Y2FuY2VsLnB1c2hidXR0b24oIlllcyIsIDcyLCA1NywgNTYsIDE3LCAzLCAiWWVzIiwgIk5vIikNCiAgICAgICAgYy5ldmVudCgiRW5kRGlhbG9nIiwgIkV4aXQiKQ0KDQogICAgICAgIGM9Y2FuY2VsLnB1c2hidXR0b24oIk5vIiwgMTMyLCA1NywgNTYsIDE3LCAzLCAiTm8iLCAiWWVzIikNCiAgICAgICAgYy5ldmVudCgiRW5kRGlhbG9nIiwgIlJldHVybiIpDQoNCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogICAgICAgICMgR2xvYmFsICJXYWl0IGZvciBjb3N0aW5nIiBkaWFsb2cNCiAgICAgICAgY29zdGluZyA9IERpYWxvZyhkYiwgIldhaXRGb3JDb3N0aW5nRGxnIiwgNTAsIDEwLCAyNjAsIDg1LCBtb2RhbCwgdGl0bGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgIlJldHVybiIsICJSZXR1cm4iLCAiUmV0dXJuIikNCiAgICAgICAgY29zdGluZy50ZXh0KCJUZXh0IiwgNDgsIDE1LCAxOTQsIDMwLCAzLA0KICAgICAgICAgICAgICAgICAgICAgIlBsZWFzZSB3YWl0IHdoaWxlIHRoZSBpbnN0YWxsZXIgZmluaXNoZXMgZGV0ZXJtaW5pbmcgeW91ciBkaXNrIHNwYWNlIHJlcXVpcmVtZW50cy4iKQ0KICAgICAgICBjID0gY29zdGluZy5wdXNoYnV0dG9uKCJSZXR1cm4iLCAxMDIsIDU3LCA1NiwgMTcsIDMsICJSZXR1cm4iLCBOb25lKQ0KICAgICAgICBjLmV2ZW50KCJFbmREaWFsb2ciLCAiRXhpdCIpDQoNCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogICAgICAgICMgUHJlcGFyYXRpb24gZGlhbG9nOiBubyB1c2VyIGlucHV0IGV4Y2VwdCBjYW5jZWxsYXRpb24NCiAgICAgICAgcHJlcCA9IFB5RGlhbG9nKGRiLCAiUHJlcGFyZURsZyIsIHgsIHksIHcsIGgsIG1vZGVsZXNzLCB0aXRsZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICJDYW5jZWwiLCAiQ2FuY2VsIiwgIkNhbmNlbCIpDQogICAgICAgIHByZXAudGV4dCgiRGVzY3JpcHRpb24iLCAxNSwgNzAsIDMyMCwgNDAsIDB4MzAwMDMsDQogICAgICAgICAgICAgICAgICAiUGxlYXNlIHdhaXQgd2hpbGUgdGhlIEluc3RhbGxlciBwcmVwYXJlcyB0byBndWlkZSB5b3UgdGhyb3VnaCB0aGUgaW5zdGFsbGF0aW9uLiIpDQogICAgICAgIHByZXAudGl0bGUoIldlbGNvbWUgdG8gdGhlIFtQcm9kdWN0TmFtZV0gSW5zdGFsbGVyIikNCiAgICAgICAgYz1wcmVwLnRleHQoIkFjdGlvblRleHQiLCAxNSwgMTEwLCAzMjAsIDIwLCAweDMwMDAzLCAiUG9uZGVyaW5nLi4uIikNCiAgICAgICAgYy5tYXBwaW5nKCJBY3Rpb25UZXh0IiwgIlRleHQiKQ0KICAgICAgICBjPXByZXAudGV4dCgiQWN0aW9uRGF0YSIsIDE1LCAxMzUsIDMyMCwgMzAsIDB4MzAwMDMsIE5vbmUpDQogICAgICAgIGMubWFwcGluZygiQWN0aW9uRGF0YSIsICJUZXh0IikNCiAgICAgICAgcHJlcC5iYWNrKCJCYWNrIiwgTm9uZSwgYWN0aXZlPTApDQogICAgICAgIHByZXAubmV4dCgiTmV4dCIsIE5vbmUsIGFjdGl2ZT0wKQ0KICAgICAgICBjPXByZXAuY2FuY2VsKCJDYW5jZWwiLCBOb25lKQ0KICAgICAgICBjLmV2ZW50KCJTcGF3bkRpYWxvZyIsICJDYW5jZWxEbGciKQ0KDQogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICAgICAgICAjIEZlYXR1cmUgKFB5dGhvbiBkaXJlY3RvcnkpIHNlbGVjdGlvbg0KICAgICAgICBzZWxkbGcgPSBQeURpYWxvZyhkYiwgIlNlbGVjdEZlYXR1cmVzRGxnIiwgeCwgeSwgdywgaCwgbW9kYWwsIHRpdGxlLA0KICAgICAgICAgICAgICAgICAgICAgICAgIk5leHQiLCAiTmV4dCIsICJDYW5jZWwiKQ0KICAgICAgICBzZWxkbGcudGl0bGUoIlNlbGVjdCBQeXRob24gSW5zdGFsbGF0aW9ucyIpDQoNCiAgICAgICAgc2VsZGxnLnRleHQoIkhpbnQiLCAxNSwgMzAsIDMwMCwgMjAsIDMsDQogICAgICAgICAgICAgICAgICAgICJTZWxlY3QgdGhlIFB5dGhvbiBsb2NhdGlvbnMgd2hlcmUgJXMgc2hvdWxkIGJlIGluc3RhbGxlZC4iDQogICAgICAgICAgICAgICAgICAgICUgc2VsZi5kaXN0cmlidXRpb24uZ2V0X2Z1bGxuYW1lKCkpDQoNCiAgICAgICAgc2VsZGxnLmJhY2soIjwgQmFjayIsIE5vbmUsIGFjdGl2ZT0wKQ0KICAgICAgICBjID0gc2VsZGxnLm5leHQoIk5leHQgPiIsICJDYW5jZWwiKQ0KICAgICAgICBvcmRlciA9IDENCiAgICAgICAgYy5ldmVudCgiW1RBUkdFVERJUl0iLCAiW1NvdXJjZURpcl0iLCBvcmRlcmluZz1vcmRlcikNCiAgICAgICAgZm9yIHZlcnNpb24gaW4gc2VsZi52ZXJzaW9ucyArIFtzZWxmLm90aGVyX3ZlcnNpb25dOg0KICAgICAgICAgICAgb3JkZXIgKz0gMQ0KICAgICAgICAgICAgYy5ldmVudCgiW1RBUkdFVERJUl0iLCAiW1RBUkdFVERJUiVzXSIgJSB2ZXJzaW9uLA0KICAgICAgICAgICAgICAgICAgICAiRkVBVFVSRV9TRUxFQ1RFRCBBTkQgJlB5dGhvbiVzPTMiICUgdmVyc2lvbiwNCiAgICAgICAgICAgICAgICAgICAgb3JkZXJpbmc9b3JkZXIpDQogICAgICAgIGMuZXZlbnQoIlNwYXduV2FpdERpYWxvZyIsICJXYWl0Rm9yQ29zdGluZ0RsZyIsIG9yZGVyaW5nPW9yZGVyICsgMSkNCiAgICAgICAgYy5ldmVudCgiRW5kRGlhbG9nIiwgIlJldHVybiIsIG9yZGVyaW5nPW9yZGVyICsgMikNCiAgICAgICAgYyA9IHNlbGRsZy5jYW5jZWwoIkNhbmNlbCIsICJGZWF0dXJlcyIpDQogICAgICAgIGMuZXZlbnQoIlNwYXduRGlhbG9nIiwgIkNhbmNlbERsZyIpDQoNCiAgICAgICAgYyA9IHNlbGRsZy5jb250cm9sKCJGZWF0dXJlcyIsICJTZWxlY3Rpb25UcmVlIiwgMTUsIDYwLCAzMDAsIDEyMCwgMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJGRUFUVVJFIiwgTm9uZSwgIlBhdGhFZGl0IiwgTm9uZSkNCiAgICAgICAgYy5ldmVudCgiW0ZFQVRVUkVfU0VMRUNURURdIiwgIjEiKQ0KICAgICAgICB2ZXIgPSBzZWxmLm90aGVyX3ZlcnNpb24NCiAgICAgICAgaW5zdGFsbF9vdGhlcl9jb25kID0gIkZFQVRVUkVfU0VMRUNURUQgQU5EICZQeXRob24lcz0zIiAlIHZlcg0KICAgICAgICBkb250X2luc3RhbGxfb3RoZXJfY29uZCA9ICJGRUFUVVJFX1NFTEVDVEVEIEFORCAmUHl0aG9uJXM8PjMiICUgdmVyDQoNCiAgICAgICAgYyA9IHNlbGRsZy50ZXh0KCJPdGhlciIsIDE1LCAyMDAsIDMwMCwgMTUsIDMsDQogICAgICAgICAgICAgICAgICAgICAgICAiUHJvdmlkZSBhbiBhbHRlcm5hdGUgUHl0aG9uIGxvY2F0aW9uIikNCiAgICAgICAgYy5jb25kaXRpb24oIkVuYWJsZSIsIGluc3RhbGxfb3RoZXJfY29uZCkNCiAgICAgICAgYy5jb25kaXRpb24oIlNob3ciLCBpbnN0YWxsX290aGVyX2NvbmQpDQogICAgICAgIGMuY29uZGl0aW9uKCJEaXNhYmxlIiwgZG9udF9pbnN0YWxsX290aGVyX2NvbmQpDQogICAgICAgIGMuY29uZGl0aW9uKCJIaWRlIiwgZG9udF9pbnN0YWxsX290aGVyX2NvbmQpDQoNCiAgICAgICAgYyA9IHNlbGRsZy5jb250cm9sKCJQYXRoRWRpdCIsICJQYXRoRWRpdCIsIDE1LCAyMTUsIDMwMCwgMTYsIDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiVEFSR0VURElSIiArIHZlciwgTm9uZSwgIk5leHQiLCBOb25lKQ0KICAgICAgICBjLmNvbmRpdGlvbigiRW5hYmxlIiwgaW5zdGFsbF9vdGhlcl9jb25kKQ0KICAgICAgICBjLmNvbmRpdGlvbigiU2hvdyIsIGluc3RhbGxfb3RoZXJfY29uZCkNCiAgICAgICAgYy5jb25kaXRpb24oIkRpc2FibGUiLCBkb250X2luc3RhbGxfb3RoZXJfY29uZCkNCiAgICAgICAgYy5jb25kaXRpb24oIkhpZGUiLCBkb250X2luc3RhbGxfb3RoZXJfY29uZCkNCg0KICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgICAgICAgIyBEaXNrIGNvc3QNCiAgICAgICAgY29zdCA9IFB5RGlhbG9nKGRiLCAiRGlza0Nvc3REbGciLCB4LCB5LCB3LCBoLCBtb2RhbCwgdGl0bGUsDQogICAgICAgICAgICAgICAgICAgICAgICAiT0siLCAiT0siLCAiT0siLCBiaXRtYXA9RmFsc2UpDQogICAgICAgIGNvc3QudGV4dCgiVGl0bGUiLCAxNSwgNiwgMjAwLCAxNSwgMHgzMDAwMywNCiAgICAgICAgICAgICAgICAgICJ7XERsZ0ZvbnRCb2xkOH1EaXNrIFNwYWNlIFJlcXVpcmVtZW50cyIpDQogICAgICAgIGNvc3QudGV4dCgiRGVzY3JpcHRpb24iLCAyMCwgMjAsIDI4MCwgMjAsIDB4MzAwMDMsDQogICAgICAgICAgICAgICAgICAiVGhlIGRpc2sgc3BhY2UgcmVxdWlyZWQgZm9yIHRoZSBpbnN0YWxsYXRpb24gb2YgdGhlIHNlbGVjdGVkIGZlYXR1cmVzLiIpDQogICAgICAgIGNvc3QudGV4dCgiVGV4dCIsIDIwLCA1MywgMzMwLCA2MCwgMywNCiAgICAgICAgICAgICAgICAgICJUaGUgaGlnaGxpZ2h0ZWQgdm9sdW1lcyAoaWYgYW55KSBkbyBub3QgaGF2ZSBlbm91Z2ggZGlzayBzcGFjZSAiDQogICAgICAgICAgICAgICJhdmFpbGFibGUgZm9yIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZmVhdHVyZXMuICBZb3UgY2FuIGVpdGhlciAiDQogICAgICAgICAgICAgICJyZW1vdmUgc29tZSBmaWxlcyBmcm9tIHRoZSBoaWdobGlnaHRlZCB2b2x1bWVzLCBvciBjaG9vc2UgdG8gIg0KICAgICAgICAgICAgICAiaW5zdGFsbCBsZXNzIGZlYXR1cmVzIG9udG8gbG9jYWwgZHJpdmUocyksIG9yIHNlbGVjdCBkaWZmZXJlbnQgIg0KICAgICAgICAgICAgICAiZGVzdGluYXRpb24gZHJpdmUocykuIikNCiAgICAgICAgY29zdC5jb250cm9sKCJWb2x1bWVMaXN0IiwgIlZvbHVtZUNvc3RMaXN0IiwgMjAsIDEwMCwgMzMwLCAxNTAsIDM5MzIyMywNCiAgICAgICAgICAgICAgICAgICAgIE5vbmUsICJ7MTIwfXs3MH17NzB9ezcwfXs3MH0iLCBOb25lLCBOb25lKQ0KICAgICAgICBjb3N0LnhidXR0b24oIk9LIiwgIk9rIiwgTm9uZSwgMC41KS5ldmVudCgiRW5kRGlhbG9nIiwgIlJldHVybiIpDQoNCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogICAgICAgICMgV2hpY2hVc2VycyBEaWFsb2cuIE9ubHkgYXZhaWxhYmxlIG9uIE5ULCBhbmQgZm9yIHByaXZpbGVnZWQgdXNlcnMuDQogICAgICAgICMgVGhpcyBtdXN0IGJlIHJ1biBiZWZvcmUgRmluZFJlbGF0ZWRQcm9kdWN0cywgYmVjYXVzZSB0aGF0IHdpbGwNCiAgICAgICAgIyB0YWtlIGludG8gYWNjb3VudCB3aGV0aGVyIHRoZSBwcmV2aW91cyBpbnN0YWxsYXRpb24gd2FzIHBlci11c2VyDQogICAgICAgICMgb3IgcGVyLW1hY2hpbmUuIFdlIGN1cnJlbnRseSBkb24ndCBzdXBwb3J0IGdvaW5nIGJhY2sgdG8gdGhpcw0KICAgICAgICAjIGRpYWxvZyBhZnRlciAiTmV4dCIgd2FzIHNlbGVjdGVkOyB0byBzdXBwb3J0IHRoaXMsIHdlIHdvdWxkIG5lZWQgdG8NCiAgICAgICAgIyBmaW5kIGhvdyB0byByZXNldCB0aGUgQUxMVVNFUlMgcHJvcGVydHksIGFuZCBob3cgdG8gcmUtcnVuDQogICAgICAgICMgRmluZFJlbGF0ZWRQcm9kdWN0cy4NCiAgICAgICAgIyBPbiBXaW5kb3dzOXgsIHRoZSBBTExVU0VSUyBwcm9wZXJ0eSBpcyBpZ25vcmVkIG9uIHRoZSBjb21tYW5kIGxpbmUNCiAgICAgICAgIyBhbmQgaW4gdGhlIFByb3BlcnR5IHRhYmxlLCBidXQgaW5zdGFsbGVyIGZhaWxzIGFjY29yZGluZyB0byB0aGUgZG9jdW1lbnRhdGlvbg0KICAgICAgICAjIGlmIGEgZGlhbG9nIGF0dGVtcHRzIHRvIHNldCBBTExVU0VSUy4NCiAgICAgICAgd2hpY2h1c2VycyA9IFB5RGlhbG9nKGRiLCAiV2hpY2hVc2Vyc0RsZyIsIHgsIHksIHcsIGgsIG1vZGFsLCB0aXRsZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWRtaW5JbnN0YWxsIiwgIk5leHQiLCAiQ2FuY2VsIikNCiAgICAgICAgd2hpY2h1c2Vycy50aXRsZSgiU2VsZWN0IHdoZXRoZXIgdG8gaW5zdGFsbCBbUHJvZHVjdE5hbWVdIGZvciBhbGwgdXNlcnMgb2YgdGhpcyBjb21wdXRlci4iKQ0KICAgICAgICAjIEEgcmFkaW8gZ3JvdXAgd2l0aCB0d28gb3B0aW9uczogYWxsdXNlcnMsIGp1c3RtZQ0KICAgICAgICBnID0gd2hpY2h1c2Vycy5yYWRpb2dyb3VwKCJBZG1pbkluc3RhbGwiLCAxNSwgNjAsIDI2MCwgNTAsIDMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldoaWNoVXNlcnMiLCAiIiwgIk5leHQiKQ0KICAgICAgICBnLmFkZCgiQUxMIiwgMCwgNSwgMTUwLCAyMCwgIkluc3RhbGwgZm9yIGFsbCB1c2VycyIpDQogICAgICAgIGcuYWRkKCJKVVNUTUUiLCAwLCAyNSwgMTUwLCAyMCwgIkluc3RhbGwganVzdCBmb3IgbWUiKQ0KDQogICAgICAgIHdoaWNodXNlcnMuYmFjaygiQmFjayIsIE5vbmUsIGFjdGl2ZT0wKQ0KDQogICAgICAgIGMgPSB3aGljaHVzZXJzLm5leHQoIk5leHQgPiIsICJDYW5jZWwiKQ0KICAgICAgICBjLmV2ZW50KCJbQUxMVVNFUlNdIiwgIjEiLCAnV2hpY2hVc2Vycz0iQUxMIicsIDEpDQogICAgICAgIGMuZXZlbnQoIkVuZERpYWxvZyIsICJSZXR1cm4iLCBvcmRlcmluZyA9IDIpDQoNCiAgICAgICAgYyA9IHdoaWNodXNlcnMuY2FuY2VsKCJDYW5jZWwiLCAiQWRtaW5JbnN0YWxsIikNCiAgICAgICAgYy5ldmVudCgiU3Bhd25EaWFsb2ciLCAiQ2FuY2VsRGxnIikNCg0KICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgICAgICAgIyBJbnN0YWxsYXRpb24gUHJvZ3Jlc3MgZGlhbG9nIChtb2RlbGVzcykNCiAgICAgICAgcHJvZ3Jlc3MgPSBQeURpYWxvZyhkYiwgIlByb2dyZXNzRGxnIiwgeCwgeSwgdywgaCwgbW9kZWxlc3MsIHRpdGxlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW5jZWwiLCAiQ2FuY2VsIiwgIkNhbmNlbCIsIGJpdG1hcD1GYWxzZSkNCiAgICAgICAgcHJvZ3Jlc3MudGV4dCgiVGl0bGUiLCAyMCwgMTUsIDIwMCwgMTUsIDB4MzAwMDMsDQogICAgICAgICAgICAgICAgICAgICAgIntcRGxnRm9udEJvbGQ4fVtQcm9ncmVzczFdIFtQcm9kdWN0TmFtZV0iKQ0KICAgICAgICBwcm9ncmVzcy50ZXh0KCJUZXh0IiwgMzUsIDY1LCAzMDAsIDMwLCAzLA0KICAgICAgICAgICAgICAgICAgICAgICJQbGVhc2Ugd2FpdCB3aGlsZSB0aGUgSW5zdGFsbGVyIFtQcm9ncmVzczJdIFtQcm9kdWN0TmFtZV0uICINCiAgICAgICAgICAgICAgICAgICAgICAiVGhpcyBtYXkgdGFrZSBzZXZlcmFsIG1pbnV0ZXMuIikNCiAgICAgICAgcHJvZ3Jlc3MudGV4dCgiU3RhdHVzTGFiZWwiLCAzNSwgMTAwLCAzNSwgMjAsIDMsICJTdGF0dXM6IikNCg0KICAgICAgICBjPXByb2dyZXNzLnRleHQoIkFjdGlvblRleHQiLCA3MCwgMTAwLCB3LTcwLCAyMCwgMywgIlBvbmRlcmluZy4uLiIpDQogICAgICAgIGMubWFwcGluZygiQWN0aW9uVGV4dCIsICJUZXh0IikNCg0KICAgICAgICAjYz1wcm9ncmVzcy50ZXh0KCJBY3Rpb25EYXRhIiwgMzUsIDE0MCwgMzAwLCAyMCwgMywgTm9uZSkNCiAgICAgICAgI2MubWFwcGluZygiQWN0aW9uRGF0YSIsICJUZXh0IikNCg0KICAgICAgICBjPXByb2dyZXNzLmNvbnRyb2woIlByb2dyZXNzQmFyIiwgIlByb2dyZXNzQmFyIiwgMzUsIDEyMCwgMzAwLCAxMCwgNjU1MzcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lLCAiUHJvZ3Jlc3MgZG9uZSIsIE5vbmUsIE5vbmUpDQogICAgICAgIGMubWFwcGluZygiU2V0UHJvZ3Jlc3MiLCAiUHJvZ3Jlc3MiKQ0KDQogICAgICAgIHByb2dyZXNzLmJhY2soIjwgQmFjayIsICJOZXh0IiwgYWN0aXZlPUZhbHNlKQ0KICAgICAgICBwcm9ncmVzcy5uZXh0KCJOZXh0ID4iLCAiQ2FuY2VsIiwgYWN0aXZlPUZhbHNlKQ0KICAgICAgICBwcm9ncmVzcy5jYW5jZWwoIkNhbmNlbCIsICJCYWNrIikuZXZlbnQoIlNwYXduRGlhbG9nIiwgIkNhbmNlbERsZyIpDQoNCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICAgICAgICAjIE1haW50ZW5hbmNlIHR5cGU6IHJlcGFpci91bmluc3RhbGwNCiAgICAgICAgbWFpbnQgPSBQeURpYWxvZyhkYiwgIk1haW50ZW5hbmNlVHlwZURsZyIsIHgsIHksIHcsIGgsIG1vZGFsLCB0aXRsZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAiTmV4dCIsICJOZXh0IiwgIkNhbmNlbCIpDQogICAgICAgIG1haW50LnRpdGxlKCJXZWxjb21lIHRvIHRoZSBbUHJvZHVjdE5hbWVdIFNldHVwIFdpemFyZCIpDQogICAgICAgIG1haW50LnRleHQoIkJvZHlUZXh0IiwgMTUsIDYzLCAzMzAsIDQyLCAzLA0KICAgICAgICAgICAgICAgICAgICJTZWxlY3Qgd2hldGhlciB5b3Ugd2FudCB0byByZXBhaXIgb3IgcmVtb3ZlIFtQcm9kdWN0TmFtZV0uIikNCiAgICAgICAgZz1tYWludC5yYWRpb2dyb3VwKCJSZXBhaXJSYWRpb0dyb3VwIiwgMTUsIDEwOCwgMzMwLCA2MCwgMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWFpbnRlbmFuY2VGb3JtX0FjdGlvbiIsICIiLCAiTmV4dCIpDQogICAgICAgICNnLmFkZCgiQ2hhbmdlIiwgMCwgMCwgMjAwLCAxNywgIiZDaGFuZ2UgW1Byb2R1Y3ROYW1lXSIpDQogICAgICAgIGcuYWRkKCJSZXBhaXIiLCAwLCAxOCwgMjAwLCAxNywgIiZSZXBhaXIgW1Byb2R1Y3ROYW1lXSIpDQogICAgICAgIGcuYWRkKCJSZW1vdmUiLCAwLCAzNiwgMjAwLCAxNywgIlJlJm1vdmUgW1Byb2R1Y3ROYW1lXSIpDQoNCiAgICAgICAgbWFpbnQuYmFjaygiPCBCYWNrIiwgTm9uZSwgYWN0aXZlPUZhbHNlKQ0KICAgICAgICBjPW1haW50Lm5leHQoIkZpbmlzaCIsICJDYW5jZWwiKQ0KICAgICAgICAjIENoYW5nZSBpbnN0YWxsYXRpb246IENoYW5nZSBwcm9ncmVzcyBkaWFsb2cgdG8gIkNoYW5nZSIsIHRoZW4gYXNrDQogICAgICAgICMgZm9yIGZlYXR1cmUgc2VsZWN0aW9uDQogICAgICAgICNjLmV2ZW50KCJbUHJvZ3Jlc3MxXSIsICJDaGFuZ2UiLCAnTWFpbnRlbmFuY2VGb3JtX0FjdGlvbj0iQ2hhbmdlIicsIDEpDQogICAgICAgICNjLmV2ZW50KCJbUHJvZ3Jlc3MyXSIsICJjaGFuZ2VzIiwgJ01haW50ZW5hbmNlRm9ybV9BY3Rpb249IkNoYW5nZSInLCAyKQ0KDQogICAgICAgICMgUmVpbnN0YWxsOiBDaGFuZ2UgcHJvZ3Jlc3MgZGlhbG9nIHRvICJSZXBhaXIiLCB0aGVuIGludm9rZSByZWluc3RhbGwNCiAgICAgICAgIyBBbHNvIHNldCBsaXN0IG9mIHJlaW5zdGFsbGVkIGZlYXR1cmVzIHRvICJBTEwiDQogICAgICAgIGMuZXZlbnQoIltSRUlOU1RBTExdIiwgIkFMTCIsICdNYWludGVuYW5jZUZvcm1fQWN0aW9uPSJSZXBhaXIiJywgNSkNCiAgICAgICAgYy5ldmVudCgiW1Byb2dyZXNzMV0iLCAiUmVwYWlyaW5nIiwgJ01haW50ZW5hbmNlRm9ybV9BY3Rpb249IlJlcGFpciInLCA2KQ0KICAgICAgICBjLmV2ZW50KCJbUHJvZ3Jlc3MyXSIsICJyZXBhaXJzIiwgJ01haW50ZW5hbmNlRm9ybV9BY3Rpb249IlJlcGFpciInLCA3KQ0KICAgICAgICBjLmV2ZW50KCJSZWluc3RhbGwiLCAiQUxMIiwgJ01haW50ZW5hbmNlRm9ybV9BY3Rpb249IlJlcGFpciInLCA4KQ0KDQogICAgICAgICMgVW5pbnN0YWxsOiBDaGFuZ2UgcHJvZ3Jlc3MgdG8gIlJlbW92ZSIsIHRoZW4gaW52b2tlIHVuaW5zdGFsbA0KICAgICAgICAjIEFsc28gc2V0IGxpc3Qgb2YgcmVtb3ZlZCBmZWF0dXJlcyB0byAiQUxMIg0KICAgICAgICBjLmV2ZW50KCJbUkVNT1ZFXSIsICJBTEwiLCAnTWFpbnRlbmFuY2VGb3JtX0FjdGlvbj0iUmVtb3ZlIicsIDExKQ0KICAgICAgICBjLmV2ZW50KCJbUHJvZ3Jlc3MxXSIsICJSZW1vdmluZyIsICdNYWludGVuYW5jZUZvcm1fQWN0aW9uPSJSZW1vdmUiJywgMTIpDQogICAgICAgIGMuZXZlbnQoIltQcm9ncmVzczJdIiwgInJlbW92ZXMiLCAnTWFpbnRlbmFuY2VGb3JtX0FjdGlvbj0iUmVtb3ZlIicsIDEzKQ0KICAgICAgICBjLmV2ZW50KCJSZW1vdmUiLCAiQUxMIiwgJ01haW50ZW5hbmNlRm9ybV9BY3Rpb249IlJlbW92ZSInLCAxNCkNCg0KICAgICAgICAjIENsb3NlIGRpYWxvZyB3aGVuIG1haW50ZW5hbmNlIGFjdGlvbiBzY2hlZHVsZWQNCiAgICAgICAgYy5ldmVudCgiRW5kRGlhbG9nIiwgIlJldHVybiIsICdNYWludGVuYW5jZUZvcm1fQWN0aW9uPD4iQ2hhbmdlIicsIDIwKQ0KICAgICAgICAjYy5ldmVudCgiTmV3RGlhbG9nIiwgIlNlbGVjdEZlYXR1cmVzRGxnIiwgJ01haW50ZW5hbmNlRm9ybV9BY3Rpb249IkNoYW5nZSInLCAyMSkNCg0KICAgICAgICBtYWludC5jYW5jZWwoIkNhbmNlbCIsICJSZXBhaXJSYWRpb0dyb3VwIikuZXZlbnQoIlNwYXduRGlhbG9nIiwgIkNhbmNlbERsZyIpDQoNCiAgICBkZWYgZ2V0X2luc3RhbGxlcl9maWxlbmFtZShzZWxmLCBmdWxsbmFtZSk6DQogICAgICAgICMgRmFjdG9yZWQgb3V0IHRvIGFsbG93IG92ZXJyaWRpbmcgaW4gc3ViY2xhc3Nlcw0KICAgICAgICBpZiBzZWxmLnRhcmdldF92ZXJzaW9uOg0KICAgICAgICAgICAgYmFzZV9uYW1lID0gIiVzLiVzLXB5JXMubXNpIiAlIChmdWxsbmFtZSwgc2VsZi5wbGF0X25hbWUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGFyZ2V0X3ZlcnNpb24pDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBiYXNlX25hbWUgPSAiJXMuJXMubXNpIiAlIChmdWxsbmFtZSwgc2VsZi5wbGF0X25hbWUpDQogICAgICAgIGluc3RhbGxlcl9uYW1lID0gb3MucGF0aC5qb2luKHNlbGYuZGlzdF9kaXIsIGJhc2VfbmFtZSkNCiAgICAgICAgcmV0dXJuIGluc3RhbGxlcl9uYW1lDQo=