# smd_fuzzy_find 0.02 # 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: # ..................................................................... YTo5OntzOjQ6Im5hbWUiO3M6MTQ6InNtZF9mdXp6eV9maW5kIjtzOjY6ImF1dGhvciI7czoxMToiU3RlZiBEYXdzb24iO3M6MTA6ImF1dGhvcl91cmkiO3M6MjY6Imh0dHA6Ly93d3cuc3RlZmRhd3Nvbi5jb20vIjtzOjc6InZlcnNpb24iO3M6NDoiMC4wMiI7czoxMToiZGVzY3JpcHRpb24iO3M6Nzg6Ik9mZmVycyBhbHRlcm5hdGl2ZSBzcGVsbGluZ3MgYW5kL29yIGNsb3NlLW1hdGNoaW5nIGFydGljbGVzIGZyb20gc2VhcmNoIHRlcm1zLiI7czo0OiJoZWxwIjtzOjQ4NDY6IjxoMT5zbWRfZnV6enlfZmluZDwvaDE+DQoNCjxwPkV2ZXIgd2FudGVkIFRYUCdzIHNlYXJjaCBmYWNpbGl0eSB0byBiZSBhIGxpdHRsZSBtb3JlLCB3ZWxsLCBpbmFjY3VyYXRlPyBXYW50IG5vIG1vcmUuIERlZmluZSBob3cgZnV6enkgeW91ciBzZWFyY2ggaXMsIHdoZXJlIHRvIGxvb2sgYW5kIGhvdyBtdWNoIG9mIGEgbnVkZ2UgdG8gb2ZmZXIgeW91ciBzaXRlIHZpc2l0b3JzIHdpdGggcGhhdCBwaGluZ2Vycy48L3A+DQoNCjxwPlJlc3VsdHMgYXJlIG9yZGVyZWQgYnkgYXBwcm94aW1hdGUgcmVsZXZhbmN5IGFuZCBpdCdzIGF1dG9tYXRpY2FsbHkgY29udGV4dC1zZW5zaXRpdmUgYmVjYXVzZSB0aGUgcG9vbCBvZiB3b3JkcyBpdCBjb21wYXJlcyBhZ2FpbnN0IGFyZSBmcm9tIHlvdXIgc2l0ZS4gT24gYSB6b28gd2Vic2l0ZSwgc29tZW9uZSB0eXBpbmcgaW4gImxpbm8iIHdvbid0IGdldCBhcnRpY2xlcyBhYm91dCBmbG9vcmluZyBidXQgbW9yZSBsaWtlbHkgYXJ0aWNsZXMgYWJvdXQgbGlvbnMsIHdoaWNoIGlzIHdoYXQgdGhleSByZWFsbHkgd2FudGVkLiBXZSBob3BlLjwvcD4NCg0KPGgyPlVzYWdlIGF0IGEgZ2xhbmNlPC9oMj4NCjx1bD4NCjxsaT48Yj5zZWFyY2hfdGVybTwvYj4NCjxiciAvPldoYXQgeW91IHdvdWxkIGxpa2UgdG8gc2VhcmNoIGZvcjogZWl0aGVyIGEgZml4ZWQgc3RyaW5nIChyYXRoZXIgcG9pbnRsZXNzISkgb3IgIj9xIiAodGhlIGRlZmF1bHQpLiBNYXliZSBpbiBmdXR1cmUgb3RoZXIgdGhpbmdzIGxpa2UgP2N1c3RvbV9maWVsZCBzbyB5b3UgY2FuIGVtYmVkIHRoaXMgaW4gYW4gYXJ0aWNsZSBhbmQgZG8gcHN1ZWRvLXJlbGF0ZWQtYXJ0aWNsZSBzZWFyY2hlczwvbGk+DQo8bGk+PGI+bWF0Y2hfd2l0aDwvYj4NCjxiciAvPldoZXJlIHlvdSB3b3VsZCBsaWtlIHRvIGxvb2sgZm9yIGEgbWF0Y2ggKGkuZS4gd2hpY2ggYXJ0aWNsZSBmaWVsZHMpLiBEZWZpbmUgdGhlIG9iamVjdCB5b3Ugd2FudCB0byBsb29rIGluIChjdXJyZW50bHkgb25seSBhcnRpY2xlIGlzIHN1cHBvcnRlZCkgZm9sbG93ZWQgYnkgYSBjb2xvbiwgdGhlbiBhIHNlbWktY29sb24gc2VwYXJhdGVkIGxpc3Qgb2YgcGxhY2VzIHRvIGxvb2s6IDxjb2RlPm1hdGNoX3dpdGg9ImFydGljbGU6a2V5d29yZHM7Ym9keTtleGNlcnB0IjwvY29kZT4uIE9wdGlvbnMgYXJlIGtleXdvcmRzLCBib2R5LCBleGNlcnB0LCBjYXRlZ29yeTEsIGNhdGVnb3J5Miwgc2VjdGlvbiwgaWQsIGF1dGhvcmlkLCB0aXRsZSAoY29taW5nIHNvb246IGN1c3RvbSBmaWVsZHMgYW5kIGltYWdlIHNlYXJjaGluZykuIERlZmF1bHQgaXMgYXJ0aWNsZTprZXl3b3Jkcztib2R5O2V4Y2VycHQ7PC9saT4NCjxsaT48Yj5zaG93PC9iPg0KPGJyIC8+V2hhdCB0byBkaXNwbGF5OiB3aGV0aGVyIHRvIGxpc3QgdGhlIGNsb3Nlc3QgbWF0Y2hpbmcgYXJ0aWNsZXMsIGNsb3Nlc3QgbWF0Y2hpbmcgc2VhcmNoIHRlcm1zLCBvciBib3RoLiBDaG9pY2VzIGFyZSBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGVpdGhlciA8Y29kZT5hcnRpY2xlczwvY29kZT4gb3IgPGNvZGU+d29yZHM8L2NvZGU+LiBEZWZhdWx0OiAid29yZHMsIGFydGljbGVzIjwvbGk+DQo8bGk+PGI+c2VjdGlvbjwvYj4NCjxiciAvPkxpbWl0IHlvdXIgc2VhcmNoIHJlc3VsdHMgdG8gYSBwYXJ0aWN1bGFyIHNlY3Rpb24gb3IgdGhyZWU7IGdpdmUgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdC4gRGVmYXVsdDogZW1wdHkgKHRoZSB3aG9sZSBzaXRlKS4gQ29taW5nIHNvb246IChtYXliZSkgY2F0ZWdvcmllcy48L2xpPg0KPGxpPjxiPnRvbGVyYW5jZTwvYj4NCjxiciAvPkhvdyBmdXp6eSB0aGUgc2VhcmNoIGlzIGFuZCBob3cgbG9uZyB0aGUgbWluaW11bSBzZWFyY2ggdGVybSBpcyBhbGxvd2VkIHRvIGJlLiBBbiBpbnRlZ2VyIGZyb20gMCAodmVyeSBjbG9zZSBtYXRjaCwgYWxsb3dzIHNob3J0IHNlYXJjaCB3b3JkcykgdG8gNSAocHJldHR5IG11Y2ggbm90aGluZyBsaWtlIHdoYXQgeW91IHNlYXJjaGVkIGZvciBhbmQgc2VhcmNoIHdvcmRzIG11c3QgdGhlbiBiZSBsb25nZXIsIHJvdWdobHkgPjcgY2hhcmFjdGVyKS4gUHJhY3RpY2FsIHZhbHVlcyBhcmUgdXN1YWxseSAwLCAxLCAyICh0aGUgZGVmYXVsdCksIG9yIHBvc3NpYmx5IDMuPC9saT4NCjxsaT48Yj5jYXNlX3NlbnNpdGl2ZTwvYj4NCjxiciAvPkRvZXMgd2hhdCBpdCBzYXlzIG9uIHRoZSB0aW4uIDE9Y2FzZSBzZW5zaXRpdmUgc2VhcmNoLCAwPW5vdC4gRGVmYXVsdDogMDwvbGk+DQo8bGk+PGI+bWluX3dvcmRfbGVuZ3RoPC9iPg0KPGJyIC8+VGhlIG1pbmltdW0gd29yZCBsZW5ndGggeW91IHdhbnQgcmV0dXJuaW5nLiBEZWZhdWx0OiA0PC9saT4NCjxsaT48Yj5saW1pdDwvYj4NCjxiciAvPlRoZSBtYXhpbXVtIG51bWJlciBvZiB3b3JkcyBhbmQvb3IgYXJ0aWNsZXMgdG8gZGlzcGxheS4gR2l2ZSBpdCBhIHNpbmdsZSBpbnRlZ2VyIGFuZCBpdCBsaW1pdHMgYm90aCB0byB0aGUgc2FtZSB2YWx1ZS4gU3BlY2lmeWluZyA8Y29kZT5hcnRpY2xlczo1PC9jb2RlPiB3b3VsZCByZW1vdmUgYW55IGxpbWl0IHRvIHRoZSBudW1iZXIgb2YgYWx0ZXJuYXRpdmUgc2VhcmNoIHdvcmRzIG9mZmVyZWQgYnV0IHdvdWxkIGxpbWl0IHRoZSBhcnRpY2xlcyB0byBhIG1heGltdW0gb2YgNS4gU2ltaWxhcmx5LCA8Y29kZT53b3Jkczo0PC9jb2RlPiB3b3VsZCByZW1vdmUgdGhlIGFydGljbGUgbGltaXQgYW5kIG9ubHkgc2hvdyBhIG1heGltdW0gb2YgNCBhbHRlcm5hdGl2ZSB3b3Jkcy4gQm90aCBvZiB0aGVzZSBhcmUgc3ViamVjdCB0byB0aGVpciByZXNwZWN0aXZlICJzaG93IiBvcHRpb25zIGJlaW5nIHNldCBvZiBjb3Vyc2UuIERlZmF1bHQ6IDxjb2RlPndvcmRzOjUsIGFydGljbGVzOjEwPC9jb2RlPjwvbGk+DQo8bGk+PGI+Zm9ybTwvYj4NCjxiciAvPlRoZSBUWFAgZm9ybSB0byBvdXRwdXQgdGhlIGxpc3Qgb2YgYXJ0aWNsZXMgaW4uIERlZmF1bHQ6IHNlYXJjaF9yZXN1bHRzLiBOb3RlIHRoYXQgYmVjYXVzZSB0aGUgbWF0Y2hlcyBtYXkgbm90IGNvbnRhaW4gZXhhY3Qgc2VhcmNoIHRlcm1zLCB0aGUgJ2V4Y2VycHQnIHBhcnQgb2Ygc2VhcmNoX3Jlc3VsdHMgd2l0aCB0aGUgaGlnaGxpZ2h0ZWQgbWF0Y2hlcyBpcyB1c3VhbGx5IG5vdCBkaXNwbGF5ZWQhPC9saT4NCjxsaT48Yj5ub19tYXRjaF9sYWJlbDwvYj4NCjxiciAvPlRoZSBwaHJhc2UgdG8gZGlzcGxheSB3aGVuIG5vIG1hdGNoZXMgKG1heWJlIG5vdCBldmVuIGZ1enp5IG9uZXMhKSBhcmUgZm91bmQuIERlZmF1bHRzIHRvIHRoZSBNTFAgc3RyaW5nICdub19tYXRjaCcuIFVzZSA8Y29kZT5ub19tYXRjaF9sYWJlbD0iIjwvY29kZT4gdG8gdHVybiBpdCBvZmYuPC9saT4NCjxsaT48Yj5zdWdnZXN0X2xhYmVsPC9iPg0KPGJyIC8+VGhlIHBocmFzZSB0byBkaXNwbGF5IGltbWVkaWF0ZWx5IHByaW9yIHRvIHNob3dpbmcgY2xvc2UtbWF0Y2hpbmcgYXJ0aWNsZXMvd29yZHMuIERlZmF1bHRzIHRvIHRoZSBNTFAgc3RyaW5nICdzdWdnZXN0Jy4gVXNlIDxjb2RlPnN1Z2dlc3RfbGFiZWw9IiI8L2NvZGU+IHRvIHN3aXRjaCBpdCBvZmYuPC9saT4NCjxsaT48Yj50b29fc2hvcnRfbGFiZWw8L2I+DQo8YnIgLz5TZWFyY2hlcyBvZiB1bmRlciBhYm91dCAzIGNoYXJhY3RlcnMgKHNvbWV0aW1lcyBtb3JlIGRlcGVuZGluZyBvbiB5b3VyIGNvbnRlbnQpIGFyZSB0b28gc2hvcnQgZm9yIGFueSByZWFzb25hYmxlIGZ1enppbmVzcyB0byBiZSBhcHBsaWVkLiBUaGlzIG1lc3NhZ2UgaXMgZGlzcGxheWVkIGluIHRoYXQgY2lyY3Vtc3RhbmNlLiBEZWZhdWx0cyB0byB0aGUgTUxQIHN0cmluZyB0b29fc2hvcnQuIFVzZSA8Y29kZT50b29fc2hvcnRfbGFiZWw9IiI8L2NvZGU+IHRvIHN3aXRjaCBpdCBvZmYuPC9saT4NCjwvdWw+DQo8cD5Db21pbmcgc29vbjogY2xhc3Mgb3B0aW9ucywgaW1hZ2Ugc3VwcG9ydCAod2l0aCBsdWNrKSBhbmQgYSBmZXcgb3RoZXIgZW5oYW5jZW1lbnRzLCBtYXliZSBjaGFuZ2VzIHRvIHRoZSBwYXR0ZXJuIG1hdGNoaW5nIGFsZ29yaXRobSBpZiBhbnlvbmUgd2FudHMgdG8gaGVscC4gUHJldHR5IHBsZWFzZT8hPC9wPg0KDQo8aDI+RXhhbXBsZSB1c2FnZTwvaDI+DQoNCjxwPlNpbmNlIGl0J3Mgbm90IG5lY2Vzc2FyaWx5IGEgZGlyZWN0IHJlcGxhY2VtZW50IGZvciB0aGUgYnVpbHQtaW4gc2VhcmNoICh0aG91Z2ggaXQgc29ydCBvZiBjYW4gYmUpIHRoZSBiZXN0IHdheSB0byB1c2UgaXQgaXMgaW4gY29uanVuY3Rpb24gd2l0aCA8YSBocmVmPSJodHRwOi8vZm9ydW0udGV4dHBhdHRlcm4uY29tL3ZpZXd0b3BpYy5waHA/aWQ9MTQxNjMiPmNoaF9pZl9kYXRhPC9hPiBpbiBhIHBhZ2UgbGlrZSB0aGlzOjwvcD4NCg0KPHByZT4NCiZsdDt0eHA6aWZfc2VhcmNoJmd0Ow0KICAmbHQ7dHhwOmNoaF9pZl9kYXRhJmd0Ow0KICAgICZsdDtkbCBjbGFzcz0iZXhjZXJwdHMiJmd0Ow0KICAgICAgJmx0O3R4cDphcnRpY2xlIGxpbWl0PSI4IiBsaXN0Zm9ybT0iZXhjZXJwdHMiIC8mZ3Q7DQogICAgJmx0Oy9kbCZndDsNCiAgJmx0O3R4cDplbHNlIC8mZ3Q7DQogICAgJmx0O2RsIGNsYXNzPSJleGNlcnB0cyImZ3Q7DQogICAgICAmbHQ7dHhwOnNtZF9mdXp6eV9maW5kIGZvcm09ImV4Y2VycHRzIiAvJmd0Ow0KICAgICZsdDsvZGwmZ3Q7DQogICZsdDsvdHhwOmNoaF9pZl9kYXRhJmd0Ow0KJmx0Oy90eHA6aWZfc2VhcmNoJmd0Ow0KPC9wcmU+DQoNClNvIGluIHRoZSBjYXNlIGFuIGV4YWN0IHRlcm0gaXMgZm91bmQsIHRoZSBub3JtYWwgVFhQIHNlYXJjaCBpcyBjYWxsZWQuIElmIGFuIGV4YWN0IHNlYXJjaCB0ZXJtIGlzIG5vdCBmb3VuZCwgbGV0IHNtZF9mdXp6eV9maW5kIGhhdmUgYSBnby4iO3M6NDoiY29kZSI7czo5NDM2OiIvLyB2MC4wMSAgIEluaXRpYWwgcHVibGljIGJldGENCi8vIHYwLjAyICAgRml4ZWQgY2FzZSBzZW5zaXRpdml0eS4gU3BlZCB1cCBhbmQgaW1wcm92ZWQgd29yZGxpc3QgZ2VuZXJhdGlvbi4gQWRkZWQgcmVmaW5lIGF0dHJpYnV0ZSB0byBzd2l0Y2ggb2ZmIHNvdW5kZXgvbWV0YXBob25lIGlmIHJlcXVpcmVkDQoNCnJlcXVpcmVfcGx1Z2luKCdzbWRfbGliJyk7DQpnbG9iYWwgJHNtZF9mdXp6TGFuZzsNCg0KJHNtZF9mdXp6X3N0ciA9IGFycmF5KA0KCSd0b29fc2hvcnQnID0+ICdUaGUgdGV4dCB5b3UgYXJlIHNlYXJjaGluZyBmb3IgaXMgcHJvYmFibHkgdG9vIHNob3J0LiBUcnkgYSBsb25nZXIgd29yZC4gJywNCgknbm9fbWF0Y2gnID0+ICdTb3JyeSwgbm8gcmVzdWx0cyBtYXRjaGVkICJ7c2VhcmNoX3Rlcm19IiBleGFjdGx5LiAnLA0KCSdzdWdnZXN0JyA9PiAnSGVyZSBhcmUgdGhlIGNsb3Nlc3QgbWF0Y2hpbmcge3RoaW5naWVzfSB0aGF0IG1heSBoZWxwIHlvdSBmaW5kIHdoYXQgeW91IGFyZSBsb29raW5nIGZvcjogJywNCgknc3VnZ2VzdF9qb2luJyA9PiAnYW5kJywNCgknYXJ0aWNsZXMnID0+ICdhcnRpY2xlcycsDQoJJ3dvcmRzJyA9PiAnd29yZHMnLA0KKTsNCiRzbWRfZnV6ekxhbmcgPSBuZXcgc21kX01MUCgnc21kX2Z1enp5X2ZpbmQnLCAnc21kX2Z1enonLCAkc21kX2Z1enpfc3RyKTsNCg0KZnVuY3Rpb24gc21kX2Z1enp5X2ZpbmQoJGF0dHMsICR0aGluZz0nJykgew0KCWdsb2JhbCAkcHJldGV4dDsNCglnbG9iYWwgJHNtZF9mdXp6TGFuZzsNCg0KCWV4dHJhY3QobEF0dHMoYXJyYXkoDQoJCSdmb3JtJyA9PiAnc2VhcmNoX3Jlc3VsdHMnLA0KCQknc2VjdGlvbicgPT4gJycsDQoJCSdzdWJjYXRzJyA9PiAnMCcsDQoJCSdzZWFyY2hfdGVybScgPT4gJz9xJywNCgkJJ21hdGNoX3dpdGgnID0+ICdhcnRpY2xlOmtleXdvcmRzO2JvZHk7ZXhjZXJwdCcsDQoJCSd0b2xlcmFuY2UnID0+ICcyJywNCgkJJ21pbl93b3JkX2xlbmd0aCcgPT4gJzQnLA0KCQknbGltaXQnID0+ICd3b3Jkczo1LCBhcnRpY2xlczoxMCcsDQoJCSdjYXNlX3NlbnNpdGl2ZScgPT4gJzAnLA0KCQkncmVmaW5lJyA9PiAnbWV0YXBob25lLCBzb3VuZGV4JywNCgkJJ3Nob3cnID0+ICd3b3JkcywgYXJ0aWNsZXMnLA0KCQknZGVidWcnID0+ICcwJywNCgkJJ25vX21hdGNoX2xhYmVsJyA9PiAnIycsDQoJCSdzdWdnZXN0X2xhYmVsJyA9PiAnIycsDQoJCSd0b29fc2hvcnRfbGFiZWwnID0+ICcjJywNCgkpLCAkYXR0cykpOw0KDQoJJHNlYXJjaEFsbG93ID0gYXJyYXkoIj9jIiwgIiFjIiwgIj9zIiwgIiFzIiwgIj90IiwgIiF0IiwgIj9pZCIsICIhaWQiLCAiP3EiLCAiIXEiLCAiP2ZpZWxkIiwgIiFmaWVsZCIpOw0KCSRyZWZpbmVBbGxvdyA9IGFycmF5KCJtZXRhcGhvbmUiLCAic291bmRleCIpOw0KCSRzaG93QWxsb3cgPSBhcnJheSgiYXJ0aWNsZXMiLCAid29yZHMiKTsNCgkkY29sTmFtZXMgPSBhcnJheSgnS2V5d29yZHMnID0+ICJhcnRpY2xlOmtleXdvcmRzIiwNCgkJCQkJCQknQm9keScgPT4gImFydGljbGU6Ym9keSIsDQoJCQkJCQkJJ0V4Y2VycHQnID0+ICJhcnRpY2xlOmV4Y2VycHQiLA0KCQkJCQkJCSdDYXRlZ29yeTEnID0+ICJhcnRpY2xlOmNhdGVnb3J5MSIsDQoJCQkJCQkJJ0NhdGVnb3J5MicgPT4gImFydGljbGU6Y2F0ZWdvcnkyIiwNCgkJCQkJCQknU2VjdGlvbicgPT4gImFydGljbGU6c2VjdGlvbiIsDQoJCQkJCQkJJ0lEJyA9PiAiYXJ0aWNsZTppZCIsDQoJCQkJCQkJJ0F1dGhvcklEJyA9PiAiYXJ0aWNsZTphdXRob3JpZCIsDQoJCQkJCQkJJ1RpdGxlJyA9PiAiYXJ0aWNsZTp0aXRsZSIsDQoJCQkJCQkJJ2NhdGVnb3J5JyA9PiAiaW1hZ2U6Y2F0ZWdvcnkiLA0KCQkJCQkJCSdhbHQnID0+ICJpbWFnZTphbHQiLA0KCQkJCQkJCSdjYXB0aW9uJyA9PiAiaW1hZ2U6Y2FwdGlvbiIsDQoJCQkJCQkJJ25hbWUnID0+ICJpbWFnZTpuYW1lIik7DQoNCgkkcGxhY2VzID0gYXJyYXkoJ3RleHRwYXR0ZXJuJyA9PiAiYXJ0aWNsZSIsICd0eHBfaW1hZ2UnID0+ICJpbWFnZSIpOw0KCSRzZWNzaW4gPSBhcnJheSgpOw0KCSRjYXRzaW4gPSBhcnJheSgpOw0KCSRmdWxsU2VjTGlzdCA9IGFycmF5KCk7DQoJJG5vdFNlY0xpc3QgPSBhcnJheSgpOw0KCSRkYkZpZWxkID0gYXJyYXkoKTsNCg0KCS8vIEV4cGFuZCB0aGUgYXJncyBpbiBjYXNlIHRoZXkncmUgPyBvciAhIHNob3J0Y3V0cywgYW5kIGRvIHNvbWUgdmFsaWRpdHkgY2hlY2tpbmcNCgkkbG9va2luID0gc21kX3NwbGl0UmFuZ2UoJG1hdGNoX3dpdGgsICI6Iik7DQoJJGRiVGFibGUgPSBhcnJheV9zZWFyY2goJGxvb2tpblswXSwgJHBsYWNlcyk7DQoJJGRiVGFibGUgPSAoJGRiVGFibGUgPT0gIiIpID8gImFydGljbGUiIDogJGRiVGFibGU7DQoJJGlzQXJ0aWNsZSA9ICgkbG9va2luWzBdID09ICJhcnRpY2xlIikgPyB0cnVlIDogZmFsc2U7DQoJJHJlZmluZSA9IHNtZF9nZXRBdHRzKCRyZWZpbmUsIGFycmF5KCkpOw0KCSRyZWZpbmUgPSAkcmVmaW5lWzBdOw0KCWZvciAoJGlkeCA9IDA7ICRpZHggPCBjb3VudCgkcmVmaW5lKTsgJGlkeCsrKSB7DQoJCWlmIChpbl9hcnJheSgkcmVmaW5lWyRpZHhdLCAkcmVmaW5lQWxsb3cpKSB7DQoJCQkkcmVmaW5lTGlzdFskaWR4XSA9ICRyZWZpbmVbJGlkeF07DQoJCX0NCgl9DQoJJGRiRmllbGRzID0gc21kX3NwbGl0UmFuZ2UoJGxvb2tpblsxXSwiOyIpOw0KCWZvcmVhY2ggKCRkYkZpZWxkcyBhcyAkbG9va0ZpZWxkKSB7DQoJCSRkYkZpZWxkW10gPSBhcnJheV9zZWFyY2goJGxvb2tpblswXS4iOiIuJGxvb2tGaWVsZCwgJGNvbE5hbWVzKTsNCgl9DQoNCgkkc2VhcmNoX3Rlcm0gPSBzbWRfZ2V0QXR0cygkc2VhcmNoX3Rlcm0sJHNlYXJjaEFsbG93KTsNCgkkc2VhcmNoX3Rlcm0gPSAkc2VhcmNoX3Rlcm1bMF1bMF07DQoJJG1ldGFfc2VhcmNoID0gKGluX2FycmF5KCJtZXRhcGhvbmUiLCAkcmVmaW5lTGlzdCkpID8gbWV0YXBob25lKCRzZWFyY2hfdGVybSkgOiAiIjsNCgkkc291bmRfc2VhcmNoID0gKGluX2FycmF5KCJzb3VuZGV4IiwgJHJlZmluZUxpc3QpKSA/IHNvdW5kZXgoJHNlYXJjaF90ZXJtKSA6ICIiOw0KCSR0b2xlcmFuY2UgPSBpbnR2YWwoJHRvbGVyYW5jZSk7DQoJJHNob3cgPSBzbWRfZ2V0QXR0cygkc2hvdywgYXJyYXkoKSk7DQoJJHNob3dMaXN0ID0gJHNob3dbMF07DQoJZm9yICgkaWR4ID0gMDsgJGlkeCA8IGNvdW50KCRzaG93TGlzdCk7ICRpZHgrKykgew0KCQlpZiAoaW5fYXJyYXkoJHNob3dMaXN0WyRpZHhdLCAkc2hvd0FsbG93KSkgew0KCQkJJHNob3dMaXN0WyRpZHhdID0gJHNtZF9mdXp6TGFuZy0+Z1R4dCgkc2hvd0xpc3RbJGlkeF0pOw0KCQl9DQoJfQ0KCSRsaW1pdEJ5ID0gYXJyYXkoKTsNCgkkbGltaXQgPSBzbWRfZ2V0QXR0cygkbGltaXQsIGFycmF5KCkpOw0KCWZvcmVhY2ggKCRsaW1pdFswXSBhcyAkbGltT3B0aW9uKSB7DQoJCWlmIChpc19udW1lcmljKCRsaW1PcHRpb24pKSB7DQoJCQkkbGltaXRCeVsiYXJ0aWNsZXMiXSA9ICRsaW1PcHRpb247DQoJCQkkbGltaXRCeVsid29yZHMiXSA9ICRsaW1PcHRpb247DQoJCX0gZWxzZSB7DQoJCQkkbGltc3BsaXQgPSBzbWRfc3BsaXRSYW5nZSgkbGltT3B0aW9uLCAiOiIpOw0KCQkJaWYgKChjb3VudCgkbGltc3BsaXQpID09IDIpICYmIChpbl9hcnJheSgkbGltc3BsaXRbMF0sICRzaG93QWxsb3cpKSAmJiAoaXNfbnVtZXJpYygkbGltc3BsaXRbMV0pKSkgew0KCQkJCSRsaW1pdEJ5WyRsaW1zcGxpdFswXV0gPSAkbGltc3BsaXRbMV07DQoJCQl9DQoJCX0NCgl9DQoNCgkkdGhpbmdpZXMgPSBpbXBsb2RlKCIgIi4kc21kX2Z1enpMYW5nLT5nVHh0KCdzdWdnZXN0X2pvaW4nKS4iICIsICRzaG93TGlzdCk7DQoJJG5vX21hdGNoX2xhYmVsID0gKCRub19tYXRjaF9sYWJlbCA9PSAiIyIpID8gJHNtZF9mdXp6TGFuZy0+Z1R4dCgnbm9fbWF0Y2gnLCBhcnJheSgie3NlYXJjaF90ZXJtfSIgPT4gJHNlYXJjaF90ZXJtKSkgOiAkbm9fbWF0Y2hfbGFiZWw7DQoJJHN1Z2dlc3RfbGFiZWwgPSAoJHN1Z2dlc3RfbGFiZWwgPT0gIiMiKSA/ICRzbWRfZnV6ekxhbmctPmdUeHQoJ3N1Z2dlc3QnLCBhcnJheSgie3RoaW5naWVzfSIgPT4gJHRoaW5naWVzKSkgOiAkc3VnZ2VzdF9sYWJlbDsNCgkkdG9vX3Nob3J0X2xhYmVsID0gKCR0b29fc2hvcnRfbGFiZWwgPT0gIiMiKSA/ICRzbWRfZnV6ekxhbmctPmdUeHQoJ3Rvb19zaG9ydCcpIDogJHRvb19zaG9ydF9sYWJlbDsNCg0KCSRzZWN0aW9ucyA9IHNtZF9nZXRBdHRzKCRzZWN0aW9uLGFycmF5KCI/cyIsICIhcyIsICI/ZmllbGQiLCAiIWZpZWxkIikpOw0KCSRmdWxsU2VjTGlzdCA9ICRzZWN0aW9uc1swXTsNCgkkbm90U2VjTGlzdCA9ICRzZWN0aW9uc1sxXTsNCgkkd2hlcmUgPSAiIjsNCg0KCS8vIGluY2x1ZGVkIHNlY3Rpb25zDQoJaWYgKCRpc0FydGljbGUpIHsNCgkJJHRtcGEgPSBhcnJheSgpOw0KCQlmb3IgKCRpZHggPSAwOyAkaWR4IDwgY291bnQoJGZ1bGxTZWNMaXN0KTsgJGlkeCsrKSB7DQoJCQkkdG1wYVtdID0gIiciIC4kZnVsbFNlY0xpc3RbJGlkeF0uICInIjsNCgkJfQ0KCQlpZiAoY291bnQoJHRtcGEpID4gMCkgew0KCQkJJHNlY3NpbltdID0gInNlY3Rpb24gSU4gKCIgLmltcGxvZGUoIiwiLCAkdG1wYSkuICIpIjsNCgkJfQ0KDQoJCS8vIGV4Y2x1ZGVkIHNlY3Rpb25zDQoJCSR0bXBhID0gYXJyYXkoKTsNCgkJZm9yICgkaWR4ID0gMDsgJGlkeCA8IGNvdW50KCRub3RTZWNMaXN0KTsgJGlkeCsrKSB7DQoJCQkkdG1wYVtdID0gIiciIC4kbm90U2VjTGlzdFskaWR4XS4gIiciOw0KCQl9DQoJCWlmIChjb3VudCgkdG1wYSkgPiAwKSB7DQoJCQkkc2Vjc2luW10gPSAic2VjdGlvbiBOT1QgSU4gKCIgLmltcGxvZGUoIiwiLCAkdG1wYSkuICIpIjsNCgkJfQ0KDQoJCWlmIChjb3VudCgkc2Vjc2luKSA+IDApIHsNCgkJCSR3aGVyZSAuPSAiKCIgLiBpbXBsb2RlKCIgT1IgIiwgJHNlY3NpbikgLiAiKSI7DQoJCX0gZWxzZSB7DQoJCQkkd2hlcmUgLj0gIiI7DQoJCX0NCgl9DQoNCgkvLyBDYXRjaC1hbGwgZm9yIHRoZSB3aGVyZSBzdGF0ZW1lbnQNCglpZiAoJHdoZXJlID09ICIiKSB7DQoJCSR3aGVyZSA9ICIxPTEiOw0KCX0NCg0KCWlmICgkZGVidWcgPiAwKSB7DQoJCWRtcCgkd2hlcmUpOw0KCX0NCg0KCSRvdXQgPSAiIjsNCgkvLyBQZXJmb3JtIHRoZSBzZWFyY2hlcw0KCSRmaW5kZXIgPSBuZXcgc21kX0Z1enp5RmluZCgkc2VhcmNoX3Rlcm0sICR0b2xlcmFuY2UpOw0KCWlmICgkZmluZGVyLT50b29fc2hvcnRfZXJyKSB7DQoJCSRvdXQgLj0gJG5vX21hdGNoX2xhYmVsOw0KCQkkb3V0IC49ICR0b29fc2hvcnRfbGFiZWw7DQoJfSBlbHNlIHsNCgkJJGNvbHMgPSAiKiIgLiAoKCRpc0FydGljbGUpID8gIiwgdW5peF90aW1lc3RhbXAoUG9zdGVkKSBBUyB1UG9zdGVkIiA6ICIiKTsNCgkJJHJzID0gc2FmZV9yb3dzX3N0YXJ0KCRjb2xzLCAkZGJUYWJsZSwgJHdoZXJlKTsNCgkJJG9wZm9ybSA9ICIiOw0KDQoJCWlmICgkaXNBcnRpY2xlKSB7DQoJCQkkb3Bmb3JtID0gZmV0Y2hfZm9ybSgkZm9ybSk7DQoJCX0NCgkJJHBhZ2V1cmwgPSBzbWRfcmVtb3ZlUVNWYXIoJHByZXRleHRbJ3JlcXVlc3RfdXJpJ10sJ3EnKTsNCgkJJGFsbEZpZWxkcyA9ICIiOw0KCQkkYXJ0TGlzdCA9IGFycmF5KCk7DQoJCSR0ZXJtTGlzdCA9IGFycmF5KCk7DQoJCXdoaWxlKCRyb3cgPSBuZXh0Um93KCRycykpIHsNCgkJCSRhbGxGaWVsZHMgPSAiIjsNCgkJCS8vIEpvaW4gYWxsIHRoZSByZXF1aXJlZCBwbGFjZXMgdG8gbG9vayBpbnRvIGEgbG9uZyB0ZXh0IGJsb2NrDQoJCQlmb3JlYWNoICgkZGJGaWVsZCBhcyAkdGhlRmllbGQpIHsNCgkJCQkkYWxsRmllbGRzIC49ICRyb3dbJHRoZUZpZWxkXS4iICI7DQoJCQl9DQoJCQkvLyBSZW1vdmUgYmV0d2Vlbi13b3JkIHB1bmN0dWF0aW9uIGFuZCByZXBsYWNlIHdpdGggc3BhY2UNCgkJCSRqdXN0Q2hhcnMgPSAiL1teYS16QS1aMC05XC1cJyBdKy8iOw0KCQkJJGFsbEZpZWxkcyA9IHByZWdfcmVwbGFjZSgkanVzdENoYXJzLCAnICcsICRhbGxGaWVsZHMpOw0KCQkJLy8gU3BsaXQgdGhlIHJlbWFpbmRlciBieSAoc2luZ2xlIG9yIG11bHRpcGxlKSBzcGFjZXMNCgkJCSR3ZXJkcyA9IHByZWdfc3BsaXQoJy9ccysvJywgJGFsbEZpZWxkcywgLTEsIFBSRUdfU1BMSVRfTk9fRU1QVFkpOw0KCQkJLy8gLi4uYW5kIHJlY29uc3RpdHV0ZSB0aGUgdW5pcXVlIHdvcmRzIGFzIGEgaHVnZSBzcGFjZS1kZWxpbWl0ZWQgc3RyaW5nDQoJCQkkd2VyZHMgPSBpbXBsb2RlKCIgIixhcnJheV91bmlxdWUoJHdlcmRzKSk7DQoJCQkvLyBUYWtlIGludG8gYWNjb3VudCBjYXNlIHNlbnNpdGl2aXR5DQoJCQkkd2VyZHMgPSAoJGNhc2Vfc2Vuc2l0aXZlKSA/ICR3ZXJkcyA6IHN0cnRvbG93ZXIoJHdlcmRzKTsNCgkJCWlmICgkZGVidWcgPiAxKSB7DQoJCQkJZG1wKCR3ZXJkcyk7DQoJCQl9DQoNCgkJCS8vIEZpbmQgY2xvc2Ugd29yZCBtYXRjaGVzDQoJCQkkbWF0Y2hlcyA9ICRmaW5kZXItPnNlYXJjaCgkd2VyZHMpOw0KCQkJaWYgKCRkZWJ1ZyA+IDEpIHsNCgkJCQlkbXAoJG1hdGNoZXMpOw0KCQkJfQ0KDQoJCQlpZiAoY291bnQoJG1hdGNoZXMpID4gMCkgew0KCQkJCSRzaG9ydGVzdERpc3QgPSAxMDA7IC8vIEEgc3R1cGlkbHkgaGlnaCBudW1iZXIgdG8gc3RhcnQgd2l0aA0KCQkJCSRzaG9ydGVzdE1ldGFEaXN0ID0gLTE7DQoJCQkJJGNsb3Nlc3RXb3JkID0gIiI7DQoJCQkJJGNsb3Nlc3RNZXRhV29yZCA9ICIiOw0KCQkJCSRtYXhfdGVybV9sZW4gPSAwOw0KCQkJCS8vIEJ1aWxkIGEgdW5pcWUgYXJyYXkgb2YgY2xvc2VzdCBtYXRjaGluZyB3b3Jkcw0KCQkJCXdoaWxlKGxpc3QoJGlkeCwkZGlzdCkgPSBlYWNoKCRtYXRjaGVzKSkgew0KCQkJCQkkdGVybSA9IHNtZF9nZXRXb3JkKCR3ZXJkcywkaWR4KTsNCg0KCQkJCQkvLyBPbmx5IHdvcmRzIG1lZXRpbmcgdGhlIG1pbmltdW0gcmVxdWlyZW1lbnQgbmVlZCBhcHBseQ0KCQkJCQkkbWF4X3Rlcm1fbGVuID0gKHN0cmxlbigkdGVybSkgPiAkbWF4X3Rlcm1fbGVuKSA/IHN0cmxlbigkdGVybSkgOiAkbWF4X3Rlcm1fbGVuOw0KCQkJCQlpZiAoc3RybGVuKCR0ZXJtKSA8ICRtaW5fd29yZF9sZW5ndGgpIHsNCgkJCQkJCWNvbnRpbnVlOw0KCQkJCQl9DQoJCQkJCSR0ZXJtID0gKCRjYXNlX3NlbnNpdGl2ZSkgPyAkdGVybSA6IHN0cnRvbG93ZXIoJHRlcm0pOw0KCQkJCQlpZiAoJGRlYnVnID4gMikgew0KCQkJCQkJZWNobyAkdGVybSAuICIgIjsNCgkJCQkJfQ0KCQkJCQlpZiAoJGRpc3QgPCAkc2hvcnRlc3REaXN0KSB7DQoJCQkJCQkkc2hvcnRlc3REaXN0ID0gJGRpc3Q7DQoJCQkJCQkkY2xvc2VzdFdvcmQgPSAkdGVybTsNCgkJCQkJfQ0KCQkJCQlpZiAoJG1ldGFfc2VhcmNoICE9ICIiKSB7DQoJCQkJCQkkbWV0YV90ZXJtID0gbWV0YXBob25lKCR0ZXJtKTsNCgkJCQkJCWlmICgkZGVidWcgPiAyKSB7DQoJCQkJCQkJZWNobyAkbWV0YV90ZXJtIC4gIiA6ICIgLiAkbWV0YV9zZWFyY2ggLiIgIi5uOw0KCQkJCQkJfQ0KCQkJCQkJJGxldkRpc3QgPSBsZXZlbnNodGVpbigkbWV0YV9zZWFyY2gsICRtZXRhX3Rlcm0pOw0KCQkJCQkJaWYgKCRsZXZEaXN0IDw9ICRzaG9ydGVzdE1ldGFEaXN0IHx8ICRzaG9ydGVzdE1ldGFEaXN0IDwgMCkgew0KCQkJCQkJCSRzaG9ydGVzdE1ldGFEaXN0ID0gJGxldkRpc3Q7DQoJCQkJCQkJJGNsb3Nlc3RNZXRhV29yZCAgPSAkdGVybTsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0NCgkJCQkvLyBQaWNrIHRoZSBvbmUgdGhhdCBzb3VuZHMgY2xvc2VzdCB0byB0aGUgb3JpZ2luYWwNCgkJCQlpZiAodHJpbSgkY2xvc2VzdFdvcmQpICE9ICIiKSB7DQoJCQkJCSRpZHggPSBtZDUoJGNsb3Nlc3RXb3JkKTsNCgkJCQkJJGJlc3RGaXQgPSAkY2xvc2VzdFdvcmQ7DQoJCQkJCSRiZXN0RGlzdCA9ICRzaG9ydGVzdERpc3Q7DQoJCQkJCWlmICgkc291bmRfc2VhcmNoICE9ICIiKSB7DQoJCQkJCQkkc291bmQxID0gbGV2ZW5zaHRlaW4oc291bmRleCgkY2xvc2VzdFdvcmQpLCAkc291bmRfc2VhcmNoKTsNCgkJCQkJCSRzb3VuZDIgPSBsZXZlbnNodGVpbihzb3VuZGV4KCRjbG9zZXN0TWV0YVdvcmQpLCAkc291bmRfc2VhcmNoKTsNCgkJCQkJCWlmICgkc291bmQxID49ICRzb3VuZDIpIHsNCgkJCQkJCQkkaWR4ID0gbWQ1KCRjbG9zZXN0TWV0YVdvcmQpOw0KCQkJCQkJCSRiZXN0Rml0ID0gJGNsb3Nlc3RNZXRhV29yZDsNCgkJCQkJCQkkYmVzdERpc3QgPSAkc2hvcnRlc3RNZXRhRGlzdDsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCQkkd29yZExpc3RbJGlkeF0gPSAkYmVzdEZpdDsNCgkJCQkJJHdvcmREaXN0WyRpZHhdID0gJGJlc3REaXN0Ow0KCQkJCX0NCgkJCQlpZiAoJGRlYnVnID4gMikgew0KCQkJCQlkbXAoJGJlc3RGaXQpOw0KCQkJCX0NCg0KCQkJCS8vIEJ1aWxkIGFuIGFycmF5IG9mIHVuaXF1ZSBtYXRjaGluZyBhcnRpY2xlcw0KCQkJCWlmICgkbWF4X3Rlcm1fbGVuID49ICRtaW5fd29yZF9sZW5ndGgpIHsNCgkJCQkJaWYgKCRpc0FydGljbGUpIHsNCgkJCQkJCXBvcHVsYXRlQXJ0aWNsZURhdGEoJHJvdyk7DQoJCQkJCX0NCgkJCQkJJGFydExpc3RbXSA9IHBhcnNlKCRvcGZvcm0pOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCQkvLyBTb3J0IHRoZSB3b3JkIGxpc3QgaW4gb3JkZXIgb2YgcmVsZXZhbmNlDQoJCWlmIChjb3VudCgkd29yZExpc3QpID4gMCkgew0KCQkJYXJyYXlfbXVsdGlzb3J0KCR3b3JkRGlzdCwkd29yZExpc3QpOw0KCQl9DQoJCS8vIE91dHB1dCBzdHVmZiB0byB0aGUgcGFnZQ0KCQkkb3V0IC49ICRub19tYXRjaF9sYWJlbDsNCgkJaWYgKGNvdW50KCR3b3JkTGlzdCkgPiAwKSB7DQoJCQkkb3V0IC49IChjb3VudCgkc2hvd0xpc3QpID4gMCkgPyAkc3VnZ2VzdF9sYWJlbCA6ICIiOw0KDQoJCQlpZiAoaW5fYXJyYXkoIndvcmRzIiwgJHNob3dbMF0pKSB7DQoJCQkJJGN0ciA9IDA7DQoJCQkJZm9yZWFjaCAoJHdvcmRMaXN0IGFzICRpdGVtKSB7DQoJCQkJCWlmIChhcnJheV9rZXlfZXhpc3RzKCJ3b3JkcyIsICRsaW1pdEJ5KSAmJiAkY3RyID4gJGxpbWl0QnlbIndvcmRzIl0pIHsNCgkJCQkJCWJyZWFrOw0KCQkJCQl9DQoJCQkJCSRvdXQgLj0gJzxhIGhyZWY9Iicuc21kX2FkZFFTVmFyKCRwYWdldXJsLCdxJywkaXRlbSkuJyI+Jy4kaXRlbS4nPC9hPicubjsNCgkJCQkJJGN0cisrOw0KCQkJCX0NCgkJCX0NCgkJCWlmIChpbl9hcnJheSgiYXJ0aWNsZXMiLCAkc2hvd1swXSkpIHsNCgkJCQkkY3RyID0gMDsNCgkJCQlmb3JlYWNoICgkYXJ0TGlzdCBhcyAkYXJ0KSB7DQoJCQkJCWlmIChhcnJheV9rZXlfZXhpc3RzKCJhcnRpY2xlcyIsICRsaW1pdEJ5KSAmJiAkY3RyID49ICRsaW1pdEJ5WyJhcnRpY2xlcyJdKSB7DQoJCQkJCQlicmVhazsNCgkJCQkJfQ0KCQkJCQkkb3V0IC49ICRhcnQ7DQoJCQkJCSRjdHIrKzsNCgkJCQl9DQoJCQl9DQoJCX0NCgl9DQoJcmV0dXJuICRvdXQ7DQp9IjtzOjQ6InR5cGUiO3M6MToiMCI7czozOiJtZDUiO3M6MzI6ImQ5NjcxZTBlZjE5YjRmMjc2Y2JmYzE2NTBlZDAwNjIwIjt9