# Name: soo_txp_obj v1.1.2 # Type: Library plugin # Support library for Txp plugins # Author: Jeff Soo # URL: http://ipsedixit.net/txp/ # 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: # ..................................................................... YToxMTp7czo0OiJuYW1lIjtzOjExOiJzb29fdHhwX29iaiI7czo2OiJhdXRob3IiO3M6ODoi SmVmZiBTb28iO3M6MTA6ImF1dGhvcl91cmkiO3M6MjU6Imh0dHA6Ly9pcHNlZGl4aXQubmV0 L3R4cC8iO3M6NzoidmVyc2lvbiI7czo1OiIxLjEuMiI7czoxMToiZGVzY3JpcHRpb24iO3M6 MzE6IlN1cHBvcnQgbGlicmFyeSBmb3IgVHhwIHBsdWdpbnMiO3M6NDoiaGVscCI7czo3OTg2 OiI8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgpkaXYjc2VkX2hlbHAgcHJlIHtwYWRkaW5nOiAw LjVlbSAxZW07IGJhY2tncm91bmQ6ICNlZWU7IGJvcmRlcjogMXB4IGRhc2hlZCAjY2NjO30K ZGl2I3NlZF9oZWxwIGgxLCBkaXYjc2VkX2hlbHAgaDIsIGRpdiNzZWRfaGVscCBoMywgZGl2 I3NlZF9oZWxwIGgzIGNvZGUge2ZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOyBmb250LXdlaWdo dDogYm9sZDt9CmRpdiNzZWRfaGVscCBoMSwgZGl2I3NlZF9oZWxwIGgyLCBkaXYjc2VkX2hl bHAgaDMge21hcmdpbi1sZWZ0OiAtMWVtO30KZGl2I3NlZF9oZWxwIGgyLCBkaXYjc2VkX2hl bHAgaDMge21hcmdpbi10b3A6IDJlbTt9CmRpdiNzZWRfaGVscCBoMSB7Zm9udC1zaXplOiAy LjRlbTt9CmRpdiNzZWRfaGVscCBoMiB7Zm9udC1zaXplOiAxLjhlbTt9CmRpdiNzZWRfaGVs cCBoMyB7Zm9udC1zaXplOiAxLjRlbTt9CmRpdiNzZWRfaGVscCBoNCB7Zm9udC1zaXplOiAx LjJlbTt9CmRpdiNzZWRfaGVscCBoNSB7Zm9udC1zaXplOiAxZW07bWFyZ2luLWxlZnQ6MWVt O2ZvbnQtc3R5bGU6b2JsaXF1ZTt9CmRpdiNzZWRfaGVscCB1bCBsaSB7bGlzdC1zdHlsZS10 eXBlOiBkaXNjO30KZGl2I3NlZF9oZWxwIHVsIGxpIGxpIHtsaXN0LXN0eWxlLXR5cGU6IGNp cmNsZTt9CmRpdiNzZWRfaGVscCB1bCBsaSBsaSBsaSB7bGlzdC1zdHlsZS10eXBlOiBzcXVh cmU7fQpkaXYjc2VkX2hlbHAgbGkgYSBjb2RlIHtmb250LXdlaWdodDogbm9ybWFsO30KZGl2 I3NlZF9oZWxwIGxpIGNvZGU6Zmlyc3QtY2hpbGQge2JhY2tncm91bmQ6ICNkZGQ7cGFkZGlu ZzowIC4zZW07bWFyZ2luLWxlZnQ6LS4zZW07fQpkaXYjc2VkX2hlbHAgbGkgbGkgY29kZTpm aXJzdC1jaGlsZCB7YmFja2dyb3VuZDpub25lO3BhZGRpbmc6MDttYXJnaW4tbGVmdDowO30K ZGl2I3NlZF9oZWxwIGRmbiB7Zm9udC13ZWlnaHQ6Ym9sZDtmb250LXN0eWxlOm9ibGlxdWU7 fQpkaXYjc2VkX2hlbHAgLnJlcXVpcmVkLCBkaXYjc2VkX2hlbHAgLndhcm5pbmcge2NvbG9y OnJlZDt9CmRpdiNzZWRfaGVscCAuZGVmYXVsdCB7Y29sb3I6Z3JlZW47fQpkaXYjc2VkX2hl bHAgc3VwIHtsaW5lLWhlaWdodDowO30KPC9zdHlsZT4KCTxwPjxkaXYgaWQ9InNlZF9oZWxw Ij48L3A+CgoJPGgxPnNvb190eHBfb2JqPC9oMT4KCgk8cD5BIHN1cHBvcnQgbGlicmFyeSBm b3IgVGV4dHBhdHRlcm4gcGx1Z2lucy48L3A+CgoJPHVsPgoJCTxsaT48YSBocmVmPSJodHRw Oi8vaXBzZWRpeGl0Lm5ldC90eHAvMjEvc29vLXR4cC1vYmoiPkluZm9ybWF0aW9uIGFuZCBl eGFtcGxlczwvYT48L2xpPgoJCTxsaT48YSBocmVmPSJodHRwOi8vaXBzZWRpeGl0Lm5ldC9h cGkvc29vX3R4cF9vYmovIj48c3BhbiBjbGFzcz0iY2FwcyI+QVBJPC9zcGFuPiBEb2N1bWVu dGF0aW9uPC9hPjwvbGk+Cgk8L3VsPgoKCTxoMiBpZD0iaGlzdG9yeSI+VmVyc2lvbiBoaXN0 b3J5PC9oMj4KCgk8aDMgaWQ9IjFfMV8yIj4xLjEuMjwvaDM+CgoJPHA+MjAxNy0wMi0xNTwv cD4KCgk8dWw+CgkJPGxpPlRleHRwYXR0ZXJuIDQuNiBjb21wYXRpYmlsaXR5IHVwZGF0ZS4g KEJyZWFrcyBjb21wYXRpYmlsaXR5IHdpdGggZWFybGllciB2ZXJzaW9ucyBvZiBUZXh0cGF0 dGVybi4pPC9saT4KCTwvdWw+CgoJPGgzIGlkPSIxXzFfMSI+MS4xLjE8L2gzPgoKCTxwPjIw MTIvMDEvMjU8L3A+CgoJPHVsPgoJCTxsaT5Nb3ZlZCBzb29fdHhwX2xlZnRfam9pbjo6Y291 bnQoKSB0byBwYXJlbnQgY2xhc3MgKHNvb190eHBfc2VsZWN0KTwvbGk+CgkJPGxpPkJ1Z2Zp eC91cGRhdGUgZm9yIHNvb191cmk6IGFtcGVyc2FuZHMgbm93IGVuY29kZWQvZGVjb2RlZCBh cHByb3ByaWF0ZWx5PC9saT4KCTwvdWw+CgoJPGgzIGlkPSIxXzFfMCI+MS4xLjA8L2gzPgoK CTxwPjIwMTEvMDEvMDc8L3A+CgoJPHVsPgoJCTxsaT5zb29fdHhwX3NlbGVjdDo6ZGlzdGlu Y3QoKSBmb3IgPGNvZGU+U0VMRUNUIERJU1RJTkNUPC9jb2RlPiBxdWVyaWVzPC9saT4KCQk8 bGk+QnVnZml4OiBzb29fdHhwX2xlZnRfam9pbiBub3cgd29ya3Mgd2l0aCBkYXRhYmFzZSB0 YWJsZSBwcmVmaXhlczwvbGk+Cgk8L3VsPgoKCTxoMyBpZD0iYjkiPjEuMS5iLjE8L2gzPgoK CTxwPjkvMTIvMjAxMDwvcD4KCgk8cD48ZW0+Tm90ZTogdGhpcyBjaGFuZ2VsaXN0IGluY2x1 ZGVzIGl0ZW1zIGZyb20gdGhlIDEuMC5iLjkgYW5kIDEuMC5iLjEwIHJlbGVhc2VzPC9lbT48 L3A+CgoJPHVsPgoJCTxsaT5OZXcgY2xhc3MsIDxzdHJvbmc+c29vX3R4cF9sZWZ0X2pvaW48 L3N0cm9uZz4sIGZvciA8Y29kZT5TRUxFQ1QgLi4uIExFRlQgSk9JTjwvY29kZT4gcXVlcmll czwvbGk+CgkJPGxpPjxzdHJvbmc+c29vX3R4cF91cHNlcnQ8L3N0cm9uZz4gbmV3IGZlYXR1 cmVzOgoJPHVsPgoJCTxsaT5wcm9wZXJ0aWVzIGFuZCBtZXRob2RzIGZvciA8Y29kZT5WQUxV RVMoKTwvY29kZT4gc3ludGF4PC9saT4KCQk8bGk+Y2FuIGJlIGluaXRpYWxpemVkIHdpdGgg YSA8c3Ryb25nPnNvb190eHBfcm93c2V0PC9zdHJvbmc+IG9yIDxzdHJvbmc+c29vX3R4cF9y b3c8L3N0cm9uZz4gb2JqZWN0PC9saT4KCTwvdWw+PC9saT4KCQk8bGk+PHN0cm9uZz5zb29f dHhwX3Jvd3NldDwvc3Ryb25nPiBuZXcgZmVhdHVyZXM6Cgk8dWw+CgkJPGxpPmNhbiBiZSBp bml0aWFsaXplZCB3aXRoIGEgcXVlcnkgcmVzdWx0IHJlc291cmNlPC9saT4KCQk8bGk+bmV3 IGZ1bmN0aW9uIDxjb2RlPnN1YnNldCgpPC9jb2RlPiB0byBjcmVhdGUgYSBuZXcgcm93c2V0 IG9iamVjdCBmcm9tIGFuIGV4aXN0aW5nIG9uZTwvbGk+Cgk8L3VsPjwvbGk+CgkJPGxpPk5l dyBjbGFzcywgPHN0cm9uZz5zb29fbmVzdGVkX3NldDwvc3Ryb25nPiwgZm9yIENlbGtvIG5l c3RlZCBzZXRzIChtb2RpZmllZCBwcmVvcmRlciB0cmVlKTwvbGk+CgkJPGxpPjxzdHJvbmc+ c29vX2h0bWxfZm9ybTwvc3Ryb25nPiwgbmV3IGZlYXR1cmVzIGFuZCByZWxhdGVkIGNsYXNz ZXM6Cgk8dWw+CgkJPGxpPkNvbnN0cnVjdG9yJiM4MjE3O3MgPGNvZGU+YXR0czwvY29kZT4g YXJndW1lbnQgY2FuIGluY2x1ZGUgYW4gPGNvZGU+YWN0aW9uPC9jb2RlPiBhcnJheSBmb3Ig YWRkaW5nIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gdGhlIGZvcm0mIzgyMTc7cyA8Y29kZT5hY3Rp b248L2NvZGU+IGF0dHJpYnV0ZTwvbGk+CgkJPGxpPk5ldyBjbGFzc2VzOgoJPHVsPgoJCTxs aT48c3Ryb25nPnNvb19odG1sX2xhYmVsPC9zdHJvbmc+IGZvciBsYWJlbGluZyBmb3JtIGNv bnRyb2xzPC9saT4KCQk8bGk+PHN0cm9uZz5zb29faHRtbF9pbnB1dDwvc3Ryb25nPiBmb3Ig aW5wdXQgZWxlbWVudHM8L2xpPgoJCTxsaT48c3Ryb25nPnNvb19odG1sX3NlbGVjdDwvc3Ry b25nPiBmb3Igc2VsZWN0IGVsZW1lbnRzIChjYW4gYmUgaW5pdGlhbGl6ZWQgd2l0aCBhbiBh cnJheSB3aGljaCB3aWxsIGF1dG8tY3JlYXRlIGFwcHJvcHJpYXRlIDxjb2RlPm9wdGlvbjwv Y29kZT4gZWxlbWVudHMpPC9saT4KCQk8bGk+PHN0cm9uZz5zb29faHRtbF9vcHRpb248L3N0 cm9uZz4gKHNlZSBhYm92ZSk8L2xpPgoJCTxsaT48c3Ryb25nPnNvb19odG1sX3RleHRhcmVh PC9zdHJvbmc+IGZvciB0ZXh0YXJlYSBlbGVtZW50czwvbGk+Cgk8L3VsPjwvbGk+Cgk8L3Vs PjwvbGk+CgkJPGxpPjxzdHJvbmc+c29vX2h0bWxfaW1nPC9zdHJvbmc+IGJ1Z2ZpeCBmb3Ig cHJlIFR4cCA0LjIgY29tcGF0aWJpbGl0eTwvbGk+CgkJPGxpPjxzdHJvbmc+c29vX2h0bWxf dGFibGU8L3N0cm9uZz4gY2FuIG5vdyBiZSBpbml0aWFsaXplZCB3aXRoIGFuIGFycmF5IG9m IHZhbHVlcyBvciB0YWJsZSBjZWxsczsgdGhlc2Ugd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGZv cm1hdHRlZCBpbnRvIHJvd3MgYW5kIGNlbGxzIGFwcHJvcHJpYXRlbHk8L2xpPgoJCTxsaT5O ZXcgY2xhc3MsIDxzdHJvbmc+c29vX2h0bWxfY2FwdGlvbjwvc3Ryb25nPiwgZm9yIHRhYmxl IGNhcHRpb25zPC9saT4KCQk8bGk+PHN0cm9uZz5zb29faHRtbF9vbDwvc3Ryb25nPiBhbmQg PHN0cm9uZz5zb29faHRtbF91bDwvc3Ryb25nPiBjYW4gYmUgaW5pdGlhbGl6ZWQgd2l0aCBu ZXN0ZWQgYXJyYXlzLCBhdXRvbWF0aWNhbGx5IGdlbmVyYXRpbmcgbmVzdGVkIGxpc3RzIChz ZWUgPHN0cm9uZz5zb29fbmVzdGVkX3NldDwvc3Ryb25nPiBmb3IgYSBwb3NzaWJsZSBzb3Vy Y2Ugb2YgdGhlIG5lc3RlZCBhcnJheSk8L2xpPgoJPC91bD4KCgk8aDMgaWQ9ImI4Ij4xLjAu Yi44PC9oMz4KCgk8cD43LzkvMjAxMDwvcD4KCgk8dWw+CgkJPGxpPkRvY3VtZW50YXRpb24g dXBkYXRlcyAoRG94eUdlbiBjb21wYXRpYmlsaXR5KTwvbGk+Cgk8L3VsPgoKCTxoMyBpZD0i YjciPjEuMC5iLjc8L2gzPgoKCTxwPjcvNC8yMDEwPC9wPgoKCTx1bD4KCQk8bGk+PHN0cm9u Zz5zb29faHRtbF9pbWc8L3N0cm9uZz4gbm93IGFkZHMgdGh1bWJuYWlsIDxjb2RlPmhlaWdo dDwvY29kZT4gYW5kIDxjb2RlPndpZHRoPC9jb2RlPiBhdHRyaWJ1dGVzIChUeHAgNC4yLjAg b3IgbGF0ZXIpPC9saT4KCTwvdWw+CgoJPGgzIGlkPSJiNiI+MS4wLmIuNjwvaDM+CgoJPHA+ Ny8xLzIwMTA8L3A+CgoJPHVsPgoJCTxsaT5OZXcgY2xhc3M6IHNvb191dGlsLCBmb3Igc3Rh dGljIHV0aWxpdHkgbWV0aG9kczwvbGk+Cgk8L3VsPgoKCTxoMyBpZD0iYjUiPjEuMC5iLjU8 L2gzPgoKCTxwPjEvMjcvMjAxMDwvcD4KCgk8dWw+CgkJPGxpPm5ldyBtZXRob2Q6IDxjb2Rl PndoZXJlX2NsYXVzZSgpPC9jb2RlPiBpbiA8c3Ryb25nPnNvb190eHBfcXVlcnk8L3N0cm9u Zz4sIGEgY2F0Y2gtYWxsIGZvciBjb21wbGV4IGNsYXVzZXM8L2xpPgoJCTxsaT5taW5vciA8 c3BhbiBjbGFzcz0iY2FwcyI+SFRNTDwvc3Bhbj4gZm9ybWF0dGluZyBjaGFuZ2UgdG8gPGNv ZGU+dGFnKCk8L2NvZGU+IG1ldGhvZCBpbiA8c3Ryb25nPnNvb19odG1sPC9zdHJvbmc+PC9s aT4KCTwvdWw+CgoJPGgzIGlkPSJiNCI+MS4wLmIuNDwvaDM+CgoJPHA+MTAvMy8yMDA5PC9w PgoKCTx1bD4KCQk8bGk+PHN0cm9uZz5zb29fdXJpPC9zdHJvbmc+IHVwZGF0ZWQgZm9yIGNv cnJlY3QgYmVoYXZpb3IgaW4gVHhwIHN1Yi1kaXIgaW5zdGFsbGF0aW9uczwvbGk+Cgk8L3Vs PgoKCTxoMyBpZD0iYjMiPjEuMC5iLjM8L2gzPgoKCTxwPjkvMjIvMjAwOTwvcD4KCgk8dWw+ CgkJPGxpPjxzdHJvbmc+c29vX3VyaTwvc3Ryb25nPiBub3cgZ2V0cyBxdWVyeSBwYXJhbXMg YnkgcGFyc2luZyAkX1NFUlZFUlsmIzgyMTY7PHNwYW4gY2xhc3M9ImNhcHMiPlFVRVJZPC9z cGFuPl9TVFJJTkcmIzgyMTc7XSBpbnN0ZWFkIG9mICRfR0VUPC9saT4KCTwvdWw+CgoJPGgz IGlkPSJiMiI+MS4wLmIuMjwvaDM+CgoJPHA+OS8xNi8yMDA5PC9wPgoKCTx1bD4KCQk8bGk+ TmV3IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciA8c3BhbiBjbGFzcz0iY2FwcyI+TUxQPC9zcGFu PiBQYWNrIGNvbXBhdGliaWxpdHkgd2l0aCA8c3Ryb25nPnNvb191cmk8L3N0cm9uZz48L2xp PgoJCTxsaT5OZXcgY2xhc3NlczoKCTx1bD4KCQk8bGk+c29vX3R4cF91cHNlcnQgZm9yIDxz cGFuIGNsYXNzPSJjYXBzIj5TUUw8L3NwYW4+IGluc2VydC91cGRhdGUgc3RhdGVtZW50czwv bGk+CgkJPGxpPnNvb190eHBfZGVsZXRlIGZvciA8c3BhbiBjbGFzcz0iY2FwcyI+U1FMPC9z cGFuPiBkZWxldGUgc3RhdGVtZW50czwvbGk+CgkJPGxpPnNvb19odG1sX2Zvcm0gZm9yIGZv cm0gZWxlbWVudHM8L2xpPgoJPC91bD48L2xpPgoJCTxsaT5zb29fdHhwX3Jvd3NldCBvdmVy cmlkZXMgcGFyZW50OjpfX2dldCgpIG1ldGhvZDwvbGk+Cgk8L3VsPgoKCTxoMyBpZD0iYjEi PjEuMC5iLjE8L2gzPgoKCTx1bD4KCQk8bGk+TWFqb3IgcmUtb3JnYW5pemF0aW9uIGFuZCBy ZS13cml0ZSBvZiBtb3N0IGNsYXNzZXMuCgk8dWw+CgkJPGxpPlRoZSBvbGQgPHN0cm9uZz5T b29fVHhwX0RhdGE8L3N0cm9uZz4gZmFtaWx5IGhhcyBiZWVuIGRpdmlkZWQgaW50byBzZXBh cmF0ZSBjbGFzc2VzIGZvciBxdWVyaWVzIGFuZCBkYXRhLjwvbGk+CgkJPGxpPlRoZXJlIGFy ZSBubyBsb25nZXIgc2VwYXJhdGUgY2xhc3NlcyBmb3IgZWFjaCBUeHAgdGFibGUuPC9saT4K CQk8bGk+QWxsIGNsYXNzIG5hbWVzIG5vdyBsb3dlcmNhc2UgKHRoZXNlIGFyZW4mIzgyMTc7 dCBjYXNlIHNlbnNpdGl2ZSBhbnl3YXkpLjwvbGk+CgkJPGxpPkdlbmVyaWMgc2V0dGluZyBp cyBub3cgaW4gdGhlIGZvcm0gPGNvZGU+b2JqLSYjNjI7cHJvcGVydHkoKTwvY29kZT4gaW5z dGVhZCBvZiA8Y29kZT5vYmotJiM2MjtzZXRfcHJvcGVydHkoKTwvY29kZT4uPC9saT4KCQk8 bGk+VmFyaW91cyByZW5hbWluZywgY29kZSBjbGVhbmluZywgZXRjLjwvbGk+Cgk8L3VsPjwv bGk+Cgk8L3VsPgoKCTxoMyBpZD0iYTYiPjEuMC5hLjY8L2gzPgoKCTxwPjYvMi8yMDA5PC9w PgoKCTxwPldoYXQgdGhlIGhlY2ssIHRpbWUgdG8gdXNlIHRoZSBzYW1lIG5hbWluZyBjb252 ZW50aW9uIEkmIzgyMTc7bSB1c2luZyB3aXRoIG90aGVyIHBsdWdpbnMuPC9wPgoKCTx1bD4K CQk8bGk+QWRkZWQgPHN0cm9uZz5Tb29fVHhwX1VyaTwvc3Ryb25nPiBjbGFzcywgZm9yIDxz cGFuIGNsYXNzPSJjYXBzIj5VUkk8L3NwYW4+IHF1ZXJ5IHN0cmluZyBtYW5pcHVsYXRpb248 L2xpPgoJCTxsaT48c3Ryb25nPlNvb19IdG1sX1A8L3N0cm9uZz4gYW5kIDxzdHJvbmc+c29v X2h0bWxfdGg8L3N0cm9uZz4gY2FuIG5vdyBoYXZlIGNvbnRlbnRzIHNldCBkdXJpbmcgaW5z dGFudGlhdGlvbi4gTm90ZSB0aGF0IHRoaXMgd2lsbCBicmVhayBjb21wYXRpYmlsaXR5IHdp dGggc29tZSBwcmV2aW91cyB1c2VzLCBlLmcuIDxjb2RlPm5ldyBTb29fSHRtbF9QKCRhdHRz KTwvY29kZT4uPC9saT4KCQk8bGk+QWRkZWQgPGNvZGU+JGluPC9jb2RlPiBhcmd1bWVudCB0 byA8Y29kZT53aGVyZV9pbigpPC9jb2RlPiBtZXRob2QgKDxzdHJvbmc+U29vX1R4cF9EYXRh PC9zdHJvbmc+KSB0byBhbGxvdyAmIzgyMjA7PHNwYW4gY2xhc3M9ImNhcHMiPk5PVDwvc3Bh bj4gSU4mIzgyMjE7IHF1ZXJpZXM8L2xpPgoJPC91bD4KCgk8aDMgaWQ9ImE1Ij4xLjAuYTU8 L2gzPgoKCTxwPjUvMTMvMjAwOTwvcD4KCgk8dWw+CgkJPGxpPkNvcnJlY3RlZCA8c3BhbiBj bGFzcz0iY2FwcyI+U1FMPC9zcGFuPiBzeW50YXggaW4gPGNvZGU+b3JkZXJfYnlfZmllbGQo KTwvY29kZT4gZnVuY3Rpb24gb2YgPGNvZGU+U29vX1R4cF9EYXRhPC9jb2RlPiBjbGFzczwv bGk+CgkJPGxpPk1vZGlmaWVkIDxjb2RlPnRhZygpPC9jb2RlPiBmdW5jdGlvbiBvZiA8Y29k ZT5Tb29fSHRtbDwvY29kZT4gY2xhc3MgdG8gaGFuZGxlIGEgPHNwYW4gY2xhc3M9ImNhcHMi PlBIUDwvc3Bhbj4gNS4yLjAgYnVnPC9saT4KCTwvdWw+CgoJPGgzIGlkPSJhNCI+MS4wLmE0 PC9oMz4KCgk8cD41LzEvMjAwOTwvcD4KCgk8cD5BZGRlZCA8Y29kZT5jb3VudCgpPC9jb2Rl PiBhbmQgPGNvZGU+ZmllbGQoKTwvY29kZT4gbWV0aG9kcyB0byB0aGUgYWJzdHJhY3QgPGNv ZGU+U29vX1R4cF9EYXRhPC9jb2RlPiBjbGFzcy48L3A+CgoJPGgzIGlkPSJhMyI+MS4wLmEz PC9oMz4KCgk8cD4yLzE5LzIwMDk8L3A+CgoJPHA+QWRkZWQgJiM4MjIwO0V4cGlyZXMmIzgy MjE7IHByb3BlcnR5IHRvIDxjb2RlPlNvb19UeHBfQXJ0aWNsZTwvY29kZT4gYW5kICYjODIy MDtsb2FkX29yZGVyJiM4MjIxOyBwcm9wZXJ0eSB0byA8Y29kZT5Tb29fVHhwX1BsdWdpbjwv Y29kZT4uIFRoZXNlIGZpZWxkcyB3ZXJlIGFkZGVkIGluIFRleHRwYXR0ZXJuIHZlcnNpb24g NC4wLjcuPC9wPgoKCTxoMyBpZD0iYTIiPjEuMC5hMjwvaDM+CgoJPHA+Mi81LzIwMDk8L3A+ CgoJPHA+Tm8gc2lnbmlmaWNhbnQgY2hhbmdlcywgYnV0IGFkZGVkIGdlbmVyaWMgZ2V0dGVy cyBhbmQgc2V0dGVycyAodGhhbmtzIHRvIDxzdHJvbmc+am08L3N0cm9uZz4gZm9yIHRoZSBo aW50KSwgbWFraW5nIHRoZSBmaWxlIGFib3V0IDM1JSBzbWFsbGVyLjwvcD4KCgk8aDMgaWQ9 ImExIj4xLjAuYTE8L2gzPgoKCTxwPjIvNC8yMDA5PC9wPgoKCTxwPjwvZGl2PjwvcD4iO3M6 NDoiY29kZSI7czo0ODQ1MjoiCi8vLyBHZW5lcmljIGFic3RyYWN0IGJhc2UgY2xhc3MsIHdp dGggYSBmZXcgbG93LWxldmVsIHV0aWxpdHkgbWV0aG9kcy4KYWJzdHJhY3QgY2xhc3Mgc29v X29iagp7CgkvKiogR2VuZXJpYyBnZXR0ZXIuCgkgKiAgQWxsb3cgY2FsbHMgaW4gdGhlIGZv cm0gJG9iai0+cHJvcGVydHkgZm9yIHByb3RlY3RlZCBwcm9wZXJ0aWVzLgoJICovCglwdWJs aWMgZnVuY3Rpb24gX19nZXQoICRwcm9wZXJ0eSApCgl7CgkJcmV0dXJuIGlzc2V0KCR0aGlz LT4kcHJvcGVydHkpID8gJHRoaXMtPiRwcm9wZXJ0eSA6IG51bGw7Cgl9CgoJLyoqIE1ldGhv ZCBvdmVybG9hZGluZyBmb3IgZ2VuZXJpYyBzZXR0ZXJzLgoJICogIEFsbG93IGNhbGxzIGlu IHRoZSBmb3JtICRvYmotPnByb3BlcnR5KCR2YWx1ZSkuCgkgKiAgUmV0dXJucyAkdGhpcyB0 byBhbGxvdyBtZXRob2QgY2hhaW5pbmcuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2NhbGwo ICRyZXF1ZXN0LCAkYXJncyApCgl7CgkJaWYgKCBpc3NldCgkdGhpcy0+JHJlcXVlc3QpICkK CQkJJHRoaXMtPiRyZXF1ZXN0ID0gYXJyYXlfc2hpZnQoJGFyZ3MpOwoJCXJldHVybiAkdGhp czsKCX0KCgkvKiogUmV0dXJuIGFuIG9iamVjdCdzIGNsYXNzIG5hbWUuCgkgKiAgQWxsb3dz IG9iamVjdCB0byBiZSB1c2VkIGluIGEgc3RyaW5nIGNvbnRleHQuCgkgKiAgQHJldHVybiBz dHJpbmcgQ2xhc3MgbmFtZQoJICovCglwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpCgl7 CgkJcmV0dXJuIGdldF9jbGFzcygkdGhpcyk7Cgl9CgoJLyoqIFJldHVybiBhbiBvYmplY3Qn cyBwcm9wZXJ0aWVzIGFzIGFuIGFzc29jaWF0aXZlIGFycmF5LgoJICogIE5vdGU6IGluY2x1 ZGVzIHByb3RlY3RlZCBhbmQgcHJpdmF0ZSBwcm9wZXJ0aWVzLgoJICogIEZvciBwdWJsaWMg cHJvcGVydGllcyBvbmx5LCB1c2UgZ2V0X29iamVjdF92YXJzKCRvYmopIGRpcmVjdGx5LgoJ ICogIEByZXR1cm4gYXJyYXkKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHByb3BlcnRpZXMoKQoJ ewoJCXJldHVybiBnZXRfb2JqZWN0X3ZhcnMoJHRoaXMpOwoJfQoKCS8qKiBSZXR1cm4gYW4g b2JqZWN0J3MgcHJvcGVydGllcyBhcyBhbiBpbmRleGVkIGFycmF5LgoJICogIEByZXR1cm4g YXJyYXkKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHByb3BlcnR5X25hbWVzKCkKCXsKCQlyZXR1 cm4gYXJyYXlfa2V5cygkdGhpcy0+cHJvcGVydGllcygpKTsKCX0KCn0KCi8vLyBBYnN0cmFj dCBiYXNlIGNsYXNzIGZvciBTUUwgcXVlcmllcy4KYWJzdHJhY3QgY2xhc3Mgc29vX3R4cF9x dWVyeSBleHRlbmRzIHNvb19vYmoKewoJLy8vIERhdGFiYXNlIHRhYmxlIG5hbWUuCglwcm90 ZWN0ZWQgJHRhYmxlCQk9ICcnOwoJLy8vIFNRTCBXSEVSRSBleHByZXNzaW9ucy4KCXByb3Rl Y3RlZCAkd2hlcmUJCT0gYXJyYXkoKTsKCS8vLyBTUUwgT1JERVIgQlkgZXhwcmVzc2lvbnMu Cglwcm90ZWN0ZWQgJG9yZGVyX2J5CQk9IGFycmF5KCk7CgkvLy8gU1FMIExJTUlULgoJcHJv dGVjdGVkICRsaW1pdAkJPSAwOwoJLy8vIFNRTCBPRkZTRVQuCglwcm90ZWN0ZWQgJG9mZnNl dAkJPSAwOwoKCS8qKiBDb25zdHJ1Y3Rvci4KCSAqICBVc2UgJGtleSB0byBtYXRjaCBhIHNp bmdsZSByb3cgbWF0Y2hpbmcgb24gYXBwcm9wcmlhdGUga2V5IGNvbHVtbgoJICogIElmICRr ZXkgaXMgYW4gYXJyYXksIGN1cnJlbnQga2V5IGlzIHRoZSBjb2x1bW4gYW5kIGN1cnJlbnQg dmFsdWUKCSAqICBpcyB0aGUgdmFsdWUuIE90aGVyd2lzZSBjb2x1bW4gd2lsbCBiZSB0YWtl biBmcm9tIHNlbGY6OmtleV9jb2x1bW4oKS4KCSAqICBAcGFyYW0gdGFibGUgVGFibGUgbmFt ZQoJICogIEBwYXJhbSBrZXkgS2V5IGNvbHVtbiB2YWx1ZSAob3IgYXJyYXkpIGZvciBXSEVS RSBleHByZXNzaW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCggJHRhYmxl LCAka2V5ID0gbnVsbCApCgl7CgkJJHRoaXMtPnRhYmxlID0gdHJpbSgkdGFibGUpOwoJCWlm ICggaXNfYXJyYXkoJGtleSkgKQoJCQkkdGhpcy0+d2hlcmUoa2V5KCRrZXkpLCBjdXJyZW50 KCRrZXkpKTsKCQllbHNlaWYgKCAka2V5ICkKCQkJJHRoaXMtPndoZXJlKCR0aGlzLT5rZXlf Y29sdW1uKCRrZXkpLCAka2V5KTsKCX0KCgkvKiogQWRkIGV4cHJlc3Npb24gdG8gV0hFUkUg Y2xhdXNlLgoJICogIEBwYXJhbSBjb2x1bW4gQ29sdW1uIG5hbWUKCSAqICBAcGFyYW0gdmFs dWUgQ29sdW1uIHZhbHVlKHMpIChzdHJpbmcsIGFycmF5LCBvciBzb29fdHhwX3NlbGVjdCkK CSAqICBAcGFyYW0gb3BlcmF0b3IgQ29tcGFyaXNvbiBvcGVyYXRvcgoJICogIEBwYXJhbSBq b2luIEFORCBvciBPUgoJICovCglwdWJsaWMgZnVuY3Rpb24gd2hlcmUoICRjb2x1bW4sICR2 YWx1ZSwgJG9wZXJhdG9yID0gJz0nLCAkam9pbiA9ICcnICkKCXsKCQkkam9pbiA9ICR0aGlz LT5hbmRvcigkam9pbik7CgoJCWlmICggaXNfYXJyYXkoJHZhbHVlKSApCgkJCSR2YWx1ZSA9 ICcoJyAuIGltcGxvZGUoJywnLCBxdW90ZV9saXN0KGRvU2xhc2goJHZhbHVlKSkpIC4gJykn OwoJCWVsc2VpZiAoICR2YWx1ZSBpbnN0YW5jZW9mIHNvb190eHBfc2VsZWN0ICkKCQkJJHZh bHVlID0gJygnIC4gJHZhbHVlLT5zcWwoKSAuICcpJzsKCQllbHNlCgkJCSR2YWx1ZSA9ICIn JHZhbHVlJyI7CgoJCSR0aGlzLT53aGVyZVtdID0gKCAkam9pbiA/ICIkam9pbiAiIDogJycg KSAuCgkJCXNlbGY6OnF1b3RlKCRjb2x1bW4pIC4gIiAkb3BlcmF0b3IgJHZhbHVlIjsKCQly ZXR1cm4gJHRoaXM7Cgl9CgoJLyoqIEFkZCBhIHJhdyBleHByZXNzaW9uIHRvIFdIRVJFIGNs YXVzZS4KCSAqICBVc2UgaW5zdGVhZCBvZiB7QGxpbmsgd2hlcmUoKX0gZm9yIGNvbXBsZXgg KGUuZy4gbmVzdGVkKSBleHByZXNzaW9ucwoJICogIEBwYXJhbSBjbGF1c2UgV0hFUkUgRXhw cmVzc2lvbgoJICogIEBwYXJhbSBqb2luIEFORCBvciBPUgoJICovCglwdWJsaWMgZnVuY3Rp b24gd2hlcmVfY2xhdXNlKCAkY2xhdXNlLCAkam9pbiA9ICcnICkKCXsKCQkkam9pbiA9ICR0 aGlzLT5hbmRvcigkam9pbik7CgkJJHRoaXMtPndoZXJlW10gPSAoICRqb2luID8gIiRqb2lu ICIgOiAnJyApIC4gJGNsYXVzZTsKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqIEFkZCBhbiBJ TiBleHByZXNzaW9uIHRvIHRoZSBXSEVSRSBjbGF1c2UuCgkgKiAgQHBhcmFtIGNvbHVtbiBD b2x1bW4gbmFtZQoJICogIEBwYXJhbSBsaXN0IEl0ZW1zIHRvIGNvbXBhcmUgYWdhaW5zdAoJ ICogIEBwYXJhbSBqb2luIEFORCBvciBPUgoJICogIEBwYXJhbSBpbiB0cnVlID0gSU4sIGZh bHNlID0gTk9UIElOCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBpbiggJGNvbHVtbiwgJGxpc3Qs ICRqb2luID0gJycsICRpbiA9IHRydWUgKQoJewoJCSRpbiA9ICggJGluID8gJycgOiAnIG5v dCcgKSAuICcgaW4nOwoJCWlmICggaXNfc3RyaW5nKCRsaXN0KSApCgkJCSRsaXN0ID0gZG9f bGlzdCgkbGlzdCk7CgkJcmV0dXJuICR0aGlzLT53aGVyZSgkY29sdW1uLCAkbGlzdCwgJGlu LCAkam9pbik7Cgl9CgoJLyoqIEFsaWFzIG9mIGluKCkgd2l0aCAkaW4gPSBmYWxzZSAoYWRk IGEgTk9UIElOIGV4cHJlc3Npb24pLgoJICogIEBwYXJhbSBjb2x1bW4gQ29sdW1uIG5hbWUK CSAqICBAcGFyYW0gbGlzdCBJdGVtcyB0byBjb21wYXJlIGFnYWluc3QKCSAqICBAcGFyYW0g am9pbiBBTkQgb3IgT1IKCSAqLwoJcHVibGljIGZ1bmN0aW9uIG5vdF9pbiggJGNvbHVtbiwg JGxpc3QsICRqb2luID0gJycgKQoJewoJCXJldHVybiAkdGhpcy0+aW4oICRjb2x1bW4gLCAk bGlzdCAsICRqb2luICwgZmFsc2UgKTsKCX0KCgkvKiogQWRkIGEgTXlTUUwgUkVHRVhQIGV4 cHJlc3Npb24gdG8gdGhlIFdIRVJFIGNsYXVzZS4KCSAqICBAcGFyYW0gcGF0dGVybiBNeVNR TCBSRUdFWFAgcGF0dGVybgoJICogIEBwYXJhbSBzdWJqZWN0IENvbHVtbiBuYW1lIG9yIHN0 cmluZyB0byBtYXRjaAoJICogIEBwYXJhbSBqb2luIEFORCBvciBPUgoJICovCglwdWJsaWMg ZnVuY3Rpb24gcmVnZXhwKCAkcGF0dGVybiwgJHN1YmplY3QsICRqb2luID0gJycgKQoJewoJ CXJldHVybiAkdGhpcy0+d2hlcmUoJHN1YmplY3QsICRwYXR0ZXJuLCAncmVnZXhwJywgJGpv aW4pOwoJfQoKCXByb3RlY3RlZCBmdW5jdGlvbiBhbmRvciggJGpvaW4gPSAnYW5kJyApCgl7 CgkJJGpvaW4gPSBzdHJ0b2xvd2VyKCRqb2luKTsKCQlyZXR1cm4gY291bnQoJHRoaXMtPndo ZXJlKSA/CgkJCSggaW5fbGlzdCgkam9pbiwgJ2FuZCxvcicpID8gJGpvaW4gOiAnYW5kJyAp IDogJyc7Cgl9CgoJLyoqIFF1b3RlIHdpdGggYmFja3RpY2tzLgoJICogIE9ubHkgcXVvdGUg aXRlbXMgY29uc2lzdGluZyBvZiBhbHBoYW51bWVyaWNzLCAkLCBhbmQvb3IgXwoJICogIEBw YXJhbSBpZGVudGlmaWVyIEl0ZW0gdG8gcXVvdGUKCSAqICBAcmV0dXJuIHN0cmluZwoJICov CglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHF1b3RlKCAkaWRlbnRpZmllciApCgl7CgkJcmV0 dXJuIHByZWdfbWF0Y2goJy9eW2Etel8kXGRdKyQvaScsICRpZGVudGlmaWVyKSA/CgkJCSJg JGlkZW50aWZpZXJgIiA6ICRpZGVudGlmaWVyOwoJfQoKCS8qKiBBZGQgYW4gZXhwcmVzc2lv biB0byB0aGUgT1JERVIgQlkgYXJyYXkuCgkgKiAgRXhhbXBsZTogJHF1ZXJ5LT5vcmRlcl9i eSgnZm9vIEFTQywgYmFyIERFU0MnKTsKCSAqICBAcGFyYW0gZXhwciBDb21tYS1zZXBhcmF0 ZWQgbGlzdCwgb3IgYXJyYXksIG9mIGV4cHJlc3Npb25zCgkgKiAgQHBhcmFtIGRpcmVjdGlv biBBU0Mgb3IgREVTQwoJICovCglwdWJsaWMgZnVuY3Rpb24gb3JkZXJfYnkoICRleHByLCAk ZGlyZWN0aW9uID0gJycgKQoJewoJCWlmICggJGV4cHIgKQoJCXsKCQkJaWYgKCAhIGlzX2Fy cmF5KCRleHByKSApICRleHByID0gZG9fbGlzdCgkZXhwcik7CgkJCWZvcmVhY2ggKCAkZXhw ciBhcyAkeCApCgkJCXsKCQkJCWlmICggcHJlZ19tYXRjaCgnLyhcUyspXHMrKFxTKykvJywg JHgsICRtYXRjaCkgKQoJCQkJCWxpc3QoICwgJGNvbHVtbiwgJGRpcmVjdGlvbikgPSAkbWF0 Y2g7CgkJCQllbHNlCgkJCQkJJGNvbHVtbiA9ICR4OwoJCQkJaWYgKCBpbl9hcnJheShzdHJ0 b2xvd2VyKCRjb2x1bW4pLCBhcnJheSgncmFuZG9tJywgJ3JhbmQnLCAncmFuZCgpJykpICkK CQkJCQkkY29sdW1uID0gJ3JhbmQoKSc7CgkJCQllbHNlCgkJCQkJJGRpcmVjdGlvbiA9IGlu X2FycmF5KHN0cnRvbG93ZXIoJGRpcmVjdGlvbiksIGFycmF5KCdhc2MnLCAnZGVzYycpKSA/ ICRkaXJlY3Rpb24gOiAnJzsKCQkJCSR0aGlzLT5vcmRlcl9ieVtdID0gJGNvbHVtbiAuICgg JGRpcmVjdGlvbiA/ICcgJyAuICRkaXJlY3Rpb24gOiAnJyk7CgkJCX0KCQl9CgkJcmV0dXJu ICR0aGlzOwoJfQoKCS8qKiBBbGlhcyBvZiBvcmRlcl9ieSgpIGZvciBhIHNpbmdsZSBjb2x1 bW4gQVNDLgoJICogIEBwYXJhbSBjb2wgQ29sdW1uIG5hbWUKCSAqLwoJcHVibGljIGZ1bmN0 aW9uIGFzYyggJGNvbCApCgl7CgkJcmV0dXJuICR0aGlzLT5vcmRlcl9ieSgkY29sLCAnYXNj Jyk7Cgl9CgoJLyoqIEFsaWFzIG9mIG9yZGVyX2J5KCkgZm9yIGEgc2luZ2xlIGNvbHVtbiBE RVNDLgoJICogIEBwYXJhbSBjb2wgQ29sdW1uIG5hbWUKCSAqLwoJcHVibGljIGZ1bmN0aW9u IGRlc2MoICRjb2wgKQoJewoJCXJldHVybiAkdGhpcy0+b3JkZXJfYnkoJGNvbCwgJ2Rlc2Mn KTsKCX0KCgkvKiogQWRkIGEgRklFTEQoKSBleHByZXNzaW9uIHRvIHRoZSBPUkRFUiBCWSBh cnJheS4KCSAqICBGb3IgcHJlc2VydmluZyBhbiBhcmJpdHJhcnkgc29ydCBvcmRlciwgZS5n LiAnNyw1LDEyLDEnCgkgKiAgTm90ZSB0aGF0IEZJRUxEKCkgaXMgYSBNeVNRTC1zcGVjaWZp YyBmdW5jdGlvbiAobm90IHN0YW5kYXJkIFNRTCkKCSAqICBAcGFyYW0gZmllbGQgQ29sdW1u IG5hbWUKCSAqICBAcGFyYW0gbGlzdCBDb21tYS1zZXBhcmF0ZWQgbGlzdCwgb3IgYXJyYXks IG9mIHZhbHVlcyBpbiBvcmRlcgoJICovCglwdWJsaWMgZnVuY3Rpb24gb3JkZXJfYnlfZmll bGQoICRmaWVsZCwgJGxpc3QgKQoJewoJCWlmICggaXNfc3RyaW5nKCRsaXN0KSApICRsaXN0 ID0gZG9fbGlzdCgkbGlzdCk7CgkJaWYgKCBjb3VudCgkbGlzdCkgKQoJCQkkdGhpcy0+b3Jk ZXJfYnlbXSA9ICdmaWVsZCgnIC4gc2VsZjo6cXVvdGUoJGZpZWxkKSAuICcsICcgLgoJCQkJ aW1wbG9kZSgnLCAnLCBxdW90ZV9saXN0KGRvU2xhc2goJGxpc3QpKSkgLiAnKSc7CgkJcmV0 dXJuICR0aGlzOwoJfQoKCS8qKiBBZGQgYSBMSU1JVCB0byB0aGUgcXVlcnkuCgkgKiAgQHBh cmFtIGxpbWl0IE1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRvIHJldHVybgoJICovCglwdWJs aWMgZnVuY3Rpb24gbGltaXQoICRsaW1pdCApCgl7CgkJaWYgKCAkbGltaXQgPSBpbnR2YWwo JGxpbWl0KSApCgkJCSR0aGlzLT5saW1pdCA9ICcgbGltaXQgJyAuICRsaW1pdDsKCQlyZXR1 cm4gJHRoaXM7Cgl9CgoJLyoqIEFkZCBhbiBPRkZTRVQgdG8gdGhlIHF1ZXJ5LgoJICogIEBw YXJhbSBvZmZzZXQgTnVtYmVyIG9mIGl0ZW1zIHRvIHNraXAKCSAqLwoJcHVibGljIGZ1bmN0 aW9uIG9mZnNldCggJG9mZnNldCApCgl7CgkJaWYgKCAkb2Zmc2V0ID0gaW50dmFsKCRvZmZz ZXQpICkKCQkJJHRoaXMtPm9mZnNldCA9ICcgb2Zmc2V0ICcgLiAkb2Zmc2V0OwoJCXJldHVy biAkdGhpczsKCX0KCgkvKiogQXNzZW1ibGUgYW5kIHJldHVybiB0aGUgcXVlcnkgY2xhdXNl cyBhcyBhIHN0cmluZy4KCSAqICBAcmV0dXJuIHN0cmluZwoJICovCglwcm90ZWN0ZWQgZnVu Y3Rpb24gY2xhdXNlX3N0cmluZygpCgl7CgkJcmV0dXJuIGltcGxvZGUoJyAnLCAkdGhpcy0+ d2hlcmUpIC4KCQkJKCBjb3VudCgkdGhpcy0+b3JkZXJfYnkpID8gJyBvcmRlciBieSAnIC4g aW1wbG9kZSgnLCAnLCAkdGhpcy0+b3JkZXJfYnkpIDogJycgKSAuCgkJCSggJHRoaXMtPmxp bWl0ID8gJHRoaXMtPmxpbWl0IDogJycgKSAuICggJHRoaXMtPm9mZnNldCA/ICR0aGlzLT5v ZmZzZXQgOiAnJyApOwoJfQoKCS8qKiBOdW1iZXIgb2YgaXRlbXMgdGhlIHF1ZXJ5IHdpbGwg cmV0dXJuLgoJICogIFJ1bnMgdGhlIHF1ZXJ5IHdpdGggQ09VTlQoKSBhcyB0aGUgc2VsZWN0 IGV4cHJlc3Npb24KCSAqICBAcmV0dXJuIGludHxmYWxzZQoJICovCglwdWJsaWMgZnVuY3Rp b24gY291bnQoKQoJewoJCXJldHVybiBnZXRDb3VudCgkdGhpcy0+dGFibGUsICR0aGlzLT5j bGF1c2Vfc3RyaW5nKCkgPyAkdGhpcy0+Y2xhdXNlX3N0cmluZygpIDogJzE9MScpOwoJfQoK CS8qKiBSZXR1cm4gdGhlIGtleSBjb2x1bW4gbmFtZSBmb3IgdGhlIGN1cnJlbnQgdGFibGUu CgkgKiAgU29tZSBUeHAgdGFibGVzIGhhdmUgbXVsdGlwbGUgaW5kZXhlcy4KCSAqICBJZiAk a2V5X3ZhbHVlIGlzIHByb3ZpZGVkLCBjb2x1bW4gb2YgdGhlIG1hdGNoaW5nIHR5cGUgd2ls bCBiZSByZXR1cm5lZC4KCSAqICBPdGhlcndpc2UgdGhlIG51bWVyaWMgaW5kZXggd2lsbCBi ZSByZXR1cm5lZCBpbiBwcmVmZXJlbmNlIHRvIHRoZSBzdHJpbmcgaW5kZXguCgkgKiAgQHBh cmFtIGtleV92YWx1ZQoJICogIEByZXR1cm4gc3RyaW5nCgkgKi8KCXB1YmxpYyBmdW5jdGlv biBrZXlfY29sdW1uKCAka2V5X3ZhbHVlID0gbnVsbCApCgl7CgkJJG51bWVyaWNfaW5kZXgJ PSBhcnJheSgKCQkJJ3RleHRwYXR0ZXJuJwkJPT4gJ0lEJywKCQkJJ3R4cF9jYXRlZ29yeScJ CT0+ICdpZCcsCgkJCSd0eHBfZGlzY3VzcycJCT0+ICdkaXNjdXNzaWQnLAoJCQkndHhwX2Zp bGUnCQkJPT4gJ2lkJywKCQkJJ3R4cF9pbWFnZScJCQk9PiAnaWQnLAoJCQkndHhwX2xhbmcn CQkJPT4gJ2lkJywKCQkJJ3R4cF9saW5rJwkJCT0+ICdpZCcsCgkJCSd0eHBfbG9nJwkJCT0+ ICdpZCcsCgkJCSd0eHBfdXNlcnMnCQkJPT4gJ3VzZXJfaWQnLAoJCSk7CgkJJHN0cmluZ19p bmRleAkJPSBhcnJheSgKCQkJJ3RleHRwYXR0ZXJuJwkJPT4gJ1RpdGxlJywKCQkJJ3R4cF9j YXRlZ29yeScJCT0+ICduYW1lJywKCQkJJ3R4cF9jc3MnCQkJPT4gJ25hbWUnLAoJCQkndHhw X2Rpc2N1c3NfaXBiYW4nCT0+ICdpcCcsCgkJCSd0eHBfZGlzY3Vzc19ub25jZScJPT4gJ25v bmNlJywKCQkJJ3R4cF9maWxlJwkJCT0+ICdmaWxlbmFtZScsCgkJCSd0eHBfZm9ybScJCQk9 PiAnbmFtZScsCgkJCSd0eHBfaW1hZ2UnCQkJPT4gJ25hbWUnLAoJCQkndHhwX2xhbmcnCQkJ PT4gJ2xhbmcnLAoJCQkndHhwX3BhZ2UnCQkJPT4gJ25hbWUnLAoJCQkndHhwX3BsdWdpbicJ CT0+ICduYW1lJywKCQkJJ3R4cF9wcmVmcycJCQk9PiAnbmFtZScsCgkJCSd0eHBfc2VjdGlv bicJCT0+ICduYW1lJywKCQkJJ3R4cF91c2VycycJCQk9PiAnbmFtZScsCgkJKTsKCQlpZiAo IGlzc2V0KCRudW1lcmljX2luZGV4WyR0aGlzLT50YWJsZV0pICkKCQkJJG54ID0gJG51bWVy aWNfaW5kZXhbJHRoaXMtPnRhYmxlXTsKCQlpZiAoIGlzc2V0KCRzdHJpbmdfaW5kZXhbJHRo aXMtPnRhYmxlXSkgKQoJCQkkc3ggPSAkc3RyaW5nX2luZGV4WyR0aGlzLT50YWJsZV07Cgog CQlpZiAoIGlzX251bWVyaWMoJGtleV92YWx1ZSkgKQoJCQlyZXR1cm4gaXNzZXQoJG54KSA/ ICRueCA6IG51bGw7CiAJCWlmICggaXNfc3RyaW5nKCRrZXlfdmFsdWUpICkKCQkJcmV0dXJu IGlzc2V0KCRzeCkgPyAkc3ggOiBudWxsOwoJCXJldHVybiBpc3NldCgkbngpID8gJG54IDog KCBpc3NldCgkc3gpID8gJHN4IDogbnVsbCApOwoJfQoKfQoKLy8vIENsYXNzIGZvciBTRUxF Q1QgcXVlcmllcy4KY2xhc3Mgc29vX3R4cF9zZWxlY3QgZXh0ZW5kcyBzb29fdHhwX3F1ZXJ5 CnsKCgkvLy8gU1FMIFNFTEVDVCBleHByZXNzaW9ucy4KCXByb3RlY3RlZCAkc2VsZWN0CQk9 IGFycmF5KCk7CgkvLy8gV2hldGhlciB0byBhZGQgRElTVElOQ1QKCXByb3RlY3RlZCAkZGlz dGluY3QJCT0gZmFsc2U7CgoJLyoqIENvbnN0cnVjdG9yLgoJICogIEBwYXJhbSB0YWJsZSBU YWJsZSBuYW1lCgkgKiAgQHBhcmFtIGtleSBPcHRpb25hbCBrZXkgZm9yIHNlbGVjdGluZyBh IHNpbmdsZSByZWNvcmQKCSAqICBAcGFyYW0gc2VsZWN0IGl0ZW0ocykgdG8gc2VsZWN0Cgkg Ki8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCggJHRhYmxlLCAka2V5ID0gbnVsbCwg JHNlbGVjdCA9IG51bGwgKQoJewoJCXBhcmVudDo6X19jb25zdHJ1Y3QoJHRhYmxlLCAka2V5 KTsKCQlpZiAoICRzZWxlY3QgKSAkdGhpcy0+c2VsZWN0KCRzZWxlY3QpOwoJfQoKCS8qKiBB ZGQgaXRlbXMgdG8gdGhlIFNFTEVDVCBhcnJheS4KCSAqICBAcGFyYW0gbGlzdAljb21tYS1z ZXBhcmF0ZWQgbGlzdCwgb3IgYXJyYXksIG9mIGl0ZW1zIHRvIHNlbGVjdAoJICovCglwdWJs aWMgZnVuY3Rpb24gc2VsZWN0KCAkbGlzdCA9ICcqJyApCgl7CgkJaWYgKCBpc19zdHJpbmco JGxpc3QpICkgJGxpc3QgPSBkb19saXN0KCRsaXN0KTsKCQlmb3JlYWNoICggJGxpc3QgYXMg JGNvbCApICR0aGlzLT5zZWxlY3RbXSA9IHBhcmVudDo6cXVvdGUoJGNvbCk7CgkJcmV0dXJu ICR0aGlzOwoJfQoKCS8qKiBBZGQgdGhlIERJU1RJTkNUIGtleXdvcmQgdG8gdGhlIHF1ZXJ5 CgkgKiAgQHJldHVybiAkdGhpcyB0byBhbGxvdyBtZXRob2QgY2hhaW5pbmcKCSAqLwoJcHVi bGljIGZ1bmN0aW9uIGRpc3RpbmN0KCApCgl7CgkJJHRoaXMtPmRpc3RpbmN0ID0gdHJ1ZTsK CQlyZXR1cm4gJHRoaXM7Cgl9CgoJcHJvdGVjdGVkIGZ1bmN0aW9uIGluaXRfcXVlcnkoKQoJ ewoJCWlmICggISBjb3VudCgkdGhpcy0+c2VsZWN0KSApICR0aGlzLT5zZWxlY3QoKTsKCQlp ZiAoICEgY291bnQoJHRoaXMtPndoZXJlKSApICR0aGlzLT53aGVyZVtdID0gJzEgPSAxJzsK CX0KCgkvKiogUmV0dXJuIGEgc2luZ2xlIHJlY29yZCwgb3IgZW1wdHkgYXJyYXkgaWYgbm8g bWF0Y2hpbmcgcmVjb3Jkcy4KCSAqICBAcmV0dXJuIGFycmF5CgkgKi8KCXB1YmxpYyBmdW5j dGlvbiByb3coKQoJewoJCSR0aGlzLT5pbml0X3F1ZXJ5KCk7CgkJcmV0dXJuIHNhZmVfcm93 KGltcGxvZGUoJywnLCAkdGhpcy0+c2VsZWN0KSwgJHRoaXMtPnRhYmxlLAoJCQkkdGhpcy0+ Y2xhdXNlX3N0cmluZygpKTsKCX0KCgkvKiogUmV0dXJuIGFsbCByZWNvcmRzLCBvciBlbXB0 eSBhcnJheSBpZiBubyBtYXRjaGluZyByZWNvcmRzLgoJICogIEByZXR1cm4gYXJyYXkKCSAq LwoJcHVibGljIGZ1bmN0aW9uIHJvd3MoKQoJewoJCSR0aGlzLT5pbml0X3F1ZXJ5KCk7CgkJ cmV0dXJuIHNhZmVfcm93cyggKCAkdGhpcy0+ZGlzdGluY3QgPyAnZGlzdGluY3QgJyA6ICcn KSAuCgkJCWltcGxvZGUoJywnLCAkdGhpcy0+c2VsZWN0KSwgJHRoaXMtPnRhYmxlLCAkdGhp cy0+Y2xhdXNlX3N0cmluZygpKTsKCX0KCgkvKiogUmV0dXJuIHRoZSBxdWVyeSBhcyBhIHN0 cmluZy4KCSAqICBAcmV0dXJuIHN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gc3FsKCkK CXsKCQkkdGhpcy0+aW5pdF9xdWVyeSgpOwoJCXJldHVybiAnc2VsZWN0ICcgLiBpbXBsb2Rl KCcsJywgJHRoaXMtPnNlbGVjdCkgLiAnIGZyb20gJyAuIHNhZmVfcGZ4KCR0aGlzLT50YWJs ZSkgLiAnIHdoZXJlICcgLiAkdGhpcy0+Y2xhdXNlX3N0cmluZygpOwoJfQoKCS8qKiBSZXR1 cm4gcmVzdWx0IG9mIGEgU0VMRUNUIENPVU5UKCopIHF1ZXJ5CgkgKiAgQGludAoJICovCglw dWJsaWMgZnVuY3Rpb24gY291bnQoKQoJewoJCSRzZWxlY3QgPSAkdGhpcy0+c2VsZWN0OwoJ CSR0aGlzLT5zZWxlY3QgPSBhcnJheSgnY291bnQoKiknKTsKCQkkciA9IHNhZmVfcXVlcnko JHRoaXMtPnNxbCgpKTsKCQkkdGhpcy0+c2VsZWN0ID0gJHNlbGVjdDsKCQlpZiAoICRyICYm ICRyb3cgPSBteXNxbGlfZmV0Y2hfcm93KCRyKSApCgkJCXJldHVybiAkcm93WzBdOwoJfQp9 CgovLy8gQ2xhc3MgZm9yIFNFTEVDVCAuLi4gTEVGVCBKT0lOIHF1ZXJpZXMuCi8vLyBDdXJy ZW50bHkgdmVyeSBpbmNvbXBsZXRlOyBuZWVkcyB0byBvdmVycmlkZSBtb3N0IHBhcmVudCBt ZXRob2RzCi8vLyB0byBzcGVjaWZ5IHdoaWNoIHRhYmxlIGVhY2ggZXhwcmVzc2lvbiByZWZl cnMgdG8uCmNsYXNzIHNvb190eHBfbGVmdF9qb2luIGV4dGVuZHMgc29vX3R4cF9zZWxlY3QK ewoJLy8vIEpvaW4gdGFibGUgbmFtZQoJcHJvdGVjdGVkICRsZWZ0X2pvaW47CgkvLy8gT04g ZXhwcmVzc2lvbiBmb3Igam9pbgoJcHJvdGVjdGVkICRqb2luX29uOwoJLy8vIExlZnQgdGFi bGUgYWxpYXMKCWNvbnN0IHQxID0gJ3QxJzsKCS8vLyBKb2luIHRhYmxlIGFsaWFzCgljb25z dCB0MiA9ICd0Mic7CgoJLyoqIENvbnN0cnVjdG9yLgoJICogIEBwYXJhbSB0YWJsZSBMZWZ0 IHRhYmxlCgkgKiAgQHBhcmFtIGxlZnRfam9pbiBKb2luIHRhYmxlCgkgKiAgQHBhcmFtIGNv bDEgS2V5IGNvbHVtbiBuYW1lIGZvciBsZWZ0IHRhYmxlCgkgKiAgQHBhcmFtIGNvbDIgS2V5 IGNvbHVtbiBuYW1lIGZvciBqb2luIHRhYmxlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2Nv bnN0cnVjdCAoICR0YWJsZSwgJGxlZnRfam9pbiwgJGNvbDEsICRjb2wyICkKCXsKCQlwYXJl bnQ6Ol9fY29uc3RydWN0KCR0YWJsZSk7CgkJJHRoaXMtPmxlZnRfam9pbiA9ICRsZWZ0X2pv aW47CgkJJHRoaXMtPmpvaW5fb24gPSBzZWxmOjp0MSAuICcuJyAuIHNlbGY6OnF1b3RlKCRj b2wxKSAuICcgPSAnIC4gc2VsZjo6dDIgLiAnLicgLiBzZWxmOjpxdW90ZSgkY29sMik7Cgl9 CgoJLyoqIExpa2UgcGFyZW50OjpxdW90ZSwgb3B0aW9uYWxseSBwcmVwZW5kaW5nIHRhYmxl IG5hbWUvYWxpYXMuCgkgKiAgQHBhcmFtIGlkZW50aWZpZXIgQ29sdW1uIG5hbWUgb3IgYWxp YXMKCSAqICBAcGFyYW0gcHJlZml4IFRhYmxlIG5hbWUgb3IgYWxpYXMKCSAqLwoJcHVibGlj IHN0YXRpYyBmdW5jdGlvbiBxdW90ZSggJGlkZW50aWZpZXIsICRwcmVmaXggPSAnJyApCgl7 CgkJcmV0dXJuICggJHByZWZpeCA/ICRwcmVmaXggLiAnLicgOiAnJyApIC4gcGFyZW50Ojpx dW90ZSgkaWRlbnRpZmllcik7Cgl9CgoJLyoqIEFkZCBpdGVtcyB0byB0aGUgU0VMRUNUIGFy cmF5IGZyb20gdGhlIGxlZnQgdGFibGUuCgkgKiAgQHBhcmFtIGxpc3QJY29tbWEtc2VwYXJh dGVkIGxpc3QsIG9yIGFycmF5LCBvZiBpdGVtcyB0byBzZWxlY3QKCSAqLwoJcHVibGljIGZ1 bmN0aW9uIHNlbGVjdCggJGxpc3QgPSAnKicgKQoJewoJCXJldHVybiBzZWxmOjpzZWxlY3Rf ZnJvbSgkbGlzdCwgc2VsZjo6dDEpOwoJfQoKCS8qKiBBZGQgaXRlbXMgdG8gdGhlIFNFTEVD VCBhcnJheSBmcm9tIHRoZSBqb2luIHRhYmxlLgoJICogIEBwYXJhbSBsaXN0CWNvbW1hLXNl cGFyYXRlZCBsaXN0LCBvciBhcnJheSwgb2YgaXRlbXMgdG8gc2VsZWN0CgkgKi8KCXB1Ymxp YyBmdW5jdGlvbiBzZWxlY3Rfam9pbiggJGxpc3QgPSAnKicgKQoJewoJCXJldHVybiBzZWxm OjpzZWxlY3RfZnJvbSgkbGlzdCwgc2VsZjo6dDIpOwoJfQoKCXByaXZhdGUgZnVuY3Rpb24g c2VsZWN0X2Zyb20oICRsaXN0LCAkdGFibGUgKQoJewoJCWlmICggaXNfc3RyaW5nKCRsaXN0 KSApICRsaXN0ID0gZG9fbGlzdCgkbGlzdCk7CgkJZm9yZWFjaCAoICRsaXN0IGFzICRjb2wg KSAkdGhpcy0+c2VsZWN0W10gPSBzZWxmOjpxdW90ZSgkY29sLCAkdGFibGUpOwoJCXJldHVy biAkdGhpczsKCX0KCgkvKiogQWRkIGV4cHJlc3Npb24gdG8gV0hFUkUgY2xhdXNlLCByZWZl cnJpbmcgdG8gdGhlIGxlZnQgdGFibGUuCgkgKiAgQHBhcmFtIGNvbHVtbiBDb2x1bW4gbmFt ZQoJICogIEBwYXJhbSB2YWx1ZSBDb2x1bW4gdmFsdWUKCSAqICBAcGFyYW0gb3BlcmF0b3Ig Q29tcGFyaXNvbiBvcGVyYXRvcgoJICogIEBwYXJhbSBqb2luIEFORCBvciBPUgoJICovCglw dWJsaWMgZnVuY3Rpb24gd2hlcmUoICRjb2x1bW4sICR2YWx1ZSwgJG9wZXJhdG9yID0gJz0n LCAkam9pbiA9ICcnICkKCXsKCQlyZXR1cm4gcGFyZW50Ojp3aGVyZShzZWxmOjpxdW90ZSgk Y29sdW1uLCBzZWxmOjp0MSksICR2YWx1ZSwgJG9wZXJhdG9yLCAkam9pbik7Cgl9CgoJLyoq IEFkZCBleHByZXNzaW9uIHRvIFdIRVJFIGNsYXVzZSwgcmVmZXJyaW5nIHRvIHRoZSBqb2lu IHRhYmxlLgoJICogIEBwYXJhbSBjb2x1bW4gQ29sdW1uIG5hbWUKCSAqICBAcGFyYW0gdmFs dWUgQ29sdW1uIHZhbHVlCgkgKiAgQHBhcmFtIG9wZXJhdG9yIENvbXBhcmlzb24gb3BlcmF0 b3IKCSAqICBAcGFyYW0gam9pbiBBTkQgb3IgT1IKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHdo ZXJlX2pvaW4oICRjb2x1bW4sICR2YWx1ZSwgJG9wZXJhdG9yID0gJz0nLCAkam9pbiA9ICcn ICkKCXsKCQlyZXR1cm4gcGFyZW50Ojp3aGVyZShzZWxmOjpxdW90ZSgkY29sdW1uLCBzZWxm Ojp0MiksICR2YWx1ZSwgJG9wZXJhdG9yLCAkam9pbik7Cgl9CgoJLyoqIEFkZCBhbiBJUyBO VUxMIGV4cHJlc3Npb24sIGZvciBzZWxlY3Rpbmcgb25seSBpdGVtcyBub3QgaW4gdGhlIGpv aW4gdGFibGUKCSAqICBAcGFyYW0gY29sdW1uIEtleSBjb2x1bW4gaW4gam9pbiB0YWJsZQoJ ICovCglwdWJsaWMgZnVuY3Rpb24gd2hlcmVfam9pbl9udWxsKCAkY29sdW1uICkKCXsKCQkk am9pbiA9IHBhcmVudDo6YW5kb3IoJycpOwoJCSR0aGlzLT53aGVyZVtdID0gKCAkam9pbiA/ ICRqb2luIC4gJyAnIDogJycgKSAuIHNlbGY6OnF1b3RlKCRjb2x1bW4sIHNlbGY6OnQyKSAu ICcgaXMgbnVsbCc7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKiBBZGQgYSBjb2x1bW4gdG8g dGhlIE9SREVSIEJZIGFycmF5LgoJICogIEBwYXJhbSBjb2wgQ29sdW1uIG5hbWUgZnJvbSBs ZWZ0IHRhYmxlCgkgKiAgQHBhcmFtIGRpcmVjdGlvbiBBU0Mgb3IgREVTQwoJICovCglwdWJs aWMgZnVuY3Rpb24gb3JkZXJfYnkoICRjb2xzLCAkZGlyZWN0aW9uID0gJycgKQoJewoJCSRk aXJlY3Rpb24gPSBpbl9hcnJheShzdHJ0b2xvd2VyKCRkaXJlY3Rpb24pLCBhcnJheSgnYXNj JywgJ2Rlc2MnKSkgPyAkZGlyZWN0aW9uIDogJyc7CgkJaWYgKCBpc19zdHJpbmcoJGNvbHMp ICkgJGNvbHMgPSBkb19saXN0KCRjb2xzKTsKCQlmb3JlYWNoICggJGNvbHMgYXMgJGNvbCAp CgkJewoJCQlpZiAoICRjb2wgPT0gJ3JhbmRvbScgb3IgJGNvbCA9PSAncmFuZCcgb3IgJGNv bCA9PSAncmFuZCgpJyApCgkJCXsKCQkJCSRjb2wgPSAncmFuZCgpJzsKCQkJCSRkaXJlY3Rp b24gPSAnJzsKCQkJfQoJCQkkdGhpcy0+b3JkZXJfYnlbXSA9IHNlbGY6OnF1b3RlKCRjb2ws IHNlbGY6OnQxKSAuICggJGRpcmVjdGlvbiA/ICcgJyAuICRkaXJlY3Rpb24gOiAnJyk7CgkJ fQoJCXJldHVybiAkdGhpczsKCX0KCgkvKiogT3ZlcnJpZGUgcGFyZW50IGZ1bmN0aW9uOyBy ZXR1cm4gYSBzaW5nbGUgcmVjb3JkLgoJICogIEByZXR1cm4gYXJyYXkKCSAqLwoJcHVibGlj IGZ1bmN0aW9uIHJvdygpCgl7CgkJcmV0dXJuIGdldFJvdygkdGhpcy0+c3FsKCkpOwoJfQoK CS8qKiBPdmVycmlkZSBwYXJlbnQgZnVuY3Rpb247IHJldHVybiBhbGwgcmVjb3JkcwoJICog IEByZXR1cm4gYXJyYXkKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHJvd3MoKQoJewoJCXJldHVy biBnZXRSb3dzKCR0aGlzLT5zcWwoKSk7Cgl9CgoJLyoqIEFzc2VtYmxlIHF1ZXJ5LgoJICog IEByZXR1cm4gc3RyaW5nCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzcWwoKQoJewoJCXBhcmVu dDo6aW5pdF9xdWVyeSgpOwoJCXJldHVybiAnc2VsZWN0ICcgLiBpbXBsb2RlKCcsJywgJHRo aXMtPnNlbGVjdCkgLiAnIGZyb20gJyAuIHNlbGY6OnF1b3RlKHNhZmVfcGZ4KCR0aGlzLT50 YWJsZSkpIC4gJyBhcyAnIC4gc2VsZjo6dDEgLiAnIGxlZnQgam9pbiAnIC4gc2VsZjo6cXVv dGUoc2FmZV9wZngoJHRoaXMtPmxlZnRfam9pbikpIC4gJyBhcyAnIC4gc2VsZjo6dDIgLiAn IG9uICcgLiAkdGhpcy0+am9pbl9vbiAuICcgd2hlcmUgJyAuICR0aGlzLT5jbGF1c2Vfc3Ry aW5nKCk7Cgl9Cn0KCi8vLyBDbGFzcyBmb3IgSU5TRVJUIGFuZCBVUERBVEUgcXVlcmllcy4K Y2xhc3Mgc29vX3R4cF91cHNlcnQgZXh0ZW5kcyBzb29fdHhwX3F1ZXJ5CnsKCS8vIEZvciB1 c2Ugd2l0aCBWQUxVRVMoKSBzeW50YXgKCS8vLyBDb2x1bW5zIHRvIGJlIGV4cGxpY2l0bHkg c2V0LgoJcHVibGljICRjb2x1bW5zCQkJPSBhcnJheSgpOwoJLy8vIFZBTFVFUygpIHZhbHVl cy4KCXB1YmxpYyAkdmFsdWVzCQkJPSBhcnJheSgpOwoJLy8vIFZBTFVFUygpIGNsYXVzZQoJ cHJvdGVjdGVkICR2YWx1ZXNfY2xhdXNlCT0gJyc7CgoJLy8gRm9yIHVzZSB3aXRoIFNFVCBj b2xfbmFtZT12YWx1ZSBzeW50YXgKCS8vLyBTRVQgY29sdW1ucyBhbmQgdmFsdWVzLgoJcHVi bGljICRzZXQJCQkJPSBhcnJheSgpOwoJLy8vIFNFVCBjbGF1c2UuCglwcm90ZWN0ZWQgJHNl dF9jbGF1c2UJPSAnJzsKCgkvKiogQ29uc3RydWN0b3IuCgkgKiAgVXNlICRjb2wgdG8gdXBk YXRlIGEgc2luZ2xlIHJvdyBtYXRjaGluZyBvbiBhcHByb3ByaWF0ZSBrZXkgY29sdW1uCgkg KiAgKHVzdWFsbHkgYG5hbWVgIG9yIGBpZGApCgkgKiAgQHBhcmFtIGluaXQgVGFibGUgbmFt ZSwgc29vX3R4cF9yb3dzZXQsIG9yIHNvb190eHBfcm93CgkgKiAgQHBhcmFtIGNvbCBLZXkg Y29sdW1uIHZhbHVlIGZvciBXSEVSRSBleHByZXNzaW9uCgkgKi8KCXB1YmxpYyBmdW5jdGlv biBfX2NvbnN0cnVjdCggJGluaXQsICRjb2wgPSBudWxsICkKCXsKCQlpZiAoIGlzX3NjYWxh cigkaW5pdCkgKQoJCQlwYXJlbnQ6Ol9fY29uc3RydWN0KCRpbml0LCAkY29sKTsKCQllbHNl aWYgKCAkaW5pdCBpbnN0YW5jZW9mIHNvb190eHBfcm93c2V0ICkKCQl7CgkJCSR0aGlzLT50 YWJsZSA9ICRpbml0LT50YWJsZTsKCQkJaWYgKCAkY29sICkKCQkJCSR0aGlzLT5jb2x1bW5z ID0gaXNfYXJyYXkoJGNvbCkgPyAkY29sIDogZG9fbGlzdCgkY29sKTsKCQkJZWxzZQoJCQkJ JHRoaXMtPmNvbHVtbnMgPSBhcnJheV9rZXlzKGN1cnJlbnQoJGluaXQtPmRhdGEpKTsKCQkJ Zm9yZWFjaCAoICRpbml0LT5yb3dzIGFzICRyICkKCQkJCSR0aGlzLT52YWx1ZXNbXSA9ICRy LT5kYXRhOwoJCX0KCQllbHNlaWYgKCAkaW5pdCBpbnN0YW5jZW9mIHNvb190eHBfcm93ICkK CQl7CgkJCSR0aGlzLT50YWJsZSA9ICRpbml0LT50YWJsZTsKCQkJaWYgKCAkY29sICkKCQkJ CSR0aGlzLT5jb2x1bW5zID0gaXNfYXJyYXkoJGNvbCkgPyAkY29sIDogZG9fbGlzdCgkY29s KTsKCQkJZWxzZQoJCQkJJHRoaXMtPmNvbHVtbnMgPSBhcnJheV9rZXlzKCRpbml0LT5kYXRh KTsKCQkJJHRoaXMtPnZhbHVlc1tdID0gJGluaXQtPmRhdGE7CgkJfQoJfQoKCS8qKiBBZGQg YSBjb2x1bW46dmFsdWUgcGFpciB0byB0aGUgJHNldCBhcnJheS4KCSAqICBAcGFyYW0gY29s dW1uIENvbHVtbiBuYW1lCgkgKiAgQHBhcmFtIHZhbHVlIENvbHVtbiB2YWx1ZQoJICovCglw dWJsaWMgZnVuY3Rpb24gc2V0KCAkY29sdW1uLCAkdmFsdWUgKQoJewoJCSR0aGlzLT5zZXRb JGNvbHVtbl0gPSAkdmFsdWU7CgkJcmV0dXJuICR0aGlzOwoJfQoKCXByaXZhdGUgZnVuY3Rp b24gaW5pdF9xdWVyeSgpCgl7CgkJaWYgKCBjb3VudCgkdGhpcy0+c2V0KSApCgkJewoJCQlm b3JlYWNoICggJHRoaXMtPnNldCBhcyAkY29sID0+ICR2YWwgKQoJCQl7CgkJCQkkdmFsID0g aXNfbnVtZXJpYygkdmFsKSA/ICR2YWwgOiAiJyR2YWwnIjsKCQkJCSRzZXRfcGFpcnNbXSA9 ICIkY29sID0gJHZhbCI7CgkJCX0KCQkJJHRoaXMtPnNldF9jbGF1c2UgPSBpbXBsb2RlKCcs JywgJHNldF9wYWlycyk7CgkJfQoJCWVsc2VpZiAoIGNvdW50KCR0aGlzLT52YWx1ZXMpICkK CQl7CgkJCWlmICggY291bnQoJHRoaXMtPmNvbHVtbnMpICkKCQkJCSR0aGlzLT52YWx1ZXNf Y2xhdXNlID0gJyhgJyAuIGltcGxvZGUoJ2AsYCcsICR0aGlzLT5jb2x1bW5zKSAuICdgKSAn OwoJCQkkdGhpcy0+dmFsdWVzX2NsYXVzZSAuPSAnIHZhbHVlcyAnOwoJCQlmb3JlYWNoICgg JHRoaXMtPnZhbHVlcyBhcyAkdnMgKQoJCQl7CgkJCQkkdGhpcy0+dmFsdWVzX2NsYXVzZSAu PSAnKCc7CgkJCQlmb3JlYWNoICggJHZzIGFzICR2ICkKCQkJCQkkdGhpcy0+dmFsdWVzX2Ns YXVzZSAuPSAoIGlzX251bWVyaWMoJHYpID8gJHYgOiAiJyR2JyIgKSAuICcsJzsKCQkJCSR0 aGlzLT52YWx1ZXNfY2xhdXNlID0gcnRyaW0oJHRoaXMtPnZhbHVlc19jbGF1c2UsICcsJykg LiAnKSwnOwoJCQl9CgkJCSR0aGlzLT52YWx1ZXNfY2xhdXNlID0gcnRyaW0oJHRoaXMtPnZh bHVlc19jbGF1c2UsICcsJykgLiAnOyc7CgkJfQoJfQoKCS8qKiBSdW4gdGhlIHF1ZXJ5LgoJ ICogIFJ1bnMgYW4gVVBEQVRFIHF1ZXJ5IGlmICR3aGVyZSBpcyBzZXQsIG90aGVyd2lzZSBJ TlNFUlQKCSAqICBAcmV0dXJuIGJvb2wgc3VjY2VzcyBvciBmYWlsdXJlCgkgKi8KCXB1Ymxp YyBmdW5jdGlvbiB1cHNlcnQoKQoJewoJCSR0aGlzLT5pbml0X3F1ZXJ5KCk7CgkJaWYgKCBj b3VudCgkdGhpcy0+d2hlcmUpICkKCQkJcmV0dXJuIHNhZmVfdXBzZXJ0KCR0aGlzLT50YWJs ZSwgJHRoaXMtPnNldF9jbGF1c2UsICR0aGlzLT5jbGF1c2Vfc3RyaW5nKCkpOwoJCWlmICgg JHRoaXMtPnNldF9jbGF1c2UgKQoJCQlyZXR1cm4gc2FmZV9pbnNlcnQoJHRoaXMtPnRhYmxl LCAkdGhpcy0+c2V0X2NsYXVzZSk7CgkJaWYgKCAkdGhpcy0+dmFsdWVzX2NsYXVzZSApCgkJ CXJldHVybiBzYWZlX3F1ZXJ5KCdpbnNlcnQgaW50byAnIC4gc2FmZV9wZngoJHRoaXMtPnRh YmxlKSAuICR0aGlzLT52YWx1ZXNfY2xhdXNlKTsKCX0KfQoKLy8vIENsYXNzIGZvciBERUxF VEUgcXVlcmllcy4KY2xhc3Mgc29vX3R4cF9kZWxldGUgZXh0ZW5kcyBzb29fdHhwX3F1ZXJ5 CnsKCS8qKiBFeGVjdXRlIHRoZSBERUxFVEUgcXVlcnkuCgkgKiAgQHJldHVybiBib29sCVF1 ZXJ5IHN1Y2Nlc3Mgb3IgZmFpbHVyZQoJICovCglwdWJsaWMgZnVuY3Rpb24gZGVsZXRlKCkK CXsKCQlpZiAoIGNvdW50KCR0aGlzLT53aGVyZSkgKQoJCQlyZXR1cm4gc2FmZV9kZWxldGUo JHRoaXMtPnRhYmxlLCAkdGhpcy0+Y2xhdXNlX3N0cmluZygpKTsKCX0KfQoKLy8vIENsYXNz IGZvciBkYXRhIHJlc3VsdHMgc2V0cy4KY2xhc3Mgc29vX3R4cF9yb3dzZXQgZXh0ZW5kcyBz b29fb2JqCnsKCgkvLy8gRGF0YWJhc2UgdGFibGUgbmFtZS4KCXByb3RlY3RlZCAkdGFibGUJ CT0gJyc7CgoJLy8vIEFycmF5IG9mIHNvb190eHBfcm93IG9iamVjdHMuCglwdWJsaWMgJHJv d3MJCQk9IGFycmF5KCk7CgoJLyoqIENvbnN0cnVjdG9yLgoJICogICRpbml0IGNhbiBiZSBh IHNvb190eHBfc2VsZWN0IG9iamVjdCwgbXlzcWwgcmVzdWx0IHJlc291cmNlLAoJICogIG9y IGFuIGFycmF5IG9mIHJlY29yZHMuCgkgKiAgSWYgJGluZGV4IGlzIHByb3ZpZGVkIG9yIGlm ICRpbml0IGlzIGEgc29vX3R4cF9zZWxlY3Qgb2JqZWN0LAoJICogIHRoZSAkcm93cyBhcnJh eSB3aWxsIGJlIGluZGV4ZWQgYnkga2V5IGNvbHVtbiB2YWx1ZXMuCgkgKiAgQHBhcmFtIGlu aXQgRGF0YSBhcnJheSBvciBxdWVyeSBvYmplY3QgdG8gaW5pdGlhbGl6ZSByb3dzZXQKCSAq ICBAcGFyYW0gdGFibGUgVHhwIHRhYmxlIG5hbWUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9f Y29uc3RydWN0KCAkaW5pdCA9IGFycmF5KCksICR0YWJsZSA9ICcnLCAkaW5kZXggPSBudWxs ICkKCXsKCQlpZiAoICRpbml0IGluc3RhbmNlb2Ygc29vX3R4cF9zZWxlY3QgKQoJCXsKCQkJ JHRhYmxlID0gJGluaXQtPnRhYmxlOwoJCQkkaW5kZXggPSAkaW5pdC0+a2V5X2NvbHVtbigp OwoJCQkkaW5pdCA9ICRpbml0LT5yb3dzKCk7CgkJfQoJCWlmICggaXNfcmVzb3VyY2UoJGlu aXQpIGFuZCBteXNxbF9udW1fcm93cygkaW5pdCkgKQoJCXsKCQkJd2hpbGUgKCAkciA9IG15 c3FsX2ZldGNoX2Fzc29jKCRpbml0KSApCgkJCQkkZGF0YVtdID0gJHI7CgkJCW15c3FsX2Zy ZWVfcmVzdWx0KCRpbml0KTsKCQkJJGluaXQgPSAkZGF0YTsKCQl9CgkJJHRoaXMtPnRhYmxl ID0gJHRhYmxlOwoJCWlmICggaXNfYXJyYXkoJGluaXQpIGFuZCBjb3VudCgkaW5pdCkgKQoJ CXsKCQkJZm9yZWFjaCAoICRpbml0IGFzICRyICkKCQkJCWlmICggJGluZGV4ICkKCQkJCQkk dGhpcy0+YWRkX3JvdygkciwgJHRhYmxlLCAkclskaW5kZXhdKTsKCQkJCWVsc2UKCQkJCQkk dGhpcy0+YWRkX3JvdygkciwgJHRhYmxlKTsKCQl9Cgl9CgoJLyoqIEdlbmVyaWMgZ2V0dGVy LCBvdmVycmlkaW5nIHBhcmVudCBtZXRob2QuCgkgKiAgSWYgJHByb3BlcnR5IGlzIG5vdCBh IHByb3BlcnR5IG5hbWUsIGxvb2sgZm9yIHJvdyBvYmplY3QKCSAqICBtYXRjaGluZyB0aGlz IGluZGV4IHZhbHVlCgkgKiAgQHBhcmFtIHByb3BlcnR5IFByb3BlcnR5IG5hbWUsIG9yIHJv d3NldCBpbmRleAoJICovCglwdWJsaWMgZnVuY3Rpb24gX19nZXQoICRwcm9wZXJ0eSApCgl7 CgkJaWYgKCBwcm9wZXJ0eV9leGlzdHMoJHRoaXMsICRwcm9wZXJ0eSkgKQoJCQlyZXR1cm4g JHRoaXMtPiRwcm9wZXJ0eTsKCQlpZiAoIGFycmF5X2tleV9leGlzdHMoJHByb3BlcnR5LCAk dGhpcy0+cm93cykgKQoJCQlyZXR1cm4gJHRoaXMtPnJvd3NbJHByb3BlcnR5XTsKCX0KCgkv KiogUmV0dXJuIGFuIGFycmF5IG9mIGFsbCB2YWx1ZXMgZm9yIGEgcGFydGljdWxhciBjb2x1 bW4gKGZpZWxkKS4KCSAqICBJZiAka2V5IGlzIHNldCwgbWFrZSBpdCBhbiBhc3NvY2lhdGl2 ZSBhcnJheSwgdXNpbmcgdGhlIHZhbHVlCgkgKiAgb2YgdGhlIGtleSBjb2x1bW4gYXMgdGhl IGFycmF5IGluZGV4CgkgKiAgQHBhcmFtIGZpZWxkIENvbHVtbiAoZmllbGQpIG5hbWUKCSAq ICBAcGFyYW0ga2V5IEtleSBjb2x1bW4gbmFtZQoJICovCglwdWJsaWMgZnVuY3Rpb24gZmll bGRfdmFscyggJGZpZWxkLCAka2V5ID0gbnVsbCApCgl7CgkJZm9yZWFjaCAoICR0aGlzLT5y b3dzIGFzICRyICkKCQkJaWYgKCAhIGlzX251bGwoJGtleSkgKQoJCQkJJG91dFskci0+JGtl eV0gPSAkci0+JGZpZWxkOwoJCQllbHNlCgkJCQkkb3V0W10gPSAkci0+JGZpZWxkOwoJCXJl dHVybiBpc3NldCgkb3V0KSA/ICRvdXQgOiBhcnJheSgpOwoJfQoKCS8qKiBBZGQgYSBzb29f dHhwX3JvdyBvYmplY3QgdG8gJHJvd3MuCgkgKiAgQHBhcmFtIGRhdGEgc29vX3R4cF9yb3cg b2JqZWN0IG9yIGtleSB2YWx1ZQoJICogIEBwYXJhbSB0YWJsZSBUeHAgdGFibGUgbmFtZQoJ ICogIEBwYXJhbSBpIGluZGV4IHZhbHVlIGZvciBuZXcgcm93IGluICRyb3dzIGFycmF5Cgkg Ki8KCXB1YmxpYyBmdW5jdGlvbiBhZGRfcm93KCAkZGF0YSwgJHRhYmxlID0gbnVsbCwgJGkg PSBudWxsICkKCXsKCQkkdGFibGUgPSBpc19udWxsKCR0YWJsZSkgPyAkdGhpcy0+dGFibGUg OiAkdGFibGU7CgkJJHIgPSAkZGF0YSBpbnN0YW5jZW9mIHNvb190eHBfcm93ID8KCQkJJGRh dGEgOiAoICR0YWJsZSA9PSAndHhwX2ltYWdlJyA/CgkJCQluZXcgc29vX3R4cF9pbWcoJGRh dGEpIDogbmV3IHNvb190eHBfcm93KCRkYXRhLCAkdGFibGUpICk7CgkJaWYgKCBpc19udWxs KCRpKSApCgkJCSR0aGlzLT5yb3dzW10gPSAkcjsKCQllbHNlCgkJCSR0aGlzLT5yb3dzWyRp XSA9ICRyOwoJCXJldHVybiAkdGhpczsKCX0KCgkvKiogU3BsaXQgb2ZmIGEgc3Vic2V0IG9m IHJvd3MgYXMgYSBuZXcgc29vX3R4cF9yb3dzZXQgb2JqZWN0CgkgKiAgQHBhcmFtIGtleSBh cnJheSBrZXkgZm9yIGZpbmRpbmcgcm93cyBmb3IgdGhlIG5ldyBzZXQKCSAqICBAcGFyYW0g dmFsdWUga2V5IGNvbHVtbiB2YWx1ZSB0byBtYXRjaCBmb3Igcm93cyBmb3IgdGhlIG5ldyBz ZXQKCSAqICBAcGFyYW0gaW5kZXggYXJyYXkgaW5kZXggZm9yIG5ldyByb3dzZXQgcm93cwoJ ICogIEByZXR1cm4gc29vX3R4cF9yb3dzZXQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHN1YnNl dCggJGtleSwgJHZhbHVlLCAkaW5kZXggPSBudWxsICkKCXsKCQkkb3V0ID0gbmV3IHNlbGY7 CgkJZm9yZWFjaCAoICR0aGlzLT5yb3dzIGFzICRyb3cgKQoJCQlpZiAoICRyb3ctPiRrZXkg PT0gJHZhbHVlICkKCQkJCSRvdXQtPmFkZF9yb3coJHJvdywgbnVsbCwgaXNfbnVsbCgkaW5k ZXgpID8gbnVsbCA6ICRyb3ctPiRpbmRleCk7CgkJcmV0dXJuICRvdXQ7Cgl9Cn0KCi8vLyBD bGFzcyBmb3IgSm9lIENlbGtvIG5lc3RlZCBzZXRzLCBha2EgbW9kaWZpZWQgcHJlb3JkZXIg dHJlZQpjbGFzcyBzb29fbmVzdGVkX3NldCBleHRlbmRzIHNvb190eHBfcm93c2V0CnsKCS8q KiBDb25zdHJ1Y3Rvci4KCSAqICAkaW5pdCBjYW4gYmUgYSBzb29fdHhwX3Jvd3NldCBvYmpl Y3QsCgkgKiAgb3RoZXJ3aXNlIHNlZSBwYXJlbnQ6Ol9fY29uc3RydWN0KCkKCSAqICBAcGFy YW0gaW5pdCBEYXRhIGFycmF5IG9yIHF1ZXJ5IG9iamVjdCB0byBpbml0aWFsaXplIHJvd3Nl dAoJICogIEBwYXJhbSB0YWJsZSBUeHAgdGFibGUgbmFtZQoJICovCglwdWJsaWMgZnVuY3Rp b24gX19jb25zdHJ1Y3QoICRpbml0ID0gYXJyYXkoKSwgJHRhYmxlID0gJycsICRpbmRleCA9 IG51bGwgKQoJewoJCWlmICggJGluaXQgaW5zdGFuY2VvZiBzb29fdHhwX3Jvd3NldCApCgkJ ewoJCQkkdGhpcy0+dGFibGUgPSAkaW5pdC0+dGFibGU7CgkJCSR0aGlzLT5yb3dzID0gJGlu aXQtPnJvd3M7CgkJfQoJCWVsc2UKCQkJcGFyZW50OjpfX2NvbnN0cnVjdCgkaW5pdCwgJHRh YmxlKTsKCX0KCgkvKiogUmV0dXJuIGFsbCByb3dzIGFzIGEgbmVzdGVkIGFycmF5IG9mIHJv dyBvYmplY3RzLgoJICogIEVhY2ggYXJyYXkgaXRlbSBpcyBlaXRoZXIgYSBzb29fdHhwX3Jv dyBvYmplY3QsCgkgKiAgb3IgYW4gYXJyYXkgb2Ygc3VjaC4gSWYgYW4gYXJyYXksIGl0IGlz IHRoZSBjaGlsZHJlbiBvZiB0aGUKCSAqICBpbW1lZGlhdGVseSBwcmVjZWRpbmcgaXRlbS4K CSAqICBUaGlzIGlzIGEgcmVjdXJzaXZlIGZ1bmN0aW9uLgoJICogIEBwYXJhbSByb3dzIElu dGVybmFsIHVzZSBvbmx5LgoJICogIEBwYXJhbSByZ3QgSW50ZXJuYWwgdXNlIG9ubHkuCgkg Ki8KCXB1YmxpYyBmdW5jdGlvbiBhc19vYmplY3RfYXJyYXkoICYkcm93cyA9IG51bGwsICRy Z3QgPSBudWxsICkKCXsKCQlpZiAoIGlzX251bGwoJHJvd3MpICkKCQl7CgkJCSRyb3dzID0g JHRoaXMtPnJvd3M7CgkJCSRyb290ID0gY3VycmVudCgkcm93cyk7CgkJCSRyZ3QgPSAkcm9v dC0+cmd0OwoJCX0KCQl3aGlsZSAoICRvdXRbXSA9ICRub2RlID0gYXJyYXlfc2hpZnQoJHJv d3MpIGFuZCAkbm9kZS0+cmd0IDw9ICRyZ3QgKQoJCQlpZiAoICRub2RlLT5yZ3QgPiAkbm9k ZS0+bGZ0ICsgMSApCgkJCQkkb3V0W10gPSAkdGhpcy0+YXNfb2JqZWN0X2FycmF5KCRyb3dz LCAkbm9kZS0+cmd0KTsKIAkJaWYgKCAkbm9kZSBhbmQgJG5vZGUtPnJndCA+ICRyZ3QgKQog CQkJYXJyYXlfdW5zaGlmdCgkcm93cywgYXJyYXlfcG9wKCRvdXQpKTsKIAkJaWYgKCBpc19u dWxsKCRvdXRbY291bnQoJG91dCkgLSAxXSkgKQogCQkJYXJyYXlfcG9wKCRvdXQpOwoJCXJl dHVybiAkb3V0OwoJfQoKCS8qKiBSZXR1cm4gYWxsIHJvd3MgYXMgYSBuZXN0ZWQgYXJyYXkg b2YgdmFsdWVzLgoJICogIEVhY2ggYXJyYXkgaXRlbSBpcyBlaXRoZXIgYSBub2RlLCBhcyAk aW5kZXhfY29sdW1uID0+ICR2YWx1ZV9jb2x1bW4sCgkgKiAgb3IgYW4gYXJyYXkgb2Ygc3Vj aC4gSWYgYW4gYXJyYXksIGl0IGlzIHRoZSBjaGlsZHJlbiBvZiB0aGUKCSAqICBpbW1lZGlh dGVseSBwcmVjZWRpbmcgaXRlbSwgYW5kIGhhcyB0aGUga2V5ICd4X2MnIHdoZXJlICd4JyBp cwoJICogIHRoZSBwYXJlbnQgbm9kZSdzIGluZGV4LgoJICogIFRoaXMgaXMgYSByZWN1cnNp dmUgZnVuY3Rpb24uCgkgKiAgQHBhcmFtIGluZGV4X2NvbHVtbiBDb2x1bW4gZm9yIG5vZGUg aW5kZXggdmFsdWUKCSAqICBAcGFyYW0gaW5kZXhfY29sdW1uIENvbHVtbiBmb3Igbm9kZSB2 YWx1ZQoJICogIEBwYXJhbSByb3dzIEludGVybmFsIHVzZSBvbmx5LgoJICogIEBwYXJhbSBy Z3QgSW50ZXJuYWwgdXNlIG9ubHkuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBhc19hcnJheSgg JGluZGV4X2NvbHVtbiwgJHZhbHVlX2NvbHVtbiwgJiRyb3dzID0gbnVsbCwgJHJndCA9IG51 bGwgKQoJewoJCWlmICggaXNfbnVsbCgkcm93cykgKQoJCXsKCQkJJHJvd3MgPSAkdGhpcy0+ cm93czsKCQkJJHJvb3QgPSBjdXJyZW50KCRyb3dzKTsKCQkJJHJndCA9ICRyb290LT5yZ3Q7 CgkJfQoJCXdoaWxlICggJG5vZGUgPSBhcnJheV9zaGlmdCgkcm93cykgYW5kICRub2RlLT5y Z3QgPD0gJHJndCApCgkJewoJCQkkb3V0WyRub2RlLT4kaW5kZXhfY29sdW1uXSA9ICRub2Rl LT4kdmFsdWVfY29sdW1uOwoJCQlpZiAoICRub2RlLT5yZ3QgPiAkbm9kZS0+bGZ0ICsgMSAp CgkJCQkkb3V0WyRub2RlLT4kaW5kZXhfY29sdW1uIC4gJ19jJ10gPSAkdGhpcy0+YXNfYXJy YXkoJGluZGV4X2NvbHVtbiwgJHZhbHVlX2NvbHVtbiwgJHJvd3MsICRub2RlLT5yZ3QpOwoJ CX0KIAkJaWYgKCAkbm9kZSBhbmQgJG5vZGUtPnJndCA+ICRyZ3QgKQogCQkJYXJyYXlfdW5z aGlmdCgkcm93cywgJG5vZGUpOwoJCXJldHVybiAkb3V0OwoJfQoKCS8qKiBTcGxpdCBvZmYg YSBzdWJ0cmVlIG9mIHJvd3MgYXMgYSBuZXcgc29vX25lc3RlZF9zZXQgb2JqZWN0CgkgKiAg QHBhcmFtIHJvb3QgaWQgb2Ygc3VidHJlZSByb290IG5vZGUKCSAqICBAcmV0dXJuIHNvb190 eHBfcm93c2V0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzdWJ0cmVlKCAkcm9vdCwgJGluZGV4 ID0gbnVsbCApCgl7CgkJJG91dCA9IG5ldyBzZWxmOwoJCSRyb290ID0gJHRoaXMtPnJvd3Nb JHJvb3RdOwoJCWZvcmVhY2ggKCAkdGhpcy0+cm93cyBhcyAkcm93ICkKCQkJaWYgKCAkcm93 LT5sZnQgPj0gJHJvb3QtPmxmdCBhbmQgJHJvdy0+cmd0IDw9ICRyb290LT5yZ3QgKQoJCQkJ JG91dC0+YWRkX3Jvdygkcm93LCBudWxsLCBpc19udWxsKCRpbmRleCkgPyBudWxsIDogJHJv dy0+JGluZGV4KTsKCQlyZXR1cm4gJG91dDsKCX0KfQoKLy8vIENsYXNzIGZvciBzaW5nbGUg ZGF0YSByZWNvcmRzLgpjbGFzcyBzb29fdHhwX3JvdyBleHRlbmRzIHNvb19vYmoKewoJLy8v IERhdGFiYXNlIHRhYmxlIG5hbWUuCglwcm90ZWN0ZWQgJHRhYmxlCQk9ICcnOwoJLy8vIERh dGFiYXNlIHJlY29yZC4KCXByb3RlY3RlZCAkZGF0YQkJCT0gYXJyYXkoKTsKCgkvKiogQ29u c3RydWN0b3IuCgkgKiAgQHBhcmFtIGluaXQgS2V5IHZhbHVlLCBzb29fdHhwX3NlbGVjdCBv YmplY3QsIG9yIGRhdGEgYXJyYXkKCSAqICBAcGFyYW0gdGFibGUgVHhwIHRhYmxlIG5hbWUK CSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCAkaW5pdCA9IGFycmF5KCksICR0 YWJsZSA9ICcnICkKCXsKCQlpZiAoIGlzX3NjYWxhcigkaW5pdCkgYW5kICR0YWJsZSApCgkJ CSRpbml0ID0gbmV3IHNvb190eHBfc2VsZWN0KCR0YWJsZSwgJGluaXQpOwoJCWlmICggJGlu aXQgaW5zdGFuY2VvZiBzb29fdHhwX3NlbGVjdCApCgkJewoJCQkkdGFibGUgPSAkaW5pdC0+ dGFibGU7CgkJCSRpbml0ID0gJGluaXQtPnJvdygpOwoJCX0KCQlpZiAoIGlzX2FycmF5KCRp bml0KSApCgkJCWZvcmVhY2ggKCAkaW5pdCBhcyAkayA9PiAkdiApCgkJCQkkdGhpcy0+ZGF0 YVska10gPSAkdjsKCQkkdGhpcy0+dGFibGUgPSAkdGFibGU7Cgl9CgoJLyoqIEdlbmVyaWMg Z2V0dGVyLCBvdmVycmlkaW5nIHBhcmVudCBtZXRob2QuCgkgKiAgTG9vayBmb3IgJHByb3Bl cnR5IGluIHRoZSAkZGF0YSBhcnJheSBmaXJzdAoJICogIEBwYXJhbSBwcm9wZXJ0eSBDb2x1 bW4gb3IgcHJvcGVydHkgbmFtZQoJICogIEByZXR1cm4gbWl4ZWQgRGF0YSBmaWVsZCBvciBv YmplY3QgcHJvcGVydHkKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fZ2V0KCAkcHJvcGVydHkg KQoJewoJCXJldHVybiBpc3NldCgkdGhpcy0+ZGF0YVskcHJvcGVydHldKSA/ICR0aGlzLT5k YXRhWyRwcm9wZXJ0eV0KCQkJOiBwYXJlbnQ6Ol9fZ2V0KCRwcm9wZXJ0eSk7Cgl9CgoJLy8v IE92ZXJyaWRlIHBhcmVudCBtZXRob2QsIHRvIGtlZXAgJGRhdGEgcHJvdGVjdGVkLgoJcHVi bGljIGZ1bmN0aW9uIGRhdGEoICkKCXsKCQlyZXR1cm47Cgl9CgoJLy8vIEByZXR1cm4gYXJy YXkgRGF0YWJhc2UgcmVjb3JkIChjb2x1bW46dmFsdWUgYXJyYXkpCglwdWJsaWMgZnVuY3Rp b24gcHJvcGVydGllcyggKQoJewoJCXJldHVybiAkdGhpcy0+ZGF0YTsKCX0KfQoKLy8vIENs YXNzIGZvciBUeHAgaW1hZ2UgcmVjb3Jkcy4KY2xhc3Mgc29vX3R4cF9pbWcgZXh0ZW5kcyBz b29fdHhwX3Jvdwp7CgkvLy8gVVJMIG9mIGZ1bGwtc2l6ZSBpbWFnZS4KCXByb3RlY3RlZCAk ZnVsbF91cmwJCT0gJyc7CgkvLy8gVVJMIG9mIHRodW1ibmFpbCBpbWFnZS4KCXByb3RlY3Rl ZCAkdGh1bWJfdXJsCT0gJyc7CgoJLyoqIENvbnN0cnVjdG9yLgoJICogIEBwYXJhbSBpbml0 IFR4cCBpbWFnZSBpZAoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoICRpbml0 ICkKCXsKCQlnbG9iYWwgJGltZ19kaXI7CgkJcGFyZW50OjpfX2NvbnN0cnVjdCgkaW5pdCwg J3R4cF9pbWFnZScpOwoJCSR0aGlzLT5mdWxsX3VybCA9IGh1IC4gJGltZ19kaXIgLiAnLycg LiAkdGhpcy0+aWQgLiAkdGhpcy0+ZXh0OwoJCWlmICggJHRoaXMtPnRodW1ibmFpbCApCgkJ CSR0aGlzLT50aHVtYl91cmwgPSBodSAuICRpbWdfZGlyIC4gJy8nIC4gJHRoaXMtPmlkIC4g J3QnIC4gJHRoaXMtPmV4dDsKCX0KfQoKLy8vIEFic3RhY3QgYmFzZSBjbGFzcyBmb3IgKFgp SFRNTCBlbGVtZW50cy4KYWJzdHJhY3QgY2xhc3Mgc29vX2h0bWwgZXh0ZW5kcyBzb29fb2Jq CnsKLy8gSFRNTCBlbGVtZW50IGNsYXNzLiBJbnN0YW50aWF0aW9uIHRha2VzIGEgcmVxdWly ZWQgJ25hbWUnIGFyZ3VtZW50IGFuZCBhbgovLyBvcHRpb25hbCAnYXR0cycgYXJyYXk6IGl0 ZW1zIHdpdGgga2V5cyBtYXRjaGluZyBIVE1MIGF0dHJpYnV0ZXMKLy8gd2lsbCBiZSB0cmFu c2ZlcnJlZCB0byB0aGUgbmV3IG9iamVjdC4KLy8KLy8gU2VlIHRoZSBzb29faHRtbF9pbWcg Y2xhc3MgZm9yIGFuIGV4YW1wbGUgb2YgaG93IHRvIGV4dGVuZCB0aGlzIGNsYXNzLgoKCS8v LyBAbmFtZSBJbmhlcmVudCBwcm9wZXJ0aWVzCgkvL0B7CgkvLy8gKFgpSFRNTCBlbGVtZW50 IG5hbWUKCXByb3RlY3RlZCAkZWxlbWVudF9uYW1lCT0gJyc7CgkvLy8gY29udGFpbmVyIChm YWxzZSkgb3IgZW1wdHkgZWxlbWVudCAodHJ1ZSkKCXByb3RlY3RlZCAkaXNfZW1wdHkJCT0g MDsKCS8vLyBFbGVtZW50IGNvbnRlbnQgYXJyYXkgKHN0cmluZ3Mgb3Igc29vX2h0bWwgb2Jq ZWN0cykKCXByb3RlY3RlZCAkY29udGVudHMJCT0gYXJyYXkoKTsKCS8vQH0KCgkvLy8gQG5h bWUgQ29tbW9uIChYKUhUTUwgYXR0cmlidXRlcwoJLy9AewoJcHJvdGVjdGVkICRjbGFzcwkJ CT0gJyc7Cglwcm90ZWN0ZWQgJGRpcgkJCQk9ICcnOwoJcHJvdGVjdGVkICRpZAkJCQk9ICcn OwoJcHJvdGVjdGVkICRsYW5nCQkJCT0gJyc7Cglwcm90ZWN0ZWQgJG9uY2xpY2sJCQk9ICcn OwoJcHJvdGVjdGVkICRvbmRibGNsaWNrCQk9ICcnOwoJcHJvdGVjdGVkICRvbmtleWRvd24J CT0gJyc7Cglwcm90ZWN0ZWQgJG9ua2V5cHJlc3MJCT0gJyc7Cglwcm90ZWN0ZWQgJG9ua2V5 dXAJCQk9ICcnOwoJcHJvdGVjdGVkICRvbm1vdXNlZG93bgkJPSAnJzsKCXByb3RlY3RlZCAk b25tb3VzZW1vdmUJCT0gJyc7Cglwcm90ZWN0ZWQgJG9ubW91c2VvdXQJCT0gJyc7Cglwcm90 ZWN0ZWQgJG9ubW91c2VvdmVyCQk9ICcnOwoJcHJvdGVjdGVkICRvbm1vdXNldXAJCT0gJyc7 Cglwcm90ZWN0ZWQgJHN0eWxlCQkJPSAnJzsKCXByb3RlY3RlZCAkdGl0bGUJCQk9ICcnOwoJ Ly9AfQoKCS8qKiBDb25zdHJ1Y3Rvci4KCSAqICBAcGFyYW0gZWxlbWVudF9uYW1lIChYKUhU TUwgZWxlbWVudCBuYW1lCgkgKiAgQHBhcmFtIGF0dHMgQXR0cmlidXRlcyAoYXJyYXkgb2Yg bmFtZT0+dmFsdWUgcGFpcnMpCgkgKiAgQHBhcmFtIGNvbnRlbnQgRWxlbWVudCBjb250ZW50 IChzdHJpbmcsIHNvb19odG1sIG9iamVjdCwgb3IgYXJyYXkgdGhlcmVvZikKCSAqLwoJcHVi bGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRlbGVtZW50X25hbWUsICRhdHRzLCAkY29udGVu dCA9IG51bGwsICRpc19lbXB0eSA9IDApCgl7CgkJJHRoaXMtPmVsZW1lbnRfbmFtZSgkZWxl bWVudF9uYW1lKS0+aXNfZW1wdHkoJGlzX2VtcHR5KTsKCQlpZiAoIGVtcHR5KCRhdHRzKSAp CgkJCSRhdHRzID0gYXJyYXkoKTsKCQlmb3JlYWNoICggJHRoaXMgYXMgJHByb3BlcnR5ID0+ ICR2YWx1ZSApCgkJCWlmICggaW5fYXJyYXkoJHByb3BlcnR5LCBhcnJheV9rZXlzKCRhdHRz KSkgKQoJCQkJJHRoaXMtPiRwcm9wZXJ0eSgkYXR0c1skcHJvcGVydHldKTsKCQlpZiAoICRj b250ZW50ICkKCQkJJHRoaXMtPmNvbnRlbnRzKCRjb250ZW50KTsKCX0KCgkvKiogVmFsaWRh dGUgYW5kIHNldCBpZCBhdHRyaWJ1dGUuCgkgKiAgSW1wb3J0YW50OiAoWClIVE1MIGF0dHJp YnV0ZSwgTk9UIGEgZGF0YWJhc2UgSUQhCgkgKiAgQHBhcmFtIGlkIChtdXN0IGJlZ2luIHdp dGggYSBsZXR0ZXIpCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBpZCgkaWQpCgl7CgkJaWYgKCAk aWQgYW5kICFwcmVnX21hdGNoKCcvXlthLXpdLycsIHN0cnRvbG93ZXIodHJpbSgkaWQpKSkg KQoJCXsKCQkJJHRoaXMtPmlkID0gJ2ludmFsaWRfSFRNTF9JRF92YWx1ZV9mcm9tX1Nvb19U eHBfT2JqJzsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkkdGhpcy0+aWQgPSAkaWQ7CgkJcmV0 dXJuICR0aGlzOwoJfQoKCS8qKiBBZGQgc3RyaW5nfG9iamVjdHxhcnJheSB0byAkY29udGVu dHMgYXJyYXkuCgkgKiAgQHBhcmFtIGNvbnRlbnQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGNv bnRlbnRzKCRjb250ZW50KQoJewoJCWlmICggISAkdGhpcy0+aXNfZW1wdHkgKQoJCXsKCQkJ JGNvbnRlbnQgPSBpc19hcnJheSgkY29udGVudCkgPyAkY29udGVudCA6IGFycmF5KCRjb250 ZW50KTsKCQkJZm9yZWFjaCAoICRjb250ZW50IGFzICRpID0+ICRpdGVtICkKCQkJCWlmICgg aXNfbnVsbCgkaXRlbSkgKQoJCQkJCXVuc2V0KCRjb250ZW50WyRpXSk7CgkJCSR0aGlzLT5j b250ZW50cyA9IGFycmF5X21lcmdlKCR0aGlzLT5jb250ZW50cywgJGNvbnRlbnQpOwoJCX0K CQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqIFJldHVybiBhbiBhdHRyaWJ1dGU6dmFsdWUgYXJy YXkgb2YgYWxsIChYKUhUTUwgYXR0cmlidXRlcy4KCSAqICBIYXJkLWNvZGVkIGxpc3Qgb2Yg ZXhjbHVkZWQgcHJvcGVydGllcyBpcyByYXRoZXIgbGFtZSwKCSAqICBidXQgSSBoYXZlbid0 IHRob3VnaHQgb2YgYW55dGhpbmcgYmV0dGVyIHlldC4KCSAqICBAcmV0dXJuIGFycmF5Cgkg Ki8KCXByaXZhdGUgZnVuY3Rpb24gaHRtbF9hdHRyaWJ1dGVzKCkKCXsKCQlyZXR1cm4gYXJy YXlfZGlmZl9rZXkoJHRoaXMtPnByb3BlcnRpZXMoKSwgYXJyYXlfZmxpcChhcnJheSgnZWxl bWVudF9uYW1lJywgJ2lzX2VtcHR5JywgJ2NvbnRlbnRzJykpKTsKCX0KCgkvKiogQ3JlYXRl IChYKUhUTUwgdGFnKHMpIHN0cmluZyBmb3IgdGhpcyBlbGVtZW50LgoJICogIFJlY3Vyc2l2 ZWx5IHRhZ3MgY29udGFpbmVkIGVsZW1lbnRzCgkgKiAgQHJldHVybiBzdHJpbmcKCSAqLwoJ cHVibGljIGZ1bmN0aW9uIHRhZygpCgl7CgkJJG91dCA9ICc8JyAuICR0aGlzLT5lbGVtZW50 X25hbWU7CgoJCWZvcmVhY2ggKCAkdGhpcy0+aHRtbF9hdHRyaWJ1dGVzKCkgYXMgJHByb3Bl cnR5ID0+ICR2YWx1ZSApCgkJCWlmICggJHZhbHVlIG9yICRwcm9wZXJ0eSA9PSAnYWx0JyAp CgkJCQkkb3V0IC49ICIgJHByb3BlcnR5PVwiJHZhbHVlXCIiOwoKCQlpZiAoICR0aGlzLT5p c19lbXB0eSApCgkJCXJldHVybiAkb3V0IC4gJyAvPic7CgoJCSRvdXQgLj0gJz4nIC4gJHRo aXMtPm5ld2xpbmUoKTsKCgkJZm9yZWFjaCAoICR0aGlzLT5jb250ZW50cyBhcyAkaXRlbSAp CgoJCQlpZiAoICRpdGVtIGluc3RhbmNlb2Ygc29vX2h0bWwgKQoJCQkJJG91dCAuPSAkaXRl bS0+dGFnKCk7CgkJCWVsc2UKCQkJCSRvdXQgLj0gJGl0ZW07CgoJCXJldHVybiAkb3V0IC4g JHRoaXMtPm5ld2xpbmUoKSAuICI8LyR0aGlzLT5lbGVtZW50X25hbWU+IiAuICR0aGlzLT5u ZXdsaW5lKCk7Cgl9CgoJLyoqIENvbnZlcnQgJHRoaXMtPiRwcm9wZXJ0eSB3aXRoIGh0bWxz cGVjaWFsY2hhcnMoKS4KCSAqICBAcGFyYW0gcHJvcGVydHkgQXR0cmlidXRlIG5hbWUKCSAq ICBAcmV0dXJuIHN0cmluZyAoWClIVE1MLWVzY2FwZWQgYXR0cmlidXRlIHZhbHVlCgkgKi8K CXByb3RlY3RlZCBmdW5jdGlvbiBodG1sX2VzY2FwZSggJHByb3BlcnR5ICkKCXsKCQkkdGhp cy0+JHByb3BlcnR5ID0gaHRtbHNwZWNpYWxjaGFycygkdGhpcy0+JHByb3BlcnR5KTsKCQly ZXR1cm4gJHRoaXM7Cgl9CgoJcHJpdmF0ZSBmdW5jdGlvbiBuZXdsaW5lKCkKCXsKCQlyZXR1 cm4gKCAhICR0aGlzLT5pc19lbXB0eSBhbmQgY291bnQoJHRoaXMtPmNvbnRlbnRzKSA+IDEg KSA/IG4gOiAnJzsKCX0KfQoKLy8vIENsYXNzIGZvciAoWClIVE1MIGFuY2hvciBlbGVtZW50 cy4KY2xhc3Mgc29vX2h0bWxfYW5jaG9yIGV4dGVuZHMgc29vX2h0bWwKewoJLy8vIEBuYW1l IChYKUhUTUwgYXR0cmlidXRlcwoJLy9AewoJcHJvdGVjdGVkICRocmVmCQkJCT0gJyc7Cglw cm90ZWN0ZWQgJG5hbWUJCQkJPSAnJzsKCXByb3RlY3RlZCAkcmVsCQkJCT0gJyc7Cglwcm90 ZWN0ZWQgJHJldgkJCQk9ICcnOwoJcHJvdGVjdGVkICR0eXBlCQkJCT0gJyc7Cglwcm90ZWN0 ZWQgJGhyZWZsYW5nCQkJPSAnJzsKCXByb3RlY3RlZCAkY2hhcnNldAkJCT0gJyc7Cglwcm90 ZWN0ZWQgJGFjY2Vzc2tleQkJPSAnJzsKCXByb3RlY3RlZCAkdGFiaW5kZXgJCQk9ICcnOwoJ cHJvdGVjdGVkICRzaGFwZQkJCT0gJyc7Cglwcm90ZWN0ZWQgJGNvb3JkcwkJCT0gJyc7Cglw cm90ZWN0ZWQgJG9uZm9jdXMJCQk9ICcnOwoJcHJvdGVjdGVkICRvbmJsdXIJCQk9ICcnOwoJ Ly9AfQoKCS8qKiBAcGFyYW0gYXR0cyBVUkkgc3RyaW5nIChocmVmIHZhbHVlKSBvciBhdHRy aWJ1dGUgYXJyYXkuCgkgKiAgQHBhcmFtIGNvbnRlbnQgRWxlbWVudCBjb250ZW50IChzdHJp bmcsIHNvb19odG1sIG9iamVjdCwgb3IgYXJyYXkgdGhlcmVvZikKCSAqLwoJcHVibGljIGZ1 bmN0aW9uIF9fY29uc3RydWN0ICggJGF0dHMgPSBhcnJheSgpLCAkY29udGVudCA9ICcnICkK CXsKCQlpZiAoICEgaXNfYXJyYXkoJGF0dHMpICkKCQkJJGF0dHMgPSBhcnJheSgnaHJlZicg PT4gJGF0dHMpOwoJCXBhcmVudDo6X19jb25zdHJ1Y3QoICdhJywgJGF0dHMsICRjb250ZW50 ICk7Cgl9Cgp9CgovLy8gQ2xhc3MgZm9yIChYKUhUTUwgYnIgZWxlbWVudHMuCmNsYXNzIHNv b19odG1sX2JyIGV4dGVuZHMgc29vX2h0bWwKewoJLyoqIENvbnN0cnVjdG9yLgoJICogIEBw YXJhbSBhdHRzIEF0dHJpYnV0ZXMgKGFycmF5IG9mIG5hbWU9PnZhbHVlIHBhaXJzKQoJICov CglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QgKCAkYXR0cyA9IGFycmF5KCkgKQoJewoJ CXBhcmVudDo6X19jb25zdHJ1Y3QoJ2JyJywgJGF0dHMsIG51bGwsIHRydWUpOwoJfQp9Cgov Ly8gQ2xhc3MgZm9yIChYKUhUTUwgZm9ybSBlbGVtZW50cwpjbGFzcyBzb29faHRtbF9mb3Jt IGV4dGVuZHMgc29vX2h0bWwKewoJLy8vIEBuYW1lIChYKUhUTUwgYXR0cmlidXRlcwoJLy9A ewoJcHJvdGVjdGVkICRhY3Rpb24JCQk9ICcnOwoJcHJvdGVjdGVkICRtZXRob2QJCQk9ICcn OwoJcHJvdGVjdGVkICRlbmN0eXBlCQkJPSAnJzsKCXByb3RlY3RlZCAkYWNjZXB0X2NoYXJz ZXQJPSAnJzsKCXByb3RlY3RlZCAkb25zdWJtaXQJCQk9ICcnOwoJcHJvdGVjdGVkICRvbnJl c2V0CQkJPSAnJzsKCS8vQH0KCgkvKiogQ29uc3RydWN0b3IuCgkgKiAgQHBhcmFtIGluaXQg Rm9ybSBhY3Rpb24gb3IgYXR0cmlidXRlcyAoYXJyYXkgb2YgbmFtZT0+dmFsdWUgcGFpcnMp CgkgKiAgQHBhcmFtIGNvbnRlbnQgRWxlbWVudCBjb250ZW50IChzdHJpbmcsIHNvb19odG1s IG9iamVjdCwgb3IgYXJyYXkgdGhlcmVvZikKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29u c3RydWN0ICggJGluaXQgPSBhcnJheSgpLCAkY29udGVudCA9ICcnICkKCXsKCQkkYXR0cyA9 IGlzX3N0cmluZygkaW5pdCkgPyBhcnJheSgnYWN0aW9uJyA9PiAkaW5pdCkgOiAkaW5pdDsK CQlpZiAoICEgaXNzZXQoJGF0dHNbJ21ldGhvZCddKSApCgkJCSRhdHRzWydtZXRob2QnXSA9 ICdwb3N0JzsKCQlpZiAoIGlzX2FycmF5KCRhdHRzWydhY3Rpb24nXSkgKQoJCXsKCQkJZm9y ZWFjaCAoICRhdHRzWydhY3Rpb24nXSBhcyAkayA9PiAkdiApCgkJCQkkYXR0c1snYWN0aW9u J11bJGtdID0gIiRrPSR2IjsKCQkJJGF0dHNbJ2FjdGlvbiddID0gJz8nIC4gaW1wbG9kZShh LCAkYXR0c1snYWN0aW9uJ10pOwoJCX0KCQlwYXJlbnQ6Ol9fY29uc3RydWN0KCdmb3JtJywg JGF0dHMsICRjb250ZW50ICk7Cgl9Cn0KCi8vLyBDbGFzcyBmb3IgKFgpSFRNTCBsYWJlbCBl bGVtZW50cwpjbGFzcyBzb29faHRtbF9sYWJlbCBleHRlbmRzIHNvb19odG1sCnsKCS8vLyBA bmFtZSAoWClIVE1MIGF0dHJpYnV0ZXMKCS8vQHsKCXByb3RlY3RlZCAkZm9yCQkJCT0gJyc7 Cglwcm90ZWN0ZWQgJG9uZm9jdXMJCQk9ICcnOwoJcHJvdGVjdGVkICRvbmJsdXIJCQk9ICcn OwoJLy9AfQoKCS8qKiBDb25zdHJ1Y3Rvci4KCSAqICBAcGFyYW0gaW5pdCAnZm9yJyBhdHRy aWJ1dGUgb3IgYXJyYXkgb2YgbmFtZT0+dmFsdWUgcGFpcnMKCSAqICBAcGFyYW0gY29udGVu dCBFbGVtZW50IGNvbnRlbnQgKHN0cmluZywgc29vX2h0bWwgb2JqZWN0LCBvciBhcnJheSB0 aGVyZW9mKQoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QgKCAkaW5pdCA9IGFy cmF5KCksICRjb250ZW50ID0gJycgKQoJewoJCWlmICggaXNfc3RyaW5nKCRpbml0KSApCgkJ CSRpbml0ID0gYXJyYXkoJ2ZvcicgPT4gJGluaXQpOwoJCXBhcmVudDo6X19jb25zdHJ1Y3Qo J2xhYmVsJywgJGluaXQsICRjb250ZW50KTsKCX0KfQoKLy8vIEFic3RyYWN0IGJhc2UgY2xh c3MgZm9yIChYKUhUTUwgZm9ybSBjb250cm9scwphYnN0cmFjdCBjbGFzcyBzb29faHRtbF9m b3JtX2NvbnRyb2wgZXh0ZW5kcyBzb29faHRtbAp7CgkvLy8gQG5hbWUgKFgpSFRNTCBhdHRy aWJ1dGVzCgkvL0B7Cglwcm90ZWN0ZWQgJG5hbWUJCQkJPSAnJzsKCXByb3RlY3RlZCAkZGlz YWJsZWQJCQk9ICcnOwoJcHJvdGVjdGVkICR0YWJpbmRleAkJCT0gJyc7Cglwcm90ZWN0ZWQg JG9uZm9jdXMJCQk9ICcnOwoJcHJvdGVjdGVkICRvbmJsdXIJCQk9ICcnOwoJLy9AfQp9Cgov Ly8gQ2xhc3MgZm9yIChYKUhUTUwgaW5wdXQgZWxlbWVudHMKY2xhc3Mgc29vX2h0bWxfaW5w dXQgZXh0ZW5kcyBzb29faHRtbF9mb3JtX2NvbnRyb2wKewoKCS8vLyBAbmFtZSAoWClIVE1M IGF0dHJpYnV0ZXMKCS8vQHsKCXByb3RlY3RlZCAkdHlwZQkJCQk9ICcnOwoJcHJvdGVjdGVk ICR2YWx1ZQkJCT0gJyc7Cglwcm90ZWN0ZWQgJGNoZWNrZWQJCQk9ICcnOwoJcHJvdGVjdGVk ICRzaXplCQkJCT0gJyc7Cglwcm90ZWN0ZWQgJG1heGxlbmd0aAkJPSAnJzsKCXByb3RlY3Rl ZCAkc3JjCQkJCT0gJyc7Cglwcm90ZWN0ZWQgJGFsdAkJCQk9ICcnOwoJcHJvdGVjdGVkICR1 c2VtYXAJCQk9ICcnOwoJcHJvdGVjdGVkICRyZWFkb25seQkJCT0gJyc7Cglwcm90ZWN0ZWQg JGFjY2VwdAkJCT0gJyc7Cglwcm90ZWN0ZWQgJG9uc2VsZWN0CQkJPSAnJzsKCXByb3RlY3Rl ZCAkb25jaGFuZ2UJCQk9ICcnOwoJLy9AfQoKCS8qKiBDb25zdHJ1Y3Rvci4KCSAqICBAcGFy YW0gdHlwZSBJbnB1dCB0eXBlICh0ZXh0fGNoZWNrYm94fHJhZGlvIGV0Yy4pCgkgKiAgQHBh cmFtIGF0dHMgQXR0cmlidXRlcyAoYXJyYXkgb2YgbmFtZT0+dmFsdWUgcGFpcnMpCgkgKi8K CXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCAoICR0eXBlID0gJ3RleHQnLCAkYXR0cyA9 IGFycmF5KCkgKQoJewoJCSR0aGlzLT50eXBlKCR0eXBlKTsKCQlwYXJlbnQ6Ol9fY29uc3Ry dWN0KCdpbnB1dCcsICRhdHRzLCBudWxsLCB0cnVlKTsKCX0KfQoKLy8vIENsYXNzIGZvciAo WClIVE1MIHNlbGVjdCBlbGVtZW50cwpjbGFzcyBzb29faHRtbF9zZWxlY3QgZXh0ZW5kcyBz b29faHRtbF9mb3JtX2NvbnRyb2wKewoJLy8vIEBuYW1lIChYKUhUTUwgYXR0cmlidXRlcwoJ Ly9AewoJcHJvdGVjdGVkICRtdWx0aXBsZQkJCT0gJyc7Cglwcm90ZWN0ZWQgJHNpemUJCQkJ PSAnJzsKCXByb3RlY3RlZCAkb25jaGFuZ2UJCQk9ICcnOwoJLy9AfQoKCS8qKiBDb25zdHJ1 Y3Rvci4KCSAqICBJZiAkY29udGVudCBpcyBhbiBhcnJheSwgZWFjaCBpdGVtIHdpbGwgYmUg YWRkZWQgYXMKCSAqICBhIHNvb19odG1sX29wdGlvbiBlbGVtZW50IChhc3N1bWVzIHZhbHVl PT50ZXh0IGFycmF5KQoJICogIEBwYXJhbSBhdHRzIEF0dHJpYnV0ZXMgKGFycmF5IG9mIG5h bWU9PnZhbHVlIHBhaXJzKQoJICogIEBwYXJhbSBjb250ZW50IEVsZW1lbnQgY29udGVudCAo c29vX2h0bWxfb3B0aW9uIG9iamVjdHMpCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0 cnVjdCAoICRhdHRzID0gYXJyYXkoKSwgJGNvbnRlbnQgPSBhcnJheSgpICkKCXsKCQlwYXJl bnQ6Ol9fY29uc3RydWN0KCdzZWxlY3QnLCAkYXR0cyk7CgkJaWYgKCAhIGlzX2FycmF5KCRj b250ZW50KSApICRjb250ZW50ID0gYXJyYXkoJGNvbnRlbnQpOwoJCWZvcmVhY2ggKCAkY29u dGVudCBhcyAkaSA9PiAkaXRlbSApCgkJewoJCQlpZiAoICRpdGVtIGluc3RhbmNlb2Ygc29v X2h0bWxfb3B0aW9uICkKCQkJCSR0aGlzLT5jb250ZW50cygkaXRlbSk7CgkJCWVsc2UKCQkJ CSR0aGlzLT5jb250ZW50cyhuZXcgc29vX2h0bWxfb3B0aW9uKGFycmF5KCd2YWx1ZScgPT4g JGkpLCAkaXRlbSkpOwoJCX0KCX0KfQoKLy8vIENsYXNzIGZvciAoWClIVE1MIG9wdGlvbiBl bGVtZW50cwpjbGFzcyBzb29faHRtbF9vcHRpb24gZXh0ZW5kcyBzb29faHRtbF9mb3JtX2Nv bnRyb2wKewoJLy8vIEBuYW1lIChYKUhUTUwgYXR0cmlidXRlcwoJLy9AewoJcHJvdGVjdGVk ICR2YWx1ZQkJCT0gJyc7Cglwcm90ZWN0ZWQgJHNlbGVjdGVkCQkJPSAnJzsKCXByb3RlY3Rl ZCAkbGFiZWwJCQk9ICcnOwoJLy9AfQoKCS8qKiBDb25zdHJ1Y3Rvci4KCSAqICBAcGFyYW0g YXR0cyBBdHRyaWJ1dGVzIChhcnJheSBvZiBuYW1lPT52YWx1ZSBwYWlycykKCSAqICBAcGFy YW0gY29udGVudCBFbGVtZW50IGNvbnRlbnQgKGRpc3BsYXllZCBvcHRpb24gdGV4dCkKCSAq LwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0ICggJGF0dHMgPSBhcnJheSgpLCAkY29u dGVudCA9IGFycmF5KCkgKQoJewoJCXBhcmVudDo6X19jb25zdHJ1Y3QoJ29wdGlvbicsICRh dHRzLCAkY29udGVudCk7Cgl9Cn0KCi8vLyBDbGFzcyBmb3IgKFgpSFRNTCB0ZXh0YXJlYSBl bGVtZW50cwpjbGFzcyBzb29faHRtbF90ZXh0YXJlYSBleHRlbmRzIHNvb19odG1sX2Zvcm1f Y29udHJvbAp7CgkvLy8gQG5hbWUgKFgpSFRNTCBhdHRyaWJ1dGVzCgkvL0B7Cglwcm90ZWN0 ZWQgJHJvd3MJCQkJPSAnJzsKCXByb3RlY3RlZCAkY29scwkJCQk9ICcnOwoJcHJvdGVjdGVk ICRyZWFkb25seQkJCT0gJyc7Cglwcm90ZWN0ZWQgJG9uc2VsZWN0CQkJPSAnJzsKCXByb3Rl Y3RlZCAkb25jaGFuZ2UJCQk9ICcnOwoJLy9AfQoKCS8qKiBDb25zdHJ1Y3Rvci4KCSAqICBA cGFyYW0gYXR0cyBBdHRyaWJ1dGVzIChhcnJheSBvZiBuYW1lPT52YWx1ZSBwYWlycykKCSAq ICBAcGFyYW0gY29udGVudCBFbGVtZW50IGNvbnRlbnQgKHN0cmluZykKCSAqLwoJcHVibGlj IGZ1bmN0aW9uIF9fY29uc3RydWN0ICggJGF0dHMgPSBhcnJheSgpLCAkY29udGVudCA9ICcn ICkKCXsKCQlwYXJlbnQ6Ol9fY29uc3RydWN0KCd0ZXh0YXJlYScsICRhdHRzLCAkY29udGVu dCk7Cgl9Cn0KCi8vLyBDbGFzcyBmb3IgKFgpSFRNTCBpbWcgZWxlbWVudHMKY2xhc3Mgc29v X2h0bWxfaW1nIGV4dGVuZHMgc29vX2h0bWwKewoJLy8vIEBuYW1lIChYKUhUTUwgYXR0cmli dXRlcwoJLy9AewoJcHJvdGVjdGVkICRhbHQJCQkJPSAnJzsKCXByb3RlY3RlZCAkc3JjCQkJ CT0gJyc7Cglwcm90ZWN0ZWQgJHdpZHRoCQkJPSAnJzsKCXByb3RlY3RlZCAkaGVpZ2h0CQkJ PSAnJzsKCS8vQH0KCgkvKiogQ29uc3RydWN0b3IuCgkgKiAgQHBhcmFtIGluaXQgc29vX3R4 cF9pbWcgb2JqZWN0LCAgYXR0cmlidXRlIGFycmF5LCBvciBzcmMgdmFsdWUKCSAqICBAcGFy YW0gdGh1bWJuYWlsIFRodW1ibmFpbCBvciBmdWxsIGltYWdlPwoJICogIEBwYXJhbSBlc2Nh cGUgSFRNTC1lc2NhcGUgdGl0bGUgYW5kIGFsdCBhdHRyaWJ1dGVzPwoJICovCglwdWJsaWMg ZnVuY3Rpb24gX19jb25zdHJ1Y3QgKCAkaW5pdCA9IGFycmF5KCksICR0aHVtYm5haWwgPSBm YWxzZSwgJGVzY2FwZSA9IHRydWUgKQoJewoJCWlmICggJGluaXQgaW5zdGFuY2VvZiBzb29f dHhwX2ltZyApCgkJewoJCQkkc3JjID0gJHRodW1ibmFpbCA/ICRpbml0LT50aHVtYl91cmwg OiAkaW5pdC0+ZnVsbF91cmw7CgkJCSRpbml0ID0gJGluaXQtPnByb3BlcnRpZXMoKTsKCQkJ aWYgKCAkdGh1bWJuYWlsICkKCQkJewoJCQkJaWYgKCAhIGVtcHR5KCRpbml0Wyd0aHVtYl9o J10pICkKCQkJCXsgLy8gcHJlIFR4cCA0LjIgY29tcGF0aWJpbGl0eQoJCQkJCSRpbml0Wydo J10gPSAkaW5pdFsndGh1bWJfaCddOwoJCQkJCSRpbml0Wyd3J10gPSAkaW5pdFsndGh1bWJf dyddOwoJCQkJfQoJCQkJZWxzZSAkaW5pdFsnaCddID0gKCAkaW5pdFsndyddID0gMCApOwoJ CQl9CgkJCSRpbml0WydoZWlnaHQnXSA9ICRpbml0WydoJ107CgkJCSRpbml0Wyd3aWR0aCdd ID0gJGluaXRbJ3cnXTsKCQkJJGluaXRbJ3RpdGxlJ10gPSAkaW5pdFsnY2FwdGlvbiddOwoJ CQkkaW5pdFsnc3JjJ10gPSAkc3JjOwoJCQl1bnNldCgkaW5pdFsnaWQnXSk7IC8vIGRvbid0 IHdhbnQgZGF0YWJhc2UgaWQgYXMgSFRNTCBpZCEKCQl9CgkJZWxzZWlmICggISBpc19hcnJh eSgkaW5pdCkgKQoJCQkkaW5pdFsnc3JjJ10gPSAkaW5pdDsKCgkJcGFyZW50OjpfX2NvbnN0 cnVjdCgnaW1nJywgJGluaXQsIG51bGwsIHRydWUpOwoJCWlmICggJGVzY2FwZSApCgkJCSR0 aGlzLT5odG1sX2VzY2FwZSgndGl0bGUnKS0+aHRtbF9lc2NhcGUoJ2FsdCcpOwoJfQoKfQoK Ly8vIENsYXNzIGZvciAoWClIVE1MIHAgZWxlbWVudHMKY2xhc3Mgc29vX2h0bWxfcCBleHRl bmRzIHNvb19odG1sCnsKCS8qKiBDb25zdHJ1Y3Rvci4KCSAqICBAcGFyYW0gYXR0cyBBdHRy aWJ1dGVzIChhcnJheSBvZiBuYW1lPT52YWx1ZSBwYWlycykKCSAqICBAcGFyYW0gY29udGVu dCBFbGVtZW50IGNvbnRlbnQgKHN0cmluZywgc29vX2h0bWwgb2JqZWN0LCBvciBhcnJheSB0 aGVyZW9mKQoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QgKCAkYXR0cyA9IGFy cmF5KCksICRjb250ZW50ID0gJycgKQoJewoJCXBhcmVudDo6X19jb25zdHJ1Y3QoJ3AnLCAk YXR0cywgJGNvbnRlbnQpOwoJfQp9CgovLy8gQ2xhc3MgZm9yIChYKUhUTUwgdGFibGUgZWxl bWVudHMKY2xhc3Mgc29vX2h0bWxfdGFibGUgZXh0ZW5kcyBzb29faHRtbAp7CgkvLy8gQG5h bWUgKFgpSFRNTCBhdHRyaWJ1dGVzCgkvL0B7Cglwcm90ZWN0ZWQgJHN1bW1hcnkJCQkJPSAn JzsKCXByb3RlY3RlZCAkd2lkdGgJCQkJPSAnJzsKCXByb3RlY3RlZCAkYm9yZGVyCQkJCT0g Jyc7Cglwcm90ZWN0ZWQgJGZyYW1lCQkJCT0gJyc7Cglwcm90ZWN0ZWQgJHJ1bGVzCQkJCT0g Jyc7Cglwcm90ZWN0ZWQgJGNlbGxzcGFjaW5nCQkJPSAnJzsKCXByb3RlY3RlZCAkY2VsbHBh ZGRpbmcJCQk9ICcnOwoJLy9AfQoKCS8qKiBDb25zdHJ1Y3Rvci4KCSAqICBAcGFyYW0gYXR0 cyBBdHRyaWJ1dGVzIChhcnJheSBvZiBuYW1lPT52YWx1ZSBwYWlycykKCSAqICBAcGFyYW0g Y29udGVudCBFbGVtZW50IGNvbnRlbnQgKHN0cmluZywgc29vX2h0bWwgb2JqZWN0LCBvciBh cnJheSB0aGVyZW9mKQoJICogIEBzZWUgY29udGVudHMoKSBmb3IgJGNvbnRlbnQgb3B0aW9u cwoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QgKCAkYXR0cyA9IGFycmF5KCks ICRjb250ZW50ID0gbnVsbCApCgl7CgkJJHRoaXMtPmNvbnRlbnRzKCRjb250ZW50KTsKCQlw YXJlbnQ6Ol9fY29uc3RydWN0KCAndGFibGUnLCAkYXR0cyApOwoJfQoKCS8qKiBBZGQgc3Ry aW5nfG9iamVjdHxhcnJheSB0byAkY29udGVudHMgYXJyYXkuCgkgKiAgSWYgdGhpcyBpcyBh IHNvb19odG1sX3RhYmxlX2NvbXBvbmVudCBvYmplY3QsIG9yIGFuIGFycmF5IG9mIHN1Y2gs CgkgKiAgaXQgd2lsbCBiZSBhZGRlZCBkaXJlY3RseS4gT3RoZXJ3aXNlIGl0IGlzIGFzc3Vt ZWQgdG8gYmUgYSBzaW5nbGUKCSAqICBpdGVtIG9yIDItZGltZW5zaW9uYWwgYXJyYXkgb2Yg c3VjaCwgYW5kIHdpbGwgYmUgZm9ybWVkIGludG8gYSBncmlkCgkgKiAgb2YgdGFibGUgY2Vs bHMvcm93cy4KCSAqICBAcGFyYW0gY29udGVudAoJICovCglwdWJsaWMgZnVuY3Rpb24gY29u dGVudHMoJGNvbnRlbnQpCgl7CgkJaWYgKCBpc19udWxsKCRjb250ZW50KSApIHJldHVybiAk dGhpczsKCgkJJGNvbnRlbnQgPSBpc19hcnJheSgkY29udGVudCkgPyAkY29udGVudCA6IGFy cmF5KCRjb250ZW50KTsKCQlmb3JlYWNoICggJGNvbnRlbnQgYXMgJGl0ZW0gKQoJCXsKCQkJ aWYgKCBpc19vYmplY3QoJGl0ZW0pIGFuZCAoICRpdGVtIGluc3RhbmNlb2Ygc29vX2h0bWxf dGFibGVfY29tcG9uZW50IG9yICRpdGVtIGluc3RhbmNlb2Ygc29vX2h0bWxfY2FwdGlvbikg KQoJCQkJJHRoaXMtPmNvbnRlbnRzW10gPSAkaXRlbTsKCQkJZWxzZQoJCQl7CgkJCQkkaXRl bSA9IGlzX2FycmF5KCRpdGVtKSA/ICRpdGVtIDogYXJyYXkoJGl0ZW0pOwoJCQkJZm9yZWFj aCAoICRpdGVtIGFzICRpID0+ICRjZWxsICkKCQkJCQlpZiAoICEgJGNlbGwgaW5zdGFuY2Vv ZiBzb29faHRtbF90YWJsZV9jb21wb25lbnQgKQoJCQkJCQkkaXRlbVskaV0gPSBuZXcgc29v X2h0bWxfdGQoYXJyYXkoKSwgJGNlbGwpOwoJCQkJJHRoaXMtPmNvbnRlbnRzW10gPSBuZXcg c29vX2h0bWxfdHIoYXJyYXkoKSwgJGl0ZW0pOwoJCQl9CgkJfQoJCXJldHVybiAkdGhpczsK CX0KfQoKLy8vIENsYXNzIGZvciAoWClIVE1MIGNhcHRpb24gZWxlbWVudHMKY2xhc3Mgc29v X2h0bWxfY2FwdGlvbiBleHRlbmRzIHNvb19odG1sX3RhYmxlX2NvbXBvbmVudAp7CglwdWJs aWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QgKCAkYXR0cyA9IGFycmF5KCksICRjb250ZW50ICkK CXsKCQlwYXJlbnQ6Ol9fY29uc3RydWN0KCAnY2FwdGlvbicsICRhdHRzLCAkY29udGVudCAp OwoJfQp9CgovLy8gQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgKFgpSFRNTCB0YWJsZSBjb21w b25lbnRzCmFic3RyYWN0IGNsYXNzIHNvb19odG1sX3RhYmxlX2NvbXBvbmVudCBleHRlbmRz IHNvb19odG1sCnsKCS8vLyBAbmFtZSAoWClIVE1MIGF0dHJpYnV0ZXMKCS8vQHsKCXByb3Rl Y3RlZCAkYWxpZ24JCQkJPSAnJzsKCXByb3RlY3RlZCAkY2hhcgkJCQkJPSAnJzsKCXByb3Rl Y3RlZCAkY2hhcm9mZgkJCQk9ICcnOwoJcHJvdGVjdGVkICR2YWxpZ24JCQkJPSAnJzsKCS8v QH0KCgkvKiogQ29uc3RydWN0b3IuCgkgKiAgQHBhcmFtIGNvbXBvbmVudCAoWClIVE1MIGVs ZW1lbnQgbmFtZQoJICogIEBwYXJhbSBhdHRzIEF0dHJpYnV0ZXMgKGFycmF5IG9mIG5hbWU9 PnZhbHVlIHBhaXJzKQoJICogIEBwYXJhbSBjb250ZW50IEVsZW1lbnQgY29udGVudCAoc3Ry aW5nLCBzb29faHRtbCBvYmplY3QsIG9yIGFycmF5IHRoZXJlb2YpCgkgKi8KCXB1YmxpYyBm dW5jdGlvbiBfX2NvbnN0cnVjdCAoICRjb21wb25lbnQsICRhdHRzID0gYXJyYXkoKSwgJGNv bnRlbnQgPSAnJyApCgl7CgkJcGFyZW50OjpfX2NvbnN0cnVjdCggJGNvbXBvbmVudCwgJGF0 dHMsICRjb250ZW50ICk7Cgl9Cn0KCi8vLyBDbGFzcyBmb3IgKFgpSFRNTCB0aGVhZCBlbGVt ZW50cwpjbGFzcyBzb29faHRtbF90aGVhZCBleHRlbmRzIHNvb19odG1sX3RhYmxlX2NvbXBv bmVudAp7CgkvKiogQ29uc3RydWN0b3IuCgkgKiAgQHBhcmFtIGF0dHMgQXR0cmlidXRlcyAo YXJyYXkgb2YgbmFtZT0+dmFsdWUgcGFpcnMpCgkgKiAgQHBhcmFtIGNvbnRlbnQgRWxlbWVu dCBjb250ZW50IChzdHJpbmcsIHNvb19odG1sIG9iamVjdCwgb3IgYXJyYXkgdGhlcmVvZikK CSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0ICggJGF0dHMgPSBhcnJheSgpLCAk Y29udGVudCA9ICcnICkKCXsKCQlwYXJlbnQ6Ol9fY29uc3RydWN0KCAndGhlYWQnLCAkYXR0 cywgJGNvbnRlbnQgKTsKCX0KfQoKLy8vIENsYXNzIGZvciAoWClIVE1MIHRib2R5IGVsZW1l bnRzCmNsYXNzIHNvb19odG1sX3Rib2R5IGV4dGVuZHMgc29vX2h0bWxfdGFibGVfY29tcG9u ZW50CnsKCS8qKiBDb25zdHJ1Y3Rvci4KCSAqICBAcGFyYW0gYXR0cyBBdHRyaWJ1dGVzIChh cnJheSBvZiBuYW1lPT52YWx1ZSBwYWlycykKCSAqICBAcGFyYW0gY29udGVudCBFbGVtZW50 IGNvbnRlbnQgKHN0cmluZywgc29vX2h0bWwgb2JqZWN0LCBvciBhcnJheSB0aGVyZW9mKQoJ ICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QgKCAkYXR0cyA9IGFycmF5KCksICRj b250ZW50ID0gJycgKQoJewoJCXBhcmVudDo6X19jb25zdHJ1Y3QoICd0Ym9keScsICRhdHRz LCAkY29udGVudCApOwoJfQp9CgovLy8gQ2xhc3MgZm9yIChYKUhUTUwgdGZvb3QgZWxlbWVu dHMKY2xhc3Mgc29vX2h0bWxfdGZvb3QgZXh0ZW5kcyBzb29faHRtbF90YWJsZV9jb21wb25l bnQKewoJLyoqIENvbnN0cnVjdG9yLgoJICogIEBwYXJhbSBhdHRzIEF0dHJpYnV0ZXMgKGFy cmF5IG9mIG5hbWU9PnZhbHVlIHBhaXJzKQoJICogIEBwYXJhbSBjb250ZW50IEVsZW1lbnQg Y29udGVudCAoc3RyaW5nLCBzb29faHRtbCBvYmplY3QsIG9yIGFycmF5IHRoZXJlb2YpCgkg Ki8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCAoICRhdHRzID0gYXJyYXkoKSwgJGNv bnRlbnQgPSAnJyApCgl7CgkJcGFyZW50OjpfX2NvbnN0cnVjdCggJ3Rmb290JywgJGF0dHMs ICRjb250ZW50ICk7Cgl9Cn0KCi8vLyBDbGFzcyBmb3IgKFgpSFRNTCB0ciBlbGVtZW50cwpj bGFzcyBzb29faHRtbF90ciBleHRlbmRzIHNvb19odG1sX3RhYmxlX2NvbXBvbmVudAp7CgoJ LyoqIENvbnN0cnVjdG9yLgoJICogIEBwYXJhbSBhdHRzIEF0dHJpYnV0ZXMgKGFycmF5IG9m IG5hbWU9PnZhbHVlIHBhaXJzKQoJICogIEBwYXJhbSBjb250ZW50IEVsZW1lbnQgY29udGVu dCAoc3RyaW5nLCBzb29faHRtbCBvYmplY3QsIG9yIGFycmF5IHRoZXJlb2YpCgkgKi8KCXB1 YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCAoICRhdHRzID0gYXJyYXkoKSwgJGNvbnRlbnQg PSAnJyApCgl7CgkJcGFyZW50OjpfX2NvbnN0cnVjdCggJ3RyJywgJGF0dHMsICRjb250ZW50 ICk7Cgl9Cn0KCi8vLyBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciAoWClIVE1MIHRhYmxlIGNl bGxzCmFic3RyYWN0IGNsYXNzIHNvb19odG1sX3RhYmxlX2NlbGwgZXh0ZW5kcyBzb29faHRt bF90YWJsZV9jb21wb25lbnQKewoJLy8vIEBuYW1lIChYKUhUTUwgYXR0cmlidXRlcwoJLy9A ewoJcHJvdGVjdGVkICRyb3dzcGFuCQkJPSAnJzsKCXByb3RlY3RlZCAkY29sc3BhbgkJCT0g Jyc7Cglwcm90ZWN0ZWQgJGhlYWRlcnMJCQk9ICcnOwoJcHJvdGVjdGVkICRhYmJyCQkJCT0g Jyc7Cglwcm90ZWN0ZWQgJHNjb3BlCQkJPSAnJzsKCXByb3RlY3RlZCAkYXhpcwkJCQk9ICcn OwoJLy9AfQoKCS8qKiBDb25zdHJ1Y3Rvci4KCSAqICBAcGFyYW0gY2VsbF90eXBlIEVsZW1l bnQgbmFtZSAodGQsIHRoKQoJICogIEBwYXJhbSBhdHRzIEF0dHJpYnV0ZXMgKGFycmF5IG9m IG5hbWU9PnZhbHVlIHBhaXJzKQoJICogIEBwYXJhbSBjb250ZW50IEVsZW1lbnQgY29udGVu dCAoc3RyaW5nLCBzb29faHRtbCBvYmplY3QsIG9yIGFycmF5IHRoZXJlb2YpCgkgKi8KCXB1 YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCAoICRjZWxsX3R5cGUsICRhdHRzID0gYXJyYXko KSwgJGNvbnRlbnQgPSAnJyApCgl7CgkJcGFyZW50OjpfX2NvbnN0cnVjdCggJGNlbGxfdHlw ZSwgJGF0dHMsICRjb250ZW50ICk7Cgl9Cn0KCi8vLyBDbGFzcyBmb3IgKFgpSFRNTCB0aCBl bGVtZW50cwpjbGFzcyBzb29faHRtbF90aCBleHRlbmRzIHNvb19odG1sX3RhYmxlX2NlbGwK ewoJLyoqIENvbnN0cnVjdG9yLgoJICogIEBwYXJhbSBhdHRzIEF0dHJpYnV0ZXMgKGFycmF5 IG9mIG5hbWU9PnZhbHVlIHBhaXJzKQoJICogIEBwYXJhbSBjb250ZW50IEVsZW1lbnQgY29u dGVudCAoc3RyaW5nLCBzb29faHRtbCBvYmplY3QsIG9yIGFycmF5IHRoZXJlb2YpCgkgKi8K CXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCAoICRhdHRzID0gYXJyYXkoKSwgJGNvbnRl bnQgPSAnJyApCgl7CgkJcGFyZW50OjpfX2NvbnN0cnVjdCggJ3RoJywgJGF0dHMsICRjb250 ZW50ICk7Cgl9Cn0KCi8vLyBDbGFzcyBmb3IgKFgpSFRNTCB0ZCBlbGVtZW50cwpjbGFzcyBz b29faHRtbF90ZCBleHRlbmRzIHNvb19odG1sX3RhYmxlX2NlbGwKewoJLyoqIENvbnN0cnVj dG9yLgoJICogIEBwYXJhbSBhdHRzIEF0dHJpYnV0ZXMgKGFycmF5IG9mIG5hbWU9PnZhbHVl IHBhaXJzKQoJICogIEBwYXJhbSBjb250ZW50IEVsZW1lbnQgY29udGVudCAoc3RyaW5nLCBz b29faHRtbCBvYmplY3QsIG9yIGFycmF5IHRoZXJlb2YpCgkgKi8KCXB1YmxpYyBmdW5jdGlv biBfX2NvbnN0cnVjdCAoICRhdHRzID0gYXJyYXkoKSwgJGNvbnRlbnQgPSAnJyApCgl7CgkJ cGFyZW50OjpfX2NvbnN0cnVjdCggJ3RkJywgJGF0dHMsICRjb250ZW50ICk7Cgl9Cgp9Cgov Ly8gQmFzZSBjbGFzcyBmb3IgKFgpSFRNTCBvbCBhbmQgdWwgZWxlbWVudHMKYWJzdHJhY3Qg Y2xhc3Mgc29vX2h0bWxfbGlzdCBleHRlbmRzIHNvb19odG1sCnsKCS8qKiBDb25zdHJ1Y3Rv ci4KCSAqICBJZiAkY29udGVudCBpcyBhbiBhcnJheSwgZWFjaCBpdGVtIHRoYXQgaXMgbm90 IGFuIGFycmF5IHdpbGwgYmUgYWRkZWQKCSAqICBhcyBhIHNvb19odG1sX2xpIG9iamVjdDsg ZWFjaCBpdGVtIHRoYXQgaXMgYW4gYXJyYXkgd2lsbCBiZSBhZGRlZAoJICogIHRvIHRoZSBw cmV2aW91cyBzb29faHRtbF9saSBvYmplY3QgYXMgYSBuZXcgbGlzdCBvZiB0aGUgc2FtZSBj bGFzcwoJICogIChoZW5jZSB0aGlzIGlzIGEgcmVjdXJzaXZlIGZ1bmN0aW9uKS4KCSAqICBB bnkgb3RoZXIgY29udGVudCB3aWxsIGJlIGFkZGVkIGFzIGEgc29vX2h0bWxfbGkgb2JqZWN0 LgoJICogIEBwYXJhbSBlbGVtZW50X25hbWUgRWxlbWVudCBuYW1kIChvbCBvciB1bCkKCSAq ICBAcGFyYW0gYXR0cyBBdHRyaWJ1dGVzIChhcnJheSBvZiBuYW1lPT52YWx1ZSBwYWlycykK CSAqICBAcGFyYW0gY29udGVudCBFbGVtZW50IGNvbnRlbnQgKHN0cmluZywgc29vX2h0bWwg b2JqZWN0LCBvciBhcnJheSB0aGVyZW9mKQoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25z dHJ1Y3QgKCAkZWxlbWVudF9uYW1lLCAkYXR0cywgJGNvbnRlbnQsICRjbGFzcyApCgl7CgkJ aWYgKCAhIGlzX2FycmF5KCRjb250ZW50KSApCgkJCSRjb250ZW50ID0gYXJyYXkoJGNvbnRl bnQpOwoJCSRwcmV2ID0gbnVsbDsKCQlmb3JlYWNoICggJGNvbnRlbnQgYXMgJGkgPT4gJiRp dGVtICkKCQl7CgkJCWlmICggaXNfYXJyYXkoJGl0ZW0pICkKCQkJewoJCQkJaWYgKCAhIGlz X251bGwoJHByZXYpIGFuZCAkY29udGVudFskcHJldl0gaW5zdGFuY2VvZiBzb29faHRtbF9s aSApCgkJCQl7CgkJCQkJJGNvbnRlbnRbJHByZXZdLT5jb250ZW50cyhuZXcgJGNsYXNzKCRh dHRzLCAkaXRlbSkpOwoJCQkJCXVuc2V0KCRjb250ZW50WyRpXSk7CgkJCQl9CgkJCQllbHNl IGZvcmVhY2ggKCAkaXRlbSBhcyAmJGxpICkKCQkJCQkkbGkgPSBuZXcgc29vX2h0bWxfbGko YXJyYXkoKSwgJGxpKTsKCQkJfQoJCQllbHNlaWYgKCAhICRpdGVtIGluc3RhbmNlb2Ygc29v X2h0bWxfbGkgKQoJCQkJJGl0ZW0gPSBuZXcgc29vX2h0bWxfbGkoYXJyYXkoKSwgJGl0ZW0p OwoJCQkkcHJldiA9ICRpOwoJCX0KCQlwYXJlbnQ6Ol9fY29uc3RydWN0KCRlbGVtZW50X25h bWUsICRhdHRzLCAkY29udGVudCk7Cgl9Cn0KCi8vLyBDbGFzcyBmb3IgKFgpSFRNTCBvbCBl bGVtZW50cwpjbGFzcyBzb29faHRtbF9vbCBleHRlbmRzIHNvb19odG1sX2xpc3QKewoJLyoq IENvbnN0cnVjdG9yLgoJICogIEBwYXJhbSBhdHRzIEF0dHJpYnV0ZXMgKGFycmF5IG9mIG5h bWU9PnZhbHVlIHBhaXJzKQoJICogIEBwYXJhbSBjb250ZW50IEVsZW1lbnQgY29udGVudCAo c3RyaW5nLCBzb29faHRtbCBvYmplY3QsIG9yIGFycmF5IHRoZXJlb2YpCgkgKi8KCXB1Ymxp YyBmdW5jdGlvbiBfX2NvbnN0cnVjdCAoICRhdHRzID0gYXJyYXkoKSwgJGNvbnRlbnQgPSAn JyApCgl7CgkJcGFyZW50OjpfX2NvbnN0cnVjdCgnb2wnLCAkYXR0cywgJGNvbnRlbnQsIF9f Q0xBU1NfXyk7Cgl9Cn0KCi8vLyBDbGFzcyBmb3IgKFgpSFRNTCB1bCBlbGVtZW50cwpjbGFz cyBzb29faHRtbF91bCBleHRlbmRzIHNvb19odG1sX2xpc3QKewoJLyoqIENvbnN0cnVjdG9y LgoJICogIEBwYXJhbSBhdHRzIEF0dHJpYnV0ZXMgKGFycmF5IG9mIG5hbWU9PnZhbHVlIHBh aXJzKQoJICogIEBwYXJhbSBjb250ZW50IEVsZW1lbnQgY29udGVudCAoc3RyaW5nLCBzb29f aHRtbCBvYmplY3QsIG9yIGFycmF5IHRoZXJlb2YpCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBf X2NvbnN0cnVjdCAoICRhdHRzID0gYXJyYXkoKSwgJGNvbnRlbnQgPSAnJyApCgl7CgkJcGFy ZW50OjpfX2NvbnN0cnVjdCgndWwnLCAkYXR0cywgJGNvbnRlbnQsIF9fQ0xBU1NfXyk7Cgl9 Cn0KCi8vLyBDbGFzcyBmb3IgKFgpSFRNTCBsaSBlbGVtZW50cwpjbGFzcyBzb29faHRtbF9s aSBleHRlbmRzIHNvb19odG1sCnsKCS8qKiBDb25zdHJ1Y3Rvci4KCSAqICBAcGFyYW0gYXR0 cyBBdHRyaWJ1dGVzIChhcnJheSBvZiBuYW1lPT52YWx1ZSBwYWlycykKCSAqICBAcGFyYW0g Y29udGVudCBFbGVtZW50IGNvbnRlbnQgKHN0cmluZywgc29vX2h0bWwgb2JqZWN0LCBvciBh cnJheSB0aGVyZW9mKQoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QgKCAkYXR0 cyA9IGFycmF5KCksICRjb250ZW50ID0gJycgKQoJewoJCXBhcmVudDo6X19jb25zdHJ1Y3Qo J2xpJywgJGF0dHMsICRjb250ZW50KTsKCX0KfQoKLy8vIENsYXNzIGZvciAoWClIVE1MIHNw YW4gZWxlbWVudHMKY2xhc3Mgc29vX2h0bWxfc3BhbiBleHRlbmRzIHNvb19odG1sCnsKCS8q KiBDb25zdHJ1Y3Rvci4KCSAqICBAcGFyYW0gYXR0cyBBdHRyaWJ1dGVzIChhcnJheSBvZiBu YW1lPT52YWx1ZSBwYWlycykKCSAqICBAcGFyYW0gY29udGVudCBFbGVtZW50IGNvbnRlbnQg KHN0cmluZywgc29vX2h0bWwgb2JqZWN0LCBvciBhcnJheSB0aGVyZW9mKQoJICovCglwdWJs aWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QgKCAkYXR0cyA9IGFycmF5KCksICRjb250ZW50ID0g JycgKQoJewoJCXBhcmVudDo6X19jb25zdHJ1Y3QoJ3NwYW4nLCAkYXR0cywgJGNvbnRlbnQp OwoJfQp9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBNTFAgUGFjayBjb21wYXRpYmlsaXR5 IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIE1MUCBQYWNrIG1hbmlwdWxhdGVzICRf U0VSVkVSWydSRVFVRVNUX1VSSSddLCBzbyBncmFiIGl0IGZpcnN0CgpnbG9iYWwgJHBsdWdp bl9jYWxsYmFjazsKaWYoIGlzX2FycmF5KCRwbHVnaW5fY2FsbGJhY2spCglhbmQgJHBsdWdp bl9jYWxsYmFja1swXVsnZnVuY3Rpb24nXSA9PSAnX2wxMG5fcHJldGV4dCcgKQoJCWFycmF5 X3Vuc2hpZnQoJHBsdWdpbl9jYWxsYmFjaywgYXJyYXkoCgkJCSdmdW5jdGlvbicJPT4JJ3Nv b191cmlfbWxwJywKCQkJJ2V2ZW50JwkJPT4JJ3ByZXRleHQnLAoJCQknc3RlcCcJCT0+CScn LAoJCQkncHJlJwkJPT4JMCApCgkJKTsKCmZ1bmN0aW9uIHNvb191cmlfbWxwKCkKewoJZ2xv YmFsICRzb29fcmVxdWVzdF91cmk7Cgkkc29vX3JlcXVlc3RfdXJpID0gICRfU0VSVkVSWydS RVFVRVNUX1VSSSddOwp9Ci8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIGVuZCBNTFAgUGFjayBj b21wYXRpYmlsaXR5IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCgovLy8gQ2xhc3MgZm9yIFVS SSBxdWVyeSBzdHJpbmcgbWFuaXB1bGF0aW9uCmNsYXNzIHNvb191cmkgZXh0ZW5kcyBzb29f b2JqCnsKCS8vLyBGdWxsIFVSSQoJcHJvdGVjdGVkICRmdWxsOwoKCS8vLyAkX1NFUlZFUlsn UkVRVUVTVF9VUkknXSB2YWx1ZQoJcHJvdGVjdGVkICRyZXF1ZXN0X3VyaTsKCgkvLy8gJF9T RVJWRVJbJ1FVRVJZX1NUUklORyddIHZhbHVlCglwcm90ZWN0ZWQgJHF1ZXJ5X3N0cmluZzsK CgkvLy8gVVJJIHF1ZXJ5IHBhcmFtZXRlcnMKCXByb3RlY3RlZCAkcXVlcnlfcGFyYW1zOwoK CS8qKiBDb25zdHJ1Y3Rvci4KCSAqICBFeHRyYWN0IFJFUVVFU1RfVVJJIGFuZCBRVUVSWV9T VFJJTkcgZnJvbSAkX1NFUlZFUiwKCSAqICBhbmQgcGFyc2UgaW50byBxdWVyeSBwYXJhbXMg YW5kIGZ1bGwgVVJJLgoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QgKCApCgl7 CgkJZ2xvYmFsICRzb29fcmVxdWVzdF91cmk7CS8vIE1MUCBQYWNrIGNvbXBhdGliaWxpdHkK CQkkdGhpcy0+cmVxdWVzdF91cmkgPSAkc29vX3JlcXVlc3RfdXJpID8gJHNvb19yZXF1ZXN0 X3VyaSA6CgkJCSRfU0VSVkVSWydSRVFVRVNUX1VSSSddOwoJCSR0aGlzLT5xdWVyeV9zdHJp bmcgPSAkX1NFUlZFUlsnUVVFUllfU1RSSU5HJ107CgkJJHRoaXMtPmZ1bGwgPSBwcmVnX3Jl cGxhY2UoJy9cLyQvJywgJycsIGh1KSAuICR0aGlzLT5yZXF1ZXN0X3VyaSgpOwoJCXBhcnNl X3N0cigkdGhpcy0+cXVlcnlfc3RyaW5nLCAkdGhpcy0+cXVlcnlfcGFyYW1zKTsKCX0KCgkv Ly8gT3ZlcnJpZGUgcGFyZW50IG1ldGhvZCB0byBwcmV2ZW50IGRpcmVjdCBwcm9wZXJ0eSBt YW5pcHVsYXRpb24KCXB1YmxpYyBmdW5jdGlvbiBfX2NhbGwoICRyZXF1ZXN0LCAkYXJncyAp Cgl7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKiBBZGQsIHJlbW92ZSwgb3IgdXBkYXRlIGEg cXVlcnkgcGFyYW1ldGVyCgkgKiAgVGhlbiBydW4gdXBkYXRlX2Zyb21fcGFyYW1zKCkgdG8g dXBkYXRlICRxdWVyeV9zdHJpbmcgYW5kCgkgKiAgJHJlcXVlc3RfdXJpIChhbmQgdGhlIGNv cnJlc3BvbmRpbmcgJF9TRVJWRVIgdmFsdWVzKSBhY2NvcmRpbmdseQoJICogIEBwYXJhbSBu YW1lIFBhcmFtZXRlciBuYW1lCgkgKiAgQHBhcmFtIHZhbHVlIFBhcmFtZXRlciB2YWx1ZQoJ ICovCglwdWJsaWMgZnVuY3Rpb24gc2V0X3F1ZXJ5X3BhcmFtICggJG5hbWUsICR2YWx1ZSA9 IG51bGwgKQoJewoJCWlmICggaXNfbnVsbCgkdmFsdWUpICkKCQkJdW5zZXQoJHRoaXMtPnF1 ZXJ5X3BhcmFtc1skbmFtZV0pOwoJCWVsc2UKCQkJJHRoaXMtPnF1ZXJ5X3BhcmFtc1skbmFt ZV0gPSAkdmFsdWU7CgkJJHRoaXMtPnVwZGF0ZV9mcm9tX3BhcmFtcygpOwoJCXJldHVybiAk dGhpczsKCX0KCgkvKiogUmVidWlsZCAkcXVlcnlfc3RyaW5nIGFuZCAkcmVxdWVzdF91cmkg KGFuZCB0aGUgY29ycmVzcG9uZGluZwoJICogICRfU0VSVkVSIHZhbHVlcykgYmFzZWQgb24g dGhlIGN1cnJlbnQgJHBhcmFtcyBhcnJheQoJICovCglwcml2YXRlIGZ1bmN0aW9uIHVwZGF0 ZV9mcm9tX3BhcmFtcyAoICkKCXsKCQkvLyBodG1sZW5jb2RlIGFtcGVyc2FuZHMgbm93LCBi ZWNhdXNlIHNvbWUgc2VydmVycyB3aWxsIGFueXdheQoJCSR0aGlzLT5xdWVyeV9zdHJpbmcg PSBodHRwX2J1aWxkX3F1ZXJ5KCR0aGlzLT5xdWVyeV9wYXJhbXMsICcnLCAnJmFtcDsnKTsK CgkJJHRoaXMtPnJlcXVlc3RfdXJpID0gc2VsZjo6c3RyaXBfcXVlcnkoJHRoaXMtPnJlcXVl c3RfdXJpKSAuCgkJCSggJHRoaXMtPnF1ZXJ5X3N0cmluZyA/ICc/JyAuICR0aGlzLT5xdWVy eV9zdHJpbmcgOiAnJyApOwoJCSR0aGlzLT5mdWxsID0gcHJlZ19yZXBsYWNlKCcvXC8kLycs ICcnLCBodSkgLiAkdGhpcy0+cmVxdWVzdF91cmkoKTsKCgkJLy8gdGhlbiBodG1sZGVjb2Rl IGJlZm9yZSB1cGRhdGluZyB0aGUgJF9TRVJWRVIgYXJyYXkKCQkkX1NFUlZFUlsnUVVFUllf U1RSSU5HJ10gPSBodG1sX2VudGl0eV9kZWNvZGUoJHRoaXMtPnF1ZXJ5X3N0cmluZyk7CgkJ JF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10gPSBodG1sX2VudGl0eV9kZWNvZGUoJHRoaXMtPnJl cXVlc3RfdXJpKTsKCX0KCgkvKiogUmVtb3ZlIHRoZSBxdWVyeSBzdHJpbmcgZnJvbSBhIFVS SQoJICogIEByZXR1cm4gc3RyaW5nCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzdHJpcF9xdWVy eSAoICR1cmkgKQoJewoJCXJldHVybiBwcmVnX3JlcGxhY2UgKCcvKC4rKVw/LisvJywgJyQx JywgJHVyaSk7Cgl9CgoJLyoqIFJldHVybiB0aGUgJHJlcXVlc3RfdXJpIGFmdGVyIHN0cmlw cGluZyBhbnkgc3ViZGlyCgkgKiAgKGZvciBUeHAgc3ViZGlyIGluc3RhbGxhdGlvbnMpCgkg KiAgQHJldHVybiBzdHJpbmcKCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiByZXF1ZXN0X3VyaSAo ICkKCXsKCQlpZiAoIHByZWdfbWF0Y2goJyY6Ly9bXi9dKygvLispLyQmJywgaHUsICRtYXRj aCkgKQoJCXsKCQkJJHN1Yl9kaXIgPSAkbWF0Y2hbMV07CgkJCXJldHVybiBzdWJzdHIoJHRo aXMtPnJlcXVlc3RfdXJpLCBzdHJsZW4oJHN1Yl9kaXIpKTsKCQl9CgkJcmV0dXJuICR0aGlz LT5yZXF1ZXN0X3VyaTsKCX0KCn0KCi8vLyBDbGFzcyBmb3Igc3RhdGljIHV0aWxpdHkgbWV0 aG9kcwpjbGFzcyBzb29fdXRpbAp7CgkvKiogQnVpbGQgYSBUeHAgdGFnIHN0cmluZy4KCSAq ICBAcGFyYW0gZnVuYyBUeHAgdGFnIG5hbWUgKGUuZy4gJ2FydGljbGVfY3VzdG9tJykKCSAq ICBAcGFyYW0gYXR0cyBUYWcgYXR0cmlidXRlcwoJICogIEBwYXJhbSB0aGluZyBUYWcgY29u dGVudHMKCSAqICBAcmV0dXJuIHN0cmluZyBUeHAgdGFnCgkgKi8KCXB1YmxpYyBzdGF0aWMg ZnVuY3Rpb24gdHhwX3RhZyAoICRmdW5jLCAkYXR0cyA9IGFycmF5KCksICR0aGluZyA9IG51 bGwgKQoJewoJCSRhID0gJyc7CgkJZm9yZWFjaCAoICRhdHRzIGFzICRrID0+ICR2ICkKCQkJ JGEgLj0gIiAkaz1cIiR2XCIiOwoJCXJldHVybiAiPHR4cDokZnVuYyRhIiAuICggaXNfbnVs bCgkdGhpbmcpID8gJyAvPicgOiAiPiR0aGluZzwvdHhwOiRmdW5jPiIgKTsKCX0KCgkvKiog UmV0dXJuIGEgVHhwIHRhZyBzdHJpbmcsIGlmIGl0J3Mgc3RpbGwgdGhlIGZpcnN0IHBhcnNl KCkgcGFzcy4KCSAqICBBbGxvd3MgcGxhY2luZyBhIHRhZyB3aXRoIGRlcGVuZGVuY2llcyBi ZWZvcmUgaXRzIGFzc29jaWF0ZWQgY29udHJvbGxlciwKCSAqICBkZWZlcnJpbmcgcGFyc2lu ZyB0byB0aGUgc2Vjb25kIHBhcnNlKCkgcGFzcy4KCSAqICBFLmcuIHBsYWNpbmcgYSBwYWdp bmF0aW9uIHRhZyBiZWZvcmUgaXRzIGFzc29jaWF0ZWQgYXJ0aWNsZSB0YWcuCgkgKiAgQHBh cmFtIGZ1bmMgVHhwIHRhZyBuYW1lIChlLmcuICdhcnRpY2xlX2N1c3RvbScpCgkgKiAgQHBh cmFtIGF0dHMgVGFnIGF0dHJpYnV0ZXMKCSAqICBAcGFyYW0gdGhpbmcgVGFnIGNvbnRlbnRz CgkgKiAgQHJldHVybiBzdHJpbmcgVHhwIHRhZwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0 aW9uIHNlY29uZHBhc3MgKCAkZnVuYywgJGF0dHMgPSBhcnJheSgpLCAkdGhpbmcgPSBudWxs ICkKCXsKCQlnbG9iYWwgJHByZXRleHQ7CgkJaWYgKCAkcHJldGV4dFsnc2Vjb25kcGFzcydd ICkgcmV0dXJuOyAvLyB5b3Ugb25seSBsaXZlIHR3aWNlCgkJcmV0dXJuIHNlbGY6OnR4cF90 YWcoJGZ1bmMsICRhdHRzLCAkdGhpbmcpOwoJfQoKfQoiO3M6NDoidHlwZSI7czoxOiIyIjtz OjU6ImZsYWdzIjtzOjE6IjAiO3M6NToib3JkZXIiO3M6MToiNSI7czozOiJtZDUiO3M6MzI6 IjUxNzVkYzc1YzRhZDMyZjdlNjYwZWJlN2QyNDI0Y2RkIjt9