<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE module [
  <!ELEMENT module (name,version,description*,requires*,file+)>
  <!ELEMENT name (#PCDATA)>
  <!ELEMENT version (#PCDATA)>
  <!ELEMENT description (#PCDATA)>
  <!ELEMENT requires (requiredname,requiredversion)>
  <!ELEMENT requiredname (#PCDATA)>
  <!ELEMENT requiredversion (#PCDATA)>
  <!ELEMENT file (filename,isdir,data)>
  <!ELEMENT filename (#PCDATA)>
  <!ELEMENT isdir (#PCDATA)>
  <!ELEMENT data (#PCDATA)>
]>
<module>
  <name>ThemeManager</name>
  <version>1.0.2</version>
  <description></description>
  <file>
    <filename>index.html</filename>
    <isdir>0</isdir>
    <data><![CDATA[]]></data>
  </file>
  <file>
    <filename>lang/</filename>
    <isdir>1</isdir>
  </file>
  <file>
    <filename>lang/en_US.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHAKJGxhbmdbJ2FjdGl2ZSddID0gJ0FjdGl2ZSc7CiRsYW5nWydkZWZhdWx0J10gPSAnRGVmYXVsdCc7CiRsYW5nWydwcm9tcHRfdGhlbWVuYW1lJ10gPSAnVGhlbWUgTmFtZTonOwokbGFuZ1snZXJyb3Jfbm9maWxlc3VwbG9hZGVkJ10gPSAnTm8gZmlsZXMgd2VyZSB1cGxvYWRlZC4gTWFrZSBzdXJlIHlvdXIgZm9ybSB0YWdcJ3MgZW5jdHlwZSB3YXMgc2V0IHRvIG11bHRpcGFydC9mb3JtLWRhdGEgYW5kIHRoYXQgdGhlIHJpZ2h0IGZpZWxkIGlzIGJlaW5nIGNoZWNrZWQgZm9yIHRoZSB1cGxvYWRlZCBmaWxlLic7CiRsYW5nWydlcnJvcl90ZW1wbGF0ZWV4aXN0cyddID0gJ0EgdGVtcGxhdGUgd2l0aCB0aGUgbmFtZSAiJXMiIGFscmVhZHkgZXhpc3RzJzsKJGxhbmdbJ2Vycm9yX3N0eWxlc2hlZXRleGlzdHMnXSA9ICdBIHN0eWxlc2hlZXQgd2l0aCB0aGUgbmFtZSAiJXMiIGFscmVhZHkgZXhpc3RzJzsKJGxhbmdbJ2Vycm9yX25vc3R5bGVzaGVldHMnXSA9ICdObyBzdHlsZXNoZWV0cyB3ZXJlIGRldGVjdGVkIGluIHRoaXMgdGhlbWUnOwokbGFuZ1snZXJyb3JfY291bGRub3RjcmVhdGV0ZW1wbGF0ZSddID0gJ0NvdWxkIG5vdCBjcmVhdGUgdGhlIHRlbXBsYXRlIGRlZmluaXRpb24nOwokbGFuZ1snZXJyb3JfY291bGRub3Rhc3NvY2NzcyddID0gJ1Byb2JsZW0gYXNzb2NpYXRpbmcgc3R5bGVzaGVldHMgd2l0aCB0aGUgdGVtcGxhdGUnOwokbGFuZ1snaW1wb3J0J10gPSAnSW1wb3J0JzsKJGxhbmdbJ3VwbG9hZCddID0gJ1VwbG9hZCBUaGVtZSc7CiRsYW5nWydpZCddID0gJ0lkJzsKJGxhbmdbJ25hbWUnXSA9ICdOYW1lJzsKJGxhbmdbJ2FjdGl2ZSddID0gJ0FjdGl2ZSc7CiRsYW5nWydkZWZhdWx0J10gPSAnRGVmYXVsdCc7CiRsYW5nWydleHBvcnQnXSA9ICdFeHBvcnQnOwokbGFuZ1snc3VibWl0J10gPSAnU3VibWl0JzsKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ1RoZW1lIG1hbmFnZXInOwokbGFuZ1sncG9zdGluc3RhbGwnXSA9ICdCZSBzdXJlIHRvIHNldCAiTWFuYWdlIFRoZW1lcyIgcGVybWlzc2lvbnMgdG8gdXNlIHRoaXMgbW9kdWxlISc7CiRsYW5nWydwb3N0dW5pbnN0YWxsJ10gPSAnIkN1cnNlcyEgRm9pbGVkIEFnYWluISInOwokbGFuZ1sndW5pbnN0YWxsZWQnXSA9ICdNb2R1bGUgVW5pbnN0YWxsZWQuJzsKJGxhbmdbJ2luc3RhbGxlZCddID0gJ01vZHVsZSB2ZXJzaW9uICVzIGluc3RhbGxlZC4nOwokbGFuZ1sncHJlZnN1cGRhdGVkJ10gPSAnTW9kdWxlIHByZWZlcmVuY2VzIHVwZGF0ZWQuJzsKJGxhbmdbJ2FjY2Vzc2RlbmllZCddID0gJ0FjY2VzcyBEZW5pZWQuIFBsZWFzZSBjaGVjayB5b3VyIHBlcm1pc3Npb25zLic7CiRsYW5nWydlcnJvciddID0gJ0Vycm9yISc7CiRsYW5nWyd1cGdyYWRlZCddID0gJ01vZHVsZSB1cGdyYWRlZCB0byB2ZXJzaW9uICVzLic7CiRsYW5nWydtb2RkZXNjcmlwdGlvbiddID0gJ0EgbW9kdWxlIHRvIGFsbG93IGltcG9ydGluZyBhbmQgZXhwb3J0aW5nIG9mIGNvbnRlbnQgdGhlbWVzICh0ZW1wbGF0ZXMgYW5kIHN0eWxlc2hlZXRzKSc7CiRsYW5nWydjaGFuZ2Vsb2cnXSA9ICc8dWw+CjxsaT5WZXJzaW9uIDEuMC4yLiBEZWNlbWJlciwgMjAwNSAtIE5vdyBoYW5kbGVscyBpbmNsdWRlZCBpbWFnZXMgYW5kIGphdmFzY3JpcHQgaW4gYm90aCB0aGUgc3R5bGVzaGVldHMgYW5kIHRoZSB0ZW1wbGF0ZXMuICBXaGVuIHJlc3RvcmluZyBmaWxlcyBhcmUgcmVzdG9yZWQgdG8gYSBkaXJlY3RvcnkgY3JlYXRlZCB1bmRlciB1cGxvYWRzL3RoZW1lbmFtZS48L2xpPgo8bGk+VmVyc2lvbiAxLjAuMS4gRGVjZW1iZXIsIDIwMDUgLSBGaXhlZCBkZXBlbmRlbmNpZXMsIGhlbHAsIGFuZCBnZW5lcmFsIGNsZWFudXAuPC9saT4KPGxpPlZlcnNpb24gMS4wLjAuIDMxIE5vdmVtYmVyLCAyMDA1IC0gSW5pdGlhbCBSZWxlYXNlLjwvbGk+CjwvdWw+JzsKJGxhbmdbJ2hlbHAnXSA9ICc8aDM+V2hhdCBEb2VzIFRoaXMgRG8/PC9oMz4KPHA+VGhpcyBtb2R1bGUgYWxsb3dzIHlvdSB0byBpbXBvcnQgYW5kIGV4cG9ydCB0ZW1wbGF0ZXMgYW5kIHRoZWlyIGF0dGFjaGVkIHN0eWxlc2hlZXRzIGFzICJ0aGVtZXMiLiAgVGhpcyBhbGxvd3MgeW91IHRvIHNoYXJlIHlvdXIgbG9vayBhbmQgZmVlbCB3aXRoIG90aGVyIGNtcyB1c2Vycy48L3AKPGgzPkhvdyBEbyBJIFVzZSBJdDwvaDM+CjxwPlRoaXMgbW9kdWxlIGhhcyBubyBmcm9udCBlbmQgaW50ZXJmYWNlLCBvbmx5IGFuIGFkbWluIGludGVyZmFjZS4gIEl0IGFsbG93cyB5b3UgdG8gc2VsZWN0IGFuIGV4aXN0aW5nIChhY3RpdmUpIHRlbXBsYXRlLCBhbmQgY2xpY2sgIkV4cG9ydCIuICBBbiBYTUwgZmlsZSBjb250YWluaW5nIHRoZSB0ZW1wbGF0ZSBhbmQgaXRzIGF0dGFjaGVkIHN0eWxlc2hlZXRzIHdpbGwgYmUgY3JlYXRlZCBhbmQgc2VudCB5b3UgeW91IHZpYSBkb3dubG9hZC48L3A+CjxwPkFzIHdlbGwsIHRoZSBvcHBvc2l0ZSBmdW5jdGlvbmFsaXR5IGV4aXN0cywgeW91IG1heSB1cGxvYWQgYSB0aGVtZSBmaWxlICh4bWwgZm9ybWF0KSBhbmQgaGF2ZSB0aGUgZW5jbG9zZWQgdGVtcGxhdGVzIGFuZCBzdHlsZXNoZWV0cyBhdXRvbWF0aWNhbGx5IGltcG9ydGVkIGludG8geW91ciBjbXNtcyBpbnN0YWxsYXRpb24uPC9wPgo8aDM+U3VwcG9ydDwvaDM+CjxwPlRoaXMgbW9kdWxlIGRvZXMgbm90IGluY2x1ZGUgY29tbWVyY2lhbCBzdXBwb3J0LiBIb3dldmVyLCB0aGVyZSBhcmUgYSBudW1iZXIgb2YgcmVzb3VyY2VzIGF2YWlsYWJsZSB0byBoZWxwIHlvdSB3aXRoIGl0OjwvcD4KPHVsPgo8bGk+Rm9yIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIG1vZHVsZSwgRkFRcywgb3IgdG8gZmlsZSBhIEJ1ZyBSZXBvcnQgb3IgYnV5IGNvbW1lcmNpYWwgc3VwcG9ydCwgcGxlYXNlIHZpc2l0IHRoZSBtb2R1bGUgaG9tZXBhZ2UgYXQgPGEgaHJlZj0iaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZyI+ZGV2LmNtc21hZGVzaW1wbGUub3JnPC9hPi48L2xpPgo8bGk+QWRkaXRpb25hbCBkaXNjdXNzaW9uIG9mIHRoaXMgbW9kdWxlIG1heSBhbHNvIGJlIGZvdW5kIGluIHRoZSA8YSBocmVmPSJodHRwOi8vZm9ydW0uY21zbWFkZXNpbXBsZS5vcmciPkNNUyBNYWRlIFNpbXBsZSBGb3J1bXM8L2E+LjwvbGk+CjxsaT5UaGUgYXV0aG9yLCBjYWxndXkxMDAwLCBjYW4gb2Z0ZW4gYmUgZm91bmQgaW4gdGhlIDxhIGhyZWY9ImlyYzovL2lyYy5mcmVlbm9kZS5uZXQvI2NtcyI+Q01TIElSQyBDaGFubmVsPC9hPi48L2xpPgo8bGk+TGFzdGx5LCB5b3UgbWF5IGhhdmUgc29tZSBzdWNjZXNzIGVtYWlsaW5nIHRoZSBhdXRob3IgZGlyZWN0bHkuPC9saT4gIAo8L3VsPgo8cD5BcyBwZXIgdGhlIEdQTCwgdGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBhcy1pcy4gUGxlYXNlIHJlYWQgdGhlIHRleHQKb2YgdGhlIGxpY2Vuc2UgZm9yIHRoZSBmdWxsIGRpc2NsYWltZXIuPC9wPgoKPGgzPkNvcHlyaWdodCBhbmQgTGljZW5zZTwvaDM+CjxwPkNvcHlyaWdodCAmY29weTsgMjAwNSwgUm9iZXJ0IENhbXBiZWxsIDxhIGhyZWY9Im1haWx0bzpjYWxndXkxMDAwQGhvdG1haWwuY29tIj4mbHQ7Y2FsZ3V5MTAwMEBob3RtYWlsLmNvbSZndDs8L2E+LiBBbGwgUmlnaHRzIEFyZSBSZXNlcnZlZC48L3A+CjxwPlRoaXMgbW9kdWxlIGhhcyBiZWVuIHJlbGVhc2VkIHVuZGVyIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwiPkdOVSBQdWJsaWMgTGljZW5zZTwvYT4uIFlvdSBtdXN0IGFncmVlIHRvIHRoaXMgbGljZW5zZSBiZWZvcmUgdXNpbmcgdGhlIG1vZHVsZS48L3A+Cic7Cj8+Cg==]]></data>
  </file>
  <file>
    <filename>templates/</filename>
    <isdir>1</isdir>
  </file>
  <file>
    <filename>templates/error.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[PGgzPnskdGl0bGVfZXJyb3J9PC9oMz4KPHA+eyRhZG1pbl9uYXZ9PC9wPgp7aWYgJG1lc3NhZ2UhPScnfTxwPnskbWVzc2FnZX08L3A+ey9pZn0=]]></data>
  </file>
  <file>
    <filename>templates/export.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[eyRzdGFydGZvcm19CntpZiAkaXRlbWNvdW50ID4gMH0KPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0icGFnZXRhYmxlIj4KCTx0aGVhZD4KCQk8dHI+CgkJCTx0aD57JGlkdGV4dH08L3RoPgoJCQk8dGg+eyRuYW1ldGV4dH08L3RoPgoJCQk8dGg+eyRhY3RpdmV0ZXh0fTwvdGg+CgkJCTx0aD57JGRlZmF1bHR0ZXh0fTwvdGg+CgkJCTx0aD57JGV4cG9ydHRleHR9PC90aD4KCQk8L3RyPgoJPC90aGVhZD4KCTx0Ym9keT4KCXtmb3JlYWNoIGZyb209JGl0ZW1zIGl0ZW09ZW50cnl9CgkJPHRyIGNsYXNzPSJ7JGVudHJ5LT5yb3djbGFzc30iPgoJCQk8dGQ+eyRlbnRyeS0+aWR9PC90ZD4KCQkJPHRkPnskZW50cnktPm5hbWV9PC90ZD4KCQkJPHRkPnskZW50cnktPmFjdGl2ZX08L3RkPgoJCQk8dGQ+eyRlbnRyeS0+ZGVmYXVsdH08L3RkPgoJCQk8dGQ+eyRlbnRyeS0+c2VsZWN0fTwvdGQ+CgkJPC90cj4KCXsvZm9yZWFjaH0KCTwvdGJvZHk+CjwvdGFibGU+CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF90aGVtZW5hbWV9PC9wPgogIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfdGhlbWVuYW1lfTwvcD4KPC9kaXY+CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij4mbmJzcDs8L3A+CiAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRoaWRkZW59eyRzdWJtaXR9eyRjYW5jZWx9PC9wPgo8L2Rpdj4Key9pZn0KeyRlbmRmb3JtfQo=]]></data>
  </file>
  <file>
    <filename>templates/import.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[eyRzdGFydGZvcm19CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9icm93c2V9PC9wPgogIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfYnJvd3NlfTwvcD4KPC9kaXY+CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij4mbmJzcDs8L3A+CiAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRoaWRkZW59eyRzdWJtaXR9eyRjYW5jZWx9PC9wPgo8L2Rpdj4KeyRlbmRmb3JtfQo=]]></data>
  </file>
  <file>
    <filename>ThemeManager.module.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IFRoZW1lTWFuYWdlciAtIGEgbW9kdWxlIGZvciBpbXBvcnRpbmcgYW5kIGV4cG9ydGluZyB0ZW1wbGF0ZQojICAgYW5kIHN0eWxlc2hlZXQgcGFja2FnZXMuCiMgVmVyc2lvbjogMS4wLjIsIENhbGd1eTEwMDAKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIENNUyAtIENNUyBNYWRlIFNpbXBsZSBpcyAoYykgMjAwNSBieSBUZWQgS3VscCAod2lzaHlAY21zbWFkZXNpbXBsZS5vcmcpCiMgVGhpcyBwcm9qZWN0J3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKZnVuY3Rpb24gZ2V0X3VybHMoJHN0cmluZywgJHN0cmljdD10cnVlKSB7CiAgJHR5cGVzID0gYXJyYXkoImhyZWYiLCAic3JjIiwgInVybCIpOwogIHdoaWxlKGxpc3QoLCR0eXBlKSA9IGVhY2goJHR5cGVzKSkgewogICAgJGlubmVyVCA9ICRzdHJpY3Q/J1thLXowLTk6Pz0mQC8uXy1dKz8nOicuKz8nOwogICAgcHJlZ19tYXRjaF9hbGwgKCJ8JHR5cGVcPShbXCInYF0pKCIuJGlubmVyVC4iKVxcMXxpIiwgJHN0cmluZywgJiRtYXRjaGVzKTsKICAgICRyZXRbJHR5cGVdID0gJG1hdGNoZXNbMl07CiAgfQogIAogIHJldHVybiAkcmV0Owp9OwoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KY2xhc3MgVGhlbWVNYW5hZ2VyIGV4dGVuZHMgQ01TTW9kdWxlCnsKICB2YXIgJGR0ZCA9ICcKPCFET0NUWVBFIHRoZW1lIFsKICA8IUVMRU1FTlQgdGhlbWUgKG5hbWUsdGVtcGxhdGUsc3R5bGVzaGVldCsscmVmZXJlbmNlKik+CiAgPCFFTEVNRU5UIG5hbWUgKCNQQ0RBVEEpPgogIDwhRUxFTUVOVCB0ZW1wbGF0ZSAodG5hbWUsdGVuY29kaW5nLHRkYXRhKT4KICA8IUVMRU1FTlQgdG5hbWUgKCNQQ0RBVEEpPgogIDwhRUxFTUVOVCB0ZW5jb2RpbmcgKCNQQ0RBVEEpPgogIDwhRUxFTUVOVCB0ZGF0YSAoI1BDREFUQSk+CiAgPCFFTEVNRU5UIHN0eWxlc2hlZXQgKGNzc25hbWUsY3NzbWVkaWF0eXBlLGNzc2VuY29kaW5nLGNzc2RhdGEpPgogIDwhRUxFTUVOVCBjc3NuYW1lICgjUENEQVRBKT4KICA8IUVMRU1FTlQgY3NzbWVkaWF0eXBlICgjUENEQVRBKT4KICA8IUVMRU1FTlQgY3NzZGF0YSAoI1BDREFUQSk+CiAgPCFFTEVNRU5UIHJlZmVyZW5jZSAocmVmbmFtZSxyZWZlbmNvZGVkLHJlZmxvY2F0aW9uLHJlZmRhdGEpPgogIDwhRUxFTUVOVCByZWZuYW1lICgjUENEQVRBKT4KICA8IUVMRU1FTlQgcmVmZW5jb2RlZCAoI1BDREFUQSk+CiAgPCFFTEVNRU5UIHJlZmxvY2F0aW9uICgjUENEQVRBKT4KICA8IUVMRU1FTlQgcmVmZGF0YSAoI1BDREFUQSk+Cl0+JzsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0TmFtZSgpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0TmFtZSgpCiAgewogICAgcmV0dXJuICdUaGVtZU1hbmFnZXInOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldEZyaWVuZGx5TmFtZSgpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0RnJpZW5kbHlOYW1lKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ2ZyaWVuZGx5bmFtZScpOwogIH0KCgkKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXRWZXJzaW9uKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRWZXJzaW9uKCkKICB7CiAgICByZXR1cm4gJzEuMC4yJzsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBNaW5pbXVtQ1ZTVmVyc2lvbigpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gTWluaW11bUNNU1ZlcnNpb24oKQogIHsKICAgIHJldHVybiAiMC4xMSI7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0SGVscCgpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0SGVscCgpCiAgewogICAgcmV0dXJuICR0aGlzLT5MYW5nKCdoZWxwJyk7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0QXV0aG9yKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRBdXRob3IoKQogIHsKICAgIHJldHVybiAnY2FsZ3V5MTAwMCc7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0QXV0aG9yRW1haWwoKQogICBUaGlzIHJldHVybnMgYSBzdHJpbmcgdGhhdCBpcyBwcmVzZW50ZWQgaW4gdGhlIE1vZHVsZQogICBBZG1pbiBpZiB5b3UgY2xpY2sgb24gdGhlICJBYm91dCIgbGluay4gSXQgaGVscHMgdXNlcnMKICAgb2YgeW91ciBtb2R1bGUgZ2V0IGluIHRvdWNoIHdpdGggeW91IHRvIHNlbmQgYnVnIHJlcG9ydHMsCiAgIHF1ZXN0aW9ucywgY2FzZXMgb2YgYmVlciwgYW5kL29yIGxhcmdlIHN1bXMgb2YgbW9uZXkuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0QXV0aG9yRW1haWwoKQogIHsKICAgIHJldHVybiAnY2FsZ3V5MTAwMEBob3RtYWlsLmNvbSc7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0Q2hhbmdlTG9nKCkKICAgVGhpcyByZXR1cm5zIGEgc3RyaW5nIHRoYXQgaXMgcHJlc2VudGVkIGluIHRoZSBtb2R1bGUKICAgQWRtaW4gaWYgeW91IGNsaWNrIG9uIHRoZSBBYm91dCBsaW5rLiBJdCBoZWxwcyB1c2VycwogICBmaWd1cmUgb3V0IHdoYXQncyBjaGFuZ2VkIGJldHdlZW4gcmVsZWFzZXMuCiAgIFNlZSB0aGUgbm90ZSBvbiBsb2NhbGl6YXRpb24gYXQgdGhlIHRvcCBvZiB0aGlzIGZpbGUuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0Q2hhbmdlTG9nKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ2NoYW5nZWxvZycpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIElzUGx1Z2luTW9kdWxlKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBJc1BsdWdpbk1vZHVsZSgpCiAgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEhhc0FkbWluKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBIYXNBZG1pbigpCiAgewogICAgcmV0dXJuIHRydWU7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0QWRtaW5TZWN0aW9uKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRBZG1pblNlY3Rpb24oKQogIHsKICAgIHJldHVybiAnbGF5b3V0JzsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXRBZG1pbkRlc2NyaXB0aW9uKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRBZG1pbkRlc2NyaXB0aW9uKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ21vZGRlc2NyaXB0aW9uJyk7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgVmlzaWJsZVRvQWRtaW5Vc2VyKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBWaXNpYmxlVG9BZG1pblVzZXIoKQogIHsKICAgIHJldHVybiAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNYW5hZ2UgVGhlbWVzJyk7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXREZXBlbmRlbmNpZXMoKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEdldERlcGVuZGVuY2llcygpCiAgewogICAgcmV0dXJuIGFycmF5KCk7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgSW5zdGFsbCgpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gSW5zdGFsbCgpCiAgewogICAgLy8gdGhpcyBtb2R1bGUgZG9lcyBub3QgaGF2ZSBhbnkgdGFibGVzIG9mIGl0cyBvd24KCiAgICAvLyBjcmVhdGUgYSBwZXJtaXNzaW9uCiAgICAkdGhpcy0+Q3JlYXRlUGVybWlzc2lvbignTWFuYWdlIFRoZW1lcycsICdNYW5hZ2UgVGhlbWVzJyk7CiAgICAgICAgCiAgICAvLyBwdXQgbWVudGlvbiBpbnRvIHRoZSBhZG1pbiBsb2cKICAgICR0aGlzLT5BdWRpdCggMCwgJHRoaXMtPkxhbmcoJ2ZyaWVuZGx5bmFtZScpLCAkdGhpcy0+TGFuZygnaW5zdGFsbGVkJywkdGhpcy0+R2V0VmVyc2lvbigpKSk7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgSW5zdGFsbFBvc3RNZXNzYWdlKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBJbnN0YWxsUG9zdE1lc3NhZ2UoKQogIHsKICAgIHJldHVybiAkdGhpcy0+TGFuZygncG9zdGluc3RhbGwnKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBVbmluc3RhbGxQb3N0TWVzc2FnZSgpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gVW5pbnN0YWxsUG9zdE1lc3NhZ2UoKQogIHsKICAgIHJldHVybiAkdGhpcy0+TGFuZygncG9zdHVuaW5zdGFsbCcpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIFVwZ3JhZGUoKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIFVwZ3JhZGUoJG9sZHZlcnNpb24sICRuZXd2ZXJzaW9uKQogIHsKICAgIC8vIG5vdGhpbmcgdG8gZG8gaGVyZSwgeWV0CgkJCiAgICAvLyBwdXQgbWVudGlvbiBpbnRvIHRoZSBhZG1pbiBsb2cKICAgICR0aGlzLT5BdWRpdCggMCwgJHRoaXMtPkxhbmcoJ2ZyaWVuZGx5bmFtZScpLCAkdGhpcy0+TGFuZygndXBncmFkZWQnLCR0aGlzLT5HZXRWZXJzaW9uKCkpKTsKICB9CgkKCQogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIFVuaW5zdGFsbCgpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gVW5pbnN0YWxsKCkKICB7CiAgICAvLyByZW1vdmUgdGhlIHBlcm1pc3Npb25zCiAgICAkdGhpcy0+UmVtb3ZlUGVybWlzc2lvbignTWFuYWdlIFRoZW1lcycpOwoKICAgIC8vIHB1dCBtZW50aW9uIGludG8gdGhlIGFkbWluIGxvZwogICAgJHRoaXMtPkF1ZGl0KCAwLCAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyksICR0aGlzLT5MYW5nKCd1bmluc3RhbGxlZCcpKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBEb0FjdGlvbigkYWN0aW9uLCAkaWQsICRwYXJhbXMsICRyZXR1cm5faWQpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gRG9BY3Rpb24oJGFjdGlvbiwgJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkPS0xKQogIHsKICAgIHN3aXRjaCAoJGFjdGlvbikKICAgICAgewogICAgICBjYXNlICdkZWZhdWx0JzoKCXsKCSAgLy8gbW9kdWxlIGhhcyBubyB1c2VyIG91dHB1dAoJICBicmVhazsKCX0KICAgICAgY2FzZSAnZGVmYXVsdGFkbWluJzoKCXsKCSAgLy8gb25seSBsZXQgcGVvcGxlIGFjY2VzcyBtb2R1bGUgcHJlZmVyZW5jZXMgaWYgdGhleSBoYXZlIHBlcm1pc3Npb24KCSAgaWYgKCR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01hbmFnZSBUaGVtZXMnKSkKCSAgICB7CgkgICAgICAkdGhpcy0+RGlzcGxheUFkbWluUGFuZWwoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkKTsKCSAgICB9CgkgIGVsc2UKCSAgICB7CgkgICAgICAkdGhpcy0+RGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5faWQsCgkJCQkgICAgICAkdGhpcy0+TGFuZygnYWNjZXNzZGVuaWVkJykpOwoJICAgIH0KCSAgYnJlYWs7Cgl9CiAgICAgIGNhc2UgJ2V4cG9ydHRoZW1lJzoKCXsKCSAgaWYgKCR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01hbmFnZSBUaGVtZXMnKSkKCSAgICB7CgkgICAgICAkdGhpcy0+RG9FeHBvcnRUaGVtZSgkaWQsICRwYXJhbXMsICRyZXR1cm5faWQpOwoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgICR0aGlzLT5EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwKCQkJCSAgICAgICR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7CgkgICAgfQoJICBicmVhazsKCX0KICAgICAgY2FzZSAnaW1wb3J0dGhlbWUnOgoJewoJICBpZiAoJHRoaXMtPkNoZWNrUGVybWlzc2lvbignTWFuYWdlIFRoZW1lcycpKQoJICAgIHsKCSAgICAgICR0aGlzLT5Eb0ltcG9ydFRoZW1lKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCk7CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAgJHRoaXMtPkRpc3BsYXlFcnJvclBhZ2UoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLAoJCQkJICAgICAgJHRoaXMtPkxhbmcoJ2FjY2Vzc2RlbmllZCcpKTsKCSAgICB9CgkgIGJyZWFrOwoJfQogICAgICB9CgogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIF9jbGVhbnVwUmVmZXJlbmNlcwogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIF9jbGVhbnVwUmVmZXJlbmNlcyggJHByZWZpeCwgJHJlZmVyZW5jZXMsICYkaW5wdXQgKQogIHsKICAgICRkYXRhID0gJGlucHV0OwogICAgZm9yZWFjaCggJHJlZmVyZW5jZXMgYXMgJHJlZiApCiAgICAgIHsKCWVjaG8gIkRFQlVHIHJlcGxhY2luZyAiLiRyZWZbJ2xvY2F0aW9uJ10uIiB3aXRoICIuJHByZWZpeC4iLyIuJHJlZlsnbG9jYXRpb24nXS4iPGJyLz4iOwoJJGRhdGEgPSBwcmVnX3JlcGxhY2UoICd8Jy4kcmVmWydsb2NhdGlvbiddLid8JywgJHByZWZpeC4iLyIuJHJlZlsnbG9jYXRpb24nXSwKCQkJICAgICAgJGRhdGEgKTsKCWlmKCAkZGF0YSA9PSAnJyApCgkgIHsKCSAgICBlY2hvICJERUJVRyBlcnJvciBpbiByZXBsYWNlPGJyLz4iOwoJICAgIHJldHVybiBmYWxzZTsKCSAgfQogICAgICB9CiAgICAkaW5wdXQgPSAkZGF0YTsKICAgIHJldHVybiB0cnVlOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIF9leHRyYWN0SFRNTEltYWdlcwogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIF9leHRyYWN0VGVtcGxhdGVJbWFnZXMoJHRlbXBsYXRlKQogIHsKICAgICRyZXN1bHQgPSBhcnJheSgpOwogICAgJHVybHMgPSBnZXRfdXJscygkdGVtcGxhdGUtPmNvbnRlbnQpOwogICAgLy8gd2UncmUgb25seSBjb25jZXJuZWQgYWJvdXQgdGhlIHNyYyB1cmxzCiAgICBmb3JlYWNoKCAkdXJsc1snc3JjJ10gYXMgJHNyYyApCiAgICAgIHsKCS8vIGlmIGl0J3MgYW4gZXh0ZXJuYWwgbGluayB3ZSBpZ25vcmUgaXQKCS8vIGlmIGl0J3MgYW4gaW50ZXJuYWwgbGluaywgd2UgYWRkIGl0CglpZiggIXByZWdfbWF0Y2goJy9eaHR0cFw6LycsJHNyYykgKSAKCSAgewoJICAgICRyZXN1bHRbXSA9ICRzcmM7CgkgIH0KICAgICAgfQoKICAgIHJldHVybiAkcmVzdWx0OwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIF9leHRyYWN0U3R5bGVzaGVldEltYWdlcwogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIF9leHRyYWN0U3R5bGVzaGVldEltYWdlcygkc3R5bGVzaGVldCkKICB7CiAgICAkcmVnZXg9Jy8uKnVybFxzKlwoXCIoLiopXCJcKS9pJzsKICAgIHByZWdfbWF0Y2hfYWxsKCAkcmVnZXgsICRzdHlsZXNoZWV0LT52YWx1ZSwgJG1hdGNoZXMgKTsKICAgIC8vICRtYXRjaGVzWzFdIGlzIGFsbCBpbW1wb3J0YW50CiAgICAvLyBub3cgc3RyaXAgb3V0IGFueSB0aGF0IGhhdmUgXmh0dHAgaW4gdGhlbQogICAgJHJlc3VsdCA9IGFycmF5KCk7CiAgICBmb3JlYWNoKCAkbWF0Y2hlc1sxXSBhcyAkbWF0Y2ggKQogICAgICB7CglpZiggIXByZWdfbWF0Y2goICcvXmh0dHBcOi8nLCAkbWF0Y2ggKSApCgkgIHsKCSAgICAkcmVzdWx0W10gPSAkbWF0Y2g7CgkgIH0KICAgICAgfQoKICAgIHJldHVybiAkcmVzdWx0OwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIF9zYXZlRW5jb2RlZEZpbGUKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfc2F2ZUVuY29kZWRGaWxlKCAkcHJlZml4LCAkbmFtZSwgJiRsb2NhdGlvbiwgJGVuY29kZWQsICRkYXRhICkKICB7CiAgICAvLyBjbGVhbiB1cCB0aGUgbG9jYXRpb24KICAgIGlmKCBzdWJzdHIoJGxvY2F0aW9uLDAsMSkgPT0gJy8nICkKICAgICAgewoJJGxvY2F0aW9uID0gc3Vic3RyKCRsb2NhdGlvbiwxKTsKICAgICAgfQogICAgCiAgICBpZiggJGVuY29kZWQgKQogICAgICB7CgkkZGF0YSA9IGJhc2U2NF9kZWNvZGUoICRkYXRhICk7CiAgICAgIH0KCiAgICAvLyB0cmFuc2xhdGUgc2xhc2hlcyBpZiB3ZSBoYXZlIHRvCiAgICAkbmV3bG9jID0gcHJlZ19yZXBsYWNlKCAnfFwvfCcsIERJUkVDVE9SWV9TRVBBUkFUT1IsICRsb2NhdGlvbiApOwoKICAgICRkaXIgPSAkcHJlZml4LkRJUkVDVE9SWV9TRVBBUkFUT1IuZGlybmFtZSggJGxvY2F0aW9uICk7CiAgICBpZiggIWZpbGVfZXhpc3RzKCAkZGlyICkgKQogICAgICB7Cglta2RpciggJGRpciApOwoJaWYoICFmaWxlX2V4aXN0cyggJGRpciApICkKCSAgewoJICAgIGVjaG8gIkRFQlVHOiBjb3VsZCBub3QgY3JlYXRlIGRpcmVjdG9yeSAkZGlyPGJyLz4iOwoJICAgIHJldHVybiAwOwoJICB9CiAgICAgIH0KCiAgICAvLyBhbmQgcHV0IGl0IG91dCB0aGVyZQogICAgZ2xvYmFsICRnQ21zOwogICAgJGZuID0gJHByZWZpeC5ESVJFQ1RPUllfU0VQQVJBVE9SLiRuZXdsb2M7CiAgICAkZnAgPSBmb3BlbiggJGZuLCAidyIgKTsKICAgIGlmKCAhJGZwICkKICAgICAgewoJcmV0dXJuIDA7CiAgICAgIH0KICAgIGZ3cml0ZSggJGZwLCAkZGF0YSApOwogICAgZmNsb3NlKCAkZnAgKTsKICAgIGVjaG8gIkRFQlVHOiB3cm90ZSBkYXRhIHRvICRmbjxici8+IjsKICAgIHJldHVybiAxOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIERpc3BsYXlFcnJvclBhZ2UoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLCAkbWVzc2FnZSkKICAgTk9UIFBBUlQgT0YgVEhFIE1PRFVMRSBBUEkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBEaXNwbGF5RXJyb3JQYWdlKCRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCwgJG1lc3NhZ2U9JycpCiAgewogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0aXRsZV9lcnJvcicsICR0aGlzLT5MYW5nKCdlcnJvcicpKTsKICAgIGlmICgkbWVzc2FnZSAhPSAnJykKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduX2J5X3JlZignbWVzc2FnZScsICRtZXNzYWdlKTsKICAgICAgfQoKICAgIC8vIERpc3BsYXkgdGhlIHBvcHVsYXRlZCB0ZW1wbGF0ZQogICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdlcnJvci50cGwnKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBEaXNwbGF5QWRtaW5QYW5lbCgkaWQsICRwYXJhbXMsICRyZXR1cm5faWQsICRtZXNzYWdlKQogICBOT1QgUEFSVCBPRiBUSEUgTU9EVUxFIEFQSQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIERpc3BsYXlBZG1pblBhbmVsKCRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCwgJG1lc3NhZ2U9JycpCiAgewogICAgZWNobyAkdGhpcy0+U3RhcnRUYWJIZWFkZXJzKCk7CiAgICBlY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIoJ2V4cG9ydCcsICR0aGlzLT5MYW5nKCdleHBvcnQnKSk7CiAgICBlY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIoJ2ltcG9ydCcsICR0aGlzLT5MYW5nKCdpbXBvcnQnKSk7CiAgICBlY2hvICR0aGlzLT5FbmRUYWJIZWFkZXJzKCk7CgogICAgZWNobyAkdGhpcy0+U3RhcnRUYWJDb250ZW50KCk7CgogICAgLy8gdGhlIGV4cG9ydCB0YWIKICAgIGVjaG8gJHRoaXMtPlN0YXJ0VGFiKCdleHBvcnQnKTsKICAgICRhbGx0ZW1wbGF0ZXMgPSBUZW1wbGF0ZU9wZXJhdGlvbnM6OkxvYWRUZW1wbGF0ZXMoKTsKCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N0YXJ0Zm9ybScsCgkJCSAgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCgkaWQsJ2V4cG9ydHRoZW1lJywkcmV0dXJuaWQpKTsKCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lkdGV4dCcsICR0aGlzLT5MYW5nKCdpZCcpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignbmFtZXRleHQnLCAkdGhpcy0+TGFuZygnbmFtZScpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignYWN0aXZldGV4dCcsICR0aGlzLT5MYW5nKCdhY3RpdmUnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2RlZmF1bHR0ZXh0JywgJHRoaXMtPkxhbmcoJ2RlZmF1bHQnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2V4cG9ydHRleHQnLCAkdGhpcy0+TGFuZygnZXhwb3J0JykpOwoKICAgIC8vIGl0ZXJhdGUgdGhyb3VnaCBhbGwgb2YgdGhlIHRlbXBsYXRlcwogICAgZ2xvYmFsICRnQ21zOwogICAgJHJvd2NsYXNzID0gJ3JvdzEnOwogICAgJHJvd2FycmF5ID0gYXJyYXkoKTsKICAgIGZvcmVhY2goICRhbGx0ZW1wbGF0ZXMgYXMgJHRlbXBsICkKICAgICAgewoJJG9uZXJvdyA9IG5ldyBzdGRDbGFzcygpOwoJJG9uZXJvdy0+aWQgPSAkdGVtcGwtPmlkOwoJJG9uZXJvdy0+bmFtZSA9ICR0ZW1wbC0+bmFtZTsKCWlmKCAkdGVtcGwtPmFjdGl2ZSApCgkgIHsKCSAgICAkb25lcm93LT5hY3RpdmUgPSAkZ0Ntcy0+dmFyaWFibGVzWydhZG1pbnRoZW1lJ10tPkRpc3BsYXlJbWFnZSgnaWNvbnMvc3lzdGVtL3RydWUuZ2lmJyk7CgkgIH0KCWlmKCAkdGVtcGwtPmRlZmF1bHQgKQoJICB7CgkgICAgJG9uZXJvdy0+ZGVmYXVsdCA9ICRnQ21zLT52YXJpYWJsZXNbJ2FkbWludGhlbWUnXS0+RGlzcGxheUltYWdlKCdpY29ucy9zeXN0ZW0vdHJ1ZS5naWYnKTsKCSAgfQoJJG9uZXJvdy0+cm93Y2xhc3MgPSAkcm93Y2xhc3M7CglpZiggJHRlbXBsLT5hY3RpdmUgKQoJICB7CgkgICAgJG9uZXJvdy0+c2VsZWN0ID0gCgkgICAgICAkdGhpcy0+Q3JlYXRlSW5wdXRSYWRpb0dyb3VwKCAkaWQsICdleHBvcnQnLCBhcnJheSggJG9uZXJvdy0+bmFtZSA9PiAkb25lcm93LT5pZCApICk7CgkgIH0KCWFycmF5X3B1c2goICRyb3dhcnJheSwgJG9uZXJvdyApOwoJKCRyb3djbGFzcyA9PSAicm93MSIgPyAkcm93Y2xhc3MgPSAicm93MiIgOiAkcm93Y2xhc3MgPSAicm93MSIpOwogICAgICB9CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmICgnaXRlbXMnLCAkcm93YXJyYXkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnaXRlbWNvdW50JywgY291bnQoJHJvd2FycmF5KSk7CgogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfdGhlbWVuYW1lJywKCQkJICAkdGhpcy0+TGFuZygncHJvbXB0X3RoZW1lbmFtZScpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXRfdGhlbWVuYW1lJywKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwnaW5wdXRfdGhlbWVuYW1lJywnJywyMCwyMCkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdWJtaXQnLAoJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCgkaWQsJ3N1Ym1pdCcsJHRoaXMtPkxhbmcoJ2V4cG9ydCcpKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2VuZGZvcm0nLAoJCQkgICR0aGlzLT5DcmVhdGVGb3JtRW5kKCkpOwogICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdleHBvcnQudHBsJyk7CiAgICBlY2hvICR0aGlzLT5FbmRUYWIoKTsKCiAgICAvLyB0aGUgaW1wb3J0IHRhYgogICAgZWNobyAkdGhpcy0+U3RhcnRUYWIoJ2ltcG9ydCcpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdGFydGZvcm0nLAoJCQkgICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQoJGlkLCdpbXBvcnR0aGVtZScsJHJldHVybmlkLCdwb3N0JywgJ211bHRpcGFydC9mb3JtLWRhdGEnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdF9icm93c2UnLCAkdGhpcy0+TGFuZygndXBsb2FkJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF9icm93c2UnLAoJCQkgICR0aGlzLT5DcmVhdGVGaWxlVXBsb2FkSW5wdXQoJGlkLCdpbnB1dF9icm93c2UnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N1Ym1pdCcsIAoJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCgkaWQsJ3N1Ym1pdCcsCgkJCQkJCSAgICR0aGlzLT5MYW5nKCdpbXBvcnQnKSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdlbmRmb3JtJywKCQkJICAkdGhpcy0+Q3JlYXRlRm9ybUVuZCgpKTsKICAgIGVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnaW1wb3J0LnRwbCcpOwogICAgZWNobyAkdGhpcy0+RW5kVGFiKCk7CiAgfQoKCiAgZnVuY3Rpb24gRG9FeHBvcnRUaGVtZSgkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQpCiAgewogICAgZ2xvYmFsICRnQ21zOwoKICAgIGlmKCAhaXNzZXQoICRwYXJhbXNbJ2V4cG9ydCddICkgKQogICAgICB7CgkkdGhpcy0+UmVkaXJlY3QoICRpZCwgJ2RlZmF1bHRhZG1pbicsICRyZXR1cm5pZCApOwoJcmV0dXJuOwogICAgICB9CgogICAgLy8gd2UgYXJlIGV4cG9ydGluZyBhIHRlbXBsYXRlCiAgICAvLyBnZXQgdGhlIHRlbXBsYXRlCiAgICAkdGVtcGxhdGUgPSBUZW1wbGF0ZU9wZXJhdGlvbnM6OkxvYWRUZW1wbGF0ZUJ5SUQoICRwYXJhbXNbJ2V4cG9ydCddICk7CiAgICBpZiggISR0ZW1wbGF0ZSApCiAgICAgIHsKCSR0aGlzLT5EaXNwbGF5RXJyb3JQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwgCgkJCQkgJHRoaXMtPkxhbmcoJ2Vycm9yX3RlbXBsYXRlbm90Zm91bmQnKSk7CglyZXR1cm47CiAgICAgIH0KCiAgICAvLyBwYXJzZSB0aHJvdWdoIHRoZSBodG1sIGFuZCBleHRyYWN0IHRoZSBpbWFnZSB0YWdzCiAgICAkdXJscyA9ICR0aGlzLT5fZXh0cmFjdFRlbXBsYXRlSW1hZ2VzKCR0ZW1wbGF0ZSk7CgogICAgLy8gZ2V0IGFsbCBvZiB0aGUgc3R5bGVzaGVldHMgZm9yIHRoYXQgdGVtcGxhdGUKICAgICRzdHlsZXNoZWV0cyA9IFN0eWxlc2hlZXRPcGVyYXRpb25zOjpHZXRUZW1wbGF0ZUFzc29jaWF0ZWRTdHlsZXNoZWV0cyggJHBhcmFtc1snZXhwb3J0J10gKTsKICAgIGZvcmVhY2goICRzdHlsZXNoZWV0cyBhcyAkY3NzaWQgKQogICAgICB7CgkkY3NzID0gU3R5bGVzaGVldE9wZXJhdGlvbnM6OkxvYWRTdHlsZXNoZWV0QnlJRCggJGNzc2lkICk7CgkkY3NzdXJscyA9ICR0aGlzLT5fZXh0cmFjdFN0eWxlc2hlZXRJbWFnZXMoJGNzcyk7CgkkdXJscyA9IGFycmF5X21lcmdlKCAkdXJscywgJGNzc3VybHMgKTsKICAgICAgfQoKICAgICR0aGVtZW5hbWUgPSB0cmltKCRwYXJhbXNbJ2lucHV0X3RoZW1lbmFtZSddICk7CiAgICBpZiggJHRoZW1lbmFtZSA9PSAnJyApCiAgICAgIHsKCSR0aGVtZW5hbWUgPSAndGhlbWUnOwogICAgICB9CiAgICAkdGhlbWVuYW1lID0gc3RyX3JlcGxhY2UoJyAnLCdfJywkdGhlbWVuYW1lKTsKCgogICAgLy8gYW5kIGRvIG91ciB0aGluZy4KICAgICRvdXRwdXQgPSAnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/Pic7CiAgICAkb3V0cHV0IC49ICR0aGlzLT5kdGQ7CiAgICAkb3V0cHV0IC49ICI8dGhlbWU+XG4iOwogICAgJG91dHB1dCAuPSAiICA8bmFtZT4iLiR0aGVtZW5hbWUuIjwvbmFtZT5cbiI7CiAgICAkb3V0cHV0IC49ICIgIDx0ZW1wbGF0ZT5cbiI7CiAgICAkb3V0cHV0IC49ICIgICAgPHRuYW1lPiIuJHRlbXBsYXRlLT5uYW1lLiI8L3RuYW1lPlxuIjsKICAgICRvdXRwdXQgLj0gIiAgICA8dGVuY29kaW5nPiIuJHRlbXBsYXRlLT5lbmNvZGluZy4iPC90ZW5jb2Rpbmc+XG4iOwogICAgJG91dHB1dCAuPSAiICAgIDx0ZGF0YT48IVtDREFUQVsiLiR0ZW1wbGF0ZS0+Y29udGVudC4iXV0+PC90ZGF0YT5cbiI7CiAgICAkb3V0cHV0IC49ICIgIDwvdGVtcGxhdGU+XG4iOwogICAgaWYoICR0ZW1wbGF0ZS0+c3R5bGVzaGVldCAhPSAnJyApIAogICAgICB7Cgkkb3V0cHV0IC49ICIgIDxzdHlsZXNoZWV0PlxuIjsKCSRvdXRwdXQgLj0gIiAgICA8Y3NzbmFtZT5kZWZhdWx0PC9jc3NuYW1lPlxuIjsKCSRvdXRwdXQgLj0gIiAgICA8Y3NzbWVkaWF0eXBlPjwvY3NzbWVkaWF0eXBlPiI7Cgkkb3V0cHV0IC49ICIgICAgPGNzc2RhdGE+PCFbQ0RBVEFbIi4kdGVtcGxhdGUtPnN0eWxlc2hlZXQuIl1dPjwvY3NzZGF0YT5cbiI7Cgkkb3V0cHV0IC49ICIgIDwvc3R5bGVzaGVldD5cbiI7CiAgICAgIH0KICAgIGZvcmVhY2goICRzdHlsZXNoZWV0cyBhcyAkY3NzaWQgKQogICAgICB7CgkkY3NzID0gU3R5bGVzaGVldE9wZXJhdGlvbnM6OkxvYWRTdHlsZXNoZWV0QnlJRCggJGNzc2lkICk7Cgkkb3V0cHV0IC49ICIgIDxzdHlsZXNoZWV0PlxuIjsKCSRvdXRwdXQgLj0gIiAgICA8Y3NzbmFtZT4iLiRjc3MtPm5hbWUuIjwvY3NzbmFtZT5cbiI7Cgkkb3V0cHV0IC49ICIgICAgPGNzc21lZGlhdHlwZT4iLiRjc3MtPm1lZGlhdHlwZS4iPC9jc3NtZWRpYXR5cGU+IjsKCSRvdXRwdXQgLj0gIiAgICA8Y3NzZGF0YT48IVtDREFUQVsiLiRjc3MtPnZhbHVlLiJdXT48L2Nzc2RhdGE+XG4iOwoJJG91dHB1dCAuPSAiICA8L3N0eWxlc2hlZXQ+XG4iOwkKICAgICAgfQoKICAgIGZvcmVhY2goICR1cmxzIGFzICRvbmV1cmwgKQogICAgICB7CgkkY29udGVudHMgPSBmaWxlX2dldF9jb250ZW50cyggJGdDbXMtPmNvbmZpZ1sncm9vdF9wYXRoJ10uRElSRUNUT1JZX1NFUEFSQVRPUi4kb25ldXJsICk7CglpZiggISRjb250ZW50cyApIAoJICB7CgkgICAgY29udGludWU7CgkgIH0KCSRlbmNvZGVkID0gYmFzZTY0X2VuY29kZSggJGNvbnRlbnRzICk7Cgkkb3V0cHV0IC49ICIgIDxyZWZlcmVuY2U+XG4iOwoJJG91dHB1dCAuPSAiICAgIDxyZWZuYW1lPiIuYmFzZW5hbWUoJG9uZXVybCkuIjwvcmVmbmFtZT5cbiI7Cgkkb3V0cHV0IC49ICIgICAgPHJlZmVuY29kZWQ+MTwvcmVmZW5jb2RlZD5cbiI7Cgkkb3V0cHV0IC49ICIgICAgPHJlZmxvY2F0aW9uPiRvbmV1cmw8L3JlZmxvY2F0aW9uPlxuIjsKCSRvdXRwdXQgLj0gIiAgICA8cmVmZGF0YT48IVtDREFUQVsiLiRlbmNvZGVkLiJdXT48L3JlZmRhdGE+XG4iOwoJJG91dHB1dCAuPSAiICA8L3JlZmVyZW5jZT5cbiI7CiAgICAgIH0KICAgICRvdXRwdXQgLj0gIjwvdGhlbWU+XG4iOwogICAgaGVhZGVyKCdDb250ZW50LURlc2NyaXB0aW9uOiBGaWxlIFRyYW5zZmVyJyk7CiAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vZm9yY2UtZG93bmxvYWQnKTsKICAgIGhlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9Jy4kdGhlbWVuYW1lLicueG1sJyk7Ci8vICAgIGhlYWRlcignQ29udGVudC1UeXBlOiB0ZXh0L3htbCcpOwovLyAgICAgaGVhZGVyKCdDb250ZW50LUxlbmd0aDogJy5zdHJsZW4oJG91dHB1dCkpOwoKICAgIC8vIHRvZG8sIGJ1dCBnb29kIGVub3VnaCBmb3Igbm93LgogICAgd2hpbGUoQG9iX2VuZF9jbGVhbigpKTsKICAgIGVjaG8gJG91dHB1dDsKICAgIGV4aXQoKTsKICB9CgoKICBmdW5jdGlvbiBEb0ltcG9ydFRoZW1lKCRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCkKICB7CiAgICBnbG9iYWwgJGdDbXM7CiAgICAkZmllbGROYW1lPSRpZC4naW5wdXRfYnJvd3NlJzsKICAgIGlmICghaXNzZXQgKCRfRklMRVNbJGZpZWxkTmFtZV0pIHx8ICFpc3NldCAoJF9GSUxFUykKCXx8ICFpc19hcnJheSAoJF9GSUxFU1skZmllbGROYW1lXSkgfHwgISRfRklMRVNbJGZpZWxkTmFtZV1bJ25hbWUnXSkKICAgICAgewoJJHRoaXMtPkRpc3BsYXlFcnJvclBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkLCAKCQkJCSAkdGhpcy0+TGFuZygnZXJyb3Jfbm9maWxlc3VwbG9hZGVkJykpOwoJcmV0dXJuOwogICAgICB9CgogICAgLy8gbm9ybWFsaXplIHRoZSBmaWxlIHZhcmlhYmxlCiAgICAkZmlsZSA9ICRfRklMRVNbJGZpZWxkTmFtZV07CiAgICAKICAgIC8vICRmaWxlWyd0bXBfbmFtZSddIGlzIHRoZSBmaWxlIHdlIGhhdmUgdG8gcGFyc2UKICAgICR4bWwgPSBmaWxlX2dldF9jb250ZW50cyggJGZpbGVbJ3RtcF9uYW1lJ10gKTsKCiAgICAvLyBsb2FkIGFsbCB0aGUgc3R5bGVzaGVldHMKICAgICRhbGxzdHlsZXNoZWV0cyA9IFN0eWxlc2hlZXRPcGVyYXRpb25zOjpMb2FkU3R5bGVzaGVldHMoKTsKCiAgICAvLyBhbmQgdGhlIHRlbXBsYXRlcwogICAgJGFsbHRlbXBsYXRlcyA9IFRlbXBsYXRlT3BlcmF0aW9uczo6TG9hZFRlbXBsYXRlcygpOwoKICAgIC8vIHBhcnNlIHRoZSB4bWwgc3R1ZmYKICAgICRwYXJzZXIgPSB4bWxfcGFyc2VyX2NyZWF0ZSgpOwogICAgeG1sX3BhcnNlX2ludG9fc3RydWN0KCAkcGFyc2VyLCAkeG1sLCAkdmFsLCAkaWR4ICk7CiAgICB4bWxfcGFyc2VyX2ZyZWUoICRwYXJzZXIgKTsKCiAgICAkdGhlbWUgPSAnJzsKICAgICRjdXJlbGVtZW50ID0gYXJyYXkoKTsKICAgICR0ZW1wbGF0ZSA9IG5ldyBUZW1wbGF0ZSgpOwogICAgJHN0eWxlc2hlZXRzID0gYXJyYXkoKTsKICAgICRvbmVzaGVldCA9ICcnOwogICAgJG9uZXJlZmVyZW5jZSA9IGFycmF5KCk7CiAgICAkYWxscmVmZXJlbmNlcyA9IGFycmF5KCk7CiAgICBmb3JlYWNoKCAkdmFsIGFzICRlbGVtICkKICAgICAgewoJJHZhbHVlID0gJGVsZW1bJ3ZhbHVlJ107CgkkdHlwZSA9ICRlbGVtWyd0eXBlJ107Cglzd2l0Y2goICRlbGVtWyd0YWcnXSApCgkgIHsKCSAgY2FzZSAnTkFNRSc6CgkgICAgewoJICAgICAgaWYoICR0eXBlICE9ICdjb21wbGV0ZScgJiYgJHR5cGUgIT0gJ2Nsb3NlJyApCgkJewoJCSAgY29udGludWU7CgkJfQoJICAgICAgJHRoZW1lID0gJHZhbHVlOwoJICAgICAgYnJlYWs7CgkgICAgfQoJICBjYXNlICdUTkFNRSc6CgkgICAgaWYoICR0eXBlICE9ICdjb21wbGV0ZScgJiYgJHR5cGUgIT0gJ2Nsb3NlJyApCgkgICAgICB7CgkJY29udGludWU7CgkgICAgICB9CgkgICAgJHRlbXBsYXRlLT5uYW1lID0gJHRoZW1lLiIgOiAiLiR2YWx1ZTsKCSAgICBmb3JlYWNoKCAkYWxsdGVtcGxhdGVzIGFzICR0bXBsICkKCSAgICAgIHsKCQlpZiggJHRtcGwtPm5hbWUgPT0gJHRlbXBsYXRlLT5uYW1lICkKCQkgIHsKCQkgICAgLy8gdGVtcGxhdGUgbmFtZSBleGlzdHMKCQkgICAgJHRoaXMtPkRpc3BsYXlFcnJvclBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkLCAKCQkJCQkgICAgICR0aGlzLT5MYW5nKCdlcnJvcl90ZW1wbGF0ZWV4aXN0cycsJHRlbXBsYXRlLT5uYW1lKSk7CgkJICAgIHJldHVybjsKCQkgIH0KCSAgICAgIH0KCSAgICBicmVhazsKCgkgIGNhc2UgJ1RFTkNPRElORyc6CgkgICAgaWYoICR0eXBlICE9ICdjb21wbGV0ZScgJiYgJHR5cGUgIT0gJ2Nsb3NlJyApCgkgICAgICB7CgkJY29udGludWU7CgkgICAgICB9CgkgICAgJHRlbXBsYXRlLT5lbmNvZGluZyA9ICR2YWx1ZTsKCSAgICBicmVhazsKCSAgICAKCSAgY2FzZSAnVERBVEEnOgoJICAgIGlmKCAkdHlwZSAhPSAnY29tcGxldGUnICYmICR0eXBlICE9ICdjbG9zZScgKQoJICAgICAgewoJCWNvbnRpbnVlOwoJICAgICAgfQoJICAgICR0ZW1wbGF0ZS0+Y29udGVudCA9ICR2YWx1ZTsKCSAgICBicmVhazsKCSAgICAKCSAgY2FzZSAnVEVNUExBVEUnOgoJICAgIGlmKCAkdHlwZSAhPSAnY2xvc2UnICkKCSAgICAgIHsKCQljb250aW51ZTsKCSAgICAgIH0KCSAgICAvLyB3ZSdyZSBjbG9zaW5nIHRoZSB0ZW1wbGF0ZSwgd2UgY2FuIGlnbm9yZSB0aGlzCgkgICAgLy8gbG9va3MgbGlrZSB3ZSBjYW4gaWdub3JlIGl0IGFueXdheXMKCSAgICBicmVhazsKCSAgICAKCSAgY2FzZSAnQ1NTTkFNRSc6CgkgICAgJG9uZXNoZWV0LT5uYW1lID0gJHRoZW1lLiIgOiAiLiR2YWx1ZTsKCSAgICBmb3JlYWNoKCAkYWxsc3R5bGVzaGVldHMgYXMgJGNzc29iaiApCgkgICAgICB7CgkJaWYoICRjc3NvYmotPm5hbWUgPT0gJG9uZXNoZWV0LT5uYW1lICkKCQkgIHsKCQkgICAgLy8gc3R5bGVzaGVldCBuYW1lIGV4aXN0cwoJCSAgICAkdGhpcy0+RGlzcGxheUVycm9yUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsIAoJCQkJCSAgICAgJHRoaXMtPkxhbmcoJ2Vycm9yX3N0eWxlc2hlZXRleGlzdHMnLCRvbmVzaGVldC0+bmFtZSkpOwoJCSAgICByZXR1cm47CgkJICB9CgkgICAgICB9CgkgICAgYnJlYWs7CgoJICBjYXNlICdDU1NNRURJQVRZUEUnOgoJICAgICRvbmVzaGVldC0+bWVkaWF0eXBlID0gJHZhbHVlOwoJICAgIGJyZWFrOwoKCSAgY2FzZSAnQ1NTREFUQSc6CgkgICAgJG9uZXNoZWV0LT52YWx1ZSA9ICR2YWx1ZTsKCSAgICBicmVhazsKCgkgIGNhc2UgJ1NUWUxFU0hFRVQnOgoJICAgIGlmKCAkdHlwZSA9PSAnb3BlbicgKQoJICAgICAgewoJCSRvbmVzaGVldCA9IG5ldyBTdHlsZXNoZWV0KCk7CgkgICAgICB9CgkgICAgZWxzZSBpZiggJHR5cGUgPT0gJ2Nsb3NlJyApCgkgICAgICB7CgkJYXJyYXlfcHVzaCggJHN0eWxlc2hlZXRzLCAkb25lc2hlZXQgKTsKCSAgICAgIH0KCgkgIGNhc2UgJ1JFRk5BTUUnOgoJICAgICRyZWZlcmVuY2VbJ25hbWUnXSA9ICR2YWx1ZTsKCSAgICBicmVhazsKCgkgIGNhc2UgJ1JFRkVOQ09ERUQnOgoJICAgICRyZWZlcmVuY2VbJ2VuY29kZWQnXSA9ICR2YWx1ZTsKCSAgICBicmVhazsKCgkgIGNhc2UgJ1JFRkxPQ0FUSU9OJzoKCSAgICAkcmVmZXJlbmNlWydsb2NhdGlvbiddID0gJHZhbHVlOwoJICAgIGJyZWFrOwoKCSAgY2FzZSAnUkVGREFUQSc6CgkgICAgJHJlZmVyZW5jZVsnZGF0YSddID0gJHZhbHVlOwoJICAgIGJyZWFrOwoKCSAgY2FzZSAnUkVGRVJFTkNFJzoKCSAgICBpZiggJHR5cGUgIT0gJ2Nsb3NlJyApCgkgICAgICB7CgkJY29udGludWU7CgkgICAgICB9CgkgICAgaWYoIGNvdW50KCAkcmVmZXJlbmNlICkgIT0gNCApCgkgICAgICB7CgkJLy8gc3R5bGVzaGVldCBuYW1lIGV4aXN0cwoJCSR0aGlzLT5EaXNwbGF5RXJyb3JQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwgCgkJCQkJICR0aGlzLT5MYW5nKCdlcnJvcl9iYWRlbWJlZCcsJG9uZXNoZWV0LT5uYW1lKSk7CgkgICAgICB9CgkgICAgYXJyYXlfcHVzaCggJGFsbHJlZmVyZW5jZXMsICRyZWZlcmVuY2UgKTsKCSAgICAkcmVmZXJlbmNlID0gYXJyYXkoKTsKCSAgICBicmVhazsKCSAgfQogICAgICB9CgogICAgLy8gbWFrZSBzdXJlIHdlIGhhdmUgYXQgbGVhc3Qgb25lIHN0eWxlc2hlZXQKICAgIGlmKCBjb3VudCggJHN0eWxlc2hlZXRzICkgPT0gMCApCiAgICAgIHsKCSR0aGlzLT5EaXNwbGF5RXJyb3JQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwgCgkJCQkgJHRoaXMtPkxhbmcoJ2Vycm9yX25vc3R5bGVzaGVldHMnKSk7CglyZXR1cm47CiAgICAgIH0KCiAgICAvLyBjbGVhbiB1cCB0aGUgdGVtcGxhdGUgYW5kIHN0eWxlc2hlZXRzIGFuZCBhZGp1c3QgZXZlcnl0aGluZyB0byB0aGVpciBuZXcgbG9jYXRpb25zCiAgICAkcHJlZml4ID0gYmFzZW5hbWUoJGdDbXMtPmNvbmZpZ1sndXBsb2Fkc191cmwnXSkuIi8iLiR0aGVtZTsKICAgIGZvciggJGkgPSAwOyAkaSA8IGNvdW50KCRzdHlsZXNoZWV0cyk7ICRpKysgKQogICAgICB7CgkkcmVzdWx0ID0gJHRoaXMtPl9jbGVhbnVwUmVmZXJlbmNlcyggJHByZWZpeCwgJGFsbHJlZmVyZW5jZXMsICRzdHlsZXNoZWV0c1skaV0tPnZhbHVlICk7CglpZiggISRyZXN1bHQgKQoJICB7CgkgICAgJHRoaXMtPkRpc3BsYXlFcnJvclBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkLCAKCQkJCSAgICAgJHRoaXMtPkxhbmcoJ2Vycm9yX2VkaXRpbmdwcm9ibGVtJykpOwoJICAgIHJldHVybjsKCSAgfQogICAgICB9CiAgICAkcmVzdWx0ID0gJHRoaXMtPl9jbGVhbnVwUmVmZXJlbmNlcyggJHByZWZpeCwgJGFsbHJlZmVyZW5jZXMsICR0ZW1wbGF0ZS0+Y29udGVudCApOwogICAgaWYoICEkcmVzdWx0ICkKICAgICAgewoJJHRoaXMtPkRpc3BsYXlFcnJvclBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkLCAKCQkJCSAkdGhpcy0+TGFuZygnZXJyb3JfZWRpdGluZ3Byb2JsZW0nKSk7CglyZXR1cm47CiAgICAgIH0KCgogICAgLy8gc2F2ZSBvdXIgcmVmZXJlbmNlcyBhcyBmaWxlcwogICAgLy8gZmlyc3Qgd2UgY3JlYXRlIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0CiAgICAkZGVzdCA9ICRnQ21zLT5jb25maWdbJ3VwbG9hZHNfcGF0aCddLkRJUkVDVE9SWV9TRVBBUkFUT1IuJHRoZW1lOwogICAgbWtkaXIoICRkZXN0ICk7CgogICAgZm9yZWFjaCggJGFsbHJlZmVyZW5jZXMgYXMgJHJlZiApCiAgICAgIHsKCSRyZXMgPSAkdGhpcy0+X3NhdmVFbmNvZGVkRmlsZSggJGRlc3QsICRyZWZbJ25hbWUnXSwgJHJlZlsnbG9jYXRpb24nXSwKCQkJCQkkcmVmWydlbmNvZGVkJ10sICRyZWZbJ2RhdGEnXSApOwoJaWYoICRyZXMgIT0gMSApIAoJICB7CgkgICAgLy8gdGhpcyBjb3VsZCBiZSBhIHByb2JsZW0gd2UgY291bGQgaGF2ZSBhIGJ1bmNoIG8gZmlsZXMgbHlpbmcgYXJvdW5kCgkgICAgJHRoaXMtPkRpc3BsYXlFcnJvclBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkLCAKCQkJCSAgICAgJHRoaXMtPkxhbmcoJ2Vycm9yX3Byb2JsZW1zYXZpbmdpbmNsdWRlcycpKTsKCSAgICByZXR1cm47CgkgIH0KICAgICAgfQogICAgCiAgICAKICAgIC8vIG5vdyB3ZSBoYXZlIGEgdGVtcGxhdGUgYW5kIG9uZSBvciBtb3JlIHN0eWxlc2hlZXRzLCBkbyBvdXIgbWFnaWMKICAgICRjc3NpZHMgPSBhcnJheSgpOwogICAgZm9yZWFjaCggJHN0eWxlc2hlZXRzIGFzICRjc3MgKQogICAgICB7CgkkbmV3aWQgPSBTdHlsZVNoZWV0T3BlcmF0aW9uczo6SW5zZXJ0U3R5bGVzaGVldCggJGNzcyApOwoJaWYoICRuZXdpZCA9PSAtMSApCgkgIHsKCSAgICAvLyBjb3VsZG4ndCBpbnNlcnQgdGhlIHN0eWxlc2hlZXQKCSAgICBjb250aW51ZTsKCSAgfQoJYXJyYXlfcHVzaCggJGNzc2lkcywgJG5ld2lkICk7CiAgICAgIH0KCiAgICAkbmV3dG1wbGlkID0gVGVtcGxhdGVPcGVyYXRpb25zOjpJbnNlcnRUZW1wbGF0ZSggJHRlbXBsYXRlICk7CiAgICBpZiggJG5ld3RtcGxpZCA9PSAtMSApCiAgICAgIHsKCSR0aGlzLT5EaXNwbGF5RXJyb3JQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwgCgkJCQkgJHRoaXMtPkxhbmcoJ2Vycm9yX2NvdWxkbm90Y3JlYXRldGVtcGxhdGUnKSk7CglyZXR1cm47CiAgICAgIH0KICAgIGVsc2UKICAgICAgewoJLy8gbm93IGFzc29jaWF0ZSB0aGUgc3R5bGVzaGVldHMgd2l0aCB0aGlzIHRlbXBsYXRlCglmb3JlYWNoKCAkY3NzaWRzIGFzICRpZCApCgkgIHsKCSAgICBpZiggIVN0eWxlc2hlZXRPcGVyYXRpb25zOjpBc3NvY2lhdGVTdHlsZXNoZWV0VG9UZW1wbGF0ZSggJGlkLCAkbmV3dG1wbGlkICkgKQoJICAgICAgewoJCS8vIHJlYWxseSByZWFsbHkgYmFkIGlmIHRoaXMgZGlkbid0IHdvcmsuCgkJLy8gY3V6IHRoZW9yZXRpY2FsbHkgd2Ugd291bGQgaGF2ZSB0byBjbGVhbiB1cC4KCQkkdGhpcy0+RGlzcGxheUVycm9yUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsIAoJCQkJCSAkdGhpcy0+TGFuZygnZXJyb3JfY291bGRub3Rhc3NvY2NzcycpKTsKCQlyZXR1cm47CgkgICAgICB9CgkgIH0KICAgICAgfQoKICAgIC8vIGlmIHdlIGdvdCBoZXJlLCBldmVyeXRoaW5nIHNob3VsZCBiZSBhLW9rYXkKICAgIHJldHVybjsgLy8gZGVidWcKICAgICR0aGlzLT5SZWRpcmVjdCggJGlkLCAnZGVmYXVsdGFkbWluJywgJHJldHVybmlkICk7CiAgfSAvLyBmdW5jdGlvbgoKfQoKPz4K]]></data>
  </file>
</module>
