# Name: smd_fuzzy_find v0.21 # Type: Client side plugin # Offers alternative spellings and/or close-matching articles from search terms. # Author: Stef Dawson # URL: http://stefdawson.com # Recommended load order: 5 # ..................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ..................................................................... YToxMTp7czo0OiJuYW1lIjtzOjE0OiJzbWRfZnV6enlfZmluZCI7czo2OiJhdXRob3IiO3M6 MTE6IlN0ZWYgRGF3c29uIjtzOjEwOiJhdXRob3JfdXJpIjtzOjIxOiJodHRwOi8vc3RlZmRh d3Nvbi5jb20iO3M6NzoidmVyc2lvbiI7czo0OiIwLjIxIjtzOjExOiJkZXNjcmlwdGlvbiI7 czo3ODoiT2ZmZXJzIGFsdGVybmF0aXZlIHNwZWxsaW5ncyBhbmQvb3IgY2xvc2UtbWF0Y2hp bmcgYXJ0aWNsZXMgZnJvbSBzZWFyY2ggdGVybXMuIjtzOjQ6ImhlbHAiO3M6MTQ5MDA6Ijxk aXYgaWQ9InNtZF9oZWxwIj4NCg0KCTxoMT5zbWRfZnV6enlfZmluZDwvaDE+DQoNCgk8cD5F dmVyIHdhbnRlZCA8c3BhbiBjbGFzcz0iY2FwcyI+VFhQPC9zcGFuPiYjODIxNztzIHNlYXJj aCBmYWNpbGl0eSB0byBiZSBhIGxpdHRsZSBtb3JlLCB3ZWxsLCBpbmFjY3VyYXRlPyBIZWxw IHBlb3BsZSB3aXRoIGZhdCBmaW5nZXJzIHRvIGZpbmQgd2hhdCB0aGV5IHdlcmUgYWN0dWFs bHkgbG9va2luZyBmb3Igd2l0aCB0aGlzIHRvb2wgdGhhdCBjYW4gZmluZCBtaXMtc3BlbGxl ZCBvciBsaWtlLXNvdW5kaW5nIHdvcmRzIGZyb20gc2VhcmNoIHJlc3VsdHMuPC9wPg0KDQoJ PHA+UmVzdWx0cyBhcmUgb3JkZXJlZCBieSBhcHByb3hpbWF0ZSByZWxldmFuY3kgYW5kIGl0 JiM4MjE3O3MgYXV0b21hdGljYWxseSBjb250ZXh0LXNlbnNpdGl2ZSBiZWNhdXNlIHRoZSBw b29sIG9mIHdvcmRzIGl0IGNvbXBhcmVzIGFnYWluc3QgYXJlIGZyb20geW91ciBzaXRlLiBP biBhIHpvbyB3ZWJzaXRlLCBzb21lb25lIHR5cGluZyBpbiAmIzgyMjA7bGlubyYjODIyMTsg d29uJiM4MjE3O3QgZ2V0IGFydGljbGVzIGFib3V0IGZsb29yaW5nIGJ1dCBtb3JlIGxpa2Vs eSBhcnRpY2xlcyBhYm91dCBsaW9ucywgd2hpY2ggaXMgd2hhdCB0aGV5IHJlYWxseSB3YW50 ZWQuIFdlIGhvcGUuPC9wPg0KDQoJPGgyPkZlYXR1cmVzPC9oMj4NCg0KCTx1bD4NCgkJPGxp PlNlYXJjaCBmb3Igc2ltaWxhcmx5IHNwZWxsZWQsIG9yIHNpbWlsYXIgc291bmRpbmcgd29y ZHMgKG1heSBiZSBzd2l0Y2hlZCBvbi9vZmYpPC9saT4NCgkJPGxpPkxpbWl0IHRoZSBzZWFy Y2ggdG8gYXJ0aWNsZSA8Y29kZT5zdGF0dXM8L2NvZGU+LCA8Y29kZT5zZWN0aW9uPC9jb2Rl PiBvciA8Y29kZT5jYXRlZ29yeTwvY29kZT4gdG8gc3BlZWQgdXAgcHJvY2VlZGluZ3M8L2xp Pg0KCQk8bGk+VHdlYWsgc2Vuc2l0aXZpdHkgdG8gZ2l2ZSBiZXR0ZXIgcmVzdWx0cyAobW9y ZSBzcGVjaWZpYywgbGVzcyBsaWtlbHkgdG8gZmluZCBhIG1hdGNoKSBvciBnZW5lcmFsIHJl c3VsdHMgKGxlc3Mgc3BlY2lmaWMsIG1heSBtYXRjaCBzdHVmZiB5b3UgZG9uJiM4MjE3O3Qg ZXhwZWN0KTwvbGk+DQoJCTxsaT5DYW4gb2ZmZXIgbGlua3MgdG8gZXhhY3Qgc2VhcmNoIHRl cm1zIGlmIHlvdSB3aXNoIChhIGJpdCBsaWtlIEdvb2dsZSYjODIxNztzICYjODIyMDtEaWQg eW91IG1lYW4gJiM4MjMwOyYjODIyMTspPC9saT4NCgkJPGxpPkRpc3BsYXkgbWF0Y2hpbmcg YXJ0aWNsZXMgdXNpbmcgYSBmb3JtL2NvbnRhaW5lci4gRGVmYXVsdCBpcyB0aGUgYnVpbHQt aW4gPGNvZGU+c2VhcmNoX3Jlc3VsdHM8L2NvZGU+IGZvcm08L2xpPg0KCQk8bGk+VW5sZXNz IG92ZXJyaWRkZW4gdXNpbmcgdGhlIDxjb2RlPm1hdGNoX3dpdGg8L2NvZGU+IGF0dHJpYnV0 ZSwgdGhlIFRpdGxlIGFuZCBCb2R5IHdpbGwgYmUgc2VhcmNoZWQuIEFsdGVybmF0aXZlbHks IGlmIHlvdSBoYXZlIHNldCB0aGUgc2VhcmNoIGxvY2F0aW9ucyB1c2luZyA8YSBocmVmPSJo dHRwOi8vZm9ydW0udGV4dHBhdHRlcm4uY29tL3ZpZXd0b3BpYy5waHA/aWQ9MjkwMzYiPndl dF9oYXlzdGFjazwvYT4gdGhlbiB0aG9zZSBwbGFjZXMgd2lsbCBiZSBzZWFyY2hlZCBpbnN0 ZWFkPC9saT4NCgk8L3VsPg0KDQoJPGgyPkF1dGhvcjwvaDI+DQoNCgk8cD48YSBocmVmPSJo dHRwOi8vc3RlZmRhd3Nvbi5jb20vY29tbWVudEZvcm0iPlN0ZWYgRGF3c29uPC9hPiwgd2l0 aCBub3RhYmxlIG1lbnRpb24gdG8gPGEgaHJlZj0iaHR0cDovL2Vsb25lbi5pa2kuZmkvY29k ZS9taXNjLW5vdGVzL2FwcHItc2VhcmNoLXBocC9pbmRleC5odG1sIj5KYXJubyBFbG9uZW48 L2E+IGZvciB0aGUgRnV6enkgRmluZCBhbGdvcml0aG0gd2hpY2ggJiM4MjEyOyB0byB0aGlz IGRheSAmIzgyMTI7IHJlbWFpbnMgbWVyZSB2b29kb28gdG8gbWUuPC9wPg0KDQoJPGgyPklu c3RhbGxhdGlvbiAvIFVuaW5zdGFsbGF0aW9uPC9oMj4NCg0KCTxwIGNsYXNzPSJyZXF1aXJl ZCI+UmVxdWlyZXMgVGV4dHBhdHRlcm4gNC4wLjcgYW5kIDxhIGhyZWY9Imh0dHA6Ly9zdGVm ZGF3c29uLmNvbS9kb3dubG9hZHMvc21kX2xpYl92MC4zMy50eHQiPnNtZF9saWIgdjAuMzM8 L2E+IG11c3QgYmUgaW5zdGFsbGVkIGFuZCBhY3RpdmF0ZWQuPC9wPg0KDQoJPHA+RG93bmxv YWQgdGhlIHBsdWdpbiBmcm9tIGVpdGhlciA8YSBocmVmPSJodHRwOi8vdGV4dHBhdHRlcm4u b3JnL3BsdWdpbnMvOTMyL3NtZF9mdXp6eV9maW5kIj50ZXh0cGF0dGVybi5vcmc8L2E+LCBv ciB0aGUgPGEgaHJlZj0iaHR0cDovL3N0ZWZkYXdzb24uY29tL3N3Ij5zb2Z0d2FyZSBwYWdl PC9hPiwgcGFzdGUgdGhlIGNvZGUgaW50byB0aGUgPHNwYW4gY2xhc3M9ImNhcHMiPlRYUDwv c3Bhbj4gQWRtaW4gLSZndDsgUGx1Z2lucyBwYW5lLCBpbnN0YWxsIGFuZCBlbmFibGUgdGhl IHBsdWdpbi4gVmlzaXQgdGhlIDxhIGhyZWY9Imh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5j b20vdmlld3RvcGljLnBocD9pZD0yNTM2NyI+Zm9ydW0gdGhyZWFkPC9hPiBmb3IgbW9yZSBp bmZvIG9yIHRvIHJlcG9ydCBvbiB0aGUgc3VjY2VzcyBvciBvdGhlcndpc2Ugb2YgdGhlIHBs dWdpbi48L3A+DQoNCgk8cD5UbyB1bmluc3RhbGwsIHNpbXBseSBkZWxldGUgZnJvbSB0aGUg QWRtaW4gLSZndDsgUGx1Z2lucyBwYWdlLjwvcD4NCg0KCTxoMj5Vc2FnZTwvaDI+DQoNCgk8 cD5UaGUgcGx1Z2luIGlzIDxzdHJvbmc+bm90PC9zdHJvbmc+IGEgcmVwbGFjZW1lbnQgZm9y IHRoZSBidWlsdC1pbiA8c3BhbiBjbGFzcz0iY2FwcyI+VFhQPC9zcGFuPiBzZWFyY2g7IGl0 IHNob3VsZCBiZSB1c2VkIHRvIGF1Z21lbnQgaXQsIGxpa2UgdGhpczo8L3A+DQoNCjxwcmUg Y2xhc3M9ImJsb2NrIj48Y29kZSBjbGFzcz0iYmxvY2siPiZsdDt0eHA6aWZfc2VhcmNoJmd0 Ow0KICAmbHQ7ZGwgY2xhc3M9JnF1b3Q7cmVzdWx0cyZxdW90OyZndDsNCiAgICAmbHQ7dHhw OmNoaF9pZl9kYXRhJmd0Ow0KICAgICAgJmx0O3R4cDphcnRpY2xlIGxpbWl0PSZxdW90Ozgm cXVvdDsgc2VhcmNoZm9ybT0mcXVvdDtleGNlcnB0cyZxdW90OyAvJmd0Ow0KICAgICZsdDt0 eHA6ZWxzZSAvJmd0Ow0KICAgICAgJmx0O3R4cDpzbWRfZnV6enlfZmluZCBmb3JtPSZxdW90 O2V4Y2VycHRzJnF1b3Q7IC8mZ3Q7DQogICAgJmx0Oy90eHA6Y2hoX2lmX2RhdGEmZ3Q7DQog ICZsdDsvZGwmZ3Q7DQombHQ7L3R4cDppZl9zZWFyY2gmZ3Q7DQo8L2NvZGU+PC9wcmU+DQoN Cgk8cD5FeGFjdCBtYXRjaGVzIHdpbGwgYmUgcHJvY2Vzc2VkIGFzIG5vcm1hbCBidXQgbWlz bWF0Y2hlcyB3aWxsIGJlIGhhbmRsZWQgYnkgc21kX2Z1enp5X2ZpbmQuIElmIHlvdSB0cnkg dG8gdXNlIHNtZF9mdXp6eV9maW5kIG9uIGl0cyBvd24sIHlvdSB3aWxsIGxpa2VseSByZWNl aXZlIGEgd2FybmluZyBhYm91dCBhIG1pc3NpbmcgPGNvZGU+Jmx0O3R4cDphcnRpY2xlIC8m Z3Q7PC9jb2RlPiB0YWcuPC9wPg0KDQoJPGgzIGNsYXNzPSJ0YWciPkF0dHJpYnV0ZXM8L2gz Pg0KDQoJPHRhYmxlPg0KCQk8dHI+DQoJCQk8dGg+QXR0cmlidXRlIG5hbWUgPC90aD4NCgkJ CTx0aD5EZWZhdWx0IDwvdGg+DQoJCQk8dGg+VmFsdWVzIDwvdGg+DQoJCQk8dGg+RGVzY3Jp cHRpb24gPC90aD4NCgkJPC90cj4NCgkJPHRyPg0KCQkJPHRkPiBzZWFyY2hfdGVybSA8L3Rk Pg0KCQkJPHRkPiA8Y29kZT4/cTwvY29kZT4gPC90ZD4NCgkJCTx0ZD4gPGNvZGU+P3E8L2Nv ZGU+IG9yIGFueSB0ZXh0IDwvdGQ+DQoJCQk8dGQ+IFlvdSBtYXkgdXNlIGEgZml4ZWQgc3Ry aW5nIGhlcmUgYnV0IGl0JiM4MjE3O3MgcmF0aGVyIHBvaW50bGVzcyA8L3RkPg0KCQk8L3Ry Pg0KCQk8dHI+DQoJCQk8dGQ+IG1hdGNoX3dpdGggPC90ZD4NCgkJCTx0ZD4gPGNvZGU+YXJ0 aWNsZTpib2R5O3RpdGxlPC9jb2RlPiBvciB3ZXRfaGF5c3RhY2sgY3JpdGVyaWEgPC90ZD4N CgkJCTx0ZD4gPGNvZGU+a2V5d29yZHM8L2NvZGU+IC8gPGNvZGU+Ym9keTwvY29kZT4gLyA8 Y29kZT5leGNlcnB0PC9jb2RlPiAvIDxjb2RlPmNhdGVnb3J5MTwvY29kZT4gLyA8Y29kZT5j YXRlZ29yeTI8L2NvZGU+IC8gPGNvZGU+c2VjdGlvbjwvY29kZT4gLyA8Y29kZT5pZDwvY29k ZT4gLyA8Y29kZT5hdXRob3JpZDwvY29kZT4gLyA8Y29kZT50aXRsZTwvY29kZT4gLyA8Y29k ZT5jdXN0b21fMTwvY29kZT4gLyBldGMgPC90ZD4NCgkJCTx0ZD4gV2hpY2ggYXJ0aWNsZSBm aWVsZHMgeW91IHdvdWxkIGxpa2UgdG8gbWF0Y2guIERlZmluZSB0aGUgb2JqZWN0IHlvdSB3 YW50IHRvIGxvb2sgaW4gKGN1cnJlbnRseSBvbmx5IDxjb2RlPmFydGljbGU8L2NvZGU+IGlz IHN1cHBvcnRlZCkgZm9sbG93ZWQgYnkgYSBjb2xvbiwgdGhlbiBhIGxpc3Qgb2Ygc2VtaS1j b2xvbiBzZXBhcmF0ZWQgcGxhY2VzIHRvIGxvb2sgPC90ZD4NCgkJPC90cj4NCgkJPHRyPg0K CQkJPHRkPiBzaG93IDwvdGQ+DQoJCQk8dGQ+IDxjb2RlPndvcmRzLCBhcnRpY2xlczwvY29k ZT4gPC90ZD4NCgkJCTx0ZD4gIDxjb2RlPndvcmRzLCBhcnRpY2xlczwvY29kZT4gLyA8Y29k ZT53b3JkczwvY29kZT4gLyA8Y29kZT5hcnRpY2xlczwvY29kZT4gPC90ZD4NCgkJCTx0ZD4g V2hldGhlciB0byBsaXN0IHRoZSBjbG9zZXN0IG1hdGNoaW5nIGFydGljbGVzLCB0aGUgY2xv c2VzdCBtYXRjaGluZyBzZWFyY2ggdGVybXMsIG9yIGJvdGggPC90ZD4NCgkJPC90cj4NCgkJ PHRyPg0KCQkJPHRkPiBzZWN0aW9uIDwvdGQ+DQoJCQk8dGQ+IDxlbT51bnNldDwvZW0+IChp LmUuIHNlYXJjaCB0aGUgd2hvbGUgc2l0ZSkgPC90ZD4NCgkJCTx0ZD4gYW55IHZhbGlkIHNl Y3Rpb24gY29udGFpbmluZyBhcnRpY2xlcyA8L3RkPg0KCQkJPHRkPiBMaW1pdCB0aGUgc2Vh cmNoIHRvIG9uZSBvciBtb3JlIHNlY3Rpb25zOyBnaXZlIGEgY29tbWEtc2VwYXJhdGVkIGxp c3QuIFlvdSBjYW4gdXNlIDxjb2RlPj9zPC9jb2RlPiBmb3IgdGhlIGN1cnJlbnQgc2VjdGlv biBvciA8Y29kZT4hczwvY29kZT4gZm9yIGFueXRoaW5nIGV4Y2VwdCB0aGUgY3VycmVudCBz ZWN0aW9uLCBvciB5b3UgY2FuIHJlYWQgdGhlIHZhbHVlIGZyb20gYW5vdGhlciBwYXJ0IG9m IHRoZSBhcnRpY2xlLCBhIGN1c3RvbSBmaWVsZCAvIHR4cDp2YXJpYWJsZSAvIHVybCB2YXJp YWJsZSA8L3RkPg0KCQk8L3RyPg0KCQk8dHI+DQoJCQk8dGQ+IGNhdGVnb3J5IDwvdGQ+DQoJ CQk8dGQ+IDxlbT51bnNldDwvZW0+IChpLmUuIHNlYXJjaCBhbGwgY2F0ZWdvcmllcykgPC90 ZD4NCgkJCTx0ZD4gYW55IHZhbGlkIGFydGljbGUgY2F0ZWdvcnkgPC90ZD4NCgkJCTx0ZD4g TGltaXQgdGhlIHNlYXJjaCB0byBvbmUgb3IgbW9yZSBjYXRlZ29yaWVzOyBnaXZlIGEgY29t bWEtc2VwYXJhdGVkIGxpc3QuIFlvdSBjYW4gdXNlIDxjb2RlPj9jPC9jb2RlPiBmb3IgdGhl IGN1cnJlbnQgZ2xvYmFsIGNhdGVnb3J5IG9yIDxjb2RlPiFjPC9jb2RlPiBmb3IgYWxsIGNh dHMgZXhjZXB0IHRoZSBjdXJyZW50IG9uZS4gTGlrZSA8Y29kZT5zZWN0aW9uPC9jb2RlPiB5 b3UgY2FuIHJlYWQgZnJvbSBvdGhlciBwbGFjZXMgdG9vIDwvdGQ+DQoJCTwvdHI+DQoJCTx0 cj4NCgkJCTx0ZD4gc3VibGV2ZWwgKGZvcm1lcmx5IDxlbT5zdWJjYXRzPC9lbT4pPC90ZD4N CgkJCTx0ZD4gPGNvZGU+MDwvY29kZT4gPC90ZD4NCgkJCTx0ZD4gaW50ZWdlciAvIDxjb2Rl PmFsbDwvY29kZT4gPC90ZD4NCgkJCTx0ZD4gTnVtYmVyIG9mIHN1YmNhdGVnb3J5IGxldmVs cyB0byB0cmF2ZXJzZS4gPGNvZGU+MDwvY29kZT4gPSB0b3AtbGV2ZWwgb25seTsgPGNvZGU+ MTwvY29kZT4gPSB0b3AgbGV2ZWwgKyBvbmUgc3ViLWxldmVsOyBhbmQgc28gb24gPC90ZD4N CgkJPC90cj4NCgkJPHRyPg0KCQkJPHRkPiBzdGF0dXMgPC90ZD4NCgkJCTx0ZD4gPGNvZGU+ bGl2ZSwgc3RpY2t5PC9jb2RlPiA8L3RkPg0KCQkJPHRkPiA8Y29kZT5saXZlPC9jb2RlPiAv IDxjb2RlPnN0aWNreTwvY29kZT4gLyA8Y29kZT5oaWRkZW48L2NvZGU+IC8gPGNvZGU+cGVu ZGluZzwvY29kZT4gLyA8Y29kZT5kcmFmdDwvY29kZT4gb3IgYW55IGNvbWJpbmF0aW9uIDwv dGQ+DQoJCQk8dGQ+IFJlc3RyaWN0cyB0aGUgc2VhcmNoIHRvIHBhcnRpY3VsYXIgdHlwZXMg b2YgZG9jdW1lbnQgc3RhdHVzIDwvdGQ+DQoJCTwvdHI+DQoJCTx0cj4NCgkJCTx0ZD4gdG9s ZXJhbmNlIDwvdGQ+DQoJCQk8dGQ+IDxjb2RlPjI8L2NvZGU+IDwvdGQ+DQoJCQk8dGQ+IDAg JiM4MjExOyA1IDwvdGQ+DQoJCQk8dGQ+IEhvdyBmdXp6eSB0aGUgc2VhcmNoIGlzIGFuZCBo b3cgbG9uZyB0aGUgbWluaW11bSBzZWFyY2ggdGVybSBpcyBhbGxvd2VkIHRvIGJlLiAwIG1l YW5zIGEgdmVyeSBjbG9zZSBtYXRjaCwgdGhhdCBhbGxvd3Mgc2hvcnQgc2VhcmNoIHdvcmRz LiA1IG1lYW5zIGl0JiM4MjE3O3MgcXVpdGUgcmVsYXhlZCBhbmQgaXMgbGlrZWx0IHJldHVy biBub3RoaW5nIGxpa2Ugd2hhdCB5b3Ugc2VhcmNoZWQgZm9yOyBzZWFyY2ggd29yZHMgbXVz dCB0aGVuIGJlIGxvbmdlciwgcm91Z2hseSAmZ3Q7NyBjaGFyYWN0ZXJzLiBQcmFjdGljYWwg dmFsdWVzIGFyZSAwLTMgPC90ZD4NCgkJPC90cj4NCgkJPHRyPg0KCQkJPHRkPiByZWZpbmUg IDwvdGQ+DQoJCQk8dGQ+IDxjb2RlPnNvdW5kZXgsIG1ldGFwaG9uZTwvY29kZT4gPC90ZD4N CgkJCTx0ZD4gPGNvZGU+c291bmRleDwvY29kZT4sIDxjb2RlPm1ldGFwaG9uZTwvY29kZT4g b3IgPGNvZGU+c291bmRleCwgbWV0YXBob25lPC9jb2RlPiA8L3RkPg0KCQkJPHRkPiBTd2l0 Y2ggb24gc291bmRleCBhbmQvb3IgbWV0YXBob25lIHN1cHBvcnQgZm9yIHBvdGVudGlhbGx5 IGJldHRlciBtYXRjaGluZyAodGhvdWdoIGl0JiM4MjE3O3MgdXN1YWxseSBvbmx5IG9mIHVz ZSBpbiBFbmdsaXNoKSA8L3RkPg0KCQk8L3RyPg0KCQk8dHI+DQoJCQk8dGQ+IGNhc2Vfc2Vu c2l0aXZlIDwvdGQ+DQoJCQk8dGQ+IDxjb2RlPjA8L2NvZGU+IDwvdGQ+DQoJCQk8dGQ+IDxj b2RlPjA8L2NvZGU+IChvZmYpIC8gPGNvZGU+MTwvY29kZT4gKGNhc2Utc2Vuc2l0aXZlKSA8 L3RkPg0KCQkJPHRkPiBEb2VzIHdoYXQgaXQgc2F5cyBvbiB0aGUgdGluIDwvdGQ+DQoJCTwv dHI+DQoJCTx0cj4NCgkJCTx0ZD4gbWluX3dvcmRfbGVuZ3RoIDwvdGQ+DQoJCQk8dGQ+IDxj b2RlPjQ8L2NvZGU+IDwvdGQ+DQoJCQk8dGQ+IGludGVnZXIgPC90ZD4NCgkJCTx0ZD4gVGhl IG1pbmltdW0gd29yZCBsZW5ndGggYWxsb3dlZCBpbiB0aGUgc2VhcmNoIHJlc3VsdHMgPC90 ZD4NCgkJPC90cj4NCgkJPHRyPg0KCQkJPHRkPiBsaW1pdCA8L3RkPg0KCQkJPHRkPiA8Y29k ZT53b3Jkczo1LCBhcnRpY2xlczoxMDwvY29kZT4gPC90ZD4NCgkJCTx0ZD4gaW50ZWdlciAv IDxjb2RlPndvcmRzOjwvY29kZT4gKyBhIG51bWJlciAvIDxjb2RlPmFydGljbGVzOjwvY29k ZT4gKyBhIG51bWJlciA8L3RkPg0KCQkJPHRkPiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygd29y ZHMgYW5kL29yIGFydGljbGVzIHRvIGRpc3BsYXkgaW4gdGhlIHJlc3VsdHMuIFVzZSBhIHNp bmdsZSBpbnRlZ2VyIHRvIGxpbWl0IGJvdGggdG8gdGhlIHNhbWUgdmFsdWUuIFNwZWNpZnkg PGNvZGU+YXJ0aWNsZXM6NTwvY29kZT4gdG8gcmVtb3ZlIGFueSBsaW1pdCBvbiB0aGUgbnVt YmVyIG9mIGFsdGVybmF0aXZlIHNlYXJjaCB3b3JkcyBvZmZlcmVkLCBhbmQgbGltaXQgdGhl IG51bWJlciBvZiByZXR1cm5lZCBhcnRpY2xlcyB0byBhIG1heGltdW0gb2YgNS4gU2ltaWxh cmx5LCA8Y29kZT53b3Jkczo0PC9jb2RlPiB3aWxsIHJlbW92ZSB0aGUgYXJ0aWNsZSBsaW1p dCwgYnV0IG9ubHkgc2hvdyBhIG1heGltdW0gb2YgNCBhbHRlcm5hdGl2ZSB3b3Jkcy4gQm90 aCBvZiB0aGVzZSBhcmUgc3ViamVjdCB0byB0aGVpciByZXNwZWN0aXZlIDxjb2RlPnNob3c8 L2NvZGU+IG9wdGlvbnMgYmVpbmcgc2V0IDwvdGQ+DQoJCTwvdHI+DQoJCTx0cj4NCgkJCTx0 ZD4gZm9ybSA8L3RkPg0KCQkJPHRkPiA8Y29kZT5zZWFyY2hfcmVzdWx0czwvY29kZT4gPC90 ZD4NCgkJCTx0ZD4gYW55IHZhbGlkIGZvcm0gbmFtZSA8L3RkPg0KCQkJPHRkPiBUaGUgPHNw YW4gY2xhc3M9ImNhcHMiPjxzcGFuIGNsYXNzPSJjYXBzIj5UWFA8L3NwYW4+PC9zcGFuPiBm b3JtIHdpdGggd2hpY2ggdG8gcHJvY2VzcyBlYWNoIG1hdGNoaW5nIGFydGljbGUuIFlvdSBt YXkgYWxzbyB1c2UgdGhlIHBsdWdpbiBhcyBhIGNvbnRhaW5lci4gTm90ZSB0aGF0IDxjb2Rl PiZsdDt0eHA6c2VhcmNoX3Jlc3VsdF9leGNlcnB0IC8mZ3Q7PC9jb2RlPiBpcyBob25vdXJl ZCBhcyBjbG9zZWx5IGFzIHBvc3NpYmxlLCBpLmUuIGlmIHRoZSBjbG9zZXN0IHdvcmRzIGFy ZSBmb3VuZCBpbiB0aGUga2V5d29yZHMsIGJvZHkgb3IgZXhjZXJwdCBmaWVsZHMuIElmIHRo ZXkgYXJlIGZvdW5kIGluIGFueSBvdGhlciBsb2NhdGlvbiAoZS5nLiBjdXN0b21fMykgdGhl IGFydGljbGUgdGl0bGUgd2lsbCBiZSByZXR1cm5lZCBidXQgdGhlIHNlYXJjaF9yZXN1bHRf ZXhjZXJwdCB3aWxsIGxpa2VseSBiZSBlbXB0eS4gVGhpcyBpcyBhIGxpbWl0YXRpb24gb2Yg dGhhdCB0YWcsIG5vdCB0aGUgcGx1Z2luIGRpcmVjdGx5IDwvdGQ+DQoJCTwvdHI+DQoJCTx0 cj4NCgkJCTx0ZD4gZGVsaW0gPC90ZD4NCgkJCTx0ZD4gPGNvZGU+LDwvY29kZT4gPC90ZD4N CgkJCTx0ZD4gYW55IGNoYXJhY3RlcnMgPC90ZD4NCgkJCTx0ZD4gQ2hhbmdlIHRoZSBkZWxp bWl0ZXIgZm9yIGFsbCBvcHRpb25zIHRoYXQgdGFrZSBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0 IDwvdGQ+DQoJCTwvdHI+DQoJCTx0cj4NCgkJCTx0ZD4gbm9fbWF0Y2hfbGFiZWwgPC90ZD4N CgkJCTx0ZD4gPHNwYW4gY2xhc3M9ImNhcHMiPjxzcGFuIGNsYXNzPSJjYXBzIj5NTFA8L3Nw YW4+PC9zcGFuPjogPGNvZGU+bm9fbWF0Y2g8L2NvZGU+IDwvdGQ+DQoJCQk8dGQ+IGFueSB0 ZXh0IG9yIDxzcGFuIGNsYXNzPSJjYXBzIj48c3BhbiBjbGFzcz0iY2FwcyI+TUxQPC9zcGFu Pjwvc3Bhbj4gc3RyaW5nIDwvdGQ+DQoJCQk8dGQ+IFRoZSBwaHJhc2UgdG8gZGlzcGxheSB3 aGVuIG5vIG1hdGNoZXMgKG1heWJlIG5vdCBldmVuIGZ1enp5IG9uZXMpIGFyZSBmb3VuZC4g VXNlIDxjb2RlPm5vX21hdGNoX2xhYmVsPSZxdW90OyZxdW90OzwvY29kZT4gdG8gdHVybiBp dCBvZmYgPC90ZD4NCgkJPC90cj4NCgkJPHRyPg0KCQkJPHRkPiBzdWdnZXN0X2xhYmVsIDwv dGQ+DQoJCQk8dGQ+IDxzcGFuIGNsYXNzPSJjYXBzIj48c3BhbiBjbGFzcz0iY2FwcyI+TUxQ PC9zcGFuPjwvc3Bhbj46IDxjb2RlPnN1Z2dlc3Q8L2NvZGU+IDwvdGQ+DQoJCQk8dGQ+IGFu eSB0ZXh0IG9yIDxzcGFuIGNsYXNzPSJjYXBzIj48c3BhbiBjbGFzcz0iY2FwcyI+TUxQPC9z cGFuPjwvc3Bhbj4gc3RyaW5nIDwvdGQ+DQoJCQk8dGQ+IFRoZSBwaHJhc2UgdG8gZGlzcGxh eSBpbW1lZGlhdGVseSBwcmlvciB0byBzaG93aW5nIGNsb3NlLW1hdGNoaW5nIGFydGljbGVz L3dvcmRzLiBVc2UgPGNvZGU+c3VnZ2VzdF9sYWJlbD0mcXVvdDsmcXVvdDs8L2NvZGU+IHRv IHN3aXRjaCBpdCBvZmYgPC90ZD4NCgkJPC90cj4NCgkJPHRyPg0KCQkJPHRkPiB0b29fc2hv cnRfbGFiZWwgPC90ZD4NCgkJCTx0ZD4gPHNwYW4gY2xhc3M9ImNhcHMiPjxzcGFuIGNsYXNz PSJjYXBzIj5NTFA8L3NwYW4+PC9zcGFuPjogPGNvZGU+dG9vX3Nob3J0PC9jb2RlPiA8L3Rk Pg0KCQkJPHRkPiBhbnkgdGV4dCBvciA8c3BhbiBjbGFzcz0iY2FwcyI+PHNwYW4gY2xhc3M9 ImNhcHMiPk1MUDwvc3Bhbj48L3NwYW4+IHN0cmluZyAgPC90ZD4NCgkJCTx0ZD4gU2VhcmNo ZXMgb2YgdW5kZXIgYWJvdXQgMyBjaGFyYWN0ZXJzIChzb21ldGltZXMgbW9yZSBkZXBlbmRp bmcgb24geW91ciBjb250ZW50KSBhcmUgdG9vIHNob3J0IGZvciBhbnkgcmVhc29uYWJsZSBm dXp6aW5lc3MgdG8gYmUgYXBwbGllZC4gVGhpcyBtZXNzYWdlIGlzIGRpc3BsYXllZCBpbiB0 aGF0IGNpcmN1bXN0YW5jZS4gVXNlIDxjb2RlPnRvb19zaG9ydF9sYWJlbD0mcXVvdDsmcXVv dDs8L2NvZGU+IHRvIHN3aXRjaCBpdCBvZmYgPC90ZD4NCgkJPC90cj4NCgkJPHRyPg0KCQkJ PHRkPiBsYWJlbHRhZyA8L3RkPg0KCQkJPHRkPiA8Y29kZT5wPC9jb2RlPiA8L3RkPg0KCQkJ PHRkPiBhbnkgdmFsaWQgdGFnIG5hbWUsIHdpdGhvdXQgaXRzIGJyYWNrZXRzIDwvdGQ+DQoJ CQk8dGQ+IFRoZSAoWClIVE1MIHRhZyBpbiB3aGljaCB0byB3cmFwIGFueSBsYWJlbHMgPC90 ZD4NCgkJPC90cj4NCgk8L3RhYmxlPg0KDQoJPGgyPlRpcHMgYW5kIHRyaWNrczwvaDI+DQoN Cgk8dWw+DQoJCTxsaT5JZiB5b3UgY2FuLCBsaW1pdCB0aGUgc2VhcmNoIGNyaXRlcmlhIHVz aW5nIDxjb2RlPnN0YXR1czwvY29kZT4sIDxjb2RlPnNlY3Rpb248L2NvZGU+IGFuZCA8Y29k ZT5jYXRlZ29yeTwvY29kZT4gdG8gaW1wcm92ZSBwZXJmb3JtYW5jZTwvbGk+DQoJCTxsaT5U d2VhayB0aGUgPGNvZGU+cmVmaW5lPC9jb2RlPiBvcHRpb25zIHRvIHNlZSBpZiB5b3UgZ2V0 IGJldHRlciBvciB3b3JzZSByZXN1bHRzIGZvciB5b3VyIGNvbnRlbnQgLyBsYW5ndWFnZTwv bGk+DQoJCTxsaT5Nb3N0IG9mIHRoZSBkZWZhdWx0IHZhbHVlcyBhcmUgb3B0aW1hbCBmb3Ig Z29vZCByZXN1bHRzLCBidXQgZm9yIHNjaWVudGlmaWMgb3Igc3BlY2lhbGlzdCBzaXRlcyB5 b3UgbWF5IHdpc2ggdG8gaW5jcmVhc2UgdGhlIDxjb2RlPnRvbGVyYW5jZTwvY29kZT4gYW5k IDxjb2RlPm1pbl93b3JkX2xlbmd0aDwvY29kZT4gdG8gYXZvaWQgZmFsc2UgcG9zaXRpdmVz PC9saT4NCgkJPGxpPkZvciBvZmZlcmluZyBhbiBhZHZhbmNlZCBzZWFyY2ggZmFjaWxpdHks IHdyaXRlIGFuIDxzcGFuIGNsYXNzPSJjYXBzIj5IVE1MPC9zcGFuPiBmb3JtIHRoYXQgYWxs b3dzIHBlb3BsZSB0byBjdXN0b21pc2UgdGhlIHNlYXJjaCBjcml0ZXJpYSAoZS5nLiBjaGVj ayBib3hlcyBmb3IgPGNvZGU+bWV0YXBob25lPC9jb2RlPiAvIDxjb2RlPnNvdW5kZXggLyBj YXNlX3NlbnNpdGl2ZTwvY29kZT4gOyB0ZXh0IGJveGVzIGZvciA8Y29kZT50b2xlcmFuY2U8 L2NvZGU+IC8gPGNvZGU+bWluX3dvcmRfbGVuZ3RoPC9jb2RlPiAvIDxjb2RlPmxpbWl0PC9j b2RlPiA7IHNlbGVjdCBsaXN0cyBvZiBjYXRlZ29yaWVzIHRvIHNlYXJjaCA7IGV0YykuIFRo ZW4gdXNlIGEgc2VyaWVzIG9mIHNtZF9pZiBzdGF0ZW1lbnRzIGluc2lkZSB5b3VyIDxjb2Rl PiZsdDt0eHA6aWZfc2VhcmNoIC8mZ3Q7PC9jb2RlPiB0byBjaGVjayBmb3IgdGhlIGV4aXN0 ZW5jZSBvZiBlYWNoIDxzcGFuIGNsYXNzPSJjYXBzIj5VUkw8L3NwYW4+IHZhcmlhYmxlLCBj aGVjayB0aGV5IGhhdmUgYWNjZXB0YWJsZSB2YWx1ZXMgYW5kIHRoZW4gcGx1ZyB0aGVtIGlu dG8gdGhlIHNtZF9mdXp6eV9maW5kIHRhZyB1c2luZyByZXBsYWNlbWVudHMgc3VjaCBhcyA8 Y29kZT50b2xlcmFuY2U9JnF1b3Q7e3NtZF9pZl90b2xlcmFuY2V9JnF1b3Q7PC9jb2RlPjwv bGk+DQoJPC91bD4NCg0KCTxoMj5Lbm93biBpc3N1ZXM8L2gyPg0KDQoJPHVsPg0KCQk8bGk+ U2xvdyB3aXRoIGxhcmdlIGFydGljbGUgc2V0czwvbGk+DQoJCTxsaT5TZWFyY2hpbmcgZm9y IGEgd29yZCB3aXRoIGFuIGFwb3N0cm9waGUgaW4gaXQgbWF5IGNhdXNlIG9kZCBjaGFyYWN0 ZXIgZW5jb2Rpbmcgb3IgaW5jb21wbGV0ZSByZXN1bHRzPC9saT4NCgkJPGxpPlNlYXJjaGlu ZyBmb3IgbXVsdGlwbGUgKHNwYWNlLXNlcGFyYXRlZCkgd29yZHMgY2FuIGxlYWQgdG8gb2Rk IHJlc3VsdHM8L2xpPg0KCQk8bGk+U29tZXRpbWVzIGl0IG1ha2VzIHlvdSBsYXVnaCBhbmQg cGlja3Mgc29tZXRoaW5nIHRoYXQgc2VlbXMgdG90YWxseSB1bnJlbGF0ZWQ8L2xpPg0KCTwv dWw+DQoNCgk8aDI+Q2hhbmdlbG9nPC9oMj4NCg0KCTx1bD4NCgkJPGxpPjI2IE1hciAwNyB8 IHYwLjAxIHwgSW5pdGlhbCBwdWJsaWMgYmV0YTwvbGk+DQoJCTxsaT4zMSBNYXIgMDcgfCB2 MC4wMiB8IEZpeGVkIGNhc2Ugc2Vuc2l0aXZpdHkgOyBzcGVkIHVwIGFuZCBpbXByb3ZlZCB3 b3JkbGlzdCBnZW5lcmF0aW9uIDsgYWRkZWQgPGNvZGU+cmVmaW5lPC9jb2RlPiB0byBzd2l0 Y2ggb2ZmIHNvdW5kZXgvbWV0YXBob25lIGlmIHJlcXVpcmVkPC9saT4NCgkJPGxpPjA2IEF1 ZyAwNyB8IHYwLjAzIHwgRml4ZWQ6IG11bHRpLXdvcmQgc2VhcmNoaW5nICg8Y29kZT5zbWRf Z2V0V29yZDwvY29kZT4gYnVnKSBhbmQgPGNvZGU+c2VhcmNoX3Jlc3VsdF9leGNlcnB0PC9j b2RlPiA7IGFkZGVkIDxjb2RlPmNhdGVnb3J5PC9jb2RlPiBhbmQgPGNvZGU+c3RhdHVzPC9j b2RlPiBzdXBwb3J0PC9saT4NCgkJPGxpPjMwIERlYyAwNyB8IHYwLjEgfCBPZmZpY2lhbCBm aXJzdCByZWxlYXNlLiBBZGRlZCA8Y29kZT5sYWJlbHRhZzwvY29kZT4gYW5kIGN1c3RvbSBm aWVsZCBzdXBwb3J0IDsgZml4ZWQgYmFkIGNvdW50aW5nIGluIDxjb2RlPmxpbWl0PC9jb2Rl PiBhdHRyaWJ1dGUgKHRoYW5rcyBFbHMpPC9saT4NCgkJPGxpPjIzIEphbiAwOCB8IHYwLjEx IHwgRml4ZWQ6IDxzcGFuIGNsYXNzPSJjYXBzIj5NTFA8L3NwYW4+aW5nIHNvbWUgc3RyaW5n cyBicm9rZSB0aGUgcGx1Z2luICh0aGFua3MgRWxzKTwvbGk+DQoJCTxsaT4wMSBBcHIgMDgg fCB2MC4xMiB8IE1vdmVkIHNvbWUgc21kX2xpYiBmdW5jdGlvbnMgdG8gdGhlIHBsdWdpbiA7 IHJlcXVpcmVzIHNtZF9saWJfdjAuMzI8L2xpPg0KCQk8bGk+MDIgRGVjIDA4IHwgdjAuMiB8 IFJlcXVpcmVzIHNtZF9saWIgdjAuMzMgOyB0ZW50YXRpdmUgdW5pY29kZSBzdXBwb3J0IDsg d2lsbCByZWFkIHNlYXJjaCBsb2NhdGlvbnMgc2V0IGJ5IHdldF9oYXlzdGFjayA7IGVuaGFu Y2VkIDxjb2RlPnN1YmNhdHM8L2NvZGU+IGFuZCByZW5hbWVkIGl0IDxjb2RlPnN1YmxldmVs PC9jb2RlPiA7IGFkZGVkIDxjb2RlPmRlbGltPC9jb2RlPiA7IGVuaGFuY2VkIGRlYnVnIG91 dHB1dCA7IHBsdWdpbiBjYW4gbm93IGJlIHVzZWQgYXMgYSBjb250YWluZXIgOyB0aWdodGVu ZWQgY29kZSwgZW5oYW5jZWQgPGNvZGU+PzwvY29kZT4gYW5kIDxjb2RlPiE8L2NvZGU+IHN1 cHBvcnQgOyBmaXhlZCBzbWRfZ2V0V29yZCAoYWdhaW4hKSBhbmQgZmllbGQgbGlzdCBidWc8 YnIgLz4NCjE5IERlYyAwOCB8IHYwLjIxIHwgRml4ZWQgPHNwYW4gY2xhc3M9ImNhcHMiPk1M UDwvc3Bhbj4gc3RyaW5nIGJ1ZzwvbGk+DQoJPC91bD4NCg0KCTxoMj5DcmVkaXRzPC9oMj4N Cg0KCTxwPlRoaXMgcGx1Z2luIHdvdWxkbiYjODIxNzt0IGhhdmUgZXhpc3RlZCB3aXRob3V0 IHRoZSBvcmlnaW5hbCBGdXp6eSBGaW5kIGFsZ29yaXRobSBieSBKYXJubyBFbG9uZW4sIGFz IG5vdGVkIGFib3ZlLiBBbGwga3Vkb3MgZ29lcyBpbiB0aGF0IGRpcmVjdGlvbi4gQWxzbywg ZXh0ZW5kZWQgdGhhbmtzIHRvIHRoZSBiZXRhIHRlc3RlcnMsIGVzcGVjaWFsbHkgRWxzIExl cGVsYWFycyBmb3IgZmVlZGJhY2sgYW5kIHVuZW5kaW5nIHBhdGllbmNlIGR1cmluZyBkZXZl bG9wbWVudC4gQW5kIG9mIGNvdXJzZSBUZWFtIFRleHRQYXR0ZXJuIGZvciB0aGUgYmVzdCA8 c3BhbiBjbGFzcz0iY2FwcyI+Q01TPC9zcGFuPiBvbiB0aGUgcGxhbmV0LjwvcD4NCg0KPC9k aXY+CjwhLS0gLS0tIEJFR0lOIFBMVUdJTiBDU1MgLS0tIC0tPgo8c3R5bGUgdHlwZT0idGV4 dC9jc3MiPg0KI3NtZF9oZWxwIHsgbGluZS1oZWlnaHQ6MS4zIDt9DQojc21kX2hlbHAgY29k ZSB7IGZvbnQtd2VpZ2h0OmJvbGQ7IGZvbnQ6IDEwNSUvMTMwJSAiQ291cmllciBOZXciLCBj b3VyaWVyLCBtb25vc3BhY2U7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGQ0M7fQ0KI3NtZF9o ZWxwIGNvZGUuYmxvY2sgeyBmb250LXdlaWdodDpub3JtYWw7IGJvcmRlcjoxcHggZG90dGVk ICM5OTk7IGJhY2tncm91bmQtY29sb3I6ICNmMGU2OGM7IGRpc3BsYXk6YmxvY2s7IG1hcmdp bjoxMHB4IDEwcHggMjBweDsgcGFkZGluZzoxMHB4OyB9DQojc21kX2hlbHAgYTpsaW5rLCAj c21kX2hlbHAgYTp2aXNpdGVkIHsgY29sb3I6IGJsdWU7IHRleHQtZGVjb3JhdGlvbjogbm9u ZTsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsdWU7IHBhZGRpbmctYm90dG9tOjFweDt9 DQojc21kX2hlbHAgYTpob3ZlciwgI3NtZF9oZWxwIGE6YWN0aXZlIHsgY29sb3I6IGJsdWU7 IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIGJsdWU7 IHBhZGRpbmctYm90dG9tOjFweDt9DQojc21kX2hlbHAgaDEgeyBjb2xvcjogIzM2OTsgZm9u dDogMjBweCBHZW9yZ2lhLCBzYW5zLXNlcmlmOyBtYXJnaW46IDA7IHRleHQtYWxpZ246IGNl bnRlcjsgfQ0KI3NtZF9oZWxwIGgyIHsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNr OyBwYWRkaW5nOjEwcHggMCAwOyBjb2xvcjogIzM2OTsgZm9udDogMTdweCBHZW9yZ2lhLCBz YW5zLXNlcmlmOyB9DQojc21kX2hlbHAgaDMgeyBjb2xvcjogIzY5MzsgZm9udDogYm9sZCAx MnB4IEFyaWFsLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMXB4OyBtYXJnaW46IDEw cHggMCAwO3RleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7fQ0KI3NtZF9oZWxwIGg0IHsgZm9u dDogYm9sZCAxMXB4IEFyaWFsLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMXB4OyBt YXJnaW46IDEwcHggMCAwIDt0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyB9DQojc21kX2hl bHAgLmF0bm0geyBmb250LXdlaWdodDpib2xkOyB9DQojc21kX2hlbHAgLnJlcXVpcmVkIHtj b2xvcjpyZWQ7fQ0KI3NtZF9oZWxwIHRhYmxlIHt3aWR0aDoxMDAlOyB0ZXh0LWFsaWduOmNl bnRlcjsgcGFkZGluZy1ib3R0b206MWVtO30NCiNzbWRfaGVscCB0ZCwgI3NtZF9oZWxwIHRo IHt2ZXJ0aWNhbC1hbGlnbjp0b3A7IGJvcmRlcjoycHggcmlkZ2UgI2NjYzsgcGFkZGluZzou NGVtOyB9DQo8L3N0eWxlPgo8IS0tIC0tLSBFTkQgUExVR0lOIENTUyAtLS0gLS0+IjtzOjQ6 ImNvZGUiO3M6MjI4Njg6InJlcXVpcmVfcGx1Z2luKCdzbWRfbGliJyk7DQoNCi8vIE1MUCBz dXBwb3J0DQpnbG9iYWwgJHNtZF9mdXp6TGFuZzsNCiRzbWRfZnV6el9zdHIgPSBhcnJheSgN CgkndG9vX3Nob3J0JyA9PiAnVGhlIHRleHQgeW91IGFyZSBzZWFyY2hpbmcgZm9yIGlzIHBy b2JhYmx5IHRvbyBzaG9ydC4gVHJ5IGEgbG9uZ2VyIHdvcmQuICcsDQoJJ25vX21hdGNoJyA9 PiAnU29ycnksIG5vIHJlc3VsdHMgbWF0Y2hlZCAie3NlYXJjaF90ZXJtfSIgZXhhY3RseS4g JywNCgknc3VnZ2VzdCcgPT4gJ0hlcmUgYXJlIHRoZSBjbG9zZXN0IG1hdGNoaW5nIHt0aGlu Z2llc30gdGhhdCBtYXkgaGVscCB5b3UgZmluZCB3aGF0IHlvdSBhcmUgbG9va2luZyBmb3I6 ICcsDQoJJ3N1Z2dlc3Rfam9pbicgPT4gJ2FuZCcsDQoJJ2FydGljbGVzJyA9PiAnYXJ0aWNs ZXMnLA0KCSd3b3JkcycgPT4gJ3dvcmRzJywNCik7DQokc21kX2Z1enpMYW5nID0gbmV3IHNt ZF9NTFAoJ3NtZF9mdXp6eV9maW5kJywgJ3NtZF9mdXp6JywgJHNtZF9mdXp6X3N0cik7DQoN CmZ1bmN0aW9uIHNtZF9mdXp6eV9maW5kKCRhdHRzLCAkdGhpbmc9JycpIHsNCglnbG9iYWwg JHByZXRleHQsICRzbWRfZnV6ekxhbmcsICRwcmVmczsNCg0KCWV4dHJhY3QobEF0dHMoYXJy YXkoDQoJCSdmb3JtJyA9PiAnc2VhcmNoX3Jlc3VsdHMnLA0KCQknc2VjdGlvbicgPT4gJycs DQoJCSdjYXRlZ29yeScgPT4gJycsDQoJCSdzdWJsZXZlbCcgPT4gJzAnLA0KCQknc2VhcmNo X3Rlcm0nID0+ICc/cScsDQoJCSdtYXRjaF93aXRoJyA9PiAnJywNCgkJJ3RvbGVyYW5jZScg PT4gJzInLA0KCQknbWluX3dvcmRfbGVuZ3RoJyA9PiAnNCcsDQoJCSdkZWxpbScgPT4gJywn LA0KCQknbGltaXQnID0+ICcnLA0KCQknY2FzZV9zZW5zaXRpdmUnID0+ICcwJywNCgkJJ3Jl ZmluZScgPT4gJycsDQoJCSdzaG93JyA9PiAnJywNCgkJJ3N0YXR1cycgPT4gJycsDQoJCSdk ZWJ1ZycgPT4gJzAnLA0KCQknbm9fbWF0Y2hfbGFiZWwnID0+ICcjJywNCgkJJ3N1Z2dlc3Rf bGFiZWwnID0+ICcjJywNCgkJJ3Rvb19zaG9ydF9sYWJlbCcgPT4gJyMnLA0KCQknbGFiZWx0 YWcnID0+ICdwJywNCgkpLCAkYXR0cykpOw0KDQoJLy8gUHJvY2VzcyBkZWZhdWx0czsgbW9z dCBjYW4ndCBiZSBzZXQgaW4gbEF0dHMoKSBiZWNhdXNlIG9mIHRoZSBjdXN0b20gZGVsaW1p dGVyDQoJJG1hdGNoX3dpdGggPSBlbXB0eSgkbWF0Y2hfd2l0aCkgPyAiYXJ0aWNsZToiIC4g aW1wbG9kZSgiOyIsIGRvX2xpc3QoJHByZWZzWydzZWFyY2hhYmxlX2FydGljbGVfZmllbGRz J10pKSA6ICRtYXRjaF93aXRoOw0KCSRsaW1pdCA9ICgkbGltaXQpID8gJGxpbWl0IDogIndv cmRzOjUiIC4kZGVsaW0uICJhcnRpY2xlczoxMCI7DQoJJHJlZmluZSA9ICgkcmVmaW5lKSA/ ICRyZWZpbmUgOiAibWV0YXBob25lIiAuJGRlbGltLiAic291bmRleCI7DQoJJHNob3cgPSAo JHNob3cpID8gJHNob3cgOiAid29yZHMiIC4kZGVsaW0uICJhcnRpY2xlcyI7DQoJJHN0YXR1 cyA9ICgkc3RhdHVzKSA/ICRzdGF0dXMgOiAibGl2ZSIgLiRkZWxpbS4gInN0aWNreSI7DQoN CgkkcmVmaW5lQWxsb3cgPSBhcnJheSgibWV0YXBob25lIiwgInNvdW5kZXgiKTsNCgkkc2hv d0FsbG93ID0gYXJyYXkoImFydGljbGVzIiwgIndvcmRzIik7DQoJJGNvbE5hbWVzID0gYXJy YXkoJ0tleXdvcmRzJyA9PiAiYXJ0aWNsZTprZXl3b3JkcyIsDQoJCQkJCQkJJ0JvZHknID0+ ICJhcnRpY2xlOmJvZHkiLA0KCQkJCQkJCSdFeGNlcnB0JyA9PiAiYXJ0aWNsZTpleGNlcnB0 IiwNCgkJCQkJCQknQ2F0ZWdvcnkxJyA9PiAiYXJ0aWNsZTpjYXRlZ29yeTEiLA0KCQkJCQkJ CSdDYXRlZ29yeTInID0+ICJhcnRpY2xlOmNhdGVnb3J5MiIsDQoJCQkJCQkJJ1NlY3Rpb24n ID0+ICJhcnRpY2xlOnNlY3Rpb24iLA0KCQkJCQkJCSdJRCcgPT4gImFydGljbGU6aWQiLA0K CQkJCQkJCSdBdXRob3JJRCcgPT4gImFydGljbGU6YXV0aG9yaWQiLA0KCQkJCQkJCSdUaXRs ZScgPT4gImFydGljbGU6dGl0bGUiLA0KCQkJCQkJCSdtZXNzYWdlJyA9PiAiY29tbWVudHM6 bWVzc2FnZSIsDQoJCQkJCQkJJ2VtYWlsJyA9PiAiY29tbWVudHM6ZW1haWwiLA0KCQkJCQkJ CSduYW1lJyA9PiAiY29tbWVudHM6bmFtZSIsDQoJCQkJCQkJJ3dlYicgPT4gImNvbW1lbnRz OndlYiIsDQoJCQkJCQkJKTsNCg0KCSRwbGFjZXMgPSBhcnJheSgndGV4dHBhdHRlcm4nID0+ ICJhcnRpY2xlIiwgJ3R4cF9kaXNjdXNzJyA9PiAiY29tbWVudHMiKTsNCgkkY2xhdXNlID0g YXJyYXkoKTsNCgkkcmVmaW5lTGlzdCA9IGFycmF5KCk7DQoJJGRiVGFibGVzID0gYXJyYXko KTsNCgkkZGJGaWVsZHMgPSBhcnJheSgpOw0KDQoJLy8gRXhwYW5kIHRoZSBhcmdzIGluIGNh c2UgdGhleSdyZSA/IG9yICEgc2hvcnRjdXRzLCBhbmQgZG8gc29tZSB2YWxpZGl0eSBjaGVj a2luZy4NCgkkc2VhcmNoX3Rlcm0gPSBzbWRfZG9MaXN0KCRzZWFyY2hfdGVybSwgZmFsc2Us ICIiLCBmYWxzZSwgJGRlbGltKTsNCgkkc2VhcmNoX3Rlcm0gPSAkc2VhcmNoX3Rlcm1bMF1b MF07DQoJaWYgKCRkZWJ1ZyA+IDEpIHsNCgkJZWNobyAiKysgU0VBUkNIIFRFUk0gKysiOw0K CQlkbXAoJHNlYXJjaF90ZXJtKTsNCgl9DQoJJHJlZmluZSA9IGRvX2xpc3QoJHJlZmluZSwg JGRlbGltKTsNCglmb3IgKCRpZHggPSAwOyAkaWR4IDwgY291bnQoJHJlZmluZSk7ICRpZHgr Kykgew0KCQlpZiAoaW5fYXJyYXkoJHJlZmluZVskaWR4XSwgJHJlZmluZUFsbG93KSkgew0K CQkJJHJlZmluZUxpc3RbJGlkeF0gPSAkcmVmaW5lWyRpZHhdOw0KCQl9DQoJfQ0KCSRtZXRh X3NlYXJjaCA9IChpbl9hcnJheSgibWV0YXBob25lIiwgJHJlZmluZUxpc3QpKSA/IG1ldGFw aG9uZSgkc2VhcmNoX3Rlcm0pIDogIiI7DQoJJHNvdW5kX3NlYXJjaCA9IChpbl9hcnJheSgi c291bmRleCIsICRyZWZpbmVMaXN0KSkgPyBzb3VuZGV4KCRzZWFyY2hfdGVybSkgOiAiIjsN CgkkdG9sZXJhbmNlID0gaW50dmFsKCR0b2xlcmFuY2UpOw0KDQoJLy8gbWF0Y2hfd2l0aCBu ZWVkcyB0byBiZSBidWlsdCBpbnRvIGEgc2VyaWVzIG9mIGFycmF5cyBvZiBkYXRhYmFzZSB0 YWJsZXMgYW5kIGNvbHVtbnMNCgkkbG9va2luID0gc21kX3NwbGl0KCRtYXRjaF93aXRoLCBm YWxzZSwgIjosXHMiKTsNCgkvLyBMb29wIG92ZXIgcGFpcnMgb2YgZWxlbWVudHMNCglmb3Ig KCRpZHggPSAwOyAkaWR4IDwgY291bnQoJGxvb2tpbik7ICRpZHgrPTIpIHsNCgkJaWYgKCgk dG1wID0gYXJyYXlfc2VhcmNoKCRsb29raW5bJGlkeF0sICRwbGFjZXMpKSAhPT0gZmFsc2Up IHsNCgkJCSRkYlRhYmxlc1tdID0gJHRtcDsNCgkJCSRkYkZpZWxkTGlzdCA9IHNtZF9zcGxp dCgkbG9va2luWyRpZHgrMV0sIGZhbHNlLCAiOyIpOw0KCQkJJGRiRmllbGQgPSBhcnJheSgp Ow0KCQkJZm9yZWFjaCAoJGRiRmllbGRMaXN0IGFzICRsb29rRmllbGQpIHsNCgkJCQkka2V5 ID0gYXJyYXlfc2VhcmNoKCRsb29raW5bJGlkeF0uIjoiLnN0cnRvbG93ZXIoJGxvb2tGaWVs ZCksICRjb2xOYW1lcyk7DQoJCQkJaWYgKCRrZXkpIHsNCgkJCQkJJGRiRmllbGRbXSA9ICRr ZXk7DQoJCQkJfSBlbHNlIGlmIChzdHJwb3MoJGxvb2tGaWVsZCwgImN1c3RvbV8iKSA9PT0g MCkgew0KCQkJCQkkZGJGaWVsZFtdID0gJGxvb2tGaWVsZDsNCgkJCQl9DQoJCQl9DQoJCQlp ZiAoY291bnQoJGRiRmllbGQpID4gMCkgew0KCQkJCSRkYkZpZWxkc1tdID0gJGRiRmllbGQ7 DQoJCQl9DQoJCX0NCgl9DQoNCglpZiAoY291bnQoJGRiVGFibGVzKSA9PSAwIHx8IGNvdW50 KCRkYkZpZWxkcykgPT0gMCkgew0KCQkkZGJUYWJsZXNbXSA9ICJ0ZXh0cGF0dGVybiI7DQoJ CSRkYkZpZWxkc1tdID0gIioiOw0KCX0NCglpZiAoJGRlYnVnKSB7DQoJCWVjaG8gIisrIEZJ RUxEUyArKyI7DQoJCWRtcCgkZGJGaWVsZHMpOw0KCX0NCg0KCSRzaG93TGlzdCA9IGRvX2xp c3QoJHNob3csICRkZWxpbSk7DQoJZm9yICgkaWR4ID0gY291bnQoJHNob3dMaXN0KTsgJGlk eCA+IDA7ICRpZHgtLSkgew0KCQlpZiAoIWluX2FycmF5KCRzaG93TGlzdFskaWR4LTFdLCAk c2hvd0FsbG93KSkgew0KCQkJdW5zZXQoJHNob3dMaXN0WyRpZHhdKTsNCgkJfQ0KCX0NCgkk bGltaXRCeSA9IGFycmF5KCk7DQoJJGxpbWl0ID0gZG9fbGlzdCgkbGltaXQsICRkZWxpbSk7 DQoJZm9yZWFjaCAoJGxpbWl0IGFzICRsaW1PcHRpb24pIHsNCgkJaWYgKGlzX251bWVyaWMo JGxpbU9wdGlvbikpIHsNCg0KCQkJJGxpbWl0QnlbImFydGljbGVzIl0gPSAkbGltT3B0aW9u Ow0KCQkJJGxpbWl0QnlbIndvcmRzIl0gPSAkbGltT3B0aW9uOw0KCQl9IGVsc2Ugew0KCQkJ JGxpbXNwbGl0ID0gc21kX3NwbGl0KCRsaW1PcHRpb24sIGZhbHNlLCAiOiIpOw0KCQkJaWYg KChjb3VudCgkbGltc3BsaXQpID09IDIpICYmIChpbl9hcnJheSgkbGltc3BsaXRbMF0sICRz aG93QWxsb3cpKSAmJiAoaXNfbnVtZXJpYygkbGltc3BsaXRbMV0pKSkgew0KCQkJCSRsaW1p dEJ5WyRsaW1zcGxpdFswXV0gPSAkbGltc3BsaXRbMV07DQoJCQl9DQoJCX0NCgl9DQoJJHRo aW5naWVzTDEwbiA9IGFycmF5KCk7DQoJZm9yZWFjaCAoJHNob3dMaXN0IGFzICRpdGVtKSB7 DQoJCSR0aGluZ2llc0wxMG5bXSA9ICRzbWRfZnV6ekxhbmctPmdUeHQoJGl0ZW0pOw0KCX0N CgkkdGhpbmdpZXMgPSBpbXBsb2RlKCIgIi4kc21kX2Z1enpMYW5nLT5nVHh0KCdzdWdnZXN0 X2pvaW4nKS4iICIsICR0aGluZ2llc0wxMG4pOw0KCSRub19tYXRjaF9sYWJlbCA9ICgkbm9f bWF0Y2hfbGFiZWwgPT0gIiMiKSA/ICRzbWRfZnV6ekxhbmctPmdUeHQoJ25vX21hdGNoJywg YXJyYXkoIntzZWFyY2hfdGVybX0iID0+ICRzZWFyY2hfdGVybSkpIDogJG5vX21hdGNoX2xh YmVsOw0KCSRzdWdnZXN0X2xhYmVsID0gKCRzdWdnZXN0X2xhYmVsID09ICIjIikgPyAkc21k X2Z1enpMYW5nLT5nVHh0KCdzdWdnZXN0JywgYXJyYXkoInt0aGluZ2llc30iID0+ICR0aGlu Z2llcykpIDogJHN1Z2dlc3RfbGFiZWw7DQoJJHRvb19zaG9ydF9sYWJlbCA9ICgkdG9vX3No b3J0X2xhYmVsID09ICIjIikgPyAkc21kX2Z1enpMYW5nLT5nVHh0KCd0b29fc2hvcnQnKSA6 ICR0b29fc2hvcnRfbGFiZWw7DQoNCgkvLyBSb2xsIGFueSBzdGF0dXMsIHNlY3Rpb24gYW5k IGNhdGVnb3J5IGZpbHRlcnMgaW50byB0aGUgaW5pdGlhbCBxdWVyeQ0KCSRjbGF1c2VbXSA9 ICcxPTEnOw0KDQoJaWYgKGluX2FycmF5KCJ0ZXh0cGF0dGVybiIsICRkYlRhYmxlcykpIHsN CgkJLy8gU3RhdHVzDQoJCWxpc3QoJHN0YXRpbmMsICRzdGF0ZXhjKSA9IHNtZF9kb0xpc3Qo JHN0YXR1cywgZmFsc2UsICcnLCBmYWxzZSwgJGRlbGltKTsNCgkJZm9yICgkaWR4ID0gMDsg JGlkeCA8IGNvdW50KCRzdGF0aW5jKTsgJGlkeCsrKSB7DQoJCQkkdG1wYVtdID0gZG9RdW90 ZShnZXRTdGF0dXNOdW0oJHN0YXRpbmNbJGlkeF0pKTsNCgkJfQ0KCQlpZiAoJHRtcGEpIHsN CgkJCSRjbGF1c2VbXSA9ICdTdGF0dXMgSU4gKCcgLmltcGxvZGUoIiwiLCAkdG1wYSkuICcp JzsNCgkJfQ0KDQoJCS8vIFNlY3Rpb24NCgkJbGlzdCgkc2VjaW5jLCAkc2VjZXhjKSA9IHNt ZF9kb0xpc3QoJHNlY3Rpb24sIGZhbHNlLCAnJywgdHJ1ZSwgJGRlbGltKTsNCgkJaWYgKCRz ZWNpbmMpIHsNCgkJCSRjbGF1c2VbXSA9ICcoIFNlY3Rpb24gSU4gKCcgLmltcGxvZGUoIiwi LCAkc2VjaW5jKS4gJykgKSc7DQoJCX0NCg0KCQkvLyBDYXRlZ29yeQ0KCQlsaXN0KCRjYXRp bmMsICRjYXRleGMpID0gc21kX2RvTGlzdCgkY2F0ZWdvcnksIGZhbHNlLCAiYXJ0aWNsZToi LiRzdWJsZXZlbCwgdHJ1ZSwgJGRlbGltKTsNCgkJaWYgKCRjYXRpbmMpIHsNCgkJCSRpbXAg PSBpbXBsb2RlKCIsIiwgJGNhdGluYyk7DQoJCQkkY2xhdXNlW10gPSAnKCBDYXRlZ29yeTEg SU4gKCcgLiRpbXAuICcpIE9SIENhdGVnb3J5MiBJTiAoJyAuJGltcC4gJykgKSc7DQoJCX0N Cg0KCQkvLyBDb21iaW5lIHRoZSBxdWVyeSBwb3J0aW9ucw0KCQkkY2xhdXNlID0gaW1wbG9k ZSgiIEFORCAiLCAkY2xhdXNlKTsNCg0KCQkvLyBBZGQgb24gYW55IGV4Y2x1c2lvbnMNCgkJ JHRtcGEgPSBhcnJheSgpOw0KCQlmb3IgKCRpZHggPSAwOyAkaWR4IDwgY291bnQoJHN0YXRl eGMpOyAkaWR4KyspIHsNCgkJCSR0bXBhW10gPSBkb1F1b3RlKGdldFN0YXR1c051bSgkc3Rh dGV4Y1skaWR4XSkpOw0KCQl9DQoJCSRjbGF1c2UgLj0gKCR0bXBhKSA/ICcgQU5EIFN0YXR1 cyBOT1QgSU4gKCcuaW1wbG9kZSgiLCIsICR0bXBhKS4nKScgOiAnJzsNCg0KCQkkaW1wID0g aW1wbG9kZSgiLCIsICRzZWNleGMpOw0KCQkkY2xhdXNlIC49ICgkc2VjZXhjKSA/ICcgQU5E IFNlY3Rpb24gTk9UIElOICgnLiRpbXAuJyknIDogJyc7DQoJDQoJCSRpbXAgPSBpbXBsb2Rl KCIsIiwgJGNhdGV4Yyk7DQoJCSRjbGF1c2UgLj0gKCRjYXRleGMpID8gJyBBTkQgQ2F0ZWdv cnkxIE5PVCBJTiAoJy4kaW1wLicpIEFORCBDYXRlZ29yeTIgTk9UIElOICgnLiRpbXAuJykn IDogJyc7DQoJfQ0KDQoJJGNsYXVzZSA9IGlzX2FycmF5KCRjbGF1c2UpID8gam9pbigiICIs ICRjbGF1c2UpIDogJGNsYXVzZTsNCgkvL1RPRE86IGNvbW1lbnRzDQovKg0KCWlmIChpbl9h cnJheSgidHhwX2Rpc2N1c3MiLCRkYlRhYmxlcykpIHsNCgkJJGNsYXVzZSAuPSAiIEFORCB0 ZXh0cGF0dGVybi5JRCA9IHR4cF9kaXNjdXNzLnBhcmVudGlkIjsNCgl9DQoqLw0KDQoJaWYg KCRkZWJ1ZyA+IDApIHsNCgkJZWNobyAiKysgV0hFUkUgQ0xBVVNFICsrIjsNCgkJZG1wKCRj bGF1c2UpOw0KCX0NCg0KCSRvdXQgPSAiIjsNCgkvLyBQZXJmb3JtIHRoZSBzZWFyY2hlcw0K CSRmaW5kZXIgPSBuZXcgc21kX0Z1enp5RmluZCgkc2VhcmNoX3Rlcm0sICR0b2xlcmFuY2Up Ow0KCWlmICgkZmluZGVyLT50b29fc2hvcnRfZXJyKSB7DQoJCSRvdXQgLj0gKCRsYWJlbHRh ZyA9PSAiIikgPyAiIiA6ICI8IiAuJGxhYmVsdGFnLiI+IjsNCgkJJG91dCAuPSAkbm9fbWF0 Y2hfbGFiZWw7DQoJCSRvdXQgLj0gJHRvb19zaG9ydF9sYWJlbDsNCgkJJG91dCAuPSAoJGxh YmVsdGFnID09ICIiKSA/ICIiIDogIjwvIiAuJGxhYmVsdGFnLiI+IjsNCgl9IGVsc2Ugew0K CQkkY29scyA9ICIqIiAuICgoaW5fYXJyYXkoInRleHRwYXR0ZXJuIiwgJGRiVGFibGVzKSkg PyAiLCB1bml4X3RpbWVzdGFtcCh0ZXh0cGF0dGVybi5Qb3N0ZWQpIEFTIHVQb3N0ZWQsIHVu aXhfdGltZXN0YW1wKHRleHRwYXR0ZXJuLkxhc3RNb2QpIEFTIHVMYXN0TW9kLCB1bml4X3Rp bWVzdGFtcCh0ZXh0cGF0dGVybi5FeHBpcmVzKSBBUyB1RXhwaXJlcyIgOiAiIik7DQoJCSRy cyA9IHNhZmVfcm93c19zdGFydCgkY29scywgaW1wbG9kZSgkZGJUYWJsZXMsICIsICIpLCAk Y2xhdXNlLCAkZGVidWcpOw0KCQlpZiAoaW5fYXJyYXkoInRleHRwYXR0ZXJuIiwkZGJUYWJs ZXMpKSB7DQoJCQkkb3Bmb3JtID0gKCR0aGluZykgPyAkdGhpbmcgOiBmZXRjaF9mb3JtKCRm b3JtKTsNCgkJfQ0KCQkkcGFnZXVybCA9IHNtZF9yZW1vdmVRU1ZhcigkcHJldGV4dFsncmVx dWVzdF91cmknXSwncScpOw0KCQkkYWxsRmllbGRzID0gIiI7DQoJCSRhcnRMaXN0ID0gYXJy YXkoKTsNCgkJJHdvcmRMaXN0ID0gYXJyYXkoKTsNCgkJJHRlcm1MaXN0ID0gYXJyYXkoKTsN CgkJd2hpbGUoJHJvdyA9IG5leHRSb3coJHJzKSkgew0KCQkJJGFsbEZpZWxkcyA9ICIiOw0K CQkJLy8gSm9pbiBhbGwgdGhlIHJlcXVpcmVkIHBsYWNlcyB0byBsb29rIGludG8gYSBsb29v bmcgdGV4dCBibG9jaw0KCQkJaWYgKCRkYkZpZWxkc1swXSA9PSAiKiIpIHsNCgkJCQlmb3Jl YWNoICgkcm93IGFzICRjb2xuYW1lKSB7DQoJCQkJCSRhbGxGaWVsZHMgLj0gJGNvbG5hbWUu IiAiOw0KCQkJCX0NCgkJCX0gZWxzZSB7DQoJCQkJZm9yZWFjaCAoJGRiRmllbGRzIGFzICRm aWVsZFJvdykgew0KCQkJCQlmb3JlYWNoICgkZmllbGRSb3cgYXMgJHRoZUZpZWxkKSB7DQoJ CQkJCQkkYWxsRmllbGRzIC49ICRyb3dbJHRoZUZpZWxkXS4iICI7DQoJCQkJCX0NCgkJCQl9 DQoJCQl9DQoNCgkJCS8vIFJlbW92ZSBiZXR3ZWVuLXdvcmQgdW5pY29kZSBwdW5jdHVhdGlv biBhbmQgcmVwbGFjZSB3aXRoIHNwYWNlDQoJCQkkYWxsRmllbGRzID0gc3RyaXBfdGFncygk YWxsRmllbGRzKTsNCgkJCSRhbGxGaWVsZHMgPSB0cmltKHByZWdfcmVwbGFjZSgnI1tccHtQ fV0rI3UnLCAnICcsICRhbGxGaWVsZHMpKTsNCg0KCQkJLy8gU3BsaXQgdGhlIHJlbWFpbmRl ciBieSAoc2luZ2xlIG9yIG11bHRpcGxlKSBzcGFjZXMNCgkJCSR3ZXJkcyA9IHByZWdfc3Bs aXQoJy9ccysvJywgJGFsbEZpZWxkcywgLTEsIFBSRUdfU1BMSVRfTk9fRU1QVFkpOw0KCQkJ Ly8gLi4uYW5kIHJlY29uc3RpdHV0ZSB0aGUgdW5pcXVlIHdvcmRzIGFzIGEgaHVnZSBzcGFj ZS1kZWxpbWl0ZWQgc3RyaW5nDQoJCQkkd2VyZHMgPSBpbXBsb2RlKCIgIixhcnJheV91bmlx dWUoJHdlcmRzKSk7DQoJCQkvLyBUYWtlIGludG8gYWNjb3VudCBjYXNlIHNlbnNpdGl2aXR5 DQoJCQkkd2VyZHMgPSAoJGNhc2Vfc2Vuc2l0aXZlKSA/ICR3ZXJkcyA6IHN0cnRvbG93ZXIo JHdlcmRzKTsNCg0KCQkJLy8gRmluZCBjbG9zZSB3b3JkIG1hdGNoZXMNCgkJCSRtYXRjaGVz ID0gJGZpbmRlci0+c2VhcmNoKCR3ZXJkcyk7DQoJCQlpZiAoJGRlYnVnID4gMSkgew0KCQkJ CWlmICgkZGVidWcgPiAzIHx8ICRtYXRjaGVzKSB7DQoJCQkJCWVjaG8gIisrIFVOSVFVRSBX T1JEUyArKyI7DQoJCQkJCWRtcCgkd2VyZHMpOw0KCQkJCX0NCgkJCQlpZiAoJG1hdGNoZXMp IHsNCgkJCQkJZWNobyAiKysgQ0xPU0VTVCBNQVRDSEVTICsrIjsNCgkJCQkJZG1wKCRtYXRj aGVzKTsNCgkJCQl9DQoJCQl9DQoNCgkJCWlmIChjb3VudCgkbWF0Y2hlcykgPiAwKSB7DQoJ CQkJJHNob3J0ZXN0RGlzdCA9IDEwMDsgLy8gQSBzdHVwaWRseSBoaWdoIG51bWJlciB0byBz dGFydCB3aXRoDQoJCQkJJHNob3J0ZXN0TWV0YURpc3QgPSAtMTsNCgkJCQkkY2xvc2VzdFdv cmQgPSAiIjsNCgkJCQkkY2xvc2VzdE1ldGFXb3JkID0gIiI7DQoJCQkJJG1heF90ZXJtX2xl biA9IDA7DQoJCQkJLy8gQnVpbGQgYSB1bmlxdWUgYXJyYXkgb2YgY2xvc2VzdCBtYXRjaGlu ZyB3b3Jkcw0KCQkJCXdoaWxlKGxpc3QoJGlkeCwkZGlzdCkgPSBlYWNoKCRtYXRjaGVzKSkg ew0KCQkJCQkkdGVybSA9IHNtZF9nZXRXb3JkKCR3ZXJkcywkc2VhcmNoX3Rlcm0sJGlkeCk7 DQoNCgkJCQkJLy8gT25seSB3b3JkcyBtZWV0aW5nIHRoZSBtaW5pbXVtIHJlcXVpcmVtZW50 IG5lZWQgYXBwbHkNCgkJCQkJJG1heF90ZXJtX2xlbiA9IChzdHJsZW4oJHRlcm0pID4gJG1h eF90ZXJtX2xlbikgPyBzdHJsZW4oJHRlcm0pIDogJG1heF90ZXJtX2xlbjsNCgkJCQkJaWYg KHN0cmxlbigkdGVybSkgPCAkbWluX3dvcmRfbGVuZ3RoKSB7DQoJCQkJCQljb250aW51ZTsN CgkJCQkJfQ0KCQkJCQkkdGVybSA9ICgkY2FzZV9zZW5zaXRpdmUpID8gJHRlcm0gOiBzdHJ0 b2xvd2VyKCR0ZXJtKTsNCgkJCQkJaWYgKCRkZWJ1ZyA+IDIpIHsNCgkJCQkJCWVjaG8gJHRl cm0uYnI7DQoJCQkJCX0NCgkJCQkJaWYgKCRkaXN0IDwgJHNob3J0ZXN0RGlzdCkgew0KCQkJ CQkJJHNob3J0ZXN0RGlzdCA9ICRkaXN0Ow0KCQkJCQkJJGNsb3Nlc3RXb3JkID0gJHRlcm07 DQoJCQkJCX0NCgkJCQkJaWYgKCRtZXRhX3NlYXJjaCAhPSAiIikgew0KCQkJCQkJJG1ldGFf dGVybSA9IG1ldGFwaG9uZSgkdGVybSk7DQoJCQkJCQlpZiAoJGRlYnVnID4gMikgew0KCQkJ CQkJCWVjaG8gJG1ldGFfdGVybSAuICIgOiAiIC4gJG1ldGFfc2VhcmNoIC4iICIuYnI7DQoJ CQkJCQl9DQoJCQkJCQkkbGV2RGlzdCA9IGxldmVuc2h0ZWluKCRtZXRhX3NlYXJjaCwgJG1l dGFfdGVybSk7DQoJCQkJCQlpZiAoJGxldkRpc3QgPD0gJHNob3J0ZXN0TWV0YURpc3QgfHwg JHNob3J0ZXN0TWV0YURpc3QgPCAwKSB7DQoJCQkJCQkJJHNob3J0ZXN0TWV0YURpc3QgPSAk bGV2RGlzdDsNCgkJCQkJCQkkY2xvc2VzdE1ldGFXb3JkICA9ICR0ZXJtOw0KCQkJCQkJfQ0K CQkJCQl9DQoJCQkJfQ0KCQkJCS8vIFBpY2sgdGhlIG9uZSB0aGF0IHNvdW5kcyBjbG9zZXN0 IHRvIHRoZSBvcmlnaW5hbA0KCQkJCWlmICh0cmltKCRjbG9zZXN0V29yZCkgIT0gIiIpIHsN CgkJCQkJJGlkeCA9IG1kNSgkY2xvc2VzdFdvcmQpOw0KCQkJCQkkYmVzdEZpdCA9ICRjbG9z ZXN0V29yZDsNCgkJCQkJJGJlc3REaXN0ID0gJHNob3J0ZXN0RGlzdDsNCgkJCQkJaWYgKCRz b3VuZF9zZWFyY2ggIT0gIiIpIHsNCgkJCQkJCSRzb3VuZDEgPSBsZXZlbnNodGVpbihzb3Vu ZGV4KCRjbG9zZXN0V29yZCksICRzb3VuZF9zZWFyY2gpOw0KCQkJCQkJJHNvdW5kMiA9IGxl dmVuc2h0ZWluKHNvdW5kZXgoJGNsb3Nlc3RNZXRhV29yZCksICRzb3VuZF9zZWFyY2gpOw0K CQkJCQkJaWYgKCRzb3VuZDEgPj0gJHNvdW5kMikgew0KCQkJCQkJCSRpZHggPSBtZDUoJGNs b3Nlc3RNZXRhV29yZCk7DQoJCQkJCQkJJGJlc3RGaXQgPSAkY2xvc2VzdE1ldGFXb3JkOw0K CQkJCQkJCSRiZXN0RGlzdCA9ICRzaG9ydGVzdE1ldGFEaXN0Ow0KCQkJCQkJfQ0KCQkJCQl9 DQoJCQkJCSR3b3JkTGlzdFskaWR4XSA9ICRiZXN0Rml0Ow0KCQkJCQkkd29yZERpc3RbJGlk eF0gPSAkYmVzdERpc3Q7DQoNCgkJCQkJaWYgKCRkZWJ1ZyA+IDIpIHsNCgkJCQkJCWVjaG8g IisrIEJFU1QgRklUICsrIjsNCgkJCQkJCWRtcCgkYmVzdEZpdCk7DQoJCQkJCX0NCgkJCQl9 DQoNCgkJCQkvLyBCdWlsZCBhbiBhcnJheSBvZiB1bmlxdWUgbWF0Y2hpbmcgYXJ0aWNsZXMN CgkJCQlpZiAoJG1heF90ZXJtX2xlbiA+PSAkbWluX3dvcmRfbGVuZ3RoKSB7DQoJCQkJCWlm IChpbl9hcnJheSgidGV4dHBhdHRlcm4iLCAkZGJUYWJsZXMpKSB7DQoJCQkJCQlwb3B1bGF0 ZUFydGljbGVEYXRhKCRyb3cpOw0KCQkJCQl9DQoJCQkJCS8vIFRlbXBvcmFyaWx5IGFzc2ln biB0aGUgY2xvc2VzdCBtYXRjaCB0byB0aGUgcXVlcnkgc3RyaW5nIHNvIHRoYXQNCgkJCQkJ Ly8gdGhlIHNlYXJjaF9yZXN1bHRfZXhjZXJwdCBjYW4gaGlsaWdodCB0aGUgZm91bmQgd29y ZHMNCgkJCQkJJHByZXRleHRbJ3EnXSA9ICR0ZXJtOw0KCQkJCQkkYXJ0TGlzdFtdID0gcGFy c2UoJG9wZm9ybSk7DQoJCQkJCSRwcmV0ZXh0WydxJ10gPSAkc2VhcmNoX3Rlcm07DQoJCQkJ fQ0KCQkJfQ0KCQl9DQoJCS8vIFNvcnQgdGhlIHdvcmQgbGlzdCBpbiBvcmRlciBvZiByZWxl dmFuY2UNCgkJaWYgKGNvdW50KCR3b3JkTGlzdCkgPiAwKSB7DQoJCQlhcnJheV9tdWx0aXNv cnQoJHdvcmREaXN0LCR3b3JkTGlzdCk7DQoJCX0NCg0KCQkvLyBPdXRwdXQgc3R1ZmYgdG8g dGhlIHBhZ2UNCgkJJG91dCAuPSAoJGxhYmVsdGFnID09ICIiKSA/ICIiIDogIjwiIC4kbGFi ZWx0YWcuIj4iOw0KCQkkb3V0IC49ICRub19tYXRjaF9sYWJlbDsNCgkJaWYgKGNvdW50KCR3 b3JkTGlzdCkgPiAwKSB7DQoJCQkkb3V0IC49IChjb3VudCgkc2hvd0xpc3QpID4gMCkgPyAk c3VnZ2VzdF9sYWJlbCA6ICIiOw0KDQoJCQlpZiAoaW5fYXJyYXkoIndvcmRzIiwgJHNob3dM aXN0KSkgew0KCQkJCSRjdHIgPSAwOw0KCQkJCWZvcmVhY2ggKCR3b3JkTGlzdCBhcyAkaXRl bSkgew0KCQkJCQlpZiAoYXJyYXlfa2V5X2V4aXN0cygid29yZHMiLCAkbGltaXRCeSkgJiYg JGN0ciA+PSAkbGltaXRCeVsid29yZHMiXSkgew0KCQkJCQkJYnJlYWs7DQoJCQkJCX0NCgkJ CQkJJG91dCAuPSAnPGEgaHJlZj0iJy5zbWRfYWRkUVNWYXIoJHBhZ2V1cmwsJ3EnLCRpdGVt KS4nIj4nLiRpdGVtLic8L2E+Jy5uOw0KCQkJCQkkY3RyKys7DQoJCQkJfQ0KCQkJfQ0KCQkJ JG91dCAuPSAoJGxhYmVsdGFnID09ICIiKSA/ICIiIDogIjwvIiAuJGxhYmVsdGFnLiI+IjsN CgkJCWlmIChpbl9hcnJheSgiYXJ0aWNsZXMiLCAkc2hvd0xpc3QpKSB7DQoJCQkJJGN0ciA9 IDA7DQoJCQkJZm9yZWFjaCAoJGFydExpc3QgYXMgJGFydCkgew0KCQkJCQlpZiAoYXJyYXlf a2V5X2V4aXN0cygiYXJ0aWNsZXMiLCAkbGltaXRCeSkgJiYgJGN0ciA+PSAkbGltaXRCeVsi YXJ0aWNsZXMiXSkgew0KCQkJCQkJYnJlYWs7DQoJCQkJCX0NCgkJCQkJJG91dCAuPSAkYXJ0 Ow0KCQkJCQkkY3RyKys7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfQ0KCXJldHVybiAkb3V0Ow0K fQ0KDQoNCi8qIHNtZF9GdXp6eUZpbmQNCkEgUEhQIGNsYXNzIGZvciBhcHByb3hpbWF0ZSBz dHJpbmcgc2VhcmNoaW5nIG9mIGxhcmdlIHRleHQgbWFzc2VzLCBhZGFwdGVkICgqY291Z2gq IGJvcnJvd2VkKSBmcm9tIGh0dHA6Ly9lbG9uZW4uaWtpLmZpL2NvZGUvbWlzYy1ub3Rlcy9h cHByLXNlYXJjaC1waHAvLiBJbnN0YW50aWF0ZSBvbmUgb2YgdGhlc2UgYW5kIHBhc3MgaXQg dGhlIHN0cmluZyBwYXR0ZXJuL3dvcmQgeW91IGFyZSBsb29raW5nIGZvciBhbmQgYSBudW1i ZXIgaW5kaWNhdGluZyBob3cgY2xvc2UgdGhhdCBtYXRjaCBoYXMgdG8gYmUvbWluaW11bSBs ZW5ndGggb2Ygc3RyaW5ncyB0byBjb25zaWRlciAoaS5lLiB0aGUgYW1vdW50IG9mIGVycm9y IHRvbGVyYWJsZSkuIDA9Y2xvc2UgbWF0Y2gvc2hvcnQgd29yZHM7IDEwPXByZXR0eSBtdWNo IGV2ZXJ5IGxvbmcgKDEwIGNoYXIgbWluaW11bSkgc3RyaW5nIGluIHRoZSB3b3JsZC4gUHJh Y3RpY2FsIHZhbHVlcyBhcmUgdXN1YWxseSAxIG9yIDIsIHNvbWV0aW1lcyAzLg0KDQpVc2Fn ZSBleGFtcGxlOg0KICAkZmluZGVyID0gbmV3IHNtZF9GdXp6eUZpbmQoJHBhdHQsICRtYXhf ZXJyKTsNCiAgaWYgKCRmaW5kZXItPnRvb19zaG9ydF9lcnIpDQogICAgJGVycm9yID0gIlVu YWJsZSB0byBzZWFyY2g6IHVzZSBsb25nZXIgcGF0dGVybiBvciByZWR1Y2UgZXJyb3IgdG9s ZXJhbmNlLiI7DQoNCiAgd2hpbGUoJHRleHQgPSBnZXRfbmV4dF9wYWdlX29mX3RleHQoKSkg ew0KICAgICRtYXRjaGVzID0gJGZpbmRlci0+c2VhcmNoKCR0ZXh0KTsNCiAgICB3aGlsZShs aXN0KCRpZHgsJHJuZykgPSBlYWNoKCRtYXRjaGVzKSkNCiAgICAgIHByaW50ICJNYXRjaCBm b3VuZCBlbmRpbmcgYXQgcG9zaXRpb24gJGlkeCB3aXRoIGEgY2xvc2VuZXNzIG9mICR2YWxc biI7DQogIH0NCg0KVGhlIGNvZGUgdXNlcyBpbml0aWFsIGZpbHRlcmluZyB0byBzb3J0IG91 dCBwb3NzaWJsZSBtYXRjaCBjYW5kaWRhdGVzIGFuZCB0aGVuIGFwcGxpZXMgYSBzbG93ZXIg Y2hhcmFjdGVyLWJ5LWNoYXJhY3RlciBzZWFyY2ggKHNlYXJjaF9zaG9ydCgpKSBhZ2FpbnN0 IHRoZW0uDQoqLw0KDQppZighY2xhc3NfZXhpc3RzKCdzbWRfRnV6enlGaW5kJykpIHsNCmNs YXNzIHNtZF9GdXp6eUZpbmQgew0KCS8vIFRoZSBsYXN0IDMgcGFyYW1ldGVycyBhcmUgZm9y IG9wdGltaXphdGlvbiBvbmx5LCB0byBhdm9pZCB0aGUNCgkvLyBzdXJwcmlzaW5nbHkgc2xv dyBzdHJsZW4oKSBhbmQgc3Vic3RyKCkgY2FsbHM6DQoJLy8gIC0gJHN0YXJ0X2luZGV4ID0g ZnJvbSB3aGljaCBjaGFyYWN0ZXIgb2YgJHRleHQgdG8gc3RhcnQgdGhlIHNlYXJjaA0KCS8v ICAtICRtYXhfbGVuID0gbWF4aW11bSBjaGFyYWN0ZXIgdG8gc2VhcmNoIChzdGFydGluZyBm cm9tICRzdGFydF9pbmRleCkNCgkvLyAgLSAkdGV4dF9zdHJsZW4gPQ0KCS8vIFRoZSByZXR1 cm4gdmFsdWUgaXMgYW4gYXJyYXkgb2YgbWF0Y2hlczoNCgkvLyAgIEFycmF5KCBbPG1hdGNo LWVuZC1pbmRleD5dID0+IDxlcnJvcj4sIC4uLiApDQoJLy8gTm90ZTogPGVycm9yPiBpcyBn ZW5lcmFsbHkgTk9UIGFuIGV4YWN0IGVkaXQgZGlzdGFuY2UgYnV0IHJhdGhlciBhDQoJLy8g bG93ZXIgYm91bmQuIFRoaXMgaXMgdW5mb3J0dW5hdGUgYnV0IHRoZSByb3V0aW5lIHdvdWxk IGJlIHNsb3dlciBpZg0KCS8vIHRoZSBleGFjdCBlcnJvciB3YXMgY2FsY3VsYXRlIGFsb25n IHdpdGggdGhlIG1hdGNoZXMuDQoJLy8gVGhlIGZ1bmN0aW9uIGlzIGJhc2VkIG9uIHRoZSBu b24tZGV0ZXJtaW5pc3RpYyBhdXRvbWF0b24gc2ltdWxhdGlvbg0KCS8vIGFsZ29yaXRobSAo d2l0aG91dCBiaXQgcGFyYWxsZWxpc20gb3B0aW1pemF0aW9ucykuDQoJZnVuY3Rpb24gc2Vh cmNoX3Nob3J0KCRwYXR0LCAkaywgJHRleHQsICRzdGFydF9pbmRleD0wLCAkbWF4X2xlbj0t MSwgJHRleHRfc3RybGVuPS0xKSB7DQoJCWlmICggJHRleHRfc3RybGVuIDwgMCApDQoJCQkk dGV4dF9zdHJsZW4gPSBzdHJsZW4oICR0ZXh0ICk7DQoNCgkJaWYgKCAkbWF4X2xlbiA8IDAg KQ0KCQkJJG1heF9sZW4gPSAkdGV4dF9zdHJsZW47DQoNCgkJJHN0YXJ0X2luZGV4ID0gbWF4 KCAwLCAkc3RhcnRfaW5kZXggKTsNCgkJJG4gPSBtaW4oICRtYXhfbGVuLCAkdGV4dF9zdHJs ZW4tJHN0YXJ0X2luZGV4ICk7DQoJCSRtID0gc3RybGVuKCAkcGF0dCApOw0KCQkkZW5kX2lu ZGV4ID0gJHN0YXJ0X2luZGV4ICsgJG47DQoNCgkJLy8gSWYgJHRleHQgaXMgc2hvcnRlciB0 aGFuICRwYXR0LCB1c2UgdGhlIGJ1aWx0LWluDQoJCS8vIGxldmVuc2h0ZWluKCkgaW5zdGVh ZDoNCgkJaWYgKCRuIDwgJG0pDQoJCXsNCgkJCSRsZXYgPSBsZXZlbnNodGVpbihzdWJzdHIo JHRleHQsICRzdGFydF9pbmRleCwgJG4pLCAkcGF0dCk7DQoJCQlpZiAoICRsZXYgPD0gJGsg KQ0KCQkJCXJldHVybiBBcnJheSggJHN0YXJ0X2luZGV4KyRuLTEgPT4gJGxldiApOw0KCQkJ ZWxzZQ0KCQkJCXJldHVybiBBcnJheSgpOw0KCQl9DQoNCgkJJHMgPSBBcnJheSgpOw0KCQlm b3IgKCRpPTA7ICRpPCRtOyAkaSsrKQ0KCQl7DQoJCQkkYyA9ICRwYXR0eyRpfTsNCgkJCWlm ICggaXNzZXQoJHNbJGNdKSkNCgkJCQkkc1skY10gPSBtaW4oJGksICRzWyRjXSk7DQoJCQll bHNlDQoJCQkJJHNbJGNdID0gJGk7DQoJCX0NCg0KCQlpZiAoICRlbmRfaW5kZXggPCAkc3Rh cnRfaW5kZXggKQ0KCQkJcmV0dXJuIEFycmF5KCk7DQoNCgkJJG1hdGNoZXMgPSBBcnJheSgp Ow0KCQkkZGEgPSAkZGIgPSByYW5nZSgwLCAkbS0kaysxKTsNCg0KCQkkbWsgPSAkbS0kazsN Cg0KCQlmb3IgKCR0PSRzdGFydF9pbmRleDsgJHQ8JGVuZF9pbmRleDsgJHQrKykNCgkJew0K CQkJJGMgPSAkdGV4dHskdH07DQoJCQkkaW5fcGF0dCA9IGlzc2V0KCRzWyRjXSk7DQoNCgkJ CWlmICgkdCYxKSB7ICRkPSYkZGE7ICRlPSYkZGI7IH0NCgkJCWVsc2UgeyAkZD0mJGRiOyAk ZT0mJGRhOyB9DQoNCgkJCWZvciAoJGk9MTsgJGk8PSRtazsgJGkrKykNCgkJCXsNCgkJCQkk ZyA9IG1pbiggJGsrMSwgJGVbJGldKzEsICRlWyRpKzFdKzEgKTsNCg0KCQkJCS8vIFRPRE86 IG9wdGltaXplIHRoaXMgd2l0aCBhIGxvb2stdXAtdGFibGU/DQoJCQkJaWYgKCAkaW5fcGF0 dCApDQoJCQkJCWZvciAoJGo9JGVbJGktMV07ICgkajwkZyAmJiAkajw9JG1rKTsgJGorKykN CgkJCQkJCWlmICggJHBhdHR7JGkrJGotMX0gPT0gJGMgKQ0KCQkJCQkJCSRnID0gJGo7DQoN CgkJCQkkZFskaV0gPSAkZzsNCgkJCX0NCg0KCQkJaWYgKCAkZFskbWtdIDw9ICRrICkNCgkJ CXsNCgkJCQkkZXJyID0gJGRbJG1rXTsNCgkJCQkkaSA9IG1pbiggJHQtJGVyciskaysxLCAk c3RhcnRfaW5kZXgrJG4tMSk7DQoJCQkJaWYgKCAhaXNzZXQoJG1hdGNoZXNbJGldKSB8fCAk ZXJyIDwgJG1hdGNoZXNbJGldKQ0KCQkJCQkkbWF0Y2hlc1skaV0gPSAkZXJyOw0KCQkJfQ0K CQl9DQoNCgkJdW5zZXQoICRkYSwgJGRiICk7DQoJCXJldHVybiAkbWF0Y2hlczsNCgl9DQoJ ZnVuY3Rpb24gdGVzdF9zaG9ydF9zZWFyY2goKSB7DQoJCSR0ZXN0X3RleHQgPSAiT2xpcGEg a2VycmFuIGp1c3NpIGJqJnhsaW5nIGphIGtvbG1lXG4gaWxvaXN0YSAiLg0KCQkJImp1c3Np IGJmb3JsaW5nOmlhIG11dHRhIGVpIHlodGFhbiBqdXNzaSBiam9ybGluZy1uaW1pc3RhIGxh dWxhamFhLiI7DQoJCSR0ZXN0X3BhdHQgPSAianVzc2kgYmpvcmxpbmciOw0KCQlhc3NlcnQo ICR0aGlzLT5zZWFyY2hfc2hvcnQoJHRlc3RfcGF0dCwgNCwgJHRlc3RfdGV4dCkgPT0gQXJy YXkoMjc9PjIsIDYwPT4xLCA5ND0+MCkpOw0KCQlhc3NlcnQoICR0aGlzLT5zZWFyY2hfc2hv cnQoJHRlc3RfcGF0dCwgMiwgJHRlc3RfdGV4dCkgPT0gQXJyYXkoMjc9PjIsIDYwPT4xLCA5 ND0+MCkpOw0KCQlhc3NlcnQoICR0aGlzLT5zZWFyY2hfc2hvcnQoJHRlc3RfcGF0dCwgMSwg JHRlc3RfdGV4dCkgPT0gQXJyYXkoNjA9PjEsIDk0PT4wKSk7DQoJCWFzc2VydCggJHRoaXMt PnNlYXJjaF9zaG9ydCgkdGVzdF9wYXR0LCAwLCAkdGVzdF90ZXh0KSA9PSBBcnJheSg5ND0+ MCkpOw0KCQlhc3NlcnQoICR0aGlzLT5zZWFyY2hfc2hvcnQoImJqb3JsaW5nIiwgMiwgJHRl c3RfdGV4dCwgMTksIDcpID09IEFycmF5KCkpOw0KCQlhc3NlcnQoICR0aGlzLT5zZWFyY2hf c2hvcnQoImJqb3JsaW5nIiwgMiwgJHRlc3RfdGV4dCwgMTksIDgpID09IEFycmF5KDI2PT4y KSk7DQoJCWFzc2VydCggJHRoaXMtPnNlYXJjaF9zaG9ydCgiYmpvcmxpbmciLCAyLCAkdGVz dF90ZXh0LCAyMCwgOCkgPT0gQXJyYXkoKSk7DQoJfQ0KDQoJdmFyICRwYXR0LCAkcGF0dF9s ZW4sICRtYXhfZXJyOw0KCXZhciAkcGFydHMsICRuX3BhcnRzLCAkdW5pcXVlX3BhcnRzLCAk bWF4X3BhcnRfbGVuOw0KCXZhciAkdHJhbnNmX3BhdHQ7DQoJdmFyICR0b29fc2hvcnRfZXJy Ow0KCWZ1bmN0aW9uIHNtZF9GdXp6eUZpbmQoICRwYXR0ZXJuLCAkbWF4X2Vycm9yICkgew0K CQkkdGhpcy0+cGF0dCA9ICRwYXR0ZXJuOw0KCQkkdGhpcy0+cGF0dF9sZW4gPSBzdHJsZW4o JHRoaXMtPnBhdHQpOw0KCQkkdGhpcy0+bWF4X2VyciA9ICRtYXhfZXJyb3I7DQoNCgkJLy8g Q2FsY3VsYXRlIHBhdHRlcm4gcGFydGl0aW9uIHNpemUNCgkJJGludHBhcnRsZW4gPSBmbG9v cigkdGhpcy0+cGF0dF9sZW4vKCR0aGlzLT5tYXhfZXJyKzIpKTsNCgkJaWYgKCRpbnRwYXJ0 bGVuIDwgMSkNCgkJew0KCQkJJHRoaXMtPnRvb19zaG9ydF9lcnIgPSBUcnVlOw0KCQkJcmV0 dXJuOw0KCQl9DQoJCWVsc2UgJHRoaXMtPnRvb19zaG9ydF9lcnIgPSBGYWxzZTsNCg0KCQkv LyBQYXJ0aXRpb24gdGhlIHBhdHRlcm4gZm9yIHBydW5pbmcNCgkJJHRoaXMtPnBhcnRzID0g QXJyYXkoKTsNCgkJZm9yICgkaT0wOyAkaTwkdGhpcy0+cGF0dF9sZW47ICRpKz0kaW50cGFy dGxlbikNCgkJew0KCQkJaWYgKCAkaSArICRpbnRwYXJ0bGVuKjIgPiAkdGhpcy0+cGF0dF9s ZW4gKQ0KCQkJew0KCQkJCSR0aGlzLT5wYXJ0c1tdID0gc3Vic3RyKCAkdGhpcy0+cGF0dCwg JGkgKTsNCgkJCQlicmVhazsNCgkJCX0NCgkJCWVsc2UNCgkJCQkkdGhpcy0+cGFydHNbXSA9 IHN1YnN0ciggJHRoaXMtPnBhdHQsICRpLCAkaW50cGFydGxlbiApOw0KCQl9DQoJCSR0aGlz LT5uX3BhcnRzID0gY291bnQoJHRoaXMtPnBhcnRzKTsNCg0KCQkvLyBUaGUgaW50cGFydGxl biB0ZXN0IGFib3ZlIHNob3VsZCBoYXZlIGNvdmVyZWQgdGhpczoNCgkJYXNzZXJ0KCAkdGhp cy0+bl9wYXJ0cyA+PSAkdGhpcy0+bWF4X2VycisxICk7DQoNCgkJLy8gRmluZCBtYXhpbXVt IHBhcnQgbGVuZ3RoDQoJCWZvcmVhY2goICR0aGlzLT5wYXJ0cyBhcyAkcCApDQoJCQkkdGhp cy0+bWF4X3BhcnRfbGVuID0gbWF4KCAkdGhpcy0+bWF4X3BhcnRfbGVuLCBzdHJsZW4oJHAp KTsNCg0KCQkvLyBNYWtlIGEgbmV3IHBhcnQgYXJyYXkgd2l0aCBkdXBsaWNhdGUgc3RyaW5n cyByZW1vdmVkDQoJCSR0aGlzLT51bmlxdWVfcGFydHMgPSBhcnJheV91bmlxdWUoJHRoaXMt PnBhcnRzKTsNCg0KCQkvLyBUcmFuc2Zvcm0gdGhlIHBhdHRlcm4gaW50byBhIGxvdyByZXNv bHV0aW9uIHBydW5pbmcgc3RyaW5nDQoJCS8vIGJ5IHJlcGxhY2luZyBwYXJ0cyB3aXRoIHNp bmdsZSBjaGFyYWN0ZXJzDQoJCSR0aGlzLT50cmFuc2ZfcGF0dCA9ICIiOw0KCQlyZXNldCgg JHRoaXMtPnBhcnRzICk7DQoJCXdoaWxlIChsaXN0KCwkcCkgPSBlYWNoKCR0aGlzLT5wYXJ0 cykpDQoJCSAgICR0aGlzLT50cmFuc2ZfcGF0dCAuPSBjaHIoYXJyYXlfc2VhcmNoKCRwLCAk dGhpcy0+dW5pcXVlX3BhcnRzKStvcmQoIkEiKSk7DQoNCgkJLy8gU2VsZiBkaWFnbm9zdGlj cw0KCQkkdGhpcy0+dGVzdF9zaG9ydF9zZWFyY2goKTsNCgl9DQoJZnVuY3Rpb24gc2VhcmNo KCAkdGV4dCApIHsNCgkJLy8gRmluZCBhbGwgb2NjdXJlbmNlcyBvZiB1bmlxdWUgcGFydHMg aW4gdGhlDQoJCS8vIGZ1bGwgdGV4dC4gVGhlIHJlc3VsdCBpcyBhbiBhcnJheToNCgkJLy8g ICBBcnJheSggPGluZGV4PiA9PiA8cGFydCM+LCAuLiApDQoJCSRwYXJ0X21hcCA9IEFycmF5 KCk7DQoJCXJlc2V0KCAkdGhpcy0+dW5pcXVlX3BhcnRzICk7DQoJCXdoaWxlIChsaXN0KCRw aSwgJHBhcnRfc3RyKSA9IGVhY2goJHRoaXMtPnVuaXF1ZV9wYXJ0cykpDQoJCXsNCgkJCSRw b3MgPSBzdHJwb3MoJHRleHQsICRwYXJ0X3N0cik7DQoJCQl3aGlsZSAoICRwb3MgIT09IEZh bHNlICkNCgkJCXsNCgkJCQkkcGFydF9tYXBbJHBvc10gPSAkcGk7DQoJCQkJJHBvcyA9IHN0 cnBvcygkdGV4dCwgJHBhcnRfc3RyLCAkcG9zKzEpOw0KCQkJfQ0KCQl9DQoJCWtzb3J0KCAk cGFydF9tYXAgKTsgLy8gU29ydCBieSBzdHJpbmcgaW5kZXgNCg0KCQkvLyBUaGUgZm9sbG93 aW5nIGNvZGUgZG9lcyBzZXZlcmFsIHRoaW5ncyBzaW11bHRhbmVvdXNseToNCgkJLy8gIDEp IERpdmlkZSB0aGUgaW5kaWNlcyBpbnRvIGdyb3VwcyB1c2luZyBnYXBzDQoJCS8vCSAgbGFy Z2VyIHRoYW4gJHRoaXMtPm1heF9lcnIgYXMgYm91bmRhcmllcy4NCgkJLy8gIDIpIFRyYW5z bGF0ZSB0aGUgZ3JvdXBzIGludG8gc3RyaW5ncyBzbyB0aGF0DQoJCS8vCSAgcGFydCMgMCA9 ICdBJywgcGFydCMgMSA9ICdCJyBldGMuIHRvIG1ha2UNCgkJLy8JICBhIGxvdyByZXNvbHV0 aW9uIGFwcHJveGltYXRlIHNlYXJjaCBwb3NzaWJsZSBsYXRlcg0KCQkvLyAgMykgU2F2ZSB0 aGUgc3RyaW5nIGluZGljZXMgaW4gdGhlIGZ1bGwgc3RyaW5nDQoJCS8vCSAgdGhhdCBjb3Jy ZXNwb25kIHRvIGNoYXJhY3RlcnMgaW4gdGhlIHRyYW5zbGF0ZWQgc3RyaW5nLg0KCQkvLyAg NCkgRGlzY2FyZCBncm91cHMgKD1wYXJ0IHNlcXVlbmNlcykgdGhhdCBhcmUgdG9vDQoJCS8v CSAgc2hvcnQgdG8gY29udGFpbiB0aGUgYXBwcm94aW1hdGUgcGF0dGVybi4NCgkJLy8gVGhl IGZvcm1hdCBvZiByZXN1bHRpbmcgYXJyYXk6DQoJCS8vICAgQXJyYXkoDQoJCS8vCSAgQXJy YXkoICI8dHJhbnNsYXRlLXN0cmluZz4iLA0KCQkvLwkJCSBBcnJheSggPHRyYW5zbGF0ZWQt aWR4PiA9PiA8ZnVsbC1pbmRleD4sIC4uLiApICksDQoJCS8vCSAgLi4uICkNCgkJJHRyYW5z ZiA9IEFycmF5KCk7DQoJCSR0cmFuc2ZfdGV4dCA9ICIiOw0KCQkkdHJhbnNmX3BvcyA9IEFy cmF5KCk7DQoJCSRsYXN0X2VuZCA9IDA7DQoJCSRncm91cF9sZW4gPSAwOw0KCQlyZXNldCgg JHBhcnRfbWFwICk7DQoJCXdoaWxlIChsaXN0KCRpLCRwKSA9IGVhY2goJHBhcnRfbWFwKSkN CgkJew0KCQkJaWYgKCAkaS0kbGFzdF9lbmQgPiAkdGhpcy0+bWF4X3BhcnRfbGVuKyR0aGlz LT5tYXhfZXJyICkNCgkJCXsNCgkJCQlpZiAoICRncm91cF9sZW4gPj0gKCR0aGlzLT5uX3Bh cnRzLSR0aGlzLT5tYXhfZXJyKSkNCgkJCQkJJHRyYW5zZltdID0gQXJyYXkoICR0cmFuc2Zf dGV4dCwgJHRyYW5zZl9wb3MgKTsNCg0KCQkJCSR0cmFuc2ZfdGV4dCA9ICIiOw0KCQkJCSR0 cmFuc2ZfcG9zID0gQXJyYXkoKTsNCgkJCQkkZ3JvdXBfbGVuID0gMDsNCgkJCX0NCg0KCQkJ JHRyYW5zZl90ZXh0IC49IGNocigkcCArIG9yZCgiQSIpKTsNCgkJCSR0cmFuc2ZfcG9zW10g PSAkaTsNCgkJCSRncm91cF9sZW4rKzsNCgkJCSRsYXN0X2VuZCA9ICRpICsgc3RybGVuKCR0 aGlzLT5wYXJ0c1skcF0pOw0KCQl9DQoJCWlmICggc3RybGVuKCAkdHJhbnNmX3RleHQgKSA+ PSAoJHRoaXMtPm5fcGFydHMtJHRoaXMtPm1heF9lcnIpKQ0KCQkJJHRyYW5zZltdID0gQXJy YXkoICR0cmFuc2ZfdGV4dCwgJHRyYW5zZl9wb3MgKTsNCg0KCQl1bnNldCggJHRyYW5zZl90 ZXh0LCAkdHJhbnNmX3BvcyApOw0KDQoJCWlmICggY3VycmVudCgkdHJhbnNmKSA9PT0gRmFs c2UgKQ0KCQkJcmV0dXJuIEFycmF5KCk7DQoNCgkJLy8gRmlsdGVyIHRoZSByZW1haW5pbmcg Z3JvdXBzICgiYXBwcm94aW1hdGUgYW5hZ3JhbXMiDQoJCS8vIG9mIHRoZSBwYXR0ZXJuKSBh bmQgbGVhdmUgb25seSB0aGUgb25lcyB0aGF0IGhhdmUgZW5vdWdoDQoJCS8vIHBhcnRzIGlu IGNvcnJlY3Qgb3JkZXIuIFlvdSBjYW4gdGhpbmsgb2YgdGhpcyBsYXN0IHN0ZXAgb2YgdGhl DQoJCS8vIGFsZ29yaXRobSBhcyBhICpsb3cgcmVzb2x1dGlvbiogYXBwcm94aW1hdGUgc3Ry aW5nIHNlYXJjaC4NCgkJLy8gVGhlIHJlc3VsdCBpcyBhbiBhcnJheSBvZiBjYW5kaWRhdGUg dGV4dCBzcGFucyB0byBiZSBzY2FubmVkOg0KCQkvLyAgIEFycmF5KCBBcnJheSg8ZnVsbC1z dGFydC1pZHg+LCA8ZnVsbC1lbmQtaWR4PiksIC4uLiApDQoJCSRwYXJ0X3Bvc2l0aW9ucyA9 IEFycmF5KCk7DQoJCXdoaWxlIChsaXN0KCxsaXN0KCRzdHIsICRwb3NfbWFwKSkgPSBlYWNo KCR0cmFuc2YpKQ0KCQl7DQovLwkJCXByaW50ICJ8JHRyYW5zZl9wYXR0fCAtIHwkc3RyfFxu IjsNCgkJCSRsb3Jlc19tYXRjaGVzID0gJHRoaXMtPnNlYXJjaF9zaG9ydCggJHRoaXMtPnRy YW5zZl9wYXR0LCAkdGhpcy0+bWF4X2VyciwgJHN0ciApOw0KCQkJd2hpbGUgKGxpc3QoJHRy X2VuZCwgKSA9IGVhY2goJGxvcmVzX21hdGNoZXMpKQ0KCQkJew0KCQkJCSR0cl9zdGFydCA9 IG1heCgwLCAkdHJfZW5kIC0gJHRoaXMtPm5fcGFydHMpOw0KCQkJCWlmICggJHRyX2VuZCA+ PSAkdHJfc3RhcnQgKQ0KCQkJCXsNCgkJCQkJJG1lZGlhbl9wb3MgPSAkcG9zX21hcFsgKGlu dCkoKCR0cl9zdGFydCskdHJfZW5kKS8yKSBdOw0KCQkJCQkkc3RhcnQgPSAkbWVkaWFuX3Bv cyAtICgkdGhpcy0+cGF0dF9sZW4vMisxKSAtICR0aGlzLT5tYXhfZXJyIC0gJHRoaXMtPm1h eF9wYXJ0X2xlbjsNCgkJCQkJJGVuZCA9ICRtZWRpYW5fcG9zICsgKCR0aGlzLT5wYXR0X2xl bi8yKzEpICsgJHRoaXMtPm1heF9lcnIgKyAkdGhpcy0+bWF4X3BhcnRfbGVuOw0KDQovLwkJ CQkJcHJpbnQgIiMiIC4gc3RydHIoc3Vic3RyKCAkdGV4dCwgJHN0YXJ0LCAkZW5kLSRzdGFy dCApLCAiXG5cciIsICIkJCIpIC4gIiNcbiI7DQovLwkJCQkJcHJpbnRfciggJHRoaXMtPnNl YXJjaF9zaG9ydCggJiR0aGlzLT5wYXR0LCAkdGhpcy0+bWF4X2VyciwgJiR0ZXh0LCAkc3Rh cnQsICRlbmQtJHN0YXJ0ICkpOw0KDQoJCQkJCSRwYXJ0X3Bvc2l0aW9uc1tdID0gQXJyYXko JHN0YXJ0LCAkZW5kKTsNCgkJCQl9DQoJCQl9DQoJCQl1bnNldCggJGxvcmVzX21hdGNoZXMg KTsNCgkJfQ0KCQl1bnNldCggJHRyYW5zZiApOw0KDQoJCWlmICggY3VycmVudCgkcGFydF9w b3NpdGlvbnMpID09PSBGYWxzZSApDQoJCQlyZXR1cm4gQXJyYXkoKTsNCg0KCQkvLyBTY2Fu IHRoZSBmaW5hbCBjYW5kaWRhdGVzIGFuZCBwdXQgdGhlIG1hdGNoZXMgaW4gYSBuZXcgYXJy YXk6DQoJCSRtYXRjaGVzID0gQXJyYXkoKTsNCgkJJHRleHRfbGVuID0gc3RybGVuKCR0ZXh0 KTsNCgkJd2hpbGUgKGxpc3QoLCBsaXN0KCRzdGFydCwgJGVuZCkpID0gZWFjaCgkcGFydF9w b3NpdGlvbnMpKQ0KCQl7DQoJCQkkbSA9ICR0aGlzLT5zZWFyY2hfc2hvcnQoICR0aGlzLT5w YXR0LCAkdGhpcy0+bWF4X2VyciwgJHRleHQsICRzdGFydCwgJGVuZC0kc3RhcnQsICR0ZXh0 X2xlbiApOw0KCQkJd2hpbGUgKGxpc3QoJGksICRjb3N0KSA9IGVhY2goJG0pKQ0KCQkJCSRt YXRjaGVzWyRpXSA9ICRjb3N0Ow0KCQl9DQoJCXVuc2V0KCRwYXJ0X3Bvc2l0aW9ucyk7DQoN CgkJcmV0dXJuICRtYXRjaGVzOw0KCX0NCn0NCn0NCg0KLyogc21kX2dldFdvcmQNCg0KVGFr ZXMgYSBzdHJpbmcgYW5kIGFuIG9mZnNldCBpbnRvIHRoYXQgc3RyaW5nIGFuZCByZXR1cm5z IHRoZSBuZWFyZXN0ICJ3b3JkIiBiZWZvcmUgdGhhdCBvZmZzZXQgcG9zaXRpb24uDQpJZiB0 aGUgb2Zmc2V0IGlzIG5vdCBzdXBwbGllZCBpdCBzdGFydHMgZnJvbSB0aGUgYmVnaW5uaW5n IG9mIHRoZSBzdHJpbmcsIHRodXMgcmV0dXJuaW5nIHRoZSBmaXJzdCB3b3JkLg0KDQpUYWtl cyAzIGFyZ3M6DQojIFsqXSBUaGUgKHVzdWFsbHkgbG9vb25nKSBzcGFjZS1kZWxpbWl0ZWQg c3RyaW5nIHRvIGxvb2sgaW4NCiMgWypdIFRoZSB3b3JkIHRvIGxvb2sgZm9yDQojIFRoZSBv ZmZzZXQgaW50byB0aGUgc3RyaW5nIGF0IHdoaWNoIHRvIHN0YXJ0IGxvb2tpbmcNCiovDQoN CmlmICghZnVuY3Rpb25fZXhpc3RzKCJzbWRfZ2V0V29yZCIpKSB7DQpmdW5jdGlvbiBzbWRf Z2V0V29yZCgkaGF5c3RhY2ssJHNlYXJjaHRlcm0sJG9mZnNldD0wKSB7DQoJJG51bXdvcmRz ID0gc3RyX3dvcmRfY291bnQoJHNlYXJjaHRlcm0pOw0KDQoJJGxlbiA9IHN0cmxlbigkaGF5 c3RhY2spOw0KDQoJLy8gSWYgd2UncmUgbWlkLXdvcmQsIGZpbmQgaXRzIGVuZA0KCSRpZHgg PSAkb2Zmc2V0LTE7DQoJd2hpbGUgKCRpZHggPCAkbGVuICYmICRoYXlzdGFja1skaWR4XSAh PSAiICIpIHsNCgkJJGlkeCsrOw0KCX0NCgkkb2Zmc2V0ID0gJGlkeDsNCg0KCS8vIE1vdmUg dGhlIHdvcmQgd2Ugd2FudCB0byB0aGUgc3RhcnQNCgkkaGF5c3RhY2sgPSB0cmltKHN0cnJl dihzdWJzdHIoJGhheXN0YWNrLDAsJG9mZnNldCkpKTsNCg0KCS8vIE1ha2Ugc3VyZSB0byBy ZXR1cm4gdGhlIGNvcnJlY3QgbnVtYmVyIG9mIHdvcmRzDQoJJHNwYWNlUG9zID0gZmFsc2U7 DQoJZm9yICgkaWR4ID0gMDsgJGlkeCA8ICRudW13b3JkczsgJGlkeCsrKSB7DQoJCSRzcGFj ZVBvcyA9IChzdHJwb3MoJGhheXN0YWNrLCAiICIsICRzcGFjZVBvcykpOw0KCQlpZiAoJHNw YWNlUG9zICE9PSBmYWxzZSkgew0KCQkJJHNwYWNlUG9zICs9IDE7DQoJCX0NCgl9DQoNCgly ZXR1cm4gdHJpbShzdHJyZXYoKCgkc3BhY2VQb3MgPT09IGZhbHNlKSA/ICRoYXlzdGFjayA6 IHN1YnN0cigkaGF5c3RhY2ssIDAsICRzcGFjZVBvcykpKSk7DQp9DQp9IjtzOjQ6InR5cGUi O3M6MToiMCI7czo1OiJmbGFncyI7czoxOiIwIjtzOjU6Im9yZGVyIjtzOjE6IjUiO3M6Mzoi bWQ1IjtzOjMyOiJmNmI3NjdjZDI2NjMxYzM4MjIwNWMyY2Q4ZWMxNmZhNCI7fQ==