# rvm_latin1_to_utf8-0.3 v0.3 # Alter pre-MySQL 4.1 tables to use UTF-8 charset # # License: GNU GPLv2 or later # # Ruud van Melick # http://vanmelick.com/ # ...................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ...................................................................... YTo5OntzOjc6InZlcnNpb24iO3M6MzoiMC4zIjtzOjY6ImF1dGhvciI7czoxNToiUnV1ZCB2 YW4gTWVsaWNrIjtzOjEwOiJhdXRob3JfdXJpIjtzOjIxOiJodHRwOi8vdmFubWVsaWNrLmNv bS8iO3M6MTE6ImRlc2NyaXB0aW9uIjtzOjQ3OiJBbHRlciBwcmUtTXlTUUwgNC4xIHRhYmxl cyB0byB1c2UgVVRGLTggY2hhcnNldCI7czo0OiJ0eXBlIjtpOjE7czo0OiJuYW1lIjtzOjIy OiJydm1fbGF0aW4xX3RvX3V0ZjgtMC4zIjtzOjQ6ImhlbHAiO3M6MjkwMjoiPGgxPmxhdGlu MSB0byB1dGY4PC9oMT4KCjxwPjxzdHJvbmc+PHNwYW4gY2xhc3M9ImNhcHMiPldBUk5JTkc8 L3NwYW4+OiBjYXJlZnVsbHkgcmVhZCB0aGlzIGRvY3VtZW50YXRpb24gYW5kIDxzcGFuIGNs YXNzPSJjYXBzIj5CQUNLVVA8L3NwYW4+IDxzcGFuIGNsYXNzPSJjYXBzIj5ZT1VSPC9zcGFu PiA8c3BhbiBjbGFzcz0iY2FwcyI+REFUQUJBU0U8L3NwYW4+IGJlZm9yZSBhY3RpdmF0aW5n L3VzaW5nIHRoaXMgcGx1Z2luLjwvc3Ryb25nPjwvcD4KCjxwPlRleHRwYXR0ZXJuIGFsd2F5 cyB1c2VzICYjODIxNjt1dGY4JiM4MjE3OyB0byBzdG9yZSBkYXRhIGluIHRoZSBkYXRhYmFz ZSwgYnV0IGRlcGVuZGluZyBvbiB3aGljaCBNeVNRTCB2ZXJzaW9uIHlvdSB1c2VkIHdoZW4g aW5zdGFsbGluZyBUZXh0cGF0dGVybiwgdGhlIGNoYXJhY3RlciBzZXQgb2YgdGhlIHRhYmxl cyBhbmQgY29sdW1ucyBkaWZmZXJzOjwvcD4KCjxvbD4KCTxsaT5NeVNRTCB2ZXJzaW9ucyBv bGRlciB0aGFuIDQuMTogdGhlIGNoYXJhY3RlciBzZXQgb2YgdGhlIHRhYmxlcyBjcmVhdGVk IGJ5IFRleHRwYXR0ZXJuIGlzIHR5cGljYWxseSAmIzgyMTY7bGF0aW4xJiM4MjE3Oy48L2xp PgoJPGxpPk15U1FMIHZlcnNpb25zIDQuMSBhbmQgaGlnaGVyOiB0aGUgdGFibGVzIGFyZSBz ZXQgdG8gdXNlIHRoZSAmIzgyMTY7dXRmOCYjODIxNzsgY2hhcmFjdGVyIHNldCwgd2hpY2gg bWF0Y2hlcyB0aGUgYWN0dWFsIGNoYXJhY3RlciBzZXQgb2YgdGhlIGRhdGEgc3RvcmVkIGlu IHRob3NlIHRhYmxlcy48L2xpPgo8L29sPgoKPHA+SGF2aW5nIHRoZSB0YWJsZXMvY29sdW1u cyB0aGVtc2VsdmVzIHVzZSB0aGUgc2FtZSBjaGFyYWN0ZXIgc2V0IGFzIHRoZSBkYXRhIHN0 b3JlZCBpbiB0aGVtIGhhcyBzb21lIGFkdmFudGFnZXMgd2hlbiBwZXJmb3JtaW5nIHNlYXJj aGVzIG9yIHNvcnRpbmcgaW4gVGV4dHBhdHRlcm4sIGVzcGVjaWFsbHkgaWYgeW91IHVzZSBj aGFyYWN0ZXJzIG91dHNpZGUgVVMtPHNwYW4gY2xhc3M9ImNhcHMiPkFTQ0lJPC9zcGFuPi48 L3A+Cgo8cD5JZiB5b3UgdXBncmFkZSB5b3VyIE15U1FMIHZlcnNpb24gZnJvbSBwcmUtNC4x IHRvIDQuMSBvciBoaWdoZXIsIHRoZSB0YWJsZS9jb2x1bW4gY2hhcmFjdGVyIHNldHMgYXJl IG5vdCBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byAmIzgyMTY7dXRmOCYjODIxNzssIHNv IHRoZXkgc3RheSAmIzgyMTY7bGF0aW4xJiM4MjE3OyB3aGlsZSB0aGUgZGF0YSBzdG9yZWQg aW4gdGhvc2UgdGFibGVzIGlzIHN0aWxsICYjODIxNjt1dGY4JiM4MjE3Oy48L3A+Cgo8cD5D aGFuZ2luZyB0aGlzIGlzIHRyaWNreSwgYmVjYXVzZSBpZiB5b3Ugc2ltcGx5IGNoYW5nZSB0 aGUgY2hhcmFjdGVyIHNldCwgTXlTUUwgYXNzdW1lcyB0aGF0IHRoZSBzdG9yZWQgZGF0YSBt dXN0IGFsc28gYmUgY29udmVydGVkIGZyb20gJiM4MjE2O2xhdGluMSYjODIxNzsgdG8gJiM4 MjE2O3V0ZjgmIzgyMTc7LCB3aGljaCBsZWFkcyB0byBnYXJiYWdlLCBiZWNhdXNlIHRoZSBk YXRhIGlzIGFscmVhZHkgJiM4MjE2O3V0ZjgmIzgyMTc7LjwvcD4KCjxwPlRoaXMgcGx1Z2lu IGF2b2lkcyB0aGUgdW53YW50ZWQgY2hhcmFjdGVyIHNldCBjb252ZXJzaW9uIG9mIHRoZSBz dG9yZWQgZGF0YSBieSB0YWtpbmcgdGhlIGZvbGxvd2luZyBzdGVwcyBmb3IgZWFjaCBUZXh0 cGF0dGVybiB0YWJsZTo8L3A+Cgo8b2w+Cgk8bGk+ZHJvcCBpbmRleGVzPC9saT4KCTxsaT5j b252ZXJ0IGFsbCBjb2x1bW5zIHRoYXQgY29udGFpbiB0ZXh0IHRvIHVzZSBhICYjODIxNjti aW5hcnkmIzgyMTc7IGNoYXJzZXQgKGluc3RlYWQgb2YgJiM4MjE2O2xhdGluMSYjODIxNzsp PC9saT4KCTxsaT5jb252ZXJ0IHRob3NlIGNvbHVtbnMgeWV0IGFnYWluLCB0aGlzIHRpbWUg dG8gJiM4MjE2O3V0ZjgmIzgyMTc7IGNoYXJzZXQgKGluc3RlYWQgb2YgJiM4MjE2O2JpbmFy eSYjODIxNzspPC9saT4KCTxsaT5hZGQgaW5kZXhlczwvbGk+Cgk8bGk+b3B0aW1pemUgdGFi bGU8L2xpPgo8L29sPgoKPHA+QWZ0ZXJ3YXJkcyBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gdXBk YXRlIHRoZSAmIzgyMTY7ZGJjaGFyc2V0JiM4MjE3OyBzZXR0aW5nIGluIHRoZSA8Y29kZT50 ZXh0cGF0dGVybi9jb25maWcucGhwPC9jb2RlPiBmaWxlIHRvICYjODIxNjt1dGY4JiM4MjE3 Oy4gU2hvdWxkIHRoaXMgZmFpbCBkdWUgdG8gbGFjayBvZiBwZXJtaXNzaW9ucywgeW91IHdp bGwgYmUgYXNrZWQgdG8gbWFrZSB0aGlzIGNoYW5nZSB5b3Vyc2VsZi4gRG8gbm90IHNraXAg dGhpcyBzdGVwLCBvdGhlcndpc2UgeW91IHdpbGwgZXhwZXJpZW5jZSBpcnJlcGFyYWJsZSBk YXRhIGNvcnJ1cHRpb24gc28gc2V2ZXJlIHRoYXQgeW91IHdpbGwgY3J5IGxpa2UgYSBiYWJ5 ICh5b3UgbWFkZSBiYWNrdXBzLCByaWdodD8pLCBtdWNoIHRvIHRoZSBhbXVzZW1lbnQgb2Yg b25sb29rZXJzLjwvcD4KCjxwPkhvdyB0byB1c2UgdGhpcyBwbHVnaW46PC9wPgoKPG9sPgoJ PGxpPjxzdHJvbmc+PHNwYW4gY2xhc3M9ImNhcHMiPk1BS0U8L3NwYW4+IDxzcGFuIGNsYXNz PSJjYXBzIj5CQUNLVVBTPC9zcGFuPiA8c3BhbiBjbGFzcz0iY2FwcyI+RklSU1Q8L3NwYW4+ ITwvc3Ryb25nPiAobm90IGp1c3QgdGhlIDxzcGFuIGNsYXNzPSJjYXBzIj5UWFA8L3NwYW4+ IHRhYmxlcywgYnV0IHRoZSBlbnRpcmUgZGF0YWJhc2UpPC9saT4KCTxsaT5NYWtlIHN1cmUg eW91IGhhdmUgTXlTUUwgdmVyc2lvbiA0LjEgb3IgaGlnaGVyIGluc3RhbGxlZC48L2xpPgoJ PGxpPkFjdGl2YXRlIHRoZSBwbHVnaW4uPC9saT4KCTxsaT48YSBocmVmPSI/ZXZlbnQ9cnZt X2xhdGluMV90b191dGY4Ij5DbGljayBoZXJlPC9hPiBhbmQgZm9sbG93IHRoZSBpbnN0cnVj dGlvbnMgb24gdGhlIHNjcmVlbi48L2xpPgo8L29sPiI7czo0OiJjb2RlIjtzOjYzMDM6Igpp ZiAodHhwaW50ZXJmYWNlID09ICdhZG1pbicgYW5kIGdwcygnZXZlbnQnKSA9PSAncnZtX2xh dGluMV90b191dGY4JykKewogIGFkZF9wcml2cygncnZtX2xhdGluMV90b191dGY4JywgJzEn KTsKICByZWdpc3Rlcl90YWIoJ2V4dGVuc2lvbnMnLCAncnZtX2xhdGluMV90b191dGY4Jywg J2xhdGluMV90b191dGY4Jyk7CiAgcmVnaXN0ZXJfY2FsbGJhY2soJ3J2bV9sYXRpbjFfdG9f dXRmOCcsICdydm1fbGF0aW4xX3RvX3V0ZjgnKTsKfQoKZnVuY3Rpb24gcnZtX2xhdGluMV90 b191dGY4KCkKewogIGdsb2JhbCAkdHhwY2ZnOwoKICAkZGVidWcgPSBGQUxTRTsKCiAgcmVx dWlyZV9wcml2cygncnZtX2xhdGluMV90b191dGY4Jyk7CgogIHBhZ2V0b3AoJycpOwoKICBl Y2hvICc8ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogNTBweCI+JzsKCiAgaWYgKHZlcnNpb25f Y29tcGFyZShteXNxbF9nZXRfc2VydmVyX2luZm8oKSwgJzQuMS4wJywgJzwnKSkKICB7CiAg ICBlY2hvIGdyYWYoJ1RoZSBydm1fbGF0aW4xX3RvX3V0ZjggcGx1Z2luIGhhcyBiZWVuIHJl bW92ZWQsIGJlY2F1c2UgeW91ciBNeVNRTCB2ZXJzaW9uIGlzIGxvd2VyIHRoYW4gNC4xLicp OwogICAgc2FmZV9kZWxldGUoJ3R4cF9wbHVnaW4nLCAibmFtZSA9ICdydm1fbGF0aW4xX3Rv X3V0ZjgnIik7CiAgICBydm1fbGF0aW4xX3RvX3V0ZjhfZW5kKCk7CiAgfQoKICAjIHN0YW5k YXJkIFRYUCB0YWJsZXMKICAkdHhwdGFibGVzID0gYXJyYXkoCiAgICAndGV4dHBhdHRlcm4n LAogICAgJ3R4cF9jYXRlZ29yeScsCiAgICAndHhwX2NzcycsCiAgICAndHhwX2Rpc2N1c3Mn LAogICAgJ3R4cF9kaXNjdXNzX2lwYmFuJywKICAgICd0eHBfZGlzY3Vzc19ub25jZScsCiAg ICAndHhwX2ZpbGUnLAogICAgJ3R4cF9mb3JtJywKICAgICd0eHBfaW1hZ2UnLAogICAgJ3R4 cF9sYW5nJywKICAgICd0eHBfbGluaycsCiAgICAndHhwX2xvZycsCiAgICAndHhwX3BhZ2Un LAogICAgJ3R4cF9wbHVnaW4nLAogICAgJ3R4cF9wcmVmcycsCiAgICAndHhwX3ByaXYnLAog ICAgJ3R4cF9zZWN0aW9uJywKICAgICd0eHBfdXNlcnMnCiAgKTsKCiAgIyBmaW5kIHRhYmxl cyB0aGF0IG1hdGNoIHRoZSBUWFAgdGFibGUgcHJlZml4LCBtYXJrIHN0YW5kYXJkIGFuZCBz ZWxlY3RlZCBvbmVzLgogICRteXRhYmxlcyA9IHBzKCdteXRhYmxlcycsIGFycmF5KCkpID8g cHMoJ215dGFibGVzJykgOiBhcnJheSgpOwogICR1bmtub3duICA9IEZBTFNFOwoKICBpZiAo JHJzID0gc2FmZV9xdWVyeSgiU0hPVyBUQUJMRVMgTElLRSAnIi5hZGRjc2xhc2hlcyhkb1Ns YXNoKFBGWCksICclXycpLiIlJyIpKQogIHsKICAgIHdoaWxlICgkcm93ID0gbXlzcWxfZmV0 Y2hfcm93KCRycykpCiAgICB7CiAgICAgICR0YWJsZSA9IHN1YnN0cigkcm93WzBdLCBzdHJs ZW4oUEZYKSk7CgogICAgICBpZiAoaW5fYXJyYXkoJHRhYmxlLCAkdHhwdGFibGVzKSBvciBp bl9hcnJheSgkdGFibGUsICRteXRhYmxlcykpCiAgICAgIHsKICAgICAgICAkdGFibGVzW10g PSAkdGFibGU7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgJHVua25vd24g PSBUUlVFOwogICAgICB9CgogICAgICAkaW5wdXRzW10gPQogICAgICAgICc8bGFiZWw+Jy4K ICAgICAgICAgICc8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9Im15dGFibGVzW10iIHZh bHVlPSInLmh0bWxzcGVjaWFsY2hhcnMoJHRhYmxlKS4nIiAnLgogICAgICAgICAgICAoaW5f YXJyYXkoJHRhYmxlLCAkdHhwdGFibGVzKSA/ICdkaXNhYmxlZD0iZGlzYWJsZWQiIGNoZWNr ZWQ9ImNoZWNrZWQiJyA6ICcnKS4nIC8+Jy4KICAgICAgICAgIGh0bWxzcGVjaWFsY2hhcnMo UEZYLiR0YWJsZSkuCiAgICAgICAgJzwvbGFiZWw+JzsKICAgIH0KICB9CiAgZWxzZQogIHsK ICAgIGVjaG8gZ3JhZignSG1tbS4uLiBzdHJhbmdlLCBJIGNhbm5vdCBmaW5kIGFueSB0YWJs ZXMgdGhhdCBtYXRjaCB5b3VyIFRYUCB0YWJsZSBwcmVmaXgnKTsKICB9CgogICMgYXNrIHVz ZXIgd2hhdCB0byBkbyB3aXRoIHRhYmxlcyB3ZSdyZSBub3Qgc3VyZSBhYm91dC4KICBpZiAo JHVua25vd24gYW5kICFwcygnY29udGludWUnKSkKICB7CiAgICBlY2hvCiAgICAgIGdyYWYo J0JlbG93LCBhIGxpc3Qgb2YgdGFibGVzIGlzIHNob3duIHRoYXQgbWF5IGJlIHBhcnQgb2Yg eW91ciBUZXh0cGF0dGVybiBpbnN0YWxsLicpLgogICAgICBncmFmKCdTb21lIG9mIHRoZXNl IHRhYmxlcyBtYXkgaGF2ZSBiZWVuIGNyZWF0ZWQgYnkgcGx1Z2lucyB5b3UgaGF2ZSBpbnN0 YWxsZWQuPGJyIC8+CiAgICAgICAgSW4gdGhhdCBjYXNlLCBjaGVjayB0aGUgdGFibGVzIHRo YXQgdGhlc2UgcGx1Z2lucyBoYXZlIGFkZGVkLjxiciAvPgogICAgICAgIEJlIGNhcmVmdWwg bm90IHRvIGNoZWNrIHRhYmxlcyB0aGF0IGFyZSBub3QgcmVsYXRlZCB0byB0aGlzIFRleHRw YXR0ZXJuIGluc3RhbGwhJykuCiAgICAgIGdyYWYoJ1RoZSBzdGFuZGFyZCBUZXh0cGF0dGVy biB0YWJsZXMgYXJlIGFscmVhZHkgY2hlY2tlZC4nKS4KICAgICAgZm9ybSgKICAgICAgICBq b2luKCc8YnIgLz4nLCAkaW5wdXRzKS4KICAgICAgICBncmFmKAogICAgICAgICAgZUlucHV0 KCdydm1fbGF0aW4xX3RvX3V0ZjgnKS4nPGJyIC8+Jy4KICAgICAgICAgIGZJbnB1dCgnc3Vi bWl0JywgJ2NvbnRpbnVlJywgJ0NvbnRpbnVlJywgJ3B1Ymxpc2gnKQogICAgICAgICkKICAg ICAgKTsKCiAgICBydm1fbGF0aW4xX3RvX3V0ZjhfZW5kKCk7CiAgfQoKICBlY2hvIGdyYWYo J1VwZGF0aW5nIFRleHRwYXR0ZXJuIHRhYmxlcy4uLicpOwoKICAjIGxvb3AgdGhyb3VnaCB0 YWJsZXMKICBmb3JlYWNoICgkdGFibGVzIGFzICR0YWJsZSkKICB7CiAgICAkaW5kZXhlcyA9 IGFycmF5KCk7CiAgICAkZHJvcCAgICA9IGFycmF5KCk7CiAgICAkY3JlYXRlICA9IGFycmF5 KCk7CiAgICAkYmluICAgICA9IGFycmF5KCk7CiAgICAkdXRmOCAgICA9IGFycmF5KCk7CiAg ICAkY29scyAgICA9IGFycmF5KCk7CgogICAgIyBwcmVwYXJlIGFsdGVyIHN0YXRlbWVudHMg Zm9yIGNvbHVtbnMKICAgICRjb2x1bW5zID0gZ2V0Um93cygnU0hPVyBDT0xVTU5TIEZST00g Jy5zYWZlX3BmeCgkdGFibGUpKTsKCiAgICBpZiAoJGNvbHVtbnMpIGZvcmVhY2ggKCRjb2x1 bW5zIGFzICRjb2x1bW4pCiAgICB7CiAgICAgIGV4dHJhY3QoJGNvbHVtbik7CgogICAgICBp ZiAocHJlZ19tYXRjaCgnL14oY2hhcnx2YXJjaGFyfHRpbnl0ZXh0fHRleHR8bWVkaXVtdGV4 dHxsb25ndGV4dHxlbnVtfHNldClcYi8nLCAkVHlwZSkpCiAgICAgIHsKICAgICAgICAkTnVs bCA9ICgkTnVsbCA9PSAnWUVTJyA/ICcgTlVMTCcgOiAnIE5PVCBOVUxMJyk7CgogICAgICAg ICRiZWdpbiA9ICdNT0RJRlkgYCcuZG9TbGFzaCgkRmllbGQpLidgICcuJFR5cGUuJyBDSEFS QUNURVIgU0VUICc7CiAgICAgICAgJGVuZCAgID0gJE51bGwuIiBERUZBVUxUICciLmRvU2xh c2goJERlZmF1bHQpLiInIjsKCiAgICAgICAgJGJpbltdICA9ICRiZWdpbi4nYmluYXJ5Jy4k ZW5kOwogICAgICAgICR1dGY4W10gPSAkYmVnaW4uJ3V0ZjggQ09MTEFURSB1dGY4X2dlbmVy YWxfY2knLiRlbmQ7CiAgICAgICAgJGNvbHNbXSA9ICRGaWVsZDsKICAgICAgfQogICAgfQoK ICAgICMgYW5hbHlzZSBpbmRleCBzdHJ1Y3R1cmVzCiAgICAkcm93cyA9IGdldFJvd3MoJ1NI T1cgSU5ERVggRlJPTSAnLnNhZmVfcGZ4KCR0YWJsZSkpOwoKICAgIGlmICgkcm93cykgZm9y ZWFjaCAoJHJvd3MgYXMgJHJvdykKICAgIHsKICAgICAgZXh0cmFjdCgkcm93KTsKCiAgICAg IGlmICgkS2V5X25hbWUgPT0gJ1BSSU1BUlknIG9yICFpbl9hcnJheSgkQ29sdW1uX25hbWUs ICRjb2xzKSkKICAgICAgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CgogICAgICAkS2V5 X25hbWUgPSAnYCcuJEtleV9uYW1lLidgJzsKCiAgICAgICRpbmRleGVzWyRLZXlfbmFtZV1b J3VuaXF1ZSddID0gKCROb25fdW5pcXVlID8gJycgOiAnIFVOSVFVRScpOwogICAgICAkaW5k ZXhlc1skS2V5X25hbWVdWydmdWxsdGV4dCddID0gKCRJbmRleF90eXBlID09ICdGVUxMVEVY VCcgPyAnIEZVTExURVhUJyA6ICcnKTsKICAgICAgJGluZGV4ZXNbJEtleV9uYW1lXVsnY29s dW1ucyddWyRTZXFfaW5faW5kZXhdID0gJ2AnLiRDb2x1bW5fbmFtZS4nYCcuKCRTdWJfcGFy dCA/ICcgKCcuJFN1Yl9wYXJ0LicpJyA6ICcnKTsKICAgIH0KCiAgICAjIHByZXBhcmUgaW5k ZXggZHJvcC9jcmVhdGUgc3RhdGVtZW50cwogICAgZm9yZWFjaCAoJGluZGV4ZXMgYXMgJGlu ZGV4ID0+ICRzdHJ1Y3R1cmUpCiAgICB7CiAgICAgIGV4dHJhY3QoJHN0cnVjdHVyZSk7Cgog ICAgICAkZHJvcFtdICAgPSAnRFJPUCBJTkRFWCAnLiRpbmRleDsKICAgICAgJGNyZWF0ZVtd ID0gJ0FERCcuJHVuaXF1ZS4kZnVsbHRleHQuJyBJTkRFWCAnLiRpbmRleC4nICgnLmpvaW4o JywgJywgJGNvbHVtbnMpLicpJzsKICAgIH0KCiAgICAkc3VjY2VzcyA9IFRSVUU7CgogICAg IyBhbHRlciB0aGUgdGFibGUgKyBpbmRleGVzCiAgICBpZiAoJGRyb3ApCiAgICB7CiAgICAg ICRzdWNjZXNzICo9IHNhZmVfYWx0ZXIoJHRhYmxlLCBqb2luKCcsICcsICRkcm9wKSwgJGRl YnVnKTsKICAgIH0KCiAgICBpZiAoJGJpbiBhbmQgJHN1Y2Nlc3MpCiAgICB7CiAgICAgICRz dWNjZXNzICo9IHNhZmVfYWx0ZXIoJHRhYmxlLCBqb2luKCcsICcsICRiaW4pLCAkZGVidWcp OwoKICAgICAgaWYgKCRzdWNjZXNzKQogICAgICB7CiAgICAgICAgJHN1Y2Nlc3MgKj0gc2Fm ZV9hbHRlcigkdGFibGUsIGpvaW4oJywgJywgJHV0ZjgpLicsIERFRkFVTFQgQ0hBUkFDVEVS IFNFVCB1dGY4IENPTExBVEUgdXRmOF9nZW5lcmFsX2NpJywgJGRlYnVnKTsKICAgICAgfQog ICAgfQoKICAgIGlmICgkY3JlYXRlIGFuZCAkc3VjY2VzcykKICAgIHsKICAgICAgJHN1Y2Nl c3MgKj0gc2FmZV9hbHRlcigkdGFibGUsIGpvaW4oJywgJywgJGNyZWF0ZSksICRkZWJ1Zyk7 CiAgICB9CiAgfQoKICAjIHdoaWxlIHdlJ3JlIGhlcmUsIG1pZ2h0IGFzIHdlbGwgb3B0aW1p emUgdGhlIHRhYmxlcwogIHNhZmVfcXVlcnkoIk9QVElNSVpFIFRBQkxFICIuam9pbignLCAn LCBhcnJheV9tYXAoJ3NhZmVfcGZ4JywgJHRhYmxlcykpLCAkZGVidWcpOwoKICBpZiAoJHN1 Y2Nlc3MpCiAgewogICAgZWNobyBncmFmKCdTdWNjZXNmdWxseSBjb21wbGV0ZWQuJyk7Cgog ICAgJGZpbGUgICA9IHR4cGF0aC4nL2NvbmZpZy5waHAnOwogICAgJGNvbmZpZyA9IGZpbGVf Z2V0X2NvbnRlbnRzKCRmaWxlKTsKICAgICRjb25maWcgPSBzdHJfcmVwbGFjZSgnPz4nLCBu LicjIHJ2bV9sYXRpbjFfdG9fdXRmOCBwbHVnaW4gYWRkZWQgdGhlIGZvbGxvd2luZyBsaW5l IHRvIGVuc3VyZSBhIGNvcnJlY3QgZGJjaGFyc2V0Jy5uLickdHhwY2ZnW1wnZGJjaGFyc2V0 XCddID0gXCd1dGY4XCcnLm4uJz8+JywgJGNvbmZpZyk7CgogICAgaWYgKCR0eHBjZmdbJ2Ri Y2hhcnNldCddID09ICd1dGY4JwogICAgICBvciBpc193cml0YWJsZSgkZmlsZSkKICAgICAg YW5kICRoYW5kbGUgPSBmb3BlbigkZmlsZSwgJ3cnKQogICAgICBhbmQgZndyaXRlKCRoYW5k bGUsICRjb25maWcpICE9PSBGQUxTRQogICAgICBhbmQgZmNsb3NlKCRoYW5kbGUpKQogICAg ewogICAgICBlY2hvIGdyYWYoJ1RoZSBydm1fbGF0aW4xX3RvX3V0ZjggcGx1Z2luIGhhcyBi ZWVuIGF1dG9tYXRpY2FsbHkgZGUtaW5zdGFsbGVkLicpOwogICAgICBzYWZlX2RlbGV0ZSgn dHhwX3BsdWdpbicsICJuYW1lID0gJ3J2bV9sYXRpbjFfdG9fdXRmOCciKTsKICAgIH0KICAg IGVsc2UKICAgIHsKICAgICAgZWNobyBncmFmKCc8Yj5XQVJOSU5HOiB0ZXh0cGF0dGVybi9j b25maWcucGhwIGNvdWxkIG5vdCBiZSB1cGRhdGVkIGF1dG9tYXRpY2FsbHkuIFBsZWFzZSB1 cGRhdGUgeW91ciB0ZXh0cGF0dGVybi9jb25maWcucGhwIGZpbGUgdG8gY29udGFpbiA8Y29k ZT4kdHhwY2ZnW1wnZGJjaGFyc2V0XCddID0gXCd1dGY4XCc7PC9jb2RlPjwvYj4gYW5kIGRl aW5zdGFsbCB0aGUgcnZtX2xhdGluMV90b191dGY4IHBsdWdpbiBtYW51YWxseScpOwogICAg fQogIH0KICBlbHNlCiAgewogICAgZWNobyBncmFmKCdEdWUgdG8gb25lIG9yIG1vcmUgZXJy b3JzIHRoZSB0YWJsZXMgY291bGQgbm90IGJlIHVwZGF0ZWQgY29ycmVjdGx5LiBZb3UgbWF5 IGhhdmUgdG8gcmVzdG9yZSBhIGJhY2t1cC4nKTsKICB9CgogIHJ2bV9sYXRpbjFfdG9fdXRm OF9lbmQoKTsKfQoKZnVuY3Rpb24gcnZtX2xhdGluMV90b191dGY4X2VuZCgpCnsKICBlY2hv ICc8L2Rpdj4nOwogIGVuZF9wYWdlKCk7CiAgZXhpdCgpOwp9CiI7czozOiJtZDUiO3M6MzI6 ImQyYWEwYmY5MjE5NGU4YmZjNjUxMWY4YTk2ZTY3NTJiIjt9