# smd_fuzzy_find 0.1 # Offers alternative spellings and/or close-matching articles from search terms. # Stef Dawson # http://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: # ..................................................................... YTo5OntzOjQ6Im5hbWUiO3M6MTQ6InNtZF9mdXp6eV9maW5kIjtzOjY6ImF1dGhvciI7czoxMToiU3RlZiBEYXdzb24iO3M6MTA6ImF1dGhvcl91cmkiO3M6MjE6Imh0dHA6Ly9zdGVmZGF3c29uLmNvbSI7czo3OiJ2ZXJzaW9uIjtzOjM6IjAuMSI7czoxMToiZGVzY3JpcHRpb24iO3M6Nzg6Ik9mZmVycyBhbHRlcm5hdGl2ZSBzcGVsbGluZ3MgYW5kL29yIGNsb3NlLW1hdGNoaW5nIGFydGljbGVzIGZyb20gc2VhcmNoIHRlcm1zLiI7czo0OiJoZWxwIjtzOjEwNTA2OiI8c3R5bGU+DQpjb2RlIHtjb2xvcjogIzIwNDY2Zn0NCnByZSB7cGFkZGluZzogMC41ZW0gMWVtOyBiYWNrZ3JvdW5kOiAjZWVlOyBib3JkZXI6IDFweCBkYXNoZWQgI2NjYzt9DQpoMSwgaDIsIGgzLCBoMyBjb2RlIHtmb250LWZhbWlseTogc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IGJvbGQ7fQ0KaDEsIGgyLCBoMyB7bWFyZ2luLWxlZnQ6IC0xZW07fQ0KaDIsIGgzIHttYXJnaW4tdG9wOiAyZW07fQ0KaDEge2ZvbnQtc2l6ZTogM2VtO30NCmgyIHtmb250LXNpemU6IDJlbTt9DQpoMyB7Zm9udC1zaXplOiAxLjVlbTt9DQpsaSBhIGNvZGUge2ZvbnQtd2VpZ2h0OiBub3JtYWw7fQ0KLnJlcXVpcmVkLCAud2FybmluZyB7Y29sb3I6cmVkO30NCiNlZ3RhYiB0ZCwjZWd0YWIgdGgge3BhZGRpbmc6LjdlbTsgYm9yZGVyOjFweCBzb2xpZCAjODg4O3RleHQtYWxpZ246Y2VudGVyO30NCjwvc3R5bGU+DQo8aDE+c21kX2Z1enp5X2ZpbmQ8L2gxPg0KPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdXNhZ2UsIGJ1Z3MsIGZlYXR1cmVzIGV0YywgcGxlYXNlIDxhIGhyZWY9Imh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5jb20vdmlld3RvcGljLnBocD9pZD0yNTM2NyI+dmlzaXQgdGhlIGZvcnVtIHRocmVhZDwvYT4uIEZvciBvdGhlciBzb2Z0d2FyZSBieSBtZSwgb3IgdG8gbWFrZSBhIGRvbmF0aW9uLCBzZWUgdGhlIDxhIGhyZWY9Imh0dHA6Ly9zdGVmZGF3c29uLmNvbS9zdyI+c29mdHdhcmUgcGFnZTwvYT4uPC9wPg0KPHAgY2xhc3M9InJlcXVpcmVkIj5SZXF1aXJlcyA8YSBocmVmPSJodHRwOi8vc3RlZmRhd3Nvbi5jb20vZG93bmxvYWRzL3NtZF9saWJfdjAuMzEudHh0Ij5zbWRfbGliIHYwLjMxPC9hPiB0byBiZSBpbnN0YWxsZWQgYW5kIGFjdGl2YXRlZC48L3A+PHA+DQo8aDIgaWQ9ImNvbnRlbnRzIj5Db250ZW50czwvaDI+DQo8dWw+DQo8bGk+PGEgaHJlZj0iI292ZXJ2aWV3Ij5PdmVydmlldzwvYT48L2xpPg0KPGxpPjxhIGhyZWY9IiNhdHRzIj5BdHRyaWJ1dGVzPC9hPg0KPHVsPg0KPGxpPjxhIGhyZWY9IiNzZWFyY2h0ZXJtIj5zZWFyY2hfdGVybTwvYT48L2xpPg0KPGxpPjxhIGhyZWY9IiNtYXRjaHdpdGgiPm1hdGNoX3dpdGg8L2E+PC9saT4NCjxsaT48YSBocmVmPSIjc2hvdyI+c2hvdzwvYT48L2xpPg0KPGxpPjxhIGhyZWY9IiNzZWN0aW9uIj5zZWN0aW9uPC9hPjwvbGk+DQo8bGk+PGEgaHJlZj0iI2NhdGVnb3J5Ij5jYXRlZ29yeTwvYT48L2xpPg0KPGxpPjxhIGhyZWY9IiNzdWJjYXRzIj5zdWJjYXRzPC9hPjwvbGk+DQo8bGk+PGEgaHJlZj0iI3N0YXR1cyI+c3RhdHVzPC9hPjwvbGk+DQo8bGk+PGEgaHJlZj0iI3RvbGVyYW5jZSI+dG9sZXJhbmNlPC9hPjwvbGk+DQo8bGk+PGEgaHJlZj0iI3JlZmluZSI+cmVmaW5lPC9hPjwvbGk+DQo8bGk+PGEgaHJlZj0iI2Nhc2VzZW5zaXRpdmUiPmNhc2Vfc2Vuc2l0aXZlPC9hPjwvbGk+DQo8bGk+PGEgaHJlZj0iI21pbndvcmRsZW5ndGgiPm1pbl93b3JkX2xlbmd0aDwvYT48L2xpPg0KPGxpPjxhIGhyZWY9IiNsaW1pdCI+bGltaXQ8L2E+PC9saT4NCjxsaT48YSBocmVmPSIjZm9ybSI+Zm9ybTwvYT48L2xpPg0KPGxpPjxhIGhyZWY9IiNub21hdGNobGFiZWwiPm5vX21hdGNoX2xhYmVsPC9hPjwvbGk+DQo8bGk+PGEgaHJlZj0iI3N1Z2dlc3RsYWJlbCI+c3VnZ2VzdF9sYWJlbDwvYT48L2xpPg0KPGxpPjxhIGhyZWY9IiN0b29zaG9ydGxhYmVsIj50b29fc2hvcnRfbGFiZWw8L2E+PC9saT4NCjxsaT48YSBocmVmPSIjbGFiZWx0YWciPmxhYmVsdGFnPC9hPjwvbGk+DQo8L3VsPjwvbGk+DQo8bGk+PGEgaHJlZj0iI2V4YW1wbGUiPkV4YW1wbGUgdXNhZ2U8L2E+PC9saT4NCjxsaT48YSBocmVmPSIjaXNzdWVzIj5Lbm93biBpc3N1ZXM8L2E+PC9saT4NCjxsaT48YSBocmVmPSIjY2hhbmdlbG9nIj5DaGFuZ2Vsb2c8L2E+PC9saT4NCjxsaT48YSBocmVmPSIjY3JlZGl0cyI+Q3JlZGl0czwvYT48L2xpPg0KPC91bD4NCjxoMiBpZD0ib3ZlcnZpZXciPk92ZXJ2aWV3PC9oMj4NCjxwPkV2ZXIgd2FudGVkIFRYUCdzIHNlYXJjaCBmYWNpbGl0eSB0byBiZSBhIGxpdHRsZSBtb3JlLCB3ZWxsLCBpbmFjY3VyYXRlPyBXYW50IG5vIG1vcmUuIERlZmluZSBob3cgZnV6enkgeW91ciBzZWFyY2ggaXMsIHdoZXJlIHRvIGxvb2sgYW5kIGhvdyBtdWNoIG9mIGEgbnVkZ2UgdG8gb2ZmZXIgeW91ciBzaXRlIHZpc2l0b3JzIHdpdGggcGhhdCBwaGluZ2Vycy48L3A+DQo8cD5SZXN1bHRzIGFyZSBvcmRlcmVkIGJ5IGFwcHJveGltYXRlIHJlbGV2YW5jeSBhbmQgaXQncyBhdXRvbWF0aWNhbGx5IGNvbnRleHQtc2Vuc2l0aXZlIGJlY2F1c2UgdGhlIHBvb2wgb2Ygd29yZHMgaXQgY29tcGFyZXMgYWdhaW5zdCBhcmUgZnJvbSB5b3VyIHNpdGUuIE9uIGEgem9vIHdlYnNpdGUsIHNvbWVvbmUgdHlwaW5nIGluICJsaW5vIiB3b24ndCBnZXQgYXJ0aWNsZXMgYWJvdXQgZmxvb3JpbmcgYnV0IG1vcmUgbGlrZWx5IGFydGljbGVzIGFib3V0IGxpb25zLCB3aGljaCBpcyB3aGF0IHRoZXkgcmVhbGx5IHdhbnRlZC4gV2UgaG9wZS48L3A+DQoNCjxoMiBpZD0iYXR0cyI+QXR0cmlidXRlczwvaDI+DQo8aDMgaWQ9InNlYXJjaHRlcm0iPjxjb2RlPnNlYXJjaF90ZXJtPC9jb2RlPjwvaDM+DQo8cD5XaGF0IHlvdSB3b3VsZCBsaWtlIHRvIHNlYXJjaCBmb3I6IGVpdGhlciBhIGZpeGVkIHN0cmluZyAocmF0aGVyIHBvaW50bGVzcyEpIG9yICI/cSIgKHRoZSBkZWZhdWx0KS4gTWF5YmUgaW4gZnV0dXJlIG90aGVyIHRoaW5ncyBsaWtlID9jdXN0b21fZmllbGQgc28geW91IGNhbiBlbWJlZCB0aGlzIGluIGFuIGFydGljbGUgYW5kIGRvIHBzdWVkby1yZWxhdGVkLWFydGljbGUgc2VhcmNoZXM8L3A+DQoNCjxoMyBpZD0ibWF0Y2h3aXRoIj48Y29kZT5tYXRjaF93aXRoPC9jb2RlPjwvaDM+DQo8cD5XaGVyZSB5b3Ugd291bGQgbGlrZSB0byBsb29rIGZvciBhIG1hdGNoIChpLmUuIHdoaWNoIGFydGljbGUgZmllbGRzKS4gRGVmaW5lIHRoZSBvYmplY3QgeW91IHdhbnQgdG8gbG9vayBpbiAoY3VycmVudGx5IG9ubHkgYXJ0aWNsZSBpcyBzdXBwb3J0ZWQpIGZvbGxvd2VkIGJ5IGEgY29sb24sIHRoZW4gYSBzZW1pLWNvbG9uIHNlcGFyYXRlZCBsaXN0IG9mIHBsYWNlcyB0byBsb29rOiA8Y29kZT5tYXRjaF93aXRoPSJhcnRpY2xlOmtleXdvcmRzO2JvZHk7ZXhjZXJwdCI8L2NvZGU+LiBPcHRpb25zIGFyZSBrZXl3b3JkcywgYm9keSwgZXhjZXJwdCwgY2F0ZWdvcnkxLCBjYXRlZ29yeTIsIHNlY3Rpb24sIGlkLCBhdXRob3JpZCwgdGl0bGUsIGN1c3RvbV8xLCBjdXN0b21fMiwgZXRjLiBEZWZhdWx0IGlzIGFydGljbGU6a2V5d29yZHM7Ym9keTtleGNlcnB0PC9wPg0KDQo8aDMgaWQ9InNob3ciPjxjb2RlPnNob3c8L2NvZGU+PC9oMz4NCjxwPldoYXQgdG8gZGlzcGxheTogd2hldGhlciB0byBsaXN0IHRoZSBjbG9zZXN0IG1hdGNoaW5nIGFydGljbGVzLCBjbG9zZXN0IG1hdGNoaW5nIHNlYXJjaCB0ZXJtcywgb3IgYm90aC4gQ2hvaWNlcyBhcmUgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBlaXRoZXIgPGNvZGU+YXJ0aWNsZXM8L2NvZGU+IG9yIDxjb2RlPndvcmRzPC9jb2RlPi4gRGVmYXVsdDogIndvcmRzLCBhcnRpY2xlcyI8L3A+DQoNCjxoMyBpZD0ic2VjdGlvbiI+PGNvZGU+c2VjdGlvbjwvY29kZT48L2gzPg0KPHA+TGltaXQgeW91ciBzZWFyY2ggcmVzdWx0cyB0byBhIHBhcnRpY3VsYXIgc2VjdGlvbiBvciB0aHJlZTsgZ2l2ZSBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0LiBZb3UgY2FuIHVzZSA/cyBmb3IgdGhlIGN1cnJlbnQgc2VjdGlvbiBvciAhcyBmb3IgYW55dGhpbmcgZXhjZXB0IHRoZSBjdXJyZW50IHNlY3Rpb24sIG9yIHVzZSAhIGFuZCB0aGUgbmFtZSBvZiBhIHNwZWNpZmljIHNlY3Rpb24gdG8gZXhjbHVkZSBpdC4gRGVmYXVsdDogZW1wdHkgKHRoZSB3aG9sZSBzaXRlKS48L3A+DQoNCjxoMyBpZD0iY2F0ZWdvcnkiPjxjb2RlPmNhdGVnb3J5PC9jb2RlPjwvaDM+DQo8cD5MaW1pdCB5b3VyIHNlYXJjaCByZXN1bHRzIHRvIGEgcGFydGljdWxhciBjYXRlZ29yeTsgZ2l2ZSBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0LiBZb3UgY2FuIHVzZSA/YyBmb3IgdGhlIGN1cnJlbnQgZ2xvYmFsIGNhdGVnb3J5IG9yICFjIGZvciBhbnkgZXhjZXB0IHRoZSBjdXJyZW50IGdsb2JhbCBjYXRlZ29yeSwgb3IgdXNlICEgYW5kIHRoZSBuYW1lIG9mIGEgc3BlY2lmaWMgY2F0ZWdvcnkgdG8gZXhjbHVkZSBpdC4gRGVmYXVsdDogZW1wdHkgKGFsbCBjYXRlZ29yaWVzKS48L3A+DQoNCjxoMyBpZD0ic3ViY2F0cyI+PGNvZGU+c3ViY2F0czwvY29kZT48L2gzPg0KPHA+U2V0IHRoaXMgdG8gMSB0byBlbmFibGUgc2VhcmNoaW5nIG9mIHN1Yi1jYXRlZ29yaWVzIHVuZGVyIHRoZSBnaXZlbiBjYXRlZ29yaWVzLiBEZWZhdWx0OiB1bnVzZWQuPC9wPg0KDQo8aDMgaWQ9InN0YXR1cyI+PGNvZGU+c3RhdHVzPC9jb2RlPjwvaDM+DQo8cD5SZXN0cmljdHMgdGhlIHNlYXJjaCB0byBwYXJ0aWN1bGFyIHR5cGVzIG9mIGRvY3VtZW50IHN0YXR1cy4gQ2hvb3NlIGZyb20gZHJhZnQsIGhpZGRlbiwgcGVuZGluZywgbGl2ZSwgc3RpY2t5LiBEZWZhdWx0OiAibGl2ZSwgc3RpY2t5Ii48L3A+DQoNCjxoMyBpZD0idG9sZXJhbmNlIj48Y29kZT50b2xlcmFuY2U8L2NvZGU+PC9oMz4NCjxwPkhvdyBmdXp6eSB0aGUgc2VhcmNoIGlzIGFuZCBob3cgbG9uZyB0aGUgbWluaW11bSBzZWFyY2ggdGVybSBpcyBhbGxvd2VkIHRvIGJlLiBBbiBpbnRlZ2VyIGZyb20gMCAodmVyeSBjbG9zZSBtYXRjaCwgYWxsb3dzIHNob3J0IHNlYXJjaCB3b3JkcykgdG8gNSAocHJldHR5IG11Y2ggbm90aGluZyBsaWtlIHdoYXQgeW91IHNlYXJjaGVkIGZvciBhbmQgc2VhcmNoIHdvcmRzIG11c3QgdGhlbiBiZSBsb25nZXIsIHJvdWdobHkgPjcgY2hhcmFjdGVyKS4gUHJhY3RpY2FsIHZhbHVlcyBhcmUgdXN1YWxseSAwLCAxLCAyICh0aGUgZGVmYXVsdCksIG9yIHBvc3NpYmx5IDMuPC9wPg0KDQo8aDMgaWQ9InJlZmluZSI+PGNvZGU+cmVmaW5lPC9jb2RlPjwvaDM+DQo8cD5Td2l0Y2ggb24gc291bmRleCBhbmQvb3IgbWV0YXBob25lIHN1cHBvcnQgZm9yIGNsb3NlciBtYXRjaGluZyAodXN1YWxseSBvbmx5IG9mIHVzZSBpbiBFbmdsaXNoKS4gVXNlIDxjb2RlPnNvdW5kZXg8L2NvZGU+IG9yIDxjb2RlPm1ldGFwaG9uZTwvY29kZT4gb3IgYm90aCBzZXBhcmF0ZWQgYnkgYSBjb21tYSB0byBzd2l0Y2ggdGhlbSBvbi4gQm90aCBvbiBieSBkZWZhdWx0LjwvcD4NCg0KPGgzIGlkPSJjYXNlc2Vuc2l0aXZlIj48Y29kZT5jYXNlX3NlbnNpdGl2ZTwvY29kZT48L2gzPg0KPHA+RG9lcyB3aGF0IGl0IHNheXMgb24gdGhlIHRpbi4gMT1jYXNlIHNlbnNpdGl2ZSBzZWFyY2gsIDA9bm90LiBEZWZhdWx0OiAwPC9wPg0KDQo8aDMgaWQ9Im1pbndvcmRsZW5ndGgiPjxjb2RlPm1pbl93b3JkX2xlbmd0aDwvY29kZT48L2gzPg0KPHA+VGhlIG1pbmltdW0gd29yZCBsZW5ndGggeW91IHdhbnQgcmV0dXJuaW5nLiBEZWZhdWx0OiA0PC9wPg0KDQo8aDMgaWQ9ImxpbWl0Ij48Y29kZT5saW1pdDwvY29kZT48L2gzPg0KPHA+VGhlIG1heGltdW0gbnVtYmVyIG9mIHdvcmRzIGFuZC9vciBhcnRpY2xlcyB0byBkaXNwbGF5LiBHaXZlIGl0IGEgc2luZ2xlIGludGVnZXIgYW5kIGl0IGxpbWl0cyBib3RoIHRvIHRoZSBzYW1lIHZhbHVlLiBTcGVjaWZ5aW5nIDxjb2RlPmFydGljbGVzOjU8L2NvZGU+IHdvdWxkIHJlbW92ZSBhbnkgbGltaXQgdG8gdGhlIG51bWJlciBvZiBhbHRlcm5hdGl2ZSBzZWFyY2ggd29yZHMgb2ZmZXJlZCBidXQgd291bGQgbGltaXQgdGhlIGFydGljbGVzIHRvIGEgbWF4aW11bSBvZiA1LiBTaW1pbGFybHksIDxjb2RlPndvcmRzOjQ8L2NvZGU+IHdvdWxkIHJlbW92ZSB0aGUgYXJ0aWNsZSBsaW1pdCBhbmQgb25seSBzaG93IGEgbWF4aW11bSBvZiA0IGFsdGVybmF0aXZlIHdvcmRzLiBCb3RoIG9mIHRoZXNlIGFyZSBzdWJqZWN0IHRvIHRoZWlyIHJlc3BlY3RpdmUgPGEgaHJlZj0iI3Nob3ciPnNob3c8L2E+IG9wdGlvbnMgYmVpbmcgc2V0IG9mIGNvdXJzZS4gRGVmYXVsdDogPGNvZGU+d29yZHM6NSwgYXJ0aWNsZXM6MTA8L2NvZGU+PC9wPg0KDQo8aDMgaWQ9ImZvcm0iPjxjb2RlPmZvcm08L2NvZGU+PC9oMz4NCjxwPlRoZSBUWFAgZm9ybSB0byBvdXRwdXQgdGhlIGxpc3Qgb2YgYXJ0aWNsZXMgaW4uIERlZmF1bHQ6IHNlYXJjaF9yZXN1bHRzLiBOb3RlIHRoYXQgJmx0O3R4cDpzZWFyY2hfcmVzdWx0X2V4Y2VycHQgLyZndDsgaXMgbm93IGhvbm91cmVkIGFzIGNsb3NlbHkgYXMgcG9zc2libGUsIGkuZS4gaWYgdGhlIGNsb3Nlc3Qgd29yZHMgYXJlIGZvdW5kIGluIHRoZSBrZXl3b3JkLCBib2R5IG9yIGV4Y2VycHQgZmllbGRzLiBJZiB0aGV5IGFyZSBmb3VuZCBpbiBhbnkgb3RoZXIgbG9jYXRpb24gKGUuZy4gY3VzdG9tXzEpIHRoZSBhcnRpY2xlIHRpdGxlIHdpbGwgYmUgcmV0dXJuZWQgYnV0IHRoZSBzZWFyY2hfcmVzdWx0X2V4Y2VycHQgd2lsbCBiZSBlbXB0eS4gVGhpcyBpcyBhIGxpbWl0YXRpb24gb2Ygc2VhcmNoX3Jlc3VsdF9leGNlcnB0LCBub3QgdGhlIHBsdWdpbiBkaXJlY3RseS48L3A+DQoNCjxoMyBpZD0ibm9tYXRjaGxhYmVsIj48Y29kZT5ub19tYXRjaF9sYWJlbDwvY29kZT48L2gzPg0KPHA+VGhlIHBocmFzZSB0byBkaXNwbGF5IHdoZW4gbm8gbWF0Y2hlcyAobWF5YmUgbm90IGV2ZW4gZnV6enkgb25lcyEpIGFyZSBmb3VuZC4gRGVmYXVsdHMgdG8gdGhlIE1MUCBzdHJpbmcgJ25vX21hdGNoJy4gVXNlIDxjb2RlPm5vX21hdGNoX2xhYmVsPSIiPC9jb2RlPiB0byB0dXJuIGl0IG9mZi48L3A+DQoNCjxoMyBpZD0ic3VnZ2VzdGxhYmVsIj48Y29kZT5zdWdnZXN0X2xhYmVsPC9jb2RlPjwvaDM+DQo8cD5UaGUgcGhyYXNlIHRvIGRpc3BsYXkgaW1tZWRpYXRlbHkgcHJpb3IgdG8gc2hvd2luZyBjbG9zZS1tYXRjaGluZyBhcnRpY2xlcy93b3Jkcy4gRGVmYXVsdHMgdG8gdGhlIE1MUCBzdHJpbmcgJ3N1Z2dlc3QnLiBVc2UgPGNvZGU+c3VnZ2VzdF9sYWJlbD0iIjwvY29kZT4gdG8gc3dpdGNoIGl0IG9mZi48L3A+DQoNCjxoMyBpZD0idG9vc2hvcnRsYWJlbCI+PGNvZGU+dG9vX3Nob3J0X2xhYmVsPC9jb2RlPjwvaDM+DQo8cD5TZWFyY2hlcyBvZiB1bmRlciBhYm91dCAzIGNoYXJhY3RlcnMgKHNvbWV0aW1lcyBtb3JlIGRlcGVuZGluZyBvbiB5b3VyIGNvbnRlbnQpIGFyZSB0b28gc2hvcnQgZm9yIGFueSByZWFzb25hYmxlIGZ1enppbmVzcyB0byBiZSBhcHBsaWVkLiBUaGlzIG1lc3NhZ2UgaXMgZGlzcGxheWVkIGluIHRoYXQgY2lyY3Vtc3RhbmNlLiBEZWZhdWx0cyB0byB0aGUgTUxQIHN0cmluZyB0b29fc2hvcnQuIFVzZSA8Y29kZT50b29fc2hvcnRfbGFiZWw9IiI8L2NvZGU+IHRvIHN3aXRjaCBpdCBvZmYuPC9wPg0KDQo8aDMgaWQ9ImxhYmVsdGFnIj48Y29kZT5sYWJlbHRhZzwvY29kZT48L2gzPg0KPHA+VGhlIEhUTUwgdGFnIHRvIHdyYXAgYW55IGxhYmVsIGluLiBEZWZhdWx0cyB0byAicCIuPC9wPg0KDQo8aDIgaWQ9ImV4YW1wbGUiPkV4YW1wbGUgdXNhZ2U8L2gyPg0KPHA+U2luY2UgaXQncyBub3QgYSBkaXJlY3QgcmVwbGFjZW1lbnQgZm9yIHRoZSBidWlsdC1pbiBzZWFyY2ggKFRYUCB3aWxsIGNvbXBsYWluIGlmIHlvdSBkbyBub3QgaW5jbHVkZSBhbiBhcnRpY2xlIHdpdGhpbiBhbiBpZl9zZWFyY2ggdGFnKSB0aGUgYmVzdCB3YXkgdG8gdXNlIGl0IGlzIGluIGNvbmp1bmN0aW9uIHdpdGggPGEgaHJlZj0iaHR0cDovL2ZvcnVtLnRleHRwYXR0ZXJuLmNvbS92aWV3dG9waWMucGhwP2lkPTE0MTYzIj5jaGhfaWZfZGF0YTwvYT4gaW4gYSBwYWdlIGxpa2UgdGhpczo8L3A+DQo8cHJlPg0KJmx0O3R4cDppZl9zZWFyY2gmZ3Q7DQogICZsdDt0eHA6Y2hoX2lmX2RhdGEmZ3Q7DQogICAgJmx0O2RsIGNsYXNzPSJleGNlcnB0cyImZ3Q7DQogICAgICAmbHQ7dHhwOmFydGljbGUgbGltaXQ9IjgiIGxpc3Rmb3JtPSJleGNlcnB0cyIgLyZndDsNCiAgICAmbHQ7L2RsJmd0Ow0KICAmbHQ7dHhwOmVsc2UgLyZndDsNCiAgICAmbHQ7ZGwgY2xhc3M9ImV4Y2VycHRzIiZndDsNCiAgICAgICZsdDt0eHA6c21kX2Z1enp5X2ZpbmQgZm9ybT0iZXhjZXJwdHMiIC8mZ3Q7DQogICAgJmx0Oy9kbCZndDsNCiAgJmx0Oy90eHA6Y2hoX2lmX2RhdGEmZ3Q7DQombHQ7L3R4cDppZl9zZWFyY2gmZ3Q7DQo8L3ByZT4NCjxwPlNvIGluIHRoZSBjYXNlIGFuIGV4YWN0IHRlcm0gaXMgZm91bmQsIHRoZSBub3JtYWwgVFhQIHNlYXJjaCBpcyBjYWxsZWQuIElmIGFuIGV4YWN0IHNlYXJjaCB0ZXJtIGlzIG5vdCBmb3VuZCwgc21kX2Z1enp5X2ZpbmQgd2lsbCBoYXZlIGEgZ28uPC9wPg0KDQo8aDIgaWQ9Imlzc3VlcyI+S25vd24gaXNzdWVzPC9oMj4NCjxwPkhlcmUncyBhIGxpc3Qgb2YgY3VycmVudGx5IGtub3duIGZvaWJsZXMgd2l0aCB0aGUgcGx1Z2luLiBJZiBhbnlvbmUgY2FuIHNoZWQgYW55IGxpZ2h0IG9uIGZpeGVzIGZvciB0aGVzZSwgcGxlYXNlIDxhIGhyZWY9Imh0dHA6Ly9zdGVmZGF3c29uLmNvbS9jb21tZW50Rm9ybSI+c2VuZCB0aGVtIG92ZXI8L2E+LCB0aGFua3MuPC9wPg0KPHVsPg0KPGxpPlNlYXJjaGluZyBmb3IgYSA8YSBocmVmPSJodHRwOi8vZm9ydW0udGV4dHBhdHRlcm4uY29tL3ZpZXd0b3BpYy5waHA/cGlkPTE0NTEzNSNwMTQ1MTM1Ij53b3JkIHdpdGggYW4gYXBvc3Ryb3BoZTwvYT4gaW4gaXQgY2F1c2VzIG9kZCBjaGFyYWN0ZXIgZW5jb2RpbmcuPC9saT4NCjxsaT5TZWFyY2hpbmcgZm9yIDxhIGhyZWY9Imh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5jb20vdmlld3RvcGljLnBocD9waWQ9MTU1MDI0I3AxNTUwMjQiPm11bHRpcGxlIHdvcmRzPC9hPiBjYW4gbGVhZCB0byBvZGQgcmVzdWx0cy48L2xpPg0KPGxpPlNvbWV0aW1lcyB0aGVyZSBhcmUgPGEgaHJlZj0iaHR0cDovL2ZvcnVtLnRleHRwYXR0ZXJuLmNvbS92aWV3dG9waWMucGhwP3BpZD0xNjI2NzcjcDE2MjY3NyI+b2RkIGFsdGVybmF0aXZlIHN1Z2dlc3Rpb25zPC9hPiB0aHJvd24gdXAgd2hlcmUgaXQgd2lsbCBwaWNrIGxvbmdlciwgb3IgcGFydC13b3JkcyBvdmVyIG9uZXMgdGhhdCB3ZSB3b3VsZCBhc3N1bWUgdG8gYmUgImJldHRlciIgc2VsZWN0aW9ucy4gVGhpcyBpcyBwcm9iYWJseSBhIGZhdWx0IHdpdGggc21kX2dldFdvcmQgKGluIHNtZF9saWIpIGJ1dCBJIGhhdmVuJ3QgbmFpbGVkIGl0IGRvd24geWV0LjwvbGk+DQo8L3VsPg0KDQo8aDIgaWQ9ImNoYW5nZWxvZyI+Q2hhbmdlbG9nPC9oMj4NCjx1bD4NCjxsaT4yNiBNYXIgMDcgfCA8YSBocmVmPSJodHRwOi8vc3RlZmRhd3Nvbi5jb20vZG93bmxvYWRzL3NtZF9mdXp6eV9maW5kX3YwLjAxLnR4dCI+djAuMDE8L2E+IHwgSW5pdGlhbCBwdWJsaWMgYmV0YTwvbGk+DQo8bGk+MzEgTWFyIDA3IHwgPGEgaHJlZj0iaHR0cDovL3N0ZWZkYXdzb24uY29tL2Rvd25sb2Fkcy9zbWRfZnV6enlfZmluZF92MC4wMi50eHQiPnYwLjAyPC9hPiB8IEZpeGVkIGNhc2Ugc2Vuc2l0aXZpdHkuIFNwZWQgdXAgYW5kIGltcHJvdmVkIHdvcmRsaXN0IGdlbmVyYXRpb24uIEFkZGVkIHJlZmluZSBhdHRyaWJ1dGUgdG8gc3dpdGNoIG9mZiBzb3VuZGV4L21ldGFwaG9uZSBpZiByZXF1aXJlZDwvbGk+DQo8bGk+MDYgQXVnIDA3IHwgPGEgaHJlZj0iaHR0cDovL3N0ZWZkYXdzb24uY29tL2Rvd25sb2Fkcy9zbWRfZnV6enlfZmluZF92MC4wMy50eHQiPnYwLjAzPC9hPiB8IEZpeGVkOiBtdWx0aS13b3JkIHNlYXJjaGluZyAoc21kX2dldFdvcmQgYnVnKSBhbmQgc2VhcmNoX3Jlc3VsdF9leGNlcnB0LiBBZGRlZCBjYXRlZ29yeSBhbmQgc3RhdHVzIHN1cHBvcnQuPC9saT4NCjxsaT4zMCBEZWMgMDcgfCA8YSBocmVmPSJodHRwOi8vc3RlZmRhd3Nvbi5jb20vZG93bmxvYWRzL3NtZF9mdXp6eV9maW5kX3YwLjEuemlwIj52MC4xPC9hPiB8IE9mZmljaWFsIGZpcnN0IHJlbGVhc2UuIEFkZGVkIGxhYmVsdGFnIGFuZCBjdXN0b20gZmllbGQgc3VwcG9ydC4gRml4ZWQgYmFkIGNvdW50aW5nIGluIGxpbWl0IGF0dHJpYnV0ZSAodGhhbmtzIEVscyk8L2xpPg0KPC91bD4NCg0KPGgyIGlkPSJjcmVkaXRzIj5DcmVkaXRzPC9oMj4NCjxwPlRoaXMgcGx1Z2luIHdvdWxkbid0IGhhdmUgZXhpc3RlZCB3aXRob3V0IHRoZSBvcmlnaW5hbCA8YSBocmVmPSJodHRwOi8vZWxvbmVuLmlraS5maS9jb2RlL21pc2Mtbm90ZXMvYXBwci1zZWFyY2gtcGhwL2luZGV4Lmh0bWwiPkZ1enp5IEZpbmQgYWxnb3JpdGhtIGJ5IEphcm5vIEVsb25lbjwvYT4uIEFsbCBrdWRvcyB0byBoaW0sIEkganVzdCB3aXNoIEkgdW5kZXJzdG9vZCBob3cgdGhlIGNvZGUgd29ya2VkIDotKSBBbHNvLCBleHRlbmRlZCB0aGFua3MgdG8gdGhlIGJldGEgdGVzdGVycywgZXNwZWNpYWxseSBFbHMgTGVwZWxhYXJzIGZvciBmZWVkYmFjayBhbmQgdW5lbmRpbmcgcGF0aWVuY2UgZHVyaW5nIGRldmVsb3BtZW50LiBBbmQgb2YgY291cnNlIFRlYW0gVGV4dFBhdHRlcm4gZm9yIHRoZSBiZXN0IENNUyBvbiB0aGUgcGxhbmV0LjwvcD4iO3M6NDoiY29kZSI7czoxMjkwODoiZnVuY3Rpb24gc21kX2Z1enp5X2ZpbmQoJGF0dHMsICR0aGluZz0nJykgew0KCXJlcXVpcmVfcGx1Z2luKCdzbWRfbGliJyk7DQoNCgkvLyBNTFAgc3VwcG9ydA0KCWdsb2JhbCAkcHJldGV4dCwgJHNtZF9mdXp6TGFuZzsNCgkkc21kX2Z1enpfc3RyID0gYXJyYXkoDQoJCSd0b29fc2hvcnQnID0+ICdUaGUgdGV4dCB5b3UgYXJlIHNlYXJjaGluZyBmb3IgaXMgcHJvYmFibHkgdG9vIHNob3J0LiBUcnkgYSBsb25nZXIgd29yZC4gJywNCgkJJ25vX21hdGNoJyA9PiAnU29ycnksIG5vIHJlc3VsdHMgbWF0Y2hlZCAie3NlYXJjaF90ZXJtfSIgZXhhY3RseS4gJywNCgkJJ3N1Z2dlc3QnID0+ICdIZXJlIGFyZSB0aGUgY2xvc2VzdCBtYXRjaGluZyB7dGhpbmdpZXN9IHRoYXQgbWF5IGhlbHAgeW91IGZpbmQgd2hhdCB5b3UgYXJlIGxvb2tpbmcgZm9yOiAnLA0KCQknc3VnZ2VzdF9qb2luJyA9PiAnYW5kJywNCgkJJ2FydGljbGVzJyA9PiAnYXJ0aWNsZXMnLA0KCQknd29yZHMnID0+ICd3b3JkcycsDQoJKTsNCgkkc21kX2Z1enpMYW5nID0gbmV3IHNtZF9NTFAoJ3NtZF9mdXp6eV9maW5kJywgJ3NtZF9mdXp6JywgJHNtZF9mdXp6X3N0cik7DQoNCglleHRyYWN0KGxBdHRzKGFycmF5KA0KCQknZm9ybScgPT4gJ3NlYXJjaF9yZXN1bHRzJywNCgkJJ3NlY3Rpb24nID0+ICcnLA0KCQknY2F0ZWdvcnknID0+ICcnLA0KCQknc3ViY2F0cycgPT4gJzAnLA0KCQknc2VhcmNoX3Rlcm0nID0+ICc/cScsDQoJCSdtYXRjaF93aXRoJyA9PiAnYXJ0aWNsZTprZXl3b3Jkcztib2R5O2V4Y2VycHQnLA0KCQkndG9sZXJhbmNlJyA9PiAnMicsDQoJCSdtaW5fd29yZF9sZW5ndGgnID0+ICc0JywNCgkJJ2xpbWl0JyA9PiAnd29yZHM6NSwgYXJ0aWNsZXM6MTAnLA0KCQknY2FzZV9zZW5zaXRpdmUnID0+ICcwJywNCgkJJ3JlZmluZScgPT4gJ21ldGFwaG9uZSwgc291bmRleCcsDQoJCSdzaG93JyA9PiAnd29yZHMsIGFydGljbGVzJywNCgkJJ3N0YXR1cycgPT4gJ2xpdmUsIHN0aWNreScsDQoJCSdkZWJ1ZycgPT4gJzAnLA0KCQknbm9fbWF0Y2hfbGFiZWwnID0+ICcjJywNCgkJJ3N1Z2dlc3RfbGFiZWwnID0+ICcjJywNCgkJJ3Rvb19zaG9ydF9sYWJlbCcgPT4gJyMnLA0KCQknbGFiZWx0YWcnID0+ICdwJywNCgkpLCAkYXR0cykpOw0KDQoJJHNlYXJjaEFsbG93ID0gYXJyYXkoIj9jIiwgIiFjIiwgIj9zIiwgIiFzIiwgIj90IiwgIiF0IiwgIj9pZCIsICIhaWQiLCAiP3EiLCAiIXEiLCAiP2ZpZWxkIiwgIiFmaWVsZCIpOw0KCSRyZWZpbmVBbGxvdyA9IGFycmF5KCJtZXRhcGhvbmUiLCAic291bmRleCIpOw0KCSRzaG93QWxsb3cgPSBhcnJheSgiYXJ0aWNsZXMiLCAid29yZHMiKTsNCgkkY29sTmFtZXMgPSBhcnJheSgnS2V5d29yZHMnID0+ICJhcnRpY2xlOmtleXdvcmRzIiwNCgkJCQkJCQknQm9keScgPT4gImFydGljbGU6Ym9keSIsDQoJCQkJCQkJJ0V4Y2VycHQnID0+ICJhcnRpY2xlOmV4Y2VycHQiLA0KCQkJCQkJCSdDYXRlZ29yeTEnID0+ICJhcnRpY2xlOmNhdGVnb3J5MSIsDQoJCQkJCQkJJ0NhdGVnb3J5MicgPT4gImFydGljbGU6Y2F0ZWdvcnkyIiwNCgkJCQkJCQknU2VjdGlvbicgPT4gImFydGljbGU6c2VjdGlvbiIsDQoJCQkJCQkJJ0lEJyA9PiAiYXJ0aWNsZTppZCIsDQoJCQkJCQkJJ0F1dGhvcklEJyA9PiAiYXJ0aWNsZTphdXRob3JpZCIsDQoJCQkJCQkJJ1RpdGxlJyA9PiAiYXJ0aWNsZTp0aXRsZSIsDQoJCQkJCQkJJ2NhdGVnb3J5JyA9PiAiaW1hZ2U6Y2F0ZWdvcnkiLA0KCQkJCQkJCSdhbHQnID0+ICJpbWFnZTphbHQiLA0KCQkJCQkJCSdjYXB0aW9uJyA9PiAiaW1hZ2U6Y2FwdGlvbiIsDQoJCQkJCQkJJ25hbWUnID0+ICJpbWFnZTpuYW1lIiwNCgkJCQkJCQknbWVzc2FnZScgPT4gImNvbW1lbnRzOm1lc3NhZ2UiLA0KCQkJCQkJCSdlbWFpbCcgPT4gImNvbW1lbnRzOmVtYWlsIiwNCgkJCQkJCQknbmFtZScgPT4gImNvbW1lbnRzOm5hbWUiLA0KCQkJCQkJCSd3ZWInID0+ICJjb21tZW50czp3ZWIiLA0KCQkJCQkJCSk7DQoNCgkkcGxhY2VzID0gYXJyYXkoJ3RleHRwYXR0ZXJuJyA9PiAiYXJ0aWNsZSIsICd0eHBfaW1hZ2UnID0+ICJpbWFnZSIsICd0eHBfZGlzY3VzcycgPT4gImNvbW1lbnRzIik7DQoJJHNlY3NpbiA9IGFycmF5KCk7DQoJJGNhdHNpbiA9IGFycmF5KCk7DQoJJHN0YXRzaW4gPSBhcnJheSgpOw0KCSRmdWxsU2VjTGlzdCA9IGFycmF5KCk7DQoJJG5vdFNlY0xpc3QgPSBhcnJheSgpOw0KCSRmdWxsQ2F0TGlzdCA9IGFycmF5KCk7DQoJJG5vdENhdExpc3QgPSBhcnJheSgpOw0KCSRmdWxsU3RhdExpc3QgPSBhcnJheSgpOw0KCSRub3RTdGF0TGlzdCA9IGFycmF5KCk7DQoJJHJlZmluZUxpc3QgPSBhcnJheSgpOw0KCSRkYlRhYmxlcyA9IGFycmF5KCk7DQoJJGRiRmllbGRzID0gYXJyYXkoKTsNCgkkd2hlcmVQYXJ0cyA9IGFycmF5KCk7DQoNCgkvLyBFeHBhbmQgdGhlIGFyZ3MgaW4gY2FzZSB0aGV5J3JlID8gb3IgISBzaG9ydGN1dHMsIGFuZCBkbyBzb21lIHZhbGlkaXR5IGNoZWNraW5nLg0KCSRzZWFyY2hfdGVybSA9IHNtZF9nZXRPcHRzKCRzZWFyY2hfdGVybSwgJHNlYXJjaEFsbG93LCAiIiwgZmFsc2UpOw0KCSRzZWFyY2hfdGVybSA9ICRzZWFyY2hfdGVybVswXVswXTsNCglpZiAoJGRlYnVnID4gMSkgew0KCQlkbXAoJHNlYXJjaF90ZXJtKTsNCgl9DQoJJHJlZmluZSA9IGRvX2xpc3QoJHJlZmluZSk7DQoJZm9yICgkaWR4ID0gMDsgJGlkeCA8IGNvdW50KCRyZWZpbmUpOyAkaWR4KyspIHsNCgkJaWYgKGluX2FycmF5KCRyZWZpbmVbJGlkeF0sICRyZWZpbmVBbGxvdykpIHsNCgkJCSRyZWZpbmVMaXN0WyRpZHhdID0gJHJlZmluZVskaWR4XTsNCgkJfQ0KCX0NCgkkbWV0YV9zZWFyY2ggPSAoaW5fYXJyYXkoIm1ldGFwaG9uZSIsICRyZWZpbmVMaXN0KSkgPyBtZXRhcGhvbmUoJHNlYXJjaF90ZXJtKSA6ICIiOw0KCSRzb3VuZF9zZWFyY2ggPSAoaW5fYXJyYXkoInNvdW5kZXgiLCAkcmVmaW5lTGlzdCkpID8gc291bmRleCgkc2VhcmNoX3Rlcm0pIDogIiI7DQoJJHRvbGVyYW5jZSA9IGludHZhbCgkdG9sZXJhbmNlKTsNCg0KCS8vIG1hdGNoX3dpdGggbmVlZHMgdG8gYmUgYnVpbHQgaW50byBhIHNlcmllcyBvZiBhcnJheXMgb2YgZGF0YWJhc2UgdGFibGVzIGFuZCBjb2x1bW5zDQoJJGxvb2tpbiA9IHNtZF9zcGxpdCgkbWF0Y2hfd2l0aCwgZmFsc2UsICI6LFxzIik7DQoJLy8gTG9vcCBvdmVyIHBhaXJzIG9mIGVsZW1lbnRzDQoJZm9yICgkaWR4ID0gMDsgJGlkeCA8IGNvdW50KCRsb29raW4pOyAkaWR4Kz0yKSB7DQoJCSRkYlRhYmxlc1tdID0gYXJyYXlfc2VhcmNoKCRsb29raW5bJGlkeF0sICRwbGFjZXMpOw0KCQkkZGJGaWVsZExpc3QgPSBzbWRfc3BsaXQoJGxvb2tpblskaWR4KzFdLCBmYWxzZSwgIjsiKTsNCgkJJGRiRmllbGQgPSBhcnJheSgpOw0KCQlmb3JlYWNoICgkZGJGaWVsZExpc3QgYXMgJGxvb2tGaWVsZCkgew0KCQkJJGtleSA9IGFycmF5X3NlYXJjaCgkbG9va2luWyRpZHhdLiI6Ii4kbG9va0ZpZWxkLCAkY29sTmFtZXMpOw0KCQkJaWYgKCRrZXkpIHsNCgkJCQkkZGJGaWVsZFtdID0gJGtleTsNCgkJCX0gZWxzZSBpZiAoc3RycG9zKCRsb29rRmllbGQsICJjdXN0b21fIikgPT09IDApIHsNCgkJCQkkZGJGaWVsZFtdID0gJGxvb2tGaWVsZDsNCgkJCX0NCgkJfQ0KCQkkZGJGaWVsZHNbXSA9ICRkYkZpZWxkOw0KCX0NCglpZiAoY291bnQoJGRiVGFibGVzKSA9PSAwIHx8IGNvdW50KCRkYkZpZWxkcykgPT0gMCkgew0KCQkkZGJUYWJsZXNbXSA9ICJ0ZXh0cGF0dGVybiI7DQoJCSRkYkZpZWxkc1tdID0gIioiOw0KCX0NCg0KCSRzaG93TGlzdCA9IGRvX2xpc3QoJHNob3cpOw0KCWZvciAoJGlkeCA9IDA7ICRpZHggPCBjb3VudCgkc2hvd0xpc3QpOyAkaWR4KyspIHsNCgkJaWYgKGluX2FycmF5KCRzaG93TGlzdFskaWR4XSwgJHNob3dBbGxvdykpIHsNCgkJCSRzaG93TGlzdFskaWR4XSA9ICRzbWRfZnV6ekxhbmctPmdUeHQoJHNob3dMaXN0WyRpZHhdKTsNCgkJfQ0KCX0NCgkkbGltaXRCeSA9IGFycmF5KCk7DQoJJGxpbWl0ID0gZG9fbGlzdCgkbGltaXQpOw0KCWZvcmVhY2ggKCRsaW1pdCBhcyAkbGltT3B0aW9uKSB7DQoJCWlmIChpc19udW1lcmljKCRsaW1PcHRpb24pKSB7DQoJCQkkbGltaXRCeVsiYXJ0aWNsZXMiXSA9ICRsaW1PcHRpb247DQoJCQkkbGltaXRCeVsid29yZHMiXSA9ICRsaW1PcHRpb247DQoJCX0gZWxzZSB7DQoJCQkkbGltc3BsaXQgPSBzbWRfc3BsaXQoJGxpbU9wdGlvbiwgZmFsc2UsICI6Iik7DQoJCQlpZiAoKGNvdW50KCRsaW1zcGxpdCkgPT0gMikgJiYgKGluX2FycmF5KCRsaW1zcGxpdFswXSwgJHNob3dBbGxvdykpICYmIChpc19udW1lcmljKCRsaW1zcGxpdFsxXSkpKSB7DQoJCQkJJGxpbWl0QnlbJGxpbXNwbGl0WzBdXSA9ICRsaW1zcGxpdFsxXTsNCgkJCX0NCgkJfQ0KCX0NCg0KCSR0aGluZ2llcyA9IGltcGxvZGUoIiAiLiRzbWRfZnV6ekxhbmctPmdUeHQoJ3N1Z2dlc3Rfam9pbicpLiIgIiwgJHNob3dMaXN0KTsNCgkkbm9fbWF0Y2hfbGFiZWwgPSAoJG5vX21hdGNoX2xhYmVsID09ICIjIikgPyAkc21kX2Z1enpMYW5nLT5nVHh0KCdub19tYXRjaCcsIGFycmF5KCJ7c2VhcmNoX3Rlcm19IiA9PiAkc2VhcmNoX3Rlcm0pKSA6ICRub19tYXRjaF9sYWJlbDsNCgkkc3VnZ2VzdF9sYWJlbCA9ICgkc3VnZ2VzdF9sYWJlbCA9PSAiIyIpID8gJHNtZF9mdXp6TGFuZy0+Z1R4dCgnc3VnZ2VzdCcsIGFycmF5KCJ7dGhpbmdpZXN9IiA9PiAkdGhpbmdpZXMpKSA6ICRzdWdnZXN0X2xhYmVsOw0KCSR0b29fc2hvcnRfbGFiZWwgPSAoJHRvb19zaG9ydF9sYWJlbCA9PSAiIyIpID8gJHNtZF9mdXp6TGFuZy0+Z1R4dCgndG9vX3Nob3J0JykgOiAkdG9vX3Nob3J0X2xhYmVsOw0KDQoJLy8gR2V0IHRoZSBkb2N1bWVudCBzdGF0dXNlcyB0byBzZWFyY2gNCgkkc3RhdGlpID0gc21kX2dldE9wdHMoJHN0YXR1cywgYXJyYXkoIiFmaWVsZCIpLCAiIiwgZmFsc2UpOw0KCSRmdWxsU3RhdExpc3QgPSAkc3RhdGlpWzBdOw0KCSRub3RTdGF0TGlzdCA9ICRzdGF0aWlbMV07DQoNCgkkdG1wYSA9IGFycmF5KCk7DQoJZm9yICgkaWR4ID0gMDsgJGlkeCA8IGNvdW50KCRmdWxsU3RhdExpc3QpOyAkaWR4KyspIHsNCgkJJHRtcGFbXSA9ICInIiAuZ2V0U3RhdHVzTnVtKCRmdWxsU3RhdExpc3RbJGlkeF0pLiAiJyI7DQoJfQ0KCWlmIChjb3VudCgkdG1wYSkgPiAwKSB7DQoJCSRzdGF0c2luW10gPSAic3RhdHVzIElOICgiIC5pbXBsb2RlKCIsIiwgJHRtcGEpLiAiKSI7DQoJfQ0KCSR0bXBhID0gYXJyYXkoKTsNCglmb3IgKCRpZHggPSAwOyAkaWR4IDwgY291bnQoJG5vdFN0YXRMaXN0KTsgJGlkeCsrKSB7DQoJCSR0bXBhW10gPSAiJyIgLmdldFN0YXR1c051bSgkbm90U3RhdExpc3RbJGlkeF0pLiAiJyI7DQoJfQ0KCWlmIChjb3VudCgkdG1wYSkgPiAwKSB7DQoJCSRzdGF0c2luW10gPSAic3RhdHVzIE5PVCBJTiAoIiAuaW1wbG9kZSgiLCIsICR0bXBhKS4gIikiOw0KCX0NCg0KCWlmIChjb3VudCgkc3RhdHNpbikgPiAwKSB7DQoJCSR3aGVyZVBhcnRzW10gPSAiKCIgLiBpbXBsb2RlKCIgT1IgIiwgJHN0YXRzaW4pIC4gIikiOw0KCX0NCg0KCSRzZWN0aW9ucyA9IHNtZF9nZXRPcHRzKCRzZWN0aW9uLCBhcnJheSgiP3MiLCAiIXMiLCAiIWZpZWxkIiksICIiLCBmYWxzZSk7DQoJJGZ1bGxTZWNMaXN0ID0gJHNlY3Rpb25zWzBdOw0KCSRub3RTZWNMaXN0ID0gJHNlY3Rpb25zWzFdOw0KDQoJJGNhdHMgPSBzbWRfZ2V0T3B0cygkY2F0ZWdvcnksIGFycmF5KCI/YyIsICIhYyIsICIhZmllbGQiKSwgIiIsIGZhbHNlKTsNCgkkZnVsbENhdExpc3QgPSAkY2F0c1swXTsNCgkkbm90Q2F0TGlzdCA9ICRjYXRzWzFdOw0KDQoJLy8gaW5jbHVkZWQgc2VjdGlvbnMgJiBjYXRlZ29yaWVzDQoJaWYgKGluX2FycmF5KCJ0ZXh0cGF0dGVybiIsICRkYlRhYmxlcykpIHsNCgkJLy8gc2VjdGlvbnMNCgkJJHRtcGEgPSBhcnJheSgpOw0KCQlmb3IgKCRpZHggPSAwOyAkaWR4IDwgY291bnQoJGZ1bGxTZWNMaXN0KTsgJGlkeCsrKSB7DQoJCQkkdG1wYVtdID0gIiciIC4kZnVsbFNlY0xpc3RbJGlkeF0uICInIjsNCgkJfQ0KCQlpZiAoY291bnQoJHRtcGEpID4gMCkgew0KCQkJJHNlY3NpbltdID0gInNlY3Rpb24gSU4gKCIgLmltcGxvZGUoIiwiLCAkdG1wYSkuICIpIjsNCgkJfQ0KDQoJCS8vIGV4Y2x1ZGVkIHNlY3Rpb25zDQoJCSR0bXBhID0gYXJyYXkoKTsNCgkJZm9yICgkaWR4ID0gMDsgJGlkeCA8IGNvdW50KCRub3RTZWNMaXN0KTsgJGlkeCsrKSB7DQoJCQkkdG1wYVtdID0gIiciIC4kbm90U2VjTGlzdFskaWR4XS4gIiciOw0KCQl9DQoJCWlmIChjb3VudCgkdG1wYSkgPiAwKSB7DQoJCQkkc2Vjc2luW10gPSAic2VjdGlvbiBOT1QgSU4gKCIgLmltcGxvZGUoIiwiLCAkdG1wYSkuICIpIjsNCgkJfQ0KDQoJCWlmIChjb3VudCgkc2Vjc2luKSA+IDApIHsNCgkJCSR3aGVyZVBhcnRzW10gPSAiKCIgLiBpbXBsb2RlKCIgT1IgIiwgJHNlY3NpbikgLiAiKSI7DQoJCX0NCg0KCQkvLyBjYXRlZ29yaWVzDQoJCSR0bXBhID0gYXJyYXkoKTsNCgkJZm9yICgkaWR4ID0gMDsgJGlkeCA8IGNvdW50KCRmdWxsQ2F0TGlzdCk7ICRpZHgrKykgew0KCQkJaWYgKCRzdWJjYXRzKSB7DQoJCQkJJGNhdGVncyA9IGdldFRyZWUoJGZ1bGxDYXRMaXN0WyRpZHhdLCAnYXJ0aWNsZScpOw0KCQkJCWZvciAoJGpkeCA9IDA7ICRqZHggPCBjb3VudCgkY2F0ZWdzKTsgJGpkeCsrKSB7DQoJCQkJCWlmICgkY2F0ZWdzWyRqZHhdWyduYW1lJ10gIT0gInJvb3QiKSB7DQoJCQkJCQkkdG1wYVtdID0gIiciIC4kY2F0ZWdzWyRqZHhdWyduYW1lJ10uICInIjsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0gZWxzZSB7DQoJCQkJJHRtcGFbXSA9ICInIiAuJGZ1bGxDYXRMaXN0WyRpZHhdLiAiJyI7DQoJCQl9DQoJCX0NCgkJaWYgKGNvdW50KCR0bXBhKSA+IDApIHsNCgkJCSR0aGVDYXRzID0gaW1wbG9kZSgiLCIsICR0bXBhKTsNCgkJCSRjYXRzaW5bXSA9ICIoIENhdGVnb3J5MSBJTiAoIiAuJHRoZUNhdHMuICIpIE9SIENhdGVnb3J5MiBJTiAoIiAuJHRoZUNhdHMuICIpICkiOw0KCQl9DQoNCgkJLy8gZXhjbHVkZWQgY2F0ZWdvcmllcw0KCQkkdG1wYSA9IGFycmF5KCk7DQoJCWZvciAoJGlkeCA9IDA7ICRpZHggPCBjb3VudCgkbm90Q2F0TGlzdCk7ICRpZHgrKykgew0KCQkJaWYgKCRzdWJjYXRzKSB7DQoJCQkJJGNhdGVncyA9IGdldFRyZWUoJG5vdENhdExpc3RbJGlkeF0sICdhcnRpY2xlJyk7DQoJCQkJZm9yICgkamR4ID0gMDsgJGpkeCA8IGNvdW50KCRjYXRlZ3MpOyAkamR4KyspIHsNCgkJCQkJaWYgKCRjYXRlZ3NbJGpkeF1bJ25hbWUnXSAhPSAicm9vdCIpIHsNCgkJCQkJCSR0bXBhW10gPSAiJyIgLiRjYXRlZ3NbJGpkeF1bJ25hbWUnXS4gIiciOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfSBlbHNlIHsNCgkJCQkkdG1wYVtdID0gIiciIC4kbm90Q2F0TGlzdFskaWR4XS4gIiciOw0KCQkJfQ0KCQl9DQoJCWlmIChjb3VudCgkdG1wYSkgPiAwKSB7DQoJCQkkdGhlQ2F0cyA9IGltcGxvZGUoIiwiLCAkdG1wYSk7DQoJCQkkY2F0c2luW10gPSAiKCBDYXRlZ29yeTEgTk9UIElOICgiIC4kdGhlQ2F0cy4gIikgQU5EIENhdGVnb3J5MiBOT1QgSU4gKCIgLiR0aGVDYXRzLiAiKSApIjsNCgkJfQ0KDQoJCWlmIChjb3VudCgkY2F0c2luKSA+IDApIHsNCgkJCSR3aGVyZVBhcnRzW10gPSAiKCIgLiBpbXBsb2RlKCIgQU5EICIsICRjYXRzaW4pIC4gIikiOw0KCQl9DQoNCgkJLy8gY29tbWVudHMNCgkJaWYgKGluX2FycmF5KCJ0eHBfZGlzY3VzcyIsJGRiVGFibGVzKSkgew0KCQkJJHdoZXJlUGFydHNbXSA9ICJ0ZXh0cGF0dGVybi5JRCA9IHR4cF9kaXNjdXNzLnBhcmVudGlkIjsNCiAgICAgIH0NCgl9DQoNCgkvLyBDYXRjaC1hbGwgZm9yIHRoZSB3aGVyZSBzdGF0ZW1lbnQNCglpZiAoY291bnQoJHdoZXJlUGFydHMpID09IDApIHsNCgkJJHdoZXJlID0gIjE9MSI7DQoJfSBlbHNlIHsNCgkJJHdoZXJlID0gaW1wbG9kZSgiIEFORCAiLCAkd2hlcmVQYXJ0cyk7DQoJfQ0KDQoJaWYgKCRkZWJ1ZyA+IDApIHsNCgkJZG1wKCR3aGVyZSk7DQoJfQ0KDQoJJG91dCA9ICIiOw0KCS8vIFBlcmZvcm0gdGhlIHNlYXJjaGVzDQoJJGZpbmRlciA9IG5ldyBzbWRfRnV6enlGaW5kKCRzZWFyY2hfdGVybSwgJHRvbGVyYW5jZSk7DQoJaWYgKCRmaW5kZXItPnRvb19zaG9ydF9lcnIpIHsNCgkJJG91dCAuPSAoJGxhYmVsdGFnID09ICIiKSA/ICIiIDogIjwiIC4kbGFiZWx0YWcuIj4iOw0KCQkkb3V0IC49ICRub19tYXRjaF9sYWJlbDsNCgkJJG91dCAuPSAkdG9vX3Nob3J0X2xhYmVsOw0KCQkkb3V0IC49ICgkbGFiZWx0YWcgPT0gIiIpID8gIiIgOiAiPC8iIC4kbGFiZWx0YWcuIj4iOw0KCX0gZWxzZSB7DQoJCSRjb2xzID0gIioiIC4gKChpbl9hcnJheSgidGV4dHBhdHRlcm4iLCAkZGJUYWJsZXMpKSA/ICIsIHVuaXhfdGltZXN0YW1wKHRleHRwYXR0ZXJuLlBvc3RlZCkgQVMgdVBvc3RlZCIgOiAiIik7DQoJCSRycyA9IHNhZmVfcm93c19zdGFydCgkY29scywgaW1wbG9kZSgkZGJUYWJsZXMsICIsICIpLCAkd2hlcmUpOw0KCQlpZiAoaW5fYXJyYXkoInRleHRwYXR0ZXJuIiwkZGJUYWJsZXMpKSB7DQoJCQkkb3Bmb3JtID0gZmV0Y2hfZm9ybSgkZm9ybSk7DQoJCX0NCgkJJHBhZ2V1cmwgPSBzbWRfcmVtb3ZlUVNWYXIoJHByZXRleHRbJ3JlcXVlc3RfdXJpJ10sJ3EnKTsNCgkJJGFsbEZpZWxkcyA9ICIiOw0KCQkkYXJ0TGlzdCA9IGFycmF5KCk7DQoJCSR3b3JkTGlzdCA9IGFycmF5KCk7DQoJCSR0ZXJtTGlzdCA9IGFycmF5KCk7DQoJCXdoaWxlKCRyb3cgPSBuZXh0Um93KCRycykpIHsNCgkJCSRhbGxGaWVsZHMgPSAiIjsNCgkJCS8vIEpvaW4gYWxsIHRoZSByZXF1aXJlZCBwbGFjZXMgdG8gbG9vayBpbnRvIGEgbG9uZyB0ZXh0IGJsb2NrDQoJCQlmb3JlYWNoICgkZGJGaWVsZCBhcyAkdGhlRmllbGQpIHsNCgkJCQkkYWxsRmllbGRzIC49ICRyb3dbJHRoZUZpZWxkXS4iICI7DQoJCQl9DQoJCQkvLyBSZW1vdmUgYmV0d2Vlbi13b3JkIHB1bmN0dWF0aW9uIGFuZCByZXBsYWNlIHdpdGggc3BhY2UNCgkJCSRqdXN0Q2hhcnMgPSAiL1teYS16QS1aMC05XC1cJyBdKy8iOw0KCQkJJGFsbEZpZWxkcyA9IHByZWdfcmVwbGFjZSgkanVzdENoYXJzLCAnICcsICRhbGxGaWVsZHMpOw0KCQkJLy8gU3BsaXQgdGhlIHJlbWFpbmRlciBieSAoc2luZ2xlIG9yIG11bHRpcGxlKSBzcGFjZXMNCgkJCSR3ZXJkcyA9IHByZWdfc3BsaXQoJy9ccysvJywgJGFsbEZpZWxkcywgLTEsIFBSRUdfU1BMSVRfTk9fRU1QVFkpOw0KCQkJLy8gLi4uYW5kIHJlY29uc3RpdHV0ZSB0aGUgdW5pcXVlIHdvcmRzIGFzIGEgaHVnZSBzcGFjZS1kZWxpbWl0ZWQgc3RyaW5nDQoJCQkkd2VyZHMgPSBpbXBsb2RlKCIgIixhcnJheV91bmlxdWUoJHdlcmRzKSk7DQoJCQkvLyBUYWtlIGludG8gYWNjb3VudCBjYXNlIHNlbnNpdGl2aXR5DQoJCQkkd2VyZHMgPSAoJGNhc2Vfc2Vuc2l0aXZlKSA/ICR3ZXJkcyA6IHN0cnRvbG93ZXIoJHdlcmRzKTsNCgkJCWlmICgkZGVidWcgPiAxKSB7DQoJCQkJZG1wKCR3ZXJkcyk7DQoJCQl9DQoNCgkJCS8vIEZpbmQgY2xvc2Ugd29yZCBtYXRjaGVzDQoJCQkkbWF0Y2hlcyA9ICRmaW5kZXItPnNlYXJjaCgkd2VyZHMpOw0KCQkJaWYgKCRkZWJ1ZyA+IDEpIHsNCgkJCQlkbXAoJG1hdGNoZXMpOw0KCQkJfQ0KDQoJCQlpZiAoY291bnQoJG1hdGNoZXMpID4gMCkgew0KCQkJCSRzaG9ydGVzdERpc3QgPSAxMDA7IC8vIEEgc3R1cGlkbHkgaGlnaCBudW1iZXIgdG8gc3RhcnQgd2l0aA0KCQkJCSRzaG9ydGVzdE1ldGFEaXN0ID0gLTE7DQoJCQkJJGNsb3Nlc3RXb3JkID0gIiI7DQoJCQkJJGNsb3Nlc3RNZXRhV29yZCA9ICIiOw0KCQkJCSRtYXhfdGVybV9sZW4gPSAwOw0KCQkJCS8vIEJ1aWxkIGEgdW5pcXVlIGFycmF5IG9mIGNsb3Nlc3QgbWF0Y2hpbmcgd29yZHMNCgkJCQl3aGlsZShsaXN0KCRpZHgsJGRpc3QpID0gZWFjaCgkbWF0Y2hlcykpIHsNCgkJCQkJJHRlcm0gPSBzbWRfZ2V0V29yZCgkd2VyZHMsJHNlYXJjaF90ZXJtLCRpZHgpOw0KDQoJCQkJCS8vIE9ubHkgd29yZHMgbWVldGluZyB0aGUgbWluaW11bSByZXF1aXJlbWVudCBuZWVkIGFwcGx5DQoJCQkJCSRtYXhfdGVybV9sZW4gPSAoc3RybGVuKCR0ZXJtKSA+ICRtYXhfdGVybV9sZW4pID8gc3RybGVuKCR0ZXJtKSA6ICRtYXhfdGVybV9sZW47DQoJCQkJCWlmIChzdHJsZW4oJHRlcm0pIDwgJG1pbl93b3JkX2xlbmd0aCkgew0KCQkJCQkJY29udGludWU7DQoJCQkJCX0NCgkJCQkJJHRlcm0gPSAoJGNhc2Vfc2Vuc2l0aXZlKSA/ICR0ZXJtIDogc3RydG9sb3dlcigkdGVybSk7DQoJCQkJCWlmICgkZGVidWcgPiAyKSB7DQoJCQkJCQllY2hvICR0ZXJtIC4gIiAiOw0KCQkJCQl9DQoJCQkJCWlmICgkZGlzdCA8ICRzaG9ydGVzdERpc3QpIHsNCgkJCQkJCSRzaG9ydGVzdERpc3QgPSAkZGlzdDsNCgkJCQkJCSRjbG9zZXN0V29yZCA9ICR0ZXJtOw0KCQkJCQl9DQoJCQkJCWlmICgkbWV0YV9zZWFyY2ggIT0gIiIpIHsNCgkJCQkJCSRtZXRhX3Rlcm0gPSBtZXRhcGhvbmUoJHRlcm0pOw0KCQkJCQkJaWYgKCRkZWJ1ZyA+IDIpIHsNCgkJCQkJCQllY2hvICRtZXRhX3Rlcm0gLiAiIDogIiAuICRtZXRhX3NlYXJjaCAuIiAiLm47DQoJCQkJCQl9DQoJCQkJCQkkbGV2RGlzdCA9IGxldmVuc2h0ZWluKCRtZXRhX3NlYXJjaCwgJG1ldGFfdGVybSk7DQoJCQkJCQlpZiAoJGxldkRpc3QgPD0gJHNob3J0ZXN0TWV0YURpc3QgfHwgJHNob3J0ZXN0TWV0YURpc3QgPCAwKSB7DQoJCQkJCQkJJHNob3J0ZXN0TWV0YURpc3QgPSAkbGV2RGlzdDsNCgkJCQkJCQkkY2xvc2VzdE1ldGFXb3JkICA9ICR0ZXJtOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfQ0KCQkJCS8vIFBpY2sgdGhlIG9uZSB0aGF0IHNvdW5kcyBjbG9zZXN0IHRvIHRoZSBvcmlnaW5hbA0KCQkJCWlmICh0cmltKCRjbG9zZXN0V29yZCkgIT0gIiIpIHsNCgkJCQkJJGlkeCA9IG1kNSgkY2xvc2VzdFdvcmQpOw0KCQkJCQkkYmVzdEZpdCA9ICRjbG9zZXN0V29yZDsNCgkJCQkJJGJlc3REaXN0ID0gJHNob3J0ZXN0RGlzdDsNCgkJCQkJaWYgKCRzb3VuZF9zZWFyY2ggIT0gIiIpIHsNCgkJCQkJCSRzb3VuZDEgPSBsZXZlbnNodGVpbihzb3VuZGV4KCRjbG9zZXN0V29yZCksICRzb3VuZF9zZWFyY2gpOw0KCQkJCQkJJHNvdW5kMiA9IGxldmVuc2h0ZWluKHNvdW5kZXgoJGNsb3Nlc3RNZXRhV29yZCksICRzb3VuZF9zZWFyY2gpOw0KCQkJCQkJaWYgKCRzb3VuZDEgPj0gJHNvdW5kMikgew0KCQkJCQkJCSRpZHggPSBtZDUoJGNsb3Nlc3RNZXRhV29yZCk7DQoJCQkJCQkJJGJlc3RGaXQgPSAkY2xvc2VzdE1ldGFXb3JkOw0KCQkJCQkJCSRiZXN0RGlzdCA9ICRzaG9ydGVzdE1ldGFEaXN0Ow0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJCSR3b3JkTGlzdFskaWR4XSA9ICRiZXN0Rml0Ow0KCQkJCQkkd29yZERpc3RbJGlkeF0gPSAkYmVzdERpc3Q7DQoJCQkJfQ0KCQkJCWlmICgkZGVidWcgPiAyKSB7DQoJCQkJCWRtcCgiQkVTVEZJVDoiIC4kYmVzdEZpdCk7DQoJCQkJfQ0KDQoJCQkJLy8gQnVpbGQgYW4gYXJyYXkgb2YgdW5pcXVlIG1hdGNoaW5nIGFydGljbGVzDQoJCQkJaWYgKCRtYXhfdGVybV9sZW4gPj0gJG1pbl93b3JkX2xlbmd0aCkgew0KCQkJCQlpZiAoaW5fYXJyYXkoInRleHRwYXR0ZXJuIiwgJGRiVGFibGVzKSkgew0KCQkJCQkJcG9wdWxhdGVBcnRpY2xlRGF0YSgkcm93KTsNCgkJCQkJfQ0KCQkJCQkvLyBUZW1wb3JhcmlseSBhc3NpZ24gdGhlIGNsb3Nlc3QgbWF0Y2ggdG8gdGhlIHF1ZXJ5IHN0cmluZyBzbyB0aGF0DQoJCQkJCS8vIHRoZSBzZWFyY2hfcmVzdWx0X2V4Y2VycHQgY2FuIGhpbGlnaHQgdGhlIGZvdW5kIHdvcmRzDQoJCQkJCSRwcmV0ZXh0WydxJ10gPSAkdGVybTsNCgkJCQkJJGFydExpc3RbXSA9IHBhcnNlKCRvcGZvcm0pOw0KCQkJCQkkcHJldGV4dFsncSddID0gJHNlYXJjaF90ZXJtOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCQkvLyBTb3J0IHRoZSB3b3JkIGxpc3QgaW4gb3JkZXIgb2YgcmVsZXZhbmNlDQoJCWlmIChjb3VudCgkd29yZExpc3QpID4gMCkgew0KCQkJYXJyYXlfbXVsdGlzb3J0KCR3b3JkRGlzdCwkd29yZExpc3QpOw0KCQl9DQoNCgkJLy8gT3V0cHV0IHN0dWZmIHRvIHRoZSBwYWdlDQoJCSRvdXQgLj0gKCRsYWJlbHRhZyA9PSAiIikgPyAiIiA6ICI8IiAuJGxhYmVsdGFnLiI+IjsNCgkJJG91dCAuPSAkbm9fbWF0Y2hfbGFiZWw7DQoJCWlmIChjb3VudCgkd29yZExpc3QpID4gMCkgew0KCQkJJG91dCAuPSAoY291bnQoJHNob3dMaXN0KSA+IDApID8gJHN1Z2dlc3RfbGFiZWwgOiAiIjsNCg0KCQkJaWYgKGluX2FycmF5KCJ3b3JkcyIsICRzaG93TGlzdCkpIHsNCgkJCQkkY3RyID0gMDsNCgkJCQlmb3JlYWNoICgkd29yZExpc3QgYXMgJGl0ZW0pIHsNCgkJCQkJaWYgKGFycmF5X2tleV9leGlzdHMoIndvcmRzIiwgJGxpbWl0QnkpICYmICRjdHIgPj0gJGxpbWl0QnlbIndvcmRzIl0pIHsNCgkJCQkJCWJyZWFrOw0KCQkJCQl9DQoJCQkJCSRvdXQgLj0gJzxhIGhyZWY9Iicuc21kX2FkZFFTVmFyKCRwYWdldXJsLCdxJywkaXRlbSkuJyI+Jy4kaXRlbS4nPC9hPicubjsNCgkJCQkJJGN0cisrOw0KCQkJCX0NCgkJCX0NCgkJCSRvdXQgLj0gKCRsYWJlbHRhZyA9PSAiIikgPyAiIiA6ICI8LyIgLiRsYWJlbHRhZy4iPiI7DQoJCQlpZiAoaW5fYXJyYXkoImFydGljbGVzIiwgJHNob3dMaXN0KSkgew0KCQkJCSRjdHIgPSAwOw0KCQkJCWZvcmVhY2ggKCRhcnRMaXN0IGFzICRhcnQpIHsNCgkJCQkJaWYgKGFycmF5X2tleV9leGlzdHMoImFydGljbGVzIiwgJGxpbWl0QnkpICYmICRjdHIgPj0gJGxpbWl0QnlbImFydGljbGVzIl0pIHsNCgkJCQkJCWJyZWFrOw0KCQkJCQl9DQoJCQkJCSRvdXQgLj0gJGFydDsNCgkJCQkJJGN0cisrOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0NCglyZXR1cm4gJG91dDsNCn0iO3M6NDoidHlwZSI7czoxOiIwIjtzOjM6Im1kNSI7czozMjoiYjNiMTY0Zjc1MjU1ZjRhZDViN2JjMTZhOWZmYmU3YmEiO30=