# Name: smd_lib v0.36 # Type: Library plugin # Shared function library used by smd_ plugins and others. # Author: Stef Dawson # URL: http://stefdawson.com/ # Recommended load order: 5 # ..................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ..................................................................... YToxMTp7czo0OiJuYW1lIjtzOjc6InNtZF9saWIiO3M6NjoiYXV0aG9yIjtzOjExOiJTdGVm IERhd3NvbiI7czoxMDoiYXV0aG9yX3VyaSI7czoyMjoiaHR0cDovL3N0ZWZkYXdzb24uY29t LyI7czo3OiJ2ZXJzaW9uIjtzOjQ6IjAuMzYiO3M6MTE6ImRlc2NyaXB0aW9uIjtzOjU2OiJT aGFyZWQgZnVuY3Rpb24gbGlicmFyeSB1c2VkIGJ5IHNtZF8gcGx1Z2lucyBhbmQgb3RoZXJz LiI7czo0OiJoZWxwIjtzOjExMTY4OiI8ZGl2IGlkPSJzbWRfaGVscCI+DQoNCgk8aDE+c21k XyBwbHVnaW4gbGlicmFyeTwvaDE+DQoNCgk8cD5PZmZlcnMgbm8gcHVibGljIHRleHRwYXR0 ZXJuIHRhZ3MuIEl0IGlzIHNpbXBseSBhIHNoYXJlZCBsaWJyYXJ5IG9mIGNvbW1vbiBmdW5j dGlvbnMgdXNlZCBieSBzbWRfIHBsdWdpbnMuPC9wPg0KDQoJPGgyPkNoYW5nZWxvZzwvaDI+ DQoNCgk8dWw+DQoJCTxsaT52MC4xICAgMDctMDItMjUgSW5pdGlhbCBwdWJsaWMgcmVsZWFz ZTwvbGk+DQoJCTxsaT52MC4yICAgMDctMDMtMDMgQWRkZWQ6IDxzcGFuIGNsYXNzPSJjYXBz Ij48c3BhbiBjbGFzcz0iY2FwcyI+TUxQPC9zcGFuPjwvc3Bhbj4gKE11bHRpLUxpbmd1YWwg UGFjaykgbGlicmFyeSBzdXBwb3J0PC9saT4NCgkJPGxpPnYwLjIxICAwNy0wMy0wNiBBZGRl ZDogaW50ZWdlciByYW5nZSBmdW5jdGlvbmFsaXR5LiA8Y29kZT5zbWRfZ2V0QXR0czwvY29k ZT4gbm93IHRha2VzIGEgUmVnRXggYXJnPC9saT4NCgkJPGxpPnYwLjIxYSAwNy0wMy0yMSBG aXhlZDogQ2hhcmFjdGVyIHJhbmdlcyBpZ25vcmVkICh0aGFua3MgbXJkYWxlKTwvbGk+DQoJ CTxsaT52MC4yMWIgMDctMDQtMDIgRml4ZWQ6IFN0aWNreSBhcnRpY2xlIHN1cHBvcnQgaW4g PGNvZGU+c21kX2dldEF0dHM8L2NvZGU+ICh0aGFua3MgcGllbWFuKTwvbGk+DQoJCTxsaT52 MC4yMWMgMDctMDctMjkgRml4ZWQ6IE51bWVyaWMgcmFuZ2VzIGluIGNhdGVnb3JpZXMgKHRo YW5rcyB3b2xsZSk8L2xpPg0KCQk8bGk+djAuMjFkIDA3LTA4LTAzIEZpeGVkOiBOZWdhdGlv biB3aXRoIG11bHRpcGxlIGVsZW1lbnRzPC9saT4NCgkJPGxpPnYwLjIxZSAwNy0wOS0xNCBG aXhlZDogQWJpbGl0eSB0byBsZWF2ZSBlbXB0eSBzcGxpdFJhbmdlIHBhcmFtZXRlcnMgaW50 YWN0PC9saT4NCgkJPGxpPnYwLjIyICAwNy0wOS0yMCBGaXhlZDogVW5kZWZpbmVkIGluZGV4 IHdhcm5pbmdzICh0aGFua3MgQW1iaXRpb3VzbGVtb24pLiBFbmhhbmNlZCBtYXRjaGVzIHNv IHNwYWNlcyBhcmUgYWxsb3dlZCBpbiBzdHJpbmdzICh0aGFua3MgRHJSb2dnKTwvbGk+DQoJ CTxsaT52MC4yMyAgMDctMDQtMDkgPHNwYW4gY2xhc3M9ImNhcHMiPkJFVEE8L3NwYW4+IDog QWRkZWQgdGhlIEZ1enp5RmluZCBjbGFzcyBhbmQgZ2V0V29yZCBmdW5jdGlvbi4gZ2V0QXR0 cygpIG5vdyBhbGxvd3MgPGNvZGU+P3E8L2NvZGU+PC9saT4NCgkJPGxpPnYwLjMgICAwNy0x MC0yOSBSZXdyb3RlIDxjb2RlPnNtZF9nZXRBdHRzPC9jb2RlPiBhcyA8Y29kZT5zbWRfZ2V0 T3B0czwvY29kZT4gdG8gYWxsb3cgcmVwbGFjZWQgdmFycyB3aXRoaW4gdGV4dC4gRGVwcmVj YXRlZCA8Y29kZT5zbWRfZ2V0QXR0czwvY29kZT4sIGFkZGVkIDxjb2RlPnNtZF9wcmVnUG9z PC9jb2RlPi4gQ2hhbmdlZCA8Y29kZT5zbWRfc3BsaXRSYW5nZTwvY29kZT4gYXMgPGNvZGU+ c21kX3NwbGl0PC9jb2RlPiB0byBhbGxvdyByYW5nZXMgdG8gYmUgc3dpdGNoZWQgb24gb3Ig b2ZmLiBEZXByZWNhdGVkIDxjb2RlPnNtZF9zcGxpdFJhbmdlPC9jb2RlPi4gQWRkZWQgZ2Vu ZXJpYyA8c3BhbiBjbGFzcz0iY2FwcyI+TUxQPC9zcGFuPiBjbGFzcyBzdXBwb3J0ICg8Y29k ZT5zbWRfTUxQPC9jb2RlPikuIERlcHJlY2F0ZWQgPGNvZGU+c21kTUxQPC9jb2RlPiBhcnJh eSwgPGNvZGU+c21kX2dUeHQ8L2NvZGU+IGFuZCA8Y29kZT5zbWRfZ2V0Q2FsbGVyPC9jb2Rl Pi4gTWFkZSA8Y29kZT5zbWRfRnV6enlGaW5kPC9jb2RlPiBhbmQgPGNvZGU+c21kX2dldFdv cmQ8L2NvZGU+IG9mZmljaWFsPC9saT4NCgkJPGxpPnYwLjMxICAwNy0xMS0yNyBSZW1vdmVk IDxjb2RlPnNtZE1MUDwvY29kZT4gYXJyYXksIDxjb2RlPnNtZF9nVHh0PC9jb2RlPiBhbmQg PGNvZGU+c21kX2dldENhbGxlcjwvY29kZT4uIERlcHJlY2F0ZWQgPGNvZGU+c21kX2dldFN1 YkNhdHM8L2NvZGU+LiBBZGRlZCBhIGZldyBQSFA0IGhlbHBlciBmdW5jdGlvbnM8L2xpPg0K CQk8bGk+djAuMzIgIDA4LTAzLTI5IFJlbW92ZWQgPGNvZGU+c21kX2dldEF0dHM8L2NvZGU+ IGFuZCA8Y29kZT5zbWRfZ2V0U3ViQ2F0czwvY29kZT4uIERlcHJlY2F0ZWQgPGNvZGU+c21k X2dldE9wdHM8L2NvZGU+IGFuZCA8Y29kZT5zbWRfc3BsaXQ8L2NvZGU+LiBBZGRlZCA8Y29k ZT5zbWRfZG9MaXN0PC9jb2RlPi4gTW92ZWQgdGhlIDxjb2RlPnNtZF9GdXp6eUZpbmQ8L2Nv ZGU+IGNsYXNzIGFuZCA8Y29kZT5zbWRfZ2V0V29yZDwvY29kZT4gaW50byB0aGUgc21kX2Z1 enp5X2ZpbmQgcGx1Z2luIHdoZXJlIHRoZXkgc2hvdWxkIGhhdmUgYmVlbiBhbGwgYWxvbmc8 L2xpPg0KCQk8bGk+djAuMzMgIDA4LTEyLTAyIFVuZGVwcmVjYXRlZCghKSA8Y29kZT5zbWRf c3BsaXQ8L2NvZGU+IHNpbmNlIGl0JiM4MjE3O3MgYWN0dWFsbHkgcXVpdGUgdXNlZnVsIDsg ZXh0ZW5kZWQgPGNvZGU+c21kX2RvTGlzdDwvY29kZT4gdG8gZW5jb21wYXNzIDxjb2RlPiR0 aGlzaW1hZ2U8L2NvZGU+IChmb3IgZnV0dXJlKSBhbmQgPGNvZGU+JHZhcmlhYmxlPC9jb2Rl PiA7IGZpeGVkIGJ1ZyBpbiA8Y29kZT5zbWRfZG9MaXN0PC9jb2RlPiB3aGVuIHVzaW5nIHN1 YmNhdHM8L2xpPg0KCQk8bGk+djAuMzQgIDA4LTEyLTEzIDxjb2RlPnNtZF9kb0xpc3Q8L2Nv ZGU+IHVzZXMgYSB1bmljb2RlIHJlZ2V4PC9saT4NCgkJPGxpPnYwLjM1ICAwOS0wMi0yNCA8 Y29kZT5zbWRfZG9MaXN0PC9jb2RlPiBmaXhlZCByYW5nZXMgaW4gJiM4MjE2Oz8mIzgyMTc7 IHZhcmlhYmxlcyAodGhhbmtzIGtvb2JzKTwvbGk+DQoJCTxsaT52MC4zNiAgMDktMDQtMDIg PGNvZGU+c21kX2RvTGlzdDwvY29kZT4gZmFsbHMgYmFjayB0byA8c3BhbiBjbGFzcz0iY2Fw cyI+QVNDSUk8L3NwYW4+IGlmIFVuaWNvZGUgbm90IGF2YWlsYWJsZSAodGhhbmtzIFJlZEZv eCAvIG1sYXJpbm8gLyBkZWNvZGVybHRkKTwvbGk+DQoJPC91bD4NCg0KCTxoMj5GdW5jdGlv biBSZWZlcmVuY2U8L2gyPg0KDQoJPHA+PHN0cm9uZz5zbWRfYWRkUVNWYXI8L3N0cm9uZz48 YnIgLz4NCjxzdHJvbmc+c21kX3JlbW92ZVFTVmFyPC9zdHJvbmc+PC9wPg0KDQoJPHA+QWRk IG9yIHJlbW92ZSBhIHF1ZXJ5IHN0cmluZyB2YXJpYWJsZSB0byB0aGUgZ2l2ZW4gPHNwYW4g Y2xhc3M9ImNhcHMiPlVSTDwvc3Bhbj4sIHRha2luZyBpbnRvIGFjY291bnQgYW55IGV4aXN0 aW5nIHZhcmlhYmxlcyB0aGF0IG1heSBiZSBpbiB0aGUgPHNwYW4gY2xhc3M9ImNhcHMiPlVS TDwvc3Bhbj4gYWxyZWFkeS4gJiM4MjE2O0FkZCYjODIxNzsgdGFrZXMgdGhyZWUgYXJndW1l bnRzLCAmIzgyMTY7UmVtb3ZlJiM4MjE3OyBqdXN0IHRha2VzIHRoZSBmaXJzdCB0d286PC9w Pg0KDQoJPG9sPg0KCQk8bGk+VGhlIDxzcGFuIGNsYXNzPSJjYXBzIj5VUkw8L3NwYW4+IHN0 cmluZyB0byBhZGQgdG8vcmVtb3ZlIGZyb208L2xpPg0KCQk8bGk+VGhlIGlkIG9mIHRoZSBx dWVyeXN0cmluZyAodGhlIGJpdCBiZWZvcmUgdGhlID0gc2lnbik8L2xpPg0KCQk8bGk+VGhl IHZhbHVlIG9mIHRoZSBuZXcgcXVlcnlzdHJpbmcgKHRoZSBiaXQgYWZ0ZXIgdGhlID0gc2ln bik8L2xpPg0KCTwvb2w+DQoNCgk8cD5lLmcuIDxjb2RlPnNtZF9hZGRRU1ZhcigkdGhpc2Fy dGljbGVbJiMzOTt1cmxfdGl0bGUmIzM5O10sICYjMzk7dHBnJiMzOTssIDE1KTs8L2NvZGU+ IHdvdWxkIGFkZCA8Y29kZT50cGc9MTU8L2NvZGU+IHRvIHRoZSBjdXJyZW50IGFydGljbGUm IzgyMTc7cyA8c3BhbiBjbGFzcz0iY2FwcyI+VVJMPC9zcGFuPi4gSWYgdGhlcmUgYXJlIG5v IG90aGVyIHZhcmlhYmxlcyBjdXJyZW50bHkgaW4gdGhlIDxzcGFuIGNsYXNzPSJjYXBzIj5V Ukw8L3NwYW4+LCBpdCBpcyBhZGRlZCB3aXRoIGEgcXVlc3Rpb24gbWFyaywgb3RoZXJ3aXNl IGl0IGlzIGFwcGVuZGVkIHdpdGggYW4gYW1wZXJzYW5kLjwvcD4NCg0KCTxwPjxzdHJvbmc+ c21kX2RvTGlzdDwvc3Ryb25nPjwvcD4NCg0KCTxwPlJldHVybiBhbiBleHBhbmRlZCBsaXN0 IG9mIGl0ZW1zIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOjwvcD4NCg0KCTxvbD4N CgkJPGxpPkFueXRoaW5nIGNvbnRhaW5pbmcgJiM4MjE2Oz8mIzgyMTc7IG9yICYjODIxNjsh JiM4MjE3OyBpcyBjaGVja2VkIGZvciBhIG1hdGNoIHdpdGggYSA8c3BhbiBjbGFzcz0iY2Fw cyI+VFhQPC9zcGFuPiBmaWVsZCAoPGNvZGU+Jmx0O3R4cDp2YXJpYWJsZSAvJmd0OzwvY29k ZT4sIGltYWdlLCBmaWxlLCBsaW5rLCBnbG9iYWwgYXJ0aWNsZSwgdXJsIDxzcGFuIGNsYXNz PSJjYXBzIj5QT1NUPC9zcGFuPi9HRVQvU0VSVkVSLCBvciBpbmRpdmlkdWFsIGFydGljbGUs IGluIHRoYXQgb3JkZXIpPC9saT4NCgkJPGxpPkFueSByYW5nZXMgb2YgaXRlbXMgYXJlIGV4 cGFuZGVkIChlLmcuIDQtNyA9Jmd0OyA0LDUsNiw3KSBpZiB0aGUgPGNvZGU+cm5nPC9jb2Rl PiBvcHRpb24gcGVybWl0cyBpdDwvbGk+DQoJCTxsaT48c3BhbiBjbGFzcz0iY2FwcyI+VFhQ PC9zcGFuPiBmaWVsZHMgbWF5IHRoZW1zZWx2ZXMgYmUgbGlzdHMgb3IgcmFuZ2VzPC9saT4N CgkJPGxpPkFueXRoaW5nIHRoYXQgaXMgbm90IGEgPHNwYW4gY2xhc3M9ImNhcHMiPlRYUDwv c3Bhbj4gZmllbGQgaXMgdXNlZCB2ZXJiYXRpbTwvbGk+DQoJCTxsaT5UaGUgaXRlbXMgYXJl IHJldHVybmVkIGFzIDIgbGlzdHM7IGluY2x1c2lvbiBhbmQgZXhjbHVzaW9uPC9saT4NCgk8 L29sPg0KDQoJPHA+QXJncyAoIFsqXSA9IG1hbmRhdG9yeSApIDoNCgk8b2w+DQoJCTxsaT5b Kl0gbHN0ID0gdGhlIGxpc3QgYXMgYSBkZWxpbWl0ZWQgc3RyaW5nPC9saT4NCgkJPGxpPnJu ZyA9IHdoZXRoZXIgdG8gYWxsb3cgcmFuZ2VzIG9yIG5vdCAoYm9vbCkuIERlZmF1bHQgPSB0 cnVlPC9saT4NCgkJPGxpPnN1YiA9IHRoZSB0eXBlIG9mIHN1YmNhdGVnb3J5IHRvIHRyYXZl cnNlIChpbWFnZSwgZmlsZSwgbGluaywgYXJ0aWNsZSwgbm9uZT0mIzgyMjE7JiM4MjIwOykg YW5kIGhvdyBtYW55IGxldmVscyB0byBnbyBkb3duIChlLmcuIGltYWdlOjIpLiBEZWZhdWx0 ID0gJiM4MjE2OyYjODIxNzs8L2xpPg0KCQk8bGk+cXRlID0gd2hldGhlciB0byBxdW90ZSBl YWNoIGl0ZW0gaW4gdGhlIGFycmF5IG9yIG5vdCAoYm9vbCkuIERlZmF1bHQgPSB0cnVlPC9s aT4NCgkJPGxpPmRsbSA9IHRoZSBkZWxpbWl0ZXIgKHN0cmluZykuIERlZmF1bHQgPSAmIzgy MjA7LCYjODIyMTs8L2xpPg0KCQk8bGk+bGF4ID0gV2hldGhlciB0byBiZSBsYXggb3Igc3Ry aWN0IGFib3V0IHdoYXQgY2hhcmFjdGVycyBjb25zdGl0dXRlIGEgZmllbGQ7IHByaW1hcmls eSB3aGV0aGVyIHNwYWNlcyBhcmUgYWxsb3dlZCBpbiwgc2F5LCBjdXN0b20gZmllbGRzLiBE ZWZhdWx0ID0gJiM4MjIwOzEmIzgyMjE7PC9saT4NCgk8L29sPjwvcD4NCg0KCTxwPjxzdHJv bmc+c21kX2dldE9wdHM8L3N0cm9uZz48L3A+DQoNCgk8cD5EZXByZWNhdGVkIGFzIGl0IGlz IG1vc3RseSBzdXBlcnNlZGVkIGJ5IHNtZF9kb0xpc3Q7IHRoaXMgb25lIGlzIGNsdW5raWVy IGJ1dCBoYXMgJGlkcHJlZml4IHNvIGl0IHJlbWFpbnMgZm9yIG5vdy4gSXQgc2VhcmNoZXMg dGhlIHBhc3NlZCBzdHJpbmcgZm9yIHByZWRldGVybWluZWQgc2VxdWVuY2VzIG9mIGNoYXJh Y3RlcnMgYW5kLCBpZiB0aGF0IHNlcXVlbmNlIGlzIGluIHRoZSBnaXZlbiAkYWxsb3dlZCBh cnJheSwgcmVwbGFjZXMgaXQgYXMgZm9sbG93czo8L3A+DQoNCgk8dWw+DQoJCTxsaT4/YyA9 IGN1cnJlbnQgZ2xvYmFsIGNhdGVnb3J5ICghYyA9IG5vdCBjdXJyZW50IGNhdGVnb3J5KTwv bGk+DQoJCTxsaT4/cyA9IGN1cnJlbnQgc2VjdGlvbiAoIXMgPSBub3QgY3VycmVudCBzZWN0 aW9uKTwvbGk+DQoJCTxsaT4/dCA9IGN1cnJlbnQgYXJ0aWNsZSB0aXRsZSAoIXQgPSBub3Qg Y3VycmVudCB0aXRsZSk8L2xpPg0KCQk8bGk+P2lkID0gY3VycmVudCBhcnRpY2xlIElELCBw cmVwZW5kZWQgd2l0aCAkaWRwcmVmaXggKCFpZCA9IG5vdCBjdXJyZW50IElEKTwvbGk+DQoJ CTxsaT4/cSA9IGN1cnJlbnQgcXVlcnkgdGVybSAoIXEgPSBub3QgY3VycmVudCBxdWVyeSB0 ZXJtKTwvbGk+DQoJCTxsaT4/ZmllbGQgPSBjb250ZW50cyBvZiB0aGUgY3VycmVudCBhcnRp Y2xlJiM4MjE3O3MgZmllbGQgKGNvdWxkIGJlIGEgY29tbWEtc2VwYXJhdGVkIGxpc3QpPC9s aT4NCgkJPGxpPiFmaWVsZCA9IG5vdCB0aGUgY29udGVudHMgb2YgdGhlIGN1cnJlbnQgYXJ0 aWNsZSYjODIxNztzIGZpZWxkIChjb3VsZCBiZSBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0KTwv bGk+DQoJPC91bD4NCg0KCTxwPkludGVnZXIgcmFuZ2VzIChlLmcuIDEtNSkgd2lsbCBiZSBl eHBhbmRlZCBpbnRvIHRoZWlyIGluZGl2aWR1YWwgdmFsdWVzIGlmIHRoZSAkYWxsb3dSYW5n ZSBvcHRpb24gaXMgdHJ1ZTsgYW55dGhpbmcgZWxzZSBpcyByZXR1cm5lZCB2ZXJiYXRpbS4g SXQgb3V0cHV0cyB0d28gYXJyYXlzOiB0aGUgMXN0IGNvbnRhaW5zIGl0ZW1zIGZvciBpbmNs dXNpb24sIHRoZSAybmQgY29udGFpbnMgaXRlbXMgZm9yIGV4Y2x1c2lvbi48L3A+DQoNCgk8 cD5BcmdzICggWypdID0gbWFuZGF0b3J5ICkgOg0KCTxvbD4NCgkJPGxpPlsqXSBUaGUgc3Ry aW5nIHRvIHNlYXJjaCBmb3IgbWF0Y2hlczwvbGk+DQoJCTxsaT5bKl0gQW4gYXJyYXkgY29u dGFpbmluZyBzaG9ydGN1dHMgdGhhdCBhcmUgJiM4MjIwO2FsbG93ZWQmIzgyMjE7IHRvIGJl IGZvdW5kIGluIHRoZSBzdHJpbmcgKD9jLCA/cywgP3QsID9maWVsZCBldGMpPC9saT4NCgkJ PGxpPlRoZSBwcmVmaXggZm9yID9pZCBzdHJpbmdzPC9saT4NCgkJPGxpPkJvb2xlYW4gaW5k aWNhdGluZyB3aGV0aGVyIHRvIGFsbG93IHJhbmdlIGV4cGFuc2lvbiBvciBub3Q8L2xpPg0K CQk8bGk+UmVnRXggc3RyaW5nIHRvIHNwbGl0IG9wdGlvbnMgYXQgKHNlZSBzbWRfc3BsaXQp PC9saT4NCgkJPGxpPnByZWdfc3BsaXQgb3B0aW9uIChzZWUgc21kX3NwbGl0KTwvbGk+DQoJ PC9vbD48L3A+DQoNCgk8cD48c3Ryb25nPnNtZF9zcGxpdDwvc3Ryb25nPjwvcD4NCg0KCTxw PlJldHVybnMgYW4gYXJyYXkgb2YgaXRlbXMgZnJvbSBhIHN0cmluZyBvZiAodXN1YWxseSkg Y29tbWEtc2VwYXJhdGVkIHZhbHVlcy4gSWYgYW55IHZhbHVlcyBjb250YWluIHJhbmdlcyBv ZiBudW1iZXJzIGxpa2UgMS01IHRoYXQgbmVlZCAmIzgyMTY7ZXhwYW5kaW5nJiM4MjE3OyBm aXJzdCAoYW5kICRhbGxvd1JhbmdlIGlzIHRydWUpLCB0aGV5IGFyZSBkZWFsdCB3aXRoLiBU YWtlcyB0aGUgZm9sbG93aW5nIGFyZ3VtZW50cyAoIFsqXSA9IG1hbmRhdG9yeSBhcmdzKSA6 PC9wPg0KDQoJPG9sPg0KCQk8bGk+WypdIFRoZSBzdHJpbmcgdG8gc3BsaXQ8L2xpPg0KCQk8 bGk+Qm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gYWxsb3cgcmFuZ2UgZXhwYW5zaW9u IG9yIG5vdCAoaS5lLiAxLTUgYmVjb21lcyAxLDIsMyw0LDUpPC9saT4NCgkJPGxpPlRoZSBy ZWd1bGFyIGV4cHJlc3Npb24gY2hhcmFjdGVyIGNsYXNzZXMgdG8gbWF0Y2guIElmIGEgZnVs bCBSZWdFeCBzdGFydGluZyBhbmQgZW5kaW5nIHdpdGggJiM4MjE2Oy8mIzgyMTc7IGNoYXJh Y3RlcnMgaXMgc3VwcGxpZWQsIHRoZSBleHByZXNzaW9uIGlzIHVzZWQgdmVyYmF0aW0uIFdp dGhvdXQgdGhlICYjODIxNjsvJiM4MjE3OyBjaGFyYWN0ZXJzLCB0aGUgZXhwcmVzc2lvbiBp cyB0cmVhdGVkIGFzIGEgbGlzdCBvZiBjaGFyYWN0ZXIgY2xhc3NlcyB0byBmaW5kLiBEZWZh dWx0cyB0byAmIzgyMjA7LygsfCxccykrLyYjODIyMTsgd2hpY2ggaXMgYSBjb21tYSwgb3Ig Y29tbWEgYW5kIGEgd2hpdGVzcGFjZSBjaGFyYWN0ZXIuPC9saT4NCgkJPGxpPnByZWdfc3Bs aXQgb3B0aW9uIGNvbnN0YW50IGFzIGRlZmluZWQgaW4gdGhlIHBocCBtYW51YWw8L2xpPg0K CTwvb2w+DQoNCgk8cD48c3Ryb25nPnNtZF9NTFA8L3N0cm9uZz48YnIgLz4NCkluc3RhbnRp YXRlIG9uZSBvZiB0aGVzZSB0byBoYW5kbGUgPGFjcm9ueW0gdGl0bGU9Ik11bHRpLUxpbmd1 YWwgUGFjayI+PHNwYW4gY2xhc3M9ImNhcHMiPk1MUDwvc3Bhbj48L2Fjcm9ueW0+IGluIHlv dXIgcGx1Z2luIGxpa2UgdGhpczo8L3A+DQoNCgk8cD4xKSBEZWNsYXJlIGEgdW5pcXVlIGds b2JhbCB2YXJpYWJsZSwgZS5nLiBnbG9iYWwgJG15UGx1ZzxiciAvPg0KMikgRGVmaW5lIHlv dXIgZGVmYXVsdCBzdHJpbmcgcmVwbGFjZW1lbnQgYXJyYXkgKGRvZXNuJiM4MjE3O3QgbmVl ZCB0byBiZSBnbG9iYWwpLCBlLmc6PC9wPg0KDQoJPHA+CSRteVN0cmluZ3MgPSBhcnJheSAo JiM4MjIwO21zZzEmIzgyMjE7ID0mZ3Q7ICYjODIyMDtUaGlzIGlzIG1lc3NhZ2UgMSYjODIy MTssICYjODIyMDttc2cyJiM4MjIxOyA9Jmd0OyAmIzgyMjA7VGhpcyBpcyBtZXNzYWdlIDIm IzgyMjE7KTs8L3A+DQoNCgk8cD4zKSBDcmVhdGUgYW4gPHNwYW4gY2xhc3M9ImNhcHMiPk1M UDwvc3Bhbj4gaGFuZGxlcjo8L3A+DQoNCgk8cD4JJG15UGx1ZyA9IG5ldyBzbWRfTUxQKCYj ODIyMDtwbHVnaW5fbmFtZSYjODIyMTssICYjODIyMDtwbHVnaW5fcHJlZml4JiM4MjIxOywg JG15U3RyaW5ncyk7PC9wPg0KDQoJPHA+NCkgVGhhdCYjODIxNztzIGl0ISBUaGVyZSBhcmUg dHdvIG9wdGlvbmFsIGFyZ3MgdG8gc21kX01MUDoNCglhKSB0aGUgZGVmYXVsdCAoZnVsbCkg bGFuZ3VhZ2UgdG8gdXNlLCBlLmcgJiM4MjIwO2RhLWRrJiM4MjIxOy4gRGVmYXVsdHMgdG8g JiM4MjIwO2VuLWdiJiM4MjIxOy4NCgliKSB0aGUgaW50ZXJmYWNlIHRoZSBzdHJpbmdzIGFy ZSBmb3IuIENob29zZSBmcm9tICYjODIyMDtwdWJsaWMmIzgyMjE7ICh0aGUgZGVmYXVsdCks ICYjODIyMDthZG1pbiYjODIyMTsgb3IgJiM4MjIwO2NvbW1vbiYjODIyMTs8L3A+DQoNCgk8 cD41KSBUbyB1c2UgYSByZXBsYWNlbWVudCBzdHJpbmcgaW4geW91ciBjb2RlOg0KCWEpIE1h a2Ugc3VyZSB0byBpbXBvcnQgdGhlIHVuaXF1ZSBnbG9iYWwgdmFyaWFibGU6IGUuZy4gZ2xv YmFsICRteVBsdWc7DQoJYikgQ2FsbCAkbXlQbHVnLSZndDtnVHh0KCYjODIyMDttZXNzYWdl SUQmIzgyMjE7KTsgWyBlLmcuICRteVBsdWctJmd0O2dUeHQoJiM4MjIwO21zZzEmIzgyMjE7 KSBdDQoJYykgSWYgeW91IHdhbnQgdG8gcmVwbGFjZSBhbnkgYXJncyBpbiB5b3VyIG1lc3Nh Z2Ugc3RyaW5nLCBwYXNzIGFuIGFzc29jaWF0aXZlIGFycmF5IGFzIHRoZSAybmQgYXJnIHRv IGdUeHQoKTwvcD4NCg0KCTxwPjxzdHJvbmc+c21kX2RvRGJsUXVvdGU8L3N0cm9uZz48L3A+ DQoNCgk8cD5BbHRlcm5hdGl2ZSB0byB0aGUgY29yZSYjODIxNztzIGRvUXVvdGUoKS4gVGhp cyBvbmUgZGJsLXF1b3RlcyBpbnN0ZWFkIG9mIHNnbC1xdW90ZXM8L3A+DQoNCgk8cD48c3Ry b25nPnNtZF9wcmVnUG9zPC9zdHJvbmc+PC9wPg0KDQoJPHA+TGlmdGVkIGZyb20gb25lIG9m IHRoZSBjb21tZW50cyBpbiB0aGUgPHNwYW4gY2xhc3M9ImNhcHMiPlBIUDwvc3Bhbj4gbWFu dWFsLCB0aGlzIGp1c3QgbG9va3MgZm9yIGEgUmVnRXggc3RyaW5nIHdpdGhpbiBhbm90aGVy LCByZXR1cm5pbmcgdGhlIG1hdGNoZXMgaXQgZmluZHMgYW5kIHRoZSBwb3NpdGlvbiBvZiB0 aGUgZmlyc3QgbWF0Y2guPC9wPg0KDQoJPHA+PHN0cm9uZz5hcnJheV9jb21iaW5lPC9zdHJv bmc+PC9wPg0KDQoJPHA+UEhQNCBlcXVpdmFsZW50IG9mIHRoZSBzdGFuZGFyZCBQSFA1IGZ1 bmN0aW9uLCBsaWZ0ZWQgZnJvbSBwaHAubmV0PC9wPg0KDQoJPHA+PHN0cm9uZz5odG1sc3Bl Y2lhbGNoYXJzX2RlY29kZTwvc3Ryb25nPjwvcD4NCg0KCTxwPlBIUDQgZXF1aXZhbGVudCBv ZiB0aGUgc3RhbmRhcmQgUEhQNSBmdW5jdGlvbiwgbGlmdGVkIGZyb20gcGhwLm5ldDwvcD4N Cg0KPC9kaXY+CjwhLS0gLS0tIEJFR0lOIFBMVUdJTiBDU1MgLS0tIC0tPgo8c3R5bGUgdHlw ZT0idGV4dC9jc3MiPg0KI3NtZF9oZWxwIHsgbGluZS1oZWlnaHQ6MS4zIDt9DQojc21kX2hl bHAgY29kZSB7IGZvbnQtd2VpZ2h0OmJvbGQ7IGZvbnQ6IDEwNSUvMTMwJSAiQ291cmllciBO ZXciLCBjb3VyaWVyLCBtb25vc3BhY2U7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGQ0M7fQ0K I3NtZF9oZWxwIGNvZGUuYmxvY2sgeyBmb250LXdlaWdodDpub3JtYWw7IGJvcmRlcjoxcHgg ZG90dGVkICM5OTk7IGJhY2tncm91bmQtY29sb3I6ICNmMGU2OGM7IGRpc3BsYXk6YmxvY2s7 IG1hcmdpbjoxMHB4IDEwcHggMjBweDsgcGFkZGluZzoxMHB4OyB9DQojc21kX2hlbHAgYTps aW5rLCAjc21kX2hlbHAgYTp2aXNpdGVkIHsgY29sb3I6IGJsdWU7IHRleHQtZGVjb3JhdGlv bjogbm9uZTsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsdWU7IHBhZGRpbmctYm90dG9t OjFweDt9DQojc21kX2hlbHAgYTpob3ZlciwgI3NtZF9oZWxwIGE6YWN0aXZlIHsgY29sb3I6 IGJsdWU7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlk IGJsdWU7IHBhZGRpbmctYm90dG9tOjFweDt9DQojc21kX2hlbHAgaDEgeyBjb2xvcjogIzM2 OTsgZm9udDogMjBweCBHZW9yZ2lhLCBzYW5zLXNlcmlmOyBtYXJnaW46IDA7IHRleHQtYWxp Z246IGNlbnRlcjsgfQ0KI3NtZF9oZWxwIGgyIHsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlk IGJsYWNrOyBwYWRkaW5nOjEwcHggMCAwOyBjb2xvcjogIzM2OTsgZm9udDogMTdweCBHZW9y Z2lhLCBzYW5zLXNlcmlmOyB9DQojc21kX2hlbHAgaDMgeyBjb2xvcjogIzY5MzsgZm9udDog Ym9sZCAxMnB4IEFyaWFsLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMXB4OyBtYXJn aW46IDEwcHggMCAwO3RleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7fQ0KI3NtZF9oZWxwIGg0 IHsgZm9udDogYm9sZCAxMXB4IEFyaWFsLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzog MXB4OyBtYXJnaW46IDEwcHggMCAwIDt0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyB9DQoj c21kX2hlbHAgLmF0dC1uYW1lIHsgZm9udC13ZWlnaHQ6Ym9sZDsgfQ0KI3NtZF9oZWxwIC5t YW5kIHsgYmFja2dyb3VuZDojZWVlOyBib3JkZXI6MXB4IGRvdHRlZCAjOTk5OyB9DQojc21k X2hlbHAgdGFibGUge3dpZHRoOjEwMCU7IHRleHQtYWxpZ246Y2VudGVyOyBwYWRkaW5nLWJv dHRvbToxZW07fQ0KI3NtZF9oZWxwIHRkLCAjc21kX2hlbHAgdGgge2JvcmRlcjoxcHggc29s aWQgIzk5OTsgcGFkZGluZzouNWVtIDA7fQ0KPC9zdHlsZT4KPCEtLSAtLS0gRU5EIFBMVUdJ TiBDU1MgLS0tIC0tPiI7czo0OiJjb2RlIjtzOjExMjg1OiIvLyBTb2Z0d2FyZSBlbmdpbmVl cnMgbG9vayBhd2F5IG5vdyB1bmxlc3MgeW91IHdpc2ggdG8gYmUgaG9ycmlmaWVkIGJ5IHRo ZSBhbW91bnQNCi8vIG9mIGNvdXBsaW5nIGFuZCBjb2hlc2lvbiBpbiB0aGVzZSBmdW5jdGlv bnMuIEknbSB3YXJuaW5nIHlvdS4uLiBpdCdzIG5vdCBwcmV0dHkNCmlmICghY2xhc3NfZXhp c3RzKCdzbWRfTUxQJykpIHsNCmNsYXNzIHNtZF9NTFAgew0KCXZhciAkc21kX3N0cmluZ3M7 DQoJdmFyICRzbWRfb3duZXI7DQoJdmFyICRzbWRfcHJlZml4Ow0KCXZhciAkc21kX2xhbmc7 DQoJdmFyICRzbWRfZXZlbnQ7DQoJZnVuY3Rpb24gc21kX01MUCgkcGx1ZywgJHByZWZ4LCAk c3RyYXJyYXksICRsbmc9J2VuLWdiJywgJGV2PSdwdWJsaWMnKSB7DQoJCSR0aGlzLT5zbWRf b3duZXIgPSAkcGx1ZzsNCgkJJHRoaXMtPnNtZF9wcmVmaXggPSAkcHJlZng7DQoJCSR0aGlz LT5zbWRfc3RyaW5ncyA9ICRzdHJhcnJheTsNCgkJJHRoaXMtPnNtZF9sYW5nID0gJGxuZzsN CgkJJHRoaXMtPnNtZF9ldmVudCA9ICRldjsNCgkJcmVnaXN0ZXJfY2FsbGJhY2soYXJyYXko JiR0aGlzLCAnc21kX0NhbGxiYWNrJyksICdsMTBuLmVudW1lcmF0ZV9zdHJpbmdzJyk7DQoJ fQ0KCWZ1bmN0aW9uIHNtZF9DYWxsYmFjaygkZXZlbnQ9J2wxMG4uZW51bWVyYXRlX3N0cmlu Z3MnLCAkc3RlcD0nJywgJHByZT0wKSB7DQoJCSRyID0gYXJyYXkoDQoJCQknb3duZXInID0+ ICR0aGlzLT5zbWRfb3duZXIsDQoJCQkncHJlZml4JyA9PiAkdGhpcy0+c21kX3ByZWZpeCwN CgkJCSdsYW5nJyA9PiAkdGhpcy0+c21kX2xhbmcsDQoJCQknZXZlbnQnID0+ICR0aGlzLT5z bWRfZXZlbnQsDQoJCQknc3RyaW5ncycgPT4gJHRoaXMtPnNtZF9zdHJpbmdzLA0KCQkpOw0K CQlyZXR1cm4gJHI7DQoJfQ0KCS8vIEdlbmVyaWMgbG9va3VwDQoJLy8gICR3aGF0ID0ga2V5 IHRvIGxvb2sgdXANCgkvLyAgJGFyZ3MgPSBhbnkgYXJndW1lbnRzIHRoZSBrZXkgaXMgZXhw ZWN0aW5nIGZvciByZXBsYWNlbWVudA0KCWZ1bmN0aW9uIGdUeHQoJHdoYXQsICRhcmdzID0g YXJyYXkoKSkgew0KCQlnbG9iYWwgJHRleHRhcnJheTsNCg0KCQkvLyBQcmVwYXJlIHRoZSBw cmVmaXhlZCBrZXkgZm9yIHVzZQ0KCQkka2V5ID0gJHRoaXMtPnNtZF9wcmVmaXggLiAnLScg LiAkd2hhdDsNCgkJJGtleSA9IHN0cnRvbG93ZXIoJGtleSk7DQoNCgkJLy8gR3JhYiBmcm9t IHRoZSBnbG9iYWwgdGV4dGFycmF5IChwb3NzaWJseSBlZGl0ZWQgYnkgTUxQKSBpZiB3ZSBj YW4NCgkJaWYoaXNzZXQoJHRleHRhcnJheVska2V5XSkpIHsNCgkJCSRzdHIgPSAkdGV4dGFy cmF5WyRrZXldOw0KCQl9IGVsc2Ugew0KCQkJLy8gVGhlIHN0cmluZyBpc24ndCBpbiB0aGUg bG9jYWxpc2VkIHRleHRhcnJheSBzbyBmYWxsYmFjayB0byB1c2luZw0KCQkJLy8gdGhlIChu b24gcHJlZml4ZWQpIHN0cmluZyBhcnJheSBpbiB0aGUgcGx1Z2luDQoJCQkka2V5ID0gc3Ry dG9sb3dlcigkd2hhdCk7DQoJCQkkc3RyID0gKGlzc2V0KCR0aGlzLT5zbWRfc3RyaW5nc1sk a2V5XSkpID8gJHRoaXMtPnNtZF9zdHJpbmdzWyRrZXldIDogJHdoYXQ7DQoJCX0NCgkJLy8g UGVyZm9ybSBzdWJzdGl0dXRpb25zDQoJCWlmKCFlbXB0eSgkYXJncykpIHsNCgkJCSRzdHIg PSBzdHJ0cigkc3RyLCAkYXJncyk7DQoJCX0NCg0KCQlyZXR1cm4gJHN0cjsNCgl9DQp9DQp9 DQoNCmlmICghZnVuY3Rpb25fZXhpc3RzKCJzbWRfZG9MaXN0IikpIHsNCmZ1bmN0aW9uIHNt ZF9kb0xpc3QoJGxzdCwgJHJuZz10cnVlLCAkc3ViPSIiLCAkcXRlPXRydWUsICRkbG09Iiwi LCAkbGF4PXRydWUpIHsNCglnbG9iYWwgJHRoaXNhcnRpY2xlLCAkdGhpc2ltYWdlLCAkdGhp c2ZpbGUsICR0aGlzbGluaywgJHByZXRleHQsICR2YXJpYWJsZTsNCg0KCSRpbmMgPSAkZXhj ID0gYXJyYXkoKTsNCgkkbHN0ID0gZG9fbGlzdCgkbHN0LCAkZGxtKTsNCg0KCS8vIFNvbWV0 aW1lcyBwZXNreSBVbmljb2RlIGlzIG5vdCBjb21waWxlZCBpbi4gRGV0ZWN0IGlmIHNvIGFu ZCBmYWxsIGJhY2sgdG8gQVNDSUkNCglpZiAoIUBwcmVnX21hdGNoKCcvXHBML3UnLCAnYScp KSB7DQoJCSRtb2RSRSA9ICgkbGF4KSA/ICcvKFw/fFwhKShbQS1aYS16MC05X1wtIF0rKS8n IDogJy8oXD98XCEpKFtBLVphLXowLTlfXC1dKykvJzsNCgl9IGVsc2Ugew0KCQkkbW9kUkUg PSAoJGxheCkgPyAnLyhcP3xcISkoW1xwe0x9XHB7Tn1ccHtQY31ccHtQZH1ccHtac31dKykv JyA6ICcvKFw/fFwhKShbXHB7TH1ccHtOfVxwe1BjfVxwe1BkfV0rKS8nOw0KCX0NCg0KCWZv cmVhY2ggKCRsc3QgYXMgJGl0ZW0pIHsNCgkJJG1vZCA9IDA7IC8vIDAgPSBpbmNsdWRlLCAx ID0gZXhjbHVkZQ0KCQkkbnVtTW9kcyA9IHByZWdfbWF0Y2hfYWxsKCRtb2RSRSwgJGl0ZW0s ICRtb2RzKTsNCg0KCQlmb3IgKCRtb2RDdHIgPSAwOyAkbW9kQ3RyIDwgJG51bU1vZHM7ICRt b2RDdHIrKykgew0KCQkJLy8gbW9kICJ0eXBlIiBpcyBnb3Zlcm5lZCBieSB0aGUgZmlyc3Qg b25lIGZvdW5kIG9ubHkuIGkuZS4gaWYgImFydGljbGUtP2MhcyIgd2FzIHVzZWQgaW4gb25l IGZpZWxkDQoJCQkvLyBpdCB3b3VsZCBiZSBhbiAiaW5jbHVkZSIgb2YgdGhlIHdvcmQgImFy dGljbGUtIiBwbHVzIHRoZSBjYXRlZ29yeSBhbmQgc2VjdGlvbiBjb25jYXRlbmF0ZWQNCgkJ CSRtb2QgPSAoJG1vZHNbMV1bMF0gPT09ICIhIikgPyAxIDogMDsNCgkJCSRtb2RDaGFyID0g JG1vZHNbMV1bJG1vZEN0cl07DQoJCQkkbW9kSXRlbSA9IHRyaW0oJG1vZHNbMl1bJG1vZEN0 cl0pOw0KCQkJJGxvd2l0ZW0gPSBzdHJ0b2xvd2VyKCRtb2RJdGVtKTsNCgkJCWlmIChpc3Nl dCgkdmFyaWFibGVbJGxvd2l0ZW1dKSkgew0KCQkJCSRpdGVtID0gc3RyX3JlcGxhY2UoJG1v ZENoYXIuJG1vZEl0ZW0sICR2YXJpYWJsZVskbG93aXRlbV0sICRpdGVtKTsNCgkJCX0gZWxz ZSBpZiAoaXNzZXQoJHRoaXNpbWFnZVskbG93aXRlbV0pKSB7DQoJCQkJJGl0ZW0gPSBzdHJf cmVwbGFjZSgkbW9kQ2hhci4kbW9kSXRlbSwgJHRoaXNpbWFnZVskbG93aXRlbV0sICRpdGVt KTsNCgkJCX0gZWxzZSBpZiAoaXNzZXQoJHRoaXNmaWxlWyRsb3dpdGVtXSkpIHsNCgkJCQkk aXRlbSA9IHN0cl9yZXBsYWNlKCRtb2RDaGFyLiRtb2RJdGVtLCAkdGhpc2ZpbGVbJGxvd2l0 ZW1dLCAkaXRlbSk7DQoJCQl9IGVsc2UgaWYgKGlzc2V0KCR0aGlzbGlua1skbG93aXRlbV0p KSB7DQoJCQkJJGl0ZW0gPSBzdHJfcmVwbGFjZSgkbW9kQ2hhci4kbW9kSXRlbSwgJHRoaXNs aW5rWyRsb3dpdGVtXSwgJGl0ZW0pOw0KCQkJfSBlbHNlIGlmIChhcnJheV9rZXlfZXhpc3Rz KCRsb3dpdGVtLCAkcHJldGV4dCkpIHsNCgkJCQkkaXRlbSA9IHN0cl9yZXBsYWNlKCRtb2RD aGFyLiRtb2RJdGVtLCAkcHJldGV4dFskbG93aXRlbV0sICRpdGVtKTsNCgkJCX0gZWxzZSBp ZiAoaXNzZXQoJF9QT1NUWyRtb2RJdGVtXSkpIHsNCgkJCQkkaXRlbSA9IHN0cl9yZXBsYWNl KCRtb2RDaGFyLiRtb2RJdGVtLCAkX1BPU1RbJG1vZEl0ZW1dLCAkaXRlbSk7DQoJCQl9IGVs c2UgaWYgKGlzc2V0KCRfR0VUWyRtb2RJdGVtXSkpIHsNCgkJCQkkaXRlbSA9IHN0cl9yZXBs YWNlKCRtb2RDaGFyLiRtb2RJdGVtLCAkX0dFVFskbW9kSXRlbV0sICRpdGVtKTsNCgkJCX0g ZWxzZSBpZiAoaXNzZXQoJF9TRVJWRVJbJG1vZEl0ZW1dKSkgew0KCQkJCSRpdGVtID0gc3Ry X3JlcGxhY2UoJG1vZENoYXIuJG1vZEl0ZW0sICRfU0VSVkVSWyRtb2RJdGVtXSwgJGl0ZW0p Ow0KCQkJfSBlbHNlIGlmIChpc3NldCgkdGhpc2FydGljbGVbJGxvd2l0ZW1dKSkgew0KCQkJ CSRpdGVtID0gc3RyX3JlcGxhY2UoJG1vZENoYXIuJG1vZEl0ZW0sICR0aGlzYXJ0aWNsZVsk bG93aXRlbV0sICRpdGVtKTsNCgkJCX0gZWxzZSB7DQoJCQkJJGl0ZW0gPSBzdHJfcmVwbGFj ZSgkbW9kQ2hhci4kbW9kSXRlbSwgJG1vZEl0ZW0sICRpdGVtKTsNCgkJCX0NCgkJfQ0KDQoJ CS8vIEhhbmRsZSByYW5nZXMgb2YgdmFsdWVzDQoJCSRzaXRlbSA9IGRvX2xpc3QoJGl0ZW0s ICRkbG0pOw0KCQlmb3JlYWNoICgkc2l0ZW0gYXMgJGlkeCA9PiAkZWxlbSkgew0KCQkJaWYg KCRybmcgJiYgcHJlZ19tYXRjaCgnL14oXGQrKVwtKFxkKykkLycsICRlbGVtKSkgew0KCQkJ CWxpc3QoJGxvLCAkaGkpID0gZXhwbG9kZSgiLSIsICRlbGVtLCAyKTsNCgkJCQkkc2l0ZW1b JGlkeF0gPSBpbXBsb2RlKCRkbG0sIHJhbmdlKCRsbywgJGhpKSk7DQoJCQl9DQoJCX0NCgkJ JGl0ZW0gPSBpbXBsb2RlKCRkbG0sICRzaXRlbSk7DQoNCgkJLy8gSXRlbSBtYXkgYmUgZW1w dHk7IGlnbm9yZSBpdCBpZiBzbw0KCQlpZiAoJGl0ZW0pIHsNCgkJCSRpdGVtID0gZG9fbGlz dCgkaXRlbSwgJGRsbSk7DQoNCgkJCS8vIEhhbmRsZSBzdWItY2F0ZWdvcmllcw0KCQkJaWYg KCRzdWIpIHsNCgkJCQlsaXN0KCRzdWJ0eXBlLCAkbGV2ZWwpID0gZXhwbG9kZSgiOiIsICRz dWIpOw0KCQkJCSRsZXZlbCA9IChlbXB0eSgkbGV2ZWwpKSA/IDAgOiAkbGV2ZWw7DQoJCQkJ JGxldmVsID0gKHN0cnRvbG93ZXIoJGxldmVsKT09ImFsbCIpID8gOTk5OTkgOiAkbGV2ZWw7 DQoJCQkJJG91dGl0ZW1zID0gYXJyYXkoKTsNCgkJCQlmb3JlYWNoICgkaXRlbSBhcyAkY2F0 KSB7DQoJCQkJCSRjYXRzID0gZ2V0VHJlZShkb3NsYXNoKCRjYXQpLCAkc3VidHlwZSk7DQoJ CQkJCWZvcmVhY2ggKCRjYXRzIGFzICRqZHggPT4gJHZhbCkgew0KCQkJCQkJaWYgKCRjYXRz WyRqZHhdWydsZXZlbCddIDw9ICRsZXZlbCkgew0KCQkJCQkJCSRvdXRpdGVtc1tdID0gJGNh dHNbJGpkeF1bJ25hbWUnXTsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0NCgkJCQkkaXRlbSA9 ICRvdXRpdGVtczsNCgkJCX0NCg0KCQkJLy8gUXVvdGUgaWYgYXNrZWQNCgkJCSRpdGVtID0g KCRxdGUpID8gZG9BcnJheSgkaXRlbSwgJ2RvUXVvdGUnKSA6ICRpdGVtOw0KCQkJaWYgKCRt b2QgPT09IDApIHsNCgkJCQkkaW5jID0gYXJyYXlfdW5pcXVlKGFycmF5X21lcmdlKCRpbmMs ICRpdGVtKSk7DQoJCQl9IGVsc2Ugew0KCQkJCSRleGMgPSBhcnJheV91bmlxdWUoYXJyYXlf bWVyZ2UoJGV4YywgJGl0ZW0pKTsNCgkJCX0NCgkJfQ0KCX0NCglyZXR1cm4gYXJyYXkoJGlu YywgJGV4Yyk7DQp9DQp9DQoNCi8vIFNwbGl0IGEgc3RyaW5nIG9uIGEgcGF0dGVybiBhbmQg YWxsb3cgaW50ZWdlciByYW5nZXMgdG8gYmUgZXhwYW5kZWQNCmlmICghZnVuY3Rpb25fZXhp c3RzKCJzbWRfc3BsaXQiKSkgew0KZnVuY3Rpb24gc21kX3NwbGl0KCRzdHIsICRhbGxvd1Jh bmdlPXRydWUsICRzcGxpdGF0PSIvKCx8LFxzKSsvIiwgJHByZWdvcHQgPSBQUkVHX1NQTElU X05PX0VNUFRZKSB7DQoJJHJldGFyciA9IGFycmF5KCk7DQoJaWYgKChzdWJzdHIoJHNwbGl0 YXQsMCwxKSA9PSAiLyIpICYmIChzdWJzdHIoJHNwbGl0YXQsIHN0cmxlbigkc3BsaXRhdCkt MSwgMSkgPT0gIi8iKSkgew0KCQkkcGF0ID0gJHNwbGl0YXQ7DQoJfSBlbHNlIHsNCgkJJHBh dCA9ICcvWycuJHNwbGl0YXQuJ10rLyc7DQoJfQ0KCSRlbGVtcyA9IHByZWdfc3BsaXQoJHBh dCwgJHN0ciwgLTEsICRwcmVnb3B0KTsNCglmb3JlYWNoICgkZWxlbXMgYXMgJGl0ZW0pIHsN CgkJJGl0ZW0gPSB0cmltKCRpdGVtKTsNCgkJJG5lZ2F0ZSA9IGZhbHNlOw0KCQkvLyBEb2Vz IHRoZSBpdGVtIHN0YXJ0IHdpdGggYSBuZWdhdGlvbiBjaGFyYWN0ZXINCgkJaWYgKHN1YnN0 cigkaXRlbSwwLDEpID09PSAiISIpIHsNCgkJCSRuZWdhdGUgPSB0cnVlOw0KCQkJJGl0ZW0g PSBzdWJzdHIoJGl0ZW0sMSk7DQoJCX0NCgkJLy8gSXMgdGhlIGl0ZW0gYW4gaW50ZWdlciBs aXN0IHJhbmdlDQoJCWlmICgkYWxsb3dSYW5nZSAmJiBwcmVnX21hdGNoKCcvXihcZCspXC0o XGQrKSQvJywgJGl0ZW0pKSB7DQoJCQlsaXN0KCRsbywgJGhpKSA9IGV4cGxvZGUoIi0iLCAk aXRlbSwgMik7DQoJCQkkcm5nID0gcmFuZ2UoJGxvLCAkaGkpOw0KCQkJLy8gUmVhcHBseSB0 aGUgbmVnYXRpb24gaWYgbmVjZXNzYXJ5DQoJCQlmb3IoJGlkeCA9IDA7ICRpZHggPCBjb3Vu dCgkcm5nKTsgJGlkeCsrKSB7DQoJCQkJJHJuZ1skaWR4XSA9ICgoJG5lZ2F0ZSkgPyAiISIg OiAiIikgLiAkcm5nWyRpZHhdOw0KCQkJfQ0KCQkJJHJldGFyciA9IGFycmF5X21lcmdlKCRy ZXRhcnIsICRybmcpOw0KCQl9IGVsc2Ugew0KCQkJJHJldGFycltdID0gKCgkbmVnYXRlKSA/ ICIhIiA6ICIiKSAuICRpdGVtOw0KCQl9DQoJfQ0KCXJldHVybiAkcmV0YXJyOw0KfQ0KfQ0K DQppZiAoIWZ1bmN0aW9uX2V4aXN0cygic21kX2RvRGJsUXVvdGUiKSkgew0KZnVuY3Rpb24g c21kX2RvRGJsUXVvdGUoJHZhbCkgew0KCXJldHVybiAnIicuJHZhbC4nIic7DQp9DQp9DQoN CmlmICghZnVuY3Rpb25fZXhpc3RzKCJzbWRfcmVtb3ZlUVNWYXIiKSkgew0KZnVuY3Rpb24g c21kX3JlbW92ZVFTVmFyKCR1cmwsICRrZXkpIHsNCgkkdXJsID0gcHJlZ19yZXBsYWNlKCcv KC4qKShcP3wmKScgLiAka2V5IC4gJz1bXiZdKz8oJikoLiopL2knLCAnJDEkMiQ0JywgJHVy bCAuICcmJyk7DQoJJHVybCA9IHN1YnN0cigkdXJsLCAwLCAtMSk7DQoJcmV0dXJuICgkdXJs KTsNCn0NCn0NCg0KaWYgKCFmdW5jdGlvbl9leGlzdHMoInNtZF9hZGRRU1ZhciIpKSB7DQpm dW5jdGlvbiBzbWRfYWRkUVNWYXIoJHVybCwgJGtleSwgJHZhbHVlKSB7DQoJJHVybCA9IHNt ZF9yZW1vdmVRU1ZhcigkdXJsLCAka2V5KTsNCglpZiAoc3RycG9zKCR1cmwsICc/JykgPT09 IGZhbHNlKSB7DQoJCXJldHVybiAoJHVybCAuICc/JyAuICRrZXkgLiAnPScgLiAkdmFsdWUp Ow0KCX0gZWxzZSB7DQoJCXJldHVybiAoJHVybCAuICcmJyAuICRrZXkgLiAnPScgLiAkdmFs dWUpOw0KCX0NCn0NCn0NCg0KLy8gREVQUkVDQVRFRDogZm9yIGJhY2t3YXJkcyBjb21wYXRp YmlsaXR5IG9ubHkNCmlmICghZnVuY3Rpb25fZXhpc3RzKCJzbWRfZ2V0U3ViQ2F0cyIpKSB7 DQpmdW5jdGlvbiBzbWRfZ2V0U3ViQ2F0cygkcGFyZW50LCRjYXR0eXBlKSB7DQoJcmV0dXJu IGdldFRyZWUoJHBhcmVudCwkY2F0dHlwZSk7IC8vZ2V0VHJlZSgpIG9yIGdldFRyZWVQYXRo KCk/Pw0KfQ0KfQ0KDQovLyBERVBSRUNBVEVEOiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxp dHkgb25seQ0KaWYgKCFmdW5jdGlvbl9leGlzdHMoInNtZF9nZXRPcHRzIikpIHsNCmZ1bmN0 aW9uIHNtZF9nZXRPcHRzKCRzdHIsICRhbGxvd2VkLCAkaWRwcmVmaXg9IiIsICRhbGxvd1Jh bmdlPXRydWUsICRzcGxpdGF0PSIvKCx8LFxzKSsvIiwgJHByZWdvcHQgPSBQUkVHX1NQTElU X05PX0VNUFRZKSB7DQoJZ2xvYmFsICRwcmV0ZXh0LCAkdGhpc2FydGljbGU7DQoNCgkkb3V0 ID0gYXJyYXkoKTsNCgkkbm90b3V0ID0gYXJyYXkoKTsNCgkkbWF0Y2hlcyA9IHNtZF9zcGxp dCgkc3RyLCAkYWxsb3dSYW5nZSwgJHNwbGl0YXQsICRwcmVnb3B0KTsNCgkvLyBBbiBhcnJh eSB0aGF0IHRlbGxzIHRoZSBsb29wIHdoYXQgdG8gZG8gd2l0aCBlYWNoIG9mIHRoZSB2YWxp ZCBzdHJpbmdzDQoJLy8gIGFyZzE6IHR5cGUgKDE9ZXhhY3QgbWF0Y2gsIDI9YW55d2hlcmUg d2l0aGluIHN0cmluZywgMz1jdXN0b20gZmllbGQpDQoJLy8gIGFyZzI6IHByZWZpeCwgaWYg YW55DQoJLy8gIGFyZzM6IHZhcmlhYmxlIHRvIHN1YnN0aXR1dGUNCgkvLyAgYXJnNDogZXh0 cmEgY2hlY2ssIGlmIGFwcGxpY2FibGUNCgkvLyAgYXJnNTogc3RvcmUgaW4gdGhlIGluL2V4 Y2x1ZGUgbGlzdCAoMT1pbmNsdWRlOyAyPWV4Y2x1ZGUpDQoJJG9wdCA9IGFycmF5KA0KCQki P2MiID0+IGFycmF5KDIsICIiLCAkcHJldGV4dFsnYyddLCAiMSIsIDEpLA0KCQkiIWMiID0+ IGFycmF5KDIsICIiLCAkcHJldGV4dFsnYyddLCAiMSIsIDIpLA0KCQkiP3MiID0+IGFycmF5 KDIsICIiLCAkcHJldGV4dFsncyddLCAiMSIsIDEpLA0KCQkiIXMiID0+IGFycmF5KDIsICIi LCAkcHJldGV4dFsncyddLCAiMSIsIDIpLA0KCQkiP3EiID0+IGFycmF5KDIsICIiLCAkcHJl dGV4dFsncSddLCAiMSIsIDEpLA0KCQkiIXEiID0+IGFycmF5KDIsICIiLCAkcHJldGV4dFsn cSddLCAiMSIsIDIpLA0KCQkiP3QiID0+IGFycmF5KDIsICIiLCAkdGhpc2FydGljbGVbJ3Vy bF90aXRsZSddLCAnJHRoaXNhcnRpY2xlIT1OVUxMJywgMSksDQoJCSIhdCIgPT4gYXJyYXko MiwgIiIsICR0aGlzYXJ0aWNsZVsndXJsX3RpdGxlJ10sICckdGhpc2FydGljbGUhPU5VTEwn LCAyKSwNCgkJIj9pZCIgPT4gYXJyYXkoMSwgJGlkcHJlZml4LCAkcHJldGV4dFsnaWQnXSwg JyR0aGlzYXJ0aWNsZSE9TlVMTCcsIDEpLA0KCQkiIWlkIiA9PiBhcnJheSgxLCAkaWRwcmVm aXgsICRwcmV0ZXh0WydpZCddLCAnJHRoaXNhcnRpY2xlIT1OVUxMJywgMiksDQoJCSI/IiA9 PiBhcnJheSgzLCAiIiwgIiIsICckdGhpc2FydGljbGUhPU5VTEwnLCAxKSwNCgkJIiEiID0+ IGFycmF5KDMsICIiLCAiIiwgJyR0aGlzYXJ0aWNsZSE9TlVMTCcsIDIpLA0KCSk7DQoNCglm b3IgKCRpZHggPSAwOyAkaWR4IDwgY291bnQoJG1hdGNoZXMpOyAkaWR4KyspIHsNCgkJJG1h dGNoZWQgPSBmYWxzZTsNCgkJJHRoaXNtYXRjaCA9ICRtYXRjaGVzWyRpZHhdOw0KCQlmb3Jl YWNoICgkb3B0IGFzICR2YXIgPT4gJGFyZ3MpIHsNCgkJCSRvcHZhciA9ICgkYXJnc1s0XSA9 PSAxKSA/ICJvdXQiIDogIm5vdG91dCI7DQoJCQlzd2l0Y2ggKCRhcmdzWzBdKSB7DQoJCQkJ Y2FzZSAxOg0KCQkJCQlpZiAoKCR0aGlzbWF0Y2ggPT09ICR2YXIpICYmIGluX2FycmF5KCR2 YXIsJGFsbG93ZWQpKSB7DQoJCQkJCQkkbWF0Y2hlZCA9IHRydWU7DQoJCQkJCQlpZiAoJGFy Z3NbMl0gIT0gIiIgJiYgJGFyZ3NbM10pIHsNCgkJCQkJCQkkcmVwID0gc3RyX3JlcGxhY2Uo JHZhciwgJGFyZ3NbMV0uJGFyZ3NbMl0sICR0aGlzbWF0Y2gpOw0KCQkJCQkJCWlmICghaW5f YXJyYXkoJHJlcCwgJHskb3B2YXJ9KSkgew0KCQkJCQkJCQkkeyRvcHZhcn1bXSA9ICRyZXA7 DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJCWJyZWFrOw0KCQkJCWNhc2UgMjoN CgkJCQkJJHBhdCA9ICcvXFwnLiR2YXIuJyR8XFwnLiR2YXIuJ1teQS1aYS16MC05XS8nOw0K CQkJCQlpZiAoKGlzX2ludChzbWRfcHJlZ1BvcygkcGF0LCAkdGhpc21hdGNoLCAkZm5kKSkp ICYmIGluX2FycmF5KCR2YXIsJGFsbG93ZWQpKSB7DQoJCQkJCQkkbWF0Y2hlZCA9IHRydWU7 DQoJCQkJCQlpZiAoJGFyZ3NbMl0gIT0gIiIgJiYgJGFyZ3NbM10pIHsNCgkJCQkJCQkkcmVw ID0gc3RyX3JlcGxhY2UoJHZhciwgJGFyZ3NbMV0uJGFyZ3NbMl0sICR0aGlzbWF0Y2gpOw0K CQkJCQkJCWlmICghaW5fYXJyYXkoJHJlcCwgJHskb3B2YXJ9KSkgew0KCQkJCQkJCQkkeyRv cHZhcn1bXSA9ICRyZXA7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJCWJyZWFr Ow0KCQkJCWNhc2UgMzoNCgkJCQkJJGxlbiA9IHN0cmxlbigkdmFyKTsNCgkJCQkJaWYgKChz dWJzdHIoJHRoaXNtYXRjaCwwLCRsZW4pID09PSAkdmFyKSAmJiBpbl9hcnJheSgkdmFyLiJm aWVsZCIsJGFsbG93ZWQpKSB7DQoJCQkJCQkkbWF0Y2hlZCA9IHRydWU7DQoJCQkJCQkvLyBV c2UgdGhlIGdpdmVuIGZpZWxkIG5hbWU7IHdoaWNoIG1heSBiZSBhIGNvbW1hLXNlcGFyYXRl ZCBzdWJsaXN0Lg0KCQkJCQkJLy8gU3BsaXQgb2ZmIHRoZSBmaWVsZCBuYW1lIGZyb20gdGhl IHF1ZXN0aW9uIG1hcmsNCgkJCQkJCSRmaWVsZG5hbWUgPSBzdWJzdHIoJHRoaXNtYXRjaCwk bGVuKTsNCgkJCQkJCWlmICgoJGFyZ3NbM10pICYmIChpc3NldCgkdGhpc2FydGljbGVbc3Ry dG9sb3dlcigkZmllbGRuYW1lKV0pKSkgew0KCQkJCQkJCSRmaWVsZENvbnRlbnRzID0gJHRo aXNhcnRpY2xlW3N0cnRvbG93ZXIoJGZpZWxkbmFtZSldOw0KCQkJCQkJfSBlbHNlIHsNCgkJ CQkJCQkkZmllbGRDb250ZW50cyA9ICRmaWVsZG5hbWU7DQoJCQkJCQl9DQoJCQkJCQlpZiAo IWVtcHR5KCRmaWVsZENvbnRlbnRzKSkgew0KCQkJCQkJCSRzdWJvdXQgPSBzbWRfc3BsaXQo c3RyaXBfdGFncygkZmllbGRDb250ZW50cyksICRhbGxvd1JhbmdlLCAkc3BsaXRhdCwgJHBy ZWdvcHQpOw0KCQkJCQkJCWZvcmVhY2ggKCRzdWJvdXQgYXMgJHN1Ym5hbWUpIHsNCgkJCQkJ CQkJaWYgKCFpbl9hcnJheSgkc3VibmFtZSwgJHskb3B2YXJ9KSkgew0KCQkJCQkJCQkJJHsk b3B2YXJ9W10gPSAkc3VibmFtZTsNCgkJCQkJCQkJfQ0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJ CQkJfQ0KCQkJCQlicmVhazsNCgkJCX0NCgkJCWlmICgkbWF0Y2hlZCkgew0KCQkJCWJyZWFr Ow0KCQkJfQ0KCQl9DQoJCWlmICghJG1hdGNoZWQpIHsNCgkJCS8vIEFzc2lnbiB0aGUgdmFy aWFibGUgdmVyYmF0aW0NCgkJCWlmICghaW5fYXJyYXkoJHRoaXNtYXRjaCwgJG91dCkpIHsN CgkJCQkkb3V0W10gPSAkdGhpc21hdGNoOw0KCQkJfQ0KCQl9DQoJfQ0KCXJldHVybiBhcnJh eSgkb3V0LCRub3RvdXQpOw0KfQ0KfQ0KDQovLyBTdG9sZW4gZnJvbSBwaHAubmV0OiBzdHJw b3MgcGFnZSBjb21tZW50cy4uLg0KaWYgKCFmdW5jdGlvbl9leGlzdHMoInNtZF9wcmVnUG9z IikpIHsNCmZ1bmN0aW9uIHNtZF9wcmVnUG9zKCRzUGF0dGVybiwgJHNTdWJqZWN0LCAmJEZv dW5kU3RyaW5nLCAkaU9mZnNldCA9IDApIHsNCgkkRm91bmRTdHJpbmcgPSBudWxsOw0KCWlm IChwcmVnX21hdGNoKCRzUGF0dGVybiwgJHNTdWJqZWN0LCAkYU1hdGNoZXMsIFBSRUdfT0ZG U0VUX0NBUFRVUkUsICRpT2Zmc2V0KSA+IDApIHsNCgkJJEZvdW5kU3RyaW5nID0gJGFNYXRj aGVzWzBdWzBdOw0KCQlyZXR1cm4gJGFNYXRjaGVzWzBdWzFdOw0KCX0gZWxzZSB7DQoJCXJl dHVybiBmYWxzZTsNCgl9DQp9DQp9DQovLy4uLiBhbmQgYXJyYXlfY29tYmluZS4uLg0KaWYg KCFmdW5jdGlvbl9leGlzdHMoImFycmF5X2NvbWJpbmUiKSkgew0KCWZ1bmN0aW9uIGFycmF5 X2NvbWJpbmUoJGFycjEsJGFycjIpIHsNCgkJJG91dCA9IGFycmF5KCk7DQoJCWZvcmVhY2go JGFycjEgYXMgJGtleTEgPT4gJHZhbHVlMSkgew0KCQkJJG91dFskdmFsdWUxXSA9ICRhcnIy WyRrZXkxXTsNCgkJfQ0KICAgCXJldHVybiAkb3V0Ow0KCX0NCn0NCi8vLi4uIGFuZCBodG1s c3BlY2lhbGNoYXJzX2RlY29kZQ0KaWYgKCFmdW5jdGlvbl9leGlzdHMoImh0bWxzcGVjaWFs Y2hhcnNfZGVjb2RlIikpIHsNCglmdW5jdGlvbiBodG1sc3BlY2lhbGNoYXJzX2RlY29kZSgk c3RyaW5nLCAkcXVvdGVfc3R5bGUgPSBFTlRfQ09NUEFUKSB7DQoJCXJldHVybiBzdHJ0cigk c3RyaW5nLCBhcnJheV9mbGlwKGdldF9odG1sX3RyYW5zbGF0aW9uX3RhYmxlKEhUTUxfU1BF Q0lBTENIQVJTLCAkcXVvdGVfc3R5bGUpKSk7DQoJfQ0KfSI7czo0OiJ0eXBlIjtzOjE6IjIi O3M6NToiZmxhZ3MiO3M6MToiMCI7czo1OiJvcmRlciI7czoxOiI1IjtzOjM6Im1kNSI7czoz MjoiYzJkYTNjOWRjY2UyZWM5ODc0OWZlOTViNDdlODQ3NWUiO30=