<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE module [
  <!ELEMENT module (dtdversion,name,version,description*,help*,about*,requires*,file+)>
  <!ELEMENT dtdversion (#PCDATA)>
  <!ELEMENT name (#PCDATA)>
  <!ELEMENT version (#PCDATA)>
  <!ELEMENT mincmsversion (#PCDATA)>
  <!ELEMENT description (#PCDATA)>
  <!ELEMENT help (#PCDATA)>
  <!ELEMENT about (#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>
	<dtdversion>1.3</dtdversion>
	<name>CodeMirror</name>
	<version>0.1.6</version>
  <mincmsversion>1.8</mincmsversion>
	<help><![CDATA[PHN0cm9uZz5XaGF0IGRvZXMgdGhpcyBtb2R1bGUgZG8/PC9zdHJvbmc+Cjxici8+ClRoZSBDb2RlTWlycm9yIG1vZHVsZSBhbGxvd3MgeW91IHRvIGVkaXQgY29udGVudCwgdGVtcGxhdGVzIGFuZCBzdHlsZXNoZWV0cyB1c2luZyBhIHN5bnRheGhpZ2hsaWdodGluZyBlZGl0b3IgaW5zaWRlIHlvdXIgYnJvd3Nlci4KSXQgY2FuIGJvdGggcmVwbGFjZSBhIHd5c2l3eWctbW9kdWxlLCBhbmQgYWN0IHN0YW5kYWxvbmUgZm9yIHRlbXBsYXRlL3N0eWxlc2hlZXQgZWRpdGluZyAob25seSBzdXBwb3J0ZWQgaW4gQ01TbXMgMS4xKykKPGJyLz48YnIvPgo8c3Ryb25nPkhvdyBkbyBJIHVzZSB0aGlzIG1vZHVsZT88L3N0cm9uZz4KWW91IHNpbXBseSBpbnN0YWxsIGl0LCBhbmQgY2hvb3NlIGl0IGluIHlvdXIgYWRtaW4gdXNlciBwcmVmZXJlbmNlcy4gTm90ZSwgdGhhdCBpZiB5b3UgdXNlIENNU21zIDEuMSBvciBhYm92ZSB5b3UgY2FuCnNlbGVjdCBDb2RlTWlycm9yIGJvdGggYXMgYSBXWVNJV1lHIGFuZCBhcyBhIHN5bnRheCBoaWdobGlnaHRpbmcgZWRpdG9yLjxoMz5QYXJhbWV0ZXJzPC9oMz48dWw+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gbGFuZz0iZW5fVVMiIC0gUGFyYW1ldGVyIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGF0IGxhbmd1YWdlIHRvIHVzZSBmb3IgZGlzcGxheSBvbiB0aGUgZnJvbnRlbmQuIE5vdCBhbGwgbW9kdWxlcyBzdXBwb3J0IG9yIG5lZWQgdGhpcy48L2xpPjwvdWw+]]></help>
	<about><![CDATA[PGJyIC8+QXV0aG9yOiBNb3J0ZW4gUG91bHNlbiAmbHQ7Jmx0O21vcnRlbkBwb3Vsc2VuLm9yZyZndDsmZ3Q7PGJyIC8+PGJyIC8+VmVyc2lvbjogMC4xLjY8YnIgLz48YnIgLz5DaGFuZ2UgSGlzdG9yeTo8YnIgLz48dWw+CjxsaT4wLjEuNiAtIFVwZGF0ZWQgdG8gQ00gMC43MCwgQWRkZWQgb3B0aW9uIHRvIG1hdGNoIHBhcmVudGhlc2lzPC9saT4KPGxpPjAuMS41IC0gVXBkYXRlZCB0byBDTSAwLjY2LCByZW1vdmVkIGEgc3RyYW5nZSBcbiBjaGFyIGZyb20gaGVhZGVyb3V0cHV0LCBtYWRlIHRhYmJpbmcgd29yazwvbGk+CjxsaT4wLjEuNCAtIEZpeGVkIENQVSBob2dnaW5nIHByb2JsZW1zIGJ5IHJld3JpdGluZyB0ZXN0YXJlYS1jb2RlPC9saT4KPGxpPjAuMS4zIC0gVXBkYXRlZCB0byBDTSAwLjY1LCBhZGRlZCBvcHRpb24gdG8gdG9nZ2xlIHdvcmR3cmFwPC9saT4KPGxpPjAuMS4yIC0gVXBkYXRlZCB0byBDTSAwLjYzPC9saT4KPGxpPjAuMS4xIC0gVXBkYXRlZCB0byBDTSAwLjYyLCBmaXhlZCBleGFtcGxlcyBhbmQgcHJvYmFibHkgZnVuY3Rpb25hbGl0eSBhcyB3ZWxsPC9saT4KPGxpPjAuMS4wIC0gSW5pdGlhbCByZWxlYXNlIDwvbGk+CjwvdWw+PGJyIC8+]]></about>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/action.defaultadmin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCgppZiAoIWlzc2V0KCRnQ21zKSkgZXhpdDsKCmlmICghJHRoaXMtPkNoZWNrUGVybWlzc2lvbignTW9kaWZ5IFNpdGUgUHJlZmVyZW5jZXMnKSkgewogIGVjaG8gJHRoaXMtPlNob3dFcnJvcnMoJHRoaXMtPkxhbmcoJ25lZWRwZXJtaXNzaW9uJywgYXJyYXkoJ01vZGlmeSBTaXRlIFByZWZlcmVuY2VzJykpKTsKICByZXR1cm47Cn0KCmlmIChpc3NldCgkcGFyYW1zWyJleGFtcGxlc3ludGF4Il0pKSB7CiAgJHRoaXMtPlNldFByZWZlcmVuY2UoImV4YW1wbGVzeW50YXgiLCRwYXJhbXNbImV4YW1wbGVzeW50YXgiXSk7Cn0KCmVjaG8gJHRoaXMtPlN0YXJ0VGFiSGVhZGVycygpOwplY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIoInNldHRpbmdzIiwkdGhpcy0+TGFuZygic2V0dGluZ3N0YWIiKSk7CgplY2hvICR0aGlzLT5FbmRUYWJIZWFkZXJzKCk7CmVjaG8gJHRoaXMtPlN0YXJ0VGFiQ29udGVudCgpOwoKCmVjaG8gJHRoaXMtPlN0YXJ0VGFiKCJzZXR0aW5ncyIpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N0YXJ0Zm9ybScsICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQoJGlkLCAnc2F2ZXNldHRpbmdzJywgJHJldHVybmlkKSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbignZW5kZm9ybScsICR0aGlzLT5DcmVhdGVGb3JtRW5kKCkpOwoKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzaG93bGluZW51bWJlcnN0ZXh0JywgJHRoaXMtPkxhbmcoInNob3dsaW5lbnVtYmVycyIpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzaG93bGluZW51bWJlcnNpbnB1dCcsICR0aGlzLT5DcmVhdGVJbnB1dENoZWNrYm94KCRpZCwic2hvd2xpbmVudW1iZXJzIiwxLCR0aGlzLT5HZXRQcmVmZXJlbmNlKCJzaG93bGluZW51bWJlcnMiLDEpKSk7CgokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RleHR3cmFwcGluZ3RleHQnLCAkdGhpcy0+TGFuZygidGV4dHdyYXBwaW5nIikpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RleHR3cmFwcGluZ2lucHV0JywgJHRoaXMtPkNyZWF0ZUlucHV0Q2hlY2tib3goJGlkLCJ0ZXh0d3JhcHBpbmciLDEsJHRoaXMtPkdldFByZWZlcmVuY2UoInRleHR3cmFwcGluZyIsMSkpKTsKCiR0aGlzLT5zbWFydHktPmFzc2lnbignYXV0b21hdGNocGFyZW5zdGV4dCcsICR0aGlzLT5MYW5nKCJhdXRvbWF0Y2hwYXJlbnMiKSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbignYXV0b21hdGNocGFyZW5zaW5wdXQnLCAkdGhpcy0+Q3JlYXRlSW5wdXRDaGVja2JveCgkaWQsImF1dG9tYXRjaHBhcmVucyIsIjEiLCR0aGlzLT5HZXRQcmVmZXJlbmNlKCJhdXRvbWF0Y2hwYXJlbnMiLCIwIikpKTsKCiR0aGlzLT5zbWFydHktPmFzc2lnbignc3VibWl0JywgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0KCRpZCwgJ3N1Ym1pdCcsICR0aGlzLT5MYW5nKCdzYXZlc2V0dGluZ3MnKSkpOwoKZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdzZXR0aW5ncy50cGwnKTsKCmVjaG8gJHRoaXMtPkVuZFRhYigpOwplY2hvICR0aGlzLT5FbmRUYWJDb250ZW50KCk7CgokY29udGVudD0iIjsKc3dpdGNoICgkdGhpcy0+R2V0UHJlZmVyZW5jZSgiZXhhbXBsZXN5bnRheCIsImh0bWwiKSkgewogIGNhc2UgImh0bWwiIDogewogICAgJGNvbnRlbnQ9Igo8aHRtbD4KICA8aGVhZD4KICAgIDx0aXRsZT5UZXN0aW5nIGh0bWwtc3ludGF4PC90aXRsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICBBbmQgZG9pbmcgYWJzb2x1dGVseSBub3RoaW5nIGVsc2UKICA8L2JvZHk+CjwvaHRtbD4KIjsKICBicmVhazsKICB9CiAgY2FzZSAiY3NzIiA6IHsKICAgICRjb250ZW50PSIKLnRlc3Rjc3MgewogIGZvbnQtd2VpZ2h0OmJvbGQ7CiAgaGVpZ2h0OiAxMHB4Owp9CiI7CiAgYnJlYWs7CiAgfQogIGNhc2UgInBocCIgOiB7CiAgICAkY29udGVudD0iCjw/cGhwCiAgZnVuY3Rpb24gdGVzdFBIUChcJHNvbWVwYXJhbSkgewogICAgZWNobyAnRG8geW91IHRoaW5rIHRoaXMgbG9va3MgbmljZT8nOwogIH0KPz4KIjsKICBicmVhazsKICB9CiAgY2FzZSAianMiIDogewogICAgJGNvbnRlbnQ9JwpmdW5jdGlvbiBteWpzZnVudGlvbihwYXJhbXMpIHsKICB2YXIgbXNnID0gIlRoaXMgamF2YXNjcmlwdCBpcyBmYW50YXN0aWMhIgogIGZvciAodmFyIGk9MDsgaTw5OTk5OyBpKyspIHsKICAgIGFsZXJ0KG1zZyk7CiAgICAvKlRoaXMgbXVzdCBiZSB0aGUgbW9zdCBhbm5veWluZyBmdW5jdGlvbiBldmVyISovCiAgfQogIHJldHVybiB0cnVlCn0KJzsKICBicmVhazsKICB9Cn0KCmVjaG8gJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCgkaWQsImRlZmF1bHRhZG1pbiIpOwplY2hvICR0aGlzLT5MYW5nKCJleGFtcGxlc3ludGF4IikuIjogIjsKJHN5bnRheGVzPWFycmF5KCR0aGlzLT5MYW5nKCJodG1sdGVzdCIpPT4iaHRtbCIsJHRoaXMtPkxhbmcoImNzc3Rlc3QiKT0+ImNzcyIsJHRoaXMtPkxhbmcoInBocHRlc3QiKT0+InBocCIsJHRoaXMtPkxhbmcoImpzdGVzdCIpPT4ianMiKTsKZWNobyAkdGhpcy0+Q3JlYXRlSW5wdXREcm9wZG93bigkaWQsImV4YW1wbGVzeW50YXgiLCRzeW50YXhlcywtMSwkdGhpcy0+R2V0UHJlZmVyZW5jZSgiZXhhbXBsZXN5bnRheCIsImh0bWwiKSk7CmVjaG8gJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0KCRpZCwiZXhhbXBsZXN1Ym1pdCIsJHRoaXMtPkxhbmcoImNoYW5nZSIpKTsKZWNobyAiPGJyLz4iOwplY2hvICR0aGlzLT5DcmVhdGVUZXh0QXJlYShmYWxzZSwkaWQsJGNvbnRlbnQsInRlc3RhcmVhMSIsJycsJycsJycsJycsJycsJycsJ0NvZGVNaXJyb3InLCR0aGlzLT5HZXRQcmVmZXJlbmNlKCJleGFtcGxlc3ludGF4IiwiaHRtbCIpKTsKZWNobyAkdGhpcy0+Q3JlYXRlRm9ybUVuZCgpOwoKCgoKCj8+]]></data>
	</file>
	<file>
	  <filename>/action.savesettings.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmlmICghaXNzZXQoJGdDbXMpKSBleGl0OwoKaWYgKCEkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgU2l0ZSBQcmVmZXJlbmNlcycpKSB7CiAgZWNobyAkdGhpcy0+U2hvd0Vycm9ycygkdGhpcy0+TGFuZygnbmVlZHBlcm1pc3Npb24nLCBhcnJheSgnTW9kaWZ5IFNpdGUgUHJlZmVyZW5jZXMnKSkpOwogIHJldHVybjsKfQoKaWYoaXNzZXQoJHBhcmFtc1sic2hvd2xpbmVudW1iZXJzIl0pKSAKICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgic2hvd2xpbmVudW1iZXJzIiwgJHBhcmFtc1sic2hvd2xpbmVudW1iZXJzIl0pOwplbHNlCiAgJHRoaXMtPlNldFByZWZlcmVuY2UoInNob3dsaW5lbnVtYmVycyIsICcwJyk7CgppZihpc3NldCgkcGFyYW1zWyJ0ZXh0d3JhcHBpbmciXSkpCiAgJHRoaXMtPlNldFByZWZlcmVuY2UoInRleHR3cmFwcGluZyIsICRwYXJhbXNbInRleHR3cmFwcGluZyJdKTsKZWxzZQogICR0aGlzLT5TZXRQcmVmZXJlbmNlKCJ0ZXh0d3JhcHBpbmciLCAnMCcpOwogIAppZihpc3NldCgkcGFyYW1zWyJhdXRvbWF0Y2hwYXJlbnMiXSkpCiAgJHRoaXMtPlNldFByZWZlcmVuY2UoImF1dG9tYXRjaHBhcmVucyIsICRwYXJhbXNbImF1dG9tYXRjaHBhcmVucyJdKTsKZWxzZQogICR0aGlzLT5TZXRQcmVmZXJlbmNlKCJhdXRvbWF0Y2hwYXJlbnMiLCAnMCcpOwoKCiR0aGlzLT5SZWRpcmVjdCgkaWQsICdkZWZhdWx0YWRtaW4nLCAkcmV0dXJuaWQsYXJyYXkoIm1vZHVsZV9tZXNzYWdlIj0+JHRoaXMtPkxhbmcoInNldHRpbmdzc2F2ZWQiKSwidGFiIj0+InNldHRpbmdzIikpOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/codemirror.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IC5Db2RlTWlycm9yLWxpbmUtbnVtYmVycyB7CiAgIHdpZHRoOiAyLjJlbTsKICAgY29sb3I6ICNhYWE7CiAgIGJhY2tncm91bmQtY29sb3I6ICNlZWU7CiAgIHRleHQtYWxpZ246IHJpZ2h0OwogICBwYWRkaW5nLXJpZ2h0OiAuM2VtOwogICBmb250LXNpemU6IDEwcHQ7CiAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgIHBhZGRpbmctdG9wOiAuNGVtOwogfQoK]]></data>
	</file>
	<file>
	  <filename>/CodeMirror.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiNDTVMgLSBDTVMgTWFkZSBTaW1wbGUNCiMoYykyMDA1LTA2IGJ5IE1vcnRlbiBQb3Vsc2VuIChtb3J0ZW5AcG91bHNlbi5vcmcpDQojVGhpcyBwcm9qZWN0J3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcNCiMNCiNUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQ0KI2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5DQojdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCiMoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KIw0KI1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KI2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQojTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KI0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQojWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiNhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQ0KI0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0ENCg0KDQpjbGFzcyBDb2RlTWlycm9yIGV4dGVuZHMgQ01TTW9kdWxlIHsNCgl2YXIgJG5vZWRpdG9ycz0wOw0KCXZhciAkaGVhZGVyaW5mb3NlbnQ9ZmFsc2U7DQoNCglmdW5jdGlvbiBHZXROYW1lKCkgew0KCQlyZXR1cm4gJ0NvZGVNaXJyb3InOw0KCX0NCg0KCWZ1bmN0aW9uIElzUGx1Z2luTW9kdWxlKCkgew0KCQlyZXR1cm4gZmFsc2U7DQoJfQ0KDQoJZnVuY3Rpb24gSGFzQWRtaW4oKSB7DQoJCXJldHVybiB0cnVlOw0KCX0NCg0KCWZ1bmN0aW9uIEdldEhlbHAoKSB7DQoJCXJldHVybiAkdGhpcy0+TGFuZygiaGVscCIpOw0KCX0NCg0KCWZ1bmN0aW9uIEdldEF1dGhvcigpIHsNCgkJcmV0dXJuICdNb3J0ZW4gUG91bHNlbic7DQoJfQ0KDQoJZnVuY3Rpb24gR2V0QXV0aG9yRW1haWwoKSB7DQoJCXJldHVybiAnJmx0O21vcnRlbkBwb3Vsc2VuLm9yZyZndDsnOw0KCX0NCg0KCWZ1bmN0aW9uIEdldENoYW5nZUxvZygpIHsNCgkJcmV0dXJuICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ2NoYW5nZWxvZy50cGwnKTsNCgl9DQoNCglmdW5jdGlvbiBHZXRWZXJzaW9uKCkgew0KCQlyZXR1cm4gJzAuMS42JzsNCgl9DQoJDQoJZnVuY3Rpb24gTWluaW11bUNNU1ZlcnNpb24oKSB7DQoJCXJldHVybiAiMS44IjsNCgl9DQoNCiAgZnVuY3Rpb24gSGFzQ2FwYWJpbGl0eSgkY2FwYWJpbGl0eSwgJHBhcmFtcz1hcnJheSgpKSB7DQogICAgaWYgKCRjYXBhYmlsaXR5PT0id3lzaXd5ZyIpIHJldHVybiB0cnVlOw0KICAgIGlmICgkY2FwYWJpbGl0eT09InN5bnRheGhpZ2hsaWdodGluZyIpIHJldHVybiB0cnVlOw0KICAgIHJldHVybiBmYWxzZTsNCiAgfQ0KDQoJZnVuY3Rpb24gSXNXWVNJV1lHKCkgew0KCQlyZXR1cm4gdHJ1ZTsNCgl9DQoNCglmdW5jdGlvbiBJc1N5bnRheEhpZ2hsaWdodGVyKCkgew0KCQlyZXR1cm4gdHJ1ZTsNCgl9DQoNCglmdW5jdGlvbiBWaXNpYmxlVG9BZG1pblVzZXIoKSB7DQoJCXJldHVybiAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgU2l0ZSBQcmVmZXJlbmNlcycpOw0KCX0NCg0KCWZ1bmN0aW9uIFN5bnRheFBhZ2VGb3JtU3VibWl0KCkgew0KCQlyZXR1cm4gImZvciAodmFyIGNudEVkaXRvciA9IDA7IGNudEVkaXRvciA8IG51bUNvZGVQcmVzc0FyZWFzOyBjbnRFZGl0b3IrKykge1xuIg0KCQkuICJcdFx0dmFyIGlkID0gZXZhbCgnY29kZXByZXNzJyArIGNudEVkaXRvcik7XG4iDQoJCS4gIlx0XHRpZC50ZXh0YXJlYS52YWx1ZSA9IGlkLmdldENvZGUoKTtcbiINCgkJLiAiXHR9XG4iOw0KCX0NCgkNCglmdW5jdGlvbiBXWVNJV1lHUGFnZUZvcm1TdWJtaXQoKSB7DQoJCXJldHVybiAkdGhpcy0+U3ludGF4UGFnZUZvcm1TdWJtaXQoKTsNCgl9DQoNCglmdW5jdGlvbiBXWVNJV1lHVGV4dEFyZWEoJG5hbWU9J3RleHRhcmVhJywkY29sdW1ucz0nODAnLCRyb3dzPScxNScsJGVuY29kaW5nPScnLCRjb250ZW50PScnLCRzdHlsZXNoZWV0PScnKSB7DQoJCSR0aGlzLT53eXNpd3lnYWN0aXZlPXRydWU7DQoJCXJldHVybiAkdGhpcy0+U3ludGF4VGV4dGFyZWEoJG5hbWUsImh0bWwiLCRjb2x1bW5zLCRyb3dzLCRlbmNvZGluZywkY29udGVudCk7DQoJfQ0KDQoJZnVuY3Rpb24gU3ludGF4VGV4dGFyZWEoJG5hbWU9J3RleHRhcmVhJywkc3ludGF4PSJodG1sIiwkY29sdW1ucz0nODAnLCRyb3dzPScxNScsJGVuY29kaW5nPScnLCRjb250ZW50PScnKSB7CSAgDQoJCSR0ZXh0YXJlYT0iIjsNCgkJJHRoaXMtPnN5bnRheGFjdGl2ZT10cnVlOwkNCgkJLyppZiAoJHRoaXMtPkdldFByZWZlcmVuY2UoInVzZWF1dG9jb21wbGV0ZSIsIjEiKT09IjAiKSAkY2xhc3MuPSIgYXV0b2NvbXBsZXRlLW9mZiI7DQoJCWlmICgkdGhpcy0+R2V0UHJlZmVyZW5jZSgic2hvd2xpbmVudW1iZXJzIiwiMSIpPT0iMCIpICRjbGFzcy49IiBsaW5lbnVtYmVycy1vZmYiOw0KCQkqLw0KICAgICAgLyppZiAoJHRoaXMtPkdldFByZWZlcmVuY2UoInNob3d0b2dnbGVzeW50YXgiLCIxIik9PSIxIikgew0KICAgICANCgkJCSR0ZXh0YXJlYS49Ijxici8+PGlucHV0IHR5cGU9J2NoZWNrYm94JyBjaGVja2VkPScxJyBvbmNsaWNrPSdjb2RlcHJlc3MiLiR0aGlzLT5ub2VkaXRvcnMuIi50b2dnbGVFZGl0b3IoKTsnIGNoZWNrZWQ9J2NoZWNrZWQnIGlkPSdjb2RlcHJlc3NjaGVjayIuJHRoaXMtPm5vZWRpdG9ycy4iJz48bGFiZWwgZm9yPSdjb2RlcHJlc3NjaGVjayIuJHRoaXMtPm5vZWRpdG9ycy4iJz4iLiR0aGlzLT5MYW5nKCJ0b2dnbGVzeW50YXgiKS4iPC9sYWJlbD4iOw0KCQl9Ki8NCiAgICBpZiAoJHRoaXMtPkdldFByZWZlcmVuY2UoInNob3dsaW5lbnVtYmVycyIsIjEiKT09IjEiKXsNCiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignbGluZW51bWJlcnMnLCAidHJ1ZSIpOw0KICAgIH0gZWxzZSB7DQogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2xpbmVudW1iZXJzJywgImZhbHNlIik7DQogICAgfQ0KICAgIGlmICgkdGhpcy0+R2V0UHJlZmVyZW5jZSgidGV4dHdyYXBwaW5nIiwiMSIpPT0iMSIpew0KICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0ZXh0d3JhcHBpbmcnLCAidHJ1ZSIpOw0KICAgIH0gZWxzZSB7DQogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RleHR3cmFwcGluZycsICJmYWxzZSIpOw0KICAgIH0NCiAgICBpZiAoJHRoaXMtPkdldFByZWZlcmVuY2UoImF1dG9tYXRjaHBhcmVucyIsIjAiKT09IjEiKXsNCiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignYXV0b21hdGNocGFyZW5zJywgInRydWUiKTsNCiAgICB9IGVsc2Ugew0KICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdhdXRvbWF0Y2hwYXJlbnMnLCAiZmFsc2UiKTsNCiAgICB9DQogICAgLy9saW5lTnVtYmVyczogdHJ1ZSwNCiAgICAkY29uZmlnPSR0aGlzLT5HZXRDb25maWcoKTsNCg0KICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigndGV4dGFyZWFpZCcsICJjb2RlbWlycm9yYXJlYSIuJHRoaXMtPm5vZWRpdG9ycyk7DQogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0ZXh0YXJlYW5hbWUnLCAkbmFtZSk7DQogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdjb250ZW50JywgJGNvbnRlbnQpOw0KICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaWQnLCAkdGhpcy0+bm9lZGl0b3JzKTsNCiAgICAkcGFyc2VyZmlsZT0iIjsgJGNzc2ZpbGU9IiI7DQogICAgJGNtZGlyPSRjb25maWdbInJvb3RfdXJsIl0uJy9tb2R1bGVzL0NvZGVNaXJyb3IvY29kZW1pcnJvcic7DQogICAgc3dpdGNoKCRzeW50YXgpIHsNCiAgICAgIA0KICAgICAgY2FzZSAiaHRtbCIgOiANCiAgICAgICAgJHBhcnNlcmZpbGU9JyJwYXJzZXhtbC5qcyInOyANCiAgICAgICAgJGNzc2ZpbGU9JyInLiRjbWRpci4nL2Nzcy94bWxjb2xvcnMuY3NzIic7DQogICAgICAgIGJyZWFrOw0KICAgICAgY2FzZSAiY3NzIiA6DQogICAgICAgICRwYXJzZXJmaWxlPScicGFyc2Vjc3MuanMiJzsNCiAgICAgICAgJGNzc2ZpbGU9JyInLiRjbWRpci4nL2Nzcy9jc3Njb2xvcnMuY3NzIic7DQogICAgICAgIGJyZWFrOw0KICAgICAgY2FzZSAiamF2YXNjcmlwdCIgOg0KICAgICAgY2FzZSAianMiIDoNCiAgICAgICAgJHBhcnNlcmZpbGU9J1sidG9rZW5pemVqYXZhc2NyaXB0LmpzIiwgInBhcnNlamF2YXNjcmlwdC5qcyJdJzsNCiAgICAgICAgJGNzc2ZpbGU9JyInLiRjbWRpci4nL2Nzcy9qc2NvbG9ycy5jc3MiJzsNCiAgICAgICAgYnJlYWs7DQogICAgICBjYXNlICJwaHAiIDoNCiAgICAgICAgJHBhcnNlcmZpbGU9J1sicGFyc2V4bWwuanMiLCAicGFyc2Vjc3MuanMiLCAidG9rZW5pemVqYXZhc2NyaXB0LmpzIiwgInBhcnNlamF2YXNjcmlwdC5qcyIsICJwYXJzZWh0bWxtaXhlZC5qcyIsIi4uL2NvbnRyaWIvcGhwL2pzL3Rva2VuaXplcGhwLmpzIiwgIi4uL2NvbnRyaWIvcGhwL2pzL3BhcnNlcGhwLmpzIiwgICAgICAgICAgICAgICAgICAgICAiLi4vY29udHJpYi9waHAvanMvcGFyc2VwaHBodG1sbWl4ZWQuanMiXSc7DQogICAgICAgICRjc3NmaWxlPSdbIicuJGNtZGlyLicvY3NzL3htbGNvbG9ycy5jc3MiLCInLiRjbWRpci4nL2Nzcy9qc2NvbG9ycy5jc3MiLCInLiRjbWRpci4nL2Nzcy9jc3Njb2xvcnMuY3NzIiwiJy4kY21kaXIuJy9jb250cmliL3BocC9jc3MvcGhwY29sb3JzLmNzcyJdJzsNCiAgICAgICAgYnJlYWs7DQogICAgfQ0KICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncGFyc2VyZmlsZScsICRwYXJzZXJmaWxlKTsNCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2Nzc2ZpbGUnLCAkY3NzZmlsZSk7DQogICAgDQogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdyb290X3VybCcsICRjb25maWdbInJvb3RfdXJsIl0pOw0KDQoNCiAgICAkdGV4dGFyZWE9JHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnY29kZW1pcnJvcmFyZWEudHBsJyk7DQoNCgkJJHRoaXMtPm5vZWRpdG9ycysrOw0KDQoJCXJldHVybiAkdGV4dGFyZWE7DQoJfQ0KDQoJZnVuY3Rpb24gV1lTSVdZR0dlbmVyYXRlSGVhZGVyKCRodG1scmVzdWx0PScnKSB7DQoJCXJldHVybiAkdGhpcy0+U3ludGF4R2VuZXJhdGVIZWFkZXIoKTsNCgl9DQoNCglmdW5jdGlvbiBTeW50YXhHZW5lcmF0ZUhlYWRlcigkaHRtbHJlc3VsdD0nJykgew0KCQlpZiAoJHRoaXMtPmhlYWRlcmluZm9zZW50KSByZXR1cm4gIiI7DQoJCWlmICgkdGhpcy0+bm9lZGl0b3JzPT0wKSByZXR1cm4gJyc7DQoJCS8vJEdMT0JBTFNbImNvbmZpZyJdWyJyb290X3BhdGgiXS4NCg0KCQkkc2NyaXB0cGF0aD0kR0xPQkFMU1siY29uZmlnIl1bInJvb3RfdXJsIl0uIi9tb2R1bGVzL0NvZGVNaXJyb3IvY29kZW1pcnJvci9qcy9jb2RlbWlycm9yLmpzIjsNCgkJJGhlYWRlcj0iIjsNCgkJJGhlYWRlci49JzxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFzY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSInLiRzY3JpcHRwYXRoLiciPjwvc2NyaXB0Pic7DQogICAgJGhlYWRlci49JzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IicuJEdMT0JBTFNbImNvbmZpZyJdWyJyb290X3VybCJdLicvbW9kdWxlcy9Db2RlTWlycm9yL2NvZGVtaXJyb3IuY3NzIi8+JzsNCgkJJHRoaXMtPmhlYWRlcmluZm9zZW50PXRydWU7DQoJCXJldHVybiAkaGVhZGVyOw0KCX0NCn0NCg0KPz4=]]></data>
	</file>
	<file>
	  <filename>/codemirror/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/bigtest.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHNjcmlwdCBzcmM9ImpzL2NvZGVtaXJyb3IuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgICA8dGl0bGU+Q29kZU1pcnJvcjogSmF2YVNjcmlwdCBkZW1vbnN0cmF0aW9uPC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImNzcy9kb2NzLmNzcyIvPgogIDwvaGVhZD4KICA8Ym9keSBzdHlsZT0icGFkZGluZzogMjBweDsiPgoKPHA+VGhpcyBwYWdlIGRlbW9uc3RyYXRlcyA8YSBocmVmPSJpbmRleC5odG1sIj5Db2RlTWlycm9yPC9hPidzCkphdmFTY3JpcHQgcGFyc2VyLiBOb3RlIHRoYXQgdGhlIHVnbHkgYnV0dG9ucyBhdCB0aGUgdG9wIGFyZSBub3QgYXJlCm5vdCBwYXJ0IG9mIENvZGVNaXJyb3IgcHJvcGVyIC0tIHRoZXkgZGVtb25zdHJhdGUgdGhlIHdheSBpdCBjYW4gYmUKZW1iZWRkZWQgaW4gYSB3ZWItYXBwbGljYXRpb24uPC9wPgoKPGRpdiBjbGFzcz0iYm9yZGVyIj4KPHRleHRhcmVhIGlkPSJjb2RlIiBjb2xzPSIxMjAiIHJvd3M9IjMwIj4KLyogVGhlIEVkaXRvciBvYmplY3QgbWFuYWdlcyB0aGUgY29udGVudCBvZiB0aGUgZWRpdGFibGUgZnJhbWUuIEl0CiAqIGNhdGNoZXMgZXZlbnRzLCBjb2xvdXJzIG5vZGVzLCBhbmQgaW5kZW50cyBsaW5lcy4gVGhpcyBmaWxlIGFsc28KICogaG9sZHMgc29tZSBmdW5jdGlvbnMgZm9yIHRyYW5zZm9ybWluZyBhcmJpdHJhcnkgRE9NIHN0cnVjdHVyZXMgaW50bwogKiBwbGFpbiBzZXF1ZW5jZXMgb2YgJmx0O3NwYW4+IGFuZCAmbHQ7YnI+IGVsZW1lbnRzCiAqLwoKLy8gTWFrZSBzdXJlIGEgc3RyaW5nIGRvZXMgbm90IGNvbnRhaW4gdHdvIGNvbnNlY3V0aXZlICdjb2xsYXBzZWFibGUnCi8vIHdoaXRlc3BhY2UgY2hhcmFjdGVycy4KZnVuY3Rpb24gbWFrZVdoaXRlU3BhY2UobikgewogIHZhciBidWZmZXIgPSBbXSwgbmIgPSB0cnVlOwogIGZvciAoOyBuID4gMDsgbi0tKSB7CiAgICBidWZmZXIucHVzaCgobmIgfHwgbiA9PSAxKSA/IG5ic3AgOiAiICIpOwogICAgbmIgPSAhbmI7CiAgfQogIHJldHVybiBidWZmZXIuam9pbigiIik7Cn0KCi8vIENyZWF0ZSBhIHNldCBvZiB3aGl0ZS1zcGFjZSBjaGFyYWN0ZXJzIHRoYXQgd2lsbCBub3QgYmUgY29sbGFwc2VkCi8vIGJ5IHRoZSBicm93c2VyLCBidXQgd2lsbCBub3QgYnJlYWsgdGV4dC13cmFwcGluZyBlaXRoZXIuCmZ1bmN0aW9uIGZpeFNwYWNlcyhzdHJpbmcpIHsKICBpZiAoc3RyaW5nLmNoYXJBdCgwKSA9PSAiICIpIHN0cmluZyA9IG5ic3AgKyBzdHJpbmcuc2xpY2UoMSk7CiAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9bXHQgXHUwMGEwXXsyLH0vZywgZnVuY3Rpb24ocykge3JldHVybiBtYWtlV2hpdGVTcGFjZShzLmxlbmd0aCk7fSk7Cn0KCmZ1bmN0aW9uIGNsZWFuVGV4dCh0ZXh0KSB7CiAgcmV0dXJuIHRleHQucmVwbGFjZSgvXHUwMGEwL2csICIgIikucmVwbGFjZSgvXHUyMDBiL2csICIiKTsKfQoKLy8gQ3JlYXRlIGEgU1BBTiBub2RlIHdpdGggdGhlIGV4cGVjdGVkIHByb3BlcnRpZXMgZm9yIGRvY3VtZW50IHBhcnQKLy8gc3BhbnMuCmZ1bmN0aW9uIG1ha2VQYXJ0U3Bhbih2YWx1ZSwgZG9jKSB7CiAgdmFyIHRleHQgPSB2YWx1ZTsKICBpZiAodmFsdWUubm9kZVR5cGUgPT0gMykgdGV4dCA9IHZhbHVlLm5vZGVWYWx1ZTsKICBlbHNlIHZhbHVlID0gZG9jLmNyZWF0ZVRleHROb2RlKHRleHQpOwoKICB2YXIgc3BhbiA9IGRvYy5jcmVhdGVFbGVtZW50KCJTUEFOIik7CiAgc3Bhbi5pc1BhcnQgPSB0cnVlOwogIHNwYW4uYXBwZW5kQ2hpbGQodmFsdWUpOwogIHNwYW4uY3VycmVudFRleHQgPSB0ZXh0OwogIHJldHVybiBzcGFuOwp9CgovLyBPbiB3ZWJraXQsIHdoZW4gdGhlIGxhc3QgQlIgb2YgdGhlIGRvY3VtZW50IGRvZXMgbm90IGhhdmUgdGV4dAovLyBiZWhpbmQgaXQsIHRoZSBjdXJzb3IgY2FuIG5vdCBiZSBwdXQgb24gdGhlIGxpbmUgYWZ0ZXIgaXQuIFRoaXMKLy8gbWFrZXMgcHJlc3NpbmcgZW50ZXIgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQgb2NjYXNpb25hbGx5IGRvCi8vIG5vdGhpbmcgKG9yIGF0IGxlYXN0IHNlZW0gdG8gZG8gbm90aGluZykuIFRvIHdvcmsgYXJvdW5kIGl0LCB0aGlzCi8vIGZ1bmN0aW9uIG1ha2VzIHN1cmUgdGhlIGRvY3VtZW50IGVuZHMgd2l0aCBhIHNwYW4gY29udGFpbmluZyBhCi8vIHplcm8td2lkdGggc3BhY2UgY2hhcmFjdGVyLiBUaGUgdHJhdmVyc2VET00gaXRlcmF0b3IgZmlsdGVycyBzdWNoCi8vIGNoYXJhY3RlciBvdXQgYWdhaW4sIHNvIHRoYXQgdGhlIHBhcnNlcnMgd29uJ3Qgc2VlIHRoZW0uIFRoaXMKLy8gZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gYSBmZXcgc3RyYXRlZ2ljIHBsYWNlcyB0byBtYWtlIHN1cmUgdGhlCi8vIHp3c3AgaXMgcmVzdG9yZWQgYWZ0ZXIgdGhlIGhpZ2hsaWdodGluZyBwcm9jZXNzIGVhdHMgaXQuCnZhciB3ZWJraXRMYXN0TGluZUhhY2sgPSB3ZWJraXQgPwogIGZ1bmN0aW9uKGNvbnRhaW5lcikgewogICAgdmFyIGxhc3QgPSBjb250YWluZXIubGFzdENoaWxkOwogICAgaWYgKCFsYXN0IHx8ICFsYXN0LmlzUGFydCB8fCBsYXN0LnRleHRDb250ZW50ICE9ICJcdTIwMGIiKQogICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQobWFrZVBhcnRTcGFuKCJcdTIwMGIiLCBjb250YWluZXIub3duZXJEb2N1bWVudCkpOwogIH0gOiBmdW5jdGlvbigpIHt9OwoKdmFyIEVkaXRvciA9IChmdW5jdGlvbigpewogIC8vIFRoZSBIVE1MIGVsZW1lbnRzIHdob3NlIGNvbnRlbnQgc2hvdWxkIGJlIHN1ZmZpeGVkIGJ5IGEgbmV3bGluZQogIC8vIHdoZW4gY29udmVydGluZyB0aGVtIHRvIGZsYXQgdGV4dC4KICB2YXIgbmV3bGluZUVsZW1lbnRzID0geyJQIjogdHJ1ZSwgIkRJViI6IHRydWUsICJMSSI6IHRydWV9OwoKICBmdW5jdGlvbiBhc0VkaXRvckxpbmVzKHN0cmluZykgewogICAgcmV0dXJuIGZpeFNwYWNlcyhzdHJpbmcucmVwbGFjZSgvXHQvZywgIiAgIikucmVwbGFjZSgvXHUwMGEwL2csICIgIikpLnJlcGxhY2UoL1xyXG4/L2csICJcbiIpLnNwbGl0KCJcbiIpOwogIH0KCiAgLy8gSGVscGVyIGZ1bmN0aW9uIGZvciB0cmF2ZXJzZURPTS4gRmxhdHRlbnMgYW4gYXJiaXRyYXJ5IERPTSBub2RlCiAgLy8gaW50byBhbiBhcnJheSBvZiB0ZXh0bm9kZXMgYW5kICZsdDticj4gdGFncy4KICBmdW5jdGlvbiBzaW1wbGlmeURPTShyb290KSB7CiAgICB2YXIgZG9jID0gcm9vdC5vd25lckRvY3VtZW50OwogICAgdmFyIHJlc3VsdCA9IFtdOwogICAgdmFyIGxlYXZpbmcgPSB0cnVlOwoKICAgIGZ1bmN0aW9uIHNpbXBsaWZ5Tm9kZShub2RlKSB7CiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDMpIHsKICAgICAgICB2YXIgdGV4dCA9IG5vZGUubm9kZVZhbHVlID0gZml4U3BhY2VzKG5vZGUubm9kZVZhbHVlLnJlcGxhY2UoL1tcclx1MjAwYl0vZywgIiIpLnJlcGxhY2UoL1xuL2csICIgIikpOwogICAgICAgIGlmICh0ZXh0Lmxlbmd0aCkgbGVhdmluZyA9IGZhbHNlOwogICAgICAgIHJlc3VsdC5wdXNoKG5vZGUpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKG5vZGUubm9kZU5hbWUgPT0gIkJSIiAmYW1wOyZhbXA7IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGggPT0gMCkgewogICAgICAgIGxlYXZpbmcgPSB0cnVlOwogICAgICAgIHJlc3VsdC5wdXNoKG5vZGUpOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIGZvckVhY2gobm9kZS5jaGlsZE5vZGVzLCBzaW1wbGlmeU5vZGUpOwogICAgICAgIGlmICghbGVhdmluZyAmYW1wOyZhbXA7IG5ld2xpbmVFbGVtZW50cy5oYXNPd25Qcm9wZXJ0eShub2RlLm5vZGVOYW1lKSkgewogICAgICAgICAgbGVhdmluZyA9IHRydWU7CiAgICAgICAgICByZXN1bHQucHVzaChkb2MuY3JlYXRlRWxlbWVudCgiQlIiKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgc2ltcGxpZnlOb2RlKHJvb3QpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vIENyZWF0ZXMgYSBNb2NoaUtpdC1zdHlsZSBpdGVyYXRvciB0aGF0IGdvZXMgb3ZlciBhIHNlcmllcyBvZiBET00KICAvLyBub2Rlcy4gVGhlIHZhbHVlcyBpdCB5aWVsZHMgYXJlIHN0cmluZ3MsIHRoZSB0ZXh0dWFsIGNvbnRlbnQgb2YKICAvLyB0aGUgbm9kZXMuIEl0IG1ha2VzIHN1cmUgdGhhdCBhbGwgbm9kZXMgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUKICAvLyBvbmUgd2hvc2UgdGV4dCBpcyBiZWluZyB5aWVsZGVkIGhhdmUgYmVlbiAnbm9ybWFsaXplZCcgdG8gYmUganVzdAogIC8vICZsdDtzcGFuPiBhbmQgJmx0O2JyPiBlbGVtZW50cy4KICAvLyBTZWUgdGhlIHN0b3J5Lmh0bWwgZmlsZSBmb3Igc29tZSBzaG9ydCByZW1hcmtzIGFib3V0IHRoZSB1c2Ugb2YKICAvLyBjb250aW51YXRpb24tcGFzc2luZyBzdHlsZSBpbiB0aGlzIGl0ZXJhdG9yLgogIGZ1bmN0aW9uIHRyYXZlcnNlRE9NKHN0YXJ0KXsKICAgIGZ1bmN0aW9uIHlpZWxkKHZhbHVlLCBjKXtjYyA9IGM7IHJldHVybiB2YWx1ZTt9CiAgICBmdW5jdGlvbiBwdXNoKGZ1biwgYXJnLCBjKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZnVuKGFyZywgYyk7fTt9CiAgICBmdW5jdGlvbiBzdG9wKCl7Y2MgPSBzdG9wOyB0aHJvdyBTdG9wSXRlcmF0aW9uO307CiAgICB2YXIgY2MgPSBwdXNoKHNjYW5Ob2RlLCBzdGFydCwgc3RvcCk7CiAgICB2YXIgb3duZXIgPSBzdGFydC5vd25lckRvY3VtZW50OwogICAgdmFyIG5vZGVRdWV1ZSA9IFtdOwoKICAgIC8vIENyZWF0ZSBhIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW5zZXJ0IG5vZGVzIGFmdGVyIHRoZQogICAgLy8gb25lIGdpdmVuIGFzIGFyZ3VtZW50LgogICAgZnVuY3Rpb24gcG9pbnRBdChub2RlKXsKICAgICAgdmFyIHBhcmVudCA9IG5vZGUucGFyZW50Tm9kZTsKICAgICAgdmFyIG5leHQgPSBub2RlLm5leHRTaWJsaW5nOwogICAgICByZXR1cm4gZnVuY3Rpb24obmV3bm9kZSkgewogICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUobmV3bm9kZSwgbmV4dCk7CiAgICAgIH07CiAgICB9CiAgICB2YXIgcG9pbnQgPSBudWxsOwoKICAgIC8vIEluc2VydCBhIG5vcm1hbGl6ZWQgbm9kZSBhdCB0aGUgY3VycmVudCBwb2ludC4gSWYgaXQgaXMgYSB0ZXh0CiAgICAvLyBub2RlLCB3cmFwIGl0IGluIGEgJmx0O3NwYW4+LCBhbmQgZ2l2ZSB0aGF0IHNwYW4gYSBjdXJyZW50VGV4dAogICAgLy8gcHJvcGVydHkgLS0gdGhpcyBpcyB1c2VkIHRvIGNhY2hlIHRoZSBub2RlVmFsdWUsIGJlY2F1c2UKICAgIC8vIGRpcmVjdGx5IGFjY2Vzc2luZyBub2RlVmFsdWUgaXMgaG9ycmlibHkgc2xvdyBvbiBzb21lIGJyb3dzZXJzLgogICAgLy8gVGhlIGRpcnR5IHByb3BlcnR5IGlzIHVzZWQgYnkgdGhlIGhpZ2hsaWdodGVyIHRvIGRldGVybWluZQogICAgLy8gd2hpY2ggcGFydHMgb2YgdGhlIGRvY3VtZW50IGhhdmUgdG8gYmUgcmUtaGlnaGxpZ2h0ZWQuCiAgICBmdW5jdGlvbiBpbnNlcnRQYXJ0KHBhcnQpewogICAgICB2YXIgdGV4dCA9ICJcbiI7CiAgICAgIGlmIChwYXJ0Lm5vZGVUeXBlID09IDMpIHsKICAgICAgICBzZWxlY3Quc25hcHNob3RDaGFuZ2VkKCk7CiAgICAgICAgcGFydCA9IG1ha2VQYXJ0U3BhbihwYXJ0LCBvd25lcik7CiAgICAgICAgdGV4dCA9IHBhcnQuY3VycmVudFRleHQ7CiAgICAgIH0KICAgICAgcGFydC5kaXJ0eSA9IHRydWU7CiAgICAgIG5vZGVRdWV1ZS5wdXNoKHBhcnQpOwogICAgICBwb2ludChwYXJ0KTsKICAgICAgcmV0dXJuIHRleHQ7CiAgICB9CgogICAgLy8gRXh0cmFjdCB0aGUgdGV4dCBhbmQgbmV3bGluZXMgZnJvbSBhIERPTSBub2RlLCBpbnNlcnQgdGhlbSBpbnRvCiAgICAvLyB0aGUgZG9jdW1lbnQsIGFuZCB5aWVsZCB0aGUgdGV4dHVhbCBjb250ZW50LiBVc2VkIHRvIHJlcGxhY2UKICAgIC8vIG5vbi1ub3JtYWxpemVkIG5vZGVzLgogICAgZnVuY3Rpb24gd3JpdGVOb2RlKG5vZGUsIGMpewogICAgICB2YXIgdG9ZaWVsZCA9IFtdOwogICAgICBmb3JFYWNoKHNpbXBsaWZ5RE9NKG5vZGUpLCBmdW5jdGlvbihwYXJ0KSB7CiAgICAgICAgdG9ZaWVsZC5wdXNoKGluc2VydFBhcnQocGFydCkpOwogICAgICB9KTsKICAgICAgcmV0dXJuIHlpZWxkKHRvWWllbGQuam9pbigiIiksIGMpOwogICAgfQoKICAgIC8vIENoZWNrIHdoZXRoZXIgYSBub2RlIGlzIGEgbm9ybWFsaXplZCAmbHQ7c3Bhbj4gZWxlbWVudC4KICAgIGZ1bmN0aW9uIHBhcnROb2RlKG5vZGUpewogICAgICBpZiAobm9kZS5pc1BhcnQgJmFtcDsmYW1wOyBub2RlLmNoaWxkTm9kZXMubGVuZ3RoID09IDEgJmFtcDsmYW1wOyBub2RlLmZpcnN0Q2hpbGQubm9kZVR5cGUgPT0gMykgewogICAgICAgIG5vZGUuY3VycmVudFRleHQgPSBub2RlLmZpcnN0Q2hpbGQubm9kZVZhbHVlOwogICAgICAgIHJldHVybiAhL1tcblx0XHJdLy50ZXN0KG5vZGUuY3VycmVudFRleHQpOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLyBIYW5kbGUgYSBub2RlLiBBZGQgaXRzIHN1Y2Nlc3NvciB0byB0aGUgY29udGludWF0aW9uIGlmIHRoZXJlCiAgICAvLyBpcyBvbmUsIGZpbmQgb3V0IHdoZXRoZXIgdGhlIG5vZGUgaXMgbm9ybWFsaXplZC4gSWYgaXQgaXMsCiAgICAvLyB5aWVsZCBpdHMgY29udGVudCwgb3RoZXJ3aXNlLCBub3JtYWxpemUgaXQgKHdyaXRlTm9kZSB3aWxsIHRha2UKICAgIC8vIGNhcmUgb2YgeWllbGRpbmcpLgogICAgZnVuY3Rpb24gc2Nhbk5vZGUobm9kZSwgYyl7CiAgICAgIGlmIChub2RlLm5leHRTaWJsaW5nKQogICAgICAgIGMgPSBwdXNoKHNjYW5Ob2RlLCBub2RlLm5leHRTaWJsaW5nLCBjKTsKCiAgICAgIGlmIChwYXJ0Tm9kZShub2RlKSl7CiAgICAgICAgbm9kZVF1ZXVlLnB1c2gobm9kZSk7CiAgICAgICAgcmV0dXJuIHlpZWxkKG5vZGUuY3VycmVudFRleHQsIGMpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKG5vZGUubm9kZU5hbWUgPT0gIkJSIikgewogICAgICAgIG5vZGVRdWV1ZS5wdXNoKG5vZGUpOwogICAgICAgIHJldHVybiB5aWVsZCgiXG4iLCBjKTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBwb2ludCA9IHBvaW50QXQobm9kZSk7CiAgICAgICAgcmVtb3ZlRWxlbWVudChub2RlKTsKICAgICAgICByZXR1cm4gd3JpdGVOb2RlKG5vZGUsIGMpOwogICAgICB9CiAgICB9CgogICAgLy8gTW9jaGlLaXQgaXRlcmF0b3JzIGFyZSBvYmplY3RzIHdpdGggYSBuZXh0IGZ1bmN0aW9uIHRoYXQKICAgIC8vIHJldHVybnMgdGhlIG5leHQgdmFsdWUgb3IgdGhyb3dzIFN0b3BJdGVyYXRpb24gd2hlbiB0aGVyZSBhcmUKICAgIC8vIG5vIG1vcmUgdmFsdWVzLgogICAgcmV0dXJuIHtuZXh0OiBmdW5jdGlvbigpe3JldHVybiBjYygpO30sIG5vZGVzOiBub2RlUXVldWV9OwogIH0KCiAgLy8gRGV0ZXJtaW5lIHRoZSB0ZXh0IHNpemUgb2YgYSBwcm9jZXNzZWQgbm9kZS4KICBmdW5jdGlvbiBub2RlU2l6ZShub2RlKSB7CiAgICBpZiAobm9kZS5ub2RlTmFtZSA9PSAiQlIiKQogICAgICByZXR1cm4gMTsKICAgIGVsc2UKICAgICAgcmV0dXJuIG5vZGUuY3VycmVudFRleHQubGVuZ3RoOwogIH0KCiAgLy8gU2VhcmNoIGJhY2t3YXJkcyB0aHJvdWdoIHRoZSB0b3AtbGV2ZWwgbm9kZXMgdW50aWwgdGhlIG5leHQgQlIgb3IKICAvLyB0aGUgc3RhcnQgb2YgdGhlIGZyYW1lLgogIGZ1bmN0aW9uIHN0YXJ0T2ZMaW5lKG5vZGUpIHsKICAgIHdoaWxlIChub2RlICZhbXA7JmFtcDsgbm9kZS5ub2RlTmFtZSAhPSAiQlIiKSBub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmc7CiAgICByZXR1cm4gbm9kZTsKICB9CiAgZnVuY3Rpb24gZW5kT2ZMaW5lKG5vZGUsIGNvbnRhaW5lcikgewogICAgaWYgKCFub2RlKSBub2RlID0gY29udGFpbmVyLmZpcnN0Q2hpbGQ7CiAgICBlbHNlIGlmIChub2RlLm5vZGVOYW1lID09ICJCUiIpIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nOwoKICAgIHdoaWxlIChub2RlICZhbXA7JmFtcDsgbm9kZS5ub2RlTmFtZSAhPSAiQlIiKSBub2RlID0gbm9kZS5uZXh0U2libGluZzsKICAgIHJldHVybiBub2RlOwogIH0KCiAgLy8gUmVwbGFjZSBhbGwgRE9NIG5vZGVzIGluIHRoZSBjdXJyZW50IHNlbGVjdGlvbiB3aXRoIG5ldyBvbmVzLgogIC8vIE5lZWRlZCB0byBwcmV2ZW50IGlzc3VlcyBpbiBJRSB3aGVyZSB0aGUgb2xkIERPTSBub2RlcyBjYW4gYmUKICAvLyBwYXN0ZWQgYmFjayBpbnRvIHRoZSBkb2N1bWVudCwgc3RpbGwgaG9sZGluZyB0aGVpciBvbGQgdW5kbwogIC8vIGluZm9ybWF0aW9uLgogIGZ1bmN0aW9uIHNjcnViUGFzdGVkKGNvbnRhaW5lciwgc3RhcnQsIHN0YXJ0MikgewogICAgdmFyIGVuZCA9IHNlbGVjdC5zZWxlY3Rpb25Ub3BOb2RlKGNvbnRhaW5lciwgdHJ1ZSksCiAgICAgICAgZG9jID0gY29udGFpbmVyLm93bmVyRG9jdW1lbnQ7CiAgICBpZiAoc3RhcnQgIT0gbnVsbCAmYW1wOyZhbXA7IHN0YXJ0LnBhcmVudE5vZGUgIT0gY29udGFpbmVyKSBzdGFydCA9IHN0YXJ0MjsKICAgIGlmIChzdGFydCA9PT0gZmFsc2UpIHN0YXJ0ID0gbnVsbDsKICAgIGlmIChzdGFydCA9PSBlbmQgfHwgIWVuZCB8fCAhY29udGFpbmVyLmZpcnN0Q2hpbGQpIHJldHVybjsKCiAgICB2YXIgY2xlYXIgPSB0cmF2ZXJzZURPTShzdGFydCA/IHN0YXJ0Lm5leHRTaWJsaW5nIDogY29udGFpbmVyLmZpcnN0Q2hpbGQpOwogICAgd2hpbGUgKGVuZC5wYXJlbnROb2RlID09IGNvbnRhaW5lcikgdHJ5e2NsZWFyLm5leHQoKTt9Y2F0Y2goZSl7YnJlYWs7fQogICAgZm9yRWFjaChjbGVhci5ub2RlcywgZnVuY3Rpb24obm9kZSkgewogICAgICB2YXIgbmV3Tm9kZSA9IG5vZGUubm9kZU5hbWUgPT0gIkJSIiA/IGRvYy5jcmVhdGVFbGVtZW50KCJCUiIpIDogbWFrZVBhcnRTcGFuKG5vZGUuY3VycmVudFRleHQsIGRvYyk7CiAgICAgIGNvbnRhaW5lci5yZXBsYWNlQ2hpbGQobmV3Tm9kZSwgbm9kZSk7CiAgICB9KTsKICB9CgogIC8vIENsaWVudCBpbnRlcmZhY2UgZm9yIHNlYXJjaGluZyB0aGUgY29udGVudCBvZiB0aGUgZWRpdG9yLiBDcmVhdGUKICAvLyB0aGVzZSBieSBjYWxsaW5nIENvZGVNaXJyb3IuZ2V0U2VhcmNoQ3Vyc29yLiBUbyB1c2UsIGNhbGwKICAvLyBmaW5kTmV4dCBvbiB0aGUgcmVzdWx0aW5nIG9iamVjdCAtLSB0aGlzIHJldHVybnMgYSBib29sZWFuCiAgLy8gaW5kaWNhdGluZyB3aGV0aGVyIGFueXRoaW5nIHdhcyBmb3VuZCwgYW5kIGNhbiBiZSBjYWxsZWQgYWdhaW4gdG8KICAvLyBza2lwIHRvIHRoZSBuZXh0IGZpbmQuIFVzZSB0aGUgc2VsZWN0IGFuZCByZXBsYWNlIG1ldGhvZHMgdG8KICAvLyBhY3R1YWxseSBkbyBzb21ldGhpbmcgd2l0aCB0aGUgZm91bmQgbG9jYXRpb25zLgogIGZ1bmN0aW9uIFNlYXJjaEN1cnNvcihlZGl0b3IsIHN0cmluZywgZnJvbUN1cnNvcikgewogICAgdGhpcy5lZGl0b3IgPSBlZGl0b3I7CiAgICB0aGlzLmhpc3RvcnkgPSBlZGl0b3IuaGlzdG9yeTsKICAgIHRoaXMuaGlzdG9yeS5jb21taXQoKTsKCiAgICAvLyBBcmUgd2UgY3VycmVudGx5IGF0IGFuIG9jY3VycmVuY2Ugb2YgdGhlIHNlYXJjaCBzdHJpbmc/CiAgICB0aGlzLmF0T2NjdXJyZW5jZSA9IGZhbHNlOwogICAgLy8gVGhlIG9iamVjdCBzdG9yZXMgYSBzZXQgb2Ygbm9kZXMgY29taW5nIGFmdGVyIGl0cyBjdXJyZW50CiAgICAvLyBwb3NpdGlvbiwgc28gdGhhdCB3aGVuIHRoZSBjdXJyZW50IHBvaW50IGlzIHRha2VuIG91dCBvZiB0aGUKICAgIC8vIERPTSB0cmVlLCB3ZSBjYW4gc3RpbGwgdHJ5IHRvIGNvbnRpbnVlLgogICAgdGhpcy5mYWxsYmFja1NpemUgPSAxNTsKICAgIHZhciBjdXJzb3I7CiAgICAvLyBTdGFydCBmcm9tIHRoZSBjdXJzb3Igd2hlbiBzcGVjaWZpZWQgYW5kIGEgY3Vyc29yIGNhbiBiZSBmb3VuZC4KICAgIGlmIChmcm9tQ3Vyc29yICZhbXA7JmFtcDsgKGN1cnNvciA9IHNlbGVjdC5jdXJzb3JQb3ModGhpcy5lZGl0b3IuY29udGFpbmVyKSkpIHsKICAgICAgdGhpcy5saW5lID0gY3Vyc29yLm5vZGU7CiAgICAgIHRoaXMub2Zmc2V0ID0gY3Vyc29yLm9mZnNldDsKICAgIH0KICAgIGVsc2UgewogICAgICB0aGlzLmxpbmUgPSBudWxsOwogICAgICB0aGlzLm9mZnNldCA9IDA7CiAgICB9CiAgICB0aGlzLnZhbGlkID0gISFzdHJpbmc7CgogICAgLy8gQ3JlYXRlIGEgbWF0Y2hlciBmdW5jdGlvbiBiYXNlZCBvbiB0aGUga2luZCBvZiBzdHJpbmcgd2UgaGF2ZS4KICAgIHZhciB0YXJnZXQgPSBzdHJpbmcuc3BsaXQoIlxuIiksIHNlbGYgPSB0aGlzOzsKICAgIHRoaXMubWF0Y2hlcyA9ICh0YXJnZXQubGVuZ3RoID09IDEpID8KICAgICAgLy8gRm9yIG9uZS1saW5lIHN0cmluZ3MsIHNlYXJjaGluZyBjYW4gYmUgZG9uZSBzaW1wbHkgYnkgY2FsbGluZwogICAgICAvLyBpbmRleE9mIG9uIHRoZSBjdXJyZW50IGxpbmUuCiAgICAgIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBtYXRjaCA9IGNsZWFuVGV4dChzZWxmLmhpc3RvcnkudGV4dEFmdGVyKHNlbGYubGluZSkuc2xpY2Uoc2VsZi5vZmZzZXQpKS5pbmRleE9mKHN0cmluZyk7CiAgICAgICAgaWYgKG1hdGNoID4gLTEpCiAgICAgICAgICByZXR1cm4ge2Zyb206IHtub2RlOiBzZWxmLmxpbmUsIG9mZnNldDogc2VsZi5vZmZzZXQgKyBtYXRjaH0sCiAgICAgICAgICAgICAgICAgIHRvOiB7bm9kZTogc2VsZi5saW5lLCBvZmZzZXQ6IHNlbGYub2Zmc2V0ICsgbWF0Y2ggKyBzdHJpbmcubGVuZ3RofX07CiAgICAgIH0gOgogICAgICAvLyBNdWx0aS1saW5lIHN0cmluZ3MgcmVxdWlyZSBpbnRlcm5hbCBpdGVyYXRpb24gb3ZlciBsaW5lcywgYW5kCiAgICAgIC8vIHNvbWUgY2x1bmt5IGNoZWNrcyB0byBtYWtlIHN1cmUgdGhlIGZpcnN0IG1hdGNoIGVuZHMgYXQgdGhlCiAgICAgIC8vIGVuZCBvZiB0aGUgbGluZSBhbmQgdGhlIGxhc3QgbWF0Y2ggc3RhcnRzIGF0IHRoZSBzdGFydC4KICAgICAgZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGZpcnN0TGluZSA9IGNsZWFuVGV4dChzZWxmLmhpc3RvcnkudGV4dEFmdGVyKHNlbGYubGluZSkuc2xpY2Uoc2VsZi5vZmZzZXQpKTsKICAgICAgICB2YXIgbWF0Y2ggPSBmaXJzdExpbmUubGFzdEluZGV4T2YodGFyZ2V0WzBdKTsKICAgICAgICBpZiAobWF0Y2ggPT0gLTEgfHwgbWF0Y2ggIT0gZmlyc3RMaW5lLmxlbmd0aCAtIHRhcmdldFswXS5sZW5ndGgpCiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgdmFyIHN0YXJ0T2Zmc2V0ID0gc2VsZi5vZmZzZXQgKyBtYXRjaDsKCiAgICAgICAgdmFyIGxpbmUgPSBzZWxmLmhpc3Rvcnkubm9kZUFmdGVyKHNlbGYubGluZSk7CiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgJmx0OyB0YXJnZXQubGVuZ3RoIC0gMTsgaSsrKSB7CiAgICAgICAgICBpZiAoY2xlYW5UZXh0KHNlbGYuaGlzdG9yeS50ZXh0QWZ0ZXIobGluZSkpICE9IHRhcmdldFtpXSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgbGluZSA9IHNlbGYuaGlzdG9yeS5ub2RlQWZ0ZXIobGluZSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoY2xlYW5UZXh0KHNlbGYuaGlzdG9yeS50ZXh0QWZ0ZXIobGluZSkpLmluZGV4T2YodGFyZ2V0W3RhcmdldC5sZW5ndGggLSAxXSkgIT0gMCkKICAgICAgICAgIHJldHVybiBmYWxzZTsKCiAgICAgICAgcmV0dXJuIHtmcm9tOiB7bm9kZTogc2VsZi5saW5lLCBvZmZzZXQ6IHN0YXJ0T2Zmc2V0fSwKICAgICAgICAgICAgICAgIHRvOiB7bm9kZTogbGluZSwgb2Zmc2V0OiB0YXJnZXRbdGFyZ2V0Lmxlbmd0aCAtIDFdLmxlbmd0aH19OwogICAgICB9OwogIH0KCiAgU2VhcmNoQ3Vyc29yLnByb3RvdHlwZSA9IHsKICAgIGZpbmROZXh0OiBmdW5jdGlvbigpIHsKICAgICAgaWYgKCF0aGlzLnZhbGlkKSByZXR1cm4gZmFsc2U7CiAgICAgIHRoaXMuYXRPY2N1cnJlbmNlID0gZmFsc2U7CiAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgIC8vIEdvIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBkb2N1bWVudCBpZiB0aGUgY3VycmVudCBsaW5lIGlzCiAgICAgIC8vIG5vIGxvbmdlciBpbiB0aGUgRE9NIHRyZWUuCiAgICAgIGlmICh0aGlzLmxpbmUgJmFtcDsmYW1wOyAhdGhpcy5saW5lLnBhcmVudE5vZGUpIHsKICAgICAgICB0aGlzLmxpbmUgPSBudWxsOwogICAgICAgIHRoaXMub2Zmc2V0ID0gMDsKICAgICAgfQoKICAgICAgLy8gU2V0IHRoZSBjdXJzb3IncyBwb3NpdGlvbiBvbmUgY2hhcmFjdGVyIGFmdGVyIHRoZSBnaXZlbgogICAgICAvLyBwb3NpdGlvbi4KICAgICAgZnVuY3Rpb24gc2F2ZUFmdGVyKHBvcykgewogICAgICAgIGlmIChzZWxmLmhpc3RvcnkudGV4dEFmdGVyKHBvcy5ub2RlKS5sZW5ndGggJmx0OyBwb3Mub2Zmc2V0KSB7CiAgICAgICAgICBzZWxmLmxpbmUgPSBwb3Mubm9kZTsKICAgICAgICAgIHNlbGYub2Zmc2V0ID0gcG9zLm9mZnNldCArIDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgc2VsZi5saW5lID0gc2VsZi5oaXN0b3J5Lm5vZGVBZnRlcihwb3Mubm9kZSk7CiAgICAgICAgICBzZWxmLm9mZnNldCA9IDA7CiAgICAgICAgfQogICAgICB9CgogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIHZhciBtYXRjaCA9IHRoaXMubWF0Y2hlcygpOwogICAgICAgIC8vIEZvdW5kIHRoZSBzZWFyY2ggc3RyaW5nLgogICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgdGhpcy5hdE9jY3VycmVuY2UgPSBtYXRjaDsKICAgICAgICAgIHNhdmVBZnRlcihtYXRjaC5mcm9tKTsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICB0aGlzLmxpbmUgPSB0aGlzLmhpc3Rvcnkubm9kZUFmdGVyKHRoaXMubGluZSk7CiAgICAgICAgdGhpcy5vZmZzZXQgPSAwOwogICAgICAgIC8vIEVuZCBvZiBkb2N1bWVudC4KICAgICAgICBpZiAoIXRoaXMubGluZSkgewogICAgICAgICAgdGhpcy52YWxpZCA9IGZhbHNlOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgfSwKCiAgICBzZWxlY3Q6IGZ1bmN0aW9uKCkgewogICAgICBpZiAodGhpcy5hdE9jY3VycmVuY2UpIHsKICAgICAgICBzZWxlY3Quc2V0Q3Vyc29yUG9zKHRoaXMuZWRpdG9yLmNvbnRhaW5lciwgdGhpcy5hdE9jY3VycmVuY2UuZnJvbSwgdGhpcy5hdE9jY3VycmVuY2UudG8pOwogICAgICAgIHNlbGVjdC5zY3JvbGxUb0N1cnNvcih0aGlzLmVkaXRvci5jb250YWluZXIpOwogICAgICB9CiAgICB9LAoKICAgIHJlcGxhY2U6IGZ1bmN0aW9uKHN0cmluZykgewogICAgICBpZiAodGhpcy5hdE9jY3VycmVuY2UpIHsKICAgICAgICB2YXIgZW5kID0gdGhpcy5lZGl0b3IucmVwbGFjZVJhbmdlKHRoaXMuYXRPY2N1cnJlbmNlLmZyb20sIHRoaXMuYXRPY2N1cnJlbmNlLnRvLCBzdHJpbmcpOwogICAgICAgIHRoaXMubGluZSA9IGVuZC5ub2RlOwogICAgICAgIHRoaXMub2Zmc2V0ID0gZW5kLm9mZnNldDsKICAgICAgICB0aGlzLmF0T2NjdXJyZW5jZSA9IGZhbHNlOwogICAgICB9CiAgICB9CiAgfTsKCiAgLy8gVGhlIEVkaXRvciBvYmplY3QgaXMgdGhlIG1haW4gaW5zaWRlLXRoZS1pZnJhbWUgaW50ZXJmYWNlLgogIGZ1bmN0aW9uIEVkaXRvcihvcHRpb25zKSB7CiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwogICAgd2luZG93LmluZGVudFVuaXQgPSBvcHRpb25zLmluZGVudFVuaXQ7CiAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKICAgIHRoaXMuZG9jID0gZG9jdW1lbnQ7CiAgICB2YXIgY29udGFpbmVyID0gdGhpcy5jb250YWluZXIgPSB0aGlzLmRvYy5ib2R5OwogICAgdGhpcy53aW4gPSB3aW5kb3c7CiAgICB0aGlzLmhpc3RvcnkgPSBuZXcgSGlzdG9yeShjb250YWluZXIsIG9wdGlvbnMudW5kb0RlcHRoLCBvcHRpb25zLnVuZG9EZWxheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIG9wdGlvbnMub25DaGFuZ2UpOwogICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgIGlmICghRWRpdG9yLlBhcnNlcikKICAgICAgdGhyb3cgIk5vIHBhcnNlciBsb2FkZWQuIjsKICAgIGlmIChvcHRpb25zLnBhcnNlckNvbmZpZyAmYW1wOyZhbXA7IEVkaXRvci5QYXJzZXIuY29uZmlndXJlKQogICAgICBFZGl0b3IuUGFyc2VyLmNvbmZpZ3VyZShvcHRpb25zLnBhcnNlckNvbmZpZyk7CgogICAgaWYgKCFvcHRpb25zLnJlYWRPbmx5KQogICAgICBzZWxlY3Quc2V0Q3Vyc29yUG9zKGNvbnRhaW5lciwge25vZGU6IG51bGwsIG9mZnNldDogMH0pOwoKICAgIHRoaXMuZGlydHkgPSBbXTsKICAgIGlmIChvcHRpb25zLmNvbnRlbnQpCiAgICAgIHRoaXMuaW1wb3J0Q29kZShvcHRpb25zLmNvbnRlbnQpOwogICAgZWxzZSAvLyBGRiBhY3RzIHdlaXJkIHdoZW4gdGhlIGVkaXRhYmxlIGRvY3VtZW50IGlzIGNvbXBsZXRlbHkgZW1wdHkKICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZG9jLmNyZWF0ZUVsZW1lbnQoIkJSIikpOwoKICAgIGlmICghb3B0aW9ucy5yZWFkT25seSkgewogICAgICBpZiAob3B0aW9ucy5jb250aW51b3VzU2Nhbm5pbmcgIT09IGZhbHNlKSB7CiAgICAgICAgdGhpcy5zY2FubmVyID0gdGhpcy5kb2N1bWVudFNjYW5uZXIob3B0aW9ucy5saW5lc1BlclBhc3MpOwogICAgICAgIHRoaXMuZGVsYXlTY2FubmluZygpOwogICAgICB9CgogICAgICBmdW5jdGlvbiBzZXRFZGl0YWJsZSgpIHsKICAgICAgICAvLyBJbiBJRSwgZGVzaWduTW9kZSBmcmFtZXMgY2FuIG5vdCBydW4gYW55IHNjcmlwdHMsIHNvIHdlIHVzZQogICAgICAgIC8vIGNvbnRlbnRFZGl0YWJsZSBpbnN0ZWFkLgogICAgICAgIGlmIChkb2N1bWVudC5ib2R5LmNvbnRlbnRFZGl0YWJsZSAhPSB1bmRlZmluZWQgJmFtcDsmYW1wOyBpbnRlcm5ldEV4cGxvcmVyKQogICAgICAgICAgZG9jdW1lbnQuYm9keS5jb250ZW50RWRpdGFibGUgPSAidHJ1ZSI7CiAgICAgICAgZWxzZQogICAgICAgICAgZG9jdW1lbnQuZGVzaWduTW9kZSA9ICJvbiI7CgogICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5ib3JkZXJXaWR0aCA9ICIwIjsKICAgICAgICBpZiAoIW9wdGlvbnMudGV4dFdyYXBwaW5nKQogICAgICAgICAgY29udGFpbmVyLnN0eWxlLndoaXRlU3BhY2UgPSAibm93cmFwIjsKICAgICAgfQoKICAgICAgLy8gSWYgc2V0dGluZyB0aGUgZnJhbWUgZWRpdGFibGUgZmFpbHMsIHRyeSBhZ2FpbiB3aGVuIHRoZSB1c2VyCiAgICAgIC8vIGZvY3VzIGl0IChoYXBwZW5zIHdoZW4gdGhlIGZyYW1lIGlzIG5vdCB2aXNpYmxlIG9uCiAgICAgIC8vIGluaXRpYWxpc2F0aW9uLCBpbiBGaXJlZm94KS4KICAgICAgdHJ5IHsKICAgICAgICBzZXRFZGl0YWJsZSgpOwogICAgICB9CiAgICAgIGNhdGNoKGUpIHsKICAgICAgICB2YXIgZm9jdXNFdmVudCA9IGFkZEV2ZW50SGFuZGxlcihkb2N1bWVudCwgImZvY3VzIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICBmb2N1c0V2ZW50KCk7CiAgICAgICAgICBzZXRFZGl0YWJsZSgpOwogICAgICAgIH0sIHRydWUpOwogICAgICB9CgogICAgICBhZGRFdmVudEhhbmRsZXIoZG9jdW1lbnQsICJrZXlkb3duIiwgbWV0aG9kKHRoaXMsICJrZXlEb3duIikpOwogICAgICBhZGRFdmVudEhhbmRsZXIoZG9jdW1lbnQsICJrZXlwcmVzcyIsIG1ldGhvZCh0aGlzLCAia2V5UHJlc3MiKSk7CiAgICAgIGFkZEV2ZW50SGFuZGxlcihkb2N1bWVudCwgImtleXVwIiwgbWV0aG9kKHRoaXMsICJrZXlVcCIpKTsKCiAgICAgIGZ1bmN0aW9uIGN1cnNvckFjdGl2aXR5KCkge3NlbGYuY3Vyc29yQWN0aXZpdHkoZmFsc2UpO30KICAgICAgYWRkRXZlbnRIYW5kbGVyKGRvY3VtZW50LmJvZHksICJtb3VzZXVwIiwgY3Vyc29yQWN0aXZpdHkpOwogICAgICBhZGRFdmVudEhhbmRsZXIoZG9jdW1lbnQuYm9keSwgInBhc3RlIiwgZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICBjdXJzb3JBY3Rpdml0eSgpOwogICAgICAgIGlmIChpbnRlcm5ldEV4cGxvcmVyKSB7CiAgICAgICAgICB2YXIgdGV4dCA9IG51bGw7CiAgICAgICAgICB0cnkge3RleHQgPSB3aW5kb3cuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCJUZXh0Iik7fWNhdGNoKGUpe30KICAgICAgICAgIGlmICh0ZXh0ICE9IG51bGwpIHsKICAgICAgICAgICAgc2VsZi5yZXBsYWNlU2VsZWN0aW9uKHRleHQpOwogICAgICAgICAgICBldmVudC5zdG9wKCk7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdmFyIHN0YXJ0ID0gc2VsZWN0LnNlbGVjdGlvblRvcE5vZGUoc2VsZi5jb250YWluZXIsIHRydWUpLAogICAgICAgICAgICAgICAgc3RhcnQyID0gc3RhcnQgJmFtcDsmYW1wOyBzdGFydC5wcmV2aW91c1NpYmxpbmc7CiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtzY3J1YlBhc3RlZChzZWxmLmNvbnRhaW5lciwgc3RhcnQsIHN0YXJ0Mik7fSwgMCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgICAgYWRkRXZlbnRIYW5kbGVyKGRvY3VtZW50LmJvZHksICJjdXQiLCBjdXJzb3JBY3Rpdml0eSk7CgogICAgICBpZiAodGhpcy5vcHRpb25zLmF1dG9NYXRjaFBhcmVucykKICAgICAgICBhZGRFdmVudEhhbmRsZXIoZG9jdW1lbnQuYm9keSwgImNsaWNrIiwgbWV0aG9kKHRoaXMsICJzY2hlZHVsZVBhcmVuQmxpbmsiKSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpc1NhZmVLZXkoY29kZSkgewogICAgcmV0dXJuIChjb2RlID49IDE2ICZhbXA7JmFtcDsgY29kZSAmbHQ7PSAxOCkgfHwgLy8gc2hpZnQsIGNvbnRyb2wsIGFsdAogICAgICAgICAgIChjb2RlID49IDMzICZhbXA7JmFtcDsgY29kZSAmbHQ7PSA0MCk7IC8vIGFycm93cywgaG9tZSwgZW5kCiAgfQoKICBFZGl0b3IucHJvdG90eXBlID0gewogICAgLy8gSW1wb3J0IGEgcGllY2Ugb2YgY29kZSBpbnRvIHRoZSBlZGl0b3IuCiAgICBpbXBvcnRDb2RlOiBmdW5jdGlvbihjb2RlKSB7CiAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKG51bGwsIG51bGwsIGFzRWRpdG9yTGluZXMoY29kZSkpOwogICAgICB0aGlzLmhpc3RvcnkucmVzZXQoKTsKICAgIH0sCgogICAgLy8gRXh0cmFjdCB0aGUgY29kZSBmcm9tIHRoZSBlZGl0b3IuCiAgICBnZXRDb2RlOiBmdW5jdGlvbigpIHsKICAgICAgaWYgKCF0aGlzLmNvbnRhaW5lci5maXJzdENoaWxkKQogICAgICAgIHJldHVybiAiIjsKCiAgICAgIHZhciBhY2N1bSA9IFtdOwogICAgICBzZWxlY3QubWFya1NlbGVjdGlvbih0aGlzLndpbik7CiAgICAgIGZvckVhY2godHJhdmVyc2VET00odGhpcy5jb250YWluZXIuZmlyc3RDaGlsZCksIG1ldGhvZChhY2N1bSwgInB1c2giKSk7CiAgICAgIHdlYmtpdExhc3RMaW5lSGFjayh0aGlzLmNvbnRhaW5lcik7CiAgICAgIHNlbGVjdC5zZWxlY3RNYXJrZWQoKTsKICAgICAgcmV0dXJuIGNsZWFuVGV4dChhY2N1bS5qb2luKCIiKSk7CiAgICB9LAoKICAgIGNoZWNrTGluZTogZnVuY3Rpb24obm9kZSkgewogICAgICBpZiAobm9kZSA9PT0gZmFsc2UgfHwgIShub2RlID09IG51bGwgfHwgbm9kZS5wYXJlbnROb2RlID09IHRoaXMuY29udGFpbmVyKSkKICAgICAgICB0aHJvdyBwYXJlbnQuQ29kZU1pcnJvci5JbnZhbGlkTGluZUhhbmRsZTsKICAgIH0sCgogICAgY3Vyc29yUG9zaXRpb246IGZ1bmN0aW9uKHN0YXJ0KSB7CiAgICAgIGlmIChzdGFydCA9PSBudWxsKSBzdGFydCA9IHRydWU7CiAgICAgIHZhciBwb3MgPSBzZWxlY3QuY3Vyc29yUG9zKHRoaXMuY29udGFpbmVyLCBzdGFydCk7CiAgICAgIGlmIChwb3MpIHJldHVybiB7bGluZTogcG9zLm5vZGUsIGNoYXJhY3RlcjogcG9zLm9mZnNldH07CiAgICAgIGVsc2UgcmV0dXJuIHtsaW5lOiBudWxsLCBjaGFyYWN0ZXI6IDB9OwogICAgfSwKCiAgICBmaXJzdExpbmU6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0sCgogICAgbGFzdExpbmU6IGZ1bmN0aW9uKCkgewogICAgICBpZiAodGhpcy5jb250YWluZXIubGFzdENoaWxkKSByZXR1cm4gc3RhcnRPZkxpbmUodGhpcy5jb250YWluZXIubGFzdENoaWxkKTsKICAgICAgZWxzZSByZXR1cm4gbnVsbDsKICAgIH0sCgogICAgbmV4dExpbmU6IGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgdGhpcy5jaGVja0xpbmUobGluZSk7CiAgICAgIHZhciBlbmQgPSBlbmRPZkxpbmUobGluZSwgdGhpcy5jb250YWluZXIpOwogICAgICByZXR1cm4gZW5kIHx8IGZhbHNlOwogICAgfSwKCiAgICBwcmV2TGluZTogZnVuY3Rpb24obGluZSkgewogICAgICB0aGlzLmNoZWNrTGluZShsaW5lKTsKICAgICAgaWYgKGxpbmUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgICByZXR1cm4gc3RhcnRPZkxpbmUobGluZS5wcmV2aW91c1NpYmxpbmcpOwogICAgfSwKCiAgICBzZWxlY3RMaW5lczogZnVuY3Rpb24oc3RhcnRMaW5lLCBzdGFydE9mZnNldCwgZW5kTGluZSwgZW5kT2Zmc2V0KSB7CiAgICAgIHRoaXMuY2hlY2tMaW5lKHN0YXJ0TGluZSk7CiAgICAgIHZhciBzdGFydCA9IHtub2RlOiBzdGFydExpbmUsIG9mZnNldDogc3RhcnRPZmZzZXR9LCBlbmQgPSBudWxsOwogICAgICBpZiAoZW5kT2Zmc2V0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICB0aGlzLmNoZWNrTGluZShlbmRMaW5lKTsKICAgICAgICBlbmQgPSB7bm9kZTogZW5kTGluZSwgb2Zmc2V0OiBlbmRPZmZzZXR9OwogICAgICB9CiAgICAgIHNlbGVjdC5zZXRDdXJzb3JQb3ModGhpcy5jb250YWluZXIsIHN0YXJ0LCBlbmQpOwogICAgICBzZWxlY3Quc2Nyb2xsVG9DdXJzb3IodGhpcy5jb250YWluZXIpOwogICAgfSwKCiAgICBsaW5lQ29udGVudDogZnVuY3Rpb24obGluZSkgewogICAgICB0aGlzLmNoZWNrTGluZShsaW5lKTsKICAgICAgdmFyIGFjY3VtID0gW107CiAgICAgIGZvciAobGluZSA9IGxpbmUgPyBsaW5lLm5leHRTaWJsaW5nIDogdGhpcy5jb250YWluZXIuZmlyc3RDaGlsZDsKICAgICAgICAgICBsaW5lICZhbXA7JmFtcDsgbGluZS5ub2RlTmFtZSAhPSAiQlIiOyBsaW5lID0gbGluZS5uZXh0U2libGluZykKICAgICAgICBhY2N1bS5wdXNoKG5vZGVUZXh0KGxpbmUpKTsKICAgICAgcmV0dXJuIGNsZWFuVGV4dChhY2N1bS5qb2luKCIiKSk7CiAgICB9LAoKICAgIHNldExpbmVDb250ZW50OiBmdW5jdGlvbihsaW5lLCBjb250ZW50KSB7CiAgICAgIHRoaXMuaGlzdG9yeS5jb21taXQoKTsKICAgICAgdGhpcy5yZXBsYWNlUmFuZ2Uoe25vZGU6IGxpbmUsIG9mZnNldDogMH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHtub2RlOiBsaW5lLCBvZmZzZXQ6IHRoaXMuaGlzdG9yeS50ZXh0QWZ0ZXIobGluZSkubGVuZ3RofSwKICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCk7CiAgICAgIHRoaXMuYWRkRGlydHlOb2RlKGxpbmUpOwogICAgICB0aGlzLnNjaGVkdWxlSGlnaGxpZ2h0KCk7CiAgICB9LAoKICAgIGluc2VydEludG9MaW5lOiBmdW5jdGlvbihsaW5lLCBwb3NpdGlvbiwgY29udGVudCkgewogICAgICB2YXIgYmVmb3JlID0gbnVsbDsKICAgICAgaWYgKHBvc2l0aW9uID09ICJlbmQiKSB7CiAgICAgICAgYmVmb3JlID0gZW5kT2ZMaW5lKGxpbmUsIHRoaXMuY29udGFpbmVyKTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBmb3IgKHZhciBjdXIgPSBsaW5lID8gbGluZS5uZXh0U2libGluZyA6IHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQ7IGN1cjsgY3VyID0gY3VyLm5leHRTaWJsaW5nKSB7CiAgICAgICAgICBpZiAocG9zaXRpb24gPT0gMCkgewogICAgICAgICAgICBiZWZvcmUgPSBjdXI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgdmFyIHRleHQgPSAoY3VyLmlubmVyVGV4dCB8fCBjdXIudGV4dENvbnRlbnQgfHwgY3VyLm5vZGVWYWx1ZSB8fCAiIik7CiAgICAgICAgICBpZiAodGV4dC5sZW5ndGggPiBwb3NpdGlvbikgewogICAgICAgICAgICBiZWZvcmUgPSBjdXIubmV4dFNpYmxpbmc7CiAgICAgICAgICAgIGNvbnRlbnQgPSB0ZXh0LnNsaWNlKDAsIHBvc2l0aW9uKSArIGNvbnRlbnQgKyB0ZXh0LnNsaWNlKHBvc2l0aW9uKTsKICAgICAgICAgICAgcmVtb3ZlRWxlbWVudChjdXIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIHBvc2l0aW9uIC09IHRleHQubGVuZ3RoOwogICAgICAgIH0KICAgICAgfQoKICAgICAgdmFyIGxpbmVzID0gYXNFZGl0b3JMaW5lcyhjb250ZW50KSwgZG9jID0gdGhpcy5jb250YWluZXIub3duZXJEb2N1bWVudDsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgJmx0OyBsaW5lcy5sZW5ndGg7IGkrKykgewogICAgICAgIGlmIChpID4gMCkgdGhpcy5jb250YWluZXIuaW5zZXJ0QmVmb3JlKGRvYy5jcmVhdGVFbGVtZW50KCJCUiIpLCBiZWZvcmUpOwogICAgICAgIHRoaXMuY29udGFpbmVyLmluc2VydEJlZm9yZShtYWtlUGFydFNwYW4obGluZXNbaV0sIGRvYyksIGJlZm9yZSk7CiAgICAgIH0KICAgICAgdGhpcy5hZGREaXJ0eU5vZGUobGluZSk7CiAgICAgIHRoaXMuc2NoZWR1bGVIaWdobGlnaHQoKTsKICAgIH0sCgogICAgLy8gUmV0cmlldmUgdGhlIHNlbGVjdGVkIHRleHQuCiAgICBzZWxlY3RlZFRleHQ6IGZ1bmN0aW9uKCkgewogICAgICB2YXIgaCA9IHRoaXMuaGlzdG9yeTsKICAgICAgaC5jb21taXQoKTsKCiAgICAgIHZhciBzdGFydCA9IHNlbGVjdC5jdXJzb3JQb3ModGhpcy5jb250YWluZXIsIHRydWUpLAogICAgICAgICAgZW5kID0gc2VsZWN0LmN1cnNvclBvcyh0aGlzLmNvbnRhaW5lciwgZmFsc2UpOwogICAgICBpZiAoIXN0YXJ0IHx8ICFlbmQpIHJldHVybiAiIjsKCiAgICAgIGlmIChzdGFydC5ub2RlID09IGVuZC5ub2RlKQogICAgICAgIHJldHVybiBoLnRleHRBZnRlcihzdGFydC5ub2RlKS5zbGljZShzdGFydC5vZmZzZXQsIGVuZC5vZmZzZXQpOwoKICAgICAgdmFyIHRleHQgPSBbaC50ZXh0QWZ0ZXIoc3RhcnQubm9kZSkuc2xpY2Uoc3RhcnQub2Zmc2V0KV07CiAgICAgIGZvciAocG9zID0gaC5ub2RlQWZ0ZXIoc3RhcnQubm9kZSk7IHBvcyAhPSBlbmQubm9kZTsgcG9zID0gaC5ub2RlQWZ0ZXIocG9zKSkKICAgICAgICB0ZXh0LnB1c2goaC50ZXh0QWZ0ZXIocG9zKSk7CiAgICAgIHRleHQucHVzaChoLnRleHRBZnRlcihlbmQubm9kZSkuc2xpY2UoMCwgZW5kLm9mZnNldCkpOwogICAgICByZXR1cm4gY2xlYW5UZXh0KHRleHQuam9pbigiXG4iKSk7CiAgICB9LAoKICAgIC8vIFJlcGxhY2UgdGhlIHNlbGVjdGlvbiB3aXRoIGFub3RoZXIgcGllY2Ugb2YgdGV4dC4KICAgIHJlcGxhY2VTZWxlY3Rpb246IGZ1bmN0aW9uKHRleHQpIHsKICAgICAgdGhpcy5oaXN0b3J5LmNvbW1pdCgpOwogICAgICB2YXIgc3RhcnQgPSBzZWxlY3QuY3Vyc29yUG9zKHRoaXMuY29udGFpbmVyLCB0cnVlKSwKICAgICAgICAgIGVuZCA9IHNlbGVjdC5jdXJzb3JQb3ModGhpcy5jb250YWluZXIsIGZhbHNlKTsKICAgICAgaWYgKCFzdGFydCB8fCAhZW5kKSByZXR1cm47CgogICAgICBlbmQgPSB0aGlzLnJlcGxhY2VSYW5nZShzdGFydCwgZW5kLCB0ZXh0KTsKICAgICAgc2VsZWN0LnNldEN1cnNvclBvcyh0aGlzLmNvbnRhaW5lciwgc3RhcnQsIGVuZCk7CiAgICB9LAoKICAgIHJlcGxhY2VSYW5nZTogZnVuY3Rpb24oZnJvbSwgdG8sIHRleHQpIHsKICAgICAgdmFyIGxpbmVzID0gYXNFZGl0b3JMaW5lcyh0ZXh0KTsKICAgICAgbGluZXNbMF0gPSB0aGlzLmhpc3RvcnkudGV4dEFmdGVyKGZyb20ubm9kZSkuc2xpY2UoMCwgZnJvbS5vZmZzZXQpICsgbGluZXNbMF07CiAgICAgIHZhciBsYXN0TGluZSA9IGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdOwogICAgICBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSA9IGxhc3RMaW5lICsgdGhpcy5oaXN0b3J5LnRleHRBZnRlcih0by5ub2RlKS5zbGljZSh0by5vZmZzZXQpOwogICAgICB2YXIgZW5kID0gdGhpcy5oaXN0b3J5Lm5vZGVBZnRlcih0by5ub2RlKTsKICAgICAgdGhpcy5oaXN0b3J5LnB1c2goZnJvbS5ub2RlLCBlbmQsIGxpbmVzKTsKICAgICAgcmV0dXJuIHtub2RlOiB0aGlzLmhpc3Rvcnkubm9kZUJlZm9yZShlbmQpLAogICAgICAgICAgICAgIG9mZnNldDogbGFzdExpbmUubGVuZ3RofTsKICAgIH0sCgogICAgZ2V0U2VhcmNoQ3Vyc29yOiBmdW5jdGlvbihzdHJpbmcsIGZyb21DdXJzb3IpIHsKICAgICAgcmV0dXJuIG5ldyBTZWFyY2hDdXJzb3IodGhpcywgc3RyaW5nLCBmcm9tQ3Vyc29yKTsKICAgIH0sCgogICAgLy8gUmUtaW5kZW50IHRoZSB3aG9sZSBidWZmZXIKICAgIHJlaW5kZW50OiBmdW5jdGlvbigpIHsKICAgICAgaWYgKHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQpCiAgICAgICAgdGhpcy5pbmRlbnRSZWdpb24obnVsbCwgdGhpcy5jb250YWluZXIubGFzdENoaWxkKTsKICAgIH0sCgogICAgZ3JhYktleXM6IGZ1bmN0aW9uKGV2ZW50SGFuZGxlciwgZmlsdGVyKSB7CiAgICAgIHRoaXMuZnJvemVuID0gZXZlbnRIYW5kbGVyOwogICAgICB0aGlzLmtleUZpbHRlciA9IGZpbHRlcjsKICAgIH0sCiAgICB1bmdyYWJLZXlzOiBmdW5jdGlvbigpIHsKICAgICAgdGhpcy5mcm96ZW4gPSAibGVhdmUiOwogICAgICB0aGlzLmtleUZpbHRlciA9IG51bGw7CiAgICB9LAoKICAgIC8vIEludGVyY2VwdCBlbnRlciBhbmQgdGFiLCBhbmQgYXNzaWduIHRoZWlyIG5ldyBmdW5jdGlvbnMuCiAgICBrZXlEb3duOiBmdW5jdGlvbihldmVudCkgewogICAgICBpZiAodGhpcy5mcm96ZW4gPT0gImxlYXZlIikgdGhpcy5mcm96ZW4gPSBudWxsOwogICAgICBpZiAodGhpcy5mcm96ZW4gJmFtcDsmYW1wOyAoIXRoaXMua2V5RmlsdGVyIHx8IHRoaXMua2V5RmlsdGVyKGV2ZW50LmtleUNvZGUpKSkgewogICAgICAgIGV2ZW50LnN0b3AoKTsKICAgICAgICB0aGlzLmZyb3plbihldmVudCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICB2YXIgY29kZSA9IGV2ZW50LmtleUNvZGU7CiAgICAgIC8vIERvbid0IHNjYW4gd2hlbiB0aGUgdXNlciBpcyB0eXBpbmcuCiAgICAgIHRoaXMuZGVsYXlTY2FubmluZygpOwogICAgICAvLyBTY2hlZHVsZSBhIHBhcmVuLWhpZ2hsaWdodCBldmVudCwgaWYgY29uZmlndXJlZC4KICAgICAgaWYgKHRoaXMub3B0aW9ucy5hdXRvTWF0Y2hQYXJlbnMpCiAgICAgICAgdGhpcy5zY2hlZHVsZVBhcmVuQmxpbmsoKTsKCiAgICAgIGlmIChjb2RlID09IDEzKSB7IC8vIGVudGVyCiAgICAgICAgaWYgKGV2ZW50LmN0cmxLZXkpIHsKICAgICAgICAgIHRoaXMucmVwYXJzZUJ1ZmZlcigpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIHNlbGVjdC5pbnNlcnROZXdsaW5lQXRDdXJzb3IodGhpcy53aW4pOwogICAgICAgICAgdGhpcy5pbmRlbnRBdEN1cnNvcigpOwogICAgICAgICAgc2VsZWN0LnNjcm9sbFRvQ3Vyc29yKHRoaXMuY29udGFpbmVyKTsKICAgICAgICB9CiAgICAgICAgZXZlbnQuc3RvcCgpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGNvZGUgPT0gOSAmYW1wOyZhbXA7IHRoaXMub3B0aW9ucy50YWJNb2RlICE9ICJkZWZhdWx0IikgeyAvLyB0YWIKICAgICAgICB0aGlzLmhhbmRsZVRhYighZXZlbnQuY3RybEtleSAmYW1wOyZhbXA7ICFldmVudC5zaGlmdEtleSk7CiAgICAgICAgZXZlbnQuc3RvcCgpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGNvZGUgPT0gMzIgJmFtcDsmYW1wOyBldmVudC5zaGlmdEtleSAmYW1wOyZhbXA7IHRoaXMub3B0aW9ucy50YWJNb2RlID09ICJkZWZhdWx0IikgeyAvLyBzcGFjZQogICAgICAgIHRoaXMuaGFuZGxlVGFiKHRydWUpOwogICAgICAgIGV2ZW50LnN0b3AoKTsKICAgICAgfQogICAgICBlbHNlIGlmICgoY29kZSA9PSAyMTkgfHwgY29kZSA9PSAyMjEpICZhbXA7JmFtcDsgZXZlbnQuY3RybEtleSkgewogICAgICAgIHRoaXMuYmxpbmtQYXJlbnMoZXZlbnQuc2hpZnRLZXkpOwogICAgICAgIGV2ZW50LnN0b3AoKTsKICAgICAgfQogICAgICBlbHNlIGlmIChldmVudC5tZXRhS2V5ICZhbXA7JmFtcDsgKGNvZGUgPT0gMzcgfHwgY29kZSA9PSAzOSkpIHsgLy8gTWV0YS1sZWZ0L3JpZ2h0CiAgICAgICAgdmFyIGN1cnNvciA9IHNlbGVjdC5zZWxlY3Rpb25Ub3BOb2RlKHRoaXMuY29udGFpbmVyKTsKICAgICAgICBpZiAoY3Vyc29yID09PSBmYWxzZSB8fCAhdGhpcy5jb250YWluZXIuZmlyc3RDaGlsZCkgcmV0dXJuOwoKICAgICAgICBpZiAoY29kZSA9PSAzNykgc2VsZWN0LmZvY3VzQWZ0ZXJOb2RlKHN0YXJ0T2ZMaW5lKGN1cnNvciksIHRoaXMuY29udGFpbmVyKTsKICAgICAgICBlbHNlIHsKICAgICAgICAgIGVuZCA9IGVuZE9mTGluZShjdXJzb3IsIHRoaXMuY29udGFpbmVyKTsKICAgICAgICAgIHNlbGVjdC5mb2N1c0FmdGVyTm9kZShlbmQgPyBlbmQucHJldmlvdXNTaWJsaW5nIDogdGhpcy5jb250YWluZXIubGFzdENoaWxkLCB0aGlzLmNvbnRhaW5lcik7CiAgICAgICAgfQogICAgICAgIGV2ZW50LnN0b3AoKTsKICAgICAgfQogICAgICBlbHNlIGlmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpIHsKICAgICAgICBpZiAoKGV2ZW50LnNoaWZ0S2V5ICZhbXA7JmFtcDsgY29kZSA9PSA5MCkgfHwgY29kZSA9PSA4OSkgeyAvLyBzaGlmdC1aLCBZCiAgICAgICAgICBzZWxlY3Quc2Nyb2xsVG9Ob2RlKHRoaXMuaGlzdG9yeS5yZWRvKCkpOwogICAgICAgICAgZXZlbnQuc3RvcCgpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChjb2RlID09IDkwIHx8IGNvZGUgPT0gOCkgeyAvLyBaLCBiYWNrc3BhY2UKICAgICAgICAgIHNlbGVjdC5zY3JvbGxUb05vZGUodGhpcy5oaXN0b3J5LnVuZG8oKSk7CiAgICAgICAgICBldmVudC5zdG9wKCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGNvZGUgPT0gODMgJmFtcDsmYW1wOyB0aGlzLm9wdGlvbnMuc2F2ZUZ1bmN0aW9uKSB7IC8vIFMKICAgICAgICAgIHRoaXMub3B0aW9ucy5zYXZlRnVuY3Rpb24oKTsKICAgICAgICAgIGV2ZW50LnN0b3AoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sCgogICAgLy8gQ2hlY2sgZm9yIGNoYXJhY3RlcnMgdGhhdCBzaG91bGQgcmUtaW5kZW50IHRoZSBjdXJyZW50IGxpbmUsCiAgICAvLyBhbmQgcHJldmVudCBPcGVyYSBmcm9tIGhhbmRsaW5nIGVudGVyIGFuZCB0YWIgYW55d2F5LgogICAga2V5UHJlc3M6IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgIHZhciBlbGVjdHJpYyA9IC9pbmRlbnR8ZGVmYXVsdC8udGVzdCh0aGlzLm9wdGlvbnMudGFiTW9kZSkgJmFtcDsmYW1wOyBFZGl0b3IuUGFyc2VyLmVsZWN0cmljQ2hhcnM7CiAgICAgIC8vIEhhY2sgZm9yIE9wZXJhLCBhbmQgRmlyZWZveCBvbiBPUyBYLCBpbiB3aGljaCBzdG9wcGluZyBhCiAgICAgIC8vIGtleWRvd24gZXZlbnQgZG9lcyBub3QgcHJldmVudCB0aGUgYXNzb2NpYXRlZCBrZXlwcmVzcyBldmVudAogICAgICAvLyBmcm9tIGhhcHBlbmluZywgc28gd2UgaGF2ZSB0byBjYW5jZWwgZW50ZXIgYW5kIHRhYiBhZ2FpbgogICAgICAvLyBoZXJlLgogICAgICBpZiAoKHRoaXMuZnJvemVuICZhbXA7JmFtcDsgKCF0aGlzLmtleUZpbHRlciB8fCB0aGlzLmtleUZpbHRlcihldmVudC5rZXlDb2RlKSkpIHx8CiAgICAgICAgICBldmVudC5jb2RlID09IDEzIHx8IChldmVudC5jb2RlID09IDkgJmFtcDsmYW1wOyB0aGlzLm9wdGlvbnMudGFiTW9kZSAhPSAiZGVmYXVsdCIpIHx8CiAgICAgICAgICAoZXZlbnQua2V5Q29kZSA9PSAzMiAmYW1wOyZhbXA7IGV2ZW50LnNoaWZ0S2V5ICZhbXA7JmFtcDsgdGhpcy5vcHRpb25zLnRhYk1vZGUgPT0gImRlZmF1bHQiKSkKICAgICAgICBldmVudC5zdG9wKCk7CiAgICAgIGVsc2UgaWYgKGVsZWN0cmljICZhbXA7JmFtcDsgZWxlY3RyaWMuaW5kZXhPZihldmVudC5jaGFyYWN0ZXIpICE9IC0xKQogICAgICAgIHRoaXMucGFyZW50LnNldFRpbWVvdXQobWV0aG9kKHRoaXMsICJpbmRlbnRBdEN1cnNvciIpLCAwKTsKICAgIH0sCgogICAgLy8gTWFyayB0aGUgbm9kZSBhdCB0aGUgY3Vyc29yIGRpcnR5IHdoZW4gYSBub24tc2FmZSBrZXkgaXMKICAgIC8vIHJlbGVhc2VkLgogICAga2V5VXA6IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgIHRoaXMuY3Vyc29yQWN0aXZpdHkoaXNTYWZlS2V5KGV2ZW50LmtleUNvZGUpKTsKICAgIH0sCgogICAgLy8gSW5kZW50IHRoZSBsaW5lIGZvbGxvd2luZyBhIGdpdmVuICZsdDticj4sIG9yIG51bGwgZm9yIHRoZSBmaXJzdAogICAgLy8gbGluZS4gSWYgZ2l2ZW4gYSAmbHQ7YnI+IGVsZW1lbnQsIHRoaXMgbXVzdCBoYXZlIGJlZW4gaGlnaGxpZ2h0ZWQKICAgIC8vIHNvIHRoYXQgaXQgaGFzIGFuIGluZGVudGF0aW9uIG1ldGhvZC4gUmV0dXJucyB0aGUgd2hpdGVzcGFjZQogICAgLy8gZWxlbWVudCB0aGF0IGhhcyBiZWVuIG1vZGlmaWVkIG9yIGNyZWF0ZWQgKGlmIGFueSkuCiAgICBpbmRlbnRMaW5lQWZ0ZXI6IGZ1bmN0aW9uKHN0YXJ0LCBkaXJlY3Rpb24pIHsKICAgICAgLy8gd2hpdGVTcGFjZSBpcyB0aGUgd2hpdGVzcGFjZSBzcGFuIGF0IHRoZSBzdGFydCBvZiB0aGUgbGluZSwKICAgICAgLy8gb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBzdWNoIG5vZGUuCiAgICAgIHZhciB3aGl0ZVNwYWNlID0gc3RhcnQgPyBzdGFydC5uZXh0U2libGluZyA6IHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQ7CiAgICAgIGlmICh3aGl0ZVNwYWNlICZhbXA7JmFtcDsgIWhhc0NsYXNzKHdoaXRlU3BhY2UsICJ3aGl0ZXNwYWNlIikpCiAgICAgICAgd2hpdGVTcGFjZSA9IG51bGw7CgogICAgICAvLyBTb21ldGltZXMgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lIGNhbiBpbmZsdWVuY2UgdGhlIGNvcnJlY3QKICAgICAgLy8gaW5kZW50YXRpb24sIHNvIHdlIHJldHJpZXZlIGl0LgogICAgICB2YXIgZmlyc3RUZXh0ID0gd2hpdGVTcGFjZSA/IHdoaXRlU3BhY2UubmV4dFNpYmxpbmcgOiAoc3RhcnQgPyBzdGFydC5uZXh0U2libGluZyA6IHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQpOwogICAgICB2YXIgbmV4dENoYXJzID0gKHN0YXJ0ICZhbXA7JmFtcDsgZmlyc3RUZXh0ICZhbXA7JmFtcDsgZmlyc3RUZXh0LmN1cnJlbnRUZXh0KSA/IGZpcnN0VGV4dC5jdXJyZW50VGV4dCA6ICIiOwoKICAgICAgLy8gQXNrIHRoZSBsZXhpY2FsIGNvbnRleHQgZm9yIHRoZSBjb3JyZWN0IGluZGVudGF0aW9uLCBhbmQKICAgICAgLy8gY29tcHV0ZSBob3cgbXVjaCB0aGlzIGRpZmZlcnMgZnJvbSB0aGUgY3VycmVudCBpbmRlbnRhdGlvbi4KICAgICAgdmFyIG5ld0luZGVudCA9IDAsIGN1ckluZGVudCA9IHdoaXRlU3BhY2UgPyB3aGl0ZVNwYWNlLmN1cnJlbnRUZXh0Lmxlbmd0aCA6IDA7CiAgICAgIGlmIChkaXJlY3Rpb24gIT0gbnVsbCAmYW1wOyZhbXA7IHRoaXMub3B0aW9ucy50YWJNb2RlID09ICJzaGlmdCIpCiAgICAgICAgbmV3SW5kZW50ID0gZGlyZWN0aW9uID8gY3VySW5kZW50ICsgaW5kZW50VW5pdCA6IE1hdGgubWF4KDAsIGN1ckluZGVudCAtIGluZGVudFVuaXQpCiAgICAgIGVsc2UgaWYgKHN0YXJ0KQogICAgICAgIG5ld0luZGVudCA9IHN0YXJ0LmluZGVudGF0aW9uKG5leHRDaGFycywgY3VySW5kZW50LCBkaXJlY3Rpb24pOwogICAgICBlbHNlIGlmIChFZGl0b3IuUGFyc2VyLmZpcnN0SW5kZW50YXRpb24pCiAgICAgICAgbmV3SW5kZW50ID0gRWRpdG9yLlBhcnNlci5maXJzdEluZGVudGF0aW9uKG5leHRDaGFycywgY3VySW5kZW50LCBkaXJlY3Rpb24pOwogICAgICB2YXIgaW5kZW50RGlmZiA9IG5ld0luZGVudCAtIGN1ckluZGVudDsKCiAgICAgIC8vIElmIHRoZXJlIGlzIHRvbyBtdWNoLCB0aGlzIGlzIGp1c3QgYSBtYXR0ZXIgb2Ygc2hyaW5raW5nIGEgc3Bhbi4KICAgICAgaWYgKGluZGVudERpZmYgJmx0OyAwKSB7CiAgICAgICAgaWYgKG5ld0luZGVudCA9PSAwKSB7CiAgICAgICAgICBpZiAoZmlyc3RUZXh0KSBzZWxlY3Quc25hcHNob3RNb3ZlKHdoaXRlU3BhY2UuZmlyc3RDaGlsZCwgZmlyc3RUZXh0LmZpcnN0Q2hpbGQsIDApOwogICAgICAgICAgcmVtb3ZlRWxlbWVudCh3aGl0ZVNwYWNlKTsKICAgICAgICAgIHdoaXRlU3BhY2UgPSBudWxsOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIHNlbGVjdC5zbmFwc2hvdE1vdmUod2hpdGVTcGFjZS5maXJzdENoaWxkLCB3aGl0ZVNwYWNlLmZpcnN0Q2hpbGQsIGluZGVudERpZmYsIHRydWUpOwogICAgICAgICAgd2hpdGVTcGFjZS5jdXJyZW50VGV4dCA9IG1ha2VXaGl0ZVNwYWNlKG5ld0luZGVudCk7CiAgICAgICAgICB3aGl0ZVNwYWNlLmZpcnN0Q2hpbGQubm9kZVZhbHVlID0gd2hpdGVTcGFjZS5jdXJyZW50VGV4dDsKICAgICAgICB9CiAgICAgIH0KICAgICAgLy8gTm90IGVub3VnaC4uLgogICAgICBlbHNlIGlmIChpbmRlbnREaWZmID4gMCkgewogICAgICAgIC8vIElmIHRoZXJlIGlzIHdoaXRlc3BhY2UsIHdlIGdyb3cgaXQuCiAgICAgICAgaWYgKHdoaXRlU3BhY2UpIHsKICAgICAgICAgIHdoaXRlU3BhY2UuY3VycmVudFRleHQgPSBtYWtlV2hpdGVTcGFjZShuZXdJbmRlbnQpOwogICAgICAgICAgd2hpdGVTcGFjZS5maXJzdENoaWxkLm5vZGVWYWx1ZSA9IHdoaXRlU3BhY2UuY3VycmVudFRleHQ7CiAgICAgICAgfQogICAgICAgIC8vIE90aGVyd2lzZSwgd2UgaGF2ZSB0byBhZGQgYSBuZXcgd2hpdGVzcGFjZSBub2RlLgogICAgICAgIGVsc2UgewogICAgICAgICAgd2hpdGVTcGFjZSA9IG1ha2VQYXJ0U3BhbihtYWtlV2hpdGVTcGFjZShuZXdJbmRlbnQpLCB0aGlzLmRvYyk7CiAgICAgICAgICB3aGl0ZVNwYWNlLmNsYXNzTmFtZSA9ICJ3aGl0ZXNwYWNlIjsKICAgICAgICAgIGlmIChzdGFydCkgaW5zZXJ0QWZ0ZXIod2hpdGVTcGFjZSwgc3RhcnQpOwogICAgICAgICAgZWxzZSB0aGlzLmNvbnRhaW5lci5pbnNlcnRCZWZvcmUod2hpdGVTcGFjZSwgdGhpcy5jb250YWluZXIuZmlyc3RDaGlsZCk7CiAgICAgICAgfQogICAgICAgIGlmIChmaXJzdFRleHQpIHNlbGVjdC5zbmFwc2hvdE1vdmUoZmlyc3RUZXh0LmZpcnN0Q2hpbGQsIHdoaXRlU3BhY2UuZmlyc3RDaGlsZCwgY3VySW5kZW50LCBmYWxzZSwgdHJ1ZSk7CiAgICAgIH0KICAgICAgaWYgKGluZGVudERpZmYgIT0gMCkgdGhpcy5hZGREaXJ0eU5vZGUoc3RhcnQpOwogICAgICByZXR1cm4gd2hpdGVTcGFjZTsKICAgIH0sCgogICAgLy8gUmUtaGlnaGxpZ2h0IHRoZSBzZWxlY3RlZCBwYXJ0IG9mIHRoZSBkb2N1bWVudC4KICAgIGhpZ2hsaWdodEF0Q3Vyc29yOiBmdW5jdGlvbigpIHsKICAgICAgdmFyIHBvcyA9IHNlbGVjdC5zZWxlY3Rpb25Ub3BOb2RlKHRoaXMuY29udGFpbmVyLCB0cnVlKTsKICAgICAgdmFyIHRvID0gc2VsZWN0LnNlbGVjdGlvblRvcE5vZGUodGhpcy5jb250YWluZXIsIGZhbHNlKTsKICAgICAgaWYgKHBvcyA9PT0gZmFsc2UgfHwgdG8gPT09IGZhbHNlKSByZXR1cm47CgogICAgICBzZWxlY3QubWFya1NlbGVjdGlvbih0aGlzLndpbik7CiAgICAgIGlmICh0aGlzLmhpZ2hsaWdodChwb3MsIGVuZE9mTGluZSh0bywgdGhpcy5jb250YWluZXIpLCB0cnVlLCAyMCkgPT09IGZhbHNlKQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgc2VsZWN0LnNlbGVjdE1hcmtlZCgpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0sCgogICAgLy8gV2hlbiB0YWIgaXMgcHJlc3NlZCB3aXRoIHRleHQgc2VsZWN0ZWQsIHRoZSB3aG9sZSBzZWxlY3Rpb24gaXMKICAgIC8vIHJlLWluZGVudGVkLCB3aGVuIG5vdGhpbmcgaXMgc2VsZWN0ZWQsIHRoZSBsaW5lIHdpdGggdGhlIGN1cnNvcgogICAgLy8gaXMgcmUtaW5kZW50ZWQuCiAgICBoYW5kbGVUYWI6IGZ1bmN0aW9uKGRpcmVjdGlvbikgewogICAgICBpZiAodGhpcy5vcHRpb25zLnRhYk1vZGUgPT0gInNwYWNlcyIpIHsKICAgICAgICBzZWxlY3QuaW5zZXJ0VGFiQXRDdXJzb3IodGhpcy53aW4pOwogICAgICB9CiAgICAgIGVsc2UgaWYgKCFzZWxlY3Quc29tZXRoaW5nU2VsZWN0ZWQodGhpcy53aW4pKSB7CiAgICAgICAgdGhpcy5pbmRlbnRBdEN1cnNvcihkaXJlY3Rpb24pOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIHZhciBzdGFydCA9IHNlbGVjdC5zZWxlY3Rpb25Ub3BOb2RlKHRoaXMuY29udGFpbmVyLCB0cnVlKSwKICAgICAgICAgICAgZW5kID0gc2VsZWN0LnNlbGVjdGlvblRvcE5vZGUodGhpcy5jb250YWluZXIsIGZhbHNlKTsKICAgICAgICBpZiAoc3RhcnQgPT09IGZhbHNlIHx8IGVuZCA9PT0gZmFsc2UpIHJldHVybjsKICAgICAgICB0aGlzLmluZGVudFJlZ2lvbihzdGFydCwgZW5kLCBkaXJlY3Rpb24pOwogICAgICB9CiAgICB9LAoKICAgIC8vIERlbGF5IChvciBpbml0aWF0ZSkgdGhlIG5leHQgcGFyZW4gYmxpbmsgZXZlbnQuCiAgICBzY2hlZHVsZVBhcmVuQmxpbms6IGZ1bmN0aW9uKCkgewogICAgICBpZiAodGhpcy5wYXJlbkV2ZW50KSB0aGlzLnBhcmVudC5jbGVhclRpbWVvdXQodGhpcy5wYXJlbkV2ZW50KTsKICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICB0aGlzLnBhcmVuRXZlbnQgPSB0aGlzLnBhcmVudC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7c2VsZi5ibGlua1BhcmVucygpO30sIDMwMCk7CiAgICB9LAoKICAgIC8vIFRha2UgdGhlIHRva2VuIGJlZm9yZSB0aGUgY3Vyc29yLiBJZiBpdCBjb250YWlucyBhIGNoYXJhY3RlciBpbgogICAgLy8gJygpW117fScsIHNlYXJjaCBmb3IgdGhlIG1hdGNoaW5nIHBhcmVuL2JyYWNlL2JyYWNrZXQsIGFuZAogICAgLy8gaGlnaGxpZ2h0IHRoZW0gaW4gZ3JlZW4gZm9yIGEgbW9tZW50LCBvciByZWQgaWYgbm8gcHJvcGVyIG1hdGNoCiAgICAvLyB3YXMgZm91bmQuCiAgICBibGlua1BhcmVuczogZnVuY3Rpb24oanVtcCkgewogICAgICAvLyBDbGVhciB0aGUgZXZlbnQgcHJvcGVydHkuCiAgICAgIGlmICh0aGlzLnBhcmVuRXZlbnQpIHRoaXMucGFyZW50LmNsZWFyVGltZW91dCh0aGlzLnBhcmVuRXZlbnQpOwogICAgICB0aGlzLnBhcmVuRXZlbnQgPSBudWxsOwoKICAgICAgLy8gRXh0cmFjdCBhICdwYXJlbicgZnJvbSBhIHBpZWNlIG9mIHRleHQuCiAgICAgIGZ1bmN0aW9uIHBhcmVuKG5vZGUpIHsKICAgICAgICBpZiAobm9kZS5jdXJyZW50VGV4dCkgewogICAgICAgICAgdmFyIG1hdGNoID0gbm9kZS5jdXJyZW50VGV4dC5tYXRjaCgvXltcc1x1MDBhMF0qKFtcKFwpXFtcXXt9XSlbXHNcdTAwYTBdKiQvKTsKICAgICAgICAgIHJldHVybiBtYXRjaCAmYW1wOyZhbXA7IG1hdGNoWzFdOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBEZXRlcm1pbmUgdGhlIGRpcmVjdGlvbiBhIHBhcmVuIGlzIGZhY2luZy4KICAgICAgZnVuY3Rpb24gZm9yd2FyZChjaCkgewogICAgICAgIHJldHVybiAvW1woXFtce10vLnRlc3QoY2gpOwogICAgICB9CgogICAgICB2YXIgY2gsIHNlbGYgPSB0aGlzLCBjdXJzb3IgPSBzZWxlY3Quc2VsZWN0aW9uVG9wTm9kZSh0aGlzLmNvbnRhaW5lciwgdHJ1ZSk7CiAgICAgIGlmICghY3Vyc29yIHx8ICF0aGlzLmhpZ2hsaWdodEF0Q3Vyc29yKCkpIHJldHVybjsKICAgICAgY3Vyc29yID0gc2VsZWN0LnNlbGVjdGlvblRvcE5vZGUodGhpcy5jb250YWluZXIsIHRydWUpOwogICAgICBpZiAoIShjdXJzb3IgJmFtcDsmYW1wOyAoKGNoID0gcGFyZW4oY3Vyc29yKSkgfHwgKGN1cnNvciA9IGN1cnNvci5uZXh0U2libGluZykgJmFtcDsmYW1wOyAoY2ggPSBwYXJlbihjdXJzb3IpKSkpKQogICAgICAgIHJldHVybjsKICAgICAgLy8gV2Ugb25seSBsb29rIGZvciB0b2tlbnMgd2l0aCB0aGUgc2FtZSBjbGFzc05hbWUuCiAgICAgIHZhciBjbGFzc05hbWUgPSBjdXJzb3IuY2xhc3NOYW1lLCBkaXIgPSBmb3J3YXJkKGNoKSwgbWF0Y2ggPSBtYXRjaGluZ1tjaF07CgogICAgICAvLyBTaW5jZSBwYXJ0cyBvZiB0aGUgZG9jdW1lbnQgbWlnaHQgbm90IGhhdmUgYmVlbiBwcm9wZXJseQogICAgICAvLyBoaWdobGlnaHRlZCwgYW5kIGl0IGlzIGhhcmQgdG8ga25vdyBpbiBhZHZhbmNlIHdoaWNoIHBhcnQgd2UKICAgICAgLy8gaGF2ZSB0byBzY2FuLCB3ZSBqdXN0IHRyeSwgYW5kIHdoZW4gd2UgZmluZCBkaXJ0eSBub2RlcyB3ZQogICAgICAvLyBhYm9ydCwgcGFyc2UgdGhlbSwgYW5kIHJlLXRyeS4KICAgICAgZnVuY3Rpb24gdHJ5RmluZE1hdGNoKCkgewogICAgICAgIHZhciBzdGFjayA9IFtdLCBjaCwgb2sgPSB0cnVlOzsKICAgICAgICBmb3IgKHZhciBydW5uZXIgPSBjdXJzb3I7IHJ1bm5lcjsgcnVubmVyID0gZGlyID8gcnVubmVyLm5leHRTaWJsaW5nIDogcnVubmVyLnByZXZpb3VzU2libGluZykgewogICAgICAgICAgaWYgKHJ1bm5lci5jbGFzc05hbWUgPT0gY2xhc3NOYW1lICZhbXA7JmFtcDsgcnVubmVyLm5vZGVOYW1lID09ICJTUEFOIiAmYW1wOyZhbXA7IChjaCA9IHBhcmVuKHJ1bm5lcikpKSB7CiAgICAgICAgICAgIGlmIChmb3J3YXJkKGNoKSA9PSBkaXIpCiAgICAgICAgICAgICAgc3RhY2sucHVzaChjaCk7CiAgICAgICAgICAgIGVsc2UgaWYgKCFzdGFjay5sZW5ndGgpCiAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKICAgICAgICAgICAgZWxzZSBpZiAoc3RhY2sucG9wKCkgIT0gbWF0Y2hpbmdbY2hdKQogICAgICAgICAgICAgIG9rID0gZmFsc2U7CiAgICAgICAgICAgIGlmICghc3RhY2subGVuZ3RoKSBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgaWYgKHJ1bm5lci5kaXJ0eSB8fCBydW5uZXIubm9kZU5hbWUgIT0gIlNQQU4iICZhbXA7JmFtcDsgcnVubmVyLm5vZGVOYW1lICE9ICJCUiIpIHsKICAgICAgICAgICAgcmV0dXJuIHtub2RlOiBydW5uZXIsIHN0YXR1czogImRpcnR5In07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB7bm9kZTogcnVubmVyLCBzdGF0dXM6IHJ1bm5lciAmYW1wOyZhbXA7IG9rfTsKICAgICAgfQogICAgICAvLyBUZW1wb3JhcmlseSBnaXZlIHRoZSByZWxldmFudCBub2RlcyBhIGNvbG91ci4KICAgICAgZnVuY3Rpb24gYmxpbmsobm9kZSwgb2spIHsKICAgICAgICBub2RlLnN0eWxlLmZvbnRXZWlnaHQgPSAiYm9sZCI7CiAgICAgICAgbm9kZS5zdHlsZS5jb2xvciA9IG9rID8gIiM4RjgiIDogIiNGODgiOwogICAgICAgIHNlbGYucGFyZW50LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7bm9kZS5zdHlsZS5mb250V2VpZ2h0ID0gIiI7IG5vZGUuc3R5bGUuY29sb3IgPSAiIjt9LCA1MDApOwogICAgICB9CgogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIHZhciBmb3VuZCA9IHRyeUZpbmRNYXRjaCgpOwogICAgICAgIGlmIChmb3VuZC5zdGF0dXMgPT0gImRpcnR5IikgewogICAgICAgICAgdGhpcy5oaWdobGlnaHQoZm91bmQubm9kZSwgMSk7CiAgICAgICAgICAvLyBOZWVkZWQgYmVjYXVzZSBpbiBzb21lIGNvcm5lciBjYXNlcyBhIGhpZ2hsaWdodCBkb2VzIG5vdAogICAgICAgICAgLy8gcmVhY2ggYSBub2RlLgogICAgICAgICAgZm91bmQubm9kZS5kaXJ0eSA9IGZhbHNlOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgYmxpbmsoY3Vyc29yLCBmb3VuZC5zdGF0dXMpOwogICAgICAgICAgaWYgKGZvdW5kLm5vZGUpIHsKICAgICAgICAgICAgYmxpbmsoZm91bmQubm9kZSwgZm91bmQuc3RhdHVzKTsKICAgICAgICAgICAgaWYgKGp1bXApIHNlbGVjdC5mb2N1c0FmdGVyTm9kZShmb3VuZC5ub2RlLnByZXZpb3VzU2libGluZywgdGhpcy5jb250YWluZXIpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9LAoKICAgIC8vIEFkanVzdCB0aGUgYW1vdW50IG9mIHdoaXRlc3BhY2UgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lIHRoYXQKICAgIC8vIHRoZSBjdXJzb3IgaXMgb24gc28gdGhhdCBpdCBpcyBpbmRlbnRlZCBwcm9wZXJseS4KICAgIGluZGVudEF0Q3Vyc29yOiBmdW5jdGlvbihkaXJlY3Rpb24pIHsKICAgICAgaWYgKCF0aGlzLmNvbnRhaW5lci5maXJzdENoaWxkKSByZXR1cm47CiAgICAgIC8vIFRoZSBsaW5lIGhhcyB0byBoYXZlIHVwLXRvLWRhdGUgbGV4aWNhbCBpbmZvcm1hdGlvbiwgc28gd2UKICAgICAgLy8gaGlnaGxpZ2h0IGl0IGZpcnN0LgogICAgICBpZiAoIXRoaXMuaGlnaGxpZ2h0QXRDdXJzb3IoKSkgcmV0dXJuOwogICAgICB2YXIgY3Vyc29yID0gc2VsZWN0LnNlbGVjdGlvblRvcE5vZGUodGhpcy5jb250YWluZXIsIGZhbHNlKTsKICAgICAgLy8gSWYgd2UgY291bGRuJ3QgZGV0ZXJtaW5lIHRoZSBwbGFjZSBvZiB0aGUgY3Vyc29yLAogICAgICAvLyB0aGVyZSdzIG5vdGhpbmcgdG8gaW5kZW50LgogICAgICBpZiAoY3Vyc29yID09PSBmYWxzZSkKICAgICAgICByZXR1cm47CiAgICAgIHZhciBsaW5lU3RhcnQgPSBzdGFydE9mTGluZShjdXJzb3IpOwogICAgICB2YXIgd2hpdGVTcGFjZSA9IHRoaXMuaW5kZW50TGluZUFmdGVyKGxpbmVTdGFydCwgZGlyZWN0aW9uKTsKICAgICAgaWYgKGN1cnNvciA9PSBsaW5lU3RhcnQgJmFtcDsmYW1wOyB3aGl0ZVNwYWNlKQogICAgICAgICAgY3Vyc29yID0gd2hpdGVTcGFjZTsKICAgICAgLy8gVGhpcyBtZWFucyB0aGUgaW5kZW50YXRpb24gaGFzIHByb2JhYmx5IG1lc3NlZCB1cCB0aGUgY3Vyc29yLgogICAgICBpZiAoY3Vyc29yID09IHdoaXRlU3BhY2UpCiAgICAgICAgc2VsZWN0LmZvY3VzQWZ0ZXJOb2RlKGN1cnNvciwgdGhpcy5jb250YWluZXIpOwogICAgfSwKCiAgICAvLyBJbmRlbnQgYWxsIGxpbmVzIHdob3NlIHN0YXJ0IGZhbGxzIGluc2lkZSBvZiB0aGUgY3VycmVudAogICAgLy8gc2VsZWN0aW9uLgogICAgaW5kZW50UmVnaW9uOiBmdW5jdGlvbihzdGFydCwgZW5kLCBkaXJlY3Rpb24pIHsKICAgICAgdmFyIGN1cnJlbnQgPSAoc3RhcnQgPSBzdGFydE9mTGluZShzdGFydCkpLCBiZWZvcmUgPSBzdGFydCAmYW1wOyZhbXA7IHN0YXJ0T2ZMaW5lKHN0YXJ0LnByZXZpb3VzU2libGluZyk7CiAgICAgIGlmIChlbmQubm9kZU5hbWUgIT0gIkJSIikgZW5kID0gZW5kT2ZMaW5lKGVuZCwgdGhpcy5jb250YWluZXIpOwoKICAgICAgZG8gewogICAgICAgIGlmIChjdXJyZW50KSB0aGlzLmhpZ2hsaWdodChiZWZvcmUsIGN1cnJlbnQsIHRydWUpOwogICAgICAgIHRoaXMuaW5kZW50TGluZUFmdGVyKGN1cnJlbnQsIGRpcmVjdGlvbik7CiAgICAgICAgYmVmb3JlID0gY3VycmVudDsKICAgICAgICBjdXJyZW50ID0gZW5kT2ZMaW5lKGN1cnJlbnQsIHRoaXMuY29udGFpbmVyKTsKICAgICAgfSB3aGlsZSAoY3VycmVudCAhPSBlbmQpOwogICAgICBzZWxlY3Quc2V0Q3Vyc29yUG9zKHRoaXMuY29udGFpbmVyLCB7bm9kZTogc3RhcnQsIG9mZnNldDogMH0sIHtub2RlOiBlbmQsIG9mZnNldDogMH0pOwogICAgfSwKCiAgICAvLyBGaW5kIHRoZSBub2RlIHRoYXQgdGhlIGN1cnNvciBpcyBpbiwgbWFyayBpdCBhcyBkaXJ0eSwgYW5kIG1ha2UKICAgIC8vIHN1cmUgYSBoaWdobGlnaHQgcGFzcyBpcyBzY2hlZHVsZWQuCiAgICBjdXJzb3JBY3Rpdml0eTogZnVuY3Rpb24oc2FmZSkgewogICAgICBpZiAoaW50ZXJuZXRFeHBsb3JlcikgewogICAgICAgIHRoaXMuY29udGFpbmVyLmNyZWF0ZVRleHRSYW5nZSgpLmV4ZWNDb21tYW5kKCJ1bmxpbmsiKTsKICAgICAgICB0aGlzLnNlbGVjdGlvblNuYXBzaG90ID0gc2VsZWN0LnNlbGVjdGlvbkNvb3Jkcyh0aGlzLndpbik7CiAgICAgIH0KCiAgICAgIHZhciBhY3Rpdml0eSA9IHRoaXMub3B0aW9ucy5jdXJzb3JBY3Rpdml0eTsKICAgICAgaWYgKCFzYWZlIHx8IGFjdGl2aXR5KSB7CiAgICAgICAgdmFyIGN1cnNvciA9IHNlbGVjdC5zZWxlY3Rpb25Ub3BOb2RlKHRoaXMuY29udGFpbmVyLCBmYWxzZSk7CiAgICAgICAgaWYgKGN1cnNvciA9PT0gZmFsc2UgfHwgIXRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQpIHJldHVybjsKICAgICAgICBjdXJzb3IgPSBjdXJzb3IgfHwgdGhpcy5jb250YWluZXIuZmlyc3RDaGlsZDsKICAgICAgICBpZiAoYWN0aXZpdHkpIGFjdGl2aXR5KGN1cnNvcik7CiAgICAgICAgaWYgKCFzYWZlKSB7CiAgICAgICAgICB0aGlzLnNjaGVkdWxlSGlnaGxpZ2h0KCk7CiAgICAgICAgICB0aGlzLmFkZERpcnR5Tm9kZShjdXJzb3IpOwogICAgICAgIH0KICAgICAgfQogICAgfSwKCiAgICByZXBhcnNlQnVmZmVyOiBmdW5jdGlvbigpIHsKICAgICAgZm9yRWFjaCh0aGlzLmNvbnRhaW5lci5jaGlsZE5vZGVzLCBmdW5jdGlvbihub2RlKSB7bm9kZS5kaXJ0eSA9IHRydWU7fSk7CiAgICAgIGlmICh0aGlzLmNvbnRhaW5lci5maXJzdENoaWxkKQogICAgICAgIHRoaXMuYWRkRGlydHlOb2RlKHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQpOwogICAgfSwKCiAgICAvLyBBZGQgYSBub2RlIHRvIHRoZSBzZXQgb2YgZGlydHkgbm9kZXMsIGlmIGl0IGlzbid0IGFscmVhZHkgaW4KICAgIC8vIHRoZXJlLgogICAgYWRkRGlydHlOb2RlOiBmdW5jdGlvbihub2RlKSB7CiAgICAgIG5vZGUgPSBub2RlIHx8IHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQ7CiAgICAgIGlmICghbm9kZSkgcmV0dXJuOwoKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgJmx0OyB0aGlzLmRpcnR5Lmxlbmd0aDsgaSsrKQogICAgICAgIGlmICh0aGlzLmRpcnR5W2ldID09IG5vZGUpIHJldHVybjsKCiAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9IDMpCiAgICAgICAgbm9kZS5kaXJ0eSA9IHRydWU7CiAgICAgIHRoaXMuZGlydHkucHVzaChub2RlKTsKICAgIH0sCgogICAgLy8gQ2F1c2UgYSBoaWdobGlnaHQgcGFzcyB0byBoYXBwZW4gaW4gb3B0aW9ucy5wYXNzRGVsYXkKICAgIC8vIG1pbGxpc2Vjb25kcy4gQ2xlYXIgdGhlIGV4aXN0aW5nIHRpbWVvdXQsIGlmIG9uZSBleGlzdHMuIFRoaXMKICAgIC8vIHdheSwgdGhlIHBhc3NlcyBkbyBub3QgaGFwcGVuIHdoaWxlIHRoZSB1c2VyIGlzIHR5cGluZywgYW5kCiAgICAvLyBzaG91bGQgYXMgdW5vYnRydXNpdmUgYXMgcG9zc2libGUuCiAgICBzY2hlZHVsZUhpZ2hsaWdodDogZnVuY3Rpb24oKSB7CiAgICAgIC8vIFRpbWVvdXRzIGFyZSByb3V0ZWQgdGhyb3VnaCB0aGUgcGFyZW50IHdpbmRvdywgYmVjYXVzZSBvbgogICAgICAvLyBzb21lIGJyb3dzZXJzIGRlc2lnbk1vZGUgd2luZG93cyBkbyBub3QgZmlyZSB0aW1lb3V0cy4KICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICB0aGlzLnBhcmVudC5jbGVhclRpbWVvdXQodGhpcy5oaWdobGlnaHRUaW1lb3V0KTsKICAgICAgdGhpcy5oaWdobGlnaHRUaW1lb3V0ID0gdGhpcy5wYXJlbnQuc2V0VGltZW91dChmdW5jdGlvbigpe3NlbGYuaGlnaGxpZ2h0RGlydHkoKTt9LCB0aGlzLm9wdGlvbnMucGFzc0RlbGF5KTsKICAgIH0sCgogICAgLy8gRmV0Y2ggb25lIGRpcnR5IG5vZGUsIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgZGlydHkgc2V0LgogICAgZ2V0RGlydHlOb2RlOiBmdW5jdGlvbigpIHsKICAgICAgd2hpbGUgKHRoaXMuZGlydHkubGVuZ3RoID4gMCkgewogICAgICAgIHZhciBmb3VuZCA9IHRoaXMuZGlydHkucG9wKCk7CiAgICAgICAgLy8gSUU4IHNvbWV0aW1lcyB0aHJvd3MgYW4gdW5leHBsYWluYWJsZSAnaW52YWxpZCBhcmd1bWVudCcKICAgICAgICAvLyBleGNlcHRpb24gZm9yIGZvdW5kLnBhcmVudE5vZGUKICAgICAgICB0cnkgewogICAgICAgICAgLy8gSWYgdGhlIG5vZGUgaGFzIGJlZW4gY29sb3VyZWQgaW4gdGhlIG1lYW50aW1lLCBvciBpcyBubwogICAgICAgICAgLy8gbG9uZ2VyIGluIHRoZSBkb2N1bWVudCwgaXQgc2hvdWxkIG5vdCBiZSByZXR1cm5lZC4KICAgICAgICAgIHdoaWxlIChmb3VuZCAmYW1wOyZhbXA7IGZvdW5kLnBhcmVudE5vZGUgIT0gdGhpcy5jb250YWluZXIpCiAgICAgICAgICAgIGZvdW5kID0gZm91bmQucGFyZW50Tm9kZQogICAgICAgICAgaWYgKGZvdW5kICZhbXA7JmFtcDsgKGZvdW5kLmRpcnR5IHx8IGZvdW5kLm5vZGVUeXBlID09IDMpKQogICAgICAgICAgICByZXR1cm4gZm91bmQ7CiAgICAgICAgfSBjYXRjaCAoZSkge30KICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH0sCgogICAgLy8gUGljayBkaXJ0eSBub2RlcywgYW5kIGhpZ2hsaWdodCB0aGVtLCB1bnRpbAogICAgLy8gb3B0aW9ucy5saW5lc1BlclBhc3MgbGluZXMgaGF2ZSBiZWVuIGhpZ2hsaWdodGVkLiBUaGUgaGlnaGxpZ2h0CiAgICAvLyBtZXRob2Qgd2lsbCBjb250aW51ZSB0byBuZXh0IGxpbmVzIGFzIGxvbmcgYXMgaXQgZmluZHMgZGlydHkKICAgIC8vIG5vZGVzLiBJdCByZXR1cm5zIGFuIG9iamVjdCBpbmRpY2F0aW5nIHRoZSBhbW91bnQgb2YgbGluZXMKICAgIC8vIGxlZnQsIGFuZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGxhY2Ugd2hlcmUgaXQgc3RvcHBlZC4gSWYKICAgIC8vIHRoZXJlIGFyZSBkaXJ0eSBub2RlcyBsZWZ0IGFmdGVyIHRoaXMgZnVuY3Rpb24gaGFzIHNwZW50IGFsbAogICAgLy8gaXRzIGxpbmVzLCBpdCBzaGVkdWxlcyBhbm90aGVyIGhpZ2hsaWdodCB0byBmaW5pc2ggdGhlIGpvYi4KICAgIGhpZ2hsaWdodERpcnR5OiBmdW5jdGlvbihmb3JjZSkgewogICAgICAvLyBQcmV2ZW50IEZGIGZyb20gcmFpc2luZyBhbiBlcnJvciB3aGVuIGl0IGlzIGZpcmluZyB0aW1lb3V0cwogICAgICAvLyBvbiBhIHBhZ2UgdGhhdCdzIG5vIGxvbmdlciBsb2FkZWQuCiAgICAgIGlmICghd2luZG93LnNlbGVjdCkgcmV0dXJuOwoKICAgICAgdmFyIGxpbmVzID0gZm9yY2UgPyBJbmZpbml0eSA6IHRoaXMub3B0aW9ucy5saW5lc1BlclBhc3M7CiAgICAgIGlmICghdGhpcy5vcHRpb25zLnJlYWRPbmx5KSBzZWxlY3QubWFya1NlbGVjdGlvbih0aGlzLndpbik7CiAgICAgIHZhciBzdGFydDsKICAgICAgd2hpbGUgKGxpbmVzID4gMCAmYW1wOyZhbXA7IChzdGFydCA9IHRoaXMuZ2V0RGlydHlOb2RlKCkpKXsKICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5oaWdobGlnaHQoc3RhcnQsIGxpbmVzKTsKICAgICAgICBpZiAocmVzdWx0KSB7CiAgICAgICAgICBsaW5lcyA9IHJlc3VsdC5sZWZ0OwogICAgICAgICAgaWYgKHJlc3VsdC5ub2RlICZhbXA7JmFtcDsgcmVzdWx0LmRpcnR5KQogICAgICAgICAgICB0aGlzLmFkZERpcnR5Tm9kZShyZXN1bHQubm9kZSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghdGhpcy5vcHRpb25zLnJlYWRPbmx5KSBzZWxlY3Quc2VsZWN0TWFya2VkKCk7CiAgICAgIGlmIChzdGFydCkKICAgICAgICB0aGlzLnNjaGVkdWxlSGlnaGxpZ2h0KCk7CiAgICAgIHJldHVybiB0aGlzLmRpcnR5Lmxlbmd0aCA9PSAwOwogICAgfSwKCiAgICAvLyBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQgdGhyb3VnaCBhIHRpbWVvdXQsIHdpbGwKICAgIC8vIGNvbnRpbnVvdXNseSByZS1wYXJzZSB0aGUgZG9jdW1lbnQuCiAgICBkb2N1bWVudFNjYW5uZXI6IGZ1bmN0aW9uKGxpbmVzUGVyKSB7CiAgICAgIHZhciBzZWxmID0gdGhpcywgcG9zID0gbnVsbDsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIC8vIElmIHRoZSBjdXJyZW50IG5vZGUgaXMgbm8gbG9uZ2VyIGluIHRoZSBkb2N1bWVudC4uLiBvaAogICAgICAgIC8vIHdlbGwsIHdlIHN0YXJ0IG92ZXIuCiAgICAgICAgaWYgKHBvcyAmYW1wOyZhbXA7IHBvcy5wYXJlbnROb2RlICE9IHNlbGYuY29udGFpbmVyKQogICAgICAgICAgcG9zID0gbnVsbDsKICAgICAgICBzZWxlY3QubWFya1NlbGVjdGlvbihzZWxmLndpbik7CiAgICAgICAgdmFyIHJlc3VsdCA9IHNlbGYuaGlnaGxpZ2h0KHBvcywgbGluZXNQZXIsIHRydWUpOwogICAgICAgIHNlbGVjdC5zZWxlY3RNYXJrZWQoKTsKICAgICAgICB2YXIgbmV3UG9zID0gcmVzdWx0ID8gKHJlc3VsdC5ub2RlICZhbXA7JmFtcDsgcmVzdWx0Lm5vZGUubmV4dFNpYmxpbmcpIDogbnVsbDsKICAgICAgICBwb3MgPSAocG9zID09IG5ld1BvcykgPyBudWxsIDogbmV3UG9zOwogICAgICAgIHNlbGYuZGVsYXlTY2FubmluZygpOwogICAgICB9OwogICAgfSwKCiAgICAvLyBTdGFydHMgdGhlIGNvbnRpbnVvdXMgc2Nhbm5pbmcgcHJvY2VzcyBmb3IgdGhpcyBkb2N1bWVudCBhZnRlcgogICAgLy8gYSBnaXZlbiBpbnRlcnZhbC4KICAgIGRlbGF5U2Nhbm5pbmc6IGZ1bmN0aW9uKCkgewogICAgICBpZiAodGhpcy5zY2FubmVyKSB7CiAgICAgICAgdGhpcy5wYXJlbnQuY2xlYXJUaW1lb3V0KHRoaXMuZG9jdW1lbnRTY2FuKTsKICAgICAgICB0aGlzLmRvY3VtZW50U2NhbiA9IHRoaXMucGFyZW50LnNldFRpbWVvdXQodGhpcy5zY2FubmVyLCB0aGlzLm9wdGlvbnMuY29udGludW91c1NjYW5uaW5nKTsKICAgICAgfQogICAgfSwKCiAgICAvLyBUaGUgZnVuY3Rpb24gdGhhdCBkb2VzIHRoZSBhY3R1YWwgaGlnaGxpZ2h0aW5nL2NvbG91cmluZyAod2l0aAogICAgLy8gaGVscCBmcm9tIHRoZSBwYXJzZXIgYW5kIHRoZSBET00gbm9ybWFsaXplcikuIEl0cyBpbnRlcmZhY2UgaXMKICAgIC8vIHJhdGhlciBvdmVyY29tcGxpY2F0ZWQsIGJlY2F1c2UgaXQgaXMgdXNlZCBpbiBkaWZmZXJlbnQKICAgIC8vIHNpdHVhdGlvbnM6IGVuc3VyaW5nIHRoYXQgYSBjZXJ0YWluIGxpbmUgaXMgaGlnaGxpZ2h0ZWQsIG9yCiAgICAvLyBoaWdobGlnaHRpbmcgdXAgdG8gWCBsaW5lcyBzdGFydGluZyBmcm9tIGEgY2VydGFpbiBwb2ludC4gVGhlCiAgICAvLyAnZnJvbScgYXJndW1lbnQgZ2l2ZXMgdGhlIG5vZGUgYXQgd2hpY2ggaXQgc2hvdWxkIHN0YXJ0LiBJZgogICAgLy8gdGhpcyBpcyBudWxsLCBpdCB3aWxsIHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRvY3VtZW50LgogICAgLy8gV2hlbiBhIG51bWJlciBvZiBsaW5lcyBpcyBnaXZlbiB3aXRoIHRoZSAndGFyZ2V0JyBhcmd1bWVudCwgaXQKICAgIC8vIHdpbGwgaGlnaGxpZ2h0IG5vIG1vcmUgdGhhbiB0aGF0IGFtb3VudCBvZiBsaW5lcy4gSWYgdGhpcwogICAgLy8gYXJndW1lbnQgaG9sZHMgYSBET00gbm9kZSwgaXQgd2lsbCBoaWdobGlnaHQgdW50aWwgaXQgcmVhY2hlcwogICAgLy8gdGhhdCBub2RlLiBJZiBhdCBhbnkgdGltZSBpdCBjb21lcyBhY3Jvc3MgYSAnY2xlYW4nIGxpbmUgKG5vCiAgICAvLyBkaXJ0eSBub2RlcyksIGl0IHdpbGwgc3RvcCwgZXhjZXB0IHdoZW4gJ2NsZWFuTGluZXMnIGlzIHRydWUuCiAgICBoaWdobGlnaHQ6IGZ1bmN0aW9uKGZyb20sIHRhcmdldCwgY2xlYW5MaW5lcywgbWF4QmFja3RyYWNrKXsKICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyLCBzZWxmID0gdGhpcywgYWN0aXZlID0gdGhpcy5vcHRpb25zLmFjdGl2ZVRva2VuczsKICAgICAgdmFyIGxpbmVzID0gKHR5cGVvZiB0YXJnZXQgPT0gIm51bWJlciIgPyB0YXJnZXQgOiBudWxsKTsKCiAgICAgIGlmICghY29udGFpbmVyLmZpcnN0Q2hpbGQpCiAgICAgICAgcmV0dXJuOwogICAgICAvLyBCYWNrdHJhY2sgdG8gdGhlIGZpcnN0IG5vZGUgYmVmb3JlIGZyb20gdGhhdCBoYXMgYSBwYXJ0aWFsCiAgICAgIC8vIHBhcnNlIHN0b3JlZC4KICAgICAgd2hpbGUgKGZyb20gJmFtcDsmYW1wOyAoIWZyb20ucGFyc2VyRnJvbUhlcmUgfHwgZnJvbS5kaXJ0eSkpIHsKICAgICAgICBmcm9tID0gZnJvbS5wcmV2aW91c1NpYmxpbmc7CiAgICAgICAgaWYgKG1heEJhY2t0cmFjayAhPSBudWxsICZhbXA7JmFtcDsgZnJvbS5ub2RlTmFtZSA9PSAiQlIiICZhbXA7JmFtcDsgKC0tbWF4QmFja3RyYWNrKSAmbHQ7IDApCiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgLy8gSWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LCBkbyBub3RoaW5nLgogICAgICBpZiAoZnJvbSAmYW1wOyZhbXA7ICFmcm9tLm5leHRTaWJsaW5nKQogICAgICAgIHJldHVybjsKCiAgICAgIC8vIENoZWNrIHdoZXRoZXIgYSBwYXJ0ICgmbHQ7c3Bhbj4gbm9kZSkgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHRva2VuCiAgICAgIC8vIG1hdGNoLgogICAgICBmdW5jdGlvbiBjb3JyZWN0UGFydCh0b2tlbiwgcGFydCl7CiAgICAgICAgcmV0dXJuICFwYXJ0LnJlZHVjZWQgJmFtcDsmYW1wOyBwYXJ0LmN1cnJlbnRUZXh0ID09IHRva2VuLnZhbHVlICZhbXA7JmFtcDsgcGFydC5jbGFzc05hbWUgPT0gdG9rZW4uc3R5bGU7CiAgICAgIH0KICAgICAgLy8gU2hvcnRlbiB0aGUgdGV4dCBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0IGJ5IGNob3BwaW5nIG9mZgogICAgICAvLyBjaGFyYWN0ZXJzIGZyb20gdGhlIGZyb250LiBOb3RlIHRoYXQgb25seSB0aGUgY3VycmVudFRleHQKICAgICAgLy8gcHJvcGVydHkgZ2V0cyBjaGFuZ2VkLiBGb3IgZWZmaWNpZW5jeSByZWFzb25zLCB3ZSBsZWF2ZSB0aGUKICAgICAgLy8gbm9kZVZhbHVlIGFsb25lIC0tIHdlIHNldCB0aGUgcmVkdWNlZCBmbGFnIHRvIGluZGljYXRlIHRoYXQKICAgICAgLy8gdGhpcyBwYXJ0IG11c3QgYmUgcmVwbGFjZWQuCiAgICAgIGZ1bmN0aW9uIHNob3J0ZW5QYXJ0KHBhcnQsIG1pbnVzKXsKICAgICAgICBwYXJ0LmN1cnJlbnRUZXh0ID0gcGFydC5jdXJyZW50VGV4dC5zdWJzdHJpbmcobWludXMpOwogICAgICAgIHBhcnQucmVkdWNlZCA9IHRydWU7CiAgICAgIH0KICAgICAgLy8gQ3JlYXRlIGEgcGFydCBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gdG9rZW4uCiAgICAgIGZ1bmN0aW9uIHRva2VuUGFydCh0b2tlbil7CiAgICAgICAgdmFyIHBhcnQgPSBtYWtlUGFydFNwYW4odG9rZW4udmFsdWUsIHNlbGYuZG9jKTsKICAgICAgICBwYXJ0LmNsYXNzTmFtZSA9IHRva2VuLnN0eWxlOwogICAgICAgIHJldHVybiBwYXJ0OwogICAgICB9CgogICAgICBmdW5jdGlvbiBtYXliZVRvdWNoKG5vZGUpIHsKICAgICAgICBpZiAobm9kZSkgewogICAgICAgICAgaWYgKG5vZGUubmV4dFNpYmxpbmcgIT0gbm9kZS5vbGROZXh0U2libGluZykgewogICAgICAgICAgICBzZWxmLmhpc3RvcnkudG91Y2gobm9kZSk7CiAgICAgICAgICAgIG5vZGUub2xkTmV4dFNpYmxpbmcgPSBub2RlLm5leHRTaWJsaW5nOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIGlmIChzZWxmLmNvbnRhaW5lci5maXJzdENoaWxkICE9IHNlbGYuY29udGFpbmVyLm9sZEZpcnN0Q2hpbGQpIHsKICAgICAgICAgICAgc2VsZi5oaXN0b3J5LnRvdWNoKG5vZGUpOwogICAgICAgICAgICBzZWxmLmNvbnRhaW5lci5vbGRGaXJzdENoaWxkID0gc2VsZi5jb250YWluZXIuZmlyc3RDaGlsZDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIEdldCB0aGUgdG9rZW4gc3RyZWFtLiBJZiBmcm9tIGlzIG51bGwsIHdlIHN0YXJ0IHdpdGggYSBuZXcKICAgICAgLy8gcGFyc2VyIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmcmFtZSwgb3RoZXJ3aXNlIGEgcGFydGlhbCBwYXJzZQogICAgICAvLyBpcyByZXN1bWVkLgogICAgICB2YXIgdHJhdmVyc2FsID0gdHJhdmVyc2VET00oZnJvbSA/IGZyb20ubmV4dFNpYmxpbmcgOiBjb250YWluZXIuZmlyc3RDaGlsZCksCiAgICAgICAgICBzdHJlYW0gPSBzdHJpbmdTdHJlYW0odHJhdmVyc2FsKSwKICAgICAgICAgIHBhcnNlZCA9IGZyb20gPyBmcm9tLnBhcnNlckZyb21IZXJlKHN0cmVhbSkgOiBFZGl0b3IuUGFyc2VyLm1ha2Uoc3RyZWFtKTsKCiAgICAgIC8vIHBhcnRzIGlzIGFuIGludGVyZmFjZSB0byBtYWtlIGl0IHBvc3NpYmxlIHRvICdkZWxheScgZmV0Y2hpbmcKICAgICAgLy8gdGhlIG5leHQgRE9NIG5vZGUgdW50aWwgd2UgYXJlIGNvbXBsZXRlbHkgZG9uZSB3aXRoIHRoZSBvbmUKICAgICAgLy8gYmVmb3JlIGl0LiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIG9mdGVuIHRoZSBuZXh0IG5vZGUgaXMKICAgICAgLy8gbm90IHlldCBhdmFpbGFibGUgd2hlbiB3ZSB3YW50IHRvIHByb2NlZWQgcGFzdCB0aGUgY3VycmVudAogICAgICAvLyBvbmUuCiAgICAgIHZhciBwYXJ0cyA9IHsKICAgICAgICBjdXJyZW50OiBudWxsLAogICAgICAgIC8vIEZldGNoIGN1cnJlbnQgbm9kZS4KICAgICAgICBnZXQ6IGZ1bmN0aW9uKCl7CiAgICAgICAgICBpZiAoIXRoaXMuY3VycmVudCkKICAgICAgICAgICAgdGhpcy5jdXJyZW50ID0gdHJhdmVyc2FsLm5vZGVzLnNoaWZ0KCk7CiAgICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50OwogICAgICAgIH0sCiAgICAgICAgLy8gQWR2YW5jZSB0byB0aGUgbmV4dCBwYXJ0IChkbyBub3QgZmV0Y2ggaXQgeWV0KS4KICAgICAgICBuZXh0OiBmdW5jdGlvbigpewogICAgICAgICAgdGhpcy5jdXJyZW50ID0gbnVsbDsKICAgICAgICB9LAogICAgICAgIC8vIFJlbW92ZSB0aGUgY3VycmVudCBwYXJ0IGZyb20gdGhlIERPTSB0cmVlLCBhbmQgbW92ZSB0byB0aGUKICAgICAgICAvLyBuZXh0LgogICAgICAgIHJlbW92ZTogZnVuY3Rpb24oKXsKICAgICAgICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZCh0aGlzLmdldCgpKTsKICAgICAgICAgIHRoaXMuY3VycmVudCA9IG51bGw7CiAgICAgICAgfSwKICAgICAgICAvLyBBZHZhbmNlIHRvIHRoZSBuZXh0IHBhcnQgdGhhdCBpcyBub3QgZW1wdHksIGRpc2NhcmRpbmcgZW1wdHkKICAgICAgICAvLyBwYXJ0cy4KICAgICAgICBnZXROb25FbXB0eTogZnVuY3Rpb24oKXsKICAgICAgICAgIHZhciBwYXJ0ID0gdGhpcy5nZXQoKTsKICAgICAgICAgIC8vIEFsbG93IGVtcHR5IG5vZGVzIHdoZW4gdGhleSBhcmUgYWxvbmUgb24gYSBsaW5lLCBuZWVkZWQKICAgICAgICAgIC8vIGZvciB0aGUgRkYgY3Vyc29yIGJ1ZyB3b3JrYXJvdW5kIChzZWUgc2VsZWN0LmpzLAogICAgICAgICAgLy8gaW5zZXJ0TmV3bGluZUF0Q3Vyc29yKS4KICAgICAgICAgIHdoaWxlIChwYXJ0ICZhbXA7JmFtcDsgcGFydC5ub2RlTmFtZSA9PSAiU1BBTiIgJmFtcDsmYW1wOyBwYXJ0LmN1cnJlbnRUZXh0ID09ICIiKSB7CiAgICAgICAgICAgIHZhciBvbGQgPSBwYXJ0OwogICAgICAgICAgICB0aGlzLnJlbW92ZSgpOwogICAgICAgICAgICBwYXJ0ID0gdGhpcy5nZXQoKTsKICAgICAgICAgICAgLy8gQWRqdXN0IHNlbGVjdGlvbiBpbmZvcm1hdGlvbiwgaWYgYW55LiBTZWUgc2VsZWN0LmpzIGZvciBkZXRhaWxzLgogICAgICAgICAgICBzZWxlY3Quc25hcHNob3RNb3ZlKG9sZC5maXJzdENoaWxkLCBwYXJ0ICZhbXA7JmFtcDsgKHBhcnQuZmlyc3RDaGlsZCB8fCBwYXJ0KSwgMCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gcGFydDsKICAgICAgICB9CiAgICAgIH07CgogICAgICB2YXIgbGluZURpcnR5ID0gZmFsc2UsIHByZXZMaW5lRGlydHkgPSB0cnVlLCBsaW5lTm9kZXMgPSAwOwoKICAgICAgLy8gVGhpcyBmb3JFYWNoIGxvb3BzIG92ZXIgdGhlIHRva2VucyBmcm9tIHRoZSBwYXJzZWQgc3RyZWFtLCBhbmQKICAgICAgLy8gYXQgdGhlIHNhbWUgdGltZSB1c2VzIHRoZSBwYXJ0cyBvYmplY3QgdG8gcHJvY2VlZCB0aHJvdWdoIHRoZQogICAgICAvLyBjb3JyZXNwb25kaW5nIERPTSBub2Rlcy4KICAgICAgZm9yRWFjaChwYXJzZWQsIGZ1bmN0aW9uKHRva2VuKXsKICAgICAgICB2YXIgcGFydCA9IHBhcnRzLmdldE5vbkVtcHR5KCk7CgogICAgICAgIGlmICh0b2tlbi52YWx1ZSA9PSAiXG4iKXsKICAgICAgICAgIC8vIFRoZSBpZGVhIG9mIHRoZSB0d28gc3RyZWFtcyBhY3R1YWxseSBzdGF5aW5nIHN5bmNocm9uaXplZAogICAgICAgICAgLy8gaXMgc3VjaCBhIGxvbmcgc2hvdCB0aGF0IHdlIGV4cGxpY2l0bHkgY2hlY2suCiAgICAgICAgICBpZiAocGFydC5ub2RlTmFtZSAhPSAiQlIiKQogICAgICAgICAgICB0aHJvdyAiUGFyc2VyIG91dCBvZiBzeW5jLiBFeHBlY3RlZCBCUi4iOwoKICAgICAgICAgIGlmIChwYXJ0LmRpcnR5IHx8ICFwYXJ0LmluZGVudGF0aW9uKSBsaW5lRGlydHkgPSB0cnVlOwogICAgICAgICAgbWF5YmVUb3VjaChmcm9tKTsKICAgICAgICAgIGZyb20gPSBwYXJ0OwoKICAgICAgICAgIC8vIEV2ZXJ5ICZsdDticj4gZ2V0cyBhIGNvcHkgb2YgdGhlIHBhcnNlciBzdGF0ZSBhbmQgYSBsZXhpY2FsCiAgICAgICAgICAvLyBjb250ZXh0IGFzc2lnbmVkIHRvIGl0LiBUaGUgZmlyc3QgaXMgdXNlZCB0byBiZSBhYmxlIHRvCiAgICAgICAgICAvLyBsYXRlciByZXN1bWUgcGFyc2luZyBmcm9tIHRoaXMgcG9pbnQsIHRoZSBzZWNvbmQgaXMgdXNlZAogICAgICAgICAgLy8gZm9yIGluZGVudGF0aW9uLgogICAgICAgICAgcGFydC5wYXJzZXJGcm9tSGVyZSA9IHBhcnNlZC5jb3B5KCk7CiAgICAgICAgICBwYXJ0LmluZGVudGF0aW9uID0gdG9rZW4uaW5kZW50YXRpb247CiAgICAgICAgICBwYXJ0LmRpcnR5ID0gZmFsc2U7CgogICAgICAgICAgLy8gSWYgdGhlIHRhcmdldCBhcmd1bWVudCB3YXNuJ3QgYW4gaW50ZWdlciwgZ28gYXQgbGVhc3QKICAgICAgICAgIC8vIHVudGlsIHRoYXQgbm9kZS4KICAgICAgICAgIGlmIChsaW5lcyA9PSBudWxsICZhbXA7JmFtcDsgcGFydCA9PSB0YXJnZXQpIHRocm93IFN0b3BJdGVyYXRpb247CgogICAgICAgICAgLy8gQSBjbGVhbiBsaW5lIHdpdGggbW9yZSB0aGFuIG9uZSBub2RlIG1lYW5zIHdlIGFyZSBkb25lLgogICAgICAgICAgLy8gVGhyb3dpbmcgYSBTdG9wSXRlcmF0aW9uIGlzIHRoZSB3YXkgdG8gYnJlYWsgb3V0IG9mIGEKICAgICAgICAgIC8vIE1vY2hpS2l0IGZvckVhY2ggbG9vcC4KICAgICAgICAgIGlmICgobGluZXMgIT0gbnVsbCAmYW1wOyZhbXA7IC0tbGluZXMgJmx0Oz0gMCkgfHwgKCFsaW5lRGlydHkgJmFtcDsmYW1wOyAhcHJldkxpbmVEaXJ0eSAmYW1wOyZhbXA7IGxpbmVOb2RlcyA+IDEgJmFtcDsmYW1wOyAhY2xlYW5MaW5lcykpCiAgICAgICAgICAgIHRocm93IFN0b3BJdGVyYXRpb247CiAgICAgICAgICBwcmV2TGluZURpcnR5ID0gbGluZURpcnR5OyBsaW5lRGlydHkgPSBmYWxzZTsgbGluZU5vZGVzID0gMDsKICAgICAgICAgIHBhcnRzLm5leHQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBpZiAocGFydC5ub2RlTmFtZSAhPSAiU1BBTiIpCiAgICAgICAgICAgIHRocm93ICJQYXJzZXIgb3V0IG9mIHN5bmMuIEV4cGVjdGVkIFNQQU4uIjsKICAgICAgICAgIGlmIChwYXJ0LmRpcnR5KQogICAgICAgICAgICBsaW5lRGlydHkgPSB0cnVlOwogICAgICAgICAgbGluZU5vZGVzKys7CgogICAgICAgICAgLy8gSWYgdGhlIHBhcnQgbWF0Y2hlcyB0aGUgdG9rZW4sIHdlIGNhbiBsZWF2ZSBpdCBhbG9uZS4KICAgICAgICAgIGlmIChjb3JyZWN0UGFydCh0b2tlbiwgcGFydCkpewogICAgICAgICAgICBwYXJ0LmRpcnR5ID0gZmFsc2U7CiAgICAgICAgICAgIHBhcnRzLm5leHQoKTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIE90aGVyd2lzZSwgd2UgaGF2ZSB0byBmaXggaXQuCiAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbGluZURpcnR5ID0gdHJ1ZTsKICAgICAgICAgICAgLy8gSW5zZXJ0IHRoZSBjb3JyZWN0IHBhcnQuCiAgICAgICAgICAgIHZhciBuZXdQYXJ0ID0gdG9rZW5QYXJ0KHRva2VuKTsKICAgICAgICAgICAgY29udGFpbmVyLmluc2VydEJlZm9yZShuZXdQYXJ0LCBwYXJ0KTsKICAgICAgICAgICAgaWYgKGFjdGl2ZSkgYWN0aXZlKG5ld1BhcnQsIHRva2VuLCBzZWxmKTsKICAgICAgICAgICAgdmFyIHRva2Vuc2l6ZSA9IHRva2VuLnZhbHVlLmxlbmd0aDsKICAgICAgICAgICAgdmFyIG9mZnNldCA9IDA7CiAgICAgICAgICAgIC8vIEVhdCB1cCBwYXJ0cyB1bnRpbCB0aGUgdGV4dCBmb3IgdGhpcyB0b2tlbiBoYXMgYmVlbgogICAgICAgICAgICAvLyByZW1vdmVkLCBhZGp1c3RpbmcgdGhlIHN0b3JlZCBzZWxlY3Rpb24gaW5mbyAoc2VlCiAgICAgICAgICAgIC8vIHNlbGVjdC5qcykgaW4gdGhlIHByb2Nlc3MuCiAgICAgICAgICAgIHdoaWxlICh0b2tlbnNpemUgPiAwKSB7CiAgICAgICAgICAgICAgcGFydCA9IHBhcnRzLmdldCgpOwogICAgICAgICAgICAgIHZhciBwYXJ0c2l6ZSA9IHBhcnQuY3VycmVudFRleHQubGVuZ3RoOwogICAgICAgICAgICAgIHNlbGVjdC5zbmFwc2hvdFJlcGxhY2VOb2RlKHBhcnQuZmlyc3RDaGlsZCwgbmV3UGFydC5maXJzdENoaWxkLCB0b2tlbnNpemUsIG9mZnNldCk7CiAgICAgICAgICAgICAgaWYgKHBhcnRzaXplID4gdG9rZW5zaXplKXsKICAgICAgICAgICAgICAgIHNob3J0ZW5QYXJ0KHBhcnQsIHRva2Vuc2l6ZSk7CiAgICAgICAgICAgICAgICB0b2tlbnNpemUgPSAwOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRva2Vuc2l6ZSAtPSBwYXJ0c2l6ZTsKICAgICAgICAgICAgICAgIG9mZnNldCArPSBwYXJ0c2l6ZTsKICAgICAgICAgICAgICAgIHBhcnRzLnJlbW92ZSgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICAgIG1heWJlVG91Y2goZnJvbSk7CiAgICAgIHdlYmtpdExhc3RMaW5lSGFjayh0aGlzLmNvbnRhaW5lcik7CgogICAgICAvLyBUaGUgZnVuY3Rpb24gcmV0dXJucyBzb21lIHN0YXR1cyBpbmZvcm1hdGlvbiB0aGF0IGlzIHVzZWQgYnkKICAgICAgLy8gaGlnaHRsaWdodERpcnR5IHRvIGRldGVybWluZSB3aGV0aGVyIGFuZCB3aGVyZSBpdCBoYXMgdG8KICAgICAgLy8gY29udGludWUuCiAgICAgIHJldHVybiB7bGVmdDogbGluZXMsCiAgICAgICAgICAgICAgbm9kZTogcGFydHMuZ2V0Tm9uRW1wdHkoKSwKICAgICAgICAgICAgICBkaXJ0eTogbGluZURpcnR5fTsKICAgIH0KICB9OwoKICByZXR1cm4gRWRpdG9yOwp9KSgpOwoKICBhZGRFdmVudEhhbmRsZXIod2luZG93LCAibG9hZCIsIGZ1bmN0aW9uKCkgewogICAgICB2YXIgQ29kZU1pcnJvciA9IHdpbmRvdy5mcmFtZUVsZW1lbnQuQ29kZU1pcnJvcjsKICAgICAgQ29kZU1pcnJvci5lZGl0b3IgPSBuZXcgRWRpdG9yKENvZGVNaXJyb3Iub3B0aW9ucyk7CiAgICAgIHRoaXMucGFyZW50LnNldFRpbWVvdXQobWV0aG9kKENvZGVNaXJyb3IsICJpbml0IiksIDApOwogIH0pOwo8L3RleHRhcmVhPgo8L2Rpdj4KCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KICB2YXIgdGV4dGFyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29kZScpOwogIHZhciBlZGl0b3IgPSBuZXcgQ29kZU1pcnJvcihDb2RlTWlycm9yLnJlcGxhY2UodGV4dGFyZWEpLCB7CiAgICBoZWlnaHQ6ICI3NTBweCIsCiAgICB3aWR0aDogIjEwMCUiLAogICAgY29udGVudDogdGV4dGFyZWEudmFsdWUsCiAgICBwYXJzZXJmaWxlOiBbInRva2VuaXplamF2YXNjcmlwdC5qcyIsICJwYXJzZWphdmFzY3JpcHQuanMiXSwKICAgIHN0eWxlc2hlZXQ6ICJjc3MvanNjb2xvcnMuY3NzIiwKICAgIHBhdGg6ICJqcy8iLAogICAgYXV0b01hdGNoUGFyZW5zOiB0cnVlLAogICAgaW5pdENhbGxiYWNrOiBmdW5jdGlvbihlZGl0b3Ipe2VkaXRvci53aW4uZG9jdW1lbnQuYm9keS5sYXN0Q2hpbGQuc2Nyb2xsSW50b1ZpZXcoKTt9CiAgfSk7Cjwvc2NyaXB0PgoKICA8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/csharp/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/csharp/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/csharp/css/csharpcolors.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aHRtbCB7CiAgY3Vyc29yOiB0ZXh0Owp9CgouZWRpdGJveCB7CiAgbWFyZ2luOiAuNGVtOwogIHBhZGRpbmc6IDA7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICBmb250LXNpemU6IDEwcHQ7CiAgY29sb3I6IGJsYWNrOwp9CgpwcmUuY29kZSwgLmVkaXRib3ggewogIGNvbG9yOiAjNjY2NjY2Owp9CgouZWRpdGJveCBwIHsKICBtYXJnaW46IDA7Cn0KCnNwYW4uY3NoYXJwLXB1bmN0dWF0aW9uIHsKICBjb2xvcjogZ3JlZW47Cn0KCnNwYW4uY3NoYXJwLW9wZXJhdG9yIHsKICBjb2xvcjogcHVycGxlOwp9CgpzcGFuLmNzaGFycC1rZXl3b3JkIHsKICBjb2xvcjogYmx1ZTsKfQoKc3Bhbi5jc2hhcnAtYXRvbSB7CiAgY29sb3I6IGJyb3duOwp9CgpzcGFuLmNzaGFycC12YXJpYWJsZSB7CiAgY29sb3I6IGJsYWNrOwp9CgpzcGFuLmNzaGFycC12YXJpYWJsZWRlZiB7CiAgY29sb3I6ICMwMDAwRkY7Cn0KCnNwYW4uY3NoYXJwLWxvY2FsdmFyaWFibGUgewogIGNvbG9yOiAjMDA0NDk5Owp9CgpzcGFuLmNzaGFycC1wcm9wZXJ0eSB7CiAgY29sb3I6IGJsYWNrOwp9CgpzcGFuLmNzaGFycC1jb21tZW50IHsKICBjb2xvcjogZ3JlZW47Cn0KCnNwYW4uY3NoYXJwLXN0cmluZyB7CiAgY29sb3I6IHJlZDsKfQoK]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/csharp/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHNjcmlwdCBzcmM9Ii4uLy4uL2pzL2NvZGVtaXJyb3IuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgICA8dGl0bGU+Q29kZU1pcnJvcjogQyMgZGVtb25zdHJhdGlvbjwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9jc3MvZG9jcy5jc3MiLz4KICA8L2hlYWQ+CiAgPGJvZHkgc3R5bGU9InBhZGRpbmc6IDIwcHg7Ij4KCjxwPkRlbW9uc3RyYXRpb24gb2YgPGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+Q29kZU1pcnJvcjwvYT4ncyBDIyBoaWdobGlnaHRlci48L3A+Cgo8cD5Xcml0dGVuIGJ5IDxhIGhyZWY9Imh0dHA6Ly9za2lsbHRlc3RpbmcuY29tLyI+Qm9yaXMgR2FiZXIgYW5kIENocmlzdG9waGVyIEJ1Y2hpbm88L2E+ICg8YQpocmVmPSJodHRwOi8vc2tpbGx0ZXN0aW5nLmNvbS9jb2RlbWlycm9yLXBhcnNlci1saWNlbnNlLyI+bGljZW5zZTwvYT4pLjwvcD4KCjxkaXYgY2xhc3M9ImJvcmRlciI+Cjx0ZXh0YXJlYSBpZD0iY29kZSIgY29scz0iMTIwIiByb3dzPSI1MCI+CnVzaW5nIFN5c3RlbTsKCm5hbWVzcGFjZSBFeGFtcGxlCnsKICAgIC8vLyAmbHQ7c3VtbWFyeT4KICAgIC8vLyBSZXByZXNlbnRzIGEgcGVyc29uIGVtcGxveWVkIGF0IHRoZSBjb21wYW55CiAgICAvLy8gJmx0Oy9zdW1tYXJ5PgogICAgcHVibGljIGNsYXNzIEVtcGxveWVlIDogUGVyc29uCiAgICB7CiAgICAgICAgI3JlZ2lvbiBQcm9wZXJ0aWVzCiAgICAgICAgCiAgICAgICAgLy8vICZsdDtzdW1tYXJ5PgogICAgICAgIC8vLyBHZXRzIG9yIHNldHMgdGhlIGZpcnN0IG5hbWUuCiAgICAgICAgLy8vICZsdDsvc3VtbWFyeT4KICAgICAgICAvLy8gJmx0O3ZhbHVlPlRoZSBmaXJzdCBuYW1lLiZsdDsvdmFsdWU+CiAgICAgICAgcHVibGljIHN0cmluZyBGaXJzdE5hbWUgeyBnZXQ7IHNldDsgfQoKICAgICAgICAjZW5kcmVnaW9uCgogICAgICAgIC8vLyAmbHQ7c3VtbWFyeT4KICAgICAgICAvLy8gQ2FsY3VsYXRlcyB0aGUgc2FsYXJ5LgogICAgICAgIC8vLyAmbHQ7L3N1bW1hcnk+CiAgICAgICAgLy8vICZsdDtwYXJhbSBuYW1lPSJncmFkZSI+VGhlIGdyYWRlLiZsdDsvcGFyYW0+CiAgICAgICAgLy8vICZsdDtyZXR1cm5zPiZsdDsvcmV0dXJucz4KICAgICAgICBwdWJsaWMgZGVjaW1hbCBDYWxjdWxhdGVTYWxhcnkoaW50IGdyYWRlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGdyYWRlID4gMTApCiAgICAgICAgICAgICAgICByZXR1cm4gMTAwMDsKICAgICAgICAgICAgcmV0dXJuIDUwMDsKICAgICAgICB9CiAgICB9Cn0KPC90ZXh0YXJlYT4KPC9kaXY+Cgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKCdjb2RlJywgewogICAgcGFyc2VyZmlsZTogWyIuLi9jb250cmliL2NzaGFycC9qcy90b2tlbml6ZWNzaGFycC5qcyIsICIuLi9jb250cmliL2NzaGFycC9qcy9wYXJzZWNzaGFycC5qcyJdLAogICAgc3R5bGVzaGVldDogImNzcy9jc2hhcnBjb2xvcnMuY3NzIiwKICAgIHBhdGg6ICIuLi8uLi9qcy8iLAogICAgaGVpZ2h0OiAiNTAwcHgiCiAgfSk7Cjwvc2NyaXB0PgoKPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/csharp/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/csharp/js/parsecsharp.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogUGFyc2UgZnVuY3Rpb24gZm9yIEphdmFTY3JpcHQuIE1ha2VzIHVzZSBvZiB0aGUgdG9rZW5pemVyIGZyb20KICogdG9rZW5pemVjc2hhcnAuanMuIE5vdGUgdGhhdCB5b3VyIHBhcnNlcnMgZG8gbm90IGhhdmUgdG8gYmUKICogdGhpcyBjb21wbGljYXRlZCAtLSBpZiB5b3UgZG9uJ3Qgd2FudCB0byByZWNvZ25pemUgbG9jYWwgdmFyaWFibGVzLAogKiBpbiBtYW55IGxhbmd1YWdlcyBpdCBpcyBlbm91Z2ggdG8ganVzdCBsb29rIGZvciBicmFjZXMsIHNlbWljb2xvbnMsCiAqIHBhcmVudGhlc2VzLCBldGMsIGFuZCBrbm93IHdoZW4geW91IGFyZSBpbnNpZGUgYSBzdHJpbmcgb3IgY29tbWVudC4KICoKICogU2VlIG1hbnVhbC5odG1sIGZvciBtb3JlIGluZm8gYWJvdXQgdGhlIHBhcnNlciBpbnRlcmZhY2UuCiAqLwoKdmFyIEpTUGFyc2VyID0gRWRpdG9yLlBhcnNlciA9IChmdW5jdGlvbigpIHsKICAvLyBUb2tlbiB0eXBlcyB0aGF0IGNhbiBiZSBjb25zaWRlcmVkIHRvIGJlIGF0b21zLgogIHZhciBhdG9taWNUeXBlcyA9IHsiYXRvbSI6IHRydWUsICJudW1iZXIiOiB0cnVlLCAidmFyaWFibGUiOiB0cnVlLCAic3RyaW5nIjogdHJ1ZSwgInJlZ2V4cCI6IHRydWV9OwogIC8vIFNldHRpbmcgdGhhdCBjYW4gYmUgdXNlZCB0byBoYXZlIEpTT04gZGF0YSBpbmRlbnQgcHJvcGVybHkuCiAgdmFyIGpzb24gPSBmYWxzZTsKICAvLyBDb25zdHJ1Y3RvciBmb3IgdGhlIGxleGljYWwgY29udGV4dCBvYmplY3RzLgogIGZ1bmN0aW9uIENTaGFycExleGljYWwoaW5kZW50ZWQsIGNvbHVtbiwgdHlwZSwgYWxpZ24sIHByZXYsIGluZm8pIHsKICAgIC8vIGluZGVudGF0aW9uIGF0IHN0YXJ0IG9mIHRoaXMgbGluZQogICAgdGhpcy5pbmRlbnRlZCA9IGluZGVudGVkOwogICAgLy8gY29sdW1uIGF0IHdoaWNoIHRoaXMgc2NvcGUgd2FzIG9wZW5lZAogICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47CiAgICAvLyB0eXBlIG9mIHNjb3BlICgndmFyZGVmJywgJ3N0YXQnIChzdGF0ZW1lbnQpLCAnZm9ybScgKHNwZWNpYWwgZm9ybSksICdbJywgJ3snLCBvciAnKCcpCiAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgLy8gJ1snLCAneycsIG9yICcoJyBibG9ja3MgdGhhdCBoYXZlIGFueSB0ZXh0IGFmdGVyIHRoZWlyIG9wZW5pbmcKICAgIC8vIGNoYXJhY3RlciBhcmUgc2FpZCB0byBiZSAnYWxpZ25lZCcgLS0gYW55IGxpbmVzIGJlbG93IGFyZQogICAgLy8gaW5kZW50ZWQgYWxsIHRoZSB3YXkgdG8gdGhlIG9wZW5pbmcgY2hhcmFjdGVyLgogICAgaWYgKGFsaWduICE9IG51bGwpCiAgICAgIHRoaXMuYWxpZ24gPSBhbGlnbjsKICAgIC8vIFBhcmVudCBzY29wZSwgaWYgYW55LgogICAgdGhpcy5wcmV2ID0gcHJldjsKICAgIHRoaXMuaW5mbyA9IGluZm87CiAgfQoKICAvLyBDU2hhcnAgaW5kZW50YXRpb24gcnVsZXMuCiAgZnVuY3Rpb24gaW5kZW50Q1NoYXJwKGxleGljYWwpIHsKICAgIHJldHVybiBmdW5jdGlvbihmaXJzdENoYXJzKSB7CiAgICAgIHZhciBmaXJzdENoYXIgPSBmaXJzdENoYXJzICYmIGZpcnN0Q2hhcnMuY2hhckF0KDApLCB0eXBlID0gbGV4aWNhbC50eXBlOwogICAgICB2YXIgY2xvc2luZyA9IGZpcnN0Q2hhciA9PSB0eXBlOwogICAgICBpZiAodHlwZSA9PSAidmFyZGVmIikKICAgICAgICByZXR1cm4gbGV4aWNhbC5pbmRlbnRlZCArIDQ7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImZvcm0iICYmIGZpcnN0Q2hhciA9PSAieyIpCiAgICAgICAgcmV0dXJuIGxleGljYWwuaW5kZW50ZWQ7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gInN0YXQiIHx8IHR5cGUgPT0gImZvcm0iKQogICAgICAgIHJldHVybiBsZXhpY2FsLmluZGVudGVkICsgaW5kZW50VW5pdDsKICAgICAgZWxzZSBpZiAobGV4aWNhbC5pbmZvID09ICJzd2l0Y2giICYmICFjbG9zaW5nKQogICAgICAgIHJldHVybiBsZXhpY2FsLmluZGVudGVkICsgKC9eKD86Y2FzZXxkZWZhdWx0KVxiLy50ZXN0KGZpcnN0Q2hhcnMpID8gaW5kZW50VW5pdCA6IDIgKiBpbmRlbnRVbml0KTsKICAgICAgZWxzZSBpZiAobGV4aWNhbC5hbGlnbikKICAgICAgICByZXR1cm4gbGV4aWNhbC5jb2x1bW4gLSAoY2xvc2luZyA/IDEgOiAwKTsKICAgICAgZWxzZQogICAgICAgIHJldHVybiBsZXhpY2FsLmluZGVudGVkICsgKGNsb3NpbmcgPyAwIDogaW5kZW50VW5pdCk7CiAgICB9OwogIH0KCiAgLy8gVGhlIHBhcnNlci1pdGVyYXRvci1wcm9kdWNpbmcgZnVuY3Rpb24gaXRzZWxmLgogIGZ1bmN0aW9uIHBhcnNlQ1NoYXJwKGlucHV0LCBiYXNlY29sdW1uKSB7CiAgICAvLyBXcmFwIHRoZSBpbnB1dCBpbiBhIHRva2VuIHN0cmVhbQogICAgdmFyIHRva2VucyA9IHRva2VuaXplQ1NoYXJwKGlucHV0KTsKICAgIC8vIFRoZSBwYXJzZXIgc3RhdGUuIGNjIGlzIGEgc3RhY2sgb2YgYWN0aW9ucyB0aGF0IGhhdmUgdG8gYmUKICAgIC8vIHBlcmZvcm1lZCB0byBmaW5pc2ggdGhlIGN1cnJlbnQgc3RhdGVtZW50LiBGb3IgZXhhbXBsZSB3ZSBtaWdodAogICAgLy8ga25vdyB0aGF0IHdlIHN0aWxsIG5lZWQgdG8gZmluZCBhIGNsb3NpbmcgcGFyZW50aGVzaXMgYW5kIGEKICAgIC8vIHNlbWljb2xvbi4gQWN0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSBzdGFjayBnbyBmaXJzdC4gSXQgaXMKICAgIC8vIGluaXRpYWxpemVkIHdpdGggYW4gaW5maW5pdGVseSBsb29waW5nIGFjdGlvbiB0aGF0IGNvbnN1bWVzCiAgICAvLyB3aG9sZSBzdGF0ZW1lbnRzLgogICAgdmFyIGNjID0gW3N0YXRlbWVudHNdOwogICAgLy8gVGhlIGxleGljYWwgc2NvcGUsIHVzZWQgbW9zdGx5IGZvciBpbmRlbnRhdGlvbi4KICAgIHZhciBsZXhpY2FsID0gbmV3IENTaGFycExleGljYWwoKGJhc2Vjb2x1bW4gfHwgMCkgLSBpbmRlbnRVbml0LCAwLCAiYmxvY2siLCBmYWxzZSk7CiAgICAvLyBDdXJyZW50IGNvbHVtbiwgYW5kIHRoZSBpbmRlbnRhdGlvbiBhdCB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQKICAgIC8vIGxpbmUuIFVzZWQgdG8gY3JlYXRlIGxleGljYWwgc2NvcGUgb2JqZWN0cy4KICAgIHZhciBjb2x1bW4gPSAwOwogICAgdmFyIGluZGVudGVkID0gMDsKICAgIC8vIFZhcmlhYmxlcyB3aGljaCBhcmUgdXNlZCBieSB0aGUgbWFyaywgY29udCwgYW5kIHBhc3MgZnVuY3Rpb25zCiAgICAvLyBiZWxvdyB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBkcml2ZXIgbG9vcCBpbiB0aGUgJ25leHQnCiAgICAvLyBmdW5jdGlvbi4KICAgIHZhciBjb25zdW1lLCBtYXJrZWQ7CiAgCiAgICAvLyBUaGUgaXRlcmF0b3Igb2JqZWN0LgogICAgdmFyIHBhcnNlciA9IHtuZXh0OiBuZXh0LCBjb3B5OiBjb3B5fTsKCiAgICBmdW5jdGlvbiBuZXh0KCl7CiAgICAgIC8vIFN0YXJ0IGJ5IHBlcmZvcm1pbmcgYW55ICdsZXhpY2FsJyBhY3Rpb25zIChhZGp1c3RpbmcgdGhlCiAgICAgIC8vIGxleGljYWwgdmFyaWFibGUpLCBvciB0aGUgb3BlcmF0aW9ucyBiZWxvdyB3aWxsIGJlIHdvcmtpbmcKICAgICAgLy8gd2l0aCB0aGUgd3JvbmcgbGV4aWNhbCBzdGF0ZS4KICAgICAgd2hpbGUoY2NbY2MubGVuZ3RoIC0gMV0ubGV4KQogICAgICAgIGNjLnBvcCgpKCk7CgogICAgICAvLyBGZXRjaCBhIHRva2VuLgogICAgICB2YXIgdG9rZW4gPSB0b2tlbnMubmV4dCgpOwoKICAgICAgLy8gQWRqdXN0IGNvbHVtbiBhbmQgaW5kZW50ZWQuCiAgICAgIGlmICh0b2tlbi50eXBlID09ICJ3aGl0ZXNwYWNlIiAmJiBjb2x1bW4gPT0gMCkKICAgICAgICBpbmRlbnRlZCA9IHRva2VuLnZhbHVlLmxlbmd0aDsKICAgICAgY29sdW1uICs9IHRva2VuLnZhbHVlLmxlbmd0aDsKICAgICAgaWYgKHRva2VuLmNvbnRlbnQgPT0gIlxuIil7CiAgICAgICAgaW5kZW50ZWQgPSBjb2x1bW4gPSAwOwogICAgICAgIC8vIElmIHRoZSBsZXhpY2FsIHNjb3BlJ3MgYWxpZ24gcHJvcGVydHkgaXMgc3RpbGwgdW5kZWZpbmVkIGF0CiAgICAgICAgLy8gdGhlIGVuZCBvZiB0aGUgbGluZSwgaXQgaXMgYW4gdW4tYWxpZ25lZCBzY29wZS4KICAgICAgICBpZiAoISgiYWxpZ24iIGluIGxleGljYWwpKQogICAgICAgICAgbGV4aWNhbC5hbGlnbiA9IGZhbHNlOwogICAgICAgIC8vIE5ld2xpbmUgdG9rZW5zIGdldCBhbiBpbmRlbnRhdGlvbiBmdW5jdGlvbiBhc3NvY2lhdGVkIHdpdGgKICAgICAgICAvLyB0aGVtLgogICAgICAgIHRva2VuLmluZGVudGF0aW9uID0gaW5kZW50Q1NoYXJwKGxleGljYWwpOwogICAgICB9CiAgICAgIC8vIE5vIG1vcmUgcHJvY2Vzc2luZyBmb3IgbWVhbmluZ2xlc3MgdG9rZW5zLgogICAgICBpZiAodG9rZW4udHlwZSA9PSAid2hpdGVzcGFjZSIgfHwgdG9rZW4udHlwZSA9PSAiY29tbWVudCIpCiAgICAgICAgcmV0dXJuIHRva2VuOwogICAgICAvLyBXaGVuIGEgbWVhbmluZ2Z1bCB0b2tlbiBpcyBmb3VuZCBhbmQgdGhlIGxleGljYWwgc2NvcGUncwogICAgICAvLyBhbGlnbiBpcyB1bmRlZmluZWQsIGl0IGlzIGFuIGFsaWduZWQgc2NvcGUuCiAgICAgIGlmICghKCJhbGlnbiIgaW4gbGV4aWNhbCkpCiAgICAgICAgbGV4aWNhbC5hbGlnbiA9IHRydWU7CgogICAgICAvLyBFeGVjdXRlIGFjdGlvbnMgdW50aWwgb25lICdjb25zdW1lcycgdGhlIHRva2VuIGFuZCB3ZSBjYW4KICAgICAgLy8gcmV0dXJuIGl0LgogICAgICB3aGlsZSh0cnVlKSB7CiAgICAgICAgY29uc3VtZSA9IG1hcmtlZCA9IGZhbHNlOwogICAgICAgIC8vIFRha2UgYW5kIGV4ZWN1dGUgdGhlIHRvcG1vc3QgYWN0aW9uLgogICAgICAgIGNjLnBvcCgpKHRva2VuLnR5cGUsIHRva2VuLmNvbnRlbnQpOwogICAgICAgIGlmIChjb25zdW1lKXsKICAgICAgICAgIC8vIE1hcmtlZCBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgc3R5bGUgb2YgdGhlIGN1cnJlbnQgdG9rZW4uCiAgICAgICAgICBpZiAobWFya2VkKQogICAgICAgICAgICB0b2tlbi5zdHlsZSA9IG1hcmtlZDsKICAgICAgICAgIHJldHVybiB0b2tlbjsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyBUaGlzIG1ha2VzIGEgY29weSBvZiB0aGUgcGFyc2VyIHN0YXRlLiBJdCBzdG9yZXMgYWxsIHRoZQogICAgLy8gc3RhdGVmdWwgdmFyaWFibGVzIGluIGEgY2xvc3VyZSwgYW5kIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0CiAgICAvLyB3aWxsIHJlc3RvcmUgdGhlbSB3aGVuIGNhbGxlZCB3aXRoIGEgbmV3IGlucHV0IHN0cmVhbS4gTm90ZQogICAgLy8gdGhhdCB0aGUgY2MgYXJyYXkgaGFzIHRvIGJlIGNvcGllZCwgYmVjYXVzZSBpdCBpcyBjb250YW50bHkKICAgIC8vIGJlaW5nIG1vZGlmaWVkLiBMZXhpY2FsIG9iamVjdHMgYXJlIG5vdCBtdXRhdGVkLCBhbmQgY29udGV4dAogICAgLy8gb2JqZWN0cyBhcmUgbm90IG11dGF0ZWQgaW4gYSBoYXJtZnVsIHdheSwgc28gdGhleSBjYW4gYmUgc2hhcmVkCiAgICAvLyBiZXR3ZWVuIHJ1bnMgb2YgdGhlIHBhcnNlci4KICAgIGZ1bmN0aW9uIGNvcHkoKXsKICAgICAgdmFyIF9sZXhpY2FsID0gbGV4aWNhbCwgX2NjID0gY2MuY29uY2F0KFtdKSwgX3Rva2VuU3RhdGUgPSB0b2tlbnMuc3RhdGU7CiAgCiAgICAgIHJldHVybiBmdW5jdGlvbiBjb3B5UGFyc2VyKGlucHV0KXsKICAgICAgICBsZXhpY2FsID0gX2xleGljYWw7CiAgICAgICAgY2MgPSBfY2MuY29uY2F0KFtdKTsgLy8gY29waWVzIHRoZSBhcnJheQogICAgICAgIGNvbHVtbiA9IGluZGVudGVkID0gMDsKICAgICAgICB0b2tlbnMgPSB0b2tlbml6ZUNTaGFycChpbnB1dCwgX3Rva2VuU3RhdGUpOwogICAgICAgIHJldHVybiBwYXJzZXI7CiAgICAgIH07CiAgICB9CgogICAgLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBwdXNoaW5nIGEgbnVtYmVyIG9mIGFjdGlvbnMgb250byB0aGUgY2MKICAgIC8vIHN0YWNrIGluIHJldmVyc2Ugb3JkZXIuCiAgICBmdW5jdGlvbiBwdXNoKGZzKXsKICAgICAgZm9yICh2YXIgaSA9IGZzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKQogICAgICAgIGNjLnB1c2goZnNbaV0pOwogICAgfQogICAgLy8gY29udCBhbmQgcGFzcyBhcmUgdXNlZCBieSB0aGUgYWN0aW9uIGZ1bmN0aW9ucyB0byBhZGQgb3RoZXIKICAgIC8vIGFjdGlvbnMgdG8gdGhlIHN0YWNrLiBjb250IHdpbGwgY2F1c2UgdGhlIGN1cnJlbnQgdG9rZW4gdG8gYmUKICAgIC8vIGNvbnN1bWVkLCBwYXNzIHdpbGwgbGVhdmUgaXQgZm9yIHRoZSBuZXh0IGFjdGlvbi4KICAgIGZ1bmN0aW9uIGNvbnQoKXsKICAgICAgcHVzaChhcmd1bWVudHMpOwogICAgICBjb25zdW1lID0gdHJ1ZTsKICAgIH0KICAgIGZ1bmN0aW9uIHBhc3MoKXsKICAgICAgcHVzaChhcmd1bWVudHMpOwogICAgICBjb25zdW1lID0gZmFsc2U7CiAgICB9CiAgICAvLyBVc2VkIHRvIGNoYW5nZSB0aGUgc3R5bGUgb2YgdGhlIGN1cnJlbnQgdG9rZW4uCiAgICBmdW5jdGlvbiBtYXJrKHN0eWxlKXsKICAgICAgbWFya2VkID0gc3R5bGU7CiAgICB9CgogICAgLy8gUHVzaCBhIG5ldyBsZXhpY2FsIGNvbnRleHQgb2YgdGhlIGdpdmVuIHR5cGUuCiAgICBmdW5jdGlvbiBwdXNobGV4KHR5cGUsIGluZm8pIHsKICAgICAgdmFyIHJlc3VsdCA9IGZ1bmN0aW9uKCl7CiAgICAgICAgbGV4aWNhbCA9IG5ldyBDU2hhcnBMZXhpY2FsKGluZGVudGVkLCBjb2x1bW4sIHR5cGUsIG51bGwsIGxleGljYWwsIGluZm8pCiAgICAgIH07CiAgICAgIHJlc3VsdC5sZXggPSB0cnVlOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgLy8gUG9wIG9mZiB0aGUgY3VycmVudCBsZXhpY2FsIGNvbnRleHQuCiAgICBmdW5jdGlvbiBwb3BsZXgoKXsKICAgICAgbGV4aWNhbCA9IGxleGljYWwucHJldjsKICAgIH0KICAgIHBvcGxleC5sZXggPSB0cnVlOwogICAgLy8gVGhlICdsZXgnIGZsYWcgb24gdGhlc2UgYWN0aW9ucyBpcyB1c2VkIGJ5IHRoZSAnbmV4dCcgZnVuY3Rpb24KICAgIC8vIHRvIGtub3cgdGhleSBjYW4gKGFuZCBoYXZlIHRvKSBiZSByYW4gYmVmb3JlIG1vdmluZyBvbiB0byB0aGUKICAgIC8vIG5leHQgdG9rZW4uCiAgCiAgICAvLyBDcmVhdGVzIGFuIGFjdGlvbiB0aGF0IGRpc2NhcmRzIHRva2VucyB1bnRpbCBpdCBmaW5kcyBvbmUgb2YKICAgIC8vIHRoZSBnaXZlbiB0eXBlLgogICAgZnVuY3Rpb24gZXhwZWN0KHdhbnRlZCl7CiAgICAgIHJldHVybiBmdW5jdGlvbiBleHBlY3RpbmcodHlwZSl7CiAgICAgICAgaWYgKHR5cGUgPT0gd2FudGVkKSBjb250KCk7CiAgICAgICAgZWxzZSBjb250KGFyZ3VtZW50cy5jYWxsZWUpOwogICAgICB9OwogICAgfQoKICAgIC8vIExvb2tzIGZvciBhIHN0YXRlbWVudCwgYW5kIHRoZW4gY2FsbHMgaXRzZWxmLgogICAgZnVuY3Rpb24gc3RhdGVtZW50cyh0eXBlKXsKICAgICAgcmV0dXJuIHBhc3Moc3RhdGVtZW50LCBzdGF0ZW1lbnRzKTsKICAgIH0KICAgIC8vIERpc3BhdGNoZXMgdmFyaW91cyB0eXBlcyBvZiBzdGF0ZW1lbnRzIGJhc2VkIG9uIHRoZSB0eXBlIG9mIHRoZQogICAgLy8gY3VycmVudCB0b2tlbi4KICAgIGZ1bmN0aW9uIHN0YXRlbWVudCh0eXBlKXsKICAgICAgaWYgKHR5cGUgPT0gInZhciIpIGNvbnQocHVzaGxleCgidmFyZGVmIiksIHZhcmRlZjEsIGV4cGVjdCgiOyIpLCBwb3BsZXgpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJrZXl3b3JkIGEiKSBjb250KHB1c2hsZXgoImZvcm0iKSwgZXhwcmVzc2lvbiwgc3RhdGVtZW50LCBwb3BsZXgpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJrZXl3b3JkIGIiKSBjb250KHB1c2hsZXgoImZvcm0iKSwgc3RhdGVtZW50LCBwb3BsZXgpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJ7IiAmJiBqc29uKSBjb250KHB1c2hsZXgoIn0iKSwgY29tbWFzZXAob2JqcHJvcCwgIn0iKSwgcG9wbGV4KTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAieyIpIGNvbnQocHVzaGxleCgifSIpLCBibG9jaywgcG9wbGV4KTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiZnVuY3Rpb24iKSBjb250KGZ1bmN0aW9uZGVmKTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiZm9yIikgY29udChwdXNobGV4KCJmb3JtIiksIGV4cGVjdCgiKCIpLCBwdXNobGV4KCIpIiksIGZvcnNwZWMxLCBleHBlY3QoIikiKSwgcG9wbGV4LCBzdGF0ZW1lbnQsIHBvcGxleCk7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gInZhcmlhYmxlIikgY29udChwdXNobGV4KCJzdGF0IiksIG1heWJlbGFiZWwpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJzd2l0Y2giKSBjb250KHB1c2hsZXgoImZvcm0iKSwgZXhwcmVzc2lvbiwgcHVzaGxleCgifSIsICJzd2l0Y2giKSwgZXhwZWN0KCJ7IiksIGJsb2NrLCBwb3BsZXgsIHBvcGxleCk7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImNhc2UiKSBjb250KGV4cHJlc3Npb24sIGV4cGVjdCgiOiIpKTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiZGVmYXVsdCIpIGNvbnQoZXhwZWN0KCI6IikpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJjYXRjaCIpIGNvbnQocHVzaGxleCgiZm9ybSIpLCBleHBlY3QoIigiKSwgZnVuYXJnLCBleHBlY3QoIikiKSwgc3RhdGVtZW50LCBwb3BsZXgpOwogICAgICAKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiY2xhc3MiKSBjb250KGNsYXNzZGVmKTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAia2V5d29yZCBkIikgY29udChzdGF0ZW1lbnQpOwogICAgICAKICAgICAgZWxzZSBwYXNzKHB1c2hsZXgoInN0YXQiKSwgZXhwcmVzc2lvbiwgZXhwZWN0KCI7IiksIHBvcGxleCk7CiAgICB9CiAgICAvLyBEaXNwYXRjaCBleHByZXNzaW9uIHR5cGVzLgogICAgZnVuY3Rpb24gZXhwcmVzc2lvbih0eXBlKXsKICAgICAgaWYgKGF0b21pY1R5cGVzLmhhc093blByb3BlcnR5KHR5cGUpKSBjb250KG1heWJlb3BlcmF0b3IpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJmdW5jdGlvbiIpIGNvbnQoZnVuY3Rpb25kZWYpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJrZXl3b3JkIGMiKSBjb250KGV4cHJlc3Npb24pOwogICAgICBlbHNlIGlmICh0eXBlID09ICIoIikgY29udChwdXNobGV4KCIpIiksIGV4cHJlc3Npb24sIGV4cGVjdCgiKSIpLCBwb3BsZXgsIG1heWJlb3BlcmF0b3IpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJvcGVyYXRvciIpIGNvbnQoZXhwcmVzc2lvbik7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIlsiKSBjb250KHB1c2hsZXgoIl0iKSwgY29tbWFzZXAoZXhwcmVzc2lvbiwgIl0iKSwgcG9wbGV4LCBtYXliZW9wZXJhdG9yKTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAieyIpIGNvbnQocHVzaGxleCgifSIpLCBjb21tYXNlcChvYmpwcm9wLCAifSIpLCBwb3BsZXgsIG1heWJlb3BlcmF0b3IpOwogICAgfQogICAgLy8gQ2FsbGVkIGZvciBwbGFjZXMgd2hlcmUgb3BlcmF0b3JzLCBmdW5jdGlvbiBjYWxscywgb3IKICAgIC8vIHN1YnNjcmlwdHMgYXJlIHZhbGlkLiBXaWxsIHNraXAgb24gdG8gdGhlIG5leHQgYWN0aW9uIGlmIG5vbmUKICAgIC8vIGlzIGZvdW5kLgogICAgZnVuY3Rpb24gbWF5YmVvcGVyYXRvcih0eXBlKXsKICAgICAgaWYgKHR5cGUgPT0gIm9wZXJhdG9yIikgY29udChleHByZXNzaW9uKTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiKCIpIGNvbnQocHVzaGxleCgiKSIpLCBleHByZXNzaW9uLCBjb21tYXNlcChleHByZXNzaW9uLCAiKSIpLCBwb3BsZXgsIG1heWJlb3BlcmF0b3IpOwogICAgICBlbHNlIGlmICh0eXBlID09ICIuIikgY29udChwcm9wZXJ0eSwgbWF5YmVvcGVyYXRvcik7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIlsiKSBjb250KHB1c2hsZXgoIl0iKSwgZXhwcmVzc2lvbiwgZXhwZWN0KCJdIiksIHBvcGxleCwgbWF5YmVvcGVyYXRvcik7CiAgICB9CiAgICAvLyBXaGVuIGEgc3RhdGVtZW50IHN0YXJ0cyB3aXRoIGEgdmFyaWFibGUgbmFtZSwgaXQgbWlnaHQgYmUgYQogICAgLy8gbGFiZWwuIElmIG5vIGNvbG9uIGZvbGxvd3MsIGl0J3MgYSByZWd1bGFyIHN0YXRlbWVudC4KICAgIGZ1bmN0aW9uIG1heWJlbGFiZWwodHlwZSl7CiAgICAgIGlmICh0eXBlID09ICI6IikgY29udChwb3BsZXgsIHN0YXRlbWVudCk7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIigiKSBjb250KGNvbW1hc2VwKGZ1bmFyZywgIikiKSwgcG9wbGV4LCBzdGF0ZW1lbnQpOyAvLyBtZXRob2QgZGVmaW5pdGlvbgogICAgICBlbHNlIGlmICh0eXBlID09ICJ7IikgY29udChwb3BsZXgsIHB1c2hsZXgoIn0iKSwgYmxvY2ssIHBvcGxleCk7IC8vIHByb3BlcnR5IGRlZmluaXRpb24KICAgICAgZWxzZSBwYXNzKG1heWJlb3BlcmF0b3IsIGV4cGVjdCgiOyIpLCBwb3BsZXgpOwogICAgfQogICAgLy8gUHJvcGVydHkgbmFtZXMgbmVlZCB0byBoYXZlIHRoZWlyIHN0eWxlIGFkanVzdGVkIC0tIHRoZQogICAgLy8gdG9rZW5pemVyIHRoaW5rcyB0aGV5IGFyZSB2YXJpYWJsZXMuCiAgICBmdW5jdGlvbiBwcm9wZXJ0eSh0eXBlKXsKICAgICAgaWYgKHR5cGUgPT0gInZhcmlhYmxlIikge21hcmsoImNzaGFycC1wcm9wZXJ0eSIpOyBjb250KCk7fQogICAgfQogICAgLy8gVGhpcyBwYXJzZXMgYSBwcm9wZXJ0eSBhbmQgaXRzIHZhbHVlIGluIGFuIG9iamVjdCBsaXRlcmFsLgogICAgZnVuY3Rpb24gb2JqcHJvcCh0eXBlKXsKICAgICAgaWYgKHR5cGUgPT0gInZhcmlhYmxlIikgbWFyaygiY3NoYXJwLXByb3BlcnR5Iik7CiAgICAgIGlmIChhdG9taWNUeXBlcy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgY29udChleHBlY3QoIjoiKSwgZXhwcmVzc2lvbik7CiAgICB9CiAgICAvLyBQYXJzZXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0aGUgdGhpbmdzIHRoYXQgYXJlIHJlY29nbml6ZWQKICAgIC8vIGJ5IHRoZSAnd2hhdCcgYXJndW1lbnQuCiAgICBmdW5jdGlvbiBjb21tYXNlcCh3aGF0LCBlbmQpewogICAgICBmdW5jdGlvbiBwcm9jZWVkKHR5cGUpIHsKICAgICAgICBpZiAodHlwZSA9PSAiLCIpIGNvbnQod2hhdCwgcHJvY2VlZCk7CiAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBlbmQpIGNvbnQoKTsKICAgICAgICBlbHNlIGNvbnQoZXhwZWN0KGVuZCkpOwogICAgICB9OwogICAgICByZXR1cm4gZnVuY3Rpb24gY29tbWFTZXBhcmF0ZWQodHlwZSkgewogICAgICAgIGlmICh0eXBlID09IGVuZCkgY29udCgpOwogICAgICAgIGVsc2UgcGFzcyh3aGF0LCBwcm9jZWVkKTsKICAgICAgfTsKICAgIH0KICAgIC8vIExvb2sgZm9yIHN0YXRlbWVudHMgdW50aWwgYSBjbG9zaW5nIGJyYWNlIGlzIGZvdW5kLgogICAgZnVuY3Rpb24gYmxvY2sodHlwZSl7CiAgICAgIGlmICh0eXBlID09ICJ9IikgY29udCgpOwogICAgICBlbHNlIHBhc3Moc3RhdGVtZW50LCBibG9jayk7CiAgICB9CiAgICAvLyBWYXJpYWJsZSBkZWZpbml0aW9ucyBhcmUgc3BsaXQgaW50byB0d28gYWN0aW9ucyAtLSAxIGxvb2tzIGZvcgogICAgLy8gYSBuYW1lIG9yIHRoZSBlbmQgb2YgdGhlIGRlZmluaXRpb24sIDIgbG9va3MgZm9yIGFuICc9JyBzaWduIG9yCiAgICAvLyBhIGNvbW1hLgogICAgZnVuY3Rpb24gdmFyZGVmMSh0eXBlLCB2YWx1ZSl7CiAgICAgIGlmICh0eXBlID09ICJ2YXJpYWJsZSIpe2NvbnQodmFyZGVmMik7fQogICAgICBlbHNlIGNvbnQoKTsKICAgIH0KICAgIGZ1bmN0aW9uIHZhcmRlZjIodHlwZSwgdmFsdWUpewogICAgICBpZiAodmFsdWUgPT0gIj0iKSBjb250KGV4cHJlc3Npb24sIHZhcmRlZjIpOwogICAgICBlbHNlIGlmICh0eXBlID09ICIsIikgY29udCh2YXJkZWYxKTsKICAgIH0KICAgIC8vIEZvciBsb29wcy4KICAgIGZ1bmN0aW9uIGZvcnNwZWMxKHR5cGUpewogICAgICBpZiAodHlwZSA9PSAidmFyIikgY29udCh2YXJkZWYxLCBmb3JzcGVjMik7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIjsiKSBwYXNzKGZvcnNwZWMyKTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAidmFyaWFibGUiKSBjb250KGZvcm1heWJlaW4pOwogICAgICBlbHNlIHBhc3MoZm9yc3BlYzIpOwogICAgfQogICAgZnVuY3Rpb24gZm9ybWF5YmVpbih0eXBlLCB2YWx1ZSl7CiAgICAgIGlmICh2YWx1ZSA9PSAiaW4iKSBjb250KGV4cHJlc3Npb24pOwogICAgICBlbHNlIGNvbnQobWF5YmVvcGVyYXRvciwgZm9yc3BlYzIpOwogICAgfQogICAgZnVuY3Rpb24gZm9yc3BlYzIodHlwZSwgdmFsdWUpewogICAgICBpZiAodHlwZSA9PSAiOyIpIGNvbnQoZm9yc3BlYzMpOwogICAgICBlbHNlIGlmICh2YWx1ZSA9PSAiaW4iKSBjb250KGV4cHJlc3Npb24pOwogICAgICBlbHNlIGNvbnQoZXhwcmVzc2lvbiwgZXhwZWN0KCI7IiksIGZvcnNwZWMzKTsKICAgIH0KICAgIGZ1bmN0aW9uIGZvcnNwZWMzKHR5cGUpIHsKICAgICAgaWYgKHR5cGUgPT0gIikiKSBwYXNzKCk7CiAgICAgIGVsc2UgY29udChleHByZXNzaW9uKTsKICAgIH0KICAgIC8vIEEgZnVuY3Rpb24gZGVmaW5pdGlvbiBjcmVhdGVzIGEgbmV3IGNvbnRleHQsIGFuZCB0aGUgdmFyaWFibGVzCiAgICAvLyBpbiBpdHMgYXJndW1lbnQgbGlzdCBoYXZlIHRvIGJlIGFkZGVkIHRvIHRoaXMgY29udGV4dC4KICAgIGZ1bmN0aW9uIGZ1bmN0aW9uZGVmKHR5cGUsIHZhbHVlKXsKICAgICAgaWYgKHR5cGUgPT0gInZhcmlhYmxlIikgY29udChmdW5jdGlvbmRlZik7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIigiKSBjb250KGNvbW1hc2VwKGZ1bmFyZywgIikiKSwgc3RhdGVtZW50KTsKICAgIH0KICAgIGZ1bmN0aW9uIGZ1bmFyZyh0eXBlLCB2YWx1ZSl7CiAgICAgIGlmICh0eXBlID09ICJ2YXJpYWJsZSIpe2NvbnQoKTt9CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGNsYXNzZGVmKHR5cGUpIHsKICAgICAgICBpZiAodHlwZSA9PSAidmFyaWFibGUiKSBjb250KGNsYXNzZGVmLCBzdGF0ZW1lbnQpOwogICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIjoiKSBjb250KGNsYXNzZGVmLCBzdGF0ZW1lbnQpOwogICAgfQogIAogICAgcmV0dXJuIHBhcnNlcjsKICB9CgogIHJldHVybiB7CiAgICBtYWtlOiBwYXJzZUNTaGFycCwKICAgIGVsZWN0cmljQ2hhcnM6ICJ7fToiLAogICAgY29uZmlndXJlOiBmdW5jdGlvbihvYmopIHsKICAgICAgaWYgKG9iai5qc29uICE9IG51bGwpIGpzb24gPSBvYmouanNvbjsKICAgIH0KICB9Owp9KSgpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/csharp/js/tokenizecsharp.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogVG9rZW5pemVyIGZvciBDU2hhcnAgY29kZSAqLwoKdmFyIHRva2VuaXplQ1NoYXJwID0gKGZ1bmN0aW9uKCkgewogIC8vIEFkdmFuY2UgdGhlIHN0cmVhbSB1bnRpbCB0aGUgZ2l2ZW4gY2hhcmFjdGVyIChub3QgcHJlY2VkZWQgYnkgYQogIC8vIGJhY2tzbGFzaCkgaXMgZW5jb3VudGVyZWQsIG9yIHRoZSBlbmQgb2YgdGhlIGxpbmUgaXMgcmVhY2hlZC4KICBmdW5jdGlvbiBuZXh0VW50aWxVbmVzY2FwZWQoc291cmNlLCBlbmQpIHsKICAgIHZhciBlc2NhcGVkID0gZmFsc2U7CiAgICB2YXIgbmV4dDsKICAgIHdoaWxlICghc291cmNlLmVuZE9mTGluZSgpKSB7CiAgICAgIHZhciBuZXh0ID0gc291cmNlLm5leHQoKTsKICAgICAgaWYgKG5leHQgPT0gZW5kICYmICFlc2NhcGVkKQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIG5leHQgPT0gIlxcIjsKICAgIH0KICAgIHJldHVybiBlc2NhcGVkOwogIH0KCiAgLy8gQSBtYXAgb2YgSmF2YVNjcmlwdCdzIGtleXdvcmRzLiBUaGUgYS9iL2Mga2V5d29yZCBkaXN0aW5jdGlvbiBpcwogIC8vIHZlcnkgcm91Z2gsIGJ1dCBpdCBnaXZlcyB0aGUgcGFyc2VyIGVub3VnaCBpbmZvcm1hdGlvbiB0byBwYXJzZQogIC8vIGNvcnJlY3QgY29kZSBjb3JyZWN0bHkgKHdlIGRvbid0IGNhcmUgdGhhdCBtdWNoIGhvdyB3ZSBwYXJzZQogIC8vIGluY29ycmVjdCBjb2RlKS4gVGhlIHN0eWxlIGluZm9ybWF0aW9uIGluY2x1ZGVkIGluIHRoZXNlIG9iamVjdHMKICAvLyBpcyB1c2VkIGJ5IHRoZSBoaWdobGlnaHRlciB0byBwaWNrIHRoZSBjb3JyZWN0IENTUyBzdHlsZSBmb3IgYQogIC8vIHRva2VuLgogIHZhciBrZXl3b3JkcyA9IGZ1bmN0aW9uKCl7CiAgICBmdW5jdGlvbiByZXN1bHQodHlwZSwgc3R5bGUpewogICAgICByZXR1cm4ge3R5cGU6IHR5cGUsIHN0eWxlOiAiY3NoYXJwLSIgKyBzdHlsZX07CiAgICB9CiAgICAvLyBrZXl3b3JkcyB0aGF0IHRha2UgYSBwYXJlbnRoaXNlZCBleHByZXNzaW9uLCBhbmQgdGhlbiBhCiAgICAvLyBzdGF0ZW1lbnQgKGlmKQogICAgdmFyIGtleXdvcmRBID0gcmVzdWx0KCJrZXl3b3JkIGEiLCAia2V5d29yZCIpOwogICAgLy8ga2V5d29yZHMgdGhhdCB0YWtlIGp1c3QgYSBzdGF0ZW1lbnQgKGVsc2UpCiAgICB2YXIga2V5d29yZEIgPSByZXN1bHQoImtleXdvcmQgYiIsICJrZXl3b3JkIik7CiAgICAvLyBrZXl3b3JkcyB0aGF0IG9wdGlvbmFsbHkgdGFrZSBhbiBleHByZXNzaW9uLCBhbmQgZm9ybSBhCiAgICAvLyBzdGF0ZW1lbnQgKHJldHVybikKICAgIHZhciBrZXl3b3JkQyA9IHJlc3VsdCgia2V5d29yZCBjIiwgImtleXdvcmQiKTsKICAgIHZhciBvcGVyYXRvciA9IHJlc3VsdCgib3BlcmF0b3IiLCAia2V5d29yZCIpOwogICAgdmFyIGF0b20gPSByZXN1bHQoImF0b20iLCAiYXRvbSIpOwogICAgLy8ganVzdCBhIGtleXdvcmQgd2l0aCBubyBpbmRlbnRhdGlvbiBpbXBsaWNhdGlvbnMKICAgIHZhciBrZXl3b3JkRCA9IHJlc3VsdCgia2V5d29yZCBkIiwgImtleXdvcmQiKTsgCiAgICAKICAgIHJldHVybiB7CiAgICAgICJpZiI6IGtleXdvcmRBLCAid2hpbGUiOiBrZXl3b3JkQSwgIndpdGgiOiBrZXl3b3JkQSwKICAgICAgImVsc2UiOiBrZXl3b3JkQiwgImRvIjoga2V5d29yZEIsICJ0cnkiOiBrZXl3b3JkQiwgImZpbmFsbHkiOiBrZXl3b3JkQiwKICAgICAgInJldHVybiI6IGtleXdvcmRDLCAiYnJlYWsiOiBrZXl3b3JkQywgImNvbnRpbnVlIjoga2V5d29yZEMsICJuZXciOiBrZXl3b3JkQywgImRlbGV0ZSI6IGtleXdvcmRDLCAidGhyb3ciOiBrZXl3b3JkQywKICAgICAgImluIjogb3BlcmF0b3IsICJ0eXBlb2YiOiBvcGVyYXRvciwgImluc3RhbmNlb2YiOiBvcGVyYXRvciwKICAgICAgInZhciI6IHJlc3VsdCgidmFyIiwgImtleXdvcmQiKSwgImZ1bmN0aW9uIjogcmVzdWx0KCJmdW5jdGlvbiIsICJrZXl3b3JkIiksICJjYXRjaCI6IHJlc3VsdCgiY2F0Y2giLCAia2V5d29yZCIpLAogICAgICAiZm9yIjogcmVzdWx0KCJmb3IiLCAia2V5d29yZCIpLCAic3dpdGNoIjogcmVzdWx0KCJzd2l0Y2giLCAia2V5d29yZCIpLAogICAgICAiY2FzZSI6IHJlc3VsdCgiY2FzZSIsICJrZXl3b3JkIiksICJkZWZhdWx0IjogcmVzdWx0KCJkZWZhdWx0IiwgImtleXdvcmQiKSwKICAgICAgInRydWUiOiBhdG9tLCAiZmFsc2UiOiBhdG9tLCAibnVsbCI6IGF0b20sCiAgICAgIAogICAgICAiY2xhc3MiOiByZXN1bHQoImNsYXNzIiwgImtleXdvcmQiKSwgIm5hbWVzcGFjZSI6IHJlc3VsdCgiY2xhc3MiLCAia2V5d29yZCIpLAogICAgICAKICAgICAgInB1YmxpYyI6IGtleXdvcmRELCAicHJpdmF0ZSI6IGtleXdvcmRELCAicHJvdGVjdGVkIjoga2V5d29yZEQsICJpbnRlcm5hbCI6IGtleXdvcmRELAogICAgICAiZXh0ZXJuIjoga2V5d29yZEQsICJvdmVycmlkZSI6IGtleXdvcmRELCAidmlydHVhbCI6IGtleXdvcmRELCAiYWJzdHJhY3QiOiBrZXl3b3JkRCwgCiAgICAgICJzdGF0aWMiOiBrZXl3b3JkRCwgIm91dCI6IGtleXdvcmRELCAicmVmIjoga2V5d29yZEQsICJjb25zdCI6IGtleXdvcmRELAogICAgICAKICAgICAgImZvcmVhY2giOiByZXN1bHQoImZvciIsICJrZXl3b3JkIiksICJ1c2luZyI6IGtleXdvcmRDLAogICAgICAKICAgICAgImludCI6IGtleXdvcmRELCAiZG91YmxlIjoga2V5d29yZEQsICJsb25nIjoga2V5d29yZEQsICJib29sIjoga2V5d29yZEQsICJjaGFyIjoga2V5d29yZEQsIAogICAgICAidm9pZCI6IGtleXdvcmRELCAic3RyaW5nIjoga2V5d29yZEQsICJieXRlIjoga2V5d29yZEQsICJzYnl0ZSI6IGtleXdvcmRELCAiZGVjaW1hbCI6IGtleXdvcmRELAogICAgICAiZmxvYXQiOiBrZXl3b3JkRCwgInVpbnQiOiBrZXl3b3JkRCwgInVsb25nIjoga2V5d29yZEQsICJvYmplY3QiOiBrZXl3b3JkRCwKICAgICAgInNob3J0Ijoga2V5d29yZEQsICJ1c2hvcnQiOiBrZXl3b3JkRCwKICAgICAgCiAgICAgICJnZXQiOiBrZXl3b3JkRCwgInNldCI6IGtleXdvcmRELCAidmFsdWUiOiBrZXl3b3JkRCAgICAgIAogICAgfTsKICB9KCk7CgogIC8vIFNvbWUgaGVscGVyIHJlZ2V4cHMKICB2YXIgaXNPcGVyYXRvckNoYXIgPSAvWytcLSomJT08PiE/fF0vOwogIHZhciBpc0hleERpZ2l0ID0gL1swLTlBLUZhLWZdLzsKICB2YXIgaXNXb3JkQ2hhciA9IC9bXHdcJF9dLzsKCiAgLy8gV3JhcHBlciBhcm91bmQganNUb2tlbiB0aGF0IGhlbHBzIG1haW50YWluIHBhcnNlciBzdGF0ZSAod2hldGhlcgogIC8vIHdlIGFyZSBpbnNpZGUgb2YgYSBtdWx0aS1saW5lIGNvbW1lbnQgYW5kIHdoZXRoZXIgdGhlIG5leHQgdG9rZW4KICAvLyBjb3VsZCBiZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbikuCiAgZnVuY3Rpb24ganNUb2tlblN0YXRlKGluc2lkZSwgcmVnZXhwKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlLCBzZXRTdGF0ZSkgewogICAgICB2YXIgbmV3SW5zaWRlID0gaW5zaWRlOwogICAgICB2YXIgdHlwZSA9IGpzVG9rZW4oaW5zaWRlLCByZWdleHAsIHNvdXJjZSwgZnVuY3Rpb24oYykge25ld0luc2lkZSA9IGM7fSk7CiAgICAgIHZhciBuZXdSZWdleHAgPSB0eXBlLnR5cGUgPT0gIm9wZXJhdG9yIiB8fCB0eXBlLnR5cGUgPT0gImtleXdvcmQgYyIgfHwgdHlwZS50eXBlLm1hdGNoKC9eW1xbe31cKCw7Ol0kLyk7CiAgICAgIGlmIChuZXdSZWdleHAgIT0gcmVnZXhwIHx8IG5ld0luc2lkZSAhPSBpbnNpZGUpCiAgICAgICAgc2V0U3RhdGUoanNUb2tlblN0YXRlKG5ld0luc2lkZSwgbmV3UmVnZXhwKSk7CiAgICAgIHJldHVybiB0eXBlOwogICAgfTsKICB9CgogIC8vIFRoZSB0b2tlbiByZWFkZXIsIGludGVkZWQgdG8gYmUgdXNlZCBieSB0aGUgdG9rZW5pemVyIGZyb20KICAvLyB0b2tlbml6ZS5qcyAodGhyb3VnaCBqc1Rva2VuU3RhdGUpLiBBZHZhbmNlcyB0aGUgc291cmNlIHN0cmVhbQogIC8vIG92ZXIgYSB0b2tlbiwgYW5kIHJldHVybnMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHR5cGUgYW5kIHN0eWxlCiAgLy8gb2YgdGhhdCB0b2tlbi4KICBmdW5jdGlvbiBqc1Rva2VuKGluc2lkZSwgcmVnZXhwLCBzb3VyY2UsIHNldEluc2lkZSkgewogICAgZnVuY3Rpb24gcmVhZEhleE51bWJlcigpewogICAgICBzb3VyY2UubmV4dCgpOyAvLyBza2lwIHRoZSAneCcKICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoaXNIZXhEaWdpdCk7CiAgICAgIHJldHVybiB7dHlwZTogIm51bWJlciIsIHN0eWxlOiAiY3NoYXJwLWF0b20ifTsKICAgIH0KCiAgICBmdW5jdGlvbiByZWFkTnVtYmVyKCkgewogICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvWzAtOV0vKTsKICAgICAgaWYgKHNvdXJjZS5lcXVhbHMoIi4iKSl7CiAgICAgICAgc291cmNlLm5leHQoKTsKICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvWzAtOV0vKTsKICAgICAgfQogICAgICBpZiAoc291cmNlLmVxdWFscygiZSIpIHx8IHNvdXJjZS5lcXVhbHMoIkUiKSl7CiAgICAgICAgc291cmNlLm5leHQoKTsKICAgICAgICBpZiAoc291cmNlLmVxdWFscygiLSIpKQogICAgICAgICAgc291cmNlLm5leHQoKTsKICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvWzAtOV0vKTsKICAgICAgfQogICAgICByZXR1cm4ge3R5cGU6ICJudW1iZXIiLCBzdHlsZTogImNzaGFycC1hdG9tIn07CiAgICB9CiAgICAvLyBSZWFkIGEgd29yZCwgbG9vayBpdCB1cCBpbiBrZXl3b3Jkcy4gSWYgbm90IGZvdW5kLCBpdCBpcyBhCiAgICAvLyB2YXJpYWJsZSwgb3RoZXJ3aXNlIGl0IGlzIGEga2V5d29yZCBvZiB0aGUgdHlwZSBmb3VuZC4KICAgIGZ1bmN0aW9uIHJlYWRXb3JkKCkgewogICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcyhpc1dvcmRDaGFyKTsKICAgICAgdmFyIHdvcmQgPSBzb3VyY2UuZ2V0KCk7CiAgICAgIHZhciBrbm93biA9IGtleXdvcmRzLmhhc093blByb3BlcnR5KHdvcmQpICYmIGtleXdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKHdvcmQpICYmIGtleXdvcmRzW3dvcmRdOwogICAgICByZXR1cm4ga25vd24gPyB7dHlwZToga25vd24udHlwZSwgc3R5bGU6IGtub3duLnN0eWxlLCBjb250ZW50OiB3b3JkfSA6CiAgICAgIHt0eXBlOiAidmFyaWFibGUiLCBzdHlsZTogImNzaGFycC12YXJpYWJsZSIsIGNvbnRlbnQ6IHdvcmR9OwogICAgfQogICAgZnVuY3Rpb24gcmVhZFJlZ2V4cCgpIHsKICAgICAgbmV4dFVudGlsVW5lc2NhcGVkKHNvdXJjZSwgIi8iKTsKICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1tnaV0vKTsKICAgICAgcmV0dXJuIHt0eXBlOiAicmVnZXhwIiwgc3R5bGU6ICJjc2hhcnAtc3RyaW5nIn07CiAgICB9CiAgICAvLyBNdXRsaS1saW5lIGNvbW1lbnRzIGFyZSB0cmlja3kuIFdlIHdhbnQgdG8gcmV0dXJuIHRoZSBuZXdsaW5lcwogICAgLy8gZW1iZWRkZWQgaW4gdGhlbSBhcyByZWd1bGFyIG5ld2xpbmUgdG9rZW5zLCBhbmQgdGhlbiBjb250aW51ZQogICAgLy8gcmV0dXJuaW5nIGEgY29tbWVudCB0b2tlbiBmb3IgZXZlcnkgbGluZSBvZiB0aGUgY29tbWVudC4gU28KICAgIC8vIHNvbWUgc3RhdGUgaGFzIHRvIGJlIHNhdmVkIChpbnNpZGUpIHRvIGluZGljYXRlIHdoZXRoZXIgd2UgYXJlCiAgICAvLyBpbnNpZGUgYSAvKiAqLyBzZXF1ZW5jZS4KICAgIGZ1bmN0aW9uIHJlYWRNdWx0aWxpbmVDb21tZW50KHN0YXJ0KXsKICAgICAgdmFyIG5ld0luc2lkZSA9ICIvKiI7CiAgICAgIHZhciBtYXliZUVuZCA9IChzdGFydCA9PSAiKiIpOwogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIGlmIChzb3VyY2UuZW5kT2ZMaW5lKCkpCiAgICAgICAgICBicmVhazsKICAgICAgICB2YXIgbmV4dCA9IHNvdXJjZS5uZXh0KCk7CiAgICAgICAgaWYgKG5leHQgPT0gIi8iICYmIG1heWJlRW5kKXsKICAgICAgICAgIG5ld0luc2lkZSA9IG51bGw7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgbWF5YmVFbmQgPSAobmV4dCA9PSAiKiIpOwogICAgICB9CiAgICAgIHNldEluc2lkZShuZXdJbnNpZGUpOwogICAgICByZXR1cm4ge3R5cGU6ICJjb21tZW50Iiwgc3R5bGU6ICJjc2hhcnAtY29tbWVudCJ9OwogICAgfQogICAgZnVuY3Rpb24gcmVhZE9wZXJhdG9yKCkgewogICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcyhpc09wZXJhdG9yQ2hhcik7CiAgICAgIHJldHVybiB7dHlwZTogIm9wZXJhdG9yIiwgc3R5bGU6ICJjc2hhcnAtb3BlcmF0b3IifTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlYWRTdHJpbmcocXVvdGUpIHsKICAgICAgdmFyIGVuZEJhY2tTbGFzaCA9IG5leHRVbnRpbFVuZXNjYXBlZChzb3VyY2UsIHF1b3RlKTsKICAgICAgc2V0SW5zaWRlKGVuZEJhY2tTbGFzaCA/IHF1b3RlIDogbnVsbCk7CiAgICAgIHJldHVybiB7dHlwZTogInN0cmluZyIsIHN0eWxlOiAiY3NoYXJwLXN0cmluZyJ9OwogICAgfQoKICAgIC8vIEZldGNoIHRoZSBuZXh0IHRva2VuLiBEaXNwYXRjaGVzIG9uIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUKICAgIC8vIHN0cmVhbSwgb3IgZmlyc3QgdHdvIGNoYXJhY3RlcnMgd2hlbiB0aGUgZmlyc3QgaXMgYSBzbGFzaC4KICAgIGlmIChpbnNpZGUgPT0gIlwiIiB8fCBpbnNpZGUgPT0gIiciKQogICAgICByZXR1cm4gcmVhZFN0cmluZyhpbnNpZGUpOwogICAgdmFyIGNoID0gc291cmNlLm5leHQoKTsKICAgIGlmIChpbnNpZGUgPT0gIi8qIikKICAgICAgcmV0dXJuIHJlYWRNdWx0aWxpbmVDb21tZW50KGNoKTsKICAgIGVsc2UgaWYgKGNoID09ICJcIiIgfHwgY2ggPT0gIiciKQogICAgICByZXR1cm4gcmVhZFN0cmluZyhjaCk7CiAgICAvLyB3aXRoIHB1bmN0dWF0aW9uLCB0aGUgdHlwZSBvZiB0aGUgdG9rZW4gaXMgdGhlIHN5bWJvbCBpdHNlbGYKICAgIGVsc2UgaWYgKC9bXFtcXXt9XChcKSw7XDpcLl0vLnRlc3QoY2gpKQogICAgICByZXR1cm4ge3R5cGU6IGNoLCBzdHlsZTogImNzaGFycC1wdW5jdHVhdGlvbiJ9OwogICAgZWxzZSBpZiAoY2ggPT0gIjAiICYmIChzb3VyY2UuZXF1YWxzKCJ4IikgfHwgc291cmNlLmVxdWFscygiWCIpKSkKICAgICAgcmV0dXJuIHJlYWRIZXhOdW1iZXIoKTsKICAgIGVsc2UgaWYgKC9bMC05XS8udGVzdChjaCkpCiAgICAgIHJldHVybiByZWFkTnVtYmVyKCk7CiAgICBlbHNlIGlmIChjaCA9PSAiLyIpewogICAgICBpZiAoc291cmNlLmVxdWFscygiKiIpKQogICAgICB7IHNvdXJjZS5uZXh0KCk7IHJldHVybiByZWFkTXVsdGlsaW5lQ29tbWVudChjaCk7IH0KICAgICAgZWxzZSBpZiAoc291cmNlLmVxdWFscygiLyIpKQogICAgICB7IG5leHRVbnRpbFVuZXNjYXBlZChzb3VyY2UsIG51bGwpOyByZXR1cm4ge3R5cGU6ICJjb21tZW50Iiwgc3R5bGU6ICJjc2hhcnAtY29tbWVudCJ9O30KICAgICAgZWxzZSBpZiAocmVnZXhwKQogICAgICAgIHJldHVybiByZWFkUmVnZXhwKCk7CiAgICAgIGVsc2UKICAgICAgICByZXR1cm4gcmVhZE9wZXJhdG9yKCk7CiAgICB9CiAgICBlbHNlIGlmIChjaCA9PSAiIyIpIHsgIC8vIHRyZWF0IGMjIHJlZ2lvbnMgbGlrZSBjb21tZW50cwogICAgICAgIG5leHRVbnRpbFVuZXNjYXBlZChzb3VyY2UsIG51bGwpOyByZXR1cm4ge3R5cGU6ICJjb21tZW50Iiwgc3R5bGU6ICJjc2hhcnAtY29tbWVudCJ9OwogICAgfQogICAgZWxzZSBpZiAoaXNPcGVyYXRvckNoYXIudGVzdChjaCkpCiAgICAgIHJldHVybiByZWFkT3BlcmF0b3IoKTsKICAgIGVsc2UKICAgICAgcmV0dXJuIHJlYWRXb3JkKCk7CiAgfQoKICAvLyBUaGUgZXh0ZXJuYWwgaW50ZXJmYWNlIHRvIHRoZSB0b2tlbml6ZXIuCiAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSwgc3RhcnRTdGF0ZSkgewogICAgcmV0dXJuIHRva2VuaXplcihzb3VyY2UsIHN0YXJ0U3RhdGUgfHwganNUb2tlblN0YXRlKGZhbHNlLCB0cnVlKSk7CiAgfTsKfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/groovy/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/groovy/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KICA8aGVhZD4NCiAgICA8c2NyaXB0IHNyYz0iLi4vLi4vanMvY29kZW1pcnJvci5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4NCiAgICA8dGl0bGU+Q29kZU1pcnJvcjogR3Jvb3Z5IGRlbW9uc3RyYXRpb248L3RpdGxlPg0KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL2Nzcy9kb2NzLmNzcyIvPg0KICA8L2hlYWQ+DQogIDxib2R5IHN0eWxlPSJwYWRkaW5nOiAyMHB4OyI+DQoNCjxwPkRlbW9uc3RyYXRpb24gb2YgPGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+Q29kZU1pcnJvcjwvYT4ncyBHcm9vdnkgaGlnaGxpZ2h0ZXIuPC9wPg0KDQo8cD5DcmVhdGVkIGJ5IGVYbyBQbGF0Zm9ybSBTQVMgKDxhIGhyZWY9Imh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC0yLjEucGhwIj5saWNlbnNlPC9hPikuPC9wPg0KDQo8cD5Ob3RlIHRoYXQgdGhlIGZpbGVzIGZvciB0aGlzIHBhcnNlciBhcmVuJ3QgaW5jbHVkZWQgaW4gdGhlIENvZGVNaXJyb3IgcmVwb3NpdG9yeSwgYnV0IGhhdmUgdG8gZmV0Y2hlZCBmcm9tIDxhIGhyZWY9Imh0dHA6Ly9zdm4uZXhvcGxhdGZvcm0ub3JnLyI+c3ZuLmV4b3BsYXRmb3JtLm9yZzwvYT46PC9wPg0KDQo8dWw+DQogPGxpPjxhIGhyZWY9Imh0dHA6Ly9zdm4uZXhvcGxhdGZvcm0ub3JnL3Byb2plY3RzL2d3dC90cnVuay9leG8uZ3d0ZnJhbWV3b3JrLmVkaXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2V4b3BsYXRmb3JtL2d3dGZyYW1ld29yay9lZGl0b3IvcHVibGljL2NvZGVtaXJyb3IvanMvdG9rZW5pemVncm9vdnkuanMiPnRva2VuaXplZ3Jvb3Z5LmpzPC9hPjwvbGk+DQogPGxpPjxhIGhyZWY9Imh0dHA6Ly9zdm4uZXhvcGxhdGZvcm0ub3JnL3Byb2plY3RzL2d3dC90cnVuay9leG8uZ3d0ZnJhbWV3b3JrLmVkaXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2V4b3BsYXRmb3JtL2d3dGZyYW1ld29yay9lZGl0b3IvcHVibGljL2NvZGVtaXJyb3IvanMvcGFyc2Vncm9vdnkuanMiPnBhcnNlZ3Jvb3Z5LmpzPC9hPjwvbGk+DQogPGxpPjxhIGhyZWY9Imh0dHA6Ly9zdm4uZXhvcGxhdGZvcm0ub3JnL3Byb2plY3RzL2d3dC90cnVuay9leG8uZ3d0ZnJhbWV3b3JrLmVkaXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2V4b3BsYXRmb3JtL2d3dGZyYW1ld29yay9lZGl0b3IvcHVibGljL2NvZGVtaXJyb3IvY3NzL2dyb292eWNvbG9ycy5jc3MiPmdyb292eS5jb2xvcnMuY3NzPC9hPjwvbGk+DQo8L3VsPg0KDQo8ZGl2IGNsYXNzPSJib3JkZXIiPg0KPHRleHRhcmVhIGlkPSJjb2RlIiBjb2xzPSIxMjAiIHJvd3M9IjUwIj4NCi8vIHNpbXBsZSBncm9vdnkgc2NyaXB0DQppbXBvcnQgamF2YXgud3MucnMuUGF0aA0KaW1wb3J0IGphdmF4LndzLnJzLkdFVA0KaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbQ0KaW1wb3J0IGphdmF4LndzLnJzLlBPU1QNCg0KQFBhdGgoIi8iKQ0KcHVibGljIGNsYXNzIEhlbGxvV29ybGQgew0KICBAR0VUDQogIEBQYXRoKCJoZWxsb3dvcmxkL3tuYW1lfSIpDQogIHB1YmxpYyBTdHJpbmcgaGVsbG8oQFBhdGhQYXJhbSgibmFtZSIpIFN0cmluZyBuYW1lKSB7DQogICAgcmV0dXJuICJIZWxsbyAiICsgbmFtZQ0KICB9DQogIA0KICBAUE9TVA0KICBAUGF0aCgiaGVsbG93b3JsZC97bmFtZX0iKQ0KICBwdWJsaWMgU3RyaW5nIGhlbGxvMihAUGF0aFBhcmFtKCJuYW1lIikgU3RyaW5nIG5hbWUpIHsNCiAgICByZXR1cm4gIkhlbGxvICIgKyBuYW1lDQogIH0NCn0NCjwvdGV4dGFyZWE+DQo8L2Rpdj4NCg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoJ2NvZGUnLCB7DQogICAgaGVpZ2h0OiAiNDUwcHgiLA0KICAgIHBhcnNlcmZpbGU6IFsiaHR0cDovL3N2bi5leG9wbGF0Zm9ybS5vcmcvcHJvamVjdHMvZ3d0L3RydW5rL2V4by5nd3RmcmFtZXdvcmsuZWRpdG9yL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZXhvcGxhdGZvcm0vZ3d0ZnJhbWV3b3JrL2VkaXRvci9wdWJsaWMvY29kZW1pcnJvci9qcy9wYXJzZWdyb292eS5qcyIsICJodHRwOi8vc3ZuLmV4b3BsYXRmb3JtLm9yZy9wcm9qZWN0cy9nd3QvdHJ1bmsvZXhvLmd3dGZyYW1ld29yay5lZGl0b3Ivc3JjL21haW4vcmVzb3VyY2VzL29yZy9leG9wbGF0Zm9ybS9nd3RmcmFtZXdvcmsvZWRpdG9yL3B1YmxpYy9jb2RlbWlycm9yL2pzL3Rva2VuaXplZ3Jvb3Z5LmpzIl0sDQogICAgc3R5bGVzaGVldDogImh0dHA6Ly9zdm4uZXhvcGxhdGZvcm0ub3JnL3Byb2plY3RzL2d3dC90cnVuay9leG8uZ3d0ZnJhbWV3b3JrLmVkaXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2V4b3BsYXRmb3JtL2d3dGZyYW1ld29yay9lZGl0b3IvcHVibGljL2NvZGVtaXJyb3IvY3NzL2dyb292eWNvbG9ycy5jc3MiLA0KICAgIHBhdGg6ICIuLi8uLi9qcy8iLA0KICAgIHRleHRXcmFwcGluZzogZmFsc2UNCiAgfSk7DQo8L3NjcmlwdD4NCg0KPC9ib2R5Pg0KPC9odG1sPg0K]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/lua/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/lua/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/lua/css/luacolors.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aHRtbCB7CiAgY3Vyc29yOiB0ZXh0Owp9CgouZWRpdGJveCB7CiAgbWFyZ2luOiAuNGVtOwogIHBhZGRpbmc6IDA7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICBmb250LXNpemU6IDEwcHQ7CiAgY29sb3I6IGJsYWNrOwp9CgpwcmUuY29kZSwgLmVkaXRib3ggewogIGNvbG9yOiAjNjY2NjY2Owp9CgouZWRpdGJveCBwIHsKICBtYXJnaW46IDA7Cn0KCnNwYW4ubHVhLWNvbW1lbnQgewogIGNvbG9yOiAjQkI5OTc3Owp9CgpzcGFuLmx1YS1rZXl3b3JkIHsKICBmb250LXdlaWdodDogYm9sZDsKICBjb2xvcjogYmx1ZTsKfQoKc3Bhbi5sdWEtc3RyaW5nIHsKICBjb2xvcjogI0FBMjIyMjsKfQoKc3Bhbi5sdWEtc3RkZnVuYyB7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgY29sb3I6ICMwNzc7Cn0Kc3Bhbi5sdWEtY3VzdG9tZnVuYyB7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgY29sb3I6ICMwQUE7Cn0KCgpzcGFuLmx1YS1pZGVudGlmaWVyIHsKICBjb2xvcjogYmxhY2s7Cn0KCnNwYW4ubHVhLW51bWJlciB7CiAgY29sb3I6ICMzQTM7Cn0KCnNwYW4ubHVhLXRva2VuIHsKICBjb2xvcjogIzE1MTsKfQoKc3Bhbi5sdWEtZXJyb3IgewogIGNvbG9yOiAjRkZGOwogIGJhY2tncm91bmQtY29sb3I6ICNGMDA7Cn0KCgoKCg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/lua/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHNjcmlwdCBzcmM9Ii4uLy4uL2pzL2NvZGVtaXJyb3IuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgICA8dGl0bGU+Q29kZU1pcnJvcjogTHVhIGRlbW9uc3RyYXRpb248L3RpdGxlPgogIDwvaGVhZD4KICA8Ym9keSBzdHlsZT0icGFkZGluZzogMjBweDsiPgoKPHA+VGhpcyBwYWdlIGRlbW9uc3RyYXRlcyA8YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Db2RlTWlycm9yPC9hPidzCkx1YSBwYXJzZXIuIFdyaXR0ZW4gYnkgPGEgaHJlZj0iaHR0cDovL2ZyYW5jaW8ucGwvIj5GcmFuY2lzemVrCldhd3J6YWs8L2E+LCByZWxlYXNlZCB1bmRlciBhIEJTRC1zdHlsZSA8YQpocmVmPSJMSUNFTlNFIj5saWNlbnNlPC9hPi48L3A+Cgo8ZGl2IHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCBibGFjazsgcGFkZGluZzogMHB4OyI+Cjx0ZXh0YXJlYSBpZD0iY29kZSIgY29scz0iMTIwIiByb3dzPSIzMCI+Ci0tW1sKZXhhbXBsZSB1c2VsZXNzIGNvZGUgdG8gc2hvdyBsdWEgc3ludGF4IGhpZ2hsaWdodGluZwp0aGlzIGlzIG11bHRpbGluZSBjb21tZW50Cl1dCgpmdW5jdGlvbiBibGFoYmxhaGJsYWgoeCkKCiAgbG9jYWwgdGFibGUgPSB7CiAgICAiYXNkIiA9IDEyMywKICAgICJ4IiA9IDAuMzQsICAKICB9CiAgaWYgeCB+PSAzIHRoZW4KICAgIHByaW50KCB4ICkKICBlbHNlaWYgeCA9PSAic3RyaW5nIgogICAgbXlfY3VzdG9tX2Z1bmN0aW9uKCAweDM0ICkKICBlbHNlCiAgICB1bmtub3duX2Z1bmN0aW9uKCAic29tZSBzdHJpbmciICkKICBlbmQKCiAgLS1zaW5nbGUgbGluZSBjb21tZW50CiAgCmVuZAoKZnVuY3Rpb24gYmxhYmxhYmxhMygpCgogIGZvciBrLHYgaW4gaXBhaXJzKCB0YWJsZSApIGRvCiAgICAtLWFiY2RlLi4KICAgIHk9Wz1bCiAgeD1bWwogICAgICB4IGlzIGEgbXVsdGkgbGluZSBzdHJpbmcKICAgXV0KICBidXQgaXRzIGRlZmluaXRpb24gaXMgaXNpZGUgYSBoaWdoZXN0IGxldmVsIHN0cmluZyEKICBdPV0KICAgIHByaW50KCIgXCJcIiAiKQogIC0tdGhpcyBtYXJrcyBhIHBhcnNlciBlcnJvcjoKICBzID0gWz09IGFzZGFzZGFzZF1dCgogICAgcyA9IG1hdGguc2luKCB4ICkKICBlbmQKCmVuZAo8L3RleHRhcmVhPgo8L2Rpdj4KCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoJ2NvZGUnLCB7CiAgICBoZWlnaHQ6ICIzNTBweCIsCiAgICBwYXJzZXJmaWxlOiAiLi4vY29udHJpYi9sdWEvanMvcGFyc2VsdWEuanMiLAogICAgc3R5bGVzaGVldDogImNzcy9sdWFjb2xvcnMuY3NzIiwKICAgIHBhdGg6ICIuLi8uLi9qcy8iCiAgfSk7Cjwvc2NyaXB0PgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/lua/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/lua/js/parselua.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogCiBTaW1wbGUgcGFyc2VyIGZvciBMVUEgCiBXcml0dGVuIGZvciBMdWEgNS4xLCBiYXNlZCBvbiBwYXJzZWNzcyBhbmQgb3RoZXIgcGFyc2Vycy4gCiBmZWF0dXJlczogaGlnaGxpZ2h0cyBrZXl3b3Jkcywgc3RyaW5ncywgY29tbWVudHMgKG5vIGxldmVsaW5nIHN1cHBvcnRlZCEgKCJbPT1bIikpLHRva2VucywgYmFzaWMgaW5kZW50aW5nCgogdG8gbWFrZSB0aGlzIHBhcnNlciBoaWdobGlnaHQgeW91ciBzcGVjaWFsIGZ1bmN0aW9ucyBwYXNzIHRhYmxlIHdpdGggdGhpcyBmdW5jdGlvbnMgbmFtZXMgdG8gcGFyc2VyQ29uZmlnIGFyZ3VtZW50IG9mIGNyZWF0b3IsCgkKIHBhcnNlckNvbmZpZzogWyJteWZ1bmN0aW9uMSIsIm15ZnVuY3Rpb24yIl0sCiAqLwoKIApmdW5jdGlvbiBmaW5kRmlyc3RSZWdleHAod29yZHMpIHsKICAgIHJldHVybiBuZXcgUmVnRXhwKCJeKD86IiArIHdvcmRzLmpvaW4oInwiKSArICIpIiwgImkiKTsKfQoKZnVuY3Rpb24gbWF0Y2hSZWdleHAod29yZHMpIHsKICAgIHJldHVybiBuZXcgUmVnRXhwKCJeKD86IiArIHdvcmRzLmpvaW4oInwiKSArICIpJCIsICJpIik7Cn0KCgogCnZhciBsdWFDdXN0b21GdW5jdGlvbnM9IG1hdGNoUmVnZXhwKFtdKTsKIApmdW5jdGlvbiBjb25maWd1cmVMVUEocGFyc2VyQ29uZmlnKXsKCWlmKHBhcnNlckNvbmZpZykKCWx1YUN1c3RvbUZ1bmN0aW9ucz0gbWF0Y2hSZWdleHAocGFyc2VyQ29uZmlnKTsKfQoKCi8vbG9uZyBsaXN0IG9mIHN0YW5kYXJkIGZ1bmN0aW9ucyBmcm9tIGx1YSBtYW51YWwKdmFyIGx1YVN0ZEZ1bmN0aW9ucyA9IG1hdGNoUmVnZXhwKFsKIl9HIiwiX1ZFUlNJT04iLCJhc3NlcnQiLCJjb2xsZWN0Z2FyYmFnZSIsImRvZmlsZSIsImVycm9yIiwiZ2V0ZmVudiIsImdldG1ldGF0YWJsZSIsImlwYWlycyIsImxvYWQiLCJsb2FkZmlsZSIsImxvYWRzdHJpbmciLCJtb2R1bGUiLCJuZXh0IiwicGFpcnMiLCJwY2FsbCIsInByaW50IiwicmF3ZXF1YWwiLCJyYXdnZXQiLCJyYXdzZXQiLCJyZXF1aXJlIiwic2VsZWN0Iiwic2V0ZmVudiIsInNldG1ldGF0YWJsZSIsInRvbnVtYmVyIiwidG9zdHJpbmciLCJ0eXBlIiwidW5wYWNrIiwieHBjYWxsIiwKCiJjb3JvdXRpbmUuY3JlYXRlIiwiY29yb3V0aW5lLnJlc3VtZSIsImNvcm91dGluZS5ydW5uaW5nIiwiY29yb3V0aW5lLnN0YXR1cyIsImNvcm91dGluZS53cmFwIiwiY29yb3V0aW5lLnlpZWxkIiwKCiJkZWJ1Zy5kZWJ1ZyIsImRlYnVnLmdldGZlbnYiLCJkZWJ1Zy5nZXRob29rIiwiZGVidWcuZ2V0aW5mbyIsImRlYnVnLmdldGxvY2FsIiwiZGVidWcuZ2V0bWV0YXRhYmxlIiwiZGVidWcuZ2V0cmVnaXN0cnkiLCJkZWJ1Zy5nZXR1cHZhbHVlIiwiZGVidWcuc2V0ZmVudiIsImRlYnVnLnNldGhvb2siLCJkZWJ1Zy5zZXRsb2NhbCIsImRlYnVnLnNldG1ldGF0YWJsZSIsImRlYnVnLnNldHVwdmFsdWUiLCJkZWJ1Zy50cmFjZWJhY2siLAoKImNsb3NlIiwiZmx1c2giLCJsaW5lcyIsInJlYWQiLCJzZWVrIiwic2V0dmJ1ZiIsIndyaXRlIiwKCiJpby5jbG9zZSIsImlvLmZsdXNoIiwiaW8uaW5wdXQiLCJpby5saW5lcyIsImlvLm9wZW4iLCJpby5vdXRwdXQiLCJpby5wb3BlbiIsImlvLnJlYWQiLCJpby5zdGRlcnIiLCJpby5zdGRpbiIsImlvLnN0ZG91dCIsImlvLnRtcGZpbGUiLCJpby50eXBlIiwiaW8ud3JpdGUiLAoKIm1hdGguYWJzIiwibWF0aC5hY29zIiwibWF0aC5hc2luIiwibWF0aC5hdGFuIiwibWF0aC5hdGFuMiIsIm1hdGguY2VpbCIsIm1hdGguY29zIiwibWF0aC5jb3NoIiwibWF0aC5kZWciLCJtYXRoLmV4cCIsIm1hdGguZmxvb3IiLCJtYXRoLmZtb2QiLCJtYXRoLmZyZXhwIiwibWF0aC5odWdlIiwibWF0aC5sZGV4cCIsIm1hdGgubG9nIiwibWF0aC5sb2cxMCIsIm1hdGgubWF4IiwibWF0aC5taW4iLCJtYXRoLm1vZGYiLCJtYXRoLnBpIiwibWF0aC5wb3ciLCJtYXRoLnJhZCIsIm1hdGgucmFuZG9tIiwibWF0aC5yYW5kb21zZWVkIiwibWF0aC5zaW4iLCJtYXRoLnNpbmgiLCJtYXRoLnNxcnQiLCJtYXRoLnRhbiIsIm1hdGgudGFuaCIsCgoib3MuY2xvY2siLCJvcy5kYXRlIiwib3MuZGlmZnRpbWUiLCJvcy5leGVjdXRlIiwib3MuZXhpdCIsIm9zLmdldGVudiIsIm9zLnJlbW92ZSIsIm9zLnJlbmFtZSIsIm9zLnNldGxvY2FsZSIsIm9zLnRpbWUiLCJvcy50bXBuYW1lIiwKCiJwYWNrYWdlLmNwYXRoIiwicGFja2FnZS5sb2FkZWQiLCJwYWNrYWdlLmxvYWRlcnMiLCJwYWNrYWdlLmxvYWRsaWIiLCJwYWNrYWdlLnBhdGgiLCJwYWNrYWdlLnByZWxvYWQiLCJwYWNrYWdlLnNlZWFsbCIsCgoic3RyaW5nLmJ5dGUiLCJzdHJpbmcuY2hhciIsInN0cmluZy5kdW1wIiwic3RyaW5nLmZpbmQiLCJzdHJpbmcuZm9ybWF0Iiwic3RyaW5nLmdtYXRjaCIsInN0cmluZy5nc3ViIiwic3RyaW5nLmxlbiIsInN0cmluZy5sb3dlciIsInN0cmluZy5tYXRjaCIsInN0cmluZy5yZXAiLCJzdHJpbmcucmV2ZXJzZSIsInN0cmluZy5zdWIiLCJzdHJpbmcudXBwZXIiLAoKInRhYmxlLmNvbmNhdCIsInRhYmxlLmluc2VydCIsInRhYmxlLm1heG4iLCJ0YWJsZS5yZW1vdmUiLCJ0YWJsZS5zb3J0IgpdKTsKCgoKIHZhciBsdWFLZXl3b3JkcyA9IG1hdGNoUmVnZXhwKFsiYW5kIiwiYnJlYWsiLCJlbHNlaWYiLCJmYWxzZSIsIm5pbCIsIm5vdCIsIm9yIiwicmV0dXJuIiwKCQkJCSJ0cnVlIiwiZnVuY3Rpb24iLCAiZW5kIiwgImlmIiwgInRoZW4iLCAiZWxzZSIsICJkbyIsIAoJCQkJIndoaWxlIiwgInJlcGVhdCIsICJ1bnRpbCIsICJmb3IiLCAiaW4iLCAibG9jYWwiIF0pOwoKIHZhciBsdWFJbmRlbnRLZXlzID0gbWF0Y2hSZWdleHAoWyJmdW5jdGlvbiIsICJpZiIsInJlcGVhdCIsImZvciIsIndoaWxlIiwgIltcKF0iLCAieyJdKTsKIHZhciBsdWFVbmluZGVudEtleXMgPSBtYXRjaFJlZ2V4cChbImVuZCIsICJ1bnRpbCIsICJbXCldIiwgIn0iXSk7CgogdmFyIGx1YVVuaW5kZW50S2V5czIgPSBmaW5kRmlyc3RSZWdleHAoWyJlbmQiLCAidW50aWwiLCAiW1wpXSIsICJ9Il0pOwogdmFyIGx1YU1pZGRsZUtleXMgPSBmaW5kRmlyc3RSZWdleHAoWyJlbHNlIiwiZWxzZWlmIl0pOwoKCgp2YXIgTFVBUGFyc2VyID0gRWRpdG9yLlBhcnNlciA9IChmdW5jdGlvbigpIHsKICB2YXIgdG9rZW5pemVMVUEgPSAoZnVuY3Rpb24oKSB7CiAgICBmdW5jdGlvbiBub3JtYWwoc291cmNlLCBzZXRTdGF0ZSkgewogICAgICB2YXIgY2ggPSBzb3VyY2UubmV4dCgpOwoKICAgaWYgKGNoID09ICItIiAmJiBzb3VyY2UuZXF1YWxzKCItIikpIHsKICAgICAgICBzb3VyY2UubmV4dCgpOwogCQlzZXRTdGF0ZShpblNMQ29tbWVudCk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0gCgllbHNlIGlmIChjaCA9PSAiXCIiIHx8IGNoID09ICInIikgewogICAgICAgIHNldFN0YXRlKGluU3RyaW5nKGNoKSk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgIGlmIChjaCA9PSAiWyIgJiYgKHNvdXJjZS5lcXVhbHMoIlsiKSB8fCBzb3VyY2UuZXF1YWxzKCI9IikpKSB7CiAgICAgICAgdmFyIGxldmVsID0gMDsKCQl3aGlsZShzb3VyY2UuZXF1YWxzKCI9IikpewoJCQlsZXZlbCArKzsKCQkJc291cmNlLm5leHQoKTsKCQl9CgkJaWYoISBzb3VyY2UuZXF1YWxzKCJbIikgKQoJCQlyZXR1cm4gImx1YS1lcnJvciI7CQkKCQlzZXRTdGF0ZShpbk1MU29tZXRoaW5nKGxldmVsLCJsdWEtc3RyaW5nIikpOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9IAoJICAgIAogICAgICBlbHNlIGlmIChjaCA9PSAiPSIpIHsKCWlmIChzb3VyY2UuZXF1YWxzKCI9IikpCgkJc291cmNlLm5leHQoKTsKICAgICAgICByZXR1cm4gImx1YS10b2tlbiI7CiAgICAgIH0KICAJCiAgICAgIGVsc2UgaWYgKGNoID09ICIuIikgewoJaWYgKHNvdXJjZS5lcXVhbHMoIi4iKSkKCQlzb3VyY2UubmV4dCgpOwoJaWYgKHNvdXJjZS5lcXVhbHMoIi4iKSkKCQlzb3VyY2UubmV4dCgpOwogICAgICAgIHJldHVybiAibHVhLXRva2VuIjsKICAgICAgfQogICAgIAogICAgICBlbHNlIGlmIChjaCA9PSAiKyIgfHwgY2ggPT0gIi0iIHx8IGNoID09ICIqIiB8fCBjaCA9PSAiLyIgfHwgY2ggPT0gIiUiIHx8IGNoID09ICJeIiB8fCBjaCA9PSAiIyIgKSB7CiAgICAgICAgcmV0dXJuICJsdWEtdG9rZW4iOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGNoID09ICI+IiB8fCBjaCA9PSAiPCIgfHwgY2ggPT0gIigiIHx8IGNoID09ICIpIiB8fCBjaCA9PSAieyIgfHwgY2ggPT0gIn0iIHx8IGNoID09ICJbIiApIHsKICAgICAgICByZXR1cm4gImx1YS10b2tlbiI7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoY2ggPT0gIl0iIHx8IGNoID09ICI7IiB8fCBjaCA9PSAiOiIgfHwgY2ggPT0gIiwiKSB7CiAgICAgICAgcmV0dXJuICJsdWEtdG9rZW4iOwogICAgICB9CiAgICAgIGVsc2UgaWYgKHNvdXJjZS5lcXVhbHMoIj0iKSAmJiAoY2ggPT0gIn4iIHx8IGNoID09ICI8IiB8fCBjaCA9PSAiPiIpKSB7CiAgICAgICAgc291cmNlLm5leHQoKTsKICAgICAgICByZXR1cm4gImx1YS10b2tlbiI7CiAgICAgIH0KCiAgICAgZWxzZSBpZiAoL1xkLy50ZXN0KGNoKSkgewogICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9bXHcuJV0vKTsKICAgICAgICByZXR1cm4gImx1YS1udW1iZXIiOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9bXHdcXFwtXy5dLyk7CiAgICAgICAgcmV0dXJuICJsdWEtaWRlbnRpZmllciI7CiAgICAgIH0KICAgIH0KIApmdW5jdGlvbiBpblNMQ29tbWVudChzb3VyY2UsIHNldFN0YXRlKSB7CiAgICAgIHZhciBzdGFydCA9IHRydWU7Cgl2YXIgY291bnQ9MDsKICAgICAgd2hpbGUgKCFzb3VyY2UuZW5kT2ZMaW5lKCkpIHsKCSAJdmFyIGNoID0gc291cmNlLm5leHQoKTsKCQl2YXIgbGV2ZWwgPSAwOwoJCWlmICgoY2ggPT0iWyIpICYmIHN0YXJ0KXsKCQkJd2hpbGUoc291cmNlLmVxdWFscygiPSIpKXsKCQkJc291cmNlLm5leHQoKTsKCQkJbGV2ZWwrKzsKCQkJfQoJCQlpZiAoc291cmNlLmVxdWFscygiWyIpKXsKICAgICAgIAkJCQlzZXRTdGF0ZShpbk1MU29tZXRoaW5nKGxldmVsLCJsdWEtY29tbWVudCIpKTsKICAgICAgICAJCQlyZXR1cm4gbnVsbDsKICAJCQkJfQoJCSB9CgkJIHN0YXJ0ID0gZmFsc2U7CQoJfQoJc2V0U3RhdGUobm9ybWFsKTsgICAgICAJCQogICAgIHJldHVybiAibHVhLWNvbW1lbnQiOwoJCiAgICB9CgogICAgZnVuY3Rpb24gaW5NTFNvbWV0aGluZyhsZXZlbCx3aGF0KSB7CgkvL3dhdCBzaG9sdWQgYmUgImx1YS1zdHJpbmciIG9yICJsdWEtY29tbWVudCIsIGxldmVsIGlzIHRoZSBudW1iZXIgb2YgIj0iIGluIG9wZW5pbmcgbWFyay4KCXJldHVybiBmdW5jdGlvbihzb3VyY2UsIHNldFN0YXRlKXsKICAgICAgdmFyIGRhc2hlcyA9IDA7CiAgICAgIHdoaWxlICghc291cmNlLmVuZE9mTGluZSgpKSB7CiAgICAgICAgdmFyIGNoID0gc291cmNlLm5leHQoKTsKICAgICAgICBpZiAoZGFzaGVzID09IGxldmVsKzEgJiYgY2ggPT0gIl0iICkgewogICAgICAgICAgc2V0U3RhdGUobm9ybWFsKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCQlpZiAoZGFzaGVzID09IDApIAoJCQlkYXNoZXMgPSAoY2ggPT0gIl0iKSA/IDE6MDsKCQllbHNlCiAJCQlkYXNoZXMgPSAoY2ggPT0gIj0iKSA/IGRhc2hlcyArIDEgOiAwOwogICAgICAgIH0KICAgICAgcmV0dXJuIHdoYXQ7CgkgfQogICAgfQoKCiAgICBmdW5jdGlvbiBpblN0cmluZyhxdW90ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlLCBzZXRTdGF0ZSkgewogICAgICAgIHZhciBlc2NhcGVkID0gZmFsc2U7CiAgICAgICAgd2hpbGUgKCFzb3VyY2UuZW5kT2ZMaW5lKCkpIHsKICAgICAgICAgIHZhciBjaCA9IHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICBpZiAoY2ggPT0gcXVvdGUgJiYgIWVzY2FwZWQpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIGNoID09ICJcXCI7CiAgICAgICAgfQogICAgICAgIGlmICghZXNjYXBlZCkKICAgICAgICAgIHNldFN0YXRlKG5vcm1hbCk7CiAgICAgICAgcmV0dXJuICJsdWEtc3RyaW5nIjsKICAgICAgfTsKICAgIH0KCiAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlLCBzdGFydFN0YXRlKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZXIoc291cmNlLCBzdGFydFN0YXRlIHx8IG5vcm1hbCk7CiAgICB9OwogIH0pKCk7CgogIGZ1bmN0aW9uIGluZGVudExVQShpbmRlbnREZXB0aCwgYmFzZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKG5leHRDaGFycykgewoKICAgICAgdmFyIGNsb3NpbmcgPSAobHVhVW5pbmRlbnRLZXlzMi50ZXN0KG5leHRDaGFycykgfHwgbHVhTWlkZGxlS2V5cy50ZXN0KG5leHRDaGFycykpOwoKIAkKCXJldHVybiBiYXNlICsgKCBpbmRlbnRVbml0ICogKGluZGVudERlcHRoIC0gKGNsb3Npbmc/MTowKSkgKTsKICAgIH07CiAgfQoKICAKZnVuY3Rpb24gcGFyc2VMVUEoc291cmNlLGJhc2Vjb2x1bW4pIHsKICAgICBiYXNlY29sdW1uID0gYmFzZWNvbHVtbiB8fCAwOwogICAgCgl2YXIgdG9rZW5zID0gdG9rZW5pemVMVUEoc291cmNlKTsKICAgIHZhciBpbmRlbnREZXB0aCA9IDA7CgogICAgdmFyIGl0ZXIgPSB7CiAgICAgIG5leHQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB0b2tlbiA9IHRva2Vucy5uZXh0KCksIHN0eWxlID0gdG9rZW4uc3R5bGUsIGNvbnRlbnQgPSB0b2tlbi5jb250ZW50OwoKIAoJCglpZiAoc3R5bGUgPT0gImx1YS1pZGVudGlmaWVyIiAmJiBsdWFLZXl3b3Jkcy50ZXN0KGNvbnRlbnQpKXsKCSAgdG9rZW4uc3R5bGUgPSAibHVhLWtleXdvcmQiOwoJfQkKCWlmIChzdHlsZSA9PSAibHVhLWlkZW50aWZpZXIiICYmIGx1YVN0ZEZ1bmN0aW9ucy50ZXN0KGNvbnRlbnQpKXsKCSAgdG9rZW4uc3R5bGUgPSAibHVhLXN0ZGZ1bmMiOwoJfQoJaWYgKHN0eWxlID09ICJsdWEtaWRlbnRpZmllciIgJiYgbHVhQ3VzdG9tRnVuY3Rpb25zLnRlc3QoY29udGVudCkpewoJICB0b2tlbi5zdHlsZSA9ICJsdWEtY3VzdG9tZnVuYyI7Cgl9CgoJaWYgKGx1YUluZGVudEtleXMudGVzdChjb250ZW50KSkKICAgIAlpbmRlbnREZXB0aCsrOwoJZWxzZSBpZiAobHVhVW5pbmRlbnRLZXlzLnRlc3QoY29udGVudCkpCgkJaW5kZW50RGVwdGgtLTsKICAgICAgICAKCiAgICAgICAgaWYgKGNvbnRlbnQgPT0gIlxuIikKICAgICAgICAgIHRva2VuLmluZGVudGF0aW9uID0gaW5kZW50TFVBKCBpbmRlbnREZXB0aCwgYmFzZWNvbHVtbik7CgogICAgICAgIHJldHVybiB0b2tlbjsKICAgICAgfSwKCiAgICAgIGNvcHk6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciAgX3Rva2VuU3RhdGUgPSB0b2tlbnMuc3RhdGUsIF9pbmRlbnREZXB0aCA9IGluZGVudERlcHRoOwogICAgICAgIHJldHVybiBmdW5jdGlvbihzb3VyY2UpIHsKICAgICAgICAgIHRva2VucyA9IHRva2VuaXplTFVBKHNvdXJjZSwgX3Rva2VuU3RhdGUpOwogICAgICAKCSAgaW5kZW50RGVwdGggPSBfaW5kZW50RGVwdGg7CiAgICAgICAgICByZXR1cm4gaXRlcjsKICAgICAgICB9OwogICAgICB9CiAgICB9OwogICAgcmV0dXJuIGl0ZXI7CiAgfQoKICByZXR1cm4ge21ha2U6IHBhcnNlTFVBLCBjb25maWd1cmU6Y29uZmlndXJlTFVBLCBlbGVjdHJpY0NoYXJzOiAiZGVsZn0pIn07ICAgLy9lbltkXSBlbHNbZV0gdW50aVtsXSBlbHNlaVtmXSAgLy8gdGhpcyBzaG91bGQgYmUgdGFrZW4gZnJvbSBLZXlzIGtleXdvcmRzCn0pKCk7Cgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/lua/LICENSE</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29weXJpZ2h0IChjKSAyMDA5LCBGcmFuY2lzemVrIFdhd3J6YWsKQWxsIHJpZ2h0cyByZXNlcnZlZC4KClRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgZm9yIHVzZSBpbiBjb25uZWN0aW9uIHdpdGggdGhlCkNvZGVNaXJyb3Igc3VpdGUgb2YgbW9kdWxlcyBhbmQgdXRpbGl0aWVzLCBob3N0ZWQgYW5kIG1haW50YWluZWQKYXQgaHR0cDovL21hcmlqbi5oYXZlcmJla2UubmwvY29kZW1pcnJvci8uCgpSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsCndpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUKZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKCiogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQogIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKICBmb2xsb3dpbmcgZGlzY2xhaW1lci4KCiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQogIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgoKVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwoiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVApMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwpGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCklOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCkJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgpDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFClBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/php/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/php/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/php/css/phpcolors.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVGhlIGNvcHlyaWdodHMgZW1ib2RpZWQgaW4gdGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlIGFyZSBsaWNlbnNlZCBieQpZYWhvbyEgSW5jLiB1bmRlciB0aGUgQlNEIChyZXZpc2VkKSBvcGVuIHNvdXJjZSBsaWNlbnNlCgpAYXV0aG9yIERhbiBWbGFkIERhc2NhbGVzY3UgPGRhbmR2QHlhaG9vLWluYy5jb20+CiovCgpodG1sIHsKICBjdXJzb3I6IHRleHQ7Cn0KCi5lZGl0Ym94IHsKICBtYXJnaW46IC40ZW07CiAgcGFkZGluZzogMDsKICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogIGZvbnQtc2l6ZTogMTBwdDsKfQoKLypXZSBzaG91bGQgZGVmaW5lIHNwZWNpZmljIHN0eWxlcyBmb3IgZXZlcnkgZWxlbWVudCBvZiB0aGUgc3ludGF4LgogIHRoZSBzZXR0aW5nIGJlbG93IHdpbGwgY2F1c2Ugc29tZSBhbm5veWluZyBjb2xvciB0byBzaG93IHRocm91Z2ggaWYgd2UgbWlzc2VkCiAgZGVmaW5pbmcgYSBzdHlsZSBmb3IgYSB0b2tlbi4gVGhpcyBpcyBhbHNvIHRoZSAiY29sb3IiIG9mIHRoZSB3aGl0ZXNwYWNlIGFuZAogIG9mIHRoZSBjdXJzb3IuCiovCnByZS5jb2RlLCAuZWRpdGJveCB7CiAgY29sb3I6IHJlZDsKfQoKLmVkaXRib3ggcCB7CiAgbWFyZ2luOiAwOwp9CgpzcGFuLnBocC1wdW5jdHVhdGlvbiB7CiAgY29sb3I6IGJsdWU7Cn0KCnNwYW4ucGhwLWtleXdvcmQgewogIGNvbG9yOiAjNzcwMDg4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgpzcGFuLnBocC1vcGVyYXRvciB7CiAgY29sb3I6IGJsdWU7Cn0KCi8qIF9fRklMRV9fIGV0Yy47IGh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9yZXNlcnZlZC5waHAgKi8Kc3Bhbi5waHAtY29tcGlsZS10aW1lLWNvbnN0YW50IHsKICBjb2xvcjogIzc3NjA4ODsKICBmb250LXdlaWdodDogYm9sZDsKfQoKLyogb3V0cHV0IG9mIGdldF9kZWZpbmVkX2NvbnN0YW50cygpLiBEaWZmZXJzIGZyb20gaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL3Jlc2VydmVkLmNvbnN0YW50cy5waHAgKi8Kc3Bhbi5waHAtcHJlZGVmaW5lZC1jb25zdGFudCB7CiAgY29sb3I6IGRhcmtncmVlbjsKICBmb250LXdlaWdodDogYm9sZDsKfQoKLyogUEhQIHJlc2VydmVkICJsYW5ndWFnZSBjb25zdHJ1Y3RzIi4uLiBlY2hvKCkgZXRjLjsgaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL3Jlc2VydmVkLnBocCAqLwpzcGFuLnBocC1yZXNlcnZlZC1sYW5ndWFnZS1jb25zdHJ1Y3QgewogIGNvbG9yOiBncmVlbjsKICBmb250LXdlaWdodDogYm9sZDsKfQoKLyogUEhQIGJ1aWx0LWluIGZ1bmN0aW9uczogZ2xvYigpLCBjaHIoKSBldGMuOyBvdXRwdXQgb2YgZ2V0X2RlZmluZWRfZnVuY3Rpb25zKClbImludGVybmFsIl0gKi8Kc3Bhbi5waHAtcHJlZGVmaW5lZC1mdW5jdGlvbiB7CiAgY29sb3I6IGdyZWVuOwp9CgovKiBQSFAgcHJlZGVmaW5lZCBjbGFzc2VzOiBQRE8sIEV4Y2VwdGlvbiBldGMuOyBvdXRwdXQgb2YgZ2V0X2RlY2xhcmVkX2NsYXNzZXMoKSBhbmQgZGlmZmVyZW50IGZyb20gaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL3Jlc2VydmVkLmNsYXNzZXMucGhwICovCnNwYW4ucGhwLXByZWRlZmluZWQtY2xhc3MgewogIGNvbG9yOiBncmVlbjsKfQoKc3Bhbi5waHAtYXRvbSB7CiAgY29sb3I6ICMyMjg4MTE7Cn0KCi8qIGNsYXNzLCBpbnRlcmZhY2UsIG5hbWVzcGFjZSBvciBmdW5jdGlvbiBuYW1lcywgYnV0IG5vdCAkdmFyaWFibGVzICovCnNwYW4ucGhwLXRfc3RyaW5nIHsKICBjb2xvcjogYmxhY2s7Cn0KCnNwYW4ucGhwLXZhcmlhYmxlIHsKICBjb2xvcjogYmxhY2s7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCgpzcGFuLmpzLWxvY2FsdmFyaWFibGUgewogIGNvbG9yOiAjMDA0NDk5Owp9CgpzcGFuLnBocC1jb21tZW50IHsKICBjb2xvcjogI0FBNzcwMDsKICBmb250LXN0cmV0Y2g6IGNvbmRlbnNlZDsKLyogIGZvbnQtc3R5bGU6IGl0YWxpYzsgIFRoaXMgY2F1c2VzIGxpbmUgaGVpZ2h0IHRvIHNsaWdodGx5IGNoYW5nZSwgZ2V0dGluZyBsaW5lIG51bWJlcnMgb3V0IG9mIHN5bmMgKi8KfQoKc3Bhbi5waHAtc3RyaW5nLXNpbmdsZS1xdW90ZWQgewogIGNvbG9yOiAjQUEyMjIyOwp9Ci8qIGRvdWJsZSBxdW90ZWQgc3RyaW5ncyBhbGxvdyBpbnRlcnBvbGF0aW9uICovCnNwYW4ucGhwLXN0cmluZy1kb3VibGUtcXVvdGVkIHsKICBjb2xvcjogI0FBMjIyMjsKICBmb250LXdlaWdodDogYm9sZDsKfQoKc3Bhbi5zeW50YXgtZXJyb3IgewogIGJhY2tncm91bmQtY29sb3I6IHJlZDsKfQoKc3Bhbi5kZXByZWNhdGVkIHsKICBmb250LXNpemU6IHNtYWxsZXI7Cn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/php/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLQpDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpUaGUgY29weXJpZ2h0cyBlbWJvZGllZCBpbiB0aGUgY29udGVudCBvZiB0aGlzIGZpbGUgYXJlIGxpY2Vuc2VkIGJ5CllhaG9vISBJbmMuIHVuZGVyIHRoZSBCU0QgKHJldmlzZWQpIG9wZW4gc291cmNlIGxpY2Vuc2UKCkBhdXRob3IgRGFuIFZsYWQgRGFzY2FsZXNjdSA8ZGFuZHZAeWFob28taW5jLmNvbT4KCi0tPgoKCjxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KICA8aGVhZD4KICAgIDxzY3JpcHQgc3JjPSIuLi8uLi9qcy9jb2RlbWlycm9yLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFBIUCtIVE1MK0phdmFTY3JpcHQrQ1NTIG1peGVkLW1vZGUgZGVtb25zdHJhdGlvbjwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9jc3MvZG9jcy5jc3MiLz4KICA8L2hlYWQ+CiAgPGJvZHkgc3R5bGU9InBhZGRpbmc6IDIwcHg7Ij4KCiAgICA8cD5UaGlzIGlzIGEgY29tcGxleCBkZW1vbnN0cmF0aW9uIG9mIHRoZSA8Yj5QSFArSFRNTCtKYXZhU2NyaXB0K0NTUyBtaXhlZC1tb2RlCiAgICBzeW50YXggaGlnaGxpZ2h0PC9iPiBjYXBhYmlsaXRpZXMgb2YgPGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+Q29kZU1pcnJvcjwvYT4uCiAgICAmbHQ7P3BocCAuLi4gPz4gdGFncyB1c2UgdGhlIFBIUCBwYXJzZXIsICZsdDtzY3JpcHQ+IHRhZ3MgdXNlIHRoZSBKYXZhU2NyaXB0CiAgICBwYXJzZXIsIGFuZCAmbHQ7c3R5bGU+IHRhZ3MgdXNlIHRoZSBDU1MgcGFyc2VyLiBUaGUgcmVzdCBvZiB0aGUgY29udGVudCBpcwogICAgcGFyc2VkIHVzaW5nIHRoZSBYTUwgcGFyc2VyIGluIEhUTUwgbW9kZS48L3A+CgogICAgPHA+RmVhdHVyZXMgb2YgdGhlIFBIUCBwYXJzZXI6CiAgICA8dWw+CiAgICAgIDxsaT5zcGVjaWFsICJkZXByZWNhdGVkIiBzdHlsZSBmb3IgUEhQNCBrZXl3b3JkcyBsaWtlICd2YXInCiAgICAgIDxsaT5zdXBwb3J0IGZvciBQSFAgNS4zIGtleXdvcmRzOiAnbmFtZXNwYWNlJywgJ3VzZScKICAgICAgPGxpPjkxMSBwcmVkZWZpbmVkIGNvbnN0YW50cywgMTMwMSBwcmVkZWZpbmVkIGZ1bmN0aW9ucywgMTA1IHByZWRlY2xhcmVkIGNsYXNzZXMKICAgICAgICBmcm9tIGEgdHlwaWNhbCBQSFAgaW5zdGFsbGF0aW9uIGluIGEgTEFNUCBlbnZpcm9ubWVudAogICAgICA8bGk+bmV3IGZlYXR1cmU6IHN5bnRheCBlcnJvciBmbGFnZ2luZywgdGh1cyBlbmFibGluZyBzdHJpY3QgcGFyc2luZyBvZjoKICAgICAgICA8b2w+CiAgICAgICAgICA8bGk+ZnVuY3Rpb24gZGVmaW5pdGlvbnMgd2l0aCBleHBsaWNpdGx5IG9yIGltcGxpY2l0bHkgdHlwZWQgYXJndW1lbnRzIGFuZCBkZWZhdWx0IHZhbHVlcwogICAgICAgICAgPGxpPm1vZGlmaWVycyAocHVibGljLCBzdGF0aWMgZXRjLikgYXBwbGllZCB0byBtZXRob2QgYW5kIG1lbWJlciBkZWZpbml0aW9ucwogICAgICAgICAgPGxpPmZvcmVhY2goYXJyYXlfZXhwcmVzc2lvbiBhcyAka2V5IFs9PiAkdmFsdWVdKSBsb29wcwogICAgICAgIDwvb2w+CiAgICAgIDxsaT5kaWZmZXJlbnRpYXRpb24gYmV0d2VlbiBzaW5nbGUtcXVvdGVkIHN0cmluZ3MgYW5kIGRvdWJsZS1xdW90ZWQgaW50ZXJwb2xhdGluZyBzdHJpbmdzCiAgICA8L3VsPgogICAgPC9wPgoKICAgIDxkaXYgc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyBwYWRkaW5nOiAzcHg7IGJhY2tncm91bmQtY29sb3I6ICNGOEY4RjgiPgogICAgPHRleHRhcmVhIGlkPSJjb2RlIiBjb2xzPSIxMjAiIHJvd3M9IjMwIj4KVGhlICJyb290IiBwYXJzZXIgaXMgWE1MIGluIEhUTUwgbW9kZS4KTmV4dCwgd2UgY2FuIHN3aXRjaCBpbnRvIFBIUCBtb2RlLCBmb3IgZXhhbXBsZS4gVGhpcyBpcwo8P3BocCBlY2hvICd0ZXh0IG91dHB1dCBieSc7Cj8+ClBIUC4gPC9iPgpPbiB0aGUgbGluZSBhYm92ZSwgd2UganVzdCBoYWQgYW4gWE1MIHN5bnRheCBlcnJvciBkdWUgdG8gdGhlIDwvYj4gdGFnIG5vdCBiZWluZyBvcGVuZWQuCgo8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCcgc3RhbmRhbG9uZT0neWVzJz8+ICAgSFRNTCB0ZXh0IHdpbGwgZm9sbG93CjxodG1sPgogIDxoZWFkPgogICAgPHRpdGxlPlNpbWlsYXJseSwgdGhlICdzY3JpcHQnIHRhZyB3aWxsIHN3aXRjaCB0byB0aGUgSmF2YVNjcmlwdCBwYXJzZXI6PC90aXRsZT4KICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KICAgICAgIC8vIFByZXNzIGVudGVyIGluc2lkZSB0aGUgb2JqZWN0IGFuZCB5b3VyIG5ldyBsaW5lIHdpbGwgYmUgc3VpdGFibHkKICAgICAgIC8vIGluZGVudGVkLgogICAgICAgdmFyIGtleUJpbmRpbmdzID0gewogICAgICAgICBlbnRlcjogIm5ld2xpbmUtYW5kLWluZGVudCIsCiAgICAgICAgIHRhYjogInJlaW5kZW50LXNlbGVjdGlvbiIsCiAgICAgICAgIGN0cmxfZW50ZXI6ICJyZXBhcnNlLWJ1ZmZlciIsCiAgICAgICAgIGN0cmxfejogInVuZG8iLAogICAgICAgICBjdHJsX3k6ICJyZWRvIiwKICAgICAgICAgY3RybF9iYWNrc3BhY2U6ICJ1bmRvLWZvci1zYWZhcmktd2hpY2gtc3R1cGlkbHktZW5vdWdoLWJsb2Nrcy1jdHJsLXoiCiAgICAgICB9OwoKICAgICAgIC8vIFByZXNzIHRhYiBvbiB0aGUgbmV4dCBsaW5lIGFuZCB0aGUgd3JvbmcgaW5kZW50YXRpb24gd2lsbCBiZSBmaXhlZC4KICAgICAgICAgICAgIHZhciByZWdleCA9IC9mb298YmFyL2k7CgogICAgICAgZnVuY3Rpb24gZXhhbXBsZSh4KSB7CiAgICAgICAgIC8vIExvY2FsIHZhcmlhYmxlcyBnZXQgYSBkaWZmZXJlbnQgY29sb3VyIHRoYW4gZ2xvYmFsIG9uZXMuCiAgICAgICAgIHZhciB5ID0gNDQuNDsKICAgICAgICAgcmV0dXJuIHggKyB5IC0gejsKICAgICAgIH0KICAgIDwvc2NyaXB0PgogICAgPHN0eWxlPgogICAgICAvKiBTb21lIGV4YW1wbGUgQ1NTICovCgogICAgICBAaW1wb3J0IHVybCgic29tZXRoaW5nLmNzcyIpOwoKICAgICAgYm9keSB7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmc6IDNlbSA2ZW07CiAgICAgICAgZm9udC1mYW1pbHk6IHRhaG9tYSwgYXJpYWwsIHNhbnMtc2VyaWY7CiAgICAgICAgY29sb3I6ICMwMDA7CiAgICAgIH0KCiAgICAgICNuYXZpZ2F0aW9uIGEgewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICBoMSB7CiAgICAgICAgZm9udC1zaXplOiAyLjVlbTsKICAgICAgfQoKICAgICAgaDE6YmVmb3JlLCBoMjpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICI6OiI7CiAgICAgIH0KCiAgICAgIGNvZGUgewogICAgICAgIGZvbnQtZmFtaWx5OiBjb3VyaWVyLCBtb25vc3BhY2U7CiAgICAgICAgZm9udC1zaXplOiA4MCU7CiAgICAgICAgY29sb3I6ICM0MThBOEE7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgoKICA8Ym9keT4KCiAgVGhlIFBIUCBjb2RlIGJlbG93IGNvbnRhaW5zIHNvbWUgZGVsaWJlcmF0ZSBlcnJvcnMuIFBsYXkgd2l0aCB0aGUgZWRpdG9yIGJ5IGZpeGluZyB0aGVtCiAgYW5kIG9ic2VydmluZyBob3cgdGhlIGhpZ2hsaWdodCBjaGFuZ2VzLgoKICAgIDw/cGhwCiAgICBuYW1lc3BhY2UgQTsKICAgIG5hbWVzcGFjZSBBOjpCOjpDOwogICAgbmFtZXNwYWNlIEE6Ojo6QjsKICAgIG5hbWVzcGFjZSBBOjpCOjpDOjo7CiAgICBuYW1lc3BhY2UgQTo6Qjo6Qzo6RCB4OwogICAgc2VsZjo6cmFuZ2UoJHJvd1snbGZ0J10sICRyb3dbJ3JndCddKSk7ICAvLyBlcnJvcjogZXh0cmEgJyknCiAgICAkYSA9IChiKCkgKyA0KSA1IGZvbzsgIC8vIGVycm9yOiBtaXNzaW5nIG9wZXJhdG9ycwogICAgc2VsZjo6JHZhcjsKICAgICRwYXJlbnQgPSBzZWxmOjpyYW5nZSgkbWF4ICsgMSwgJG1heCArIDEpOwogICAgJHJvd1thdHRyaWJ1dGVzXVskYXR0cmlidXRlX25hbWVdID0gJGF0dHJpYnV0ZV92YWx1ZTsKICAgICRyb3dbYXR0cmlidXRlcygpXVskYXR0cmlidXRlX25hbWVdID0gJGF0dHJpYnV0ZV92YWx1ZTsKICAgICRyb3dbYXR0cmlidXRlcyg1KV1bJGF0dHJpYnV0ZV9uYW1lXSA9ICRhdHRyaWJ1dGVfdmFsdWU7CiAgICAkcm93WyRhdHRyaWJ1dGVzKCldWyRhdHRyaWJ1dGVfbmFtZV0gPSAkYXR0cmlidXRlX3ZhbHVlOwogICAgYWJzdHJhY3QgY2xhc3MgNSBleHRlbmRzIGZvbyBpbXBsZW1lbnRzIGVjaG8gewogICAgICAgIHByaXZhdGUgZnVuY3Rpb24gZG9tYWluT2JqZWN0QnVpbGRlcigpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT51c2VfZG9tYWluX29iamVjdF9idWlsZGVyCiAgICAgICAgICAgICAgICAgICA/ICR0aGlzLT5kb21haW4oKS0+b2JqZWN0QnVpbGRlcigpCiAgICAgICAgICAgICAgICAgICA6IG51bGw7CiAgICAgICAgfQoKICAgICAgICBjb25zdCAkbXljb25zdCA9ICdzb21lIHN0cmluZyc7CiAgICAgICAgJGFycmF5W215Y29uc3RdID0gNDsKICAgICAgICAvLyB0aGlzIGlzIGEgc2luZ2xlLWxpbmUgQysrLXN0eWxlIGNvbW1lbnQKICAgICAgICAjIHRoaXMgaXMgYSBzaW5nbGUtbGluZSBzaGVsbC1zdHlsZSBjb21tZW50CiAgICAgICAgcHJpdmF0ZSB2YXIgJGEgPSBfX0ZJTEVfXzsKICAgICAgICBwcm90ZWN0ZWQgc3RhdGljICRiID0gdGltZXpvbmVfdHJhbnNpdGlvbnNfZ2V0KCdzb21lIHBhcmFtZXRlciBoZXJlJyk7CiAgICAgICAgZ2xvYmFsICRnID0gaXNzZXQoInN0cmluZyIpOwogICAgICAgIHN0YXRpYyAkcyA9IGhhc2hfdXBkYXRlX2ZpbGU7ICAvLyB3YXJuaW5nOiBwcmVkZWZpbmVkIGZ1bmN0aW9uIG5vbi1jYWxsCiAgICAgICAgZnVuY3Rpb24gbWlrZSAoJHZhcikgJGZvbzsKICAgICAgICBtaWtlKEE6OmZ1bmMocGFyYW0pKTsKICAgICAgICBmdW5jKCRiICRjKTsgIC8vIGVycm9yOiBmdW5jdGlvbiBwYXJhbWV0ZXJzIG11c3QgYmUgY29tbWEtc2VwYXJhdGVkCiAgICAgICAgZm9vIGJhcjsgIC8vIGVycm9yOiBubyBvcGVyYXRvcgogICAgICAgICRiYXogJHF1dXg7ICAvLyBlcnJvcjogbm8gb3BlcmF0b3IKICAgICAgICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gbG9hZFBhZ2VYTUwodXRpbF9GaWxlUGF0aCAkZmlsZW5hbWUsICRtZXJnZT0wKyRmb28sICR4LCAkeT0zKSB7CiAgICAgICAgICAgICRuZXdyb3dbJGtleV0gPSAkdmFsOwogICAgICAgICAgICAkbmV3cmVzdWx0W10gPSAkcm93OwogICAgICAgICAgICAkc3RhdGUgPSAkcm93WydjJ10gPT0gMTsKICAgICAgICAgICAgJGF0dHJpYnV0ZV92YWx1ZXNbJGF0dHJpYnV0ZV9uYW1lXSA9IG51bGw7CiAgICAgICAgICAgICRyb3dbJ2F0dHJpYnV0ZXMnXVskYXR0cmlidXRlX25hbWVdID0gJGF0dHJpYnV0ZV92YWx1ZTsKICAgICAgICAgICAgJHJlc3VsdFskcm93WydlbGVtZW50J11dWyRyb3dbJ2F0dHJpYnV0ZSddXSA9ICRyb3dbJ3ZhbHVlJ107CiAgICAgICAgICAgICRzcWwgPSAibXVsdGlsaW5lIHN0cmluZwpsaW5lMiBpcyBzcGVjaWFsIC0gaXQnbGwgaW50ZXJwb2xhdGUgdmFyaWFibGVzIGxpa2UgJHN0YXRlIGFuZCBtZXRob2QgY2FsbHMKeyR0aGlzLT5jYWNoZS0+YWRkKCRrZXksIDUpfSBhbmQgbWF5YmUgXCJtb3JlXCIKCmxpbmU1IjsKICAgICAgICAgICAgJHNxbCA9ICdtdWx0aWxpbmUgc3RyaW5nCnNpbmdsZSBxdW90aW5nIG1lYW5zIG5vIFwnaW50ZXJwb2xhdGlvblwnIGxpa2UgIiRzdGFydCIgb3IgbWV0aG9kIGNhbGwKeyR0aGlzLT5jYWNoZS0+YWRkKCRrZXksIDUpfSB3aWxsIGhhcHBlbgoKbGluZTUnOwogICAgICAgICAgICAkYml0cGF0dGVybiA9IDEgPDwgMjsKICAgICAgICAgICAgJGJpdHBhdHRlcm4gPDw9IDM7CiAgICAgICAgICAgICRpbmNvcnJlY3QgPSA8PDwgNSBFT1NUUklORyAgLy8gRklYTUU6IENvZGVNaXJyb3IgdXBkYXRlIGJ1ZzogYWRkIGEgbGV0dGVyIGJlZm9yZSA1IGFuZCBub3RpY2UgdGhhdCBzeW50YXggaXMgbm90IHVwZGF0ZWQgdW50aWwgRU9GLCBldmVuIHdpdGggY29udGludW91c1NjYW5uaW5nOiA1MDAKZXJyb3I6IHRoZSBpZGVudGlmaWVyIG11c3QgY29uZm9ybSB0byB0aGUgaWRlbnRpZmllciBydWxlcwpFT1NUUklORzsKICAgICAgICAgICAgJHNxbCA9IDw8PCBFT1NRTAogICAgICAgICAgICAgICAgU0VMRUNUIGF0dHJpYnV0ZSwgZWxlbWVudCwgdmFsdWUKICAgICAgICAgICAgICAgIEZST00gYXR0cmlidXRlX3ZhbHVlcwogICAgICAgICAgICAgICAgV0hFUkUgZGltZW5zaW9uID0gPwpFT1NRTDsKICAgICAgICAgICAgJHRoaXMtPmxyX2NhY2hlLT5hZGQoJGtleSwgc2VsZjo6cmFuZ2UoJHJvd1snbGZ0J10sICRyb3dbJ3JndCddKSk7CiAgICAgICAgICAgICRjb21wb3NpdGVfc3RyaW5nID0gPDw8RU9TVFJJTkcKc29tZSBsaW5lcyBoZXJlCkVPU1RSSU5HCi4gJ3NvbWV0aGluZyBleHRyYSc7CiAgICAgICAgICAgICRwYWdlX2xmdCA9ICgkZG9tYWluLT5uYW1lKCkgPT0gJ3BhZ2UnKSA/ICRzdGFydCArIDEgOiAkcGFnZV9zdGFydCArIDE7CiAgICAgICAgICAgIGVjaG8gIlRoaXMgaXMgY2xhc3MgZm9vIjsKICAgICAgICAgICAgZWNobyAiYSA9ICIuJHRoaXMgLT5hWzIrMyokYXJyYXlbImZvbyJdXS4iIjsKICAgICAgICAgICAgZWNobyAiYiA9IHskdGhpcy0+Yn0iOyAgLy8gRklYTUU6IGhpZ2hsaWdodCBpbnRlcnBvbGF0aW9uIGluIHN0cmluZ3MKICAgICAgICB9CiAgICAgICAgZmluYWwgZnVuY3Rpb24gbWFrZWNvZmZlZSBlcnJvcigkdHlwZXMgPSBhcnJheSgiY2FwcHVjY2lubyIpLCAkY29mZmVlTWFrZXIgPSBOVUxMKSB7CiAgICAgICAgICAgICRvdXRfb2Zfd2F5X2Ftb3VudCA9ICRtYXggLSAkY2hpbGQtPmxlZnQoKSArIDE7CiAgICAgICAgICAgICRhYnNvbHV0ZV9wb3MgPSAkY2hpbGQtPmxlZnQoKSAtICRtb3ZlLT53aWR0aCgpOwogICAgICAgICAgICAkdmFyZnVuYygxLCAneCcpOwogICAgICAgICAgICAkdmFyZnVuYygxLCAneCcpICsgZm9vKCkgLSA1OwogICAgICAgICAgICAkZnVuY2FycmF5WyRpXSgncGFyYW0xJywgJHBhcmFtMik7CiAgICAgICAgICAgICAgICAkbHJbJGRvbWFpbl9uYW1lXSA9ICR0aGlzLT5nZXRfbGVmdF9hbmRfcmlnaHQoJGRvbWFpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGltZW5zaW9uX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVsZW1lbnRfbmFtZSk7CiAgICAgICAgICAgICRkb21haW5fbGlzdCA9IGlzX251bGwoJGRvbWFpbikgPwogICAgICAgICAgICAgICAgICAgICAgICAgICByM19Eb21haW46Om5hbWVzKCkgOgogICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheSgkZG9tYWluLT5uYW1lKCkpOwogICAgICAgICAgICBmb3JlYWNoIChyM19Eb21haW46Om5hbWVzKCkgYXMgJGRvbWFpbl9uYW1lKSB7CiAgICAgICAgICAgICAgICAkcGxhY2Vob2xkZXJzID0gJ2Rpc3RhbmNlIExJS0UgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiBpbXBsb2RlKGFycmF5X2ZpbGwoMSwgJG51bV9kaXN0YW5jZXMsICc/JyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBPUiBkaXN0YW5jZSBMSUtFICcpOwoKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnRhcmdldCokdGhpcy0+dHJhbnMrbXlmdW5jKF9fTUVUSE9EX18pOwogICAgICAgICAgICAvKgogICAgICAgICAgICBlY2hvICdUaGlzIGlzIGEgdGVzdCc7IC8qIFRoaXMgY29tbWVudCB3aWxsIGNhdXNlIGEgcHJvYmxlbSAqLwogICAgICAgICAgICAqLwogICAgICAgIH0KICAgICAgICBzd2l0Y2goICR0eXBlICkgewogICAgICAgICAgICBjYXNlICJyM2NvcmVfQWRkVGVtcGxhdGVUb1RhcmdldEV2ZW50IjoKICAgICAgICAgICAgICAgICR0aGlzLT5ub3RpZnlBZGRUZW1wbGF0ZVRvVGFyZ2V0KCAkZ2VuZXZlbnQgKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJyM2NvcmVfR2VuZXJhdGVUYXJnZXRFdmVudCIgJHRoaXM6CiAgICAgICAgICAgICAgICBmb3IoJGk9MDsgJGk8PXRoaXMtPm1ldGhvZCgpOyAkaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgZWNobyAnU3ludGF4ICJoaWdobGlnaHRpbmciJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkYXJyYXkgeG9yICRsb2FkZXItPnBhcnNlX2ZuKCRmaWxlbmFtZSkgYXMgJGtleSA9PiB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgcjM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBjYXRjaCggRXhjZXB0aW9uICRlICkgewogICAgICAgICAgICAgICAgICAgIC8qKiByZXN0b3JlIHRoZSBiYWNrdXAKICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5sb2FkQWxsKCR0bXAsICRldmVudCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgLy8gYHBocCAtbGAgZG9lc24ndCBjb21wbGFpbiBhdCBhbGwgYXQgdGhpcyAoaXQgYXNzdW1lcyBzdHJpbmcgY29uc3RhbnRzKToKICAgICAgICAgICAgICAgICAgICB0aGlzICsgbWFrZXMgKiBubyAtIHNlbnNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgZGVmYXVsdCBtb286CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcjNfdXRpbF9FeGNlcHRpb24oIGdldF9jbGFzcyggJGdlbmV2ZW50ICkgLiAiIGRvZXMgbm90IG1hcCIgKTsKICAgICAgICB9CgoKICAgIH07CgogICAgPz4KCiAgICA8cjM6Y3BocD4KICAgICAgICBwaHAoIndvcmtzIiwgJGhlcmUsIDIpOwogICAgPC9yMzpjcGhwPgoKICAgIDxyNDpjcGhwPgogICAgY2xhc3MgZm9vIHsKICAgICAgICAvLyBhIGNvbW1lbnQKICAgICAgICB2YXIgJGE7CiAgICAgICAgdmFyICRiOwogICAgfTsKICAgIDwvcjQ6Y3BocD4KCiAgPGgxPlRoaXMgaXMgYW4gPD9waHAgIyBlY2hvICdzaW1wbGUnOz8+IGV4YW1wbGUuPC9oMT4KICA8cD5UaGUgaGVhZGVyIGFib3ZlIHdpbGwgc2F5ICdUaGlzIGlzIGFuICBleGFtcGxlJy48L3A+CiAgPGgxPlRoaXMgaXMgYW4gPD9waHAgLy8gZWNobyAnc2ltcGxlJzs/PiBleGFtcGxlLjwvaDE+CgogIDw/cGhwIGVjaG87ID8+CiAgICA8Ym9keT4KCjw/cGhwIGVjaG8gIjxodG1sPgogIDxoZWFkPgogICAgPHNjcmlwdD4KICAgIHZhciBmb28gPSAnYmFyJzsKICAgIDwvc2NyaXB0PgogICAgPHN0eWxlPgogICAgICBzcGFuLnRlc3Qge2ZvbnQtZmFtaWx5OiBhcmlhbCwgJ2x1Y2lkYSBjb25zb2xlJywgc2Fucy1zZXJpZn0KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPCEtLSBjb21tZW50IC0tPgogIDwvYm9keT4KPC9odG1sPiI7ID8+Cgo8L2JvZHk+CjwvaHRtbD4KCgogICAgPC90ZXh0YXJlYT4KICAgIDwvZGl2PgoKICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKCdjb2RlJywgewogICAgICAgIGhlaWdodDogIjM1MHB4IiwKICAgICAgICBwYXJzZXJmaWxlOiBbInBhcnNleG1sLmpzIiwgInBhcnNlY3NzLmpzIiwgInRva2VuaXplamF2YXNjcmlwdC5qcyIsICJwYXJzZWphdmFzY3JpcHQuanMiLAogICAgICAgICAgICAgICAgICAgICAiLi4vY29udHJpYi9waHAvanMvdG9rZW5pemVwaHAuanMiLCAiLi4vY29udHJpYi9waHAvanMvcGFyc2VwaHAuanMiLAogICAgICAgICAgICAgICAgICAgICAiLi4vY29udHJpYi9waHAvanMvcGFyc2VwaHBodG1sbWl4ZWQuanMiXSwKICAgICAgICBzdHlsZXNoZWV0OiBbIi4uLy4uL2Nzcy94bWxjb2xvcnMuY3NzIiwgIi4uLy4uL2Nzcy9qc2NvbG9ycy5jc3MiLCAiLi4vLi4vY3NzL2Nzc2NvbG9ycy5jc3MiLCAiY3NzL3BocGNvbG9ycy5jc3MiXSwKICAgICAgICBwYXRoOiAiLi4vLi4vanMvIiwKICAgICAgICBjb250aW51b3VzU2Nhbm5pbmc6IDUwMAogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKCiAgPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/php/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/php/js/parsephp.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVGhlIGNvcHlyaWdodHMgZW1ib2RpZWQgaW4gdGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlIGFyZSBsaWNlbnNlZCBieQpZYWhvbyEgSW5jLiB1bmRlciB0aGUgQlNEIChyZXZpc2VkKSBvcGVuIHNvdXJjZSBsaWNlbnNlCgpAYXV0aG9yIERhbiBWbGFkIERhc2NhbGVzY3UgPGRhbmR2QHlhaG9vLWluYy5jb20+CgoKUGFyc2UgZnVuY3Rpb24gZm9yIFBIUC4gTWFrZXMgdXNlIG9mIHRoZSB0b2tlbml6ZXIgZnJvbSB0b2tlbml6ZXBocC5qcy4KQmFzZWQgb24gcGFyc2VqYXZhc2NyaXB0LmpzIGJ5IE1hcmlqbiBIYXZlcmJla2UuCgoKRmVhdHVyZXM6CiArIHNwZWNpYWwgImRlcHJlY2F0ZWQiIHN0eWxlIGZvciBQSFA0IGtleXdvcmRzIGxpa2UgJ3ZhcicKICsgc3VwcG9ydCBmb3IgUEhQIDUuMyBrZXl3b3JkczogJ25hbWVzcGFjZScsICd1c2UnCiArIDkxMSBwcmVkZWZpbmVkIGNvbnN0YW50cywgMTMwMSBwcmVkZWZpbmVkIGZ1bmN0aW9ucywgMTA1IHByZWRlY2xhcmVkIGNsYXNzZXMKICAgZnJvbSBhIHR5cGljYWwgUEhQIGluc3RhbGxhdGlvbiBpbiBhIExBTVAgZW52aXJvbm1lbnQKICsgbmV3IGZlYXR1cmU6IHN5bnRheCBlcnJvciBmbGFnZ2luZywgdGh1cyBlbmFibGluZyBzdHJpY3QgcGFyc2luZyBvZjoKICAgKyBmdW5jdGlvbiBkZWZpbml0aW9ucyB3aXRoIGV4cGxpY2l0bHkgb3IgaW1wbGljaXRseSB0eXBlZCBhcmd1bWVudHMgYW5kIGRlZmF1bHQgdmFsdWVzCiAgICsgbW9kaWZpZXJzIChwdWJsaWMsIHN0YXRpYyBldGMuKSBhcHBsaWVkIHRvIG1ldGhvZCBhbmQgbWVtYmVyIGRlZmluaXRpb25zCiAgICsgZm9yZWFjaChhcnJheV9leHByZXNzaW9uIGFzICRrZXkgWz0+ICR2YWx1ZV0pIGxvb3BzCiArIGRpZmZlcmVudGlhdGlvbiBiZXR3ZWVuIHNpbmdsZS1xdW90ZWQgc3RyaW5ncyBhbmQgZG91YmxlLXF1b3RlZCBpbnRlcnBvbGF0aW5nIHN0cmluZ3MKCiovCgoKLy8gYWRkIHRoZSBBcnJheS5pbmRleE9mIG1ldGhvZCBmb3IgSlMgZW5naW5lcyB0aGF0IGRvbid0IHN1cHBvcnQgaXQgKGUuZy4gSUUpCi8vIGNvZGUgZnJvbSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9Fbi9Db3JlX0phdmFTY3JpcHRfMS41X1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9JbmRleE9mCmlmICghQXJyYXkucHJvdG90eXBlLmluZGV4T2YpCnsKICBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uKGVsdCAvKiwgZnJvbSovKQogIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKCiAgICB2YXIgZnJvbSA9IE51bWJlcihhcmd1bWVudHNbMV0pIHx8IDA7CiAgICBmcm9tID0gKGZyb20gPCAwKQogICAgICAgICA/IE1hdGguY2VpbChmcm9tKQogICAgICAgICA6IE1hdGguZmxvb3IoZnJvbSk7CiAgICBpZiAoZnJvbSA8IDApCiAgICAgIGZyb20gKz0gbGVuOwoKICAgIGZvciAoOyBmcm9tIDwgbGVuOyBmcm9tKyspCiAgICB7CiAgICAgIGlmIChmcm9tIGluIHRoaXMgJiYKICAgICAgICAgIHRoaXNbZnJvbV0gPT09IGVsdCkKICAgICAgICByZXR1cm4gZnJvbTsKICAgIH0KICAgIHJldHVybiAtMTsKICB9Owp9CgoKdmFyIFBIUFBhcnNlciA9IEVkaXRvci5QYXJzZXIgPSAoZnVuY3Rpb24oKSB7CiAgLy8gVG9rZW4gdHlwZXMgdGhhdCBjYW4gYmUgY29uc2lkZXJlZCB0byBiZSBhdG9tcywgcGFydCBvZiBvcGVyYXRvciBleHByZXNzaW9ucwogIHZhciBhdG9taWNUeXBlcyA9IHsKICAgICJhdG9tIjogdHJ1ZSwgIm51bWJlciI6IHRydWUsICJ2YXJpYWJsZSI6IHRydWUsICJzdHJpbmciOiB0cnVlCiAgfTsKICAvLyBDb25zdHJ1Y3RvciBmb3IgdGhlIGxleGljYWwgY29udGV4dCBvYmplY3RzLgogIGZ1bmN0aW9uIFBIUExleGljYWwoaW5kZW50ZWQsIGNvbHVtbiwgdHlwZSwgYWxpZ24sIHByZXYsIGluZm8pIHsKICAgIC8vIGluZGVudGF0aW9uIGF0IHN0YXJ0IG9mIHRoaXMgbGluZQogICAgdGhpcy5pbmRlbnRlZCA9IGluZGVudGVkOwogICAgLy8gY29sdW1uIGF0IHdoaWNoIHRoaXMgc2NvcGUgd2FzIG9wZW5lZAogICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47CiAgICAvLyB0eXBlIG9mIHNjb3BlICgnc3RhdCcgKHN0YXRlbWVudCksICdmb3JtJyAoc3BlY2lhbCBmb3JtKSwgJ1snLCAneycsIG9yICcoJykKICAgIHRoaXMudHlwZSA9IHR5cGU7CiAgICAvLyAnWycsICd7Jywgb3IgJygnIGJsb2NrcyB0aGF0IGhhdmUgYW55IHRleHQgYWZ0ZXIgdGhlaXIgb3BlbmluZwogICAgLy8gY2hhcmFjdGVyIGFyZSBzYWlkIHRvIGJlICdhbGlnbmVkJyAtLSBhbnkgbGluZXMgYmVsb3cgYXJlCiAgICAvLyBpbmRlbnRlZCBhbGwgdGhlIHdheSB0byB0aGUgb3BlbmluZyBjaGFyYWN0ZXIuCiAgICBpZiAoYWxpZ24gIT0gbnVsbCkKICAgICAgdGhpcy5hbGlnbiA9IGFsaWduOwogICAgLy8gUGFyZW50IHNjb3BlLCBpZiBhbnkuCiAgICB0aGlzLnByZXYgPSBwcmV2OwogICAgdGhpcy5pbmZvID0gaW5mbzsKICB9CgogIC8vIFBIUCBpbmRlbnRhdGlvbiBydWxlcwogIGZ1bmN0aW9uIGluZGVudFBIUChsZXhpY2FsKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oZmlyc3RDaGFycykgewogICAgICB2YXIgZmlyc3RDaGFyID0gZmlyc3RDaGFycyAmJiBmaXJzdENoYXJzLmNoYXJBdCgwKSwgdHlwZSA9IGxleGljYWwudHlwZTsKICAgICAgdmFyIGNsb3NpbmcgPSBmaXJzdENoYXIgPT0gdHlwZTsKICAgICAgaWYgKHR5cGUgPT0gImZvcm0iICYmIGZpcnN0Q2hhciA9PSAieyIpCiAgICAgICAgcmV0dXJuIGxleGljYWwuaW5kZW50ZWQ7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gInN0YXQiIHx8IHR5cGUgPT0gImZvcm0iKQogICAgICAgIHJldHVybiBsZXhpY2FsLmluZGVudGVkICsgaW5kZW50VW5pdDsKICAgICAgZWxzZSBpZiAobGV4aWNhbC5pbmZvID09ICJzd2l0Y2giICYmICFjbG9zaW5nKQogICAgICAgIHJldHVybiBsZXhpY2FsLmluZGVudGVkICsgKC9eKD86Y2FzZXxkZWZhdWx0KVxiLy50ZXN0KGZpcnN0Q2hhcnMpID8gaW5kZW50VW5pdCA6IDIgKiBpbmRlbnRVbml0KTsKICAgICAgZWxzZSBpZiAobGV4aWNhbC5hbGlnbikKICAgICAgICByZXR1cm4gbGV4aWNhbC5jb2x1bW4gLSAoY2xvc2luZyA/IDEgOiAwKTsKICAgICAgZWxzZQogICAgICAgIHJldHVybiBsZXhpY2FsLmluZGVudGVkICsgKGNsb3NpbmcgPyAwIDogaW5kZW50VW5pdCk7CiAgICB9OwogIH0KCiAgLy8gVGhlIHBhcnNlci1pdGVyYXRvci1wcm9kdWNpbmcgZnVuY3Rpb24gaXRzZWxmLgogIGZ1bmN0aW9uIHBhcnNlUEhQKGlucHV0LCBiYXNlY29sdW1uKSB7CiAgICAvLyBXcmFwIHRoZSBpbnB1dCBpbiBhIHRva2VuIHN0cmVhbQogICAgdmFyIHRva2VucyA9IHRva2VuaXplUEhQKGlucHV0KTsKICAgIC8vIFRoZSBwYXJzZXIgc3RhdGUuIGNjIGlzIGEgc3RhY2sgb2YgYWN0aW9ucyB0aGF0IGhhdmUgdG8gYmUKICAgIC8vIHBlcmZvcm1lZCB0byBmaW5pc2ggdGhlIGN1cnJlbnQgc3RhdGVtZW50LiBGb3IgZXhhbXBsZSB3ZSBtaWdodAogICAgLy8ga25vdyB0aGF0IHdlIHN0aWxsIG5lZWQgdG8gZmluZCBhIGNsb3NpbmcgcGFyZW50aGVzaXMgYW5kIGEKICAgIC8vIHNlbWljb2xvbi4gQWN0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSBzdGFjayBnbyBmaXJzdC4gSXQgaXMKICAgIC8vIGluaXRpYWxpemVkIHdpdGggYW4gaW5maW5pdGVseSBsb29waW5nIGFjdGlvbiB0aGF0IGNvbnN1bWVzCiAgICAvLyB3aG9sZSBzdGF0ZW1lbnRzLgogICAgdmFyIGNjID0gW3N0YXRlbWVudHNdOwogICAgLy8gVGhlIGxleGljYWwgc2NvcGUsIHVzZWQgbW9zdGx5IGZvciBpbmRlbnRhdGlvbi4KICAgIHZhciBsZXhpY2FsID0gbmV3IFBIUExleGljYWwoKGJhc2Vjb2x1bW4gfHwgMCkgLSBpbmRlbnRVbml0LCAwLCAiYmxvY2siLCBmYWxzZSk7CiAgICAvLyBDdXJyZW50IGNvbHVtbiwgYW5kIHRoZSBpbmRlbnRhdGlvbiBhdCB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQKICAgIC8vIGxpbmUuIFVzZWQgdG8gY3JlYXRlIGxleGljYWwgc2NvcGUgb2JqZWN0cy4KICAgIHZhciBjb2x1bW4gPSAwOwogICAgdmFyIGluZGVudGVkID0gMDsKICAgIC8vIFZhcmlhYmxlcyB3aGljaCBhcmUgdXNlZCBieSB0aGUgbWFyaywgY29udCwgYW5kIHBhc3MgZnVuY3Rpb25zCiAgICAvLyBiZWxvdyB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBkcml2ZXIgbG9vcCBpbiB0aGUgJ25leHQnIGZ1bmN0aW9uLgogICAgdmFyIGNvbnN1bWUsIG1hcmtlZDsKCiAgICAvLyBUaGUgaXRlcmF0b3Igb2JqZWN0LgogICAgdmFyIHBhcnNlciA9IHtuZXh0OiBuZXh0LCBjb3B5OiBjb3B5fTsKCiAgICAvLyBwYXJzaW5nIGlzIGFjY29tcGxpc2hlZCBieSBjYWxsaW5nIG5leHQoKSByZXBlYXRlZGx5CiAgICBmdW5jdGlvbiBuZXh0KCl7CiAgICAgIC8vIFN0YXJ0IGJ5IHBlcmZvcm1pbmcgYW55ICdsZXhpY2FsJyBhY3Rpb25zIChhZGp1c3RpbmcgdGhlCiAgICAgIC8vIGxleGljYWwgdmFyaWFibGUpLCBvciB0aGUgb3BlcmF0aW9ucyBiZWxvdyB3aWxsIGJlIHdvcmtpbmcKICAgICAgLy8gd2l0aCB0aGUgd3JvbmcgbGV4aWNhbCBzdGF0ZS4KICAgICAgd2hpbGUoY2NbY2MubGVuZ3RoIC0gMV0ubGV4KQogICAgICAgIGNjLnBvcCgpKCk7CgogICAgICAvLyBGZXRjaCB0aGUgbmV4dCB0b2tlbi4KICAgICAgdmFyIHRva2VuID0gdG9rZW5zLm5leHQoKTsKCiAgICAgIC8vIEFkanVzdCBjb2x1bW4gYW5kIGluZGVudGVkLgogICAgICBpZiAodG9rZW4udHlwZSA9PSAid2hpdGVzcGFjZSIgJiYgY29sdW1uID09IDApCiAgICAgICAgaW5kZW50ZWQgPSB0b2tlbi52YWx1ZS5sZW5ndGg7CiAgICAgIGNvbHVtbiArPSB0b2tlbi52YWx1ZS5sZW5ndGg7CiAgICAgIGlmICh0b2tlbi5jb250ZW50ID09ICJcbiIpewogICAgICAgIGluZGVudGVkID0gY29sdW1uID0gMDsKICAgICAgICAvLyBJZiB0aGUgbGV4aWNhbCBzY29wZSdzIGFsaWduIHByb3BlcnR5IGlzIHN0aWxsIHVuZGVmaW5lZCBhdAogICAgICAgIC8vIHRoZSBlbmQgb2YgdGhlIGxpbmUsIGl0IGlzIGFuIHVuLWFsaWduZWQgc2NvcGUuCiAgICAgICAgaWYgKCEoImFsaWduIiBpbiBsZXhpY2FsKSkKICAgICAgICAgIGxleGljYWwuYWxpZ24gPSBmYWxzZTsKICAgICAgICAvLyBOZXdsaW5lIHRva2VucyBnZXQgYW4gaW5kZW50YXRpb24gZnVuY3Rpb24gYXNzb2NpYXRlZCB3aXRoCiAgICAgICAgLy8gdGhlbS4KICAgICAgICB0b2tlbi5pbmRlbnRhdGlvbiA9IGluZGVudFBIUChsZXhpY2FsKTsKICAgICAgfQogICAgICAvLyBObyBtb3JlIHByb2Nlc3NpbmcgZm9yIG1lYW5pbmdsZXNzIHRva2Vucy4KICAgICAgaWYgKHRva2VuLnR5cGUgPT0gIndoaXRlc3BhY2UiIHx8IHRva2VuLnR5cGUgPT0gImNvbW1lbnQiCiAgICAgICAgfHwgdG9rZW4udHlwZSA9PSAic3RyaW5nX25vdF90ZXJtaW5hdGVkIiApCiAgICAgICAgcmV0dXJuIHRva2VuOwogICAgICAvLyBXaGVuIGEgbWVhbmluZ2Z1bCB0b2tlbiBpcyBmb3VuZCBhbmQgdGhlIGxleGljYWwgc2NvcGUncwogICAgICAvLyBhbGlnbiBpcyB1bmRlZmluZWQsIGl0IGlzIGFuIGFsaWduZWQgc2NvcGUuCiAgICAgIGlmICghKCJhbGlnbiIgaW4gbGV4aWNhbCkpCiAgICAgICAgbGV4aWNhbC5hbGlnbiA9IHRydWU7CgogICAgICAvLyBFeGVjdXRlIGFjdGlvbnMgdW50aWwgb25lICdjb25zdW1lcycgdGhlIHRva2VuIGFuZCB3ZSBjYW4KICAgICAgLy8gcmV0dXJuIGl0LiAnbWFya2VkJyBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgc3R5bGUgb2YgdGhlIGN1cnJlbnQgdG9rZW4uCiAgICAgIHdoaWxlKHRydWUpIHsKICAgICAgICBjb25zdW1lID0gbWFya2VkID0gZmFsc2U7CiAgICAgICAgLy8gVGFrZSBhbmQgZXhlY3V0ZSB0aGUgdG9wbW9zdCBhY3Rpb24uCiAgICAgICAgdmFyIGFjdGlvbiA9IGNjLnBvcCgpOwogICAgICAgIGFjdGlvbih0b2tlbik7CgogICAgICAgIGlmIChjb25zdW1lKXsKICAgICAgICAgIGlmIChtYXJrZWQpCiAgICAgICAgICAgIHRva2VuLnN0eWxlID0gbWFya2VkOwogICAgICAgICAgLy8gSGVyZSB3ZSBkaWZmZXJlbnRpYXRlIGJldHdlZW4gbG9jYWwgYW5kIGdsb2JhbCB2YXJpYWJsZXMuCiAgICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiAxOyAvLyBGaXJlYnVnIHdvcmthcm91bmQgZm9yIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9mYnVnL2lzc3Vlcy9kZXRhaWw/aWQ9MTIzOSNjMQogICAgfQoKICAgIC8vIFRoaXMgbWFrZXMgYSBjb3B5IG9mIHRoZSBwYXJzZXIgc3RhdGUuIEl0IHN0b3JlcyBhbGwgdGhlCiAgICAvLyBzdGF0ZWZ1bCB2YXJpYWJsZXMgaW4gYSBjbG9zdXJlLCBhbmQgcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQKICAgIC8vIHdpbGwgcmVzdG9yZSB0aGVtIHdoZW4gY2FsbGVkIHdpdGggYSBuZXcgaW5wdXQgc3RyZWFtLiBOb3RlCiAgICAvLyB0aGF0IHRoZSBjYyBhcnJheSBoYXMgdG8gYmUgY29waWVkLCBiZWNhdXNlIGl0IGlzIGNvbnRhbnRseQogICAgLy8gYmVpbmcgbW9kaWZpZWQuIExleGljYWwgb2JqZWN0cyBhcmUgbm90IG11dGF0ZWQsIHNvIHRoZXkgY2FuCiAgICAvLyBiZSBzaGFyZWQgYmV0d2VlbiBydW5zIG9mIHRoZSBwYXJzZXIuCiAgICBmdW5jdGlvbiBjb3B5KCl7CiAgICAgIHZhciBfbGV4aWNhbCA9IGxleGljYWwsIF9jYyA9IGNjLmNvbmNhdChbXSksIF90b2tlblN0YXRlID0gdG9rZW5zLnN0YXRlOwoKICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNvcHlQYXJzZXIoaW5wdXQpewogICAgICAgIGxleGljYWwgPSBfbGV4aWNhbDsKICAgICAgICBjYyA9IF9jYy5jb25jYXQoW10pOyAvLyBjb3BpZXMgdGhlIGFycmF5CiAgICAgICAgY29sdW1uID0gaW5kZW50ZWQgPSAwOwogICAgICAgIHRva2VucyA9IHRva2VuaXplUEhQKGlucHV0LCBfdG9rZW5TdGF0ZSk7CiAgICAgICAgcmV0dXJuIHBhcnNlcjsKICAgICAgfTsKICAgIH0KCiAgICAvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIHB1c2hpbmcgYSBudW1iZXIgb2YgYWN0aW9ucyBvbnRvIHRoZSBjYwogICAgLy8gc3RhY2sgaW4gcmV2ZXJzZSBvcmRlci4KICAgIGZ1bmN0aW9uIHB1c2goZnMpewogICAgICBmb3IgKHZhciBpID0gZnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pCiAgICAgICAgY2MucHVzaChmc1tpXSk7CiAgICB9CiAgICAvLyBjb250IGFuZCBwYXNzIGFyZSB1c2VkIGJ5IHRoZSBhY3Rpb24gZnVuY3Rpb25zIHRvIGFkZCBvdGhlcgogICAgLy8gYWN0aW9ucyB0byB0aGUgc3RhY2suIGNvbnQgd2lsbCBjYXVzZSB0aGUgY3VycmVudCB0b2tlbiB0byBiZQogICAgLy8gY29uc3VtZWQsIHBhc3Mgd2lsbCBsZWF2ZSBpdCBmb3IgdGhlIG5leHQgYWN0aW9uLgogICAgZnVuY3Rpb24gY29udCgpewogICAgICBwdXNoKGFyZ3VtZW50cyk7CiAgICAgIGNvbnN1bWUgPSB0cnVlOwogICAgfQogICAgZnVuY3Rpb24gcGFzcygpewogICAgICBwdXNoKGFyZ3VtZW50cyk7CiAgICAgIGNvbnN1bWUgPSBmYWxzZTsKICAgIH0KICAgIC8vIFVzZWQgdG8gY2hhbmdlIHRoZSBzdHlsZSBvZiB0aGUgY3VycmVudCB0b2tlbi4KICAgIGZ1bmN0aW9uIG1hcmsoc3R5bGUpewogICAgICBtYXJrZWQgPSBzdHlsZTsKICAgIH0KICAgIC8vIEFkZCBhIGx5ZXIgb2Ygc3R5bGUgdG8gdGhlIGN1cnJlbnQgdG9rZW4sIGZvciBleGFtcGxlIHN5bnRheC1lcnJvcgogICAgZnVuY3Rpb24gbWFya19hZGQoc3R5bGUpewogICAgICBtYXJrZWQgPSBtYXJrZWQgKyAnICcgKyBzdHlsZTsKICAgIH0KCiAgICAvLyBQdXNoIGEgbmV3IGxleGljYWwgY29udGV4dCBvZiB0aGUgZ2l2ZW4gdHlwZS4KICAgIGZ1bmN0aW9uIHB1c2hsZXgodHlwZSwgaW5mbykgewogICAgICB2YXIgcmVzdWx0ID0gZnVuY3Rpb24gcHVzaGxleGluZygpIHsKICAgICAgICBsZXhpY2FsID0gbmV3IFBIUExleGljYWwoaW5kZW50ZWQsIGNvbHVtbiwgdHlwZSwgbnVsbCwgbGV4aWNhbCwgaW5mbykKICAgICAgfTsKICAgICAgcmVzdWx0LmxleCA9IHRydWU7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAvLyBQb3Agb2ZmIHRoZSBjdXJyZW50IGxleGljYWwgY29udGV4dC4KICAgIGZ1bmN0aW9uIHBvcGxleCgpewogICAgICBsZXhpY2FsID0gbGV4aWNhbC5wcmV2OwogICAgfQogICAgcG9wbGV4LmxleCA9IHRydWU7CiAgICAvLyBUaGUgJ2xleCcgZmxhZyBvbiB0aGVzZSBhY3Rpb25zIGlzIHVzZWQgYnkgdGhlICduZXh0JyBmdW5jdGlvbgogICAgLy8gdG8ga25vdyB0aGV5IGNhbiAoYW5kIGhhdmUgdG8pIGJlIHJhbiBiZWZvcmUgbW92aW5nIG9uIHRvIHRoZQogICAgLy8gbmV4dCB0b2tlbi4KCiAgICAvLyBDcmVhdGVzIGFuIGFjdGlvbiB0aGF0IGRpc2NhcmRzIHRva2VucyB1bnRpbCBpdCBmaW5kcyBvbmUgb2YKICAgIC8vIHRoZSBnaXZlbiB0eXBlLiBUaGlzIHdpbGwgaWdub3JlIChhbmQgcmVjb3ZlciBmcm9tKSBzeW50YXggZXJyb3JzLgogICAgZnVuY3Rpb24gZXhwZWN0KHdhbnRlZCl7CiAgICAgIHJldHVybiBmdW5jdGlvbiBleHBlY3RpbmcodG9rZW4pewogICAgICAgIGlmICh0b2tlbi50eXBlID09IHdhbnRlZCkgY29udCgpOyAgLy8gY29uc3VtZSB0aGUgdG9rZW4KICAgICAgICBlbHNlIHsKICAgICAgICAgIGNvbnQoYXJndW1lbnRzLmNhbGxlZSk7ICAvLyBjb250aW51ZSBleHBlY3RpbmcoKSAtIGNhbGwgaXRzZWxmCiAgICAgICAgfQogICAgICB9OwogICAgfQoKICAgIC8vIFJlcXVpcmUgYSBzcGVjaWZpYyB0b2tlbiB0eXBlLCBvciBvbmUgb2YgdGhlIHRva2VucyBwYXNzZWQgaW4gdGhlICd3YW50ZWQnIGFycmF5CiAgICAvLyBVc2VkIHRvIGRldGVjdCBibGF0YW50IHN5bnRheCBlcnJvcnMuICdleGVjdXRlJyBpcyB1c2VkIHRvIHBhc3MgZXh0cmEgY29kZQogICAgLy8gdG8gYmUgZXhlY3V0ZWQgaWYgdGhlIHRva2VuIGlzIG1hdGNoZWQuIEZvciBleGFtcGxlLCBhICcoJyBtYXRjaCBjb3VsZAogICAgLy8gJ2V4ZWN1dGUnIGEgY29udCggY29tcGFzZXAoZnVuY2FyZyksIHJlcXVpcmUoIikiKSApCiAgICBmdW5jdGlvbiByZXF1aXJlKHdhbnRlZCwgZXhlY3V0ZSl7CiAgICAgIHJldHVybiBmdW5jdGlvbiByZXF1aXJpbmcodG9rZW4pewogICAgICAgIHZhciBvazsKICAgICAgICB2YXIgdHlwZSA9IHRva2VuLnR5cGU7CiAgICAgICAgaWYgKHR5cGVvZih3YW50ZWQpID09ICJzdHJpbmciKQogICAgICAgICAgb2sgPSAodHlwZSA9PSB3YW50ZWQpIC0xOwogICAgICAgIGVsc2UKICAgICAgICAgIG9rID0gd2FudGVkLmluZGV4T2YodHlwZSk7CiAgICAgICAgaWYgKG9rID49IDApIHsKICAgICAgICAgIGlmIChleGVjdXRlICYmIHR5cGVvZihleGVjdXRlW29rXSkgPT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgZXhlY3V0ZVtva10odG9rZW4pOwogICAgICAgICAgICBjb250KCk7ICAvLyBqdXN0IGNvbnN1bWUgdGhlIHRva2VuCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgaWYgKCFtYXJrZWQpIG1hcmsodG9rZW4uc3R5bGUpOwogICAgICAgICAgbWFya19hZGQoInN5bnRheC1lcnJvciIpOwogICAgICAgICAgY29udChhcmd1bWVudHMuY2FsbGVlKTsKICAgICAgICB9CiAgICAgIH07CiAgICB9CgogICAgLy8gTG9va3MgZm9yIGEgc3RhdGVtZW50LCBhbmQgdGhlbiBjYWxscyBpdHNlbGYuCiAgICBmdW5jdGlvbiBzdGF0ZW1lbnRzKHRva2VuKXsKICAgICAgcmV0dXJuIHBhc3Moc3RhdGVtZW50LCBzdGF0ZW1lbnRzKTsKICAgIH0KICAgIC8vIERpc3BhdGNoZXMgdmFyaW91cyB0eXBlcyBvZiBzdGF0ZW1lbnRzIGJhc2VkIG9uIHRoZSB0eXBlIG9mIHRoZSBjdXJyZW50IHRva2VuLgogICAgZnVuY3Rpb24gc3RhdGVtZW50KHRva2VuKXsKICAgICAgdmFyIHR5cGUgPSB0b2tlbi50eXBlOwogICAgICBpZiAodHlwZSA9PSAia2V5d29yZCBhIikgY29udChwdXNobGV4KCJmb3JtIiksIGV4cHJlc3Npb24sIHN0YXRlbWVudCwgcG9wbGV4KTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAia2V5d29yZCBiIikgY29udChwdXNobGV4KCJmb3JtIiksIHN0YXRlbWVudCwgcG9wbGV4KTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAieyIpIGNvbnQocHVzaGxleCgifSIpLCBibG9jaywgcG9wbGV4KTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiZnVuY3Rpb24iKSBmdW5jZGVmKCk7CiAgICAgIC8vIHRlY2huaWNhbGx5LCAiY2xhc3MgaW1wbG9kZSB7Li4ufSIgaXMgY29ycmVjdCwgYnV0IHdlJ2xsIGZsYWcgdGhhdCBhcyBhbiBlcnJvciBiZWNhdXNlIGl0IG92ZXJyaWRlcyBhIHByZWRlZmluZWQgZnVuY3Rpb24KICAgICAgZWxzZSBpZiAodHlwZSA9PSAiY2xhc3MiKSBjbGFzc2RlZigpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJmb3JlYWNoIikgY29udChwdXNobGV4KCJmb3JtIiksIHJlcXVpcmUoIigiKSwgcHVzaGxleCgiKSIpLCBleHByZXNzaW9uLCByZXF1aXJlKCJhcyIpLCByZXF1aXJlKCJ2YXJpYWJsZSIpLCAvKiA9PiAkdmFsdWUgKi8gZXhwZWN0KCIpIiksIHBvcGxleCwgc3RhdGVtZW50LCBwb3BsZXgpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJmb3IiKSBjb250KHB1c2hsZXgoImZvcm0iKSwgcmVxdWlyZSgiKCIpLCBwdXNobGV4KCIpIiksIGV4cHJlc3Npb24sIHJlcXVpcmUoIjsiKSwgZXhwcmVzc2lvbiwgcmVxdWlyZSgiOyIpLCBleHByZXNzaW9uLCByZXF1aXJlKCIpIiksIHBvcGxleCwgc3RhdGVtZW50LCBwb3BsZXgpOwogICAgICAvLyBwdWJsaWMgZmluYWwgZnVuY3Rpb24gZm9vKCksIHByb3RlY3RlZCBzdGF0aWMgJGJhcjsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAibW9kaWZpZXIiKSBjb250KHJlcXVpcmUoWyJtb2RpZmllciIsICJ2YXJpYWJsZSIsICJmdW5jdGlvbiIsICJhYnN0cmFjdCJdLCBbbnVsbCwgbnVsbCwgZnVuY2RlZiwgYWJzZnVuXSkpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJhYnN0cmFjdCIpIGFicygpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJzd2l0Y2giKSBjb250KHB1c2hsZXgoImZvcm0iKSwgcmVxdWlyZSgiKCIpLCBleHByZXNzaW9uLCByZXF1aXJlKCIpIiksIHB1c2hsZXgoIn0iLCAic3dpdGNoIiksIHJlcXVpcmUoWyI6IiwgInsiXSksIGJsb2NrLCBwb3BsZXgsIHBvcGxleCk7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImNhc2UiKSBjb250KGV4cHJlc3Npb24sIHJlcXVpcmUoIjoiKSk7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImRlZmF1bHQiKSBjb250KHJlcXVpcmUoIjoiKSk7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImNhdGNoIikgY29udChwdXNobGV4KCJmb3JtIiksIHJlcXVpcmUoIigiKSwgcmVxdWlyZSgidF9zdHJpbmciKSwgcmVxdWlyZSgidmFyaWFibGUiKSwgcmVxdWlyZSgiKSIpLCBzdGF0ZW1lbnQsIHBvcGxleCk7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImNvbnN0IikgY29udChyZXF1aXJlKCJ0X3N0cmluZyIpKTsgIC8vICdjb25zdCBzdGF0aWMgeD01JyBpcyBhIHN5bnRheCBlcnJvcgogICAgICAvLyB0ZWNobmljYWxseSwgIm5hbWVzcGFjZSBpbXBsb2RlIHsuLi59IiBpcyBjb3JyZWN0LCBidXQgd2UnbGwgZmxhZyB0aGF0IGFzIGFuIGVycm9yIGJlY2F1c2UgaXQgb3ZlcnJpZGVzIGEgcHJlZGVmaW5lZCBmdW5jdGlvbgogICAgICBlbHNlIGlmICh0eXBlID09ICJuYW1lc3BhY2UiKSBjb250KG5hbWVzcGFjZWRlZiwgcmVxdWlyZSgiOyIpKTsKICAgICAgLy8gJHZhcmlhYmxlcyBtYXkgYmUgZm9sbG93ZWQgYnkgb3BlcmF0b3JzLCAoKSBmb3IgdmFyaWFibGUgZnVuY3Rpb24gY2FsbHMsIG9yIFtdIHN1YnNjcmlwdHMKICAgICAgZWxzZSBwYXNzKHB1c2hsZXgoInN0YXQiKSwgZXhwcmVzc2lvbiwgcmVxdWlyZSgiOyIpLCBwb3BsZXgpOwogICAgfQogICAgLy8gRGlzcGF0Y2ggZXhwcmVzc2lvbiB0eXBlcy4KICAgIGZ1bmN0aW9uIGV4cHJlc3Npb24odG9rZW4pewogICAgICB2YXIgdHlwZSA9IHRva2VuLnR5cGU7CiAgICAgIGlmIChhdG9taWNUeXBlcy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgY29udChtYXliZW9wZXJhdG9yKTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiPDw8IikgY29udChyZXF1aXJlKCJzdHJpbmciKSwgbWF5YmVvcGVyYXRvcik7ICAvLyBoZXJlZG9jL25vd2RvYwogICAgICBlbHNlIGlmICh0eXBlID09ICJ0X3N0cmluZyIpIGNvbnQobWF5YmVfZG91YmxlX2NvbG9uLCBtYXliZW9wZXJhdG9yKTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAia2V5d29yZCBjIikgY29udChleHByZXNzaW9uKTsKICAgICAgLy8gZnVuY3Rpb24gY2FsbCBvciBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb246ICRhID0gKCRiICsgMSkgKiAyOwogICAgICBlbHNlIGlmICh0eXBlID09ICIoIikgY29udChwdXNobGV4KCIpIiksIGNvbW1hc2VwKGV4cHJlc3Npb24pLCByZXF1aXJlKCIpIiksIHBvcGxleCwgbWF5YmVvcGVyYXRvcik7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIm9wZXJhdG9yIikgY29udChleHByZXNzaW9uKTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiZnVuY3Rpb24iKSBsYW1iZGFkZWYoKTsKICAgIH0KICAgIC8vIENhbGxlZCBmb3IgcGxhY2VzIHdoZXJlIG9wZXJhdG9ycywgZnVuY3Rpb24gY2FsbHMsIG9yIHN1YnNjcmlwdHMgYXJlCiAgICAvLyB2YWxpZC4gV2lsbCBza2lwIG9uIHRvIHRoZSBuZXh0IGFjdGlvbiBpZiBub25lIGlzIGZvdW5kLgogICAgZnVuY3Rpb24gbWF5YmVvcGVyYXRvcih0b2tlbil7CiAgICAgIHZhciB0eXBlID0gdG9rZW4udHlwZTsKICAgICAgaWYgKHR5cGUgPT0gIm9wZXJhdG9yIikgewogICAgICAgIGlmICh0b2tlbi5jb250ZW50ID09ICI/IikgY29udChleHByZXNzaW9uLCByZXF1aXJlKCI6IiksIGV4cHJlc3Npb24pOyAgLy8gdGVybmFyeSBvcGVyYXRvcgogICAgICAgIGVsc2UgY29udChleHByZXNzaW9uKTsKICAgICAgfQogICAgICBlbHNlIGlmICh0eXBlID09ICIoIikgY29udChwdXNobGV4KCIpIiksIGV4cHJlc3Npb24sIGNvbW1hc2VwKGV4cHJlc3Npb24pLCByZXF1aXJlKCIpIiksIHBvcGxleCwgbWF5YmVvcGVyYXRvciAvKiAkdmFyZnVuYygpICsgMyAqLyk7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIlsiKSBjb250KHB1c2hsZXgoIl0iKSwgZXhwcmVzc2lvbiwgcmVxdWlyZSgiXSIpLCBtYXliZW9wZXJhdG9yIC8qIGZvciBtdWx0aWRpbWVuc2lvbmFsIGFycmF5cywgb3IgJGZ1bmNbJGldKCkgKi8sIHBvcGxleCk7CiAgICB9CiAgICAvLyBBIHJlZ3VsYXIgdXNlIG9mIHRoZSBkb3VibGUgY29sb24gdG8gc3BlY2lmeSBhIGNsYXNzLCBhcyBpbiBzZWxmOjpmdW5jKCkgb3IgbXljbGFzczo6JHZhcjsKICAgIC8vIERpZmZlcnMgZnJvbSBgbmFtZXNwYWNlYCBvciBgdXNlYCBpbiB0aGF0IG9ubHkgb25lIGNsYXNzIGNhbiBiZSB0aGUgcGFyZW50OyBjaGFpbnMgKEE6OkI6OiR2YXIpIGFyZSBhIHN5bnRheCBlcnJvci4KICAgIGZ1bmN0aW9uIG1heWJlX2RvdWJsZV9jb2xvbih0b2tlbikgewogICAgICBpZiAodG9rZW4udHlwZSA9PSAidF9kb3VibGVfY29sb24iKQogICAgICAgIC8vIEE6OiR2YXIsIEE6OmZ1bmMoKSwgQTo6Y29uc3QKICAgICAgICBjb250KHJlcXVpcmUoWyJ0X3N0cmluZyIsICJ2YXJpYWJsZSJdKSwgbWF5YmVvcGVyYXRvcik7CiAgICAgIGVsc2UgewogICAgICAgIC8vIGEgdF9zdHJpbmcgd2Fzbid0IGZvbGxvd2VkIGJ5IDo6LCBzdWNoIGFzIGluIGEgZnVuY3Rpb24gY2FsbDogZm9vKCkKICAgICAgICBwYXNzKGV4cHJlc3Npb24pCiAgICAgIH0KICAgIH0KICAgIC8vIHRoZSBkZWNsYXJhdGlvbiBvciBkZWZpbml0aW9uIG9mIGEgZnVuY3Rpb24KICAgIGZ1bmN0aW9uIGZ1bmNkZWYoKSB7CiAgICAgIGNvbnQocmVxdWlyZSgidF9zdHJpbmciKSwgcmVxdWlyZSgiKCIpLCBwdXNobGV4KCIpIiksIGNvbW1hc2VwKGZ1bmNhcmcpLCByZXF1aXJlKCIpIiksIHBvcGxleCwgYmxvY2spOwogICAgfQogICAgLy8gdGhlIGRlY2xhcmF0aW9uIG9yIGRlZmluaXRpb24gb2YgYSBsYW1iZGEKICAgIGZ1bmN0aW9uIGxhbWJkYWRlZigpIHsKICAgICAgY29udChyZXF1aXJlKCIoIiksIHB1c2hsZXgoIikiKSwgY29tbWFzZXAoZnVuY2FyZyksIHJlcXVpcmUoIikiKSwgbWF5YmVfbGFtYmRhX3VzZSwgcG9wbGV4LCBibG9jayk7CiAgICB9CiAgICAvLyBvcHRpb25hbCBsYW1iZGEgJ3VzZScgc3RhdGVtZW50CiAgICBmdW5jdGlvbiBtYXliZV9sYW1iZGFfdXNlKHRva2VuKSB7CiAgICAgIGlmKHRva2VuLnR5cGUgPT0gIm5hbWVzcGFjZSIpIHsKICAgICAgICBjb250KHJlcXVpcmUoJygnKSwgY29tbWFzZXAoZnVuY2FyZyksIHJlcXVpcmUoJyknKSk7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgcGFzcyhleHByZXNzaW9uKTsKICAgICAgfQogICAgfQogICAgLy8gdGhlIGRlZmluaXRpb24gb2YgYSBjbGFzcwogICAgZnVuY3Rpb24gY2xhc3NkZWYoKSB7CiAgICAgIGNvbnQocmVxdWlyZSgidF9zdHJpbmciKSwgZXhwZWN0KCJ7IiksIHB1c2hsZXgoIn0iKSwgYmxvY2ssIHBvcGxleCk7CiAgICB9CiAgICAvLyBlaXRoZXIgZnVuY2RlZiBpZiB0aGUgY3VycmVudCB0b2tlbiBpcyAiZnVuY3Rpb24iLCBvciB0aGUga2V5d29yZCAiZnVuY3Rpb24iICsgZnVuY2RlZgogICAgZnVuY3Rpb24gYWJzZnVuKHRva2VuKSB7CiAgICAgIGlmKHRva2VuLnR5cGUgPT0gImZ1bmN0aW9uIikgZnVuY2RlZigpOwogICAgICBlbHNlIGNvbnQocmVxdWlyZShbImZ1bmN0aW9uIl0sIFtmdW5jZGVmXSkpOwogICAgfQogICAgLy8gdGhlIGFic3RyYWN0IGNsYXNzIG9yIGZ1bmN0aW9uICh3aXRoIG9wdGlvbmFsIG1vZGlmaWVyKQogICAgZnVuY3Rpb24gYWJzKHRva2VuKSB7CiAgICAgIGNvbnQocmVxdWlyZShbIm1vZGlmaWVyIiwgImZ1bmN0aW9uIiwgImNsYXNzIl0sIFthYnNmdW4sIGZ1bmNkZWYsIGNsYXNzZGVmXSkpOwogICAgfQogICAgLy8gUGFyc2VzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIHRoaW5ncyB0aGF0IGFyZSByZWNvZ25pemVkCiAgICAvLyBieSB0aGUgJ3doYXQnIGFyZ3VtZW50LgogICAgZnVuY3Rpb24gY29tbWFzZXAod2hhdCl7CiAgICAgIGZ1bmN0aW9uIHByb2NlZWQodG9rZW4pIHsKICAgICAgICBpZiAodG9rZW4udHlwZSA9PSAiLCIpIGNvbnQod2hhdCwgcHJvY2VlZCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNvbW1hU2VwYXJhdGVkKCkgewogICAgICAgIHBhc3Mod2hhdCwgcHJvY2VlZCk7CiAgICAgIH07CiAgICB9CiAgICAvLyBMb29rIGZvciBzdGF0ZW1lbnRzIHVudGlsIGEgY2xvc2luZyBicmFjZSBpcyBmb3VuZC4KICAgIGZ1bmN0aW9uIGJsb2NrKHRva2VuKSB7CiAgICAgIGlmICh0b2tlbi50eXBlID09ICJ9IikgY29udCgpOwogICAgICBlbHNlIHBhc3Moc3RhdGVtZW50LCBibG9jayk7CiAgICB9CiAgICBmdW5jdGlvbiBtYXliZWRlZmF1bHRwYXJhbWV0ZXIodG9rZW4pewogICAgICBpZiAodG9rZW4uY29udGVudCA9PSAiPSIpIGNvbnQoZXhwcmVzc2lvbik7CiAgICB9CiAgICAvLyBzdXBwb3J0IGZvciBkZWZhdWx0IGFyZ3VtZW50czogaHR0cDovL3VzLnBocC5uZXQvbWFudWFsL2VuL2Z1bmN0aW9ucy5hcmd1bWVudHMucGhwI2Z1bmN0aW9ucy5hcmd1bWVudHMuZGVmYXVsdAogICAgZnVuY3Rpb24gZnVuY2FyZyh0b2tlbil7CiAgICAgIC8vIGZ1bmN0aW9uIGZvbyhteWNsYXNzICRvYmopIHsuLi59CiAgICAgIGlmICh0b2tlbi50eXBlID09ICJ0X3N0cmluZyIpIGNvbnQocmVxdWlyZSgidmFyaWFibGUiKSwgbWF5YmVkZWZhdWx0cGFyYW1ldGVyKTsKICAgICAgLy8gZnVuY3Rpb24gZm9vKCRzdHJpbmcpIHsuLi59CiAgICAgIGVsc2UgaWYgKHRva2VuLnR5cGUgPT0gInZhcmlhYmxlIikgY29udChtYXliZWRlZmF1bHRwYXJhbWV0ZXIpOwogICAgICAvLyBmdW5jdGlvbiBmb28oJiRyZWYpIHsuLi59CiAgICAgIGVsc2UgaWYgKHRva2VuLmNvbnRlbnQgPT0gIiYiKSBjb250KHJlcXVpcmUoInZhcmlhYmxlIiksIG1heWJlZGVmYXVsdHBhcmFtZXRlcik7CiAgICB9CgogICAgLy8gQSBuYW1lc3BhY2UgZGVmaW5pdGlvbiBvciB1c2UKICAgIGZ1bmN0aW9uIG1heWJlX2RvdWJsZV9jb2xvbl9kZWYodG9rZW4pIHsKICAgICAgaWYgKHRva2VuLnR5cGUgPT0gInRfZG91YmxlX2NvbG9uIikKICAgICAgICBjb250KG5hbWVzcGFjZWRlZik7CiAgICB9CiAgICBmdW5jdGlvbiBuYW1lc3BhY2VkZWYodG9rZW4pIHsKICAgICAgcGFzcyhyZXF1aXJlKCJ0X3N0cmluZyIpLCBtYXliZV9kb3VibGVfY29sb25fZGVmKTsKICAgIH0KCiAgICByZXR1cm4gcGFyc2VyOwogIH0KCiAgcmV0dXJuIHttYWtlOiBwYXJzZVBIUCwgZWxlY3RyaWNDaGFyczogInt9OiJ9OwoKfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/php/js/parsephphtmlmixed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVGhlIGNvcHlyaWdodHMgZW1ib2RpZWQgaW4gdGhlIGNvbnRlbnQgb2YgdGhpcyBmaWxlIGFyZSBsaWNlbnNlZCBieQpZYWhvbyEgSW5jLiB1bmRlciB0aGUgQlNEIChyZXZpc2VkKSBvcGVuIHNvdXJjZSBsaWNlbnNlCgpAYXV0aG9yIERhbiBWbGFkIERhc2NhbGVzY3UgPGRhbmR2QHlhaG9vLWluYy5jb20+CgpCYXNlZCBvbiBwYXJzZWh0bWxtaXhlZC5qcyBieSBNYXJpam4gSGF2ZXJiZWtlLgoqLwoKdmFyIFBIUEhUTUxNaXhlZFBhcnNlciA9IEVkaXRvci5QYXJzZXIgPSAoZnVuY3Rpb24oKSB7CiAgdmFyIHByb2Nlc3NpbmdJbnN0cnVjdGlvbnMgPSBbIjw/cGhwIl07CgogIGlmICghKFBIUFBhcnNlciAmJiBDU1NQYXJzZXIgJiYgSlNQYXJzZXIgJiYgWE1MUGFyc2VyKSkKICAgIHRocm93IG5ldyBFcnJvcigiUEhQLCBDU1MsIEpTLCBhbmQgWE1MIHBhcnNlcnMgbXVzdCBiZSBsb2FkZWQgZm9yIFBIUCtIVE1MIG1peGVkIG1vZGUgdG8gd29yay4iKTsKICBYTUxQYXJzZXIuY29uZmlndXJlKHt1c2VIVE1MS2x1ZGdlczogdHJ1ZX0pOwoKICBmdW5jdGlvbiBwYXJzZU1peGVkKHN0cmVhbSkgewogICAgdmFyIGh0bWxQYXJzZXIgPSBYTUxQYXJzZXIubWFrZShzdHJlYW0pLCBsb2NhbFBhcnNlciA9IG51bGwsIGluVGFnID0gZmFsc2UsIHBocFBhcnNlclN0YXRlID0gbnVsbDsKICAgIHZhciBpdGVyID0ge25leHQ6IHRvcCwgY29weTogY29weX07CgogICAgZnVuY3Rpb24gdG9wKCkgewogICAgICB2YXIgdG9rZW4gPSBodG1sUGFyc2VyLm5leHQoKTsKICAgICAgaWYgKHRva2VuLmNvbnRlbnQgPT0gIjwiKQogICAgICAgIGluVGFnID0gdHJ1ZTsKICAgICAgZWxzZSBpZiAodG9rZW4uc3R5bGUgPT0gInhtbC10YWduYW1lIiAmJiBpblRhZyA9PT0gdHJ1ZSkKICAgICAgICBpblRhZyA9IHRva2VuLmNvbnRlbnQudG9Mb3dlckNhc2UoKTsKICAgICAgZWxzZSBpZiAodG9rZW4udHlwZSA9PSAieG1sLXByb2Nlc3NpbmciKSB7CiAgICAgICAgLy8gc2VlIGlmIHRoaXMgb3BlbnMgYSBQSFAgYmxvY2sKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb2Nlc3NpbmdJbnN0cnVjdGlvbnMubGVuZ3RoOyBpKyspCiAgICAgICAgICBpZiAocHJvY2Vzc2luZ0luc3RydWN0aW9uc1tpXSA9PSB0b2tlbi5jb250ZW50KSB7CiAgICAgICAgICAgIGl0ZXIubmV4dCA9IGxvY2FsKFBIUFBhcnNlciwgIj8+Iik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICB9CiAgICAgIC8vICJ4bWwtcHJvY2Vzc2luZyIgdG9rZW5zIGFyZSBpZ25vcmVkLCBiZWNhdXNlIHRoZXkgc2hvdWxkIGJlIGhhbmRsZWQgYnkgYSBzcGVjaWZpYyBsb2NhbCBwYXJzZXIKICAgICAgZWxzZSBpZiAodG9rZW4uY29udGVudCA9PSAiPiIpIHsKICAgICAgICBpZiAoaW5UYWcgPT0gInNjcmlwdCIpCiAgICAgICAgICBpdGVyLm5leHQgPSBsb2NhbChKU1BhcnNlciwgIjwvc2NyaXB0Iik7CiAgICAgICAgZWxzZSBpZiAoaW5UYWcgPT0gInN0eWxlIikKICAgICAgICAgIGl0ZXIubmV4dCA9IGxvY2FsKENTU1BhcnNlciwgIjwvc3R5bGUiKTsKICAgICAgICBpblRhZyA9IGZhbHNlOwogICAgICB9CiAgICAgIHJldHVybiB0b2tlbjsKICAgIH0KICAgIGZ1bmN0aW9uIGxvY2FsKHBhcnNlciwgdGFnKSB7CiAgICAgIHZhciBiYXNlSW5kZW50ID0gaHRtbFBhcnNlci5pbmRlbnRhdGlvbigpOwogICAgICBpZiAocGFyc2VyID09IFBIUFBhcnNlciAmJiBwaHBQYXJzZXJTdGF0ZSkKICAgICAgICBsb2NhbFBhcnNlciA9IHBocFBhcnNlclN0YXRlKHN0cmVhbSk7CiAgICAgIGVsc2UKICAgICAgICBsb2NhbFBhcnNlciA9IHBhcnNlci5tYWtlKHN0cmVhbSwgYmFzZUluZGVudCArIGluZGVudFVuaXQpOwoKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIGlmIChzdHJlYW0ubG9va0FoZWFkKHRhZywgZmFsc2UsIGZhbHNlLCB0cnVlKSkgewogICAgICAgICAgaWYgKHBhcnNlciA9PSBQSFBQYXJzZXIpIHBocFBhcnNlclN0YXRlID0gbG9jYWxQYXJzZXIuY29weSgpOwogICAgICAgICAgbG9jYWxQYXJzZXIgPSBudWxsOwogICAgICAgICAgaXRlci5uZXh0ID0gdG9wOwogICAgICAgICAgcmV0dXJuIHRvcCgpOyAgLy8gcGFzcyB0aGUgZW5kaW5nIHRhZyB0byB0aGUgZW5jbG9zaW5nIHBhcnNlcgogICAgICAgIH0KCiAgICAgICAgdmFyIHRva2VuID0gbG9jYWxQYXJzZXIubmV4dCgpOwogICAgICAgIHZhciBsdCA9IHRva2VuLnZhbHVlLmxhc3RJbmRleE9mKCI8IiksIHN6ID0gTWF0aC5taW4odG9rZW4udmFsdWUubGVuZ3RoIC0gbHQsIHRhZy5sZW5ndGgpOwogICAgICAgIGlmIChsdCAhPSAtMSAmJiB0b2tlbi52YWx1ZS5zbGljZShsdCwgbHQgKyBzeikudG9Mb3dlckNhc2UoKSA9PSB0YWcuc2xpY2UoMCwgc3opICYmCiAgICAgICAgICAgIHN0cmVhbS5sb29rQWhlYWQodGFnLnNsaWNlKHN6KSwgZmFsc2UsIGZhbHNlLCB0cnVlKSkgewogICAgICAgICAgc3RyZWFtLnB1c2godG9rZW4udmFsdWUuc2xpY2UobHQpKTsKICAgICAgICAgIHRva2VuLnZhbHVlID0gdG9rZW4udmFsdWUuc2xpY2UoMCwgbHQpOwogICAgICAgIH0KCiAgICAgICAgaWYgKHRva2VuLmluZGVudGF0aW9uKSB7CiAgICAgICAgICB2YXIgb2xkSW5kZW50ID0gdG9rZW4uaW5kZW50YXRpb247CiAgICAgICAgICB0b2tlbi5pbmRlbnRhdGlvbiA9IGZ1bmN0aW9uKGNoYXJzKSB7CiAgICAgICAgICAgIGlmIChjaGFycyA9PSAiPC8iKQogICAgICAgICAgICAgIHJldHVybiBiYXNlSW5kZW50OwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgcmV0dXJuIG9sZEluZGVudChjaGFycyk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gY29weSgpIHsKICAgICAgdmFyIF9odG1sID0gaHRtbFBhcnNlci5jb3B5KCksIF9sb2NhbCA9IGxvY2FsUGFyc2VyICYmIGxvY2FsUGFyc2VyLmNvcHkoKSwKICAgICAgICAgIF9uZXh0ID0gaXRlci5uZXh0LCBfaW5UYWcgPSBpblRhZywgX3BocCA9IHBocFBhcnNlclN0YXRlOwogICAgICByZXR1cm4gZnVuY3Rpb24oX3N0cmVhbSkgewogICAgICAgIHN0cmVhbSA9IF9zdHJlYW07CiAgICAgICAgaHRtbFBhcnNlciA9IF9odG1sKF9zdHJlYW0pOwogICAgICAgIGxvY2FsUGFyc2VyID0gX2xvY2FsICYmIF9sb2NhbChfc3RyZWFtKTsKICAgICAgICBwaHBQYXJzZXJTdGF0ZSA9IF9waHA7CiAgICAgICAgaXRlci5uZXh0ID0gX25leHQ7CiAgICAgICAgaW5UYWcgPSBfaW5UYWc7CiAgICAgICAgcmV0dXJuIGl0ZXI7CiAgICAgIH07CiAgICB9CiAgICByZXR1cm4gaXRlcjsKICB9CgogIHJldHVybiB7CiAgICBtYWtlOiBwYXJzZU1peGVkLAogICAgZWxlY3RyaWNDaGFyczogInt9LzoiLAogICAgY29uZmlndXJlOiBmdW5jdGlvbihjb25mKSB7CiAgICAgIGlmIChjb25mLm9wZW5pbmcgIT0gbnVsbCkgcHJvY2Vzc2luZ0luc3RydWN0aW9ucyA9IGNvbmYub3BlbmluZzsKICAgIH0KICB9OwoKfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/php/js/tokenizephp.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgWWFob28hIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuClRoZSBjb3B5cmlnaHRzIGVtYm9kaWVkIGluIHRoZSBjb250ZW50IG9mIHRoaXMgZmlsZSBhcmUgbGljZW5zZWQgYnkKWWFob28hIEluYy4gdW5kZXIgdGhlIEJTRCAocmV2aXNlZCkgb3BlbiBzb3VyY2UgbGljZW5zZQoKQGF1dGhvciBWbGFkIERhbiBEYXNjYWxlc2N1IDxkYW5kdkB5YWhvby1pbmMuY29tPgoKClRva2VuaXplciBmb3IgUEhQIGNvZGUKClJlZmVyZW5jZXM6CiAgKyBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vcmVzZXJ2ZWQucGhwCiAgKyBodHRwOi8vcGhwLm5ldC90b2tlbnMKICArIGdldF9kZWZpbmVkX2NvbnN0YW50cygpLCBnZXRfZGVmaW5lZF9mdW5jdGlvbnMoKSwgZ2V0X2RlY2xhcmVkX2NsYXNzZXMoKQogICAgICBleGVjdXRlZCBvbiBhIHJlYWxpc3RpYyAobm90IHZhbmlsbGEpIFBIUCBpbnN0YWxsYXRpb24gd2l0aCB0eXBpY2FsIExBTVAgbW9kdWxlcy4KICAgICAgU3BlY2lmaWNhbGx5LCB0aGUgUEhQIGJ1bmRsZWQgd2l0aCB0aGUgVW5pZm9ybSBXZWIgU2VydmVyICh3d3cudW5pZm9ybXNlcnZlci5jb20pLgoKKi8KCgovLyBhZGQgdGhlIGZvckVhY2ggbWV0aG9kIGZvciBKUyBlbmdpbmVzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBpdCAoZS5nLiBJRSkKLy8gY29kZSBmcm9tIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL0VuL0NvcmVfSmF2YVNjcmlwdF8xLjVfUmVmZXJlbmNlOk9iamVjdHM6QXJyYXk6Zm9yRWFjaAppZiAoIUFycmF5LnByb3RvdHlwZS5mb3JFYWNoKQp7CiAgQXJyYXkucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbihmdW4gLyosIHRoaXNwKi8pCiAgewogICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgaWYgKHR5cGVvZiBmdW4gIT0gImZ1bmN0aW9uIikKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOwoKICAgIHZhciB0aGlzcCA9IGFyZ3VtZW50c1sxXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspCiAgICB7CiAgICAgIGlmIChpIGluIHRoaXMpCiAgICAgICAgZnVuLmNhbGwodGhpc3AsIHRoaXNbaV0sIGksIHRoaXMpOwogICAgfQogIH07Cn0KCgp2YXIgdG9rZW5pemVQSFAgPSAoZnVuY3Rpb24oKSB7CiAgLyogQSBtYXAgb2YgUEhQJ3MgcmVzZXJ2ZWQgd29yZHMgKGtleXdvcmRzLCBwcmVkZWZpbmVkIGNsYXNzZXMsIGZ1bmN0aW9ucyBhbmQKICAgICBjb25zdGFudHMuIEVhY2ggdG9rZW4gaGFzIGEgdHlwZSAoJ2tleXdvcmQnLCAnb3BlcmF0b3InIGV0Yy4pIGFuZCBhIHN0eWxlLgogICAgIFRoZSBzdHlsZSBjb3JyZXNwb25kcyB0byB0aGUgQ1NTIHNwYW4gY2xhc3MgaW4gcGhwY29sb3JzLmNzcy4KCiAgICAgS2V5d29yZHMgY2FuIGJlIG9mIHRocmVlIHR5cGVzOgogICAgIGEgLSB0YWtlcyBhbiBleHByZXNzaW9uIGFuZCBmb3JtcyBhIHN0YXRlbWVudCAtIGUuZy4gaWYKICAgICBiIC0gdGFrZXMganVzdCBhIHN0YXRlbWVudCAtIGUuZy4gZWxzZQogICAgIGMgLSB0YWtlcyBhbiBvcHRpbm9hbCBleHByZXNzaW9uLCBidXQgbm8gc3RhdGVtZW50IC0gZS5nLiByZXR1cm4KICAgICBUaGlzIGRpc3RpbmN0aW9uIGdpdmVzIHRoZSBwYXJzZXIgZW5vdWdoIGluZm9ybWF0aW9uIHRvIHBhcnNlCiAgICAgY29ycmVjdCBjb2RlIGNvcnJlY3RseSAod2UgZG9uJ3QgY2FyZSB0aGF0IG11Y2ggaG93IHdlIHBhcnNlCiAgICAgaW5jb3JyZWN0IGNvZGUpLgoKICAgICBSZWZlcmVuY2U6IGh0dHA6Ly91cy5waHAubmV0L21hbnVhbC9lbi9yZXNlcnZlZC5waHAKICAqLwogIHZhciBrZXl3b3JkcyA9IGZ1bmN0aW9uKCl7CiAgICBmdW5jdGlvbiB0b2tlbih0eXBlLCBzdHlsZSl7CiAgICAgIHJldHVybiB7dHlwZTogdHlwZSwgc3R5bGU6IHN0eWxlfTsKICAgIH0KICAgIHZhciByZXN1bHQgPSB7fTsKCiAgICAvLyBmb3IgZWFjaCh2YXIgZWxlbWVudCBpbiBbIi4uLiIsICIuLi4iXSkgY2FuIHBpY2sgdXAgZWxlbWVudHMgYWRkZWQgdG8KICAgIC8vIEFycmF5LnByb3RvdHlwZSwgc28gd2UnbGwgdXNlIHRoZSBsb29wIHN0cnVjdHVyZSBiZWxvdy4gU2VlIGFsc28KICAgIC8vIGh0dHA6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vQ29yZV9KYXZhU2NyaXB0XzEuNV9SZWZlcmVuY2UvU3RhdGVtZW50cy9mb3JfZWFjaC4uLmluCgogICAgLy8ga2V5d29yZHMgdGhhdCB0YWtlIGFuIGV4cHJlc3Npb24gYW5kIGZvcm0gYSBzdGF0ZW1lbnQKICAgIFsiaWYiLCAiZWxzZWlmIiwgIndoaWxlIiwgImRlY2xhcmUiXS5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQsIGluZGV4LCBhcnJheSkgewogICAgICByZXN1bHRbZWxlbWVudF0gPSB0b2tlbigia2V5d29yZCBhIiwgInBocC1rZXl3b3JkIik7CiAgICB9KTsKCiAgICAvLyBrZXl3b3JkcyB0aGF0IHRha2UganVzdCBhIHN0YXRlbWVudAogICAgWyJkbyIsICJlbHNlIiwgInRyeSIgXS5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQsIGluZGV4LCBhcnJheSkgewogICAgICByZXN1bHRbZWxlbWVudF0gPSB0b2tlbigia2V5d29yZCBiIiwgInBocC1rZXl3b3JkIik7CiAgICB9KTsKCiAgICAvLyBrZXl3b3JkcyB0aGF0IHRha2UgYW4gb3B0aW9uYWwgZXhwcmVzc2lvbiwgYnV0IG5vIHN0YXRlbWVudAogICAgWyJyZXR1cm4iLCAiYnJlYWsiLCAiY29udGludWUiLCAgLy8gdGhlIGV4cHJlc3Npb24gaXMgb3B0aW9uYWwKICAgICAgIm5ldyIsICJjbG9uZSIsICJ0aHJvdyIgIC8vIHRoZSBleHByZXNzaW9uIGlzIG1hbmRhdG9yeQogICAgXS5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQsIGluZGV4LCBhcnJheSkgewogICAgICByZXN1bHRbZWxlbWVudF0gPSB0b2tlbigia2V5d29yZCBjIiwgInBocC1rZXl3b3JkIik7CiAgICB9KTsKCiAgICBbIl9fQ0xBU1NfXyIsICJfX0RJUl9fIiwgIl9fRklMRV9fIiwgIl9fRlVOQ1RJT05fXyIsICJfX01FVEhPRF9fIiwgIl9fTkFNRVNQQUNFX18iXS5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQsIGluZGV4LCBhcnJheSkgewogICAgICByZXN1bHRbZWxlbWVudF0gPSB0b2tlbigiYXRvbSIsICJwaHAtY29tcGlsZS10aW1lLWNvbnN0YW50Iik7CiAgICB9KTsKCiAgICBbInRydWUiLCAiZmFsc2UiLCAibnVsbCJdLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCwgaW5kZXgsIGFycmF5KSB7CiAgICAgIHJlc3VsdFtlbGVtZW50XSA9IHRva2VuKCJhdG9tIiwgInBocC1hdG9tIik7CiAgICB9KTsKCiAgICBbImFuZCIsICJvciIsICJ4b3IiLCAiaW5zdGFuY2VvZiJdLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCwgaW5kZXgsIGFycmF5KSB7CiAgICAgIHJlc3VsdFtlbGVtZW50XSA9IHRva2VuKCJvcGVyYXRvciIsICJwaHAta2V5d29yZCBwaHAtb3BlcmF0b3IiKTsKICAgIH0pOwoKICAgIFsiY2xhc3MiLCAiaW50ZXJmYWNlIl0uZm9yRWFjaChmdW5jdGlvbihlbGVtZW50LCBpbmRleCwgYXJyYXkpIHsKICAgICAgcmVzdWx0W2VsZW1lbnRdID0gdG9rZW4oImNsYXNzIiwgInBocC1rZXl3b3JkIik7CiAgICB9KTsKICAgIFsibmFtZXNwYWNlIiwgInVzZSIsICJleHRlbmRzIiwgImltcGxlbWVudHMiXS5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQsIGluZGV4LCBhcnJheSkgewogICAgICByZXN1bHRbZWxlbWVudF0gPSB0b2tlbigibmFtZXNwYWNlIiwgInBocC1rZXl3b3JkIik7CiAgICB9KTsKCiAgICAvLyByZXNlcnZlZCAibGFuZ3VhZ2UgY29uc3RydWN0cyIuLi4gaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL3Jlc2VydmVkLnBocAogICAgWyAiZGllIiwgImVjaG8iLCAiZW1wdHkiLCAiZXhpdCIsICJldmFsIiwgImluY2x1ZGUiLCAiaW5jbHVkZV9vbmNlIiwgImlzc2V0IiwKICAgICAgImxpc3QiLCAicmVxdWlyZSIsICJyZXF1aXJlX29uY2UiLCAicmV0dXJuIiwgInByaW50IiwgInVuc2V0IiwKICAgICAgImFycmF5IiAvLyBhIGtleXdvcmQgcmF0aGVyLCBidXQgbWFuZGF0ZXMgYSBwYXJlbnRoZXNpemVkIHBhcmFtZXRlciBsaXN0CiAgICBdLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCwgaW5kZXgsIGFycmF5KSB7CiAgICAgIHJlc3VsdFtlbGVtZW50XSA9IHRva2VuKCJ0X3N0cmluZyIsICJwaHAtcmVzZXJ2ZWQtbGFuZ3VhZ2UtY29uc3RydWN0Iik7CiAgICB9KTsKCiAgICByZXN1bHRbInN3aXRjaCJdID0gdG9rZW4oInN3aXRjaCIsICJwaHAta2V5d29yZCIpOwogICAgcmVzdWx0WyJjYXNlIl0gPSB0b2tlbigiY2FzZSIsICJwaHAta2V5d29yZCIpOwogICAgcmVzdWx0WyJkZWZhdWx0Il0gPSB0b2tlbigiZGVmYXVsdCIsICJwaHAta2V5d29yZCIpOwogICAgcmVzdWx0WyJjYXRjaCJdID0gdG9rZW4oImNhdGNoIiwgInBocC1rZXl3b3JkIik7CiAgICByZXN1bHRbImZ1bmN0aW9uIl0gPSB0b2tlbigiZnVuY3Rpb24iLCAicGhwLWtleXdvcmQiKTsKCiAgICAvLyBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vY29udHJvbC1zdHJ1Y3R1cmVzLmFsdGVybmF0aXZlLXN5bnRheC5waHAgbXVzdCBiZSBmb2xsb3dlZCBieSBhICc6JwogICAgWyJlbmRpZiIsICJlbmR3aGlsZSIsICJlbmRmb3IiLCAiZW5kZm9yZWFjaCIsICJlbmRzd2l0Y2giLCAiZW5kZGVjbGFyZSJdLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCwgaW5kZXgsIGFycmF5KSB7CiAgICAgIHJlc3VsdFtlbGVtZW50XSA9IHRva2VuKCJkZWZhdWx0IiwgInBocC1rZXl3b3JkIik7CiAgICB9KTsKCiAgICByZXN1bHRbImNvbnN0Il0gPSB0b2tlbigiY29uc3QiLCAicGhwLWtleXdvcmQiKTsKCiAgICBbImZpbmFsIiwgInByaXZhdGUiLCAicHJvdGVjdGVkIiwgInB1YmxpYyIsICJnbG9iYWwiLCAic3RhdGljIl0uZm9yRWFjaChmdW5jdGlvbihlbGVtZW50LCBpbmRleCwgYXJyYXkpIHsKICAgICAgcmVzdWx0W2VsZW1lbnRdID0gdG9rZW4oIm1vZGlmaWVyIiwgInBocC1rZXl3b3JkIik7CiAgICB9KTsKICAgIHJlc3VsdFsidmFyIl0gPSB0b2tlbigibW9kaWZpZXIiLCAicGhwLWtleXdvcmQgZGVwcmVjYXRlZCIpOwogICAgcmVzdWx0WyJhYnN0cmFjdCJdID0gdG9rZW4oImFic3RyYWN0IiwgInBocC1rZXl3b3JkIik7CgogICAgcmVzdWx0WyJmb3JlYWNoIl0gPSB0b2tlbigiZm9yZWFjaCIsICJwaHAta2V5d29yZCIpOwogICAgcmVzdWx0WyJhcyJdID0gdG9rZW4oImFzIiwgInBocC1rZXl3b3JkIik7CiAgICByZXN1bHRbImZvciJdID0gdG9rZW4oImZvciIsICJwaHAta2V5d29yZCIpOwoKICAgIC8vIFBIUCBidWlsdC1pbiBmdW5jdGlvbnMgLSBvdXRwdXQgb2YgZ2V0X2RlZmluZWRfZnVuY3Rpb25zKClbImludGVybmFsIl0KICAgIFsgInplbmRfdmVyc2lvbiIsICJmdW5jX251bV9hcmdzIiwgImZ1bmNfZ2V0X2FyZyIsICJmdW5jX2dldF9hcmdzIiwgInN0cmxlbiIsCiAgICAgICJzdHJjbXAiLCAic3RybmNtcCIsICJzdHJjYXNlY21wIiwgInN0cm5jYXNlY21wIiwgImVhY2giLCAiZXJyb3JfcmVwb3J0aW5nIiwKICAgICAgImRlZmluZSIsICJkZWZpbmVkIiwgImdldF9jbGFzcyIsICJnZXRfcGFyZW50X2NsYXNzIiwgIm1ldGhvZF9leGlzdHMiLAogICAgICAicHJvcGVydHlfZXhpc3RzIiwgImNsYXNzX2V4aXN0cyIsICJpbnRlcmZhY2VfZXhpc3RzIiwgImZ1bmN0aW9uX2V4aXN0cyIsCiAgICAgICJnZXRfaW5jbHVkZWRfZmlsZXMiLCAiZ2V0X3JlcXVpcmVkX2ZpbGVzIiwgImlzX3N1YmNsYXNzX29mIiwgImlzX2EiLAogICAgICAiZ2V0X2NsYXNzX3ZhcnMiLCAiZ2V0X29iamVjdF92YXJzIiwgImdldF9jbGFzc19tZXRob2RzIiwgInRyaWdnZXJfZXJyb3IiLAogICAgICAidXNlcl9lcnJvciIsICJzZXRfZXJyb3JfaGFuZGxlciIsICJyZXN0b3JlX2Vycm9yX2hhbmRsZXIiLAogICAgICAic2V0X2V4Y2VwdGlvbl9oYW5kbGVyIiwgInJlc3RvcmVfZXhjZXB0aW9uX2hhbmRsZXIiLCAiZ2V0X2RlY2xhcmVkX2NsYXNzZXMiLAogICAgICAiZ2V0X2RlY2xhcmVkX2ludGVyZmFjZXMiLCAiZ2V0X2RlZmluZWRfZnVuY3Rpb25zIiwgImdldF9kZWZpbmVkX3ZhcnMiLAogICAgICAiY3JlYXRlX2Z1bmN0aW9uIiwgImdldF9yZXNvdXJjZV90eXBlIiwgImdldF9sb2FkZWRfZXh0ZW5zaW9ucyIsCiAgICAgICJleHRlbnNpb25fbG9hZGVkIiwgImdldF9leHRlbnNpb25fZnVuY3MiLCAiZ2V0X2RlZmluZWRfY29uc3RhbnRzIiwKICAgICAgImRlYnVnX2JhY2t0cmFjZSIsICJkZWJ1Z19wcmludF9iYWNrdHJhY2UiLCAiYmNhZGQiLCAiYmNzdWIiLCAiYmNtdWwiLCAiYmNkaXYiLAogICAgICAiYmNtb2QiLCAiYmNwb3ciLCAiYmNzcXJ0IiwgImJjc2NhbGUiLCAiYmNjb21wIiwgImJjcG93bW9kIiwgImpkdG9ncmVnb3JpYW4iLAogICAgICAiZ3JlZ29yaWFudG9qZCIsICJqZHRvanVsaWFuIiwgImp1bGlhbnRvamQiLCAiamR0b2pld2lzaCIsICJqZXdpc2h0b2pkIiwKICAgICAgImpkdG9mcmVuY2giLCAiZnJlbmNodG9qZCIsICJqZGRheW9md2VlayIsICJqZG1vbnRobmFtZSIsICJlYXN0ZXJfZGF0ZSIsCiAgICAgICJlYXN0ZXJfZGF5cyIsICJ1bml4dG9qZCIsICJqZHRvdW5peCIsICJjYWxfdG9famQiLCAiY2FsX2Zyb21famQiLAogICAgICAiY2FsX2RheXNfaW5fbW9udGgiLCAiY2FsX2luZm8iLCAidmFyaWFudF9zZXQiLCAidmFyaWFudF9hZGQiLCAidmFyaWFudF9jYXQiLAogICAgICAidmFyaWFudF9zdWIiLCAidmFyaWFudF9tdWwiLCAidmFyaWFudF9hbmQiLCAidmFyaWFudF9kaXYiLCAidmFyaWFudF9lcXYiLAogICAgICAidmFyaWFudF9pZGl2IiwgInZhcmlhbnRfaW1wIiwgInZhcmlhbnRfbW9kIiwgInZhcmlhbnRfb3IiLCAidmFyaWFudF9wb3ciLAogICAgICAidmFyaWFudF94b3IiLCAidmFyaWFudF9hYnMiLCAidmFyaWFudF9maXgiLCAidmFyaWFudF9pbnQiLCAidmFyaWFudF9uZWciLAogICAgICAidmFyaWFudF9ub3QiLCAidmFyaWFudF9yb3VuZCIsICJ2YXJpYW50X2NtcCIsICJ2YXJpYW50X2RhdGVfdG9fdGltZXN0YW1wIiwKICAgICAgInZhcmlhbnRfZGF0ZV9mcm9tX3RpbWVzdGFtcCIsICJ2YXJpYW50X2dldF90eXBlIiwgInZhcmlhbnRfc2V0X3R5cGUiLAogICAgICAidmFyaWFudF9jYXN0IiwgImNvbV9jcmVhdGVfZ3VpZCIsICJjb21fZXZlbnRfc2luayIsICJjb21fcHJpbnRfdHlwZWluZm8iLAogICAgICAiY29tX21lc3NhZ2VfcHVtcCIsICJjb21fbG9hZF90eXBlbGliIiwgImNvbV9nZXRfYWN0aXZlX29iamVjdCIsICJjdHlwZV9hbG51bSIsCiAgICAgICJjdHlwZV9hbHBoYSIsICJjdHlwZV9jbnRybCIsICJjdHlwZV9kaWdpdCIsICJjdHlwZV9sb3dlciIsICJjdHlwZV9ncmFwaCIsCiAgICAgICJjdHlwZV9wcmludCIsICJjdHlwZV9wdW5jdCIsICJjdHlwZV9zcGFjZSIsICJjdHlwZV91cHBlciIsICJjdHlwZV94ZGlnaXQiLAogICAgICAic3RydG90aW1lIiwgImRhdGUiLCAiaWRhdGUiLCAiZ21kYXRlIiwgIm1rdGltZSIsICJnbW1rdGltZSIsICJjaGVja2RhdGUiLAogICAgICAic3RyZnRpbWUiLCAiZ21zdHJmdGltZSIsICJ0aW1lIiwgImxvY2FsdGltZSIsICJnZXRkYXRlIiwgImRhdGVfY3JlYXRlIiwKICAgICAgImRhdGVfcGFyc2UiLCAiZGF0ZV9mb3JtYXQiLCAiZGF0ZV9tb2RpZnkiLCAiZGF0ZV90aW1lem9uZV9nZXQiLAogICAgICAiZGF0ZV90aW1lem9uZV9zZXQiLCAiZGF0ZV9vZmZzZXRfZ2V0IiwgImRhdGVfdGltZV9zZXQiLCAiZGF0ZV9kYXRlX3NldCIsCiAgICAgICJkYXRlX2lzb2RhdGVfc2V0IiwgInRpbWV6b25lX29wZW4iLCAidGltZXpvbmVfbmFtZV9nZXQiLAogICAgICAidGltZXpvbmVfbmFtZV9mcm9tX2FiYnIiLCAidGltZXpvbmVfb2Zmc2V0X2dldCIsICJ0aW1lem9uZV90cmFuc2l0aW9uc19nZXQiLAogICAgICAidGltZXpvbmVfaWRlbnRpZmllcnNfbGlzdCIsICJ0aW1lem9uZV9hYmJyZXZpYXRpb25zX2xpc3QiLAogICAgICAiZGF0ZV9kZWZhdWx0X3RpbWV6b25lX3NldCIsICJkYXRlX2RlZmF1bHRfdGltZXpvbmVfZ2V0IiwgImRhdGVfc3VucmlzZSIsCiAgICAgICJkYXRlX3N1bnNldCIsICJkYXRlX3N1bl9pbmZvIiwgImZpbHRlcl9pbnB1dCIsICJmaWx0ZXJfdmFyIiwKICAgICAgImZpbHRlcl9pbnB1dF9hcnJheSIsICJmaWx0ZXJfdmFyX2FycmF5IiwgImZpbHRlcl9saXN0IiwgImZpbHRlcl9oYXNfdmFyIiwKICAgICAgImZpbHRlcl9pZCIsICJmdHBfY29ubmVjdCIsICJmdHBfbG9naW4iLCAiZnRwX3B3ZCIsICJmdHBfY2R1cCIsICJmdHBfY2hkaXIiLAogICAgICAiZnRwX2V4ZWMiLCAiZnRwX3JhdyIsICJmdHBfbWtkaXIiLCAiZnRwX3JtZGlyIiwgImZ0cF9jaG1vZCIsICJmdHBfYWxsb2MiLAogICAgICAiZnRwX25saXN0IiwgImZ0cF9yYXdsaXN0IiwgImZ0cF9zeXN0eXBlIiwgImZ0cF9wYXN2IiwgImZ0cF9nZXQiLCAiZnRwX2ZnZXQiLAogICAgICAiZnRwX3B1dCIsICJmdHBfZnB1dCIsICJmdHBfc2l6ZSIsICJmdHBfbWR0bSIsICJmdHBfcmVuYW1lIiwgImZ0cF9kZWxldGUiLAogICAgICAiZnRwX3NpdGUiLCAiZnRwX2Nsb3NlIiwgImZ0cF9zZXRfb3B0aW9uIiwgImZ0cF9nZXRfb3B0aW9uIiwgImZ0cF9uYl9mZ2V0IiwKICAgICAgImZ0cF9uYl9nZXQiLCAiZnRwX25iX2NvbnRpbnVlIiwgImZ0cF9uYl9wdXQiLCAiZnRwX25iX2ZwdXQiLCAiZnRwX3F1aXQiLAogICAgICAiaGFzaCIsICJoYXNoX2ZpbGUiLCAiaGFzaF9obWFjIiwgImhhc2hfaG1hY19maWxlIiwgImhhc2hfaW5pdCIsICJoYXNoX3VwZGF0ZSIsCiAgICAgICJoYXNoX3VwZGF0ZV9zdHJlYW0iLCAiaGFzaF91cGRhdGVfZmlsZSIsICJoYXNoX2ZpbmFsIiwgImhhc2hfYWxnb3MiLCAiaWNvbnYiLAogICAgICAib2JfaWNvbnZfaGFuZGxlciIsICJpY29udl9nZXRfZW5jb2RpbmciLCAiaWNvbnZfc2V0X2VuY29kaW5nIiwgImljb252X3N0cmxlbiIsCiAgICAgICJpY29udl9zdWJzdHIiLCAiaWNvbnZfc3RycG9zIiwgImljb252X3N0cnJwb3MiLCAiaWNvbnZfbWltZV9lbmNvZGUiLAogICAgICAiaWNvbnZfbWltZV9kZWNvZGUiLCAiaWNvbnZfbWltZV9kZWNvZGVfaGVhZGVycyIsICJqc29uX2VuY29kZSIsICJqc29uX2RlY29kZSIsCiAgICAgICJvZGJjX2F1dG9jb21taXQiLCAib2RiY19iaW5tb2RlIiwgIm9kYmNfY2xvc2UiLCAib2RiY19jbG9zZV9hbGwiLAogICAgICAib2RiY19jb2x1bW5zIiwgIm9kYmNfY29tbWl0IiwgIm9kYmNfY29ubmVjdCIsICJvZGJjX2N1cnNvciIsCiAgICAgICJvZGJjX2RhdGFfc291cmNlIiwgIm9kYmNfZXhlY3V0ZSIsICJvZGJjX2Vycm9yIiwgIm9kYmNfZXJyb3Jtc2ciLCAib2RiY19leGVjIiwKICAgICAgIm9kYmNfZmV0Y2hfYXJyYXkiLCAib2RiY19mZXRjaF9vYmplY3QiLCAib2RiY19mZXRjaF9yb3ciLCAib2RiY19mZXRjaF9pbnRvIiwKICAgICAgIm9kYmNfZmllbGRfbGVuIiwgIm9kYmNfZmllbGRfc2NhbGUiLCAib2RiY19maWVsZF9uYW1lIiwgIm9kYmNfZmllbGRfdHlwZSIsCiAgICAgICJvZGJjX2ZpZWxkX251bSIsICJvZGJjX2ZyZWVfcmVzdWx0IiwgIm9kYmNfZ2V0dHlwZWluZm8iLCAib2RiY19sb25ncmVhZGxlbiIsCiAgICAgICJvZGJjX25leHRfcmVzdWx0IiwgIm9kYmNfbnVtX2ZpZWxkcyIsICJvZGJjX251bV9yb3dzIiwgIm9kYmNfcGNvbm5lY3QiLAogICAgICAib2RiY19wcmVwYXJlIiwgIm9kYmNfcmVzdWx0IiwgIm9kYmNfcmVzdWx0X2FsbCIsICJvZGJjX3JvbGxiYWNrIiwKICAgICAgIm9kYmNfc2V0b3B0aW9uIiwgIm9kYmNfc3BlY2lhbGNvbHVtbnMiLCAib2RiY19zdGF0aXN0aWNzIiwgIm9kYmNfdGFibGVzIiwKICAgICAgIm9kYmNfcHJpbWFyeWtleXMiLCAib2RiY19jb2x1bW5wcml2aWxlZ2VzIiwgIm9kYmNfdGFibGVwcml2aWxlZ2VzIiwKICAgICAgIm9kYmNfZm9yZWlnbmtleXMiLCAib2RiY19wcm9jZWR1cmVzIiwgIm9kYmNfcHJvY2VkdXJlY29sdW1ucyIsICJvZGJjX2RvIiwKICAgICAgIm9kYmNfZmllbGRfcHJlY2lzaW9uIiwgInByZWdfbWF0Y2giLCAicHJlZ19tYXRjaF9hbGwiLCAicHJlZ19yZXBsYWNlIiwKICAgICAgInByZWdfcmVwbGFjZV9jYWxsYmFjayIsICJwcmVnX3NwbGl0IiwgInByZWdfcXVvdGUiLCAicHJlZ19ncmVwIiwKICAgICAgInByZWdfbGFzdF9lcnJvciIsICJzZXNzaW9uX25hbWUiLCAic2Vzc2lvbl9tb2R1bGVfbmFtZSIsICJzZXNzaW9uX3NhdmVfcGF0aCIsCiAgICAgICJzZXNzaW9uX2lkIiwgInNlc3Npb25fcmVnZW5lcmF0ZV9pZCIsICJzZXNzaW9uX2RlY29kZSIsICJzZXNzaW9uX3JlZ2lzdGVyIiwKICAgICAgInNlc3Npb25fdW5yZWdpc3RlciIsICJzZXNzaW9uX2lzX3JlZ2lzdGVyZWQiLCAic2Vzc2lvbl9lbmNvZGUiLAogICAgICAic2Vzc2lvbl9zdGFydCIsICJzZXNzaW9uX2Rlc3Ryb3kiLCAic2Vzc2lvbl91bnNldCIsCiAgICAgICJzZXNzaW9uX3NldF9zYXZlX2hhbmRsZXIiLCAic2Vzc2lvbl9jYWNoZV9saW1pdGVyIiwgInNlc3Npb25fY2FjaGVfZXhwaXJlIiwKICAgICAgInNlc3Npb25fc2V0X2Nvb2tpZV9wYXJhbXMiLCAic2Vzc2lvbl9nZXRfY29va2llX3BhcmFtcyIsCiAgICAgICJzZXNzaW9uX3dyaXRlX2Nsb3NlIiwgInNlc3Npb25fY29tbWl0IiwgInNwbF9jbGFzc2VzIiwgInNwbF9hdXRvbG9hZCIsCiAgICAgICJzcGxfYXV0b2xvYWRfZXh0ZW5zaW9ucyIsICJzcGxfYXV0b2xvYWRfcmVnaXN0ZXIiLCAic3BsX2F1dG9sb2FkX3VucmVnaXN0ZXIiLAogICAgICAic3BsX2F1dG9sb2FkX2Z1bmN0aW9ucyIsICJzcGxfYXV0b2xvYWRfY2FsbCIsICJjbGFzc19wYXJlbnRzIiwKICAgICAgImNsYXNzX2ltcGxlbWVudHMiLCAic3BsX29iamVjdF9oYXNoIiwgIml0ZXJhdG9yX3RvX2FycmF5IiwgIml0ZXJhdG9yX2NvdW50IiwKICAgICAgIml0ZXJhdG9yX2FwcGx5IiwgImNvbnN0YW50IiwgImJpbjJoZXgiLCAic2xlZXAiLCAidXNsZWVwIiwgImZsdXNoIiwKICAgICAgIndvcmR3cmFwIiwgImh0bWxzcGVjaWFsY2hhcnMiLCAiaHRtbGVudGl0aWVzIiwgImh0bWxfZW50aXR5X2RlY29kZSIsCiAgICAgICJodG1sc3BlY2lhbGNoYXJzX2RlY29kZSIsICJnZXRfaHRtbF90cmFuc2xhdGlvbl90YWJsZSIsICJzaGExIiwgInNoYTFfZmlsZSIsCiAgICAgICJtZDUiLCAibWQ1X2ZpbGUiLCAiY3JjMzIiLCAiaXB0Y3BhcnNlIiwgImlwdGNlbWJlZCIsICJnZXRpbWFnZXNpemUiLAogICAgICAiaW1hZ2VfdHlwZV90b19taW1lX3R5cGUiLCAiaW1hZ2VfdHlwZV90b19leHRlbnNpb24iLCAicGhwaW5mbyIsICJwaHB2ZXJzaW9uIiwKICAgICAgInBocGNyZWRpdHMiLCAicGhwX2xvZ29fZ3VpZCIsICJwaHBfcmVhbF9sb2dvX2d1aWQiLCAicGhwX2VnZ19sb2dvX2d1aWQiLAogICAgICAiemVuZF9sb2dvX2d1aWQiLCAicGhwX3NhcGlfbmFtZSIsICJwaHBfdW5hbWUiLCAicGhwX2luaV9zY2FubmVkX2ZpbGVzIiwKICAgICAgInN0cm5hdGNtcCIsICJzdHJuYXRjYXNlY21wIiwgInN1YnN0cl9jb3VudCIsICJzdHJzcG4iLCAic3RyY3NwbiIsICJzdHJ0b2siLAogICAgICAic3RydG91cHBlciIsICJzdHJ0b2xvd2VyIiwgInN0cnBvcyIsICJzdHJpcG9zIiwgInN0cnJwb3MiLCAic3Rycmlwb3MiLAogICAgICAic3RycmV2IiwgImhlYnJldiIsICJoZWJyZXZjIiwgIm5sMmJyIiwgImJhc2VuYW1lIiwgImRpcm5hbWUiLCAicGF0aGluZm8iLAogICAgICAic3RyaXBzbGFzaGVzIiwgInN0cmlwY3NsYXNoZXMiLCAic3Ryc3RyIiwgInN0cmlzdHIiLCAic3RycmNociIsICJzdHJfc2h1ZmZsZSIsCiAgICAgICJzdHJfd29yZF9jb3VudCIsICJzdHJfc3BsaXQiLCAic3RycGJyayIsICJzdWJzdHJfY29tcGFyZSIsICJzdHJjb2xsIiwKICAgICAgInN1YnN0ciIsICJzdWJzdHJfcmVwbGFjZSIsICJxdW90ZW1ldGEiLCAidWNmaXJzdCIsICJ1Y3dvcmRzIiwgInN0cnRyIiwKICAgICAgImFkZHNsYXNoZXMiLCAiYWRkY3NsYXNoZXMiLCAicnRyaW0iLCAic3RyX3JlcGxhY2UiLCAic3RyX2lyZXBsYWNlIiwKICAgICAgInN0cl9yZXBlYXQiLCAiY291bnRfY2hhcnMiLCAiY2h1bmtfc3BsaXQiLCAidHJpbSIsICJsdHJpbSIsICJzdHJpcF90YWdzIiwKICAgICAgInNpbWlsYXJfdGV4dCIsICJleHBsb2RlIiwgImltcGxvZGUiLCAic2V0bG9jYWxlIiwgImxvY2FsZWNvbnYiLCAic291bmRleCIsCiAgICAgICJsZXZlbnNodGVpbiIsICJjaHIiLCAib3JkIiwgInBhcnNlX3N0ciIsICJzdHJfcGFkIiwgImNob3AiLCAic3RyY2hyIiwKICAgICAgInNwcmludGYiLCAicHJpbnRmIiwgInZwcmludGYiLCAidnNwcmludGYiLCAiZnByaW50ZiIsICJ2ZnByaW50ZiIsICJzc2NhbmYiLAogICAgICAiZnNjYW5mIiwgInBhcnNlX3VybCIsICJ1cmxlbmNvZGUiLCAidXJsZGVjb2RlIiwgInJhd3VybGVuY29kZSIsCiAgICAgICJyYXd1cmxkZWNvZGUiLCAiaHR0cF9idWlsZF9xdWVyeSIsICJ1bmxpbmsiLCAiZXhlYyIsICJzeXN0ZW0iLAogICAgICAiZXNjYXBlc2hlbGxjbWQiLCAiZXNjYXBlc2hlbGxhcmciLCAicGFzc3RocnUiLCAic2hlbGxfZXhlYyIsICJwcm9jX29wZW4iLAogICAgICAicHJvY19jbG9zZSIsICJwcm9jX3Rlcm1pbmF0ZSIsICJwcm9jX2dldF9zdGF0dXMiLCAicmFuZCIsICJzcmFuZCIsCiAgICAgICJnZXRyYW5kbWF4IiwgIm10X3JhbmQiLCAibXRfc3JhbmQiLCAibXRfZ2V0cmFuZG1heCIsICJnZXRzZXJ2YnluYW1lIiwKICAgICAgImdldHNlcnZieXBvcnQiLCAiZ2V0cHJvdG9ieW5hbWUiLCAiZ2V0cHJvdG9ieW51bWJlciIsICJnZXRteXVpZCIsICJnZXRteWdpZCIsCiAgICAgICJnZXRteXBpZCIsICJnZXRteWlub2RlIiwgImdldGxhc3Rtb2QiLCAiYmFzZTY0X2RlY29kZSIsICJiYXNlNjRfZW5jb2RlIiwKICAgICAgImNvbnZlcnRfdXVlbmNvZGUiLCAiY29udmVydF91dWRlY29kZSIsICJhYnMiLCAiY2VpbCIsICJmbG9vciIsICJyb3VuZCIsICJzaW4iLAogICAgICAiY29zIiwgInRhbiIsICJhc2luIiwgImFjb3MiLCAiYXRhbiIsICJhdGFuMiIsICJzaW5oIiwgImNvc2giLCAidGFuaCIsICJwaSIsCiAgICAgICJpc19maW5pdGUiLCAiaXNfbmFuIiwgImlzX2luZmluaXRlIiwgInBvdyIsICJleHAiLCAibG9nIiwgImxvZzEwIiwgInNxcnQiLAogICAgICAiaHlwb3QiLCAiZGVnMnJhZCIsICJyYWQyZGVnIiwgImJpbmRlYyIsICJoZXhkZWMiLCAib2N0ZGVjIiwgImRlY2JpbiIsCiAgICAgICJkZWNvY3QiLCAiZGVjaGV4IiwgImJhc2VfY29udmVydCIsICJudW1iZXJfZm9ybWF0IiwgImZtb2QiLCAiaXAybG9uZyIsCiAgICAgICJsb25nMmlwIiwgImdldGVudiIsICJwdXRlbnYiLCAibWljcm90aW1lIiwgImdldHRpbWVvZmRheSIsICJ1bmlxaWQiLAogICAgICAicXVvdGVkX3ByaW50YWJsZV9kZWNvZGUiLCAiY29udmVydF9jeXJfc3RyaW5nIiwgImdldF9jdXJyZW50X3VzZXIiLAogICAgICAic2V0X3RpbWVfbGltaXQiLCAiZ2V0X2NmZ192YXIiLCAibWFnaWNfcXVvdGVzX3J1bnRpbWUiLAogICAgICAic2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lIiwgImdldF9tYWdpY19xdW90ZXNfZ3BjIiwgImdldF9tYWdpY19xdW90ZXNfcnVudGltZSIsCiAgICAgICJpbXBvcnRfcmVxdWVzdF92YXJpYWJsZXMiLCAiZXJyb3JfbG9nIiwgImVycm9yX2dldF9sYXN0IiwgImNhbGxfdXNlcl9mdW5jIiwKICAgICAgImNhbGxfdXNlcl9mdW5jX2FycmF5IiwgImNhbGxfdXNlcl9tZXRob2QiLCAiY2FsbF91c2VyX21ldGhvZF9hcnJheSIsCiAgICAgICJzZXJpYWxpemUiLCAidW5zZXJpYWxpemUiLCAidmFyX2R1bXAiLCAidmFyX2V4cG9ydCIsICJkZWJ1Z196dmFsX2R1bXAiLAogICAgICAicHJpbnRfciIsICJtZW1vcnlfZ2V0X3VzYWdlIiwgIm1lbW9yeV9nZXRfcGVha191c2FnZSIsCiAgICAgICJyZWdpc3Rlcl9zaHV0ZG93bl9mdW5jdGlvbiIsICJyZWdpc3Rlcl90aWNrX2Z1bmN0aW9uIiwKICAgICAgInVucmVnaXN0ZXJfdGlja19mdW5jdGlvbiIsICJoaWdobGlnaHRfZmlsZSIsICJzaG93X3NvdXJjZSIsCiAgICAgICJoaWdobGlnaHRfc3RyaW5nIiwgInBocF9zdHJpcF93aGl0ZXNwYWNlIiwgImluaV9nZXQiLCAiaW5pX2dldF9hbGwiLAogICAgICAiaW5pX3NldCIsICJpbmlfYWx0ZXIiLCAiaW5pX3Jlc3RvcmUiLCAiZ2V0X2luY2x1ZGVfcGF0aCIsICJzZXRfaW5jbHVkZV9wYXRoIiwKICAgICAgInJlc3RvcmVfaW5jbHVkZV9wYXRoIiwgInNldGNvb2tpZSIsICJzZXRyYXdjb29raWUiLCAiaGVhZGVyIiwgImhlYWRlcnNfc2VudCIsCiAgICAgICJoZWFkZXJzX2xpc3QiLCAiY29ubmVjdGlvbl9hYm9ydGVkIiwgImNvbm5lY3Rpb25fc3RhdHVzIiwgImlnbm9yZV91c2VyX2Fib3J0IiwKICAgICAgInBhcnNlX2luaV9maWxlIiwgImlzX3VwbG9hZGVkX2ZpbGUiLCAibW92ZV91cGxvYWRlZF9maWxlIiwgImdldGhvc3RieWFkZHIiLAogICAgICAiZ2V0aG9zdGJ5bmFtZSIsICJnZXRob3N0YnluYW1lbCIsICJpbnR2YWwiLCAiZmxvYXR2YWwiLCAiZG91YmxldmFsIiwgInN0cnZhbCIsCiAgICAgICJnZXR0eXBlIiwgInNldHR5cGUiLCAiaXNfbnVsbCIsICJpc19yZXNvdXJjZSIsICJpc19ib29sIiwgImlzX2xvbmciLAogICAgICAiaXNfZmxvYXQiLCAiaXNfaW50IiwgImlzX2ludGVnZXIiLCAiaXNfZG91YmxlIiwgImlzX3JlYWwiLCAiaXNfbnVtZXJpYyIsCiAgICAgICJpc19zdHJpbmciLCAiaXNfYXJyYXkiLCAiaXNfb2JqZWN0IiwgImlzX3NjYWxhciIsICJpc19jYWxsYWJsZSIsICJlcmVnIiwKICAgICAgImVyZWdfcmVwbGFjZSIsICJlcmVnaSIsICJlcmVnaV9yZXBsYWNlIiwgInNwbGl0IiwgInNwbGl0aSIsICJqb2luIiwKICAgICAgInNxbF9yZWdjYXNlIiwgImRsIiwgInBjbG9zZSIsICJwb3BlbiIsICJyZWFkZmlsZSIsICJyZXdpbmQiLCAicm1kaXIiLCAidW1hc2siLAogICAgICAiZmNsb3NlIiwgImZlb2YiLCAiZmdldGMiLCAiZmdldHMiLCAiZmdldHNzIiwgImZyZWFkIiwgImZvcGVuIiwgImZwYXNzdGhydSIsCiAgICAgICJmdHJ1bmNhdGUiLCAiZnN0YXQiLCAiZnNlZWsiLCAiZnRlbGwiLCAiZmZsdXNoIiwgImZ3cml0ZSIsICJmcHV0cyIsICJta2RpciIsCiAgICAgICJyZW5hbWUiLCAiY29weSIsICJ0ZW1wbmFtIiwgInRtcGZpbGUiLCAiZmlsZSIsICJmaWxlX2dldF9jb250ZW50cyIsCiAgICAgICJmaWxlX3B1dF9jb250ZW50cyIsICJzdHJlYW1fc2VsZWN0IiwgInN0cmVhbV9jb250ZXh0X2NyZWF0ZSIsCiAgICAgICJzdHJlYW1fY29udGV4dF9zZXRfcGFyYW1zIiwgInN0cmVhbV9jb250ZXh0X3NldF9vcHRpb24iLAogICAgICAic3RyZWFtX2NvbnRleHRfZ2V0X29wdGlvbnMiLCAic3RyZWFtX2NvbnRleHRfZ2V0X2RlZmF1bHQiLAogICAgICAic3RyZWFtX2ZpbHRlcl9wcmVwZW5kIiwgInN0cmVhbV9maWx0ZXJfYXBwZW5kIiwgInN0cmVhbV9maWx0ZXJfcmVtb3ZlIiwKICAgICAgInN0cmVhbV9zb2NrZXRfY2xpZW50IiwgInN0cmVhbV9zb2NrZXRfc2VydmVyIiwgInN0cmVhbV9zb2NrZXRfYWNjZXB0IiwKICAgICAgInN0cmVhbV9zb2NrZXRfZ2V0X25hbWUiLCAic3RyZWFtX3NvY2tldF9yZWN2ZnJvbSIsICJzdHJlYW1fc29ja2V0X3NlbmR0byIsCiAgICAgICJzdHJlYW1fc29ja2V0X2VuYWJsZV9jcnlwdG8iLCAic3RyZWFtX3NvY2tldF9zaHV0ZG93biIsCiAgICAgICJzdHJlYW1fY29weV90b19zdHJlYW0iLCAic3RyZWFtX2dldF9jb250ZW50cyIsICJmZ2V0Y3N2IiwgImZwdXRjc3YiLCAiZmxvY2siLAogICAgICAiZ2V0X21ldGFfdGFncyIsICJzdHJlYW1fc2V0X3dyaXRlX2J1ZmZlciIsICJzZXRfZmlsZV9idWZmZXIiLAogICAgICAic2V0X3NvY2tldF9ibG9ja2luZyIsICJzdHJlYW1fc2V0X2Jsb2NraW5nIiwgInNvY2tldF9zZXRfYmxvY2tpbmciLAogICAgICAic3RyZWFtX2dldF9tZXRhX2RhdGEiLCAic3RyZWFtX2dldF9saW5lIiwgInN0cmVhbV93cmFwcGVyX3JlZ2lzdGVyIiwKICAgICAgInN0cmVhbV9yZWdpc3Rlcl93cmFwcGVyIiwgInN0cmVhbV93cmFwcGVyX3VucmVnaXN0ZXIiLAogICAgICAic3RyZWFtX3dyYXBwZXJfcmVzdG9yZSIsICJzdHJlYW1fZ2V0X3dyYXBwZXJzIiwgInN0cmVhbV9nZXRfdHJhbnNwb3J0cyIsCiAgICAgICJnZXRfaGVhZGVycyIsICJzdHJlYW1fc2V0X3RpbWVvdXQiLCAic29ja2V0X3NldF90aW1lb3V0IiwgInNvY2tldF9nZXRfc3RhdHVzIiwKICAgICAgInJlYWxwYXRoIiwgImZzb2Nrb3BlbiIsICJwZnNvY2tvcGVuIiwgInBhY2siLCAidW5wYWNrIiwgImdldF9icm93c2VyIiwKICAgICAgImNyeXB0IiwgIm9wZW5kaXIiLCAiY2xvc2VkaXIiLCAiY2hkaXIiLCAiZ2V0Y3dkIiwgInJld2luZGRpciIsICJyZWFkZGlyIiwKICAgICAgImRpciIsICJzY2FuZGlyIiwgImdsb2IiLCAiZmlsZWF0aW1lIiwgImZpbGVjdGltZSIsICJmaWxlZ3JvdXAiLCAiZmlsZWlub2RlIiwKICAgICAgImZpbGVtdGltZSIsICJmaWxlb3duZXIiLCAiZmlsZXBlcm1zIiwgImZpbGVzaXplIiwgImZpbGV0eXBlIiwgImZpbGVfZXhpc3RzIiwKICAgICAgImlzX3dyaXRhYmxlIiwgImlzX3dyaXRlYWJsZSIsICJpc19yZWFkYWJsZSIsICJpc19leGVjdXRhYmxlIiwgImlzX2ZpbGUiLAogICAgICAiaXNfZGlyIiwgImlzX2xpbmsiLCAic3RhdCIsICJsc3RhdCIsICJjaG93biIsICJjaGdycCIsICJjaG1vZCIsICJ0b3VjaCIsCiAgICAgICJjbGVhcnN0YXRjYWNoZSIsICJkaXNrX3RvdGFsX3NwYWNlIiwgImRpc2tfZnJlZV9zcGFjZSIsICJkaXNrZnJlZXNwYWNlIiwKICAgICAgIm1haWwiLCAiZXptbG1faGFzaCIsICJvcGVubG9nIiwgInN5c2xvZyIsICJjbG9zZWxvZyIsCiAgICAgICJkZWZpbmVfc3lzbG9nX3ZhcmlhYmxlcyIsICJsY2dfdmFsdWUiLCAibWV0YXBob25lIiwgIm9iX3N0YXJ0IiwgIm9iX2ZsdXNoIiwKICAgICAgIm9iX2NsZWFuIiwgIm9iX2VuZF9mbHVzaCIsICJvYl9lbmRfY2xlYW4iLCAib2JfZ2V0X2ZsdXNoIiwgIm9iX2dldF9jbGVhbiIsCiAgICAgICJvYl9nZXRfbGVuZ3RoIiwgIm9iX2dldF9sZXZlbCIsICJvYl9nZXRfc3RhdHVzIiwgIm9iX2dldF9jb250ZW50cyIsCiAgICAgICJvYl9pbXBsaWNpdF9mbHVzaCIsICJvYl9saXN0X2hhbmRsZXJzIiwgImtzb3J0IiwgImtyc29ydCIsICJuYXRzb3J0IiwKICAgICAgIm5hdGNhc2Vzb3J0IiwgImFzb3J0IiwgImFyc29ydCIsICJzb3J0IiwgInJzb3J0IiwgInVzb3J0IiwgInVhc29ydCIsICJ1a3NvcnQiLAogICAgICAic2h1ZmZsZSIsICJhcnJheV93YWxrIiwgImFycmF5X3dhbGtfcmVjdXJzaXZlIiwgImNvdW50IiwgImVuZCIsICJwcmV2IiwKICAgICAgIm5leHQiLCAicmVzZXQiLCAiY3VycmVudCIsICJrZXkiLCAibWluIiwgIm1heCIsICJpbl9hcnJheSIsICJhcnJheV9zZWFyY2giLAogICAgICAiZXh0cmFjdCIsICJjb21wYWN0IiwgImFycmF5X2ZpbGwiLCAiYXJyYXlfZmlsbF9rZXlzIiwgInJhbmdlIiwKICAgICAgImFycmF5X211bHRpc29ydCIsICJhcnJheV9wdXNoIiwgImFycmF5X3BvcCIsICJhcnJheV9zaGlmdCIsICJhcnJheV91bnNoaWZ0IiwKICAgICAgImFycmF5X3NwbGljZSIsICJhcnJheV9zbGljZSIsICJhcnJheV9tZXJnZSIsICJhcnJheV9tZXJnZV9yZWN1cnNpdmUiLAogICAgICAiYXJyYXlfa2V5cyIsICJhcnJheV92YWx1ZXMiLCAiYXJyYXlfY291bnRfdmFsdWVzIiwgImFycmF5X3JldmVyc2UiLAogICAgICAiYXJyYXlfcmVkdWNlIiwgImFycmF5X3BhZCIsICJhcnJheV9mbGlwIiwgImFycmF5X2NoYW5nZV9rZXlfY2FzZSIsCiAgICAgICJhcnJheV9yYW5kIiwgImFycmF5X3VuaXF1ZSIsICJhcnJheV9pbnRlcnNlY3QiLCAiYXJyYXlfaW50ZXJzZWN0X2tleSIsCiAgICAgICJhcnJheV9pbnRlcnNlY3RfdWtleSIsICJhcnJheV91aW50ZXJzZWN0IiwgImFycmF5X2ludGVyc2VjdF9hc3NvYyIsCiAgICAgICJhcnJheV91aW50ZXJzZWN0X2Fzc29jIiwgImFycmF5X2ludGVyc2VjdF91YXNzb2MiLCAiYXJyYXlfdWludGVyc2VjdF91YXNzb2MiLAogICAgICAiYXJyYXlfZGlmZiIsICJhcnJheV9kaWZmX2tleSIsICJhcnJheV9kaWZmX3VrZXkiLCAiYXJyYXlfdWRpZmYiLAogICAgICAiYXJyYXlfZGlmZl9hc3NvYyIsICJhcnJheV91ZGlmZl9hc3NvYyIsICJhcnJheV9kaWZmX3Vhc3NvYyIsCiAgICAgICJhcnJheV91ZGlmZl91YXNzb2MiLCAiYXJyYXlfc3VtIiwgImFycmF5X3Byb2R1Y3QiLCAiYXJyYXlfZmlsdGVyIiwKICAgICAgImFycmF5X21hcCIsICJhcnJheV9jaHVuayIsICJhcnJheV9jb21iaW5lIiwgImFycmF5X2tleV9leGlzdHMiLCAicG9zIiwKICAgICAgInNpemVvZiIsICJrZXlfZXhpc3RzIiwgImFzc2VydCIsICJhc3NlcnRfb3B0aW9ucyIsICJ2ZXJzaW9uX2NvbXBhcmUiLAogICAgICAic3RyX3JvdDEzIiwgInN0cmVhbV9nZXRfZmlsdGVycyIsICJzdHJlYW1fZmlsdGVyX3JlZ2lzdGVyIiwKICAgICAgInN0cmVhbV9idWNrZXRfbWFrZV93cml0ZWFibGUiLCAic3RyZWFtX2J1Y2tldF9wcmVwZW5kIiwKICAgICAgInN0cmVhbV9idWNrZXRfYXBwZW5kIiwgInN0cmVhbV9idWNrZXRfbmV3IiwgIm91dHB1dF9hZGRfcmV3cml0ZV92YXIiLAogICAgICAib3V0cHV0X3Jlc2V0X3Jld3JpdGVfdmFycyIsICJzeXNfZ2V0X3RlbXBfZGlyIiwgInRva2VuX2dldF9hbGwiLCAidG9rZW5fbmFtZSIsCiAgICAgICJyZWFkZ3pmaWxlIiwgImd6cmV3aW5kIiwgImd6Y2xvc2UiLCAiZ3plb2YiLCAiZ3pnZXRjIiwgImd6Z2V0cyIsICJnemdldHNzIiwKICAgICAgImd6cmVhZCIsICJnem9wZW4iLCAiZ3pwYXNzdGhydSIsICJnenNlZWsiLCAiZ3p0ZWxsIiwgImd6d3JpdGUiLCAiZ3pwdXRzIiwKICAgICAgImd6ZmlsZSIsICJnemNvbXByZXNzIiwgImd6dW5jb21wcmVzcyIsICJnemRlZmxhdGUiLCAiZ3ppbmZsYXRlIiwgImd6ZW5jb2RlIiwKICAgICAgIm9iX2d6aGFuZGxlciIsICJ6bGliX2dldF9jb2RpbmdfdHlwZSIsICJsaWJ4bWxfc2V0X3N0cmVhbXNfY29udGV4dCIsCiAgICAgICJsaWJ4bWxfdXNlX2ludGVybmFsX2Vycm9ycyIsICJsaWJ4bWxfZ2V0X2xhc3RfZXJyb3IiLCAibGlieG1sX2NsZWFyX2Vycm9ycyIsCiAgICAgICJsaWJ4bWxfZ2V0X2Vycm9ycyIsICJkb21faW1wb3J0X3NpbXBsZXhtbCIsICJzaW1wbGV4bWxfbG9hZF9maWxlIiwKICAgICAgInNpbXBsZXhtbF9sb2FkX3N0cmluZyIsICJzaW1wbGV4bWxfaW1wb3J0X2RvbSIsICJ3ZGR4X3NlcmlhbGl6ZV92YWx1ZSIsCiAgICAgICJ3ZGR4X3NlcmlhbGl6ZV92YXJzIiwgIndkZHhfcGFja2V0X3N0YXJ0IiwgIndkZHhfcGFja2V0X2VuZCIsICJ3ZGR4X2FkZF92YXJzIiwKICAgICAgIndkZHhfZGVzZXJpYWxpemUiLCAieG1sX3BhcnNlcl9jcmVhdGUiLCAieG1sX3BhcnNlcl9jcmVhdGVfbnMiLAogICAgICAieG1sX3NldF9vYmplY3QiLCAieG1sX3NldF9lbGVtZW50X2hhbmRsZXIiLCAieG1sX3NldF9jaGFyYWN0ZXJfZGF0YV9oYW5kbGVyIiwKICAgICAgInhtbF9zZXRfcHJvY2Vzc2luZ19pbnN0cnVjdGlvbl9oYW5kbGVyIiwgInhtbF9zZXRfZGVmYXVsdF9oYW5kbGVyIiwKICAgICAgInhtbF9zZXRfdW5wYXJzZWRfZW50aXR5X2RlY2xfaGFuZGxlciIsICJ4bWxfc2V0X25vdGF0aW9uX2RlY2xfaGFuZGxlciIsCiAgICAgICJ4bWxfc2V0X2V4dGVybmFsX2VudGl0eV9yZWZfaGFuZGxlciIsICJ4bWxfc2V0X3N0YXJ0X25hbWVzcGFjZV9kZWNsX2hhbmRsZXIiLAogICAgICAieG1sX3NldF9lbmRfbmFtZXNwYWNlX2RlY2xfaGFuZGxlciIsICJ4bWxfcGFyc2UiLCAieG1sX3BhcnNlX2ludG9fc3RydWN0IiwKICAgICAgInhtbF9nZXRfZXJyb3JfY29kZSIsICJ4bWxfZXJyb3Jfc3RyaW5nIiwgInhtbF9nZXRfY3VycmVudF9saW5lX251bWJlciIsCiAgICAgICJ4bWxfZ2V0X2N1cnJlbnRfY29sdW1uX251bWJlciIsICJ4bWxfZ2V0X2N1cnJlbnRfYnl0ZV9pbmRleCIsCiAgICAgICJ4bWxfcGFyc2VyX2ZyZWUiLCAieG1sX3BhcnNlcl9zZXRfb3B0aW9uIiwgInhtbF9wYXJzZXJfZ2V0X29wdGlvbiIsCiAgICAgICJ1dGY4X2VuY29kZSIsICJ1dGY4X2RlY29kZSIsICJ4bWx3cml0ZXJfb3Blbl91cmkiLCAieG1sd3JpdGVyX29wZW5fbWVtb3J5IiwKICAgICAgInhtbHdyaXRlcl9zZXRfaW5kZW50IiwgInhtbHdyaXRlcl9zZXRfaW5kZW50X3N0cmluZyIsCiAgICAgICJ4bWx3cml0ZXJfc3RhcnRfY29tbWVudCIsICJ4bWx3cml0ZXJfZW5kX2NvbW1lbnQiLAogICAgICAieG1sd3JpdGVyX3N0YXJ0X2F0dHJpYnV0ZSIsICJ4bWx3cml0ZXJfZW5kX2F0dHJpYnV0ZSIsCiAgICAgICJ4bWx3cml0ZXJfd3JpdGVfYXR0cmlidXRlIiwgInhtbHdyaXRlcl9zdGFydF9hdHRyaWJ1dGVfbnMiLAogICAgICAieG1sd3JpdGVyX3dyaXRlX2F0dHJpYnV0ZV9ucyIsICJ4bWx3cml0ZXJfc3RhcnRfZWxlbWVudCIsCiAgICAgICJ4bWx3cml0ZXJfZW5kX2VsZW1lbnQiLCAieG1sd3JpdGVyX2Z1bGxfZW5kX2VsZW1lbnQiLAogICAgICAieG1sd3JpdGVyX3N0YXJ0X2VsZW1lbnRfbnMiLCAieG1sd3JpdGVyX3dyaXRlX2VsZW1lbnQiLAogICAgICAieG1sd3JpdGVyX3dyaXRlX2VsZW1lbnRfbnMiLCAieG1sd3JpdGVyX3N0YXJ0X3BpIiwgInhtbHdyaXRlcl9lbmRfcGkiLAogICAgICAieG1sd3JpdGVyX3dyaXRlX3BpIiwgInhtbHdyaXRlcl9zdGFydF9jZGF0YSIsICJ4bWx3cml0ZXJfZW5kX2NkYXRhIiwKICAgICAgInhtbHdyaXRlcl93cml0ZV9jZGF0YSIsICJ4bWx3cml0ZXJfdGV4dCIsICJ4bWx3cml0ZXJfd3JpdGVfcmF3IiwKICAgICAgInhtbHdyaXRlcl9zdGFydF9kb2N1bWVudCIsICJ4bWx3cml0ZXJfZW5kX2RvY3VtZW50IiwKICAgICAgInhtbHdyaXRlcl93cml0ZV9jb21tZW50IiwgInhtbHdyaXRlcl9zdGFydF9kdGQiLCAieG1sd3JpdGVyX2VuZF9kdGQiLAogICAgICAieG1sd3JpdGVyX3dyaXRlX2R0ZCIsICJ4bWx3cml0ZXJfc3RhcnRfZHRkX2VsZW1lbnQiLAogICAgICAieG1sd3JpdGVyX2VuZF9kdGRfZWxlbWVudCIsICJ4bWx3cml0ZXJfd3JpdGVfZHRkX2VsZW1lbnQiLAogICAgICAieG1sd3JpdGVyX3N0YXJ0X2R0ZF9hdHRsaXN0IiwgInhtbHdyaXRlcl9lbmRfZHRkX2F0dGxpc3QiLAogICAgICAieG1sd3JpdGVyX3dyaXRlX2R0ZF9hdHRsaXN0IiwgInhtbHdyaXRlcl9zdGFydF9kdGRfZW50aXR5IiwKICAgICAgInhtbHdyaXRlcl9lbmRfZHRkX2VudGl0eSIsICJ4bWx3cml0ZXJfd3JpdGVfZHRkX2VudGl0eSIsCiAgICAgICJ4bWx3cml0ZXJfb3V0cHV0X21lbW9yeSIsICJ4bWx3cml0ZXJfZmx1c2giLCAiZ2RfaW5mbyIsICJpbWFnZWFyYyIsCiAgICAgICJpbWFnZWVsbGlwc2UiLCAiaW1hZ2VjaGFyIiwgImltYWdlY2hhcnVwIiwgImltYWdlY29sb3JhdCIsCiAgICAgICJpbWFnZWNvbG9yYWxsb2NhdGUiLCAiaW1hZ2VwYWxldHRlY29weSIsICJpbWFnZWNyZWF0ZWZyb21zdHJpbmciLAogICAgICAiaW1hZ2Vjb2xvcmNsb3Nlc3QiLCAiaW1hZ2Vjb2xvcmRlYWxsb2NhdGUiLCAiaW1hZ2Vjb2xvcnJlc29sdmUiLAogICAgICAiaW1hZ2Vjb2xvcmV4YWN0IiwgImltYWdlY29sb3JzZXQiLCAiaW1hZ2Vjb2xvcnRyYW5zcGFyZW50IiwKICAgICAgImltYWdlY29sb3JzdG90YWwiLCAiaW1hZ2Vjb2xvcnNmb3JpbmRleCIsICJpbWFnZWNvcHkiLCAiaW1hZ2Vjb3B5bWVyZ2UiLAogICAgICAiaW1hZ2Vjb3B5bWVyZ2VncmF5IiwgImltYWdlY29weXJlc2l6ZWQiLCAiaW1hZ2VjcmVhdGUiLAogICAgICAiaW1hZ2VjcmVhdGV0cnVlY29sb3IiLCAiaW1hZ2Vpc3RydWVjb2xvciIsICJpbWFnZXRydWVjb2xvcnRvcGFsZXR0ZSIsCiAgICAgICJpbWFnZXNldHRoaWNrbmVzcyIsICJpbWFnZWZpbGxlZGFyYyIsICJpbWFnZWZpbGxlZGVsbGlwc2UiLAogICAgICAiaW1hZ2VhbHBoYWJsZW5kaW5nIiwgImltYWdlc2F2ZWFscGhhIiwgImltYWdlY29sb3JhbGxvY2F0ZWFscGhhIiwKICAgICAgImltYWdlY29sb3JyZXNvbHZlYWxwaGEiLCAiaW1hZ2Vjb2xvcmNsb3Nlc3RhbHBoYSIsICJpbWFnZWNvbG9yZXhhY3RhbHBoYSIsCiAgICAgICJpbWFnZWNvcHlyZXNhbXBsZWQiLCAiaW1hZ2VncmFid2luZG93IiwgImltYWdlZ3JhYnNjcmVlbiIsICJpbWFnZXJvdGF0ZSIsCiAgICAgICJpbWFnZWFudGlhbGlhcyIsICJpbWFnZXNldHRpbGUiLCAiaW1hZ2VzZXRicnVzaCIsICJpbWFnZXNldHN0eWxlIiwKICAgICAgImltYWdlY3JlYXRlZnJvbXBuZyIsICJpbWFnZWNyZWF0ZWZyb21naWYiLCAiaW1hZ2VjcmVhdGVmcm9tanBlZyIsCiAgICAgICJpbWFnZWNyZWF0ZWZyb213Ym1wIiwgImltYWdlY3JlYXRlZnJvbXhibSIsICJpbWFnZWNyZWF0ZWZyb21nZCIsCiAgICAgICJpbWFnZWNyZWF0ZWZyb21nZDIiLCAiaW1hZ2VjcmVhdGVmcm9tZ2QycGFydCIsICJpbWFnZXBuZyIsICJpbWFnZWdpZiIsCiAgICAgICJpbWFnZWpwZWciLCAiaW1hZ2V3Ym1wIiwgImltYWdlZ2QiLCAiaW1hZ2VnZDIiLCAiaW1hZ2VkZXN0cm95IiwKICAgICAgImltYWdlZ2FtbWFjb3JyZWN0IiwgImltYWdlZmlsbCIsICJpbWFnZWZpbGxlZHBvbHlnb24iLCAiaW1hZ2VmaWxsZWRyZWN0YW5nbGUiLAogICAgICAiaW1hZ2VmaWxsdG9ib3JkZXIiLCAiaW1hZ2Vmb250d2lkdGgiLCAiaW1hZ2Vmb250aGVpZ2h0IiwgImltYWdlaW50ZXJsYWNlIiwKICAgICAgImltYWdlbGluZSIsICJpbWFnZWxvYWRmb250IiwgImltYWdlcG9seWdvbiIsICJpbWFnZXJlY3RhbmdsZSIsCiAgICAgICJpbWFnZXNldHBpeGVsIiwgImltYWdlc3RyaW5nIiwgImltYWdlc3RyaW5ndXAiLCAiaW1hZ2VzeCIsICJpbWFnZXN5IiwKICAgICAgImltYWdlZGFzaGVkbGluZSIsICJpbWFnZXR0ZmJib3giLCAiaW1hZ2V0dGZ0ZXh0IiwgImltYWdlZnRiYm94IiwKICAgICAgImltYWdlZnR0ZXh0IiwgImltYWdlcHNsb2FkZm9udCIsICJpbWFnZXBzZnJlZWZvbnQiLCAiaW1hZ2Vwc2VuY29kZWZvbnQiLAogICAgICAiaW1hZ2Vwc2V4dGVuZGZvbnQiLCAiaW1hZ2Vwc3NsYW50Zm9udCIsICJpbWFnZXBzdGV4dCIsICJpbWFnZXBzYmJveCIsCiAgICAgICJpbWFnZXR5cGVzIiwgImpwZWcyd2JtcCIsICJwbmcyd2JtcCIsICJpbWFnZTJ3Ym1wIiwgImltYWdlbGF5ZXJlZmZlY3QiLAogICAgICAiaW1hZ2Vjb2xvcm1hdGNoIiwgImltYWdleGJtIiwgImltYWdlZmlsdGVyIiwgImltYWdlY29udm9sdXRpb24iLAogICAgICAibWJfY29udmVydF9jYXNlIiwgIm1iX3N0cnRvdXBwZXIiLCAibWJfc3RydG9sb3dlciIsICJtYl9sYW5ndWFnZSIsCiAgICAgICJtYl9pbnRlcm5hbF9lbmNvZGluZyIsICJtYl9odHRwX2lucHV0IiwgIm1iX2h0dHBfb3V0cHV0IiwgIm1iX2RldGVjdF9vcmRlciIsCiAgICAgICJtYl9zdWJzdGl0dXRlX2NoYXJhY3RlciIsICJtYl9wYXJzZV9zdHIiLCAibWJfb3V0cHV0X2hhbmRsZXIiLAogICAgICAibWJfcHJlZmVycmVkX21pbWVfbmFtZSIsICJtYl9zdHJsZW4iLCAibWJfc3RycG9zIiwgIm1iX3N0cnJwb3MiLCAibWJfc3RyaXBvcyIsCiAgICAgICJtYl9zdHJyaXBvcyIsICJtYl9zdHJzdHIiLCAibWJfc3RycmNociIsICJtYl9zdHJpc3RyIiwgIm1iX3N0cnJpY2hyIiwKICAgICAgIm1iX3N1YnN0cl9jb3VudCIsICJtYl9zdWJzdHIiLCAibWJfc3RyY3V0IiwgIm1iX3N0cndpZHRoIiwgIm1iX3N0cmltd2lkdGgiLAogICAgICAibWJfY29udmVydF9lbmNvZGluZyIsICJtYl9kZXRlY3RfZW5jb2RpbmciLCAibWJfbGlzdF9lbmNvZGluZ3MiLAogICAgICAibWJfY29udmVydF9rYW5hIiwgIm1iX2VuY29kZV9taW1laGVhZGVyIiwgIm1iX2RlY29kZV9taW1laGVhZGVyIiwKICAgICAgIm1iX2NvbnZlcnRfdmFyaWFibGVzIiwgIm1iX2VuY29kZV9udW1lcmljZW50aXR5IiwgIm1iX2RlY29kZV9udW1lcmljZW50aXR5IiwKICAgICAgIm1iX3NlbmRfbWFpbCIsICJtYl9nZXRfaW5mbyIsICJtYl9jaGVja19lbmNvZGluZyIsICJtYl9yZWdleF9lbmNvZGluZyIsCiAgICAgICJtYl9yZWdleF9zZXRfb3B0aW9ucyIsICJtYl9lcmVnIiwgIm1iX2VyZWdpIiwgIm1iX2VyZWdfcmVwbGFjZSIsCiAgICAgICJtYl9lcmVnaV9yZXBsYWNlIiwgIm1iX3NwbGl0IiwgIm1iX2VyZWdfbWF0Y2giLCAibWJfZXJlZ19zZWFyY2giLAogICAgICAibWJfZXJlZ19zZWFyY2hfcG9zIiwgIm1iX2VyZWdfc2VhcmNoX3JlZ3MiLCAibWJfZXJlZ19zZWFyY2hfaW5pdCIsCiAgICAgICJtYl9lcmVnX3NlYXJjaF9nZXRyZWdzIiwgIm1iX2VyZWdfc2VhcmNoX2dldHBvcyIsICJtYl9lcmVnX3NlYXJjaF9zZXRwb3MiLAogICAgICAibWJyZWdleF9lbmNvZGluZyIsICJtYmVyZWciLCAibWJlcmVnaSIsICJtYmVyZWdfcmVwbGFjZSIsICJtYmVyZWdpX3JlcGxhY2UiLAogICAgICAibWJzcGxpdCIsICJtYmVyZWdfbWF0Y2giLCAibWJlcmVnX3NlYXJjaCIsICJtYmVyZWdfc2VhcmNoX3BvcyIsCiAgICAgICJtYmVyZWdfc2VhcmNoX3JlZ3MiLCAibWJlcmVnX3NlYXJjaF9pbml0IiwgIm1iZXJlZ19zZWFyY2hfZ2V0cmVncyIsCiAgICAgICJtYmVyZWdfc2VhcmNoX2dldHBvcyIsICJtYmVyZWdfc2VhcmNoX3NldHBvcyIsICJteXNxbF9jb25uZWN0IiwKICAgICAgIm15c3FsX3Bjb25uZWN0IiwgIm15c3FsX2Nsb3NlIiwgIm15c3FsX3NlbGVjdF9kYiIsICJteXNxbF9xdWVyeSIsCiAgICAgICJteXNxbF91bmJ1ZmZlcmVkX3F1ZXJ5IiwgIm15c3FsX2RiX3F1ZXJ5IiwgIm15c3FsX2xpc3RfZGJzIiwKICAgICAgIm15c3FsX2xpc3RfdGFibGVzIiwgIm15c3FsX2xpc3RfZmllbGRzIiwgIm15c3FsX2xpc3RfcHJvY2Vzc2VzIiwKICAgICAgIm15c3FsX2Vycm9yIiwgIm15c3FsX2Vycm5vIiwgIm15c3FsX2FmZmVjdGVkX3Jvd3MiLCAibXlzcWxfaW5zZXJ0X2lkIiwKICAgICAgIm15c3FsX3Jlc3VsdCIsICJteXNxbF9udW1fcm93cyIsICJteXNxbF9udW1fZmllbGRzIiwgIm15c3FsX2ZldGNoX3JvdyIsCiAgICAgICJteXNxbF9mZXRjaF9hcnJheSIsICJteXNxbF9mZXRjaF9hc3NvYyIsICJteXNxbF9mZXRjaF9vYmplY3QiLAogICAgICAibXlzcWxfZGF0YV9zZWVrIiwgIm15c3FsX2ZldGNoX2xlbmd0aHMiLCAibXlzcWxfZmV0Y2hfZmllbGQiLAogICAgICAibXlzcWxfZmllbGRfc2VlayIsICJteXNxbF9mcmVlX3Jlc3VsdCIsICJteXNxbF9maWVsZF9uYW1lIiwKICAgICAgIm15c3FsX2ZpZWxkX3RhYmxlIiwgIm15c3FsX2ZpZWxkX2xlbiIsICJteXNxbF9maWVsZF90eXBlIiwKICAgICAgIm15c3FsX2ZpZWxkX2ZsYWdzIiwgIm15c3FsX2VzY2FwZV9zdHJpbmciLCAibXlzcWxfcmVhbF9lc2NhcGVfc3RyaW5nIiwKICAgICAgIm15c3FsX3N0YXQiLCAibXlzcWxfdGhyZWFkX2lkIiwgIm15c3FsX2NsaWVudF9lbmNvZGluZyIsICJteXNxbF9waW5nIiwKICAgICAgIm15c3FsX2dldF9jbGllbnRfaW5mbyIsICJteXNxbF9nZXRfaG9zdF9pbmZvIiwgIm15c3FsX2dldF9wcm90b19pbmZvIiwKICAgICAgIm15c3FsX2dldF9zZXJ2ZXJfaW5mbyIsICJteXNxbF9pbmZvIiwgIm15c3FsX3NldF9jaGFyc2V0IiwgIm15c3FsIiwKICAgICAgIm15c3FsX2ZpZWxkbmFtZSIsICJteXNxbF9maWVsZHRhYmxlIiwgIm15c3FsX2ZpZWxkbGVuIiwgIm15c3FsX2ZpZWxkdHlwZSIsCiAgICAgICJteXNxbF9maWVsZGZsYWdzIiwgIm15c3FsX3NlbGVjdGRiIiwgIm15c3FsX2ZyZWVyZXN1bHQiLCAibXlzcWxfbnVtZmllbGRzIiwKICAgICAgIm15c3FsX251bXJvd3MiLCAibXlzcWxfbGlzdGRicyIsICJteXNxbF9saXN0dGFibGVzIiwgIm15c3FsX2xpc3RmaWVsZHMiLAogICAgICAibXlzcWxfZGJfbmFtZSIsICJteXNxbF9kYm5hbWUiLCAibXlzcWxfdGFibGVuYW1lIiwgIm15c3FsX3RhYmxlX25hbWUiLAogICAgICAibXlzcWxpX2FmZmVjdGVkX3Jvd3MiLCAibXlzcWxpX2F1dG9jb21taXQiLCAibXlzcWxpX2NoYW5nZV91c2VyIiwKICAgICAgIm15c3FsaV9jaGFyYWN0ZXJfc2V0X25hbWUiLCAibXlzcWxpX2Nsb3NlIiwgIm15c3FsaV9jb21taXQiLCAibXlzcWxpX2Nvbm5lY3QiLAogICAgICAibXlzcWxpX2Nvbm5lY3RfZXJybm8iLCAibXlzcWxpX2Nvbm5lY3RfZXJyb3IiLCAibXlzcWxpX2RhdGFfc2VlayIsCiAgICAgICJteXNxbGlfZGVidWciLCAibXlzcWxpX2Rpc2FibGVfcmVhZHNfZnJvbV9tYXN0ZXIiLCAibXlzcWxpX2Rpc2FibGVfcnBsX3BhcnNlIiwKICAgICAgIm15c3FsaV9kdW1wX2RlYnVnX2luZm8iLCAibXlzcWxpX2VuYWJsZV9yZWFkc19mcm9tX21hc3RlciIsCiAgICAgICJteXNxbGlfZW5hYmxlX3JwbF9wYXJzZSIsICJteXNxbGlfZW1iZWRkZWRfc2VydmVyX2VuZCIsCiAgICAgICJteXNxbGlfZW1iZWRkZWRfc2VydmVyX3N0YXJ0IiwgIm15c3FsaV9lcnJubyIsICJteXNxbGlfZXJyb3IiLAogICAgICAibXlzcWxpX3N0bXRfZXhlY3V0ZSIsICJteXNxbGlfZXhlY3V0ZSIsICJteXNxbGlfZmV0Y2hfZmllbGQiLAogICAgICAibXlzcWxpX2ZldGNoX2ZpZWxkcyIsICJteXNxbGlfZmV0Y2hfZmllbGRfZGlyZWN0IiwgIm15c3FsaV9mZXRjaF9sZW5ndGhzIiwKICAgICAgIm15c3FsaV9mZXRjaF9hcnJheSIsICJteXNxbGlfZmV0Y2hfYXNzb2MiLCAibXlzcWxpX2ZldGNoX29iamVjdCIsCiAgICAgICJteXNxbGlfZmV0Y2hfcm93IiwgIm15c3FsaV9maWVsZF9jb3VudCIsICJteXNxbGlfZmllbGRfc2VlayIsCiAgICAgICJteXNxbGlfZmllbGRfdGVsbCIsICJteXNxbGlfZnJlZV9yZXN1bHQiLCAibXlzcWxpX2dldF9jaGFyc2V0IiwKICAgICAgIm15c3FsaV9nZXRfY2xpZW50X2luZm8iLCAibXlzcWxpX2dldF9jbGllbnRfdmVyc2lvbiIsICJteXNxbGlfZ2V0X2hvc3RfaW5mbyIsCiAgICAgICJteXNxbGlfZ2V0X3Byb3RvX2luZm8iLCAibXlzcWxpX2dldF9zZXJ2ZXJfaW5mbyIsICJteXNxbGlfZ2V0X3NlcnZlcl92ZXJzaW9uIiwKICAgICAgIm15c3FsaV9nZXRfd2FybmluZ3MiLCAibXlzcWxpX2luaXQiLCAibXlzcWxpX2luZm8iLCAibXlzcWxpX2luc2VydF9pZCIsCiAgICAgICJteXNxbGlfa2lsbCIsICJteXNxbGlfc2V0X2xvY2FsX2luZmlsZV9kZWZhdWx0IiwKICAgICAgIm15c3FsaV9zZXRfbG9jYWxfaW5maWxlX2hhbmRsZXIiLCAibXlzcWxpX21hc3Rlcl9xdWVyeSIsCiAgICAgICJteXNxbGlfbW9yZV9yZXN1bHRzIiwgIm15c3FsaV9tdWx0aV9xdWVyeSIsICJteXNxbGlfbmV4dF9yZXN1bHQiLAogICAgICAibXlzcWxpX251bV9maWVsZHMiLCAibXlzcWxpX251bV9yb3dzIiwgIm15c3FsaV9vcHRpb25zIiwgIm15c3FsaV9waW5nIiwKICAgICAgIm15c3FsaV9wcmVwYXJlIiwgIm15c3FsaV9yZXBvcnQiLCAibXlzcWxpX3F1ZXJ5IiwgIm15c3FsaV9yZWFsX2Nvbm5lY3QiLAogICAgICAibXlzcWxpX3JlYWxfZXNjYXBlX3N0cmluZyIsICJteXNxbGlfcmVhbF9xdWVyeSIsICJteXNxbGlfcm9sbGJhY2siLAogICAgICAibXlzcWxpX3JwbF9wYXJzZV9lbmFibGVkIiwgIm15c3FsaV9ycGxfcHJvYmUiLCAibXlzcWxpX3JwbF9xdWVyeV90eXBlIiwKICAgICAgIm15c3FsaV9zZWxlY3RfZGIiLCAibXlzcWxpX3NldF9jaGFyc2V0IiwgIm15c3FsaV9zdG10X2F0dHJfZ2V0IiwKICAgICAgIm15c3FsaV9zdG10X2F0dHJfc2V0IiwgIm15c3FsaV9zdG10X2ZpZWxkX2NvdW50IiwgIm15c3FsaV9zdG10X2luaXQiLAogICAgICAibXlzcWxpX3N0bXRfcHJlcGFyZSIsICJteXNxbGlfc3RtdF9yZXN1bHRfbWV0YWRhdGEiLAogICAgICAibXlzcWxpX3N0bXRfc2VuZF9sb25nX2RhdGEiLCAibXlzcWxpX3N0bXRfYmluZF9wYXJhbSIsCiAgICAgICJteXNxbGlfc3RtdF9iaW5kX3Jlc3VsdCIsICJteXNxbGlfc3RtdF9mZXRjaCIsICJteXNxbGlfc3RtdF9mcmVlX3Jlc3VsdCIsCiAgICAgICJteXNxbGlfc3RtdF9nZXRfd2FybmluZ3MiLCAibXlzcWxpX3N0bXRfaW5zZXJ0X2lkIiwgIm15c3FsaV9zdG10X3Jlc2V0IiwKICAgICAgIm15c3FsaV9zdG10X3BhcmFtX2NvdW50IiwgIm15c3FsaV9zZW5kX3F1ZXJ5IiwgIm15c3FsaV9zbGF2ZV9xdWVyeSIsCiAgICAgICJteXNxbGlfc3Fsc3RhdGUiLCAibXlzcWxpX3NzbF9zZXQiLCAibXlzcWxpX3N0YXQiLAogICAgICAibXlzcWxpX3N0bXRfYWZmZWN0ZWRfcm93cyIsICJteXNxbGlfc3RtdF9jbG9zZSIsICJteXNxbGlfc3RtdF9kYXRhX3NlZWsiLAogICAgICAibXlzcWxpX3N0bXRfZXJybm8iLCAibXlzcWxpX3N0bXRfZXJyb3IiLCAibXlzcWxpX3N0bXRfbnVtX3Jvd3MiLAogICAgICAibXlzcWxpX3N0bXRfc3Fsc3RhdGUiLCAibXlzcWxpX3N0b3JlX3Jlc3VsdCIsICJteXNxbGlfc3RtdF9zdG9yZV9yZXN1bHQiLAogICAgICAibXlzcWxpX3RocmVhZF9pZCIsICJteXNxbGlfdGhyZWFkX3NhZmUiLCAibXlzcWxpX3VzZV9yZXN1bHQiLAogICAgICAibXlzcWxpX3dhcm5pbmdfY291bnQiLCAibXlzcWxpX2JpbmRfcGFyYW0iLCAibXlzcWxpX2JpbmRfcmVzdWx0IiwKICAgICAgIm15c3FsaV9jbGllbnRfZW5jb2RpbmciLCAibXlzcWxpX2VzY2FwZV9zdHJpbmciLCAibXlzcWxpX2ZldGNoIiwKICAgICAgIm15c3FsaV9wYXJhbV9jb3VudCIsICJteXNxbGlfZ2V0X21ldGFkYXRhIiwgIm15c3FsaV9zZW5kX2xvbmdfZGF0YSIsCiAgICAgICJteXNxbGlfc2V0X29wdCIsICJwZG9fZHJpdmVycyIsICJzb2NrZXRfc2VsZWN0IiwgInNvY2tldF9jcmVhdGUiLAogICAgICAic29ja2V0X2NyZWF0ZV9saXN0ZW4iLCAic29ja2V0X2FjY2VwdCIsICJzb2NrZXRfc2V0X25vbmJsb2NrIiwKICAgICAgInNvY2tldF9zZXRfYmxvY2siLCAic29ja2V0X2xpc3RlbiIsICJzb2NrZXRfY2xvc2UiLCAic29ja2V0X3dyaXRlIiwKICAgICAgInNvY2tldF9yZWFkIiwgInNvY2tldF9nZXRzb2NrbmFtZSIsICJzb2NrZXRfZ2V0cGVlcm5hbWUiLCAic29ja2V0X2Nvbm5lY3QiLAogICAgICAic29ja2V0X3N0cmVycm9yIiwgInNvY2tldF9iaW5kIiwgInNvY2tldF9yZWN2IiwgInNvY2tldF9zZW5kIiwKICAgICAgInNvY2tldF9yZWN2ZnJvbSIsICJzb2NrZXRfc2VuZHRvIiwgInNvY2tldF9nZXRfb3B0aW9uIiwgInNvY2tldF9zZXRfb3B0aW9uIiwKICAgICAgInNvY2tldF9zaHV0ZG93biIsICJzb2NrZXRfbGFzdF9lcnJvciIsICJzb2NrZXRfY2xlYXJfZXJyb3IiLCAic29ja2V0X2dldG9wdCIsCiAgICAgICJzb2NrZXRfc2V0b3B0IiwgImVhY2NlbGVyYXRvcl9wdXQiLCAiZWFjY2VsZXJhdG9yX2dldCIsICJlYWNjZWxlcmF0b3Jfcm0iLAogICAgICAiZWFjY2VsZXJhdG9yX2djIiwgImVhY2NlbGVyYXRvcl9sb2NrIiwgImVhY2NlbGVyYXRvcl91bmxvY2siLAogICAgICAiZWFjY2VsZXJhdG9yX2NhY2hpbmciLCAiZWFjY2VsZXJhdG9yX29wdGltaXplciIsICJlYWNjZWxlcmF0b3JfY2xlYXIiLAogICAgICAiZWFjY2VsZXJhdG9yX2NsZWFuIiwgImVhY2NlbGVyYXRvcl9pbmZvIiwgImVhY2NlbGVyYXRvcl9wdXJnZSIsCiAgICAgICJlYWNjZWxlcmF0b3JfY2FjaGVkX3NjcmlwdHMiLCAiZWFjY2VsZXJhdG9yX3JlbW92ZWRfc2NyaXB0cyIsCiAgICAgICJlYWNjZWxlcmF0b3JfbGlzdF9rZXlzIiwgImVhY2NlbGVyYXRvcl9lbmNvZGUiLCAiZWFjY2VsZXJhdG9yX2xvYWQiLAogICAgICAiX2VhY2NlbGVyYXRvcl9sb2FkZXJfZmlsZSIsICJfZWFjY2VsZXJhdG9yX2xvYWRlcl9saW5lIiwKICAgICAgImVhY2NlbGVyYXRvcl9zZXRfc2Vzc2lvbl9oYW5kbGVycyIsICJfZWFjY2VsZXJhdG9yX291dHB1dF9oYW5kbGVyIiwKICAgICAgImVhY2NlbGVyYXRvcl9jYWNoZV9wYWdlIiwgImVhY2NlbGVyYXRvcl9ybV9wYWdlIiwgImVhY2NlbGVyYXRvcl9jYWNoZV9vdXRwdXQiLAogICAgICAiZWFjY2VsZXJhdG9yX2NhY2hlX3Jlc3VsdCIsICJ4ZGVidWdfZ2V0X3N0YWNrX2RlcHRoIiwKICAgICAgInhkZWJ1Z19nZXRfZnVuY3Rpb25fc3RhY2siLCAieGRlYnVnX3ByaW50X2Z1bmN0aW9uX3N0YWNrIiwKICAgICAgInhkZWJ1Z19nZXRfZGVjbGFyZWRfdmFycyIsICJ4ZGVidWdfY2FsbF9jbGFzcyIsICJ4ZGVidWdfY2FsbF9mdW5jdGlvbiIsCiAgICAgICJ4ZGVidWdfY2FsbF9maWxlIiwgInhkZWJ1Z19jYWxsX2xpbmUiLCAieGRlYnVnX3Zhcl9kdW1wIiwgInhkZWJ1Z19kZWJ1Z196dmFsIiwKICAgICAgInhkZWJ1Z19kZWJ1Z196dmFsX3N0ZG91dCIsICJ4ZGVidWdfZW5hYmxlIiwgInhkZWJ1Z19kaXNhYmxlIiwKICAgICAgInhkZWJ1Z19pc19lbmFibGVkIiwgInhkZWJ1Z19icmVhayIsICJ4ZGVidWdfc3RhcnRfdHJhY2UiLCAieGRlYnVnX3N0b3BfdHJhY2UiLAogICAgICAieGRlYnVnX2dldF90cmFjZWZpbGVfbmFtZSIsICJ4ZGVidWdfZ2V0X3Byb2ZpbGVyX2ZpbGVuYW1lIiwKICAgICAgInhkZWJ1Z19kdW1wX2FnZ3JfcHJvZmlsaW5nX2RhdGEiLCAieGRlYnVnX2NsZWFyX2FnZ3JfcHJvZmlsaW5nX2RhdGEiLAogICAgICAieGRlYnVnX21lbW9yeV91c2FnZSIsICJ4ZGVidWdfcGVha19tZW1vcnlfdXNhZ2UiLCAieGRlYnVnX3RpbWVfaW5kZXgiLAogICAgICAieGRlYnVnX3N0YXJ0X2Vycm9yX2NvbGxlY3Rpb24iLCAieGRlYnVnX3N0b3BfZXJyb3JfY29sbGVjdGlvbiIsCiAgICAgICJ4ZGVidWdfZ2V0X2NvbGxlY3RlZF9lcnJvcnMiLCAieGRlYnVnX3N0YXJ0X2NvZGVfY292ZXJhZ2UiLAogICAgICAieGRlYnVnX3N0b3BfY29kZV9jb3ZlcmFnZSIsICJ4ZGVidWdfZ2V0X2NvZGVfY292ZXJhZ2UiLAogICAgICAieGRlYnVnX2dldF9mdW5jdGlvbl9jb3VudCIsICJ4ZGVidWdfZHVtcF9zdXBlcmdsb2JhbHMiLAogICAgICAiXyIgLy8gYWxpYXMgZm9yIGdldHRleHQoKQogICAgXS5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQsIGluZGV4LCBhcnJheSkgewogICAgICByZXN1bHRbZWxlbWVudF0gPSB0b2tlbigidF9zdHJpbmciLCAicGhwLXByZWRlZmluZWQtZnVuY3Rpb24iKTsKICAgIH0pOwoKICAgIC8vIG91dHB1dCBvZiBnZXRfZGVmaW5lZF9jb25zdGFudHMoKS4gRGlmZmVycyBzaWduaWZpY2FudGx5IGZyb20gaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL3Jlc2VydmVkLmNvbnN0YW50cy5waHAKICAgIFsgIkVfRVJST1IiLCAiRV9SRUNPVkVSQUJMRV9FUlJPUiIsICJFX1dBUk5JTkciLCAiRV9QQVJTRSIsICJFX05PVElDRSIsCiAgICAgICJFX1NUUklDVCIsICJFX0NPUkVfRVJST1IiLCAiRV9DT1JFX1dBUk5JTkciLCAiRV9DT01QSUxFX0VSUk9SIiwKICAgICAgIkVfQ09NUElMRV9XQVJOSU5HIiwgIkVfVVNFUl9FUlJPUiIsICJFX1VTRVJfV0FSTklORyIsICJFX1VTRVJfTk9USUNFIiwKICAgICAgIkVfQUxMIiwgIlRSVUUiLCAiRkFMU0UiLCAiTlVMTCIsICJaRU5EX1RIUkVBRF9TQUZFIiwgIlBIUF9WRVJTSU9OIiwgIlBIUF9PUyIsCiAgICAgICJQSFBfU0FQSSIsICJERUZBVUxUX0lOQ0xVREVfUEFUSCIsICJQRUFSX0lOU1RBTExfRElSIiwgIlBFQVJfRVhURU5TSU9OX0RJUiIsCiAgICAgICJQSFBfRVhURU5TSU9OX0RJUiIsICJQSFBfUFJFRklYIiwgIlBIUF9CSU5ESVIiLCAiUEhQX0xJQkRJUiIsICJQSFBfREFUQURJUiIsCiAgICAgICJQSFBfU1lTQ09ORkRJUiIsICJQSFBfTE9DQUxTVEFURURJUiIsICJQSFBfQ09ORklHX0ZJTEVfUEFUSCIsCiAgICAgICJQSFBfQ09ORklHX0ZJTEVfU0NBTl9ESVIiLCAiUEhQX1NITElCX1NVRkZJWCIsICJQSFBfRU9MIiwgIlBIUF9FT0wiLAogICAgICAiUEhQX0lOVF9NQVgiLCAiUEhQX0lOVF9TSVpFIiwgIlBIUF9PVVRQVVRfSEFORExFUl9TVEFSVCIsCiAgICAgICJQSFBfT1VUUFVUX0hBTkRMRVJfQ09OVCIsICJQSFBfT1VUUFVUX0hBTkRMRVJfRU5EIiwgIlVQTE9BRF9FUlJfT0siLAogICAgICAiVVBMT0FEX0VSUl9JTklfU0laRSIsICJVUExPQURfRVJSX0ZPUk1fU0laRSIsICJVUExPQURfRVJSX1BBUlRJQUwiLAogICAgICAiVVBMT0FEX0VSUl9OT19GSUxFIiwgIlVQTE9BRF9FUlJfTk9fVE1QX0RJUiIsICJVUExPQURfRVJSX0NBTlRfV1JJVEUiLAogICAgICAiVVBMT0FEX0VSUl9FWFRFTlNJT04iLCAiQ0FMX0dSRUdPUklBTiIsICJDQUxfSlVMSUFOIiwgIkNBTF9KRVdJU0giLAogICAgICAiQ0FMX0ZSRU5DSCIsICJDQUxfTlVNX0NBTFMiLCAiQ0FMX0RPV19EQVlOTyIsICJDQUxfRE9XX1NIT1JUIiwgIkNBTF9ET1dfTE9ORyIsCiAgICAgICJDQUxfTU9OVEhfR1JFR09SSUFOX1NIT1JUIiwgIkNBTF9NT05USF9HUkVHT1JJQU5fTE9ORyIsCiAgICAgICJDQUxfTU9OVEhfSlVMSUFOX1NIT1JUIiwgIkNBTF9NT05USF9KVUxJQU5fTE9ORyIsICJDQUxfTU9OVEhfSkVXSVNIIiwKICAgICAgIkNBTF9NT05USF9GUkVOQ0giLCAiQ0FMX0VBU1RFUl9ERUZBVUxUIiwgIkNBTF9FQVNURVJfUk9NQU4iLAogICAgICAiQ0FMX0VBU1RFUl9BTFdBWVNfR1JFR09SSUFOIiwgIkNBTF9FQVNURVJfQUxXQVlTX0pVTElBTiIsCiAgICAgICJDQUxfSkVXSVNIX0FERF9BTEFGSU1fR0VSRVNIIiwgIkNBTF9KRVdJU0hfQUREX0FMQUZJTSIsCiAgICAgICJDQUxfSkVXSVNIX0FERF9HRVJFU0hBWUlNIiwgIkNMU0NUWF9JTlBST0NfU0VSVkVSIiwgIkNMU0NUWF9JTlBST0NfSEFORExFUiIsCiAgICAgICJDTFNDVFhfTE9DQUxfU0VSVkVSIiwgIkNMU0NUWF9SRU1PVEVfU0VSVkVSIiwgIkNMU0NUWF9TRVJWRVIiLCAiQ0xTQ1RYX0FMTCIsCiAgICAgICJWVF9OVUxMIiwgIlZUX0VNUFRZIiwgIlZUX1VJMSIsICJWVF9JMSIsICJWVF9VSTIiLCAiVlRfSTIiLCAiVlRfVUk0IiwgIlZUX0k0IiwKICAgICAgIlZUX1I0IiwgIlZUX1I4IiwgIlZUX0JPT0wiLCAiVlRfRVJST1IiLCAiVlRfQ1kiLCAiVlRfREFURSIsICJWVF9CU1RSIiwKICAgICAgIlZUX0RFQ0lNQUwiLCAiVlRfVU5LTk9XTiIsICJWVF9ESVNQQVRDSCIsICJWVF9WQVJJQU5UIiwgIlZUX0lOVCIsICJWVF9VSU5UIiwKICAgICAgIlZUX0FSUkFZIiwgIlZUX0JZUkVGIiwgIkNQX0FDUCIsICJDUF9NQUNDUCIsICJDUF9PRU1DUCIsICJDUF9VVEY3IiwgIkNQX1VURjgiLAogICAgICAiQ1BfU1lNQk9MIiwgIkNQX1RIUkVBRF9BQ1AiLCAiVkFSQ01QX0xUIiwgIlZBUkNNUF9FUSIsICJWQVJDTVBfR1QiLAogICAgICAiVkFSQ01QX05VTEwiLCAiTk9STV9JR05PUkVDQVNFIiwgIk5PUk1fSUdOT1JFTk9OU1BBQ0UiLCAiTk9STV9JR05PUkVTWU1CT0xTIiwKICAgICAgIk5PUk1fSUdOT1JFV0lEVEgiLCAiTk9STV9JR05PUkVLQU5BVFlQRSIsICJESVNQX0VfRElWQllaRVJPIiwKICAgICAgIkRJU1BfRV9PVkVSRkxPVyIsICJESVNQX0VfQkFESU5ERVgiLCAiTUtfRV9VTkFWQUlMQUJMRSIsICJJTlBVVF9QT1NUIiwKICAgICAgIklOUFVUX0dFVCIsICJJTlBVVF9DT09LSUUiLCAiSU5QVVRfRU5WIiwgIklOUFVUX1NFUlZFUiIsICJJTlBVVF9TRVNTSU9OIiwKICAgICAgIklOUFVUX1JFUVVFU1QiLCAiRklMVEVSX0ZMQUdfTk9ORSIsICJGSUxURVJfUkVRVUlSRV9TQ0FMQVIiLAogICAgICAiRklMVEVSX1JFUVVJUkVfQVJSQVkiLCAiRklMVEVSX0ZPUkNFX0FSUkFZIiwgIkZJTFRFUl9OVUxMX09OX0ZBSUxVUkUiLAogICAgICAiRklMVEVSX1ZBTElEQVRFX0lOVCIsICJGSUxURVJfVkFMSURBVEVfQk9PTEVBTiIsICJGSUxURVJfVkFMSURBVEVfRkxPQVQiLAogICAgICAiRklMVEVSX1ZBTElEQVRFX1JFR0VYUCIsICJGSUxURVJfVkFMSURBVEVfVVJMIiwgIkZJTFRFUl9WQUxJREFURV9FTUFJTCIsCiAgICAgICJGSUxURVJfVkFMSURBVEVfSVAiLCAiRklMVEVSX0RFRkFVTFQiLCAiRklMVEVSX1VOU0FGRV9SQVciLAogICAgICAiRklMVEVSX1NBTklUSVpFX1NUUklORyIsICJGSUxURVJfU0FOSVRJWkVfU1RSSVBQRUQiLAogICAgICAiRklMVEVSX1NBTklUSVpFX0VOQ09ERUQiLCAiRklMVEVSX1NBTklUSVpFX1NQRUNJQUxfQ0hBUlMiLAogICAgICAiRklMVEVSX1NBTklUSVpFX0VNQUlMIiwgIkZJTFRFUl9TQU5JVElaRV9VUkwiLCAiRklMVEVSX1NBTklUSVpFX05VTUJFUl9JTlQiLAogICAgICAiRklMVEVSX1NBTklUSVpFX05VTUJFUl9GTE9BVCIsICJGSUxURVJfU0FOSVRJWkVfTUFHSUNfUVVPVEVTIiwKICAgICAgIkZJTFRFUl9DQUxMQkFDSyIsICJGSUxURVJfRkxBR19BTExPV19PQ1RBTCIsICJGSUxURVJfRkxBR19BTExPV19IRVgiLAogICAgICAiRklMVEVSX0ZMQUdfU1RSSVBfTE9XIiwgIkZJTFRFUl9GTEFHX1NUUklQX0hJR0giLCAiRklMVEVSX0ZMQUdfRU5DT0RFX0xPVyIsCiAgICAgICJGSUxURVJfRkxBR19FTkNPREVfSElHSCIsICJGSUxURVJfRkxBR19FTkNPREVfQU1QIiwKICAgICAgIkZJTFRFUl9GTEFHX05PX0VOQ09ERV9RVU9URVMiLCAiRklMVEVSX0ZMQUdfRU1QVFlfU1RSSU5HX05VTEwiLAogICAgICAiRklMVEVSX0ZMQUdfQUxMT1dfRlJBQ1RJT04iLCAiRklMVEVSX0ZMQUdfQUxMT1dfVEhPVVNBTkQiLAogICAgICAiRklMVEVSX0ZMQUdfQUxMT1dfU0NJRU5USUZJQyIsICJGSUxURVJfRkxBR19TQ0hFTUVfUkVRVUlSRUQiLAogICAgICAiRklMVEVSX0ZMQUdfSE9TVF9SRVFVSVJFRCIsICJGSUxURVJfRkxBR19QQVRIX1JFUVVJUkVEIiwKICAgICAgIkZJTFRFUl9GTEFHX1FVRVJZX1JFUVVJUkVEIiwgIkZJTFRFUl9GTEFHX0lQVjQiLCAiRklMVEVSX0ZMQUdfSVBWNiIsCiAgICAgICJGSUxURVJfRkxBR19OT19SRVNfUkFOR0UiLCAiRklMVEVSX0ZMQUdfTk9fUFJJVl9SQU5HRSIsICJGVFBfQVNDSUkiLAogICAgICAiRlRQX1RFWFQiLCAiRlRQX0JJTkFSWSIsICJGVFBfSU1BR0UiLCAiRlRQX0FVVE9SRVNVTUUiLCAiRlRQX1RJTUVPVVRfU0VDIiwKICAgICAgIkZUUF9BVVRPU0VFSyIsICJGVFBfRkFJTEVEIiwgIkZUUF9GSU5JU0hFRCIsICJGVFBfTU9SRURBVEEiLCAiSEFTSF9ITUFDIiwKICAgICAgIklDT05WX0lNUEwiLCAiSUNPTlZfVkVSU0lPTiIsICJJQ09OVl9NSU1FX0RFQ09ERV9TVFJJQ1QiLAogICAgICAiSUNPTlZfTUlNRV9ERUNPREVfQ09OVElOVUVfT05fRVJST1IiLCAiT0RCQ19UWVBFIiwgIk9EQkNfQklOTU9ERV9QQVNTVEhSVSIsCiAgICAgICJPREJDX0JJTk1PREVfUkVUVVJOIiwgIk9EQkNfQklOTU9ERV9DT05WRVJUIiwgIlNRTF9PREJDX0NVUlNPUlMiLAogICAgICAiU1FMX0NVUl9VU0VfRFJJVkVSIiwgIlNRTF9DVVJfVVNFX0lGX05FRURFRCIsICJTUUxfQ1VSX1VTRV9PREJDIiwKICAgICAgIlNRTF9DT05DVVJSRU5DWSIsICJTUUxfQ09OQ1VSX1JFQURfT05MWSIsICJTUUxfQ09OQ1VSX0xPQ0siLAogICAgICAiU1FMX0NPTkNVUl9ST1dWRVIiLCAiU1FMX0NPTkNVUl9WQUxVRVMiLCAiU1FMX0NVUlNPUl9UWVBFIiwKICAgICAgIlNRTF9DVVJTT1JfRk9SV0FSRF9PTkxZIiwgIlNRTF9DVVJTT1JfS0VZU0VUX0RSSVZFTiIsICJTUUxfQ1VSU09SX0RZTkFNSUMiLAogICAgICAiU1FMX0NVUlNPUl9TVEFUSUMiLCAiU1FMX0tFWVNFVF9TSVpFIiwgIlNRTF9GRVRDSF9GSVJTVCIsICJTUUxfRkVUQ0hfTkVYVCIsCiAgICAgICJTUUxfQ0hBUiIsICJTUUxfVkFSQ0hBUiIsICJTUUxfTE9OR1ZBUkNIQVIiLCAiU1FMX0RFQ0lNQUwiLCAiU1FMX05VTUVSSUMiLAogICAgICAiU1FMX0JJVCIsICJTUUxfVElOWUlOVCIsICJTUUxfU01BTExJTlQiLCAiU1FMX0lOVEVHRVIiLCAiU1FMX0JJR0lOVCIsCiAgICAgICJTUUxfUkVBTCIsICJTUUxfRkxPQVQiLCAiU1FMX0RPVUJMRSIsICJTUUxfQklOQVJZIiwgIlNRTF9WQVJCSU5BUlkiLAogICAgICAiU1FMX0xPTkdWQVJCSU5BUlkiLCAiU1FMX0RBVEUiLCAiU1FMX1RJTUUiLCAiU1FMX1RJTUVTVEFNUCIsCiAgICAgICJQUkVHX1BBVFRFUk5fT1JERVIiLCAiUFJFR19TRVRfT1JERVIiLCAiUFJFR19PRkZTRVRfQ0FQVFVSRSIsCiAgICAgICJQUkVHX1NQTElUX05PX0VNUFRZIiwgIlBSRUdfU1BMSVRfREVMSU1fQ0FQVFVSRSIsICJQUkVHX1NQTElUX09GRlNFVF9DQVBUVVJFIiwKICAgICAgIlBSRUdfR1JFUF9JTlZFUlQiLCAiUFJFR19OT19FUlJPUiIsICJQUkVHX0lOVEVSTkFMX0VSUk9SIiwKICAgICAgIlBSRUdfQkFDS1RSQUNLX0xJTUlUX0VSUk9SIiwgIlBSRUdfUkVDVVJTSU9OX0xJTUlUX0VSUk9SIiwKICAgICAgIlBSRUdfQkFEX1VURjhfRVJST1IiLCAiREFURV9BVE9NIiwgIkRBVEVfQ09PS0lFIiwgIkRBVEVfSVNPODYwMSIsCiAgICAgICJEQVRFX1JGQzgyMiIsICJEQVRFX1JGQzg1MCIsICJEQVRFX1JGQzEwMzYiLCAiREFURV9SRkMxMTIzIiwgIkRBVEVfUkZDMjgyMiIsCiAgICAgICJEQVRFX1JGQzMzMzkiLCAiREFURV9SU1MiLCAiREFURV9XM0MiLCAiU1VORlVOQ1NfUkVUX1RJTUVTVEFNUCIsCiAgICAgICJTVU5GVU5DU19SRVRfU1RSSU5HIiwgIlNVTkZVTkNTX1JFVF9ET1VCTEUiLCAiTElCWE1MX1ZFUlNJT04iLAogICAgICAiTElCWE1MX0RPVFRFRF9WRVJTSU9OIiwgIkxJQlhNTF9OT0VOVCIsICJMSUJYTUxfRFRETE9BRCIsICJMSUJYTUxfRFREQVRUUiIsCiAgICAgICJMSUJYTUxfRFREVkFMSUQiLCAiTElCWE1MX05PRVJST1IiLCAiTElCWE1MX05PV0FSTklORyIsICJMSUJYTUxfTk9CTEFOS1MiLAogICAgICAiTElCWE1MX1hJTkNMVURFIiwgIkxJQlhNTF9OU0NMRUFOIiwgIkxJQlhNTF9OT0NEQVRBIiwgIkxJQlhNTF9OT05FVCIsCiAgICAgICJMSUJYTUxfQ09NUEFDVCIsICJMSUJYTUxfTk9YTUxERUNMIiwgIkxJQlhNTF9OT0VNUFRZVEFHIiwgIkxJQlhNTF9FUlJfTk9ORSIsCiAgICAgICJMSUJYTUxfRVJSX1dBUk5JTkciLCAiTElCWE1MX0VSUl9FUlJPUiIsICJMSUJYTUxfRVJSX0ZBVEFMIiwKICAgICAgIkNPTk5FQ1RJT05fQUJPUlRFRCIsICJDT05ORUNUSU9OX05PUk1BTCIsICJDT05ORUNUSU9OX1RJTUVPVVQiLCAiSU5JX1VTRVIiLAogICAgICAiSU5JX1BFUkRJUiIsICJJTklfU1lTVEVNIiwgIklOSV9BTEwiLCAiUEhQX1VSTF9TQ0hFTUUiLCAiUEhQX1VSTF9IT1NUIiwKICAgICAgIlBIUF9VUkxfUE9SVCIsICJQSFBfVVJMX1VTRVIiLCAiUEhQX1VSTF9QQVNTIiwgIlBIUF9VUkxfUEFUSCIsCiAgICAgICJQSFBfVVJMX1FVRVJZIiwgIlBIUF9VUkxfRlJBR01FTlQiLCAiTV9FIiwgIk1fTE9HMkUiLCAiTV9MT0cxMEUiLCAiTV9MTjIiLAogICAgICAiTV9MTjEwIiwgIk1fUEkiLCAiTV9QSV8yIiwgIk1fUElfNCIsICJNXzFfUEkiLCAiTV8yX1BJIiwgIk1fU1FSVFBJIiwKICAgICAgIk1fMl9TUVJUUEkiLCAiTV9MTlBJIiwgIk1fRVVMRVIiLCAiTV9TUVJUMiIsICJNX1NRUlQxXzIiLCAiTV9TUVJUMyIsICJJTkYiLAogICAgICAiTkFOIiwgIklORk9fR0VORVJBTCIsICJJTkZPX0NSRURJVFMiLCAiSU5GT19DT05GSUdVUkFUSU9OIiwgIklORk9fTU9EVUxFUyIsCiAgICAgICJJTkZPX0VOVklST05NRU5UIiwgIklORk9fVkFSSUFCTEVTIiwgIklORk9fTElDRU5TRSIsICJJTkZPX0FMTCIsCiAgICAgICJDUkVESVRTX0dST1VQIiwgIkNSRURJVFNfR0VORVJBTCIsICJDUkVESVRTX1NBUEkiLCAiQ1JFRElUU19NT0RVTEVTIiwKICAgICAgIkNSRURJVFNfRE9DUyIsICJDUkVESVRTX0ZVTExQQUdFIiwgIkNSRURJVFNfUUEiLCAiQ1JFRElUU19BTEwiLAogICAgICAiSFRNTF9TUEVDSUFMQ0hBUlMiLCAiSFRNTF9FTlRJVElFUyIsICJFTlRfQ09NUEFUIiwgIkVOVF9RVU9URVMiLAogICAgICAiRU5UX05PUVVPVEVTIiwgIlNUUl9QQURfTEVGVCIsICJTVFJfUEFEX1JJR0hUIiwgIlNUUl9QQURfQk9USCIsCiAgICAgICJQQVRISU5GT19ESVJOQU1FIiwgIlBBVEhJTkZPX0JBU0VOQU1FIiwgIlBBVEhJTkZPX0VYVEVOU0lPTiIsCiAgICAgICJQQVRISU5GT19GSUxFTkFNRSIsICJDSEFSX01BWCIsICJMQ19DVFlQRSIsICJMQ19OVU1FUklDIiwgIkxDX1RJTUUiLAogICAgICAiTENfQ09MTEFURSIsICJMQ19NT05FVEFSWSIsICJMQ19BTEwiLCAiU0VFS19TRVQiLCAiU0VFS19DVVIiLCAiU0VFS19FTkQiLAogICAgICAiTE9DS19TSCIsICJMT0NLX0VYIiwgIkxPQ0tfVU4iLCAiTE9DS19OQiIsICJTVFJFQU1fTk9USUZZX0NPTk5FQ1QiLAogICAgICAiU1RSRUFNX05PVElGWV9BVVRIX1JFUVVJUkVEIiwgIlNUUkVBTV9OT1RJRllfQVVUSF9SRVNVTFQiLAogICAgICAiU1RSRUFNX05PVElGWV9NSU1FX1RZUEVfSVMiLCAiU1RSRUFNX05PVElGWV9GSUxFX1NJWkVfSVMiLAogICAgICAiU1RSRUFNX05PVElGWV9SRURJUkVDVEVEIiwgIlNUUkVBTV9OT1RJRllfUFJPR1JFU1MiLCAiU1RSRUFNX05PVElGWV9GQUlMVVJFIiwKICAgICAgIlNUUkVBTV9OT1RJRllfQ09NUExFVEVEIiwgIlNUUkVBTV9OT1RJRllfUkVTT0xWRSIsCiAgICAgICJTVFJFQU1fTk9USUZZX1NFVkVSSVRZX0lORk8iLCAiU1RSRUFNX05PVElGWV9TRVZFUklUWV9XQVJOIiwKICAgICAgIlNUUkVBTV9OT1RJRllfU0VWRVJJVFlfRVJSIiwgIlNUUkVBTV9GSUxURVJfUkVBRCIsICJTVFJFQU1fRklMVEVSX1dSSVRFIiwKICAgICAgIlNUUkVBTV9GSUxURVJfQUxMIiwgIlNUUkVBTV9DTElFTlRfUEVSU0lTVEVOVCIsICJTVFJFQU1fQ0xJRU5UX0FTWU5DX0NPTk5FQ1QiLAogICAgICAiU1RSRUFNX0NMSUVOVF9DT05ORUNUIiwgIlNUUkVBTV9DUllQVE9fTUVUSE9EX1NTTHYyX0NMSUVOVCIsCiAgICAgICJTVFJFQU1fQ1JZUFRPX01FVEhPRF9TU0x2M19DTElFTlQiLCAiU1RSRUFNX0NSWVBUT19NRVRIT0RfU1NMdjIzX0NMSUVOVCIsCiAgICAgICJTVFJFQU1fQ1JZUFRPX01FVEhPRF9UTFNfQ0xJRU5UIiwgIlNUUkVBTV9DUllQVE9fTUVUSE9EX1NTTHYyX1NFUlZFUiIsCiAgICAgICJTVFJFQU1fQ1JZUFRPX01FVEhPRF9TU0x2M19TRVJWRVIiLCAiU1RSRUFNX0NSWVBUT19NRVRIT0RfU1NMdjIzX1NFUlZFUiIsCiAgICAgICJTVFJFQU1fQ1JZUFRPX01FVEhPRF9UTFNfU0VSVkVSIiwgIlNUUkVBTV9TSFVUX1JEIiwgIlNUUkVBTV9TSFVUX1dSIiwKICAgICAgIlNUUkVBTV9TSFVUX1JEV1IiLCAiU1RSRUFNX1BGX0lORVQiLCAiU1RSRUFNX1BGX0lORVQ2IiwgIlNUUkVBTV9QRl9VTklYIiwKICAgICAgIlNUUkVBTV9JUFBST1RPX0lQIiwgIlNUUkVBTV9JUFBST1RPX1RDUCIsICJTVFJFQU1fSVBQUk9UT19VRFAiLAogICAgICAiU1RSRUFNX0lQUFJPVE9fSUNNUCIsICJTVFJFQU1fSVBQUk9UT19SQVciLCAiU1RSRUFNX1NPQ0tfU1RSRUFNIiwKICAgICAgIlNUUkVBTV9TT0NLX0RHUkFNIiwgIlNUUkVBTV9TT0NLX1JBVyIsICJTVFJFQU1fU09DS19TRVFQQUNLRVQiLAogICAgICAiU1RSRUFNX1NPQ0tfUkRNIiwgIlNUUkVBTV9QRUVLIiwgIlNUUkVBTV9PT0IiLCAiU1RSRUFNX1NFUlZFUl9CSU5EIiwKICAgICAgIlNUUkVBTV9TRVJWRVJfTElTVEVOIiwgIkZJTEVfVVNFX0lOQ0xVREVfUEFUSCIsICJGSUxFX0lHTk9SRV9ORVdfTElORVMiLAogICAgICAiRklMRV9TS0lQX0VNUFRZX0xJTkVTIiwgIkZJTEVfQVBQRU5EIiwgIkZJTEVfTk9fREVGQVVMVF9DT05URVhUIiwKICAgICAgIlBTRlNfUEFTU19PTiIsICJQU0ZTX0ZFRURfTUUiLCAiUFNGU19FUlJfRkFUQUwiLCAiUFNGU19GTEFHX05PUk1BTCIsCiAgICAgICJQU0ZTX0ZMQUdfRkxVU0hfSU5DIiwgIlBTRlNfRkxBR19GTFVTSF9DTE9TRSIsICJDUllQVF9TQUxUX0xFTkdUSCIsCiAgICAgICJDUllQVF9TVERfREVTIiwgIkNSWVBUX0VYVF9ERVMiLCAiQ1JZUFRfTUQ1IiwgIkNSWVBUX0JMT1dGSVNIIiwKICAgICAgIkRJUkVDVE9SWV9TRVBBUkFUT1IiLCAiUEFUSF9TRVBBUkFUT1IiLCAiR0xPQl9CUkFDRSIsICJHTE9CX01BUksiLAogICAgICAiR0xPQl9OT1NPUlQiLCAiR0xPQl9OT0NIRUNLIiwgIkdMT0JfTk9FU0NBUEUiLCAiR0xPQl9FUlIiLCAiR0xPQl9PTkxZRElSIiwKICAgICAgIkxPR19FTUVSRyIsICJMT0dfQUxFUlQiLCAiTE9HX0NSSVQiLCAiTE9HX0VSUiIsICJMT0dfV0FSTklORyIsICJMT0dfTk9USUNFIiwKICAgICAgIkxPR19JTkZPIiwgIkxPR19ERUJVRyIsICJMT0dfS0VSTiIsICJMT0dfVVNFUiIsICJMT0dfTUFJTCIsICJMT0dfREFFTU9OIiwKICAgICAgIkxPR19BVVRIIiwgIkxPR19TWVNMT0ciLCAiTE9HX0xQUiIsICJMT0dfTkVXUyIsICJMT0dfVVVDUCIsICJMT0dfQ1JPTiIsCiAgICAgICJMT0dfQVVUSFBSSVYiLCAiTE9HX1BJRCIsICJMT0dfQ09OUyIsICJMT0dfT0RFTEFZIiwgIkxPR19OREVMQVkiLAogICAgICAiTE9HX05PV0FJVCIsICJMT0dfUEVSUk9SIiwgIkVYVFJfT1ZFUldSSVRFIiwgIkVYVFJfU0tJUCIsICJFWFRSX1BSRUZJWF9TQU1FIiwKICAgICAgIkVYVFJfUFJFRklYX0FMTCIsICJFWFRSX1BSRUZJWF9JTlZBTElEIiwgIkVYVFJfUFJFRklYX0lGX0VYSVNUUyIsCiAgICAgICJFWFRSX0lGX0VYSVNUUyIsICJFWFRSX1JFRlMiLCAiU09SVF9BU0MiLCAiU09SVF9ERVNDIiwgIlNPUlRfUkVHVUxBUiIsCiAgICAgICJTT1JUX05VTUVSSUMiLCAiU09SVF9TVFJJTkciLCAiU09SVF9MT0NBTEVfU1RSSU5HIiwgIkNBU0VfTE9XRVIiLAogICAgICAiQ0FTRV9VUFBFUiIsICJDT1VOVF9OT1JNQUwiLCAiQ09VTlRfUkVDVVJTSVZFIiwgIkFTU0VSVF9BQ1RJVkUiLAogICAgICAiQVNTRVJUX0NBTExCQUNLIiwgIkFTU0VSVF9CQUlMIiwgIkFTU0VSVF9XQVJOSU5HIiwgIkFTU0VSVF9RVUlFVF9FVkFMIiwKICAgICAgIlNUUkVBTV9VU0VfUEFUSCIsICJTVFJFQU1fSUdOT1JFX1VSTCIsICJTVFJFQU1fRU5GT1JDRV9TQUZFX01PREUiLAogICAgICAiU1RSRUFNX1JFUE9SVF9FUlJPUlMiLCAiU1RSRUFNX01VU1RfU0VFSyIsICJTVFJFQU1fVVJMX1NUQVRfTElOSyIsCiAgICAgICJTVFJFQU1fVVJMX1NUQVRfUVVJRVQiLCAiU1RSRUFNX01LRElSX1JFQ1VSU0lWRSIsICJJTUFHRVRZUEVfR0lGIiwKICAgICAgIklNQUdFVFlQRV9KUEVHIiwgIklNQUdFVFlQRV9QTkciLCAiSU1BR0VUWVBFX1NXRiIsICJJTUFHRVRZUEVfUFNEIiwKICAgICAgIklNQUdFVFlQRV9CTVAiLCAiSU1BR0VUWVBFX1RJRkZfSUkiLCAiSU1BR0VUWVBFX1RJRkZfTU0iLCAiSU1BR0VUWVBFX0pQQyIsCiAgICAgICJJTUFHRVRZUEVfSlAyIiwgIklNQUdFVFlQRV9KUFgiLCAiSU1BR0VUWVBFX0pCMiIsICJJTUFHRVRZUEVfU1dDIiwKICAgICAgIklNQUdFVFlQRV9JRkYiLCAiSU1BR0VUWVBFX1dCTVAiLCAiSU1BR0VUWVBFX0pQRUcyMDAwIiwgIklNQUdFVFlQRV9YQk0iLAogICAgICAiVF9JTkNMVURFIiwgIlRfSU5DTFVERV9PTkNFIiwgIlRfRVZBTCIsICJUX1JFUVVJUkUiLCAiVF9SRVFVSVJFX09OQ0UiLAogICAgICAiVF9MT0dJQ0FMX09SIiwgIlRfTE9HSUNBTF9YT1IiLCAiVF9MT0dJQ0FMX0FORCIsICJUX1BSSU5UIiwgIlRfUExVU19FUVVBTCIsCiAgICAgICJUX01JTlVTX0VRVUFMIiwgIlRfTVVMX0VRVUFMIiwgIlRfRElWX0VRVUFMIiwgIlRfQ09OQ0FUX0VRVUFMIiwgIlRfTU9EX0VRVUFMIiwKICAgICAgIlRfQU5EX0VRVUFMIiwgIlRfT1JfRVFVQUwiLCAiVF9YT1JfRVFVQUwiLCAiVF9TTF9FUVVBTCIsICJUX1NSX0VRVUFMIiwKICAgICAgIlRfQk9PTEVBTl9PUiIsICJUX0JPT0xFQU5fQU5EIiwgIlRfSVNfRVFVQUwiLCAiVF9JU19OT1RfRVFVQUwiLAogICAgICAiVF9JU19JREVOVElDQUwiLCAiVF9JU19OT1RfSURFTlRJQ0FMIiwgIlRfSVNfU01BTExFUl9PUl9FUVVBTCIsCiAgICAgICJUX0lTX0dSRUFURVJfT1JfRVFVQUwiLCAiVF9TTCIsICJUX1NSIiwgIlRfSU5DIiwgIlRfREVDIiwgIlRfSU5UX0NBU1QiLAogICAgICAiVF9ET1VCTEVfQ0FTVCIsICJUX1NUUklOR19DQVNUIiwgIlRfQVJSQVlfQ0FTVCIsICJUX09CSkVDVF9DQVNUIiwKICAgICAgIlRfQk9PTF9DQVNUIiwgIlRfVU5TRVRfQ0FTVCIsICJUX05FVyIsICJUX0VYSVQiLCAiVF9JRiIsICJUX0VMU0VJRiIsICJUX0VMU0UiLAogICAgICAiVF9FTkRJRiIsICJUX0xOVU1CRVIiLCAiVF9ETlVNQkVSIiwgIlRfU1RSSU5HIiwgIlRfU1RSSU5HX1ZBUk5BTUUiLAogICAgICAiVF9WQVJJQUJMRSIsICJUX05VTV9TVFJJTkciLCAiVF9JTkxJTkVfSFRNTCIsICJUX0NIQVJBQ1RFUiIsCiAgICAgICJUX0JBRF9DSEFSQUNURVIiLCAiVF9FTkNBUFNFRF9BTkRfV0hJVEVTUEFDRSIsICJUX0NPTlNUQU5UX0VOQ0FQU0VEX1NUUklORyIsCiAgICAgICJUX0VDSE8iLCAiVF9ETyIsICJUX1dISUxFIiwgIlRfRU5EV0hJTEUiLCAiVF9GT1IiLCAiVF9FTkRGT1IiLCAiVF9GT1JFQUNIIiwKICAgICAgIlRfRU5ERk9SRUFDSCIsICJUX0RFQ0xBUkUiLCAiVF9FTkRERUNMQVJFIiwgIlRfQVMiLCAiVF9TV0lUQ0giLCAiVF9FTkRTV0lUQ0giLAogICAgICAiVF9DQVNFIiwgIlRfREVGQVVMVCIsICJUX0JSRUFLIiwgIlRfQ09OVElOVUUiLCAiVF9GVU5DVElPTiIsICJUX0NPTlNUIiwKICAgICAgIlRfUkVUVVJOIiwgIlRfVVNFIiwgIlRfR0xPQkFMIiwgIlRfU1RBVElDIiwgIlRfVkFSIiwgIlRfVU5TRVQiLCAiVF9JU1NFVCIsCiAgICAgICJUX0VNUFRZIiwgIlRfQ0xBU1MiLCAiVF9FWFRFTkRTIiwgIlRfSU5URVJGQUNFIiwgIlRfSU1QTEVNRU5UUyIsCiAgICAgICJUX09CSkVDVF9PUEVSQVRPUiIsICJUX0RPVUJMRV9BUlJPVyIsICJUX0xJU1QiLCAiVF9BUlJBWSIsICJUX0NMQVNTX0MiLAogICAgICAiVF9GVU5DX0MiLCAiVF9NRVRIT0RfQyIsICJUX0xJTkUiLCAiVF9GSUxFIiwgIlRfQ09NTUVOVCIsICJUX0RPQ19DT01NRU5UIiwKICAgICAgIlRfT1BFTl9UQUciLCAiVF9PUEVOX1RBR19XSVRIX0VDSE8iLCAiVF9DTE9TRV9UQUciLCAiVF9XSElURVNQQUNFIiwKICAgICAgIlRfU1RBUlRfSEVSRURPQyIsICJUX0VORF9IRVJFRE9DIiwgIlRfRE9MTEFSX09QRU5fQ1VSTFlfQlJBQ0VTIiwKICAgICAgIlRfQ1VSTFlfT1BFTiIsICJUX1BBQU1BWUlNX05FS1VET1RBWUlNIiwgIlRfRE9VQkxFX0NPTE9OIiwgIlRfQUJTVFJBQ1QiLAogICAgICAiVF9DQVRDSCIsICJUX0ZJTkFMIiwgIlRfSU5TVEFOQ0VPRiIsICJUX1BSSVZBVEUiLCAiVF9QUk9URUNURUQiLCAiVF9QVUJMSUMiLAogICAgICAiVF9USFJPVyIsICJUX1RSWSIsICJUX0NMT05FIiwgIlRfSEFMVF9DT01QSUxFUiIsICJGT1JDRV9HWklQIiwKICAgICAgIkZPUkNFX0RFRkxBVEUiLCAiWE1MX0VMRU1FTlRfTk9ERSIsICJYTUxfQVRUUklCVVRFX05PREUiLCAiWE1MX1RFWFRfTk9ERSIsCiAgICAgICJYTUxfQ0RBVEFfU0VDVElPTl9OT0RFIiwgIlhNTF9FTlRJVFlfUkVGX05PREUiLCAiWE1MX0VOVElUWV9OT0RFIiwKICAgICAgIlhNTF9QSV9OT0RFIiwgIlhNTF9DT01NRU5UX05PREUiLCAiWE1MX0RPQ1VNRU5UX05PREUiLAogICAgICAiWE1MX0RPQ1VNRU5UX1RZUEVfTk9ERSIsICJYTUxfRE9DVU1FTlRfRlJBR19OT0RFIiwgIlhNTF9OT1RBVElPTl9OT0RFIiwKICAgICAgIlhNTF9IVE1MX0RPQ1VNRU5UX05PREUiLCAiWE1MX0RURF9OT0RFIiwgIlhNTF9FTEVNRU5UX0RFQ0xfTk9ERSIsCiAgICAgICJYTUxfQVRUUklCVVRFX0RFQ0xfTk9ERSIsICJYTUxfRU5USVRZX0RFQ0xfTk9ERSIsICJYTUxfTkFNRVNQQUNFX0RFQ0xfTk9ERSIsCiAgICAgICJYTUxfTE9DQUxfTkFNRVNQQUNFIiwgIlhNTF9BVFRSSUJVVEVfQ0RBVEEiLCAiWE1MX0FUVFJJQlVURV9JRCIsCiAgICAgICJYTUxfQVRUUklCVVRFX0lEUkVGIiwgIlhNTF9BVFRSSUJVVEVfSURSRUZTIiwgIlhNTF9BVFRSSUJVVEVfRU5USVRZIiwKICAgICAgIlhNTF9BVFRSSUJVVEVfTk1UT0tFTiIsICJYTUxfQVRUUklCVVRFX05NVE9LRU5TIiwgIlhNTF9BVFRSSUJVVEVfRU5VTUVSQVRJT04iLAogICAgICAiWE1MX0FUVFJJQlVURV9OT1RBVElPTiIsICJET01fUEhQX0VSUiIsICJET01fSU5ERVhfU0laRV9FUlIiLAogICAgICAiRE9NU1RSSU5HX1NJWkVfRVJSIiwgIkRPTV9ISUVSQVJDSFlfUkVRVUVTVF9FUlIiLCAiRE9NX1dST05HX0RPQ1VNRU5UX0VSUiIsCiAgICAgICJET01fSU5WQUxJRF9DSEFSQUNURVJfRVJSIiwgIkRPTV9OT19EQVRBX0FMTE9XRURfRVJSIiwKICAgICAgIkRPTV9OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIiLCAiRE9NX05PVF9GT1VORF9FUlIiLAogICAgICAiRE9NX05PVF9TVVBQT1JURURfRVJSIiwgIkRPTV9JTlVTRV9BVFRSSUJVVEVfRVJSIiwgIkRPTV9JTlZBTElEX1NUQVRFX0VSUiIsCiAgICAgICJET01fU1lOVEFYX0VSUiIsICJET01fSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSIiwgIkRPTV9OQU1FU1BBQ0VfRVJSIiwKICAgICAgIkRPTV9JTlZBTElEX0FDQ0VTU19FUlIiLCAiRE9NX1ZBTElEQVRJT05fRVJSIiwgIlhNTF9FUlJPUl9OT05FIiwKICAgICAgIlhNTF9FUlJPUl9OT19NRU1PUlkiLCAiWE1MX0VSUk9SX1NZTlRBWCIsICJYTUxfRVJST1JfTk9fRUxFTUVOVFMiLAogICAgICAiWE1MX0VSUk9SX0lOVkFMSURfVE9LRU4iLCAiWE1MX0VSUk9SX1VOQ0xPU0VEX1RPS0VOIiwKICAgICAgIlhNTF9FUlJPUl9QQVJUSUFMX0NIQVIiLCAiWE1MX0VSUk9SX1RBR19NSVNNQVRDSCIsCiAgICAgICJYTUxfRVJST1JfRFVQTElDQVRFX0FUVFJJQlVURSIsICJYTUxfRVJST1JfSlVOS19BRlRFUl9ET0NfRUxFTUVOVCIsCiAgICAgICJYTUxfRVJST1JfUEFSQU1fRU5USVRZX1JFRiIsICJYTUxfRVJST1JfVU5ERUZJTkVEX0VOVElUWSIsCiAgICAgICJYTUxfRVJST1JfUkVDVVJTSVZFX0VOVElUWV9SRUYiLCAiWE1MX0VSUk9SX0FTWU5DX0VOVElUWSIsCiAgICAgICJYTUxfRVJST1JfQkFEX0NIQVJfUkVGIiwgIlhNTF9FUlJPUl9CSU5BUllfRU5USVRZX1JFRiIsCiAgICAgICJYTUxfRVJST1JfQVRUUklCVVRFX0VYVEVSTkFMX0VOVElUWV9SRUYiLCAiWE1MX0VSUk9SX01JU1BMQUNFRF9YTUxfUEkiLAogICAgICAiWE1MX0VSUk9SX1VOS05PV05fRU5DT0RJTkciLCAiWE1MX0VSUk9SX0lOQ09SUkVDVF9FTkNPRElORyIsCiAgICAgICJYTUxfRVJST1JfVU5DTE9TRURfQ0RBVEFfU0VDVElPTiIsICJYTUxfRVJST1JfRVhURVJOQUxfRU5USVRZX0hBTkRMSU5HIiwKICAgICAgIlhNTF9PUFRJT05fQ0FTRV9GT0xESU5HIiwgIlhNTF9PUFRJT05fVEFSR0VUX0VOQ09ESU5HIiwKICAgICAgIlhNTF9PUFRJT05fU0tJUF9UQUdTVEFSVCIsICJYTUxfT1BUSU9OX1NLSVBfV0hJVEUiLCAiWE1MX1NBWF9JTVBMIiwgIklNR19HSUYiLAogICAgICAiSU1HX0pQRyIsICJJTUdfSlBFRyIsICJJTUdfUE5HIiwgIklNR19XQk1QIiwgIklNR19YUE0iLCAiSU1HX0NPTE9SX1RJTEVEIiwKICAgICAgIklNR19DT0xPUl9TVFlMRUQiLCAiSU1HX0NPTE9SX0JSVVNIRUQiLCAiSU1HX0NPTE9SX1NUWUxFREJSVVNIRUQiLAogICAgICAiSU1HX0NPTE9SX1RSQU5TUEFSRU5UIiwgIklNR19BUkNfUk9VTkRFRCIsICJJTUdfQVJDX1BJRSIsICJJTUdfQVJDX0NIT1JEIiwKICAgICAgIklNR19BUkNfTk9GSUxMIiwgIklNR19BUkNfRURHRUQiLCAiSU1HX0dEMl9SQVciLCAiSU1HX0dEMl9DT01QUkVTU0VEIiwKICAgICAgIklNR19FRkZFQ1RfUkVQTEFDRSIsICJJTUdfRUZGRUNUX0FMUEhBQkxFTkQiLCAiSU1HX0VGRkVDVF9OT1JNQUwiLAogICAgICAiSU1HX0VGRkVDVF9PVkVSTEFZIiwgIkdEX0JVTkRMRUQiLCAiSU1HX0ZJTFRFUl9ORUdBVEUiLAogICAgICAiSU1HX0ZJTFRFUl9HUkFZU0NBTEUiLCAiSU1HX0ZJTFRFUl9CUklHSFRORVNTIiwgIklNR19GSUxURVJfQ09OVFJBU1QiLAogICAgICAiSU1HX0ZJTFRFUl9DT0xPUklaRSIsICJJTUdfRklMVEVSX0VER0VERVRFQ1QiLCAiSU1HX0ZJTFRFUl9HQVVTU0lBTl9CTFVSIiwKICAgICAgIklNR19GSUxURVJfU0VMRUNUSVZFX0JMVVIiLCAiSU1HX0ZJTFRFUl9FTUJPU1MiLCAiSU1HX0ZJTFRFUl9NRUFOX1JFTU9WQUwiLAogICAgICAiSU1HX0ZJTFRFUl9TTU9PVEgiLCAiUE5HX05PX0ZJTFRFUiIsICJQTkdfRklMVEVSX05PTkUiLCAiUE5HX0ZJTFRFUl9TVUIiLAogICAgICAiUE5HX0ZJTFRFUl9VUCIsICJQTkdfRklMVEVSX0FWRyIsICJQTkdfRklMVEVSX1BBRVRIIiwgIlBOR19BTExfRklMVEVSUyIsCiAgICAgICJNQl9PVkVSTE9BRF9NQUlMIiwgIk1CX09WRVJMT0FEX1NUUklORyIsICJNQl9PVkVSTE9BRF9SRUdFWCIsICJNQl9DQVNFX1VQUEVSIiwKICAgICAgIk1CX0NBU0VfTE9XRVIiLCAiTUJfQ0FTRV9USVRMRSIsICJNWVNRTF9BU1NPQyIsICJNWVNRTF9OVU0iLCAiTVlTUUxfQk9USCIsCiAgICAgICJNWVNRTF9DTElFTlRfQ09NUFJFU1MiLCAiTVlTUUxfQ0xJRU5UX1NTTCIsICJNWVNRTF9DTElFTlRfSU5URVJBQ1RJVkUiLAogICAgICAiTVlTUUxfQ0xJRU5UX0lHTk9SRV9TUEFDRSIsICJNWVNRTElfUkVBRF9ERUZBVUxUX0dST1VQIiwKICAgICAgIk1ZU1FMSV9SRUFEX0RFRkFVTFRfRklMRSIsICJNWVNRTElfT1BUX0NPTk5FQ1RfVElNRU9VVCIsCiAgICAgICJNWVNRTElfT1BUX0xPQ0FMX0lORklMRSIsICJNWVNRTElfSU5JVF9DT01NQU5EIiwgIk1ZU1FMSV9DTElFTlRfU1NMIiwKICAgICAgIk1ZU1FMSV9DTElFTlRfQ09NUFJFU1MiLCAiTVlTUUxJX0NMSUVOVF9JTlRFUkFDVElWRSIsCiAgICAgICJNWVNRTElfQ0xJRU5UX0lHTk9SRV9TUEFDRSIsICJNWVNRTElfQ0xJRU5UX05PX1NDSEVNQSIsCiAgICAgICJNWVNRTElfQ0xJRU5UX0ZPVU5EX1JPV1MiLCAiTVlTUUxJX1NUT1JFX1JFU1VMVCIsICJNWVNRTElfVVNFX1JFU1VMVCIsCiAgICAgICJNWVNRTElfQVNTT0MiLCAiTVlTUUxJX05VTSIsICJNWVNRTElfQk9USCIsCiAgICAgICJNWVNRTElfU1RNVF9BVFRSX1VQREFURV9NQVhfTEVOR1RIIiwgIk1ZU1FMSV9TVE1UX0FUVFJfQ1VSU09SX1RZUEUiLAogICAgICAiTVlTUUxJX0NVUlNPUl9UWVBFX05PX0NVUlNPUiIsICJNWVNRTElfQ1VSU09SX1RZUEVfUkVBRF9PTkxZIiwKICAgICAgIk1ZU1FMSV9DVVJTT1JfVFlQRV9GT1JfVVBEQVRFIiwgIk1ZU1FMSV9DVVJTT1JfVFlQRV9TQ1JPTExBQkxFIiwKICAgICAgIk1ZU1FMSV9TVE1UX0FUVFJfUFJFRkVUQ0hfUk9XUyIsICJNWVNRTElfTk9UX05VTExfRkxBRyIsCiAgICAgICJNWVNRTElfUFJJX0tFWV9GTEFHIiwgIk1ZU1FMSV9VTklRVUVfS0VZX0ZMQUciLCAiTVlTUUxJX01VTFRJUExFX0tFWV9GTEFHIiwKICAgICAgIk1ZU1FMSV9CTE9CX0ZMQUciLCAiTVlTUUxJX1VOU0lHTkVEX0ZMQUciLCAiTVlTUUxJX1pFUk9GSUxMX0ZMQUciLAogICAgICAiTVlTUUxJX0FVVE9fSU5DUkVNRU5UX0ZMQUciLCAiTVlTUUxJX1RJTUVTVEFNUF9GTEFHIiwgIk1ZU1FMSV9TRVRfRkxBRyIsCiAgICAgICJNWVNRTElfTlVNX0ZMQUciLCAiTVlTUUxJX1BBUlRfS0VZX0ZMQUciLCAiTVlTUUxJX0dST1VQX0ZMQUciLAogICAgICAiTVlTUUxJX1RZUEVfREVDSU1BTCIsICJNWVNRTElfVFlQRV9USU5ZIiwgIk1ZU1FMSV9UWVBFX1NIT1JUIiwKICAgICAgIk1ZU1FMSV9UWVBFX0xPTkciLCAiTVlTUUxJX1RZUEVfRkxPQVQiLCAiTVlTUUxJX1RZUEVfRE9VQkxFIiwKICAgICAgIk1ZU1FMSV9UWVBFX05VTEwiLCAiTVlTUUxJX1RZUEVfVElNRVNUQU1QIiwgIk1ZU1FMSV9UWVBFX0xPTkdMT05HIiwKICAgICAgIk1ZU1FMSV9UWVBFX0lOVDI0IiwgIk1ZU1FMSV9UWVBFX0RBVEUiLCAiTVlTUUxJX1RZUEVfVElNRSIsCiAgICAgICJNWVNRTElfVFlQRV9EQVRFVElNRSIsICJNWVNRTElfVFlQRV9ZRUFSIiwgIk1ZU1FMSV9UWVBFX05FV0RBVEUiLAogICAgICAiTVlTUUxJX1RZUEVfRU5VTSIsICJNWVNRTElfVFlQRV9TRVQiLCAiTVlTUUxJX1RZUEVfVElOWV9CTE9CIiwKICAgICAgIk1ZU1FMSV9UWVBFX01FRElVTV9CTE9CIiwgIk1ZU1FMSV9UWVBFX0xPTkdfQkxPQiIsICJNWVNRTElfVFlQRV9CTE9CIiwKICAgICAgIk1ZU1FMSV9UWVBFX1ZBUl9TVFJJTkciLCAiTVlTUUxJX1RZUEVfU1RSSU5HIiwgIk1ZU1FMSV9UWVBFX0NIQVIiLAogICAgICAiTVlTUUxJX1RZUEVfSU5URVJWQUwiLCAiTVlTUUxJX1RZUEVfR0VPTUVUUlkiLCAiTVlTUUxJX1RZUEVfTkVXREVDSU1BTCIsCiAgICAgICJNWVNRTElfVFlQRV9CSVQiLCAiTVlTUUxJX1JQTF9NQVNURVIiLCAiTVlTUUxJX1JQTF9TTEFWRSIsICJNWVNRTElfUlBMX0FETUlOIiwKICAgICAgIk1ZU1FMSV9OT19EQVRBIiwgIk1ZU1FMSV9EQVRBX1RSVU5DQVRFRCIsICJNWVNRTElfUkVQT1JUX0lOREVYIiwKICAgICAgIk1ZU1FMSV9SRVBPUlRfRVJST1IiLCAiTVlTUUxJX1JFUE9SVF9TVFJJQ1QiLCAiTVlTUUxJX1JFUE9SVF9BTEwiLAogICAgICAiTVlTUUxJX1JFUE9SVF9PRkYiLCAiQUZfVU5JWCIsICJBRl9JTkVUIiwgIkFGX0lORVQ2IiwgIlNPQ0tfU1RSRUFNIiwKICAgICAgIlNPQ0tfREdSQU0iLCAiU09DS19SQVciLCAiU09DS19TRVFQQUNLRVQiLCAiU09DS19SRE0iLCAiTVNHX09PQiIsCiAgICAgICJNU0dfV0FJVEFMTCIsICJNU0dfUEVFSyIsICJNU0dfRE9OVFJPVVRFIiwgIlNPX0RFQlVHIiwgIlNPX1JFVVNFQUREUiIsCiAgICAgICJTT19LRUVQQUxJVkUiLCAiU09fRE9OVFJPVVRFIiwgIlNPX0xJTkdFUiIsICJTT19CUk9BRENBU1QiLCAiU09fT09CSU5MSU5FIiwKICAgICAgIlNPX1NOREJVRiIsICJTT19SQ1ZCVUYiLCAiU09fU05ETE9XQVQiLCAiU09fUkNWTE9XQVQiLCAiU09fU05EVElNRU8iLAogICAgICAiU09fUkNWVElNRU8iLCAiU09fVFlQRSIsICJTT19FUlJPUiIsICJTT0xfU09DS0VUIiwgIlNPTUFYQ09OTiIsCiAgICAgICJQSFBfTk9STUFMX1JFQUQiLCAiUEhQX0JJTkFSWV9SRUFEIiwgIlNPQ0tFVF9FSU5UUiIsICJTT0NLRVRfRUJBREYiLAogICAgICAiU09DS0VUX0VBQ0NFUyIsICJTT0NLRVRfRUZBVUxUIiwgIlNPQ0tFVF9FSU5WQUwiLCAiU09DS0VUX0VNRklMRSIsCiAgICAgICJTT0NLRVRfRVdPVUxEQkxPQ0siLCAiU09DS0VUX0VJTlBST0dSRVNTIiwgIlNPQ0tFVF9FQUxSRUFEWSIsCiAgICAgICJTT0NLRVRfRU5PVFNPQ0siLCAiU09DS0VUX0VERVNUQUREUlJFUSIsICJTT0NLRVRfRU1TR1NJWkUiLAogICAgICAiU09DS0VUX0VQUk9UT1RZUEUiLCAiU09DS0VUX0VOT1BST1RPT1BUIiwgIlNPQ0tFVF9FUFJPVE9OT1NVUFBPUlQiLAogICAgICAiU09DS0VUX0VTT0NLVE5PU1VQUE9SVCIsICJTT0NLRVRfRU9QTk9UU1VQUCIsICJTT0NLRVRfRVBGTk9TVVBQT1JUIiwKICAgICAgIlNPQ0tFVF9FQUZOT1NVUFBPUlQiLCAiU09DS0VUX0VBRERSSU5VU0UiLCAiU09DS0VUX0VBRERSTk9UQVZBSUwiLAogICAgICAiU09DS0VUX0VORVRET1dOIiwgIlNPQ0tFVF9FTkVUVU5SRUFDSCIsICJTT0NLRVRfRU5FVFJFU0VUIiwKICAgICAgIlNPQ0tFVF9FQ09OTkFCT1JURUQiLCAiU09DS0VUX0VDT05OUkVTRVQiLCAiU09DS0VUX0VOT0JVRlMiLCAiU09DS0VUX0VJU0NPTk4iLAogICAgICAiU09DS0VUX0VOT1RDT05OIiwgIlNPQ0tFVF9FU0hVVERPV04iLCAiU09DS0VUX0VUT09NQU5ZUkVGUyIsCiAgICAgICJTT0NLRVRfRVRJTUVET1VUIiwgIlNPQ0tFVF9FQ09OTlJFRlVTRUQiLCAiU09DS0VUX0VMT09QIiwKICAgICAgIlNPQ0tFVF9FTkFNRVRPT0xPTkciLCAiU09DS0VUX0VIT1NURE9XTiIsICJTT0NLRVRfRUhPU1RVTlJFQUNIIiwKICAgICAgIlNPQ0tFVF9FTk9URU1QVFkiLCAiU09DS0VUX0VQUk9DTElNIiwgIlNPQ0tFVF9FVVNFUlMiLCAiU09DS0VUX0VEUVVPVCIsCiAgICAgICJTT0NLRVRfRVNUQUxFIiwgIlNPQ0tFVF9FUkVNT1RFIiwgIlNPQ0tFVF9FRElTQ09OIiwgIlNPQ0tFVF9TWVNOT1RSRUFEWSIsCiAgICAgICJTT0NLRVRfVkVSTk9UU1VQUE9SVEVEIiwgIlNPQ0tFVF9OT1RJTklUSUFMSVNFRCIsICJTT0NLRVRfSE9TVF9OT1RfRk9VTkQiLAogICAgICAiU09DS0VUX1RSWV9BR0FJTiIsICJTT0NLRVRfTk9fUkVDT1ZFUlkiLCAiU09DS0VUX05PX0RBVEEiLAogICAgICAiU09DS0VUX05PX0FERFJFU1MiLCAiU09MX1RDUCIsICJTT0xfVURQIiwgIkVBQ0NFTEVSQVRPUl9WRVJTSU9OIiwKICAgICAgIkVBQ0NFTEVSQVRPUl9TSE1fQU5EX0RJU0siLCAiRUFDQ0VMRVJBVE9SX1NITSIsICJFQUNDRUxFUkFUT1JfU0hNX09OTFkiLAogICAgICAiRUFDQ0VMRVJBVE9SX0RJU0tfT05MWSIsICJFQUNDRUxFUkFUT1JfTk9ORSIsICJYREVCVUdfVFJBQ0VfQVBQRU5EIiwKICAgICAgIlhERUJVR19UUkFDRV9DT01QVVRFUklaRUQiLCAiWERFQlVHX1RSQUNFX0hUTUwiLCAiWERFQlVHX0NDX1VOVVNFRCIsCiAgICAgICJYREVCVUdfQ0NfREVBRF9DT0RFIiwgIlNURElOIiwgIlNURE9VVCIsICJTVERFUlIiLAogICAgXS5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQsIGluZGV4LCBhcnJheSkgewogICAgICByZXN1bHRbZWxlbWVudF0gPSB0b2tlbigiYXRvbSIsICJwaHAtcHJlZGVmaW5lZC1jb25zdGFudCIpOwogICAgfSk7CgogICAgLy8gUEhQIGRlY2xhcmVkIGNsYXNzZXMgLSBvdXRwdXQgb2YgZ2V0X2RlY2xhcmVkX2NsYXNzZXMoKS4gRGlmZmVycyBmcm9tIGh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9yZXNlcnZlZC5jbGFzc2VzLnBocAogICAgWyAgInN0ZENsYXNzIiwgIkV4Y2VwdGlvbiIsICJFcnJvckV4Y2VwdGlvbiIsICJDT01QZXJzaXN0SGVscGVyIiwgImNvbV9leGNlcHRpb24iLAogICAgICAiY29tX3NhZmVhcnJheV9wcm94eSIsICJ2YXJpYW50IiwgImNvbSIsICJkb3RuZXQiLCAiUmVmbGVjdGlvbkV4Y2VwdGlvbiIsCiAgICAgICJSZWZsZWN0aW9uIiwgIlJlZmxlY3Rpb25GdW5jdGlvbkFic3RyYWN0IiwgIlJlZmxlY3Rpb25GdW5jdGlvbiIsCiAgICAgICJSZWZsZWN0aW9uUGFyYW1ldGVyIiwgIlJlZmxlY3Rpb25NZXRob2QiLCAiUmVmbGVjdGlvbkNsYXNzIiwKICAgICAgIlJlZmxlY3Rpb25PYmplY3QiLCAiUmVmbGVjdGlvblByb3BlcnR5IiwgIlJlZmxlY3Rpb25FeHRlbnNpb24iLCAiRGF0ZVRpbWUiLAogICAgICAiRGF0ZVRpbWVab25lIiwgIkxpYlhNTEVycm9yIiwgIl9fUEhQX0luY29tcGxldGVfQ2xhc3MiLCAicGhwX3VzZXJfZmlsdGVyIiwKICAgICAgIkRpcmVjdG9yeSIsICJTaW1wbGVYTUxFbGVtZW50IiwgIkRPTUV4Y2VwdGlvbiIsICJET01TdHJpbmdMaXN0IiwKICAgICAgIkRPTU5hbWVMaXN0IiwgIkRPTUltcGxlbWVudGF0aW9uTGlzdCIsICJET01JbXBsZW1lbnRhdGlvblNvdXJjZSIsCiAgICAgICJET01JbXBsZW1lbnRhdGlvbiIsICJET01Ob2RlIiwgIkRPTU5hbWVTcGFjZU5vZGUiLCAiRE9NRG9jdW1lbnRGcmFnbWVudCIsCiAgICAgICJET01Eb2N1bWVudCIsICJET01Ob2RlTGlzdCIsICJET01OYW1lZE5vZGVNYXAiLCAiRE9NQ2hhcmFjdGVyRGF0YSIsICJET01BdHRyIiwKICAgICAgIkRPTUVsZW1lbnQiLCAiRE9NVGV4dCIsICJET01Db21tZW50IiwgIkRPTVR5cGVpbmZvIiwgIkRPTVVzZXJEYXRhSGFuZGxlciIsCiAgICAgICJET01Eb21FcnJvciIsICJET01FcnJvckhhbmRsZXIiLCAiRE9NTG9jYXRvciIsICJET01Db25maWd1cmF0aW9uIiwKICAgICAgIkRPTUNkYXRhU2VjdGlvbiIsICJET01Eb2N1bWVudFR5cGUiLCAiRE9NTm90YXRpb24iLCAiRE9NRW50aXR5IiwKICAgICAgIkRPTUVudGl0eVJlZmVyZW5jZSIsICJET01Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb24iLCAiRE9NU3RyaW5nRXh0ZW5kIiwKICAgICAgIkRPTVhQYXRoIiwgIlJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IiLCAiSXRlcmF0b3JJdGVyYXRvciIsICJGaWx0ZXJJdGVyYXRvciIsCiAgICAgICJSZWN1cnNpdmVGaWx0ZXJJdGVyYXRvciIsICJQYXJlbnRJdGVyYXRvciIsICJMaW1pdEl0ZXJhdG9yIiwKICAgICAgIkNhY2hpbmdJdGVyYXRvciIsICJSZWN1cnNpdmVDYWNoaW5nSXRlcmF0b3IiLCAiTm9SZXdpbmRJdGVyYXRvciIsCiAgICAgICJBcHBlbmRJdGVyYXRvciIsICJJbmZpbml0ZUl0ZXJhdG9yIiwgIlJlZ2V4SXRlcmF0b3IiLAogICAgICAiUmVjdXJzaXZlUmVnZXhJdGVyYXRvciIsICJFbXB0eUl0ZXJhdG9yIiwgIkFycmF5T2JqZWN0IiwgIkFycmF5SXRlcmF0b3IiLAogICAgICAiUmVjdXJzaXZlQXJyYXlJdGVyYXRvciIsICJTcGxGaWxlSW5mbyIsICJEaXJlY3RvcnlJdGVyYXRvciIsCiAgICAgICJSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvciIsICJTcGxGaWxlT2JqZWN0IiwgIlNwbFRlbXBGaWxlT2JqZWN0IiwKICAgICAgIlNpbXBsZVhNTEl0ZXJhdG9yIiwgIkxvZ2ljRXhjZXB0aW9uIiwgIkJhZEZ1bmN0aW9uQ2FsbEV4Y2VwdGlvbiIsCiAgICAgICJCYWRNZXRob2RDYWxsRXhjZXB0aW9uIiwgIkRvbWFpbkV4Y2VwdGlvbiIsICJJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24iLAogICAgICAiTGVuZ3RoRXhjZXB0aW9uIiwgIk91dE9mUmFuZ2VFeGNlcHRpb24iLCAiUnVudGltZUV4Y2VwdGlvbiIsCiAgICAgICJPdXRPZkJvdW5kc0V4Y2VwdGlvbiIsICJPdmVyZmxvd0V4Y2VwdGlvbiIsICJSYW5nZUV4Y2VwdGlvbiIsCiAgICAgICJVbmRlcmZsb3dFeGNlcHRpb24iLCAiVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uIiwgIlNwbE9iamVjdFN0b3JhZ2UiLAogICAgICAiWE1MUmVhZGVyIiwgIlhNTFdyaXRlciIsICJteXNxbGlfc3FsX2V4Y2VwdGlvbiIsICJteXNxbGlfZHJpdmVyIiwgIm15c3FsaSIsCiAgICAgICJteXNxbGlfd2FybmluZyIsICJteXNxbGlfcmVzdWx0IiwgIm15c3FsaV9zdG10IiwgIlBET0V4Y2VwdGlvbiIsICJQRE8iLAogICAgICAiUERPU3RhdGVtZW50IiwgIlBET1JvdyIKICAgIF0uZm9yRWFjaChmdW5jdGlvbihlbGVtZW50LCBpbmRleCwgYXJyYXkpIHsKICAgICAgcmVzdWx0W2VsZW1lbnRdID0gdG9rZW4oInRfc3RyaW5nIiwgInBocC1wcmVkZWZpbmVkLWNsYXNzIik7CiAgICB9KTsKCiAgICByZXR1cm4gcmVzdWx0OwoKICB9KCk7CgogIC8vIEhlbHBlciByZWdleHBzCiAgdmFyIGlzT3BlcmF0b3JDaGFyID0gL1srKiYlXC89PD4hPy58LV0vOwogIHZhciBpc0hleERpZ2l0ID0gL1swLTlBLUZhLWZdLzsKICB2YXIgaXNXb3JkQ2hhciA9IC9bXHdcJF9dLzsKCiAgLy8gV3JhcHBlciBhcm91bmQgcGhwVG9rZW4gdGhhdCBoZWxwcyBtYWludGFpbiBwYXJzZXIgc3RhdGUgKHdoZXRoZXIKICAvLyB3ZSBhcmUgaW5zaWRlIG9mIGEgbXVsdGktbGluZSBjb21tZW50KQogIGZ1bmN0aW9uIHBocFRva2VuU3RhdGUoaW5zaWRlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlLCBzZXRTdGF0ZSkgewogICAgICB2YXIgbmV3SW5zaWRlID0gaW5zaWRlOwogICAgICB2YXIgdHlwZSA9IHBocFRva2VuKGluc2lkZSwgc291cmNlLCBmdW5jdGlvbihjKSB7bmV3SW5zaWRlID0gYzt9KTsKICAgICAgaWYgKG5ld0luc2lkZSAhPSBpbnNpZGUpCiAgICAgICAgc2V0U3RhdGUocGhwVG9rZW5TdGF0ZShuZXdJbnNpZGUpKTsKICAgICAgcmV0dXJuIHR5cGU7CiAgICB9OwogIH0KCiAgLy8gVGhlIHRva2VuIHJlYWRlciwgaW50ZWRlZCB0byBiZSB1c2VkIGJ5IHRoZSB0b2tlbml6ZXIgZnJvbQogIC8vIHRva2VuaXplLmpzICh0aHJvdWdoIHBocFRva2VuU3RhdGUpLiBBZHZhbmNlcyB0aGUgc291cmNlIHN0cmVhbQogIC8vIG92ZXIgYSB0b2tlbiwgYW5kIHJldHVybnMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHR5cGUgYW5kIHN0eWxlCiAgLy8gb2YgdGhhdCB0b2tlbi4KICBmdW5jdGlvbiBwaHBUb2tlbihpbnNpZGUsIHNvdXJjZSwgc2V0SW5zaWRlKSB7CiAgICBmdW5jdGlvbiByZWFkSGV4TnVtYmVyKCl7CiAgICAgIHNvdXJjZS5uZXh0KCk7ICAvLyBza2lwIHRoZSAneCcKICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoaXNIZXhEaWdpdCk7CiAgICAgIHJldHVybiB7dHlwZTogIm51bWJlciIsIHN0eWxlOiAicGhwLWF0b20ifTsKICAgIH0KCiAgICBmdW5jdGlvbiByZWFkTnVtYmVyKCkgewogICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvWzAtOV0vKTsKICAgICAgaWYgKHNvdXJjZS5lcXVhbHMoIi4iKSl7CiAgICAgICAgc291cmNlLm5leHQoKTsKICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvWzAtOV0vKTsKICAgICAgfQogICAgICBpZiAoc291cmNlLmVxdWFscygiZSIpIHx8IHNvdXJjZS5lcXVhbHMoIkUiKSl7CiAgICAgICAgc291cmNlLm5leHQoKTsKICAgICAgICBpZiAoc291cmNlLmVxdWFscygiLSIpKQogICAgICAgICAgc291cmNlLm5leHQoKTsKICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvWzAtOV0vKTsKICAgICAgfQogICAgICByZXR1cm4ge3R5cGU6ICJudW1iZXIiLCBzdHlsZTogInBocC1hdG9tIn07CiAgICB9CiAgICAvLyBSZWFkIGEgd29yZCBhbmQgbG9vayBpdCB1cCBpbiB0aGUga2V5d29yZHMgYXJyYXkuIElmIGZvdW5kLCBpdCdzIGEKICAgIC8vIGtleXdvcmQgb2YgdGhhdCB0eXBlOyBvdGhlcndpc2UgaXQncyBhIFBIUCBUX1NUUklORy4KICAgIGZ1bmN0aW9uIHJlYWRXb3JkKCkgewogICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcyhpc1dvcmRDaGFyKTsKICAgICAgdmFyIHdvcmQgPSBzb3VyY2UuZ2V0KCk7CiAgICAgIHZhciBrbm93biA9IGtleXdvcmRzLmhhc093blByb3BlcnR5KHdvcmQpICYmIGtleXdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKHdvcmQpICYmIGtleXdvcmRzW3dvcmRdOwogICAgICAvLyBzaW5jZSB3ZSBjYWxsZWQgZ2V0KCksIHRva2VuaXplOjp0YWtlIHdvbid0IGdldCgpIGFueXRoaW5nLiBUaHVzLCB3ZSBtdXN0IHNldCB0b2tlbi5jb250ZW50CiAgICAgIHJldHVybiBrbm93biA/IHt0eXBlOiBrbm93bi50eXBlLCBzdHlsZToga25vd24uc3R5bGUsIGNvbnRlbnQ6IHdvcmR9IDoKICAgICAge3R5cGU6ICJ0X3N0cmluZyIsIHN0eWxlOiAicGhwLXRfc3RyaW5nIiwgY29udGVudDogd29yZH07CiAgICB9CiAgICBmdW5jdGlvbiByZWFkVmFyaWFibGUoKSB7CiAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKGlzV29yZENoYXIpOwogICAgICB2YXIgd29yZCA9IHNvdXJjZS5nZXQoKTsKICAgICAgLy8gaW4gUEhQLCAnJHRoaXMnIGlzIGEgcmVzZXJ2ZWQgd29yZCwgYnV0ICd0aGlzJyBpc24ndC4gWW91IGNhbiBoYXZlIGZ1bmN0aW9uIHRoaXMoKSB7Li4ufQogICAgICBpZiAod29yZCA9PSAiJHRoaXMiKQogICAgICAgIHJldHVybiB7dHlwZTogInZhcmlhYmxlIiwgc3R5bGU6ICJwaHAta2V5d29yZCIsIGNvbnRlbnQ6IHdvcmR9OwogICAgICBlbHNlCiAgICAgICAgcmV0dXJuIHt0eXBlOiAidmFyaWFibGUiLCBzdHlsZTogInBocC12YXJpYWJsZSIsIGNvbnRlbnQ6IHdvcmR9OwogICAgfQoKICAgIC8vIEFkdmFuY2UgdGhlIHN0cmVhbSB1bnRpbCB0aGUgZ2l2ZW4gY2hhcmFjdGVyIChub3QgcHJlY2VkZWQgYnkgYQogICAgLy8gYmFja3NsYXNoKSBpcyBlbmNvdW50ZXJlZCwgb3IgdGhlIGVuZCBvZiB0aGUgbGluZSBpcyByZWFjaGVkLgogICAgZnVuY3Rpb24gbmV4dFVudGlsVW5lc2NhcGVkKHNvdXJjZSwgZW5kKSB7CiAgICAgIHZhciBlc2NhcGVkID0gZmFsc2U7CiAgICAgIHdoaWxlKCFzb3VyY2UuZW5kT2ZMaW5lKCkpewogICAgICAgIHZhciBuZXh0ID0gc291cmNlLm5leHQoKTsKICAgICAgICBpZiAobmV4dCA9PSBlbmQgJiYgIWVzY2FwZWQpCiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgZXNjYXBlZCA9IG5leHQgPT0gIlxcIiAmJiAhZXNjYXBlZDsKICAgICAgfQogICAgICByZXR1cm4gZXNjYXBlZDsKICAgIH0KCiAgICBmdW5jdGlvbiByZWFkU2luZ2xlTGluZUNvbW1lbnQoKSB7CiAgICAgIC8vIHJlYWQgdW50aWwgdGhlIGVuZCBvZiB0aGUgbGluZSBvciB1bnRpbCA/Piwgd2hpY2ggdGVybWluYXRlcyBzaW5nbGUtbGluZSBjb21tZW50cwogICAgICAvLyBgPD9waHAgZWNobyAxOyAvLyBjb21tZW50ID8+IGZvb2Agd2lsbCBkaXNwbGF5ICIxIGZvbyIKICAgICAgd2hpbGUoIXNvdXJjZS5sb29rQWhlYWQoIj8+IikgJiYgIXNvdXJjZS5lbmRPZkxpbmUoKSkKICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICByZXR1cm4ge3R5cGU6ICJjb21tZW50Iiwgc3R5bGU6ICJwaHAtY29tbWVudCJ9OwogICAgfQogICAgLyogRm9yIG11bHRpLWxpbmUgY29tbWVudHMsIHdlIHdhbnQgdG8gcmV0dXJuIGEgY29tbWVudCB0b2tlbiBmb3IKICAgICAgIGV2ZXJ5IGxpbmUgb2YgdGhlIGNvbW1lbnQsIGJ1dCB3ZSBhbHNvIHdhbnQgdG8gcmV0dXJuIHRoZSBuZXdsaW5lcwogICAgICAgaW4gdGhlbSBhcyByZWd1bGFyIG5ld2xpbmUgdG9rZW5zLiBXZSB0aGVyZWZvcmUgbmVlZCB0byBzYXZlIGEKICAgICAgIHN0YXRlIHZhcmlhYmxlICgiaW5zaWRlIikgdG8gaW5kaWNhdGUgd2hldGhlciB3ZSBhcmUgaW5zaWRlIGEKICAgICAgIG11bHRpLWxpbmUgY29tbWVudC4KICAgICovCgogICAgZnVuY3Rpb24gcmVhZE11bHRpbGluZUNvbW1lbnQoc3RhcnQpewogICAgICB2YXIgbmV3SW5zaWRlID0gIi8qIjsKICAgICAgdmFyIG1heWJlRW5kID0gKHN0YXJ0ID09ICIqIik7CiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgaWYgKHNvdXJjZS5lbmRPZkxpbmUoKSkKICAgICAgICAgIGJyZWFrOwogICAgICAgIHZhciBuZXh0ID0gc291cmNlLm5leHQoKTsKICAgICAgICBpZiAobmV4dCA9PSAiLyIgJiYgbWF5YmVFbmQpewogICAgICAgICAgbmV3SW5zaWRlID0gbnVsbDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBtYXliZUVuZCA9IChuZXh0ID09ICIqIik7CiAgICAgIH0KICAgICAgc2V0SW5zaWRlKG5ld0luc2lkZSk7CiAgICAgIHJldHVybiB7dHlwZTogImNvbW1lbnQiLCBzdHlsZTogInBocC1jb21tZW50In07CiAgICB9CgogICAgLy8gc2ltaWxhciB0byByZWFkTXVsdGlsaW5lQ29tbWVudCBhbmQgbmV4dFVudGlsVW5lc2NhcGVkCiAgICAvLyB1bmxpa2UgY29tbWVudHMsIHN0cmluZ3MgYXJlIG5vdCBzdG9wcGVkIGJ5ID8+CiAgICBmdW5jdGlvbiByZWFkTXVsdGlsaW5lU3RyaW5nKHN0YXJ0KXsKICAgICAgdmFyIG5ld0luc2lkZSA9IHN0YXJ0OwogICAgICB2YXIgZXNjYXBlZCA9IGZhbHNlOwogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIGlmIChzb3VyY2UuZW5kT2ZMaW5lKCkpCiAgICAgICAgICBicmVhazsKICAgICAgICB2YXIgbmV4dCA9IHNvdXJjZS5uZXh0KCk7CiAgICAgICAgaWYgKG5leHQgPT0gc3RhcnQgJiYgIWVzY2FwZWQpewogICAgICAgICAgbmV3SW5zaWRlID0gbnVsbDsgIC8vIHdlJ3JlIG91dHNpZGUgb2YgdGhlIHN0cmluZyBub3cKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBlc2NhcGVkID0gKG5leHQgPT0gIlxcIiAmJiAhZXNjYXBlZCk7CiAgICAgIH0KICAgICAgc2V0SW5zaWRlKG5ld0luc2lkZSk7CiAgICAgIHJldHVybiB7CiAgICAgICAgdHlwZTogbmV3SW5zaWRlID09IG51bGw/ICJzdHJpbmciIDogInN0cmluZ19ub3RfdGVybWluYXRlZCIsCiAgICAgICAgc3R5bGU6IChzdGFydCA9PSAiJyI/ICJwaHAtc3RyaW5nLXNpbmdsZS1xdW90ZWQiIDogInBocC1zdHJpbmctZG91YmxlLXF1b3RlZCIpCiAgICAgIH07CiAgICB9CgogICAgLy8gaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL2xhbmd1YWdlLnR5cGVzLnN0cmluZy5waHAjbGFuZ3VhZ2UudHlwZXMuc3RyaW5nLnN5bnRheC5oZXJlZG9jCiAgICAvLyBTZWUgYWxzbyAnbm93ZG9jJyBvbiB0aGUgcGFnZS4gSGVyZWRvY3MgYXJlIG5vdCBpbnRlcnJ1cHRlZCBieSB0aGUgJz8+JyB0b2tlbi4KICAgIGZ1bmN0aW9uIHJlYWRIZXJlZG9jKGlkZW50aWZpZXIpewogICAgICB2YXIgdG9rZW4gPSB7fTsKICAgICAgaWYgKGlkZW50aWZpZXIgPT0gIjw8PCIpIHsKICAgICAgICAvLyBvbiBvdXIgZmlyc3QgaW52b2NhdGlvbiBhZnRlciByZWFkaW5nIHRoZSA8PDwsIHdlIG11c3QgZGV0ZXJtaW5lIHRoZSBjbG9zaW5nIGlkZW50aWZpZXIKICAgICAgICBpZiAoc291cmNlLmVxdWFscygiJyIpKSB7CiAgICAgICAgICAvLyBub3dkb2MKICAgICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKGlzV29yZENoYXIpOwogICAgICAgICAgaWRlbnRpZmllciA9ICInIiArIHNvdXJjZS5nZXQoKSArICInIjsKICAgICAgICAgIHNvdXJjZS5uZXh0KCk7ICAvLyBjb25zdW1lIHRoZSBjbG9zaW5nICInIgogICAgICAgIH0gZWxzZSBpZiAoc291cmNlLm1hdGNoZXMoL1tBLVphLXpfXS8pKSB7CiAgICAgICAgICAvLyBoZXJlZG9jCiAgICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcyhpc1dvcmRDaGFyKTsKICAgICAgICAgIGlkZW50aWZpZXIgPSBzb3VyY2UuZ2V0KCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIHN5bnRheCBlcnJvcgogICAgICAgICAgc2V0SW5zaWRlKG51bGwpOwogICAgICAgICAgcmV0dXJuIHsgdHlwZTogImVycm9yIiwgc3R5bGU6ICJzeW50YXgtZXJyb3IiIH07CiAgICAgICAgfQogICAgICAgIHNldEluc2lkZShpZGVudGlmaWVyKTsKICAgICAgICB0b2tlbi50eXBlID0gInN0cmluZ19ub3RfdGVybWluYXRlZCI7CiAgICAgICAgdG9rZW4uc3R5bGUgPSBpZGVudGlmaWVyLmNoYXJBdCgwKSA9PSAiJyI/ICJwaHAtc3RyaW5nLXNpbmdsZS1xdW90ZWQiIDogInBocC1zdHJpbmctZG91YmxlLXF1b3RlZCI7CiAgICAgICAgdG9rZW4uY29udGVudCA9IGlkZW50aWZpZXI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdG9rZW4uc3R5bGUgPSBpZGVudGlmaWVyLmNoYXJBdCgwKSA9PSAiJyI/ICJwaHAtc3RyaW5nLXNpbmdsZS1xdW90ZWQiIDogInBocC1zdHJpbmctZG91YmxlLXF1b3RlZCI7CiAgICAgICAgLy8gY29uc3VtZSBhIGxpbmUgb2YgaGVyZWRvYyBhbmQgY2hlY2sgaWYgaXQgZXF1YWxzIHRoZSBjbG9zaW5nIGlkZW50aWZpZXIgcGx1cyBhbiBvcHRpb25hbCBzZW1pY29sb24KICAgICAgICBpZiAoc291cmNlLmxvb2tBaGVhZChpZGVudGlmaWVyLCB0cnVlKSAmJiAoc291cmNlLmxvb2tBaGVhZCgiO1xuIikgfHwgc291cmNlLmVuZE9mTGluZSgpKSkgewogICAgICAgICAgLy8gdGhlIGNsb3NpbmcgaWRlbnRpZmllciBjYW4gb25seSBhcHBlYXIgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZQogICAgICAgICAgLy8gbm90ZSB0aGF0IGV2ZW4gd2hpdGVzcGFjZSBhZnRlciB0aGUgIjsiIGlzIGZvcmJpZGRlbiBieSB0aGUgUEhQIGhlcmVkb2Mgc3ludGF4CiAgICAgICAgICB0b2tlbi50eXBlID0gInN0cmluZyI7CiAgICAgICAgICB0b2tlbi5jb250ZW50ID0gc291cmNlLmdldCgpOyAgLy8gZG9uJ3QgZ2V0IHRoZSAiOyIgaWYgdGhlcmUgaXMgb25lCiAgICAgICAgICBzZXRJbnNpZGUobnVsbCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRva2VuLnR5cGUgPSAic3RyaW5nX25vdF90ZXJtaW5hdGVkIjsKICAgICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9bXlxuXS8pOwogICAgICAgICAgdG9rZW4uY29udGVudCA9IHNvdXJjZS5nZXQoKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRva2VuOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlYWRPcGVyYXRvcigpIHsKICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoaXNPcGVyYXRvckNoYXIpOwogICAgICByZXR1cm4ge3R5cGU6ICJvcGVyYXRvciIsIHN0eWxlOiAicGhwLW9wZXJhdG9yIn07CiAgICB9CiAgICBmdW5jdGlvbiByZWFkU3RyaW5nU2luZ2xlUXVvdGVkKCkgewogICAgICB2YXIgZW5kQmFja1NsYXNoID0gbmV4dFVudGlsVW5lc2NhcGVkKHNvdXJjZSwgIiciLCBmYWxzZSk7CiAgICAgIHNldEluc2lkZShlbmRCYWNrU2xhc2ggPyAiJyIgOiBudWxsKTsKICAgICAgcmV0dXJuIHt0eXBlOiAic3RyaW5nIiwgc3R5bGU6ICJwaHAtc3RyaW5nLXNpbmdsZS1xdW90ZWQifTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlYWRTdHJpbmdEb3VibGVRdW90ZWQoKSB7CiAgICAgIHZhciBlbmRCYWNrU2xhc2ggPSBuZXh0VW50aWxVbmVzY2FwZWQoc291cmNlLCAiXCIiLCBmYWxzZSk7CiAgICAgIHNldEluc2lkZShlbmRCYWNrU2xhc2ggPyAiXCIiOiBudWxsKTsKICAgICAgcmV0dXJuIHt0eXBlOiAic3RyaW5nIiwgc3R5bGU6ICJwaHAtc3RyaW5nLWRvdWJsZS1xdW90ZWQifTsKICAgIH0KCiAgICAvLyBGZXRjaCB0aGUgbmV4dCB0b2tlbi4gRGlzcGF0Y2hlcyBvbiBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlCiAgICAvLyBzdHJlYW0sIG9yIGZpcnN0IHR3byBjaGFyYWN0ZXJzIHdoZW4gdGhlIGZpcnN0IGlzIGEgc2xhc2guCiAgICBzd2l0Y2ggKGluc2lkZSkgewogICAgICBjYXNlIG51bGw6CiAgICAgIGNhc2UgZmFsc2U6IGJyZWFrOwogICAgICBjYXNlICInIjoKICAgICAgY2FzZSAiXCIiOiByZXR1cm4gcmVhZE11bHRpbGluZVN0cmluZyhpbnNpZGUpOwogICAgICBjYXNlICIvKiI6IHJldHVybiByZWFkTXVsdGlsaW5lQ29tbWVudChzb3VyY2UubmV4dCgpKTsKICAgICAgZGVmYXVsdDogcmV0dXJuIHJlYWRIZXJlZG9jKGluc2lkZSk7CiAgICB9CiAgICB2YXIgY2ggPSBzb3VyY2UubmV4dCgpOwogICAgaWYgKGNoID09ICInIiB8fCBjaCA9PSAiXCIiKQogICAgICByZXR1cm4gcmVhZE11bHRpbGluZVN0cmluZyhjaCkKICAgIGVsc2UgaWYgKGNoID09ICIjIikKICAgICAgcmV0dXJuIHJlYWRTaW5nbGVMaW5lQ29tbWVudCgpOwogICAgZWxzZSBpZiAoY2ggPT0gIiQiKQogICAgICByZXR1cm4gcmVhZFZhcmlhYmxlKCk7CiAgICBlbHNlIGlmIChjaCA9PSAiOiIgJiYgc291cmNlLmVxdWFscygiOiIpKSB7CiAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgIC8vIHRoZSBUX0RPVUJMRV9DT0xPTiBjYW4gb25seSBmb2xsb3cgYSBUX1NUUklORyAoY2xhc3MgbmFtZSkKICAgICAgcmV0dXJuIHt0eXBlOiAidF9kb3VibGVfY29sb24iLCBzdHlsZTogInBocC1vcGVyYXRvciJ9CiAgICB9CiAgICAvLyB3aXRoIHB1bmN0dWF0aW9uLCB0aGUgdHlwZSBvZiB0aGUgdG9rZW4gaXMgdGhlIHN5bWJvbCBpdHNlbGYKICAgIGVsc2UgaWYgKC9bXFtcXXt9XChcKSw7Ol0vLnRlc3QoY2gpKSB7CiAgICAgIHJldHVybiB7dHlwZTogY2gsIHN0eWxlOiAicGhwLXB1bmN0dWF0aW9uIn07CiAgICB9CiAgICBlbHNlIGlmIChjaCA9PSAiMCIgJiYgKHNvdXJjZS5lcXVhbHMoIngiKSB8fCBzb3VyY2UuZXF1YWxzKCJYIikpKQogICAgICByZXR1cm4gcmVhZEhleE51bWJlcigpOwogICAgZWxzZSBpZiAoL1swLTldLy50ZXN0KGNoKSkKICAgICAgcmV0dXJuIHJlYWROdW1iZXIoKTsKICAgIGVsc2UgaWYgKGNoID09ICIvIikgewogICAgICBpZiAoc291cmNlLmVxdWFscygiKiIpKQogICAgICB7IHNvdXJjZS5uZXh0KCk7IHJldHVybiByZWFkTXVsdGlsaW5lQ29tbWVudChjaCk7IH0KICAgICAgZWxzZSBpZiAoc291cmNlLmVxdWFscygiLyIpKQogICAgICAgIHJldHVybiByZWFkU2luZ2xlTGluZUNvbW1lbnQoKTsKICAgICAgZWxzZQogICAgICAgIHJldHVybiByZWFkT3BlcmF0b3IoKTsKICAgIH0KICAgIGVsc2UgaWYgKGNoID09ICI8IikgewogICAgICBpZiAoc291cmNlLmxvb2tBaGVhZCgiPDwiLCB0cnVlKSkgewogICAgICAgIHNldEluc2lkZSgiPDw8Iik7CiAgICAgICAgcmV0dXJuIHt0eXBlOiAiPDw8Iiwgc3R5bGU6ICJwaHAtcHVuY3R1YXRpb24ifTsKICAgICAgfQogICAgICBlbHNlCiAgICAgICAgcmV0dXJuIHJlYWRPcGVyYXRvcigpOwogICAgfQogICAgZWxzZSBpZiAoaXNPcGVyYXRvckNoYXIudGVzdChjaCkpCiAgICAgIHJldHVybiByZWFkT3BlcmF0b3IoKTsKICAgIGVsc2UKICAgICAgcmV0dXJuIHJlYWRXb3JkKCk7CiAgfQoKICAvLyBUaGUgZXh0ZXJuYWwgaW50ZXJmYWNlIHRvIHRoZSB0b2tlbml6ZXIuCiAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSwgc3RhcnRTdGF0ZSkgewogICAgcmV0dXJuIHRva2VuaXplcihzb3VyY2UsIHN0YXJ0U3RhdGUgfHwgcGhwVG9rZW5TdGF0ZShmYWxzZSwgdHJ1ZSkpOwogIH07Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/php/LICENSE</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29weXJpZ2h0IChjKSAyMDA4LTIwMDksIFlhaG9vISBJbmMuCkFsbCByaWdodHMgcmVzZXJ2ZWQuCgpUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGZvciB1c2UgaW4gY29ubmVjdGlvbiB3aXRoIHRoZQpDb2RlTWlycm9yIHN1aXRlIG9mIG1vZHVsZXMgYW5kIHV0aWxpdGllcywgaG9zdGVkIGFuZCBtYWludGFpbmVkCmF0IGh0dHA6Ly9tYXJpam4uaGF2ZXJiZWtlLm5sL2NvZGVtaXJyb3IvLgoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLAp3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlCmZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CgoqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCiAgZm9sbG93aW5nIGRpc2NsYWltZXIuCgoqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCiAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCiAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KCiogTmVpdGhlciB0aGUgbmFtZSBvZiBZYWhvbyEgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwogIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCiAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFlhaG9vISBJbmMuCgpUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCiJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCkxJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCkZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkNPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwpMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCkNBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVApMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgpBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/php/license.txt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29weXJpZ2h0IChjKSAyMDA4LTIwMDksIFlhaG9vISBJbmMuCkFsbCByaWdodHMgcmVzZXJ2ZWQuCgpUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGZvciB1c2UgaW4gY29ubmVjdGlvbiB3aXRoIHRoZQpDb2RlTWlycm9yIHN1aXRlIG9mIG1vZHVsZXMgYW5kIHV0aWxpdGllcywgaG9zdGVkIGFuZCBtYWludGFpbmVkCmF0IGh0dHA6Ly9tYXJpam4uaGF2ZXJiZWtlLm5sL2NvZGVtaXJyb3IvLgoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLAp3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlCmZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CgoqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCiAgZm9sbG93aW5nIGRpc2NsYWltZXIuCgoqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCiAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCiAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KCiogTmVpdGhlciB0aGUgbmFtZSBvZiBZYWhvbyEgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwogIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCiAgd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFlhaG9vISBJbmMuCgpUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCiJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCkxJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCkZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkNPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwpMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCkNBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVApMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgpBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/plsql/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/plsql/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/plsql/css/plsqlcolors.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aHRtbCB7CiAgY3Vyc29yOiB0ZXh0Owp9CgouZWRpdGJveCB7CiAgbWFyZ2luOiAuNGVtOwogIHBhZGRpbmc6IDA7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICBmb250LXNpemU6IDEwcHQ7CiAgY29sb3I6IGJsYWNrOwp9CgouZWRpdGJveCBwIHsKICBtYXJnaW46IDA7Cn0KCnNwYW4ucGxzcWwta2V5d29yZCB7CiAgY29sb3I6IGJsdWU7Cn0KCnNwYW4ucGxzcWwtdmFyIHsKICBjb2xvcjogcmVkOwp9CgpzcGFuLnBsc3FsLWNvbW1lbnQgewogIGNvbG9yOiAjQUE3NzAwOwp9CgpzcGFuLnBsc3FsLWxpdGVyYWwgewogIGNvbG9yOiBncmVlbjsKfQoKc3Bhbi5wbHNxbC1vcGVyYXRvciB7CiAgY29sb3I6IGJsdWU7Cn0KCnNwYW4ucGxzcWwtd29yZCB7CiAgY29sb3I6IGJsYWNrOwp9CgpzcGFuLnBsc3FsLWZ1bmN0aW9uIHsKICBjb2xvcjogZGFya29yYW5nZTsKfQoKc3Bhbi5wbHNxbC10eXBlIHsKICBjb2xvcjogcHVycGxlOwp9CgpzcGFuLnBsc3FsLXNlcGFyYXRvciB7CiAgY29sb3I6ICM2NjY2NjY7Cn0KCnNwYW4ucGxzcWwtbnVtYmVyIHsKICBjb2xvcjogZGFya2N5YW47Cn0KCgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/plsql/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHNjcmlwdCBzcmM9Ii4uLy4uL2pzL2NvZGVtaXJyb3IuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgICA8dGl0bGU+Q29kZU1pcnJvcjogUExTUUwgZGVtb25zdHJhdGlvbjwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9jc3MvZG9jcy5jc3MiLz4KICA8L2hlYWQ+CiAgPGJvZHkgc3R5bGU9InBhZGRpbmc6IDIwcHg7Ij4KCjxwPkRlbW9uc3RyYXRpb24gb2YgPGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+Q29kZU1pcnJvcjwvYT4ncyBQTFNRTApoaWdobGlnaHRlci48L3A+Cgo8cD5Xcml0dGVuIGJ5IFBldGVyIFJhZ2FuaXRzY2ggKDxhIGhyZWY9IkxJQ0VOU0UiPmxpY2Vuc2U8L2E+KSwgYmFzZWQKb24gSm9obiBCZW5lZGlrdHNzb24gPGEgaHJlZj0iLi4vc3FsL2luZGV4Lmh0bWwiPlNRTCBwYXJzZXI8L2E+LjwvcD4KCjxkaXYgY2xhc3M9ImJvcmRlciI+Cjx0ZXh0YXJlYSBpZD0iY29kZSIgY29scz0iMTIwIiByb3dzPSI1MCI+ClBST0NFRFVSRSBnZW5lcmF0ZVJlc3VsdAogICggcFJvdXRpbmVUeXBlICAgSU4gVkFSQ0hBUjIKICAsIHBSZWZlcmVuY2VUeXBlIElOIFZBUkNIQVIyCiAgLCBwUmVmZXJlbmNlSWQgICBJTiBOVU1CRVIKICApCklTCiAgICBST1VUSU5FX05BTUUgICAgICBDT05TVEFOVCBWQVJDSEFSMigzMCkgOj0gJ2dlbmVyYXRlUmVzdWx0JzsKICAgIC0tCiAgICB2RGlzcGxheUFzICAgICAgICBBUEVYTElCX1ZfUEFHRV9JVEVNLkRJU1BMQVlfQVMgICAgICAlVFlQRTsKICAgIHZMb3ZRdWVyeSAgICAgICAgIEFQRVhMSUJfVl9QQUdFX0lURU0uTE9WX1FVRVJZICAgICAgICVUWVBFOwogICAgdkRpc3BsYXlOdWxsVmFsdWUgQVBFWExJQl9WX1BBR0VfSVRFTS5MT1ZfRElTUExBWV9OVUxMJVRZUEU7CiAgICB2TG92TnVsbFRleHQgICAgICBBUEVYTElCX1ZfUEFHRV9JVEVNLkxPVl9OVUxMX1RFWFQgICAlVFlQRTsKICAgIHZMb3ZOdWxsVmFsdWUgICAgIEFQRVhMSUJfVl9QQUdFX0lURU0uTE9WX05VTExfVkFMVUUgICVUWVBFOwogICAgdkFwcGxpY2F0aW9uSWQgICAgQVBFWExJQl9WX1BBR0VfSVRFTS5BUFBMSUNBVElPTl9JRCAgJVRZUEU7CiAgICB2UGFnZUlkICAgICAgICAgICBBUEVYTElCX1ZfUEFHRV9JVEVNLlBBR0VfSUQgICAgICAgICAlVFlQRTsKQkVHSU4KICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC0tIERldGVybWluZSB3aGljaCByb3V0aW5lIHRvIGNhbGwgYW5kIHBhc3MgcGFyYW1ldGVycwogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ0FTRSBwUm91dGluZVR5cGUKICAgIFdIRU4gJ0xPVicKICAgIFRIRU4KICAgICAgICBBcGV4TGliX0xvdi5nZW5lcmF0ZUxvdlJlc3VsdCggcFJlZmVyZW5jZVR5cGUsIHBSZWZlcmVuY2VJZCApOwogICAgLS0KICAgIFdIRU4gJ0NPTVBVVEFUSU9OJwogICAgVEhFTgogICAgICAgIEFwZXhMaWJfQ29tcHV0YXRpb24uZ2VuZXJhdGVDb21wdXRhdGlvblJlc3VsdCggcFJlZmVyZW5jZVR5cGUsIHBSZWZlcmVuY2VJZCApOwogICAgLS0KICAgIEVMU0UKICAgICAgICBBcGV4bGliX0Vycm9yLnJhaXNlSW1wbEVycm9yKCdVbnN1cHBvcnRlZCByb3V0aW5lIHR5cGUgIid8fHBSb3V0aW5lVHlwZXx8JyIhJyk7CiAgICBFTkQgQ0FTRTsKICAgIC0tCkVYQ0VQVElPTiBXSEVOIE9USEVSUyBUSEVOCiAgICBIVFAucHJuKCdFcnJvcjogJ3x8U1FMRVJSTSk7CiAgICAtLSBSQUlTRTsgbm8gcmFpc2UsIGJlY2F1c2UgQVBFWCBkb2Vzbid0IGNhcmUgYW55d2F5LgpFTkQgZ2VuZXJhdGVSZXN1bHQ7CjwvdGV4dGFyZWE+CjwvZGl2PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYSgnY29kZScsIHsKICAgIGhlaWdodDogIjQ1MHB4IiwKICAgIHBhcnNlcmZpbGU6ICIuLi9jb250cmliL3Bsc3FsL2pzL3BhcnNlcGxzcWwuanMiLAogICAgc3R5bGVzaGVldDogImNzcy9wbHNxbGNvbG9ycy5jc3MiLAogICAgcGF0aDogIi4uLy4uL2pzLyIsCiAgICB0ZXh0V3JhcHBpbmc6IGZhbHNlCiAgfSk7Cjwvc2NyaXB0PgoKICA8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/plsql/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/plsql/js/parseplsql.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dmFyIFBsc3FsUGFyc2VyID0gRWRpdG9yLlBhcnNlciA9IChmdW5jdGlvbigpIHsKCiAgZnVuY3Rpb24gd29yZFJlZ2V4cCh3b3JkcykgewogICAgcmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiICsgd29yZHMuam9pbigifCIpICsgIikkIiwgImkiKTsKICB9CgogIHZhciBmdW5jdGlvbnMgPSB3b3JkUmVnZXhwKFsKImFicyIsImFjb3MiLCJhZGRfbW9udGhzIiwiYXNjaWkiLCJhc2luIiwiYXRhbiIsImF0YW4yIiwiYXZlcmFnZSIsCiJiZmlsZW5hbWUiLAoiY2VpbCIsImNoYXJ0b3Jvd2lkIiwiY2hyIiwiY29uY2F0IiwiY29udmVydCIsImNvcyIsImNvc2giLCJjb3VudCIsCiJkZWNvZGUiLCJkZXJlZiIsImR1YWwiLCJkdW1wIiwiZHVwX3ZhbF9vbl9pbmRleCIsCiJlbXB0eSIsImVycm9yIiwiZXhwIiwKImZhbHNlIiwiZmxvb3IiLCJmb3VuZCIsCiJnbGIiLCJncmVhdGVzdCIsCiJoZXh0b3JhdyIsCiJpbml0Y2FwIiwiaW5zdHIiLCJpbnN0cmIiLCJpc29wZW4iLAoibGFzdF9kYXkiLCJsZWFzdCIsImxlbmdodCIsImxlbmdodGIiLCJsbiIsImxvd2VyIiwibHBhZCIsImx0cmltIiwibHViIiwKIm1ha2VfcmVmIiwibWF4IiwibWluIiwibW9kIiwibW9udGhzX2JldHdlZW4iLAoibmV3X3RpbWUiLCJuZXh0X2RheSIsIm5leHR2YWwiLCJubHNfY2hhcnNldF9kZWNsX2xlbiIsIm5sc19jaGFyc2V0X2lkIiwibmxzX2NoYXJzZXRfbmFtZSIsIm5sc19pbml0Y2FwIiwibmxzX2xvd2VyIiwKIm5sc19zb3J0IiwibmxzX3VwcGVyIiwibmxzc29ydCIsIm5vX2RhdGFfZm91bmQiLCJub3Rmb3VuZCIsIm51bGwiLCJudmwiLAoib3RoZXJzIiwKInBvd2VyIiwKInJhd3RvaGV4IiwicmVmdG9oZXgiLCJyb3VuZCIsInJvd2NvdW50Iiwicm93aWR0b2NoYXIiLCJycGFkIiwicnRyaW0iLAoic2lnbiIsInNpbiIsInNpbmgiLCJzb3VuZGV4Iiwic3FsY29kZSIsInNxbGVycm0iLCJzcXJ0Iiwic3RkZGV2Iiwic3Vic3RyIiwic3Vic3RyYiIsInN1bSIsInN5c2RhdGUiLAoidGFuIiwidGFuaCIsInRvX2NoYXIiLCJ0b19kYXRlIiwidG9fbGFiZWwiLCJ0b19tdWx0aV9ieXRlIiwidG9fbnVtYmVyIiwidG9fc2luZ2xlX2J5dGUiLCJ0cmFuc2xhdGUiLCJ0cnVlIiwidHJ1bmMiLAoidWlkIiwidXBwZXIiLCJ1c2VyIiwidXNlcmVudiIsCiJ2YXJpYW5jZSIsInZzaXplIgoKICBdKTsKCiAgdmFyIGtleXdvcmRzID0gd29yZFJlZ2V4cChbCiJhYm9ydCIsImFjY2VwdCIsImFjY2VzcyIsImFkZCIsImFsbCIsImFsdGVyIiwiYW5kIiwiYW55IiwiYXJyYXkiLCJhcnJheWxlbiIsImFzIiwiYXNjIiwiYXNzZXJ0IiwiYXNzaWduIiwiYXQiLCJhdHRyaWJ1dGVzIiwiYXVkaXQiLAoiYXV0aG9yaXphdGlvbiIsImF2ZyIsCiJiYXNlX3RhYmxlIiwiYmVnaW4iLCJiZXR3ZWVuIiwiYmluYXJ5X2ludGVnZXIiLCJib2R5IiwiYm9vbGVhbiIsImJ5IiwKImNhc2UiLCJjYXN0IiwiY2hhciIsImNoYXJfYmFzZSIsImNoZWNrIiwiY2xvc2UiLCJjbHVzdGVyIiwiY2x1c3RlcnMiLCJjb2xhdXRoIiwiY29sdW1uIiwiY29tbWVudCIsImNvbW1pdCIsImNvbXByZXNzIiwiY29ubmVjdCIsCiJjb25uZWN0ZWQiLCJjb25zdGFudCIsImNvbnN0cmFpbnQiLCJjcmFzaCIsImNyZWF0ZSIsImN1cnJlbnQiLCJjdXJydmFsIiwiY3Vyc29yIiwKImRhdGFfYmFzZSIsImRhdGFiYXNlIiwiZGF0ZSIsImRiYSIsImRlYWxsb2NhdGUiLCJkZWJ1Z29mZiIsImRlYnVnb24iLCJkZWNpbWFsIiwiZGVjbGFyZSIsImRlZmF1bHQiLCJkZWZpbml0aW9uIiwiZGVsYXkiLCJkZWxldGUiLAoiZGVzYyIsImRpZ2l0cyIsImRpc3Bvc2UiLCJkaXN0aW5jdCIsImRvIiwiZHJvcCIsCiJlbHNlIiwiZWxzaWYiLCJlbmFibGUiLCJlbmQiLCJlbnRyeSIsImVzY2FwZSIsImV4Y2VwdGlvbiIsImV4Y2VwdGlvbl9pbml0IiwiZXhjaGFuZ2UiLCJleGNsdXNpdmUiLCJleGlzdHMiLCJleGl0IiwiZXh0ZXJuYWwiLAoiZmFzdCIsImZldGNoIiwiZmlsZSIsImZvciIsImZvcmNlIiwiZm9ybSIsImZyb20iLCJmdW5jdGlvbiIsCiJnZW5lcmljIiwiZ290byIsImdyYW50IiwiZ3JvdXAiLAoiaGF2aW5nIiwKImlkZW50aWZpZWQiLCJpZiIsImltbWVkaWF0ZSIsImluIiwiaW5jcmVtZW50IiwiaW5kZXgiLCJpbmRleGVzIiwiaW5kaWNhdG9yIiwiaW5pdGlhbCIsImluaXRyYW5zIiwiaW5zZXJ0IiwiaW50ZXJmYWNlIiwiaW50ZXJzZWN0IiwKImludG8iLCJpcyIsCiJrZXkiLAoibGV2ZWwiLCJsaWJyYXJ5IiwibGlrZSIsImxpbWl0ZWQiLCJsb2NhbCIsImxvY2siLCJsb2ciLCJsb2dnaW5nIiwibG9uZyIsImxvb3AiLAoibWFzdGVyIiwibWF4ZXh0ZW50cyIsIm1heHRyYW5zIiwibWVtYmVyIiwibWluZXh0ZW50cyIsIm1pbnVzIiwibWlzbGFiZWwiLCJtb2RlIiwibW9kaWZ5IiwibXVsdGlzZXQiLAoibmV3IiwibmV4dCIsIm5vIiwibm9hdWRpdCIsIm5vY29tcHJlc3MiLCJub2xvZ2dpbmciLCJub3BhcmFsbGVsIiwibm90Iiwibm93YWl0IiwibnVtYmVyX2Jhc2UiLAoib2JqZWN0Iiwib2YiLCJvZmYiLCJvZmZsaW5lIiwib24iLCJvbmxpbmUiLCJvbmx5Iiwib3BlbiIsIm9wdGlvbiIsIm9yIiwib3JkZXIiLCJvdXQiLAoicGFja2FnZSIsInBhcmFsbGVsIiwicGFydGl0aW9uIiwicGN0ZnJlZSIsInBjdGluY3JlYXNlIiwicGN0dXNlZCIsInBsc19pbnRlZ2VyIiwicG9zaXRpdmUiLCJwb3NpdGl2ZW4iLCJwcmFnbWEiLCJwcmltYXJ5IiwicHJpb3IiLAoicHJpdmF0ZSIsInByaXZpbGVnZXMiLCJwcm9jZWR1cmUiLCJwdWJsaWMiLAoicmFpc2UiLCJyYW5nZSIsInJhdyIsInJlYWQiLCJyZWJ1aWxkIiwicmVjb3JkIiwicmVmIiwicmVmZXJlbmNlcyIsInJlZnJlc2giLCJyZWxlYXNlIiwicmVuYW1lIiwicmVwbGFjZSIsInJlc291cmNlIiwicmVzdHJpY3QiLCJyZXR1cm4iLAoicmV0dXJuaW5nIiwicmV2ZXJzZSIsInJldm9rZSIsInJvbGxiYWNrIiwicm93Iiwicm93aWQiLCJyb3dsYWJlbCIsInJvd251bSIsInJvd3MiLCJydW4iLAoic2F2ZXBvaW50Iiwic2NoZW1hIiwic2VnbWVudCIsInNlbGVjdCIsInNlcGFyYXRlIiwic2Vzc2lvbiIsInNldCIsInNoYXJlIiwic25hcHNob3QiLCJzb21lIiwic3BhY2UiLCJzcGxpdCIsInNxbCIsInN0YXJ0Iiwic3RhdGVtZW50IiwKInN0b3JhZ2UiLCJzdWJ0eXBlIiwic3VjY2Vzc2Z1bCIsInN5bm9ueW0iLAoidGFiYXV0aCIsInRhYmxlIiwidGFibGVzIiwidGFibGVzcGFjZSIsInRhc2siLCJ0ZXJtaW5hdGUiLCJ0aGVuIiwidG8iLCJ0cmlnZ2VyIiwidHJ1bmNhdGUiLCJ0eXBlIiwKInVuaW9uIiwidW5pcXVlIiwidW5saW1pdGVkIiwidW5yZWNvdmVyYWJsZSIsInVudXNhYmxlIiwidXBkYXRlIiwidXNlIiwidXNpbmciLAoidmFsaWRhdGUiLCJ2YWx1ZSIsInZhbHVlcyIsInZhcmlhYmxlIiwidmlldyIsInZpZXdzIiwKIndoZW4iLCJ3aGVuZXZlciIsIndoZXJlIiwid2hpbGUiLCJ3aXRoIiwid29yayIKICBdKTsKCiAgdmFyIHR5cGVzID0gd29yZFJlZ2V4cChbCiJiZmlsZSIsImJsb2IiLAoiY2hhcmFjdGVyIiwiY2xvYiIsCiJkZWMiLAoiZmxvYXQiLAoiaW50IiwiaW50ZWdlciIsCiJtbHNsYWJlbCIsCiJuYXR1cmFsIiwibmF0dXJhbG4iLCJuY2hhciIsIm5jbG9iIiwibnVtYmVyIiwibnVtZXJpYyIsIm52YXJjaGFyMiIsCiJyZWFsIiwicm93dHlwZSIsCiJzaWdudHlwZSIsInNtYWxsaW50Iiwic3RyaW5nIiwKInZhcmNoYXIiLCJ2YXJjaGFyMiIKICBdKTsKCiAgdmFyIG9wZXJhdG9ycyA9IHdvcmRSZWdleHAoWwogICAgIjo9IiwgIjwiLCAiPD0iLCAiPT0iLCAiIT0iLCAiPD4iLCAiPiIsICI+PSIsICJsaWtlIiwgInJsaWtlIiwgImluIiwgInhvciIsICJiZXR3ZWVuIgogIF0pOwoKICB2YXIgb3BlcmF0b3JDaGFycyA9IC9bKitcLTw+PSZ8OlwvXS87CgogIHZhciB0b2tlbml6ZVNxbCA9IChmdW5jdGlvbigpIHsKICAgIGZ1bmN0aW9uIG5vcm1hbChzb3VyY2UsIHNldFN0YXRlKSB7CiAgICAgIHZhciBjaCA9IHNvdXJjZS5uZXh0KCk7CiAgICAgIGlmIChjaCA9PSAiQCIgfHwgY2ggPT0gIiQiKSB7CiAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1tcd1xkXS8pOwogICAgICAgIHJldHVybiAicGxzcWwtdmFyIjsKICAgICAgfQogICAgICBlbHNlIGlmIChjaCA9PSAiXCIiIHx8IGNoID09ICInIiB8fCBjaCA9PSAiYCIpIHsKICAgICAgICBzZXRTdGF0ZShpbkxpdGVyYWwoY2gpKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBlbHNlIGlmIChjaCA9PSAiLCIgfHwgY2ggPT0gIjsiKSB7CiAgICAgICAgcmV0dXJuICJwbHNxbC1zZXBhcmF0b3IiCiAgICAgIH0KICAgICAgZWxzZSBpZiAoY2ggPT0gJy0nKSB7CiAgICAgICAgaWYgKHNvdXJjZS5wZWVrKCkgPT0gIi0iKSB7CiAgICAgICAgICB3aGlsZSAoIXNvdXJjZS5lbmRPZkxpbmUoKSkgc291cmNlLm5leHQoKTsKICAgICAgICAgIHJldHVybiAicGxzcWwtY29tbWVudCI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKC9cZC8udGVzdChzb3VyY2UucGVlaygpKSkgewogICAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1xkLyk7CiAgICAgICAgICBpZiAoc291cmNlLnBlZWsoKSA9PSAnLicpIHsKICAgICAgICAgICAgc291cmNlLm5leHQoKTsKICAgICAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1xkLyk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gInBsc3FsLW51bWJlciI7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgIHJldHVybiAicGxzcWwtb3BlcmF0b3IiOwogICAgICB9CiAgICAgIGVsc2UgaWYgKG9wZXJhdG9yQ2hhcnMudGVzdChjaCkpIHsKICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcyhvcGVyYXRvckNoYXJzKTsKICAgICAgICByZXR1cm4gInBsc3FsLW9wZXJhdG9yIjsKICAgICAgfQogICAgICBlbHNlIGlmICgvXGQvLnRlc3QoY2gpKSB7CiAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1xkLyk7CiAgICAgICAgaWYgKHNvdXJjZS5wZWVrKCkgPT0gJy4nKSB7CiAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1xkLyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAicGxzcWwtbnVtYmVyIjsKICAgICAgfQogICAgICBlbHNlIGlmICgvWygpXS8udGVzdChjaCkpIHsKICAgICAgICByZXR1cm4gInBsc3FsLXB1bmN0dWF0aW9uIjsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvW19cd1xkXS8pOwogICAgICAgIHZhciB3b3JkID0gc291cmNlLmdldCgpLCB0eXBlOwogICAgICAgIGlmIChvcGVyYXRvcnMudGVzdCh3b3JkKSkKICAgICAgICAgIHR5cGUgPSAicGxzcWwtb3BlcmF0b3IiOwogICAgICAgIGVsc2UgaWYgKGtleXdvcmRzLnRlc3Qod29yZCkpCiAgICAgICAgICB0eXBlID0gInBsc3FsLWtleXdvcmQiOwogICAgICAgIGVsc2UgaWYgKGZ1bmN0aW9ucy50ZXN0KHdvcmQpKQogICAgICAgICAgdHlwZSA9ICJwbHNxbC1mdW5jdGlvbiI7CiAgICAgICAgZWxzZSBpZiAodHlwZXMudGVzdCh3b3JkKSkKICAgICAgICAgIHR5cGUgPSAicGxzcWwtdHlwZSI7CiAgICAgICAgZWxzZQogICAgICAgICAgdHlwZSA9ICJwbHNxbC13b3JkIjsKICAgICAgICByZXR1cm4ge3N0eWxlOiB0eXBlLCBjb250ZW50OiB3b3JkfTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGluTGl0ZXJhbChxdW90ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlLCBzZXRTdGF0ZSkgewogICAgICAgIHZhciBlc2NhcGVkID0gZmFsc2U7CiAgICAgICAgd2hpbGUgKCFzb3VyY2UuZW5kT2ZMaW5lKCkpIHsKICAgICAgICAgIHZhciBjaCA9IHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICBpZiAoY2ggPT0gcXVvdGUgJiYgIWVzY2FwZWQpIHsKICAgICAgICAgICAgc2V0U3RhdGUobm9ybWFsKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgY2ggPT0gIlxcIjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHF1b3RlID09ICJgIiA/ICJwbHNxbC13b3JkIiA6ICJwbHNxbC1saXRlcmFsIjsKICAgICAgfTsKICAgIH0KCiAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlLCBzdGFydFN0YXRlKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZXIoc291cmNlLCBzdGFydFN0YXRlIHx8IG5vcm1hbCk7CiAgICB9OwogIH0pKCk7CgogIGZ1bmN0aW9uIGluZGVudFNxbChjb250ZXh0KSB7CiAgICByZXR1cm4gZnVuY3Rpb24obmV4dENoYXJzKSB7CiAgICAgIHZhciBmaXJzdENoYXIgPSBuZXh0Q2hhcnMgJiYgbmV4dENoYXJzLmNoYXJBdCgwKTsKICAgICAgdmFyIGNsb3NpbmcgPSBjb250ZXh0ICYmIGZpcnN0Q2hhciA9PSBjb250ZXh0LnR5cGU7CiAgICAgIGlmICghY29udGV4dCkKICAgICAgICByZXR1cm4gMDsKICAgICAgZWxzZSBpZiAoY29udGV4dC5hbGlnbikKICAgICAgICByZXR1cm4gY29udGV4dC5jb2wgLSAoY2xvc2luZyA/IGNvbnRleHQud2lkdGggOiAwKTsKICAgICAgZWxzZQogICAgICAgIHJldHVybiBjb250ZXh0LmluZGVudCArIChjbG9zaW5nID8gMCA6IGluZGVudFVuaXQpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcGFyc2VTcWwoc291cmNlKSB7CiAgICB2YXIgdG9rZW5zID0gdG9rZW5pemVTcWwoc291cmNlKTsKICAgIHZhciBjb250ZXh0ID0gbnVsbCwgaW5kZW50ID0gMCwgY29sID0gMDsKICAgIGZ1bmN0aW9uIHB1c2hDb250ZXh0KHR5cGUsIHdpZHRoLCBhbGlnbikgewogICAgICBjb250ZXh0ID0ge3ByZXY6IGNvbnRleHQsIGluZGVudDogaW5kZW50LCBjb2w6IGNvbCwgdHlwZTogdHlwZSwgd2lkdGg6IHdpZHRoLCBhbGlnbjogYWxpZ259OwogICAgfQogICAgZnVuY3Rpb24gcG9wQ29udGV4dCgpIHsKICAgICAgY29udGV4dCA9IGNvbnRleHQucHJldjsKICAgIH0KCiAgICB2YXIgaXRlciA9IHsKICAgICAgbmV4dDogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHRva2VuID0gdG9rZW5zLm5leHQoKTsKICAgICAgICB2YXIgdHlwZSA9IHRva2VuLnN0eWxlLCBjb250ZW50ID0gdG9rZW4uY29udGVudCwgd2lkdGggPSB0b2tlbi52YWx1ZS5sZW5ndGg7CgogICAgICAgIGlmIChjb250ZW50ID09ICJcbiIpIHsKICAgICAgICAgIHRva2VuLmluZGVudGF0aW9uID0gaW5kZW50U3FsKGNvbnRleHQpOwogICAgICAgICAgaW5kZW50ID0gY29sID0gMDsKICAgICAgICAgIGlmIChjb250ZXh0ICYmIGNvbnRleHQuYWxpZ24gPT0gbnVsbCkgY29udGV4dC5hbGlnbiA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh0eXBlID09ICJ3aGl0ZXNwYWNlIiAmJiBjb2wgPT0gMCkgewogICAgICAgICAgaW5kZW50ID0gd2lkdGg7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCFjb250ZXh0ICYmIHR5cGUgIT0gInBsc3FsLWNvbW1lbnQiKSB7CiAgICAgICAgICBwdXNoQ29udGV4dCgiOyIsIDAsIGZhbHNlKTsKICAgICAgICB9CgogICAgICAgIGlmIChjb250ZW50ICE9ICJcbiIpIGNvbCArPSB3aWR0aDsKCiAgICAgICAgaWYgKHR5cGUgPT0gInBsc3FsLXB1bmN0dWF0aW9uIikgewogICAgICAgICAgaWYgKGNvbnRlbnQgPT0gIigiKQogICAgICAgICAgICBwdXNoQ29udGV4dCgiKSIsIHdpZHRoKTsKICAgICAgICAgIGVsc2UgaWYgKGNvbnRlbnQgPT0gIikiKQogICAgICAgICAgICBwb3BDb250ZXh0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gInBsc3FsLXNlcGFyYXRvciIgJiYgY29udGVudCA9PSAiOyIgJiYgY29udGV4dCAmJiAhY29udGV4dC5wcmV2KSB7CiAgICAgICAgICBwb3BDb250ZXh0KCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgIH0sCgogICAgICBjb3B5OiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgX2NvbnRleHQgPSBjb250ZXh0LCBfaW5kZW50ID0gaW5kZW50LCBfY29sID0gY29sLCBfdG9rZW5TdGF0ZSA9IHRva2Vucy5zdGF0ZTsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlKSB7CiAgICAgICAgICB0b2tlbnMgPSB0b2tlbml6ZVNxbChzb3VyY2UsIF90b2tlblN0YXRlKTsKICAgICAgICAgIGNvbnRleHQgPSBfY29udGV4dDsKICAgICAgICAgIGluZGVudCA9IF9pbmRlbnQ7CiAgICAgICAgICBjb2wgPSBfY29sOwogICAgICAgICAgcmV0dXJuIGl0ZXI7CiAgICAgICAgfTsKICAgICAgfQogICAgfTsKICAgIHJldHVybiBpdGVyOwogIH0KCiAgcmV0dXJuIHttYWtlOiBwYXJzZVNxbCwgZWxlY3RyaWNDaGFyczogIikifTsKfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/plsql/LICENSE</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IENvcHlyaWdodCAoYykgMjAxMCBQZXRlciBSYWdhbml0c2NoCgogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkKIGRhbWFnZXMgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KCiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKIHB1cnBvc2UsIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZAogcmVkaXN0cmlidXRlIGl0IGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKCiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0CiAgICBub3QgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMKICAgIHNvZnR3YXJlIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QKICAgIGRvY3VtZW50YXRpb24gd291bGQgYmUgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KCiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0CiAgICBub3QgYmUgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgoKIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZQogICAgZGlzdHJpYnV0aW9uLgoKIFBldGVyIFJhZ2FuaXRzY2gK]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/python/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/python/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/python/css/pythoncolors.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aHRtbCB7CiAgY3Vyc29yOiB0ZXh0Owp9CgouZWRpdGJveCB7CiAgcGFkZGluZzogLjRlbTsKICBtYXJnaW46IDA7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICBmb250LXNpemU6IDEwcHQ7CiAgbGluZS1oZWlnaHQ6IDEuMWVtOwogIGNvbG9yOiBibGFjazsKfQoKcHJlLmNvZGUsIC5lZGl0Ym94IHsKICBjb2xvcjogIzY2NjY2NjsKfQoKLmVkaXRib3ggcCB7CiAgbWFyZ2luOiAwOwp9CgpzcGFuLnB5LWRlbGltaXRlciwgc3Bhbi5weS1zcGVjaWFsIHsKICBjb2xvcjogIzY2NjY2NjsKfQoKc3Bhbi5weS1vcGVyYXRvciB7CiAgY29sb3I6ICM2NjY2NjY7Cn0KCnNwYW4ucHktZXJyb3IgewogIGJhY2tncm91bmQtY29sb3I6ICM2NjAwMDA7CiAgY29sb3I6ICNGRkZGRkY7Cn0KCnNwYW4ucHkta2V5d29yZCB7CiAgY29sb3I6ICM3NzAwODg7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCnNwYW4ucHktbGl0ZXJhbCB7CiAgY29sb3I6ICMyMjg4MTE7Cn0KCnNwYW4ucHktaWRlbnRpZmllciwgc3Bhbi5weS1mdW5jICB7CiAgY29sb3I6IGJsYWNrOwp9CgpzcGFuLnB5LXR5cGUsIHNwYW4ucHktZGVjb3JhdG9yIHsKICBjb2xvcjogIzAwMDBGRjsKfQoKc3Bhbi5weS1jb21tZW50IHsKICBjb2xvcjogI0FBNzcwMDsKfQoKc3Bhbi5weS1zdHJpbmcsIHNwYW4ucHktYnl0ZXMsIHNwYW4ucHktcmF3LCBzcGFuLnB5LXVuaWNvZGUgewogIGNvbG9yOiAjQUEyMjIyOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/python/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgo8aGVhZD4KICAgIDxzY3JpcHQgc3JjPSIuLi8uLi9qcy9jb2RlbWlycm9yLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFB5dGhvbiBkZW1vbnN0cmF0aW9uPC90aXRsZT4KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIC5Db2RlTWlycm9yLWxpbmUtbnVtYmVycyB7CiAgICAgICAgd2lkdGg6IDIuMmVtOwogICAgICAgIGNvbG9yOiAjYWFhOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWU7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgcGFkZGluZzogLjRlbTsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgICAgICBmb250LXNpemU6IDEwcHQ7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuMWVtOwogICAgICB9CiAgICA8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5IHN0eWxlPSJwYWRkaW5nOiAyMHB4OyI+CjxwPgogICAgVGhpcyBpcyBhIHNpbXBsZSBkZW1vbnN0cmF0aW9uIG9mIHRoZSBQeXRob24gc3ludGF4IGhpZ2hsaWdodGluZyBtb2R1bGUKICAgIGZvciA8YSBocmVmPSJpbmRleC5odG1sIj5Db2RlTWlycm9yPC9hPi4KPC9wPgo8cD4KICAgIEZlYXR1cmVzIG9mIHRoaXMgcGFyc2VyIGluY2x1ZGU6CjwvcD4KPHVsPgogICAgPGxpPlRva2VuLWJhc2VkIHN5bnRheCBoaWdobGlnaHRpbmcgLSBjdXJyZW50bHkgdmVyeSBsaXR0bGUgbGV4aWNhbCBhbmFseXNpcyBoYXBwZW5zLiAgRmV3IGxleGljYWwgZXJyb3JzIHdpbGwgYmUgZGV0ZWN0ZWQuPC9saT4KICAgIDxsaT5Vc2UgdGhlIG5vcm1hbCBpbmRlbnRhdGlvbiBtb2RlIHRvIGVuZm9yY2UgcmVndWxhciBpbmRlbnRhdGlvbiwgb3RoZXJ3aXNlIHRoZSAic2hpZnQiIGluZGVudGF0aW9uIG1vZGUgd2lsbCBnaXZlIHlvdSBtb3JlIGZsZXhpYmlsaXR5LjwvbGk+CiAgICA8bGk+UGFyc2VyIE9wdGlvbnM6CiAgICAgICAgPHVsPgogICAgICAgICAgICA8bGk+cHl0aG9uVmVyc2lvbiAoSW50ZWdlcikgLSAyIG9yIDMgdG8gaW5kaWNhdGUgd2hpY2ggdmVyc2lvbiBvZiBQeXRob24gdG8gcGFyc2UuICBEZWZhdWx0ID0gMjwvbGk+CiAgICAgICAgICAgIDxsaT5zdHJpY3RFcnJvcnMgKEJvb2wpIC0gdHJ1ZSB0byBoaWdobGlnaHQgZXJyb3JzIHRoYXQgbWF5IG5vdCBiZSBQeXRob24gZXJyb3JzIGJ1dCBjYXVzZSBjb25mdXNpb24gZm9yIHRoaXMgcGFyc2VyLiBEZWZhdWx0ID0gdHJ1ZTwvbGk+CiAgICAgICAgPC91bD4KICAgIDwvbGk+CjwvdWw+CjxwPldyaXR0ZW4gYnkgVGltb3RoeSBGYXJyZWxsICg8YSBocmVmPSJMSUNFTlNFIj5saWNlbnNlPC9hPikuIFNwZWNpYWwKdGhhbmtzIHRvIEFkYW0gQnJhbmQgYW5kIE1hcmlqbiBIYXZlcmJla2UgZm9yIHRoZWlyIGhlbHAgaW4gZGVidWdnaW5nCmFuZCBwcm92aWRpbmcgZm9yIHRoaXMgcGFyc2VyLjwvcD4KCjxkaXYgc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyBwYWRkaW5nOiAwcHg7Ij4KPHRleHRhcmVhIGlkPSJjb2RlIiBjb2xzPSIxMDAiIHJvd3M9IjIwIiBzdHlsZT0id2lkdGg6MTAwJSI+CiMgTGl0ZXJhbHMKMTIzNAowLjBlMTAxCi4xMjMKMGIwMTAxMDAxMTEwMAowbzAxMjM0NTY3CjB4MDk4NzY1NDMyMWFiY2RlZgojIEVycm9yIExpdGVyYWxzCi4wYjAwMAowLjBlCjBlCgojIFN0cmluZyBMaXRlcmFscwonRm9yXCcnCiJHb2RcIiIKIiIic28gbG92ZWQKdGhlIHdvcmxkIiIiCicnJ3RoYXQgaGUgZ2F2ZQpoaXMgb25seSBiZWdvdHRlblwnICcnJwondGhhdCB3aG9zb2V2ZXIgYmVsaWV2ZXRoIFwKaW4gaGltJwonJwoKIyBJZGVudGlmaWVycwpfX2FfXwphLmIKYS5iLmMKIyBFcnJvciBJZGVudGlmaWVycwphLgoKIyBPcGVyYXRvcnMKKyAtICogLyAlICYgfCBeIH4gPCA+Cj09ICE9IDw9ID49IDw+IDw8ID4+IC8vICoqCmFuZCBvciBub3QgaW4gaXMKCiMgRGVsaW1pdGVycwooKSBbXSB7fSAsIDogYCA9IDsgQCAuICMgQXQtc2lnbnMgYW5kIHBlcmlvZHMgcmVxdWlyZSBjb250ZXh0Cis9IC09ICo9IC89ICU9ICY9IHw9IF49Ci8vPSA+Pj0gPDw9ICoqPQoKIyBLZXl3b3JkcwphcyBhc3NlcnQgYnJlYWsgY2xhc3MgY29udGludWUgZGVmIGRlbCBlbGlmIGVsc2UgZXhjZXB0CmZpbmFsbHkgZm9yIGZyb20gZ2xvYmFsIGlmIGltcG9ydCBsYW1iZGEgcGFzcyByYWlzZQpyZXR1cm4gdHJ5IHdoaWxlIHdpdGggeWllbGQKCiMgUHl0aG9uIDIgS2V5d29yZHMgKG90aGVyd2lzZSBJZGVudGlmaWVycykKZXhlYyBwcmludAoKIyBQeXRob24gMyBLZXl3b3JkcyAob3RoZXJ3aXNlIElkZW50aWZpZXJzKQpub25sb2NhbAoKIyBUeXBlcwpib29sIGNsYXNzbWV0aG9kIGNvbXBsZXggZGljdCBlbnVtZXJhdGUgZmxvYXQgZnJvemVuc2V0IGludCBsaXN0IG9iamVjdApwcm9wZXJ0eSByZXZlcnNlZCBzZXQgc2xpY2Ugc3RhdGljbWV0aG9kIHN0ciBzdXBlciB0dXBsZSB0eXBlCgojIFB5dGhvbiAyIFR5cGVzIChvdGhlcndpc2UgSWRlbnRpZmllcnMpCmJhc2VzdHJpbmcgYnVmZmVyIGZpbGUgbG9uZyB1bmljb2RlIHhyYW5nZQoKIyBQeXRob24gMyBUeXBlcyAob3RoZXJ3aXNlIElkZW50aWZpZXJzKQpieXRlYXJyYXkgYnl0ZXMgZmlsdGVyIG1hcCBtZW1vcnl2aWV3IG9wZW4gcmFuZ2UgemlwCgojIEV4YW1wbGUgU3RyaWN0IEVycm9ycwpkZWYgZG9lc05vdGhpbmcoKToKICAgcGFzcyAjIGluZGVudFVuaXQgaXMgc2V0IHRvIDQgYnV0IHRoaXMgbGluZSBpcyBpbmRlbnRlZCAzCgojIFNvbWUgRXhhbXBsZSBjb2RlCmltcG9ydCBvcwpmcm9tIHBhY2thZ2UgaW1wb3J0IFBhcmVudENsYXNzCgpAbm9uc2Vuc2VEZWNvcmF0b3IKZGVmIGRvZXNOb3RoaW5nKCk6CiAgICBwYXNzCgpjbGFzcyBFeGFtcGxlQ2xhc3MoUGFyZW50Q2xhc3MpOgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIGV4YW1wbGUoaW5wdXRTdHIpOgogICAgICAgIGEgPSBsaXN0KGlucHV0U3RyKQogICAgICAgIGEucmV2ZXJzZSgpCiAgICAgICAgcmV0dXJuICcnLmpvaW4oYSkKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbWl4aW4gPSAnSGVsbG8nKToKICAgICAgICBzZWxmLm1peGluID0gbWl4aW4KCjwvdGV4dGFyZWE+CjwvZGl2PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKCdjb2RlJywgewogICAgICAgIHBhcnNlcmZpbGU6IFsiLi4vY29udHJpYi9weXRob24vanMvcGFyc2VweXRob24uanMiXSwKICAgICAgICBzdHlsZXNoZWV0OiAiY3NzL3B5dGhvbmNvbG9ycy5jc3MiLAogICAgICAgIHBhdGg6ICIuLi8uLi9qcy8iLAogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIHRleHRXcmFwcGluZzogZmFsc2UsCiAgICAgICAgaW5kZW50VW5pdDogNCwKICAgICAgICBwYXJzZXJDb25maWc6IHsncHl0aG9uVmVyc2lvbic6IDIsICdzdHJpY3RFcnJvcnMnOiB0cnVlfQogICAgfSk7Cjwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/python/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/python/js/parsepython.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dmFyIFB5dGhvblBhcnNlciA9IEVkaXRvci5QYXJzZXIgPSAoZnVuY3Rpb24oKSB7CiAgICBmdW5jdGlvbiB3b3JkUmVnZXhwKHdvcmRzKSB7CiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiICsgd29yZHMuam9pbigifCIpICsgIikkIik7CiAgICB9CiAgICB2YXIgREVMSU1JVEVSQ0xBU1MgPSAncHktZGVsaW1pdGVyJzsKICAgIHZhciBMSVRFUkFMQ0xBU1MgPSAncHktbGl0ZXJhbCc7CiAgICB2YXIgRVJST1JDTEFTUyA9ICdweS1lcnJvcic7CiAgICB2YXIgT1BFUkFUT1JDTEFTUyA9ICdweS1vcGVyYXRvcic7CiAgICB2YXIgSURFTlRJRklFUkNMQVNTID0gJ3B5LWlkZW50aWZpZXInOwogICAgdmFyIFNUUklOR0NMQVNTID0gJ3B5LXN0cmluZyc7CiAgICB2YXIgQllURVNDTEFTUyA9ICdweS1ieXRlcyc7CiAgICB2YXIgVU5JQ09ERUNMQVNTID0gJ3B5LXVuaWNvZGUnOwogICAgdmFyIFJBV0NMQVNTID0gJ3B5LXJhdyc7CiAgICB2YXIgTk9STUFMQ09OVEVYVCA9ICdub3JtYWwnOwogICAgdmFyIFNUUklOR0NPTlRFWFQgPSAnc3RyaW5nJzsKICAgIHZhciBzaW5nbGVPcGVyYXRvcnMgPSAnKy0qLyUmfF5+PD4nOwogICAgdmFyIGRvdWJsZU9wZXJhdG9ycyA9IHdvcmRSZWdleHAoWyc9PScsICchPScsICdcXDw9JywgJ1xcPj0nLCAnXFw8XFw+JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXFw8XFw8JywgJ1xcPlxcPicsICdcXC9cXC8nLCAnXFwqXFwqJ10pOwogICAgdmFyIHNpbmdsZURlbGltaXRlcnMgPSAnKClbXXt9QCw6YD07JzsKICAgIHZhciBkb3VibGVEZWxpbWl0ZXJzID0gWydcXCs9JywgJ1xcLT0nLCAnXFwqPScsICcvPScsICclPScsICcmPScsICdcXHw9JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcXF49J107CiAgICB2YXIgdHJpcGxlRGVsaW1pdGVycyA9IHdvcmRSZWdleHAoWycvLz0nLCdcXD5cXD49JywnXFw8XFw8PScsJ1xcKlxcKj0nXSk7CiAgICB2YXIgc2luZ2xlU3RhcnRlcnMgPSBzaW5nbGVPcGVyYXRvcnMgKyBzaW5nbGVEZWxpbWl0ZXJzICsgJz0hJzsKICAgIHZhciBkb3VibGVTdGFydGVycyA9ICc9PD4qLyc7CiAgICB2YXIgaWRlbnRpZmllclN0YXJ0ZXJzID0gL1tfQS1aYS16XS87CgogICAgdmFyIHdvcmRPcGVyYXRvcnMgPSB3b3JkUmVnZXhwKFsnYW5kJywgJ29yJywgJ25vdCcsICdpcycsICdpbiddKTsKICAgIHZhciBjb21tb25rZXl3b3JkcyA9IFsnYXMnLCAnYXNzZXJ0JywgJ2JyZWFrJywgJ2NsYXNzJywgJ2NvbnRpbnVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAnZGVmJywgJ2RlbCcsICdlbGlmJywgJ2Vsc2UnLCAnZXhjZXB0JywgJ2ZpbmFsbHknLAogICAgICAgICAgICAgICAgICAgICAgICAgICdmb3InLCAnZnJvbScsICdnbG9iYWwnLCAnaWYnLCAnaW1wb3J0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFtYmRhJywgJ3Bhc3MnLCAncmFpc2UnLCAncmV0dXJuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAndHJ5JywgJ3doaWxlJywgJ3dpdGgnLCAneWllbGQnXTsKICAgIHZhciBjb21tb250eXBlcyA9IFsnYm9vbCcsICdjbGFzc21ldGhvZCcsICdjb21wbGV4JywgJ2RpY3QnLCAnZW51bWVyYXRlJywKICAgICAgICAgICAgICAgICAgICAgICAnZmxvYXQnLCAnZnJvemVuc2V0JywgJ2ludCcsICdsaXN0JywgJ29iamVjdCcsCiAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BlcnR5JywgJ3JldmVyc2VkJywgJ3NldCcsICdzbGljZScsICdzdGF0aWNtZXRob2QnLAogICAgICAgICAgICAgICAgICAgICAgICdzdHInLCAnc3VwZXInLCAndHVwbGUnLCAndHlwZSddOwogICAgdmFyIHB5MiA9IHsndHlwZXMnOiBbJ2Jhc2VzdHJpbmcnLCAnYnVmZmVyJywgJ2ZpbGUnLCAnbG9uZycsICd1bmljb2RlJywKICAgICAgICAgICAgICAgICAgICAgICAgICd4cmFuZ2UnXSwKICAgICAgICAgICAgICAgJ2tleXdvcmRzJzogWydleGVjJywgJ3ByaW50J10sCiAgICAgICAgICAgICAgICd2ZXJzaW9uJzogMiB9OwogICAgdmFyIHB5MyA9IHsndHlwZXMnOiBbJ2J5dGVhcnJheScsICdieXRlcycsICdmaWx0ZXInLCAnbWFwJywgJ21lbW9yeXZpZXcnLAogICAgICAgICAgICAgICAgICAgICAgICAgJ29wZW4nLCAncmFuZ2UnLCAnemlwJ10sCiAgICAgICAgICAgICAgICdrZXl3b3Jkcyc6IFsnbm9ubG9jYWwnXSwKICAgICAgICAgICAgICAgJ3ZlcnNpb24nOiAzfTsKCiAgICB2YXIgcHksIGtleXdvcmRzLCB0eXBlcywgc3RyaW5nU3RhcnRlcnMsIHN0cmluZ1R5cGVzLCBjb25maWc7CgogICAgZnVuY3Rpb24gY29uZmlndXJlKGNvbmYpIHsKICAgICAgICBpZiAoIWNvbmYuaGFzT3duUHJvcGVydHkoJ3B5dGhvblZlcnNpb24nKSkgewogICAgICAgICAgICBjb25mLnB5dGhvblZlcnNpb24gPSAyOwogICAgICAgIH0KICAgICAgICBpZiAoIWNvbmYuaGFzT3duUHJvcGVydHkoJ3N0cmljdEVycm9ycycpKSB7CiAgICAgICAgICAgIGNvbmYuc3RyaWN0RXJyb3JzID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKGNvbmYucHl0aG9uVmVyc2lvbiAhPSAyICYmIGNvbmYucHl0aG9uVmVyc2lvbiAhPSAzKSB7CiAgICAgICAgICAgIGFsZXJ0KCdDb2RlTWlycm9yOiBVbmtub3duIFB5dGhvbiBWZXJzaW9uICInICsKICAgICAgICAgICAgICAgICAgY29uZi5weXRob25WZXJzaW9uICsKICAgICAgICAgICAgICAgICAgJyIsIGRlZmF1bHRpbmcgdG8gUHl0aG9uIDIueC4nKTsKICAgICAgICAgICAgY29uZi5weXRob25WZXJzaW9uID0gMjsKICAgICAgICB9CiAgICAgICAgaWYgKGNvbmYucHl0aG9uVmVyc2lvbiA9PSAzKSB7CiAgICAgICAgICAgIHB5ID0gcHkzOwogICAgICAgICAgICBzdHJpbmdTdGFydGVycyA9IC9bXCdcInJiUkJdLzsKICAgICAgICAgICAgc3RyaW5nVHlwZXMgPSAvW3JiXS87CiAgICAgICAgICAgIGRvdWJsZURlbGltaXRlcnMucHVzaCgnXFwtXFw+Jyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcHkgPSBweTI7CiAgICAgICAgICAgIHN0cmluZ1N0YXJ0ZXJzID0gL1tcJ1wiUlVydV0vOwogICAgICAgICAgICBzdHJpbmdUeXBlcyA9IC9bcnVdLzsKICAgICAgICB9CiAgICAgICAgY29uZmlnID0gY29uZjsKICAgICAgICBrZXl3b3JkcyA9IHdvcmRSZWdleHAoY29tbW9ua2V5d29yZHMuY29uY2F0KHB5LmtleXdvcmRzKSk7CiAgICAgICAgdHlwZXMgPSB3b3JkUmVnZXhwKGNvbW1vbnR5cGVzLmNvbmNhdChweS50eXBlcykpOwogICAgICAgIGRvdWJsZURlbGltaXRlcnMgPSB3b3JkUmVnZXhwKGRvdWJsZURlbGltaXRlcnMpOwogICAgfQoKICAgIHZhciB0b2tlbml6ZVB5dGhvbiA9IChmdW5jdGlvbigpIHsKICAgICAgICBmdW5jdGlvbiBub3JtYWwoc291cmNlLCBzZXRTdGF0ZSkgewogICAgICAgICAgICB2YXIgc3RyaW5nRGVsaW0sIHRocmVlU3RyLCB0ZW1wLCB0eXBlLCB3b3JkLCBwb3NzaWJsZSA9IHt9OwogICAgICAgICAgICB2YXIgY2ggPSBzb3VyY2UubmV4dCgpOwogICAgICAgICAgICAKICAgICAgICAgICAgZnVuY3Rpb24gZmlsdGVyUG9zc2libGUodG9rZW4sIHN0eWxlSWZQb3NzaWJsZSkgewogICAgICAgICAgICAgICAgaWYgKCFwb3NzaWJsZS5zdHlsZSAmJiAhcG9zc2libGUuY29udGVudCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbjsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mKHRva2VuKSA9PSBTVFJJTkdDT05URVhUKSB7CiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB7Y29udGVudDogc291cmNlLmdldCgpLCBzdHlsZTogdG9rZW59OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHBvc3NpYmxlLnN0eWxlIHx8IHN0eWxlSWZQb3NzaWJsZSkgewogICAgICAgICAgICAgICAgICAgIHRva2VuLnN0eWxlID0gc3R5bGVJZlBvc3NpYmxlID8gc3R5bGVJZlBvc3NpYmxlIDogcG9zc2libGUuc3R5bGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAocG9zc2libGUuY29udGVudCkgewogICAgICAgICAgICAgICAgICAgIHRva2VuLmNvbnRlbnQgPSBwb3NzaWJsZS5jb250ZW50ICsgdG9rZW4uY29udGVudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHBvc3NpYmxlID0ge307CiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEhhbmRsZSBjb21tZW50cwogICAgICAgICAgICBpZiAoY2ggPT0gJyMnKSB7CiAgICAgICAgICAgICAgICB3aGlsZSAoIXNvdXJjZS5lbmRPZkxpbmUoKSkgewogICAgICAgICAgICAgICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gJ3B5LWNvbW1lbnQnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEhhbmRsZSBzcGVjaWFsIGNoYXJzCiAgICAgICAgICAgIGlmIChjaCA9PSAnXFwnKSB7CiAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZS5lbmRPZkxpbmUoKSkgewogICAgICAgICAgICAgICAgICAgIHZhciB3aGl0ZXNwYWNlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIXNvdXJjZS5lbmRPZkxpbmUoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZighKC9bXHNcdTAwYTBdLy50ZXN0KHNvdXJjZS5uZXh0KCkpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpdGVzcGFjZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghd2hpdGVzcGFjZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JDTEFTUzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gJ3B5LXNwZWNpYWwnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEhhbmRsZSBvcGVyYXRvcnMgYW5kIGRlbGltaXRlcnMKICAgICAgICAgICAgaWYgKHNpbmdsZVN0YXJ0ZXJzLmluZGV4T2YoY2gpICE9IC0xIHx8IChjaCA9PSAiLiIgJiYgIXNvdXJjZS5tYXRjaGVzKC9cZC8pKSkgewogICAgICAgICAgICAgICAgaWYgKGRvdWJsZVN0YXJ0ZXJzLmluZGV4T2Yoc291cmNlLnBlZWsoKSkgIT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICB0ZW1wID0gY2ggKyBzb3VyY2UucGVlaygpOwogICAgICAgICAgICAgICAgICAgIC8vIEl0IG11c3QgYmUgYSBkb3VibGUgZGVsaW1pdGVyIG9yIG9wZXJhdG9yIG9yIHRyaXBsZSBkZWxpbWl0ZXIKICAgICAgICAgICAgICAgICAgICBpZiAoZG91YmxlT3BlcmF0b3JzLnRlc3QodGVtcCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRDaGFyID0gc291cmNlLnBlZWsoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRDaGFyICYmIHRyaXBsZURlbGltaXRlcnMudGVzdCh0ZW1wICsgbmV4dENoYXIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERFTElNSVRFUkNMQVNTOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QRVJBVE9SQ0xBU1M7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRvdWJsZURlbGltaXRlcnMudGVzdCh0ZW1wKSkgewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gREVMSU1JVEVSQ0xBU1M7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gSXQgbXVzdCBiZSBhIHNpbmdsZSBkZWxpbWl0ZXIgb3Igb3BlcmF0b3IKICAgICAgICAgICAgICAgIGlmIChzaW5nbGVPcGVyYXRvcnMuaW5kZXhPZihjaCkgIT0gLTEgfHwgY2ggPT0gIi4iKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QRVJBVE9SQ0xBU1M7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNpbmdsZURlbGltaXRlcnMuaW5kZXhPZihjaCkgIT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ0AnICYmIHNvdXJjZS5tYXRjaGVzKC9cdy8pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9bXHdcZF9dLyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7c3R5bGU6J3B5LWRlY29yYXRvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDogc291cmNlLmdldCgpfTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gREVMSU1JVEVSQ0xBU1M7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JDTEFTUzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBIYW5kbGUgbnVtYmVyIGxpdGVyYWxzCiAgICAgICAgICAgIGlmICgvXGQvLnRlc3QoY2gpIHx8IChjaCA9PSAiLiIgJiYgc291cmNlLm1hdGNoZXMoL1xkLykpKSB7CiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICcwJyAmJiAhc291cmNlLmVuZE9mTGluZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzb3VyY2UucGVlaygpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ28nOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdPJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvWzAtN10vKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXJQb3NzaWJsZShMSVRFUkFMQ0xBU1MsIEVSUk9SQ0xBU1MpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd4JzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnWCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1swLTlBLUZhLWZdLyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsdGVyUG9zc2libGUoTElURVJBTENMQVNTLCBFUlJPUkNMQVNTKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnYic6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0InOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9bMDFdLyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsdGVyUG9zc2libGUoTElURVJBTENMQVNTLCBFUlJPUkNMQVNTKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvXGQvKTsKICAgICAgICAgICAgICAgIGlmIChjaCAhPSAnLicgJiYgc291cmNlLnBlZWsoKSA9PSAnLicpIHsKICAgICAgICAgICAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgICAgICAgICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9cZC8pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gR3JhYiBhbiBleHBvbmVudAogICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5tYXRjaGVzKC9lL2kpKSB7CiAgICAgICAgICAgICAgICAgICAgc291cmNlLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLnBlZWsoKSA9PSAnKycgfHwgc291cmNlLnBlZWsoKSA9PSAnLScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5tYXRjaGVzKC9cZC8pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9cZC8pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXJQb3NzaWJsZShFUlJPUkNMQVNTKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBHcmFiIGEgY29tcGxleCBudW1iZXIKICAgICAgICAgICAgICAgIGlmIChzb3VyY2UubWF0Y2hlcygvai9pKSkgewogICAgICAgICAgICAgICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlclBvc3NpYmxlKExJVEVSQUxDTEFTUyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gSGFuZGxlIHN0cmluZ3MKICAgICAgICAgICAgaWYgKHN0cmluZ1N0YXJ0ZXJzLnRlc3QoY2gpKSB7CiAgICAgICAgICAgICAgICB2YXIgcGVlayA9IHNvdXJjZS5wZWVrKCk7CiAgICAgICAgICAgICAgICB2YXIgc3RyaW5nVHlwZSA9IFNUUklOR0NMQVNTOwogICAgICAgICAgICAgICAgaWYgKChzdHJpbmdUeXBlcy50ZXN0KGNoKSkgJiYgKHBlZWsgPT0gJyInIHx8IHBlZWsgPT0gIiciKSkgewogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY2gudG9Mb3dlckNhc2UoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdiJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1R5cGUgPSBCWVRFU0NMQVNTOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3InOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVHlwZSA9IFJBV0NMQVNTOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3UnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVHlwZSA9IFVOSUNPREVDTEFTUzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjaCA9IHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgc3RyaW5nRGVsaW0gPSBjaDsKICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLnBlZWsoKSAhPSBzdHJpbmdEZWxpbSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShpblN0cmluZyhzdHJpbmdUeXBlLCBzdHJpbmdEZWxpbSkpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLnBlZWsoKSA9PSBzdHJpbmdEZWxpbSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVlU3RyID0gc3RyaW5nRGVsaW0gKyBzdHJpbmdEZWxpbSArIHN0cmluZ0RlbGltOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoaW5TdHJpbmcoc3RyaW5nVHlwZSwgdGhyZWVTdHIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZ1R5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICInIiB8fCBjaCA9PSAnIicpIHsKICAgICAgICAgICAgICAgICAgICBzdHJpbmdEZWxpbSA9IGNoOwogICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UucGVlaygpICE9IHN0cmluZ0RlbGltKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKGluU3RyaW5nKHN0cmluZ1R5cGUsIHN0cmluZ0RlbGltKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UucGVlaygpID09IHN0cmluZ0RlbGltKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWVTdHIgPSBzdHJpbmdEZWxpbSArIHN0cmluZ0RlbGltICsgc3RyaW5nRGVsaW07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShpblN0cmluZyhzdHJpbmdUeXBlLCB0aHJlZVN0cikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nVHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBIYW5kbGUgSWRlbnRpZmllcgogICAgICAgICAgICBpZiAoaWRlbnRpZmllclN0YXJ0ZXJzLnRlc3QoY2gpKSB7CiAgICAgICAgICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvW1x3XGRfXS8pOwogICAgICAgICAgICAgICAgd29yZCA9IHNvdXJjZS5nZXQoKTsKICAgICAgICAgICAgICAgIGlmICh3b3JkT3BlcmF0b3JzLnRlc3Qod29yZCkpIHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gT1BFUkFUT1JDTEFTUzsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5d29yZHMudGVzdCh3b3JkKSkgewogICAgICAgICAgICAgICAgICAgIHR5cGUgPSAncHkta2V5d29yZCc7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVzLnRlc3Qod29yZCkpIHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gJ3B5LXR5cGUnOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gSURFTlRJRklFUkNMQVNTOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChzb3VyY2UucGVlaygpID09ICcuJykgewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLm1hdGNoZXMoaWRlbnRpZmllclN0YXJ0ZXJzKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1tcd1xkXS8pOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IEVSUk9SQ0xBU1M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB3b3JkID0gd29yZCArIHNvdXJjZS5nZXQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXJQb3NzaWJsZSh7c3R5bGU6IHR5cGUsIGNvbnRlbnQ6IHdvcmR9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gUmVnaXN0ZXIgRG9sbGFyIHNpZ24gYW5kIFF1ZXN0aW9uIG1hcmsgYXMgZXJyb3JzLiBBbHdheXMhCiAgICAgICAgICAgIGlmICgvXCRcPy8udGVzdChjaCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXJQb3NzaWJsZShFUlJPUkNMQVNTKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGZpbHRlclBvc3NpYmxlKEVSUk9SQ0xBU1MpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gaW5TdHJpbmcoc3R5bGUsIHRlcm1pbmF0b3IpIHsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSwgc2V0U3RhdGUpIHsKICAgICAgICAgICAgICAgIHZhciBtYXRjaGVzID0gW107CiAgICAgICAgICAgICAgICB2YXIgZm91bmQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHdoaWxlICghZm91bmQgJiYgIXNvdXJjZS5lbmRPZkxpbmUoKSkgewogICAgICAgICAgICAgICAgICAgIHZhciBjaCA9IHNvdXJjZS5uZXh0KCksIG5ld01hdGNoZXMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGVzY2FwZWQgY2hhcmFjdGVycwogICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnXFwnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UucGVlaygpID09ICdcbicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gc291cmNlLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBzb3VyY2UubmV4dCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gdGVybWluYXRvci5jaGFyQXQoMCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKHRlcm1pbmF0b3IpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hdGNoZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gbWF0Y2hlc1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoLmNoYXJBdCgwKSA9PSBjaCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUobm9ybWFsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld01hdGNoZXMucHVzaChtYXRjaC5zbGljZSgxKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcyA9IG5ld01hdGNoZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gc3R5bGU7CiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlLCBzdGFydFN0YXRlKSB7CiAgICAgICAgICAgIHJldHVybiB0b2tlbml6ZXIoc291cmNlLCBzdGFydFN0YXRlIHx8IG5vcm1hbCk7CiAgICAgICAgfTsKICAgIH0pKCk7CgogICAgZnVuY3Rpb24gcGFyc2VQeXRob24oc291cmNlLCBiYXNlY29sdW1uKSB7CiAgICAgICAgaWYgKCFrZXl3b3JkcykgewogICAgICAgICAgICBjb25maWd1cmUoe30pOwogICAgICAgIH0KICAgICAgICBiYXNlY29sdW1uID0gYmFzZWNvbHVtbiB8fCAwOwoKICAgICAgICB2YXIgdG9rZW5zID0gdG9rZW5pemVQeXRob24oc291cmNlKTsKICAgICAgICB2YXIgbGFzdFRva2VuID0gbnVsbDsKICAgICAgICB2YXIgY29sdW1uID0gYmFzZWNvbHVtbjsKICAgICAgICB2YXIgY29udGV4dCA9IHtwcmV2OiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgIGVuZE9mU2NvcGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0TmV3U2NvcGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBiYXNlY29sdW1uLAogICAgICAgICAgICAgICAgICAgICAgIG5leHQ6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogTk9STUFMQ09OVEVYVAogICAgICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIHB1c2hDb250ZXh0KGxldmVsLCB0eXBlKSB7CiAgICAgICAgICAgIHR5cGUgPSB0eXBlID8gdHlwZSA6IE5PUk1BTENPTlRFWFQ7CiAgICAgICAgICAgIGNvbnRleHQgPSB7cHJldjogY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICBlbmRPZlNjb3BlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICBzdGFydE5ld1Njb3BlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogbGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICAgbmV4dDogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0eXBlCiAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHBvcENvbnRleHQocmVtb3ZlKSB7CiAgICAgICAgICAgIHJlbW92ZSA9IHJlbW92ZSA/IHJlbW92ZSA6IGZhbHNlOwogICAgICAgICAgICBpZiAoY29udGV4dC5wcmV2KSB7CiAgICAgICAgICAgICAgICBpZiAocmVtb3ZlKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGV4dCA9IGNvbnRleHQucHJldjsKICAgICAgICAgICAgICAgICAgICBjb250ZXh0Lm5leHQgPSBudWxsOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnByZXYubmV4dCA9IGNvbnRleHQ7CiAgICAgICAgICAgICAgICAgICAgY29udGV4dCA9IGNvbnRleHQucHJldjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gaW5kZW50UHl0aG9uKGNvbnRleHQpIHsKICAgICAgICAgICAgdmFyIHRlbXA7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihuZXh0Q2hhcnMsIGN1cnJlbnRMZXZlbCwgZGlyZWN0aW9uKSB7CiAgICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09PSBudWxsIHx8IGRpcmVjdGlvbiA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRDaGFycykgewogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY29udGV4dC5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0ID0gY29udGV4dC5uZXh0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmxldmVsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoZGlyZWN0aW9uID09PSB0cnVlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMZXZlbCA9PSBjb250ZXh0LmxldmVsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0Lm5leHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0Lm5leHQubGV2ZWw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5sZXZlbDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBjb250ZXh0OwogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAodGVtcC5wcmV2ICYmIHRlbXAucHJldi5sZXZlbCA+IGN1cnJlbnRMZXZlbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9IHRlbXAucHJldjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGVtcC5sZXZlbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudExldmVsID4gY29udGV4dC5sZXZlbCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5sZXZlbDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQucHJldikgewogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gY29udGV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRlbXAucHJldiAmJiB0ZW1wLnByZXYubGV2ZWwgPj0gY3VycmVudExldmVsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gdGVtcC5wcmV2OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wLnByZXYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZW1wLnByZXYubGV2ZWw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGVtcC5sZXZlbDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmxldmVsOwogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgdmFyIGl0ZXIgPSB7CiAgICAgICAgICAgIG5leHQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIHRva2VuID0gdG9rZW5zLm5leHQoKTsKICAgICAgICAgICAgICAgIHZhciB0eXBlID0gdG9rZW4uc3R5bGU7CiAgICAgICAgICAgICAgICB2YXIgY29udGVudCA9IHRva2VuLmNvbnRlbnQ7CgogICAgICAgICAgICAgICAgaWYgKGxhc3RUb2tlbikgewogICAgICAgICAgICAgICAgICAgIGlmIChsYXN0VG9rZW4uY29udGVudCA9PSAnZGVmJyAmJiB0eXBlID09IElERU5USUZJRVJDTEFTUykgewogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi5zdHlsZSA9ICdweS1mdW5jJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RUb2tlbi5jb250ZW50ID09ICdcbicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRlbXBDdHggPSBjb250ZXh0OwogICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgYSBkaWZmZXJlbnQgc2NvcGUKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gJ3doaXRlc3BhY2UnICYmIGNvbnRleHQudHlwZSA9PSBOT1JNQUxDT05URVhUKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4udmFsdWUubGVuZ3RoIDwgY29udGV4dC5sZXZlbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0b2tlbi52YWx1ZS5sZW5ndGggPCBjb250ZXh0LmxldmVsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcENvbnRleHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbi52YWx1ZS5sZW5ndGggIT0gY29udGV4dC5sZXZlbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0ID0gdGVtcEN0eDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5zdHJpY3RFcnJvcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLnN0eWxlID0gRVJST1JDTEFTUzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQubmV4dCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQubGV2ZWwgIT09IGJhc2Vjb2x1bW4gJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnR5cGUgPT0gTk9STUFMQ09OVEVYVCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGJhc2Vjb2x1bW4gIT09IGNvbnRleHQubGV2ZWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3BDb250ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQubGV2ZWwgIT09IGJhc2Vjb2x1bW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0ID0gdGVtcEN0eDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnN0cmljdEVycm9ycykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi5zdHlsZSA9IEVSUk9SQ0xBU1M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBTY29wZSBDaGFuZ2VzCiAgICAgICAgICAgICAgICBzd2l0Y2godHlwZSkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgU1RSSU5HQ0xBU1M6CiAgICAgICAgICAgICAgICAgICAgY2FzZSBCWVRFU0NMQVNTOgogICAgICAgICAgICAgICAgICAgIGNhc2UgUkFXQ0xBU1M6CiAgICAgICAgICAgICAgICAgICAgY2FzZSBVTklDT0RFQ0xBU1M6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LnR5cGUgIT09IFNUUklOR0NPTlRFWFQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hDb250ZXh0KGNvbnRleHQubGV2ZWwgKyAxLCBTVFJJTkdDT05URVhUKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dC50eXBlID09PSBTVFJJTkdDT05URVhUKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3BDb250ZXh0KHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc3dpdGNoKGNvbnRlbnQpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlICcuJzoKICAgICAgICAgICAgICAgICAgICBjYXNlICdAJzoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlc2UgZGVsaW1pdGVycyBkb24ndCBhcHBlYXIgYnkgdGhlbXNlbHZlcwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudCAhPT0gdG9rZW4udmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLnN0eWxlID0gRVJST1JDTEFTUzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICc6JzoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29sb25zIG9ubHkgZGVsaW1pdCBzY29wZSBpbnNpZGUgYSBub3JtYWwgc2NvcGUKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQudHlwZSA9PT0gTk9STUFMQ09OVEVYVCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zdGFydE5ld1Njb3BlID0gY29udGV4dC5sZXZlbCtpbmRlbnRVbml0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgJygnOgogICAgICAgICAgICAgICAgICAgIGNhc2UgJ1snOgogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3snOgogICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSBzdGFydCBhIHNlcXVlbmNlIHNjb3BlCiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hDb250ZXh0KGNvbHVtbiArIGNvbnRlbnQubGVuZ3RoLCAnc2VxdWVuY2UnKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnKSc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnXSc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnfSc6CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIGVuZCBhIHNlcXVlbmNlIHNjb3BlCiAgICAgICAgICAgICAgICAgICAgICAgIHBvcENvbnRleHQodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Bhc3MnOgogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3JldHVybic6CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIGVuZCBhIG5vcm1hbCBzY29wZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dC50eXBlID09PSBOT1JNQUxDT05URVhUKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmVuZE9mU2NvcGUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgJ1xuJzoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgb3VyIGNvbHVtbgogICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSBiYXNlY29sdW1uOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIGFueSBzY29wZSBjaGFuZ2VzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LmVuZE9mU2NvcGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZW5kT2ZTY29wZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wQ29udGV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQuc3RhcnROZXdTY29wZSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wID0gY29udGV4dC5zdGFydE5ld1Njb3BlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zdGFydE5ld1Njb3BlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoQ29udGV4dCh0ZW1wLCBOT1JNQUxDT05URVhUKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXdsaW5lcyByZXF1aXJlIGFuIGluZGVudGF0aW9uIGZ1bmN0aW9uIHdyYXBwZWQgaW4gYSBjbG9zdXJlIGZvciBwcm9wZXIgY29udGV4dC4KICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4uaW5kZW50YXRpb24gPSBpbmRlbnRQeXRob24oY29udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIEtlZXAgdHJhY2sgb2YgY3VycmVudCBjb2x1bW4gZm9yIGNlcnRhaW4gc2NvcGVzLgogICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQgIT0gJ1xuJykgewogICAgICAgICAgICAgICAgICAgIGNvbHVtbiArPSB0b2tlbi52YWx1ZS5sZW5ndGg7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbGFzdFRva2VuID0gdG9rZW47CiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBjb3B5OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBfY29udGV4dCA9IGNvbnRleHQsIF90b2tlblN0YXRlID0gdG9rZW5zLnN0YXRlOwogICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSkgewogICAgICAgICAgICAgICAgICAgIHRva2VucyA9IHRva2VuaXplUHl0aG9uKHNvdXJjZSwgX3Rva2VuU3RhdGUpOwogICAgICAgICAgICAgICAgICAgIGNvbnRleHQgPSBfY29udGV4dDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlcjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHJldHVybiBpdGVyOwogICAgfQoKICAgIHJldHVybiB7bWFrZTogcGFyc2VQeXRob24sCiAgICAgICAgICAgIGVsZWN0cmljQ2hhcnM6ICIiLAogICAgICAgICAgICBjb25maWd1cmU6IGNvbmZpZ3VyZX07Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/python/LICENSE</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29weXJpZ2h0IChjKSAyMDA5LCBUaW1vdGh5IEZhcnJlbGwNCkFsbCByaWdodHMgcmVzZXJ2ZWQuDQoNClRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgZm9yIHVzZSBpbiBjb25uZWN0aW9uIHdpdGggdGhlDQpDb2RlTWlycm9yIHN1aXRlIG9mIG1vZHVsZXMgYW5kIHV0aWxpdGllcywgaG9zdGVkIGFuZCBtYWludGFpbmVkDQphdCBodHRwOi8vbWFyaWpuLmhhdmVyYmVrZS5ubC9jb2RlbWlycm9yLy4NCg0KUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLA0Kd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZQ0KZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoNCg0KKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlDQogIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUNCiAgZm9sbG93aW5nIGRpc2NsYWltZXIuDQoNCiogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlDQogIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcg0KICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLg0KDQpUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQoiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MNCkZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFDQpDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsDQpJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLA0KQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOw0KTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUg0KQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUDQpMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTg0KQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFDQpQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/sql/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/sql/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/sql/css/sqlcolors.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aHRtbCB7CiAgY3Vyc29yOiB0ZXh0Owp9CgouZWRpdGJveCB7CiAgbWFyZ2luOiAuNGVtOwogIHBhZGRpbmc6IDA7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICBmb250LXNpemU6IDEwcHQ7CiAgY29sb3I6IGJsYWNrOwp9CgouZWRpdGJveCBwIHsKICBtYXJnaW46IDA7Cn0KCnNwYW4uc3FsLWtleXdvcmQgewogIGNvbG9yOiBibHVlOwp9CgpzcGFuLnNxbC12YXIgewogIGNvbG9yOiByZWQ7Cn0KCnNwYW4uc3FsLWNvbW1lbnQgewogIGNvbG9yOiAjQUE3NzAwOwp9CgpzcGFuLnNxbC1saXRlcmFsIHsKICBjb2xvcjogZ3JlZW47Cn0KCnNwYW4uc3FsLW9wZXJhdG9yIHsKICBjb2xvcjogYmx1ZTsKfQoKc3Bhbi5zcWwtd29yZCB7CiAgY29sb3I6IGJsYWNrOwp9CgpzcGFuLnNxbC1mdW5jdGlvbiB7CiAgY29sb3I6IGRhcmtvcmFuZ2U7Cn0KCnNwYW4uc3FsLXR5cGUgewogIGNvbG9yOiBwdXJwbGU7Cn0KCnNwYW4uc3FsLXNlcGFyYXRvciB7CiAgY29sb3I6ICM2NjY2NjY7Cn0KCnNwYW4uc3FsLW51bWJlciB7CiAgY29sb3I6IGRhcmtjeWFuOwp9CgoK]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/sql/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHNjcmlwdCBzcmM9Ii4uLy4uL2pzL2NvZGVtaXJyb3IuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgICA8dGl0bGU+Q29kZU1pcnJvcjogU1FMIGRlbW9uc3RyYXRpb248L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vY3NzL2RvY3MuY3NzIi8+CiAgPC9oZWFkPgogIDxib2R5IHN0eWxlPSJwYWRkaW5nOiAyMHB4OyI+Cgo8cD5EZW1vbnN0cmF0aW9uIG9mIDxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkNvZGVNaXJyb3I8L2E+J3MgU1FMCmhpZ2hsaWdodGVyLjwvcD4KCjxwPldyaXR0ZW4gYnkgSm9obiBCZW5lZGlrdHNzb24gKDxhIGhyZWY9IkxJQ0VOU0UiPmxpY2Vuc2U8L2E+KS48L3A+Cgo8ZGl2IGNsYXNzPSJib3JkZXIiPgo8dGV4dGFyZWEgaWQ9ImNvZGUiIGNvbHM9IjEyMCIgcm93cz0iNTAiPgpjcmVhdGUgdGFibGUgaWYgbm90IGV4aXN0cyB0YWJsZTEoCiAgYSAgYmlnaW50KDEzKSBub3QgbnVsbCBwcmltYXJ5IGtleSwKICBiICBjaGFyKDQpICAgIG5vdCBudWxsLAogIGMgIGNoYXIoNTApICAgbm90IG51bGwsCiAgZCAgaW50KDkpICAgICBub3QgbnVsbCwKKTsKCmluc2VydCBpbnRvIHRhYmxlMSB2YWx1ZXMgKDEyMzQ1Njc4OTAxMjMsICJiIiwgImMiLCAwKTsKCnNlbGVjdCBmcm9tX3VuaXh0aW1lKGEvMTAwMCksIGIsIGMsIG1pbihkKSBhcyBgdXNpbmdgCiAgZnJvbSB0YWJsZTEgdDEKICBsZWZ0IGpvaW4gdGFibGUyIHQyIHVzaW5nIChhKQogIC0tIGlubmVyIGpvaW4gdGFibGUzIHQzIG9uIHQzLl9hID0gdDEuYQogIGpvaW4gKAogICAgc2VsZWN0IGEsIGIsIGMKICAgIGZyb20gZGF0YQogICkgYXMgZm9vIG9uIGZvby5hID0gdDEuYQoKICB3aGVyZSBhICZndDsgMTAKICBhbmQgYiBsaWtlICclZm9vJwogIG9yIGMgPSAzLjE0MTU5CiAgYW5kIGQgJmx0OyAtMTUuNwogIG9yZGVyIGJ5IDEgZGVzYwo7CgpzZWxlY3QgQHRvdGFsIDo9IHN1bShkKSBmcm9tIGRhdGE7CjwvdGV4dGFyZWE+CjwvZGl2PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYSgnY29kZScsIHsKICAgIGhlaWdodDogIjQ1MHB4IiwKICAgIHBhcnNlcmZpbGU6ICIuLi9jb250cmliL3NxbC9qcy9wYXJzZXNxbC5qcyIsCiAgICBzdHlsZXNoZWV0OiAiY3NzL3NxbGNvbG9ycy5jc3MiLAogICAgcGF0aDogIi4uLy4uL2pzLyIsCiAgICB0ZXh0V3JhcHBpbmc6IGZhbHNlCiAgfSk7Cjwvc2NyaXB0PgoKICA8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/sql/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/contrib/sql/js/parsesql.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dmFyIFNxbFBhcnNlciA9IEVkaXRvci5QYXJzZXIgPSAoZnVuY3Rpb24oKSB7CgogIGZ1bmN0aW9uIHdvcmRSZWdleHAod29yZHMpIHsKICAgIHJldHVybiBuZXcgUmVnRXhwKCJeKD86IiArIHdvcmRzLmpvaW4oInwiKSArICIpJCIsICJpIik7CiAgfQoKICB2YXIgZnVuY3Rpb25zID0gd29yZFJlZ2V4cChbCiAgICAiYWJzIiwgImFjb3MiLCAiYWRkZGF0ZSIsICJhZXNfZW5jcnlwdCIsICJhZXNfZGVjcnlwdCIsICJhc2NpaSIsCiAgICAiYXNpbiIsICJhdGFuIiwgImF0YW4yIiwgImF2ZyIsICJiZW5jaG1hcmsiLCAiYmluIiwgImJpdF9hbmQiLAogICAgImJpdF9jb3VudCIsICJiaXRfbGVuZ3RoIiwgImJpdF9vciIsICJjYXN0IiwgImNlaWwiLCAiY2VpbGluZyIsCiAgICAiY2hhcl9sZW5ndGgiLCAiY2hhcmFjdGVyX2xlbmd0aCIsICJjb2FsZXNjZSIsICJjb25jYXQiLCAiY29uY2F0X3dzIiwKICAgICJjb25uZWN0aW9uX2lkIiwgImNvbnYiLCAiY29udmVydCIsICJjb3MiLCAiY290IiwgImNvdW50IiwgImN1cmRhdGUiLAogICAgImN1cnJlbnRfZGF0ZSIsICJjdXJyZW50X3RpbWUiLCAiY3VycmVudF90aW1lc3RhbXAiLCAiY3VycmVudF91c2VyIiwKICAgICJjdXJ0aW1lIiwgImRhdGFiYXNlIiwgImRhdGVfYWRkIiwgImRhdGVfZm9ybWF0IiwgImRhdGVfc3ViIiwKICAgICJkYXluYW1lIiwgImRheW9mbW9udGgiLCAiZGF5b2Z3ZWVrIiwgImRheW9meWVhciIsICJkZWNvZGUiLCAiZGVncmVlcyIsCiAgICAiZGVzX2VuY3J5cHQiLCAiZGVzX2RlY3J5cHQiLCAiZWx0IiwgImVuY29kZSIsICJlbmNyeXB0IiwgImV4cCIsCiAgICAiZXhwb3J0X3NldCIsICJleHRyYWN0IiwgImZpZWxkIiwgImZpbmRfaW5fc2V0IiwgImZsb29yIiwgImZvcm1hdCIsCiAgICAiZm91bmRfcm93cyIsICJmcm9tX2RheXMiLCAiZnJvbV91bml4dGltZSIsICJnZXRfbG9jayIsICJncmVhdGVzdCIsCiAgICAiZ3JvdXBfdW5pcXVlX3VzZXJzIiwgImhleCIsICJpZm51bGwiLCAiaW5ldF9hdG9uIiwgImluZXRfbnRvYSIsICJpbnN0ciIsCiAgICAiaW50ZXJ2YWwiLCAiaXNfZnJlZV9sb2NrIiwgImlzbnVsbCIsICJsYXN0X2luc2VydF9pZCIsICJsY2FzZSIsICJsZWFzdCIsCiAgICAibGVmdCIsICJsZW5ndGgiLCAibG4iLCAibG9hZF9maWxlIiwgImxvY2F0ZSIsICJsb2ciLCAibG9nMiIsICJsb2cxMCIsCiAgICAibG93ZXIiLCAibHBhZCIsICJsdHJpbSIsICJtYWtlX3NldCIsICJtYXN0ZXJfcG9zX3dhaXQiLCAibWF4IiwgIm1kNSIsCiAgICAibWlkIiwgIm1pbiIsICJtb2QiLCAibW9udGhuYW1lIiwgIm5vdyIsICJudWxsaWYiLCAib2N0IiwgIm9jdGV0X2xlbmd0aCIsCiAgICAib3JkIiwgInBhc3N3b3JkIiwgInBlcmlvZF9hZGQiLCAicGVyaW9kX2RpZmYiLCAicGkiLCAicG9zaXRpb24iLAogICAgInBvdyIsICJwb3dlciIsICJxdWFydGVyIiwgInF1b3RlIiwgInJhZGlhbnMiLCAicmFuZCIsICJyZWxlYXNlX2xvY2siLAogICAgInJlcGVhdCIsICJyZXZlcnNlIiwgInJpZ2h0IiwgInJvdW5kIiwgInJwYWQiLCAicnRyaW0iLCAic2VjX3RvX3RpbWUiLAogICAgInNlc3Npb25fdXNlciIsICJzaGEiLCAic2hhMSIsICJzaWduIiwgInNpbiIsICJzb3VuZGV4IiwgInNwYWNlIiwgInNxcnQiLAogICAgInN0ZCIsICJzdGRkZXYiLCAic3RyY21wIiwgInN1YmRhdGUiLCAic3Vic3RyaW5nIiwgInN1YnN0cmluZ19pbmRleCIsCiAgICAic3VtIiwgInN5c2RhdGUiLCAic3lzdGVtX3VzZXIiLCAidGFuIiwgInRpbWVfZm9ybWF0IiwgInRpbWVfdG9fc2VjIiwKICAgICJ0b19kYXlzIiwgInRyaW0iLCAidWNhc2UiLCAidW5pcXVlX3VzZXJzIiwgInVuaXhfdGltZXN0YW1wIiwgInVwcGVyIiwKICAgICJ1c2VyIiwgInZlcnNpb24iLCAid2VlayIsICJ3ZWVrZGF5IiwgInllYXJ3ZWVrIgogIF0pOwoKICB2YXIga2V5d29yZHMgPSB3b3JkUmVnZXhwKFsKICAgICJhbHRlciIsICJncmFudCIsICJyZXZva2UiLCAicHJpbWFyeSIsICJrZXkiLCAidGFibGUiLCAic3RhcnQiLAogICAgInRyYW5zYWN0aW9uIiwgInNlbGVjdCIsICJ1cGRhdGUiLCAiaW5zZXJ0IiwgImRlbGV0ZSIsICJjcmVhdGUiLCAiZGVzY3JpYmUiLAogICAgImZyb20iLCAiaW50byIsICJ2YWx1ZXMiLCAid2hlcmUiLCAiam9pbiIsICJpbm5lciIsICJsZWZ0IiwgIm5hdHVyYWwiLCAiYW5kIiwKICAgICJvciIsICJpbiIsICJub3QiLCAieG9yIiwgImxpa2UiLCAidXNpbmciLCAib24iLCAib3JkZXIiLCAiZ3JvdXAiLCAiYnkiLAogICAgImFzYyIsICJkZXNjIiwgImxpbWl0IiwgIm9mZnNldCIsICJ1bmlvbiIsICJhbGwiLCAiYXMiLCAiZGlzdGluY3QiLCAic2V0IiwKICAgICJjb21taXQiLCAicm9sbGJhY2siLCAicmVwbGFjZSIsICJ2aWV3IiwgImRhdGFiYXNlIiwgInNlcGFyYXRvciIsICJpZiIsCiAgICAiZXhpc3RzIiwgIm51bGwiLCAidHJ1bmNhdGUiLCAic3RhdHVzIiwgInNob3ciLCAibG9jayIsICJ1bmlxdWUiCiAgXSk7CgogIHZhciB0eXBlcyA9IHdvcmRSZWdleHAoWwogICAgImJpZ2ludCIsICJiaW5hcnkiLCAiYml0IiwgImJsb2IiLCAiYm9vbCIsICJjaGFyIiwgImNoYXJhY3RlciIsICJkYXRlIiwKICAgICJkYXRldGltZSIsICJkZWMiLCAiZGVjaW1hbCIsICJkb3VibGUiLCAiZW51bSIsICJmbG9hdCIsICJmbG9hdDQiLCAiZmxvYXQ4IiwKICAgICJpbnQiLCAiaW50MSIsICJpbnQyIiwgImludDMiLCAiaW50NCIsICJpbnQ4IiwgImludGVnZXIiLCAibG9uZyIsICJsb25nYmxvYiIsCiAgICAibG9uZ3RleHQiLCAibWVkaXVtYmxvYiIsICJtZWRpdW1pbnQiLCAibWVkaXVtdGV4dCIsICJtaWRkbGVpbnQiLCAibmNoYXIiLAogICAgIm51bWVyaWMiLCAicmVhbCIsICJzZXQiLCAic21hbGxpbnQiLCAidGV4dCIsICJ0aW1lIiwgInRpbWVzdGFtcCIsICJ0aW55YmxvYiIsCiAgICAidGlueWludCIsICJ0aW55dGV4dCIsICJ2YXJiaW5hcnkiLCAidmFyY2hhciIsICJ5ZWFyIgogIF0pOwoKICB2YXIgb3BlcmF0b3JzID0gd29yZFJlZ2V4cChbCiAgICAiOj0iLCAiPCIsICI8PSIsICI9PSIsICI8PiIsICI+IiwgIj49IiwgImxpa2UiLCAicmxpa2UiLCAiaW4iLCAieG9yIiwgImJldHdlZW4iCiAgXSk7CgogIHZhciBvcGVyYXRvckNoYXJzID0gL1sqK1wtPD49Jnw6XC9dLzsKCiAgdmFyIHRva2VuaXplU3FsID0gKGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gbm9ybWFsKHNvdXJjZSwgc2V0U3RhdGUpIHsKICAgICAgdmFyIGNoID0gc291cmNlLm5leHQoKTsKICAgICAgaWYgKGNoID09ICJAIiB8fCBjaCA9PSAiJCIpIHsKICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvW1x3XGRdLyk7CiAgICAgICAgcmV0dXJuICJzcWwtdmFyIjsKICAgICAgfQogICAgICBlbHNlIGlmIChjaCA9PSAiXCIiIHx8IGNoID09ICInIiB8fCBjaCA9PSAiYCIpIHsKICAgICAgICBzZXRTdGF0ZShpbkxpdGVyYWwoY2gpKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBlbHNlIGlmIChjaCA9PSAiLCIgfHwgY2ggPT0gIjsiKSB7CiAgICAgICAgcmV0dXJuICJzcWwtc2VwYXJhdG9yIgogICAgICB9CiAgICAgIGVsc2UgaWYgKGNoID09ICctJykgewogICAgICAgIGlmIChzb3VyY2UucGVlaygpID09ICItIikgewogICAgICAgICAgd2hpbGUgKCFzb3VyY2UuZW5kT2ZMaW5lKCkpIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICByZXR1cm4gInNxbC1jb21tZW50IjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoL1xkLy50ZXN0KHNvdXJjZS5wZWVrKCkpKSB7CiAgICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvXGQvKTsKICAgICAgICAgIGlmIChzb3VyY2UucGVlaygpID09ICcuJykgewogICAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvXGQvKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiAic3FsLW51bWJlciI7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgIHJldHVybiAic3FsLW9wZXJhdG9yIjsKICAgICAgfQogICAgICBlbHNlIGlmIChvcGVyYXRvckNoYXJzLnRlc3QoY2gpKSB7CiAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMob3BlcmF0b3JDaGFycyk7CiAgICAgICAgcmV0dXJuICJzcWwtb3BlcmF0b3IiOwogICAgICB9CiAgICAgIGVsc2UgaWYgKC9cZC8udGVzdChjaCkpIHsKICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvXGQvKTsKICAgICAgICBpZiAoc291cmNlLnBlZWsoKSA9PSAnLicpIHsKICAgICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvXGQvKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICJzcWwtbnVtYmVyIjsKICAgICAgfQogICAgICBlbHNlIGlmICgvWygpXS8udGVzdChjaCkpIHsKICAgICAgICByZXR1cm4gInNxbC1wdW5jdHVhdGlvbiI7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1tfXHdcZF0vKTsKICAgICAgICB2YXIgd29yZCA9IHNvdXJjZS5nZXQoKSwgdHlwZTsKICAgICAgICBpZiAob3BlcmF0b3JzLnRlc3Qod29yZCkpCiAgICAgICAgICB0eXBlID0gInNxbC1vcGVyYXRvciI7CiAgICAgICAgZWxzZSBpZiAoa2V5d29yZHMudGVzdCh3b3JkKSkKICAgICAgICAgIHR5cGUgPSAic3FsLWtleXdvcmQiOwogICAgICAgIGVsc2UgaWYgKGZ1bmN0aW9ucy50ZXN0KHdvcmQpKQogICAgICAgICAgdHlwZSA9ICJzcWwtZnVuY3Rpb24iOwogICAgICAgIGVsc2UgaWYgKHR5cGVzLnRlc3Qod29yZCkpCiAgICAgICAgICB0eXBlID0gInNxbC10eXBlIjsKICAgICAgICBlbHNlCiAgICAgICAgICB0eXBlID0gInNxbC13b3JkIjsKICAgICAgICByZXR1cm4ge3N0eWxlOiB0eXBlLCBjb250ZW50OiB3b3JkfTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGluTGl0ZXJhbChxdW90ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlLCBzZXRTdGF0ZSkgewogICAgICAgIHZhciBlc2NhcGVkID0gZmFsc2U7CiAgICAgICAgd2hpbGUgKCFzb3VyY2UuZW5kT2ZMaW5lKCkpIHsKICAgICAgICAgIHZhciBjaCA9IHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICBpZiAoY2ggPT0gcXVvdGUgJiYgIWVzY2FwZWQpIHsKICAgICAgICAgICAgc2V0U3RhdGUobm9ybWFsKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgY2ggPT0gIlxcIjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHF1b3RlID09ICJgIiA/ICJzcWwtd29yZCIgOiAic3FsLWxpdGVyYWwiOwogICAgICB9OwogICAgfQoKICAgIHJldHVybiBmdW5jdGlvbihzb3VyY2UsIHN0YXJ0U3RhdGUpIHsKICAgICAgcmV0dXJuIHRva2VuaXplcihzb3VyY2UsIHN0YXJ0U3RhdGUgfHwgbm9ybWFsKTsKICAgIH07CiAgfSkoKTsKCiAgZnVuY3Rpb24gaW5kZW50U3FsKGNvbnRleHQpIHsKICAgIHJldHVybiBmdW5jdGlvbihuZXh0Q2hhcnMpIHsKICAgICAgdmFyIGZpcnN0Q2hhciA9IG5leHRDaGFycyAmJiBuZXh0Q2hhcnMuY2hhckF0KDApOwogICAgICB2YXIgY2xvc2luZyA9IGNvbnRleHQgJiYgZmlyc3RDaGFyID09IGNvbnRleHQudHlwZTsKICAgICAgaWYgKCFjb250ZXh0KQogICAgICAgIHJldHVybiAwOwogICAgICBlbHNlIGlmIChjb250ZXh0LmFsaWduKQogICAgICAgIHJldHVybiBjb250ZXh0LmNvbCAtIChjbG9zaW5nID8gY29udGV4dC53aWR0aCA6IDApOwogICAgICBlbHNlCiAgICAgICAgcmV0dXJuIGNvbnRleHQuaW5kZW50ICsgKGNsb3NpbmcgPyAwIDogaW5kZW50VW5pdCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBwYXJzZVNxbChzb3VyY2UpIHsKICAgIHZhciB0b2tlbnMgPSB0b2tlbml6ZVNxbChzb3VyY2UpOwogICAgdmFyIGNvbnRleHQgPSBudWxsLCBpbmRlbnQgPSAwLCBjb2wgPSAwOwogICAgZnVuY3Rpb24gcHVzaENvbnRleHQodHlwZSwgd2lkdGgsIGFsaWduKSB7CiAgICAgIGNvbnRleHQgPSB7cHJldjogY29udGV4dCwgaW5kZW50OiBpbmRlbnQsIGNvbDogY29sLCB0eXBlOiB0eXBlLCB3aWR0aDogd2lkdGgsIGFsaWduOiBhbGlnbn07CiAgICB9CiAgICBmdW5jdGlvbiBwb3BDb250ZXh0KCkgewogICAgICBjb250ZXh0ID0gY29udGV4dC5wcmV2OwogICAgfQoKICAgIHZhciBpdGVyID0gewogICAgICBuZXh0OiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnMubmV4dCgpOwogICAgICAgIHZhciB0eXBlID0gdG9rZW4uc3R5bGUsIGNvbnRlbnQgPSB0b2tlbi5jb250ZW50LCB3aWR0aCA9IHRva2VuLnZhbHVlLmxlbmd0aDsKCiAgICAgICAgaWYgKGNvbnRlbnQgPT0gIlxuIikgewogICAgICAgICAgdG9rZW4uaW5kZW50YXRpb24gPSBpbmRlbnRTcWwoY29udGV4dCk7CiAgICAgICAgICBpbmRlbnQgPSBjb2wgPSAwOwogICAgICAgICAgaWYgKGNvbnRleHQgJiYgY29udGV4dC5hbGlnbiA9PSBudWxsKSBjb250ZXh0LmFsaWduID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIndoaXRlc3BhY2UiICYmIGNvbCA9PSAwKSB7CiAgICAgICAgICBpbmRlbnQgPSB3aWR0aDsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoIWNvbnRleHQgJiYgdHlwZSAhPSAic3FsLWNvbW1lbnQiKSB7CiAgICAgICAgICBwdXNoQ29udGV4dCgiOyIsIDAsIGZhbHNlKTsKICAgICAgICB9CgogICAgICAgIGlmIChjb250ZW50ICE9ICJcbiIpIGNvbCArPSB3aWR0aDsKCiAgICAgICAgaWYgKHR5cGUgPT0gInNxbC1wdW5jdHVhdGlvbiIpIHsKICAgICAgICAgIGlmIChjb250ZW50ID09ICIoIikKICAgICAgICAgICAgcHVzaENvbnRleHQoIikiLCB3aWR0aCk7CiAgICAgICAgICBlbHNlIGlmIChjb250ZW50ID09ICIpIikKICAgICAgICAgICAgcG9wQ29udGV4dCgpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh0eXBlID09ICJzcWwtc2VwYXJhdG9yIiAmJiBjb250ZW50ID09ICI7IiAmJiBjb250ZXh0ICYmICFjb250ZXh0LnByZXYpIHsKICAgICAgICAgIHBvcENvbnRleHQoKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB0b2tlbjsKICAgICAgfSwKCiAgICAgIGNvcHk6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBfY29udGV4dCA9IGNvbnRleHQsIF9pbmRlbnQgPSBpbmRlbnQsIF9jb2wgPSBjb2wsIF90b2tlblN0YXRlID0gdG9rZW5zLnN0YXRlOwogICAgICAgIHJldHVybiBmdW5jdGlvbihzb3VyY2UpIHsKICAgICAgICAgIHRva2VucyA9IHRva2VuaXplU3FsKHNvdXJjZSwgX3Rva2VuU3RhdGUpOwogICAgICAgICAgY29udGV4dCA9IF9jb250ZXh0OwogICAgICAgICAgaW5kZW50ID0gX2luZGVudDsKICAgICAgICAgIGNvbCA9IF9jb2w7CiAgICAgICAgICByZXR1cm4gaXRlcjsKICAgICAgICB9OwogICAgICB9CiAgICB9OwogICAgcmV0dXJuIGl0ZXI7CiAgfQoKICByZXR1cm4ge21ha2U6IHBhcnNlU3FsLCBlbGVjdHJpY0NoYXJzOiAiKSJ9Owp9KSgpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/contrib/sql/LICENSE</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IENvcHlyaWdodCAoYykgMjAwOSBKb2huIEJlbmVkaWt0c3NvbgoKIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCiB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55CiBkYW1hZ2VzIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCgogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CiBwdXJwb3NlLCBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQKIHJlZGlzdHJpYnV0ZSBpdCBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CgogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdAogICAgbm90IGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzCiAgICBzb2Z0d2FyZSBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0CiAgICBkb2N1bWVudGF0aW9uIHdvdWxkIGJlIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCgogMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdAogICAgbm90IGJlIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KCiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UKICAgIGRpc3RyaWJ1dGlvbi4KCiBKb2huIEJlbmVkaWt0c3Nvbgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/css/csscolors.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aHRtbCB7CiAgY3Vyc29yOiB0ZXh0Owp9CgouZWRpdGJveCB7CiAgbWFyZ2luOiAuNGVtOwogIHBhZGRpbmc6IDA7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICBmb250LXNpemU6IDEwcHQ7CiAgY29sb3I6IGJsYWNrOwp9CgpwcmUuY29kZSwgLmVkaXRib3ggewogIGNvbG9yOiAjNjY2NjY2Owp9CgouZWRpdGJveCBwIHsKICBtYXJnaW46IDA7Cn0KCnNwYW4uY3NzLWF0IHsKICBjb2xvcjogIzc3MDA4ODsKfQoKc3Bhbi5jc3MtdW5pdCB7CiAgY29sb3I6ICMyMjg4MTE7Cn0KCnNwYW4uY3NzLXZhbHVlIHsKICBjb2xvcjogIzc3MDA4ODsKfQoKc3Bhbi5jc3MtaWRlbnRpZmllciB7CiAgY29sb3I6IGJsYWNrOwp9CgpzcGFuLmNzcy1pbXBvcnRhbnQgewogIGNvbG9yOiAjMDAwMEZGOwp9CgpzcGFuLmNzcy1jb2xvcmNvZGUgewogIGNvbG9yOiAjMDA0NDk5Owp9CgpzcGFuLmNzcy1jb21tZW50IHsKICBjb2xvcjogI0FBNzcwMDsKfQoKc3Bhbi5jc3Mtc3RyaW5nIHsKICBjb2xvcjogI0FBMjIyMjsKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/css/docs.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ym9keSB7CiAgbWFyZ2luOiAwOwogIHBhZGRpbmc6IDNlbSA2ZW07CiAgY29sb3I6IGJsYWNrOwogIG1heC13aWR0aDogNTBlbTsKfQoKaDEgewogIGZvbnQtc2l6ZTogMjJwdDsKfQoKLnVuZGVybGluZSB7CiAgYm9yZGVyLWJvdHRvbTogM3B4IHNvbGlkICNDNDQ7Cn0KCmgyIHsKICBmb250LXNpemU6IDE0cHQ7Cn0KCmgzIHsKICBmb250LXNpemU6IDEycHQ7Cn0KCnAucmVsIHsKICBwYWRkaW5nLWxlZnQ6IDJlbTsKICB0ZXh0LWluZGVudDogLTJlbTsKfQoKZGl2LmJvcmRlciB7CiAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7CiAgcGFkZGluZzogM3B4Owp9Cgpjb2RlIHsKICBmb250LWZhbWlseTogY291cmllciwgbW9ub3NwYWNlOwogIGZvbnQtc2l6ZTogOTAlOwogIGNvbG9yOiAjMTQ0Owp9CgpwcmUuY29kZSB7CiAgbWFyZ2luOiAxLjFlbSAxMnB4OwogIGJvcmRlcjogMXB4IHNvbGlkICNDQ0NDQ0M7CiAgY29sb3I6IGJsYWNrOwogIHBhZGRpbmc6IC40ZW07CiAgZm9udC1mYW1pbHk6IGNvdXJpZXIsIG1vbm9zcGFjZTsKfQoKLndhcm4gewogIGNvbG9yOiAjQzAwOwp9CgouQ29kZU1pcnJvci1saW5lLW51bWJlcnMgewogIHdpZHRoOiAyLjJlbTsKICB0ZXh0LWFsaWduOiByaWdodDsKICBtYXJnaW46IC40ZW07CiAgcGFkZGluZzogMDsKICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogIGZvbnQtc2l6ZTogMTBwdDsKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/css/jscolors.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aHRtbCB7CiAgY3Vyc29yOiB0ZXh0Owp9CgouZWRpdGJveCB7CiAgbWFyZ2luOiAuNGVtOwogIHBhZGRpbmc6IDA7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICBmb250LXNpemU6IDEwcHQ7CiAgY29sb3I6IGJsYWNrOwp9CgpwcmUuY29kZSwgLmVkaXRib3ggewogIGNvbG9yOiAjNjY2NjY2Owp9CgouZWRpdGJveCBwIHsKICBtYXJnaW46IDA7Cn0KCnNwYW4uanMtcHVuY3R1YXRpb24gewogIGNvbG9yOiAjNjY2NjY2Owp9CgpzcGFuLmpzLW9wZXJhdG9yIHsKICBjb2xvcjogIzY2NjY2NjsKfQoKc3Bhbi5qcy1rZXl3b3JkIHsKICBjb2xvcjogIzc3MDA4ODsKfQoKc3Bhbi5qcy1hdG9tIHsKICBjb2xvcjogIzIyODgxMTsKfQoKc3Bhbi5qcy12YXJpYWJsZSB7CiAgY29sb3I6IGJsYWNrOwp9CgpzcGFuLmpzLXZhcmlhYmxlZGVmIHsKICBjb2xvcjogIzAwMDBGRjsKfQoKc3Bhbi5qcy1sb2NhbHZhcmlhYmxlIHsKICBjb2xvcjogIzAwNDQ5OTsKfQoKc3Bhbi5qcy1wcm9wZXJ0eSB7CiAgY29sb3I6IGJsYWNrOwp9CgpzcGFuLmpzLWNvbW1lbnQgewogIGNvbG9yOiAjQUE3NzAwOwp9CgpzcGFuLmpzLXN0cmluZyB7CiAgY29sb3I6ICNBQTIyMjI7Cn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror/css/people.jpg</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAAAAgAAAAAAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCAD0AK8DASIAAhEBAxEB/8QAHAAAAAcBAQAAAAAAAAAAAAAAAAIEBQYHCAMB/8QARxAAAQMDAwEFBQUDCQcEAwAAAQIDBAAFEQYSITEHEyJBURQyYXGBFUKRobEWI8EIM1JicpKistEkNENTc4LhFzXC8VSDk//EABsBAAEFAQEAAAAAAAAAAAAAAAYBAgMEBQcA/8QAOBEAAQMCBAMGAwgCAgMAAAAAAQACAwQRBRIhMQZBURNhcYGhwRQikRUWMkJSsdHwB+EjQzNT8f/aAAwDAQACEQMRAD8A2A9K7jaXTgH4Ub2tjPvc+lM2r7g1Btbk57PcspUp3A5CQM8Vm1zW2rg4dt9lhOeOQB+lUK3EI6QgPF79Fs4Tgk2JhzoyAB1Wp3JcdKtyia8NxijqVD6Vl0az1XsBXfJfP9elFs1JqmW/uOoJ+1PhUO89f4VSGPQk2yn0/lazuDqpouZB6/wtLKu0JKiNyiR6CiLvcJP/ADP7hrLrV5urd4kzIlxksuSHCHHO88Sk58yevlTmvVV7bcU2m9SlpI+8rkfOkZj8RHzNKWTg6dp+WQH6/wC1pEXqBjO9X92iJvtvzhTpB/smszr1PqRKSpN7kH5KApN+1OplnH21LGT5OUv29B+k+n8r33Nqv1j1/hahXe7fkbXT9EmjC9QCnPen5bTWYJGqdRFrYLvK3jg+PPFFb1TqAnx3eZtPlvpDj8P6T6L33Nqv1j1/hagN7gBSBudO444bJxxnn8KKq/21PvKcH/Yay9+0+o0P5+2JWwE8BzqCMV6jUupFL3C8SgT6rzXvt+Dk0+i8ODao/nHr/C09+0VszjvVj/8AWaMnUFtV7rqifTYazAvVF/WnCrpI6YyFYNERqO/oQUovEwZ55dJpv3giv+Apw4Mqrf8AkHqtSIvkBSsBxWf7NdBd4ZGQtWPlWWBqXUqVf++zAR6OGui9U6iDYUi+T9+fJ0077fh/SfRJ9zKr/wBjfX+FqRF0jKJG5QI+FepucVStqVkn5VlqNqvUqR+8vc7zz+9NHOr9R4wi8zkceTxr32/B+kpDwbVj84WpROZPQq/CjplNqPRX5VlRWrdUHOL/AHBOfR08UdrVWqggrOop/p/PGk+8EPJpTvuXVH/sb6/wtTuy2mgCtKhnpgda6NvoWgKGRnPUelZZterdTuXWKld+nuDvkZSXSQeRWm7StbsBpwYVkE5PrnmtCirmVYJaLWWHiuDyYa5rXuBv0SLVTaHI6G3EJW2sLCkKTkKGPMVmrRxs67043dVstJLCxHLydzSXfulQ80jng1prUoPsydqNxwv9DWZG3F21T0+I1HfjSkFl5p1vI2lQO0+fVIORg1hcTMMjABvYoh4SBdHMwG17e6kK7MwTCZv7MF2JKkhtm52lxttKVYPhUkI2kE4PQEYPJ6Uig2OBCuvsU5qe06/c/YWe7kpGGyQCo5bO7G5PPGc+WKajc03Blm1OKjWm3JcU9+6bWtPebSApWSpR8hwTjOcUrvWpXpGo4VzHdS1QW20oKwoIccSMleAQfe5HToMjyoLbHODlB5HqPDuueYCKhDPfL1B7vDuueYBXW62G2pt9/cguzEu2eSlpRdWlQdSpZRwAkYII9Tn4V01vGt++yNW+A6zIk21hwFC0kL3bhhSQgFSyceLPPpSB7UzzrF2Z+zYKRdVhyQR3mQoHIKfHxhWVefJ9MAc3dSTHGoWY0P2iE220zJ7slxKW1bkjk7evmBnHGeac2KfMHHl39w97qRkNRmDna27+oHvdOty0xb41tuE9puYyLe60HGHprLji0LVt5CAe6V/aB+uKLqKxWS3Whu5xjOcYmNIMIqeTnvOd+8bOAOOh5/HCI6sfWLi05abYpu4rSuUna6N6kqKgcheRyc8HH50JmqpMq2ybe9boBYfUFhOHP3RCQlJR4/DgD+ByOKRsdUCM3XrysO/rfy08GtjqwW5uvXlYd/W/lp4KeylxxGuoKUOKSlxLqVgHAUO7UcH1GQD8wKSybZbP2bYvkb2wtpn+yPNOOJysbN+5JCfDkeRCsfGkOnbu9Y7oi4xmGHn20qCO+CiEkjBOEkc4JHPHPyrv9vH7F+yPsuB7L7V7VjLud/pnf02+H5fHmpZIpO3zt20H0vf9wppIpe37Rmxyj6Zr/uFINTWOP9v6hlzZcx+PbUMFe0oS66pxKQkZCcAfHb5UW3QLfAlaTuttXOQ9cZ2Fb3k4QhLgQpGAkE5CsZz0zxzwjZ1Gu6Xa4Srg7boSZcZKHm1surZkKSQEhQSSpJA+8n+j8c0a8aiitCwot7UWQq0lxzhDiWStSgpISCQshOAcnqeueaqhk9mxOvtr0tl26fiVMR1FmxOvtY9LZNun4l01Ja4EtWp7lHVJRJt8797vUkoc7x1SeABkYPxOae0tm4az0umRIlJefsbag+haSsL2OEqO9KgrIyPrnPFRF3Uz7jF2ZNugAXVYckEd5kKByCnx8YVlXnyfTAChvWEtu5wbi3bLcl+BH9mj8O4SjGBkFfJAKhn+sc54wrqacsy25EDbm0D97pX0s5ZltsCBtzaB+9/JJ02u3RNPwLncTKcVcHHEtJYWlIbSghJUcg7jk9OPnUpgW+HZdR6ns0Z2Z7G3ZXFO73AorO1J3YAA4CyBnPnzzimC13CI9aUMTJdsaQ1KWtmNIjvr7hJwctqTnIzkbVk+7znNdLpq0HU94uMKCw8zcGhHPtAXnutoSR4VDG7aD6jyxzSysmlcW68/DcW+gullZPK5zLHn4fiFvoLo8K0Wtq4aWuCGn3IlzkFC47y0qIUhwI5O3BSSQcY5GRkZyFVniwHu1R2DEblQkh+QhKmnGzsWnfkpBbwE4BATjjPXimBeopJhWqK3FiNfZTneRnEBe7dncc5UQcqAJ48uMDiu8fVcli+pvLVstqJSVOLyELwVue8o+PJOMjGcDJwM8058E7g7qQ4DXvNvSykfBO5rupDgNe82v5WRodss40ei9y0z1Oif7KtDTyAlQ2bsjKDt4+fTyzwouelolvuN+MmRIchWlLRKWyEuOl3GwZIIHXk4PTpTb9vH7F+yPsuB7L7V7VjLud/pnf02+H5fHml6NRrul3uEq4O26EmZGCHm3GXlsyFJKdoUEkqSQOik/wBH45pzm1DXF2ttfpcbeV/qnObUtcXC9te/S428sw8/oqh2m0Q7fZbvEMzvJ61kh9xJDYQ4EYACRk5I5z5dOeNG2PP2WyT1xWb7ndYctiyW2GWlCCFBSmUKQ2St1BwkL8WAB1PJrR1gIVa2yM43KHP9o0ZcKlxhfn3ud+lzb0sgfinP/wAZde/zb9L6ei5aiSVRRj0V+hrKn2g4Yb0NxO5KlZCs88f/AFWsLyncwR5bVE/SslPDuXV90oOJUVeXQZPWpcf0LD4q/wAGNa7tAe73XAdM0KW6af06jVNub1g8uPaZKVlGxKtrpBKfEpPKQFDHxqc3t3sd3pbOnJ0RlCu775SJUdRI9FDg8EdaowYPJLH2hcGg9Vq1nFNNTzmGNpfbp7dVXDqu5QXF+EJG7n0oraJaYcOVKbaaRNC1MJSslRSnbkkEDHvAdT0NT+Dp7shmy0SHb/cFwkncuM5PSUHHO1X3znHTPNC8R4vaHa2JVqSzZJNoedaiNPjKX2FYJDhT7isgHPPWrLMGsx7SQX8gCqMvFOaaN7WlsQNnEjrsFAAcrwEnNHqRPaB1gwwXmbQm4N596FJbd/LIV+VR+S2/FmOQpkZ+LKb99l9soWPoax5qSeHWRpCKKbEqWq0hkDvAqVWW3WdjRxvs9uNLcM3ue5dceQNoQVbAUD3z5E5SARk5yKb/ANmJ/eez99F9v7nvvYtyu927d3ptzjnGc/CvftO3/sN9i7pXtnt3tee6T3fu7Nu7dnpznHXjHnTl+1ED9oP2m7qV9p9zt7janue87vu927OcY527frWKe3aXFtzcn0tYdwOtyoD8Q1zy25uTa/dbKO4HW59U3s6ZfXAt8tV0tjLFw3d0pxaxhSTgpV4OMHPPTjr0y3adhs3K+QYL73ctSH0NqVznBOMDg8noOMZIzxS+8XOBJ0vZrbHVK9pgd73hW0lKFd4rccEKJ4Ix0568dKa7JKTAu8OapBWI0hDpSOp2qBx+VWGdqY3EnXW31NvSysx9q6N5J11tp3m3pZSexWO1jtFNif7q4Q1Leb95xKm9m4gEjb4htGcZTycfBlk2GW1AYmsPR5bT0j2YdwpRKXcZ2HIHPxGR8aebdfbFD1sNQJ+0lJU6+8tBZRnLmQEgb+g3KJVnngYHWk8S926DptmDFXLclx7qme0pxhKUK2jaEnCyRwM9Dzx8arB07XAi50bv11v4clVa6oa8EXOjd+vzX8OSQSdOy2Uy9kqI+/CSVSo7SlFbQBAJOUgHBODtJxTPUrvWpW5iprzVxvahKSsCG48Qy0VdeQvxJGThO0DpnjgxSrVM6Vzf+Qf3+/0q5TOlc28g/v8Af6UKFChVlWUVRwlXOPSuaSd4zXRYyMnoK5qzwcceVLa6eLWS62HFyinOMPIOf+4VrPTyVJtiQrr3jn+c1kqD/vrH/UT+ta4soIgoBIPjX/mNEnD2ufyXP+NRrCfH2RLwf3XzQv8Aymso2aA9eL7DtTCyhcp/uwsI3bBySrHngAmtYXVIUzz1CFkfhWXNF3SFYtYQLrNU4mMy6rvVp+4lSVJJPw8QJ+AqfFg0zxB+yqcNvkjpKl0f4gBb1T12vtOacmadtFpvdohsR4hbRCuLHed+Qr30qKVBJ+OU/OmrW7yZt0taWg8w+mEl+QlBSqM54W0lSfPJJA+hp27ZdV6VvV2jR4uq4UCTbHT3pXAEttwKSD6Hgeo9ajV7uES56kjS4LrEiMzb0NLfZbUlC1KUg4AOMABOQMedaFTlNM7NsAh/DnO+PiLL3JCSBsBwAJSOR5UeM0thxclqW/FfSnCVtOKQVDzBKTz8q9c5eO0jrXJ5xSjtJ4FAschbq02IXZJYmStLHAEJdE1JqeIlSI97WoH3Q+yhWPqAFH8aVXC+XjU3Z2Jt7jsmXCuyG2JKeu0laVtg9SMAKwf4UzEh1IwnCkDp8PWvC/c0WpiyKnBVrZlKmJY7tOe8Vv53gZI/eK4Pw9K1afE39m9kziQQbeKHazAYe2hmpGBrmuBNtNEWhQouFZHPFZCJlIYel3ZVgcvabrbkQ2lBDyld9ltR2+EgNnJ8Q6ZHxrhc9OzYVrbuqHo0yCtW3v4yypKT6EEAj6ipPptMdXZDeUynXWmfbk7lNNhahyzjCSpIPPxFN7V1gP2OPo+zIkhE6Wjv5MoJB3FSRwkE4HCfPy+NZbaiYvdbUB1jppawN79f7ZZLamcvdbUNdY6aZbA3v1/tlD9wzjkfE9K9qxJWnLDE1GuzymYTEFLWFTXbkhMhKyjduKCvGMnGNnx6U0WqwQGdPXq+SymemA/7Oy2hwhtw7kjeSk5I8QIwfWpm18Tm3F9bW777f0qduIwuaHAHW1ttb7f0qJpxnxZx8K8qVP2iBP0K9qKLGEJ+LI7l1pC1KbWDt5G4kg+MefkaX6shWK02OxT2LIwp+fH71xCn3u7HhQTgb89Vcc/PNO+NYXBoBuSRy3Av16J3x7C4MDTckjluBfr0UQtMJVxuUeA280yuQsNoU5nbuPABwCeTgdPOul/tciy3Z+2SltLeZ27lNklJykKGMgHofSpZMskK26k0ncIAW2xcnWHgypW7uzuQSAeuPEOvoaXXKxMag7XLjDlOKSw20h1YScFQDbYwD8yKg+Pbnzfkyk99wbKv9otz5/yZSe+4ICrZXTFOytNTv2UGo/aIvsgXs7vervM7tvTGPj16U+O2e0S7Hc3nU262S4ye8ipj3JDxeSASUkb1c8DkYznpSRuao9lvsJQ9u+0857pWzZsz72Nud3lnNSuqHPAMf6gD4Kc1bngdlp8wB8O62ij8EZmsD1cT+ta4sgSm3gI6BavPP3jWSrSkLusRCuin0A/3hWtrNkQikpxhxY/xGjPh4H5z4IP41cM0I8fZEupG1OR/w1856cCsiqK1rUoqA+nFa6ueMDcMju1/wrJKikOkpUCM9RTeITbIncFC5l8vdR2LZWrZC1bc2oja22beJDK1EEtrU6lBxk9PF/8AVS7T4TK7N2nUIAIc79ZJAyMAZz58EDHwqB6j1fKtk28WdMVpxifb/ZlleQRlQUFpweoKRSuDfp180hB0XYYpMlTZakPO7QkNg+XoPzrWo43T0WSXciyG8TnbSYqZoBo11+nipIycKPBGRXJR5yBmmrT7Mu3SJ9pfkplJgPBlDmCM+EE9eeCeM07g5IAHJ9BQZPAaeQxHkur4fVNraZlQBYOF0VC1IJUBg4NAkHlIwMdK4PTIzboaXJaStRwElYyfpXdstqZICVd4lXiO4EY8uPWoi0jkpzJGXaHVChRkIKs48hmjym+7cKc8A9PSkTr62T1D1Q7GsDljTarcuG6oLeSrvsuKG3xEhwYPhHTA+FMLa1NuJcQopWkgpUDggjzryhUbImMvlG+6jZCyO+Ub7qQO6rmvTm7i9Ct7txbACZam1b8gcKwFbCR6lNJLdf7hDRMaJbksTTmSy+CpLhznJwQQfiCKaqFMFNEBbLomCmiAy5dP428E6z77Kk2tFraaYhwUr7zuGArCleqiolR+pqW60uURvTOnY6BabkY0cNyGjICy2sIQB/NrCscK6HHTPlVe0KjfSMc5pGliT43UT6NjnMcNMpJ8bi26epGpbhIvUO6SG47ioW32djaUtN7fdwEkHg4PXyGcjijydVXN3Un7QMpYizSkJX3QVtXgY5CifLA+g8+aYVEBJ458q9eWyUrVylZV4U7cJ21KKWLSzRtby6KX4WEW+Xlby6J5dvzpjy2osKFA9rSUyFx0q3LT1KfEo7QT5DFczqa4/swNOfufYyvcTs8fvbsZz0zz0zTSC0YxSFL7zIx4Rt+PPX0rmEgrGSd3w86d8NFYXHf58intpoju3Y38+qX2j/3aHn/no/zCtcQvC0pISffUevqayPZ8fa8PPT2hH+YVrmBwyQMnxq5Pzor4d2f5ID42/HF4H2XG5jwdf+Ev69KyApSd5yNvPStf3MgJBIzhtf6Csf7dylZI6mmcRD8HmpOCTczeXuq37TEJY1Bv4UHI6SAeqcEilWgry1Zb3MuCN6kogvKGOmRyB+IFJO04hWokpCyrawkc+XJP8ajLTziQsE+8naflWzhmlMw9yFsescQmHK6svQ0l962TbhNUpJflOOlajweBuP60gu98l3m8MWK1pdjh11CC8TtJCsDn0HPnS6JdIVo7L7O2l9pq4vuuqQD4sJKjkqx0GAMUp7DxJvWt4sNaYjUJ1SkSe7KUuykkng5yojnJ8gB8qrNwsfGPlkFxuFoS8QP+y46aA5SNCoo1py6B+aW7ZPeEEKXKXswG0pPKgvkfjXsSUtMJp+JKmMyinckEEh4ZAwD5knPGD7prTfa5f9M2DTLdgdgpaipWloJVG/2VI64UkAbxnkgAj1INVK3dNF27UzF8m3dq5ynFhuM3CjBliMB4QdileEgdCceZrSETHg3CHfiJYXfKdVw0zLXMsXtzpHtKVltxvBCkcdVZ+NOcte6TvJJ3oCqsWLCsV30zOu1qyEz4x9occCTucaSDvBSSP6PIJqt3VBSWSfNsfqaDsWpWQTXZsV1PhjEH1tKe1N3NNvdeUKFCspEiFA9eOlCvD06Zry8vaFeqxk7QQPLNFJwM15eQUSBkHBFSbs3isSpd2nzihxmFCCQ2obipSyQD8MbVfiKi6yCkgGrH0NbWonZhLujqwF3KSQCkY3NoVtQM/MLP1rWwenEs9zyQ7xTWmkoTY2JP/wBVbqKGysnOxKsDPn6VYGmtMw7FaV6h1aG2chPcx3leFpKiEhawOhyoYHl+kS0Tf2tNakkxVWWPcFOzg3GkPAqdZO8A4JyANpPQA5qQ64vQasq3rmoy413Q9bpZJ39ysM72ClPllY5+QxitmnwgQOMkmpQpifE0tW1tPDdoNvEps1H7CjXqWLa0huM3KbQEo6EhYya1TEG1ojJPiNY4sjjyrhbXJHLpca7z+1kVsSE4FtLIB4WRXsGLXPlLdrp/FMbo46Zrjc5db9dFzuWO6Of+WusfHhxSR0ya2BdMBo/2F4/CsglGXTng5NVOIdcnmr/BI1l8vdVd2jKJ1KvJ6NN/LB4qPymTHcSkqSslO7jy56VKe0uG41e48vG5t9KUj5pPI/Oo7cT3j4Kk7Vbc4HzrZw1wdSsI6IUx1pbiEwd1/dJCtagkEkgDABPTp/4q/wD+SXabe+5KvBbQ7ObmNxjvcUO7aUMg7R1yoDrxxVDQ3UNupK0hQByc/T/SrV0dqGVonUkTV8CM25bpMdDcyNnaNpwM/MEZB/1qeadrHNYfzbKrBSOmifI38tr+HVaG13onR13uv2pebY9NmrTkAKccIbQOQE5wPj6/OqCuQYvt/wBTW6LaXY6pcxuTDY9m2raCBt2Og/zeR6+dalvMBq/WRxhE1+KZCE4kR17XEZIOM+h8x51R+oLOoanlWqVEkRwyjiamG2wp8AjH7wLKlZ+X4U+EZjlKrz6fMpN2aKtCNCyIDFrTAAkKRJadBGwFGHFcccpH6VW76QQ13fujISfhnipffrw7bLK7bIoSDOTh5ZO47UnGB9RioWlZCNo4HWhfHpmOmEY/KukcGU0rKUzv0D9h4X1XuSFYNGrl5811rARk4IUKFCvJqFFUfu48jRq5OImTZkW02mKZdxlna2hPISPNavRI9amgidK8NaFBU1EdNGZJDYBce+K5zFtjp7+fKOyOwk+Jaj0+nnn0Bqfa4vDPZ9pGy6QkH7QmbFynSlWAhZUSE48kkqVg/wBWmftIFv7KU6dlWhxq4XmK689JDwyt3e2UBxWAdrYUeB8fnVeWRq53efIvN9lOvzJRLjpdzlKfr09AKMqDD2UjS7c81y7GcYfikoZl+UGwHjopjadPl0/aF3kBYdX3wQ2spAJOc5/DpXe+PwU2aPZIkdgx25HfrJbBJUEgA7upPX8ab5ElyVnJKG0ABtvOQkY6VxSAlYJJx6ZrMxDGu0uyEWHVEeDcKdjIJ6l1yNm8vNKbMgOXSKTnwvNngf1hWv7cnDLmcfzqv1rJNhQTeWC2tSU94gkA8KG9JwfxrW8EAB4D/mZ/wipOH9GvVPjU3li8D7JPdnEo27jjKVgfhWRSdyzg4561rPUCkpLW4ZG1zHz21khKyFk48+lRcQ/kU/BP/YfD3UL7TnE+02xg+JQcKvmMgfwqMavS23PbQ2hCB3KcgHzGc09dpIc+24bqz4O6wkgcjB5+vSmLULivakEEEbTyoDOd6h/CtbCxalYAhjiNxdiMl+Vv2TPtz6VYGiYUnWDjdiamoZTGYQtEQjK5e1QKwk9AQnJANQMrSQSrGfWnqxT5Vg1FDucJa0PxFIeHl5cj5HJH1q6+JryC4bbLJiqJI2ua02zaFah7TIt/dgwtZ9mdwkCVGCYsyC14u8A4G5s5G5HQ5HQg1T69T3idqm5yNQS7jGuTEdSpTaorbRQE7QEBXUbiUgYHn1q29CzpN/t7uptHS2rddkrIuEOWP9lmddu4DlKsffT9c1W+v+/l9qzH2nbFWx+4OMuTlrcSphQaHRtY4Ujwg5ODnAOMUsd8yhlN2pfPchsQrJZ3pbbd2TB7xyOsEKdK1rWSkn3iOQR14pF4cZHNN0qEnW/agh21rWqLDj92uWhJ2JWkLKVZ6EbinjzxTDqHUGotOXV61XaFEXJQQrvEIUkKSckFPOMH5Vh4nhEk0pli57o04c4qipqdtPU302I6KXp65rok5+dMNi1FGucUuPbYzqQCtClAcH7wJ8qc2ZkR5pTrUllbaDhSkrBA+ZoclppGGzgugQV0FQwPY8EFKt2CQeflRnihC9oVu4H44pjumoLbCYDxkoeGcBDKwpRNRe/6xVMhqjwm3GAr31qxux8MVYp8Nmn2bYKhXY7RUTSXvueg5qfxvbZ9zatNnjGbdH890wn7gBwVrPkkfGpxeLvpzsYsbjClNXTV05oqWrAKueQFH7rYPQDk4rPum9a6h06EmyzjEeLoccdCQpbuOiVKOcp/q9D55rpGRdtY6jlXK5SVyFqIfmPqHOM4ASB5nolIx5UVUeHtpW2bqeq5vi2NyYjJcizeQ/lIJsi86gvRlS3pMudMOcqJUpeT0Hw/0qSQdO6vjuNKmMSY8RDqS4HnQAcHOACeanuldMtWIuXy8d2JxThttr3WE44QnPn8f/NGuU6Rc17lZSlsZQjPT/zUeIV8dOwsvdx5Kxw/gstbMJjowHU+HJNwSkEnGMjyoAZr3rg5JzRsBPnQXuuuW1S/T2PtuID/AE0jj+0DWuLerIeOD/OfwFZCtfgvEIAEOd+kH+8K1zaOW3/+sf0FE3D+rXjwXOuNhaSK3Q+yR6lGEMn4LH+E/wClZLCOevnWtNTZU2zgdCvP9w1koJ5yrPB6VHj5sWX71LwYbCXy91D+0+OgwIsk53NvbPoR/wCKiup2GWVR1NJUAtKiCrz8ajU07Ro7rtgUpKSpKHApWPujBH8aadXWxb1qs89CCGX2nA4ojhCknn9avYLJmpgOhWJxYy2Ik2tcBQttsuJO0c9BmltxVtua0o6JCUk/IDP51zcQUlKm8pSkjaT5/GivsubtxJUVc59a2ENAWUwserrtb7Qu1217uEuq3rUgeJRxjA9KeHYU11mLA1HJeetdxKFRZnJVGfPTOemRkYquEv7AkpQUlJ6/EVZelrqdVaKuVikHE1hje0T94J5BHxyB+NSxWOirzXDdE63K16glOuWbTbn2HZYayxyVIVIcABK+OTnOMk1DtaNSJ2noS50SY1NtCTAeeUO8bf8AGVAlYOQrC/PqB1qyNFXRV505EmLVvdSnu3DjopPUfp+NOdwtzFxtsuE+gKRKb2r9cjofpgfhU/Ytc26rNncx1iFnaU+2tphDUVLK2wd7m9Siv8TgD5V7GbkSHURIyVqceUEBCc+Ik+lOtmsUi46gdsqmiJDbb6fgFIBI/MY+tSCPaE6W0p9tyw4LxO/cQW+P3IPClYHJOOPrVQRA6ELQMpaNCVDmLVJkXgWqOEPye9LWG+RkdTn0Hma4XBhEac9HZfTJQ2opDqUkJXjqRnyzViWvTcjTnZ9c73MR3E+Qx3SCoZLaVnGPgpWfyHxpl7OdHS9Q3FuRJZULa2crUrPjx90fxpxYAbJgkJBPJRSLFfky2orDZW+6oIQgdVE9BWh9F6Sh6asLTUoocmFwPvuHhIUBgfRIJx8Tmu1s0barffF3liKEPLSlCOmxsBOCQP1NItS3EyXRGju7mUe8oH3z/pVWvnbSR5ideS1MGoJMUqRE0WbuT0Se83L7QkfuwUspJ2A9VfE0jYUpD6VISVKB4A865JGK9yQ14ffzkUBSyulcXO3K7PT0sVLEIoxYBdXo7rC1pU2pIScc1wPvDOQAec0ollzv1hLiykY6mi5WdpJBI9RUV1P+Vd4Km1XyM8nke1IUB6+MGtc2tISh8Dp3p/yprI9qSkXKIAlP+8Nc454VWuoZKQ6APvjP90UT8P6h9u5c841/HF4H2SW/kFpHHTd/kNZIPiWQOMHmta6lKG4YJJ53D/Cay23AckPn2dvvCtRASDyfl61FxALlnmn8HSNaJST0902vQvbWXIhPhdQUH05HU/KpH2a2ODrPS8/RU4tARGkvwJH/ABEuhIQpfxBwjim25sOQZHsxwFbQo4+NeaZuD2k9f2W7tkJhzHvZ5AUcJDbm1Jz8ikGo8BlyudGpeL4GyRR1A5G3kq31FpiXZbpNtVxaIfiOltw48J5wCPgeoppkx21T2o7PiwjJyeB0rd8u2W6U8XpUCI+4Ud2VraSoqTnODnqM881nDtp7Mbn+3Mp/SFnUuK7DEp1tkABCt21QSPPPBx86Jg++65+5tjoqQLCXIdzWSAph1soAHGCVA/wo+l7suy3uNPRkJQcOD1Qeop30pAdkjUcMIUt1m2vOrG3kFGM/hn8qiIG1IKTxnH1qVrrWIUDm6aq6+z0NQpN6gtOBTaZgeQP6i0JINSwrPeYSSkKP4VU3ZrdHF6giMuHl+GqOSTjcUHKSfjg4+gqzlrWADnk1oROBbcLPlb82qTWvT6Y3aa3fWUqDMqM73oI4S4NoyPmP40+OaWbm6j+2J6++VG4iND3Gh6gevxrtZ5O1te8btg3dPhz+lIZOrnFZESK0hBHCnMrPzx0/Ksytro6W2c7rawzCarEiRA29tzfZLdR6cYv6IzE54ot0VfeOMpICXFj3dyvQen51ykXe0WyOWYTSZDjY2oSkbWk/XqfypgnXadNQUPzHljPKQrCfwFIaG6zH3uNoRbvKO8M4Kijs6sOYjkNv9pXdbzcbgr/aZCtgGAhI2pA9BikCQTn8qOODkE/jXtYMk75Dd5uUbQwRQNyxNDR3Iu0cUZGEqCsZwc0KFQ3UqO4UqUtfQqOcfjmiUKFeXkqs6FOXeIhHXvkH5c1riGtOHf7Q/QCsm2khE+GNwRueRzjn3hWr7fhYUTzhWM/QGinh/RjyO5c+40IMkfcD7Ju1ipSYCB13OKA/uKrLUWS/GklxhwoGcn485rU+sEFcNjHk6T/gVWUW3CB0GKi4gJBZZScFtBbLfu90pny35bvfSFlXOE5GAkdcU2doNxkRNDsPMJQosvd2FKSCQDuP6gU7Qtjm87ApQHGfL40j1JC9v0Vco4bLi0oWpIH9JJQQfzrJw6Ux1DXIjxqlbPRPjaNlpPQs1V10fZrg8sLXJgsuLV18RQM/nTsppPebsJJBHOOSKrH+TDcXpfZXDhSVI9ptzi2FpC9xSkncjOOh2mrQ4HXJJ/KjR2jjZcoFrBZm7KdOtvau7T1tNkiPHmQmVdBucUvj54QPxqh4UFb9puElIwmIhLqyPPLiEAfma3FoXS0ax268uYK3bxPfmP8Ax3KO0D5JI/E1jdLDrGltSbElDbkyKyB81Oqx/h/Spm7lVnNNrleaFaMjWFmioAQG3t5UB1G3Jq5nEpUvanOM45qoNHvC39ocYKSAS6WMHyy3j9cVcG4tuBSDg+Rq9AdLLNqdHhSZhuEhgtMNu7tgTuUMbiRUAWhtJUFFQUjO5J81DyqVWqSoMukqKlo8WSc54NQ0rU4AtZypRKlfEmhbiUgFnXX2XRf8fZnGYcvl910TjaMDFe15nDe7HGcUEkkdKEzuukW5r2hQoUiRCjpACCVA88A0Shk4xk4pQbJCujrqlp2/dByPWghQJAKQCT1xXOhXrk7r1kthgG8xfEDiSjryPeFassW4sKKjnx/ltFZMt4xcYpBx+/R/mFaw06sLjOEeTmPwAoo4fPyPt1C59xmLOiHcfZF1WtDcBKl8DeR/gVWTdyQ1swOvWtV62O6zpwf+KP0NZVcZ2nepeVjqPX1+tR8Qi2RT8EOsJR4e6PHdSg5T6YNO1tdYTZZ5kr2NpQVKUTzjaT/8RTIFeqab7/LUppMJK9mUlwkdDgFI48+orFoI+1naxE+OT/DUb5VPf5H8KQw1qOR3hEN9bJbR5bgV5/7gMcehq/1JCutRvstssaw6FtUCNGSwTGQ48PNTigFKJPrk1JsUbOIvYLkLbnU81yVwknaVYGdoPJ+A+NZc7QLND/8AS2HIZCIjlw1Cp9SO72lxLSFoyfTzrU/AOSKz9/KFtS2LbpXTsFZS8p2Q5gqJyVqSk/m6akh3AUcoFrlZ8QHkT7Vc1fzj1xWrPxC04/WrzfA75QR0BIFU3gRtOaceeHiFxUpWPPChn9KszUU82+6Wx0uLDD8lTLqc/wBJPB+hFakRygnwWLUXc4DxUm0+gKLqDwTwPrUSKCh5baxhaCQoehBxUvsqVBTqsHhQ58hzUZuiSi6ywoYJfWefIZzQvxOy7GP8V0L/AB5L88zOoHof9rhQoUKDl05ChQoV5eQoU92axfaNinT0vbHI7yG0pI4O5Kic/QUwNOtPth6M8iQyfdcR0UPhn48VM6nkawSEaHZVYq2CWZ0DXfM3cLpR2WH3yQww46UgqVsTnaB1JPQAepp8tulZUtmQZcyPbXW46nwy+oJdKB97B90ZxyrA5psuUO9GKWFx3o1pIRvbjOFxt8gAb3HB72eu3hPwqeOkdlzyaD1VeTEWuf2cFnHrewHn7BKLRCiOx2pT1ya75MppCmmUFYSVHIBV0zxzjODWntKf7k8OeHj1+QrMVhjuuQVlhClkXKKEpQnOOF5xitRafASw9xgFzP8AhFEeDsAa7KLDRBHFrnZow52Yi/skOvsJsIIzkOjGPkazFc2nG3vGpPPv+qT6fOtNdoqj+z2U9Q+j+NZjLi32thwAD4/RWOlVeIdcnmrfBd7yeSTHHln5GozMf7ztFtEFHJcCEhJ6FReH+lSRxIOCOmKi1kSzM7dbFHkbVNmUw2UkcHJzg/iKoYE29VfoCtfjCXLhtuZcFtZkbUhOAMJAwPLijg4oYIWrOPoK8opO65sgrkGqw7Q7S7du1PSyQEFlmLJeWCeTsKSBj03FHNWWpSQeVCm+VAYVeEXbq+iKqMjzwCsKJ/FIpzSQdEyRuZtisUahiLToG3ykkYiTnFH4hSiB+dP/AGry9mn7e+0oFS5CSF/9meK7XlmMvQkxhx1r3nTsKwDw6T09abNbOx5mgbU9vQlS+52pz08JBrXcPlJB5LCBJe3Tn6K1tJz2pdmZKgAHUIcSr5gE0g1pD7uSxNTyl5PdrPQ70/D5EUz9lLiX9HR0g7u63NcfA8VK7k8yqwzG5YIabSHdxGdoT1/LNZuLU3xNKQNxqFucN15oMSY47E2PmocFDO09fSvcjz4rs3Ek3dRd05DcnNZ/nSQ0yM+iz1x6YzTZLTa4DvcX6/rflg4Vb7MkrI+BVjP4baDocHqZRmIyjvXU6vimgg+VpL3dG6pakJcUG0SY4eV7jKnAlxfH3Qev0robZdXLHMuH2c/HQylJQZCdu8lWD4fexjnJxSK2O3J2YmNpPTMW3qdOEvzEl+Uo+uM8fUkVKLpYZUG2ORdYSkXJ9xYUr7RfTHjMqHkkJw44f6qePia1oMPoGak5iN+iHa3G8YlBDGiMHa/4rev7J40U1Cj6KueL/EmI9uaDkgAJbQQhQwnBJV8hk1E9PSdPWvS8VNluxjLJU0J9xj7SohXVvG4N5O4eIbuPKpXZpkV2wTe6jP3UNrbQ24EojMxxhXhR4QQk/wBVsfM9aZdU3m4WLsq0wqB7BAS9cRHRB9nRI9nGXDkrd3Er88gDgitCaJskALNGjzWBTVctPWu7U5nusDra9yN9NQnDS2nbk41c7glxh2O9DdSuWqR4VLOCMrUc5PrTVGXAtJ7xWoHXXk8Fq0J7459C5kIH4mmic4u4O7p8mROWkk7n3VOAc+QJIT9AKMg5UlCeSRhKB1PoBQu+aO4DATbqulR4fUkHO4NB5NHTvOnopDD1tcvaY8WJa4bLTryUOPSSHX3BnGVbQlOcE+taVsC9zDqcDhzbwf6qazDGsqIT8aRepBiqW4lTUZACnlcjBIHuDPrzWltJulyJIUfJ/wD+IrewmV7w4OFtkFcT00EJZ2JJve5+myS6/SRYHM+6HkEk/OswqWltIbAUMnJH6VqDXqwuxLbKCQXEAn/urONyhrbXlLCjuGQcZ6np+FV8dhe9rXtF7KXhKriic9j3WLrel0jmKadYQlI5IB6Y2nzHxqJdj8RF4/lFQCv3GJi3iNwH82klI5+ITUsfhvIaS45lsKHh3JPJ9OPOq70sTP7brW00paUi9NBICjnh0Z/Sq+BxPjqHh4sbK9xdPFLRxmJ2YZj6BbnPXzpFeXp0e3uO22GiZKSMtsre7oKPpuwcUuc4WaIryreO6CBss2dr+re2VKA4qyzNO2+OFFbkF3vARkcrcBPA58hVLTda6ukqKX9T3dzBPWYv1+day/lJXAW3siu+xzu1ye7jp2kjO5fP5A1izaWVlC0bSPI+VWGkEbKvK4tdZGkPF1DZWpRWCStSjkrUeck0nUSo55GPKnt+1qhacTc31FDktW1hBHVA6n8f0pk6mnuaRuoQU/WPVN+tDfdQ7pIaQkk90TlJ+GDVlaO7THHDi/WhQSjAW6wgjcD1O08fnQ7KIVndtSLgxCbXJWCHHHAFKSv05HT/AFqwZ0Fq5WiTDXGbcWUhxtO0A7k8jH51LLnhjc+97BQQ5J5mxnS5tdQZSZk9K3595nTGXcKbZXhtoo+6ChPB4x1pY5crK0pxqTFTA3qSe97pSEFOB0Vj/WiOOqWtS1JJJ8umK7N61mQx7JN01JfipASFsPJcyAMZKTigykc2vkeKmSw5arq+IxHCKeN9FAHHmR4b/VSO1OOROzPWMm0zkoUIQUzIaUkKSonBwtOfT/xTJbLY1JZakPpS248hKlSUqCVOKKRknqFflTNqC76Iuenrg5bX0Qrq42UJQpK4y9wPQ4wkjr1NPjdnuK3vtCwX+JNQDw0/hYAxwneg9B0HH41tnDXtibHEQ4DyQizHmPqZJpwWuI33sVIdOsiHp64xil5aVyWVJUEEJSAFdT05z5GorqFSrb2S9nrRYZEpyetmSHG0lSkpKyArPPpz1pdYb9dLQy7ab3CkNGUveytkJfQruwVK93C8geWK66anWW5o0zZN6S66ZHesyu7LjJS6NhVwFAnco+uKtwx5aYRgZd1n1tW2XEDMXdoNNdr7IyLLHumkZSnA3b2nso9ocBOzke71UrnyA4zUh09apFkjxTaYiBHZYUl2ZMQEvOK2KwfFwlJOMbSfiaZblqK5XrSk1t+/vxkp7xoPQnV4CQrAUB1HxBximy2R5DNpZjLuC5oCAUyA6Fd5wOTk81SrouxgZ8tz1AWtg1UayslGfKDqA4kjwTm1Agybi0/cnItvkl0Ky1LDveKz5pySCf7VX7oPd9mvdVAyFc/QYrNEBlkXNjdhKw8jOxI5O4dQDitJ9njp+ypAKTkSD+gqPC7HNbuVriZpHZNPQ+HLZedo7y06ZfW5+7QFt+L/ALhVe6Sg2e+6QlXhLinw0pwIUFEDhI8qsfXsWXcdOOxozPfuKWghCOuAeagGg9J3fTmlnbGzDkOMPuLdUXQQpJUAMcfKtg3tohNwzEKDYZksJS6AQpYOQSCOKrHsSgtS/wCUBEQ0D3TU998HrgI3qA/ECr9/YSXHSN7EpSWzzsQcn8qYdA9mKtIawXqWK3cpT6g6A25FUEgrPJ4HoSPrSuYC7PbVV4hI0dmT8o28VejygkDJrmFbqj71yvDiQfsiRj/or/0oqbreUowLPI//AIOf6VD2ZV4PFlVn8rB5+bE0/p6EFPvyZKnjHB4XgBKc/VeKzjNtDkrVz9nYWqQ6ZKmlrHmQcKI+Fa3u2n5F01lD1PLt89UmG2ENMGMooBBUd3u9cnP0FQW0djiLRenbrGF5kPLUo5XHIGScnoKnjZa11UlubkKlu1p1tOoGbTHUO5gMpZSPIEdfr5/WoWsjvVeQx51o+/8AYam53aVcHF3sKkLK8CL0JxjyorH8n6P36FvKvDiB1SY2Mj6Cnvu43TGss2yrXsQu6Yd+Xb33QGpQ8AWeN4GRj4mr2iOIYnMPY3I3eKog32CJiz2pbDt93NO94jbF93B46irEj6Wuq43cC13AjqFKaKT+lP3bYqN8Rz5mqC3SyOJ1C9HZZcUyolaDjgg89elIlWG6qJT7OlPP3nEj+NWZcdNageCEItk1koRgrDfebqbk6C1XKadCLjc4oI//AA2kkfLKSawvsGmJJcSi9nF+INYI2BoAFuaj9403Zbb2F6gkKtMBF0MV9xchLaSv30/e+tcdB9ndgf09PfuEJPtTcNt1p5hSmltnaTnKTz9amh0deHtFTdKzk3WUJLDjTktbY7whSgrIxxxjFItMdn1+04ZZYu19l+1IS2sSY3e4Sn08h9K0WQNbl7tlhzVUshcTb5t9P26KEWLSeof2cF3c1E+J8Ve1LM1pEhtO4lPB4UAUgdD50zwrvebqLWzO0mzdzcY6n2kwiVLQlLpbKilWdvKT51ddt0zckW6RbTGnLDqkLKywU42/Pim3RvZ5O05OivxzcHDHhmIkOMDGwvl4+XXKttWjcbLOZDfdUohmyjSTbEm63S0x5SXW3CWstL8ZznhQBBwCcg0vsrMkQO4t7kK5xmEoabcYcCF4CE4IySM9QRx0q0B2RuI0rJsPfXAsvl1ZWGBlHeKCjjHXBFNbnYRb2rchtt26tyEJCA+xHwvI+9xjJqCoYJAGubmV6gc+me57JMh5X1uoE9cZMfVbTMuO81ESiKkB5oZDp9/xDPn0PnWpOz1LibQ9lBwp8kZ8uAKpy0dmt4t7qdk3VEkAoJ7+KhW7b5ZIJH4+dXZomJNYtG2XFUysuqIS4MKx5ZpGwCNxPX0T5KqSeNrHgaX18VIwhKTkCvT79ChT1CvFe+KMOTzQoUvJLyXvShgHrQoUiRFVQCQBwKFClOyaN14oZIzRhQoV7kvHdDNDNChTU9DNAUKFKF5e15QoV4pEM17QoV4JSiq4rzqTQoUwk3TSgCdwFHoUKelGwX//2Q==]]></data>
	</file>
	<file>
	  <filename>/codemirror/css/sparqlcolors.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aHRtbCB7CiAgY3Vyc29yOiB0ZXh0Owp9CgouZWRpdGJveCB7CiAgbWFyZ2luOiAuNGVtOwogIHBhZGRpbmc6IDA7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICBmb250LXNpemU6IDEwcHQ7CiAgY29sb3I6IGJsYWNrOwp9CgouZWRpdGJveCBwIHsKICBtYXJnaW46IDA7Cn0KCnNwYW4uc3Ata2V5d29yZCB7CiAgY29sb3I6ICM3MDg7Cn0KCnNwYW4uc3AtcHJlZml4ZWQgewogIGNvbG9yOiAjNWQxOwp9CgpzcGFuLnNwLXZhciB7CiAgY29sb3I6ICMwMGM7Cn0KCnNwYW4uc3AtY29tbWVudCB7CiAgY29sb3I6ICNhNzA7Cn0KCnNwYW4uc3AtbGl0ZXJhbCB7CiAgY29sb3I6ICNhMjI7Cn0KCnNwYW4uc3AtdXJpIHsKICBjb2xvcjogIzI5MjsKfQoKc3Bhbi5zcC1vcGVyYXRvciB7CiAgY29sb3I6ICMwODg7Cn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror/css/xmlcolors.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aHRtbCB7CiAgY3Vyc29yOiB0ZXh0Owp9CgouZWRpdGJveCB7CiAgbWFyZ2luOiAuNGVtOwogIHBhZGRpbmc6IDA7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICBmb250LXNpemU6IDEwcHQ7CiAgY29sb3I6IGJsYWNrOwp9CgouZWRpdGJveCBwIHsKICBtYXJnaW46IDA7Cn0KCnNwYW4ueG1sLXRhZ25hbWUgewogIGNvbG9yOiAjQTBCOwp9CgpzcGFuLnhtbC1hdHRyaWJ1dGUgewogIGNvbG9yOiAjMjgxOwp9CgpzcGFuLnhtbC1wdW5jdHVhdGlvbiB7CiAgY29sb3I6IGJsYWNrOwp9CgpzcGFuLnhtbC1hdHRuYW1lIHsKICBjb2xvcjogIzAwRjsKfQoKc3Bhbi54bWwtY29tbWVudCB7CiAgY29sb3I6ICNBNzA7Cn0KCnNwYW4ueG1sLWNkYXRhIHsKICBjb2xvcjogIzQ4QTsKfQoKc3Bhbi54bWwtcHJvY2Vzc2luZyB7CiAgY29sb3I6ICM5OTk7Cn0KCnNwYW4ueG1sLWVudGl0eSB7CiAgY29sb3I6ICNBMjI7Cn0KCnNwYW4ueG1sLWVycm9yIHsKIGNvbG9yOiAjRjAwICFpbXBvcnRhbnQ7Cn0KCnNwYW4ueG1sLXRleHQgewogIGNvbG9yOiBibGFjazsKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/csstest.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHNjcmlwdCBzcmM9ImpzL2NvZGVtaXJyb3IuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgICA8dGl0bGU+Q29kZU1pcnJvcjogQ1NTIGRlbW9uc3RyYXRpb248L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iY3NzL2RvY3MuY3NzIi8+CiAgPC9oZWFkPgogIDxib2R5IHN0eWxlPSJwYWRkaW5nOiAyMHB4OyI+Cgo8cD5EZW1vbnN0cmF0aW9uIG9mIDxhIGhyZWY9ImluZGV4Lmh0bWwiPkNvZGVNaXJyb3I8L2E+J3MgQ1NTCmhpZ2hsaWdodGVyLjwvcD4KCjxkaXYgY2xhc3M9ImJvcmRlciI+Cjx0ZXh0YXJlYSBpZD0iY29kZSIgY29scz0iMTIwIiByb3dzPSIzMCI+Ci8qIFNvbWUgZXhhbXBsZSBDU1MgKi8KCkBpbXBvcnQgdXJsKCJzb21ldGhpbmcuY3NzIik7Cgpib2R5IHsKICBtYXJnaW46IDA7CiAgcGFkZGluZzogM2VtIDZlbTsKICBmb250LWZhbWlseTogdGFob21hLCBhcmlhbCwgc2Fucy1zZXJpZjsKICBjb2xvcjogIzAwMDsKfQoKI25hdmlnYXRpb24gYSB7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgdGV4dC1kZWNvcmF0aW9uOiBub25lICFpbXBvcnRhbnQ7Cn0KCmgxIHsKICBmb250LXNpemU6IDIuNWVtOwp9CgpoMiB7CiAgZm9udC1zaXplOiAxLjdlbTsKfQoKaDE6YmVmb3JlLCBoMjpiZWZvcmUgewogIGNvbnRlbnQ6ICI6OiI7Cn0KCmNvZGUgewogIGZvbnQtZmFtaWx5OiBjb3VyaWVyLCBtb25vc3BhY2U7CiAgZm9udC1zaXplOiA4MCU7CiAgY29sb3I6ICM0MThBOEE7Cn0KPC90ZXh0YXJlYT4KPC9kaXY+Cgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKCdjb2RlJywgewogICAgaGVpZ2h0OiAiMzUwcHgiLAogICAgcGFyc2VyZmlsZTogInBhcnNlY3NzLmpzIiwKICAgIHN0eWxlc2hlZXQ6ICJjc3MvY3NzY29sb3JzLmNzcyIsCiAgICBwYXRoOiAianMvIgogIH0pOwo8L3NjcmlwdD4KCiAgPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/faq.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zPC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImNzcy9kb2NzLmNzcyIvPgogICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiLz4KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIGgzIHtmb250LXNpemU6IDEwMCU7fQogICAgPC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8ZGl2IGNsYXNzPSJ0b3AgdW5kZXJsaW5lIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIj4KICAgICAgPGgxIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwOyI+PGEgaHJlZj0iaW5kZXguaHRtbCIgc3R5bGU9InRleHQtZGVjb3JhdGlvbjogbm9uZTsgY29sb3I6IGJsYWNrOyI+Q29kZU1pcnJvcjwvYT48L2gxPgogICAgICA8aDIgc3R5bGU9Im1hcmdpbi10b3A6IDA7IG1hcmdpbi1ib3R0b206IC4zZW07Ij5GcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9uczwvaDI+CiAgICA8L2Rpdj4KCiAgICA8aDMgaWQ9ImxpY2Vuc2UiPlE6IENhbiBJIHVzZSBDb2RlTWlycm9yIGluIG15IHN1Y2gtYW5kLXN1Y2ggcHJvamVjdD88L2gzPgoKICAgIDxwPkE6IFllcy4gVGhlIDxhIGhyZWY9IkxJQ0VOU0UiPmxpY2Vuc2U8L2E+IGlzIHNob3J0LCBzaW1wbGUsIGFuZAogICAgcGVybWlzc2l2ZS48L3A+CgogICAgPGgzIGlkPSJjYWNoZSI+UTogWW91IHNhaWQgeW91IGZpeGVkIHRoaXMtYW5kLXRoaXMgaXNzdWUsIGJ1dCBJJ20KICAgIHN0aWxsIHNlZWluZyBpdC48L2gzPgoKICAgIDxwPkE6IE9uZSBwb3NzaWJpbGl0eSBpcyB0aGF0IEkgc2NyZXdlZCB1cCwgYnV0IGEgdmVyeSByZWFsCiAgICBhbHRlcm5hdGl2ZSBpcyB0aGF0IHlvdSdyZSBsb29raW5nIGF0IGEgY2FjaGVkIHZlcnNpb24gb2YgdGhlCiAgICBDb2RlTWlycm9yIHNjcmlwdHMuIEJlY2F1c2UgdGhlIHNjcmlwdHMgYXJlIGxvYWRlZCBpbnRvIGFuIGlmcmFtZSwKICAgIHRoZSBjdHJsLWY1IHlvdSBpc3N1ZWQgb24gdGhlIG91dGVyIHBhZ2UgZG9lc24ndCBhbHdheXMgY2F1c2UgdGhlbQogICAgdG8gYmUgcmVsb2FkZWQgKElFLCBPcGVyYSwgYW5kIEZpcmVmb3ggYXJlIHRoZSB3b3JzdCBvZmZlbmRlcnMKICAgIGhlcmUpLiBDbGVhciB5b3VyIGNhY2hlIGFuZCByZS10cnkuPC9wPgoKICAgIDxoMyBpZD0idGV4dGFyZWEiPlE6IEkgY2FuJ3QgcHV0IGNvbnRlbnQgY29udGFpbmluZwogICAgPGNvZGU+Jmx0Oy90ZXh0YXJlYT48L2NvZGU+IGludG8gQ29kZU1pcnJvciE8L2gzPgoKICAgIDxwPkE6IFtXZWItcHJvZ3JhbW1pbmcgMTAxXSBUaGUgZmlyc3QgPGNvZGU+Jmx0Oy90ZXh0YXJlYT48L2NvZGU+CiAgICBmb2xsb3dpbmcgYSA8Y29kZT4mbHQ7dGV4dGFyZWE+PC9jb2RlPiB0YWcgd2lsbCBjbG9zZSB0aGUKICAgIHRleHRhcmVhLiBUaGlzIGhhcyBub3RoaW5nIHRvIGRvIHdpdGggQ29kZU1pcnJvci4gU2l0IGRvd24sIGFuZAogICAgc3BlbmQgdGVuIG1pbnV0ZXMgdGhpbmtpbmcgYWJvdXQgd2h5IEhUTUwtZXNjYXBpbmcgd2FzCiAgICBpbnZlbnRlZC48L3A+CgogICAgPGgzIGlkPSJkZWJ1ZyI+UTogSSBoYXZlIHRoaXMgaHVnZSBjaHVuayBvZiBjb2RlIHRoYXQgZG9lcyBub3QKICAgIHdvcmssIGNhbiB5b3UgZGVidWcgaXQgZm9yIG1lPzwvaDM+CgogICAgPHA+QTogTm9wZS4gSWYgeW91IGNhbid0IGJlIGJvdGhlcmVkIGlzb2xhdGUgeW91ciBwcm9ibGVtIGluIDIwCiAgICBsaW5lcyBvZiBjb2RlIG9yIGxlc3MsIEkgY2FuJ3QgYmUgYm90aGVyZWQgdG8gdGhpbmsgYWJvdXQgaXQuPC9wPgoKICAgIDxoMyBpZD0icGF0Y2giPlE6IEhvdyBkbyBJIHN1Ym1pdCBwYXRjaGVzIGZvciBDb2RlTWlycm9yPzwvaDM+CgogICAgPHA+QTogUHJlZmVycmVkIHdheSBpcyB0byBjcmVhdGUgYSBmb3JrIG9uIDxhCiAgICBocmVmPSJodHRwOi8vZ2l0aHViLmNvbS9tYXJpam5oL0NvZGVNaXJyb3IiPmdpdGh1YjwvYT4sIGFkZCB5b3VyCiAgICBwYXRjaCwgYW5kIHNlbmQgbWUgYSBwdWxsIHJlcXVlc3QuIERpZmZzIChhZ2FpbnN0IHRoZSBsYXRlc3QKICAgIHZlcnNpb24hKSBieSBtYWlsIGFyZSBhbHNvIGNvb2wuPC9wPgoKICA8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror/highlight.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHNjcmlwdCBzcmM9ImpzL2hpZ2hsaWdodC5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJqcy9zdHJpbmdzdHJlYW0uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ianMvdG9rZW5pemUuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ianMvdG9rZW5pemVqYXZhc2NyaXB0LmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImpzL3BhcnNlamF2YXNjcmlwdC5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KICAgIDx0aXRsZT5Db2RlTWlycm9yOiBTdHJpbmcgaGlnaGxpZ2h0IGRlbW9uc3RyYXRpb248L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iY3NzL2pzY29sb3JzLmNzcyIvPgogIDwvaGVhZD4KICA8Ym9keSBzdHlsZT0icGFkZGluZzogMjBweDsiPgoKPGRpdiBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7IHBhZGRpbmc6IC40ZW07Ij4KPHRleHRhcmVhIGlkPSJjb2RlIiBjb2xzPSIxMjAiIHJvd3M9IjIwIiBzdHlsZT0iYm9yZGVyLXdpZHRoOiAwIj4KLy8gRGVtbyBmb3IgcnVubmluZyBhIENvZGVNaXJyb3IgcGFyc2VyIG92ZXIgYSBwaWVjZSBvZiBjb2RlIHdpdGhvdXQKLy8gY3JlYXRpbmcgYW4gYWN0dWFsIGVkaXRvci4KCihmdW5jdGlvbigpewogIGZ1bmN0aW9uIG5vcm1hbGlzZVN0cmluZyhzdHJpbmcpIHsKICAgIHZhciB0YWIgPSAiIjsKICAgIGZvciAodmFyIGkgPSAwOyBpICZsdDsgaW5kZW50VW5pdDsgaSsrKSB0YWIgKz0gIiAiOwoKICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKC9cdC9nLCB0YWIpLnJlcGxhY2UoL1x1MDBhMC9nLCAiICIpLnJlcGxhY2UoL1xyXG4/L2csICJcbiIpOwogICAgdmFyIHBvcyA9IDAsIHBhcnRzID0gW10sIGxpbmVzID0gc3RyaW5nLnNwbGl0KCJcbiIpOwogICAgZm9yICh2YXIgbGluZSA9IDA7IGxpbmUgJmx0OyBsaW5lcy5sZW5ndGg7IGxpbmUrKykgewogICAgICBpZiAobGluZSAhPSAwKSBwYXJ0cy5wdXNoKCJcbiIpOwogICAgICBwYXJ0cy5wdXNoKGxpbmVzW2xpbmVdKTsKICAgIH0KCiAgICByZXR1cm4gewogICAgICBuZXh0OiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAocG9zICZsdDsgcGFydHMubGVuZ3RoKSByZXR1cm4gcGFydHNbcG9zKytdOwogICAgICAgIGVsc2UgdGhyb3cgU3RvcEl0ZXJhdGlvbjsKICAgICAgfQogICAgfTsKICB9CgogIHdpbmRvdy5oaWdobGlnaHRUZXh0ID0gZnVuY3Rpb24oc3RyaW5nLCBvdXRwdXQsIHBhcnNlcikgewogICAgdmFyIHBhcnNlciA9IChwYXJzZXIgfHwgRWRpdG9yLlBhcnNlcikubWFrZShzdHJpbmdTdHJlYW0obm9ybWFsaXNlU3RyaW5nKHN0cmluZykpKTsKICAgIHRyeSB7CiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgdmFyIHRva2VuID0gcGFyc2VyLm5leHQoKTsKICAgICAgICB2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIlNQQU4iKTsKICAgICAgICBzcGFuLmNsYXNzTmFtZSA9IHRva2VuLnN0eWxlOwogICAgICAgIHNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodG9rZW4udmFsdWUpKTsKICAgICAgICBvdXRwdXQuYXBwZW5kQ2hpbGQoc3Bhbik7CiAgICAgIH0KICAgIH0KICAgIGNhdGNoIChlKSB7CiAgICAgIGlmIChlICE9IFN0b3BJdGVyYXRpb24pIHRocm93IGU7CiAgICB9CiAgfQp9KSgpOwo8L3RleHRhcmVhPgo8L2Rpdj4KCjxidXR0b24gb25jbGljaz0iaGlnaGxpZ2h0KCkiPlJ1biBoaWdobGlnaHRlcjwvYnV0dG9uPgoKPGRpdj4KPGRpdiBpZD0ibnVtYmVycyIgc3R5bGU9ImZsb2F0OiBsZWZ0OyB3aWR0aDogMmVtOyBtYXJnaW4tcmlnaHQ6IC41ZW07IHRleHQtYWxpZ246IHJpZ2h0OyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogI0NDQzsiPjwvZGl2Pgo8cHJlIGlkPSJvdXRwdXQiIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlIj48L3ByZT4KPC9kaXY+Cgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiAgLy8gU2ltcGxlIGhhY2sgdG8gZGVtb25zdHJhdGUgYWRkaW5nIGxpbmUgbnVtYmVycy4gSnVzdCBwYXNzIHRoZSBET00gbm9kZSBhcwogIC8vIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gaGlnaGxpZ2h0VGV4dCB3aGVuIHlvdSBkb24ndCBuZWVkIHRob3NlCiAgZnVuY3Rpb24gaGlnaGxpZ2h0KCkgewogICAgdmFyIGxpbmVObyA9IDEsIG91dHB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvdXRwdXQiKSwgbnVtYmVycyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJudW1iZXJzIik7CiAgICBvdXRwdXQuaW5uZXJIVE1MID0gbnVtYmVycy5pbm5lckhUTUwgPSAiIjsKCiAgICBmdW5jdGlvbiBhZGRMaW5lKGxpbmUpIHsKICAgICAgbnVtYmVycy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcobGluZU5vKyspKSk7CiAgICAgIG51bWJlcnMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiQlIiKSk7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZS5sZW5ndGg7IGkrKykgb3V0cHV0LmFwcGVuZENoaWxkKGxpbmVbaV0pOwogICAgICBvdXRwdXQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiQlIiKSk7CiAgICB9CiAgICBoaWdobGlnaHRUZXh0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIikudmFsdWUsIGFkZExpbmUpOwogIH0KPC9zY3JpcHQ+CgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/htmltest.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHNjcmlwdCBzcmM9ImpzL2NvZGVtaXJyb3IuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgICA8dGl0bGU+Q29kZU1pcnJvcjogSFRNTC9YTUwgZGVtb25zdHJhdGlvbjwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJjc3MvZG9jcy5jc3MiLz4KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIC5Db2RlTWlycm9yLWxpbmUtbnVtYmVycyB7CiAgICAgICAgd2lkdGg6IDIuMmVtOwogICAgICAgIGNvbG9yOiAjYWFhOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWU7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgcGFkZGluZy1yaWdodDogLjNlbTsKICAgICAgICBmb250LXNpemU6IDEwcHQ7CiAgICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgICAgICBwYWRkaW5nLXRvcDogLjRlbTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHkgc3R5bGU9InBhZGRpbmc6IDIwcHg7Ij4KCjxwPlRoaXMgaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbiBvZiB0aGUgWE1ML0hUTUwgaW5kZW50YXRpb24gbW9kdWxlCmZvciA8YSBocmVmPSJpbmRleC5odG1sIj5Db2RlTWlycm9yPC9hPi4gVGhlIDxhCmhyZWY9ImpzL3BhcnNleG1sLmpzIj5qYXZhc2NyaXB0PC9hPiBmaWxlIGNvbnRhaW5zIHNvbWUgY29tbWVudHMgd2l0aAptb3JlIGluZm9ybWF0aW9uLjwvcD4KCjxkaXYgc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyBwYWRkaW5nOiAwcHg7Ij4KPHRleHRhcmVhIGlkPSJjb2RlIiBjb2xzPSIxMjAiIHJvd3M9IjMwIj4KJmx0O2h0bWwgc3R5bGU9ImNvbG9yOiBncmVlbiImZ3Q7CiAgJmx0OyEtLSB0aGlzIGlzIGEgY29tbWVudCAtLSZndDsKICAmbHQ7aGVhZCZndDsKICAgICZsdDt0aXRsZSZndDtIVE1MIEV4YW1wbGUmbHQ7L3RpdGxlJmd0OwogICZsdDsvaGVhZCZndDsKICAmbHQ7Ym9keSZndDsKICAgIFRoZSBpbmRlbnRhdGlvbiB0cmllcyB0byBiZSAmbHQ7ZW0mZ3Q7c29tZXdoYXQgJmFtcDtxdW90O2RvIHdoYXQKICAgIEkgbWVhbiZhbXA7cXVvdDsmbHQ7L2VtJmd0Oy4uLiBidXQgbWlnaHQgbm90IG1hdGNoIHlvdXIgc3R5bGUuCiAgJmx0Oy9ib2R5Jmd0OwombHQ7L2h0bWwmZ3Q7CjwvdGV4dGFyZWE+CjwvZGl2PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYSgnY29kZScsIHsKICAgIGhlaWdodDogIjM1MHB4IiwKICAgIHBhcnNlcmZpbGU6ICJwYXJzZXhtbC5qcyIsCiAgICBzdHlsZXNoZWV0OiAiY3NzL3htbGNvbG9ycy5jc3MiLAogICAgcGF0aDogImpzLyIsCiAgICBjb250aW51b3VzU2Nhbm5pbmc6IDUwMCwKICAgIGxpbmVOdW1iZXJzOiB0cnVlCiAgfSk7Cjwvc2NyaXB0PgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IEluLWJyb3dzZXIgY29kZSBlZGl0aW5nPC90aXRsZT4KCiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJjc3MvZG9jcy5jc3MiLz4KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIGRpdi50b3Age3RleHQtYWxpZ246IGNlbnRlcjt9CiAgICAgIGRpdi50b3AgaDEge21hcmdpbi1ib3R0b206IDA7fQogICAgICBkaXYudG9wIGgyIHttYXJnaW4tdG9wOiAwOyBtYXJnaW4tYm90dG9tOiAxLjVlbTt9CiAgICAgIGRpdi5kb25hdGUgc3BhbiB7Y3Vyc29yOiBwb2ludGVyOyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTt9CiAgICAgIGRpdi5kb25hdGUge2ZvbnQtc2l6ZTogNzAlOyBtYXJnaW4tdG9wOiAxZW07IHdpZHRoOiAxNTVweDsgcGFkZGluZzogMTBweDsgYm9yZGVyOiAxcHggc29saWQgI2M0NDt9CiAgICA8L3N0eWxlPgogICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiLz4KICA8L2hlYWQ+CiAgPGJvZHk+Cgo8ZGl2IGNsYXNzPSJ0b3AiPgogIDxoMT5Db2RlTWlycm9yPC9oMT4KICA8aDIgY2xhc3M9InVuZGVybGluZSI+SW4tYnJvd3NlciBjb2RlIGVkaXRpbmcgbWFkZSBhbG1vc3QgYmVhcmFibGU8L2gyPgo8L2Rpdj4KPGRpdiBzdHlsZT0iZmxvYXQ6IHJpZ2h0OyBwYWRkaW5nLWxlZnQ6IDEwcHg7Ij4KICA8Zm9ybSBhY3Rpb249Imh0dHBzOi8vd3d3LnBheXBhbC5jb20vY2dpLWJpbi93ZWJzY3IiIG1ldGhvZD0icG9zdCIgaWQ9InBheXBhbCI+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjbWQiIHZhbHVlPSJfcy14Y2xpY2siLz4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Imhvc3RlZF9idXR0b25faWQiIHZhbHVlPSIzRlZIUzVGR1VZN0NDIi8+CiAgPC9mb3JtPgogIDxpbWcgc3JjPSJjc3MvcGVvcGxlLmpwZyIgYWx0PSIiLz48YnIvPgogIDxkaXYgY2xhc3M9ImRvbmF0ZSI+CiAgICBNYWtlIGEgZG9uYXRpb246CiAgICA8dWwgc3R5bGU9Im1hcmdpbjogMCAyZW07IHBhZGRpbmc6IDAiPgogICAgICA8bGk+PHNwYW4gb25jbGljaz0iZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BheXBhbCcpLnN1Ym1pdCgpOyI+UGF5cGFsPC9zcGFuPjwvbGk+CiAgICAgIDxsaT48c3BhbiBvbmNsaWNrPSJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFua2luZm8nKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsiPkJhbms8L3NwYW4+PC9saT4KICAgIDwvdWw+CiAgICA8ZGl2IGlkPSJiYW5raW5mbyIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7IGZvbnQtc2l6ZTogODAlOyI+CiAgICAgIEJhbms6IDxpPlJhYm9iYW5rPC9pPjxici8+CiAgICAgIENvdW50cnk6IDxpPk5ldGhlcmxhbmRzPC9pPjxici8+CiAgICAgIFNXSUZUOiA8aT5SQUJPTkwyVTwvaT48YnIvPgogICAgICBBY2NvdW50OiA8aT4xNDc4NTA3NzA8L2k+PGJyLz4KICAgICAgTmFtZTogPGk+TWFyaWpuIEhhdmVyYmVrZTwvaT48YnIvPgogICAgICBJQkFOOiA8aT5OTDI2IFJBQk8gMDE0NyA4NTA3IDcwPC9pPgogICAgPC9kaXY+CiAgPC9kaXY+CjwvZGl2PgoKPHA+Q29kZU1pcnJvciBpcyBhIEphdmFTY3JpcHQgbGlicmFyeSB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhCnJlbGF0aXZlbHkgcGxlYXNhbnQgZWRpdG9yIGludGVyZmFjZSBmb3IgY29kZS1saWtlIGNvbnRlbnQgJiN4MjAxNTsKY29tcHV0ZXIgcHJvZ3JhbXMsIEhUTUwgbWFya3VwLCBhbmQgc2ltaWxhci4gSWYgYSBwYXJzZXIgaGFzIGJlZW4Kd3JpdHRlbiBmb3IgdGhlIGxhbmd1YWdlIHlvdSBhcmUgZWRpdGluZyAoc2VlIGJlbG93IGZvciBhIGxpc3Qgb2YKc3VwcG9ydGVkIGxhbmd1YWdlcyksIHRoZSBjb2RlIHdpbGwgYmUgY29sb3VyZWQsIGFuZCB0aGUgZWRpdG9yIHdpbGwKaGVscCB5b3Ugd2l0aCBpbmRlbnRhdGlvbi48L3A+Cgo8cD5UbyBnZXQgYSBsb29rIGF0IENvZGVNaXJyb3IsIHNlZSB0aGUgdGVzdCBwYWdlcyBmb3IgdGhlIHZhcmlvdXMKcGFyc2Vycy4uLjwvcD4KCjx1bD4KICA8bGk+PGEgaHJlZj0ianN0ZXN0Lmh0bWwiPkphdmFTY3JpcHQ8L2E+PC9saT4KICA8bGk+PGEgaHJlZj0iaHRtbHRlc3QuaHRtbCI+WE1ML0hUTUw8L2E+PC9saT4KICA8bGk+PGEgaHJlZj0iY3NzdGVzdC5odG1sIj5DU1M8L2E+PC9saT4KICA8bGk+PGEgaHJlZj0ic3BhcnFsdGVzdC5odG1sIj5TUEFSUUw8L2E+PC9saT4KICA8bGk+PGEgaHJlZj0ibWl4ZWR0ZXN0Lmh0bWwiPkhUTUwgbWl4ZWQtbW9kZTwvYT48L2xpPgogIDxsaT48YSBocmVmPSJjb250cmliL3BocC9pbmRleC5odG1sIj5IVE1MK1BIUCBtaXhlZC1tb2RlPC9hPiAoY291cnRlc3kgb2YgPGEgaHJlZj0iY29udHJpYi9waHAvTElDRU5TRSI+WWFob28hPC9hPik8L2xpPgogIDxsaT48YSBocmVmPSJjb250cmliL3B5dGhvbi9pbmRleC5odG1sIj5QeXRob248L2E+IChjb3VydGVzeSBvZiA8YSBocmVmPSJjb250cmliL3B5dGhvbi9MSUNFTlNFIj5UaW1vdGh5IEZhcnJlbGw8L2E+KTwvbGk+CiAgPGxpPjxhIGhyZWY9ImNvbnRyaWIvbHVhL2luZGV4Lmh0bWwiPkx1YTwvYT4gKGNvdXJ0ZXN5IG9mIDxhIGhyZWY9Imh0dHA6Ly9mcmFuY2lvLnBsLyI+RnJhbmNpc3playBXYXdyemFrPC9hPik8L2xpPgogIDxsaT48YSBocmVmPSJodHRwOi8vZ2l0aHViLmNvbS9oYWt1bmluL3J1YnktaW4tY29kZW1pcnJvci90cmVlL21hc3RlciI+UnVieTwvYT4gKGJ5IE1pY2hhbCBIYW50bCwgdW5maW5pc2hlZCk8L2xpPgogIDxsaT48YSBocmVmPSJjb250cmliL3NxbC9pbmRleC5odG1sIj5TUUw8L2E+IChjb3VydGVzeSBvZiBKb2huIEJlbmVkaWt0c3Nvbik8L2xpPgogIDxsaT48YSBocmVmPSJjb250cmliL3Bsc3FsL2luZGV4Lmh0bWwiPlBMU1FMPC9hPiAoY291cnRlc3kgb2YgPGEgaHJlZj0iaHR0cDovL3d3dy5vcmFjbGUtYW5kLWFwZXguY29tLyI+UGV0ZXIgUmFnYW5pdHNjaDwvYT4pPC9saT4KICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5saXJhbnVuYS5jb20vZGlmZi1wYXJzZXItZm9yLWNvZGVtaXJyb3IvIj5kaWZmPC9hPiAoY291cnRlc3kgb2YgPGEgaHJlZj0iaHR0cDovL3d3dy5saXJhbnVuYS5jb20iPkxpcmFuIE51bmE8L2E+KTwvbGk+CiAgPGxpPjxhIGhyZWY9ImNvbnRyaWIvZ3Jvb3Z5L2luZGV4Lmh0bWwiPkdyb292eTwvYT4gKGJ5IDxhIGhyZWY9Imh0dHA6Ly9leG9wbGF0Zm9ybS5vcmcvIj5lWG8gUGxhdGZvcm08L2E+KTwvbGk+CiAgPGxpPjxhIGhyZWY9ImNvbnRyaWIvY3NoYXJwL2luZGV4Lmh0bWwiPkMjPC9hPiAoYnkgPGEgaHJlZj0iaHR0cDovL3NraWxsdGVzdGluZy5jb20vIj5Cb3JpcyBHYWJlciBhbmQgQ2hyaXN0b3BoZXIgQnVjaGlubzwvYT4pPC9saT4KPC91bD4KCjxwPk9yIHRha2UgYSBsb29rIGF0IHNvbWUgcmVhbC13b3JsZCB1c2VzIG9mIHRoZSBzeXN0ZW0uLi48L3A+Cgo8dWw+CiAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9rbWwtc2FtcGxlcy5nb29nbGVjb2RlLmNvbS9zdm4vdHJ1bmsvaW50ZXJhY3RpdmUvaW5kZXguaHRtbCI+R29vZ2xlIEVhcnRoIEtNTCBzYW1wbGVyPC9hPjwvbGk+CiAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9lbG9xdWVudGphdmFzY3JpcHQubmV0L2NoYXB0ZXIxLmh0bWwiPkVsb3F1ZW50IEphdmFTY3JpcHQncyBjb25zb2xlPC9hPjwvbGk+CiAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9kZW1vLnFvb3hkb28ub3JnL2N1cnJlbnQvcGxheWdyb3VuZC8jSGVsbG9fV29ybGQiPlRoZSBxb294ZG9vIHBsYXlncm91bmQ8L2E+PC9saT4KICA8bGk+PGEgaHJlZj0iaHR0cDovL2JpbGxtaWxsLm9yZy9zdGF0aWMvY2FudmFzdHV0b3JpYWwvaW5kZXguaHRtbCI+QSBjb29sIHR1dG9yaWFsIGFib3V0IHRoZSAmbHQ7Y2FudmFzPiBlbGVtZW50PC9hPjwvbGk+CiAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9vcmMuY3NyZXMudXRleGFzLmVkdS90cnlvcmMuc2h0bWwiPkFuIG9ubGluZSBJREUgZm9yIHRoZSBPcmMgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2U8L2E+PC9saT4KICA8bGk+PGEgaHJlZj0iaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9hcGlzL2FqYXgvcGxheWdyb3VuZCI+R29vZ2xlJ3MgQVBJIHBsYXlncm91bmQ8L2E+PC9saT4KICA8bGk+PGEgaHJlZj0iaHR0cDovL2NyYWljLmNvbS90dXRvcmlhbHMvamF2YXNjcmlwdC9yYXBoYWVsX2xpdmUvcmFwaGFlbF9saXZlLmh0bWwiPlJhcGhhw6tsIExpdmU8L2E+PC9saT4KICA8bGk+PGEgaHJlZj0iaHR0cDovL2Rldi5mcmVlYmFzZWFwcHMuY29tLyI+RnJlZWJhc2UncyBBY3JlIElERTwvYT48L2xpPgogIDxsaT48YSBocmVmPSJodHRwOi8vanNiaW4uY29tLyI+SlMgQmluPC9hPjwvbGk+CiAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cucm9ja2V0dGhlbWUuY29tL2V4dGVuc2lvbnMtam9vbWxhL3Jva3BhZCI+VGhlIFJva1BhZCBwbHVnaW4gZm9yIEpvb21sYTwvYT48L2xpPgogIDxsaT48YSBocmVmPSJodHRwOi8vc2NyYXBlcndpa2kuY29tL2VkaXRvci8iPlRoZSBzY3JhcGVyd2lraSBlZGl0b3I8L2E+PC9saT4KPC91bD4KCjxoMj5SZWxlYXNlczwvaDI+Cgo8cCBjbGFzcz0icmVsIj48ZW0+MjEtMDYtMjAxMDwvZW0+OiA8YQpocmVmPSJodHRwOi8vbWFyaWpuLmhhdmVyYmVrZS5ubC9jb2RlbWlycm9yL2NvZGVtaXJyb3ItMC43LnppcCI+VmVyc2lvbgowLjc8L2E+OjwvcD4KCjx1bCBjbGFzcz0icmVsIj4KICA8bGk+Rml4ZXMgaXNzdWUgd2hlcmUgY2FsbGluZyA8Y29kZT4uc3VibWl0KCk8L2NvZGU+IG9uIGEgZm9ybSB3aXRoCiAgYSA8Y29kZT5mcm9tVGV4dEFyZWE8L2NvZGU+IENvZGVNaXJyb3IgZmFpbGVkIHRvIHN1Ym1pdCB0aGUKICBlZGl0ZWQgY29udGVudC48L2xpPgogIDxsaT5BZGQgPGEgaHJlZj0iY29udHJpYi9ncm9vdnkvaW5kZXguaHRtbCI+R3Jvb3Z5PC9hPiBwYXJzZXIgKGhvc3RlZCBleHRlcm5hbGx5KS48L2xpPgogIDxsaT5NYWtlIGxpbmUtbnVtYmVyaW5nIG11Y2gsIG11Y2ggZmFzdGVyLjwvbGk+CiAgPGxpPkZpeCBvY2Nhc2lvbmFsIGJ1Z2d5IGJlaGF2aW91ciBvZiB0aGUgZW50ZXIga2V5IGluIE9wZXJhLjwvbGk+CiAgPGxpPkFkZCBhIDxhIGhyZWY9ImZhcS5odG1sIj5GQVE8L2E+IGRvY3VtZW50LjwvbGk+CiAgPGxpPk1ha2Ugc2VhcmNoIHVzZSBkby13aGF0LUktbWVhbiBFbWFjcy1saWtlIGJlaGF2aW91ciB0byBkZXRlcm1pbmUKICBjYXNlLXNlbnNpdGl2aXRpeSBpcyBub3QgZXhwbGljaXRseSBzcGVjaWZpZWQuPC9saT4KICA8bGk+QWRkIGEgQyMgcGFyc2VyIGNvbnRyaWIgbW9kdWxlLjwvbGk+CiAgPGxpPkEgbnVtYmVyIG9mIGJ1Z2ZpeGVzIGFuZCBleHRlbnNpb25zIHRvIHRoZSBQSFAgcGFyc2VyIChsYW1iZGFzLAogIGFic3RyYWN0IGNsYXNzZXMsIGNvbmZpZ3VyYWJsZSBvcGVuaW5nIHRhZ3MpLjwvbGk+CiAgPGxpPkZpeCBtdWx0aWxpbmUgY29tbWVudHMgaW4gdGhlIEx1YSBwYXJzZXIuPC9saT4KPC91bD4KCjxwIGNsYXNzPSJyZWwiPjxlbT4yNy0wNC0yMDEwPC9lbT46IDxhCmhyZWY9Imh0dHA6Ly9tYXJpam4uaGF2ZXJiZWtlLm5sL2NvZGVtaXJyb3IvY29kZW1pcnJvci0wLjY3LnppcCI+VmVyc2lvbgowLjY3PC9hPjogTW9yZSBjb25zaXN0ZW50IHBhZ2UtdXAvcGFnZS1kb3duIGJlaGF2aW91ciBhY3Jvc3MgYnJvd3NlcnMuCkZpeCBzb21lIGlzc3VlcyB3aXRoIGhpZGRlbiBlZGl0b3JzIGxvb3BpbmcgZm9yZXZlciB3aGVuIGxpbmUtbnVtYmVycwp3ZXJlIGVuYWJsZWQuIE1ha2UgUEhQIHBhcnNlciBwYXJzZSA8Y29kZT4iXFwiPC9jb2RlPiBjb3JyZWN0bHkuIEhhdmUKPGNvZGU+anVtcFRvTGluZTwvY29kZT4gd29yayBvbiBsaW5lIGhhbmRsZXMsIGFuZCBhZGQKPGNvZGU+Y3Vyc29yTGluZTwvY29kZT4gZnVuY3Rpb24gdG8gZmV0Y2ggdGhlIGxpbmUgaGFuZGxlIHdoZXJlIHRoZQpjdXJzb3IgY3VycmVudGx5IGlzLiBBZGQgbmV3IDxjb2RlPnNldFN0eWxlc2hlZXQ8L2NvZGU+IGZ1bmN0aW9uIHRvCnN3aXRjaCBzdHlsZS1zaGVldHMgaW4gYSBydW5uaW5nIGVkaXRvci48L3A+Cgo8cCBjbGFzcz0icmVsIj48ZW0+MDEtMDMtMjAxMDwvZW0+OiA8YQpocmVmPSJodHRwOi8vbWFyaWpuLmhhdmVyYmVrZS5ubC9jb2RlbWlycm9yL2NvZGVtaXJyb3ItMC42Ni56aXAiPlZlcnNpb24KMC42NjwvYT46IEFkZHMgPGNvZGU+cmVtb3ZlTGluZTwvY29kZT4gbWV0aG9kIHRvIEFQSS4gSW50cm9kdWNlcyB0aGUKPGEgaHJlZj0iY29udHJpYi9wbHNxbC9pbmRleC5odG1sIj5QTFNRTCBwYXJzZXI8L2E+LiBNYXJrcyBYTUwgZXJyb3JzCmJ5IGFkZGluZyAocmF0aGVyIHRoYW4gcmVwbGFjaW5nKSBhIENTUyBjbGFzcywgc28gdGhhdCB0aGV5IGNhbiBiZQpkaXNhYmxlZCBieSBtb2RpZnlpbmcgdGhlaXIgc3R5bGUuIEZpeGVzIHNldmVyYWwgc2VsZWN0aW9uIGJ1Z3MsIGFuZCBhCm51bWJlciBvZiBzbWFsbCBnbGl0Y2hlcy48L3A+Cgo8cCBjbGFzcz0icmVsIj48ZW0+MTItMTEtMjAwOTwvZW0+OiA8YQpocmVmPSJodHRwOi8vbWFyaWpuLmhhdmVyYmVrZS5ubC9jb2RlbWlycm9yL2NvZGVtaXJyb3ItMC42NS56aXAiPlZlcnNpb24KMC42NTwvYT46IEFkZCBzdXBwb3J0IGZvciBoYXZpbmcgYm90aCBsaW5lLXdyYXBwaW5nIGFuZCBsaW5lLW51bWJlcnMKdHVybmVkIG9uLCBtYWtlIHBhcmVuLWhpZ2hsaWdodGluZyBzdHlsZSBjdXN0b21pc2FibGUKKDxjb2RlPm1hcmtQYXJlbjwvY29kZT4gYW5kIDxjb2RlPnVubWFya1BhcmVuPC9jb2RlPiBjb25maWcgb3B0aW9ucyksCndvcmsgYXJvdW5kIGEgc2VsZWN0aW9uIGJ1ZyB0aGF0IE9wZXJhIDxlbT5yZTwvZW0+aW50cm9kdWNlZCBpbgp2ZXJzaW9uIDEwLjwvcD4KCjxwIGNsYXNzPSJyZWwiPjxlbT4yMy0xMC0yMDA5PC9lbT46IDxhCmhyZWY9Imh0dHA6Ly9tYXJpam4uaGF2ZXJiZWtlLm5sL2NvZGVtaXJyb3IvY29kZW1pcnJvci0wLjY0LnppcCI+VmVyc2lvbgowLjY0PC9hPjogU29sdmVzIHNvbWUgaXNzdWVzIGludHJvZHVjZWQgYnkgdGhlIHBhc3RlLWhhbmRsaW5nIGNoYW5nZXMKZnJvbSB0aGUgcHJldmlvdXMgcmVsZWFzZS4gQWRkcyA8Y29kZT5zZXRTcGVsbGNoZWNrPC9jb2RlPiwKPGNvZGU+c2V0VGV4dFdyYXBwaW5nPC9jb2RlPiwgPGNvZGU+c2V0SW5kZW50VW5pdDwvY29kZT4sCjxjb2RlPnNldFVuZG9EZXB0aDwvY29kZT4sIDxjb2RlPnNldFRhYk1vZGU8L2NvZGU+LCBhbmQKPGNvZGU+c2V0TGluZU51bWJlcnM8L2NvZGU+IHRvIGN1c3RvbWlzZSBhIHJ1bm5pbmcgZWRpdG9yLiBJbnRyb2R1Y2VzCmFuIDxhIGhyZWY9ImNvbnRyaWIvc3FsL2luZGV4Lmh0bWwiPlNRTDwvYT4gcGFyc2VyLiBGaXhlcyBhIGZldyBzbWFsbApwcm9ibGVtcyBpbiB0aGUgPGEgaHJlZj0iY29udHJpYi9weXRob24vaW5kZXguaHRtbCI+UHl0aG9uPC9hPiBwYXJzZXIuCkFuZCwgYXMgdXN1YWwsIGFkZCB3b3JrYXJvdW5kcyBmb3IgdmFyaW91cyBuZXdseSBkaXNjb3ZlcmVkIGJyb3dzZXIKaW5jb21wYXRpYmlsaXRpZXMuPC9wPgoKPHAgY2xhc3M9InJlbCI+PGVtPjMxLTA4LTIwMDk8L2VtPjogPGEKaHJlZj0iaHR0cDovL21hcmlqbi5oYXZlcmJla2UubmwvY29kZW1pcnJvci9jb2RlbWlycm9yLTAuNjMuemlwIj5WZXJzaW9uCjAuNjM8L2E+OiBPdmVyaGF1bCBvZiBwYXN0ZS1oYW5kbGluZyAobGVzcyBmcmFnaWxlKSwgZml4ZXMgZm9yIHNldmVyYWwKc2VyaW91cyBJRTggaXNzdWVzIChjdXJzb3IganVtcGluZywgZW5kLW9mLWRvY3VtZW50IGJ1Z3MpIGFuZCBhIG51bWJlcgpvZiBzbWFsbCBwcm9ibGVtcy48L3A+Cgo8cCBjbGFzcz0icmVsIj48ZW0+MzAtMDUtMjAwOTwvZW0+OiA8YQpocmVmPSJodHRwOi8vbWFyaWpuLmhhdmVyYmVrZS5ubC9jb2RlbWlycm9yL2NvZGVtaXJyb3ItMC42Mi56aXAiPlZlcnNpb24KMC42MjwvYT46IEludHJvZHVjZXMgPGEgaHJlZj0iY29udHJpYi9weXRob24vaW5kZXguaHRtbCI+UHl0aG9uPC9hPgphbmQgPGEgaHJlZj0iY29udHJpYi9sdWEvaW5kZXguaHRtbCI+THVhPC9hPiBwYXJzZXJzLiBBZGQKPGNvZGU+c2V0UGFyc2VyPC9jb2RlPiAob24tdGhlLWZseSBtb2RlIGNoYW5naW5nKSBhbmQKPGNvZGU+Y2xlYXJIaXN0b3J5PC9jb2RlPiBtZXRob2RzLiBNYWtlIHBhcnNpbmcgcGFzc2VzIHRpbWUtYmFzZWQKaW5zdGVhZCBvZiBsaW5lcy1iYXNlZCAoc2VlIHRoZSA8Y29kZT5wYXNzVGltZTwvY29kZT4gb3B0aW9uKS48L3A+Cgo8aDIgaWQ9InN1cHBvcnRlZCI+U3VwcG9ydGVkIGJyb3dzZXJzPC9oMj4KCjxwPkF0IHRoaXMgdGltZSwgdGhlIGZvbGxvd2luZyBicm93c2VycyBhcmUgc3VwcG9ydGVkOjwvcD4KCjx1bD4KICA8bGk+RmlyZWZveCAxLjUgb3IgaGlnaGVyPC9saT4KICA8bGk+SW50ZXJuZXQgRXhwbG9yZXIgNiBvciBoaWdoZXI8L2xpPgogIDxsaT5TYWZhcmkgMyBvciBoaWdoZXI8L2xpPgogIDxsaT5PcGVyYSA5LjUyIG9yIGhpZ2hlcjwvbGk+CiAgPGxpPkNocm9tZTwvbGk+CjwvdWw+Cgo8cD5NYWtpbmcgaXQgd29yayBvbiBvdGhlciBicm93c2VycyB0aGF0IGhhdmUgZGVjZW50IHN1cHBvcnQgZm9yIHRoZQpXM0MgRE9NIG1vZGVsIHNob3VsZCBub3QgYmUgdG9vIGhhcmQsIGJ1dCBJIGFtIG5vdCBhY3RpdmVseSB0ZXN0aW5nCmFnYWluc3QgdGhvc2UuPC9wPgoKPGgyPkdldHRpbmcgdGhlIGNvZGU8L2gyPgoKPHA+QWxsIG9mIENvZGVNaXJyb3IgaXMgcmVsZWFzZWQgdW5kZXIgYSA8YQpocmVmPSJMSUNFTlNFIj56bGliLXN0eWxlPC9hPiBsaWNlbnNlLiBUbyBnZXQgaXQsIHlvdSBjYW4gZG93bmxvYWQgdGhlCjxhIGhyZWY9Imh0dHA6Ly9tYXJpam4uaGF2ZXJiZWtlLm5sL2NvZGVtaXJyb3IvY29kZW1pcnJvci56aXAiPmxhdGVzdApyZWxlYXNlPC9hPiBvciB0aGUgY3VycmVudCA8YQpocmVmPSJodHRwOi8vbWFyaWpuLmhhdmVyYmVrZS5ubC9jb2RlbWlycm9yL2NvZGVtaXJyb3ItbGF0ZXN0LnppcCI+ZGV2ZWxvcG1lbnQKc25hcHNob3Q8L2E+IGFzIHppcCBmaWxlcywgb3IgdXNlIDxhCmhyZWY9Imh0dHA6Ly9naXQtc2NtLmNvbS8iPmdpdDwvYT4gdG8gZ2V0IHRoZSByZXBvc2l0b3J5OjwvcD4KCjxwcmUgY2xhc3M9ImNvZGUiPmdpdCBjbG9uZSBodHRwOi8vbWFyaWpuLmhhdmVyYmVrZS5ubC9jb2RlbWlycm9yLy5naXQ8L3ByZT4KCjxwPlRoaXMgc2Vjb25kIG1ldGhvZCBpcyByZWNvbW1lbmRlZCBpZiB5b3UgYXJlIHBsYW5uaW5nIHRvIGhhY2sgb24KQ29kZU1pcnJvciAmI3gyMDE1OyBpdCBtYWtlcyBpdCBlYXN5IHRvIHJlY29yZCB5b3VyIHBhdGNoZXMgYW5kIHNoYXJlCnRoZW0gd2l0aCBtZS4gQ29kZU1pcnJvciBjYW4gYWxzbyBiZSBmb3VuZCBvbiBHaXRIdWI6IDxhCmhyZWY9Imh0dHA6Ly9naXRodWIuY29tL21hcmlqbmgvQ29kZU1pcnJvciI+aHR0cDovL2dpdGh1Yi5jb20vbWFyaWpuaC9Db2RlTWlycm9yPC9hPi48L3A+Cgo8aDI+U3VwcG9ydDwvaDI+Cgo8cD5UaGVyZSBpcyBhIDxhCmhyZWY9Imh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9jb2RlbWlycm9yIj5Hb29nbGUgZ3JvdXA8L2E+IChhCnNvcnQgb2YgbWFpbGluZyBsaXN0L25ld3Nncm91cCB0aGluZ3kpIGZvciBkaXNjdXNzaW9uIGFuZCBuZXdzIHJlbGF0ZWQKdG8gQ29kZU1pcnJvci4gUGxlYXNlIGNoZWNrIHRoZSA8YSBocmVmPSJmYXEuaHRtbCI+RkFRPC9hPiBiZWZvcmUKYXNraW5nIGEgcXVlc3RvaW4uIFlvdSBjYW4gYWxzbyBlLW1haWwgbWUgZGlyZWN0bHk6IDxhCmhyZWY9Im1haWx0bzptYXJpam5oQGdtYWlsLmNvbSI+TWFyaWpuIEhhdmVyYmVrZTwvYT4uPC9wPgoKPGgyPkRvY3VtZW50YXRpb248L2gyPgoKPHVsPgogIDxsaT5UaGUgPGEgaHJlZj0ibWFudWFsLmh0bWwiPm1hbnVhbDwvYT4gaXMgYWxsIG1vc3QgdXNlcnMgd2lsbCBuZWVkCiAgdG8gcmVhZCAob3Igc2tpbSkuPC9saT4KICA8bGk+SWYgeW91J3JlIGludGVyZXN0ZWQgaW4gd29ya2luZyBvbiB0aGUgY29kZSwgPGEKICBocmVmPSJzdG9yeS5odG1sIj50aGlzIGRvY3VtZW50PC9hPiBhYm91dCBDb2RlTWlycm9yJ3MgYXJjaGl0ZWN0dXJlCiAgd2lsbCBiZSB1c2VmdWwuPC9saT4KICA8bGk+VGhlIDxhIGhyZWY9Imh0dHA6Ly9naXRodWIuY29tL21hcmlqbmgvQ29kZU1pcnJvciI+c291cmNlCiAgY29kZTwvYT4gaXMsIGZvciB0aGUgbW9zdCBwYXJ0LCByYXRoZXIgd2VsbCBjb21tZW50ZWQsIHNvIGlmIGFsbAogIGVsc2UgZmFpbHMsIHlvdSBjYW4gdHJ5IHJlYWRpbmcgaXQuPC9saT4KPC91bD4KCiAgPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror/js/codemirror.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogQ29kZU1pcnJvciBtYWluIG1vZHVsZQogKgogKiBJbXBsZW1lbnRzIHRoZSBDb2RlTWlycm9yIGNvbnN0cnVjdG9yIGFuZCBwcm90b3R5cGUsIHdoaWNoIHRha2UgY2FyZQogKiBvZiBpbml0aWFsaXppbmcgdGhlIGVkaXRvciBmcmFtZSwgYW5kIHByb3ZpZGluZyB0aGUgb3V0c2lkZSBpbnRlcmZhY2UuCiAqLwoKLy8gVGhlIENvZGVNaXJyb3JDb25maWcgb2JqZWN0IGlzIHVzZWQgdG8gc3BlY2lmeSBhIGRlZmF1bHQKLy8gY29uZmlndXJhdGlvbi4gSWYgeW91IHNwZWNpZnkgc3VjaCBhbiBvYmplY3QgYmVmb3JlIGxvYWRpbmcgdGhpcwovLyBmaWxlLCB0aGUgdmFsdWVzIHlvdSBwdXQgaW50byBpdCB3aWxsIG92ZXJyaWRlIHRoZSBkZWZhdWx0cyBnaXZlbgovLyBiZWxvdy4gWW91IGNhbiBhbHNvIGFzc2lnbiB0byBpdCBhZnRlciBsb2FkaW5nLgp2YXIgQ29kZU1pcnJvckNvbmZpZyA9IHdpbmRvdy5Db2RlTWlycm9yQ29uZmlnIHx8IHt9OwoKdmFyIENvZGVNaXJyb3IgPSAoZnVuY3Rpb24oKXsKICBmdW5jdGlvbiBzZXREZWZhdWx0cyhvYmplY3QsIGRlZmF1bHRzKSB7CiAgICBmb3IgKHZhciBvcHRpb24gaW4gZGVmYXVsdHMpIHsKICAgICAgaWYgKCFvYmplY3QuaGFzT3duUHJvcGVydHkob3B0aW9uKSkKICAgICAgICBvYmplY3Rbb3B0aW9uXSA9IGRlZmF1bHRzW29wdGlvbl07CiAgICB9CiAgfQogIGZ1bmN0aW9uIGZvckVhY2goYXJyYXksIGFjdGlvbikgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykKICAgICAgYWN0aW9uKGFycmF5W2ldKTsKICB9CgogIC8vIFRoZXNlIGRlZmF1bHQgb3B0aW9ucyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBwYXNzaW5nIGEgc2V0IG9mCiAgLy8gb3B0aW9ucyB0byBhIHNwZWNpZmljIENvZGVNaXJyb3IgY29uc3RydWN0b3IuIFNlZSBtYW51YWwuaHRtbCBmb3IKICAvLyB0aGVpciBtZWFuaW5nLgogIHNldERlZmF1bHRzKENvZGVNaXJyb3JDb25maWcsIHsKICAgIHN0eWxlc2hlZXQ6IFtdLAogICAgcGF0aDogIiIsCiAgICBwYXJzZXJmaWxlOiBbXSwKICAgIGJhc2VmaWxlczogWyJ1dGlsLmpzIiwgInN0cmluZ3N0cmVhbS5qcyIsICJzZWxlY3QuanMiLCAidW5kby5qcyIsICJlZGl0b3IuanMiLCAidG9rZW5pemUuanMiXSwKICAgIGlmcmFtZUNsYXNzOiBudWxsLAogICAgcGFzc0RlbGF5OiAyMDAsCiAgICBwYXNzVGltZTogNTAsCiAgICBsaW5lTnVtYmVyRGVsYXk6IDIwMCwKICAgIGxpbmVOdW1iZXJUaW1lOiA1MCwKICAgIGNvbnRpbnVvdXNTY2FubmluZzogZmFsc2UsCiAgICBzYXZlRnVuY3Rpb246IG51bGwsCiAgICBvbkNoYW5nZTogbnVsbCwKICAgIHVuZG9EZXB0aDogNTAsCiAgICB1bmRvRGVsYXk6IDgwMCwKICAgIGRpc2FibGVTcGVsbGNoZWNrOiB0cnVlLAogICAgdGV4dFdyYXBwaW5nOiB0cnVlLAogICAgcmVhZE9ubHk6IGZhbHNlLAogICAgd2lkdGg6ICIiLAogICAgaGVpZ2h0OiAiMzAwcHgiLAogICAgYXV0b01hdGNoUGFyZW5zOiBmYWxzZSwKICAgIHBhcnNlckNvbmZpZzogbnVsbCwKICAgIHRhYk1vZGU6ICJpbmRlbnQiLCAvLyBvciAic3BhY2VzIiwgImRlZmF1bHQiLCAic2hpZnQiCiAgICByZWluZGVudE9uTG9hZDogZmFsc2UsCiAgICBhY3RpdmVUb2tlbnM6IG51bGwsCiAgICBjdXJzb3JBY3Rpdml0eTogbnVsbCwKICAgIGxpbmVOdW1iZXJzOiBmYWxzZSwKICAgIGluZGVudFVuaXQ6IDIsCiAgICBkb21haW46IG51bGwKICB9KTsKCiAgZnVuY3Rpb24gYWRkTGluZU51bWJlckRpdihjb250YWluZXIpIHsKICAgIHZhciBudW1zID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIiksCiAgICAgICAgc2Nyb2xsZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKTsKICAgIG51bXMuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogICAgbnVtcy5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7CiAgICBpZiAobnVtcy5zdHlsZS5zZXRFeHByZXNzaW9uKSB7CiAgICAgIHRyeSB7bnVtcy5zdHlsZS5zZXRFeHByZXNzaW9uKCJoZWlnaHQiLCAidGhpcy5wcmV2aW91c1NpYmxpbmcub2Zmc2V0SGVpZ2h0ICsgJ3B4JyIpO30KICAgICAgY2F0Y2goZSkge30gLy8gU2VlbXMgdG8gdGhyb3cgJ05vdCBJbXBsZW1lbnRlZCcgb24gc29tZSBJRTggdmVyc2lvbnMKICAgIH0KICAgIG51bXMuc3R5bGUudG9wID0gIjBweCI7CiAgICBudW1zLnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQobnVtcyk7CiAgICBzY3JvbGxlci5jbGFzc05hbWUgPSAiQ29kZU1pcnJvci1saW5lLW51bWJlcnMiOwogICAgbnVtcy5hcHBlbmRDaGlsZChzY3JvbGxlcik7CiAgICBzY3JvbGxlci5pbm5lckhUTUwgPSAiPGRpdj4xPC9kaXY+IjsKICAgIHJldHVybiBudW1zOwogIH0KCiAgZnVuY3Rpb24gZnJhbWVIVE1MKG9wdGlvbnMpIHsKICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5wYXJzZXJmaWxlID09ICJzdHJpbmciKQogICAgICBvcHRpb25zLnBhcnNlcmZpbGUgPSBbb3B0aW9ucy5wYXJzZXJmaWxlXTsKICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5zdHlsZXNoZWV0ID09ICJzdHJpbmciKQogICAgICBvcHRpb25zLnN0eWxlc2hlZXQgPSBbb3B0aW9ucy5zdHlsZXNoZWV0XTsKCiAgICB2YXIgaHRtbCA9IFsiPCFET0NUWVBFIEhUTUwgUFVCTElDIFwiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTlwiIFwiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkXCI+PGh0bWw+PGhlYWQ+Il07CiAgICAvLyBIYWNrIHRvIHdvcmsgYXJvdW5kIGEgYnVuY2ggb2YgSUU4LXNwZWNpZmljIHByb2JsZW1zLgogICAgaHRtbC5wdXNoKCI8bWV0YSBodHRwLWVxdWl2PVwiWC1VQS1Db21wYXRpYmxlXCIgY29udGVudD1cIklFPUVtdWxhdGVJRTdcIi8+Iik7CiAgICBmb3JFYWNoKG9wdGlvbnMuc3R5bGVzaGVldCwgZnVuY3Rpb24oZmlsZSkgewogICAgICBodG1sLnB1c2goIjxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiB0eXBlPVwidGV4dC9jc3NcIiBocmVmPVwiIiArIGZpbGUgKyAiXCIvPiIpOwogICAgfSk7CiAgICBmb3JFYWNoKG9wdGlvbnMuYmFzZWZpbGVzLmNvbmNhdChvcHRpb25zLnBhcnNlcmZpbGUpLCBmdW5jdGlvbihmaWxlKSB7CiAgICAgIGlmICghL15odHRwcz86Ly50ZXN0KGZpbGUpKSBmaWxlID0gb3B0aW9ucy5wYXRoICsgZmlsZTsKICAgICAgaHRtbC5wdXNoKCI8c2NyaXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmM9XCIiICsgZmlsZSArICJcIj48IiArICIvc2NyaXB0PiIpOwogICAgfSk7CiAgICBodG1sLnB1c2goIjwvaGVhZD48Ym9keSBzdHlsZT1cImJvcmRlci13aWR0aDogMDtcIiBjbGFzcz1cImVkaXRib3hcIiBzcGVsbGNoZWNrPVwiIiArCiAgICAgICAgICAgICAgKG9wdGlvbnMuZGlzYWJsZVNwZWxsY2hlY2sgPyAiZmFsc2UiIDogInRydWUiKSArICJcIj48L2JvZHk+PC9odG1sPiIpOwogICAgcmV0dXJuIGh0bWwuam9pbigiIik7CiAgfQoKICB2YXIgaW50ZXJuZXRFeHBsb3JlciA9IGRvY3VtZW50LnNlbGVjdGlvbiAmJiB3aW5kb3cuQWN0aXZlWE9iamVjdCAmJiAvTVNJRS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTsKCiAgZnVuY3Rpb24gQ29kZU1pcnJvcihwbGFjZSwgb3B0aW9ucykgewogICAgLy8gVXNlIHBhc3NlZCBvcHRpb25zLCBpZiBhbnksIHRvIG92ZXJyaWRlIGRlZmF1bHRzLgogICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgICBzZXREZWZhdWx0cyhvcHRpb25zLCBDb2RlTWlycm9yQ29uZmlnKTsKCiAgICAvLyBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IGZvciBkZXByZWNhdGVkIG9wdGlvbnMuCiAgICBpZiAob3B0aW9ucy5kdW1iVGFicykgb3B0aW9ucy50YWJNb2RlID0gInNwYWNlcyI7CiAgICBlbHNlIGlmIChvcHRpb25zLm5vcm1hbFRhYikgb3B0aW9ucy50YWJNb2RlID0gImRlZmF1bHQiOwoKICAgIHZhciBmcmFtZSA9IHRoaXMuZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJJRlJBTUUiKTsKICAgIGlmIChvcHRpb25zLmlmcmFtZUNsYXNzKSBmcmFtZS5jbGFzc05hbWUgPSBvcHRpb25zLmlmcmFtZUNsYXNzOwogICAgZnJhbWUuZnJhbWVCb3JkZXIgPSAwOwogICAgZnJhbWUuc3R5bGUuYm9yZGVyID0gIjAiOwogICAgZnJhbWUuc3R5bGUud2lkdGggPSAnMTAwJSc7CiAgICBmcmFtZS5zdHlsZS5oZWlnaHQgPSAnMTAwJSc7CiAgICAvLyBkaXNwbGF5OiBibG9jayBvY2Nhc2lvbmFsbHkgc3VwcHJlc3NlcyBzb21lIEZpcmVmb3ggYnVncywgc28gd2UKICAgIC8vIGFsd2F5cyBhZGQgaXQsIHJlZHVuZGFudCBhcyBpdCBzb3VuZHMuCiAgICBmcmFtZS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKCiAgICB2YXIgZGl2ID0gdGhpcy53cmFwcGluZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpOwogICAgZGl2LnN0eWxlLnBvc2l0aW9uID0gInJlbGF0aXZlIjsKICAgIGRpdi5jbGFzc05hbWUgPSAiQ29kZU1pcnJvci13cmFwcGluZyI7CiAgICBkaXYuc3R5bGUud2lkdGggPSBvcHRpb25zLndpZHRoOwogICAgZGl2LnN0eWxlLmhlaWdodCA9IG9wdGlvbnMuaGVpZ2h0OwogICAgLy8gVGhpcyBpcyB1c2VkIGJ5IEVkaXRvci5yZXJvdXRlUGFzdGVFdmVudAogICAgdmFyIHRlSGFjayA9IHRoaXMudGV4dGFyZWFIYWNrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiVEVYVEFSRUEiKTsKICAgIGRpdi5hcHBlbmRDaGlsZCh0ZUhhY2spOwogICAgdGVIYWNrLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKICAgIHRlSGFjay5zdHlsZS5sZWZ0ID0gIi0xMDAwMHB4IjsKICAgIHRlSGFjay5zdHlsZS53aWR0aCA9ICIxMHB4IjsKCiAgICAvLyBMaW5rIGJhY2sgdG8gdGhpcyBvYmplY3QsIHNvIHRoYXQgdGhlIGVkaXRvciBjYW4gZmV0Y2ggb3B0aW9ucwogICAgLy8gYW5kIGFkZCBhIHJlZmVyZW5jZSB0byBpdHNlbGYuCiAgICBmcmFtZS5Db2RlTWlycm9yID0gdGhpczsKICAgIGlmIChvcHRpb25zLmRvbWFpbiAmJiBpbnRlcm5ldEV4cGxvcmVyKSB7CiAgICAgIHRoaXMuaHRtbCA9IGZyYW1lSFRNTChvcHRpb25zKTsKICAgICAgZnJhbWUuc3JjID0gImphdmFzY3JpcHQ6KGZ1bmN0aW9uKCl7ZG9jdW1lbnQub3BlbigpOyIgKwogICAgICAgIChvcHRpb25zLmRvbWFpbiA/ICJkb2N1bWVudC5kb21haW49XCIiICsgb3B0aW9ucy5kb21haW4gKyAiXCI7IiA6ICIiKSArCiAgICAgICAgImRvY3VtZW50LndyaXRlKHdpbmRvdy5mcmFtZUVsZW1lbnQuQ29kZU1pcnJvci5odG1sKTtkb2N1bWVudC5jbG9zZSgpO30pKCkiOwogICAgfQogICAgZWxzZSB7CiAgICAgIGZyYW1lLnNyYyA9ICJqYXZhc2NyaXB0OmZhbHNlIjsKICAgIH0KCiAgICBpZiAocGxhY2UuYXBwZW5kQ2hpbGQpIHBsYWNlLmFwcGVuZENoaWxkKGRpdik7CiAgICBlbHNlIHBsYWNlKGRpdik7CiAgICBkaXYuYXBwZW5kQ2hpbGQoZnJhbWUpOwogICAgaWYgKG9wdGlvbnMubGluZU51bWJlcnMpIHRoaXMubGluZU51bWJlcnMgPSBhZGRMaW5lTnVtYmVyRGl2KGRpdik7CgogICAgdGhpcy53aW4gPSBmcmFtZS5jb250ZW50V2luZG93OwogICAgaWYgKCFvcHRpb25zLmRvbWFpbiB8fCAhaW50ZXJuZXRFeHBsb3JlcikgewogICAgICB0aGlzLndpbi5kb2N1bWVudC5vcGVuKCk7CiAgICAgIHRoaXMud2luLmRvY3VtZW50LndyaXRlKGZyYW1lSFRNTChvcHRpb25zKSk7CiAgICAgIHRoaXMud2luLmRvY3VtZW50LmNsb3NlKCk7CiAgICB9CiAgfQoKICBDb2RlTWlycm9yLnByb3RvdHlwZSA9IHsKICAgIGluaXQ6IGZ1bmN0aW9uKCkgewogICAgICBpZiAodGhpcy5vcHRpb25zLmluaXRDYWxsYmFjaykgdGhpcy5vcHRpb25zLmluaXRDYWxsYmFjayh0aGlzKTsKICAgICAgaWYgKHRoaXMub3B0aW9ucy5saW5lTnVtYmVycykgdGhpcy5hY3RpdmF0ZUxpbmVOdW1iZXJzKCk7CiAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVpbmRlbnRPbkxvYWQpIHRoaXMucmVpbmRlbnQoKTsKICAgIH0sCgogICAgZ2V0Q29kZTogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMuZWRpdG9yLmdldENvZGUoKTt9LAogICAgc2V0Q29kZTogZnVuY3Rpb24oY29kZSkge3RoaXMuZWRpdG9yLmltcG9ydENvZGUoY29kZSk7fSwKICAgIHNlbGVjdGlvbjogZnVuY3Rpb24oKSB7dGhpcy5mb2N1c0lmSUUoKTsgcmV0dXJuIHRoaXMuZWRpdG9yLnNlbGVjdGVkVGV4dCgpO30sCiAgICByZWluZGVudDogZnVuY3Rpb24oKSB7dGhpcy5lZGl0b3IucmVpbmRlbnQoKTt9LAogICAgcmVpbmRlbnRTZWxlY3Rpb246IGZ1bmN0aW9uKCkge3RoaXMuZm9jdXNJZklFKCk7IHRoaXMuZWRpdG9yLnJlaW5kZW50U2VsZWN0aW9uKG51bGwpO30sCgogICAgZm9jdXNJZklFOiBmdW5jdGlvbigpIHsKICAgICAgLy8gaW4gSUUsIGEgbG90IG9mIHNlbGVjdGlvbi1yZWxhdGVkIGZ1bmN0aW9uYWxpdHkgb25seSB3b3JrcyB3aGVuIHRoZSBmcmFtZSBpcyBmb2N1c2VkCiAgICAgIGlmICh0aGlzLndpbi5zZWxlY3QuaWVfc2VsZWN0aW9uKSB0aGlzLmZvY3VzKCk7CiAgICB9LAogICAgZm9jdXM6IGZ1bmN0aW9uKCkgewogICAgICB0aGlzLndpbi5mb2N1cygpOwogICAgICBpZiAodGhpcy5lZGl0b3Iuc2VsZWN0aW9uU25hcHNob3QpIC8vIElFIGhhY2sKICAgICAgICB0aGlzLndpbi5zZWxlY3Quc2V0Qm9va21hcmsodGhpcy53aW4uZG9jdW1lbnQuYm9keSwgdGhpcy5lZGl0b3Iuc2VsZWN0aW9uU25hcHNob3QpOwogICAgfSwKICAgIHJlcGxhY2VTZWxlY3Rpb246IGZ1bmN0aW9uKHRleHQpIHsKICAgICAgdGhpcy5mb2N1cygpOwogICAgICB0aGlzLmVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKHRleHQpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0sCiAgICByZXBsYWNlQ2hhcnM6IGZ1bmN0aW9uKHRleHQsIHN0YXJ0LCBlbmQpIHsKICAgICAgdGhpcy5lZGl0b3IucmVwbGFjZUNoYXJzKHRleHQsIHN0YXJ0LCBlbmQpOwogICAgfSwKICAgIGdldFNlYXJjaEN1cnNvcjogZnVuY3Rpb24oc3RyaW5nLCBmcm9tQ3Vyc29yLCBjYXNlRm9sZCkgewogICAgICByZXR1cm4gdGhpcy5lZGl0b3IuZ2V0U2VhcmNoQ3Vyc29yKHN0cmluZywgZnJvbUN1cnNvciwgY2FzZUZvbGQpOwogICAgfSwKCiAgICB1bmRvOiBmdW5jdGlvbigpIHt0aGlzLmVkaXRvci5oaXN0b3J5LnVuZG8oKTt9LAogICAgcmVkbzogZnVuY3Rpb24oKSB7dGhpcy5lZGl0b3IuaGlzdG9yeS5yZWRvKCk7fSwKICAgIGhpc3RvcnlTaXplOiBmdW5jdGlvbigpIHtyZXR1cm4gdGhpcy5lZGl0b3IuaGlzdG9yeS5oaXN0b3J5U2l6ZSgpO30sCiAgICBjbGVhckhpc3Rvcnk6IGZ1bmN0aW9uKCkge3RoaXMuZWRpdG9yLmhpc3RvcnkuY2xlYXIoKTt9LAoKICAgIGdyYWJLZXlzOiBmdW5jdGlvbihjYWxsYmFjaywgZmlsdGVyKSB7dGhpcy5lZGl0b3IuZ3JhYktleXMoY2FsbGJhY2ssIGZpbHRlcik7fSwKICAgIHVuZ3JhYktleXM6IGZ1bmN0aW9uKCkge3RoaXMuZWRpdG9yLnVuZ3JhYktleXMoKTt9LAoKICAgIHNldFBhcnNlcjogZnVuY3Rpb24obmFtZSwgcGFyc2VyQ29uZmlnKSB7dGhpcy5lZGl0b3Iuc2V0UGFyc2VyKG5hbWUsIHBhcnNlckNvbmZpZyk7fSwKICAgIHNldFNwZWxsY2hlY2s6IGZ1bmN0aW9uKG9uKSB7dGhpcy53aW4uZG9jdW1lbnQuYm9keS5zcGVsbGNoZWNrID0gb247fSwKICAgIHNldFN0eWxlc2hlZXQ6IGZ1bmN0aW9uKG5hbWVzKSB7CiAgICAgIGlmICh0eXBlb2YgbmFtZXMgPT09ICJzdHJpbmciKSBuYW1lcyA9IFtuYW1lc107CiAgICAgIHZhciBhY3RpdmVTdHlsZXNoZWV0cyA9IHt9OwogICAgICB2YXIgbWF0Y2hlZE5hbWVzID0ge307CiAgICAgIHZhciBsaW5rcyA9IHRoaXMud2luLmRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJsaW5rIik7CiAgICAgIC8vIENyZWF0ZSBoYXNoZXMgb2YgYWN0aXZlIHN0eWxlc2hlZXRzIGFuZCBtYXRjaGVkIG5hbWVzLgogICAgICAvLyBUaGlzIGlzIE8obl4yKSBidXQgbiBpcyBleHBlY3RlZCB0byBiZSB2ZXJ5IHNtYWxsLgogICAgICBmb3IgKHZhciB4ID0gMCwgbGluazsgbGluayA9IGxpbmtzW3hdOyB4KyspIHsKICAgICAgICBpZiAobGluay5yZWwuaW5kZXhPZigic3R5bGVzaGVldCIpICE9PSAtMSkgewogICAgICAgICAgZm9yICh2YXIgeSA9IDA7IHkgPCBuYW1lcy5sZW5ndGg7IHkrKykgewogICAgICAgICAgICB2YXIgbmFtZSA9IG5hbWVzW3ldOwogICAgICAgICAgICBpZiAobGluay5ocmVmLnN1YnN0cmluZyhsaW5rLmhyZWYubGVuZ3RoIC0gbmFtZS5sZW5ndGgpID09PSBuYW1lKSB7CiAgICAgICAgICAgICAgYWN0aXZlU3R5bGVzaGVldHNbbGluay5ocmVmXSA9IHRydWU7CiAgICAgICAgICAgICAgbWF0Y2hlZE5hbWVzW25hbWVdID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAvLyBBY3RpdmF0ZSB0aGUgc2VsZWN0ZWQgc3R5bGVzaGVldHMgYW5kIGRpc2FibGUgdGhlIHJlc3QuCiAgICAgIGZvciAodmFyIHggPSAwLCBsaW5rOyBsaW5rID0gbGlua3NbeF07IHgrKykgewogICAgICAgIGlmIChsaW5rLnJlbC5pbmRleE9mKCJzdHlsZXNoZWV0IikgIT09IC0xKSB7CiAgICAgICAgICBsaW5rLmRpc2FibGVkID0gIShsaW5rLmhyZWYgaW4gYWN0aXZlU3R5bGVzaGVldHMpOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBDcmVhdGUgYW55IG5ldyBzdHlsZXNoZWV0cy4KICAgICAgZm9yICh2YXIgeSA9IDA7IHkgPCBuYW1lcy5sZW5ndGg7IHkrKykgewogICAgICAgIHZhciBuYW1lID0gbmFtZXNbeV07CiAgICAgICAgaWYgKCEobmFtZSBpbiBtYXRjaGVkTmFtZXMpKSB7CiAgICAgICAgICB2YXIgbGluayA9IHRoaXMud2luLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpbmsiKTsKICAgICAgICAgIGxpbmsucmVsID0gInN0eWxlc2hlZXQiOwogICAgICAgICAgbGluay50eXBlID0gInRleHQvY3NzIjsKICAgICAgICAgIGxpbmsuaHJlZiA9IG5hbWU7CiAgICAgICAgICB0aGlzLndpbi5kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdLmFwcGVuZENoaWxkKGxpbmspOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIHNldFRleHRXcmFwcGluZzogZnVuY3Rpb24ob24pIHsKICAgICAgaWYgKG9uID09IHRoaXMub3B0aW9ucy50ZXh0V3JhcHBpbmcpIHJldHVybjsKICAgICAgdGhpcy53aW4uZG9jdW1lbnQuYm9keS5zdHlsZS53aGl0ZVNwYWNlID0gb24gPyAiIiA6ICJub3dyYXAiOwogICAgICB0aGlzLm9wdGlvbnMudGV4dFdyYXBwaW5nID0gb247CiAgICAgIGlmICh0aGlzLmxpbmVOdW1iZXJzKSB7CiAgICAgICAgdGhpcy5zZXRMaW5lTnVtYmVycyhmYWxzZSk7CiAgICAgICAgdGhpcy5zZXRMaW5lTnVtYmVycyh0cnVlKTsKICAgICAgfQogICAgfSwKICAgIHNldEluZGVudFVuaXQ6IGZ1bmN0aW9uKHVuaXQpIHt0aGlzLndpbi5pbmRlbnRVbml0ID0gdW5pdDt9LAogICAgc2V0VW5kb0RlcHRoOiBmdW5jdGlvbihkZXB0aCkge3RoaXMuZWRpdG9yLmhpc3RvcnkubWF4RGVwdGggPSBkZXB0aDt9LAogICAgc2V0VGFiTW9kZTogZnVuY3Rpb24obW9kZSkge3RoaXMub3B0aW9ucy50YWJNb2RlID0gbW9kZTt9LAogICAgc2V0TGluZU51bWJlcnM6IGZ1bmN0aW9uKG9uKSB7CiAgICAgIGlmIChvbiAmJiAhdGhpcy5saW5lTnVtYmVycykgewogICAgICAgIHRoaXMubGluZU51bWJlcnMgPSBhZGRMaW5lTnVtYmVyRGl2KHRoaXMud3JhcHBpbmcpOwogICAgICAgIHRoaXMuYWN0aXZhdGVMaW5lTnVtYmVycygpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKCFvbiAmJiB0aGlzLmxpbmVOdW1iZXJzKSB7CiAgICAgICAgdGhpcy53cmFwcGluZy5yZW1vdmVDaGlsZCh0aGlzLmxpbmVOdW1iZXJzKTsKICAgICAgICB0aGlzLndyYXBwaW5nLnN0eWxlLm1hcmdpbkxlZnQgPSAiIjsKICAgICAgICB0aGlzLmxpbmVOdW1iZXJzID0gbnVsbDsKICAgICAgfQogICAgfSwKCiAgICBjdXJzb3JQb3NpdGlvbjogZnVuY3Rpb24oc3RhcnQpIHt0aGlzLmZvY3VzSWZJRSgpOyByZXR1cm4gdGhpcy5lZGl0b3IuY3Vyc29yUG9zaXRpb24oc3RhcnQpO30sCiAgICBmaXJzdExpbmU6IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLmVkaXRvci5maXJzdExpbmUoKTt9LAogICAgbGFzdExpbmU6IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLmVkaXRvci5sYXN0TGluZSgpO30sCiAgICBuZXh0TGluZTogZnVuY3Rpb24obGluZSkge3JldHVybiB0aGlzLmVkaXRvci5uZXh0TGluZShsaW5lKTt9LAogICAgcHJldkxpbmU6IGZ1bmN0aW9uKGxpbmUpIHtyZXR1cm4gdGhpcy5lZGl0b3IucHJldkxpbmUobGluZSk7fSwKICAgIGxpbmVDb250ZW50OiBmdW5jdGlvbihsaW5lKSB7cmV0dXJuIHRoaXMuZWRpdG9yLmxpbmVDb250ZW50KGxpbmUpO30sCiAgICBzZXRMaW5lQ29udGVudDogZnVuY3Rpb24obGluZSwgY29udGVudCkge3RoaXMuZWRpdG9yLnNldExpbmVDb250ZW50KGxpbmUsIGNvbnRlbnQpO30sCiAgICByZW1vdmVMaW5lOiBmdW5jdGlvbihsaW5lKXt0aGlzLmVkaXRvci5yZW1vdmVMaW5lKGxpbmUpO30sCiAgICBpbnNlcnRJbnRvTGluZTogZnVuY3Rpb24obGluZSwgcG9zaXRpb24sIGNvbnRlbnQpIHt0aGlzLmVkaXRvci5pbnNlcnRJbnRvTGluZShsaW5lLCBwb3NpdGlvbiwgY29udGVudCk7fSwKICAgIHNlbGVjdExpbmVzOiBmdW5jdGlvbihzdGFydExpbmUsIHN0YXJ0T2Zmc2V0LCBlbmRMaW5lLCBlbmRPZmZzZXQpIHsKICAgICAgdGhpcy53aW4uZm9jdXMoKTsKICAgICAgdGhpcy5lZGl0b3Iuc2VsZWN0TGluZXMoc3RhcnRMaW5lLCBzdGFydE9mZnNldCwgZW5kTGluZSwgZW5kT2Zmc2V0KTsKICAgIH0sCiAgICBudGhMaW5lOiBmdW5jdGlvbihuKSB7CiAgICAgIHZhciBsaW5lID0gdGhpcy5maXJzdExpbmUoKTsKICAgICAgZm9yICg7IG4gPiAxICYmIGxpbmUgIT09IGZhbHNlOyBuLS0pCiAgICAgICAgbGluZSA9IHRoaXMubmV4dExpbmUobGluZSk7CiAgICAgIHJldHVybiBsaW5lOwogICAgfSwKICAgIGxpbmVOdW1iZXI6IGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgdmFyIG51bSA9IDA7CiAgICAgIHdoaWxlIChsaW5lICE9PSBmYWxzZSkgewogICAgICAgIG51bSsrOwogICAgICAgIGxpbmUgPSB0aGlzLnByZXZMaW5lKGxpbmUpOwogICAgICB9CiAgICAgIHJldHVybiBudW07CiAgICB9LAogICAganVtcFRvTGluZTogZnVuY3Rpb24obGluZSkgewogICAgICBpZiAodHlwZW9mIGxpbmUgPT0gIm51bWJlciIpIGxpbmUgPSB0aGlzLm50aExpbmUobGluZSk7CiAgICAgIHRoaXMuc2VsZWN0TGluZXMobGluZSwgMCk7CiAgICAgIHRoaXMud2luLmZvY3VzKCk7CiAgICB9LAogICAgY3VycmVudExpbmU6IGZ1bmN0aW9uKCkgeyAvLyBEZXByZWNhdGVkLCBidXQgc3RpbGwgdGhlcmUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKICAgICAgcmV0dXJuIHRoaXMubGluZU51bWJlcih0aGlzLmN1cnNvckxpbmUoKSk7CiAgICB9LAogICAgY3Vyc29yTGluZTogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLmN1cnNvclBvc2l0aW9uKCkubGluZTsKICAgIH0sCgogICAgYWN0aXZhdGVMaW5lTnVtYmVyczogZnVuY3Rpb24oKSB7CiAgICAgIHZhciBmcmFtZSA9IHRoaXMuZnJhbWUsIHdpbiA9IGZyYW1lLmNvbnRlbnRXaW5kb3csIGRvYyA9IHdpbi5kb2N1bWVudCwgYm9keSA9IGRvYy5ib2R5LAogICAgICAgICAgbnVtcyA9IHRoaXMubGluZU51bWJlcnMsIHNjcm9sbGVyID0gbnVtcy5maXJzdENoaWxkLCBzZWxmID0gdGhpczsKICAgICAgdmFyIGJhcldpZHRoID0gbnVsbDsKCiAgICAgIGZ1bmN0aW9uIHNpemVCYXIoKSB7CiAgICAgICAgaWYgKGZyYW1lLm9mZnNldFdpZHRoID09IDApIHJldHVybjsKICAgICAgICBmb3IgKHZhciByb290ID0gZnJhbWU7IHJvb3QucGFyZW50Tm9kZTsgcm9vdCA9IHJvb3QucGFyZW50Tm9kZSk7CiAgICAgICAgaWYgKCFudW1zLnBhcmVudE5vZGUgfHwgcm9vdCAhPSBkb2N1bWVudCB8fCAhd2luLkVkaXRvcikgewogICAgICAgICAgLy8gQ2xlYXIgZXZlbnQgaGFuZGxlcnMgKHRoZWlyIG5vZGVzIG1pZ2h0IGFscmVhZHkgYmUgY29sbGVjdGVkLCBzbyB0cnkvY2F0Y2gpCiAgICAgICAgICB0cnl7Y2xlYXIoKTt9Y2F0Y2goZSl7fQogICAgICAgICAgY2xlYXJJbnRlcnZhbChzaXplSW50ZXJ2YWwpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKG51bXMub2Zmc2V0V2lkdGggIT0gYmFyV2lkdGgpIHsKICAgICAgICAgIGJhcldpZHRoID0gbnVtcy5vZmZzZXRXaWR0aDsKICAgICAgICAgIG51bXMuc3R5bGUubGVmdCA9ICItIiArIChmcmFtZS5wYXJlbnROb2RlLnN0eWxlLm1hcmdpbkxlZnQgPSBiYXJXaWR0aCArICJweCIpOwogICAgICAgIH0KICAgICAgfQogICAgICBmdW5jdGlvbiBkb1Njcm9sbCgpIHsKICAgICAgICBudW1zLnNjcm9sbFRvcCA9IGJvZHkuc2Nyb2xsVG9wIHx8IGRvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wIHx8IDA7CiAgICAgIH0KICAgICAgLy8gQ2xlYW51cCBmdW5jdGlvbiwgcmVnaXN0ZXJlZCBieSBub25XcmFwcGluZyBhbmQgd3JhcHBpbmcuCiAgICAgIHZhciBjbGVhciA9IGZ1bmN0aW9uKCl7fTsKICAgICAgc2l6ZUJhcigpOwogICAgICB2YXIgc2l6ZUludGVydmFsID0gc2V0SW50ZXJ2YWwoc2l6ZUJhciwgNTAwKTsKCiAgICAgIGZ1bmN0aW9uIGVuc3VyZUVub3VnaExpbmVOdW1iZXJzKGZpbGwpIHsKICAgICAgICB2YXIgbGluZUhlaWdodCA9IHNjcm9sbGVyLmZpcnN0Q2hpbGQub2Zmc2V0SGVpZ2h0OwogICAgICAgIGlmIChsaW5lSGVpZ2h0ID09IDApIHJldHVybjsKICAgICAgICB2YXIgdGFyZ2V0SGVpZ2h0ID0gNTAgKyBNYXRoLm1heChib2R5Lm9mZnNldEhlaWdodCwgTWF0aC5tYXgoZnJhbWUub2Zmc2V0SGVpZ2h0LCBib2R5LnNjcm9sbEhlaWdodCB8fCAwKSksCiAgICAgICAgICAgIGxhc3ROdW1iZXIgPSBNYXRoLmNlaWwodGFyZ2V0SGVpZ2h0IC8gbGluZUhlaWdodCk7CiAgICAgICAgZm9yICh2YXIgaSA9IHNjcm9sbGVyLmNoaWxkTm9kZXMubGVuZ3RoOyBpIDw9IGxhc3ROdW1iZXI7IGkrKykgewogICAgICAgICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpOwogICAgICAgICAgZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGZpbGwgPyBTdHJpbmcoaSArIDEpIDogIlx1MDBhMCIpKTsKICAgICAgICAgIHNjcm9sbGVyLmFwcGVuZENoaWxkKGRpdik7CiAgICAgICAgfQogICAgICB9CgogICAgICBmdW5jdGlvbiBub25XcmFwcGluZygpIHsKICAgICAgICBmdW5jdGlvbiB1cGRhdGUoKSB7CiAgICAgICAgICBlbnN1cmVFbm91Z2hMaW5lTnVtYmVycyh0cnVlKTsKICAgICAgICAgIGRvU2Nyb2xsKCk7CiAgICAgICAgfQogICAgICAgIHNlbGYudXBkYXRlTnVtYmVycyA9IHVwZGF0ZTsKICAgICAgICB2YXIgb25TY3JvbGwgPSB3aW4uYWRkRXZlbnRIYW5kbGVyKHdpbiwgInNjcm9sbCIsIGRvU2Nyb2xsLCB0cnVlKSwKICAgICAgICAgICAgb25SZXNpemUgPSB3aW4uYWRkRXZlbnRIYW5kbGVyKHdpbiwgInJlc2l6ZSIsIHVwZGF0ZSwgdHJ1ZSk7CiAgICAgICAgY2xlYXIgPSBmdW5jdGlvbigpewogICAgICAgICAgb25TY3JvbGwoKTsgb25SZXNpemUoKTsKICAgICAgICAgIGlmIChzZWxmLnVwZGF0ZU51bWJlcnMgPT0gdXBkYXRlKSBzZWxmLnVwZGF0ZU51bWJlcnMgPSBudWxsOwogICAgICAgIH07CiAgICAgICAgdXBkYXRlKCk7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHdyYXBwaW5nKCkgewogICAgICAgIHZhciBub2RlLCBsaW5lTnVtLCBuZXh0LCBwb3MsIGNoYW5nZXMgPSBbXTsKCiAgICAgICAgZnVuY3Rpb24gc2V0TnVtKG4pIHsKICAgICAgICAgIC8vIERvZXMgbm90IHR5cGljYWxseSBoYXBwZW4gKGJ1dCBjYW4sIGlmIHlvdSBtZXNzIHdpdGggdGhlCiAgICAgICAgICAvLyBkb2N1bWVudCBkdXJpbmcgdGhlIG51bWJlcmluZykKICAgICAgICAgIGlmICghbGluZU51bSkgbGluZU51bSA9IHNjcm9sbGVyLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpKTsKICAgICAgICAgIC8vIENoYW5nZXMgYXJlIGFjY3VtdWxhdGVkLCBzbyB0aGF0IHRoZSBkb2N1bWVudCBsYXlvdXQKICAgICAgICAgIC8vIGRvZXNuJ3QgaGF2ZSB0byBiZSByZWNvbXB1dGVkIGR1cmluZyB0aGUgcGFzcwogICAgICAgICAgY2hhbmdlcy5wdXNoKGxpbmVOdW0pOyBjaGFuZ2VzLnB1c2gobik7CiAgICAgICAgICBwb3MgPSBsaW5lTnVtLm9mZnNldEhlaWdodCArIGxpbmVOdW0ub2Zmc2V0VG9wOwogICAgICAgICAgbGluZU51bSA9IGxpbmVOdW0ubmV4dFNpYmxpbmc7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGNvbW1pdENoYW5nZXMoKSB7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYW5nZXMubGVuZ3RoOyBpICs9IDIpCiAgICAgICAgICAgIGNoYW5nZXNbaV0uaW5uZXJIVE1MID0gY2hhbmdlc1tpICsgMV07CiAgICAgICAgICBjaGFuZ2VzID0gW107CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHdvcmsoKSB7CiAgICAgICAgICBpZiAoIXNjcm9sbGVyLnBhcmVudE5vZGUgfHwgc2Nyb2xsZXIucGFyZW50Tm9kZSAhPSBzZWxmLmxpbmVOdW1iZXJzKSByZXR1cm47CgogICAgICAgICAgdmFyIGVuZFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSArIHNlbGYub3B0aW9ucy5saW5lTnVtYmVyVGltZTsKICAgICAgICAgIHdoaWxlIChub2RlKSB7CiAgICAgICAgICAgIHNldE51bShuZXh0KyspOwogICAgICAgICAgICBmb3IgKDsgbm9kZSAmJiAhd2luLmlzQlIobm9kZSk7IG5vZGUgPSBub2RlLm5leHRTaWJsaW5nKSB7CiAgICAgICAgICAgICAgdmFyIGJvdHQgPSBub2RlLm9mZnNldFRvcCArIG5vZGUub2Zmc2V0SGVpZ2h0OwogICAgICAgICAgICAgIHdoaWxlIChzY3JvbGxlci5vZmZzZXRIZWlnaHQgJiYgYm90dCAtIDMgPiBwb3MpIHNldE51bSgiJm5ic3A7Iik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG5vZGUpIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nOwogICAgICAgICAgICBpZiAobmV3IERhdGUoKS5nZXRUaW1lKCkgPiBlbmRUaW1lKSB7CiAgICAgICAgICAgICAgY29tbWl0Q2hhbmdlcygpOwogICAgICAgICAgICAgIHBlbmRpbmcgPSBzZXRUaW1lb3V0KHdvcmssIHNlbGYub3B0aW9ucy5saW5lTnVtYmVyRGVsYXkpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgY29tbWl0Q2hhbmdlcygpOwogICAgICAgICAgZG9TY3JvbGwoKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gc3RhcnQoKSB7CiAgICAgICAgICBkb1Njcm9sbCgpOwogICAgICAgICAgZW5zdXJlRW5vdWdoTGluZU51bWJlcnMoZmFsc2UpOwogICAgICAgICAgbm9kZSA9IGJvZHkuZmlyc3RDaGlsZDsKICAgICAgICAgIGxpbmVOdW0gPSBzY3JvbGxlci5maXJzdENoaWxkOwogICAgICAgICAgcG9zID0gMDsKICAgICAgICAgIG5leHQgPSAxOwogICAgICAgICAgd29yaygpOwogICAgICAgIH0KCiAgICAgICAgc3RhcnQoKTsKICAgICAgICB2YXIgcGVuZGluZyA9IG51bGw7CiAgICAgICAgZnVuY3Rpb24gdXBkYXRlKCkgewogICAgICAgICAgaWYgKHBlbmRpbmcpIGNsZWFyVGltZW91dChwZW5kaW5nKTsKICAgICAgICAgIGlmIChzZWxmLmVkaXRvci5hbGxDbGVhbigpKSBzdGFydCgpOwogICAgICAgICAgZWxzZSBwZW5kaW5nID0gc2V0VGltZW91dCh1cGRhdGUsIDIwMCk7CiAgICAgICAgfQogICAgICAgIHNlbGYudXBkYXRlTnVtYmVycyA9IHVwZGF0ZTsKICAgICAgICB2YXIgb25TY3JvbGwgPSB3aW4uYWRkRXZlbnRIYW5kbGVyKHdpbiwgInNjcm9sbCIsIGRvU2Nyb2xsLCB0cnVlKSwKICAgICAgICAgICAgb25SZXNpemUgPSB3aW4uYWRkRXZlbnRIYW5kbGVyKHdpbiwgInJlc2l6ZSIsIHVwZGF0ZSwgdHJ1ZSk7CiAgICAgICAgY2xlYXIgPSBmdW5jdGlvbigpewogICAgICAgICAgaWYgKHBlbmRpbmcpIGNsZWFyVGltZW91dChwZW5kaW5nKTsKICAgICAgICAgIGlmIChzZWxmLnVwZGF0ZU51bWJlcnMgPT0gdXBkYXRlKSBzZWxmLnVwZGF0ZU51bWJlcnMgPSBudWxsOwogICAgICAgICAgb25TY3JvbGwoKTsKICAgICAgICAgIG9uUmVzaXplKCk7CiAgICAgICAgfTsKICAgICAgfQogICAgICAodGhpcy5vcHRpb25zLnRleHRXcmFwcGluZyA/IHdyYXBwaW5nIDogbm9uV3JhcHBpbmcpKCk7CiAgICB9CiAgfTsKCiAgQ29kZU1pcnJvci5JbnZhbGlkTGluZUhhbmRsZSA9IHt0b1N0cmluZzogZnVuY3Rpb24oKXtyZXR1cm4gIkNvZGVNaXJyb3IuSW52YWxpZExpbmVIYW5kbGUiO319OwoKICBDb2RlTWlycm9yLnJlcGxhY2UgPSBmdW5jdGlvbihlbGVtZW50KSB7CiAgICBpZiAodHlwZW9mIGVsZW1lbnQgPT0gInN0cmluZyIpCiAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50KTsKICAgIHJldHVybiBmdW5jdGlvbihuZXdFbGVtZW50KSB7CiAgICAgIGVsZW1lbnQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobmV3RWxlbWVudCwgZWxlbWVudCk7CiAgICB9OwogIH07CgogIENvZGVNaXJyb3IuZnJvbVRleHRBcmVhID0gZnVuY3Rpb24oYXJlYSwgb3B0aW9ucykgewogICAgaWYgKHR5cGVvZiBhcmVhID09ICJzdHJpbmciKQogICAgICBhcmVhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYXJlYSk7CgogICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgICBpZiAoYXJlYS5zdHlsZS53aWR0aCAmJiBvcHRpb25zLndpZHRoID09IG51bGwpCiAgICAgIG9wdGlvbnMud2lkdGggPSBhcmVhLnN0eWxlLndpZHRoOwogICAgaWYgKGFyZWEuc3R5bGUuaGVpZ2h0ICYmIG9wdGlvbnMuaGVpZ2h0ID09IG51bGwpCiAgICAgIG9wdGlvbnMuaGVpZ2h0ID0gYXJlYS5zdHlsZS5oZWlnaHQ7CiAgICBpZiAob3B0aW9ucy5jb250ZW50ID09IG51bGwpIG9wdGlvbnMuY29udGVudCA9IGFyZWEudmFsdWU7CgogICAgaWYgKGFyZWEuZm9ybSkgewogICAgICBmdW5jdGlvbiB1cGRhdGVGaWVsZCgpIHsKICAgICAgICBhcmVhLnZhbHVlID0gbWlycm9yLmdldENvZGUoKTsKICAgICAgfQogICAgICBpZiAodHlwZW9mIGFyZWEuZm9ybS5hZGRFdmVudExpc3RlbmVyID09ICJmdW5jdGlvbiIpCiAgICAgICAgYXJlYS5mb3JtLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsIHVwZGF0ZUZpZWxkLCBmYWxzZSk7CiAgICAgIGVsc2UKICAgICAgICBhcmVhLmZvcm0uYXR0YWNoRXZlbnQoIm9uc3VibWl0IiwgdXBkYXRlRmllbGQpOwogICAgICB2YXIgcmVhbFN1Ym1pdCA9IGFyZWEuZm9ybS5zdWJtaXQ7CiAgICAgIGZ1bmN0aW9uIHdyYXBTdWJtaXQoKSB7CiAgICAgICAgdXBkYXRlRmllbGQoKTsKICAgICAgICAvLyBDYW4ndCB1c2UgcmVhbFN1Ym1pdC5hcHBseSBiZWNhdXNlIElFNiBpcyB0b28gc3R1cGlkCiAgICAgICAgYXJlYS5mb3JtLnN1Ym1pdCA9IHJlYWxTdWJtaXQ7CiAgICAgICAgYXJlYS5mb3JtLnN1Ym1pdCgpOwogICAgICAgIGFyZWEuZm9ybS5zdWJtaXQgPSB3cmFwU3VibWl0OwogICAgICB9CiAgICAgIGFyZWEuZm9ybS5zdWJtaXQgPSB3cmFwU3VibWl0OwogICAgfQoKICAgIGZ1bmN0aW9uIGluc2VydChmcmFtZSkgewogICAgICBpZiAoYXJlYS5uZXh0U2libGluZykKICAgICAgICBhcmVhLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGZyYW1lLCBhcmVhLm5leHRTaWJsaW5nKTsKICAgICAgZWxzZQogICAgICAgIGFyZWEucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChmcmFtZSk7CiAgICB9CgogICAgYXJlYS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgdmFyIG1pcnJvciA9IG5ldyBDb2RlTWlycm9yKGluc2VydCwgb3B0aW9ucyk7CiAgICByZXR1cm4gbWlycm9yOwogIH07CgogIENvZGVNaXJyb3IuaXNQcm9iYWJseVN1cHBvcnRlZCA9IGZ1bmN0aW9uKCkgewogICAgLy8gVGhpcyBpcyByYXRoZXIgYXdmdWwsIGJ1dCBjYW4gYmUgdXNlZnVsLgogICAgdmFyIG1hdGNoOwogICAgaWYgKHdpbmRvdy5vcGVyYSkKICAgICAgcmV0dXJuIE51bWJlcih3aW5kb3cub3BlcmEudmVyc2lvbigpKSA+PSA5LjUyOwogICAgZWxzZSBpZiAoL0FwcGxlIENvbXB1dGVycywgSW5jLy50ZXN0KG5hdmlnYXRvci52ZW5kb3IpICYmIChtYXRjaCA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1ZlcnNpb25cLyhcZCsoPzpcLlxkKyk/KVwuLykpKQogICAgICByZXR1cm4gTnVtYmVyKG1hdGNoWzFdKSA+PSAzOwogICAgZWxzZSBpZiAoZG9jdW1lbnQuc2VsZWN0aW9uICYmIHdpbmRvdy5BY3RpdmVYT2JqZWN0ICYmIChtYXRjaCA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01TSUUgKFxkKyg/OlwuXGQqKT8pXGIvKSkpCiAgICAgIHJldHVybiBOdW1iZXIobWF0Y2hbMV0pID49IDY7CiAgICBlbHNlIGlmIChtYXRjaCA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2dlY2tvXC8oXGR7OH0pL2kpKQogICAgICByZXR1cm4gTnVtYmVyKG1hdGNoWzFdKSA+PSAyMDA1MDkwMTsKICAgIGVsc2UgaWYgKG1hdGNoID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQXBwbGVXZWJLaXRcLyhcZCspLykpCiAgICAgIHJldHVybiBOdW1iZXIobWF0Y2hbMV0pID49IDUyNTsKICAgIGVsc2UKICAgICAgcmV0dXJuIG51bGw7CiAgfTsKCiAgcmV0dXJuIENvZGVNaXJyb3I7Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/editor.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogVGhlIEVkaXRvciBvYmplY3QgbWFuYWdlcyB0aGUgY29udGVudCBvZiB0aGUgZWRpdGFibGUgZnJhbWUuIEl0CiAqIGNhdGNoZXMgZXZlbnRzLCBjb2xvdXJzIG5vZGVzLCBhbmQgaW5kZW50cyBsaW5lcy4gVGhpcyBmaWxlIGFsc28KICogaG9sZHMgc29tZSBmdW5jdGlvbnMgZm9yIHRyYW5zZm9ybWluZyBhcmJpdHJhcnkgRE9NIHN0cnVjdHVyZXMgaW50bwogKiBwbGFpbiBzZXF1ZW5jZXMgb2YgPHNwYW4+IGFuZCA8YnI+IGVsZW1lbnRzCiAqLwoKdmFyIGludGVybmV0RXhwbG9yZXIgPSBkb2N1bWVudC5zZWxlY3Rpb24gJiYgd2luZG93LkFjdGl2ZVhPYmplY3QgJiYgL01TSUUvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7CnZhciB3ZWJraXQgPSAvQXBwbGVXZWJLaXQvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7CnZhciBzYWZhcmkgPSAvQXBwbGUgQ29tcHV0ZXJzLCBJbmMvLnRlc3QobmF2aWdhdG9yLnZlbmRvcik7CnZhciBnZWNrbyA9IC9nZWNrb1wvKFxkezh9KS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7CgovLyBNYWtlIHN1cmUgYSBzdHJpbmcgZG9lcyBub3QgY29udGFpbiB0d28gY29uc2VjdXRpdmUgJ2NvbGxhcHNlYWJsZScKLy8gd2hpdGVzcGFjZSBjaGFyYWN0ZXJzLgpmdW5jdGlvbiBtYWtlV2hpdGVTcGFjZShuKSB7CiAgdmFyIGJ1ZmZlciA9IFtdLCBuYiA9IHRydWU7CiAgZm9yICg7IG4gPiAwOyBuLS0pIHsKICAgIGJ1ZmZlci5wdXNoKChuYiB8fCBuID09IDEpID8gbmJzcCA6ICIgIik7CiAgICBuYiA9ICFuYjsKICB9CiAgcmV0dXJuIGJ1ZmZlci5qb2luKCIiKTsKfQoKLy8gQ3JlYXRlIGEgc2V0IG9mIHdoaXRlLXNwYWNlIGNoYXJhY3RlcnMgdGhhdCB3aWxsIG5vdCBiZSBjb2xsYXBzZWQKLy8gYnkgdGhlIGJyb3dzZXIsIGJ1dCB3aWxsIG5vdCBicmVhayB0ZXh0LXdyYXBwaW5nIGVpdGhlci4KZnVuY3Rpb24gZml4U3BhY2VzKHN0cmluZykgewogIGlmIChzdHJpbmcuY2hhckF0KDApID09ICIgIikgc3RyaW5nID0gbmJzcCArIHN0cmluZy5zbGljZSgxKTsKICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1x0L2csIGZ1bmN0aW9uKCl7cmV0dXJuIG1ha2VXaGl0ZVNwYWNlKGluZGVudFVuaXQpO30pCiAgICAucmVwbGFjZSgvWyBcdTAwYTBdezIsfS9nLCBmdW5jdGlvbihzKSB7cmV0dXJuIG1ha2VXaGl0ZVNwYWNlKHMubGVuZ3RoKTt9KTsKfQoKZnVuY3Rpb24gY2xlYW5UZXh0KHRleHQpIHsKICByZXR1cm4gdGV4dC5yZXBsYWNlKC9cdTAwYTAvZywgIiAiKS5yZXBsYWNlKC9cdTIwMGIvZywgIiIpOwp9CgovLyBDcmVhdGUgYSBTUEFOIG5vZGUgd2l0aCB0aGUgZXhwZWN0ZWQgcHJvcGVydGllcyBmb3IgZG9jdW1lbnQgcGFydAovLyBzcGFucy4KZnVuY3Rpb24gbWFrZVBhcnRTcGFuKHZhbHVlLCBkb2MpIHsKICB2YXIgdGV4dCA9IHZhbHVlOwogIGlmICh2YWx1ZS5ub2RlVHlwZSA9PSAzKSB0ZXh0ID0gdmFsdWUubm9kZVZhbHVlOwogIGVsc2UgdmFsdWUgPSBkb2MuY3JlYXRlVGV4dE5vZGUodGV4dCk7CgogIHZhciBzcGFuID0gZG9jLmNyZWF0ZUVsZW1lbnQoIlNQQU4iKTsKICBzcGFuLmlzUGFydCA9IHRydWU7CiAgc3Bhbi5hcHBlbmRDaGlsZCh2YWx1ZSk7CiAgc3Bhbi5jdXJyZW50VGV4dCA9IHRleHQ7CiAgcmV0dXJuIHNwYW47Cn0KCi8vIE9uIHdlYmtpdCwgd2hlbiB0aGUgbGFzdCBCUiBvZiB0aGUgZG9jdW1lbnQgZG9lcyBub3QgaGF2ZSB0ZXh0Ci8vIGJlaGluZCBpdCwgdGhlIGN1cnNvciBjYW4gbm90IGJlIHB1dCBvbiB0aGUgbGluZSBhZnRlciBpdC4gVGhpcwovLyBtYWtlcyBwcmVzc2luZyBlbnRlciBhdCB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudCBvY2Nhc2lvbmFsbHkgZG8KLy8gbm90aGluZyAob3IgYXQgbGVhc3Qgc2VlbSB0byBkbyBub3RoaW5nKS4gVG8gd29yayBhcm91bmQgaXQsIHRoaXMKLy8gZnVuY3Rpb24gbWFrZXMgc3VyZSB0aGUgZG9jdW1lbnQgZW5kcyB3aXRoIGEgc3BhbiBjb250YWluaW5nIGEKLy8gemVyby13aWR0aCBzcGFjZSBjaGFyYWN0ZXIuIFRoZSB0cmF2ZXJzZURPTSBpdGVyYXRvciBmaWx0ZXJzIHN1Y2gKLy8gY2hhcmFjdGVyIG91dCBhZ2Fpbiwgc28gdGhhdCB0aGUgcGFyc2VycyB3b24ndCBzZWUgdGhlbS4gVGhpcwovLyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBhIGZldyBzdHJhdGVnaWMgcGxhY2VzIHRvIG1ha2Ugc3VyZSB0aGUKLy8gendzcCBpcyByZXN0b3JlZCBhZnRlciB0aGUgaGlnaGxpZ2h0aW5nIHByb2Nlc3MgZWF0cyBpdC4KdmFyIHdlYmtpdExhc3RMaW5lSGFjayA9IHdlYmtpdCA/CiAgZnVuY3Rpb24oY29udGFpbmVyKSB7CiAgICB2YXIgbGFzdCA9IGNvbnRhaW5lci5sYXN0Q2hpbGQ7CiAgICBpZiAoIWxhc3QgfHwgIWxhc3QuaXNQYXJ0IHx8IGxhc3QudGV4dENvbnRlbnQgIT0gIlx1MjAwYiIpCiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChtYWtlUGFydFNwYW4oIlx1MjAwYiIsIGNvbnRhaW5lci5vd25lckRvY3VtZW50KSk7CiAgfSA6IGZ1bmN0aW9uKCkge307Cgp2YXIgRWRpdG9yID0gKGZ1bmN0aW9uKCl7CiAgLy8gVGhlIEhUTUwgZWxlbWVudHMgd2hvc2UgY29udGVudCBzaG91bGQgYmUgc3VmZml4ZWQgYnkgYSBuZXdsaW5lCiAgLy8gd2hlbiBjb252ZXJ0aW5nIHRoZW0gdG8gZmxhdCB0ZXh0LgogIHZhciBuZXdsaW5lRWxlbWVudHMgPSB7IlAiOiB0cnVlLCAiRElWIjogdHJ1ZSwgIkxJIjogdHJ1ZX07CgogIGZ1bmN0aW9uIGFzRWRpdG9yTGluZXMoc3RyaW5nKSB7CiAgICB2YXIgdGFiID0gbWFrZVdoaXRlU3BhY2UoaW5kZW50VW5pdCk7CiAgICByZXR1cm4gbWFwKHN0cmluZy5yZXBsYWNlKC9cdC9nLCB0YWIpLnJlcGxhY2UoL1x1MDBhMC9nLCAiICIpLnJlcGxhY2UoL1xyXG4/L2csICJcbiIpLnNwbGl0KCJcbiIpLCBmaXhTcGFjZXMpOwogIH0KCiAgLy8gSGVscGVyIGZ1bmN0aW9uIGZvciB0cmF2ZXJzZURPTS4gRmxhdHRlbnMgYW4gYXJiaXRyYXJ5IERPTSBub2RlCiAgLy8gaW50byBhbiBhcnJheSBvZiB0ZXh0bm9kZXMgYW5kIDxicj4gdGFncy4KICBmdW5jdGlvbiBzaW1wbGlmeURPTShyb290LCBhdEVuZCkgewogICAgdmFyIGRvYyA9IHJvb3Qub3duZXJEb2N1bWVudDsKICAgIHZhciByZXN1bHQgPSBbXTsKICAgIHZhciBsZWF2aW5nID0gdHJ1ZTsKCiAgICBmdW5jdGlvbiBzaW1wbGlmeU5vZGUobm9kZSwgdG9wKSB7CiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDMpIHsKICAgICAgICB2YXIgdGV4dCA9IG5vZGUubm9kZVZhbHVlID0gZml4U3BhY2VzKG5vZGUubm9kZVZhbHVlLnJlcGxhY2UoL1tcclx1MjAwYl0vZywgIiIpLnJlcGxhY2UoL1xuL2csICIgIikpOwogICAgICAgIGlmICh0ZXh0Lmxlbmd0aCkgbGVhdmluZyA9IGZhbHNlOwogICAgICAgIHJlc3VsdC5wdXNoKG5vZGUpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGlzQlIobm9kZSkgJiYgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgbGVhdmluZyA9IHRydWU7CiAgICAgICAgcmVzdWx0LnB1c2gobm9kZSk7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgZm9yICh2YXIgbiA9IG5vZGUuZmlyc3RDaGlsZDsgbjsgbiA9IG4ubmV4dFNpYmxpbmcpIHNpbXBsaWZ5Tm9kZShuKTsKICAgICAgICBpZiAoIWxlYXZpbmcgJiYgbmV3bGluZUVsZW1lbnRzLmhhc093blByb3BlcnR5KG5vZGUubm9kZU5hbWUudG9VcHBlckNhc2UoKSkpIHsKICAgICAgICAgIGxlYXZpbmcgPSB0cnVlOwogICAgICAgICAgaWYgKCFhdEVuZCB8fCAhdG9wKQogICAgICAgICAgICByZXN1bHQucHVzaChkb2MuY3JlYXRlRWxlbWVudCgiQlIiKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgc2ltcGxpZnlOb2RlKHJvb3QsIHRydWUpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vIENyZWF0ZXMgYSBNb2NoaUtpdC1zdHlsZSBpdGVyYXRvciB0aGF0IGdvZXMgb3ZlciBhIHNlcmllcyBvZiBET00KICAvLyBub2Rlcy4gVGhlIHZhbHVlcyBpdCB5aWVsZHMgYXJlIHN0cmluZ3MsIHRoZSB0ZXh0dWFsIGNvbnRlbnQgb2YKICAvLyB0aGUgbm9kZXMuIEl0IG1ha2VzIHN1cmUgdGhhdCBhbGwgbm9kZXMgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUKICAvLyBvbmUgd2hvc2UgdGV4dCBpcyBiZWluZyB5aWVsZGVkIGhhdmUgYmVlbiAnbm9ybWFsaXplZCcgdG8gYmUganVzdAogIC8vIDxzcGFuPiBhbmQgPGJyPiBlbGVtZW50cy4KICBmdW5jdGlvbiB0cmF2ZXJzZURPTShzdGFydCl7CiAgICB2YXIgb3duZXIgPSBzdGFydC5vd25lckRvY3VtZW50OwogICAgdmFyIG5vZGVRdWV1ZSA9IFtdOwoKICAgIC8vIENyZWF0ZSBhIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW5zZXJ0IG5vZGVzIGFmdGVyIHRoZQogICAgLy8gb25lIGdpdmVuIGFzIGFyZ3VtZW50LgogICAgZnVuY3Rpb24gcG9pbnRBdChub2RlKXsKICAgICAgdmFyIHBhcmVudCA9IG5vZGUucGFyZW50Tm9kZTsKICAgICAgdmFyIG5leHQgPSBub2RlLm5leHRTaWJsaW5nOwogICAgICByZXR1cm4gZnVuY3Rpb24obmV3bm9kZSkgewogICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUobmV3bm9kZSwgbmV4dCk7CiAgICAgIH07CiAgICB9CiAgICB2YXIgcG9pbnQgPSBudWxsOwoKICAgIC8vIFRoaXMgYW4gT3BlcmEtc3BlY2lmaWMgaGFjayAtLSBhbHdheXMgaW5zZXJ0IGFuIGVtcHR5IHNwYW4KICAgIC8vIGJldHdlZW4gdHdvIEJScywgYmVjYXVzZSBPcGVyYSdzIGN1cnNvciBjb2RlIGdldHMgdGVycmlibHkKICAgIC8vIGNvbmZ1c2VkIHdoZW4gdGhlIGN1cnNvciBpcyBiZXR3ZWVuIHR3byBCUnMuCiAgICB2YXIgYWZ0ZXJCUiA9IHRydWU7CgogICAgLy8gSW5zZXJ0IGEgbm9ybWFsaXplZCBub2RlIGF0IHRoZSBjdXJyZW50IHBvaW50LiBJZiBpdCBpcyBhIHRleHQKICAgIC8vIG5vZGUsIHdyYXAgaXQgaW4gYSA8c3Bhbj4sIGFuZCBnaXZlIHRoYXQgc3BhbiBhIGN1cnJlbnRUZXh0CiAgICAvLyBwcm9wZXJ0eSAtLSB0aGlzIGlzIHVzZWQgdG8gY2FjaGUgdGhlIG5vZGVWYWx1ZSwgYmVjYXVzZQogICAgLy8gZGlyZWN0bHkgYWNjZXNzaW5nIG5vZGVWYWx1ZSBpcyBob3JyaWJseSBzbG93IG9uIHNvbWUgYnJvd3NlcnMuCiAgICAvLyBUaGUgZGlydHkgcHJvcGVydHkgaXMgdXNlZCBieSB0aGUgaGlnaGxpZ2h0ZXIgdG8gZGV0ZXJtaW5lCiAgICAvLyB3aGljaCBwYXJ0cyBvZiB0aGUgZG9jdW1lbnQgaGF2ZSB0byBiZSByZS1oaWdobGlnaHRlZC4KICAgIGZ1bmN0aW9uIGluc2VydFBhcnQocGFydCl7CiAgICAgIHZhciB0ZXh0ID0gIlxuIjsKICAgICAgaWYgKHBhcnQubm9kZVR5cGUgPT0gMykgewogICAgICAgIHNlbGVjdC5zbmFwc2hvdENoYW5nZWQoKTsKICAgICAgICBwYXJ0ID0gbWFrZVBhcnRTcGFuKHBhcnQsIG93bmVyKTsKICAgICAgICB0ZXh0ID0gcGFydC5jdXJyZW50VGV4dDsKICAgICAgICBhZnRlckJSID0gZmFsc2U7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgaWYgKGFmdGVyQlIgJiYgd2luZG93Lm9wZXJhKQogICAgICAgICAgcG9pbnQobWFrZVBhcnRTcGFuKCIiLCBvd25lcikpOwogICAgICAgIGFmdGVyQlIgPSB0cnVlOwogICAgICB9CiAgICAgIHBhcnQuZGlydHkgPSB0cnVlOwogICAgICBub2RlUXVldWUucHVzaChwYXJ0KTsKICAgICAgcG9pbnQocGFydCk7CiAgICAgIHJldHVybiB0ZXh0OwogICAgfQoKICAgIC8vIEV4dHJhY3QgdGhlIHRleHQgYW5kIG5ld2xpbmVzIGZyb20gYSBET00gbm9kZSwgaW5zZXJ0IHRoZW0gaW50bwogICAgLy8gdGhlIGRvY3VtZW50LCBhbmQgcmV0dXJuIHRoZSB0ZXh0dWFsIGNvbnRlbnQuIFVzZWQgdG8gcmVwbGFjZQogICAgLy8gbm9uLW5vcm1hbGl6ZWQgbm9kZXMuCiAgICBmdW5jdGlvbiB3cml0ZU5vZGUobm9kZSwgZW5kKSB7CiAgICAgIHZhciBzaW1wbGlmaWVkID0gc2ltcGxpZnlET00obm9kZSwgZW5kKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaW1wbGlmaWVkLmxlbmd0aDsgaSsrKQogICAgICAgIHNpbXBsaWZpZWRbaV0gPSBpbnNlcnRQYXJ0KHNpbXBsaWZpZWRbaV0pOwogICAgICByZXR1cm4gc2ltcGxpZmllZC5qb2luKCIiKTsKICAgIH0KCiAgICAvLyBDaGVjayB3aGV0aGVyIGEgbm9kZSBpcyBhIG5vcm1hbGl6ZWQgPHNwYW4+IGVsZW1lbnQuCiAgICBmdW5jdGlvbiBwYXJ0Tm9kZShub2RlKXsKICAgICAgaWYgKG5vZGUuaXNQYXJ0ICYmIG5vZGUuY2hpbGROb2Rlcy5sZW5ndGggPT0gMSAmJiBub2RlLmZpcnN0Q2hpbGQubm9kZVR5cGUgPT0gMykgewogICAgICAgIG5vZGUuY3VycmVudFRleHQgPSBub2RlLmZpcnN0Q2hpbGQubm9kZVZhbHVlOwogICAgICAgIHJldHVybiAhL1tcblx0XHJdLy50ZXN0KG5vZGUuY3VycmVudFRleHQpOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLyBBZHZhbmNlIHRvIG5leHQgbm9kZSwgcmV0dXJuIHN0cmluZyBmb3IgY3VycmVudCBub2RlLgogICAgZnVuY3Rpb24gbmV4dCgpIHsKICAgICAgaWYgKCFzdGFydCkgdGhyb3cgU3RvcEl0ZXJhdGlvbjsKICAgICAgdmFyIG5vZGUgPSBzdGFydDsKICAgICAgc3RhcnQgPSBub2RlLm5leHRTaWJsaW5nOwoKICAgICAgaWYgKHBhcnROb2RlKG5vZGUpKXsKICAgICAgICBub2RlUXVldWUucHVzaChub2RlKTsKICAgICAgICBhZnRlckJSID0gZmFsc2U7CiAgICAgICAgcmV0dXJuIG5vZGUuY3VycmVudFRleHQ7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoaXNCUihub2RlKSkgewogICAgICAgIGlmIChhZnRlckJSICYmIHdpbmRvdy5vcGVyYSkKICAgICAgICAgIG5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobWFrZVBhcnRTcGFuKCIiLCBvd25lciksIG5vZGUpOwogICAgICAgIG5vZGVRdWV1ZS5wdXNoKG5vZGUpOwogICAgICAgIGFmdGVyQlIgPSB0cnVlOwogICAgICAgIHJldHVybiAiXG4iOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIHZhciBlbmQgPSAhbm9kZS5uZXh0U2libGluZzsKICAgICAgICBwb2ludCA9IHBvaW50QXQobm9kZSk7CiAgICAgICAgcmVtb3ZlRWxlbWVudChub2RlKTsKICAgICAgICByZXR1cm4gd3JpdGVOb2RlKG5vZGUsIGVuZCk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBNb2NoaUtpdCBpdGVyYXRvcnMgYXJlIG9iamVjdHMgd2l0aCBhIG5leHQgZnVuY3Rpb24gdGhhdAogICAgLy8gcmV0dXJucyB0aGUgbmV4dCB2YWx1ZSBvciB0aHJvd3MgU3RvcEl0ZXJhdGlvbiB3aGVuIHRoZXJlIGFyZQogICAgLy8gbm8gbW9yZSB2YWx1ZXMuCiAgICByZXR1cm4ge25leHQ6IG5leHQsIG5vZGVzOiBub2RlUXVldWV9OwogIH0KCiAgLy8gRGV0ZXJtaW5lIHRoZSB0ZXh0IHNpemUgb2YgYSBwcm9jZXNzZWQgbm9kZS4KICBmdW5jdGlvbiBub2RlU2l6ZShub2RlKSB7CiAgICByZXR1cm4gaXNCUihub2RlKSA/IDEgOiBub2RlLmN1cnJlbnRUZXh0Lmxlbmd0aDsKICB9CgogIC8vIFNlYXJjaCBiYWNrd2FyZHMgdGhyb3VnaCB0aGUgdG9wLWxldmVsIG5vZGVzIHVudGlsIHRoZSBuZXh0IEJSIG9yCiAgLy8gdGhlIHN0YXJ0IG9mIHRoZSBmcmFtZS4KICBmdW5jdGlvbiBzdGFydE9mTGluZShub2RlKSB7CiAgICB3aGlsZSAobm9kZSAmJiAhaXNCUihub2RlKSkgbm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nOwogICAgcmV0dXJuIG5vZGU7CiAgfQogIGZ1bmN0aW9uIGVuZE9mTGluZShub2RlLCBjb250YWluZXIpIHsKICAgIGlmICghbm9kZSkgbm9kZSA9IGNvbnRhaW5lci5maXJzdENoaWxkOwogICAgZWxzZSBpZiAoaXNCUihub2RlKSkgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7CgogICAgd2hpbGUgKG5vZGUgJiYgIWlzQlIobm9kZSkpIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nOwogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBmdW5jdGlvbiB0aW1lKCkge3JldHVybiBuZXcgRGF0ZSgpLmdldFRpbWUoKTt9CgogIC8vIENsaWVudCBpbnRlcmZhY2UgZm9yIHNlYXJjaGluZyB0aGUgY29udGVudCBvZiB0aGUgZWRpdG9yLiBDcmVhdGUKICAvLyB0aGVzZSBieSBjYWxsaW5nIENvZGVNaXJyb3IuZ2V0U2VhcmNoQ3Vyc29yLiBUbyB1c2UsIGNhbGwKICAvLyBmaW5kTmV4dCBvbiB0aGUgcmVzdWx0aW5nIG9iamVjdCAtLSB0aGlzIHJldHVybnMgYSBib29sZWFuCiAgLy8gaW5kaWNhdGluZyB3aGV0aGVyIGFueXRoaW5nIHdhcyBmb3VuZCwgYW5kIGNhbiBiZSBjYWxsZWQgYWdhaW4gdG8KICAvLyBza2lwIHRvIHRoZSBuZXh0IGZpbmQuIFVzZSB0aGUgc2VsZWN0IGFuZCByZXBsYWNlIG1ldGhvZHMgdG8KICAvLyBhY3R1YWxseSBkbyBzb21ldGhpbmcgd2l0aCB0aGUgZm91bmQgbG9jYXRpb25zLgogIGZ1bmN0aW9uIFNlYXJjaEN1cnNvcihlZGl0b3IsIHN0cmluZywgZnJvbUN1cnNvciwgY2FzZUZvbGQpIHsKICAgIHRoaXMuZWRpdG9yID0gZWRpdG9yOwogICAgaWYgKGNhc2VGb2xkID09IHVuZGVmaW5lZCkgewogICAgICBjYXNlRm9sZCA9IChzdHJpbmcgPT0gc3RyaW5nLnRvTG93ZXJDYXNlKCkpOwogICAgfQogICAgdGhpcy5jYXNlRm9sZCA9IGNhc2VGb2xkOwogICAgaWYgKGNhc2VGb2xkKSBzdHJpbmcgPSBzdHJpbmcudG9Mb3dlckNhc2UoKTsKICAgIHRoaXMuaGlzdG9yeSA9IGVkaXRvci5oaXN0b3J5OwogICAgdGhpcy5oaXN0b3J5LmNvbW1pdCgpOwoKICAgIC8vIEFyZSB3ZSBjdXJyZW50bHkgYXQgYW4gb2NjdXJyZW5jZSBvZiB0aGUgc2VhcmNoIHN0cmluZz8KICAgIHRoaXMuYXRPY2N1cnJlbmNlID0gZmFsc2U7CiAgICAvLyBUaGUgb2JqZWN0IHN0b3JlcyBhIHNldCBvZiBub2RlcyBjb21pbmcgYWZ0ZXIgaXRzIGN1cnJlbnQKICAgIC8vIHBvc2l0aW9uLCBzbyB0aGF0IHdoZW4gdGhlIGN1cnJlbnQgcG9pbnQgaXMgdGFrZW4gb3V0IG9mIHRoZQogICAgLy8gRE9NIHRyZWUsIHdlIGNhbiBzdGlsbCB0cnkgdG8gY29udGludWUuCiAgICB0aGlzLmZhbGxiYWNrU2l6ZSA9IDE1OwogICAgdmFyIGN1cnNvcjsKICAgIC8vIFN0YXJ0IGZyb20gdGhlIGN1cnNvciB3aGVuIHNwZWNpZmllZCBhbmQgYSBjdXJzb3IgY2FuIGJlIGZvdW5kLgogICAgaWYgKGZyb21DdXJzb3IgJiYgKGN1cnNvciA9IHNlbGVjdC5jdXJzb3JQb3ModGhpcy5lZGl0b3IuY29udGFpbmVyKSkpIHsKICAgICAgdGhpcy5saW5lID0gY3Vyc29yLm5vZGU7CiAgICAgIHRoaXMub2Zmc2V0ID0gY3Vyc29yLm9mZnNldDsKICAgIH0KICAgIGVsc2UgewogICAgICB0aGlzLmxpbmUgPSBudWxsOwogICAgICB0aGlzLm9mZnNldCA9IDA7CiAgICB9CiAgICB0aGlzLnZhbGlkID0gISFzdHJpbmc7CgogICAgLy8gQ3JlYXRlIGEgbWF0Y2hlciBmdW5jdGlvbiBiYXNlZCBvbiB0aGUga2luZCBvZiBzdHJpbmcgd2UgaGF2ZS4KICAgIHZhciB0YXJnZXQgPSBzdHJpbmcuc3BsaXQoIlxuIiksIHNlbGYgPSB0aGlzOwogICAgdGhpcy5tYXRjaGVzID0gKHRhcmdldC5sZW5ndGggPT0gMSkgPwogICAgICAvLyBGb3Igb25lLWxpbmUgc3RyaW5ncywgc2VhcmNoaW5nIGNhbiBiZSBkb25lIHNpbXBseSBieSBjYWxsaW5nCiAgICAgIC8vIGluZGV4T2Ygb24gdGhlIGN1cnJlbnQgbGluZS4KICAgICAgZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGxpbmUgPSBjbGVhblRleHQoc2VsZi5oaXN0b3J5LnRleHRBZnRlcihzZWxmLmxpbmUpLnNsaWNlKHNlbGYub2Zmc2V0KSk7CiAgICAgICAgdmFyIG1hdGNoID0gKHNlbGYuY2FzZUZvbGQgPyBsaW5lLnRvTG93ZXJDYXNlKCkgOiBsaW5lKS5pbmRleE9mKHN0cmluZyk7CiAgICAgICAgaWYgKG1hdGNoID4gLTEpCiAgICAgICAgICByZXR1cm4ge2Zyb206IHtub2RlOiBzZWxmLmxpbmUsIG9mZnNldDogc2VsZi5vZmZzZXQgKyBtYXRjaH0sCiAgICAgICAgICAgICAgICAgIHRvOiB7bm9kZTogc2VsZi5saW5lLCBvZmZzZXQ6IHNlbGYub2Zmc2V0ICsgbWF0Y2ggKyBzdHJpbmcubGVuZ3RofX07CiAgICAgIH0gOgogICAgICAvLyBNdWx0aS1saW5lIHN0cmluZ3MgcmVxdWlyZSBpbnRlcm5hbCBpdGVyYXRpb24gb3ZlciBsaW5lcywgYW5kCiAgICAgIC8vIHNvbWUgY2x1bmt5IGNoZWNrcyB0byBtYWtlIHN1cmUgdGhlIGZpcnN0IG1hdGNoIGVuZHMgYXQgdGhlCiAgICAgIC8vIGVuZCBvZiB0aGUgbGluZSBhbmQgdGhlIGxhc3QgbWF0Y2ggc3RhcnRzIGF0IHRoZSBzdGFydC4KICAgICAgZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGZpcnN0TGluZSA9IGNsZWFuVGV4dChzZWxmLmhpc3RvcnkudGV4dEFmdGVyKHNlbGYubGluZSkuc2xpY2Uoc2VsZi5vZmZzZXQpKTsKICAgICAgICB2YXIgbWF0Y2ggPSAoc2VsZi5jYXNlRm9sZCA/IGZpcnN0TGluZS50b0xvd2VyQ2FzZSgpIDogZmlyc3RMaW5lKS5sYXN0SW5kZXhPZih0YXJnZXRbMF0pOwogICAgICAgIGlmIChtYXRjaCA9PSAtMSB8fCBtYXRjaCAhPSBmaXJzdExpbmUubGVuZ3RoIC0gdGFyZ2V0WzBdLmxlbmd0aCkKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB2YXIgc3RhcnRPZmZzZXQgPSBzZWxmLm9mZnNldCArIG1hdGNoOwoKICAgICAgICB2YXIgbGluZSA9IHNlbGYuaGlzdG9yeS5ub2RlQWZ0ZXIoc2VsZi5saW5lKTsKICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IHRhcmdldC5sZW5ndGggLSAxOyBpKyspIHsKICAgICAgICAgIHZhciBsaW5lVGV4dCA9IGNsZWFuVGV4dChzZWxmLmhpc3RvcnkudGV4dEFmdGVyKGxpbmUpKTsKICAgICAgICAgIGlmICgoc2VsZi5jYXNlRm9sZCA/IGxpbmVUZXh0LnRvTG93ZXJDYXNlKCkgOiBsaW5lVGV4dCkgIT0gdGFyZ2V0W2ldKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICBsaW5lID0gc2VsZi5oaXN0b3J5Lm5vZGVBZnRlcihsaW5lKTsKICAgICAgICB9CgogICAgICAgIHZhciBsYXN0TGluZSA9IGNsZWFuVGV4dChzZWxmLmhpc3RvcnkudGV4dEFmdGVyKGxpbmUpKTsKICAgICAgICBpZiAoKHNlbGYuY2FzZUZvbGQgPyBsYXN0TGluZS50b0xvd2VyQ2FzZSgpIDogbGFzdExpbmUpLmluZGV4T2YodGFyZ2V0W3RhcmdldC5sZW5ndGggLSAxXSkgIT0gMCkKICAgICAgICAgIHJldHVybiBmYWxzZTsKCiAgICAgICAgcmV0dXJuIHtmcm9tOiB7bm9kZTogc2VsZi5saW5lLCBvZmZzZXQ6IHN0YXJ0T2Zmc2V0fSwKICAgICAgICAgICAgICAgIHRvOiB7bm9kZTogbGluZSwgb2Zmc2V0OiB0YXJnZXRbdGFyZ2V0Lmxlbmd0aCAtIDFdLmxlbmd0aH19OwogICAgICB9OwogIH0KCiAgU2VhcmNoQ3Vyc29yLnByb3RvdHlwZSA9IHsKICAgIGZpbmROZXh0OiBmdW5jdGlvbigpIHsKICAgICAgaWYgKCF0aGlzLnZhbGlkKSByZXR1cm4gZmFsc2U7CiAgICAgIHRoaXMuYXRPY2N1cnJlbmNlID0gZmFsc2U7CiAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgIC8vIEdvIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBkb2N1bWVudCBpZiB0aGUgY3VycmVudCBsaW5lIGlzCiAgICAgIC8vIG5vIGxvbmdlciBpbiB0aGUgRE9NIHRyZWUuCiAgICAgIGlmICh0aGlzLmxpbmUgJiYgIXRoaXMubGluZS5wYXJlbnROb2RlKSB7CiAgICAgICAgdGhpcy5saW5lID0gbnVsbDsKICAgICAgICB0aGlzLm9mZnNldCA9IDA7CiAgICAgIH0KCiAgICAgIC8vIFNldCB0aGUgY3Vyc29yJ3MgcG9zaXRpb24gb25lIGNoYXJhY3RlciBhZnRlciB0aGUgZ2l2ZW4KICAgICAgLy8gcG9zaXRpb24uCiAgICAgIGZ1bmN0aW9uIHNhdmVBZnRlcihwb3MpIHsKICAgICAgICBpZiAoc2VsZi5oaXN0b3J5LnRleHRBZnRlcihwb3Mubm9kZSkubGVuZ3RoID4gcG9zLm9mZnNldCkgewogICAgICAgICAgc2VsZi5saW5lID0gcG9zLm5vZGU7CiAgICAgICAgICBzZWxmLm9mZnNldCA9IHBvcy5vZmZzZXQgKyAxOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIHNlbGYubGluZSA9IHNlbGYuaGlzdG9yeS5ub2RlQWZ0ZXIocG9zLm5vZGUpOwogICAgICAgICAgc2VsZi5vZmZzZXQgPSAwOwogICAgICAgIH0KICAgICAgfQoKICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICB2YXIgbWF0Y2ggPSB0aGlzLm1hdGNoZXMoKTsKICAgICAgICAvLyBGb3VuZCB0aGUgc2VhcmNoIHN0cmluZy4KICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgIHRoaXMuYXRPY2N1cnJlbmNlID0gbWF0Y2g7CiAgICAgICAgICBzYXZlQWZ0ZXIobWF0Y2guZnJvbSk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgdGhpcy5saW5lID0gdGhpcy5oaXN0b3J5Lm5vZGVBZnRlcih0aGlzLmxpbmUpOwogICAgICAgIHRoaXMub2Zmc2V0ID0gMDsKICAgICAgICAvLyBFbmQgb2YgZG9jdW1lbnQuCiAgICAgICAgaWYgKCF0aGlzLmxpbmUpIHsKICAgICAgICAgIHRoaXMudmFsaWQgPSBmYWxzZTsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sCgogICAgc2VsZWN0OiBmdW5jdGlvbigpIHsKICAgICAgaWYgKHRoaXMuYXRPY2N1cnJlbmNlKSB7CiAgICAgICAgc2VsZWN0LnNldEN1cnNvclBvcyh0aGlzLmVkaXRvci5jb250YWluZXIsIHRoaXMuYXRPY2N1cnJlbmNlLmZyb20sIHRoaXMuYXRPY2N1cnJlbmNlLnRvKTsKICAgICAgICBzZWxlY3Quc2Nyb2xsVG9DdXJzb3IodGhpcy5lZGl0b3IuY29udGFpbmVyKTsKICAgICAgfQogICAgfSwKCiAgICByZXBsYWNlOiBmdW5jdGlvbihzdHJpbmcpIHsKICAgICAgaWYgKHRoaXMuYXRPY2N1cnJlbmNlKSB7CiAgICAgICAgdmFyIGVuZCA9IHRoaXMuZWRpdG9yLnJlcGxhY2VSYW5nZSh0aGlzLmF0T2NjdXJyZW5jZS5mcm9tLCB0aGlzLmF0T2NjdXJyZW5jZS50bywgc3RyaW5nKTsKICAgICAgICB0aGlzLmxpbmUgPSBlbmQubm9kZTsKICAgICAgICB0aGlzLm9mZnNldCA9IGVuZC5vZmZzZXQ7CiAgICAgICAgdGhpcy5hdE9jY3VycmVuY2UgPSBmYWxzZTsKICAgICAgfQogICAgfQogIH07CgogIC8vIFRoZSBFZGl0b3Igb2JqZWN0IGlzIHRoZSBtYWluIGluc2lkZS10aGUtaWZyYW1lIGludGVyZmFjZS4KICBmdW5jdGlvbiBFZGl0b3Iob3B0aW9ucykgewogICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKICAgIHdpbmRvdy5pbmRlbnRVbml0ID0gb3B0aW9ucy5pbmRlbnRVbml0OwogICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CiAgICB0aGlzLmRvYyA9IGRvY3VtZW50OwogICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyID0gdGhpcy5kb2MuYm9keTsKICAgIHRoaXMud2luID0gd2luZG93OwogICAgdGhpcy5oaXN0b3J5ID0gbmV3IFVuZG9IaXN0b3J5KGNvbnRhaW5lciwgb3B0aW9ucy51bmRvRGVwdGgsIG9wdGlvbnMudW5kb0RlbGF5LCB0aGlzKTsKICAgIHZhciBzZWxmID0gdGhpczsKCiAgICBpZiAoIUVkaXRvci5QYXJzZXIpCiAgICAgIHRocm93ICJObyBwYXJzZXIgbG9hZGVkLiI7CiAgICBpZiAob3B0aW9ucy5wYXJzZXJDb25maWcgJiYgRWRpdG9yLlBhcnNlci5jb25maWd1cmUpCiAgICAgIEVkaXRvci5QYXJzZXIuY29uZmlndXJlKG9wdGlvbnMucGFyc2VyQ29uZmlnKTsKCiAgICBpZiAoIW9wdGlvbnMucmVhZE9ubHkpCiAgICAgIHNlbGVjdC5zZXRDdXJzb3JQb3MoY29udGFpbmVyLCB7bm9kZTogbnVsbCwgb2Zmc2V0OiAwfSk7CgogICAgdGhpcy5kaXJ0eSA9IFtdOwogICAgdGhpcy5pbXBvcnRDb2RlKG9wdGlvbnMuY29udGVudCB8fCAiIik7CiAgICB0aGlzLmhpc3Rvcnkub25DaGFuZ2UgPSBvcHRpb25zLm9uQ2hhbmdlOwoKICAgIGlmICghb3B0aW9ucy5yZWFkT25seSkgewogICAgICBpZiAob3B0aW9ucy5jb250aW51b3VzU2Nhbm5pbmcgIT09IGZhbHNlKSB7CiAgICAgICAgdGhpcy5zY2FubmVyID0gdGhpcy5kb2N1bWVudFNjYW5uZXIob3B0aW9ucy5wYXNzVGltZSk7CiAgICAgICAgdGhpcy5kZWxheVNjYW5uaW5nKCk7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNldEVkaXRhYmxlKCkgewogICAgICAgIC8vIFVzZSBjb250ZW50RWRpdGFibGUgaW5zdGVhZCBvZiBkZXNpZ25Nb2RlIG9uIElFLCBzaW5jZSBkZXNpZ25Nb2RlIGZyYW1lcwogICAgICAgIC8vIGNhbiBub3QgcnVuIGFueSBzY3JpcHRzLiBJdCB3b3VsZCBiZSBuaWNlIGlmIHdlIGNvdWxkIHVzZSBjb250ZW50RWRpdGFibGUKICAgICAgICAvLyBldmVyeXdoZXJlLCBidXQgaXQgaXMgc2lnbmlmaWNhbnRseSBmbGFraWVyIHRoYW4gZGVzaWduTW9kZSBvbiBldmVyeQogICAgICAgIC8vIHNpbmdsZSBub24tSUUgYnJvd3Nlci4KICAgICAgICBpZiAoZG9jdW1lbnQuYm9keS5jb250ZW50RWRpdGFibGUgIT0gdW5kZWZpbmVkICYmIGludGVybmV0RXhwbG9yZXIpCiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNvbnRlbnRFZGl0YWJsZSA9ICJ0cnVlIjsKICAgICAgICBlbHNlCiAgICAgICAgICBkb2N1bWVudC5kZXNpZ25Nb2RlID0gIm9uIjsKCiAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLmJvcmRlcldpZHRoID0gIjAiOwogICAgICAgIGlmICghb3B0aW9ucy50ZXh0V3JhcHBpbmcpCiAgICAgICAgICBjb250YWluZXIuc3R5bGUud2hpdGVTcGFjZSA9ICJub3dyYXAiOwogICAgICB9CgogICAgICAvLyBJZiBzZXR0aW5nIHRoZSBmcmFtZSBlZGl0YWJsZSBmYWlscywgdHJ5IGFnYWluIHdoZW4gdGhlIHVzZXIKICAgICAgLy8gZm9jdXMgaXQgKGhhcHBlbnMgd2hlbiB0aGUgZnJhbWUgaXMgbm90IHZpc2libGUgb24KICAgICAgLy8gaW5pdGlhbGlzYXRpb24sIGluIEZpcmVmb3gpLgogICAgICB0cnkgewogICAgICAgIHNldEVkaXRhYmxlKCk7CiAgICAgIH0KICAgICAgY2F0Y2goZSkgewogICAgICAgIHZhciBmb2N1c0V2ZW50ID0gYWRkRXZlbnRIYW5kbGVyKGRvY3VtZW50LCAiZm9jdXMiLCBmdW5jdGlvbigpIHsKICAgICAgICAgIGZvY3VzRXZlbnQoKTsKICAgICAgICAgIHNldEVkaXRhYmxlKCk7CiAgICAgICAgfSwgdHJ1ZSk7CiAgICAgIH0KCiAgICAgIGFkZEV2ZW50SGFuZGxlcihkb2N1bWVudCwgImtleWRvd24iLCBtZXRob2QodGhpcywgImtleURvd24iKSk7CiAgICAgIGFkZEV2ZW50SGFuZGxlcihkb2N1bWVudCwgImtleXByZXNzIiwgbWV0aG9kKHRoaXMsICJrZXlQcmVzcyIpKTsKICAgICAgYWRkRXZlbnRIYW5kbGVyKGRvY3VtZW50LCAia2V5dXAiLCBtZXRob2QodGhpcywgImtleVVwIikpOwoKICAgICAgZnVuY3Rpb24gY3Vyc29yQWN0aXZpdHkoKSB7c2VsZi5jdXJzb3JBY3Rpdml0eShmYWxzZSk7fQogICAgICBhZGRFdmVudEhhbmRsZXIoZG9jdW1lbnQuYm9keSwgIm1vdXNldXAiLCBjdXJzb3JBY3Rpdml0eSk7CiAgICAgIGFkZEV2ZW50SGFuZGxlcihkb2N1bWVudC5ib2R5LCAiY3V0IiwgY3Vyc29yQWN0aXZpdHkpOwoKICAgICAgLy8gd29ya2Fyb3VuZCBmb3IgYSBnZWNrbyBidWcgWz9dIHdoZXJlIGdvaW5nIGZvcndhcmQgYW5kIHRoZW4KICAgICAgLy8gYmFjayBhZ2FpbiBicmVha3MgZGVzaWdubW9kZSAobm8gbW9yZSBjdXJzb3IpCiAgICAgIGlmIChnZWNrbykKICAgICAgICBhZGRFdmVudEhhbmRsZXIodGhpcy53aW4sICJwYWdlaGlkZSIsIGZ1bmN0aW9uKCl7c2VsZi51bmxvYWRlZCA9IHRydWU7fSk7CgogICAgICBhZGRFdmVudEhhbmRsZXIoZG9jdW1lbnQuYm9keSwgInBhc3RlIiwgZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICBjdXJzb3JBY3Rpdml0eSgpOwogICAgICAgIHZhciB0ZXh0ID0gbnVsbDsKICAgICAgICB0cnkgewogICAgICAgICAgdmFyIGNsaXBib2FyZERhdGEgPSBldmVudC5jbGlwYm9hcmREYXRhIHx8IHdpbmRvdy5jbGlwYm9hcmREYXRhOwogICAgICAgICAgaWYgKGNsaXBib2FyZERhdGEpIHRleHQgPSBjbGlwYm9hcmREYXRhLmdldERhdGEoJ1RleHQnKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2goZSkge30KICAgICAgICBpZiAodGV4dCAhPT0gbnVsbCkgewogICAgICAgICAgZXZlbnQuc3RvcCgpOwogICAgICAgICAgc2VsZi5yZXBsYWNlU2VsZWN0aW9uKHRleHQpOwogICAgICAgICAgc2VsZWN0LnNjcm9sbFRvQ3Vyc29yKHNlbGYuY29udGFpbmVyKTsKICAgICAgICB9CiAgICAgIH0pOwoKICAgICAgaWYgKHRoaXMub3B0aW9ucy5hdXRvTWF0Y2hQYXJlbnMpCiAgICAgICAgYWRkRXZlbnRIYW5kbGVyKGRvY3VtZW50LmJvZHksICJjbGljayIsIG1ldGhvZCh0aGlzLCAic2NoZWR1bGVQYXJlbkhpZ2hsaWdodCIpKTsKICAgIH0KICAgIGVsc2UgaWYgKCFvcHRpb25zLnRleHRXcmFwcGluZykgewogICAgICBjb250YWluZXIuc3R5bGUud2hpdGVTcGFjZSA9ICJub3dyYXAiOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaXNTYWZlS2V5KGNvZGUpIHsKICAgIHJldHVybiAoY29kZSA+PSAxNiAmJiBjb2RlIDw9IDE4KSB8fCAvLyBzaGlmdCwgY29udHJvbCwgYWx0CiAgICAgICAgICAgKGNvZGUgPj0gMzMgJiYgY29kZSA8PSA0MCk7IC8vIGFycm93cywgaG9tZSwgZW5kCiAgfQoKICBFZGl0b3IucHJvdG90eXBlID0gewogICAgLy8gSW1wb3J0IGEgcGllY2Ugb2YgY29kZSBpbnRvIHRoZSBlZGl0b3IuCiAgICBpbXBvcnRDb2RlOiBmdW5jdGlvbihjb2RlKSB7CiAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKG51bGwsIG51bGwsIGFzRWRpdG9yTGluZXMoY29kZSkpOwogICAgICB0aGlzLmhpc3RvcnkucmVzZXQoKTsKICAgIH0sCgogICAgLy8gRXh0cmFjdCB0aGUgY29kZSBmcm9tIHRoZSBlZGl0b3IuCiAgICBnZXRDb2RlOiBmdW5jdGlvbigpIHsKICAgICAgaWYgKCF0aGlzLmNvbnRhaW5lci5maXJzdENoaWxkKQogICAgICAgIHJldHVybiAiIjsKCiAgICAgIHZhciBhY2N1bSA9IFtdOwogICAgICBzZWxlY3QubWFya1NlbGVjdGlvbih0aGlzLndpbik7CiAgICAgIGZvckVhY2godHJhdmVyc2VET00odGhpcy5jb250YWluZXIuZmlyc3RDaGlsZCksIG1ldGhvZChhY2N1bSwgInB1c2giKSk7CiAgICAgIHdlYmtpdExhc3RMaW5lSGFjayh0aGlzLmNvbnRhaW5lcik7CiAgICAgIHNlbGVjdC5zZWxlY3RNYXJrZWQoKTsKICAgICAgcmV0dXJuIGNsZWFuVGV4dChhY2N1bS5qb2luKCIiKSk7CiAgICB9LAoKICAgIGNoZWNrTGluZTogZnVuY3Rpb24obm9kZSkgewogICAgICBpZiAobm9kZSA9PT0gZmFsc2UgfHwgIShub2RlID09IG51bGwgfHwgbm9kZS5wYXJlbnROb2RlID09IHRoaXMuY29udGFpbmVyKSkKICAgICAgICB0aHJvdyBwYXJlbnQuQ29kZU1pcnJvci5JbnZhbGlkTGluZUhhbmRsZTsKICAgIH0sCgogICAgY3Vyc29yUG9zaXRpb246IGZ1bmN0aW9uKHN0YXJ0KSB7CiAgICAgIGlmIChzdGFydCA9PSBudWxsKSBzdGFydCA9IHRydWU7CiAgICAgIHZhciBwb3MgPSBzZWxlY3QuY3Vyc29yUG9zKHRoaXMuY29udGFpbmVyLCBzdGFydCk7CiAgICAgIGlmIChwb3MpIHJldHVybiB7bGluZTogcG9zLm5vZGUsIGNoYXJhY3RlcjogcG9zLm9mZnNldH07CiAgICAgIGVsc2UgcmV0dXJuIHtsaW5lOiBudWxsLCBjaGFyYWN0ZXI6IDB9OwogICAgfSwKCiAgICBmaXJzdExpbmU6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0sCgogICAgbGFzdExpbmU6IGZ1bmN0aW9uKCkgewogICAgICBpZiAodGhpcy5jb250YWluZXIubGFzdENoaWxkKSByZXR1cm4gc3RhcnRPZkxpbmUodGhpcy5jb250YWluZXIubGFzdENoaWxkKTsKICAgICAgZWxzZSByZXR1cm4gbnVsbDsKICAgIH0sCgogICAgbmV4dExpbmU6IGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgdGhpcy5jaGVja0xpbmUobGluZSk7CiAgICAgIHZhciBlbmQgPSBlbmRPZkxpbmUobGluZSwgdGhpcy5jb250YWluZXIpOwogICAgICByZXR1cm4gZW5kIHx8IGZhbHNlOwogICAgfSwKCiAgICBwcmV2TGluZTogZnVuY3Rpb24obGluZSkgewogICAgICB0aGlzLmNoZWNrTGluZShsaW5lKTsKICAgICAgaWYgKGxpbmUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgICByZXR1cm4gc3RhcnRPZkxpbmUobGluZS5wcmV2aW91c1NpYmxpbmcpOwogICAgfSwKCiAgICB2aXNpYmxlTGluZUNvdW50OiBmdW5jdGlvbigpIHsKICAgICAgdmFyIGxpbmUgPSB0aGlzLmNvbnRhaW5lci5maXJzdENoaWxkOwogICAgICB3aGlsZSAobGluZSAmJiBpc0JSKGxpbmUpKSBsaW5lID0gbGluZS5uZXh0U2libGluZzsgLy8gQlIgaGVpZ2h0cyBhcmUgdW5yZWxpYWJsZQogICAgICBpZiAoIWxpbmUpIHJldHVybiBmYWxzZTsKICAgICAgdmFyIGlubmVySGVpZ2h0ID0gKHdpbmRvdy5pbm5lckhlaWdodAogICAgICAgICAgICAgICAgICAgICAgICAgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodAogICAgICAgICAgICAgICAgICAgICAgICAgfHwgZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQpOwogICAgICByZXR1cm4gTWF0aC5mbG9vcihpbm5lckhlaWdodCAvIGxpbmUub2Zmc2V0SGVpZ2h0KTsKICAgIH0sCgogICAgc2VsZWN0TGluZXM6IGZ1bmN0aW9uKHN0YXJ0TGluZSwgc3RhcnRPZmZzZXQsIGVuZExpbmUsIGVuZE9mZnNldCkgewogICAgICB0aGlzLmNoZWNrTGluZShzdGFydExpbmUpOwogICAgICB2YXIgc3RhcnQgPSB7bm9kZTogc3RhcnRMaW5lLCBvZmZzZXQ6IHN0YXJ0T2Zmc2V0fSwgZW5kID0gbnVsbDsKICAgICAgaWYgKGVuZE9mZnNldCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgdGhpcy5jaGVja0xpbmUoZW5kTGluZSk7CiAgICAgICAgZW5kID0ge25vZGU6IGVuZExpbmUsIG9mZnNldDogZW5kT2Zmc2V0fTsKICAgICAgfQogICAgICBzZWxlY3Quc2V0Q3Vyc29yUG9zKHRoaXMuY29udGFpbmVyLCBzdGFydCwgZW5kKTsKICAgICAgc2VsZWN0LnNjcm9sbFRvQ3Vyc29yKHRoaXMuY29udGFpbmVyKTsKICAgIH0sCgogICAgbGluZUNvbnRlbnQ6IGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgdmFyIGFjY3VtID0gW107CiAgICAgIGZvciAobGluZSA9IGxpbmUgPyBsaW5lLm5leHRTaWJsaW5nIDogdGhpcy5jb250YWluZXIuZmlyc3RDaGlsZDsKICAgICAgICAgICBsaW5lICYmICFpc0JSKGxpbmUpOyBsaW5lID0gbGluZS5uZXh0U2libGluZykKICAgICAgICBhY2N1bS5wdXNoKG5vZGVUZXh0KGxpbmUpKTsKICAgICAgcmV0dXJuIGNsZWFuVGV4dChhY2N1bS5qb2luKCIiKSk7CiAgICB9LAoKICAgIHNldExpbmVDb250ZW50OiBmdW5jdGlvbihsaW5lLCBjb250ZW50KSB7CiAgICAgIHRoaXMuaGlzdG9yeS5jb21taXQoKTsKICAgICAgdGhpcy5yZXBsYWNlUmFuZ2Uoe25vZGU6IGxpbmUsIG9mZnNldDogMH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHtub2RlOiBsaW5lLCBvZmZzZXQ6IHRoaXMuaGlzdG9yeS50ZXh0QWZ0ZXIobGluZSkubGVuZ3RofSwKICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCk7CiAgICAgIHRoaXMuYWRkRGlydHlOb2RlKGxpbmUpOwogICAgICB0aGlzLnNjaGVkdWxlSGlnaGxpZ2h0KCk7CiAgICB9LAoKICAgIHJlbW92ZUxpbmU6IGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgdmFyIG5vZGUgPSBsaW5lID8gbGluZS5uZXh0U2libGluZyA6IHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQ7CiAgICAgIHdoaWxlIChub2RlKSB7CiAgICAgICAgdmFyIG5leHQgPSBub2RlLm5leHRTaWJsaW5nOwogICAgICAgIHJlbW92ZUVsZW1lbnQobm9kZSk7CiAgICAgICAgaWYgKGlzQlIobm9kZSkpIGJyZWFrOwogICAgICAgIG5vZGUgPSBuZXh0OwogICAgICB9CiAgICAgIHRoaXMuYWRkRGlydHlOb2RlKGxpbmUpOwogICAgICB0aGlzLnNjaGVkdWxlSGlnaGxpZ2h0KCk7CiAgICB9LAoKICAgIGluc2VydEludG9MaW5lOiBmdW5jdGlvbihsaW5lLCBwb3NpdGlvbiwgY29udGVudCkgewogICAgICB2YXIgYmVmb3JlID0gbnVsbDsKICAgICAgaWYgKHBvc2l0aW9uID09ICJlbmQiKSB7CiAgICAgICAgYmVmb3JlID0gZW5kT2ZMaW5lKGxpbmUsIHRoaXMuY29udGFpbmVyKTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBmb3IgKHZhciBjdXIgPSBsaW5lID8gbGluZS5uZXh0U2libGluZyA6IHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQ7IGN1cjsgY3VyID0gY3VyLm5leHRTaWJsaW5nKSB7CiAgICAgICAgICBpZiAocG9zaXRpb24gPT0gMCkgewogICAgICAgICAgICBiZWZvcmUgPSBjdXI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgdmFyIHRleHQgPSBub2RlVGV4dChjdXIpOwogICAgICAgICAgaWYgKHRleHQubGVuZ3RoID4gcG9zaXRpb24pIHsKICAgICAgICAgICAgYmVmb3JlID0gY3VyLm5leHRTaWJsaW5nOwogICAgICAgICAgICBjb250ZW50ID0gdGV4dC5zbGljZSgwLCBwb3NpdGlvbikgKyBjb250ZW50ICsgdGV4dC5zbGljZShwb3NpdGlvbik7CiAgICAgICAgICAgIHJlbW92ZUVsZW1lbnQoY3VyKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBwb3NpdGlvbiAtPSB0ZXh0Lmxlbmd0aDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHZhciBsaW5lcyA9IGFzRWRpdG9yTGluZXMoY29udGVudCksIGRvYyA9IHRoaXMuY29udGFpbmVyLm93bmVyRG9jdW1lbnQ7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBpZiAoaSA+IDApIHRoaXMuY29udGFpbmVyLmluc2VydEJlZm9yZShkb2MuY3JlYXRlRWxlbWVudCgiQlIiKSwgYmVmb3JlKTsKICAgICAgICB0aGlzLmNvbnRhaW5lci5pbnNlcnRCZWZvcmUobWFrZVBhcnRTcGFuKGxpbmVzW2ldLCBkb2MpLCBiZWZvcmUpOwogICAgICB9CiAgICAgIHRoaXMuYWRkRGlydHlOb2RlKGxpbmUpOwogICAgICB0aGlzLnNjaGVkdWxlSGlnaGxpZ2h0KCk7CiAgICB9LAoKICAgIC8vIFJldHJpZXZlIHRoZSBzZWxlY3RlZCB0ZXh0LgogICAgc2VsZWN0ZWRUZXh0OiBmdW5jdGlvbigpIHsKICAgICAgdmFyIGggPSB0aGlzLmhpc3Rvcnk7CiAgICAgIGguY29tbWl0KCk7CgogICAgICB2YXIgc3RhcnQgPSBzZWxlY3QuY3Vyc29yUG9zKHRoaXMuY29udGFpbmVyLCB0cnVlKSwKICAgICAgICAgIGVuZCA9IHNlbGVjdC5jdXJzb3JQb3ModGhpcy5jb250YWluZXIsIGZhbHNlKTsKICAgICAgaWYgKCFzdGFydCB8fCAhZW5kKSByZXR1cm4gIiI7CgogICAgICBpZiAoc3RhcnQubm9kZSA9PSBlbmQubm9kZSkKICAgICAgICByZXR1cm4gaC50ZXh0QWZ0ZXIoc3RhcnQubm9kZSkuc2xpY2Uoc3RhcnQub2Zmc2V0LCBlbmQub2Zmc2V0KTsKCiAgICAgIHZhciB0ZXh0ID0gW2gudGV4dEFmdGVyKHN0YXJ0Lm5vZGUpLnNsaWNlKHN0YXJ0Lm9mZnNldCldOwogICAgICBmb3IgKHZhciBwb3MgPSBoLm5vZGVBZnRlcihzdGFydC5ub2RlKTsgcG9zICE9IGVuZC5ub2RlOyBwb3MgPSBoLm5vZGVBZnRlcihwb3MpKQogICAgICAgIHRleHQucHVzaChoLnRleHRBZnRlcihwb3MpKTsKICAgICAgdGV4dC5wdXNoKGgudGV4dEFmdGVyKGVuZC5ub2RlKS5zbGljZSgwLCBlbmQub2Zmc2V0KSk7CiAgICAgIHJldHVybiBjbGVhblRleHQodGV4dC5qb2luKCJcbiIpKTsKICAgIH0sCgogICAgLy8gUmVwbGFjZSB0aGUgc2VsZWN0aW9uIHdpdGggYW5vdGhlciBwaWVjZSBvZiB0ZXh0LgogICAgcmVwbGFjZVNlbGVjdGlvbjogZnVuY3Rpb24odGV4dCkgewogICAgICB0aGlzLmhpc3RvcnkuY29tbWl0KCk7CgogICAgICB2YXIgc3RhcnQgPSBzZWxlY3QuY3Vyc29yUG9zKHRoaXMuY29udGFpbmVyLCB0cnVlKSwKICAgICAgICAgIGVuZCA9IHNlbGVjdC5jdXJzb3JQb3ModGhpcy5jb250YWluZXIsIGZhbHNlKTsKICAgICAgaWYgKCFzdGFydCB8fCAhZW5kKSByZXR1cm47CgogICAgICBlbmQgPSB0aGlzLnJlcGxhY2VSYW5nZShzdGFydCwgZW5kLCB0ZXh0KTsKICAgICAgc2VsZWN0LnNldEN1cnNvclBvcyh0aGlzLmNvbnRhaW5lciwgZW5kKTsKICAgICAgd2Via2l0TGFzdExpbmVIYWNrKHRoaXMuY29udGFpbmVyKTsKICAgIH0sCgogICAgcmVyb3V0ZVBhc3RlRXZlbnQ6IGZ1bmN0aW9uKCkgewogICAgICBpZiAodGhpcy5jYXB0dXJpbmdQYXN0ZSB8fCB3aW5kb3cub3BlcmEpIHJldHVybjsKICAgICAgdGhpcy5jYXB0dXJpbmdQYXN0ZSA9IHRydWU7CiAgICAgIHZhciB0ZSA9IHdpbmRvdy5mcmFtZUVsZW1lbnQuQ29kZU1pcnJvci50ZXh0YXJlYUhhY2s7CiAgICAgIHBhcmVudC5mb2N1cygpOwogICAgICB0ZS52YWx1ZSA9ICIiOwogICAgICB0ZS5mb2N1cygpOwoKICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICB0aGlzLnBhcmVudC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgIHNlbGYuY2FwdHVyaW5nUGFzdGUgPSBmYWxzZTsKICAgICAgICBzZWxmLndpbi5mb2N1cygpOwogICAgICAgIGlmIChzZWxmLnNlbGVjdGlvblNuYXBzaG90KSAvLyBJRSBoYWNrCiAgICAgICAgICBzZWxmLndpbi5zZWxlY3Quc2V0Qm9va21hcmsoc2VsZi5jb250YWluZXIsIHNlbGYuc2VsZWN0aW9uU25hcHNob3QpOwogICAgICAgIHZhciB0ZXh0ID0gdGUudmFsdWU7CiAgICAgICAgaWYgKHRleHQpIHsKICAgICAgICAgIHNlbGYucmVwbGFjZVNlbGVjdGlvbih0ZXh0KTsKICAgICAgICAgIHNlbGVjdC5zY3JvbGxUb0N1cnNvcihzZWxmLmNvbnRhaW5lcik7CiAgICAgICAgfQogICAgICB9LCAxMCk7CiAgICB9LAoKICAgIHJlcGxhY2VSYW5nZTogZnVuY3Rpb24oZnJvbSwgdG8sIHRleHQpIHsKICAgICAgdmFyIGxpbmVzID0gYXNFZGl0b3JMaW5lcyh0ZXh0KTsKICAgICAgbGluZXNbMF0gPSB0aGlzLmhpc3RvcnkudGV4dEFmdGVyKGZyb20ubm9kZSkuc2xpY2UoMCwgZnJvbS5vZmZzZXQpICsgbGluZXNbMF07CiAgICAgIHZhciBsYXN0TGluZSA9IGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdOwogICAgICBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSA9IGxhc3RMaW5lICsgdGhpcy5oaXN0b3J5LnRleHRBZnRlcih0by5ub2RlKS5zbGljZSh0by5vZmZzZXQpOwogICAgICB2YXIgZW5kID0gdGhpcy5oaXN0b3J5Lm5vZGVBZnRlcih0by5ub2RlKTsKICAgICAgdGhpcy5oaXN0b3J5LnB1c2goZnJvbS5ub2RlLCBlbmQsIGxpbmVzKTsKICAgICAgcmV0dXJuIHtub2RlOiB0aGlzLmhpc3Rvcnkubm9kZUJlZm9yZShlbmQpLAogICAgICAgICAgICAgIG9mZnNldDogbGFzdExpbmUubGVuZ3RofTsKICAgIH0sCgogICAgZ2V0U2VhcmNoQ3Vyc29yOiBmdW5jdGlvbihzdHJpbmcsIGZyb21DdXJzb3IsIGNhc2VGb2xkKSB7CiAgICAgIHJldHVybiBuZXcgU2VhcmNoQ3Vyc29yKHRoaXMsIHN0cmluZywgZnJvbUN1cnNvciwgY2FzZUZvbGQpOwogICAgfSwKCiAgICAvLyBSZS1pbmRlbnQgdGhlIHdob2xlIGJ1ZmZlcgogICAgcmVpbmRlbnQ6IGZ1bmN0aW9uKCkgewogICAgICBpZiAodGhpcy5jb250YWluZXIuZmlyc3RDaGlsZCkKICAgICAgICB0aGlzLmluZGVudFJlZ2lvbihudWxsLCB0aGlzLmNvbnRhaW5lci5sYXN0Q2hpbGQpOwogICAgfSwKCiAgICByZWluZGVudFNlbGVjdGlvbjogZnVuY3Rpb24oZGlyZWN0aW9uKSB7CiAgICAgIGlmICghc2VsZWN0LnNvbWV0aGluZ1NlbGVjdGVkKHRoaXMud2luKSkgewogICAgICAgIHRoaXMuaW5kZW50QXRDdXJzb3IoZGlyZWN0aW9uKTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICB2YXIgc3RhcnQgPSBzZWxlY3Quc2VsZWN0aW9uVG9wTm9kZSh0aGlzLmNvbnRhaW5lciwgdHJ1ZSksCiAgICAgICAgICAgIGVuZCA9IHNlbGVjdC5zZWxlY3Rpb25Ub3BOb2RlKHRoaXMuY29udGFpbmVyLCBmYWxzZSk7CiAgICAgICAgaWYgKHN0YXJ0ID09PSBmYWxzZSB8fCBlbmQgPT09IGZhbHNlKSByZXR1cm47CiAgICAgICAgdGhpcy5pbmRlbnRSZWdpb24oc3RhcnQsIGVuZCwgZGlyZWN0aW9uKTsKICAgICAgfQogICAgfSwKCiAgICBncmFiS2V5czogZnVuY3Rpb24oZXZlbnRIYW5kbGVyLCBmaWx0ZXIpIHsKICAgICAgdGhpcy5mcm96ZW4gPSBldmVudEhhbmRsZXI7CiAgICAgIHRoaXMua2V5RmlsdGVyID0gZmlsdGVyOwogICAgfSwKICAgIHVuZ3JhYktleXM6IGZ1bmN0aW9uKCkgewogICAgICB0aGlzLmZyb3plbiA9ICJsZWF2ZSI7CiAgICB9LAoKICAgIHNldFBhcnNlcjogZnVuY3Rpb24obmFtZSwgcGFyc2VyQ29uZmlnKSB7CiAgICAgIEVkaXRvci5QYXJzZXIgPSB3aW5kb3dbbmFtZV07CiAgICAgIHBhcnNlckNvbmZpZyA9IHBhcnNlckNvbmZpZyB8fCB0aGlzLm9wdGlvbnMucGFyc2VyQ29uZmlnOwogICAgICBpZiAocGFyc2VyQ29uZmlnICYmIEVkaXRvci5QYXJzZXIuY29uZmlndXJlKQogICAgICAgIEVkaXRvci5QYXJzZXIuY29uZmlndXJlKHBhcnNlckNvbmZpZyk7CgogICAgICBpZiAodGhpcy5jb250YWluZXIuZmlyc3RDaGlsZCkgewogICAgICAgIGZvckVhY2godGhpcy5jb250YWluZXIuY2hpbGROb2RlcywgZnVuY3Rpb24obikgewogICAgICAgICAgaWYgKG4ubm9kZVR5cGUgIT0gMykgbi5kaXJ0eSA9IHRydWU7CiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5hZGREaXJ0eU5vZGUodGhpcy5maXJzdENoaWxkKTsKICAgICAgICB0aGlzLnNjaGVkdWxlSGlnaGxpZ2h0KCk7CiAgICAgIH0KICAgIH0sCgogICAgLy8gSW50ZXJjZXB0IGVudGVyIGFuZCB0YWIsIGFuZCBhc3NpZ24gdGhlaXIgbmV3IGZ1bmN0aW9ucy4KICAgIGtleURvd246IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgIGlmICh0aGlzLmZyb3plbiA9PSAibGVhdmUiKSB7dGhpcy5mcm96ZW4gPSBudWxsOyB0aGlzLmtleUZpbHRlciA9IG51bGw7fQogICAgICBpZiAodGhpcy5mcm96ZW4gJiYgKCF0aGlzLmtleUZpbHRlciB8fCB0aGlzLmtleUZpbHRlcihldmVudC5rZXlDb2RlLCBldmVudCkpKSB7CiAgICAgICAgZXZlbnQuc3RvcCgpOwogICAgICAgIHRoaXMuZnJvemVuKGV2ZW50KTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIHZhciBjb2RlID0gZXZlbnQua2V5Q29kZTsKICAgICAgLy8gRG9uJ3Qgc2NhbiB3aGVuIHRoZSB1c2VyIGlzIHR5cGluZy4KICAgICAgdGhpcy5kZWxheVNjYW5uaW5nKCk7CiAgICAgIC8vIFNjaGVkdWxlIGEgcGFyZW4taGlnaGxpZ2h0IGV2ZW50LCBpZiBjb25maWd1cmVkLgogICAgICBpZiAodGhpcy5vcHRpb25zLmF1dG9NYXRjaFBhcmVucykKICAgICAgICB0aGlzLnNjaGVkdWxlUGFyZW5IaWdobGlnaHQoKTsKCiAgICAgIC8vIFRoZSB2YXJpb3VzIGNoZWNrcyBmb3IgIWFsdEtleSBhcmUgdGhlcmUgYmVjYXVzZSBBbHRHciBzZXRzIGJvdGgKICAgICAgLy8gY3RybEtleSBhbmQgYWx0S2V5IHRvIHRydWUsIGFuZCBzaG91bGQgbm90IGJlIHJlY29nbmlzZWQgYXMKICAgICAgLy8gQ29udHJvbC4KICAgICAgaWYgKGNvZGUgPT0gMTMpIHsgLy8gZW50ZXIKICAgICAgICBpZiAoZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuYWx0S2V5KSB7CiAgICAgICAgICB0aGlzLnJlcGFyc2VCdWZmZXIoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBzZWxlY3QuaW5zZXJ0TmV3bGluZUF0Q3Vyc29yKHRoaXMud2luKTsKICAgICAgICAgIHRoaXMuaW5kZW50QXRDdXJzb3IoKTsKICAgICAgICAgIHNlbGVjdC5zY3JvbGxUb0N1cnNvcih0aGlzLmNvbnRhaW5lcik7CiAgICAgICAgfQogICAgICAgIGV2ZW50LnN0b3AoKTsKICAgICAgfQogICAgICBlbHNlIGlmIChjb2RlID09IDkgJiYgdGhpcy5vcHRpb25zLnRhYk1vZGUgIT0gImRlZmF1bHQiICYmICFldmVudC5jdHJsS2V5KSB7IC8vIHRhYgogICAgICAgIHRoaXMuaGFuZGxlVGFiKCFldmVudC5zaGlmdEtleSk7CiAgICAgICAgZXZlbnQuc3RvcCgpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGNvZGUgPT0gMzIgJiYgZXZlbnQuc2hpZnRLZXkgJiYgdGhpcy5vcHRpb25zLnRhYk1vZGUgPT0gImRlZmF1bHQiKSB7IC8vIHNwYWNlCiAgICAgICAgdGhpcy5oYW5kbGVUYWIodHJ1ZSk7CiAgICAgICAgZXZlbnQuc3RvcCgpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGNvZGUgPT0gMzYgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5jdHJsS2V5KSB7IC8vIGhvbWUKICAgICAgICBpZiAodGhpcy5ob21lKCkpIGV2ZW50LnN0b3AoKTsKICAgICAgfQogICAgICBlbHNlIGlmIChjb2RlID09IDM1ICYmICFldmVudC5zaGlmdEtleSAmJiAhZXZlbnQuY3RybEtleSkgeyAvLyBlbmQKICAgICAgICBpZiAodGhpcy5lbmQoKSkgZXZlbnQuc3RvcCgpOwogICAgICB9CiAgICAgIC8vIE9ubHkgaW4gRmlyZWZveCBpcyB0aGUgZGVmYXVsdCBiZWhhdmlvciBmb3IgUGdVcC9QZ0RuIGNvcnJlY3QuCiAgICAgIGVsc2UgaWYgKGNvZGUgPT0gMzMgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5jdHJsS2V5ICYmICFnZWNrbykgeyAvLyBQZ1VwCiAgICAgICAgaWYgKHRoaXMucGFnZVVwKCkpIGV2ZW50LnN0b3AoKTsKICAgICAgfQogICAgICBlbHNlIGlmIChjb2RlID09IDM0ICYmICFldmVudC5zaGlmdEtleSAmJiAhZXZlbnQuY3RybEtleSAmJiAhZ2Vja28pIHsgIC8vIFBnRG4KICAgICAgICBpZiAodGhpcy5wYWdlRG93bigpKSBldmVudC5zdG9wKCk7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoKGNvZGUgPT0gMjE5IHx8IGNvZGUgPT0gMjIxKSAmJiBldmVudC5jdHJsS2V5ICYmICFldmVudC5hbHRLZXkpIHsgLy8gWywgXQogICAgICAgIHRoaXMuaGlnaGxpZ2h0UGFyZW5zKGV2ZW50LnNoaWZ0S2V5LCB0cnVlKTsKICAgICAgICBldmVudC5zdG9wKCk7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoZXZlbnQubWV0YUtleSAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgKGNvZGUgPT0gMzcgfHwgY29kZSA9PSAzOSkpIHsgLy8gTWV0YS1sZWZ0L3JpZ2h0CiAgICAgICAgdmFyIGN1cnNvciA9IHNlbGVjdC5zZWxlY3Rpb25Ub3BOb2RlKHRoaXMuY29udGFpbmVyKTsKICAgICAgICBpZiAoY3Vyc29yID09PSBmYWxzZSB8fCAhdGhpcy5jb250YWluZXIuZmlyc3RDaGlsZCkgcmV0dXJuOwoKICAgICAgICBpZiAoY29kZSA9PSAzNykgc2VsZWN0LmZvY3VzQWZ0ZXJOb2RlKHN0YXJ0T2ZMaW5lKGN1cnNvciksIHRoaXMuY29udGFpbmVyKTsKICAgICAgICBlbHNlIHsKICAgICAgICAgIHZhciBlbmQgPSBlbmRPZkxpbmUoY3Vyc29yLCB0aGlzLmNvbnRhaW5lcik7CiAgICAgICAgICBzZWxlY3QuZm9jdXNBZnRlck5vZGUoZW5kID8gZW5kLnByZXZpb3VzU2libGluZyA6IHRoaXMuY29udGFpbmVyLmxhc3RDaGlsZCwgdGhpcy5jb250YWluZXIpOwogICAgICAgIH0KICAgICAgICBldmVudC5zdG9wKCk7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgJiYgIWV2ZW50LmFsdEtleSkgewogICAgICAgIGlmICgoZXZlbnQuc2hpZnRLZXkgJiYgY29kZSA9PSA5MCkgfHwgY29kZSA9PSA4OSkgeyAvLyBzaGlmdC1aLCBZCiAgICAgICAgICBzZWxlY3Quc2Nyb2xsVG9Ob2RlKHRoaXMuaGlzdG9yeS5yZWRvKCkpOwogICAgICAgICAgZXZlbnQuc3RvcCgpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChjb2RlID09IDkwIHx8IChzYWZhcmkgJiYgY29kZSA9PSA4KSkgeyAvLyBaLCBiYWNrc3BhY2UKICAgICAgICAgIHNlbGVjdC5zY3JvbGxUb05vZGUodGhpcy5oaXN0b3J5LnVuZG8oKSk7CiAgICAgICAgICBldmVudC5zdG9wKCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGNvZGUgPT0gODMgJiYgdGhpcy5vcHRpb25zLnNhdmVGdW5jdGlvbikgeyAvLyBTCiAgICAgICAgICB0aGlzLm9wdGlvbnMuc2F2ZUZ1bmN0aW9uKCk7CiAgICAgICAgICBldmVudC5zdG9wKCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGludGVybmV0RXhwbG9yZXIgJiYgY29kZSA9PSA4NikgewogICAgICAgICAgdGhpcy5yZXJvdXRlUGFzdGVFdmVudCgpOwogICAgICAgIH0KICAgICAgfQogICAgfSwKCiAgICAvLyBDaGVjayBmb3IgY2hhcmFjdGVycyB0aGF0IHNob3VsZCByZS1pbmRlbnQgdGhlIGN1cnJlbnQgbGluZSwKICAgIC8vIGFuZCBwcmV2ZW50IE9wZXJhIGZyb20gaGFuZGxpbmcgZW50ZXIgYW5kIHRhYiBhbnl3YXkuCiAgICBrZXlQcmVzczogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgdmFyIGVsZWN0cmljID0gRWRpdG9yLlBhcnNlci5lbGVjdHJpY0NoYXJzLCBzZWxmID0gdGhpczsKICAgICAgLy8gSGFjayBmb3IgT3BlcmEsIGFuZCBGaXJlZm94IG9uIE9TIFgsIGluIHdoaWNoIHN0b3BwaW5nIGEKICAgICAgLy8ga2V5ZG93biBldmVudCBkb2VzIG5vdCBwcmV2ZW50IHRoZSBhc3NvY2lhdGVkIGtleXByZXNzIGV2ZW50CiAgICAgIC8vIGZyb20gaGFwcGVuaW5nLCBzbyB3ZSBoYXZlIHRvIGNhbmNlbCBlbnRlciBhbmQgdGFiIGFnYWluCiAgICAgIC8vIGhlcmUuCiAgICAgIGlmICgodGhpcy5mcm96ZW4gJiYgKCF0aGlzLmtleUZpbHRlciB8fCB0aGlzLmtleUZpbHRlcihldmVudC5rZXlDb2RlIHx8IGV2ZW50LmNvZGUsIGV2ZW50KSkpIHx8CiAgICAgICAgICBldmVudC5jb2RlID09IDEzIHx8IChldmVudC5jb2RlID09IDkgJiYgdGhpcy5vcHRpb25zLnRhYk1vZGUgIT0gImRlZmF1bHQiKSB8fAogICAgICAgICAgKGV2ZW50LmNvZGUgPT0gMzIgJiYgZXZlbnQuc2hpZnRLZXkgJiYgdGhpcy5vcHRpb25zLnRhYk1vZGUgPT0gImRlZmF1bHQiKSkKICAgICAgICBldmVudC5zdG9wKCk7CiAgICAgIGVsc2UgaWYgKGVsZWN0cmljICYmIGVsZWN0cmljLmluZGV4T2YoZXZlbnQuY2hhcmFjdGVyKSAhPSAtMSkKICAgICAgICB0aGlzLnBhcmVudC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7c2VsZi5pbmRlbnRBdEN1cnNvcihudWxsKTt9LCAwKTsKICAgICAgZWxzZSBpZiAoKGV2ZW50LmNoYXJhY3RlciA9PSAidiIgfHwgZXZlbnQuY2hhcmFjdGVyID09ICJWIikKICAgICAgICAgICAgICAgJiYgKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgJiYgIWV2ZW50LmFsdEtleSkgLy8gY3RybC1WCiAgICAgICAgdGhpcy5yZXJvdXRlUGFzdGVFdmVudCgpOwogICAgfSwKCiAgICAvLyBNYXJrIHRoZSBub2RlIGF0IHRoZSBjdXJzb3IgZGlydHkgd2hlbiBhIG5vbi1zYWZlIGtleSBpcwogICAgLy8gcmVsZWFzZWQuCiAgICBrZXlVcDogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgdGhpcy5jdXJzb3JBY3Rpdml0eShpc1NhZmVLZXkoZXZlbnQua2V5Q29kZSkpOwogICAgfSwKCiAgICAvLyBJbmRlbnQgdGhlIGxpbmUgZm9sbG93aW5nIGEgZ2l2ZW4gPGJyPiwgb3IgbnVsbCBmb3IgdGhlIGZpcnN0CiAgICAvLyBsaW5lLiBJZiBnaXZlbiBhIDxicj4gZWxlbWVudCwgdGhpcyBtdXN0IGhhdmUgYmVlbiBoaWdobGlnaHRlZAogICAgLy8gc28gdGhhdCBpdCBoYXMgYW4gaW5kZW50YXRpb24gbWV0aG9kLiBSZXR1cm5zIHRoZSB3aGl0ZXNwYWNlCiAgICAvLyBlbGVtZW50IHRoYXQgaGFzIGJlZW4gbW9kaWZpZWQgb3IgY3JlYXRlZCAoaWYgYW55KS4KICAgIGluZGVudExpbmVBZnRlcjogZnVuY3Rpb24oc3RhcnQsIGRpcmVjdGlvbikgewogICAgICAvLyB3aGl0ZVNwYWNlIGlzIHRoZSB3aGl0ZXNwYWNlIHNwYW4gYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLAogICAgICAvLyBvciBudWxsIGlmIHRoZXJlIGlzIG5vIHN1Y2ggbm9kZS4KICAgICAgdmFyIHdoaXRlU3BhY2UgPSBzdGFydCA/IHN0YXJ0Lm5leHRTaWJsaW5nIDogdGhpcy5jb250YWluZXIuZmlyc3RDaGlsZDsKICAgICAgaWYgKHdoaXRlU3BhY2UgJiYgIWhhc0NsYXNzKHdoaXRlU3BhY2UsICJ3aGl0ZXNwYWNlIikpCiAgICAgICAgd2hpdGVTcGFjZSA9IG51bGw7CgogICAgICAvLyBTb21ldGltZXMgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lIGNhbiBpbmZsdWVuY2UgdGhlIGNvcnJlY3QKICAgICAgLy8gaW5kZW50YXRpb24sIHNvIHdlIHJldHJpZXZlIGl0LgogICAgICB2YXIgZmlyc3RUZXh0ID0gd2hpdGVTcGFjZSA/IHdoaXRlU3BhY2UubmV4dFNpYmxpbmcgOiAoc3RhcnQgPyBzdGFydC5uZXh0U2libGluZyA6IHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQpOwogICAgICB2YXIgbmV4dENoYXJzID0gKHN0YXJ0ICYmIGZpcnN0VGV4dCAmJiBmaXJzdFRleHQuY3VycmVudFRleHQpID8gZmlyc3RUZXh0LmN1cnJlbnRUZXh0IDogIiI7CgogICAgICAvLyBBc2sgdGhlIGxleGljYWwgY29udGV4dCBmb3IgdGhlIGNvcnJlY3QgaW5kZW50YXRpb24sIGFuZAogICAgICAvLyBjb21wdXRlIGhvdyBtdWNoIHRoaXMgZGlmZmVycyBmcm9tIHRoZSBjdXJyZW50IGluZGVudGF0aW9uLgogICAgICB2YXIgbmV3SW5kZW50ID0gMCwgY3VySW5kZW50ID0gd2hpdGVTcGFjZSA/IHdoaXRlU3BhY2UuY3VycmVudFRleHQubGVuZ3RoIDogMDsKICAgICAgaWYgKGRpcmVjdGlvbiAhPSBudWxsICYmIHRoaXMub3B0aW9ucy50YWJNb2RlID09ICJzaGlmdCIpCiAgICAgICAgbmV3SW5kZW50ID0gZGlyZWN0aW9uID8gY3VySW5kZW50ICsgaW5kZW50VW5pdCA6IE1hdGgubWF4KDAsIGN1ckluZGVudCAtIGluZGVudFVuaXQpCiAgICAgIGVsc2UgaWYgKHN0YXJ0KQogICAgICAgIG5ld0luZGVudCA9IHN0YXJ0LmluZGVudGF0aW9uKG5leHRDaGFycywgY3VySW5kZW50LCBkaXJlY3Rpb24pOwogICAgICBlbHNlIGlmIChFZGl0b3IuUGFyc2VyLmZpcnN0SW5kZW50YXRpb24pCiAgICAgICAgbmV3SW5kZW50ID0gRWRpdG9yLlBhcnNlci5maXJzdEluZGVudGF0aW9uKG5leHRDaGFycywgY3VySW5kZW50LCBkaXJlY3Rpb24pOwogICAgICB2YXIgaW5kZW50RGlmZiA9IG5ld0luZGVudCAtIGN1ckluZGVudDsKCiAgICAgIC8vIElmIHRoZXJlIGlzIHRvbyBtdWNoLCB0aGlzIGlzIGp1c3QgYSBtYXR0ZXIgb2Ygc2hyaW5raW5nIGEgc3Bhbi4KICAgICAgaWYgKGluZGVudERpZmYgPCAwKSB7CiAgICAgICAgaWYgKG5ld0luZGVudCA9PSAwKSB7CiAgICAgICAgICBpZiAoZmlyc3RUZXh0KSBzZWxlY3Quc25hcHNob3RNb3ZlKHdoaXRlU3BhY2UuZmlyc3RDaGlsZCwgZmlyc3RUZXh0LmZpcnN0Q2hpbGQsIDApOwogICAgICAgICAgcmVtb3ZlRWxlbWVudCh3aGl0ZVNwYWNlKTsKICAgICAgICAgIHdoaXRlU3BhY2UgPSBudWxsOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIHNlbGVjdC5zbmFwc2hvdE1vdmUod2hpdGVTcGFjZS5maXJzdENoaWxkLCB3aGl0ZVNwYWNlLmZpcnN0Q2hpbGQsIGluZGVudERpZmYsIHRydWUpOwogICAgICAgICAgd2hpdGVTcGFjZS5jdXJyZW50VGV4dCA9IG1ha2VXaGl0ZVNwYWNlKG5ld0luZGVudCk7CiAgICAgICAgICB3aGl0ZVNwYWNlLmZpcnN0Q2hpbGQubm9kZVZhbHVlID0gd2hpdGVTcGFjZS5jdXJyZW50VGV4dDsKICAgICAgICB9CiAgICAgIH0KICAgICAgLy8gTm90IGVub3VnaC4uLgogICAgICBlbHNlIGlmIChpbmRlbnREaWZmID4gMCkgewogICAgICAgIC8vIElmIHRoZXJlIGlzIHdoaXRlc3BhY2UsIHdlIGdyb3cgaXQuCiAgICAgICAgaWYgKHdoaXRlU3BhY2UpIHsKICAgICAgICAgIHdoaXRlU3BhY2UuY3VycmVudFRleHQgPSBtYWtlV2hpdGVTcGFjZShuZXdJbmRlbnQpOwogICAgICAgICAgd2hpdGVTcGFjZS5maXJzdENoaWxkLm5vZGVWYWx1ZSA9IHdoaXRlU3BhY2UuY3VycmVudFRleHQ7CiAgICAgICAgICBzZWxlY3Quc25hcHNob3RNb3ZlKHdoaXRlU3BhY2UuZmlyc3RDaGlsZCwgd2hpdGVTcGFjZS5maXJzdENoaWxkLCBpbmRlbnREaWZmLCB0cnVlKTsKICAgICAgICB9CiAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSBoYXZlIHRvIGFkZCBhIG5ldyB3aGl0ZXNwYWNlIG5vZGUuCiAgICAgICAgZWxzZSB7CiAgICAgICAgICB3aGl0ZVNwYWNlID0gbWFrZVBhcnRTcGFuKG1ha2VXaGl0ZVNwYWNlKG5ld0luZGVudCksIHRoaXMuZG9jKTsKICAgICAgICAgIHdoaXRlU3BhY2UuY2xhc3NOYW1lID0gIndoaXRlc3BhY2UiOwogICAgICAgICAgaWYgKHN0YXJ0KSBpbnNlcnRBZnRlcih3aGl0ZVNwYWNlLCBzdGFydCk7CiAgICAgICAgICBlbHNlIHRoaXMuY29udGFpbmVyLmluc2VydEJlZm9yZSh3aGl0ZVNwYWNlLCB0aGlzLmNvbnRhaW5lci5maXJzdENoaWxkKTsKICAgICAgICAgIHNlbGVjdC5zbmFwc2hvdE1vdmUoZmlyc3RUZXh0ICYmIChmaXJzdFRleHQuZmlyc3RDaGlsZCB8fCBmaXJzdFRleHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGl0ZVNwYWNlLmZpcnN0Q2hpbGQsIG5ld0luZGVudCwgZmFsc2UsIHRydWUpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoaW5kZW50RGlmZiAhPSAwKSB0aGlzLmFkZERpcnR5Tm9kZShzdGFydCk7CiAgICB9LAoKICAgIC8vIFJlLWhpZ2hsaWdodCB0aGUgc2VsZWN0ZWQgcGFydCBvZiB0aGUgZG9jdW1lbnQuCiAgICBoaWdobGlnaHRBdEN1cnNvcjogZnVuY3Rpb24oKSB7CiAgICAgIHZhciBwb3MgPSBzZWxlY3Quc2VsZWN0aW9uVG9wTm9kZSh0aGlzLmNvbnRhaW5lciwgdHJ1ZSk7CiAgICAgIHZhciB0byA9IHNlbGVjdC5zZWxlY3Rpb25Ub3BOb2RlKHRoaXMuY29udGFpbmVyLCBmYWxzZSk7CiAgICAgIGlmIChwb3MgPT09IGZhbHNlIHx8IHRvID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlOwoKICAgICAgc2VsZWN0Lm1hcmtTZWxlY3Rpb24odGhpcy53aW4pOwogICAgICBpZiAodGhpcy5oaWdobGlnaHQocG9zLCBlbmRPZkxpbmUodG8sIHRoaXMuY29udGFpbmVyKSwgdHJ1ZSwgMjApID09PSBmYWxzZSkKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIHNlbGVjdC5zZWxlY3RNYXJrZWQoKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9LAoKICAgIC8vIFdoZW4gdGFiIGlzIHByZXNzZWQgd2l0aCB0ZXh0IHNlbGVjdGVkLCB0aGUgd2hvbGUgc2VsZWN0aW9uIGlzCiAgICAvLyByZS1pbmRlbnRlZCwgd2hlbiBub3RoaW5nIGlzIHNlbGVjdGVkLCB0aGUgbGluZSB3aXRoIHRoZSBjdXJzb3IKICAgIC8vIGlzIHJlLWluZGVudGVkLgogICAgaGFuZGxlVGFiOiBmdW5jdGlvbihkaXJlY3Rpb24pIHsKICAgICAgaWYgKHRoaXMub3B0aW9ucy50YWJNb2RlID09ICJzcGFjZXMiKQogICAgICAgIHNlbGVjdC5pbnNlcnRUYWJBdEN1cnNvcih0aGlzLndpbik7CiAgICAgIGVsc2UKICAgICAgICB0aGlzLnJlaW5kZW50U2VsZWN0aW9uKGRpcmVjdGlvbik7CiAgICB9LAoKICAgIC8vIEN1c3RvbSBob21lIGJlaGF2aW91ciB0aGF0IGRvZXNuJ3QgbGFuZCB0aGUgY3Vyc29yIGluIGZyb250IG9mCiAgICAvLyBsZWFkaW5nIHdoaXRlc3BhY2UgdW5sZXNzIHByZXNzZWQgdHdpY2UuCiAgICBob21lOiBmdW5jdGlvbigpIHsKICAgICAgdmFyIGN1ciA9IHNlbGVjdC5zZWxlY3Rpb25Ub3BOb2RlKHRoaXMuY29udGFpbmVyLCB0cnVlKSwgc3RhcnQgPSBjdXI7CiAgICAgIGlmIChjdXIgPT09IGZhbHNlIHx8ICEoIWN1ciB8fCBjdXIuaXNQYXJ0IHx8IGlzQlIoY3VyKSkgfHwgIXRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQpCiAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgICAgd2hpbGUgKGN1ciAmJiAhaXNCUihjdXIpKSBjdXIgPSBjdXIucHJldmlvdXNTaWJsaW5nOwogICAgICB2YXIgbmV4dCA9IGN1ciA/IGN1ci5uZXh0U2libGluZyA6IHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQ7CiAgICAgIGlmIChuZXh0ICYmIG5leHQgIT0gc3RhcnQgJiYgbmV4dC5pc1BhcnQgJiYgaGFzQ2xhc3MobmV4dCwgIndoaXRlc3BhY2UiKSkKICAgICAgICBzZWxlY3QuZm9jdXNBZnRlck5vZGUobmV4dCwgdGhpcy5jb250YWluZXIpOwogICAgICBlbHNlCiAgICAgICAgc2VsZWN0LmZvY3VzQWZ0ZXJOb2RlKGN1ciwgdGhpcy5jb250YWluZXIpOwoKICAgICAgc2VsZWN0LnNjcm9sbFRvQ3Vyc29yKHRoaXMuY29udGFpbmVyKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9LAoKICAgIC8vIFNvbWUgYnJvd3NlcnMgKE9wZXJhKSBkb24ndCBtYW5hZ2UgdG8gaGFuZGxlIHRoZSBlbmQga2V5CiAgICAvLyBwcm9wZXJseSBpbiB0aGUgZmFjZSBvZiB2ZXJ0aWNhbCBzY3JvbGxpbmcuCiAgICBlbmQ6IGZ1bmN0aW9uKCkgewogICAgICB2YXIgY3VyID0gc2VsZWN0LnNlbGVjdGlvblRvcE5vZGUodGhpcy5jb250YWluZXIsIHRydWUpOwogICAgICBpZiAoY3VyID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlOwogICAgICBjdXIgPSBlbmRPZkxpbmUoY3VyLCB0aGlzLmNvbnRhaW5lcik7CiAgICAgIGlmICghY3VyKSByZXR1cm4gZmFsc2U7CiAgICAgIHNlbGVjdC5mb2N1c0FmdGVyTm9kZShjdXIucHJldmlvdXNTaWJsaW5nLCB0aGlzLmNvbnRhaW5lcik7CiAgICAgIHNlbGVjdC5zY3JvbGxUb0N1cnNvcih0aGlzLmNvbnRhaW5lcik7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSwKCiAgICBwYWdlVXA6IGZ1bmN0aW9uKCkgewogICAgICB2YXIgbGluZSA9IHRoaXMuY3Vyc29yUG9zaXRpb24oKS5saW5lLCBzY3JvbGxBbW91bnQgPSB0aGlzLnZpc2libGVMaW5lQ291bnQoKTsKICAgICAgaWYgKGxpbmUgPT09IGZhbHNlIHx8IHNjcm9sbEFtb3VudCA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTsKICAgICAgLy8gVHJ5IHRvIGtlZXAgb25lIGxpbmUgb24gdGhlIHNjcmVlbi4KICAgICAgc2Nyb2xsQW1vdW50IC09IDI7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2Nyb2xsQW1vdW50OyBpKyspIHsKICAgICAgICBsaW5lID0gdGhpcy5wcmV2TGluZShsaW5lKTsKICAgICAgICBpZiAobGluZSA9PT0gZmFsc2UpIGJyZWFrOwogICAgICB9CiAgICAgIGlmIChpID09IDApIHJldHVybiBmYWxzZTsgLy8gQWxyZWFkeSBhdCBmaXJzdCBsaW5lCiAgICAgIHNlbGVjdC5zZXRDdXJzb3JQb3ModGhpcy5jb250YWluZXIsIHtub2RlOiBsaW5lLCBvZmZzZXQ6IDB9KTsKICAgICAgc2VsZWN0LnNjcm9sbFRvQ3Vyc29yKHRoaXMuY29udGFpbmVyKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9LAoKICAgIHBhZ2VEb3duOiBmdW5jdGlvbigpIHsKICAgICAgdmFyIGxpbmUgPSB0aGlzLmN1cnNvclBvc2l0aW9uKCkubGluZSwgc2Nyb2xsQW1vdW50ID0gdGhpcy52aXNpYmxlTGluZUNvdW50KCk7CiAgICAgIGlmIChsaW5lID09PSBmYWxzZSB8fCBzY3JvbGxBbW91bnQgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7CiAgICAgIC8vIFRyeSB0byBtb3ZlIHRvIHRoZSBsYXN0IGxpbmUgb2YgdGhlIGN1cnJlbnQgcGFnZS4KICAgICAgc2Nyb2xsQW1vdW50IC09IDI7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2Nyb2xsQW1vdW50OyBpKyspIHsKICAgICAgICB2YXIgbmV4dExpbmUgPSB0aGlzLm5leHRMaW5lKGxpbmUpOwogICAgICAgIGlmIChuZXh0TGluZSA9PT0gZmFsc2UpIGJyZWFrOwogICAgICAgIGxpbmUgPSBuZXh0TGluZTsKICAgICAgfQogICAgICBpZiAoaSA9PSAwKSByZXR1cm4gZmFsc2U7IC8vIEFscmVhZHkgYXQgbGFzdCBsaW5lCiAgICAgIHNlbGVjdC5zZXRDdXJzb3JQb3ModGhpcy5jb250YWluZXIsIHtub2RlOiBsaW5lLCBvZmZzZXQ6IDB9KTsKICAgICAgc2VsZWN0LnNjcm9sbFRvQ3Vyc29yKHRoaXMuY29udGFpbmVyKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9LAoKICAgIC8vIERlbGF5IChvciBpbml0aWF0ZSkgdGhlIG5leHQgcGFyZW4gaGlnaGxpZ2h0IGV2ZW50LgogICAgc2NoZWR1bGVQYXJlbkhpZ2hsaWdodDogZnVuY3Rpb24oKSB7CiAgICAgIGlmICh0aGlzLnBhcmVuRXZlbnQpIHRoaXMucGFyZW50LmNsZWFyVGltZW91dCh0aGlzLnBhcmVuRXZlbnQpOwogICAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICAgIHRoaXMucGFyZW5FdmVudCA9IHRoaXMucGFyZW50LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtzZWxmLmhpZ2hsaWdodFBhcmVucygpO30sIDMwMCk7CiAgICB9LAoKICAgIC8vIFRha2UgdGhlIHRva2VuIGJlZm9yZSB0aGUgY3Vyc29yLiBJZiBpdCBjb250YWlucyBhIGNoYXJhY3RlciBpbgogICAgLy8gJygpW117fScsIHNlYXJjaCBmb3IgdGhlIG1hdGNoaW5nIHBhcmVuL2JyYWNlL2JyYWNrZXQsIGFuZAogICAgLy8gaGlnaGxpZ2h0IHRoZW0gaW4gZ3JlZW4gZm9yIGEgbW9tZW50LCBvciByZWQgaWYgbm8gcHJvcGVyIG1hdGNoCiAgICAvLyB3YXMgZm91bmQuCiAgICBoaWdobGlnaHRQYXJlbnM6IGZ1bmN0aW9uKGp1bXAsIGZyb21LZXkpIHsKICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICAvLyBnaXZlIHRoZSByZWxldmFudCBub2RlcyBhIGNvbG91ci4KICAgICAgZnVuY3Rpb24gaGlnaGxpZ2h0KG5vZGUsIG9rKSB7CiAgICAgICAgaWYgKCFub2RlKSByZXR1cm47CiAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5tYXJrUGFyZW4pIHsKICAgICAgICAgIHNlbGYub3B0aW9ucy5tYXJrUGFyZW4obm9kZSwgb2spOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIG5vZGUuc3R5bGUuZm9udFdlaWdodCA9ICJib2xkIjsKICAgICAgICAgIG5vZGUuc3R5bGUuY29sb3IgPSBvayA/ICIjOEY4IiA6ICIjRjg4IjsKICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24gdW5oaWdobGlnaHQobm9kZSkgewogICAgICAgIGlmICghbm9kZSkgcmV0dXJuOwogICAgICAgIGlmIChzZWxmLm9wdGlvbnMudW5tYXJrUGFyZW4pIHsKICAgICAgICAgIHNlbGYub3B0aW9ucy51bm1hcmtQYXJlbihub2RlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBub2RlLnN0eWxlLmZvbnRXZWlnaHQgPSAiIjsKICAgICAgICAgIG5vZGUuc3R5bGUuY29sb3IgPSAiIjsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCFmcm9tS2V5ICYmIHNlbGYuaGlnaGxpZ2h0ZWQpIHsKICAgICAgICB1bmhpZ2hsaWdodChzZWxmLmhpZ2hsaWdodGVkWzBdKTsKICAgICAgICB1bmhpZ2hsaWdodChzZWxmLmhpZ2hsaWdodGVkWzFdKTsKICAgICAgfQoKICAgICAgaWYgKCF3aW5kb3cuc2VsZWN0KSByZXR1cm47CiAgICAgIC8vIENsZWFyIHRoZSBldmVudCBwcm9wZXJ0eS4KICAgICAgaWYgKHRoaXMucGFyZW5FdmVudCkgdGhpcy5wYXJlbnQuY2xlYXJUaW1lb3V0KHRoaXMucGFyZW5FdmVudCk7CiAgICAgIHRoaXMucGFyZW5FdmVudCA9IG51bGw7CgogICAgICAvLyBFeHRyYWN0IGEgJ3BhcmVuJyBmcm9tIGEgcGllY2Ugb2YgdGV4dC4KICAgICAgZnVuY3Rpb24gcGFyZW4obm9kZSkgewogICAgICAgIGlmIChub2RlLmN1cnJlbnRUZXh0KSB7CiAgICAgICAgICB2YXIgbWF0Y2ggPSBub2RlLmN1cnJlbnRUZXh0Lm1hdGNoKC9eW1xzXHUwMGEwXSooW1woXClcW1xde31dKVtcc1x1MDBhMF0qJC8pOwogICAgICAgICAgcmV0dXJuIG1hdGNoICYmIG1hdGNoWzFdOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBEZXRlcm1pbmUgdGhlIGRpcmVjdGlvbiBhIHBhcmVuIGlzIGZhY2luZy4KICAgICAgZnVuY3Rpb24gZm9yd2FyZChjaCkgewogICAgICAgIHJldHVybiAvW1woXFtce10vLnRlc3QoY2gpOwogICAgICB9CgogICAgICB2YXIgY2gsIGN1cnNvciA9IHNlbGVjdC5zZWxlY3Rpb25Ub3BOb2RlKHRoaXMuY29udGFpbmVyLCB0cnVlKTsKICAgICAgaWYgKCFjdXJzb3IgfHwgIXRoaXMuaGlnaGxpZ2h0QXRDdXJzb3IoKSkgcmV0dXJuOwogICAgICBjdXJzb3IgPSBzZWxlY3Quc2VsZWN0aW9uVG9wTm9kZSh0aGlzLmNvbnRhaW5lciwgdHJ1ZSk7CiAgICAgIGlmICghKGN1cnNvciAmJiAoKGNoID0gcGFyZW4oY3Vyc29yKSkgfHwgKGN1cnNvciA9IGN1cnNvci5uZXh0U2libGluZykgJiYgKGNoID0gcGFyZW4oY3Vyc29yKSkpKSkKICAgICAgICByZXR1cm47CiAgICAgIC8vIFdlIG9ubHkgbG9vayBmb3IgdG9rZW5zIHdpdGggdGhlIHNhbWUgY2xhc3NOYW1lLgogICAgICB2YXIgY2xhc3NOYW1lID0gY3Vyc29yLmNsYXNzTmFtZSwgZGlyID0gZm9yd2FyZChjaCksIG1hdGNoID0gbWF0Y2hpbmdbY2hdOwoKICAgICAgLy8gU2luY2UgcGFydHMgb2YgdGhlIGRvY3VtZW50IG1pZ2h0IG5vdCBoYXZlIGJlZW4gcHJvcGVybHkKICAgICAgLy8gaGlnaGxpZ2h0ZWQsIGFuZCBpdCBpcyBoYXJkIHRvIGtub3cgaW4gYWR2YW5jZSB3aGljaCBwYXJ0IHdlCiAgICAgIC8vIGhhdmUgdG8gc2Nhbiwgd2UganVzdCB0cnksIGFuZCB3aGVuIHdlIGZpbmQgZGlydHkgbm9kZXMgd2UKICAgICAgLy8gYWJvcnQsIHBhcnNlIHRoZW0sIGFuZCByZS10cnkuCiAgICAgIGZ1bmN0aW9uIHRyeUZpbmRNYXRjaCgpIHsKICAgICAgICB2YXIgc3RhY2sgPSBbXSwgY2gsIG9rID0gdHJ1ZTsKICAgICAgICBmb3IgKHZhciBydW5uZXIgPSBjdXJzb3I7IHJ1bm5lcjsgcnVubmVyID0gZGlyID8gcnVubmVyLm5leHRTaWJsaW5nIDogcnVubmVyLnByZXZpb3VzU2libGluZykgewogICAgICAgICAgaWYgKHJ1bm5lci5jbGFzc05hbWUgPT0gY2xhc3NOYW1lICYmIGlzU3BhbihydW5uZXIpICYmIChjaCA9IHBhcmVuKHJ1bm5lcikpKSB7CiAgICAgICAgICAgIGlmIChmb3J3YXJkKGNoKSA9PSBkaXIpCiAgICAgICAgICAgICAgc3RhY2sucHVzaChjaCk7CiAgICAgICAgICAgIGVsc2UgaWYgKCFzdGFjay5sZW5ndGgpCiAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKICAgICAgICAgICAgZWxzZSBpZiAoc3RhY2sucG9wKCkgIT0gbWF0Y2hpbmdbY2hdKQogICAgICAgICAgICAgIG9rID0gZmFsc2U7CiAgICAgICAgICAgIGlmICghc3RhY2subGVuZ3RoKSBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgaWYgKHJ1bm5lci5kaXJ0eSB8fCAhaXNTcGFuKHJ1bm5lcikgJiYgIWlzQlIocnVubmVyKSkgewogICAgICAgICAgICByZXR1cm4ge25vZGU6IHJ1bm5lciwgc3RhdHVzOiAiZGlydHkifTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHtub2RlOiBydW5uZXIsIHN0YXR1czogcnVubmVyICYmIG9rfTsKICAgICAgfQoKICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICB2YXIgZm91bmQgPSB0cnlGaW5kTWF0Y2goKTsKICAgICAgICBpZiAoZm91bmQuc3RhdHVzID09ICJkaXJ0eSIpIHsKICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0KGZvdW5kLm5vZGUsIGVuZE9mTGluZShmb3VuZC5ub2RlKSk7CiAgICAgICAgICAvLyBOZWVkZWQgYmVjYXVzZSBpbiBzb21lIGNvcm5lciBjYXNlcyBhIGhpZ2hsaWdodCBkb2VzIG5vdAogICAgICAgICAgLy8gcmVhY2ggYSBub2RlLgogICAgICAgICAgZm91bmQubm9kZS5kaXJ0eSA9IGZhbHNlOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgaGlnaGxpZ2h0KGN1cnNvciwgZm91bmQuc3RhdHVzKTsKICAgICAgICAgIGhpZ2hsaWdodChmb3VuZC5ub2RlLCBmb3VuZC5zdGF0dXMpOwogICAgICAgICAgaWYgKGZyb21LZXkpCiAgICAgICAgICAgIHNlbGYucGFyZW50LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7dW5oaWdobGlnaHQoY3Vyc29yKTsgdW5oaWdobGlnaHQoZm91bmQubm9kZSk7fSwgNTAwKTsKICAgICAgICAgIGVsc2UKICAgICAgICAgICAgc2VsZi5oaWdobGlnaHRlZCA9IFtjdXJzb3IsIGZvdW5kLm5vZGVdOwogICAgICAgICAgaWYgKGp1bXAgJiYgZm91bmQubm9kZSkKICAgICAgICAgICAgc2VsZWN0LmZvY3VzQWZ0ZXJOb2RlKGZvdW5kLm5vZGUucHJldmlvdXNTaWJsaW5nLCB0aGlzLmNvbnRhaW5lcik7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgIH0sCgogICAgLy8gQWRqdXN0IHRoZSBhbW91bnQgb2Ygd2hpdGVzcGFjZSBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUgdGhhdAogICAgLy8gdGhlIGN1cnNvciBpcyBvbiBzbyB0aGF0IGl0IGlzIGluZGVudGVkIHByb3Blcmx5LgogICAgaW5kZW50QXRDdXJzb3I6IGZ1bmN0aW9uKGRpcmVjdGlvbikgewogICAgICBpZiAoIXRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQpIHJldHVybjsKICAgICAgLy8gVGhlIGxpbmUgaGFzIHRvIGhhdmUgdXAtdG8tZGF0ZSBsZXhpY2FsIGluZm9ybWF0aW9uLCBzbyB3ZQogICAgICAvLyBoaWdobGlnaHQgaXQgZmlyc3QuCiAgICAgIGlmICghdGhpcy5oaWdobGlnaHRBdEN1cnNvcigpKSByZXR1cm47CiAgICAgIHZhciBjdXJzb3IgPSBzZWxlY3Quc2VsZWN0aW9uVG9wTm9kZSh0aGlzLmNvbnRhaW5lciwgZmFsc2UpOwogICAgICAvLyBJZiB3ZSBjb3VsZG4ndCBkZXRlcm1pbmUgdGhlIHBsYWNlIG9mIHRoZSBjdXJzb3IsCiAgICAgIC8vIHRoZXJlJ3Mgbm90aGluZyB0byBpbmRlbnQuCiAgICAgIGlmIChjdXJzb3IgPT09IGZhbHNlKQogICAgICAgIHJldHVybjsKICAgICAgc2VsZWN0Lm1hcmtTZWxlY3Rpb24odGhpcy53aW4pOwogICAgICB0aGlzLmluZGVudExpbmVBZnRlcihzdGFydE9mTGluZShjdXJzb3IpLCBkaXJlY3Rpb24pOwogICAgICBzZWxlY3Quc2VsZWN0TWFya2VkKCk7CiAgICB9LAoKICAgIC8vIEluZGVudCBhbGwgbGluZXMgd2hvc2Ugc3RhcnQgZmFsbHMgaW5zaWRlIG9mIHRoZSBjdXJyZW50CiAgICAvLyBzZWxlY3Rpb24uCiAgICBpbmRlbnRSZWdpb246IGZ1bmN0aW9uKHN0YXJ0LCBlbmQsIGRpcmVjdGlvbikgewogICAgICB2YXIgY3VycmVudCA9IChzdGFydCA9IHN0YXJ0T2ZMaW5lKHN0YXJ0KSksIGJlZm9yZSA9IHN0YXJ0ICYmIHN0YXJ0T2ZMaW5lKHN0YXJ0LnByZXZpb3VzU2libGluZyk7CiAgICAgIGlmICghaXNCUihlbmQpKSBlbmQgPSBlbmRPZkxpbmUoZW5kLCB0aGlzLmNvbnRhaW5lcik7CiAgICAgIHRoaXMuYWRkRGlydHlOb2RlKHN0YXJ0KTsKCiAgICAgIGRvIHsKICAgICAgICB2YXIgbmV4dCA9IGVuZE9mTGluZShjdXJyZW50LCB0aGlzLmNvbnRhaW5lcik7CiAgICAgICAgaWYgKGN1cnJlbnQpIHRoaXMuaGlnaGxpZ2h0KGJlZm9yZSwgbmV4dCwgdHJ1ZSk7CiAgICAgICAgdGhpcy5pbmRlbnRMaW5lQWZ0ZXIoY3VycmVudCwgZGlyZWN0aW9uKTsKICAgICAgICBiZWZvcmUgPSBjdXJyZW50OwogICAgICAgIGN1cnJlbnQgPSBuZXh0OwogICAgICB9IHdoaWxlIChjdXJyZW50ICE9IGVuZCk7CiAgICAgIHNlbGVjdC5zZXRDdXJzb3JQb3ModGhpcy5jb250YWluZXIsIHtub2RlOiBzdGFydCwgb2Zmc2V0OiAwfSwge25vZGU6IGVuZCwgb2Zmc2V0OiAwfSk7CiAgICB9LAoKICAgIC8vIEZpbmQgdGhlIG5vZGUgdGhhdCB0aGUgY3Vyc29yIGlzIGluLCBtYXJrIGl0IGFzIGRpcnR5LCBhbmQgbWFrZQogICAgLy8gc3VyZSBhIGhpZ2hsaWdodCBwYXNzIGlzIHNjaGVkdWxlZC4KICAgIGN1cnNvckFjdGl2aXR5OiBmdW5jdGlvbihzYWZlKSB7CiAgICAgIC8vIHBhZ2VoaWRlIGV2ZW50IGhhY2sgYWJvdmUKICAgICAgaWYgKHRoaXMudW5sb2FkZWQpIHsKICAgICAgICB0aGlzLndpbi5kb2N1bWVudC5kZXNpZ25Nb2RlID0gIm9mZiI7CiAgICAgICAgdGhpcy53aW4uZG9jdW1lbnQuZGVzaWduTW9kZSA9ICJvbiI7CiAgICAgICAgdGhpcy51bmxvYWRlZCA9IGZhbHNlOwogICAgICB9CgogICAgICBpZiAoaW50ZXJuZXRFeHBsb3JlcikgewogICAgICAgIHRoaXMuY29udGFpbmVyLmNyZWF0ZVRleHRSYW5nZSgpLmV4ZWNDb21tYW5kKCJ1bmxpbmsiKTsKICAgICAgICB0aGlzLnNlbGVjdGlvblNuYXBzaG90ID0gc2VsZWN0LmdldEJvb2ttYXJrKHRoaXMuY29udGFpbmVyKTsKICAgICAgfQoKICAgICAgdmFyIGFjdGl2aXR5ID0gdGhpcy5vcHRpb25zLmN1cnNvckFjdGl2aXR5OwogICAgICBpZiAoIXNhZmUgfHwgYWN0aXZpdHkpIHsKICAgICAgICB2YXIgY3Vyc29yID0gc2VsZWN0LnNlbGVjdGlvblRvcE5vZGUodGhpcy5jb250YWluZXIsIGZhbHNlKTsKICAgICAgICBpZiAoY3Vyc29yID09PSBmYWxzZSB8fCAhdGhpcy5jb250YWluZXIuZmlyc3RDaGlsZCkgcmV0dXJuOwogICAgICAgIGN1cnNvciA9IGN1cnNvciB8fCB0aGlzLmNvbnRhaW5lci5maXJzdENoaWxkOwogICAgICAgIGlmIChhY3Rpdml0eSkgYWN0aXZpdHkoY3Vyc29yKTsKICAgICAgICBpZiAoIXNhZmUpIHsKICAgICAgICAgIHRoaXMuc2NoZWR1bGVIaWdobGlnaHQoKTsKICAgICAgICAgIHRoaXMuYWRkRGlydHlOb2RlKGN1cnNvcik7CiAgICAgICAgfQogICAgICB9CiAgICB9LAoKICAgIHJlcGFyc2VCdWZmZXI6IGZ1bmN0aW9uKCkgewogICAgICBmb3JFYWNoKHRoaXMuY29udGFpbmVyLmNoaWxkTm9kZXMsIGZ1bmN0aW9uKG5vZGUpIHtub2RlLmRpcnR5ID0gdHJ1ZTt9KTsKICAgICAgaWYgKHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQpCiAgICAgICAgdGhpcy5hZGREaXJ0eU5vZGUodGhpcy5jb250YWluZXIuZmlyc3RDaGlsZCk7CiAgICB9LAoKICAgIC8vIEFkZCBhIG5vZGUgdG8gdGhlIHNldCBvZiBkaXJ0eSBub2RlcywgaWYgaXQgaXNuJ3QgYWxyZWFkeSBpbgogICAgLy8gdGhlcmUuCiAgICBhZGREaXJ0eU5vZGU6IGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgbm9kZSA9IG5vZGUgfHwgdGhpcy5jb250YWluZXIuZmlyc3RDaGlsZDsKICAgICAgaWYgKCFub2RlKSByZXR1cm47CgogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGlydHkubGVuZ3RoOyBpKyspCiAgICAgICAgaWYgKHRoaXMuZGlydHlbaV0gPT0gbm9kZSkgcmV0dXJuOwoKICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT0gMykKICAgICAgICBub2RlLmRpcnR5ID0gdHJ1ZTsKICAgICAgdGhpcy5kaXJ0eS5wdXNoKG5vZGUpOwogICAgfSwKCiAgICBhbGxDbGVhbjogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiAhdGhpcy5kaXJ0eS5sZW5ndGg7CiAgICB9LAoKICAgIC8vIENhdXNlIGEgaGlnaGxpZ2h0IHBhc3MgdG8gaGFwcGVuIGluIG9wdGlvbnMucGFzc0RlbGF5CiAgICAvLyBtaWxsaXNlY29uZHMuIENsZWFyIHRoZSBleGlzdGluZyB0aW1lb3V0LCBpZiBvbmUgZXhpc3RzLiBUaGlzCiAgICAvLyB3YXksIHRoZSBwYXNzZXMgZG8gbm90IGhhcHBlbiB3aGlsZSB0aGUgdXNlciBpcyB0eXBpbmcsIGFuZAogICAgLy8gc2hvdWxkIGFzIHVub2J0cnVzaXZlIGFzIHBvc3NpYmxlLgogICAgc2NoZWR1bGVIaWdobGlnaHQ6IGZ1bmN0aW9uKCkgewogICAgICAvLyBUaW1lb3V0cyBhcmUgcm91dGVkIHRocm91Z2ggdGhlIHBhcmVudCB3aW5kb3csIGJlY2F1c2Ugb24KICAgICAgLy8gc29tZSBicm93c2VycyBkZXNpZ25Nb2RlIHdpbmRvd3MgZG8gbm90IGZpcmUgdGltZW91dHMuCiAgICAgIHZhciBzZWxmID0gdGhpczsKICAgICAgdGhpcy5wYXJlbnQuY2xlYXJUaW1lb3V0KHRoaXMuaGlnaGxpZ2h0VGltZW91dCk7CiAgICAgIHRoaXMuaGlnaGxpZ2h0VGltZW91dCA9IHRoaXMucGFyZW50LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtzZWxmLmhpZ2hsaWdodERpcnR5KCk7fSwgdGhpcy5vcHRpb25zLnBhc3NEZWxheSk7CiAgICB9LAoKICAgIC8vIEZldGNoIG9uZSBkaXJ0eSBub2RlLCBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGRpcnR5IHNldC4KICAgIGdldERpcnR5Tm9kZTogZnVuY3Rpb24oKSB7CiAgICAgIHdoaWxlICh0aGlzLmRpcnR5Lmxlbmd0aCA+IDApIHsKICAgICAgICB2YXIgZm91bmQgPSB0aGlzLmRpcnR5LnBvcCgpOwogICAgICAgIC8vIElFOCBzb21ldGltZXMgdGhyb3dzIGFuIHVuZXhwbGFpbmFibGUgJ2ludmFsaWQgYXJndW1lbnQnCiAgICAgICAgLy8gZXhjZXB0aW9uIGZvciBmb3VuZC5wYXJlbnROb2RlCiAgICAgICAgdHJ5IHsKICAgICAgICAgIC8vIElmIHRoZSBub2RlIGhhcyBiZWVuIGNvbG91cmVkIGluIHRoZSBtZWFudGltZSwgb3IgaXMgbm8KICAgICAgICAgIC8vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQsIGl0IHNob3VsZCBub3QgYmUgcmV0dXJuZWQuCiAgICAgICAgICB3aGlsZSAoZm91bmQgJiYgZm91bmQucGFyZW50Tm9kZSAhPSB0aGlzLmNvbnRhaW5lcikKICAgICAgICAgICAgZm91bmQgPSBmb3VuZC5wYXJlbnROb2RlOwogICAgICAgICAgaWYgKGZvdW5kICYmIChmb3VuZC5kaXJ0eSB8fCBmb3VuZC5ub2RlVHlwZSA9PSAzKSkKICAgICAgICAgICAgcmV0dXJuIGZvdW5kOwogICAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9LAoKICAgIC8vIFBpY2sgZGlydHkgbm9kZXMsIGFuZCBoaWdobGlnaHQgdGhlbSwgdW50aWwgb3B0aW9ucy5wYXNzVGltZQogICAgLy8gbWlsbGlzZWNvbmRzIGhhdmUgZ29uZSBieS4gVGhlIGhpZ2hsaWdodCBtZXRob2Qgd2lsbCBjb250aW51ZQogICAgLy8gdG8gbmV4dCBsaW5lcyBhcyBsb25nIGFzIGl0IGZpbmRzIGRpcnR5IG5vZGVzLiBJdCByZXR1cm5zCiAgICAvLyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGxhY2Ugd2hlcmUgaXQgc3RvcHBlZC4gSWYgdGhlcmUgYXJlCiAgICAvLyBkaXJ0eSBub2RlcyBsZWZ0IGFmdGVyIHRoaXMgZnVuY3Rpb24gaGFzIHNwZW50IGFsbCBpdHMgbGluZXMsCiAgICAvLyBpdCBzaGVkdWxlcyBhbm90aGVyIGhpZ2hsaWdodCB0byBmaW5pc2ggdGhlIGpvYi4KICAgIGhpZ2hsaWdodERpcnR5OiBmdW5jdGlvbihmb3JjZSkgewogICAgICAvLyBQcmV2ZW50IEZGIGZyb20gcmFpc2luZyBhbiBlcnJvciB3aGVuIGl0IGlzIGZpcmluZyB0aW1lb3V0cwogICAgICAvLyBvbiBhIHBhZ2UgdGhhdCdzIG5vIGxvbmdlciBsb2FkZWQuCiAgICAgIGlmICghd2luZG93LnNlbGVjdCkgcmV0dXJuIGZhbHNlOwoKICAgICAgaWYgKCF0aGlzLm9wdGlvbnMucmVhZE9ubHkpIHNlbGVjdC5tYXJrU2VsZWN0aW9uKHRoaXMud2luKTsKICAgICAgdmFyIHN0YXJ0LCBlbmRUaW1lID0gZm9yY2UgPyBudWxsIDogdGltZSgpICsgdGhpcy5vcHRpb25zLnBhc3NUaW1lOwogICAgICB3aGlsZSAoKHRpbWUoKSA8IGVuZFRpbWUgfHwgZm9yY2UpICYmIChzdGFydCA9IHRoaXMuZ2V0RGlydHlOb2RlKCkpKSB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuaGlnaGxpZ2h0KHN0YXJ0LCBlbmRUaW1lKTsKICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5ub2RlICYmIHJlc3VsdC5kaXJ0eSkKICAgICAgICAgIHRoaXMuYWRkRGlydHlOb2RlKHJlc3VsdC5ub2RlKTsKICAgICAgfQogICAgICBpZiAoIXRoaXMub3B0aW9ucy5yZWFkT25seSkgc2VsZWN0LnNlbGVjdE1hcmtlZCgpOwogICAgICBpZiAoc3RhcnQpIHRoaXMuc2NoZWR1bGVIaWdobGlnaHQoKTsKICAgICAgcmV0dXJuIHRoaXMuZGlydHkubGVuZ3RoID09IDA7CiAgICB9LAoKICAgIC8vIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCB0aHJvdWdoIGEgdGltZW91dCwgd2lsbAogICAgLy8gY29udGludW91c2x5IHJlLXBhcnNlIHRoZSBkb2N1bWVudC4KICAgIGRvY3VtZW50U2Nhbm5lcjogZnVuY3Rpb24ocGFzc1RpbWUpIHsKICAgICAgdmFyIHNlbGYgPSB0aGlzLCBwb3MgPSBudWxsOwogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgLy8gRkYgdGltZW91dCB3ZWlyZG5lc3Mgd29ya2Fyb3VuZC4KICAgICAgICBpZiAoIXdpbmRvdy5zZWxlY3QpIHJldHVybjsKICAgICAgICAvLyBJZiB0aGUgY3VycmVudCBub2RlIGlzIG5vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQuLi4gb2gKICAgICAgICAvLyB3ZWxsLCB3ZSBzdGFydCBvdmVyLgogICAgICAgIGlmIChwb3MgJiYgcG9zLnBhcmVudE5vZGUgIT0gc2VsZi5jb250YWluZXIpCiAgICAgICAgICBwb3MgPSBudWxsOwogICAgICAgIHNlbGVjdC5tYXJrU2VsZWN0aW9uKHNlbGYud2luKTsKICAgICAgICB2YXIgcmVzdWx0ID0gc2VsZi5oaWdobGlnaHQocG9zLCB0aW1lKCkgKyBwYXNzVGltZSwgdHJ1ZSk7CiAgICAgICAgc2VsZWN0LnNlbGVjdE1hcmtlZCgpOwogICAgICAgIHZhciBuZXdQb3MgPSByZXN1bHQgPyAocmVzdWx0Lm5vZGUgJiYgcmVzdWx0Lm5vZGUubmV4dFNpYmxpbmcpIDogbnVsbDsKICAgICAgICBwb3MgPSAocG9zID09IG5ld1BvcykgPyBudWxsIDogbmV3UG9zOwogICAgICAgIHNlbGYuZGVsYXlTY2FubmluZygpOwogICAgICB9OwogICAgfSwKCiAgICAvLyBTdGFydHMgdGhlIGNvbnRpbnVvdXMgc2Nhbm5pbmcgcHJvY2VzcyBmb3IgdGhpcyBkb2N1bWVudCBhZnRlcgogICAgLy8gYSBnaXZlbiBpbnRlcnZhbC4KICAgIGRlbGF5U2Nhbm5pbmc6IGZ1bmN0aW9uKCkgewogICAgICBpZiAodGhpcy5zY2FubmVyKSB7CiAgICAgICAgdGhpcy5wYXJlbnQuY2xlYXJUaW1lb3V0KHRoaXMuZG9jdW1lbnRTY2FuKTsKICAgICAgICB0aGlzLmRvY3VtZW50U2NhbiA9IHRoaXMucGFyZW50LnNldFRpbWVvdXQodGhpcy5zY2FubmVyLCB0aGlzLm9wdGlvbnMuY29udGludW91c1NjYW5uaW5nKTsKICAgICAgfQogICAgfSwKCiAgICAvLyBUaGUgZnVuY3Rpb24gdGhhdCBkb2VzIHRoZSBhY3R1YWwgaGlnaGxpZ2h0aW5nL2NvbG91cmluZyAod2l0aAogICAgLy8gaGVscCBmcm9tIHRoZSBwYXJzZXIgYW5kIHRoZSBET00gbm9ybWFsaXplcikuIEl0cyBpbnRlcmZhY2UgaXMKICAgIC8vIHJhdGhlciBvdmVyY29tcGxpY2F0ZWQsIGJlY2F1c2UgaXQgaXMgdXNlZCBpbiBkaWZmZXJlbnQKICAgIC8vIHNpdHVhdGlvbnM6IGVuc3VyaW5nIHRoYXQgYSBjZXJ0YWluIGxpbmUgaXMgaGlnaGxpZ2h0ZWQsIG9yCiAgICAvLyBoaWdobGlnaHRpbmcgdXAgdG8gWCBtaWxsaXNlY29uZHMgc3RhcnRpbmcgZnJvbSBhIGNlcnRhaW4KICAgIC8vIHBvaW50LiBUaGUgJ2Zyb20nIGFyZ3VtZW50IGdpdmVzIHRoZSBub2RlIGF0IHdoaWNoIGl0IHNob3VsZAogICAgLy8gc3RhcnQuIElmIHRoaXMgaXMgbnVsbCwgaXQgd2lsbCBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQogICAgLy8gZG9jdW1lbnQuIFdoZW4gYSB0aW1lc3RhbXAgaXMgZ2l2ZW4gd2l0aCB0aGUgJ3RhcmdldCcgYXJndW1lbnQsCiAgICAvLyBpdCB3aWxsIHN0b3AgaGlnaGxpZ2h0aW5nIGF0IHRoYXQgdGltZS4gSWYgdGhpcyBhcmd1bWVudCBob2xkcwogICAgLy8gYSBET00gbm9kZSwgaXQgd2lsbCBoaWdobGlnaHQgdW50aWwgaXQgcmVhY2hlcyB0aGF0IG5vZGUuIElmIGF0CiAgICAvLyBhbnkgdGltZSBpdCBjb21lcyBhY3Jvc3MgdHdvICdjbGVhbicgbGluZXMgKG5vIGRpcnR5IG5vZGVzKSwgaXQKICAgIC8vIHdpbGwgc3RvcCwgZXhjZXB0IHdoZW4gJ2NsZWFuTGluZXMnIGlzIHRydWUuIG1heEJhY2t0cmFjayBpcwogICAgLy8gdGhlIG1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIGJhY2t0cmFjayB0byBmaW5kIGFuIGV4aXN0aW5nCiAgICAvLyBwYXJzZXIgaW5zdGFuY2UuIFRoaXMgaXMgdXNlZCB0byBnaXZlIHVwIGluIHNpdHVhdGlvbnMgd2hlcmUgYQogICAgLy8gaGlnaGxpZ2h0IHdvdWxkIHRha2UgdG9vIGxvbmcgYW5kIGZyZWV6ZSB0aGUgYnJvd3NlciBpbnRlcmZhY2UuCiAgICBoaWdobGlnaHQ6IGZ1bmN0aW9uKGZyb20sIHRhcmdldCwgY2xlYW5MaW5lcywgbWF4QmFja3RyYWNrKXsKICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyLCBzZWxmID0gdGhpcywgYWN0aXZlID0gdGhpcy5vcHRpb25zLmFjdGl2ZVRva2VuczsKICAgICAgdmFyIGVuZFRpbWUgPSAodHlwZW9mIHRhcmdldCA9PSAibnVtYmVyIiA/IHRhcmdldCA6IG51bGwpOwoKICAgICAgaWYgKCFjb250YWluZXIuZmlyc3RDaGlsZCkKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIC8vIEJhY2t0cmFjayB0byB0aGUgZmlyc3Qgbm9kZSBiZWZvcmUgZnJvbSB0aGF0IGhhcyBhIHBhcnRpYWwKICAgICAgLy8gcGFyc2Ugc3RvcmVkLgogICAgICB3aGlsZSAoZnJvbSAmJiAoIWZyb20ucGFyc2VyRnJvbUhlcmUgfHwgZnJvbS5kaXJ0eSkpIHsKICAgICAgICBpZiAobWF4QmFja3RyYWNrICE9IG51bGwgJiYgaXNCUihmcm9tKSAmJiAoLS1tYXhCYWNrdHJhY2spIDwgMCkKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICBmcm9tID0gZnJvbS5wcmV2aW91c1NpYmxpbmc7CiAgICAgIH0KICAgICAgLy8gSWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LCBkbyBub3RoaW5nLgogICAgICBpZiAoZnJvbSAmJiAhZnJvbS5uZXh0U2libGluZykKICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAvLyBDaGVjayB3aGV0aGVyIGEgcGFydCAoPHNwYW4+IG5vZGUpIGFuZCB0aGUgY29ycmVzcG9uZGluZyB0b2tlbgogICAgICAvLyBtYXRjaC4KICAgICAgZnVuY3Rpb24gY29ycmVjdFBhcnQodG9rZW4sIHBhcnQpewogICAgICAgIHJldHVybiAhcGFydC5yZWR1Y2VkICYmIHBhcnQuY3VycmVudFRleHQgPT0gdG9rZW4udmFsdWUgJiYgcGFydC5jbGFzc05hbWUgPT0gdG9rZW4uc3R5bGU7CiAgICAgIH0KICAgICAgLy8gU2hvcnRlbiB0aGUgdGV4dCBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0IGJ5IGNob3BwaW5nIG9mZgogICAgICAvLyBjaGFyYWN0ZXJzIGZyb20gdGhlIGZyb250LiBOb3RlIHRoYXQgb25seSB0aGUgY3VycmVudFRleHQKICAgICAgLy8gcHJvcGVydHkgZ2V0cyBjaGFuZ2VkLiBGb3IgZWZmaWNpZW5jeSByZWFzb25zLCB3ZSBsZWF2ZSB0aGUKICAgICAgLy8gbm9kZVZhbHVlIGFsb25lIC0tIHdlIHNldCB0aGUgcmVkdWNlZCBmbGFnIHRvIGluZGljYXRlIHRoYXQKICAgICAgLy8gdGhpcyBwYXJ0IG11c3QgYmUgcmVwbGFjZWQuCiAgICAgIGZ1bmN0aW9uIHNob3J0ZW5QYXJ0KHBhcnQsIG1pbnVzKXsKICAgICAgICBwYXJ0LmN1cnJlbnRUZXh0ID0gcGFydC5jdXJyZW50VGV4dC5zdWJzdHJpbmcobWludXMpOwogICAgICAgIHBhcnQucmVkdWNlZCA9IHRydWU7CiAgICAgIH0KICAgICAgLy8gQ3JlYXRlIGEgcGFydCBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gdG9rZW4uCiAgICAgIGZ1bmN0aW9uIHRva2VuUGFydCh0b2tlbil7CiAgICAgICAgdmFyIHBhcnQgPSBtYWtlUGFydFNwYW4odG9rZW4udmFsdWUsIHNlbGYuZG9jKTsgICAgIAogICAgICAgIHBhcnQuY2xhc3NOYW1lID0gdG9rZW4uc3R5bGU7CiAgICAgICAgcmV0dXJuIHBhcnQ7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIG1heWJlVG91Y2gobm9kZSkgewogICAgICAgIGlmIChub2RlKSB7CiAgICAgICAgICB2YXIgb2xkID0gbm9kZS5vbGROZXh0U2libGluZzsKICAgICAgICAgIGlmIChsaW5lRGlydHkgfHwgb2xkID09PSB1bmRlZmluZWQgfHwgbm9kZS5uZXh0U2libGluZyAhPSBvbGQpCiAgICAgICAgICAgIHNlbGYuaGlzdG9yeS50b3VjaChub2RlKTsKICAgICAgICAgIG5vZGUub2xkTmV4dFNpYmxpbmcgPSBub2RlLm5leHRTaWJsaW5nOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIHZhciBvbGQgPSBzZWxmLmNvbnRhaW5lci5vbGRGaXJzdENoaWxkOwogICAgICAgICAgaWYgKGxpbmVEaXJ0eSB8fCBvbGQgPT09IHVuZGVmaW5lZCB8fCBzZWxmLmNvbnRhaW5lci5maXJzdENoaWxkICE9IG9sZCkKICAgICAgICAgICAgc2VsZi5oaXN0b3J5LnRvdWNoKG51bGwpOwogICAgICAgICAgc2VsZi5jb250YWluZXIub2xkRmlyc3RDaGlsZCA9IHNlbGYuY29udGFpbmVyLmZpcnN0Q2hpbGQ7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBHZXQgdGhlIHRva2VuIHN0cmVhbS4gSWYgZnJvbSBpcyBudWxsLCB3ZSBzdGFydCB3aXRoIGEgbmV3CiAgICAgIC8vIHBhcnNlciBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZnJhbWUsIG90aGVyd2lzZSBhIHBhcnRpYWwgcGFyc2UKICAgICAgLy8gaXMgcmVzdW1lZC4KICAgICAgdmFyIHRyYXZlcnNhbCA9IHRyYXZlcnNlRE9NKGZyb20gPyBmcm9tLm5leHRTaWJsaW5nIDogY29udGFpbmVyLmZpcnN0Q2hpbGQpLAogICAgICAgICAgc3RyZWFtID0gc3RyaW5nU3RyZWFtKHRyYXZlcnNhbCksCiAgICAgICAgICBwYXJzZWQgPSBmcm9tID8gZnJvbS5wYXJzZXJGcm9tSGVyZShzdHJlYW0pIDogRWRpdG9yLlBhcnNlci5tYWtlKHN0cmVhbSk7CgogICAgICBmdW5jdGlvbiBzdXJyb3VuZGVkQnlCUnMobm9kZSkgewogICAgICAgIHJldHVybiAobm9kZS5wcmV2aW91c1NpYmxpbmcgPT0gbnVsbCB8fCBpc0JSKG5vZGUucHJldmlvdXNTaWJsaW5nKSkgJiYKICAgICAgICAgICAgICAgKG5vZGUubmV4dFNpYmxpbmcgPT0gbnVsbCB8fCBpc0JSKG5vZGUubmV4dFNpYmxpbmcpKTsKICAgICAgfQoKICAgICAgLy8gcGFydHMgaXMgYW4gaW50ZXJmYWNlIHRvIG1ha2UgaXQgcG9zc2libGUgdG8gJ2RlbGF5JyBmZXRjaGluZwogICAgICAvLyB0aGUgbmV4dCBET00gbm9kZSB1bnRpbCB3ZSBhcmUgY29tcGxldGVseSBkb25lIHdpdGggdGhlIG9uZQogICAgICAvLyBiZWZvcmUgaXQuIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugb2Z0ZW4gdGhlIG5leHQgbm9kZSBpcwogICAgICAvLyBub3QgeWV0IGF2YWlsYWJsZSB3aGVuIHdlIHdhbnQgdG8gcHJvY2VlZCBwYXN0IHRoZSBjdXJyZW50CiAgICAgIC8vIG9uZS4KICAgICAgdmFyIHBhcnRzID0gewogICAgICAgIGN1cnJlbnQ6IG51bGwsCiAgICAgICAgLy8gRmV0Y2ggY3VycmVudCBub2RlLgogICAgICAgIGdldDogZnVuY3Rpb24oKXsKICAgICAgICAgIGlmICghdGhpcy5jdXJyZW50KQogICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB0cmF2ZXJzYWwubm9kZXMuc2hpZnQoKTsKICAgICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnQ7CiAgICAgICAgfSwKICAgICAgICAvLyBBZHZhbmNlIHRvIHRoZSBuZXh0IHBhcnQgKGRvIG5vdCBmZXRjaCBpdCB5ZXQpLgogICAgICAgIG5leHQ6IGZ1bmN0aW9uKCl7CiAgICAgICAgICB0aGlzLmN1cnJlbnQgPSBudWxsOwogICAgICAgIH0sCiAgICAgICAgLy8gUmVtb3ZlIHRoZSBjdXJyZW50IHBhcnQgZnJvbSB0aGUgRE9NIHRyZWUsIGFuZCBtb3ZlIHRvIHRoZQogICAgICAgIC8vIG5leHQuCiAgICAgICAgcmVtb3ZlOiBmdW5jdGlvbigpewogICAgICAgICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKHRoaXMuZ2V0KCkpOwogICAgICAgICAgdGhpcy5jdXJyZW50ID0gbnVsbDsKICAgICAgICB9LAogICAgICAgIC8vIEFkdmFuY2UgdG8gdGhlIG5leHQgcGFydCB0aGF0IGlzIG5vdCBlbXB0eSwgZGlzY2FyZGluZyBlbXB0eQogICAgICAgIC8vIHBhcnRzLgogICAgICAgIGdldE5vbkVtcHR5OiBmdW5jdGlvbigpewogICAgICAgICAgdmFyIHBhcnQgPSB0aGlzLmdldCgpOwogICAgICAgICAgLy8gQWxsb3cgZW1wdHkgbm9kZXMgd2hlbiB0aGV5IGFyZSBhbG9uZSBvbiBhIGxpbmUsIG5lZWRlZAogICAgICAgICAgLy8gZm9yIHRoZSBGRiBjdXJzb3IgYnVnIHdvcmthcm91bmQgKHNlZSBzZWxlY3QuanMsCiAgICAgICAgICAvLyBpbnNlcnROZXdsaW5lQXRDdXJzb3IpLgogICAgICAgICAgd2hpbGUgKHBhcnQgJiYgaXNTcGFuKHBhcnQpICYmIHBhcnQuY3VycmVudFRleHQgPT0gIiIpIHsKICAgICAgICAgICAgLy8gTGVhdmUgZW1wdHkgbm9kZXMgdGhhdCBhcmUgYWxvbmUgb24gYSBsaW5lIGFsb25lIGluCiAgICAgICAgICAgIC8vIE9wZXJhLCBzaW5jZSB0aGF0IGJyb3dzZXJzIGRvZXNuJ3QgZGVhbCB3ZWxsIHdpdGgKICAgICAgICAgICAgLy8gaGF2aW5nIDIgQlJzIGluIGEgcm93LgogICAgICAgICAgICBpZiAod2luZG93Lm9wZXJhICYmIHN1cnJvdW5kZWRCeUJScyhwYXJ0KSkgewogICAgICAgICAgICAgIHRoaXMubmV4dCgpOwogICAgICAgICAgICAgIHBhcnQgPSB0aGlzLmdldCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgIHZhciBvbGQgPSBwYXJ0OwogICAgICAgICAgICAgIHRoaXMucmVtb3ZlKCk7CiAgICAgICAgICAgICAgcGFydCA9IHRoaXMuZ2V0KCk7CiAgICAgICAgICAgICAgLy8gQWRqdXN0IHNlbGVjdGlvbiBpbmZvcm1hdGlvbiwgaWYgYW55LiBTZWUgc2VsZWN0LmpzIGZvciBkZXRhaWxzLgogICAgICAgICAgICAgIHNlbGVjdC5zbmFwc2hvdE1vdmUob2xkLmZpcnN0Q2hpbGQsIHBhcnQgJiYgKHBhcnQuZmlyc3RDaGlsZCB8fCBwYXJ0KSwgMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgcmV0dXJuIHBhcnQ7CiAgICAgICAgfQogICAgICB9OwoKICAgICAgdmFyIGxpbmVEaXJ0eSA9IGZhbHNlLCBwcmV2TGluZURpcnR5ID0gdHJ1ZSwgbGluZU5vZGVzID0gMDsKCiAgICAgIC8vIFRoaXMgZm9yRWFjaCBsb29wcyBvdmVyIHRoZSB0b2tlbnMgZnJvbSB0aGUgcGFyc2VkIHN0cmVhbSwgYW5kCiAgICAgIC8vIGF0IHRoZSBzYW1lIHRpbWUgdXNlcyB0aGUgcGFydHMgb2JqZWN0IHRvIHByb2NlZWQgdGhyb3VnaCB0aGUKICAgICAgLy8gY29ycmVzcG9uZGluZyBET00gbm9kZXMuCiAgICAgIGZvckVhY2gocGFyc2VkLCBmdW5jdGlvbih0b2tlbil7CiAgICAgICAgdmFyIHBhcnQgPSBwYXJ0cy5nZXROb25FbXB0eSgpOwoKICAgICAgICBpZiAodG9rZW4udmFsdWUgPT0gIlxuIil7CiAgICAgICAgICAvLyBUaGUgaWRlYSBvZiB0aGUgdHdvIHN0cmVhbXMgYWN0dWFsbHkgc3RheWluZyBzeW5jaHJvbml6ZWQKICAgICAgICAgIC8vIGlzIHN1Y2ggYSBsb25nIHNob3QgdGhhdCB3ZSBleHBsaWNpdGx5IGNoZWNrLgogICAgICAgICAgaWYgKCFpc0JSKHBhcnQpKQogICAgICAgICAgICB0aHJvdyAiUGFyc2VyIG91dCBvZiBzeW5jLiBFeHBlY3RlZCBCUi4iOwoKICAgICAgICAgIGlmIChwYXJ0LmRpcnR5IHx8ICFwYXJ0LmluZGVudGF0aW9uKSBsaW5lRGlydHkgPSB0cnVlOwogICAgICAgICAgbWF5YmVUb3VjaChmcm9tKTsKICAgICAgICAgIGZyb20gPSBwYXJ0OwoKICAgICAgICAgIC8vIEV2ZXJ5IDxicj4gZ2V0cyBhIGNvcHkgb2YgdGhlIHBhcnNlciBzdGF0ZSBhbmQgYSBsZXhpY2FsCiAgICAgICAgICAvLyBjb250ZXh0IGFzc2lnbmVkIHRvIGl0LiBUaGUgZmlyc3QgaXMgdXNlZCB0byBiZSBhYmxlIHRvCiAgICAgICAgICAvLyBsYXRlciByZXN1bWUgcGFyc2luZyBmcm9tIHRoaXMgcG9pbnQsIHRoZSBzZWNvbmQgaXMgdXNlZAogICAgICAgICAgLy8gZm9yIGluZGVudGF0aW9uLgogICAgICAgICAgcGFydC5wYXJzZXJGcm9tSGVyZSA9IHBhcnNlZC5jb3B5KCk7CiAgICAgICAgICBwYXJ0LmluZGVudGF0aW9uID0gdG9rZW4uaW5kZW50YXRpb247CiAgICAgICAgICBwYXJ0LmRpcnR5ID0gZmFsc2U7CgogICAgICAgICAgLy8gSWYgdGhlIHRhcmdldCBhcmd1bWVudCB3YXNuJ3QgYW4gaW50ZWdlciwgZ28gYXQgbGVhc3QKICAgICAgICAgIC8vIHVudGlsIHRoYXQgbm9kZS4KICAgICAgICAgIGlmIChlbmRUaW1lID09IG51bGwgJiYgcGFydCA9PSB0YXJnZXQpIHRocm93IFN0b3BJdGVyYXRpb247CgogICAgICAgICAgLy8gQSBjbGVhbiBsaW5lIHdpdGggbW9yZSB0aGFuIG9uZSBub2RlIG1lYW5zIHdlIGFyZSBkb25lLgogICAgICAgICAgLy8gVGhyb3dpbmcgYSBTdG9wSXRlcmF0aW9uIGlzIHRoZSB3YXkgdG8gYnJlYWsgb3V0IG9mIGEKICAgICAgICAgIC8vIE1vY2hpS2l0IGZvckVhY2ggbG9vcC4KICAgICAgICAgIGlmICgoZW5kVGltZSAhPSBudWxsICYmIHRpbWUoKSA+PSBlbmRUaW1lKSB8fCAoIWxpbmVEaXJ0eSAmJiAhcHJldkxpbmVEaXJ0eSAmJiBsaW5lTm9kZXMgPiAxICYmICFjbGVhbkxpbmVzKSkKICAgICAgICAgICAgdGhyb3cgU3RvcEl0ZXJhdGlvbjsKICAgICAgICAgIHByZXZMaW5lRGlydHkgPSBsaW5lRGlydHk7IGxpbmVEaXJ0eSA9IGZhbHNlOyBsaW5lTm9kZXMgPSAwOwogICAgICAgICAgcGFydHMubmV4dCgpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIGlmICghaXNTcGFuKHBhcnQpKQogICAgICAgICAgICB0aHJvdyAiUGFyc2VyIG91dCBvZiBzeW5jLiBFeHBlY3RlZCBTUEFOLiI7CiAgICAgICAgICBpZiAocGFydC5kaXJ0eSkKICAgICAgICAgICAgbGluZURpcnR5ID0gdHJ1ZTsKICAgICAgICAgIGxpbmVOb2RlcysrOwoKICAgICAgICAgIC8vIElmIHRoZSBwYXJ0IG1hdGNoZXMgdGhlIHRva2VuLCB3ZSBjYW4gbGVhdmUgaXQgYWxvbmUuCiAgICAgICAgICBpZiAoY29ycmVjdFBhcnQodG9rZW4sIHBhcnQpKXsKICAgICAgICAgICAgcGFydC5kaXJ0eSA9IGZhbHNlOwogICAgICAgICAgICBwYXJ0cy5uZXh0KCk7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBPdGhlcndpc2UsIHdlIGhhdmUgdG8gZml4IGl0LgogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGxpbmVEaXJ0eSA9IHRydWU7CiAgICAgICAgICAgIC8vIEluc2VydCB0aGUgY29ycmVjdCBwYXJ0LgogICAgICAgICAgICB2YXIgbmV3UGFydCA9IHRva2VuUGFydCh0b2tlbik7CiAgICAgICAgICAgIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUobmV3UGFydCwgcGFydCk7CiAgICAgICAgICAgIGlmIChhY3RpdmUpIGFjdGl2ZShuZXdQYXJ0LCB0b2tlbiwgc2VsZik7CiAgICAgICAgICAgIHZhciB0b2tlbnNpemUgPSB0b2tlbi52YWx1ZS5sZW5ndGg7CiAgICAgICAgICAgIHZhciBvZmZzZXQgPSAwOwogICAgICAgICAgICAvLyBFYXQgdXAgcGFydHMgdW50aWwgdGhlIHRleHQgZm9yIHRoaXMgdG9rZW4gaGFzIGJlZW4KICAgICAgICAgICAgLy8gcmVtb3ZlZCwgYWRqdXN0aW5nIHRoZSBzdG9yZWQgc2VsZWN0aW9uIGluZm8gKHNlZQogICAgICAgICAgICAvLyBzZWxlY3QuanMpIGluIHRoZSBwcm9jZXNzLgogICAgICAgICAgICB3aGlsZSAodG9rZW5zaXplID4gMCkgewogICAgICAgICAgICAgIHBhcnQgPSBwYXJ0cy5nZXQoKTsKICAgICAgICAgICAgICB2YXIgcGFydHNpemUgPSBwYXJ0LmN1cnJlbnRUZXh0Lmxlbmd0aDsKICAgICAgICAgICAgICBzZWxlY3Quc25hcHNob3RSZXBsYWNlTm9kZShwYXJ0LmZpcnN0Q2hpbGQsIG5ld1BhcnQuZmlyc3RDaGlsZCwgdG9rZW5zaXplLCBvZmZzZXQpOwogICAgICAgICAgICAgIGlmIChwYXJ0c2l6ZSA+IHRva2Vuc2l6ZSl7CiAgICAgICAgICAgICAgICBzaG9ydGVuUGFydChwYXJ0LCB0b2tlbnNpemUpOwogICAgICAgICAgICAgICAgdG9rZW5zaXplID0gMDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0b2tlbnNpemUgLT0gcGFydHNpemU7CiAgICAgICAgICAgICAgICBvZmZzZXQgKz0gcGFydHNpemU7CiAgICAgICAgICAgICAgICBwYXJ0cy5yZW1vdmUoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgICBtYXliZVRvdWNoKGZyb20pOwogICAgICB3ZWJraXRMYXN0TGluZUhhY2sodGhpcy5jb250YWluZXIpOwoKICAgICAgLy8gVGhlIGZ1bmN0aW9uIHJldHVybnMgc29tZSBzdGF0dXMgaW5mb3JtYXRpb24gdGhhdCBpcyB1c2VkIGJ5CiAgICAgIC8vIGhpZ2h0bGlnaHREaXJ0eSB0byBkZXRlcm1pbmUgd2hldGhlciBhbmQgd2hlcmUgaXQgaGFzIHRvCiAgICAgIC8vIGNvbnRpbnVlLgogICAgICByZXR1cm4ge25vZGU6IHBhcnRzLmdldE5vbkVtcHR5KCksCiAgICAgICAgICAgICAgZGlydHk6IGxpbmVEaXJ0eX07CiAgICB9CiAgfTsKCiAgcmV0dXJuIEVkaXRvcjsKfSkoKTsKCmFkZEV2ZW50SGFuZGxlcih3aW5kb3csICJsb2FkIiwgZnVuY3Rpb24oKSB7CiAgdmFyIENvZGVNaXJyb3IgPSB3aW5kb3cuZnJhbWVFbGVtZW50LkNvZGVNaXJyb3I7CiAgdmFyIGUgPSBDb2RlTWlycm9yLmVkaXRvciA9IG5ldyBFZGl0b3IoQ29kZU1pcnJvci5vcHRpb25zKTsKICB0aGlzLnBhcmVudC5zZXRUaW1lb3V0KG1ldGhvZChDb2RlTWlycm9yLCAiaW5pdCIpLCAwKTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/highlight.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gTWluaW1hbCBmcmFtaW5nIG5lZWRlZCB0byB1c2UgQ29kZU1pcnJvci1zdHlsZSBwYXJzZXJzIHRvIGhpZ2hsaWdodAovLyBjb2RlLiBMb2FkIHRoaXMgYWxvbmcgd2l0aCB0b2tlbml6ZS5qcywgc3RyaW5nc3RyZWFtLmpzLCBhbmQgeW91cgovLyBwYXJzZXIuIFRoZW4gY2FsbCBoaWdobGlnaHRUZXh0LCBwYXNzaW5nIGEgc3RyaW5nIGFzIHRoZSBmaXJzdAovLyBhcmd1bWVudCwgYW5kIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgZWl0aGVyIGEgY2FsbGJhY2sgZnVuY3Rpb24KLy8gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aXRoIGFuIGFycmF5IG9mIFNQQU4gbm9kZXMgZm9yIGV2ZXJ5IGxpbmUgaW4KLy8gdGhlIGNvZGUsIG9yIGEgRE9NIG5vZGUgdG8gd2hpY2ggdG8gYXBwZW5kIHRoZXNlIHNwYW5zLCBhbmQKLy8gb3B0aW9uYWxseSAobm90IG5lZWRlZCBpZiB5b3Ugb25seSBsb2FkZWQgb25lIHBhcnNlcikgYSBwYXJzZXIKLy8gb2JqZWN0LgoKLy8gU3R1ZmYgZnJvbSB1dGlsLmpzIHRoYXQgdGhlIHBhcnNlcnMgYXJlIHVzaW5nLgp2YXIgU3RvcEl0ZXJhdGlvbiA9IHt0b1N0cmluZzogZnVuY3Rpb24oKSB7cmV0dXJuICJTdG9wSXRlcmF0aW9uIn19OwoKdmFyIEVkaXRvciA9IHt9Owp2YXIgaW5kZW50VW5pdCA9IDI7CgooZnVuY3Rpb24oKXsKICBmdW5jdGlvbiBub3JtYWxpc2VTdHJpbmcoc3RyaW5nKSB7CiAgICB2YXIgdGFiID0gIiI7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluZGVudFVuaXQ7IGkrKykgdGFiICs9ICIgIjsKCiAgICBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZSgvXHQvZywgdGFiKS5yZXBsYWNlKC9cdTAwYTAvZywgIiAiKS5yZXBsYWNlKC9cclxuPy9nLCAiXG4iKTsKICAgIHZhciBwb3MgPSAwLCBwYXJ0cyA9IFtdLCBsaW5lcyA9IHN0cmluZy5zcGxpdCgiXG4iKTsKICAgIGZvciAodmFyIGxpbmUgPSAwOyBsaW5lIDwgbGluZXMubGVuZ3RoOyBsaW5lKyspIHsKICAgICAgaWYgKGxpbmUgIT0gMCkgcGFydHMucHVzaCgiXG4iKTsKICAgICAgcGFydHMucHVzaChsaW5lc1tsaW5lXSk7CiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgbmV4dDogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHBvcyA8IHBhcnRzLmxlbmd0aCkgcmV0dXJuIHBhcnRzW3BvcysrXTsKICAgICAgICBlbHNlIHRocm93IFN0b3BJdGVyYXRpb247CiAgICAgIH0KICAgIH07CiAgfQoKICB3aW5kb3cuaGlnaGxpZ2h0VGV4dCA9IGZ1bmN0aW9uKHN0cmluZywgY2FsbGJhY2ssIHBhcnNlcikgewogICAgcGFyc2VyID0gKHBhcnNlciB8fCBFZGl0b3IuUGFyc2VyKS5tYWtlKHN0cmluZ1N0cmVhbShub3JtYWxpc2VTdHJpbmcoc3RyaW5nKSkpOwogICAgdmFyIGxpbmUgPSBbXTsKICAgIGlmIChjYWxsYmFjay5ub2RlVHlwZSA9PSAxKSB7CiAgICAgIHZhciBub2RlID0gY2FsbGJhY2s7CiAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24obGluZSkgewogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZS5sZW5ndGg7IGkrKykKICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQobGluZVtpXSk7CiAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJCUiIpKTsKICAgICAgfTsKICAgIH0KCiAgICB0cnkgewogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIHZhciB0b2tlbiA9IHBhcnNlci5uZXh0KCk7CiAgICAgICAgaWYgKHRva2VuLnZhbHVlID09ICJcbiIpIHsKICAgICAgICAgIGNhbGxiYWNrKGxpbmUpOwogICAgICAgICAgbGluZSA9IFtdOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIHZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiU1BBTiIpOwogICAgICAgICAgc3Bhbi5jbGFzc05hbWUgPSB0b2tlbi5zdHlsZTsKICAgICAgICAgIHNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodG9rZW4udmFsdWUpKTsKICAgICAgICAgIGxpbmUucHVzaChzcGFuKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGNhdGNoIChlKSB7CiAgICAgIGlmIChlICE9IFN0b3BJdGVyYXRpb24pIHRocm93IGU7CiAgICB9CiAgICBpZiAobGluZS5sZW5ndGgpIGNhbGxiYWNrKGxpbmUpOwogIH0KfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/mirrorframe.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogRGVtb25zdHJhdGlvbiBvZiBlbWJlZGRpbmcgQ29kZU1pcnJvciBpbiBhIGJpZ2dlciBhcHBsaWNhdGlvbi4gVGhlCiAqIGludGVyZmFjZSBkZWZpbmVkIGhlcmUgaXMgYSBtZXNzIG9mIHByb21wdHMgYW5kIGNvbmZpcm1zLCBhbmQKICogc2hvdWxkIHByb2JhYmx5IG5vdCBiZSB1c2VkIGluIGEgcmVhbCBwcm9qZWN0LgogKi8KCmZ1bmN0aW9uIE1pcnJvckZyYW1lKHBsYWNlLCBvcHRpb25zKSB7CiAgdGhpcy5ob21lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIik7CiAgaWYgKHBsYWNlLmFwcGVuZENoaWxkKQogICAgcGxhY2UuYXBwZW5kQ2hpbGQodGhpcy5ob21lKTsKICBlbHNlCiAgICBwbGFjZSh0aGlzLmhvbWUpOwoKICB2YXIgc2VsZiA9IHRoaXM7CiAgZnVuY3Rpb24gbWFrZUJ1dHRvbihuYW1lLCBhY3Rpb24pIHsKICAgIHZhciBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJJTlBVVCIpOwogICAgYnV0dG9uLnR5cGUgPSAiYnV0dG9uIjsKICAgIGJ1dHRvbi52YWx1ZSA9IG5hbWU7CiAgICBzZWxmLmhvbWUuYXBwZW5kQ2hpbGQoYnV0dG9uKTsKICAgIGJ1dHRvbi5vbmNsaWNrID0gZnVuY3Rpb24oKXtzZWxmW2FjdGlvbl0uY2FsbChzZWxmKTt9OwogIH0KCiAgbWFrZUJ1dHRvbigiU2VhcmNoIiwgInNlYXJjaCIpOwogIG1ha2VCdXR0b24oIlJlcGxhY2UiLCAicmVwbGFjZSIpOwogIG1ha2VCdXR0b24oIkN1cnJlbnQgbGluZSIsICJsaW5lIik7CiAgbWFrZUJ1dHRvbigiSnVtcCB0byBsaW5lIiwgImp1bXAiKTsKICBtYWtlQnV0dG9uKCJJbnNlcnQgY29uc3RydWN0b3IiLCAibWFjcm8iKTsKICBtYWtlQnV0dG9uKCJJbmRlbnQgYWxsIiwgInJlaW5kZW50Iik7CgogIHRoaXMubWlycm9yID0gbmV3IENvZGVNaXJyb3IodGhpcy5ob21lLCBvcHRpb25zKTsKfQoKTWlycm9yRnJhbWUucHJvdG90eXBlID0gewogIHNlYXJjaDogZnVuY3Rpb24oKSB7CiAgICB2YXIgdGV4dCA9IHByb21wdCgiRW50ZXIgc2VhcmNoIHRlcm06IiwgIiIpOwogICAgaWYgKCF0ZXh0KSByZXR1cm47CgogICAgdmFyIGZpcnN0ID0gdHJ1ZTsKICAgIGRvIHsKICAgICAgdmFyIGN1cnNvciA9IHRoaXMubWlycm9yLmdldFNlYXJjaEN1cnNvcih0ZXh0LCBmaXJzdCk7CiAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgIHdoaWxlIChjdXJzb3IuZmluZE5leHQoKSkgewogICAgICAgIGN1cnNvci5zZWxlY3QoKTsKICAgICAgICBpZiAoIWNvbmZpcm0oIlNlYXJjaCBhZ2Fpbj8iKSkKICAgICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSB3aGlsZSAoY29uZmlybSgiRW5kIG9mIGRvY3VtZW50IHJlYWNoZWQuIFN0YXJ0IG92ZXI/IikpOwogIH0sCgogIHJlcGxhY2U6IGZ1bmN0aW9uKCkgewogICAgLy8gVGhpcyBpcyBhIHJlcGxhY2UtYWxsLCBidXQgaXQgaXMgcG9zc2libGUgdG8gaW1wbGVtZW50IGEKICAgIC8vIHByb21wdGluZyByZXBsYWNlLgogICAgdmFyIGZyb20gPSBwcm9tcHQoIkVudGVyIHNlYXJjaCBzdHJpbmc6IiwgIiIpLCB0bzsKICAgIGlmIChmcm9tKSB0byA9IHByb21wdCgiV2hhdCBzaG91bGQgaXQgYmUgcmVwbGFjZWQgd2l0aD8iLCAiIik7CiAgICBpZiAodG8gPT0gbnVsbCkgcmV0dXJuOwoKICAgIHZhciBjdXJzb3IgPSB0aGlzLm1pcnJvci5nZXRTZWFyY2hDdXJzb3IoZnJvbSwgZmFsc2UpOwogICAgd2hpbGUgKGN1cnNvci5maW5kTmV4dCgpKQogICAgICBjdXJzb3IucmVwbGFjZSh0byk7CiAgfSwKCiAganVtcDogZnVuY3Rpb24oKSB7CiAgICB2YXIgbGluZSA9IHByb21wdCgiSnVtcCB0byBsaW5lOiIsICIiKTsKICAgIGlmIChsaW5lICYmICFpc05hTihOdW1iZXIobGluZSkpKQogICAgICB0aGlzLm1pcnJvci5qdW1wVG9MaW5lKE51bWJlcihsaW5lKSk7CiAgfSwKCiAgbGluZTogZnVuY3Rpb24oKSB7CiAgICBhbGVydCgiVGhlIGN1cnNvciBpcyBjdXJyZW50bHkgYXQgbGluZSAiICsgdGhpcy5taXJyb3IuY3VycmVudExpbmUoKSk7CiAgICB0aGlzLm1pcnJvci5mb2N1cygpOwogIH0sCgogIG1hY3JvOiBmdW5jdGlvbigpIHsKICAgIHZhciBuYW1lID0gcHJvbXB0KCJOYW1lIHlvdXIgY29uc3RydWN0b3I6IiwgIiIpOwogICAgaWYgKG5hbWUpCiAgICAgIHRoaXMubWlycm9yLnJlcGxhY2VTZWxlY3Rpb24oImZ1bmN0aW9uICIgKyBuYW1lICsgIigpIHtcbiAgXG59XG5cbiIgKyBuYW1lICsgIi5wcm90b3R5cGUgPSB7XG4gIFxufTtcbiIpOwogIH0sCgogIHJlaW5kZW50OiBmdW5jdGlvbigpIHsKICAgIHRoaXMubWlycm9yLnJlaW5kZW50KCk7CiAgfQp9Owo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/parsecss.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogU2ltcGxlIHBhcnNlciBmb3IgQ1NTICovCgp2YXIgQ1NTUGFyc2VyID0gRWRpdG9yLlBhcnNlciA9IChmdW5jdGlvbigpIHsKICB2YXIgdG9rZW5pemVDU1MgPSAoZnVuY3Rpb24oKSB7CiAgICBmdW5jdGlvbiBub3JtYWwoc291cmNlLCBzZXRTdGF0ZSkgewogICAgICB2YXIgY2ggPSBzb3VyY2UubmV4dCgpOwogICAgICBpZiAoY2ggPT0gIkAiKSB7CiAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1x3Lyk7CiAgICAgICAgcmV0dXJuICJjc3MtYXQiOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGNoID09ICIvIiAmJiBzb3VyY2UuZXF1YWxzKCIqIikpIHsKICAgICAgICBzZXRTdGF0ZShpbkNDb21tZW50KTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBlbHNlIGlmIChjaCA9PSAiPCIgJiYgc291cmNlLmVxdWFscygiISIpKSB7CiAgICAgICAgc2V0U3RhdGUoaW5TR01MQ29tbWVudCk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoY2ggPT0gIj0iKSB7CiAgICAgICAgcmV0dXJuICJjc3MtY29tcGFyZSI7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoc291cmNlLmVxdWFscygiPSIpICYmIChjaCA9PSAifiIgfHwgY2ggPT0gInwiKSkgewogICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgcmV0dXJuICJjc3MtY29tcGFyZSI7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoY2ggPT0gIlwiIiB8fCBjaCA9PSAiJyIpIHsKICAgICAgICBzZXRTdGF0ZShpblN0cmluZyhjaCkpOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGNoID09ICIjIikgewogICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9cdy8pOwogICAgICAgIHJldHVybiAiY3NzLWhhc2giOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGNoID09ICIhIikgewogICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9bIFx0XS8pOwogICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9cdy8pOwogICAgICAgIHJldHVybiAiY3NzLWltcG9ydGFudCI7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoL1xkLy50ZXN0KGNoKSkgewogICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9bXHcuJV0vKTsKICAgICAgICByZXR1cm4gImNzcy11bml0IjsKICAgICAgfQogICAgICBlbHNlIGlmICgvWywuKz4qXC9dLy50ZXN0KGNoKSkgewogICAgICAgIHJldHVybiAiY3NzLXNlbGVjdC1vcCI7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoL1s7e306XFtcXV0vLnRlc3QoY2gpKSB7CiAgICAgICAgcmV0dXJuICJjc3MtcHVuY3R1YXRpb24iOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9bXHdcXFwtX10vKTsKICAgICAgICByZXR1cm4gImNzcy1pZGVudGlmaWVyIjsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGluQ0NvbW1lbnQoc291cmNlLCBzZXRTdGF0ZSkgewogICAgICB2YXIgbWF5YmVFbmQgPSBmYWxzZTsKICAgICAgd2hpbGUgKCFzb3VyY2UuZW5kT2ZMaW5lKCkpIHsKICAgICAgICB2YXIgY2ggPSBzb3VyY2UubmV4dCgpOwogICAgICAgIGlmIChtYXliZUVuZCAmJiBjaCA9PSAiLyIpIHsKICAgICAgICAgIHNldFN0YXRlKG5vcm1hbCk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgbWF5YmVFbmQgPSAoY2ggPT0gIioiKTsKICAgICAgfQogICAgICByZXR1cm4gImNzcy1jb21tZW50IjsKICAgIH0KCiAgICBmdW5jdGlvbiBpblNHTUxDb21tZW50KHNvdXJjZSwgc2V0U3RhdGUpIHsKICAgICAgdmFyIGRhc2hlcyA9IDA7CiAgICAgIHdoaWxlICghc291cmNlLmVuZE9mTGluZSgpKSB7CiAgICAgICAgdmFyIGNoID0gc291cmNlLm5leHQoKTsKICAgICAgICBpZiAoZGFzaGVzID49IDIgJiYgY2ggPT0gIj4iKSB7CiAgICAgICAgICBzZXRTdGF0ZShub3JtYWwpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGRhc2hlcyA9IChjaCA9PSAiLSIpID8gZGFzaGVzICsgMSA6IDA7CiAgICAgIH0KICAgICAgcmV0dXJuICJjc3MtY29tbWVudCI7CiAgICB9CgogICAgZnVuY3Rpb24gaW5TdHJpbmcocXVvdGUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSwgc2V0U3RhdGUpIHsKICAgICAgICB2YXIgZXNjYXBlZCA9IGZhbHNlOwogICAgICAgIHdoaWxlICghc291cmNlLmVuZE9mTGluZSgpKSB7CiAgICAgICAgICB2YXIgY2ggPSBzb3VyY2UubmV4dCgpOwogICAgICAgICAgaWYgKGNoID09IHF1b3RlICYmICFlc2NhcGVkKQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGVzY2FwZWQgPSAhZXNjYXBlZCAmJiBjaCA9PSAiXFwiOwogICAgICAgIH0KICAgICAgICBpZiAoIWVzY2FwZWQpCiAgICAgICAgICBzZXRTdGF0ZShub3JtYWwpOwogICAgICAgIHJldHVybiAiY3NzLXN0cmluZyI7CiAgICAgIH07CiAgICB9CgogICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSwgc3RhcnRTdGF0ZSkgewogICAgICByZXR1cm4gdG9rZW5pemVyKHNvdXJjZSwgc3RhcnRTdGF0ZSB8fCBub3JtYWwpOwogICAgfTsKICB9KSgpOwoKICBmdW5jdGlvbiBpbmRlbnRDU1MoaW5CcmFjZXMsIGluUnVsZSwgYmFzZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKG5leHRDaGFycykgewogICAgICBpZiAoIWluQnJhY2VzIHx8IC9eXH0vLnRlc3QobmV4dENoYXJzKSkgcmV0dXJuIGJhc2U7CiAgICAgIGVsc2UgaWYgKGluUnVsZSkgcmV0dXJuIGJhc2UgKyBpbmRlbnRVbml0ICogMjsKICAgICAgZWxzZSByZXR1cm4gYmFzZSArIGluZGVudFVuaXQ7CiAgICB9OwogIH0KCiAgLy8gVGhpcyBpcyBhIHZlcnkgc2ltcGxpc3RpYyBwYXJzZXIgLS0gc2luY2UgQ1NTIGRvZXMgbm90IHJlYWxseQogIC8vIG5lc3QsIGl0IHdvcmtzIGFjY2VwdGFibHkgd2VsbCwgYnV0IHNvbWUgbmljZXIgY29sb3Vyb2luZyBjb3VsZAogIC8vIGJlIHByb3ZpZGVkIHdpdGggYSBtb3JlIGNvbXBsaWNhdGVkIHBhcnNlci4KICBmdW5jdGlvbiBwYXJzZUNTUyhzb3VyY2UsIGJhc2Vjb2x1bW4pIHsKICAgIGJhc2Vjb2x1bW4gPSBiYXNlY29sdW1uIHx8IDA7CiAgICB2YXIgdG9rZW5zID0gdG9rZW5pemVDU1Moc291cmNlKTsKICAgIHZhciBpbkJyYWNlcyA9IGZhbHNlLCBpblJ1bGUgPSBmYWxzZTsKCiAgICB2YXIgaXRlciA9IHsKICAgICAgbmV4dDogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHRva2VuID0gdG9rZW5zLm5leHQoKSwgc3R5bGUgPSB0b2tlbi5zdHlsZSwgY29udGVudCA9IHRva2VuLmNvbnRlbnQ7CgogICAgICAgIGlmIChzdHlsZSA9PSAiY3NzLWlkZW50aWZpZXIiICYmIGluUnVsZSkKICAgICAgICAgIHRva2VuLnN0eWxlID0gImNzcy12YWx1ZSI7CiAgICAgICAgaWYgKHN0eWxlID09ICJjc3MtaGFzaCIpCiAgICAgICAgICB0b2tlbi5zdHlsZSA9ICBpblJ1bGUgPyAiY3NzLWNvbG9yY29kZSIgOiAiY3NzLWlkZW50aWZpZXIiOwoKICAgICAgICBpZiAoY29udGVudCA9PSAiXG4iKQogICAgICAgICAgdG9rZW4uaW5kZW50YXRpb24gPSBpbmRlbnRDU1MoaW5CcmFjZXMsIGluUnVsZSwgYmFzZWNvbHVtbik7CgogICAgICAgIGlmIChjb250ZW50ID09ICJ7IikKICAgICAgICAgIGluQnJhY2VzID0gdHJ1ZTsKICAgICAgICBlbHNlIGlmIChjb250ZW50ID09ICJ9IikKICAgICAgICAgIGluQnJhY2VzID0gaW5SdWxlID0gZmFsc2U7CiAgICAgICAgZWxzZSBpZiAoaW5CcmFjZXMgJiYgY29udGVudCA9PSAiOyIpCiAgICAgICAgICBpblJ1bGUgPSBmYWxzZTsKICAgICAgICBlbHNlIGlmIChpbkJyYWNlcyAmJiBzdHlsZSAhPSAiY3NzLWNvbW1lbnQiICYmIHN0eWxlICE9ICJ3aGl0ZXNwYWNlIikKICAgICAgICAgIGluUnVsZSA9IHRydWU7CgogICAgICAgIHJldHVybiB0b2tlbjsKICAgICAgfSwKCiAgICAgIGNvcHk6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBfaW5CcmFjZXMgPSBpbkJyYWNlcywgX2luUnVsZSA9IGluUnVsZSwgX3Rva2VuU3RhdGUgPSB0b2tlbnMuc3RhdGU7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSkgewogICAgICAgICAgdG9rZW5zID0gdG9rZW5pemVDU1Moc291cmNlLCBfdG9rZW5TdGF0ZSk7CiAgICAgICAgICBpbkJyYWNlcyA9IF9pbkJyYWNlczsKICAgICAgICAgIGluUnVsZSA9IF9pblJ1bGU7CiAgICAgICAgICByZXR1cm4gaXRlcjsKICAgICAgICB9OwogICAgICB9CiAgICB9OwogICAgcmV0dXJuIGl0ZXI7CiAgfQoKICByZXR1cm4ge21ha2U6IHBhcnNlQ1NTLCBlbGVjdHJpY0NoYXJzOiAifSJ9Owp9KSgpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/parsedummy.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dmFyIER1bW15UGFyc2VyID0gRWRpdG9yLlBhcnNlciA9IChmdW5jdGlvbigpIHsKICBmdW5jdGlvbiB0b2tlbml6ZUR1bW15KHNvdXJjZSkgewogICAgd2hpbGUgKCFzb3VyY2UuZW5kT2ZMaW5lKCkpIHNvdXJjZS5uZXh0KCk7CiAgICByZXR1cm4gInRleHQiOwogIH0KICBmdW5jdGlvbiBwYXJzZUR1bW15KHNvdXJjZSkgewogICAgZnVuY3Rpb24gaW5kZW50VG8obikge3JldHVybiBmdW5jdGlvbigpIHtyZXR1cm4gbjt9fQogICAgc291cmNlID0gdG9rZW5pemVyKHNvdXJjZSwgdG9rZW5pemVEdW1teSk7CiAgICB2YXIgc3BhY2UgPSAwOwoKICAgIHZhciBpdGVyID0gewogICAgICBuZXh0OiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdG9rID0gc291cmNlLm5leHQoKTsKICAgICAgICBpZiAodG9rLnR5cGUgPT0gIndoaXRlc3BhY2UiKSB7CiAgICAgICAgICBpZiAodG9rLnZhbHVlID09ICJcbiIpIHRvay5pbmRlbnRhdGlvbiA9IGluZGVudFRvKHNwYWNlKTsKICAgICAgICAgIGVsc2Ugc3BhY2UgPSB0b2sudmFsdWUubGVuZ3RoOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdG9rOwogICAgICB9LAogICAgICBjb3B5OiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgX3NwYWNlID0gc3BhY2U7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKF9zb3VyY2UpIHsKICAgICAgICAgIHNwYWNlID0gX3NwYWNlOwogICAgICAgICAgc291cmNlID0gdG9rZW5pemVyKF9zb3VyY2UsIHRva2VuaXplRHVtbXkpOwogICAgICAgICAgcmV0dXJuIGl0ZXI7CiAgICAgICAgfTsKICAgICAgfQogICAgfTsKICAgIHJldHVybiBpdGVyOwogIH0KICByZXR1cm4ge21ha2U6IHBhcnNlRHVtbXl9Owp9KSgpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/parsehtmlmixed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dmFyIEhUTUxNaXhlZFBhcnNlciA9IEVkaXRvci5QYXJzZXIgPSAoZnVuY3Rpb24oKSB7CiAgaWYgKCEoQ1NTUGFyc2VyICYmIEpTUGFyc2VyICYmIFhNTFBhcnNlcikpCiAgICB0aHJvdyBuZXcgRXJyb3IoIkNTUywgSlMsIGFuZCBYTUwgcGFyc2VycyBtdXN0IGJlIGxvYWRlZCBmb3IgSFRNTCBtaXhlZCBtb2RlIHRvIHdvcmsuIik7CiAgWE1MUGFyc2VyLmNvbmZpZ3VyZSh7dXNlSFRNTEtsdWRnZXM6IHRydWV9KTsKCiAgZnVuY3Rpb24gcGFyc2VNaXhlZChzdHJlYW0pIHsKICAgIHZhciBodG1sUGFyc2VyID0gWE1MUGFyc2VyLm1ha2Uoc3RyZWFtKSwgbG9jYWxQYXJzZXIgPSBudWxsLCBpblRhZyA9IGZhbHNlOwogICAgdmFyIGl0ZXIgPSB7bmV4dDogdG9wLCBjb3B5OiBjb3B5fTsKCiAgICBmdW5jdGlvbiB0b3AoKSB7CiAgICAgIHZhciB0b2tlbiA9IGh0bWxQYXJzZXIubmV4dCgpOwogICAgICBpZiAodG9rZW4uY29udGVudCA9PSAiPCIpCiAgICAgICAgaW5UYWcgPSB0cnVlOwogICAgICBlbHNlIGlmICh0b2tlbi5zdHlsZSA9PSAieG1sLXRhZ25hbWUiICYmIGluVGFnID09PSB0cnVlKQogICAgICAgIGluVGFnID0gdG9rZW4uY29udGVudC50b0xvd2VyQ2FzZSgpOwogICAgICBlbHNlIGlmICh0b2tlbi5jb250ZW50ID09ICI+IikgewogICAgICAgIGlmIChpblRhZyA9PSAic2NyaXB0IikKICAgICAgICAgIGl0ZXIubmV4dCA9IGxvY2FsKEpTUGFyc2VyLCAiPC9zY3JpcHQiKTsKICAgICAgICBlbHNlIGlmIChpblRhZyA9PSAic3R5bGUiKQogICAgICAgICAgaXRlci5uZXh0ID0gbG9jYWwoQ1NTUGFyc2VyLCAiPC9zdHlsZSIpOwogICAgICAgIGluVGFnID0gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIHRva2VuOwogICAgfQogICAgZnVuY3Rpb24gbG9jYWwocGFyc2VyLCB0YWcpIHsKICAgICAgdmFyIGJhc2VJbmRlbnQgPSBodG1sUGFyc2VyLmluZGVudGF0aW9uKCk7CiAgICAgIGxvY2FsUGFyc2VyID0gcGFyc2VyLm1ha2Uoc3RyZWFtLCBiYXNlSW5kZW50ICsgaW5kZW50VW5pdCk7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoc3RyZWFtLmxvb2tBaGVhZCh0YWcsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpIHsKICAgICAgICAgIGxvY2FsUGFyc2VyID0gbnVsbDsKICAgICAgICAgIGl0ZXIubmV4dCA9IHRvcDsKICAgICAgICAgIHJldHVybiB0b3AoKTsKICAgICAgICB9CgogICAgICAgIHZhciB0b2tlbiA9IGxvY2FsUGFyc2VyLm5leHQoKTsKICAgICAgICB2YXIgbHQgPSB0b2tlbi52YWx1ZS5sYXN0SW5kZXhPZigiPCIpLCBzeiA9IE1hdGgubWluKHRva2VuLnZhbHVlLmxlbmd0aCAtIGx0LCB0YWcubGVuZ3RoKTsKICAgICAgICBpZiAobHQgIT0gLTEgJiYgdG9rZW4udmFsdWUuc2xpY2UobHQsIGx0ICsgc3opLnRvTG93ZXJDYXNlKCkgPT0gdGFnLnNsaWNlKDAsIHN6KSAmJgogICAgICAgICAgICBzdHJlYW0ubG9va0FoZWFkKHRhZy5zbGljZShzeiksIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpIHsKICAgICAgICAgIHN0cmVhbS5wdXNoKHRva2VuLnZhbHVlLnNsaWNlKGx0KSk7CiAgICAgICAgICB0b2tlbi52YWx1ZSA9IHRva2VuLnZhbHVlLnNsaWNlKDAsIGx0KTsKICAgICAgICB9CgogICAgICAgIGlmICh0b2tlbi5pbmRlbnRhdGlvbikgewogICAgICAgICAgdmFyIG9sZEluZGVudCA9IHRva2VuLmluZGVudGF0aW9uOwogICAgICAgICAgdG9rZW4uaW5kZW50YXRpb24gPSBmdW5jdGlvbihjaGFycykgewogICAgICAgICAgICBpZiAoY2hhcnMgPT0gIjwvIikKICAgICAgICAgICAgICByZXR1cm4gYmFzZUluZGVudDsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgIHJldHVybiBvbGRJbmRlbnQoY2hhcnMpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRva2VuOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGNvcHkoKSB7CiAgICAgIHZhciBfaHRtbCA9IGh0bWxQYXJzZXIuY29weSgpLCBfbG9jYWwgPSBsb2NhbFBhcnNlciAmJiBsb2NhbFBhcnNlci5jb3B5KCksCiAgICAgICAgICBfbmV4dCA9IGl0ZXIubmV4dCwgX2luVGFnID0gaW5UYWc7CiAgICAgIHJldHVybiBmdW5jdGlvbihfc3RyZWFtKSB7CiAgICAgICAgc3RyZWFtID0gX3N0cmVhbTsKICAgICAgICBodG1sUGFyc2VyID0gX2h0bWwoX3N0cmVhbSk7CiAgICAgICAgbG9jYWxQYXJzZXIgPSBfbG9jYWwgJiYgX2xvY2FsKF9zdHJlYW0pOwogICAgICAgIGl0ZXIubmV4dCA9IF9uZXh0OwogICAgICAgIGluVGFnID0gX2luVGFnOwogICAgICAgIHJldHVybiBpdGVyOwogICAgICB9OwogICAgfQogICAgcmV0dXJuIGl0ZXI7CiAgfQoKICByZXR1cm4ge21ha2U6IHBhcnNlTWl4ZWQsIGVsZWN0cmljQ2hhcnM6ICJ7fS86In07Cgp9KSgpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/parsejavascript.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogUGFyc2UgZnVuY3Rpb24gZm9yIEphdmFTY3JpcHQuIE1ha2VzIHVzZSBvZiB0aGUgdG9rZW5pemVyIGZyb20KICogdG9rZW5pemVqYXZhc2NyaXB0LmpzLiBOb3RlIHRoYXQgeW91ciBwYXJzZXJzIGRvIG5vdCBoYXZlIHRvIGJlCiAqIHRoaXMgY29tcGxpY2F0ZWQgLS0gaWYgeW91IGRvbid0IHdhbnQgdG8gcmVjb2duaXplIGxvY2FsIHZhcmlhYmxlcywKICogaW4gbWFueSBsYW5ndWFnZXMgaXQgaXMgZW5vdWdoIHRvIGp1c3QgbG9vayBmb3IgYnJhY2VzLCBzZW1pY29sb25zLAogKiBwYXJlbnRoZXNlcywgZXRjLCBhbmQga25vdyB3aGVuIHlvdSBhcmUgaW5zaWRlIGEgc3RyaW5nIG9yIGNvbW1lbnQuCiAqCiAqIFNlZSBtYW51YWwuaHRtbCBmb3IgbW9yZSBpbmZvIGFib3V0IHRoZSBwYXJzZXIgaW50ZXJmYWNlLgogKi8KCnZhciBKU1BhcnNlciA9IEVkaXRvci5QYXJzZXIgPSAoZnVuY3Rpb24oKSB7CiAgLy8gVG9rZW4gdHlwZXMgdGhhdCBjYW4gYmUgY29uc2lkZXJlZCB0byBiZSBhdG9tcy4KICB2YXIgYXRvbWljVHlwZXMgPSB7ImF0b20iOiB0cnVlLCAibnVtYmVyIjogdHJ1ZSwgInZhcmlhYmxlIjogdHJ1ZSwgInN0cmluZyI6IHRydWUsICJyZWdleHAiOiB0cnVlfTsKICAvLyBTZXR0aW5nIHRoYXQgY2FuIGJlIHVzZWQgdG8gaGF2ZSBKU09OIGRhdGEgaW5kZW50IHByb3Blcmx5LgogIHZhciBqc29uID0gZmFsc2U7CiAgLy8gQ29uc3RydWN0b3IgZm9yIHRoZSBsZXhpY2FsIGNvbnRleHQgb2JqZWN0cy4KICBmdW5jdGlvbiBKU0xleGljYWwoaW5kZW50ZWQsIGNvbHVtbiwgdHlwZSwgYWxpZ24sIHByZXYsIGluZm8pIHsKICAgIC8vIGluZGVudGF0aW9uIGF0IHN0YXJ0IG9mIHRoaXMgbGluZQogICAgdGhpcy5pbmRlbnRlZCA9IGluZGVudGVkOwogICAgLy8gY29sdW1uIGF0IHdoaWNoIHRoaXMgc2NvcGUgd2FzIG9wZW5lZAogICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47CiAgICAvLyB0eXBlIG9mIHNjb3BlICgndmFyZGVmJywgJ3N0YXQnIChzdGF0ZW1lbnQpLCAnZm9ybScgKHNwZWNpYWwgZm9ybSksICdbJywgJ3snLCBvciAnKCcpCiAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgLy8gJ1snLCAneycsIG9yICcoJyBibG9ja3MgdGhhdCBoYXZlIGFueSB0ZXh0IGFmdGVyIHRoZWlyIG9wZW5pbmcKICAgIC8vIGNoYXJhY3RlciBhcmUgc2FpZCB0byBiZSAnYWxpZ25lZCcgLS0gYW55IGxpbmVzIGJlbG93IGFyZQogICAgLy8gaW5kZW50ZWQgYWxsIHRoZSB3YXkgdG8gdGhlIG9wZW5pbmcgY2hhcmFjdGVyLgogICAgaWYgKGFsaWduICE9IG51bGwpCiAgICAgIHRoaXMuYWxpZ24gPSBhbGlnbjsKICAgIC8vIFBhcmVudCBzY29wZSwgaWYgYW55LgogICAgdGhpcy5wcmV2ID0gcHJldjsKICAgIHRoaXMuaW5mbyA9IGluZm87CiAgfQoKICAvLyBNeSBmYXZvdXJpdGUgSmF2YVNjcmlwdCBpbmRlbnRhdGlvbiBydWxlcy4KICBmdW5jdGlvbiBpbmRlbnRKUyhsZXhpY2FsKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oZmlyc3RDaGFycykgewogICAgICB2YXIgZmlyc3RDaGFyID0gZmlyc3RDaGFycyAmJiBmaXJzdENoYXJzLmNoYXJBdCgwKSwgdHlwZSA9IGxleGljYWwudHlwZTsKICAgICAgdmFyIGNsb3NpbmcgPSBmaXJzdENoYXIgPT0gdHlwZTsKICAgICAgaWYgKHR5cGUgPT0gInZhcmRlZiIpCiAgICAgICAgcmV0dXJuIGxleGljYWwuaW5kZW50ZWQgKyA0OwogICAgICBlbHNlIGlmICh0eXBlID09ICJmb3JtIiAmJiBmaXJzdENoYXIgPT0gInsiKQogICAgICAgIHJldHVybiBsZXhpY2FsLmluZGVudGVkOwogICAgICBlbHNlIGlmICh0eXBlID09ICJzdGF0IiB8fCB0eXBlID09ICJmb3JtIikKICAgICAgICByZXR1cm4gbGV4aWNhbC5pbmRlbnRlZCArIGluZGVudFVuaXQ7CiAgICAgIGVsc2UgaWYgKGxleGljYWwuaW5mbyA9PSAic3dpdGNoIiAmJiAhY2xvc2luZykKICAgICAgICByZXR1cm4gbGV4aWNhbC5pbmRlbnRlZCArICgvXig/OmNhc2V8ZGVmYXVsdClcYi8udGVzdChmaXJzdENoYXJzKSA/IGluZGVudFVuaXQgOiAyICogaW5kZW50VW5pdCk7CiAgICAgIGVsc2UgaWYgKGxleGljYWwuYWxpZ24pCiAgICAgICAgcmV0dXJuIGxleGljYWwuY29sdW1uIC0gKGNsb3NpbmcgPyAxIDogMCk7CiAgICAgIGVsc2UKICAgICAgICByZXR1cm4gbGV4aWNhbC5pbmRlbnRlZCArIChjbG9zaW5nID8gMCA6IGluZGVudFVuaXQpOwogICAgfTsKICB9CgogIC8vIFRoZSBwYXJzZXItaXRlcmF0b3ItcHJvZHVjaW5nIGZ1bmN0aW9uIGl0c2VsZi4KICBmdW5jdGlvbiBwYXJzZUpTKGlucHV0LCBiYXNlY29sdW1uKSB7CiAgICAvLyBXcmFwIHRoZSBpbnB1dCBpbiBhIHRva2VuIHN0cmVhbQogICAgdmFyIHRva2VucyA9IHRva2VuaXplSmF2YVNjcmlwdChpbnB1dCk7CiAgICAvLyBUaGUgcGFyc2VyIHN0YXRlLiBjYyBpcyBhIHN0YWNrIG9mIGFjdGlvbnMgdGhhdCBoYXZlIHRvIGJlCiAgICAvLyBwZXJmb3JtZWQgdG8gZmluaXNoIHRoZSBjdXJyZW50IHN0YXRlbWVudC4gRm9yIGV4YW1wbGUgd2UgbWlnaHQKICAgIC8vIGtub3cgdGhhdCB3ZSBzdGlsbCBuZWVkIHRvIGZpbmQgYSBjbG9zaW5nIHBhcmVudGhlc2lzIGFuZCBhCiAgICAvLyBzZW1pY29sb24uIEFjdGlvbnMgYXQgdGhlIGVuZCBvZiB0aGUgc3RhY2sgZ28gZmlyc3QuIEl0IGlzCiAgICAvLyBpbml0aWFsaXplZCB3aXRoIGFuIGluZmluaXRlbHkgbG9vcGluZyBhY3Rpb24gdGhhdCBjb25zdW1lcwogICAgLy8gd2hvbGUgc3RhdGVtZW50cy4KICAgIHZhciBjYyA9IFtqc29uID8gc2luZ2xlRXhwciA6IHN0YXRlbWVudHNdOwogICAgLy8gQ29udGV4dCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBsb2NhbCBzY29wZSwgdGhlCiAgICAvLyB2YXJpYWJsZXMgZGVmaW5lZCBpbiB0aGF0LCBhbmQgdGhlIHNjb3BlcyBhYm92ZSBpdC4KICAgIHZhciBjb250ZXh0ID0gbnVsbDsKICAgIC8vIFRoZSBsZXhpY2FsIHNjb3BlLCB1c2VkIG1vc3RseSBmb3IgaW5kZW50YXRpb24uCiAgICB2YXIgbGV4aWNhbCA9IG5ldyBKU0xleGljYWwoKGJhc2Vjb2x1bW4gfHwgMCkgLSBpbmRlbnRVbml0LCAwLCAiYmxvY2siLCBmYWxzZSk7CiAgICAvLyBDdXJyZW50IGNvbHVtbiwgYW5kIHRoZSBpbmRlbnRhdGlvbiBhdCB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQKICAgIC8vIGxpbmUuIFVzZWQgdG8gY3JlYXRlIGxleGljYWwgc2NvcGUgb2JqZWN0cy4KICAgIHZhciBjb2x1bW4gPSAwOwogICAgdmFyIGluZGVudGVkID0gMDsKICAgIC8vIFZhcmlhYmxlcyB3aGljaCBhcmUgdXNlZCBieSB0aGUgbWFyaywgY29udCwgYW5kIHBhc3MgZnVuY3Rpb25zCiAgICAvLyBiZWxvdyB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBkcml2ZXIgbG9vcCBpbiB0aGUgJ25leHQnCiAgICAvLyBmdW5jdGlvbi4KICAgIHZhciBjb25zdW1lLCBtYXJrZWQ7CiAgCiAgICAvLyBUaGUgaXRlcmF0b3Igb2JqZWN0LgogICAgdmFyIHBhcnNlciA9IHtuZXh0OiBuZXh0LCBjb3B5OiBjb3B5fTsKCiAgICBmdW5jdGlvbiBuZXh0KCl7CiAgICAgIC8vIFN0YXJ0IGJ5IHBlcmZvcm1pbmcgYW55ICdsZXhpY2FsJyBhY3Rpb25zIChhZGp1c3RpbmcgdGhlCiAgICAgIC8vIGxleGljYWwgdmFyaWFibGUpLCBvciB0aGUgb3BlcmF0aW9ucyBiZWxvdyB3aWxsIGJlIHdvcmtpbmcKICAgICAgLy8gd2l0aCB0aGUgd3JvbmcgbGV4aWNhbCBzdGF0ZS4KICAgICAgd2hpbGUoY2NbY2MubGVuZ3RoIC0gMV0ubGV4KQogICAgICAgIGNjLnBvcCgpKCk7CgogICAgICAvLyBGZXRjaCBhIHRva2VuLgogICAgICB2YXIgdG9rZW4gPSB0b2tlbnMubmV4dCgpOwoKICAgICAgLy8gQWRqdXN0IGNvbHVtbiBhbmQgaW5kZW50ZWQuCiAgICAgIGlmICh0b2tlbi50eXBlID09ICJ3aGl0ZXNwYWNlIiAmJiBjb2x1bW4gPT0gMCkKICAgICAgICBpbmRlbnRlZCA9IHRva2VuLnZhbHVlLmxlbmd0aDsKICAgICAgY29sdW1uICs9IHRva2VuLnZhbHVlLmxlbmd0aDsKICAgICAgaWYgKHRva2VuLmNvbnRlbnQgPT0gIlxuIil7CiAgICAgICAgaW5kZW50ZWQgPSBjb2x1bW4gPSAwOwogICAgICAgIC8vIElmIHRoZSBsZXhpY2FsIHNjb3BlJ3MgYWxpZ24gcHJvcGVydHkgaXMgc3RpbGwgdW5kZWZpbmVkIGF0CiAgICAgICAgLy8gdGhlIGVuZCBvZiB0aGUgbGluZSwgaXQgaXMgYW4gdW4tYWxpZ25lZCBzY29wZS4KICAgICAgICBpZiAoISgiYWxpZ24iIGluIGxleGljYWwpKQogICAgICAgICAgbGV4aWNhbC5hbGlnbiA9IGZhbHNlOwogICAgICAgIC8vIE5ld2xpbmUgdG9rZW5zIGdldCBhbiBpbmRlbnRhdGlvbiBmdW5jdGlvbiBhc3NvY2lhdGVkIHdpdGgKICAgICAgICAvLyB0aGVtLgogICAgICAgIHRva2VuLmluZGVudGF0aW9uID0gaW5kZW50SlMobGV4aWNhbCk7CiAgICAgIH0KICAgICAgLy8gTm8gbW9yZSBwcm9jZXNzaW5nIGZvciBtZWFuaW5nbGVzcyB0b2tlbnMuCiAgICAgIGlmICh0b2tlbi50eXBlID09ICJ3aGl0ZXNwYWNlIiB8fCB0b2tlbi50eXBlID09ICJjb21tZW50IikKICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgIC8vIFdoZW4gYSBtZWFuaW5nZnVsIHRva2VuIGlzIGZvdW5kIGFuZCB0aGUgbGV4aWNhbCBzY29wZSdzCiAgICAgIC8vIGFsaWduIGlzIHVuZGVmaW5lZCwgaXQgaXMgYW4gYWxpZ25lZCBzY29wZS4KICAgICAgaWYgKCEoImFsaWduIiBpbiBsZXhpY2FsKSkKICAgICAgICBsZXhpY2FsLmFsaWduID0gdHJ1ZTsKCiAgICAgIC8vIEV4ZWN1dGUgYWN0aW9ucyB1bnRpbCBvbmUgJ2NvbnN1bWVzJyB0aGUgdG9rZW4gYW5kIHdlIGNhbgogICAgICAvLyByZXR1cm4gaXQuCiAgICAgIHdoaWxlKHRydWUpIHsKICAgICAgICBjb25zdW1lID0gbWFya2VkID0gZmFsc2U7CiAgICAgICAgLy8gVGFrZSBhbmQgZXhlY3V0ZSB0aGUgdG9wbW9zdCBhY3Rpb24uCiAgICAgICAgY2MucG9wKCkodG9rZW4udHlwZSwgdG9rZW4uY29udGVudCk7CiAgICAgICAgaWYgKGNvbnN1bWUpewogICAgICAgICAgLy8gTWFya2VkIGlzIHVzZWQgdG8gY2hhbmdlIHRoZSBzdHlsZSBvZiB0aGUgY3VycmVudCB0b2tlbi4KICAgICAgICAgIGlmIChtYXJrZWQpCiAgICAgICAgICAgIHRva2VuLnN0eWxlID0gbWFya2VkOwogICAgICAgICAgLy8gSGVyZSB3ZSBkaWZmZXJlbnRpYXRlIGJldHdlZW4gbG9jYWwgYW5kIGdsb2JhbCB2YXJpYWJsZXMuCiAgICAgICAgICBlbHNlIGlmICh0b2tlbi50eXBlID09ICJ2YXJpYWJsZSIgJiYgaW5TY29wZSh0b2tlbi5jb250ZW50KSkKICAgICAgICAgICAgdG9rZW4uc3R5bGUgPSAianMtbG9jYWx2YXJpYWJsZSI7CiAgICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gVGhpcyBtYWtlcyBhIGNvcHkgb2YgdGhlIHBhcnNlciBzdGF0ZS4gSXQgc3RvcmVzIGFsbCB0aGUKICAgIC8vIHN0YXRlZnVsIHZhcmlhYmxlcyBpbiBhIGNsb3N1cmUsIGFuZCByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdAogICAgLy8gd2lsbCByZXN0b3JlIHRoZW0gd2hlbiBjYWxsZWQgd2l0aCBhIG5ldyBpbnB1dCBzdHJlYW0uIE5vdGUKICAgIC8vIHRoYXQgdGhlIGNjIGFycmF5IGhhcyB0byBiZSBjb3BpZWQsIGJlY2F1c2UgaXQgaXMgY29udGFudGx5CiAgICAvLyBiZWluZyBtb2RpZmllZC4gTGV4aWNhbCBvYmplY3RzIGFyZSBub3QgbXV0YXRlZCwgYW5kIGNvbnRleHQKICAgIC8vIG9iamVjdHMgYXJlIG5vdCBtdXRhdGVkIGluIGEgaGFybWZ1bCB3YXksIHNvIHRoZXkgY2FuIGJlIHNoYXJlZAogICAgLy8gYmV0d2VlbiBydW5zIG9mIHRoZSBwYXJzZXIuCiAgICBmdW5jdGlvbiBjb3B5KCl7CiAgICAgIHZhciBfY29udGV4dCA9IGNvbnRleHQsIF9sZXhpY2FsID0gbGV4aWNhbCwgX2NjID0gY2MuY29uY2F0KFtdKSwgX3Rva2VuU3RhdGUgPSB0b2tlbnMuc3RhdGU7CiAgCiAgICAgIHJldHVybiBmdW5jdGlvbiBjb3B5UGFyc2VyKGlucHV0KXsKICAgICAgICBjb250ZXh0ID0gX2NvbnRleHQ7CiAgICAgICAgbGV4aWNhbCA9IF9sZXhpY2FsOwogICAgICAgIGNjID0gX2NjLmNvbmNhdChbXSk7IC8vIGNvcGllcyB0aGUgYXJyYXkKICAgICAgICBjb2x1bW4gPSBpbmRlbnRlZCA9IDA7CiAgICAgICAgdG9rZW5zID0gdG9rZW5pemVKYXZhU2NyaXB0KGlucHV0LCBfdG9rZW5TdGF0ZSk7CiAgICAgICAgcmV0dXJuIHBhcnNlcjsKICAgICAgfTsKICAgIH0KCiAgICAvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIHB1c2hpbmcgYSBudW1iZXIgb2YgYWN0aW9ucyBvbnRvIHRoZSBjYwogICAgLy8gc3RhY2sgaW4gcmV2ZXJzZSBvcmRlci4KICAgIGZ1bmN0aW9uIHB1c2goZnMpewogICAgICBmb3IgKHZhciBpID0gZnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pCiAgICAgICAgY2MucHVzaChmc1tpXSk7CiAgICB9CiAgICAvLyBjb250IGFuZCBwYXNzIGFyZSB1c2VkIGJ5IHRoZSBhY3Rpb24gZnVuY3Rpb25zIHRvIGFkZCBvdGhlcgogICAgLy8gYWN0aW9ucyB0byB0aGUgc3RhY2suIGNvbnQgd2lsbCBjYXVzZSB0aGUgY3VycmVudCB0b2tlbiB0byBiZQogICAgLy8gY29uc3VtZWQsIHBhc3Mgd2lsbCBsZWF2ZSBpdCBmb3IgdGhlIG5leHQgYWN0aW9uLgogICAgZnVuY3Rpb24gY29udCgpewogICAgICBwdXNoKGFyZ3VtZW50cyk7CiAgICAgIGNvbnN1bWUgPSB0cnVlOwogICAgfQogICAgZnVuY3Rpb24gcGFzcygpewogICAgICBwdXNoKGFyZ3VtZW50cyk7CiAgICAgIGNvbnN1bWUgPSBmYWxzZTsKICAgIH0KICAgIC8vIFVzZWQgdG8gY2hhbmdlIHRoZSBzdHlsZSBvZiB0aGUgY3VycmVudCB0b2tlbi4KICAgIGZ1bmN0aW9uIG1hcmsoc3R5bGUpewogICAgICBtYXJrZWQgPSBzdHlsZTsKICAgIH0KCiAgICAvLyBQdXNoIGEgbmV3IHNjb3BlLiBXaWxsIGF1dG9tYXRpY2FsbHkgbGluayB0aGUgY3VycmVudCBzY29wZS4KICAgIGZ1bmN0aW9uIHB1c2hjb250ZXh0KCl7CiAgICAgIGNvbnRleHQgPSB7cHJldjogY29udGV4dCwgdmFyczogeyJ0aGlzIjogdHJ1ZSwgImFyZ3VtZW50cyI6IHRydWV9fTsKICAgIH0KICAgIC8vIFBvcCBvZmYgdGhlIGN1cnJlbnQgc2NvcGUuCiAgICBmdW5jdGlvbiBwb3Bjb250ZXh0KCl7CiAgICAgIGNvbnRleHQgPSBjb250ZXh0LnByZXY7CiAgICB9CiAgICAvLyBSZWdpc3RlciBhIHZhcmlhYmxlIGluIHRoZSBjdXJyZW50IHNjb3BlLgogICAgZnVuY3Rpb24gcmVnaXN0ZXIodmFybmFtZSl7CiAgICAgIGlmIChjb250ZXh0KXsKICAgICAgICBtYXJrKCJqcy12YXJpYWJsZWRlZiIpOwogICAgICAgIGNvbnRleHQudmFyc1t2YXJuYW1lXSA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIC8vIENoZWNrIHdoZXRoZXIgYSB2YXJpYWJsZSBpcyBkZWZpbmVkIGluIHRoZSBjdXJyZW50IHNjb3BlLgogICAgZnVuY3Rpb24gaW5TY29wZSh2YXJuYW1lKXsKICAgICAgdmFyIGN1cnNvciA9IGNvbnRleHQ7CiAgICAgIHdoaWxlIChjdXJzb3IpIHsKICAgICAgICBpZiAoY3Vyc29yLnZhcnNbdmFybmFtZV0pCiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICBjdXJzb3IgPSBjdXJzb3IucHJldjsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgCiAgICAvLyBQdXNoIGEgbmV3IGxleGljYWwgY29udGV4dCBvZiB0aGUgZ2l2ZW4gdHlwZS4KICAgIGZ1bmN0aW9uIHB1c2hsZXgodHlwZSwgaW5mbykgewogICAgICB2YXIgcmVzdWx0ID0gZnVuY3Rpb24oKXsKICAgICAgICBsZXhpY2FsID0gbmV3IEpTTGV4aWNhbChpbmRlbnRlZCwgY29sdW1uLCB0eXBlLCBudWxsLCBsZXhpY2FsLCBpbmZvKQogICAgICB9OwogICAgICByZXN1bHQubGV4ID0gdHJ1ZTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIC8vIFBvcCBvZmYgdGhlIGN1cnJlbnQgbGV4aWNhbCBjb250ZXh0LgogICAgZnVuY3Rpb24gcG9wbGV4KCl7CiAgICAgIGxleGljYWwgPSBsZXhpY2FsLnByZXY7CiAgICB9CiAgICBwb3BsZXgubGV4ID0gdHJ1ZTsKICAgIC8vIFRoZSAnbGV4JyBmbGFnIG9uIHRoZXNlIGFjdGlvbnMgaXMgdXNlZCBieSB0aGUgJ25leHQnIGZ1bmN0aW9uCiAgICAvLyB0byBrbm93IHRoZXkgY2FuIChhbmQgaGF2ZSB0bykgYmUgcmFuIGJlZm9yZSBtb3Zpbmcgb24gdG8gdGhlCiAgICAvLyBuZXh0IHRva2VuLgogIAogICAgLy8gQ3JlYXRlcyBhbiBhY3Rpb24gdGhhdCBkaXNjYXJkcyB0b2tlbnMgdW50aWwgaXQgZmluZHMgb25lIG9mCiAgICAvLyB0aGUgZ2l2ZW4gdHlwZS4KICAgIGZ1bmN0aW9uIGV4cGVjdCh3YW50ZWQpewogICAgICByZXR1cm4gZnVuY3Rpb24gZXhwZWN0aW5nKHR5cGUpewogICAgICAgIGlmICh0eXBlID09IHdhbnRlZCkgY29udCgpOwogICAgICAgIGVsc2UgY29udChhcmd1bWVudHMuY2FsbGVlKTsKICAgICAgfTsKICAgIH0KCiAgICAvLyBMb29rcyBmb3IgYSBzdGF0ZW1lbnQsIGFuZCB0aGVuIGNhbGxzIGl0c2VsZi4KICAgIGZ1bmN0aW9uIHN0YXRlbWVudHModHlwZSl7CiAgICAgIHJldHVybiBwYXNzKHN0YXRlbWVudCwgc3RhdGVtZW50cyk7CiAgICB9CiAgICBmdW5jdGlvbiBzaW5nbGVFeHByKHR5cGUpewogICAgICByZXR1cm4gcGFzcyhleHByZXNzaW9uLCBzdGF0ZW1lbnRzKTsKICAgIH0KICAgIC8vIERpc3BhdGNoZXMgdmFyaW91cyB0eXBlcyBvZiBzdGF0ZW1lbnRzIGJhc2VkIG9uIHRoZSB0eXBlIG9mIHRoZQogICAgLy8gY3VycmVudCB0b2tlbi4KICAgIGZ1bmN0aW9uIHN0YXRlbWVudCh0eXBlKXsKICAgICAgaWYgKHR5cGUgPT0gInZhciIpIGNvbnQocHVzaGxleCgidmFyZGVmIiksIHZhcmRlZjEsIGV4cGVjdCgiOyIpLCBwb3BsZXgpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJrZXl3b3JkIGEiKSBjb250KHB1c2hsZXgoImZvcm0iKSwgZXhwcmVzc2lvbiwgc3RhdGVtZW50LCBwb3BsZXgpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJrZXl3b3JkIGIiKSBjb250KHB1c2hsZXgoImZvcm0iKSwgc3RhdGVtZW50LCBwb3BsZXgpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJ7IikgY29udChwdXNobGV4KCJ9IiksIGJsb2NrLCBwb3BsZXgpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJmdW5jdGlvbiIpIGNvbnQoZnVuY3Rpb25kZWYpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJmb3IiKSBjb250KHB1c2hsZXgoImZvcm0iKSwgZXhwZWN0KCIoIiksIHB1c2hsZXgoIikiKSwgZm9yc3BlYzEsIGV4cGVjdCgiKSIpLCBwb3BsZXgsIHN0YXRlbWVudCwgcG9wbGV4KTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAidmFyaWFibGUiKSBjb250KHB1c2hsZXgoInN0YXQiKSwgbWF5YmVsYWJlbCk7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gInN3aXRjaCIpIGNvbnQocHVzaGxleCgiZm9ybSIpLCBleHByZXNzaW9uLCBwdXNobGV4KCJ9IiwgInN3aXRjaCIpLCBleHBlY3QoInsiKSwgYmxvY2ssIHBvcGxleCwgcG9wbGV4KTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiY2FzZSIpIGNvbnQoZXhwcmVzc2lvbiwgZXhwZWN0KCI6IikpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJkZWZhdWx0IikgY29udChleHBlY3QoIjoiKSk7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImNhdGNoIikgY29udChwdXNobGV4KCJmb3JtIiksIHB1c2hjb250ZXh0LCBleHBlY3QoIigiKSwgZnVuYXJnLCBleHBlY3QoIikiKSwgc3RhdGVtZW50LCBwb3BsZXgsIHBvcGNvbnRleHQpOwogICAgICBlbHNlIHBhc3MocHVzaGxleCgic3RhdCIpLCBleHByZXNzaW9uLCBleHBlY3QoIjsiKSwgcG9wbGV4KTsKICAgIH0KICAgIC8vIERpc3BhdGNoIGV4cHJlc3Npb24gdHlwZXMuCiAgICBmdW5jdGlvbiBleHByZXNzaW9uKHR5cGUpewogICAgICBpZiAoYXRvbWljVHlwZXMuaGFzT3duUHJvcGVydHkodHlwZSkpIGNvbnQobWF5YmVvcGVyYXRvcik7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImZ1bmN0aW9uIikgY29udChmdW5jdGlvbmRlZik7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImtleXdvcmQgYyIpIGNvbnQoZXhwcmVzc2lvbik7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIigiKSBjb250KHB1c2hsZXgoIikiKSwgZXhwcmVzc2lvbiwgZXhwZWN0KCIpIiksIHBvcGxleCwgbWF5YmVvcGVyYXRvcik7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIm9wZXJhdG9yIikgY29udChleHByZXNzaW9uKTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiWyIpIGNvbnQocHVzaGxleCgiXSIpLCBjb21tYXNlcChleHByZXNzaW9uLCAiXSIpLCBwb3BsZXgsIG1heWJlb3BlcmF0b3IpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJ7IikgY29udChwdXNobGV4KCJ9IiksIGNvbW1hc2VwKG9ianByb3AsICJ9IiksIHBvcGxleCwgbWF5YmVvcGVyYXRvcik7CiAgICB9CiAgICAvLyBDYWxsZWQgZm9yIHBsYWNlcyB3aGVyZSBvcGVyYXRvcnMsIGZ1bmN0aW9uIGNhbGxzLCBvcgogICAgLy8gc3Vic2NyaXB0cyBhcmUgdmFsaWQuIFdpbGwgc2tpcCBvbiB0byB0aGUgbmV4dCBhY3Rpb24gaWYgbm9uZQogICAgLy8gaXMgZm91bmQuCiAgICBmdW5jdGlvbiBtYXliZW9wZXJhdG9yKHR5cGUpewogICAgICBpZiAodHlwZSA9PSAib3BlcmF0b3IiKSBjb250KGV4cHJlc3Npb24pOwogICAgICBlbHNlIGlmICh0eXBlID09ICIoIikgY29udChwdXNobGV4KCIpIiksIGV4cHJlc3Npb24sIGNvbW1hc2VwKGV4cHJlc3Npb24sICIpIiksIHBvcGxleCwgbWF5YmVvcGVyYXRvcik7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIi4iKSBjb250KHByb3BlcnR5LCBtYXliZW9wZXJhdG9yKTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiWyIpIGNvbnQocHVzaGxleCgiXSIpLCBleHByZXNzaW9uLCBleHBlY3QoIl0iKSwgcG9wbGV4LCBtYXliZW9wZXJhdG9yKTsKICAgIH0KICAgIC8vIFdoZW4gYSBzdGF0ZW1lbnQgc3RhcnRzIHdpdGggYSB2YXJpYWJsZSBuYW1lLCBpdCBtaWdodCBiZSBhCiAgICAvLyBsYWJlbC4gSWYgbm8gY29sb24gZm9sbG93cywgaXQncyBhIHJlZ3VsYXIgc3RhdGVtZW50LgogICAgZnVuY3Rpb24gbWF5YmVsYWJlbCh0eXBlKXsKICAgICAgaWYgKHR5cGUgPT0gIjoiKSBjb250KHBvcGxleCwgc3RhdGVtZW50KTsKICAgICAgZWxzZSBwYXNzKG1heWJlb3BlcmF0b3IsIGV4cGVjdCgiOyIpLCBwb3BsZXgpOwogICAgfQogICAgLy8gUHJvcGVydHkgbmFtZXMgbmVlZCB0byBoYXZlIHRoZWlyIHN0eWxlIGFkanVzdGVkIC0tIHRoZQogICAgLy8gdG9rZW5pemVyIHRoaW5rcyB0aGV5IGFyZSB2YXJpYWJsZXMuCiAgICBmdW5jdGlvbiBwcm9wZXJ0eSh0eXBlKXsKICAgICAgaWYgKHR5cGUgPT0gInZhcmlhYmxlIikge21hcmsoImpzLXByb3BlcnR5Iik7IGNvbnQoKTt9CiAgICB9CiAgICAvLyBUaGlzIHBhcnNlcyBhIHByb3BlcnR5IGFuZCBpdHMgdmFsdWUgaW4gYW4gb2JqZWN0IGxpdGVyYWwuCiAgICBmdW5jdGlvbiBvYmpwcm9wKHR5cGUpewogICAgICBpZiAodHlwZSA9PSAidmFyaWFibGUiKSBtYXJrKCJqcy1wcm9wZXJ0eSIpOwogICAgICBpZiAoYXRvbWljVHlwZXMuaGFzT3duUHJvcGVydHkodHlwZSkpIGNvbnQoZXhwZWN0KCI6IiksIGV4cHJlc3Npb24pOwogICAgfQogICAgLy8gUGFyc2VzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIHRoaW5ncyB0aGF0IGFyZSByZWNvZ25pemVkCiAgICAvLyBieSB0aGUgJ3doYXQnIGFyZ3VtZW50LgogICAgZnVuY3Rpb24gY29tbWFzZXAod2hhdCwgZW5kKXsKICAgICAgZnVuY3Rpb24gcHJvY2VlZCh0eXBlKSB7CiAgICAgICAgaWYgKHR5cGUgPT0gIiwiKSBjb250KHdoYXQsIHByb2NlZWQpOwogICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gZW5kKSBjb250KCk7CiAgICAgICAgZWxzZSBjb250KGV4cGVjdChlbmQpKTsKICAgICAgfQogICAgICByZXR1cm4gZnVuY3Rpb24gY29tbWFTZXBhcmF0ZWQodHlwZSkgewogICAgICAgIGlmICh0eXBlID09IGVuZCkgY29udCgpOwogICAgICAgIGVsc2UgcGFzcyh3aGF0LCBwcm9jZWVkKTsKICAgICAgfTsKICAgIH0KICAgIC8vIExvb2sgZm9yIHN0YXRlbWVudHMgdW50aWwgYSBjbG9zaW5nIGJyYWNlIGlzIGZvdW5kLgogICAgZnVuY3Rpb24gYmxvY2sodHlwZSl7CiAgICAgIGlmICh0eXBlID09ICJ9IikgY29udCgpOwogICAgICBlbHNlIHBhc3Moc3RhdGVtZW50LCBibG9jayk7CiAgICB9CiAgICAvLyBWYXJpYWJsZSBkZWZpbml0aW9ucyBhcmUgc3BsaXQgaW50byB0d28gYWN0aW9ucyAtLSAxIGxvb2tzIGZvcgogICAgLy8gYSBuYW1lIG9yIHRoZSBlbmQgb2YgdGhlIGRlZmluaXRpb24sIDIgbG9va3MgZm9yIGFuICc9JyBzaWduIG9yCiAgICAvLyBhIGNvbW1hLgogICAgZnVuY3Rpb24gdmFyZGVmMSh0eXBlLCB2YWx1ZSl7CiAgICAgIGlmICh0eXBlID09ICJ2YXJpYWJsZSIpe3JlZ2lzdGVyKHZhbHVlKTsgY29udCh2YXJkZWYyKTt9CiAgICAgIGVsc2UgY29udCgpOwogICAgfQogICAgZnVuY3Rpb24gdmFyZGVmMih0eXBlLCB2YWx1ZSl7CiAgICAgIGlmICh2YWx1ZSA9PSAiPSIpIGNvbnQoZXhwcmVzc2lvbiwgdmFyZGVmMik7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIiwiKSBjb250KHZhcmRlZjEpOwogICAgfQogICAgLy8gRm9yIGxvb3BzLgogICAgZnVuY3Rpb24gZm9yc3BlYzEodHlwZSl7CiAgICAgIGlmICh0eXBlID09ICJ2YXIiKSBjb250KHZhcmRlZjEsIGZvcnNwZWMyKTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiOyIpIHBhc3MoZm9yc3BlYzIpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJ2YXJpYWJsZSIpIGNvbnQoZm9ybWF5YmVpbik7CiAgICAgIGVsc2UgcGFzcyhmb3JzcGVjMik7CiAgICB9CiAgICBmdW5jdGlvbiBmb3JtYXliZWluKHR5cGUsIHZhbHVlKXsKICAgICAgaWYgKHZhbHVlID09ICJpbiIpIGNvbnQoZXhwcmVzc2lvbik7CiAgICAgIGVsc2UgY29udChtYXliZW9wZXJhdG9yLCBmb3JzcGVjMik7CiAgICB9CiAgICBmdW5jdGlvbiBmb3JzcGVjMih0eXBlLCB2YWx1ZSl7CiAgICAgIGlmICh0eXBlID09ICI7IikgY29udChmb3JzcGVjMyk7CiAgICAgIGVsc2UgaWYgKHZhbHVlID09ICJpbiIpIGNvbnQoZXhwcmVzc2lvbik7CiAgICAgIGVsc2UgY29udChleHByZXNzaW9uLCBleHBlY3QoIjsiKSwgZm9yc3BlYzMpOwogICAgfQogICAgZnVuY3Rpb24gZm9yc3BlYzModHlwZSkgewogICAgICBpZiAodHlwZSA9PSAiKSIpIHBhc3MoKTsKICAgICAgZWxzZSBjb250KGV4cHJlc3Npb24pOwogICAgfQogICAgLy8gQSBmdW5jdGlvbiBkZWZpbml0aW9uIGNyZWF0ZXMgYSBuZXcgY29udGV4dCwgYW5kIHRoZSB2YXJpYWJsZXMKICAgIC8vIGluIGl0cyBhcmd1bWVudCBsaXN0IGhhdmUgdG8gYmUgYWRkZWQgdG8gdGhpcyBjb250ZXh0LgogICAgZnVuY3Rpb24gZnVuY3Rpb25kZWYodHlwZSwgdmFsdWUpewogICAgICBpZiAodHlwZSA9PSAidmFyaWFibGUiKXtyZWdpc3Rlcih2YWx1ZSk7IGNvbnQoZnVuY3Rpb25kZWYpO30KICAgICAgZWxzZSBpZiAodHlwZSA9PSAiKCIpIGNvbnQocHVzaGNvbnRleHQsIGNvbW1hc2VwKGZ1bmFyZywgIikiKSwgc3RhdGVtZW50LCBwb3Bjb250ZXh0KTsKICAgIH0KICAgIGZ1bmN0aW9uIGZ1bmFyZyh0eXBlLCB2YWx1ZSl7CiAgICAgIGlmICh0eXBlID09ICJ2YXJpYWJsZSIpe3JlZ2lzdGVyKHZhbHVlKTsgY29udCgpO30KICAgIH0KICAKICAgIHJldHVybiBwYXJzZXI7CiAgfQoKICByZXR1cm4gewogICAgbWFrZTogcGFyc2VKUywKICAgIGVsZWN0cmljQ2hhcnM6ICJ7fToiLAogICAgY29uZmlndXJlOiBmdW5jdGlvbihvYmopIHsKICAgICAgaWYgKG9iai5qc29uICE9IG51bGwpIGpzb24gPSBvYmouanNvbjsKICAgIH0KICB9Owp9KSgpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/parsesparql.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dmFyIFNwYXJxbFBhcnNlciA9IEVkaXRvci5QYXJzZXIgPSAoZnVuY3Rpb24oKSB7CiAgZnVuY3Rpb24gd29yZFJlZ2V4cCh3b3JkcykgewogICAgcmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiICsgd29yZHMuam9pbigifCIpICsgIikkIiwgImkiKTsKICB9CiAgdmFyIG9wcyA9IHdvcmRSZWdleHAoWyJzdHIiLCAibGFuZyIsICJsYW5nbWF0Y2hlcyIsICJkYXRhdHlwZSIsICJib3VuZCIsICJzYW1ldGVybSIsICJpc2lyaSIsICJpc3VyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJpc2JsYW5rIiwgImlzbGl0ZXJhbCIsICJ1bmlvbiIsICJhIl0pOwogIHZhciBrZXl3b3JkcyA9IHdvcmRSZWdleHAoWyJiYXNlIiwgInByZWZpeCIsICJzZWxlY3QiLCAiZGlzdGluY3QiLCAicmVkdWNlZCIsICJjb25zdHJ1Y3QiLCAiZGVzY3JpYmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhc2siLCAiZnJvbSIsICJuYW1lZCIsICJ3aGVyZSIsICJvcmRlciIsICJsaW1pdCIsICJvZmZzZXQiLCAiZmlsdGVyIiwgIm9wdGlvbmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3JhcGgiLCAiYnkiLCAiYXNjIiwgImRlc2MiLCBdKTsKICB2YXIgb3BlcmF0b3JDaGFycyA9IC9bKitcLTw+PSZ8XS87CgogIHZhciB0b2tlbml6ZVNwYXJxbCA9IChmdW5jdGlvbigpIHsKICAgIGZ1bmN0aW9uIG5vcm1hbChzb3VyY2UsIHNldFN0YXRlKSB7CiAgICAgIHZhciBjaCA9IHNvdXJjZS5uZXh0KCk7CiAgICAgIGlmIChjaCA9PSAiJCIgfHwgY2ggPT0gIj8iKSB7CiAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1tcd1xkXS8pOwogICAgICAgIHJldHVybiAic3AtdmFyIjsKICAgICAgfQogICAgICBlbHNlIGlmIChjaCA9PSAiPCIgJiYgIXNvdXJjZS5tYXRjaGVzKC9bXHNcdTAwYTA9XS8pKSB7CiAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1teXHNcdTAwYTA+XS8pOwogICAgICAgIGlmIChzb3VyY2UuZXF1YWxzKCI+IikpIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgcmV0dXJuICJzcC11cmkiOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGNoID09ICJcIiIgfHwgY2ggPT0gIiciKSB7CiAgICAgICAgc2V0U3RhdGUoaW5MaXRlcmFsKGNoKSk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoL1t7fVwoXCksXC47XFtcXV0vLnRlc3QoY2gpKSB7CiAgICAgICAgcmV0dXJuICJzcC1wdW5jIjsKICAgICAgfQogICAgICBlbHNlIGlmIChjaCA9PSAiIyIpIHsKICAgICAgICB3aGlsZSAoIXNvdXJjZS5lbmRPZkxpbmUoKSkgc291cmNlLm5leHQoKTsKICAgICAgICByZXR1cm4gInNwLWNvbW1lbnQiOwogICAgICB9CiAgICAgIGVsc2UgaWYgKG9wZXJhdG9yQ2hhcnMudGVzdChjaCkpIHsKICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcyhvcGVyYXRvckNoYXJzKTsKICAgICAgICByZXR1cm4gInNwLW9wZXJhdG9yIjsKICAgICAgfQogICAgICBlbHNlIGlmIChjaCA9PSAiOiIpIHsKICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvW1x3XGRcLl9cLV0vKTsKICAgICAgICByZXR1cm4gInNwLXByZWZpeGVkIjsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvW19cd1xkXS8pOwogICAgICAgIGlmIChzb3VyY2UuZXF1YWxzKCI6IikpIHsKICAgICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvW1x3XGRfXC1dLyk7CiAgICAgICAgICByZXR1cm4gInNwLXByZWZpeGVkIjsKICAgICAgICB9CiAgICAgICAgdmFyIHdvcmQgPSBzb3VyY2UuZ2V0KCksIHR5cGU7CiAgICAgICAgaWYgKG9wcy50ZXN0KHdvcmQpKQogICAgICAgICAgdHlwZSA9ICJzcC1vcGVyYXRvciI7CiAgICAgICAgZWxzZSBpZiAoa2V5d29yZHMudGVzdCh3b3JkKSkKICAgICAgICAgIHR5cGUgPSAic3Ata2V5d29yZCI7CiAgICAgICAgZWxzZQogICAgICAgICAgdHlwZSA9ICJzcC13b3JkIjsKICAgICAgICByZXR1cm4ge3N0eWxlOiB0eXBlLCBjb250ZW50OiB3b3JkfTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGluTGl0ZXJhbChxdW90ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlLCBzZXRTdGF0ZSkgewogICAgICAgIHZhciBlc2NhcGVkID0gZmFsc2U7CiAgICAgICAgd2hpbGUgKCFzb3VyY2UuZW5kT2ZMaW5lKCkpIHsKICAgICAgICAgIHZhciBjaCA9IHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICBpZiAoY2ggPT0gcXVvdGUgJiYgIWVzY2FwZWQpIHsKICAgICAgICAgICAgc2V0U3RhdGUobm9ybWFsKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgY2ggPT0gIlxcIjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICJzcC1saXRlcmFsIjsKICAgICAgfTsKICAgIH0KCiAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlLCBzdGFydFN0YXRlKSB7CiAgICAgIHJldHVybiB0b2tlbml6ZXIoc291cmNlLCBzdGFydFN0YXRlIHx8IG5vcm1hbCk7CiAgICB9OwogIH0pKCk7CgogIGZ1bmN0aW9uIGluZGVudFNwYXJxbChjb250ZXh0KSB7CiAgICByZXR1cm4gZnVuY3Rpb24obmV4dENoYXJzKSB7CiAgICAgIHZhciBmaXJzdENoYXIgPSBuZXh0Q2hhcnMgJiYgbmV4dENoYXJzLmNoYXJBdCgwKTsKICAgICAgaWYgKC9bXF1cfV0vLnRlc3QoZmlyc3RDaGFyKSkKICAgICAgICB3aGlsZSAoY29udGV4dCAmJiBjb250ZXh0LnR5cGUgPT0gInBhdHRlcm4iKSBjb250ZXh0ID0gY29udGV4dC5wcmV2OwoKICAgICAgdmFyIGNsb3NpbmcgPSBjb250ZXh0ICYmIGZpcnN0Q2hhciA9PSBtYXRjaGluZ1tjb250ZXh0LnR5cGVdOwogICAgICBpZiAoIWNvbnRleHQpCiAgICAgICAgcmV0dXJuIDA7CiAgICAgIGVsc2UgaWYgKGNvbnRleHQudHlwZSA9PSAicGF0dGVybiIpCiAgICAgICAgcmV0dXJuIGNvbnRleHQuY29sOwogICAgICBlbHNlIGlmIChjb250ZXh0LmFsaWduKQogICAgICAgIHJldHVybiBjb250ZXh0LmNvbCAtIChjbG9zaW5nID8gY29udGV4dC53aWR0aCA6IDApOwogICAgICBlbHNlCiAgICAgICAgcmV0dXJuIGNvbnRleHQuaW5kZW50ICsgKGNsb3NpbmcgPyAwIDogaW5kZW50VW5pdCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBwYXJzZVNwYXJxbChzb3VyY2UpIHsKICAgIHZhciB0b2tlbnMgPSB0b2tlbml6ZVNwYXJxbChzb3VyY2UpOwogICAgdmFyIGNvbnRleHQgPSBudWxsLCBpbmRlbnQgPSAwLCBjb2wgPSAwOwogICAgZnVuY3Rpb24gcHVzaENvbnRleHQodHlwZSwgd2lkdGgpIHsKICAgICAgY29udGV4dCA9IHtwcmV2OiBjb250ZXh0LCBpbmRlbnQ6IGluZGVudCwgY29sOiBjb2wsIHR5cGU6IHR5cGUsIHdpZHRoOiB3aWR0aH07CiAgICB9CiAgICBmdW5jdGlvbiBwb3BDb250ZXh0KCkgewogICAgICBjb250ZXh0ID0gY29udGV4dC5wcmV2OwogICAgfQoKICAgIHZhciBpdGVyID0gewogICAgICBuZXh0OiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnMubmV4dCgpLCB0eXBlID0gdG9rZW4uc3R5bGUsIGNvbnRlbnQgPSB0b2tlbi5jb250ZW50LCB3aWR0aCA9IHRva2VuLnZhbHVlLmxlbmd0aDsKCiAgICAgICAgaWYgKGNvbnRlbnQgPT0gIlxuIikgewogICAgICAgICAgdG9rZW4uaW5kZW50YXRpb24gPSBpbmRlbnRTcGFycWwoY29udGV4dCk7CiAgICAgICAgICBpbmRlbnQgPSBjb2wgPSAwOwogICAgICAgICAgaWYgKGNvbnRleHQgJiYgY29udGV4dC5hbGlnbiA9PSBudWxsKSBjb250ZXh0LmFsaWduID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIndoaXRlc3BhY2UiICYmIGNvbCA9PSAwKSB7CiAgICAgICAgICBpbmRlbnQgPSB3aWR0aDsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodHlwZSAhPSAic3AtY29tbWVudCIgJiYgY29udGV4dCAmJiBjb250ZXh0LmFsaWduID09IG51bGwpIHsKICAgICAgICAgIGNvbnRleHQuYWxpZ24gPSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKGNvbnRlbnQgIT0gIlxuIikgY29sICs9IHdpZHRoOwoKICAgICAgICBpZiAoL1tcW1x7XChdLy50ZXN0KGNvbnRlbnQpKSB7CiAgICAgICAgICBwdXNoQ29udGV4dChjb250ZW50LCB3aWR0aCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKC9bXF1cfVwpXS8udGVzdChjb250ZW50KSkgewogICAgICAgICAgd2hpbGUgKGNvbnRleHQgJiYgY29udGV4dC50eXBlID09ICJwYXR0ZXJuIikKICAgICAgICAgICAgcG9wQ29udGV4dCgpOwogICAgICAgICAgaWYgKGNvbnRleHQgJiYgY29udGVudCA9PSBtYXRjaGluZ1tjb250ZXh0LnR5cGVdKQogICAgICAgICAgICBwb3BDb250ZXh0KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGNvbnRlbnQgPT0gIi4iICYmIGNvbnRleHQgJiYgY29udGV4dC50eXBlID09ICJwYXR0ZXJuIikgewogICAgICAgICAgcG9wQ29udGV4dCgpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICgodHlwZSA9PSAic3Atd29yZCIgfHwgdHlwZSA9PSAic3AtcHJlZml4ZWQiIHx8IHR5cGUgPT0gInNwLXVyaSIgfHwgdHlwZSA9PSAic3AtdmFyIiB8fCB0eXBlID09ICJzcC1saXRlcmFsIikgJiYKICAgICAgICAgICAgICAgICBjb250ZXh0ICYmIC9bXHtcW10vLnRlc3QoY29udGV4dC50eXBlKSkgewogICAgICAgICAgcHVzaENvbnRleHQoInBhdHRlcm4iLCB3aWR0aCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgIH0sCgogICAgICBjb3B5OiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgX2NvbnRleHQgPSBjb250ZXh0LCBfaW5kZW50ID0gaW5kZW50LCBfY29sID0gY29sLCBfdG9rZW5TdGF0ZSA9IHRva2Vucy5zdGF0ZTsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlKSB7CiAgICAgICAgICB0b2tlbnMgPSB0b2tlbml6ZVNwYXJxbChzb3VyY2UsIF90b2tlblN0YXRlKTsKICAgICAgICAgIGNvbnRleHQgPSBfY29udGV4dDsKICAgICAgICAgIGluZGVudCA9IF9pbmRlbnQ7CiAgICAgICAgICBjb2wgPSBfY29sOwogICAgICAgICAgcmV0dXJuIGl0ZXI7CiAgICAgICAgfTsKICAgICAgfQogICAgfTsKICAgIHJldHVybiBpdGVyOwogIH0KCiAgcmV0dXJuIHttYWtlOiBwYXJzZVNwYXJxbCwgZWxlY3RyaWNDaGFyczogIn1dIn07Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/parsexml.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogVGhpcyBmaWxlIGRlZmluZXMgYW4gWE1MIHBhcnNlciwgd2l0aCBhIGZldyBrbHVkZ2VzIHRvIG1ha2UgaXQKICogdXNlYWJsZSBmb3IgSFRNTC4gYXV0b1NlbGZDbG9zZXJzIGRlZmluZXMgYSBzZXQgb2YgdGFnIG5hbWVzIHRoYXQKICogYXJlIGV4cGVjdGVkIHRvIG5vdCBoYXZlIGEgY2xvc2luZyB0YWcsIGFuZCBkb05vdEluZGVudCBzcGVjaWZpZXMKICogdGhlIHRhZ3MgaW5zaWRlIG9mIHdoaWNoIG5vIGluZGVudGF0aW9uIHNob3VsZCBoYXBwZW4gKHNlZSBDb25maWcKICogb2JqZWN0KS4gVGhlc2UgY2FuIGJlIGRpc2FibGVkIGJ5IHBhc3NpbmcgdGhlIGVkaXRvciBhbiBvYmplY3QgbGlrZQogKiB7dXNlSFRNTEtsdWRnZXM6IGZhbHNlfSBhcyBwYXJzZXJDb25maWcgb3B0aW9uLgogKi8KCnZhciBYTUxQYXJzZXIgPSBFZGl0b3IuUGFyc2VyID0gKGZ1bmN0aW9uKCkgewogIHZhciBLbHVkZ2VzID0gewogICAgYXV0b1NlbGZDbG9zZXJzOiB7ImJyIjogdHJ1ZSwgImltZyI6IHRydWUsICJociI6IHRydWUsICJsaW5rIjogdHJ1ZSwgImlucHV0IjogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICJtZXRhIjogdHJ1ZSwgImNvbCI6IHRydWUsICJmcmFtZSI6IHRydWUsICJiYXNlIjogdHJ1ZSwgImFyZWEiOiB0cnVlfSwKICAgIGRvTm90SW5kZW50OiB7InByZSI6IHRydWUsICIhY2RhdGEiOiB0cnVlfQogIH07CiAgdmFyIE5vS2x1ZGdlcyA9IHthdXRvU2VsZkNsb3NlcnM6IHt9LCBkb05vdEluZGVudDogeyIhY2RhdGEiOiB0cnVlfX07CiAgdmFyIFVzZUtsdWRnZXMgPSBLbHVkZ2VzOwogIHZhciBhbGlnbkNEQVRBID0gZmFsc2U7CgogIC8vIFNpbXBsZSBzdGF0ZWZ1bCB0b2tlbml6ZXIgZm9yIFhNTCBkb2N1bWVudHMuIFJldHVybnMgYQogIC8vIE1vY2hpS2l0LXN0eWxlIGl0ZXJhdG9yLCB3aXRoIGEgc3RhdGUgcHJvcGVydHkgdGhhdCBjb250YWlucyBhCiAgLy8gZnVuY3Rpb24gZW5jYXBzdWxhdGluZyB0aGUgY3VycmVudCBzdGF0ZS4gU2VlIHRva2VuaXplLmpzLgogIHZhciB0b2tlbml6ZVhNTCA9IChmdW5jdGlvbigpIHsKICAgIGZ1bmN0aW9uIGluVGV4dChzb3VyY2UsIHNldFN0YXRlKSB7CiAgICAgIHZhciBjaCA9IHNvdXJjZS5uZXh0KCk7CiAgICAgIGlmIChjaCA9PSAiPCIpIHsKICAgICAgICBpZiAoc291cmNlLmVxdWFscygiISIpKSB7CiAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgICAgaWYgKHNvdXJjZS5lcXVhbHMoIlsiKSkgewogICAgICAgICAgICBpZiAoc291cmNlLmxvb2tBaGVhZCgiW0NEQVRBWyIsIHRydWUpKSB7CiAgICAgICAgICAgICAgc2V0U3RhdGUoaW5CbG9jaygieG1sLWNkYXRhIiwgIl1dPiIpKTsKICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICByZXR1cm4gInhtbC10ZXh0IjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgZWxzZSBpZiAoc291cmNlLmxvb2tBaGVhZCgiLS0iLCB0cnVlKSkgewogICAgICAgICAgICBzZXRTdGF0ZShpbkJsb2NrKCJ4bWwtY29tbWVudCIsICItLT4iKSk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAieG1sLXRleHQiOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChzb3VyY2UuZXF1YWxzKCI/IikpIHsKICAgICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvW1x3XC5fXC1dLyk7CiAgICAgICAgICBzZXRTdGF0ZShpbkJsb2NrKCJ4bWwtcHJvY2Vzc2luZyIsICI/PiIpKTsKICAgICAgICAgIHJldHVybiAieG1sLXByb2Nlc3NpbmciOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIGlmIChzb3VyY2UuZXF1YWxzKCIvIikpIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICBzZXRTdGF0ZShpblRhZyk7CiAgICAgICAgICByZXR1cm4gInhtbC1wdW5jdHVhdGlvbiI7CiAgICAgICAgfQogICAgICB9CiAgICAgIGVsc2UgaWYgKGNoID09ICImIikgewogICAgICAgIHdoaWxlICghc291cmNlLmVuZE9mTGluZSgpKSB7CiAgICAgICAgICBpZiAoc291cmNlLm5leHQoKSA9PSAiOyIpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICByZXR1cm4gInhtbC1lbnRpdHkiOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIHNvdXJjZS5uZXh0V2hpbGVNYXRjaGVzKC9bXiY8XG5dLyk7CiAgICAgICAgcmV0dXJuICJ4bWwtdGV4dCI7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBpblRhZyhzb3VyY2UsIHNldFN0YXRlKSB7CiAgICAgIHZhciBjaCA9IHNvdXJjZS5uZXh0KCk7CiAgICAgIGlmIChjaCA9PSAiPiIpIHsKICAgICAgICBzZXRTdGF0ZShpblRleHQpOwogICAgICAgIHJldHVybiAieG1sLXB1bmN0dWF0aW9uIjsKICAgICAgfQogICAgICBlbHNlIGlmICgvWz9cL10vLnRlc3QoY2gpICYmIHNvdXJjZS5lcXVhbHMoIj4iKSkgewogICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgc2V0U3RhdGUoaW5UZXh0KTsKICAgICAgICByZXR1cm4gInhtbC1wdW5jdHVhdGlvbiI7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoY2ggPT0gIj0iKSB7CiAgICAgICAgcmV0dXJuICJ4bWwtcHVuY3R1YXRpb24iOwogICAgICB9CiAgICAgIGVsc2UgaWYgKC9bXCdcIl0vLnRlc3QoY2gpKSB7CiAgICAgICAgc2V0U3RhdGUoaW5BdHRyaWJ1dGUoY2gpKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvW15cc1x1MDBhMD08PlwiXCdcLz9dLyk7CiAgICAgICAgcmV0dXJuICJ4bWwtbmFtZSI7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBpbkF0dHJpYnV0ZShxdW90ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlLCBzZXRTdGF0ZSkgewogICAgICAgIHdoaWxlICghc291cmNlLmVuZE9mTGluZSgpKSB7CiAgICAgICAgICBpZiAoc291cmNlLm5leHQoKSA9PSBxdW90ZSkgewogICAgICAgICAgICBzZXRTdGF0ZShpblRhZyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gInhtbC1hdHRyaWJ1dGUiOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGluQmxvY2soc3R5bGUsIHRlcm1pbmF0b3IpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSwgc2V0U3RhdGUpIHsKICAgICAgICB3aGlsZSAoIXNvdXJjZS5lbmRPZkxpbmUoKSkgewogICAgICAgICAgaWYgKHNvdXJjZS5sb29rQWhlYWQodGVybWluYXRvciwgdHJ1ZSkpIHsKICAgICAgICAgICAgc2V0U3RhdGUoaW5UZXh0KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3R5bGU7CiAgICAgIH07CiAgICB9CgogICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSwgc3RhcnRTdGF0ZSkgewogICAgICByZXR1cm4gdG9rZW5pemVyKHNvdXJjZSwgc3RhcnRTdGF0ZSB8fCBpblRleHQpOwogICAgfTsKICB9KSgpOwoKICAvLyBUaGUgcGFyc2VyLiBUaGUgc3RydWN0dXJlIG9mIHRoaXMgZnVuY3Rpb24gbGFyZ2VseSBmb2xsb3dzIHRoYXQgb2YKICAvLyBwYXJzZUphdmFTY3JpcHQgaW4gcGFyc2VqYXZhc2NyaXB0LmpzICh0aGVyZSBpcyBhY3R1YWxseSBhIGJpdCBtb3JlCiAgLy8gc2hhcmVkIGNvZGUgdGhhbiBJJ2QgbGlrZSksIGJ1dCBpdCBpcyBxdWl0ZSBhIGJpdCBzaW1wbGVyLgogIGZ1bmN0aW9uIHBhcnNlWE1MKHNvdXJjZSkgewogICAgdmFyIHRva2VucyA9IHRva2VuaXplWE1MKHNvdXJjZSksIHRva2VuOwogICAgdmFyIGNjID0gW2Jhc2VdOwogICAgdmFyIHRva2VuTnIgPSAwLCBpbmRlbnRlZCA9IDA7CiAgICB2YXIgY3VycmVudFRhZyA9IG51bGwsIGNvbnRleHQgPSBudWxsOwogICAgdmFyIGNvbnN1bWU7CiAgICAKICAgIGZ1bmN0aW9uIHB1c2goZnMpIHsKICAgICAgZm9yICh2YXIgaSA9IGZzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKQogICAgICAgIGNjLnB1c2goZnNbaV0pOwogICAgfQogICAgZnVuY3Rpb24gY29udCgpIHsKICAgICAgcHVzaChhcmd1bWVudHMpOwogICAgICBjb25zdW1lID0gdHJ1ZTsKICAgIH0KICAgIGZ1bmN0aW9uIHBhc3MoKSB7CiAgICAgIHB1c2goYXJndW1lbnRzKTsKICAgICAgY29uc3VtZSA9IGZhbHNlOwogICAgfQoKICAgIGZ1bmN0aW9uIG1hcmtFcnIoKSB7CiAgICAgIHRva2VuLnN0eWxlICs9ICIgeG1sLWVycm9yIjsKICAgIH0KICAgIGZ1bmN0aW9uIGV4cGVjdCh0ZXh0KSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihzdHlsZSwgY29udGVudCkgewogICAgICAgIGlmIChjb250ZW50ID09IHRleHQpIGNvbnQoKTsKICAgICAgICBlbHNlIHttYXJrRXJyKCk7IGNvbnQoYXJndW1lbnRzLmNhbGxlZSk7fQogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHB1c2hDb250ZXh0KHRhZ25hbWUsIHN0YXJ0T2ZMaW5lKSB7CiAgICAgIHZhciBub0luZGVudCA9IFVzZUtsdWRnZXMuZG9Ob3RJbmRlbnQuaGFzT3duUHJvcGVydHkodGFnbmFtZSkgfHwgKGNvbnRleHQgJiYgY29udGV4dC5ub0luZGVudCk7CiAgICAgIGNvbnRleHQgPSB7cHJldjogY29udGV4dCwgbmFtZTogdGFnbmFtZSwgaW5kZW50OiBpbmRlbnRlZCwgc3RhcnRPZkxpbmU6IHN0YXJ0T2ZMaW5lLCBub0luZGVudDogbm9JbmRlbnR9OwogICAgfQogICAgZnVuY3Rpb24gcG9wQ29udGV4dCgpIHsKICAgICAgY29udGV4dCA9IGNvbnRleHQucHJldjsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbXB1dGVJbmRlbnRhdGlvbihiYXNlQ29udGV4dCkgewogICAgICByZXR1cm4gZnVuY3Rpb24obmV4dENoYXJzLCBjdXJyZW50KSB7CiAgICAgICAgdmFyIGNvbnRleHQgPSBiYXNlQ29udGV4dDsKICAgICAgICBpZiAoY29udGV4dCAmJiBjb250ZXh0Lm5vSW5kZW50KQogICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgaWYgKGFsaWduQ0RBVEEgJiYgLzwhXFtDREFUQVxbLy50ZXN0KG5leHRDaGFycykpCiAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBpZiAoY29udGV4dCAmJiAvXjxcLy8udGVzdChuZXh0Q2hhcnMpKQogICAgICAgICAgY29udGV4dCA9IGNvbnRleHQucHJldjsKICAgICAgICB3aGlsZSAoY29udGV4dCAmJiAhY29udGV4dC5zdGFydE9mTGluZSkKICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnByZXY7CiAgICAgICAgaWYgKGNvbnRleHQpCiAgICAgICAgICByZXR1cm4gY29udGV4dC5pbmRlbnQgKyBpbmRlbnRVbml0OwogICAgICAgIGVsc2UKICAgICAgICAgIHJldHVybiAwOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGJhc2UoKSB7CiAgICAgIHJldHVybiBwYXNzKGVsZW1lbnQsIGJhc2UpOwogICAgfQogICAgdmFyIGhhcm1sZXNzVG9rZW5zID0geyJ4bWwtdGV4dCI6IHRydWUsICJ4bWwtZW50aXR5IjogdHJ1ZSwgInhtbC1jb21tZW50IjogdHJ1ZSwgInhtbC1wcm9jZXNzaW5nIjogdHJ1ZX07CiAgICBmdW5jdGlvbiBlbGVtZW50KHN0eWxlLCBjb250ZW50KSB7CiAgICAgIGlmIChjb250ZW50ID09ICI8IikgY29udCh0YWduYW1lLCBhdHRyaWJ1dGVzLCBlbmR0YWcodG9rZW5OciA9PSAxKSk7CiAgICAgIGVsc2UgaWYgKGNvbnRlbnQgPT0gIjwvIikgY29udChjbG9zZXRhZ25hbWUsIGV4cGVjdCgiPiIpKTsKICAgICAgZWxzZSBpZiAoc3R5bGUgPT0gInhtbC1jZGF0YSIpIHsKICAgICAgICBpZiAoIWNvbnRleHQgfHwgY29udGV4dC5uYW1lICE9ICIhY2RhdGEiKSBwdXNoQ29udGV4dCgiIWNkYXRhIik7CiAgICAgICAgaWYgKC9cXVxdPiQvLnRlc3QoY29udGVudCkpIHBvcENvbnRleHQoKTsKICAgICAgICBjb250KCk7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoaGFybWxlc3NUb2tlbnMuaGFzT3duUHJvcGVydHkoc3R5bGUpKSBjb250KCk7CiAgICAgIGVsc2Uge21hcmtFcnIoKTsgY29udCgpO30KICAgIH0KICAgIGZ1bmN0aW9uIHRhZ25hbWUoc3R5bGUsIGNvbnRlbnQpIHsKICAgICAgaWYgKHN0eWxlID09ICJ4bWwtbmFtZSIpIHsKICAgICAgICBjdXJyZW50VGFnID0gY29udGVudC50b0xvd2VyQ2FzZSgpOwogICAgICAgIHRva2VuLnN0eWxlID0gInhtbC10YWduYW1lIjsKICAgICAgICBjb250KCk7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgY3VycmVudFRhZyA9IG51bGw7CiAgICAgICAgcGFzcygpOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBjbG9zZXRhZ25hbWUoc3R5bGUsIGNvbnRlbnQpIHsKICAgICAgaWYgKHN0eWxlID09ICJ4bWwtbmFtZSIpIHsKICAgICAgICB0b2tlbi5zdHlsZSA9ICJ4bWwtdGFnbmFtZSI7CiAgICAgICAgaWYgKGNvbnRleHQgJiYgY29udGVudC50b0xvd2VyQ2FzZSgpID09IGNvbnRleHQubmFtZSkgcG9wQ29udGV4dCgpOwogICAgICAgIGVsc2UgbWFya0VycigpOwogICAgICB9CiAgICAgIGNvbnQoKTsKICAgIH0KICAgIGZ1bmN0aW9uIGVuZHRhZyhzdGFydE9mTGluZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oc3R5bGUsIGNvbnRlbnQpIHsKICAgICAgICBpZiAoY29udGVudCA9PSAiLz4iIHx8IChjb250ZW50ID09ICI+IiAmJiBVc2VLbHVkZ2VzLmF1dG9TZWxmQ2xvc2Vycy5oYXNPd25Qcm9wZXJ0eShjdXJyZW50VGFnKSkpIGNvbnQoKTsKICAgICAgICBlbHNlIGlmIChjb250ZW50ID09ICI+Iikge3B1c2hDb250ZXh0KGN1cnJlbnRUYWcsIHN0YXJ0T2ZMaW5lKTsgY29udCgpO30KICAgICAgICBlbHNlIHttYXJrRXJyKCk7IGNvbnQoYXJndW1lbnRzLmNhbGxlZSk7fQogICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gYXR0cmlidXRlcyhzdHlsZSkgewogICAgICBpZiAoc3R5bGUgPT0gInhtbC1uYW1lIikge3Rva2VuLnN0eWxlID0gInhtbC1hdHRuYW1lIjsgY29udChhdHRyaWJ1dGUsIGF0dHJpYnV0ZXMpO30KICAgICAgZWxzZSBwYXNzKCk7CiAgICB9CiAgICBmdW5jdGlvbiBhdHRyaWJ1dGUoc3R5bGUsIGNvbnRlbnQpIHsKICAgICAgaWYgKGNvbnRlbnQgPT0gIj0iKSBjb250KHZhbHVlKTsKICAgICAgZWxzZSBpZiAoY29udGVudCA9PSAiPiIgfHwgY29udGVudCA9PSAiLz4iKSBwYXNzKGVuZHRhZyk7CiAgICAgIGVsc2UgcGFzcygpOwogICAgfQogICAgZnVuY3Rpb24gdmFsdWUoc3R5bGUpIHsKICAgICAgaWYgKHN0eWxlID09ICJ4bWwtYXR0cmlidXRlIikgY29udCh2YWx1ZSk7CiAgICAgIGVsc2UgcGFzcygpOwogICAgfQoKICAgIHJldHVybiB7CiAgICAgIGluZGVudGF0aW9uOiBmdW5jdGlvbigpIHtyZXR1cm4gaW5kZW50ZWQ7fSwKCiAgICAgIG5leHQ6IGZ1bmN0aW9uKCl7CiAgICAgICAgdG9rZW4gPSB0b2tlbnMubmV4dCgpOwogICAgICAgIGlmICh0b2tlbi5zdHlsZSA9PSAid2hpdGVzcGFjZSIgJiYgdG9rZW5OciA9PSAwKQogICAgICAgICAgaW5kZW50ZWQgPSB0b2tlbi52YWx1ZS5sZW5ndGg7CiAgICAgICAgZWxzZQogICAgICAgICAgdG9rZW5OcisrOwogICAgICAgIGlmICh0b2tlbi5jb250ZW50ID09ICJcbiIpIHsKICAgICAgICAgIGluZGVudGVkID0gdG9rZW5OciA9IDA7CiAgICAgICAgICB0b2tlbi5pbmRlbnRhdGlvbiA9IGNvbXB1dGVJbmRlbnRhdGlvbihjb250ZXh0KTsKICAgICAgICB9CgogICAgICAgIGlmICh0b2tlbi5zdHlsZSA9PSAid2hpdGVzcGFjZSIgfHwgdG9rZW4udHlwZSA9PSAieG1sLWNvbW1lbnQiKQogICAgICAgICAgcmV0dXJuIHRva2VuOwoKICAgICAgICB3aGlsZSh0cnVlKXsKICAgICAgICAgIGNvbnN1bWUgPSBmYWxzZTsKICAgICAgICAgIGNjLnBvcCgpKHRva2VuLnN0eWxlLCB0b2tlbi5jb250ZW50KTsKICAgICAgICAgIGlmIChjb25zdW1lKSByZXR1cm4gdG9rZW47CiAgICAgICAgfQogICAgICB9LAoKICAgICAgY29weTogZnVuY3Rpb24oKXsKICAgICAgICB2YXIgX2NjID0gY2MuY29uY2F0KFtdKSwgX3Rva2VuU3RhdGUgPSB0b2tlbnMuc3RhdGUsIF9jb250ZXh0ID0gY29udGV4dDsKICAgICAgICB2YXIgcGFyc2VyID0gdGhpczsKICAgICAgICAKICAgICAgICByZXR1cm4gZnVuY3Rpb24oaW5wdXQpewogICAgICAgICAgY2MgPSBfY2MuY29uY2F0KFtdKTsKICAgICAgICAgIHRva2VuTnIgPSBpbmRlbnRlZCA9IDA7CiAgICAgICAgICBjb250ZXh0ID0gX2NvbnRleHQ7CiAgICAgICAgICB0b2tlbnMgPSB0b2tlbml6ZVhNTChpbnB1dCwgX3Rva2VuU3RhdGUpOwogICAgICAgICAgcmV0dXJuIHBhcnNlcjsKICAgICAgICB9OwogICAgICB9CiAgICB9OwogIH0KCiAgcmV0dXJuIHsKICAgIG1ha2U6IHBhcnNlWE1MLAogICAgZWxlY3RyaWNDaGFyczogIi8iLAogICAgY29uZmlndXJlOiBmdW5jdGlvbihjb25maWcpIHsKICAgICAgaWYgKGNvbmZpZy51c2VIVE1MS2x1ZGdlcyAhPSBudWxsKQogICAgICAgIFVzZUtsdWRnZXMgPSBjb25maWcudXNlSFRNTEtsdWRnZXMgPyBLbHVkZ2VzIDogTm9LbHVkZ2VzOwogICAgICBpZiAoY29uZmlnLmFsaWduQ0RBVEEpCiAgICAgICAgYWxpZ25DREFUQSA9IGNvbmZpZy5hbGlnbkNEQVRBOwogICAgfQogIH07Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/select.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogRnVuY3Rpb25hbGl0eSBmb3IgZmluZGluZywgc3RvcmluZywgYW5kIHJlc3RvcmluZyBzZWxlY3Rpb25zCiAqCiAqIFRoaXMgZG9lcyBub3QgcHJvdmlkZSBhIGdlbmVyaWMgQVBJLCBqdXN0IHRoZSBtaW5pbWFsIGZ1bmN0aW9uYWxpdHkKICogcmVxdWlyZWQgYnkgdGhlIENvZGVNaXJyb3Igc3lzdGVtLgogKi8KCi8vIE5hbWVzcGFjZSBvYmplY3QuCnZhciBzZWxlY3QgPSB7fTsKCihmdW5jdGlvbigpIHsKICBzZWxlY3QuaWVfc2VsZWN0aW9uID0gZG9jdW1lbnQuc2VsZWN0aW9uICYmIGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZUNvbGxlY3Rpb247CgogIC8vIEZpbmQgdGhlICd0b3AtbGV2ZWwnIChkZWZpbmVkIGFzICdhIGRpcmVjdCBjaGlsZCBvZiB0aGUgbm9kZQogIC8vIHBhc3NlZCBhcyB0aGUgdG9wIGFyZ3VtZW50Jykgbm9kZSB0aGF0IHRoZSBnaXZlbiBub2RlIGlzCiAgLy8gY29udGFpbmVkIGluLiBSZXR1cm4gbnVsbCBpZiB0aGUgZ2l2ZW4gbm9kZSBpcyBub3QgaW5zaWRlIHRoZSB0b3AKICAvLyBub2RlLgogIGZ1bmN0aW9uIHRvcExldmVsTm9kZUF0KG5vZGUsIHRvcCkgewogICAgd2hpbGUgKG5vZGUgJiYgbm9kZS5wYXJlbnROb2RlICE9IHRvcCkKICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTsKICAgIHJldHVybiBub2RlOwogIH0KCiAgLy8gRmluZCB0aGUgdG9wLWxldmVsIG5vZGUgdGhhdCBjb250YWlucyB0aGUgbm9kZSBiZWZvcmUgdGhpcyBvbmUuCiAgZnVuY3Rpb24gdG9wTGV2ZWxOb2RlQmVmb3JlKG5vZGUsIHRvcCkgewogICAgd2hpbGUgKCFub2RlLnByZXZpb3VzU2libGluZyAmJiBub2RlLnBhcmVudE5vZGUgIT0gdG9wKQogICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlOwogICAgcmV0dXJuIHRvcExldmVsTm9kZUF0KG5vZGUucHJldmlvdXNTaWJsaW5nLCB0b3ApOwogIH0KCiAgdmFyIGZvdXJTcGFjZXMgPSAiXHUwMGEwXHUwMGEwXHUwMGEwXHUwMGEwIjsKCiAgc2VsZWN0LnNjcm9sbFRvTm9kZSA9IGZ1bmN0aW9uKGVsZW1lbnQpIHsKICAgIGlmICghZWxlbWVudCkgcmV0dXJuOwogICAgdmFyIGRvYyA9IGVsZW1lbnQub3duZXJEb2N1bWVudCwgYm9keSA9IGRvYy5ib2R5LAogICAgICAgIHdpbiA9IChkb2MuZGVmYXVsdFZpZXcgfHwgZG9jLnBhcmVudFdpbmRvdyksCiAgICAgICAgaHRtbCA9IGRvYy5kb2N1bWVudEVsZW1lbnQsCiAgICAgICAgYXRFbmQgPSAhZWxlbWVudC5uZXh0U2libGluZyB8fCAhZWxlbWVudC5uZXh0U2libGluZy5uZXh0U2libGluZwogICAgICAgICAgICAgICAgfHwgIWVsZW1lbnQubmV4dFNpYmxpbmcubmV4dFNpYmxpbmcubmV4dFNpYmxpbmc7CiAgICAvLyBJbiBPcGVyYSAoYW5kIHJlY2VudCBXZWJraXQgdmVyc2lvbnMpLCBCUiBlbGVtZW50cyAqYWx3YXlzKgogICAgLy8gaGF2ZSBhIG9mZnNldFRvcCBwcm9wZXJ0eSBvZiB6ZXJvLgogICAgdmFyIGNvbXBlbnNhdGVIYWNrID0gMDsKICAgIHdoaWxlIChlbGVtZW50ICYmICFlbGVtZW50Lm9mZnNldFRvcCkgewogICAgICBjb21wZW5zYXRlSGFjaysrOwogICAgICBlbGVtZW50ID0gZWxlbWVudC5wcmV2aW91c1NpYmxpbmc7CiAgICB9CiAgICAvLyBhdEVuZCBpcyBhbm90aGVyIGtsdWRnZSBmb3IgdGhlc2UgYnJvd3NlcnMgLS0gaWYgdGhlIGN1cnNvciBpcwogICAgLy8gYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQsIGFuZCB0aGUgbm9kZSBkb2Vzbid0IGhhdmUgYW4KICAgIC8vIG9mZnNldCwganVzdCBzY3JvbGwgdG8gdGhlIGVuZC4KICAgIGlmIChjb21wZW5zYXRlSGFjayA9PSAwKSBhdEVuZCA9IGZhbHNlOwoKICAgIC8vIFdlYktpdCBoYXMgYSBiYWQgaGFiaXQgb2YgKHNvbWV0aW1lcykgaGFwcGlseSByZXR1cm5pbmcgYm9ndXMKICAgIC8vIG9mZnNldHMgd2hlbiB0aGUgZG9jdW1lbnQgaGFzIGp1c3QgYmVlbiBjaGFuZ2VkLiBUaGlzIHNlZW1zIHRvCiAgICAvLyBhbHdheXMgYmUgNS81LCBzbyB3ZSBkb24ndCB1c2UgdGhvc2UuCiAgICBpZiAod2Via2l0ICYmIGVsZW1lbnQgJiYgZWxlbWVudC5vZmZzZXRUb3AgPT0gNSAmJiBlbGVtZW50Lm9mZnNldExlZnQgPT0gNSkKICAgICAgcmV0dXJuCgogICAgdmFyIHkgPSBjb21wZW5zYXRlSGFjayAqIChlbGVtZW50ID8gZWxlbWVudC5vZmZzZXRIZWlnaHQgOiAwKSwgeCA9IDAsIHBvcyA9IGVsZW1lbnQ7CiAgICB3aGlsZSAocG9zICYmIHBvcy5vZmZzZXRQYXJlbnQpIHsKICAgICAgeSArPSBwb3Mub2Zmc2V0VG9wOwogICAgICAvLyBEb24ndCBjb3VudCBYIG9mZnNldCBmb3IgPGJyPiBub2RlcwogICAgICBpZiAoIWlzQlIocG9zKSkKICAgICAgICB4ICs9IHBvcy5vZmZzZXRMZWZ0OwogICAgICBwb3MgPSBwb3Mub2Zmc2V0UGFyZW50OwogICAgfQoKICAgIHZhciBzY3JvbGxfeCA9IGJvZHkuc2Nyb2xsTGVmdCB8fCBodG1sLnNjcm9sbExlZnQgfHwgMCwKICAgICAgICBzY3JvbGxfeSA9IGJvZHkuc2Nyb2xsVG9wIHx8IGh0bWwuc2Nyb2xsVG9wIHx8IDAsCiAgICAgICAgc2NyZWVuX3ggPSB4IC0gc2Nyb2xsX3gsIHNjcmVlbl95ID0geSAtIHNjcm9sbF95LCBzY3JvbGwgPSBmYWxzZTsKCiAgICBpZiAoc2NyZWVuX3ggPCAwIHx8IHNjcmVlbl94ID4gKHdpbi5pbm5lcldpZHRoIHx8IGh0bWwuY2xpZW50V2lkdGggfHwgMCkpIHsKICAgICAgc2Nyb2xsX3ggPSB4OwogICAgICBzY3JvbGwgPSB0cnVlOwogICAgfQogICAgaWYgKHNjcmVlbl95IDwgMCB8fCBhdEVuZCB8fCBzY3JlZW5feSA+ICh3aW4uaW5uZXJIZWlnaHQgfHwgaHRtbC5jbGllbnRIZWlnaHQgfHwgMCkgLSA1MCkgewogICAgICBzY3JvbGxfeSA9IGF0RW5kID8gMWU2IDogeTsKICAgICAgc2Nyb2xsID0gdHJ1ZTsKICAgIH0KICAgIGlmIChzY3JvbGwpIHdpbi5zY3JvbGxUbyhzY3JvbGxfeCwgc2Nyb2xsX3kpOwogIH07CgogIHNlbGVjdC5zY3JvbGxUb0N1cnNvciA9IGZ1bmN0aW9uKGNvbnRhaW5lcikgewogICAgc2VsZWN0LnNjcm9sbFRvTm9kZShzZWxlY3Quc2VsZWN0aW9uVG9wTm9kZShjb250YWluZXIsIHRydWUpIHx8IGNvbnRhaW5lci5maXJzdENoaWxkKTsKICB9OwoKICAvLyBVc2VkIHRvIHByZXZlbnQgcmVzdG9yaW5nIGEgc2VsZWN0aW9uIHdoZW4gd2UgZG8gbm90IG5lZWQgdG8uCiAgdmFyIGN1cnJlbnRTZWxlY3Rpb24gPSBudWxsOwoKICBzZWxlY3Quc25hcHNob3RDaGFuZ2VkID0gZnVuY3Rpb24oKSB7CiAgICBpZiAoY3VycmVudFNlbGVjdGlvbikgY3VycmVudFNlbGVjdGlvbi5jaGFuZ2VkID0gdHJ1ZTsKICB9OwoKICAvLyBUaGlzIGlzIGNhbGxlZCBieSB0aGUgY29kZSBpbiBlZGl0b3IuanMgd2hlbmV2ZXIgaXQgaXMgcmVwbGFjaW5nCiAgLy8gYSB0ZXh0IG5vZGUuIFRoZSBmdW5jdGlvbiBzZWVzIHdoZXRoZXIgdGhlIGdpdmVuIG9sZE5vZGUgaXMgcGFydAogIC8vIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbiwgYW5kIHVwZGF0ZXMgdGhpcyBzZWxlY3Rpb24gaWYgaXQgaXMuCiAgLy8gQmVjYXVzZSBub2RlcyBhcmUgb2Z0ZW4gb25seSBwYXJ0aWFsbHkgcmVwbGFjZWQsIHRoZSBsZW5ndGggb2YKICAvLyB0aGUgcGFydCB0aGF0IGdldHMgcmVwbGFjZWQgaGFzIHRvIGJlIHRha2VuIGludG8gYWNjb3VudCAtLSB0aGUKICAvLyBzZWxlY3Rpb24gbWlnaHQgc3RheSBpbiB0aGUgb2xkTm9kZSBpZiB0aGUgbmV3Tm9kZSBpcyBzbWFsbGVyCiAgLy8gdGhhbiB0aGUgc2VsZWN0aW9uJ3Mgb2Zmc2V0LiBUaGUgb2Zmc2V0IGFyZ3VtZW50IGlzIG5lZWRlZCBpbgogIC8vIGNhc2UgdGhlIHNlbGVjdGlvbiBkb2VzIG1vdmUgdG8gdGhlIG5ldyBvYmplY3QsIGFuZCB0aGUgZ2l2ZW4KICAvLyBsZW5ndGggaXMgbm90IHRoZSB3aG9sZSBsZW5ndGggb2YgdGhlIG5ldyBub2RlIChwYXJ0IG9mIGl0IG1pZ2h0CiAgLy8gaGF2ZSBiZWVuIHVzZWQgdG8gcmVwbGFjZSBhbm90aGVyIG5vZGUpLgogIHNlbGVjdC5zbmFwc2hvdFJlcGxhY2VOb2RlID0gZnVuY3Rpb24oZnJvbSwgdG8sIGxlbmd0aCwgb2Zmc2V0KSB7CiAgICBpZiAoIWN1cnJlbnRTZWxlY3Rpb24pIHJldHVybjsKCiAgICBmdW5jdGlvbiByZXBsYWNlKHBvaW50KSB7CiAgICAgIGlmIChmcm9tID09IHBvaW50Lm5vZGUpIHsKICAgICAgICBjdXJyZW50U2VsZWN0aW9uLmNoYW5nZWQgPSB0cnVlOwogICAgICAgIGlmIChsZW5ndGggJiYgcG9pbnQub2Zmc2V0ID4gbGVuZ3RoKSB7CiAgICAgICAgICBwb2ludC5vZmZzZXQgLT0gbGVuZ3RoOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIHBvaW50Lm5vZGUgPSB0bzsKICAgICAgICAgIHBvaW50Lm9mZnNldCArPSAob2Zmc2V0IHx8IDApOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmVwbGFjZShjdXJyZW50U2VsZWN0aW9uLnN0YXJ0KTsKICAgIHJlcGxhY2UoY3VycmVudFNlbGVjdGlvbi5lbmQpOwogIH07CgogIHNlbGVjdC5zbmFwc2hvdE1vdmUgPSBmdW5jdGlvbihmcm9tLCB0bywgZGlzdGFuY2UsIHJlbGF0aXZlLCBpZkF0U3RhcnQpIHsKICAgIGlmICghY3VycmVudFNlbGVjdGlvbikgcmV0dXJuOwoKICAgIGZ1bmN0aW9uIG1vdmUocG9pbnQpIHsKICAgICAgaWYgKGZyb20gPT0gcG9pbnQubm9kZSAmJiAoIWlmQXRTdGFydCB8fCBwb2ludC5vZmZzZXQgPT0gMCkpIHsKICAgICAgICBjdXJyZW50U2VsZWN0aW9uLmNoYW5nZWQgPSB0cnVlOwogICAgICAgIHBvaW50Lm5vZGUgPSB0bzsKICAgICAgICBpZiAocmVsYXRpdmUpIHBvaW50Lm9mZnNldCA9IE1hdGgubWF4KDAsIHBvaW50Lm9mZnNldCArIGRpc3RhbmNlKTsKICAgICAgICBlbHNlIHBvaW50Lm9mZnNldCA9IGRpc3RhbmNlOwogICAgICB9CiAgICB9CiAgICBtb3ZlKGN1cnJlbnRTZWxlY3Rpb24uc3RhcnQpOwogICAgbW92ZShjdXJyZW50U2VsZWN0aW9uLmVuZCk7CiAgfTsKCiAgLy8gTW9zdCBmdW5jdGlvbnMgYXJlIGRlZmluZWQgaW4gdHdvIHdheXMsIG9uZSBmb3IgdGhlIElFIHNlbGVjdGlvbgogIC8vIG1vZGVsLCBvbmUgZm9yIHRoZSBXM0Mgb25lLgogIGlmIChzZWxlY3QuaWVfc2VsZWN0aW9uKSB7CiAgICBmdW5jdGlvbiBzZWxlY3Rpb25Ob2RlKHdpbiwgc3RhcnQpIHsKICAgICAgdmFyIHJhbmdlID0gd2luLmRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpOwogICAgICByYW5nZS5jb2xsYXBzZShzdGFydCk7CgogICAgICBmdW5jdGlvbiBub2RlQWZ0ZXIobm9kZSkgewogICAgICAgIHZhciBmb3VuZCA9IG51bGw7CiAgICAgICAgd2hpbGUgKCFmb3VuZCAmJiBub2RlKSB7CiAgICAgICAgICBmb3VuZCA9IG5vZGUubmV4dFNpYmxpbmc7CiAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbm9kZUF0U3RhcnRPZihmb3VuZCk7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIG5vZGVBdFN0YXJ0T2Yobm9kZSkgewogICAgICAgIHdoaWxlIChub2RlICYmIG5vZGUuZmlyc3RDaGlsZCkgbm9kZSA9IG5vZGUuZmlyc3RDaGlsZDsKICAgICAgICByZXR1cm4ge25vZGU6IG5vZGUsIG9mZnNldDogMH07CiAgICAgIH0KCiAgICAgIHZhciBjb250YWluaW5nID0gcmFuZ2UucGFyZW50RWxlbWVudCgpOwogICAgICBpZiAoIWlzQW5jZXN0b3Iod2luLmRvY3VtZW50LmJvZHksIGNvbnRhaW5pbmcpKSByZXR1cm4gbnVsbDsKICAgICAgaWYgKCFjb250YWluaW5nLmZpcnN0Q2hpbGQpIHJldHVybiBub2RlQXRTdGFydE9mKGNvbnRhaW5pbmcpOwoKICAgICAgdmFyIHdvcmtpbmcgPSByYW5nZS5kdXBsaWNhdGUoKTsKICAgICAgd29ya2luZy5tb3ZlVG9FbGVtZW50VGV4dChjb250YWluaW5nKTsKICAgICAgd29ya2luZy5jb2xsYXBzZSh0cnVlKTsKICAgICAgZm9yICh2YXIgY3VyID0gY29udGFpbmluZy5maXJzdENoaWxkOyBjdXI7IGN1ciA9IGN1ci5uZXh0U2libGluZykgewogICAgICAgIGlmIChjdXIubm9kZVR5cGUgPT0gMykgewogICAgICAgICAgdmFyIHNpemUgPSBjdXIubm9kZVZhbHVlLmxlbmd0aDsKICAgICAgICAgIHdvcmtpbmcubW92ZSgiY2hhcmFjdGVyIiwgc2l6ZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgd29ya2luZy5tb3ZlVG9FbGVtZW50VGV4dChjdXIpOwogICAgICAgICAgd29ya2luZy5jb2xsYXBzZShmYWxzZSk7CiAgICAgICAgfQoKICAgICAgICB2YXIgZGlyID0gcmFuZ2UuY29tcGFyZUVuZFBvaW50cygiU3RhcnRUb1N0YXJ0Iiwgd29ya2luZyk7CiAgICAgICAgaWYgKGRpciA9PSAwKSByZXR1cm4gbm9kZUFmdGVyKGN1cik7CiAgICAgICAgaWYgKGRpciA9PSAxKSBjb250aW51ZTsKICAgICAgICBpZiAoY3VyLm5vZGVUeXBlICE9IDMpIHJldHVybiBub2RlQXRTdGFydE9mKGN1cik7CgogICAgICAgIHdvcmtpbmcuc2V0RW5kUG9pbnQoIlN0YXJ0VG9FbmQiLCByYW5nZSk7CiAgICAgICAgcmV0dXJuIHtub2RlOiBjdXIsIG9mZnNldDogc2l6ZSAtIHdvcmtpbmcudGV4dC5sZW5ndGh9OwogICAgICB9CiAgICAgIHJldHVybiBub2RlQWZ0ZXIoY29udGFpbmluZyk7CiAgICB9CgogICAgc2VsZWN0Lm1hcmtTZWxlY3Rpb24gPSBmdW5jdGlvbih3aW4pIHsKICAgICAgY3VycmVudFNlbGVjdGlvbiA9IG51bGw7CiAgICAgIHZhciBzZWwgPSB3aW4uZG9jdW1lbnQuc2VsZWN0aW9uOwogICAgICBpZiAoIXNlbCkgcmV0dXJuOwogICAgICB2YXIgc3RhcnQgPSBzZWxlY3Rpb25Ob2RlKHdpbiwgdHJ1ZSksCiAgICAgICAgICBlbmQgPSBzZWxlY3Rpb25Ob2RlKHdpbiwgZmFsc2UpOwogICAgICBpZiAoIXN0YXJ0IHx8ICFlbmQpIHJldHVybjsKICAgICAgY3VycmVudFNlbGVjdGlvbiA9IHtzdGFydDogc3RhcnQsIGVuZDogZW5kLCB3aW5kb3c6IHdpbiwgY2hhbmdlZDogZmFsc2V9OwogICAgfTsKCiAgICBzZWxlY3Quc2VsZWN0TWFya2VkID0gZnVuY3Rpb24oKSB7CiAgICAgIGlmICghY3VycmVudFNlbGVjdGlvbiB8fCAhY3VycmVudFNlbGVjdGlvbi5jaGFuZ2VkKSByZXR1cm47CiAgICAgIHZhciB3aW4gPSBjdXJyZW50U2VsZWN0aW9uLndpbmRvdywgZG9jID0gd2luLmRvY3VtZW50OwoKICAgICAgZnVuY3Rpb24gbWFrZVJhbmdlKHBvaW50KSB7CiAgICAgICAgdmFyIHJhbmdlID0gZG9jLmJvZHkuY3JlYXRlVGV4dFJhbmdlKCksCiAgICAgICAgICAgIG5vZGUgPSBwb2ludC5ub2RlOwogICAgICAgIGlmICghbm9kZSkgewogICAgICAgICAgcmFuZ2UubW92ZVRvRWxlbWVudFRleHQoY3VycmVudFNlbGVjdGlvbi53aW5kb3cuZG9jdW1lbnQuYm9keSk7CiAgICAgICAgICByYW5nZS5jb2xsYXBzZShmYWxzZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG5vZGUubm9kZVR5cGUgPT0gMykgewogICAgICAgICAgcmFuZ2UubW92ZVRvRWxlbWVudFRleHQobm9kZS5wYXJlbnROb2RlKTsKICAgICAgICAgIHZhciBvZmZzZXQgPSBwb2ludC5vZmZzZXQ7CiAgICAgICAgICB3aGlsZSAobm9kZS5wcmV2aW91c1NpYmxpbmcpIHsKICAgICAgICAgICAgbm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nOwogICAgICAgICAgICBvZmZzZXQgKz0gKG5vZGUuaW5uZXJUZXh0IHx8ICIiKS5sZW5ndGg7CiAgICAgICAgICB9CiAgICAgICAgICByYW5nZS5tb3ZlKCJjaGFyYWN0ZXIiLCBvZmZzZXQpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIHJhbmdlLm1vdmVUb0VsZW1lbnRUZXh0KG5vZGUpOwogICAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByYW5nZTsKICAgICAgfQoKICAgICAgdmFyIHN0YXJ0ID0gbWFrZVJhbmdlKGN1cnJlbnRTZWxlY3Rpb24uc3RhcnQpLCBlbmQgPSBtYWtlUmFuZ2UoY3VycmVudFNlbGVjdGlvbi5lbmQpOwogICAgICBzdGFydC5zZXRFbmRQb2ludCgiU3RhcnRUb0VuZCIsIGVuZCk7CiAgICAgIHN0YXJ0LnNlbGVjdCgpOwogICAgfTsKCiAgICAvLyBHZXQgdGhlIHRvcC1sZXZlbCBub2RlIHRoYXQgb25lIGVuZCBvZiB0aGUgY3Vyc29yIGlzIGluc2lkZSBvcgogICAgLy8gYWZ0ZXIuIE5vdGUgdGhhdCB0aGlzIHJldHVybnMgZmFsc2UgZm9yICdubyBjdXJzb3InLCBhbmQgbnVsbAogICAgLy8gZm9yICdzdGFydCBvZiBkb2N1bWVudCcuCiAgICBzZWxlY3Quc2VsZWN0aW9uVG9wTm9kZSA9IGZ1bmN0aW9uKGNvbnRhaW5lciwgc3RhcnQpIHsKICAgICAgdmFyIHNlbGVjdGlvbiA9IGNvbnRhaW5lci5vd25lckRvY3VtZW50LnNlbGVjdGlvbjsKICAgICAgaWYgKCFzZWxlY3Rpb24pIHJldHVybiBmYWxzZTsKCiAgICAgIHZhciByYW5nZSA9IHNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpLCByYW5nZTIgPSByYW5nZS5kdXBsaWNhdGUoKTsKICAgICAgcmFuZ2UuY29sbGFwc2Uoc3RhcnQpOwogICAgICB2YXIgYXJvdW5kID0gcmFuZ2UucGFyZW50RWxlbWVudCgpOwogICAgICBpZiAoYXJvdW5kICYmIGlzQW5jZXN0b3IoY29udGFpbmVyLCBhcm91bmQpKSB7CiAgICAgICAgLy8gT25seSB1c2UgdGhpcyBub2RlIGlmIHRoZSBzZWxlY3Rpb24gaXMgbm90IGF0IGl0cyBzdGFydC4KICAgICAgICByYW5nZTIubW92ZVRvRWxlbWVudFRleHQoYXJvdW5kKTsKICAgICAgICBpZiAocmFuZ2UuY29tcGFyZUVuZFBvaW50cygiU3RhcnRUb1N0YXJ0IiwgcmFuZ2UyKSA9PSAxKQogICAgICAgICAgcmV0dXJuIHRvcExldmVsTm9kZUF0KGFyb3VuZCwgY29udGFpbmVyKTsKICAgICAgfQoKICAgICAgLy8gTW92ZSB0aGUgc3RhcnQgb2YgYSByYW5nZSB0byB0aGUgc3RhcnQgb2YgYSBub2RlLAogICAgICAvLyBjb21wZW5zYXRpbmcgZm9yIHRoZSBmYWN0IHRoYXQgeW91IGNhbid0IGNhbGwKICAgICAgLy8gbW92ZVRvRWxlbWVudFRleHQgd2l0aCB0ZXh0IG5vZGVzLgogICAgICBmdW5jdGlvbiBtb3ZlVG9Ob2RlU3RhcnQocmFuZ2UsIG5vZGUpIHsKICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAzKSB7CiAgICAgICAgICB2YXIgY291bnQgPSAwLCBjdXIgPSBub2RlLnByZXZpb3VzU2libGluZzsKICAgICAgICAgIHdoaWxlIChjdXIgJiYgY3VyLm5vZGVUeXBlID09IDMpIHsKICAgICAgICAgICAgY291bnQgKz0gY3VyLm5vZGVWYWx1ZS5sZW5ndGg7CiAgICAgICAgICAgIGN1ciA9IGN1ci5wcmV2aW91c1NpYmxpbmc7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoY3VyKSB7CiAgICAgICAgICAgIHRyeXtyYW5nZS5tb3ZlVG9FbGVtZW50VGV4dChjdXIpO30KICAgICAgICAgICAgY2F0Y2goZSl7cmV0dXJuIGZhbHNlO30KICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSByYW5nZS5tb3ZlVG9FbGVtZW50VGV4dChub2RlLnBhcmVudE5vZGUpOwogICAgICAgICAgaWYgKGNvdW50KSByYW5nZS5tb3ZlKCJjaGFyYWN0ZXIiLCBjb3VudCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgdHJ5e3JhbmdlLm1vdmVUb0VsZW1lbnRUZXh0KG5vZGUpO30KICAgICAgICAgIGNhdGNoKGUpe3JldHVybiBmYWxzZTt9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CgogICAgICAvLyBEbyBhIGJpbmFyeSBzZWFyY2ggdGhyb3VnaCB0aGUgY29udGFpbmVyIG9iamVjdCwgY29tcGFyaW5nCiAgICAgIC8vIHRoZSBzdGFydCBvZiBlYWNoIG5vZGUgdG8gdGhlIHNlbGVjdGlvbgogICAgICB2YXIgc3RhcnQgPSAwLCBlbmQgPSBjb250YWluZXIuY2hpbGROb2Rlcy5sZW5ndGggLSAxOwogICAgICB3aGlsZSAoc3RhcnQgPCBlbmQpIHsKICAgICAgICB2YXIgbWlkZGxlID0gTWF0aC5jZWlsKChlbmQgKyBzdGFydCkgLyAyKSwgbm9kZSA9IGNvbnRhaW5lci5jaGlsZE5vZGVzW21pZGRsZV07CiAgICAgICAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7IC8vIERvbid0IGFzay4gSUU2IG1hbmFnZXMgdGhpcyBzb21ldGltZXMuCiAgICAgICAgaWYgKCFtb3ZlVG9Ob2RlU3RhcnQocmFuZ2UyLCBub2RlKSkgcmV0dXJuIGZhbHNlOwogICAgICAgIGlmIChyYW5nZS5jb21wYXJlRW5kUG9pbnRzKCJTdGFydFRvU3RhcnQiLCByYW5nZTIpID09IDEpCiAgICAgICAgICBzdGFydCA9IG1pZGRsZTsKICAgICAgICBlbHNlCiAgICAgICAgICBlbmQgPSBtaWRkbGUgLSAxOwogICAgICB9CiAgICAgIHJldHVybiBjb250YWluZXIuY2hpbGROb2Rlc1tzdGFydF0gfHwgbnVsbDsKICAgIH07CgogICAgLy8gUGxhY2UgdGhlIGN1cnNvciBhZnRlciB0aGlzLnN0YXJ0LiBUaGlzIGlzIG9ubHkgdXNlZnVsIHdoZW4KICAgIC8vIG1hbnVhbGx5IG1vdmluZyB0aGUgY3Vyc29yIGluc3RlYWQgb2YgcmVzdG9yaW5nIGl0IHRvIGl0cyBvbGQKICAgIC8vIHBvc2l0aW9uLgogICAgc2VsZWN0LmZvY3VzQWZ0ZXJOb2RlID0gZnVuY3Rpb24obm9kZSwgY29udGFpbmVyKSB7CiAgICAgIHZhciByYW5nZSA9IGNvbnRhaW5lci5vd25lckRvY3VtZW50LmJvZHkuY3JlYXRlVGV4dFJhbmdlKCk7CiAgICAgIHJhbmdlLm1vdmVUb0VsZW1lbnRUZXh0KG5vZGUgfHwgY29udGFpbmVyKTsKICAgICAgcmFuZ2UuY29sbGFwc2UoIW5vZGUpOwogICAgICByYW5nZS5zZWxlY3QoKTsKICAgIH07CgogICAgc2VsZWN0LnNvbWV0aGluZ1NlbGVjdGVkID0gZnVuY3Rpb24od2luKSB7CiAgICAgIHZhciBzZWwgPSB3aW4uZG9jdW1lbnQuc2VsZWN0aW9uOwogICAgICByZXR1cm4gc2VsICYmIChzZWwuY3JlYXRlUmFuZ2UoKS50ZXh0ICE9ICIiKTsKICAgIH07CgogICAgZnVuY3Rpb24gaW5zZXJ0QXRDdXJzb3Iod2luZG93LCBodG1sKSB7CiAgICAgIHZhciBzZWxlY3Rpb24gPSB3aW5kb3cuZG9jdW1lbnQuc2VsZWN0aW9uOwogICAgICBpZiAoc2VsZWN0aW9uKSB7CiAgICAgICAgdmFyIHJhbmdlID0gc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7CiAgICAgICAgcmFuZ2UucGFzdGVIVE1MKGh0bWwpOwogICAgICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTsKICAgICAgICByYW5nZS5zZWxlY3QoKTsKICAgICAgfQogICAgfQoKICAgIC8vIFVzZWQgdG8gbm9ybWFsaXplIHRoZSBlZmZlY3Qgb2YgdGhlIGVudGVyIGtleSwgc2luY2UgYnJvd3NlcnMKICAgIC8vIGRvIHdpZGVseSBkaWZmZXJlbnQgdGhpbmdzIHdoZW4gcHJlc3NpbmcgZW50ZXIgaW4gZGVzaWduTW9kZS4KICAgIHNlbGVjdC5pbnNlcnROZXdsaW5lQXRDdXJzb3IgPSBmdW5jdGlvbih3aW5kb3cpIHsKICAgICAgaW5zZXJ0QXRDdXJzb3Iod2luZG93LCAiPGJyPiIpOwogICAgfTsKCiAgICBzZWxlY3QuaW5zZXJ0VGFiQXRDdXJzb3IgPSBmdW5jdGlvbih3aW5kb3cpIHsKICAgICAgaW5zZXJ0QXRDdXJzb3Iod2luZG93LCBmb3VyU3BhY2VzKTsKICAgIH07CgogICAgLy8gR2V0IHRoZSBCUiBub2RlIGF0IHRoZSBzdGFydCBvZiB0aGUgbGluZSBvbiB3aGljaCB0aGUgY3Vyc29yCiAgICAvLyBjdXJyZW50bHkgaXMsIGFuZCB0aGUgb2Zmc2V0IGludG8gdGhlIGxpbmUuIFJldHVybnMgbnVsbCBhcwogICAgLy8gbm9kZSBpZiBjdXJzb3IgaXMgb24gZmlyc3QgbGluZS4KICAgIHNlbGVjdC5jdXJzb3JQb3MgPSBmdW5jdGlvbihjb250YWluZXIsIHN0YXJ0KSB7CiAgICAgIHZhciBzZWxlY3Rpb24gPSBjb250YWluZXIub3duZXJEb2N1bWVudC5zZWxlY3Rpb247CiAgICAgIGlmICghc2VsZWN0aW9uKSByZXR1cm4gbnVsbDsKCiAgICAgIHZhciB0b3BOb2RlID0gc2VsZWN0LnNlbGVjdGlvblRvcE5vZGUoY29udGFpbmVyLCBzdGFydCk7CiAgICAgIHdoaWxlICh0b3BOb2RlICYmICFpc0JSKHRvcE5vZGUpKQogICAgICAgIHRvcE5vZGUgPSB0b3BOb2RlLnByZXZpb3VzU2libGluZzsKCiAgICAgIHZhciByYW5nZSA9IHNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpLCByYW5nZTIgPSByYW5nZS5kdXBsaWNhdGUoKTsKICAgICAgcmFuZ2UuY29sbGFwc2Uoc3RhcnQpOwogICAgICBpZiAodG9wTm9kZSkgewogICAgICAgIHJhbmdlMi5tb3ZlVG9FbGVtZW50VGV4dCh0b3BOb2RlKTsKICAgICAgICByYW5nZTIuY29sbGFwc2UoZmFsc2UpOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIC8vIFdoZW4gbm90aGluZyBpcyBzZWxlY3RlZCwgd2UgY2FuIGdldCBhbGwga2luZHMgb2YgZnVua3kgZXJyb3JzIGhlcmUuCiAgICAgICAgdHJ5IHsgcmFuZ2UyLm1vdmVUb0VsZW1lbnRUZXh0KGNvbnRhaW5lcik7IH0KICAgICAgICBjYXRjaCAoZSkgeyByZXR1cm4gbnVsbDsgfQogICAgICAgIHJhbmdlMi5jb2xsYXBzZSh0cnVlKTsKICAgICAgfQogICAgICByYW5nZS5zZXRFbmRQb2ludCgiU3RhcnRUb1N0YXJ0IiwgcmFuZ2UyKTsKCiAgICAgIHJldHVybiB7bm9kZTogdG9wTm9kZSwgb2Zmc2V0OiByYW5nZS50ZXh0Lmxlbmd0aH07CiAgICB9OwoKICAgIHNlbGVjdC5zZXRDdXJzb3JQb3MgPSBmdW5jdGlvbihjb250YWluZXIsIGZyb20sIHRvKSB7CiAgICAgIGZ1bmN0aW9uIHJhbmdlQXQocG9zKSB7CiAgICAgICAgdmFyIHJhbmdlID0gY29udGFpbmVyLm93bmVyRG9jdW1lbnQuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTsKICAgICAgICBpZiAoIXBvcy5ub2RlKSB7CiAgICAgICAgICByYW5nZS5tb3ZlVG9FbGVtZW50VGV4dChjb250YWluZXIpOwogICAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgcmFuZ2UubW92ZVRvRWxlbWVudFRleHQocG9zLm5vZGUpOwogICAgICAgICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpOwogICAgICAgIH0KICAgICAgICByYW5nZS5tb3ZlKCJjaGFyYWN0ZXIiLCBwb3Mub2Zmc2V0KTsKICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgIH0KCiAgICAgIHZhciByYW5nZSA9IHJhbmdlQXQoZnJvbSk7CiAgICAgIGlmICh0byAmJiB0byAhPSBmcm9tKQogICAgICAgIHJhbmdlLnNldEVuZFBvaW50KCJFbmRUb0VuZCIsIHJhbmdlQXQodG8pKTsKICAgICAgcmFuZ2Uuc2VsZWN0KCk7CiAgICB9CgogICAgLy8gU29tZSBoYWNrcyBmb3Igc3RvcmluZyBhbmQgcmUtc3RvcmluZyB0aGUgc2VsZWN0aW9uIHdoZW4gdGhlIGVkaXRvciBsb3NlcyBhbmQgcmVnYWlucyBmb2N1cy4KICAgIHNlbGVjdC5nZXRCb29rbWFyayA9IGZ1bmN0aW9uIChjb250YWluZXIpIHsKICAgICAgdmFyIGZyb20gPSBzZWxlY3QuY3Vyc29yUG9zKGNvbnRhaW5lciwgdHJ1ZSksIHRvID0gc2VsZWN0LmN1cnNvclBvcyhjb250YWluZXIsIGZhbHNlKTsKICAgICAgaWYgKGZyb20gJiYgdG8pIHJldHVybiB7ZnJvbTogZnJvbSwgdG86IHRvfTsKICAgIH07CgogICAgLy8gUmVzdG9yZSBhIHN0b3JlZCBzZWxlY3Rpb24uCiAgICBzZWxlY3Quc2V0Qm9va21hcmsgPSBmdW5jdGlvbihjb250YWluZXIsIG1hcmspIHsKICAgICAgaWYgKCFtYXJrKSByZXR1cm47CiAgICAgIHNlbGVjdC5zZXRDdXJzb3JQb3MoY29udGFpbmVyLCBtYXJrLmZyb20sIG1hcmsudG8pOwogICAgfTsKICB9CiAgLy8gVzNDIG1vZGVsCiAgZWxzZSB7CiAgICAvLyBTdG9yZSBzdGFydCBhbmQgZW5kIG5vZGVzLCBhbmQgb2Zmc2V0cyB3aXRoaW4gdGhlc2UsIGFuZCByZWZlcgogICAgLy8gYmFjayB0byB0aGUgc2VsZWN0aW9uIG9iamVjdCBmcm9tIHRob3NlIG5vZGVzLCBzbyB0aGF0IHRoaXMKICAgIC8vIG9iamVjdCBjYW4gYmUgdXBkYXRlZCB3aGVuIHRoZSBub2RlcyBhcmUgcmVwbGFjZWQgYmVmb3JlIHRoZQogICAgLy8gc2VsZWN0aW9uIGlzIHJlc3RvcmVkLgogICAgc2VsZWN0Lm1hcmtTZWxlY3Rpb24gPSBmdW5jdGlvbiAod2luKSB7CiAgICAgIHZhciBzZWxlY3Rpb24gPSB3aW4uZ2V0U2VsZWN0aW9uKCk7CiAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09IDApCiAgICAgICAgcmV0dXJuIChjdXJyZW50U2VsZWN0aW9uID0gbnVsbCk7CiAgICAgIHZhciByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApOwoKICAgICAgY3VycmVudFNlbGVjdGlvbiA9IHsKICAgICAgICBzdGFydDoge25vZGU6IHJhbmdlLnN0YXJ0Q29udGFpbmVyLCBvZmZzZXQ6IHJhbmdlLnN0YXJ0T2Zmc2V0fSwKICAgICAgICBlbmQ6IHtub2RlOiByYW5nZS5lbmRDb250YWluZXIsIG9mZnNldDogcmFuZ2UuZW5kT2Zmc2V0fSwKICAgICAgICB3aW5kb3c6IHdpbiwKICAgICAgICBjaGFuZ2VkOiBmYWxzZQogICAgICB9OwoKICAgICAgLy8gV2Ugd2FudCB0aGUgbm9kZXMgcmlnaHQgYXQgdGhlIGN1cnNvciwgbm90IG9uZSBvZiB0aGVpcgogICAgICAvLyBhbmNlc3RvcnMgd2l0aCBhIHN1aXRhYmxlIG9mZnNldC4gVGhpcyBnb2VzIGRvd24gdGhlIERPTSB0cmVlCiAgICAgIC8vIHVudGlsIGEgJ2xlYWYnIGlzIHJlYWNoZWQgKG9yIGlzIGl0ICp1cCogdGhlIERPTSB0cmVlPykuCiAgICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZShwb2ludCl7CiAgICAgICAgd2hpbGUgKHBvaW50Lm5vZGUubm9kZVR5cGUgIT0gMyAmJiAhaXNCUihwb2ludC5ub2RlKSkgewogICAgICAgICAgdmFyIG5ld05vZGUgPSBwb2ludC5ub2RlLmNoaWxkTm9kZXNbcG9pbnQub2Zmc2V0XSB8fCBwb2ludC5ub2RlLm5leHRTaWJsaW5nOwogICAgICAgICAgcG9pbnQub2Zmc2V0ID0gMDsKICAgICAgICAgIHdoaWxlICghbmV3Tm9kZSAmJiBwb2ludC5ub2RlLnBhcmVudE5vZGUpIHsKICAgICAgICAgICAgcG9pbnQubm9kZSA9IHBvaW50Lm5vZGUucGFyZW50Tm9kZTsKICAgICAgICAgICAgbmV3Tm9kZSA9IHBvaW50Lm5vZGUubmV4dFNpYmxpbmc7CiAgICAgICAgICB9CiAgICAgICAgICBwb2ludC5ub2RlID0gbmV3Tm9kZTsKICAgICAgICAgIGlmICghbmV3Tm9kZSkKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CgogICAgICBub3JtYWxpemUoY3VycmVudFNlbGVjdGlvbi5zdGFydCk7CiAgICAgIG5vcm1hbGl6ZShjdXJyZW50U2VsZWN0aW9uLmVuZCk7CiAgICB9OwoKICAgIHNlbGVjdC5zZWxlY3RNYXJrZWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBjcyA9IGN1cnJlbnRTZWxlY3Rpb247CiAgICAgIC8vIG9uIHdlYmtpdC1iYXNlZCBicm93c2VycywgaXQgaXMgYXBwYXJlbnRseSBwb3NzaWJsZSB0aGF0IHRoZQogICAgICAvLyBzZWxlY3Rpb24gZ2V0cyByZXNldCBldmVuIHdoZW4gYSBub2RlIHRoYXQgaXMgbm90IG9uZSBvZiB0aGUKICAgICAgLy8gZW5kcG9pbnRzIGdldCBtZXNzZWQgd2l0aC4gdGhlIG1vc3QgY29tbW9uIHNpdHVhdGlvbiB3aGVyZQogICAgICAvLyB0aGlzIG9jY3VycyBpcyB3aGVuIGEgc2VsZWN0aW9uIGlzIGRlbGV0ZWQgb3Igb3ZlcndpdHRlbi4gd2UKICAgICAgLy8gY2hlY2sgZm9yIHRoYXQgaGVyZS4KICAgICAgZnVuY3Rpb24gZm9jdXNJc3N1ZSgpIHsKICAgICAgICByZXR1cm4gY3Muc3RhcnQubm9kZSA9PSBjcy5lbmQubm9kZSAmJiBjcy5zdGFydC5vZmZzZXQgPT0gMCAmJiBjcy5lbmQub2Zmc2V0ID09IDA7CiAgICAgIH0KICAgICAgaWYgKCFjcyB8fCAhKGNzLmNoYW5nZWQgfHwgKHdlYmtpdCAmJiBmb2N1c0lzc3VlKCkpKSkgcmV0dXJuOwogICAgICB2YXIgd2luID0gY3Mud2luZG93LCByYW5nZSA9IHdpbi5kb2N1bWVudC5jcmVhdGVSYW5nZSgpOwoKICAgICAgZnVuY3Rpb24gc2V0UG9pbnQocG9pbnQsIHdoaWNoKSB7CiAgICAgICAgaWYgKHBvaW50Lm5vZGUpIHsKICAgICAgICAgIC8vIFNvbWUgbWFnaWMgdG8gZ2VuZXJhbGl6ZSB0aGUgc2V0dGluZyBvZiB0aGUgc3RhcnQgYW5kIGVuZAogICAgICAgICAgLy8gb2YgYSByYW5nZS4KICAgICAgICAgIGlmIChwb2ludC5vZmZzZXQgPT0gMCkKICAgICAgICAgICAgcmFuZ2VbInNldCIgKyB3aGljaCArICJCZWZvcmUiXShwb2ludC5ub2RlKTsKICAgICAgICAgIGVsc2UKICAgICAgICAgICAgcmFuZ2VbInNldCIgKyB3aGljaF0ocG9pbnQubm9kZSwgcG9pbnQub2Zmc2V0KTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICByYW5nZS5zZXRTdGFydEFmdGVyKHdpbi5kb2N1bWVudC5ib2R5Lmxhc3RDaGlsZCB8fCB3aW4uZG9jdW1lbnQuYm9keSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBzZXRQb2ludChjcy5lbmQsICJFbmQiKTsKICAgICAgc2V0UG9pbnQoY3Muc3RhcnQsICJTdGFydCIpOwogICAgICBzZWxlY3RSYW5nZShyYW5nZSwgd2luKTsKICAgIH07CgogICAgLy8gSGVscGVyIGZvciBzZWxlY3RpbmcgYSByYW5nZSBvYmplY3QuCiAgICBmdW5jdGlvbiBzZWxlY3RSYW5nZShyYW5nZSwgd2luZG93KSB7CiAgICAgIHZhciBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTsKICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTsKICAgIH0KICAgIGZ1bmN0aW9uIHNlbGVjdGlvblJhbmdlKHdpbmRvdykgewogICAgICB2YXIgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpOwogICAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PSAwKQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgZWxzZQogICAgICAgIHJldHVybiBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTsKICAgIH0KCiAgICAvLyBGaW5kaW5nIHRoZSB0b3AtbGV2ZWwgbm9kZSBhdCB0aGUgY3Vyc29yIGluIHRoZSBXM0MgaXMsIGFzIHlvdQogICAgLy8gY2FuIHNlZSwgcXVpdGUgYW4gaW52b2x2ZWQgcHJvY2Vzcy4KICAgIHNlbGVjdC5zZWxlY3Rpb25Ub3BOb2RlID0gZnVuY3Rpb24oY29udGFpbmVyLCBzdGFydCkgewogICAgICB2YXIgcmFuZ2UgPSBzZWxlY3Rpb25SYW5nZShjb250YWluZXIub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldyk7CiAgICAgIGlmICghcmFuZ2UpIHJldHVybiBmYWxzZTsKCiAgICAgIHZhciBub2RlID0gc3RhcnQgPyByYW5nZS5zdGFydENvbnRhaW5lciA6IHJhbmdlLmVuZENvbnRhaW5lcjsKICAgICAgdmFyIG9mZnNldCA9IHN0YXJ0ID8gcmFuZ2Uuc3RhcnRPZmZzZXQgOiByYW5nZS5lbmRPZmZzZXQ7CiAgICAgIC8vIFdvcmsgYXJvdW5kICh5ZXQgYW5vdGhlcikgYnVnIGluIE9wZXJhJ3Mgc2VsZWN0aW9uIG1vZGVsLgogICAgICBpZiAod2luZG93Lm9wZXJhICYmICFzdGFydCAmJiByYW5nZS5lbmRDb250YWluZXIgPT0gY29udGFpbmVyICYmIHJhbmdlLmVuZE9mZnNldCA9PSByYW5nZS5zdGFydE9mZnNldCArIDEgJiYKICAgICAgICAgIGNvbnRhaW5lci5jaGlsZE5vZGVzW3JhbmdlLnN0YXJ0T2Zmc2V0XSAmJiBpc0JSKGNvbnRhaW5lci5jaGlsZE5vZGVzW3JhbmdlLnN0YXJ0T2Zmc2V0XSkpCiAgICAgICAgb2Zmc2V0LS07CgogICAgICAvLyBGb3IgdGV4dCBub2Rlcywgd2UgbG9vayBhdCB0aGUgbm9kZSBpdHNlbGYgaWYgdGhlIGN1cnNvciBpcwogICAgICAvLyBpbnNpZGUsIG9yIGF0IHRoZSBub2RlIGJlZm9yZSBpdCBpZiB0aGUgY3Vyc29yIGlzIGF0IHRoZQogICAgICAvLyBzdGFydC4KICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMyl7CiAgICAgICAgaWYgKG9mZnNldCA+IDApCiAgICAgICAgICByZXR1cm4gdG9wTGV2ZWxOb2RlQXQobm9kZSwgY29udGFpbmVyKTsKICAgICAgICBlbHNlCiAgICAgICAgICByZXR1cm4gdG9wTGV2ZWxOb2RlQmVmb3JlKG5vZGUsIGNvbnRhaW5lcik7CiAgICAgIH0KICAgICAgLy8gT2NjYXNpb25hbGx5LCBicm93c2VycyB3aWxsIHJldHVybiB0aGUgSFRNTCBub2RlIGFzCiAgICAgIC8vIHNlbGVjdGlvbi4gSWYgdGhlIG9mZnNldCBpcyAwLCB3ZSB0YWtlIHRoZSBzdGFydCBvZiB0aGUgZnJhbWUKICAgICAgLy8gKCdhZnRlciBudWxsJyksIG90aGVyd2lzZSwgd2UgdGFrZSB0aGUgbGFzdCBub2RlLgogICAgICBlbHNlIGlmIChub2RlLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT0gIkhUTUwiKSB7CiAgICAgICAgcmV0dXJuIChvZmZzZXQgPT0gMSA/IG51bGwgOiBjb250YWluZXIubGFzdENoaWxkKTsKICAgICAgfQogICAgICAvLyBJZiB0aGUgZ2l2ZW4gbm9kZSBpcyBvdXIgJ2NvbnRhaW5lcicsIHdlIGp1c3QgbG9vayB1cCB0aGUKICAgICAgLy8gY29ycmVjdCBub2RlIGJ5IHVzaW5nIHRoZSBvZmZzZXQuCiAgICAgIGVsc2UgaWYgKG5vZGUgPT0gY29udGFpbmVyKSB7CiAgICAgICAgcmV0dXJuIChvZmZzZXQgPT0gMCkgPyBudWxsIDogbm9kZS5jaGlsZE5vZGVzW29mZnNldCAtIDFdOwogICAgICB9CiAgICAgIC8vIEluIGFueSBvdGhlciBjYXNlLCB3ZSBoYXZlIGEgcmVndWxhciBub2RlLiBJZiB0aGUgY3Vyc29yIGlzCiAgICAgIC8vIGF0IHRoZSBlbmQgb2YgdGhlIG5vZGUsIHdlIHVzZSB0aGUgbm9kZSBpdHNlbGYsIGlmIGl0IGlzIGF0CiAgICAgIC8vIHRoZSBzdGFydCwgd2UgdXNlIHRoZSBub2RlIGJlZm9yZSBpdCwgYW5kIGluIGFueSBvdGhlcgogICAgICAvLyBjYXNlLCB3ZSBsb29rIHVwIHRoZSBjaGlsZCBiZWZvcmUgdGhlIGN1cnNvciBhbmQgdXNlIHRoYXQuCiAgICAgIGVsc2UgewogICAgICAgIGlmIChvZmZzZXQgPT0gbm9kZS5jaGlsZE5vZGVzLmxlbmd0aCkKICAgICAgICAgIHJldHVybiB0b3BMZXZlbE5vZGVBdChub2RlLCBjb250YWluZXIpOwogICAgICAgIGVsc2UgaWYgKG9mZnNldCA9PSAwKQogICAgICAgICAgcmV0dXJuIHRvcExldmVsTm9kZUJlZm9yZShub2RlLCBjb250YWluZXIpOwogICAgICAgIGVsc2UKICAgICAgICAgIHJldHVybiB0b3BMZXZlbE5vZGVBdChub2RlLmNoaWxkTm9kZXNbb2Zmc2V0IC0gMV0sIGNvbnRhaW5lcik7CiAgICAgIH0KICAgIH07CgogICAgc2VsZWN0LmZvY3VzQWZ0ZXJOb2RlID0gZnVuY3Rpb24obm9kZSwgY29udGFpbmVyKSB7CiAgICAgIHZhciB3aW4gPSBjb250YWluZXIub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldywKICAgICAgICAgIHJhbmdlID0gd2luLmRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CiAgICAgIHJhbmdlLnNldFN0YXJ0QmVmb3JlKGNvbnRhaW5lci5maXJzdENoaWxkIHx8IGNvbnRhaW5lcik7CiAgICAgIC8vIEluIE9wZXJhLCBzZXR0aW5nIHRoZSBlbmQgb2YgYSByYW5nZSBhdCB0aGUgZW5kIG9mIGEgbGluZQogICAgICAvLyAoYmVmb3JlIGEgQlIpIHdpbGwgY2F1c2UgdGhlIGN1cnNvciB0byBhcHBlYXIgb24gdGhlIG5leHQKICAgICAgLy8gbGluZSwgc28gd2Ugc2V0IHRoZSBlbmQgaW5zaWRlIG9mIHRoZSBzdGFydCBub2RlIHdoZW4KICAgICAgLy8gcG9zc2libGUuCiAgICAgIGlmIChub2RlICYmICFub2RlLmZpcnN0Q2hpbGQpCiAgICAgICAgcmFuZ2Uuc2V0RW5kQWZ0ZXIobm9kZSk7CiAgICAgIGVsc2UgaWYgKG5vZGUpCiAgICAgICAgcmFuZ2Uuc2V0RW5kKG5vZGUsIG5vZGUuY2hpbGROb2Rlcy5sZW5ndGgpOwogICAgICBlbHNlCiAgICAgICAgcmFuZ2Uuc2V0RW5kQmVmb3JlKGNvbnRhaW5lci5maXJzdENoaWxkIHx8IGNvbnRhaW5lcik7CiAgICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTsKICAgICAgc2VsZWN0UmFuZ2UocmFuZ2UsIHdpbik7CiAgICB9OwoKICAgIHNlbGVjdC5zb21ldGhpbmdTZWxlY3RlZCA9IGZ1bmN0aW9uKHdpbikgewogICAgICB2YXIgcmFuZ2UgPSBzZWxlY3Rpb25SYW5nZSh3aW4pOwogICAgICByZXR1cm4gcmFuZ2UgJiYgIXJhbmdlLmNvbGxhcHNlZDsKICAgIH07CgogICAgZnVuY3Rpb24gaW5zZXJ0Tm9kZUF0Q3Vyc29yKHdpbmRvdywgbm9kZSkgewogICAgICB2YXIgcmFuZ2UgPSBzZWxlY3Rpb25SYW5nZSh3aW5kb3cpOwogICAgICBpZiAoIXJhbmdlKSByZXR1cm47CgogICAgICByYW5nZS5kZWxldGVDb250ZW50cygpOwogICAgICByYW5nZS5pbnNlcnROb2RlKG5vZGUpOwogICAgICB3ZWJraXRMYXN0TGluZUhhY2sod2luZG93LmRvY3VtZW50LmJvZHkpOwoKICAgICAgLy8gd29yayBhcm91bmQgd2VpcmRuZXNzIHdoZXJlIE9wZXJhIHdpbGwgbWFnaWNhbGx5IGluc2VydCBhIG5ldwogICAgICAvLyBCUiBub2RlIHdoZW4gYSBCUiBub2RlIGluc2lkZSBhIHNwYW4gaXMgbW92ZWQgYXJvdW5kLiBtYWtlcwogICAgICAvLyBzdXJlIHRoZSBCUiBlbmRzIHVwIG91dHNpZGUgb2Ygc3BhbnMuCiAgICAgIGlmICh3aW5kb3cub3BlcmEgJiYgaXNCUihub2RlKSAmJiBpc1NwYW4obm9kZS5wYXJlbnROb2RlKSkgewogICAgICAgIHZhciBuZXh0ID0gbm9kZS5uZXh0U2libGluZywgcCA9IG5vZGUucGFyZW50Tm9kZSwgb3V0ZXIgPSBwLnBhcmVudE5vZGU7CiAgICAgICAgb3V0ZXIuaW5zZXJ0QmVmb3JlKG5vZGUsIHAubmV4dFNpYmxpbmcpOwogICAgICAgIHZhciB0ZXh0QWZ0ZXIgPSAiIjsKICAgICAgICBmb3IgKDsgbmV4dCAmJiBuZXh0Lm5vZGVUeXBlID09IDM7IG5leHQgPSBuZXh0Lm5leHRTaWJsaW5nKSB7CiAgICAgICAgICB0ZXh0QWZ0ZXIgKz0gbmV4dC5ub2RlVmFsdWU7CiAgICAgICAgICByZW1vdmVFbGVtZW50KG5leHQpOwogICAgICAgIH0KICAgICAgICBvdXRlci5pbnNlcnRCZWZvcmUobWFrZVBhcnRTcGFuKHRleHRBZnRlciwgd2luZG93LmRvY3VtZW50KSwgbm9kZS5uZXh0U2libGluZyk7CiAgICAgIH0KICAgICAgcmFuZ2UgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZShub2RlKTsKICAgICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpOwogICAgICBzZWxlY3RSYW5nZShyYW5nZSwgd2luZG93KTsKICAgIH0KCiAgICBzZWxlY3QuaW5zZXJ0TmV3bGluZUF0Q3Vyc29yID0gZnVuY3Rpb24od2luZG93KSB7CiAgICAgIGluc2VydE5vZGVBdEN1cnNvcih3aW5kb3csIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJCUiIpKTsKICAgIH07CgogICAgc2VsZWN0Lmluc2VydFRhYkF0Q3Vyc29yID0gZnVuY3Rpb24od2luZG93KSB7CiAgICAgIGluc2VydE5vZGVBdEN1cnNvcih3aW5kb3csIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShmb3VyU3BhY2VzKSk7CiAgICB9OwoKICAgIHNlbGVjdC5jdXJzb3JQb3MgPSBmdW5jdGlvbihjb250YWluZXIsIHN0YXJ0KSB7CiAgICAgIHZhciByYW5nZSA9IHNlbGVjdGlvblJhbmdlKHdpbmRvdyk7CiAgICAgIGlmICghcmFuZ2UpIHJldHVybjsKCiAgICAgIHZhciB0b3BOb2RlID0gc2VsZWN0LnNlbGVjdGlvblRvcE5vZGUoY29udGFpbmVyLCBzdGFydCk7CiAgICAgIHdoaWxlICh0b3BOb2RlICYmICFpc0JSKHRvcE5vZGUpKQogICAgICAgIHRvcE5vZGUgPSB0b3BOb2RlLnByZXZpb3VzU2libGluZzsKCiAgICAgIHJhbmdlID0gcmFuZ2UuY2xvbmVSYW5nZSgpOwogICAgICByYW5nZS5jb2xsYXBzZShzdGFydCk7CiAgICAgIGlmICh0b3BOb2RlKQogICAgICAgIHJhbmdlLnNldFN0YXJ0QWZ0ZXIodG9wTm9kZSk7CiAgICAgIGVsc2UKICAgICAgICByYW5nZS5zZXRTdGFydEJlZm9yZShjb250YWluZXIpOwoKICAgICAgdmFyIHRleHQgPSByYW5nZS50b1N0cmluZygpOwogICAgICAvLyBEb24ndCBjb3VudCBjaGFyYWN0ZXJzIGludHJvZHVjZWQgYnkgd2Via2l0TGFzdExpbmVIYWNrIChzZWUgZWRpdG9yLmpzKQogICAgICBpZiAod2Via2l0KSB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cdTIwMGIvZywgIiIpOwogICAgICByZXR1cm4ge25vZGU6IHRvcE5vZGUsIG9mZnNldDogdGV4dC5sZW5ndGh9OwogICAgfTsKCiAgICBzZWxlY3Quc2V0Q3Vyc29yUG9zID0gZnVuY3Rpb24oY29udGFpbmVyLCBmcm9tLCB0bykgewogICAgICB2YXIgd2luID0gY29udGFpbmVyLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcsCiAgICAgICAgICByYW5nZSA9IHdpbi5kb2N1bWVudC5jcmVhdGVSYW5nZSgpOwoKICAgICAgZnVuY3Rpb24gc2V0UG9pbnQobm9kZSwgb2Zmc2V0LCBzaWRlKSB7CiAgICAgICAgaWYgKG9mZnNldCA9PSAwICYmIG5vZGUgJiYgIW5vZGUubmV4dFNpYmxpbmcpIHsKICAgICAgICAgIHJhbmdlWyJzZXQiICsgc2lkZSArICJBZnRlciJdKG5vZGUpOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICBpZiAoIW5vZGUpCiAgICAgICAgICBub2RlID0gY29udGFpbmVyLmZpcnN0Q2hpbGQ7CiAgICAgICAgZWxzZQogICAgICAgICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7CgogICAgICAgIGlmICghbm9kZSkgcmV0dXJuOwoKICAgICAgICBpZiAob2Zmc2V0ID09IDApIHsKICAgICAgICAgIHJhbmdlWyJzZXQiICsgc2lkZSArICJCZWZvcmUiXShub2RlKTsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgdmFyIGJhY2tsb2cgPSBbXQogICAgICAgIGZ1bmN0aW9uIGRlY29tcG9zZShub2RlKSB7CiAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAzKQogICAgICAgICAgICBiYWNrbG9nLnB1c2gobm9kZSk7CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIGZvckVhY2gobm9kZS5jaGlsZE5vZGVzLCBkZWNvbXBvc2UpOwogICAgICAgIH0KICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgd2hpbGUgKG5vZGUgJiYgIWJhY2tsb2cubGVuZ3RoKSB7CiAgICAgICAgICAgIGRlY29tcG9zZShub2RlKTsKICAgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgY3VyID0gYmFja2xvZy5zaGlmdCgpOwogICAgICAgICAgaWYgKCFjdXIpIHJldHVybiBmYWxzZTsKCiAgICAgICAgICB2YXIgbGVuZ3RoID0gY3VyLm5vZGVWYWx1ZS5sZW5ndGg7CiAgICAgICAgICBpZiAobGVuZ3RoID49IG9mZnNldCkgewogICAgICAgICAgICByYW5nZVsic2V0IiArIHNpZGVdKGN1ciwgb2Zmc2V0KTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICBvZmZzZXQgLT0gbGVuZ3RoOwogICAgICAgIH0KICAgICAgfQoKICAgICAgdG8gPSB0byB8fCBmcm9tOwogICAgICBpZiAoc2V0UG9pbnQodG8ubm9kZSwgdG8ub2Zmc2V0LCAiRW5kIikgJiYgc2V0UG9pbnQoZnJvbS5ub2RlLCBmcm9tLm9mZnNldCwgIlN0YXJ0IikpCiAgICAgICAgc2VsZWN0UmFuZ2UocmFuZ2UsIHdpbik7CiAgICB9OwogIH0KfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/stringstream.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogU3RyaW5nIHN0cmVhbXMgYXJlIHRoZSB0aGluZ3MgZmVkIHRvIHBhcnNlcnMgKHdoaWNoIGNhbiBmZWVkIHRoZW0KICogdG8gYSB0b2tlbml6ZXIgaWYgdGhleSB3YW50KS4gVGhleSBwcm92aWRlIHBlZWsgYW5kIG5leHQgbWV0aG9kcwogKiBmb3IgbG9va2luZyBhdCB0aGUgY3VycmVudCBjaGFyYWN0ZXIgKG5leHQgJ2NvbnN1bWVzJyB0aGlzCiAqIGNoYXJhY3RlciwgcGVlayBkb2VzIG5vdCksIGFuZCBhIGdldCBtZXRob2QgZm9yIHJldHJpZXZpbmcgYWxsIHRoZQogKiB0ZXh0IHRoYXQgd2FzIGNvbnN1bWVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgZ2V0IHdhcyBjYWxsZWQuCiAqCiAqIEFuIGVhc3kgbWlzdGFrZSB0byBtYWtlIGlzIHRvIGxldCBhIFN0b3BJdGVyYXRpb24gZXhjZXB0aW9uIGZpbmlzaAogKiB0aGUgdG9rZW4gc3RyZWFtIHdoaWxlIHRoZXJlIGFyZSBzdGlsbCBjaGFyYWN0ZXJzIHBlbmRpbmcgaW4gdGhlCiAqIHN0cmluZyBzdHJlYW0gKGhpdHRpbmcgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIHdoaWxlIHBhcnNpbmcgYQogKiB0b2tlbikuIFRvIG1ha2UgaXQgZWFzaWVyIHRvIGRldGVjdCBzdWNoIGVycm9ycywgdGhlIHN0cmluZ3N0cmVhbXMKICogdGhyb3cgYW4gZXhjZXB0aW9uIHdoZW4gdGhpcyBoYXBwZW5zLgogKi8KCi8vIE1ha2UgYSBzdHJpbmdzdHJlYW0gc3RyZWFtIG91dCBvZiBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgc3RyaW5ncy4KLy8gVGhpcyBpcyBhcHBsaWVkIHRvIHRoZSByZXN1bHQgb2YgdHJhdmVyc2VET00gKHNlZSBjb2RlbWlycm9yLmpzKSwKLy8gYW5kIHRoZSByZXN1bHRpbmcgc3RyZWFtIGlzIGZlZCB0byB0aGUgcGFyc2VyLgp2YXIgc3RyaW5nU3RyZWFtID0gZnVuY3Rpb24oc291cmNlKXsKICAvLyBTdHJpbmcgdGhhdCdzIGN1cnJlbnRseSBiZWluZyBpdGVyYXRlZCBvdmVyLgogIHZhciBjdXJyZW50ID0gIiI7CiAgLy8gUG9zaXRpb24gaW4gdGhhdCBzdHJpbmcuCiAgdmFyIHBvcyA9IDA7CiAgLy8gQWNjdW11bGF0b3IgZm9yIHN0cmluZ3MgdGhhdCBoYXZlIGJlZW4gaXRlcmF0ZWQgb3ZlciBidXQgbm90CiAgLy8gZ2V0KCktZWQgeWV0LgogIHZhciBhY2N1bSA9ICIiOwogIC8vIE1ha2Ugc3VyZSB0aGVyZSBhcmUgbW9yZSBjaGFyYWN0ZXJzIHJlYWR5LCBvciB0aHJvdwogIC8vIFN0b3BJdGVyYXRpb24uCiAgZnVuY3Rpb24gZW5zdXJlQ2hhcnMoKSB7CiAgICB3aGlsZSAocG9zID09IGN1cnJlbnQubGVuZ3RoKSB7CiAgICAgIGFjY3VtICs9IGN1cnJlbnQ7CiAgICAgIGN1cnJlbnQgPSAiIjsgLy8gSW4gY2FzZSBzb3VyY2UubmV4dCgpIHRocm93cwogICAgICBwb3MgPSAwOwogICAgICB0cnkge2N1cnJlbnQgPSBzb3VyY2UubmV4dCgpO30KICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICBpZiAoZSAhPSBTdG9wSXRlcmF0aW9uKSB0aHJvdyBlOwogICAgICAgIGVsc2UgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIHJldHVybiB7CiAgICAvLyBSZXR1cm4gdGhlIG5leHQgY2hhcmFjdGVyIGluIHRoZSBzdHJlYW0uCiAgICBwZWVrOiBmdW5jdGlvbigpIHsKICAgICAgaWYgKCFlbnN1cmVDaGFycygpKSByZXR1cm4gbnVsbDsKICAgICAgcmV0dXJuIGN1cnJlbnQuY2hhckF0KHBvcyk7CiAgICB9LAogICAgLy8gR2V0IHRoZSBuZXh0IGNoYXJhY3RlciwgdGhyb3cgU3RvcEl0ZXJhdGlvbiBpZiBhdCBlbmQsIGNoZWNrCiAgICAvLyBmb3IgdW51c2VkIGNvbnRlbnQuCiAgICBuZXh0OiBmdW5jdGlvbigpIHsKICAgICAgaWYgKCFlbnN1cmVDaGFycygpKSB7CiAgICAgICAgaWYgKGFjY3VtLmxlbmd0aCA+IDApCiAgICAgICAgICB0aHJvdyAiRW5kIG9mIHN0cmluZ3N0cmVhbSByZWFjaGVkIHdpdGhvdXQgZW1wdHlpbmcgYnVmZmVyICgnIiArIGFjY3VtICsgIicpLiI7CiAgICAgICAgZWxzZQogICAgICAgICAgdGhyb3cgU3RvcEl0ZXJhdGlvbjsKICAgICAgfQogICAgICByZXR1cm4gY3VycmVudC5jaGFyQXQocG9zKyspOwogICAgfSwKICAgIC8vIFJldHVybiB0aGUgY2hhcmFjdGVycyBpdGVyYXRlZCBvdmVyIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8KICAgIC8vIC5nZXQoKS4KICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHZhciB0ZW1wID0gYWNjdW07CiAgICAgIGFjY3VtID0gIiI7CiAgICAgIGlmIChwb3MgPiAwKXsKICAgICAgICB0ZW1wICs9IGN1cnJlbnQuc2xpY2UoMCwgcG9zKTsKICAgICAgICBjdXJyZW50ID0gY3VycmVudC5zbGljZShwb3MpOwogICAgICAgIHBvcyA9IDA7CiAgICAgIH0KICAgICAgcmV0dXJuIHRlbXA7CiAgICB9LAogICAgLy8gUHVzaCBhIHN0cmluZyBiYWNrIGludG8gdGhlIHN0cmVhbS4KICAgIHB1c2g6IGZ1bmN0aW9uKHN0cikgewogICAgICBjdXJyZW50ID0gY3VycmVudC5zbGljZSgwLCBwb3MpICsgc3RyICsgY3VycmVudC5zbGljZShwb3MpOwogICAgfSwKICAgIGxvb2tBaGVhZDogZnVuY3Rpb24oc3RyLCBjb25zdW1lLCBza2lwU3BhY2VzLCBjYXNlSW5zZW5zaXRpdmUpIHsKICAgICAgZnVuY3Rpb24gY2FzZWQoc3RyKSB7cmV0dXJuIGNhc2VJbnNlbnNpdGl2ZSA/IHN0ci50b0xvd2VyQ2FzZSgpIDogc3RyO30KICAgICAgc3RyID0gY2FzZWQoc3RyKTsKICAgICAgdmFyIGZvdW5kID0gZmFsc2U7CgogICAgICB2YXIgX2FjY3VtID0gYWNjdW0sIF9wb3MgPSBwb3M7CiAgICAgIGlmIChza2lwU3BhY2VzKSB0aGlzLm5leHRXaGlsZU1hdGNoZXMoL1tcc1x1MDBhMF0vKTsKCiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgdmFyIGVuZCA9IHBvcyArIHN0ci5sZW5ndGgsIGxlZnQgPSBjdXJyZW50Lmxlbmd0aCAtIHBvczsKICAgICAgICBpZiAoZW5kIDw9IGN1cnJlbnQubGVuZ3RoKSB7CiAgICAgICAgICBmb3VuZCA9IHN0ciA9PSBjYXNlZChjdXJyZW50LnNsaWNlKHBvcywgZW5kKSk7CiAgICAgICAgICBwb3MgPSBlbmQ7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoc3RyLnNsaWNlKDAsIGxlZnQpID09IGNhc2VkKGN1cnJlbnQuc2xpY2UocG9zKSkpIHsKICAgICAgICAgIGFjY3VtICs9IGN1cnJlbnQ7IGN1cnJlbnQgPSAiIjsKICAgICAgICAgIHRyeSB7Y3VycmVudCA9IHNvdXJjZS5uZXh0KCk7fQogICAgICAgICAgY2F0Y2ggKGUpIHticmVhazt9CiAgICAgICAgICBwb3MgPSAwOwogICAgICAgICAgc3RyID0gc3RyLnNsaWNlKGxlZnQpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKCEoZm91bmQgJiYgY29uc3VtZSkpIHsKICAgICAgICBjdXJyZW50ID0gYWNjdW0uc2xpY2UoX2FjY3VtLmxlbmd0aCkgKyBjdXJyZW50OwogICAgICAgIHBvcyA9IF9wb3M7CiAgICAgICAgYWNjdW0gPSBfYWNjdW07CiAgICAgIH0KCiAgICAgIHJldHVybiBmb3VuZDsKICAgIH0sCgogICAgLy8gVXRpbHMgYnVpbHQgb24gdG9wIG9mIHRoZSBhYm92ZQogICAgbW9yZTogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLnBlZWsoKSAhPT0gbnVsbDsKICAgIH0sCiAgICBhcHBsaWVzOiBmdW5jdGlvbih0ZXN0KSB7CiAgICAgIHZhciBuZXh0ID0gdGhpcy5wZWVrKCk7CiAgICAgIHJldHVybiAobmV4dCAhPT0gbnVsbCAmJiB0ZXN0KG5leHQpKTsKICAgIH0sCiAgICBuZXh0V2hpbGU6IGZ1bmN0aW9uKHRlc3QpIHsKICAgICAgdmFyIG5leHQ7CiAgICAgIHdoaWxlICgobmV4dCA9IHRoaXMucGVlaygpKSAhPT0gbnVsbCAmJiB0ZXN0KG5leHQpKQogICAgICAgIHRoaXMubmV4dCgpOwogICAgfSwKICAgIG1hdGNoZXM6IGZ1bmN0aW9uKHJlKSB7CiAgICAgIHZhciBuZXh0ID0gdGhpcy5wZWVrKCk7CiAgICAgIHJldHVybiAobmV4dCAhPT0gbnVsbCAmJiByZS50ZXN0KG5leHQpKTsKICAgIH0sCiAgICBuZXh0V2hpbGVNYXRjaGVzOiBmdW5jdGlvbihyZSkgewogICAgICB2YXIgbmV4dDsKICAgICAgd2hpbGUgKChuZXh0ID0gdGhpcy5wZWVrKCkpICE9PSBudWxsICYmIHJlLnRlc3QobmV4dCkpCiAgICAgICAgdGhpcy5uZXh0KCk7CiAgICB9LAogICAgZXF1YWxzOiBmdW5jdGlvbihjaCkgewogICAgICByZXR1cm4gY2ggPT09IHRoaXMucGVlaygpOwogICAgfSwKICAgIGVuZE9mTGluZTogZnVuY3Rpb24oKSB7CiAgICAgIHZhciBuZXh0ID0gdGhpcy5wZWVrKCk7CiAgICAgIHJldHVybiBuZXh0ID09IG51bGwgfHwgbmV4dCA9PSAiXG4iOwogICAgfQogIH07Cn07Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/tokenize.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQSBmcmFtZXdvcmsgZm9yIHNpbXBsZSB0b2tlbml6ZXJzLiBUYWtlcyBjYXJlIG9mIG5ld2xpbmVzIGFuZAovLyB3aGl0ZS1zcGFjZSwgYW5kIG9mIGdldHRpbmcgdGhlIHRleHQgZnJvbSB0aGUgc291cmNlIHN0cmVhbSBpbnRvCi8vIHRoZSB0b2tlbiBvYmplY3QuIEEgc3RhdGUgaXMgYSBmdW5jdGlvbiBvZiB0d28gYXJndW1lbnRzIC0tIGEKLy8gc3RyaW5nIHN0cmVhbSBhbmQgYSBzZXRTdGF0ZSBmdW5jdGlvbi4gVGhlIHNlY29uZCBjYW4gYmUgdXNlZCB0bwovLyBjaGFuZ2UgdGhlIHRva2VuaXplcidzIHN0YXRlLCBhbmQgY2FuIGJlIGlnbm9yZWQgZm9yIHN0YXRlbGVzcwovLyB0b2tlbml6ZXJzLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBhZHZhbmNlIHRoZSBzdHJlYW0gb3ZlciBhIHRva2VuCi8vIGFuZCByZXR1cm4gYSBzdHJpbmcgb3Igb2JqZWN0IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG5leHQKLy8gdG9rZW4sIG9yIG51bGwgdG8gcGFzcyBhbmQgaGF2ZSB0aGUgKG5ldykgc3RhdGUgYmUgY2FsbGVkIHRvIGZpbmlzaAovLyB0aGUgdG9rZW4uIFdoZW4gYSBzdHJpbmcgaXMgZ2l2ZW4sIGl0IGlzIHdyYXBwZWQgaW4gYSB7c3R5bGUsIHR5cGV9Ci8vIG9iamVjdC4gSW4gdGhlIHJlc3VsdGluZyBvYmplY3QsIHRoZSBjaGFyYWN0ZXJzIGNvbnN1bWVkIGFyZSBzdG9yZWQKLy8gdW5kZXIgdGhlIGNvbnRlbnQgcHJvcGVydHkuIEFueSB3aGl0ZXNwYWNlIGZvbGxvd2luZyB0aGVtIGlzIGFsc28KLy8gYXV0b21hdGljYWxseSBjb25zdW1lZCwgYW5kIGFkZGVkIHRvIHRoZSB2YWx1ZSBwcm9wZXJ0eS4gKFRodXMsCi8vIGNvbnRlbnQgaXMgdGhlIGFjdHVhbCBtZWFuaW5nZnVsIHBhcnQgb2YgdGhlIHRva2VuLCB3aGlsZSB2YWx1ZQovLyBjb250YWlucyBhbGwgdGhlIHRleHQgaXQgc3BhbnMuKQoKZnVuY3Rpb24gdG9rZW5pemVyKHNvdXJjZSwgc3RhdGUpIHsKICAvLyBOZXdsaW5lcyBhcmUgYWx3YXlzIGEgc2VwYXJhdGUgdG9rZW4uCiAgZnVuY3Rpb24gaXNXaGl0ZVNwYWNlKGNoKSB7CiAgICAvLyBUaGUgbWVzc3kgcmVnZXhwIGlzIGJlY2F1c2UgSUUncyByZWdleHAgbWF0Y2hlciBpcyBvZiB0aGUKICAgIC8vIG9waW5pb24gdGhhdCBub24tYnJlYWtpbmcgc3BhY2VzIGFyZSBubyB3aGl0ZXNwYWNlLgogICAgcmV0dXJuIGNoICE9ICJcbiIgJiYgL15bXHNcdTAwYTBdKiQvLnRlc3QoY2gpOwogIH0KCiAgdmFyIHRva2VuaXplciA9IHsKICAgIHN0YXRlOiBzdGF0ZSwKCiAgICB0YWtlOiBmdW5jdGlvbih0eXBlKSB7CiAgICAgIGlmICh0eXBlb2YodHlwZSkgPT0gInN0cmluZyIpCiAgICAgICAgdHlwZSA9IHtzdHlsZTogdHlwZSwgdHlwZTogdHlwZX07CgogICAgICB0eXBlLmNvbnRlbnQgPSAodHlwZS5jb250ZW50IHx8ICIiKSArIHNvdXJjZS5nZXQoKTsKICAgICAgaWYgKCEvXG4kLy50ZXN0KHR5cGUuY29udGVudCkpCiAgICAgICAgc291cmNlLm5leHRXaGlsZShpc1doaXRlU3BhY2UpOwogICAgICB0eXBlLnZhbHVlID0gdHlwZS5jb250ZW50ICsgc291cmNlLmdldCgpOwogICAgICByZXR1cm4gdHlwZTsKICAgIH0sCgogICAgbmV4dDogZnVuY3Rpb24gKCkgewogICAgICBpZiAoIXNvdXJjZS5tb3JlKCkpIHRocm93IFN0b3BJdGVyYXRpb247CgogICAgICB2YXIgdHlwZTsKICAgICAgaWYgKHNvdXJjZS5lcXVhbHMoIlxuIikpIHsKICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICAgIHJldHVybiB0aGlzLnRha2UoIndoaXRlc3BhY2UiKTsKICAgICAgfQogICAgICAKICAgICAgaWYgKHNvdXJjZS5hcHBsaWVzKGlzV2hpdGVTcGFjZSkpCiAgICAgICAgdHlwZSA9ICJ3aGl0ZXNwYWNlIjsKICAgICAgZWxzZQogICAgICAgIHdoaWxlICghdHlwZSkKICAgICAgICAgIHR5cGUgPSB0aGlzLnN0YXRlKHNvdXJjZSwgZnVuY3Rpb24ocykge3Rva2VuaXplci5zdGF0ZSA9IHM7fSk7CgogICAgICByZXR1cm4gdGhpcy50YWtlKHR5cGUpOwogICAgfQogIH07CiAgcmV0dXJuIHRva2VuaXplcjsKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/tokenizejavascript.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogVG9rZW5pemVyIGZvciBKYXZhU2NyaXB0IGNvZGUgKi8KCnZhciB0b2tlbml6ZUphdmFTY3JpcHQgPSAoZnVuY3Rpb24oKSB7CiAgLy8gQWR2YW5jZSB0aGUgc3RyZWFtIHVudGlsIHRoZSBnaXZlbiBjaGFyYWN0ZXIgKG5vdCBwcmVjZWRlZCBieSBhCiAgLy8gYmFja3NsYXNoKSBpcyBlbmNvdW50ZXJlZCwgb3IgdGhlIGVuZCBvZiB0aGUgbGluZSBpcyByZWFjaGVkLgogIGZ1bmN0aW9uIG5leHRVbnRpbFVuZXNjYXBlZChzb3VyY2UsIGVuZCkgewogICAgdmFyIGVzY2FwZWQgPSBmYWxzZTsKICAgIHdoaWxlICghc291cmNlLmVuZE9mTGluZSgpKSB7CiAgICAgIHZhciBuZXh0ID0gc291cmNlLm5leHQoKTsKICAgICAgaWYgKG5leHQgPT0gZW5kICYmICFlc2NhcGVkKQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIG5leHQgPT0gIlxcIjsKICAgIH0KICAgIHJldHVybiBlc2NhcGVkOwogIH0KCiAgLy8gQSBtYXAgb2YgSmF2YVNjcmlwdCdzIGtleXdvcmRzLiBUaGUgYS9iL2Mga2V5d29yZCBkaXN0aW5jdGlvbiBpcwogIC8vIHZlcnkgcm91Z2gsIGJ1dCBpdCBnaXZlcyB0aGUgcGFyc2VyIGVub3VnaCBpbmZvcm1hdGlvbiB0byBwYXJzZQogIC8vIGNvcnJlY3QgY29kZSBjb3JyZWN0bHkgKHdlIGRvbid0IGNhcmUgdGhhdCBtdWNoIGhvdyB3ZSBwYXJzZQogIC8vIGluY29ycmVjdCBjb2RlKS4gVGhlIHN0eWxlIGluZm9ybWF0aW9uIGluY2x1ZGVkIGluIHRoZXNlIG9iamVjdHMKICAvLyBpcyB1c2VkIGJ5IHRoZSBoaWdobGlnaHRlciB0byBwaWNrIHRoZSBjb3JyZWN0IENTUyBzdHlsZSBmb3IgYQogIC8vIHRva2VuLgogIHZhciBrZXl3b3JkcyA9IGZ1bmN0aW9uKCl7CiAgICBmdW5jdGlvbiByZXN1bHQodHlwZSwgc3R5bGUpewogICAgICByZXR1cm4ge3R5cGU6IHR5cGUsIHN0eWxlOiAianMtIiArIHN0eWxlfTsKICAgIH0KICAgIC8vIGtleXdvcmRzIHRoYXQgdGFrZSBhIHBhcmVudGhpc2VkIGV4cHJlc3Npb24sIGFuZCB0aGVuIGEKICAgIC8vIHN0YXRlbWVudCAoaWYpCiAgICB2YXIga2V5d29yZEEgPSByZXN1bHQoImtleXdvcmQgYSIsICJrZXl3b3JkIik7CiAgICAvLyBrZXl3b3JkcyB0aGF0IHRha2UganVzdCBhIHN0YXRlbWVudCAoZWxzZSkKICAgIHZhciBrZXl3b3JkQiA9IHJlc3VsdCgia2V5d29yZCBiIiwgImtleXdvcmQiKTsKICAgIC8vIGtleXdvcmRzIHRoYXQgb3B0aW9uYWxseSB0YWtlIGFuIGV4cHJlc3Npb24sIGFuZCBmb3JtIGEKICAgIC8vIHN0YXRlbWVudCAocmV0dXJuKQogICAgdmFyIGtleXdvcmRDID0gcmVzdWx0KCJrZXl3b3JkIGMiLCAia2V5d29yZCIpOwogICAgdmFyIG9wZXJhdG9yID0gcmVzdWx0KCJvcGVyYXRvciIsICJrZXl3b3JkIik7CiAgICB2YXIgYXRvbSA9IHJlc3VsdCgiYXRvbSIsICJhdG9tIik7CiAgICByZXR1cm4gewogICAgICAiaWYiOiBrZXl3b3JkQSwgIndoaWxlIjoga2V5d29yZEEsICJ3aXRoIjoga2V5d29yZEEsCiAgICAgICJlbHNlIjoga2V5d29yZEIsICJkbyI6IGtleXdvcmRCLCAidHJ5Ijoga2V5d29yZEIsICJmaW5hbGx5Ijoga2V5d29yZEIsCiAgICAgICJyZXR1cm4iOiBrZXl3b3JkQywgImJyZWFrIjoga2V5d29yZEMsICJjb250aW51ZSI6IGtleXdvcmRDLCAibmV3Ijoga2V5d29yZEMsICJkZWxldGUiOiBrZXl3b3JkQywgInRocm93Ijoga2V5d29yZEMsCiAgICAgICJpbiI6IG9wZXJhdG9yLCAidHlwZW9mIjogb3BlcmF0b3IsICJpbnN0YW5jZW9mIjogb3BlcmF0b3IsCiAgICAgICJ2YXIiOiByZXN1bHQoInZhciIsICJrZXl3b3JkIiksICJmdW5jdGlvbiI6IHJlc3VsdCgiZnVuY3Rpb24iLCAia2V5d29yZCIpLCAiY2F0Y2giOiByZXN1bHQoImNhdGNoIiwgImtleXdvcmQiKSwKICAgICAgImZvciI6IHJlc3VsdCgiZm9yIiwgImtleXdvcmQiKSwgInN3aXRjaCI6IHJlc3VsdCgic3dpdGNoIiwgImtleXdvcmQiKSwKICAgICAgImNhc2UiOiByZXN1bHQoImNhc2UiLCAia2V5d29yZCIpLCAiZGVmYXVsdCI6IHJlc3VsdCgiZGVmYXVsdCIsICJrZXl3b3JkIiksCiAgICAgICJ0cnVlIjogYXRvbSwgImZhbHNlIjogYXRvbSwgIm51bGwiOiBhdG9tLCAidW5kZWZpbmVkIjogYXRvbSwgIk5hTiI6IGF0b20sICJJbmZpbml0eSI6IGF0b20KICAgIH07CiAgfSgpOwoKICAvLyBTb21lIGhlbHBlciByZWdleHBzCiAgdmFyIGlzT3BlcmF0b3JDaGFyID0gL1srXC0qJiU9PD4hP3xdLzsKICB2YXIgaXNIZXhEaWdpdCA9IC9bMC05QS1GYS1mXS87CiAgdmFyIGlzV29yZENoYXIgPSAvW1x3XCRfXS87CgogIC8vIFdyYXBwZXIgYXJvdW5kIGpzVG9rZW4gdGhhdCBoZWxwcyBtYWludGFpbiBwYXJzZXIgc3RhdGUgKHdoZXRoZXIKICAvLyB3ZSBhcmUgaW5zaWRlIG9mIGEgbXVsdGktbGluZSBjb21tZW50IGFuZCB3aGV0aGVyIHRoZSBuZXh0IHRva2VuCiAgLy8gY291bGQgYmUgYSByZWd1bGFyIGV4cHJlc3Npb24pLgogIGZ1bmN0aW9uIGpzVG9rZW5TdGF0ZShpbnNpZGUsIHJlZ2V4cCkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSwgc2V0U3RhdGUpIHsKICAgICAgdmFyIG5ld0luc2lkZSA9IGluc2lkZTsKICAgICAgdmFyIHR5cGUgPSBqc1Rva2VuKGluc2lkZSwgcmVnZXhwLCBzb3VyY2UsIGZ1bmN0aW9uKGMpIHtuZXdJbnNpZGUgPSBjO30pOwogICAgICB2YXIgbmV3UmVnZXhwID0gdHlwZS50eXBlID09ICJvcGVyYXRvciIgfHwgdHlwZS50eXBlID09ICJrZXl3b3JkIGMiIHx8IHR5cGUudHlwZS5tYXRjaCgvXltcW3t9XCgsOzpdJC8pOwogICAgICBpZiAobmV3UmVnZXhwICE9IHJlZ2V4cCB8fCBuZXdJbnNpZGUgIT0gaW5zaWRlKQogICAgICAgIHNldFN0YXRlKGpzVG9rZW5TdGF0ZShuZXdJbnNpZGUsIG5ld1JlZ2V4cCkpOwogICAgICByZXR1cm4gdHlwZTsKICAgIH07CiAgfQoKICAvLyBUaGUgdG9rZW4gcmVhZGVyLCBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IHRoZSB0b2tlbml6ZXIgZnJvbQogIC8vIHRva2VuaXplLmpzICh0aHJvdWdoIGpzVG9rZW5TdGF0ZSkuIEFkdmFuY2VzIHRoZSBzb3VyY2Ugc3RyZWFtCiAgLy8gb3ZlciBhIHRva2VuLCBhbmQgcmV0dXJucyBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgdHlwZSBhbmQgc3R5bGUKICAvLyBvZiB0aGF0IHRva2VuLgogIGZ1bmN0aW9uIGpzVG9rZW4oaW5zaWRlLCByZWdleHAsIHNvdXJjZSwgc2V0SW5zaWRlKSB7CiAgICBmdW5jdGlvbiByZWFkSGV4TnVtYmVyKCl7CiAgICAgIHNvdXJjZS5uZXh0KCk7IC8vIHNraXAgdGhlICd4JwogICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcyhpc0hleERpZ2l0KTsKICAgICAgcmV0dXJuIHt0eXBlOiAibnVtYmVyIiwgc3R5bGU6ICJqcy1hdG9tIn07CiAgICB9CgogICAgZnVuY3Rpb24gcmVhZE51bWJlcigpIHsKICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1swLTldLyk7CiAgICAgIGlmIChzb3VyY2UuZXF1YWxzKCIuIikpewogICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1swLTldLyk7CiAgICAgIH0KICAgICAgaWYgKHNvdXJjZS5lcXVhbHMoImUiKSB8fCBzb3VyY2UuZXF1YWxzKCJFIikpewogICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgaWYgKHNvdXJjZS5lcXVhbHMoIi0iKSkKICAgICAgICAgIHNvdXJjZS5uZXh0KCk7CiAgICAgICAgc291cmNlLm5leHRXaGlsZU1hdGNoZXMoL1swLTldLyk7CiAgICAgIH0KICAgICAgcmV0dXJuIHt0eXBlOiAibnVtYmVyIiwgc3R5bGU6ICJqcy1hdG9tIn07CiAgICB9CiAgICAvLyBSZWFkIGEgd29yZCwgbG9vayBpdCB1cCBpbiBrZXl3b3Jkcy4gSWYgbm90IGZvdW5kLCBpdCBpcyBhCiAgICAvLyB2YXJpYWJsZSwgb3RoZXJ3aXNlIGl0IGlzIGEga2V5d29yZCBvZiB0aGUgdHlwZSBmb3VuZC4KICAgIGZ1bmN0aW9uIHJlYWRXb3JkKCkgewogICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcyhpc1dvcmRDaGFyKTsKICAgICAgdmFyIHdvcmQgPSBzb3VyY2UuZ2V0KCk7CiAgICAgIHZhciBrbm93biA9IGtleXdvcmRzLmhhc093blByb3BlcnR5KHdvcmQpICYmIGtleXdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKHdvcmQpICYmIGtleXdvcmRzW3dvcmRdOwogICAgICByZXR1cm4ga25vd24gPyB7dHlwZToga25vd24udHlwZSwgc3R5bGU6IGtub3duLnN0eWxlLCBjb250ZW50OiB3b3JkfSA6CiAgICAgIHt0eXBlOiAidmFyaWFibGUiLCBzdHlsZTogImpzLXZhcmlhYmxlIiwgY29udGVudDogd29yZH07CiAgICB9CiAgICBmdW5jdGlvbiByZWFkUmVnZXhwKCkgewogICAgICBuZXh0VW50aWxVbmVzY2FwZWQoc291cmNlLCAiLyIpOwogICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcygvW2dpXS8pOwogICAgICByZXR1cm4ge3R5cGU6ICJyZWdleHAiLCBzdHlsZTogImpzLXN0cmluZyJ9OwogICAgfQogICAgLy8gTXV0bGktbGluZSBjb21tZW50cyBhcmUgdHJpY2t5LiBXZSB3YW50IHRvIHJldHVybiB0aGUgbmV3bGluZXMKICAgIC8vIGVtYmVkZGVkIGluIHRoZW0gYXMgcmVndWxhciBuZXdsaW5lIHRva2VucywgYW5kIHRoZW4gY29udGludWUKICAgIC8vIHJldHVybmluZyBhIGNvbW1lbnQgdG9rZW4gZm9yIGV2ZXJ5IGxpbmUgb2YgdGhlIGNvbW1lbnQuIFNvCiAgICAvLyBzb21lIHN0YXRlIGhhcyB0byBiZSBzYXZlZCAoaW5zaWRlKSB0byBpbmRpY2F0ZSB3aGV0aGVyIHdlIGFyZQogICAgLy8gaW5zaWRlIGEgLyogKi8gc2VxdWVuY2UuCiAgICBmdW5jdGlvbiByZWFkTXVsdGlsaW5lQ29tbWVudChzdGFydCl7CiAgICAgIHZhciBuZXdJbnNpZGUgPSAiLyoiOwogICAgICB2YXIgbWF5YmVFbmQgPSAoc3RhcnQgPT0gIioiKTsKICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICBpZiAoc291cmNlLmVuZE9mTGluZSgpKQogICAgICAgICAgYnJlYWs7CiAgICAgICAgdmFyIG5leHQgPSBzb3VyY2UubmV4dCgpOwogICAgICAgIGlmIChuZXh0ID09ICIvIiAmJiBtYXliZUVuZCl7CiAgICAgICAgICBuZXdJbnNpZGUgPSBudWxsOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIG1heWJlRW5kID0gKG5leHQgPT0gIioiKTsKICAgICAgfQogICAgICBzZXRJbnNpZGUobmV3SW5zaWRlKTsKICAgICAgcmV0dXJuIHt0eXBlOiAiY29tbWVudCIsIHN0eWxlOiAianMtY29tbWVudCJ9OwogICAgfQogICAgZnVuY3Rpb24gcmVhZE9wZXJhdG9yKCkgewogICAgICBzb3VyY2UubmV4dFdoaWxlTWF0Y2hlcyhpc09wZXJhdG9yQ2hhcik7CiAgICAgIHJldHVybiB7dHlwZTogIm9wZXJhdG9yIiwgc3R5bGU6ICJqcy1vcGVyYXRvciJ9OwogICAgfQogICAgZnVuY3Rpb24gcmVhZFN0cmluZyhxdW90ZSkgewogICAgICB2YXIgZW5kQmFja1NsYXNoID0gbmV4dFVudGlsVW5lc2NhcGVkKHNvdXJjZSwgcXVvdGUpOwogICAgICBzZXRJbnNpZGUoZW5kQmFja1NsYXNoID8gcXVvdGUgOiBudWxsKTsKICAgICAgcmV0dXJuIHt0eXBlOiAic3RyaW5nIiwgc3R5bGU6ICJqcy1zdHJpbmcifTsKICAgIH0KCiAgICAvLyBGZXRjaCB0aGUgbmV4dCB0b2tlbi4gRGlzcGF0Y2hlcyBvbiBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlCiAgICAvLyBzdHJlYW0sIG9yIGZpcnN0IHR3byBjaGFyYWN0ZXJzIHdoZW4gdGhlIGZpcnN0IGlzIGEgc2xhc2guCiAgICBpZiAoaW5zaWRlID09ICJcIiIgfHwgaW5zaWRlID09ICInIikKICAgICAgcmV0dXJuIHJlYWRTdHJpbmcoaW5zaWRlKTsKICAgIHZhciBjaCA9IHNvdXJjZS5uZXh0KCk7CiAgICBpZiAoaW5zaWRlID09ICIvKiIpCiAgICAgIHJldHVybiByZWFkTXVsdGlsaW5lQ29tbWVudChjaCk7CiAgICBlbHNlIGlmIChjaCA9PSAiXCIiIHx8IGNoID09ICInIikKICAgICAgcmV0dXJuIHJlYWRTdHJpbmcoY2gpOwogICAgLy8gd2l0aCBwdW5jdHVhdGlvbiwgdGhlIHR5cGUgb2YgdGhlIHRva2VuIGlzIHRoZSBzeW1ib2wgaXRzZWxmCiAgICBlbHNlIGlmICgvW1xbXF17fVwoXCksO1w6XC5dLy50ZXN0KGNoKSkKICAgICAgcmV0dXJuIHt0eXBlOiBjaCwgc3R5bGU6ICJqcy1wdW5jdHVhdGlvbiJ9OwogICAgZWxzZSBpZiAoY2ggPT0gIjAiICYmIChzb3VyY2UuZXF1YWxzKCJ4IikgfHwgc291cmNlLmVxdWFscygiWCIpKSkKICAgICAgcmV0dXJuIHJlYWRIZXhOdW1iZXIoKTsKICAgIGVsc2UgaWYgKC9bMC05XS8udGVzdChjaCkpCiAgICAgIHJldHVybiByZWFkTnVtYmVyKCk7CiAgICBlbHNlIGlmIChjaCA9PSAiLyIpewogICAgICBpZiAoc291cmNlLmVxdWFscygiKiIpKQogICAgICB7IHNvdXJjZS5uZXh0KCk7IHJldHVybiByZWFkTXVsdGlsaW5lQ29tbWVudChjaCk7IH0KICAgICAgZWxzZSBpZiAoc291cmNlLmVxdWFscygiLyIpKQogICAgICB7IG5leHRVbnRpbFVuZXNjYXBlZChzb3VyY2UsIG51bGwpOyByZXR1cm4ge3R5cGU6ICJjb21tZW50Iiwgc3R5bGU6ICJqcy1jb21tZW50In07fQogICAgICBlbHNlIGlmIChyZWdleHApCiAgICAgICAgcmV0dXJuIHJlYWRSZWdleHAoKTsKICAgICAgZWxzZQogICAgICAgIHJldHVybiByZWFkT3BlcmF0b3IoKTsKICAgIH0KICAgIGVsc2UgaWYgKGlzT3BlcmF0b3JDaGFyLnRlc3QoY2gpKQogICAgICByZXR1cm4gcmVhZE9wZXJhdG9yKCk7CiAgICBlbHNlCiAgICAgIHJldHVybiByZWFkV29yZCgpOwogIH0KCiAgLy8gVGhlIGV4dGVybmFsIGludGVyZmFjZSB0byB0aGUgdG9rZW5pemVyLgogIHJldHVybiBmdW5jdGlvbihzb3VyY2UsIHN0YXJ0U3RhdGUpIHsKICAgIHJldHVybiB0b2tlbml6ZXIoc291cmNlLCBzdGFydFN0YXRlIHx8IGpzVG9rZW5TdGF0ZShmYWxzZSwgdHJ1ZSkpOwogIH07Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/undo.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIFN0b3JhZ2UgYW5kIGNvbnRyb2wgZm9yIHVuZG8gaW5mb3JtYXRpb24gd2l0aGluIGEgQ29kZU1pcnJvcgogKiBlZGl0b3IuICdXaHkgb24gZWFydGggaXMgc3VjaCBhIGNvbXBsaWNhdGVkIG1lc3MgcmVxdWlyZWQgZm9yCiAqIHRoYXQ/JywgSSBoZWFyIHlvdSBhc2suIFRoZSBnb2FsLCBpbiBpbXBsZW1lbnRpbmcgdGhpcywgd2FzIHRvIG1ha2UKICogdGhlIGNvbXBsZXhpdHkgb2Ygc3RvcmluZyBhbmQgcmV2ZXJ0aW5nIHVuZG8gaW5mb3JtYXRpb24gZGVwZW5kCiAqIG9ubHkgb24gdGhlIHNpemUgb2YgdGhlIGVkaXRlZCBvciByZXN0b3JlZCBjb250ZW50LCBub3Qgb24gdGhlIHNpemUKICogb2YgdGhlIHdob2xlIGRvY3VtZW50LiBUaGlzIG1ha2VzIGl0IG5lY2Vzc2FyeSB0byB1c2UgYSBraW5kIG9mCiAqICdkaWZmJyBzeXN0ZW0sIHdoaWNoLCB3aGVuIGFwcGxpZWQgdG8gYSBET00gdHJlZSwgY2F1c2VzIHNvbWUKICogY29tcGxleGl0eSBhbmQgaGFja2VyeS4KICoKICogSW4gc2hvcnQsIHRoZSBlZGl0b3IgJ3RvdWNoZXMnIEJSIGVsZW1lbnRzIGFzIGl0IHBhcnNlcyB0aGVtLCBhbmQKICogdGhlIFVuZG9IaXN0b3J5IHN0b3JlcyB0aGVzZS4gV2hlbiBub3RoaW5nIGlzIHRvdWNoZWQgaW4gY29tbWl0RGVsYXkKICogbWlsbGlzZWNvbmRzLCB0aGUgY2hhbmdlcyBhcmUgY29tbWl0dGVkOiBJdCBnb2VzIG92ZXIgYWxsIHRvdWNoZWQKICogbm9kZXMsIHRocm93cyBvdXQgdGhlIG9uZXMgdGhhdCBkaWQgbm90IGNoYW5nZSBzaW5jZSBsYXN0IGNvbW1pdCBvcgogKiBhcmUgbm8gbG9uZ2VyIGluIHRoZSBkb2N1bWVudCwgYW5kIGFzc2VtYmxlcyB0aGUgcmVzdCBpbnRvIHplcm8gb3IKICogbW9yZSAnY2hhaW5zJyAtLSBhcnJheXMgb2YgYWRqYWNlbnQgbGluZXMuIExpbmtzIGJhY2sgdG8gdGhlc2UKICogY2hhaW5zIGFyZSBhZGRlZCB0byB0aGUgQlIgbm9kZXMsIHdoaWxlIHRoZSBjaGFpbiB0aGF0IHByZXZpb3VzbHkKICogc3Bhbm5lZCB0aGVzZSBub2RlcyBpcyBhZGRlZCB0byB0aGUgdW5kbyBoaXN0b3J5LiBVbmRvaW5nIGEgY2hhbmdlCiAqIG1lYW5zIHRha2luZyBzdWNoIGEgY2hhaW4gb2ZmIHRoZSB1bmRvIGhpc3RvcnksIHJlc3RvcmluZyBpdHMKICogY29udGVudCAodGV4dCBpcyBzYXZlZCBwZXIgbGluZSkgYW5kIGxpbmtpbmcgaXQgYmFjayBpbnRvIHRoZQogKiBkb2N1bWVudC4KICovCgovLyBBIGhpc3Rvcnkgb2JqZWN0IG5lZWRzIHRvIGtub3cgYWJvdXQgdGhlIERPTSBjb250YWluZXIgaG9sZGluZyB0aGUKLy8gZG9jdW1lbnQsIHRoZSBtYXhpbXVtIGFtb3VudCBvZiB1bmRvIGxldmVscyBpdCBzaG91bGQgc3RvcmUsIHRoZQovLyBkZWxheSAob2Ygbm8gaW5wdXQpIGFmdGVyIHdoaWNoIGl0IGNvbW1pdHMgYSBzZXQgb2YgY2hhbmdlcywgYW5kLAovLyB1bmZvcnR1bmF0ZWx5LCB0aGUgJ3BhcmVudCcgd2luZG93IC0tIGEgd2luZG93IHRoYXQgaXMgbm90IGluCi8vIGRlc2lnbk1vZGUsIGFuZCBvbiB3aGljaCBzZXRUaW1lb3V0IHdvcmtzIGluIGV2ZXJ5IGJyb3dzZXIuCmZ1bmN0aW9uIFVuZG9IaXN0b3J5KGNvbnRhaW5lciwgbWF4RGVwdGgsIGNvbW1pdERlbGF5LCBlZGl0b3IpIHsKICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKICB0aGlzLm1heERlcHRoID0gbWF4RGVwdGg7IHRoaXMuY29tbWl0RGVsYXkgPSBjb21taXREZWxheTsKICB0aGlzLmVkaXRvciA9IGVkaXRvcjsgdGhpcy5wYXJlbnQgPSBlZGl0b3IucGFyZW50OwogIC8vIFRoaXMgbGluZSBvYmplY3QgcmVwcmVzZW50cyB0aGUgaW5pdGlhbCwgZW1wdHkgZWRpdG9yLgogIHZhciBpbml0aWFsID0ge3RleHQ6ICIiLCBmcm9tOiBudWxsLCB0bzogbnVsbH07CiAgLy8gQXMgdGhlIGJvcmRlcnMgYmV0d2VlbiBsaW5lcyBhcmUgcmVwcmVzZW50ZWQgYnkgQlIgZWxlbWVudHMsIHRoZQogIC8vIHN0YXJ0IG9mIHRoZSBmaXJzdCBsaW5lIGFuZCB0aGUgZW5kIG9mIHRoZSBsYXN0IG9uZSBhcmUKICAvLyByZXByZXNlbnRlZCBieSBudWxsLiBTaW5jZSB5b3UgY2FuIG5vdCBzdG9yZSBhbnkgcHJvcGVydGllcwogIC8vIChsaW5rcyB0byBsaW5lIG9iamVjdHMpIGluIG51bGwsIHRoZXNlIHByb3BlcnRpZXMgYXJlIHVzZWQgaW4KICAvLyB0aG9zZSBjYXNlcy4KICB0aGlzLmZpcnN0ID0gaW5pdGlhbDsgdGhpcy5sYXN0ID0gaW5pdGlhbDsKICAvLyBTaW1pbGFybHksIGEgJ2hpc3RvcnlUb3VjaGVkJyBwcm9wZXJ0eSBpcyBhZGRlZCB0byB0aGUgQlIgaW4KICAvLyBmcm9udCBvZiBsaW5lcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIHRvdWNoZWQsIGFuZCAnZmlyc3RUb3VjaGVkJwogIC8vIGlzIHVzZWQgZm9yIHRoZSBmaXJzdCBsaW5lLgogIHRoaXMuZmlyc3RUb3VjaGVkID0gZmFsc2U7CiAgLy8gSGlzdG9yeSBpcyB0aGUgc2V0IG9mIGNvbW1pdHRlZCBjaGFuZ2VzLCB0b3VjaGVkIGlzIHRoZSBzZXQgb2YKICAvLyBub2RlcyB0b3VjaGVkIHNpbmNlIHRoZSBsYXN0IGNvbW1pdC4KICB0aGlzLmhpc3RvcnkgPSBbXTsgdGhpcy5yZWRvSGlzdG9yeSA9IFtdOyB0aGlzLnRvdWNoZWQgPSBbXTsKfQoKVW5kb0hpc3RvcnkucHJvdG90eXBlID0gewogIC8vIFNjaGVkdWxlIGEgY29tbWl0IChpZiBubyBvdGhlciB0b3VjaGVzIGNvbWUgaW4gZm9yIGNvbW1pdERlbGF5CiAgLy8gbWlsbGlzZWNvbmRzKS4KICBzY2hlZHVsZUNvbW1pdDogZnVuY3Rpb24oKSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICB0aGlzLnBhcmVudC5jbGVhclRpbWVvdXQodGhpcy5jb21taXRUaW1lb3V0KTsKICAgIHRoaXMuY29tbWl0VGltZW91dCA9IHRoaXMucGFyZW50LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtzZWxmLnRyeUNvbW1pdCgpO30sIHRoaXMuY29tbWl0RGVsYXkpOwogIH0sCgogIC8vIE1hcmsgYSBub2RlIGFzIHRvdWNoZWQuIE51bGwgaXMgYSB2YWxpZCBhcmd1bWVudC4KICB0b3VjaDogZnVuY3Rpb24obm9kZSkgewogICAgdGhpcy5zZXRUb3VjaGVkKG5vZGUpOwogICAgdGhpcy5zY2hlZHVsZUNvbW1pdCgpOwogIH0sCgogIC8vIFVuZG8gdGhlIGxhc3QgY2hhbmdlLgogIHVuZG86IGZ1bmN0aW9uKCkgewogICAgLy8gTWFrZSBzdXJlIHBlbmRpbmcgY2hhbmdlcyBoYXZlIGJlZW4gY29tbWl0dGVkLgogICAgdGhpcy5jb21taXQoKTsKCiAgICBpZiAodGhpcy5oaXN0b3J5Lmxlbmd0aCkgewogICAgICAvLyBUYWtlIHRoZSB0b3AgZGlmZiBmcm9tIHRoZSBoaXN0b3J5LCBhcHBseSBpdCwgYW5kIHN0b3JlIGl0cwogICAgICAvLyBzaGFkb3cgaW4gdGhlIHJlZG8gaGlzdG9yeS4KICAgICAgdmFyIGl0ZW0gPSB0aGlzLmhpc3RvcnkucG9wKCk7CiAgICAgIHRoaXMucmVkb0hpc3RvcnkucHVzaCh0aGlzLnVwZGF0ZVRvKGl0ZW0sICJhcHBseUNoYWluIikpOwogICAgICB0aGlzLm5vdGlmeUVudmlyb25tZW50KCk7CiAgICAgIHJldHVybiB0aGlzLmNoYWluTm9kZShpdGVtKTsKICAgIH0KICB9LAoKICAvLyBSZWRvIHRoZSBsYXN0IHVuZG9uZSBjaGFuZ2UuCiAgcmVkbzogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmNvbW1pdCgpOwogICAgaWYgKHRoaXMucmVkb0hpc3RvcnkubGVuZ3RoKSB7CiAgICAgIC8vIFRoZSBpbnZlcnNlIG9mIHVuZG8sIGJhc2ljYWxseS4KICAgICAgdmFyIGl0ZW0gPSB0aGlzLnJlZG9IaXN0b3J5LnBvcCgpOwogICAgICB0aGlzLmFkZFVuZG9MZXZlbCh0aGlzLnVwZGF0ZVRvKGl0ZW0sICJhcHBseUNoYWluIikpOwogICAgICB0aGlzLm5vdGlmeUVudmlyb25tZW50KCk7CiAgICAgIHJldHVybiB0aGlzLmNoYWluTm9kZShpdGVtKTsKICAgIH0KICB9LAoKICBjbGVhcjogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmhpc3RvcnkgPSBbXTsKICAgIHRoaXMucmVkb0hpc3RvcnkgPSBbXTsKICB9LAoKICAvLyBBc2sgZm9yIHRoZSBzaXplIG9mIHRoZSB1bi9yZWRvIGhpc3Rvcmllcy4KICBoaXN0b3J5U2l6ZTogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4ge3VuZG86IHRoaXMuaGlzdG9yeS5sZW5ndGgsIHJlZG86IHRoaXMucmVkb0hpc3RvcnkubGVuZ3RofTsKICB9LAoKICAvLyBQdXNoIGEgY2hhbmdlc2V0IGludG8gdGhlIGRvY3VtZW50LgogIHB1c2g6IGZ1bmN0aW9uKGZyb20sIHRvLCBsaW5lcykgewogICAgdmFyIGNoYWluID0gW107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBlbmQgPSAoaSA9PSBsaW5lcy5sZW5ndGggLSAxKSA/IHRvIDogdGhpcy5jb250YWluZXIub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJCUiIpOwogICAgICBjaGFpbi5wdXNoKHtmcm9tOiBmcm9tLCB0bzogZW5kLCB0ZXh0OiBjbGVhblRleHQobGluZXNbaV0pfSk7CiAgICAgIGZyb20gPSBlbmQ7CiAgICB9CiAgICB0aGlzLnB1c2hDaGFpbnMoW2NoYWluXSwgZnJvbSA9PSBudWxsICYmIHRvID09IG51bGwpOwogICAgdGhpcy5ub3RpZnlFbnZpcm9ubWVudCgpOwogIH0sCgogIHB1c2hDaGFpbnM6IGZ1bmN0aW9uKGNoYWlucywgZG9Ob3RIaWdobGlnaHQpIHsKICAgIHRoaXMuY29tbWl0KGRvTm90SGlnaGxpZ2h0KTsKICAgIHRoaXMuYWRkVW5kb0xldmVsKHRoaXMudXBkYXRlVG8oY2hhaW5zLCAiYXBwbHlDaGFpbiIpKTsKICAgIHRoaXMucmVkb0hpc3RvcnkgPSBbXTsKICB9LAoKICAvLyBSZXRyaWV2ZSBhIERPTSBub2RlIGZyb20gYSBjaGFpbiAoZm9yIHNjcm9sbGluZyB0byBpdCBhZnRlciB1bmRvL3JlZG8pLgogIGNoYWluTm9kZTogZnVuY3Rpb24oY2hhaW5zKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYWlucy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgc3RhcnQgPSBjaGFpbnNbaV1bMF0sIG5vZGUgPSBzdGFydCAmJiAoc3RhcnQuZnJvbSB8fCBzdGFydC50byk7CiAgICAgIGlmIChub2RlKSByZXR1cm4gbm9kZTsKICAgIH0KICB9LAoKICAvLyBDbGVhciB0aGUgdW5kbyBoaXN0b3J5LCBtYWtlIHRoZSBjdXJyZW50IGRvY3VtZW50IHRoZSBzdGFydAogIC8vIHBvc2l0aW9uLgogIHJlc2V0OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuaGlzdG9yeSA9IFtdOyB0aGlzLnJlZG9IaXN0b3J5ID0gW107CiAgfSwKCiAgdGV4dEFmdGVyOiBmdW5jdGlvbihicikgewogICAgcmV0dXJuIHRoaXMuYWZ0ZXIoYnIpLnRleHQ7CiAgfSwKCiAgbm9kZUFmdGVyOiBmdW5jdGlvbihicikgewogICAgcmV0dXJuIHRoaXMuYWZ0ZXIoYnIpLnRvOwogIH0sCgogIG5vZGVCZWZvcmU6IGZ1bmN0aW9uKGJyKSB7CiAgICByZXR1cm4gdGhpcy5iZWZvcmUoYnIpLmZyb207CiAgfSwKCiAgLy8gQ29tbWl0IHVubGVzcyB0aGVyZSBhcmUgcGVuZGluZyBkaXJ0eSBub2Rlcy4KICB0cnlDb21taXQ6IGZ1bmN0aW9uKCkgewogICAgaWYgKCF3aW5kb3cuVW5kb0hpc3RvcnkpIHJldHVybjsgLy8gU3RvcCB3aGVuIGZyYW1lIGhhcyBiZWVuIHVubG9hZGVkCiAgICBpZiAodGhpcy5lZGl0b3IuaGlnaGxpZ2h0RGlydHkoKSkgdGhpcy5jb21taXQodHJ1ZSk7CiAgICBlbHNlIHRoaXMuc2NoZWR1bGVDb21taXQoKTsKICB9LAoKICAvLyBDaGVjayB3aGV0aGVyIHRoZSB0b3VjaGVkIG5vZGVzIGhvbGQgYW55IGNoYW5nZXMsIGlmIHNvLCBjb21taXQKICAvLyB0aGVtLgogIGNvbW1pdDogZnVuY3Rpb24oZG9Ob3RIaWdobGlnaHQpIHsKICAgIHRoaXMucGFyZW50LmNsZWFyVGltZW91dCh0aGlzLmNvbW1pdFRpbWVvdXQpOwogICAgLy8gTWFrZSBzdXJlIHRoZXJlIGFyZSBubyBwZW5kaW5nIGRpcnR5IG5vZGVzLgogICAgaWYgKCFkb05vdEhpZ2hsaWdodCkgdGhpcy5lZGl0b3IuaGlnaGxpZ2h0RGlydHkodHJ1ZSk7CiAgICAvLyBCdWlsZCBzZXQgb2YgY2hhaW5zLgogICAgdmFyIGNoYWlucyA9IHRoaXMudG91Y2hlZENoYWlucygpLCBzZWxmID0gdGhpczsKCiAgICBpZiAoY2hhaW5zLmxlbmd0aCkgewogICAgICB0aGlzLmFkZFVuZG9MZXZlbCh0aGlzLnVwZGF0ZVRvKGNoYWlucywgImxpbmtDaGFpbiIpKTsKICAgICAgdGhpcy5yZWRvSGlzdG9yeSA9IFtdOwogICAgICB0aGlzLm5vdGlmeUVudmlyb25tZW50KCk7CiAgICB9CiAgfSwKCiAgLy8gWyBlbmQgb2YgcHVibGljIGludGVyZmFjZSBdCgogIC8vIFVwZGF0ZSB0aGUgZG9jdW1lbnQgd2l0aCBhIGdpdmVuIHNldCBvZiBjaGFpbnMsIHJldHVybiBpdHMKICAvLyBzaGFkb3cuIHVwZGF0ZUZ1bmMgc2hvdWxkIGJlICJhcHBseUNoYWluIiBvciAibGlua0NoYWluIi4gSW4gdGhlCiAgLy8gc2Vjb25kIGNhc2UsIHRoZSBjaGFpbnMgYXJlIHRha2VuIHRvIGNvcnJlc3BvbmQgdGhlIHRoZSBjdXJyZW50CiAgLy8gZG9jdW1lbnQsIGFuZCBvbmx5IHRoZSBzdGF0ZSBvZiB0aGUgbGluZSBkYXRhIGlzIHVwZGF0ZWQuIEluIHRoZQogIC8vIGZpcnN0IGNhc2UsIHRoZSBjb250ZW50IG9mIHRoZSBjaGFpbnMgaXMgYWxzbyBwdXNoZWQgaWludG8gdGhlCiAgLy8gZG9jdW1lbnQuCiAgdXBkYXRlVG86IGZ1bmN0aW9uKGNoYWlucywgdXBkYXRlRnVuYykgewogICAgdmFyIHNoYWRvd3MgPSBbXSwgZGlydHkgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hhaW5zLmxlbmd0aDsgaSsrKSB7CiAgICAgIHNoYWRvd3MucHVzaCh0aGlzLnNoYWRvd0NoYWluKGNoYWluc1tpXSkpOwogICAgICBkaXJ0eS5wdXNoKHRoaXNbdXBkYXRlRnVuY10oY2hhaW5zW2ldKSk7CiAgICB9CiAgICBpZiAodXBkYXRlRnVuYyA9PSAiYXBwbHlDaGFpbiIpCiAgICAgIHRoaXMubm90aWZ5RGlydHkoZGlydHkpOwogICAgcmV0dXJuIHNoYWRvd3M7CiAgfSwKCiAgLy8gTm90aWZ5IHRoZSBlZGl0b3IgdGhhdCBzb21lIG5vZGVzIGhhdmUgY2hhbmdlZC4KICBub3RpZnlEaXJ0eTogZnVuY3Rpb24obm9kZXMpIHsKICAgIGZvckVhY2gobm9kZXMsIG1ldGhvZCh0aGlzLmVkaXRvciwgImFkZERpcnR5Tm9kZSIpKQogICAgdGhpcy5lZGl0b3Iuc2NoZWR1bGVIaWdobGlnaHQoKTsKICB9LAoKICBub3RpZnlFbnZpcm9ubWVudDogZnVuY3Rpb24oKSB7CiAgICAvLyBVc2VkIGJ5IHRoZSBsaW5lLXdyYXBwaW5nIGxpbmUtbnVtYmVyaW5nIGNvZGUuCiAgICBpZiAod2luZG93LmZyYW1lRWxlbWVudCAmJiB3aW5kb3cuZnJhbWVFbGVtZW50LkNvZGVNaXJyb3IudXBkYXRlTnVtYmVycykKICAgICAgd2luZG93LmZyYW1lRWxlbWVudC5Db2RlTWlycm9yLnVwZGF0ZU51bWJlcnMoKTsKICAgIGlmICh0aGlzLm9uQ2hhbmdlKSB0aGlzLm9uQ2hhbmdlKCk7CiAgfSwKCiAgLy8gTGluayBhIGNoYWluIGludG8gdGhlIERPTSBub2RlcyAob3IgdGhlIGZpcnN0L2xhc3QgbGlua3MgZm9yIG51bGwKICAvLyBub2RlcykuCiAgbGlua0NoYWluOiBmdW5jdGlvbihjaGFpbikgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFpbi5sZW5ndGg7IGkrKykgewogICAgICB2YXIgbGluZSA9IGNoYWluW2ldOwogICAgICBpZiAobGluZS5mcm9tKSBsaW5lLmZyb20uaGlzdG9yeUFmdGVyID0gbGluZTsKICAgICAgZWxzZSB0aGlzLmZpcnN0ID0gbGluZTsKICAgICAgaWYgKGxpbmUudG8pIGxpbmUudG8uaGlzdG9yeUJlZm9yZSA9IGxpbmU7CiAgICAgIGVsc2UgdGhpcy5sYXN0ID0gbGluZTsKICAgIH0KICB9LAoKICAvLyBHZXQgdGhlIGxpbmUgb2JqZWN0IGFmdGVyL2JlZm9yZSBhIGdpdmVuIG5vZGUuCiAgYWZ0ZXI6IGZ1bmN0aW9uKG5vZGUpIHsKICAgIHJldHVybiBub2RlID8gbm9kZS5oaXN0b3J5QWZ0ZXIgOiB0aGlzLmZpcnN0OwogIH0sCiAgYmVmb3JlOiBmdW5jdGlvbihub2RlKSB7CiAgICByZXR1cm4gbm9kZSA/IG5vZGUuaGlzdG9yeUJlZm9yZSA6IHRoaXMubGFzdDsKICB9LAoKICAvLyBNYXJrIGEgbm9kZSBhcyB0b3VjaGVkIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIG1hcmtlZC4KICBzZXRUb3VjaGVkOiBmdW5jdGlvbihub2RlKSB7CiAgICBpZiAobm9kZSkgewogICAgICBpZiAoIW5vZGUuaGlzdG9yeVRvdWNoZWQpIHsKICAgICAgICB0aGlzLnRvdWNoZWQucHVzaChub2RlKTsKICAgICAgICBub2RlLmhpc3RvcnlUb3VjaGVkID0gdHJ1ZTsKICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgIHRoaXMuZmlyc3RUb3VjaGVkID0gdHJ1ZTsKICAgIH0KICB9LAoKICAvLyBTdG9yZSBhIG5ldyBzZXQgb2YgdW5kbyBpbmZvLCB0aHJvdyBhd2F5IGluZm8gaWYgdGhlcmUgaXMgbW9yZSBvZgogIC8vIGl0IHRoYW4gYWxsb3dlZC4KICBhZGRVbmRvTGV2ZWw6IGZ1bmN0aW9uKGRpZmZzKSB7CiAgICB0aGlzLmhpc3RvcnkucHVzaChkaWZmcyk7CiAgICBpZiAodGhpcy5oaXN0b3J5Lmxlbmd0aCA+IHRoaXMubWF4RGVwdGgpCiAgICAgIHRoaXMuaGlzdG9yeS5zaGlmdCgpOwogIH0sCgogIC8vIEJ1aWxkIGNoYWlucyBmcm9tIGEgc2V0IG9mIHRvdWNoZWQgbm9kZXMuCiAgdG91Y2hlZENoYWluczogZnVuY3Rpb24oKSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgLy8gVGhlIHRlbXAgc3lzdGVtIGlzIGEgY3J1bW15IGhhY2sgdG8gc3BlZWQgdXAgZGV0ZXJtaW5pbmcKICAgIC8vIHdoZXRoZXIgYSAoY3VycmVudGx5IHRvdWNoZWQpIG5vZGUgaGFzIGEgbGluZSBvYmplY3QgYXNzb2NpYXRlZAogICAgLy8gd2l0aCBpdC4gbnVsbFRlbXAgaXMgdXNlZCB0byBzdG9yZSB0aGUgb2JqZWN0IGZvciB0aGUgZmlyc3QKICAgIC8vIGxpbmUsIG90aGVyIG5vZGVzIGdldCBpdCBzdG9yZWQgaW4gdGhlaXIgaGlzdG9yeVRlbXAgcHJvcGVydHkuCiAgICB2YXIgbnVsbFRlbXAgPSBudWxsOwogICAgZnVuY3Rpb24gdGVtcChub2RlKSB7cmV0dXJuIG5vZGUgPyBub2RlLmhpc3RvcnlUZW1wIDogbnVsbFRlbXA7fQogICAgZnVuY3Rpb24gc2V0VGVtcChub2RlLCBsaW5lKSB7CiAgICAgIGlmIChub2RlKSBub2RlLmhpc3RvcnlUZW1wID0gbGluZTsKICAgICAgZWxzZSBudWxsVGVtcCA9IGxpbmU7CiAgICB9CgogICAgZnVuY3Rpb24gYnVpbGRMaW5lKG5vZGUpIHsKICAgICAgdmFyIHRleHQgPSBbXTsKICAgICAgZm9yICh2YXIgY3VyID0gbm9kZSA/IG5vZGUubmV4dFNpYmxpbmcgOiBzZWxmLmNvbnRhaW5lci5maXJzdENoaWxkOwogICAgICAgICAgIGN1ciAmJiAhaXNCUihjdXIpOyBjdXIgPSBjdXIubmV4dFNpYmxpbmcpCiAgICAgICAgaWYgKGN1ci5jdXJyZW50VGV4dCkgdGV4dC5wdXNoKGN1ci5jdXJyZW50VGV4dCk7CiAgICAgIHJldHVybiB7ZnJvbTogbm9kZSwgdG86IGN1ciwgdGV4dDogY2xlYW5UZXh0KHRleHQuam9pbigiIikpfTsKICAgIH0KCiAgICAvLyBGaWx0ZXIgb3V0IHVuY2hhbmdlZCBsaW5lcyBhbmQgbm9kZXMgdGhhdCBhcmUgbm8gbG9uZ2VyIGluIHRoZQogICAgLy8gZG9jdW1lbnQuIEJ1aWxkIHVwIGxpbmUgb2JqZWN0cyBmb3IgcmVtYWluaW5nIG5vZGVzLgogICAgdmFyIGxpbmVzID0gW107CiAgICBpZiAoc2VsZi5maXJzdFRvdWNoZWQpIHNlbGYudG91Y2hlZC5wdXNoKG51bGwpOwogICAgZm9yRWFjaChzZWxmLnRvdWNoZWQsIGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgaWYgKG5vZGUgJiYgbm9kZS5wYXJlbnROb2RlICE9IHNlbGYuY29udGFpbmVyKSByZXR1cm47CgogICAgICBpZiAobm9kZSkgbm9kZS5oaXN0b3J5VG91Y2hlZCA9IGZhbHNlOwogICAgICBlbHNlIHNlbGYuZmlyc3RUb3VjaGVkID0gZmFsc2U7CgogICAgICB2YXIgbGluZSA9IGJ1aWxkTGluZShub2RlKSwgc2hhZG93ID0gc2VsZi5hZnRlcihub2RlKTsKICAgICAgaWYgKCFzaGFkb3cgfHwgc2hhZG93LnRleHQgIT0gbGluZS50ZXh0IHx8IHNoYWRvdy50byAhPSBsaW5lLnRvKSB7CiAgICAgICAgbGluZXMucHVzaChsaW5lKTsKICAgICAgICBzZXRUZW1wKG5vZGUsIGxpbmUpOwogICAgICB9CiAgICB9KTsKCiAgICAvLyBHZXQgdGhlIEJSIGVsZW1lbnQgYWZ0ZXIvYmVmb3JlIHRoZSBnaXZlbiBub2RlLgogICAgZnVuY3Rpb24gbmV4dEJSKG5vZGUsIGRpcikgewogICAgICB2YXIgbGluayA9IGRpciArICJTaWJsaW5nIiwgc2VhcmNoID0gbm9kZVtsaW5rXTsKICAgICAgd2hpbGUgKHNlYXJjaCAmJiAhaXNCUihzZWFyY2gpKQogICAgICAgIHNlYXJjaCA9IHNlYXJjaFtsaW5rXTsKICAgICAgcmV0dXJuIHNlYXJjaDsKICAgIH0KCiAgICAvLyBBc3NlbWJsZSBsaW5lIG9iamVjdHMgaW50byBjaGFpbnMgYnkgc2Nhbm5pbmcgdGhlIERPTSB0cmVlCiAgICAvLyBhcm91bmQgdGhlbS4KICAgIHZhciBjaGFpbnMgPSBbXTsgc2VsZi50b3VjaGVkID0gW107CiAgICBmb3JFYWNoKGxpbmVzLCBmdW5jdGlvbihsaW5lKSB7CiAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIG1ha2VzIHRoZSBsb29wIHNraXAgbGluZSBvYmplY3RzIHRoYXQgaGF2ZQogICAgICAvLyBiZWVuIHB1bGxlZCBpbnRvIGNoYWlucyBieSBsaW5lcyBiZWZvcmUgdGhlbS4KICAgICAgaWYgKCF0ZW1wKGxpbmUuZnJvbSkpIHJldHVybjsKCiAgICAgIHZhciBjaGFpbiA9IFtdLCBjdXJOb2RlID0gbGluZS5mcm9tLCBzYWZlID0gdHJ1ZTsKICAgICAgLy8gUHV0IGFueSBsaW5lIG9iamVjdHMgKHJlZmVycmVkIHRvIGJ5IHRlbXAgaW5mbykgYmVmb3JlIHRoaXMKICAgICAgLy8gb25lIG9uIHRoZSBmcm9udCBvZiB0aGUgYXJyYXkuCiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgdmFyIGN1ckxpbmUgPSB0ZW1wKGN1ck5vZGUpOwogICAgICAgIGlmICghY3VyTGluZSkgewogICAgICAgICAgaWYgKHNhZmUpIGJyZWFrOwogICAgICAgICAgZWxzZSBjdXJMaW5lID0gYnVpbGRMaW5lKGN1ck5vZGUpOwogICAgICAgIH0KICAgICAgICBjaGFpbi51bnNoaWZ0KGN1ckxpbmUpOwogICAgICAgIHNldFRlbXAoY3VyTm9kZSwgbnVsbCk7CiAgICAgICAgaWYgKCFjdXJOb2RlKSBicmVhazsKICAgICAgICBzYWZlID0gc2VsZi5hZnRlcihjdXJOb2RlKTsKICAgICAgICBjdXJOb2RlID0gbmV4dEJSKGN1ck5vZGUsICJwcmV2aW91cyIpOwogICAgICB9CiAgICAgIGN1ck5vZGUgPSBsaW5lLnRvOyBzYWZlID0gc2VsZi5iZWZvcmUobGluZS5mcm9tKTsKICAgICAgLy8gQWRkIGxpbmVzIGFmdGVyIHRoaXMgb25lIGF0IGVuZCBvZiBhcnJheS4KICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICBpZiAoIWN1ck5vZGUpIGJyZWFrOwogICAgICAgIHZhciBjdXJMaW5lID0gdGVtcChjdXJOb2RlKTsKICAgICAgICBpZiAoIWN1ckxpbmUpIHsKICAgICAgICAgIGlmIChzYWZlKSBicmVhazsKICAgICAgICAgIGVsc2UgY3VyTGluZSA9IGJ1aWxkTGluZShjdXJOb2RlKTsKICAgICAgICB9CiAgICAgICAgY2hhaW4ucHVzaChjdXJMaW5lKTsKICAgICAgICBzZXRUZW1wKGN1ck5vZGUsIG51bGwpOwogICAgICAgIHNhZmUgPSBzZWxmLmJlZm9yZShjdXJOb2RlKTsKICAgICAgICBjdXJOb2RlID0gbmV4dEJSKGN1ck5vZGUsICJuZXh0Iik7CiAgICAgIH0KICAgICAgY2hhaW5zLnB1c2goY2hhaW4pOwogICAgfSk7CgogICAgcmV0dXJuIGNoYWluczsKICB9LAoKICAvLyBGaW5kIHRoZSAnc2hhZG93JyBvZiBhIGdpdmVuIGNoYWluIGJ5IGZvbGxvd2luZyB0aGUgbGlua3MgaW4gdGhlCiAgLy8gRE9NIG5vZGVzIGF0IGl0cyBzdGFydCBhbmQgZW5kLgogIHNoYWRvd0NoYWluOiBmdW5jdGlvbihjaGFpbikgewogICAgdmFyIHNoYWRvd3MgPSBbXSwgbmV4dCA9IHRoaXMuYWZ0ZXIoY2hhaW5bMF0uZnJvbSksIGVuZCA9IGNoYWluW2NoYWluLmxlbmd0aCAtIDFdLnRvOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgc2hhZG93cy5wdXNoKG5leHQpOwogICAgICB2YXIgbmV4dE5vZGUgPSBuZXh0LnRvOwogICAgICBpZiAoIW5leHROb2RlIHx8IG5leHROb2RlID09IGVuZCkKICAgICAgICBicmVhazsKICAgICAgZWxzZQogICAgICAgIG5leHQgPSBuZXh0Tm9kZS5oaXN0b3J5QWZ0ZXIgfHwgdGhpcy5iZWZvcmUoZW5kKTsKICAgICAgLy8gKFRoZSB0aGlzLmJlZm9yZShlbmQpIGlzIGEgaGFjayAtLSBGRiBzb21ldGltZXMgcmVtb3ZlcwogICAgICAvLyBwcm9wZXJ0aWVzIGZyb20gQlIgbm9kZXMsIGluIHdoaWNoIGNhc2UgdGhlIGJlc3Qgd2UgY2FuIGhvcGUKICAgICAgLy8gZm9yIGlzIHRvIG5vdCBicmVhay4pCiAgICB9CiAgICByZXR1cm4gc2hhZG93czsKICB9LAoKICAvLyBVcGRhdGUgdGhlIERPTSB0cmVlIHRvIGNvbnRhaW4gdGhlIGxpbmVzIHNwZWNpZmllZCBpbiBhIGdpdmVuCiAgLy8gY2hhaW4sIGxpbmsgdGhpcyBjaGFpbiBpbnRvIHRoZSBET00gbm9kZXMuCiAgYXBwbHlDaGFpbjogZnVuY3Rpb24oY2hhaW4pIHsKICAgIC8vIFNvbWUgYXR0ZW1wdCBpcyBtYWRlIHRvIHByZXZlbnQgdGhlIGN1cnNvciBmcm9tIGp1bXBpbmcKICAgIC8vIHJhbmRvbWx5IHdoZW4gYW4gdW5kbyBvciByZWRvIGhhcHBlbnMuIEl0IHN0aWxsIGJlaGF2ZXMgYSBiaXQKICAgIC8vIHN0cmFuZ2Ugc29tZXRpbWVzLgogICAgdmFyIGN1cnNvciA9IHNlbGVjdC5jdXJzb3JQb3ModGhpcy5jb250YWluZXIsIGZhbHNlKSwgc2VsZiA9IHRoaXM7CgogICAgLy8gUmVtb3ZlIGFsbCBub2RlcyBpbiB0aGUgRE9NIHRyZWUgYmV0d2VlbiBmcm9tIGFuZCB0byAobnVsbCBmb3IKICAgIC8vIHN0YXJ0L2VuZCBvZiBjb250YWluZXIpLgogICAgZnVuY3Rpb24gcmVtb3ZlUmFuZ2UoZnJvbSwgdG8pIHsKICAgICAgdmFyIHBvcyA9IGZyb20gPyBmcm9tLm5leHRTaWJsaW5nIDogc2VsZi5jb250YWluZXIuZmlyc3RDaGlsZDsKICAgICAgd2hpbGUgKHBvcyAhPSB0bykgewogICAgICAgIHZhciB0ZW1wID0gcG9zLm5leHRTaWJsaW5nOwogICAgICAgIHJlbW92ZUVsZW1lbnQocG9zKTsKICAgICAgICBwb3MgPSB0ZW1wOwogICAgICB9CiAgICB9CgogICAgdmFyIHN0YXJ0ID0gY2hhaW5bMF0uZnJvbSwgZW5kID0gY2hhaW5bY2hhaW4ubGVuZ3RoIC0gMV0udG87CiAgICAvLyBDbGVhciB0aGUgc3BhY2Ugd2hlcmUgdGhpcyBjaGFuZ2UgaGFzIHRvIGJlIG1hZGUuCiAgICByZW1vdmVSYW5nZShzdGFydCwgZW5kKTsKCiAgICAvLyBJbnNlcnQgdGhlIGNvbnRlbnQgc3BlY2lmaWVkIGJ5IHRoZSBjaGFpbiBpbnRvIHRoZSBET00gdHJlZS4KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hhaW4ubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGxpbmUgPSBjaGFpbltpXTsKICAgICAgLy8gVGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIHNwYWNlIGFyZSBhbHJlYWR5IGNvcnJlY3QsIGJ1dCBCUgogICAgICAvLyB0YWdzIGluc2lkZSBpdCBoYXZlIHRvIGJlIHB1dCBiYWNrLgogICAgICBpZiAoaSA+IDApCiAgICAgICAgc2VsZi5jb250YWluZXIuaW5zZXJ0QmVmb3JlKGxpbmUuZnJvbSwgZW5kKTsKCiAgICAgIC8vIEFkZCB0aGUgdGV4dC4KICAgICAgdmFyIG5vZGUgPSBtYWtlUGFydFNwYW4oZml4U3BhY2VzKGxpbmUudGV4dCksIHRoaXMuY29udGFpbmVyLm93bmVyRG9jdW1lbnQpOwogICAgICBzZWxmLmNvbnRhaW5lci5pbnNlcnRCZWZvcmUobm9kZSwgZW5kKTsKICAgICAgLy8gU2VlIGlmIHRoZSBjdXJzb3Igd2FzIG9uIHRoaXMgbGluZS4gUHV0IGl0IGJhY2ssIGFkanVzdGluZwogICAgICAvLyBmb3IgY2hhbmdlZCBsaW5lIGxlbmd0aCwgaWYgaXQgd2FzLgogICAgICBpZiAoY3Vyc29yICYmIGN1cnNvci5ub2RlID09IGxpbmUuZnJvbSkgewogICAgICAgIHZhciBjdXJzb3JkaWZmID0gMDsKICAgICAgICB2YXIgcHJldiA9IHRoaXMuYWZ0ZXIobGluZS5mcm9tKTsKICAgICAgICBpZiAocHJldiAmJiBpID09IGNoYWluLmxlbmd0aCAtIDEpIHsKICAgICAgICAgIC8vIE9ubHkgYWRqdXN0IGlmIHRoZSBjdXJzb3IgaXMgYWZ0ZXIgdGhlIHVuY2hhbmdlZCBwYXJ0IG9mCiAgICAgICAgICAvLyB0aGUgbGluZS4KICAgICAgICAgIGZvciAodmFyIG1hdGNoID0gMDsgbWF0Y2ggPCBjdXJzb3Iub2Zmc2V0ICYmCiAgICAgICAgICAgICAgIGxpbmUudGV4dC5jaGFyQXQobWF0Y2gpID09IHByZXYudGV4dC5jaGFyQXQobWF0Y2gpOyBtYXRjaCsrKTsKICAgICAgICAgIGlmIChjdXJzb3Iub2Zmc2V0ID4gbWF0Y2gpCiAgICAgICAgICAgIGN1cnNvcmRpZmYgPSBsaW5lLnRleHQubGVuZ3RoIC0gcHJldi50ZXh0Lmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgc2VsZWN0LnNldEN1cnNvclBvcyh0aGlzLmNvbnRhaW5lciwge25vZGU6IGxpbmUuZnJvbSwgb2Zmc2V0OiBNYXRoLm1heCgwLCBjdXJzb3Iub2Zmc2V0ICsgY3Vyc29yZGlmZil9KTsKICAgICAgfQogICAgICAvLyBDdXJzb3Igd2FzIGluIHJlbW92ZWQgbGluZSwgdGhpcyBpcyBsYXN0IG5ldyBsaW5lLgogICAgICBlbHNlIGlmIChjdXJzb3IgJiYgKGkgPT0gY2hhaW4ubGVuZ3RoIC0gMSkgJiYgY3Vyc29yLm5vZGUgJiYgY3Vyc29yLm5vZGUucGFyZW50Tm9kZSAhPSB0aGlzLmNvbnRhaW5lcikgewogICAgICAgIHNlbGVjdC5zZXRDdXJzb3JQb3ModGhpcy5jb250YWluZXIsIHtub2RlOiBsaW5lLmZyb20sIG9mZnNldDogbGluZS50ZXh0Lmxlbmd0aH0pOwogICAgICB9CiAgICB9CgogICAgLy8gQW5jaG9yIHRoZSBjaGFpbiBpbiB0aGUgRE9NIHRyZWUuCiAgICB0aGlzLmxpbmtDaGFpbihjaGFpbik7CiAgICByZXR1cm4gc3RhcnQ7CiAgfQp9Owo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/js/util.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogQSBmZXcgdXNlZnVsIHV0aWxpdHkgZnVuY3Rpb25zLiAqLwoKLy8gQ2FwdHVyZSBhIG1ldGhvZCBvbiBhbiBvYmplY3QuCmZ1bmN0aW9uIG1ldGhvZChvYmosIG5hbWUpIHsKICByZXR1cm4gZnVuY3Rpb24oKSB7b2JqW25hbWVdLmFwcGx5KG9iaiwgYXJndW1lbnRzKTt9Owp9CgovLyBUaGUgdmFsdWUgdXNlZCB0byBzaWduYWwgdGhlIGVuZCBvZiBhIHNlcXVlbmNlIGluIGl0ZXJhdG9ycy4KdmFyIFN0b3BJdGVyYXRpb24gPSB7dG9TdHJpbmc6IGZ1bmN0aW9uKCkge3JldHVybiAiU3RvcEl0ZXJhdGlvbiJ9fTsKCi8vIEFwcGx5IGEgZnVuY3Rpb24gdG8gZWFjaCBlbGVtZW50IGluIGEgc2VxdWVuY2UuCmZ1bmN0aW9uIGZvckVhY2goaXRlciwgZikgewogIGlmIChpdGVyLm5leHQpIHsKICAgIHRyeSB7d2hpbGUgKHRydWUpIGYoaXRlci5uZXh0KCkpO30KICAgIGNhdGNoIChlKSB7aWYgKGUgIT0gU3RvcEl0ZXJhdGlvbikgdGhyb3cgZTt9CiAgfQogIGVsc2UgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVyLmxlbmd0aDsgaSsrKQogICAgICBmKGl0ZXJbaV0pOwogIH0KfQoKLy8gTWFwIGEgZnVuY3Rpb24gb3ZlciBhIHNlcXVlbmNlLCBwcm9kdWNpbmcgYW4gYXJyYXkgb2YgcmVzdWx0cy4KZnVuY3Rpb24gbWFwKGl0ZXIsIGYpIHsKICB2YXIgYWNjdW0gPSBbXTsKICBmb3JFYWNoKGl0ZXIsIGZ1bmN0aW9uKHZhbCkge2FjY3VtLnB1c2goZih2YWwpKTt9KTsKICByZXR1cm4gYWNjdW07Cn0KCi8vIENyZWF0ZSBhIHByZWRpY2F0ZSBmdW5jdGlvbiB0aGF0IHRlc3RzIGEgc3RyaW5nIGFnYWluc3RzIGEgZ2l2ZW4KLy8gcmVndWxhciBleHByZXNzaW9uLiBObyBsb25nZXIgdXNlZCBidXQgbWlnaHQgYmUgdXNlZCBieSAzcmQgcGFydHkKLy8gcGFyc2Vycy4KZnVuY3Rpb24gbWF0Y2hlcihyZWdleHApewogIHJldHVybiBmdW5jdGlvbih2YWx1ZSl7cmV0dXJuIHJlZ2V4cC50ZXN0KHZhbHVlKTt9Owp9CgovLyBUZXN0IHdoZXRoZXIgYSBET00gbm9kZSBoYXMgYSBjZXJ0YWluIENTUyBjbGFzcy4gTXVjaCBmYXN0ZXIgdGhhbgovLyB0aGUgTW9jaGlLaXQgZXF1aXZhbGVudCwgZm9yIHNvbWUgcmVhc29uLgpmdW5jdGlvbiBoYXNDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUpewogIHZhciBjbGFzc2VzID0gZWxlbWVudC5jbGFzc05hbWU7CiAgcmV0dXJuIGNsYXNzZXMgJiYgbmV3IFJlZ0V4cCgiKF58ICkiICsgY2xhc3NOYW1lICsgIigkfCApIikudGVzdChjbGFzc2VzKTsKfQoKLy8gSW5zZXJ0IGEgRE9NIG5vZGUgYWZ0ZXIgYW5vdGhlciBub2RlLgpmdW5jdGlvbiBpbnNlcnRBZnRlcihuZXdOb2RlLCBvbGROb2RlKSB7CiAgdmFyIHBhcmVudCA9IG9sZE5vZGUucGFyZW50Tm9kZTsKICBwYXJlbnQuaW5zZXJ0QmVmb3JlKG5ld05vZGUsIG9sZE5vZGUubmV4dFNpYmxpbmcpOwogIHJldHVybiBuZXdOb2RlOwp9CgpmdW5jdGlvbiByZW1vdmVFbGVtZW50KG5vZGUpIHsKICBpZiAobm9kZS5wYXJlbnROb2RlKQogICAgbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpOwp9CgpmdW5jdGlvbiBjbGVhckVsZW1lbnQobm9kZSkgewogIHdoaWxlIChub2RlLmZpcnN0Q2hpbGQpCiAgICBub2RlLnJlbW92ZUNoaWxkKG5vZGUuZmlyc3RDaGlsZCk7Cn0KCi8vIENoZWNrIHdoZXRoZXIgYSBub2RlIGlzIGNvbnRhaW5lZCBpbiBhbm90aGVyIG9uZS4KZnVuY3Rpb24gaXNBbmNlc3Rvcihub2RlLCBjaGlsZCkgewogIHdoaWxlIChjaGlsZCA9IGNoaWxkLnBhcmVudE5vZGUpIHsKICAgIGlmIChub2RlID09IGNoaWxkKQogICAgICByZXR1cm4gdHJ1ZTsKICB9CiAgcmV0dXJuIGZhbHNlOwp9CgovLyBUaGUgbm9uLWJyZWFraW5nIHNwYWNlIGNoYXJhY3Rlci4KdmFyIG5ic3AgPSAiXHUwMGEwIjsKdmFyIG1hdGNoaW5nID0geyJ7IjogIn0iLCAiWyI6ICJdIiwgIigiOiAiKSIsCiAgICAgICAgICAgICAgICAifSI6ICJ7IiwgIl0iOiAiWyIsICIpIjogIigifTsKCi8vIFN0YW5kYXJkaXplIGEgZmV3IHVucG9ydGFibGUgZXZlbnQgcHJvcGVydGllcy4KZnVuY3Rpb24gbm9ybWFsaXplRXZlbnQoZXZlbnQpIHsKICBpZiAoIWV2ZW50LnN0b3BQcm9wYWdhdGlvbikgewogICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uID0gZnVuY3Rpb24oKSB7dGhpcy5jYW5jZWxCdWJibGUgPSB0cnVlO307CiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCA9IGZ1bmN0aW9uKCkge3RoaXMucmV0dXJuVmFsdWUgPSBmYWxzZTt9OwogIH0KICBpZiAoIWV2ZW50LnN0b3ApIHsKICAgIGV2ZW50LnN0b3AgPSBmdW5jdGlvbigpIHsKICAgICAgdGhpcy5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgdGhpcy5wcmV2ZW50RGVmYXVsdCgpOwogICAgfTsKICB9CgogIGlmIChldmVudC50eXBlID09ICJrZXlwcmVzcyIpIHsKICAgIGV2ZW50LmNvZGUgPSAoZXZlbnQuY2hhckNvZGUgPT0gbnVsbCkgPyBldmVudC5rZXlDb2RlIDogZXZlbnQuY2hhckNvZGU7CiAgICBldmVudC5jaGFyYWN0ZXIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGV2ZW50LmNvZGUpOwogIH0KICByZXR1cm4gZXZlbnQ7Cn0KCi8vIFBvcnRhYmx5IHJlZ2lzdGVyIGV2ZW50IGhhbmRsZXJzLgpmdW5jdGlvbiBhZGRFdmVudEhhbmRsZXIobm9kZSwgdHlwZSwgaGFuZGxlciwgcmVtb3ZlRnVuYykgewogIGZ1bmN0aW9uIHdyYXBIYW5kbGVyKGV2ZW50KSB7CiAgICBoYW5kbGVyKG5vcm1hbGl6ZUV2ZW50KGV2ZW50IHx8IHdpbmRvdy5ldmVudCkpOwogIH0KICBpZiAodHlwZW9mIG5vZGUuYWRkRXZlbnRMaXN0ZW5lciA9PSAiZnVuY3Rpb24iKSB7CiAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgd3JhcEhhbmRsZXIsIGZhbHNlKTsKICAgIGlmIChyZW1vdmVGdW5jKSByZXR1cm4gZnVuY3Rpb24oKSB7bm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIHdyYXBIYW5kbGVyLCBmYWxzZSk7fTsKICB9CiAgZWxzZSB7CiAgICBub2RlLmF0dGFjaEV2ZW50KCJvbiIgKyB0eXBlLCB3cmFwSGFuZGxlcik7CiAgICBpZiAocmVtb3ZlRnVuYykgcmV0dXJuIGZ1bmN0aW9uKCkge25vZGUuZGV0YWNoRXZlbnQoIm9uIiArIHR5cGUsIHdyYXBIYW5kbGVyKTt9OwogIH0KfQoKZnVuY3Rpb24gbm9kZVRleHQobm9kZSkgewogIHJldHVybiBub2RlLnRleHRDb250ZW50IHx8IG5vZGUuaW5uZXJUZXh0IHx8IG5vZGUubm9kZVZhbHVlIHx8ICIiOwp9CgpmdW5jdGlvbiBub2RlVG9wKG5vZGUpIHsKICB2YXIgdG9wID0gMDsKICB3aGlsZSAobm9kZS5vZmZzZXRQYXJlbnQpIHsKICAgIHRvcCArPSBub2RlLm9mZnNldFRvcDsKICAgIG5vZGUgPSBub2RlLm9mZnNldFBhcmVudDsKICB9CiAgcmV0dXJuIHRvcDsKfQoKZnVuY3Rpb24gaXNCUihub2RlKSB7CiAgdmFyIG5uID0gbm9kZS5ub2RlTmFtZTsKICByZXR1cm4gbm4gPT0gIkJSIiB8fCBubiA9PSAiYnIiOwp9CmZ1bmN0aW9uIGlzU3Bhbihub2RlKSB7CiAgdmFyIG5uID0gbm9kZS5ub2RlTmFtZTsKICByZXR1cm4gbm4gPT0gIlNQQU4iIHx8IG5uID09ICJzcGFuIjsKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/jstest.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHNjcmlwdCBzcmM9ImpzL2NvZGVtaXJyb3IuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ianMvbWlycm9yZnJhbWUuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgICA8dGl0bGU+Q29kZU1pcnJvcjogSmF2YVNjcmlwdCBkZW1vbnN0cmF0aW9uPC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImNzcy9kb2NzLmNzcyIvPgogIDwvaGVhZD4KICA8Ym9keSBzdHlsZT0icGFkZGluZzogMjBweDsiPgoKPHA+VGhpcyBwYWdlIGRlbW9uc3RyYXRlcyA8YSBocmVmPSJpbmRleC5odG1sIj5Db2RlTWlycm9yPC9hPidzCkphdmFTY3JpcHQgcGFyc2VyLiBOb3RlIHRoYXQgdGhlIHVnbHkgYnV0dG9ucyBhdCB0aGUgdG9wIGFyZSBub3QgYXJlCm5vdCBwYXJ0IG9mIENvZGVNaXJyb3IgcHJvcGVyIC0tIHRoZXkgZGVtb25zdHJhdGUgdGhlIHdheSBpdCBjYW4gYmUKZW1iZWRkZWQgaW4gYSB3ZWItYXBwbGljYXRpb24uPC9wPgoKPGRpdiBjbGFzcz0iYm9yZGVyIj4KPHRleHRhcmVhIGlkPSJjb2RlIiBjb2xzPSIxMjAiIHJvd3M9IjMwIj4KLy8gSGVyZSB5b3Ugc2VlIHNvbWUgSmF2YVNjcmlwdCBjb2RlLiBNZXNzIGFyb3VuZCB3aXRoIGl0IHRvIGdldAovLyBhY3F1YWludGVkIHdpdGggQ29kZU1pcnJvcidzIGZlYXR1cmVzLgoKLy8gUHJlc3MgZW50ZXIgaW5zaWRlIHRoZSBvYmplY3QgYW5kIHlvdXIgbmV3IGxpbmUgd2lsbCBiZSBzdWl0YWJseQovLyBpbmRlbnRlZC4KdmFyIGtleUJpbmRpbmdzID0gewogIGVudGVyOiAibmV3bGluZS1hbmQtaW5kZW50IiwKICB0YWI6ICJyZWluZGVudC1zZWxlY3Rpb24iLAogIGN0cmxfejogInVuZG8iLAogIGN0cmxfeTogInJlZG8iLAogIGN0cmxfYmFja3NwYWNlOiAidW5kby1mb3Itc2FmYXJpICh3aGljaCBibG9ja3MgY3RybC16KSIsCiAgY3RybF9icmFja2V0OiAiaGlnaGxpZ2h0LWJyYWNrZXRzIiwKICBjdHJsX3NoaWZ0X2JyYWNrZXQ6ICJqdW1wLXRvLW1hdGNoaW5nLWJyYWNrZXQiCn07CgovLyBQcmVzcyB0YWIgb24gdGhlIG5leHQgbGluZSBhbmQgdGhlIHdyb25nIGluZGVudGF0aW9uIHdpbGwgYmUgZml4ZWQuCiAgICAgIHZhciByZWdleCA9IC9mb298YmFyL2k7CgpmdW5jdGlvbiBleGFtcGxlKHgpIHsKICAvLyBMb2NhbCB2YXJpYWJsZXMgZ2V0IGEgZGlmZmVyZW50IGNvbG91ciB0aGFuIGdsb2JhbCBvbmVzLgogIHZhciB5ID0gNDQuNDsKICByZXR1cm4geCArIHkgLSB6Owp9CjwvdGV4dGFyZWE+CjwvZGl2PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogIHZhciB0ZXh0YXJlYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2RlJyk7CiAgdmFyIGVkaXRvciA9IG5ldyBNaXJyb3JGcmFtZShDb2RlTWlycm9yLnJlcGxhY2UodGV4dGFyZWEpLCB7CiAgICBoZWlnaHQ6ICIzNTBweCIsCiAgICBjb250ZW50OiB0ZXh0YXJlYS52YWx1ZSwKICAgIHBhcnNlcmZpbGU6IFsidG9rZW5pemVqYXZhc2NyaXB0LmpzIiwgInBhcnNlamF2YXNjcmlwdC5qcyJdLAogICAgc3R5bGVzaGVldDogImNzcy9qc2NvbG9ycy5jc3MiLAogICAgcGF0aDogImpzLyIsCiAgICBhdXRvTWF0Y2hQYXJlbnM6IHRydWUKICB9KTsKPC9zY3JpcHQ+CgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/LICENSE</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IENvcHlyaWdodCAoYykgMjAwNy0yMDA5IE1hcmlqbiBIYXZlcmJla2UKCiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAogd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueQogZGFtYWdlcyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgoKIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueQogcHVycG9zZSwgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kCiByZWRpc3RyaWJ1dGUgaXQgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgoKIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3QKICAgIG5vdCBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcwogICAgc29mdHdhcmUgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdAogICAgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZSBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgoKIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3QKICAgIG5vdCBiZSBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCgogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlCiAgICBkaXN0cmlidXRpb24uCgogTWFyaWpuIEhhdmVyYmVrZQogbWFyaWpuaCBhdCBnbWFpbAo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/manual.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHRpdGxlPkNvZGVNaXJyb3IgdXNlciBtYW51YWw8L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iY3NzL2RvY3MuY3NzIi8+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGgxIGNsYXNzPSJ1bmRlcmxpbmUiPkNvZGVNaXJyb3IgdXNlciBtYW51YWw8L2gxPgoKICAgIDxoMj5Db250ZW50czwvaDI+CgogICAgPHVsPgogICAgICA8bGk+PGEgaHJlZj0iI3VzZWFnZSI+QmFzaWMgVXNlYWdlPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSIjY29uZmlndXJhdGlvbiI+Q29uZmlndXJhdGlvbjwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iI3BhcnNlcnMiPlBhcnNlcnM8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9IiNwcm9ncmFtbWluZyI+UHJvZ3JhbW1pbmcgSW50ZXJmYWNlPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSIjd3JpdGVwYXJzZXIiPldyaXRpbmcgYSBQYXJzZXI8L2E+PC9saT4KICAgIDwvdWw+CgogICAgPGgyIGlkPSJ1c2VhZ2UiPkJhc2ljIFVzYWdlPC9oMj4KCiAgICA8cD5JbnNpZGUgdGhlIGVkaXRvciwgdGhlIHRhYiBrZXkgaXMgdXNlZCB0byByZS1pbmRlbnQgdGhlIGN1cnJlbnQKICAgIHNlbGVjdGlvbiAob3IgdGhlIGN1cnJlbnQgbGluZSB3aGVuIG5vdGhpbmcgaXMgc2VsZWN0ZWQpLCBhbmQKICAgIHByZXNzaW5nIGVudGVyIHdpbGwsIGFwYXJ0IGZyb20gaW5zZXJ0aW5nIGEgbGluZSBicmVhaywKICAgIGF1dG9tYXRpY2FsbHkgaW5kZW50IHRoZSBuZXcgbGluZS4gUHJlc3NpbmcgY29udHJvbC1lbnRlciB3aWxsCiAgICBjYXVzZSB0aGUgd2hvbGUgYnVmZmVyIHRvIGJlIHJlLWNvbG91cmVkLCB3aGljaCBjYW4gYmUgaGVscGZ1bAogICAgd2hlbiBzb21lIGNvbG91cmluZyBoYXMgYmVjb21lIG91dC1vZi1kYXRlIHdpdGhvdXQgdGhlIGVkaXRvcgogICAgbm90aWNpbmcgaXQuPC9wPgoKICAgIDxwPlRoZSBlZGl0b3Igc3BvcnRzIGFuIHVuZG8vcmVkbyBzeXN0ZW0sIGFjY2Vzc2libGUgd2l0aAogICAgY29udHJvbC16ICh1bmRvKSBhbmQgY29udHJvbC15IChyZWRvKS4gU2FmYXJpIHdpbGwgbm90IGFsbG93CiAgICBjbGllbnQgc2NyaXB0cyB0byBjYXB0dXJlIGNvbnRyb2wteiBwcmVzc2VzLCBidXQgeW91IGNhbiB1c2UKICAgIGNvbnRyb2wtYmFja3NwYWNlIGluc3RlYWQgb24gdGhhdCBicm93c2VyLjwvcD4KCiAgICA8cD5UaGUga2V5LWNvbWJpbmF0aW9uIGNvbnRyb2wtWyB0cmlnZ2VycyBhIHBhcmVuLWJsaW5rOiBJZiB0aGUKICAgIGN1cnNvciBpcyBkaXJlY3RseSBhZnRlciBhICcoJywgJyknLCAnWycsICddJywgJ3snLCBvciAnfScsIHRoZQogICAgZWRpdG9yIGxvb2tzIGZvciB0aGUgbWF0Y2hpbmcgY2hhcmFjdGVyLCBhbmQgaGlnaGxpZ2h0cyB0aGVzZQogICAgY2hhcmFjdGVycyBmb3IgYSBtb21lbnQuIFRoZXJlIGlzIGFuIG9wdGlvbiB0byBlbmFibGUgdGhpcyB0bwogICAgaGFwcGVuIGFueSB0aW1lIHRoZSB1c2VyIHR5cGVzIHNvbWV0aGluZyBvciBtb3ZlcyB0aGUgY3Vyc29yLjwvcD4KCiAgICA8cD5UbyB1c2UgQ29kZU1pcnJvciBpbiBhIGRvY3VtZW50LCB5b3Ugc2hvdWxkIGFkZCBhIHNjcmlwdCB0YWcgdG8KICAgIGxvYWQgPGEgaHJlZj0ianMvY29kZW1pcnJvci5qcyI+PGNvZGU+Y29kZW1pcnJvci5qczwvY29kZT48L2E+LiBUaGlzCiAgICBhZGRzIHR3byBvYmplY3RzIHRvIHlvdXIgZW52aXJvbm1lbnQsIDxjb2RlPkNvZGVNaXJyb3I8L2NvZGU+IGFuZAogICAgPGNvZGU+Q29kZU1pcnJvckNvbmZpZzwvY29kZT4uIFRoZSBmaXJzdCBpcyB0aGUgaW50ZXJmYWNlIHRvIHRoZQogICAgZWRpdG9yLCB0aGUgc2Vjb25kIGNhbiBiZSB1c2VkIHRvIGNvbmZpZ3VyZSBpdC4gKE5vdGUgdGhhdCB0aGlzIGlzCiAgICB0aGUgb25seSBuYW1lLXNwYWNlIHBvbGx1dGlvbiB5b3UgY2FuIGV4cGVjdCBmcm9tIENvZGVNaXJyb3IgLS0KICAgIGFsbCBvdGhlciBjcnVmdCBpcyBrZXB0IGluc2lkZSB0aGUgSUZSQU1FcyB0aGF0IGl0IGNyZWF0ZXMgd2hlbgogICAgeW91IG9wZW4gYW4gZWRpdG9yLik8L3A+CgogICAgPHA+VG8gYWRkIGFuIGVkaXRvciB0byBhIGRvY3VtZW50LCB5b3UgbXVzdCBjaG9vc2UgYSBwbGFjZSwgYQogICAgcGFyc2VyLCBhbmQgYSBzdHlsZS1zaGVldCBmb3IgaXQuIEZvciBleGFtcGxlLCB0byBhcHBlbmQgYW4KICAgIFhNTCBlZGl0b3IgdG8gdGhlIGJvZHkgb2YgdGhlIGRvY3VtZW50LCB5b3UgZG86PC9wPgoKICAgIDxwcmUgY2xhc3M9ImNvZGUiPnZhciBlZGl0b3IgPSBuZXcgQ29kZU1pcnJvcihkb2N1bWVudC5ib2R5LCB7CiAgcGFyc2VyZmlsZTogInBhcnNleG1sLmpzIiwKICBzdHlsZXNoZWV0OiAieG1sY29sb3JzLmNzcyIKfSk7PC9wcmU+CgogICAgPHA+VGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSA8Y29kZT5Db2RlTWlycm9yPC9jb2RlPiBjb25zdHJ1Y3RvcgogICAgY2FuIGJlIGEgRE9NIG5vZGUsIGluIHdoaWNoIGNhc2UgdGhlIGVkaXRvciBnZXRzIGFwcGVuZGVkIHRvIHRoYXQKICAgIG5vZGUsIG9yIGEgZnVuY3Rpb24sIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIElGUkFNRSBub2RlIGFzCiAgICBhcmd1bWVudCwgYW5kIHdoaWNoIGlzIGV4cGVjdGVkIHRvIHBsYWNlIHRoYXQgbm9kZSBzb21ld2hlcmUgaW4KICAgIHRoZSBkb2N1bWVudC48L3A+CgogICAgPHA+VGhlIHNlY29uZCAob3B0aW9uYWwpIGFyZ3VtZW50IGlzIGFuIG9iamVjdCB0aGF0IHNwZWNpZmllcwogICAgb3B0aW9ucy4gQSBzZXQgb2YgZGVmYXVsdCBvcHRpb25zIChzZWUgYmVsb3cpIGlzIHByZXNlbnQgaW4gdGhlCiAgICA8Y29kZT5Db2RlTWlycm9yQ29uZmlnPC9jb2RlPiBvYmplY3QsIGJ1dCBlYWNoIGluc3RhbmNlIG9mIHRoZQogICAgZWRpdG9yIGNhbiBiZSBnaXZlbiBhIHNldCBvZiBzcGVjaWZpYyBvcHRpb25zIHRvIG92ZXJyaWRlIHRoZXNlCiAgICBkZWZhdWx0cy4gSW4gdGhpcyBjYXNlLCB3ZSBzcGVjaWZpZWQgdGhhdCB0aGUgcGFyc2VyIHNob3VsZCBiZQogICAgbG9hZGVkIGZyb20gdGhlIDxhCiAgICBocmVmPSJqcy9wYXJzZXhtbC5qcyI+PGNvZGU+InBhcnNleG1sLmpzIjwvY29kZT48L2E+IGZpbGUsIGFuZAogICAgdGhhdCA8YSBocmVmPSJjc3MveG1sY29sb3JzLmNzcyI+PGNvZGU+InhtbGNvbG9ycy5jc3MiPC9jb2RlPjwvYT4KICAgIHNob3VsZCBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGNvbG91cnMgb2YgdGhlIGNvZGUuPC9wPgoKICAgIDxwPkFub3RoZXIgZXhhbXBsZTo8L3A+CgogICAgPHByZSBjbGFzcz0iY29kZSI+dmFyIGVkaXRvciA9IG5ldyBDb2RlTWlycm9yKENvZGVNaXJyb3IucmVwbGFjZSgiaW5wdXRmaWVsZCIpLCB7CiAgcGFyc2VyZmlsZTogWyJ0b2tlbml6ZWphdmFzY3JpcHQuanMiLCAicGFyc2VqYXZhc2NyaXB0LmpzIl0sCiAgcGF0aDogImxpYi9jb2RlbWlycm9yL2pzLyIsCiAgc3R5bGVzaGVldDogImxpYi9jb2RlbWlycm9yL2Nzcy9qc2NvbG9ycy5jc3MiLAogIGNvbnRlbnQ6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJpbnB1dGZpZWxkIikudmFsdWUKfSk7PC9wcmU+CgogICAgPHA+SGVyZSB3ZSB1c2UgdGhlIHV0aWxpdHkgZnVuY3Rpb24KICAgIDxjb2RlPkNvZGVNaXJyb3IucmVwbGFjZTwvY29kZT4gdG8gY3JlYXRlIGEgZnVuY3Rpb24gdGhhdCB3aWxsCiAgICByZXBsYWNlIGEgbm9kZSBpbiB0aGUgY3VycmVudCBkb2N1bWVudCAoZ2l2ZW4gZWl0aGVyIGRpcmVjdGx5IG9yCiAgICBieSBJRCkgd2l0aCB0aGUgZWRpdG9yLiBXZSBhbHNvIHNlbGVjdCB0aGUgSmF2YVNjcmlwdCBwYXJzZXIgdGhpcwogICAgdGltZSwgYW5kIGdpdmUgYSA8Y29kZT5wYXRoPC9jb2RlPiBvcHRpb24gdG8gdGVsbCB0aGUgZWRpdG9yIHRoYXQKICAgIGl0cyBmaWxlcyBhcmUgbm90IGxvY2F0ZWQgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBjdXJyZW50CiAgICBIVE1MIHBhZ2UsIGJ1dCBpbiA8Y29kZT4ibGliL2NvZGVtaXJyb3IvIjwvY29kZT4uPC9wPgoKICAgIDxwPlRoZXJlIGlzIGEgZnVuY3Rpb24KICAgIDxjb2RlPkNvZGVNaXJyb3IuaXNQcm9iYWJseVN1cHBvcnRlZCgpPC9jb2RlPiB0aGF0IGNhdXNlcyBzb21lCiAgICAxOTk4LXN0eWxlIGJyb3dzZXIgZGV0ZWN0aW9uIHRvIGhhcHBlbiwgcmV0dXJuaW5nCiAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgQ29kZU1pcnJvciBpcyBwcm9iYWJseSBub3Qgc3VwcG9ydGVkIG9uIHRoZQogICAgYnJvd3NlciwgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaXQgcHJvYmFibHkgaXMsIGFuZAogICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgaGFzIG5vIGlkZWEuIEFzIHRoZSBuYW1lIHN1Z2dlc3RzLCB0aGlzIGlzCiAgICBub3Qgc29tZXRoaW5nIHlvdSBjYW4gcmVseSBvbiwgYnV0IGl0J3MgdXN1YWxseSBiZXR0ZXIgdGhhbgogICAgbm90aGluZy48L3A+CgogICAgPHA+QW5vdGhlciB1dGlsaXR5IGZ1bmN0aW9uLCA8Y29kZT5Db2RlTWlycm9yLmZyb21UZXh0QXJlYTwvY29kZT4sCiAgICB3aWxsLCBnaXZlbiBhIHRleHRhcmVhIG5vZGUgb3IgdGhlIGlkIG9mIHN1Y2ggYSBub2RlLCBoaWRlIHRoZQogICAgdGV4dGFyZWEgYW5kIHJlcGxhY2UgaXQgd2l0aCBhIENvZGVNaXJyb3IgZnJhbWUuIElmIHRoZSB0ZXh0YXJlYQogICAgd2FzIHBhcnQgb2YgYSBmb3JtLCBhbiA8Y29kZT5vbnN1Ym1pdDwvY29kZT4gaGFuZGxlciB3aWxsIGJlCiAgICByZWdpc3RlcmVkIHdpdGggdGhpcyBmb3JtLCB3aGljaCB3aWxsIGxvYWQgdGhlIGNvbnRlbnQgb2YgdGhlCiAgICBlZGl0b3IgaW50byB0aGUgdGV4dGFyZWEsIHNvIHRoYXQgaXQgY2FuIGJlIHN1Ym1pdHRlZCBhcyBub3JtYWwuCiAgICBUaGlzIGZ1bmN0aW9uIG9wdGlvbmFsbHkgdGFrZXMgYSBjb25maWd1cmF0aW9uIG9iamVjdCBhcyBzZWNvbmQKICAgIGFyZ3VtZW50LjwvcD4KCiAgICA8cHJlIGNsYXNzPSJjb2RlIj52YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoImlucHV0ZmllbGQiLCB7CiAgcGFyc2VyZmlsZTogWyJ0b2tlbml6ZWphdmFzY3JpcHQuanMiLCAicGFyc2VqYXZhc2NyaXB0LmpzIl0sCiAgcGF0aDogImxpYi9jb2RlbWlycm9yL2pzLyIsCiAgc3R5bGVzaGVldDogImxpYi9jb2RlbWlycm9yL2Nzcy9qc2NvbG9ycy5jc3MiCn0pOzwvcHJlPgoKICAgIDxwPlRoZSByZWFzb24gdGhhdCB0aGUgc2NyaXB0IHBhdGggaGFzIHRvIGJlIGNvbmZpZ3VyZWQgaXMgdGhhdAogICAgQ29kZU1pcnJvciB3aWxsIGxvYWQgaW4gYSBidW5jaCBvZiBleHRyYSBmaWxlcyB3aGVuIGFuIGVkaXRvciBpcwogICAgY3JlYXRlZCAodGhlIHBhcnNlciBzY3JpcHQsIGFtb25nIG90aGVycykuIFRvIGJlIGFibGUgdG8gZG8gdGhpcywKICAgIGl0IGhhcyB0byBrbm93IHdoZXJlIHRvIGZpbmQgdGhlbS4gVGhlc2UgYXJlIGFsbCB0aGUgSmF2YVNjcmlwdAogICAgZmlsZXMgdGhhdCBhcmUgcGFydCBvZiBDb2RlTWlycm9yIGl0c2VsZjo8L3A+CgogICAgPGRsPgogICAgICA8ZHQ+PGEgaHJlZj0ianMvY29kZW1pcnJvci5qcyI+PGNvZGU+Y29kZW1pcnJvci5qczwvY29kZT48L2E+PC9kdD4KICAgICAgPGRkPk1haW4gaW50ZXJmYWNlLCB0YWtlcyBjYXJlIG9mIGRlZmF1bHQgY29uZmlndXJhdGlvbiBhbmQgdGhlCiAgICAgIGRlZmluaXRpb24gb2YgZWRpdG9yIGZyYW1lcy4gSW5jbHVkZSB0aGlzIGluIHlvdXIgSFRNTAogICAgICBkb2N1bWVudC48L2RkPgogICAgICA8ZHQ+PGEgaHJlZj0ianMvZWRpdG9yLmpzIj48Y29kZT5lZGl0b3IuanM8L2NvZGU+PC9hPjwvZHQ+IDxkZD5UaGUKICAgICAgY29kZSB0aGF0IHRha2VzIGNhcmUgb2YgcmVhY3RpbmcgdG8gdXNlciBpbnB1dCwgY29sb3VyaW5nIHRleHQsCiAgICAgIGFuZCBpbmRlbnRpbmcgbGluZXMuPC9kZD4KICAgICAgPGR0PjxhIGhyZWY9ImpzL3V0aWwuanMiPjxjb2RlPnV0aWwuanM8L2NvZGU+PC9hPjwvZHQ+IDxkZD5BIGZldwogICAgICBnZW5lcmljIHV0aWxpdHkgZnVuY3Rpb25zLjwvZGQ+CiAgICAgIDxkdD48YQogICAgICBocmVmPSJqcy91bmRvLmpzIj48Y29kZT51bmRvLmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+SW1wbGVtZW50cyB0aGUgdW5kbyBoaXN0b3J5IGZvciB0aGUgZWRpdG9yLjwvZGQ+CiAgICAgIDxkdD48YQogICAgICBocmVmPSJqcy9zdHJpbmdzdHJlYW0uanMiPjxjb2RlPnN0cmluZ3N0cmVhbS5qczwvY29kZT48L2E+PC9kdD4KICAgICAgPGRkPk9iamVjdHMgZm9yIHdyYXBwaW5nIHRoZSB0ZXh0dWFsIGlucHV0IHRvIHRoZSBwYXJzZXIuPC9kZD4KICAgICAgPGR0PjxhIGhyZWY9ImpzL3NlbGVjdC5qcyI+PGNvZGU+c2VsZWN0LmpzPC9jb2RlPjwvYT48L2R0PiA8ZGQ+U29tZQogICAgICBoZWxwZXIgdXRpbGl0aWVzIGZvciB3b3JraW5nIHdpdGggc2VsZWN0ZWQgdGV4dCBhbmQgY3Vyc29yCiAgICAgIHBvc2l0aW9ucy48L2RkPgogICAgICA8ZHQ+PGEgaHJlZj0ianMvdG9rZW5pemUuanMiPjxjb2RlPnRva2VuaXplLmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+SGVscGVyIGZyYW1ld29yayBmb3Igd3JpdGluZyB0b2tlbmlzZXJzLjwvZGQ+CiAgICA8L2RsPgoKICAgIDxwPk1vc3Qgb2YgdGhlc2UgYXJlIHJhdGhlciBmdWxsIG9mIGNvbW1lbnRzLCB3aGljaCBjYW4gYmUgdXNlZnVsCiAgICB3aGVuIHlvdSBhcmUgdHJ5aW5nIHRvIGZpZ3VyZSBvdXQgaG93IHRoZXkgd29yaywgYnV0IHdhc3RlcyBhIGxvdAogICAgb2YgYmFuZHdpZHRoIGluIGEgcHJvZHVjdGlvbiBzeXN0ZW0uIFRha2UgYSBsb29rIGF0IHRoZQogICAgZGVzY3JpcHRpb24gb2YgdGhlIDxjb2RlPmJhc2VmaWxlczwvY29kZT4gb3B0aW9uIGJlbG93IGlmIHlvdSB3YW50CiAgICB0byBjb25jYXRlbmF0ZSBhbmQgbWluaW1pc2UgdGhlIGxpYnJhcnkuPC9wPgoKICAgIDxwPkFwYXJ0IGZyb20gdGhlc2UsIHRoZXJlIGFyZSBmaWxlcyB0aGF0IGltcGxlbWVudCB0aGUgdmFyaW91cwogICAgcGFyc2Vycy4gVGhlc2UgYWxsIHN0YXJ0IHdpdGggZWl0aGVyIDxjb2RlPnBhcnNlPC9jb2RlPiBvcgogICAgPGNvZGU+dG9rZW5pemU8L2NvZGU+LjwvcD4KCiAgICA8aDIgaWQ9ImNvbmZpZ3VyYXRpb24iPkNvbmZpZ3VyYXRpb248L2gyPgoKICAgIDxwPlRoZXJlIGFyZSB0aHJlZSB3YXlzIHRvIGNvbmZpZ3VyZSBDb2RlTWlycm9yOjwvcD4KCiAgICA8dWw+CiAgICAgIDxsaT5JZiB5b3UgZGVmaW5lIGEgZ2xvYmFsIDxjb2RlPkNvZGVNaXJyb3JDb25maWc8L2NvZGU+IG9iamVjdAogICAgICBiZWZvcmUgbG9hZGluZyA8YQogICAgICBocmVmPSJqcy9jb2RlbWlycm9yLmpzIj48Y29kZT5jb2RlbWlycm9yLmpzPC9jb2RlPjwvYT4sIHRoZQogICAgICBjb25maWd1cmF0aW9uIG9wdGlvbnMgaW4gdGhhdCBvYmplY3Qgd2lsbCBvdmVycmlkZSB0aGUKICAgICAgZGVmYXVsdHMuPC9saT4KICAgICAgPGxpPkJ5IGFzc2lnbmluZyB0byB0aGUgcHJvcGVydGllcyBvZiB0aGUKICAgICAgPGNvZGU+Q29kZU1pcnJvckNvbmZpZzwvY29kZT4gb2JqZWN0LCBjb25maWd1cmF0aW9uIGRlZmF1bHRzIGNhbgogICAgICBiZSBvdmVycmlkZGVuIGFmdGVyIGxvYWRpbmcgPGEKICAgICAgaHJlZj0ianMvY29kZW1pcnJvci5qcyI+PGNvZGU+Y29kZW1pcnJvci5qczwvY29kZT48L2E+LjwvbGk+CiAgICAgIDxsaT5UaGUgPGNvZGU+Q29kZU1pcnJvcjwvY29kZT4gY29uc3RydWN0b3IgY2FuIGJlIGdpdmVuIGEgc2Vjb25kCiAgICAgIGFyZ3VtZW50LCBhbiBvYmplY3QsIHdoaWNoIHdpbGwgb3ZlcnJpZGUgc29tZSBvcHRpb25zIGZvciBqdXN0CiAgICAgIHRoYXQgZWRpdG9yLiBPcHRpb25zIG5vdCBtZW50aW9uZWQgaW4gdGhpcyBvYmplY3Qgd2lsbCBkZWZhdWx0IHRvCiAgICAgIHRoZSB2YWx1ZXMgaW4gdGhlIDxjb2RlPkNvZGVNaXJyb3JDb25maWc8L2NvZGU+IG9iamVjdC48L2xpPgogICAgPC91bD4KCiAgICA8cD5UaGUgb3B0aW9ucyB0aGF0IGNhbiBiZSBzcGVjaWZpZWQgYXJlIHRoZXNlIChtb3N0IGhhdmUgc2Vuc2libGUKICAgIGRlZmF1bHRzIHNwZWNpZmllZCBpbiA8YQogICAgaHJlZj0ianMvY29kZW1pcnJvci5qcyI+PGNvZGU+Y29kZW1pcnJvci5qczwvY29kZT48L2E+KTo8L3A+CgogICAgPGRsPgoKICAgICAgPGR0Pjxjb2RlPnN0eWxlc2hlZXQ8L2NvZGU+PC9kdD48ZGQ+VGhlIGZpbGUgbmFtZSBvZiB0aGUKICAgICAgc3R5bGUtc2hlZXQsIG9yIHN0eWxlLXNoZWV0cywgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBjb2xvdXIgdGhlCiAgICAgIGNvZGUgaW4gdGhlIGVkaXRvciBmcmFtZS4gQ2FuIGJlIGEgc3RyaW5nIG9yIGFuIGFycmF5IG9mCiAgICAgIHN0cmluZ3MuIFNlZSA8YQogICAgICBocmVmPSJjc3MvanNjb2xvcnMuY3NzIj48Y29kZT5qc2NvbG9ycy5jc3M8L2NvZGU+PC9hPiBmb3IgYW4KICAgICAgZXhhbXBsZS4gVGhlIHNldCBvZiBhY3RpdmUgc3R5bGVzaGVldHMgY2FuIGJlIGNoYW5nZWQgaW4gYQogICAgICBydW5uaW5nIGVkaXRvciB3aXRoIHRoZSA8Y29kZT5zZXRTdHlsZXNoZWV0PC9jb2RlPiBtZXRob2QsIHdoaWNoCiAgICAgIGFsc28gdGFrZXMgYSBzdHJpbmcgb3IgYXJyYXkgb2Ygc3RyaW5ncyBhcyBhcmd1bWVudC48L2RkPgoKICAgICAgPGR0Pjxjb2RlPnBhdGg8L2NvZGU+PC9kdD48ZGQ+VGhlIHBhdGggdGhhdCBpcyBwcmVmaXhlZCB0bwogICAgICBzY3JpcHQgZmlsZSBuYW1lcyB3aGVuIHRoZXkgYXJlIGxvYWRlZCBpbnRvIGFuIElGUkFNRS4gKE5vdGUgdGhhdAogICAgICB0aGlzIGlzIG5vdCBhcHBsaWVkIHRvIHRoZSBzdHlsZS1zaGVldCBmaWxlIG5hbWUuKTwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+cGFyc2VyZmlsZTwvY29kZT48L2R0PjxkZD5BIGZpbGUgbmFtZSBzdHJpbmcsIG9yIGFuCiAgICAgIGFycmF5IG9mIHN0cmluZ3MgdGhhdCBuYW1lIHRoZSBmaWxlcyBjb250YWluaW5nIHRoZSBwYXJzZXIuIFNlZQogICAgICBiZWxvdyBmb3IgdGhlIGludGVyZmFjZSB0aGF0IHN1Y2ggYSBwYXJzZXIgc2hvdWxkCiAgICAgIGltcGxlbWVudC48L2RkPgoKICAgICAgPGR0Pjxjb2RlPmJhc2VmaWxlczwvY29kZT48L2R0PjxkZD5BbiBhcnJheSBvZiBzdHJpbmdzIG5hbWluZwogICAgICB0aGUgZmlsZXMgY29udGFpbmluZyB0aGUgYmFzZSBDb2RlTWlycm9yIGZ1bmN0aW9uYWxpdHkuIERlZmF1bHRzCiAgICAgIHRvIDxjb2RlPlsidXRpbC5qcyIsICJzdHJpbmdzdHJlYW0uanMiLCAic2VsZWN0LmpzIiwgInVuZG8uanMiLAogICAgICAiZWRpdG9yLmpzIiwgInRva2VuaXplLmpzIl08L2NvZGU+LCBidXQgaWYgeW91IHB1dCB0aGVtIGFsbCBpbnRvCiAgICAgIGEgc2luZ2xlIGZpbGUgdG8gcmVkdWNlIGxhdGVuY3ksIG9yIGFkZCBzb21lIGZ1bmN0aW9uYWxpdHksIHlvdQogICAgICBtaWdodCBoYXZlIHRvIGFkanVzdCB0aGF0LjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+aWZyYW1lQ2xhc3M8L2NvZGU+PC9kdD48ZGQ+U2V0IHRoaXMgdG8gYSBzdHJpbmcgdG8KICAgICAgZ2l2ZSB0aGUgSUZSQU1FIG5vZGUgY3JlYXRlZCBmb3IgdGhlIGVkaXRvciBhIGN1c3RvbSBDU1MgY2xhc3MuCiAgICAgIERlZmF1bHRzIHRvIDxjb2RlPm51bGw8L2NvZGU+LjwvZGQ+CiAgICAgIAogICAgICA8ZHQ+PGNvZGU+cGFzc0RlbGF5PC9jb2RlPjwvZHQ+PGRkPkdpdmVzIHRoZSBhbW91bnQgb2YKICAgICAgbWlsbGlzZWNvbmRzIGJldHdlZW4gY29sb3VyaW5nIHBhc3Nlcy4gRGVmYXVsdHMgdG8gMjAwLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+cGFzc1RpbWU8L2NvZGU+PC9kdD48ZGQ+U3BlY2lmaWVzIHRoZSBtYXhpbXVtIGFtb3VudAogICAgICBvZiB0aW1lIHRoYXQgdGhlIGhpZ2hsaWdodGVyIHdpbGwgc3BlbmQgaW4gb25lIHNob3QuIFNldHRpbmcKICAgICAgdGhpcyB0b28gaGlnaCB3aWxsIGNhdXNlIHRoZSBlZGl0b3IgdG8gJ2ZyZWV6ZScgdGhlIGJyb3dzZXIgZm9yCiAgICAgIG5vdGljZWFibGUgaW50ZXJ2YWxzLiBEZWZhdWx0cyB0byA1MC48L2RkPgoKICAgICAgPGR0Pjxjb2RlPmNvbnRpbnVvdXNTY2FubmluZzwvY29kZT48L2R0PjxkZD5Db25maWd1cmUgY29udGludW91cwogICAgICBzY2FubmluZyBvZiB0aGUgZG9jdW1lbnQuIFdoZW4gPGNvZGU+ZmFsc2U8L2NvZGU+LCBzY2FubmluZyBpcwogICAgICBkaXNhYmxlZC4gV2hlbiBzZXQgdG8gYSBudW1iZXIsIHNheSA8Y29kZT5OPC9jb2RlPiwgYQogICAgICAnYmFja2dyb3VuZCcgcHJvY2VzcyB3aWxsIHNjYW4gdGhlIGRvY3VtZW50IGZvcgogICAgICA8Y29kZT5wYXNzVGltZTwvY29kZT4gKHNlZSBhYm92ZSkgbWlsbGlzZWNvbmRzIGV2ZXJ5CiAgICAgIDxjb2RlPk48L2NvZGU+IG1pbGxpc2Vjb25kcywgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGFueXRoaW5nCiAgICAgIGNoYW5nZWQuIFRoaXMgbWFrZXMgc3VyZSBub24tbG9jYWwgY2hhbmdlcyBwcm9wYWdhdGUgdGhyb3VnaCB0aGUKICAgICAgZG9jdW1lbnQsIGFuZCB3aWxsIGhlbHAga2VlcCBldmVyeXRoaW5nIGNvbnNpc3RlbnQuIEl0IGRvZXMgYWRkCiAgICAgIGV4dHJhIHByb2Nlc3NpbmcgY29zdCwgZXZlbiBmb3IgYW4gaWRsZSBlZGl0b3IuIERlZmF1bHQgdmFsdWUgaXMKICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+LjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+YXV0b01hdGNoUGFyZW5zPC9jb2RlPjwvZHQ+PGRkPldoZW4gPGNvZGU+dHJ1ZTwvY29kZT4sCiAgICAgIHdpbGwgY2F1c2UgcGFyZW5zIHRvIGJlIG1hdGNoZWQgZXZlcnkgdGltZSBhIGtleSBpcyBwcmVzc2VkIG9yCiAgICAgIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgZG9jdW1lbnQuIERlZmF1bHRzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPi4KICAgICAgTWlnaHQgYmUgZXhwZW5zaXZlIGZvciBiaWcgZG9jdW1lbnRzLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+bWFya1BhcmVuPC9jb2RlPiwKICAgICAgPGNvZGU+dW5tYXJrUGFyZW48L2NvZGU+PC9kdD48ZGQ+RnVuY3Rpb25zLiBDYW4gYmUgdXNlZCB0bwogICAgICBjdXN0b21pc2UgdGhlIHdheSBicmFja2V0cyBhcmUgbWFya2VkIChhbmQgdW5tYXJrZWQpIHdoZW4KICAgICAgbWF0Y2hlZC4gQm90aCB0YWtlIHRoZSBicmFja2V0J3MgPGNvZGU+U1BBTjwvY29kZT4gbm9kZSBhcyB0aGVpcgogICAgICBmaXJzdCBhcmd1bWVudCwgYW5kIDxjb2RlPm1hcmtQYXJlbjwvY29kZT4gdGFrZXMgYSBzZWNvbmQKICAgICAgYm9vbGVhbiBhcmd1bWVudCBpbmRpY2F0aW5nIHdoZXRoZXIgYSBzdWNjZXNzZnVsIG1hdGNoIHdhcwogICAgICBmb3VuZC4gVGhlIGRlZmF1bHQgaXMgdG8gbWFrZSB0aGUgYnJhY2tldHMgYm9sZCBhbmQgZ3JlZW4gKG9yCiAgICAgIHJlZCwgaWYgbm90IG1hdGNoZWQpLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+c2F2ZUZ1bmN0aW9uPC9jb2RlPjwvZHQ+PGRkPklmIGdpdmVuIGEgZnVuY3Rpb24KICAgICAgdmFsdWUsIHRoYXQgZnVuY3Rpb24gd2lsbCBiZSBpbnZva2VkIHdoZW4gdGhlIHVzZXIgcHJlc3NlcwogICAgICBjb250cm9sLXMuIFlvdSBzaG91bGQgYWR2aXNlIHlvdXIgT3BlcmEgdXNlcnMgdG8gdXNlCiAgICAgIGNvbnRyb2wtc2hpZnQtcyBpbnN0ZWFkLCBzaW5jZSBwbGFpbiBjb250cm9sLXMgd2lsbCBicmluZyB1cCB0aGUKICAgICAgJ3NhdmUgcGFnZScgZGlhbG9nLiBEZWZhdWx0cyB0byA8Y29kZT5udWxsPC9jb2RlPi48L2RkPgoKICAgICAgPGR0Pjxjb2RlPnVuZG9EZXB0aDwvY29kZT48L2R0PjxkZD5NYXhpbXVtIGxlbmd0aCBvZiB0aGUgdW5kbwogICAgICBoaXN0b3J5LiBEZWZhdWx0IGlzIDUwLiBUaGlzIHNldHRpbmcgaXMgY2hhbmdlYWJsZSB3aXRoIHRoZQogICAgICA8Y29kZT5zZXRVbmRvRGVwdGgoZGVwdGgpPC9jb2RlPiBtZXRob2Qgb24gQ29kZU1pcnJvcgogICAgICBpbnN0YW5jZXMuPC9kZD4KCiAgICAgIDxkdD48Y29kZT5vbkNoYW5nZTwvY29kZT48L2R0PjxkZD5BbiBvcHRpb25hbCBmdW5jdGlvbiBvZiB6ZXJvCiAgICAgIGFyZ3VtZW50cyB0aGF0IGdldHMgY2FsbGVkIHdoZW5ldmVyIHRoZSBkb2N1bWVudCBpcyBjaGFuZ2VkLgogICAgICBIYXBwZW5zIGF0IHVuZG8tY29tbWl0IHRpbWUsIG5vdCBpbnN0YW50YW5pb3VzbHkuPC9kZD4KCiAgICAgIDxkdD48Y29kZT51bmRvRGVsYXk8L2NvZGU+PC9kdD48ZGQ+V2hlbiBub3RoaW5nIGlzIGRvbmUgaW4gdGhlCiAgICAgIGVkaXRvciBmb3IgdGhpcyBhbW91bnQgb2YgbWlsbGlzZWNvbmRzLCBwZW5kaW5nIGNoYW5nZXMgZ2V0CiAgICAgIGFkZGVkIHRvIHRoZSB1bmRvIGhpc3RvcnkuIFNldHRpbmcgdGhpcyBsb3dlciB3aWxsIGdpdmUgdGhlIHVuZG8KICAgICAgZnVuY3Rpb25hbGl0eSBhIGZpbmVyIGdyYW51bGFyaXR5LiBEZWZhdWx0cyB0byA4MDAuPC9kZD4KCiAgICAgIDxkdD48Y29kZT53aWR0aDwvY29kZT4sIDxjb2RlPmhlaWdodDwvY29kZT48L2R0PjxkZD5UaGUgc2l6ZSBvZgogICAgICB0aGUgZWRpdG9yIGZyYW1lLCBnaXZlbiBhcyBhIHN0eWxlLXNoZWV0IHF1YW50aXRpZXMgKGZvciBleGFtcGxlCiAgICAgIDxjb2RlPiI2MDBweCI8L2NvZGU+IG9yIDxjb2RlPiIxMDAlIjwvY29kZT4pLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+ZGlzYWJsZVNwZWxsY2hlY2s8L2NvZGU+PC9kdD48ZGQ+U2hvdWxkIHRoZSBlZGl0b3IKICAgICAgZGlzYWJsZSBzcGVsbC1jaGVja2luZyBvbiBicm93c2VycyB0aGF0IHN1cHBvcnQgaXQgKEZpcmVmb3ggMispLgogICAgICBEZWZhdWx0IGlzIDxjb2RlPnRydWU8L2NvZGU+LCBzaW5jZSBmb3IgbW9zdCBjb2RlIHNwZWxsLWNoZWNraW5nCiAgICAgIGlzIHVzZWxlc3MuIENhbiBiZSBjaGFuZ2VkIHdpdGggdGhlCiAgICAgIDxjb2RlPnNldFNwZWxsQ2hlY2sob24pPC9jb2RlPiBtZXRob2QuPC9kZD4KCiAgICAgIDxkdD48Y29kZT50ZXh0V3JhcHBpbmc8L2NvZGU+PC9kdD48ZGQ+Q2FuIGJlIHVzZWQgdG8gZGlzYWJsZSBvcgogICAgICBlbmFibGUgdGV4dC13cmFwcGluZyBpbiB0aGUgZWRpdG9yIGZyYW1lLiBEZWZhdWx0IGlzCiAgICAgIDxjb2RlPnRydWU8L2NvZGU+LiBDaGFuZ2VhYmxlIHdpdGggdGhlCiAgICAgIDxjb2RlPnNldFRleHRXcmFwcGluZyhvbik8L2NvZGU+IG1ldGhvZC48L2RkPgoKICAgICAgPGR0Pjxjb2RlPmxpbmVOdW1iZXJzPC9jb2RlPjwvZHQ+PGRkPlNob3cgbGluZSBudW1iZXJzIHRvIHRoZQogICAgICBsZWZ0IG9mIHRoZSBlZGl0b3IuIFRoaXMgcmVxdWlyZXMgeW91IHRvIHNwZWNpZnkgYSBzdHlsZSBmb3IgdGhlCiAgICAgIDxjb2RlPkNvZGVNaXJyb3ItbGluZS1udW1iZXJzPC9jb2RlPiBDU1MgY2xhc3MgKGluIHRoZSBvdXRlcgogICAgICBkb2N1bWVudCkgdG8gY29uZmlndXJlIHRoZSB3aWR0aCwgZm9udCwgY29sb3JzLCBldGNldGVyYSBmb3IgdGhlCiAgICAgIGxpbmUtbnVtYmVyIERJVi4gWW91IGhhdmUgdG8gbWFrZSBzdXJlIHRoYXQgbGluZXMgaW4gdGhlCiAgICAgIG51bWJlcmluZyBlbGVtZW50IGhhdmUgdGhlIHNhbWUgaGVpZ2h0IGFzIGxpbmVzIGluIHRoZSBlZGl0b3IuCiAgICAgIFRoaXMgaXMgbW9zdCBlYXNpbHkgZG9uZSBieSBnaXZpbmcgdGhlbSBib3RoIHRoZSBzYW1lIGZvbnQgYW5kCiAgICAgIGFuIGFic29sdXRlICgncHQnIG9yICdweCcpIGZvbnQgc2l6ZS4gVGhpcyBvcHRpb24gZGVmYXVsdHMgdG8KICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+LiBDaGFuZ2VhYmxlIHdpdGggdGhlCiAgICAgIDxjb2RlPnNldExpbmVOdW1iZXJzKG9uKTwvY29kZT4gbWV0aG9kLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+bGluZU51bWJlckRlbGF5PC9jb2RlPiwKICAgICAgPGNvZGU+bGluZU51bWJlclRpbWU8L2NvZGU+PC9kdD48ZGQ+V2hlbiBib3RoIGxpbmUgbnVtYmVycyBhcmUKICAgICAgYW5kIHRleHQgd3JhcHBpbmcgYXJlIHR1cm5lZCBvbiwgdXBkYXRpbmcgbGluZSBudW1iZXJzIGNhbiBiZQogICAgICBleHBlbnNpdmUuIFRoZXNlIHNldHRpbmdzIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgaG93IGZhc3QgdGhlCiAgICAgIHVwZGF0aW5nIGhhcHBlbnMgJiN4MjAxNTsgdGhleSB3b3JrIGluIHRoZSBzYW1lIHdheSBhcwogICAgICA8Y29kZT5wYXNzRGVsYXk8L2NvZGU+IGFuZCA8Y29kZT5wYXNzVGltZTwvY29kZT4uPC9kZD4KCiAgICAgIDxkdD48Y29kZT5pbmRlbnRVbml0PC9jb2RlPjwvZHQ+PGRkPkFuIGludGVnZXIgdGhhdCBzcGVjaWZpZXMKICAgICAgdGhlIGFtb3VudCBvZiBzcGFjZXMgb25lICdsZXZlbCcgb2YgaW5kZW50YXRpb24gc2hvdWxkIGFkZC4KICAgICAgRGVmYXVsdCBpcyA8Y29kZT4yPC9jb2RlPi4gQ2hhbmdlYWJsZSBpbiBhIHJ1bm5pbmcgZWRpdG9yIHVzaW5nCiAgICAgIHRoZSA8Y29kZT5zZXRJbmRlbnRVbml0KHNwYWNlcyk8L2NvZGU+IG1ldGhvZC48L2RkPgoKICAgICAgPGR0Pjxjb2RlPnRhYk1vZGU8L2NvZGU+PC9kdD48ZGQ+RGV0ZXJtaW5lcyB3aGF0IHRoZSBlZmZlY3Qgb2YKICAgICAgcHJlc3NpbmcgdGFiIGlzLiBQb3NzaWJpbGl0aWVzIGFyZToKICAgICAgPGRsPgogICAgICAgIDxkdD48Y29kZT4iaW5kZW50IjwvY29kZT48L2R0PjxkZD5UaGUgZGVmYXVsdC4gQ2F1c2VzIHRhYiB0bwogICAgICAgIGFkanVzdCB0aGUgaW5kZW50YXRpb24gb2YgdGhlIHNlbGVjdGlvbiBvciBjdXJyZW50IGxpbmUgdXNpbmcKICAgICAgICB0aGUgcGFyc2VyJ3MgcnVsZXMuPC9kZD4KICAgICAgICA8ZHQ+PGNvZGU+InNwYWNlcyI8L2NvZGU+PC9kdD48ZGQ+UHJlc3NpbmcgdGFiIHNpbXBseSBpbnNlcnRzCiAgICAgICAgZm91ciBzcGFjZXMuPC9kZD4KICAgICAgICA8ZHQ+PGNvZGU+ImRlZmF1bHQiPC9jb2RlPjwvZHQ+PGRkPkNvZGVNaXJyb3IgZG9lcyBub3QKICAgICAgICBpbnRlcmZlcmUgd2l0aCB0aGUgdGFiIGtleSwgYnV0IGxlYXZlcyBpdCB0byB0aGUgYnJvd3NlciB0bwogICAgICAgIGhhbmRsZSBpdC4gQmluZHMgc2hpZnQtc3BhY2UgdG8gcmVndWxhciBpbmRlbnRhdGlvbgogICAgICAgIGJlaGF2aW91ci48L2RkPgogICAgICAgIDxkdD48Y29kZT4ic2hpZnQiPC9jb2RlPjwvZHQ+PGRkPlByZXNzaW5nIHRhYiBpbmRlbnRzIHRoZQogICAgICAgIGN1cnJlbnQgbGluZSAob3Igc2VsZWN0aW9uKSBvbmUgPGNvZGU+aW5kZW50VW5pdDwvY29kZT4KICAgICAgICBkZWVwZXIsIHByZXNzaW5nIHNoaWZ0LXRhYiwgdW4taW5kZW50cyBpdC48L2RkPgogICAgICA8L2RsPgogICAgICBUaGlzIG9wdGlvbiBjYW4gYmUgY2hhbmdlZCBhdCBydW4tdGltZSB1c2luZyB0aGUKICAgICAgPGNvZGU+c2V0VGFiTW9kZShtb2RlKTwvY29kZT4gbWV0aG9kLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+cmVpbmRlbnRPbkxvYWQ8L2NvZGU+PC9kdD48ZGQ+V2hlbiA8Y29kZT50cnVlPC9jb2RlPiwKICAgICAgdGhpcyBjYXVzZXMgdGhlIGNvbnRlbnQgb2YgdGhlIGVkaXRvciB0byBiZSByZWluZGVudGVkCiAgICAgIGltbWVkaWF0ZWx5IHdoZW4gdGhlIGVkaXRvciBsb2Fkcy4gRGVmYXVsdHMgdG8KICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+LjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+cmVhZE9ubHk8L2NvZGU+PC9kdD48ZGQ+V2hlbiBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sCiAgICAgIHRoZSBkb2N1bWVudCBpcyBub3QgZWRpdGFibGUuPC9kZD4KCiAgICAgIDxkdD48Y29kZT5kb21haW48L2NvZGU+PC9kdD48ZGQ+Q2FuIGJlIHNldCB0byB0aGUgdmFsdWUKICAgICAgPGNvZGU+ZG9jdW1lbnQuZG9tYWluPC9jb2RlPiBzaG91bGQgaGF2ZSBpbnNpZGUgb2YgdGhlIGlmcmFtZS4KICAgICAgVXNlZCB0byBwcmV2ZW50IGFjY2VzcyBpc3N1ZXMgaW4gSUUsIHdoZXJlIHRoaXMgdmFsdWUgaXNuJ3QKICAgICAgYXV0b21hdGljYWxseSBpbmhlcml0ZWQgYnkgaWZyYW1lcy48L2RkPgoKICAgICAgPGR0Pjxjb2RlPmluaXRDYWxsYmFjazwvY29kZT48L2R0PjxkZD5JZiBzZXQgdG8gYSBmdW5jdGlvbiwgdGhpcwogICAgICB3aWxsIGJlIGNhbGxlZCAod2l0aCB0aGUgZWRpdG9yIG9iamVjdCBhcyBpdHMgYXJndW1lbnQpIGFmdGVyCiAgICAgIHRoZSBlZGl0b3IgaGFzIGZpbmlzaGVkIGluaXRpYWxpc2luZy48L2RkPgogICAgICAKICAgICAgPGR0Pjxjb2RlPmN1cnNvckFjdGl2aXR5PC9jb2RlPjwvZHQ+PGRkPkEgZnVuY3Rpb24gdGhhdCBpcwogICAgICBjYWxsZWQgZXZlcnkgdGltZSB0aGUgY3Vyc29yIG1vdmVzLCB3aXRoIHRoZSB0b3AtbGV2ZWwgbm9kZSB0aGF0CiAgICAgIHRoZSBjdXJzb3IgaXMgaW5zaWRlIG9yIG5leHQgdG8gYXMgYW4gYXJndW1lbnQuIENhbiBiZSB1c2VkIHRvCiAgICAgIGhhdmUgc29tZSBjb250cm9scyByZWFjdCB0byB0aGUgY29udGV4dCBvZiB0aGUgY3Vyc29yLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+YWN0aXZlVG9rZW5zPC9jb2RlPjwvZHQ+PGRkPkNhbiBiZSBzZXQgdG8gYSBmdW5jdGlvbgogICAgICB0aGF0IHdpbGwgYmUgY2FsbGVkIHdpdGggPGNvZGU+KHNwYW5Ob2RlLCB0b2tlbk9iamVjdCwKICAgICAgZWRpdG9yKTwvY29kZT4gYXJndW1lbnRzIHdoZW5ldmVyIGEgbmV3IHRva2VuIG5vZGUgaXMgYmVpbmcKICAgICAgYWRkZWQgdG8gdGhlIGRvY3VtZW50LiBDYW4gYmUgdXNlZCB0byBkbyB0aGluZ3MgbGlrZSBhZGQgZXZlbnQKICAgICAgaGFuZGxlcnMgdG8gbm9kZXMuIFNob3VsZCA8ZW0+bm90PC9lbT4gY2hhbmdlIHRoZSBET00gc3RydWN0dXJlCiAgICAgIG9mIHRoZSBub2RlIChzbyBubyB0dXJuaW5nIHRoZSBzcGFuIGludG8gYSBsaW5rKSwgc2luY2UgdGhpcwogICAgICB3aWxsIGdyZWF0bHkgY29uZnVzZSB0aGUgZWRpdG9yLjwvZGQ+CgogICAgICA8ZHQgaWQ9InBhcnNlckNvbmZpZyI+PGNvZGU+cGFyc2VyQ29uZmlnPC9jb2RlPjwvZHQ+PGRkPkFuCiAgICAgIG9iamVjdCB2YWx1ZSB0aGF0IGlzIHBhc3NlZCBhbG9uZyB0byB0aGUgcGFyc2VyIHRvIGNvbmZpZ3VyZSBpdC4KICAgICAgV2hhdCB0aGlzIG9iamVjdCBzaG91bGQgbG9vayBsaWtlIGRlcGVuZHMgb24gdGhlIHBhcnNlcgogICAgICB1c2VkLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+Y29udGVudDwvY29kZT48L2R0PjxkZD5UaGUgc3RhcnRpbmcgY29udGVudCBvZiB0aGUKICAgICAgZWRpdG9yLiBZb3UnbGwgcHJvYmFibHkgbm90IHdhbnQgdG8gcHJvdmlkZSBhIGdsb2JhbCBkZWZhdWx0IGZvcgogICAgICB0aGlzLCBidXQgYWRkIGl0IHRvIHRoZSA8Y29kZT5vcHRpb25zPC9jb2RlPiBvYmplY3QgcGFzc2VkIHRvCiAgICAgIGluZGl2aWR1YWwgZWRpdG9ycyBhcyB0aGV5IGFyZSBjcmVhdGVkLjwvZGQ+CgogICAgPC9kbD4KCiAgICA8aDIgaWQ9InBhcnNlcnMiPlBhcnNlcnM8L2gyPgoKICAgIDxwPihJZiB5b3Ugd2FudCB0byB1c2UgYSBDb2RlTWlycm9yIHBhcnNlciB0byBoaWdobGlnaHQgYSBwaWVjZSBvZgogICAgdGV4dCwgd2l0aG91dCBjcmVhdGluZyBhbiBlZGl0b3IsIHNlZSA8YQogICAgaHJlZj0iaGlnaGxpZ2h0Lmh0bWwiPnRoaXMgZXhhbXBsZTwvYT4sIGFuZCB0aGUgPGNvZGU+PGEKICAgIGhyZWY9ImpzL2hpZ2hsaWdodC5qcyI+aGlnaGxpZ2h0LmpzPC9hPjwvY29kZT4gc2NyaXB0Lik8L3A+CgogICAgPHA+VGhlIGZvbGxvd2luZyBwYXJzZXJzIGNvbWUgd2l0aCB0aGUgZGlzdHJpYnV0aW9uIG9mIENvZGVNaXJyb3I6PC9wPgoKICAgIDxkbD4KICAgICAgPGR0Pjxjb2RlPjxhIGhyZWY9ImpzL3BhcnNleG1sLmpzIj5wYXJzZXhtbC5qczwvYT48L2NvZGU+ICg8YQogICAgICBocmVmPSJodG1sdGVzdC5odG1sIj5kZW1vPC9hPik8L2R0PjxkZD5BIEhUTUwvWE1MIHBhcnNlci4gVGFrZXMKICAgICAgYSA8Y29kZT51c2VIVE1MS2x1ZGdlczwvY29kZT4gY29uZmlndXJhdGlvbiBvcHRpb24gKHNlZSB0aGUKICAgICAgPGNvZGU+PGEgaHJlZj0iI3BhcnNlckNvbmZpZyI+cGFyc2VyQ29uZmlnPC9hPjwvY29kZT4gb3B0aW9uCiAgICAgIGFib3ZlKSwgd2hpY2ggc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGNvbnRlbnQgb2YgdGhlIGVkaXRvciBpcwogICAgICBIVE1MIG9yIFhNTCwgYW5kIHRoaW5ncyBsaWtlIHNlbGYtY2xvc2luZyB0YWdzICg8Y29kZT5icjwvY29kZT4sCiAgICAgIDxjb2RlPmltZzwvY29kZT4pIGV4aXN0LiBUaGlzIGRlZmF1bHRzIHRvIDxjb2RlPnRydWU8L2NvZGU+LgogICAgICBFeGFtcGxlIGNvbG91cnMgZm9yIHRoZSBzdHlsZXMgdGhhdCB0aGlzIHBhcnNlciB1c2VzIGFyZSBkZWZpbmVkCiAgICAgIGluIDxjb2RlPjxhCiAgICAgIGhyZWY9ImNzcy94bWxjb2xvcnMuY3NzIj5jc3MveG1sY29sb3JzLmNzczwvYT48L2NvZGU+LjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+PGEKICAgICAgaHJlZj0ianMvdG9rZW5pemVqYXZhc2NyaXB0LmpzIj50b2tlbml6ZWphdmFzY3JpcHQuanM8L2E+PC9jb2RlPiwKICAgICAgPGNvZGU+PGEKICAgICAgaHJlZj0ianMvcGFyc2VqYXZhc2NyaXB0LmpzIj5wYXJzZWVqYXZhc2NyaXB0LmpzPC9hPjwvY29kZT4gKDxhCiAgICAgIGhyZWY9ImpzdGVzdC5odG1sIj5kZW1vPC9hPik8L2R0PjxkZD5UaGUgSmF2YVNjcmlwdCBwYXJzZXIuCiAgICAgIEV4YW1wbGUgY29sb3VycyBpbiA8Y29kZT48YQogICAgICBocmVmPSJjc3MvanNjb2xvcnMuY3NzIj5jc3MvanNjb2xvcnMuY3NzPC9hPjwvY29kZT4uIFRha2VzIG9uZQogICAgICBjb25maWd1cmF0aW9uIG9wdGlvbiwgPGNvZGU+anNvbjwvY29kZT4sIHRoYXQgY2FuIGJlIHNldCB3aGVuCiAgICAgIHRoZSBlZGl0b3IgY29udGVudCBpcyBKU09OIGRhdGEuIEl0IGNhdXNlcyBldmVyeSBvcGVuaW5nIGJyYWNlCiAgICAgIHRvIGJlIHRyZWF0ZWQgYXMgdGhlIHN0YXJ0IG9mIGFuIG9iamVjdCwgcmF0aGVyIHRoYW4gYQogICAgICBibG9jay48L2RkPgoKICAgICAgPGR0Pjxjb2RlPjxhIGhyZWY9ImpzL3BhcnNlY3NzLmpzIj5wYXJzZWNzcy5qczwvYT48L2NvZGU+ICg8YQogICAgICBocmVmPSJjc3N0ZXN0Lmh0bWwiPmRlbW88L2E+KTwvZHQ+PGRkPkEgQ1NTIHBhcnNlci4gU3R5bGVzIGluCiAgICAgIDxjb2RlPjxhCiAgICAgIGhyZWY9ImNzcy9jc3Njb2xvcnMuY3NzIj5jc3MvY3NzY29sb3JzLmNzczwvYT48L2NvZGU+PC9kZD4KCiAgICAgIDxkdD48Y29kZT48YQogICAgICBocmVmPSJqcy9wYXJzZWh0bWxtaXhlZC5qcyI+cGFyc2VodG1sbWl4ZWQuanM8L2E+PC9jb2RlPiAoPGEKICAgICAgaHJlZj0ibWl4ZWR0ZXN0Lmh0bWwiPmRlbW88L2E+KTwvZHQ+PGRkPkEgbWl4ZWQtbW9kZSBIVE1MCiAgICAgIHBhcnNlci4gUmVxdWlyZXMgdGhlIFhNTCwgSmF2YVNjcmlwdCwgYW5kIENTUyBwYXJzZXJzIHRvIGFsc28gYmUKICAgICAgbG9hZGVkLCBzbyB5b3VyIDxjb2RlPnBhcnNlcmZpbGU8L2NvZGU+IG9wdGlvbiBsb29rcyBzb21ldGhpbmcKICAgICAgbGlrZSA8Y29kZT5bInBhcnNleG1sLmpzIiwgInBhcnNlY3NzLmpzIiwKICAgICAgInRva2VuaXplamF2YXNjcmlwdC5qcyIsICJwYXJzZWphdmFzY3JpcHQuanMiLAogICAgICAicGFyc2VodG1sbWl4ZWQuanMiXTwvY29kZT4uPC9kZD4KCiAgICAgIDxkdD48Y29kZT48YSBocmVmPSJqcy9wYXJzZXNwYXJxbC5qcyI+cGFyc2VzcGFycWwuanM8L2E+PC9jb2RlPgogICAgICAoPGEgaHJlZj0ic3BhcnFsdGVzdC5odG1sIj5kZW1vPC9hPik8L2R0PjxkZD5QYXJzZXMgdGhlIDxhCiAgICAgIGhyZWY9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU1BBUlFMIj5TUEFSUUw8L2E+IHF1ZXJ5CiAgICAgIGxhbmd1YWdlLiBFeGFtcGxlIHN0eWxlcyBpbiA8Y29kZT48YQogICAgICBocmVmPSJjc3Mvc3BhcnFsY29sb3JzLmNzcyI+Y3NzL3NwYXJxbGNvbG9ycy5jc3M8L2E+PC9jb2RlPjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+PGEKICAgICAgaHJlZj0ianMvcGFyc2VkdW1teS5qcyI+cGFyc2VkdW1teS5qczwvYT48L2NvZGU+PC9kdD48ZGQ+QQogICAgICAnZHVtbXknIHBhcnNlciB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIGVkaXQgcGxhaW4gdGV4dCwgb3IKICAgICAgZG9jdW1lbnRzIGZvciB3aGljaCBubyBzdWl0YWJsZSBwYXJzZXIgZXhpc3RzLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+PGEKICAgICAgaHJlZj0iY29udHJpYi9waHAvanMvcGFyc2VwaHAuanMiPmNvbnRyaWIvcGhwL2pzL3BhcnNlcGhwLmpzPC9hPjwvY29kZT4KICAgICAgKDxhIGhyZWY9ImNvbnRyaWIvcGhwL2luZGV4Lmh0bWwiPmRlbW88L2E+KTwvZHQ+PGRkPlBIUCBwYXJzZXIuCiAgICAgIFRoZXJlIGlzIGFsc28gPGNvZGU+PGEKICAgICAgaHJlZj0iY29udHJpYi9waHAvanMvcGFyc2VwaHBodG1sbWl4ZWQuanMiPmNvbnRyaWIvcGhwL2pzL3BhcnNlcGhwaHRtbG1peGVkLmpzPC9hPjwvY29kZT4sCiAgICAgIHdoaWNoIHdyYXBzIHRoaXMgcGFyc2VyIHRvIGFsbG93IG1peGVkLW1vZGUgSFRNTCArIFBIUCBwYXJzaW5nLgogICAgICBUaGlzIG9uZSB0YWtlcyBhIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIDxjb2RlPm9wZW5pbmc8L2NvZGU+LAogICAgICB3aGljaCBzaG91bGQgY29udGFpbiBhbiBhcnJheSBvZiBYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbgogICAgICBvcGVuaW5ncyAoPGNvZGU+Jmx0Oz9waHA8L2NvZGU+LCA8Y29kZT4mbHQ7PzwvY29kZT4gZXRjKSB3aGljaAogICAgICBjYW4gYmUgdXNlZCB0byBvcGVuIGEgUEhQIGJsb2NrLiBEZWZhdWx0IGlzCiAgICAgIDxjb2RlPlsiJmx0Oz9waHAiXTwvY29kZT4uPC9kZD4KCiAgICAgIDxkdD48Y29kZT48YQogICAgICBocmVmPSJjb250cmliL3B5dGhvbi9qcy9wYXJzZXB5dGhvbi5qcyI+Y29udHJpYi9weXRob24vanMvcGFyc2VweXRob24uanM8L2E+PC9jb2RlPgogICAgICAoPGEgaHJlZj0iY29udHJpYi9weXRob24vaW5kZXguaHRtbCI+ZGVtbzwvYT4pPC9kdD48ZGQ+UHl0aG9uCiAgICAgIHBhcnNlci48L2RkPgoKICAgICAgPGR0Pjxjb2RlPjxhIGhyZWY9ImNvbnRyaWIvbHVhL2pzL3BhcnNlbHVhLmpzIj5jb250cmliL2x1YS9qcy9wYXJzZWx1YS5qczwvYT48L2NvZGU+CiAgICAgICg8YSBocmVmPSJjb250cmliL2x1YS9pbmRleC5odG1sIj5kZW1vPC9hPik8L2R0PjxkZD5MdWEKICAgICAgcGFyc2VyLjwvZGQ+CgogICAgPC9kbD4KCiAgICA8aDIgaWQ9InByb2dyYW1taW5nIj5Qcm9ncmFtbWluZyBJbnRlcmZhY2U8L2gyPgoKICAgIDxwPlRvIGJlIGFzIGZsZXhpYmxlIGFzIHBvc3NpYmxlLCBDb2RlTWlycm9yIGltcGxlbWVudHMgYSB2ZXJ5CiAgICBwbGFpbiBlZGl0YWJsZSBmaWVsZCwgd2l0aG91dCBhbnkgYWNjb21wYW55aW5nIGJ1dHRvbnMsIGJlbGxzLCBhbmQKICAgIHdoaXN0bGVzLiA8Y29kZT5Db2RlTWlycm9yPC9jb2RlPiBvYmplY3RzIGRvLCBob3dldmVyLCBwcm92aWRlIGEKICAgIG51bWJlciBvZiBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzIHRoYXQgbWFrZSBpdCBwb3NzaWJsZSB0byBhZGQKICAgIGV4dHJhIGZ1bmN0aW9uYWxpdHkgYXJvdW5kIHRoZSBlZGl0b3IuIDxhCiAgICBocmVmPSJqcy9taXJyb3JmcmFtZS5qcyI+PGNvZGU+bWlycm9yZnJhbWUuanM8L2NvZGU+PC9hPiBwcm92aWRlcwogICAgYSBiYXNpYyBleGFtcGxlIG9mIHRoZWlyIHVzYWdlLjwvcD4KCiAgICA8aDM+UHJvcGVydGllczwvaDM+CgogICAgPGRsPgogICAgICA8ZHQ+PGNvZGU+ZnJhbWU8L2NvZGU+PC9kdD48ZGQ+VGhlIGVkaXRhYmxlIGZyYW1lLjwvZGQ+CiAgICAgIDxkdD48Y29kZT53aW48L2NvZGU+PC9kdD48ZGQ+VGhlIHdpbmRvdyBvZiB0aGUgZWRpdGFibGUgZnJhbWUuCiAgICAgIE1vc3RseSB1c2VmdWwgZm9yIGF0dGFjaGluZyBldmVudCBoYW5kbGVycy48L2RkPgogICAgICA8ZHQ+PGNvZGU+d3JhcHBpbmc8L2NvZGU+PC9kdD48ZGQ+VGhlIDxjb2RlPkRJVjwvY29kZT4gZWxlbWVudAogICAgICB3cmFwcGVkIGFyb3VuZCB0aGUgZnJhbWUuIFRoaXMgYWx3YXlzIGhhcyBhIENTUyBjbGFzcyBvZgogICAgICA8Y29kZT5Db2RlTWlycm9yLXdyYXBwaW5nPC9jb2RlPi48L2RkPgogICAgPC9kbD4KCiAgICA8aDM+TWV0aG9kczwvaDM+CgogICAgPGRsPgogICAgICA8ZHQ+PGNvZGU+Z2V0Q29kZSgpPC9jb2RlPiAmIzg1OTQ7CiAgICAgIDxjb2RlPnN0cmluZzwvY29kZT48L2R0PjxkZD5SZXR1cm5zIHRoZSBjdXJyZW50IGNvbnRlbnQgb2YgdGhlCiAgICAgIGVkaXRvciwgYXMgYSBzdHJpbmcuPC9kZD4KCiAgICAgIDxkdD48Y29kZT5zZXRDb2RlKHN0cmluZyk8L2NvZGU+PC9kdD48ZGQ+UmVwbGFjZXMgdGhlIGN1cnJlbnQKICAgICAgY29udGVudCBvZiB0aGUgZWRpdG9yIHdpdGggdGhlIGdpdmVuIHZhbHVlLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+Zm9jdXMoKTwvY29kZT48L2R0PjxkZD5HaXZlcyBmb2N1cyB0byB0aGUgZWRpdG9yCiAgICAgIGZyYW1lLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+c2VsZWN0aW9uKCk8L2NvZGU+ICYjODU5NDsKICAgICAgPGNvZGU+c3RyaW5nPC9jb2RlPjwvZHQ+PGRkPlJldHVybnMgdGhlIHRleHQgdGhhdCBpcyBjdXJyZW50bHkKICAgICAgc2VsZWN0ZWQgaW4gdGhlIGVkaXRvci48L2RkPgoKICAgICAgPGR0Pjxjb2RlPnJlcGxhY2VTZWxlY3Rpb24oc3RyaW5nKTwvY29kZT48L2R0PjxkZD5SZXBsYWNlcyB0aGUKICAgICAgY3VycmVudGx5IHNlbGVjdGVkIHRleHQgd2l0aCB0aGUgZ2l2ZW4gc3RyaW5nLiBXaWxsIGFsc28gY2F1c2UKICAgICAgdGhlIGVkaXRvciBmcmFtZSB0byBnYWluIGZvY3VzLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+cmVpbmRlbnQoKTwvY29kZT48L2R0PjxkZD5BdXRvbWF0aWNhbGx5IHJlLWluZGVudCB0aGUKICAgICAgd2hvbGUgZG9jdW1lbnQuPC9kZD4KCiAgICAgIDxkdD48Y29kZT5yZWluZGVudFNlbGVjdGlvbigpPC9jb2RlPjwvZHQ+PGRkPkF1dG9tYXRpY2FsbHkKICAgICAgcmUtaW5kZW50IHRoZSBzZWxlY3RlZCBsaW5lcy48L2RkPgoKICAgICAgPGR0Pjxjb2RlPmdldFNlYXJjaEN1cnNvcihzdHJpbmcsIGF0Q3Vyc29yLCBjYXNlRm9sZCk8L2NvZGU+CiAgICAgICYjODU5NDsgPGNvZGU+Y3Vyc29yPC9jb2RlPjwvZHQ+PGRkPlRoZSBmaXJzdCBhcmd1bWVudCBpbmRpY2F0ZXMKICAgICAgdGhlIHN0cmluZyB0aGF0IHNob3VsZCBiZSBzZWFyY2hlZCBmb3IsIGFuZCB0aGUgc2Vjb25kIGluZGljYXRlcwogICAgICB3aGV0aGVyIHNlYXJjaGluZyBzaG91bGQgc3RhcnQgYXQgdGhlIGN1cnNvciAoPGNvZGU+dHJ1ZTwvY29kZT4pCiAgICAgIG9yIGF0IHRoZSBzdGFydCBvZiB0aGUgZG9jdW1lbnQgKDxjb2RlPmZhbHNlPC9jb2RlPikuIFdoZW4KICAgICAgPGNvZGU+Y2FzZUZvbGQ8L2NvZGU+IGlzIHRydWUsIHRoZSBzZWFyY2ggd2lsbCBiZQogICAgICBjYXNlLWluc2Vuc2l0aXZlOyBpZiA8Y29kZT5jYXNlRm9sZDwvY29kZT4gaXMgdW5zcGVjaWZpZWQsIHRoZQogICAgICBzZWFyY2ggd2lsbCBiZSBjYXNlLXNlbnNpdGl2ZSBpZiB0aGUgc2VhcmNoIHN0cmluZyBjb250YWlucwogICAgICB1cHBlcmNhc2UgY2hhcmFjdGVycy4gUmV0dXJucyBhbiBvYmplY3QgdGhhdCBwcm92aWRlcyBhbiBpbnRlcmZhY2UKICAgICAgZm9yIHNlYXJjaGluZy4gQ2FsbCBpdHMgPGNvZGU+ZmluZE5leHQoKTwvY29kZT4gbWV0aG9kIHRvIHNlYXJjaAogICAgICBmb3IgYW4gb2NjdXJyZW5jZSBvZiB0aGUgZ2l2ZW4gc3RyaW5nLiBUaGlzIHJldHVybnMKICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgc29tZXRoaW5nIGlzIGZvdW5kLCBvciA8Y29kZT5mYWxzZTwvY29kZT4KICAgICAgaWYgdGhlIGVuZCBvZiBkb2N1bWVudCBpcyByZWFjaGVkLiBXaGVuIGFuIG9jY3VycmVuY2UgaGFzIGJlZW4KICAgICAgZm91bmQsIHlvdSBjYW4gY2FsbCA8Y29kZT5zZWxlY3QoKTwvY29kZT4gdG8gc2VsZWN0IGl0LCBvcgogICAgICA8Y29kZT5yZXBsYWNlKHN0cmluZyk8L2NvZGU+IHRvIHJlcGxhY2UgaXQgd2l0aCBhIGdpdmVuIHN0cmluZy4KICAgICAgTm90ZSB0aGF0IGxldHRpbmcgdGhlIHVzZXIgY2hhbmdlIHRoZSBkb2N1bWVudCwgb3IKICAgICAgcHJvZ3JhbW1hdGljYWxseSBjaGFuZ2luZyBpdCBpbiBhbnkgd2F5IGV4Y2VwdCBmb3IgY2FsbGluZwogICAgICA8Y29kZT5yZXBsYWNlPC9jb2RlPiBvbiB0aGUgY3Vyc29yIGl0c2VsZiwgbWlnaHQgY2F1c2UgYSBjdXJzb3IKICAgICAgb2JqZWN0IHRvIHNraXAgYmFjayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkb2N1bWVudC48L2RkPgoKICAgICAgPGR0Pjxjb2RlPnVuZG8oKTwvY29kZT48L2R0PjxkZD5VbmRvIG9uZSBjaGFuZ2VzZXQsIGlmIGF2YWlsYWJsZS48L2RkPgogICAgICA8ZHQ+PGNvZGU+cmVkbygpPC9jb2RlPjwvZHQ+PGRkPlJlZG8gb25lIGNoYW5nZXNldCwgaWYgYXZhaWxhYmxlLjwvZGQ+CiAgICAgIDxkdD48Y29kZT5oaXN0b3J5U2l6ZSgpICYjODU5NDsgb2JqZWN0PC9jb2RlPjwvZHQ+PGRkPkdldCBhCiAgICAgIDxjb2RlPnt1bmRvLCByZWRvfTwvY29kZT4gb2JqZWN0IGhvbGRpbmcgdGhlIHNpemVzIG9mIHRoZSB1bmRvCiAgICAgIGFuZCByZWRvIGhpc3Rvcmllcy48L2RkPgogICAgICA8ZHQ+PGNvZGU+Y2xlYXJIaXN0b3J5KCk8L2NvZGU+PC9kdD48ZGQ+RHJvcCBhbGwgaGlzdG9yeQogICAgICBpbmZvcm1hdGlvbi48L2RkPgoKICAgICAgPGR0Pjxjb2RlPmdyYWJLZXlzKGNhbGxiYWNrLCBmaWx0ZXIpPC9jb2RlPjwvZHQ+PGRkPlJvdXRlCiAgICAgIGtleWJvYXJkIGlucHV0IGluIHRoZSBlZGl0b3IgdG8gYSBjYWxsYmFjayBmdW5jdGlvbi4gVGhpcwogICAgICBmdW5jdGlvbiBpcyBnaXZlbiBhIHNsaWdodGx5IG5vcm1hbGlzZWQgKHNlZQogICAgICA8Y29kZT5ub3JtYWxpemVFdmVudDwvY29kZT4gaW4gPGEKICAgICAgaHJlZj0ianMvdXRpbC5qcyI+PGNvZGU+dXRpbC5qczwvY29kZT48L2E+KSA8Y29kZT5rZXlkb3duPC9jb2RlPgogICAgICBldmVudCBvYmplY3QuIElmIGEgc2Vjb25kIGFyZ3VtZW50IGlzIGdpdmVuLCB0aGlzIHdpbGwgYmUgdXNlZAogICAgICB0byBkZXRlcm1pbmUgd2hpY2ggZXZlbnRzIHRvIGFwcGx5IHRoZSBjYWxsYmFjayB0by4gSXQgc2hvdWxkCiAgICAgIHRha2UgYSBrZXkgY29kZSAoYXMgaW4gPGNvZGU+ZXZlbnQua2V5Q29kZTwvY29kZT4pLCBhbmQgcmV0dXJuIGEKICAgICAgYm9vbGVhbiwgd2hlcmUgPGNvZGU+dHJ1ZTwvY29kZT4gbWVhbnMgdGhlIGV2ZW50IHNob3VsZCBiZQogICAgICByb3V0ZWQgdG8gdGhlIGNhbGxiYWNrLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGxlYXZlcyB0aGUga2V5IHRvCiAgICAgIHBlcmZvcm0gaXRzIG5vcm1hbCBiZWhhdmlvdXIuPC9kZD4KICAgICAgPGR0Pjxjb2RlPnVuZ3JhYktleXMoKTwvY29kZT48L2R0PjxkZD5SZXZlcnQgdGhlIGVmZmVjdCBvZgogICAgICA8Y29kZT5ncmFiS2V5czwvY29kZT4uPC9kZD4KCiAgICAgIDxkdD48Y29kZT5zZXRQYXJzZXIobmFtZSwgcGFyc2VyQ29uZmlnKTwvY29kZT48L2R0PjxkZD5DaGFuZ2UKICAgICAgdGhlIGFjdGl2ZSBwYXJzZXIuIFRvIHVzZSB0aGlzIHlvdSdsbCBoYXZlIHRvIGxvYWQgbW9yZSB0aGFuIG9uZQogICAgICBwYXJzZXIgKHB1dCB0aGUgb25lIHlvdSB3YW50IHRvIHVzZSBhcyBkZWZhdWx0IGF0IHRoZSBlbmQgb2YgdGhlCiAgICAgIGxpc3QpLiBUaGVuIGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUKICAgICAgb2YgdGhlIHBhcnNlciB5b3Ugd2FudCB0byBzd2l0Y2ggdG8gKHNlZSB0aGUgcGFyc2VyIHNjcmlwdCBmaWxlCiAgICAgIHRvIGZpbmQgdGhlIG5hbWUsIGl0J2xsIGJlIHNvbWV0aGluZyBsaWtlCiAgICAgIDxjb2RlPkNTU1BhcnNlcjwvY29kZT4pLiBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIG9wdGlvbmFsLCBhbmQKICAgICAgY2FuIGJlIHVzZWQgdG8gcGFzcyBhIG5ldyBwYXJzZXIgY29uZmlndXJhdGlvbiBvYmplY3QuPC9kZD4KICAgIDwvZGw+CgogICAgPHA+Rm9yIGRldGFpbGVkIGludGVyYWN0aW9uIHdpdGggdGhlIGNvbnRlbnQgb2YgdGhlIGVkaXRvciwKICAgIENvZGVNaXJyb3IgZXhwb3NlcyBhIGxpbmUtb3JpZW50ZWQgaW50ZXJmYWNlLCB3aGljaCBhbGxvd3MgeW91IHRvCiAgICBpbnNwZWN0IGFuZCBtYW5pcHVsYXRlIHRoZSBkb2N1bWVudCBsaW5lIGJ5IGxpbmUuIExpbmUgaGFuZGxlcwogICAgc2hvdWxkIGJlIGNvbnNpZGVyZWQgb3BhcXVlICh0aGV5IGFyZSBpbiBmYWN0IHRoZSA8Y29kZT5CUjwvY29kZT4KICAgIG5vZGVzIGF0IHRoZSBzdGFydCBvZiB0aGUgbGluZSksIGV4Y2VwdCB0aGF0IHRoZSB2YWx1ZQogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IChidXQgPGVtPm5vdDwvZW0+IDxjb2RlPm51bGw8L2NvZGU+KSBhbHdheXMKICAgIGRlbm90ZXMgYW4gaW52YWxpZCB2YWx1ZS4gU2luY2UgY2hhbmdpbmcgdGhlIGRvY3VtZW50IG1pZ2h0IGNhdXNlCiAgICBzb21lIGxpbmUgaGFuZGxlcyB0byBiZWNvbWUgaW52YWxpZCwgZXZlcnkgZnVuY3Rpb24gdGhhdCB0YWtlcwogICAgdGhlbSBhcyBhcmd1bWVudCBjYW4gdGhyb3cKICAgIDxjb2RlPkNvZGVNaXJyb3IuSW52YWxpZExpbmVIYW5kbGU8L2NvZGU+LiBUaGVzZSBhcmUgdGhlIHJlbGV2YW50CiAgICBtZXRob2RzOjwvcD4KCiAgICA8ZGw+CiAgICAgIDxkdD48Y29kZT5jdXJzb3JQb3NpdGlvbihzdGFydCk8L2NvZGU+ICYjODU5NDsKICAgICAgPGNvZGU+b2JqZWN0PC9jb2RlPjwvZHQ+PGRkPlJldHJpZXZlIGEgPGNvZGU+e2xpbmUsCiAgICAgIGNoYXJhY3Rlcn08L2NvZGU+IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGN1cnNvciBwb3NpdGlvbi4KICAgICAgPGNvZGU+c3RhcnQ8L2NvZGU+IGRlZmF1bHRzIHRvIDxjb2RlPnRydWU8L2NvZGU+IGFuZCBkZXRlcm1pbmVzCiAgICAgIGlmIHRoZSBzdGFydHBvaW50IG9yIHRoZSBlbmRwb2ludCBvZiB0aGUgc2VsZWN0aW9uIGlzIHVzZWQuPC9kZD4KICAgICAgPGR0Pjxjb2RlPmN1cnNvckxpbmUoKTwvY29kZT4gJiM4NTk0OwogICAgICA8Y29kZT5oYW5kbGU8L2NvZGU+PC9kdD48ZGQ+UmV0dXJucyB0aGUgbGluZSBvbiB3aGljaCB0aGUgY3Vyc29yCiAgICAgIGlzIGN1cnJlbnRseSBzaXR0aW5nLjwvZGQ+CiAgICAgIDxkdD48Y29kZT5maXJzdExpbmUoKTwvY29kZT4gJiM4NTk0OwogICAgICA8Y29kZT5oYW5kbGU8L2NvZGU+PC9kdD48ZGQ+R2V0IHRoZSBmaXJzdCBsaW5lIG9mIHRoZQogICAgICBkb2N1bWVudC48L2RkPgogICAgICA8ZHQ+PGNvZGU+bGFzdExpbmUoKTwvY29kZT4gJiM4NTk0OwogICAgICA8Y29kZT5oYW5kbGU8L2NvZGU+PC9kdD48ZGQ+VGhlIGxhc3QgbGluZS48L2RkPgogICAgICA8ZHQ+PGNvZGU+bmV4dExpbmUoaGFuZGxlKTwvY29kZT4gJiM4NTk0OwogICAgICA8Y29kZT5oYW5kbGU8L2NvZGU+PC9kdD48ZGQ+R2V0IHRoZSBsaW5lIGFmdGVyIHRoZSBnaXZlbiBvbmUsIG9yCiAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGF0IHdhcyB0aGUgbGFzdCBsaW5lLjwvZGQ+CiAgICAgIDxkdD48Y29kZT5wcmV2TGluZShoYW5kbGUpPC9jb2RlPiAmIzg1OTQ7CiAgICAgIDxjb2RlPmhhbmRsZTwvY29kZT48L2R0PjxkZD5GaW5kIHRoZSBsaW5lIGJlZm9yZSB0aGUgZ2l2ZW4gb25lLAogICAgICByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoYXQgd2FzIHRoZSBmaXJzdCBsaW5lLjwvZGQ+CiAgICAgIDxkdD48Y29kZT5udGhMaW5lKG51bWJlcik8L2NvZGU+ICYjODU5NDsKICAgICAgPGNvZGU+aGFuZGxlPC9jb2RlPjwvZHQ+PGRkPkZpbmQgdGhlIE50aCBsaW5lIG9mIHRoZSBkb2N1bWVudC4KICAgICAgTm90ZSB0aGF0IHRoZSBmaXJzdCBsaW5lIGNvdW50cyBhcyBvbmUsIG5vdCB6ZXJvLiBSZXR1cm5zCiAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBzdWNoIGxpbmUuPC9kZD4KICAgICAgPGR0Pjxjb2RlPmxpbmVDb250ZW50KGhhbmRsZSk8L2NvZGU+ICYjODU5NDsKICAgICAgPGNvZGU+c3RyaW5nPC9jb2RlPjwvZHQ+PGRkPlJldHJpZXZlIHRoZSBjb250ZW50IG9mIHRoZQogICAgICBsaW5lLjwvZGQ+CiAgICAgIDxkdD48Y29kZT5zZXRMaW5lQ29udGVudChoYW5kbGUsIHN0cmluZyk8L2NvZGU+PC9kdD48ZGQ+UmVwbGFjZQogICAgICB0aGUgY29udGVudCBvZiB0aGUgbGluZSB3aXRoIHRoZSBnaXZlbiBzdHJpbmcuPC9kZD4KICAgICAgPGR0Pjxjb2RlPnJlbW92ZUxpbmUoaGFuZGxlKTwvY29kZT48L2R0PjxkZD5SZW1vdmUgdGhlIGdpdmVuCiAgICAgIGxpbmUgZnJvbSB0aGUgZWRpdG9yLiBUaGUgaGFuZGxlIHdpbGwgc3RheSB2YWxpZCBhZnRlciB0aGlzCiAgICAgIG9wZXJhdGlvbiwgYW5kIG5vdyByZWZlcnMgdG8gdGhlIG5leHQgbGluZS48L2RkPgogICAgICA8ZHQ+PGNvZGU+bGluZU51bWJlcihoYW5kbGUpPC9jb2RlPiAmIzg1OTQ7CiAgICAgIDxjb2RlPm51bWJlcjwvY29kZT48L2R0PjxkZD5Bc2sgd2hpY2ggbGluZSBvZiB0aGUgZG9jdW1lbnQKICAgICAgKDEtYmFzZWQpIHRoZSBnaXZlbiBsaW5lIGlzLjwvZGQ+CiAgICAgIDxkdD48Y29kZT5qdW1wVG9MaW5lKGhhbmRsZSk8L2NvZGU+PC9kdD48ZGQ+TW92ZXMgdGhlIGN1cnNvciB0bwogICAgICB0aGUgc3RhcnQgb2YgdGhlIGdpdmVuIGxpbmUuPC9kZD4KICAgICAgPGR0Pjxjb2RlPnNlbGVjdExpbmVzKHN0YXJ0SGFuZGxlLCBzdGFydE9mZnNldCwKICAgICAgZW5kSGFuZGxlLCBlbmRPZmZzZXQpPC9jb2RlPjwvZHQ+PGRkPk1vdmUgdGhlIHNlbGVjdGlvbiB0byBhCiAgICAgIHNwZWNpZmljIHBvaW50LiA8Y29kZT5lbmRIYW5kbGU8L2NvZGU+IGFuZAogICAgICA8Y29kZT5lbmRPZmZzZXQ8L2NvZGU+IGNhbiBiZSBvbWl0dGVkIHRvIGp1c3QgcGxhY2UgdGhlIGN1cnNvcgogICAgICBzb21ld2hlcmUgd2l0aG91dCBzZWxlY3RpbmcgYW55IHRleHQuPC9kZD4KICAgICAgPGR0Pjxjb2RlPmluc2VydEludG9MaW5lKGhhbmRsZSwgcG9zaXRpb24sCiAgICAgIHRleHQpPC9jb2RlPjwvZHQ+PGRkPkluc2VydCBhIHBpZWNlIG9mIHRleHQgaW50byBhIGxpbmUuCiAgICAgIDxjb2RlPnBvc2l0aW9uPC9jb2RlPiBjYW4gYmUgYW4gaW50ZWdlciwgc3BlY2lmeWluZyB0aGUgcG9zaXRpb24KICAgICAgaW4gdGhlIGxpbmUgd2hlcmUgdGhlIHRleHQgc2hvdWxkIGJlIGluc2VydGVkLCBvciB0aGUgc3RyaW5nCiAgICAgIDxjb2RlPiJlbmQiPC9jb2RlPiwgZm9yIHRoZSBlbmQgb2YgdGhlIGxpbmUuPC9kZD4KICAgIDwvZGw+CgogICAgPGgyIGlkPSJ3cml0ZXBhcnNlciI+V3JpdGluZyBhIFBhcnNlcjwvaDI+CgogICAgPHA+QSBwYXJzZXIgaXMgaW1wbGVtZW50ZWQgYnkgb25lIG9yIG1vcmUgZmlsZXMgKHNlZQogICAgPGNvZGU+cGFyc2VyZmlsZTwvY29kZT4gYWJvdmUpIHdoaWNoLCB3aGVuIGxvYWRlZCwgYWRkIGEKICAgIDxjb2RlPlBhcnNlcjwvY29kZT4gcHJvcGVydHkgdG8gdGhlIDxjb2RlPkVkaXRvcjwvY29kZT4gb2JqZWN0CiAgICBkZWZpbmVkIGJ5IDxhIGhyZWY9ImpzL2VkaXRvci5qcyI+PGNvZGU+ZWRpdG9yLmpzPC9jb2RlPjwvYT4uIFRoaXMKICAgIG9iamVjdCBtdXN0IHN1cHBvcnQgdGhlIGZvbGxvd2luZyBpbnRlcmZhY2U6PC9wPgoKICAgIDxkbD4KCiAgICAgIDxkdD48Y29kZT5tYWtlKHN0cmVhbSk8L2NvZGU+PC9kdD48ZGQ+QSBmdW5jdGlvbiB0aGF0LCBnaXZlbiBhCiAgICAgIHN0cmluZyBzdHJlYW0gKHNlZSA8YQogICAgICBocmVmPSJqcy9zdHJpbmdzdHJlYW0uanMiPjxjb2RlPnN0cmluZ3N0cmVhbS5qczwvY29kZT48L2E+KSwKICAgICAgY3JlYXRlcyBhIHBhcnNlci4gVGhlIGJlaGF2aW91ciBvZiB0aGlzIHBhcnNlciBpcyBkZXNjcmliZWQKICAgICAgYmVsb3cuPC9kZD4KCiAgICAgIDxkdD48Y29kZT5lbGVjdHJpY0NoYXJzPC9jb2RlPjwvZHQ+PGRkPkFuIG9wdGlvbmFsIHN0cmluZwogICAgICBjb250YWluaW5nIHRoZSBjaGFyYWN0ZXJzIHRoYXQsIHdoZW4gdHlwZWQsIHNob3VsZCBjYXVzZSB0aGUKICAgICAgaW5kZW50YXRpb24gb2YgdGhlIGN1cnJlbnQgbGluZSB0byBiZSByZWNvbXB1dGVkIChmb3IgZXhhbXBsZQogICAgICA8Y29kZT4ie30iPC9jb2RlPiBmb3IgYy1saWtlIGxhbmd1YWdlcykuPC9kZD4KCiAgICAgIDxkdD48Y29kZT5jb25maWd1cmUob2JqZWN0KTwvY29kZT48L2R0PjxkZD5BbiBvcHRpb25hbCBmdW5jdGlvbgogICAgICB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgcGFyc2VyLiBJZiBpdCBleGlzdHMsIGFuZCBhbgogICAgICBlZGl0b3IgaXMgZ2l2ZW4gYSA8Y29kZT5wYXJzZXJDb25maWc8L2NvZGU+IG9wdGlvbiwgaXQgd2lsbCBiZQogICAgICBjYWxsZWQgd2l0aCB0aGUgdmFsdWUgb2YgdGhhdCBvcHRpb24uPC9kZD4KCiAgICAgIDxkdD48Y29kZT5maXJzdEluZGVudGF0aW9uKGNoYXJzLCBjdXJyZW50LAogICAgICBkaXJlY3Rpb24pPC9jb2RlPjwvZHQ+PGRkPkFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgaXMgdXNlZCB0bwogICAgICBkZXRlcm1pbmUgdGhlIHByb3BlciBpbmRlbnRhdGlvbiBvZiB0aGUgZmlyc3QgbGluZSBvZiBhCiAgICAgIGRvY3VtZW50LiBXaGVuIG5vdCBwcm92aWRlZCwgPGNvZGU+MDwvY29kZT4gaXMgdXNlZC48L2RkPgogICAgPC9kbD4KCiAgICA8cD5XaGVuIHRoZSA8Y29kZT5tYWtlPC9jb2RlPiBtZXRob2QgaXMgY2FsbGVkIHdpdGggYSBzdHJpbmcKICAgIHN0cmVhbSwgaXQgc2hvdWxkIHJldHVybiBhIE1vY2hpS2l0LXN0eWxlIGl0ZXJhdG9yOiBhbiBvYmplY3Qgd2l0aAogICAgYSA8Y29kZT5uZXh0PC9jb2RlPiBtZXRob2QsIHdoaWNoIHdpbGwgcmFpc2UKICAgIDxjb2RlPlN0b3BJdGVyYXRpb248L2NvZGU+IHdoZW4gaXQgaXMgYXQgaXRzIGVuZCAoc2VlIDxhCiAgICBocmVmPSJodHRwOi8vYm9iLnB5dGhvbm1hYy5vcmcvYXJjaGl2ZXMvMjAwNS8wNy8wNi9pdGVyYXRpb24taW4tamF2YXNjcmlwdC8iPnRoaXM8L2E+CiAgICBmb3IgZGV0YWlscykuIFRoaXMgaXRlcmF0b3IsIHdoZW4gY2FsbGVkLCB3aWxsIGNvbnN1bWUgaW5wdXQgZnJvbQogICAgdGhlIHN0cmluZyBzdHJlYW0sIGFuZCBwcm9kdWNlIGEgdG9rZW4gb2JqZWN0LjwvcD4KCiAgICA8cD5Ub2tlbiBvYmplY3RzIHJlcHJlc2VudCBhIHNpbmdsZSBzaWduaWZpY2FudCBwaWVjZSBvZiB0aGUgdGV4dAogICAgdGhhdCBpcyBiZWluZyBlZGl0ZWQuIEEgdG9rZW4gb2JqZWN0IG11c3QgaGF2ZSBhCiAgICA8Y29kZT52YWx1ZTwvY29kZT4gcHJvcGVydHkgaG9sZGluZyB0aGUgdGV4dCBpdCBzdGFuZHMgZm9yLCBhbmQgYQogICAgPGNvZGU+c3R5bGU8L2NvZGU+IHByb3BlcnR5IHdpdGggdGhlIENTUyBjbGFzcyB0aGF0IHNob3VsZCBiZSB1c2VkCiAgICB0byBjb2xvdXIgdGhpcyBlbGVtZW50LiBUaGlzIGNhbiBiZSBhbnl0aGluZywgZXhjZXB0IHRoYXQgYW55CiAgICB3aGl0ZXNwYWNlIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUgc2hvdWxkIDxlbT5hbHdheXM8L2VtPiBoYXZlCiAgICBjbGFzcyA8Y29kZT4id2hpdGVzcGFjZSI8L2NvZGU+OiBUaGUgZWRpdG9yIG11c3QgYmUgYWJsZSB0bwogICAgcmVjb2duaXplIHRoZXNlIHdoZW4gaXQgaW5kZW50cyBsaW5lcy4gRnVydGhlcm1vcmUsIGVhY2ggbmV3bGluZQogICAgY2hhcmFjdGVyIDxlbT5tdXN0PC9lbT4gaGF2ZSBpdHMgb3duIHNlcGFyYXRlIHRva2VuLCB3aGljaCBoYXMgYW4KICAgIDxjb2RlPmluZGVudGF0aW9uPC9jb2RlPiBwcm9wZXJ0eSBob2xkaW5nIGEgZnVuY3Rpb24gdGhhdCBjYW4gYmUKICAgIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBwcm9wZXIgaW5kZW50YXRpb24gbGV2ZWwgZm9yIHRoZSBuZXh0IGxpbmUuCiAgICBUaGlzIGZ1bmN0aW9uIG9wdGlvbmFsbHkgdGFrZXMgdGhlIHRleHQgaW4gdGhlIGZpcnN0IHRva2VuIG9mIHRoZQogICAgbmV4dCBsaW5lLCB0aGUgY3VycmVudCBpbmRlbnRhdGlvbiBvZiB0aGUgbGluZSwgYW5kIHRoZQogICAgJ2RpcmVjdGlvbicgb2YgdGhlIGluZGVudGF0aW9uIGFzIGFyZ3VtZW50cywgd2hpY2ggaXQgY2FuIHVzZSB0bwogICAgYWRqdXN0IHRoZSBpbmRlbnRhdGlvbiBsZXZlbC4gVGhlIGRpcmVjdGlvbiBhcmd1bWVudCBpcyBvbmx5CiAgICB1c2VmdWwgZm9yIG1vZGVzIGluIHdoaWNoIGxpbmVzIGRvIG5vdCBoYXZlIGEgZml4ZWQgaW5kZW50YXRpb24sCiAgICBhbmQgY2FuIGJlIG1vZGlmaWVkIGJ5IG11bHRpcGxlIHRhYiBwcmVzc2VzLiBJdCBpcwogICAgPGNvZGU+bnVsbDwvY29kZT4gZm9yICdkZWZhdWx0JyBpbmRlbnRhdGlvbnMgKGxpa2Ugd2hhdCBoYXBwZW5zCiAgICB3aGVuIHRoZSB1c2VyIHByZXNzZXMgZW50ZXIpLCA8Y29kZT50cnVlPC9jb2RlPiBmb3IgcmVndWxhciB0YWIKICAgIHByZXNzZXMsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gZm9yIGNvbnRyb2wtdGFiIG9yIHNoaWZ0LXRhYi48L3A+CgogICAgPHA+U28gZmFyIHRoaXMgc2hvdWxkIGJlIHByZXR0eSBlYXN5LiBUaGUgaGFyZCBwYXJ0IGlzIHRoYXQgdGhpcwogICAgaXRlcmF0b3IgbXVzdCBhbHNvIGhhdmUgYSA8Y29kZT5jb3B5PC9jb2RlPiBtZXRob2QuIFRoaXMgbWV0aG9kLAogICAgY2FsbGVkIHdpdGhvdXQgYXJndW1lbnRzLCByZXR1cm5zIGEgZnVuY3Rpb24gcmVwcmVzZW50aW5nIHRoZQogICAgY3VycmVudCBzdGF0ZSBvZiB0aGUgcGFyc2VyLiBXaGVuIHRoaXMgc3RhdGUgZnVuY3Rpb24gaXMgbGF0ZXIKICAgIGNhbGxlZCB3aXRoIGEgc3RyaW5nIHN0cmVhbSBhcyBpdHMgYXJndW1lbnQsIGl0IHJldHVybnMgYSBwYXJzZXIKICAgIG9iamVjdCB0aGF0IHJlc3VtZXMgcGFyc2luZyB1c2luZyB0aGUgb2xkIHN0YXRlIGFuZCB0aGUgbmV3IGlucHV0CiAgICBzdHJlYW0uIEl0IG1heSBhc3N1bWUgdGhhdCBvbmx5IG9uZSBwYXJzZXIgaXMgYWN0aXZlIGF0IGEgdGltZSwKICAgIGFuZCBjYW4gY2xvYmJlciB0aGUgc3RhdGUgb2YgdGhlIG9sZCBwYXJzZXIgaWYgaXQgd2FudHMuPC9wPgoKICAgIDxwPkZvciBleGFtcGxlcywgc2VlIDxhCiAgICBocmVmPSJqcy9wYXJzZWphdmFzY3JpcHQuanMiPjxjb2RlPnBhcnNlamF2YXNjcmlwdC5qczwvY29kZT48L2E+LAogICAgPGEgaHJlZj0ianMvcGFyc2V4bWwuanMiPjxjb2RlPnBhcnNleG1sLmpzPC9jb2RlPjwvYT4sIGFuZCA8YQogICAgaHJlZj0ianMvcGFyc2Vjc3MuanMiPjxjb2RlPnBhcnNlY3NzLmpzPC9jb2RlPjwvYT4uPC9wPgoKICA8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror/mixedtest.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHNjcmlwdCBzcmM9ImpzL2NvZGVtaXJyb3IuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgICA8dGl0bGU+Q29kZU1pcnJvcjogSFRNTCBtaXhlZC1tb2RlIGRlbW9uc3RyYXRpb248L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iY3NzL2RvY3MuY3NzIi8+CiAgPC9oZWFkPgogIDxib2R5IHN0eWxlPSJwYWRkaW5nOiAyMHB4OyI+Cgo8cD5UaGlzIGlzIGEgc2ltcGxlIGRlbW9uc3RyYXRpb24gb2YgdGhlIEhUTUwgbWl4ZWQtbW9kZSBpbmRlbnRhdGlvbgptb2R1bGUgZm9yIDxhIGhyZWY9ImluZGV4Lmh0bWwiPkNvZGVNaXJyb3I8L2E+LiBTY3JpcHQgdGFncyB1c2UgdGhlIEpTCnBhcnNlciwgc3R5bGUgdGFncyB1c2UgdGhlIENTUyBwYXJzZXIuPC9wPgoKPGRpdiBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7IHBhZGRpbmc6IDNweDsiPgo8dGV4dGFyZWEgaWQ9ImNvZGUiIGNvbHM9IjEyMCIgcm93cz0iMzAiPgombHQ7aHRtbD4KICAmbHQ7aGVhZD4KICAgICZsdDt0aXRsZT5IVE1MIEV4YW1wbGUmbHQ7L3RpdGxlPgogICAgJmx0O3NjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogICAgICBmdW5jdGlvbiBmb28oYmFyLCBiYXopIHsKICAgICAgICBhbGVydCgicXV1eCIpOwogICAgICAgIHJldHVybiBiYXIgKyBiYXogKyAxOwogICAgICB9CiAgICAmbHQ7L3NjcmlwdD4KICAgICZsdDtzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIGRpdi5ib3JkZXIgewogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOwogICAgICAgIHBhZGRpbmc6IDNweDsKICAgICAgfQogICAgICAjZm9vIGNvZGUgewogICAgICAgIGZvbnQtZmFtaWx5OiBjb3VyaWVyLCBtb25vc3BhY2U7CiAgICAgICAgZm9udC1zaXplOiA4MCU7CiAgICAgICAgY29sb3I6ICM0NDg4ODg7CiAgICAgIH0KICAgICZsdDsvc3R5bGU+CiAgJmx0Oy9oZWFkPgogICZsdDtib2R5PgogICAgJmx0O3A+RHVoJmx0Oy9wPgogICZsdDsvYm9keT4KJmx0Oy9odG1sPgo8L3RleHRhcmVhPgo8L2Rpdj4KCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoJ2NvZGUnLCB7CiAgICBoZWlnaHQ6ICIzNTBweCIsCiAgICBwYXJzZXJmaWxlOiBbInBhcnNleG1sLmpzIiwgInBhcnNlY3NzLmpzIiwgInRva2VuaXplamF2YXNjcmlwdC5qcyIsICJwYXJzZWphdmFzY3JpcHQuanMiLCAicGFyc2VodG1sbWl4ZWQuanMiXSwKICAgIHN0eWxlc2hlZXQ6IFsiY3NzL3htbGNvbG9ycy5jc3MiLCAiY3NzL2pzY29sb3JzLmNzcyIsICJjc3MvY3NzY29sb3JzLmNzcyJdLAogICAgcGF0aDogImpzLyIKICB9KTsKPC9zY3JpcHQ+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror/sparqltest.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHNjcmlwdCBzcmM9ImpzL2NvZGVtaXJyb3IuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgICA8dGl0bGU+Q29kZU1pcnJvcjogU3BhcnFsIGRlbW9uc3RyYXRpb248L3RpdGxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iY3NzL2RvY3MuY3NzIi8+CiAgPC9oZWFkPgogIDxib2R5IHN0eWxlPSJwYWRkaW5nOiAyMHB4OyI+Cgo8cD5EZW1vbnN0cmF0aW9uIG9mIDxhIGhyZWY9ImluZGV4Lmh0bWwiPkNvZGVNaXJyb3I8L2E+J3MgU3BhcnFsCmhpZ2hsaWdodGVyLjwvcD4KCjxkaXYgY2xhc3M9ImJvcmRlciI+Cjx0ZXh0YXJlYSBpZD0iY29kZSIgY29scz0iMTIwIiByb3dzPSIzMCI+ClBSRUZJWCBhOiAmbHQ7aHR0cDovL3d3dy53My5vcmcvMjAwMC8xMC9hbm5vdGF0aW9uLW5zIz4KUFJFRklYIGRjOiAmbHQ7aHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8+ClBSRUZJWCBmb2FmOiAmbHQ7aHR0cDovL3htbG5zLmNvbS9mb2FmLzAuMS8+CgojIENvbW1lbnQhCgpTRUxFQ1QgP2dpdmVuID9mYW1pbHkKV0hFUkUgewogID9hbm5vdCBhOmFubm90YXRlcyAmbHQ7aHR0cDovL3d3dy53My5vcmcvVFIvcmRmLXNwYXJxbC1xdWVyeS8+IC4KICA/YW5ub3QgZGM6Y3JlYXRvciA/YyAuCiAgT1BUSU9OQUwgez9jIGZvYWY6Z2l2ZW4gP2dpdmVuIDsKICAgICAgICAgICAgICAgZm9hZjpmYW1pbHkgP2ZhbWlseSB9IC4KICBGSUxURVIgaXNCbGFuayg/YykKfQo8L3RleHRhcmVhPgo8L2Rpdj4KCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoJ2NvZGUnLCB7CiAgICBoZWlnaHQ6ICIyNTBweCIsCiAgICBwYXJzZXJmaWxlOiAicGFyc2VzcGFycWwuanMiLAogICAgc3R5bGVzaGVldDogImNzcy9zcGFycWxjb2xvcnMuY3NzIiwKICAgIHBhdGg6ICJqcy8iCiAgfSk7Cjwvc2NyaXB0PgoKICA8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror/story.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogIDxoZWFkPgogICAgPHRpdGxlPkltcGxlbWVudGluZyBhIHN5bnRheC1oaWdsaWdodGluZyBKYXZhU2NyaXB0IGVkaXRvciBpbiBKYXZhU2NyaXB0PC90aXRsZT4KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIGJvZHkgewogICAgICAgIHBhZGRpbmc6IDNlbSA2ZW07CiAgICAgICAgbWF4LXdpZHRoOiA1MGVtOwogICAgICB9CiAgICAgIGgxIHsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CiAgICAgIGgyIHsKICAgICAgICBmb250LXNpemU6IDEzMCU7CiAgICAgIH0KICAgICAgY29kZSB7CiAgICAgICAgZm9udC1mYW1pbHk6IGNvdXJpZXIsIG1vbm9zcGFjZTsKICAgICAgICBmb250LXNpemU6IDgwJTsKICAgICAgICBjb2xvcjogIzE0NDsKICAgICAgfQogICAgICBwIHsKICAgICAgICBtYXJnaW46IDFlbSAwOwogICAgICB9CiAgICAgIHByZS5jb2RlIHsKICAgICAgICBtaW4td2lkdGg6IDU1ZW07CiAgICAgICAgbWFyZ2luOiAxLjFlbSAxMnB4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNDQ0NDQ0M7CiAgICAgICAgcGFkZGluZzogLjRlbTsKICAgICAgICBmb250LWZhbWlseTogY291cmllciwgbW9ub3NwYWNlOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iY3NzL2pzY29sb3JzLmNzcyIvPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxoMSBzdHlsZT0iZm9udC1zaXplOiAxODAlOyI+SW1wbGVtZW50aW5nIGEgc3ludGF4LWhpZ2xpZ2h0aW5nIEphdmFTY3JpcHQgZWRpdG9yIGluIEphdmFTY3JpcHQ8L2gxPgogICAgPGgxIHN0eWxlPSJmb250LXNpemU6IDExMCU7Ij5vcjwvaDE+CiAgICA8aDEgc3R5bGU9ImZvbnQtc2l6ZTogMTMwJTsgbWFyZ2luLWJvdHRvbTogM2VtOyI+QSBicnV0YWwgb2R5c3NleSB0byB0aGUgZGFyayBzaWRlIG9mIHRoZSBET00gdHJlZTwvaDE+CgogICAgPHAgc3R5bGU9ImZvbnQtc2l6ZTogODAlIj4KICAgICAgPGI+VG9waWM8L2I+OiBKYXZhU2NyaXB0LCBhZHZhbmNlZCBicm93c2VyIHdlaXJkbmVzcywgY29vbCBwcm9ncmFtbWluZyB0ZWNobmlxdWVzPGJyLz4KICAgICAgPGI+QXVkaWVuY2U8L2I+OiBQcm9ncmFtbWVycywgZXNwZWNpYWxseSBKYXZhU2NyaXB0IHByb2dyYW1tZXJzPGJyLz4KICAgICAgPGI+QXV0aG9yPC9iPjogTWFyaWpuIEhhdmVyYmVrZTxici8+CiAgICAgIDxiPkRhdGU8L2I+OiBNYXkgMjR0aCAyMDA3CiAgICA8L3A+CgogICAgPHAgc3R5bGU9ImNvbG9yOiAjODExOyBmb250LXNpemU6IDkwJTsgZm9udC1zdHlsZTogaXRhbGljIj5Ob3RlOiBzb21lIG9mIHRoZSBkZXRhaWxzIGdpdmVuIGhlcmUgbm8KICAgIGxvbmdlciBhcHBseSB0byB0aGUgY3VycmVudCA8YQogICAgaHJlZj0iaHR0cDovL21hcmlqbi5oYXZlcmJla2UubmwvY29kZW1pcnJvciI+Q29kZU1pcnJvcjwvYT4KICAgIGNvZGViYXNlLCB3aGljaCBoYXMgZXZvbHZlZCBxdWl0ZSBhIGJpdCBpbiB0aGUgbWVhbnRpbWUuPC9wPgoKICAgIDxwPkluIG9uZSBvZiBoaXMgKHZlcnkgaW5mb3JtYXRpdmUpIDxhCiAgICBocmVmPSJodHRwOi8vd3d3LmxlYXJud2ViZGVzaWdub25saW5lLmNvbS92aWRlb3MvcHJvZ3JhbW1pbmcvamF2YXNjcmlwdC95YWhvby1kb3VnbGFzLWNyb2NrZm9yZCI+dmlkZW8KICAgIGxlY3R1cmVzPC9hPiwgRG91Z2xhcyBDcm9ja2ZvcmQgcmVtYXJrcyB0aGF0IHdyaXRpbmcgSmF2YVNjcmlwdAogICAgZm9yIHRoZSB3ZWIgaXMgJ3Byb2dyYW1taW5nIGluIGEgaG9zdGlsZSBlbnZpcm9ubWVudCcuIEkgaGFkIGRvbmUKICAgIG15IGZhaXIgc2hhcmUgb2Ygd2VpcmQgd29ya2Fyb3VuZHMsIGFuZCBldmVuIG9jY2Fzb25hbGx5IGdhdmUgdXAKICAgIGFuIG9uIGlkZWEgZW50aXJlbHkgYmVjYXVzZSBicm93c2VycyBqdXN0IHdvdWxkbid0IHN1cHBvcnQgaXQsIGJ1dAogICAgYmVmb3JlIHRoaXMgcHJvamVjdCBJIG5ldmVyIHJlYWxseSByZWFsaXplZCBqdXN0IGhvdyBwb3dlcmxlc3MgYQogICAgcHJvZ3JhbW1lciBjYW4gYmUgaW4gdGhlIGZhY2Ugb2YgYnVnZ3ksIGluY29tcGF0aWJsZSwgYW5kIHBvb3JseQogICAgZGVzaWduZWQgcGxhdGZvcm1zLjwvcD4KCiAgICA8cD5UaGUgcGxhbiB3YXMgbm90IHJpZGljdWxvdXNseSBhbWJpdGlvdXMuIEkgd2FudGVkIHRvICdlbmhhbmNlJyBhCiAgICB0ZXh0YXJlYSB0byB0aGUgcG9pbnQgd2hlcmUgd3JpdGluZyBjb2RlIGluIGl0IGlzIHBsZWFzYW50LiBUaGlzIG1lYW50CiAgICBhdXRvbWF0aWMgaW5kZW50YXRpb24gYW5kLCBpZiBwb3NzaWJsZSBhdCBhbGwsIHN5bnRheCBoaWdobGlnaHRpbmcuPC9wPgoKICAgIDxwPkluIHRoaXMgZG9jdW1lbnQgSSBkZXNjcmliZSB0aGUgc3Rvcnkgb2YgaW1wbGVtZW50aW5nIHRoaXMsIGZvciB5b3VyCiAgICBlZHVjYXRpb24gYW5kIGFtdXNlbWVudC4gQSBkZW1vbnN0cmF0aW9uIG9mIHRoZSByZXN1bHRpbmcgcHJvZ3JhbSwKICAgIGFsb25nIHdpdGggdGhlIHNvdXJjZSBjb2RlLCBjYW4gYmUgZm91bmQgYXQgPGEKICAgIGhyZWY9Imh0dHA6Ly9tYXJpam4uaGF2ZXJiZWtlLm5sL2NvZGVtaXJyb3IiPm15IHdlYnNpdGU8L2E+LjwvcD4KCiAgICA8aDI+VGFrZSBvbmU6IE9ubHkgaW5kZW50YXRpb248L2gyPgoKICAgIDxwPlRoZSB2ZXJ5IGZpcnN0IGF0dGVtcHQgbWVyZWx5IGFkZGVkIGF1dG8taW5kZW50YXRpb24gdG8gYSB0ZXh0YXJlYQogICAgZWxlbWVudC4gSXQgd291bGQgc2NhbiBiYWNrd2FyZHMgdGhyb3VnaCB0aGUgY29udGVudCBvZiB0aGUgYXJlYSwKICAgIHN0YXJ0aW5nIGZyb20gdGhlIGN1cnNvciwgdW50aWwgaXQgaGFkIGVub3VnaCBpbmZvcm1hdGlvbiB0byBkZWNpZGUKICAgIGhvdyB0byBpbmRlbnQgdGhlIGN1cnJlbnQgbGluZS4gSXQgdG9vayBtZSBhIHdoaWxlIHRvIGZpZ3VyZSBvdXQgYQogICAgZGVjZW50IG1vZGVsIGZvciBpbmRlbnRpbmcgSmF2YVNjcmlwdCBjb2RlLCBidXQgaW4gdGhlIGVuZCB0aGlzIHNlZW1zCiAgICB0byB3b3JrOjwvcD4KCiAgICA8dWw+CiAgICAgIDxsaT5Db2RlIHRoYXQgc2l0cyBpbnNpZGUgYSBibG9jayBpcyBpbmRlbnRlZCBvbmUgdW5pdCAoZ2VuZXJhbGx5IHR3bwogICAgICBzcGFjZXMpIG1vcmUgdGhhbiB0aGUgc3RhdGVtZW50IG9yIGJyYWNlIHRoYXQgb3BlbmVkIHRoZSBibG9jay48L2xpPgogICAgICA8bGk+QSBzdGF0ZW1lbnQgdGhhdCBpcyBjb250aW51ZWQgdG8gdGhlIG5leHQgbGluZSBpcyBpbmRlbnRlZCBvbmUgdW5pdAogICAgICBtb3JlIHRoYW4gdGhlIGxpbmUgdGhhdCBzdGFydHMgdGhlIHN0YXRlbWVudC48L2xpPgogICAgICA8bGk+V2hlbiBkZWFsaW5nIHdpdGggbGlzdHMgb2YgYXJndW1lbnRzIG9yIHRoZSBjb250ZW50IG9mIGFycmF5IGFuZAogICAgICBvYmplY3QgbGl0ZXJhbHMgdGhlcmUgYXJlIHR3byBwb3NzaWJsZSBtb2RlbHMuIElmIHRoZXJlIGlzIGFueSB0ZXh0CiAgICAgIGRpcmVjdGx5IGFmdGVyIHRoZSBvcGVuaW5nIGJyYWNlLCBicmFja2V0LCBvciBwYXJlbnRoZXNpcywKICAgICAgc3Vic2VxdWVudCBsaW5lcyBhcmUgYWxpZ25lZCB3aXRoIHRoaXMgb3BlbmluZyBjaGFyYWN0ZXIuIElmIHRoZQogICAgICBvcGVuaW5nIGNoYXJhY3RlciBpcyBmb2xsb3dlZCBieSBhIG5ld2xpbmUgKG9wdGlvbmFsbHkgd2l0aCB3aGl0ZXNwYWNlCiAgICAgIG9yIGNvbW1lbnRzIGJlZm9yZSBpdCksIHRoZSBuZXh0IGxpbmUgaXMgaW5kZW50ZWQgb25lIHVuaXQgZnVydGhlcgogICAgICB0aGFuIHRoZSBsaW5lIHRoYXQgc3RhcnRlZCB0aGUgbGlzdC48L2xpPgogICAgICA8bGk+QW5kLCBvYnZpb3VzbHksIGlmIGEgc3RhdGVtZW50IGZvbGxvd3MgYW5vdGhlciBzdGF0ZW1lbnQgaXQgaXMKICAgICAgaW5kZW50ZWQgdGhlIHNhbWUgYW1vdW50IGFzIHRoZSBvbmUgYmVmb3JlIGl0LjwvbGk+CiAgICA8L3VsPgoKICAgIDxwPldoZW4gc2Nhbm5pbmcgYmFja3dhcmRzIHRocm91Z2ggY29kZSBvbmUgaGFzIHRvIHRha2Ugc3RyaW5nIHZhbHVlcywKICAgIGNvbW1lbnRzLCBhbmQgcmVndWxhciBleHByZXNzaW9ucyAod2hpY2ggYXJlIGRlbGltaXRlZCBieSBzbGFzaGVzKQogICAgaW50byBhY2NvdW50LCBiZWNhdXNlIGJyYWNlcyBhbmQgc2VtaWNvbG9ucyBhbmQgc3VjaCBhcmUgbm90CiAgICBzaWduaWZpY2FudCB3aGVuIHRoZXkgYXBwZWFyIGluc2lkZSB0aGVtLiBTaW5nbGUtbGluZSAoJy8vJykgY29tbWVudHMKICAgIHR1cm5lZCBvdXQgdG8gYmUgcmF0aGVyIGluZWZmaWNpZW50IHRvIGNoZWNrIGZvciB3aGVuIGRvaW5nIGEKICAgIGJhY2t3YXJkcyBzY2FuLCBzaW5jZSBldmVyeSB0aW1lIHlvdSBlbmNvdW50ZXIgYSBuZXdsaW5lIHlvdSBoYXZlIHRvCiAgICBnbyBvbiB0byB0aGUgbmV4dCBuZXdsaW5lIHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMgbGluZSBlbmRzIGluIGEKICAgIGNvbW1lbnQgb3Igbm90LiBSZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBldmVuIHdvcnNlICYjeDIwMTU7IHdpdGhvdXQKICAgIGNvbnRleHR1YWwgaW5mb3JtYXRpb24gdGhleSBhcmUgaW1wb3NzaWJsZSB0byBkaXN0aW5ndWlzaCBmcm9tIHRoZQogICAgZGl2aXNpb24gb3BlcmF0b3IsIGFuZCBJIGRpZG4ndCBnZXQgdGhlbSB3b3JraW5nIGluIHRoaXMgZmlyc3QKICAgIHZlcnNpb24uPC9wPgoKICAgIDxwPlRvIGZpbmQgb3V0IHdoaWNoIGxpbmUgdG8gaW5kZW50LCBhbmQgdG8gbWFrZSBzdXJlIHRoYXQgYWRkaW5nIG9yCiAgICByZW1vdmluZyB3aGl0ZXNwYWNlIGRvZXNuJ3QgY2F1c2UgdGhlIGN1cnNvciB0byBqdW1wIGluIHN0cmFuZ2Ugd2F5cywKICAgIGl0IGlzIG5lY2Vzc2FyeSB0byBkZXRlcm1pbmUgd2hpY2ggdGV4dCB0aGUgdXNlciBoYXMgc2VsZWN0ZWQuIEV2ZW4KICAgIHRob3VnaCBJIHdhcyB3b3JraW5nIHdpdGgganVzdCBhIHNpbXBsZSB0ZXh0YXJlYSBhdCB0aGlzIHBvaW50LCB0aGlzCiAgICB3YXMgYWxyZWFkeSBhIGJpdCBvZiBhIGhlYWRhY2hlLjwvcD4KCiAgICA8cD5PbiBXM0Mtc3RhbmRhcmRzLXJlc3BlY3RpbmcgYnJvd3NlcnMsIHRleHRhcmVhIG5vZGVzIGhhdmUKICAgIDxjb2RlPnNlbGVjdGlvblN0YXJ0PC9jb2RlPiBhbmQgPGNvZGU+c2VsZWN0aW9uRW5kPC9jb2RlPgogICAgcHJvcGVydGllcyB3aGljaCBuaWNlbHkgZ2l2ZSB5b3UgdGhlIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJlZm9yZQogICAgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIHNlbGVjdGlvbi4gR3JlYXQhPC9wPgoKICAgIDxwPlRoZW4sIHRoZXJlIGlzIEludGVybmV0IEV4cGxvcmVyLiBJbnRlcm5ldCBFeHBsb3JlciBhbHNvIGhhcyBhbiBBUEkKICAgIGZvciBsb29raW5nIGF0IGFuZCBtYW5pcHVsYXRpbmcgc2VsZWN0aW9ucy4gSXQgZ2l2ZXMgeW91IGluZm9ybWF0aW9uCiAgICBzdWNoIGFzIGEgZGV0YWlsZWQgbWFwIG9mIHRoZSBzcGFjZSB0aGUgc2VsZWN0ZWQgbGluZXMgdGFrZSB1cCBvbiB0aGUKICAgIHNjcmVlbiwgaW4gcGl4ZWxzLCBhbmQgb2YgY291cnNlIHRoZSB0ZXh0IGluc2lkZSB0aGUgc2VsZWN0aW9uLiBJdAogICAgZG9lcywgaG93ZXZlciwgbm90IGdpdmUgeW91IG11Y2ggb2YgYSBjbHVlIG9uIHdoZXJlIHRoZSBzZWxlY3Rpb24gaXMKICAgIGxvY2F0ZWQgaW4gdGhlIGRvY3VtZW50LjwvcD4KCiAgICA8cD5BZnRlciBzb21lIGV4cGVyaW1lbnRhdGlvbiBJIG1hbmFnZWQgdG8gd29yayBvdXQgYW4gZWxhYm9yYXRlCiAgICBtZXRob2QgZm9yIGdldHRpbmcgc29tZXRoaW5nIHNpbWlsYXIgdG8gdGhlCiAgICA8Y29kZT5zZWxlY3Rpb25TdGFydDwvY29kZT4gYW5kIDxjb2RlPnNlbGVjdGlvbkVuZDwvY29kZT4gdmFsdWVzCiAgICBpbiBvdGhlciBicm93c2Vycy4gSXQgd29ya2VkIGxpa2UgdGhpczo8L3A+CgogICAgPHVsPgogICAgICA8bGk+R2V0IHRoZSA8Y29kZT5UZXh0UmFuZ2U8L2NvZGU+IG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzZWxlY3Rpb24uPC9saT4KICAgICAgPGxpPlJlY29yZCB0aGUgbGVuZ3RoIG9mIHRoZSB0ZXh0IGluc2lkZSBpdC48L2xpPgogICAgICA8bGk+TWFrZSBhbm90aGVyIDxjb2RlPlRleHRSYW5nZTwvY29kZT4gdGhhdCBjb3ZlcnMgdGhlIHdob2xlIHRleHRhcmVhIGVsZW1lbnQuPC9saT4KICAgICAgPGxpPlNldCB0aGUgc3RhcnQgb2YgdGhlIGZpcnN0IDxjb2RlPlRleHRSYW5nZTwvY29kZT4gdG8gdGhlIHN0YXJ0IG9mIHRoZSBzZWNvbmQgb25lLjwvbGk+CiAgICAgIDxsaT5BZ2FpbiBnZXQgdGhlIGxlbmd0aCBvZiB0aGUgdGV4dCBpbiB0aGUgZmlyc3Qgb2JqZWN0LjwvbGk+CiAgICAgIDxsaT5Ob3cgPGNvZGU+c2VsZWN0aW9uRW5kPC9jb2RlPiBpcyB0aGUgc2Vjb25kIGxlbmd0aCwgYW5kIDxjb2RlPnNlbGVjdGlvblN0YXJ0PC9jb2RlPiBpcwogICAgICB0aGUgc2Vjb25kIG1pbnVzIHRoZSBmaXJzdCBvbmUuPC9saT4KICAgIDwvdWw+CgogICAgPHA+VGhhdCBzZWVtZWQgdG8gd29yaywgYnV0IHdoZW4gcmVzZXR0aW5nIHRoZSBzZWxlY3Rpb24gYWZ0ZXIgbW9kaWZ5aW5nCiAgICB0aGUgY29udGVudCBvZiB0aGUgdGV4dGFyZWEgSSByYW4gaW50byBhbm90aGVyIGludGVyZXN0aW5nIGZlYXR1cmUgb2YKICAgIHRoZXNlIDxjb2RlPlRleHRSYW5nZTwvY29kZT5zOiBZb3UgY2FuIG1vdmUgdGhlaXIgZW5kcG9pbnRzIGJ5IGEgZ2l2ZW4gbnVtYmVyIG9mCiAgICBjaGFyYWN0ZXJzLCB3aGljaCBpcyB1c2VmdWwgd2hlbiB0cnlpbmcgdG8gc2V0IGEgY3Vyc29yIGF0IHRoZSBOdGgKICAgIGNoYXJhY3RlciBvZiBhIHRleHRhcmVhLCBidXQgaW4gdGhpcyBjb250ZXh0LCBuZXdsaW5lcyBhcmUgPGVtPm5vdDwvZW0+CiAgICBjb25zaWRlcmVkIHRvIGJlIGNoYXJhY3RlcnMsIHNvIHlvdSdsbCBhbHdheXMgZW5kIHVwIG9uZSBjaGFyYWN0ZXIgdG9vCiAgICBmYXIgZm9yIGV2ZXJ5IG5ld2xpbmUgeW91IHBhc3NlZC4gT2YgY291cnNlLCB5b3UgY2FuIGNvdW50IG5ld2xpbmVzCiAgICBhbmQgY29tcGVuc2F0ZSBmb3IgdGhpcyAodGhvdWdoIGl0IGlzIHN0aWxsIG5vdCBwb3NzaWJsZSB0byBwb3NpdGlvbgogICAgdGhlIGN1cnNvciByaWdodCBpbiBmcm9udCBvZiBhIG5ld2xpbmUpLiBTaGVlc2guPC9wPgoKICAgIDxwPkFmdGVyIHJhZ2dpbmcgb24gSW50ZXJuZXQgRXhwbG9yZXIgZm9yIGEgd2hpbGUsIGxldCB1cyBtb3ZlIG9uIGFuZCByYWcKICAgIG9uIEZpcmVmb3ggYSBiaXQuIEl0IHR1cm5zIG91dCB0aGF0LCBpbiBGaXJlZm94LCBnZXR0aW5nIGFuZCBzZXR0aW5nCiAgICB0aGUgdGV4dCBjb250ZW50IG9mIGEgRE9NIGVsZW1lbnQgaXMgdW5leHBsYWluYWJseSBleHBlbnNpdmUsCiAgICBlc3BlY2lhbGx5IHdoZW4gdGhlcmUgaXMgYSBsb3Qgb2YgdGV4dCBpbnZvbHZlZC4gQXMgc29vbiBhcyBJIHRyaWVkIHRvCiAgICB1c2UgbXkgaW5kZW50YXRpb24gY29kZSB0byBpbmRlbnQgaXRzZWxmIChzb21lIDQwMCBsaW5lcyksIEkgZm91bmQKICAgIG15c2VsZiB3YWl0aW5nIGZvciBvdmVyIGZvdXIgc2Vjb25kcyBldmVyeSB0aW1lIEkgcHJlc3NlZCBlbnRlci4gVGhhdAogICAgc2VlbWVkIGEgbGl0dGxlIHNsb3cuPC9wPgoKICAgIDxoMj5kZXNpZ25Nb2RlIGl0IGlzPC9oMj4KCiAgICA8cD5UaGUgc29sdXRpb24gd2FzIG9idmlvdXM6IFNpbmNlIHRoZSB0ZXh0IGluc2lkZSBhIHRleHRhcmVhIGNhbiBvbmx5IGJlCiAgICBtYW5pcHVsYXRlZCBhcyBvbmUgc2luZ2xlIGJpZyBzdHJpbmcsIEkgaGFkIHRvIHNwcmVhZCBpdCBvdXQgb3ZlcgogICAgbXVsdGlwbGUgbm9kZXMuIEhvdyBkbyB5b3Ugc3ByZWFkIGVkaXRhYmxlIGNvbnRlbnQgb3ZlciBtdWx0aXBsZQogICAgbm9kZXM/IFJpZ2h0ISA8Y29kZT5kZXNpZ25Nb2RlPC9jb2RlPiBvciA8Y29kZT5jb250ZW50RWRpdGFibGU8L2NvZGU+LjwvcD4KCiAgICA8cD5Ob3cgSSB3YXNuJ3QgZW50aXJlbHkgbmFpdmUgYWJvdXQgPGNvZGU+ZGVzaWduTW9kZTwvY29kZT4sIEkgaGFkIGJlZW4gbG9va2luZwogICAgaW50byB3cml0aW5nIGEgbm9uLW1lc3N5IFdZU0lXWUcgZWRpdG9yIGJlZm9yZSwgYW5kIGF0IHRoYXQgdGltZSBJIGhhZAogICAgY29uY2x1ZGVkIHR3byB0aGluZ3M6PC9wPgoKICAgIDx1bD4KICAgICAgPGxpPkl0IGlzIGltcG9zc2libGUgdG8gcHJldmVudCB0aGUgdXNlciBmcm9tIGluc2VydGluZyB3aGljaGV2ZXIgSFRNTAogICAgICBqdW5rIGhlIHdhbnRzIGludG8gdGhlIGRvY3VtZW50LjwvbGk+CiAgICAgIDxsaT5JbiBJbnRlcm5ldCBFeHBsb3JlciwgaXQgaXMgZXh0ZW1lbHkgaGFyZCB0byBnZXQgYSBnb29kIHZpZXcKICAgICAgb24gd2hhdCBub2RlcyB0aGUgdXNlciBoYXMgc2VsZWN0ZWQuPC9saT4KICAgIDwvdWw+CgogICAgPHA+QmFzaWNhbGx5LCB0aGUgZ29vZCBmb2xrcyBhdCBNaWNyb3NvZnQgZGVzaWduZWQgYSByZWFsbHkgYmFkIGludGVyZmFjZQogICAgZm9yIHB1dHRpbmcgZWRpdGFibGUgZG9jdW1lbnRzIGluIHBhZ2VzLCBhbmQgdGhlIG90aGVyIGJyb3dzZXJzLCBub3QKICAgIHdhbnRpbmcgdG8gYmUgbGVmdCBiZWhpbmQsIG1vcmUgb3IgbGVzcyBjb3BpZWQgdGhhdC4gQW5kIHRoZXJlIGlzbid0CiAgICBtdWNoIGhvcGUgZm9yIGEgYmV0dGVyIHdheSB0byBkbyB0aGlzIGFwcGVhcmluZyBhbnl0aW1lIHNvb24uIFdpc2UKICAgIHBlb3BsZSBwcm9iYWJseSB1c2UgYSBGbGFzaCBtb3ZpZSBvciAoR29kIGZvcmJpZCkgYSBKYXZhIGFwcGxldCBmb3IKICAgIHRoZXNlIGtpbmQgb2YgdGhpbmdzLCB0aG91Z2ggdGhvc2UgYXJlIG5vdCB3aXRob3V0IGRyYXdiYWNrcyBlaXRoZXIuPC9wPgoKICAgIDxwPkFueXdheSwgc2VlaW5nIGhvdyB1c2luZyBhbiBlZGl0YWJsZSBkb2N1bWVudCB3b3VsZCBhbHNvIG1ha2Ugc3ludGF4CiAgICBoaWdobGlnaHRpbmcgcG9zc2libGUsIEkgZm9vbGlzaGx5IHdlbnQgYWhlYWQuIFRoZXJlIGlzIHNvbWV0aGluZwogICAgcGVydmVyc2VseSBmYXNjaW5hdGluZyBhYm91dCB0cnlpbmcgdG8gYnVpbGQgYSBjb21wbGljYXRlZCBzeXN0ZW0gb24gYQogICAgbG91c3ksIHVuc3VpdGFibGUgcGxhdGZvcm0uPC9wPgoKICAgIDxoMj5BIHBhcnNlcjwvaDI+CgogICAgPHA+SG93IGRvZXMgb25lIGRvIGRlY2VudCBzeW50YXggaGlnaGxpZ2h0aW5nPyBBIHZlcnkgc2ltcGxlIHNjYW5uaW5nIGNhbgogICAgdGVsbCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHN0cmluZ3MsIGNvbW1lbnRzLCBrZXl3b3JkcywgYW5kIG90aGVyCiAgICBjb2RlLiBCdXQgdGhpcyB0aW1lIEkgd2FudGVkIHRvIGFjdHVhbGx5IGJlIGFibGUgdG8gcmVjb2duaXplIHJlZ3VsYXIKICAgIGV4cHJlc3Npb25zLCBzbyB0aGF0IEkgZGlkbid0IGhhdmUgYW55IGJsYXRhbnQgaW5jb3JyZWN0IGJlaGF2aW91cgogICAgYW55bW9yZS48L3A+CgogICAgPHA+VGhhdCBicm91Z2h0IG1lIHRvIHRoZSBpZGVhIG9mIGRvaW5nIGEgc2VyaW91cyBwYXJzZSBvbiB0aGUgY29kZS4gVGhpcwogICAgd291bGQgbm90IG9ubHkgbWFrZSBkZXRlY3RpbmcgcmVndWxhciBleHByZXNzaW9ucyBtdWNoIGVhc2llciwgaXQKICAgIHdvdWxkIGFsc28gZ2l2ZSBtZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29kZSwgd2hpY2ggY2FuIGJlCiAgICB1c2VkIHRvIGRldGVybWluZSBwcm9wZXIgaW5kZW50YXRpb24gbGV2ZWxzLCBhbmQgdG8gbWFrZSBzdWJ0bGUKICAgIGRpc3RpbmN0aW9ucyBpbiBjb2xvdXJpbmcsIGZvciBleGFtcGxlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdmFyaWFibGUKICAgIG5hbWVzIGFuZCBwcm9wZXJ0eSBuYW1lcy48L3A+CgogICAgPHA+QW5kIGhleSwgd2hlbiB3ZSdyZSBwYXJzaW5nIHRoZSB3aG9sZSB0aGluZywgaXQgd291bGQgZXZlbiBiZSBwb3NzaWJsZQogICAgdG8gbWFrZSBhIGRpc3RpbmN0aW9uIGJldHdlZW4gbG9jYWwgYW5kIGdsb2JhbCB2YXJpYWJsZXMsIGFuZCBjb2xvdXIKICAgIHRoZW0gZGlmZmVyZW50bHkuIElmIHlvdSd2ZSBldmVyIHByb2dyYW1tZWQgSmF2YVNjcmlwdCB5b3UgY2FuCiAgICBwcm9iYWJseSBpbWFnaW5lIGhvdyB1c2VmdWwgdGhpcyB3b3VsZCBiZSAmI3gyMDE1OyBpdCBpcyByaWRpY3Vsb3VzbHkgZWFzeQogICAgdG8gYWNjaWRlbnRhbGx5IGNyZWF0ZSBnbG9iYWwgaW5zdGVhZCBvZiBsb2NhbCB2YXJpYWJsZXMuIEkgZG9uJ3QKICAgIGNvbnNpZGVyIG15c2VsZiBhIEphdmFTY3JpcHQgcm9va2llIGFueW1vcmUsIGJ1dCBpdCB3YXMgKGVtYmFycmFzaW5nbHkKICAgIGVub3VnaCkgb25seSB0aGlzIHdlZWsgdGhhdCBJIHJlYWxpemVkIHRoYXQgbXkgaGFiaXQgb2YgdHlwaW5nIDxjb2RlPmZvcgogICAgKG5hbWUgaW4gb2JqZWN0KSAuLi48L2NvZGU+IHdhcyBjcmVhdGluZyBhIGdsb2JhbCB2YXJpYWJsZSA8Y29kZT5uYW1lPC9jb2RlPiwgYW5kIHRoYXQKICAgIEkgc2hvdWxkIGJlIHR5cGluZyA8Y29kZT5mb3IgKHZhciBuYW1lIGluIG9iamVjdCkgLi4uPC9jb2RlPiBpbnN0ZWFkLjwvcD4KCiAgICA8cD5SZS1wYXJzaW5nIGFsbCB0aGUgY29kZSB0aGUgdXNlciBoYXMgdHlwZWQgaW4gZXZlcnkgdGltZSBoZSBoaXRzIGEga2V5CiAgICBpcyBvYnZpb3VzbHkgbm90IGZlYXNpYmxlLiBTbyBob3cgZG9lcyBvbmUgY29tYmluZSBvbi10aGUtZmx5CiAgICBoaWdobGlnaHRpbmcgd2l0aCBhIHNlcmlvdXMgcGFyc2VyPyBPbmUgb3B0aW9uIHdvdWxkIGJlIHRvIHNwbGl0IHRoZQogICAgY29kZSBpbnRvIHRvcC1sZXZlbCBzdGF0ZW1lbnRzIChmdW5jdGlvbnMsIHZhcmlhYmxlIGRlZmluaXRpb25zLCBldGMuKQogICAgYW5kIHBhcnNlIHRoZXNlIHNlcGFyYXRlbHkuIFRoaXMgaXMgaG9ycmlibHkgY2x1bmt5IHRob3VnaCwgZXNwZWNpYWxseQogICAgY29uc2lkZXJpbmcgdGhlIGZhY3QgdGhhdCBtb2Rlcm4gSmF2YVNjcmlwdGVycyBvZnRlbiBwdXQgYWxsIHRoZSBjb2RlCiAgICBpbiBhIGZpbGUgaW4gYSBzaW5nbGUgYmlnIG9iamVjdCBvciBmdW5jdGlvbiB0byBwcmV2ZW50IG5hbWVzcGFjZQogICAgcG9sbHV0aW9uLjwvcD4KCiAgICA8cD5JIGhhdmUgYWx3YXlzIGxpa2VkIGNvbnRpbnVhdGlvbi1wYXNzaW5nIHN0eWxlIGFuZCBnZW5lcmF0b3JzLiBTbyB0aGUKICAgIGlkZWEgSSBjYW1lIHVwIHdpdGggaXMgdGhpczogQW4gaW50ZXJydXB0YWJsZSwgcmVzdW1hYmxlIHBhcnNlci4gVGhpcwogICAgaXMgYSBwYXJzZXIgdGhhdCBkb2VzIG5vdCBydW4gdGhyb3VnaCBhIHdob2xlIGRvY3VtZW50IGF0IG9uY2UsIGJ1dAogICAgcGFyc2VzIG9uLWRlbWFuZCwgYSBsaXR0bGUgYml0IGF0IGEgdGltZS4gQXQgYW55IG1vbWVudCB5b3UgY2FuIGNyZWF0ZQogICAgYSBjb3B5IG9mIGl0cyBjdXJyZW50IHN0YXRlLCB3aGljaCBjYW4gYmUgcmVzdW1lZCBsYXRlci4gWW91IHN0YXJ0CiAgICBwYXJzaW5nIGF0IHRoZSB0b3Agb2YgdGhlIGNvZGUsIGFuZCBrZWVwIGdvaW5nIGFzIGxvbmcgYXMgeW91IGxpa2UsCiAgICBidXQgdGhyb3VnaG91dCB0aGUgZG9jdW1lbnQsIGZvciBleGFtcGxlIGF0IGV2ZXJ5IGVuZCBvZiBsaW5lLCB5b3UKICAgIHN0b3JlIGEgY29weSBvZiB0aGUgY3VycmVudCBwYXJzZXIgc3RhdGUuIExhdGVyIG9uLCB3aGVuIGxpbmUgMTA2CiAgICBjaGFuZ2VzLCB5b3UgZ3JhYiB0aGUgaW50ZXJydXB0ZWQgcGFyc2VyIHRoYXQgd2FzIHN0b3JlZCBhdCB0aGUgZW5kIG9mCiAgICBsaW5lIDEwNSwgYW5kIHVzZSBpdCB0byByZS1wYXJzZSBsaW5lIDEwNi4gSXQgc3RpbGwga25vd3MgZXhhY3RseSB3aGF0CiAgICB0aGUgY29udGV4dCB3YXMgYXQgdGhhdCBwb2ludCwgd2hpY2ggbG9jYWwgdmFyaWFibGVzIHdlcmUgZGVmaW5lZCwKICAgIHdoaWNoIHVuZmluaXNoZWQgc3RhdGVtZW50cyB3ZXJlIGVuY291bnRlcmVkLCBhbmQgc28gb24uPC9wPgoKICAgIDxwPkJ1dCB0aGF0LCB1bmZvcnR1bmF0ZWx5LCB0dXJuZWQgb3V0IHRvIGJlIG5vdCBxdWl0ZSBhcyBlYXN5IGFzIGl0CiAgICBzb3VuZHMuPC9wPgoKICAgIDxoMj5UaGUgRE9NIG5vZGVzIHVuZGVyZm9vdDwvaDI+CgogICAgPHA+T2YgY291cnNlLCB3aGVuIHdvcmtpbmcgaW5zaWRlIGFuIGVkaXRhYmxlIGZyYW1lIHdlIGRvbid0IGp1c3QKICAgIGhhdmUgdG8gZGVhbCB3aXRoIHRleHQuIFRoZSBjb2RlIHdpbGwgYmUgcmVwcmVzZW50ZWQgYnkgc29tZSBraW5kCiAgICBvZiBET00gdHJlZS4gTXkgZmlyc3QgaWRlYSB3YXMgdG8gc2V0IHRoZSA8Y29kZT53aGl0ZS1zcGFjZToKICAgIHByZTwvY29kZT4gc3R5bGUgZm9yIHRoZSBmcmFtZSBhbmQgdHJ5IHRvIHdvcmsgd2l0aCBtb3N0bHkgdGV4dCwKICAgIHdpdGggdGhlIG9jY2FzaW9uYWwgY29sb3VyZWQgPGNvZGU+c3BhbjwvY29kZT4gZWxlbWVudC4gSXQgdHVybmVkCiAgICBvdXQgdGhhdCBzdXBwb3J0IGZvciA8Y29kZT53aGl0ZS1zcGFjZTogcHJlPC9jb2RlPiBpbiBicm93c2VycywKICAgIGVzcGVjaWFsbHkgaW4gZWRpdGFibGUgZnJhbWVzLCBpcyBzbyBob3BlbGVzc2x5IGdsaXRjaHkgdGhhdCB0aGlzCiAgICB3YXMgdW53b3JrYWJsZS48L3A+CgogICAgPHA+TmV4dCBJIHRyaWVkIGEgc2VyaWVzIG9mIDxjb2RlPmRpdjwvY29kZT4gZWxlbWVudHMsIG9uZSBwZXIKICAgIGxpbmUsIHdpdGggPGNvZGU+c3BhbjwvY29kZT4gZWxlbWVudHMgaW5zaWRlIHRoZW0uIFRoaXMgc2VlbWVkIHRvCiAgICBuaWNlbHkgcmVmbGVjdCB0aGUgc3RydWN0dXJlIG9mIHRoZSBjb2RlIGluIGEgc2hhbGxvd2x5CiAgICBoaWVyYXJjaGljYWwgd2F5LiBJIHNvb24gcmVhbGl6ZWQsIGhvd2V2ZXIsIHRoYXQgbXkgY29kZSB3b3VsZCBiZQogICAgbXVjaCBtb3JlIHN0cmFpZ2h0Zm93YXJkIHdoZW4gdXNpbmcgbm8gaGllcmFyY2h5IHdoYXRzb2V2ZXIKICAgICYjeDIwMTU7IGEgc2VyaWVzIG9mIDxjb2RlPnNwYW48L2NvZGU+cywgd2l0aCA8Y29kZT5icjwvY29kZT4gdGFncwogICAgYXQgdGhlIGVuZCBvZiBldmVyeSBsaW5lLiBUaGlzIHdheSwgdGhlIERPTSBub2RlcyBmb3JtIGEgZmxhdAogICAgc2VxdWVuY2UgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgc2VxdWVuY2Ugb2YgdGhlIHRleHQgJiN4MjAxNTsKICAgIGp1c3QgZXh0cmFjdCB0ZXh0IGZyb20gPGNvZGU+c3BhbjwvY29kZT4gbm9kZXMgYW5kIHN1YnN0aXR1dGUKICAgIG5ld2xpbmVzIGZvciA8Y29kZT5icjwvY29kZT4gbm9kZXMuPC9wPgoKICAgIDxwPkl0IHdvdWxkIGJlIGEgc2hhbWUgaWYgdGhlIGVkaXRvciB3b3VsZCBmYWxsIGFwYXJ0IGFzIHNvb24gYXMKICAgIHNvbWVvbmUgcGFzdGVzIHNvbWUgY29tcGxpY2F0ZWQgSFRNTCBpbnRvIGl0LiBJIHdhbnRlZCBpdCB0byBiZQogICAgYWJsZSB0byBkZWFsIHdpdGggd2hhdGV2ZXIgbWVzcyBpdCBmaW5kcy4gVGhpcyBtZWFucyB1c2luZyBzb21lCiAgICBraW5kIG9mIEhUTUwtbm9ybWFsaXplciB0aGF0IHRha2VzIGFyYml0cmFyeSBIVE1MIGFuZCBmbGF0dGVucyBpdAogICAgaW50byBhIHNlcmllcyBvZiA8Y29kZT5icjwvY29kZT5zIGFuZCA8Y29kZT5zcGFuPC9jb2RlPiBlbGVtZW50cwogICAgdGhhdCBjb250YWluIGEgc2luZ2xlIHRleHQgbm9kZS4gSnVzdCBsaWtlIHRoZSBwYXJzaW5nIHByb2Nlc3MsIGl0CiAgICB3b3VsZCBiZSBiZXN0IGlmIHRoaXMgZGlkIG5vdCBoYXZlIHRvIGRvbmUgdG8gdGhlIGVudGlyZSBidWZmZXIKICAgIGV2ZXJ5IHRpbWUgc29tZXRoaW5nIGNoYW5nZXMuPC9wPgoKICAgIDxwPkl0IHRvb2sgc29tZSBiYW5naW5nIG15IGhlYWQgYWdhaW5zdCBteSBrZXlib2FyZCwgYnV0IEkgZm91bmQgYSB2ZXJ5CiAgICBuaWNlIHdheSB0byBtb2RlbCB0aGlzLiBJdCBtYWtlcyBoZWF2eSB1c2Ugb2YgZ2VuZXJhdG9ycywgZm9yIHdoaWNoIEkKICAgIHVzZWQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb2NoaWtpdC5jb20iPk1vY2hpS2l0PC9hPidzIGl0ZXJhdG9yCiAgICBmcmFtZXdvcmsuIEJvYiBJcHBvbGl0byBleHBsYWlucyB0aGUgY29uY2VwdHMgaW4gdGhpcyBsaWJyYXJ5IHZlcnkKICAgIHdlbGwgaW4gaGlzIDxhCiAgICBocmVmPSJodHRwOi8vYm9iLnB5dGhvbm1hYy5vcmcvYXJjaGl2ZXMvMjAwNS8wNy8wNi9pdGVyYXRpb24taW4tamF2YXNjcmlwdC8iPmJsb2cKICAgIHBvc3Q8L2E+IGFib3V0IGl0LiAoQWxzbyBub3RpY2Ugc29tZSBvZiB0aGUgZGlzbWlzc2l2ZSBjb21tZW50cyBhdCB0aGUKICAgIGJvdHRvbSBvZiB0aGF0IHBvc3QuIFRoZXkgc2F5ICJJIGRvbid0IHRoaW5rIEkgcmVhbGx5IHdhbnQgdG8gbGVhcm4KICAgIHRoaXMsIHNvIEknbGwgbWFrZSB1cCBzb21lIHNpbGx5IHJlYXNvbiB0byBjb25kZW1uIGl0LiIpPC9wPgoKICAgIDxwPlRoZSBoaWdobGlnaHRpbmcgcHJvY2VzcyBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGVsZW1lbnRzOgogICAgbm9ybWFsaXppbmcgdGhlIERPTSB0cmVlLCBleHRyYWN0aW5nIHRoZSB0ZXh0IGZyb20gdGhlIERPTSB0cmVlLAogICAgdG9rZW5pemluZyB0aGlzIHRleHQsIHBhcnNpbmcgdGhlIHRva2VucywgYW5kIGZpbmFsbHkgYWRqdXN0aW5nIHRoZQogICAgRE9NIG5vZGVzIHRvIHJlZmxlY3QgdGhlIHN0cnVjdHVyZSBvZiB0aGUgY29kZS48L3A+CgogICAgPHA+VGhlIGZpcnN0IHR3bywgSSBwdXQgaW50byBhIHNpbmdsZSBnZW5lcmF0b3IuIEl0IHNjYW5zIHRoZSBET00KICAgIHRyZWUsIGZpeGluZyBhbnl0aGluZyB0aGF0IGlzIG5vdCBhIHNpbXBsZSB0b3AtbGV2ZWwKICAgIDxjb2RlPnNwYW48L2NvZGU+IG9yIDxjb2RlPmJyPC9jb2RlPiwgYW5kIGl0IHByb2R1Y2VzIHRoZSB0ZXh0CiAgICBjb250ZW50IG9mIHRoZSBub2RlcyAob3IgYSBuZXdsaW5lIGluIGNhc2Ugb2YgYSA8Y29kZT5icjwvY29kZT4pCiAgICBhcyBpdHMgb3V0cHV0ICYjeDIwMTU7IGVhY2ggdGltZSBpdCBpcyBjYWxsZWQsIGl0IHlpZWxkcyBhIHN0cmluZy4KICAgIENvbnRpbnVhdGlvbiBwYXNzaW5nIHN0eWxlIHdhcyBhIGdvb2Qgd2F5IHRvIG1vZGVsIHRoaXMgcHJvY2VzcyBpbgogICAgYW4gaXRlcmF0b3IsIHdoaWNoIGhhcyB0byBiZSBwcm9jZXNzZWQgb25lIHN0ZXAgYXQgYSB0aW1lLiBMb29rIGF0CiAgICB0aGlzIHNpbXBsaWZpZWQgdmVyc2lvbjo8L3A+CgogICAgPHByZSBjbGFzcz0iY29kZSI+PHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPmZ1bmN0aW9uPC9zcGFuPiA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPnRyYXZlcnNlRE9NPC9zcGFuPig8c3BhbiBjbGFzcz0ianMtdmFyaWFibGVkZWYiPnN0YXJ0PC9zcGFuPil7CiAgPHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPnZhcjwvc3Bhbj4gPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlZGVmIj5jYzwvc3Bhbj4gPSA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+ZnVuY3Rpb248L3NwYW4+KCl7PHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPnJldHVybjwvc3Bhbj4gPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5zY2FuTm9kZTwvc3Bhbj4oPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPnN0YXJ0PC9zcGFuPiwgPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5zdG9wPC9zcGFuPik7fTsKICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+ZnVuY3Rpb248L3NwYW4+IDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZWRlZiI+c3RvcDwvc3Bhbj4oKXsKICAgIDxzcGFuIGNsYXNzPSJqcy1sb2NhbHZhcmlhYmxlIj5jYzwvc3Bhbj4gPSA8c3BhbiBjbGFzcz0ianMtbG9jYWx2YXJpYWJsZSI+c3RvcDwvc3Bhbj47CiAgICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+dGhyb3c8L3NwYW4+IDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZSI+U3RvcEl0ZXJhdGlvbjwvc3Bhbj47CiAgfQogIDxzcGFuIGNsYXNzPSJqcy1rZXl3b3JkIj5mdW5jdGlvbjwvc3Bhbj4gPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlZGVmIj55aWVsZDwvc3Bhbj4oPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlZGVmIj52YWx1ZTwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZWRlZiI+Yzwvc3Bhbj4pewogICAgPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPmNjPC9zcGFuPiA9IDxzcGFuIGNsYXNzPSJqcy1sb2NhbHZhcmlhYmxlIj5jPC9zcGFuPjsKICAgIDxzcGFuIGNsYXNzPSJqcy1rZXl3b3JkIj5yZXR1cm48L3NwYW4+IDxzcGFuIGNsYXNzPSJqcy1sb2NhbHZhcmlhYmxlIj52YWx1ZTwvc3Bhbj47CiAgfQoKICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+ZnVuY3Rpb248L3NwYW4+IDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZWRlZiI+c2Nhbk5vZGU8L3NwYW4+KDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZWRlZiI+bm9kZTwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZWRlZiI+Yzwvc3Bhbj4pewogICAgPHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPmlmPC9zcGFuPiAoPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPm5vZGU8L3NwYW4+LjxzcGFuIGNsYXNzPSJqcy1wcm9wZXJ0eSI+bmV4dFNpYmxpbmc8L3NwYW4+KQogICAgICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+dmFyPC9zcGFuPiA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGVkZWYiPm5leHRjPC9zcGFuPiA9IDxzcGFuIGNsYXNzPSJqcy1rZXl3b3JkIj5mdW5jdGlvbjwvc3Bhbj4oKXs8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+cmV0dXJuPC9zcGFuPiA8c3BhbiBjbGFzcz0ianMtbG9jYWx2YXJpYWJsZSI+c2Nhbk5vZGU8L3NwYW4+KDxzcGFuIGNsYXNzPSJqcy1sb2NhbHZhcmlhYmxlIj5ub2RlPC9zcGFuPi48c3BhbiBjbGFzcz0ianMtcHJvcGVydHkiPm5leHRTaWJsaW5nPC9zcGFuPiwgPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPmM8L3NwYW4+KTt9OwogICAgPHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPmVsc2U8L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJqcy1rZXl3b3JkIj52YXI8L3NwYW4+IDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZWRlZiI+bmV4dGM8L3NwYW4+ID0gPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPmM8L3NwYW4+OwoKICAgIDxzcGFuIGNsYXNzPSJqcy1rZXl3b3JkIj5pZjwvc3Bhbj4gKDxzcGFuIGNsYXNzPSJqcy1jb21tZW50Ij4vKiBub2RlIGlzIHByb3BlciBzcGFuIGVsZW1lbnQgKi88L3NwYW4+KQogICAgICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+cmV0dXJuPC9zcGFuPiA8c3BhbiBjbGFzcz0ianMtbG9jYWx2YXJpYWJsZSI+eWllbGQ8L3NwYW4+KDxzcGFuIGNsYXNzPSJqcy1sb2NhbHZhcmlhYmxlIj5ub2RlPC9zcGFuPi48c3BhbiBjbGFzcz0ianMtcHJvcGVydHkiPmZpcnN0Q2hpbGQ8L3NwYW4+LjxzcGFuIGNsYXNzPSJqcy1wcm9wZXJ0eSI+bm9kZVZhbHVlPC9zcGFuPiwgPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPm5leHRjPC9zcGFuPik7CiAgICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+ZWxzZTwvc3Bhbj4gPHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPmlmPC9zcGFuPiAoPHNwYW4gY2xhc3M9ImpzLWNvbW1lbnQiPi8qIG5vZGUgaXMgcHJvcGVyIGJyIGVsZW1lbnQgKi88L3NwYW4+KQogICAgICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+cmV0dXJuPC9zcGFuPiA8c3BhbiBjbGFzcz0ianMtbG9jYWx2YXJpYWJsZSI+eWllbGQ8L3NwYW4+KDxzcGFuIGNsYXNzPSJqcy1zdHJpbmciPiZxdW90O1xuJnF1b3Q7PC9zcGFuPiwgPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPm5leHRjPC9zcGFuPik7CiAgICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+ZWxzZTwvc3Bhbj4KICAgICAgPHNwYW4gY2xhc3M9ImpzLWNvbW1lbnQiPi8qIGZsYXR0ZW4gbm9kZSwgeWllbGQgaXRzIHRleHR1YWwgY29udGVudCAqLzwvc3Bhbj47CiAgfQoKICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+cmV0dXJuPC9zcGFuPiB7PHNwYW4gY2xhc3M9ImpzLXByb3BlcnR5Ij5uZXh0PC9zcGFuPjogPHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPmZ1bmN0aW9uPC9zcGFuPigpezxzcGFuIGNsYXNzPSJqcy1rZXl3b3JkIj5yZXR1cm48L3NwYW4+IDxzcGFuIGNsYXNzPSJqcy1sb2NhbHZhcmlhYmxlIj5jYzwvc3Bhbj4oKTt9fTsKfTwvcHJlPgoKICAgIDxwPlRoZSB2YXJpYWJsZSA8Y29kZT5jPC9jb2RlPiBzdGFuZHMgZm9yICdjb250aW51YXRpb24nLCBhbmQgPGNvZGU+Y2M8L2NvZGU+IGZvciAnY3VycmVudAogICAgY29udGludWF0aW9uJyAmI3gyMDE1OyB0aGF0IGxhc3QgdmFyaWFibGUgaXMgdXNlZCB0byBzdG9yZSB0aGUgZnVuY3Rpb24gdG8KICAgIGNvbnRpbnVlIHdpdGgsIHdoZW4geWllbGRpbmcgYSB2YWx1ZSB0byB0aGUgb3V0c2lkZSB3b3JsZC4gRXZlcnkgdGltZQogICAgY29udHJvbCBsZWF2ZXMgdGhpcyBmdW5jdGlvbiwgaXQgaGFzIHRvIG1ha2Ugc3VyZSB0aGF0IDxjb2RlPmNjPC9jb2RlPiBpcyBzZXQgdG8KICAgIGEgc3VpdGFibGUgdmFsdWUsIHdoaWNoIGlzIHdoYXQgPGNvZGU+eWllbGQ8L2NvZGU+IGFuZCA8Y29kZT5zdG9wPC9jb2RlPiB0YWtlIGNhcmUgb2YuPC9wPgoKICAgIDxwPlRoZSBvYmplY3QgdGhhdCBpcyByZXR1cm5lZCBjb250YWlucyBhIDxjb2RlPm5leHQ8L2NvZGU+IG1ldGhvZCwgd2hpY2ggaXMKICAgIE1vY2hpS2l0J3MgaWRlYSBvZiBhbiBpdGVyYXRvciwgYW5kIHRoZSBpbml0aWFsIGNvbnRpbnVhdGlvbiBqdXN0CiAgICB0aHJvd3MgYSA8Y29kZT5TdG9wSXRlcmF0aW9uPC9jb2RlPiwgd2hpY2ggaXMgaG93IE1vY2hpS2l0IHNpZ25hbHMgdGhhdCBhbgogICAgaXRlcmF0b3IgaGFzIHJlYWNoZWQgaXRzIGVuZC48L3A+CgogICAgPHA+VGhlIGZpcnN0IGxpbmVzIG9mIDxjb2RlPnNjYW5Ob2RlPC9jb2RlPiBleHRlbmQgdGhlIGNvbnRpbnVhdGlvbiB3aXRoIHRoZSB0YXNrIG9mCiAgICBzY2FubmluZyB0aGUgbmV4dCBub2RlLCBpZiB0aGVyZSBpcyBhIG5leHQgbm9kZS4gVGhlIHJlc3Qgb2YgdGhlCiAgICBmdW5jdGlvbiBkZWNpZGVzIHdoYXQga2luZCBvZiB2YWx1ZSB0byA8Y29kZT55aWVsZDwvY29kZT4uIE5vdGUgdGhhdCB0aGlzIGlzIGEKICAgIHJhdGhlciB0cml2aWFsIGV4YW1wbGUgb2YgdGhpcyB0ZWNobmlxdWUsIHNpbmNlIHRoZSBwcm9jZXNzIG9mIGdvaW5nCiAgICB0aHJvdWdoIHRoZXNlIG5vZGVzIGlzIGJhc2ljYWxseSBsaW5lYXIgKGl0IHdhcyBtdWNoLCBtdWNoIG1vcmUKICAgIGNvbXBsZXggaW4gZWFybGllciB2ZXJzaW9ucyksIGJ1dCBzdGlsbCB0aGUgdHJpY2sgd2l0aCB0aGUKICAgIGNvbnRpbnVhdGlvbnMgbWFrZXMgdGhlIGNvZGUgc2hvcnRlciBhbmQsIGZvciB0aG9zZSBpbiB0aGUga25vdywKICAgIGNsZWFyZXIgdGhhbiB0aGUgZXF1aXZhbGVudCAnc3RvcmluZyB0aGUgaXRlcmF0b3Igc3RhdGUgaW4gdmFyaWFibGVzJwogICAgYXBwcm9hY2guPC9wPgoKICAgIDxwPlRoZSBuZXh0IGl0ZXJhdG9yIHRoYXQgdGhlIGlucHV0IHBhc3NlcyB0aHJvdWdoIGlzIHRoZQogICAgdG9rZW5pemVyLiBXZWxsLCBhY3R1YWxseSwgdGhlcmUgaXMgYW5vdGhlciBpdGVyYXRvciBpbiBiZXR3ZWVuCiAgICB0aGF0IGlzb2xhdGVzIHRoZSB0b2tlbml6ZXIgZnJvbSB0aGUgZmFjdCB0aGF0IHRoZSBET00gdHJhdmVyc2FsCiAgICB5aWVsZHMgYSBidW5jaCBvZiBzZXBhcmF0ZSBzdHJpbmdzLCBhbmQgcHJlc2VudHMgdGhlbSBhcyBhIHNpbmdsZQogICAgY2hhcmFjdGVyIHN0cmVhbSAod2l0aCBhIGNvbnZlbmllbnQgPGNvZGU+cGVlazwvY29kZT4gb3BlcmF0aW9uKSwKICAgIGJ1dCB0aGlzIGlzIG5vdCBhIHZlcnkgaW50ZXJlc3Rpbmcgb25lLiBXaGF0IHRoZSB0b2tlbml6ZXIgcmV0dXJucwogICAgaXMgYSBzdHJlYW0gb2YgdG9rZW4gb2JqZWN0cywgZWFjaCBvZiB3aGljaCBoYXMgYQogICAgPGNvZGU+dmFsdWU8L2NvZGU+LCBpdHMgdGV4dHVhbCBjb250ZW50LCBhIDxjb2RlPnR5cGU8L2NvZGU+LCBsaWtlCiAgICA8Y29kZT4idmFyaWFibGUiPC9jb2RlPiwgPGNvZGU+Im9wZXJhdG9yIjwvY29kZT4sIG9yIGp1c3QgaXRzZWxmLAogICAgPGNvZGU+InsiPC9jb2RlPiBmb3IgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2Ygc2lnbmlmaWNhbnQKICAgIHB1bmN0dWF0aW9uIG9yIHNwZWNpYWwga2V5d29yZHMuIFRoZXkgYWxzbyBoYXZlIGEKICAgIDxjb2RlPnN0eWxlPC9jb2RlPiwgd2hpY2ggaXMgdXNlZCBsYXRlciBieSB0aGUgaGlnaGxpZ2h0ZXIgdG8gZ2l2ZQogICAgdGhlaXIgPGNvZGU+c3BhbjwvY29kZT4gZWxlbWVudHMgYSBjbGFzcyBuYW1lICh0aGUgcGFyc2VyIHdpbGwKICAgIHN0aWxsIGFkanVzdCB0aGlzIGluIHNvbWUgY2FzZXMpLjwvcD4KCiAgICA8cD5BdCBmaXJzdCBJIGFzc3VtZWQgdGhlIHBhcnNlciB3b3VsZCBoYXZlIHRvIHRhbGsgYmFjayB0byB0aGUKICAgIHRva2VuaXplciBhYm91dCB0aGUgY3VycmVudCBjb250ZXh0LCBpbiBvcmRlciB0byBiZSBhYmxlIHRvCiAgICBkaXN0aW5ndWlzaCB0aG9zZSBhY2N1cnNlZCByZWd1bGFyIGV4cHJlc3Npb25zIGZyb20gZGl2aXNpb25zLCBidXQKICAgIGl0IHNlZW1zIHRoYXQgcmVndWxhciBleHByZXNzaW9ucyBhcmUgb25seSBhbGxvd2VkIGlmIHRoZSBwcmV2aW91cwogICAgKG5vbi13aGl0ZXNwYWNlLCBub24tY29tbWVudCkgdG9rZW4gd2FzIGVpdGhlciBhbiBvcGVyYXRvciwgYQogICAga2V5d29yZCBsaWtlIDxjb2RlPm5ldzwvY29kZT4gb3IgPGNvZGU+dGhyb3c8L2NvZGU+LCBvciBhIHNwZWNpZmljCiAgICBraW5kIG9mIHB1bmN0dWF0aW9uICg8Y29kZT4iW3t9KCw7OiI8L2NvZGU+KSB0aGF0IGluZGljYXRlcyBhIG5ldwogICAgZXhwcmVzc2lvbiBjYW4gYmUgc3RhcnRlZCBoZXJlLiBUaGlzIG1hZGUgdGhpbmdzIGNvbnNpZGVyYWJseQogICAgZWFzaWVyLCBzaW5jZSB0aGUgJ3JlZ2V4cCBvciBubyByZWdleHAnIHF1ZXN0aW9uIGNvdWxkIHN0YXkKICAgIGVudGlyZWx5IHdpdGhpbiB0aGUgdG9rZW5pemVyLjwvcD4KCiAgICA8cD5UaGUgbmV4dCBzdGVwLCB0aGVuLCBpcyB0aGUgcGFyc2VyLiBJdCBkb2VzIG5vdCBkbyBhIHZlcnkKICAgIHRob3JvdWdoIGpvYiBiZWNhdXNlLCBmaXJzdGx5LCBpdCBoYXMgdG8gYmUgZmFzdCwgYW5kIHNlY29uZGx5LCBpdAogICAgc2hvdWxkIG5vdCBnbyB0byBwaWVjZXMgd2hlbiBmZWQgYW4gaW5jb3JyZWN0IHByb2dyYW0uIFNvIG9ubHkKICAgIHN1cGVyZmljaWFsIGNvbnN0cnVjdHMgYXJlIHJlY29nbml6ZWQsIGtleXdvcmRzIHRoYXQgcmVzZW1ibGUgZWFjaAogICAgb3RoZXIgaW4gc3ludGF4LCBzdWNoIGFzIDxjb2RlPndoaWxlPC9jb2RlPiBhbmQgPGNvZGU+aWY8L2NvZGU+LAogICAgYXJlIHRyZWF0ZWQgaW4gcHJlY2lzZWx5IHRoZSBzYW1lIHdheSwgYXMgYXJlIDxjb2RlPnRyeTwvY29kZT4gYW5kCiAgICA8Y29kZT5lbHNlPC9jb2RlPiAmI3gyMDE1OyB0aGUgcGFyc2VyIGRvZXNuJ3QgbWluZCBpZiBhbgogICAgPGNvZGU+ZWxzZTwvY29kZT4gYXBwZWFycyB3aXRob3V0IGFuIDxjb2RlPmlmPC9jb2RlPi4gU3R1ZmYgdGhhdAogICAgYmluZHMgdmFyaWFibGVzLCA8Y29kZT52YXI8L2NvZGU+LCA8Y29kZT5mdW5jdGlvbjwvY29kZT4sIGFuZAogICAgPGNvZGU+Y2F0Y2g8L2NvZGU+IHRvIGJlIHByZWNpc2UsIGlzIHRyZWF0ZWQgd2l0aCBtb3JlIGNhcmUsCiAgICBiZWNhdXNlIHRoZSBwYXJzZXIgd2FudHMgdG8ga25vdyBhYm91dCBsb2NhbCB2YXJpYWJsZXMuPC9wPgoKICAgIDxwPkluc2lkZSB0aGUgcGFyc2VyLCB0aHJlZSBraW5kcyBvZiBjb250ZXh0IGFyZSBzdG9yZWQuIEZpcnN0bHksIGEgc2V0CiAgICBvZiBrbm93biBsb2NhbCB2YXJpYWJsZXMsIHdoaWNoIGlzIHVzZWQgdG8gYWRqdXN0IHRoZSBzdHlsZSBvZgogICAgdmFyaWFibGUgdG9rZW5zLiBFdmVyeSB0aW1lIHRoZSBwYXJzZXIgZW50ZXJzIGEgZnVuY3Rpb24sIGEgbmV3IHNldCBvZgogICAgdmFyaWFibGVzIGlzIGNyZWF0ZWQuIElmIHRoZXJlIHdhcyBhbHJlYWR5IHN1Y2ggYSBzZXQgKGVudGVyaW5nIGFuCiAgICBpbm5lciBmdW5jdGlvbiksIGEgcG9pbnRlciB0byB0aGUgb2xkIG9uZSBpcyBzdG9yZWQgaW4gdGhlIG5ldyBvbmUuIEF0CiAgICB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbiwgdGhlIGN1cnJlbnQgdmFyaWFibGUgc2V0IGlzICdwb3BwZWQnIG9mZiBhbmQKICAgIHRoZSBwcmV2aW91cyBvbmUgaXMgcmVzdG9yZWQuPC9wPgoKICAgIDxwPlRoZSBzZWNvbmQga2luZCBvZiBjb250ZXh0IGlzIHRoZSBsZXhpY2FsIGNvbnRleHQsIHRoaXMga2VlcHMgdHJhY2sgb2YKICAgIHdoZXRoZXIgd2UgYXJlIGluc2lkZSBhIHN0YXRlbWVudCwgYmxvY2ssIG9yIGxpc3QuIExpa2UgdGhlIHZhcmlhYmxlCiAgICBjb250ZXh0LCBpdCBhbHNvIGZvcm1zIGEgc3RhY2sgb2YgY29udGV4dHMsIHdpdGggZWFjaCBvbmUgY29udGFpbmluZyBhCiAgICBwb2ludGVyIHRvIHRoZSBwcmV2aW91cyBvbmVzIHNvIHRoYXQgdGhleSBjYW4gYmUgcG9wcGVkIG9mZiBhZ2FpbiB3aGVuCiAgICB0aGV5IGFyZSBmaW5pc2hlZC4gVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIGZvciBpbmRlbnRhdGlvbi4gRXZlcnkKICAgIHRpbWUgdGhlIHBhcnNlciBlbmNvdW50ZXJzIGEgbmV3bGluZSB0b2tlbiwgaXQgYXR0YWNoZXMgdGhlIGN1cnJlbnQKICAgIGxleGljYWwgY29udGV4dCBhbmQgYSAnY29weScgb2YgaXRzZWxmIChtb3JlIGFib3V0IHRoYXQgbGF0ZXIpIHRvIHRoaXMKICAgIHRva2VuLjwvcD4KCiAgICA8cD5UaGUgdGhpcmQgY29udGV4dCBpcyBhIGNvbnRpbnVhdGlvbiBjb250ZXh0LiBUaGlzIHBhcnNlciBkb2VzIG5vdCB1c2UKICAgIHN0cmFpZ2h0IGNvbnRpbnVhdGlvbiBzdHlsZSwgaW5zdGVhZCBpdCB1c2VzIGEgc3RhY2sgb2YgYWN0aW9ucyB0aGF0CiAgICBoYXZlIHRvIGJlIHBlcmZvcm1lZC4gVGhlc2UgYWN0aW9ucyBhcmUgc2ltcGxlIGZ1bmN0aW9ucywgYSBraW5kIG9mCiAgICBtaW5pbGFuZ3VhZ2UsIHRoZXkgYWN0IG9uIHRva2VucywgYW5kIGRlY2lkZSB3aGF0IGtpbmQgb2YgbmV3IGFjdGlvbnMKICAgIHNob3VsZCBiZSBwdXNoZWQgb250byB0aGUgc3RhY2suIEhlcmUgYXJlIHNvbWUgZXhhbXBsZXM6PC9wPgoKPHByZSBjbGFzcz0iY29kZSI+PHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPmZ1bmN0aW9uPC9zcGFuPiA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmV4cHJlc3Npb248L3NwYW4+KDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZWRlZiI+dHlwZTwvc3Bhbj4pewogIDxzcGFuIGNsYXNzPSJqcy1rZXl3b3JkIj5pZjwvc3Bhbj4gKDxzcGFuIGNsYXNzPSJqcy1sb2NhbHZhcmlhYmxlIj50eXBlPC9zcGFuPiBpbiA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmF0b21pY1R5cGVzPC9zcGFuPikgPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5jb250PC9zcGFuPig8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPm1heWJlb3BlcmF0b3I8L3NwYW4+KTsKICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+ZWxzZTwvc3Bhbj4gPHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPmlmPC9zcGFuPiAoPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPnR5cGU8L3NwYW4+ID09IDxzcGFuIGNsYXNzPSJqcy1zdHJpbmciPiZxdW90O2Z1bmN0aW9uJnF1b3Q7PC9zcGFuPikgPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5jb250PC9zcGFuPig8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmZ1bmN0aW9uZGVmPC9zcGFuPik7CiAgPHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPmVsc2U8L3NwYW4+IDxzcGFuIGNsYXNzPSJqcy1rZXl3b3JkIj5pZjwvc3Bhbj4gKDxzcGFuIGNsYXNzPSJqcy1sb2NhbHZhcmlhYmxlIj50eXBlPC9zcGFuPiA9PSA8c3BhbiBjbGFzcz0ianMtc3RyaW5nIj4mcXVvdDsoJnF1b3Q7PC9zcGFuPikgPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5jb250PC9zcGFuPig8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPnB1c2hsZXg8L3NwYW4+KDxzcGFuIGNsYXNzPSJqcy1zdHJpbmciPiZxdW90O2xpc3QmcXVvdDs8L3NwYW4+KSwgPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5leHByZXNzaW9uPC9zcGFuPiwgPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5leHBlY3Q8L3NwYW4+KDxzcGFuIGNsYXNzPSJqcy1zdHJpbmciPiZxdW90OykmcXVvdDs8L3NwYW4+KSwgPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5wb3BsZXg8L3NwYW4+KTsKICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+ZWxzZTwvc3Bhbj4gPHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPmlmPC9zcGFuPiAoPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPnR5cGU8L3NwYW4+ID09IDxzcGFuIGNsYXNzPSJqcy1zdHJpbmciPiZxdW90O29wZXJhdG9yJnF1b3Q7PC9zcGFuPikgPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5jb250PC9zcGFuPig8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmV4cHJlc3Npb248L3NwYW4+KTsKICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+ZWxzZTwvc3Bhbj4gPHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPmlmPC9zcGFuPiAoPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPnR5cGU8L3NwYW4+ID09IDxzcGFuIGNsYXNzPSJqcy1zdHJpbmciPiZxdW90O1smcXVvdDs8L3NwYW4+KSA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmNvbnQ8L3NwYW4+KDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZSI+cHVzaGxleDwvc3Bhbj4oPHNwYW4gY2xhc3M9ImpzLXN0cmluZyI+JnF1b3Q7bGlzdCZxdW90Ozwvc3Bhbj4pLCA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmNvbW1hc2VwPC9zcGFuPig8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmV4cHJlc3Npb248L3NwYW4+KSwgPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5leHBlY3Q8L3NwYW4+KDxzcGFuIGNsYXNzPSJqcy1zdHJpbmciPiZxdW90O10mcXVvdDs8L3NwYW4+KSwgPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5wb3BsZXg8L3NwYW4+KTsKICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+ZWxzZTwvc3Bhbj4gPHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPmlmPC9zcGFuPiAoPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPnR5cGU8L3NwYW4+ID09IDxzcGFuIGNsYXNzPSJqcy1zdHJpbmciPiZxdW90O3smcXVvdDs8L3NwYW4+KSA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmNvbnQ8L3NwYW4+KDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZSI+cHVzaGxleDwvc3Bhbj4oPHNwYW4gY2xhc3M9ImpzLXN0cmluZyI+JnF1b3Q7bGlzdCZxdW90Ozwvc3Bhbj4pLCA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmNvbW1hc2VwPC9zcGFuPig8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPm9ianByb3A8L3NwYW4+KSwgPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5leHBlY3Q8L3NwYW4+KDxzcGFuIGNsYXNzPSJqcy1zdHJpbmciPiZxdW90O30mcXVvdDs8L3NwYW4+KSwgPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5wb3BsZXg8L3NwYW4+KTsKICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+ZWxzZTwvc3Bhbj4gPHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPmlmPC9zcGFuPiAoPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPnR5cGU8L3NwYW4+ID09IDxzcGFuIGNsYXNzPSJqcy1zdHJpbmciPiZxdW90O2tleXdvcmQgYyZxdW90Ozwvc3Bhbj4pIDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZSI+Y29udDwvc3Bhbj4oPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5leHByZXNzaW9uPC9zcGFuPik7Cn0KCjxzcGFuIGNsYXNzPSJqcy1rZXl3b3JkIj5mdW5jdGlvbjwvc3Bhbj4gPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5ibG9jazwvc3Bhbj4oPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlZGVmIj50eXBlPC9zcGFuPil7CiAgPHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPmlmPC9zcGFuPiAoPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPnR5cGU8L3NwYW4+ID09IDxzcGFuIGNsYXNzPSJqcy1zdHJpbmciPiZxdW90O30mcXVvdDs8L3NwYW4+KSA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmNvbnQ8L3NwYW4+KCk7CiAgPHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPmVsc2U8L3NwYW4+IDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZSI+cGFzczwvc3Bhbj4oPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5zdGF0ZW1lbnQ8L3NwYW4+LCA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmJsb2NrPC9zcGFuPik7Cn08L3ByZT4KCiAgICA8cD5UaGUgZnVuY3Rpb24gPGNvZGU+Y29udDwvY29kZT4gKGZvciBjb250aW51ZSksIHdpbGwgcHVzaCB0aGUgYWN0aW9ucyBpdCBpcyBnaXZlbgogICAgb250byB0aGUgc3RhY2sgKGluIHJldmVyc2Ugb3JkZXIsIHNvIHRoYXQgdGhlIGZpcnN0IG9uZSB3aWxsIGJlIHBvcHBlZAogICAgZmlyc3QpLiBBY3Rpb25zIHN1Y2ggYXMgPGNvZGU+cHVzaGxleDwvY29kZT4gYW5kIDxjb2RlPnBvcGxleDwvY29kZT4gbWVyZWx5IGFkanVzdCB0aGUKICAgIGxleGljYWwgZW52aXJvbm1lbnQsIHdoaWxlIG90aGVycywgc3VjaCBhcyA8Y29kZT5leHByZXNzaW9uPC9jb2RlPiBpdHNlbGYsIGRvCiAgICBhY3R1YWwgcGFyc2luZy4gPGNvZGU+cGFzczwvY29kZT4sIGFzIHNlZW4gaW4gPGNvZGU+YmxvY2s8L2NvZGU+LCBpcyBzaW1pbGFyIHRvIDxjb2RlPmNvbnQ8L2NvZGU+LCBidXQKICAgIGl0IGRvZXMgbm90ICdjb25zdW1lJyB0aGUgY3VycmVudCB0b2tlbiwgc28gdGhlIG5leHQgYWN0aW9uIHdpbGwgYWdhaW4KICAgIHNlZSB0aGlzIHNhbWUgdG9rZW4uIEluIDxjb2RlPmJsb2NrPC9jb2RlPiwgdGhpcyBoYXBwZW5zIHdoZW4gdGhlIGZ1bmN0aW9uCiAgICBkZXRlcm1pbmVzIHRoYXQgd2UgYXJlIG5vdCBhdCB0aGUgZW5kIG9mIHRoZSBibG9jayB5ZXQsIHNvIGl0IHB1c2hlcwogICAgdGhlIDxjb2RlPnN0YXRlbWVudDwvY29kZT4gZnVuY3Rpb24gd2hpY2ggd2lsbCBpbnRlcnByZXQgdGhlIGN1cnJlbnQgdG9rZW4gYXMgdGhlCiAgICBzdGFydCBvZiBhIHN0YXRlbWVudC48L3A+CgogICAgPHA+VGhlc2UgYWN0aW9ucyBhcmUgY2FsbGVkIGJ5IGEgJ2RyaXZlcicgZnVuY3Rpb24sIHdoaWNoIGZpbHRlcnMgb3V0IHRoZQogICAgd2hpdGVzcGFjZSBhbmQgY29tbWVudHMsIHNvIHRoYXQgdGhlIHBhcnNlciBhY3Rpb25zIGRvIG5vdCBoYXZlIHRvCiAgICB0aGluayBhYm91dCB0aG9zZSwgYW5kIGtlZXBzIHRyYWNrIG9mIHNvbWUgdGhpbmdzIGxpa2UgdGhlIGluZGVudGF0aW9uCiAgICBvZiB0aGUgY3VycmVudCBsaW5lIGFuZCB0aGUgY29sdW1uIGF0IHdoaWNoIHRoZSBjdXJyZW50IHRva2VuIGVuZHMsCiAgICB3aGljaCBhcmUgc3RvcmVkIGluIHRoZSBsZXhpY2FsIGNvbnRleHQgYW5kIHVzZWQgZm9yIGluZGVudGF0aW9uLgogICAgQWZ0ZXIgY2FsbGluZyBhbiBhY3Rpb24sIGlmIHRoZSBhY3Rpb24gY2FsbGVkIDxjb2RlPmNvbnQ8L2NvZGU+LCB0aGlzIGRyaXZlcgogICAgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIGN1cnJlbnQgdG9rZW4sIGlmIDxjb2RlPnBhc3M8L2NvZGU+IChvciBub3RoaW5nKSB3YXMKICAgIGNhbGxlZCwgaXQgd2lsbCBpbW1lZGlhdGVseSBjb250aW51ZSB3aXRoIHRoZSBuZXh0IGFjdGlvbi48L3A+CgogICAgPHA+VGhpcyBnb2VzIHRvIHNob3cgdGhhdCBpdCBpcyB2aWFibGUgdG8gd3JpdGUgYSBxdWl0ZSBlbGFib3JhdGUKICAgIG1pbmlsYW5ndWFnZSBpbiBhIG1hY3JvLWxlc3MgbGFuZ3VhZ2UgbGlrZSBKYXZhU2NyaXB0LiBJIGRvbid0IHRoaW5rCiAgICBpdCB3b3VsZCBiZSBwb3NzaWJsZSB0byBkbyBzb21ldGhpbmcgbGlrZSB0aGlzIHdpdGhvdXQgY2xvc3VyZXMgKG9yCiAgICBzaW1pbGFybHkgcG93ZXJmdWwgYWJzdHJhY3Rpb24pIHRob3VnaCwgSSd2ZSBjZXJ0YWlubHkgbmV2ZXIgc2VlbgogICAgYW55dGhpbmcgbGlrZSBpdCBpbiBKYXZhIGNvZGUuPC9wPgoKICAgIDxwPlRoZSB3YXkgYSAnY29weScgb2YgdGhlIHBhcnNlciB3YXMgcHJvZHVjZWQgc2hvd3MgYSBuaWNlIHVzYWdlCiAgICBvZiBjbG9zdXJlcy4gTGlrZSB3aXRoIHRoZSBET00gdHJhbnNmb3JtZXIgc2hvd24gYWJvdmUsIG1vc3Qgb2YKICAgIHRoZSBsb2NhbCBzdGF0ZSBvZiB0aGUgcGFyc2VyIGlzIGhlbGQgaW4gYSBjbG9zdXJlIHByb2R1Y2VkIGJ5CiAgICBjYWxsaW5nIDxjb2RlPnBhcnNlKHN0cmVhbSk8L2NvZGU+LiBUaGUgZnVuY3Rpb24KICAgIDxjb2RlPmNvcHk8L2NvZGU+LCB3aGljaCBpcyBsb2NhbCB0byB0aGUgcGFyc2VyIGZ1bmN0aW9uLCBwcm9kdWNlcwogICAgYSBuZXcgY2xvc3VyZSwgd2l0aCBjb3BpZXMgb2YgYWxsIHRoZSByZWxldmFudCB2YXJpYWJsZXM6PC9wPgoKPHByZSBjbGFzcz0iY29kZSI+PHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPmZ1bmN0aW9uPC9zcGFuPiA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmNvcHk8L3NwYW4+KCl7CiAgPHNwYW4gY2xhc3M9ImpzLWtleXdvcmQiPnZhcjwvc3Bhbj4gPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlZGVmIj5fY29udGV4dDwvc3Bhbj4gPSA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmNvbnRleHQ8L3NwYW4+LCA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGVkZWYiPl9sZXhpY2FsPC9zcGFuPiA9IDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZSI+bGV4aWNhbDwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZWRlZiI+X2FjdGlvbnM8L3NwYW4+ID0gPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5jb3B5QXJyYXk8L3NwYW4+KDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZSI+YWN0aW9uczwvc3Bhbj4pOwoKICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+cmV0dXJuPC9zcGFuPiA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+ZnVuY3Rpb248L3NwYW4+KDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZWRlZiI+X3Rva2Vuczwvc3Bhbj4pewogICAgPHNwYW4gY2xhc3M9ImpzLXZhcmlhYmxlIj5jb250ZXh0PC9zcGFuPiA9IDxzcGFuIGNsYXNzPSJqcy1sb2NhbHZhcmlhYmxlIj5fY29udGV4dDwvc3Bhbj47CiAgICA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmxleGljYWw8L3NwYW4+ID0gPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPl9sZXhpY2FsPC9zcGFuPjsKICAgIDxzcGFuIGNsYXNzPSJqcy12YXJpYWJsZSI+YWN0aW9uczwvc3Bhbj4gPSA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPmNvcHlBcnJheTwvc3Bhbj4oPHNwYW4gY2xhc3M9ImpzLWxvY2FsdmFyaWFibGUiPl9hY3Rpb25zPC9zcGFuPik7CiAgICA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPnRva2Vuczwvc3Bhbj4gPSA8c3BhbiBjbGFzcz0ianMtbG9jYWx2YXJpYWJsZSI+X3Rva2Vuczwvc3Bhbj47CiAgICA8c3BhbiBjbGFzcz0ianMta2V5d29yZCI+cmV0dXJuPC9zcGFuPiA8c3BhbiBjbGFzcz0ianMtdmFyaWFibGUiPnBhcnNlcjwvc3Bhbj47CiAgfTsKfTwvcHJlPgoKICAgIDxwPldoZXJlIDxjb2RlPnBhcnNlcjwvY29kZT4gaXMgdGhlIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSA8Y29kZT5uZXh0PC9jb2RlPiAoZHJpdmVyKQogICAgZnVuY3Rpb24sIGFuZCBhIHJlZmVyZW5jZSB0byB0aGlzIDxjb2RlPmNvcHk8L2NvZGU+IGZ1bmN0aW9uLiBXaGVuIHRoZSBmdW5jdGlvbgogICAgdGhhdCA8Y29kZT5jb3B5PC9jb2RlPiBwcm9kdWNlcyBpcyBjYWxsZWQgd2l0aCBhIHRva2VuIHN0cmVhbSBhcyBhcmd1bWVudCwgaXQKICAgIHVwZGF0ZXMgdGhlIGxvY2FsIHZhcmlhYmxlcyBpbiB0aGUgcGFyc2VyIGNsb3N1cmUsIGFuZCByZXR1cm5zIHRoZQogICAgY29ycmVzcG9uZGluZyBpdGVyYXRvciBvYmplY3QuPC9wPgoKICAgIDxwPk1vdmluZyBvbiwgd2UgZ2V0IHRvIHRoZSBsYXN0IHN0b3AgaW4gdGhpcyBjaGFpbiBvZiBnZW5lcmF0b3JzLCB0aGUKICAgIGFjdHVhbCBoaWdobGlnaHRlci4gWW91IGNhbiB2aWV3IHRoaXMgb25lIGFzIHRha2luZyB0d28gc3RyZWFtcyBhcwogICAgaW5wdXQsIG9uIHRoZSBvbmUgaGFuZCB0aGVyZSBpcyB0aGUgc3RyZWFtIG9mIHRva2VucyBmcm9tIHRoZSBwYXJzZXIsCiAgICBhbmQgb24gdGhlIG90aGVyIGhhbmQgdGhlcmUgaXMgdGhlIERPTSB0cmVlIGFzIGxlZnQgYnkgdGhlIERPTQogICAgdHJhbnNmb3JtZXIuIElmIGV2ZXJ5dGhpbmcgd2VudCBjb3JyZWN0bHksIHRoZXNlIHR3byBzaG91bGQgYmUKICAgIHN5bmNocm9uaXplZC4gVGhlIGhpZ2hsaWdodGVyIGNhbiBsb29rIGF0IHRoZSBjdXJyZW50IHRva2VuLCBzZWUgaWYKICAgIHRoZSA8Y29kZT5zcGFuPC9jb2RlPiBpbiB0aGUgRE9NIHRyZWUgY29ycmVzcG9uZHMgdG8gaXQgKGhhcyB0aGUgc2FtZSB0ZXh0CiAgICBjb250ZW50LCBhbmQgdGhlIGNvcnJlY3QgY2xhc3MpLCBhbmQgaWYgbm90IGl0IGNhbiBjaG9wIHVwIHRoZSBET00KICAgIG5vZGVzIHRvIGNvbmZvcm0gdG8gdGhlIHRva2Vucy48L3A+CgogICAgPHA+RXZlcnkgdGltZSB0aGUgcGFyc2VyIHlpZWxkcyBhIG5ld2xpbmUgdG9rZW4sIHRoZSBoaWdobGlnaGVyCiAgICBlbmNvdW50ZXJzIGEgPGNvZGU+YnI8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIERPTSBzdHJlYW0uIEl0IHRha2VzIHRoZSBjb3B5IG9mIHRoZQogICAgcGFyc2VyIGFuZCB0aGUgbGV4aWNhbCBjb250ZXh0IGZyb20gdGhpcyB0b2tlbiBhbmQgYXR0YWNoZXMgdGhlbSB0bwogICAgdGhlIERPTSBub2RlLiBUaGlzIHdheSwgYSBuZXcgaGlnaGxpZ2h0aW5nIHByb2Nlc3MgY2FuIGJlIHN0YXJ0ZWQgZnJvbQogICAgdGhhdCBub2RlIGJ5IHJlLXN0YXJ0aW5nIHRoZSBjb3B5IG9mIHRoZSBwYXJzZXIgd2l0aCBhIG5ldyB0b2tlbgogICAgc3RyZWFtLCB3aGljaCByZWFkcyB0b2tlbnMgZnJvbSB0aGUgRE9NIG5vZGVzIHN0YXJ0aW5nIGF0IHRoYXQgPGNvZGU+YnI8L2NvZGU+CiAgICBlbGVtZW50LCBhbmQgdGhlIGluZGVudGF0aW9uIGNvZGUgY2FuIHVzZSB0aGUgbGV4aWNhbCBjb250ZXh0CiAgICBpbmZvcm1hdGlvbiB0byBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgaW5kZW50YXRpb24gYXQgdGhhdCBwb2ludC48L3A+CgogICAgPGgyPlNlbGVjdGlvbiB3b2VzPC9oMj4KCiAgICA8cD5BbGwgdGhlIGFib3ZlIGNhbiBiZSBkb25lIHVzaW5nIHRoZSBET00gaW50ZXJmYWNlIHRoYXQgYWxsIG1ham9yCiAgICBicm93c2VycyBoYXZlIGluIGNvbW1vbiwgYW5kIHdoaWNoIGlzIHJlbGF0aXZlbHkgZnJlZSBvZiB3ZWlyZCBidWdzCiAgICBhbmQgYWJiZXJyYXRpb25zLiBIb3dldmVyLCB3aGVuIHRoZSB1c2VyIGlzIHR5cGluZyBpbiBuZXcgY29kZSwgdGhpcwogICAgbXVzdCBhbHNvIGJlIGhpZ2hsaWdodGVkLiBGb3IgdGhpcyB0byBoYXBwZW4sIHRoZSBwcm9ncmFtIG11c3Qga25vdwogICAgd2hlcmUgdGhlIGN1cnNvciBjdXJyZW50bHkgaXMsIGFuZCBiZWNhdXNlIGl0IG11Y2tzIHVwIHRoZSBET00gdHJlZSwKICAgIGl0IGhhcyB0byByZXN0b3JlIHRoaXMgY3Vyc29yIHBvc2l0aW9uIGFmdGVyIGRvaW5nIHRoZSBoaWdobGlnaHRpbmcuPC9wPgoKICAgIDxwPlJlLWhpZ2hsaWdodGluZyBhbHdheXMgaGFwcGVucyBwZXIgbGluZSwgYmVjYXVzZSB0aGUgY29weSBvZiB0aGUKICAgIHBhcnNlciBpcyBzdG9yZWQgb25seSBhdCB0aGUgZW5kIG9mIGxpbmVzLiBEb2luZyB0aGlzIGV2ZXJ5IHRpbWUgdGhlCiAgICB1c2VyIHByZXNzZXMgYSBrZXkgaXMgdGVycmlibHkgc2xvdyBhbmQgb2Jub3hpb3VzLCBzbyB3aGF0IEkgZGlkIHdhcwogICAga2VlcCBhIGxpc3Qgb2YgJ2RpcnR5JyBub2RlcywgYW5kIGFzIHNvb24gYXMgdGhlIHVzZXIgZGlkbid0IHR5cGUKICAgIGFueXRpbmcgZm9yIDMwMCBtaWxsaXNlY29uZHMgdGhlIHByb2dyYW0gc3RhcnRzIHJlLWhpZ2hsaWdodGluZyB0aGVzZQogICAgbm9kZXMuIElmIGl0IGZpbmRzIG1vcmUgdGhhbiB0ZW4gbGluZXMgbXVzdCBiZSByZS1wYXJzZWQsIGl0IGRvZXMgb25seQogICAgdGVuIGFuZCB3YWl0cyBhbm90aGVyIDMwMCBtaWxsaXNlY29uZHMgYmVmb3JlIGl0IGNvbnRpbnVlcywgdGhpcyB3YXkKICAgIHRoZSBicm93c2VyIG5ldmVyIGZyZWV6ZXMgdXAgZW50aXJlbHkuPC9wPgoKICAgIDxwPkFzIG1lbnRpb25lZCBlYXJsaWVyLCBJbnRlcm5ldCBFeHBsb3JlcidzIHNlbGVjdGlvbiBtb2RlbCBpcyBub3QgdGhlCiAgICBtb3N0IHByYWN0aWNhbCBvbmUuIE15IGF0dGVtcHRzIHRvIGJ1aWxkIGEgd3JhcHBlciB0aGF0IG1ha2VzIGl0IGxvb2sKICAgIGxpa2UgdGhlIFczQyBtb2RlbCBhbGwgc3RyYW5kZWQuIEluIHRoZSBlbmQgSSBjYW1lIHRvIHRoZSBjb25jbHVzaW9uCiAgICB0aGF0IEkgb25seSBuZWVkZWQgdHdvIG9wZXJhdGlvbnM6PC9wPgoKICAgIDx1bD4KICAgICAgPGxpPkNyZWF0aW5nIGEgc2VsZWN0aW9uICdzbmFwc2hvdCcgdGhhdCBjYW4gYmUgcmVzdG9yZWQgYWZ0ZXIKICAgICAgaGlnaGxpZ2h0aW5nLCBpbiBzdWNoIGEgd2F5IHRoYXQgaXQgc3RpbGwgd29ya3MgaWYgc29tZSBvZiB0aGUgbm9kZXMKICAgICAgdGhhdCB3ZXJlIHNlbGVjdGVkIGFyZSByZXBsYWNlZCBieSBvdGhlciBub2RlcyB3aXRoIHRoZSBzYW1lCiAgICAgIHNpemUgYnV0IGEgZGlmZmVyZW50IHN0cnVjdHVyZS48L2xpPgogICAgICA8bGk+RmluZGluZyB0aGUgdG9wLWxldmVsIG5vZGUgYXJvdW5kIG9yIGJlZm9yZSB0aGUgY3Vyc29yLCB0byBtYXJrIGl0CiAgICAgIGRpcnR5IG9yIHRvIGluc2VydCBpbmRlbnRhdGlvbiB3aGl0ZXNwYWNlIGF0IHRoZSBzdGFydCBvZiB0aGF0IGxpbmUuPC9saT4KICAgIDwvdWw+CgogICAgPHA+SXQgdHVybnMgb3V0IHRoYXQgdGhlIHBpeGVsLWJhc2VkIHNlbGVjdGlvbiBtb2RlbCB0aGF0IEludGVybmV0CiAgICBFeHBsb3JlciB1c2VzLCB3aGljaCBhbHdheXMgc2VlbWVkIGNvbXBsZXRlbHkgbHVkcmljcm91cyB0byBtZSwgaXMKICAgIHBlcmZlY3QgZm9yIHRoZSBmaXJzdCBjYXNlLiBTaW5jZSB0aGUgRE9NIHRyYW5zZm9ybWF0aW9uIChnZW5lcmFsbHkpCiAgICBkb2VzIG5vdCBjaGFuZ2UgdGhlIHBvc2l0aW9uIG9mIHRoaW5ncywgc3RvcmluZyB0aGUgcGl4ZWwgb2Zmc2V0cyBvZgogICAgdGhlIHNlbGVjdGlvbiBtYWtlcyBpdCBwb3NzaWJsZSB0byByZXN0b3JlIHRoYXQgc2FtZSBzZWxlY3Rpb24sIG5ldmVyCiAgICBtaW5kIHdoYXQgaGFwcGVuZWQgdG8gdGhlIHVuZGVybHlpbmcgRE9NIHN0cnVjdHVyZS48L3A+CgogICAgPHA+W0xhdGVyIGFkZGl0aW9uOiBOb3RlIHRoYXQgdGhpcywgZHVlIHRvIHRoZSB2ZXJ5IHJhbmRvbSBkZXNpZ24KICAgIG9mIHRoZSA8YQogICAgaHJlZj0iaHR0cDovL21zZG4yLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczUzNTg3MihWUy44NSkuYXNweCMiPlRleHRSYW5nZQogICAgaW50ZXJmYWNlPC9hPiwgb25seSByZWFsbHkgd29ya3Mgd2hlbiB0aGUgd2hvbGUgc2VsZWN0aW9uIGZhbGxzCiAgICB3aXRoaW4gdGhlIHZpc2libGUgcGFydCBvZiB0aGUgZG9jdW1lbnQuXTwvcD4KCiAgICA8cD5Eb2luZyB0aGUgc2FtZSB3aXRoIHRoZSBXM0Mgc2VsZWN0aW9uIG1vZGVsIGlzIGEgbG90IGhhcmRlci4gV2hhdCBJCiAgICBlbmRlZCB1cCB3aXRoIHdhcyB0aGlzOjwvcD4KCiAgICA8dWw+CiAgICAgIDxsaT5DcmVhdGUgYW4gb2JqZWN0IHBvaW50aW5nIHRvIHRoZSBub2RlcyBhdCB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUKICAgICAgc2VsZWN0aW9uLCBhbmQgdGhlIG9mZnNldCB3aXRoaW4gdGhvc2Ugbm9kZXMuIFRoaXMgaXMgYmFzaWNhbGx5IHRoZQogICAgICBpbmZvcm1hdGlvbiB0aGF0IHRoZSA8Y29kZT5SYW5nZTwvY29kZT4gb2JqZWN0IGdpdmVzIHlvdS48L2xpPgogICAgICA8bGk+TWFrZSByZWZlcmVuY2VzIGZyb20gdGhlc2Ugbm9kZXMgYmFjayB0byB0aGF0IG9iamVjdC48L2xpPgogICAgICA8bGk+V2hlbiByZXBsYWNpbmcgKHBhcnQgb2YpIGEgbm9kZSB3aXRoIGFub3RoZXIgb25lLCBjaGVjayBmb3Igc3VjaCBhCiAgICAgIHJlZmVyZW5jZSwgYW5kIHdoZW4gaXQgaXMgcHJlc2VudCwgY2hlY2sgd2hldGhlciB0aGlzIG5ldyBub2RlIHdpbGwKICAgICAgZ2V0IHRoZSBzZWxlY3Rpb24uIElmIGl0IGRvZXMsIG1vdmUgdGhlIHJlZmVyZW5jZSBmcm9tIHRoZSBvbGQgdG8gdGhlCiAgICAgIG5ldyBub2RlLCBpZiBpdCBkb2VzIG5vdCwgYWRqdXN0IHRoZSBvZmZzZXQgaW4gdGhlIHNlbGVjdGlvbiBvYmplY3QgdG8KICAgICAgcmVmbGVjdCB0aGUgZmFjdCB0aGF0IHBhcnQgb2YgdGhlIG9sZCBub2RlIGhhcyBiZWVuIHJlcGxhY2VkLjwvbGk+CiAgICA8L3VsPgoKICAgIDxwPk5vdyBpbiB0aGUgc2Vjb25kIGNhc2UgKGdldHRpbmcgdGhlIHRvcC1sZXZlbCBub2RlIGF0IHRoZQogICAgY3Vyc29yKSB0aGUgSW50ZXJuZXQgRXhwbG9yZXIgY2hlYXQgZG9lcyBub3Qgd29yay4gSW4gdGhlIFczQwogICAgbW9kZWwgdGhpcyBpcyByYXRoZXIgZWFzeSwgeW91IGhhdmUgdG8gZG8gc29tZSBjcmVhdGl2ZSBwYXJlbnQtCiAgICBhbmQgc2libGluZy1wb2ludGVyIGZvbGxvd2luZyB0byBhcnJpdmUgYXQgdGhlIGNvcnJlY3QgdG9wLWxldmVsCiAgICBub2RlLCBidXQgbm90aGluZyB3ZWlyZC4gSW4gSW50ZXJuZXQgRXhwbG9yZXIsIGFsbCB3ZSBoYXZlIHRvIGdvCiAgICBvbiBpcyB0aGUgPGNvZGU+cGFyZW50RWxlbWVudDwvY29kZT4gbWV0aG9kIG9uIGEKICAgIDxjb2RlPlRleHRSYW5nZTwvY29kZT4sIHdoaWNoIGdpdmVzIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQKICAgIGNvbXBsZXRlbHkgZW52ZWxvcHMgdGhlIHNlbGVjdGlvbi4gSWYgdGhlIGN1cnNvciBpcyBpbnNpZGUgYSB0ZXh0CiAgICBub2RlLCB0aGlzIGlzIGdvb2QsIHRoYXQgdGV4dCBub2RlIHRlbGxzIHVzIHdoZXJlIHdlIGFyZS4gSWYgdGhlCiAgICBjdXJzb3IgaXMgYmV0d2VlbiBub2RlcywgZm9yIGV4YW1wbGUgYmV0d2VlbiB0d28gPGNvZGU+YnI8L2NvZGU+CiAgICBub2RlcywgeW91IGdldCB0byB0b3AtbGV2ZWwgbm9kZSBpdHNlbGYgYmFjaywgd2hpY2ggaXMgcmVtYXJrYWJseQogICAgdXNlbGVzcy4gSW4gY2FzZXMgbGlrZSB0aGlzIEkgc3Rvb3AgdG8gYSByYXRoZXIgdWdseSBoYWNrICh3aGljaAogICAgZm9ydHVuYXRlbHkgdHVybmVkIG91dCB0byBiZSBhY2NlcHRhYmx5IGZhc3QpICYjeDIwMTU7IEkgY3JlYXRlIGEKICAgIHRlbXBvcmFyeSBlbXB0eSA8Y29kZT5zcGFuPC9jb2RlPiB3aXRoIGFuIElEIGluc2lkZSB0aGUgc2VsZWN0aW9uLAogICAgZ2V0IGEgcmVmZXJlbmNlIHRvIHRoaXMgPGNvZGU+c3BhbjwvY29kZT4gYnkgSUQsIHRha2UgaXRzCiAgICA8Y29kZT5wcmV2aW91c1NpYmxpbmc8L2NvZGU+LCBhbmQgcmVtb3ZlIGl0IGFnYWluLjwvcD4KCiAgICA8cD5VbmZvcnR1bmF0ZWx5LCBPcGVyYSdzIHNlbGVjdGlvbiBpbXBsZW1lbnRhdGlvbiBpcyBidWdneSwgYW5kIGl0CiAgICB3aWxsIGdpdmUgd2lsZGx5IGluY29ycmVjdCA8Y29kZT5SYW5nZTwvY29kZT4gb2JqZWN0cyB3aGVuIHRoZSBjdXJzb3IKICAgIGlzIGJldHdlZW4gdHdvIG5vZGVzLiBUaGlzIGlzIGEgYml0IG9mIGEgc2hvd3N0b3BwZXIsIGFuZCB1bnRpbCBJIGZpbmQKICAgIGEgd29ya2Fyb3VuZCBmb3IgdGhhdCBvciBpdCBnZXRzIGZpeGVkLCB0aGUgaGlnaGxpZ2h0ZXIgZG9lc24ndCB3b3JrCiAgICBwcm9wZXJseSBpbiBPcGVyYS48L3A+CgogICAgPHA+QWxzbywgd2hlbiBvbmUgcHJlc3NlcyBlbnRlciBpbiBhIDxjb2RlPmRlc2lnbk1vZGU8L2NvZGU+CiAgICBkb2N1bWVudCBpbiBGaXJlZm94IG9yIE9wZXJhLCBhIDxjb2RlPmJyPC9jb2RlPiB0YWcgaXMgaW5zZXJ0ZWQuCiAgICBJbiBJbnRlcm5ldCBFeHBsb3JlciwgcHJlc3NpbmcgZW50ZXIgY2F1c2VzIHNvbWUgbWFuaWFjYWwgZ25vbWUgdG8KICAgIGNvbWUgb3V0IGFuZCBzdGFydCB3cmFwcGluZyBhbGwgdGhlIGNvbnRlbnQgYmVmb3JlIGFuZCBhZnRlciB0aGUKICAgIGN1cnNvciBpbiA8Y29kZT5wPC9jb2RlPiB0YWdzLiBJIHN1cHBvc2UgdGhlcmUgaXMgc29tZXRoaW5nIHRvIGJlCiAgICBzYWlkIGZvciB0aGF0LCBpbiBwcmluY2lwbGUsIHRob3VnaCBpZiB5b3Ugc2F3IHRoZSB0YWcgc291cCBvZgogICAgPGNvZGU+Zm9udDwvY29kZT5zIGFuZCBuZXN0ZWQgcGFyYWdyYXBocyBJbnRlcm5ldCBFeHBsb3JlcgogICAgZ2VuZXJhdGVzIHlvdSB3b3VsZCBzb29uIGVub3VnaCBmb3JnZXQgYWxsIGFib3V0IHByaW5jaXBsZS4KICAgIEFueXdheSwgZ2V0dGluZyB1bndhbnRlZCA8Y29kZT5wPC9jb2RlPiB0YWdzIHNsb3dlZCB0aGUKICAgIGhpZ2hsaWdodGVyIGRvd24gdGVycmlibHkgJiN4MjAxNTsgaXQgaGFkIHRvIG92ZXJoYXVsIHRoZSB3aG9sZQogICAgRE9NIHRyZWUgdG8gcmVtb3ZlIHRoZW0gYWdhaW4sIGV2ZXJ5IHRpbWUgdGhlIHVzZXIgcHJlc3NlZCBlbnRlci4KICAgIEZvcnR1bmF0ZWx5IEkgY291bGQgZml4IHRoaXMgYnkgY2FwdHVyaW5nIHRoZSBlbnRlciBwcmVzc2VzIGFuZAogICAgbWFudWFsbHkgaW5zZXJ0aW5nIGEgPGNvZGU+YnI8L2NvZGU+IHRhZyBhdCB0aGUgY3Vyc29yLjwvcD4KCiAgICA8cD5PbiB0aGUgc3ViamVjdCBvZiBJbnRlcm5ldCBFeHBsb3JlcidzIHRhZyBzb3VwLCBoZXJlIGlzIGFuIGludGVyZXN0aW5nCiAgICBhbmVjZG90ZTogT25lIHRpbWUsIHdoZW4gdGVzdGluZyB0aGUgZWZmZWN0IHRoYXQgbW9kaWZ5aW5nIHRoZSBjb250ZW50CiAgICBvZiBhIHNlbGVjdGlvbiBoYWQsIEkgaW5zcGVjdGVkIHRoZSBET00gdHJlZSBhbmQgZm91bmQgYSA8Y29kZT4iL0IiPC9jb2RlPgogICAgZWxlbWVudC4gVGhpcyB3YXMgbm90IGEgY2xvc2luZyB0YWcsIHRoZXJlIGFyZSBubyBjbG9zaW5nIHRhZ3MgaW4gdGhlCiAgICBET00gdHJlZSwganVzdCBlbGVtZW50cy4gVGhlIDxjb2RlPm5vZGVOYW1lPC9jb2RlPiBvZiB0aGlzIGVsZW1lbnQgd2FzIGFjdHVhbGx5CiAgICA8Y29kZT4iL0IiPC9jb2RlPi4gVGhhdCB3YXMgd2hlbiBJIGdhdmUgdXAgYW55IG5vdGlvbnMgb2YgZXZlciB1bmRlcnN0YW5kaW5nIHRoZQogICAgcHJvZm91bmQgbXlzdGVyeSB0aGF0IGlzIEludGVybmV0IEV4cGxvcmVyLjwvcD4KCiAgICA8aDI+Q2xvc2luZyB0aG91Z2h0czwvaDI+CgogICAgPHA+V2VsbCwgSSBkZXNwYWlyZWQgYXQgdGltZXMsIGJ1dCBJIGRpZCBlbmQgdXAgd2l0aCBhIHdvcmtpbmcgSmF2YVNjcmlwdAogICAgZWRpdG9yLiBJIGRpZCBub3Qga2VlcCB0cmFjayBvZiB0aGUgYW1vdW50IG9mIHRpbWUgSSB3YXN0ZWQgb24gdGhpcywKICAgIGJ1dCBJIHdvdWxkIGVzdGltYXRlIGl0IHRvIGJlIGFyb3VuZCBmaWZ0eSBob3Vycy4gRmluZGluZyB3b3JrYXJvdW5kcwogICAgZm9yIGJyb3dzZXIgYnVncyBjYW4gYmUgYSB0ZXJyaWJseSBub25saW5lYXIgcHJvY2Vzcy4gSSBqdXN0IHNwZW50CiAgICBoYWxmIGEgZGF5IHdvcmtpbmcgb24gYSB3ZWlyZCBnbGl0Y2ggaW4gRmlyZWZveCB0aGF0IGNhdXNlZCB0aGUgY3Vyc29yCiAgICBpbiB0aGUgZWRpdGFibGUgZnJhbWUgdG8gYmUgZGlzcGxheWVkIDMvNCBsaW5lIHRvbyBoaWdoIHdoZW4gaXQgd2FzIGF0CiAgICB0aGUgdmVyeSBlbmQgb2YgdGhlIGRvY3VtZW50LiBUaGVuIEkgZm91bmQgb3V0IHRoYXQgc2V0dGluZyB0aGUKICAgIHN0eWxlLmRpc3BsYXkgb2YgdGhlIGlmcmFtZSB0byAiYmxvY2siIGZpeGVkIHRoaXMgKHdoeSBub3Q/KS4gSSdtCiAgICBhbWF6ZWQgaG93IG9mdGVuIGlzc3VlcyB0aGF0IHNlZW0gaG9wZWxlc3MgZG8gdHVybiBvdXQgdG8gYmUKICAgIGF2b2lkYWJsZSwgZXZlbiBpZiBpdCB0YWtlcyBob3VycyBvZiBzY3Jld2luZyBhcm91bmQgYW5kIHNvbWUgdHJ1bHkKICAgIG5vbi1vYnZpb3VzIGlkZWFzLjwvcD4KCiAgICA8cD5Gb3IgYSBsb3Qgb2YgdGhpbmdzLCBKYXZhU2NyaXB0ICsgRE9NIGVsZW1lbnRzIGFyZSBhIHN1cnByaXNpbmdseQogICAgcG93ZXJmdWwgcGxhdGZvcm0uIFNpbXBsZSBpbnRlcmFjdGl2ZSBkb2N1bWVudHMgYW5kIGZvcm1zIGNhbiBiZQogICAgd3JpdHRlbiBpbiBicm93c2VycyB3aXRoIHZlcnkgbGl0dGxlIGVmZm9ydCwgZ2VuZXJhbGx5IGxlc3MgdGhhbiB3aXRoCiAgICBtb3N0ICd0cmFkaXRpb25hbCcgcGxhdGZvcm1zIChKYXZhLCBXaW4zMiwgdGhpbmdzIGxpa2UgV3hXaWRnZXRzKS4KICAgIExpYnJhcmllcyBsaWtlIERvam8gKGFuZCBhIHNpbWlsYXIgbW9uc3RlciBJIG9uY2Ugd3JvdGUgbXlzZWxmKSBldmVuCiAgICBtYWtlIGNvbXBsZXgsIGNvbXBvc2l0ZSB3aWRnZXRzIHdvcmthYmxlLiBIb3dldmVyLCB3aGVuIGFwcGxpY2F0aW9ucwogICAgZ28gc3VmZmljaWVudGx5IGJleW9uZCB0aGUgdGhpbmdzIHRoYXQgYnJvd3NlcnMgd2VyZSBkZXNpZ25lZCBmb3IsIHRoZQogICAgYXZhaWxhYmxlIEFQSXMgZG8gbm90IGdpdmUgZW5vdWdoIGNvbnRyb2wsIGFyZSBub25zdGFuZGFyZCBhbmQgYnVnZ3ksCiAgICBhbmQgYXJlIG9mdGVuIHBvb3JseSBkZXNpZ25lZC4gQmVjYXVzZSBvZiB0aGlzLCB3cml0aW5nIHN1Y2gKICAgIGFwcGxpY2F0aW9ucywgd2hlbiBpdCBpcyBldmVuIHBvc3NpYmxlLCBpcyA8ZW0+cGFpbmZ1bDwvZW0+IHByb2Nlc3MuPC9wPgoKICAgIDxwPkFuZCB3aG8gbGlrZXMgcGFpbj8gU3VyZSwgd2hlbiBmaW5kaW5nIHRoYXQgY3Jhenkgd29ya2Fyb3VuZCwKICAgIHN1YmR1ZWluZyB0aGUgZGFtbiBicm93c2VyLCBhbmQgZ2V0dGluZyBldmVyeXRoaW5nIHRvIHdvcmssIHRoZXJlCiAgICBpcyBhIGNlcnRhaW4gbWFjaG8gdGhyaWxsLiBCdXQgb25lIGNhbid0IGhlbHAgd29uZGVyaW5nIGhvdyBtdWNoCiAgICBlYXNpZXIgdGhpbmdzIGxpa2UgcHJldmVudGluZyB0aGUgdXNlciBmcm9tIHBhc3RpbmcgcGljdHVyZXMgaW4KICAgIGhpcyBzb3VyY2UgY29kZSB3b3VsZCBiZSBvbiBhbm90aGVyIHBsYXRmb3JtLiBNYXliZSBzb21ldGhpbmcgbGlrZQogICAgU2lsdmVybGlnaHQgb3Igd2hhdGV2ZXIgb3RoZXIgbmV3IGJyb3dzZXIgcGx1Z2luIGdpem1vcyBwZW9wbGUgYXJlCiAgICBwdXNoaW5nIHRoZXNlIGRheXMgd2lsbCBiZWNvbWUgdGhlIHdheSB0byBzb2x2ZSB0aGluZ3MgbGlrZSB0aGlzCiAgICBpbiB0aGUgZnV0dXJlLiBCdXQsIHBlcnNvbmFsbHksIEkgd291bGQgcHJlZmVyIGZvciB0aG9zZSBicm93c2VyCiAgICBjb21wYW5pZXMgdG8gcHV0IHNvbWUgcmVhbCBlZmZvcnQgaW50byB0aGluZ3MgbGlrZSBjbGVhbmluZyB1cCBhbmQKICAgIHN0YW5kYXJkaXNpbmcgc2hhZHkgdGhpbmdzIGxpa2UgPGNvZGU+ZGVzaWduTW9kZTwvY29kZT4sIGZpeGluZwogICAgdGhlaXIgYnVncywgYW5kIGdldHRpbmcgc2VyaW91cyBhYm91dCBFQ01BU2NyaXB0IDQuPC9wPgoKICAgIDxwPldoaWNoIGlzIHByb2JhYmx5IG5vdCByZWFsaXN0aWNhbGx5IGdvaW5nIHRvIGhhcHBlbiBhbnl0aW1lIHNvb24uPC9wPgoKICAgIDxoci8+CgogICAgPHA+U29tZSBpbnRlcmVzdGluZyBwcm9qZWN0cyBzaW1pbGFyIHRvIHRoaXM6PC9wPgoKICAgIDx1bD4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cueW1hY3Mub3JnIj5ZbWFjczwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2dwbC5pbnRlcm5ldGNvbm5lY3Rpb24ubmV0L3ZpLyI+dmkgY2xvbmU8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9yb2Jyb2hhbi5jb20vcHJvamVjdHMvOW5lLyI+RW1hY3MgY2xvbmU8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9jb2RlcHJlc3Muc291cmNlZm9yZ2UubmV0LyI+Q29kZVByZXNzPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LmNvZGVpZGUuY29tIj5Db2RlSURFPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LmNkb2xpdmV0Lm5ldC9lZGl0YXJlYSI+RWRpdEFyZWE8L2E+PC9saT4KICAgIDwvdWw+CgogICAgPGhyLz4KCiAgICA8cD5JZiB5b3UgaGF2ZSBhbnkgcmVtYXJrcywgY3JpdGljaXNtLCBvciBoaW50cyByZWxhdGVkIHRvIHRoZQogICAgYWJvdmUsIGRyb3AgbWUgYW4gZS1tYWlsIGF0IDxhCiAgICBocmVmPSJtYWlsdG86bWFyaWpuaEBnbWFpbC5jb20iPm1hcmlqbmhAZ21haWwuY29tPC9hPi4gSWYgeW91IHNheQogICAgc29tZXRoaW5nIGdlbmVyYWxseSBpbnRlcmVzdGluZywgSSdsbCBpbmNsdWRlIHlvdXIgcmVhY3Rpb24gaGVyZQogICAgYXQgdGhlIGJvdHRvbSBvZiB0aGlzIHBhZ2UuPC9wPgoKICA8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror/unittests.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFET0NUWVBFIGh0bWw+CjwhLS0KICBUZXN0IEhhcm5lc3MgZm9yIENvZGVNaXJyb3IKICBUaGlzIEhUTUwgZmlsZSBwcm92aWRlcyBhIG1pbmltYWwgZW52aXJvbm1lbnQgd2l0aGluIHdoaWNoIG9uZSBjYW4gZXhlY3V0ZQogIEpTVW5pdC1zdHlsZSB0ZXN0cy4KLS0+Cgo8aHRtbD4KICA8aGVhZD4KICAgIDx0aXRsZT5UZXN0IEhhcm5lc3MgZm9yIENvZGVNaXJyb3I8L3RpdGxlPgoKICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InVuaXR0ZXN0cy5qcyI+PC9zY3JpcHQ+CgogICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogICAgICAvLyBDb3VudGVycyBmb3IgdW5pdCB0ZXN0IHJlc3VsdHMuCiAgICAgIHZhciB0ZXN0X2dvb2QgPSAwOwogICAgICB2YXIgdGVzdF9iYWQgPSAwOwoKICAgICAgLy8gSWYgZXhwZWN0ZWQgYW5kIGFjdHVhbCBhcmUgdGhlIGlkZW50aWNhbCwgcHJpbnQgJ09rJywgb3RoZXJ3aXNlICdGYWlsIScKICAgICAgZnVuY3Rpb24gYXNzZXJ0RXF1YWxzKG1zZywgZXhwZWN0ZWQsIGFjdHVhbCkgewogICAgICAgIGlmICh0eXBlb2YgYWN0dWFsID09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAvLyBtc2cgaXMgb3B0aW9uYWwuCiAgICAgICAgICBhY3R1YWwgPSBleHBlY3RlZDsKICAgICAgICAgIGV4cGVjdGVkID0gbXNnOwogICAgICAgICAgbXNnID0gJ0V4cGVjdGVkOiBcJycgKyBleHBlY3RlZCArICdcJyBBY3R1YWw6IFwnJyArIGFjdHVhbCArICdcJyc7CiAgICAgICAgfQogICAgICAgIHZhciBodG1sOwogICAgICAgIGlmIChleHBlY3RlZCA9PT0gYWN0dWFsKSB7CiAgICAgICAgICBodG1sID0gJzxGT05UIENPTE9SPSIjMDA5OTAwIj5PazwvRk9OVD4nOwogICAgICAgICAgdGVzdF9nb29kKys7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGh0bWwgPSAnPEZPTlQgQ09MT1I9IiM5OTAwMDAiPjxCSUc+RmFpbCE8L0JJRz48L0ZPTlQ+PEJSPic7CiAgICAgICAgICBtc2cgKz0gJyBFeHBlY3RlZDogXCcnICsgZXhwZWN0ZWQgKyAnXCcgQWN0dWFsOiBcJycgKyBhY3R1YWwgKyAnXCcnOwogICAgICAgICAgbXNnID0gbXNnLnJlcGxhY2UoLyYvZywgJyZhbXA7JykucmVwbGFjZSgvPC9nLCAnJmx0OycpLnJlcGxhY2UoLz4vZywgJyZndDsnKTsKICAgICAgICAgIG1zZyA9IG1zZy5yZXBsYWNlKC9cclxuL2csICcmcGFyYTsnKTsKICAgICAgICAgIG1zZyA9IG1zZy5yZXBsYWNlKC9cbi9nLCAnJnBhcmE7Jyk7CiAgICAgICAgICBtc2cgPSBtc2cucmVwbGFjZSgvXHIvZywgJyZwYXJhOycpOwogICAgICAgICAgbXNnID0gbXNnLnJlcGxhY2UoL1x1MDBBMC9nLCAnJm1pZGRvdDsnKTsKICAgICAgICAgIGh0bWwgKz0gJzxjb2RlPicgKyBtc2cgKyAnPC9jb2RlPic7CiAgICAgICAgICB0ZXN0X2JhZCsrOwogICAgICAgIH0KICAgICAgICBwcmludERpdihodG1sKTsKICAgICAgfQoKICAgICAgLy8gSWYgZXhwZWN0ZWQgYW5kIGFjdHVhbCBhcmUgdGhlIGVxdWl2YWxlbnQsIHBhc3MgdGhlIHRlc3QuCiAgICAgIGZ1bmN0aW9uIGFzc2VydEVxdWl2YWxlbnQobXNnLCBleHBlY3RlZCwgYWN0dWFsKSB7CiAgICAgICAgaWYgKHR5cGVvZiBhY3R1YWwgPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgIC8vIG1zZyBpcyBvcHRpb25hbC4KICAgICAgICAgIGFjdHVhbCA9IGV4cGVjdGVkOwogICAgICAgICAgZXhwZWN0ZWQgPSBtc2c7CiAgICAgICAgICBtc2cgPSAnRXhwZWN0ZWQ6IFwnJyArIGV4cGVjdGVkICsgJ1wnIEFjdHVhbDogXCcnICsgYWN0dWFsICsgJ1wnJzsKICAgICAgICB9CiAgICAgICAgaWYgKF9lcXVpdmFsZW50KGV4cGVjdGVkLCBhY3R1YWwpKSB7CiAgICAgICAgICBhc3NlcnRFcXVhbHMobXNnLCBTdHJpbmcudG9TdHJpbmcoZXhwZWN0ZWQpLCBTdHJpbmcudG9TdHJpbmcoYWN0dWFsKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGFzc2VydEVxdWFscyhtc2csIGV4cGVjdGVkLCBhY3R1YWwpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gQXJlIGEgYW5kIGIgdGhlIGVxdWl2YWxlbnQ/IC0tIFJlY3Vyc2l2ZS4KICAgICAgZnVuY3Rpb24gX2VxdWl2YWxlbnQoYSwgYikgewogICAgICAgIGlmIChhID09IGIpIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIGEgPT0gJ29iamVjdCcgJiYgdHlwZW9mIGIgPT0gJ29iamVjdCcgJiYgYSAhPT0gbnVsbCAmJiBiICE9PSBudWxsKSB7CiAgICAgICAgICBpZiAoYS50b1N0cmluZygpICE9IGIudG9TdHJpbmcoKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKHZhciBwIGluIGEpIHsKICAgICAgICAgICAgaWYgKCFfZXF1aXZhbGVudChhW3BdLCBiW3BdKSkgewogICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgZm9yICh2YXIgcCBpbiBiKSB7CiAgICAgICAgICAgIGlmICghX2VxdWl2YWxlbnQoYVtwXSwgYltwXSkpIHsKICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHJ1blRlc3RzKCkgewogICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgdGVzdHMubGVuZ3RoOyB4KyspIHsKICAgICAgICAgIHByaW50RGl2KCc8SDM+JyArIHRlc3RzW3hdICsgJzo8L0gzPicpOwogICAgICAgICAgZXZhbCh0ZXN0c1t4XSArICcoKScpOwogICAgICAgIH0KICAgICAgfQogICAgICBmdW5jdGlvbiBpbml0VGVzdHMoKSB7CiAgICAgICAgdmFyIHN0YXJ0VGltZSA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7CiAgICAgICAgcnVuVGVzdHMoKTsKICAgICAgICB2YXIgZW5kVGltZSA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7CiAgICAgICAgdmFyIGh0bWwgPSAnPEgzPkRvbmUuPC9IMz4nOwogICAgICAgIGh0bWwgKz0gJzxQPlRlc3RzIHBhc3NlZDogJyArIHRlc3RfZ29vZCArICc8QlI+VGVzdHMgZmFpbGVkOiAnICsgdGVzdF9iYWQgKyAnPC9QPic7CiAgICAgICAgaHRtbCArPSAnPFA+VG90YWwgdGltZTogJyArIChlbmRUaW1lIC0gc3RhcnRUaW1lKSArICcgbXM8L1A+JzsKICAgICAgICBwcmludERpdihodG1sKTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gcHJpbnREaXYoaHRtbCkgewogICAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICBkaXYuaW5uZXJIVE1MID0gaHRtbDsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdG91dHB1dCcpLmFwcGVuZENoaWxkKGRpdik7CiAgICAgIH0KICAgIDwvc2NyaXB0PgogIDwvaGVhZD4KCiAgPGJvZHkgb25sb2FkPSJpbml0VGVzdHMoKSI+CiAgICA8aDE+VGVzdCBIYXJuZXNzIGZvciBDb2RlTWlycm9yPC9oMT4KICAgIDxkaXYgaWQ9InRlc3RvdXRwdXQiPjwvZGl2PgogICAgPGhyPgogICAgPGRpdiBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Ij4KICAgIDx0ZXh0YXJlYSBpZD0iaW5wdXRmaWVsZCI+PC90ZXh0YXJlYT4KICAgIDwvZGl2PgogICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ianMvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gbmV3IENvZGVNaXJyb3IoQ29kZU1pcnJvci5yZXBsYWNlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dGZpZWxkJykpLCB7CiAgICAgICAgICBwYXJzZXJmaWxlOiBbInRva2VuaXplamF2YXNjcmlwdC5qcyIsICJwYXJzZWphdmFzY3JpcHQuanMiXSwKICAgICAgICAgIHBhdGg6ICJqcy8iCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror/unittests.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIFRlc3QgSGFybmVzcyBmb3IgQ29kZU1pcnJvcgogKiBKUy11bml0IGNvbXBhdGlibGUgdGVzdHMgaGVyZS4gIFRoZSB0d28gYXZhaWxhYmxlIGFzc2VydGlvbnMgYXJlCiAqIGFzc2VydEVxdWFscyAoc3RyaWN0IGVxdWFsaXR5KSBhbmQgYXNzZXJ0RXF1aXZhbGVudCAobG9vc2VyIGVxdWl2YWxlbmN5KS4KICoKICogJ2VkaXRvcicgaXMgYSBnbG9iYWwgb2JqZWN0IGZvciB0aGUgQ29kZU1pcnJvciBlZGl0b3Igc2hhcmVkIGJldHdlZW4gYWxsCiAqIHRlc3RzLiAgQWZ0ZXIgbWFuaXB1bGF0aW5nIGl0IGluIGVhY2ggdGVzdCwgdHJ5IHRvIHJlc3RvcmUgaXQgdG8KICogYXBwcm94aW1hdGVseSBpdHMgb3JpZ2luYWwgc3RhdGUuCiAqLwoKZnVuY3Rpb24gdGVzdFNldEdldCgpIHsKICB2YXIgY29kZSA9ICdJdCB3YXMgdGhlIGJlc3Qgb2YgdGltZXMuXG5JdCB3YXMgdGhlIHdvcnN0IG9mIHRpbWVzLic7CiAgZWRpdG9yLnNldENvZGUoY29kZSk7CiAgYXNzZXJ0RXF1YWxzKGNvZGUsIGVkaXRvci5nZXRDb2RlKCkpOwogIGVkaXRvci5zZXRDb2RlKCcnKTsKICBhc3NlcnRFcXVhbHMoJycsIGVkaXRvci5nZXRDb2RlKCkpOwp9CgpmdW5jdGlvbiB0ZXN0U2V0U3R5bGVzaGVldCgpIHsKICBmdW5jdGlvbiBjc3NTdGF0dXMoKSB7CiAgICAvLyBSZXR1cm5zIGEgbGlzdCBvZiB0dXBsZXMsIGZvciBlYWNoIENTUyBsaW5rIHJldHVybiB0aGUgZmlsZW5hbWUgYW5kCiAgICAvLyB3aGV0aGVyIGl0IGlzIGVuYWJsZWQuCiAgICBsaW5rcyA9IGVkaXRvci53aW4uZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2xpbmsnKTsKICAgIGNzcyA9IFtdOwogICAgZm9yICh2YXIgeCA9IDAsIGxpbms7IGxpbmsgPSBsaW5rc1t4XTsgeCsrKSB7CiAgICAgIGlmIChsaW5rLnJlbC5pbmRleE9mKCJzdHlsZXNoZWV0IikgIT09IC0xKSB7CiAgICAgICAgY3NzLnB1c2goW2xpbmsuaHJlZi5zdWJzdHJpbmcobGluay5ocmVmLmxhc3RJbmRleE9mKCcvJykgKyAxKSwKICAgICAgICAgICAgICAgICAhbGluay5kaXNhYmxlZF0pCiAgICAgIH0KICAgIH0KICAgIHJldHVybiBjc3M7CiAgfQogIGFzc2VydEVxdWl2YWxlbnQoW10sIGNzc1N0YXR1cygpKTsKICBlZGl0b3Iuc2V0U3R5bGVzaGVldCgnY3NzL2pzY29sb3JzLmNzcycpOwogIGFzc2VydEVxdWl2YWxlbnQoW1snanNjb2xvcnMuY3NzJywgdHJ1ZV1dLCBjc3NTdGF0dXMoKSk7CiAgZWRpdG9yLnNldFN0eWxlc2hlZXQoWydjc3MvY3NzY29sb3JzLmNzcycsICdjc3MveG1sY29sb3JzLmNzcyddKTsKICBhc3NlcnRFcXVpdmFsZW50KFtbJ2pzY29sb3JzLmNzcycsIGZhbHNlXSwgWydjc3Njb2xvcnMuY3NzJywgdHJ1ZV0sIFsneG1sY29sb3JzLmNzcycsIHRydWVdXSwgY3NzU3RhdHVzKCkpOwogIGVkaXRvci5zZXRTdHlsZXNoZWV0KFtdKTsKICBhc3NlcnRFcXVpdmFsZW50KFtbJ2pzY29sb3JzLmNzcycsIGZhbHNlXSwgWydjc3Njb2xvcnMuY3NzJywgZmFsc2VdLCBbJ3htbGNvbG9ycy5jc3MnLCBmYWxzZV1dLCBjc3NTdGF0dXMoKSk7Cn0KCi8vIFVwZGF0ZSB0aGlzIGxpc3Qgb2YgdGVzdHMgYXMgbmV3IG9uZXMgYXJlIGFkZGVkLgp2YXIgdGVzdHMgPSBbJ3Rlc3RTZXRHZXQnLCAndGVzdFNldFN0eWxlc2hlZXQnXTsKCg==]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbImZyaWVuZGx5bmFtZSJdPSJDb2RlTWlycm9yIHN5bnRheGhpZ2hsaWdodGluZyBlZGl0b3IiOwoKJGxhbmdbInBvc3RpbnN0YWxsIl09IlRoZSBDb2RlTWlycm9yIG1vZHVsZSB3YXMgc3VjZXNzZnVsbHkgaW5zdGFsbGVkIjsKJGxhbmdbIm5lZWRwZXJtaXNzaW9uIl09IidZb3UgbmVlZCB0aGUgJyVzJyBwZXJtaXNzaW9uIHRvIHBlcmZvcm0gdGhhdCBmdW5jdGlvbi4iOwoKJGxhbmdbInNldHRpbmdzdGFiIl09IlNldHRpbmdzIjsKJGxhbmdbInNhdmVzZXR0aW5ncyJdPSJTYXZlIHNldHRpbmdzIjsKJGxhbmdbInNldHRpbmdzc2F2ZWQiXT0iU2V0dGluZ3Mgc2F2ZWQiOwoKJGxhbmdbImh0bWx0ZXN0Il09IkhUTUwgc3ludGF4IHRlc3QiOwokbGFuZ1siY3NzdGVzdCJdPSJDU1Mgc3ludGF4IHRlc3QiOwokbGFuZ1sicGhwdGVzdCJdPSJQSFAgc3ludGF4IHRlc3QiOwokbGFuZ1sianN0ZXN0Il09IkphdmFTY3JpcHQgc3ludGF4IHRlc3QiOwokbGFuZ1siZXhhbXBsZXN5bnRheCJdPSJTeW50YXggdG8gdGVzdCB3aXRoIjsKJGxhbmdbImNoYW5nZSJdPSJDaGFuZ2UuLi4iOwoKJGxhbmdbInNob3dsaW5lbnVtYmVycyJdPSJTaG93IGxpbmVudW1iZXJzIjsKJGxhbmdbInRleHR3cmFwcGluZyJdPSJXcmFwIGxvbmcgbGluZXMiOwokbGFuZ1siYXV0b21hdGNocGFyZW5zIl09IkF1dG9tYXRjaCBwYXJlbnRoZXNpcyI7CgokbGFuZ1siaGVscCJdPSI8c3Ryb25nPldoYXQgZG9lcyB0aGlzIG1vZHVsZSBkbz88L3N0cm9uZz4KPGJyLz4KVGhlIENvZGVNaXJyb3IgbW9kdWxlIGFsbG93cyB5b3UgdG8gZWRpdCBjb250ZW50LCB0ZW1wbGF0ZXMgYW5kIHN0eWxlc2hlZXRzIHVzaW5nIGEgc3ludGF4aGlnaGxpZ2h0aW5nIGVkaXRvciBpbnNpZGUgeW91ciBicm93c2VyLgpJdCBjYW4gYm90aCByZXBsYWNlIGEgd3lzaXd5Zy1tb2R1bGUsIGFuZCBhY3Qgc3RhbmRhbG9uZSBmb3IgdGVtcGxhdGUvc3R5bGVzaGVldCBlZGl0aW5nIChvbmx5IHN1cHBvcnRlZCBpbiBDTVNtcyAxLjErKQo8YnIvPjxici8+CjxzdHJvbmc+SG93IGRvIEkgdXNlIHRoaXMgbW9kdWxlPzwvc3Ryb25nPgpZb3Ugc2ltcGx5IGluc3RhbGwgaXQsIGFuZCBjaG9vc2UgaXQgaW4geW91ciBhZG1pbiB1c2VyIHByZWZlcmVuY2VzLiBOb3RlLCB0aGF0IGlmIHlvdSB1c2UgQ01TbXMgMS4xIG9yIGFib3ZlIHlvdSBjYW4Kc2VsZWN0IENvZGVNaXJyb3IgYm90aCBhcyBhIFdZU0lXWUcgYW5kIGFzIGEgc3ludGF4IGhpZ2hsaWdodGluZyBlZGl0b3IuIjsKPz4K]]></data>
	</file>
	<file>
	  <filename>/lang/ext/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/ext/da_DK.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0NvZGVNaXJyb3IgLSBlbiBzeW50YWtzLWZyZW1oJmFlbGlnO3ZlbmRlIGVkaXRvcic7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ0NvZGVNaXJyb3IgbW9kdWxldCBibGV2IGtvcnJla3QgaW5zdGFsbGVyZXQnOwokbGFuZ1snbmVlZHBlcm1pc3Npb24nXSA9ICcmIzAzOTtZb3UgbmVlZCB0aGUgJiMwMzk7JXMmIzAzOTsgcGVybWlzc2lvbiB0byBwZXJmb3JtIHRoYXQgZnVuY3Rpb24uJzsKJGxhbmdbJ3NldHRpbmdzdGFiJ10gPSAnSW5kc3RpbGxpbmdlcic7CiRsYW5nWydzYXZlc2V0dGluZ3MnXSA9ICdHZW0gaW5kc3RpbGxpbmdlcic7CiRsYW5nWydzZXR0aW5nc3NhdmVkJ10gPSAnSW5kc3RpbGxpbmdlcm5lIGJsZXYgZ2VtdCc7CiRsYW5nWydodG1sdGVzdCddID0gJ0hUTUwgc3ludGFrcyB0ZXN0JzsKJGxhbmdbJ2Nzc3Rlc3QnXSA9ICdDU1Mgc3ludGFrcyB0ZXN0JzsKJGxhbmdbJ3BocHRlc3QnXSA9ICdQSFAgc3ludGFrYSB0ZXN0JzsKJGxhbmdbJ2pzdGVzdCddID0gJ0phdmFTY3JpcHQgc3ludGFrcyB0ZXN0JzsKJGxhbmdbJ2V4YW1wbGVzeW50YXgnXSA9ICdTeW50YWtzIGRlciBza2FsIHRlc3RlcyBtZWQnOwokbGFuZ1snY2hhbmdlJ10gPSAnU2tpZnQuLi4nOwokbGFuZ1snc2hvd2xpbmVudW1iZXJzJ10gPSAnVmlzIGxpbmllbnVtcmUnOwokbGFuZ1sndGV4dHdyYXBwaW5nJ10gPSAnT21icnlkIGxhbmdlIGxpbmllcic7CiRsYW5nWydhdXRvbWF0Y2hwYXJlbnMnXSA9ICdWaXMgbWF0Y2hlbmRlIHBhcmVudGVzZXInOwokbGFuZ1snaGVscCddID0gJzxzdHJvbmc+SHZhZCBnJm9zbGFzaDtyIGRldHRlIG1vZHVsPzwvc3Ryb25nPg0KPGJyLz4NCkNvZGVNaXJyb3ItbW9kdWxlcyBnaXZlciBkaWcgbXVsaWdoZWQgZm9yIGF0IHJlZGlnZXJlIGluZGhvbGQsIHNrYWJlbG9uZXIgb2cgc3R5bGVzaGVldHMgdmVkIGhqJmFlbGlnO2xwIGFmIHN5bnRha3MtZnJlbWgmYWVsaWc7dmVuZGUgcmVkaWdlcmluZyBpIGRpbiBicm93c2VyLg0KPGJyLz48YnIvPg0KPHN0cm9uZz5Idm9yZGFuIGJydWdlciBqZWcgZGV0dGUgbW9kdWw/PC9zdHJvbmc+DQpEdSBpbnN0YWxsZXJlciBkZXQgb2cgdiZhZWxpZztsZ2VyIGRldCBpIGRpbmUgYnJ1Z2VyIGluZHN0aWxsaW5nZXIgZm9yIGFkbWluc2l0cmF0aW9uZW4uIEJlbSZhZWxpZztyayBhdCBkdSBrYW4gdiZhZWxpZztsZ2UgYXQgYmVueXR0ZSBkZXQgYiZhcmluZztkZSBzb20gc3ludGFrcyBmcmVtaCZhZWxpZzt2ZXIgb2cgV1lTSVdZRy4nOwokbGFuZ1sndXRtYSddID0gJzE1Njg2MTM1My4yMDM5ODg2NTg1LjEyMzE3MTM2MTguMTI3OTEzNzA4MS4xMjc5NTU0OTUxLjEzNyc7CiRsYW5nWyd1dG16J10gPSAnMTU2ODYxMzUzLjEyNzc4MzQ0MTMuMTMxLjMwLnV0bWNzcj1mZWVkYnVybmVyfHV0bWNjbj1GZWVkOiBjbXNtYWRlc2ltcGxlL2Jsb2cgKENNUyBNYWRlIFNpbXBsZSl8dXRtY21kPWZlZWQnOwokbGFuZ1sncWNhJ10gPSAnMTIyOTYwMTc5MC04NTI0MzE5Ny00MzI2MDcxMyc7CiRsYW5nWyd1dG1iJ10gPSAnMTU2ODYxMzUzJzsKJGxhbmdbJ3V0bWMnXSA9ICcxNTY4NjEzNTMnOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lang/ext/de_DE.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0NvZGVNaXJyb3IgU3ludGF4LUhpZ2hsaWdodGluZy1FZGl0b3IgJzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnRGFzIENvZGVNaXJyb3ItTW9kdWwgd3VyZGUgZXJmb2xncmVpY2ggaW5zdGFsbGllcnQuJzsKJGxhbmdbJ25lZWRwZXJtaXNzaW9uJ10gPSAnU2llIGJlc2l0emVuIG5pY2h0ICBkaWUgJiMwMzk7JXMmIzAzOTstQmVyZWNodGlndW5nLCB1bSBkaWVzZSBGdW5rdGlvbiBhdXN6dWYmdXVtbDtocmVuLic7CiRsYW5nWydzZXR0aW5nc3RhYiddID0gJ0VpbnN0ZWxsdW5nZW4nOwokbGFuZ1snc2F2ZXNldHRpbmdzJ10gPSAnRWluc3RlbGx1bmdlbiBzcGVpY2hlcm4nOwokbGFuZ1snc2V0dGluZ3NzYXZlZCddID0gJ0VpbnN0ZWxsdW5nZW4gZ2VzcGVpY2hlcnQnOwokbGFuZ1snaHRtbHRlc3QnXSA9ICdIVE1MLVN5bnRheC1UZXN0JzsKJGxhbmdbJ2Nzc3Rlc3QnXSA9ICdDU1MtU3ludGF4LVRlc3QnOwokbGFuZ1sncGhwdGVzdCddID0gJ1BIUC1TeW50YXgtVGVzdCc7CiRsYW5nWydqc3Rlc3QnXSA9ICdKYXZhU2NyaXB0LVN5bnRheC1UZXN0JzsKJGxhbmdbJ2V4YW1wbGVzeW50YXgnXSA9ICdTeW50YXggdGVzdGVuIG1pdCc7CiRsYW5nWydjaGFuZ2UnXSA9ICcmQXVtbDtuZGVyZSAuLi4nOwokbGFuZ1snc2hvd2xpbmVudW1iZXJzJ10gPSAnWmVpbGVubnVtbWVybiBhbnplaWdlbic7CiRsYW5nWyd0ZXh0d3JhcHBpbmcnXSA9ICdMYW5nZSBaZWlsZW4gdW1icmVjaGVuJzsKJGxhbmdbJ2hlbHAnXSA9ICc8aDM+V2FzIG1hY2h0IGRpZXNlcyBNb2R1bD88L2gzPg0KPHA+RGFzIENvZGVNaXJyb3ItTW9kdWxlIGlzdCBlaW4gRWRpdG9yIG1pdCBTeW50YXgtSGlnaGxpZ2h0aW5nLCBtaXQgZGVtIFNpZSBvbmxpbmUgSW5oYWx0LCBUZW1wbGF0ZXMgdW5kIFN0eWxlc2hlZXRzIGJlYXJiZWl0ZW4gayZvdW1sO25uZW4uIERhcyBNb2R1bCBrYW5uIHNvd29obCBkaWUgV1lTSVdZRy1FZGl0b3JlbiBlcnNldHplbiBhbHMgYXVjaCBzZXBhcmF0IHp1bSBFZGl0aWVyZW4gdm9uIFRlbXBsYXRlcyB1bmQgU3R5bGVzaGVldHMgdmVyd2VuZGV0IHdlcmRlbiAoZXJzdCBhYiBDTVNtcy1WZXJzaW9uIDEuMSB1bmQgaCZvdW1sO2hlcikuPC9wPg0KPGgzPldpZSB3aXJkIGVzIGVpbmdlc2V0enQ/PC9oMz4NCjxwPkluc3RhbGxpZXJlbiBTaWUgZGFzIE1vZHVsIHVuZCBha3RpdmllcmVuIFNpZSBlcyBhbnNjaGxpZSZzemxpZztlbmQgaW4gZGVuIGJlbnV0emVyc3BlemlmaXNjaGVuIEVpbnN0ZWxsdW5nZW4uPC9wPg0KPHA+QmVhY2h0ZW4gU2llLCBkYXNzIFNpZSBhYiBDTVNtcy1WZXJzaW9uIDEuMSB1bmQgaCZvdW1sO2hlciA8c3Ryb25nPkNvZGVNaXJyb3I8L3N0cm9uZz4gc293b2hsIGFscyBXWVNJV1lHLUVkaXRvciBhbHMgYXVjaCBhbHMgU3ludGF4LUhpZ2hsaWdodGluZy1FZGl0b3IgYXVzdyZhdW1sO2hsZW4gayZvdW1sO25uZW4uPC9wPic7CiRsYW5nWydxY2EnXSA9ICdQMC03NTA5MTQ3OC0xMjY4NDIxODE0MDcyJzsKJGxhbmdbJ3V0bWEnXSA9ICcxNTY4NjEzNTMuNzI4OTg5NDUyLjEyNjg1Njc0NzUuMTI3MDgwNzkwNi4xMjcwOTI0MDg1LjYnOwokbGFuZ1sndXRtYyddID0gJzE1Njg2MTM1Myc7CiRsYW5nWyd1dG16J10gPSAnMTU2ODYxMzUzLjEyNzA5MjQwODUuNi40LnV0bWNjbj0ocmVmZXJyYWwpfHV0bWNzcj1mb3J1bS5jbXNtYWRlc2ltcGxlLm9yZ3x1dG1jY3Q9L2luZGV4LnBocHx1dG1jbWQ9cmVmZXJyYWwnOwokbGFuZ1sndXRtYiddID0gJzE1Njg2MTM1Myc7Cj8+]]></data>
	</file>
	<file>
	  <filename>/lang/ext/es_ES.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0VkaXRvciBkZSByZXNhbHRhZG8gZGUgc2ludGF4aXMgQ29kZU1pcnJvcic7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ0VsIG0mYW1wO29hY3V0ZTtkdWxvIENvZGVNaXJyb3IgZnVlIHNhdGlzZmFjdG9yaWFtZW50ZSBpbnN0YWxhZG8nOwokbGFuZ1snbmVlZHBlcm1pc3Npb24nXSA9ICcmIzAzOTtTZSBuZWNlc2l0YSBlbCBwZXJtaXNvIGRlICYjMDM5OyVzJiMwMzk7IHBhcmEgcmVhbGl6YXIgZXN0YSBmdW5jaSZhbXA7b2FjdXRlO24uJzsKJGxhbmdbJ3NldHRpbmdzdGFiJ10gPSAnQWp1c3Rlcyc7CiRsYW5nWydzYXZlc2V0dGluZ3MnXSA9ICdTYWx2YXIgYWp1c3Rlcyc7CiRsYW5nWydzZXR0aW5nc3NhdmVkJ10gPSAnQWp1c3RlcyBndWFyZGFkb3MnOwokbGFuZ1snaHRtbHRlc3QnXSA9ICdQcnVlYmEgZGUgc2ludGF4aXMgSFRNTCc7CiRsYW5nWydjc3N0ZXN0J10gPSAnUHJ1ZWJhIGRlIHNpbnRheGlzIENTUyc7CiRsYW5nWydwaHB0ZXN0J10gPSAnUHJ1ZWJhIGRlIHNpbnRheGlzIFBIUCc7CiRsYW5nWydleGFtcGxlc3ludGF4J10gPSAnU3ludGF4aXMgdXNhZGEgcGFyYSBwcm9iYXInOwokbGFuZ1snY2hhbmdlJ10gPSAnQ2FtYmlhci4uLic7CiRsYW5nWydzaG93bGluZW51bWJlcnMnXSA9ICdNb3N0YXIgZWwgbiZhbXA7dWFjdXRlO21lcm8gZGUgbCZhbXA7aWFjdXRlO25lYXMnOwokbGFuZ1sndGV4dHdyYXBwaW5nJ10gPSAnQXV0by1hanVzdGFyIGxpbmVhcyBsYXJnYXMnOwokbGFuZ1snaGVscCddID0gJzxzdHJvbmc+UXUmYW1wO2VhY3V0ZTsgaGFjZSBlc3RlIG0mYW1wO29hY3V0ZTtkdWxvPzwvc3Ryb25nPg0KPGJyLz4NCkVsIG0mYW1wO29hY3V0ZTtkdWxvIENvZGVNaXJyb3IgbGUgcGVybWl0ZSBlZGl0YXIgY29udGVuaWRvLCBwbGFudGlsbGFzIHkgaG9qYXMgZGUgZXN0aWxvIHVzYW5kbyB1biBlZGl0b3IgZGUgcmVzYWx0YWRvIGRlIHNpbnRheGlzIGRlbnRybyBkZSBzdSBuYXZlZ2Fkb3IuDQpFc3RlIHRhbWJpdSZhbXA7ZWFjdXRlO24gcHVlZGUgIHJlZW1wbGF6YXIgZWwgbSZhbXA7b2FjdXRlO2R1bG8gZGUgd3lzaXd5ZywgeSBhY3R1YXIgc29sbyBwYXJhIGVkaWNpJmFtcDtvYWN1dGU7biBkZSBwbGFudGlsbGFzL2hvamFzIGRlIGVzdGlsbyB0ZW1wbGF0ZS9zdHlsZXNoZWV0ICAoc29sbyBzb3BvcnRhZG8gZW4gQ01TbXMgMS4xKykNCjxici8+PGJyLz4NCjxzdHJvbmc+QyZhbXA7b2FjdXRlO21vIHVzbyBlc3RlIG0mYW1wO29hY3V0ZTtkdWxvPzwvc3Ryb25nPg0KVXN0ZWQgc2ltcGxlbWVudGUgbG8gaW5zdGFsYSwgeSBsbyBzZWxlY2Npb25hIGVuIGxhcyBwcmVmZXJlY2lhcyBkZSBsYSBhZG1pbmlzdHJhY2kmYW1wO29hY3V0ZTtuLiBOb3RlIHF1ZSwgc2kgdXN0ZWQgdXNhIENNU21zIDEuMSBvIHN1cGVyaW9yIGEgZXN0ZSB1c3RlZCBwdWVkZSBzZWxlY2Npb25hciBDb2RlTWlycm9yIGp1bnRvIGNvbiBXWVNJV1lHIHBhcmEgZWwgcmVzYWx0YWRvIGRlIHNpbnRheGlzLic7CiRsYW5nWydxY2EnXSA9ICdQMC0yMDk2MDU0MzcwLTEyNTk4MDM2MTU5MzknOwokbGFuZ1sndXRtYSddID0gJzE1Njg2MTM1My4yMzg2MDY4NTQuMTI1OTgwNDM2OC4xMjY3NjUyNDU5LjEyNjc2NTk3NzMuNTcnOwokbGFuZ1sndXRteiddID0gJzE1Njg2MTM1My4xMjY3NjUyNDU5LjU2LjI4LnV0bWNjbj0ocmVmZXJyYWwpfHV0bWNzcj1mb3J1bS5jbXNtYWRlc2ltcGxlLm9yZ3x1dG1jY3Q9L2luZGV4LnBocC90b3BpYywxOTkyOS4wLmh0bWx8dXRtY21kPXJlZmVycmFsJzsKJGxhbmdbJ3V0bWMnXSA9ICcxNTY4NjEzNTMnOwokbGFuZ1sndXRtYiddID0gJzE1Njg2MTM1Myc7Cj8+]]></data>
	</file>
	<file>
	  <filename>/lang/ext/fr_FR.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0VkaXRldXIgZGUgc3ludGF4ZSBjb2xvciZlYWN1dGU7IENvZGVNaXJyb3InOwokbGFuZ1sncG9zdGluc3RhbGwnXSA9ICdMZSBtb2R1bGUgQ29kZU1pcnJvciBhICZlYWN1dGU7dCZlYWN1dGU7IGluc3RhbGwmZWFjdXRlOyBhdmVjIHN1Y2MmZWdyYXZlO3MnOwokbGFuZ1snbmVlZHBlcm1pc3Npb24nXSA9ICcmIzAzOTtWb3VzIGF2ZXogYmVzb2luIGRlIGwmIzAzOTthdXRvcmlzYXRpb24gJiMwMzk7JXMmIzAzOTsgIHBvdXIgY2V0dGUgZm9uY3Rpb24nOwokbGFuZ1snc2V0dGluZ3N0YWInXSA9ICdQYXJhbSZlZ3JhdmU7dHJlcyc7CiRsYW5nWydzYXZlc2V0dGluZ3MnXSA9ICdTYXV2ZWdhcmRlciBsZXMgcGFyYW0mZWdyYXZlO3RyZXMnOwokbGFuZ1snc2V0dGluZ3NzYXZlZCddID0gJ1BhcmFtJmVncmF2ZTt0cmVzIHNhdXZlZ2FyZCZlYWN1dGU7cyc7CiRsYW5nWydodG1sdGVzdCddID0gJ1Rlc3QgZGUgc3ludGF4ZSBIVE1MICc7CiRsYW5nWydjc3N0ZXN0J10gPSAnVGVzdCBkZSBzeW50YXhlIENTUyAnOwokbGFuZ1sncGhwdGVzdCddID0gJ1Rlc3QgZGUgc3ludGF4ZSBQSFAnOwokbGFuZ1snanN0ZXN0J10gPSAnVGVzdCBkZSBzeW50YXhlIEphdmFTY3JpcHQnOwokbGFuZ1snZXhhbXBsZXN5bnRheCddID0gJ1N5bnRheGUgcG91ciB0ZXN0ZXIgYXZlYyZuYnNwOyc7CiRsYW5nWydjaGFuZ2UnXSA9ICdDaGFuZ2VyIC4uLic7CiRsYW5nWydzaG93bGluZW51bWJlcnMnXSA9ICdBZmZpY2hlciBsZSBub21icmUgZGUgbGlnbmVzJzsKJGxhbmdbJ3RleHR3cmFwcGluZyddID0gJ1JldG91ciAmYWdyYXZlOyBsYSBsaWduZSBhdXRvbWF0aXF1ZSc7CiRsYW5nWydoZWxwJ10gPSAnPHN0cm9uZz5RdWUgZmFpdCBjZSBtb2R1bGUmbmJzcDs/PC9zdHJvbmc+DQo8YnIvPg0KTGUgbW9kdWxlIENvZGVNaXJyb3Igdm91cyBwZXJtZXQgZGUgbW9kaWZpZXIgbGUgY29udGVudSwgbGVzIGdhYmFyaXRzIGV0IGxlcyBmZXVpbGxlcyBkZSBzdHlsZSBlbiB1dGlsaXNhbnQgdW4gJmVhY3V0ZTtkaXRldXIgZGUgc3ludGF4ZSBjb2xvciZlYWN1dGU7IGwmIzAzOTtpbnQmZWFjdXRlO3JpZXVyIGRlIHZvdHJlIG5hdmlnYXRldXIuIA0KSWwgcGV1dCBhdXNzaSBiaWVuIHJlbXBsYWNlciBsJiMwMzk7JmVhY3V0ZTtkaXRldXIgV1lTSVdZRywgZXQgcGVybWV0dHJlIGRlIHZpc3VhbGlzZXItJmVhY3V0ZTtkaXRlciBsZXMgZ2FiYXJpdHMsIGZldWlsbGVzIGRlIHN0eWxlLiAoVW5pcXVlbWVudCBwb3VyIHZlcnNpb24gQ01TTVMgMS4xIG91IHBsdXMpDQo8YnIvPjxici8+DQo8c3Ryb25nPkNvbW1lbnQgbCYjMDM5O3V0aWxpc2VyJm5ic3A7Pzwvc3Ryb25nPjxici8+DQpJbCB2b3VzIHN1ZmZpdCBkZSBsJiMwMzk7aW5zdGFsbGVyLCBldCBkYW5zICZxdW90O01lcyBwciZlYWN1dGU7ZiZlYWN1dGU7cmVuY2VzIC8gUHImZWFjdXRlO2YmZWFjdXRlO3JlbmNlcyBkZSBsJiMwMzk7dXRpbGlzYXRldXImcXVvdDsgY2hvaXNpciBhdmVjIGxlIG1lbnUgZCZlYWN1dGU7cm91bGFudCBDb2RlTWlycm9yIGRhbnMgJnF1b3Q7UyZlYWN1dGU7bGVjdGlvbm5lciBsYSBzeW50YXhlIHN1cmxpZ24mZWFjdXRlO2UmcXVvdDsgZXQvb3UgJmVhY3V0ZTt2ZW50dWVsbGVtZW50IGRhbnMgJnF1b3Q7UyZlYWN1dGU7bGVjdGlvbiBkdSBXWVNJV1lHICZhZ3JhdmU7IHV0aWxpc2VyJnF1b3Q7Lg0KJzsKJGxhbmdbJ3FjYSddID0gJ1AwLTE2MjQwOTkxOTgtMTI2MjcxNTg1MjQyMSc7CiRsYW5nWyd1dG1hJ10gPSAnMTU2ODYxMzUzLjk4MzY5MTQ4MS4xMjY4Njc1Mzc2LjEyNjg2NzUzNzYuMTI2ODY3NTM3Ni4xJzsKJGxhbmdbJ3V0bWMnXSA9ICcxNTY4NjEzNTMnOwokbGFuZ1sndXRteiddID0gJzE1Njg2MTM1My4xMjY4Njc1Mzc2LjEuMS51dG1jY249KGRpcmVjdCl8dXRtY3NyPShkaXJlY3QpfHV0bWNtZD0obm9uZSknOwokbGFuZ1sndXRtYiddID0gJzE1Njg2MTM1Myc7Cj8+]]></data>
	</file>
	<file>
	  <filename>/lang/ext/nb_NO.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0NvZGVNaXJyb3Igc3ludGFrc2ZyZW1oZXZpbmdzcmVkaWdlcmVyJzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnQ29kZU1pcnJvciBtb2R1bGVuIGJsZSBpbnN0YWxsZXJ0JzsKJGxhbmdbJ25lZWRwZXJtaXNzaW9uJ10gPSAnRHUgdHJlbmdlciAmIzAzOTslcyYjMDM5OyB0aWxsYXRlbHNlIGZvciAmYXJpbmc7IHV0ZiZvc2xhc2g7cmUgZGVubmUgZnVua3Nqb25lbi4nOwokbGFuZ1snc2V0dGluZ3N0YWInXSA9ICdJbm5zdGlsbGluZ2VyJzsKJGxhbmdbJ3NhdmVzZXR0aW5ncyddID0gJ0xhZ3JlIGlubnN0aWxsaW5nZXInOwokbGFuZ1snc2V0dGluZ3NzYXZlZCddID0gJ0lubnN0aWxsaW5nZXIgbGFncmV0JzsKJGxhbmdbJ2h0bWx0ZXN0J10gPSAnSFRNTCBzeW50YWtzIHRlc3QnOwokbGFuZ1snY3NzdGVzdCddID0gJ0NTUyBzeW50YWtzIHRlc3QnOwokbGFuZ1sncGhwdGVzdCddID0gJ1BIUCBzeW50YWtzIHRlc3QnOwokbGFuZ1snanN0ZXN0J10gPSAnSmF2YVNjcmlwdCBzeW50YWtzdGVzdCc7CiRsYW5nWydleGFtcGxlc3ludGF4J10gPSAnU3ludGFrcyAmYXJpbmc7IHRlc3RlIG1lZCc7CiRsYW5nWydjaGFuZ2UnXSA9ICdFbmRyZS4uLic7CiRsYW5nWydzaG93bGluZW51bWJlcnMnXSA9ICdWaXMgbGluamVudW1tZXInOwokbGFuZ1sndGV4dHdyYXBwaW5nJ10gPSAnQnJ5dCBsYW5nZSBsaW5qZXInOwokbGFuZ1snaGVscCddID0gJzxzdHJvbmc+V2hhdCBkb2VzIHRoaXMgbW9kdWxlIGRvPzwvc3Ryb25nPg0KPGJyLz4NClRoZSBDb2RlTWlycm9yIG1vZHVsZSBhbGxvd3MgeW91IHRvIGVkaXQgY29udGVudCwgdGVtcGxhdGVzIGFuZCBzdHlsZXNoZWV0cyB1c2luZyBhIHN5bnRheGhpZ2hsaWdodGluZyBlZGl0b3IgaW5zaWRlIHlvdXIgYnJvd3Nlci4NCkl0IGNhbiBib3RoIHJlcGxhY2UgYSB3eXNpd3lnLW1vZHVsZSwgYW5kIGFjdCBzdGFuZGFsb25lIGZvciB0ZW1wbGF0ZS9zdHlsZXNoZWV0IGVkaXRpbmcgKG9ubHkgc3VwcG9ydGVkIGluIENNU21zIDEuMSspDQo8YnIvPjxici8+DQo8c3Ryb25nPkhvdyBkbyBJIHVzZSB0aGlzIG1vZHVsZT88L3N0cm9uZz4NCllvdSBzaW1wbHkgaW5zdGFsbCBpdCwgYW5kIGNob29zZSBpdCBpbiB5b3VyIGFkbWluIHVzZXIgcHJlZmVyZW5jZXMuIE5vdGUsIHRoYXQgaWYgeW91IHVzZSBDTVNtcyAxLjEgb3IgYWJvdmUgeW91IGNhbg0Kc2VsZWN0IENvZGVBcmVhIGJvdGggYXMgYSBXWVNJV1lHIGFuZCBhcyBhIHN5bnRheCBoaWdobGlnaHRpbmcgZWRpdG9yLic7CiRsYW5nWyd1dG16J10gPSAnMTU2ODYxMzUzLjEyNjkyODQ5MDUuMjUzNi41NS51dG1jc3I9Zm9ydW0uY21zbWFkZXNpbXBsZS5vcmd8dXRtY2NuPShyZWZlcnJhbCl8dXRtY21kPXJlZmVycmFsfHV0bWNjdD0vaW5kZXgucGhwJzsKJGxhbmdbJ3V0bWEnXSA9ICcxNTY4NjEzNTMuMTc5MDUyNjIzMDg0MTEwMTAwLjEyMTA0MjM1NzcuMTI2OTM4NTg0My4xMjY5NDUyMjA0LjI1NDQnOwokbGFuZ1sncWNhJ10gPSAnMTIxMDk3MTY5MC0yNzMwODA3My04MTk1MjgzMic7CiRsYW5nWyd1dG1iJ10gPSAnMTU2ODYxMzUzLjIuMTAuMTI2OTQ1MjIwNCc7CiRsYW5nWyd1dG1jJ10gPSAnMTU2ODYxMzUzJzsKPz4=]]></data>
	</file>
	<file>
	  <filename>/lang/ext/nl_NL.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0NvZGVNaXJyb3IgU3ludGF4aGlnaGxpZ2h0aW5nIEVkaXRvcic7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ0RlIENvZGVNaXJyb3IgTW9kdWxlIGlzIGdlJml1bWw7bnN0YWxsZWVyZCc7CiRsYW5nWyduZWVkcGVybWlzc2lvbiddID0gJ1UgaGVlZnQgJiMwMzk7JXMmIzAzOTsgcmVjaHRlbiBub2RpZyBvbSBkZXplIGZ1bmN0aWUgdGUgZ2VicnVpa2VuLic7CiRsYW5nWydzZXR0aW5nc3RhYiddID0gJ0luc3RlbGxpbmdlbic7CiRsYW5nWydzYXZlc2V0dGluZ3MnXSA9ICdJbnN0ZWxsaW5nZW4gb3BzbGFhbic7CiRsYW5nWydzZXR0aW5nc3NhdmVkJ10gPSAnSW5zdGVsbGluZ2VuIG9wZ2VzbGFnZW4nOwokbGFuZ1snaHRtbHRlc3QnXSA9ICdIVE1MIFN5bnRheCBUZXN0JzsKJGxhbmdbJ2Nzc3Rlc3QnXSA9ICdDU1MgU3ludGF4IFRlc3QnOwokbGFuZ1sncGhwdGVzdCddID0gJ1BIUCBTeW50YXggVGVzdCc7CiRsYW5nWydqc3Rlc3QnXSA9ICdKYXZhU2NyaXB0IFN5bnRheCBUZXN0JzsKJGxhbmdbJ2V4YW1wbGVzeW50YXgnXSA9ICdTeW50YXggb20gbWVlIHRlIHRlc3Rlbic7CiRsYW5nWydjaGFuZ2UnXSA9ICdXaWp6aWcuLi4nOwokbGFuZ1snc2hvd2xpbmVudW1iZXJzJ10gPSAnUmVnZWxudW1tZXJzIHRvbmVuJzsKJGxhbmdbJ3RleHR3cmFwcGluZyddID0gJ0JyZWVrIGxhbmdlIHJlZ2VscyBhZic7CiRsYW5nWydoZWxwJ10gPSAnPHN0cm9uZz5XaGF0IGRvZXMgdGhpcyBtb2R1bGUgZG8/IDwvc3Ryb25nPg0KPGJyLz4NClRoZSBDb2RlTWlycm9yIG1vZHVsZSBhbGxvd3MgeW91IHRvIGVkaXQgY29udGVudCwgdGVtcGxhdGVzIGFuZCBzdHlsZXNoZWV0cyB1c2luZyBhIHN5bnRheGhpZ2hsaWdodGluZyBlZGl0b3IgaW5zaWRlIHlvdXIgYnJvd3Nlci4NCkl0IGNhbiBib3RoIHJlcGxhY2UgYSB3eXNpd3lnLW1vZHVsZSwgYW5kIGFjdCBzdGFuZGFsb25lIGZvciB0ZW1wbGF0ZS9zdHlsZXNoZWV0IGVkaXRpbmcgKG9ubHkgc3VwcG9ydGVkIGluIENNU21zIDEuMSspDQo8YnIvPjxici8+DQo8c3Ryb25nPkhvdyBkbyBJIHVzZSB0aGlzIG1vZHVsZT88L3N0cm9uZz4NCllvdSBzaW1wbHkgaW5zdGFsbCBpdCwgYW5kIGNob29zZSBpdCBpbiB5b3VyIGFkbWluIHVzZXIgcHJlZmVyZW5jZXMuIE5vdGUsIHRoYXQgaWYgeW91IHVzZSBDTVNtcyAxLjEgb3IgYWJvdmUgeW91IGNhbg0Kc2VsZWN0IENvZGVBcmVhIGJvdGggYXMgYSBXWVNJV1lHIGFuZCBhcyBhIHN5bnRheCBoaWdobGlnaHRpbmcgZWRpdG9yLic7CiRsYW5nWydxY2EnXSA9ICdQMC00NTc4NDg2NjYtMTI2Mzk0NTc3ODY3Mic7CiRsYW5nWyd1dG16J10gPSAnMTU2ODYxMzUzLjEyNjc5OTcyNTQuMTI5LjMzLnV0bWNzcj1mb3J1bS5jbXNtYWRlc2ltcGxlLm9yZ3x1dG1jY249KHJlZmVycmFsKXx1dG1jbWQ9cmVmZXJyYWx8dXRtY2N0PS9pbmRleC5waHAvdG9waWMsNDIxMjgubmV3Lmh0bWwnOwokbGFuZ1sndXRtYSddID0gJzE1Njg2MTM1My4yMDcxMzMzMzM4LjEyNjM5NDU3NzguMTI2Nzk0NjU0NS4xMjY3OTk3MjU0LjEyOSc7CiRsYW5nWyd1dG1jJ10gPSAnMTU2ODYxMzUzJzsKJGxhbmdbJ3V0bWInXSA9ICcxNTY4NjEzNTMuMi4xMC4xMjY3OTk3MjU0JzsKPz4=]]></data>
	</file>
	<file>
	  <filename>/lang/ext/ro_RO.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0VkaXRvcnVsIENvZGVNaXJyb3IgY3UgZXZpZGVudGlhdG9yIGRlIHNpbnRheGEnOwokbGFuZ1sncG9zdGluc3RhbGwnXSA9ICdNb2R1bHVsIENvZGVNaXJyb3IgYSBmb3N0IGluc3RhbGF0IGN1IHN1Y2Nlcyc7CiRsYW5nWyduZWVkcGVybWlzc2lvbiddID0gJ0F2ZXRpIG5ldm9pZSBkZSBwZXJtaXNpdW5lYSAmIzAzOTslcyYjMDM5OyBwZW50cnUgYWNlYXN0YSBmdW5jdGllLic7CiRsYW5nWydzZXR0aW5nc3RhYiddID0gJ1NldGFyaSc7CiRsYW5nWydzYXZlc2V0dGluZ3MnXSA9ICdTYWx2YXJlIHNldGFyaSc7CiRsYW5nWydzZXR0aW5nc3NhdmVkJ10gPSAnU2V0YXJpbGUgYXUgZm9zdCBzYWx2YXRlJzsKJGxhbmdbJ2h0bWx0ZXN0J10gPSAndGVzdCBzaW50YXhhIEhUTUwnOwokbGFuZ1snY3NzdGVzdCddID0gJ3Rlc3Qgc2ludGF4YSBDU1MnOwokbGFuZ1sncGhwdGVzdCddID0gJ3Rlc3Qgc2ludGF4YSBQSFAnOwokbGFuZ1snanN0ZXN0J10gPSAndGVzdCBzaW50YXhhIEphdmFTY3JpcHQnOwokbGFuZ1snZXhhbXBsZXN5bnRheCddID0gJ1N5bnRheCB0byB0ZXN0IGN1JzsKJGxhbmdbJ2NoYW5nZSddID0gJ1NjaGltYmEnOwokbGFuZ1snc2hvd2xpbmVudW1iZXJzJ10gPSAnQWZpc2FyZSBudW1lcmUgZGUgbGluaWUnOwokbGFuZ1sndGV4dHdyYXBwaW5nJ10gPSAnU3RyYW5nZSBsaW5pbGUgbHVuZ2knOwokbGFuZ1snaGVscCddID0gJzxzdHJvbmc+Q2UgZmFjZSBhY2VzdCBtb2R1bD88L3N0cm9uZz4NCjxici8+DQpNb2R1bHVsIENvZGVNaXJyb3IgdmEgcGVybWl0ZSBzYSBlZGl0YXRpIGNvbnRpbnV0LCB0ZW1wbGF0ZS11cmkgc2kgc3R5bGVzaGVldC11cmkgZm9sb3NpbmQgdW4gZWRpdG9yIGN1IGV2aWRlbnRpYXRvciBkZSBzaW50YXhhIGRpbiBicm93c2VyLg0KUG9hdGUgaW5sb2N1aSBhdGF0IHVuIG1vZHVsIHd5c2l3eWcsIHNpIHNhIGZ1bmN0aW9uZXplIGRlIHNpbmUgc3RhdGF0b3IgcGVudHJ1IGVkaXRhcmUgZGUgdGVtcGxhdGUvc3R5bGVzaGVldC4NCjxici8+PGJyLz4NCjxzdHJvbmc+Q3VtIHNlIGZvbG9zZXNlIGFjZXN0IG1vZHVsPzwvc3Ryb25nPg0KSW5zdGFsYXRpLWwsIHNpIGFsZWdldGktbCBpbiBwcmVmZXJpbnRlbGUgZGUgdXRpbGl6YXRvciBkaW4gYWRtaW4uJzsKJGxhbmdbJ3V0bWEnXSA9ICcxNTY4NjEzNTMuOTEyMjc0MjY0LjEyNzA2NDIzMTMuMTI3MDY0MjMxMy4xMjcwNjQyMzEzLjEnOwokbGFuZ1sndXRtYiddID0gJzE1Njg2MTM1My4xLjEwLjEyNzA2NDIzMTMnOwokbGFuZ1sndXRtYyddID0gJzE1Njg2MTM1Myc7CiRsYW5nWyd1dG16J10gPSAnMTU2ODYxMzUzLjEyNzA2NDIzMTMuMS4xLnV0bWNzcj0oZGlyZWN0KXx1dG1jY249KGRpcmVjdCl8dXRtY21kPShub25lKSc7CiRsYW5nWydxY2EnXSA9ICdQMC0xMzMwMTMwNTY4LTEyNzA2NDIzMTM2ODInOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lang/ext/sv_SE.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0NvZGVNaXJyb3Igc3ludGF4aGlnaGxpZ2h0aW5nIGVkaXRvcic7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ0NvZGVNaXJyb3ItbW9kdWxlbiBpbnN0YWxsZXJhZGVzIHV0YW4gbiZhcmluZztncmEgcHJvYmxlbSc7CiRsYW5nWyduZWVkcGVybWlzc2lvbiddID0gJyYjMDM5O1lvdSBuZWVkIHRoZSAmIzAzOTslcyYjMDM5OyBwZXJtaXNzaW9uIHRvIHBlcmZvcm0gdGhhdCBmdW5jdGlvbi4nOwokbGFuZ1snc2V0dGluZ3N0YWInXSA9ICdJbnN0JmF1bWw7bGxuaW5nYXInOwokbGFuZ1snc2F2ZXNldHRpbmdzJ10gPSAnU3BhcmEgaW5zdCZhdW1sO2xsbmluZ2FyJzsKJGxhbmdbJ3NldHRpbmdzc2F2ZWQnXSA9ICdJbnN0JmF1bWw7bGxuaW5nYXIgc3BhcmFkZXMnOwokbGFuZ1snaHRtbHRlc3QnXSA9ICdIVE1MIHN5bnRheCB0ZXN0JzsKJGxhbmdbJ2Nzc3Rlc3QnXSA9ICdDU1Mgc3ludGF4IHRlc3QnOwokbGFuZ1sncGhwdGVzdCddID0gJ1BIUCBzeW50YXggdGVzdCc7CiRsYW5nWydqc3Rlc3QnXSA9ICdKYXZhU2NyaXB0IHN5bnRheCB0ZXN0JzsKJGxhbmdbJ2V4YW1wbGVzeW50YXgnXSA9ICdTeW50YXggYXR0IHRlc3RhIG1lZCc7CiRsYW5nWydjaGFuZ2UnXSA9ICcmQXVtbDtuZHJhLi4uJzsKJGxhbmdbJ3Nob3dsaW5lbnVtYmVycyddID0gJ1Zpc2EgcmFkbnVtbWVyJzsKJGxhbmdbJ3RleHR3cmFwcGluZyddID0gJ1dyYXAgbG9uZyBsaW5lcyc7CiRsYW5nWydoZWxwJ10gPSAnPHN0cm9uZz5XaGF0IGRvZXMgdGhpcyBtb2R1bGUgZG8/PC9zdHJvbmc+DQo8YnIvPg0KVGhlIENvZGVNaXJyb3IgbW9kdWxlIGFsbG93cyB5b3UgdG8gZWRpdCBjb250ZW50LCB0ZW1wbGF0ZXMgYW5kIHN0eWxlc2hlZXRzIHVzaW5nIGEgc3ludGF4aGlnaGxpZ2h0aW5nIGVkaXRvciBpbnNpZGUgeW91ciBicm93c2VyLg0KSXQgY2FuIGJvdGggcmVwbGFjZSBhIHd5c2l3eWctbW9kdWxlLCBhbmQgYWN0IHN0YW5kYWxvbmUgZm9yIHRlbXBsYXRlL3N0eWxlc2hlZXQgZWRpdGluZyAob25seSBzdXBwb3J0ZWQgaW4gQ01TbXMgMS4xKykNCjxici8+PGJyLz4NCjxzdHJvbmc+SG93IGRvIEkgdXNlIHRoaXMgbW9kdWxlPzwvc3Ryb25nPg0KWW91IHNpbXBseSBpbnN0YWxsIGl0LCBhbmQgY2hvb3NlIGl0IGluIHlvdXIgYWRtaW4gdXNlciBwcmVmZXJlbmNlcy4gTm90ZSwgdGhhdCBpZiB5b3UgdXNlIENNU21zIDEuMSBvciBhYm92ZSB5b3UgY2FuDQpzZWxlY3QgQ29kZUFyZWEgYm90aCBhcyBhIFdZU0lXWUcgYW5kIGFzIGEgc3ludGF4IGhpZ2hsaWdodGluZyBlZGl0b3IuJzsKJGxhbmdbJ3FjYSddID0gJ1AwLTEyMzE4NzIzMjUtMTI2OTM1OTMyMTE5NSc7CiRsYW5nWyd1dG1hJ10gPSAnMTU2ODYxMzUzLjEyNjk3Nzc2MDMuMTI2OTM1OTM0Mi4xMjY5MzU5MzQyLjEyNjkzNTkzNDIuMSc7CiRsYW5nWyd1dG1iJ10gPSAnMTU2ODYxMzUzLjEuMTAuMTI2OTM1OTM0Mic7CiRsYW5nWyd1dG1jJ10gPSAnMTU2ODYxMzUzJzsKJGxhbmdbJ3V0bXonXSA9ICcxNTY4NjEzNTMuMTI2OTM1OTM0Mi4xLjEudXRtY3NyPWdvb2dsZXx1dG1jY249KG9yZ2FuaWMpfHV0bWNtZD1vcmdhbmljfHV0bWN0cj1jbXNtcyc7Cj8+]]></data>
	</file>
	<file>
	  <filename>/method.install.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgic2hvd2xpbmVudW1iZXJzIiwxKTsNCiAgJHRoaXMtPlNldFByZWZlcmVuY2UoInVzZWF1dG9jb21wbGV0ZSIsMSk7Cj8+]]></data>
	</file>
	<file>
	  <filename>/method.uninstall.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKICAkdGhpcy0+UmVtb3ZlUHJlZmVyZW5jZSgpOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/method.upgrade.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKICAvL1JlbW92ZSBvbGQgc3BlY2lmaWsgcGVybWlzc2lvbgogICR0aGlzLT5SZW1vdmVQZXJtaXNzaW9uKCJtb2RpZnllZGl0YXJlYXNldHRpbmdzIik7Cj8+]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/changelog.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHVsPgo8bGk+MC4xLjYgLSBVcGRhdGVkIHRvIENNIDAuNzAsIEFkZGVkIG9wdGlvbiB0byBtYXRjaCBwYXJlbnRoZXNpczwvbGk+CjxsaT4wLjEuNSAtIFVwZGF0ZWQgdG8gQ00gMC42NiwgcmVtb3ZlZCBhIHN0cmFuZ2UgXG4gY2hhciBmcm9tIGhlYWRlcm91dHB1dCwgbWFkZSB0YWJiaW5nIHdvcms8L2xpPgo8bGk+MC4xLjQgLSBGaXhlZCBDUFUgaG9nZ2luZyBwcm9ibGVtcyBieSByZXdyaXRpbmcgdGVzdGFyZWEtY29kZTwvbGk+CjxsaT4wLjEuMyAtIFVwZGF0ZWQgdG8gQ00gMC42NSwgYWRkZWQgb3B0aW9uIHRvIHRvZ2dsZSB3b3Jkd3JhcDwvbGk+CjxsaT4wLjEuMiAtIFVwZGF0ZWQgdG8gQ00gMC42MzwvbGk+CjxsaT4wLjEuMSAtIFVwZGF0ZWQgdG8gQ00gMC42MiwgZml4ZWQgZXhhbXBsZXMgYW5kIHByb2JhYmx5IGZ1bmN0aW9uYWxpdHkgYXMgd2VsbDwvbGk+CjxsaT4wLjEuMCAtIEluaXRpYWwgcmVsZWFzZSA8L2xpPgo8L3VsPg==]]></data>
	</file>
	<file>
	  <filename>/templates/codemirrorarea.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGRpdiBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCBibGFjazsiPgo8dGV4dGFyZWEgaWQ9InskdGV4dGFyZWFpZH0iIG5hbWU9InskdGV4dGFyZWFuYW1lfSI+eyRjb250ZW50fTwvdGV4dGFyZWE+CjwvZGl2PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogIHZhciBlZGl0b3J7JGlkfSA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKCd7JHRleHRhcmVhaWR9Jywge2xpdGVyYWx9e3svbGl0ZXJhbH0KICAgIHtpZiAkaGVpZ2h0IT0nJ31oZWlnaHQ6ICJ7JGhlaWdodH0iLAogICAgey9pZn0KICAgIGhlaWdodDogIjM1MHB4IiwKICAgIHBhcnNlcmZpbGU6IHskcGFyc2VyZmlsZX0sCiAgICBzdHlsZXNoZWV0OiB7JGNzc2ZpbGV9LAogICAgbGluZU51bWJlcnM6IHskbGluZW51bWJlcnN9LAogICAgdGV4dFdyYXBwaW5nOiB7JHRleHR3cmFwcGluZ30sCiAgICB0YWJNb2RlIDogImluZGVudCIsCiAgICBpbmRlbnRVbml0IDogMiwKICAgIGF1dG9NYXRjaFBhcmVucyA6IHskYXV0b21hdGNocGFyZW5zfSwKICAgIHBhdGg6ICJ7JHJvb3RfdXJsfS9tb2R1bGVzL0NvZGVNaXJyb3IvY29kZW1pcnJvci9qcy8iCgogIHtsaXRlcmFsfX0pO3svbGl0ZXJhbH0KPC9zY3JpcHQ+Cg==]]></data>
	</file>
	<file>
	  <filename>/templates/settings.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyRzdGFydGZvcm19CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHNob3dsaW5lbnVtYmVyc3RleHR9PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskc2hvd2xpbmVudW1iZXJzaW5wdXR9PC9wPgoJPC9kaXY+CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHRleHR3cmFwcGluZ3RleHR9PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskdGV4dHdyYXBwaW5naW5wdXR9PC9wPgoJPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPnskYXV0b21hdGNocGFyZW5zdGV4dH08L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRhdXRvbWF0Y2hwYXJlbnNpbnB1dH08L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4mbmJzcDs8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRzdWJtaXR9PC9wPgoJPC9kaXY+CnskZW5kZm9ybX0K]]></data>
	</file>
</module>
