# ako_nav v1.0 # This plugin produces a dynamic navigation bar based on a few specified attributes. # Adrian Kostrubiak # http://www.ako-k.com/ # ...................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ...................................................................... YToxMTp7czo3OiJ2ZXJzaW9uIjtzOjM6IjEuMCI7czo2OiJhdXRob3IiO3M6MTc6IkFkcmlh biBLb3N0cnViaWFrIjtzOjEwOiJhdXRob3JfdXJpIjtzOjIxOiJodHRwOi8vd3d3LmFrby1r LmNvbS8iO3M6MTE6ImRlc2NyaXB0aW9uIjtzOjgyOiJUaGlzIHBsdWdpbiBwcm9kdWNlcyBh IGR5bmFtaWMgbmF2aWdhdGlvbiBiYXIgYmFzZWQgb24gYSBmZXcgc3BlY2lmaWVkIGF0dHJp YnV0ZXMuIjtzOjQ6InR5cGUiO2k6MDtzOjQ6Im5hbWUiO3M6NzoiYWtvX25hdiI7czo0OiJo ZWxwIjtzOjcxNTI6Igk8aDI+YWtvX25hdiBIZWxwIEZpbGU8L2gyPgoKCTxoMz5BIGR5bmFt aWMgcG9ydGFibGUgbmF2aWdhdGlvbiBjcmVhdG9yLjwvaDM+CgoJPGg0PldoYXQgZG9lcyBp dCBkbz88L2g0PgoKCTx1bD4KCQk8bGk+Q3JlYXRlcyBhIHByaW1hcnkgPGNvZGU+ZGl2PC9j b2RlPiAob3B0aW9uYWxseSkuPC9saT4KCQk8bGk+SW5zaWRlIHRoZSA8Y29kZT5kaXY8L2Nv ZGU+LCBhIGhlYWRpbmcgaXMgYWRkZWQgZm9yIHRoZSBuYXYgYmFyIChvcHRpb25hbGx5KS48 L2xpPgoJCTxsaT5DcmVhdGVzIGEgPGNvZGU+dWw8L2NvZGU+IHRvIGhvbGQgdGhlIG5hdiBi YXIuPC9saT4KCQk8bGk+R29lcyB0aHJvdWdoIGdpdmVuIHVybHMgYW5kIG5hbWVzIG9mIHBh Z2VzIGFuZCBkeW5taWNhbGx5IGFkZHMgdGhlbSBhcyA8Y29kZT5saTwvY29kZT4mIzgyMTc7 czwvbGk+CgkJPGxpPjxjb2RlPmNsYXNzPSYjMzQ7YWN0aXZlJiMzNDs8L2NvZGU+IGlzIGF1 dG9tYXRpY2FsbHkgYWRkZWQgdG8gdGhlIGN1cnJlbnQgcGFnZSYjODIxNztzIDxjb2RlPmE8 L2NvZGU+IHRhZyAob3Igb3B0aW9uYWxseSwgPGNvZGU+bGk8L2NvZGU+IHRhZykuPC9saT4K CTwvdWw+CgoJPGg0PkV4YW1wbGVzPC9oND4KCgk8cD5UaGUgc2ltcGxlc3QgZm9ybSBpcyB0 aGlzOjwvcD4KCgk8YmxvY2txdW90ZT4KCQk8cD48Y29kZT4mIzYwO3R4cDpha29fbmF2IG5h bWU9JiMzNDtob21lLGFib3V0LGNvbnRhY3QmIzM0OyB1cmw9JiMzNDsvLC9hYm91dCwvY29u dGFjdCYjMzQ7IC8mIzYyOzwvY29kZT48L3A+Cgk8L2Jsb2NrcXVvdGU+CgoJPHA+aXQgd2ls bCBwcm9kdWNlIHNvbWV0aGluZyBsaWtlIHRoaXM6PC9wPgoKCTxibG9ja3F1b3RlPgoJCTxw PjxwcmU+JiM2MDtkaXYmIzYyOwomIzYwO2gyJiM2MjtOYXZpZ2F0aW9uJiM2MDsvaDImIzYy OwoJJiM2MDt1bCYjNjI7CgkJJiM2MDtsaSYjNjI7JiM2MDthIGhyZWY9JiMzNDsvJiMzNDsm IzYyO2hvbWUmIzYwOy9hJiM2MjsmIzYwOy9saSYjNjI7CgkJJiM2MDtsaSYjNjI7JiM2MDth IGhyZWY9JiMzNDsvYWJvdXQmIzM0OyYjNjI7YWJvdXQmIzYwOy9hJiM2MjsmIzYwOy9saSYj NjI7CgkJJiM2MDtsaSYjNjI7JiM2MDthIGhyZWY9JiMzNDsvY29udGFjdCYjMzQ7JiM2Mjtj b250YWN0JiM2MDsvYSYjNjI7JiM2MDsvbGkmIzYyOwoJJiM2MDsvdWwmIzYyOwomIzYwOy9k aXYmIzYyOzwvcHJlPjwvcD4KCTwvYmxvY2txdW90ZT4KCgk8cD5BZGQgc29tZSBvZiB0aGUg dGFncyBiZWxvdyB0byBnZXQgYSBsb3QgbW9yZSBjcmVhdGl2ZS48L3A+CgoJPGg0PlBsZWFz ZSBub3RlOjwvaDQ+CgoJPHA+VGhlIHVybCBhdHRyaWJ1dGVzIHNob3VsZCBiZSByZWxhdGl2 ZSB0byB0aGUgcm9vdCBvZiB5b3VyIHNpdGUuICBUaGF0IGlzLCBpZiB5b3UgYXJlIHJ1bm5p bmcgeW91ciBzaXRlIG91dCBvZiBhIHN1YmRpcmVjdG9yeSwgeW91IGRvIDxzdHJvbmc+bm90 PC9zdHJvbmc+IG5lZWQgdG8gaW5jbHVkZSB0aGUgc3ViZGlyZWN0b3J5IGluIHRoZSB1cmwg YXR0cmlidXRlLiAgKEluIGZhY3QsIGRvbiYjODIxNzt0IGluY2x1ZGUgaXQuKTxiciAvPgpG b3IgZXhhbXBsZSwgaWYgeW91IGFyZSBydW5uaW5nIHlvdXIgc2l0ZSBhdCBodHRwOi8vd3d3 LmFrby1rLmNvbS93b3cvLCBhbmQgeW91IHdhbnRlZCB0byB1c2UgYWtvX25hdiB0byBtYWtl IGEgbmF2aWdhdGlvbiBiYXIgdG8gdGhlIGFib3V0IGFuZCBsaW5rcyBwYWdlLCB0aGUgY29k ZSB3b3VsZCBiZTwvcD4KCgk8YmxvY2txdW90ZT4KCQk8cD48Y29kZT4mIzYwO3R4cDpha29f bmF2IG5hbWU9JiMzNDtob21lLGFib3V0LGNvbnRhY3QmIzM0OyB1cmw9JiMzNDsvLC9hYm91 dCwvbGlua3MmIzM0OyAvJiM2Mjs8L2NvZGU+PGJyIC8+CmFuZCBub3Q8YnIgLz4KPGRlbD5A PHR4cDpha29fbmF2IG5hbWU9ImhvbWUsYWJvdXQsY29udGFjdCIgdXJsPSIvd293Lywvd293 L2Fib3V0LC93b3cvbGlua3MiIC8+QDwvZGVsPjwvcD4KCTwvYmxvY2txdW90ZT4KCgk8aDQ+ VGFnczwvaDQ+CgoJPHVsPgoJCTxsaT48ZW0+UmVxdWlyZWQ8L2VtPgoJPHVsPgoJCTxsaT48 c3Ryb25nPm5hbWU8L3N0cm9uZz4gJiM4MjExOyBUaGlzIGlzIGEgbGlzdCBvZiBwYWdlIG5h bWVzLCBkZWxpbWl0ZWQgYnkgY29tbWFzIChhbmQgbm8gc3BhY2VzKSwgdW5sZXNzIHRoZSAm IzgyMjA7ZGVsaW0mIzgyMjE7IGF0dHJpYnV0ZSBpcyBzZXQgYXMgc29tZXRoaW5nIGVsc2Uu PC9saT4KCQk8bGk+PHN0cm9uZz51cmw8L3N0cm9uZz4gJiM4MjExOyBUaGlzIGlzIGEgbGlz dCBvZiBwYWdlIHVybCYjODIxNztzLCBmb2xsb3dpbmcgdGhlIHNhbWUgb3JkZXIgYXMgdGhl IHBhZ2UgbmFtZXMsIGFuZCBhbHNvIGRlbGltaXRlZCBieSBjb21tYXMgKGFuZCBubyBzcGFj ZXMpLCB1bmxlc3MgdGhlICYjODIyMDtkZWxpbSYjODIyMTsgYXR0cmlidXRlIGlzIHNldCBh cyBzb21ldGhpbmcgZWxzZS48L2xpPgoJPC91bD48L2xpPgoJCTxsaT48ZW0+T3B0aW9uYWw8 L2VtPgoJPHVsPgoJCTxsaT48c3Ryb25nPnRpdGxlPC9zdHJvbmc+ICYjODIxMTsgVGhpcyBp cyBhIGxpc3Qgb2YgPGNvZGU+dGl0bGU8L2NvZGU+IGF0dHJpYnV0ZXMgZm9yIHRoZSA8Y29k ZT5hPC9jb2RlPiB0YWdzLCBkZWxpbWl0ZWQgYnkgY29tbWFzIChhbmQgbm8gc3BhY2VzKSwg dW5sZXNzIHRoZSAmIzgyMjA7ZGVsaW0mIzgyMjE7IGF0dHJpYnV0ZSBpcyBzZXQgYXMgc29t ZXRoaW5nIGVsc2UuPC9saT4KCQk8bGk+PHN0cm9uZz51bGlkPC9zdHJvbmc+ICYjODIxMTsg VGhpcyBpcyBhbiBpZCBmb3IgdGhlIDxjb2RlPnVsPC9jb2RlPiB0YWcuPC9saT4KCQk8bGk+ PHN0cm9uZz51bGNsYXNzPC9zdHJvbmc+ICYjODIxMTsgVGhpcyBpcyBhIGNsYXNzIGZvciB0 aGUgPGNvZGU+dWw8L2NvZGU+dGFnLjwvbGk+CgkJPGxpPjxzdHJvbmc+bGlpZHM8L3N0cm9u Zz4gJiM4MjExOyBUaGlzIGlzIGEgbGlzdCBvZiBpZCBhdHRyaWJ1dGVzIGZvciB0aGUgPGNv ZGU+bGk8L2NvZGU+IHRhZywgZGVsaW1pdGVkIGJ5IGNvbW1hcyAoYW5kIG5vIHNwYWNlcyks IHVubGVzcyB0aGUgJiM4MjIwO2RlbGltJiM4MjIxOyBhdHRyaWJ1dGUgaXMgc2V0IGFzIHNv bWV0aGluZyBlbHNlLjwvbGk+CgkJPGxpPjxzdHJvbmc+bGljbGFzczwvc3Ryb25nPiAmIzgy MTE7IFRoaXMgaXMgYSBjbGFzcyBmb3IgdGhlIDxjb2RlPmxpPC9jb2RlPnRhZy48L2xpPgoJ CTxsaT48c3Ryb25nPmFmY2hpbGQ8L3N0cm9uZz4gJiM4MjExOyA8c3Bhbj57Y29sb3I6cmVk fSBOZXcgaW4gMS4wITwvc3Bhbj4gVGhpcyBpcyBhbiBhZGRpdGlvbmFsIGNsYXNzIGF0dHJp YnV0ZSBmb3IgdGhlIDxjb2RlPmxpPC9jb2RlPiB0YWcsIG9ubHkgYXBwbGllZCB0byB0aGUg PGVtPmZpcnN0PC9lbT4gaXRlbSBpbiB0aGUgbGlzdC48L2xpPgoJCTxsaT48c3Ryb25nPmFs Y2hpbGQ8L3N0cm9uZz4gJiM4MjExOyA8c3Bhbj57Y29sb3I6cmVkfSBOZXcgaW4gMS4wITwv c3Bhbj4gVGhpcyBpcyBhbiBhZGRpdGlvbmFsIGNsYXNzIGF0dHJpYnV0ZSBmb3IgdGhlIDxj b2RlPmxpPC9jb2RlPiB0YWcsIG9ubHkgYXBwbGllZCB0byB0aGUgPGVtPmxhc3Q8L2VtPiBp dGVtIGluIHRoZSBsaXN0LjwvbGk+CgkJPGxpPjxzdHJvbmc+YWlkczwvc3Ryb25nPiAmIzgy MTE7IFRoaXMgaXMgYSBsaXN0IG9mIGlkIGF0dHJpYnV0ZXMgZm9yIHRoZSA8Y29kZT5hPC9j b2RlPiB0YWdzLCBkZWxpbWl0ZWQgYnkgY29tbWFzIChhbmQgbm8gc3BhY2VzKSwgdW5sZXNz IHRoZSAmIzgyMjA7ZGVsaW0mIzgyMjE7IGF0dHJpYnV0ZSBpcyBzZXQgYXMgc29tZXRoaW5n IGVsc2UuPC9saT4KCQk8bGk+PHN0cm9uZz5hY2xhc3M8L3N0cm9uZz4gJiM4MjExOyBUaGlz IGlzIGEgY2xhc3MgZm9yIHRoZSA8Y29kZT5hPC9jb2RlPnRhZy48L2xpPgoJCTxsaT48c3Ry b25nPmFmY2hpbGQ8L3N0cm9uZz4gJiM4MjExOyA8c3Bhbj57Y29sb3I6cmVkfSBOZXcgaW4g MS4wITwvc3Bhbj4gVGhpcyBpcyBhbiBhZGRpdGlvbmFsIGNsYXNzIGF0dHJpYnV0ZSBmb3Ig dGhlIDxjb2RlPmE8L2NvZGU+IHRhZywgb25seSBhcHBsaWVkIHRvIHRoZSA8ZW0+Zmlyc3Q8 L2VtPiBpdGVtIGluIHRoZSBsaXN0LjwvbGk+CgkJPGxpPjxzdHJvbmc+YWxjaGlsZDwvc3Ry b25nPiAmIzgyMTE7IDxzcGFuPntjb2xvcjpyZWR9IE5ldyBpbiAxLjAhPC9zcGFuPiBUaGlz IGlzIGFuIGFkZGl0aW9uYWwgY2xhc3MgYXR0cmlidXRlIGZvciB0aGUgPGNvZGU+YTwvY29k ZT4gdGFnLCBvbmx5IGFwcGxpZWQgdG8gdGhlIDxlbT5sYXN0PC9lbT4gaXRlbSBpbiB0aGUg bGlzdC48L2xpPgoJCTxsaT48c3Ryb25nPnNwYW53cmFwPC9zdHJvbmc+ICYjODIxMTsgVGhp cyBpcyBmb3Igd2hldGhlciBvciBub3QgdGhlIHRleHQgaXMgd3JhcHBlZCBpbiA8Y29kZT5z cGFuPC9jb2RlPiB0YWdzLiAgMCA9IG5vdCB3cmFwcGVkLCAxID0gd3JhcHBlZC4gQnkgZGVm YXVsdCwgaXQgaXMgbm90IHdyYXBwZWQgKDApLjwvbGk+CgkJPGxpPjxzdHJvbmc+c3BhbmNs YXNzPC9zdHJvbmc+ICYjODIxMTsgVGhpcyBpcyBhIGNsYXNzIGZvciB0aGUgPGNvZGU+c3Bh bjwvY29kZT50YWcuPC9saT4KCQk8bGk+PHN0cm9uZz5zcGFuaWRzPC9zdHJvbmc+ICYjODIx MTsgPHNwYW4+e2NvbG9yOnJlZH0gTmV3IGluIDEuMCE8L3NwYW4+ICBUaGlzIGlzIGEgbGlz dCBvZiBpZCBhdHRyaWJ1dGVzIGZvciB0aGUgPGNvZGU+c3BhbjwvY29kZT4gdGFnLCBkZWxp bWl0ZWQgYnkgY29tbWFzIChhbmQgbm8gc3BhY2VzKSwgdW5sZXNzIHRoZSAmIzgyMjA7ZGVs aW0mIzgyMjE7IGF0dHJpYnV0ZSBpcyBzZXQgYXMgc29tZXRoaW5nIGVsc2UuPC9saT4KCQk8 bGk+PHN0cm9uZz5kaXZpZDwvc3Ryb25nPiAmIzgyMTE7IFRoaXMgaXMgYW4gaWQgZm9yIHRo ZSA8Y29kZT5kaXY8L2NvZGU+IGNvbnRhaW5lci48L2xpPgoJCTxsaT48c3Ryb25nPmRpdmNs YXNzPC9zdHJvbmc+ICYjODIxMTsgVGhpcyBpcyBhIGNsYXNzIGZvciB0aGUgPGNvZGU+ZGl2 PC9jb2RlPiBjb250YWluZXIuPC9saT4KCQk8bGk+PHN0cm9uZz5kaXZvbjwvc3Ryb25nPiAm IzgyMTE7IFRoaXMgaXMgZm9yIHdoZXRoZXIgb3Igbm90IHRoZSA8Y29kZT5kaXY8L2NvZGU+ IGlzIGRpc3BsYXllZC4gIDAgPSBub3QgZGlzcGxheWVkLCAxID0gZGlzcGxheWVkLiBCeSBk ZWZhdWx0LCBpdCBpcyBkaXNwbGF5ZWQgKDEpLjwvbGk+CgkJPGxpPjxzdHJvbmc+aGVhZGlk PC9zdHJvbmc+ICYjODIxMTsgVGhpcyBpcyBhbiBpZCBmb3IgdGhlIGhlYWRlciB0YWcuPC9s aT4KCQk8bGk+PHN0cm9uZz5oZWFkY2xhc3M8L3N0cm9uZz4gJiM4MjExOyBUaGlzIGlzIGEg Y2xhc3MgZm9yIHRoZSBoZWFkZXIgdGFnLjwvbGk+CgkJPGxpPjxzdHJvbmc+aGVhZG9uPC9z dHJvbmc+ICYjODIxMTsgVGhpcyBpcyBmb3Igd2hldGhlciBvciBub3QgdGhlIGhlYWRlciB0 ZXh0IGlzIGRpc3BsYXllZC4gIDAgPSBub3QgZGlzcGxheWVkLCAxID0gZGlzcGxheWVkLiBC eSBkZWZhdWx0LCBpdCBpcyBkaXNwbGF5ZWQgKDEpLjwvbGk+CgkJPGxpPjxzdHJvbmc+aGVh ZHR4dDwvc3Ryb25nPiAmIzgyMTE7IFRoaXMgaXMgdGhlIHRleHQgaW5zaWRlIHRoZSBoZWFk ZXIgaXRzIHNlbGYuICBCeSBkZWZhdWx0LCB0aGlzIGlzICYjODIyMDtOYXZpZ2F0aW9uJiM4 MjIxOy48L2xpPgoJCTxsaT48c3Ryb25nPmhlYWRsdmw8L3N0cm9uZz4gJiM4MjExOyBUaGlz IGlzIHRoZSBsZXZlbCB0aGF0IHRoZSA8Y29kZT5oPC9jb2RlPiB0YWcgaXMsIGJldHdlZW4g MSBhbmQgNi4gIEJ5IGRlZmF1bHQsIHRoaXMgaXMgMi48L2xpPgoJCTxsaT48c3Ryb25nPmN1 cmxpbms8L3N0cm9uZz4gJiM4MjExOyBUaGlzIGlzIGFuIG9wdGlvbiBhcyB0byB3aGV0aGVy IG9yIG5vdCB0aGUgY3VycmVudCBzZWN0aW9uIGlzIGxpbmtlZC4gIDAgPSBub3QgbGlua2Vk LCAxID0gbGlua2VkLiAgQnkgZGVmYXVsdCwgaXQgaXMgbGlua2VkICgxKS48L2xpPgoJCTxs aT48c3Ryb25nPmNsYXNzdGFnPC9zdHJvbmc+ICYjODIxMTsgVGhpcyBpcyBhbiBvcHRpb24g d2hpY2ggYWxsb3dzIHlvdSB0byBhZGQgdGhlIDxjb2RlPmNsYXNzPSYjMzQ7YWN0aXZlJiMz NDs8L2NvZGU+IHRvIGVpdGhlciB0aGUgPGNvZGU+YTwvY29kZT4gb3IgdGhlIDxjb2RlPmxp PC9jb2RlPiB0YWcuICAwID0gaXQgaXMgYWRkZWQgdG8gdGhlIDxjb2RlPmE8L2NvZGU+IHRh ZywgMSA9IGl0IGlzIGFkZGVkIHRvIHRoZSA8Y29kZT5saTwvY29kZT4gdGFnLiAgQnkgZGVm YXVsdCwgaXQgaXMgYWRkZWQgdG8gdGhlIDxjb2RlPmE8L2NvZGU+IHRhZyAoMCkuPC9saT4K CQk8bGk+PHN0cm9uZz5hY3RpY2xhc3M8L3N0cm9uZz4gJiM4MjExOyA8c3Bhbj57Y29sb3I6 cmVkfSBOZXcgaW4gMS4wITwvc3Bhbj4gVGhpcyBpcyBhbiBvcHRpb24gdG8gY2hhbmdlIHRo ZSB0aGUgPGNvZGU+Y2xhc3M9JiMzNDthY3RpdmUmIzM0OzwvY29kZT4gdG8gd2hhdGV2ZXIg eW91IHdvdWxkIGxpa2UuIEJ5IGRlZmF1bHQsIHRoaXMgaXMgJiM4MjIwO2FjdGl2ZSYjODIy MTsuPC9saT4KCQk8bGk+PHN0cm9uZz5kZWxpbTwvc3Ryb25nPiAmIzgyMTE7IDxzcGFuPntj b2xvcjpyZWR9IE5ldyBpbiAxLjAhPC9zcGFuPiBUaGlzIGlzIHRoZSBjaGFyYWN0ZXIocykg d2hpY2ggd2lsbCBhY3QgYXMgYSBkZWxpbWl0ZXIgZm9yIHRoZSBvdGhlciBhdHRyaWJ1dGVz IHdoaWNoIHRha2UgYSBsaXN0LCBzdWNoIGFzICYjODIyMDtuYW1lLCYjODIyMTsgJiM4MjIw O3VybCwmIzgyMjE7IGV0Yy4gIEJ5IGRlZmF1bHQsIHRoaXMgaXMgYSBjb21tYSAoJiM4MjIx OywmIzgyMjE7KSBidXQgY2FuIGJlIGNoYW5nZWQgdG8gYW55IG90aGVyIGNoYXJhY3Rlcihz KS48L2xpPgoJCTxsaT48c3Ryb25nPmFjY2Vzc2tleXM8L3N0cm9uZz4gJiM4MjExOyA8c3Bh bj57Y29sb3I6cmVkfSBOZXcgaW4gMS4wITwvc3Bhbj4gVGhpcyBpcyBhIGxpc3Qgb2YgYWNj ZXNza2V5IGF0dHJpYnV0ZXMgZm9yIHRoZSA8Y29kZT5hPC9jb2RlPiB0YWdzLCBkZWxpbWl0 ZWQgYnkgY29tbWFzIChhbmQgbm8gc3BhY2VzKSwgdW5sZXNzIHRoZSAmIzgyMjA7ZGVsaW0m IzgyMjE7IGF0dHJpYnV0ZSBpcyBzZXQgYXMgc29tZXRoaW5nIGVsc2UuPC9saT4KCTwvdWw+ PC9saT4KCTwvdWw+CgoJPHA+PGhyIC8+PGJyIC8+ClRoYW5rcyBmb3IgdXNpbmcgPHN0cm9u Zz5ha29fbmF2PC9zdHJvbmc+LCBhbmQgaGF2ZSBmdW4hPC9wPiI7czo0OiJjb2RlIjtzOjE2 MDQ4OiIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gYWtvX25hdiBwbHVnaW4KLy8gRHluYW1pYyBOYXZp Z2F0aW9uIEJhcnMKLy8gYnkgQWRyaWFuIEtvc3RydWJpYWsKLy8gaHR0cDovL3d3dy5ha28t ay5jb20vCi8vIGh0dHA6Ly93d3cud2VyZWFsbGFmcmFpZC5jb20vCi8vIC0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gVmVyc2lvbiBIaXN0b3J5OgovLyBWZXJzaW9uIDAu MSAtIDAyLTEzLTIwMDUgLSBJbml0aWFsIHJlbGVhc2UKLy8gVmVyc2lvbiAwLjIgLSAwMi0x My0yMDA1IC0gQWRkZWQgYWJpbGl0eSB0byB0dXJuIG9mZiBoZWFkZXIgdGV4dC4KLy8gVmVy c2lvbiAwLjMgLSAwNC0xMi0yMDA1IC0gQWN0dWFsbHkgYWRkZWQgYWJpbGl0eSB0byB0dXJu IG9mZiBoZWFkZXIgdGV4dC4KLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNvbWV0 aGluZyB3YXMgd3JvbmcgbGFzdCB0aW1lLCBhbmQgaXQgdG9vayBtZQovLyAgICAgICAgICAg ICAgICAgICAgICAgICAgICBhIHdoaWxlIHRvIHBpY2sgdXAgb24gaXQpLgovLyBWZXJzaW9u IDAuNCAtIDA1LTIxLTIwMDUgLSBSZW1vdmVkIGRlcGVuZGFuY2Ugb24gVVJMcy4gIE5vdyB3 ZSBnbyBieSB0aGUKLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiB2YXJp YWJsZSBpbiAkcHJldGV4dCAoJHByZXRleHRbJ3MnXSkuCi8vIFZlcnNpb24gMC41IC0gMDYt MjQtMjAwNSAtIEZpeGVkIGFuIGlzc3VlIGluIHdoaWNoIHRoZSBjbGFzcz0iYWN0aXZlIiB3 YXMKLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGJlaW5nIGFkZGVkIHdoZW4g dGhlIHNpdGUgd2FzIGJlaW5nIHJ1biBvdXQgb2YgYQovLyAgICAgICAgICAgICAgICAgICAg ICAgICAgICBzdWJkaXJlY3RvcnkuCi8vIFZlcnNpb24gMC42IC0gMDYtMjQtMjAwNSAtIEFk ZGVkIHRoZSBjdXJsaW5rIGF0dHJpYnV0ZS4gIEFsbG93cyB0aGUgYWJpbGl0eSB0bwovLyAg ICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlIHRoZSBjdXJyZW50IHNlY3Rpb24gbm90 IGJlIGxpbmtlZC4KLy8gVmVyc2lvbiAwLjcgLSAwNy0wNi0yMDA1IC0gQWRkZWQgYWJpbGl0 eSB0byBoYXZlIGV4dHJhIG5hbWVzIHRoYXQsIGlmIHRoZXJlIGFyZQovLyAgICAgICAgICAg ICAgICAgICAgICAgICAgICBub3QgY29ycmVzcG9uZGluZyBsaW5rcywgd2lsbCBub3QgbGlu ay4gIFRoZXkgd2lsbAovLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdXN0IHJlc2lk ZSBpbiB0aGUgbGlzdCBhcyBwbGFpbiB0ZXh0LgovLyBWZXJzaW9uIDAuOCAtIDA5LTA2LTIw MDUgLSBBZGRlZCBhYmlsaXR5IHRvIHNldCBjbGFzcz0iYWN0aXZlIiB0byBsaSB0YWcKLy8g ICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiBhIHRhZwovLyBWZXJzaW9u IDAuOSAtIDEwLTA5LTIwMDUgLSBEdWJiZWQgInN1cGVyLW1lZ2EtY29vbCBpbnN0ZWFkLW9m LWNvbXAtc2NpLXBhcGVyCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2Uu IiAgQWRkZWQgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOiBhaWRzLAovLyAgICAgICAgICAg ICAgICAgICAgICAgICAgICBhY2xhc3MsIGxpaWRzLCBsaWNsYXNzLCBkaXZvbiwgc3Bhbndy YXAsIHNwYW5jbGFzcy4KLy8gVmVyc2lvbiAwLjkuMSAtMTAtMTAtMjAwNS0gRHViYmVkICJv ayBzbyB0aGUgbGFzdCBvbmUgd2Fzbid0IHNvIHN1cGVyLW1lZ2EtY29vbAovLyAgICAgICAg ICAgICAgICAgICAgICAgICAgICBidXQgdGhpcyBvbmUgaXMiIHJlbGVhc2UuICBGaXhlZCBh biBpc3N1ZSB3aGVyZQovLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0iYWN0 aXZlIiB3YXNuJ3QgYmVpbmcgYWRkZWQgd2hlbiBhY2xhc3Mgd2FzIG5vdAovLyAgICAgICAg ICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQuCi8vCi8vIFBsYW5uZWQ6Ci8vIFZlcnNp b24gMS4wIC0gMTAtMTYtMjAwNiAtIEFkZGl0aW9uIG9mIGFjY2Vzc2tleXMgYW5kIHNwYW5p ZHMgYXR0cmlidXRlcy4gIFN1cHBvcnQgZm9yCi8vICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGh0dHBzOi8vLCBmdHA6Ly8gaW4gdXJsIGF0dHMsIGh0dHBzOi8vIGFzIHRoZSB0eHAg UFJPVE9DQUwuCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGljbGFzcywgZGVs aW0sIDxhPiBhbmQgPGxpPiBmaXJzdCAvIGxhc3QgY2hpbGQgc3VwcG9ydAoKZnVuY3Rpb24g YWtvX25hdigkYXR0cykgewoJLy8gZ2V0IHNvbWUgYXR0cmlidXRlcwoJZ2xvYmFsICRhY3Rp Y2xhc3M7CgoJZXh0cmFjdChsQXR0cyhhcnJheSgKCQkJCQkvLyBtYWluIGltcG9ydGFudCBh dHRyaWJ1dGVzCgkJCQkJJ25hbWUnICA9PiAnJywKCQkJCQkndXJsJyAgID0+ICcnLAoJCQkJ CSd0aXRsZScgPT4gJycsCgoJCQkJCS8vIHVsIGF0dHJpYnV0ZXMKCQkJCQkndWxpZCcgICAg PT4gJycsCgkJCQkJJ3VsY2xhc3MnID0+ICcnLAoKCQkJCQkvLyBsaSBhdHRyaWJ1dGVzCgkJ CQkJJ2xpaWQnICAgID0+ICcnLAoJCQkJCSdsaWNsYXNzJyA9PiAnJywKCgkJCQkJLy8gYSBh dHRyaWJ1dGVzCgkJCQkJJ2FpZHMnICAgPT4gJycsCgkJCQkJJ2FjbGFzcycgPT4gJycsCgoJ CQkJCS8vIHNwYW4gYXR0cmlidXRlcwoJCQkJCSdzcGFud3JhcCcgID0+ICcwJywKCQkJCQkn c3BhbmNsYXNzJyA9PiAnJywKCQkJCQknc3BhbmlkcycgICA9PiAnJywKCgkJCQkJLy8gZGl2 IGF0dHJpYnV0ZXMKCQkJCQknZGl2aWQnICAgID0+ICduYXYnLAoJCQkJCSdkaXZjbGFzcycg PT4gJycsCgkJCQkJJ2Rpdm9uJyAgICA9PiAnMScsCgoJCQkJCS8vIGhlYWRpbmcgYXR0cmli dXRlcwoJCQkJCSdoZWFkaWQnICAgID0+ICcnLAoJCQkJCSdoZWFkY2xhc3MnID0+ICcnLAoJ CQkJCSdoZWFkb24nICAgID0+ICcxJywKCQkJCQknaGVhZHR4dCcgICA9PiAnTmF2aWdhdGlv bicsCgkJCQkJJ2hlYWRsdmwnICAgPT4gJzInLAoKCQkJCQkvLyBmaXJzdCAvIGxhc3QgY2hp bGQgc3VwcG9ydAoJCQkJCSdhZmNoaWxkJyAgICA9PiAnJywKCQkJCQknbGlmY2hpbGQnICAg PT4gJycsCgkJCQkJLy8nZmNoaWxkYWN0JyA9PiAnJywKCQkJCQknYWxjaGlsZCcgICAgPT4g JycsCgkJCQkJJ2xpbGNoaWxkJyAgID0+ICcnLAoJCQkJCS8vJ2xjaGlsZGFjdCcgPT4gJycs CgoJCQkJCS8vIHJhbmRvbQoJCQkJCSdjdXJsaW5rJyAgICA9PiAnMScsCgkJCQkJJ2NsYXNz dGFnJyAgID0+ICcwJywKCQkJCQknYWN0aWNsYXNzJyAgPT4gJ2FjdGl2ZScsCgkJCQkJJ2Rl bGltJyAgICAgID0+ICcsJywKCQkJCQknYWNjZXNza2V5cycgPT4gJycsCgkJCQkJKSwkYXR0 cykpOwoJLy8gZW5kIGF0dHJpYnV0ZXMKCgkvLyBtYWtlIHN1cmUgd2UncmUgZG9pbmcgX3Nv bWV0aGluZ18gaGVyZS4uCglpZiAoISRuYW1lICYmICEkdXJsKSByZXR1cm4oYWtvX25hdl9o ZWxwKCJuYW1lJiM4MjE3O3MgYW5kIFVSTCIpKTsKCWlmICghJG5hbWUpIHJldHVybihha29f bmF2X2hlbHAoIm5hbWUiKSk7CglpZiAoISR1cmwpICByZXR1cm4oYWtvX25hdl9oZWxwKCJV UkwiKSk7CgoJJGFrb19vdXQgPSAiIjsKCgkvLyBwYXJzZSB0aGUgdXJpJ3MsIHRpdGxlJ3Ms IG5hbWUncyBvZiBwYWdlcywgPGE+IGNsYXNzLCA8bGk+IGNsYXNzLCBmaXJzdCAmIGxhc3Qg Y2hpbGQgc3VwcG9ydC4uCgkkcGFnZXNbXSA9IGV4cGxvZGUoJGRlbGltLCAkbmFtZSk7Cgkk cGFnZXNbXSA9IGV4cGxvZGUoJGRlbGltLCAkdXJsKTsKCWlmICghZW1wdHkoJHRpdGxlKSkg eyAkcGFnZXNbXSA9IGV4cGxvZGUoJGRlbGltLCAkdGl0bGUpOyB9IGVsc2UgeyAkcGFnZXNb XSA9IGFycmF5X2ZpbGwoMCwgY291bnQoJHBhZ2VzWzBdKSwgIiIpOyB9CglpZiAoIWVtcHR5 KCRhaWRzKSkgIHsgJHBhZ2VzW10gPSBleHBsb2RlKCRkZWxpbSwgJGFpZHMpOyAgfSBlbHNl IHsgJHBhZ2VzW10gPSBhcnJheV9maWxsKDAsIGNvdW50KCRwYWdlc1swXSksICIiKTsgfQoJ aWYgKCFlbXB0eSgkbGlpZCkpICB7ICRwYWdlc1tdID0gZXhwbG9kZSgkZGVsaW0sICRsaWlk KTsgIH0gZWxzZSB7ICRwYWdlc1tdID0gYXJyYXlfZmlsbCgwLCBjb3VudCgkcGFnZXNbMF0p LCAiIik7IH0KCSRwYWdlc1tdID0gJGFjbGFzczsgICAgIC8vIGluZGV4OiA1CgkkcGFnZXNb XSA9ICRsaWNsYXNzOyAgICAvLyBpbmRleDogNgoJJHBhZ2VzW10gPSAkYWZjaGlsZDsgICAg Ly8gaW5kZXg6IDcKCSRwYWdlc1tdID0gJGxpZmNoaWxkOyAgIC8vIGluZGV4OiA4CgkkcGFn ZXNbXSA9ICRhbGNoaWxkOyAgICAvLyBpbmRleDogOQoJJHBhZ2VzW10gPSAkbGlsY2hpbGQ7 ICAgLy8gaW5kZXg6IDEwCgoJLy8gYWNjZXNza2V5cy4uLgoJaWYgKCFlbXB0eSgkYWNjZXNz a2V5cykpIHsKCQkkcGFnZXNbXSA9IGV4cGxvZGUoJGRlbGltLCAkYWNjZXNza2V5cyk7Cgl9 IGVsc2UgewoJCWZvciAoJGkgPSAwOyAkaSA8IGNvdW50KCRwYWdlc1swXSk7ICRpKyspIHsK CQkJJHBhZ2VzWzExXVskaV0gPSAoJGkrMSk7CgkJfQoJfQoKCS8vIHN0YXJ0IHB1dHRpbmcg dG9nZXRoZXIgYSBuYXZiYXIuLi4KCSRha29fb3V0ID0gKCRoZWFkb24gPT0gMSkgPyBuLmhl ZCgkaGVhZHR4dCwgJGhlYWRsdmwsIGFrb19wYXJzZV9pZCgkaGVhZGlkKSAuIGFrb19wYXJz ZV9jbGFzcygkaGVhZGNsYXNzLCBmYWxzZSkpIDogJyc7CgkkYWtvX291dCAuPSBuLiI8dWwi LiBha29fcGFyc2VfaWQoJHVsaWQpIC4gYWtvX3BhcnNlX2NsYXNzKCR1bGNsYXNzLCBmYWxz ZSkgLiI+Ii5uOwoKICAgIC8vIGNoZWNrIHNwYW53cmFwLi4KCWlmICgkc3BhbndyYXAgPT0g MSkgewoJCSRzcGFuaWRBcnIgPSBleHBsb2RlKCRkZWxpbSwgJHNwYW5pZHMpOwoJCSRpID0g MDsKCQlmb3JlYWNoICgkcGFnZXNbMF0gYXMgJHZhbHVlKSB7CgkJCSRwYWdlc1swXVskaV0g PSB0YWcoJHZhbHVlLCAic3BhbiIsIGFrb19wYXJzZV9jbGFzcygkc3BhbmNsYXNzLCBmYWxz ZSkgLiBha29fcGFyc2VfaWQoJHNwYW5pZEFyclskaV0pKTsKCQkJJGkrKzsKCQl9Cgl9CgoJ Ly8gaGVyZXMgdGhlIHRyaWNrZXJ5IHRvIGdvIHRocm91Z2ggdGhlIHVsJ3MsIGFuZCBhZGQg dGhlIGNsYXNzPSJhY3RpdmUiIGR5bmFtaWNhbGx5CgkvLyBpdCdzIHRyaXh5Li4uIHlvdSBr bm93IHlvdSBsaWtlIGl0LgoJZm9yICgkaSA9IDA7ICRpIDwgY291bnQoJHBhZ2VzWzBdKTsg JGkrKykgewoJCSRuYXZiYXJbXSA9IGFycmF5KCJuYW1lIiAgICAgID0+ICRwYWdlc1swXVsk aV0sCgkJICAgICAgICAgICAgICAgICAgInVybCIgICAgICAgPT4gJHBhZ2VzWzFdWyRpXSwK CQkgICAgICAgICAgICAgICAgICAidGl0bGUiICAgICA9PiAkcGFnZXNbMl1bJGldLAoJCSAg ICAgICAgICAgICAgICAgICJhaWQiICAgICAgID0+ICRwYWdlc1szXVskaV0sCgkJICAgICAg ICAgICAgICAgICAgImxpaWQiICAgICAgPT4gJHBhZ2VzWzRdWyRpXSwKCQkgICAgICAgICAg ICAgICAgICAiYWNsYXNzIiAgICA9PiAkcGFnZXNbNV0sCgkJICAgICAgICAgICAgICAgICAg ImxpY2xhc3MiICAgPT4gJHBhZ2VzWzZdLAoJCSAgICAgICAgICAgICAgICAgICJhZmNoaWxk IiAgID0+ICRwYWdlc1s3XSwKCQkgICAgICAgICAgICAgICAgICAibGlmY2hpbGQiICA9PiAk cGFnZXNbOF0sCgkJICAgICAgICAgICAgICAgICAgImFsY2hpbGQiICAgPT4gJHBhZ2VzWzld LAoJCSAgICAgICAgICAgICAgICAgICJsaWxjaGlsZCIgID0+ICRwYWdlc1sxMF0sCgkJICAg ICAgICAgICAgICAgICAgImFjY2Vzc2tleSIgPT4gJHBhZ2VzWzExXVskaV0pOwoJfSAvLyBl bmQgZm9yKCkKCgkvLyBhbGwgdGhlIG1hZ2lxdWUgZ29lcyBvbiBoZXJlLiBjaGVjayBpdCBm dXJ0aGVyIGJlbG93LgoJc3dpdGNoKCRjdXJsaW5rKSB7CgkJY2FzZSAxOgoJCQkkYWtvX291 dCAuPSAoJGNsYXNzdGFnID09IDApCgkJCQk/IGFrb19wYXJzZV9saV8xKCRuYXZiYXIsIGZh bHNlKQoJCQkJOiBha29fcGFyc2VfbGlfMigkbmF2YmFyLCBmYWxzZSk7CgkJCWJyZWFrOwoJ CWNhc2UgMDoKCQkJJGFrb19vdXQgLj0gKCRjbGFzc3RhZyA9PSAwKQoJCQkJPyBha29fcGFy c2VfbGlfMygkbmF2YmFyLCBmYWxzZSkKCQkJCTogYWtvX3BhcnNlX2xpXzQoJG5hdmJhciwg ZmFsc2UpOwoJCQlicmVhazsKCX0KCgkvLyBmaW5pc2ggb2ZmIHRoZSBuYXZiYXIuLi4KCSRh a29fb3V0IC49ICI8L3VsPiIubjsKCSRha29fb3V0ICA9ICgkZGl2b24gPT0gMSkgPyB0YWco JGFrb19vdXQsICJkaXYiLCBha29fcGFyc2VfaWQoJGRpdmlkKSAuIGFrb19wYXJzZV9jbGFz cygkZGl2Y2xhc3MsIGZhbHNlKSkgOiAkYWtvX291dDsKCglyZXR1cm4oJGFrb19vdXQpOwp9 CgoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgcGFyc2VfbGkga2V5OgogICAgMTogbGlu ayB0byBjdXJyZW50IHNlbGVjdGlvbiwgYWRkIGNsYXNzPSJhY3RpdmUiIHRvIGFuY2hvciB0 YWdzCiAgICAyOiBsaW5rIHRvIGN1cnJlbnQgc2VsZWN0aW9uLCBhZGQgY2xhc3M9ImFjdGl2 ZSIgdG8gbGlzdCBpdGVtcwogICAgMzogbm8gbGluayB0byBjdXJyZW50IHNlbGVjdGlvbiwg YWRkIGNsYXNzPSJhY3RpdmUiIHRvIGFuY2hvciB0YWdzIOKAoAogICAgNDogbm8gbGluayB0 byBjdXJyZW50IHNlbGVjdGlvbiwgYWRkIGNsYXNzPSJhY3RpdmUiIHRvIGxpc3QgaXRlbXMK CiAgICAtLS0tLS0tLS0tLQogICAg4oCgIGlmIHlvdSB0aGluayBhYm91dCBpdCwgdGhpcyBt YWtlcyBubyBzZW5zZSB3aGF0IHNvIGV2ZXIuCj09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KCmZ1 bmN0aW9uIGFrb19wYXJzZV9saV8xKCRuYXZiYXIsICRmdWxsVXJsKSB7CgkvLyBsaW5rIHRv IGN1cnJlbnQgc2VsZWN0aW9uLCBhZGQgY2xhc3M9ImFjdGl2ZSIgdG8gYW5jaG9yIHRhZ3MK CWdsb2JhbCAkcHJldGV4dCwgJHNpdGV1cmw7Cgkkc2VjdGlvbiA9ICRwcmV0ZXh0WydzJ107 CgoJJHAgPSAoZGVmaW5lZCgnUFJPVE9DT0wnKSkgPyBQUk9UT0NPTCA6ICdodHRwOi8vJzsK CSRwcyA9IGFycmF5KCJodHRwOi8vIiwgImh0dHBzOi8vIiwgImZ0cDovLyIsICJmdHBzOi8v IiwgIm1haWx0bzoiKTsKCgkkc2VjdGlvbiA9ICgkc2VjdGlvbiA9PSAiZGVmYXVsdCIpID8g IiIgOiAkc2VjdGlvbjsKCSRwX291dCA9ICIiOwoJZm9yICgkaSA9IDA7ICRpIDwgY291bnQo JG5hdmJhcik7ICRpKyspIHsKCQlpZiAoJGkgPT0gMCkgewoJCQkkbGlBdHRzID0gYWtvX3Bh cnNlX2lkKCRuYXZiYXJbJGldWyJsaWlkIl0pIC4gYWtvX3BhcnNlX2NsYXNzKCRuYXZiYXJb JGldWyJsaWNsYXNzIl0sIGZhbHNlLCAkbmF2YmFyWyRpXVsibGlmY2hpbGQiXSk7CgkJfSBl bHNlIGlmICgkaSA9PSAoY291bnQoJG5hdmJhcikgLSAxKSkgewoJCQkkbGlBdHRzID0gYWtv X3BhcnNlX2lkKCRuYXZiYXJbJGldWyJsaWlkIl0pIC4gYWtvX3BhcnNlX2NsYXNzKCRuYXZi YXJbJGldWyJsaWNsYXNzIl0sIGZhbHNlLCAkbmF2YmFyWyRpXVsibGlsY2hpbGQiXSk7CgkJ fSBlbHNlIHsKCQkJJGxpQXR0cyA9IGFrb19wYXJzZV9pZCgkbmF2YmFyWyRpXVsibGlpZCJd KSAuIGFrb19wYXJzZV9jbGFzcygkbmF2YmFyWyRpXVsibGljbGFzcyJdLCBmYWxzZSk7CgkJ fQoKCQlpZiAoIWVtcHR5KCRuYXZiYXJbJGldWyJ1cmwiXSkpIHsKCQkJLy8gdGhlcmUgaXMg YSBsaW5rCgkJCSRhQXR0cyAgPSAiIGhyZWY9XCIiLiAoKCRmdWxsVXJsIHx8IChzdHJwb3Mo JG5hdmJhclskaV1bInVybCJdLCAkcHMpICE9PSBmYWxzZSkpCgkJCQk/ICRuYXZiYXJbJGld WyJ1cmwiXQoJCQkJOiAkcC4kc2l0ZXVybC4kbmF2YmFyWyRpXVsidXJsIl0pIC4iXCIiOwoJ CQkkYUF0dHMgLj0gYWtvX3BhcnNlX3RpdGxlKCRuYXZiYXJbJGldWyJ0aXRsZSJdKTsKCQkJ JGFBdHRzIC49ICIgYWNjZXNza2V5PVwiIi4gJG5hdmJhclskaV1bImFjY2Vzc2tleSJdIC4i XCIiOwoKCQkJLy8gZmlyc3QgLyBsYXN0IGNoaWxkIHN1cHBvcnQKCQkJaWYgKCRpID09IDAp IHsKCQkJCSRhQXR0cyAuPSBha29fcGFyc2VfY2xhc3MoJG5hdmJhclskaV1bImFjbGFzcyJd LCBha29fY2xhc3NBY3RpdmVpemUoJHNlY3Rpb24sICRuYXZiYXJbJGldWyJ1cmwiXSksICRu YXZiYXJbJGldWyJhZmNoaWxkIl0pOwoJCQl9IGVsc2UgaWYgKCRpID09IChjb3VudCgkbmF2 YmFyKSAtIDEpKSB7CgkJCQkkYUF0dHMgLj0gYWtvX3BhcnNlX2NsYXNzKCRuYXZiYXJbJGld WyJhY2xhc3MiXSwgYWtvX2NsYXNzQWN0aXZlaXplKCRzZWN0aW9uLCAkbmF2YmFyWyRpXVsi dXJsIl0pLCAkbmF2YmFyWyRpXVsiYWxjaGlsZCJdKTsKCQkJfSBlbHNlIHsKCQkJCSRhQXR0 cyAuPSBha29fcGFyc2VfY2xhc3MoJG5hdmJhclskaV1bImFjbGFzcyJdLCBha29fY2xhc3NB Y3RpdmVpemUoJHNlY3Rpb24sICRuYXZiYXJbJGldWyJ1cmwiXSkpOwoJCQl9CgoJCQkkYUF0 dHMgLj0gYWtvX3BhcnNlX2lkKCRuYXZiYXJbJGldWyJhaWQiXSk7CgoJCQkkbGlMaW5rID0g dGFnKCRuYXZiYXJbJGldWyJuYW1lIl0sICJhIiwgJGFBdHRzKTsKCQkJJHBfb3V0IC49IHRh ZygkbGlMaW5rLCAibGkiLCAkbGlBdHRzKS5uOwoJCX0gZWxzZSB7CgkJCS8vIG5vIGxpbmss IGp1c3QgdGV4dAoJCQkkcF9vdXQgLj0gdGFnKCRuYXZiYXJbJGldWyJuYW1lIl0sICJsaSIs ICRsaUF0dHMpLm47CgkJfQoJfQoJcmV0dXJuKCRwX291dCk7Cn0KCgpmdW5jdGlvbiBha29f cGFyc2VfbGlfMigkbmF2YmFyLCAkZnVsbFVybCkgewoJLy8gbGluayB0byBjdXJyZW50IHNl bGVjdGlvbiwgYWRkIGNsYXNzPSJhY3RpdmUiIHRvIGxpc3QgaXRlbXMKCWdsb2JhbCAkcHJl dGV4dCwgJHNpdGV1cmw7Cgkkc2VjdGlvbiA9ICRwcmV0ZXh0WydzJ107CgoJJHAgPSAoZGVm aW5lZCgnUFJPVE9DT0wnKSkgPyBQUk9UT0NPTCA6ICdodHRwOi8vJzsKCSRwcyA9IGFycmF5 KCJodHRwOi8vIiwgImh0dHBzOi8vIiwgImZ0cDovLyIsICJmdHBzOi8vIiwgIm1haWx0bzoi KTsKCgkkc2VjdGlvbiA9ICgkc2VjdGlvbiA9PSAiZGVmYXVsdCIpID8gIiIgOiAkc2VjdGlv bjsKCSRwX291dCA9ICIiOwoJZm9yICgkaSA9IDA7ICRpIDwgY291bnQoJG5hdmJhcik7ICRp KyspIHsKCQlpZiAoJGkgPT0gMCkgewoJCQkkbGlBdHRzID0gYWtvX3BhcnNlX2lkKCRuYXZi YXJbJGldWyJsaWlkIl0pIC4gYWtvX3BhcnNlX2NsYXNzKCRuYXZiYXJbJGldWyJsaWNsYXNz Il0sIGFrb19jbGFzc0FjdGl2ZWl6ZSgkc2VjdGlvbiwgJG5hdmJhclskaV1bInVybCJdKSwg JG5hdmJhclskaV1bImxpZmNoaWxkIl0pOwoJCX0gZWxzZSBpZiAoJGkgPT0gKGNvdW50KCRu YXZiYXIpIC0gMSkpIHsKCQkJJGxpQXR0cyA9IGFrb19wYXJzZV9pZCgkbmF2YmFyWyRpXVsi bGlpZCJdKSAuIGFrb19wYXJzZV9jbGFzcygkbmF2YmFyWyRpXVsibGljbGFzcyJdLCBha29f Y2xhc3NBY3RpdmVpemUoJHNlY3Rpb24sICRuYXZiYXJbJGldWyJ1cmwiXSksICRuYXZiYXJb JGldWyJsaWZjaGlsZCJdKTsKCQl9IGVsc2UgewoJCQkkbGlBdHRzID0gYWtvX3BhcnNlX2lk KCRuYXZiYXJbJGldWyJsaWlkIl0pIC4gYWtvX3BhcnNlX2NsYXNzKCRuYXZiYXJbJGldWyJs aWNsYXNzIl0sIGFrb19jbGFzc0FjdGl2ZWl6ZSgkc2VjdGlvbiwgJG5hdmJhclskaV1bInVy bCJdKSk7CgkJfQoJCWlmICghZW1wdHkoJG5hdmJhclskaV1bInVybCJdKSkgewoJCQkvLyB0 aGVyZSBpcyBhIGxpbmsKCQkJJGFBdHRzICA9ICIgaHJlZj1cIiIuICgoJGZ1bGxVcmwgfHwg KHN0cnBvcygkbmF2YmFyWyRpXVsidXJsIl0sICRwcykgIT09IGZhbHNlKSkKCQkJCT8gJG5h dmJhclskaV1bInVybCJdCgkJCQk6ICRwLiRzaXRldXJsLiRuYXZiYXJbJGldWyJ1cmwiXSkg LiJcIiI7CgkJCSRhQXR0cyAuPSBha29fcGFyc2VfdGl0bGUoJG5hdmJhclskaV1bInRpdGxl Il0pOwoJCQkkYUF0dHMgLj0gIiBhY2Nlc3NrZXk9XCIiLiAkbmF2YmFyWyRpXVsiYWNjZXNz a2V5Il0gLiJcIiI7CgkJCWlmICgkaSA9PSAwKSB7CgkJCQkkYUF0dHMgLj0gYWtvX3BhcnNl X2NsYXNzKCRuYXZiYXJbJGldWyJhY2xhc3MiXSwgZmFsc2UsICRuYXZiYXJbJGldWyJhZmNo aWxkIl0pOwoJCQl9IGVsc2UgaWYgKCRpID09IChjb3VudCgkbmF2YmFyKSAtIDEpKSB7CgkJ CQkkYUF0dHMgLj0gYWtvX3BhcnNlX2NsYXNzKCRuYXZiYXJbJGldWyJhY2xhc3MiXSwgZmFs c2UsICRuYXZiYXJbJGldWyJhbGNoaWxkIl0pOwoJCQl9IGVsc2UgewoJCQkJJGFBdHRzIC49 IGFrb19wYXJzZV9jbGFzcygkbmF2YmFyWyRpXVsiYWNsYXNzIl0sIGZhbHNlKTsKCQkJfQoJ CQkkYUF0dHMgLj0gYWtvX3BhcnNlX2lkKCRuYXZiYXJbJGldWyJhaWQiXSk7CgoJCQkkbGlM aW5rID0gdGFnKCRuYXZiYXJbJGldWyJuYW1lIl0sICJhIiwgJGFBdHRzKTsKCQkJJHBfb3V0 IC49IHRhZygkbGlMaW5rLCAibGkiLCAkbGlBdHRzKS5uOwoJCX0gZWxzZSB7CgkJCS8vIG5v IGxpbmssIGp1c3QgdGV4dAoJCQkkcF9vdXQgLj0gdGFnKCRuYXZiYXJbJGldWyJuYW1lIl0s ICJsaSIsICRsaUF0dHMpLm47CgkJfQoJfQoJcmV0dXJuKCRwX291dCk7Cn0KCgpmdW5jdGlv biBha29fcGFyc2VfbGlfMygkbmF2YmFyLCAkZnVsbFVybCkgewoJLy8gbm8gbGluayB0byBj dXJyZW50IHNlbGVjdGlvbiwgYWRkIGNsYXNzPSJhY3RpdmUiIHRvIGFuY2hvciB0YWdzCgkv LyB0aGlzIGRvZXNuJ3QgbWFrZSBzZW5zZS4uLgoJZ2xvYmFsICRwcmV0ZXh0LCAkc2l0ZXVy bDsKCSRzZWN0aW9uID0gJHByZXRleHRbJ3MnXTsKCgkkcCA9IChkZWZpbmVkKCdQUk9UT0NP TCcpKSA/IFBST1RPQ09MIDogJ2h0dHA6Ly8nOwoJJHBzID0gYXJyYXkoImh0dHA6Ly8iLCAi aHR0cHM6Ly8iLCAiZnRwOi8vIiwgImZ0cHM6Ly8iLCAibWFpbHRvOiIpOwoKCSRzZWN0aW9u ID0gKCRzZWN0aW9uID09ICJkZWZhdWx0IikgPyAiIiA6ICRzZWN0aW9uOwoJJHBfb3V0ID0g IiI7Cglmb3IgKCRpID0gMDsgJGkgPCBjb3VudCgkbmF2YmFyKTsgJGkrKykgewoJCWlmICgk aSA9PSAwKSB7CgkJCSRsaUF0dHMgPSBha29fcGFyc2VfaWQoJG5hdmJhclskaV1bImxpaWQi XSkgLiBha29fcGFyc2VfY2xhc3MoJG5hdmJhclskaV1bImxpY2xhc3MiXSwgZmFsc2UsICRu YXZiYXJbJGldWyJsaWZjaGlsZCJdKTsKCQl9IGVsc2UgaWYgKCRpID09IChjb3VudCgkbmF2 YmFyKSAtIDEpKSB7CgkJCSRsaUF0dHMgPSBha29fcGFyc2VfaWQoJG5hdmJhclskaV1bImxp aWQiXSkgLiBha29fcGFyc2VfY2xhc3MoJG5hdmJhclskaV1bImxpY2xhc3MiXSwgZmFsc2Us ICRuYXZiYXJbJGldWyJsaWxjaGlsZCJdKTsKCQl9IGVsc2UgewoJCQkkbGlBdHRzID0gYWtv X3BhcnNlX2lkKCRuYXZiYXJbJGldWyJsaWlkIl0pIC4gYWtvX3BhcnNlX2NsYXNzKCRuYXZi YXJbJGldWyJsaWNsYXNzIl0sIGZhbHNlKTsKCQl9CgkJaWYgKCFlbXB0eSgkbmF2YmFyWyRp XVsidXJsIl0pKSB7CgkJCS8vIHRoZXJlIGlzIGEgbGluawoJCQlpZiAoYWtvX2NsYXNzQWN0 aXZlaXplKCRzZWN0aW9uLCAkbmF2YmFyWyRpXVsidXJsIl0pKSB7CgkJCQkkcF9vdXQgLj0g dGFnKCRuYXZiYXJbJGldWyJuYW1lIl0sICJsaSIsICRsaUF0dHMpLm47CgkJCX0gZWxzZSB7 CgkJCQkkYUF0dHMgID0gIiBocmVmPVwiIi4gKCgkZnVsbFVybCB8fCAoc3RycG9zKCRuYXZi YXJbJGldWyJ1cmwiXSwgJHBzKSAhPT0gZmFsc2UpKQoJCQkJCT8gJG5hdmJhclskaV1bInVy bCJdCgkJCQkJOiAkcC4kc2l0ZXVybC4kbmF2YmFyWyRpXVsidXJsIl0pIC4iXCIiOwoJCQkJ JGFBdHRzIC49IGFrb19wYXJzZV90aXRsZSgkbmF2YmFyWyRpXVsidGl0bGUiXSk7CgkJCQkk YUF0dHMgLj0gIiBhY2Nlc3NrZXk9XCIiLiAkbmF2YmFyWyRpXVsiYWNjZXNza2V5Il0gLiJc IiI7CgkJCQlpZiAoJGkgPT0gMCkgewoJCQkJCSRhQXR0cyAuPSBha29fcGFyc2VfY2xhc3Mo JG5hdmJhclskaV1bImFjbGFzcyJdLCBmYWxzZSwgJG5hdmJhclskaV1bImFmY2hpbGQiXSk7 CgkJCQl9IGVsc2UgaWYgKCRpID09IChjb3VudCgkbmF2YmFyKSAtIDEpKSB7CgkJCQkJJGFB dHRzIC49IGFrb19wYXJzZV9jbGFzcygkbmF2YmFyWyRpXVsiYWNsYXNzIl0sIGZhbHNlLCAk bmF2YmFyWyRpXVsiYWxjaGlsZCJdKTsKCQkJCX0gZWxzZSB7CgkJCQkJJGFBdHRzIC49IGFr b19wYXJzZV9jbGFzcygkbmF2YmFyWyRpXVsiYWNsYXNzIl0sIGZhbHNlKTsKCQkJCX0KCQkJ CSRhQXR0cyAuPSBha29fcGFyc2VfaWQoJG5hdmJhclskaV1bImFpZCJdKTsKCgkJCQkkbGlM aW5rID0gdGFnKCRuYXZiYXJbJGldWyJuYW1lIl0sICJhIiwgJGFBdHRzKTsKCQkJCSRwX291 dCAuPSB0YWcoJGxpTGluaywgImxpIiwgJGxpQXR0cykubjsKCQkJfQoJCX0gZWxzZSB7CgkJ CS8vIG5vIGxpbmssIGp1c3QgdGV4dAoJCQkkcF9vdXQgLj0gdGFnKCRuYXZiYXJbJGldWyJu YW1lIl0sICJsaSIsICRsaUF0dHMpLm47CgkJfQoJfQoJcmV0dXJuKCRwX291dCk7Cn0KCgpm dW5jdGlvbiBha29fcGFyc2VfbGlfNCgkbmF2YmFyLCAkZnVsbFVybCkgewoJLy8gbm8gbGlu ayB0byBjdXJyZW50IHNlbGVjdGlvbiwgYWRkIGNsYXNzPSJhY3RpdmUiIHRvIGxpc3QgaXRl bXMKCWdsb2JhbCAkcHJldGV4dCwgJHNpdGV1cmw7Cgkkc2VjdGlvbiA9ICRwcmV0ZXh0Wydz J107CgoJJHAgPSAoZGVmaW5lZCgnUFJPVE9DT0wnKSkgPyBQUk9UT0NPTCA6ICdodHRwOi8v JzsKCSRwcyA9IGFycmF5KCJodHRwOi8vIiwgImh0dHBzOi8vIiwgImZ0cDovLyIsICJmdHBz Oi8vIiwgIm1haWx0bzoiKTsKCgkkc2VjdGlvbiA9ICgkc2VjdGlvbiA9PSAiZGVmYXVsdCIp ID8gIiIgOiAkc2VjdGlvbjsKCSRwX291dCA9ICIiOwoJZm9yICgkaSA9IDA7ICRpIDwgY291 bnQoJG5hdmJhcik7ICRpKyspIHsKCQlpZiAoJGkgPT0gMCkgewoJCQkkbGlBdHRzID0gYWtv X3BhcnNlX2lkKCRuYXZiYXJbJGldWyJsaWlkIl0pIC4gYWtvX3BhcnNlX2NsYXNzKCRuYXZi YXJbJGldWyJsaWNsYXNzIl0sIGFrb19jbGFzc0FjdGl2ZWl6ZSgkc2VjdGlvbiwgJG5hdmJh clskaV1bInVybCJdKSwgJG5hdmJhclskaV1bImxpZmNoaWxkIl0pOwoJCX0gZWxzZSBpZiAo JGkgPT0gKGNvdW50KCRuYXZiYXIpIC0gMSkpIHsKCQkJJGxpQXR0cyA9IGFrb19wYXJzZV9p ZCgkbmF2YmFyWyRpXVsibGlpZCJdKSAuIGFrb19wYXJzZV9jbGFzcygkbmF2YmFyWyRpXVsi bGljbGFzcyJdLCBha29fY2xhc3NBY3RpdmVpemUoJHNlY3Rpb24sICRuYXZiYXJbJGldWyJ1 cmwiXSksICRuYXZiYXJbJGldWyJsaWZjaGlsZCJdKTsKCQl9IGVsc2UgewoJCQkkbGlBdHRz ID0gYWtvX3BhcnNlX2lkKCRuYXZiYXJbJGldWyJsaWlkIl0pIC4gYWtvX3BhcnNlX2NsYXNz KCRuYXZiYXJbJGldWyJsaWNsYXNzIl0sIGFrb19jbGFzc0FjdGl2ZWl6ZSgkc2VjdGlvbiwg JG5hdmJhclskaV1bInVybCJdKSk7CgkJfQoJCWlmICghZW1wdHkoJG5hdmJhclskaV1bInVy bCJdKSkgewoJCQkvLyB0aGVyZSBpcyBhIGxpbmsKCQkJaWYgKGFrb19jbGFzc0FjdGl2ZWl6 ZSgkc2VjdGlvbiwgJG5hdmJhclskaV1bInVybCJdKSkgewoJCQkJLy8gd2UncmUgaW4gY3Vy cmVudCBzZWN0aW9uLCBubyBsaW5rIHRvIGl0CgkJCQkkcF9vdXQgLj0gdGFnKCRuYXZiYXJb JGldWyJuYW1lIl0sICJsaSIsICRsaUF0dHMpLm47CgkJCX0gZWxzZSB7CgkJCQkvLyBub3Qg aW4gY3VycmVudCBzZWN0aW9uLCBsaW5rIHRvIHRob3NlLgoJCQkJJGFBdHRzICA9ICIgaHJl Zj1cIiIuICgoJGZ1bGxVcmwgfHwgKHN0cnBvcygkbmF2YmFyWyRpXVsidXJsIl0sICRwcykg IT09IGZhbHNlKSkKCQkJCQk/ICRuYXZiYXJbJGldWyJ1cmwiXQoJCQkJCTogJHAuJHNpdGV1 cmwuJG5hdmJhclskaV1bInVybCJdKSAuIlwiIjsKCQkJCSRhQXR0cyAuPSBha29fcGFyc2Vf dGl0bGUoJG5hdmJhclskaV1bInRpdGxlIl0pOwoJCQkJJGFBdHRzIC49ICIgYWNjZXNza2V5 PVwiIi4gJG5hdmJhclskaV1bImFjY2Vzc2tleSJdIC4iXCIiO2lmICgkaSA9PSAwKSB7CgkJ CQkJJGFBdHRzIC49IGFrb19wYXJzZV9jbGFzcygkbmF2YmFyWyRpXVsiYWNsYXNzIl0sIGZh bHNlLCAkbmF2YmFyWyRpXVsiYWZjaGlsZCJdKTsKCQkJCX0gZWxzZSBpZiAoJGkgPT0gKGNv dW50KCRuYXZiYXIpIC0gMSkpIHsKCQkJCQkkYUF0dHMgLj0gYWtvX3BhcnNlX2NsYXNzKCRu YXZiYXJbJGldWyJhY2xhc3MiXSwgZmFsc2UsICRuYXZiYXJbJGldWyJhbGNoaWxkIl0pOwoJ CQkJfSBlbHNlIHsKCQkJCQkkYUF0dHMgLj0gYWtvX3BhcnNlX2NsYXNzKCRuYXZiYXJbJGld WyJhY2xhc3MiXSwgZmFsc2UpOwoJCQkJfQoJCQkJJGFBdHRzIC49IGFrb19wYXJzZV9pZCgk bmF2YmFyWyRpXVsiYWlkIl0pOwoKCQkJCSRsaUxpbmsgPSB0YWcoJG5hdmJhclskaV1bIm5h bWUiXSwgImEiLCAkYUF0dHMpOwoJCQkJJHBfb3V0IC49IHRhZygkbGlMaW5rLCAibGkiLCAk bGlBdHRzKS5uOwoJCQl9CgkJfSBlbHNlIHsKCQkJLy8gbm8gbGluaywganVzdCB0ZXh0CgkJ CSRwX291dCAuPSB0YWcoJG5hdmJhclskaV1bIm5hbWUiXSwgImxpIiwgJGxpQXR0cykubjsK CQl9Cgl9CglyZXR1cm4oJHBfb3V0KTsKfQoKCmZ1bmN0aW9uIGFrb19jbGFzc0FjdGl2ZWl6 ZSgkc2VjLCAkbmlVcmwpIHsgLy8gc2VjdGlvbiwgbmF2YmFyW2ldW3VybF0KCXJldHVybiAo KHN0cnBvcygkc2VjLCBzdWJzdHIoJG5pVXJsLCAxKSkgIT09IGZhbHNlKSB8fCAoISRzZWMg JiYgKCFzdWJzdHIoJG5pVXJsLCAxKSkpKTsKLy8JcmV0dXJuICggKHN0cnBvcygkc2VjLCBz dWJzdHIoJG5pVXJsLCAxKSkgIT09IGZhbHNlKSB8fCAoISRzZWMgJiYgKCFzdWJzdHIoJG5p VXJsLCAxKSkpIHx8IChzdHJwb3MoJHNlYy4iLyIsIHN1YnN0cigkbmlVcmwsIDEpKSAhPT0g ZmFsc2UpICk7Cn0KCmZ1bmN0aW9uIGFrb19wYXJzZV90aXRsZSgkdGl0bGUpIHsKCXJldHVy bigoZW1wdHkoJHRpdGxlKSkKCQk/CSIiCgkJOgkiIHRpdGxlPVwiJHRpdGxlXCIiKTsKfQoK ZnVuY3Rpb24gYWtvX3BhcnNlX2lkKCRpZCkgewoJcmV0dXJuKChlbXB0eSgkaWQpKQoJCT8J IiIKCQk6CSIgaWQ9XCIkaWRcIiIpOwp9CgpmdW5jdGlvbiBha29fcGFyc2VfY2xhc3MoJGNs YXNzLCAkYWN0aXZlLCAkY2hpbGQgPSAnJykgeyAvLyBhID0+IGJvb2wsIHRydWU9aXRzIGFj dGl2ZQoJZ2xvYmFsICRhY3RpY2xhc3M7CglpZiAoJGFjdGl2ZSkgewoJCSRwX291dCA9IChl bXB0eSgkY2xhc3MpKQoJCQk/CShlbXB0eSgkY2hpbGQpID8gIiBjbGFzcz1cIiRhY3RpY2xh c3NcIiIgOiAiIGNsYXNzPVwiJGFjdGljbGFzcyAkY2hpbGRcIiIpCgkJCToJKGVtcHR5KCRj aGlsZCkgPyAiIGNsYXNzPVwiJGNsYXNzICRhY3RpY2xhc3NcIiIgOiAiIGNsYXNzPVwiJGNs YXNzICRhY3RpY2xhc3MgJGNoaWxkXCIiKTsKCX0gZWxzZSB7CgkJJHBfb3V0ID0gKGVtcHR5 KCRjbGFzcykpCgkJCT8JKGVtcHR5KCRjaGlsZCkgPyAiIiA6ICIgY2xhc3M9XCIkY2hpbGRc IiIpCgkJCToJKGVtcHR5KCRjaGlsZCkgPyAiIGNsYXNzPVwiJGNsYXNzXCIiIDogIiBjbGFz cz1cIiRjbGFzcyAkY2hpbGRcIiIpOwoJfQoJcmV0dXJuKCRwX291dCk7Cn0KCi8vIGlmIG5v IHBhZ2VzIC8gdXJscyBhcmUgc3BlY2lmaWVkLgpmdW5jdGlvbiBha29fbmF2X2hlbHAoJGVy cm9yKSB7CgkkZXJyID0gc3Ryb25nKCJXYXJuaW5nOiIpOwoJJGxpbmsgPSB0YWcoImhlbHAg ZmlsZSIsICJhIiwgJyBocmVmPSJodHRwOi8vd3d3LmFrby1rLmNvbS9hcmNoaXZlLzEwOCIg dGl0bGU9IkhlbHAgZmlsZSBmb3IgYWtvX25hdiInKTsKCXJldHVybihncmFmKCRlcnIuIiBO byBwYWdlICIuJGVycm9yLiImIzgyMTc7cyBzcGVjaWZpZWQgaW4gYXR0cmlidXRlcyBmb3Ig YWtvX25hdi4gIFBsZWFzZSBzZWUgdGhlICRsaW5rIGZvciBtb3JlIGluZm9ybWF0aW9uLiIu bikpOwp9Ci8vIENvbmdyYXR1bGF0aW9ucyEKLy8gWW91J3ZlIG1hZGUgaXQgdG8gdGhlIGVu ZCBvZiBteSBjb2RlLi4uIjtzOjg6ImhlbHBfcmF3IjtzOjUwMjQ6ImgyLiBha29fbmF2IEhl bHAgRmlsZQoKaDMuIEEgZHluYW1pYyBwb3J0YWJsZSBuYXZpZ2F0aW9uIGNyZWF0b3IuCgpo NC4gV2hhdCBkb2VzIGl0IGRvPwoKKiBDcmVhdGVzIGEgcHJpbWFyeSBAZGl2QCAob3B0aW9u YWxseSkuCiogSW5zaWRlIHRoZSBAZGl2QCwgYSBoZWFkaW5nIGlzIGFkZGVkIGZvciB0aGUg bmF2IGJhciAob3B0aW9uYWxseSkuCiogQ3JlYXRlcyBhIEB1bEAgdG8gaG9sZCB0aGUgbmF2 IGJhci4KKiBHb2VzIHRocm91Z2ggZ2l2ZW4gdXJscyBhbmQgbmFtZXMgb2YgcGFnZXMgYW5k IGR5bm1pY2FsbHkgYWRkcyB0aGVtIGFzIEBsaUAncwoqIEBjbGFzcz0iYWN0aXZlIkAgaXMg YXV0b21hdGljYWxseSBhZGRlZCB0byB0aGUgY3VycmVudCBwYWdlJ3MgQGFAIHRhZyAob3Ig b3B0aW9uYWxseSwgQGxpQCB0YWcpLgoKCmg0LiBFeGFtcGxlcwoKVGhlIHNpbXBsZXN0IGZv cm0gaXMgdGhpczoKCmJxLiBAPHR4cDpha29fbmF2IG5hbWU9ImhvbWUsYWJvdXQsY29udGFj dCIgdXJsPSIvLC9hYm91dCwvY29udGFjdCIgLz5ACgppdCB3aWxsIHByb2R1Y2Ugc29tZXRo aW5nIGxpa2UgdGhpczoKCmJxLiA8cHJlPjxkaXY+CjxoMj5OYXZpZ2F0aW9uPC9oMj4KCTx1 bD4KCQk8bGk+PGEgaHJlZj0iLyI+aG9tZTwvYT48L2xpPgoJCTxsaT48YSBocmVmPSIvYWJv dXQiPmFib3V0PC9hPjwvbGk+CgkJPGxpPjxhIGhyZWY9Ii9jb250YWN0Ij5jb250YWN0PC9h PjwvbGk+Cgk8L3VsPgo8L2Rpdj48L3ByZT4KCkFkZCBzb21lIG9mIHRoZSB0YWdzIGJlbG93 IHRvIGdldCBhIGxvdCBtb3JlIGNyZWF0aXZlLgoKCmg0LiBQbGVhc2Ugbm90ZToKClRoZSB1 cmwgYXR0cmlidXRlcyBzaG91bGQgYmUgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgeW91ciBz aXRlLiAgVGhhdCBpcywgaWYgeW91IGFyZSBydW5uaW5nIHlvdXIgc2l0ZSBvdXQgb2YgYSBz dWJkaXJlY3RvcnksIHlvdSBkbyAqbm90KiBuZWVkIHRvIGluY2x1ZGUgdGhlIHN1YmRpcmVj dG9yeSBpbiB0aGUgdXJsIGF0dHJpYnV0ZS4gIChJbiBmYWN0LCBkb24ndCBpbmNsdWRlIGl0 LikKRm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgcnVubmluZyB5b3VyIHNpdGUgYXQgaHR0cDov L3d3dy5ha28tay5jb20vd293LywgYW5kIHlvdSB3YW50ZWQgdG8gdXNlIGFrb19uYXYgdG8g bWFrZSBhIG5hdmlnYXRpb24gYmFyIHRvIHRoZSBhYm91dCBhbmQgbGlua3MgcGFnZSwgdGhl IGNvZGUgd291bGQgYmUKCmJxLiBAPHR4cDpha29fbmF2IG5hbWU9ImhvbWUsYWJvdXQsY29u dGFjdCIgdXJsPSIvLC9hYm91dCwvbGlua3MiIC8+QAphbmQgbm90Ci1APHR4cDpha29fbmF2 IG5hbWU9ImhvbWUsYWJvdXQsY29udGFjdCIgdXJsPSIvd293Lywvd293L2Fib3V0LC93b3cv bGlua3MiIC8+QC0KCgpoNC4gVGFncwoKKiBfUmVxdWlyZWRfCioqICpuYW1lKiAtIFRoaXMg aXMgYSBsaXN0IG9mIHBhZ2UgbmFtZXMsIGRlbGltaXRlZCBieSBjb21tYXMgKGFuZCBubyBz cGFjZXMpLCB1bmxlc3MgdGhlICJkZWxpbSIgYXR0cmlidXRlIGlzIHNldCBhcyBzb21ldGhp bmcgZWxzZS4KKiogKnVybCogLSBUaGlzIGlzIGEgbGlzdCBvZiBwYWdlIHVybCdzLCBmb2xs b3dpbmcgdGhlIHNhbWUgb3JkZXIgYXMgdGhlIHBhZ2UgbmFtZXMsIGFuZCBhbHNvIGRlbGlt aXRlZCBieSBjb21tYXMgKGFuZCBubyBzcGFjZXMpLCB1bmxlc3MgdGhlICJkZWxpbSIgYXR0 cmlidXRlIGlzIHNldCBhcyBzb21ldGhpbmcgZWxzZS4KKiBfT3B0aW9uYWxfCioqICp0aXRs ZSogLSBUaGlzIGlzIGEgbGlzdCBvZiBAdGl0bGVAIGF0dHJpYnV0ZXMgZm9yIHRoZSBAYUAg dGFncywgZGVsaW1pdGVkIGJ5IGNvbW1hcyAoYW5kIG5vIHNwYWNlcyksIHVubGVzcyB0aGUg ImRlbGltIiBhdHRyaWJ1dGUgaXMgc2V0IGFzIHNvbWV0aGluZyBlbHNlLgoqKiAqdWxpZCog LSBUaGlzIGlzIGFuIGlkIGZvciB0aGUgQHVsQCB0YWcuCioqICp1bGNsYXNzKiAtIFRoaXMg aXMgYSBjbGFzcyBmb3IgdGhlIEB1bEB0YWcuCioqICpsaWlkcyogLSBUaGlzIGlzIGEgbGlz dCBvZiBpZCBhdHRyaWJ1dGVzIGZvciB0aGUgQGxpQCB0YWcsIGRlbGltaXRlZCBieSBjb21t YXMgKGFuZCBubyBzcGFjZXMpLCB1bmxlc3MgdGhlICJkZWxpbSIgYXR0cmlidXRlIGlzIHNl dCBhcyBzb21ldGhpbmcgZWxzZS4KKiogKmxpY2xhc3MqIC0gVGhpcyBpcyBhIGNsYXNzIGZv ciB0aGUgQGxpQHRhZy4KKiogKmFmY2hpbGQqIC0gJXtjb2xvcjpyZWR9IE5ldyBpbiAxLjAh JSBUaGlzIGlzIGFuIGFkZGl0aW9uYWwgY2xhc3MgYXR0cmlidXRlIGZvciB0aGUgQGxpQCB0 YWcsIG9ubHkgYXBwbGllZCB0byB0aGUgX2ZpcnN0XyBpdGVtIGluIHRoZSBsaXN0LgoqKiAq YWxjaGlsZCogLSAle2NvbG9yOnJlZH0gTmV3IGluIDEuMCElIFRoaXMgaXMgYW4gYWRkaXRp b25hbCBjbGFzcyBhdHRyaWJ1dGUgZm9yIHRoZSBAbGlAIHRhZywgb25seSBhcHBsaWVkIHRv IHRoZSBfbGFzdF8gaXRlbSBpbiB0aGUgbGlzdC4KKiogKmFpZHMqIC0gVGhpcyBpcyBhIGxp c3Qgb2YgaWQgYXR0cmlidXRlcyBmb3IgdGhlIEBhQCB0YWdzLCBkZWxpbWl0ZWQgYnkgY29t bWFzIChhbmQgbm8gc3BhY2VzKSwgdW5sZXNzIHRoZSAiZGVsaW0iIGF0dHJpYnV0ZSBpcyBz ZXQgYXMgc29tZXRoaW5nIGVsc2UuCioqICphY2xhc3MqIC0gVGhpcyBpcyBhIGNsYXNzIGZv ciB0aGUgQGFAdGFnLgoqKiAqYWZjaGlsZCogLSAle2NvbG9yOnJlZH0gTmV3IGluIDEuMCEl IFRoaXMgaXMgYW4gYWRkaXRpb25hbCBjbGFzcyBhdHRyaWJ1dGUgZm9yIHRoZSBAYUAgdGFn LCBvbmx5IGFwcGxpZWQgdG8gdGhlIF9maXJzdF8gaXRlbSBpbiB0aGUgbGlzdC4KKiogKmFs Y2hpbGQqIC0gJXtjb2xvcjpyZWR9IE5ldyBpbiAxLjAhJSBUaGlzIGlzIGFuIGFkZGl0aW9u YWwgY2xhc3MgYXR0cmlidXRlIGZvciB0aGUgQGFAIHRhZywgb25seSBhcHBsaWVkIHRvIHRo ZSBfbGFzdF8gaXRlbSBpbiB0aGUgbGlzdC4KKiogKnNwYW53cmFwKiAtIFRoaXMgaXMgZm9y IHdoZXRoZXIgb3Igbm90IHRoZSB0ZXh0IGlzIHdyYXBwZWQgaW4gQHNwYW5AIHRhZ3MuICAw ID0gbm90IHdyYXBwZWQsIDEgPSB3cmFwcGVkLiBCeSBkZWZhdWx0LCBpdCBpcyBub3Qgd3Jh cHBlZCAoMCkuCioqICpzcGFuY2xhc3MqIC0gVGhpcyBpcyBhIGNsYXNzIGZvciB0aGUgQHNw YW5AdGFnLgoqKiAqc3BhbmlkcyogLSAle2NvbG9yOnJlZH0gTmV3IGluIDEuMCElICBUaGlz IGlzIGEgbGlzdCBvZiBpZCBhdHRyaWJ1dGVzIGZvciB0aGUgQHNwYW5AIHRhZywgZGVsaW1p dGVkIGJ5IGNvbW1hcyAoYW5kIG5vIHNwYWNlcyksIHVubGVzcyB0aGUgImRlbGltIiBhdHRy aWJ1dGUgaXMgc2V0IGFzIHNvbWV0aGluZyBlbHNlLgoqKiAqZGl2aWQqIC0gVGhpcyBpcyBh biBpZCBmb3IgdGhlIEBkaXZAIGNvbnRhaW5lci4KKiogKmRpdmNsYXNzKiAtIFRoaXMgaXMg YSBjbGFzcyBmb3IgdGhlIEBkaXZAIGNvbnRhaW5lci4KKiogKmRpdm9uKiAtIFRoaXMgaXMg Zm9yIHdoZXRoZXIgb3Igbm90IHRoZSBAZGl2QCBpcyBkaXNwbGF5ZWQuICAwID0gbm90IGRp c3BsYXllZCwgMSA9IGRpc3BsYXllZC4gQnkgZGVmYXVsdCwgaXQgaXMgZGlzcGxheWVkICgx KS4KKiogKmhlYWRpZCogLSBUaGlzIGlzIGFuIGlkIGZvciB0aGUgaGVhZGVyIHRhZy4KKiog KmhlYWRjbGFzcyogLSBUaGlzIGlzIGEgY2xhc3MgZm9yIHRoZSBoZWFkZXIgdGFnLgoqKiAq aGVhZG9uKiAtIFRoaXMgaXMgZm9yIHdoZXRoZXIgb3Igbm90IHRoZSBoZWFkZXIgdGV4dCBp cyBkaXNwbGF5ZWQuICAwID0gbm90IGRpc3BsYXllZCwgMSA9IGRpc3BsYXllZC4gQnkgZGVm YXVsdCwgaXQgaXMgZGlzcGxheWVkICgxKS4KKiogKmhlYWR0eHQqIC0gVGhpcyBpcyB0aGUg dGV4dCBpbnNpZGUgdGhlIGhlYWRlciBpdHMgc2VsZi4gIEJ5IGRlZmF1bHQsIHRoaXMgaXMg Ik5hdmlnYXRpb24iLgoqKiAqaGVhZGx2bCogLSBUaGlzIGlzIHRoZSBsZXZlbCB0aGF0IHRo ZSBAaEAgdGFnIGlzLCBiZXR3ZWVuIDEgYW5kIDYuICBCeSBkZWZhdWx0LCB0aGlzIGlzIDIu CioqICpjdXJsaW5rKiAtIFRoaXMgaXMgYW4gb3B0aW9uIGFzIHRvIHdoZXRoZXIgb3Igbm90 IHRoZSBjdXJyZW50IHNlY3Rpb24gaXMgbGlua2VkLiAgMCA9IG5vdCBsaW5rZWQsIDEgPSBs aW5rZWQuICBCeSBkZWZhdWx0LCBpdCBpcyBsaW5rZWQgKDEpLgoqKiAqY2xhc3N0YWcqIC0g VGhpcyBpcyBhbiBvcHRpb24gd2hpY2ggYWxsb3dzIHlvdSB0byBhZGQgdGhlIEBjbGFzcz0i YWN0aXZlIkAgdG8gZWl0aGVyIHRoZSBAYUAgb3IgdGhlIEBsaUAgdGFnLiAgMCA9IGl0IGlz IGFkZGVkIHRvIHRoZSBAYUAgdGFnLCAxID0gaXQgaXMgYWRkZWQgdG8gdGhlIEBsaUAgdGFn LiAgQnkgZGVmYXVsdCwgaXQgaXMgYWRkZWQgdG8gdGhlIEBhQCB0YWcgKDApLgoqKiAqYWN0 aWNsYXNzKiAtICV7Y29sb3I6cmVkfSBOZXcgaW4gMS4wISUgVGhpcyBpcyBhbiBvcHRpb24g dG8gY2hhbmdlIHRoZSB0aGUgQGNsYXNzPSJhY3RpdmUiQCB0byB3aGF0ZXZlciB5b3Ugd291 bGQgbGlrZS4gQnkgZGVmYXVsdCwgdGhpcyBpcyAiYWN0aXZlIi4KKiogKmRlbGltKiAtICV7 Y29sb3I6cmVkfSBOZXcgaW4gMS4wISUgVGhpcyBpcyB0aGUgY2hhcmFjdGVyKHMpIHdoaWNo IHdpbGwgYWN0IGFzIGEgZGVsaW1pdGVyIGZvciB0aGUgb3RoZXIgYXR0cmlidXRlcyB3aGlj aCB0YWtlIGEgbGlzdCwgc3VjaCBhcyAibmFtZSwiICJ1cmwsIiBldGMuICBCeSBkZWZhdWx0 LCB0aGlzIGlzIGEgY29tbWEgKCIsIikgYnV0IGNhbiBiZSBjaGFuZ2VkIHRvIGFueSBvdGhl ciBjaGFyYWN0ZXIocykuCioqICphY2Nlc3NrZXlzKiAtICV7Y29sb3I6cmVkfSBOZXcgaW4g MS4wISUgVGhpcyBpcyBhIGxpc3Qgb2YgYWNjZXNza2V5IGF0dHJpYnV0ZXMgZm9yIHRoZSBA YUAgdGFncywgZGVsaW1pdGVkIGJ5IGNvbW1hcyAoYW5kIG5vIHNwYWNlcyksIHVubGVzcyB0 aGUgImRlbGltIiBhdHRyaWJ1dGUgaXMgc2V0IGFzIHNvbWV0aGluZyBlbHNlLgoKPGhyIC8+ ClRoYW5rcyBmb3IgdXNpbmcgKmFrb19uYXYqLCBhbmQgaGF2ZSBmdW4hIjtzOjM6Im1kNSI7 czozMjoiOWM4NzRlM2IyNjY3MThkNmEwYjY4NjFhMThkMzE4MDciO3M6ODoiY29tcHJlc3Mi O2I6MDt9