IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojICAgICAgICAgICAgICAgICAgICAgICBDQURFTkNFIENPUFlSSUdIVCBOT1RJQ0UKIyAgICAgICAgIKkgMjAwOC0yMDEzIENhZGVuY2UgRGVzaWduIFN5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBGb3VuZGF0aW9uIEZsb3cgaXMgcHJvdmlkZWQgYXMgYW4gZXhhbXBsZSBvZiBob3cgdG8gcGVyZm9ybSBzcGVjaWFsaXplZAojIHRhc2tzLgojCiMgVGhpcyB3b3JrIG1heSBub3QgYmUgY29waWVkLCByZS1wdWJsaXNoZWQsIHVwbG9hZGVkLCBvciBkaXN0cmlidXRlZCBpbiBhbnkgd2F5LAojIGluIGFueSBtZWRpdW0sIHdoZXRoZXIgaW4gd2hvbGUgb3IgaW4gcGFydCwgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24KIyBmcm9tIENhZGVuY2UuIE5vdHdpdGhzdGFuZGluZyBhbnkgcmVzdHJpY3Rpb25zIGhlcmVpbiwgc3ViamVjdCB0byBjb21wbGlhbmNlCiMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENhZGVuY2Ugc29mdHdhcmUgbGljZW5zZSBhZ3JlZW1lbnQgdW5kZXIKIyB3aGljaCB0aGlzIG1hdGVyaWFsIHdhcyBwcm92aWRlZCwgdGhpcyBtYXRlcmlhbCBtYXkgYmUgY29waWVkIGFuZCBpbnRlcm5hbGx5CiMgZGlzdHJpYnV0ZWQgc29sZWx5IGZvciBpbnRlcm5hbCBwdXJwb3NlcyBmb3IgdXNlIHdpdGggQ2FkZW5jZSB0b29scy4KIwojIFRoaXMgd29yayBpcyBDYWRlbmNlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBhbmQgbWF5IHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgYmUKIyBnaXZlbiB0byB0aGlyZCBwYXJ0aWVzLCBuZWl0aGVyIGluIG9yaWdpbmFsIG5vciBpbiBtb2RpZmllZCB2ZXJzaW9ucywgd2l0aG91dAojIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbiBmcm9tIENhZGVuY2UuIFRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQgaGVyZWluIGlzCiMgdGhlIHByb3ByaWV0YXJ5IGFuZCBjb25maWRlbnRpYWwgaW5mb3JtYXRpb24gb2YgQ2FkZW5jZSBvciBpdHMgbGljZW5zb3JzLCBhbmQKIyBpcyBzdXBwbGllZCBzdWJqZWN0IHRvLCBhbmQgbWF5IGJlIHVzZWQgb25seSBieSBDYWRlbmNlJ3MgY3VycmVudCBjdXN0b21lcnMKIyBpbiBhY2NvcmRhbmNlIHdpdGgsIGEgcHJldmlvdXNseSBleGVjdXRlZCBsaWNlbnNlIGFncmVlbWVudCBiZXR3ZWVuIENhZGVuY2UKIyBhbmQgaXRzIGN1c3RvbWVyLgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBUSElTIE1BVEVSSUFMIElTIFBST1ZJREVEIEJZIENBREVOQ0UgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAojIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiMgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KIyBJTiBOTyBFVkVOVCBTSEFMTCBDQURFTkNFIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwKIyBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAojIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgojIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgIE1BVEVSSUFMLCBFVkVOIElGCiMgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCnBhY2thZ2UgcHJvdmlkZSBmb3VuZGF0aW9uX2Zsb3cgMS4wCgpuYW1lc3BhY2UgZXZhbCBGRk1NOjogewoKICAgc2V0IHZhbGlkTW9kZXMgW2xpc3QgImZsYXQiICJoaWVyIiAidG9wX2Rvd24iICJib3R0b21fdXAiICJ1c2VyIl0KCiAgIHNldCBtaXNzaW5nRmlsZXMgIjxGRj4gRVJST1I6IENvdWxkIG5vdCBmaW5kIEZvdW5kYXRpb24gRmxvdyBzY3JpcHQgZmlsZXMgaW4gZGlyZWN0b3J5IFwiJXNcIiIKCiAgIHNldCBtaXNzaW5nU2V0dXBGaWxlICI8RkY+IEVSUk9SOiBDb3VsZCBub3QgZmluZCBzZXR1cC50Y2wgaW4gZGlyZWN0b3J5IFwiJXNcIiIKCiAgIHNldCBtaXNzaW5nUkMgIjxGRj4gRVJST1I6IENvdWxkIG5vdCBmaW5kICdyYycgZXhlY3V0YWJsZSIKCiAgIHNldCBub01vZGUgIjxGRj4gRVJST1I6IFwiLW1cIiBvcHRpb24gc3BlY2lmaWVkIHdpdGhvdXQgYSBydW50aW1lIG1vZGUiCgogICBzZXQgbm9GbGF0ICI8RkY+IEVSUk9SOiBcIi1mXCIgb3B0aW9uIHNwZWNpZmllZCB3aXRob3V0IGEgdmFsaWQgb3B0aW9uIgoKICAgc2V0IG5vVmVyc2lvbiAiPEZGPiBFUlJPUjogXCItdlwiIG9wdGlvbiBzcGVjaWZpZWQgd2l0aG91dCBhIHZhbGlkIG9wdGlvbiIKCiAgIHNldCBub1BhdGggIjxGRj4gRVJST1I6IFwiLWRcIiBvcHRpb24gc3BlY2lmaWVkIHdpdGhvdXQgYSBkaXJlY3RvcnkgcGF0aCIKCiAgIHNldCBub1N0eWxlICI8RkY+IEVSUk9SOiBcIi15XCIgb3B0aW9uIHNwZWNpZmllZCB3aXRob3V0IGEgc3R5bGUgb3B0aW9uIFxbZGF0ZXxpbmNyZW1lbnRcXSIKCiAgIHNldCBub1J1bmRpciAiPEZGPiBFUlJPUjogXCItdVwiIG9wdGlvbiBzcGVjaWZpZWQgd2l0aG91dCBhIGRpcmVjdG9yeSBwYXRoIgoKICAgc2V0IG5vU2V0dXBQYXRoICI8RkY+IEVSUk9SOiBcIi1zXCIgb3B0aW9uIHNwZWNpZmllZCB3aXRob3V0IGEgZGlyZWN0b3J5IHBhdGgiCgogICBzZXQgbm9BcHBsZXRQYXRoICI8RkY+IEVSUk9SOiBcIi1hXCIgb3B0aW9uIHNwZWNpZmllZCB3aXRob3V0IGEgZGlyZWN0b3J5IHBhdGgiCgogICBzZXQgbm9zeW50aF9mbG93ICI8RkY+IFdBUk5JTkc6IFwiLXJcIiBvcHRpb24gc3BlY2lmaWVkIHdpdGhvdXQgYSBzeW50aGVzaXMgZmxvdyIKCiAgIHNldCBub1N1Y2hQYXRoICI8RkY+IEVSUk9SOiBEaXJlY3RvcnkgcGF0aCBcIiVzXCIgbm90IGZvdW5kLiIKCiAgIHNldCB1bmtub3duTW9kZSAiPEZGPiBFUlJPUjogVW5rbm93biBydW50aW1lIG1vZGUgc3BlY2lmaWVkIFwiJXNcIiAiCgogICBzZXQgdW5rbm93bk9wdGlvbiAiPEZGPiBFUlJPUjogVW5yZWNvZ25pemVkIG9wdGlvbiBcIiVzXCIgIgoKICAgCiAgIHNldCB1c2FnZSAiClVzYWdlOiB0Y2xzaCA8cGF0aF90bz4vU0NSSVBUUy9nZW5fZmxvdy50Y2wgPG9wdGlvbnM+IHN0ZXAgP3N0ZXA/IC4uLiA/c3RlcD8KICAgVGhlIFwic3RlcFwiIGlzIHRoZSBwb3J0aW9uIG9mIHRoZSBmbG93IHRoYXQgeW91IHdhbnQgdG8gZXhlY3V0ZS4gIFRvIGZpbmQKICAgdGhlIHZhbGlkIGxpc3Qgb2Ygc3RlcHMgZm9yIGEgZ2l2ZW4gbW9kZSwgc2ltcGx5IG9taXQgdGhlIHN0ZXAgZnJvbSB0aGUKICAgY29tbWFuZC1saW5lIGludm9jYXRpb24uICBZb3UgY2FuIGFsc28gc3BlY2lmeSBzdGVwIGFzIGVpdGhlciBvZiB0aGUgdHdvCiAgIGZvcm1zOgogICAgICAgYS1iIDogRXhlY3V0ZSBhbGwgc3RlcHMgYmV0d2VlbiBzdGVwIGEgYW5kIGIsIGluY2x1c2l2ZQogICAgICAgYS0gIDogRXhlY3V0ZSBhbGwgc3RlcHMgaW4gdGhlIGZsb3cgZnJvbSBzdGVwIGEsIGluY2x1c2l2ZQogICBPYnZpb3VzbHksIFwiYVwiIGFuZCBcImJcIiBzaG91bGQgYmUgdmFsaWQgc3RlcHMgZm9yIHRoZSBzcGVjaWZpYyBtb2RlLgoKICAgT3B0aW9ucyBtYXkgYmUgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZzoKICAgICAtaCB8IC0taGVscCAgICAgOiBQcmludCB0aGlzIG1lc3NhZ2UKICAgICAtSCB8IC0tSGVscCAgICAgOiBQcmludCBzdGVwIGhlbHAKICAgICAtbSB8IC0tbW9kZSAgICAgOiBTZXQgdGhlIHNjcmlwdCBtb2RlLiAgVGhlIGRlZmF1bHQgaXMgXCJmbGF0XCIuCiAgICAgICAgICAgICAgICAgICAgICAgVmFsaWQgbW9kZXMgYXJlOiAkdmFsaWRNb2RlcwogICAgIC1kIHwgLS1kaXIgICAgICA6IE91dHB1dCBkaXJlY3RvcnkgZm9yIGdlbmVyYXRlZCBzY3JpcHRzLgogICAgIC1mIHwgLS1mbGF0ICAgICA6IExldmVsIG9mIHVucm9sbGluZyAuLi4gZnVsbCwgcGFydGlhbCwgbm9uZQogICAgIC1uIHwgLS1ub21ha2UgICA6IFNraXAgTWFrZWZpbGUgZ2VuZXJhdGlvbgogICAgIC15IHwgLS1zdHlsZSAgICA6IFJ1bmRpciBuYW1pbmcgc3R5bGUgXFtkYXRlfGluY3JlbWVudFxdCiAgICAgLXIgfCAtLXJ0bCAgICAgIDogRW5hYmxlIFJUTCBTY3JpcHQgR2VuZXJhdGlvbgogICAgIC1OIHwgLS1Ob3Z1cyAgOiBFbmFibGUgbm92dXNfdWkgZmxvd2tpdCBnZW5lcmF0aW9uCiAgICAgLXMgfCAtLXNldHVwICAgIDogUHJvdmlkZSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHNldHVwLnRjbCBzZXR1cCBmaWxlCiAgICAgLXUgfCAtLXJ1bmRpciAgIDogRGlyZWN0b3J5IHRvIGV4ZWN1dGUgdGhlIGZsb3cKICAgICAgICAgICAgICAgICAgICAgICByZXF1cmllZCB0byBydW4gdGhlIEZvdW5kYXRpb24gRmxvdy4gIAogICAgIC12IHwgLS12ZXJzaW9uICA6IFRhcmdldCB2ZXJzaW9uICgxNy4xLjAsIDE2LjIuMCwgMTYuMS4wLCAxNS4yLjAsIDE1LjEuMCwgLi4uKQogICAgIC1WIHwgLS1WZXJib3NlICA6IFZlcmJvc2UgbW9kZQoKICAgIEV4YW1wbGVzOgogICAgLS0tLS0tLS0tCgogICAgdGNsc2ggU0NSSVBUUy9nZW5faW5ub3Z1c19mbG93LnRjbCBhbGwKCiAgICB0Y2xzaCBTQ1JJUFRTL2dlbl9pbm5vdnVzX2Zsb3cudGNsIC1tIHRvcF9kb3duIGFsbAoKICAgIHRjbHNoIFNDUklQVFMvZ2VuX2lubm92dXNfZmxvdy50Y2wgLWQgcHJlY3RzX3NjcmlwdHMgaW5pdC1wcmVjdHMKCiAgICB0Y2xzaCBTQ1JJUFRTL2dlbl9pbm5vdnVzX2Zsb3cudGNsIC11IHdvcmsvcnVuIC15IGRhdGUgLXIgZGVmYXVsdF9zeW50aGVzaXNfZmxvd18zc3RlcCBhbGwKCiIKfQoKbmFtZXNwYWNlIGV2YWwgRkY6OiB7CiAgIHZhcmlhYmxlIHZhbGlkX3ZlcnNpb25zIHsKICAgICAgMTcuMS4wCiAgICAgIDE2LjIuMCAxNi4xLjAKICAgICAgMTUuMi4wIDE1LjEuMAogICAgICAxNC4yLjAgMTQuMS4wIAogICAgICAxMy4yLjAgMTMuMS4wCiAgICAgIDEyLjEuMAogICAgICAxMS4xLjMgMTEuMS4yIDExLjEuMSAxMS4xLjAKICAgICAgMTAuMS4zIDEwLjEuMiAxMC4xLjEgMTAuMS4wCiAgICAgIDkuMS4zIDkuMS4yCiAgIH0KCiAgIHByb2Mgd3JhcF9jb21tYW5kIHt0YWcgY29tbWFuZH0gewoKICAgICAgZ2xvYmFsIHZhcnMKICAgICAgZ2xvYmFsIGVudgogICAgICBnbG9iYWwgZXJyb3JzCgojICAgICAgaWYgeyR2YXJzKGRlYnVnKX0gewojICAgICAgICAgcHV0cyAiPEZGPiBXcmFwcGluZyBjb21tYW5kOiAkY29tbWFuZCBpbiBzdGVwICR2YXJzKHN0ZXApIC4uLiIKIyAgICAgIH0KCiAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnModGFncyx2ZXJib3NlKV19IHsKICAgICAgICAgc2V0IHZlcmJvc2UgRkFMU0UKICAgICAgfSAgZWxzZSB7CiAgICAgICAgIHNldCB2ZXJib3NlICR2YXJzKHRhZ3MsdmVyYm9zZSkKICAgICAgfQoKICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyh0YWdzLHZlcmJvc2l0eV9sZXZlbCldfSB7CiAgICAgICAgIHNldCB2ZXJib3NpdHlfbGV2ZWwgTE9XCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHN3aXRjaCBbc3RyaW5nIHRvdXBwZXIgJHZhcnModGFncyx2ZXJib3NpdHlfbGV2ZWwpXSB7IAogICAgICAgICAgICAiTE9XIiB7CiAgICAgICAgICAgICAgIHNldCB2ZXJib3NpdHlfbGV2ZWwgTE9XCiAgICAgICAgICAgIH0KICAgICAgICAgICAgIkhJR0giIHsKICAgICAgICAgICAgICAgc2V0IHZlcmJvc2l0eV9sZXZlbCBISUdICiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVmYXVsdCB7CiAgICAgICAgICAgICAgIHNldCB2ZXJib3NpdHlfbGV2ZWwgTE9XCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICB9CgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHRhZyxwcmVfdGNsKV0gfHwgXAogICAgICAgICAgW2luZm8gZXhpc3RzIHZhcnMoJHRhZyxwb3N0X3RjbCldIHx8IFwKICAgICAgICAgIFtpbmZvIGV4aXN0cyB2YXJzKCR0YWcsc2tpcCldIHx8IFwKICAgICAgICAgIFtpbmZvIGV4aXN0cyB2YXJzKCR0YWcscmVwbGFjZV90Y2wpXX0gewogICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHRhZ2dlZCldfSB7CiAgICAgICAgICAgIHNldCB2YXJzKHRhZ2dlZCkgW2xpc3RdCiAgICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgeyR2ZXJib3NpdHlfbGV2ZWwgPT0gIkhJR0gifSB7CiAgICAgICAgIHNldCBjb21tYW5kcyAiIyA8QkVHSU4gVEFHPiAkdGFnXG4iCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNldCBjb21tYW5kcyAiIgogICAgICB9CiMgICAgICBzZXQgY29tbWFuZHMgIiIKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCR0YWcsc2tpcCldICYmICR2YXJzKCR0YWcsc2tpcCl9IHsKICAgICAgICAgbGFwcGVuZCB2YXJzKHRhZ2dlZCkgJHRhZyxza2lwCiAgICAgICAgIHJlZ3N1YiAgLWFsbCAiXFxcbiIgIlxuXG4kY29tbWFuZFxuIiAiXG4jICIgc2tpcAojICAgICAgICAgYXBwZW5kIHNraXAgIlxuIgogICAgICAgICBpZiB7JHZlcmJvc2V9IHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJcbiMgPGJlZ2luIHRhZyAkdGFnLHNraXA+IgogICAgICAgICB9IAogICAgICAgICBhcHBlbmQgY29tbWFuZHMgJHNraXAKICAgICAgICAgaWYgeyR2ZXJib3NlfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiPGVuZCB0YWcgJHRhZyxza2lwPlxuXG4iCiAgICAgICAgIH0KICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJcbiIKICAgICAgICAgaWYgeyR2ZXJib3NlfSB7CiAgICAgICAgICAgIHJldHVybiAkY29tbWFuZHMKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIH0KICAgICAgfQoKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCR0YWcscHJlX3RjbCldfSB7CiAgICAgICAgIGlmIHtbZmlsZSBleGlzdHMgJHZhcnMoJHRhZyxwcmVfdGNsKV19IHsKICAgICAgICAgICAgbGFwcGVuZCB2YXJzKHRhZ2dlZCkgJHRhZyxwcmVfdGNsCiAgICAgICAgICAgIGlmIHskdmFycyhmbGF0KSA9PSAiZnVsbCJ9IHsKICAgICAgICAgICAgICAgc2V0IGlwIFtvcGVuICR2YXJzKCR0YWcscHJlX3RjbCkgcl0KICAgICAgICAgICAgICAgaWYgeyR2ZXJib3NlfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiXG4jIDxiZWdpbiB0YWcgJHRhZyxwcmVfdGNsPlxuIgogICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICB3aGlsZSB7W2dldHMgJGlwIGxpbmVdPj0wfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiJGxpbmVcbiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBjbG9zZSAkaXAKICAgICAgICAgICAgICAgaWYgeyR2ZXJib3NlfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyA8ZW5kIHRhZyAkdGFnLHByZV90Y2w+XG5cbiIKICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzb3VyY2UgJHZhcnMoJHRhZyxwcmVfdGNsKVxuIgogICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHB1dHMgIjxGRj4gRVJST1I6ICR0YWcgcHJlX3RjbCBmaWxlICgkdmFycygkdGFnLHByZV90Y2wpKSBub3QgZm91bmQiCiAgICAgICAgICAgIHNldCBlcnJvcnMoJHZhcnMoZXJyb3JfY291bnQpKSAiJHRhZyBwcmVfdGNsIGZpbGUgKCR2YXJzKCR0YWcscHJlX3RjbCkpIG5vdCBmb3VuZCIKICAgICAgICAgICAgaW5jciB2YXJzKGVycm9yX2NvdW50KQogICAgICAgICAgICBpZiB7JHZlcmJvc2V9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIjIDxlbmQgdGFnICR0YWcscHJlX3RjbD5cblxuIgogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfQogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHRhZyxyZXBsYWNlX3RjbCldfSB7CiAgICAgICAgIGlmIHtbZmlsZSBleGlzdHMgJHZhcnMoJHRhZyxyZXBsYWNlX3RjbCldfSB7CiAgICAgICAgICAgIGxhcHBlbmQgdmFycyh0YWdnZWQpICR0YWcscmVwbGFjZV90Y2wKICAgICAgICAgICAgc2V0IGlwIFtvcGVuICR2YXJzKCR0YWcscmVwbGFjZV90Y2wpIHJdCiAgICAgICAgICAgIGlmIHskdmVyYm9zZX0gewogICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIlxuIyA8YmVnaW4gdGFnICR0YWcscmVwbGFjZV90Y2w+XG4iCiAgICAgICAgICAgIH0gCiAgICAgICAgICAgIHdoaWxlIHtbZ2V0cyAkaXAgbGluZV0+PTB9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIkbGluZVxuIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGNsb3NlICRpcAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwdXRzICI8RkY+IEVSUk9SOiAkdGFnIHJlcGxhY2VfdGNsIGZpbGUgKCR2YXJzKCR0YWcscmVwbGFjZV90Y2wpKSBub3QgZm91bmQiCiAgICAgICAgICAgIHNldCBlcnJvcnMoJHZhcnMoZXJyb3JfY291bnQpKSAiJHRhZyByZXBsYWNlX3RjbCBmaWxlICgkdmFycygkdGFnLHJlcGxhY2VfdGNsKSkgbm90IGZvdW5kIgogICAgICAgICAgICBpbmNyIHZhcnMoZXJyb3JfY291bnQpCiAgICAgICAgIH0KICAgICAgICAgaWYgeyR2ZXJib3NlfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyA8ZW5kIHRhZyAkdGFnLHJlcGxhY2VfdGNsPlxuXG4iCiAgICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAgIyBJbnNlcnQgb3JpZ2luYWwgY29tbWFuZCBoZXJlCiAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAkY29tbWFuZAogICAgICB9CgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHRhZyxwb3N0X3RjbCldfSB7CiAgICAgICAgIGlmIHtbZmlsZSBleGlzdHMgJHZhcnMoJHRhZyxwb3N0X3RjbCldfSB7CiAgICAgICAgICAgIGxhcHBlbmQgdmFycyh0YWdnZWQpICR0YWcscG9zdF90Y2wKICAgICAgICAgICAgaWYgeyR2ZXJib3NlfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiXG4jIDxiZWdpbiB0YWcgJHRhZyxwb3N0X3RjbD5cbiIKICAgICAgICAgICAgfSAKICAgICAgICAgICAgaWYgeyR2YXJzKGZsYXQpID09ICJmdWxsIn0gewogICAgICAgICAgICAgICBzZXQgaXAgW29wZW4gJHZhcnMoJHRhZyxwb3N0X3RjbCkgcl0KICAgICAgICAgICAgICAgd2hpbGUge1tnZXRzICRpcCBsaW5lXT49MH0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiRsaW5lXG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgY2xvc2UgJGlwCiMgICAgICAgICAgICAgICBpZiB7JHZlcmJvc2V9IHsKIyAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIzw8PFxuIgojICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJzb3VyY2UgJHZhcnMoJHRhZyxwb3N0X3RjbClcbiIKICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwdXRzICI8RkY+IEVSUk9SOiAkdGFnIHBvc3RfdGNsIGZpbGUgKCR2YXJzKCR0YWcscG9zdF90Y2wpKSBub3QgZm91bmQiCiAgICAgICAgICAgIHNldCBlcnJvcnMoJHZhcnMoZXJyb3JfY291bnQpKSAiJHRhZyBwb3N0X3RjbCBmaWxlICgkdmFycygkdGFnLHBvc3RfdGNsKSkgbm90IGZvdW5kIgogICAgICAgICAgICBpbmNyIHZhcnMoZXJyb3JfY291bnQpCiAgICAgICAgIH0KICAgICAgICAgaWYgeyR2ZXJib3NlfSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyA8ZW5kIHRhZyAkdGFnLHBvc3RfdGNsPlxuXG4iCiAgICAgICAgIH0KICAgICAgfQogICAgICBpZiB7JHZlcmJvc2l0eV9sZXZlbCA9PSAiSElHSCJ9IHsKICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJcbiMgPEVORCBUQUc+ICR0YWdcbiIKICAgICAgfQoKICAgICAgcmV0dXJuICRjb21tYW5kcwogICB9CgogICBwcm9jIGdldF9saW5lX21hdGNoIHtwYXR0ZXJuIGZpbGV9IHsKCiAgICAgIHNldCBpcCBbb3BlbiAkZmlsZSByXQoKICAgICAgd2hpbGUge1tnZXRzICRpcCBsaW5lXT49MH0gewogICAgICAgICBpZiB7W3JlZ2V4cCAiJHBhdHRlcm4iICRsaW5lXT4wfSB7CiAgICAgICAgICAgc2V0IG1hdGNoICRsaW5lCiAgICAgICAgIH0KICAgICAgfQoKICAgICByZXR1cm4gJG1hdGNoCiAgIH0KCiAgIHByb2Mgc2luZ3VsYXIge3ZhbCB7ZmFsc2UgInMifSB7dHJ1ZSAiIn19IHsKICAgICBpZiB7JHZhbD09MX0geyByZXR1cm4gJHRydWUgfSBlbHNlIHsgcmV0dXJuICRmYWxzZSB9CiAgIH0KCiAgIHByb2Mgc2l6ZSB7dmFsIHtzdWZmaXggImJ5dGUifX0gewogICAgIHNldCBsZXZlbCAwCiAgICAgc2V0IHByZWZpeGVzIFtsaXN0ICIiIGtpbG8gbWVnYSBnaWdhIHRlcmEgcGV0YV0KICAgICB3aGlsZSB7JHZhbD4xMDI0fSB7CiAgICAgICBzZXQgdmFsIFtleHByICR2YWwvMTAyNC4wXQogICAgICAgaW5jciBsZXZlbAogICAgIH0KICAgICBzZXQgdmFsIFtleHByIGludCgkdmFsKzAuNSldCiAgICAgcmV0dXJuICIkdmFsIFtsaW5kZXggJHByZWZpeGVzICRsZXZlbF0kc3VmZml4W3Npbmd1bGFyICR2YWxdIgogICB9CgogICBwcm9jIHN5c3RlbV9pbmZvIHt9IHsKCiAgICAgIGdsb2JhbCB2YXJzCgogICAgICBzZXQgdW5hbWUgW2V4ZWMgdW5hbWVdCgogICAgICBpZiB7W2xzZWFyY2ggIkxpbnV4IiAkdW5hbWVdICE9IC0xfSB7CgogICAgICAgICBzZXQgaW5GaWxlICIkdmFycyhzY3JpcHRfcm9vdCkvRVRDL3N0YXR1cy5kYXQiCgogICAgICAgICBpZiB7IVtmaWxlIGV4aXN0cyAkaW5GaWxlXX0gewogICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIH0KCiAgICAgICAgIHNldCB1cElkIFtvcGVuICIvcHJvYy91cHRpbWUiIHJdCiAgICAgICAgIHNldCBpbmZvKHVwdGltZSkgW2xpbmRleCBbc3BsaXQgW2dldHMgJHVwSWRdIC5dIDBdCiAgICAgICAgIGNsb3NlICR1cElkCgogICAgICAgICBmb3JlYWNoIHt2YXIgdmFsfSB7bW9uIDI1OTIwMDAgd2tzIDYwNDgwMCBkYXkgODY0MDAgaHJzIDM2MDAgbWluIDYwIHNlYyAxfSB7CiAgICAgICAgICAgc2V0IGluZm8odXB0aW1lLiR7dmFyfSkgW2V4cHIgJGluZm8odXB0aW1lKS8ke3ZhbH1dCiAgICAgICAgICAgc2V0IGluZm8odXB0aW1lKSBbZXhwciAkaW5mbyh1cHRpbWUpLSgkaW5mbyh1cHRpbWUuJHt2YXJ9KSoke3ZhbH0pXQogICAgICAgICB9CgogICAgICAgICBzZXQgaW5mbyhob3N0LmZxZG4pIFtpbmZvIGhvc3RuYW1lXQogICAgICAgICBzZXQgaW5mbyhob3N0Lm5hbWUpIFtsaW5kZXggW3NwbGl0ICRpbmZvKGhvc3QuZnFkbikgLl0gMF0KICAgICAgICAgc2V0IGluZm8oaG9zdC5kb21haW4pIFtzdHJpbmcgcmFuZ2UgJGluZm8oaG9zdC5mcWRuKSBbZXhwciBbc3RyaW5nIGxlbmd0aCAkaW5mbyhob3N0Lm5hbWUpXSsxXSBlbmRdCiAgICAgICAgIHNldCBpbmZvKGhvc3Qub3MpICQ6OnRjbF9wbGF0Zm9ybShvcykKICAgICAgICAgc2V0IGluZm8oaG9zdC5vc3ZlcikgJDo6dGNsX3BsYXRmb3JtKG9zVmVyc2lvbikKICAgICAgICAgc2V0IGluZm8oaG9zdC5tYWNoaW5lKSAkOjp0Y2xfcGxhdGZvcm0obWFjaGluZSkKCiAgICAgICAgIGlmIHskaW5mbyhob3N0Lm9zKT09IkxpbnV4In0gewogICAgICAgICAgIGlmIHtbZmlsZSBleGlzdHMgL2V0Yy9zbGFja3dhcmUtdmVyc2lvbl19IHsgc2V0IGluZm8oaG9zdC5kaXN0cmlidXRpb24pICJTbGFja3dhcmUiIH0KICAgICAgICAgICBpZiB7W2ZpbGUgZXhpc3RzIC9ldGMvcmVkaGF0LXJlbGVhc2VdfSB7IHNldCBpbmZvKGhvc3QuZGlzdHJpYnV0aW9uKSAiUmVkSGF0IiB9CiAgICAgICAgICAgaWYge1tmaWxlIGV4aXN0cyAvZXRjL21hbmRyYWtlLXJlbGVhc2VdfSB7IHNldCBpbmZvKGhvc3QuZGlzdHJpYnV0aW9uKSAiTWFuZHJha2UiIH0KICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyBpbmZvKGhvc3QuZGlzdHJpYnV0aW9uKV19IHsgc2V0IGluZm8oaG9zdC5kaXN0cmlidXRpb24pICJVbmtub3duIiB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIH0KCiAgICAgICAgIHNldCBjcHVJZCBbb3BlbiAiL3Byb2MvY3B1aW5mbyIgcl0KICAgICAgICAgc2V0IGluZm8oY3B1LnRvdGFsKSAwCiAgICAgICAgIHNldCBpbmZvKGNwdS5jcHVjb3JlcykgMQogICAgICAgICB3aGlsZSB7IVtlb2YgJGNwdUlkXX0gewogICAgICAgICAgIGdldHMgJGNwdUlkIGxuCiAgICAgICAgICAgc2V0IGxuIFtzcGxpdCAkbG4gOl0KICAgICAgICAgICBzZXQgaXRlbSBbc3RyaW5nIHRyaW0gW2xpbmRleCAkbG4gMF1dCiAgICAgICAgICAgc2V0IHZhbHVlIFtzdHJpbmcgdHJpbSBbbGluZGV4ICRsbiAxXV0KICAgICAgICAgICBzZXQgaW5mbyhjcHUuW2xpbmRleCAkaXRlbSAwXVtsaW5kZXggJGl0ZW0gMV0pICR2YWx1ZQogICAgICAgICAgIGlmIHtbbGluZGV4ICRpdGVtIDBdID09ICJwcm9jZXNzb3IifSB7aW5jciBpbmZvKGNwdS50b3RhbCl9CiAgICAgICAgIH0KICAgICAgICAgY2xvc2UgJGNwdUlkCgogICAgICAgICBzZXQgbWVtSWQgW29wZW4gIi9wcm9jL21lbWluZm8iIHJdCiAgICAgICAgIHNldCBpbmZvKG1lbS5mcmVlKSAwCiAgICAgICAgIHdoaWxlIHshW2VvZiAkbWVtSWRdfSB7CiAgICAgICAgICAgZ2V0cyAkbWVtSWQgbG4KICAgICAgICAgICBzZXQgbG4gW3NwbGl0ICRsbiA6XQogICAgICAgICAgIHNldCBpdGVtIFtzdHJpbmcgdHJpbSBbbGluZGV4ICRsbiAwXV0KICAgICAgICAgICBjYXRjaCB7IHNldCB2YWx1ZSBbZXhwciBbc3RyaW5nIHRyaW0gW2xpbmRleCBbbGluZGV4ICRsbiAxXSAwXV0qMTAyNF0gfQogICAgICAgICAgIHN3aXRjaCAtLSAiJGl0ZW0iIHsKICAgICAgICAgICAgIE1lbVRvdGFsIHsgc2V0IGluZm8obWVtLnRvdGFsKSAkdmFsdWUgfQogICAgICAgICAgICAgU3dhcFRvdGFsIHsgc2V0IGluZm8obWVtLnN3YXAudG90YWwpICR2YWx1ZSB9CiAgICAgICAgICAgICBTd2FwRnJlZSB7IHNldCBpbmZvKG1lbS5zd2FwLmZyZWUpICR2YWx1ZSB9CiAgICAgICAgICAgICBNZW1GcmVlIHsgaW5jciBpbmZvKG1lbS5mcmVlKSAkdmFsdWUgfQogICAgICAgICAgICAgQ2FjaGVkIHsgaW5jciBpbmZvKG1lbS5mcmVlKSAkdmFsdWUgfQogICAgICAgICAgICAgQnVmZmVycyB7IGluY3IgaW5mbyhtZW0uZnJlZSkgJHZhbHVlIH0KICAgICAgICAgICB9CiAgICAgICAgIH0KCiAgICAgICAgIHNldCBwYXJzZUlkIFtvcGVuICRpbkZpbGUgcl0KICAgICAgICAgd2hpbGUgMSB7CiAgICAgICAgICAgZ2V0cyAkcGFyc2VJZCBsbgogICAgICAgICAgIGlmIHtbZW9mICRwYXJzZUlkXX0geyBicmVhayB9CiAgICAgICAgICAgY2F0Y2ggeyBwdXRzIFtzdWJzdCAkbG5dIH0gZXJyCiAgICAgICAgIH0KICAgICAgICAgY2xvc2UgJHBhcnNlSWQKICAgICAgfQogICB9CgogICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICMgVGhpcyByb3V0aW5lIGl0ZXJhdGVzIG92ZXIgdmFyaWFibGVzIHRoYXQgbWFpbnRhaW4gbGlzdHMgb2YgZmlsZXMuICBJZgogICAjIGFueSBlbGVtZW50IG9mIHRoZSBsaXN0IGlzIGEgd2lsZGNhcmQsIHRoYXQgZW50cnkgaXMgcmVwbGFjZWQgd2l0aCB0aGUKICAgIyBUY2wgY29tbWFuZCB0aGF0IHdpbGwgZXhwYW5kIHRoZSBuYW1lIGF0IHJ1bnRpbWUKICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgcHJvYyBwcm9jZXNzX2ZpbGVfbGlzdHMge30gewoKICAgICAgZ2xvYmFsIHZhcnMKCiAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoZ2xvYmJlZCldfSB7CiAgICAgICAgIHNldCB2YXJzKGdsb2JiZWQpIGZhbHNlCiAgICAgIH0KICAgICAgaWYgeyR2YXJzKGdsb2JiZWQpfSB7CiAgICAgICAgIHJldHVybgogICAgICB9CiAgICAgIHNldCB2YXJzKGdsb2JiZWQpIHRydWUKCiAgICAgIGlmIHtbcmVnZXhwICJeMTEiICR2YXJzKHZlcnNpb24pXX0gewogICAgICAgICByZXR1cm4KICAgICAgfQogICAgICAjIEJDTDogUmVtb3ZlZCBkZWZfZmlsZXMgZnJvbSB0aGlzIGxpc3QKICAgICAgc2V0IHZhcl9pbmRpY2VzIFtsaXN0ICJjdHNfc3BlYyIgImxlZl9maWxlcyIgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpbWluZyIgInNpIiAiZWNzbSIgImN0c19zZGMiXQoKICAgICAgIyBCQ0w6IEFkZCBkZWZfZmlsZXMgdG8gbGlzdCBvbmx5IGlmIGl0IGRvZXNuJ3QgaGF2ZSBbc3Vic3RdIGluIHRoZSBuYW1lIChvdGhlciB3aXNlIHdlIG5lZWQgdG8ga2VlcCBbc3Vic3QuLi4gdW5leHBhbmRlZCkKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGRlZl9maWxlcyldICYmICFbcmVnZXhwIHtcW3N1YnN0IFwkdmFyc30gJHZhcnMoZGVmX2ZpbGVzKV19IHtsYXBwZW5kIHZhcl9pbmRpY2VzIGRlZl9maWxlc30KCiAgICAgIGZvcmVhY2ggaW5kZXggJHZhcl9pbmRpY2VzIHsKICAgICAgICAgc2V0IGFsbF9uYW1lcyBbYXJyYXkgbmFtZXMgdmFycyAtZ2xvYiAiKiRpbmRleCJdCiAgICAgICAgIGZvcmVhY2ggbmFtZSAkYWxsX25hbWVzIHsKICAgICAgICAgICAgc2V0IGV4cGFuZGVkX2ZpbGVzICIiCiAgICAgICAgICAgICMgQkNMOiBBZGRlZCBzdWJzdCBhcm91bmQgZmluYWwgdmFyaWFibGUgdG8gcmVzb2x2ZSB2YXJzKHJ1bmRpcikgcmVmZXJlbmNlcwogICAgICAgICAgICBmb3JlYWNoIGZpbGUgW3N1YnN0ICR2YXJzKCRuYW1lKV0gewogICAgICAgICAgICAgICBpZiB7KFtzdHJpbmcgZmlyc3QgIioiICRmaWxlXSAhPSAtMSkgfHwKICAgICAgICAgICAgICAgICAgIChbc3RyaW5nIGZpcnN0ICI/IiAkZmlsZV0gIT0gLTEpfSB7CiAgICAgICAgICAgICAgICAgIGlmIHshW2NhdGNoIHtzZXQgZmlsZXMgW2dsb2IgJGZpbGVdfV19IHsKICAgICAgICAgICAgICAgICAgICAgbGFwcGVuZCBleHBhbmRlZF9maWxlcyAkZmlsZXMKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBsYXBwZW5kIGV4cGFuZGVkX2ZpbGVzICRmaWxlCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgdmFycygkbmFtZSkgJGV4cGFuZGVkX2ZpbGVzCiAgICAgICAgIH0KICAgICAgfQogICB9CgogICBwcm9jIGdldF9yZXF1aXJlZF9wcm9jcyB7ZmlsZX0gewogICAgICAjCiAgICAgICMgR2l2ZW4gYSBsaXN0IG9mIHJlcXVpcmVkIHByb2NlZHVyZXMsIHJldHVybiB0aGUgbGluZXMgdGhhdCByZXByZXNlbnQKICAgICAgIyB0aG9zZSBwcm9jZWR1cmVzIGZyb20gdGhlIHV0aWxzLnRjbCBmaWxlCiAgICAgICMKCiAgICAgIGdsb2JhbCB2YXJzCiAgICAgIGdsb2JhbCBlcnJvcnMKCiAgICAgICMKICAgICAgIyBSZWFkIHRoZSBmaWxlIGFuZCBnYXRoZXIgYWxsIG9mIHRoZSBjb250ZW50cwogICAgICAjCgogICAgICBzZXQgYWxsX2xpbmVzICIiCiAgICAgIHNldCBsZW5ndGggMAogICAgICBzZXQgaXAgW29wZW4gJGZpbGVdCiAgICAgIHdoaWxlIHtbZ2V0cyAkaXAgbGluZV0+PTB9IHsKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKG5vdnVzKV0gJiYgJHZhcnMobm92dXMpfSB7CiAgICAgICAgICAgIHNldCB1dGlsc19saW5lcygkbGVuZ3RoKSBbcmVnc3ViICJQdXRzIiAkbGluZSAicHV0cyJdCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNldCB1dGlsc19saW5lcygkbGVuZ3RoKSAkbGluZQogICAgICAgICB9CiAgICAgICAgIGluY3IgbGVuZ3RoCiAgICAgIH0KICAgICAgY2xvc2UgJGlwCgogICAgICAjCiAgICAgICMgSXRlcmF0ZSBhY3Jvc3MgZWFjaCBsaW5lIGFuZCBwdWxsIG91dCByZWxldmFudCBwcm9jZWR1cmVzCiAgICAgICMKCiAgICAgIHNldCBsaW5lcyAiIgogICAgICBzZXQgaSAwCiAgICAgIHdoaWxlIHskaSA8ICRsZW5ndGh9IHsKICAgICAgICAgc2V0IGxpbmUgJHV0aWxzX2xpbmVzKCRpKQogICAgICAgICBmb3JlYWNoIHByb2MgJHZhcnMocmVxdWlyZWRfcHJvY3MpIHsKICAgICAgICAgICAgaWYge1tyZWdleHAgInByb2MgJHByb2MiICRsaW5lXSA+IDB9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGxpbmVzICIgJGxpbmVcbiIKICAgICAgICAgICAgICAgaW5jciBpCiAgICAgICAgICAgICAgIHdoaWxlIHskaSA8ICRsZW5ndGh9IHsKICAgICAgICAgICAgICAgICAgc2V0IGxpbmUgJHV0aWxzX2xpbmVzKCRpKQogICAgICAgICAgICAgICAgICBpZiB7W3JlZ2V4cCAicHJvYyAiICRsaW5lXSA+IDB9IHsKICAgICAgICAgICAgICAgICAgICAgaW5jciBpIC0xCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgeyFbcmVnZXhwICJeIyIgW3N0cmluZyB0cmltbGVmdCAkbGluZV0gXSAmJiAoJGkgIT0gW2V4cHIgJGxlbmd0aC0xXSl9IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGxpbmVzICIkbGluZVxuIgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGluY3IgaQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpbmNyIGkKICAgICAgfQoKICAgICAgc2V0IGxpbmVzIFtzdHJpbmcgdHJpbXJpZ2h0ICRsaW5lc10KICAgICAgcmV0dXJuICIkbGluZXNcbiIKICAgfQoKCiAgIHByb2Mgc291cmNlX3BsdWcge3BsdWdpbiB7YWJvcnQgMX19IHsKCiAgICAgIGdsb2JhbCB2YXJzCiAgICAgIGdsb2JhbCBlbnYKICAgICAgZ2xvYmFsIHdhcm5pbmdzCiAgICAgIGdsb2JhbCBwbHVnaW5fZXJyb3IKICAgICAgZ2xvYmFsIGVycm9ySW5mbwogICAgICBnbG9iYWwgcmV0dXJuX2NvZGUKCiAgICAgICMgQWRkZWQgZm9yIEVUUy9FUFMKICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhmbGF0KV19IHsKICAgICAgICAgc2V0IHZhcnMoZmxhdCkgZnVsbAogICAgICB9CgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY29kZWdlbildICYmICEkdmFycyhjb2RlZ2VuKX0gewogICAgICAgICBzZXQgdmFycyhmbGF0KSBmdWxsCiAgICAgIH0KICAKICAgICAgc2V0IGZsYXQgJHZhcnMoZmxhdCkKCiAgICAgIGlmIHskdmFycyhnZW5lcmF0ZV9mbG93X3N0ZXBzKX0gewogICAgICAgICAjc2V0IHZhcnMoZmxhdCkgZnVsbAogICAgICB9CgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnModmVyYm9zZSldICYmICR2YXJzKHZlcmJvc2UpfSB7CiAgICAgICAgIHNldCB2ZXJib3NlIHRydWUKICAgICAgfSBlbHNlIHsKICAgICAgICAgc2V0IHZlcmJvc2UgZmFsc2UKICAgICAgfQoKICAgICAgc2V0IGNvbW1hbmRzICJwdXRzIFwiPEZGPiBQbHVnaW4gLT4gJHBsdWdpblwiXG4iCiAgICAgIHNldCBub19jb21tZW50cyAiIgoKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCRwbHVnaW4pXX0gewogICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHBsdWdpbnMpXX0gewogICAgICAgICAgICBzZXQgdmFycyhwbHVnaW5zKSBbbGlzdF0KICAgICAgICAgfQogICAgICAgICBpZiB7W2xzZWFyY2ggJHZhcnMocGx1Z2lucykgJHBsdWdpbl0gPT0gLTF9IHsKICAgICAgICAgICAgc2V0IHN1ZmZpeCBbbGluZGV4IFtzcGxpdCAkcGx1Z2luICIsIl0gMV0KICAgICAgICAgICAgaWYgeygkc3VmZml4ICE9ICJkZXJhdGVfdGNsIikgJiYgKCRzdWZmaXggIT0gInNjYWxlX3RjbCIpfSB7CiAgICAgICAgICAgICAgIGxhcHBlbmQgdmFycyhwbHVnaW5zKSAkcGx1Z2luCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBzZXQgZm91bmQgMCAKICAgICAgICAgc2V0IHBsdWdfbGlzdCBbXQogICAgICAgICBmb3JlYWNoIHBsdWdfZmlsZSAkdmFycygkcGx1Z2luKSB7CiAgICAgICAgICAgIGlmIHtbZmlsZSBleGlzdHMgJHBsdWdfZmlsZV19IHsKICAgICAgICAgICAgICAgc2V0IGZvdW5kIDEgCiAgICAgICAgICAgICAgIGxhcHBlbmQgcGx1Z19saXN0ICRwbHVnX2ZpbGUKICAgICAgICAgICAgICAgY29udGludWUgCiAgICAgICAgICAgIH0gZWxzZWlmIHtbZmlsZSBleGlzdHMgJHZhcnMocGx1Z19kaXIpLyRwbHVnX2ZpbGVdfSB7CiAgICAgICAgICAgICAgICAgIHNldCBmb3VuZCAxIAojICAgICAgICAgICAgICAgICAgbGFwcGVuZCBwbHVnX2xpc3QgJHBsdWdfZmlsZQogICAgICAgICAgICAgICAgICAgbGFwcGVuZCBwbHVnX2xpc3QgJHZhcnMocGx1Z19kaXIpLyRwbHVnX2ZpbGUKICAgICAgICAgICAgICAgICAgY29udGludWUgCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGlmIHtbZmlsZSBleGlzdHMgJHZhcnMoY3dkKS8kcGx1Z19maWxlXX0gewogICAgICAgICAgICAgICAgICBzZXQgZm91bmQgMSAKICAgICAgICAgICAgICAgICAgbGFwcGVuZCBwbHVnX2xpc3QgJHZhcnMoY3dkKS8kcGx1Z19maWxlCiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIAogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiB7ISRmb3VuZH0gewogICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKG1pc3NpbmdfcGx1Z2lucyldfSB7CiAgICAgICAgICAgICAgIHNldCB2YXJzKG1pc3NpbmdfcGx1Z2lucykgW2xpc3RdCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYge1tsc2VhcmNoICR2YXJzKG1pc3NpbmdfcGx1Z2lucykgJHBsdWdpbl0gPT0gLTF9IHsKICAgICAgICAgICAgICAgbGFwcGVuZCB2YXJzKG1pc3NpbmdfcGx1Z2lucykgJHBsdWdpbgogICAgICAgICAgICAgICBzZXQgd2FybmluZ3MoJHZhcnMod2FybmluZ19jb3VudCkpICJQbHVnLWluICRwbHVnaW4gZGVmaW5lZCBidXQgZmlsZShzKSBub3QgZm91bmQiCiAgICAgICAgICAgICAgIGluY3IgdmFycyh3YXJuaW5nX2NvdW50KQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgeyR2YXJzKGZsYXQpID09ICJwYXJ0aWFsIn0gewogICAgICAgICAgICBmb3JlYWNoIHBsdWdfZmlsZSAkcGx1Z19maWxlIHsKICAgICAgICAgICAgICAgaWYge1tmaWxlIGV4aXN0cyAkcGx1Z19maWxlXX0gewogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgInB1dHMgXCI8RkY+IExPQURJTkcgXCckcGx1Z19maWxlXCcgUExVRy1JTiBGSUxFKHMpIFwiXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiaWYgeyBcWyBjYXRjaCB7IHNvdXJjZSAkcGx1Z19maWxlIH0gcGx1Z2luX2Vycm9yIFxdIH0ge1xuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgIHB1dHMgXCI8RkY+ID09PT09PT09PT09PT0gUExVRy1JTiBFUlJPUiA9PT09PT09PT09PT09PT09PT1cIlxuIgogICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgIHB1dHMgXCI8RkY+IFwkZXJyb3JJbmZvXCJcbiIKICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICBwdXRzIFwiPEZGPiBcJHBsdWdpbl9lcnJvclwiXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgcHV0cyBcIjxGRj4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVwiXG4iCiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiICAgc2V0IHJldHVybl9jb2RlIDk5XG4iCiAgICAgICAgICAgICAgICAgIGlmIHskYWJvcnR9IHsKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICIgICAgZXhpdCBcJHJldHVybl9jb2RlXG4iCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJ9XG4iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2VpZiB7JHZhcnMoZmxhdCkgPT0gImZ1bGwifSB7CiAgICAgICAgICAgIGlmIHshJGZvdW5kfSB7CiAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiZmZfcHJvY3M6OnNvdXJjZV9wbHVnICRwbHVnaW5cbiIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgaWYgeyR2ZXJib3NlICYmICFbcmVnZXhwICIsIiAkcGx1Z2luXX0gewogICAgICAgICAgICAgICAgICBzZXQgY29tbWFuZHMgIlxuIyA8YmVnaW4gcGx1Zy1pbiAkcGx1Z2luPlxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMocGx1Z19maWxlcyldfSB7CiAgICAgICAgICAgICAgICAgIHNldCB2YXJzKHBsdWdfZmlsZXMpIFtsaXN0XQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGZvcmVhY2ggcGx1Z19maWxlICRwbHVnX2xpc3QgewogICAgICAgICAgICAgICAgICBpZiB7W2ZpbGUgZXhpc3RzICRwbHVnX2ZpbGVdfSB7CiMgICAgICAgICAgICAgICAgICAgICBpZiB7JHZlcmJvc2V9IHsKIyAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIz4+PlxuIgojICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgPGJlZ2luICRwbHVnX2ZpbGU+XG4iCiAgICAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhvbGRfcGx1Z2lucyldICYmICR2YXJzKG9sZF9wbHVnaW5zKSAmJiAoW2xzZWFyY2ggJHZhcnMoZWRpX3BsdWdpbnMpICRwbHVnaW5dICE9IC0xKX0gewogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgImV2YWxfZW5jIFx7XG4iCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYge1tsc2VhcmNoICR2YXJzKHBsdWdfZmlsZXMpICRwbHVnaW5dID09IC0xfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldCBzdWZmaXggW2xpbmRleCBbc3BsaXQgJHBsdWdpbiAiLCJdIDFdCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHsoJHN1ZmZpeCAhPSAiZGVyYXRlX3RjbCIpICYmICgkc3VmZml4ICE9ICJzY2FsZV90Y2wiKX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBwZW5kIHZhcnMocGx1Z19maWxlcykgIiRwbHVnaW4iCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBzZXQgaXAgW29wZW4gJHBsdWdfZmlsZSByXQogICAgICAgICAgICAgICAgICAgICB3aGlsZSB7W2dldHMgJGlwIGxpbmVdPj0wfSB7CiMgICAgICAgICAgICAgICAgICAgICAgICBpZiB7IVtyZWdleHAgIl4kIiAkbGluZV19IHsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHskdmFycyhnZW5lcmF0ZV9mbG93X3N0ZXBzKX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgICRsaW5lXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiJGxpbmVcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB7IVtyZWdleHAgIl4jIiAkbGluZV19IHsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBub19jb21tZW50cyAiICAgJGxpbmVcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGNsb3NlICRpcAogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiMgPGVuZCAkcGx1Z19maWxlPlxuIgogICAgICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMob2xkX3BsdWdpbnMpXSAmJiAkdmFycyhvbGRfcGx1Z2lucykgJiYgKFtsc2VhcmNoICR2YXJzKGVkaV9wbHVnaW5zKSAkcGx1Z2luXSAhPSAtMSl9IHsKICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJcfVxuIgogICAgICAgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICAgICAgICAgICBpZiB7JHZlcmJvc2V9IHsKIyAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIzw8PFxuIgojICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9IGVsc2VpZiB7W2ZpbGUgZXhpc3RzICR2YXJzKHBsdWdfZGlyKS8kcGx1Z19maWxlXX0gewojICAgICAgICAgICAgICAgICAgICAgaWYgeyR2ZXJib3NlfSB7CiMgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiM+Pj5cbiIKIyAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYge1tsc2VhcmNoICR2YXJzKHBsdWdfZmlsZXMpICRwbHVnaW5dID09IC0xfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldCBzdWZmaXggW2xpbmRleCBbc3BsaXQgJHBsdWdpbiAiLCJdIDFdCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHsoJHN1ZmZpeCAhPSAiZGVyYXRlX3RjbCIpICYmICgkc3VmZml4ICE9ICJzY2FsZV90Y2wiKX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBwZW5kIHZhcnMocGx1Z19maWxlcykgIiRwbHVnaW4iCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBzZXQgaXAgW29wZW4gJHZhcnMocGx1Z19kaXIpLyRwbHVnX2ZpbGUgcl0KICAgICAgICAgICAgICAgICAgICAgd2hpbGUge1tnZXRzICRpcCBsaW5lXT49MH0gewogICAgICAgICAgICAgICAgICAgICAgICBpZiB7IVtyZWdleHAgIl4kIiAkbGluZV19IHsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiJGxpbmVcbiIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiB7IVtyZWdleHAgIl4jIiAkbGluZV19IHsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBub19jb21tZW50cyAiICAgJGxpbmVcbiIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGNsb3NlICRpcAojICAgICAgICAgICAgICAgICAgICAgaWYgeyR2ZXJib3NlfSB7CiMgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiM8PDxcbiIKIyAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiB7JHZlcmJvc2UgJiYgIVtyZWdleHAgIiwiICRwbHVnaW5dfSB7CiAgICAgICAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kcyAiIyA8ZW5kIHBsdWctaW4gJHBsdWdpbj5cblxuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYXBwZW5kIGNvbW1hbmRzICJmZl9wcm9jczo6c291cmNlX3BsdWcgJHBsdWdpblxuIgogICAgICAgICB9CiAgICAgIH0KICAgICAgc2V0IHZhcnMoZmxhdCkgJGZsYXQKICAgICAgaWYgeyR2YXJzKGdlbmVyYXRlX2Zsb3dfc3RlcHMpICYmICgkbm9fY29tbWVudHMgIT0gIiIpICYmICFbcmVnZXhwIGZmX3Byb2NzICRjb21tYW5kc10gJiYgIVtyZWdleHAgZGVyYXRlX3RjbCAkcGx1Z2luXX0gewogICAgICAgICBpZiB7JG5vX2NvbW1lbnRzID09ICIifSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kcyAiIgogICAgICAgICB9CiAgICAgICAgIGlmIHtbbGluZGV4IFtzcGxpdCAkdmFycyh2ZXJzaW9uKSAiLiJdICAwXSA+IDE0fSB7CiAgICAgICAgICAgaWYgeyFbZmlsZSBleGlzdHMgJHZhcnMoY3dkKS8ucGx1Z2luc119IHsKICAgICAgICAgICAgICBzZXQgb3AgW29wZW4gJHZhcnMoY3dkKS8ucGx1Z2lucyB3XQogICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgc2V0IG9wIFtvcGVuICR2YXJzKGN3ZCkvLnBsdWdpbnMgYV0KICAgICAgICAgICB9CgogICAgICAgICAgIGlmIHtbcmVnZXhwICJecHJlXyR2YXJzKHN0ZXApIiAkcGx1Z2luXSAmJiAoJHZhcnMoc3RlcCkgIT0gInBhcnRpdGlvbl9wbGFjZSIpfSB7CiAgICAgICAgICAgICAgc2V0IHR5cGUgYmVnaW5fdGNsCiAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBpZiB7W3JlZ2V4cCAiXnBvc3RfJHZhcnMoc3RlcCkiICRwbHVnaW5dICYmICgkdmFycyhzdGVwKSAhPSAicGFydGl0aW9uX3BsYWNlIil9IHsKICAgICAgICAgICAgICAgICBzZXQgdHlwZSBlbmRfdGNsCiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIHtbcmVnZXhwICJec3luIiAkcGx1Z2luXSB8fCBbcmVnZXhwICJeYWx3YXlzIiAkcGx1Z2luXSB8fCBbcmVnZXhwICJeZmluYWxfYWx3YXlzIiAkcGx1Z2luXSB8fCBbcmVnZXhwICJecHJlX3N5biIgJHBsdWdpbl19IHsKICAgICAgICAgICAgICAgICAgc2V0IHR5cGUgaW1wb3J0IAogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgaWYgeyR2YXJzKHN0ZXApICE9ICJwYXJ0aXRpb25fcGxhY2UifSB7CiAgICAgICAgICAgICAgICAgICAgIHNldCB0eXBlIHNraXAgCiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHNldCB0eXBlIGltcG9ydAogICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICB9CgogICAgICAgICAgIHNldCBzdGVwX3BsdWcgW2Zvcm1hdCAlc18lcyAkdmFycyhzdGVwKSAkcGx1Z2luXQogICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMocHJvY2Vzc2VkX3BsdWdpbnMpXX0gewogICAgICAgICAgICAgIHNldCB2YXJzKHByb2Nlc3NlZF9wbHVnaW5zKSBbbGlzdF0KICAgICAgICAgICAgICBsYXBwZW5kIHZhcnMocHJvY2Vzc2VkX3BsdWdpbnMpICRzdGVwX3BsdWcKICAgICAgICAgICB9IGVsc2UgewojICAgICAgICAgICAgICBwdXRzICIkdmFycyhwcm9jZXNzZWRfcGx1Z2lucykgOiAkc3RlcF9wbHVnIgogICAgICAgICAgICAgIGlmIHtbbHNlYXJjaCAkdmFycyhwcm9jZXNzZWRfcGx1Z2lucykgJHN0ZXBfcGx1Z10gPT0gLTF9IHsKICAgICAgICAgICAgICAgICBsYXBwZW5kIHZhcnMocHJvY2Vzc2VkX3BsdWdpbnMpICRzdGVwX3BsdWcKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmIHsoJHZhcnMoc3RlcCkgIT0gInBhcnRpdGlvbl9wbGFjZSIpICYmICFbcmVnZXhwICJhbHdheXMiICRwbHVnaW5dfSB7CiAgICAgICAgICAgICAgICAgICAgc2V0IHR5cGUgc2tpcAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICAgIGlmIHskdHlwZSAhPSAic2tpcCJ9IHsKIyAgICAgICAgICAgICAgaWYgeyR0eXBlID09ICJpbXBvcnQifSB7CiMgICAgICAgICAgICAgICAgIHNldCBpcCBbb3BlbiAkcGx1Z19maWxlIHJdCiMgICAgICAgICAgICAgICAgIHdoaWxlIHtbZ2V0cyAkaXAgbGluZV0+PTB9IHsKIyAgICAgICAgICAgICAgICAgICAgaWYgeyFbcmVnZXhwICJeJCIgJGxpbmVdfSB7IAojICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY29tbWFuZHMgIiAgICRsaW5lXG4iCiMgICAgICAgICAgICAgICAgICAgICAgIGlmIHshW3JlZ2V4cCAiXiMiICRsaW5lXX0geyAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIG5vX2NvbW1lbnRzICIgICAkbGluZVxuIgojICAgICAgICAgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICAgICAgICAgIH0KIyAgICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgICAgICBjbG9zZSAkaXAKICAgICAgICAgICAgICAgICByZXR1cm4gJGNvbW1hbmRzCiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMob2xkX3BsdWdpbnMpXSAmJiAhW3JlZ2V4cCBzeW5fICR2YXJzKHN0ZXApXX0gewogICAgICAgICAgICAgICAgICAgICBzZXQgdGVtcCAic2V0X2RiIGZsb3dfc3RlcDokdmFycyhzdGVwKSAuJHR5cGUgeyBldmFsX2VuYyB7XG4iCiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCB0ZW1wICRub19jb21tZW50cwogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgdGVtcCAifX1cbiIKICAgICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgJHRlbXAKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBzZXQgdGVtcCAic2V0X2RiIGZsb3dfc3RlcDokdmFycyhzdGVwKSAuJHR5cGUge1xuIgogICAgICAgICAgICAgICAgICAgICBhcHBlbmQgdGVtcCAkbm9fY29tbWVudHMKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIHRlbXAgIn1cbiIKICAgICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgJHRlbXAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgcHV0cyAiU2tpcHBpbmcgcGx1Z2luICRwbHVnaW4gYXMgaXQgY2Fubm90IGJlIChvciBhbHJlYWR5IGhhcyBiZWVuKSB0aWVkIHRvIGEgZmxvd19zdGVwIGF0dHJpYnV0ZSIKICAgICAgICAgICB9CiAgICAgICAgICAgY2xvc2UgJG9wCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgcmV0dXJuICRjb21tYW5kcwogICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuICRjb21tYW5kcwogICAgICB9CiAgIH0KCiAgIG5hbWVzcGFjZSBleHBvcnQgZ2V0X3Rvb2wgCiAgIHByb2MgZ2V0X3Rvb2wge30gewogICAgIHNldCB0b29sX25hbWUgIiIKICAgICBzZXQgcGF0aF90b19leGUgW2luZm8gbmFtZW9mZXhlY3V0YWJsZV0KICAgICBpZiB7W3JlZ2V4cCB7L3JjKDY0KT8oLVx3KT8kfSAkcGF0aF90b19leGVdfSB7CiAgICAgICBzZXQgdG9vbF9uYW1lICJyYyIKICAgICB9IGVsc2VpZiB7W3JlZ2V4cCB7L2dlbnVzKDY0KT8oLVx3KT8kfSAkcGF0aF90b19leGVdfSB7CiAgICAgICBzZXQgdG9vbF9uYW1lICJyYyIKICAgICB9IGVsc2VpZiB7W3JlZ2V4cCB7LipcLyhMRUN8bGVjKX0gJHBhdGhfdG9fZXhlXX0gewogICAgICAgc2V0IHRvb2xfbmFtZSAibGVjIgogICAgIH0gZWxzZWlmIHtbcmVnZXhwIHsuKlwvdmVyaWZ5fSAkcGF0aF90b19leGVdfSB7CiAgICAgICBzZXQgdG9vbF9uYW1lICJjbHAiCiAgICAgfSBlbHNlaWYge1tyZWdleHAgey4qXC9DQ0R9ICRwYXRoX3RvX2V4ZV19IHsKICAgICAgIHNldCB0b29sX25hbWUgImNjZCIKICAgICB9IGVsc2VpZiB7W3JlZ2V4cCB7LipcL2N0b3N9ICRwYXRoX3RvX2V4ZV19IHsKICAgICAgIHNldCB0b29sX25hbWUgImN0b3MiCiAgICAgfSBlbHNlaWYge1tyZWdleHAgey4qXC90Y2xzaH0gJHBhdGhfdG9fZXhlXX0gewogICAgICAgc2V0IHRvb2xfbmFtZSAidGNsc2giCiAgICAgfSBlbHNlaWYge1tyZWdleHAgey4qXC9pbm5vdnVzfSAkcGF0aF90b19leGVdfSB7CiAgICAgICBzZXQgdG9vbF9uYW1lICJlZGkiCiAgICAgfSBlbHNlaWYge1tyZWdleHAgey4qXC9lbmNvdW50ZXJ9ICRwYXRoX3RvX2V4ZV19IHsKICAgICAgIHNldCB0b29sX25hbWUgImVkaSIKICAgICB9IGVsc2VpZiB7W3JlZ2V4cCB7LipcL3ZlbG9jaXR5fSAkcGF0aF90b19leGVdfSB7CiAgICAgICBzZXQgdG9vbF9uYW1lICJlZGkiCiAgICAgfSBlbHNlaWYge1tyZWdleHAgey4qXC9uY3NpbX0gJHBhdGhfdG9fZXhlXX0gewogICAgICAgc2V0IHRvb2xfbmFtZSAiaWVzIgogICAgIH0KICAgICByZXR1cm4gJHRvb2xfbmFtZQogICB9CgogICBwcm9jIHNvdXJjZV9maWxlIHtmaWxlIHthYm9ydCAxfX0gewogICAgICBnbG9iYWwgdmFycwogICAgICBnbG9iYWwgc291cmNlX2Vycm9yCiAgICAgIGdsb2JhbCBlcnJvckluZm8KICAgICAgZ2xvYmFsIHJldHVybl9jb2RlCgojICAgICAgcHV0cyAiPEZGPiBMT0FESU5HICckZmlsZScgRklMRSIKICAgICAgaWYge1tmaWxlIGV4aXN0cyAkZmlsZV19IHsKICAgICAgICAgaWYge1tpbmZvIGNvbW1hbmQgRkY6OmdldF90b29sXSBuZSAiIiAmJiBbRkY6OmdldF90b29sXSBlcSAicmMiIH0gewogICAgICAgICAgICAgc2V0IHNvdXJjZVJlc3VsdCBbY2F0Y2ggeyB1cGxldmVsIHRjbF9zb3VyY2UgJGZpbGUgfSBzb3VyY2VfZXJyb3IgXQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc2V0IHNvdXJjZVJlc3VsdCBbY2F0Y2ggeyB1cGxldmVsIHNvdXJjZSAkZmlsZSB9IHNvdXJjZV9lcnJvciBdCiAgICAgICAgIH0KICAgICAgICAgaWYgeyAkc291cmNlUmVzdWx0IH0gewogICAgICAgICAgICBwdXRzICI8RkY+ID09PT09PT09PT09PT09PSBUQ0wgRVJST1IgPT09PT09PT09PT09PT09PT09PT0iCiAgICAgICAgICAgIHB1dHMgIjxGRj4gRXJyb3IgbG9hZGluZyAkZmlsZSBmaWxlIgogICAgICAgICAgICBwdXRzICI8RkY+ICRlcnJvckluZm8iCiAgICAgICAgICAgIHB1dHMgIjxGRj4gJHNvdXJjZV9lcnJvciIKICAgICAgICAgICAgcHV0cyAiPEZGPiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgogICAgICAgICAgICBzZXQgcmV0dXJuX2NvZGUgOTkKICAgICAgICAgICAgaWYgeyRhYm9ydH0gewogICAgICAgICAgICAgICBleGl0ICRyZXR1cm5fY29kZQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfQogICB9CgogICBwcm9jIGdldF9ieV9zdWZmaXgge3Bhc3NlZF9hcnJheSB7c3VmZml4ICIifX0gewogICAgICAjCiAgICAgICMgR2V0IHRoZSBsaXN0IG9mIGFycmF5IGluZGljZXMgdGhhdCBoYXZlIGEgc3VmZml4IG9mIHRoZQogICAgICAjIHBhc3NlZCBzdHJpbmcgc2VxdWVuY2UKICAgICAgIwoKICAgICAgdXB2YXIgJHBhc3NlZF9hcnJheSB0aGVfYXJyYXkKCiAgICAgICMKICAgICAgIyBJZiB0aGVyZSBpcyBubyBzdWZmaXgsIHJldHVybiBldmVyeSBuYW1lCiAgICAgICMKCiAgICAgIGlmIHtbc3RyaW5nIGxlbmd0aCAkc3VmZml4XSA9PSAwfSB7CiAgICAgICAgIHJldHVybiBhcnJheSBuYW1lcyB0aGVfYXJyYXkKICAgICAgfQoKICAgICAgIwogICAgICAjIElmIHRoZXJlIGlzIGEgc3VmZml4LCBmaW5kIHRoZSBtYXRjaGluZyBuYW1lcyBhbmQgcmV0dXJuCiAgICAgICMgdGhlIGxpc3Qgb2YgdGhvc2UgbmFtZXMgKHdpdGhvdXQgdGhlIHN1ZmZpeCBhdHRhY2hlZCB0byBpdCkuCiAgICAgICMgVGhpcyBpcyBtb3N0IGhlbHBmdWwgd2hlbiBsb29raW5nIGZvciAibXVsdGktZGltZW5zaW9uYWwgYXJyYXkKICAgICAgIyBpbmRpY2VzIiAoaW4gcXVvdGVzIGJlY2F1c2UgVGNsIGRvZXNuJ3Qgc3VwcG9ydCBtdWx0aXBsZQogICAgICAjIGRpbWVuc2lvbnMgZm9yIGFycmF5IGluZGljZXMpCiAgICAgICMKCiAgICAgIHNldCBzdWZmaXhfbGVuZ3RoIFtzdHJpbmcgbGVuZ3RoICRzdWZmaXhdCiAgICAgIHNldCBhbGxfbmFtZXMgW2FycmF5IG5hbWVzIHRoZV9hcnJheSAtZ2xvYiAiKiRzdWZmaXgiXQogICAgICBzZXQgbmFtZXMgW2xpc3RdCiAgICAgIGZvcmVhY2ggbmFtZSAkYWxsX25hbWVzIHsKICAgICAgICAgc2V0IGxlbmd0aCBbc3RyaW5nIGxlbmd0aCAkbmFtZV0KICAgICAgICAgc2V0IGluZGV4IFtzdHJpbmcgcmFuZ2UgJG5hbWUgMCBbZXhwciAkbGVuZ3RoIC0gJHN1ZmZpeF9sZW5ndGggLSAxXV0KICAgICAgICAgbGFwcGVuZCBuYW1lcyAkaW5kZXgKICAgICAgfQogICAgICByZXR1cm4gJG5hbWVzCiAgIH0KCiAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAjIFV0aWxpdHkgcHJvY2VkdXJlcyBvbiBsaXN0cwogICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgIHByb2MgbGludGVyc2VjdGlvbiB7bGlzdGEgbGlzdGJ9IHsKICAgICAgIwogICAgICAjIFJldHVybiB0aGUgaW50ZXJzZWN0aW9uIG9mIGxpc3RhIGFuZCBsaXN0YiwgcmVtb3ZpbmcgYW55IGR1cGxpY2F0ZXMKICAgICAgIwoKICAgICAgc2V0IGludGVyc2VjdCBbbGlzdF0KICAgICAgZm9yZWFjaCBhICRsaXN0YSB7CiAgICAgICAgIGlmIHsoW2xzZWFyY2ggJGxpc3RiICRhXSAhPSAtMSkgJiYgXAogICAgICAgICAgICAgICAgKFtsc2VhcmNoICRpbnRlcnNlY3QgJGFdID09IC0xKX0gewogICAgICAgICAgICBsYXBwZW5kIGludGVyc2VjdCAkYQogICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuICRpbnRlcnNlY3QKICAgfQoKCiAgIHByb2MgbHVuaW9uIHtsaXN0YSBsaXN0Yn0gewogICAgICAjCiAgICAgICMgUmV0dXJuIHRoZSB1bmlvbiBvZiBsaXN0YSBhbmQgbGlzdGIsIHJlbW92aW5nIGFueSBkdXBsaWNhdGVzCiAgICAgICMKCiAgICAgIHNldCB1bmlvbiBbbGlzdF0KICAgICAgZm9yZWFjaCBhICRsaXN0YSB7CiAgICAgICAgIGlmIHtbbHNlYXJjaCAkdW5pb24gJGFdID09IC0xfSB7CiAgICAgICAgICAgIGxhcHBlbmQgdW5pb24gJGEKICAgICAgICAgfQogICAgICB9CiAgICAgIGZvcmVhY2ggYiAkbGlzdGIgewogICAgICAgICBpZiB7W2xzZWFyY2ggJHVuaW9uICRiXSA9PSAtMX0gewogICAgICAgICAgICBsYXBwZW5kIHVuaW9uICRiCiAgICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gJHVuaW9uCiAgIH0KCiAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAjIFV0aWxpdGllcyB0byBoYW5kbGUgZGlmZmVyZW50IGNvbnRyb2wgc3RydWN0dXJlIG91dHB1dCAoaWYtdGhlbi1lbHNlLAogICAjIGZvcmVhY2gsIGV0Yy4pCiAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgcHJvYyBmb3JfZWFjaCB7dmFyIHZhcl9saXN0IGNvZGVfYmxvY2t9IHsKICAgICAgIwogICAgICAjIFJldHVybiBhIHN0cmluZyBmb3IgYSBUY2wgZm9yZWFjaCBibG9jawogICAgICAjCgogICAgICBzZXQgY29kZSAiIgogICAgICBpZiB7IVtsbGVuZ3RoICRjb2RlX2Jsb2NrXX0gewogICAgICAgICByZXR1cm4gJGNvZGUKICAgICAgfQoKICAgICAgc2V0IGNvZGUgImZvcmVhY2ggJHZhciAkdmFyX2xpc3QgXHtcbiIKICAgICAgZm9yZWFjaCBsaW5lIFtnZXRMaW5lcyAkY29kZV9ibG9ja10gewogICAgICAgICBhcHBlbmQgY29kZSAiICAgJGxpbmUiCiAgICAgIH0KICAgICAgYXBwZW5kIGNvZGUgIlx9XG4iCiAgICAgIHJldHVybiAkY29kZQogICB9CgogICBwcm9jIGdldF9saW5lcyB7Y29kZV9ibG9ja30gewogICAgICAjCiAgICAgICMgUmV0dXJuIGEgbGlzdCBvZiBsaW5lcyBmcm9tIHRoZSBzdHJpbmdzIGluIGNvZGVfYmxvY2sKICAgICAgIwoKICAgICAgc2V0IGJsb2NrIFtsaXN0XQogICAgICB3aGlsZSB7W2xsZW5ndGggJGNvZGVfYmxvY2tdfSB7CiAgICAgICAgIHNldCBpbmRleCBbc3RyaW5nIGZpcnN0ICJcbiIgJGNvZGVfYmxvY2tdCiAgICAgICAgIGlmIHskaW5kZXggPT0gLTF9IHsKICAgICAgICAgICAgc2V0IGluZGV4IFtzdHJpbmcgbGVuZ3RoICRjb2RlX2Jsb2NrXQogICAgICAgICB9CiAgICAgICAgIHNldCBsaW5lIFtzdHJpbmcgcmFuZ2UgJGNvZGVfYmxvY2sgMCAkaW5kZXhdCiAgICAgICAgIHNldCBjb2RlX2Jsb2NrIFtzdHJpbmcgcmFuZ2UgJGNvZGVfYmxvY2sgW2V4cHIgJGluZGV4ICsgMV0gZW5kXQoKICAgICAgICAgaWYge1tzdHJpbmcgaW5kZXggJGxpbmUgZW5kXSAhPSAiXG4ifSB7CiAgICAgICAgICAgIGFwcGVuZCBsaW5lICJcbiIKICAgICAgICAgfQogICAgICAgICBsYXBwZW5kIGJsb2NrICRsaW5lCiAgICAgIH0KCiAgICAgIHJldHVybiAkYmxvY2sKICAgfQoKICAgcHJvYyBpZl9lbHNlIHtjb25kIHRoZW5fYmxvY2sge2Vsc2VfYmxvY2sgIiJ9fSB7CiAgICAgICMKICAgICAgIyBPdXRwdXQgYSBUY2wgaWYtdGhlbi1lbHNlIGJsb2NrIHdpdGggdGhlIHBhc3NlZCBkYXRhLgogICAgICAjCgogICAgICBzZXQgY29tbWFuZCAiaWYgXHskY29uZFx9IFx7XG4iCiAgICAgIGZvcmVhY2ggbGluZSBbZ2V0X2xpbmVzICR0aGVuX2Jsb2NrXSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgICAkbGluZSIKICAgICAgfQogICAgICBpZiB7W2xsZW5ndGggJGVsc2VfYmxvY2tdfSB7CiAgICAgICAgIGFwcGVuZCBjb21tYW5kICJcfSBlbHNlIFx7XG4iCiAgICAgICAgIGZvcmVhY2ggbGluZSBbZ2V0X2xpbmVzICRlbHNlX2Jsb2NrXSB7CiAgICAgICAgICAgIGFwcGVuZCBjb21tYW5kICIgICAkbGluZSIKICAgICAgICAgfQogICAgICB9CiAgICAgIGFwcGVuZCBjb21tYW5kICJcfVxuIgogICAgICByZXR1cm4gJGNvbW1hbmQKICAgfQoKICAgcHJvYyBwcmV0dHlfcHJpbnRfbGlzdHMge2xpbmUgZGVidWd9IHsKICAgICAgIwogICAgICAjIElmIHRoZXJlIGlzIGFuIGV4cGxpY2l0IFRjbCBsaXN0IGluIHRoZSBsaW5lLCB3ZSBtYXkgd2FudCB0bwogICAgICAjIHNlcGFyYXRlIGl0IG91dCBpbnRvIG11bHRpcGxlIGxpbmVzLiAgSXQgd2lsbCB0dXJuIGEgbGlzdCBmcm9tCiAgICAgICMgICAgICAgW2xpc3QgYSBiIGNdCiAgICAgICMgaW50bwogICAgICAjICAgICAgIFtsaXN0IGEgXAogICAgICAjICAgICAgICAgICAgIGIgXAogICAgICAjICAgICAgICAgICAgIGNdCiAgICAgICMgVGhhdCBtYXkgbm90IGxvb2sgbGlrZSBtdWNoLCBidXQgZm9yIGxpc3RzIHRoYXQgaGF2ZSByZWFsbHkgKmJpZyoKICAgICAgIyB0ZXh0IGVudHJpZXMsIGl0IG1ha2VzIGl0IGxvb2sgYSBsb3QgbmljZXIKICAgICAgIwogICAgICAjIElmIHRoZXJlIGlzIG5vIGxpc3QgaW4gdGhlIGxpbmUsIGRvIG5vdGhpbmcKICAgICAgIwoKICAgICAgc2V0IGVuZENoYXIgW3N0cmluZyBpbmRleCAkbGluZSBlbmRdCiAgICAgIHNldCBsaW5lIFtzdHJpbmcgdHJpbXJpZ2h0ICRsaW5lXQogICAgICBpZiB7JGVuZENoYXIgPT0gIlxuIn0gewogICAgICAgICBhcHBlbmQgbGluZSAiXG4iCiAgICAgIH0KICAgICAgc2V0IGxpc3RQb3MgW3N0cmluZyBmaXJzdCAiXFtsaXN0ICIgJGxpbmVdCiAgICAgIGlmIHskbGlzdFBvcyA9PSAtMX0gewogICAgICAgICByZXR1cm4gJGxpbmUKICAgICAgfQogICAgICBzZXQgb3JpZ2luYWwgJGxpbmUKCiAgICAgICMKICAgICAgIyBJbml0aWFsaXplIHRoZSBsaW5lIHdpdGggdGhlIGNvbnRlbnRzIG9mIHRoZSBsaW5lIHVwIHRvIGFuZCBpbmNsdWRpbmcKICAgICAgIyB0aGUgIltsaXN0ICIgdGV4dC4gIEFsc28gZGV0ZXJtaW5lIHRoZSBhbW91bnQgb2YgaW5kZW50YXRpb24gaW4gdGhlCiAgICAgICMgbGluZSBzbyB0aGF0IHdlIGtub3cgd2hhdCB0byBkbyBmb3Igc3Vic2VxdWVudCBsaW5lcwogICAgICAjCgogICAgICBpbmNyIGxpc3RQb3MgNQogICAgICBzZXQgbmV4dExpbmUgW3N0cmluZyByYW5nZSAkbGluZSAwICRsaXN0UG9zXQogICAgICBzZXQgaW5kZW50IFtzdHJpbmcgcmVwZWF0ICIgIiBbc3RyaW5nIGxlbmd0aCAkbmV4dExpbmVdXQogICAgICBzZXQgbGluZSBbc3RyaW5nIHRyaW1sZWZ0IFtzdHJpbmcgcmFuZ2UgJGxpbmUgJGxpc3RQb3MgZW5kXV0KCiAgICAgICMKICAgICAgIyBNYWtlIHN1cmUgdGhhdCB0aGVyZSBpcyBubyBzcGFjZSBiZXR3ZWVuIHRoZSBjbG9zZSBicmFjZSBpbiB0aGUgbGlzdAogICAgICAjIGFuZCB0aGUgbGFzdCB0ZXh0IGluIHRoZSBsaXN0LiAgVGhpcyB3aWxsIGhlbHAgd2l0aCBwcm9jZXNzaW5nIChiZWxvdykKICAgICAgIwoKICAgICAgc2V0IGxpbmUgW3N0cmluZyB0cmltcmlnaHQgJGxpbmVdCiAgICAgIGlmIHtbc3RyaW5nIGluZGV4ICRsaW5lIGVuZF0gIT0gIlxdIn0gewogICAgICAgICByZXR1cm4gJG9yaWdpbmFsCiAgICAgIH0KICAgICAgc2V0IGxpbmUgW3N0cmluZyByYW5nZSAkbGluZSAwIFtleHByIFtzdHJpbmcgbGVuZ3RoICRsaW5lXSAtIDJdXQogICAgICBzZXQgbGluZSBbc3RyaW5nIHRyaW1yaWdodCAkbGluZV0KICAgICAgYXBwZW5kIGxpbmUgIlxdXG4iCgogICAgICAjCiAgICAgICMgUGFyc2UgZWFjaCBlbGVtZW50IGluIHRoZSBsaXN0CiAgICAgICMKCiAgICAgIHNldCBwcmludFN0cmluZyAiIgogICAgICB3aGlsZSB7W3N0cmluZyBsZW5ndGggJGxpbmVdfSB7CiAgICAgICAgICMKICAgICAgICAgIyBHZXQgdGhlIG5leHQgaXRlbSBpbiB0aGUgbGlzdAogICAgICAgICAjCgogICAgICAgICBzZXQgc3BhY2UgW3N0cmluZyBmaXJzdCAiICIgJGxpbmVdCiAgICAgICAgIGlmIHskc3BhY2UgPT0gLTF9IHsKICAgICAgICAgICAgc2V0IHNwYWNlIFtzdHJpbmcgbGVuZ3RoICRsaW5lXQogICAgICAgICB9CiAgICAgICAgIHNldCBhcmcgW3N0cmluZyByYW5nZSAkbGluZSAwICRzcGFjZV0KICAgICAgICAgYXBwZW5kIG5leHRMaW5lICRhcmcKCiAgICAgICAgICMKICAgICAgICAgIyBSZW1vdmUgdGhhdCBpdGVtIGZyb20gdGhlIGxpbmUKICAgICAgICAgIwoKICAgICAgICAgc2V0IGxpbmUgW3N0cmluZyByYW5nZSAkbGluZSBbZXhwciAkc3BhY2UgKyAxXSBlbmRdCiAgICAgICAgIHNldCBsaW5lIFtzdHJpbmcgdHJpbWxlZnQgJGxpbmVdCiAgICAgICAgIGlmIHtbc3RyaW5nIGxlbmd0aCAkbGluZV19IHsKICAgICAgICAgICAgaWYge1tzdHJpbmcgbGVuZ3RoICRuZXh0TGluZV0gPiA4MH0gewogICAgICAgICAgICAgICBhcHBlbmQgcHJpbnRTdHJpbmcgIiRuZXh0TGluZVxcXG4iCiAgICAgICAgICAgICAgIHNldCBuZXh0TGluZSAkaW5kZW50CiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICB9CiAgICAgIGFwcGVuZCBwcmludFN0cmluZyAkbmV4dExpbmUKICAgICAgcmV0dXJuICRwcmludFN0cmluZwogICB9CgogICBwcm9jIHByZXR0eV9wcmludCB7Y29tbWFuZHMgZm9ybWF0X29wdGlvbnMge2RlYnVnIDB9fSB7CgogICAgICBnbG9iYWwgdmFycwoKICAgICAgIwogICAgICAjIFByZXR0eSBwcmludCB0aGUgbGluZXMsIG9uZSBieSBvbmUuICBUaGUgZm9sbG93aW5nIHdpbGwgYmUgZG9uZToKICAgICAgIyAgIG8gSWYgdGhlIGxpbmUgaXMgZ3JlYXRlciB0aGFuIDgwIGNvbHVtbnMsIHdlIHdpbGwgYnJlYWsgaXQgdXAKICAgICAgIyAgICAgYWxvbmcgdGhlIG9wdGlvbnMgKC1vcHRpb24pIGFuZCBpbmRlbnQKICAgICAgIyAgIG8gRml4IGFueSBpbmRlbnRhdGlvbgogICAgICAjCgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY2F0Y2hfZXJyb3JzKV0gJiYgJHZhcnMoY2F0Y2hfZXJyb3JzKX0gewogICAgICAgICBzZXQgaW5kZW50IDMKICAgICAgfSBlbHNlIHsKICAgICAgICAgc2V0IGluZGVudCAwCiAgICAgIH0KICAgICAgc2V0IGxpbmVzICIiCiAgICAgIHNldCBsZW4gW3N0cmluZyBsZW5ndGggJGNvbW1hbmRzXQogICAgICB3aGlsZSB7JGxlbiA+IDB9IHsKICAgICAgICAgIwogICAgICAgICAjIEhhbmRsZSB0aGUgc2ltcGxlIGNhc2UuICBJZiB0aGUgbGVhZGluZyBjaGFyYWN0ZXIgaXMgYSBjYXJyaWFnZQogICAgICAgICAjIHJldHVybiwgYXBwZW5kIGEgYmxhbmsgbGluZSB0byB0aGUgcHJldHR5LXByaW50ZWQgbGluZXMgYW5kCiAgICAgICAgICMgY29udGludWUgb24KICAgICAgICAgIwoKICAgICAgICAgc2V0IGNyIFtzdHJpbmcgZmlyc3QgIlxuIiAkY29tbWFuZHNdCiAgICAgICAgIGlmIHshJGNyfSB7CiAgICAgICAgICAgIHNldCBjb21tYW5kcyBbc3RyaW5nIHJhbmdlICRjb21tYW5kcyAxIGVuZF0KICAgICAgICAgICAgaW5jciBsZW4gLTEKICAgICAgICAgICAgYXBwZW5kIGxpbmVzICJcbiIKICAgICAgICAgICAgY29udGludWUKICAgICAgICAgfQoKICAgICAgICAgIwogICAgICAgICAjIElmIHdlIGRpZG4ndCBmaW5kIGEgY2FycmlhZ2UgcmV0dXJuIGluIHRoZSBzdHJpbmcsIHRoZSBlbnRpcmUgdGhpbmcKICAgICAgICAgIyBpcyBhIHNpbmdsZSBsaW5lLiAgT3RoZXJ3aXNlLCByZW1vdmUgdGhlIG5leHQgbGluZSBmcm9tIHRoZSBzZXQgb2YKICAgICAgICAgIyBsaW5lcy4gIElmIGl0IHN0aWxsIGVuZHMgdXAgYmVpbmcgYSBibGFuayBsaW5lLCBhcHBlbmQgdGhlIGJsYW5rCiAgICAgICAgICMgbGluZSB0byB0aGUgcHJldHR5LXByaW50ZWQgc3RyaW5nIGFuZCBjb250aW51ZSBvbgogICAgICAgICAjCgogICAgICAgICBpZiB7JGNyID09IC0xfSB7CiAgICAgICAgICAgIHNldCBsaW5lICRjb21tYW5kcwogICAgICAgICAgICBzZXQgY29tbWFuZHMgIiIKICAgICAgICAgICAgc2V0IGxlbiAwCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNldCBsaW5lIFtzdHJpbmcgcmFuZ2UgJGNvbW1hbmRzIDAgJGNyXQogICAgICAgICAgICBzZXQgY29tbWFuZHMgW3N0cmluZyByYW5nZSAkY29tbWFuZHMgW2luY3IgY3JdIGVuZF0KICAgICAgICAgICAgc2V0IGxlbiBbZXhwciAkbGVuIC0gJGNyXQogICAgICAgICB9CiAgICAgICAgIHNldCBsaW5lIFtzdHJpbmcgdHJpbXJpZ2h0ICRsaW5lXQogICAgICAgICBpZiB7IVtzdHJpbmcgbGVuZ3RoICRsaW5lXX0gewogICAgICAgICAgICBhcHBlbmQgbGluZXMgIlxuIgogICAgICAgICAgICBjb250aW51ZQogICAgICAgICB9CgogICAgICAgICAjCiAgICAgICAgICMgV2UgaGF2ZSBhIHJlYWwgbGluZSB3aXRoIHJlYWwgdGV4dC4gIElmIHRoZXJlIGlzIG5vIHF1b3RlIGluIHRoZQogICAgICAgICAjIHN0cmluZywgY29tcHJlc3MgbXVsdGlwbGUgYmxhbmsgc3BhY2VzIHRvIGEgc2luZ2xlIGJsYW5rIHNwYWNlCiAgICAgICAgICMKCiAgICAgICAgIHNldCBsaW5lIFtzdHJpbmcgdHJpbWxlZnQgJGxpbmVdCiAgICAgICAgIGlmIHtbc3RyaW5nIGZpcnN0ICJcIiIgJGxpbmVdID09IC0xfSB7CiAgICAgICAgICAgIHNldCBsaW5lIFtyZWdzdWIgLWFsbCB7XHMrfSAkbGluZSAiICJdCiAgICAgICAgIH0KCiAgICAgICAgICMKICAgICAgICAgIyBBcHBseSB0aGUgcHJvcGVyIGFtb3VudCBvZiBpbmRlbnRhdGlvbgogICAgICAgICAjCgogICAgICAgICBzZXQgaXNQdXQgW3N0cmluZyBlcXVhbCAtbm9jYXNlIC1sZW5ndGggNSAkbGluZSAicHV0cyAiXQogICAgICAgICBzZXQgZmlyc3RDaGFyIFtzdHJpbmcgaW5kZXggJGxpbmUgMF0KICAgICAgICAgaWYgeyRmaXJzdENoYXIgPT0gIlx9In0gewogICAgICAgICAgICBpbmNyIGluZGVudCAtMwogICAgICAgICB9CiAgICAgICAgIHNldCBibGFua3MgW3N0cmluZyByZXBlYXQgIiAiICRpbmRlbnRdCiAgICAgICAgIHNldCBsaW5lICIke2JsYW5rc30ke2xpbmV9IgogICAgICAgICBpZiB7W3N0cmluZyBpbmRleCAkbGluZSBlbmRdID09ICJceyJ9IHsKICAgICAgICAgICAgaW5jciBpbmRlbnQgMwogICAgICAgICB9CgogICAgICAgICAjCiAgICAgICAgICMgSWYgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyBhIGRhc2gsIHdlIGhhdmUgYWxyZWFkeSBicm9rZW4gdGhlIGxpbmUKICAgICAgICAgIyB1cCBmb3IgcHJldHR5IHByaW50aW5nLgogICAgICAgICAjCgogICAgICAgICBpZiB7JGZpcnN0Q2hhciA9PSAiLSJ9IHsKICAgICAgICAgICAgYXBwZW5kIGxpbmVzICIgICAkbGluZVxuIgogICAgICAgICAgICBjb250aW51ZQogICAgICAgICB9CgogICAgICAgICAjCiAgICAgICAgICMgRG9uJ3QgYm90aGVyIGZvcm1hdHRpbmcgY29tbWVudHMgb3Igc2hvcnQgbGluZXMuICBBbHNvLCBpZiB0aGUKICAgICAgICAgIyByb3V0aW5lIGhhcyBiZWVuIHRvbGQgbm90IHRvIGZvcm1hdCB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMsIGp1c3QKICAgICAgICAgIyBvdXRwdXQgdGhlIGxpbmUKICAgICAgICAgIwoKICAgICAgICAgc2V0IGxpbmVMZW4gW3N0cmluZyBsZW5ndGggJGxpbmVdCiAgICAgICAgIGlmIHskaXNQdXQgfHwgKCRmaXJzdENoYXIgPT0gIlwjIikgfHwKICAgICAgICAgICAgICgkbGluZUxlbiA8IDgwKSB8fCAhJGZvcm1hdF9vcHRpb25zfSB7CiAgICAgICAgICAgIGFwcGVuZCBsaW5lcyAiJGxpbmVcbiIKICAgICAgICAgICAgY29udGludWUKICAgICAgICAgfQoKICAgICAgICAgIwogICAgICAgICAjIFRoZSBsaW5lIGxlbmd0aCBpcyBvdmVyIDgwLCBhbmQgaXQncyBhIHJlYWwgSW5ub3Z1cyBjb21tYW5kLCBhbmQgaXQncwogICAgICAgICAjIG5vdCBhIHByaW50IChwdXRzKSBzdGF0ZW1lbnQuICBTdGFydCBpbmRlbnRpbmcgb24gdGhlIC1vcHRpb24KICAgICAgICAgIyBvcHRpb25zLiAgVGhlIGZpcnN0ICItb3B0aW9uIiBzaG91bGQgYmUgb24gdGhlIHNhbWUgbGluZSBhcyB0aGUKICAgICAgICAgIyBjb21tYW5kLiAgQWxsIHN1YnNlcXVlbnQgb3B0aW9ucyBzaG91bGQgYmUgb24gdGhlaXIgb3duIGxpbmUsCiAgICAgICAgICMgc2xpZ2h0bHkgaW5kZW50ZWQgZnJvbSB0aGUgYmFzaWMgY29tbWFuZAogICAgICAgICAjCgogICAgICAgICBzZXQgZmlyc3REYXNoIFtzdHJpbmcgZmlyc3QgIiAtIiAkbGluZV0KICAgICAgICAgaWYgeyRmaXJzdERhc2ggPT0gLTF9IHsKICAgICAgICAgICAgYXBwZW5kIGxpbmVzICIkbGluZVxuIgogICAgICAgICAgICBjb250aW51ZQogICAgICAgICB9CgogICAgICAgICBzZXQgZGFzaCBbc3RyaW5nIGZpcnN0ICIgLSIgJGxpbmUgW2luY3IgZmlyc3REYXNoXV0KICAgICAgICAgc2V0IGxlYWRpbmcgIiIKICAgICAgICAgd2hpbGUgeyRkYXNoICE9IC0xfSB7CiAgICAgICAgICAgIHNldCBmcmFnbWVudCBbc3RyaW5nIHJhbmdlICRsaW5lIDAgW2V4cHIgJGRhc2ggLSAxXV0KICAgICAgICAgICAgYXBwZW5kIGxpbmVzIFwKICAgICAgICAgICAgICAgW3ByZXR0eV9wcmludF9saXN0cyAiJHtsZWFkaW5nfSR7ZnJhZ21lbnR9IFxcXG4iICRkZWJ1Z10KICAgICAgICAgICAgc2V0IGxlYWRpbmcgIiRibGFua3MgICAiCiAgICAgICAgICAgIHNldCBsaW5lIFtzdHJpbmcgcmFuZ2UgJGxpbmUgW2V4cHIgJGRhc2ggKyAxXSBlbmRdCiAgICAgICAgICAgIHNldCBsaW5lIFtzdHJpbmcgdHJpbWxlZnQgJGxpbmVdCiAgICAgICAgICAgIHNldCBkYXNoIFtzdHJpbmcgZmlyc3QgIiAtIiAkbGluZV0KICAgICAgICAgfQogICAgICAgICBhcHBlbmQgbGluZXMgW3ByZXR0eV9wcmludF9saXN0cyAiJHtsZWFkaW5nfSR7bGluZX1cbiIgJGRlYnVnXQogICAgICB9CiAgICAgIHJldHVybiAkbGluZXMKICAgfQoKICAgcHJvYyBzdHJpcF9saW5lcyB7Y29tbWFuZHMgbWFya2Vyc30gewogICAgICAjCiAgICAgICMgVGhpcyByb3V0aW5lIHN0cmlwcyBvdXQgbGluZXMgZnJvbSAkY29tbWFuZHMgd2hlbiB0aGV5IHN0YXJ0IHdpdGgKICAgICAgIyBhbnkgb2YgdGhlIGxpc3QgZWxlbWVudHMgaW4gJG1hcmtlcnMKICAgICAgIwoKICAgICAgc2V0IGxpbmVzICIiCiAgICAgIHdoaWxlIHtbc3RyaW5nIGxlbmd0aCAkY29tbWFuZHNdID4gMH0gewogICAgICAgICAjCiAgICAgICAgICMgR2V0IHRoZSBuZXh0IGxpbmUgZnJvbSB0aGUgc2V0IG9mIGNvbW1hbmRzCiAgICAgICAgICMKCiAgICAgICAgIHNldCBjciBbc3RyaW5nIGZpcnN0ICJcbiIgJGNvbW1hbmRzXQogICAgICAgICBpZiB7JGNyID09IC0xfSB7CiAgICAgICAgICAgIHNldCBsaW5lICRjb21tYW5kcwogICAgICAgICAgICBzZXQgY29tbWFuZHMgIiIKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0IGxpbmUgW3N0cmluZyByYW5nZSAkY29tbWFuZHMgMCAkY3JdCiAgICAgICAgICAgIHNldCBjb21tYW5kcyBbc3RyaW5nIHJhbmdlICRjb21tYW5kcyBbaW5jciBjcl0gZW5kXQogICAgICAgICB9CgogICAgICAgICAjCiAgICAgICAgICMgSWYgdGhlIGxpbmUgc3RhcnRzIHdpdGggYSBtYXJrZXIsIGlnbm9yZSB0aGUgbGluZQogICAgICAgICAjCgogICAgICAgICBzZXQgdHJpbW1lZCBbc3RyaW5nIHRyaW1sZWZ0ICRsaW5lXQogICAgICAgICBzZXQgbWF0Y2hlZCBmYWxzZQogICAgICAgICBmb3JlYWNoIG1hcmtlciAkbWFya2VycyB7CiAgICAgICAgICAgIHNldCBsZW4gW3N0cmluZyBsZW5ndGggJG1hcmtlcl0KICAgICAgICAgICAgaWYge1tzdHJpbmcgZXF1YWwgLW5vY2FzZSAtbGVuZ3RoICRsZW4gJG1hcmtlciAkdHJpbW1lZF19IHsKICAgICAgICAgICAgICAgc2V0IG1hdGNoZWQgdHJ1ZQogICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgeyRtYXRjaGVkfSB7CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgIH0KICAgICAgICAgYXBwZW5kIGxpbmVzICRsaW5lCiAgICAgIH0KCiAgICAgIHJldHVybiAkbGluZXMKICAgfQoKICAgcHJvYyBnZW5fbWFrZWZpbGUge3N0ZXBzIHR5cGV9IHsKICAgICAgZ2xvYmFsIHZhcnMKICAgICAgZ2xvYmFsIGRlc2MKICAgICAgZ2xvYmFsIGVudgogICAgICBnbG9iYWwgZXJyb3JzCgogICAgICBpZiB7ISR2YXJzKG1ha2VmaWxlKX0gewogICAgICAgICByZXR1cm4KICAgICAgfQoKICAgICAgc2V0IGRlc2Moc3luX21hcCkgIlRlY2hub2xvZ3kgTWFwcGluZyIKICAgICAgc2V0IGRlc2Moc3luX2luY3IpICJJbmNyZW1lbnRhbCBTeW50aGVzaXMiCiAgICAgIHNldCBkZXNjKHN5bl9wbGFjZSkgIlBsYWNlbWVudC9QaHlzaWNhbCBTeW50aGVzaXMiCiAgICAgIHNldCBkZXNjKGluaXQpICJEZXNpZ24gSW1wb3J0IC8gSW5pdGlhbGl6YXRpb24iCiAgICAgIGlmIHskdmFycyhyYyl9IHsKICAgICAgICAgc2V0IGRlc2MocGxhY2UpICJMZWdhbGl6YXRpb24iCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNldCBkZXNjKHBsYWNlKSAiQ2VsbCBQbGFjZW1lbnQiCiAgICAgIH0KICAgICAgc2V0IGRlc2MocHJlY3RzKSAiUHJlQ1RTIE9wdGltaXphdGlvbiIKICAgICAgc2V0IGRlc2MoY3RzKSAiQ2xvY2sgVHJlZSBTeW50aGVzaXMiCiAgICAgIHNldCBkZXNjKHBvc3RjdHMpICJQb3N0Q1RTIE9wdGltaXphdGlvbiIKICAgICAgc2V0IGRlc2MocG9zdGN0c19ob2xkKSAiUG9zdENUUyBIb2xkIEZpeGluZyIKICAgICAgc2V0IGRlc2Mocm91dGUpICJHbG9iYWwvRGV0YWlsIFJvdXRlIgogICAgICBzZXQgZGVzYyhwb3N0cm91dGUpICJQb3N0Um91dGUgT3B0aW1pemF0aW9uIgogICAgICBzZXQgZGVzYyhwb3N0cm91dGVfaG9sZCkgIlBvc3RSb3V0ZSBIb2xkIEZpeGluZyIKICAgICAgc2V0IGRlc2MocG9zdHJvdXRlX3NpX2hvbGQpICJTSSBIb2xkIEZpeGluZyIKICAgICAgc2V0IGRlc2MocG9zdHJvdXRlX3NpKSAiU0kgT3B0aW1pemF0aW9uIgogICAgICBzZXQgZGVzYyhzaWdub2ZmKSAiU2lnbm9mZiBUaW1pbmcgLyBWZXJpZnkiCgogICAgICBpZiB7JHZhcnMoZGVidWcpfSB7CiAgICAgICAgIHB1dHMgIjxERUJVRz4gR2VuZXJhdGluZyAkdHlwZSBtYWtlZmlsZSBpbiBbZXhlYyBwd2RdIGZvciBzdGVwcyAkc3RlcHMgLi4uIgojICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHBhcnRpdGlvbl9kaXIpXX0gewojICAgICAgICAgICAgcHV0cyAidmFycyhwYXJ0aXRpb25fZGlyKSAtPiAkdmFycyhwYXJ0aXRpb25fZGlyKSIKIyAgICAgICAgICAgIHB1dHMgIltmaWxlIHRhaWwgW2ZpbGUgZGlybmFtZSBbZXhlYyBwd2RdXV0gPT0gJHZhcnMocGFydGl0aW9uX2RpcikiCiMgICAgICAgICAgICBwdXRzICJbZmlsZSBkaXJuYW1lIFtleGVjIHB3ZF1dID09IFtmaWxlIG5vcm1hbGl6ZSAkdmFycyhwYXJ0aXRpb25fZGlyKV0iCiMgICAgICAgICB9CiAgICAgIH0KCiAgICAgIHB1dHMgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCiAgICAgIHB1dHMgIjxGRj4gR2VuZXJhdGluZyAkdHlwZSBNYWtlZmlsZSBmb3IgW2xsZW5ndGggJHN0ZXBzXSBzdGVwcyIKICAgICAgcHV0cyAiPEZGPiBEaXJlY3Rvcnk6IFtwd2RdIgogICAgICBwdXRzICI8RkY+ICAgICBTdGVwczogJHN0ZXBzIgojICAgICAgcHV0cyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKICAgICAgIyBCQ0w6IE5vdGUgLSB0aGUgTWFrZWZpbGUgbmVlZHMgdG8gYmUgZml4ZWQgdG8gdGhlIHJ1bmRpciBoZXJlLCBhcyBpdCB3aWxsIGJlIGR1bXBlZCBpbiB0aGUgZmluYWwgZXhwb3J0ZWQKICAgICAgIyB2YXJzLnRjbAogICAgICBpZiB7JHZhcnMobWFrZSkgPT0gImFsbCJ9IHsKICAgICAgICAgaWYgeyhbZmlsZSB0YWlsIFtmaWxlIGRpcm5hbWUgW2V4ZWMgcHdkXV1dID09ICR2YXJzKHBhcnRpdGlvbl9kaXIpKSB8fCBcCiAgICAgICAgICAgICAoW2ZpbGUgdGFpbCBbZmlsZSBkaXJuYW1lIFtleGVjIHB3ZF1dXSA9PSAkdmFycyhwYXJ0aXRpb25fZGlyX3Bhc3MyKSl9IHsKICAgICAgICAgICAgc2V0IHZhcnMobWFrZWZpbGVfbmFtZSkgIk1ha2VmaWxlIgogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXQgdmFycyhtYWtlZmlsZV9uYW1lKSAiXCR2YXJzKHJ1bmRpcikvTWFrZWZpbGUiCiAgICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAgaWYge1tmaWxlIHRhaWwgW2ZpbGUgZGlybmFtZSBbZXhlYyBwd2RdXV0gPT0gJHZhcnMocGFydGl0aW9uX2Rpcil9IHsKICAgICAgICAgICAgc2V0IHZhcnMobWFrZWZpbGVfbmFtZSkgIk1ha2VmaWxlLiR2YXJzKGFyZ3YpIgogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXQgdmFycyhtYWtlZmlsZV9uYW1lKSAiXCR2YXJzKHJ1bmRpcikvTWFrZWZpbGUuJHZhcnMoYXJndikiCiAgICAgICAgIH0KICAgICAgfQoKICAgICAgcmVnc3ViIC1hbGwgIiAiICR2YXJzKG1ha2VmaWxlX25hbWUpICJfIiB2YXJzKG1ha2VmaWxlX25hbWUpCgogICAgICBzZXQgb3AgW29wZW4gW3N1YnN0ICR2YXJzKG1ha2VmaWxlX25hbWUpXSB3XQojICAgICAgaWYgeyR2YXJzKGRlYnVnKX0gewojICAgICAgICAgcHV0cyAiPERFQlVHPiBPcGVuaW5nIGZpbGU6ICR2YXJzKG1ha2VmaWxlX25hbWUpIGluIFtleGVjIHB3ZF0gLT4gJG9wIgojICAgICAgfQojICAgICAgc2V0IHN0b3Agc2lnbm9mZgogICAgICBzZXQgc3RvcCBbbGluZGV4ICR2YXJzKHN0ZXBzKSBbZXhwciBbbGxlbmd0aCAkdmFycyhzdGVwcyldLTFdXQogICAgICBpZiB7JHZhcnMocmMpICYmIFtpbmZvIGV4aXN0cyB2YXJzKHJjX3N0ZXBzKV19IHsKICAgICAgICAgc2V0IHN0YXJ0IFtsaW5kZXggJHZhcnMocmNfc3RlcHMpIDBdCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNldCBzdGFydCBbbGluZGV4ICR2YXJzKHN0ZXBzKSAwXQogICAgICB9CgogICAgICBpZiB7JHR5cGUgPT0gImhpZXIifSB7CiAgICAgICAgIHNldCB0eXBlIHRvcF9kb3duCiAgICAgICAgIGlmIHskdmFycyhoaWVyX2Zsb3dfdHlwZSkgPT0gIjJwYXNzIn0gewogICAgICAgICAgICBzZXQgdHlwZSAycGFzcwogICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX2ZsZXhpbG0pfSB7CiAgICAgICAgICAgICAgc2V0IHR5cGUgZmxleGlsbQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfQogICAgICBpZiB7JHR5cGUgPT0gInVzZXIifSB7IHNldCB0eXBlIGZsYXQgfQoKCiAgICAgIHN3aXRjaCAkdHlwZSB7CgogICAgICAgICAiZmxhdCIgewogICAgICAgICAgICBzZXQgZXhlY3V0ZV9zdHJpbmcgW2pvaW4gJHZhcnMoZXhlY3V0ZV9zdHJpbmcpXQogICAgICAgICAgICBwdXRzICRvcCAiVkVSU0lPTj0xNy4xMC1wMDAzXzEiCiAgICAgICAgICAgIHB1dHMgJG9wICJWUEFUSD0kZW52KFZQQVRIKSIKICAgICAgICAgICAgcHV0cyAkb3AgIlRDTFNIPVtsaW5kZXggJGV4ZWN1dGVfc3RyaW5nIDBdIgogICAgICAgICAgICBwdXRzICRvcCAiR0VOX0ZMT1c9Wzo6RkY6OnJlbFBhdGhUbyBbZmlsZSBub3JtYWxpemUgW3N1YnN0IFtsaW5kZXggJGV4ZWN1dGVfc3RyaW5nIDFdXV0gW2ZpbGUgbm9ybWFsaXplIFtzdWJzdCAkdmFycyhydW5kaXIpXV1dIgogICAgICAgICAgICBwdXRzICRvcCAiU0VUVVBfUEFUSD1bcmVsUGF0aFRvIFtmaWxlIG5vcm1hbGl6ZSBbc3Vic3QgJHZhcnMoc2V0dXBfcGF0aCldXSBbZmlsZSBub3JtYWxpemUgW3N1YnN0ICR2YXJzKHJ1bmRpcildXV0iCiAgICAgICAgICAgIHB1dHMgJG9wICJUT09MPSR2YXJzKG1ha2VfdG9vbCkiCiAgICAgICAgICAgIHB1dHMgJG9wICJBUkdTPSR2YXJzKG1ha2VfdG9vbF9hcmdzKSIKICAgICAgICAgICAgcHV0cyAkb3AgIkZTVEVQUz0kc3RlcHMiCiAgICAgICAgICAgIGlmIHskdmFycyhyYyl9IHsKICAgICAgICAgICAgICAgcHV0cyAkb3AgIlNZTl9UT09MPSR2YXJzKG1ha2Vfc3luX3Rvb2wpIgogICAgICAgICAgICAgICBwdXRzICRvcCAiU1lOX0FSR1M9JHZhcnMobWFrZV9zeW5fdG9vbF9hcmdzKSIKICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoc3luX2xvZ19kaXIpXX0gewogICAgICAgICAgICAgICAgIHB1dHMgJG9wICJTWU5fTE9HPVtyZWxQYXRoVG8gW2ZpbGUgbm9ybWFsaXplIFtzdWJzdCAkdmFycyhzeW5fbG9nX2RpcildXSBbZmlsZSBub3JtYWxpemUgJHZhcnMocnVuZGlyKV1dIgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7W3JlZ2V4cCAkdmFycyhwYXJ0aXRpb25fZGlyKSBbZmlsZSB0YWlsIFtmaWxlIGRpcm5hbWUgW3B3ZF1dXV19IHsKICAgICAgICAgICAgICAgcHV0cyAkb3AgIlNDUklQVFM9JHZhcnMoc2NyaXB0X2RpcikiCiAgICAgICAgICAgICAgIHB1dHMgJG9wICJMT0c9JHZhcnMobG9nX2RpcikiCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICMgQkNMOiBBZGRlZCB0aGUgZm9sbG93aW5nIGluIG9yZGVyIHRvIGZpeCB0aGUgZGlmZmVyZW5jZSBpbiBsb2NhdGlvbiBiZXR3ZWVuIHRoZSBydW5kaXIgYW5kIHNjcmlwdHMgbG9jYXRpb24KICAgICAgICAgICAgICAgcHV0cyAkb3AgIlNDUklQVFM9W3JlbFBhdGhUbyBbZmlsZSBub3JtYWxpemUgJHZhcnMoc2NyaXB0X2RpcildIFtmaWxlIG5vcm1hbGl6ZSAkdmFycyhydW5kaXIpXV0iCiAgICAgICAgICAgICAgICMgQkNMOiBBZGRlZCBzdWJzdCB0byByZXNvbHZlIHZhcnMocnVuZGlyKQogICAgICAgICAgICAgICAjIEJDTDogVGhlbiBtb2RpZmllZCB0byBtYWtlIHJlbGF0aXZlIHRvIHRoZSBydW5kaXIKICAgICAgICAgICAgICAgcHV0cyAkb3AgIkxPRz1bcmVsUGF0aFRvIFtmaWxlIG5vcm1hbGl6ZSBbc3Vic3QgJHZhcnMobG9nX2RpcildXSBbZmlsZSBub3JtYWxpemUgJHZhcnMocnVuZGlyKV1dIgogICAgICAgICAgICB9CiAgICAgICAgICAgIHB1dHMgJG9wICJCUk9XU0VSPSR2YXJzKG1ha2VfYnJvd3NlcikiCiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhtYWtlX3VwZGF0ZSldfSB7CiAgICAgICAgICAgICAgIHB1dHMgJG9wICJVUERBVEU9JHZhcnMobWFrZV91cGRhdGUpIgogICAgICAgICAgICB9IGVsc2VpZiB7W2ZpbGUgdGFpbCBbZmlsZSBkaXJuYW1lIFtwd2RdXV0gIT0gIiR2YXJzKHBhcnRpdGlvbl9kaXIpIn0gewogICAgICAgICAgICAgICBwdXRzICRvcCAiVVBEQVRFPXllcyIKICAgICAgICAgICAgfQogICAgICAgICAgICBwdXRzICRvcCAiIgoKICAgICAgICAgICAgcHV0cyAkb3AgIlNURVBTID0gW2Zvcm1hdCAidmVyc2lvbiBzZXR1cCAlcyBkb19jbGVhbnVwIiAkc3RlcHNdIgogICAgICAgICAgICBwdXRzICRvcCAiRkZfU1RBUlQgPSAkc3RhcnQiCiAgICAgICAgICAgIHB1dHMgJG9wICJGRl9TVE9QID0gJHN0b3AiCiAgICAgICAgICAgIHB1dHMgJG9wICIiCiAgICAgICAgICAgIHB1dHMgJG9wIFtmb3JtYXQgImFsbDogdmVyc2lvbiBzZXR1cCAlcyBkb19jbGVhbnVwIiAkc3RlcHNdCiAgICAgICAgICAgIHB1dHMgJG9wICIiCiAgICAgICAgICAgIHB1dHMgJG9wICJ2ZXJzaW9uOiIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCJcIyBGb3VuZGF0aW9uIEZsb3dzIFZlcnNpb24gXCQoVkVSU0lPTilcIiIKICAgICAgICAgICAgcHV0cyAkb3AgIiIKICAgICAgICAgICAgcHV0cyAkb3AgImhlbHA6IgogICAgICAgICAgICBwdXRzICRvcCAiXHRAZWNobyBcIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVwiIgogICAgICAgICAgICBwdXRzICRvcCAiXHRAZWNobyBcIiAgICAgICAgICAgXCQoVkVSU0lPTikgIEZvdW5kYXRpb24gRmxvd3NcIiIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cIiIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCIgICBNYWtlZmlsZSBUYXJnZXRzXCIiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XCIiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiICAgICAgICAgICAgICAgc2V0dXAgOiBTZXR1cCBSdW4gRGlyZWN0b3J5XCIiCiAgICAgICAgICAgIGlmIHskdmFycyhyYykgJiYgW2luZm8gZXhpc3RzIHZhcnMocmNfc3RlcHMpXX0gewogICAgICAgICAgICAgICBmb3JlYWNoIHN0ZXAgJHZhcnMocmNfc3RlcHMpIHsKICAgICAgICAgICAgICAgICBwdXRzICRvcCAiXHRAZWNobyBcIiAgICAgICAgICAgICAkc3RlcCA6ICRkZXNjKCRzdGVwKVwiIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yZWFjaCBzdGVwICRzdGVwcyB7CiMgICAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiICAgICAgICAgICAgICRzdGVwIDogJGRlc2MoJHN0ZXApXCIiCiAgICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgZGVzYygkc3RlcCldfSB7CiAgICAgICAgICAgICAgICBzZXQgZGVzYygkc3RlcCkgIk5vIGluZm9ybWF0aW9uIGZvciB0aGlzIHN0ZXAiCiAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICBzZXQgdGVtcCBbZm9ybWF0ICIlKzIxcyA6ICUtNDVzIiAkc3RlcCAkZGVzYygkc3RlcCldCiAgICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gJHRlbXAiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cIiIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCIgICAgICAgICAgICAgICAgIGFsbCA6IEFsbCBkZXNpZ24gc3RlcHNcIiIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCIgICAgICAgICAgICAgIHNpbXBsZSA6IFNpbmdsZSBzY3JpcHQgKGFsbCBzdGVwcyBpbiBhIHNpbmdsZSBzZXNzaW9uKSAtIG5vIHN0b3Avc3RhcnRcIiIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCIgICAgICAgICAgICAgIHNpbmdsZSA6IFNpbmdsZSBzY3JpcHQgKGFsbCBzdGVwcyBpbiBhIHNpbmdsZSBzZXNzaW9uKVwiIgogICAgICAgICAgICBwdXRzICRvcCAiXHRAZWNobyBcIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVwiIgogICAgICAgICAgICBwdXRzICRvcCAiXHRAZWNobyBcIiAgIE1ha2VmaWxlIE9wdGlvbnNcIiIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cIiIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCIgICBWUEFUSCA6IE1ha2UgZGlyZWN0b3J5ICAgIChkZWZhdWx0IG1ha2UpXCIiCiAgICAgICAgICAgIGlmIHskdmFycyhub3Z1cyl9ICB7IAogICAgICAgICAgICAgICBwdXRzICRvcCAiXHRAZWNobyBcIiAgICBUT09MIDogSU5OT1ZVUyBleGVjdXRhYmxlIChkZWZhdWx0IGlubm92dXMpXCIiCiAgICAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiICAgIEFSR1MgOiBJTk5PVlVTIGFyZ3VtZW50cyAgKGRlZmF1bHQgLW5vd2luIC02NClcIiIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCIgICAgVE9PTCA6IElOTk9WVVMgZXhlY3V0YWJsZSAgICAgKGRlZmF1bHQgaW5ub3Z1cylcIiIKICAgICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCIgICAgQVJHUyA6IElOTk9WVVMgYXJndW1lbnRzICAgICAgKGRlZmF1bHQgLW5vd2luIC02NClcIiIKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7JHZhcnMocmMpfSB7CiAgICAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiU1lOX1RPT0wgOiBHRU5VUyBleGVjdXRhYmxlICAgICAgKGRlZmF1bHQgZ2VudXMpXCIiCiAgICAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiU1lOX0FSR1MgOiBHRU5VUyBhcmd1bWVudHMgICAgICAgKGRlZmF1bHQgLTY0KVwiIgogICAgICAgICAgICAgICBwdXRzICRvcCAiXHRAZWNobyBcIlNZTl9MT0cgIDogR0VOVVMgbG9nIGRpciAgICAgICAgIChkZWZhdWx0IFJDL2xvZ3MvPHN0YWdlPi5sb2cpXCIiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYge1tmaWxlIHRhaWwgW2ZpbGUgZGlybmFtZSBbcHdkXV1dICE9ICIkdmFycyhwYXJ0aXRpb25fZGlyKSJ9IHsKICAgICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCIgIFVQREFURSA6IFVwZGF0ZSBzY3JpcHRzICAgIChkZWZhdWx0IHllcylcIiIKICAgICAgICAgICAgfQogICAgICAgICAgICBwdXRzICRvcCAiXHRAZWNobyBcIiBTQ1JJUFRTIDogU2NyaXB0IGRpcmVjdG9yeSAgKGRlZmF1bHQgJHZhcnMoc2NyaXB0X2RpcikpXCIiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiICAgICBMT0cgOiBMb2dmaWxlIGRpcmVjdG9yeSAoZGVmYXVsdCBbc3Vic3QgJHZhcnMobG9nX2RpcikpXVwiIgogICAgICAgICAgICBwdXRzICRvcCAiXHRAZWNobyBcIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVwiIgogICAgICAgICAgICBwdXRzICRvcCAiIgojICAgICAgICAgICAgaWYge1tmaWxlIHRhaWwgW2ZpbGUgZGlybmFtZSBbcHdkXV1dICE9ICIkdmFycyhwYXJ0aXRpb25fZGlyKSJ9IHsKIyAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhwbHVnX2ZpbGVzKV19IHsKIyAgICAgICAgICAgICAgICAgIHB1dHMgJG9wICJmbG93OiAkdmFycyhjb25maWdfZmlsZXMpICR2YXJzKHBsdWdfZmlsZXMpIgojICAgICAgICAgICAgICAgfSBlbHNlIHsKIyAgICAgICAgICAgICAgICAgIHB1dHMgJG9wICJmbG93OiAkdmFycyhjb25maWdfZmlsZXMpIgojICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGlmIFxbIFwkKFVQREFURSkgPT0geWVzIF0gOyB0aGVuIFxcIgojICAgICAgICAgICAgICAgcHV0cyAkb3AgIlx0XHRbbGluZGV4ICRleGVjdXRlX3N0cmluZyAwXSBbbGluZGV4ICRleGVjdXRlX3N0cmluZyAxXSAtbSBmbGF0IGFsbCA7IFxcIgojICAgICAgICAgICAgICAgcHV0cyAkb3AgIlx0XHQvYmluL3RvdWNoIFwkKFZQQVRIKS9cJEAgOyBcXCIKIyAgICAgICAgICAgICAgIHB1dHMgJG9wICJcdGVsc2UgXFwiCiMgICAgICAgICAgICAgICBwdXRzICRvcCAiXHRcdGVjaG8gJ1NLSVBQSU5HIEZMT1cgVVBEQVRFIC4uLicgOyBcXCIKIyAgICAgICAgICAgICAgIHB1dHMgJG9wICJcdGZpIgojICAgICAgICAgICB9IGVsc2UgewojICAgICAgICAgICAgICAgcHV0cyAkb3AgImZsb3c6IgojICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHV0cyAkb3AgIlxuc2ltcGxlOiBzZXR1cCIKICAgICAgICAgICAgaWYgeyR2YXJzKHN0ZXBfYXJnKSA9PSAiYWxsIn0gewogICAgICAgICAgICAgICBwdXRzICRvcCAiXHRGRl9TVE9QPVwkKEZGX1NUT1ApOyBWUEFUSD1cJChWUEFUSCk7IGV4cG9ydCBWUEFUSDsgXCQoVE9PTCkgLWluaXQgXCQoU0NSSVBUUykvSU5OT1ZVUy9ydW5fc2ltcGxlLnRjbCAtbG9nIFwkKExPRykvc2ltcGxlLmxvZyBcJChBUkdTKSIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgcHV0cyAkb3AgIlx0RkZfU1RPUD1cJChGRl9TVE9QKTsgVlBBVEg9XCQoVlBBVEgpOyBleHBvcnQgVlBBVEg7IFwkKFRPT0wpIC1pbml0IFwkKFNDUklQVFMpL0lOTk9WVVMvcnVuX3NpbXBsZS4kdmFycyhzdGVwX2FyZykudGNsIC1sb2cgXCQoTE9HKS9zaW1wbGUuJHZhcnMoc3RlcF9hcmcpLmxvZyBcJChBUkdTKSIKICAgICAgICAgICAgfQogICAgICAgICAgICBwdXRzICRvcCAiIgogICAgICAgICAgICBwdXRzICRvcCAiXG5zaW5nbGU6IHNldHVwIgogICAgICAgICAgICBwdXRzICRvcCAiXHRGRl9TVE9QPVwkKEZGX1NUT1ApOyBWUEFUSD1cJChWUEFUSCk7IGV4cG9ydCBWUEFUSDsgXCQoVE9PTCkgLWluaXQgXCQoU0NSSVBUUykvSU5OT1ZVUy9ydW5fYWxsLnRjbCAtbG9nIFwkKExPRykvc2luZ2xlLmxvZyBcJChBUkdTKSIKICAgICAgICAgICAgcHV0cyAkb3AgIiIKICAgICAgICAgICAgcHV0cyAkb3AgInNldHVwOiIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0QC9iaW4vbWtkaXIgLXAgXCQoVlBBVEgpIFwkKExPRykiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdEAvYmluL3RvdWNoIFwkKFZQQVRIKS9cJEAiCiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhlbmFibGVfbGRiKV0gJiYgJHZhcnMoZW5hYmxlX2xkYil9IHsKICAgICAgICAgICAgICAgcHV0cyAkb3AgIlx0XCQoVE9PTCkgLWluaXQgXCQoU0NSSVBUUykvSU5OT1ZVUy9ydW5fY29tcGlsZS50Y2wgLWxvZyBcJChMT0cpL2NvbXBpbGUubG9nIC13aW4gXCQoQVJHUykiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHV0cyAkb3AgIiIgCgoKICAgICAgICAgICAgc2V0IHByaW9yX3N0ZXAgInNldHVwIgoKICAgICAgICAgICAgc2V0IGFyZ19saXN0ICItbiAiCiMgICAgICAgICAgICBpZiB7JHZhcnMobm92dXMpfSB7CiMgICAgICAgICAgICAgICBhcHBlbmQgYXJnX2xpc3QgIi1OICIgCiMgICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHskdmFycyh2ZXJib3NlKX0gewogICAgICAgICAgICAgICBhcHBlbmQgYXJnX2xpc3QgIi1WICIgCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyR2YXJzKGVkaSl9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGFyZ19saXN0ICItZSAiIAogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHskdmFycyhyYyl9IHsKICAgICAgICAgICAgICAgYXBwZW5kIGFyZ19saXN0ICItciAiIAogICAgICAgICAgICB9CiAgICAgICAgICAgICMgUkMgU3RlcHMsIGlmIGFueSwgYWx3YXlzIGdvIGZpcnN0CiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhyY19zdGVwcyldICYmICR2YXJzKHJjX3N0ZXBzKSBuZSAiIn0gewogICAgICAgICAgICAgIGZvcmVhY2ggc3RlcCAkdmFycyhyY19zdGVwcykgewogICAgICAgICAgICAgICAgcHV0cyAkb3AgIiRzdGVwOiAkcHJpb3Jfc3RlcCIKICAgICAgICAgICAgICAgIHB1dHMgJG9wICJcdEBta2RpciAtcCBcJChTWU5fTE9HKTsiCiAgICAgICAgICAgICAgICBpZiB7IVtyZWdleHAgJHZhcnMocGFydGl0aW9uX2RpcikgW2ZpbGUgdGFpbCBbZmlsZSBkaXJuYW1lIFtwd2RdXV1dfSB7CiAgICAgICAgICAgICAgICAgICBwdXRzICRvcCAiXHRAaWYgXFsgXCJcJChVUERBVEUpXCIgPSBcInllc1wiIF0gOyB0aGVuIFxcIgogICAgICAgICAgICAgICAgICAgaWYge1tmaWxlIG5vcm1hbGl6ZSAuXSBuZSBbZmlsZSBub3JtYWxpemUgJHZhcnMocnVuZGlyKV19IHsKICAgICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgIlx0XHRjZCBbcmVsUGF0aFRvIFtmaWxlIG5vcm1hbGl6ZSAuXSBbZmlsZSBub3JtYWxpemUgJHZhcnMocnVuZGlyKV1dOyBbbGluZGV4ICRleGVjdXRlX3N0cmluZyAwXSBbOjpGRjo6cmVsUGF0aFRvIFtmaWxlIG5vcm1hbGl6ZSBbc3Vic3QgW2xpbmRleCAkZXhlY3V0ZV9zdHJpbmcgMV1dXSBbZmlsZSBub3JtYWxpemUgW3N1YnN0ICR2YXJzKHJ1bmRpcildXV0gLW0gZmxhdCAtZCBbcmVsUGF0aFRvIFtmaWxlIG5vcm1hbGl6ZSAkdmFycyhzY3JpcHRfZGlyKV0gW2ZpbGUgbm9ybWFsaXplICR2YXJzKHJ1bmRpcildXSAtdiAkdmFycyh2ZXJzaW9uKSAtcyBbcmVsUGF0aFRvIFtmaWxlIG5vcm1hbGl6ZSBbc3Vic3QgJHZhcnMoc2V0dXBfcGF0aCldXSBbZmlsZSBub3JtYWxpemUgW3N1YnN0ICR2YXJzKHJ1bmRpcildXV0gLXkgbm9uZSAtdSBbcmVsUGF0aFRvIFtmaWxlIG5vcm1hbGl6ZSAkdmFycyhydW5kaXIpXSBbZmlsZSBub3JtYWxpemUgLl1dICRhcmdfbGlzdCAkc3RlcCA7IFxcIgoJCSAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHB1dHMgJG9wICJcdFx0W2xpbmRleCAkZXhlY3V0ZV9zdHJpbmcgMF0gWzo6RkY6OnJlbFBhdGhUbyBbZmlsZSBub3JtYWxpemUgW3N1YnN0IFtsaW5kZXggJGV4ZWN1dGVfc3RyaW5nIDFdXV0gW2ZpbGUgbm9ybWFsaXplIFtzdWJzdCAkdmFycyhydW5kaXIpXV1dIC1tIGZsYXQgLWQgW3JlbFBhdGhUbyBbZmlsZSBub3JtYWxpemUgJHZhcnMoc2NyaXB0X2RpcildIFtmaWxlIG5vcm1hbGl6ZSAkdmFycyhydW5kaXIpXV0gLXYgJHZhcnModmVyc2lvbikgLXMgW3JlbFBhdGhUbyBbZmlsZSBub3JtYWxpemUgW3N1YnN0ICR2YXJzKHNldHVwX3BhdGgpXV0gW2ZpbGUgbm9ybWFsaXplIFtzdWJzdCAkdmFycyhydW5kaXIpXV1dIC15IG5vbmUgJGFyZ19saXN0ICRzdGVwIDsgXFwiCgkJICAgfQogICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgIlx0ZmkiCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcHV0cyAkb3AgIlx0VlBBVEg9XCQoVlBBVEgpOyBleHBvcnQgVlBBVEg7IFwkKFNZTl9UT09MKSAtZiBcJChTQ1JJUFRTKS9HRU5VUy8kc3RlcC50Y2wgLWxvZ2ZpbGUgXCQoU1lOX0xPRykvJHN0ZXAubG9nIC1jbWRmaWxlIFwkKFNZTl9MT0cpLyRzdGVwLmNtZCBcJChTWU5fQVJHUykiCiAgICAgICAgICAgICAgICBzZXQgcHJpb3Jfc3RlcCAkc3RlcAogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yZWFjaCBzdGVwICRzdGVwcyB7CiAgICAgICAgICAgICAgIyBUaGVzZSBzdGVwcyBzaG91bGQgbm90IGFsc28gYmUgcmNfc3RlcHM6CiAgICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhyY19zdGVwcyldIHx8IFtsc2VhcmNoICR2YXJzKHJjX3N0ZXBzKSAkc3RlcF0gPT0gIi0xIn0gewogICAgICAgICAgICAgICAgIHB1dHMgJG9wICIkc3RlcDogJHByaW9yX3N0ZXAiCiAgICAgICAgICAgICAgICAgcHV0cyAkb3AgIlx0QG1rZGlyIC1wIFwkKExPRyk7IgojICAgICAgICAgICAgICAgIHB1dHMgJG9wICJcdEBcJChNQUtFKSAtZiBNYWtlZmlsZSBmbG93IgogICAgICAgICAgICAgICAgaWYgeyFbcmVnZXhwICR2YXJzKHBhcnRpdGlvbl9kaXIpIFtmaWxlIHRhaWwgW2ZpbGUgZGlybmFtZSBbcHdkXV1dXX0gewogICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGlmIFxbIFwiXCQoVVBEQVRFKVwiID0gXCJ5ZXNcIiBdIDsgdGhlbiBcXCIKICAgICAgICAgICAgICAgICAgICAgIyBjZCB0byBmZl9leGVfZGlyIGhlcmUgb25seSBpZiB2YXJzKHJ1bmRpcikgbmUgdmFycyhmZl9leGVfZGlyKQogICAgICAgICAgICAgICAgICAgICBpZiB7W2ZpbGUgbm9ybWFsaXplIC5dIG5lIFtmaWxlIG5vcm1hbGl6ZSAkdmFycyhydW5kaXIpXX0gewogICAgICAgICAgICAgICAgICAgICAgIHB1dHMgJG9wICJcdFx0Y2QgW3JlbFBhdGhUbyBbZmlsZSBub3JtYWxpemUgLl0gW2ZpbGUgbm9ybWFsaXplICR2YXJzKHJ1bmRpcildXTsgW2xpbmRleCAkZXhlY3V0ZV9zdHJpbmcgMF0gWzo6RkY6OnJlbFBhdGhUbyBbZmlsZSBub3JtYWxpemUgW3N1YnN0IFtsaW5kZXggJGV4ZWN1dGVfc3RyaW5nIDFdXV0gW2ZpbGUgbm9ybWFsaXplIFtzdWJzdCAkdmFycyhydW5kaXIpXV1dIC1tICR2YXJzKG1vZGUpIC1kIFtyZWxQYXRoVG8gW2ZpbGUgbm9ybWFsaXplICR2YXJzKHNjcmlwdF9kaXIpXSBbZmlsZSBub3JtYWxpemUgJHZhcnMocnVuZGlyKV1dIC12ICR2YXJzKHZlcnNpb24pIC1zIFtyZWxQYXRoVG8gW2ZpbGUgbm9ybWFsaXplIFtzdWJzdCAkdmFycyhzZXR1cF9wYXRoKV1dIFtmaWxlIG5vcm1hbGl6ZSBbc3Vic3QgJHZhcnMocnVuZGlyKV1dXSAteSBub25lIC11IFtyZWxQYXRoVG8gW2ZpbGUgbm9ybWFsaXplICR2YXJzKHJ1bmRpcildIFtmaWxlIG5vcm1hbGl6ZSAuXV0gJGFyZ19saXN0ICRzdGVwIDsgXFwiCgkJICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgIHB1dHMgJG9wICJcdFx0W2xpbmRleCAkZXhlY3V0ZV9zdHJpbmcgMF0gWzo6RkY6OnJlbFBhdGhUbyBbZmlsZSBub3JtYWxpemUgW3N1YnN0IFtsaW5kZXggJGV4ZWN1dGVfc3RyaW5nIDFdXV0gW2ZpbGUgbm9ybWFsaXplIFtzdWJzdCAkdmFycyhydW5kaXIpXV1dIC1tICR2YXJzKG1vZGUpIC1kIFtyZWxQYXRoVG8gW2ZpbGUgbm9ybWFsaXplICR2YXJzKHNjcmlwdF9kaXIpXSBbZmlsZSBub3JtYWxpemUgJHZhcnMocnVuZGlyKV1dIC12ICR2YXJzKHZlcnNpb24pIC1zIFtyZWxQYXRoVG8gW2ZpbGUgbm9ybWFsaXplIFtzdWJzdCAkdmFycyhzZXR1cF9wYXRoKV1dIFtmaWxlIG5vcm1hbGl6ZSBbc3Vic3QgJHZhcnMocnVuZGlyKV1dXSAteSBub25lICRhcmdfbGlzdCAkc3RlcCA7IFxcIgoJCSAgICAgfQogICAgICAgICAgICAgICAgICAgICAjIE5lZWQgdG8gYWRkIGNvZGUgdG8gY2QgYmFjayB0byBydW5kaXIgaGVyZQogICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgIlx0ZmkiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiB7W3JlZ2V4cCAiXnN5biIgJHN0ZXBdfSB7IAogICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgIlx0VlBBVEg9XCQoVlBBVEgpOyBleHBvcnQgVlBBVEg7IFwkKFNZTl9UT09MKSAtZiBcJChTQ1JJUFRTKS9HRU5VUy9ydW5fJHN0ZXAudGNsIC1sb2dmaWxlIFwkKExPRykvJHN0ZXAubG9nIC1jbWRmaWxlIFwkKExPRykvJHN0ZXAuY21kIFwkKFNZTl9BUkdTKSIKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICBwdXRzICRvcCAiXHRWUEFUSD1cJChWUEFUSCk7IGV4cG9ydCBWUEFUSDsgXCQoVE9PTCkgLWluaXQgXCQoU0NSSVBUUykvSU5OT1ZVUy9ydW5fJHN0ZXAudGNsIC1sb2cgXCQoTE9HKS8kc3RlcC5sb2cgLW92ZXJ3cml0ZSBcJChBUkdTKSIKICAgICAgICAgICAgICAgIH0gCiMgICAgICAgICAgICAgICAgcHV0cyAkb3AgIlx0L2Jpbi90b3VjaCBcJChWUEFUSCkvJHN0ZXBcbiIKICAgICAgICAgICAgICAgIHNldCBwcmlvcl9zdGVwICRzdGVwCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgojICAgICAgICAgICAgcHV0cyAkb3AgImh0bWw6IgojICAgICAgICAgICAgcHV0cyAkb3AgIlx0RkZWQVJTPSR2YXJzKHNjcmlwdF9kaXIpL3ZhcnMudGNsOyBleHBvcnQgRkZWQVJTOyAvdXNyL2Jpbi90Y2xzaCBcJChTQ1JJUFRTKS9JTk5PVlVTL2dlbl9odG1sLnRjbCAuOyBjZCAkdmFycyhodG1sX2Rpcik7IFwkKEJST1dTRVIpIGZpbGU6YHB3ZGAvaW5kZXguaHRtbCIKIyAgICAgICAgICAgIHB1dHMgJG9wICIiCiAgICAgICAgICAgIHB1dHMgJG9wICJkZWJ1Z18lOiIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0VlBBVEg9XCQoVlBBVEgpOyBleHBvcnQgU1RFUD1cJCogOyBleHBvcnQgVlBBVEg7IFwkKFRPT0wpIC1pbml0IFwkKFNDUklQVFMpL0lOTk9WVVMvcnVuX2RlYnVnLnRjbCAtbG9nIFwkKExPRykvXCRALmxvZyAtd2luIFwkKEFSR1M6LW5vd2luPSkiCiAgICAgICAgICAgIHB1dHMgJG9wICIiCiAgICAgICAgICAgIHB1dHMgJG9wICJsZWNfJToiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdGV4cG9ydCBTVEVQPVwkKiA7IGxlYyAtNjQgLXhsIC1Eb2ZpbGUgXCQoU0NSSVBUUykvSU5OT1ZVUy9ydW5fbGVjLnRjbCAtTk9HdWkgLUxPR2ZpbGUgXCQoTE9HKS9cJEAubG9nIgogICAgICAgICAgICBwdXRzICRvcCAiIgogICAgICAgICAgICBwdXRzICRvcCAiaGVscF8lOiIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0W2xpbmRleCAkZXhlY3V0ZV9zdHJpbmcgMF0gXCQoR0VOX0ZMT1cpIC1IIFwkKiIKICAgICAgICAgICAgcHV0cyAkb3AgIiIKIyAgICAgICAgICAgIHB1dHMgJG9wICIuUEhPTlk6IGNsZWFuIGh0bWwiCiAgICAgICAgICAgIHB1dHMgJG9wICIuUEhPTlk6IGNsZWFuIgogICAgICAgICAgICBwdXRzICRvcCAiIgogICAgICAgICAgICBwdXRzICRvcCAiY2xlYW46IgogICAgICAgICAgICBwdXRzICRvcCAiXHQvYmluL212ICoucnB0ICR2YXJzKHJwdF9kaXIpIDtcXCIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0L2Jpbi9ybSAtZnIgZXh0TG9nRGlyKiBfX3FyYy5sb2cgKmN0c190cmFjZSAqLnJwdC5vbGQgKmRlbGV0ZSogcGxhY2VtZW50UmVwb3J0cyogKi5yZ3VpZGUgKl9tbW1jIFxcXG5cdCpfY29uc3RyLnB0IC5jb25zdHIqIC5GRSogLnJvdXRpbmcqIC50aW1pbmdfZmlsZSogLnRkcmxvZyoiCiAgICAgICAgICAgIHB1dHMgJG9wICIiCiAgICAgICAgICAgIHB1dHMgJG9wICJkb19jbGVhbnVwOiBzaWdub2ZmIgogICAgICAgICAgICBwdXRzICRvcCAiXHRcJChNQUtFKSBjbGVhbiIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0L2Jpbi90b3VjaCBcJChWUEFUSCkvXCRAIgogICAgICAgICAgICBwdXRzICRvcCAiIgogICAgICAgICAgICBwdXRzICRvcCAicmVzZXQgOiB2ZXJzaW9uIgogICAgICAgICAgICBwdXRzICRvcCAiXHQvYmluL3JtIC1mciBcJChWUEFUSCkvKiBleHRMb2dEaXIqIF9fcXJjLmxvZyAqY3RzX3RyYWNlICoucnB0Lm9sZCAqZGVsZXRlKiBwbGFjZW1lbnRSZXBvcnRzKiAqLnJndWlkZSAqX21tbWMiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdEBmb3IgZmlsZSBpbiBcJChTVEVQUykgOyBcXCIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0ZG8gXFwiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdFx0aWYgXFsgLXIgXCQoVlBBVEgpL1wkXCRmaWxlIFxdIDsgdGhlbiBcXCIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0XHRcdC9iaW4vcm0gXCQoVlBBVEgpL1wkXCRmaWxlIDsgXFwiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdFx0ZmkgXFwiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdGRvbmUiCiAgICAgICAgICAgIHB1dHMgJG9wICIiCiAgICAgICAgICAgIHB1dHMgJG9wICJibG9ja18lOiBzZXR1cCIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGlmIFxbIFwieFwkKlwiID0gXCJ4c2luZ2xlXCIgXF0gOyB0aGVuIFxcIgogICAgICAgICAgICBwdXRzICRvcCAiXHRcdGZmX3N0b3A9XCQoRkZfU1RPUCk7IFxcIgogICAgICAgICAgICBwdXRzICRvcCAiXHRcdHRhcmdldD1cIlwkQCAoZnJvbTogXCQoRkZfU1RBUlQpIHRvOiBcJChGRl9TVE9QKSlcIjsgXFwiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdGVsc2UgXFwiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdFx0ZmZfc3RvcD1cJCogOyBcXCIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0XHR0YXJnZXQ9XCRAOyBcXCIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0Zmk7IFxcIgogICAgICAgICAgICBwdXRzICRvcCAiXHRpZiBcWyAtciBcJChWUEFUSCkvLlJVTk5JTkcgXF0gOyB0aGVuIFxcIgogICAgICAgICAgICBwdXRzICRvcCAiXHRcdGVjaG8gXCJJTkZPOiBBIGJ1aWxkIHNlZW1zIHRvIGJlIHJ1bm5pbmcgYWxyZWFkeS4uLiBjaGVjayBcJChWUEFUSCkvLlJVTk5JTkcgZmlsZSBhbmQgcmVtb3ZlIHRoYXQgZmlsZSBpZiB0aGUgcHJvY2VzcyBpcyBkZWFkXCIgOyBcXCIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0XHQvYmluL2hlYWQgLTEgIFwkKFZQQVRIKS8uUlVOTklORyA7IFxcIgogICAgICAgICAgICBwdXRzICRvcCAiXHRcdGV4aXQgLTEgOyBcXCIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0ZWxzZSBcXCIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0XHQvYmluL3JtIC1mIFwkKFZQQVRIKS9ibG9ja19cJFwkXHtmZl9zdG9wXH0uRE9ORSBcJChWUEFUSCkvYmxvY2tfXCRcJFx7ZmZfc3RvcFx9LkZBSUxFRCBcJChWUEFUSCkvYmxvY2tfXCRcJFx7ZmZfc3RvcFx9LlBBU1MgOyBcXCIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0XHQoZWNobyBcIiMgU3RhcnRlZCBidWlsZGluZyBcJFwkXHt0YXJnZXRcfSBhdCBcImAvYmluL2RhdGVgXCIgb24gXCJgL2Jpbi9ob3N0bmFtZWBcIiBQSUQ6IFwkXCRcJFwkXCIgOyBcJChNQUtFKSBcJChUQVJHRVQpICkgJj5cJChWUEFUSCkvLlJVTk5JTkcgOyBcXCIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0XHRpZiBcWyAtciBcJChWUEFUSCkvXCRcJFx7ZmZfc3RvcFx9IFxdIDsgdGhlbiBcXCIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0XHRcdGlmIFxbIC1yIFwkKFZQQVRIKS8uUlVOTklORyBcXSA7IHRoZW4gXFwiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdFx0XHRcdC9iaW4vbXYgXCQoVlBBVEgpLy5SVU5OSU5HIFwkKFZQQVRIKS9ibG9ja19cJFwkXHtmZl9zdG9wXH0uUEFTUyA7IFxcIgogICAgICAgICAgICBwdXRzICRvcCAiXHRcdFx0XHQvYmluL3RvdWNoIFwkKFZQQVRIKS9ibG9ja19cJFwkXHtmZl9zdG9wXH0gOyBcXCIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0XHRcdFx0L2Jpbi90b3VjaCBcJChWUEFUSCkvYmxvY2tfXCRcJFx7ZmZfc3RvcFx9LkRPTkUgOyBcXCIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0XHRcdGVsc2UgXFwiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdFx0XHRcdGVjaG8gXCIjIFNvbWV0aGluZyBkaWQgbm90IHdvcmsgcHJvcGVybHlcIiA+IFwkKFZQQVRIKS9ibG9ja19cJFwkXHtmZl9zdG9wXH0uRkFJTEVEIDsgXFwiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdFx0XHRcdC9iaW4vdG91Y2ggXCQoVlBBVEgpL2Jsb2NrX1wkXCRce2ZmX3N0b3BcfS5ET05FIDsgXFwiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdFx0XHRcdGV4aXQgLTE7IFxcIgogICAgICAgICAgICBwdXRzICRvcCAiXHRcdFx0ZmkgOyBcXCIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0XHRlbHNlIFxcIgogICAgICAgICAgICBwdXRzICRvcCAiXHRcdFx0aWYgXFsgLXIgXCQoVlBBVEgpLy5SVU5OSU5HIFxdIDsgdGhlbiBcXCIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0XHRcdFx0L2Jpbi9tdiBcJChWUEFUSCkvLlJVTk5JTkcgXCQoVlBBVEgpL2Jsb2NrX1wkXCRce2ZmX3N0b3BcfS5GQUlMRUQgOyBcXCIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0XHRcdGVsc2UgXFwiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdFx0XHRcdGVjaG8gXCIjIFNvbWV0aGluZyBkaWQgbm90IHdvcmsgcHJvcGVybHlcIiA+IFwkKFZQQVRIKS9ibG9ja19cJFwkXHtmZl9zdG9wXH0uRkFJTEVEIDsgXFwiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdFx0XHRmaSA7IFxcIgogICAgICAgICAgICBwdXRzICRvcCAiXHRcdFx0L2Jpbi90b3VjaCBcJChWUEFUSCkvYmxvY2tfXCRcJFx7ZmZfc3RvcFx9LkRPTkUgOyBcXCIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0XHRcdGV4aXQgLTEgOyBcXCIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0XHRmaSA7IFxcIgogICAgICAgICAgICBwdXRzICRvcCAiXHRmaSIKCiAgICAgICAgICAgIGlmIHskdmFycyhnZW5lcmF0ZV9mbG93X3N0ZXBzKSAmJiBbaW5mbyBleGlzdHMgdmFycyhmbG93X3N0ZXBzKV19IHsKICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGZsb3dfc3RlcHMsZmxhdCldfSB7CiAgICAgICAgICAgICAgICAgIHNldCBmcDEgW29wZW4gJHZhcnMoc2NyaXB0X2RpcikvZmxvd19jb25maWcudGNsIHddCiAgICAgICAgICAgICAgICAgIHNldCBmcDIgW29wZW4gJHZhcnMoc2NyaXB0X2RpcikvZmxvd19zdGVwcy50Y2wgd10KICAgICAgICAgICAgICAgICAgcHV0cyAkZnAxICJzZXRfZGIgZmxvd19kYXRhYmFzZV9kaXJlY3RvcnkgJHZhcnMoZGJzX2RpcikiCiAgICAgICAgICAgICAgICAgIHB1dHMgJGZwMSAic2V0X2RiIGZsb3dfcmVwb3J0X2RpcmVjdG9yeSAkdmFycyhycHRfZGlyKSIKICAgICAgICAgICAgICAgICAgcHV0cyAkZnAxICJzZXRfZGIgZmxvd19sb2dfZGlyZWN0b3J5ICR2YXJzKGxvZ19kaXIpIgogICAgICAgICAgICAgICAgICBwdXRzICRmcDIgW3JlZ3N1YiAiY3JlYXRlX2Zsb3dfc3RlcCAtbmFtZSBpbml0ICIgJHZhcnMoZmxvd19zdGVwcyxmbGF0KSAiY3JlYXRlX2Zsb3dfc3RlcCAtbmFtZSBpbml0X2Rlc2lnbiAiXQogICAgICAgICAgICAgICAgICBwdXRzICRmcDEgIlxuc2V0X2RiIGZsb3dfbWFpbF90byBbZXhlYyB3aG9hbWldIgogICAgICAgICAgICAgICAgICBwdXRzICRmcDEgInNldF9kYiBmbG93X21haWxfb25fZXJyb3IgdHJ1ZVxuIgogICAgICAgICAgICAgICAgICBpZiB7JHZhcnModG9wKX0gewogICAgICAgICAgICAgICAgICAgICBzZXQgdmFycyhmbG93X25hbWUpIHRvcAogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBzZXQgdmFycyhmbG93X25hbWUpIGJsb2NrCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYge1tmaWxlIGV4aXN0cyAkdmFycyhjd2QpLy5wbHVnaW5zXX0gewogICAgICAgICAgICAgICAgICAgICBzZXQgaXAgW29wZW4gJHZhcnMoY3dkKS8ucGx1Z2lucyByXQogICAgICAgICAgICAgICAgICAgICB3aGlsZSB7W2dldHMgJGlwIGxpbmVdPj0wfSB7IAogICAgICAgICAgICAgICAgICAgICAgICBwdXRzICRmcDEgJGxpbmUgCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgY2xvc2UgJGlwCiMgICAgICAgICAgICAgICAgICAgICBmaWxlIGRlbGV0ZSAkdmFycyhjd2QpLy5wbHVnaW5zIAogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGNsb3NlICRmcDEKICAgICAgICAgICAgICAgICAgcHV0cyAkZnAyICJjcmVhdGVfZmxvd19zdGVwIC1uYW1lIGluaXRfZmxvb3JwbGFuIHsgfSIKICAgICAgICAgICAgICAgICAgY2xvc2UgJGZwMgogICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocGFydGl0aW9uX2xpc3QpXX0gewogICAgICAgICAgICAgICAgICAgICBpZiB7KCR2YXJzKGRlc2lnbikgPT0gW2xpbmRleCAkdmFycyhwYXJ0aXRpb25fbGlzdCkgMF0pIHx8ICR2YXJzKHRvcCl9IHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGhwIFtvcGVuICR2YXJzKHNjcmlwdF9kaXIpLy5oaWVyc3RlcHMudGNsIHddCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHskdmFycyh0b3ApfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCB0ZW1wIFtyZWdzdWIgLWFsbCAiY3JlYXRlX2Zsb3dfc3RlcCAtbmFtZSBpbml0IiAkdmFycyhmbG93X3N0ZXBzLGZsYXQpICJjcmVhdGVfZmxvd19zdGVwIC1uYW1lIHRvcF9pbml0Il0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHRlbXAyIFtyZWdzdWIgLWFsbCAiY3JlYXRlX2Zsb3dfc3RlcCAtbmFtZSBwcmVjdHMiICR0ZW1wICJjcmVhdGVfZmxvd19zdGVwIC1uYW1lIHRvcF9wcmVjdHMiXQogICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgdGVtcDMgW3JlZ3N1YiAtYWxsICJjcmVhdGVfZmxvd19zdGVwIC1uYW1lIHBsYWNlIiAkdGVtcDIgImNyZWF0ZV9mbG93X3N0ZXAgLW5hbWUgdG9wX3BsYWNlIl0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHRlbXA0IFtyZWdzdWIgLWFsbCAiY3JlYXRlX2Zsb3dfc3RlcCAtbmFtZSBjdHMiICR0ZW1wMyAiY3JlYXRlX2Zsb3dfc3RlcCAtbmFtZSB0b3BfY3RzIl0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHZhcnMoZmxvd19zdGVwcyxmbGF0KSBbcmVnc3ViIC1hbGwgImNyZWF0ZV9mbG93X3N0ZXAgLW5hbWUgc2lnbm9mZiIgJHRlbXA0ICJjcmVhdGVfZmxvd19zdGVwIC1uYW1lIHRvcF9zaWdub2ZmIl0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBwdXRzICRocCAkdmFycyhmbG93X3N0ZXBzLGZsYXQpCiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlICRocAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgdW5zZXQgdmFycyhmbG93X3N0ZXBzKQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgeyR2YXJzKGdlbmVyYXRlX2Zsb3dfc3RlcHMpfSB7CiAgICAgICAgICAgICAgIGlmIHtbbHNlYXJjaCAkc3RlcHMgImFzc2VtYmxlIl0gIT0gLTF9IHsKICAgICAgICAgICAgICAgICAgc2V0IHN0ZXBzIFtscmVwbGFjZSAkc3RlcHMgZW5kIGVuZF0KICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgc2V0IGZwIFtvcGVuIHJ1bl9mbG93LnRjbCB3XQogICAgICAgICAgICAgICBwdXRzICRmcCAic291cmNlICR2YXJzKHNjcmlwdF9kaXIpL2Zsb3dfc3RlcHMudGNsIgogICAgICAgICAgICAgICBwdXRzICRmcCAiaWYgXHtcW2ZpbGUgZXhpc3RzICR2YXJzKHNjcmlwdF9kaXIpL3BsdWdfc3RlcHMudGNsXF1cfSBceyIKICAgICAgICAgICAgICAgcHV0cyAkZnAgIiAgc291cmNlICR2YXJzKHNjcmlwdF9kaXIpL3BsdWdfc3RlcHMudGNsIgogICAgICAgICAgICAgICBwdXRzICRmcCAiXH0iCiAgICAgICAgICAgICAgIGlmIHtbZmlsZSB0YWlsIFtwd2RdXSA9PSAkdmFycyh0b3BfY2VsbCl9IHsKICAgICAgICAgICAgICAgICAgIGlmIHtbZmlsZSB0YWlsIFtmaWxlIGRpcm5hbWUgW3B3ZF1dXSA9PSAiJHZhcnMocGFydGl0aW9uX2RpcikifSB7CiAgICAgICAgICAgICAgICAgICAgICBzZXQgdmFycyhmbG93X25hbWUpICJ0b3AiCiAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgc2V0IHZhcnMoZmxvd19uYW1lKSAidG9wX3Bhc3MyIgogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBzZXQgdG9wX3N0ZXBzICIgJHN0ZXBzIgogICAgICAgICAgICAgICAgICBmb3JlYWNoIHMgImluaXQgcGxhY2UgcHJlY3RzIGN0cyBzaWdub2ZmIiB7CiAgICAgICAgICAgICAgICAgICAgIHNldCB0ZW1wIFtyZWdzdWIgIiAkcyIgJHRvcF9zdGVwcyAiIHRvcF8kcyJdCiAgICAgICAgICAgICAgICAgICAgIHNldCB0b3Bfc3RlcHMgJHRlbXAgCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgIHB1dHMgJGZwICJjcmVhdGVfZmxvdyBcXFxuICAgLW5hbWUgJHZhcnMoZmxvd19uYW1lKVxcXG4gICAtdG9vbCAkdmFycyhtYWtlX3Rvb2wpXFxcbiAgIC10b29sX29wdGlvbnMgey1sb2cgJHZhcnMoZmxvd19uYW1lKS5sb2d9XFxcbiAgIFxbbGlzdCAkdG9wX3N0ZXBzXF1cbiIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgc2V0IGRpciBbZmlsZSB0YWlsIFtwd2RdXQogICAgICAgICAgICAgICAgICBzZXQgcGRpciBbZmlsZSB0YWlsIFtmaWxlIHRhaWwgJGRpcl1dCiAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhwYXJ0aXRpb25fbGlzdCldfSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIHsoW2ZpbGUgdGFpbCBbcHdkXV0gPT0gW2xpbmRleCAkdmFycyhwYXJ0aXRpb25fbGlzdCkgMF0pfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHtbZmlsZSB0YWlsIFtmaWxlIGRpcm5hbWUgW3B3ZF1dXSA9PSAiJHZhcnMocGFydGl0aW9uX2RpcikifSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCB2YXJzKGZsb3dfbmFtZSkgImJsb2NrIgogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHZhcnMoZmxvd19uYW1lKSAiYmxvY2tfcGFzczIiCiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBwdXRzICRmcCAiY3JlYXRlX2Zsb3cgXFxcbiAgIC1uYW1lICR2YXJzKGZsb3dfbmFtZSlcXFxuICAgLXRvb2wgJHZhcnMobWFrZV90b29sKVxcXG4gICAtdG9vbF9vcHRpb25zIHstbG9nICR2YXJzKGZsb3dfbmFtZSkubG9nfVxcXG4gICBcW2xpc3QgJHN0ZXBzXF1cbiIKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZiB7ISR2YXJzKHJjKX0gewogICAgICAgICAgICAgICAgICAgICAgICBzZXQgdmFycyhmbG93X25hbWUpICJpbm5vdnVzIgogICAgICAgICAgICAgICAgICAgICAgICBwdXRzICRmcCAic291cmNlICR2YXJzKHNjcmlwdF9kaXIpL2Zsb3dfY29uZmlnLnRjbCIKICAgICAgICAgICAgICAgICAgICAgICAgcHV0cyAkZnAgImNyZWF0ZV9mbG93IFxcXG4gICAtbmFtZSAkdmFycyhmbG93X25hbWUpXFxcbiAgIC10b29sICR2YXJzKG1ha2VfdG9vbClcXFxuICAgLXRvb2xfb3B0aW9ucyB7LWxvZyAkdmFycyhmbG93X25hbWUpLmxvZ31cXFxuICAgXFtsaXN0ICRzdGVwc1xdXG4iCiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldCByY19zdGVwcyBbbGlzdF0KICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGVkaV9zdGVwcyBbbGlzdF0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCBzICRzdGVwcyB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHtbcmVnZXhwIHN5bl8gJHNdfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcHBlbmQgcmNfc3RlcHMgJHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwcGVuZCBlZGlfc3RlcHMgJHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHNldCB2YXJzKGZsb3dfbmFtZSkgImdlbnVzIgojICAgICAgICAgICAgICAgICAgICAgICAgcHV0cyAkZnAgInNvdXJjZSAkdmFycyhzY3JpcHRfZGlyKS9mbG93X3N0ZXBzLnRjbCIKICAgICAgICAgICAgICAgICAgICAgICAgcHV0cyAkZnAgInNvdXJjZSAkdmFycyhzY3JpcHRfZGlyKS9mbG93X2NvbmZpZy50Y2wiCiAgICAgICAgICAgICAgICAgICAgICAgIHB1dHMgJGZwICJjcmVhdGVfZmxvdyBcXFxuICAgLW5hbWUgJHZhcnMoZmxvd19uYW1lKVxcXG4gICAtdG9vbCAkdmFycyhtYWtlX3N5bl90b29sKVxcXG4gICAtdG9vbF9vcHRpb25zIHstbG9nICR2YXJzKGZsb3dfbmFtZSkubG9nfVxcXG4gICBcW2xpc3QgJHJjX3N0ZXBzXF1cbiIKICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHZhcnMoZmxvd19uYW1lKSAiaW5ub3Z1cyIKICAgICAgICAgICAgICAgICAgICAgICAgcHV0cyAkZnAgImNyZWF0ZV9mbG93IFxcXG4gICAtbmFtZSAkdmFycyhmbG93X25hbWUpXFxcbiAgIC10b29sICR2YXJzKG1ha2VfdG9vbClcXFxuICAgLXRvb2xfb3B0aW9ucyB7LWxvZyAkdmFycyhmbG93X25hbWUpLmxvZ31cXFxuICAgXFtsaXN0ICRlZGlfc3RlcHNcXVxuIgogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBjbG9zZSAkZnAKICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgICJib3R0b21fdXAiIHsKICAgICAgICAgICAgcHV0cyAkb3AgIlZFUlNJT049MTcuMTAtcDAwM18xIgogICAgICAgICAgICBwdXRzICRvcCAiVlBBVEg9JGVudihWUEFUSCkiCiAgICAgICAgICAgIHB1dHMgJG9wICJUT09MPSR2YXJzKG1ha2VfdG9vbCkiCiAgICAgICAgICAgIHB1dHMgJG9wICJTQ1JJUFRTPSR2YXJzKHNjcmlwdF9kaXIpIgogICAgICAgICAgICBwdXRzICRvcCAiTE9HPSR2YXJzKGxvZ19kaXIpIgogICAgICAgICAgICBwdXRzICRvcCAiQlJPV1NFUj0kdmFycyhtYWtlX2Jyb3dzZXIpIgogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMobWFrZV91cGRhdGUpXX0gewogICAgICAgICAgICAgICBwdXRzICRvcCAiVVBEQVRFPSR2YXJzKG1ha2VfdXBkYXRlKSIKICAgICAgICAgICAgfSBlbHNlaWYge1tmaWxlIHRhaWwgW2ZpbGUgZGlybmFtZSBbcHdkXV1dICE9ICIkdmFycyhwYXJ0aXRpb25fZGlyKSJ9IHsKICAgICAgICAgICAgICAgcHV0cyAkb3AgIlVQREFURT15ZXMiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHV0cyAkb3AgIiIKICAgICAgICAgICAgcHV0cyAkb3AgIkFSR1M9JHZhcnMobWFrZV90b29sX2FyZ3MpIgogICAgICAgICAgICBwdXRzICRvcCAiU1RFUFMgPSBbZm9ybWF0ICJ2ZXJzaW9uIHNldHVwICVzIGRvX2NsZWFudXAiICRzdGVwc10iCiAgICAgICAgICAgIHB1dHMgJG9wICJGRl9TVE9QID0gc2lnbm9mZiIKICAgICAgICAgICAgcHV0cyAkb3AgIkZGX1NUQVJUID0gaW5pdCIKICAgICAgICAgICAgcHV0cyAkb3AgIiIKICAgICAgICAgICAgcHV0cyAkb3AgW2Zvcm1hdCAiYWxsOiB2ZXJzaW9uIHNldHVwICVzIGRvX2NsZWFudXAiICRzdGVwc10KICAgICAgICAgICAgcHV0cyAkb3AgIiIKICAgICAgICAgICAgcHV0cyAkb3AgInZlcnNpb246IgogICAgICAgICAgICBwdXRzICRvcCAiXHRAZWNobyBcIlwjIEZvdW5kYXRpb24gRmxvd3MgVmVyc2lvbiBcJChWRVJTSU9OKVwiIgogICAgICAgICAgICBwdXRzICRvcCAiIgogICAgICAgICAgICBwdXRzICRvcCAiaGVscDoiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XCIiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiICAgICAgICAgICBcJChWRVJTSU9OKSAgRm91bmRhdGlvbiBGbG93c1wiIgogICAgICAgICAgICBwdXRzICRvcCAiXHRAZWNobyBcIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVwiIgogICAgICAgICAgICBwdXRzICRvcCAiXHRAZWNobyBcIiAgIE1ha2VmaWxlIFRhcmdldHNcIiIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cIiIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCIgICAgICAgICAgICAgICBzZXR1cCA6IFNldHVwIFJ1biBEaXJlY3RvcnlcIiIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCIgICAgICAgICAgICAgICAgaW5pdCA6IENyZWF0ZSBJbml0aWFsIERhdGFiYXNlXCIiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiICAgICAgICAgICAgICAgcGxhY2UgOiBDZWxsIFBsYWNlbWVudFwiIgogICAgICAgICAgICBwdXRzICRvcCAiXHRAZWNobyBcIiAgICAgICAgICAgICAgcHJlY3RzIDogUHJlQ1RTIE9wdGltaXphdGlvblwiIgogICAgICAgICAgICBwdXRzICRvcCAiXHRAZWNobyBcIiAgICAgICAgICAgICAgICAgY3RzIDogQ2xvY2sgVHJlZSBTeW50aGVzaXNcIiIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCIgICAgICAgICAgICAgcG9zdGN0cyA6IFBvc3RDVFMgT3B0aW1pemF0aW9uXCIiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiICAgICAgICBwb3N0Y3RzX2hvbGQgOiBQb3N0Q1RTIE9vbGQgRml4aW5nXCIiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiICAgICAgICAgICAgICAgcm91dGUgOiBHbG9iYWwvRGV0YWlsIFJvdXRlXCIiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiICAgICAgICAgICBwb3N0cm91dGUgOiBQb3N0Um91dGUgT3B0aW1pemF0aW9uXCIiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiICAgICAgcG9zdHJvdXRlX2hvbGQgOiBQb3N0Um91dGUgSG9sZCBGaXhpbmdcIiIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCIgICBwb3N0cm91dGVfc2lfaG9sZCA6IFNJIEhvbGQgRml4aW5nXCIiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiICAgICAgICBwb3N0cm91dGVfc2kgOiBTSSBPcHRpbWl6YXRpb25cIiIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCIgICAgICAgICAgICAgc2lnbm9mZiA6IFNpZ25vZmYgVGltaW5nIC8gVmVyaWZ5XCIiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiICAgICAgICAgICAgYXNzZW1ibGUgOiBEZXNpZ24gQXNzZW1ibHkgLyBWZXJpZnlcIiIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cIiIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCIgICAgICAgICAgICAgICAgIGFsbCA6IEFsbCBkZXNpZ24gc3RlcHNcIiIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCIgICAgICAgICAgICAgIHNpbXBsZSA6IFNpbmdsZSBzY3JpcHQgKGFsbCBzdGVwcyBpbiBhIHNpbmdsZSBzZXNzaW9uKSAtIG5vIHN0b3Avc3RhcnRcIiIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCIgICAgICAgICAgICAgIHNpbmdsZSA6IFNpbmdsZSBzY3JpcHQgKGFsbCBzdGVwcyBpbiBhIHNpbmdsZSBzZXNzaW9uKVwiIgogICAgICAgICAgICBwdXRzICRvcCAiXHRAZWNobyBcIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVwiIgogICAgICAgICAgICBwdXRzICRvcCAiXHRAZWNobyBcIiAgIE1ha2VmaWxlIE9wdGlvbnNcIiIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cIiIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCIgICBWUEFUSCA6IE1ha2UgZGlyZWN0b3J5ICAgIChkZWZhdWx0IG1ha2UpXCIiCiAgICAgICAgICAgIGlmIHskdmFycyhub3Z1cyl9IHsKICAgICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCIgICAgVE9PTCA6IElOTk9WVVMgZXhlY3V0YWJsZSAoZGVmYXVsdCBpbm5vdnVzKVwiIgogICAgICAgICAgICAgICBwdXRzICRvcCAiXHRAZWNobyBcIiAgICBBUkdTIDogSU5OT1ZVUyBhcmd1bWVudHMgIChkZWZhdWx0IC1ub3dpbiAtNjQpXCIiCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiICAgIFRPT0wgOiBJTk5PVlVTIGV4ZWN1dGFibGUgICAgIChkZWZhdWx0IGlubm92dXMpXCIiCiAgICAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiICAgIEFSR1MgOiBJTk5PVlVTIGFyZ3VtZW50cyAgICAgIChkZWZhdWx0IC1ub3dpbiAtNjQpXCIiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYge1tmaWxlIHRhaWwgW2ZpbGUgZGlybmFtZSBbcHdkXV1dICE9ICIkdmFycyhwYXJ0aXRpb25fZGlyKSJ9IHsKICAgICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCIgIFVQREFURSA6IFVwZGF0ZSBzY3JpcHRzICAgIChkZWZhdWx0IHllcylcIiIKICAgICAgICAgICAgfQojICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCIgQlJPV1NFUiA6IEhUTUwgYnJvd3NlciAgICAgIChkZWZhdWx0IG5ldHNjYXBlKVwiIgogICAgICAgICAgICBwdXRzICRvcCAiXHRAZWNobyBcIiBTQ1JJUFRTIDogU2NyaXB0IGRpcmVjdG9yeSAgKGRlZmF1bHQgJHZhcnMoc2NyaXB0X2RpcikpXCIiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiICAgICBMT0cgOiBMb2dmaWxlIGRpcmVjdG9yeSAoZGVmYXVsdCAkdmFycyhsb2dfZGlyKSlcIiIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cIiIKICAgICAgICAgICAgcHV0cyAkb3AgIiIKIyAgICAgICAgICAgIGlmIHtbZmlsZSB0YWlsIFtmaWxlIGRpcm5hbWUgW3B3ZF1dXSAhPSAiJHZhcnMocGFydGl0aW9uX2RpcikifSB7CiMgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocGx1Z19maWxlcyldfSB7CiMgICAgICAgICAgICAgICAgICBwdXRzICRvcCAiZmxvdzogJHZhcnMoY29uZmlnX2ZpbGVzKSAkdmFycyhwbHVnX2ZpbGVzKSIKIyAgICAgICAgICAgICAgIH0gZWxzZSB7CiMgICAgICAgICAgICAgICAgICBwdXRzICRvcCAiZmxvdzogJHZhcnMoY29uZmlnX2ZpbGVzKSIKIyAgICAgICAgICAgICAgIH0KIyAgICAgICAgICAgICAgIHB1dHMgJG9wICJcdEBpZiBcWyBcJChVUERBVEUpID09IHllcyBdIDsgdGhlbiBcXCIKIyAgICAgICAgICAgICAgIHB1dHMgJG9wICJcdFx0W2xpbmRleCAkZXhlY3V0ZV9zdHJpbmcgMF0gW2xpbmRleCAkZXhlY3V0ZV9zdHJpbmcgMV0gLW0gZmxhdCBhbGwgOyBcXCIKIyAgICAgICAgICAgICAgIHB1dHMgJG9wICJcdFx0L2Jpbi90b3VjaCBcJChWUEFUSCkvXCRAIDsgXFwiCiMgICAgICAgICAgICAgICBwdXRzICRvcCAiXHRlbHNlIFxcIgojICAgICAgICAgICAgICAgcHV0cyAkb3AgIlx0XHRlY2hvICdTS0lQUElORyBGTE9XIFVQREFURSAuLi4nIDsgXFwiCiMgICAgICAgICAgICAgICBwdXRzICRvcCAiXHRmaSIKIyAgICAgICAgICAgIH0gZWxzZSB7CiMgICAgICAgICAgICAgICBwdXRzICRvcCAiZmxvdzoiCiMgICAgICAgICAgICB9CgogICAgICAgICAgICBwdXRzICRvcCAiXG5zaW1wbGU6IHNldHVwIgogICAgICAgICAgICBpZiB7JHZhcnMoc3RlcF9hcmcpID09ICJhbGwifSB7CiAgICAgICAgICAgICAgIHB1dHMgJG9wICJcdEZGX1NUT1A9XCQoRkZfU1RPUCk7IFZQQVRIPVwkKFZQQVRIKTsgZXhwb3J0IFZQQVRIOyBcJChUT09MKSAtaW5pdCBcJChTQ1JJUFRTKS9JTk5PVlVTL3J1bl9zaW1wbGUudGNsIC1sb2cgXCQoTE9HKS9zaW1wbGUubG9nIFwkKEFSR1MpIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBwdXRzICRvcCAiXHRGRl9TVE9QPVwkKEZGX1NUT1ApOyBWUEFUSD1cJChWUEFUSCk7IGV4cG9ydCBWUEFUSDsgXCQoVE9PTCkgLWluaXQgXCQoU0NSSVBUUykvSU5OT1ZVUy9ydW5fc2ltcGxlLiR2YXJzKHN0ZXBfYXJnKS50Y2wgLWxvZyBcJChMT0cpL3NpbXBsZS4kdmFycyhzdGVwX2FyZykubG9nIFwkKEFSR1MpIgogICAgICAgICAgICB9CiAgICAgICAgICAgIHB1dHMgJG9wICIiCiAgICAgICAgICAgIHB1dHMgJG9wICJcbnNpbmdsZTogc2V0dXAiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdEZGX1NUT1A9XCQoRkZfU1RPUCk7IFZQQVRIPVwkKFZQQVRIKTsgZXhwb3J0IFZQQVRIOyBcJChUT09MKSAtaW5pdCBcJChTQ1JJUFRTKS9JTk5PVlVTL3J1bl9hbGwudGNsIC1sb2cgXCQoTE9HKS9zaW5nbGUubG9nIFwkKEFSR1MpIgogICAgICAgICAgICBwdXRzICRvcCAiIgogICAgICAgICAgICBwdXRzICRvcCAic2V0dXA6IgogICAgICAgICAgICBwdXRzICRvcCAiXHRAL2Jpbi9ta2RpciAtcCBcJChWUEFUSCkgXCQoTE9HKSIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0QC9iaW4vdG91Y2ggXCQoVlBBVEgpL1wkQCIKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGVuYWJsZV9sZGIpXSAmJiAkdmFycyhlbmFibGVfbGRiKX0gewogICAgICAgICAgICAgICBwdXRzICRvcCAiXHRcJChUT09MKSAtaW5pdCBcJChTQ1JJUFRTKS9JTk5PVlVTL3J1bl9jb21waWxlLnRjbCAtbG9nIFwkKExPRykvY29tcGlsZS5sb2cgLXdpbiBcJChBUkdTKSIKICAgICAgICAgICAgfQogICAgICAgICAgICBwdXRzICRvcCAiIiAKCiAgICAgICAgICAgIHNldCBwcmlvcl9zdGVwICJzZXR1cCIKICAgICAgICAgICAgZm9yZWFjaCBzdGVwICRzdGVwcyB7CiAgICAgICAgICAgICAgIHB1dHMgJG9wICIkc3RlcDogJHByaW9yX3N0ZXAiCiMgICAgICAgICAgICAgICBwdXRzICRvcCAiXHRAXCQoTUFLRSkgLWYgTWFrZWZpbGUgZmxvdyIKICAgICAgICAgICAgICAgaWYge1tmaWxlIGRpcm5hbWUgW3B3ZF1dICE9ICIkdmFycyhwYXJ0aXRpb25fZGlyKSJ9IHsKICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGlmIFxbIFwkKFVQREFURSkgPT0geWVzIF0gOyB0aGVuIFxcIgogICAgICAgICAgICAgICAgICBwdXRzICRvcCAiXHRcdFtsaW5kZXggJGV4ZWN1dGVfc3RyaW5nIDBdIFtsaW5kZXggJGV4ZWN1dGVfc3RyaW5nIDFdIC1uIC1tIGJvdHRvbV91cCAkc3RlcCA7IFxcIgogICAgICAgICAgICAgICAgICBwdXRzICRvcCAiXHRmaSIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBwdXRzICRvcCAiXHRWUEFUSD1cJChWUEFUSCk7IGV4cG9ydCBWUEFUSDsgXCQoVE9PTCkgLWluaXQgXCQoU0NSSVBUUykvSU5OT1ZVUy9ydW5fJHN0ZXAudGNsIC1sb2cgXCQoTE9HKS8kc3RlcC5sb2cgLW92ZXJ3cml0ZSBcJChBUkdTKSIKICAgICAgICAgICAgICAgcHV0cyAkb3AgIlx0L2Jpbi90b3VjaCBcJChWUEFUSCkvJHN0ZXBcbiIKICAgICAgICAgICAgICAgc2V0IHByaW9yX3N0ZXAgJHN0ZXAKICAgICAgICAgICAgfQoKIyAgICAgICAgICAgIHB1dHMgJG9wICJodG1sOiIKIyAgICAgICAgICAgIHB1dHMgJG9wICJcdEZGU1RFUFM9XCQoU1RFUFMpOyBleHBvcnQgRkZTVEVQUzsgRkZMT0dESVI9XCQoTE9HKTsgZXhwb3J0IEZGTE9HRElSOyAvdXNyL2Jpbi90Y2xzaCBcJChTQ1JJUFRTKS9JTk5PVlVTL2dlbl9odG1sLnRjbCAuOyBjZCBIVE1MOyBcJChCUk9XU0VSKSBmaWxlOmBwd2RgL2luZGV4Lmh0bWwiCiMgICAgICAgICAgICBwdXRzICRvcCAiIgogICAgICAgICAgICBwdXRzICRvcCAiZGVidWdfJToiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdFZQQVRIPVwkKFZQQVRIKTsgZXhwb3J0IFNURVA9XCQqIDsgZXhwb3J0IFZQQVRIOyBcJChUT09MKSAtaW5pdCBcJChTQ1JJUFRTKS9JTk5PVlVTL3J1bl9kZWJ1Zy50Y2wgLWxvZyBcJChMT0cpL1wkQC5sb2cgLXdpbiBcJChBUkdTOi1ub3dpbj0pIgogICAgICAgICAgICBwdXRzICRvcCAiIgogICAgICAgICAgICBwdXRzICRvcCAibGVjXyU6IgogICAgICAgICAgICBwdXRzICRvcCAiXHRleHBvcnQgU1RFUD1cJCogOyBsZWMgLTY0IC14bCAtRG9maWxlIFwkKFNDUklQVFMpL0lOTk9WVVMvcnVuX2xlYy50Y2wgLU5PR3VpIC1MT0dmaWxlIFwkKExPRykvXCRALmxvZyIKICAgICAgICAgICAgcHV0cyAkb3AgIiIKIyAgICAgICAgICAgIHB1dHMgJG9wICIuUEhPTlk6IGNsZWFuIGh0bWwiCiAgICAgICAgICAgIHB1dHMgJG9wICIuUEhPTlk6IGNsZWFuIgogICAgICAgICAgICBwdXRzICRvcCAiIgogICAgICAgICAgICBwdXRzICRvcCAiY2xlYW46IgogICAgICAgICAgICBwdXRzICRvcCAiXHQvYmluL212ICoucnB0ICR2YXJzKHJwdF9kaXIpIDtcXCIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0L2Jpbi9ybSAtZnIgZXh0TG9nRGlyKiBfX3FyYy5sb2cgKmN0c190cmFjZSAqLnJwdC5vbGQgKmRlbGV0ZSogcGxhY2VtZW50UmVwb3J0cyogKi5yZ3VpZGUgKl9tbW1jIFxcXG5cdCpfY29uc3RyLnB0IC5jb25zdHIqIC5GRSogLnJvdXRpbmcqIC50aW1pbmdfZmlsZSogLnRkcmxvZyoiCiAgICAgICAgICAgIHB1dHMgJG9wICIiCiAgICAgICAgICAgIHB1dHMgJG9wICJkb19jbGVhbnVwOiBzaWdub2ZmIgogICAgICAgICAgICBwdXRzICRvcCAiXHRcJChNQUtFKSBjbGVhbiIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0L2Jpbi90b3VjaCBcJChWUEFUSCkvXCRAIgogICAgICAgICAgICBwdXRzICRvcCAiIgogICAgICAgICAgICBwdXRzICRvcCAicmVzZXQgOiB2ZXJzaW9uIgogICAgICAgICAgICBwdXRzICRvcCAiXHQvYmluL3JtIC1mciBcJChWUEFUSCkvKiBleHRMb2dEaXIqIF9fcXJjLmxvZyAqY3RzX3RyYWNlICoucnB0Lm9sZCAqZGVsZXRlKiBwbGFjZW1lbnRSZXBvcnRzKiAqLnJndWlkZSAqX21tbWMiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdEBmb3IgZmlsZSBpbiBcJChTVEVQUykgOyBcXCIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0ZG8gXFwiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdFx0aWYgXFsgLXIgXCQoVlBBVEgpL1wkXCRmaWxlIFxdIDsgdGhlbiBcXCIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0XHRcdC9iaW4vcm0gXCQoVlBBVEgpL1wkXCRmaWxlIDsgXFwiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdFx0ZmkgXFwiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdGRvbmUiCiAgICAgICAgICAgIHB1dHMgJG9wICIiCiAgICAgICAgICAgIHB1dHMgJG9wICJibG9ja18lOiBzZXR1cCIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGlmIFxbIFwieFwkKlwiID0gXCJ4c2luZ2xlXCIgXF0gOyB0aGVuIFxcIgogICAgICAgICAgICBwdXRzICRvcCAiXHRcdGZmX3N0b3A9XCQoRkZfU1RPUCk7IFxcIgogICAgICAgICAgICBwdXRzICRvcCAiXHRcdHRhcmdldD1cIlwkQCAoZnJvbTogXCQoRkZfU1RBUlQpIHRvOiBcJChGRl9TVE9QKSlcIjsgXFwiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdGVsc2UgXFwiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdFx0ZmZfc3RvcD1cJCogOyBcXCIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0XHR0YXJnZXQ9XCRAOyBcXCIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0Zmk7IFxcIgogICAgICAgICAgICBwdXRzICRvcCAiXHRpZiBcWyAtciBcJChWUEFUSCkvLlJVTk5JTkcgXF0gOyB0aGVuIFxcIgogICAgICAgICAgICBwdXRzICRvcCAiXHRcdGVjaG8gXCJJTkZPOiBBIGJ1aWxkIHNlZW1zIHRvIGJlIHJ1bm5pbmcgYWxyZWFkeS4uLiBjaGVjayBcJChWUEFUSCkvLlJVTk5JTkcgZmlsZSBhbmQgcmVtb3ZlIHRoYXQgZmlsZSBpZiB0aGUgcHJvY2VzcyBpcyBkZWFkXCIgOyBcXCIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0XHQvYmluL2hlYWQgLTEgIFwkKFZQQVRIKS8uUlVOTklORyA7IFxcIgogICAgICAgICAgICBwdXRzICRvcCAiXHRcdGV4aXQgLTEgOyBcXCIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0ZWxzZSBcXCIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0XHQvYmluL3JtIC1mIFwkKFZQQVRIKS9ibG9ja19cJFwkXHtmZl9zdG9wXH0uRE9ORSBcJChWUEFUSCkvYmxvY2tfXCRcJFx7ZmZfc3RvcFx9LkZBSUxFRCBcJChWUEFUSCkvYmxvY2tfXCRcJFx7ZmZfc3RvcFx9LlBBU1MgOyBcXCIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0XHQoZWNobyBcIiMgU3RhcnRlZCBidWlsZGluZyBcJFwkXHt0YXJnZXRcfSBhdCBcImAvYmluL2RhdGVgXCIgb24gXCJgL2Jpbi9ob3N0bmFtZWBcIiBQSUQ6IFwkXCRcJFwkXCIgOyBcJChNQUtFKSBcJChUQVJHRVQpICkgJj5cJChWUEFUSCkvLlJVTk5JTkcgOyBcXCIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0XHRpZiBcWyAtciBcJChWUEFUSCkvXCRcJFx7ZmZfc3RvcFx9IFxdIDsgdGhlbiBcXCIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0XHRcdGlmIFxbIC1yIFwkKFZQQVRIKS8uUlVOTklORyBcXSA7IHRoZW4gXFwiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdFx0XHRcdC9iaW4vbXYgXCQoVlBBVEgpLy5SVU5OSU5HIFwkKFZQQVRIKS9ibG9ja19cJFwkXHtmZl9zdG9wXH0uUEFTUyA7IFxcIgogICAgICAgICAgICBwdXRzICRvcCAiXHRcdFx0XHQvYmluL3RvdWNoIFwkKFZQQVRIKS9ibG9ja19cJFwkXHtmZl9zdG9wXH0gOyBcXCIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0XHRcdFx0L2Jpbi90b3VjaCBcJChWUEFUSCkvYmxvY2tfXCRcJFx7ZmZfc3RvcFx9LkRPTkUgOyBcXCIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0XHRcdGVsc2UgXFwiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdFx0XHRcdGVjaG8gXCIjIFNvbWV0aGluZyBkaWQgbm90IHdvcmsgcHJvcGVybHlcIiA+IFwkKFZQQVRIKS9ibG9ja19cJFwkXHtmZl9zdG9wXH0uRkFJTEVEIDsgXFwiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdFx0XHRcdC9iaW4vdG91Y2ggXCQoVlBBVEgpL2Jsb2NrX1wkXCRce2ZmX3N0b3BcfS5ET05FIDsgXFwiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdFx0XHRcdGV4aXQgLTE7IFxcIgogICAgICAgICAgICBwdXRzICRvcCAiXHRcdFx0ZmkgOyBcXCIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0XHRlbHNlIFxcIgogICAgICAgICAgICBwdXRzICRvcCAiXHRcdFx0aWYgXFsgLXIgXCQoVlBBVEgpLy5SVU5OSU5HIFxdIDsgdGhlbiBcXCIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0XHRcdFx0L2Jpbi9tdiBcJChWUEFUSCkvLlJVTk5JTkcgXCQoVlBBVEgpL2Jsb2NrX1wkXCRce2ZmX3N0b3BcfS5GQUlMRUQgOyBcXCIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0XHRcdGVsc2UgXFwiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdFx0XHRcdGVjaG8gXCIjIFNvbWV0aGluZyBkaWQgbm90IHdvcmsgcHJvcGVybHlcIiA+IFwkKFZQQVRIKS9ibG9ja19cJFwkXHtmZl9zdG9wXH0uRkFJTEVEIDsgXFwiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdFx0XHRmaSA7IFxcIgogICAgICAgICAgICBwdXRzICRvcCAiXHRcdFx0L2Jpbi90b3VjaCBcJChWUEFUSCkvYmxvY2tfXCRcJFx7ZmZfc3RvcFx9LkRPTkUgOyBcXCIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0XHRcdGV4aXQgLTEgOyBcXCIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0XHRmaSA7IFxcIgogICAgICAgICAgICBwdXRzICRvcCAiXHRmaSIKCiAgICAgICAgICAgIGlmIHskdmFycyhnZW5lcmF0ZV9mbG93X3N0ZXBzKSAmJiBbaW5mbyBleGlzdHMgdmFycyhmbG93X3N0ZXBzKV19IHsKICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGZsb3dfc3RlcHMsZmxhdCldfSB7CiAgICAgICAgICAgICAgICAgIHNldCBmcDEgW29wZW4gJHZhcnMoc2NyaXB0X2RpcikvZmxvd19jb25maWcudGNsIHddCiAgICAgICAgICAgICAgICAgIHNldCBmcDIgW29wZW4gJHZhcnMoc2NyaXB0X2RpcikvZmxvd19zdGVwcy50Y2wgd10KICAgICAgICAgICAgICAgICAgcHV0cyAkZnAxICJzZXRfZGIgZmxvd19kYXRhYmFzZV9kaXJlY3RvcnkgJHZhcnMoZGJzX2RpcikiCiAgICAgICAgICAgICAgICAgIHB1dHMgJGZwMSAic2V0X2RiIGZsb3dfcmVwb3J0X2RpcmVjdG9yeSAkdmFycyhycHRfZGlyKSIKICAgICAgICAgICAgICAgICAgcHV0cyAkZnAxICJzZXRfZGIgZmxvd19sb2dfZGlyZWN0b3J5ICR2YXJzKGxvZ19kaXIpIgogICAgICAgICAgICAgICAgICBwdXRzICRmcDIgJHZhcnMoZmxvd19zdGVwcyxmbGF0KQogICAgICAgICAgICAgICAgICBwdXRzICRmcDEgIlxuc2V0X2RiIGZsb3dfbWFpbF90byBbZXhlYyB3aG9hbWldIgogICAgICAgICAgICAgICAgICBwdXRzICRmcDEgInNldF9kYiBmbG93X21haWxfb25fZXJyb3IgdHJ1ZVxuIgogICAgICAgICAgICAgICAgICBpZiB7JHZhcnModG9wKX0gewogICAgICAgICAgICAgICAgICAgICBzZXQgdmFycyhmbG93X25hbWUpIHRvcAogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBzZXQgdmFycyhmbG93X25hbWUpIGJsb2NrCiAgICAgICAgICAgICAgICAgIH0KIyAgICAgICAgICAgICAgICAgIHB1dHMgJGZwICJjcmVhdGVfZmxvdyBcXFxuICAgLW5hbWUgJHZhcnMoZmxvd19uYW1lKVxcXG4gICAtdG9vbCAkdmFycyhtYWtlX3Rvb2wpXFxcbiAgIC10b29sX29wdGlvbnMgey1sb2cgJHZhcnMoZmxvd19uYW1lKS5sb2d9XFxcbiAgIFxbbGlzdCBbRkY6OmFkanVzdF9zdGVwc11cXVxuIgojICAgICAgICAgICAgICAgICAgcHV0cyAkaHAgImNyZWF0ZV9mbG93IFxcXG4gICAtbmFtZSAkdmFycyhmbG93X25hbWUpXFxcbiAgIC10b29sICR2YXJzKG1ha2VfdG9vbClcXFxuICAgLXRvb2xfb3B0aW9ucyB7LWxvZyAkdmFycyhmbG93X25hbWUpLmxvZ31cXFxuICAgXFtsaXN0ICRzdGVwc1xdXG4iCiMgICAgICAgICAgICAgICAgICBwdXRzICRmcCAicnVuX2Zsb3cgLWZsb3cgJHZhcnMoZmxvd19uYW1lKSIKICAgICAgICAgICAgICAgICAgaWYge1tmaWxlIGV4aXN0cyAkdmFycyhjd2QpLy5wbHVnaW5zXX0gewogICAgICAgICAgICAgICAgICAgICBzZXQgaXAgW29wZW4gJHZhcnMoY3dkKS8ucGx1Z2lucyByXQogICAgICAgICAgICAgICAgICAgICB3aGlsZSB7W2dldHMgJGlwIGxpbmVdPj0wfSB7IAogICAgICAgICAgICAgICAgICAgICAgICBwdXRzICRmcDEgJGxpbmUgCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgY2xvc2UgJGlwCiAgICAgICAgICAgICAgICAgICAgIGZpbGUgZGVsZXRlICR2YXJzKGN3ZCkvLnBsdWdpbnMgCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgY2xvc2UgJGZwMQogICAgICAgICAgICAgICAgICBjbG9zZSAkZnAyCiAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhwYXJ0aXRpb25fbGlzdCldfSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIHsoJHZhcnMoZGVzaWduKSA9PSBbbGluZGV4ICR2YXJzKHBhcnRpdGlvbl9saXN0KSAwXSkgfHwgJHZhcnModG9wKX0gewogICAgICAgICAgICAgICAgICAgICAgICBzZXQgaHAgW29wZW4gJHZhcnMoc2NyaXB0X2RpcikvLmhpZXJzdGVwcy50Y2wgd10KICAgICAgICAgICAgICAgICAgICAgICAgaWYgeyR2YXJzKHRvcCl9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHRlbXAgW3JlZ3N1YiAtYWxsICJjcmVhdGVfZmxvd19zdGVwIC1uYW1lIGluaXQiICR2YXJzKGZsb3dfc3RlcHMsZmxhdCkgImNyZWF0ZV9mbG93X3N0ZXAgLW5hbWUgdG9wX2luaXQiXQogICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgdGVtcDIgW3JlZ3N1YiAtYWxsICJjcmVhdGVfZmxvd19zdGVwIC1uYW1lIGN0cyIgJHRlbXAgImNyZWF0ZV9mbG93X3N0ZXAgLW5hbWUgdG9wX2N0cyJdCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCB2YXJzKGZsb3dfc3RlcHMsZmxhdCkgW3JlZ3N1YiAtYWxsICJjcmVhdGVfZmxvd19zdGVwIC1uYW1lIHNpZ25vZmYiICR0ZW1wMiAiY3JlYXRlX2Zsb3dfc3RlcCAtbmFtZSB0b3Bfc2lnbm9mZiJdCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcHV0cyAkaHAgJHZhcnMoZmxvd19zdGVwcyxmbGF0KQogICAgICAgICAgICAgICAgICAgICAgICBpZiB7JHZhcnModG9wKX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgdG9wX3N0ZXBzICIgJHN0ZXBzIgogICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIHMgIiBpbml0IHByZWN0cyBjdHMgc2lnbm9mZiIgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgdGVtcCBbcmVnc3ViICIgJHMiICR0b3Bfc3RlcHMgIiB0b3BfJHMiXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgdG9wX3N0ZXBzICR0ZW1wIAogICAgICAgICAgICAgICAgICAgICAgICAgICB9CiMjICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHRlbXAgW3JlZ3N1YiAiaW5pdCIgW0ZGOjphZGp1c3Rfc3RlcHNdICJ0b3BfaW5pdCJdCiMgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgdGVtcCBbcmVnc3ViICJpbml0IiAkc3RlcHMgInRvcF9pbml0Il0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCB0ZW1wMiBbcmVnc3ViICIgcHJlY3RzICIgJHRlbXAgIiB0b3BfcHJlY3RzICJdCiMgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgdGVtcDMgW3JlZ3N1YiAiIGN0cyAiICR0ZW1wMiAiIHRvcF9jdHMgIl0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCB0b3Bfc3RlcHMgW3JlZ3N1YiAic2lnbm9mZiIgJHRlbXAzICJ0b3Bfc2lnbm9mZiJdCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dHMgJGhwICJjcmVhdGVfZmxvdyBcXFxuICAgLW5hbWUgJHZhcnMoZmxvd19uYW1lKVxcXG4gICAtdG9vbCAkdmFycyhtYWtlX3Rvb2wpXFxcbiAgIC10b29sX29wdGlvbnMgey1sb2cgJHZhcnMoZmxvd19uYW1lKS5sb2d9XFxcbiAgIFxbbGlzdCAkdG9wX3N0ZXBzXF1cbiIKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKIyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dHMgJGhwICJjcmVhdGVfZmxvdyBcXFxuICAgLW5hbWUgJHZhcnMoZmxvd19uYW1lKVxcXG4gICAtdG9vbCAkdmFycyhtYWtlX3Rvb2wpXFxcbiAgIC10b29sX29wdGlvbnMgey1sb2cgJHZhcnMoZmxvd19uYW1lKS5sb2d9XFxcbiAgIFxbbGlzdCBbRkY6OmFkanVzdF9zdGVwc11cXVxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRzICRocCAiY3JlYXRlX2Zsb3cgXFxcbiAgIC1uYW1lICR2YXJzKGZsb3dfbmFtZSlcXFxuICAgLXRvb2wgJHZhcnMobWFrZV90b29sKVxcXG4gICAtdG9vbF9vcHRpb25zIHstbG9nICR2YXJzKGZsb3dfbmFtZSkubG9nfVxcXG4gICBcW2xpc3QgJHN0ZXBzXF1cbiIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBjbG9zZSAkaHAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHVuc2V0IHZhcnMoZmxvd19zdGVwcykKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgInRvcF9kb3duIiB7CiAgICAgICAgICAgIHB1dHMgJG9wICJWRVJTSU9OPTE3LjEwLXAwMDNfMSIKICAgICAgICAgICAgcHV0cyAkb3AgIlZQQVRIPS4vbWFrZSIKICAgICAgICAgICAgcHV0cyAkb3AgIlRPT0w9JHZhcnMobWFrZV90b29sKSIKICAgICAgICAgICAgcHV0cyAkb3AgIlNDUklQVFM9JHZhcnMoc2NyaXB0X2RpcikiCiAgICAgICAgICAgIHB1dHMgJG9wICJMT0c9JHZhcnMobG9nX2RpcikiCiAgICAgICAgICAgIHB1dHMgJG9wICJBUkdTPSR2YXJzKG1ha2VfdG9vbF9hcmdzKSIKICAgICAgICAgICAgcHV0cyAkb3AgIlBBUkFMTEVMPS1qMiIKICAgICAgICAgICAgcHV0cyAkb3AgIlNVQk1JVD1cIlwiIgogICAgICAgICAgICBwdXRzICRvcCAiVEFSR0VUPXNpZ25vZmYiCiAgICAgICAgICAgIHB1dHMgJG9wICJGRl9TVE9QPXNpZ25vZmYiCiAgICAgICAgICAgIHB1dHMgJG9wICJTVEVQUyA9IFtmb3JtYXQgInZlcnNpb24gc2V0dXAgJXMgZG9fY2xlYW51cCIgJHN0ZXBzXSIKICAgICAgICAgICAgcHV0cyAkb3AgIiIKIyAgICAgICAgICAgIHB1dHMgJG9wICJUT1A9YC9iaW4vZ3JlcCBcIl5zZXQgdmFycyhkZXNpZ24pXCIgJHZhcnMoc2V0dXBfdGNsKSB8IC9iaW4vYXdrICcgeyBwcmludGYoXCIlc1xcblwiLFwkXCQzKSB9ICdgIgogICAgICAgICAgICBwdXRzICRvcCAiVE9QPSR2YXJzKGRlc2lnbikiCiAgICAgICAgICAgIHB1dHMgJG9wICIiCiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyh1c2VfZmxleG1vZGVscyldICYmICR2YXJzKHVzZV9mbGV4bW9kZWxzKX0gewogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoZmxleG1vZGVsX3Byb3RvdHlwZSldICYmICR2YXJzKGZsZXhtb2RlbF9wcm90b3R5cGUpfSB7CiAgICAgICAgICAgICAgICAgIHB1dHMgJG9wICJhbGw6IHNldHVwIG1vZGVsX2dlbiBwcm90b3R5cGUgcGFydGl0aW9uX3BsYWNlIGFzc2lnbl9waW4gcGFydGl0aW9uIGJsb2Nrcy5cJChUQVJHRVQpIHRvcC5cJChUQVJHRVQpIGFzc2VtYmxlIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBwdXRzICRvcCAiYWxsOiBzZXR1cCBtb2RlbF9nZW4gcGFydGl0aW9uX3BsYWNlIGFzc2lnbl9waW4gcGFydGl0aW9uIGJsb2Nrcy5cJChUQVJHRVQpIHRvcC5cJChUQVJHRVQpIGFzc2VtYmxlIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHB1dHMgJG9wICJhbGw6IHNldHVwIHBhcnRpdGlvbl9wbGFjZSBhc3NpZ25fcGluIHBhcnRpdGlvbiBibG9ja3MuXCQoVEFSR0VUKSB0b3AuXCQoVEFSR0VUKSBhc3NlbWJsZSIKICAgICAgICAgICAgfQogICAgICAgICAgICBwdXRzICRvcCAiIgogICAgICAgICAgICBwdXRzICRvcCAiaGVscDoiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XCIiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiICAgICAgICAgICBcJChWRVJTSU9OKSAgRm91bmRhdGlvbiBGbG93c1wiIgogICAgICAgICAgICBwdXRzICRvcCAiXHRAZWNobyBcIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVwiIgogICAgICAgICAgICBwdXRzICRvcCAiXHRAZWNobyBcIiBNYWtlZmlsZSBUYXJnZXRzXCIiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XCIiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiICAgICAgICAgICAgICBhbGwgOiBSdW4gY29tcGxldGUgZmxvdyAoZGVmYXVsdClcIiIKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHVzZV9mbGV4bW9kZWxzKV0gJiYgJHZhcnModXNlX2ZsZXhtb2RlbHMpfSB7CiAgICAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiICAgICAgICBtb2RlbF9nZW4gOiBHZW5lcmF0ZSBmbGV4bW9kZWxzXCIiCiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhmbGV4bW9kZWxfcHJvdG90eXBlKV0gJiYgJHZhcnMoZmxleG1vZGVsX3Byb3RvdHlwZSl9IHsKICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCIgICAgICAgIHByb3RvdHlwZSA6IEZsZXhtb2RlbCBwcm90b3R5cGVcIiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiICBwYXJ0aXRpb25fcGxhY2UgOiBJbml0aWFsIHBsYWNlbWVudCAmIGZlZWR0aHJvdWdoXCIiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiICAgICAgIGFzc2lnbl9waW4gOiBQaW4gYXNzaWdubWVudFwiIgogICAgICAgICAgICBwdXRzICRvcCAiXHRAZWNobyBcIiAgICAgICAgcGFydGl0aW9uIDogUGFydGl0aW9uIGRlc2lnblwiIgogICAgICAgICAgICBwdXRzICRvcCAiXHRAZWNobyBcIiAgYmxvY2tzLjx0YXJnZXQ+IDogSW1wbGVtZW50IGJsb2Nrc1wiIgogICAgICAgICAgICBwdXRzICRvcCAiXHRAZWNobyBcIiAgICAgICAgIGFzc2VtYmxlIDogQXNzZW1ibGUgZGVzaWduXCIiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XCIiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiIE1ha2VmaWxlIE9wdGlvbnNcIiIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cIiIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCIgICBWUEFUSCAgOiBNYWtlIGRpcmVjdG9yeSAgICAgKGRlZmF1bHQgbWFrZSlcIiIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCIgIFNVQk1JVCAgOiBMU0YgbGF1bmNoIGNvbW1hbmQgKGRlZmF1bHQgJycpXCIiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiIFBBUkFMTEVMIDogTnVtYmVyIG9mIG1hY2hpbmVzIChkZWZhdWx0IC1qMilcIiIKICAgICAgICAgICAgaWYgeyR2YXJzKG5vdnVzKX0gewogICAgICAgICAgICAgICBwdXRzICRvcCAiXHRAZWNobyBcIiAgICBUT09MICA6IElOTk9WVVMgZXhlY3V0YWJsZSAoZGVmYXVsdCBpbm5vdnVzKVwiIgogICAgICAgICAgICAgICBwdXRzICRvcCAiXHRAZWNobyBcIiAgICBBUkdTICA6IElOTk9WVVMgYXJndW1lbnRzICAoZGVmYXVsdCAtbm93aW4gLTY0KVwiIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBwdXRzICRvcCAiXHRAZWNobyBcIiAgICBUT09MICA6IElOTk9WVVMgZXhlY3V0YWJsZSAgICAgKGRlZmF1bHQgaW5ub3Z1cylcIiIKICAgICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCIgICAgQVJHUyAgOiBJTk5PVlVTIGFyZ3VtZW50cyAgICAgIChkZWZhdWx0IC1ub3dpbiAtNjQpXCIiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCIgU0NSSVBUUyAgOiBTY3JpcHQgZGlyZWN0b3J5ICAgKGRlZmF1bHQgJHZhcnMoc2NyaXB0X2RpcikpXCIiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiICAgICBMT0cgIDogTG9nZmlsZSBkaXJlY3RvcnkgIChkZWZhdWx0ICR2YXJzKGxvZ19kaXIpKVwiIgogICAgICAgICAgICBwdXRzICRvcCAiXHRAZWNobyBcIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVwiIgogICAgICAgICAgICBwdXRzICRvcCAiIgojICAgICAgICAgICAgcHV0cyAkb3AgImZsb3c6ICR2YXJzKGNvbmZpZ19maWxlcykiCiMgICAgICAgICAgICBwdXRzICRvcCAiXHRleGVjdXRlX3N0cmluZyIKIyAgICAgICAgICAgIHB1dHMgJG9wICJcdEAvYmluL3RvdWNoIFwkKFZQQVRIKS9cJEAiCiAgICAgICAgICAgIHB1dHMgJG9wICJhc3NlbWJsZTogdG9wLlwkKFRBUkdFVCkiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdFZQQVRIPVwkKFZQQVRIKTsgZXhwb3J0IFZQQVRIOyBcJChUT09MKSBcJChBUkdTKSAtaW5pdCBcJChTQ1JJUFRTKS9JTk5PVlVTL3J1bl9hc3NlbWJsZS50Y2wgLWxvZyBcJChMT0cpL2Fzc2VtYmxlLmxvZyAtb3ZlcndyaXRlIgogICAgICAgICAgICBwdXRzICRvcCAiXHQvYmluL3RvdWNoIFwkKFZQQVRIKS9hc3NlbWJsZSIKICAgICAgICAgICAgcHV0cyAkb3AgIiIKICAgICAgICAgICAgcHV0cyAkb3AgInRvcC5cJChUQVJHRVQpIDogYmxvY2tzLlwkKFRBUkdFVCkiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdGNkICR2YXJzKHBhcnRpdGlvbl9kaXIpL1wkKFRPUCk7IFwkKE1BS0UpIC1mIE1ha2VmaWxlIEZGX1NUT1A9XCQoRkZfU1RPUCkgXCQoVEFSR0VUKSAiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdC9iaW4vdG91Y2ggXCQoVlBBVEgpL1wkQCIKICAgICAgICAgICAgcHV0cyAkb3AgIiIKICAgICAgICAgICAgcHV0cyAkb3AgImJsb2Nrcy5cJChUQVJHRVQpIDogcGFydGl0aW9uIgogICAgICAgICAgICBwdXRzICRvcCAiXHRjZCAkdmFycyhwYXJ0aXRpb25fZGlyKTsgVlBBVEg9XCQoVlBBVEgpOyBleHBvcnQgVlBBVEg7IFwkKE1BS0UpIFwkKFBBUkFMTEVMKSBibG9ja3MgRkZfU1RPUD1cJChGRl9TVE9QKSBUQVJHRVQ9XCQoVEFSR0VUKSIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0L2Jpbi90b3VjaCBcJChWUEFUSCkvXCRAIgogICAgICAgICAgICBwdXRzICRvcCAiIgogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnModXNlX2ZsZXhtb2RlbHMpXSAmJiAkdmFycyh1c2VfZmxleG1vZGVscyl9IHsKICAgICAgICAgICAgICAgcHV0cyAkb3AgIm1vZGVsX2dlbiA6IHNldHVwIgogICAgICAgICAgICAgICBwdXRzICRvcCAiXHRWUEFUSD1cJChWUEFUSCk7IGV4cG9ydCBWUEFUSDsgXCQoVE9PTCkgXCQoQVJHUykgLWluaXQgXCQoU0NSSVBUUykvSU5OT1ZVUy9ydW5fbW9kZWxfZ2VuLnRjbCAtbG9nIFwkKExPRykvbW9kZWxfZ2VuLmxvZyAtb3ZlcndyaXRlIgogICAgICAgICAgICAgICBwdXRzICRvcCAiXHQvYmluL3RvdWNoIFwkKFZQQVRIKS9tb2RlbF9nZW4iCiAgICAgICAgICAgICAgIHB1dHMgJG9wICIiCiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhmbGV4bW9kZWxfcHJvdG90eXBlKV0gJiYgJHZhcnMoZmxleG1vZGVsX3Byb3RvdHlwZSl9IHsKICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgInByb3RvdHlwZSA6IG1vZGVsX2dlbiIKICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgIlx0VlBBVEg9XCQoVlBBVEgpOyBleHBvcnQgVlBBVEg7IFwkKFRPT0wpIFwkKEFSR1MpIC1pbml0IFwkKFNDUklQVFMpL0lOTk9WVVMvcnVuX3Byb3RvdHlwZS50Y2wgLWxvZyBcJChMT0cpL3Byb3RvdHlwZS5sb2cgLW92ZXJ3cml0ZSIKICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgIlx0L2Jpbi90b3VjaCBcJChWUEFUSCkvcHJvdG90eXBlIgogICAgICAgICAgICAgICAgICBwdXRzICRvcCAiIgogICAgICAgICAgICAgICAgICBwdXRzICRvcCAicGFydGl0aW9uX3BsYWNlIDogcHJvdG90eXBlIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBwdXRzICRvcCAicGFydGl0aW9uX3BsYWNlIDogbW9kZWxfZ2VuIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHB1dHMgJG9wICJwYXJ0aXRpb25fcGxhY2UgOiAgc2V0dXAiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHV0cyAkb3AgIlx0VlBBVEg9XCQoVlBBVEgpOyBleHBvcnQgVlBBVEg7IFwkKFRPT0wpIFwkKEFSR1MpIC1pbml0IFwkKFNDUklQVFMpL0lOTk9WVVMvcnVuX3BhcnRpdGlvbl9wbGFjZS50Y2wgLWxvZyBcJChMT0cpL3BhcnRpdGlvbl9wbGFjZS5sb2cgLW92ZXJ3cml0ZSIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0L2Jpbi90b3VjaCBcJChWUEFUSCkvcGFydGl0aW9uX3BsYWNlIgogICAgICAgICAgICBwdXRzICRvcCAiIgogICAgICAgICAgICBwdXRzICRvcCAiYXNzaWduX3BpbiA6ICBwYXJ0aXRpb25fcGxhY2UiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdFZQQVRIPVwkKFZQQVRIKTsgZXhwb3J0IFZQQVRIOyBcJChUT09MKSBcJChBUkdTKSAtaW5pdCBcJChTQ1JJUFRTKS9JTk5PVlVTL3J1bl9hc3NpZ25fcGluLnRjbCAtbG9nIFwkKExPRykvYXNzaWduX3Bpbi5sb2cgLW92ZXJ3cml0ZSIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0L2Jpbi90b3VjaCBcJChWUEFUSCkvYXNzaWduX3BpbiIKICAgICAgICAgICAgcHV0cyAkb3AgIiIKICAgICAgICAgICAgcHV0cyAkb3AgInBhcnRpdGlvbiA6IGFzc2lnbl9waW4iCiAgICAgICAgICAgIHB1dHMgJG9wICJcdFZQQVRIPVwkKFZQQVRIKTsgZXhwb3J0IFZQQVRIOyBcJChUT09MKSBcJChBUkdTKSAtaW5pdCBcJChTQ1JJUFRTKS9JTk5PVlVTL3J1bl9wYXJ0aXRpb24udGNsIC1sb2cgXCQoTE9HKS9wYXJ0aXRpb24ubG9nIC1vdmVyd3JpdGUiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdC9iaW4vdG91Y2ggXCQoVlBBVEgpL3BhcnRpdGlvbiIKICAgICAgICAgICAgcHV0cyAkb3AgIiIKICAgICAgICAgICAgcHV0cyAkb3AgInNpbmdsZToiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdEBcJChNQUtFKSBUQVJHRVQ9c2luZ2xlIEZGX1NUT1A9XCQoRkZfU1RPUCkiCiAgICAgICAgICAgIHB1dHMgJG9wICIiCiAgICAgICAgICAgIHB1dHMgJG9wICJkZWJ1Z18lOiIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0ZXhwb3J0IFNURVA9XCQqIDsgVlBBVEg9XCQoVlBBVEgpOyBleHBvcnQgVlBBVEg7IFwkKFRPT0wpIC1pbml0IFwkKFNDUklQVFMpL0lOTk9WVVMvcnVuX2RlYnVnLnRjbCAtbG9nIFwkKExPRykvXCRALmxvZyAtd2luIFwkKEFSR1M6LW5vd2luPSkiCiAgICAgICAgICAgIHB1dHMgJG9wICIiCiAgICAgICAgICAgIHB1dHMgJG9wICJyZXNldDoiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdEAvYmluL3JtIC1mIFwkKFZQQVRIKS8qICR2YXJzKHBhcnRpdGlvbl9kaXIpLyovXCQoVlBBVEgpLyogJHZhcnMocGFydGl0aW9uX2RpcikvKi9cJChWUEFUSCkvLlJVTk5JTkciCiAgICAgICAgICAgIHB1dHMgJG9wICIiCiAgICAgICAgICAgIHB1dHMgJG9wICJzZXR1cDoiCiAgICAgICAgICAgIHB1dHMgJG9wICIjXHQvYmluL3JtIC1mciAkdmFycyhwYXJ0aXRpb25fZGlyKSBcJChWUEFUSCkgTE9HIgogICAgICAgICAgICBwdXRzICRvcCAiXHQvYmluL21rZGlyIC1wICBcJChWUEFUSCkgTE9HIgogICAgICAgICAgICBwdXRzICRvcCAiXHQvYmluL3RvdWNoIFwkKFZQQVRIKS9zZXR1cCIKCiAgICAgICAgICAgIGlmIHskdmFycyhnZW5lcmF0ZV9mbG93X3N0ZXBzKSAmJiBbaW5mbyBleGlzdHMgdmFycyhmbG93X3N0ZXBzKV19IHsKICAgICAgICAgICAgICAgc2V0IGZwIFtvcGVuIHJ1bl9mbG93LnRjbCB3XQojICAgICAgICAgICAgICAgcHV0cyAkZnAgInNvdXJjZSAkdmFycyhzY3JpcHRfZGlyKS9mbG93X3N0ZXBzLnRjbCIKICAgICAgICAgICAgICAgc2V0IGZwMSBbb3BlbiAkdmFycyhzY3JpcHRfZGlyKS9mbG93X2NvbmZpZy50Y2wgd10KICAgICAgICAgICAgICAgc2V0IGZwMiBbb3BlbiAkdmFycyhzY3JpcHRfZGlyKS9mbG93X3N0ZXBzLnRjbCB3XQojICAgICAgICAgICAgICAgcHV0cyAkZnAxICJzZXRfZGIgZmxvd19zdGVwOmFzc2VtYmxlIC5za2lwX2RiIHRydWUiCiMgICAgICAgICAgICAgICBwdXRzICRmcDEgInNldF9kYiBmbG93X3N0ZXA6cGFydGl0aW9uIC5za2lwX2RiIHRydWUiCiAgICAgICAgICAgICAgIHB1dHMgJGZwMSAic2V0X2RiIGZsb3dfZGF0YWJhc2VfZGlyZWN0b3J5ICR2YXJzKGRic19kaXIpIgogICAgICAgICAgICAgICBwdXRzICRmcDEgInNldF9kYiBmbG93X3JlcG9ydF9kaXJlY3RvcnkgJHZhcnMocnB0X2RpcikiCiAgICAgICAgICAgICAgIHB1dHMgJGZwMSAic2V0X2RiIGZsb3dfbG9nX2RpcmVjdG9yeSAkdmFycyhsb2dfZGlyKSIKICAgICAgICAgICAgICAgcHV0cyAkZnAxICJcbnNldF9kYiBmbG93X21haWxfdG8gW2V4ZWMgd2hvYW1pXSIKICAgICAgICAgICAgICAgcHV0cyAkZnAxICJzZXRfZGIgZmxvd19tYWlsX29uX2Vycm9yIHRydWVcbiIKICAgICAgICAgICAgICAgZm9yZWFjaCBwIFtjb25jYXQgJHZhcnMocGFydGl0aW9uX2xpc3QpICR2YXJzKGRlc2lnbildIHsKIyAgICAgICAgICAgICAgICAgIHNldCB2YXJzKGZsb3dfbmFtZSkgJHAKICAgICAgICAgICAgICAgICAgaWYge1tmaWxlIGV4aXN0cyAkdmFycyhwYXJ0aXRpb25fZGlyKS8kcC8kdmFycyhzY3JpcHRfZGlyKS8uaGllcnN0ZXBzLnRjbF19IHsKICAgICAgICAgICAgICAgICAgICAgcHV0cyAkZnAyICIjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gJHAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iIAogICAgICAgICAgICAgICAgICAgICBzZXQgaXAgW29wZW4gJHZhcnMocGFydGl0aW9uX2RpcikvJHAvJHZhcnMoc2NyaXB0X2RpcikvLmhpZXJzdGVwcy50Y2wgcl0KICAgICAgICAgICAgICAgICAgICAgaWYgeyRwICE9ICR2YXJzKGRlc2lnbil9IHsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUge1tnZXRzICRpcCBsaW5lXT49MH0geyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0cyAkZnAyICRsaW5lIAogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIHtbZ2V0cyAkaXAgbGluZV0+PTB9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYge1tyZWdleHAgImNyZWF0ZV9mbG93X3N0ZXAgLW5hbWUgdG9wXyIgJGxpbmVdfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dHMgJGZwMiAkbGluZSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUge1tnZXRzICRpcCBsaW5lXT49MH0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB7W3JlZ2V4cCAiXlx9IiAkbGluZV19IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0cyAkZnAyICRsaW5lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRzICRmcDIgJGxpbmUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIHtbZmlsZSBleGlzdHMgJHZhcnMocGFydGl0aW9uX2RpcikvJHAvcnVuX2Zsb3cudGNsXX0gewogICAgICAgICAgICAgICAgICAgICBzZXQgaXAgW29wZW4gJHZhcnMocGFydGl0aW9uX2RpcikvJHAvcnVuX2Zsb3cudGNsIHJdCiAgICAgICAgICAgICAgICAgICAgIHdoaWxlIHtbZ2V0cyAkaXAgbGluZV0+PTB9IHsgCiAgICAgICAgICAgICAgICAgICAgICAgIHB1dHMgJGZwICRsaW5lIAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHBhcnRpdGlvbl9kaXJfcGFzczIpXSAmJiBbZmlsZSBleGlzdHMgJHZhcnMocGFydGl0aW9uX2Rpcl9wYXNzMikvJHAvcnVuX2Zsb3cudGNsXX0gewogICAgICAgICAgICAgICAgICAgICBzZXQgaXAgW29wZW4gJHZhcnMocGFydGl0aW9uX2Rpcl9wYXNzMikvJHAvcnVuX2Zsb3cudGNsIHJdCiAgICAgICAgICAgICAgICAgICAgIHdoaWxlIHtbZ2V0cyAkaXAgbGluZV0+PTB9IHsgCiAgICAgICAgICAgICAgICAgICAgICAgIHB1dHMgJGZwICRsaW5lIAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBwdXRzICRmcDIgIiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBISUVSIFNURVBTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiAKICAgICAgICAgICAgICAgcHV0cyAkZnAyICR2YXJzKGZsb3dfc3RlcHMsaGllcikKICAgICAgICAgICAgICAgc2V0IGFzdGVwcyBbRkY6OmFkanVzdF9zdGVwc10KIyAgICAgICAgICAgICAgIHNldCB2YXJzKGZsb3dfbmFtZSkgJHZhcnMoZGVzaWduKQojICAgICAgICAgICAgICAgcHV0cyAkZnAgImNyZWF0ZV9mbG93IFxcXG4gICAtbmFtZSAkdmFycyhmbG93X25hbWUpXFxcbiAgIC10b29sICR2YXJzKG1ha2VfdG9vbClcXFxuICAgLXRvb2xfb3B0aW9ucyB7LWxvZyAkdmFycyhmbG93X25hbWUpLmxvZ31cXFxuICAgXFtsaXN0ICRhc3RlcHNcXVxuIgogICAgICAgICAgICAgICBzZXQgcHN0ZXBzIFtsaXN0XQogICAgICAgICAgICAgICBzZXQgYnN0ZXBzIFtsaXN0XQogICAgICAgICAgICAgICBmb3JlYWNoIHMgJGFzdGVwcyB7CiAgICAgICAgICAgICAgICAgIGlmIHsoW2xzZWFyY2ggJHZhcnMoZnN0ZXBzKSAkc10gIT0gLTEpICYmICgkcyAhPSAiYXNzZW1ibGUiKX0gewogICAgICAgICAgICAgICAgICAgICBsYXBwZW5kIGJzdGVwcyAkcwogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZiB7JHMgIT0gImFzc2VtYmxlIn0gewogICAgICAgICAgICAgICAgICAgICAgICBsYXBwZW5kIHBzdGVwcyAkcwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBzZXQgdmFycyhmbG93X25hbWUpIGZpbmFsX2Fzc2VtYmx5CiAgICAgICAgICAgICAgIHB1dHMgJGZwICJjcmVhdGVfZmxvdyBcXFxuICAgLW5hbWUgJHZhcnMoZmxvd19uYW1lKVxcXG4gICAtdG9vbCAkdmFycyhtYWtlX3Rvb2wpXFxcbiAgIC10b29sX29wdGlvbnMgey1sb2cgJHZhcnMoZmxvd19uYW1lKS5sb2d9XFxcbiAgIFxbbGlzdCBhc3NlbWJsZVxdXG4iCiAgICAgICAgICAgICAgIHNldCB2YXJzKGZsb3dfbmFtZSkgcGFydGl0aW9uaW5nCiAgICAgICAgICAgICAgIHB1dHMgJGZwICJjcmVhdGVfZmxvdyBcXFxuICAgLW5hbWUgJHZhcnMoZmxvd19uYW1lKVxcXG4gICAtdG9vbCAkdmFycyhtYWtlX3Rvb2wpXFxcbiAgIC10b29sX29wdGlvbnMgey1sb2cgJHZhcnMoZmxvd19uYW1lKS5sb2d9XFxcbiAgIFxbbGlzdCAkcHN0ZXBzXF1cbiIKICAgICAgICAgICAgICAgdW5zZXQgdmFycyhmbG93X3N0ZXBzKQojICAgICAgICAgICAgICAgc2V0IHZhcnMoZmxvd19uYW1lKSAkdmFycyhkZXNpZ24pCiMgICAgICAgICAgICAgICBwdXRzICRmcCAiY3JlYXRlX2Zsb3cgXFxcbiAgIC1uYW1lICR2YXJzKGZsb3dfbmFtZSlcXFxuICAgLXRvb2wgJHZhcnMobWFrZV90b29sKVxcXG4gICAtdG9vbF9vcHRpb25zIHstbG9nICR2YXJzKGZsb3dfbmFtZSkubG9nfVxcXG4gICBcW2xpc3QgJGJzdGVwc1xdXG4iCiAgICAgICAgICAgICAgIGlmIHtbZmlsZSBleGlzdHMgJHZhcnMoY3dkKS8ucGx1Z2luc119IHsKICAgICAgICAgICAgICAgICBzZXQgaXAgW29wZW4gJHZhcnMoY3dkKS8ucGx1Z2lucyByXQogICAgICAgICAgICAgICAgIHdoaWxlIHtbZ2V0cyAkaXAgbGluZV0+PTB9IHsgCiAgICAgICAgICAgICAgICAgICAgcHV0cyAkZnAxICRsaW5lIAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjbG9zZSAkaXAKICAgICAgICAgICAgICAgICBmaWxlIGRlbGV0ZSAkdmFycyhjd2QpLy5wbHVnaW5zIAogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMocnVuX2Zsb3cpXX0gewogICAgICAgICAgICAgICAgICBwdXRzICRmcCAic291cmNlICR2YXJzKHNjcmlwdF9kaXIpL2Zsb3dfY29uZmlnLnRjbCIKICAgICAgICAgICAgICAgICAgc2V0IHZhcnMocnVuX2Zsb3cpIERPTkUKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBjbG9zZSAkZnAKICAgICAgICAgICAgICAgY2xvc2UgJGZwMQogICAgICAgICAgICAgICBjbG9zZSAkZnAyCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAiMnBhc3MiIHsKICAgICAgICAgICAgc2V0IG9wMSBbb3BlbiBNYWtlZmlsZS5wYXNzMSB3XSAKICAgICAgICAgICAgcHV0cyAkb3AxICJWRVJTSU9OPTE3LjEwLXAwMDNfMSIKICAgICAgICAgICAgcHV0cyAkb3AxICJWUEFUSD0uL21ha2UiCiAgICAgICAgICAgIHB1dHMgJG9wMSAiVE9PTD0kdmFycyhtYWtlX3Rvb2wpIgogICAgICAgICAgICBwdXRzICRvcDEgIlNDUklQVFM9JHZhcnMoc2NyaXB0X2RpcikiCiAgICAgICAgICAgIHB1dHMgJG9wMSAiTE9HPSR2YXJzKGxvZ19kaXIpIgogICAgICAgICAgICBwdXRzICRvcDEgIkFSR1M9JHZhcnMobWFrZV90b29sX2FyZ3MpIgogICAgICAgICAgICBwdXRzICRvcDEgIlBBUkFMTEVMPS1qMiIKICAgICAgICAgICAgcHV0cyAkb3AxICJTVUJNSVQ9XCJcIiIKICAgICAgICAgICAgcHV0cyAkb3AxICJUQVJHRVQ9Y3RzIgogICAgICAgICAgICBwdXRzICRvcDEgIkZGX1NUT1A9Y3RzIgogICAgICAgICAgICBwdXRzICRvcDEgIlNURVBTID0gW2Zvcm1hdCAidmVyc2lvbiBzZXR1cCAlcyBkb19jbGVhbnVwIiAkc3RlcHNdIgogICAgICAgICAgICBwdXRzICRvcDEgIiIKIyAgICAgICAgICAgIHB1dHMgJG9wMSAiVE9QPWAvYmluL2dyZXAgXCJec2V0IHZhcnMoZGVzaWduKVwiICR2YXJzKHNldHVwX3RjbCkgfCAvYmluL2F3ayAnIHsgcHJpbnRmKFwiJXNcXG5cIixcJFwkMykgfSAnYCIKICAgICAgICAgICAgcHV0cyAkb3AxICJUT1A9JHZhcnMoZGVzaWduKSIKICAgICAgICAgICAgcHV0cyAkb3AxICIiCiAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyh1c2VfZmxleG1vZGVscyldICYmICR2YXJzKHVzZV9mbGV4bW9kZWxzKX0gewogICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoZmxleG1vZGVsX3Byb3RvdHlwZSldICYmICR2YXJzKGZsZXhtb2RlbF9wcm90b3R5cGUpfSB7CiAgICAgICAgICAgICAgICAgIHB1dHMgJG9wMSAiYWxsOiBzZXR1cCBwcm90b3R5cGUgbW9kZWxfZ2VuIHBhcnRpdGlvbl9wbGFjZSBhc3NpZ25fcGluIHBhcnRpdGlvbiBibG9ja3MuXCQoVEFSR0VUKSB0b3AuXCQoVEFSR0VUKSIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgcHV0cyAkb3AxICJhbGw6IHNldHVwIG1vZGVsX2dlbiBwYXJ0aXRpb25fcGxhY2UgYXNzaWduX3BpbiBwYXJ0aXRpb24gYmxvY2tzLlwkKFRBUkdFVCkgdG9wLlwkKFRBUkdFVCkiCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgcHV0cyAkb3AxICJhbGw6IHNldHVwIHBhcnRpdGlvbl9wbGFjZSBhc3NpZ25fcGluIHBhcnRpdGlvbiBibG9ja3MuXCQoVEFSR0VUKSB0b3AuXCQoVEFSR0VUKSIKICAgICAgICAgICAgfQogICAgICAgICAgICBwdXRzICRvcDEgIlx0QGVjaG8gXCIgTWFrZWZpbGUgVGFyZ2V0c1wiIgogICAgICAgICAgICBwdXRzICRvcDEgIlx0QGVjaG8gXCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cIiIKICAgICAgICAgICAgcHV0cyAkb3AxICJcdEBlY2hvIFwiICAgICAgICAgICAgICBhbGwgOiBSdW4gY29tcGxldGUgZmxvdyAoZGVmYXVsdClcIiIKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHVzZV9mbGV4bW9kZWxzKV0gJiYgJHZhcnModXNlX2ZsZXhtb2RlbHMpfSB7CiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhmbGV4bW9kZWxfcHJvdG90eXBlKV0gJiYgJHZhcnMoZmxleG1vZGVsX3Byb3RvdHlwZSl9IHsKICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCIgICAgICAgIHByb3RvdHlwZSA6IEZsZXhtb2RlbCBwcm90b3R5cGVcIiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBwdXRzICRvcCAiXHRAZWNobyBcIiAgICAgICAgbW9kZWxfZ2VuIDogR2VuZXJhdGUgZmxleG1vZGVsc1wiIgogICAgICAgICAgICB9CiAgICAgICAgICAgIHB1dHMgJG9wMSAiXHRAZWNobyBcIiAgcGFydGl0aW9uX3BsYWNlIDogSW5pdGlhbCBwbGFjZW1lbnQgJiBmZWVkdGhyb3VnaFwiIgogICAgICAgICAgICBwdXRzICRvcDEgIlx0QGVjaG8gXCIgICAgICAgYXNzaWduX3BpbiA6IFBpbiBhc3NpZ25tZW50XCIiCiAgICAgICAgICAgIHB1dHMgJG9wMSAiXHRAZWNobyBcIiAgICAgICAgcGFydGl0aW9uIDogUGFydGl0aW9uIGRlc2lnblwiIgogICAgICAgICAgICBwdXRzICRvcDEgIlx0QGVjaG8gXCIgIGJsb2Nrcy48dGFyZ2V0PiA6IEltcGxlbWVudCBibG9ja3NcIiIKICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9mbGV4aWxtKX0gewogICAgICAgICAgICAgICBwdXRzICRvcDEgIlx0QGVjaG8gXCIgICAgICAgICAgZmxleGlsbSA6IFByZUNUUyBETE0gZmxvd1wiIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBwdXRzICRvcDEgIlx0QGVjaG8gXCIgICAgICByZWJ1ZGdldCA6IFJlYnVkZ2V0IGNvbnN0cmFpbnRzXCIiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHV0cyAkb3AxICJcdEBlY2hvIFwiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XCIiCiAgICAgICAgICAgIHB1dHMgJG9wMSAiXHRAZWNobyBcIiBNYWtlZmlsZSBPcHRpb25zXCIiCiAgICAgICAgICAgIHB1dHMgJG9wMSAiXHRAZWNobyBcIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVwiIgogICAgICAgICAgICBwdXRzICRvcDEgIlx0QGVjaG8gXCIgICBWUEFUSCAgOiBNYWtlIGRpcmVjdG9yeSAgICAgKGRlZmF1bHQgbWFrZSlcIiIKICAgICAgICAgICAgcHV0cyAkb3AxICJcdEBlY2hvIFwiICBTVUJNSVQgIDogTFNGIGxhdW5jaCBjb21tYW5kIChkZWZhdWx0ICcnKVwiIgogICAgICAgICAgICBwdXRzICRvcDEgIlx0QGVjaG8gXCIgUEFSQUxMRUwgOiBOdW1iZXIgb2YgbWFjaGluZXMgKGRlZmF1bHQgLWoyKVwiIgogICAgICAgICAgICBpZiB7JHZhcnMobm92dXMpfSB7CiAgICAgICAgICAgICAgIHB1dHMgJG9wMSAiXHRAZWNobyBcIiAgICBUT09MICA6IElOTk9WVVMgZXhlY3V0YWJsZSAoZGVmYXVsdCBpbm5vdnVzKVwiIgogICAgICAgICAgICAgICBwdXRzICRvcDEgIlx0QGVjaG8gXCIgICAgQVJHUyAgOiBJTk5PVlVTIGFyZ3VtZW50cyAgKGRlZmF1bHQgLW5vdnVzX3VpIC02NClcIiIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgcHV0cyAkb3AxICJcdEBlY2hvIFwiICAgIFRPT0wgIDogSU5OT1ZVUyBleGVjdXRhYmxlICAgICAoZGVmYXVsdCBpbm5vdnVzKVwiIgogICAgICAgICAgICAgICBwdXRzICRvcDEgIlx0QGVjaG8gXCIgICAgQVJHUyAgOiBJTk5PVlVTIGFyZ3VtZW50cyAgICAgIChkZWZhdWx0IC1ub3dpbiAtNjQpXCIiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHV0cyAkb3AxICJcdEBlY2hvIFwiIFNDUklQVFMgIDogU2NyaXB0IGRpcmVjdG9yeSAgIChkZWZhdWx0ICR2YXJzKHNjcmlwdF9kaXIpKVwiIgogICAgICAgICAgICBwdXRzICRvcDEgIlx0QGVjaG8gXCIgICAgIExPRyAgOiBMb2dmaWxlIGRpcmVjdG9yeSAgKGRlZmF1bHQgJHZhcnMobG9nX2RpcikpXCIiCiAgICAgICAgICAgIHB1dHMgJG9wMSAiXHRAZWNobyBcIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVwiIgogICAgICAgICAgICBwdXRzICRvcDEgIiIKIyAgICAgICAgICAgIHB1dHMgJG9wMSAiZmxvdzogJHZhcnMoY29uZmlnX2ZpbGVzKSIKIyAgICAgICAgICAgIHB1dHMgJG9wMSAiXHRleGVjdXRlX3N0cmluZyIKIyAgICAgICAgICAgIHB1dHMgJG9wMSAiXHRAL2Jpbi90b3VjaCBcJChWUEFUSCkvXCRAIgogICAgICAgICAgICBwdXRzICRvcDEgInRvcC5cJChUQVJHRVQpIDogYmxvY2tzLlwkKFRBUkdFVCkiCiAgICAgICAgICAgIHB1dHMgJG9wMSAiXHRjZCAkdmFycyhwYXJ0aXRpb25fZGlyKS9cJChUT1ApOyBcJChNQUtFKSAtZiBNYWtlZmlsZSBGRl9TVE9QPVwkKEZGX1NUT1ApIFwkKFRBUkdFVCkgIgogICAgICAgICAgICBwdXRzICRvcDEgIlx0L2Jpbi90b3VjaCBcJChWUEFUSCkvXCRAIgogICAgICAgICAgICBwdXRzICRvcDEgIiIKICAgICAgICAgICAgcHV0cyAkb3AxICJibG9ja3MuXCQoVEFSR0VUKSA6IHBhcnRpdGlvbiIKICAgICAgICAgICAgcHV0cyAkb3AxICJcdGNkICR2YXJzKHBhcnRpdGlvbl9kaXIpOyBWUEFUSD1cJChWUEFUSCk7IGV4cG9ydCBWUEFUSDsgXCQoTUFLRSkgXCQoUEFSQUxMRUwpIGJsb2NrcyBGRl9TVE9QPVwkKEZGX1NUT1ApIFRBUkdFVD1cJChUQVJHRVQpIgogICAgICAgICAgICBwdXRzICRvcDEgIlx0L2Jpbi90b3VjaCBcJChWUEFUSCkvXCRAIgogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnModXNlX2ZsZXhtb2RlbHMpXSAmJiAkdmFycyh1c2VfZmxleG1vZGVscyl9IHsKICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGZsZXhtb2RlbF9wcm90b3R5cGUpXSAmJiAkdmFycyhmbGV4bW9kZWxfcHJvdG90eXBlKX0gewogICAgICAgICAgICAgICAgICBwdXRzICRvcDEgInByb3RvdHlwZSA6IHNldHVwIgogICAgICAgICAgICAgICAgICBwdXRzICRvcDEgIlx0VlBBVEg9XCQoVlBBVEgpOyBleHBvcnQgVlBBVEg7IFwkKFRPT0wpIFwkKEFSR1MpIC1pbml0IFwkKFNDUklQVFMpL0lOTk9WVVMvcnVuX3Byb3RvdHlwZS50Y2wgLWxvZyBcJChMT0cpL3Byb3RvdHlwZS5sb2cgLW92ZXJ3cml0ZSIKICAgICAgICAgICAgICAgICAgcHV0cyAkb3AxICJcdC9iaW4vdG91Y2ggXCQoVlBBVEgpL3Byb3RvdHlwZSIKICAgICAgICAgICAgICAgICAgcHV0cyAkb3AxICIiCiAgICAgICAgICAgICAgICAgIHB1dHMgJG9wMSAibW9kZWxfZ2VuIDogcHJvdG90eXBlIgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBwdXRzICRvcDEgIm1vZGVsX2dlbiA6IHNldHVwIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIHB1dHMgJG9wMSAiXHRWUEFUSD1cJChWUEFUSCk7IGV4cG9ydCBWUEFUSDsgXCQoVE9PTCkgXCQoQVJHUykgLWluaXQgXCQoU0NSSVBUUykvSU5OT1ZVUy9ydW5fbW9kZWxfZ2VuLnRjbCAtbG9nIFwkKExPRykvbW9kZWxfZ2VuLmxvZyAtb3ZlcndyaXRlIgogICAgICAgICAgICAgICBwdXRzICRvcDEgIlx0L2Jpbi90b3VjaCBcJChWUEFUSCkvbW9kZWxfZ2VuIgogICAgICAgICAgICAgICBwdXRzICRvcDEgIiIKICAgICAgICAgICAgICAgcHV0cyAkb3AxICJwYXJ0aXRpb25fcGxhY2UgOiBtb2RlbF9nZW4iCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHB1dHMgJG9wMSAicGFydGl0aW9uX3BsYWNlIDogIHNldHVwIgogICAgICAgICAgICB9CiAgICAgICAgICAgIHB1dHMgJG9wMSAiXHRWUEFUSD1cJChWUEFUSCk7IGV4cG9ydCBWUEFUSDsgXCQoVE9PTCkgXCQoQVJHUykgLWluaXQgXCQoU0NSSVBUUykvSU5OT1ZVUy9ydW5fcGFydGl0aW9uX3BsYWNlLnRjbCAtbG9nIFwkKExPRykvcGFydGl0aW9uX3BsYWNlLmxvZyAtb3ZlcndyaXRlIgogICAgICAgICAgICBwdXRzICRvcDEgIlx0L2Jpbi90b3VjaCBcJChWUEFUSCkvcGFydGl0aW9uX3BsYWNlIgogICAgICAgICAgICBwdXRzICRvcDEgIiIKICAgICAgICAgICAgcHV0cyAkb3AxICJhc3NpZ25fcGluIDogIHBhcnRpdGlvbl9wbGFjZSIKICAgICAgICAgICAgcHV0cyAkb3AxICJcdFZQQVRIPVwkKFZQQVRIKTsgZXhwb3J0IFZQQVRIOyBcJChUT09MKSBcJChBUkdTKSAtaW5pdCBcJChTQ1JJUFRTKS9JTk5PVlVTL3J1bl9hc3NpZ25fcGluLnRjbCAtbG9nIFwkKExPRykvYXNzaWduX3Bpbi5sb2cgLW92ZXJ3cml0ZSIKICAgICAgICAgICAgcHV0cyAkb3AxICJcdC9iaW4vdG91Y2ggXCQoVlBBVEgpL2Fzc2lnbl9waW4iCiAgICAgICAgICAgIHB1dHMgJG9wMSAiIgogICAgICAgICAgICBwdXRzICRvcDEgInBhcnRpdGlvbiA6ICBhc3NpZ25fcGluIgogICAgICAgICAgICBwdXRzICRvcDEgIlx0VlBBVEg9XCQoVlBBVEgpOyBleHBvcnQgVlBBVEg7IFwkKFRPT0wpIFwkKEFSR1MpIC1pbml0IFwkKFNDUklQVFMpL0lOTk9WVVMvcnVuX3BhcnRpdGlvbi50Y2wgLWxvZyBcJChMT0cpL3BhcnRpdGlvbi5sb2cgLW92ZXJ3cml0ZSIKICAgICAgICAgICAgcHV0cyAkb3AxICJcdC9iaW4vdG91Y2ggXCQoVlBBVEgpL3BhcnRpdGlvbiIKICAgICAgICAgICAgcHV0cyAkb3AxICIiCiAgICAgICAgICAgIHB1dHMgJG9wMSAic2luZ2xlOiIKICAgICAgICAgICAgcHV0cyAkb3AxICJcdEBcJChNQUtFKSBUQVJHRVQ9c2luZ2xlIEZGX1NUT1A9XCQoRkZfU1RPUCkiCiAgICAgICAgICAgIHB1dHMgJG9wMSAiIgogICAgICAgICAgICBwdXRzICRvcDEgImRlYnVnXyU6IgogICAgICAgICAgICBwdXRzICRvcDEgIlx0ZXhwb3J0IFNURVA9XCQqIDsgVlBBVEg9XCQoVlBBVEgpOyBleHBvcnQgVlBBVEg7IFwkKFRPT0wpIC1pbml0IFwkKFNDUklQVFMpL0lOTk9WVVMvcnVuX2RlYnVnLnRjbCAtbG9nIFwkKExPRykvXCRALmxvZyAtd2luIFwkKEFSR1M6LW5vd2luPSkiCiAgICAgICAgICAgIHB1dHMgJG9wMSAiIgogICAgICAgICAgICBwdXRzICRvcDEgInJlc2V0OiIKICAgICAgICAgICAgcHV0cyAkb3AxICJcdEAvYmluL3JtIC1mIFwkKFZQQVRIKS8qICR2YXJzKHBhcnRpdGlvbl9kaXIpLyovXCQoVlBBVEgpLyogJHZhcnMocGFydGl0aW9uX2RpcikvKi9cJChWUEFUSCkvLlJVTk5JTkciCiAgICAgICAgICAgIHB1dHMgJG9wMSAiIgogICAgICAgICAgICBwdXRzICRvcDEgInNldHVwOiIKICAgICAgICAgICAgcHV0cyAkb3AxICIjXHQvYmluL3JtIC1mciAkdmFycyhwYXJ0aXRpb25fZGlyKSBcJChWUEFUSCkgTE9HIgogICAgICAgICAgICBwdXRzICRvcDEgIlx0L2Jpbi9ta2RpciAtcCAgXCQoVlBBVEgpIExPRyIKICAgICAgICAgICAgcHV0cyAkb3AxICJcdC9iaW4vdG91Y2ggXCQoVlBBVEgpL3NldHVwIgogICAgICAgICAgICBjbG9zZSAkb3AxCiAgICAgICAgICAgIHNldCBvcDIgW29wZW4gTWFrZWZpbGUucGFzczIgd10KICAgICAgICAgICAgcHV0cyAkb3AyICJWRVJTSU9OPTE3LjEwLXAwMDNfMSIKICAgICAgICAgICAgcHV0cyAkb3AyICJWUEFUSD0uL21ha2UiCiAgICAgICAgICAgIHB1dHMgJG9wMiAiVE9PTD0kdmFycyhtYWtlX3Rvb2wpIgogICAgICAgICAgICBwdXRzICRvcDIgIlNDUklQVFM9JHZhcnMoc2NyaXB0X2RpcikiCiAgICAgICAgICAgIHB1dHMgJG9wMiAiTE9HPSR2YXJzKGxvZ19kaXIpIgogICAgICAgICAgICBwdXRzICRvcDIgIkFSR1M9JHZhcnMobWFrZV90b29sX2FyZ3MpIgogICAgICAgICAgICBwdXRzICRvcDIgIlBBUkFMTEVMPS1qMiIKICAgICAgICAgICAgcHV0cyAkb3AyICJTVUJNSVQ9XCJcIiIKICAgICAgICAgICAgcHV0cyAkb3AyICJUQVJHRVQ9c2lnbm9mZiIKICAgICAgICAgICAgcHV0cyAkb3AyICJGRl9TVE9QPXNpZ25vZmYiCiAgICAgICAgICAgIHB1dHMgJG9wMiAiU1RFUFMgPSBbZm9ybWF0ICJ2ZXJzaW9uIHNldHVwICVzIGRvX2NsZWFudXAiICRzdGVwc10iCiAgICAgICAgICAgIHB1dHMgJG9wMiAiIgojICAgICAgICAgICAgcHV0cyAkb3AyICJUT1A9YC9iaW4vZ3JlcCBcIl5zZXQgdmFycyhkZXNpZ24pXCIgJHZhcnMoc2V0dXBfdGNsKSB8IC9iaW4vYXdrICcgeyBwcmludGYoXCIlc1xcblwiLFwkXCQzKSB9ICdgIgogICAgICAgICAgICBwdXRzICRvcDIgIlRPUD0kdmFycyhkZXNpZ24pIgogICAgICAgICAgICBwdXRzICRvcDIgIiIKICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9mbGV4aWxtKX0gewogICAgICAgICAgICAgICBwdXRzICRvcDIgImFsbDogc2V0dXAgcmVidWRnZXQgYmxvY2tzLlwkKFRBUkdFVCkgdG9wLlwkKFRBUkdFVCkgYXNzZW1ibGUiCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHB1dHMgJG9wMiAiYWxsOiBzZXR1cCByZWJ1ZGdldCBibG9ja3MuXCQoVEFSR0VUKSB0b3AuXCQoVEFSR0VUKSBhc3NlbWJsZSIKICAgICAgICAgICAgfQogICAgICAgICAgICBwdXRzICRvcDIgIiIKICAgICAgICAgICAgcHV0cyAkb3AyICJoZWxwOiIKICAgICAgICAgICAgcHV0cyAkb3AyICJcdEBlY2hvIFwiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XCIiCiAgICAgICAgICAgIHB1dHMgJG9wMiAiXHRAZWNobyBcIiAgICAgICAgICAgXCQoVkVSU0lPTikgIEZvdW5kYXRpb24gRmxvd3NcIiIKICAgICAgICAgICAgcHV0cyAkb3AyICJcdEBlY2hvIFwiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XCIiCiAgICAgICAgICAgIHB1dHMgJG9wMiAiXHRAZWNobyBcIiBNYWtlZmlsZSBUYXJnZXRzXCIiCiAgICAgICAgICAgIHB1dHMgJG9wMiAiXHRAZWNobyBcIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVwiIgogICAgICAgICAgICBwdXRzICRvcDIgIlx0QGVjaG8gXCIgICAgICAgICAgICAgIGFsbCA6IFJ1biBjb21wbGV0ZSBmbG93IChkZWZhdWx0KVwiIgogICAgICAgICAgICBpZiB7JHZhcnMoZW5hYmxlX2ZsZXhpbG0pfSB7CiAgICAgICAgICAgICAgIHB1dHMgJG9wMiAiXHRAZWNobyBcIiAgICAgICAgIHJlYnVkZ2V0IDogUmVidWRnZXQgZGVzaWduXCIiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHV0cyAkb3AyICJcdEBlY2hvIFwiICBibG9ja3MuPHRhcmdldD4gOiBJbXBsZW1lbnQgYmxvY2tzXCIiCiAgICAgICAgICAgIHB1dHMgJG9wMiAiXHRAZWNobyBcIiAgICAgICAgIGFzc2VtYmxlIDogQXNzZW1ibGUgZGVzaWduXCIiCiAgICAgICAgICAgIHB1dHMgJG9wMiAiXHRAZWNobyBcIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVwiIgogICAgICAgICAgICBwdXRzICRvcDIgIlx0QGVjaG8gXCIgTWFrZWZpbGUgT3B0aW9uc1wiIgogICAgICAgICAgICBwdXRzICRvcDIgIlx0QGVjaG8gXCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cIiIKICAgICAgICAgICAgcHV0cyAkb3AyICJcdEBlY2hvIFwiICAgVlBBVEggIDogTWFrZSBkaXJlY3RvcnkgICAgIChkZWZhdWx0IG1ha2UpXCIiCiAgICAgICAgICAgIHB1dHMgJG9wMiAiXHRAZWNobyBcIiAgU1VCTUlUICA6IExTRiBsYXVuY2ggY29tbWFuZCAoZGVmYXVsdCAnJylcIiIKICAgICAgICAgICAgcHV0cyAkb3AyICJcdEBlY2hvIFwiIFBBUkFMTEVMIDogTnVtYmVyIG9mIG1hY2hpbmVzIChkZWZhdWx0IC1qMilcIiIKICAgICAgICAgICAgaWYgeyR2YXJzKG5vdnVzKX0gewogICAgICAgICAgICAgICBwdXRzICRvcDIgIlx0QGVjaG8gXCIgICAgVE9PTCAgOiBJTk5PVlVTIGV4ZWN1dGFibGUgKGRlZmF1bHQgaW5ub3Z1cylcIiIKICAgICAgICAgICAgICAgcHV0cyAkb3AyICJcdEBlY2hvIFwiICAgIEFSR1MgIDogSU5OT1ZVUyBhcmd1bWVudHMgIChkZWZhdWx0IC1ub3Z1c191aSAtNjQpXCIiCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHB1dHMgJG9wMiAiXHRAZWNobyBcIiAgICBUT09MICA6IElOTk9WVVMgZXhlY3V0YWJsZSAgICAgKGRlZmF1bHQgaW5ub3Z1cylcIiIKICAgICAgICAgICAgICAgcHV0cyAkb3AyICJcdEBlY2hvIFwiICAgIEFSR1MgIDogSU5OT1ZVUyBhcmd1bWVudHMgICAgICAoZGVmYXVsdCAtbm93aW4gLTY0KVwiIgogICAgICAgICAgICB9CiAgICAgICAgICAgIHB1dHMgJG9wMiAiXHRAZWNobyBcIiBTQ1JJUFRTICA6IFNjcmlwdCBkaXJlY3RvcnkgICAoZGVmYXVsdCAkdmFycyhzY3JpcHRfZGlyKSlcIiIKICAgICAgICAgICAgcHV0cyAkb3AyICJcdEBlY2hvIFwiICAgICBMT0cgIDogTG9nZmlsZSBkaXJlY3RvcnkgIChkZWZhdWx0ICR2YXJzKGxvZ19kaXIpKVwiIgogICAgICAgICAgICBwdXRzICRvcDIgIlx0QGVjaG8gXCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cIiIKICAgICAgICAgICAgcHV0cyAkb3AyICIiCiMgICAgICAgICAgICBwdXRzICRvcDIgImZsb3c6ICR2YXJzKGNvbmZpZ19maWxlcykiCiMgICAgICAgICAgICBwdXRzICRvcDIgIlx0ZXhlY3V0ZV9zdHJpbmciCiMgICAgICAgICAgICBwdXRzICRvcDIgIlx0QC9iaW4vdG91Y2ggXCQoVlBBVEgpL1wkQCIKICAgICAgICAgICAgcHV0cyAkb3AyICJhc3NlbWJsZTogdG9wLlwkKFRBUkdFVCkiCiAgICAgICAgICAgIHB1dHMgJG9wMiAiXHRWUEFUSD1cJChWUEFUSCk7IGV4cG9ydCBWUEFUSDsgXCQoVE9PTCkgXCQoQVJHUykgLWluaXQgXCQoU0NSSVBUUykvSU5OT1ZVUy9ydW5fYXNzZW1ibGUudGNsIC1sb2cgXCQoTE9HKS9hc3NlbWJsZS5sb2cgLW92ZXJ3cml0ZSIKICAgICAgICAgICAgcHV0cyAkb3AyICJcdC9iaW4vdG91Y2ggXCQoVlBBVEgpL2Fzc2VtYmxlIgogICAgICAgICAgICBwdXRzICRvcDIgIiIKICAgICAgICAgICAgcHV0cyAkb3AyICJ0b3AuXCQoVEFSR0VUKSA6IGJsb2Nrcy5cJChUQVJHRVQpIgogICAgICAgICAgICBwdXRzICRvcDIgIlx0Y2QgJHZhcnMocGFydGl0aW9uX2Rpcl9wYXNzMikvXCQoVE9QKTsgXCQoTUFLRSkgLWYgTWFrZWZpbGUgRkZfU1RPUD1cJChGRl9TVE9QKSBcJChUQVJHRVQpICIKICAgICAgICAgICAgcHV0cyAkb3AyICJcdC9iaW4vdG91Y2ggXCQoVlBBVEgpL1wkQCIKICAgICAgICAgICAgcHV0cyAkb3AyICIiCiAgICAgICAgICAgIHB1dHMgJG9wMiAiYmxvY2tzLlwkKFRBUkdFVCkgOiByZWJ1ZGdldCIKICAgICAgICAgICAgcHV0cyAkb3AyICJcdGNkICR2YXJzKHBhcnRpdGlvbl9kaXJfcGFzczIpOyBWUEFUSD1cJChWUEFUSCk7IGV4cG9ydCBWUEFUSDsgXCQoTUFLRSkgXCQoUEFSQUxMRUwpIGJsb2NrcyBGRl9TVE9QPVwkKEZGX1NUT1ApIFRBUkdFVD1cJChUQVJHRVQpIgogICAgICAgICAgICBwdXRzICRvcDIgIlx0L2Jpbi90b3VjaCBcJChWUEFUSCkvXCRAIgogICAgICAgICAgICBwdXRzICRvcDIgIiIKICAgICAgICAgICAgcHV0cyAkb3AxICJyZWJ1ZGdldCA6IHRvcC5jdHMiCiAgICAgICAgICAgIHB1dHMgJG9wMSAiXHRWUEFUSD1cJChWUEFUSCk7IGV4cG9ydCBWUEFUSDsgXCQoVE9PTCkgXCQoQVJHUykgLWluaXQgXCQoU0NSSVBUUykvSU5OT1ZVUy9ydW5fcmVidWRnZXQudGNsIC1sb2cgXCQoTE9HKS9yZWJ1ZGdldC5sb2cgLW92ZXJ3cml0ZSIKICAgICAgICAgICAgcHV0cyAkb3AxICJcdC9iaW4vdG91Y2ggXCQoVlBBVEgpL3JlYnVkZ2V0IgogICAgICAgICAgICBwdXRzICRvcDEgIiIKICAgICAgICAgICAgcHV0cyAkb3AyICJzaW5nbGU6IgogICAgICAgICAgICBwdXRzICRvcDIgIlx0QFwkKE1BS0UpIFRBUkdFVD1zaW5nbGUgRkZfU1RPUD1cJChGRl9TVE9QKSIKICAgICAgICAgICAgcHV0cyAkb3AyICIiCiAgICAgICAgICAgIHB1dHMgJG9wMiAiZGVidWdfJToiCiAgICAgICAgICAgIHB1dHMgJG9wMiAiXHRleHBvcnQgU1RFUD1cJCogOyBWUEFUSD1cJChWUEFUSCk7IGV4cG9ydCBWUEFUSDsgXCQoVE9PTCkgLWluaXQgXCQoU0NSSVBUUykvSU5OT1ZVUy9ydW5fZGVidWcudGNsIC1sb2cgXCQoTE9HKS9cJEAubG9nIC13aW4gXCQoQVJHUzotbm93aW49KSIKICAgICAgICAgICAgcHV0cyAkb3AyICIiCiAgICAgICAgICAgIHB1dHMgJG9wMiAicmVzZXQ6IgogICAgICAgICAgICBwdXRzICRvcDIgIlx0QC9iaW4vcm0gLWYgXCQoVlBBVEgpLyogJHZhcnMocGFydGl0aW9uX2Rpcl9wYXNzMikvKi9cJChWUEFUSCkvKiAkdmFycyhwYXJ0aXRpb25fZGlyX3Bhc3MyKS8qL1wkKFZQQVRIKS8uUlVOTklORyIKICAgICAgICAgICAgcHV0cyAkb3AyICIiCiAgICAgICAgICAgIHB1dHMgJG9wMiAic2V0dXA6IgogICAgICAgICAgICBwdXRzICRvcDIgIiNcdC9iaW4vcm0gLWZyICR2YXJzKHBhcnRpdGlvbl9kaXJfcGFzczIpIFwkKFZQQVRIKSBMT0ciCiAgICAgICAgICAgIHB1dHMgJG9wMiAiXHQvYmluL21rZGlyIC1wICBcJChWUEFUSCkgTE9HIgogICAgICAgICAgICBjbG9zZSAkb3AyCgogICAgICAgICAgICBwdXRzICRvcCAiaW5jbHVkZSBNYWtlZmlsZS5wYXNzMSIKICAgICAgICAgICAgcHV0cyAkb3AgImluY2x1ZGUgTWFrZWZpbGUucGFzczIiCgogICAgICAgICAgICBpZiB7JHZhcnMoZ2VuZXJhdGVfZmxvd19zdGVwcykgJiYgW2luZm8gZXhpc3RzIHZhcnMoZmxvd19zdGVwcyldfSB7CiAgICAgICAgICAgICAgIHNldCBmcDEgW29wZW4gJHZhcnMoc2NyaXB0X2RpcikvZmxvd19jb25maWcudGNsIHddCiAgICAgICAgICAgICAgIHNldCBmcDIgW29wZW4gJHZhcnMoc2NyaXB0X2RpcikvZmxvd19zdGVwcy50Y2wgd10KICAgICAgICAgICAgICAgcHV0cyAkZnAxICJzZXRfZGIgZmxvd19kYXRhYmFzZV9kaXJlY3RvcnkgJHZhcnMoZGJzX2RpcikiCiAgICAgICAgICAgICAgIHB1dHMgJGZwMSAic2V0X2RiIGZsb3dfcmVwb3J0X2RpcmVjdG9yeSAkdmFycyhycHRfZGlyKSIKICAgICAgICAgICAgICAgcHV0cyAkZnAxICJzZXRfZGIgZmxvd19sb2dfZGlyZWN0b3J5ICR2YXJzKGxvZ19kaXIpIgogICAgICAgICAgICAgICBwdXRzICRmcDEgIlxuc2V0X2RiIGZsb3dfbWFpbF90byBbZXhlYyB3aG9hbWldIgogICAgICAgICAgICAgICBwdXRzICRmcDEgInNldF9kYiBmbG93X21haWxfb25fZXJyb3IgdHJ1ZVxuIgojICAgICAgICAgICAgICAgcHV0cyAkZnAgJHZhcnMoZmxvd19zdGVwcykKICAgICAgICAgICAgICAgZm9yZWFjaCBwIFtjb25jYXQgJHZhcnMocGFydGl0aW9uX2xpc3QpICR2YXJzKGRlc2lnbildIHsKIyAgICAgICAgICAgICAgICAgIHNldCB2YXJzKGZsb3dfbmFtZSkgJHAKICAgICAgICAgICAgICAgICAgaWYge1tmaWxlIGV4aXN0cyAkdmFycyhwYXJ0aXRpb25fZGlyKS8kcC8kdmFycyhzY3JpcHRfZGlyKS8uaGllcnN0ZXBzLnRjbF19IHsKIyAgICAgICAgICAgICAgICAgICAgIHB1dHMgJGZwMiAiIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICRwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiAKICAgICAgICAgICAgICAgICAgICAgc2V0IGlwIFtvcGVuICR2YXJzKHBhcnRpdGlvbl9kaXIpLyRwLyR2YXJzKHNjcmlwdF9kaXIpLy5oaWVyc3RlcHMudGNsIHJdCiAgICAgICAgICAgICAgICAgICAgIGlmIHskcCAhPSAkdmFycyhkZXNpZ24pfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIHtbZ2V0cyAkaXAgbGluZV0+PTB9IHsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dHMgJGZwMiAkbGluZSAKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSB7W2dldHMgJGlwIGxpbmVdPj0wfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHtbcmVnZXhwICJjcmVhdGVfZmxvd19zdGVwIC1uYW1lIHRvcF8iICRsaW5lXX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRzICRmcDIgJGxpbmUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIHtbZ2V0cyAkaXAgbGluZV0+PTB9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYge1tyZWdleHAgIl5cfSIgJGxpbmVdfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dHMgJGZwMiAkbGluZSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0cyAkZnAyICRsaW5lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiB7W2ZpbGUgZXhpc3RzICR2YXJzKHBhcnRpdGlvbl9kaXIpLyRwL3J1bl9mbG93LnRjbF19IHsKICAgICAgICAgICAgICAgICAgICAgc2V0IGlwIFtvcGVuICR2YXJzKHBhcnRpdGlvbl9kaXIpLyRwL3J1bl9mbG93LnRjbCByXQogICAgICAgICAgICAgICAgICAgICB3aGlsZSB7W2dldHMgJGlwIGxpbmVdPj0wfSB7IAogICAgICAgICAgICAgICAgICAgICAgICBwdXRzICRmcCAkbGluZSAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhwYXJ0aXRpb25fZGlyX3Bhc3MyKV0gJiYgW2ZpbGUgZXhpc3RzICR2YXJzKHBhcnRpdGlvbl9kaXJfcGFzczIpLyRwL3J1bl9mbG93LnRjbF19IHsKICAgICAgICAgICAgICAgICAgICAgc2V0IGlwIFtvcGVuICR2YXJzKHBhcnRpdGlvbl9kaXJfcGFzczIpLyRwL3J1bl9mbG93LnRjbCByXQogICAgICAgICAgICAgICAgICAgICB3aGlsZSB7W2dldHMgJGlwIGxpbmVdPj0wfSB7IAogICAgICAgICAgICAgICAgICAgICAgICBwdXRzICRmcCAkbGluZSAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgcHV0cyAkZnAyICIjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSElFUiBTVEVQUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgCiAgICAgICAgICAgICAgIHB1dHMgJGZwMiAkdmFycyhmbG93X3N0ZXBzLGhpZXIpCiAgICAgICAgICAgICAgIHNldCB2YXJzKGZsb3dfbmFtZSkgJHZhcnMoZGVzaWduKQogICAgICAgICAgICAgICBzZXQgYXN0ZXBzIFtGRjo6YWRqdXN0X3N0ZXBzXQojICAgICAgICAgICAgICAgcHV0cyAkZnAgImNyZWF0ZV9mbG93IFxcXG4gICAtbmFtZSAkdmFycyhmbG93X25hbWUpXFxcbiAgIC10b29sICR2YXJzKG1ha2VfdG9vbClcXFxuICAgLXRvb2xfb3B0aW9ucyB7LWxvZyAkdmFycyhmbG93X25hbWUpLmxvZ31cXFxuICAgXFtsaXN0ICRhc3RlcHNcXVxuIgogICAgICAgICAgICAgICBzZXQgcHN0ZXBzIFtsaXN0XQogICAgICAgICAgICAgICBzZXQgYnN0ZXBzIFtsaXN0XQogICAgICAgICAgICAgICBmb3JlYWNoIHMgJGFzdGVwcyB7CiAgICAgICAgICAgICAgICAgIGlmIHsoW2xzZWFyY2ggJHZhcnMoZnN0ZXBzKSAkc10gIT0gLTEpICYmICgkcyAhPSAiYXNzZW1ibGUiKX0gewogICAgICAgICAgICAgICAgICAgICBsYXBwZW5kIGJzdGVwcyAkcwogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZiB7JHMgIT0gImFzc2VtYmxlIn0gewogICAgICAgICAgICAgICAgICAgICAgICBsYXBwZW5kIHBzdGVwcyAkcwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBzZXQgdmFycyhmbG93X25hbWUpIGZpbmFsX2Fzc2VtYmx5CiAgICAgICAgICAgICAgIHB1dHMgJGZwICJjcmVhdGVfZmxvdyBcXFxuICAgLW5hbWUgJHZhcnMoZmxvd19uYW1lKVxcXG4gICAtdG9vbCAkdmFycyhtYWtlX3Rvb2wpXFxcbiAgIC10b29sX29wdGlvbnMgey1sb2cgJHZhcnMoZmxvd19uYW1lKS5sb2d9XFxcbiAgIFxbbGlzdCBhc3NlbWJsZVxdXG4iCiAgICAgICAgICAgICAgIHNldCB2YXJzKGZsb3dfbmFtZSkgcGFydGl0aW9uaW5nCiAgICAgICAgICAgICAgIHB1dHMgJGZwICJjcmVhdGVfZmxvdyBcXFxuICAgLW5hbWUgJHZhcnMoZmxvd19uYW1lKVxcXG4gICAtdG9vbCAkdmFycyhtYWtlX3Rvb2wpXFxcbiAgIC10b29sX29wdGlvbnMgey1sb2cgJHZhcnMoZmxvd19uYW1lKS5sb2d9XFxcbiAgIFxbbGlzdCAkcHN0ZXBzXF1cbiIKIyAgICAgICAgICAgICAgIHB1dHMgJGZwICJydW5fZmxvdyAtZmxvdyAkdmFycyhmbG93X25hbWUpIgogICAgICAgICAgICAgICB1bnNldCB2YXJzKGZsb3dfc3RlcHMpCiMgICAgICAgICAgICAgICBzZXQgdmFycyhmbG93X25hbWUpICR2YXJzKGRlc2lnbikKIyAgICAgICAgICAgICAgIHB1dHMgJGZwICJjcmVhdGVfZmxvdyBcXFxuICAgLW5hbWUgJHZhcnMoZmxvd19uYW1lKVxcXG4gICAtdG9vbCAkdmFycyhtYWtlX3Rvb2wpXFxcbiAgIC10b29sX29wdGlvbnMgey1sb2cgJHZhcnMoZmxvd19uYW1lKS5sb2d9XFxcbiAgIFxbbGlzdCAkYnN0ZXBzXF1cbiIKICAgICAgICAgICAgICAgaWYge1tmaWxlIGV4aXN0cyAkdmFycyhjd2QpLy5wbHVnaW5zXX0gewogICAgICAgICAgICAgICAgICBzZXQgaXAgW29wZW4gJHZhcnMoY3dkKS8ucGx1Z2lucyByXQogICAgICAgICAgICAgICAgICB3aGlsZSB7W2dldHMgJGlwIGxpbmVdPj0wfSB7IAogICAgICAgICAgICAgICAgICAgICBwdXRzICRmcDEgJGxpbmUgCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgY2xvc2UgJGlwCiAgICAgICAgICAgICAgICAgIGZpbGUgZGVsZXRlICR2YXJzKGN3ZCkvLnBsdWdpbnMgCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgY2xvc2UgJGZwCiAgICAgICAgICAgICAgIGNsb3NlICRmcDEKICAgICAgICAgICAgICAgY2xvc2UgJGZwMgogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgImZsZXhpbG0iIHsKICAgICAgICAgICAgcHV0cyAkb3AgIlZFUlNJT049MTcuMTAtcDAwM18xIgogICAgICAgICAgICBwdXRzICRvcCAiVlBBVEg9Li9tYWtlIgogICAgICAgICAgICBwdXRzICRvcCAiVE9PTD0kdmFycyhtYWtlX3Rvb2wpIgogICAgICAgICAgICBwdXRzICRvcCAiU0NSSVBUUz1GRiIKICAgICAgICAgICAgcHV0cyAkb3AgIkxPRz1MT0ciCiAgICAgICAgICAgIHB1dHMgJG9wICJBUkdTPSR2YXJzKG1ha2VfdG9vbF9hcmdzKSIKICAgICAgICAgICAgcHV0cyAkb3AgIlBBUkFMTEVMPS1qMiIKICAgICAgICAgICAgcHV0cyAkb3AgIlNVQk1JVD1cIlwiIgogICAgICAgICAgICBwdXRzICRvcCAiVEFSR0VUPWFzc2VtYmxlIgogICAgICAgICAgICBwdXRzICRvcCAiRkZfU1RPUD1hc3NlbWJsZSIKICAgICAgICAgICAgcHV0cyAkb3AgIlNURVBTID0gdmVyc2lvbiBzZXR1cCBkb19jbGVhbnVwIgogICAgICAgICAgICBwdXRzICRvcCAiIgojICAgICAgICAgICAgcHV0cyAkb3AgIlRPUD1gL2Jpbi9ncmVwIFwiXnNldCB2YXJzKGRlc2lnbilcIiAkdmFycyhzZXR1cF90Y2wpIHwgL2Jpbi9hd2sgJyB7IHByaW50ZihcIiVzXFxuXCIsXCRcJDMpIH0gJ2AiCiAgICAgICAgICAgIHB1dHMgJG9wICJUT1A9JHZhcnMoZGVzaWduKSIKICAgICAgICAgICAgcHV0cyAkb3AgIiIKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHVzZV9mbGV4bW9kZWxzKV0gJiYgJHZhcnModXNlX2ZsZXhtb2RlbHMpfSB7CiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhmbGV4bW9kZWxfcHJvdG90eXBlKV0gJiYgJHZhcnMoZmxleG1vZGVsX3Byb3RvdHlwZSl9IHsKICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgImFsbDogc2V0dXAgcHJvdG90eXBlIG1vZGVsX2dlbiBwYXJ0aXRpb25fcGxhY2UgYXNzaWduX3BpbiBwYXJ0aXRpb24gYmxvY2tzLnByZWN0cyB0b3AucHJlY3RzIGFzc2VtYmxlX2ZsZXhpbG0gYmxvY2tzLnNpZ25vZmYgdG9wLnNpZ25vZmYgYXNzZW1ibGUiCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHB1dHMgJG9wICJhbGw6IHNldHVwIG1vZGVsX2dlbiBwYXJ0aXRpb25fcGxhY2UgYXNzaWduX3BpbiBwYXJ0aXRpb24gYmxvY2tzLnByZWN0cyB0b3AucHJlY3RzIGFzc2VtYmxlX2ZsZXhpbG0gYmxvY2tzLnNpZ25vZmYgdG9wLnNpZ25vZmYgYXNzZW1ibGUiCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgcHV0cyAkb3AgImFsbDogc2V0dXAgcGFydGl0aW9uX3BsYWNlIGFzc2lnbl9waW4gcGFydGl0aW9uIGJsb2Nrcy5wcmVjdHMgdG9wLnByZWN0cyBhc3NlbWJsZV9mbGV4aWxtIGJsb2Nrcy5zaWdub2ZmIHRvcC5zaWdub2ZmIGFzc2VtYmxlIgogICAgICAgICAgICB9CgogICAgICAgICAgICBwdXRzICRvcCAiIgogICAgICAgICAgICBwdXRzICRvcCAiaGVscDoiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XCIiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiICAgICAgICAgICBcJChWRVJTSU9OKSAgRm91bmRhdGlvbiBGbG93c1wiIgogICAgICAgICAgICBwdXRzICRvcCAiXHRAZWNobyBcIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVwiIgogICAgICAgICAgICBwdXRzICRvcCAiXHRAZWNobyBcIiBNYWtlZmlsZSBUYXJnZXRzXCIiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XCIiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiICAgICAgICAgICAgICBhbGwgOiBSdW4gY29tcGxldGUgZmxvdyAoZGVmYXVsdClcIiIKICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHVzZV9mbGV4bW9kZWxzKV0gJiYgJHZhcnModXNlX2ZsZXhtb2RlbHMpfSB7CiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhmbGV4bW9kZWxfcHJvdG90eXBlKV0gJiYgJHZhcnMoZmxleG1vZGVsX3Byb3RvdHlwZSl9IHsKICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCIgICAgICAgIHByb3RvdHlwZSA6IEZsZXhtb2RlbCBwcm90b3R5cGVcIiIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBwdXRzICRvcCAiXHRAZWNobyBcIiAgICAgICAgbW9kZWxfZ2VuIDogR2VuZXJhdGUgZmxleG1vZGVsc1wiIgogICAgICAgICAgICB9CiAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiICBwYXJ0aXRpb25fcGxhY2UgOiBJbml0aWFsIHBsYWNlbWVudCAmIGZlZWR0aHJvdWdoXCIiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiICAgICAgIGFzc2lnbl9waW4gOiBQaW4gYXNzaWdubWVudFwiIgogICAgICAgICAgICBwdXRzICRvcCAiXHRAZWNobyBcIiAgICAgICAgcGFydGl0aW9uIDogUGFydGl0aW9uIGRlc2lnblwiIgogICAgICAgICAgICBwdXRzICRvcCAiXHRAZWNobyBcIiAgICAgYmxvY2sucHJlY3RzIDogSW1wbGVtZW50IGJsb2NrcyB0byBwcmVDVFMgYW5kIGdlbmVyYXRlIGZsZXhJbG1cIiIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCIgICAgICAgdG9wLnByZWN0cyA6IGZsZXhJbG0gcHJlY3RzIG9wdGltaXphdGlvbiBhbmQgZmxleElsbSBFQ09cIiIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCIgYXNzZW1ibGVfZmxleGlsbSA6IENoZWNrIGFzc2VtYmxlZCBwcmVDVFMgdGltaW5nXCIiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiICAgIGJsb2NrLnNpZ25vZmYgOiBpbXBsZW1lbnQgYmxvY2tzXCIiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiICAgICAgdG9wLnNpZ25vZmYgOiBpbXBsZW1lbnQgdG9wXCIiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiICAgICAgICAgYXNzZW1ibGUgOiBmaW5hbCBjaGlwIGFzc2VtYmx5XCIiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XCIiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiIE1ha2VmaWxlIE9wdGlvbnNcIiIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cIiIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCIgICBWUEFUSCAgOiBNYWtlIGRpcmVjdG9yeSAgICAgKGRlZmF1bHQgbWFrZSlcIiIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCIgIFNVQk1JVCAgOiBMU0YgbGF1bmNoIGNvbW1hbmQgKGRlZmF1bHQgJycpXCIiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiIFBBUkFMTEVMIDogTnVtYmVyIG9mIG1hY2hpbmVzIChkZWZhdWx0IC1qMilcIiIKICAgICAgICAgICAgaWYgeyR2YXJzKG5vdnVzKX0gewogICAgICAgICAgICAgICBwdXRzICRvcCAiXHRAZWNobyBcIiAgICBUT09MICA6IElOTk9WVVMgZXhlY3V0YWJsZSAoZGVmYXVsdCBpbm5vdnVzKVwiIgogICAgICAgICAgICAgICBwdXRzICRvcCAiXHRAZWNobyBcIiAgICBBUkdTICA6IElOTk9WVVMgYXJndW1lbnRzICAoZGVmYXVsdCAtbm92dXNfdWkgLTY0KVwiIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBwdXRzICRvcCAiXHRAZWNobyBcIiAgICBUT09MICA6IElOTk9WVVMgZXhlY3V0YWJsZSAgICAgKGRlZmF1bHQgaW5ub3Z1cylcIiIKICAgICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCIgICAgQVJHUyAgOiBJTk5PVlVTIGFyZ3VtZW50cyAgICAgIChkZWZhdWx0IC1ub3dpbiAtNjQpXCIiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCIgU0NSSVBUUyAgOiBTY3JpcHQgZGlyZWN0b3J5ICAgKGRlZmF1bHQgRkYpXCIiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdEBlY2hvIFwiICAgICBMT0cgIDogTG9nZmlsZSBkaXJlY3RvcnkgIChkZWZhdWx0IExPRylcIiIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0QGVjaG8gXCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cIiIKICAgICAgICAgICAgcHV0cyAkb3AgImFzc2VtYmxlOiB0b3Auc2lnbm9mZiIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0VlBBVEg9XCQoVlBBVEgpOyBleHBvcnQgVlBBVEg7IFwkKFRPT0wpIFwkKEFSR1MpIC1pbml0IFwkKFNDUklQVFMpL0lOTk9WVVMvcnVuX2Fzc2VtYmxlLnRjbCAtbG9nIFwkKExPRykvYXNzZW1ibGUubG9nIC1vdmVyd3JpdGUiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdC9iaW4vdG91Y2ggXCQoVlBBVEgpL2Fzc2VtYmxlIgogICAgICAgICAgICBwdXRzICRvcCAiIgogICAgICAgICAgICBwdXRzICRvcCAidG9wLnNpZ25vZmYgOiBibG9ja3Muc2lnbm9mZiIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0Y2QgUEFSVElUSU9OX1BSRUNUUy9cJChUT1ApOyBcJChNQUtFKSAtZiBNYWtlZmlsZSBGRl9TVE9QPXNpZ25vZmYgc2lnbm9mZiIKICAgICAgICAgICAgcHV0cyAkb3AgIgkvYmluL3RvdWNoIFwkKFZQQVRIKS9cJEAiCiAgICAgICAgICAgIHB1dHMgJG9wICIiCiAgICAgICAgICAgIHB1dHMgJG9wICJibG9ja3Muc2lnbm9mZiA6IGFzc2VtYmxlX2ZsZXhpbG0iCiAgICAgICAgICAgIHB1dHMgJG9wICJcdGNkIFBBUlRJVElPTl9QUkVDVFM7IFZQQVRIPVwkKFZQQVRIKTsgZXhwb3J0IFZQQVRIOyBcJChNQUtFKSBcJChQQVJBTExFTCkgYmxvY2tzIEZGX1NUT1A9c2lnbm9mZiBUQVJHRVQ9c2lnbm9mZiIKICAgICAgICAgICAgcHV0cyAkb3AgIgkvYmluL3RvdWNoIFwkKFZQQVRIKS9cJEAiCiAgICAgICAgICAgIHB1dHMgJG9wICIiCiAgICAgICAgICAgIHB1dHMgJG9wICJhc3NlbWJsZV9mbGV4aWxtIDogdG9wLnByZWN0cyIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0VlBBVEg9XCQoVlBBVEgpOyBleHBvcnQgVlBBVEg7IFwkKFRPT0wpIFwkKEFSR1MpIC1pbml0IFwkKFNDUklQVFMpL0lOTk9WVVMvcnVuX2Fzc2VtYmxlX2ZsZXhpbG0udGNsIC1sb2cgXCQoTE9HKS9hc3NlbWJsZV9mbGV4aWxtLmxvZyAtb3ZlcndyaXRlIgogICAgICAgICAgICBwdXRzICRvcCAiXHQvYmluL3RvdWNoIFwkKFZQQVRIKS9hc3NlbWJsZV9mbGV4aWxtIgogICAgICAgICAgICBwdXRzICRvcCAiIgogICAgICAgICAgICBwdXRzICRvcCAidG9wLnByZWN0cyA6IGJsb2Nrcy5wcmVjdHMiCiAgICAgICAgICAgIGlmIHskdmFycyhwbGFjZV9vcHRfZGVzaWduKX0gewogICAgICAgICAgICAgICBwdXRzICRvcCAiXHRjZCBQQVJUSVRJT04vXCQoVE9QKTsgXCQoTUFLRSkgLWYgTWFrZWZpbGUgRkZfU1RPUD1wbGFjZSBwbGFjZSAiCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHB1dHMgJG9wICJcdGNkIFBBUlRJVElPTi9cJChUT1ApOyBcJChNQUtFKSAtZiBNYWtlZmlsZSBGRl9TVE9QPXByZWN0cyBwcmVjdHMgIgogICAgICAgICAgICB9CiAgICAgICAgICAgIHB1dHMgJG9wICJcdC9iaW4vdG91Y2ggXCQoVlBBVEgpL1wkQCIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0L2Jpbi9jcCAtcmYgUEFSVElUSU9OX0ZMRVhJTE0vKiBQQVJUSVRJT05fUFJFQ1RTIgogICAgICAgICAgICBwdXRzICRvcCAiXHQvYmluL3JtIC1yZiBQQVJUSVRJT05fRkxFWElMTSIKICAgICAgICAgICAgcHV0cyAkb3AgIiIKICAgICAgICAgICAgcHV0cyAkb3AgImJsb2Nrcy5wcmVjdHMgOiBwYXJ0aXRpb24iCiAgICAgICAgICAgIGlmIHskdmFycyhwbGFjZV9vcHRfZGVzaWduKX0gewogICAgICAgICAgICAgICBwdXRzICRvcCAiXHRjZCBQQVJUSVRJT047IFZQQVRIPVwkKFZQQVRIKTsgZXhwb3J0IFZQQVRIOyBcJChNQUtFKSBcJChQQVJBTExFTCkgYmxvY2tzIEZGX1NUT1A9cGxhY2UgVEFSR0VUPXBsYWNlIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBwdXRzICRvcCAiXHRjZCBQQVJUSVRJT047IFZQQVRIPVwkKFZQQVRIKTsgZXhwb3J0IFZQQVRIOyBcJChNQUtFKSBcJChQQVJBTExFTCkgYmxvY2tzIEZGX1NUT1A9cHJlY3RzIFRBUkdFVD1wcmVjdHMiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHV0cyAkb3AgIlx0L2Jpbi90b3VjaCBcJChWUEFUSCkvXCRAIgogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnModXNlX2ZsZXhtb2RlbHMpXSAmJiAkdmFycyh1c2VfZmxleG1vZGVscyl9IHsKICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGZsZXhtb2RlbF9wcm90b3R5cGUpXSAmJiAkdmFycyhmbGV4bW9kZWxfcHJvdG90eXBlKX0gewogICAgICAgICAgICAgICAgICBwdXRzICRvcCAicHJvdG90eXBlIDogc2V0dXAiCiAgICAgICAgICAgICAgICAgIHB1dHMgJG9wICJcdFZQQVRIPVwkKFZQQVRIKTsgZXhwb3J0IFZQQVRIOyBcJChUT09MKSBcJChBUkdTKSAtaW5pdCBcJChTQ1JJUFRTKS9JTk5PVlVTL3J1bl9wcm90b3R5cGUudGNsIC1sb2cgXCQoTE9HKS9wcm90b3R5cGUubG9nIC1vdmVyd3JpdGUiCiAgICAgICAgICAgICAgICAgIHB1dHMgJG9wICJcdC9iaW4vdG91Y2ggXCQoVlBBVEgpL3Byb3RvdHlwZSIKICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgIiIKICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgIm1vZGVsX2dlbiA6IHByb3RvdHlwZSIKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgIm1vZGVsX2dlbiA6IHNldHVwIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIHB1dHMgJG9wICJcdFZQQVRIPVwkKFZQQVRIKTsgZXhwb3J0IFZQQVRIOyBcJChUT09MKSBcJChBUkdTKSAtaW5pdCBcJChTQ1JJUFRTKS9JTk5PVlVTL3J1bl9tb2RlbF9nZW4udGNsIC1sb2cgXCQoTE9HKS9tb2RlbF9nZW4ubG9nIC1vdmVyd3JpdGUiCiAgICAgICAgICAgICAgIHB1dHMgJG9wICJcdC9iaW4vdG91Y2ggXCQoVlBBVEgpL21vZGVsX2dlbiIKICAgICAgICAgICAgICAgcHV0cyAkb3AgIiIKICAgICAgICAgICAgICAgcHV0cyAkb3AgInBhcnRpdGlvbl9wbGFjZSA6IG1vZGVsX2dlbiIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgcHV0cyAkb3AgInBhcnRpdGlvbl9wbGFjZSA6ICBzZXR1cCIKICAgICAgICAgICAgfQogICAgICAgICAgICBwdXRzICRvcCAiXHRWUEFUSD1cJChWUEFUSCk7IGV4cG9ydCBWUEFUSDsgXCQoVE9PTCkgXCQoQVJHUykgLWluaXQgXCQoU0NSSVBUUykvSU5OT1ZVUy9ydW5fcGFydGl0aW9uX3BsYWNlLnRjbCAtbG9nIFwkKExPRykvcGFydGl0aW9uX3BsYWNlLmxvZyAtb3ZlcndyaXRlIgogICAgICAgICAgICBwdXRzICRvcCAiXHQvYmluL3RvdWNoIFwkKFZQQVRIKS9wYXJ0aXRpb25fcGxhY2UiCiAgICAgICAgICAgIHB1dHMgJG9wICIiCiAgICAgICAgICAgIHB1dHMgJG9wICJhc3NpZ25fcGluIDogIHBhcnRpdGlvbl9wbGFjZSIKICAgICAgICAgICAgcHV0cyAkb3AgIglWUEFUSD1cJChWUEFUSCk7IGV4cG9ydCBWUEFUSDsgXCQoVE9PTCkgXCQoQVJHUykgLWluaXQgXCQoU0NSSVBUUykvSU5OT1ZVUy9ydW5fYXNzaWduX3Bpbi50Y2wgLWxvZyBcJChMT0cpL2Fzc2lnbl9waW4ubG9nIC1vdmVyd3JpdGUiCiAgICAgICAgICAgIHB1dHMgJG9wICIJL2Jpbi90b3VjaCBcJChWUEFUSCkvYXNzaWduX3BpbiIKICAgICAgICAgICAgcHV0cyAkb3AgIiIKICAgICAgICAgICAgcHV0cyAkb3AgInBhcnRpdGlvbiA6ICBhc3NpZ25fcGluIgogICAgICAgICAgICBwdXRzICRvcCAiXHRWUEFUSD1cJChWUEFUSCk7IGV4cG9ydCBWUEFUSDsgXCQoVE9PTCkgXCQoQVJHUykgLWluaXQgXCQoU0NSSVBUUykvSU5OT1ZVUy9ydW5fcGFydGl0aW9uLnRjbCAtbG9nIFwkKExPRykvcGFydGl0aW9uLmxvZyAtb3ZlcndyaXRlIgogICAgICAgICAgICBwdXRzICRvcCAiCS9iaW4vdG91Y2ggXCQoVlBBVEgpL3BhcnRpdGlvbiIKICAgICAgICAgICAgcHV0cyAkb3AgIiIKICAgICAgICAgICAgcHV0cyAkb3AgInNpbmdsZToiCiAgICAgICAgICAgIHB1dHMgJG9wICJcdEBcJChNQUtFKSBUQVJHRVQ9c2luZ2xlIEZGX1NUT1A9c2lnbm9mZiIKICAgICAgICAgICAgcHV0cyAkb3AgIiIKICAgICAgICAgICAgcHV0cyAkb3AgImRlYnVnXyU6IgogICAgICAgICAgICBwdXRzICRvcCAiXHRleHBvcnQgU1RFUD1cJCogOyBWUEFUSD1cJChWUEFUSCk7IGV4cG9ydCBWUEFUSDsgXCQoVE9PTCkgLWluaXQgXCQoU0NSSVBUUykvSU5OT1ZVUy9ydW5fZGVidWcudGNsIC1sb2cgXCQoTE9HKS9cJEAubG9nIC13aW4gXCQoQVJHUzotbm93aW49KSIKICAgICAgICAgICAgcHV0cyAkb3AgIiIKICAgICAgICAgICAgcHV0cyAkb3AgInJlc2V0OiIKICAgICAgICAgICAgcHV0cyAkb3AgIlx0QC9iaW4vcm0gLWYgXCQoVlBBVEgpLyogUEFSVElUSU9OLyovXCQoVlBBVEgpLyogUEFSVElUSU9OLyovXCQoVlBBVEgpLy5SVU5OSU5HIgogICAgICAgICAgICBwdXRzICRvcCAiXHRAL2Jpbi9ybSAtZiBcJChWUEFUSCkvKiBQQVJUSVRJT05fUFJFQ1RTLyovXCQoVlBBVEgpLyogUEFSVElUSU9OX1BSRUNUUy8qL1wkKFZQQVRIKS8uUlVOTklORyIKICAgICAgICAgICAgcHV0cyAkb3AgIiIKICAgICAgICAgICAgcHV0cyAkb3AgInNldHVwOiIKICAgICAgICAgICAgcHV0cyAkb3AgIiNcdC9iaW4vcm0gLWZyIFBBUlRJVElPTiBcJChWUEFUSCkgTE9HIgogICAgICAgICAgICBwdXRzICRvcCAiXHQvYmluL21rZGlyIC1wICBcJChWUEFUSCkgTE9HIgogICAgICAgICAgICBwdXRzICRvcCAiXHQvYmluL3RvdWNoIFwkKFZQQVRIKS9zZXR1cCIKCiAgICAgICAgICAgIGlmIHskdmFycyhnZW5lcmF0ZV9mbG93X3N0ZXBzKSAmJiBbaW5mbyBleGlzdHMgdmFycyhmbG93X3N0ZXBzKV19IHsKICAgICAgICAgICAgICAgc2V0IGZwIFtvcGVuIHJ1bl9mbG93LnRjbCB3XQogICAgICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHJ1bl9mbG93KV19IHsKIyAgICAgICAgICAgICAgICAgIHB1dHMgJGZwICJzb3VyY2UgJHZhcnMoc2NyaXB0X2RpcikvZmxvd19zdGVwcy50Y2wiCiAgICAgICAgICAgICAgICAgIHB1dHMgJGZwICJzb3VyY2UgJHZhcnMoc2NyaXB0X2RpcikvZmxvd19jb25maWcudGNsIgogICAgICAgICAgICAgICAgICBzZXQgdmFycyhydW5fZmxvdykgRE9ORQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIHNldCBmcDEgW29wZW4gJHZhcnMoc2NyaXB0X2RpcikvZmxvd19jb25maWcudGNsIHddCiAgICAgICAgICAgICAgIHNldCBmcDIgW29wZW4gJHZhcnMoc2NyaXB0X2RpcikvZmxvd19zdGVwcy50Y2wgd10KICAgICAgICAgICAgICAgcHV0cyAkZnAxICJzZXRfZGIgZmxvd19kYXRhYmFzZV9kaXJlY3RvcnkgJHZhcnMoZGJzX2RpcikiCiAgICAgICAgICAgICAgIHB1dHMgJGZwMSAic2V0X2RiIGZsb3dfcmVwb3J0X2RpcmVjdG9yeSAkdmFycyhycHRfZGlyKSIKICAgICAgICAgICAgICAgcHV0cyAkZnAxICJzZXRfZGIgZmxvd19sb2dfZGlyZWN0b3J5ICR2YXJzKGxvZ19kaXIpIgogICAgICAgICAgICAgICBwdXRzICRmcDEgIlxuc2V0X2RiIGZsb3dfbWFpbF90byBbZXhlYyB3aG9hbWldIgogICAgICAgICAgICAgICBwdXRzICRmcDEgInNldF9kYiBmbG93X21haWxfb25fZXJyb3IgdHJ1ZVxuIgojICAgICAgICAgICAgICAgcHV0cyAkZnAgJHZhcnMoZmxvd19zdGVwcykKICAgICAgICAgICAgICAgZm9yZWFjaCBwIFtjb25jYXQgJHZhcnMocGFydGl0aW9uX2xpc3QpICR2YXJzKGRlc2lnbildIHsKIyAgICAgICAgICAgICAgICAgIHNldCB2YXJzKGZsb3dfbmFtZSkgJHAKICAgICAgICAgICAgICAgICAgaWYge1tmaWxlIGV4aXN0cyAkdmFycyhwYXJ0aXRpb25fZGlyKS8kcC8kdmFycyhzY3JpcHRfZGlyKS8uaGllcnN0ZXBzLnRjbF19IHsKIyAgICAgICAgICAgICAgICAgICAgIHB1dHMgJGZwMiAiIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICRwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiAKICAgICAgICAgICAgICAgICAgICAgc2V0IGlwIFtvcGVuICR2YXJzKHBhcnRpdGlvbl9kaXIpLyRwLyR2YXJzKHNjcmlwdF9kaXIpLy5oaWVyc3RlcHMudGNsIHJdCiAgICAgICAgICAgICAgICAgICAgIGlmIHskcCAhPSAkdmFycyhkZXNpZ24pfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIHtbZ2V0cyAkaXAgbGluZV0+PTB9IHsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dHMgJGZwMiAkbGluZSAKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSB7W2dldHMgJGlwIGxpbmVdPj0wfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHtbcmVnZXhwICJjcmVhdGVfZmxvd19zdGVwIC1uYW1lIHRvcF8iICRsaW5lXX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRzICRmcDIgJGxpbmUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIHtbZ2V0cyAkaXAgbGluZV0+PTB9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYge1tyZWdleHAgIl5cfSIgJGxpbmVdfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dHMgJGZwMiAkbGluZSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0cyAkZnAyICRsaW5lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiB7W2ZpbGUgZXhpc3RzICR2YXJzKHBhcnRpdGlvbl9kaXIpLyRwL3J1bl9mbG93LnRjbF19IHsKICAgICAgICAgICAgICAgICAgICAgc2V0IGlwIFtvcGVuICR2YXJzKHBhcnRpdGlvbl9kaXIpLyRwL3J1bl9mbG93LnRjbCByXQogICAgICAgICAgICAgICAgICAgICB3aGlsZSB7W2dldHMgJGlwIGxpbmVdPj0wfSB7IAogICAgICAgICAgICAgICAgICAgICAgICBwdXRzICRmcCAkbGluZSAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhwYXJ0aXRpb25fZGlyX3Bhc3MyKV0gJiYgW2ZpbGUgZXhpc3RzICR2YXJzKHBhcnRpdGlvbl9kaXJfcGFzczIpLyRwL3J1bl9mbG93LnRjbF19IHsKICAgICAgICAgICAgICAgICAgICAgc2V0IGlwIFtvcGVuICR2YXJzKHBhcnRpdGlvbl9kaXJfcGFzczIpLyRwL3J1bl9mbG93LnRjbCByXQogICAgICAgICAgICAgICAgICAgICB3aGlsZSB7W2dldHMgJGlwIGxpbmVdPj0wfSB7IAogICAgICAgICAgICAgICAgICAgICAgICBwdXRzICRmcCAkbGluZSAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgcHV0cyAkZnAyICIjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSElFUiBTVEVQUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgCiAgICAgICAgICAgICAgIHB1dHMgJGZwMiAkdmFycyhmbG93X3N0ZXBzLGhpZXIpCiAgICAgICAgICAgICAgIHNldCB2YXJzKGZsb3dfbmFtZSkgJHZhcnMoZGVzaWduKQogICAgICAgICAgICAgICBzZXQgYXN0ZXBzIFtGRjo6YWRqdXN0X3N0ZXBzXQojICAgICAgICAgICAgICAgcHV0cyAkZnAgImNyZWF0ZV9mbG93IFxcXG4gICAtbmFtZSAkdmFycyhmbG93X25hbWUpXFxcbiAgIC10b29sICR2YXJzKG1ha2VfdG9vbClcXFxuICAgLXRvb2xfb3B0aW9ucyB7LWxvZyAkdmFycyhmbG93X25hbWUpLmxvZ31cXFxuICAgXFtsaXN0ICRhc3RlcHNcXVxuIgogICAgICAgICAgICAgICBzZXQgcHN0ZXBzIFtsaXN0XQogICAgICAgICAgICAgICBzZXQgYnN0ZXBzIFtsaXN0XQogICAgICAgICAgICAgICBmb3JlYWNoIHMgJGFzdGVwcyB7CiAgICAgICAgICAgICAgICAgIGlmIHsoW2xzZWFyY2ggJHZhcnMoZnN0ZXBzKSAkc10gIT0gLTEpICYmICgkcyAhPSAiYXNzZW1ibGUiKX0gewogICAgICAgICAgICAgICAgICAgICBsYXBwZW5kIGJzdGVwcyAkcwogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZiB7IVtyZWdleHAgIl5hc3NlbWJsZSIgJHNdfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhcHBlbmQgcHN0ZXBzICRzCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIHNldCB2YXJzKGZsb3dfbmFtZSkgaW50ZXJtZWRpYXRlX2Fzc2VtYmx5CiAgICAgICAgICAgICAgIHB1dHMgJGZwICJjcmVhdGVfZmxvdyBcXFxuICAgLW5hbWUgJHZhcnMoZmxvd19uYW1lKVxcXG4gICAtdG9vbCAkdmFycyhtYWtlX3Rvb2wpXFxcbiAgIC10b29sX29wdGlvbnMgey1sb2cgJHZhcnMoZmxvd19uYW1lKS5sb2d9XFxcbiAgIFxbbGlzdCBhc3NlbWJsZV9mbGV4aWxtXF1cbiIKICAgICAgICAgICAgICAgc2V0IHZhcnMoZmxvd19uYW1lKSBmaW5hbF9hc3NlbWJseQogICAgICAgICAgICAgICBwdXRzICRmcCAiY3JlYXRlX2Zsb3cgXFxcbiAgIC1uYW1lICR2YXJzKGZsb3dfbmFtZSlcXFxuICAgLXRvb2wgJHZhcnMobWFrZV90b29sKVxcXG4gICAtdG9vbF9vcHRpb25zIHstbG9nICR2YXJzKGZsb3dfbmFtZSkubG9nfVxcXG4gICBcW2xpc3QgYXNzZW1ibGVcXVxuIgogICAgICAgICAgICAgICBzZXQgdmFycyhmbG93X25hbWUpIHBhcnRpdGlvbmluZwogICAgICAgICAgICAgICBwdXRzICRmcCAiY3JlYXRlX2Zsb3cgXFxcbiAgIC1uYW1lICR2YXJzKGZsb3dfbmFtZSlcXFxuICAgLXRvb2wgJHZhcnMobWFrZV90b29sKVxcXG4gICAtdG9vbF9vcHRpb25zIHstbG9nICR2YXJzKGZsb3dfbmFtZSkubG9nfVxcXG4gICBcW2xpc3QgJHBzdGVwc1xdXG4iCiMgICAgICAgICAgICAgICBwdXRzICRmcCAicnVuX2Zsb3cgLWZsb3cgJHZhcnMoZmxvd19uYW1lKSIKICAgICAgICAgICAgICAgdW5zZXQgdmFycyhmbG93X3N0ZXBzKQojICAgICAgICAgICAgICAgc2V0IHZhcnMoZmxvd19uYW1lKSAkdmFycyhkZXNpZ24pCiMgICAgICAgICAgICAgICBwdXRzICRmcCAiY3JlYXRlX2Zsb3cgXFxcbiAgIC1uYW1lICR2YXJzKGZsb3dfbmFtZSlcXFxuICAgLXRvb2wgJHZhcnMobWFrZV90b29sKVxcXG4gICAtdG9vbF9vcHRpb25zIHstbG9nICR2YXJzKGZsb3dfbmFtZSkubG9nfVxcXG4gICBcW2xpc3QgJGJzdGVwc1xdXG4iCiAgICAgICAgICAgICAgIGlmIHtbZmlsZSBleGlzdHMgJHZhcnMoY3dkKS8ucGx1Z2luc119IHsKICAgICAgICAgICAgICAgICAgc2V0IGlwIFtvcGVuICR2YXJzKGN3ZCkvLnBsdWdpbnMgcl0KICAgICAgICAgICAgICAgICAgd2hpbGUge1tnZXRzICRpcCBsaW5lXT49MH0geyAKICAgICAgICAgICAgICAgICAgICAgcHV0cyAkZnAxICRsaW5lIAogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGNsb3NlICRpcAogICAgICAgICAgICAgICAgICBmaWxlIGRlbGV0ZSAkdmFycyhjd2QpLy5wbHVnaW5zIAogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGNsb3NlICRmcAogICAgICAgICAgICAgICBjbG9zZSAkZnAxCiAgICAgICAgICAgICAgIGNsb3NlICRmcDIKICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgIH0KCiAgICAgIGNsb3NlICRvcAoKICAgfQoKICAgcHJvYyBzZXRfc3RlcHMge21vZGUgZm9ybWF0fSB7CiAgICAgICMKICAgICAgIyBTZXRzIHRoZSB2YXJzKCkgYXJyYXkgYmFzZWQgb24gdGhlIG1vZGUvZm9ybWF0IHBhc3NlZCBpbgogICAgICAjCgogICAgICBnbG9iYWwgdmFycwogICAgICBnbG9iYWwgZXJyb3JzCgogICAgICBpZiB7JG1vZGUgPT0gImhpZXIiIH0gewogICAgICAgICBzZXQgbW9kZSAidG9wX2Rvd24iCiAgICAgICAgIGlmIHskdmFycyhoaWVyX2Zsb3dfdHlwZSkgPT0gIjJwYXNzIn0gewogICAgICAgICAgICBzZXQgbW9kZSAiMnBhc3MiCiAgICAgICAgIH0KICAgICAgfQoKICAgICAgc3dpdGNoICRtb2RlIHsKICAgICAgICAgInVzZXIiIHsKICAgICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhzdGVwcyldfSB7CiAgICAgICAgICAgICAgIHB1dHMgIjxGRj4gRVJST1I6IEZvciB1c2VyIG1vZGUsIHZhcnMoc3RlcHMpIG11c3QgYmUgcHJvdmlkZWQiCiAgICAgICAgICAgICAgIGV4aXQKICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgICJmbGF0IiB7CiAgICAgICAgICAgIHNldCB2YXJzKHN0ZXBzKSBbbGlzdCAiaW5pdCIgInBsYWNlIiAicHJlY3RzIiAiY3RzIiAicG9zdGN0cyIgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvc3RjdHNfaG9sZCIgInJvdXRlIiAicG9zdHJvdXRlIiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9zdHJvdXRlX2hvbGQiICJwb3N0cm91dGVfc2lfaG9sZCIgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvc3Ryb3V0ZV9zaSIgInNpZ25vZmYiXQogICAgICAgICAgICBpZiB7JHZhcnMocHJlcm91dGVfb3B0X2Rlc2lnbil9IHsKICAgICAgICAgICAgICAgc2V0IHZhcnMoc3RlcHMpIFtscmVwbGFjZSAkdmFycyhzdGVwcykgW2xzZWFyY2ggJHZhcnMoc3RlcHMpICJwbGFjZSJdIFtsc2VhcmNoICR2YXJzKHN0ZXBzKSAiY3RzIl0gcHJlcm91dGVdCiAgICAgICAgICAgIH0KIyAgICAgICAgICAgIGlmIHskdmFycyhyb3V0ZV9vcHRfZGVzaWduKX0gewojICAgICAgICAgICAgICAgc2V0IHZhcnMoc3RlcHMpIFtscmVwbGFjZSAkdmFycyhzdGVwcykgW2xzZWFyY2ggJHZhcnMoc3RlcHMpICJyb3V0ZSJdIFtsc2VhcmNoICR2YXJzKHN0ZXBzKSAicG9zdHJvdXRlIl0gcm91dGVfb3B0X2Rlc2lnbl0KIyAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgJHZhcnMocmMpIHsKICAgICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9yY3ApfSB7IAogICAgICAgICAgICAgICAgICBzZXQgdmFycyhzdGVwcykgW2NvbmNhdCAic3luX21hcCIgInN5bl9pbmNyIiAic3luX3BsYWNlIiAkdmFycyhzdGVwcyldCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHNldCB2YXJzKHN0ZXBzKSBbY29uY2F0ICJzeW5fbWFwIiAic3luX2luY3IiICR2YXJzKHN0ZXBzKV0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgIH0KCiAgICAgICAgICJ0b3BfZG93biIgewogICAgICAgICAgICAgICBzZXQgdmFycyhzdGVwcykgW2xpc3QgInBhcnRpdGlvbl9wbGFjZSIgImFzc2lnbl9waW4iICJwYXJ0aXRpb24iICJpbml0IiAicGxhY2UiICJwcmVjdHMiIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3RzIiAicG9zdGN0cyIgInBvc3RjdHNfaG9sZCIgInJvdXRlIiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvc3Ryb3V0ZSIgInBvc3Ryb3V0ZV9ob2xkIiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvc3Ryb3V0ZV9zaV9ob2xkIiAicG9zdHJvdXRlX3NpIiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpZ25vZmYiICJhc3NlbWJsZSJdCiAgICAgICAgICAgICAgIHNldCB2YXJzKGhzdGVwcykgW2xpc3QgImFzc2VtYmxlIiAicGFydGl0aW9uX3BsYWNlIiAiYXNzaWduX3BpbiIgInBhcnRpdGlvbiJdCiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyh1c2VfZmxleG1vZGVscyldICYmICR2YXJzKHVzZV9mbGV4bW9kZWxzKX0gewogICAgICAgICAgICAgICAgICAjIEluc2VydCB0aGUgbW9kZWxfZ2VuIHN0ZXAgYmVmb3JlIHBhcnRpdGlvbl9wbGFjZQogICAgICAgICAgICAgICAgICBmb3JlYWNoIHZhcm5hbWUge3N0ZXBzIGhzdGVwc30gewogICAgICAgICAgICAgICAgICAgICBzZXQgb2xkICR2YXJzKCR2YXJuYW1lKQogICAgICAgICAgICAgICAgICAgICBzZXQgdmFycygkdmFybmFtZSkgW2xpbnNlcnQgJG9sZCBbbHNlYXJjaCAkb2xkICJwYXJ0aXRpb25fcGxhY2UiXSAibW9kZWxfZ2VuIl0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoZmxleG1vZGVsX3Byb3RvdHlwZSldICYmICR2YXJzKGZsZXhtb2RlbF9wcm90b3R5cGUpfSB7CiAgICAgICAgICAgICAgICAgICAgICMgSW5zZXJ0IHRoZSBwcm90b3R5cGUgc3RlcCBiZWZvcmUgcGFydGl0aW9uX3BsYWNlCiAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggdmFybmFtZSB7c3RlcHMgaHN0ZXBzfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldCBvbGQgJHZhcnMoJHZhcm5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgIHNldCB2YXJzKCR2YXJuYW1lKSBbbGluc2VydCAkb2xkIFtsc2VhcmNoICRvbGQgInBhcnRpdGlvbl9wbGFjZSJdICJwcm90b3R5cGUiXQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgc2V0IHZhcnMoZnN0ZXBzKSBbbGlzdCAiaW5pdCIgInBsYWNlIiAicHJlY3RzIiAiY3RzIiAicG9zdGN0cyIgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3N0Y3RzX2hvbGQiICJyb3V0ZSIgInBvc3Ryb3V0ZSIgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3N0cm91dGVfaG9sZCIgInBvc3Ryb3V0ZV9zaV9ob2xkIiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvc3Ryb3V0ZV9zaSIgInNpZ25vZmYiXQogICAgICAgICB9CiAgICAgICAgICIxcGFzcyIgewogICAgICAgICAgICAgICBzZXQgdmFycyhzdGVwcykgW2xpc3QgInBhcnRpdGlvbl9wbGFjZSIgImFzc2lnbl9waW4iICJwYXJ0aXRpb24iICJpbml0IiAicGxhY2UiICJwcmVjdHMiIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3RzIiAicG9zdGN0cyIgInBvc3RjdHNfaG9sZCIgInJvdXRlIiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvc3Ryb3V0ZSIgInBvc3Ryb3V0ZV9ob2xkIiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvc3Ryb3V0ZV9zaV9ob2xkIiAicG9zdHJvdXRlX3NpIiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpZ25vZmYiICJhc3NlbWJsZSJdCiAgICAgICAgICAgICAgIHNldCB2YXJzKGhzdGVwcykgW2xpc3QgImFzc2VtYmxlIiAicGFydGl0aW9uX3BsYWNlIiAiYXNzaWduX3BpbiIgInBhcnRpdGlvbiJdCiAgICAgICAgICAgICAgIHNldCB2YXJzKGZzdGVwcykgW2xpc3QgImluaXQiICJwbGFjZSIgInByZWN0cyIgImN0cyIgInBvc3RjdHMiIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9zdGN0c19ob2xkIiAicm91dGUiICJwb3N0cm91dGUiIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9zdHJvdXRlX2hvbGQiICJwb3N0cm91dGVfc2lfaG9sZCIgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3N0cm91dGVfc2kiICJzaWdub2ZmIl0KICAgICAgICAgfQogICAgICAgICAiMnBhc3MiIHsKICAgICAgICAgICAgaWYgeyR2YXJzKGVuYWJsZV9mbGV4aWxtKX0gewogICAgICAgICAgICAgICBzZXQgdmFycyhzdGVwcykgW2xpc3QgInBhcnRpdGlvbl9wbGFjZSIgImFzc2lnbl9waW4iICJwYXJ0aXRpb24iICJpbml0IiAicGxhY2UiICJwcmVjdHMiICJhc3NlbWJsZV9mbGV4aWxtIiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3RzIiAicG9zdGN0cyIgInBvc3RjdHNfaG9sZCIgInJvdXRlIiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9zdHJvdXRlIiAicG9zdHJvdXRlX2hvbGQiIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3N0cm91dGVfc2lfaG9sZCIgInBvc3Ryb3V0ZV9zaSIgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpZ25vZmYiICJhc3NlbWJsZSJdCiAgICAgICAgICAgICAgIHNldCB2YXJzKGhzdGVwcykgW2xpc3QgImFzc2VtYmxlIiAiYXNzZW1ibGVfZmxleGlsbSIgInBhcnRpdGlvbl9wbGFjZSIgImFzc2lnbl9waW4iICJwYXJ0aXRpb24iXQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBzZXQgdmFycyhzdGVwcykgW2xpc3QgInBhcnRpdGlvbl9wbGFjZSIgImFzc2lnbl9waW4iICJwYXJ0aXRpb24iICJpbml0IiAicGxhY2UiICJwcmVjdHMiIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjdHMiICJyZWJ1ZGdldCIgInBvc3RjdHMiICJwb3N0Y3RzX2hvbGQiICJyb3V0ZSIgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvc3Ryb3V0ZSIgInBvc3Ryb3V0ZV9ob2xkIiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9zdHJvdXRlX3NpX2hvbGQiICJwb3N0cm91dGVfc2kiIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaWdub2ZmIiAiYXNzZW1ibGUiXQogICAgICAgICAgICAgICBzZXQgdmFycyhoc3RlcHMpIFtsaXN0ICJhc3NlbWJsZSIgInJlYnVkZ2V0IiAicGFydGl0aW9uX3BsYWNlIiAiYXNzaWduX3BpbiIgInBhcnRpdGlvbiJdCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHVzZV9mbGV4bW9kZWxzKV0gJiYgJHZhcnModXNlX2ZsZXhtb2RlbHMpfSB7CiAgICAgICAgICAgICAgICMgSW5zZXJ0IHRoZSBtb2RlbF9nZW4gc3RlcCBiZWZvcmUgcGFydGl0aW9uX3BsYWNlCiAgICAgICAgICAgICAgIGZvcmVhY2ggdmFybmFtZSB7c3RlcHMgaHN0ZXBzfSB7CiAgICAgICAgICAgICAgICAgIHNldCBvbGQgJHZhcnMoJHZhcm5hbWUpCiAgICAgICAgICAgICAgICAgIHNldCB2YXJzKCR2YXJuYW1lKSBbbGluc2VydCAkb2xkIFtsc2VhcmNoICRvbGQgInBhcnRpdGlvbl9wbGFjZSJdICJtb2RlbF9nZW4iXQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhmbGV4bW9kZWxfcHJvdG90eXBlKV0gJiYgJHZhcnMoZmxleG1vZGVsX3Byb3RvdHlwZSl9IHsKICAgICAgICAgICAgICAgICAgIyBJbnNlcnQgdGhlIHByb3RvdHlwZSBzdGVwIGJlZm9yZSBwYXJ0aXRpb25fcGxhY2UKICAgICAgICAgICAgICAgICAgZm9yZWFjaCB2YXJuYW1lIHtzdGVwcyBoc3RlcHN9IHsKICAgICAgICAgICAgICAgICAgICAgc2V0IG9sZCAkdmFycygkdmFybmFtZSkKICAgICAgICAgICAgICAgICAgICAgc2V0IHZhcnMoJHZhcm5hbWUpIFtsaW5zZXJ0ICRvbGQgW2xzZWFyY2ggJG9sZCAicGFydGl0aW9uX3BsYWNlIl0gInByb3RvdHlwZSJdCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCB2YXJzKGZzdGVwcykgW2xpc3QgImluaXQiICJwbGFjZSIgInByZWN0cyIgImN0cyIgInBvc3RjdHMiIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9zdGN0c19ob2xkIiAicm91dGUiICJwb3N0cm91dGUiIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9zdHJvdXRlX2hvbGQiICJwb3N0cm91dGVfc2lfaG9sZCIgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3N0cm91dGVfc2kiICJzaWdub2ZmIl0KICAgICAgICAgfQogICAgICAgICAiYm90dG9tX3VwIiB7CiAgICAgICAgICAgIHNldCB2YXJzKHN0ZXBzKSBbbGlzdCAiaW5pdCIgInBsYWNlIiAicHJlY3RzIiAiY3RzIiAicG9zdGN0cyIgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvc3RjdHNfaG9sZCIgInJvdXRlIiAicG9zdHJvdXRlIiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9zdHJvdXRlX2hvbGQiICJwb3N0cm91dGVfc2lfaG9sZCIgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvc3Ryb3V0ZV9zaSIgInNpZ25vZmYiICJhc3NlbWJsZSJdCiAgICAgICAgICAgIHNldCB2YXJzKGhzdGVwcykgW2xpc3QgImFzc2VtYmxlIl0KICAgICAgICAgICAgc2V0IHZhcnMoZnN0ZXBzKSBbbGlzdCAiaW5pdCIgInBsYWNlIiAicHJlY3RzIiAiY3RzIiAicG9zdGN0cyIgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3N0Y3RzX2hvbGQiICJyb3V0ZSIgInBvc3Ryb3V0ZSIgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3N0cm91dGVfaG9sZCIgInBvc3Ryb3V0ZV9zaV9ob2xkIiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvc3Ryb3V0ZV9zaSIgInNpZ25vZmYiXQogICAgICAgICB9CgogICAgICAgICAiZGVmYXVsdCIgewogICAgICAgICAgICBwdXRzICJJbnRlcm5hbCBlcnJvcjogVW5rbm93biBtb2RlIFwiJHZhcnMobW9kZSlcIi4gIEFib3J0aW5nLiIKICAgICAgICAgICAgZXhpdCAtMTExCiAgICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgeyEkdmFycyhlbmFibGVfY2VsdGljX3N0ZXBzKSB9IHsKICAgICAgICAgZm9yZWFjaCBzdGVwIFtsaXN0ICJwb3N0cm91dGVfc2kiICJwb3N0cm91dGVfc2lfaG9sZCJdIHsKICAgICAgICAgICAgc2V0IGluZGV4IFtsc2VhcmNoICR2YXJzKHN0ZXBzKSAkc3RlcF0KICAgICAgICAgICAgaWYgeyRpbmRleCAhPSAtMX0gewogICAgICAgICAgICAgICBzZXQgdmFycyhzdGVwcykgW2xyZXBsYWNlICR2YXJzKHN0ZXBzKSAkaW5kZXggJGluZGV4XQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfQogICB9CgogIHByb2MgZmxhdHRlbl9jdXJsaWVzX2luX2xpc3QgbGlzdCB7c3RyaW5nIG1hcCB7XHsgIiIgXH0gIiJ9ICRsaXN0fQoKICAjCiAgIyBnZW5faW5jcl9maWxlbmFtZShzY3JpcHROYW1lQmFzZSkKICAjIEJ1ZGEgTGV1bmcsIDExLzIwMTEKICAjIGFyZ3M6CiAgIyAgJHNjcmlwdE5hbWVCYXNlOiA8cGF0aD4vYmFzZW5hbWUgb2YgZGlyCiAgIyBAcmV0dXJuOiBuZXcgYmFzZSBuYW1lCiAgIwogICMgRGVzY3JpcHRpb246IEdlbmVyYXRlcyBhIG5ldyBvdXRwdXQgZmlsZSBuYW1lIHVzaW5nIHRoZSBpbnB1dAogICMgYXJndW1lbnQgYXMgYSBiYXNlbmFtZS4gVGhpcyBwcm9jIGxvb2tzIGZvciBhbGwgZmlsZXMgaW4gdGhlCiAgIyBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgYXJndW1lbnQgd2l0aCBhIG1hdGNoaW5nIGJhc2VuYW1lLgogICMgSXQgdGhlbiBsb29rcyBmb3IgYSB0cmFpbGluZyBpbnRlZ2VyIHN1ZmZpeCwgYW5kIGNvbXBhcmVzCiAgIyBhbGwgbWF0Y2hpbmcgZmlsZXMgdG8gZmluZCB0aGUgbGFyZ2VzdCBpbnRlZ2VyLiAKICAjIEl0IHJldHVybnMgYSBuZXcgZmlsZSBuYW1lIG9mIHRoZSBmb3JtIDxwYXRoPi88YmFzZW5hbWU+PGxhcmdlc3QgaW50ICsgMT4KICAjCiAgIyBFeGFtcGxlIFVzYWdlOiBpbnB1dCBhcmd1bWVudCBzZXR1cC50Y2wKICAjIGZpbGVzIGluIGRpcjogc2V0dXAudGNsIHNldHVwLnRjbDEKICAjIEByZXR1cm46IHNldHVwLnRjbDIKICAjCgogIHByb2MgZ2VuX2luY3JfZmlsZW5hbWUge3NjcmlwdE5hbWVCYXNlfSB7CiAgICBzZXQgZmlsZV9saXN0IFtnbG9iIC1ub2NvbXBsYWluIFtzZXQgc2NyaXB0TmFtZUJhc2VdKl0KICAgIGlmIHtbbGxlbmd0aCAkZmlsZV9saXN0XSA+IDB9IHsKICAgICAgc2V0IGhpZ2hOdW0gMQogICAgICBmb3JlYWNoIGZpbGUgJGZpbGVfbGlzdCB7CiAgICAgICAgc2V0IHJlICJbc2V0IHNjcmlwdE5hbWVCYXNlXShcW1xbOmRpZ2l0OlxdXF0rKVwkIgogICAgICAgIGlmIHtbcmVnZXhwICRyZSAkZmlsZSBmdWxsIG51bV19IHsKICAgICAgICAgIGlmIHskbnVtID49ICRoaWdoTnVtfSB7CiAgICAgICAgICAgIHNldCBoaWdoTnVtIFtpbmNyIG51bV0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgc2V0IHNjcmlwdE5hbWUgJHNjcmlwdE5hbWVCYXNlJGhpZ2hOdW0KICAgIH0gZWxzZSB7CiAgICAgIHNldCBzY3JpcHROYW1lICJbc2V0IHNjcmlwdE5hbWVCYXNlXSIKICAgIH0KICAgIHJldHVybiAkc2NyaXB0TmFtZQogIH0KCiAgIwogICMgZ2VuX25ld19ydW5kaXIge2FyZ3N9CiAgIyBCdWRhIExldW5nLCAxMS8yMDExCiAgIyBhcmdzOgogICMgIC1kaXIgPHN0cmluZz46IGRpciBuYW1lIHRvIGNoYW5nZQogICMgIC1zdHlsZSBbaW5jcmVtZW50fGRhdGV8Y3VzdG9tXTogbmFtaW5nIHN0eWxlIHRvIHVzZSBbaW5jcmVtZW50fGRhdGV8Y3VzdG9tXQogICMgIC1kYXRlX3N0eWxlIDxzdHJpbmc+IChyZXF1aXJlZCB3aGVuIHN0eWxlPWRhdGUpOiB0Y2wgY29tbWFuZHMgdG8gY3JlYXRlIGEgZGF0ZSBzdHJpbmcKICAjICAtY3VzdG9tIDxzdHJpbmc+IChvcHRpb25hbCk6IGEgY3VzdG9tIHN0cmluZyB0byBwcmVwZW5kIG9yIHBvc3RwZW5kIHRvIHRoZSBkaXIKICAjICAtbmFtZV9jaGFuZ2Vfb3JkZXIgW3ByZWZpeHxzdWZmaXhdIChyZXF1aXJlZCB3aGVuIGN1c3RvbVN0cmluZyBpcyBkZWZpbmVkKTogW3ByZWZpeHxzdWZmaXhdCiAgIyBAcmV0dXJuOiBuZXcgZGlyIG5hbWUKICAjCiAgIyBEZXNjcmlwdGlvbjogR2VuZXJhdGVzIGEgbmV3IGRpcmVjdG9yeSBuYW1lIGJhc2VkIG9uIHRoZSBiYXNlbmFtZQogICMgYW5kIG9wdGlvbnMgcHJvdmlkZWQuIFRoZSBvcHRpb25zIGFsbG93ZWQgYXJlOgogICMKICAjIHN0eWxlOgogICMgICogaW5jcmVtZW50OiBhZGQgYW4gaW50ZWdlciB0byB0aGUgcnVuZGlyIGJhc2VkIG9uIGRpcnMgZm91bmQgaW4gW2Rpcm5hbWUgJGRpcl0KICAjICAqIGRhdGU6IGFkZCBhIGRhdGUgc3RyaW5nIHRvIHRoZSBydW5kaXIgbmFtZSwgdXNpbmcgdmFycyhkYXRlX3N0eWxlKSB0byBjb250cm9sIHRoZSBmb3JtYXR0aW5nCiAgIyAgKiBjdXN0b206IGFkZCBhIGN1c3RvbSBzdHJpbmcgdG8gdGhlIHJ1bmRpciBuYW1lCiAgIyBuYW1lQ2hhbmdlT3JkZXI6ICAgCiAgIyAgKiBwcmVmaXg6IGFkZCB0aGUgY3VzdG9tIHN0cmluZyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBydW5kaXIKICAjICAqIHN1ZmZpeDogYWRkIHRoZSBjdXN0b20gc3RyaW5nIHRvIHRoZSBlbmQgb2YgdGhlIHJ1bmRpcgogICMKICAjIE5PVEU6IGluY3JlbWVudCwgZGF0ZSwgYW5kIGN1c3RvbSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlIG9wdGlvbnMKICAjCiAgIyBFeGFtcGxlIFVzYWdlOiAKICAjIGdlbl9uZXdfcnVuZGlyIHdvcmsvcnVuIGluY3JlbWVudAogICMgKGRpcnMgd2l0aCBtYXRjaGluZyBiYXNlbmFtZSA6IHdvcmsvcnVuMSB3b3JrL3J1bjIpCiAgIyBAcmV0dXJuOiB3b3JrL3J1bjMKICAjCiAgIyBnZW5fbmV3X3J1bmRpciB3b3JrL3J1biBkYXRlCiAgIyBAcmV0dXJuOiB3b3JrL3J1bl8yMDExLTExLTIzXzEyXzA5XzU4IAogICMKICAjIGdlbl9uZXdfcnVuZGlyIHdvcmsvcnVuIGN1c3RvbSByY3BfaGlnaF9lZmYgcHJlZml4CiAgIyBAcmV0dXJuOiB3b3JrL3JjcF9oaWdoX2VmZl9ydW4KCiAgcHJvYyBnZW5fbmV3X3J1bmRpciB7YXJndn0gewoKICAgICAgZ2xvYmFsIHZhcnMKICAgICAgZ2xvYmFsIGRhcmdzCiAgICAgIGdsb2JhbCBmYXJncwogICAgICAjCiAgICAgICMgUHJvYyBkZWZhdWx0cwogICAgICAjIE5vdGUgdGhhdCBkZWZhdWx0cyBsaXZlIGluIHRoZSBkZWZhdWx0X3NldHVwLnRjbCwgYnV0IHdoZW4gZ2VuX25ld19ydW5kaXIgaXMgY2FsbGVkLCB0aGF0IHNldHVwLnRjbCBoYXMgbm90IHlldCBiZWVuIGxvYWRlZAogICAgICAjIFRoZXNlIGRlZmF1bHRzIG11c3Qgc3RheSBzeW5jaHJvbml6ZWQgdG8gIHRoZSBkZWZhdWx0X3NldHVwLnRjbCB2YXJzKCkgZXF1aXZhbGVudHMKICAgICAgIwogICAgICBzZXQgZGVmX2RhdGVfc3R5bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFtjbG9jayBmb3JtYXQgXFtjbG9jayBzZWNvbmRzXF0gLWZvcm1hdCBcIiVZLSVtLSVkXyVIXyVNXyVTXCIgXF0iCiAgICAgICMgVXNlIHRoZSBmb2xsb3dpbmcgaWYgeW91IHdhbnQgYSBjdXN0b20gcHJlZml4L3N1ZmZpeCBhZGRlZCB0byB0aGUgcnVuZGlyCiAgICAgIHNldCBkZWZfY3VzdG9tX3J1bmRpcl9uYW1lX2FwcGVuZCAgICAgICAgICAgICAgICAgICIiCiAgICAgICMgdmFycyhydW5kaXJfbmFtZWNoYW5nZV9tZXRob2QpIFtwcmVmaXh8c3VmZml4XQogICAgICBzZXQgZGVmX3J1bmRpcl9uYW1lY2hhbmdlX21ldGhvZCAgICAgICAgICAgICAgICAgICAic3VmZml4IgoKICAgICAgIwogICAgICAjIEFyZyBwcm9jZXNzaW5nCiAgICAgICMKCiAgICAgIHdoaWxlIHtbbGxlbmd0aCAkYXJndl0gPiAwfSB7CiAgICAgICAgIHNldCBvcHRpb24gW2xpbmRleCAkYXJndiAwXQogICAgICAgICBzZXQgYXJndiBbbHJlcGxhY2UgJGFyZ3YgMCAwXQogICAgICAgICBzd2l0Y2ggLXJlZ2V4cCAtLSAkb3B0aW9uIHsKICAgICAgICAgICAgXi0oZHwtZGlyKSQgewogICAgICAgICAgICAgICBzZXQgZGFzaF9kX3NjcmlwdF9kaXIgW2xpbmRleCAkYXJndiAwXQogICAgICAgICAgICAgICBzZXQgYXJndiBbbHJlcGxhY2UgJGFyZ3YgMCAwXQogICAgICAgICAgICB9CiAgICAgICAgICAgIF4tKHl8LXN0eWxlKSQgewogICAgICAgICAgICAgIHNldCBkYXNoX3lfc3R5bGVfdHlwZSBbbGluZGV4ICRhcmd2IDBdCiAgICAgICAgICAgICAgc2V0IGFyZ3YgW2xyZXBsYWNlICRhcmd2IDAgMF0KICAgICAgICAgICAgfQogICAgICAgICAgICBeLSh1fC1ydW5kaXIpJCB7CiAgICAgICAgICAgICAgIHNldCBkYXNoX3VfcnVuZGlyX2Jhc2UgW2xpbmRleCAkYXJndiAwXQogICAgICAgICAgICAgICBzZXQgYXJndiBbbHJlcGxhY2UgJGFyZ3YgMCAwXQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfSA7ICMgZW5kIHdoaWxlIChwcm9jZXNzaW5nIGFyZ3MpCgogICAgICBzZXQgZGJnTXNnICI8RkYtSU5UPiBnZW5fbmV3X3J1bmRpcigpOiAiCgogICAgICAjCiAgICAgICMgTG9hZCB2YXJzLiBUaGlzIHdpbGwgb3ZlcndyaXRlIGFueSBGRiBkZWZhdWx0cywgYnV0IG5vdCB0aGUgLXUvLXkgb3B0aW9ucwogICAgICAjIE9ubHkgbG9va2luZyBmb3IgdGhlIGZvbGxvd2luZzoKICAgICAgIyB2YXJzKHJ1bmRpcl9iYXNlKSAoLXUgdGFrZXMgcHJlY2VkZW5jZSkgCiAgICAgICMgdmFycyhydW5kaXIpIC0gb3ZlcnJpZGVzIHZhcnMocnVuZGlyX2Jhc2UpIGFuZCAtdS8teQogICAgICAjIHZhcnMoYXV0b19pbmNyZW1lbnRfcnVuZGlyX3N0eWxlKSAoLXkgdGFrZXMgcHJlY2VkZW5jZSkKICAgICAgIyB2YXJzKGRhdGVfc3R5bGUpIChubyBnZW5faW5ub3Z1c19mbG93LnRjbCBvcHRpb24pCiAgICAgICMgdmFycyhjdXN0b21fcnVuZGlyX25hbWVfYXBwZW5kKSAobm8gZ2VuX2lubm92dXNfZmxvdy50Y2wgb3B0aW9uKQogICAgICAjIHZhcnMocnVuZGlyX25hbWVjaGFuZ2VfbWV0aG9kKSAobm8gZ2VuX2lubm92dXNfZmxvdy50Y2wgb3B0aW9uKQogICAgICAjCiAgICAgIEZGX05PVlVTOjpleGVjdXRlX2Zsb3cgInNvdXJjZV9vbmx5IiB0cnVlICIiCiAgIAogICAgICAjIE5PVEU6IGFmdGVyIHRoZSBhYm92ZSBleGVjdXRlcywgZGFyZ3MgYW5kIGZhcmdzIGhhdmUgYWxsIGJlZW4gYW5hbHl6ZWQsIGFuZCB2YXJzIGV4aXN0IGZvciBhbGwgdGhvc2UgZW50cmllcwogICAgICAjIGluIG90aGVyIHdvcmRzLCB3ZSBubyBsb25nZXIgY2FyZSBhYm91dCBkYXJncyhydW5kaXIpLCBvbmx5IHZhcnMocnVuZGlyKS4uLgogICAKICAgICAgIyBJbiBjYXNlIHRoZSB1c2VyIGRlZmluZWQgdGhlc2UgaW4gdGhlaXIgc2V0dXAudGNsCiAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoZGF0ZV9zdHlsZSldfSB7CiAgICAgICAgIHNldCBkYXRlX3N0eWxlICRkZWZfZGF0ZV9zdHlsZQogICAgICB9CiAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoY3VzdG9tX3J1bmRpcl9uYW1lX2FwcGVuZCldfSB7CiAgICAgICAgIHNldCB2YXJzKGN1c3RvbV9ydW5kaXJfbmFtZV9hcHBlbmQpICRkZWZfY3VzdG9tX3J1bmRpcl9uYW1lX2FwcGVuZAogICAgICB9CiAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMocnVuZGlyX25hbWVjaGFuZ2VfbWV0aG9kKV19IHsKICAgICAgICAgc2V0IHZhcnMocnVuZGlyX25hbWVjaGFuZ2VfbWV0aG9kKSAkZGVmX3J1bmRpcl9uYW1lY2hhbmdlX21ldGhvZAogICAgICB9CiAgIAogICAgICAjCiAgICAgICMgU2V0IHRoZSBydW5kaXIgb3JpZ2luYWwgbmFtZQogICAgICAjIFByaW9yaXR5OgogICAgICAjIDEpIHZhcnMocnVuZGlyKQogICAgICAjIDIpIGRhc2hfdV9ydW5kaXJfYmFzZQogICAgICAjIDMpIHZhcnMocnVuZGlyX2Jhc2UpCiAgICAgICMgNCkgZGVmX3J1bmRpcgogICAKICAgICAgIyBpZiB2YXJzKHJ1bmRpcikgZXEgZGFyZ3MocnVuZGlyKSwgdGhlbiBiYXNpY2FsbHkgdGhlIHVzZXIgaGFzIG5vdCBzcGVjaWZpZWQgYSB2YXJzKHJ1bmRpciksIG9yIHRoZXkgc2V0IGl0IHRvIC4KICAgICAgIyB1c2UgZmlsZSBub3JtYWxpemUgdG8gaGFuZGxlICIuLyIgdnMgIi4iCiAgICAgIGlmIHtbZmlsZSBub3JtYWxpemUgJHZhcnMocnVuZGlyKV0gZXEgW2ZpbGUgbm9ybWFsaXplICRkYXJncyhydW5kaXIpXX0gewogICAgICAgIGlmIHshW2luZm8gZXhpc3RzIGRhc2hfdV9ydW5kaXJfYmFzZV19IHsKICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHJ1bmRpcl9iYXNlKV19IHsKICAgICAgICAgICAgIHNldCBydW5kaXJfb3JpZ25hbWUgJGRhcmdzKHJ1bmRpcikKICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc2V0IHJ1bmRpcl9vcmlnbmFtZSAkdmFycyhydW5kaXJfYmFzZSkKICAgICAgICAgICB9IAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhydW5kaXJfYmFzZSldICYmICR2YXJzKHJ1bmRpcl9iYXNlKSBuZSAkZGFzaF91X3J1bmRpcl9iYXNlfSB7CiAgICAgICAgICAgICAjIENvbmZsaWN0IGJldHdlZW4gLXUgYW5kIHNldHVwLnRjbC4gLXUgd2lucwogICAgICAgICAgICAgcHV0cyAiPEZGPiBXQVJOSU5HIFwiLXUgJGRhc2hfdV9ydW5kaXJfYmFzZVwiIG92ZXJyaWRpbmcgY29uZmlnIHZhcmlhYmxlIHZhcnMocnVuZGlyX2Jhc2UpICgkdmFycyhydW5kaXJfYmFzZSkpIgogICAgICAgICAgICAgcHV0cyAiICAgICAgICAgICAgIFRvIHByZXZlbnQgdGhpcyBiZWhhdmlvciwgZG8gbm90IHVzZSB0aGUgXCItdVwiIG9wdGlvbiAoRkYgd2lsbCB1c2UgdmFycyhydW5kaXJfYmFzZSkgZnJvbSB5b3VyIGNvbmZpZyBmaWxlKS4iCiAgICAgICAgICAgfQogICAgICAgICAgIHNldCBydW5kaXJfb3JpZ25hbWUgJGRhc2hfdV9ydW5kaXJfYmFzZQogICAgICAgICB9IAogICAgICB9IGVsc2UgewogICAgICAgICAjIFRoZSBmb2xsb3dpbmcgaGFuZGxlIGNvbmZsaWN0cyBiZXR3ZWVuIHZhcnMocnVuZGlyKSBhbmQgLXUgb3IgdmFycyhydW5kaXJfYmFzZSkKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyBkYXNoX3VfcnVuZGlyX2Jhc2VdfSB7IAogICAgICAgICAgIGlmIHskdmFycyhydW5kaXIpIG5lICRkYXJncyhydW5kaXIpICYmICR2YXJzKHJ1bmRpcikgbmUgJGRhc2hfdV9ydW5kaXJfYmFzZX0gewogICAgICAgICAgICAgcHV0cyAiPEZGPiBXQVJOSU5HIHZhcnMocnVuZGlyKSBcIiR2YXJzKHJ1bmRpcilcIiBvdmVycmlkaW5nIFwiLXUgJGRhc2hfdV9ydW5kaXJfYmFzZVwiIG9wdGlvbi4iCiAgICAgICAgICAgICBwdXRzICIgICAgICAgICAgICAgVG8gcHJldmVudCB0aGlzIGJlaGF2aW9yLCBkbyBub3Qgc2V0IHZhcnMocnVuZGlyKSBpbiB5b3VyIGNvbmZpZyBmaWxlLiIKICAgICAgICAgICB9IGVsc2VpZiB7W2luZm8gZXhpc3RzIHZhcnMocnVuZGlyX2Jhc2UpXX0gewogICAgICAgICAgICAgcHV0cyAiPEZGPiBXQVJOSU5HIHZhcnMocnVuZGlyKSBcIiR2YXJzKHJ1bmRpcilcIiBvdmVycmlkaW5nIGNvbmZpZyB2YXJpYWJsZSB2YXJzKHJ1bmRpcl9iYXNlKSBcIiR2YXJzKHJ1bmRpcl9iYXNlKVwiIgogICAgICAgICAgICAgcHV0cyAiICAgICAgICAgICAgIFRvIHByZXZlbnQgdGhpcyBiZWhhdmlvciwgZG8gbm90IHNldCB2YXJzKHJ1bmRpcikgaW4geW91ciBjb25maWcgZmlsZS4iCiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHNldCBydW5kaXJfb3JpZ25hbWUgJHZhcnMocnVuZGlyKQogICAgICB9CiAgICAgICMKICAgICAgIyBTZXQgdGhlIHJ1bmRpciBuYW1pbmcgc3R5bGUKICAgICAgIyBQcmlvcml0eToKICAgICAgIyAxKSB2YXJzKGF1dG9faW5jcmVtZW50X3J1bmRpcl9zdHlsZSkKICAgICAgIyAyKSBkYXNoX3lfc3R5bGVfdHlwZQogICAgICAjIDMpIGRlZl9hdXRvX2luY3JlbWVudF9ydW5kaXJfc3R5bGUKICAgICAgIAogICAgICBpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKGF1dG9faW5jcmVtZW50X3J1bmRpcl9zdHlsZSldfSB7CiAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIGRhc2hfeV9zdHlsZV90eXBlXX0gewogICAgICAgICAgIHNldCBzdHlsZVR5cGUgJGRhcmdzKHN0eWxlKQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIHNldCBzdHlsZVR5cGUgJGRhc2hfeV9zdHlsZV90eXBlCiAgICAgICAgIH0gCiAgICAgIH0gZWxzZSB7IAogICAgICAgICAjIHZhcnMoYXV0b19pbmNyZW1lbnRfcnVuZGlyX3N0eWxlKSB3YXMgc2V0IGluIHRoZSBzZXR1cC50Y2wKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyBkYXNoX3lfc3R5bGVfdHlwZV0gJiYgJGRhc2hfeV9zdHlsZV90eXBlIG5lICR2YXJzKGF1dG9faW5jcmVtZW50X3J1bmRpcl9zdHlsZSl9IHsKICAgICAgICAgICAjIENvbmZsaWN0IGJldHdlZW4gLXkgYW5kIHNldHVwLnRjbC4gLXkgd2lucwogICAgICAgICAgIHB1dHMgIjxGRj4gV0FSTklORyBcIi15ICRkYXNoX3lfc3R5bGVfdHlwZVwiIG92ZXJyaWRpbmcgY29uZmlnIHZhcmlhYmxlIHZhcnMoYXV0b19pbmNyZW1lbnRfcnVuZGlyX3N0eWxlKSAoJHZhcnMoYXV0b19pbmNyZW1lbnRfcnVuZGlyX3N0eWxlKSkiCiAgICAgICAgICAgcHV0cyAiICAgICAgICAgICAgIFRvIHByZXZlbnQgdGhpcyBiZWhhdmlvciwgZG8gbm90IHVzZSB0aGUgXCIteVwiIG9wdGlvbiAoRkYgd2lsbCB1c2UgdmFycyhhdXRvX2luY3JlbWVudF9ydW5kaXJfc3R5bGUpIGZyb20geW91ciBjb25maWcgZmlsZSkuIgogICAgICAgICBzZXQgc3R5bGVUeXBlICRkYXNoX3lfc3R5bGVfdHlwZQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIHNldCBzdHlsZVR5cGUgJHZhcnMoYXV0b19pbmNyZW1lbnRfcnVuZGlyX3N0eWxlKQogICAgICAgICB9CiAgICAgIH0KICAgCiAgICAgICMKICAgICAgIyBJZiBpbmNyZW1lbnQgaXMgc3BlY2lmaWVkLCAtdSAvIHZhcnMocnVuZGlyKSBpcyByZXF1aXJlZCA7IG90aGVyd2lzZSBlcnJvciBhbmQgZXhpdDoKICAgICAgIwogICAgICBpZiB7JHN0eWxlVHlwZSBlcSAiaW5jcmVtZW50IiAmJiAoW2ZpbGUgdGFpbCAkcnVuZGlyX29yaWduYW1lXSBlcSAiIiB8fCBbZmlsZSBub3JtYWxpemUgJHJ1bmRpcl9vcmlnbmFtZV0gZXEgW2ZpbGUgbm9ybWFsaXplIC5dKX0gewogICAgICAgICBwdXRzICI8RkY+IEVSUk9SOiBSdW5kaXIgbmFtaW5nIHN0eWxlIHdhcyBzZXQgdG8gXCJpbmNyZW1lbnRcIiwgYnV0IHJ1bmRpciBldmFsdWF0ZWQgdG8gXCIuXCIgZHVlIHRvOiIKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHJ1bmRpcildICYmIFtmaWxlIG5vcm1hbGl6ZSAkdmFycyhydW5kaXIpXSBlcSBbZmlsZSBub3JtYWxpemUgLl19IHsgCiAgICAgICAgICAgcHV0cyAiICAgICAgICAgICAgc2V0dGluZyB2YXJzKHJ1bmRpcikgdG8gXCIkdmFycyhydW5kaXIpXCIgaW4geW91ciBjb25maWd1cmF0aW9uIGZpbGUuIgogICAgICAgICB9IGVsc2VpZiB7W2luZm8gZXhpc3RzIGRhc2hfdV9ydW5kaXJfYmFzZV0gJiYgW2ZpbGUgbm9ybWFsaXplICRkYXNoX3VfcnVuZGlyX2Jhc2VdIGVxIFtmaWxlIG5vcm1hbGl6ZSAuXX0geyAKICAgICAgICAgICBwdXRzICIgICAgICAgICAgICB0aGUgXCItdVwiICRkYXNoX3VfcnVuZGlyX2Jhc2UgYXJndW1lbnQgdG8gZ2VuX2lubm92dXNfZmxvdy50Y2wiCiAgICAgICAgIH0gZWxzZWlmIHtbaW5mbyBleGlzdHMgdmFycyhydW5kaXJfYmFzZSldICYmIFtmaWxlIG5vcm1hbGl6ZSAkdmFycyhydW5kaXJfYmFzZSldIGVxIFtmaWxlIG5vcm1hbGl6ZSAuXX0geyAKICAgICAgICAgICBwdXRzICIgICAgICAgICAgICBzZXR0aW5nIHZhcnMocnVuZGlyX2Jhc2UpIHRvIFwiJHZhcnMocnVuZGlyX2Jhc2UpXCIgaW4geW91ciBjb25maWd1cmF0aW9uIGZpbGUuIgogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIHB1dHMgIiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHJ1bmRpciBzZXR0aW5nIHdoaWNoIGlzIFwiJGRlZl9ydW5kaXJcIiIKICAgICAgICAgfQogICAgICAgICBwdXRzICIgICAgICAgICAgICBUbyBwcmV2ZW50IHRoaXMgZXJyb3IsIHVzZSB0aGUgLXUgYXJndW1lbnQgdG8gc3BlY2lmeSBhIHJ1bmRpciBiYXNlLCBvciBzcGVjaWZ5IGEgdmFycyhydW5kaXJfYmFzZSkgaW4geW91ciBzZXR1cC50Y2wiCiAgICAgICAgIGV4aXQgOTkKICAgICAgfQogICAKICAgICAgIyAKICAgICAgIyBHZW5lcmF0ZSBuZXcgcnVuZGlyIGlmIHZhbGlkIHN0eWxlIGRlZmluZWQKICAgICAgIyAKICAgCiAgICAgICMgIC1kYXRlX3N0eWxlIDxzdHJpbmc+IChyZXF1aXJlZCB3aGVuIHN0eWxlPWRhdGUpOiB0Y2wgY29tbWFuZHMgdG8gY3JlYXRlIGEgZGF0ZSBzdHJpbmcKICAgICAgIyAgLWN1c3RvbSA8c3RyaW5nPiAob3B0aW9uYWwpOiBhIGN1c3RvbSBzdHJpbmcgdG8gcHJlcGVuZCBvciBwb3N0cGVuZCB0byB0aGUgZGlyCiAgICAgICMgIC1uYW1lX2NoYW5nZV9vcmRlciBbcHJlZml4fHN1ZmZpeF0gKHJlcXVpcmVkIHdoZW4gY3VzdG9tU3RyaW5nIGlzIGRlZmluZWQpOiBbcHJlZml4fHN1ZmZpeF0KICAgCiAgICAgICMgUmVtb3ZlIGFueSAiLy8iIGluIHRoZSBwYXRoCiAgICAgIHJlZ3N1YiAtYWxsIHtcL1wvfSAkcnVuZGlyX29yaWduYW1lIHsvfSBydW5kaXJfb3JpZ25hbWUKICAgCiAgICAgIHNldCBydW5kaXJfYmFzZW5hbWUgW2ZpbGUgdGFpbCAkcnVuZGlyX29yaWduYW1lXQogICAgICBzZXQgcnVuZGlyX2Rpcm5hbWUgW2ZpbGUgZGlybmFtZSAkcnVuZGlyX29yaWduYW1lXQogICAKICAgICAgaWYgeyRzdHlsZVR5cGUgbmUgIm5vbmUifSB7CiAgICAgICAgIHN3aXRjaCAtZXhhY3QgLS0gJHN0eWxlVHlwZSB7CiAgICAgICAgICAgZGF0ZSB7CiAgICAgICAgICAgICBpZiB7JHZhcnMocnVuZGlyX25hbWVjaGFuZ2VfbWV0aG9kKSBlcSAicHJlZml4In0gewogICAgICAgICAgICAgICBzZXQgbmV3X2Jhc2VuYW1lIFtzdWJzdCAkZGF0ZV9zdHlsZV1fJHtydW5kaXJfYmFzZW5hbWV9CiAgICAgICAgICAgICB9IGVsc2VpZiB7JHZhcnMocnVuZGlyX25hbWVjaGFuZ2VfbWV0aG9kKSBlcSAic3VmZml4In0gewogICAgICAgICAgICAgICBzZXQgbmV3X2Jhc2VuYW1lICR7cnVuZGlyX2Jhc2VuYW1lfV9bc3Vic3QgJGRhdGVfc3R5bGVdCiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICAgIGluY3JlbWVudCB7CiAgICAgICAgICAgICBzZXQgbmV3X2Jhc2VuYW1lIFtmaWxlIHRhaWwgW0ZGOjpnZW5faW5jcl9maWxlbmFtZSAkcnVuZGlyX29yaWduYW1lXV0KICAgICAgICAgICB9CiAgICAgICAgICAgY3VzdG9tIHsKICAgICAgICAgICAgIGlmIHskdmFycyhjdXN0b21fcnVuZGlyX25hbWVfYXBwZW5kKSBuZSAiIn0gewogICAgICAgICAgICAgICBpZiB7JHZhcnMocnVuZGlyX25hbWVjaGFuZ2VfbWV0aG9kKSBlcSAicHJlZml4In0gewogICAgICAgICAgICAgICAgIHNldCBuZXdfYmFzZW5hbWUgW3N1YnN0ICR2YXJzKGN1c3RvbV9ydW5kaXJfbmFtZV9hcHBlbmQpXV8ke3J1bmRpcl9iYXNlbmFtZX0KICAgICAgICAgICAgICAgfSBlbHNlaWYgeyR2YXJzKHJ1bmRpcl9uYW1lY2hhbmdlX21ldGhvZCkgZXEgInN1ZmZpeCJ9IHsKICAgICAgICAgICAgICAgICBzZXQgbmV3X2Jhc2VuYW1lICR7cnVuZGlyX2Jhc2VuYW1lfV9bc3Vic3QgJHZhcnMoY3VzdG9tX3J1bmRpcl9uYW1lX2FwcGVuZCldCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHB1dHMgIjxGRj4gTk9URTogdmFycyhjdXN0b21fcnVuZGlyX25hbWVfYXBwZW5kKSBzZXQgdG8gXCJcIi4gTm8gbW9kaWZpY2F0aW9uIHRvIHJ1bmRpciB3aWxsIG9jY3VyLiIKICAgICAgICAgICAgICAgc2V0IG5ld19iYXNlbmFtZSAkcnVuZGlyX2Jhc2VuYW1lCiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICAgIGRlZmF1bHQgewogICAgICAgICAgICAgIyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4hIChpbmRpY2F0ZXMgaW5jb3JyZWN0IHVzYWdlIHdpdGhpbiBnZW5faW5ub3Z1c19mbG93LnRjbCEpICAgIAogICAgICAgICAgICAgcHV0cyAiJGRiZ01zZyBXQVJOSU5HOiBVbmtub3duIG9wdGlvbiBmb3Igc3R5bGVUeXBlLiBVc2luZyBkZWZhdWx0IChub25lKSIKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgc2V0IHZhcnMocnVuZGlyKSBbZmlsZSBub3JtYWxpemUgW2pvaW4gIiRydW5kaXJfZGlybmFtZSAkbmV3X2Jhc2VuYW1lIiAiLyJdXQogICAgICAgICBzZXQgdmFycyhuZXdfcnVuZGlyX2Jhc2VuYW1lKSAkbmV3X2Jhc2VuYW1lCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNldCB2YXJzKHJ1bmRpcikgW2ZpbGUgbm9ybWFsaXplICRydW5kaXJfb3JpZ25hbWVdCiAgICAgIH0KICAgICAgcmV0dXJuICR2YXJzKHJ1bmRpcikgCiAgIH07IyBlbmQgcHJvYyBnZW5fbmV3X3J1bmRpcgoKICBwcm9jIHJlbFBhdGhUbyB7dGFyZ2V0IGN1cnJlbnR9IHsKICAgICNwdXRzICJjYWxsaW5nIHJlbFBhdGhUbyAkdGFyZ2V0ICRjdXJyZW50IgogICAgc2V0IGNjIFtmaWxlIHNwbGl0IFtmaWxlIG5vcm1hbGl6ZSAkY3VycmVudF1dCiAgICBzZXQgdHQgW2ZpbGUgc3BsaXQgW2ZpbGUgbm9ybWFsaXplICR0YXJnZXRdXQogICAgaWYgeyFbc3RyaW5nIGVxdWFsIFtsaW5kZXggJGNjIDFdIFtsaW5kZXggJHR0IDFdXX0gewogICAgICAgICMgbm90IG9uICpuKnggdGhlbgogICAgICAgICNyZXR1cm4gLWNvZGUgZXJyb3IgIkZGOjpyZWxQYXRoVG8oKTogRVJST1IgJHRhcmdldCBub3Qgb24gc2FtZSB2b2x1bWUgYXMgJGN1cnJlbnQiCiAgICAgICAgcmV0dXJuIFtmaWxlIG5vcm1hbGl6ZSAkdGFyZ2V0XSAKICAgIH0KICAgIHNldCBwcmVmaXggIiIKICAgIHdoaWxlIHtbc3RyaW5nIGVxdWFsIFtsaW5kZXggJGNjIDBdIFtsaW5kZXggJHR0IDBdXSAmJiBbbGxlbmd0aCAkY2NdID4gMH0gewogICAgICAjIGRpc2NhcmQgbWF0Y2hpbmcgY29tcG9uZW50cyBmcm9tIHRoZSBmcm9udCAoYnV0IGRvbid0CiAgICAgICMgZG8gdGhlIGxhc3QgY29tcG9uZW50IGluIGNhc2UgdGhlIHR3byBmaWxlcyBhcmUgdGhlIHNhbWUpCiAgICAgIHNldCBjYyBbbHJlcGxhY2UgJGNjIDAgMF0KICAgICAgc2V0IHR0IFtscmVwbGFjZSAkdHQgMCAwXQogICAgfQoKICAgICNpZiB7W2xsZW5ndGggJGNjXSA9PSAxfSB7CiAgICAjICAjIGp1c3QgdGhlIGZpbGUgbmFtZSwgc28gdGFyZ2V0IGlzIGxvd2VyIGRvd24gKG9yIGluIHNhbWUgcGxhY2UpCiAgICAjICBzZXQgcHJlZml4ICIuIgogICAgI30gICAKICAgICMgc3RlcCB1cCB0aGUgdHJlZSAoc3RhcnQgZnJvbSAxIHRvIGF2b2lkIGNvdW50aW5nIGZpbGUgaXRzZWxmCiAgICBmb3Ige3NldCBpIDF9IHskaSA8PSBbbGxlbmd0aCAkY2NdfSB7aW5jciBpfSB7CiAgICAgICAgYXBwZW5kIHByZWZpeCAiIC4uIgogICAgfQogICAgIyBzdGljayBpdCBhbGwgdG9nZXRoZXIgKHRoZSBldmFsIGlzIHRvIGZsYXR0ZW4gdGhlIHRhcmdldCBsaXN0KQogICAgaWYgeyRjYyBlcSAkdHR9IHsKICAgICAgcmV0dXJuICIuIgogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIFtldmFsIGZpbGUgam9pbiAkcHJlZml4ICR0dF0KICAgIH0KICB9CgogIHByb2MgZmxhdHRlbl9saXN0IGxpc3Qge3N0cmluZyBtYXAge1x7ICIiIFx9ICIifSAkbGlzdH0KICBwcm9jIHJlbW92ZV9vdXRlcl9icmFjZXMge2FyZ3N9IHsKICAgIGlmIHtbcmVnc3ViIHteXHt9ICRhcmdzICIiIHRtcF19IHtzZXQgYXJncyAkdG1wfQogICAgaWYge1tyZWdzdWIge1x9JH0gJGFyZ3MgIiIgdG1wXX0ge3NldCBhcmdzICR0bXB9CiAgICByZXR1cm4gJGFyZ3MKICB9CgogIHByb2MgcmVsYXRpdml6ZUZpbGVPckRpciB7YXJnc30gewogICAgI3B1dHMgInJlbGF0aXZpemVGaWxlT3JEaXIgJGFyZ3MiCiAgICBzZXQgTmV3RGlyTmFtZSAiIgogICAgc2V0IGFyck5hbWUgInZhcnMiCiAgICBzZXQgVmFyRGlyTmFtZSAiIgogICAgc2V0IHNraXBWYXJpYWJsZVVzYWdlSW5SZWZlcmVuY2UgMAogICAgc2V0IG11c3RFeGlzdCAwCiAgICBzZXQgc2tpcExpc3Qge30KICAgIHNldCBleGFjdFZhciAiIgogICAgc2V0IGV4YWN0U3ViRGlyTWF0Y2ggIiIKICAgIHNldCB2YXJUb1N1YiAiIgogICAgc2V0IHNraXBEaXJMaXN0ICIiCgogICAgd2hpbGUge1tsbGVuZ3RoICRhcmdzXSA+IDB9IHsKICAgICAgc2V0IG9wdGlvbiBbbGluZGV4ICRhcmdzIDBdCiAgICAgIHNldCBhcmdzIFtscmVwbGFjZSAkYXJncyAwIDBdCiAgICAgIHN3aXRjaCAtZXhhY3QgLS0gJG9wdGlvbiB7CiAgICAgICAgIC1hcnIgewogICAgICAgICAgICBzZXQgYXJyTmFtZSBbbGluZGV4ICRhcmdzIDBdCiAgICAgICAgICAgIHNldCBhcmdzIFtscmVwbGFjZSAkYXJncyAwIDBdCiAgICAgICAgIH0KICAgICAgICAgLXZhcmRpciB7CiAgICAgICAgICAgIHNldCBWYXJEaXJOYW1lIFtsaW5kZXggJGFyZ3MgMF0KICAgICAgICAgICAgc2V0IGFyZ3MgW2xyZXBsYWNlICRhcmdzIDAgMF0KICAgICAgICAgfQogICAgICAgICAtbmV3ZGlyIHsKICAgICAgICAgICBzZXQgTmV3RGlyTmFtZSBbbGluZGV4ICRhcmdzIDBdCiAgICAgICAgICAgc2V0IGFyZ3MgW2xyZXBsYWNlICRhcmdzIDAgMF0KICAgICAgICAgfQogICAgICAgICAtc2tpcFZhcmlhYmxlVXNhZ2VJblJlZmVyZW5jZSB7CiAgICAgICAgICAgIHNldCBza2lwVmFyaWFibGVVc2FnZUluUmVmZXJlbmNlIDEKICAgICAgICAgfQogICAgICAgICAtbXVzdEV4aXN0IHsKICAgICAgICAgICAgc2V0IG11c3RFeGlzdCAxCiAgICAgICAgIH0KICAgICAgICAgLXNraXBWYXIgewogICAgICAgICAgICBsYXBwZW5kIHNraXBMaXN0IFtsaW5kZXggJGFyZ3MgMF0KICAgICAgICAgICAgc2V0IGFyZ3MgW2xyZXBsYWNlICRhcmdzIDAgMF0KICAgICAgICAgfQogICAgICAgICAtc2tpcERpciB7CiAgICAgICAgICAgIGxhcHBlbmQgc2tpcERpckxpc3QgW2xpbmRleCAkYXJncyAwXQogICAgICAgICAgICBzZXQgYXJncyBbbHJlcGxhY2UgJGFyZ3MgMCAwXQogICAgICAgICB9CiAgICAgICAgIC12YXIgewogICAgICAgICAgICBzZXQgdmFyVG9TdWIgW2xpbmRleCAkYXJncyAwXQogICAgICAgICAgICBzZXQgYXJncyBbbHJlcGxhY2UgJGFyZ3MgMCAwXQogICAgICAgICB9CiAgICAgICAgIC1leGFjdFN1YkRpck1hdGNoIHsKICAgICAgICAgICAgc2V0IGV4YWN0U3ViRGlyTWF0Y2ggW2xpbmRleCAkYXJncyAwXQogICAgICAgICAgICBzZXQgYXJncyBbbHJlcGxhY2UgJGFyZ3MgMCAwXQogICAgICAgICB9CiAgICAgIH0KICAgIH07IyBlbmQgd2hpbGUgKHByb2Nlc3NpbmcgYXJncykKCiAgICAjIEFsd2F5cyBza2lwIHRoZSBWYXJEaXJOYW1lIHdoZW4gYW5hbHl6aW5nIHZhcmlhYmxlcyBpbiB0aGUgYXJyYXkKICAgIGxhcHBlbmQgc2tpcExpc3QgJFZhckRpck5hbWUKCiAgICAjIE5lZWQgdG8gY29udmVydCBhIGxpc3Qgb2YgZmlsZXMgdG8gcmVsYXRpdmUgcGF0aHMgKFRCRCkKICAgIGdsb2JhbCAkYXJyTmFtZQogICAgIyBDaGVjayBpZiB0aGUgdmFyZGlyIChrZXkpIGV4aXN0cyBpbiB0aGUgYXJyYXkuIElmIG5vdCwgZXhpdAogICAgaWYgeyRWYXJEaXJOYW1lIGVxICIifSB7CiAgICAgIHJldHVybiAtY29kZSBlcnJvciAicmVsYXRpdml6ZUZpbGVPckRpcigpIGNhbGxlZCB3L291dCAtdmFyZGlyIGFyZ3VtZW50LiBFeGl0aW5nIC4uLiIKICAgIH0KICAgIGlmIHskTmV3RGlyTmFtZSBlcSAiIn0gewogICAgICBzZXQgTmV3RGlyTmFtZSAkVmFyRGlyTmFtZQogICAgfQoKICAgIHNldCByZWxhdGl2aXplQ29udk1lc2dMaXN0IHt9CiAgICBpZiB7W2luZm8gZXhpc3RzICR7YXJyTmFtZX0oJFZhckRpck5hbWUpXX0gewogICAgICBmb3JlYWNoIGFyZyBbbHNvcnQgLWRpY3Rpb25hcnkgW2FycmF5IG5hbWVzICRhcnJOYW1lXV0gewogICAgICAgIGlmIHskdmFyVG9TdWIgZXEgIiIgfHwgJHZhclRvU3ViIGVxICRhcmd9IHsKICAgICAgICAgICMgZm9yZWFjaCBrZXkgKGVudHJ5KSBpbiB0aGUgYXJyYXksIGxvb2sgZm9yIGZpbGVzL2ZvbGRlcnMKICAgICAgICAgIHNldCByZSAiIgogICAgICAgICAgI3B1dHMgImxzZWFyY2ggJHNraXBMaXN0ICRhcmciCiAgICAgICAgICAjIEZpcnN0IGNoZWNrIGJsYWNrIGxpc3QKICAgICAgICAgIGlmIHtbbHNlYXJjaCAkc2tpcExpc3QgJGFyZ10gPT0gLTF9IHsKICAgICAgICAgICAgaWYgeyFbcmVnZXhwIHtcW30gW3NldCAke2Fyck5hbWV9KCRhcmcpXV19IHsKICAgICAgICAgICAgICAjIG9ubHkgY29udGludWUgaWYgdGhlIHZhcmlhYmxlIGlzIG5vdCB0aGUgdmFyZGlyIChrZXkpIGl0c2VsZiwgYW5kIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgZG9lc24ndCBoYXZlIGEgJCBpbiBpdAogICAgICAgICAgICAgICNwdXRzICJyZWxhdGl2aXplRmlsZU9yRGlyKCkgY2hlY2tpbmcgJHthcnJOYW1lfSgkYXJnKSAoY3VycmVudDogLT5bc2V0ICR7YXJyTmFtZX0oJGFyZyldPC0pIgogICAgICAgICAgICAgIHNldCB0bXBWYWx1ZSAiIgogICAgICAgICAgICAgICMKICAgICAgICAgICAgICAjIFByb2Nlc3MgYWxsIG1lbWJlcnMgb2YgdGhlICRhcnJOYW1lKGFyZykgKGNvdWxkIGJlIGEgbGlzdCksIGFuZCBzdWJzdCBlYWNoIG9uZQogICAgICAgICAgICAgICMKICAgICAgICAgICAgICBzZXQgZmlsZUZvdW5kIDAKICAgICAgICAgICAgICBzZXQgcmUgIltmaWxlIG5vcm1hbGl6ZSBbc2V0ICR7YXJyTmFtZX0oJFZhckRpck5hbWUpXV1cLyguKikiCiAgICAgICAgICAgICAgZm9yZWFjaCBwb3NzaWJsZUZpbGUgW3NldCAke2Fyck5hbWV9KCRhcmcpXSB7CiAgICAgICAgICAgICAgICBpZiB7JG11c3RFeGlzdH0gewogICAgICAgICAgICAgICAgICAjIFRoZSBmaWxlIG9yIGRpciBtdXN0IGV4aXN0IGFmdGVyIG5vcm1hbGl6YXRpb24KICAgICAgICAgICAgICAgICAgI3B1dHMgIkNoZWNraW5nIGZvciBleGlzdGVuY2Ugb2YgW2ZpbGUgbm9ybWFsaXplIFtzdWJzdCAkcG9zc2libGVGaWxlXV0iCiAgICAgICAgICAgICAgICAgIGlmIHshW2NhdGNoIHtmaWxlIGV4aXN0cyBbZmlsZSBub3JtYWxpemUgW3N1YnN0ICRwb3NzaWJsZUZpbGVdXX1dfSB7CiAgICAgICAgICAgICAgICAgICAgaWYge1tmaWxlIGV4aXN0cyBbZmlsZSBub3JtYWxpemUgW3N1YnN0ICRwb3NzaWJsZUZpbGVdXV19IHsKICAgICAgICAgICAgICAgICAgICAgICNwdXRzICJFeGlzdHM6IFtmaWxlIG5vcm1hbGl6ZSBbc3Vic3QgJHBvc3NpYmxlRmlsZV1dIgogICAgICAgICAgICAgICAgICAgICAgc2V0IGZpbGUgW2ZpbGUgbm9ybWFsaXplIFtzdWJzdCAkcG9zc2libGVGaWxlXV0KICAgICAgICAgICAgICAgICAgICAgIHNldCBzaXplIFtmaWxlIHNpemUgJGZpbGVdCiAgICAgICAgICAgICAgICAgICAgICBzZXQgbXRpbWUgW2ZpbGUgbXRpbWUgJGZpbGVdCiAgICAgICAgICAgICAgICAgICAgICBzZXQgdHlwZSBbZmlsZSB0eXBlICRmaWxlXQogICAgICAgICAgICAgICAgICAgICAgI3B1dHMgImZpbGUgJGZpbGUgc2l6ZTogJHNpemUsIG10aW1lOiAkbXRpbWUgdHlwZTogJHR5cGUiCiAgICAgICAgICAgICAgICAgICAgc2V0IGZpbGVGb3VuZCAxCiAgICAgICAgICAgICAgICAgICAgI3B1dHMgIkNoZWNraW5nIGZvciBwYXRoIHRvIGZpbGU6IC0+W2ZpbGUgbm9ybWFsaXplIFtzdWJzdCAkcG9zc2libGVGaWxlXV08LSBmcm9tIC0+W2ZpbGUgbm9ybWFsaXplIFtzZXQgJHthcnJOYW1lfSgkVmFyRGlyTmFtZSldXTwtIgogICAgICAgICAgICAgICAgICAgIHNldCByZWxQYXRoVmFsdWUgW3JlbFBhdGhUbyBbZmlsZSBub3JtYWxpemUgW3N1YnN0ICRwb3NzaWJsZUZpbGVdXSBbZmlsZSBub3JtYWxpemUgW3N1YnN0IFtzZXQgJHthcnJOYW1lfSgkVmFyRGlyTmFtZSldXV1dCiAgICAgICAgICAgICAgICAgICAgICAjcHV0cyAicmVsUGF0aFZhbHVlOiAkcmVsUGF0aFZhbHVlIgogICAgICAgICAgICAgICAgICAgIHNldCBza2lwRHVlVG9Ta2lwRGlyIDAKICAgICAgICAgICAgICAgICAgICBpZiB7JHNraXBEaXJMaXN0IG5lICIifSB7CiAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIGRpciAkc2tpcERpckxpc3QgewogICAgICAgICAgICAgICAgICAgICAgICBzZXQgcmUzICJbZmlsZSBub3JtYWxpemUgW3N1YnN0ICRkaXJdXS8oLiopIgogICAgICAgICAgICAgICAgICAgICAgICBpZiB7W3JlZ2V4cCAkcmUzIFtmaWxlIG5vcm1hbGl6ZSBbc3Vic3QgJHBvc3NpYmxlRmlsZV1dIGZ1bGwgcmVsYXRpdmVQb3J0aW9uXX0gewogICAgICAgICAgICAgICAgICAgICAgICAgIHNldCBza2lwRHVlVG9Ta2lwRGlyIDEKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiB7ISRza2lwRHVlVG9Ta2lwRGlyfSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHskZXhhY3RTdWJEaXJNYXRjaCBuZSAiIn0gewogICAgICAgICAgICAgICAgICAgICAgICAgIHNldCByZTIgIiRleGFjdFN1YkRpck1hdGNoLyguKikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgbm9ybWFsaXplZCBwYXRoIG9mIHRoZSBwb3NzaWJsZSBmaWxlIGhhcyB0byBtYXRjaCB0aGUgbm9ybWFsaXplZCBwYXRoIG9mIHRoZSBzdWJkaXIuLi4KICAgICAgICAgICAgICAgICAgICAgICAgaWYge1tyZWdleHAgJHJlMiBbZmlsZSBub3JtYWxpemUgW3N1YnN0ICRwb3NzaWJsZUZpbGVdXSBmdWxsIHJlbGF0aXZlUG9ydGlvbl19IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHskcmVsUGF0aFZhbHVlIG5lIFtmaWxlIG5vcm1hbGl6ZSAkcG9zc2libGVGaWxlXX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgeyRza2lwVmFyaWFibGVVc2FnZUluUmVmZXJlbmNlfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcHBlbmQgdG1wVmFsdWUgJHJlbFBhdGhWYWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwcGVuZCB0bXBWYWx1ZSAiXCQke2Fyck5hbWV9KCRWYXJEaXJOYW1lKS8kcmVsUGF0aFZhbHVlIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBwZW5kIHRtcFZhbHVlICRwb3NzaWJsZUZpbGUKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBwZW5kIHRtcFZhbHVlICRwb3NzaWJsZUZpbGUKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgI3B1dHMgInNraXBWYXJpYWJsZVVzYWdlSW5SZWZlcmVuY2U6ICRza2lwVmFyaWFibGVVc2FnZUluUmVmZXJlbmNlIgogICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHskcmVsUGF0aFZhbHVlIG5lIFtmaWxlIG5vcm1hbGl6ZSAkcG9zc2libGVGaWxlXX0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgeyRza2lwVmFyaWFibGVVc2FnZUluUmVmZXJlbmNlfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcHBlbmQgdG1wVmFsdWUgJHJlbFBhdGhWYWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwcGVuZCB0bXBWYWx1ZSAiXCQke2Fyck5hbWV9KCRWYXJEaXJOYW1lKS8kcmVsUGF0aFZhbHVlIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBwZW5kIHRtcFZhbHVlICRwb3NzaWJsZUZpbGUKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgI3B1dHMgImZpbmFsIHZhbHVlOiAtPiR0bXBWYWx1ZTwtIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgIGxhcHBlbmQgdG1wVmFsdWUgJHBvc3NpYmxlRmlsZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgIyBjb3VsZCBub3QgYmUgdGVzdGVkIGFzIGEgZmlsZSwgc28ganVzdCBsYXBwZW5kIHRoZSBlbnRpcmUgc3RyaW5nCiAgICAgICAgICAgICAgICAgICAgICBsYXBwZW5kIHRtcFZhbHVlICRwb3NzaWJsZUZpbGUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIyBjb3VsZCBub3QgYmUgdGVzdGVkIGFzIGEgZmlsZSwgc28ganVzdCBsYXBwZW5kIHRoZSBlbnRpcmUgc3RyaW5nCiAgICAgICAgICAgICAgICAgICAgbGFwcGVuZCB0bXBWYWx1ZSAkcG9zc2libGVGaWxlCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICMgVGhlIGZpbGUgb3IgZGlyIG5lZWQgbm90IGV4aXN0LCBidXQgdGhlIHZhcmRpciBtdXN0IGJlIGEgc3ViZGlyIChpLmUuLCB0aGVyZSBtdXN0IGJlIGEgc3ViZGlyIHRoYXQgZG9lcyBleGlzdCkKICAgICAgICAgICAgICAgICAgI3B1dHMgIkNoZWNraW5nIHBvc3NpYmxlIGZpbGU6IC0+W3N1YnN0ICRwb3NzaWJsZUZpbGVdPC0gYWdhaW5zdCByZWd1bGFyIGV4cHJlc3Npb24gLT4kcmU8LSIKICAgICAgICAgICAgICAgICAgaWYge1tyZWdleHAgJHJlIFtzdWJzdCAkcG9zc2libGVGaWxlXSBmdWxsIHJlbGF0aXZpemVkUG9ydGlvbl19IHsKICAgICAgICAgICAgICAgICAgICBpZiB7JHJlbGF0aXZpemVkUG9ydGlvbiBlcSAiIn0geyBzZXQgcmVsYXRpdml6ZWRQb3J0aW9uICIuIn0KICAgICAgICAgICAgICAgICAgICBzZXQgZmlsZUZvdW5kIDEKICAgICAgICAgICAgICAgICAgICBpZiB7JHNraXBWYXJpYWJsZVVzYWdlSW5SZWZlcmVuY2V9IHsKICAgICAgICAgICAgICAgICAgICAgIGxhcHBlbmQgdG1wVmFsdWUgJHJlbGF0aXZpemVkUG9ydGlvbgogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICBsYXBwZW5kIHRtcFZhbHVlICJcJCR7YXJyTmFtZX0oJFZhckRpck5hbWUpLyRyZWxhdGl2aXplZFBvcnRpb24iCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIHtbZmxhdHRlbl9saXN0ICRwb3NzaWJsZUZpbGVdIG5lIFtmbGF0dGVuX2xpc3QgJHRtcFZhbHVlXX0gewogICAgICAgICAgICAgICAgICAgICAgI3B1dHMgIjxGRj4gSU5GTyBDb252ZXJ0ZWQgZmlsZSAkcG9zc2libGVGaWxlIHRvIHVzZSBhIHJlbGF0aXZlIHBhdGggdG8gZGV0ZXJtaW5lIGl0J3MgbG9jYXRpb246ICR0bXBWYWx1ZSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgbGFwcGVuZCB0bXBWYWx1ZSAkcG9zc2libGVGaWxlCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIyBJZiB0aGUgYWJvdmUgZm9yIGxvb3AgZGlkbid0IGZpbmQgYW55IGZpbGVzLCBzaW1wbHkgcmVzZXQgdGhlIGFyck5hbWUoYXJnKSBzdGF0ZW1lbnQKICAgICAgICAgICAgICBpZiB7JGZpbGVGb3VuZH0gewogICAgICAgICAgICAgICAgIyBDbGVhbiB1cCBvcmlnaW5hbCBhcnJOYW1lKGFyZykgYW5kIHN1YmInZWQgdmFsdWUgdG8gcHJlcGFyZSBmb3IgY29tcGFyaXNvbgogICAgICAgICAgICAgICAgc2V0IHRlc3RBcmcgW2ZsYXR0ZW5fbGlzdCBbc2V0ICR7YXJyTmFtZX0oJGFyZyldXQogICAgICAgICAgICAgICAgcmVnc3ViIC1hbGwge1sgXHJcdFxuXFxdK30gJHRlc3RBcmcgIiAiIHRlc3RBcmcKICAgICAgICAgICAgICAgIHJlZ3N1YiB7XlxzKyguKil9ICR0ZXN0QXJnIHtcMX0gdGVzdEFyZwogICAgICAgICAgICAgICAgcmVnc3ViIHsoLiopXHMrJH0gJHRlc3RBcmcge1wxfSB0ZXN0QXJnCgogICAgICAgICAgICAgICAgc2V0IHRtcFZhbHVlIFtmbGF0dGVuX2xpc3QgJHRtcFZhbHVlXQogICAgICAgICAgICAgICAgcmVnc3ViIC1hbGwge1sgXHJcdFxuXSt9ICR0bXBWYWx1ZSAiICIgdG1wVmFsdWUKICAgICAgICAgICAgICAgIHJlZ3N1YiB7XlxzKyguKil9ICR0bXBWYWx1ZSB7XDF9IHRtcFZhbHVlCiAgICAgICAgICAgICAgICByZWdzdWIgeyguKilccyskfSAkdG1wVmFsdWUge1wxfSB0bXBWYWx1ZQogICAgICAgICAgICAgICAgaWYgeyR0bXBWYWx1ZSBuZSAiIiAmJiAkdG1wVmFsdWUgbmUgJHRlc3RBcmd9IHsKICAgICAgICAgICAgICAgICAgI3B1dHMgIjxGRj4gSU5GTyBPcmlnaW5hbCB2YWx1ZSBmb3IgYXJyTmFtZSgkYXJnKTogLT4kdGVzdEFyZzwtIgogICAgICAgICAgICAgICAgICBpZiB7JHJlbGF0aXZpemVDb252TWVzZ0xpc3QgZXEgIiJ9IHsKICAgICAgICAgICAgICAgICAgICAgbGFwcGVuZCByZWxhdGl2aXplQ29udk1lc2dMaXN0ICIjIFZhcmlhYmxlIGNvbnZlcnNpb24gZm9yIHBhdGhzIHJlbGF0aXZlIHRvIFwkJHthcnJOYW1lfSgkVmFyRGlyTmFtZSkgKFtzZXQgJHthcnJOYW1lfSgkVmFyRGlyTmFtZSldKSIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBsYXBwZW5kIHJlbGF0aXZpemVDb252TWVzZ0xpc3QgIjxGRj4gSU5GTyBDb252ZXJ0ZWQgZmlsZSB2YXJpYWJsZSBbc3Vic3QgJGFyck5hbWVdKCRhcmcpIGZyb20gW3NldCAke2Fyck5hbWV9KCRhcmcpXSB0byAkdG1wVmFsdWUiCiAgICAgICAgICAgICAgICAgIHNldCAke2Fyck5hbWV9KCRhcmcpICR0bXBWYWx1ZQogICAgICAgICAgICAgICAgICAjcHV0cyAiPEZGPiBJTkZPIEZpbmFsIHZhbHVlIGZvciBhcnJOYW1lKCRhcmcpOiAgICAtPiR0bXBWYWx1ZTwtIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYge1tsbGVuZ3RoICRyZWxhdGl2aXplQ29udk1lc2dMaXN0XSA+IDF9IHsKICAgICAgbGFwcGVuZCByZWxhdGl2aXplQ29udk1lc2dMaXN0ICIjIFRvdGFsIGNvbnZlcnRlZCBmb3IgdmFyaWFibGUgW3NldCAke2Fyck5hbWV9KCRWYXJEaXJOYW1lKV06W2V4cHIge1tsbGVuZ3RoICRyZWxhdGl2aXplQ29udk1lc2dMaXN0XS0xfV0iCiAgICB9CiAgICByZXR1cm4gJHJlbGF0aXZpemVDb252TWVzZ0xpc3QKICB9CiAgIHByb2MgZGVub3JtYWxpemVfcnVuZGlyIHt9IHsKCiAgICAgIGdsb2JhbCB2YXJzCgogICAgICAjc2V0IG9wIFtvcGVuICR2YXJzKHJ1bmRpcikvLmZmLnRjbCB3XQogICAgICAjIyBCQ0w6IGFkZGVkIEZvdW5kYXRpb24gRmxvdyBleGVjdXRpb24gZGlyCiAgICAgICNwdXRzICRvcCAiIyBGb3VuZGF0aW9uIEZsb3cgQ29kZWdlbiBSZWNvcmQuIgogICAgICAjcHV0cyAkb3AgIiMgRXhlY3V0ZWQgb24gW2V4ZWMgZGF0ZV0gYnkgdXNlcjogW2V4ZWMgd2hvYW1pXSIKICAgICAgI3B1dHMgJG9wICIjIENvcHlyaWdodCAyMDExLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zLCBJbmMuIgogICAgICAjcHV0cyAkb3AgIiMgQWxsIFJpZ2h0cyBSZXNlcnZlZCIKICAgICAgI3B1dHMgJG9wICIiCiAgICAgICNwdXRzICRvcCAiIyBJbnB1dHMgdG8gY29kZSBnZW5lcmF0aW9uOiIKICAgICAgI3B1dHMgJG9wICIjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCiAgICAgICNwdXRzICRvcCAic2V0IHZhcnMoZmZfZXhlX2RpcikgXCJbZXhlYyBwd2RdXCIiCiAgICAgICMjcHV0cyAkb3AgInNldCB2YXJzKGZmX2RpcikgW2ZpbGUgZGlybmFtZSAkdmFycyhzY3JpcHRfcGF0aCldIgogICAgICAjIyBCQ0w6IHJlbW92ZWQgZmZfZGlyLCBjaGFuZ2VkIHRvIHNjcmlwdF9wYXRoIChmZl9kaXIgd2FzIHJlYWxseSByZWR1bmRhbnQpCiAgICAgICNwdXRzICRvcCAic2V0IHZhcnMoc2NyaXB0X3BhdGgpIFwiW2ZpbGUgbm9ybWFsaXplICR2YXJzKHNjcmlwdF9wYXRoKV1cIiIKICAgICAgIyMgQkNMOiBhZGRlZCB2YXJpYWJsZSByZWZlcmVuY2luZyBvZiBjb25maWdfZmlsZXMKICAgICAgI3NldCBjd2QgIiIKICAgICAgI2NhdGNoIHtzZXQgY3dkIFtleGVjIHB3ZF19CiAgICAgICNmb3JlYWNoIGNvbmZpZ0ZpbGUgW3N1YnN0ICR2YXJzKGNvbmZpZ19maWxlcyldIHsKICAgICAgIyAgI3B1dHMgIlByb2Nlc3NpbmcgJGNvbmZpZ0ZpbGUiCiAgICAgICMgIGlmIHtbZmlsZSBkaXJuYW1lIFtmaWxlIG5vcm1hbGl6ZSAkY29uZmlnRmlsZV1dIGVxICRjd2R9IHsKICAgICAgIyAgICBsYXBwZW5kIGNvbmZpZ0ZpbGVMaXN0ICJcW3N1YnN0IFwkdmFycyhmZl9leGVfZGlyKVxdL1tmaWxlIHRhaWwgJGNvbmZpZ0ZpbGVdIgogICAgICAjICB9IGVsc2VpZiB7W0ZGOjpyZWxQYXRoVG8gW2ZpbGUgbm9ybWFsaXplICRjb25maWdGaWxlXSAkY3dkXSBlcSBbZmlsZSBub3JtYWxpemUgW3N1YnN0ICRjb25maWdGaWxlXV19IHsKICAgICAgIyAgICBsYXBwZW5kIGNvbmZpZ0ZpbGVMaXN0IFtmaWxlIG5vcm1hbGl6ZSAkY29uZmlnRmlsZV0KICAgICAgIyAgfSBlbHNlIHsKICAgICAgIyAgICAjIFVzZSB0aGUgcmVsYXRpdmUgcGF0aCBuYW1lIGZyb20gZmZfZXhlX2RpcgogICAgICAjICAgIGxhcHBlbmQgY29uZmlnRmlsZUxpc3QgIlxbc3Vic3QgXCR2YXJzKGZmX2V4ZV9kaXIpXF0vW0ZGOjpyZWxQYXRoVG8gW2ZpbGUgbm9ybWFsaXplIFtzdWJzdCAkY29uZmlnRmlsZV1dICRjd2RdIgogICAgICAjICB9CiAgICAgICN9CiAgICAgICNwdXRzICRvcCAic2V0IHZhcnMoY29uZmlnX2ZpbGVzKSBcIltGRjo6ZmxhdHRlbl9saXN0ICRjb25maWdGaWxlTGlzdF1cIiIKICAgICAgIyMgQkNMOiBhZGRlZCB2YXJpYWJsZSByZWZlcmVuY2luZyBvZiBwbHVnIGRpcnMKICAgICAgI2lmIHtbZmlsZSBkaXJuYW1lIFtmaWxlIG5vcm1hbGl6ZSAkdmFycyhwbHVnX2RpcildXSBlcSAkY3dkfSB7CiAgICAgICMgICMgcGx1Z19kaXIgaXMgbG9jYXRlZCBpbiBmZl9leGVfZGlyCiAgICAgICMgIHB1dHMgJG9wICJzZXQgdmFycyhwbHVnX2RpcikgXCJcJHZhcnMoZmZfZXhlX2RpcikvJHZhcnMocGx1Z19kaXIpXCIiCiAgICAgICN9IGVsc2VpZiB7W0ZGOjpyZWxQYXRoVG8gW2ZpbGUgbm9ybWFsaXplICR2YXJzKHBsdWdfZGlyKV0gJGN3ZF0gZXEgW2ZpbGUgbm9ybWFsaXplICR2YXJzKHBsdWdfZGlyKV19IHsKICAgICAgIyAgIyBwbHVnX2RpciBjYW5ub3QgYmUgcmVmZXJlbmNlZCB1c2luZyBhIHJlbGF0aXZlIHBhdGgKICAgICAgIyAgcHV0cyAkb3AgInNldCB2YXJzKHBsdWdfZGlyKSBcIltmaWxlIG5vcm1hbGl6ZSAkdmFycyhwbHVnX2RpcildXCIiCiAgICAgICN9IGVsc2UgewogICAgICAjICAjIFVzZSB0aGUgcmVsYXRpdmUgcGF0aCBuYW1lIGZyb20gZmZfZXhlX2RpcgogICAgICAjICBwdXRzICRvcCAic2V0IHZhcnMocGx1Z19kaXIpIFwiXCR2YXJzKGZmX2V4ZV9kaXIpL1tGRjo6cmVsUGF0aFRvIFtmaWxlIG5vcm1hbGl6ZSAkdmFycyhwbHVnX2RpcildICRjd2RdXCIiCiAgICAgICN9CiAgICAgICNpZiB7W2luZm8gZXhpc3RzIHZhcnMocmNfcGx1Z19kaXIpXX0gewogICAgICAjICAgaWYge1tmaWxlIGRpcm5hbWUgW2ZpbGUgbm9ybWFsaXplICR2YXJzKHJjX3BsdWdfZGlyKV1dIGVxICRjd2R9IHsKICAgICAgIyAgICAgIyByY19wbHVnX2RpciBpcyBsb2NhdGVkIGluIGZmX2V4ZV9kaXIKICAgICAgIyAgICAgcHV0cyAkb3AgInNldCB2YXJzKHJjX3BsdWdfZGlyKSBcIlwkdmFycyhmZl9leGVfZGlyKS8kdmFycyhyY19wbHVnX2RpcilcIiIKICAgICAgIyAgIH0gZWxzZWlmIHtbRkY6OnJlbFBhdGhUbyBbZmlsZSBub3JtYWxpemUgJHZhcnMocmNfcGx1Z19kaXIpXSAkY3dkXSBlcSBbZmlsZSBub3JtYWxpemUgJHZhcnMocmNfcGx1Z19kaXIpXX0gewogICAgICAjICAgICMgcmNfcGx1Z19kaXIgY2Fubm90IGJlIHJlZmVyZW5jZWQgdXNpbmcgYSByZWxhdGl2ZSBwYXRoCiAgICAgICMgICAgcHV0cyAkb3AgInNldCB2YXJzKHJjX3BsdWdfZGlyKSBcIltmaWxlIG5vcm1hbGl6ZSAkdmFycyhyY19wbHVnX2RpcildXCIiCiAgICAgICMgIH0gZWxzZSB7CiAgICAgICMgICAgIyBVc2UgdGhlIHJlbGF0aXZlIHBhdGggbmFtZSBmcm9tIGZmX2V4ZV9kaXIKICAgICAgIyAgICBwdXRzICRvcCAic2V0IHZhcnMocmNfcGx1Z19kaXIpIFwiXCR2YXJzKGZmX2V4ZV9kaXIpL1tGRjo6cmVsUGF0aFRvIFtmaWxlIG5vcm1hbGl6ZSAkdmFycyhyY19wbHVnX2RpcildICRjd2RdXCIiCiAgICAgICMgICB9CiAgICAgICN9CiAgICAgICMjIEJDTDogYWRkZWQgdmFycyhydW5kaXIpCiAgICAgICNwdXRzICRvcCAiIgogICAgICAjcHV0cyAkb3AgIiMgT3V0cHV0cyBmcm9tIGNvZGUgZ2VuZXJhdGlvbjoiCiAgICAgICNwdXRzICRvcCAiIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgogICAgICAjcHV0cyAkb3AgInNldCB2YXJzKHJ1bmRpcikgXCJcW2ZpbGUgbm9ybWFsaXplIFxbZmlsZSBkaXJuYW1lIFxbaW5mbyBzY3JpcHRcXVxdXF1cIiIKICAgICAgI3B1dHMgJG9wICJzZXQgdmFycyhjb2RlZ2VuX2RpcikgXCJbRkY6OnJlbFBhdGhUbyBbZmlsZSBub3JtYWxpemUgJHZhcnMoc2NyaXB0X2RpcildIFtmaWxlIG5vcm1hbGl6ZSAkdmFycyhydW5kaXIpXV1cIiIKICAgICAgI3B1dHMgJG9wICJzZXQgdmFycyhzY3JpcHRfZGlyKSBcIltGRjo6cmVsUGF0aFRvIFtmaWxlIG5vcm1hbGl6ZSAkdmFycyhzY3JpcHRfZGlyKV0gW2ZpbGUgbm9ybWFsaXplICR2YXJzKHJ1bmRpcildXVwiIgogICAgICAjY2xvc2UgJG9wCgogICAgICBpZiB7JHZhcnModXNlcl9tb2RlKSA9PSAiaGllciJ9IHsKICAgICAgICAgI2ZvcmVhY2ggYmxvY2sgW2NvbmNhdCAkdmFycyhkZXNpZ24pICR2YXJzKHBhcnRpdGlvbl9saXN0KV0gewogICAgICAgICAjICAgZmlsZSBjb3B5IC1mb3JjZSAuZmYudGNsICR2YXJzKHBhcnRpdGlvbl9kaXIpLyRibG9jawogICAgICAgICAjfQojICAgICAgICAgaWYgeygkdmFycyhoaWVyX2Zsb3dfdHlwZSkgPT0gIjJwYXNzIikgJiYgISR2YXJzKGVuYWJsZV9mbGV4aWxtKX0gewojICAgICAgICAgICAgZm9yZWFjaCBibG9jayBbY29uY2F0ICR2YXJzKGRlc2lnbikgJHZhcnMocGFydGl0aW9uX2xpc3QpXSB7CiMgICAgICAgICAgICAgICBmaWxlIGNvcHkgLWZvcmNlICR2YXJzKHBhcnRpdGlvbl9kaXIpLyRibG9jay9NYWtlZmlsZS5wYXNzMiAkdmFycyhwYXJ0aXRpb25fZGlyX3Bhc3MyKS8kYmxvY2svTWFrZWZpbGUKIyAgICAgICAgICAgICAgIGZpbGUgY29weSAtZm9yY2UgJHZhcnMocGFydGl0aW9uX2RpcikvJGJsb2NrL01ha2VmaWxlLnBhc3MyICR2YXJzKHNjcmlwdF9kaXIpLyRibG9jay5NYWtlZmlsZQojICAgICAgICAgICAgICAgZmlsZSBkZWxldGUgJHZhcnMocGFydGl0aW9uX2RpcikvJGJsb2NrL01ha2VmaWxlLnBhc3MyCiMgICAgICAgICAgICB9CiMgICAgICAgICB9CiAgICAgIH0KICAgfQoKICAgcHJvYyBjaGVja190Y2xfdmVyc2lvbiB7fSB7CiAgICAgIHNldCB0Y2xfdmVyc2lvbiBbaW5mbyB0Y2x2ZXJzaW9uXQogICAgICBzZXQgdHZlcnNpb24gW3NwbGl0ICR0Y2xfdmVyc2lvbiAiLiJdCiAgICAgIHNldCBtYWpvciBbbGluZGV4ICR0dmVyc2lvbiAwXQogICAgICBzZXQgbWlub3IgW2xpbmRleCAkdHZlcnNpb24gMV0KICAgICAgc2V0IHZhbGlkX3ZlcnNpb24gMQogICAgICBpZiB7JG1ham9yICE9ICI4In0gewogICAgICAgICBzZXQgdmFsaWRfdmVyc2lvbiAwCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIHtbZXhwciAkbWlub3JdIDwgNH0gewogICAgICAgICAgICBzZXQgdmFsaWRfdmVyc2lvbiAwCiAgICAgICAgIH0KICAgICAgfQogICAgICBpZiB7ISR2YWxpZF92ZXJzaW9ufSB7CiAgICAgICAgIHB1dHMgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCiAgICAgICAgIHB1dHMgIjxGRj4gRVJST1I6IFRDTCBWRVJTSU9OIE1VU1QgQkUgOC40IE9SIEdSRUFURVIuIgogICAgICAgICBwdXRzICIgICAgICAgICAgICBZT1VSIFRDTCBWRVJTSU9OIElTICR0Y2xfdmVyc2lvbi4iCiAgICAgICMgICBwdXRzICIgICAgICAgICAgICBQTEVBU0UgUlVOIFRIRSBGTE9XIEdFTkVSQVRPUiBVU0lORyIKICAgICAgIyAgIHB1dHMgIiAgICAgICAgICAgIElOTk9WVVMgKFdJVEggLWUgT1BUSU9OKSIKICAgICAgICAgcHV0cyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKICAgICAgICAgZXhpdCAtMQogICAgICB9IGVsc2UgewojICAgICAgICAgcHV0cyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKIyAgICAgICAgIHB1dHMgIjxGRj4gIFRDTCBWRVJTSU9OIC0+ICR0Y2xfdmVyc2lvbiIKIyAgICAgICAgIHB1dHMgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCiAgICAgIH0KICAgfQoKICAgcHJvYyBjcmVhdGVfZmxvdyB7YXJndn0gewogICAKICAgICAgZ2xvYmFsIHZhcnMKICAgICAgZ2xvYmFsIGluZm9zCiAgICAgIGdsb2JhbCB3YXJuaW5ncwogICAgICBnbG9iYWwgZXJyb3JzCiAgICAgIGdsb2JhbCBjaGVjawogICAgICBnbG9iYWwgZGFyZ3MgCiAgICAgIGdsb2JhbCBmYXJncyAKICAgICAgZ2xvYmFsIGFyZ3YwCiAgICAgIGdsb2JhbCBlbnYKCiAgICAgIHNldCBvcmlnX2FyZ3YgJGFyZ3YKICAgCiAgICAgIGludGVycCBhbGlhcyB7fSBQdXRzIHt9IHB1dHMKCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAjIFBhcnNlIHRoZSBhcmd1bWVudHMgcGFzc2VkIGluIHRvIHRoZSBzY3JpcHQuICBUaGVzZSBzZXQgdXAgdGhlIGVudmlyb25tZW50ICMKICAgICAgIyBmb3IgdGhlIHJlc3Qgb2YgdGhlIHN5c3RlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAKICAgICAgc2V0IHZhcnMoYXJnX2xpc3QpIFtsaXN0IFwKICAgICAgICAgY29kZWdlbiBcCiAgICAgICAgIGVkaSBcCiAgICAgICAgIGZsYXQgXAogICAgICAgICBtYWtlZmlsZSBcCiAgICAgICAgIG1vZGUgXAogICAgICAgICByYyBcCiAgICAgICAgIG5vdnVzIFwKICAgICAgICAgc3ludGhfZmxvdyBcCiAgICAgICAgIHJ1bmRpciBcCiAgICAgICAgIHNjcmlwdF9kaXIgXAogICAgICAgICBzdHlsZSBcCiAgICAgICAgIHVzZXJfbW9kZSBcCiAgICAgICAgIHZlcmJvc2UgXAogICAgICAgICB2ZXJzaW9uIFwKICAgICAgXQogICAgICAKICAgICAgc2V0IHZhcnMoY2hlY2tfc2V0dXApIDEKICAgCiAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcnMoc2NyaXB0X3BhdGgpXX0gewogICAgICAgICBzZXQgdmFycyhzY3JpcHRfcGF0aCkgIiIKICAgICAgfQogICAgICBzZXQgbm9ybWFsaXplZCBbZmlsZSBub3JtYWxpemUgJGFyZ3YwXQogICAgICBpZiB7W2ZpbGUgaXNkaXJlY3RvcnkgJG5vcm1hbGl6ZWRdfSB7CiAgICAgICAgIHNldCBkZWZhdWx0X3NjcmlwdF9wYXRoICRub3JtYWxpemVkCiAgICAgIH0gZWxzZWlmIHtbZmlsZSBpc2RpcmVjdG9yeSBbZmlsZSBkaXJuYW1lICRub3JtYWxpemVkXV19IHsKICAgICAgICAgc2V0IGRlZmF1bHRfc2NyaXB0X3BhdGggW2ZpbGUgZGlybmFtZSAkbm9ybWFsaXplZF0KICAgICAgfQogICAKICAgICAgaWYge1tpbmZvIGV4aXN0cyBlbnYoRkZfU0VUVVBfUEFUSCldICYmIFtmaWxlIGV4aXN0cyAkZW52KEZGX1NFVFVQX1BBVEgpXX0gewogICAgICAgICBzZXQgc2V0dXBfcGF0aCAkZW52KEZGX1NFVFVQX1BBVEgpCiAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNldCBzZXR1cF9wYXRoICIuIgogICAgICB9CiAgIAogICAgICBpZiB7IVtpbmZvIGV4aXN0cyBhcmd2XSB8fCAhW2xsZW5ndGggJGFyZ3ZdfSB7CiAgICAgICAgIHNldCBhcmd2ICItaCIKICAgICAgfQogICAKICAgICAgc2V0IHZhcnMoZm9ybWF0X2xpbmVzKSB0cnVlCiAgIAogICAgICB3aGlsZSB7W3N0cmluZyBtYXRjaCAiLSoiIFtsaW5kZXggJGFyZ3YgMF1dfSB7CiAgICAgICAgIGlmIHshW2xsZW5ndGggJGFyZ3ZdfSB7CiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgIH0KICAgICAgICAgc2V0IG9wdGlvbiBbbGluZGV4ICRhcmd2IDBdCiAgICAgICAgIHNldCBhcmd2IFtscmVwbGFjZSAkYXJndiAwIDBdCiAgIAogICAgICAgICBzd2l0Y2ggLXJlZ2V4cCAtLSAkb3B0aW9uIHsKICAgICAgICAgICAgXi0oaHwtaGVscCkkIHsKICAgICAgICAgICAgICAgcHV0cyAkRkZNTTo6dXNhZ2UKICAgICAgICAgICAgICAgZXhpdCAwCiAgICAgICAgICAgIH0KICAgCiAgICAgICAgICAgIF4tKG18LW1vZGUpJCB7CiAgICAgICAgICAgICAgICMKICAgICAgICAgICAgICAgIyBTcGVjaWZ5IHRoZSBydW50aW1lIG1vZGUuCiAgICAgICAgICAgICAgICMKICAgCiAgICAgICAgICAgICAgIGlmIHtbbGxlbmd0aCAkYXJndl19IHsKICAgICAgICAgICAgICAgICAgc2V0IG5ld01vZGUgW2xpbmRleCAkYXJndiAwXQogICAgICAgICAgICAgICAgICBzZXQgYXJndiBbbHJlcGxhY2UgJGFyZ3YgMCAwXQogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBwdXRzICRGRk1NOjpub01vZGUKICAgICAgICAgICAgICAgICAgcHV0cyAkRkZNTTo6dXNhZ2UKICAgICAgICAgICAgICAgICAgZXhpdCAtMQogICAgICAgICAgICAgICB9CiAgIAogICAgICAgICAgICAgICAjCiAgICAgICAgICAgICAgICMgVGhlIG1vZGUgbmVlZHMgdG8gYmUgb25lIG9mIHRoZSByZWNvZ25pemVkIG1vZGVzCiAgICAgICAgICAgICAgICMKICAgCiAgICAgICAgICAgICAgIGlmIHtbbHNlYXJjaCBbY29uY2F0ICJ1c2VyIiAiaGllciIgJEZGTU06OnZhbGlkTW9kZXNdICRuZXdNb2RlXSA9PSAtMX0gewogICAgICAgICAgICAgICAgICBwdXRzIFtmb3JtYXQgJEZGTU06OnVua25vd25Nb2RlICRuZXdNb2RlXQogICAgICAgICAgICAgICAgICBwdXRzICRGRk1NOjp1c2FnZQogICAgICAgICAgICAgICAgICBleGl0IC0xMTEKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBzZXQgbW9kZSAkbmV3TW9kZQogICAgICAgICAgICAgICBwdXRzICI8RkY+IEZMT1cgTU9ERSA9PSAkbW9kZSIKICAgICAgICAgICAgfQogICAgICAgICAgICBeLShufC1ub21ha2UpJCB7CiAgICAgICAgICAgICAgICMKICAgICAgICAgICAgICAgIyBTa2lwIE1ha2VmaWxlIGdlbmVyYXRpb24KICAgICAgICAgICAgICAgIwogICAKICAgICAgICAgICAgICAgc2V0IG1ha2VmaWxlIGZhbHNlCiAgICAgICAgICAgICAgIHB1dHMgIjxGRj4gR0VORVJBVEUgTUFLRUZJTEUgPT0gJG1ha2VmaWxlIgogICAgICAgICAgICB9CiAgICAgICAgICAgIF4tKHJ8LXJ0bCkkIHsKICAgICAgICAgICAgICAgIwogICAgICAgICAgICAgICAjIEVuYWJsZSBHZW51cyBDb2RlZ2VuCiAgICAgICAgICAgICAgICMKICAgCiAgICAgICAgICAgICAgIHNldCByYyB0cnVlCiAgICAgICAgICAgICAgIHB1dHMgIjxGRj4gUlRsIFNDUklQVFMgPT0gJHJjIgogICAgICAgICAgICB9CiAgICAgICAgICAgIF4tKE58LU5vdnVzKSQgewogICAgICAgICAgICAgICAjCiAgICAgICAgICAgICAgICMgRW5hYmxlIE5vdnVzIFN5bnRheAogICAgICAgICAgICAgICAjCiAgIAogICAgICAgICAgICAgICBzZXQgbm92dXMgdHJ1ZQogICAgICAgICAgICAgICBwdXRzICI8RkY+IE5PVlVTIFNDUklQVFMgPT0gJG5vdnVzIgogICAgICAgICAgICB9CiMgICAgICAgICAgICBeLShsfC1mbG93KSQgewojICAgICAgICAgICAgICAgaWYge1tsbGVuZ3RoICRhcmd2XX0gewojICAgICAgICAgICAgICAgICAgc2V0IHN5bnRoX2Zsb3cgW2xpbmRleCAkYXJndiAwXQojICAgICAgICAgICAgICAgICAgc2V0IGFyZ3YgW2xyZXBsYWNlICRhcmd2IDAgMF0KIyAgICAgICAgICAgICAgIH0gZWxzZSB7CiMgICAgICAgICAgICAgICAgICBwdXRzICRGRk1NOjpub3N5bnRoX2Zsb3cKIyAgICAgICAgICAgICAgIH0KIyAgICAgICAgICAgIH0KIyAgICAgICAgICAgIF4tKGF8YXBwbGV0cykkIHsKIyAgICAgICAgICAgICAgICMKIyAgICAgICAgICAgICAgICMgRGVmaW5lIHRoZSBhcHBsZXRzIGRpcmVjdG9yeSBwYXRoCiMgICAgICAgICAgICAgICAjCiMgICAKIyAgICAgICAgICAgICAgIGlmIHtbbGxlbmd0aCAkYXJndl19IHsKIyAgICAgICAgICAgICAgICAgIHNldCBhcHBsZXRzRGlyIFtsaW5kZXggJGFyZ3YgMF0KIyAgICAgICAgICAgICAgICAgIHNldCBhcmd2IFtscmVwbGFjZSAkYXJndiAwIDBdCiMgICAgICAgICAgICAgICB9IGVsc2UgewojICAgICAgICAgICAgICAgICAgcHV0cyAkRkZNTTo6bm9BcHBsZXRQYXRoCiMgICAgICAgICAgICAgICAgICBleGl0IC0xCiMgICAgICAgICAgICAgICB9CiMgICAKIyAgICAgICAgICAgICAgIHB1dHMgIjxGRj4gQVBQTEVUUyBESVJFQ1RPUlkgPT0gJGFwcGxldHNEaXIiCiMgICAgICAgICAgICAgICBzZXQgdmFycyhhcHBsZXRzX2RpcikgJGFwcGxldHNEaXIKIyAgICAgICAgICAgIH0KICAgICAgICAgICAgXi0odnwtdmVyc2lvbikkIHsKICAgICAgICAgICAgICAgIwogICAgICAgICAgICAgICAjIFNldCB0aGUgdGFyZ2V0IElubm92dXMgdmVyc2lvbgogICAgICAgICAgICAgICAjCiAgIAogICAKICAgICAgICAgICAgICAgaWYge1tsbGVuZ3RoICRhcmd2XX0gewogICAgICAgICAgICAgICAgICBzZXQgdmVyc2lvbiBbbGluZGV4ICRhcmd2IDBdCiAgICAgICAgICAgICAgICAgIHNldCBhcmd2IFtscmVwbGFjZSAkYXJndiAwIDBdCiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHB1dHMgJEZGTU06Om5vVmVyc2lvbgogICAgICAgICAgICAgICAgICBleGl0IC0xCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYgeyhbbHNlYXJjaCAkRkY6OnZhbGlkX3ZlcnNpb25zICR2ZXJzaW9uXSA8IDApfSB7CiAgICAgICAgICAgICAgICAgIHB1dHMgJEZGTU06Om5vVmVyc2lvbgogICAgICAgICAgICAgICAgICBleGl0IC0xCiAgICAgICAgICAgICAgIH0KIyAgICAgICAgICAgICAgcHV0cyAiPEZGPiBWRVJTSU9OID09ICR2ZXJzaW9uIgogICAgICAgICAgICB9CiAgICAgICAgICAgIF4tKGZ8LWZsYXQpJCB7CiAgICAgICAgICAgICAgICMKICAgICAgICAgICAgICAgIyBHZXQgdGhlIHBhdGggdG8gdGhlIHNjcmlwdHMuCiAgICAgICAgICAgICAgICMKICAgCiAgICAgICAgICAgICAgIGlmIHtbbGxlbmd0aCAkYXJndl19IHsKICAgICAgICAgICAgICAgICAgc2V0IG5ld0ZsYXQgW2xpbmRleCAkYXJndiAwXQogICAgICAgICAgICAgICAgICBzZXQgYXJndiBbbHJlcGxhY2UgJGFyZ3YgMCAwXQogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBwdXRzICRGRk1NOjpub0ZsYXQKICAgICAgICAgICAgICAgICAgZXhpdCAtMQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHsoJG5ld0ZsYXQgIT0gImZ1bGwiKSAmJiAoJG5ld0ZsYXQgIT0gInBhcnRpYWwiKSAmJiAoJG5ld0ZsYXQgIT0gIm5vbmUiKX0gewogICAgICAgICAgICAgICAgICBwdXRzICRGRk1NOjpub0ZsYXQKICAgICAgICAgICAgICAgICAgZXhpdCAtMQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIHB1dHMgIjxGRj4gRkxBVCA9PSAkbmV3RmxhdCIKICAgICAgICAgICAgICAgc2V0IGZsYXQgJG5ld0ZsYXQKICAgICAgICAgICAgfQogICAgICAgICAgICBeLShlfC1lZGkpJCB7CiAgICAgICAgICAgICAgICMKICAgICAgICAgICAgICAgIyBFbmFibGUgSW5ub3Z1cyBtb2RlCiAgICAgICAgICAgICAgICMKICAgCiAgICAgICAgICAgICAgIGlmIHtbbGxlbmd0aCAkYXJndl19IHsKICAgICAgICAgICAgICAgICAgc2V0IGVkaSB0cnVlCiMgICAgICAgICAgICAgICAgIHNldCBhcmd2IFtscmVwbGFjZSAkYXJndiAwIDBdCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgcHV0cyAiPEZGPiBJTk5PVlVTID09ICR2YXJzKGVkaSkiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgXi0oZHwtZGlyKSQgewogICAgICAgICAgICAgICAjCiAgICAgICAgICAgICAgICMgRGVmaW5lIG91dHB1dCBkaXJlY3RvcnkgcGF0aAogICAgICAgICAgICAgICAjCiAgIAogICAgICAgICAgICAgICBpZiB7W2xsZW5ndGggJGFyZ3ZdfSB7CiAgICAgICAgICAgICAgICAgIHNldCBzY3JpcHREaXIgW2xpbmRleCAkYXJndiAwXQogICAgICAgICAgICAgICAgICBzZXQgYXJndiBbbHJlcGxhY2UgJGFyZ3YgMCAwXQogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBwdXRzICRGRk1NOjpub1BhdGgKICAgICAgICAgICAgICAgICAgZXhpdCAtMQogICAgICAgICAgICAgICB9CiAgIAogICAgICAgICAgICAgICBwdXRzICI8RkY+IE9VVFBVVCBESVJFQ1RPUlkgPT0gJHNjcmlwdERpciIKICAgCiAgICAgICAgICAgIH0KICAgICAgICAgICAgXi0oeXwtc3R5bGUpJCB7CiAgICAgICAgICAgICAgICMKICAgICAgICAgICAgICAgIyBEZWZpbmUgcnVuZGlyIGRpcmVjdG9yeSBuYW1pbmcgc3R5bGUKICAgICAgICAgICAgICAgIyAtZCBtdXN0IGJlIHByb3ZpZGVkLCBzaW5jZSB0aGlzIHdpbGwgcmVkZWZpbmUgdmFycyhzY3JpcHRfZGlyKQogICAgICAgICAgICAgICAjCiAgIAogICAgICAgICAgICAgICBpZiB7W2xsZW5ndGggJGFyZ3ZdfSB7CiAgICAgICAgICAgICAgICAgIHNldCBzdHlsZVR5cGUgW2xpbmRleCAkYXJndiAwXQogICAgICAgICAgICAgICAgICBzd2l0Y2ggLXJlZ2V4cCAtLSAkc3R5bGVUeXBlIHsgCiAgICAgICAgICAgICAgICAgICAgKGluY3JlbWVudHxkYXRlfG5vbmUpIHsKICAgICAgICAgICAgICAgICAgICAgIHNldCBhcmd2IFtscmVwbGFjZSAkYXJndiAwIDBdCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgewogICAgICAgICAgICAgICAgICAgICAgcHV0cyBbZm9ybWF0ICRGRk1NOjp1bmtub3duT3B0aW9uICIteSAkc3R5bGVUeXBlIl0KICAgICAgICAgICAgICAgICAgICAgIHB1dHMgJEZGTU06OnVzYWdlCiAgICAgICAgICAgICAgICAgICAgICBleGl0IC0xCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHB1dHMgJEZGTU06Om5vU3R5bGUKICAgICAgICAgICAgICAgICAgZXhpdCAtMQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIHB1dHMgIjxGRj4gRElSRUNUT1JZIE5BTUlORyBTVFlMRSA9PSAkc3R5bGVUeXBlIgogICAgICAgICAgICB9CiAgICAgICAgICAgIF4tKHV8LXJ1bmRpcikkIHsKICAgICAgICAgICAgICAgIwogICAgICAgICAgICAgICAjIERlZmluZSBleGVjdXRpb24gKHJ1bikgZGlyCiAgICAgICAgICAgICAgICMgVGhpcyBvcHRpb24gc3VwZXJjZWVkcyAtZCAoJHZhcnMoc2NyaXB0X2RpcikgaXMgb3ZlcnJpZGRlbiB0byAkdmFycyhydW5kaXIpL0ZGKQogICAgICAgICAgICAgICAjCiAgIAogICAgICAgICAgICAgICBpZiB7W2xsZW5ndGggJGFyZ3ZdfSB7CiAgICAgICAgICAgICAgICAgIHNldCBydW5EaXIgW2xpbmRleCAkYXJndiAwXQogICAgICAgICAgICAgICAgICBzZXQgYXJndiBbbHJlcGxhY2UgJGFyZ3YgMCAwXQogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBwdXRzICRGRk1NOjpub1J1bmRpcgogICAgICAgICAgICAgICAgICBleGl0IC0xCiAgICAgICAgICAgICAgIH0KICAgCiAgICAgICAgICAgICAgIHB1dHMgIjxGRj4gUlVORElSIEJBU0UgPT0gJHJ1bkRpciIKICAgICAgICAgICAgfQogICAgICAgICAgICBeLShzfC1zZXR1cCkkIHsKICAgICAgICAgICAgICAgIwogICAgICAgICAgICAgICAjIEdldCB0aGUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHNldHVwLnRjbCBjb250cm9sCiAgICAgICAgICAgICAgICMgZmlsZQogICAgICAgICAgICAgICAjCiAgIAogICAgICAgICAgICAgICBpZiB7W2xsZW5ndGggJGFyZ3ZdfSB7CiAgICAgICAgICAgICAgICAgIHNldCBuZXdQYXRoIFtsaW5kZXggJGFyZ3YgMF0KICAgICAgICAgICAgICAgICAgc2V0IGFyZ3YgW2xyZXBsYWNlICRhcmd2IDAgMF0KICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgcHV0cyAkRkZNTTo6bm9TZXR1cFBhdGgKICAgICAgICAgICAgICAgICAgcHV0cyAkRkZNTTo6dXNhZ2UKICAgICAgICAgICAgICAgICAgZXhpdCAtMQogICAgICAgICAgICAgICB9CiAgIAogICAgICAgICAgICAgICAjCiAgICAgICAgICAgICAgICMgRG9lcyB0aGUgcGF0aCBleGlzdD8gIElmIG5vdCwgZXJyb3Igb3V0LiAgTWFrZSBzdXJlIHRoYXQgdGhlIHBhdGgKICAgICAgICAgICAgICAgIyBleGlzdHMgYW5kIGNvbnRhaW5zIHRoZSBzb3VyY2UgZmlsZXMKICAgICAgICAgICAgICAgIwogICAKICAgICAgICAgICAgICAgaWYgeyFbZmlsZSBleGlzdHMgJG5ld1BhdGhdfSB7CiAgICAgICAgICAgICAgICAgIHB1dHMgW2Zvcm1hdCAkRkZNTTo6bm9TdWNoUGF0aCAkbmV3UGF0aF0KICAgICAgICAgICAgICAgICAgcHV0cyAkRkZNTTo6dXNhZ2UKICAgICAgICAgICAgICAgICAgZXhpdCAtMQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIHNldCBzZXR1cF9wYXRoICRuZXdQYXRoCiAgICAgICAgICAgICAgIHB1dHMgIjxGRj4gU0VUVVAgUEFUSCA9PSAkc2V0dXBfcGF0aCIKICAgICAgICAgICAgfQogICAgICAgICAgICBeLShWfC1WZXJib3NlKSQgewogICAgICAgICAgICAgICAjCiAgICAgICAgICAgICAgICMgRW5hYmxlIFZlcmJvc2UgbW9kZQogICAgICAgICAgICAgICAjCiAgIAogICAgICAgICAgICAgICBpZiB7W2xsZW5ndGggJGFyZ3ZdfSB7CiAgICAgICAgICAgICAgICAgIHNldCB2YXJzKHZlcmJvc2UpIHRydWUKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBwdXRzICI8RkY+IFZFUkJPU0UgPT0gJHZhcnModmVyYm9zZSkiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgXi0oSHwtSGVscCkkIHsKICAgICAgICAgICAgICAgIwogICAgICAgICAgICAgICAjIFByaW50IHN0ZXAgaGVscAogICAgICAgICAgICAgICAjCiAgIAogICAgICAgICAgICAgICBpZiB7W2xsZW5ndGggJGFyZ3ZdfSB7CiAgICAgICAgICAgICAgICAgIHNldCB2YXJzKGhlbHApIHRydWUKICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgICAgcHV0cyAiPEZGPiBIRUxQID09ICR2YXJzKGhlbHApIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGRlZmF1bHQgewogICAgICAgICAgICAgICBwdXRzIFtmb3JtYXQgJEZGTU06OnVua25vd25PcHRpb24gJG9wdGlvbl0KICAgICAgICAgICAgICAgcHV0cyAkRkZNTTo6dXNhZ2UKICAgICAgICAgICAgICAgZXhpdCAtMQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfQogICAKICAgICAgaWYgeyFbZmlsZSBleGlzdHMgJHNldHVwX3BhdGgvc2V0dXAudGNsXX0gewogICAgICAgICBwdXRzIFtmb3JtYXQgJEZGTU06Om1pc3NpbmdTZXR1cEZpbGUgJHNldHVwX3BhdGhdCiAgICAgICAgIGV4aXQgLTEKICAgICAgfSBlbHNlIHsKICAgICAgICAgc2V0IHZhcnMoc2V0dXBfcGF0aCkgJHNldHVwX3BhdGgKICAgICAgfQogIAogICAgICAjCiAgICAgICMgU291cmNlIHRoZSBvdGhlciBUY2wgZmlsZXMgdG8gZXhlY3V0ZSB0aGUgZmxvdy4gIFRoZW4gZG8gc28KICAgICAgIwogICAKICAgICAgc291cmNlICIkdmFycyhzY3JpcHRfcGF0aCkvRVRDL3V0aWxzLnRjbCIKICAgCiAgICAgICMKICAgICAgIyBHZXQgbmV3IHJ1bmRpciAodXNpbmcgLXUvLXkgYW5kIHBvc3NpYmx5IHVzZXIgdmFyaWFibGVzKQogICAgICAjCiAgICAgICMgTk9URTogZGFyZ3M6IGRlZmF1bHQgYXJncwogICAgICAjICAgICAgIGZhcmdzOiBmbG93IGFyZ3Mgc3BlY2lmaWVkIG9uIGNvbW1hbmQgbGluZQogICAKICAgICAgaWYgeyFbaW5mbyBleGlzdHMgZmlyc3RdfSB7CiAgICAgICAgICMgQkNMOiBNb3ZlZCB0aGlzIGNvZGUgYmVmb3JlIGdlbl9uZXdfcnVuZGlyIHNpbmNlIGRhcmdzKG1vZGUpIG11c3QgYmUgc2V0IGJlZm9yZSBleGVjdXRpbmcgZXhlY3V0ZV9mbG93CiAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIG1vZGVdfSB7CiAgICAgICAgICAgIHNldCBtb2RlIGZsYXQKICAgICAgICAgICAgc2V0IGRhcmdzKHVzZXJfbW9kZSkgZmxhdCAKICAgICAgICAgICAgc2V0IGRhcmdzKG1vZGUpIGZsYXQgCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIHskbW9kZSA9PSAiZmxhdCIgfHwgJG1vZGUgPT0gInVzZXIifSB7CiAgICAgICAgICAgICAgIHNldCBmYXJncyh1c2VyX21vZGUpIGZsYXQgIAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgc2V0IGZhcmdzKHVzZXJfbW9kZSkgaGllciAKICAgICAgICAgICAgIH0KIyAgICAgICAgICAgc2V0IGZhcmdzKHVzZXJfbW9kZSkgZmxhdCAgCiAgICAgICAgIH0gCiAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIG1ha2VmaWxlXX0gewogICAgICAgICAgICBzZXQgZGFyZ3MobWFrZWZpbGUpIHRydWUKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0IGZhcmdzKG1ha2VmaWxlKSAkbWFrZWZpbGUKICAgICAgICAgfQogICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyByY119IHsKICAgICAgICAgICAgc2V0IGRhcmdzKHJjKSBmYWxzZQogICAgICAgICAgICBzZXQgcmMgZmFsc2UKICAgICAgICAgfSBlbHNlIHsgCiAgICAgICAgICAgIHNldCBmYXJncyhyYykgJHJjIAogICAgICAgICB9CiAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIG5vdnVzXX0gewogICAgICAgICAgICBzZXQgZGFyZ3Mobm92dXMpIGZhbHNlCiAgICAgICAgICAgIHNldCBub3Z1cyBmYWxzZQogICAgICAgICB9IGVsc2UgeyAKICAgICAgICAgICAgc2V0IGZhcmdzKG5vdnVzKSAkbm92dXMgCiAgICAgICAgIH0KICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgc3ludGhfZmxvd119IHsKICAgICAgICAgICAgc2V0IGRhcmdzKHN5bnRoX2Zsb3cpIGRlZmF1bHRfc3ludGhlc2lzX2Zsb3dfM3N0ZXAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0IGZhcmdzKHN5bnRoX2Zsb3cpICRzeW50aF9mbG93CiAgICAgICAgIH0KICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmVyc2lvbl19IHsKICAgICAgICAgICAgc2V0IGRhcmdzKHZlcnNpb24pIDE3LjEuMAogICAgICAgICB9IGVsc2UgeyAKICAgICAgICAgICAgc2V0IGZhcmdzKHZlcnNpb24pICR2ZXJzaW9uCiAgICAgICAgIH0KICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgZWRpXX0gewogICAgICAgICAgICBzZXQgZGFyZ3MoZWRpKSBmYWxzZQogICAgICAgICB9IGVsc2UgeyAKICAgICAgICAgICAgc2V0IGZhcmdzKGVkaSkgJGVkaQogICAgICAgICB9CiAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIGZsYXRdfSB7CiAgICAgICAgICAgIHNldCBkYXJncyhmbGF0KSBvZmYKICAgICAgICAgfSBlbHNlIHsgCiAgICAgICAgICAgIHNldCBmYXJncyhmbGF0KSAkZmxhdAogICAgICAgICB9CiAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIHZlcmJvc2VdfSB7CiAgICAgICAgICAgIHNldCBkYXJncyh2ZXJib3NlKSBmYWxzZQogICAgICAgICB9IGVsc2UgeyAKICAgICAgICAgICAgc2V0IGZhcmdzKHZlcmJvc2UpICR2ZXJib3NlCiAgICAgICAgIH0KICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgc2NyaXB0RGlyXX0gewogICAgICAgICAgICBzZXQgZGFyZ3Moc2NyaXB0X2RpcikgRkYKICAgICAgICAgfSBlbHNlIHsgCiAgICAgICAgICAgIHNldCBmYXJncyhzY3JpcHRfZGlyKSAkc2NyaXB0RGlyCiAgICAgICAgIH0KICAgICAgICAgc2V0IGRhcmdzKHJ1bmRpcikgW2ZpbGUgbm9ybWFsaXplIC5dIAogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHJ1bkRpcl19IHsKICAgICAgICAgICAgIyBCQ0w6IGlmIHJ1bkRpciBpcyBzZXQsIGl0J3MgYSBmbG93IGFyZwogICAgICAgICAgICBzZXQgZmFyZ3MocnVuZGlyKSAkcnVuRGlyCiAgICAgICAgIH0KICAgICAgICAgaWYgeyFbaW5mbyBleGlzdHMgc3R5bGVUeXBlXX0gewogICAgICAgICAgICBzZXQgZGFyZ3Moc3R5bGUpIG5vbmUKICAgICAgICAgfSBlbHNlIHsgCiAgICAgICAgICAgIHNldCBmYXJncyhzdHlsZSkgJHN0eWxlVHlwZQogICAgICAgICB9CiAgICAgICAgIAogICAgICAgICAjIEJDTDogV2UgYXJlIHJ1bm5pbmcgY29kZWdlbiwgc28gc2V0IGZhcmdzKGNvZGVnZW4pIHRvIHRydWUKICAgICAgICAgc2V0IGZhcmdzKGNvZGVnZW4pIHRydWUKICAgICAgICAgc2V0IGZhcmdzKG1vZGUpICRtb2RlCiAgICAgICAgIHNldCB2YXJzKGN3ZCkgW3B3ZF0KICAgICAgCiAgICAgICAgIHNldCBmaXJzdCAwCiAgIAogICAgICAgICAjIEJDTDogKHBvdGVudGlhbGx5KSBnZW5lcmF0ZSBhIG5ldyBydW5kaXIKICAgICAgICAgc2V0IGZhcmdzKHJ1bmRpcikgW2ZpbGUgbm9ybWFsaXplIFtGRjo6Z2VuX25ld19ydW5kaXIgJG9yaWdfYXJndl1dCiAgIAojICAgICAgICAgIyBJZiB0aGUgdXNlciBwYXNzZWQgYSAteSBhbmQgLXUsIG1vdmUgdGhlIC15IChjb2RlZ2VuIGRpciBvdXRwdXQpIHRvIHVuZGVybmVpdGggdGhlIC11IChydW5kaXIpCiMgICAgICAgICAjIGFuZCBtZXNzYWdlIHVzZXIKIyAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgZmFyZ3MocnVuZGlyKV0gJiYgJHZhcnMocnVuZGlyKSBuZSAiIiAmJiBbZmlsZSBub3JtYWxpemUgJGZhcmdzKHJ1bmRpcildIG5lIFtmaWxlIG5vcm1hbGl6ZSAuXX0gewojICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHNjcmlwdERpcl19IHsKIyAgICAgICAgICAgICAgcHV0cyAiPEZGPiBOT1RFOiBjb2RlZ2VuIG91dHB1dCBkaXIgKC15ICRzY3JpcHREaXIpIHVzZWQgd2l0aCBydW5kaXIgc3BlY2lmaWNhdGlvbiBvZjogJGZhcmdzKHJ1bmRpcikuIgojICAgICAgICAgICAgICBwdXRzICI8RkY+ICAgICAgIEZGIHdpbGwgbW92ZSB0aGUgY29kZWdlbiBkaXIgdW5kZXIgdGhlIHJ1bmRpcjogICR2YXJzKHJ1bmRpcikvW2ZpbGUgdGFpbCAkdmFycyhzY3JpcHRfZGlyKV0iCiMgICAgICAgICAgICAgIHNldCBmYXJncyhzY3JpcHRfZGlyKSBbZmlsZSBub3JtYWxpemUgJHZhcnMocnVuZGlyKS9bZmlsZSB0YWlsICR2YXJzKHNjcmlwdF9kaXIpXV0KIyAgICAgICAgICAgICAgc2V0IHZhcnMoc2NyaXB0X2RpcikgJGZhcmdzKHNjcmlwdF9kaXIpCiMgICAgICAgICAgIH0gZWxzZWlmIHtbaW5mbyBleGlzdHMgdmFycyhzY3JpcHRfZGlyKV0gJiYgJHZhcnMoc2NyaXB0X2RpcikgZXEgIkZGIn0gewojICAgICAgICAgICAgICAjIHZhcnMoc2NyaXB0X2RpcikgaXMgdGhlIGRlZmF1bHQsIHNvIGp1c3QgbW92ZSBpdAojICAgICAgICAgICAgICBzZXQgZmFyZ3Moc2NyaXB0X2RpcikgW2ZpbGUgbm9ybWFsaXplICR2YXJzKHJ1bmRpcikvRkZdCiMgICAgICAgICAgICAgIHNldCB2YXJzKHNjcmlwdF9kaXIpICRmYXJncyhzY3JpcHRfZGlyKQojICAgICAgICAgICB9CiMgICAgICAgICB9IGVsc2UgewojICAgICAgICAgICAjIHJ1bmRpciBpcyAuLywgc28gc2V0IAojICAgICAgICAgICBpZiB7IVtpbmZvIGV4aXN0cyBzY3JpcHREaXJdfSB7CiMgICAgICAgICAgICAgc2V0IGRhcmdzKHNjcmlwdF9kaXIpICJGRiIKIyAgICAgICAgICAgICBzZXQgdmFycyhzY3JpcHRfZGlyKSAkZGFyZ3Moc2NyaXB0X2RpcikKIyAgICAgICAgICAgfSBlbHNlIHsKIyAgICAgICAgICAgICBzZXQgdmFycyhzY3JpcHRfZGlyKSAkc2NyaXB0RGlyCiMgICAgICAgICAgIH0KIyAgICAgICAgIH0KICAgICAgICAgIyBCQ0w6IEFkZGVkIHN1YnN0IHRvIHJlc29sdmUgdmFycyhydW5kaXIpCiMgR0RHIC0gdGhpcyBpcyBkb25lIG11bHRpcGxlIHRpbWVzCiAgICAgICAgICNjYXRjaCB7ZmlsZSBta2RpciBbc3Vic3QgJHZhcnMoc2NyaXB0X2RpcildfQogICAgICB9CgogICAgICAjCiAgICAgICMgRGV0ZXJtaW5lIHRoZSBzdGVwcyB0aGF0IGNhbiBiZSBleGVjdXRlZCBiYXNlZCB1cG9uIHRoZSBtb2RlIHBhc3NlZCBpbgogICAgICAjCiAgICAgIEZGOjpzZXRfc3RlcHMgJG1vZGUgJHZhcnMoZm9ybWF0X2xpbmVzKQogICAgICBzZXQgdXNlcl9zdGVwcyBbbGlzdF0KICAgICAgaWYgeyFbbGxlbmd0aCAkYXJndl19IHsKICAgICAgICAgIwogICAgICAgICAjIElmIHRoZXJlIGlzIG5vIGFyZ3VtZW50LCBwcmludCBvdXQgdGhlIGxpc3Qgb2YgdmFsaWQgc3RlcHMgZm9yIHRoZSBtb2RlCiAgICAgICAgICMKICAgICAgICAgIyBzZXQgc3RlcCBhbGwKICAgICAgICAgIyAgIHB1dHMgIlZhbGlkIHN0ZXBzIGFyZTogc291cmNlIGNoZWNrIGFsbCAkdmFycyhzdGVwcykiCiAgICAgICAgICMgICBleGl0CiAgIAogICAgICAgICBwdXRzICRGRk1NOjp1c2FnZQogICAgICAgICBwdXRzICIgICBTdGVwIGFyZ3VtZW50IG1pc3NpbmcgLi4uIHZhbGlkIHN0ZXBzIGFyZTpcbiIKICAgICAgICAgIGZvcmVhY2ggcyAiJHZhcnMoc3RlcHMpIGFsbCIgewogICAgICAgICAgICBwdXRzICIgICAgICRzIgogICAgICAgICB9CiAgICAgICAgIGV4aXQKCiAgICAgIH0gZWxzZSB7CgogICAgICAgICAjCiAgICAgICAgICMgQ3JlYXRlIGEgbGlzdCBvZiB0aGUgdXNlci1zcGVjaWZpZWQgc3RlcHMuICBUaGV5IGNhbiBiZSBpbiB0aGUgZm9ybSBvZgogICAgICAgICAjICAgICA8c3RlcDE+IDxzdGVwMj4gLi4uIDxzdGVwbj4KICAgICAgICAgIyAgICAgPHN0ZXAxPiA8c3RlcDM+LTxzdGVwNT4gPHN0ZXA3PiAuLi4KICAgICAgICAgIyAgICAgPHN0ZXAxPi08c3RlcG4+CiAgICAgICAgICMgVGhlcmUgYXJlLCBvZiBjb3Vyc2UsIGFkZGl0aW9uYWwgdmFyaWFudHMuICBUaGUgdGhpbmcgaXMsIGlmIHRoZXJlIGlzIGEKICAgICAgICAgIyBkYXNoIGJldHdlZW4gdHdvIHN0ZXBzLCB3ZSB3YW50IHRvIGV4cGFuZCB0aGUgZGFzaCBpbnRvIHRoZSBzZXQgb2YgYWxsCiAgICAgICAgICMgc3RlcHMgYmV0d2VlbiB0aGUgdHdvIGxpc3RlZC4KICAgICAgICAgIwogIAogICAgICAgICBzZXQgdmFycyhzdGVwX2FyZykgJGFyZ3YKICAgICAgICAgZm9yZWFjaCBzdGVwICRhcmd2IHsKICAgICAgICAgICAgc2V0IGRhc2ggW3N0cmluZyBmaXJzdCAiLSIgJHN0ZXBdCiAgICAgICAgICAgIGlmIHskZGFzaCA9PSAtMX0gewogICAgICAgICAgICAgICBsYXBwZW5kIHVzZXJfc3RlcHMgJHN0ZXAKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgc2V0IGZpcnN0X3N0ZXAgW3N0cmluZyByYW5nZSAkc3RlcCAwIFtleHByICRkYXNoIC0gMV1dCiAgICAgICAgICAgICAgIHNldCBsYXN0X3N0ZXAgW3N0cmluZyByYW5nZSAkc3RlcCBbZXhwciAkZGFzaCArIDFdIGVuZF0KICAgICAgICAgICAgICAgaWYgeyRsYXN0X3N0ZXAgPT0gIiJ9IHsKICAgICAgICAgICAgICAgICAgc2V0IGxhc3Rfc3RlcCBbbGluZGV4ICR2YXJzKHN0ZXBzKSBlbmRdCiAgICAgICAgICAgICAgIH0KICAgCiAgICAgICAgICAgICAgIHNldCBmaXJzdF9pbmRleCBbbHNlYXJjaCAkdmFycyhzdGVwcykgJGZpcnN0X3N0ZXBdCiAgICAgICAgICAgICAgIHNldCBsYXN0X2luZGV4IFtsc2VhcmNoICR2YXJzKHN0ZXBzKSAkbGFzdF9zdGVwXQogICAgICAgICAgICAgICBpZiB7JGZpcnN0X2luZGV4ID09IC0xfSB7CiAgICAgICAgICAgICAgICAgIHB1dHMgIkVycm9yOiBVbmtub3duIHN0ZXAgJGZpcnN0X3N0ZXAgZm9yIG1vZGUgJG1vZGUiCiAgICAgICAgICAgICAgICAgIGV4aXQgLTExMQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHskbGFzdF9pbmRleCA9PSAtMX0gewogICAgICAgICAgICAgICAgICBwdXRzICJFcnJvcjogVW5rbm93biBzdGVwICRsYXN0X3N0ZXAgZm9yIG1vZGUgJG1vZGUiCiAgICAgICAgICAgICAgICAgIGV4aXQgLTExMQogICAgICAgICAgICAgICB9CiAgIAogICAgICAgICAgICAgICBzZXQgc3RlcHMgW2xyYW5nZSAkdmFycyhzdGVwcykgJGZpcnN0X2luZGV4ICRsYXN0X2luZGV4XQogICAgICAgICAgICAgICBzZXQgdXNlcl9zdGVwcyBbY29uY2F0ICR1c2VyX3N0ZXBzICRzdGVwc10KICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgIH0KICAKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGhlbHApXSAmJiAkdmFycyhoZWxwKX0gewogICAgICAgICBmb3JlYWNoIHN0ZXAgJHVzZXJfc3RlcHMgewogICAgICAgICAgICBGRjo6aGVscCAkc3RlcAogICAgICAgICB9CiAgICAgICAgIGV4aXQKICAgICAgfQogICAKICAgICAgc2V0IHZhcnMobWFrZSkgJHVzZXJfc3RlcHMKICAgICAgc2V0IHZhcnMoYXJndikgJGFyZ3YKICAgCiAgICAgICNzZXQgdXNlcl9zdGVwcyBbRkY6OnNldHVwX2Zsb3cgJGFyZ3YgXQogICAKICAgICAgIwogICAgICAjIEV4ZWN1dGUgdGhlIGZsb3cgZm9yIGV2ZXJ5IHN0ZXAgdGhhdCB0aGUgdXNlciBzcGVjaWZpZWQuCiAgICAgICMKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHJ1bmRpcildfSB7CiAgICAgICAgIHNldCBjd2QgW2V4ZWMgcHdkXSAgCiAgICAgICAgIGZpbGUgbWtkaXIgJHZhcnMocnVuZGlyKQogICAgICAgICBmb3JlYWNoIGZpbGUgW2xpc3Qgc2V0dXAudGNsIGlubm92dXNfY29uZmlnLnRjbCBscF9jb25maWcudGNsIHJjX2NvbmZpZy50Y2xdIHsgCiAgICAgICAgICAgIGlmIHtbZmlsZSBpc2ZpbGUgJGZpbGVdfSB7CiAgICAgICAgICAgICAgIGZpbGUgY29weSAtZm9yY2UgJGZpbGUgJHZhcnMocnVuZGlyKQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgY2QgJHZhcnMocnVuZGlyKQogICAgICB9CiAgICAgCiAgICAgIHNldCBtb2RlICR2YXJzKG1vZGUpCiAgICAgIGZvcmVhY2ggc3RlcCAkdXNlcl9zdGVwcyB7CiAgICAgICAgIGlmIHskbW9kZSA9PSAiaGllciJ9IHsgc2V0IG1vZGUgdG9wX2Rvd24gfQogICAgICAgICBzd2l0Y2ggJG1vZGUgewogICAgICAgICAgICAidXNlciIgewogICAgICAgICAgICAgICBpZiB7JHZhcnMobm92dXMpfSB7CiAgICAgICAgICAgICAgICAgIEZGX05PVlVTOjpleGVjdXRlX2Zsb3cgJHN0ZXAgJHZhcnMoZm9ybWF0X2xpbmVzKQogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBGRl9FREk6OmV4ZWN1dGVfZmxvdyAkc3RlcCAkdmFycyhmb3JtYXRfbGluZXMpCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAiZmxhdCIgewogICAgICAgICAgICAgICBpZiB7JHZhcnMobm92dXMpfSB7CiAgICAgICAgICAgICAgICAgIEZGX05PVlVTOjpleGVjdXRlX2Zsb3cgJHN0ZXAgJHZhcnMoZm9ybWF0X2xpbmVzKQogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBGRl9FREk6OmV4ZWN1dGVfZmxvdyAkc3RlcCAkdmFycyhmb3JtYXRfbGluZXMpCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAidG9wX2Rvd24iIHsKICAgICAgICAgICAgICAgaWYgeyR2YXJzKG5vdnVzKX0gewogICAgICAgICAgICAgICAgICBGRl9OT1ZVUzo6ZXhlY3V0ZV9mbG93ICRzdGVwICR2YXJzKGZvcm1hdF9saW5lcykKICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgRkZfRURJOjpleGVjdXRlX2Zsb3cgJHN0ZXAgJHZhcnMoZm9ybWF0X2xpbmVzKQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgImJvdHRvbV91cCIgewogICAgICAgICAgICAgICBpZiB7JHZhcnMobm92dXMpfSB7CiAgICAgICAgICAgICAgICAgIEZGX05PVlVTOjpleGVjdXRlX2Zsb3cgJHN0ZXAgJHZhcnMoZm9ybWF0X2xpbmVzKQogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBGRl9FREk6OmV4ZWN1dGVfZmxvdyAkc3RlcCAkdmFycyhmb3JtYXRfbGluZXMpCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAiZGVmYXVsdCIgewogICAgICAgICAgICAgICBwdXRzIFtmb3JtYXQgJEZGTU06OnVua25vd25Nb2RlIG1vZGVdCiAgICAgICAgICAgICAgIHB1dHMgJEZGTU06OnVzYWdlCiAgICAgICAgICAgICAgIGV4aXQgLTExMQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfQogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoZmxvd19zdGVwcyldfSB7CiAgICAgICAgIHVuc2V0IHZhcnMoZmxvd19zdGVwcykKICAgICAgfQogICAgICBpZiB7W2ZpbGUgaXNmaWxlICR2YXJzKHNjcmlwdF9kaXIpL0lOTk9WVVMvLmhlYWRdfSB7CiAgICAgICAgIGlmIHskdmFycyhzdGVwX2FyZykgPT0gImFsbCJ9IHsKICAgICAgICAgICAgc2V0IG9wIFtvcGVuICR2YXJzKHNjcmlwdF9kaXIpL0lOTk9WVVMvcnVuX3NpbXBsZS50Y2wgd10KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0IG9wIFtvcGVuICR2YXJzKHNjcmlwdF9kaXIpL0lOTk9WVVMvcnVuX3NpbXBsZS4kdmFycyhzdGVwX2FyZykudGNsIHddCiAgICAgICAgIH0KICAgICAgICAgcHV0cyAkb3AgIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyIKICAgICAgICAgcHV0cyAkb3AgIiMgICAgICAgICAgICAgICAgICAgICAgIFNJTkdMRSBTQ1JJUFQgRkxPVyIKICAgICAgICAgcHV0cyAkb3AgIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyIKICAgICAgICAgcHV0cyAkb3AgIlxuc291cmNlICR2YXJzKHNjcmlwdF9kaXIpL3ZhcnMudGNsIgogICAgICAgICBwdXRzICRvcCAic291cmNlICR2YXJzKHNjcmlwdF9kaXIpL3Byb2NzLnRjbFxuIgogICAgICAgICBzZXQgaXAgW29wZW4gJHZhcnMoc2NyaXB0X2RpcikvSU5OT1ZVUy8uaGVhZF0KICAgICAgICAgd2hpbGUge1tnZXRzICRpcCBsaW5lXT49MH0gewogICAgICAgICAgICBwdXRzICRvcCAkbGluZSAKICAgICAgICAgfQogICAgICAgICBjbG9zZSAkaXAKICAgICAgICAgc2V0IGlwIFtvcGVuICR2YXJzKHNjcmlwdF9kaXIpL0lOTk9WVVMvLmxvYWRfW2xpbmRleCAkdmFycyhic3RlcHMpIDBdXQogICAgICAgICB3aGlsZSB7W2dldHMgJGlwIGxpbmVdPj0wfSB7CiAgICAgICAgICAgIHB1dHMgJG9wICRsaW5lIAogICAgICAgICB9CiAgICAgICAgIGNsb3NlICRpcAogICAgICAgICBmb3JlYWNoIHN0ZXAgJHZhcnMoYnN0ZXBzKSB7CiAgICAgICAgICAgIGlmIHsoJHN0ZXAgPT0gImxlYyIpIHx8ICgkc3RlcCA9PSAiZGVidWciKX0gewogICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCBpcCBbb3BlbiAkdmFycyhzY3JpcHRfZGlyKS9JTk5PVlVTLy4kc3RlcF0KICAgICAgICAgICAgd2hpbGUge1tnZXRzICRpcCBsaW5lXT49MH0gewogICAgICAgICAgICAgICBwdXRzICRvcCAkbGluZSAKICAgICAgICAgICAgfQogICAgICAgICAgICBjbG9zZSAkaXAKICAgICAgICAgICAgZmlsZSBkZWxldGUgJHZhcnMoc2NyaXB0X2RpcikvSU5OT1ZVUy8uJHN0ZXAgIAogICAgICAgICAgICBmaWxlIGRlbGV0ZSAkdmFycyhzY3JpcHRfZGlyKS9JTk5PVlVTLy5sb2FkXyRzdGVwCiAgICAgICAgIH0gCiAgICAgICAgIHB1dHMgJG9wICJleGl0IgogICAgICAgICBjbG9zZSAkb3AKIyAgICAgICAgZmlsZSBta2RpciAkdmFycyhzY3JpcHRfZGlyKS9JTk5PVlVTL1NJTVBMRQojICAgICAgICBmb3JlYWNoIHN0ZXAgJHZhcnMoYnN0ZXBzKSB7CiMgICAgICAgICAgIGlmIHsoJHN0ZXAgPT0gImxlYyIpICB8fCAoJHN0ZXAgPT0gImRlYnVnIil9IHsKIyAgICAgICAgICAgICAgY29udGludWUKIyAgICAgICAgICAgfQojICAgICAgICAgICBzZXQgb3AgW29wZW4gJHZhcnMoc2NyaXB0X2RpcikvSU5OT1ZVUy9TSU1QTEUvcnVuXyRzdGVwLnRjbCB3XQojICAgICAgICAgICBwdXRzICRvcCAiIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIgojICAgICAgICAgICBwdXRzICRvcCAiIyAgICAgICAgICAgICAgICAgICAgICBTSU1QTEUgU1RFUCBTQ1JJUFQiCiMgICAgICAgICAgIHB1dHMgJG9wICIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiCiMgICAgICAgICAgIHB1dHMgJG9wICJcbnNvdXJjZSAkdmFycyhzY3JpcHRfZGlyKS92YXJzLnRjbCIKIyAgICAgICAgICAgcHV0cyAkb3AgInNvdXJjZSAkdmFycyhzY3JpcHRfZGlyKS9wcm9jcy50Y2xcbiIKIyAgICAgICAgICAgc2V0IGlwIFtvcGVuICAkdmFycyhzY3JpcHRfZGlyKS9JTk5PVlVTLy5oZWFkXQojICAgICAgICAgICB3aGlsZSB7W2dldHMgJGlwIGxpbmVdPj0wfSB7CiMgICAgICAgICAgICAgIHB1dHMgJG9wICRsaW5lIAojICAgICAgICAgICB9CiMgICAgICAgICAgIGNsb3NlICRpcAojIyAgICAgICAgICAgZmlsZSBkZWxldGUgJHZhcnMoc2NyaXB0X2RpcikvSU5OT1ZVUy8uaGVhZCAgCiMgICAgICAgICAgIHNldCBpcCBbb3BlbiAkdmFycyhzY3JpcHRfZGlyKS9JTk5PVlVTLy5sb2FkXyRzdGVwXQojICAgICAgICAgICB3aGlsZSB7W2dldHMgJGlwIGxpbmVdPj0wfSB7CiMgICAgICAgICAgICAgIHB1dHMgJG9wICRsaW5lIAojICAgICAgICAgICB9CiMgICAgICAgICAgIGNsb3NlICRpcAojICAgICAgICAgICBzZXQgaXAgW29wZW4gICR2YXJzKHNjcmlwdF9kaXIpL0lOTk9WVVMvLiRzdGVwXQojICAgICAgICAgICB3aGlsZSB7W2dldHMgJGlwIGxpbmVdPj0wfSB7CiMgICAgICAgICAgICAgIHB1dHMgJG9wICRsaW5lIAojICAgICAgICAgICB9CiMgICAgICAgICAgIGNsb3NlICRpcAojICAgICAgICAgICBwdXRzICRvcCAiZXhpdCIKIyAgICAgICAgICAgY2xvc2UgJG9wCiMgICAgICAgICAgIGZpbGUgZGVsZXRlICR2YXJzKHNjcmlwdF9kaXIpL0lOTk9WVVMvLiRzdGVwICAKIyAgICAgICAgICAgZmlsZSBkZWxldGUgJHZhcnMoc2NyaXB0X2RpcikvSU5OT1ZVUy8ubG9hZF8kc3RlcAojICAgICAgICB9CiAgICAgICAgICBmaWxlIGRlbGV0ZSAkdmFycyhzY3JpcHRfZGlyKS9JTk5PVlVTLy5oZWFkICAKICAgICAgfQoKICAgICAgIyAtLS0tLS0tLS0tLQoKIyAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhzY3JpcHRfZGlyKV19IHsKIyAgICAgICAgIGZpbGUgZGVsZXRlICR2YXJzKHNjcmlwdF9kaXIpL0lOTk9WVVMvZ2VuX2h0bWwudGNsCiMgICAgICAgICBmaWxlIGNvcHkgW3N1YnN0ICR2YXJzKHNjcmlwdF9wYXRoKS9JTk5PVlVTL2dlbl9odG1sLnRjbF0gW3N1YnN0ICR2YXJzKHNjcmlwdF9kaXIpL0lOTk9WVVMvZ2VuX2h0bWwudGNsXQojICAgICAgfQogICAgICBwdXRzICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocGx1Z19maWxlcyldICYmICgkdmFycyhwbHVnX2ZpbGVzKSAhPSAiIil9IHsKICAgICAgICAgcHV0cyAiXG4gICAgICAgICAgICAgICAgUGx1Zy1pbnMgSW1wb3J0ZWQiCiAgICAgICAgIHB1dHMgIiAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgIGZvcmVhY2ggZmlsZSAkdmFycyhwbHVnX2ZpbGVzKSB7CiAgICAgICAgICAgIHB1dHMgIiAgICAgICAgICAgICAgID4gJGZpbGUiCiAgICAgICAgIH0KICAgICAgfQogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocGx1Z2luc19kZWZpbmVkKV0gJiYgKCR2YXJzKHBsdWdpbnNfZGVmaW5lZCkgIT0gIiIpfSB7CiAgICAgICAgICAgIHNldCBwbHVnaW5zX2RlZmluZWQgW2xsZW5ndGggJHZhcnMocGx1Z2luc19kZWZpbmVkKV0KICAgICAgICAgICAgaWYgeyR2YXJzKHZlcmJvc2UpfSB7CiAgICAgICAgICAgICAgIHB1dHMgIlxuICAgICAgICAgICAgICAgIFBsdWctaW5zIERlZmluZWQiCiAgICAgICAgICAgICAgIHB1dHMgIiAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIGZvcmVhY2ggZmlsZSBbam9pbiAkdmFycyhwbHVnaW5zX2RlZmluZWQpXSB7CiAgICAgICAgICAgICAgICAgIHB1dHMgIiAgICAgICAgICAgICAgID4gJGZpbGUiCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXQgcGx1Z2luc19kZWZpbmVkIDAKICAgICAgICAgfQogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocGx1Z2luc19mb3VuZCldICYmICgkdmFycyhwbHVnaW5zX2ZvdW5kKSAhPSAiIil9IHsKICAgICAgICAgICAgc2V0IHBsdWdpbnNfZm91bmQgW2xsZW5ndGggJHZhcnMocGx1Z2luc19mb3VuZCldCiAgICAgICAgICAgIGlmIHskdmFycyh2ZXJib3NlKX0gewogICAgICAgICAgICAgICBwdXRzICJcbiAgICAgICAgICAgICAgICAgUGx1Zy1pbnMgRm91bmQiCiAgICAgICAgICAgICAgIHB1dHMgIiAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIGZvcmVhY2ggZmlsZSBbam9pbiAkdmFycyhwbHVnaW5zX2ZvdW5kKV0gewogICAgICAgICAgICAgICAgICBwdXRzICIgICAgICAgICAgICAgICA+ICRmaWxlIgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0IHBsdWdpbnNfZm91bmQgMAogICAgICAgICB9CiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhtaXNzaW5nX3BsdWdpbnMpXSAmJiAoJHZhcnMobWlzc2luZ19wbHVnaW5zKSAhPSAiIil9IHsKICAgICAgICAgICAgc2V0IG1pc3NpbmdfcGx1Z2lucyBbbGxlbmd0aCAkdmFycyhtaXNzaW5nX3BsdWdpbnMpXQogICAgICAgICAgICBwdXRzICJcbiAgICAgICAgICAgICAgICAgTWlzc2luZyBQbHVnLWlucyIKICAgICAgICAgICAgcHV0cyAiICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgZm9yZWFjaCBmaWxlIFtqb2luICR2YXJzKG1pc3NpbmdfcGx1Z2lucyldIHsKICAgICAgICAgICAgICAgcHV0cyAiICAgICAgICAgICAgICAgPiAkZmlsZSIKICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXQgbWlzc2luZ19wbHVnaW5zIDAKICAgICAgICAgfQogICAgICAjICAgICAgcHV0cyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHRhZ2dlZCldICYmICgkdmFycyh0YWdnZWQpICE9ICIiKX0gewogICAgICAgICBwdXRzICJcbiAgICAgICAgICAgICAgICBUYWdnZWQgQ29tbWFuZHMiCiAgICAgICAgIHB1dHMgIiAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgIGZvcmVhY2ggZmlsZSAkdmFycyh0YWdnZWQpIHsKICAgICAgICAgICAgcHV0cyAiICAgICAgICAgICAgICAgPiAkZmlsZSIKICAgICAgICAgfQoKICAgICAgICAgc2V0IHZhcnMobWlzc2luZ190YWdzKSBbbGlzdF0KICAgICAgICAgZm9yZWFjaCB2YXIgW2FycmF5IG5hbWVzIHZhcnNdIHsKICAgICAgICAgICBpZiB7W2xsZW5ndGggW3NwbGl0ICR2YXIgIiwiXV0gPT0gM30gewogICAgICAgICAgICAgc2V0IHN1ZmZpeCBbbGluZGV4IFtzcGxpdCAkdmFyICIsIl0gMl0KICAgICAgICAgICAgIGlmIHsoJHN1ZmZpeCA9PSAicHJlX3RjbCIpIHx8ICgkc3VmZml4ID09ICJwb3N0X3RjbCIpIHx8ICgkc3VmZml4ID09ICJyZXBsYWNlX3RjbCIpfSB7CiAgICAgICAgICAgICAgIGlmIHtbbHNlYXJjaCAkdmFycyh0YWdnZWQpICR2YXJdID09IC0xfSB7CiAgICAgICAgICAgICAgICAgbGFwcGVuZCB2YXJzKG1pc3NpbmdfdGFncykgJHZhcgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIHtbbGxlbmd0aCAkdmFycyhtaXNzaW5nX3RhZ3MpXSA+IDB9IHsgCiAgICAgICAgICAgcHV0cyAiXG4gICAgICAgICAgICAgICAgVW5yZWNvZ25pemVkIFRhZ3MiCiAgICAgICAgICAgcHV0cyAiICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICBmb3JlYWNoIHRhZyAkdmFycyhtaXNzaW5nX3RhZ3MpIHsKICAgICAgICAgICAgICBwdXRzICIgICAgICAgICAgICAgICA+ICR0YWciCiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgIH0KICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGluZm9fY291bnQpXSAmJiAoJHZhcnMoaW5mb19jb3VudCkgPiAwKX0gewogICAgICAgICBwdXRzICJcbiAgICAgICAgICAgICAgICAgICBJbmZvIFN1bW1hcnkiCiAgICAgICAgIHB1dHMgIiAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgIGZvciB7c2V0IGkgMH0geyRpPCR2YXJzKGluZm9fY291bnQpfSB7aW5jciBpfSB7CiAgICAgICAgICAgIHB1dHMgIiAgICAoW2V4cHIgJGkgKyAxXSkgJGluZm9zKCRpKSIKICAgICAgICAgfQogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyh3YXJuaW5nX2NvdW50KV0gJiYgKCR2YXJzKHdhcm5pbmdfY291bnQpID4gMCl9IHsKICAgICAgICAgcHV0cyAiXG4gICAgICAgICAgICAgICAgICBXYXJuaW5nIFN1bW1hcnkiCiAgICAgICAgIHB1dHMgIiAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgIGZvciB7c2V0IGkgMH0geyRpPCR2YXJzKHdhcm5pbmdfY291bnQpfSB7aW5jciBpfSB7CiAgICAgICAgICAgIHB1dHMgIiAgICAoW2V4cHIgJGkgKyAxXSkgJHdhcm5pbmdzKCRpKSIKICAgICAgICAgfQogICAgICB9CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhlcnJvcl9jb3VudCldICYmICgkdmFycyhlcnJvcl9jb3VudCkgPiAwKX0gewogICAgICAgICBwdXRzICJcbiAgICAgICAgICAgICAgICAgICBFcnJvciBTdW1tYXJ5IgogICAgICAgICBwdXRzICIgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgZm9yIHtzZXQgaSAwfSB7JGk8JHZhcnMoZXJyb3JfY291bnQpfSB7aW5jciBpfSB7CiAgICAgICAgICAgIHB1dHMgIiAgICAoW2V4cHIgJGkgKyAxXSkgJGVycm9ycygkaSkiCiAgICAgICAgIH0KICAgICAgICAgaWYgeyR2YXJzKGFib3J0KX0gewogICAgICAgICAgICBwdXRzICJcbiIKICAgICAgICAgICAgcHV0cyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKICAgICAgICAgICAgcHV0cyAiPEZGPiBDT0RFIEdFTkVSQVRJT04gRkFJTEVEIgogICAgICAgICAgICBwdXRzICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgogICAgICAgICAgICBleGl0IDEKICAgICAgICAgfQogICAgICB9CiAgICAgIGlmIHskdmFycyhtYWtlKSAhPSAiYWxsIn0gewogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY3VzdG9tX3N0ZXBzKV19IHsKICAgICAgICAgICAgRkY6Omdlbl9tYWtlZmlsZSAkdmFycyhjdXN0b21fc3RlcHMpICR2YXJzKG1vZGUpCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIEZGOjpnZW5fbWFrZWZpbGUgJHZhcnMobWFrZSkgJHZhcnMobW9kZSkKICAgICAgICAgfQogICAgICB9CgoKIyAgICAgIGlmIHsoJHZhcnModXNlcl9tb2RlKSA9PSAiaGllciIpICYmICR2YXJzKGVuYWJsZV9mbGV4aWxtKX0gewojICAgICAgICAgZm9yZWFjaCBwYXJ0ICR2YXJzKHBhcnRpdGlvbl9saXN0KSB7CiMgICAgICAgICAgICBmaWxlIGNvcHkgJHZhcnMocGFydGl0aW9uX2Rpcl9wYXNzMikvJHBhcnQvTWFrZWZpbGUgJHZhcnMocGFydGl0aW9uX2Rpcl9wYXNzMikvJHBhcnQuTWFrZWZpbGUKIyAgICAgICAgIH0gCiMgICAgICB9CiAgICAgIAogICAgICBwdXRzICJcbiIKICAgICAgcHV0cyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKICAgICAgcHV0cyAiPEZGPiBDT0RFIEdFTkVSQVRJT04gQ09NUExFVEUiCiAgICAgIHB1dHMgIjxGRj4gLi4uIFZFUlNJT04gIC0+ICR2YXJzKHZlcnNpb24pIgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocnVuZGlyKV19IHsKICAgICAgICAgcHV0cyAiPEZGPiAuLi4gUlVOIERJUkVDVE9SWSAgLT4gJHZhcnMocnVuZGlyKSIKICAgICAgfQogICAgICBwdXRzICI8RkY+IC4uLiBTQ1JJUFRTICAtPiAkdmFycyhzY3JpcHRfZGlyKSIKICAgICAgcHV0cyAiPEZGPiAuLi4gUExVR0lOUyAgLT4gJHBsdWdpbnNfZGVmaW5lZCBkZWZpbmVkLCAkcGx1Z2luc19mb3VuZCBmb3VuZCIKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNoZWNrX3ZhcnMpXSAmJiAkdmFycyhjaGVja192YXJzKX0gewogICAgICAgICBwdXRzICI8RkY+IC4uLiBSRVBPUlRTICAtPiAkdmFycyhzY3JpcHRfZGlyKS9jaGVjay5ycHQiCiAgICAgICAgIHB1dHMgIjxGRj4gLi4uICAgICAgICAgIC0+ICR2YXJzKHNjcmlwdF9kaXIpL2NoZWNrX3ZhcnMucnB0IgogICAgICB9IGVsc2UgewogICAgICAgICBwdXRzICI8RkY+IC4uLiBSRVBPUlQgICAtPiAkdmFycyhzY3JpcHRfZGlyKS9jaGVjay5ycHQiCiAgICAgIH0KICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKG1ha2VmaWxlX25hbWUpXSAmJiBbZmlsZSBpc2ZpbGUgW3N1YnN0ICR2YXJzKG1ha2VmaWxlX25hbWUpXV19IHsKICAgICAgICAgcHV0cyAiPEZGPiAuLi4gTUFLRUZJTEUgLT4gW3JlbFBhdGhUbyBbc3Vic3QgJHZhcnMobWFrZWZpbGVfbmFtZSldIFtzdWJzdCAkdmFycyhydW5kaXIpXV0iCiAgICAgIH0KICAgICAgCiAgICAgIHB1dHMgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCgogICAgICBGRjo6ZHVtcF92YXJzCgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocnVuZGlyKV19IHsKICAgICAgICAgY2QgJGN3ZAogICAgICB9CiAgIH0KCiAgIHByb2MgZHVtcF92YXJzIHt9IHsKCiAgICAgIGdsb2JhbCB2YXJzCiAgICAgIGdsb2JhbCBlbnYKCiAgICAgICMgCiAgICAgICMgQ3JlYXRlIGEgcHJvY3MudGNsIGZpbGUgd2l0aCBmZiB1dGlsaXRpZXMgdGhhdCBhcmUgbmVlZCBieSB0aGUgZmxvdwogICAgICAjIAoKICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhwcm9jX2ZpbGUpXX0gewoKICAgICAgICAgcHV0cyAiPEZGPiBDcmVhdGluZyAkdmFycyhzY3JpcHRfZGlyKS9wcm9jcy50Y2wiCiAgICAgICAgIHNldCBzYXZlICR2YXJzKHJlcXVpcmVkX3Byb2NzKQogICAgICAgICBzZXQgb2YgW29wZW4gJHZhcnMoc2NyaXB0X2RpcikvcHJvY3MudGNsIHddCiAgICAgICAgIHNldCBmZl9wcm9jcyAiXG5uYW1lc3BhY2UgZXZhbCBmZl9wcm9jczo6IHtcbiIKICAgICAgICAgYXBwZW5kIGZmX3Byb2NzIFtnZXRfcmVxdWlyZWRfcHJvY3MgJHZhcnMoc2NyaXB0X3BhdGgpL0VUQy9JTk5PVlVTL3V0aWxzLnRjbF0KICAgICAgICAgYXBwZW5kIGZmX3Byb2NzIFtnZXRfcmVxdWlyZWRfcHJvY3MgJHZhcnMoc2NyaXB0X3BhdGgpL0VUQy91dGlscy50Y2xdCiAgICAgICAgIHNldCB2YXJzKHJlcXVpcmVkX3Byb2NzKSAic291cmNlX3BsdWciCiAgICAgICAgIGFwcGVuZCBmZl9wcm9jcyBbZ2V0X3JlcXVpcmVkX3Byb2NzICR2YXJzKHNjcmlwdF9wYXRoKS9FVEMvSU5OT1ZVUy91dGlscy50Y2xdCiMgICAgICAgICBhcHBlbmQgZmZfcHJvY3MgIiAgIG5hbWVzcGFjZSBleHBvcnQgbG9hZF9hcHBsZXRcbiIKICAgICAgICAgYXBwZW5kIGZmX3Byb2NzICJ9XG4iCiAgICAgICAgIHB1dHMgJG9mICRmZl9wcm9jcwogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnModXNlX2ZsZXhtb2RlbHMpXSAmJiAkdmFycyh1c2VfZmxleG1vZGVscyl9IHsKICAgICAgICAgICAgcHV0cyAkb2YgewogICAgICAgICAgICAgICAjIEZsZXhtb2RlbCBkZWZhdWx0cwogICAgICAgICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgICAgICAgIHNldFBsYWNlRGVzaWduTW9kZV9mZiAtY2xvbmVQbGFjZSBub1Bvc3RQbGFjZSAgOyNSRU1PVkUgYWZ0ZXIgZml4aW5nIENDUiA5NzQxMDMKICAgICAgICAgICAgICAgICAgc2V0IG1pYjo6RkVfbWFqb3JfdmVyc2lvbiAgW3N0cmluZyByYW5nZSBbZ2V0VmVyc2lvbl0gMCAxXQogICAgICAgICAgICAgICAgICBzZXQgbWliOjpGRV9taW5vcl92ZXJzaW9uICBbc3RyaW5nIHJhbmdlIFtnZXRWZXJzaW9uXSAzIDRdICAgICAgCiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIERlZmF1bHQgcHJpdmF0ZSB2YXIgc2V0dGluZ3MgZm9yIHByb3RvIGZsb3cgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICAgICAgICBzZXQgdHJpYWxSb3V0ZVByaXZhdGU6Omhvbm9yUHRuUGluU3BlYyAxICA7I3NvIFRSIGFkZHMgYmxvY2thZ2VzIHN0cmFkZGxpbmcgcHRuIGJvdW5kYXJ5IGJlZm9yZSByb3V0aW5nCiAgICAgICAgICAgICAgICAgIHNldCB0cmlhbFJvdXRlUHJpdmF0ZTo6ZW5hYmxlRmxleENlbGwgMSA7I2VuYWJsZSBmbGV4ZmlsbGVyX3JvdXRlX2Jsb2NrYWdlIGZvciBiZXR0ZXIgY29uZ2VzdGlvbi9wbGFjZW1lbnQgY29ycmVsYXRpb24gdG8gZnVsbCBuZXRsaXN0LgogICAgICAgICAgICAgICAgICBzZXQgdHJpYWxSb3V0ZVByaXZhdGU6OnVzZUNvbG9yTWFwICAxICA7I2VuYWJsZSBtdWNoIGZhc3RlciBoYW5kbGVQYXJ0aXRpb25Db21wbGV4IGFsZ29yaXRobQogICAgICAgICAgICAgICAgICBzZXQgdHJpYWxSb3V0ZVByaXZhdGU6Om92ZXJmbG93TGltaXQgNCA7I0dpdmluZyB1cCBwaGFzZSAxIHRyaWFsUm91dGUgcHJlbWF0dXJlbHkgd2hlbiB0aGUgb3ZlcmZsb3cgaXMgbW9yZSB0aGFuIDEwJQogICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMgSGlkZSBzZXR0aW5nIHZhcmlhYmxlcyBpbiB0aGUgcHJvdG90eXBpbmcgc2NyaXB0ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgICAgICAgIHNldFZhciB0aW1pbmdfbGlicmFyeV9zdXBwb3J0X21pc21hdGNoZWRfYXJjcyAwCiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICAgICAgICAgICMgUHJvY2VkdXJlIHRvIGNoZWNrIGZvciB1c2luZyBjb3JyZWN0IHByb3RvdHlwaW5nIGtpdAogICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICAgICAgICBwcm9jIG1pYjo6Y2hlY2tfcHJvdG9raXRfdmVyc2lvbiB7e2N1cnJlbnRfa2l0X3ZlcnNpb24gIiJ9fSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIHtbbHNlYXJjaCAkbWliOjpwcm90b2tpdF92ZXJzaW9uICRjdXJyZW50X2tpdF92ZXJzaW9uXSA9PSAtMX0gewogICAgICAgICAgICAgICAgICAgICAgICBQdXRzICIqV0FSTiogQ29ycmVjdCBwcm90b3R5cGluZyBraXQgc2hvdWxkIGJlIHVzZWQgdG8gYXZvaWQgdW4tZXhwZWN0ZWQgcHJvYmxlbXMiCiAgICAgICAgICAgICAgICAgICAgICAgIFB1dHMgIiAgICAgICBUaGlzIElubm92dXMgYnVpbGQgcmVxdWlyZXMgcHJvdG90eXBpbmcga2l0IHZlcnNpb24gW2xyYW5nZSAkbWliOjpwcm90b2tpdF92ZXJzaW9uIDAgNF0iCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICBtaWI6OmNoZWNrX3Byb3Rva2l0X3ZlcnNpb24gIkVESTEzLjIwLTAiICAKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgc2V0IHZhcnMocmVxdWlyZWRfcHJvY3MpICRzYXZlCgogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY3BmX2ZpbGUpXX0gewogICAgICAgICAgICBwdXRzICRvZiAiIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCiAgICAgICAgICAgIHB1dHMgJG9mICIjIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IC4uLiIKICAgICAgICAgICAgcHV0cyAkb2YgIiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgogICAgICAgICAgICBwdXRzICRvZiAiY2F0Y2gge2FsaWFzIGZmX21vZGlmeV9wb3dlcl9kb21haW5zIGZmX3Byb2NzOjptb2RpZnlfcG93ZXJfZG9tYWluc30iCiAgICAgICAgICAgIHB1dHMgJG9mICJjYXRjaCB7YWxpYXMgZmZfYWRkX3Bvd2VyX3N3aXRjaGVzIGZmX3Byb2NzOjphZGRfcG93ZXJfc3dpdGNoZXN9IgogICAgICAgICAgICBwdXRzICRvZiAiY2F0Y2gge2FsaWFzIGZmX3JvdXRlX3NlY29uZGFyeV9wZ19uZXRzIGZmX3Byb2NzOjpyb3V0ZV9zZWNvbmRhcnlfcGdfbmV0c30iCiAgICAgICAgICAgIHB1dHMgJG9mICJjYXRjaCB7YWxpYXMgZmZfZ2V0X3Bvd2VyX2RvbWFpbnMgZmZfcHJvY3M6OmdldF9wb3dlcl9kb21haW5zfSIKICAgICAgICAgICAgcHV0cyAkb2YgImNhdGNoIHthbGlhcyBmZl9idWZmZXJfYWx3YXlzX29uX25ldHMgZmZfcHJvY3M6OmJ1ZmZlcl9hbHdheXNfb25fbmV0c30iCiAgICAgICAgICAgIHB1dHMgJG9mICJjYXRjaCB7YWxpYXMgZmZfaW5zZXJ0X3dlbGx0YXBzX2VuZGNhcHMgZmZfcHJvY3M6Omluc2VydF93ZWxsdGFwc19lbmRjYXBzfSIKICAgICAgICAgICAgaWYgeyR2YXJzKG5vdnVzKX0geyAKICAgICAgICAgICAgICAgcHV0cyAkb2YgImNhdGNoIHthbGlhcyBGRl9OT1ZVUzo6bW9kaWZ5X3Bvd2VyX2RvbWFpbnMgZmZfcHJvY3M6Om1vZGlmeV9wb3dlcl9kb21haW5zfSIKICAgICAgICAgICAgICAgcHV0cyAkb2YgImNhdGNoIHthbGlhcyBGRl9OT1ZVUzo6YWRkX3Bvd2VyX3N3aXRjaGVzIGZmX3Byb2NzOjphZGRfcG93ZXJfc3dpdGNoZXN9IgogICAgICAgICAgICAgICBwdXRzICRvZiAiY2F0Y2gge2FsaWFzIEZGX05PVlVTOjpyb3V0ZV9zZWNvbmRhcnlfcGdfbmV0cyBmZl9wcm9jczo6cm91dGVfc2Vjb25kYXJ5X3BnX25ldHN9IgogICAgICAgICAgICAgICBwdXRzICRvZiAiY2F0Y2gge2FsaWFzIEZGX05PVlVTOjpnZXRfcG93ZXJfZG9tYWlucyBmZl9wcm9jczo6Z2V0X3Bvd2VyX2RvbWFpbnN9IgogICAgICAgICAgICAgICBwdXRzICRvZiAiY2F0Y2gge2FsaWFzIEZGX05PVlVTOjpidWZmZXJfYWx3YXlzX29uX25ldHMgZmZfcHJvY3M6OmJ1ZmZlcl9hbHdheXNfb25fbmV0c30iCiAgICAgICAgICAgICAgIHB1dHMgJG9mICJjYXRjaCB7YWxpYXMgRkZfTk9WVVM6Omluc2VydF93ZWxsdGFwc19lbmRjYXBzIGZmX3Byb2NzOjppbnNlcnRfd2VsbHRhcHNfZW5kY2Fwc30iCiAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgcHV0cyAkb2YgImNhdGNoIHthbGlhcyBGRl9FREk6Om1vZGlmeV9wb3dlcl9kb21haW5zIGZmX3Byb2NzOjptb2RpZnlfcG93ZXJfZG9tYWluc30iCiAgICAgICAgICAgICAgIHB1dHMgJG9mICJjYXRjaCB7YWxpYXMgRkZfRURJOjphZGRfcG93ZXJfc3dpdGNoZXMgZmZfcHJvY3M6OmFkZF9wb3dlcl9zd2l0Y2hlc30iCiAgICAgICAgICAgICAgIHB1dHMgJG9mICJjYXRjaCB7YWxpYXMgRkZfRURJOjpyb3V0ZV9zZWNvbmRhcnlfcGdfbmV0cyBmZl9wcm9jczo6cm91dGVfc2Vjb25kYXJ5X3BnX25ldHN9IgogICAgICAgICAgICAgICBwdXRzICRvZiAiY2F0Y2gge2FsaWFzIEZGX0VESTo6Z2V0X3Bvd2VyX2RvbWFpbnMgZmZfcHJvY3M6OmdldF9wb3dlcl9kb21haW5zfSIKICAgICAgICAgICAgICAgcHV0cyAkb2YgImNhdGNoIHthbGlhcyBGRl9FREk6OmJ1ZmZlcl9hbHdheXNfb25fbmV0cyBmZl9wcm9jczo6YnVmZmVyX2Fsd2F5c19vbl9uZXRzfSIKICAgICAgICAgICAgICAgcHV0cyAkb2YgImNhdGNoIHthbGlhcyBGRl9FREk6Omluc2VydF93ZWxsdGFwc19lbmRjYXBzIGZmX3Byb2NzOjppbnNlcnRfd2VsbHRhcHNfZW5kY2Fwc30iCiAgICAgICAgICAgfQogICAgICAgICB9CgogICAgICAgICBjbG9zZSAkb2YKICAgICAgICAgc2V0IHZhcnMocHJvY19maWxlKSAxCiAgICAgIH0KIyAgICAgIGlmIHtbZmlsZSB0YWlsIFtmaWxlIGRpcm5hbWUgW3B3ZF1dXSA9PSAiJHZhcnMocGFydGl0aW9uX2RpcikifSB7CiMgICAgICAgICBzZXQgb3AgW29wZW4gJHZhcnMoc2NyaXB0X2RpcikvdmFycy50Y2wgYV0KIyAgICAgICAgIGlmIHskdmFycyh1c2VyX21vZGUpID09ICJoaWVyIn0gewojICAgICAgICAgICAgaWYge1tmaWxlIHRhaWwgW2ZpbGUgZGlybmFtZSBbZXhlYyBwd2RdXV0gPT0gJHZhcnMocGFydGl0aW9uX2Rpcil9IHsKIyAgICAgICAgICAgICAgIHB1dHMgJG9wICJzb3VyY2UgJHZhcnMobm9ybV9zY3JpcHRfcGF0aCkvRVRDL2FwcGxldC50Y2wiCiMgICAgICAgICAgICAgICAjcHV0cyAkb3AgInNvdXJjZSAuLi8uLi8kdmFycyhzY3JpcHRfcGF0aCkvRVRDL2NvbXBhdGliaWxpdHkudGNsIgojICAgICAgICAgICAgICAgcHV0cyAkb3AgInNldF9hdHRyaWJ1dGUgYXBwbGV0X3NlYXJjaF9wYXRoICR2YXJzKG5vcm1fc2NyaXB0X3BhdGgpL0VUQy9hcHBsZXRzIC8iCiMgICAgICAgICAgICB9IGVsc2UgewojICAgICAgICAgICAgICAgcHV0cyAkb3AgInNvdXJjZSAkdmFycyhzY3JpcHRfcGF0aCkvRVRDL2FwcGxldC50Y2wiCiMgICAgICAgICAgICAgICAjcHV0cyAkb3AgInNvdXJjZSAuLi8uLi8kdmFycyhzY3JpcHRfcGF0aCkvRVRDL2NvbXBhdGliaWxpdHkudGNsIgojICAgICAgICAgICAgICAgcHV0cyAkb3AgInNldF9hdHRyaWJ1dGUgYXBwbGV0X3NlYXJjaF9wYXRoICR2YXJzKHNjcmlwdF9wYXRoKS9FVEMvYXBwbGV0cyAvIgojICAgICAgICAgICAgfQojICAgICAgICAgfQojICAgICAgICAgcHV0cyAkb3AgImFwcGxldCBsb2FkIG1lYXN1cmUiCiMgICAgICAgICBwdXRzICRvcCAiYXBwbGV0IGxvYWQgdGltZV9pbmZvIgojICAgICAgICAgY2xvc2UgJG9wCiMgICAgICAgICByZXR1cm4KIyAgICAgIH0KICAgICAgaWYge1tmaWxlIG5vcm1hbGl6ZSAkdmFycyhydW5kaXIpXSBuZSBbZmlsZSBub3JtYWxpemUgLl19IHsKICAgICAgICBzZXQgcmVsYXRpdml6ZVZhciAxCiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2V0IHJlbGF0aXZpemVWYXIgMAogICAgICB9CiMgICAgICBpZiB7JHJlbGF0aXZpemVWYXJ9IHsKIyAgICAgICAgcHV0cyAiPEZGPiBGaW5hbGl6aW5nIEZvdW5kYXRpb24gRmxvdyBWYXJpYWJsZXMgZm9yIGZpbmFsIHJ1bmRpcjogW3JlbFBhdGhUbyBbZmlsZSBub3JtYWxpemUgJHZhcnMocnVuZGlyKV0gW2ZpbGUgbm9ybWFsaXplIC5dXSIKIyAgICAgIH0KCiAgICAgICMgQkNMOiBzdWJzdGl0dXRlIHBsdWdkaXJzIGFuZCBjb2RlZ2VuIGRpciB3aXRoIHZhcmlhYmxlIHJlZmVyZW5jaW5nIChpLmUuLCByZXBsYWNlIGFjdHVhbCBkaXIgd2l0aCBbc3Vic3QgJHZhcnMoPGRpcj4pXSkgYmVmb3JlIHdyaXRpbmcgdmFycy50Y2wKICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhmZl9leGVfZGlyKV19IHsKICAgICAgICAgc2V0IHZhcnMoZmZfZXhlX2RpcikgW2V4ZWMgcHdkXQogICAgICB9CgogICAgICAjIEJDTDogVGhlIGZvbGxvd2luZyBhcmUgc2V0IHVzaW5nIHZhcmlhYmxlcyBpbiB0aGUgZ2VuZXJhdGVkIC5mZi50Y2wsIGFuZCBhcmUgdGhlcmVmb3JlIHB1bGxlZCBvdXQgb2YgdGhlIGdlbmVyYXRlZCB2YXJzLnRjbAogICAgICBzZXQgc2tpcFZhckxpc3Qge2ZmX2V4ZV9kaXIgcnVuZGlyIHBsdWdfZGlyIHJjX3BsdWdfZGlyIGxlY19wbHVnX2RpciBzY3JpcHRfZGlyIGZsb3dfc3RlcHMgZmxvd19zdGVwcyxmbGF0IGZsb3dfc3RlcHMsaGllcn0KCiAgICAgICMgQkNMOiBDaGFuZ2VkIHRvIHRjbCBmaWxlIG1rZGlyCiAgICAgIGZpbGUgbWtkaXIgJHZhcnMoc2NyaXB0X2RpcikKI0dHCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhzdHlsdXNfY29udmVydCldICYmICR2YXJzKHN0eWx1c19jb252ZXJ0KX0gewogICAgICAgIHNldCBhbmNob3IocGxhY2UpICJiZWZvcmUgcnVuX3BsYWNlX29wdCIKICAgICAgICBzZXQgYW5jaG9yKHByZWN0cykgImJlZm9yZSBydW5fcGxhY2Vfb3B0IgogICAgICAgIHNldCBhbmNob3IoY3RzKSAiYmVmb3JlIGFkZF9jbG9ja19zcGVjIgogICAgICAgIHNldCBhbmNob3IocG9zdGN0cykgImJlZm9yZSBhZGRfY2xvY2tfc3BlYyIKICAgICAgICBzZXQgYW5jaG9yKHBvc3RjdHNfaG9sZCkgImJlZm9yZSBhZGRfY2xvY2tfc3BlYyIKICAgICAgICBzZXQgYW5jaG9yKHJvdXRlKSAiYmVmb3JlIHJ1bl9yb3V0ZSIKICAgICAgICBzZXQgYW5jaG9yKHBvc3Ryb3V0ZSkgImJlZm9yZSBydW5fb3B0X3Bvc3Ryb3V0ZSIKICAgICAgICBzZXQgYW5jaG9yKHBvc3Ryb3V0ZV9ob2xkKSAiYmVmb3JlIHJ1bl9vcHRfcG9zdHJvdXRlIgoKICAgICAgICBzZXQgb3AgW29wZW4gJHZhcnMoc2NyaXB0X2RpcikvZmxvd19zdGVwcy50Y2wgd10KICAgICAgICBmb3JlYWNoIHN0ZXAgW0ZGOjphZGp1c3Rfc3RlcHNdIHsKICAgICAgICAgIGlmIHshW2luZm8gZXhpc3RzIGFuY2hvcigkc3RlcCldfSB7IAogICAgICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHN0ZXAsY29tbWFuZHMpXX0gewogICAgICAgICAgICAgIHVuc2V0IHZhcnMoJHN0ZXAsY29tbWFuZHMpCiAgICAgICAgICAgICAgY29udGludWUgCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkc3RlcCxjb21tYW5kcyldfSB7CiAgICAgICAgICAgIHB1dHMgJG9wICJjcmVhdGVfZmxvd19zdGVwIC1uYW1lIHByZV8kc3RlcCAtb3duZXIgY2FkZW5jZSBceyIKICAgICAgICAgICAgcHV0cyAkb3AgJHZhcnMoJHN0ZXAsY29tbWFuZHMpCiAgICAgICAgICAgIHB1dHMgJG9wICJcfSIKICAgICAgICAgICAgdW5zZXQgdmFycygkc3RlcCxjb21tYW5kcykKICAgICAgICAgICAgcHV0cyAkb2YgImVkaXRfZmxvdyAtYXBwZW5kIGZsb3dfc3RlcDpwcmVfJHN0ZXAgLVtsaW5kZXggJGFuY2hvcigkc3RlcCkgMF0gZmxvd19zdGVwOltsaW5kZXggJGFuY2hvcigkc3RlcCkgMV0iCiAgICAgICAgICB9CiAgICAgICAgfQoKIyAgICAgICAgc2V0IG9wIFtvcGVuIHNjcmlwdHMvZmxvd19jb25maWcudGNsIGFdCiMgICAgICAgIHB1dHMgJG9wICJzb3VyY2UgJHZhcnMoc2NyaXB0X2RpcikvZmxvd19zdGVwcy50Y2wiCiAgICAgICAgY2xvc2UgJG9wCgogICAgICAgICBGRjo6Y3JlYXRlX2NvZGVnZW5fZmlsZQogICAgICAgICBzZXQgb3AgW29wZW4gY29kZWdlbl9jcmVhdGUudHh0IGFdCiAgICAgICAgIHB1dHMgJG9wICJjb2RlZ2VuOjp0ZW1wbGF0ZSAuL3NjcmlwdHMvZmxvd19jb25maWcudGVtcGxhdGUgXHsiCiAgICAgICAgIHB1dHMgJG9wICIgIHBsYWNlaG9sZGVyIFx7PDwgUExBQ0VIT0xERVI6IFBBUkFTSVRJQyBMT0FEIE9QVElPTlMgPj5cfSBceyAtYWxsX3JjX2Nvcm5lciAtcmNkYiByY2RiLyR2YXJzKGRlc2lnbikucmNkYi5kIFx9IgogICAgICAgICBwdXRzICRvcCAiICBhcHBlbmQgXHsiCiAgICAgICAgIHB1dHMgJG9wICJjcmVhdGVfZmxvd19zdGVwIC1uYW1lIHdyaXRlX3BhcmFzaXRpY3MgLW93bmVyIGNhZGVuY2UgIFx7IgogICAgICAgICBwdXRzICRvcCAiICAgIGZpbGUgbWtkaXIgcmNkYiIKICAgICAgICAgcHV0cyAkb3AgIiAgICB3cml0ZV9yYyByY2RiLyR2YXJzKGRlc2lnbikucmNkYi5kIgogICAgICAgICBwdXRzICRvcCAiXH0iCiAgICAgICAgIHB1dHMgJG9wICJlZGl0X2Zsb3cgLWFmdGVyIGZsb3dfc3RlcDpydW5fb3B0X3Bvc3Ryb3V0ZSAtYXBwZW5kIGZsb3dfc3RlcDp3cml0ZV9wYXJhc2l0aWNzIgogICAgICAgICBmb3JlYWNoIGZpbGUgIiR2YXJzKHNjcmlwdF9kaXIpL2Zsb3dfc3RlcHMudGNsICR2YXJzKHNjcmlwdF9kaXIpL3BsdWdfc3RlcHMudGNsIiB7CiAgICAgICAgICAgaWYge1tmaWxlIGV4aXN0cyAkZmlsZV19IHsKICAgICAgICAgICAgIHNldCBpcCBbb3BlbiAkZmlsZSByXQogICAgICAgICAgICAgd2hpbGUge1tnZXRzICRpcCBsaW5lXT49MH0gewogICAgICAgICAgICAgICAgcHV0cyAkb3AgIiRsaW5lIgogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2xvc2UgJGlwCiAgICAgICAgICAgfQogICAgICAgICB9CgogICAgICAgICBwdXRzICRvcCAiICBcfSIKICAgICAgICAgcHV0cyAkb3AgIlx9IgogICAgICAgICBjbG9zZSAkb3AKICAgICAgfQogICAgICBmb3JlYWNoIHZhciBbYXJyYXkgbmFtZXMgdmFyc10gewogICAgICAgIGlmIHtbcmVnZXhwICIsY29tbWFuZHMkIiAkdmFyXX0gewogICAgICAgICAgdW5zZXQgdmFycygkdmFyKQogICAgICAgIH0KICAgICAgfQojICAgICAgZm9yZWFjaCBzdGVwICR2YXJzKHN0ZXBzKSB7CiMgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkc3RlcCxjb21tYW5kcyldfSB7CiMgICAgICAgICAgdW5zZXQgdmFycygkc3RlcCxjb21tYW5kcykKIyAgICAgICAgfQojICAgICAgfQogICAgICBzZXQgb3AgW29wZW4gJHZhcnMoc2NyaXB0X2RpcikvdmFycy50Y2wgd10KCiAgICAgIHB1dHMgJG9wICIjICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIyIKICAgICAgcHV0cyAkb3AgIiMgRm91bmRhdGlvbiBGbG93IENvZGVnZW4gVmFycyBSZWNvcmQiCiAgICAgIHB1dHMgJG9wICIjIEV4ZWN1dGVkIG9uIFtjbG9jayBmb3JtYXQgW2Nsb2NrIHNlY29uZHNdIC1mb3JtYXQgIiVJOiVNOiVTICVwKCViJWQpIl0gYnkgdXNlcjogW2V4ZWMgd2hvYW1pXSIKICAgICAgcHV0cyAkb3AgIiMgQ29weXJpZ2h0IDIwMDgtMjAxMiwgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcywgSW5jLiIKICAgICAgcHV0cyAkb3AgIiMgQWxsIFJpZ2h0cyBSZXNlcnZlZCIKICAgICAgcHV0cyAkb3AgIiMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAjIgogICAgICBwdXRzICRvcCAiIgogICAgICBwdXRzICRvcCAiIyBUaGlzIGZpbGUgY29udGFpbnMgYWxsIGRlZmF1bHQgKHNlZWRlZCkgdmFyaWFibGVzIGFuZCB1c2VyLWRlZmluZWQgdmFyaWFibGVzIHRoYXQgd2VyZSByZXNvbHZlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLiIKCiAgICAgIHB1dHMgJG9wICJpZiB7IVxbaW5mbyBleGlzdHMgdmFyc1xdfSB7IgogICAgICBwdXRzICRvcCAiICAgZ2xvYmFsIHZhcnMiCiAgICAgIHB1dHMgJG9wICJ9IgogICAgICBwdXRzICRvcCAiZ2xvYmFsIGVudiIKIyAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyh1c2VyX2FycmF5cyldfSB7CiMgICAgICAgICBmb3JlYWNoIGFycmF5ICR2YXJzKHVzZXJfYXJyYXlzKSB7CiMgICAgICAgICAgICBwdXRzICRvcCAiZ2xvYmFsICRhcnJheSIKIyAgICAgICAgIH0KIyAgICAgIH0KCiAgICAgICMgUHJpbnQgdmFyaWFibGVzIHdoaWNoIG1heSBiZSByZWZlcmVuY2VkIGJ5IG90aGVyIHZhcmlhYmxlcwogICAgICAjIE5vdGU6IEdlbmVyYWwgbWV0aG9kb2xvZ3kgaXMgdG8gbm90IHVzZSBtb3JlIHRoYW4gb25lIHZhcmlhYmxlIHJlZmVyZW5jZSAoaS5lLiwgZG9uJ3QgYWxsb3cgbXVsdGlwbGUgdmFyaWFibGUgZGVyZWZlcmVuY2luZykKICAgICAgcHV0cyAkb3AgInNldCBlbnYoVlBBVEgpICRlbnYoVlBBVEgpIgogICAgICBwdXRzICRvcCAic2V0IHZhcnMoZmZfZXhlX2RpcikgXCIkdmFycyhmZl9leGVfZGlyKVwiIgogICAgICBwdXRzICRvcCAic2V0IHZhcnMocnVuZGlyKSBcIiR2YXJzKHJ1bmRpcilcIiIKICAgICAgcHV0cyAkb3AgInNldCB2YXJzKHNjcmlwdF9kaXIpIFwiJHZhcnMoc2NyaXB0X2RpcilcIiIKICAgICAgcHV0cyAkb3AgIiIKCiMgR0RHIC4uLgojICAgICAgaWYgeyRyZWxhdGl2aXplVmFyfSB7CiMgICAgICAgIHNldCByZWxhdGl2aXplTWVzZ0xvZyAiIgojICAgICAgICAjIEZpcnN0IHJlbGF0aXZpemUgZmZfZXhlX2Rpci4gSWdub3JlIHBsdWcgdmFyaWFibGVzIGZvciBub3cgKG1heWJlIHRoaXMgY2FuIGJlIHJlbGF4ZWQ/KQojICAgICAgICAjIEFsbCBmaWxlcyBpbiB0aGlzIGZpcnN0IHJlbGF0aXZpemF0aW9uIHRhc2sgbXVzdCBleGlzdC4gU2tpcCBhbnl0aGluZyB0aGF0IGlzIGxvY2F0ZWQgaW4gdmFycyhydW5kaXIpLgojICAgICAgICBzZXQgcmVsYXRpdml6ZU1lc2dMb2cgIiRyZWxhdGl2aXplTWVzZ0xvZyBbRkY6OnJlbW92ZV9vdXRlcl9icmFjZXMgXAojICAgICAgICAgICBbRkY6OnJlbGF0aXZpemVGaWxlT3JEaXIgLXZhcmRpciBmZl9leGVfZGlyIC1tdXN0RXhpc3QgLXNraXBWYXIgc2NyaXB0X2RpciAtc2tpcFZhciBmZl9leGVfZGlyIFwKIyAgICAgICAgICAgICAgLXNraXBWYXIgcmNfcGx1Z19kaXIgLXNraXBWYXIgbGVjX3BsdWdfZGlyIC1za2lwVmFyIHBsdWdfZGlyIC1za2lwVmFyIHJ1bmRpciAtc2tpcERpciBbZmlsZSBub3JtYWxpemUgJHZhcnMocnVuZGlyKV1dXSIKIyAgICAgICAgIyBSZWxhdGl2aXplIGFsbCBmaWxlcyBpbiBydW5kaXIuIFNraXAgdmFyaWFibGUgcmVmZXJlbmNpbmcsIG1lYW5pbmcgZG8gbm90IGluY2x1ZGUgJHZhcnMocnVuZGlyKSBpbiB0aGUgZmluYWwgdmFyaWFibGUgdmFsdWUKIyAgICAgICAgc2V0IHJlbGF0aXZpemVNZXNnTG9nICIkcmVsYXRpdml6ZU1lc2dMb2cgW0ZGOjpyZW1vdmVfb3V0ZXJfYnJhY2VzIFtGRjo6cmVsYXRpdml6ZUZpbGVPckRpciAtdmFyZGlyIHJ1bmRpciAtc2tpcFZhcmlhYmxlVXNhZ2VJblJlZmVyZW5jZSAtc2tpcFZhciBzY3JpcHRfZGlyXV0iCiMgICAgICAgICMgU3dhcCBvdXQgdGhlIGludmlkaXVhbCBwbHVnIGRpciB2YXJpYWJsZXMKIyAgICAgICAgZm9yZWFjaCBkaXIgInJjX3BsdWdfZGlyIGxlY19wbHVnX2RpciBwbHVnX2RpciIgewojICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkZGlyKV19ICB7CiMgICAgICAgICAgICAgIyBSZWxhdGl2aXplIHRoZSBwbHVnaW4gKHN5bl9sb2FkX3J0bCBnb2VzIGZyb20gLi9wbHVnL0dFTlVTL3N5bl9sb2FkX3J0bC50Y2wgdG8gJHZhcnMocmNfcGx1Z19kaXIpL3N5bl9sb2FkX3J0bC50Y2wpCiMgICAgICAgICAgICAgc2V0IHJlbGF0aXZpemVNZXNnTG9nICIkcmVsYXRpdml6ZU1lc2dMb2cgW0ZGOjpyZW1vdmVfb3V0ZXJfYnJhY2VzIFwKIyAgICAgICAgICAgICAgICBbRkY6OnJlbGF0aXZpemVGaWxlT3JEaXIgLXZhcmRpciAkZGlyIC1tdXN0RXhpc3QgXAojICAgICAgICAgICAgICAgIC1leGFjdFN1YkRpck1hdGNoIFtmaWxlIG5vcm1hbGl6ZSAkdmFycygkZGlyKV1dXSIKIyAgICAgICAgICAgICAjIG5vcm1hbGl6ZSB0aGUgcGx1ZyBkaXJzCiMgICAgICAgICAgICAgc2V0IHZhcnMoJGRpcikgW2ZpbGUgbm9ybWFsaXplIFtzdWJzdCAkdmFycygkZGlyKV1dCiMgICAgICAgICAgfQojICAgICAgICB9CiMgICAgICB9CiAgICAgICMgUHJpbnQgcGx1Z2luIHZhcmlhYmxlcwogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocGx1Z19kaXIpXX0gICAgIHtwdXRzICRvcCAic2V0IHZhcnMocGx1Z19kaXIpIFwiJHZhcnMocGx1Z19kaXIpXCIifQogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocmNfcGx1Z19kaXIpXX0gIHtwdXRzICRvcCAic2V0IHZhcnMocmNfcGx1Z19kaXIpIFwiJHZhcnMocmNfcGx1Z19kaXIpXCIifQogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMobGVjX3BsdWdfZGlyKV19IHtwdXRzICRvcCAic2V0IHZhcnMobGVjX3BsdWdfZGlyKSBcIiR2YXJzKGxlY19wbHVnX2RpcilcIiJ9CiAgICAgIHB1dHMgJG9wICJcbiIKCiAgICAgICMgQWN0dWFsbHkgcHJpbnQgb3V0IGFsbCB0aGUgb3RoZXIgdmFyaWFibGVzCiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhpbml0X2NvbW1hbmRzKV19IHt1bnNldCB2YXJzKGluaXRfY29tbWFuZHMpfQogICAgICBmb3JlYWNoIHZhciBbbHNvcnQgW2FycmF5IG5hbWVzIHZhcnNdXSB7CiAgICAgICAgICMgQkNMOiBPbmx5IHdyaXRlIG91dCB2YXJpYWJsZSB2YWx1ZXMgaW4gY3VybGllcyBpZiBub3QgdXNpbmcgW3N1YnN0IC4uLl0KICAgICAgICAgaWYge1tsc2VhcmNoICRza2lwVmFyTGlzdCAkdmFyXSA9PSAtMX0gewogICAgICAgICAgIGlmIHtbcmVnZXhwIHtcJH0gJHZhcnMoJHZhcildfSB7CiAgICAgICAgICAgICBwdXRzICRvcCAic2V0IHZhcnMoJHZhcikgXCIkdmFycygkdmFyKVwiIgogICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBwdXRzICRvcCAic2V0IHZhcnMoJHZhcikgXHskdmFycygkdmFyKVx9IgogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICB9CgogICAgICAjIFByaW50IGFsaWFzZXMKICAgICAgcHV0cyAkb3AgInNldCB2YXJzKHJlc3RvcmVfZGVzaWduKSB7dHJ1ZX0iCgogICAgICAjIExvYWQgYXBwbGV0cwojICAgICAgcHV0cyAkb3AgInNvdXJjZSAkdmFycyhzY3JpcHRfcGF0aCkvRVRDL2FwcGxldC50Y2wiCiMgICAgICBwdXRzICRvcCAic291cmNlIC4uLy4uLyR2YXJzKHNjcmlwdF9wYXRoKS9FVEMvY29tcGF0aWJpbGl0eS50Y2wiCiMgICAgICBwdXRzICRvcCAic2V0X2F0dHJpYnV0ZSBhcHBsZXRfc2VhcmNoX3BhdGggJHZhcnMoc2NyaXB0X3BhdGgpL0VUQy9hcHBsZXRzIC8iCiMgICAgICBwdXRzICRvcCAiYXBwbGV0IGxvYWQgZ2VuZXJhdGVfcmVwb3J0IgojICAgICAgcHV0cyAkb3AgImFwcGxldCBsb2FkIG1lYXN1cmUiCiMgICAgICBwdXRzICRvcCAiYXBwbGV0IGxvYWQgdGltZV9pbmZvIgoKICAgICAgY2xvc2UgJG9wCgojICAgICAgaWYgeyRyZWxhdGl2aXplVmFyfSB7CiMgICAgICAgICMgV3JpdGUgb3V0IG1lc3NhZ2luZyByZWxhdGVkIHRvIHJlbGF0aXZpemVGaWxlT3JEaXIgb3V0cHV0CiMgICAgICAgIHNldCBvcCBbb3BlbiAkdmFycyhzY3JpcHRfZGlyKS9yZWxhdGl2aXplX3ZhcnMucnB0IHddCiMgICAgICAgIHB1dHMgJG9wICIjICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIyIKIyAgICAgICAgcHV0cyAkb3AgIiMgRm91bmRhdGlvbiBGbG93IFZhcmlhYmxlIFJlbGF0aXZpemF0aW9uIFJlcG9ydCIKIyAgICAgICAgcHV0cyAkb3AgIiMgRXhlY3V0ZWQgb24gW2Nsb2NrIGZvcm1hdCBbY2xvY2sgc2Vjb25kc10gLWZvcm1hdCAiJUk6JU06JVMgJXAoJWIlZCkiXSBieSB1c2VyOiBbZXhlYyB3aG9hbWldIgojICAgICAgICBwdXRzICRvcCAiIyBDb3B5cmlnaHQgMjAwOC0yMDEyLCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zLCBJbmMuIgojICAgICAgICBwdXRzICRvcCAiIyBBbGwgUmlnaHRzIFJlc2VydmVkIgojICAgICAgICBwdXRzICRvcCAiIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICMiCiMgICAgICAgIGZvcmVhY2ggbGluZSAkcmVsYXRpdml6ZU1lc2dMb2cgewojICAgICAgICAgIHB1dHMgJG9wICRsaW5lCiMgICAgICAgIH0KIyAgICAgICAgY2xvc2UgJG9wCiMgICAgICB9CgogICB9CgogICBwcm9jIGNsZWFudXBfZG90ZmlsZXMge30gewoKICAgICAgZ2xvYmFsIHZhcnMKCiAgICAgIGlmIHskdmFycyh1c2VyX21vZGUpICE9ICJoaWVyIn0gewogICAgICAgICByZXR1cm4KICAgICAgfQoKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHJ1bmRpcildfSB7IAogICAgICAgICBjZCAkdmFycyhydW5kaXIpCiAgICAgIH0KCiAgICAgIGZvcmVhY2ggZmlsZSBbZ2xvYiAkdmFycyhzY3JpcHRfZGlyKS9JTk5PVlVTLy4qXSB7CiAgICAgICAgIGlmIHtbZmlsZSBpc2ZpbGUgJGZpbGVdICYmICghW3JlZ2V4cCAiLm5mcyIgJGZpbGVdKX0gewogICAgICAgICAgICBmaWxlIGRlbGV0ZSAkZmlsZQogICAgICAgICAgICBpZiB7JHZhcnMoZGVidWcpfSB7CiAgICAgICAgICAgICAgIHB1dHMgIjxGRj4gRGVsZXRpbmcgJGZpbGUgLi4uIgogICAgICAgICAgICB9ICAgCiAgICAgICAgIH0KICAgICAgfQogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocGFydGl0aW9uX2RpcildICYmIFtpbmZvIGV4aXN0cyB2YXJzKHBhcnRpdGlvbl9saXN0KV19IHsgCiAgICAgICAgIGlmIHtbZmlsZSBpc2RpcmVjdG9yeSAkdmFycyhwYXJ0aXRpb25fZGlyKV19IHsKICAgICAgICAgICAgZm9yZWFjaCBwYXJ0IFtjb25jYXQgJHZhcnMoZGVzaWduKSAkdmFycyhwYXJ0aXRpb25fbGlzdCldIHsKICAgICAgICAgICAgICAgZm9yZWFjaCBmaWxlIFtnbG9iICR2YXJzKHBhcnRpdGlvbl9kaXIpLyRwYXJ0LyR2YXJzKHNjcmlwdF9kaXIpL0lOTk9WVVMvLipdIHsKICAgICAgICAgICAgICAgICAgaWYge1tmaWxlIGlzZmlsZSAkZmlsZV0gJiYgKCFbcmVnZXhwICIubmZzIiAkZmlsZV0pfSB7CiAgICAgICAgICAgICAgICAgICAgIGZpbGUgZGVsZXRlICRmaWxlCiAgICAgICAgICAgICAgICAgICAgIGlmIHskdmFycyhkZWJ1Zyl9IHsKICAgICAgICAgICAgICAgICAgICAgICAgcHV0cyAiPEZGPiBEZWxldGluZyAkZmlsZSAuLi4iCiAgICAgICAgICAgICAgICAgICAgIH0gICAKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmIHsoJHZhcnMoaGllcl9mbG93X3R5cGUpID09ICIycGFzcyIpfSB7CiAgICAgICAgICAgICAgICAgIGlmIHtbZmlsZSBpc2RpcmVjdG9yeSAkdmFycyhwYXJ0aXRpb25fZGlyX3Bhc3MyKV19IHsKICAgICAgICAgICAgICAgICAgICAgY2F0Y2gge3NldCBkb3RmaWxlcyBbZ2xvYiAkdmFycyhwYXJ0aXRpb25fZGlyX3Bhc3MyKS8kcGFydC8kdmFycyhzY3JpcHRfZGlyKS9JTk5PVlVTLy4qXX0KICAgICAgICAgICAgICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyBkb3RmaWxlc119IHsKICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCBmaWxlIFtnbG9iICR2YXJzKHBhcnRpdGlvbl9kaXJfcGFzczIpLyRwYXJ0LyR2YXJzKHNjcmlwdF9kaXIpL0lOTk9WVVMvLipdIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYge1tmaWxlIGlzZmlsZSAkZmlsZV0gJiYgKCFbcmVnZXhwICIubmZzIiAkZmlsZV0pfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgIGRlbGV0ZSAkZmlsZQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB7JHZhcnMoZGVidWcpfSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dHMgIjxGRj4gRGVsZXRpbmcgJGZpbGUgLi4uIgogICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfQogICB9CgogICBwcm9jIGdlbl9mbG93IHthcmdzfSB7CgogICAgICBnbG9iYWwgdmFycwoKICAgICAgaWYgeyFbaW5mbyBleGlzdHMgdmFycyhleGVjdXRlX3N0cmluZyldfSB7CiAgICAgICAgIHNldCB2YXJzKGV4ZWN1dGVfc3RyaW5nKSAiRkY6Omdlbl9mbG93ICRhcmdzIgogICAgICB9CgogICAgICAjIEFsbG93IHJlLWVudHJhbmNlCgogICAgICAgICBzZXQgdmFyX2xpc3QgW2xpc3Qgc291cmNlZCBic3RlcHMgd2FybmluZ3MgZXJyb3JzIGluZm9zIHdhcm5pbmdfY291bnQgZXJyb3JfY291bnQgaW5mb19jb3VudCBcCiAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbnNfZGVmaW5lZCBwbHVnaW5zX2ZvdW5kIG1pc3NpbmdfcGx1Z2lucyB0YWdnZWQgbWlzc2luZ190YWdzXQoKICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGFyZ19saXN0KV19IHsgCiAgICAgICAgIHNldCByZXNldF9saXN0IFtjb25jYXQgJHZhcnMoYXJnX2xpc3QpICR2YXJfbGlzdF0KICAgICAgfSBlbHNlIHsKICAgICAgICAgc2V0IHJlc2V0X2xpc3QgJHZhcl9saXN0CiAgICAgIH0KCiAgICAgIGZvcmVhY2ggdmFyICRyZXNldF9saXN0IHsKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKCR2YXIpXX0gewogICAgICAgICAgICB1bnNldCB2YXJzKCR2YXIpCiAgICAgICAgIH0KICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyBkYXJncygkdmFyKV19IHsKICAgICAgICAgICAgdW5zZXQgdmFycygkdmFyKQogICAgICAgICB9CiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgZGFyZ3MoJHZhcildfSB7CiAgICAgICAgICAgIHVuc2V0IHZhcnMoJHZhcikKICAgICAgICAgfQogICAgICB9CgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoZmxhdCldfSB7CiAgICAgICAgIHNldCBzYXZlICR2YXJzKGZsYXQpCiAgICAgIH0KCiAgICAgIHB1dHMgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCiAgICAgIHB1dHMgIjxGRj4gICAgICBGb3VuZGF0aW9uIEZsb3cgQ29kZSBHZW5lcmF0b3IiCiAgICAgIHB1dHMgIjxGRj4gICAgICAgIFZlcnNpb24gOiAxNy4xMC1wMDAzXzEiCiAgICAgIHB1dHMgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCgogICAgICAjIENoZWNrIFRDTCB2ZXJzaW9uCgogICAgICBGRjo6Y2hlY2tfdGNsX3ZlcnNpb24KCiAgICAgICMgQ3JlYXRlIGZsb3cgc2NyaXB0cwoKICAgICAgRkY6OmNyZWF0ZV9mbG93ICRhcmdzCgogICAgICAjIEFkanVzdCB2YXJpYWJsZXMgc28gdGhlIHJ1biBkaXIgY2FuIGJlIHJlbG9jYXRlZAoKICAgICAgRkY6OmRlbm9ybWFsaXplX3J1bmRpcgoKICAgICAgaWYge1tpbmZvIGV4aXN0cyBzYXZlXX0gewogICAgICAgICBzZXQgdmFycyhmbGF0KSAkc2F2ZQogICAgICB9IGVsc2UgewogICAgICAgICB1bnNldCB2YXJzKGZsYXQpCiAgICAgIH0KCiAgICAgIEZGOjpjbGVhbnVwX2RvdGZpbGVzCgogICAgICBpZiB7KFtpbmZvIGNvbW1hbmQgRkY6OmdldF90b29sXSBuZSAiIikgJiYgKFtGRjo6Z2V0X3Rvb2xdIGVxICJlZGkiKX0gewogICAgICAgICBwdXRzICI8RkY+IExvYWRpbmcgJHZhcnMoc2NyaXB0X2RpcikvcHJvY3MudGNsIC4uLiIKICAgICAgICAgdXBsZXZlbCAjMCBzb3VyY2UgJHZhcnMoc2NyaXB0X2RpcikvcHJvY3MudGNsCiAgICAgIH0KCiAgICAgIGlmIHskdmFycyhnZW5lcmF0ZV9mbG93X3N0ZXBzKX0gewogICAgICAgICBmaWxlIGRlbGV0ZSAtZm9yY2UgJHZhcnMoc2NyaXB0X2RpcikvSU5OT1ZVUwogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocGFydGl0aW9uX2RpcildICYmIFtpbmZvIGV4aXN0cyB2YXJzKHBhcnRpdGlvbl9saXN0KV19IHsgCiAgICAgICAgICAgIGlmIHtbZmlsZSBpc2RpcmVjdG9yeSAkdmFycyhwYXJ0aXRpb25fZGlyKV19IHsKICAgICAgICAgICAgICAgZm9yZWFjaCBwYXJ0IFtjb25jYXQgJHZhcnMoZGVzaWduKSAkdmFycyhwYXJ0aXRpb25fbGlzdCldIHsKICAgICAgICAgICAgICAgICAgaWYgW2ZpbGUgaXNkaXJlY3RvcnkgJHZhcnMocGFydGl0aW9uX2RpcikvJHBhcnQvJHZhcnMoc2NyaXB0X2RpcikvSU5OT1ZVU10gewogICAgICAgICAgICAgICAgICAgICBmaWxlIGRlbGV0ZSAtZm9yY2UgJHZhcnMocGFydGl0aW9uX2RpcikvJHBhcnQvJHZhcnMoc2NyaXB0X2RpcikvSU5OT1ZVUwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgIH0KCiAgIH0KCiAgIHByb2Mgc2VlZF9hbGxfdmFycyB7fSB7CiAgICAgIyBkZWZhdWx0cwogICAgIHNldCBzY3JpcHRfcGF0aCAiIgogICAgIHNldCBzY3JpcHRfZGlyICIiCiAgICAgc2V0IHNldHVwX3BhdGggIiIKICAgICBzZXQgc3ludGhfZmxvdyAiIgogICAgIHNldCBmb3JtYXRfbGluZXMgIiIKICAgICBzZXQgc3RlcCAiIgogIAogICAgICMgYXJnIHByb2Nlc3NpbmcKICAgICB3aGlsZSB7W2xsZW5ndGggJGFyZ3NdID4gMH0gewogICAgICAgc2V0IG9wdGlvbiBbbGluZGV4ICRhcmdzIDBdCiAgICAgICBzZXQgYXJncyBbbHJlcGxhY2UgJGFyZ3MgMCAwXQogICAgICAgc3dpdGNoIC1leGFjdCAtLSAkb3B0aW9uIHsKICAgICAgICAgIC1zY3JpcHRfcGF0aCB7CiAgICAgICAgICAgICBzZXQgc2NyaXB0X3BhdGggW2xpbmRleCAkYXJncyAwXQogICAgICAgICAgICAgc2V0IGFyZ3MgW2xyZXBsYWNlICRhcmdzIDAgMF0KICAgICAgICAgIH0KICAgICAgICAgIC1zY3JpcHRfZGlyIHsKICAgICAgICAgICAgIHNldCBzY3JpcHRfZGlyIFtsaW5kZXggJGFyZ3MgMF0KICAgICAgICAgICAgIHNldCBhcmdzIFtscmVwbGFjZSAkYXJncyAwIDBdCiAgICAgICAgICB9CiAgICAgICAgICAtc2V0dXBfcGF0aCB7CiAgICAgICAgICAgIHNldCBzZXR1cF9wYXRoIFtsaW5kZXggJGFyZ3MgMF0KICAgICAgICAgICAgc2V0IGFyZ3MgW2xyZXBsYWNlICRhcmdzIDAgMF0KICAgICAgICAgIH0KICAgICAgICAgIC1zeW50aF9mbG93IHsKICAgICAgICAgICAgc2V0IHN5bnRoX2Zsb3cgW2xpbmRleCAkYXJncyAwXQogICAgICAgICAgICBzZXQgYXJncyBbbHJlcGxhY2UgJGFyZ3MgMCAwXQogICAgICAgICAgfQogICAgICAgICAgLWZvcm1hdF9saW5lcyB7CiAgICAgICAgICAgIHNldCBzeW50aF9mbG93IFtsaW5kZXggJGFyZ3MgMF0KICAgICAgICAgICAgc2V0IGFyZ3MgW2xyZXBsYWNlICRhcmdzIDAgMF0KICAgICAgICAgIH0KICAgICAgICAgIC1zdGVwIHsKICAgICAgICAgICAgc2V0IHN0ZXAgW2xpbmRleCAkYXJncyAwXQogICAgICAgICAgICBzZXQgYXJncyBbbHJlcGxhY2UgJGFyZ3MgMCAwXQogICAgICAgICAgfQogICAgICAgfQogICAgIH07IyBlbmQgd2hpbGUgKHByb2Nlc3NpbmcgYXJncykKICAgfQoKICBuYW1lc3BhY2UgZXhwb3J0IGxvYWRfYXBwbGV0CiAgcHJvYyBsb2FkX2FwcGxldCB7YXJnc30gewogICAgc2V0IGRlZkFwcGxldE5TICI6OmFwcGxldCIKICAgIHNldCBkZWZTZXZlcml0eSAiZXJyb3IiCiAgICBzZXQgZGVmYXVsdExvY2FsSW5zdGFsbCAkOjpucyhhcHBsZXQpOjpsb2NhbEluc3RhbGwKICAgIHNldCBkZWZhdWx0TG9jYWxTZXJ2ZXIgJDo6bnMoYXBwbGV0KTo6bG9jYWxTZXJ2ZXIKICAgIHNldCByZXFBcHBsZXRWZXJzaW9uICIiCgogICAgc3dpdGNoIC0tIFtwYXJzZV9vcHRpb25zIFtjYWxsaW5nX3Byb2NdIHt9ICRhcmdzIFwKICAgICAgIi12ZXJzaW9uIHNvcyByZXF1aXJlZCB2ZXJzaW9uIG9mIGFwcGxldCAoZXF1YWwgb3IgZ3JlYXRlcikiIHJlcUFwcGxldFZlcnNpb24gXAogICAgICAiLXNldmVyaXR5IHNvcyBzZXZlcml0eSAoZXJyb3J8d2FybmluZ3xpbmZvKSIgc2V2ZXJpdHkgXAogICAgICAiLW5hbWVzcGFjZSBzb3MgbmFtZXNwYWNlIHRvIHNlYXJjaCBmb3IgYXBwbGV0IiBhcHBsZXROUyBcCiAgICAgICJzcnMgbmFtZSBvZiBhcHBsZXQiIGFwcGxldE5hbWVdIHsKICAgICAgICAgIC0yIHsgcmV0dXJuIH0KICAgICAgICAgIDAgeyByZXR1cm4gLWNvZGUgZXJyb3IgfQogICAgfQoKICAgIGlmIHskYXBwbGV0TlMgZXEgIiJ9IHsKICAgICAgICBzZXQgYXBwbGV0TlMgJGRlZkFwcGxldE5TCiAgICB9CgogICAgaWYgeyRzZXZlcml0eSBlcSAiIn0gewogICAgICBzZXQgc2V2ZXJpdHkgJGRlZlNldmVyaXR5CiAgICB9CiAgIAogICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIGFwcGxldCBoYXBwZW5lZCB0byBhbHJlYWR5IGJlIGxvYWRlZC4gSWYgc28sIGNoZWNrCiAgICAjIHdoZXRoZXIgdGhlcmUgaXMgYSBtaW5pbXVtIHZlcnNpb24gcmVxdWlyZW1lbnQgbWV0LiBJZiB5ZXMsIHNraXAgdGhlIHJlc3Qgb2YgdGhlIGFwcGxldAogICAgIyBJZiB0aGUgYXBwbGV0IGFscmVhZHkgZG9lcyBub3QgbWVldCB0aGUgbWluaW11bSB2ZXJzaW9uIHJlcXVpcmVtZW50LCB1bmxvYWQgaXQgKHVzaW5nIHBhY2thZ2UgZm9yZ2V0KQogICAgaWYgeyFbY2F0Y2gge3NldCBwcm92aWRlZFZlcnNpb24gW3BhY2thZ2UgcHJlc2VudCAke2FwcGxldE5TfTo6JGFwcGxldE5hbWVdfSBlcnJvck1lc3NhZ2VdfSB7CiAgICAgIGlmIHskcmVxQXBwbGV0VmVyc2lvbiBuZSAiIn0gewogICAgICAgIGlmIHtbcGFja2FnZSB2Y29tcGFyZSAkcHJvdmlkZWRWZXJzaW9uICRyZXFBcHBsZXRWZXJzaW9uXSA9PSAtMX0gewogICAgICAgICAgcHV0cyAibG9hZF9hcHBsZXQgSU5GTzogYXBwbGV0ICRhcHBsZXROYW1lIHdhcyBhbHJlYWR5IGxvYWRlZCwgYnV0IGl0J3MgdmVyc2lvbiAoJHByb3ZpZGVkVmVyc2lvbikgZGlkIG5vdCBtZWV0IHRoZSBtaW5pbXVtIHJlcXVpcmVkIHZlcnNpb24gKCRyZXFBcHBsZXRWZXJzaW9uKSIKICAgICAgICAgIHB1dHMgImxvYWRfYXBwbGV0IElORk86IFRoaXMgdmVyc2lvbiBvZiB0aGUgJGFwcGxldE5hbWUgYXBwbGV0IHdpbGwgYmUgcmVtb3ZlZCBhbmQgdGhlIGxvYWRfYXBwbGV0IHdpbGwgc2VhcmNoIGZvciBhIG5ld2VyIHZlcnNpb24gb2YgJGFwcGxldE5hbWUuLi4iCiAgICAgICAgICBwYWNrYWdlIGZvcmdldCAke2FwcGxldE5TfTo6JGFwcGxldE5hbWUKICAgICAgICB9IGVsc2UgewoJICBwdXRzICJsb2FkX2FwcGxldCBJTkZPOiBGb3VuZCAkYXBwbGV0TmFtZSBhbHJlYWR5IGxvYWRlZCBhbmQgaXQncyB2ZXJzaW9uICgkcHJvdmlkZWRWZXJzaW9uKSBhbHJlYWR5IG1lZXRzIHRoZSBtaW5pbXVtIHJlcXVpcmVkIHZlcnNpb24gKCRyZXFBcHBsZXRWZXJzaW9uKS4gU2tpcHBpbmcgbG9hZC4uLiIKCSAgcmV0dXJuCiAgICAgICAgfQogICAgICB9IGVsc2UgewoJcHV0cyAibG9hZF9hcHBsZXQgSU5GTzogRm91bmQgJGFwcGxldE5hbWUgYWxyZWFkeSBsb2FkZWQgd2l0aCB2ZXJzaW9uICgkcHJvdmlkZWRWZXJzaW9uKS4gU2tpcHBpbmcgYXBwbGV0IGxvYWQuLi4iCglyZXR1cm4KICAgICAgfQogICAgfQoKICAgICMgVGhlcmUgaXMgbm8gcHJldmlvdXNseSBsb2FkZWQgYXBwbGV0LiBDb250aW51ZSB3aXRoIHRoaXMgcHJvYy4uLgogICAgc2V0IEZvdW5kTWluVmVyc2lvblBhdGggMAogICAgc2V0IGZpbmFsU2VhcmNoUGF0aCAiIiAKICAgIHNldCBmYWlsZWRQYXRocyAiIgogICAgIyBCZWNhdXNlIElubm92dXMgaGFzIGl0J3Mgb3duIGdldF9hdHRyaWJ1dGUgY29tbWFuZCBub3csIHdlIG5lZWQgdG8gc2V0IHRoaXMgZGVwZW5kaW5nIG9uIHdoYXQgdG9vbCB3ZSBhcmUgaW4KICAgIGlmIHtbZ2V0X3Rvb2xdIGVxICJyYyJ9IHsKICAgICAgc2V0IHNlYXJjaFBhdGhMaXN0IFtnZXRfYXR0cmlidXRlIGFwcGxldF9zZWFyY2hfcGF0aCAvXQogICAgfSBlbHNlIHsKICAgICAgc2V0IHNlYXJjaFBhdGhMaXN0IFskOjpucyhjb21wYXQpOjpnZXRfYXR0cmlidXRlIGFwcGxldF9zZWFyY2hfcGF0aCAvXQogICAgfQogICAgc2V0IGFwcGxldFNlYXJjaFBhdGhDb3VudCBbbGxlbmd0aCAkc2VhcmNoUGF0aExpc3RdCgogICAgc2V0IG9yaWdhcHBsZXRTZWFyY2hQYXRoQ291bnQgJGFwcGxldFNlYXJjaFBhdGhDb3VudAogICAgc2V0IG9yaWdTZWFyY2hQYXRoICIiCiAgICAjIEZpcnN0IHBhc3M6IGRldGVybWluZSB3aGljaCBhcHBsZXQgaW5zdGFsbGF0aW9ucyBtZWV0IG1pbiByZXF1aXJlZCB2ZXJzaW9uLCBpZiBhbnkKICAgICMgVGhpcyBmb3IgbG9vcCBkb2VzIG5vdCBsb2FkIHRoZSBhcHBsZXRzLCBpdCBvbmx5IGRldGVybWluZXMgYSBmaW5hbCBzZWFyY2ggcGF0aCB0byB1c2UKICAgICMgSWYgbm9uZSBvZiB0aGUgc2VhcmNoIHBhdGhzIGNvbnRhaW4gdGhlIG1pbmltdW0gdmVyc2lvbiwgYW5kIHNldmVyaXR5IGNvZGUgaXMgZXJyb3IsIHRoaXMgcHJvYwogICAgIyB3aWxsIHJldHVybiBpbnNpZGUgdGhpcyBmb3JlYWNoIGxvb3Agd2l0aCBjb2RlIGVycm9yCiAgICBpZiB7JGFwcGxldFNlYXJjaFBhdGhDb3VudCA+IDF9IHsKICAgICAgcHV0cyAibG9hZF9hcHBsZXQgSU5GTzogQ2hlY2tpbmcgYWxsIGFwcGxldCBzZWFyY2ggcGF0aHMgZm9yIHZlcnNpb25zIG9mICRhcHBsZXROYW1lIgogICAgfQogICAgZm9yZWFjaCBwYXRoQ29tcG9uZW50ICRzZWFyY2hQYXRoTGlzdCB7CiAgICAgIGluY3IgYXBwbGV0U2VhcmNoUGF0aENvdW50IC0xCiAgICAgIGlmIHskb3JpZ2FwcGxldFNlYXJjaFBhdGhDb3VudCA+IDF9IHsKICAgICAgICBwdXRzIC1ub25ld2xpbmUgIiAgJHBhdGhDb21wb25lbnQgLi4uIgogICAgICB9IGVsc2UgewogICAgICAgIHB1dHMgLW5vbmV3bGluZSAibG9hZF9hcHBsZXQgSU5GTzogQ2hlY2tpbmcgYXBwbGV0X3NlYXJjaF9wYXRoOiAkcGF0aENvbXBvbmVudCAuLi4iCiAgICAgIH0KICAgICAgIyBJZiB0aGUgcGF0aCBjb21wb25lbnQgaXMgPGRlZmF1bHQ+IHJlcGxhY2Ugd2l0aCB0aGUgYXBwbGV0IGRlc2lnbmF0ZWQgc2VhcmNoIHBhdGggdmFsdWUgdXNpbmcgIlVwZGF0ZVNlYWNoUGF0aCIKICAgICAgaWYge1tzdHJpbmcgbWF0Y2ggIjxkZWZhdWx0PiIgJHBhdGhDb21wb25lbnRdfSB7CiAgICAgICAgc2V0IHBhdGhDb21wb25lbnQgWyQ6Om5zKGFwcGxldCk6OlVwZGF0ZVNlYXJjaFBhdGggJHBhdGhDb21wb25lbnRdCiAgICAgIH0KICAgICAgbGFwcGVuZCBvcmlnU2VhcmNoUGF0aCAkcGF0aENvbXBvbmVudAogICAgICBpZiB7W2ZpbGUgaXNkaXJlY3RvcnkgJHBhdGhDb21wb25lbnRdfSB7CglpZiB7W2ZpbGUgaXNmaWxlICRwYXRoQ29tcG9uZW50Ly5zZXJ2SW5mb119IHsKCSAgaWYge1tnZXRfdG9vbF0gZXEgInJjIn0gewogICAgICAgICAgICBzZXQgc291cmNlQ29tbWFuZCB0Y2xfc291cmNlCgkgIH0gZWxzZSB7CgkgICAgc2V0IHNvdXJjZUNvbW1hbmQgc291cmNlCgkgIH0KCSAgIHNldCBlcnJvck1zZyAiIgogICAgICAgICAgYXJyYXkgdW5zZXQgYXBwSW5mbwoJICBpZiB7W2NhdGNoIHskc291cmNlQ29tbWFuZCAkcGF0aENvbXBvbmVudC8uc2VydkluZm99IGVycm9yTXNnXSB8fCAhW2luZm8gZXhpc3RzIGFwcEluZm8oJHthcHBsZXROU306OiR7YXBwbGV0TmFtZX0sdmVyc2lvbildfSB7CgkgICAgaWYgeyRlcnJvck1zZyBuZSAiIn0gewoJICAgICAgcHV0cyAiICRlcnJvck1zZyIKCSAgICB9IGVsc2UgewoJICAgICAgcHV0cyAiIEJBRCBBUFBMRVQgU0VSVkVSIChjb3JydXB0ZWQgLnNlcnZJbmZvIGZpbGUpIgoJICAgIH0KICAgICAgICAgIH0gZWxzZSB7CgkgICAgaWYgeyRyZXFBcHBsZXRWZXJzaW9uIGVxICIiIH0gewoJICAgICAgbGFwcGVuZCBtaW5WZXJzaW9uU2VhcmNoUGF0aCAkcGF0aENvbXBvbmVudCAgCgkgICAgICBzZXQgRm91bmRNaW5WZXJzaW9uUGF0aCAxCgkgICAgfSBlbHNlaWYge1twYWNrYWdlIHZjb21wYXJlICRhcHBJbmZvKCR7YXBwbGV0TlN9Ojoke2FwcGxldE5hbWV9LHZlcnNpb24pICRyZXFBcHBsZXRWZXJzaW9uXSAhPSAtMX0gewoJICAgICAgICBsYXBwZW5kIG1pblZlcnNpb25TZWFyY2hQYXRoICRwYXRoQ29tcG9uZW50ICAKCSAgICAgICAgc2V0IEZvdW5kTWluVmVyc2lvblBhdGggMQogCSAgICB9IGVsc2UgewoJICAgICAgbGFwcGVuZCBmYWlsZWRQYXRocyAkcGF0aENvbXBvbmVudAoJICAgICAgc2V0IGZhaWxlZFBhdGh2ZXIoJHBhdGhDb21wb25lbnQpICRhcHBJbmZvKCR7YXBwbGV0TlN9Ojoke2FwcGxldE5hbWV9LHZlcnNpb24pCgkgICAgfQoJICAgIHB1dHMgIiBGb3VuZCAkYXBwSW5mbygke2FwcGxldE5TfTo6JHthcHBsZXROYW1lfSx2ZXJzaW9uKSIKICAgICAgICAgIH0KCX0gZWxzZSB7CgkgIHB1dHMgIiBCQUQgQVBQTEVUIElOU1RBTEwiCiAgICAgICAgfQogICAgICB9IGVsc2UgewoJcHV0cyAiICBOT05FWElTVEVOVCBBUFBMRVQgU0VSVkVSIgogICAgICB9CiAgICB9OyMgZW5kIGZpcnN0IGZvcmVhY2ggbG9vcCAoZGlzdGlsbGluZyBmaW5hbCBtaW5pbXVtIHZlcnNpb24gYXBwbGV0X3NlYXJjaF9wYXRoCgogICAgIyBTZWNvbmQgcGFzczogYXR0ZW1wdCB0byBsb2FkIGFwcGxldCBpbiBlYWNoIHZhbGlkIHNlYXJjaF9wYXRoIHVudGlsIGEgc3VjY2Vzc2Z1bCBhcHBsZXQgbG9hZCBvY2N1cnMKICAgICMgVGhpcyBmb3IgbG9vcCBtdXN0IGxlYWQgdG8gYSBzdWNjZXNzZnVsIG91dGNvbWUgKGxvYWRlZCBhcHBsZXQpIG9yIGFuIGVycm9yIHdpbGwgYmUgaXNzdWVkCiAgICBpZiB7JEZvdW5kTWluVmVyc2lvblBhdGh9IHsKICAgICAgZm9yZWFjaCBzZWFyY2hQYXRoICRtaW5WZXJzaW9uU2VhcmNoUGF0aCB7CiAgICAgICAgc2V0X2F0dHJpYnV0ZSAtcXVpZXQgYXBwbGV0X3NlYXJjaF9wYXRoICRzZWFyY2hQYXRoIC8KICAgICAgICBpZiB7W2NhdGNoIHthcHBsZXQgbG9hZCAkYXBwbGV0TmFtZX0gZXJyb3JNc2ddfSB7CiAgICAgICAgICBwdXRzICJsb2FkX2FwcGxldCBJTkZPOiBWZXJzaW9uIGNoZWNrIHBhc3NlZCBvbiBhcHBsZXQgaW5zdGFsbCAkYXBwbGV0TmFtZSBidXQgYXBwbGV0IGxvYWQgZmFpbGVkLiIKICAgICAgICAgIGlmIHskYXBwbGV0U2VhcmNoUGF0aENvdW50ID4gMH0gewogICAgICAgICAgICBwdXRzICJsb2FkX2FwcGxldDogVHJ5aW5nIG5leHQgYXBwbGV0X3NlYXJjaF9wYXRoLi4uIgogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcHV0cyAibG9hZF9hcHBsZXQ6IEVSUk9SOiBGYWlsZWQgdG8gbG9hZCBhcHBsZXQgJGFwcGxldE5hbWUuIFBsZWFzZSBjaGVjayB5b3VyIGFwcGxldF9zZWFyY2hfcGF0aCBhbmQgYXBwbGV0IGluc3RhbGxhdGlvbihzKS4iCgkgICAgc2V0X2F0dHJpYnV0ZSAtcXVpZXQgYXBwbGV0X3NlYXJjaF9wYXRoICRvcmlnU2VhcmNoUGF0aCAvCiAgICAgICAgICAgIHJldHVybiAtY29kZSBlcnJvcgogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CgkgIGlmIHtbY2F0Y2gge3NldCBwcm92aWRlZFZlcnNpb24gW3BhY2thZ2UgcHJlc2VudCAke2FwcGxldE5TfTo6JGFwcGxldE5hbWVdfSBlcnJvck1lc3NhZ2VdfSB7CiAgICAgICAgICAgIHB1dHMgImxvYWRfYXBwbGV0OiBFUlJPUjogYXBwbGV0ICRhcHBsZXROYW1lIGxvYWRlZCBjb3JyZWN0bHksIGJ1dCB0aGUgYXBwbGV0IGRpZCBub3QgY29ycmVjdGx5IHByb3ZpZGUgYSBwYWNrYWdlIHZlcnNpb24uIFRyeWluZyBuZXh0IHNlYXJjaCBwYXRoLi4uIgoJICB9IGVsc2UgewogICAgICAgICAgICBwdXRzICJsb2FkX2FwcGxldDogSU5GTzogQXBwbGV0ICRhcHBsZXROYW1lICRwcm92aWRlZFZlcnNpb24gc3VjY2Vzc2Z1bGx5IGxvYWRlZCBmcm9tIGFwcGxldCBpbnN0YWxsYXRpb24gYXQgJHBhdGhDb21wb25lbnQsIG1lZXRpbmcgbWluIHZlcnNpb24gcmVxdWlyZW1lbnQgKCRyZXFBcHBsZXRWZXJzaW9uKSIKCSAgICBzZXRfYXR0cmlidXRlIC1xdWlldCBhcHBsZXRfc2VhcmNoX3BhdGggJG9yaWdTZWFyY2hQYXRoIC8KCSAgICByZXR1cm4KCSAgfQogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgIyBEaWRuJ3QgZmluZCBhbnkgc2VhcmNoeSBwYXRocyB3aXRoIG1pbmltdW0gYXBwbGV0IGluc3RhbGxlZC4KICAgICAgc3dpdGNoIC1leGFjdCAtLSAkc2V2ZXJpdHkgewogICAgICAgIGVycm9yIHsKICAgICAgICAgIHB1dHMgImxvYWRfYXBwbGV0IEVSUk9SOiBNaW5pbXVtIGFwcGxldCB2ZXJzaW9uIGZvciBhcHBsZXQgJGFwcGxldE5hbWUgaXMgJHJlcUFwcGxldFZlcnNpb24sIGJ1dCBubyBhcHBsZXQgd2FzIGZvdW5kIG1lZXRpbmcgdGhpcyByZXF1aXJlbWVudC4iCgl9CiAgICAgICAgd2FybmluZyB7CiAgICAgICAgICBwdXRzICJsb2FkX2FwcGxldCBXQVJOSU5HOiBNaW5pbXVtIGFwcGxldCB2ZXJzaW9uIGZvciBhcHBsZXQgJGFwcGxldE5hbWUgaXMgJHJlcUFwcGxldFZlcnNpb24sIGJ1dCBubyBhcHBsZXQgd2FzIGZvdW5kIG1lZXRpbmcgdGhpcyByZXF1aXJlbWVudC4iCgl9CiAgICAgICAgaW5mbyB7CiAgICAgICAgICBwdXRzICJsb2FkX2FwcGxldCBJTkZPOiBNaW5pbXVtIGFwcGxldCB2ZXJzaW9uIGZvciBhcHBsZXQgJGFwcGxldE5hbWUgaXMgJHJlcUFwcGxldFZlcnNpb24sIGJ1dCBubyBhcHBsZXQgd2FzIGZvdW5kIG1lZXRpbmcgdGhpcyByZXF1aXJlbWVudC4iCgl9CiAgICAgIH0KICAgICAgcHV0cyAibG9hZF9hcHBsZXQgSU5GTzogU2VhcmNoIHJlc3VsdHM6IgogICAgICBmb3JlYWNoIHNlYXJjaFBhdGggJGZhaWxlZFBhdGhzIHsKICAgICAgICBwdXRzICIgIGFwcGxldF9zZWFyY2hfcGF0aDogJHNlYXJjaFBhdGgsICRhcHBsZXROYW1lIHZlcnNpb24gZm91bmQ6ICRmYWlsZWRQYXRodmVyKCRzZWFyY2hQYXRoKSIKICAgICAgfQogICAgICBwdXRzICJsb2FkX2FwcGxldCBJTkZPOiBOb3RlIGFwcGxldCBzZWFyY2ggcGF0aCB0aGF0IHdhcyBzZXQ6IgogICAgICBwdXRzICIgICRvcmlnU2VhcmNoUGF0aCIgCiAgICAgIHN3aXRjaCAtZXhhY3QgLS0gJHNldmVyaXR5IHsKICAgICAgICBlcnJvciB7CgkgIHNldF9hdHRyaWJ1dGUgLXF1aWV0IGFwcGxldF9zZWFyY2hfcGF0aCAkb3JpZ1NlYXJjaFBhdGggLwogICAgICAgICAgcmV0dXJuIC1jb2RlIDk5CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBzZXRfYXR0cmlidXRlIC1xdWlldCBhcHBsZXRfc2VhcmNoX3BhdGggJG9yaWdTZWFyY2hQYXRoIC8KICB9CiAgcHJvYyBnZW5lcmF0ZV9yZXBvcnRzIHthcmdzfSB7CiAgICAgIGV2YWwgW2Zvcm1hdCAiJXMgJXMiIGdlbmVyYXRlX3JlcG9ydCAkYXJnc10KICB9ICAKICBwcm9jIHJ1bnRpbWVfaW5mbyB7YXJnc30gewogICAgICBldmFsIFtmb3JtYXQgIiVzICVzIiB0aW1lX2luZm8gJGFyZ3NdCiAgfQogIHByb2MgY2FwdHVyZV9tZXRyaWNzIHt9IHsKICAgICAgZ2xvYmFsIHZhcnMgCgogICAgICBzZXQgY29tbWFuZHMgIiIgCiAgICAgIGFwcGVuZCBjb21tYW5kcyAibWVhc3VyZSBxb3IgLW5hbWUgJHZhcnMoc3RlcCkgJHZhcnMoaHRtbF9zdW1tYXJ5KVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgInRpbWVfaW5mbyAtdGFibGUgZmZfZXh0IC1zdGFtcCAkdmFycyhzdGVwKVxuIgogICAgICBhcHBlbmQgY29tbWFuZHMgInRpbWVfaW5mbyAtdGFibGUgZmZfZXh0IC1yZXBvcnRcbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICJyZWRpcmVjdCAkdmFycyh0aW1lX2luZm9fcnB0KSB7dGltZV9pbmZvIC10YWJsZSBmZl9leHQgLXJlcG9ydH1cbiIKICAgICAgYXBwZW5kIGNvbW1hbmRzICJ0aW1lX2luZm8gLXF1aWV0IC10YWJsZSBmZl9leHQgLXNhdmUgJHZhcnModGltZV9pbmZvX2RiKVxuIgoKICAgICAgcmV0dXJuICRjb21tYW5kcwogIH0gCgogIHByb2MgaGVscCB7c3RlcH0gewoKICAgICAgZ2xvYmFsIHZhcnMKIAogICAgICBzb3VyY2UgJHZhcnMoc2NyaXB0X3BhdGgpL0VUQy9JTk5PVlVTL21hcHBlZF92YXJzLnRjbAoKICAgICAgaWYgeyFbaW5mbyBleGlzdHMgaGVscCgkc3RlcCxjYXRlZ29yaWVzKV19IHsKICAgICAgICAgcHV0cyAiPEZGPiBFUlJPUjogSW52YWxpZCBzdGVwL2NhdGVnb3J5IC4uLiB2YWxpZCBvcHRpb25zIGFyZToiCiAgICAgICAgIGZvcmVhY2ggY2F0ICRoZWxwKGNhdGVnb3JpZXMpIHsKICAgICAgICAgICAgcHV0cyAiICAgICAgICAgICAgJGNhdCIgICAgICAgICAgICAKICAgICAgICAgfQogICAgICAgICByZXR1cm4KICAgICAgfSAKCiAgICAgIHNldCBsZW5ndGggW3N0cmluZyBsZW5ndGggJHN0ZXBdCiAgICAgIHB1dHMgIiAgIFtzdHJpbmcgcmVwZWF0ID0gMTEwXSIKICAgICAgcHV0cyBbZm9ybWF0ICIgICAlKzU1cyA6ICUtNDJzIiAidmFyaWFibGUgKGNvbW1hbmQpIiB2YWx1ZXNdCiMgICAgICBwdXRzICIgICBWYXJpYWJsZXMgYWZmZWN0aW5nICckc3RlcCcgPT4gdmFyaWFibGUgKGNvbW1hbmQpIDogdmFsdWVzIgojICAgICAgcHV0cyAiICAgW3N0cmluZyByZXBlYXQgPSAxMTBdIgojICAgICAgcHV0cyAiICAgW3N0cmluZyByZXBlYXQgLSBbZXhwciA1My0oJGxlbmd0aC8yKV1dICRzdGVwIFtzdHJpbmcgcmVwZWF0IC0gW2V4cHIgNDctKCRsZW5ndGgvMildXSIKCiAgICAgIGZvcmVhY2ggY2F0ICRoZWxwKCRzdGVwLGNhdGVnb3JpZXMpIHsKICAgICAgICAgc2V0IGxlbmd0aCBbc3RyaW5nIGxlbmd0aCAkY2F0XQogICAgICAgICBwdXRzICIgICBbc3RyaW5nIHJlcGVhdCAtIFtleHByIDUzLSgkbGVuZ3RoLzIpXV0gJGNhdCBbc3RyaW5nIHJlcGVhdCAtIFtleHByIDQ3LSgkbGVuZ3RoLzIpXV0iCiAgICAgICAgIGZvcmVhY2ggdmFyIFtsc29ydCBbYXJyYXkgbmFtZXMgaGVscF1dIHsKICAgICAgICAgICAgaWYge1tyZWdleHAgJGNhdCwgJHZhcl19IHsKICAgICAgICAgICAgICAgaWYgeyRjYXQgbmUgW2xpbmRleCBbc3BsaXQgJHZhciAiLCJdIDBdfSB7IGNvbnRpbnVlIH0KICAgICAgICAgICAgICAgc2V0IGNvbW1hbmQgW2xpbmRleCBbc3BsaXQgJHZhciAiLCJdIDFdCiAgICAgICAgICAgICAgIGlmIHtbbGxlbmd0aCBbc3BsaXQgJHZhciAiLCJdXSA+IDN9IHsKICAgICAgICAgICAgICAgICAgc2V0IHZhcmlhYmxlIFtmb3JtYXQgIiVzLCVzIiBbbGluZGV4IFtzcGxpdCAkdmFyICIsIl0gMl0gW2xpbmRleCBbc3BsaXQgJHZhciAiLCJdIDNdXQogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBzZXQgdmFyaWFibGUgW2xpbmRleCBbc3BsaXQgJHZhciAiLCJdIDJdCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgc2V0IHZhbHVlcyAkaGVscCgkdmFyKQogICAgCiAgICAgICAgICAgICAgIGlmIHskY29tbWFuZCAhPSAiY2F0ZWdvcmllcyJ9IHsgCiAgICAgICAgICAgICAgICAgIHB1dHMgW2Zvcm1hdCAiICAgJSs1NXMgOiAlLTQycyIgIiR2YXJpYWJsZSAoJGNvbW1hbmQpIiAkdmFsdWVzXQogICAgICAgICAgICAgICB9IAogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgfQogICAgICBwdXRzICIgICBbc3RyaW5nIHJlcGVhdCA9IDExMF0iCiAgIH0KCiAgIyBBIHByb2NlZHVyZSB0byBkZXRlcm1pbmUgaWYgdGhlIGN1cnJlbnQgZmxvdyBpcyBsb3cgcG93ZXIgKGkuZS4sIENQRiBvciBJRUVFIDE4MDEgYmFzZWQpIAogIHByb2MgaXNfbHBfZmxvdyB7fSB7CiAgICAgIGdsb2JhbCB2YXJzCiAgICAgIHJldHVybiBbZXhwciB7W2luZm8gZXhpc3RzIHZhcnMoY3BmX2ZpbGUpXSAmJiAkdmFycyhjcGZfZmlsZSkgIT0gIiJ9IHx8IFwKICAgICAgICAgICAgICAgIHtbaW5mbyBleGlzdHMgdmFycyhpZWVlMTgwMV9maWxlKV0gJiYgJHZhcnMoaWVlZTE4MDFfZmlsZSkgIT0gIiJ9XQogIH0KICBwcm9jIGFkanVzdF9zdGVwcyB7fSB7CiAgIAogICAgICBnbG9iYWwgdmFycwogICAKICAgICAgc2V0IG5ld19zdGVwcyBbbGlzdF0KICAgCiAgICAgIHNldCBmaXJzdCAxCgogICAgICBmb3JlYWNoIHN0ZXAgJHZhcnMoc3RlcHMpIHsKICAgCiAgICAgICAgIGlmIHtbcmVnZXhwIF9ob2xkICRzdGVwXX0gewogICAgICAgICAgICBpZiB7KFtsc2VhcmNoICR2YXJzKGZpeF9ob2xkKSBbcmVnc3ViIF9ob2xkICRzdGVwICIiXV08MCl9IHsKICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgaWYgeygkdmFycyhzdGVwKSA9PSAicG9zdGN0c19ob2xkIikgJiYgJHZhcnMoc2tpcF9jdHMpfSB7CiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICB9CiAgCiAgICAgICAgIGlmIHsoJHN0ZXAgPT0gInByZWN0cyIpICYmICR2YXJzKHBsYWNlX29wdF9kZXNpZ24pfSB7CiAgICAgICAgICAgIGlmIHshKCgkdmFycyh1c2VyX21vZGUpID09ICJoaWVyIikgJiYgKFtmaWxlIHRhaWwgW3B3ZF1dID09ICR2YXJzKHRvcF9jZWxsKSkgJiYgJHZhcnMoZW5hYmxlX2ZsZXhpbG0pKX0gewogICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgeygkc3RlcCA9PSAiY3RzIikgJiYgJHZhcnMoc2tpcF9jdHMpfSB7CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgIH0KICAgICAgICAgaWYgeygkc3RlcCA9PSAicG9zdGN0cyIpfSB7CiAgICAgICAgICAgIGlmIHskdmFycyhza2lwX2N0cyl9IHsKICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiB7W3JlZ2V4cCAiXmNjb3B0IiBbc3RyaW5nIHRvbG93ZXIgJHZhcnMoY3RzX2VuZ2luZSldXX0gewogICAgICAgICAgICAgICBpZiB7JHZhcnMoY3RzX2VuZ2luZSkgIT0gImNjb3B0X2N0cyJ9IHsKICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgeygkc3RlcCA9PSAicG9zdGN0c19ob2xkIikgJiYgJHZhcnMocG9zdGN0c19zZXR1cF9ob2xkKSAmJiAoJHZhcnMoY3RzX2VuZ2luZSkgIT0gImNjb3B0X2N0cyIpfSB7CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgIH0KICAgICAgICAgaWYgeygkc3RlcCA9PSAicG9zdHJvdXRlX2hvbGQiKSAmJiAkdmFycyhwb3N0cm91dGVfc2V0dXBfaG9sZCl9IHsKICAgICAgICAgICAgY29udGludWUKICAgICAgICAgfQogICAgICAgICBsYXBwZW5kIG5ld19zdGVwcyAkc3RlcAogICAgICB9CgogICAgICByZXR1cm4gJG5ld19zdGVwcwogICB9CiAgcHJvYyBjcmVhdGVfY29kZWdlbl9maWxlIHt9IHsKCiAgICAgIGdsb2JhbCB2YXJzCgogICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoc3R5bHVzX2NvbnZlcnQpXSAmJiAkdmFycyhzdHlsdXNfY29udmVydCkgJiYgW2luZm8gZXhpc3RzIHZhcnMocGx1Z2luc19kZWZpbmVkKV19IHsKICAgICAgICBGRl9OT1ZVUzo6Y29udmVydF9wbHVnaW5zCiAgICAgICAgc2V0IG9wIFtvcGVuIGNvZGVnZW5fY3JlYXRlLnR4dCB3XQogICAgICAgIHB1dHMgJG9wICIjIS9ncmlkL2NvbW1vbi9wa2dzL3RjbHRrL3Y4LjViMy9iaW4vdGNsc2giCiAgICAgICAgcHV0cyAkb3AgInNvdXJjZSAvdm9scy9kc2dfdHJhY2tlci9pbm5vdnVzL2ZlL3NyYy9mbG93a2l0L3Rlc3RzL2NvZGVnZW5fZmxvd2tpdF90ZW1wbGF0ZV9tb2RpZmllci5saWIudGNsIgoKICAgICAgICBzZXQgdGltaW5nX2xpYnMgJHZhcnMoJHZhcnMoJHZhcnMoJHZhcnMoZGVmYXVsdF9zZXR1cF92aWV3KSxkZWxheV9jb3JuZXIpLGxpYnJhcnlfc2V0KSx0aW1pbmcpCiAgICAgICAgc2V0IHFyY190ZWNoICR2YXJzKCR2YXJzKCR2YXJzKCR2YXJzKGRlZmF1bHRfc2V0dXBfdmlldyksZGVsYXlfY29ybmVyKSxyY19jb3JuZXIpLHF4X3RlY2hfZmlsZSkKICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoJHZhcnMoJHZhcnMoZGVmYXVsdF9zZXR1cF92aWV3KSxjb25zdHJhaW50X21vZGUpLHN5bnRoX3NkYyldfSB7CiAgICAgICAgICBzZXQgc2RjX2ZpbGVzICR2YXJzKCR2YXJzKCR2YXJzKGRlZmF1bHRfc2V0dXBfdmlldyksY29uc3RyYWludF9tb2RlKSxzeW50aF9zZGMpCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNldCBzZGNfZmlsZXMgJHZhcnMoJHZhcnMoJHZhcnMoZGVmYXVsdF9zZXR1cF92aWV3KSxjb25zdHJhaW50X21vZGUpLHByZV9jdHNfc2RjKQogICAgICAgIH0KICAgICAgICBwdXRzICRvcCAiY29kZWdlbjo6dGVtcGxhdGUgLi9zY3JpcHRzL2Rlc2lnbl9jb25maWcudGVtcGxhdGUgXHsiCiAgICAgICAgcHV0cyAkb3AgIiAgcGxhY2Vob2xkZXIgXHs8PCBQTEFDRUhPTERFUjogUEFUSCBUTyBUSU1JTkcgTElCUyA+Plx9IFx7IFwuIFx9IiAKICAgICAgICBwdXRzICRvcCAiICBwbGFjZWhvbGRlciBcezw8IFBMQUNFSE9MREVSOiBQQVRIIFRPIExFRiBGSUxFUyA+Plx9IFx7IFwuIFx9IgogICAgICAgIHB1dHMgJG9wICIgIHBsYWNlaG9sZGVyIFx7PDwgUExBQ0VIT0xERVI6IFBBVEggVE8gVEVDSCBGSUxFUyA+Plx9IFx7IFwuIFx9IgogICAgICAgIHB1dHMgJG9wICIgIHBsYWNlaG9sZGVyIFx7PDwgUExBQ0VIT0xERVI6IExJU1QgT0YgVElNSU5HIExJQlJBUklFUyA+Plx9IFx7XHskdGltaW5nX2xpYnNcfVx9IgogICAgICAgIHB1dHMgJG9wICIgIHBsYWNlaG9sZGVyIFx7PDwgUExBQ0VIT0xERVI6IExJU1QgT0YgTEVGIEZJTEVTID4+XH0gXHtceyR2YXJzKGxlZl9maWxlcylcfVx9IgogICAgICAgIHB1dHMgJG9wICIgIHBsYWNlaG9sZGVyIFx7PDwgUExBQ0VIT0xERVI6IFBST0NFU1MgTk9ERSA+Plx9IFx7JHZhcnMocHJvY2VzcylcfSIKICAgICAgICBwdXRzICRvcCAiICBwbGFjZWhvbGRlciBcezw8IFBMQUNFSE9MREVSOiBRUkMgVEVDSCBGSUxFID4+XH0gXHskcXJjX3RlY2hcfSIKICAgICAgICBwdXRzICRvcCAiICBkZWxldGVfcGxhY2Vob2xkZXIgXHs8PCBQTEFDRUhPTERFUjogcGF0dGVybiA+Plx9IgogICAgICAgIHB1dHMgJG9wICIgIGRlbGV0ZSBce29wZXJhdGluZ19jb25kaXRpb25cfSIKICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoc3luX2xvYWRfcnRsX3RjbCldICYmIFtmaWxlIGlzZmlsZSAkdmFycyhzeW5fbG9hZF9ydGxfdGNsKV19IHsKIyAgICAgICAgICBwdXRzICRvcCAiICBhcHBlbmRfYWZ0ZXIgXHstIFJlYWQgaGRsIGRlc2lnbiwgRmxvdyBTdGVwIE5hbWU6IHJlYWRfaGRsXH0gXHsiCiAgICAgICAgICBwdXRzICRvcCAiICBhcHBlbmRfYWZ0ZXIgXHs8PCBQTEFDRUhPTERFUjogREVTSUdOIEhETCBMT0FEIE9QVElPTlMgPj5cfSBceyIKICAgICAgICAgIHNldCBpcCBbb3BlbiAkdmFycyhzeW5fbG9hZF9ydGxfdGNsKSByXQogICAgICAgICAgd2hpbGUge1tnZXRzICRpcCBsaW5lXT49MH0gewogICAgICAgICAgICBwdXRzICRvcCAiICAgJGxpbmUiCiAgICAgICAgICB9CiAgICAgICAgICBjbG9zZSAkaXAKICAgICAgICAgIHB1dHMgJG9wICIgIFx9IgogICAgICAgICAgcHV0cyAkb3AgIiAgZGVsZXRlX3BsYWNlaG9sZGVyIFx7PDwgUExBQ0VIT0xERVI6IERFU0lHTiBIREwgTE9BRCBPUFRJT05TID4+XH0iCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHB1dHMgJG9wICIgIGRlbGV0ZV9wbGFjZWhvbGRlciBcezw8IFBMQUNFSE9MREVSOiBERVNJR04gSERMIExPQUQgT1BUSU9OUyA+Plx9IgogICAgICAgIH0KICAgICAgICAgcHV0cyAkb3AgIiAgcGxhY2Vob2xkZXIgXHs8PCBQTEFDRUhPTERFUjogRUxBQk9SQVRJT04gT1BUSU9OUyA+Plx9IFx7JHZhcnMoZGVzaWduKVx9IgogICAgICAgICBwdXRzICRvcCAiICBwbGFjZWhvbGRlciBcezw8IFBMQUNFSE9MREVSOiBTREMgRklMRVMgPj5cfSBceyRzZGNfZmlsZXNcfSIKICAgICAgICAgcHV0cyAkb3AgIiAgcGxhY2Vob2xkZXIgXHs8PCBQTEFDRUhPTERFUjogUEhZU0lDQUwgREFUQSBMT0FEIE9QVElPTlMgPj5cfSBcey1sZWYgXHsgJHZhcnMobGVmX2ZpbGVzKSBcfVx9IgogICAgICAgICBwdXRzICRvcCAiICBwbGFjZWhvbGRlciBcezw8IFBMQUNFSE9MREVSOiBERVNJR04gREFUQSBMT0FEIE9QVElPTlMgPj5cfSBceyR2YXJzKG5ldGxpc3QpXH0iCiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhkZWZfZmlsZXMpXX0gewogICAgICAgICAgIHB1dHMgJG9wICIgIHBsYWNlaG9sZGVyIFx7PDwgUExBQ0VIT0xERVI6IERFRiBMT0FEIE9QVElPTlMgPj5cfSBceyR2YXJzKGRlZl9maWxlcylcfSIKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBwdXRzICRvcCAiICBkZWxldGVfcGxhY2Vob2xkZXIgXHs8PCBQTEFDRUhPTERFUjogREVGIExPQUQgT1BUSU9OUyA+Plx9IgogICAgICAgICB9CiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhmcF9maWxlKV19IHsKICAgICAgICAgICBwdXRzICRvcCAiICBwbGFjZWhvbGRlciBcezw8IFBMQUNFSE9MREVSOiBGUExBTiBMT0FEIE9QVElPTlMgPj5cfSBceyR2YXJzKGZwX2ZpbGUpXH0iCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgcHV0cyAkb3AgIiAgZGVsZXRlX3BsYWNlaG9sZGVyIFx7PDwgUExBQ0VIT0xERVI6IEZQTEFOIExPQUQgT1BUSU9OUyA+Plx9IgogICAgICAgICB9CiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjcGZfZmlsZSldfSB7CiAgICAgICAgICAgcHV0cyAkb3AgIiAgcGxhY2Vob2xkZXIgXHs8PCBQTEFDRUhPTERFUjogUE9XRVIgSU5URU5UIExPQUQgT1BUSU9OUyA+Plx9IFx7JHZhcnMoY3BmX2ZpbGUpXH0iCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgcHV0cyAkb3AgIiAgZGVsZXRlX3BsYWNlaG9sZGVyIFx7PDwgUExBQ0VIT0xERVI6IFBPV0VSIElOVEVOVCBMT0FEIE9QVElPTlMgPj5cfSIKICAgICAgICAgfQogICAgICAgICBwdXRzICRvcCAiICBkZWxldGVfcGxhY2Vob2xkZXIgXHs8PCBQTEFDRUhPTERFUjogQ0xPQ0sgTEVBRiBST1VURSBSVUxFID4+XH0iCiAgICAgICAgIHB1dHMgJG9wICIgIGRlbGV0ZV9wbGFjZWhvbGRlciBcezw8IFBMQUNFSE9MREVSOiBDTE9DSyBUUlVOSyBST1VURSBSVUxFID4+XH0iCiAgICAgICAgIHB1dHMgJG9wICIgIGRlbGV0ZV9wbGFjZWhvbGRlciBcezw8IFBMQUNFSE9MREVSOiBDTE9DSyBUT1AgUk9VVEUgUlVMRSA+Plx9IgogICAgICAgICBwdXRzICRvcCAiXH0iCiAgICAgICAgIHB1dHMgJG9wICJjb2RlZ2VuOjp0ZW1wbGF0ZSAuL3NjcmlwdHMvZ2VudXNfY29uZmlnLnRlbXBsYXRlIFx7IgogICAgICAgICBwdXRzICRvcCAiXH0iIAogICAgICAgICBwdXRzICRvcCAiY29kZWdlbjo6dGVtcGxhdGUgLi9zY3JpcHRzL2lubm92dXNfY29uZmlnLnRlbXBsYXRlIFx7IgogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMocHJvY2VzcyldfSB7CiAgICAgICAgICAgcHV0cyAkb3AgIiAgcGxhY2Vob2xkZXIgXHs8PCBQTEFDRUhPTERFUjogUFJPQ0VTUyBOT0RFID4+XH0gXHskdmFycyhwcm9jZXNzKVx9IgogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIHB1dHMgJG9wICIgIGRlbGV0ZV9wbGFjZWhvbGRlciBcezw8IFBMQUNFSE9MREVSOiBQUk9DRVNTIE5PREUgPj5cfSIKICAgICAgICAgfQogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoZmxvd19lZmZvcnQpXX0gewogICAgICAgICAgIHB1dHMgJG9wICIgIHBsYWNlaG9sZGVyIFx7PDwgUExBQ0VIT0xERVI6IEZMT1cgRUZGT1JUIExFVkVMID4+XH0gXHskdmFycyhmbG93X2VmZm9ydClcfSIKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBwdXRzICRvcCAiICBkZWxldGVfcGxhY2Vob2xkZXIgXHs8PCBQTEFDRUhPTERFUjogRkxPVyBFRkZPUlQgTEVWRUwgPj5cfSIKICAgICAgICAgfQogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnModGllX2NlbGxzKV19IHsKICAgICAgICAgICBwdXRzICRvcCAiICBwbGFjZWhvbGRlciBcezw8IFBMQUNFSE9MREVSOiBUSUVPRkYgQkFTRV9DRUxMIE5BTUVTID4+XH0gXHtceyR2YXJzKHRpZV9jZWxscylcfVx9IgogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIHB1dHMgJG9wICIgIGRlbGV0ZV9wbGFjZWhvbGRlciBcezw8IFBMQUNFSE9MREVSOiBUSUVPRkYgQkFTRV9DRUxMIE5BTUVTID4+XH0iCiAgICAgICAgIH0KICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGN0c190YXJnZXRfc2xldyldfSB7CiAgICAgICAgICAgcHV0cyAkb3AgIiAgcGxhY2Vob2xkZXIgXHs8PCBQTEFDRUhPTERFUjogQ0xPQ0sgVFJBTlNJVElPTiBUSU1FIFRBUkdFVCA+Plx9IFx7JHZhcnMoY3RzX3RhcmdldF9zbGV3KVx9IgogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIHB1dHMgJG9wICIgIGRlbGV0ZV9wbGFjZWhvbGRlciBcezw8IFBMQUNFSE9MREVSOiBDTE9DSyBUUkFOU0lUSU9OIFRJTUUgVEFSR0VUID4+XH0iCiAgICAgICAgIH0KICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKGN0c190YXJnZXRfc2tldyldfSB7CiAgICAgICAgICAgcHV0cyAkb3AgIiAgcGxhY2Vob2xkZXIgXHs8PCBQTEFDRUhPTERFUjogQ0xPQ0sgU0tFVyBUQVJHRVQgPj5cfSBceyR2YXJzKGN0c190YXJnZXRfc2tldylcfSIKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBwdXRzICRvcCAiICBkZWxldGVfcGxhY2Vob2xkZXIgXHs8PCBQTEFDRUhPTERFUjogQ0xPQ0sgU0tFVyBUQVJHRVQgPj5cfSIKICAgICAgICAgfQogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY3RzX2J1ZmZlcl9jZWxscyldfSB7CiAgICAgICAgICAgcHV0cyAkb3AgIiAgcGxhY2Vob2xkZXIgXHs8PCBQTEFDRUhPTERFUjogQ0xPQ0sgQlVGRkVSIEJBU0VfQ0VMTFMgTkFNRVMgPj5cfSBce1x7JHZhcnMoY3RzX2J1ZmZlcl9jZWxscylcfVx9IgogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIHB1dHMgJG9wICIgIGRlbGV0ZV9wbGFjZWhvbGRlciBcezw8IFBMQUNFSE9MREVSOiBDTE9DSyBCVUZGRVIgQkFTRV9DRUxMUyBOQU1FUyA+Plx9IgogICAgICAgICB9CiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhjdHNfaW52ZXJ0ZXJfY2VsbHMpXX0gewogICAgICAgICAgIHB1dHMgJG9wICIgIHBsYWNlaG9sZGVyIFx7PDwgUExBQ0VIT0xERVI6IENMT0NLIElOVkVSVEVSIEJBU0VfQ0VMTFMgTkFNRVMgPj5cfSBce1x7JHZhcnMoY3RzX2ludmVydGVyX2NlbGxzKVx9XH0iCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgcHV0cyAkb3AgIiAgZGVsZXRlX3BsYWNlaG9sZGVyIFx7PDwgUExBQ0VIT0xERVI6IENMT0NLIElOVkVSVEVSIEJBU0VfQ0VMTFMgTkFNRVMgPj5cfSIKICAgICAgICAgfQogICAgICAgICBpZiB7W2luZm8gZXhpc3RzIHZhcnMoY3RzX2Nsb2NrX2dhdGluZ19jZWxscyldfSB7CiAgICAgICAgICAgcHV0cyAkb3AgIiAgcGxhY2Vob2xkZXIgXHs8PCBQTEFDRUhPTERFUjogQ0xPQ0sgR0FUSU5HIEJBU0VfQ0VMTFMgTkFNRVMgPj5cfSBce1x7JHZhcnMoY3RzX2Nsb2NrX2dhdGluZ19jZWxscylcfVx9IgogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIHB1dHMgJG9wICIgIGRlbGV0ZV9wbGFjZWhvbGRlciBcezw8IFBMQUNFSE9MREVSOiBDTE9DSyBHQVRJTkcgQkFTRV9DRUxMUyBOQU1FUyA+Plx9IgogICAgICAgICB9CiAgICAgICAgIHB1dHMgJG9wICIgIGRlbGV0ZV9wbGFjZWhvbGRlciBcezw8IFBMQUNFSE9MREVSOiBST1VURSBUWVBFIE5BTUUgRk9SIENMT0NLIExFQUYgTkVUUyA+Plx9IgogICAgICAgICBwdXRzICRvcCAiICBkZWxldGVfcGxhY2Vob2xkZXIgXHs8PCBQTEFDRUhPTERFUjogUk9VVEUgVFlQRSBOQU1FIEZPUiBDTE9DSyBUUlVOSyBORVRTID4+XH0iCiAgICAgICAgIHB1dHMgJG9wICIgIGRlbGV0ZV9wbGFjZWhvbGRlciBcezw8IFBMQUNFSE9MREVSOiBST1VURSBUWVBFIE5BTUUgRk9SIENMT0NLIFRPUCBORVRTID4+XH0iCiAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhmaWxsZXJfY2VsbHMpXX0gewogICAgICAgICAgIHB1dHMgJG9wICIgIHBsYWNlaG9sZGVyIFx7PDwgUExBQ0VIT0xERVI6IEZJTExFUiBCQVNFX0NFTEwgTkFNRVMgPj5cfSBce1x7JHZhcnMoZmlsbGVyX2NlbGxzKVx9XH0iCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgcHV0cyAkb3AgIiAgZGVsZXRlX3BsYWNlaG9sZGVyIFx7PDwgUExBQ0VIT0xERVI6IEZJTExFUiBCQVNFX0NFTEwgTkFNRVMgPj5cfSIKICAgICAgICAgfQogICAgICAgICBwdXRzICRvcCAiXH0iCiAgICAgICAgIHB1dHMgJG9wICJjb2RlZ2VuOjp0ZW1wbGF0ZSAuL3NjcmlwdHMvdGVtcHVzX2NvbmZpZy50ZW1wbGF0ZSBceyIKICAgICAgICAgaWYge1tpbmZvIGV4aXN0cyB2YXJzKHByb2Nlc3MpXX0gewogICAgICAgICAgIHB1dHMgJG9wICIgIHBsYWNlaG9sZGVyIFx7PDwgUExBQ0VIT0xERVI6IFBST0NFU1MgTk9ERSA+Plx9IFx7JHZhcnMocHJvY2VzcylcfSIKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBwdXRzICRvcCAiICBkZWxldGVfcGxhY2Vob2xkZXIgXHs8PCBQTEFDRUhPTERFUjogUFJPQ0VTUyBOT0RFID4+XH0iCiAgICAgICAgIH0KICAgICAgICAgcHV0cyAkb3AgIlx9IgogICAgICAgICBjbG9zZSAkb3AKICAgICAgfQogIH0KfTsjIGVuZCBuYW1lc3BhY2UgRkYK