# smd_fuzzy_find 0.01 # Offers alternative spellings and/or close-matching articles from search terms. # Stef Dawson # http://www.stefdawson.com/ # ..................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ..................................................................... YTo5OntzOjQ6Im5hbWUiO3M6MTQ6InNtZF9mdXp6eV9maW5kIjtzOjY6ImF1dGhvciI7czoxMToiU3RlZiBEYXdzb24iO3M6MTA6ImF1dGhvcl91cmkiO3M6MjY6Imh0dHA6Ly93d3cuc3RlZmRhd3Nvbi5jb20vIjtzOjc6InZlcnNpb24iO3M6NDoiMC4wMSI7czoxMToiZGVzY3JpcHRpb24iO3M6Nzg6Ik9mZmVycyBhbHRlcm5hdGl2ZSBzcGVsbGluZ3MgYW5kL29yIGNsb3NlLW1hdGNoaW5nIGFydGljbGVzIGZyb20gc2VhcmNoIHRlcm1zLiI7czo0OiJoZWxwIjtzOjQ3MDM6IjxoMT5zbWRfZnV6enlfZmluZDwvaDE+DQoNCjxwPkV2ZXIgd2FudGVkIFRYUCdzIHNlYXJjaCBmYWNpbGl0eSB0byBiZSBhIGxpdHRsZSBtb3JlLCB3ZWxsLCBpbmFjY3VyYXRlPyBXYW50IG5vIG1vcmUuIERlZmluZSBob3cgZnV6enkgeW91ciBzZWFyY2ggaXMsIHdoZXJlIHRvIGxvb2sgYW5kIGhvdyBtdWNoIG9mIGEgbnVkZ2UgdG8gb2ZmZXIgeW91ciBzaXRlIHZpc2l0b3JzIHdpdGggcGhhdCBwaGluZ2Vycy48L3A+DQoNCjxwPlJlc3VsdHMgYXJlIG9yZGVyZWQgYnkgYXBwcm94aW1hdGUgcmVsZXZhbmN5IGFuZCBpdCdzIGF1dG9tYXRpY2FsbHkgY29udGV4dC1zZW5zaXRpdmUgYmVjYXVzZSB0aGUgcG9vbCBvZiB3b3JkcyBpdCBjb21wYXJlcyBhZ2FpbnN0IGFyZSBmcm9tIHlvdXIgc2l0ZS4gT24gYSB6b28gd2Vic2l0ZSwgc29tZW9uZSB0eXBpbmcgaW4gImxpbm8iIHdvbid0IGdldCBhcnRpY2xlcyBhYm91dCBmbG9vcmluZyBidXQgbW9yZSBsaWtlbHkgYXJ0aWNsZXMgYWJvdXQgbGlvbnMsIHdoaWNoIGlzIHdoYXQgdGhleSByZWFsbHkgd2FudGVkLiBXZSBob3BlLjwvcD4NCg0KPGgyPlVzYWdlIGF0IGEgZ2xhbmNlPC9oMj4NCjx1bD4NCjxsaT48Yj5zZWFyY2hfdGVybTwvYj4NCjxiciAvPldoYXQgeW91IHdvdWxkIGxpa2UgdG8gc2VhcmNoIGZvcjogZWl0aGVyIGEgZml4ZWQgc3RyaW5nIChyYXRoZXIgcG9pbnRsZXNzISkgb3IgIj9xIiAodGhlIGRlZmF1bHQpLiBNYXliZSBpbiBmdXR1cmUgb3RoZXIgdGhpbmdzIGxpa2UgP2N1c3RvbV9maWVsZCBzbyB5b3UgY2FuIGVtYmVkIHRoaXMgaW4gYW4gYXJ0aWNsZSBhbmQgZG8gcHN1ZWRvLXJlbGF0ZWQtYXJ0aWNsZSBzZWFyY2hlczwvbGk+DQo8bGk+PGI+bWF0Y2hfd2l0aDwvYj4NCjxiciAvPldoZXJlIHlvdSB3b3VsZCBsaWtlIHRvIGxvb2sgZm9yIGEgbWF0Y2ggKGkuZS4gd2hpY2ggYXJ0aWNsZSBmaWVsZHMpLiBEZWZpbmUgdGhlIG9iamVjdCB5b3Ugd2FudCB0byBsb29rIGluIChjdXJyZW50bHkgb25seSBhcnRpY2xlIGlzIHN1cHBvcnRlZCkgZm9sbG93ZWQgYnkgYSBjb2xvbiwgdGhlbiBhIHNlbWktY29sb24gc2VwYXJhdGVkIGxpc3Qgb2YgcGxhY2VzIHRvIGxvb2s6IDxjb2RlPm1hdGNoX3dpdGg9ImFydGljbGU6a2V5d29yZHM7Ym9keTtleGNlcnB0IjwvY29kZT4uIE9wdGlvbnMgYXJlIGtleXdvcmRzLCBib2R5LCBleGNlcnB0LCBjYXRlZ29yeTEsIGNhdGVnb3J5Miwgc2VjdGlvbiwgaWQsIGF1dGhvcmlkLCB0aXRsZSAoY29taW5nIHNvb246IGN1c3RvbSBmaWVsZHMgYW5kIGltYWdlIHNlYXJjaGluZykuIERlZmF1bHQgaXMgYXJ0aWNsZTprZXl3b3Jkcztib2R5O2V4Y2VycHQ7PC9saT4NCjxsaT48Yj5zaG93PC9iPg0KPGJyIC8+V2hhdCB0byBkaXNwbGF5OiB3aGV0aGVyIHRvIGxpc3QgdGhlIGNsb3Nlc3QgbWF0Y2hpbmcgYXJ0aWNsZXMsIGNsb3Nlc3QgbWF0Y2hpbmcgc2VhcmNoIHRlcm1zLCBvciBib3RoLiBDaG9pY2VzIGFyZSBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGVpdGhlciA8Y29kZT5hcnRpY2xlczwvY29kZT4gb3IgPGNvZGU+d29yZHM8L2NvZGU+LiBEZWZhdWx0OiAid29yZHMsIGFydGljbGVzIjwvbGk+DQo8bGk+PGI+c2VjdGlvbjwvYj4NCjxiciAvPkxpbWl0IHlvdXIgc2VhcmNoIHJlc3VsdHMgdG8gYSBwYXJ0aWN1bGFyIHNlY3Rpb24gb3IgdGhyZWU7IGdpdmUgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdC4gRGVmYXVsdDogZW1wdHkgKHRoZSB3aG9sZSBzaXRlKS4gQ29taW5nIHNvb246IChtYXliZSkgY2F0ZWdvcmllcy48L2xpPg0KPGxpPjxiPnRvbGVyYW5jZTwvYj4NCjxiciAvPkhvdyBmdXp6enkgdGhlIHNlYXJjaCBpcy4gQW4gaW50ZWdlciBmcm9tIDAgKGV4YWN0IG1hdGNoKSB0byAxMCAocHJldHR5IG11Y2ggbm90aGluZyBsaWtlIHdoYXQgeW91IHNlYXJjaGVkIGZvcikuIFByYWN0aWNhbCB2YWx1ZXMgYXJlIHVzdWFsbHkgMCwgMSwgMiAodGhlIGRlZmF1bHQpLCBvciBwb3NzaWJseSAzLjwvbGk+DQo8bGk+PGI+Y2FzZV9zZW5zaXRpdmU8L2I+DQo8YnIgLz5Eb2VzIHdoYXQgaXQgc2F5cyBvbiB0aGUgdGluLiAxPWNhc2Ugc2Vuc2l0aXZlIHNlYXJjaCwgMD1ub3QuIERlZmF1bHQ6IDA8L2xpPg0KPGxpPjxiPm1pbl93b3JkX2xlbmd0aDwvYj4NCjxiciAvPlRoZSBtaW5pbXVtIHdvcmQgbGVuZ3RoIHlvdSB3YW50IHJldHVybmluZy4gRGVmYXVsdDogNDwvbGk+DQo8bGk+PGI+bGltaXQ8L2I+DQo8YnIgLz5UaGUgbWF4aW11bSBudW1iZXIgb2Ygd29yZHMgYW5kL29yIGFydGljbGVzIHRvIGRpc3BsYXkuIEdpdmUgaXQgYSBzaW5nbGUgaW50ZWdlciBhbmQgaXQgbGltaXRzIGJvdGggdG8gdGhlIHNhbWUgdmFsdWUuIFNwZWNpZnlpbmcgPGNvZGU+YXJ0aWNsZXM6NTwvY29kZT4gd291bGQgcmVtb3ZlIGFueSBsaW1pdCB0byB0aGUgbnVtYmVyIG9mIGFsdGVybmF0aXZlIHNlYXJjaCB3b3JkcyBvZmZlcmVkIGJ1dCB3b3VsZCBsaW1pdCB0aGUgYXJ0aWNsZXMgdG8gYSBtYXhpbXVtIG9mIDUuIFNpbWlsYXJseSwgPGNvZGU+d29yZHM6NDwvY29kZT4gd291bGQgcmVtb3ZlIHRoZSBhcnRpY2xlIGxpbWl0IGFuZCBvbmx5IHNob3cgYSBtYXhpbXVtIG9mIDQgYWx0ZXJuYXRpdmUgd29yZHMuIEJvdGggb2YgdGhlc2UgYXJlIHN1YmplY3QgdG8gdGhlaXIgcmVzcGVjdGl2ZSAic2hvdyIgb3B0aW9ucyBiZWluZyBzZXQgb2YgY291cnNlLiBEZWZhdWx0OiA8Y29kZT53b3Jkczo1LCBhcnRpY2xlczoxMDwvY29kZT48L2xpPg0KPGxpPjxiPmZvcm08L2I+DQo8YnIgLz5UaGUgVFhQIGZvcm0gdG8gb3V0cHV0IHRoZSBsaXN0IG9mIGFydGljbGVzIGluLiBEZWZhdWx0OiBzZWFyY2hfcmVzdWx0cy4gTm90ZSB0aGF0IGJlY2F1c2UgdGhlIG1hdGNoZXMgbWF5IG5vdCBjb250YWluIGV4YWN0IHNlYXJjaCB0ZXJtcywgdGhlICdleGNlcnB0JyBwYXJ0IG9mIHNlYXJjaF9yZXN1bHRzIHdpdGggdGhlIGhpZ2hsaWdodGVkIG1hdGNoZXMgaXMgdXN1YWxseSBub3QgZGlzcGxheWVkITwvbGk+DQo8bGk+PGI+bm9fbWF0Y2hfbGFiZWw8L2I+DQo8YnIgLz5UaGUgcGhyYXNlIHRvIGRpc3BsYXkgd2hlbiBubyBtYXRjaGVzIChtYXliZSBub3QgZXZlbiBmdXp6eSBvbmVzISkgYXJlIGZvdW5kLiBEZWZhdWx0cyB0byB0aGUgTUxQIHN0cmluZyAnbm9fbWF0Y2gnLiBVc2UgPGNvZGU+bm9fbWF0Y2hfbGFiZWw9IiI8L2NvZGU+IHRvIHR1cm4gaXQgb2ZmLjwvbGk+DQo8bGk+PGI+c3VnZ2VzdF9sYWJlbDwvYj4NCjxiciAvPlRoZSBwaHJhc2UgdG8gZGlzcGxheSBpbW1lZGlhdGVseSBwcmlvciB0byBzaG93aW5nIGNsb3NlLW1hdGNoaW5nIGFydGljbGVzL3dvcmRzLiBEZWZhdWx0cyB0byB0aGUgTUxQIHN0cmluZyAnc3VnZ2VzdCcuIFVzZSA8Y29kZT5zdWdnZXN0X2xhYmVsPSIiPC9jb2RlPiB0byBzd2l0Y2ggaXQgb2ZmLjwvbGk+DQo8bGk+PGI+dG9vX3Nob3J0X2xhYmVsPC9iPg0KPGJyIC8+U2VhcmNoZXMgb2YgdW5kZXIgYWJvdXQgMyBjaGFyYWN0ZXJzIChzb21ldGltZXMgbW9yZSBkZXBlbmRpbmcgb24geW91ciBjb250ZW50KSBhcmUgdG9vIHNob3J0IGZvciBhbnkgcmVhc29uYWJsZSBmdXp6aW5lc3MgdG8gYmUgYXBwbGllZC4gVGhpcyBtZXNzYWdlIGlzIGRpc3BsYXllZCBpbiB0aGF0IGNpcmN1bXN0YW5jZS4gRGVmYXVsdHMgdG8gdGhlIE1MUCBzdHJpbmcgdG9vX3Nob3J0LiBVc2UgPGNvZGU+dG9vX3Nob3J0X2xhYmVsPSIiPC9jb2RlPiB0byBzd2l0Y2ggaXQgb2ZmLjwvbGk+DQo8L3VsPg0KPHA+Q29taW5nIHNvb246IGNsYXNzIG9wdGlvbnMsIGltYWdlIHN1cHBvcnQgKHdpdGggbHVjaykgYW5kIGEgZmV3IG90aGVyIGVuaGFuY2VtZW50cywgbWF5YmUgY2hhbmdlcyB0byB0aGUgcGF0dGVybiBtYXRjaGluZyBhbGdvcml0aG0gaWYgYW55b25lIHdhbnRzIHRvIGhlbHAuIFByZXR0eSBwbGVhc2U/ITwvcD4NCg0KPGgyPkV4YW1wbGUgdXNhZ2U8L2gyPg0KDQo8cD5TaW5jZSBpdCdzIG5vdCBuZWNlc3NhcmlseSBhIGRpcmVjdCByZXBsYWNlbWVudCBmb3IgdGhlIGJ1aWx0LWluIHNlYXJjaCAodGhvdWdoIGl0IHNvcnQgb2YgY2FuIGJlKSB0aGUgYmVzdCB3YXkgdG8gdXNlIGl0IGlzIGluIGNvbmp1bmN0aW9uIHdpdGggPGEgaHJlZj0iaHR0cDovL2ZvcnVtLnRleHRwYXR0ZXJuLmNvbS92aWV3dG9waWMucGhwP2lkPTE0MTYzIj5jaGhfaWZfZGF0YTwvYT4gaW4gYSBwYWdlIGxpa2UgdGhpczo8L3A+DQoNCjxwcmU+DQombHQ7dHhwOmlmX3NlYXJjaCZndDsNCiAgJmx0O3R4cDpjaGhfaWZfZGF0YSZndDsNCiAgICAmbHQ7ZGwgY2xhc3M9ImV4Y2VycHRzIiZndDsNCiAgICAgICZsdDt0eHA6YXJ0aWNsZSBsaW1pdD0iOCIgbGlzdGZvcm09ImV4Y2VycHRzIiAvJmd0Ow0KICAgICZsdDsvZGwmZ3Q7DQogICZsdDt0eHA6ZWxzZSAvJmd0Ow0KICAgICZsdDtkbCBjbGFzcz0iZXhjZXJwdHMiJmd0Ow0KICAgICAgJmx0O3R4cDpzbWRfZnV6enlfZmluZCBmb3JtPSJleGNlcnB0cyIgLyZndDsNCiAgICAmbHQ7L2RsJmd0Ow0KICAmbHQ7L3R4cDpjaGhfaWZfZGF0YSZndDsNCiZsdDsvdHhwOmlmX3NlYXJjaCZndDsNCjwvcHJlPg0KDQpTbyBpbiB0aGUgY2FzZSBhbiBleGFjdCB0ZXJtIGlzIGZvdW5kLCB0aGUgbm9ybWFsIFRYUCBzZWFyY2ggaXMgY2FsbGVkLiBJZiBhbiBleGFjdCBzZWFyY2ggdGVybSBpcyBub3QgZm91bmQsIGxldCBzbWRfZnV6enlfZmluZCBoYXZlIGEgZ28uIjtzOjQ6ImNvZGUiO3M6ODA4MDoiLy8gdjAuMDEgICBJbml0aWFsIHB1YmxpYyBiZXRhDQoNCnJlcXVpcmVfcGx1Z2luKCdzbWRfbGliJyk7DQpnbG9iYWwgJHNtZF9mdXp6TGFuZzsNCg0KJHNtZF9mdXp6X3N0ciA9IGFycmF5KA0KCSd0b29fc2hvcnQnID0+ICdUaGUgdGV4dCB5b3UgYXJlIHNlYXJjaGluZyBmb3IgaXMgcHJvYmFibHkgdG9vIHNob3J0LiBUcnkgYSBsb25nZXIgd29yZC4gJywNCgknbm9fbWF0Y2gnID0+ICdTb3JyeSwgbm8gcmVzdWx0cyBtYXRjaGVkICJ7c2VhcmNoX3Rlcm19IiBleGFjdGx5LiAnLA0KCSdzdWdnZXN0JyA9PiAnSGVyZSBhcmUgdGhlIGNsb3Nlc3QgbWF0Y2hpbmcge3RoaW5naWVzfSB0aGF0IG1heSBoZWxwIHlvdSBmaW5kIHdoYXQgeW91IGFyZSBsb29raW5nIGZvcjogJywNCgknc3VnZ2VzdF9qb2luJyA9PiAnYW5kJywNCgknYXJ0aWNsZXMnID0+ICdhcnRpY2xlcycsDQoJJ3dvcmRzJyA9PiAnd29yZHMnLA0KKTsNCiRzbWRfZnV6ekxhbmcgPSBuZXcgc21kX01MUCgnc21kX2Z1enp5X2ZpbmQnLCAnc21kX2Z1enonLCAkc21kX2Z1enpfc3RyKTsNCg0KZnVuY3Rpb24gc21kX2Z1enp5X2ZpbmQoJGF0dHMsICR0aGluZz0nJykgew0KCWdsb2JhbCAkcHJldGV4dDsNCglnbG9iYWwgJHNtZF9mdXp6TGFuZzsNCg0KCWV4dHJhY3QobEF0dHMoYXJyYXkoDQoJCSdmb3JtJyA9PiAnc2VhcmNoX3Jlc3VsdHMnLA0KCQknc2VjdGlvbicgPT4gJycsDQoJCSdzdWJjYXRzJyA9PiAnMCcsDQoJCSdzZWFyY2hfdGVybScgPT4gJz9xJywNCgkJJ21hdGNoX3dpdGgnID0+ICdhcnRpY2xlOmtleXdvcmRzO2JvZHk7ZXhjZXJwdCcsDQoJCSd0b2xlcmFuY2UnID0+ICcyJywNCgkJJ21pbl93b3JkX2xlbmd0aCcgPT4gJzQnLA0KCQknbGltaXQnID0+ICd3b3Jkczo1LCBhcnRpY2xlczoxMCcsDQoJCSdjYXNlX3NlbnNpdGl2ZScgPT4gJzAnLA0KCQknc2hvdycgPT4gJ3dvcmRzLCBhcnRpY2xlcycsDQoJCSdub19tYXRjaF9sYWJlbCcgPT4gJyMnLA0KCQknc3VnZ2VzdF9sYWJlbCcgPT4gJyMnLA0KCQkndG9vX3Nob3J0X2xhYmVsJyA9PiAnIycsDQoJKSwgJGF0dHMpKTsNCg0KCSRzZWFyY2hBbGxvdyA9IGFycmF5KCI/YyIsICIhYyIsICI/cyIsICIhcyIsICI/dCIsICIhdCIsICI/aWQiLCAiIWlkIiwgIj9xIiwgIiFxIiwgIj9maWVsZCIsICIhZmllbGQiKTsNCgkkc2hvd0FsbG93ID0gYXJyYXkoImFydGljbGVzIiwgIndvcmRzIik7DQoJJGNvbE5hbWVzID0gYXJyYXkoJ0tleXdvcmRzJyA9PiAiYXJ0aWNsZTprZXl3b3JkcyIsDQoJCQkJCQkJJ0JvZHknID0+ICJhcnRpY2xlOmJvZHkiLA0KCQkJCQkJCSdFeGNlcnB0JyA9PiAiYXJ0aWNsZTpleGNlcnB0IiwNCgkJCQkJCQknQ2F0ZWdvcnkxJyA9PiAiYXJ0aWNsZTpjYXRlZ29yeTEiLA0KCQkJCQkJCSdDYXRlZ29yeTInID0+ICJhcnRpY2xlOmNhdGVnb3J5MiIsDQoJCQkJCQkJJ1NlY3Rpb24nID0+ICJhcnRpY2xlOnNlY3Rpb24iLA0KCQkJCQkJCSdJRCcgPT4gImFydGljbGU6aWQiLA0KCQkJCQkJCSdBdXRob3JJRCcgPT4gImFydGljbGU6YXV0aG9yaWQiLA0KCQkJCQkJCSdUaXRsZScgPT4gImFydGljbGU6dGl0bGUiLA0KCQkJCQkJCSdjYXRlZ29yeScgPT4gImltYWdlOmNhdGVnb3J5IiwNCgkJCQkJCQknYWx0JyA9PiAiaW1hZ2U6YWx0IiwNCgkJCQkJCQknY2FwdGlvbicgPT4gImltYWdlOmNhcHRpb24iLA0KCQkJCQkJCSduYW1lJyA9PiAiaW1hZ2U6bmFtZSIpOw0KDQoJJHBsYWNlcyA9IGFycmF5KCd0ZXh0cGF0dGVybicgPT4gImFydGljbGUiLCAndHhwX2ltYWdlJyA9PiAiaW1hZ2UiKTsNCgkkc2Vjc2luID0gYXJyYXkoKTsNCgkkY2F0c2luID0gYXJyYXkoKTsNCgkkZnVsbFNlY0xpc3QgPSBhcnJheSgpOw0KCSRub3RTZWNMaXN0ID0gYXJyYXkoKTsNCgkkZGJGaWVsZCA9IGFycmF5KCk7DQoNCgkvLyBFeHBhbmQgdGhlIGFyZ3MgaW4gY2FzZSB0aGV5J3JlID8gb3IgISBzaG9ydGN1dHMsIGFuZCBkbyBzb21lIHZhbGlkaXR5IGNoZWNraW5nDQoJJGxvb2tpbiA9IHNtZF9zcGxpdFJhbmdlKCRtYXRjaF93aXRoLCAiOiIpOw0KCSRkYlRhYmxlID0gYXJyYXlfc2VhcmNoKCRsb29raW5bMF0sICRwbGFjZXMpOw0KCSRkYlRhYmxlID0gKCRkYlRhYmxlID09ICIiKSA/ICJhcnRpY2xlIiA6ICRkYlRhYmxlOw0KCSRpc0FydGljbGUgPSAoJGxvb2tpblswXSA9PSAiYXJ0aWNsZSIpID8gdHJ1ZSA6IGZhbHNlOw0KDQoJJGRiRmllbGRzID0gc21kX3NwbGl0UmFuZ2UoJGxvb2tpblsxXSwiOyIpOw0KCWZvcmVhY2ggKCRkYkZpZWxkcyBhcyAkbG9va0ZpZWxkKSB7DQoJCSRkYkZpZWxkW10gPSBhcnJheV9zZWFyY2goJGxvb2tpblswXS4iOiIuJGxvb2tGaWVsZCwgJGNvbE5hbWVzKTsNCgl9DQoJJHNlYXJjaF90ZXJtID0gc21kX2dldEF0dHMoJHNlYXJjaF90ZXJtLCRzZWFyY2hBbGxvdyk7DQoJJHNlYXJjaF90ZXJtID0gJHNlYXJjaF90ZXJtWzBdWzBdOw0KCSRtZXRhX3NlYXJjaCA9IG1ldGFwaG9uZSgkc2VhcmNoX3Rlcm0pOw0KCSRzb3VuZF9zZWFyY2ggPSBzb3VuZGV4KCRzZWFyY2hfdGVybSk7DQoJJHRvbGVyYW5jZSA9IGludHZhbCgkdG9sZXJhbmNlKTsNCgkkc2hvdyA9IHNtZF9nZXRBdHRzKCRzaG93LCBhcnJheSgpKTsNCgkkc2hvd0xpc3QgPSAkc2hvd1swXTsNCglmb3IgKCRpZHggPSAwOyAkaWR4IDwgY291bnQoJHNob3dMaXN0KTsgJGlkeCsrKSB7DQoJCWlmIChpbl9hcnJheSgkc2hvd0xpc3RbJGlkeF0sICRzaG93QWxsb3cpKSB7DQoJCQkkc2hvd0xpc3RbJGlkeF0gPSAkc21kX2Z1enpMYW5nLT5nVHh0KCRzaG93TGlzdFskaWR4XSk7DQoJCX0NCgl9DQoJJGxpbWl0QnkgPSBhcnJheSgpOw0KCSRsaW1pdCA9IHNtZF9nZXRBdHRzKCRsaW1pdCwgYXJyYXkoKSk7DQoJZm9yZWFjaCAoJGxpbWl0WzBdIGFzICRsaW1PcHRpb24pIHsNCgkJaWYgKGlzX251bWVyaWMoJGxpbU9wdGlvbikpIHsNCgkJCSRsaW1pdEJ5WyJhcnRpY2xlcyJdID0gJGxpbU9wdGlvbjsNCgkJCSRsaW1pdEJ5WyJ3b3JkcyJdID0gJGxpbU9wdGlvbjsNCgkJfSBlbHNlIHsNCgkJCSRsaW1zcGxpdCA9IHNtZF9zcGxpdFJhbmdlKCRsaW1PcHRpb24sICI6Iik7DQoJCQlpZiAoKGNvdW50KCRsaW1zcGxpdCkgPT0gMikgJiYgKGluX2FycmF5KCRsaW1zcGxpdFswXSwgJHNob3dBbGxvdykpICYmIChpc19udW1lcmljKCRsaW1zcGxpdFsxXSkpKSB7DQoJCQkJJGxpbWl0QnlbJGxpbXNwbGl0WzBdXSA9ICRsaW1zcGxpdFsxXTsNCgkJCX0NCgkJfQ0KCX0NCg0KCSR0aGluZ2llcyA9IGltcGxvZGUoIiAiLiRzbWRfZnV6ekxhbmctPmdUeHQoJ3N1Z2dlc3Rfam9pbicpLiIgIiwgJHNob3dMaXN0KTsNCgkkbm9fbWF0Y2hfbGFiZWwgPSAoJG5vX21hdGNoX2xhYmVsID09ICIjIikgPyAkc21kX2Z1enpMYW5nLT5nVHh0KCdub19tYXRjaCcsIGFycmF5KCJ7c2VhcmNoX3Rlcm19IiA9PiAkc2VhcmNoX3Rlcm0pKSA6ICRub19tYXRjaF9sYWJlbDsNCgkkc3VnZ2VzdF9sYWJlbCA9ICgkc3VnZ2VzdF9sYWJlbCA9PSAiIyIpID8gJHNtZF9mdXp6TGFuZy0+Z1R4dCgnc3VnZ2VzdCcsIGFycmF5KCJ7dGhpbmdpZXN9IiA9PiAkdGhpbmdpZXMpKSA6ICRzdWdnZXN0X2xhYmVsOw0KCSR0b29fc2hvcnRfbGFiZWwgPSAoJHRvb19zaG9ydF9sYWJlbCA9PSAiIyIpID8gJHNtZF9mdXp6TGFuZy0+Z1R4dCgndG9vX3Nob3J0JykgOiAkdG9vX3Nob3J0X2xhYmVsOw0KDQoJJHNlY3Rpb25zID0gc21kX2dldEF0dHMoJHNlY3Rpb24sYXJyYXkoIj9zIiwgIiFzIiwgIj9maWVsZCIsICIhZmllbGQiKSk7DQoJJGZ1bGxTZWNMaXN0ID0gJHNlY3Rpb25zWzBdOw0KCSRub3RTZWNMaXN0ID0gJHNlY3Rpb25zWzFdOw0KCSR3aGVyZSA9ICIiOw0KDQoJLy8gaW5jbHVkZWQgc2VjdGlvbnMNCglpZiAoJGlzQXJ0aWNsZSkgew0KCQkkdG1wYSA9IGFycmF5KCk7DQoJCWZvciAoJGlkeCA9IDA7ICRpZHggPCBjb3VudCgkZnVsbFNlY0xpc3QpOyAkaWR4KyspIHsNCgkJCSR0bXBhW10gPSAiJyIgLiRmdWxsU2VjTGlzdFskaWR4XS4gIiciOw0KCQl9DQoJCWlmIChjb3VudCgkdG1wYSkgPiAwKSB7DQoJCQkkc2Vjc2luW10gPSAic2VjdGlvbiBJTiAoIiAuaW1wbG9kZSgiLCIsICR0bXBhKS4gIikiOw0KCQl9DQoNCgkJLy8gZXhjbHVkZWQgc2VjdGlvbnMNCgkJJHRtcGEgPSBhcnJheSgpOw0KCQlmb3IgKCRpZHggPSAwOyAkaWR4IDwgY291bnQoJG5vdFNlY0xpc3QpOyAkaWR4KyspIHsNCgkJCSR0bXBhW10gPSAiJyIgLiRub3RTZWNMaXN0WyRpZHhdLiAiJyI7DQoJCX0NCgkJaWYgKGNvdW50KCR0bXBhKSA+IDApIHsNCgkJCSRzZWNzaW5bXSA9ICJzZWN0aW9uIE5PVCBJTiAoIiAuaW1wbG9kZSgiLCIsICR0bXBhKS4gIikiOw0KCQl9DQoNCgkJaWYgKGNvdW50KCRzZWNzaW4pID4gMCkgew0KCQkJJHdoZXJlIC49ICIoIiAuIGltcGxvZGUoIiBPUiAiLCAkc2Vjc2luKSAuICIpIjsNCgkJfSBlbHNlIHsNCgkJCSR3aGVyZSAuPSAiIjsNCgkJfQ0KDQoJfQ0KDQoJLy8gQ2F0Y2gtYWxsIGZvciB0aGUgd2hlcmUgc3RhdGVtZW50DQoJaWYgKCR3aGVyZSA9PSAiIikgew0KCQkkd2hlcmUgPSAiMT0xIjsNCgl9DQoNCgkkb3V0ID0gIiI7DQoJLy8gUGVyZm9ybSB0aGUgc2VhcmNoZXMNCgkkZmluZGVyID0gbmV3IHNtZF9GdXp6eUZpbmQoJHNlYXJjaF90ZXJtLCAkdG9sZXJhbmNlKTsNCglpZiAoJGZpbmRlci0+dG9vX3Nob3J0X2Vycikgew0KCQkkb3V0IC49ICRub19tYXRjaF9sYWJlbDsNCgkJJG91dCAuPSAkdG9vX3Nob3J0X2xhYmVsOw0KCX0gZWxzZSB7DQoJCSRjb2xzID0gIioiIC4gKCgkaXNBcnRpY2xlKSA/ICIsIHVuaXhfdGltZXN0YW1wKFBvc3RlZCkgQVMgdVBvc3RlZCIgOiAiIik7DQoJCSRycyA9IHNhZmVfcm93c19zdGFydCgkY29scywgJGRiVGFibGUsICR3aGVyZSk7DQoJCSRvcGZvcm0gPSAiIjsNCg0KCQlpZiAoJGlzQXJ0aWNsZSkgew0KCQkJJG9wZm9ybSA9IGZldGNoX2Zvcm0oJGZvcm0pOw0KCQl9DQoJCSRwYWdldXJsID0gc21kX3JlbW92ZVFTVmFyKCRwcmV0ZXh0WydyZXF1ZXN0X3VyaSddLCdxJyk7DQoJCSRhbGxGaWVsZHMgPSAiIjsNCgkJJGFydExpc3QgPSBhcnJheSgpOw0KCQkkdGVybUxpc3QgPSBhcnJheSgpOw0KCQl3aGlsZSgkcm93ID0gbmV4dFJvdygkcnMpKSB7DQoJCQkkYWxsRmllbGRzID0gIiI7DQoJCQkvLyBKb2luIGFsbCB0aGUgcmVxdWlyZWQgcGxhY2VzIHRvIGxvb2sgaW50byBhIGxvbmcgdGV4dCBibG9jaw0KCQkJZm9yZWFjaCAoJGRiRmllbGQgYXMgJHRoZUZpZWxkKSB7DQoJCQkJJGFsbEZpZWxkcyAuPSAkcm93WyR0aGVGaWVsZF0uIiwiOw0KCQkJfQ0KCQkJLy8gU3BsaXQgdGhlbSB1cCBieSBjb21tYS9zcGFjZSAocHJvYmFibHkgc2hvdWxkIGRvIG90aGVyIHB1bmN0dWF0aW9uIHRvbykuLi4NCgkJCSR3ZXJkcyA9IHNtZF9nZXRBdHRzKCRhbGxGaWVsZHMsIGFycmF5KCkpOw0KCQkJLy8gLi4uYW5kIHJlY29uc3RpdHV0ZSB0aGVtIGFzIGEgaHVnZSBzcGFjZS1kZWxpbWl0ZWQgc3RyaW5nDQoJCQkkd2VyZHMgPSBpbXBsb2RlKCIgIiwkd2VyZHNbMF0pOw0KDQoJCQkvLyBGaW5kIGNsb3NlIHdvcmQgbWF0Y2hlcw0KCQkJJG1hdGNoZXMgPSAkZmluZGVyLT5zZWFyY2goJHdlcmRzKTsNCgkJCWlmIChjb3VudCgkbWF0Y2hlcykgPiAwKSB7DQoJCQkJJHNob3J0ZXN0RGlzdCA9IDEwMDsgLy8gQSBzdHVwaWRseSBoaWdoIG51bWJlciB0byBzdGFydCB3aXRoDQoJCQkJJHNob3J0ZXN0TWV0YURpc3QgPSAtMTsNCgkJCQkkY2xvc2VzdFdvcmQgPSAiIjsNCgkJCQkkY2xvc2VzdE1ldGFXb3JkID0gIiI7DQoJCQkJJG1heF90ZXJtX2xlbiA9IDA7DQoJCQkJLy8gQnVpbGQgYSB1bmlxZSBhcnJheSBvZiBjbG9zZXN0IG1hdGNoaW5nIHdvcmRzDQoJCQkJd2hpbGUobGlzdCgkaWR4LCRkaXN0KSA9IGVhY2goJG1hdGNoZXMpKSB7DQoJCQkJCSR0ZXJtID0gc21kX2dldFdvcmQoJHdlcmRzLCRpZHgpOw0KCQkJCQkkbWF4X3Rlcm1fbGVuID0gKHN0cmxlbigkdGVybSkgPiAkbWF4X3Rlcm1fbGVuKSA/IHN0cmxlbigkdGVybSkgOiAkbWF4X3Rlcm1fbGVuOw0KCQkJCQlpZiAoc3RybGVuKCR0ZXJtKSA8ICRtaW5fd29yZF9sZW5ndGgpIHsNCgkJCQkJCWNvbnRpbnVlOw0KCQkJCQl9DQoJCQkJCSR0ZXJtID0gKCRjYXNlX3NlbnNpdGl2ZSkgPyAkdGVybSA6IHN0cnRvbG93ZXIoJHRlcm0pOw0KCQkJCQlpZiAoJGRpc3QgPCAkc2hvcnRlc3REaXN0KSB7DQoJCQkJCQkkc2hvcnRlc3REaXN0ID0gJGRpc3Q7DQoJCQkJCQkkY2xvc2VzdFdvcmQgPSAkdGVybTsNCgkJCQkJfQ0KCQkJCQkkbWV0YV90ZXJtID0gbWV0YXBob25lKCR0ZXJtKTsNCgkJCQkJJGxldkRpc3QgPSBsZXZlbnNodGVpbigkbWV0YV9zZWFyY2gsICRtZXRhX3Rlcm0pOw0KCQkJCQlpZiAoJGxldkRpc3QgPD0gJHNob3J0ZXN0TWV0YURpc3QgfHwgJHNob3J0ZXN0TWV0YURpc3QgPCAwKSB7DQoJCQkJCQkkc2hvcnRlc3RNZXRhRGlzdCA9ICRsZXZEaXN0Ow0KCQkJCQkJJGNsb3Nlc3RNZXRhV29yZCAgPSAkdGVybTsNCgkJCQkJfQ0KCQkJCX0NCgkJCQkvLyBQaWNrIHRoZSBvbmUgdGhhdCBzb3VuZHMgY2xvc2VzdCB0byB0aGUgb3JpZ2luYWwNCgkJCQlpZiAodHJpbSgkY2xvc2VzdFdvcmQpICE9ICIiKSB7DQoJCQkJCSRzb3VuZDEgPSBsZXZlbnNodGVpbihzb3VuZGV4KCRjbG9zZXN0V29yZCksICRzb3VuZF9zZWFyY2gpOw0KCQkJCQkkc291bmQyID0gbGV2ZW5zaHRlaW4oc291bmRleCgkY2xvc2VzdE1ldGFXb3JkKSwgJHNvdW5kX3NlYXJjaCk7DQoJCQkJCWlmICgkc291bmQxIDwgJHNvdW5kMikgew0KCQkJCQkJJGlkeCA9IG1kNSgkY2xvc2VzdFdvcmQpOw0KCQkJCQkJJHdvcmRMaXN0WyRpZHhdID0gJGNsb3Nlc3RXb3JkOw0KCQkJCQkJJHdvcmREaXN0WyRpZHhdID0gJHNob3J0ZXN0RGlzdDsNCgkJCQkJfSBlbHNlIHsNCgkJCQkJCSRpZHggPSBtZDUoJGNsb3Nlc3RNZXRhV29yZCk7DQoJCQkJCQkkd29yZExpc3RbJGlkeF0gPSAkY2xvc2VzdE1ldGFXb3JkOw0KCQkJCQkJJHdvcmREaXN0WyRpZHhdID0gJHNob3J0ZXN0TWV0YURpc3Q7DQoJCQkJCX0NCgkJCQl9DQoJCQkJLy8gQnVpbGQgYW4gYXJyYXkgb2YgdW5pcXVlIG1hdGNoaW5nIGFydGljbGVzDQoJCQkJaWYgKCRtYXhfdGVybV9sZW4gPj0gJG1pbl93b3JkX2xlbmd0aCkgew0KCQkJCQlpZiAoJGlzQXJ0aWNsZSkgew0KCQkJCQkJcG9wdWxhdGVBcnRpY2xlRGF0YSgkcm93KTsNCgkJCQkJfQ0KCQkJCQkkYXJ0TGlzdFtdID0gcGFyc2UoJG9wZm9ybSk7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJCS8vIFNvcnQgdGhlIHdvcmQgbGlzdCBpbiBvcmRlciBvZiByZWxldmFuY2UNCgkJaWYgKGNvdW50KCR3b3JkTGlzdCkgPiAwKSB7DQoJCQlhcnJheV9tdWx0aXNvcnQoJHdvcmREaXN0LCR3b3JkTGlzdCk7DQoJCX0NCgkJLy8gT3V0cHV0IHN0dWZmIHRvIHRoZSBwYWdlDQoJCSRvdXQgLj0gJG5vX21hdGNoX2xhYmVsOw0KCQlpZiAoY291bnQoJHdvcmRMaXN0KSA+IDApIHsNCgkJCSRvdXQgLj0gKGNvdW50KCRzaG93TGlzdCkgPiAwKSA/ICRzdWdnZXN0X2xhYmVsIDogIiI7DQoJDQoJCQlpZiAoaW5fYXJyYXkoIndvcmRzIiwgJHNob3dbMF0pKSB7DQoJCQkJJGN0ciA9IDA7DQoJCQkJZm9yZWFjaCAoJHdvcmRMaXN0IGFzICRpdGVtKSB7DQoJCQkJCWlmIChhcnJheV9rZXlfZXhpc3RzKCJ3b3JkcyIsICRsaW1pdEJ5KSAmJiAkY3RyID4gJGxpbWl0QnlbIndvcmRzIl0pIHsNCgkJCQkJCWJyZWFrOw0KCQkJCQl9DQoJCQkJCSRvdXQgLj0gJzxhIGhyZWY9Iicuc21kX2FkZFFTVmFyKCRwYWdldXJsLCdxJywkaXRlbSkuJyI+Jy4kaXRlbS4nPC9hPicubjsNCgkJCQkJJGN0cisrOw0KCQkJCX0NCgkJCX0NCgkJCWlmIChpbl9hcnJheSgiYXJ0aWNsZXMiLCAkc2hvd1swXSkpIHsNCgkJCQkkY3RyID0gMDsNCgkJCQlmb3JlYWNoICgkYXJ0TGlzdCBhcyAkYXJ0KSB7DQoJCQkJCWlmIChhcnJheV9rZXlfZXhpc3RzKCJhcnRpY2xlcyIsICRsaW1pdEJ5KSAmJiAkY3RyID49ICRsaW1pdEJ5WyJhcnRpY2xlcyJdKSB7IA0KCQkJCQkJYnJlYWs7DQoJCQkJCX0NCgkJCQkJJG91dCAuPSAkYXJ0Ow0KCQkJCQkkY3RyKys7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfQ0KCXJldHVybiAkb3V0Ow0KfSI7czo0OiJ0eXBlIjtzOjE6IjAiO3M6MzoibWQ1IjtzOjMyOiI0YjRiNTg5YjAxZTA2M2YwYWI3NTg2N2VmMDZlMDY5NSI7fQ==