# Name: soo_txp_obj v1.0.b.8 # 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 L3R4cC8iO3M6NzoidmVyc2lvbiI7czo3OiIxLjAuYi44IjtzOjExOiJkZXNjcmlwdGlvbiI7 czozMToiU3VwcG9ydCBsaWJyYXJ5IGZvciBUeHAgcGx1Z2lucyI7czo0OiJoZWxwIjtzOjUy MzM6IjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CmRpdiNzZWRfaGVscCBwcmUge3BhZGRpbmc6 IDAuNWVtIDFlbTsgYmFja2dyb3VuZDogI2VlZTsgYm9yZGVyOiAxcHggZGFzaGVkICNjY2M7 fQpkaXYjc2VkX2hlbHAgaDEsIGRpdiNzZWRfaGVscCBoMiwgZGl2I3NlZF9oZWxwIGgzLCBk aXYjc2VkX2hlbHAgaDMgY29kZSB7Zm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7IGZvbnQtd2Vp Z2h0OiBib2xkO30KZGl2I3NlZF9oZWxwIGgxLCBkaXYjc2VkX2hlbHAgaDIsIGRpdiNzZWRf aGVscCBoMyB7bWFyZ2luLWxlZnQ6IC0xZW07fQpkaXYjc2VkX2hlbHAgaDIsIGRpdiNzZWRf aGVscCBoMyB7bWFyZ2luLXRvcDogMmVtO30KZGl2I3NlZF9oZWxwIGgxIHtmb250LXNpemU6 IDIuNGVtO30KZGl2I3NlZF9oZWxwIGgyIHtmb250LXNpemU6IDEuOGVtO30KZGl2I3NlZF9o ZWxwIGgzIHtmb250LXNpemU6IDEuNGVtO30KZGl2I3NlZF9oZWxwIGg0IHtmb250LXNpemU6 IDEuMmVtO30KZGl2I3NlZF9oZWxwIGg1IHtmb250LXNpemU6IDFlbTttYXJnaW4tbGVmdDox ZW07Zm9udC1zdHlsZTpvYmxpcXVlO30KZGl2I3NlZF9oZWxwIHVsIGxpIHtsaXN0LXN0eWxl LXR5cGU6IGRpc2M7fQpkaXYjc2VkX2hlbHAgdWwgbGkgbGkge2xpc3Qtc3R5bGUtdHlwZTog Y2lyY2xlO30KZGl2I3NlZF9oZWxwIHVsIGxpIGxpIGxpIHtsaXN0LXN0eWxlLXR5cGU6IHNx dWFyZTt9CmRpdiNzZWRfaGVscCBsaSBhIGNvZGUge2ZvbnQtd2VpZ2h0OiBub3JtYWw7fQpk aXYjc2VkX2hlbHAgbGkgY29kZTpmaXJzdC1jaGlsZCB7YmFja2dyb3VuZDogI2RkZDtwYWRk aW5nOjAgLjNlbTttYXJnaW4tbGVmdDotLjNlbTt9CmRpdiNzZWRfaGVscCBsaSBsaSBjb2Rl OmZpcnN0LWNoaWxkIHtiYWNrZ3JvdW5kOm5vbmU7cGFkZGluZzowO21hcmdpbi1sZWZ0OjA7 fQpkaXYjc2VkX2hlbHAgZGZuIHtmb250LXdlaWdodDpib2xkO2ZvbnQtc3R5bGU6b2JsaXF1 ZTt9CmRpdiNzZWRfaGVscCAucmVxdWlyZWQsIGRpdiNzZWRfaGVscCAud2FybmluZyB7Y29s b3I6cmVkO30KZGl2I3NlZF9oZWxwIC5kZWZhdWx0IHtjb2xvcjpncmVlbjt9CmRpdiNzZWRf aGVscCBzdXAge2xpbmUtaGVpZ2h0OjA7fQo8L3N0eWxlPgoJPHA+PGRpdiBpZD0ic2VkX2hl bHAiPjwvcD4KCgk8aDE+c29vX3R4cF9vYmo8L2gxPgoKCTxwPkEgc3VwcG9ydCBsaWJyYXJ5 IGZvciBUZXh0cGF0dGVybiBwbHVnaW5zLjwvcD4KCgk8dWw+CgkJPGxpPjxhIGhyZWY9Imh0 dHA6Ly9pcHNlZGl4aXQubmV0L3R4cC8yMS9zb28tdHhwLW9iaiI+SW5mb3JtYXRpb24gYW5k IGV4YW1wbGVzPC9hPjwvbGk+CgkJPGxpPjxhIGhyZWY9Imh0dHA6Ly9pcHNlZGl4aXQubmV0 L2FwaS9zb29fdHhwX29iai8iPjxzcGFuIGNsYXNzPSJjYXBzIj5BUEk8L3NwYW4+IERvY3Vt ZW50YXRpb248L2E+PC9saT4KCTwvdWw+CgoJPGgyIGlkPSJoaXN0b3J5Ij5WZXJzaW9uIGhp c3Rvcnk8L2gyPgoKCTxoMyBpZD0iYjgiPjEuMC5iLjg8L2gzPgoKCTxwPjcvOS8yMDEwPC9w PgoKCTx1bD4KCQk8bGk+RG9jdW1lbnRhdGlvbiB1cGRhdGVzPC9saT4KCTwvdWw+CgoJPGgz IGlkPSJiNyI+MS4wLmIuNzwvaDM+CgoJPHA+Ny80LzIwMTA8L3A+CgoJPHVsPgoJCTxsaT48 c3Ryb25nPnNvb19odG1sX2ltZzwvc3Ryb25nPiBub3cgYWRkcyB0aHVtYm5haWwgPGNvZGU+ aGVpZ2h0PC9jb2RlPiBhbmQgPGNvZGU+d2lkdGg8L2NvZGU+IGF0dHJpYnV0ZXMgKFR4cCA0 LjIuMCBvciBsYXRlcik8L2xpPgoJPC91bD4KCgk8aDMgaWQ9ImI2Ij4xLjAuYi42PC9oMz4K Cgk8cD43LzEvMjAxMDwvcD4KCgk8dWw+CgkJPGxpPk5ldyBjbGFzczogc29vX3V0aWwsIGZv ciBzdGF0aWMgdXRpbGl0eSBtZXRob2RzPC9saT4KCTwvdWw+CgoJPGgzIGlkPSJiNSI+MS4w LmIuNTwvaDM+CgoJPHA+MS8yNy8yMDEwPC9wPgoKCTx1bD4KCQk8bGk+bmV3IG1ldGhvZDog PGNvZGU+d2hlcmVfY2xhdXNlKCk8L2NvZGU+IGluIDxzdHJvbmc+c29vX3R4cF9xdWVyeTwv c3Ryb25nPiwgYSBjYXRjaC1hbGwgZm9yIGNvbXBsZXggY2xhdXNlczwvbGk+CgkJPGxpPm1p bm9yIDxzcGFuIGNsYXNzPSJjYXBzIj5IVE1MPC9zcGFuPiBmb3JtYXR0aW5nIGNoYW5nZSB0 byA8Y29kZT50YWcoKTwvY29kZT4gbWV0aG9kIGluIDxzdHJvbmc+c29vX2h0bWw8L3N0cm9u Zz48L2xpPgoJPC91bD4KCgk8aDMgaWQ9ImI0Ij4xLjAuYi40PC9oMz4KCgk8cD4xMC8zLzIw MDk8L3A+CgoJPHVsPgoJCTxsaT48c3Ryb25nPnNvb191cmk8L3N0cm9uZz4gdXBkYXRlZCBm b3IgY29ycmVjdCBiZWhhdmlvciBpbiBUeHAgc3ViLWRpciBpbnN0YWxsYXRpb25zPC9saT4K CTwvdWw+CgoJPGgzIGlkPSJiMyI+MS4wLmIuMzwvaDM+CgoJPHA+OS8yMi8yMDA5PC9wPgoK CTx1bD4KCQk8bGk+PHN0cm9uZz5zb29fdXJpPC9zdHJvbmc+IG5vdyBnZXRzIHF1ZXJ5IHBh cmFtcyBieSBwYXJzaW5nICRfU0VSVkVSWyYjODIxNjs8c3BhbiBjbGFzcz0iY2FwcyI+UVVF Ulk8L3NwYW4+X1NUUklORyYjODIxNztdIGluc3RlYWQgb2YgJF9HRVQ8L2xpPgoJPC91bD4K Cgk8aDMgaWQ9ImIyIj4xLjAuYi4yPC9oMz4KCgk8cD45LzE2LzIwMDk8L3A+CgoJPHVsPgoJ CTxsaT5OZXcgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIDxzcGFuIGNsYXNzPSJjYXBzIj5NTFA8 L3NwYW4+IFBhY2sgY29tcGF0aWJpbGl0eSB3aXRoIDxzdHJvbmc+c29vX3VyaTwvc3Ryb25n PjwvbGk+CgkJPGxpPk5ldyBjbGFzc2VzOgoJPHVsPgoJCTxsaT5zb29fdHhwX3Vwc2VydCBm b3IgPHNwYW4gY2xhc3M9ImNhcHMiPlNRTDwvc3Bhbj4gaW5zZXJ0L3VwZGF0ZSBzdGF0ZW1l bnRzPC9saT4KCQk8bGk+c29vX3R4cF9kZWxldGUgZm9yIDxzcGFuIGNsYXNzPSJjYXBzIj5T UUw8L3NwYW4+IGRlbGV0ZSBzdGF0ZW1lbnRzPC9saT4KCQk8bGk+c29vX2h0bWxfZm9ybSBm b3IgZm9ybSBlbGVtZW50czwvbGk+Cgk8L3VsPjwvbGk+CgkJPGxpPnNvb190eHBfcm93c2V0 IG92ZXJyaWRlcyBwYXJlbnQ6Ol9fZ2V0KCkgbWV0aG9kPC9saT4KCTwvdWw+CgoJPGgzIGlk PSJiMSI+MS4wLmIuMTwvaDM+CgoJPHVsPgoJCTxsaT5NYWpvciByZS1vcmdhbml6YXRpb24g YW5kIHJlLXdyaXRlIG9mIG1vc3QgY2xhc3Nlcy4KCTx1bD4KCQk8bGk+VGhlIG9sZCA8c3Ry b25nPlNvb19UeHBfRGF0YTwvc3Ryb25nPiBmYW1pbHkgaGFzIGJlZW4gZGl2aWRlZCBpbnRv IHNlcGFyYXRlIGNsYXNzZXMgZm9yIHF1ZXJpZXMgYW5kIGRhdGEuPC9saT4KCQk8bGk+VGhl cmUgYXJlIG5vIGxvbmdlciBzZXBhcmF0ZSBjbGFzc2VzIGZvciBlYWNoIFR4cCB0YWJsZS48 L2xpPgoJCTxsaT5BbGwgY2xhc3MgbmFtZXMgbm93IGxvd2VyY2FzZSAodGhlc2UgYXJlbiYj ODIxNzt0IGNhc2Ugc2Vuc2l0aXZlIGFueXdheSkuPC9saT4KCQk8bGk+R2VuZXJpYyBzZXR0 aW5nIGlzIG5vdyBpbiB0aGUgZm9ybSA8Y29kZT5vYmotJmd0O3Byb3BlcnR5KCk8L2NvZGU+ IGluc3RlYWQgb2YgPGNvZGU+b2JqLSZndDtzZXRfcHJvcGVydHkoKTwvY29kZT4uPC9saT4K CQk8bGk+VmFyaW91cyByZW5hbWluZywgY29kZSBjbGVhbmluZywgZXRjLjwvbGk+Cgk8L3Vs PjwvbGk+Cgk8L3VsPgoKCTxoMyBpZD0iYTYiPjEuMC5hLjY8L2gzPgoKCTxwPjYvMi8yMDA5 PC9wPgoKCTxwPldoYXQgdGhlIGhlY2ssIHRpbWUgdG8gdXNlIHRoZSBzYW1lIG5hbWluZyBj b252ZW50aW9uIEkmIzgyMTc7bSB1c2luZyB3aXRoIG90aGVyIHBsdWdpbnMuPC9wPgoKCTx1 bD4KCQk8bGk+QWRkZWQgPHN0cm9uZz5Tb29fVHhwX1VyaTwvc3Ryb25nPiBjbGFzcywgZm9y IDxzcGFuIGNsYXNzPSJjYXBzIj5VUkk8L3NwYW4+IHF1ZXJ5IHN0cmluZyBtYW5pcHVsYXRp b248L2xpPgoJCTxsaT48c3Ryb25nPlNvb19IdG1sX1A8L3N0cm9uZz4gYW5kIDxzdHJvbmc+ c29vX2h0bWxfdGg8L3N0cm9uZz4gY2FuIG5vdyBoYXZlIGNvbnRlbnRzIHNldCBkdXJpbmcg aW5zdGFudGlhdGlvbi4gTm90ZSB0aGF0IHRoaXMgd2lsbCBicmVhayBjb21wYXRpYmlsaXR5 IHdpdGggc29tZSBwcmV2aW91cyB1c2VzLCBlLmcuIDxjb2RlPm5ldyBTb29fSHRtbF9QKCRh dHRzKTwvY29kZT4uPC9saT4KCQk8bGk+QWRkZWQgPGNvZGU+JGluPC9jb2RlPiBhcmd1bWVu dCB0byA8Y29kZT53aGVyZV9pbigpPC9jb2RlPiBtZXRob2QgKDxzdHJvbmc+U29vX1R4cF9E YXRhPC9zdHJvbmc+KSB0byBhbGxvdyAmIzgyMjA7PHNwYW4gY2xhc3M9ImNhcHMiPk5PVDwv c3Bhbj4gSU4mIzgyMjE7IHF1ZXJpZXM8L2xpPgoJPC91bD4KCgk8aDMgaWQ9ImE1Ij4xLjAu YTU8L2gzPgoKCTxwPjUvMTMvMjAwOTwvcD4KCgk8dWw+CgkJPGxpPkNvcnJlY3RlZCA8c3Bh biBjbGFzcz0iY2FwcyI+U1FMPC9zcGFuPiBzeW50YXggaW4gPGNvZGU+b3JkZXJfYnlfZmll bGQoKTwvY29kZT4gZnVuY3Rpb24gb2YgPGNvZGU+U29vX1R4cF9EYXRhPC9jb2RlPiBjbGFz czwvbGk+CgkJPGxpPk1vZGlmaWVkIDxjb2RlPnRhZygpPC9jb2RlPiBmdW5jdGlvbiBvZiA8 Y29kZT5Tb29fSHRtbDwvY29kZT4gY2xhc3MgdG8gaGFuZGxlIGEgPHNwYW4gY2xhc3M9ImNh cHMiPlBIUDwvc3Bhbj4gNS4yLjAgYnVnPC9saT4KCTwvdWw+CgoJPGgzIGlkPSJhNCI+MS4w LmE0PC9oMz4KCgk8cD41LzEvMjAwOTwvcD4KCgk8cD5BZGRlZCA8Y29kZT5jb3VudCgpPC9j b2RlPiBhbmQgPGNvZGU+ZmllbGQoKTwvY29kZT4gbWV0aG9kcyB0byB0aGUgYWJzdHJhY3Qg PGNvZGU+U29vX1R4cF9EYXRhPC9jb2RlPiBjbGFzcy48L3A+CgoJPGgzIGlkPSJhMyI+MS4w LmEzPC9oMz4KCgk8cD4yLzE5LzIwMDk8L3A+CgoJPHA+QWRkZWQgJiM4MjIwO0V4cGlyZXMm IzgyMjE7IHByb3BlcnR5IHRvIDxjb2RlPlNvb19UeHBfQXJ0aWNsZTwvY29kZT4gYW5kICYj ODIyMDtsb2FkX29yZGVyJiM4MjIxOyBwcm9wZXJ0eSB0byA8Y29kZT5Tb29fVHhwX1BsdWdp bjwvY29kZT4uIFRoZXNlIGZpZWxkcyB3ZXJlIGFkZGVkIGluIFRleHRwYXR0ZXJuIHZlcnNp b24gNC4wLjcuPC9wPgoKCTxoMyBpZD0iYTIiPjEuMC5hMjwvaDM+CgoJPHA+Mi81LzIwMDk8 L3A+CgoJPHA+Tm8gc2lnbmlmaWNhbnQgY2hhbmdlcywgYnV0IGFkZGVkIGdlbmVyaWMgZ2V0 dGVycyBhbmQgc2V0dGVycyAodGhhbmtzIHRvIDxzdHJvbmc+am08L3N0cm9uZz4gZm9yIHRo ZSBoaW50KSwgbWFraW5nIHRoZSBmaWxlIGFib3V0IDM1JSBzbWFsbGVyLjwvcD4KCgk8aDMg aWQ9ImExIj4xLjAuYTE8L2gzPgoKCTxwPjIvNC8yMDA5PC9wPgoKCTxwPjwvZGl2PjwvcD4i O3M6NDoiY29kZSI7czozMjcwMjoiCi8qKiBHZW5lcmljIGFic3RyYWN0IGJhc2UgY2xhc3Mu CiAqICBUaGUgY2xhc3MgZG9lcyBub3QgZGVmaW5lIGFueSBwcm9wZXJ0aWVzLCBqdXN0IGEg ZmV3IGxvdy1sZXZlbCB1dGlsaXR5IG1ldGhvZHMuCiAqLwphYnN0cmFjdCBjbGFzcyBzb29f b2JqIHsKCgkvKiogR2VuZXJpYyBnZXR0ZXIuCgkgKiAgQWxsb3cgY2FsbHMgaW4gdGhlIGZv cm0gJG9iai0+cHJvcGVydHkgZm9yIHByb3RlY3RlZCBwcm9wZXJ0aWVzLgoJICovCglwdWJs aWMgZnVuY3Rpb24gX19nZXQoICRwcm9wZXJ0eSApIHsKCQlyZXR1cm4gaXNzZXQoJHRoaXMt PiRwcm9wZXJ0eSkgPyAkdGhpcy0+JHByb3BlcnR5IDogbnVsbDsKCX0KCgkvKiogR2VuZXJp YyBzZXR0ZXIuCgkgKiAgQWxsb3cgY2FsbHMgaW4gdGhlIGZvcm0gJG9iai0+cHJvcGVydHko JHZhbHVlKS4KCSAqICBSZXR1cm5zICR0aGlzIHRvIGFsbG93IG1ldGhvZCBjaGFpbmluZy4K CSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY2FsbCggJHJlcXVlc3QsICRhcmdzICkgewoJCWlm ICggaXNzZXQoJHRoaXMtPiRyZXF1ZXN0KSApCgkJCSR0aGlzLT4kcmVxdWVzdCA9IGFycmF5 X3BvcCgkYXJncyk7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKiBSZXR1cm4gYW4gb2JqZWN0 J3MgY2xhc3MgbmFtZS4KCSAqICBBbGxvd3Mgb2JqZWN0IHRvIGJlIHVzZWQgaW4gYSBzdHJp bmcgY29udGV4dC4KCSAqICBAcmV0dXJuIHN0cmluZyBDbGFzcyBuYW1lCgkgKi8KCXB1Ymxp YyBmdW5jdGlvbiBfX3RvU3RyaW5nKCkgewoJCXJldHVybiBnZXRfY2xhc3MoJHRoaXMpOwoJ fQoKCS8qKiBSZXR1cm4gYW4gb2JqZWN0J3MgcHJvcGVydGllcyBhcyBhbiBhc3NvY2lhdGl2 ZSBhcnJheS4KCSAqICBAcmV0dXJuIGFycmF5CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBwcm9w ZXJ0aWVzKCkgewoJCWZvcmVhY2ggKCAkdGhpcyBhcyAkcHJvcGVydHkgPT4gJHZhbHVlICkK CQkJJG91dFskcHJvcGVydHldID0gJHZhbHVlOwoJCXJldHVybiAkb3V0OwoJfQoKCS8qKiBS ZXR1cm4gYW4gb2JqZWN0J3MgcHJvcGVydGllcyBhcyBhbiBpbmRleGVkIGFycmF5LgoJICog IEByZXR1cm4gYXJyYXkKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHByb3BlcnR5X25hbWVzKCkg ewoJCXJldHVybiBhcnJheV9rZXlzKCR0aGlzLT5wcm9wZXJ0aWVzKCkpOwoJfQoKfQoKLy8v IEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIFNRTCBxdWVyaWVzLgphYnN0cmFjdCBjbGFzcyBz b29fdHhwX3F1ZXJ5IGV4dGVuZHMgc29vX29iaiB7CgoJLy8vIERhdGFiYXNlIHRhYmxlIG5h bWUuCglwcm90ZWN0ZWQgJHRhYmxlCQk9ICcnOwoJLy8vIFNRTCBXSEVSRSBleHByZXNzaW9u cy4KCXByb3RlY3RlZCAkd2hlcmUJCT0gYXJyYXkoKTsKCS8vLyBTUUwgT1JERVIgQlkgZXhw cmVzc2lvbnMuCglwcm90ZWN0ZWQgJG9yZGVyX2J5CQk9IGFycmF5KCk7CgkvLy8gU1FMIExJ TUlULgoJcHJvdGVjdGVkICRsaW1pdAkJPSAwOwoJLy8vIFNRTCBPRkZTRVQuCglwcm90ZWN0 ZWQgJG9mZnNldAkJPSAwOwoKCXByaXZhdGUgJG51bWVyaWNfaW5kZXgJPSBhcnJheSgKCQkn dGV4dHBhdHRlcm4nCQk9PiAnSUQnLAoJCSd0eHBfY2F0ZWdvcnknCQk9PiAnaWQnLAoJCSd0 eHBfZGlzY3VzcycJCT0+ICdkaXNjdXNzaWQnLAoJCSd0eHBfZmlsZScJCQk9PiAnaWQnLAoJ CSd0eHBfaW1hZ2UnCQkJPT4gJ2lkJywKCQkndHhwX2xhbmcnCQkJPT4gJ2lkJywKCQkndHhw X2xpbmsnCQkJPT4gJ2lkJywKCQkndHhwX2xvZycJCQk9PiAnaWQnLAoJCSd0eHBfdXNlcnMn CQkJPT4gJ3VzZXJfaWQnLAoJKTsKCXByaXZhdGUgJHN0cmluZ19pbmRleAkJPSBhcnJheSgK CQkndGV4dHBhdHRlcm4nCQk9PiAnVGl0bGUnLAoJCSd0eHBfY2F0ZWdvcnknCQk9PiAnbmFt ZScsCgkJJ3R4cF9jc3MnCQkJPT4gJ25hbWUnLAoJCSd0eHBfZGlzY3Vzc19pcGJhbicJPT4g J2lwJywKCQkndHhwX2Rpc2N1c3Nfbm9uY2UnCT0+ICdub25jZScsCgkJJ3R4cF9maWxlJwkJ CT0+ICdmaWxlbmFtZScsCgkJJ3R4cF9mb3JtJwkJCT0+ICduYW1lJywKCQkndHhwX2ltYWdl JwkJCT0+ICduYW1lJywKCQkndHhwX2xhbmcnCQkJPT4gJ2xhbmcnLAoJCSd0eHBfcGFnZScJ CQk9PiAnbmFtZScsCgkJJ3R4cF9wbHVnaW4nCQk9PiAnbmFtZScsCgkJJ3R4cF9wcmVmcycJ CQk9PiAnbmFtZScsCgkJJ3R4cF9zZWN0aW9uJwkJPT4gJ25hbWUnLAoJCSd0eHBfdXNlcnMn CQkJPT4gJ25hbWUnLAoJKTsKCgkvKiogQ29uc3RydWN0b3IuCgkgKiAgVXNlICRrZXkgdG8g c2VsZWN0IGEgc2luZ2xlIHJvdyBtYXRjaGluZyBvbiBhcHByb3ByaWF0ZSBrZXkgY29sdW1u CgkgKiAgKHVzdWFsbHkgYG5hbWVgIG9yIGBpZGApCgkgKiAgQHBhcmFtIHRhYmxlIFRhYmxl IG5hbWUKCSAqICBAcGFyYW0ga2V5IEtleSBjb2x1bW4gdmFsdWUgZm9yIFdIRVJFIGV4cHJl c3Npb24KCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCAkdGFibGUsICRrZXkg PSBudWxsICkgewoJCSR0aGlzLT50YWJsZSA9IHRyaW0oJHRhYmxlKTsKCQlpZiAoICRrZXkg KQoJCQkkdGhpcy0+d2hlcmUoJHRoaXMtPmtleV9jb2x1bW4oJGtleSksICRrZXkpOwoJfQoK CS8qKiBBZGQgZXhwcmVzc2lvbiB0byBXSEVSRSBjbGF1c2UuCgkgKiAgQHBhcmFtIGNvbHVt biBDb2x1bW4gbmFtZQoJICogIEBwYXJhbSB2YWx1ZSBDb2x1bW4gdmFsdWUKCSAqICBAcGFy YW0gb3BlcmF0b3IgQ29tcGFyaXNvbiBvcGVyYXRvcgoJICogIEBwYXJhbSBqb2luIEFORCBv ciBPUgoJICovCglwdWJsaWMgZnVuY3Rpb24gd2hlcmUoICRjb2x1bW4sICR2YWx1ZSwgJG9w ZXJhdG9yID0gJz0nLCAkam9pbiA9ICcnICkgewoJCSRqb2luID0gJHRoaXMtPmFuZG9yKCRq b2luKTsKCQkkdGhpcy0+d2hlcmVbXSA9ICggJGpvaW4gPyAkam9pbiAuICcgJyA6ICcnICkg LgoJCQlzZWxmOjpxdW90ZSgkY29sdW1uKSAuICcgJyAuICRvcGVyYXRvciAuICIgJyIgLiAk dmFsdWUgLiAiJyI7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKiBBZGQgYSByYXcgZXhwcmVz c2lvbiB0byBXSEVSRSBjbGF1c2UuCgkgKiAgVXNlIGluc3RlYWQgb2Yge0BsaW5rIHdoZXJl KCl9IGZvciBjb21wbGV4IChlLmcuIG5lc3RlZCkgZXhwcmVzc2lvbnMKCSAqICBAcGFyYW0g Y2xhdXNlIFdIRVJFIEV4cHJlc3Npb24KCSAqICBAcGFyYW0gam9pbiBBTkQgb3IgT1IKCSAq LwoJcHVibGljIGZ1bmN0aW9uIHdoZXJlX2NsYXVzZSggJGNsYXVzZSwgJGpvaW4gPSAnJyAp IHsKCQkkam9pbiA9ICR0aGlzLT5hbmRvcigkam9pbik7CgkJJHRoaXMtPndoZXJlW10gPSAo ICRqb2luID8gJGpvaW4gLiAnICcgOiAnJyApIC4gJGNsYXVzZTsKCQlyZXR1cm4gJHRoaXM7 Cgl9CgoJLyoqIEFkZCBhbiBJTiBleHByZXNzaW9uIHRvIHRoZSBXSEVSRSBjbGF1c2UuCgkg KiAgQHBhcmFtIGNvbHVtbiBDb2x1bW4gbmFtZQoJICogIEBwYXJhbSBsaXN0IEl0ZW1zIHRv IGNvbXBhcmUgYWdhaW5zdAoJICogIEBwYXJhbSBqb2luIEFORCBvciBPUgoJICogIEBwYXJh bSBpbiB0cnVlID0gSU4sIGZhbHNlID0gTk9UIElOCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBp biggJGNvbHVtbiwgJGxpc3QsICRqb2luID0gJycsICRpbiA9IHRydWUgKSB7CgkJJGluID0g KCAkaW4gPyAnJyA6ICcgbm90JyApIC4gJyBpbiAoJzsKCQlpZiAoIGlzX3N0cmluZygkbGlz dCkgKSAkbGlzdCA9IGRvX2xpc3QoJGxpc3QpOwoJCSRqb2luID0gJHRoaXMtPmFuZG9yKCRq b2luKTsKCQkkdGhpcy0+d2hlcmVbXSA9ICggJGpvaW4gPyAkam9pbiAuICcgJyA6ICcnICkg LiBzZWxmOjpxdW90ZSgkY29sdW1uKSAuCgkJCSRpbiAuIGltcGxvZGUoJywnLCBxdW90ZV9s aXN0KGRvU2xhc2goJGxpc3QpKSkgLiAnKSc7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKiBB bGlhcyBvZiBpbigpIHdpdGggJGluID0gZmFsc2UgKGFkZCBhIE5PVCBJTiBleHByZXNzaW9u KS4KCSAqICBAcGFyYW0gY29sdW1uIENvbHVtbiBuYW1lCgkgKiAgQHBhcmFtIGxpc3QgSXRl bXMgdG8gY29tcGFyZSBhZ2FpbnN0CgkgKiAgQHBhcmFtIGpvaW4gQU5EIG9yIE9SCgkgKi8K CXB1YmxpYyBmdW5jdGlvbiBub3RfaW4oICRjb2x1bW4sICRsaXN0LCAkam9pbiA9ICcnICkg ewoJCXJldHVybiAkdGhpcy0+aW4oICRjb2x1bW4gLCAkbGlzdCAsICRqb2luICwgZmFsc2Ug KTsKCX0KCgkvKiogQWRkIGEgTXlTUUwgUkVHRVhQIGV4cHJlc3Npb24gdG8gdGhlIFdIRVJF IGNsYXVzZS4KCSAqICBAcGFyYW0gcGF0dGVybiBNeVNRTCBSRUdFWFAgcGF0dGVybgoJICog IEBwYXJhbSBzdWJqZWN0IENvbHVtbiBuYW1lIG9yIHN0cmluZyB0byBtYXRjaAoJICogIEBw YXJhbSBqb2luIEFORCBvciBPUgoJICovCglwdWJsaWMgZnVuY3Rpb24gcmVnZXhwKCAkcGF0 dGVybiwgJHN1YmplY3QsICRqb2luID0gJycgKSB7CgkJJGpvaW4gPSAkdGhpcy0+YW5kb3Io JGpvaW4pOwoJCSR0aGlzLT53aGVyZVtdID0gKCAkam9pbiA/ICRqb2luIC4gJyAnIDogJycg KSAuCgkJCXNlbGY6OnF1b3RlKCRzdWJqZWN0KSAuICIgcmVnZXhwICciIC4gJHBhdHRlcm4g LiAiJyI7CgkJcmV0dXJuICR0aGlzOwoJfQoKCXByaXZhdGUgZnVuY3Rpb24gYW5kb3IoICRq b2luID0gJ2FuZCcgKSB7CgkJJGpvaW4gPSBzdHJ0b2xvd2VyKCRqb2luKTsKCQlyZXR1cm4g Y291bnQoJHRoaXMtPndoZXJlKSA/CgkJCSggaW5fbGlzdCgkam9pbiwgJ2FuZCxvcicpID8g JGpvaW4gOiAnYW5kJyApIDogJyc7Cgl9CgoJLyoqIFF1b3RlIHdpdGggYmFja3RpY2tzLgoJ ICogIE9ubHkgcXVvdGUgaXRlbXMgY29uc2lzdGluZyBvZiBhbHBoYW51bWVyaWNzLCAkLCBh bmQvb3IgXwoJICogIEBwYXJhbSBpZGVudGlmaWVyIEl0ZW0gdG8gcXVvdGUKCSAqICBAcmV0 dXJuIHN0cmluZwoJICovCglzdGF0aWMgZnVuY3Rpb24gcXVvdGUoICRpZGVudGlmaWVyICkg ewoJCXJldHVybiBwcmVnX21hdGNoKCcvXlthLXpfJFxkXSskL2knLCAkaWRlbnRpZmllcikg PwoJCQknYCcgLiAkaWRlbnRpZmllciAuICdgJyA6ICRpZGVudGlmaWVyOwoJfQoKCS8qKiBB ZGQgYW4gZXhwcmVzc2lvbiB0byB0aGUgT1JERVIgQlkgYXJyYXkuCgkgKiAgRXhhbXBsZTog JHF1ZXJ5LT5vcmRlcl9ieSgnZm9vIEFTQywgYmFyIERFU0MnKTsKCSAqICBAcGFyYW0gZXhw ciBDb21tYS1zZXBhcmF0ZWQgbGlzdCwgb3IgYXJyYXksIG9mIGV4cHJlc3Npb25zCgkgKiAg QHBhcmFtIGRpcmVjdGlvbiBBU0Mgb3IgREVTQwoJICovCglwdWJsaWMgZnVuY3Rpb24gb3Jk ZXJfYnkoICRleHByLCAkZGlyZWN0aW9uID0gJycgKSB7CgoJCWlmICggJGV4cHIgKSB7CgoJ CQlpZiAoIGlzX2FycmF5KCRleHByKSApCgkJCQkkZXhwciA9IGFycmF5X21hcCgnc3RydG9s b3dlcicsICRleHByKTsKCgkJCWlmICggaXNfc3RyaW5nKCRleHByKSApCgkJCQkkZXhwciA9 IGRvX2xpc3Qoc3RydG9sb3dlcigkZXhwcikpOwoKCQkJZm9yZWFjaCAoICRleHByIGFzICR4 ICkgewoKCQkJCWlmICggcHJlZ19tYXRjaCgnLyhcUyspXHMrKFxTKykvJywgJHgsICRtYXRj aCkgKSB7CgkJCQkJJGNvbHVtbiA9ICRtYXRjaFsxXTsKCQkJCQkkZGlyZWN0aW9uID0gJG1h dGNoWzJdOwoJCQkJfQoJCQkJZWxzZQoJCQkJCSRjb2x1bW4gPSAkeDsKCgkJCQlpZiAoICRj b2x1bW4gPT0gJ3JhbmRvbScgb3IgJGNvbHVtbiA9PSAncmFuZCcgb3IgJGNvbHVtbiA9PSAn cmFuZCgpJyApIHsKCQkJCQkkY29sdW1uID0gJ3JhbmQoKSc7CgkJCQkJJGRpcmVjdGlvbiA9 ICcnOwoJCQkJfQoJCQkJZWxzZQoJCQkJCSRkaXJlY3Rpb24gPSBpbl9hcnJheSgkZGlyZWN0 aW9uLCBhcnJheSgnYXNjJywgJ2Rlc2MnKSkgPwoJCQkJCQkkZGlyZWN0aW9uIDogJyc7CgoJ CQkJJHRoaXMtPm9yZGVyX2J5W10gPSAkY29sdW1uIC4gKCAkZGlyZWN0aW9uID8gJyAnIC4g JGRpcmVjdGlvbiA6ICcnKTsKCQkJfQoJCX0KCgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKiBB bGlhcyBvZiBvcmRlcl9ieSgpIGZvciBhIHNpbmdsZSBjb2x1bW4gQVNDLgoJICogIEBwYXJh bSBjb2wgQ29sdW1uIG5hbWUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGFzYyggJGNvbCApIHsK CQkkdGhpcy0+b3JkZXJfYnkoJGNvbCwgJ2FzYycpOwoJCXJldHVybiAkdGhpczsKCX0KCgkv KiogQWxpYXMgb2Ygb3JkZXJfYnkoKSBmb3IgYSBzaW5nbGUgY29sdW1uIERFU0MuCgkgKiAg QHBhcmFtIGNvbCBDb2x1bW4gbmFtZQoJICovCglwdWJsaWMgZnVuY3Rpb24gZGVzYyggJGNv bCApIHsKCQkkdGhpcy0+b3JkZXJfYnkoJGNvbCwgJ2Rlc2MnKTsKCQlyZXR1cm4gJHRoaXM7 Cgl9CgoJLyoqIEFkZCBhIEZJRUxEKCkgZXhwcmVzc2lvbiB0byB0aGUgT1JERVIgQlkgYXJy YXkuCgkgKiAgRm9yIHByZXNlcnZpbmcgYW4gYXJiaXRyYXJ5IHNvcnQgb3JkZXIsIGUuZy4g JzcsNSwxMiwxJwoJICogIE5vdGUgdGhhdCBGSUVMRCgpIGlzIGEgTXlTUUwtc3BlY2lmaWMg ZnVuY3Rpb24gKG5vdCBzdGFuZGFyZCBTUUwpCgkgKiAgQHBhcmFtIGZpZWxkIENvbHVtbiBu YW1lCgkgKiAgQHBhcmFtIGxpc3QgQ29tbWEtc2VwYXJhdGVkIGxpc3QsIG9yIGFycmF5LCBv ZiB2YWx1ZXMgaW4gb3JkZXIKCSAqLwoJcHVibGljIGZ1bmN0aW9uIG9yZGVyX2J5X2ZpZWxk KCAkZmllbGQsICRsaXN0ICkgewoJCWlmICggaXNfc3RyaW5nKCRsaXN0KSApICRsaXN0ID0g ZG9fbGlzdCgkbGlzdCk7CgkJaWYgKCBjb3VudCgkbGlzdCkgPiAxICkKCQkJJHRoaXMtPm9y ZGVyX2J5W10gPSAnZmllbGQoJyAuICRmaWVsZCAuICcsICcgLgoJCQkJaW1wbG9kZSgnLCAn LCBxdW90ZV9saXN0KGRvU2xhc2goJGxpc3QpKSkgLiAnKSc7CgkJcmV0dXJuICR0aGlzOwoJ fQoKCS8qKiBBZGQgYSBMSU1JVCB0byB0aGUgcXVlcnkuCgkgKiAgQHBhcmFtIGxpbWl0IE1h eGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRvIHJldHVybgoJICovCglwdWJsaWMgZnVuY3Rpb24g bGltaXQoICRsaW1pdCApIHsKCQlpZiAoIGlzX251bWVyaWMoJGxpbWl0KSBhbmQgJGxpbWl0 ID4gMCApCgkJCSR0aGlzLT5saW1pdCA9ICcgbGltaXQgJyAuIGludHZhbCgkbGltaXQpOwoJ CXJldHVybiAkdGhpczsKCX0KCgkvKiogQWRkIGFuIE9GRlNFVCB0byB0aGUgcXVlcnkuCgkg KiAgQHBhcmFtIG9mZnNldCBOdW1iZXIgb2YgaXRlbXMgdG8gc2tpcAoJICovCglwdWJsaWMg ZnVuY3Rpb24gb2Zmc2V0KCAkb2Zmc2V0ICkgewoJCWlmICggaXNfbnVtZXJpYygkb2Zmc2V0 KSBhbmQgJG9mZnNldCA+IDAgKQoJCQkkdGhpcy0+b2Zmc2V0ID0gJyBvZmZzZXQgJyAuIGlu dHZhbCgkb2Zmc2V0KTsKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqIEFzc2VtYmxlIGFuZCBy ZXR1cm4gdGhlIHF1ZXJ5IGNsYXVzZXMgYXMgYSBzdHJpbmcuCgkgKiAgQHJldHVybiBzdHJp bmcKCSAqLwoJcHJvdGVjdGVkIGZ1bmN0aW9uIGNsYXVzZV9zdHJpbmcoKSB7CgkJcmV0dXJu IGltcGxvZGUoJyAnLCAkdGhpcy0+d2hlcmUpIC4KCQkJKCBjb3VudCgkdGhpcy0+b3JkZXJf YnkpID8gJyBvcmRlciBieSAnIC4gaW1wbG9kZSgnLCAnLCAkdGhpcy0+b3JkZXJfYnkpIDog JycgKSAuCgkJCSggJHRoaXMtPmxpbWl0ID8gJHRoaXMtPmxpbWl0IDogJycgKSAuICggJHRo aXMtPm9mZnNldCA/ICR0aGlzLT5vZmZzZXQgOiAnJyApOwoJfQoKCS8qKiBOdW1iZXIgb2Yg aXRlbXMgdGhlIHF1ZXJ5IHdpbGwgcmV0dXJuLgoJICogIFJ1bnMgdGhlIHF1ZXJ5IHdpdGgg Q09VTlQoKSBhcyB0aGUgc2VsZWN0IGV4cHJlc3Npb24KCSAqICBAcmV0dXJuIGludHxmYWxz ZQoJICovCglwdWJsaWMgZnVuY3Rpb24gY291bnQoKSB7CgkJcmV0dXJuIGdldENvdW50KCR0 aGlzLT50YWJsZSwgJHRoaXMtPmNsYXVzZV9zdHJpbmcoKSA/CgkJCSR0aGlzLT5jbGF1c2Vf c3RyaW5nKCkgOiAnMT0xJwoJCSk7Cgl9CgoJLyoqIFJldHVybiB0aGUga2V5IGNvbHVtbiBu YW1lIGZvciB0aGUgY3VycmVudCB0YWJsZS4KCSAqICBTb21lIFR4cCB0YWJsZXMgaGF2ZSBt dWx0aXBsZSBpbmRleGVzLgoJICogIElmICRrZXlfdmFsdWUgaXMgcHJvdmlkZWQsIGNvbHVt biBvZiB0aGUgbWF0Y2hpbmcgdHlwZSB3aWxsIGJlIHJldHVybmVkLgoJICogIE90aGVyd2lz ZSB0aGUgbnVtZXJpYyBpbmRleCB3aWxsIGJlIHJldHVybmVkIGluIHByZWZlcmVuY2UgdG8g dGhlIHN0cmluZyBpbmRleC4KCSAqICBAcGFyYW0ga2V5X3ZhbHVlCgkgKiAgQHJldHVybiBz dHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGtleV9jb2x1bW4oICRrZXlfdmFsdWUgPSBu dWxsICkgewoJCWlmICggaXNfbnVtZXJpYygka2V5X3ZhbHVlKSApCgkJCXJldHVybiAkdGhp cy0+bnVtZXJpY19pbmRleFskdGhpcy0+dGFibGVdOwoJCWlmICggaXNfc3RyaW5nKCRrZXlf dmFsdWUpICkKCQkJcmV0dXJuICR0aGlzLT5zdHJpbmdfaW5kZXhbJHRoaXMtPnRhYmxlXTsK CQlpZiAoIGlzc2V0KCR0aGlzLT5udW1lcmljX2luZGV4WyR0aGlzLT50YWJsZV0pICkKCQkJ cmV0dXJuICR0aGlzLT5udW1lcmljX2luZGV4WyR0aGlzLT50YWJsZV07CgkJcmV0dXJuICR0 aGlzLT5zdHJpbmdfaW5kZXhbJHRoaXMtPnRhYmxlXTsKCX0KCn0KCi8vLyBDbGFzcyBmb3Ig U0VMRUNUIHF1ZXJpZXMuCmNsYXNzIHNvb190eHBfc2VsZWN0IGV4dGVuZHMgc29vX3R4cF9x dWVyeSB7CgoJLy8vIFNRTCBTRUxFQ1QgZXhwcmVzc2lvbnMuCglwcm90ZWN0ZWQgJHNlbGVj dAkJPSBhcnJheSgpOwoKCS8qKiBBZGQgaXRlbXMgdG8gdGhlIFNFTEVDVCBhcnJheS4KCSAq ICBAcGFyYW0gbGlzdAljb21tYS1zZXBhcmF0ZWQgbGlzdCwgb3IgYXJyYXksIG9mIGl0ZW1z IHRvIHNlbGVjdAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2VsZWN0KCAkbGlzdCA9ICcqJyAp IHsKCQlpZiAoIGlzX3N0cmluZygkbGlzdCkgKSAkbGlzdCA9IGRvX2xpc3QoJGxpc3QpOwoJ CWZvcmVhY2ggKCAkbGlzdCBhcyAkY29sICkgJHRoaXMtPnNlbGVjdFtdID0gcGFyZW50Ojpx dW90ZSgkY29sKTsKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJcHJpdmF0ZSBmdW5jdGlvbiBpbml0 X3F1ZXJ5KCkgewoJCWlmICggISBjb3VudCgkdGhpcy0+c2VsZWN0KSApICR0aGlzLT5zZWxl Y3QoKTsKCQlpZiAoICEgY291bnQoJHRoaXMtPndoZXJlKSApICR0aGlzLT53aGVyZVtdID0g JzEgPSAxJzsKCX0KCgkvKiogUmV0dXJuIGEgc2luZ2xlIHJlY29yZCwgb3IgZW1wdHkgYXJy YXkgaWYgbm8gbWF0Y2hpbmcgcmVjb3Jkcy4KCSAqICBAcmV0dXJuIGFycmF5CgkgKi8KCXB1 YmxpYyBmdW5jdGlvbiByb3coKSB7CgkJJHRoaXMtPmluaXRfcXVlcnkoKTsKCQlyZXR1cm4g c2FmZV9yb3coaW1wbG9kZSgnLCcsICR0aGlzLT5zZWxlY3QpLCAkdGhpcy0+dGFibGUsCgkJ CSR0aGlzLT5jbGF1c2Vfc3RyaW5nKCkpOwoJfQoKCS8qKiBSZXR1cm4gYWxsIHJlY29yZHMs IG9yIGVtcHR5IGFycmF5IGlmIG5vIG1hdGNoaW5nIHJlY29yZHMuCgkgKiAgQHJldHVybiBh cnJheQoJICovCglwdWJsaWMgZnVuY3Rpb24gcm93cygpIHsKCQkkdGhpcy0+aW5pdF9xdWVy eSgpOwoJCXJldHVybiBzYWZlX3Jvd3MoaW1wbG9kZSgnLCcsICR0aGlzLT5zZWxlY3QpLCAk dGhpcy0+dGFibGUsCgkJCSR0aGlzLT5jbGF1c2Vfc3RyaW5nKCkpOwoJfQoKfQoKLy8vIENs YXNzIGZvciBJTlNFUlQgYW5kIFVQREFURSBxdWVyaWVzLgpjbGFzcyBzb29fdHhwX3Vwc2Vy dCBleHRlbmRzIHNvb190eHBfcXVlcnkgewoKCS8vLyBTRVQgY29sdW1ucyBhbmQgdmFsdWVz LgoJcHVibGljICRzZXQJCQkJPSBhcnJheSgpOwoKCS8vLyBTRVQgY2xhdXNlLgoJcHJvdGVj dGVkICRzZXRfY2xhdXNlCT0gJyc7CgoJLyoqIEFkZCBhIGNvbHVtbjp2YWx1ZSBwYWlyIHRv IHRoZSAkc2V0IGFycmF5LgoJICogIEBwYXJhbSBjb2x1bW4gQ29sdW1uIG5hbWUKCSAqICBA cGFyYW0gdmFsdWUgQ29sdW1uIHZhbHVlCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXQoICRj b2x1bW4sICR2YWx1ZSApIHsKCQkkdGhpcy0+c2V0WyRjb2x1bW5dID0gJHZhbHVlOwoJCXJl dHVybiAkdGhpczsKCX0KCglwcml2YXRlIGZ1bmN0aW9uIGluaXRfcXVlcnkoKSB7CgkJZm9y ZWFjaCAoICR0aGlzLT5zZXQgYXMgJGNvbCA9PiAkdmFsICkgewoJCQkkdmFsID0gaXNfbnVt ZXJpYygkdmFsKSA/ICR2YWwgOiAiJyR2YWwnIjsKCQkJJHNldF9wYWlyc1tdID0gIiRjb2wg PSAkdmFsIjsKCQl9CgkJJHRoaXMtPnNldF9jbGF1c2UgPSBpbXBsb2RlKCcsJywgJHNldF9w YWlycyk7Cgl9CgoJLyoqIFJ1biB0aGUgcXVlcnkuCgkgKiAgUnVucyBhbiBVUERBVEUgcXVl cnkgaWYgJHdoZXJlIGlzIHNldCwgb3RoZXJ3aXNlIElOU0VSVAoJICovCglwdWJsaWMgZnVu Y3Rpb24gdXBzZXJ0KCkgewoJCSR0aGlzLT5pbml0X3F1ZXJ5KCk7CgkJcmV0dXJuIGNvdW50 KCR0aGlzLT53aGVyZSkgPwoJCQlzYWZlX3Vwc2VydCgkdGhpcy0+dGFibGUsICR0aGlzLT5z ZXRfY2xhdXNlLCAkdGhpcy0+Y2xhdXNlX3N0cmluZygpKQoJCQk6CgkJCXNhZmVfaW5zZXJ0 KCR0aGlzLT50YWJsZSwgJHRoaXMtPnNldF9jbGF1c2UpOwoJfQp9CgovLy8gQ2xhc3MgZm9y IERFTEVURSBxdWVyaWVzLgpjbGFzcyBzb29fdHhwX2RlbGV0ZSBleHRlbmRzIHNvb190eHBf cXVlcnkgewoKCS8qKiBFeGVjdXRlIHRoZSBERUxFVEUgcXVlcnkuCgkgKiAgQHJldHVybiBi b29sCVF1ZXJ5IHN1Y2Nlc3Mgb3IgZmFpbHVyZQoJICovCglwdWJsaWMgZnVuY3Rpb24gZGVs ZXRlKCkgewoJCWlmICggY291bnQoJHRoaXMtPndoZXJlKSApCgkJCXJldHVybiBzYWZlX2Rl bGV0ZSgkdGhpcy0+dGFibGUsICR0aGlzLT5jbGF1c2Vfc3RyaW5nKCkpOwoJfQp9CgovLy8g Q2xhc3MgZm9yIGRhdGEgcmVzdWx0cyBzZXRzLgpjbGFzcyBzb29fdHhwX3Jvd3NldCBleHRl bmRzIHNvb19vYmogewoKCS8vLyBEYXRhYmFzZSB0YWJsZSBuYW1lLgoJcHJvdGVjdGVkICR0 YWJsZQkJPSAnJzsKCgkvLy8gQXJyYXkgb2Ygc29vX3R4cF9yb3cgb2JqZWN0cy4KCXB1Ymxp YyAkcm93cwkJCT0gYXJyYXkoKTsKCgkvKiogQ29uc3RydWN0b3IuCgkgKiAgJGluaXQgY2Fu IGJlIGEgc29vX3R4cF9zZWxlY3Qgb2JqZWN0LCBvciBhbiBhcnJheSBvZiByZWNvcmRzLgoJ ICogIElmIGl0IGlzIGEgc29vX3R4cF9zZWxlY3Qgb2JqZWN0LCB0aGUgJHJvd3MgYXJyYXkg d2lsbCBiZQoJICogIGluZGV4ZWQgYnkga2V5IGNvbHVtbiB2YWx1ZXMuCgkgKiAgQHBhcmFt IGluaXQgRGF0YSBhcnJheSBvciBxdWVyeSBvYmplY3QgdG8gaW5pdGlhbGl6ZSByb3dzZXQK CSAqICBAcGFyYW0gdGFibGUgVHhwIHRhYmxlIG5hbWUKCSAqLwoJcHVibGljIGZ1bmN0aW9u IF9fY29uc3RydWN0KCAkaW5pdCA9IGFycmF5KCksICR0YWJsZSA9ICcnICkgewoJCWlmICgg JGluaXQgaW5zdGFuY2VvZiBzb29fdHhwX3NlbGVjdCApIHsKCQkJJHRhYmxlID0gJGluaXQt PnRhYmxlOwoJCQkkaW5kZXggPSAkaW5pdC0+a2V5X2NvbHVtbigpOwoJCQkkaW5pdCA9ICRp bml0LT5yb3dzKCk7CgkJfQoJCSR0aGlzLT50YWJsZSA9ICR0YWJsZTsKCQlmb3JlYWNoICgg JGluaXQgYXMgJHIgKQoJCQlpZiAoIGlzc2V0KCRpbmRleCkgKQoJCQkJJHRoaXMtPmFkZF9y b3coJHIsICR0YWJsZSwgJHJbJGluZGV4XSk7CgkJCWVsc2UKCQkJCSR0aGlzLT5hZGRfcm93 KCRyLCAkdGFibGUpOwoJfQoKCS8qKiBHZW5lcmljIGdldHRlciwgb3ZlcnJpZGluZyBwYXJl bnQgbWV0aG9kLgoJICogIElmICRwcm9wZXJ0eSBpcyBub3QgYSBwcm9wZXJ0eSBuYW1lLCBs b29rIGZvciByb3cgb2JqZWN0CgkgKiAgbWF0Y2hpbmcgdGhpcyBpbmRleCB2YWx1ZQoJICog IEBwYXJhbSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lLCBvciByb3dzZXQgaW5kZXgKCSAqLwoJ cHVibGljIGZ1bmN0aW9uIF9fZ2V0KCAkcHJvcGVydHkgKSB7CgkJaWYgKCBwcm9wZXJ0eV9l eGlzdHMoJHRoaXMsICRwcm9wZXJ0eSkgKQoJCQlyZXR1cm4gJHRoaXMtPiRwcm9wZXJ0eTsK CQlpZiAoIGFycmF5X2tleV9leGlzdHMoJHByb3BlcnR5LCAkdGhpcy0+cm93cykgKQoJCQly ZXR1cm4gJHRoaXMtPnJvd3NbJHByb3BlcnR5XTsKCX0KCgkvKiogUmV0dXJuIGFuIGFycmF5 IG9mIGFsbCB2YWx1ZXMgZm9yIGEgcGFydGljdWxhciBjb2x1bW4gKGZpZWxkKS4KCSAqICBJ ZiAka2V5IGlzIHNldCwgbWFrZSBpdCBhbiBhc3NvY2lhdGl2ZSBhcnJheSwgdXNpbmcgdGhl IHZhbHVlCgkgKiAgb2YgdGhlIGtleSBjb2x1bW4gYXMgdGhlIGFycmF5IGluZGV4CgkgKiAg QHBhcmFtIGZpZWxkIENvbHVtbiAoZmllbGQpIG5hbWUKCSAqICBAcGFyYW0ga2V5IEtleSBj b2x1bW4gbmFtZQoJICovCglwdWJsaWMgZnVuY3Rpb24gZmllbGRfdmFscyggJGZpZWxkLCAk a2V5ID0gbnVsbCApIHsKCQlmb3JlYWNoICggJHRoaXMtPnJvd3MgYXMgJHIgKQoJCQlpZiAo ICEgaXNfbnVsbCgka2V5KSApCgkJCQkkb3V0WyRyLT4ka2V5XSA9ICRyLT4kZmllbGQ7CgkJ CWVsc2UKCQkJCSRvdXRbXSA9ICRyLT4kZmllbGQ7CgkJcmV0dXJuIGlzc2V0KCRvdXQpID8g JG91dCA6IGFycmF5KCk7Cgl9CgoJLyoqIEFkZCBhIHNvb190eHBfcm93IG9iamVjdCB0byAk cm93cy4KCSAqICBAcGFyYW0gbWl4ZWQgc29vX3R4cF9yb3cgb2JqZWN0LCBvciBrZXkgdmFs dWUKCSAqICBAcGFyYW0gc3RyaW5nIFR4cCB0YWJsZSBuYW1lCgkgKiAgQHBhcmFtIHN0cmlu Z3xpbnQgaW5kZXggdmFsdWUgZm9yICRyb3dzIGFycmF5CgkgKi8KCXByaXZhdGUgZnVuY3Rp b24gYWRkX3JvdyggJGRhdGEsICR0YWJsZSwgJGkgPSBudWxsICkgewoJCSRyID0gJGRhdGEg aW5zdGFuY2VvZiBzb29fdHhwX3JvdyA/CgkJCSRkYXRhIDogKCAkdGFibGUgPT0gJ3R4cF9p bWFnZScgPwoJCQkJbmV3IHNvb190eHBfaW1nKCRkYXRhKSA6IG5ldyBzb29fdHhwX3Jvdygk ZGF0YSwgJHRhYmxlKSApOwoJCWlmICggaXNfbnVsbCgkaSkgKQoJCQkkdGhpcy0+cm93c1td ID0gJHI7CgkJZWxzZQoJCQkkdGhpcy0+cm93c1skaV0gPSAkcjsKCQlyZXR1cm4gJHRoaXM7 Cgl9Cn0KCi8vLyBDbGFzcyBmb3Igc2luZ2xlIGRhdGEgcmVjb3Jkcy4KY2xhc3Mgc29vX3R4 cF9yb3cgZXh0ZW5kcyBzb29fb2JqIHsKCgkvLy8gRGF0YWJhc2UgdGFibGUgbmFtZS4KCXBy b3RlY3RlZCAkdGFibGUJCT0gJyc7CgkvLy8gRGF0YWJhc2UgcmVjb3JkLgoJcHJvdGVjdGVk ICRkYXRhCQkJPSBhcnJheSgpOwoKCS8qKiBDb25zdHJ1Y3Rvci4KCSAqICBAcGFyYW0gaW5p dCBLZXkgdmFsdWUsIHNvb190eHBfc2VsZWN0IG9iamVjdCwgb3IgZGF0YSBhcnJheQoJICog IEBwYXJhbSB0YWJsZSBUeHAgdGFibGUgbmFtZQoJICovCglwdWJsaWMgZnVuY3Rpb24gX19j b25zdHJ1Y3QoICRpbml0ID0gYXJyYXkoKSwgJHRhYmxlID0gJycgKSB7CgkJaWYgKCBpc19z Y2FsYXIoJGluaXQpIGFuZCAkdGFibGUgKQoJCQkkaW5pdCA9IG5ldyBzb29fdHhwX3NlbGVj dCgkdGFibGUsICRpbml0KTsKCQlpZiAoICRpbml0IGluc3RhbmNlb2Ygc29vX3R4cF9zZWxl Y3QgKSB7CgkJCSR0YWJsZSA9ICRpbml0LT50YWJsZTsKCQkJJGluaXQgPSAkaW5pdC0+cm93 KCk7CgkJfQoJCWlmICggaXNfYXJyYXkoJGluaXQpICkKCQkJZm9yZWFjaCAoICRpbml0IGFz ICRrID0+ICR2ICkKCQkJCSR0aGlzLT5kYXRhWyRrXSA9ICR2OwoJCSR0aGlzLT50YWJsZSA9 ICR0YWJsZTsKCX0KCgkvKiogR2VuZXJpYyBnZXR0ZXIsIG92ZXJyaWRpbmcgcGFyZW50IG1l dGhvZC4KCSAqICBMb29rIGZvciAkcHJvcGVydHkgaW4gdGhlICRkYXRhIGFycmF5IGZpcnN0 CgkgKiAgQHBhcmFtIHByb3BlcnR5IENvbHVtbiBvciBwcm9wZXJ0eSBuYW1lCgkgKiAgQHJl dHVybiBtaXhlZCBEYXRhIGZpZWxkIG9yIG9iamVjdCBwcm9wZXJ0eQoJICovCglwdWJsaWMg ZnVuY3Rpb24gX19nZXQoICRwcm9wZXJ0eSApIHsKCQlyZXR1cm4gaXNzZXQoJHRoaXMtPmRh dGFbJHByb3BlcnR5XSkgPyAkdGhpcy0+ZGF0YVskcHJvcGVydHldCgkJCTogcGFyZW50Ojpf X2dldCgkcHJvcGVydHkpOwoJfQoKCS8vLyBPdmVycmlkZSBwYXJlbnQgbWV0aG9kLCB0byBr ZWVwICRkYXRhIHByb3RlY3RlZC4KCSAJcHVibGljIGZ1bmN0aW9uIGRhdGEoICkgewoJCXJl dHVybjsKCX0KCgkvLy8gQHJldHVybiBhcnJheSBEYXRhYmFzZSByZWNvcmQgKGNvbHVtbjp2 YWx1ZSBhcnJheSkKCSAJcHVibGljIGZ1bmN0aW9uIHByb3BlcnRpZXMoICkgewoJCXJldHVy biAkdGhpcy0+ZGF0YTsKCX0KfQoKLy8vIENsYXNzIGZvciBUeHAgaW1hZ2UgcmVjb3Jkcy4K Y2xhc3Mgc29vX3R4cF9pbWcgZXh0ZW5kcyBzb29fdHhwX3JvdyB7CgoJLy8vIFVSTCBvZiBm dWxsLXNpemUgaW1hZ2UuCglwcm90ZWN0ZWQgJGZ1bGxfdXJsCQk9ICcnOwoJLy8vIFVSTCBv ZiB0aHVtYm5haWwgaW1hZ2UuCglwcm90ZWN0ZWQgJHRodW1iX3VybAk9ICcnOwoKCS8qKiBD b25zdHJ1Y3Rvci4KCSAqICBAcGFyYW0gaW5pdCBUeHAgaW1hZ2UgaWQKCSAqLwoJcHVibGlj IGZ1bmN0aW9uIF9fY29uc3RydWN0KCAkaW5pdCApIHsKCQlnbG9iYWwgJGltZ19kaXI7CgkJ cGFyZW50OjpfX2NvbnN0cnVjdCgkaW5pdCwgJ3R4cF9pbWFnZScpOwoJCSR0aGlzLT5mdWxs X3VybCA9IGh1IC4gJGltZ19kaXIgLiAnLycgLiAkdGhpcy0+aWQgLiAkdGhpcy0+ZXh0OwoJ CWlmICggJHRoaXMtPnRodW1ibmFpbCApCgkJCSR0aGlzLT50aHVtYl91cmwgPSBodSAuICRp bWdfZGlyIC4gJy8nIC4gJHRoaXMtPmlkIC4gJ3QnIC4gJHRoaXMtPmV4dDsKCX0KfQoKLy8v IEFic3RhY3QgYmFzZSBjbGFzcyBmb3IgKFgpSFRNTCBlbGVtZW50cy4KYWJzdHJhY3QgY2xh c3Mgc29vX2h0bWwgZXh0ZW5kcyBzb29fb2JqIHsKLy8gSFRNTCBlbGVtZW50IGNsYXNzLiBJ bnN0YW50aWF0aW9uIHRha2VzIGEgcmVxdWlyZWQgJ25hbWUnIGFyZ3VtZW50IGFuZCBhbgov LyBvcHRpb25hbCAnYXR0cycgYXJyYXk6IGl0ZW1zIHdpdGgga2V5cyBtYXRjaGluZyBIVE1M IGF0dHJpYnV0ZXMKLy8gd2lsbCBiZSB0cmFuc2ZlcnJlZCB0byB0aGUgbmV3IG9iamVjdC4K Ly8KLy8gU2VlIHRoZSBzb29faHRtbF9pbWcgY2xhc3MgZm9yIGFuIGV4YW1wbGUgb2YgaG93 IHRvIGV4dGVuZCB0aGlzIGNsYXNzLgoKCS8vLyBAbmFtZSBJbmhlcmVudCBwcm9wZXJ0aWVz CgkvL0B7CgkvLy8gKFgpSFRNTCBlbGVtZW50IG5hbWUKCXByb3RlY3RlZCAkZWxlbWVudF9u YW1lCT0gJyc7CgkvLy8gY29udGFpbmVyIChmYWxzZSkgb3IgZW1wdHkgZWxlbWVudCAodHJ1 ZSkKCXByb3RlY3RlZCAkaXNfZW1wdHkJCT0gMDsKCS8vLyBpbmxpbmUgKGZhbHNlKSBvciBi bG9jayAodHJ1ZSkgZWxlbWVudAoJcHJvdGVjdGVkICRpc19ibG9jawkJPSAwOwoJLy8vIEFs bG93YWJsZSBjb250ZW50IGVsZW1lbnRzCglwcm90ZWN0ZWQgJGNhbl9jb250YWluCT0gYXJy YXkoKTsKCS8vLyBFbGVtZW50IGNvbnRlbnQgYXJyYXkgKHN0cmluZ3Mgb3Igc29vX2h0bWwg b2JqZWN0cykKCXByb3RlY3RlZCAkY29udGVudHMJCT0gYXJyYXkoKTsKCS8vQH0KCgkvLy8g QG5hbWUgQ29tbW9uIChYKUhUTUwgYXR0cmlidXRlcwoJLy9AewoJcHJvdGVjdGVkICRjbGFz cwkJCT0gJyc7Cglwcm90ZWN0ZWQgJGRpcgkJCQk9ICcnOwoJcHJvdGVjdGVkICRpZAkJCQk9 ICcnOwoJcHJvdGVjdGVkICRsYW5nCQkJCT0gJyc7Cglwcm90ZWN0ZWQgJG9uY2xpY2sJCQk9 ICcnOwoJcHJvdGVjdGVkICRvbmRibGNsaWNrCQk9ICcnOwoJcHJvdGVjdGVkICRvbmtleWRv d24JCT0gJyc7Cglwcm90ZWN0ZWQgJG9ua2V5cHJlc3MJCT0gJyc7Cglwcm90ZWN0ZWQgJG9u a2V5dXAJCQk9ICcnOwoJcHJvdGVjdGVkICRvbm1vdXNlZG93bgkJPSAnJzsKCXByb3RlY3Rl ZCAkb25tb3VzZW1vdmUJCT0gJyc7Cglwcm90ZWN0ZWQgJG9ubW91c2VvdXQJCT0gJyc7Cglw cm90ZWN0ZWQgJG9ubW91c2VvdmVyCQk9ICcnOwoJcHJvdGVjdGVkICRvbm1vdXNldXAJCT0g Jyc7Cglwcm90ZWN0ZWQgJHN0eWxlCQkJPSAnJzsKCXByb3RlY3RlZCAkdGl0bGUJCQk9ICcn OwoJLy9AfQoKCS8qKiBDb25zdHJ1Y3Rvci4KCSAqICBAcGFyYW0gZWxlbWVudF9uYW1lIChY KUhUTUwgZWxlbWVudCBuYW1lCgkgKiAgQHBhcmFtIGF0dHMgQXR0cmlidXRlcyAoYXJyYXkg b2YgbmFtZT0+dmFsdWUgcGFpcnMpCgkgKiAgQHBhcmFtIGNvbnRlbnQgRWxlbWVudCBjb250 ZW50IChzdHJpbmcsIHNvb19odG1sIG9iamVjdCwgb3IgYXJyYXkgdGhlcmVvZikKCSAqLwoJ cHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRlbGVtZW50X25hbWUsICRhdHRzLCAkY29u dGVudCA9ICcnKSB7CgkJJHRoaXMtPmVsZW1lbnRfbmFtZSgkZWxlbWVudF9uYW1lKTsKCQlp ZiAoIGVtcHR5KCRhdHRzKSApCgkJCSRhdHRzID0gYXJyYXkoKTsKCQlmb3JlYWNoICggJHRo aXMgYXMgJHByb3BlcnR5ID0+ICR2YWx1ZSApCgkJCWlmICggaW5fYXJyYXkoJHByb3BlcnR5 LCBhcnJheV9rZXlzKCRhdHRzKSkgKQoJCQkJJHRoaXMtPiRwcm9wZXJ0eSgkYXR0c1skcHJv cGVydHldKTsKCQlpZiAoICRjb250ZW50ICkKCQkJJHRoaXMtPmNvbnRlbnRzKCRjb250ZW50 KTsKCX0KCgkvKiogVmFsaWRhdGUgYW5kIHNldCBpZCBhdHRyaWJ1dGUuCgkgKiAgSW1wb3J0 YW50OiAoWClIVE1MIGF0dHJpYnV0ZSwgTk9UIGEgZGF0YWJhc2UgSUQhCgkgKiAgQHBhcmFt IGlkIChtdXN0IGJlZ2luIHdpdGggYSBsZXR0ZXIpCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBp ZCgkaWQpIHsKCQlpZiAoICRpZCBhbmQgIXByZWdfbWF0Y2goJy9eW2Etel0vJywgc3RydG9s b3dlcih0cmltKCRpZCkpKSApIHsKCQkJJHRoaXMtPmlkID0gJ2ludmFsaWRfSFRNTF9JRF92 YWx1ZV9mcm9tX1Nvb19UeHBfT2JqJzsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkkdGhpcy0+ aWQgPSAkaWQ7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKiBBZGQgc3RyaW5nfG9iamVjdHxh cnJheSB0byAkY29udGVudHMgYXJyYXkuCgkgKiAgQHBhcmFtIGNvbnRlbnQKCSAqLwoJcHVi bGljIGZ1bmN0aW9uIGNvbnRlbnRzKCRjb250ZW50KSB7CgkJaWYgKCAhICR0aGlzLT5pc19l bXB0eSApIHsKCQkJaWYgKCBpc19hcnJheSgkY29udGVudCkgKQoJCQkJJHRoaXMtPmNvbnRl bnRzW10gPSBhcnJheV9tZXJnZSgkdGhpcy0+Y29udGVudHMsICRjb250ZW50KTsKCQkJZWxz ZQoJCQkJJHRoaXMtPmNvbnRlbnRzW10gPSAkY29udGVudDsKCQl9CgkJcmV0dXJuICR0aGlz OwoJfQoJLyoqIFJldHVybiBhbiBhcnJheSBvZiBuYW1lcyBvZiBhbGwgYWxsb3dlZCAoWClI VE1MIGF0dHJpYnV0ZXMuCgkgKiAgQHJldHVybiBhcnJheQoJICovCglwcml2YXRlIGZ1bmN0 aW9uIGh0bWxfYXR0cmlidXRlX25hbWVzKCkgewoJCSRub3QgPSBhcnJheSgnZWxlbWVudF9u YW1lJywgJ2lzX2VtcHR5JywgJ2lzX2Jsb2NrJywgJ2NvbnRlbnRzJywgJ2Nhbl9jb250YWlu Jyk7CS8vIGdvdHRhIGJlIGEgYmV0dGVyIHdheQoJCSRhbGwgPSAkdGhpcy0+cHJvcGVydHlf bmFtZXMoKTsKCQlyZXR1cm4gYXJyYXlfZGlmZigkYWxsLCAkbm90KTsKCX0KCgkvKiogUmV0 dXJuIGFuIGF0dHJpYnV0ZTp2YWx1ZSBhcnJheSBvZiBhbGwgKFgpSFRNTCBhdHRyaWJ1dGVz LgoJICogIEByZXR1cm4gYXJyYXkKCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBodG1sX2F0dHJp YnV0ZXMoKSB7CgkJJG91dCA9IGFycmF5KCk7CgkJZm9yZWFjaCAoICR0aGlzIGFzICRwcm9w ZXJ0eSA9PiAkdmFsdWUgKQoJCQlpZiAoIGluX2FycmF5KCRwcm9wZXJ0eSwgJHRoaXMtPmh0 bWxfYXR0cmlidXRlX25hbWVzKCkpICkKCQkJCSRvdXRbJHByb3BlcnR5XSA9ICR2YWx1ZTsK CQlyZXR1cm4gJG91dDsKCX0KCgkvKiogQ3JlYXRlIChYKUhUTUwgdGFnKHMpIHN0cmluZyBm b3IgdGhpcyBlbGVtZW50LgoJICogIFJlY3Vyc2l2ZWx5IHRhZ3MgY29udGFpbmVkIGVsZW1l bnRzCgkgKiAgQHJldHVybiBzdHJpbmcKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHRhZygpIHsK CgkJJG91dCA9ICc8JyAuICR0aGlzLT5lbGVtZW50X25hbWU7CgoJCS8vIG5leHQgYmxvY2sg bW9kaWZpZWQgdG8gZGVhbCB3aXRoIGEgUEhQIDUuMi4wIGJ1ZyBmaXhlZCBQSFAgNS4yLjQg Pz8KCQkkaGlkZGVuID0gYXJyYXkoJ2VsZW1lbnRfbmFtZScsICdpc19lbXB0eScsICdpc19i bG9jaycsICdjb250ZW50cycsICdjYW5fY29udGFpbicpOwoJCWZvcmVhY2ggKCAkdGhpcy0+ cHJvcGVydGllcygpIGFzICRwcm9wZXJ0eSA9PiAkdmFsdWUgKQoJCQlpZiAoICggJHZhbHVl IG9yICRwcm9wZXJ0eSA9PSAnYWx0JyApIGFuZCAhaW5fYXJyYXkoJHByb3BlcnR5LCAkaGlk ZGVuKSApCgkJCQkkb3V0IC49ICIgJHByb3BlcnR5PVwiJHZhbHVlXCIiOwoKCQlpZiAoICR0 aGlzLT5pc19lbXB0eSApCgkJCXJldHVybiAkb3V0IC4gJyAvPic7CgoJCSRvdXQgLj0gJz4n IC4gKCAkdGhpcy0+aXNfYmxvY2sgPyBuIDogJycpOwoKCQlmb3JlYWNoICggJHRoaXMtPmNv bnRlbnRzIGFzICRpdGVtICkKCgkJCWlmICggJGl0ZW0gaW5zdGFuY2VvZiBzb29faHRtbCAp CgkJCQkkb3V0IC49ICRpdGVtLT50YWcoKSAuICggJGl0ZW0tPmlzX2Jsb2NrID8gbiA6ICcn KTsKCQkJCQkvLyByZWN1cnNpb24gLi4uCgoJCQllbHNlCgkJCQkkb3V0IC49ICRpdGVtOwoK CQlyZXR1cm4gJG91dCAuICI8LyR0aGlzLT5lbGVtZW50X25hbWU+IjsKCX0KCgkvKiogQ29u dmVydCAkdGhpcy0+JHByb3BlcnR5IHdpdGggaHRtbHNwZWNpYWxjaGFycygpLgoJICogIEBw YXJhbSBwcm9wZXJ0eSBBdHRyaWJ1dGUgbmFtZQoJICogIEByZXR1cm4gc3RyaW5nIChYKUhU TUwtZXNjYXBlZCBhdHRyaWJ1dGUgdmFsdWUKCSAqLwoJcHJvdGVjdGVkIGZ1bmN0aW9uIGh0 bWxfZXNjYXBlKCAkcHJvcGVydHkgKSB7CgkJJHRoaXMtPiRwcm9wZXJ0eSA9IGh0bWxzcGVj aWFsY2hhcnMoJHRoaXMtPiRwcm9wZXJ0eSk7CgkJcmV0dXJuICR0aGlzOwoJfQoKfQoKLy8v IENsYXNzIGZvciAoWClIVE1MIGFuY2hvciBlbGVtZW50cy4KY2xhc3Mgc29vX2h0bWxfYW5j aG9yIGV4dGVuZHMgc29vX2h0bWwgewoKCS8vLyBAbmFtZSBDb21tb24gKFgpSFRNTCBhdHRy aWJ1dGVzCgkvL0B7Cglwcm90ZWN0ZWQgJGhyZWYJCQkJPSAnJzsKCXByb3RlY3RlZCAkbmFt ZQkJCQk9ICcnOwoJcHJvdGVjdGVkICRyZWwJCQkJPSAnJzsKCXByb3RlY3RlZCAkcmV2CQkJ CT0gJyc7Cglwcm90ZWN0ZWQgJHR5cGUJCQkJPSAnJzsKCXByb3RlY3RlZCAkaHJlZmxhbmcJ CQk9ICcnOwoJcHJvdGVjdGVkICRjaGFyc2V0CQkJPSAnJzsKCXByb3RlY3RlZCAkYWNjZXNz a2V5CQk9ICcnOwoJcHJvdGVjdGVkICR0YWJpbmRleAkJCT0gJyc7Cglwcm90ZWN0ZWQgJHNo YXBlCQkJPSAnJzsKCXByb3RlY3RlZCAkY29vcmRzCQkJPSAnJzsKCXByb3RlY3RlZCAkb25m b2N1cwkJCT0gJyc7Cglwcm90ZWN0ZWQgJG9uYmx1cgkJCT0gJyc7CgkvL0B9CgoJLyoqIEBw YXJhbSBhdHRzIFVSSSBzdHJpbmcgKGhyZWYgdmFsdWUpIG9yIGF0dHJpYnV0ZSBhcnJheS4K CSAqICBAcGFyYW0gY29udGVudCBFbGVtZW50IGNvbnRlbnQgKHN0cmluZywgc29vX2h0bWwg b2JqZWN0LCBvciBhcnJheSB0aGVyZW9mKQoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25z dHJ1Y3QgKCAkYXR0cyA9IGFycmF5KCksICRjb250ZW50ID0gJycgKSB7CgkJaWYgKCAhIGlz X2FycmF5KCRhdHRzKSApCgkJCSRhdHRzID0gYXJyYXkoJ2hyZWYnID0+ICRhdHRzKTsKCQkk dGhpcy0+aXNfZW1wdHkoZmFsc2UpLT5pc19ibG9jayhmYWxzZSk7CgkJcGFyZW50OjpfX2Nv bnN0cnVjdCggJ2EnLCAkYXR0cywgJGNvbnRlbnQgKTsKCX0KCn0KCi8vLyBDbGFzcyBmb3Ig KFgpSFRNTCBiciBlbGVtZW50cy4KY2xhc3Mgc29vX2h0bWxfYnIgZXh0ZW5kcyBzb29faHRt bCB7CgoJLyoqIENvbnN0cnVjdG9yLgoJICogIEBwYXJhbSBhdHRzIEF0dHJpYnV0ZXMgKGFy cmF5IG9mIG5hbWU9PnZhbHVlIHBhaXJzKQoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25z dHJ1Y3QgKCAkYXR0cyA9IGFycmF5KCkgKSB7CgkJcGFyZW50OjpfX2NvbnN0cnVjdCggJ2Jy JywgJGF0dHMgKTsKCQkkdGhpcy0+aXNfZW1wdHkodHJ1ZSktPmlzX2Jsb2NrKGZhbHNlKTsK CX0KfQoKLy8vIENsYXNzIGZvciAoWClIVE1MIGZvcm0gZWxlbWVudHMKY2xhc3Mgc29vX2h0 bWxfZm9ybSBleHRlbmRzIHNvb19odG1sIHsKCgkvLy8gQG5hbWUgQ29tbW9uIChYKUhUTUwg YXR0cmlidXRlcwoJLy9AewoJcHJvdGVjdGVkICRhY3Rpb24JCQk9ICcnOwoJcHJvdGVjdGVk ICRtZXRob2QJCQk9ICcnOwoJcHJvdGVjdGVkICRlbmN0eXBlCQkJPSAnJzsKCXByb3RlY3Rl ZCAkYWNjZXB0X2NoYXJzZXQJPSAnJzsKCXByb3RlY3RlZCAkb25zdWJtaXQJCQk9ICcnOwoJ cHJvdGVjdGVkICRvbnJlc2V0CQkJPSAnJzsKCS8vQH0KCgkvKiogQ29uc3RydWN0b3IuCgkg KiAgQHBhcmFtIGluaXQgRm9ybSBhY3Rpb24gb3IgYXR0cmlidXRlcyAoYXJyYXkgb2YgbmFt ZT0+dmFsdWUgcGFpcnMpCgkgKiAgQHBhcmFtIGNvbnRlbnQgRWxlbWVudCBjb250ZW50IChz dHJpbmcsIHNvb19odG1sIG9iamVjdCwgb3IgYXJyYXkgdGhlcmVvZikKCSAqLwoJcHVibGlj IGZ1bmN0aW9uIF9fY29uc3RydWN0ICggJGluaXQgPSBhcnJheSgpLCAkY29udGVudCA9ICcn ICkgewoJCSRhdHRzID0gaXNfc3RyaW5nKCRpbml0KSA/IGFycmF5KCdhY3Rpb24nID0+ICRp bml0KSA6ICRpbml0OwoJCWlmICggISBpc3NldCgkYXR0c1snbWV0aG9kJ10pICkKCQkJJGF0 dHNbJ21ldGhvZCddID0gJ3Bvc3QnOwoJCXBhcmVudDo6X19jb25zdHJ1Y3QoICdmb3JtJywg JGF0dHMsICRjb250ZW50ICk7CgkJJHRoaXMtPmlzX2VtcHR5KGZhbHNlKS0+aXNfYmxvY2so dHJ1ZSk7Cgl9Cn0KCi8vLyBDbGFzcyBmb3IgKFgpSFRNTCBpbWcgZWxlbWVudHMKY2xhc3Mg c29vX2h0bWxfaW1nIGV4dGVuZHMgc29vX2h0bWwgewoKCS8vLyBAbmFtZSBDb21tb24gKFgp SFRNTCBhdHRyaWJ1dGVzCgkvL0B7Cglwcm90ZWN0ZWQgJGFsdAkJCQk9ICcnOwoJcHJvdGVj dGVkICRzcmMJCQkJPSAnJzsKCXByb3RlY3RlZCAkd2lkdGgJCQk9ICcnOwoJcHJvdGVjdGVk ICRoZWlnaHQJCQk9ICcnOwoJLy9AfQoKCS8qKiBDb25zdHJ1Y3Rvci4KCSAqICBAcGFyYW0g aW5pdCBzb29fdHhwX2ltZyBvYmplY3QsICBhdHRyaWJ1dGUgYXJyYXksIG9yIHNyYyB2YWx1 ZQoJICogIEBwYXJhbSB0aHVtYm5haWwgVGh1bWJuYWlsIG9yIGZ1bGwgaW1hZ2U/CgkgKiAg QHBhcmFtIGVzY2FwZSBIVE1MLWVzY2FwZSB0aXRsZSBhbmQgYWx0IGF0dHJpYnV0ZXM/Cgkg Ki8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCAoICRpbml0ID0gYXJyYXkoKSwgJHRo dW1ibmFpbCA9IGZhbHNlLCAkZXNjYXBlID0gdHJ1ZSApIHsKCgkJaWYgKCAkaW5pdCBpbnN0 YW5jZW9mIHNvb190eHBfaW1nICkgewoJCQkkc3JjID0gJHRodW1ibmFpbCA/ICRpbml0LT50 aHVtYl91cmwgOiAkaW5pdC0+ZnVsbF91cmw7CgkJCSRpbml0ID0gJGluaXQtPnByb3BlcnRp ZXMoKTsKCQkJaWYgKCAkdGh1bWJuYWlsICkgewoJCQkJaWYgKCAhIGVtcHR5KCRpbml0Wyd0 aHVtYl9oJ10pICkgeyAvLyBwcmUgVHhwIDQuMiBjb21wYXRpYmlsaXR5CgkJCQkJJGluaXRb J2gnXSA9ICRpbml0Wyd0aHVtYl9oJ107CgkJCQkJJGluaXRbJ3cnXSA9ICRpbml0Wyd0aHVt Yl93J107CgkJCQl9CgkJCQllbHNlICRpbml0WydoJ10gPSAoICRpbml0Wyd3J10gPSAwICk7 CgkJCX0KCQkJJGluaXRbJ2hlaWdodCddID0gJGluaXRbJ2gnXTsKCQkJJGluaXRbJ3dpZHRo J10gPSAkaW5pdFsndyddOwoJCQkkaW5pdFsndGl0bGUnXSA9ICRpbml0WydjYXB0aW9uJ107 CgkJCSRpbml0WydzcmMnXSA9ICRzcmM7CgkJCXVuc2V0KCRpbml0WydpZCddKTsgLy8gZG9u J3Qgd2FudCBkYXRhYmFzZSBpZCBhcyBIVE1MIGlkIQoJCX0KCQllbHNlaWYgKCAhIGlzX2Fy cmF5KCRpbml0KSApCgkJCSRpbml0WydzcmMnXSA9ICRpbml0OwoJCXBhcmVudDo6X19jb25z dHJ1Y3QoJ2ltZycsICRpbml0KTsKCgkJJHRoaXMtPmlzX2VtcHR5KHRydWUpLT5pc19ibG9j ayhmYWxzZSk7Ci8vCQkJLT5jYW5fY29udGFpbihhcnJheSgpKTsKCgkJaWYgKCAkZXNjYXBl ICkKCQkJJHRoaXMtPmh0bWxfZXNjYXBlKCd0aXRsZScpLT5odG1sX2VzY2FwZSgnYWx0Jyk7 Cgl9Cgp9CgovLy8gQ2xhc3MgZm9yIChYKUhUTUwgcCBlbGVtZW50cwpjbGFzcyBzb29faHRt bF9wIGV4dGVuZHMgc29vX2h0bWwgewoKCS8qKiBDb25zdHJ1Y3Rvci4KCSAqICBAcGFyYW0g YXR0cyBBdHRyaWJ1dGVzIChhcnJheSBvZiBuYW1lPT52YWx1ZSBwYWlycykKCSAqICBAcGFy YW0gY29udGVudCBFbGVtZW50IGNvbnRlbnQgKHN0cmluZywgc29vX2h0bWwgb2JqZWN0LCBv ciBhcnJheSB0aGVyZW9mKQoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QgKCAk YXR0cyA9IGFycmF5KCksICRjb250ZW50ID0gJycgKSB7CgkJJHRoaXMtPmlzX2VtcHR5KGZh bHNlKQoJCQktPmlzX2Jsb2NrKHRydWUpCgkJCS0+Y2FuX2NvbnRhaW4oYXJyYXkoJ2lubGlu ZScpKTsKCQlwYXJlbnQ6Ol9fY29uc3RydWN0KCdwJywgJGF0dHMsICRjb250ZW50KTsKCX0K fQoKLy8vIENsYXNzIGZvciAoWClIVE1MIHRhYmxlIGVsZW1lbnRzCmNsYXNzIHNvb19odG1s X3RhYmxlIGV4dGVuZHMgc29vX2h0bWwgewoKCS8vLyBAbmFtZSBDb21tb24gKFgpSFRNTCBh dHRyaWJ1dGVzCgkvL0B7Cglwcm90ZWN0ZWQgJHN1bW1hcnkJCQkJPSAnJzsKCXByb3RlY3Rl ZCAkd2lkdGgJCQkJPSAnJzsKCXByb3RlY3RlZCAkYm9yZGVyCQkJCT0gJyc7Cglwcm90ZWN0 ZWQgJGZyYW1lCQkJCT0gJyc7Cglwcm90ZWN0ZWQgJHJ1bGVzCQkJCT0gJyc7Cglwcm90ZWN0 ZWQgJGNlbGxzcGFjaW5nCQkJPSAnJzsKCXByb3RlY3RlZCAkY2VsbHBhZGRpbmcJCQk9ICcn OwoJLy9AfQoKCS8qKiBDb25zdHJ1Y3Rvci4KCSAqICBAcGFyYW0gYXR0cyBBdHRyaWJ1dGVz IChhcnJheSBvZiBuYW1lPT52YWx1ZSBwYWlycykKCSAqICBAcGFyYW0gY29udGVudCBFbGVt ZW50IGNvbnRlbnQgKHN0cmluZywgc29vX2h0bWwgb2JqZWN0LCBvciBhcnJheSB0aGVyZW9m KQoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QgKCAkYXR0cyA9IGFycmF5KCks ICRjb250ZW50ID0gJycgKSB7CgkJJHRoaXMtPmlzX2VtcHR5KGZhbHNlKQoJCQktPmlzX2Js b2NrKHRydWUpCgkJCS0+Y2FuX2NvbnRhaW4oYXJyYXkoJ2NhcHRpb24nLCAnY29sJywgJ2Nv bGdyb3VwJywKCQkJCSd0aGVhZCcsICd0Zm9vdCcsICd0Ym9keScpKTsKCQkJLy8gY2FuIGFs c28gY29udGFpbiB0ciBpZiBvbmx5IG9uZSB0Ym9keSBhbmQgbm8gdGZvb3Qgb3IgdGhlYWQ7 CgkJcGFyZW50OjpfX2NvbnN0cnVjdCggJ3RhYmxlJywgJGF0dHMsICRjb250ZW50ICk7Cgl9 Cn0KCi8vLyBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciAoWClIVE1MIHRhYmxlIGNvbXBvbmVu dHMKYWJzdHJhY3QgY2xhc3Mgc29vX2h0bWxfdGFibGVfY29tcG9uZW50IGV4dGVuZHMgc29v X2h0bWwgewoKCS8vLyBAbmFtZSBDb21tb24gKFgpSFRNTCBhdHRyaWJ1dGVzCgkvL0B7Cglw cm90ZWN0ZWQgJGFsaWduCQkJCT0gJyc7Cglwcm90ZWN0ZWQgJGNoYXIJCQkJCT0gJyc7Cglw cm90ZWN0ZWQgJGNoYXJvZmYJCQkJPSAnJzsKCXByb3RlY3RlZCAkdmFsaWduCQkJCT0gJyc7 CgkvL0B9CgoJLyoqIENvbnN0cnVjdG9yLgoJICogIEBwYXJhbSBjb21wb25lbnQgKFgpSFRN TCBlbGVtZW50IG5hbWUKCSAqICBAcGFyYW0gYXR0cyBBdHRyaWJ1dGVzIChhcnJheSBvZiBu YW1lPT52YWx1ZSBwYWlycykKCSAqICBAcGFyYW0gY29udGVudCBFbGVtZW50IGNvbnRlbnQg KHN0cmluZywgc29vX2h0bWwgb2JqZWN0LCBvciBhcnJheSB0aGVyZW9mKQoJICovCglwdWJs aWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QgKCAkY29tcG9uZW50LCAkYXR0cyA9IGFycmF5KCks ICRjb250ZW50ID0gJycgKSB7CgkJJHRoaXMtPmlzX2VtcHR5KGZhbHNlKS0+aXNfYmxvY2so dHJ1ZSk7CgkJcGFyZW50OjpfX2NvbnN0cnVjdCggJGNvbXBvbmVudCwgJGF0dHMsICRjb250 ZW50ICk7Cgl9Cn0KCi8vLyBDbGFzcyBmb3IgKFgpSFRNTCB0aGVhZCBlbGVtZW50cwpjbGFz cyBzb29faHRtbF90aGVhZCBleHRlbmRzIHNvb19odG1sX3RhYmxlX2NvbXBvbmVudCB7CgoJ LyoqIENvbnN0cnVjdG9yLgoJICogIEBwYXJhbSBhdHRzIEF0dHJpYnV0ZXMgKGFycmF5IG9m IG5hbWU9PnZhbHVlIHBhaXJzKQoJICogIEBwYXJhbSBjb250ZW50IEVsZW1lbnQgY29udGVu dCAoc3RyaW5nLCBzb29faHRtbCBvYmplY3QsIG9yIGFycmF5IHRoZXJlb2YpCgkgKi8KCXB1 YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCAoICRhdHRzID0gYXJyYXkoKSwgJGNvbnRlbnQg PSAnJyApIHsKCQkkdGhpcy0+Y2FuX2NvbnRhaW4oYXJyYXkoJ3RyJykpOwoJCXBhcmVudDo6 X19jb25zdHJ1Y3QoICd0aGVhZCcsICRhdHRzLCAkY29udGVudCApOwoJfQp9CgovLy8gQ2xh c3MgZm9yIChYKUhUTUwgdGJvZHkgZWxlbWVudHMKY2xhc3Mgc29vX2h0bWxfdGJvZHkgZXh0 ZW5kcyBzb29faHRtbF90YWJsZV9jb21wb25lbnQgewoKCS8qKiBDb25zdHJ1Y3Rvci4KCSAq ICBAcGFyYW0gYXR0cyBBdHRyaWJ1dGVzIChhcnJheSBvZiBuYW1lPT52YWx1ZSBwYWlycykK CSAqICBAcGFyYW0gY29udGVudCBFbGVtZW50IGNvbnRlbnQgKHN0cmluZywgc29vX2h0bWwg b2JqZWN0LCBvciBhcnJheSB0aGVyZW9mKQoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25z dHJ1Y3QgKCAkYXR0cyA9IGFycmF5KCksICRjb250ZW50ID0gJycgKSB7CgkJJHRoaXMtPmNh bl9jb250YWluKGFycmF5KCd0cicpKTsKCQlwYXJlbnQ6Ol9fY29uc3RydWN0KCAndGJvZHkn LCAkYXR0cywgJGNvbnRlbnQgKTsKCX0KfQoKLy8vIENsYXNzIGZvciAoWClIVE1MIHRmb290 IGVsZW1lbnRzCmNsYXNzIHNvb19odG1sX3Rmb290IGV4dGVuZHMgc29vX2h0bWxfdGFibGVf Y29tcG9uZW50IHsKCgkvKiogQ29uc3RydWN0b3IuCgkgKiAgQHBhcmFtIGF0dHMgQXR0cmli dXRlcyAoYXJyYXkgb2YgbmFtZT0+dmFsdWUgcGFpcnMpCgkgKiAgQHBhcmFtIGNvbnRlbnQg RWxlbWVudCBjb250ZW50IChzdHJpbmcsIHNvb19odG1sIG9iamVjdCwgb3IgYXJyYXkgdGhl cmVvZikKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0ICggJGF0dHMgPSBhcnJh eSgpLCAkY29udGVudCA9ICcnICkgewoJCSR0aGlzLT5jYW5fY29udGFpbihhcnJheSgndHIn KSk7CgkJcGFyZW50OjpfX2NvbnN0cnVjdCggJ3Rmb290JywgJGF0dHMsICRjb250ZW50ICk7 Cgl9Cn0KCi8vLyBDbGFzcyBmb3IgKFgpSFRNTCB0ciBlbGVtZW50cwpjbGFzcyBzb29faHRt bF90ciBleHRlbmRzIHNvb19odG1sX3RhYmxlX2NvbXBvbmVudCB7CgoJLyoqIENvbnN0cnVj dG9yLgoJICogIEBwYXJhbSBhdHRzIEF0dHJpYnV0ZXMgKGFycmF5IG9mIG5hbWU9PnZhbHVl IHBhaXJzKQoJICogIEBwYXJhbSBjb250ZW50IEVsZW1lbnQgY29udGVudCAoc3RyaW5nLCBz b29faHRtbCBvYmplY3QsIG9yIGFycmF5IHRoZXJlb2YpCgkgKi8KCXB1YmxpYyBmdW5jdGlv biBfX2NvbnN0cnVjdCAoICRhdHRzID0gYXJyYXkoKSwgJGNvbnRlbnQgPSAnJyApIHsKCQkk dGhpcy0+Y2FuX2NvbnRhaW4oYXJyYXkoJ3RoJywgJ3RkJykpOwoJCXBhcmVudDo6X19jb25z dHJ1Y3QoICd0cicsICRhdHRzLCAkY29udGVudCApOwoJfQp9CgovLy8gQWJzdHJhY3QgYmFz ZSBjbGFzcyBmb3IgKFgpSFRNTCB0YWJsZSBjZWxscwphYnN0cmFjdCBjbGFzcyBzb29faHRt bF90YWJsZV9jZWxsIGV4dGVuZHMgc29vX2h0bWxfdGFibGVfY29tcG9uZW50IHsKCgkvLy8g QG5hbWUgQ29tbW9uIChYKUhUTUwgYXR0cmlidXRlcwoJLy9AewoJcHJvdGVjdGVkICRyb3dz cGFuCQkJPSAnJzsKCXByb3RlY3RlZCAkY29sc3BhbgkJCT0gJyc7Cglwcm90ZWN0ZWQgJGhl YWRlcnMJCQk9ICcnOwoJcHJvdGVjdGVkICRhYmJyCQkJCT0gJyc7Cglwcm90ZWN0ZWQgJHNj b3BlCQkJPSAnJzsKCXByb3RlY3RlZCAkYXhpcwkJCQk9ICcnOwoJLy9AfQoKCS8qKiBDb25z dHJ1Y3Rvci4KCSAqICBAcGFyYW0gY2VsbF90eXBlIEVsZW1lbnQgbmFtZSAodGQsIHRoKQoJ ICogIEBwYXJhbSBhdHRzIEF0dHJpYnV0ZXMgKGFycmF5IG9mIG5hbWU9PnZhbHVlIHBhaXJz KQoJICogIEBwYXJhbSBjb250ZW50IEVsZW1lbnQgY29udGVudCAoc3RyaW5nLCBzb29faHRt bCBvYmplY3QsIG9yIGFycmF5IHRoZXJlb2YpCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2Nv bnN0cnVjdCAoICRjZWxsX3R5cGUsICRhdHRzID0gYXJyYXkoKSwgJGNvbnRlbnQgPSAnJyAp IHsKCgkJcGFyZW50OjpfX2NvbnN0cnVjdCggJGNlbGxfdHlwZSwgJGF0dHMsICRjb250ZW50 ICk7Ci8vIAkJJHRoaXMtPmNhbl9jb250YWluKGFycmF5KCdjYXB0aW9uJywgJ2NvbCcsICdj b2xncm91cCcsCi8vIAkJCQkndGhlYWQnLCAndGZvb3QnLCAndGJvZHknKSk7Cgl9Cn0KCi8v LyBDbGFzcyBmb3IgKFgpSFRNTCB0aCBlbGVtZW50cwpjbGFzcyBzb29faHRtbF90aCBleHRl bmRzIHNvb19odG1sX3RhYmxlX2NlbGwgewoKCS8qKiBDb25zdHJ1Y3Rvci4KCSAqICBAcGFy YW0gYXR0cyBBdHRyaWJ1dGVzIChhcnJheSBvZiBuYW1lPT52YWx1ZSBwYWlycykKCSAqICBA cGFyYW0gY29udGVudCBFbGVtZW50IGNvbnRlbnQgKHN0cmluZywgc29vX2h0bWwgb2JqZWN0 LCBvciBhcnJheSB0aGVyZW9mKQoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qg KCAkYXR0cyA9IGFycmF5KCksICRjb250ZW50ID0gJycgKSB7CgkJcGFyZW50OjpfX2NvbnN0 cnVjdCggJ3RoJywgJGF0dHMsICRjb250ZW50ICk7Cgl9Cn0KCi8vLyBDbGFzcyBmb3IgKFgp SFRNTCB0ZCBlbGVtZW50cwpjbGFzcyBzb29faHRtbF90ZCBleHRlbmRzIHNvb19odG1sX3Rh YmxlX2NlbGwgewoKCS8qKiBDb25zdHJ1Y3Rvci4KCSAqICBAcGFyYW0gYXR0cyBBdHRyaWJ1 dGVzIChhcnJheSBvZiBuYW1lPT52YWx1ZSBwYWlycykKCSAqICBAcGFyYW0gY29udGVudCBF bGVtZW50IGNvbnRlbnQgKHN0cmluZywgc29vX2h0bWwgb2JqZWN0LCBvciBhcnJheSB0aGVy ZW9mKQoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QgKCAkYXR0cyA9IGFycmF5 KCksICRjb250ZW50ID0gJycgKSB7CgkJcGFyZW50OjpfX2NvbnN0cnVjdCggJ3RkJywgJGF0 dHMsICRjb250ZW50ICk7Cgl9Cgp9CgovLy8gQ2xhc3MgZm9yIChYKUhUTUwgb2wgZWxlbWVu dHMKY2xhc3Mgc29vX2h0bWxfb2wgZXh0ZW5kcyBzb29faHRtbCB7CgoJLyoqIENvbnN0cnVj dG9yLgoJICogIEBwYXJhbSBhdHRzIEF0dHJpYnV0ZXMgKGFycmF5IG9mIG5hbWU9PnZhbHVl IHBhaXJzKQoJICogIEBwYXJhbSBjb250ZW50IEVsZW1lbnQgY29udGVudCAoc3RyaW5nLCBz b29faHRtbCBvYmplY3QsIG9yIGFycmF5IHRoZXJlb2YpCgkgKi8KCXB1YmxpYyBmdW5jdGlv biBfX2NvbnN0cnVjdCAoICRhdHRzID0gYXJyYXkoKSwgJGNvbnRlbnQgPSAnJyApIHsKCQkk dGhpcy0+aXNfZW1wdHkoZmFsc2UpCgkJCS0+aXNfYmxvY2sodHJ1ZSk7CgkJCS8vLT5jYW5f Y29udGFpbihhcnJheSgnbGknKSk7CgkJcGFyZW50OjpfX2NvbnN0cnVjdCggJ29sJywgJGF0 dHMsICRjb250ZW50ICk7Cgl9Cn0KCi8vLyBDbGFzcyBmb3IgKFgpSFRNTCB1bCBlbGVtZW50 cwpjbGFzcyBzb29faHRtbF91bCBleHRlbmRzIHNvb19odG1sIHsKCgkvKiogQ29uc3RydWN0 b3IuCgkgKiAgQHBhcmFtIGF0dHMgQXR0cmlidXRlcyAoYXJyYXkgb2YgbmFtZT0+dmFsdWUg cGFpcnMpCgkgKiAgQHBhcmFtIGNvbnRlbnQgRWxlbWVudCBjb250ZW50IChzdHJpbmcsIHNv b19odG1sIG9iamVjdCwgb3IgYXJyYXkgdGhlcmVvZikKCSAqLwoJcHVibGljIGZ1bmN0aW9u IF9fY29uc3RydWN0ICggJGF0dHMgPSBhcnJheSgpLCAkY29udGVudCA9ICcnICkgewoJCSR0 aGlzLT5pc19lbXB0eShmYWxzZSkKCQkJLT5pc19ibG9jayh0cnVlKTsKCQkJLy8tPmNhbl9j b250YWluKGFycmF5KCdsaScpKTsKCQlwYXJlbnQ6Ol9fY29uc3RydWN0KCAndWwnLCAkYXR0 cywgJGNvbnRlbnQgKTsKCX0KfQoKLy8vIENsYXNzIGZvciAoWClIVE1MIGxpIGVsZW1lbnRz CmNsYXNzIHNvb19odG1sX2xpIGV4dGVuZHMgc29vX2h0bWwgewoKCS8qKiBDb25zdHJ1Y3Rv ci4KCSAqICBAcGFyYW0gYXR0cyBBdHRyaWJ1dGVzIChhcnJheSBvZiBuYW1lPT52YWx1ZSBw YWlycykKCSAqICBAcGFyYW0gY29udGVudCBFbGVtZW50IGNvbnRlbnQgKHN0cmluZywgc29v X2h0bWwgb2JqZWN0LCBvciBhcnJheSB0aGVyZW9mKQoJICovCglwdWJsaWMgZnVuY3Rpb24g X19jb25zdHJ1Y3QgKCAkYXR0cyA9IGFycmF5KCksICRjb250ZW50ID0gJycgKSB7CgkJJHRo aXMtPmlzX2VtcHR5KGZhbHNlKS0+aXNfYmxvY2sodHJ1ZSk7CgkJcGFyZW50OjpfX2NvbnN0 cnVjdCgnbGknLCAkYXR0cywgJGNvbnRlbnQpOwoJfQp9CgovLy8gQ2xhc3MgZm9yIChYKUhU TUwgc3BhbiBlbGVtZW50cwpjbGFzcyBzb29faHRtbF9zcGFuIGV4dGVuZHMgc29vX2h0bWwg ewoKCS8qKiBDb25zdHJ1Y3Rvci4KCSAqICBAcGFyYW0gYXR0cyBBdHRyaWJ1dGVzIChhcnJh eSBvZiBuYW1lPT52YWx1ZSBwYWlycykKCSAqICBAcGFyYW0gY29udGVudCBFbGVtZW50IGNv bnRlbnQgKHN0cmluZywgc29vX2h0bWwgb2JqZWN0LCBvciBhcnJheSB0aGVyZW9mKQoJICov CglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QgKCAkYXR0cyA9IGFycmF5KCksICRjb250 ZW50ID0gJycgKSB7CgkJJHRoaXMtPmlzX2VtcHR5KGZhbHNlKS0+aXNfYmxvY2soZmFsc2Up OwoJCXBhcmVudDo6X19jb25zdHJ1Y3QoJ3NwYW4nLCAkYXR0cywgJGNvbnRlbnQpOwoJfQp9 CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBNTFAgUGFjayBjb21wYXRpYmlsaXR5IC8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIE1MUCBQYWNrIG1hbmlwdWxhdGVzICRfU0VSVkVS WydSRVFVRVNUX1VSSSddLCBzbyBncmFiIGl0IGZpcnN0CgpnbG9iYWwgJHBsdWdpbl9jYWxs YmFjazsKaWYoIGlzX2FycmF5KCRwbHVnaW5fY2FsbGJhY2spCglhbmQgJHBsdWdpbl9jYWxs YmFja1swXVsnZnVuY3Rpb24nXSA9PSAnX2wxMG5fcHJldGV4dCcgKQoJCWFycmF5X3Vuc2hp ZnQoJHBsdWdpbl9jYWxsYmFjaywgYXJyYXkoCgkJCSdmdW5jdGlvbicJPT4JJ3Nvb191cmlf bWxwJywKCQkJJ2V2ZW50JwkJPT4JJ3ByZXRleHQnLAoJCQknc3RlcCcJCT0+CScnLAoJCQkn cHJlJwkJPT4JMCApCgkJKTsKCmZ1bmN0aW9uIHNvb191cmlfbWxwKCkgewoJZ2xvYmFsICRz b29fcmVxdWVzdF91cmk7Cgkkc29vX3JlcXVlc3RfdXJpID0gICRfU0VSVkVSWydSRVFVRVNU X1VSSSddOwp9Ci8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIGVuZCBNTFAgUGFjayBjb21wYXRp YmlsaXR5IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCgovLy8gQ2xhc3MgZm9yIFVSSSBxdWVy eSBzdHJpbmcgbWFuaXB1bGF0aW9uCmNsYXNzIHNvb191cmkgZXh0ZW5kcyBzb29fb2JqIHsK CgkvLy8gRnVsbCBVUkkKCXByb3RlY3RlZCAkZnVsbDsKCgkvLy8gJF9TRVJWRVJbJ1JFUVVF U1RfVVJJJ10gdmFsdWUKCXByb3RlY3RlZCAkcmVxdWVzdF91cmk7CgoJLy8vICRfU0VSVkVS WydRVUVSWV9TVFJJTkcnXSB2YWx1ZQoJcHJvdGVjdGVkICRxdWVyeV9zdHJpbmc7CgoJLy8v IFVSSSBxdWVyeSBwYXJhbWV0ZXJzCglwcm90ZWN0ZWQgJHF1ZXJ5X3BhcmFtczsKCgkvKiog Q29uc3RydWN0b3IuCgkgKiAgRXh0cmFjdCBSRVFVRVNUX1VSSSBhbmQgUVVFUllfU1RSSU5H IGZyb20gJF9TRVJWRVIsCgkgKiAgYW5kIHBhcnNlIGludG8gcXVlcnkgcGFyYW1zIGFuZCBm dWxsIFVSSS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0ICggKSB7CgkJZ2xv YmFsICRzb29fcmVxdWVzdF91cmk7CS8vIE1MUCBQYWNrIGNvbXBhdGliaWxpdHkKCQkkdGhp cy0+cmVxdWVzdF91cmkgPSAkc29vX3JlcXVlc3RfdXJpID8gJHNvb19yZXF1ZXN0X3VyaSA6 CgkJCSRfU0VSVkVSWydSRVFVRVNUX1VSSSddOwoJCSR0aGlzLT5xdWVyeV9zdHJpbmcgPSAk X1NFUlZFUlsnUVVFUllfU1RSSU5HJ107CgkJJHRoaXMtPmZ1bGwgPSBwcmVnX3JlcGxhY2Uo Jy9cLyQvJywgJycsIGh1KSAuICR0aGlzLT5yZXF1ZXN0X3VyaSgpOwoJCXBhcnNlX3N0cigk dGhpcy0+cXVlcnlfc3RyaW5nLCAkdGhpcy0+cXVlcnlfcGFyYW1zKTsKCX0KCgkvLy8gT3Zl cnJpZGUgcGFyZW50IG1ldGhvZCB0byBwcmV2ZW50IGRpcmVjdCBwcm9wZXJ0eSBtYW5pcHVs YXRpb24KCSAJcHVibGljIGZ1bmN0aW9uIF9fY2FsbCggJHJlcXVlc3QsICRhcmdzICkgewoJ CXJldHVybiBmYWxzZTsKCX0KCgkvKiogQWRkLCByZW1vdmUsIG9yIHVwZGF0ZSBhIHF1ZXJ5 IHBhcmFtZXRlcgoJICogIFRoZW4gcnVuIHVwZGF0ZV9mcm9tX3BhcmFtcygpIHRvIHVwZGF0 ZSAkcXVlcnlfc3RyaW5nIGFuZAoJICogICRyZXF1ZXN0X3VyaSAoYW5kIHRoZSBjb3JyZXNw b25kaW5nICRfU0VSVkVSIHZhbHVlcykgYWNjb3JkaW5nbHkKCSAqICBAcGFyYW0gbmFtZSBQ YXJhbWV0ZXIgbmFtZQoJICogIEBwYXJhbSB2YWx1ZSBQYXJhbWV0ZXIgdmFsdWUKCSAqLwoJ cHVibGljIGZ1bmN0aW9uIHNldF9xdWVyeV9wYXJhbSAoICRuYW1lLCAkdmFsdWUgPSBudWxs ICkgewoJCWlmICggaXNfbnVsbCgkdmFsdWUpICkKCQkJdW5zZXQoJHRoaXMtPnF1ZXJ5X3Bh cmFtc1skbmFtZV0pOwoJCWVsc2UKCQkJJHRoaXMtPnF1ZXJ5X3BhcmFtc1skbmFtZV0gPSAk dmFsdWU7CgkJJHRoaXMtPnVwZGF0ZV9mcm9tX3BhcmFtcygpOwoJCXJldHVybiAkdGhpczsK CX0KCgkvKiogUmVidWlsZCAkcXVlcnlfc3RyaW5nIGFuZCAkcmVxdWVzdF91cmkgKGFuZCB0 aGUgY29ycmVzcG9uZGluZwoJICogICRfU0VSVkVSIHZhbHVlcykgYmFzZWQgb24gdGhlIGN1 cnJlbnQgJHBhcmFtcyBhcnJheQoJICovCglwcml2YXRlIGZ1bmN0aW9uIHVwZGF0ZV9mcm9t X3BhcmFtcyAoICkgewoJCSR0aGlzLT5xdWVyeV9zdHJpbmcgPSBodHRwX2J1aWxkX3F1ZXJ5 KCR0aGlzLT5xdWVyeV9wYXJhbXMpOwoJCSR0aGlzLT5yZXF1ZXN0X3VyaSA9IHNlbGY6OnN0 cmlwX3F1ZXJ5KCR0aGlzLT5yZXF1ZXN0X3VyaSkgLgoJCQkoICR0aGlzLT5xdWVyeV9zdHJp bmcgPyAnPycgLiAkdGhpcy0+cXVlcnlfc3RyaW5nIDogJycgKTsKCQkkdGhpcy0+ZnVsbCA9 IHByZWdfcmVwbGFjZSgnL1wvJC8nLCAnJywgaHUpIC4gJHRoaXMtPnJlcXVlc3RfdXJpKCk7 CgkJJF9TRVJWRVJbJ1FVRVJZX1NUUklORyddID0gJHRoaXMtPnF1ZXJ5X3N0cmluZzsKCQkk X1NFUlZFUlsnUkVRVUVTVF9VUkknXSA9ICR0aGlzLT5yZXF1ZXN0X3VyaTsKCX0KCgkvKiog UmVtb3ZlIHRoZSBxdWVyeSBzdHJpbmcgZnJvbSBhIFVSSQoJICogIEByZXR1cm4gc3RyaW5n CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzdHJpcF9xdWVyeSAoICR1cmkgKSB7CgkJcmV0dXJu IHByZWdfcmVwbGFjZSAoJy8oLispXD8uKy8nLCAnJDEnLCAkdXJpKTsKCX0KCgkvKiogUmV0 dXJuIHRoZSAkcmVxdWVzdF91cmkgYWZ0ZXIgc3RyaXBwaW5nIGFueSBzdWJkaXIKCSAqICAo Zm9yIFR4cCBzdWJkaXIgaW5zdGFsbGF0aW9ucykKCSAqICBAcmV0dXJuIHN0cmluZwoJICov Cglwcml2YXRlIGZ1bmN0aW9uIHJlcXVlc3RfdXJpICggKSB7CgkJaWYgKCBwcmVnX21hdGNo KCcmOi8vW14vXSsoLy4rKS8kJicsIGh1LCAkbWF0Y2gpICkgewoJCQkkc3ViX2RpciA9ICRt YXRjaFsxXTsKCQkJcmV0dXJuIHN1YnN0cigkdGhpcy0+cmVxdWVzdF91cmksIHN0cmxlbigk c3ViX2RpcikpOwoJCX0KCQlyZXR1cm4gJHRoaXMtPnJlcXVlc3RfdXJpOwoJfQoKfQoKLy8v IENsYXNzIGZvciBzdGF0aWMgdXRpbGl0eSBtZXRob2RzCmNsYXNzIHNvb191dGlsIHsKCgkv KiogQnVpbGQgYSBUeHAgdGFnLgoJICogIEBwYXJhbSBmdW5jIFR4cCB0YWcgbmFtZSAoZS5n LiAnYXJ0aWNsZV9jdXN0b20nKQoJICogIEBwYXJhbSBhdHRzIFRhZyBhdHRyaWJ1dGVzCgkg KiAgQHBhcmFtIHRoaW5nIFRhZyBjb250ZW50cwoJICogIEByZXR1cm4gc3RyaW5nIFR4cCB0 YWcKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiB0eHBfdGFnICggJGZ1bmMsICRhdHRz ID0gYXJyYXkoKSwgJHRoaW5nID0gbnVsbCApIHsKCQkkYSA9ICcnOwoJCWZvcmVhY2ggKCAk YXR0cyBhcyAkayA9PiAkdiApCgkJCSRhIC49ICIgJGs9XCIkdlwiIjsKCQlyZXR1cm4gIjx0 eHA6JGZ1bmMkYSIgLiAoIGlzX251bGwoJHRoaW5nKSA/ICcgLz4nIDogIj4kdGhpbmc8L3R4 cDokZnVuYz4iICk7Cgl9CgoJLyoqIFJldHVybiBhIFR4cCB0YWcgc3RyaW5nLCBpZiBpdCdz IHN0aWxsIHRoZSBmaXJzdCBwYXJzZSgpIHBhc3MuCgkgKiAgQWxsb3dzIHBsYWNpbmcgYSB0 YWcgd2l0aCBkZXBlbmRlbmNpZXMgYmVmb3JlIGl0cyBhc3NvY2lhdGVkIGNvbnRyb2xsZXIs CgkgKiAgZGVmZXJyaW5nIHBhcnNpbmcgdG8gdGhlIHNlY29uZCBwYXJzZSgpIHBhc3MuCgkg KiAgRS5nLiBwbGFjaW5nIGEgcGFnaW5hdGlvbiB0YWcgYmVmb3JlIGl0cyBhc3NvY2lhdGVk IGFydGljbGUgdGFnLgoJICogIEBwYXJhbSBmdW5jIFR4cCB0YWcgbmFtZSAoZS5nLiAnYXJ0 aWNsZV9jdXN0b20nKQoJICogIEBwYXJhbSBhdHRzIFRhZyBhdHRyaWJ1dGVzCgkgKiAgQHBh cmFtIHRoaW5nIFRhZyBjb250ZW50cwoJICogIEByZXR1cm4gc3RyaW5nIFR4cCB0YWcKCSAq LwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZWNvbmRwYXNzICggJGZ1bmMsICRhdHRzID0g YXJyYXkoKSwgJHRoaW5nID0gbnVsbCApIHsKCQlnbG9iYWwgJHByZXRleHQ7CgkJaWYgKCAk cHJldGV4dFsnc2Vjb25kcGFzcyddICkgcmV0dXJuOyAvLyB5b3Ugb25seSBsaXZlIHR3aWNl CgkJcmV0dXJuIHNlbGY6OnR4cF90YWcoJGZ1bmMsICRhdHRzLCAkdGhpbmcpOwoJfQoKfQoi O3M6NDoidHlwZSI7czoxOiIyIjtzOjU6ImZsYWdzIjtzOjE6IjAiO3M6NToib3JkZXIiO3M6 MToiNSI7czozOiJtZDUiO3M6MzI6ImFlZDgxMzEwZDQzYzI2MTg3Y2YzOGExZjg4ZmYwMGVj Ijt9