форум общения русскоязычных пользователей CMS Текстпаттерн
Вы не зашли.
Стоит ли вообще использовать плагин?
1. Кто-нибудь пользовался? Можете показать примеры?
2. Нет ли дыр?
Пока больше проблем, редактировал настройки (по инструкции), теперь вылезает следующий баг:
Parse error: syntax error, unexpected T_STRING in /home/aporno/public_html/textpattern/include/txp_auth.php on line 27
Вообще не знаю, как с этим бороться, жалею уже, что установил (
Неактивен
Собственно плагин не пробовал, но почему нельзя попробовать на локале, чтобы потом не приходилось жалеть об установке?
Неактивен
Да, вы, конечно, правы, но до этого всё шло как по маслу? Можно ли теперь сделать откат? Просто заменить изменённые вручную файлы на исходные?
Неактивен
Colin Foster написал:
заменить изменённые вручную файлы на исходные?
да, проблем быть не должно
Неактивен
Где можно скачать данный плагин?
С официального сайта не скачивается
Отредактированно tima (15-11-2007 16:24:46)
Неактивен
Всем страждущим посвящается.
YTo5OntzOjQ6Im5hbWUiO3M6MTc6Im1lbV9zZWxmX3JlZ2lzdGVyIjtzOjc6InZlcnNpb24iO3M6NToiMC44LjMiO3M6NjoiYXV0aG9yIjtzOjE0OiJNaWNoYWVsIE1hbmZyZSI7czoxMDoiYXV0aG9yX3VyaSI7czoxODoiaHR0cDovL21hbmZyZS5uZXQvIjtzOjExOiJkZXNjcmlwdGlvbiI7czo0OToiVXNlciBzZWxmIHJlZ2lzdHJhdGlvbi4gUmVhZCB0aGUgaGVscCB0byBpbnN0YWxsLiI7czo0OiJ0eXBlIjtpOjE7czo0OiJoZWxwIjtzOjkyMzc6IgoJPGgyPlVzZXIgU2VsZiBSZWdpc3RyYXRpb248L2gyPgoKCTxoMz5JbnN0YWxsYXRpb248L2gzPgoKCTxwPjxhIGhyZWY9ImluZGV4LnBocD9ldmVudD1zZWxmLXJlZyYjMzg7c3RlcD1wcmVpbnN0YWxsJiMzODthcmVhPWFkbWluIj5TdGFydCBJbnN0YWxsIFdpemFyZDwvYT48L3A+CgoJPGgzPlN1bW1hcnk8L2gzPgoKCTxwPlRoaXMgcGx1Z2luIGlzIGRlc2lnbmVkIHRvIGVuYWJsZSBjb21tdW5pdHkgZHJpdmVuIHNpdGVzLiBVc2VycyB3aWxsIGJlIGFibGUgdG8gcmVnaXN0ZXIgdGhlbXNlbHZlcyBmb3IgYW4gYWNjb3VudCB0byBhY2Nlc3MgdGhlIHN5c3RlbS4gVGhpcyBwbHVnaW4gaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBpZ25fdXNlcl9wYXNzd29yZCBwbHVnaW4gYWx0ZXJuYXRlIHVzZXIgdGFibGUuIFRoaXMgcGx1Z2luIHByb3ZpZGVzIHVzZXIgc2lkZSB0YWdzIGZvciBnZW5lcmF0aW5nIGFuIGh0bWwgZm9ybSB3aGVyZSB1c2VycyBjYW4gZWRpdCB0aGVpciBhY2NvdW50IGluZm9ybWF0aW9uLjwvcD4KCgk8aDM+Q2xpZW50IFBsdWctaW4gVGFnczo8L2gzPgoKCTx1bD4KCTxsaT48c3Ryb25nPm1lbV9zZWxmX3JlZ2lzdGVyX2Zvcm08L3N0cm9uZz48L2xpPgoJCTxsaT48c3Ryb25nPnNlbGZfcmVnaXN0ZXJfZW1haWxfbWVzc2FnZTwvc3Ryb25nPjwvbGk+CgkJPGxpPjxzdHJvbmc+c2VsZl9yZWdpc3Rlcl9zdGF0dXNfbWVzc2FnZTwvc3Ryb25nPjwvbGk+CgkJPGxpPjxzdHJvbmc+aWZfc2VsZl9yZWdpc3RlcmVkPC9zdHJvbmc+PC9saT4KCQk8bGk+PHN0cm9uZz5tZW1fY2hhbmdlX3Bhc3N3b3JkX2Zvcm08L3N0cm9uZz48L2xpPgoJCTxsaT48c3Ryb25nPm1lbV91c2VyX2VkaXRfZm9ybTwvc3Ryb25nPjwvbGk+CgkJPGxpPjxzdHJvbmc+bWVtX3Byb2ZpbGU8L3N0cm9uZz48L2xpPgoJPC91bD4KCgk8cD48aHIgLz48L3A+CgoJPGg0Pm1lbV9zZWxmX3JlZ2lzdGVyX2Zvcm08L2g0PgoKCTxwPlRoaXMgd2lsbCBvdXRwdXQgYW4gSFRNTCBmb3JtIHRoYXQgd2lsbCBhbGxvdyBhIHVzZXIgdG8gcmVnaXN0ZXIgdGhlbXNlbHZlcyB3aXRoIGFuIGFjY291bnQuPC9wPgoKCTxwPlRhZyBBdHRyaWJ1dGVzOjwvcD4KCgk8dWw+Cgk8bGk+PHN0cm9uZz5mb3JtPC9zdHJvbmc+JiM4MjEyO1NwZWNpZmllcyB3aGljaCBmb3JtIGNvbnRhaW5zIHRoZSBIVE1MIGZvcm0gdGVtcGxhdGUuIERlZmF1bHQgaXMgJiM4MjIwO3NlbGZfcmVnaXN0ZXJfZm9ybSYjODIyMTsuPC9saT4KCQk8bGk+PHN0cm9uZz5lbWFpbF9mb3JtPC9zdHJvbmc+JiM4MjEyO1NwZWNpZmllcyB3aGljaCBmb3JtIGNvbnRhaW5zIHRoZSBlbWFpbCBtZXNzYWdlIHRlbXBsYXRlIHRoYXQgd2lsbCBiZSBzZW50IHRvIGEgdXNlciB1cG9uIHJlZ2lzdGVyaW5nLiBEZWZhdWx0IGlzICYjODIyMDtzZWxmX3JlZ2lzdGVyX2VtYWlsJiM4MjIxOy48L2xpPgoJCTxsaT48c3Ryb25nPndyYXB0YWc8L3N0cm9uZz4mIzgyMTI7VGhlIEhUTUwgdGFnIHRoYXQgd2lsbCB3cmFwIHRoZSBnZW5lcmF0ZWQgZm9ybS4gRGVmYXVsdCBpcyBub25lLjwvbGk+CgkJPGxpPjxzdHJvbmc+aXNpemU8L3N0cm9uZz4mIzgyMTI7VGhlIHNpemUgb2YgdGhlIGlucHV0IGZpZWxkcy4gRGVmYXVsdCBpcyAyNS48L2xpPgoJCTxsaT48c3Ryb25nPmxhYmVsPC9zdHJvbmc+JiM4MjEyO1RoZSB0ZXh0IHRvIHBsYWNlIG9uIHRoZSBzdWJtaXQgYnV0dG9uLiBEZWZhdWx0IGlzIHRoZSBsb2NhbGl6ZWQgJiM4MjIwO3N1Ym1pdCYjODIyMTsuPC9saT4KCQk8bGk+PHN0cm9uZz5uYW1ld2Fybjwvc3Ryb25nPiYjODIxMjtBbiBlcnJvciBtZXNzYWdlIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgd2hlbiB0aGUgbmFtZSBmaWVsZCBpcyBsZWZ0IGJsYW5rLjwvbGk+CgkJPGxpPjxzdHJvbmc+dXNlcndhcm48L3N0cm9uZz4mIzgyMTI7QW4gZXJyb3IgbWVzc2FnZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyIHdoZW4gdGhlIHVzZXIgZmllbGQgaXMgbGVmdCBibGFuay48L2xpPgoJCTxsaT48c3Ryb25nPmVtYWlsd2Fybjwvc3Ryb25nPiYjODIxMjtBbiBlcnJvciBtZXNzYWdlIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgd2hlbiB0aGUgZW1haWwgZmllbGQgaXMgbGVmdCBibGFuay48L2xpPgoJCTxsaT48c3Ryb25nPmNsYXNzPC9zdHJvbmc+JiM4MjEyO1RoZSBjc3Mgc3R5bGUgY2xhc3MgdG8gYWRkIHRvIHRoZSB3cmFwdGFnLiBEZWZhdWx0IGlzICYjODIyMDttZW1fc2VsZl9yZWdpc3Rlcl9mb3JtJiM4MjIxOy48L2xpPgoJPC91bD4KCgk8cD5UZW1wbGF0ZSB0YWdzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aGluIHRoZSBIVE1MIHRlbXBsYXRlIGZvcm0uPC9wPgoKCTx1bD4KCTxsaT48Y29kZT4mbHQ7dHhwOm1lbV9uYW1lX3dhcm4gLyZndDs8L2NvZGU+JiM4MjEyO1RoaXMgd2lsbCBkaXNwbGF5IHRoZSBjb250ZW50cyBvZiBuYW1ld2FybiB3aGVuIHRoZSBuYW1lX2lucHV0IGZpZWxkIGlzIGxlZnQgYmxhbmsuPC9saT4KCQk8bGk+PGNvZGU+Jmx0O3R4cDptZW1fdXNlcl93YXJuIC8mZ3Q7PC9jb2RlPiYjODIxMjtUaGlzIHdpbGwgZGlzcGxheSB0aGUgY29udGVudHMgb2YgdXNlcndhcm4gd2hlbiB0aGUgdXNlcl9pbnB1dCBmaWVsZCBpcyBsZWZ0IGJsYW5rLjwvbGk+CgkJPGxpPjxjb2RlPiZsdDt0eHA6bWVtX2VtYWlsX3dhcm4gLyZndDs8L2NvZGU+JiM4MjEyO1RoaXMgd2lsbCBkaXNwbGF5IHRoZSBjb250ZW50cyBvZiBlbWFpbHdhcm4gd2hlbiB0aGUgZW1haWxfaW5wdXQgZmllbGQgaXMgbGVmdCBibGFuay48L2xpPgoJCTxsaT48Y29kZT4mbHQ7dHhwOm1lbV9uYW1lX2lucHV0IC8mZ3Q7PC9jb2RlPiYjODIxMjtUaGlzIHdpbGwgZGlzcGxheSB0aGUgbmFtZSBmaWVsZC48L2xpPgoJCTxsaT48Y29kZT4mbHQ7dHhwOm1lbV91c2VyX2lucHV0IC8mZ3Q7PC9jb2RlPiYjODIxMjtUaGlzIHdpbGwgZGlzcGxheSB0aGUgdXNlciBmaWVsZC48L2xpPgoJCTxsaT48Y29kZT4mbHQ7dHhwOm1lbV9lbWFpbF9pbnB1dCAvJmd0OzwvY29kZT4mIzgyMTI7VGhpcyB3aWxsIGRpc3BsYXkgdGhlIGVtYWlsIGZpZWxkLjwvbGk+CgkJPGxpPjxjb2RlPiZsdDt0eHA6bWVtX3N1Ym1pdCAvJmd0OzwvY29kZT4mIzgyMTI7VGhpcyB3aWxsIGRpc3BsYXkgdGhlIHN1Ym1pdCBidXR0b24uPC9saT4KCTwvdWw+CgoJPHA+U3RhcnRlciBUZW1wbGF0ZTo8L3A+Cgo8Y29kZT48YnIgLz4KTmFtZTogJmx0O3R4cDptZW1fbmFtZV9pbnB1dCAvJmd0OyZsdDticiAvJmd0OzxiciAvPgpVc2VyIE5hbWU6ICZsdDt0eHA6bWVtX3VzZXJfaW5wdXQgLyZndDsmbHQ7YnIgLyZndDs8YnIgLz4KRW1haWw6ICZsdDt0eHA6bWVtX2VtYWlsX2lucHV0IC8mZ3Q7Jmx0O2JyIC8mZ3Q7PGJyIC8+CiZsdDt0eHA6bWVtX3N1Ym1pdCAvJmd0OzxiciAvPgo8L2NvZGU+CgoJPHA+VGVtcGxhdGUgdGFncyB0aGF0IGNhbiBiZSB1c2VkIHdpdGhpbiB0aGUgZW1haWwgdGVtcGxhdGUgZm9ybS4gSW4gYWRkaXRpb24gdG8gdGhlIHRhZ3MgbGlzdGVkIGJlbG93LCBhbnkgb3RoZXIgVGV4dHBhdHRlcm4gdGFnIGNhbiBiZSB1c2VkLjwvcD4KCgk8dWw+Cgk8bGk+PGNvZGU+Jmx0O3R4cDptZW1fbmFtZSAvJmd0OzwvY29kZT4mIzgyMTI7VGhlIG5hbWUgc3VibWl0dGVkIGJ5IHRoZSB1c2VyLjwvbGk+CgkJPGxpPjxjb2RlPiZsdDt0eHA6bWVtX3VzZXJuYW1lIC8mZ3Q7PC9jb2RlPiYjODIxMjtUaGUgdXNlcm5hbWUgc3VibWl0dGVkIGJ5IHRoZSB1c2VyLjwvbGk+CgkJPGxpPjxjb2RlPiZsdDt0eHA6bWVtX2VtYWlsIC8mZ3Q7PC9jb2RlPiYjODIxMjtUaGUgZW1haWwgYWRkcmVzcyBzdWJtaXR0ZWQgYnkgdGhlIHVzZXIuPC9saT4KCQk8bGk+PGNvZGU+Jmx0O3R4cDptZW1fcGFzc3dvcmQgLyZndDs8L2NvZGU+JiM4MjEyO1RoZSBwYXNzd29yZCBnZW5lcmF0ZWQgZm9yIHRoZSB1c2VyLjwvbGk+CgkJPGxpPjxjb2RlPiZsdDt0eHA6bWVtX3NpdGVuYW1lIC8mZ3Q7PC9jb2RlPiYjODIxMjtUaGUgc2l0ZSBuYW1lIGFzIHNwZWNpZmllZCBpbiB0aGUgU2l0ZSBDb25maWd1cmF0aW9uIChwcmVmcyB0YWIpLjwvbGk+CgkJPGxpPjxjb2RlPiZsdDt0eHA6bWVtX3NpdGV1cmwgLyZndDs8L2NvZGU+JiM4MjEyO1RoZSB1cmwgdG8gdGhlIGZyb250IHBhZ2Ugb2YgdGhpcyBzaXRlLjwvbGk+CgkJPGxpPjxjb2RlPiZsdDt0eHA6bWVtX2xvZ2ludXJsIC8mZ3Q7PC9jb2RlPiYjODIxMjtUaGUgdXJsIHRvIHRoZSBUZXh0cGF0dGVybiBsb2cgaW4gcGFnZS48L2xpPgoJCTxsaT48Y29kZT4mbHQ7dHhwOm1lbV9hZG1pbl9uYW1lIC8mZ3Q7PC9jb2RlPiYjODIxMjtUaGUgbmFtZSBvZiB0aGUgYWRtaW5pc3RyYXRpdmUgY29udGFjdC4gVGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgaW4gdGhlIGVtYWlsIGZyb20gZmllbGQuPC9saT4KCQk8bGk+PGNvZGU+Jmx0O3R4cDptZW1fYWRtaW5fZW1haWwgLyZndDs8L2NvZGU+JiM4MjEyO1RoZSBlbWFpbCBhZGRyZXNzIG9mIHRoZSBhZG1pbmlzdHJhdGl2ZSBjb250YWN0LiBUaGlzIHdpbGwgYXV0b21hdGljYWxseSBiZSBpbiB0aGUgZW1haWwgZnJvbSBmaWVsZC48L2xpPgoJPC91bD4KCgk8cD5TdGFydGVyIFRlbXBsYXRlOjwvcD4KCjxjb2RlPjxiciAvPgpEZWFyICZsdDt0eHA6bWVtX25hbWUgLyZndDssCiAgVGhhbmsgeW91IGZvciByZWdpc3RlcmluZyBmb3IgJmx0O3R4cDptZW1fc2l0ZW5hbWUgLyZndDsuIEJlbG93IGFyZSB5b3UgdXNlciBhY2NvdW50IGRldGFpbHMuCgoJPHA+VXNlcm5hbWU6ICZsdDt0eHA6bWVtX3VzZXJuYW1lIC8mZ3Q7PGJyIC8+ClBhc3N3b3JkOiAmbHQ7dHhwOm1lbV9wYXNzd29yZCAvJmd0OzxiciAvPgpTaXRlIFVSTDogJmx0O3R4cDptZW1fc2l0ZXVybCAvJmd0OzxiciAvPgpMb2dpbiBVUkw6ICZsdDt0eHA6bWVtX2xvZ2ludXJsIC8mZ3Q7PC9wPgoKCTxwPlNpbmNlcmVseSw8YnIgLz4KJmx0O3R4cDptZW1fYWRtaW5fbmFtZSAvJmd0OzxiciAvPgpFbWFpbDogJmx0O3R4cDptZW1fYWRtaW5fZW1haWwgLyZndDs8YnIgLz4KPC9jb2RlPjwvcD4KCgk8cD5FeGFtcGxlOjwvcD4KCgk8cD48Y29kZT48YnIgLz4KJmx0O3R4cDptZW1fc2VsZl9yZWdpc3Rlcl9mb3JtIHdyYXB0YWc9ImRpdiIgaXNpemU9IjIwIiBsYWJlbD0iUmVnaXN0ZXIiIG5hbWV3YXJuPSJOYW1lIGlzIHJlcXVpcmVkIiB1c2Vyd2Fybj0iVXNlcm5hbWUgaXMgcmVxdWlyZWQiIGVtYWlsd2Fybj0iRW1haWwgYWRkcmVzcyBpcyByZXF1aXJlZCIgLyZndDs8YnIgLz4KPC9jb2RlPjwvcD4KCgk8cD48aHIgLz48L3A+CgoJPGg0PnNlbGZfcmVnaXN0ZXJfc3RhdHVzX21lc3NhZ2U8L2g0PgoKCTxwPlRoaXMgd2lsbCBvdXRwdXQgdGhlIHN0YXR1cyBtZXNzYWdlIGdlbmVyYXRlZCBhZnRlciBzdWJtaXR0aW5nIHRoZSBzZWxmIHJlZ2lzdHJhdGlvbiBmb3JtLjwvcD4KCgk8cD48aHIgLz48L3A+CgoJPGg0PnNlbGZfcmVnaXN0ZXJfZW1haWxfbWVzc2FnZTwvaDQ+CgoJPHA+QWZ0ZXIgdGhlIGZvcm0gaXMgc3VibWl0dGVkLCB0aGlzIHdpbGwgb3V0cHV0IHRoZSBlbnRpcmUgZW1haWwgbWVzc2FnZSB0aGF0IHdhcyBzZW50IHRvIHRoZSB1c2VyLjwvcD4KCgk8cD48aHIgLz48L3A+CgoJPGg0PmlmX3NlbGZfcmVnaXN0ZXJlZDwvaDQ+CgoJPHA+VGhpcyB3aWxsIG91dHB1dCB0aGUgY29udGVudHMgb2YgdGhlIHRhZyBpZiB0aGUgdXNlciBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQuIFRvIHdvcmsgcHJvcGVybHksIHRoaXMgcmVxdWlyZXMgYnJvd3NlciBjb29raWVzIGFmdGVyIHRoZSBpbml0aWFsIGZvcm0gc3VibWlzc2lvbi4gVGhpcyB0YWcgc3VwcG9ydHMgPGNvZGU+Jmx0O3R4cDplbHNlIC8mZ3Q7PC9jb2RlPjwvcD4KCgk8cD5FeGFtcGxlOjwvcD4KCgk8cD48Y29kZT48YnIgLz4KJmx0O3R4cDppZl9zZWxmX3JlZ2lzdGVyZWQmZ3Q7PGJyIC8+CllvdSBhbHJlYWR5IGhhdmUgYW4gYWNjb3VudC48YnIgLz4KJmx0O3R4cDplbHNlIC8mZ3Q7PGJyIC8+CiZsdDt0eHA6bWVtX3NlbGZfcmVnaXN0ZXJfZm9ybSAvJmd0OzxiciAvPgombHQ7L3R4cDppZl9zZWxmX3JlZ2lzdGVyZWQmZ3Q7PGJyIC8+CjwvY29kZT48L3A+CgoJPHA+PGhyIC8+PC9wPgoKCTxoND5tZW1fY2hhbmdlX3Bhc3N3b3JkX2Zvcm08L2g0PgoKCTxwPlRoaXMgdGFnIGFsbG93cyBhIGNoYW5nZSBwYXNzd29yZCBmb3JtIHRvIGJlIGRpc3BsYXllZCBvbiB0aGUgdXNlciBwb3J0aW9uIG9mIHRoZSB3ZWJzaXRlLiBUaGlzIGlzIG1lYW50IHRvIGJlIHVzZWQgd2l0aCB0aGUgaWduX3Bhc3N3b3JkX3Byb3RlY3QgcGx1Z2luLiBUaGlzIHRhZyBzdXBwb3J0cyB0aGUgdGFnIHR4cDptZW1fcHJvZmlsZSAoc2VlIGJlbG93KS48L3A+CgoJPHA+VGFnIEF0dHJpYnV0ZXM6PC9wPgoKCTx1bD4KCTxsaT48c3Ryb25nPmZvcm08L3N0cm9uZz4mIzgyMTI7U3BlY2lmaWVzIHdoaWNoIGZvcm0gY29udGFpbnMgdGhlIEhUTUwgZm9ybSB0ZW1wbGF0ZS4gVGhpcyBmb3JtIHdpbGwgYmUgcmVwYXJzZWQgYnkgVHhwLiBEZWZhdWx0IGlzIG5vbmUuIElmIG5vdCBzcGVjaWZpZWQsIGEgZGVmYXVsdCBmb3JtIHdpbGwgYmUgdXNlZC48L2xpPgoJCTxsaT48c3Ryb25nPmZvcm1fbWFpbDwvc3Ryb25nPiYjODIxMjtTcGVjaWZpZXMgd2hpY2ggZm9ybSBjb250YWlucyB0aGUgbWVzc2FnZSB0ZW1wbGF0ZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIG1lc3NhZ2UgdGhhdCB3aWxsIGJlIGVtYWlsZWQgdG8gdGhlIHVzZXIuIERlZmF1bHQgaXMgbm9uZS4gSWYgbm90IHNwZWNpZmllZCwgYSBkZWZhdWx0IG1lc3NhZ2UgdGVtcGxhdGUgd2lsbCBiZSB1c2VkLjwvbGk+CgkJPGxpPjxzdHJvbmc+d3JhcHRhZzwvc3Ryb25nPiYjODIxMjtUaGUgSFRNTCB0YWcgdGhhdCB3aWxsIHdyYXAgdGhlIGdlbmVyYXRlZCBmb3JtLiBEZWZhdWx0IGlzIG5vbmUuPC9saT4KCQk8bGk+PHN0cm9uZz5jbGFzczwvc3Ryb25nPiYjODIxMjtUaGUgY3NzIHN0eWxlIGNsYXNzIHRvIGFkZCB0byB0aGUgd3JhcHRhZy4gRGVmYXVsdCBpcyAmIzgyMjA7bWVtX3Bhc3N3b3JkX2Zvcm0mIzgyMjE7LjwvbGk+Cgk8L3VsPgoKCTxwPlRlbXBsYXRlIHRhZ3MgdGhhdCBjYW4gYmUgdXNlZCB3aXRoaW4gdGhlICYjODIxNjtmb3JtJiM4MjE3OyB0ZW1wbGF0ZSBmb3JtLjwvcD4KCgk8dWw+Cgk8bGk+PGNvZGU+Jmx0O3R4cDptZW1fcGFzc3dvcmRfaW5wdXQgLyZndDs8L2NvZGU+JiM4MjEyO1RoaXMgd2lsbCBkaXNwbGF5IGEgcGFzc3dvcmQgZm9ybSBmaWVsZDwvbGk+CgkJPGxpPjxjb2RlPiZsdDt0eHA6bWVtX3N1Ym1pdCAvJmd0OzwvY29kZT4mIzgyMTI7VGhpcyB3aWxsIGRpc3BsYXkgYSBmb3JtIHN1Ym1pdCBidXR0b248L2xpPgoJPC91bD4KCgk8cD5UZW1wbGF0ZSB0YWdzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aGluIHRoZSAmIzgyMTY7Zm9ybV9tYWlsJiM4MjE3OyB0ZW1wbGF0ZSBmb3JtLjwvcD4KCgk8dWw+Cgk8bGk+PGNvZGU+Jmx0O3R4cDptZW1fcmVhbG5hbWUgLyZndDs8L2NvZGU+JiM4MjEyO1RoaXMgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSB1c2VyJiM4MjE3O3MgcmVhbCBuYW1lLjwvbGk+CgkJPGxpPjxjb2RlPiZsdDt0eHA6bWVtX3Bhc3N3b3JkIC8mZ3Q7PC9jb2RlPiYjODIxMjtUaGlzIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgdXNlciYjODIxNztzIHBhc3N3b3JkLjwvbGk+Cgk8L3VsPgoKCTxwPjxociAvPjwvcD4KCgk8aDQ+bWVtX3VzZXJfZWRpdF9mb3JtPC9oND4KCgk8cD5UaGlzIHRhZyBhbGxvd3MgYSBmb3JtIHRvIG1vZGlmeSB1c2VyIGluZm9ybWF0aW9uIHRvIGJlIGRpc3BsYXllZCBvbiB0aGUgdXNlciBwb3J0aW9uIG9mIHRoZSB3ZWJzaXRlLiBUaGlzIGlzIG1lYW50IHRvIGJlIHVzZWQgd2l0aCB0aGUgaWduX3Bhc3N3b3JkX3Byb3RlY3QgcGx1Z2luLiBUaGlzIHRhZyBzdXBwb3J0cyB0aGUgdGFnIHR4cDptZW1fcHJvZmlsZS48L3A+CgoJPHA+VGFnIEF0dHJpYnV0ZXM6PC9wPgoKCTx1bD4KCTxsaT48c3Ryb25nPmZvcm08L3N0cm9uZz4mIzgyMTI7U3BlY2lmaWVzIHdoaWNoIGZvcm0gY29udGFpbnMgdGhlIEhUTUwgZm9ybSB0ZW1wbGF0ZS4gVGhpcyBmb3JtIHdpbGwgYmUgcmVwYXJzZWQgYnkgVHhwLiBEZWZhdWx0IGlzIG5vbmUuPC9saT4KCQk8bGk+PHN0cm9uZz53cmFwdGFnPC9zdHJvbmc+JiM4MjEyO1RoZSBIVE1MIHRhZyB0aGF0IHdpbGwgd3JhcCB0aGUgZ2VuZXJhdGVkIGZvcm0uIERlZmF1bHQgaXMgbm9uZS48L2xpPgoJCTxsaT48c3Ryb25nPmNsYXNzPC9zdHJvbmc+JiM4MjEyO1RoZSBjc3Mgc3R5bGUgY2xhc3MgdG8gYWRkIHRvIHRoZSB3cmFwdGFnLiBEZWZhdWx0IGlzICYjODIyMDttZW1fdWVkaXRfZm9ybSYjODIyMTsuPC9saT4KCTwvdWw+CgoJPHA+VGVtcGxhdGUgdGFncyB0aGF0IGNhbiBiZSB1c2VkIHdpdGhpbiB0aGUgSFRNTCB0ZW1wbGF0ZSBmb3JtLjwvcD4KCgk8dWw+Cgk8bGk+PGNvZGU+Jmx0O3R4cDptZW1fbWVzc2FnZSAvJmd0OzwvY29kZT4mIzgyMTI7VGhpcyB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIG1lc3NhZ2UgZ2VuZXJhdGVkIGZyb20gc3VibWl0dGluZyB0aGUgZm9ybS48L2xpPgoJCTxsaT48Y29kZT4mbHQ7dHhwOm1lbV9yZWFsbmFtZV9pbnB1dCAvJmd0OzwvY29kZT4mIzgyMTI7VGhpcyB3aWxsIGRpc3BsYXkgYSBmb3JtIGZpZWxkIGZvciBjaGFuZ2luZyB0aGUgdXNlciYjODIxNztzIFJlYWwgTmFtZS48L2xpPgoJCTxsaT48Y29kZT4mbHQ7dHhwOm1lbV9lbWFpbF9pbnB1dCAvJmd0OzwvY29kZT4mIzgyMTI7VGhpcyB3aWxsIGRpc3BsYXkgYSBmb3JtIGZpZWxkIGZvciBjaGFuZ2luZyB0aGUgdXNlciYjODIxNztzIGVtYWlsIGFkZHJlc3MuPC9saT4KCQk8bGk+PGNvZGU+Jmx0O3R4cDptZW1fc3VibWl0IC8mZ3Q7PC9jb2RlPiYjODIxMjtUaGlzIHdpbGwgZGlzcGxheSBhIGZvcm0gc3VibWl0IGJ1dHRvbjwvbGk+Cgk8L3VsPgoKCTxoND5tZW1fcHJvZmlsZTwvaDQ+CgoJPHA+VGhpcyB0YWcgd2lsbCBvdXRwdXQgdGhlIHZhbHVlcyBvZiB0aGUgdXNlciYjODIxNztzIHByb2ZpbGUuPC9wPgoKCTxwPlRhZyBBdHRyaWJ1dGVzOjwvcD4KCgk8dWw+Cgk8bGk+PHN0cm9uZz52YXI8L3N0cm9uZz4mIzgyMTI7U3BlY2lmaWVzIHRoZSBwcm9maWxlIHZhbHVlIG5hbWUgdG8gb3V0cHV0LiBTdXBwb3J0ZWQgdmFsdWVzIGFyZSAmIzgyMjA7UmVhbE5hbWUmIzgyMjE7LCYjODIyMTtlbWFpbCYjODIyMTssIGFuZCAmIzgyMjA7bmV3X3Bhc3MmIzgyMjE7LjwvbGk+Cgk8L3VsPgoKCgoKICI7czo0OiJjb2RlIjtzOjI2OTg3OiIKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIFBsdWdpbiBtZW1fc2VsZl9yZWdpc3RlcgovLyBBdXRob3I6IE1pY2hhZWwgTWFuZnJlIChodHRwOi8vbWFuZnJlLm5ldC8pCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21lbV9zZXRfcHJlZicpKSB7CglmdW5jdGlvbiBtZW1fc2V0X3ByZWYoJG5hbWUsICR2YWwsICRldmVudCwgICR0eXBlLCAkcG9zaXRpb249MCwgJGh0bWw9J3RleHRfaW5wdXQnKQoJewoJCWdsb2JhbCAkcHJlZl9jYWNoZTsKCgkJaWYgKCRwcmVmX2NhY2hlPT1udWxsKQoJCQkkcHJlZl9jYWNoZSA9IGFycmF5KCk7CgoJCSRhcmdzID0gZnVuY19nZXRfYXJncygpOwoJCSRhcmdzWydodG1sJ10gPSAkaHRtbDsKCQkkYXJnc1sncG9zaXRpb24nXSA9ICRwb3NpdGlvbjsKCQkkYXJnc1sncHJlZnNfaWQnXSA9IDE7CgoJCSRwcmVmX2NhY2hlWyRuYW1lXSA9ICRhcmdzOwoKCQlleHRyYWN0KGRvU2xhc2goJGFyZ3MpKTsKCiAgICAJaWYgKCFzYWZlX3JvdygiKiIsICd0eHBfcHJlZnMnLCAibmFtZSA9ICckbmFtZSciKSApIHsKICAgICAgICAJcmV0dXJuIHNhZmVfaW5zZXJ0KCd0eHBfcHJlZnMnLCAiCgkJCQluYW1lICA9ICckbmFtZScsCgkJCQl2YWwgICA9ICckdmFsJywKCQkJCWV2ZW50ID0gJyRldmVudCcsCgkJCQlodG1sICA9ICckaHRtbCcsCgkJCQl0eXBlICA9ICckdHlwZScsCgkJCQlwb3NpdGlvbiA9ICckcG9zaXRpb24nLAoJCQkJcHJlZnNfaWQgPSAxIgoJCQkpOwogICAgCX0gZWxzZSB7CiAgICAgICAgCXJldHVybiBzYWZlX3VwZGF0ZSgJJ3R4cF9wcmVmcycsICIKCSAgICAgICAgCQkJCQkJdmFsICAgPSAnJHZhbCcsCgkgICAgICAgIAkJCQkJCWV2ZW50ID0gJyRldmVudCcsCgkgICAgICAgIAkJCQkJCWh0bWwgID0gJyRodG1sJywKCSAgICAgICAgCQkJCQkJdHlwZSAgPSAnJHR5cGUnLAoJICAgICAgICAJCQkJCQlwb3NpdGlvbiA9ICckcG9zaXRpb24nIiwKICAgICAgICAJCQkJCQkibmFtZSBsaWtlICckbmFtZSciKTsKICAgIAl9CiAgICAJcmV0dXJuIGZhbHNlOwoJfQp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWVtX2dldF9wcmVmJykpIHsKCWZ1bmN0aW9uIG1lbV9nZXRfcHJlZigkbmFtZSwkdmFsPScnKQoJewoJCWdsb2JhbCAkcHJlZl9jYWNoZTsKCgkJaWYgKCRwcmVmX2NhY2hlPT1udWxsKQoJCQkkcHJlZl9jYWNoZSA9IGFycmF5KCk7CgoJCWlmICghaW5fYXJyYXkoJG5hbWUsJHByZWZfY2FjaGUpIG9yICRwcmVmX2NhY2hlWyRuYW1lXSA9PT0gZmFsc2UpIHsKCQkJJHByZWZfY2FjaGVbJG5hbWVdID0gc2FmZV9yb3coJyonLCd0eHBfcHJlZnMnLCJuYW1lPSckbmFtZSciKTsKCQl9IGVsc2UgewoJCQkkcHJlZl9jYWNoZVskbmFtZV0gPSBmYWxzZTsKCQl9CgoJCWlmICghZW1wdHkoJHZhbCkgJiYgaW5fYXJyYXkoJHZhbCwkcHJlZl9jYWNoZVskbmFtZV0pKQoJCQlyZXR1cm4gJHByZWZfY2FjaGVbJG5hbWVdWyR2YWxdOwoJCWVsc2UKCQkJcmV0dXJuICRwcmVmX2NhY2hlWyRuYW1lXTsKCX0KfQoKZ2xvYmFsICRtZW1fc2VsZl9sYW5nOwoKaWYgKCFpc19hcnJheSgkbWVtX3NlbGZfbGFuZykpCnsKCSRtZW1fc2VsZl9sYW5nID0gYXJyYXkoCgkJJ3lvdXJfbG9naW5faW5mbycJPT4JJ1lvdXIgTG9naW4gSW5mbycsCgkJJ2FkbWluX25hbWUnCQk9PgknQWRtaW4gTmFtZScsCgkJJ2FkbWluX2VtYWlsJwkJPT4JJ0FkbWluIEVtYWlsJywKCQkncGFzc3dvcmRfc2VudF90bycJPT4JJ1Bhc3N3b3JkIFNlbnQgVG8nLAoJCSdlcnJvcl9hZGRpbmdfbmV3X2F1dGhvcicJPT4JJ0Vycm9yIGFkZGluZyBuZXcgYXV0aG9yJywKCQknZ3JlZXRpbmcnCQkJPT4JJ0hlbGxvJywKCQkneW91cl9wYXNzd29yZF9pcycJPT4JJ1lvdXIgcGFzc3dvcmQgaXMnLAoJCSd5b3VyX25ld19wYXNzd29yZCcJPT4JJ1lvdXIgbmV3IHBhc3N3b3JkJywKCQkncGFzc3dvcmRfY2hhbmdlZCcJPT4JJ1Bhc3N3b3JkIGNoYW5nZWQnLAoJCSdwYXNzd29yZF9jaGFuZ2VfZmFpbGVkJwk9PgknRmFpbGVkIHRvIGNoYW5nZSBwYXNzd29yZCcsCgkJJ2xvZ19pbl9hdCcJCQk9PgknTG9nIGluIGF0JywKCQknc2F2ZWRfdXNlcl9wcm9maWxlJwk9PgknU2F2ZWQgVXNlciBQcm9maWxlJywKCQkndXNlcl9leGlzdHMnCQk9PgknVXNlcm5hbWUgYWxyZWFkeSBleGlzdHMuIFBsZWFzZSB0cnkgYW5vdGhlciBuYW1lJywKCSk7Cn0KCmZ1bmN0aW9uIG1lbV9zZWxmX2dUeHQoJG5hbWUpCnsKCWdsb2JhbCAkbWVtX3NlbGZfbGFuZzsKCgkkZ3R4dCA9IGdUeHQoJG5hbWUpOwoKCWlmICggc3RyY21wKCRndHh0LCRuYW1lKSA9PSAwICkKCXsKCQlpZiAoIGFycmF5X2tleV9leGlzdHMoJG5hbWUsJG1lbV9zZWxmX2xhbmcpICkKCQkJJGd0eHQgPSAkbWVtX3NlbGZfbGFuZ1skbmFtZV07Cgl9CgoJcmV0dXJuICRndHh0Owp9CgpnbG9iYWwgJGV2ZW50OwoKaWYgKCFpc3NldCgkZXZlbnQpKSAkZXZlbnQgPSAnJzsKCmlmICgkZXZlbnQgIT0gJ2FkbWluJykgewoJcmVxdWlyZV9vbmNlIHR4cGF0aC4nL2luY2x1ZGUvdHhwX2FkbWluLnBocCc7CgoJZ2xvYmFsICRsZXZlbHM7CgoJLy8gY29waWVkIGZyb20gdHhwX2FkbWluLnBocAoJJGxldmVscyA9IGFycmF5KAoJCTAgPT4gbWVtX3NlbGZfZ1R4dCgnbm9uZScpLAoJCTYgPT4gbWVtX3NlbGZfZ1R4dCgnZGVzaWduZXInKSwKCQk1ID0+IG1lbV9zZWxmX2dUeHQoJ2ZyZWVsYW5jZXInKSwKCQk0ID0+IG1lbV9zZWxmX2dUeHQoJ3N0YWZmX3dyaXRlcicpLAoJCTMgPT4gbWVtX3NlbGZfZ1R4dCgnY29weV9lZGl0b3InKSwKCQkyID0+IG1lbV9zZWxmX2dUeHQoJ21hbmFnaW5nX2VkaXRvcicpLAoJCTEgPT4gbWVtX3NlbGZfZ1R4dCgncHVibGlzaGVyJykKCSk7CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCWlmICghZnVuY3Rpb25fZXhpc3RzKCdwcml2X2xldmVscycpKSB7CgkJZnVuY3Rpb24gcHJpdl9sZXZlbHMoJGl0ZW0sICR2YXIpIHsKCQkJZ2xvYmFsICRsZXZlbHM7CgoJCQlyZXR1cm4gc2VsZWN0SW5wdXQoJGl0ZW0sICRsZXZlbHMsICR2YXIpOwoJCX0KCX0KfQoKCmdsb2JhbCAkbWVtX3NlbGY7CgokbWVtX3NlbGYgPSBhcnJheSgKCQkJCSdhZG1pbl9lbWFpbCcJCT0+CScnLAoJCQkJJ2FkbWluX25hbWUnCQk9PgknJywKCQkJCSduZXdfdXNlcl9wcml2JwkJPT4JJzAnLAoJCQkJJ3N0YXR1cycJCQk9PglmYWxzZSwKCQkJCSdzdGF0dXNfbWVzc2FnZScJPT4JJ1lvdSBhcmUgYWxyZWFkeSByZWdpc3RlcmVkLicsCgkJCQknZW1haWxfbWVzc2FnZScJCT0+CScnCgkJCSk7CgokbWVtX3NlbGZbJ2FkbWluX2VtYWlsJ10gPSBtZW1fZ2V0X3ByZWYoJ21lbV9zZWxmX2FkbWluX2VtYWlsJywndmFsJyk7IC8vc2FmZV9maWVsZCgndmFsJywndHhwX3ByZWZzJywibmFtZT0nbWVtX3NlbGZfYWRtaW5fZW1haWwnIik7CiRtZW1fc2VsZlsnYWRtaW5fbmFtZSddID0gbWVtX2dldF9wcmVmKCdtZW1fc2VsZl9hZG1pbl9uYW1lJywndmFsJyk7IC8vc2FmZV9maWVsZCgndmFsJywndHhwX3ByZWZzJywibmFtZT0nbWVtX3NlbGZfYWRtaW5fbmFtZSciKTsKJG1lbV9zZWxmWyduZXdfdXNlcl9wcml2J10gPSBtZW1fZ2V0X3ByZWYoJ21lbV9zZWxmX25ld191c2VyX3ByaXYnLCd2YWwnKTsgLy9zYWZlX2ZpZWxkKCd2YWwnLCd0eHBfcHJlZnMnLCJuYW1lPSdtZW1fc2VsZl9uZXdfdXNlcl9wcml2JyIpOwoKaWYgKCBAdHhwaW50ZXJmYWNlID09ICdhZG1pbicgKSB7CglyZWdpc3Rlcl9jYWxsYmFjaygnbWVtX3NlbGZfcmVnaXN0ZXInLCdzZWxmLXJlZycsJycsIDEpOwoJaWYgKCRldmVudD09J3NlbGYtcmVnJykgewoJCS8vIGZha2UgdGFicyB3aGVuIHVzaW5nIHRoZW0uIFNpbGVuY2VzIHdhcm5pbmdzIGZyb20gcGFnZVRvcCgpCgkJcmVnaXN0ZXJfdGFiKCdhZG1pbicsJ3NlbGYtcmVnJywnc2VsZi1yZWcnKTsKCgkJaW5jbHVkZV9vbmNlIHR4cGF0aC4nL3B1Ymxpc2gvdGFnaGFuZGxlcnMucGhwJzsKCX0KCglmdW5jdGlvbiBtZW1fc2VsZl9yZWdpc3RlcigkZXZlbnQsICRzdGVwKSB7CgkJaWYgKCRldmVudCE9J3NlbGYtcmVnJykKCQkJcmV0dXJuOwoKCQlwYWdlVG9wKCdTZWxmIFJlZ2lzdHJhdGlvbicsJycpOwoKCQlpZiAoJHN0ZXAgPT0gJ2luc3RhbGwnKSB7CgkJCWVjaG8gbWVtX3NlbGZfcmVnaXN0ZXJfaW5zdGFsbCgpOwoJCX0gZWxzZSBpZiAoJHN0ZXA9PSdwcmVpbnN0YWxsJykgewoJCQkkbWVtX2FkbWluX25hbWUJPSBtZW1fZ2V0X3ByZWYoJ21lbV9zZWxmX2FkbWluX25hbWUnKTsKCQkJJG1lbV9hZG1pbl9lbWFpbAk9IG1lbV9nZXRfcHJlZignbWVtX3NlbGZfYWRtaW5fZW1haWwnKTsKCQkJJG1lbV9uZXdfdXNlcl9wcml2CT0gbWVtX2dldF9wcmVmKCdtZW1fc2VsZl9uZXdfdXNlcl9wcml2Jyk7CgkJCSRtZW1fdXNlX2lnbl9kYgk9IG1lbV9nZXRfcHJlZignbWVtX3NlbGZfdXNlX2lnbl9kYicpOwoJCQkkbWVtX3h0cmFfY29sdW1ucwk9IG1lbV9nZXRfZXh0cmFfdXNlcl9jb2x1bW5zKCk7CgoJCQkkbWVtX2FkbWluX25hbWUgPSBAJG1lbV9hZG1pbl9uYW1lID8gJG1lbV9hZG1pbl9uYW1lWyd2YWwnXSA6ICdBZG1pbic7CgkJCSRtZW1fYWRtaW5fZW1haWwgPSBAJG1lbV9hZG1pbl9lbWFpbCA/ICRtZW1fYWRtaW5fZW1haWxbJ3ZhbCddIDogJ0FkbWluQHlvdXJkb21haW4uY29tJzsKCQkJJG1lbV9uZXdfdXNlX3ByaXYgPSBAJG1lbV9uZXdfdXNlX3ByaXYgPyAkbWVtX25ld191c2VfcHJpdlsndmFsJ10gOiAnMCc7CgoJCQkkdXNlX2lnbl9pbnB1dCA9ICcnOwoJCQkvLyBpcyBpZ25fcGFzc3dvcmRfcHJvdGVjdCBsb2FkZWQgb24gdGhlIHN5c3RlbT8KCQkJaWYgKGxvYWRfcGx1Z2luKCdpZ25fcGFzc3dvcmRfcHJvdGVjdCcpIHx8ICRtZW1fdXNlX2lnbl9kYikgewoJCQkJJG1lbV91c2VfaWduX2RiID0gJG1lbV91c2VfaWduX2RiID8gJG1lbV91c2VfaWduX2RiWyd2YWwnXSA6ICcwJzsKCQkJCSR1c2VfaWduX2lucHV0ID0geWVzbm9yYWRpbygndXNlX2lnbl9kYicsJG1lbV91c2VfaWduX2RiKTsKCQkJfQoKCQkJJHh0cmFfY29sdW1ucyA9IG1lbV9nZXRfZXh0cmFfdXNlcl9jb2x1bW5zKCk7CgkJCSRoYXNfYWRkcmVzcyA9IGluX2FycmF5KCdhZGRyZXNzJywkeHRyYV9jb2x1bW5zKTsKCQkJJGhhc19waG9uZSA9IGluX2FycmF5KCdwaG9uZScsJHh0cmFfY29sdW1ucyk7CgoJCQkkYWRkX2FkZHJlc3NfaW5wdXQgPSB5ZXNub3JhZGlvKCdhZGRfYWRkcmVzcycsJzAnKTsKCQkJJGFkZF9waG9uZV9pbnB1dCA9IHllc25vcmFkaW8oJ2FkZF9waG9uZScsJzAnKTsKCgkJCWVjaG8gZm9ybSgKCQkJCWVJbnB1dCgnc2VsZi1yZWcnKS5zSW5wdXQoJ2luc3RhbGwnKS4KCQkJCXN0YXJ0VGFibGUoJ2VkaXQnKSAuCgkJCQkJdHIoIGZMYWJlbENlbGwoJ2FkbWluX25hbWUnKQkuIHRkYShmSW5wdXQoJ3RleHQnLCdhZG1pbl9uYW1lJywkbWVtX2FkbWluX25hbWUsJ2VkaXQnKSkgKSAuCgkJCQkJdHIoIGZMYWJlbENlbGwoJ2FkbWluX2VtYWlsJykJLiB0ZGEoZklucHV0KCd0ZXh0JywnYWRtaW5fZW1haWwnLCRtZW1fYWRtaW5fZW1haWwsJ2VkaXQnKSkgKSAuCgkJCQkJdHIoIGZMYWJlbENlbGwoJ25ld191c2VyX3ByaXYnKQkuIHRkYShwcml2X2xldmVscygnbmV3X3VzZXJfcHJpdicsJG1lbV9uZXdfdXNlX3ByaXYpKSApIC4KCQkJCQl0ciggZkxhYmVsQ2VsbCgndXNlX2lnbl9kYicpCS4gdGRhKCR1c2VfaWduX2lucHV0KSApIC4KCQkJCQkoJGhhc19hZGRyZXNzID8gJycgOiB0ciggZkxhYmVsQ2VsbCgnYWRkX2FkZHJlc3NfZmllbGQnKSAuIHRkYSgkYWRkX2FkZHJlc3NfaW5wdXQpICkgKSAuCgkJCQkJKCRoYXNfcGhvbmUgPyAnJyA6IHRyKCBmTGFiZWxDZWxsKCdhZGRfcGhvbmVfZmllbGQnKSAuIHRkYSgkYWRkX3Bob25lX2lucHV0KSApICkgLgoJCQkJCXRyKCB0ZCgpIC4gdGQoIGZJbnB1dCgic3VibWl0IiwgJ3N1Ym1pdCcsbWVtX3NlbGZfZ1R4dCgnaW5zdGFsbCcpLCJQdWJsaXNoIiksIDIgKSApIC4KCQkJCWVuZFRhYmxlKCkKCQkJCSk7CgkJfSBlbHNlIHsKCQkJZWNobyAnPGRpdj48YSBocmVmPSI/ZXZlbnQ9c2VsZi1yZWcmc3RlcD1wcmVpbnN0YWxsIj4nLm1lbV9zZWxmX2dUeHQoJ2luc3RhbGwnKS4nPC9hPjwvZGl2Pic7CgkJfQoJfQoKCglmdW5jdGlvbiBtZW1fc2VsZl9yZWdpc3Rlcl9pbnN0YWxsKCkgewoJCWdsb2JhbCAkbWVtX3NlbGY7CgoJCWV4dHJhY3QoZG9TbGFzaChncHNhKGFycmF5KAoJCQknYWRtaW5fZW1haWwnLAoJCQknYWRtaW5fbmFtZScsCgkJCSduZXdfdXNlcl9wcml2JywKCQkJJ3VzZV9pZ25fZGInLAoJCQknYWRkX2FkZHJlc3MnLAoJCQknYWRkX3Bob25lJwoJCSkpKSk7CgoJCWlmICghaXNzZXQoJG5ld191c2VyX3ByaXYpIHx8IGVtcHR5KCRuZXdfdXNlcl9wcml2KSkgJG5ld191c2VyX3ByaXYgPSAnMCc7CgoJCSRsb2cgPSBhcnJheSgpOwoKCQlpZiAoISgkcnM9c2FmZV9maWVsZCgndmFsLGh0bWwnLCd0eHBfcHJlZnMnLCJuYW1lPSdtZW1fc2VsZl91c2VfaWduX2RiJyIpKSkgewoJCQlpZiAoIG1lbV9zZXRfcHJlZignbWVtX3NlbGZfdXNlX2lnbl9kYicsJHVzZV9pZ25fZGIsJ3NlbGZfcmVnJywxLCd5ZXNub3JhZGlvJykpIHsKCQkJCSRsb2dbXSA9ICJBZGRlZCBwcmVmICdtZW1fc2VsZl91c2VfaWduX2RiJyI7CgkJCX0gZWxzZSB7CgkJCQkkbG9nW10gPSAiRmFpbGVkIHRvIGFkZCBwcmVmICdtZW1fc2VsZl91c2VfaWduX2RiJy4gIiAuIG15c3FsX2Vycm9yKCk7CgkJCX0KCQl9IGVsc2UgewoJCQlpZiAoJHJzWydodG1sJ10gIT0gJ3llc25vcmFkaW8nKSB7CgkJCQlzYWZlX3VwZGF0ZSgndHhwX3ByZWZzJywiaHRtbD0neWVzbm9yYWRpbyciLCJuYW1lPSdtZW1fc2VsZl91c2VfaWduX2RiJyIpOwoJCQl9CgkJCSRsb2dbXSA9ICJQcmVmICdtZW1fc2VsZl91c2VfaWduX2RiJyBpcyBhbHJlYWR5IGluc3RhbGxlZC4gQ3VycmVudCB2YWx1ZSBpcyAneyRyc30nLiI7CgkJfQoKCQkkdXNlcl90YWJsZSA9IG1lbV9nZXRfdXNlcl90YWJsZV9uYW1lKCk7CgoJCSR4dHJhX2NvbHVtbnMgPSBtZW1fZ2V0X2V4dHJhX3VzZXJfY29sdW1ucygpOwoJCWlmICgkYWRkX2FkZHJlc3MpIHsKCQkJaWYgKCFpbl9hcnJheSgnYWRkcmVzcycsJHh0cmFfY29sdW1ucykpIHsKCQkJCWlmIChzYWZlX2FsdGVyKCR1c2VyX3RhYmxlLCJBREQgYGFkZHJlc3NgIFZBUkNIQVIoIDEyOCApIikpIHsKCQkJCQkkbG9nW10gPSAiQWRkZWQgY29sdW1uICdhZGRyZXNzJyB0byB1c2VyIHRhYmxlICd7JHVzZXJfdGFibGV9JyI7CgkJCQl9IGVsc2UgewoJCQkJCSRsb2dbXSA9ICJGYWlsZWQgdG8gYWRkIGNvbHVtbiAnYWRkcmVzcycgdG8gdXNlciB0YWJsZSAneyR1c2VyX3RhYmxlfScuICIgLiBteXNxbF9lcnJvcigpOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJJGxvZ1tdID0gIlRhYmxlIHskdXNlcl90YWJsZX0gYWxyZWFkeSBoYXMgY29sdW1uICdhZGRyZXNzJyI7CgkJCX0KCQl9CgkJaWYgKCRhZGRfcGhvbmUpIHsKCQkJaWYgKCFpbl9hcnJheSgncGhvbmUnLCR4dHJhX2NvbHVtbnMpKSB7CgkJCQlpZiAoc2FmZV9hbHRlcigkdXNlcl90YWJsZSwiQUREIGBwaG9uZWAgVkFSQ0hBUiggMzIgKSIpKSB7CgkJCQkJJGxvZ1tdID0gIkFkZGVkIGNvbHVtbiAncGhvbmUnIHRvIHVzZXIgdGFibGUgJ3skdXNlcl90YWJsZX0nIjsKCQkJCX0gZWxzZSB7CgkJCQkJJGxvZ1tdID0gIkZhaWxlZCB0byBhZGQgY29sdW1uICdwaG9uZScgdG8gdXNlciB0YWJsZSAneyR1c2VyX3RhYmxlfScuICIgLiBteXNxbF9lcnJvcigpOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJJGxvZ1tdID0gIlRhYmxlIHskdXNlcl90YWJsZX0gYWxyZWFkeSBoYXMgY29sdW1uICdwaG9uZSciOwoJCQl9CgkJfQoKCQlpZiAoISgkcnM9c2FmZV9maWVsZCgndmFsJywndHhwX3ByZWZzJywibmFtZT0nbWVtX3NlbGZfYWRtaW5fZW1haWwnIikpKSB7CgkJCWlmICggbWVtX3NldF9wcmVmKCdtZW1fc2VsZl9hZG1pbl9lbWFpbCcsJGFkbWluX2VtYWlsLCdzZWxmX3JlZycsMSkpIHsKCQkJCSRsb2dbXSA9ICJBZGRlZCBwcmVmICdtZW1fc2VsZl9hZG1pbl9lbWFpbCciOwoJCQl9IGVsc2UgewoJCQkJJGxvZ1tdID0gIkZhaWxlZCB0byBhZGQgcHJlZiAnbWVtX3NlbGZfYWRtaW5fZW1haWwnLiAiIC4gbXlzcWxfZXJyb3IoKTsKCQkJfQoJCX0gZWxzZSB7CgkJCSRsb2dbXSA9ICJQcmVmICdtZW1fc2VsZl9hZG1pbl9lbWFpbCcgaXMgYWxyZWFkeSBpbnN0YWxsZWQuIEN1cnJlbnQgdmFsdWUgaXMgJ3skcnN9Jy4iOwoJCX0KCQlpZiAoISgkcnM9c2FmZV9maWVsZCgndmFsJywndHhwX3ByZWZzJywibmFtZT0nbWVtX3NlbGZfYWRtaW5fbmFtZSciKSkpIHsKCQkJaWYgKCBtZW1fc2V0X3ByZWYoJ21lbV9zZWxmX2FkbWluX25hbWUnLCRhZG1pbl9uYW1lLCdzZWxmX3JlZycsMSkpIHsKCQkJCSRsb2dbXSA9ICJBZGRlZCBwcmVmICdtZW1fc2VsZl9hZG1pbl9uYW1lJyI7CgkJCX0gZWxzZSB7CgkJCQkkbG9nW10gPSAiRmFpbGVkIHRvIGFkZCBwcmVmICdtZW1fc2VsZl9hZG1pbl9uYW1lJy4gIiAuIG15c3FsX2Vycm9yKCk7CgkJCX0KCQl9IGVsc2UgewoJCQkkbG9nW10gPSAiUHJlZiAnbWVtX3NlbGZfYWRtaW5fbmFtZScgaXMgYWxyZWFkeSBpbnN0YWxsZWQuIEN1cnJlbnQgdmFsdWUgaXMgJ3skcnN9Jy4iOwoJCX0KCQlpZiAoKCRycz1zYWZlX2ZpZWxkKCd2YWwsaHRtbCcsJ3R4cF9wcmVmcycsIm5hbWU9J21lbV9zZWxmX25ld191c2VyX3ByaXYnIikpID09PSBmYWxzZSkgewoJCQlpZiAoIG1lbV9zZXRfcHJlZignbWVtX3NlbGZfbmV3X3VzZXJfcHJpdicsJG5ld191c2VyX3ByaXYsJ3NlbGZfcmVnJywxLCdwcml2X2xldmVscycpKSB7CgkJCQkkbG9nW10gPSAiQWRkZWQgcHJlZiAnbWVtX3NlbGZfbmV3X3VzZXJfcHJpdicgd2l0aCB2YWx1ZSBvZiAneyRuZXdfdXNlcl9wcml2fSciOwoJCQkJJG1lbV9zZWxmWyduZXdfdXNlcl9wcml2J10gPSAkbmV3X3VzZXJfcHJpdjsKCQkJfSBlbHNlIHsKCQkJCSRsb2dbXSA9ICJGYWlsZWQgdG8gYWRkIHByZWYgJ21lbV9zZWxmX25ld3VzZXJfcHJpdicuICIgLiBteXNxbF9lcnJvcigpOwoJCQl9CgkJfSBlbHNlIHsKCQkJaWYgKCRyc1snaHRtbCddICE9ICdwcml2X2xldmVscycpCgkJCQlzYWZlX3VwZGF0ZSgndHhwX3ByZWZzJywiaHRtbD0ncHJpdl9sZXZlbHMnIiwibmFtZT0nbWVtX3NlbGZfbmV3X3VzZXJfcHJpdiciKTsKCgkJCSRsb2dbXSA9ICJQcmVmICdtZW1fc2VsZl9uZXdfdXNlcl9wcml2JyBpcyBhbHJlYWR5IGluc3RhbGxlZC4gQ3VycmVudCB2YWx1ZSBpcyAneyRyc30nLiI7CgkJfQoKCQkvLyBjcmVhdGUgZGVmYXVsdCByZWdpc3RyYXRpb24gZm9ybQoJCSRmb3JtX2h0bWwgPSA8PDxFT0YKPHRhYmxlPgo8dHI+Cgk8dGQ+RnVsbCBOYW1lPC90ZD4KCTx0ZD48dHhwOm1lbV9uYW1lX2lucHV0IC8+PC90ZD4KCTx0ZD48dHhwOm1lbV9uYW1lX3dhcm4gLz48L3RkPgo8L3RyPgo8dHI+Cgk8dGQ+VXNlcm5hbWU8L3RkPgoJPHRkPjx0eHA6bWVtX3VzZXJfaW5wdXQgLz48L3RkPgoJPHRkPjx0eHA6bWVtX3VzZXJfd2FybiAvPjwvdGQ+CjwvdHI+Cjx0cj4KCTx0ZD5FbWFpbDwvdGQ+Cgk8dGQ+PHR4cDptZW1fZW1haWxfaW5wdXQgLz48L3RkPgoJPHRkPjx0eHA6bWVtX2VtYWlsX3dhcm4gLz48L3RkPgo8L3RyPgo8dHI+Cgk8dGQgY29sc3Bhbj0iMyI+PHR4cDptZW1fc3VibWl0IC8+PC90ZD4KPC90cj4KPC90YWJsZT4KRU9GOwoKCQkkZm9ybSA9IGZldGNoKCdGb3JtJywndHhwX2Zvcm0nLCduYW1lJywnc2VsZl9yZWdpc3Rlcl9mb3JtJyk7CgkJaWYgKCEkZm9ybSkgewoJCQlpZiAoc2FmZV9pbnNlcnQoJ3R4cF9mb3JtJywibmFtZT0nc2VsZl9yZWdpc3Rlcl9mb3JtJyx0eXBlPSdtaXNjJyxGb3JtPSd7JGZvcm1faHRtbH0nIikpIHsKCQkJCSRsb2dbXSA9ICJBZGRlZCBmb3JtICdzZWxmX3JlZ2lzdGVyX2Zvcm0nIjsKCQkJfSBlbHNlIHsKCQkJCSRsb2dbXSA9ICJGYWlsZWQgdG8gYWRkIGZvcm0gJ3NlbGZfcmVnaXN0ZXJfZm9ybScuICIgLiBteXNxbF9lcnJvcigpLmJyLgoJCQkJCSJZb3UgbmVlZCB0byBtYW51YWxseSBjcmVhdGUgYSBmb3JtIHRlbXBsYXRlLiBIZXJlIGlzIGFuIGV4YW1wbGUuIi5ici4KCQkJCQknPHRleHRwYXR0ZXJuIHN0eWxlPSJ3aWR0aDozMDBweDtoZWlnaHQ6MTUwcHg7Ij4nLmh0bWxzcGVjaWFsY2hhcnMoJGZvcm1faHRtbCkuJzwvdGV4dGFyZWE+JzsKCQkJfQoJCX0gZWxzZSB7CgkJCSRsb2dbXSA9ICJGb3VuZCBmb3JtICdzZWxmX3JlZ2lzdGVyX2Zvcm0nLiBTa2lwcGluZyBpbnN0YWxsYXRpb24gb2YgZGVmYXVsdCBmb3JtLiI7CgkJfQoKCQkvLyBjcmVhdGUgZGVmYXVsdCBzdWNjZXNzZnVsIHJlZ2lzdHJhdGlvbiBmb3JtIHRvIHNob3cgdGhlIHVzZXIKCQkkZm9ybV9odG1sID0gPDw8RU9GCjxoMz5BY2NvdW50IENyZWF0ZWQ8L2gzPgo8cD5BbiBlbWFpbCBjb250YWluaW5nIHlvdXIgcGFzc3dvcmQgaGFzIGJlZW4gc2VudCB0byA8dHhwOm1lbV9wcm9maWxlIHZhcj0iZW1haWwiIC8+LjwvcD4KRU9GOwoKCQkkZm9ybSA9IGZldGNoKCdGb3JtJywndHhwX2Zvcm0nLCduYW1lJywnc2VsZl9yZWdpc3Rlcl9zdWNjZXNzJyk7CgkJaWYgKCEkZm9ybSkgewoJCQlpZiAoc2FmZV9pbnNlcnQoJ3R4cF9mb3JtJywibmFtZT0nc2VsZl9yZWdpc3Rlcl9zdWNjZXNzJyx0eXBlPSdtaXNjJyxGb3JtPSd7JGZvcm1faHRtbH0nIikpIHsKCQkJCSRsb2dbXSA9ICJBZGRlZCBmb3JtICdzZWxmX3JlZ2lzdGVyX3N1Y2Nlc3MnIjsKCQkJfSBlbHNlIHsKCQkJCSRsb2dbXSA9ICJGYWlsZWQgdG8gYWRkIGZvcm0gJ3NlbGZfcmVnaXN0ZXJfc3VjY2VzcycuICIgLiBteXNxbF9lcnJvcigpLmJyLgoJCQkJCSJZb3UgbmVlZCB0byBtYW51YWxseSBjcmVhdGUgYSBmb3JtIHRlbXBsYXRlLiBIZXJlIGlzIGFuIGV4YW1wbGUuIi5ici4KCQkJCQknPHRleHRwYXR0ZXJuIHN0eWxlPSJ3aWR0aDozMDBweDtoZWlnaHQ6MTUwcHg7Ij4nLmh0bWxzcGVjaWFsY2hhcnMoJGZvcm1faHRtbCkuJzwvdGV4dGFyZWE+JzsKCQkJfQoJCX0gZWxzZSB7CgkJCSRsb2dbXSA9ICJGb3VuZCBmb3JtICdzZWxmX3JlZ2lzdGVyX3N1Y2Nlc3MnLiBTa2lwcGluZyBpbnN0YWxsYXRpb24gb2YgZGVmYXVsdCBmb3JtLiI7CgkJfQoKCQkvLyBjcmVhdGUgZGVmYXVsdCBzdWNjZXNzZnVsIHJlZ2lzdHJhdGlvbiBlbWFpbCBmb3JtCgkJJGZvcm1faHRtbCA9IDw8PEVPRgpEZWFyIDx0eHA6bWVtX25hbWUgLz4sCgpUaGFuayB5b3UgZm9yIHJlZ2lzdGVyaW5nIGF0IDx0eHA6bWVtX3NpdGV1cmwgLz4uCgpZb3VyIGxvZ2luIG5hbWU6IDx0eHA6bWVtX3VzZXJuYW1lIC8+CllvdXIgcGFzc3dvcmQ6IDx0eHA6bWVtX3Bhc3N3b3JkIC8+CgpJZiB5b3UgaGF2ZSBhbnkgcXVlc3Rpb25zIHBsZWFzZSByZXBseSB0byB0aGlzIGVtYWlsIGFkZHJlc3MuCgpTaW5jZXJlbHksCjx0eHA6bWVtX2FkbWluX25hbWUgLz4KPHR4cDptZW1fYWRtaW5fZW1haWwgLz4KRU9GOwoKCQkkZm9ybSA9IGZldGNoKCdGb3JtJywndHhwX2Zvcm0nLCduYW1lJywnc2VsZl9yZWdpc3Rlcl9lbWFpbCcpOwoJCWlmICghJGZvcm0pIHsKCQkJaWYgKHNhZmVfaW5zZXJ0KCd0eHBfZm9ybScsIm5hbWU9J3NlbGZfcmVnaXN0ZXJfZW1haWwnLHR5cGU9J21pc2MnLEZvcm09J3skZm9ybV9odG1sfSciKSkgewoJCQkJJGxvZ1tdID0gIkFkZGVkIGZvcm0gJ3NlbGZfcmVnaXN0ZXJfZW1haWwnIjsKCQkJfSBlbHNlIHsKCQkJCSRsb2dbXSA9ICJGYWlsZWQgdG8gYWRkIGZvcm0gJ3NlbGZfcmVnaXN0ZXJfZW1haWwnLiAiIC4gbXlzcWxfZXJyb3IoKS5ici4KCQkJCQkiWW91IG5lZWQgdG8gbWFudWFsbHkgY3JlYXRlIGEgZm9ybSB0ZW1wbGF0ZS4gSGVyZSBpcyBhbiBleGFtcGxlLiIuYnIuCgkJCQkJJzx0ZXh0cGF0dGVybiBzdHlsZT0id2lkdGg6MzAwcHg7aGVpZ2h0OjE1MHB4OyI+Jy5odG1sc3BlY2lhbGNoYXJzKCRmb3JtX2h0bWwpLic8L3RleHRhcmVhPic7CgkJCX0KCQl9IGVsc2UgewoJCQkkbG9nW10gPSAiRm91bmQgZm9ybSAnc2VsZl9yZWdpc3Rlcl9mb3JtJy4gU2tpcHBpbmcgaW5zdGFsbGF0aW9uIG9mIGRlZmF1bHQgZm9ybS4iOwoJCX0KCgkJJHRhZ19oZWxwID0gJzx0eHA6bWVtX3NlbGZfcmVnaXN0ZXJfZm9ybSBmb3JtPSJzZWxmX3JlZ2lzdGVyX2Zvcm0iIC8+JzsKCQkkbG9nW10gPSAnRXhhbXBsZSB0YWcgdG8gdXNlIGluIHlvdXIgcGFnZSB0ZW1wbGF0ZS4nLmJyLgoJCQknPHRleHRhcmVhIHN0eWxlPSJ3aWR0aDo0MDBweDtoZWlnaHQ6NDBweDsiPicuaHRtbHNwZWNpYWxjaGFycygkdGFnX2hlbHApLic8L3RleHRhcmVhPic7CgoJCXJldHVybiBkb1dyYXAoJGxvZywndWwnLCdsaScpOwoJfQp9CgpmdW5jdGlvbiBtZW1fZ2V0X3VzZXJfdGFibGVfbmFtZSgpIHsKCSR1c2VfaWduX2RiID0gbWVtX2dldF9wcmVmKCdtZW1fc2VsZl91c2VfaWduX2RiJyk7CgoJJHRhYmxlX25hbWUgPSAndHhwX3VzZXJzJzsKCglpZiAoJHVzZV9pZ25fZGIpIHsKCQkkaWduX3VzZV9jdXN0b20gPSBtZW1fZ2V0X3ByZWYoJ2lnbl91c2VfY3VzdG9tJyk7CgkJaWYgKCRpZ25fdXNlX2N1c3RvbSAmJiAkaWduX3VzZV9jdXN0b21bJ3ZhbCddPT0nMScpIHsKCQkJJGlnbl91c2VyX2RiID0gbWVtX2dldF9wcmVmKCdpZ25fdXNlcl9kYicpOwoJCQlpZiAoJGlnbl91c2VyX2RiICYmICFlbXB0eSgkaWduX3VzZXJfZGJbJ3ZhbCddKSkKCQkJCSR0YWJsZV9uYW1lID0gJGlnbl91c2VyX2RiWyd2YWwnXTsKCQl9Cgl9CglyZXR1cm4gJHRhYmxlX25hbWU7Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZnVuY3Rpb24gbWVtX3NlbGZfcmVnaXN0ZXJfZm9ybSgkYXR0cywkdGhpbmc9JycpCnsKCWdsb2JhbCAkdHhwYWM7CgoJJG5hbWV3YXJuID0gJHVzZXJ3YXJuID0gJGVtYWlsd2FybiA9ICcnOwoKCWV4dHJhY3QoZG9TbGFzaChwc2EoYXJyYXkoJ2V2ZW50Jywnc3RlcCcsJ25hbWUnLCdlbWFpbCcsJ3VzZXJuYW1lJywnYWRkcmVzcycsJ3Bob25lJywnbWVtX3NlbGZfcmVnaXN0ZXInKSkpKTsKCglleHRyYWN0KGxBdHRzKGFycmF5KAoJCSdjbGFzcycJCT0+IF9fRlVOQ1RJT05fXywKCQknZm9ybScJCT0+ICdzZWxmX3JlZ2lzdGVyX2Zvcm0nLAoJCSdzdWNjZXNzX2Zvcm0nCT0+ICdzZWxmX3JlZ2lzdGVyX3N1Y2Nlc3MnLAoJCSdlbWFpbF9mb3JtJwk9PiAnc2VsZl9yZWdpc3Rlcl9lbWFpbCcsCgkJJ3dyYXB0YWcnCT0+ICcnLAoJCSdpc2l6ZScJCT0+ICcyNScsCgkJJ2xhYmVsJwkJPT4gbWVtX3NlbGZfZ1R4dCgnc3VibWl0JyksCgkJJ25hbWV3YXJuJwk9PiBtZW1fc2VsZl9nVHh0KCduYW1lX3JlcXVpcmVkJyksCgkJJ3VzZXJ3YXJuJwk9PiBtZW1fc2VsZl9nVHh0KCd1c2VyX3JlcXVpcmVkJyksCgkJJ2VtYWlsd2FybicJPT4gbWVtX3NlbGZfZ1R4dCgnZW1haWxfcmVxdWlyZWQnKSwKCSksJGF0dHMpKTsKCgkkbmFtZSA9IHRyaW0oJG5hbWUpOwoJJHVzZXJuYW1lID0gdHJpbSgkdXNlcm5hbWUpOwoJJGVtYWlsID0gdHJpbSgkZW1haWwpOwoJJHBob25lID0gdHJpbSgkcGhvbmUpOwoJJGFkZHJlc3MgPSB0cmltKCRhZGRyZXNzKTsKCgkkc2F2ZWQgPSBmYWxzZTsKCglpZiAoJGV2ZW50PT0nc2VsZi1yZWcnICYmICRzdGVwPT0ncmVnaXN0ZXInKSB7CgkJaWYgKCFpc192YWxpZF9mb3JtKCkpIHsKCQkJJG5hbWV3YXJuID0gZW1wdHkoJG5hbWUpID8gJG5hbWV3YXJuIDogJyc7CgkJCSR1c2Vyd2FybiA9IGVtcHR5KCR1c2VybmFtZSkgPyAkdXNlcndhcm4gOiAnJzsKCQkJLy8gaWYgYWxsIGZpZWxkcyBhcmUgbm9uIGVtcHR5LCB0aGVuIHRoZSBlbWFpbCBhZGRyZXNzIGZhaWxlZCBmb3Igc29tZSByZWFzb24uCgkJCSRlbWFpbHdhcm4gPSBlbXB0eSgkZW1haWwpID8gJGVtYWlsd2FybiA6IChlbXB0eSgkbmFtZXdhcm4pIGFuZCBlbXB0eSgkdXNlcndhcm4pID8gJGVtYWlsd2FybiA6ICcnKTsKCQl9IGVsc2UgewoKCQkJJHJzID0gc2FmZV9maWVsZCgnbmFtZScsbWVtX2dldF91c2VyX3RhYmxlX25hbWUoKSwibmFtZT0neyR1c2VybmFtZX0nIik7CgoJCQlpZiAoZW1wdHkoJHJzKSkgewoJCQkJbWVtX3NlbGZfcmVnaXN0ZXJfc2F2ZSgpOwoJCQkJJHNhdmVkID0gdHJ1ZTsKCQkJfSBlbHNlIHsKCQkJCS8vIGRvbid0IGNoYW5nZSAkdXNlcndhcm4KCQkJCSRuYW1ld2FybiA9ICRlbWFpbHdhcm4gPSAnJzsKCQkJfQoJCX0KCX0gZWxzZSB7CgkJLy8gZG9uJ3Qgc2hvdyB0aGUgd2FybmluZ3MKCQkkbmFtZXdhcm4gPSAnJzsKCQkkdXNlcndhcm4gPSAnJzsKCQkkZW1haWx3YXJuID0gJyc7Cgl9CgoJaWYgKEAkc2F2ZWQpIHsKCQkkRm9ybSA9IGZldGNoX2Zvcm0oJHN1Y2Nlc3NfZm9ybSk7CgkJJG91dCA9IHBhcnNlKCRGb3JtKTsKCX0gZWxzZSB7CgoJCSRGb3JtID0gZmV0Y2hfZm9ybSgkZm9ybSk7CgoJCSR2YWxzID0gYXJyYXkoCgkJCSduYW1lX3dhcm4nCQk9PiAkbmFtZXdhcm4sCgkJCSd1c2VyX3dhcm4nCQk9PiAkdXNlcndhcm4sCgkJCSdlbWFpbF93YXJuJwk9PiAkZW1haWx3YXJuLAoJCQknbmFtZV9pbnB1dCcJPT4gZklucHV0KCd0ZXh0JywnbmFtZScsICAkbmFtZSwgJ3JlZ2lzdGVyX25hbWVfaW5wdXQnLCcnLCcnLCRpc2l6ZSwiMCIsICdtZW1fbmFtZV9pbnB1dCcpLAoJCQkndXNlcl9pbnB1dCcJPT4gZklucHV0KCd0ZXh0JywndXNlcm5hbWUnLCAkdXNlcm5hbWUsICdyZWdpc3Rlcl91c2VyX2lucHV0JywgJycsICcnLCAkaXNpemUsICIwIiwgJ21lbV91c2VyX2lucHV0JyksCgkJCSdlbWFpbF9pbnB1dCcJPT4gZklucHV0KCd0ZXh0JywnZW1haWwnLCAkZW1haWwsJ3JlZ2lzdGVyX2VtYWlsX2lucHV0JywnJywnJywkaXNpemUsIjAiLCAnbWVtX2VtYWlsX2lucHV0JyksCgkJCSdzdWJtaXQnCQk9PiBmSW5wdXQoJ3N1Ym1pdCcsJ3N1Ym1pdCcsbWVtX3NlbGZfZ1R4dCgkbGFiZWwpLCdidXR0b24nKSwKCQkJJ3Bob25lX2lucHV0Jwk9PiBmSW5wdXQoJ3RleHQnLCdwaG9uZScsICRwaG9uZSwgJ3JlZ2lzdGVyX3Bob25lX2lucHV0JywgJycsICcnLCAkaXNpemUsICIwIiwgJ21lbV9waG9uZV9pbnB1dCcpLAoJCQknYWRkcmVzc19pbnB1dCcJPT4gZklucHV0KCd0ZXh0JywnYWRkcmVzcycsICRhZGRyZXNzLCAncmVnaXN0ZXJfYWRkcmVzc19pbnB1dCcsICcnLCAnJywgJGlzaXplLCAiMCIsICdtZW1fYWRkcmVzc19pbnB1dCcpLAoJCSk7CgoJCWZvcmVhY2ggKCR2YWxzIGFzICRhPT4kYikgewoJCQkkRm9ybSA9IHN0cl9yZXBsYWNlKCc8dHhwOm1lbV8nLiRhLicgLz4nLCRiLCRGb3JtKTsKCQl9CgoJCSRhY3Rpb25fdXJsID0gJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ107CgkJJHFzID0gc3RycG9zKCRhY3Rpb25fdXJsLCc/Jyk7CgkJaWYgKCRxcykgJGFjdGlvbl91cmwgPSBzdWJzdHIoJGFjdGlvbl91cmwsIDAsICRxcyk7CgoJCSRvdXQgPQluLm4uIjxmb3JtIGVuY3R5cGU9J211bHRpcGFydC9mb3JtLWRhdGEnIGFjdGlvbj0neyRhY3Rpb25fdXJsfScgbWV0aG9kPSdwb3N0Jz4iIC4KCQkJCWVJbnB1dCgnc2VsZi1yZWcnKSAuIHNJbnB1dCgncmVnaXN0ZXInKSAuIGhJbnB1dCgnZW1haWxfZm9ybScsJGVtYWlsX2Zvcm0pIC4gaElucHV0KCdtZW1fc2VsZl9yZWdpc3RlcicsJ3JlZ2lzdGVyJykgLgoJCQkJcGFyc2UoJEZvcm0pIC4KCQkJCSI8L2Zvcm0+Ii5uOwoJfQoKCXJldHVybiBkb1RhZygkb3V0LCR3cmFwdGFnLCRjbGFzcyk7Cgp9CgpmdW5jdGlvbiBtZW1fZ2V0X2V4dHJhX3VzZXJfY29sdW1uc19pbnNlcnRfc3RyaW5nKCkgewoJJHh0cmFfY29sdW1ucyA9IG1lbV9nZXRfZXh0cmFfdXNlcl9jb2x1bW5zKCk7CgoJJHh0cmEgPSAnJzsKCglmb3JlYWNoICgkeHRyYV9jb2x1bW5zIGFzICR4Y29sKSB7CgkJJG5hbWUgPSAkeGNvbFsnRmllbGQnXTsKCQkkdHlwZSA9IHN0cnRvbG93ZXIoJHhjb2xbJ1R5cGUnXSk7CgkJJHZhbCA9IGdwcygkbmFtZSk7CgoJCWlmICggc3Ryc3RyKCR0eXBlLCdpbnQnKQoJCQkJfHwgJHR5cGU9PSdmbG9hdCcKCQkJCXx8ICR0eXBlPT0nZGVjaW1hbCcKCQkJCXx8ICR0eXBlPT0nZG91YmxlJwoJCQkJfHwgJHR5cGU9PSdib29sJyApIHsKCQkJLy8gZG9uJ3QgcXVvdGUgdmFsdWUKCQkJJHh0cmEgLj0gIiwgeyRuYW1lfT0iIC4gZG9TbGFzaCgkdmFsKTsKCQl9IGVsc2UgewoJCQkvLyBxdW90ZSB2YWx1ZQoJCQkkeHRyYSAuPSAiLCB7JG5hbWV9PSciIC4gZG9TbGFzaCgkdmFsKSAuIiciOwoJCX0KCX0KCglyZXR1cm4gJHh0cmE7Cn0KCmZ1bmN0aW9uIG1lbV9nZXRfZXh0cmFfdXNlcl9jb2x1bW5zKCkKewoJc3RhdGljICRkZWZhdWx0X2NvbHVtbnMgPSBhcnJheSgndXNlcl9pZCcsJ25hbWUnLCdwYXNzJywnUmVhbE5hbWUnLCdlbWFpbCcsJ3ByaXZzJywnbGFzdF9hY2Nlc3MnLCdub25jZScpOwoJc3RhdGljICR4dHJhX2NvbHVtbnMgPSBmYWxzZTsKCglpZiAoaXNfYXJyYXkoJHh0cmFfY29sdW1ucykpCgkJcmV0dXJuICR4dHJhX2NvbHVtbnM7CgoJJHRhYmxlX25hbWUgPSBtZW1fZ2V0X3VzZXJfdGFibGVfbmFtZSgpOwoJJHR4cGRlc2MgPSBnZXRSb3dzKCdkZXNjcmliZSAnLlBGWC4gJHRhYmxlX25hbWUpOwoKCSR4dHJhX2NvbHMgPSBhcnJheSgpOwoKCSRkY29scyA9ICRkZWZhdWx0X2NvbHVtbnM7CgoJZm9yZWFjaCgkdHhwZGVzYyBhcyAkcikgewoJCWlmICggIWluX2FycmF5KCRyWydGaWVsZCddLCAkZGVmYXVsdF9jb2x1bW5zKSApCgkJCSR4dHJhX2NvbHNbXSA9ICRyOwoJfQoKCXJldHVybiAkeHRyYV9jb2xzOwp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmZ1bmN0aW9uIG1lbV9zZWxmX3JlZ2lzdGVyX3NhdmUoKQp7CglnbG9iYWwgJG1lbV9zZWxmLCRzaXRlbmFtZSwkbWVtX3Byb2ZpbGU7CgoJZXh0cmFjdChkb1NsYXNoKHBzYShhcnJheSgnbmFtZScsJ2VtYWlsJywndXNlcm5hbWUnLCdlbWFpbF9mb3JtJywnYWRkcmVzcycsJ3Bob25lJywnbWVtX3NlbGZfcmVnaXN0ZXInLCdsb2dpbl91cmwnKSkpKTsKCWV4dHJhY3QoJG1lbV9zZWxmKTsKCglpZiAoJG1lbV9zZWxmX3JlZ2lzdGVyICE9ICdyZWdpc3RlcicpIHJldHVybiAnJzsKCgkkcHcgPSBnZW5lcmF0ZV9wYXNzd29yZCg2KTsKCglpZiAoISRtZW1fcHJvZmlsZSkgJG1lbV9wcm9maWxlID0gYXJyYXkoKTsKCgkkbWVtX3Byb2ZpbGVbJ25vbmNlJ10gPSAkbm9uY2UgPSBtZDUoIHVuaXFpZCggcmFuZCgpLCB0cnVlICkgKTsKCgkkbWVtX3Byb2ZpbGVbJ1JlYWxOYW1lJ10gPSAkbmFtZSA9IHRyaW0oJG5hbWUpOwoJJG1lbV9wcm9maWxlWydlbWFpbCddID0gJGVtYWlsID0gdHJpbSgkZW1haWwpOwoJJG1lbV9wcm9maWxlWyduYW1lJ10gPSAkdXNlcm5hbWUgPSB0cmltKCR1c2VybmFtZSk7CgkkbWVtX3Byb2ZpbGVbJ3ByaXZzJ10gPSAkbmV3X3VzZXJfcHJpdjsKCgkkeHRyYV9jb2x1bW5zID0gbWVtX2dldF9leHRyYV91c2VyX2NvbHVtbnMoKTsKCglmb3JlYWNoKCR4dHJhX2NvbHVtbnMgYXMgJGMpIHsKCQkkY19uYW1lID0gdHJpbSggJGNbJ0ZpZWxkJ10gKTsKCgkJJG1lbV9wcm9maWxlWyRjX25hbWVdID0gZ3BzKCRjX25hbWUpOwoJfQoKCSRycyA9IGZhbHNlOwoKCSR4dHJhID0gbWVtX2dldF9leHRyYV91c2VyX2NvbHVtbnNfaW5zZXJ0X3N0cmluZygpOwoKCSRycyA9IHNhZmVfaW5zZXJ0KAoJCW1lbV9nZXRfdXNlcl90YWJsZV9uYW1lKCksCgkJInByaXZzICAgID0gJyRuZXdfdXNlcl9wcml2JywKCQkgbmFtZSAgICAgPSAnJHVzZXJuYW1lJywKCQkgZW1haWwgICAgPSAnJGVtYWlsJywKCQkgUmVhbE5hbWUgPSAnJG5hbWUnLAoJCSBwYXNzICAgICA9ICBwYXNzd29yZChsb3dlcignJHB3JykpLAoJCSBub25jZSAgICA9ICckbm9uY2UnIiAuICR4dHJhCgkpOwoKCWlmICgkcnMpIHsKCQkkbWVtX3Byb2ZpbGVbJ3VzZXJfaWQnXSA9ICRyczsKCQkkbWVtX3Byb2ZpbGVbJ2xhc3RfYWNjZXNzJ10gPSAwOwoKCQlpZiAoJGVtYWlsX2Zvcm0pIHsKCQkJJG1lc3NhZ2UgPSBmZXRjaCgnRm9ybScsJ3R4cF9mb3JtJywnbmFtZScsJGVtYWlsX2Zvcm0pOwoKCQkJaWYgKGlzX2FycmF5KCRhZG1pbl9uYW1lKSkKCQkJCSRhZG1pbl9uYW1lID0gJGFkbWluX25hbWVbJ3ZhbCddOwoJCQlpZiAoaXNfYXJyYXkoJGFkbWluX2VtYWlsKSkKCQkJCSRhZG1pbl9lbWFpbCA9ICRhZG1pbl9lbWFpbFsndmFsJ107CgoJCQlpZiAoZW1wdHkoJGxvZ2luX3VybCkpCgkJCQkkbG9naW5fdXJsID0gcnRyaW0oaHUsJy8nKS4nL3RleHRwYXR0ZXJuL2luZGV4LnBocCc7CgoJCQkkdmFscyA9IGFycmF5KAoJCQkJJ2FkbWluX25hbWUnCT0+CSRhZG1pbl9uYW1lLAoJCQkJJ2FkbWluX2VtYWlsJwk9PgkkYWRtaW5fZW1haWwsCgkJCQknbmFtZScJCT0+CSRuYW1lLAoJCQkJJ3VzZXJuYW1lJwk9PgkkdXNlcm5hbWUsCgkJCQknZW1haWwnCQk9PgkkZW1haWwsCgkJCQkncGFzc3dvcmQnCT0+CSRwdywKCQkJCSdzaXRlbmFtZScJPT4JJHNpdGVuYW1lLAoJCQkJJ2xvZ2ludXJsJwk9PgkkbG9naW5fdXJsLAoJCQkJJ3NpdGV1cmwnCT0+CWh1LAoJCQkJJ2FkZHJlc3MnCT0+CSRhZGRyZXNzLAoJCQkJJ3Bob25lJwkJPT4JJHBob25lCgkJCSk7CgoJCQlmb3JlYWNoICgkdmFscyBhcyAkYT0+JGIpIHsKCQkJCUAkbWVzc2FnZSA9IHN0cl9yZXBsYWNlKCc8dHhwOm1lbV8nLiRhLicgLz4nLCRiLCRtZXNzYWdlKTsKCQkJfQoKCQkJJG1lc3NhZ2UgPSBwYXJzZSgkbWVzc2FnZSk7CgoJCQkkZW1haWxib2R5ID0gIkZyb206IHskYWRtaW5fbmFtZX0gPHskYWRtaW5fZW1haWx9PlxyXG4iCgkJCQkuIkJjYzogeyRhZG1pbl9lbWFpbH1cclxuIgoJCQkJLiJSZXBseS1UbzogeyRhZG1pbl9lbWFpbH1cclxuIgoJCQkJLiJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XHJcbiIKCQkJCS4iQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVwiVVRGLThcIlxyXG4iOwoKCQkJJHNlbnQgPSBtYWlsKCRlbWFpbCwgIlskc2l0ZW5hbWVdICIubWVtX3NlbGZfZ1R4dCgneW91cl9sb2dpbl9pbmZvJyksICRtZXNzYWdlLCAkZW1haWxib2R5KTsKCgkJCSRtZW1fc2VsZlsnZW1haWxfc3RhdHVzJ10gPSAkc2VudDsKCQkJJG1lbV9zZWxmWydlbWFpbF9tZXNzYWdlJ10gPSAkbWVzc2FnZTsKCgkJCWlmICgkc2VudCkgewoJCQkJJGNvb2tpZXRpbWUgPSB0aW1lKCkgKyAoMzY1KjI0KjM2MDApOwoJCQkJc2V0Y29va2llKCJ0eHBfc2VsZl9yZWdpc3RlcmVkIiwgIjEiLCAgJGNvb2tpZXRpbWUsICIvIik7CgoJCQkJJG1lbV9zZWxmWydzdGF0dXNfbWVzc2FnZSddID0gbWVtX3NlbGZfZ1R4dCgncGFzc3dvcmRfc2VudF90bycpLnNwLiRlbWFpbDsKCQkJfSBlbHNlIHsKCQkJCS8vIGZhaWxlZCB0byBzZW5kIGVtYWlsCgkJCX0KCQl9Cgl9IGVsc2UgewoJCSRtZW1fc2VsZlsnc3RhdHVzX21lc3NhZ2UnXSA9IG1lbV9zZWxmX2dUeHQoJ2Vycm9yX2FkZGluZ19uZXdfYXV0aG9yJyk7Cgl9Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZnVuY3Rpb24gc2VsZl9yZWdpc3Rlcl9lbWFpbF9tZXNzYWdlKCRhdHRzKQp7CglnbG9iYWwgJG1lbV9zZWxmOwoJcmV0dXJuICRtZW1fc2VsZlsnZW1haWxfbWVzc2FnZSddOwp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmZ1bmN0aW9uIHNlbGZfcmVnaXN0ZXJfc3RhdHVzX21lc3NhZ2UoJGF0dHMpCnsKCWdsb2JhbCAkbWVtX3NlbGY7CglyZXR1cm4gJG1lbV9zZWxmWydzdGF0dXNfbWVzc2FnZSddOwp9CgoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpmdW5jdGlvbiBpZl9tZXNzYWdlX3NlbnQoJGF0dHMsJHRoaW5nKQp7CglnbG9iYWwgJG1lbV9zZWxmOwoJJGNvbmRpdGlvbiA9ICgkbWVtX3NlbGZbJ2VtYWlsX3N0YXR1cyddKTsKCXJldHVybiBwYXJzZShFdmFsRWxzZSgkdGhpbmcsICRjb25kaXRpb24pKTsKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpmdW5jdGlvbiBpZl9zZWxmX3JlZ2lzdGVyZWQoJGF0dHMsJHRoaW5nKQp7CglnbG9iYWwgJG1lbV9zZWxmLCR0eHBfdXNlcjsKCSRjb25kaXRpb24gPSAoJG1lbV9zZWxmWydzdGF0dXMnXSBvciAkbWVtX3NlbGZbJ2Zvcm1fdmFsaWQnXSBvciAhZW1wdHkoJF9DT09LSUVbJ3R4cF9zZWxmX3JlZ2lzdGVyZWQnXSkgb3IgKGlzc2V0KCR0eHBfdXNlcikgYW5kICFlbXB0eSgkdHhwX3VzZXIpKSApOwoJcmV0dXJuIHBhcnNlKEV2YWxFbHNlKCR0aGluZywgJGNvbmRpdGlvbikpOwp9CgovLyBhZGRlZCB0byB0eHBsaWJfbWlzYwppZiAoIWZ1bmN0aW9uX2V4aXN0cygnaXNfdmFsaWRfZW1haWwnKSkgewpmdW5jdGlvbiBpc192YWxpZF9lbWFpbCgkZW1haWwpCnsKCSRhZGRyID0gZXhwbG9kZSgnQCcsJGVtYWlsKTsKCgkkaG9zdCA9ICRhZGRyWzFdOwoKCWlmICgkaG9zdCAhPSBnZXRob3N0YnluYW1lKCRob3N0KSBhbmQgZXJlZ2koIl5bMC05YS16XShbLV8ufl0/WzAtOWEtel0pKiQiLCRhZGRyWzBdKSkKCQlyZXR1cm4gdHJ1ZTsKCglyZXR1cm4gZmFsc2U7Cn0KfQoKZnVuY3Rpb24gaXNfdmFsaWRfZm9ybSgpCnsKCWV4dHJhY3QoZG9TbGFzaChwc2EoYXJyYXkoJ25hbWUnLCdlbWFpbCcsJ3VzZXJuYW1lJywnbWVtX3NlbGZfcmVnaXN0ZXInKSkpKTsKCgkkbmFtZSA9IHRyaW0oJG5hbWUpOwoJJGVtYWlsID0gdHJpbSgkZW1haWwpOwoJJHVzZXJuYW1lID0gdHJpbSgkdXNlcm5hbWUpOwoKCWlmICgkbWVtX3NlbGZfcmVnaXN0ZXI9PSdyZWdpc3RlcicpIHsKCQlpZiAoIShlbXB0eSgkbmFtZSkgfHwgZW1wdHkoJHVzZXJuYW1lKSB8fCBlbXB0eSgkZW1haWwpKSAmJiBpc192YWxpZF9lbWFpbCgkZW1haWwpKSB7CgkJCXJldHVybiB0cnVlOwoJCX0KCX0KCglyZXR1cm4gZmFsc2U7Cn0KCgoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gVXNlciBTaWRlIFByb2ZpbGUgYW5kIFBhc3N3b3JkIENoYW5nZSBGb3JtcwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmZ1bmN0aW9uIG1lbV9jaGFuZ2VfcGFzc3dvcmRfZm9ybSgkYXR0cywkdGhpbmc9JycpCnsKCXJldHVybiBtZW1fY2hhbmdlX3Bhc3NfZm9ybSgkYXR0cywkdGhpbmcpOwp9CmZ1bmN0aW9uIG1lbV9jaGFuZ2VfcGFzc19mb3JtKCRhdHRzLCR0aGluZz0nJykKewoJZ2xvYmFsICRpZ25fdXNlciwkdHhwX3VzZXIsJHNpdGVuYW1lLCRtZW1fcHJvZmlsZTsKCglleHRyYWN0KGxBdHRzKGFycmF5KAoJCSdjbGFzcycJCT0+ICdtZW1fcGFzc3dvcmRfZm9ybScsCgkJJ3dyYXB0YWcnCT0+ICcnLAoJCSdmb3JtJwkJPT4gJycsCgkJJ2Zvcm1fbWFpbCcJPT4gJycKCSksJGF0dHMpKTsKCgkkb3V0ID0gJyc7CgoJaWYgKGlzc2V0KCRpZ25fdXNlcikpICR0eHBfdXNlciA9ICRpZ25fdXNlcjsKCgkkc3RlcCA9IGdwcygnc3RlcCcpOwoKCWlmIChpc3NldCgkc3RlcCkgJiYgJHN0ZXA9PSdtZW1fY2hhbmdlX3Bhc3MnKSB7CgkJJG5ld19wYXNzID0gZ3BzKCduZXdfcGFzcycpOwoKCQkkcnMgPSBzYWZlX3VwZGF0ZSgKCQkJbWVtX2dldF91c2VyX3RhYmxlX25hbWUoKSwKCQkJInBhc3MgPSBwYXNzd29yZChsb3dlcignJG5ld19wYXNzJykpIiwKCQkJIm5hbWU9JyR0eHBfdXNlciciCgkJKTsKCgkJaWYgKCRycykgewoKCQkJLy8gc3VjY2Vzc2Z1bAoJCQkkbWVtX3Byb2ZpbGUgPSBzYWZlX3JvdygnKicsbWVtX2dldF91c2VyX3RhYmxlX25hbWUoKSwibmFtZSA9ICd7JHR4cF91c2VyfSciKTsKCgkJCWlmICgkbWVtX3Byb2ZpbGUpIHsKCQkJCSRtZW1fcHJvZmlsZVsnbmV3X3Bhc3MnXSA9ICRuZXdfcGFzczsKCgkJCQlpZiAoIWVtcHR5KCRmb3JtX21haWwpKQoJCQkJCSRtZXNzYWdlID0gZmV0Y2hfZm9ybSgkZm9ybV9tYWlsKTsKCQkJCWlmIChlbXB0eSgkbWVzc2FnZSkpIHsKCQkJCQkkbWVzc2FnZSA9IG1lbV9zZWxmX2dUeHQoJ2dyZWV0aW5nJykuJyA8dHhwOm1lbV9yZWFsbmFtZSAvPiwnLiJcclxuIi4KCQkJCQkJbWVtX3NlbGZfZ1R4dCgneW91cl9wYXNzd29yZF9pcycpLiI6IDx0eHA6bWVtX3Bhc3N3b3JkIC8+XHJcbiIuIlxyXG4iLgoJCQkJCQltZW1fc2VsZl9nVHh0KCdsb2dfaW5fYXQnKS4nICcuaHUuJ3RleHRwYXR0ZXJuL2luZGV4LnBocCc7CgkJCQl9CgoJCQkJJHZhbHMgPSBhcnJheSgKCQkJCQkncmVhbG5hbWUnCT0+CSRtZW1fcHJvZmlsZVsnUmVhbE5hbWUnXSwKCQkJCQkncGFzc3dvcmQnCT0+CSRtZW1fcHJvZmlsZVsnbmV3X3Bhc3MnXSwKCQkJCSk7CgoJCQkJZm9yZWFjaCAoJHZhbHMgYXMgJGE9PiRiKSB7CgkJCQkJJG1lc3NhZ2UgPSBzdHJfcmVwbGFjZSgnPHR4cDptZW1fJy4kYS4nIC8+JywkYiwkbWVzc2FnZSk7CgkJCQl9CgoJCQkJJG1lc3NhZ2UgPSBwYXJzZSgkbWVzc2FnZSk7CgoJCQkJLy8gZW1haWwgcGFzc3dvcmQKCQkJCWlmICh0eHBNYWlsKCRtZW1fcHJvZmlsZVsnZW1haWwnXSwgIlskc2l0ZW5hbWVdICIubWVtX3NlbGZfZ1R4dCgneW91cl9uZXdfcGFzc3dvcmQnKSwgJG1lc3NhZ2UpKQoJCQkJCSRvdXQgPSBtZW1fc2VsZl9nVHh0KCdwYXNzd29yZF9jaGFuZ2VkJyk7CgkJCQllbHNlCgkJCQkJJG91dCA9IG1lbV9zZWxmX2dUeHQoJ3Bhc3N3b3JkX2NoYW5nZV9mYWlsZWQnKTsKCQkJfSBlbHNlIHJldHVybiBteXNxbF9lcnJvcigpOwoJCX0gZWxzZSB7CgkJCXJldHVybiBteXNxbF9lcnJvcigpOwoJCX0KCX0gZWxzZSB7CgkJJEZvcm0gPSAkdGhpbmc7CgkJaWYgKCFlbXB0eSgkZm9ybSkpCgkJCSRGb3JtID0gZmV0Y2hfZm9ybSgkZm9ybSk7CgkJaWYgKGVtcHR5KCRGb3JtKSkgewoJCQkkRm9ybSA9ICI8aDM+Q2hhbmdlIFBhc3N3b3JkPC9oMz48ZGl2Pjx0eHA6bWVtX3Bhc3N3b3JkX2lucHV0IC8+PHR4cDptZW1fc3VibWl0IC8+PC9kaXY+IjsKCQl9CgkJJG91dCA9IAkiPGZvcm0gYWN0aW9uPSd7JF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ119JyBtZXRob2Q9J3Bvc3QnPiIuCgkJCQlwYXJzZSgkRm9ybSkuCgkJCQllSW5wdXQoJ21lbV91c2VyX3dvcmtzcGFjZScpLnNJbnB1dCgnbWVtX2NoYW5nZV9wYXNzJykuCgkJCQkiPC9mb3JtPiI7CgovLwkJCQlncmFmKG1lbV9zZWxmX2dUeHQoJ25ld19wYXNzd29yZCcpLicgJy5mSW5wdXQoJ3Bhc3N3b3JkJywnbmV3X3Bhc3MnLCcnLCdlZGl0JywnJywnJywnMjAnLCcxJykuCgoJfQoKCXJldHVybiAkb3V0Owp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmZ1bmN0aW9uIG1lbV91c2VyX2VkaXRfZm9ybSgkYXR0cywgJHRoaW5nKQp7CglnbG9iYWwgJHR4cGNmZywkdHhwX3VzZXIsJGlnbl91c2VyLCRtZW1fcHJvZmlsZTsKCglpZiAoaXNzZXQoJGlnbl91c2VyKSkgJHR4cF91c2VyID0gJGlnbl91c2VyOwoKCWV4dHJhY3QobEF0dHMoYXJyYXkoCgkJJ2NsYXNzJwkJPT4gJ21lbV91ZWRpdF9mb3JtJywKCQknd3JhcHRhZycJPT4gJycsCgkJJ2Zvcm0nCQk9PiAnJwoJCSksICRhdHRzKSk7CgoJJG91dCA9ICcnOwoJJG1lc3NhZ2UgPSAnJzsKCgkkc3RlcCA9IGdwcygnc3RlcCcpOwoJJG5ld19wYXNzID0gZ3BzKCduZXdfcGFzcycpOwoKCWlmIChpc3NldCgkc3RlcCkgJiYgJHN0ZXA9PSdzYXZlX3VzZXJfcHJvZmlsZScpIHsKCQlleHRyYWN0KGdwc2EoYXJyYXkoJ2VtYWlsJywnbmFtZScsJ1JlYWxOYW1lJywnYWRkcmVzcycsJ3Bob25lJykpKTsKCgkJJHh0cmEgPSBtZW1fZ2V0X2V4dHJhX3VzZXJfY29sdW1uc19pbnNlcnRfc3RyaW5nKCk7CgoJCSRycyA9IHNhZmVfdXBkYXRlKG1lbV9nZXRfdXNlcl90YWJsZV9uYW1lKCksCgkJCSJlbWFpbCA9ICd7JGVtYWlsfScsIFJlYWxOYW1lID0gJ3skUmVhbE5hbWV9JyIgLiAkeHRyYSwKCQkJIm5hbWUgPSAneyR0eHBfdXNlcn0nIik7CgoJCWlmICgkcnMpIHsKCQkJJG1lc3NhZ2UgPSBtZW1fc2VsZl9nVHh0KCdzYXZlZF91c2VyX3Byb2ZpbGUnKTsKCQl9IGVsc2UgewoJCQkkbWVzc2FnZSA9IG15c3FsX2Vycm9yKCk7CgkJfQoJfQoKCSRtZW1fcHJvZmlsZSA9IHNhZmVfcm93KCcqJyxtZW1fZ2V0X3VzZXJfdGFibGVfbmFtZSgpLCJuYW1lID0gJ3skdHhwX3VzZXJ9JyIpOwoKCWlmICgkbWVtX3Byb2ZpbGUpIHsKCQkkRm9ybSA9ICR0aGluZzsKCQlpZiAoIWVtcHR5KCRmb3JtKSkKCQkJJEZvcm0gPSBmZXRjaF9mb3JtKCRmb3JtKTsKCgkJJEZvcm0gPSBlcmVnaV9yZXBsYWNlKCc8dHhwOm1lbV9tZXNzYWdlIC8+JywkbWVzc2FnZSwkRm9ybSk7CgoJCSRvdXQgPSAJIjxmb3JtIGFjdGlvbj0neyRfU0VSVkVSWydSRVFVRVNUX1VSSSddfScgbWV0aG9kPSdwb3N0Jz4iLgoJCQkJcGFyc2UoJEZvcm0pLgoJCQkJZUlucHV0KCdtZW1fdXNlcl93b3Jrc3BhY2UnKS5zSW5wdXQoJ3NhdmVfdXNlcl9wcm9maWxlJykuCgkJCQkiPC9mb3JtPiI7Cgl9CgoJcmV0dXJuIGRvVGFnKCRvdXQsJHdyYXB0YWcsJGNsYXNzKTsKfQoKZnVuY3Rpb24gbWVtX3Byb2ZpbGUoJGF0dHMpCnsKCWdsb2JhbCAkbWVtX3Byb2ZpbGUsJHR4cF91c2VyLCRpZ25fdXNlcjsKCglpZiAoaXNzZXQoJGlnbl91c2VyKSkgJHR4cF91c2VyID0gJGlnbl91c2VyOwoKCWV4dHJhY3QoJGF0dHMpOwoJaWYgKCFpc19hcnJheSgkbWVtX3Byb2ZpbGUpICYmICR0eHBfdXNlcikKCQkkbWVtX3Byb2ZpbGUgPSBzYWZlX3JvdygnKicsbWVtX2dldF91c2VyX3RhYmxlX25hbWUoKSwibmFtZSA9ICd7JHR4cF91c2VyfSciKTsKCglpZiAoJG1lbV9wcm9maWxlKQoJCXJldHVybiBhcnJheV9rZXlfZXhpc3RzKCR2YXIsJG1lbV9wcm9maWxlKSA/ICRtZW1fcHJvZmlsZVskdmFyXSA6ICcnOwoJcmV0dXJuICcnOwp9CmZ1bmN0aW9uIG1lbV9zdWJtaXQoJGF0dHMpCnsKCWV4dHJhY3QoJGF0dHMpOwoJJGNsYXNzID0gaXNzZXQoJGNsYXNzKSA/ICRjbGFzcyA6ICdzbWFsbGVyYm94JzsKCSR2YWx1ZSA9IGlzc2V0KCR2YWx1ZSkgPyAkdmFsdWUgOiBtZW1fc2VsZl9nVHh0KCdzYXZlJyk7CglyZXR1cm4gZklucHV0KCJzdWJtaXQiLCdzYXZlJyxodG1sc3BlY2lhbGNoYXJzKCR2YWx1ZSksJGNsYXNzKTsKfQpmdW5jdGlvbiBtZW1fcGFzc3dvcmRfaW5wdXQoJGF0dHMpCnsKCWdsb2JhbCAkbWVtX3Byb2ZpbGU7CglleHRyYWN0KCRhdHRzKTsKCSRpc2l6ZSA9IGlzc2V0KCRpc2l6ZSkgPyAkaXNpemUgOiAyMDsKCSRjbGFzcyA9IGlzc2V0KCRjbGFzcykgPyAkY2xhc3MgOiAnZWRpdCc7CgoJcmV0dXJuIGZJbnB1dCgncGFzc3dvcmQnLCduZXdfcGFzcycsJycsJGNsYXNzKTsKfQpmdW5jdGlvbiBtZW1fcmVhbG5hbWVfaW5wdXQoJGF0dHMpCnsKCWdsb2JhbCAkbWVtX3Byb2ZpbGU7CglleHRyYWN0KCRhdHRzKTsKCSRpc2l6ZSA9IGlzc2V0KCRpc2l6ZSkgPyAkaXNpemUgOiAyMDsKCSRjbGFzcyA9IGlzc2V0KCRjbGFzcykgPyAkY2xhc3MgOiAnZWRpdCc7CgoJcmV0dXJuIGZJbnB1dCgndGV4dCcsJ1JlYWxOYW1lJyxodG1sc3BlY2lhbGNoYXJzKCRtZW1fcHJvZmlsZVsnUmVhbE5hbWUnXSksJGNsYXNzKTsKfQpmdW5jdGlvbiBtZW1fZW1haWxfaW5wdXQoJGF0dHMpCnsKCWdsb2JhbCAkbWVtX3Byb2ZpbGU7CglleHRyYWN0KCRhdHRzKTsKCSRpc2l6ZSA9IGlzc2V0KCRpc2l6ZSkgPyAkaXNpemUgOiAyMDsKCSRjbGFzcyA9IGlzc2V0KCRjbGFzcykgPyAkY2xhc3MgOiAnZWRpdCc7CgoJcmV0dXJuIGZJbnB1dCgndGV4dCcsJ2VtYWlsJyxodG1sc3BlY2lhbGNoYXJzKCRtZW1fcHJvZmlsZVsnZW1haWwnXSksJGNsYXNzKTsKfQpmdW5jdGlvbiBtZW1fcGhvbmVfaW5wdXQoJGF0dHMpCnsKCWdsb2JhbCAkbWVtX3Byb2ZpbGU7CglleHRyYWN0KCRhdHRzKTsKCSRpc2l6ZSA9IGlzc2V0KCRpc2l6ZSkgPyAkaXNpemUgOiAyMDsKCSRjbGFzcyA9IGlzc2V0KCRjbGFzcykgPyAkY2xhc3MgOiAnZWRpdCc7CgoJcmV0dXJuIGZJbnB1dCgndGV4dCcsJ3Bob25lJyxodG1sc3BlY2lhbGNoYXJzKCRtZW1fcHJvZmlsZVsncGhvbmUnXSksJGNsYXNzKTsKfQpmdW5jdGlvbiBtZW1fYWRkcmVzc19pbnB1dCgkYXR0cykKewoJZ2xvYmFsICRtZW1fcHJvZmlsZTsKCWV4dHJhY3QoJGF0dHMpOwoJJGlzaXplID0gaXNzZXQoJGlzaXplKSA/ICRpc2l6ZSA6IDIwOwoJJGNsYXNzID0gaXNzZXQoJGNsYXNzKSA/ICRjbGFzcyA6ICdlZGl0JzsKCglyZXR1cm4gJzx0ZXh0YXJlYSBjbGFzcz0iJy4kY2xhc3MuJyIgbmFtZT0iYWRkcmVzcyI+Jy5odG1sc3BlY2lhbGNoYXJzKCRtZW1fcHJvZmlsZVsnYWRkcmVzcyddKS4nPC90ZXh0YXJlYT4nOwp9CgpmdW5jdGlvbiBtZW1fc2VsZl91c2VyX2NvdW50KCRhdHRzKQp7CglnbG9iYWwgJG1lbV9zZWxmOwoKCWV4dHJhY3QobEF0dHMoYXJyYXkoCgkJJ3VzZXJfbGV2ZWxzJwk9PiAnMCwxLDIsMyw0LDUsNicsCgkJJ3dyYXB0YWcnCT0+ICcnLAoJCSdjbGFzcycJCT0+ICcnCgkpLCRhdHRzKSk7CgoJaWYgKCFlbXB0eSgkdXNlcl9sZXZlbHMpIHx8ICR1c2VyX2xldmVscz09JzAnKQoJCSR1c2VyX2xldmVscyA9IGRvU2xhc2goc3BsaXQoJywnLCR1c2VyX2xldmVscykpOwoJZWxzZQoJCSR1c2VyX2xldmVscyA9IGFycmF5KCRtZW1fc2VsZlsnbmV3X3VzZXJfcHJpdiddKTsKCgkkbGV2ZWxzID0gam9pbignLCcsJHVzZXJfbGV2ZWxzKTsKCSRjb3VudCA9IHNhZmVfZmllbGQoJ0NPVU5UKCopJywgbWVtX2dldF91c2VyX3RhYmxlX25hbWUoKSwgInByaXZzIElOICh7JGxldmVsc30pIik7CgoJcmV0dXJuIGRvVGFnKCRjb3VudCwkd3JhcHRhZywkY2xhc3MpOwp9CiI7czozOiJtZDUiO3M6MzI6IjNhZDg4MGFiMjJmM2NhZmYxZDA4M2YxYWQ2MTE4ZjA1Ijt9
Неактивен
Ну, вот хороший же плагин! Черт, ну почему не могу с ним совладать? Уже устал биться головой об стенку!!! Как бы я не ухищрялся, он у меня всеравно упорно регистрирует новых пользователей с привелегией "нет" вместо, например, "штатный писатель" или "внештатник"... Из-за этого плагином пользоваться просто не возможно - пропадает весь смысл. Ведь человек не сможет залогинится, пока я сам ему из админки не поменяю статус...
О том, что я выставлял эти опции в настройках, думаю и упоминать не стоит, я даже пытался ковырять сам код плагина, но это было на интуитивном уровне, ведь я совсем не знаю РНР... Люди добрые! Помогите. Может вы подскажете как заставить этот плагин забыть об уровне пользователей "нет" ( levels 0 ) ??
Если неохота ставить плагин, то вот код:
//////////////////////////////////////////////////////////// // Plugin mem_self_register // Author: Michael Manfre (http://manfre.net/) //////////////////////////////////////////////////////////// if (!function_exists('mem_set_pref')) { function mem_set_pref($name, $val, $event, $type, $position=0, $html='text_input') { global $pref_cache; if ($pref_cache==null) $pref_cache = array(); $args = func_get_args(); $args['html'] = $html; $args['position'] = $position; $args['prefs_id'] = 1; $pref_cache[$name] = $args; extract(doSlash($args)); if (!safe_row("*", 'txp_prefs', "name = '$name'") ) { return safe_insert('txp_prefs', " name = '$name', val = '$val', event = '$event', html = '$html', type = '$type', position = '$position', prefs_id = 1" ); } else { return safe_update( 'txp_prefs', " val = '$val', event = '$event', html = '$html', type = '$type', position = '$position'", "name like '$name'"); } return false; } } if (!function_exists('mem_get_pref')) { function mem_get_pref($name,$val='') { global $pref_cache; if ($pref_cache==null) $pref_cache = array(); if (!in_array($name,$pref_cache) or $pref_cache[$name] === false) { $pref_cache[$name] = safe_row('*','txp_prefs',"name='$name'"); } else { $pref_cache[$name] = false; } if (!empty($val) && in_array($val,$pref_cache[$name])) return $pref_cache[$name][$val]; else return $pref_cache[$name]; } } global $mem_self_lang; if (!is_array($mem_self_lang)) { $mem_self_lang = array( 'your_login_info' => 'Your Login Info', 'admin_name' => 'Admin Name', 'admin_email' => 'Admin Email', 'password_sent_to' => 'Password Sent To', 'error_adding_new_author' => 'Error adding new author', 'greeting' => 'Hello', 'your_password_is' => 'Your password is', 'your_new_password' => 'Your new password', 'password_changed' => 'Password changed', 'password_change_failed' => 'Failed to change password', 'log_in_at' => 'Log in at', 'saved_user_profile' => 'Saved User Profile', 'user_exists' => 'Username already exists. Please try another name', ); } function mem_self_gTxt($name) { global $mem_self_lang; $gtxt = gTxt($name); if ( strcmp($gtxt,$name) == 0 ) { if ( array_key_exists($name,$mem_self_lang) ) $gtxt = $mem_self_lang[$name]; } return $gtxt; } global $event; if (!isset($event)) $event = ''; if ($event != 'admin') { require_once txpath.'/include/txp_admin.php'; global $levels; // copied from txp_admin.php $levels = array( 0 => mem_self_gTxt('none'), 6 => mem_self_gTxt('designer'), 5 => mem_self_gTxt('freelancer'), 4 => mem_self_gTxt('staff_writer'), 3 => mem_self_gTxt('copy_editor'), 2 => mem_self_gTxt('managing_editor'), 1 => mem_self_gTxt('publisher') ); //------------------------------------------------------------- if (!function_exists('priv_levels')) { function priv_levels($item, $var) { global $levels; return selectInput($item, $levels, $var); } } } global $mem_self; $mem_self = array( 'admin_email' => '', 'admin_name' => '', 'new_user_priv' => '0', 'status' => false, 'status_message' => 'You are already registered.', 'email_message' => '' ); $mem_self['admin_email'] = mem_get_pref('mem_self_admin_email','val'); //safe_field('val','txp_prefs',"name='mem_self_admin_email'"); $mem_self['admin_name'] = mem_get_pref('mem_self_admin_name','val'); //safe_field('val','txp_prefs',"name='mem_self_admin_name'"); $mem_self['new_user_priv'] = mem_get_pref('mem_self_new_user_priv','val'); //safe_field('val','txp_prefs',"name='mem_self_new_user_priv'"); if ( @txpinterface == 'admin' ) { register_callback('mem_self_register','self-reg','', 1); if ($event=='self-reg') { // fake tabs when using them. Silences warnings from pageTop() register_tab('admin','self-reg','self-reg'); include_once txpath.'/publish/taghandlers.php'; } function mem_self_register($event, $step) { if ($event!='self-reg') return; pageTop('Self Registration',''); if ($step == 'install') { echo mem_self_register_install(); } else if ($step=='preinstall') { $mem_admin_name = mem_get_pref('mem_self_admin_name'); $mem_admin_email = mem_get_pref('mem_self_admin_email'); $mem_new_user_priv = mem_get_pref('mem_self_new_user_priv'); $mem_use_ign_db = mem_get_pref('mem_self_use_ign_db'); $mem_xtra_columns = mem_get_extra_user_columns(); $mem_admin_name = @$mem_admin_name ? $mem_admin_name['val'] : 'Admin'; $mem_admin_email = @$mem_admin_email ? $mem_admin_email['val'] : 'Admin@yourdomain.com'; $mem_new_use_priv = @$mem_new_use_priv ? $mem_new_use_priv['val'] : '0'; $use_ign_input = ''; // is ign_password_protect loaded on the system? if (load_plugin('ign_password_protect') || $mem_use_ign_db) { $mem_use_ign_db = $mem_use_ign_db ? $mem_use_ign_db['val'] : '0'; $use_ign_input = yesnoradio('use_ign_db',$mem_use_ign_db); } $xtra_columns = mem_get_extra_user_columns(); $has_address = in_array('address',$xtra_columns); $has_phone = in_array('phone',$xtra_columns); $add_address_input = yesnoradio('add_address','0'); $add_phone_input = yesnoradio('add_phone','0'); echo form( eInput('self-reg').sInput('install'). startTable('edit') . tr( fLabelCell('admin_name') . tda(fInput('text','admin_name',$mem_admin_name,'edit')) ) . tr( fLabelCell('admin_email') . tda(fInput('text','admin_email',$mem_admin_email,'edit')) ) . tr( fLabelCell('new_user_priv') . tda(priv_levels('new_user_priv',$mem_new_use_priv)) ) . tr( fLabelCell('use_ign_db') . tda($use_ign_input) ) . ($has_address ? '' : tr( fLabelCell('add_address_field') . tda($add_address_input) ) ) . ($has_phone ? '' : tr( fLabelCell('add_phone_field') . tda($add_phone_input) ) ) . tr( td() . td( fInput("submit", 'submit',mem_self_gTxt('install'),"Publish"), 2 ) ) . endTable() ); } else { echo '<div><a href="?event=self-reg&step=preinstall">'.mem_self_gTxt('install').'</a></div>'; } } function mem_self_register_install() { global $mem_self; extract(doSlash(gpsa(array( 'admin_email', 'admin_name', 'new_user_priv', 'use_ign_db', 'add_address', 'add_phone' )))); if (!isset($new_user_priv) || empty($new_user_priv)) $new_user_priv = '0'; $log = array(); if (!($rs=safe_field('val,html','txp_prefs',"name='mem_self_use_ign_db'"))) { if ( mem_set_pref('mem_self_use_ign_db',$use_ign_db,'self_reg',1,'yesnoradio')) { $log[] = "Added pref 'mem_self_use_ign_db'"; } else { $log[] = "Failed to add pref 'mem_self_use_ign_db'. " . mysql_error(); } } else { if ($rs['html'] != 'yesnoradio') { safe_update('txp_prefs',"html='yesnoradio'","name='mem_self_use_ign_db'"); } $log[] = "Pref 'mem_self_use_ign_db' is already installed. Current value is '{$rs}'."; } $user_table = mem_get_user_table_name(); $xtra_columns = mem_get_extra_user_columns(); if ($add_address) { if (!in_array('address',$xtra_columns)) { if (safe_alter($user_table,"ADD `address` VARCHAR( 128 )")) { $log[] = "Added column 'address' to user table '{$user_table}'"; } else { $log[] = "Failed to add column 'address' to user table '{$user_table}'. " . mysql_error(); } } else { $log[] = "Table {$user_table} already has column 'address'"; } } if ($add_phone) { if (!in_array('phone',$xtra_columns)) { if (safe_alter($user_table,"ADD `phone` VARCHAR( 32 )")) { $log[] = "Added column 'phone' to user table '{$user_table}'"; } else { $log[] = "Failed to add column 'phone' to user table '{$user_table}'. " . mysql_error(); } } else { $log[] = "Table {$user_table} already has column 'phone'"; } } if (!($rs=safe_field('val','txp_prefs',"name='mem_self_admin_email'"))) { if ( mem_set_pref('mem_self_admin_email',$admin_email,'self_reg',1)) { $log[] = "Added pref 'mem_self_admin_email'"; } else { $log[] = "Failed to add pref 'mem_self_admin_email'. " . mysql_error(); } } else { $log[] = "Pref 'mem_self_admin_email' is already installed. Current value is '{$rs}'."; } if (!($rs=safe_field('val','txp_prefs',"name='mem_self_admin_name'"))) { if ( mem_set_pref('mem_self_admin_name',$admin_name,'self_reg',1)) { $log[] = "Added pref 'mem_self_admin_name'"; } else { $log[] = "Failed to add pref 'mem_self_admin_name'. " . mysql_error(); } } else { $log[] = "Pref 'mem_self_admin_name' is already installed. Current value is '{$rs}'."; } if (($rs=safe_field('val,html','txp_prefs',"name='mem_self_new_user_priv'")) === false) { if ( mem_set_pref('mem_self_new_user_priv',$new_user_priv,'self_reg',1,'priv_levels')) { $log[] = "Added pref 'mem_self_new_user_priv' with value of '{$new_user_priv}'"; $mem_self['new_user_priv'] = $new_user_priv; } else { $log[] = "Failed to add pref 'mem_self_newuser_priv'. " . mysql_error(); } } else { if ($rs['html'] != 'priv_levels') safe_update('txp_prefs',"html='priv_levels'","name='mem_self_new_user_priv'"); $log[] = "Pref 'mem_self_new_user_priv' is already installed. Current value is '{$rs}'."; } // create default registration form $form_html = <<<EOF <table> <tr> <td>Full Name</td> <td><txp:mem_name_input /></td> <td><txp:mem_name_warn /></td> </tr> <tr> <td>Username</td> <td><txp:mem_user_input /></td> <td><txp:mem_user_warn /></td> </tr> <tr> <td>Email</td> <td><txp:mem_email_input /></td> <td><txp:mem_email_warn /></td> </tr> <tr> <td colspan="3"><txp:mem_submit /></td> </tr> </table> EOF; $form = fetch('Form','txp_form','name','self_register_form'); if (!$form) { if (safe_insert('txp_form',"name='self_register_form',type='misc',Form='{$form_html}'")) { $log[] = "Added form 'self_register_form'"; } else { $log[] = "Failed to add form 'self_register_form'. " . mysql_error().br. "You need to manually create a form template. Here is an example.".br. '<textpattern style="width:300px;height:150px;">'.htmlspecialchars($form_html).'</textarea>'; } } else { $log[] = "Found form 'self_register_form'. Skipping installation of default form."; } // create default successful registration form to show the user $form_html = <<<EOF <h3>Account Created</h3> <p>An email containing your password has been sent to <txp:mem_profile var="email" />.</p> EOF; $form = fetch('Form','txp_form','name','self_register_success'); if (!$form) { if (safe_insert('txp_form',"name='self_register_success',type='misc',Form='{$form_html}'")) { $log[] = "Added form 'self_register_success'"; } else { $log[] = "Failed to add form 'self_register_success'. " . mysql_error().br. "You need to manually create a form template. Here is an example.".br. '<textpattern style="width:300px;height:150px;">'.htmlspecialchars($form_html).'</textarea>'; } } else { $log[] = "Found form 'self_register_success'. Skipping installation of default form."; } // create default successful registration email form $form_html = <<<EOF Dear <txp:mem_name />, Thank you for registering at <txp:mem_siteurl />. Your login name: <txp:mem_username /> Your password: <txp:mem_password /> If you have any questions please reply to this email address. Sincerely, <txp:mem_admin_name /> <txp:mem_admin_email /> EOF; $form = fetch('Form','txp_form','name','self_register_email'); if (!$form) { if (safe_insert('txp_form',"name='self_register_email',type='misc',Form='{$form_html}'")) { $log[] = "Added form 'self_register_email'"; } else { $log[] = "Failed to add form 'self_register_email'. " . mysql_error().br. "You need to manually create a form template. Here is an example.".br. '<textpattern style="width:300px;height:150px;">'.htmlspecialchars($form_html).'</textarea>'; } } else { $log[] = "Found form 'self_register_form'. Skipping installation of default form."; } $tag_help = '<txp:mem_self_register_form form="self_register_form" />'; $log[] = 'Example tag to use in your page template.'.br. '<textarea style="width:400px;height:40px;">'.htmlspecialchars($tag_help).'</textarea>'; return doWrap($log,'ul','li'); } } function mem_get_user_table_name() { $use_ign_db = mem_get_pref('mem_self_use_ign_db'); $table_name = 'txp_users'; if ($use_ign_db) { $ign_use_custom = mem_get_pref('ign_use_custom'); if ($ign_use_custom && $ign_use_custom['val']=='1') { $ign_user_db = mem_get_pref('ign_user_db'); if ($ign_user_db && !empty($ign_user_db['val'])) $table_name = $ign_user_db['val']; } } return $table_name; } // ------------------------------------------------------------- function mem_self_register_form($atts,$thing='') { global $txpac; $namewarn = $userwarn = $emailwarn = ''; extract(doSlash(psa(array('event','step','name','email','username','address','phone','mem_self_register')))); extract(lAtts(array( 'class' => __FUNCTION__, 'form' => 'self_register_form', 'success_form' => 'self_register_success', 'email_form' => 'self_register_email', 'wraptag' => '', 'isize' => '25', 'label' => mem_self_gTxt('submit'), 'namewarn' => mem_self_gTxt('name_required'), 'userwarn' => mem_self_gTxt('user_required'), 'emailwarn' => mem_self_gTxt('email_required'), ),$atts)); $name = trim($name); $username = trim($username); $email = trim($email); $phone = trim($phone); $address = trim($address); $saved = false; if ($event=='self-reg' && $step=='register') { if (!is_valid_form()) { $namewarn = empty($name) ? $namewarn : ''; $userwarn = empty($username) ? $userwarn : ''; // if all fields are non empty, then the email address failed for some reason. $emailwarn = empty($email) ? $emailwarn : (empty($namewarn) and empty($userwarn) ? $emailwarn : ''); } else { $rs = safe_field('name',mem_get_user_table_name(),"name='{$username}'"); if (empty($rs)) { mem_self_register_save(); $saved = true; } else { // don't change $userwarn $namewarn = $emailwarn = ''; } } } else { // don't show the warnings $namewarn = ''; $userwarn = ''; $emailwarn = ''; } if (@$saved) { $Form = fetch_form($success_form); $out = parse($Form); } else { $Form = fetch_form($form); $vals = array( 'name_warn' => $namewarn, 'user_warn' => $userwarn, 'email_warn' => $emailwarn, 'name_input' => fInput('text','name', $name, 'register_name_input','','',$isize,"0", 'mem_name_input'), 'user_input' => fInput('text','username', $username, 'register_user_input', '', '', $isize, "0", 'mem_user_input'), 'email_input' => fInput('text','email', $email,'register_email_input','','',$isize,"0", 'mem_email_input'), 'submit' => fInput('submit','submit',mem_self_gTxt($label),'button'), 'phone_input' => fInput('text','phone', $phone, 'register_phone_input', '', '', $isize, "0", 'mem_phone_input'), 'address_input' => fInput('text','address', $address, 'register_address_input', '', '', $isize, "0", 'mem_address_input'), ); foreach ($vals as $a=>$b) { $Form = str_replace('<txp:mem_'.$a.' />',$b,$Form); } $action_url = $_SERVER['REQUEST_URI']; $qs = strpos($action_url,'?'); if ($qs) $action_url = substr($action_url, 0, $qs); $out = n.n."<form enctype='multipart/form-data' action='{$action_url}' method='post'>" . eInput('self-reg') . sInput('register') . hInput('email_form',$email_form) . hInput('mem_self_register','register') . parse($Form) . "</form>".n; } return doTag($out,$wraptag,$class); } function mem_get_extra_user_columns_insert_string() { $xtra_columns = mem_get_extra_user_columns(); $xtra = ''; foreach ($xtra_columns as $xcol) { $name = $xcol['Field']; $type = strtolower($xcol['Type']); $val = gps($name); if ( strstr($type,'int') || $type=='float' || $type=='decimal' || $type=='double' || $type=='bool' ) { // don't quote value $xtra .= ", {$name}=" . doSlash($val); } else { // quote value $xtra .= ", {$name}='" . doSlash($val) ."'"; } } return $xtra; } function mem_get_extra_user_columns() { static $default_columns = array('user_id','name','pass','RealName','email','privs','last_access','nonce'); static $xtra_columns = false; if (is_array($xtra_columns)) return $xtra_columns; $table_name = mem_get_user_table_name(); $txpdesc = getRows('describe '.PFX. $table_name); $xtra_cols = array(); $dcols = $default_columns; foreach($txpdesc as $r) { if ( !in_array($r['Field'], $default_columns) ) $xtra_cols[] = $r; } return $xtra_cols; } // ------------------------------------------------------------- function mem_self_register_save() { global $mem_self,$sitename,$mem_profile; extract(doSlash(psa(array('name','email','username','email_form','address','phone','mem_self_register','login_url')))); extract($mem_self); if ($mem_self_register != 'register') return ''; $pw = generate_password(6); if (!$mem_profile) $mem_profile = array(); $mem_profile['nonce'] = $nonce = md5( uniqid( rand(), true ) ); $mem_profile['RealName'] = $name = trim($name); $mem_profile['email'] = $email = trim($email); $mem_profile['name'] = $username = trim($username); $mem_profile['privs'] = $new_user_priv; $xtra_columns = mem_get_extra_user_columns(); foreach($xtra_columns as $c) { $c_name = trim( $c['Field'] ); $mem_profile[$c_name] = gps($c_name); } $rs = false; $xtra = mem_get_extra_user_columns_insert_string(); $rs = safe_insert( mem_get_user_table_name(), "privs = '$new_user_priv', name = '$username', email = '$email', RealName = '$name', pass = password(lower('$pw')), nonce = '$nonce'" . $xtra ); if ($rs) { $mem_profile['user_id'] = $rs; $mem_profile['last_access'] = 0; if ($email_form) { $message = fetch('Form','txp_form','name',$email_form); if (is_array($admin_name)) $admin_name = $admin_name['val']; if (is_array($admin_email)) $admin_email = $admin_email['val']; if (empty($login_url)) $login_url = rtrim(hu,'/').'/textpattern/index.php'; $vals = array( 'admin_name' => $admin_name, 'admin_email' => $admin_email, 'name' => $name, 'username' => $username, 'email' => $email, 'password' => $pw, 'sitename' => $sitename, 'loginurl' => $login_url, 'siteurl' => hu, 'address' => $address, 'phone' => $phone ); foreach ($vals as $a=>$b) { @$message = str_replace('<txp:mem_'.$a.' />',$b,$message); } $message = parse($message); $emailbody = "From: {$admin_name} <{$admin_email}>\r\n" ."Bcc: {$admin_email}\r\n" ."Reply-To: {$admin_email}\r\n" ."Content-Transfer-Encoding: 8bit\r\n" ."Content-Type: text/plain; charset=\"UTF-8\"\r\n"; $sent = mail($email, "[$sitename] ".mem_self_gTxt('your_login_info'), $message, $emailbody); $mem_self['email_status'] = $sent; $mem_self['email_message'] = $message; if ($sent) { $cookietime = time() + (365*24*3600); setcookie("txp_self_registered", "1", $cookietime, "/"); $mem_self['status_message'] = mem_self_gTxt('password_sent_to').sp.$email; } else { // failed to send email } } } else { $mem_self['status_message'] = mem_self_gTxt('error_adding_new_author'); } } // ------------------------------------------------------------- function self_register_email_message($atts) { global $mem_self; return $mem_self['email_message']; } // ------------------------------------------------------------- function self_register_status_message($atts) { global $mem_self; return $mem_self['status_message']; } // ------------------------------------------------------------- function if_message_sent($atts,$thing) { global $mem_self; $condition = ($mem_self['email_status']); return parse(EvalElse($thing, $condition)); } // ------------------------------------------------------------- function if_self_registered($atts,$thing) { global $mem_self,$txp_user; $condition = ($mem_self['status'] or $mem_self['form_valid'] or !empty($_COOKIE['txp_self_registered']) or (isset($txp_user) and !empty($txp_user)) ); return parse(EvalElse($thing, $condition)); } // added to txplib_misc if (!function_exists('is_valid_email')) { function is_valid_email($email) { $addr = explode('@',$email); $host = $addr[1]; if ($host != gethostbyname($host) and eregi("^[0-9a-z]([-_.~]?[0-9a-z])*$",$addr[0])) return true; return false; } } function is_valid_form() { extract(doSlash(psa(array('name','email','username','mem_self_register')))); $name = trim($name); $email = trim($email); $username = trim($username); if ($mem_self_register=='register') { if (!(empty($name) || empty($username) || empty($email)) && is_valid_email($email)) { return true; } } return false; } //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// // User Side Profile and Password Change Forms // ------------------------------------------------------------- function mem_change_password_form($atts,$thing='') { return mem_change_pass_form($atts,$thing); } function mem_change_pass_form($atts,$thing='') { global $ign_user,$txp_user,$sitename,$mem_profile; extract(lAtts(array( 'class' => 'mem_password_form', 'wraptag' => '', 'form' => '', 'form_mail' => '' ),$atts)); $out = ''; if (isset($ign_user)) $txp_user = $ign_user; $step = gps('step'); if (isset($step) && $step=='mem_change_pass') { $new_pass = gps('new_pass'); $rs = safe_update( mem_get_user_table_name(), "pass = password(lower('$new_pass'))", "name='$txp_user'" ); if ($rs) { // successful $mem_profile = safe_row('*',mem_get_user_table_name(),"name = '{$txp_user}'"); if ($mem_profile) { $mem_profile['new_pass'] = $new_pass; if (!empty($form_mail)) $message = fetch_form($form_mail); if (empty($message)) { $message = mem_self_gTxt('greeting').' <txp:mem_realname />,'."\r\n". mem_self_gTxt('your_password_is').": <txp:mem_password />\r\n"."\r\n". mem_self_gTxt('log_in_at').' '.hu.'textpattern/index.php'; } $vals = array( 'realname' => $mem_profile['RealName'], 'password' => $mem_profile['new_pass'], ); foreach ($vals as $a=>$b) { $message = str_replace('<txp:mem_'.$a.' />',$b,$message); } $message = parse($message); // email password if (txpMail($mem_profile['email'], "[$sitename] ".mem_self_gTxt('your_new_password'), $message)) $out = mem_self_gTxt('password_changed'); else $out = mem_self_gTxt('password_change_failed'); } else return mysql_error(); } else { return mysql_error(); } } else { $Form = $thing; if (!empty($form)) $Form = fetch_form($form); if (empty($Form)) { $Form = "<h3>Change Password</h3><div><txp:mem_password_input /><txp:mem_submit /></div>"; } $out = "<form action='{$_SERVER['REQUEST_URI']}' method='post'>". parse($Form). eInput('mem_user_workspace').sInput('mem_change_pass'). "</form>"; // graf(mem_self_gTxt('new_password').' '.fInput('password','new_pass','','edit','','','20','1'). } return $out; } // ------------------------------------------------------------- function mem_user_edit_form($atts, $thing) { global $txpcfg,$txp_user,$ign_user,$mem_profile; if (isset($ign_user)) $txp_user = $ign_user; extract(lAtts(array( 'class' => 'mem_uedit_form', 'wraptag' => '', 'form' => '' ), $atts)); $out = ''; $message = ''; $step = gps('step'); $new_pass = gps('new_pass'); if (isset($step) && $step=='save_user_profile') { extract(gpsa(array('email','name','RealName','address','phone'))); $xtra = mem_get_extra_user_columns_insert_string(); $rs = safe_update(mem_get_user_table_name(), "email = '{$email}', RealName = '{$RealName}'" . $xtra, "name = '{$txp_user}'"); if ($rs) { $message = mem_self_gTxt('saved_user_profile'); } else { $message = mysql_error(); } } $mem_profile = safe_row('*',mem_get_user_table_name(),"name = '{$txp_user}'"); if ($mem_profile) { $Form = $thing; if (!empty($form)) $Form = fetch_form($form); $Form = eregi_replace('<txp:mem_message />',$message,$Form); $out = "<form action='{$_SERVER['REQUEST_URI']}' method='post'>". parse($Form). eInput('mem_user_workspace').sInput('save_user_profile'). "</form>"; } return doTag($out,$wraptag,$class); } function mem_profile($atts) { global $mem_profile,$txp_user,$ign_user; if (isset($ign_user)) $txp_user = $ign_user; extract($atts); if (!is_array($mem_profile) && $txp_user) $mem_profile = safe_row('*',mem_get_user_table_name(),"name = '{$txp_user}'"); if ($mem_profile) return array_key_exists($var,$mem_profile) ? $mem_profile[$var] : ''; return ''; } function mem_submit($atts) { extract($atts); $class = isset($class) ? $class : 'smallerbox'; $value = isset($value) ? $value : mem_self_gTxt('save'); return fInput("submit",'save',htmlspecialchars($value),$class); } function mem_password_input($atts) { global $mem_profile; extract($atts); $isize = isset($isize) ? $isize : 20; $class = isset($class) ? $class : 'edit'; return fInput('password','new_pass','',$class); } function mem_realname_input($atts) { global $mem_profile; extract($atts); $isize = isset($isize) ? $isize : 20; $class = isset($class) ? $class : 'edit'; return fInput('text','RealName',htmlspecialchars($mem_profile['RealName']),$class); } function mem_email_input($atts) { global $mem_profile; extract($atts); $isize = isset($isize) ? $isize : 20; $class = isset($class) ? $class : 'edit'; return fInput('text','email',htmlspecialchars($mem_profile['email']),$class); } function mem_phone_input($atts) { global $mem_profile; extract($atts); $isize = isset($isize) ? $isize : 20; $class = isset($class) ? $class : 'edit'; return fInput('text','phone',htmlspecialchars($mem_profile['phone']),$class); } function mem_address_input($atts) { global $mem_profile; extract($atts); $isize = isset($isize) ? $isize : 20; $class = isset($class) ? $class : 'edit'; return '<textarea class="'.$class.'" name="address">'.htmlspecialchars($mem_profile['address']).'</textarea>'; } function mem_self_user_count($atts) { global $mem_self; extract(lAtts(array( 'user_levels' => '0,1,2,3,4,5,6', 'wraptag' => '', 'class' => '' ),$atts)); if (!empty($user_levels) || $user_levels=='0') $user_levels = doSlash(split(',',$user_levels)); else $user_levels = array($mem_self['new_user_priv']); $levels = join(',',$user_levels); $count = safe_field('COUNT(*)', mem_get_user_table_name(), "privs IN ({$levels})"); return doTag($count,$wraptag,$class); }
Неактивен
Дамы и господа! Всё отменяется! Ларчик, оказывается, сука просто открывался! Потратил 3 часа мучая этот плагин, потом погуглил, на считанные минуты нашел и поставил новую версию плагина ( 0.8.5 вместо той 0.8.3 что в этом топике) и плагин стал как родной! ))))) всё работает
Неактивен
snowman написал:
погуглил, на считанные минуты нашел и поставил новую версию плагина ( 0.8.5 вместо той 0.8.3 что в этом топике) и плагин стал как родной! ))))) всё работает
Кинь ссылку на свежую версию, пожалуйста.
Неактивен
На сайте автора всё лежит
Неактивен
А я не догнал, как его установить Нету руководства хотя бы на английском? Я только начал изучать TP и вот решил сначала обхавестись всеми необходимыми плагинами, а потом сверастать Я вот скопировал этот код в окошко на странице плагинов, применил. Зашел на сайт, а там вот такая строка:
При загрузке модуля произошла ошибка: mem_self_register -> User_Error: Unable to include required plugin "mem_form" on line 448
Как я понял надо еще дорабатывать код шаблонов или создать файл с формой
Неактивен
Чтобы mem_self_register применять, надо установить плагин mem_form.
Пытаюсь использовать mem_self_register версии 0.9.1. Документация действительно отстойная. Упоминаются тэги, которых в коде нет. Видимо в хелпе остались следы прошлых версий. На сайте автора плагина и вовсе написано - смотрите хелп в админке.
Неактивен
Отбой тревоги, справился сам ^_^
Отредактированно Xeon (03-06-2009 21:39:48)
Неактивен
А, нет, оказывается не справился, при поптыки устоновить плагин mem_form
http://manfre.net/file_download/32
cms мне пишет: "Неправильно оформленный или пустой код плагина"
В чём может быть проблемма?
UPD:
Плагин установил, оба запустились и работают тольо вот форма для реги на странице не появилась... Что ещё нужно сделать?
Пониманию что надо вставить код форм на страницу но какой именно и куда что бы всё работалло правильно не знаю...
Отредактированно Xeon (03-06-2009 22:14:04)
Неактивен
Вот этот код нужно вставить в нужном месте страницы. Также после установки плагина были созданы три формы, которые можно редактировать.
<txp:mem_self_register_form form="self_register_form" email_form="self_register_email" subject="[site.ru] Информация о вашем аккаунте" />
Неактивен
Gerich можно поподробнее. После установки двух нужных плагинов у меня не добавились две формы.
Если Вы устанавливали, можете ли Вы описать процесс установки.
Приведенный Вами код у меня не выводит ничего
Xeon
Скачайте не *.txt, а *.gz.txt
Уменя добавилось
Отредактированно itshaman (22-09-2009 13:29:25)
Неактивен
Добрый вечер, Уважаемые.
А не мог бы кто нибудь, кто успешно установил этот плагин пошагово проинструктировать новичка? То есть установить то я установил, а вот воплотить систему регистрации пользователей с уже установленным плагином как то не соображу как. Понимаю, что видимо нужно появившиеся после его установки новые формы вывести как то в нужном месте шаблона? Но что, как и куда выводить?
Неактивен