# Name: rah_comment_spam v0.4 # Type: Admin/Client side plugin # Anti-spam tools to prevent comment spam # Author: Jukka Svahn # URL: http://rahforum.biz # 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: # ..................................................................... YToxMTp7czo0OiJuYW1lIjtzOjE2OiJyYWhfY29tbWVudF9zcGFtIjtzOjY6ImF1dGhvciI7 czoxMToiSnVra2EgU3ZhaG4iO3M6MTA6ImF1dGhvcl91cmkiO3M6MTk6Imh0dHA6Ly9yYWhm b3J1bS5iaXoiO3M6NzoidmVyc2lvbiI7czozOiIwLjQiO3M6MTE6ImRlc2NyaXB0aW9uIjtz OjM5OiJBbnRpLXNwYW0gdG9vbHMgdG8gcHJldmVudCBjb21tZW50IHNwYW0iO3M6NDoiaGVs cCI7czo0NDA2OiIJPGgxPnJhaF9jb21tZW50X3NwYW08L2gxPgoKCTxwPlJhaF9jb21tZW50 X3NwYW0gc2hpcHMgd2l0aCBjdXN0b21pemFibGUgYW50aS1zcGFtIHRvb2xzLiBTZXQgbWlu aW11bSBhbmQgbWF4aW11bSBtZXNzYWdlIGxlbmdodCwgZmlsdGVyIHNwYW0gd29yZHMsIHZh bGlkYXRlIGVtYWlsIGFkZHJlc3NlcywgbGltaXQgcG9zdGluZyBhY3Rpdml0eSBhbmQgc2V0 IGhpZGRlbiBzcGFtIHRyYXBzLiBUb2dnbGUgc3BhbSBwcmV2ZW50aW9uIG1ldGhvZCBiZXR3 ZWVuIGJsb2NrLCBtb2RlcmF0ZSBvciBtYXJrIGFzIHNwYW0uIEFsbCBmcm9tIHNpbXBsZSBp bnRlcmZhY2UsIG5vIGhlYWQgZmlyc3QgZGl2ZSB0byBjb2RlLjwvcD4KCgk8dWw+CgkJPGxp PlZlcnNpb246IDAuNDwvbGk+CgkJPGxpPlVwZGF0ZWQ6IDIwMTAvMDgvMDIgMDM6MDAgUE0g PHNwYW4gY2xhc3M9ImNhcHMiPlVUQzwvc3Bhbj48L2xpPgoJPC91bD4KCgk8aDM+VGFibGUg b2YgQ29udGVudHM8L2gzPgoKCTx1bD4KCQk8bGk+PGEgaHJlZj0iI2xpc3Qtb2YtZmVhdHVy ZXMiPkxpc3Qgb2YgZmVhdHVyZXM8L2E+PC9saT4KCQk8bGk+PGEgaHJlZj0iI3JlcXVpcmVt ZW50cyI+UmVxdWlyZW1lbnRzPC9hPjwvbGk+CgkJPGxpPjxhIGhyZWY9IiNpbnN0YWxsYXRp b24tYW5kLXVzYWdlIj5JbnN0YWxsYXRpb24gYW5kIHVzYWdlPC9hPjwvbGk+CgkJPGxpPjxh IGhyZWY9IiNjaGFuZ2Vsb2ciPkNoYW5nZWxvZzwvYT48L2xpPgoJPC91bD4KCgk8aDMgaWQ9 Imxpc3Qtb2YtZmVhdHVyZXMiPkxpc3Qgb2YgZmVhdHVyZXM8L2gzPgoKCTx1bD4KCQk8bGk+ U2V0IGNvbW1lbnQgbWVzc2FnZSBsZW5naHQgbGltaXRhdGlvbnM6IG1pbmltdW0gYW5kIG1h eGltdW0sIHdvcmRzIGFuZCBjaGFyYWN0ZXJzLjwvbGk+CgkJPGxpPkxpbWl0IGxpbmsgcG9z dGluZy48L2xpPgoJCTxsaT5EZWZpbmUgc3BhbSB3b3JkcywgYW5kIHNldCB0aGUgbGltaXQg aG93IG1hbnkgc3BhbSB3b3JkcyBhcmUgbmVlZGVkIHVudGlsbCBjb21tZW50IGJlY29tZXMg c3BhbS48L2xpPgoJCTxsaT5TaG93IGN1c3RvbWl6YWJsZSBlcnJvciBtZXNzYWdlcyB3aGVu IGNvbW1lbnQgaXMgYmxvY2tlZC48L2xpPgoJCTxsaT5TZXQgYSBjdXN0b20gaGlkZGVuIHNw YW0gdHJhcCBmaWVsZC48L2xpPgoJCTxsaT5DaGFuZ2UgdGhlIHNwYW0gcHJvdGVjdGlvbiBt ZXRob2QuPC9saT4KCQk8bGk+Q29tbWVudCBwb3N0aW5nIGxpbWl0IHBlciBzZXQgb2YgdGlt ZS48L2xpPgoJCTxsaT5Db21lcyB3aXRoIHNpbXBsZSBwcmVmZXJlbmNlcyBpbnRlcmZhY2U7 IG5vIGRpdmluZyBpbnRvIGNvZGUgbmVlZGVkIGF0IGFsbC48L2xpPgoJPC91bD4KCgk8aDMg aWQ9InJlcXVpcmVtZW50cyI+UmVxdWlyZW1lbnRzPC9oMz4KCgk8cD5SYWhfY29tbWVudF9z cGFtJiM4MjE3O3MgbWluaW11bSByZXF1aXJlbWVudHM6PC9wPgoKCTx1bD4KCQk8bGk+VGV4 dHBhdHRlcm4gNC4wLjcrPC9saT4KCTwvdWw+CgoJPHA+UmVjb21tZW5kZWQ6PC9wPgoKCTx1 bD4KCQk8bGk+VGV4dHBhdHRlcm4gNC4yLjArPC9saT4KCQk8bGk+alF1ZXJ5IGZvciB0aGUg YWRtaW4gcGFuZWwgKGluY2x1ZGVkIHdpdGggVGV4dHBhdHRlcm4pLjwvbGk+Cgk8L3VsPgoK CTxoMyBpZD0iaW5zdGFsbGF0aW9uLWFuZC11c2FnZSI+SW5zdGFsbGF0aW9uIGFuZCB1c2Fn ZTwvaDM+CgoJPG9sPgoJCTxsaT5OYXZpZ2F0ZSB0byB5b3VyIFRleHRwYXR0ZXJuIGluc3Rh bGxhdGlvbiYjODIxNztzIFBsdWdpbiBwYW5lbCAoPGVtPlRleHRwYXR0ZXJuIC8gQWRtaW4g LyBQbHVnaW5zPC9lbT4pLjwvbGk+CgkJPGxpPlBhc3RlIHJhaF9jb21tZW50X3NwYW0mIzgy MTc7cyBwbHVnaW4gY29kZSB0byB0aGUgcGx1Z2luIGluc3RhbGxlciB0ZXh0YXJlYSBhbmQg cnVuIHRoZSBhdXRvbWF0ZWQgc2V0dXAuPC9saT4KCQk8bGk+QWZ0ZXIgdGhlIHNldHVwIGlz IGNvbXBsZXRlZCwgYWN0aXZhdGUgdGhlIHBsdWdpbiBhbmQgeW91JiM4MjE3O3JlIHNldC48 L2xpPgoJCTxsaT5Zb3UgY2FuIGN1c3RvbWl6ZSB0aGUgcGx1Z2luJiM4MjE3O3Mgc2V0dGlu Z3MgaW4gdGhlIHBsdWdpbiYjODIxNztzIHBhbmVsOiA8ZW0+VGV4dHBhdHRlcm4gLyBFeHRl bnNpb25zIC8gQ29tbWVudCBhbnRpc3BhbTwvZW0+LjwvbGk+Cgk8L29sPgoKCTxoMyBpZD0i Y2hhbmdlbG9nIj5DaGFuZ2Vsb2c8L2gzPgoKCTxwPjxzdHJvbmc+VmVyc2lvbiAwLjQ8L3N0 cm9uZz48L3A+CgoJPHVsPgoJCTxsaT5BZGRlZDogbm93IGFsc28gZmlsdGVycyA8Y29kZT5o dHRwczovLzwvY29kZT4sIDxjb2RlPmZ0cDovLzwvY29kZT4gYW5kIDxjb2RlPmZ0cHM6Ly88 L2NvZGU+IHByb3RvY29scywgbm90IGp1c3QgbGlua3Mgc3RhcnRpbmcgd2l0aCA8Y29kZT5o dHRwOi8vPC9jb2RlPi48L2xpPgoJCTxsaT5DaGFuZ2VkIHBvc3RpbmcgbGltaXQgZmVhdHVy ZSYjODIxNztzIG1heGltdW0gcG9zdCBzZXR0aW5nIGZyb20gPGVtPiYjODIyMDttb3JlIHRo YW4mIzgyMjE7PC9lbT4gdG8gPGVtPiYjODIyMDtlcXVhbHMgb3IgbW9yZSB0aGFuJiM4MjIx OzwvZW0+LiBTZXR0aW5nIHRoZSB2YWx1ZSB0byB6ZXJvL29yIGxlYXZpbmcgaXQgZW1wdHkg d2lsbCBkaXNhYmxlIHRoZSBmZWF0dXJlLjwvbGk+CgkJPGxpPkNoYW5nZWQgZmlsdGVyaW5n IG1ldGhvZCBmcm9tIDxlbT5hbmQ8L2VtPiB0byA8ZW0+b3I8L2VtPi4gVGhpcyBtZWFucywg d2hlbiB0aGUgY29tbWVudCBnb3RzIGZsYWdnZWQgYnkgYSBmaWx0ZXIgZm9yIHRoZSBmaXJz dCB0aW1lLCB0aGUgc3BhbSBmaWx0ZXJpbmcgcHJvY2VzcyBlbmRzIGluc3RlYWQgZ29pbmcg dGhydSBhbGwgdGhlIGNoZWNrcyB3aGljaCBhcmUgbm8gbG9uZ2VyIG5lZWRlZC4gR2l2ZXMg c2xpZ2h0IHBlcmZvcm1hbmNlIGJvb3N0LjwvbGk+CgkJPGxpPkZyb20gdmVyc2lvbiAwLjQg b253YXJkcyByZXF1aXJlcyA8c3BhbiBjbGFzcz0iY2FwcyI+VFhQPC9zcGFuPiA0LjAuNyBv ciBuZXdlci48L2xpPgoJCTxsaT5Ob3cgcG9zdGluZyBsaW1pdHMgYXJlIGNvdW50ZWQgYmFy ZWx5IGJ5IE15U1FMLiBObyBpbnZvbG1lbnQgb2YgPHNwYW4gY2xhc3M9ImNhcHMiPlBIUDwv c3Bhbj4uPC9saT4KCQk8bGk+TWVyZ2VkIDxjb2RlPnJhaF9jb21tZW50X3NwYW1fdXJsY291 bnQoKTwvY29kZT4gYW5kIDxjb2RlPnJhaF9jb21tZW50X3NwYW1fc3BhbXdvcmRzKCk8L2Nv ZGU+LjwvbGk+CgkJPGxpPk5vdyBhZG1pbiBwYW5lbCB1c2VzIHNhbWUgdHlwZSBvZiBzbGlk aW5nIHBhbmVscyBhcyBzZWVuIGluIDxhIGhyZWY9Imh0dHA6Ly9yYWhmb3J1bS5iaXovcGx1 Z2lucy9yYWhfc2l0ZW1hcCI+cmFoX3NpdGVtYXA8L2E+LjwvbGk+Cgk8L3VsPgoKCTxwPjxz dHJvbmc+VmVyc2lvbiAwLjM8L3N0cm9uZz48L3A+CgoJPHVsPgoJCTxsaT5BZGRlZCBlbWFp bCA8c3BhbiBjbGFzcz0iY2FwcyI+RE5TPC9zcGFuPiB2YWxpZGF0aW9uLjwvbGk+Cgk8L3Vs PgoKCTxwPjxzdHJvbmc+VmVyc2lvbiAwLjIuMTwvc3Ryb25nPjwvcD4KCgk8dWw+CgkJPGxp Pk1hZGUgd3JpdGluZyBzcGFtIGRlZml0aW9uIGxpc3QgbGVzcyBzdHJpY3QuIE5vdyBhbGxv d3MgZG91YmxlIGNvbW1hcywgc3BhY2VzIGFuZCBzbyBvbi4gPGEgaHJlZj0iaHR0cDovL2Zv cnVtLnRleHRwYXR0ZXJuLmNvbS92aWV3dG9waWMucGhwP3BpZD0yMTI5NDMjcDIxMjk0MyI+ VGhhbmtzIFJvYmVydC48L2E+PC9saT4KCTwvdWw+CgoJPHA+PHN0cm9uZz5WZXJzaW9uIDAu Mjwvc3Ryb25nPjwvcD4KCgk8dWw+CgkJPGxpPkFkZGVkIHVzZXIgYmFzZWQgdGltZSByZWxh dGl2ZSBwb3N0aW5nIGxpbWl0LjwvbGk+CgkJPGxpPkZpeGVkIGhpZGRlbiBzcGFtdHJhcCBp bnB1dCYjODIxNztzIGVzY2FwaW5nLjwvbGk+CgkJPGxpPkltcHJvdmVkIGNvbW1lbnQgcG9z dGluZyBldmFsdWF0aW5nIHNwZWVkLjwvbGk+CgkJPGxpPk1lcmdlZCBpbnN0YWxsLCBzYXZl LCB1cGRhdGUgYW5kIGZldGNoIGFycmF5cy48L2xpPgoJCTxsaT5JbXByb3ZlZCBpbnN0YWxs YXRpb24gc2NyaXB0LjwvbGk+CgkJPGxpPk1lcmdlZCA8c3BhbiBjbGFzcz0iY2FwcyI+U1FM PC9zcGFuPiBxdWVyaWVzLjwvbGk+Cgk8L3VsPgoKCTxwPjxzdHJvbmc+VmVyc2lvbiAwLjEu Mzwvc3Ryb25nPjwvcD4KCgk8dWw+CgkJPGxpPkZpeGVkIGZvcmdvdHRlbiA8Y29kZT5zdHJ0 b2xvd2VyKCk8L2NvZGU+LjwvbGk+Cgk8L3VsPgoKCTxwPjxzdHJvbmc+VmVyc2lvbiAwLjEu Mjwvc3Ryb25nPjwvcD4KCgk8dWw+CgkJPGxpPlJlbW92ZWQgdHlwbyBmcm9tIGFkbWluIHBh bmVsOiAmIzgyMjA7RG9jdW1lbnRpb24mIzgyMjE7IHRvICYjODIyMDtEb2N1bWVudGF0aW9u JiM4MjIxOy48L2xpPgoJPC91bD4KCgk8cD48c3Ryb25nPlZlcnNpb24gMC4xPC9zdHJvbmc+ PC9wPgoKCTx1bD4KCQk8bGk+Rmlyc3QgcmVsZWFzZTwvbGk+Cgk8L3VsPiI7czo0OiJjb2Rl IjtzOjE2OTc2OiIJIyMjIyMjIyMjIyMjIyMjIyMjDQoJIw0KCSMJcmFoX2NvbW1lbnRfc3Bh bS1wbHVnaW4gZm9yIFRleHRwYXR0ZXJuDQoJIwl2ZXJzaW9uIDAuNA0KCSMJYnkgSnVra2Eg U3ZhaG4NCgkjCWh0dHA6Ly9yYWhmb3J1bS5iaXoNCgkjDQoJIyMjIyMjIyMjIyMjIyMjIyMj Iw0KDQoJaWYoQHR4cGludGVyZmFjZSA9PSAnYWRtaW4nKSB7DQoJCWFkZF9wcml2cygncmFo X2NvbW1lbnRfc3BhbScsJzEsMicpOw0KCQlyZWdpc3Rlcl90YWIoJ2V4dGVuc2lvbnMnLCdy YWhfY29tbWVudF9zcGFtJywnQ29tbWVudCBBbnRpc3BhbScpOw0KCQlyZWdpc3Rlcl9jYWxs YmFjaygncmFoX2NvbW1lbnRfc3BhbV9wYWdlJywncmFoX2NvbW1lbnRfc3BhbScpOw0KCQly ZWdpc3Rlcl9jYWxsYmFjaygncmFoX2NvbW1lbnRfc3BhbV9oZWFkJywnYWRtaW5fc2lkZScs J2hlYWRfZW5kJyk7DQoJfSBlbHNlIHsNCgkJcmVnaXN0ZXJfY2FsbGJhY2soJ3JhaF9jb21t ZW50X3NwYW0nLCdjb21tZW50LnNhdmUnKTsNCgkJcmVnaXN0ZXJfY2FsbGJhY2soJ3JhaF9j b21tZW50X3NwYW1fZm9ybScsJ2NvbW1lbnQuZm9ybScpOw0KCX0NCg0KLyoqDQoJQ2hlY2sg Zm9yIHNwYW0NCiovDQoNCglmdW5jdGlvbiByYWhfY29tbWVudF9zcGFtKCkgew0KCQkkZm9y bSA9IGdldENvbW1lbnQoKTsNCgkJJGV2YWx1YXRvciA9JiBnZXRfY29tbWVudF9ldmFsdWF0 b3IoKTsNCgkJDQoJCUAkcnMgPSByYWhfY29tbWVudF9zcGFtX2ZldGNoKCk7DQoJCQ0KCQlp ZighaXNzZXQoJHJzWyd2ZXJzaW9uJ10pKSB7DQoJCQlyYWhfY29tbWVudF9zcGFtX2luc3Rh bGwoKTsNCgkJCSRycyA9IHJhaF9jb21tZW50X3NwYW1fZmV0Y2goKTsNCgkJfQ0KCQkNCgkJ JGNoZWNrID0gZXhwbG9kZSgnLCcsJHJzWydjaGVjayddKTsNCgkJDQoJCSR3aGVyZSA9IA0K CQkJKChpbl9hcnJheSgnbWVzc2FnZScsJGNoZWNrKSkgPyAkZm9ybVsnbWVzc2FnZSddLicg JyA6ICcnKS4NCgkJCSgoaW5fYXJyYXkoJ3dlYicsJGNoZWNrKSkgPyAkZm9ybVsnd2ViJ10u JyAnIDogJycpLg0KCQkJKChpbl9hcnJheSgnZW1haWwnLCRjaGVjaykpID8gJGZvcm1bJ2Vt YWlsJ10uJyAnIDogJycpLg0KCQkJKChpbl9hcnJheSgnbmFtZScsJGNoZWNrKSkgPyAkZm9y bVsnbmFtZSddLicgJyA6ICcnKTsNCgkJDQoJCWlmKA0KCQkJKCRyc1snZmllbGQnXSAmJiB0 cmltKHBzKCRyc1snZmllbGQnXSkpKSB8fA0KCQkJDQoJCQlyYWhfY29tbWVudF9zcGFtX3dv cmRzKA0KCQkJCSR3aGVyZSwNCgkJCQkkcnMNCgkJCSkgfHwNCgkJCQ0KCQkJcmFoX2NvbW1l bnRfc3BhbV9jaGFycygNCgkJCQkkZm9ybVsnbWVzc2FnZSddLA0KCQkJCSRycw0KCQkJKSB8 fA0KCQkJDQoJCQlyYWhfY29tbWVudF9zcGFtX2ZpbmQoDQoJCQkJJHJzWydzcGFtd29yZHMn XSwNCgkJCQkkZm9ybVsnbWVzc2FnZSddLA0KCQkJCSRyc1snbWF4c3BhbXdvcmRzJ10NCgkJ CSkgfHwNCgkJCQ0KCQkJcmFoX2NvbW1lbnRfc3BhbV9maW5kKA0KCQkJCWFycmF5KA0KCQkJ CQknaHR0cHM6Ly8nLA0KCQkJCQknaHR0cDovLycsDQoJCQkJCSdmdHA6Ly8nLA0KCQkJCQkn ZnRwczovLycNCgkJCQkpLA0KCQkJCSRmb3JtWydtZXNzYWdlJ10sDQoJCQkJJHJzWyd1cmxj b3VudCddDQoJCQkpIHx8DQoJCQkNCgkJCXJhaF9jb21tZW50X3NwYW1fbGltaXRjb21tZW50 cygNCgkJCQkkcnMNCgkJCSkgfHwNCgkJCQ0KCQkJcmFoX2NvbW1lbnRfc3BhbV9kbnMoJGZv cm1bJ2VtYWlsJ10sJHJzKQ0KCQkNCgkJKSB7DQoJCQlzd2l0Y2goJHJzWydtZXRob2QnXSkg ew0KCQkJCWNhc2UgJ2Jsb2NrJyA6DQoJCQkJCSRldmFsdWF0b3IgLT4gYWRkX2VzdGltYXRl KFJFTE9BRCwxLCRyc1snbWVzc2FnZSddKTsNCgkJCQlicmVhazsNCgkJCQljYXNlICdtb2Rl cmF0ZScgOg0KCQkJCQkkZXZhbHVhdG9yIC0+IGFkZF9lc3RpbWF0ZShNT0RFUkFURSwwLjc1 KTsNCgkJCQlicmVhazsNCgkJCQlkZWZhdWx0IDoNCgkJCQkJJGV2YWx1YXRvciAtPiBhZGRf ZXN0aW1hdGUoU1BBTSwwLjc1KTsNCgkJCX0NCgkJfQ0KCX0NCg0KLyoqDQoJT3V0cHV0cyBo aWRkZW4gc3BhbSB0cmFwDQoqLw0KDQoJZnVuY3Rpb24gcmFoX2NvbW1lbnRfc3BhbV9mb3Jt KCkgew0KCQkkZmllbGQgPSANCgkJCWZldGNoKA0KCQkJCSd2YWx1ZScsDQoJCQkJJ3JhaF9j b21tZW50X3NwYW0nLA0KCQkJCSduYW1lJywNCgkJCQknZmllbGQnDQoJCQkpOw0KDQoJCWlm KCFlbXB0eSgkZmllbGQpKQ0KCQkJcmV0dXJuIA0KCQkJCW4uDQoJCQkJJzxkaXYgc3R5bGU9 ImRpc3BsYXk6bm9uZTsiPicuDQoJCQkJCSc8aW5wdXQgdHlwZT0idGV4dCIgdmFsdWU9Iicu aHRtbHNwZWNpYWxjaGFycyhwcygkZmllbGQpKS4nIiBuYW1lPSInLmh0bWxzcGVjaWFsY2hh cnMoJGZpZWxkKS4nIiAvPicuDQoJCQkJJzwvZGl2PicNCgkJCQkubg0KCQkJOw0KCX0NCg0K LyoqDQoJRmluZHMgbmVlZGxlIGZyb20gaGF5c3RhY2sNCiovDQoNCglmdW5jdGlvbiByYWhf Y29tbWVudF9zcGFtX2ZpbmQoJG5lZWRsZSwkc3RyaW5nLCRtYXg9MCwkY291bnQ9MCkgew0K CQkNCgkJaWYoISRuZWVkbGUgfHwgISRzdHJpbmcpDQoJCQlyZXR1cm47DQoJCQ0KCQkkc3Ry aW5nID0gc3RydG9sb3dlcignICcuJHN0cmluZy4nICcpOw0KCQkNCgkJaWYoIWlzX2FycmF5 KCRuZWVkbGUpKQ0KCQkJJG5lZWRsZSA9IGV4cGxvZGUoJywnLHN0cnRvbG93ZXIoJG5lZWRs ZSkpOw0KCQkNCgkJZm9yZWFjaCgkbmVlZGxlIGFzICRmaW5kKSB7DQoJCQkkZmluZCA9IHRy aW0oJGZpbmQpOw0KCQkJaWYoIWVtcHR5KCRmaW5kKSkNCgkJCQkkY291bnQgKz0gc3Vic3Ry X2NvdW50KCRzdHJpbmcsJGZpbmQpOw0KCQl9DQoJCQ0KCQlpZigkY291bnQgPiAkbWF4KQ0K CQkJcmV0dXJuIDE7DQoJfQ0KDQovKioNCglDb3VudCBjaGFyYWN0ZXJzDQoqLw0KDQoJZnVu Y3Rpb24gcmFoX2NvbW1lbnRfc3BhbV9jaGFycygkc3RyaW5nLCRycykgew0KCQlleHRyYWN0 KCRycyk7DQoJCQ0KCQlpZighJHN0cmluZyB8fCAoISRtaW5jaGFycyAmJiAhJG1heGNoYXJz KSkNCgkJCXJldHVybjsNCgkJDQoJCSRjaGFycyA9IHN0cmxlbigkc3RyaW5nKTsNCgkJDQoJ CWlmKCgkbWF4Y2hhcnMgJiYgJG1heGNoYXJzIDwgJGNoYXJzKSB8fCAoJG1pbmNoYXJzICYm ICRjaGFycyA8PSAkbWluY2hhcnMpKQ0KCQkJcmV0dXJuIDE7DQoJCQ0KCX0NCg0KLyoqDQoJ Q291bnQgd29yZHMNCiovDQoNCglmdW5jdGlvbiByYWhfY29tbWVudF9zcGFtX3dvcmRzKCRz dHJpbmcsJHJzKSB7DQoJCWV4dHJhY3QoJHJzKTsNCgkJDQoJCWlmKCEkc3RyaW5nIHx8ICgh JG1heHdvcmRzICYmICEkbWlud29yZHMpKQ0KCQkJcmV0dXJuOw0KCQkNCgkJJHdvcmRzID0g Y291bnQoZXhwbG9kZShjaHIoMzIpLCRzdHJpbmcpKTsNCgkJDQoJCWlmKCgkbWF4d29yZHMg JiYgJG1heHdvcmRzIDwgJHdvcmRzKSB8fCAoJG1pbndvcmRzICYmICR3b3JkcyA8PSAkbWlu d29yZHMpKQ0KCQkJcmV0dXJuIDE7DQoJfQ0KDQovKioNCglMaW1pdCBjb21tZW50IHBvc3Rp bmcNCiovDQoNCglmdW5jdGlvbiByYWhfY29tbWVudF9zcGFtX2xpbWl0Y29tbWVudHMoJHJz KSB7DQoJCWdsb2JhbCAkdGhpc2FydGljbGU7DQoJCWV4dHJhY3QoJHJzKTsNCgkJDQoJCWlm KA0KCQkJJGNvbW1lbnR1c2UgIT0gJ3llcycgfHwgDQoJCQkhJGNvbW1lbnR0aW1lIHx8IA0K CQkJISRjb21tZW50bGltaXQgfHwgDQoJCQkhaXNzZXQoJF9TRVJWRVJbJ1JFTU9URV9BRERS J10pIHx8IA0KCQkJKCRjb21tZW50aW4gPT0gJ3RoaXMnICYmICFpc3NldCgkdGhpc2FydGlj bGVbJ2lkJ10pKQ0KCQkpDQoJCQlyZXR1cm47DQoJCQ0KCQlpZigNCgkJCXNhZmVfY291bnQo DQoJCQkJJ3R4cF9kaXNjdXNzJywNCgkJCQkiaXA9JyIuZG9TbGFzaCgkX1NFUlZFUlsnUkVN T1RFX0FERFInXSkuIicgYW5kICIuDQoJCQkJIlVOSVhfVElNRVNUQU1QKHBvc3RlZCkgPiAo VU5JWF9USU1FU1RBTVAobm93KCkpLSRjb21tZW50dGltZSkiLg0KCQkJCSgoJGNvbW1lbnRp biA9PSAndGhpcycpID8gIiBhbmQgcGFyZW50aWQ9JyIuZG9TbGFzaCgkdGhpc2FydGljbGVb J2lkJ10pLiInIiA6ICcnKQ0KCQkJKSA+PSAkY29tbWVudGxpbWl0DQoJCSkNCgkJCXJldHVy biAxOw0KCX0NCg0KLyoqDQoJQ2hlY2sgRE5TDQoqLw0KDQoJZnVuY3Rpb24gcmFoX2NvbW1l bnRfc3BhbV9kbnMoJGNoZWNraW5nLCRycykgew0KCQkNCgkJZXh0cmFjdCgkcnMpOw0KCQkN CgkJaWYoJGVtYWlsZG5zID09ICdubycgfHwgIXRyaW0oJGNoZWNraW5nKSkNCgkJCXJldHVy bjsNCgkJDQoJCSRjaGVja2luZyA9IGV4cGxvZGUoJ0AnLCRjaGVja2luZyk7DQoJCQ0KCQlp Zihjb3VudCgkY2hlY2tpbmcpICE9IDIpDQoJCQlyZXR1cm4gMTsNCgkJDQoJCSRkb21haW4g PSB0cmltKCRjaGVja2luZ1sxXSk7DQoNCgkJaWYoISRkb21haW4pDQoJCQlyZXR1cm4gMTsN CgkJDQoJCWlmKHN1YnN0cl9jb3VudCgkZG9tYWluLCcuJykgPT0gMCkNCgkJCXJldHVybiAx Ow0KCQkNCgkJaWYoIWZ1bmN0aW9uX2V4aXN0cygnY2hlY2tkbnNycicpKQ0KCQkJcmV0dXJu Ow0KCQkNCgkJaWYoIShjaGVja2Ruc3JyKCRkb21haW4sJ01YJykgfHwgY2hlY2tkbnNycigk ZG9tYWluLCdBJykpKQ0KCQkJcmV0dXJuIDE7DQoNCgl9DQoNCi8qKg0KCURlbGl2ZXJzIHRo ZSBwYW5lbHMNCiovDQoNCglmdW5jdGlvbiByYWhfY29tbWVudF9zcGFtX3BhZ2UoKSB7DQoJ CWdsb2JhbCAkc3RlcDsNCgkJcmVxdWlyZV9wcml2cygncmFoX2NvbW1lbnRfc3BhbScpOw0K CQlyYWhfY29tbWVudF9zcGFtX2luc3RhbGwoKTsNCgkJaWYoJHN0ZXAgPT0gJ3JhaF9jb21t ZW50X3NwYW1fc2F2ZScpDQoJCQkkc3RlcCgpOw0KCQllbHNlDQoJCQlyYWhfY29tbWVudF9z cGFtX2VkaXQoKTsNCgl9DQoNCi8qKg0KCUFkZHMgQ1NTL0pTIHRvIDxoZWFkPiBmb3IgdGhl IHBhbmVsDQoqLw0KDQoJZnVuY3Rpb24gcmFoX2NvbW1lbnRfc3BhbV9oZWFkKCkgew0KCQkN CgkJZ2xvYmFsICRldmVudDsNCgkJDQoJCWlmKCRldmVudCAhPSAncmFoX2NvbW1lbnRfc3Bh bScpDQoJCQlyZXR1cm47DQoJCQ0KCQllY2hvIDw8PEVPRg0KCQkJPHN0eWxlIHR5cGU9InRl eHQvY3NzIj4NCgkJCQkjcmFoX2NvbW1lbnRfc3BhbV9jb250YWluZXIgew0KCQkJCQl3aWR0 aDogOTUwcHg7DQoJCQkJCW1hcmdpbjogMCBhdXRvOw0KCQkJCX0NCgkJCQkjcmFoX2NvbW1l bnRfc3BhbV9jb250YWluZXIgaW5wdXQuZWRpdCwNCgkJCQkjcmFoX2NvbW1lbnRfc3BhbV9j b250YWluZXIgdGV4dGFyZWEgew0KCQkJCQl3aWR0aDogOTQwcHg7DQoJCQkJCXBhZGRpbmc6 IDA7DQoJCQkJfQ0KCQkJCSNyYWhfY29tbWVudF9zcGFtX2NvbnRhaW5lciBzZWxlY3Qgew0K CQkJCQl3aWR0aDogNjQwcHg7DQoJCQkJCXBhZGRpbmc6IDA7DQoJCQkJfQ0KCQkJCSNyYWhf Y29tbWVudF9zcGFtX2NvbnRhaW5lciAucmFoX2NvbW1lbnRfc3BhbV9tb3JlIHsNCgkJCQkJ b3ZlcmZsb3c6IGhpZGRlbjsNCgkJCQl9DQoJCQkJI3JhaF9jb21tZW50X3NwYW1fbGltaXRh dGlvbnMgew0KCQkJCQltYXJnaW46IDAgMCAyMHB4IDA7DQoJCQkJfQ0KCQkJCSNyYWhfY29t bWVudF9zcGFtX2xpbWl0YXRpb25zIGxhYmVsIHsNCgkJCQkJd2lkdGg6IDE5MHB4Ow0KCQkJ CQlmbG9hdDogbGVmdDsNCgkJCQkJbWFyZ2luOiAwOw0KCQkJCQlwYWRkaW5nOiAwOw0KCQkJ CX0NCgkJCQkjcmFoX2NvbW1lbnRfc3BhbV9jb250YWluZXIgI3JhaF9jb21tZW50X3NwYW1f bGltaXRhdGlvbnMgaW5wdXQuZWRpdCB7DQoJCQkJCXdpZHRoOiAxNzBweDsNCgkJCQl9DQoJ CQkJI3JhaF9jb21tZW50X3NwYW1fY29udGFpbmVyIC5yYWhfY29tbWVudF9zcGFtX2hlYWRp bmcgew0KCQkJCQlmb250LXdlaWdodDogOTAwOw0KCQkJCQlwYWRkaW5nOiA1cHggMDsNCgkJ CQkJbWFyZ2luOiAwIDAgMTBweCAwOw0KCQkJCQlib3JkZXItdG9wOiAxcHggc29saWQgI2Nj YzsNCgkJCQkJYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNjY2M7DQoJCQkJfQ0KCQkJCSNy YWhfY29tbWVudF9zcGFtX2NvbnRhaW5lciAucmFoX2NvbW1lbnRfc3BhbV9oZWFkaW5nIHNw YW4gew0KCQkJCQljdXJzb3I6IHBvaW50ZXI7DQoJCQkJCWNvbG9yOiAjOTYzOw0KCQkJCX0N CgkJCQkjcmFoX2NvbW1lbnRfc3BhbV9jb250YWluZXIgLnJhaF9jb21tZW50X3NwYW1faGVh ZGluZyBzcGFuOmhvdmVyIHsNCgkJCQkJdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7DQoJ CQkJfQ0KCQkJPC9zdHlsZT4NCgkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4N CgkJCQkkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpew0KCQkJCQkkKCcucmFoX2NvbW1l bnRfc3BhbV9tb3JlJykuaGlkZSgpOw0KCQkJCQkkKCcucmFoX2NvbW1lbnRfc3BhbV9oZWFk aW5nJykuY2xpY2soZnVuY3Rpb24oKXsNCgkJCQkJCSQodGhpcykubmV4dCgnZGl2LnJhaF9j b21tZW50X3NwYW1fbW9yZScpLnNsaWRlVG9nZ2xlKCk7DQoJCQkJCX0pOw0KCQkJCX0pOw0K CQkJPC9zY3JpcHQ+DQpFT0Y7DQoJfQ0KCQ0KLyoqDQoJUHJlZmVyZW5jZXMgcGFuZWwNCiov DQoNCglmdW5jdGlvbiByYWhfY29tbWVudF9zcGFtX2VkaXQoJG1lc3NhZ2U9JycpIHsNCg0K CQlwYWdldG9wKCdDb21tZW50IEFudGlzcGFtJywkbWVzc2FnZSk7DQoNCgkJZXh0cmFjdCgN CgkJCXJhaF9jb21tZW50X3NwYW1fZmV0Y2goMSkNCgkJKTsNCg0KCQkkY2hlY2sgPSBleHBs b2RlKCcsJywkY2hlY2spOw0KDQoJCWdsb2JhbCAkZXZlbnQ7DQoNCgkJZWNobyBuLg0KCQkJ CScJPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249ImluZGV4LnBocCIgaWQ9InJhaF9jb21t ZW50X3NwYW1fY29udGFpbmVyIj4nLm4uDQoJCQkJJwkJPGgxPjxzdHJvbmc+cmFoX2NvbW1l bnRfc3BhbTwvc3Ryb25nPiB8IENvbW1lbnQgYW50aS1zcGFtIHRvb2xzPC9oMT4nLm4uDQoJ CQkJJwkJPHA+JiMxODc7IDxhIGhyZWY9Ij9ldmVudD1wbHVnaW4mYW1wO3N0ZXA9cGx1Z2lu X2hlbHAmYW1wO25hbWU9cmFoX2NvbW1lbnRfc3BhbSI+RG9jdW1lbnRhdGlvbjwvYT48L3A+ Jy5uLg0KCQkJCScJCTxwPicubi4NCgkJCQknCQkJPHN0cm9uZz5QcmVmZXJlbmNlczo8L3N0 cm9uZz4nLm4uDQoJCQkJJwkJPC9wPicubi4NCgkJCQknCQk8cCB0aXRsZT0iQ2xpY2sgdG8g ZXhwYW5kIiBjbGFzcz0icmFoX2NvbW1lbnRfc3BhbV9oZWFkaW5nIj4nLm4uDQoJCQkJJwkJ CSsgPHNwYW4+UHJvdGVjdGlvbiBtZXRob2QgYW5kIG1lc3NhZ2VzPC9zcGFuPicubi4NCgkJ CQknCQk8L3A+Jy5uLg0KCQkJCScJCTxkaXYgY2xhc3M9InJhaF9jb21tZW50X3NwYW1fbW9y ZSI+Jy5uLg0KCQkJCScJCQk8cD4nLm4uDQoJCQkJJwkJCQk8bGFiZWw+Jy5uLg0KCQkJCScJ CQkJCVByb3RlY3Rpb24gbWV0aG9kOjxiciAvPicubi4NCgkJCQknCQkJCQk8c2VsZWN0IG5h bWU9Im1ldGhvZCI+Jy5uLg0KCQkJCScJCQkJCQk8b3B0aW9uIHZhbHVlPSJibG9jayInLigo JG1ldGhvZCA9PSAnYmxvY2snKSA/ICcgc2VsZWN0ZWQ9InNlbGVjdGVkIicgOiAnJykuJz5C bG9jayBhbmQgZG9uXCd0IHNhdmU8L29wdGlvbj4nLm4uDQoJCQkJJwkJCQkJCTxvcHRpb24g dmFsdWU9Im1vZGVyYXRlIicuKCgkbWV0aG9kID09ICdtb2RlcmF0ZScpID8gJyBzZWxlY3Rl ZD0ic2VsZWN0ZWQiJyA6ICcnKS4nPk1vZGVyYXRlIHNwYW08L29wdGlvbj4nLm4uDQoJCQkJ JwkJCQkJCTxvcHRpb24gdmFsdWU9InNwYW0iJy4oKCRtZXRob2QgPT0gJ3NwYW0nKSA/ICcg c2VsZWN0ZWQ9InNlbGVjdGVkIicgOiAnJykuJz5GbGFnIGFzIHNwYW08L29wdGlvbj4nLm4u DQoJCQkJJwkJCQkJPC9zZWxlY3Q+Jy5uLg0KCQkJCScJCQkJPC9sYWJlbD4nLm4uDQoJCQkJ JwkJCTwvcD4nLm4uDQoJCQkJJwkJCTxwPicubi4NCgkJCQknCQkJCTxsYWJlbD4nLm4uDQoJ CQkJJwkJCQkJRXJyb3IgbWVzc2FnZSBkaXNwbGF5ZWQgdG8gdGhlIGNvbW1lbnRhdG9yOjxi ciAvPicubi4NCgkJCQknCQkJCQk8aW5wdXQgY2xhc3M9ImVkaXQiIHR5cGU9InRleHQiIG5h bWU9Im1lc3NhZ2UiIHZhbHVlPSInLiRtZXNzYWdlLiciIC8+Jy5uLg0KCQkJCScJCQkJPC9s YWJlbD4nLm4uDQoJCQkJJwkJCTwvcD4nLm4uDQoJCQkJJwkJPC9kaXY+Jy5uLg0KCQkJCScJ CTxwIHRpdGxlPSJDbGljayB0byBleHBhbmQiIGNsYXNzPSJyYWhfY29tbWVudF9zcGFtX2hl YWRpbmciPicubi4NCgkJCQknCQkJKyA8c3Bhbj5TZXQgY29tbWVudCBtZXNzYWdlIGxlbmdo dCBsaW1pdGF0aW9uczwvc3Bhbj4nLm4uDQoJCQkJJwkJPC9wPicubi4NCgkJCQknCQk8ZGl2 IGlkPSJyYWhfY29tbWVudF9zcGFtX2xpbWl0YXRpb25zIiBjbGFzcz0icmFoX2NvbW1lbnRf c3BhbV9tb3JlIj4nLm4uDQoJCQkJJwkJCTxwPicubi4NCgkJCQknCQkJCUZpbGwgZXZlcnkg ZmllbGQgb25seSB3aXRoIGV2ZW4gbnVtYmVycyBncmVhdGVyIHRoYW4gMC4gTWluaW1hbCB2 YWx1ZSBpcyAxLiAnLm4uDQoJCQkJJwkJCQlJZiBmaWVsZCBpcyBsZWZ0IGVtcHR5IG9yIHZh bHVlIGlzIHNldCB0byAwICh6ZXJvKSwgdGhlIGxpbWl0IHdpbGwgYmUgZGlzYWJsZWQuJy5u Lg0KCQkJCScJCQk8L3A+Jy5uLg0KCQkJCScJCQk8bGFiZWw+Jy5uLg0KCQkJCScJCQkJTWF4 IHdvcmRzOjxiciAvPicubi4NCgkJCQknCQkJCTxpbnB1dCBjbGFzcz0iZWRpdCIgdHlwZT0i dGV4dCIgbmFtZT0ibWF4d29yZHMiIHZhbHVlPSInLiRtYXh3b3Jkcy4nIiAvPicubi4NCgkJ CQknCQkJPC9sYWJlbD4nLm4uDQoJCQkJJwkJCTxsYWJlbD4nLm4uDQoJCQkJJwkJCQlNaW4g d29yZHM6PGJyIC8+Jy5uLg0KCQkJCScJCQkJPGlucHV0IGNsYXNzPSJlZGl0IiB0eXBlPSJ0 ZXh0IiBuYW1lPSJtaW53b3JkcyIgdmFsdWU9IicuJG1pbndvcmRzLiciIC8+Jy5uLg0KCQkJ CScJCQk8L2xhYmVsPicubi4NCgkJCQknCQkJPGxhYmVsPicubi4NCgkJCQknCQkJCU1heCBj aGFyYWN0ZXJzOjxiciAvPicubi4NCgkJCQknCQkJCTxpbnB1dCBjbGFzcz0iZWRpdCIgdHlw ZT0idGV4dCIgbmFtZT0ibWF4Y2hhcnMiIHZhbHVlPSInLiRtYXhjaGFycy4nIiAvPicubi4N CgkJCQknCQkJPC9sYWJlbD4nLm4uDQoJCQkJJwkJCTxsYWJlbD4nLm4uDQoJCQkJJwkJCQlN aW4gY2hhcmFjdGVyczo8YnIgLz4nLm4uDQoJCQkJJwkJCQk8aW5wdXQgY2xhc3M9ImVkaXQi IHR5cGU9InRleHQiIG5hbWU9Im1pbmNoYXJzIiB2YWx1ZT0iJy4kbWluY2hhcnMuJyIgLz4n Lm4uDQoJCQkJJwkJCTwvbGFiZWw+Jy5uLg0KCQkJCScJCTwvZGl2Picubi4NCgkJCQknCQk8 cCB0aXRsZT0iQ2xpY2sgdG8gZXhwYW5kIiBjbGFzcz0icmFoX2NvbW1lbnRfc3BhbV9oZWFk aW5nIj4nLm4uDQoJCQkJJwkJCSsgPHNwYW4+VVJMIGFuZCBsaW5rIGxpbWl0YXRpb25zPC9z cGFuPicubi4NCgkJCQknCQk8L3A+Jy5uLg0KCQkJCScJCTxkaXYgY2xhc3M9InJhaF9jb21t ZW50X3NwYW1fbW9yZSI+Jy5uLg0KCQkJCScJCQk8cD4nLm4uDQoJCQkJJwkJCQk8bGFiZWw+ Jy5uLg0KCQkJCScJCQkJCU1heGltdW0gYW1vdW50IG9mIFVSTHM/IElmIHNldCB0byB6ZXJv ICgwKSBubyBVUkxzIGFyZSBhbGxvd2VkIGluIGNvbW1lbnRzLjxiciAvPicubi4NCgkJCQkn CQkJCQk8aW5wdXQgY2xhc3M9ImVkaXQiIHR5cGU9InRleHQiIG5hbWU9InVybGNvdW50IiB2 YWx1ZT0iJy4kdXJsY291bnQuJyIgLz4nLm4uDQoJCQkJJwkJCQk8L2xhYmVsPicubi4NCgkJ CQknCQkJPC9wPicubi4NCgkJCQknCQk8L2Rpdj4nLm4uDQoJCQkJJwkJPHAgdGl0bGU9IkNs aWNrIHRvIGV4cGFuZCIgY2xhc3M9InJhaF9jb21tZW50X3NwYW1faGVhZGluZyI+Jy5uLg0K CQkJCScJCQkrIDxzcGFuPkRlZmluZSBzcGFtIHdvcmQgZmlsdGVyczwvc3Bhbj4nLm4uDQoJ CQkJJwkJPC9wPicubi4NCgkJCQknCQk8ZGl2IGNsYXNzPSJyYWhfY29tbWVudF9zcGFtX21v cmUiPicubi4NCgkJCQknCQkJPHA+Jy5uLg0KCQkJCScJCQkJPGxhYmVsPicubi4NCgkJCQkn CQkJCQlMaXN0IG9mIHNwYW0gd29yZHMuIENvbW1hIHNlcGFyYXRlZCBpZiBtdWx0aXBsZTo8 YnIgLz4nLm4uDQoJCQkJJwkJCQkJPHRleHRhcmVhIG5hbWU9InNwYW13b3JkcyIgY29scz0i MzAiIHJvd3M9IjgiPicuJHNwYW13b3Jkcy4nPC90ZXh0YXJlYT4nLm4uDQoJCQkJJwkJCQk8 L2xhYmVsPicubi4NCgkJCQknCQkJPC9wPicubi4NCgkJCQknCQkJPHA+Jy5uLg0KCQkJCScJ CQkJPGxhYmVsPicubi4NCgkJCQknCQkJCQlNYXggYW1vdW50IG9mIHNwYW0gd29yZHMgdW50 aWwgY29tbWVudCBiZWNvbWVzIGEgc3BhbSAoemVybyBpcyBpbnN0YW50KTo8YnIgLz4nLm4u DQoJCQkJJwkJCQkJPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJlZGl0IiBuYW1lPSJtYXhz cGFtd29yZHMiIHNpemU9IjQiIHZhbHVlPSInLiRtYXhzcGFtd29yZHMuJyIgLz4nLm4uDQoJ CQkJJwkJCQk8L2xhYmVsPicubi4NCgkJCQknCQkJPC9wPicubi4NCgkJCQknCQkJPHA+U2Vh cmNoIHNwYW0gd29yZHMgZnJvbTo8L3A+Jy5uLg0KCQkJCScJCQk8cD4nLm4uDQoJCQkJJwkJ CQk8bGFiZWw+Jy5uLg0KCQkJCScJCQkJCTxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0i Y2hlY2tbXSIgdmFsdWU9Im1lc3NhZ2UiJy4oKGluX2FycmF5KCdtZXNzYWdlJywkY2hlY2sp KSA/ICcgY2hlY2tlZD0iY2hlY2tlZCInIDogJycpLicgLz4nLm4uDQoJCQkJJwkJCQkJQ29t bWVudCBtZXNzYWdlJy5uLg0KCQkJCScJCQkJPC9sYWJlbD4nLm4uDQoJCQkJJwkJCQk8bGFi ZWw+Jy5uLg0KCQkJCScJCQkJCTxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iY2hlY2tb XSIgdmFsdWU9IndlYiInLigoaW5fYXJyYXkoJ3dlYicsJGNoZWNrKSkgPyAnIGNoZWNrZWQ9 ImNoZWNrZWQiJyA6ICcnKS4nIC8+Jy5uLg0KCQkJCScJCQkJCUNvbW1lbnQgd2ViIGlucHV0 Jy5uLg0KCQkJCScJCQkJPC9sYWJlbD4nLm4uDQoJCQkJJwkJCQk8bGFiZWw+Jy5uLg0KCQkJ CScJCQkJCTxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iY2hlY2tbXSIgdmFsdWU9ImVt YWlsIicuKChpbl9hcnJheSgnZW1haWwnLCRjaGVjaykpID8gJyBjaGVja2VkPSJjaGVja2Vk IicgOiAnJykuJyAvPicubi4NCgkJCQknCQkJCQlDb21tZW50IGVtYWlsJy5uLg0KCQkJCScJ CQkJPC9sYWJlbD4nLm4uDQoJCQkJJwkJCQk8bGFiZWw+Jy5uLg0KCQkJCScJCQkJCTxpbnB1 dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iY2hlY2tbXSIgdmFsdWU9Im5hbWUiJy4oKGluX2Fy cmF5KCduYW1lJywkY2hlY2spKSA/ICcgY2hlY2tlZD0iY2hlY2tlZCInIDogJycpLicgLz4n Lm4uDQoJCQkJJwkJCQkJQ29tbWVudGF0b3IgbmFtZScubi4NCgkJCQknCQkJCTwvbGFiZWw+ Jy5uLg0KCQkJCScJCQk8L3A+Jy5uLg0KCQkJCScJCTwvZGl2Picubi4NCgkJCQknCQk8cCB0 aXRsZT0iQ2xpY2sgdG8gZXhwYW5kIiBjbGFzcz0icmFoX2NvbW1lbnRfc3BhbV9oZWFkaW5n Ij4nLm4uDQoJCQkJJwkJCSsgPHNwYW4+VGltZWludGVydmFscyBhbmQgcG9zdGluZyBsaW1p dHM8L3NwYW4+Jy5uLg0KCQkJCScJCTwvcD4nLm4uDQoJCQkJJwkJPGRpdiBjbGFzcz0icmFo X2NvbW1lbnRfc3BhbV9tb3JlIj4nLm4uDQoJCQkJJwkJCTxwPicubi4NCgkJCQknCQkJCUNv bW1lbnRhdG9ycyB3aWxsIGJlIGRldGVjdGVkIGJhc2VkIG9uIHRoZSBJUCBhZGRyZXNzLiBJ ZiB0aGUgY29tbWVudGF0b3IgZXhjZWVkcyB0aGUgc2V0IGFjdGl2aXR5ICcubi4NCgkJCQkn CQkJCWxpbWl0LCB0aGUgY29tbWVudCB3aWxsIGJlIHRyZWF0ZWQgYXMgc3BhbS4nLm4uDQoJ CQkJJwkJCTwvcD4nLm4uDQoJCQkJJwkJCTxwPicubi4NCgkJCQknCQkJCTxsYWJlbD4nLm4u DQoJCQkJJwkJCQkJVXNlIHRoZSBmZWF0dXJlIGFuZCBsaW1pdCBwb3N0aW5nPzxiciAvPicu bi4NCgkJCQknCQkJCQk8c2VsZWN0IG5hbWU9ImNvbW1lbnR1c2UiPicubi4NCgkJCQknCQkJ CQkJPG9wdGlvbiB2YWx1ZT0ieWVzIicuKCgkY29tbWVudHVzZSA9PSAneWVzJykgPyAnIHNl bGVjdGVkPSJzZWxlY3RlZCInIDogJycpLic+WWVzPC9vcHRpb24+Jy5uLg0KCQkJCScJCQkJ CQk8b3B0aW9uIHZhbHVlPSJubyInLigoJGNvbW1lbnR1c2UgPT0gJ25vJykgPyAnIHNlbGVj dGVkPSJzZWxlY3RlZCInIDogJycpLic+Tm88L29wdGlvbj4nLm4uDQoJCQkJJwkJCQkJPC9z ZWxlY3Q+Jy5uLg0KCQkJCScJCQkJPC9sYWJlbD4nLm4uDQoJCQkJJwkJCTwvcD4nLm4uDQoJ CQkJJwkJCTxwPicubi4NCgkJCQknCQkJCTxsYWJlbD4nLm4uDQoJCQkJJwkJCQkJQ291bnQg Y29tbWVudHMgaW4gYXJ0aWNsZXM6PGJyIC8+Jy5uLg0KCQkJCScJCQkJCTxzZWxlY3QgbmFt ZT0iY29tbWVudGluIj4nLm4uDQoJCQkJJwkJCQkJCTxvcHRpb24gdmFsdWU9ImFsbCInLigo JGNvbW1lbnRpbiA9PSAnYWxsJykgPyAnIHNlbGVjdGVkPSJzZWxlY3RlZCInIDogJycpLic+ QWxsIGFydGljbGVzPC9vcHRpb24+Jy5uLg0KCQkJCScJCQkJCQk8b3B0aW9uIHZhbHVlPSJ0 aGlzIicuKCgkY29tbWVudGluID09ICd0aGlzJykgPyAnIHNlbGVjdGVkPSJzZWxlY3RlZCIn IDogJycpLic+VXNlciBjdXJyZW50bHkgdmlld2luZyBhbmQgY29tbWVudGluZzwvb3B0aW9u Picubi4NCgkJCQknCQkJCQk8L3NlbGVjdD4nLm4uDQoJCQkJJwkJCQk8L2xhYmVsPicubi4N CgkJCQknCQkJPC9wPicubi4NCgkJCQknCQkJPHA+Jy5uLg0KCQkJCScJCQkJPGxhYmVsPicu bi4NCgkJCQknCQkJCQlNYXhpbXVtIG51bWJlciBvZiBwb3N0czo8YnIgLz4nLm4uDQoJCQkJ JwkJCQkJPGlucHV0IGNsYXNzPSJlZGl0IiB0eXBlPSJ0ZXh0IiBuYW1lPSJjb21tZW50bGlt aXQiIHZhbHVlPSInLiRjb21tZW50bGltaXQuJyIgLz4nLm4uDQoJCQkJJwkJCQk8L2xhYmVs Picubi4NCgkJCQknCQkJCTxsYWJlbD4nLm4uDQoJCQkJJwkJCQkJV2l0aGluIGxhc3QgeCBz ZWNvbmRzOjxiciAvPicubi4NCgkJCQknCQkJCQk8aW5wdXQgY2xhc3M9ImVkaXQiIHR5cGU9 InRleHQiIG5hbWU9ImNvbW1lbnR0aW1lIiB2YWx1ZT0iJy4kY29tbWVudHRpbWUuJyIgLz4n Lm4uDQoJCQkJJwkJCQk8L2xhYmVsPicubi4NCgkJCQknCQkJPC9wPicubi4NCgkJCQknCQk8 L2Rpdj4nLm4uDQoJCQkJJwkJPHAgdGl0bGU9IkNsaWNrIHRvIGV4cGFuZCIgY2xhc3M9InJh aF9jb21tZW50X3NwYW1faGVhZGluZyI+Jy5uLg0KCQkJCScJCQkrIDxzcGFuPkhpZGRlbiBz cGFtIHRyYXA8L3NwYW4+Jy5uLg0KCQkJCScJCTwvcD4nLm4uDQoJCQkJJwkJPGRpdiBjbGFz cz0icmFoX2NvbW1lbnRfc3BhbV9tb3JlIj4nLm4uCQ0KCQkJCScJCQk8cD4nLm4uDQoJCQkJ JwkJCQlBZGRzIGEgaGlkZGVuIHNwYW0gdHJhcCBmaWVsZCB0byB0aGUgY29tbWVudCBmb3Jt LiBUaGUgZmllbGQgaXMgbWFkZSBpbnZpc2libGUgdG8gbm9ybWFsIHVzZXJzIHdpdGggJy5u Lg0KCQkJCScJCQkJPGFiYnIgdGl0bGU9IkNhc2NhZGluZyBTdHlsZSBTaGVldHMiPkNTUzwv YWJicj4uIElmIHRoZSBmaWVsZCBpcyBmaWxsZWQsIGJ5IGJvdCB1c3VhbGx5LCB0aGUgY29t bWVudCBpcyAnLm4uDQoJCQkJJwkJCQltYXJrZWQgYXMgc3BhbS4gTGVhdmUgdGhlIGZpZWxk IGJlbG93IGVtcHR5IGlmIHlvdSBkb25cJ3Qgd2FudCB0byB1c2UgdGhpcyBmZWF0dXJlLicu bi4NCgkJCQknCQkJPC9wPicubi4NCgkJCQknCQkJPHA+Jy5uLg0KCQkJCScJCQkJPGxhYmVs Picubi4NCgkJCQknCQkJCQlOYW1lIG9mIHRoZSBmaWVsZCAoaWYgZW1wdHkgbm90IHVzZWQp Oicubi4NCgkJCQknCQkJCQk8aW5wdXQgY2xhc3M9ImVkaXQiIHR5cGU9InRleHQiIG5hbWU9 ImZpZWxkIiBzaXplPSI4MCIgdmFsdWU9IicuJGZpZWxkLiciIC8+Jy5uLg0KCQkJCScJCQkJ PC9sYWJlbD4nLm4uDQoJCQkJJwkJCTwvcD4nLm4uDQoJCQkJJwkJPC9kaXY+Jy5uLg0KCQkJ CScJCTxwIHRpdGxlPSJDbGljayB0byBleHBhbmQiIGNsYXNzPSJyYWhfY29tbWVudF9zcGFt X2hlYWRpbmciPicubi4NCgkJCQknCQkJKyA8c3Bhbj5ETlMgdmFsaWRhdGlvbjwvc3Bhbj4n Lm4uDQoJCQkJJwkJPC9wPicubi4NCgkJCQknCQk8ZGl2IGNsYXNzPSJyYWhfY29tbWVudF9z cGFtX21vcmUiPicubi4NCgkJCQknCQkJPHA+Jy5uLg0KCQkJCScJCQkJQ2hlY2tzIHRoZSBl bWFpbCBhZGRyZXNzXCcgPGFiYnIgdGl0bGU9IkRvbWFpbiBOYW1lIFN5c3RlbSI+RE5TPC9h YmJyPiByZWNvcmRzLicubi4NCgkJCQknCQkJCUlmIHRoZSBlbWFpbFwncyBkb21haW4gaXMg Zm91bmQgdG8gYmUgbm9uLWV4aXN0ZW50LCB0aGUgY29tbWVudCB3aWxsIGJlIHRyZWF0ZWQg YXMgYSBzcGFtLicubi4NCgkJCQknCQkJCVRoZSBmZWF0dXJlIHJlcXVpcmVzIDxhIGhyZWY9 Imh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9mdW5jdGlvbi5jaGVja2Ruc3JyLnBocCI+Y2hl Y2tkbnNycigpPC9hPiAnLm4uDQoJCQkJJwkJCQlhbmQgc2VydmVyIG11c3QgYmUgYWxsb3dl ZCB0byBtYWtlIG91dGdvaW5nIGNvbm5lY3Rpb25zLicubi4NCgkJCQknCQkJPC9wPicubi4N CgkJCQknCQkJPHA+Jy5uLg0KCQkJCScJCQkJPGxhYmVsPicubi4NCgkJCQknCQkJCQlVc2Ug RE5TIHZhbGlkYXRpb24/PGJyIC8+Jy5uLg0KCQkJCScJCQkJCTxzZWxlY3QgaWQ9ImVtYWls ZG5zIiBuYW1lPSJlbWFpbGRucyI+Jy5uLg0KCQkJCScJCQkJCQk8b3B0aW9uIHZhbHVlPSJu byInLigoJGVtYWlsZG5zID09ICdubycpID8gJyBzZWxlY3RlZD0ic2VsZWN0ZWQiJyA6ICcn KS4nPk5vPC9vcHRpb24+Jy5uLg0KCQkJCScJCQkJCQk8b3B0aW9uIHZhbHVlPSJ5ZXMiJy4o KCRlbWFpbGRucyA9PSAneWVzJykgPyAnIHNlbGVjdGVkPSJzZWxlY3RlZCInIDogJycpLic+ WWVzPC9vcHRpb24+Jy5uLg0KCQkJCScJCQkJCTwvc2VsZWN0Picubi4NCgkJCQknCQkJCTwv bGFiZWw+Jy5uLg0KCQkJCScJCQk8L3A+Jy5uLg0KCQkJCScJCTwvZGl2Picubi4NCgkJCQkn CQk8cD48aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iU2F2ZSBzZXR0aW5ncyIgY2xhc3M9 InB1Ymxpc2giIC8+PC9wPicubi4NCgkJCQknCQk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1l PSJldmVudCIgdmFsdWU9IicuJGV2ZW50LiciIC8+Jy5uLg0KCQkJCScJCTxpbnB1dCB0eXBl PSJoaWRkZW4iIG5hbWU9InN0ZXAiIHZhbHVlPSJyYWhfY29tbWVudF9zcGFtX3NhdmUiIC8+ Jy5uLg0KCQkJCScJPC9mb3JtPicubjsNCgl9DQoNCi8qKg0KCUluc3RhbGxhdGlvbiBzY3Jp cHQNCiovDQoNCglmdW5jdGlvbiByYWhfY29tbWVudF9zcGFtX2luc3RhbGwoKSB7DQoJCXNh ZmVfcXVlcnkoDQoJCQkiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgIi5zYWZlX3BmeCgn cmFoX2NvbW1lbnRfc3BhbScpLiIgKA0KCQkJCWBuYW1lYCBWQVJDSEFSKDI1NSkgTk9UIE5V TEwgLA0KCQkJCWB2YWx1ZWAgTE9OR1RFWFQgTk9UIE5VTEwsDQoJCQlQUklNQVJZIEtFWShg bmFtZWApKSINCgkJKTsNCgkJDQoJCWZvcmVhY2gocmFoX2NvbW1lbnRfc3BhbV92YXJzKCkg YXMgJGtleSA9PiAkdmFsKSB7DQoJCQlpZigNCgkJCQlzYWZlX2NvdW50KA0KCQkJCQkncmFo X2NvbW1lbnRfc3BhbScsDQoJCQkJCSJuYW1lPSciLmRvU2xhc2goJGtleSkuIiciDQoJCQkJ KSA9PSAwDQoJCQkpIA0KCQkJCXNhZmVfaW5zZXJ0KA0KCQkJCQkicmFoX2NvbW1lbnRfc3Bh bSIsDQoJCQkJCSJuYW1lPSciLmRvU2xhc2goJGtleSkuIicsdmFsdWU9JyIuZG9TbGFzaCgk dmFsKS4iJyINCgkJCQkpOw0KCQl9DQoJfQ0KDQovKioNCglEZWZhdWx0IHByZWZlcmVuY2Vz DQoqLw0KDQoJZnVuY3Rpb24gcmFoX2NvbW1lbnRfc3BhbV92YXJzKCkgew0KCQlyZXR1cm4g IA0KCQkJYXJyYXkoDQoJCQkJJ3NwYW13b3JkcycgPT4gJ1tVUkxdLCB2aWFncmEsIHBlbmlz JywNCgkJCQknbWV0aG9kJyA9PiAnYmxvY2snLA0KCQkJCSdtZXNzYWdlJyA9PiAnWW91ciBj b21tZW50IHdhcyBtYXJrZWQgYXMgc3BhbS4nLA0KCQkJCSdmaWVsZCcgPT4gJ3Bob25lJywN CgkJCQkndXJsY291bnQnID0+ICczJywNCgkJCQknbWF4c3BhbXdvcmRzJyA9PiAnMCcsDQoJ CQkJJ21heHdvcmRzJyA9PiAnMjAwJywNCgkJCQknbWlud29yZHMnID0+ICcxJywNCgkJCQkn bWF4Y2hhcnMnID0+ICcyMDAwJywNCgkJCQknbWluY2hhcnMnID0+ICcyJywNCgkJCQknY2hl Y2snID0+ICdtZXNzYWdlLHdlYixuYW1lJywNCgkJCQknY29tbWVudGxpbWl0JyA9PiAnMTAn LA0KCQkJCSdjb21tZW50aW4nID0+ICdhbGwnLA0KCQkJCSdjb21tZW50dXNlJyA9PiAneWVz JywNCgkJCQknY29tbWVudHRpbWUnID0+ICczMDAnLA0KCQkJCSdlbWFpbGRucycgPT4gJ25v JywNCgkJCQkndmVyc2lvbicgPT4gJzAuNCcNCgkJCSkNCgkJOw0KCX0NCg0KLyoqDQoJU2F2 ZXMgcHJlZmVyZW5jZXMNCiovDQoNCglmdW5jdGlvbiByYWhfY29tbWVudF9zcGFtX3NhdmUo KSB7DQoJCQ0KCQlmb3JlYWNoKHJhaF9jb21tZW50X3NwYW1fdmFycygpIGFzICRrZXkgPT4g JHZhbHVlKSB7DQoJCQkkdmFsID0gcHMoJGtleSk7DQoJCQlpZihpc19hcnJheSgkdmFsKSkN CgkJCQkkdmFsID0gaW1wbG9kZSgnLCcsJHZhbCk7DQoJCQkNCgkJCXNhZmVfdXBkYXRlKA0K CQkJCSdyYWhfY29tbWVudF9zcGFtJywNCgkJCQkidmFsdWU9JyIuZG9TbGFzaCgkdmFsKS4i JyIsDQoJCQkJIm5hbWU9JyIuZG9TbGFzaCgka2V5KS4iJyINCgkJCSk7DQoJCX0NCgkJDQoJ CXJhaF9jb21tZW50X3NwYW1fZWRpdCgnU3BhbSBwcmVmZXJlbmNlcyBzYXZlZC4nKTsNCgl9 DQoNCi8qKg0KCUZldGNoIHByZWZlcmVuY2VzIGludG8gYXJyYXkNCiovDQoNCglmdW5jdGlv biByYWhfY29tbWVudF9zcGFtX2ZldGNoKCRlc2NhcGU9MCkgew0KCQkkb3V0ID0gYXJyYXko KTsNCg0KCQkkcnMgPSANCgkJCXNhZmVfcm93cygNCgkJCQknKicsDQoJCQkJJ3JhaF9jb21t ZW50X3NwYW0nLA0KCQkJCScxPTEnDQoJCQkpDQoJCTsNCg0KCQlmb3JlYWNoKCRycyBhcyAk YSkgew0KCQkJaWYoJGVzY2FwZSA9PSAxKSANCgkJCQkkYVsndmFsdWUnXSA9IGh0bWxzcGVj aWFsY2hhcnMoJGFbJ3ZhbHVlJ10pOw0KCQkJJG91dFskYVsnbmFtZSddXSA9ICRhWyd2YWx1 ZSddOw0KCQl9DQoNCgkJcmV0dXJuICRvdXQ7DQoJfSI7czo0OiJ0eXBlIjtzOjE6IjEiO3M6 NToiZmxhZ3MiO3M6MToiMCI7czo1OiJvcmRlciI7czoxOiI1IjtzOjM6Im1kNSI7czozMjoi NDI5YWI1ZTk0NTQxNmYyOGVhZGRkMmVmNzIwMTFjNWEiO30=