<?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>MCMedias</name>
	<version>1.0.10</version>
  <mincmsversion>1.10</mincmsversion>
	<help><![CDATA[CjxoMz5IZWxwPC8zPgo8cD5UbyBjYWxsIGEgZ2FsbGVyeSwgdXNlIHtNQ01lZGlhcyBjb2xsZWN0aW9uX2lkPSJZb3VyIENvbGxlY3Rpb24gSUQiIHRlbXBsYXRlPSJZb3VyIHRlbXBsYXRlIn0uIFRlbXBsYXRlIGlzIG5vdCBtYW5kYXRvcnkuIFlvdSBjYW4gYWxzbyBwYXNzIGEgbGlzdCBvZiBjb2xsZWN0aW9ucyBJRHMgd2l0aCBwYXJhbSBjb2xsZWN0aW9uX2lkcyBhbmQgdGhlIGNvbGxlY3Rpb25zIGlkcyBzZXBhcmF0ZWQgYnkgY29tYS4gWW91IGNhbiBwYXNzIHBhcmFtcyBhbmQgcmVjdXBlcmF0ZSB0aGVtIHZpYSB7JG1jbWVkaWFzX3BhcmFtc308L3A+CjxoND5UaHVtYm5haWxzPC9oND4KPHA+VG8gY3JlYXRlIHRodW1ibmFpbHMsIHVzZSB7TUNNZWRpYXMgYWN0aW9uPSJ0aHVtYm5haWwiIHdpZHRoPTE1MCBoZWlnaHQ9MTUwIGZpbGU9JGZpbGUtPmdldFJlbGF0aXZlUGF0aCgpfSB3aGljaCB3aWxsIGNyZWF0ZSB0aGVtIGluIHRoZSBjYWNoZSBkaXJlY3RvcnkuPC9wPgo8cD5Zb3UgY2FuIGFsc28gdXNlIGFueSBwaWN0dXJlcyBpbnNpZGUgdGhlIC91cGxvYWRzLyBkaXJlY3RvcnkuIFlvdXIgZmlsZW5hbWUgc2hvdWxkIGJlZ2luIHdpdGggIi91cGxvYWRzLyI8L3A+CjxwPllvdSBjYW4gdXNlIHRoZSBzaG9ydGVyIHZlcnNpb246IHtUaHVtYm5haWx9PC9wPgo8cD48dT5PcHRpb25zPC91PjwvcD4KPHVsPgogIDxsaT53aWR0aDwvbGk+CiAgPGxpPmhlaWdodDwvbGk+CiAgPGxpPnNpemU6IHNldCBib3RoIHdpZHRoIGFuZCBoZWlnaHQ8L2xpPgogIDxsaT5tb2RlIChvbmx5ICJkZWZhdWx0IiBmb3IgdGhlIG1vbWVudCk8L2xpPgo8L3VsPgo8aDQ+Q292ZXI8L2g0Pgo8cD5Zb3UgY2FuIGdldCB0aGUgdGh1bWJuYWlsIG9mIHRoZSBjb3ZlciBvZiBhIGZpbGUgd2l0aCB7TUNNZWRpYXMgYWN0aW9uPSJ0aHVtYm5haWwiIHdpZHRoPTE1MCBoZWlnaHQ9MTUwfS4gSXQgdXNlcyB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFzIFRodW1ibmFpbHMuPC9wPgo8aDQ+RGlyZWN0IHRodW1ibmFpbGluZzwvaDQ+CjxwPklmIHlvdSBuZWVkIHRvIGRvIGEgImRpcmVjdCIgdGh1bWJuYWlsaW5nLCB5b3UgY2FuIHVzZSB0aGUgVVJMICcvdGh1bWJuYWlsL3BhdGhfdG9feW91cl9maWxlLmV4dCcgZGlyZWN0bHkgaW4gdGhlIFNSQyBhdHRyaWJ1dGUgb2YgeW91ciBpbWFnZS4gWW91IGNhbiBhbHNvIGFkZCB0aGUgZGVzaXJlIHNpemVzOiAnL3RodW1ibmFpbC8xNTAvcGF0aF90b195b3VyX2ZpbGUuZXh0JyB3aWxsIGNyZWF0ZSBhIDE1MHgxNTAgdGh1bWJuYWlsLiAnL3RodW1ibmFpbC8zMDAvMjAwL3BhdGhfdG9feW91cl9maWxlLmV4dCcgd2lsbCBjcmVhdGUgYSB0aHVtYm5haWwgMzAwcHggd2lkdGggYW5kIDIwMHB4IGhlaWdodC4gVGhvc2UgdXJsIHdpbGwgZGlyZWN0bHkgZGVsaXZlcnMgeW91IHRoZSBpbWFnZSAodGhyb3VnaCBhIHJlZGlyZWN0aW9uKS48L3A+CjxoND5EaXZlcnM8L2g0Pgo8cD5MaXN0IG9mIGZ1bmN0aW9ucyBvbiBhIE1DRmlsZSBlbnRyeTwvcD4KPHVsPgogIDxsaT5nZXRGaWxlU2l6ZSgpPC9saT4KICA8bGk+Z2V0RmlsZUV4dGVuc2lvbigpPC9saT4KICA8bGk+Z2V0RmlsZUljb24oKTwvbGk+CjwvdWw+CjxoMz5TdXBwb3J0PC9oMz4KPHA+QXMgcGVyIHRoZSBHUEwsIHRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYXMtaXMuIFBsZWFzZSByZWFkIHRoZSB0ZXh0IG9mIHRoZSBsaWNlbnNlIGZvciB0aGUgZnVsbCBkaXNjbGFpbWVyLjwvcD4KPGgzPkNvcHlyaWdodCBhbmQgTGljZW5zZTwvaDM+CjxwPkNvcHlyaWdodCAmY29weTsgMjAxMCwgSmVhbi1DaHJpc3RvcGhlIEN1dmVsaWVyIDxhIGhyZWY9Im1haWx0bzpqY2NAbW9ycmlzLWNoYXBtYW4uY29tIj4mbHQ7amNjQG1vcnJpcy1jaGFwbWFuLmNvbSZndDs8L2E+IC0gTW9ycmlzICZhbXA7IENoYXBtYW4uIEFsbCBSaWdodHMgQXJlIFJlc2VydmVkLjwvcD4KPHA+VGhpcyBtb2R1bGUgaGFzIGJlZW4gcmVsZWFzZWQgdW5kZXIgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTCI+R05VIFB1YmxpYyBMaWNlbnNlPC9hPi4gWW91IG11c3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlIGJlZm9yZSB1c2luZyB0aGUgbW9kdWxlLjwvcD48aDM+RGVwZW5kZW5jaWVzPC9oMz48dWw+PGxpPkNNU0Zvcm1zID0mZ3Q7IDEuMC4zPC9saT48L3VsPjxoMz5QYXJhbWV0ZXJzPC9oMz48dWw+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gbGFuZz0iZW5fVVMiIC0gUGFyYW1ldGVyIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGF0IGxhbmd1YWdlIHRvIHVzZSBmb3IgZGlzcGxheSBvbiB0aGUgZnJvbnRlbmQuIE5vdCBhbGwgbW9kdWxlcyBzdXBwb3J0IG9yIG5lZWQgdGhpcy48L2xpPjwvdWw+]]></help>
	<about><![CDATA[PGJyIC8+QXV0aG9yOiBKZWFuLUNocmlzdG9waGUgQ3V2ZWxpZXIgJmx0O2pjY0Btb3JyaXMtY2hhcG1hbi5jb20mZ3Q7PGJyIC8+PGJyIC8+VmVyc2lvbjogMS4wLjEwPGJyIC8+]]></about>
	<requires>
	  <requiredname>CMSForms</requiredname>
	  <requiredversion>1.0.3</requiredversion>
	</requires>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/.DS_Store</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[AAAAAUJ1ZDEAABAAAAAIAAAAEAAAAAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAIAAAABAAAQAHNwYmxvYgAAALBicAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAMAbABpAGJid3NwYmxvYgAAALBicGxpc3QwMNYBAgMEBQYHCAgICAxcV2luZG93Qm91bmRzW1Nob3dTaWRlYmFyXVNob3dTdGF0dXNCYXJbU2hvd1BhdGhiYXJbU2hvd1Rvb2xiYXJcU2lkZWJhcldpZHRoXxAZe3sxNTQ4LCAxOTF9LCB7OTY2LCA2NjN9fQkJCQkQhggVIi48SFRhfX5/gIEAAAAAAAABAQAAAAAAAAANAAAAAAAAAAAAAAAAAAAAgwAAAAMAbABpAGJ2U3JubG9uZwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAgLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAACAAAAABAAAAQAAAAAEAAACAAAAAAQAAAQAAAAABAAACAAAAAAEAAAQAAAAAAAAAAAEAABAAAAAAAQAAIAAAAAABAABAAAAAAAEAAIAAAAAAAQABAAAAAAABAAIAAAAAAAEABAAAAAAAAQAIAAAAAAABABAAAAAAAAEAIAAAAAAAAQBAAAAAAAABAIAAAAAAAAEBAAAAAAAAAQIAAAAAAAABBAAAAAAAAAEIAAAAAAAAARAAAAAAAAABIAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAEAsAAABFAAABCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBERTREIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAIAAAAGAAAAAAAAAAAQAAAIAAAAAAAAAAAQAAAgAAAAABAAAEAAAAAAIAAAgAAAAYAAAAAAAAAAABAAAgAAAAAAEAAEAAAAAAAQAAgAAAAAABAAEAAAAAAAEAAgAAAAAAAQAEAAAAAAABAAgAAAAAAAEAEAAAAAAAAQAgAAAAAAABAEAAAAAAAAEAgAAAAAAAAQEAAAAAAAABAgAAAAAAAAEEAAAAAAAAAQgAAAAAAAABEAAAAAAAAAEgAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==]]></data>
	</file>
	<file>
	  <filename>/action.adminList.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKICBpZiAoIWNtc21zKCkpIGV4aXQ7CgogIGlmICghJHRoaXMtPkNoZWNrQWNjZXNzKCkpIHsKICAgIGVjaG8gJHRoaXMtPkxhbmcoJ2FjY2Vzc2RlbmllZCcpOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgaWYoaXNzZXQoJHBhcmFtc1snY29sbGVjdGlvbl9pZCddKSkKICB7CiAgICAkY29sbGVjdGlvbiA9IG5ldyBNQ0ZpbGVDb2xsZWN0aW9uKCRwYXJhbXNbJ2NvbGxlY3Rpb25faWQnXSk7CiAgICAkY29sbGVjdGlvbi0+bG9hZCgpOwogICAgCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lkJywkaWQpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdjb2xsZWN0aW9uJywgJGNvbGxlY3Rpb24pOwogICAgCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2RlbGV0ZScsICR0aGlzLT5DcmVhdGVMaW5rKCRpZCwnZGVsZXRlJywnJywnJyxhcnJheSgpLCAnJywgdHJ1ZSkpOyAgICAKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignZGVsZXRlX2ljb24nLCAkdGhpcy0+Z2V0SW1hZ2VUYWcoJ2Jpbl9jbG9zZWQucG5nJywgJ0RlbGV0ZScpKTsKICAgIAogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdlZGl0Jywgc3RyX3JlcGxhY2UoJyZhbXA7JywnJicsICR0aGlzLT5DcmVhdGVMaW5rKCRpZCwnZWRpdFRpdGxlJywnJywnJyxhcnJheSgpLCAnJywgdHJ1ZSkgLiAnJmFtcDtzdXBwcmVzc291dHB1dD0xJmFtcDtzaG93dGVtcGxhdGU9MCcpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignc29ydCcsIHN0cl9yZXBsYWNlKCcmYW1wOycsJyYnLCAkdGhpcy0+Q3JlYXRlTGluaygkaWQsJ3NvcnQnLCcnLCcnLGFycmF5KCksICcnLCB0cnVlKSAuICcmYW1wO3N1cHByZXNzb3V0cHV0PTEmYW1wO3Nob3d0ZW1wbGF0ZT0wJykpOwogICAgCiAgICBlY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ2FkbWluLmxpc3QudHBsJyk7CiAgfQ==]]></data>
	</file>
	<file>
	  <filename>/action.adminPictureList.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKICBpZiAoIWNtc21zKCkpIGV4aXQ7CiAgaWYgKCEkdGhpcy0+Q2hlY2tBY2Nlc3MoKSkgewogICAgZWNobyAkdGhpcy0+TGFuZygnYWNjZXNzZGVuaWVkJyk7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBpZihpc3NldCgkcGFyYW1zWydjb2xsZWN0aW9uX2lkJ10pKQogIHsKICAgICRjb2xsZWN0aW9uID0gbmV3IE1DRmlsZUNvbGxlY3Rpb24oJHBhcmFtc1snY29sbGVjdGlvbl9pZCddKTsKICAgICRjb2xsZWN0aW9uLT5sb2FkKCk7CiAgICAKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaWQnLCRpZCk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2NvbGxlY3Rpb24nLCAkY29sbGVjdGlvbik7CiAgICAKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignZGVsZXRlJywgJHRoaXMtPkNyZWF0ZUxpbmsoJGlkLCdkZWxldGUnLCcnLCcnLGFycmF5KCksICcnLCB0cnVlKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2RlbGV0ZV9pY29uJywgJHRoaXMtPmdldEltYWdlVGFnKCdiaW5fY2xvc2VkLnBuZycsICdEZWxldGUnKSk7CiAgICAKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignZWRpdCcsIHN0cl9yZXBsYWNlKCcmYW1wOycsJyYnLCAkdGhpcy0+Q3JlYXRlTGluaygkaWQsJ2VkaXRUaXRsZScsJycsJycsYXJyYXkoKSwgJycsIHRydWUpIC4gJyZhbXA7c3VwcHJlc3NvdXRwdXQ9MSZhbXA7c2hvd3RlbXBsYXRlPTAnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3NvcnQnLCBzdHJfcmVwbGFjZSgnJmFtcDsnLCcmJywgJHRoaXMtPkNyZWF0ZUxpbmsoJGlkLCdzb3J0JywnJywnJyxhcnJheSgpLCAnJywgdHJ1ZSkgLiAnJmFtcDtzdXBwcmVzc291dHB1dD0xJmFtcDtzaG93dGVtcGxhdGU9MCcpKTsKICAgIAogICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdhZG1pbi5waWN0dXJlTGlzdC50cGwnKTsKICB9CiAgCg==]]></data>
	</file>
	<file>
	  <filename>/action.api.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKICBpZiAoIWNtc21zKCkpIGV4aXQ7CgppZigkdGhpcy0+R2V0UHJlZmVyZW5jZSgnZW5hYmxlX2FwaScsIGZhbHNlKSkKewogIGlmKGlzc2V0KCRwYXJhbXNbJ2NvbW1hbmQnXSkpCiAgewogICAgc3dpdGNoKCRwYXJhbXNbJ2NvbW1hbmQnXSkKICAgIHsKICAgICAgY2FzZSAnbGlzdCc6CiAgICAgICAgJHNlbGVjdGlvbiA9IE1DRmlsZTo6ZG9TZWxlY3QoKTsKICAgICAgICBpZihpc19hcnJheSgkc2VsZWN0aW9uKSkKICAgICAgICB7CiAgICAgICAgICAkaXRlbXMgPSBNQ0ZpbGU6Oml0ZW1zVG9BcnJheSgkc2VsZWN0aW9uKTsKICAgICAgICAgIAogICAgICAgICAgJGNhbGxiYWNrID0gJF9SRVFVRVNUWydjYWxsYmFjayddOwogICAgICAgICAgaWYgKCRjYWxsYmFjaykgewogICAgICAgICAgICAgIGhlYWRlcignQ29udGVudC10eXBlOiB0ZXh0L2phdmFzY3JpcHQnKTsKICAgICAgICAgICAgZWNobyAkY2FsbGJhY2sgLiAnKCcgLiB1dGY4X2VuY29kZShqc29uX2VuY29kZShhcnJheSgncmVzdWx0cycgPT4gJGl0ZW1zKSkpIC4gJyk7JzsKICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAKICAgICAgICAgICAgICBoZWFkZXIoJ0NvbnRlbnQtdHlwZTogYXBwbGljYXRpb24veC1qc29uJyk7CiAgICAgICAgICAgICAgZWNobyB1dGY4X2VuY29kZShqc29uX2VuY29kZShhcnJheSgncmVzdWx0cycgPT4gJGl0ZW1zKSkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgaGVhZGVyKCdDb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL3gtanNvbicpOyAgCiAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdlcnJvcicgPT4gJ05vIGl0ZW0gZm91bmQnKSk7CiAgICAgICAgfQogICAgICAgIGV4aXQ7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgfQoKICBoZWFkZXIoJ0NvbnRlbnQtdHlwZTogYXBwbGljYXRpb24veC1qc29uJyk7ICAKICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdlcnJvcicgPT4gJ0ludmFsaWQgY2FsbCcpKTsKfQplbHNlCnsKICBoZWFkZXIoJ0NvbnRlbnQtdHlwZTogYXBwbGljYXRpb24veC1qc29uJyk7ICAKICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdlcnJvcicgPT4gJ0FQSSBOb3QgZW5hYmxlZCcpKTsKfQ==]]></data>
	</file>
	<file>
	  <filename>/action.cover.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKICBpZiAoIWNtc21zKCkpIGV4aXQ7CiAgCiAgaWYoaXNzZXQoJHBhcmFtc1snY29sbGVjdGlvbl9pZCddKSkKICB7CiAgICAkY29sbGVjdGlvbiA9IG5ldyBNQ0ZpbGVDb2xsZWN0aW9uKCRwYXJhbXNbJ2NvbGxlY3Rpb25faWQnXSk7CiAgICAkY29sbGVjdGlvbi0+bG9hZE9uZSgpOwogICAgJGZpbGUgPSAkY29sbGVjdGlvbi0+Z2V0Rmlyc3RGaWxlKCk7CiAgICAKICAgIGlmKCRmaWxlKQogICAgewogICAgICAkcGFyYW1zWydmaWxlJ10gPSAkZmlsZS0+Z2V0UmVsYXRpdmVQYXRoKCk7CiAgICAgIGVjaG8gJHRoaXMtPmdldFRodW1ibmFpbCgkcGFyYW1zKTsKICAgIH0KICB9]]></data>
	</file>
	<file>
	  <filename>/action.default.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKICBpZiAoIWNtc21zKCkpIGV4aXQ7CiAgCiAgaWYoaXNzZXQoJHBhcmFtc1snY29sbGVjdGlvbl9pZCddKSkKICB7CiAgICAkY29sbGVjdGlvbiA9IG5ldyBNQ0ZpbGVDb2xsZWN0aW9uKCRwYXJhbXNbJ2NvbGxlY3Rpb25faWQnXSk7CiAgICAkY29sbGVjdGlvbi0+bG9hZCgpOwogICAgCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2NvbGxlY3Rpb24nLCAkY29sbGVjdGlvbik7CiAgICAKICAgIC8vICRwYXJhbXMgPSBhcnJheSgpOwogICAgCiAgfQogIGVsc2VpZihpc3NldCgkcGFyYW1zWydjb2xsZWN0aW9uX2lkcyddKSkKICB7CiAgICAkY29sbGVjdGlvbl9pZHMgPSBleHBsb2RlKCcsJywgJHBhcmFtc1snY29sbGVjdGlvbl9pZHMnXSk7CiAgICAkY29sbGVjdGlvbnMgPSBhcnJheSgpOwogICAgZm9yZWFjaCgkY29sbGVjdGlvbnNfaWQgYXMgJGNvbGxlY3Rpb25faWQpCiAgICB7CiAgICAgICRjb2xsZWN0aW9uc1skY29sbGVjdGlvbl9pZF0gPSBuZXcgTUNGaWxlQ29sbGVjdGlvbigkY29sbGVjdGlvbl9pZCk7CiAgICB9CiAgICAKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignY29sbGVjdGlvbnMnLCAkY29sbGVjdGlvbnMpOwogIH0KCiAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdtY21lZGlhc19wYXJhbXMnLCAkcGFyYW1zKTsKICAKICBlY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGVGb3IoJ2RlZmF1bHQnLCAkcGFyYW1zKTs=]]></data>
	</file>
	<file>
	  <filename>/action.defaultadmin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKICBpZiAoIWNtc21zKCkpIGV4aXQ7CiAgaWYgKCEkdGhpcy0+Q2hlY2tBY2Nlc3MoJ01vZGlmeSBUZW1wbGF0ZXMnKSkgewogICAgcmV0dXJuICR0aGlzLT5EaXNwbGF5RXJyb3JQYWdlKCk7CiAgfQoKICBlY2hvICR0aGlzLT5TdGFydFRhYkhlYWRlcnMoKTsKICBlY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIoJ3RlbXBsYXRlcycsICR0aGlzLT5MYW5nKCd0YWJfdGVtcGxhdGVzJyksZmFsc2UpOwogIGVjaG8gJHRoaXMtPlNldFRhYkhlYWRlcignb3B0aW9ucycsICR0aGlzLT5MYW5nKCd0YWJfb3B0aW9ucycpLChpc3NldCgkcGFyYW1zWydvcHRpb25fdGFiJ10pKT90cnVlOmZhbHNlKTsKICBlY2hvICR0aGlzLT5FbmRUYWJIZWFkZXJzKCk7CiAgCiAgZWNobyAkdGhpcy0+U3RhcnRUYWJDb250ZW50KCk7CiAgCiAgCiAgLy8gVEVNUExBVEVTCiAgZWNobyAkdGhpcy0+U3RhcnRUYWIoJ3RlbXBsYXRlcycpOwoKICAkbGlzdF90ZW1wbGF0ZXMgPSAkdGhpcy0+TGlzdFRlbXBsYXRlcygpOwogICR0ZW1wbGF0ZXMgPSBhcnJheSgpOwogIGZvcmVhY2goJGxpc3RfdGVtcGxhdGVzIGFzICR0ZW1wbGF0ZSkgewogIAkkcm93ID0gYXJyYXkoCiAgCQkndGl0bGVsaW5rJyA9PiAkdGhpcy0+Q3JlYXRlTGluaygkaWQsICd0ZW1wbGF0ZV9lZGl0JywgJHJldHVybmlkLCAkdGVtcGxhdGUsIGFycmF5KCd0ZW1wbGF0ZScgPT4gJHRlbXBsYXRlKSwgJycsIGZhbHNlLCBmYWxzZSwgJ2NsYXNzPSJpdGVtbGluayInKSwKICAJCSdkZWxldGVsaW5rJyA9PiAkdGhpcy0+Q3JlYXRlTGluaygkaWQsICd0ZW1wbGF0ZV9kZWxldGUnLCAkcmV0dXJuaWQsIGNtc21zKCktPmdldF92YXJpYWJsZSgnYWRtaW50aGVtZScpLT5EaXNwbGF5SW1hZ2UoJ2ljb25zL3N5c3RlbS9kZWxldGUuZ2lmJywgJHRoaXMtPkxhbmcoJ2RlbGV0ZScpLCAnJywgJycsICdzeXN0ZW1pY29uJyksIGFycmF5KCd0ZW1wbGF0ZScgPT4gJHRlbXBsYXRlKSwgJHRoaXMtPmxhbmcoJ2FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyB0ZW1wbGF0ZScpKSwKICAJCSdlZGl0bGluaycgPT4gJHRoaXMtPkNyZWF0ZUxpbmsoJGlkLCAndGVtcGxhdGVfZWRpdCcsICRyZXR1cm5pZCwgY21zbXMoKS0+Z2V0X3ZhcmlhYmxlKCdhZG1pbnRoZW1lJyktPkRpc3BsYXlJbWFnZSgnaWNvbnMvc3lzdGVtL2VkaXQuZ2lmJywgJHRlbXBsYXRlLCAnJywgJycsICdzeXN0ZW1pY29uJyksIGFycmF5KCd0ZW1wbGF0ZScgPT4gJHRlbXBsYXRlKSkKICAJKTsKCiAgCWlmICgkdGhpcy0+aXNEZWZhdWx0VGVtcGxhdGUoJHRlbXBsYXRlKSAhPT0gZmFsc2UpCiAgCXsKICAJCSRyb3dbJ2RlZmF1bHQnXSA9ICR0aGlzLT5sYW5nKCdkZWZhdWx0IHRlbXBsYXRlIGZvcicsICR0aGlzLT5pc0RlZmF1bHRUZW1wbGF0ZSgkdGVtcGxhdGUpKTsKICAJfQogIAllbHNlCiAgCXsKICAJCSRyb3dbJ2RlZmF1bHQnXSA9ICcnOwogIAl9CgogIAkkdGVtcGxhdGVzW10gPSAkcm93OwogIH0KICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RlbXBsYXRlcycsICR0ZW1wbGF0ZXMpOwogICR0aGlzLT5zbWFydHktPmFzc2lnbignYWRkX3RlbXBsYXRlc19saW5rJywgJHRoaXMtPkNyZWF0ZUxpbmsoJGlkLCAndGVtcGxhdGVfZWRpdCcsICRyZXR1cm5pZCwgJHRoaXMtPkxhbmcoJ2FkZCB0ZW1wbGF0ZScpKSk7CiAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdhZGRfdGVtcGxhdGVzX2ljb24nLCAkdGhpcy0+Q3JlYXRlTGluaygkaWQsICd0ZW1wbGF0ZV9lZGl0JywgJHJldHVybmlkLCBjbXNtcygpLT5nZXRfdmFyaWFibGUoJ2FkbWludGhlbWUnKS0+RGlzcGxheUltYWdlKCdpY29ucy9zeXN0ZW0vbmV3b2JqZWN0LmdpZicsICR0aGlzLT5MYW5nKCdhZGQgdGVtcGxhdGUnKSwgJycsICcnLCAnc3lzdGVtaWNvbicpKSk7CgogIGVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnYWRtaW4udGVtcGxhdGVzLnRwbCcpOwogIGVjaG8gJHRoaXMtPkVuZFRhYigpOwoKICBlY2hvICR0aGlzLT5TdGFydFRhYignb3B0aW9ucycpOwogIAogICRmb3JtID0gbmV3IENNU0Zvcm0oJ01DTWVkaWFzJywgJGlkLCAnZGVmYXVsdGFkbWluJywgJHJldHVybmlkKTsKICAKICAkZm9ybS0+c2V0V2lkZ2V0KCdvcHRpb25fdGFiJywgJ2hpZGRlbicsIGFycmF5KCd2YWx1ZScgPT4gMSkpOwoKCSRmb3JtLT5zZXRXaWRnZXQoJ3VwbG9hZHNfcGF0aCcsICd0ZXh0JywgYXJyYXkoJ3ByZWZlcmVuY2UnID0+ICd1cGxvYWRzX3BhdGgnKSk7CgoJJHN5bmNfdXJsID0gCSRhcGlfdXJsID0gJHRoaXMtPmNvbmZpZy0+c21hcnRfcm9vdF91cmwoKSAuICcvbWNtZWRpYXMvc3luYy9hbGwnOwogICRmb3JtLT5zZXRXaWRnZXQoJ3JlbW90ZV9nYWxsZXJ5JywgJ3RleHQnLCBhcnJheSgncHJlZmVyZW5jZScgPT4gJ3JlbW90ZV9nYWxsZXJ5JywgJ3RpcHMnID0+ICc8YSBocmVmPSInLiRzeW5jX3VybC4nIiByZWY9ImV4dGVybmFsIiB0YXJnZXQ9Il9uZXciPlN5bmM8L2E+JykpOwoKCSRhcGlfdXJsID0gJHRoaXMtPmNvbmZpZy0+c21hcnRfcm9vdF91cmwoKSAuICcvbWNtZWRpYXMvYXBpL2xpc3QnOwogICRmb3JtLT5zZXRXaWRnZXQoJ2VuYWJsZV9hcGknLCAnY2hlY2tib3gnLCBhcnJheSgncHJlZmVyZW5jZScgPT4gJ2VuYWJsZV9hcGknLCAndGlwcycgPT4gJzxhIGhyZWY9IicuJGFwaV91cmwuJyIgcmVmPSJleHRlcm5hbCIgdGFyZ2V0PSJfbmV3Ij4nLiRhcGlfdXJsLic8L2E+JykpOwogIAogIGlmKCRmb3JtLT5pc1Bvc3RlZCgpKQogIHsKICAgICRmb3JtLT5wcm9jZXNzKCk7CiAgICBpZigkZm9ybS0+bm9FcnJvcigpKQogICAgewogICAgICAvLwogICAgfQogIH0KICAKICBlY2hvICRmb3JtLT5yZW5kZXIoKTsKICAKICBlY2hvICR0aGlzLT5FbmRUYWIoKTsKCgogIGVjaG8gJHRoaXMtPkVuZFRhYkNvbnRlbnQoKTsKCglpZihjbXNfdXRpbHM6OmdldF9tb2R1bGUoJ01vZHVsZVh0ZW5kZXInKSkKCXsKCQllY2hvICc8ZGl2IHN0eWxlPSJtYXJnaW4tdG9wOiAxNXB4OyI+PHA+Jy4kdGhpcy0+Q3JlYXRlTGluaygkaWQsICdtaWdyYXRlTVgnLCAkcmV0dXJuaWQsICdNaWdyYXRlIGNvbnRlbnQgZnJvbSBNb2R1bGVYdGVuZGVyJywgYXJyYXkoKSwgJycsIGZhbHNlLCB0cnVlLCAnIGNsYXNzPSJwYWdlYmFjayB1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwiJykuJzwvcD48L2Rpdj4nOwoJfQ==]]></data>
	</file>
	<file>
	  <filename>/action.delete.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKICBoZWFkZXIoJ0NvbnRlbnQtdHlwZTogdGV4dC9wbGFpbicpOwogIGlmICghY21zbXMoKSkgZXhpdDsKICBpZiAoISR0aGlzLT5DaGVja0FjY2VzcygpKSB7CiAgICByZXR1cm4gJHRoaXMtPkRpc3BsYXlFcnJvclBhZ2UoKTsKICB9CgogIGlmKGlzc2V0KCRwYXJhbXNbJ2ZpbGVfaWQnXSkpCiAgewogICAgJGZpbGUgPSBNQ0ZpbGU6OmRvU2VsZWN0T25lKGFycmF5KCd3aGVyZScgPT4gYXJyYXkoJ2lkJyA9PiAkcGFyYW1zWydmaWxlX2lkJ10pKSk7CiAgICAgICAgCiAgICBpZighaXNfbnVsbCgkZmlsZSkpCiAgICB7CiAgICAgICRmaWxlLT5kZWxldGUoKTsKICAgICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnc3VjY2VzcycgPT4gdHJ1ZSkpOwogICAgICBleGl0OwogICAgfQogIH0KICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdlcnJvcicgPT4gdHJ1ZSkpOw==]]></data>
	</file>
	<file>
	  <filename>/action.editTitle.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaGVhZGVyKCdDb250ZW50LXR5cGU6IHRleHQvcGxhaW4nKTsKaWYgKCFjbXNtcygpKSBleGl0OwppZiAoISR0aGlzLT5DaGVja0FjY2VzcygpKSB7CiAgcmV0dXJuICR0aGlzLT5EaXNwbGF5RXJyb3JQYWdlKCk7Cn0KCmlmKGlzc2V0KCRwYXJhbXNbJ21lZGlhX2lkJ10pKQp7CiAgJG1lZGlhX2lkID0gc3RyX3JlcGxhY2UoJ21lZGlhXycsICcnLCAkcGFyYW1zWydtZWRpYV9pZCddKTsKICAKICAkbWVkaWEgPSBNQ0ZpbGU6OnJldHJpZXZlQnlQaygkbWVkaWFfaWQpOwogIAogIGlmKCRtZWRpYSkKICB7CiAgICAkbWVkaWEtPnNldFRpdGxlKCRwYXJhbXNbJ3ZhbHVlJ10pOwogICAgJG1lZGlhLT5zYXZlKCk7CiAgICBlY2hvICRwYXJhbXNbJ3ZhbHVlJ107CiAgfQogIGVsc2UKICB7CiAgICBlY2hvICdBbiBlcnJvciBvY2N1cmVkOiBXZSBjYW5ub3QgZmluZCB0aGlzIG1lZGlhLiBUcnkgYWdhaW4uJzsKICB9Cn0KZWxzZQp7CiAgICBlY2hvICdBbiBlcnJvciBvY2N1cmVkOiBObyBtZWRpYSBJRCBkZWZpbmVkLiBUcnkgYWdhaW4uJzsKICAgIC8vIHZhcl9kdW1wKCRwYXJhbXMpOwp9]]></data>
	</file>
	<file>
	  <filename>/action.migrateMX.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKICBpZiAoIWNtc21zKCkpIGV4aXQ7CiAgaWYgKCEkdGhpcy0+Q2hlY2tBY2Nlc3MoKSkgewogICAgcmV0dXJuICR0aGlzLT5EaXNwbGF5RXJyb3JQYWdlKCk7CiAgfQoKCS8vIFNjcmlwdCB0byBtaWdyYXRlIGltYWdlcyBvciBkb2N1bWVudHMgZnJvbSBNb2R1bGVYdGVuZGVyIHRvIE1DTWVkaWFzCgkKCS8vIFdlIG5lZWQgTUNGYWN0b3J5CgkKCWlmKCFjbXNfdXRpbHM6OmdldF9tb2R1bGUoJ01DRmFjdG9yeScsICczLjQuOScpIHx8ICFjbXNfdXRpbHM6OmdldF9tb2R1bGUoJ01vZHVsZVh0ZW5kZXInLCAnMS4xMS4yCScpKQoJewoJCWVjaG8gJ1lvdSBkb25cJ3QgaGF2ZSBNQ0ZhY3Rvcnkgb3IgTW9kdWxlWHRlbmRlciBvciB0aGUgdmVyc2lvbiB5b3UgaGF2ZSBpcyBub3QgdGhlIGxhdGVzdCBvbmUgKE1DRmFjdG9yeSAzLjQuMTAgYW5kIE1vZHVsZVh0ZW5kZXIgMS4xMS4yIHJlcXVpcmVkKSc7CgkJZXhpdDsKCX0KCQoJaWYoaXNzZXQoJHBhcmFtc1snY2FuY2VsJ10pKQoJewogICAgCSR0aGlzLT5SZWRpcmVjdCgkaWQsICdkZWZhdWx0YWRtaW4nLCAkcmV0dXJuaWQpOwoJfQoJCQoJaWYoaXNzZXQoJHBhcmFtc1snbW9kdWxlJ10pKQoJewoJCSRtb2R1bGUgPSBNQ0ZNb2R1bGVSZXBvc2l0b3J5OjpyZXRyaWV2ZUJ5TmFtZSgkcGFyYW1zWydtb2R1bGUnXSk7CgkJJGZpZWxkcyA9ICRtb2R1bGUtPmdldEZpZWxkc1dpdGhUeXBlcyhhcnJheSgnaW1hZ2VzJywgJ2ZpbGVzJykpOwoJCSRpbWFnZXNfZmllbGRzID0gJG1vZHVsZS0+Z2V0RmllbGRzV2l0aFR5cGVzKGFycmF5KCdpbWFnZXMnKSk7CgkJJGRvY3VtZW50c19maWVsZHMgPSAkbW9kdWxlLT5nZXRGaWVsZHNXaXRoVHlwZXMoYXJyYXkoJ2ZpbGVzJykpOwoJCQoJCWlmKGlzc2V0KCRwYXJhbXNbJ2ZpZWxkcyddKSkKCQl7CgkJCS8vIFN0YXJ0IHRoZSBtaWdyYXRpb24KCQkJCgkJCSRtb2QgPSBjbXNfdXRpbHM6OmdldF9tb2R1bGUoJG1vZHVsZS0+Z2V0TW9kdWxlTmFtZSgpKTsKCQkJLy8gdmFyX2R1bXAoJG1vZHVsZSk7CgkJCSRjID0gbmV3IE1DRkNyaXRlcmlhKCk7CgkJCSRlbnRpdGllcyA9ICRtb2QtPmRvU2VsZWN0KCRjKTsKCQkJZWNobyAnPHA+Jy5jb3VudCgkZW50aXRpZXMpLicgdG8gdXBkYXRlPC9wPic7CQkJCgkJCSRteF9lbnRpdGllcyA9IE1YX0RvY3VtZW50Ojpkb1NlbGVjdEJ5TW9kdWxlTmFtZSgkbW9kLT5nZXROYW1lKCkpOwkJCQoJCQkvLyB2YXJfZHVtcCgkbXhfZW50aXRpZXMpOwoJCQlpZigkZW50aXRpZXMpCgkJCXsKCQkJCWZvcmVhY2goJGVudGl0aWVzIGFzICRlbnRpdHkpCgkJCQl7CgkJCQkJZWNobyAnPHA+ID0+IFVwZGF0ZSBlbnRpdHkgd2l0aCBpZCAnLiRlbnRpdHktPmdldElkKCkuJzwvcD4nOwoJCQkJCS8vIERvY3VtZW50cwoJCQkJCWlmKGlzc2V0KCRteF9lbnRpdGllc1snZG9jdW1lbnQnXSkpCgkJCQkJewoJCQkJCQlpZigoY291bnQoJGRvY3VtZW50c19maWVsZHMpID4gMCkgJiYgKGNvdW50KCRteF9lbnRpdGllc1snZG9jdW1lbnQnXVskZW50aXR5LT5nZXRJZCgpXSkgPiAwKSkKCQkJCQkJewoJCQkJCQkJZWNobyAnPHA+ID09PiAnLmNvdW50KCRteF9lbnRpdGllc1snZG9jdW1lbnQnXVskZW50aXR5LT5nZXRJZCgpXSkuJyBkb2N1bWVudChzKSB0byBpbXBvcnQ8L3A+JzsKCgkJCQkJCQlmb3JlYWNoKCRwYXJhbXNbJ2ZpZWxkcyddIGFzICRmaWVsZCkKCQkJCQkJCXsKCQkJCQkJCQlpZihpc3NldCgkZG9jdW1lbnRzX2ZpZWxkc1skZmllbGRdKSkKCQkJCQkJCQl7CgkJCQkJCQkJCSRmID0gJGRvY3VtZW50c19maWVsZHNbJGZpZWxkXTsKCQkJCQkJCQkJLy8gVGhlIG1pZ3JhdGlvbiBzdGFydAoJCQkJCQkJCQllY2hvICc8cD4gPT09PiBNaWdyYXRlIHRvIGZpZWxkICcuJGZbJ25hbWUnXS4nPC9wPic7CgkJCQkJCQkJCQoJCQkJCQkJCQlpZigkZW50aXR5LT4kZlsnbmFtZSddICE9ICcnKQoJCQkJCQkJCQl7CgkJCQkJCQkJCQkkY29sbGVjdGlvbiA9IG5ldyBNQ0ZpbGVDb2xsZWN0aW9uKCRlbnRpdHktPiRmWyduYW1lJ10pOwoJCQkJCQkJCQl9CgkJCQkJCQkJCWVsc2UKCQkJCQkJCQkJewoJCQkJCQkJCQkJJGNvbGxlY3Rpb24gPSBuZXcgTUNGaWxlQ29sbGVjdGlvbigpOwoJCQkJCQkJCQkJJGVudGl0eS0+JGZbJ25hbWUnXSA9ICRjb2xsZWN0aW9uLT5nZXRDb2xsZWN0aW9uSWQoKTsKCQkJCQkJCQkJCSRlbnRpdHktPnNhdmUoKTsKCQkJCQkJCQkJfQoJCQkJCQkJCQkKCQkJCQkJCQkJZm9yZWFjaCgkbXhfZW50aXRpZXNbJ2RvY3VtZW50J11bJGVudGl0eS0+Z2V0SWQoKV0gYXMgJGZpbGUpCgkJCQkJCQkJCXsKCQkJCQkJCQkJCSRtb3ZlID0gZmFsc2U7CgkJCQkJCQkJCQlpZihpc3NldCgkcGFyYW1zWydtb3ZlJ10pKSB7ICRtb3ZlID0gdHJ1ZTsgfQoJCQkJCQkJCQkJJGNvbGxlY3Rpb24tPmFkZEZpbGUoJGZpbGUtPmdldERvY3VtZW50UGF0aCgpLCAkbW92ZSk7CgkJCQkJCQkJCQkkY29sbGVjdGlvbi0+Z2V0TGFzdEZpbGUoKS0+c2V0VGl0bGUoJGZpbGUtPmdldFRpdGxlKCkpOwoJCQkJCQkJCQkJJGNvbGxlY3Rpb24tPmdldExhc3RGaWxlKCktPnNhdmUoKTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCQkvLyBJbWFnZXMKCQkJCQlpZihpc3NldCgkbXhfZW50aXRpZXNbJ2ltYWdlJ10pKQoJCQkJCXsKCQkJCQkJaWYoKGNvdW50KCRpbWFnZXNfZmllbGRzKSA+IDApICYmIChjb3VudCgkbXhfZW50aXRpZXNbJ2ltYWdlJ11bJGVudGl0eS0+Z2V0SWQoKV0pID4gMCkpCgkJCQkJCXsKCQkJCQkJCWVjaG8gJzxwPiA9PT4gJy5jb3VudCgkbXhfZW50aXRpZXNbJ2ltYWdlJ11bJGVudGl0eS0+Z2V0SWQoKV0pLicgaW1hZ2UocykgdG8gaW1wb3J0PC9wPic7CgoJCQkJCQkJZm9yZWFjaCgkcGFyYW1zWydmaWVsZHMnXSBhcyAkZmllbGQpCgkJCQkJCQl7CgkJCQkJCQkJaWYoaXNzZXQoJGltYWdlc19maWVsZHNbJGZpZWxkXSkpCgkJCQkJCQkJewoJCQkJCQkJCQkkZiA9ICRpbWFnZXNfZmllbGRzWyRmaWVsZF07CgkJCQkJCQkJCS8vIFRoZSBtaWdyYXRpb24gc3RhcnQKCQkJCQkJCQkJZWNobyAnPHA+ID09PT4gTWlncmF0ZSB0byBmaWVsZCAnLiRmWyduYW1lJ10uJzwvcD4nOwoJCQkJCQkJCQkKCQkJCQkJCQkJaWYoJGVudGl0eS0+JGZbJ25hbWUnXSAhPSAnJykKCQkJCQkJCQkJewoJCQkJCQkJCQkJJGNvbGxlY3Rpb24gPSBuZXcgTUNGaWxlQ29sbGVjdGlvbigkZW50aXR5LT4kZlsnbmFtZSddKTsKCQkJCQkJCQkJfQoJCQkJCQkJCQllbHNlCgkJCQkJCQkJCXsKCQkJCQkJCQkJCSRjb2xsZWN0aW9uID0gbmV3IE1DRmlsZUNvbGxlY3Rpb24oKTsKCQkJCQkJCQkJCSRlbnRpdHktPiRmWyduYW1lJ10gPSAkY29sbGVjdGlvbi0+Z2V0Q29sbGVjdGlvbklkKCk7CgkJCQkJCQkJCQkkZW50aXR5LT5zYXZlKCk7CgkJCQkJCQkJCX0KCQkJCQkJCQkJCgkJCQkJCQkJCWZvcmVhY2goJG14X2VudGl0aWVzWydpbWFnZSddWyRlbnRpdHktPmdldElkKCldIGFzICRmaWxlKQoJCQkJCQkJCQl7CgkJCQkJCQkJCQkkbW92ZSA9IGZhbHNlOwoJCQkJCQkJCQkJLy8gaWYoaXNzZXQoJHBhcmFtc1snbW92ZSddKSkgeyAkbW92ZSA9IHRydWU7IH0KCQkJCQkJCQkJCSRjb2xsZWN0aW9uLT5hZGRGaWxlKCRmaWxlLT5nZXREb2N1bWVudFBhdGgoKSwgJG1vdmUpOwoJCQkJCQkJCQkJCgkJCQkJCQkJCQkkY29sbGVjdGlvbi0+Z2V0TGFzdEZpbGUoKS0+c2V0VGl0bGUoJGZpbGUtPmdldFRpdGxlKCkpOwoJCQkJCQkJCQkJJGNvbGxlY3Rpb24tPmdldExhc3RGaWxlKCktPnNhdmUoKTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCQoJCQkJfQoJCQkJCgkJCQllY2hvICc8cD5Zb3VyIGZpbGVzIGhhcyBiZWVuIG1pZ3JhdGVkLiBEb25cJ3QgZm9yZ2V0IHRvIGRlbGV0ZSB0aGVtIGZvcm0gdGhlIHNlcnZlciB1cGxvYWRzIGRpcmVjdG9yeS48L3A+JzsKCQkJfQoJCQkKCQkJCgkJCQoJCX0KCQllbHNlCgkJewoJCQkkZm9ybSA9IG5ldyBDTVNGb3JtKCdNQ01lZGlhcycsICRpZCwgJ21pZ3JhdGVNWCcsICRyZXR1cm5pZCk7CgkJCSRmb3JtLT5zZXRXaWRnZXQoJ21vZHVsZScsICdoaWRkZW4nKTsKCQkKCQkJJGNob2ljZSA9IGFycmF5KCk7CgkJCQoJCQlmb3JlYWNoKCRmaWVsZHMgYXMgJGZpZWxkKQoJCQl7CgkJCQkkY2hvaWNlWyRmaWVsZFsnbmFtZSddXSA9ICRmaWVsZFsnbmFtZSddIC4gJyAoJy4kZmllbGRbJ3R5cGUnXS4nKSc7CgkJCX0KCgkJCSRmb3JtLT5zZXRXaWRnZXQoJ2ZpZWxkcycsICdzZWxlY3QnLCBhcnJheSgndmFsdWVzJyA9PiAkY2hvaWNlLCAnbXVsdGlwbGUnID0+IHRydWUsICdleHBhbmRlZCcgPT4gdHJ1ZSwgJ3RpcHMnID0+ICR0aGlzLT5sYW5nKCdmb3JtX3NlbGVjdF9maWVsZHNfdG9fcG9wdWxhdGUnKSkpOwoKCQkJJGZvcm0tPnNldExhYmVsKCdzdWJtaXQnLCAkdGhpcy0+bGFuZygnQ29udGludWUnKSk7CQkJCgkJCWVjaG8gJGZvcm0tPnJlbmRlcigpOwoJCX0KCX0KCWVsc2UKCXsKCQkkbW9kdWxlcyA9IE1DRk1vZHVsZVJlcG9zaXRvcnk6OmdldE1vZHVsZXNXaXRoRmllbGRUeXBlcyhhcnJheSgnaW1hZ2VzJywnZmlsZXMnKSk7CgkJCgkJaWYoY291bnQoJG1vZHVsZXMpID4gMCkKCQl7CgkJCSRmb3JtID0gbmV3IENNU0Zvcm0oJ01DTWVkaWFzJywgJGlkLCAnbWlncmF0ZU1YJywgJHJldHVybmlkKTsKCQkJCgkJCSRtb2R1bGVzX25hbWUgPSBhcnJheSgpOwoJCQlmb3JlYWNoKCRtb2R1bGVzIGFzICRtb2R1bGUpCgkJCXsKCQkJCSRtb2R1bGVzX25hbWVbJG1vZHVsZS0+Z2V0TW9kdWxlTmFtZSgpXSA9ICRtb2R1bGUtPmdldE1vZHVsZUZyaWVuZGx5TmFtZSgpOwoJCQl9CgkJCQoJCQkkZm9ybS0+c2V0V2lkZ2V0KCdtb2R1bGUnLCAnc2VsZWN0JywgYXJyYXkoJ3ZhbHVlcycgPT4gJG1vZHVsZXNfbmFtZSwgJ3RpcHMnID0+ICR0aGlzLT5sYW5nKCdmb3JtX3NlbGVjdF9tb2R1bGVfZm9yX21pZ3JhdGlvbicpKSk7CgkJCQoJCQkkZm9ybS0+c2V0TGFiZWwoJ3N1Ym1pdCcsICR0aGlzLT5sYW5nKCdDb250aW51ZScpKTsKCQkJCgkJCWVjaG8gJGZvcm0tPnJlbmRlcigpOwoJCX0KICAJCgl9]]></data>
	</file>
	<file>
	  <filename>/action.sort.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKICBoZWFkZXIoJ0NvbnRlbnQtdHlwZTogdGV4dC9wbGFpbicpOwogIGlmICghY21zbXMoKSkgZXhpdDsKICBpZiAoISR0aGlzLT5DaGVja0FjY2VzcygpKSB7CiAgICByZXR1cm4gJHRoaXMtPkRpc3BsYXlFcnJvclBhZ2UoKTsKICB9CiAgCiAgaWYoaXNzZXQoJHBhcmFtc1snbWVkaWFfaWQnXSkgJiYgaXNfYXJyYXkoJHBhcmFtc1snbWVkaWFfaWQnXSkpCiAgewogICAgZm9yZWFjaCgkcGFyYW1zWydtZWRpYV9pZCddIGFzICRwb3NpdGlvbiA9PiAkbWVkaWFfaWQpCiAgICB7CiAgICAgIC8vIGVjaG8gJHBvc2l0aW9uOwogICAgICRmaWxlID0gTUNGaWxlOjpyZXRyaWV2ZUJ5UGsoJG1lZGlhX2lkKTsKICAgICAkZmlsZS0+c2V0UG9zaXRpb24oJHBvc2l0aW9uKzEpOwogICAgICRmaWxlLT5zYXZlKCk7CiAgICB9ICAKCiAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdzdWNjZXNzJyA9PiB0cnVlKSk7CiAgICAvLyBleGl0OwogICAgCiAgfQogIAogIGVjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ2Vycm9yJyA9PiB0cnVlKSk7]]></data>
	</file>
	<file>
	  <filename>/action.sync.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKICBpZiAoIWNtc21zKCkpIGV4aXQ7CgoJaWYoJHJlbW90ZV91cmwgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgncmVtb3RlX2dhbGxlcnknLCBmYWxzZSkpCgl7CgkJJGpzb24gPSBmaWxlX2dldF9jb250ZW50cygkcmVtb3RlX3VybCk7CgkJCgkJaWYoJGpzb24gIT09IGZhbHNlKQoJCXsKCQkJJG1lZGlhcyA9IGpzb25fZGVjb2RlKCRqc29uKTsKCQkJCQkJCgkJCWlmKGlzc2V0KCRtZWRpYXMtPnJlc3VsdHMpKQoJCQl7CgkJCQkkZWxlbWVudHMgPSAwOwoJCQkJJHVwZGF0ZSA9IDA7CgkJCQkkaW5zZXJ0ID0gMDsKCQkJCS8vIHZhcl9kdW1wKCRtZWRpYXMtPnJlc3VsdHMpOwoJCQkJZm9yZWFjaCgkbWVkaWFzLT5yZXN1bHRzIGFzICRtZWRpYSkKCQkJCXsKCQkJCQkkZWxlbWVudHMrKzsKCQkJCQkkc2F2ZV9wYXJhbXMgPSBhcnJheSgnZnJvbnRlbmQnID0+IHRydWUsICdub190aW1lX2luY3JlbWVudCcgPT4gdHJ1ZSk7CgkJCQkJLy8gdmFyX2R1bXAoJG1lZGlhKTsJCQkJCQoJCQkJCWlmKCRsb2NhbF9tZWRpYSA9IE1DRmlsZTo6cmV0cmlldmVCeVBrKCRtZWRpYS0+aWQpKQoJCQkJCXsKCQkJCQkJCgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCSRsb2NhbF9tZWRpYSA9IG5ldyBNQ0ZpbGUoJG1lZGlhLT5jb2xsZWN0aW9uX2lkKTsKCQkJCQkJJGxvY2FsX21lZGlhLT5zZXRJZCgkbWVkaWEtPmlkKTsKCQkJCQkJJHNhdmVfcGFyYW1zWydmb3JjZV9pbnNlcnQnXSA9IHRydWU7CgkJCQkJfQoJCQkJCQoJCQkJCWlmKCRsb2NhbF9tZWRpYS0+Z2V0VXBkYXRlZEF0KCkgIT0gJG1lZGlhLT51cGRhdGVkX2F0KQoJCQkJCXsKCQkJCQkJaWYoaXNzZXQoJHNhdmVfcGFyYW1zWydmb3JjZV9pbnNlcnQnXSkpIHsgJGluc2VydCsrOyB9IGVsc2UgeyAkdXBkYXRlKys7IH0KCQkJCQkJJGxvY2FsX21lZGlhLT5zZXRDcmVhdGVkQXQoJG1lZGlhLT5jcmVhdGVkX2F0KTsKCQkJCQkJJGxvY2FsX21lZGlhLT5zZXRVcGRhdGVkQXQoJG1lZGlhLT51cGRhdGVkX2F0KTsKCQkJCQkJJGxvY2FsX21lZGlhLT5zZXRQb3NpdGlvbigkbWVkaWEtPnBvc2l0aW9uKTsKCQkJCQkJJGxvY2FsX21lZGlhLT5zZXRUaXRsZSgkbWVkaWEtPnRpdGxlKTsKCgkJCQkJCSRsb2NhbF9tZWRpYS0+dXBsb2FkRnJvbVVybCgkbWVkaWEtPmZpbGVuYW1lX3VybCwgJG1lZGlhLT5vcmlnaW5hbF9maWxlbmFtZSwgJG1lZGlhLT5maWxlbmFtZSk7CgkJCQkJCSRsb2NhbF9tZWRpYS0+c2F2ZSgkc2F2ZV9wYXJhbXMpOwoJCQkJCX0KCQkJCX0JCgkJCQllY2hvICdTeW5jaHJvbmlzYXRpb24gc3VjY2VzcyBmb3IgWycuJGVsZW1lbnRzLiddIGVsZW1lbnRzOiBVcGRhdGVkOiBbJyAuICR1cGRhdGUgLiAnXSAtIEluc2VydGVkOiBbJyAuICRpbnNlcnQgLiAnXSc7CQkKCQkJfQoJCX0KCQllbHNlCgkJewoJCQllY2hvICdVbmFibGUgdG8gY29ubmVjdCB0byB0aGUgdXJsOiAnIC4gJHJlbW90ZV91cmw7CgkJfQoJfQoJZWxzZQoJewoJCWVjaG8gIlJlbW90ZSBnYWxsZXJ5IHVuZGVmaW5lZCI7Cgl9]]></data>
	</file>
	<file>
	  <filename>/action.template_delete.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYoIWNtc21zKCkpIGV4aXQ7CmlmICghICR0aGlzLT5DaGVja0FjY2VzcygnTW9kaWZ5IFRlbXBsYXRlcycpKSAvLyBSZXN0cmljdCB0byBhZG1pbiBwYW5lbCBhbmQgdXNlcnMgd2l0aCBwZXJtaXNzaW9uCnsKCXJldHVybiAkdGhpcy0+RGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwkdGhpcy0+TGFuZygnYWNjZXNzZGVuaWVkJykpOwoJZXhpdDsKfQoKaWYgKGlzc2V0KCRwYXJhbXNbJ3RlbXBsYXRlJ10pICYmICFlbXB0eSgkcGFyYW1zWyd0ZW1wbGF0ZSddKSkgewogICAgJHRoaXMtPkRlbGV0ZVRlbXBsYXRlKCRwYXJhbXNbJ3RlbXBsYXRlJ10pOwoJCSR0aGlzLT5SZW1vdmVEZWZhdWx0VGVtcGxhdGUoJHBhcmFtc1sndGVtcGxhdGUnXSk7Cn0KCiR0aGlzLT5SZWRpcmVjdCgkaWQsICdkZWZhdWx0YWRtaW4nLCAkcmV0dXJuaWQsIGFycmF5KCdhY3RpdmVfdGFiJyA9PiAndGVtcGxhdGVzJykpOwpleGl0Ow==]]></data>
	</file>
	<file>
	  <filename>/action.template_edit.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYoIWNtc21zKCkpIGV4aXQ7CmlmICghICR0aGlzLT5DaGVja0FjY2VzcygnTW9kaWZ5IFRlbXBsYXRlcycpKSAvLyBSZXN0cmljdCB0byBhZG1pbiBwYW5lbCBhbmQgdXNlcnMgd2l0aCBwZXJtaXNzaW9uCnsKCXJldHVybiAkdGhpcy0+RGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwkdGhpcy0+TGFuZygnYWNjZXNzZGVuaWVkJykpOwoJZXhpdDsKfQoKJGZvcm0gPSBuZXcgQ01TRm9ybSgkdGhpcy0+R2V0TmFtZSgpLCAkaWQsICd0ZW1wbGF0ZV9lZGl0JywkcmV0dXJuaWQpOwokZm9ybS0+c2V0QnV0dG9ucyhhcnJheSgnc3VibWl0JywnYXBwbHknLCdjYW5jZWwnKSk7CiRmb3JtLT5zZXRNZXRob2QoJ3Bvc3QnKTsKJGZvcm0tPnNldFdpZGdldCgndGVtcGxhdGUnLCd0ZXh0JyxhcnJheSgndmFsaWRhdG9ycycgPT4gYXJyYXkoJ25vdF9lbXB0eScgPT4gdHJ1ZSkpKTsKJGZvcm0tPnNldFdpZGdldCgnY29kZScsICdjb2RlYXJlYScpOwokZm9ybS0+c2V0V2lkZ2V0KCdyZXN0b3JlX3RlbXBsYXRlX2Zyb20nLCAnc2VsZWN0JywgYXJyYXkoJ3ZhbHVlcycgPT4gYXJyYXlfbWVyZ2UoYXJyYXkoJ3NlbGVjdCcgPT4gJHRoaXMtPmxhbmcoJ3NlbGVjdCBvbmUnKSksTUNNZWRpYXM6OiRmcm9udGVuZF90ZW1wbGF0ZXMpKSk7CiRmb3JtLT5zZXRXaWRnZXQoJ2RlZmF1bHRfdGVtcGxhdGVfZm9yJywgJ3NlbGVjdCcsIGFycmF5KCd2YWx1ZXMnID0+IGFycmF5X21lcmdlKGFycmF5KCdzZWxlY3QnID0+ICR0aGlzLT5sYW5nKCdzZWxlY3Qgb25lJykpLE1DTWVkaWFzOjokZnJvbnRlbmRfdGVtcGxhdGVzKSkpOwoKaWYgKCEkZm9ybS0+Z2V0V2lkZ2V0KCd0ZW1wbGF0ZScpLT5pc0VtcHR5KCkpCnsKCWlmICgkZm9ybS0+Z2V0V2lkZ2V0KCdjb2RlJyktPmlzRW1wdHkoKSAmJiAhJGZvcm0tPmlzUG9zdGVkKCkpCgl7CgkJJGZvcm0tPmdldFdpZGdldCgnY29kZScpLT5zZXRWYWx1ZXMoJHRoaXMtPmdldFRlbXBsYXRlKCRmb3JtLT5nZXRXaWRnZXQoJ3RlbXBsYXRlJyktPmdldFZhbHVlKCkpKTsKCX0KCQoJJGFjdGlvbiA9ICR0aGlzLT5pc0RlZmF1bHRUZW1wbGF0ZSgkZm9ybS0+Z2V0V2lkZ2V0KCd0ZW1wbGF0ZScpLT5nZXRWYWx1ZSgpKTsKCWlmICgkZm9ybS0+Z2V0V2lkZ2V0KCdkZWZhdWx0X3RlbXBsYXRlX2ZvcicpLT5pc0VtcHR5KCkgJiYgKCRhY3Rpb24gIT09IGZhbHNlKSkKCXsKCQkkZm9ybS0+Z2V0V2lkZ2V0KCdkZWZhdWx0X3RlbXBsYXRlX2ZvcicpLT5zZXRWYWx1ZXMoJGFjdGlvbik7Cgl9Cn0KCmlmICgkZm9ybS0+aXNQb3N0ZWQoKSkKewoJJHJlc3RvcmUgPSAkZm9ybS0+Z2V0V2lkZ2V0KCdyZXN0b3JlX3RlbXBsYXRlX2Zyb20nKS0+Z2V0VmFsdWUoKTsKCWlmICgkcmVzdG9yZSAhPSAnJykKCXsKCQlpZiAoaXNfZmlsZShkaXJuYW1lKF9fRklMRV9fKSAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAndGVtcGxhdGVzJyAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAnZnJvbnRlbmQuJy4kcmVzdG9yZSAuICcudHBsJykpCgkJewoJCQkkZm9ybS0+Z2V0V2lkZ2V0KCdjb2RlJyktPnNldFZhbHVlcygkdGhpcy0+R2V0VGVtcGxhdGVGcm9tRmlsZSgnZnJvbnRlbmQuJy4kcmVzdG9yZSkpOwoJCQkkZm9ybS0+Z2V0V2lkZ2V0KCdyZXN0b3JlX3RlbXBsYXRlX2Zyb20nKS0+c2V0VmFsdWVzKCcnKTsKCQl9Cgl9CgkKCSRmb3JtLT5wcm9jZXNzKCk7CgkKCWlmKCEkZm9ybS0+aGFzRXJyb3JzKCkpCgl7CgkJCSR0aGlzLT5TZXRUZW1wbGF0ZSgkZm9ybS0+Z2V0V2lkZ2V0KCd0ZW1wbGF0ZScpLT5nZXRWYWx1ZSgpLCAkZm9ybS0+Z2V0V2lkZ2V0KCdjb2RlJyktPmdldFZhbHVlKCkpOwoJCQkKCQkJJGFjdGlvbiA9ICRmb3JtLT5nZXRXaWRnZXQoJ2RlZmF1bHRfdGVtcGxhdGVfZm9yJyktPmdldFZhbHVlKCk7CgoJCQlpZiAoJGFjdGlvbiA9PSAnc2VsZWN0JykKCQkJewoJCQkJJHRoaXMtPlJlbW92ZURlZmF1bHRUZW1wbGF0ZSgkZm9ybS0+Z2V0V2lkZ2V0KCd0ZW1wbGF0ZScpLT5nZXRWYWx1ZSgpKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCQoJCQkJJHRoaXMtPkFkZERlZmF1bHRUZW1wbGF0ZSgkYWN0aW9uLCAkZm9ybS0+Z2V0V2lkZ2V0KCd0ZW1wbGF0ZScpLT5nZXRWYWx1ZSgpKTsKCQkJCSRmb3JtLT5nZXRXaWRnZXQoJ2RlZmF1bHRfdGVtcGxhdGVfZm9yJyktPnNldFZhbHVlcygkYWN0aW9uKTsKCQkJfQoJCQkKCQkJaWYgKCRmb3JtLT5pc1N1Ym1pdHRlZCgpKQoJCQl7CgkJCQkJcmV0dXJuICR0aGlzLT5SZWRpcmVjdCgkaWQsICdkZWZhdWx0YWRtaW4nLCAkcmV0dXJuaWQsIGFycmF5KCdhY3RpdmVfdGFiJyA9PiAndGVtcGxhdGVzJykpOwoJCQl9Cgl9Cn0KCmlmICgkZm9ybS0+aXNDYW5jZWxsZWQoKSkKewoJCQlyZXR1cm4gJHRoaXMtPlJlZGlyZWN0KCRpZCwgJ2RlZmF1bHRhZG1pbicsICRyZXR1cm5pZCwgYXJyYXkoJ2FjdGl2ZV90YWInID0+ICd0ZW1wbGF0ZXMnKSk7Cn0KCiR0aGlzLT5zbWFydHktPmFzc2lnbignaWQnLCAkaWQpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2Zvcm0nLCAkZm9ybSk7CgplY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ2FkbWluLnRlbXBsYXRlX2VkaXQudHBsJyk7]]></data>
	</file>
	<file>
	  <filename>/action.thumbnail.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKICBpZiAoIWNtc21zKCkpIGV4aXQ7CiAgCiAgLy8gdmFyX2R1bXAoJHBhcmFtcyk7CiAgCiAgJHVybCA9ICR0aGlzLT5nZXRUaHVtYm5haWwoJHBhcmFtcyk7CiAgCiAgaWYoaXNzZXQoJHBhcmFtc1sncmVkaXJlY3QnXSkpCiAgewoJCS8vIFRPRE86IE5vIHJlZGlyZWN0LCB0b28gY29uc3VtaW5nLgogICAgaGVhZGVyKCdMb2NhdGlvbjogJyAuICR1cmwpOyAvLyBESVJFQ1RMWSBPVVRQVVQgVEhFIElNQUdFIFRPIFRIRSBCUk9XU0VSIFdJVEggUkVESVJFQ1QKICB9CiAgZWxzZQogIHsKICAgIGVjaG8gJHVybDsKICB9Cg==]]></data>
	</file>
	<file>
	  <filename>/action.upload.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKICBoZWFkZXIoJ0NvbnRlbnQtdHlwZTogdGV4dC9wbGFpbicpOwogIAogIAogIGlmICghY21zbXMoKSkgewogICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnc3VjY2VzcycgPT4gZmFsc2UpKTsKICAgIGV4aXQ7CiAgfQogIGVsc2VpZihpc3NldCgkcGFyYW1zWydjb2xsZWN0aW9uX2lkJ10pKQogIHsKICAgICRjb2xsZWN0aW9uID0gbmV3IE1DRmlsZUNvbGxlY3Rpb24oJHBhcmFtc1snY29sbGVjdGlvbl9pZCddKTsKICAgIAogICAgLy8gQG9iX3N0YXJ0KCk7CiAgICAvLyB2YXJfZHVtcCgkX0ZJTEVTKTsKICAgIC8vIHZhcl9kdW1wKCRfUkVRVUVTVCk7CiAgICAvLyAkX1NFU1NJT05bJ3VwbG9hZF9yZXN1bHQnXSA9IG9iX2dldF9jb250ZW50cygpOwogICAgLy8gQG9iX2VuZF9jbGVhbigpOwogICAgCiAgICAkcmVzdWx0ID0gJGNvbGxlY3Rpb24tPmFkZFVwbG9hZGVkRmlsZSgncXFmaWxlJyk7CiAgICAgICAgICAgCiAgICBlY2hvICRyZXN1bHQ7CiAgICAvLyBpZigkcmVzdWx0KQogICAgLy8gewogICAgLy8gICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdzdWNjZXNzJyA9PiB0cnVlKSk7CiAgICAvLyB9CiAgICAvLyBlbHNlCiAgICAvLyB7CiAgICAvLyAgICBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdzdWNjZXNzJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnQW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHRoZSB1cGxvYWQnLCAncHJldmVudFJldHJ5JyA9PiB0cnVlKSk7CiAgICAvLyB9CiAgICBleGl0OwogIH0KICBlbHNlCiAgewogICAgZWNobyBqc29uX2VuY29kZShhcnJheSgnc3VjY2VzcycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ1RoZSBjb2xsZWN0aW9uIGtleSBpcyBtaXNzaW5nJywgJ3ByZXZlbnRSZXRyeScgPT4gdHJ1ZSkpOwogIH0KICAKICAvLyBlY2hvIGpzb25fZW5jb2RlKGFycmF5KCdzdWNjZXNzJyA9PiB0cnVlKSk7CiAg]]></data>
	</file>
	<file>
	  <filename>/images/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/images/bin_closed.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAD9SURBVBgZBcFLLkNRAADQc1/fU6qkhFRMMNIQn8TUQCJWYBE2YBkWYQWMJIZmNuAXCSoGFUGIInJf33VOSAAAAIAcgLOFt3079flaEdTS50M6nT7YeggJwPFle6nhAoVhc370rnaXcwBSp62GTdxoGdPrkAPQD5OSbRFr6oLvjByA53CqY9YUvjy68YQcgELTuTd/khENbQk5ANGqFUSFnq6WW2QA5Op4VuhreJVEZACUAKiJkogMgIEKANFARAZAKQKolColMgA+f7vVkBkRSeYjvf6QAfB1cnnXNWTUhHHrXuLoESEBYO/aYjNUSqX3snk/2DjshwQAAAD4B9GUWR0G4scKAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/images/icon.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhQABAAOZ/AP/RWf/dhf/FNP/KQ9zc3Pz8/P+2APzbtOLi4uavbOWEAeunAP/MSf7lpPa2Nf/36f/hk+yUAP+bAPi5Jf+4AP+LAPOrAf/TYv++Gf/ELu25NM5uAf/oyf+tAO7u7v+kAP+UAP/CJfrr1vn5+f/Vaf+8Ev+4Sv/pt//z3fHx8f+xAP7Fev+pAP+rF+bm5v+gAOy1KP/Yc//be+19Af+5Cv+nLf/OUfzDafq1Cv/Xlv+DAPW0Ev6qNvOxDNKJAf/JP/7BQ+rq6u2tFOjo6NmLKv/Ihf+fKfWVAf768/+XFvb29vT09M2EAPWjAf7FOO+NAf+aCu+dAP+uR/+/Hf23Bu2aGO29QempKv/INf+2Xv+PB/PGVt6YEvPETP7GTNySBPSyGfCDAf3MW/CrC+7BU//vxf+hCvavAf+JCv/9+v+lBv/WcP2gBP+yG+ywHf+oDtd/GP/Xa/S/P/mxAP+PEvrw5Pe4F+7ASfmzBf+0B/DToeGjHfLRff/YfumNDP///yH5BAEAAH8ALAAAAABAAEAAAAf/gH+Cg4SFhoeIiYqLjI2Oj5CRkpOUh0h8W1s5hJeZB5Wgh3pnATJjNxCpZHYBJAsiobFpZVYTKGVgGiQXJG5OKCcLfCixlQ0DNhoTJyc9ZA0QDRohJxALcgMAZcWQZTYDMRBWdtA9dxABEMoNAQtiECQ/JA/cjBACFwH64/rmpQHKIMRYsEVfABtOTtRLtCZDDBkxHmrYAbGHFYgyYNiRcYEgxIckQjRYaIiEgBhr4qiMMXGXxRgkYmgkYWNBF5gkSKwJOZKkIBkZdl0YykvDGQwYLOjiBQMPhhI2hRIFEGIbyRNTAGjdCuCCUQMGlF7oCmOOAQrXxnIFwCADvXoP/wQwsEG3rg0AMM5QoKAUwN2ye6/5tUs36MIAIWwwWMx4bt69FmAstuFmTmA5jTNPsRrrwRQnP0KLDj3gMYUzkn8McKMisIYBo0eHYMAtgAosTgQIcOIEN2g3esGOyeBkggUKZxdMwKJbN3MsWDLQIBZLgIoQGbJrzy5ASHDkZ3CcAZt8wvbzUzoE6ExDBY0Q8OPH944cLPL6ycHI35+ng4BYJ3SggntTFGhggWMER96Cye0wBVJIFYhBHgPmQV0lfQhYYQkcdlhCgvgxmFwPHnLYXgcodqAQKGKkmGIeNMQY4wIKipjcGDLSQIUKLnbAQk+VAMFCjymqkFyNIqJlgf8BPBKJIgsQhCKkky5GgSSDaDXhIwtcdtnlB5uAAsQHXpbJpZUhYhlFFGaWCaaUZLbZZRTH2Wjfmix8oOeefL4QZpAv8CmonhHUaScFURwxqKAS/CmJCCI4EOgHL1Q6aKF2kpdopZy+IIEEnEqwggh1SFIHHBsoWukbLbSgRqcvYJqpAZt++imrLZjx6QsKbEBEGpHosUGqL5gBBC9icHGErRI80QSTA0YbrQERPMHsE1fEQQIAE4AgQa8bwAJJAsNay8YETjBwBRPL2uqstPAaWa0EIHj7BBPYZACGt+B+Mm65ILDRQw9g+ODDEfXW+2680labMAj3crHDwPXOMKz/HpEkAAcRTwSMww5jGIxwwmE00aSTKkQQBggVVKDFvV/sgAMOLPtBBBwYQ5LDGg3woMMHVOAQsg8tF10ylSmqXHQFMM9MBQg63HDCDRxE8oAJAfRRQwcGUDEGE0QvfbScQyrdsg5P+PAFFVRQoIYUEPRxwyRFOFBKBmBZALYOfPM9A5tksxDBDH3rEAYTX5AHgD4mVC0JEjx4sYsTU+zAxRU1GJEEGmjMoOiiez4xAxp0JGEED3vsgUFia8QAxNyUHADFXFrdxZUNXgBxRRV+KOD77374UYUDXtDV1VBaqcUAD29RsgIUsJEm2gDULzYAEHI4oL32QAyQGfXeZwaF/7+VpCEFFOeln4Fz0LXPXHPwww+dGUUU84AREhxoIIQQ6u9/gfuBjwSyUI86GAEEOYrR6gSgGsbQhTGwEUAGplACGniIBiAg4ELuVwEW7IUGAFiDDEYYA5VIhQQrichOBnAWCrCgAjcAFkkeIAUdSMA9DADAAAQwgTa04A1q2JMaWNUGdGUDCxTogAQqsAKfEGIFLfMUy5bmMi1YUQtn00HLvCUBHdCBfE4UxAlqAAUjSOEGRcjBCTgAKRS4UQQc4MABcrCCLPAgCUnIwoXCOIg0oAAJk3hA8/hISEKmIAgpUMIICtCIAoxgCR7wwAgKKYgCuIAAmMwkAlzggiB40sYDnhyCCxCAgExm0gOFVEIpTcnKVrrSlC5gpBOXUEpS2vKWuMylLgmAgEmShJa6DKYwdekCX3JDCZxMpjKXycxmNnMIxgzFCIbgyWpa85rYzGY2qSlLUBQAlNoMpzizCcoUxCIFkUynOtfJzna6U51KAMUIUkDPetrznvjMpz7v2c1IFGAJAA2oQAdK0IIalKDxnMQIlMDQhjr0oRCNqEQj2s9HjOCiGM2oRjfK0Y56VBIFCKlIR0rSkpr0pCitKCVXytJKBAIAOw==]]></data>
	</file>
	<file>
	  <filename>/images/icons/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/images/icons/delete.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhCgALALMAAP///3p6etDQ0IuLiy8vL+jo6MjIyNXV1UJCQmlpacLCwl9fX+zs7NnZ2ZaWluTk5CH5BAAAAAAALAAAAAAKAAsAAAQ3EEg3gpQjaw0We41gKMoiEGiaCkBQBEdgBALrwjIt3fHMtq+eDpAoJA4JQ+KnQDidQ0BtKigAIgA7]]></data>
	</file>
	<file>
	  <filename>/images/icons/edit.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEgASAMQfAOHo8JKty/30xczX5G6RuaaRTPr7/OTJVaLE4oWRn/P2+fbdbPnIk9CwcnucweP2/uzNddjh6/HVeur1/+rv9fbfXfbu5HdYJe7Vf9WVQ8TIy3KUu9Pf69mZTf///////yH5BAEAAB8ALAAAAAASABIAAAWk4CeOZGmeZIeinZCJgRPMdN1hwvISw8BFAIrC4PHcchJMZtMDColG3EIiUTGdw+JxAalaPhsstCMRVCpVjWgTzBohZnQnoQY/tY14lcNbKxRFBQwMBxUQHR4cGxRrUB6Cg4dFfB5rRUUXgwyIkxsGaxQeExMXFxkNFpeKn3aiEw+XsaugBg+2sLGJBKwEAQi/CBzCwz8OrAEbDg4bzMrOyhyVHyEAOw==]]></data>
	</file>
	<file>
	  <filename>/images/icons/normal/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/images/icons/normal/def.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhMAAwAMQfAP///zNmzzFjw0t30XCZ54yu6fn5+k2E76fL8//+8vPy8R1Xze3s6115vcLR7h5UvNXe8w1JwsH3//P3/AxHsr3I1unw+uLh79fRxv338/Dn1/745ZWks72zpM7FtgAAACH5BAEAAB8ALAAAAAAwADAAAAX/4CeOZGkCaGqubLuiTkEMgSAEA1E4qOu3AAchUKhADCmAAVKZEXi/6AeAGBQgyWwWUhggANKWwzpJaM8pQ6brCJcAMgV6nrXowO7JoELvJxMIDRNhFgMXcxMSiooIi3MXAxZRehZni4uNCJqaBV9nhYMuAA2HWRKZpwWqBDqqCKueWRcNeCydWpucOpsVmgQHqjIHSFmvYgTEKQSbBcAYz9DPDBC/rL+xym0nkVnAq8AeyUkGGhfVvwc8SQoDtSOv3d8HBBhmcxoQAwf7BwHicAjeDBBnjdWBBh3soVhSauGGAgH49cuSoR2JGMks7EMXgINCOAsiLGiQgZgCCBH1/9EokGXHCABPUkyYx2/AAA8KiBWIcCNAhAb2EjCgsU/fgglJqOEBMEChA4n9GmjQkOLBggA1AizAgEJOgwVEsRLIMlCEkCQSbeJgdYXA1Z5a+aSgYbNugCxPRKhKEvGAWqxWH4jEilXAggVU52JVOyAClhQVCogg8JgKDr80CGveHABoCgsRNNNYwDIFtSmCUkDslznz5huGpSYh8ICzAFpp2gG4qxiHa7ibf3JN4SA0juOLAchBwVtAErqtCffsOTKcaaucB9xQksI5AO8oXGsGjnVkh6TYFx+30S6Zd97MCdN9rVVAh2QQBnOu8aBpMt4DIAVAAgQIIF5WwHGQGP8AF6SXnQ0BJECMARZRphwcD/R0YFYLcJBBClqNt5h2AjxAgIQonPbBXgYkUJyBtkl3Hwqg7VeYDRFUgCIAkZlVWosZ3jDfdFedR6NxhY2HIwM5oUCZCBQuBFOQNtbAgQWHIIDkazb0BwADxJQ1RUxIQECBDTDSMF1hC5CXVQ1oUlBBBmACoNQIMSyUwFdo/kbYYSK5CecN/SWgAANKuPSSbmowcCaanLXZCQFb3gibnEKFaUAJkaEAZgEUDAqcABwokUEFPFka51iHotDJNkgYwEACAwSJ5g3mmWHABm6Jyp8AGxyKhB7u4DnWlwokUCJsaHZonau2oplhBkIhCpPJNivs9SW1DTwKW3U5IcEns2duUK2rkgHRABayKvAQBVTaoOCAWt76AAUnymrtLMWaoAcShyYLQbe2mkhAt9JS0ICOh1pLYSg+FFIKkxoo4ADBD2Ss8b0Kz8kkA/tGEsYEDSCABJOHZoABBw00wF4DBFSQrAIXNOyqIG6MeSyyNTOAgQbmbiA0yD1bCxNLOeNpRQpC5aTA01AHrBAbSZcASA6V/DHg1p/N8EXVK7hY4BMCJjGBEAI8kQDYogQhg5pC6qAO225owXYIADs=]]></data>
	</file>
	<file>
	  <filename>/images/icons/normal/doc.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhMAAwAPcAAAAAAAAAhDH/KXNzc4SEhJSUlLW1tcbGxs7OztbW1t7e3v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////yH5BAEAAAIALAAAAAAwADAAAAj+AAUIHEiwoMGDCBMqXMiwoUMBAyJKnEixokUADwkOWMCxo8ePID8OKIAxI8SQKFNyHGCApMmNKmN6HJCgZUmHMGXK3FjTZcEAQIMKHUpU50qOPW8KJMq0qdEFOZMSBPqUI1WjORdIXRqg6oKrIQ2IHWsxYkmwRtF+NHBgLFsECAzAnXu261CrQb8OLYCAr1+ObMW2LXAAwQGPCAAYEED1bgGheiGjDGyAwIEDfA93TLz4at7IngM87jpZgQEFBBQUUGAYsWLGpPOOlt1YdN/bBQCbLkCgt2nNHDnDxmv3LtDcaj2OVaCaQEvgC4SHFt00NumwLVOnFuy6s/XqovHd+sUNOG7v1QXYdh8O2inelHILoE+vfvPr6U1zv588t3/c9fhRJ5l4uPUFmFsIAvhdbcd5lJxX0i2I3GcdPVhVhF4dV+B4HJJnn3cZXufVh7CBV92IH0VoYn4btsjhegllhWJMwsU4o1E1IpRThzy6uCGMOt6oU44HyShkSEQatKOPPTYJZJFH0viajVGmlGRBSzbJ5I8kUlklklMG+SWYi3k5opNdijlmimFCuSabZar5ZnBtKjnnk3beSWecRfrn55+ABlpnQQAUauihiCaq6KKDFoTgo5BGKqlYAQEAOw==]]></data>
	</file>
	<file>
	  <filename>/images/icons/normal/fla.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhMAAwALMIAP///wAAAP8AAMDAwIAAAIAAgP//AICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAgALAAAAAAwADAAAAT/EMlJq7046827/2AojmRpnmiqrl/gvnAsw2cA3Hiu73dQ8ziDziAQ4lA2IECQIzJzSOXSuHziBgKBKQkk3ohUbPYnLVZvYsEgqjN/meas+sZuZo3FfHZwJO+cBl5Xcmt+PE47aXslXEoHO3OKWiKNOwcEmHxohBNjlECXmAQHAwUDWKeeW5aio3wFBKYFTGmrV62kOLEES7MAtSSNobm6sHxYBZuqIZXEV7DJN7PJCGLBUtKxmr++EljXUgO7bbN1QLvbmwXmPNDtAuu2SqXpz5OM2Pns+TtsL9v/cATs4WcgAIMDfcg76AJgQ4EPFeLr8ZBiAIcXCdpCWJFhRo0TF/kBkRhshsmTLFKqXMmypcuXMGPKfBkBADs=]]></data>
	</file>
	<file>
	  <filename>/images/icons/normal/folder.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhUABQAOYAAIBtNP/shuzZYXFxcdmqH//1s9bW1mZjWby8vPf398yZAN+/U/LXle/v75mZmenFaPXsn9/f39i/cvny36qEEnhsRenSjfntz/LmdNGrOf/MZuzfudCnK//+o4l5Sf/1j/LVgtmzQYSEhP/356+vr+rdt//uvty8XbKIDf/pks2dDv/Ub///zP/mgaGRYpZ5JNmxOv//vv/4ktGyU2xmUszMzP/xru/AS//ge//addasMf/03uLMif//5qOjo/LlvObm5sOUBf/+9/noffXfqObMcPLPXePTo//vif//mea3OXx8fP//xf//1OnPVNmzK961UvLdno1zJ4yMjLW1tf//rLKsmP/y18TExP/XctKhD//6797YxZ6FObuVI9KlH/XoxNy2R///7vLmj+LFRHBnSs+dCKmHHf/npv/4zda5ZOa/WubMfrafXeKyMNmrKe/IVNzDdv//3mZmZvLdbP//tf/jfopzMfLmrubHSP/wxtOtO97FeP/ynv///wAAACH5BAUUAH4ALAAAAABQAFAAAAf/gH6Cg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7jz8bPHEnGRwKX1wJvIcnXyEnbBY/F4IWXjXIyYMTKiNCQj09LCx1TEJQLhGHEz9HfGEZCgozQNetzlsdSfn6SU0jHFYlSgDbw4HZAzZEfggRI0eFDyCuJnyZwGSfRTlgYIR5Fm3LFjlpmNSpkgQJBgVdOMijh+oEgxEWLVYZQbOJyDpJZGAQ4OTJE3ghoLDBo6ONAZamFIyIEdMiviE8fcLTEYJNlB9bBF0RFMIDlQaqFOwg2XSfEhVVoU3o1k2MW7ca/7qpqPA17Niy+shsW+j2m5y/gP/GFaJgDhakpTJc6SOjsWPHGJyoACOmieXLmDFrEHMhyAADqxT3+UB6CJ08TwgoUAGFcpNwsGPL1tADD4UloFVlIIKGzk8VMB5YwLPD4xYmyJMrX86EtgUKItDpZoDGzIkLHv9aZhGju/fv4L1rkFNEyhSIqkIwALGNe5338OPLnw9fQ5MFdxygTyVhPYwRVQQo4IAEFkigfTBUQAJYqsQBAggwNNHBhBRWaOGFFmrAggo0IIBYKXGs8QAMaeBlYlMaMFGYNauEuEYYJZ4oYz4aQOBZbqocscYaRaTx2I9ABvmYBmPcJp0qJexYRP8BQjbZpAZFvBAdKyXAAMOSpGWp5ZZccqmBE1LoR+Ubb7BhQ5dopkmaBk8A4AODSJIZhQ1I1GnnnXjmiSebCsKZSgJyphDAoIQWauihhmqgwAEetvKGGVGk0MKklFZq6aWWKjpHDa7AQ4SkmIYqags3oPBZpwrokYIdrLbq6quwvnqDka6okCoOuOaq66685moEama8MMWRoSlgQg7IJqvsssvCoYRqQbxwRxkDLOhKBiocy+y2OWhwgxtfKIDCCwDQMMcSDpCABRBCXKuDCVnEK++8WRihxBtaKECBFBUcMIAIDlCBhQFANPBhKhnogMYKDDe8grMEmBEEBdPO8a9qDwjUEEHBB7OihsIMe+tGvuOWe+4UPgwcQQN+1hIHAQ/gqy+5/qKrLsEGJxOHCmfwazHAVGjMMTaDNEDFFCgjYMDGDbRLtCENRLByx09XbfXVWGet9dZcd+3112CHLfbYZJdt9tlop412IAA7]]></data>
	</file>
	<file>
	  <filename>/images/icons/normal/gz.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhMAAwAPdAAHsAAJQAAJQIAIRaCJQYCIwhEIxKKYxSKZRaKXNjUmtjY3Nzc1JSeyFShDlahEpKhCFajCFalClajClalCljlClrlDFjlDFrlDljjDVrlFJShFZmiGJvjHd7hHuEhIOGiSFjnCljnClrnDFjnDlrlEFwlFpmlFZ7lClroBx9yTl7nEN9rQCD7xWW8USV41qc4mNjlGNjnGNrlGV4lmtrnGt1omuEoH6ImXN3rWuDsXt7qY2Wq36GtYSctYCXuouWzP///5yltZyttYSlvYylvZSlvZStvZytvYStxpSlxpStxpSlzpStzpS1zlql1nOl1jml70Kl51Kt51ql72ul3mOl52ul52O162ut53Ot73ut53u173u974S975St1pS11hC1/xTB/ymt/zm4/0q9/1K5/0LG/07O/1q5/2u992O9/1rO/2u9/3O993PG93PG/3PO/3u193u994y174y975yl/5C985S995TG+4TO/3PW/4ze93Pe/5Te/5Tn93vn/6VSQudjKbV7McaMOd6lOeKxOee9OefGOd6cQrVSSuetSu+tSr1SUq2Ea72UhKWlpefOOe/OOe/WOe/eOffeOffeQvfnOffnQvfvOf/vQv/3AP/3Of/3Qv//CP//Of//QqWttZytxpy1xqW1xq21xqW1zqW9zq29zrW9zrXGzpyt1py11py13qHA2KfB4KnG77XG3rXO3rXO5729vb29zr3Gxr3GzsbGxsbGzsbO1sbW3s7Ozs7W3tbW1tbe597e3pzG96Wl/62t/621/63O77W1/7m9/8bG/7XO763O95zO/73W763W97XW973W96XW/63W/7XW/7Xe78be77Xe973e98be97Xe/73e/8be/5zn/63n/73n/5zv/63v/73v/8bn/8b3/8b//87O987O/87e787e987n987n/87//9be79bn79bn99bn/9bv/9b//97n997v997v/97//+fv9+fv/+f39+f3/+/v7+/v9+/39+/3//f39/f3//f//////yH5BAEAAEAALAAAAAAwADAAAAj/AIEIHEiwoMGDCBMqJKgMGrNkyYgRe0XRlUVWGFep2shkyZIkIHn4+LUQIZ5/KFPyW8myJT98MGPC5CGtxq2SBk+m3PnPn09//YIG3Ue06L4c4bTYxEnwDs+UP4EKHWqUKA5ub6gsZQrEDj+eUaUKrVr0Ho5tbNC8oHGTqdedYaf2I0v0ntlnaMqQccGWKZ2vKKPKnUvW7r16OJTpHSPGhYy2C+d8FSyX7j7D9erVKNOChWcWKWBALmhjgunTqCGgyke1sN3M9Xz44EGbNg4aH0iS/keHzpY2bd68gQNHzxrV9Ohihp3ZWLFiwoIFq8Njwa6CN1D2/h18ePE1KShY/0BtwYIPePUOM5fHvr27OjqsFxQhQsUKChRA6Nc/IQSYMGdo884/6HRxBRkl8IIebO016E478MlXUC+3VHhLLbPUoqGGG/z3hzj/cDMFFGhYYMs6DDbI3oMQxncdEI0YIOOMNNZYS4d8gMjNC1CUQQEq6mSmojzusNiifI4gwAknmVxySSWRHGJIIYUQIsgBBuxgSwmomRbCCUDWM6SR7bQTjItAAJIII2y26SabBSBiwAe1+JKLCl04cwIopKCiCzsqFkkmOmfKx8gniH6yJJOYNOpkAIoY4EEt8MBDARZOSMFFEL4AqmKZoLaDDqFoHhrIqaimGsgkkEpaCz1DiP8DTSteTEBKOYGSKeqohV5naifABhvsAKxG6gEq8JRDQR/+WBAEKri6N+iovNZg6CeBAAvAtttq0gmxrR4LTykiROGCFHkEoY57oe5KLaHW+spJtsIKO4Ak4SLbgzjRuFLrKOW0U2S7744KjjDxAsHIvAM07PDD+BqLrLJ90GOBENAKHGrBBh+c8MKZOOrkJCRLIgkk+cJTBAXmopFuwBtzDA442QhDg6HzqqoqyhKzg4Q4xNA6wSjTxFzwzDTbbCgm9NYL7AA8S3oKO+VcoE2zRZxSdJkyI51NzTf7yrS23ALgLdThTk0Eyy6osek0HHdM89fZFBO2wpc07fQAh7T/2gEpPgPdChMTaB2313RjY7eheT/sON8BDGLA3+ycI8ET/zhr+LtIz50NNqAXIwPjl5R8MiSoH6K6AAcocAMqJ3RpWg7WUIt44qGPfl0AvPfuu+8FJNBBEBOYsc08/7hjRxplWACLNZ3T/TnoocMg3y+PfKD99tp3sEAH4H+wwwxrnJFjiC+0UGIpy8ws/fTUY2OM9S/+ssstEkjQwP789z9BDmcIw/l2pD4LiGIZ74Mf9a4xPwkNJDu88Q1w3OCdNYwhDBSQHQVswD7pxW+BDKSfQWYQQe5QkDgWDEMQQqGCLSxjBkU4QilgUQ3cffAa14hGA19UkBLcJz/72Q8K/yoQCli08IVGgMUyaqhAEOZQhyI8CIVuwYBHjGIUsbPBEUYBiwyShxg+mMAJmnHDJ0YjGsfYgAMRIpppTGME/ziNBUQwIHQAwwqn+ccIWkFG0OHQjGhUIw8RQoNdlGkE1BhBN7rhBxGIwx/XeAEVJrCHETBjBEoghh8BGQ1opHGNBymkqCwQBzk6EpKSPE0WLJBJHJ7xlZ30pAZAaRAY7GJUGCDBCYoQilB48TQS6MEJSOCAVgISGsiUJS0LYstRTeMUpXCFLJABi1Io4ZrXXIUrVsGEVRADlrFM5jFmOciDNBMd1ljGEr9WjWUgAxkSkUgzmiFPWCZTnORcyDlv11TETXLynskkRz4VAoNxkOOgCE2oQhfKUIQqY6AJgYFEJbqBDWjgohjNqEY3qtEHQBQhv9jBAkZK0pKa9KQoNekOdKMQ++3ipTCNqUxnStOY/oIfAQEAOw==]]></data>
	</file>
	<file>
	  <filename>/images/icons/normal/html.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhMAAwAPfCAM7n/yme5+f3//f//zGe797v/87P/1JRhHvH5ymW5zGW79bv/2tpnCmm70rX/zG+91K+/633/1JpjK3P773P/1KOvTFxta3X/63P/zFRezmu9zFJczmm92PP/ym270LH97XP/ymG1r3//0JhhJS+57X//1LX9ymm5ymu70K2//f39yme7ymW763X91pZjKXH54zv/1rP/62+ziGW53NxpSmu/3uerULP/4Tn/7XX/zGm9yGGzpTf7zm29zmGxnuGrTmOziGe5zGu72NhlIyu1nPX/7XH1pTH/yF5vTm+91JxnDm+/1K257X3/2O23imO1nOu3mPn/2OGpXuevTme973P51pZlGOezkqu7yGOzilxpTmu/2OWtXOGtZy2xqXf72uOrZy23kpplISmxjGu99bn/ymO3kKu/0JZe5Smxq2u/zG29ylJaymOxpTn/5zv/0p5refv7ym295T3/ymO57XX73P3/+/v90Ku9ymG3jm27zlplKXn/73X90qWzoyetVJhczGO3lqu5zG2/8bX3pSmzkqu3tbf79bn9zmW3jlxpZyu1gCO9zmW53PX77Xn/4TH3mPf99bf51rH5yGO3mu+71JRjDGu/8bX7973/xhpvYzX70rH7ylZjHOOnM7f9+fv987n9zFBawBx3sbf93vH/zGe3lpxjDFBWt7n75S+1imW3iFJcymGzt7v973f98bn78bn9yFRexg4Y2PP57XX9zme587P90q+5zlRa0pRhDGW58bn/73f/+/3/3Nxc7Xf/////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAMIALAAAAAAwADAAAAj/AIUJHEiwoMGDCBMqXMiwocOBR3JcaEFxgsUJLzKG2bhxkcdCINOk6fLQ4JFgKFOqDKaipcuWd2LeiROni6qSBE+u3MlzZxcRUHAK1NmzqM9HpYLiJGq0abAuwCBAEISThNOVAjIJWEnjgtQtfkpaDTaAZ9lgvh7hKNKhQ4wOVUANGEDjCIQUly4Femh1rt+/A3x9iRLDiY3DNgylkBGHLgRGkEeN0uSQhArAfjO5MTFpio0/XoykikOIyRVCAxioXr26IQlXsRDIni07RgVPf2RIAqzqipG5FCioGT78x6+FtN+8gYEjigkHDkwY4qLbl1/rdaD89sV9LncKxhPK/45QonyEOXbsOHdw48YHTobGEALFnTsv7fXz+wJ//CACPiKIUMJ5MKQXBXsPJPhAEkno4YcXqdTXAhFV6Fcff/41EWAJc/DxhRtRHHjDA3J4YKIHawyiRyJpHOKLAKXIgIiF34VXEAIaDogDD7DwEMlzH5DoAQooNCCEEGT00AMQaSAiQBWHCEDjfjYOhEAEAkZQhECbRALdB3LIQWSRJ5wQgJFK+uBFlAK06eabGFoJIIc8COTIczcI0QYSSDxxppkBBLBCAzr0oIESRjj55qIU0NCfQFeWAEOdwtzpwAdtyMIGGhKIocUqgYa6AgEabAGEDZgUsCicjlq5iaRfCP80CZ5toHKKF1VgIsMfcIQaKgEEbHGGEjKoqmqbBSRbQKOPIrBcrMLQgucDrJxihLIFfOLFDoEmkEAAwGqQggV/fILtucxaOalATgD5QACi2NBHGfSWEUoVFXTrLbAcpACEFFWci226kFKKQAyXPuBBAFrAUcHDEFfgg7cJsJAAvylgIYERZQicLAgMNCsQE5wkPOQJq2SxQxYs7+AyJRWzwIICChBAhVQjyBDKAjz3zDPIj7KLi3sKo1BmEEj7qq/MNNvMAQQdjJAGKT77DHRBTnwQpAcNNACooCuEDezYTTt9RgxF7DFFH1X3fPVATujxwRonBzqDyi4/oXcIfPf/nUcggTRiCxOV7CEvAIgnjvjb7CbxwBpGIx0EJbOwkcHlmGewweacd56BBGP0objiIAzxKBN6OM51AEHM4DobYJAy+uy017646QMxweAaQpiZgOsJdDLFK7wUDwAvdVxhwfLL++DHFVBAQUQdxVdvPQa4C9NAD0skQYYQDXTrOhJSTGA9Ly8gkYcZdOxCAB4duBHBFWCYf371GFjRXwODLLHG9w1YQQAoZgYL1K8XxXuBBfLQNHF1AAZN4MMIDni/4uVvf/1bAhl0QIDwUSwBZkCCBbhwhQpoIgQNTEEMcBCBJnABDWOgXgV5gQEXHEcQKFjCnsigAQ4Cy2IVo0Me//pmhprpwIEsFAEk2CCFF/TiiVCM4tUEUYMldAIVidhCD4GlABbQgWY0+6IRewC1JH5hBCMgQi2iyMZeXI0JNTAFG37xC1MIy4dgzGO48PCWJEZgBGiYwgTayMbSHQcLNWhDLo7zCyBw4AwcoAIVxgasI+IBakWAYBMgkYFATiAHhJQi7hCpBUAM5BcVSMQjORBJDmgADymAANpw8IYI8IALGwDdJ3sBjCcCo5e/DCb2DlmDUhbkF3AIQSP6JZW3FCGTbkBABTopBSJ8MpjYzCYwLigMUprSIL8QAxB8YAEfAGGccFDECDIwAimM4QUtyIE257lN/QmjEjV4ghKCJpcQRfhhD+wUg0AloAQpgGEKRIDnBeRJT23WsD8ryGcFHkVOdSqBC0QggUY1+oIjtOACF2hoQx8qEAmYYVAJaIUI96AEUXjCmh8F6UJnKlKRknQgEsipTnOqCxl8tKZAdagl+HmQIdzCAEhNqlKXytSmJhUDByCqQaxgBRdY1aqWOIBWt8rVrnrVq1I9Jh3HStaymvWsaA0IADs=]]></data>
	</file>
	<file>
	  <filename>/images/icons/normal/js.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhMAAwAKIGAP///4CAgAAA/wAAAAAAgMDAwAAAAAAAACH5BAEAAAYALAAAAAAwADAAAAPOaLrc/jDKSau9OOvNu/9gKI5ZYJ5oapJLALxwLAcDa7hyDps1ieu5QIHmA+pcw17oZ9y9kiJmE0AbWK3LqbGg9PxU4Bg3q9WNQV9wStztSMuEeLytSatPL4JgT6CXyjJ6fH4Ydnc4ggJ9H29aiYteO4cmeXuKhBeNU4+YFoZ3lYOMgDGcoy+TlACmkaShl6dUqa+Qbq60nRWaTay2m3O4sUaCA8GtvHzGbgXMzc7Mj9G5FFfV1laJlnM2EQNyctMs19zk5ebn6Onq6+ztCwkAOw==]]></data>
	</file>
	<file>
	  <filename>/images/icons/normal/mov.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhMAAwAPdAAAAAAAgICBAQEBgYEBgYGBghGCEhGCEhISkpISkpKTExMTk5OUJCQkpKSlJSUlJaUlpaWiEItSkQtRgIvTkhvUIxvTkhxkI5xhgQ1iEYzikYzkopyhgp1kJazlZOzlpazhAQ3hAY3iEh1h0b4Skp1ikt2hgh5yMj7Bgx3iEx5zEx1i0x4ik53i0x6xhK3iFO3kI51jk53jE55zFC1jlC1kJC1jFC5zNS20JC3kJS1kJS50JS70Ja1kpK2kpS51RU2P///0JrvVJzvTlzzjl7zkprzkqMzkqczlKEzjmE1jmM1kKU1kpz1kqc1kqt1lJj1lJr1lKl1hha3iFj3ila3ilj3jFj3jFz3jF73jla3jmE3jmM3kJa3kJz3kKU3kKl3lJa51Ja71Jj3lJj70Jr50pr71Jr70pz50pz70p770qE50KE70qE71KE70qM51KM50qM71KM70qU70qc70ql71Kl71Kt3lKt70q151K93k+17Eq951K970rG71LG71LO71pjWmNjY2tra3Nzc3t7e4SEhISUhIyMf4yMjIyUjJSUlJycnKWcnKWlpa2lpa2trWNaxl9wwGN/uW2Jt1qlxmiZvXuYuYqcuYyttYy1tZSttZSxvaW1va29vbW1tbW9vWNezmtmylpd3mln1G9zymhr3GR012GO13N3ynmDynZ223uD4ImEy4SNzo6Oy5eVzGinyGKf3HGzz2K/6IaoyJSoxoqp25id1qWlxqKn1qWxyrCwzKm9yrXAyKa73LO/3r21tb21xr29vb29xr29zsbGvcbGxr3Gzr3G1r3OxsbOxsbSzs7Ozs7Wxs7WztbWzr3D27fQ58bG3srS2sa9573W58bG58jO7NbO1s7O3tbO3s7O587e1tbW1tDb29TY4tbe597W1t7W3t7e1ufW1ufe1t7e3uTk3t7e5+fn59be797e797n7+fn797e9+fn9+fv5+fv7+fv9+/n7+/v5+/v7+/v9+/37+/39/fn5/fv7/f37/f39//39///9////yH5BAEAAEAALAAAAAAwADAAAAj/AIEIHAhEQAAACAk0aOBgocMGDCJKnLhAwQJzBDNqJCigY0cGnoyJHGlMmMmTKE02glBxo8uBAhY4cLAgUL1/OHPq3KkzXSAHgpi9dCmgEDNmgwbd5Ml0p89BjwJ1G6pRAKKjSZc23ZpOEKJuiwQtoEowQKBFiyAI0rqVabpBiuoZCyuULBAABA7ohcC2rdNBi/ilM9YoUF2qAAToPcDXb9O3i/7xM2dMUaAEZAEomFmzL7967dqxU6dunel29fj9e2u05CNEghico1pUpCClOvnlwzYMVy1aly69wjWsm+q3DiA4ZFAxQbqhVrHixlkvXLBalmDF2n6qe6pXyMwN/1YkCAKDBBIPUA0gqNHKtZL1ddtlqdKRL3TmyHGjhkmRSK3sgg09zCxi2QEWLUAAYgQkkABjN+kTDieVNIFHH3rIkcYZZ6CRBhk8dIAKLs+kU089inhkEGKK7VWPPuZwAksUeNThRhdQmEKKKabkaMoToJCyCzo4LUIAAR0BgJgCCylg0zzHWEIJHny8IcYHpLDyiiuphNLKLar8UAMr0vDDzyIHLMCAAgLQRohJt9WDji6n5OFHG0+E8sowz4zzzCeW+OLOKjiUAMotxjWygCKeLKIAbVchpdQ0ttihRx1ikPJKNunQc04ymkjSSi6lxDDCmMzUo2gjxnjy6FDsuf8XyFrRyMLHHW944Ao2ZqazzCaTCCFJKpHQEAIJoRCjqgKINIIIZkMBgKACCfBVqx9znDHKLvRMNswlkgQhSS2f0MJDCBl4sEs7aCqgwAEBsLiYtbL8AccYqlCzzz/e8IIMLZLgYowytTCBQrq4sKsXkkpGi96aNtU6CxtgrHINTtPwws4vr3QzjjObIPGCCB4kjOYCCyTQJqyDeOKJILTKoscaY1iMEzi/5LJLqukoQ4sRU5AAScKKKvLIItC+FJ2k9VxjSx1smFHKL+3wY48624BjYjedyLLEFCpAsu6qrb76UgBQRbUWOL7U0YYZotySTWpmfhZOL5jAosQUNJD/MoyqCzSrSNIuAZAAygnYtHEsbaChQym3MDPOOeeYw4wwm8DiBBYvfOBKqu1SG2+0LUIYzza2nFLGDj6M4oouvfTSCSeYyBKFFlQYiug9aB7AMGJppmwTP+xAY4sZO8gQQw+kWOJ8JZRE4QUVHGgAyivc8D5tAqOfnfasN+GTzi+rcCHDCSawcMMQRCSRxBU3ZDBBBBWg8ks8igpO+EZLZyUZPzhbBRjOd4IUvIAKVrBCFnJwAQpIwAKgyEU7yOaq9RDCZXHKyT7M8YtWlAIHMWiBDGyAgx5gCRWQqMAGIjjBRR1tfxoxXEScpBV/7AMd09jFLVihih6mwhW4+EQv/3DBih/2Ih4nq8jKXpKYebHFH/zw1DesQY0qSiMb4jhHOsBhDWtIwxxnWpgAGna2vOxFPOlIoxrXyMY2plERB3AQvFyyEOZMpAEwy6MgAhEICPgRAjMJpCAFuaZCLOJZLgnEIAhBiKQkBWZ8DAQgANmQ5aDsku7K5IMOx6oKbiQQRvNEI9CClkYoAhGISIQhCsHIRi5yj3v8ox9p8qAFLEKUZssIKIWRDmGQ0hPm8AQqhWEMRBBCEQUqxFwG4UtBCOMozEBEyvQSkQUsUZeKMMY/uuFLTxinmyLxhCIWUQ9hpuMRhDjHIwZhjmB6ohDTFCMZsanNf5yjEd3AiTAewf+PRpWTnOZEpzrZ+Qg/NiCeDyJA9+iJk3vm8x/75AcwGPHPciLinOlcp3iOIs0HKaAQiigEDAUCSm2moxvGYMY5+BFRYDSiogHNKDvNYRJ4OmgBncwlQUr6j5Lwo1UsfUQ99llORaRDmPeUqTkeMZOD1nIR+9TpQHjqU6AKw2gpfQ1IQ9IIRg5UPCLpaBwZAJFr7lQRwgjmI7rhibW+BhGeEAYrG3lLQihSnIJ4xElsupjffdJojxglKQ2EykMcopV67OMfKwmRePpuRZ+8TR4jKcsHVJIimdSkg+SIoEEYUz0bIaYxMktazToIAQg4kmpXy9rENRK0TEQIQgKwmNoOLsYAA1CRbj0i294SJCAAOw==]]></data>
	</file>
	<file>
	  <filename>/images/icons/normal/pdf.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhMAAwAMQfAAICAv////sCAt0BAcjK07O1v+vs8uXi6tjZ4istLpaYolugr/UgIPROTvb//7wAAN57ffj4/nR4glpaYOj+/+Q0Nfn///GpqypjaaLM2fT0+osAAPTy9cv1+vn4+AAAACH5BAEAAB8ALAAAAAAwADAAAAX/4CeOZGmeaKqubOu+cCzPdG3feK7vNeD/wCCARwIsJIukcpFZKoY3gWBAHTwYU6l2K8AeoTVBo4Hlbqvox2LytIkbgoAcLg/Q6+hFIiABywQVWAFSg4NxcWhUagkeAW0zXYJzh4h4Vg+LCHIFfi9SgluDAwGjVZgPG3oKBAgFnH9lhoSTpIqoGxkJurt9MWa/UwNTt7gSE8fHvTBCPhjOzxgLGAnR0QrX2BKPNgAZ1wUZBBkIEAwXCAQEBerZBJ0zAK2sCAcG6Q8QHQYH6a4F1+5wADiwbt6BAxQEFKBwEF0/BeveyQAQwGA9DQ4EXLDAYR8/da4OSIxBkcABegY8/1hwMICBgwgR9jl0ZWDksgAIUGqQU6HBgAMBYMoEGcHmC4o560WQI8DBBQEelnI42a+oQJz1DASwcGGUhZYOVlKg4NDqDaQGDHBgutFBACwQLlyAkI+AWW4Bsmqw4DPAhUCBpAxoUKFChgBGXVBMa4DC1wtjLkRwQNkA4Z6HE7dY3NhBIDkrHWiYaqBDBwgPMl9tTFfAZDkadh4EKs4VYhx7KDQoB4FCgAQK5FD0wCmAq+CaWTCC0JMBBa0+hFdEHEADRATJV+yBAOg59AkiE/ThNNAHdtxbV6bVgL3Pb4oAJLibUB497LQB6EffP4FTglbZqbBHHQGsRVEBCQAgHicA5GGXQEA3TEDghBTWoRUBt53FzIYbEuHhhyCGKOKIJJZo4okzhAAAOw==]]></data>
	</file>
	<file>
	  <filename>/images/icons/normal/php.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhMAAwALMLAP///9rCwqMAAK96egAAAJBXV8ejo9S4uObW1qNmZuDMzAAAAAAAAAAAAAAAAAAAACH5BAEAAAsALAAAAAAwADAAAAT/cMlJq7046827X0UojmRpEh9VAGzrvvBbDGgKxnjOFgZtr7qgq6Do1TxAoXBV9CGVSmDzuElCc8lpx3qNWbXVrstALptCVIF6zW672yzDoSwPBAz2fFrwWrPUf3wufgByZHMDBwEHLgF7gZAAgJKCk5OGBgkHBwOLjY+UkZaVpHEIBggJCAMIni2OFJMthIOCs5enAwm7p4yvoG6ipGxxZAirCT2+LLATo8Sh0cGFPaqqh5+xw4SjgdB4mQmsA3LZzm/o6YJ4A+Pk5b9hYnF59XfmGUmd+wH8/sV06ODDwGVekGb5DF5BSLCFv34QH0qMOPBCQYU4GFrEqESjBX0Rb0NOHFnxI0chHitcPFlSpUORMEdSjKdhJUtmVDbezJjTJAuZQEW2VLGTp7yiL1IS/RmzKUmaCZEm7elS6tAJNoU8xXnUKgClWL1CbSj2K9WlYsFKyMpSLQh7cOPKnXt2AoG7ePPq3cu3b10bgCtEAAA7]]></data>
	</file>
	<file>
	  <filename>/images/icons/normal/ppt.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhMAAwALMNANbX1t7f3pyeY+/Xxs7PnISGAHNxc7W2tZSWlM7Pzs4wAAAAAP///////wAAAAAAACH5BAEAAA0ALAAAAAAwADAAAAT/sMlJq7046827b0YojmRpLh9lMGzrvvBrIGgKxnjOGgdtr7qgywDo1TxAoXBV9CGVSmDzuEniEAmsNgtLTjtWKM76lSjO6LR6LTaFauu4fEuPJe74O1whZp37dgsHDX99hYAuCYKEfIaNiC2Kg4Vyan6PkAySjH5BjYeZm5Sel3RZp6ZaiYuUlWiXmZGsn3EMn7CxmrOXBAGVpajBqVyyk58Hl3+3tpiQosvMtcy5usZ+Ai4DbMzD3cQsz5cFAQwH0qDOu9GuuLHhjt7dq9aO1O9i6IjPrpXxwt/VGPGTY29RhjDUYGw6eIWFv1TzNCBMGJEhRRwLMUxkgMDhv3gVTzVexGhQ5EiFJS9s7Mjxo0uW4FJa2Hgxo8qTKAdZhMHyobCQN3ECnSl0aAWaFG3OzMO0qdOnTGVWWEC1qtWrWLNqlVrhgNevYMOKHUv2QAQAOw==]]></data>
	</file>
	<file>
	  <filename>/images/icons/normal/rar.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhMAAwAPerADk4OZRBezEwMSEwGAhJKQgIexgYpSFZEBhxEN7f7yEo1rVBpRiOCGs4WgjHAM5Zxs5JvRCmCFIwOWM4SiE497W23hggvZye1sbH3s7P5wBZ/wDfAHM4Y1o4Qv+O/0owAOfn50pJSoRBayEgIXtBawgICHNxc3t5e3t5Wmtpa1o4AGNhANbX75xBjJSWlIxZAHM4Wt7fAIRRAFpRSpxBhP///wDnADEgAHNxAK1xALW2Me+O74SGKSEgxmtBUmNBAHs4Y1IwANbXORCuCEIoAISGhHNJAHtRAOfnKWs4UsbHxv+e/9bX54yOIVJRAHtJITkgAHtRGBgQlLW2QmNhY/f3AAC+ABCeCIxBhGue/62uIVI4QlIwMdZx1mM4ACEYAKVpAIxJe6WmAK1RpWNBIRCGCDFJAK2uAACec2tJIYxZMWtJABAIABggxkJBGGs4GEooKUooOc7Pzns4a61RnISGY3NhKbX/xt7f3oRJazHHKa2urRCWCK1JlGNBUgD/AJxJhDmG/5xhAAC+e71ZrXNJKa15Mf+2/4RZIf/H/ylx/61JnJRpKYxJc5RhAJRhjACWAL2+APf39//X/znfMTEw/9bXADEw75S+/6VJlFo4ITFpKYyOAFI4Od6+e7V5EIz/a2s4Sq15KXtpUpRRjJyeALWOOSk4GAAAWlIwQgAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAKsALAAAAAAwADAAAAj/AFcJHEiwoMGDCBMqXMiwocOHECNKnEixosWLDwVISMWxo0eOErZs/PCxZMc4AhqaENARB4o6KOzM8ChBhaZUHzaa/CghJcOVHYLiEBOpFIoVQTtsLKRCxQelqTZKjUp1o0+FF4Am4YDiTIwpTVYkmTChQyoZKn58mCBBqdu2cJX2XFghqwAOQLiesQR2BYdQZM+SUUu2sOHDW64exFDXBAAgIrg2EcPpKIfLHDrISKO2AQcYn0ODHt1gguKCGRhfSAEgQIsWNGLHDkCbNpDNaoFgqc2bdx7TCDOkruu3C4TjyJNDoGMEjKMjSUgpnw5hUYPTAhMkGH4BQI1JiQ4t/1niobz5HWNGeRIVZc2OHebjn3+EHUACENsZA1jyYMGDFg8EKGCAhMxgyhFH3DDgggP2gZ1j9+UHQBcLVLEAEgtkqGGGmczwghFB3LDhiBsCgt0qEOKXAQBjtCBECzH0VlsYM4AYYhgy9oZFIydmBQAL+AHQggg6ECkCCUcmSYIPMwjghAA3+IDklEoeScIcJzb2IwgA+OADDw2A2cCYZPoRwpk1FAFACJ2Q6eabJ6rmGAsAcBRCKneaFEINkuzhghwujLCTRydy51gJqiSq6KKKhqBECSmkAOkIjFaqSnDcrQAAKpx26mmnjrJBBQBspDDCp6iicqJ23HmHSRaBKP+iway0UqCAo1+EAMAXpipA66+0VlJfhMMBkAUFPVBgAAXMNmtrCHhAUUIJUPTq7LUUXILdCfapiAEAGihQhQJIKGDuuQq0EYILTgAAgBNUjNAGuvSaeyK3xAKgQA9C9BCDBQAHbIEB7o5gsMGoGCDwwgD3yC2QCQBgQA86GFCxARhnbIAUBXySwwtRFCCFxiRnnOUFD3NZgAE8FNByATDHHLNTHwQh8803x1nXwwJwGgIqP6fK6QteeAGH0KgWqhq3iFpq6cdrcOF0pQglwIRqK5xCwNZcd931KYYIgggXXpfN9SkGnaDd1XWdUsMdoPxhw9wb1F03JXoMkQMYL3zGMITdgAduBdoFnXICfmyfYoMDaDA+iAOQRw75FR/L8MEVkmcuOeGFF+HtKVYMEUMESERg+umnl8GIGk98wAfqsKPOeeEuqHgKJAwIwUAMDPTuu+8IsE7GB2X8bvzvs9OO3ykIIKCF881HL/0BT7zh1CbSZy998sqfYsYBOIB/wPjkk2+G9R/AUf7663Nf0ABFnCK/G6fQL//9+MdBxP749+8/QwMIoAAHSMABTOuABUyg+zDCwAY68IEQjKAEJ0jBClrQgQEBADs=]]></data>
	</file>
	<file>
	  <filename>/images/icons/normal/rtf.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhMAAwAPcAAAAAAAAAhDH/KXNzc4SEhJSUlLW1tcbGxs7OztbW1t7e3v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////yH5BAEAAAIALAAAAAAwADAAAAj+AAUIHEiwoMGDCBMqXMiwoUMBAyJKnEixokUADwkOWMCxo8ePID8OKIAxI8SQKFNyHGCApMmNKmN6HJCgZUmHMGXK3FjTZcEAQIMKHUpU50qOPW8KJMq0qdEFOZMSBPqUI1WjORdIXRqg6oKrIQ2IHWsxYkmwRtF+NHBgLFsECAzAnXu261CrQb8OLYCAr1+ObMW2LXAAwQGPCAAYEED1bgGheiGjDGyAwIEDfA93TLz4at7IngM87jpZgQEFBBQUUGAYsWLGpPOOlt1YdN/bBQCbLkCgt2nNHDnDxmv3LtDcaj2OVaCaQEvgC4SHFt00NumwLVOnFuy6s/XqovHd+sUNOG7v1QXYdh8O2inelHILoE+vfvPr6U1zv588t3/c9fhRJ5l4uPUFmFsIAvhdbcd5lJxX0i2I3GcdPVhVhF4dV+B4HJJnn3cZXufVh7CBV92IH0VoYn4btsjhegllhWJMwsU4o1E1IpRThzy6uCGMOt6oU44HyShkSEQatKOPPTYJZJFH0viajVGmlGRBSzbJ5I8kUlklklMG+SWYi3k5opNdijlmimFCuSabZar5ZnBtKjnnk3beSWecRfrn55+ABlpnQQAUauihiCaq6KKDFoTgo5BGKqlYAQEAOw==]]></data>
	</file>
	<file>
	  <filename>/images/icons/normal/txt.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhMAAwAKIHAP///1NTU8TExHh4eAAAAKKiotHR0QAAACH5BAEAAAcALAAAAAAwADAAAAP/eLrc/jDKSas9IevNuycXEwBkaZ7oGQxgiKVwTAYF645ybgZG3Vo4nW7UswGFQlzxNwkiY8FlxflMOaXNqsyTYT6oWp3A6wgOBOc0eq1us9GmcTb8lEvA9Jg9Yn67/35wJXsQeHkphF+HQollJYCQgWlxZA2Gi5RzmHqVIo+SoJCZd5syjZalnJqRrH6jfKkwp56xKLMLfa26r4W1tp24vie3Crmhx5ODwMXCvMVc0FxIjRko1QDX1zsBoc4YGjMbM9ji5No51ODm6h3h56Zk5e3r2RrdymXs4jgc7pfD8fTV80eQUcB6A9f5u0ciXbSH6sQse9Gs4cR/m4hRrKgRHCOmjgJCihxJsqRJkxMJqFzJsqXLlzAnupi5IAEAOw==]]></data>
	</file>
	<file>
	  <filename>/images/icons/normal/xls.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhMAAwAPcCAAAAAABjAP///3Nzc5SUlLW1tc7OztbW1v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////yH5BAEAAAIALAAAAAAwADAAAAj/AAUIHEiwoMGDCBMqXMiwocMBECNKnEixIgCHBQf828ixo8ePHgcQuIhRoEaQKFP+G1BgZEkBJ1XK5DjgQEuSD2fqXPnPpsucO2We9IlzYcygKGMSbXhUJgEDT6NC3Xh06cAAWLNq3cp1Z0WIOLmKHRvUgNmzZsMGQPoPK1uPBgAUEOgWad23G+POFeB2a0e/bQMUGEy4sOHD//TSXds1sNaNdQt4lNyRMkfJivkydjx2beCNlkFPHp25LuPOHCOPrkxa7uLUnB+nFny4du3ErjX/je15tmjWwC/j3nv3M2rVwX8LL937MVnkwpP/w5zbtN/GWG1rLzz89XPZ0JWL3J/eXfdx555Dk5dOnfjp733Tr46+vHpvkF2zb99evrjO8OvRJxpzbAGo3oH9daagfG8xt+BYhqXEHUeZIXQSgtJ9VMABNsVU4UEXzjfehBt2SGFuFo4o4nQcFqBRiS6euFeK0+1H2GUtvpijjAqFyN5kLRK2Y14ogqgiezvC6GGRBvkoYICgJTlkeTTaeGOUJirJY0JOHoljllN+2KSXyllJmZgZkQnlVxRRaWSNVrKFJkFN4aXSnAPVaSdKeJqE1p+ABiron0wWBMChiCaq6KKMNlpoQWZGapsAAQEAOw==]]></data>
	</file>
	<file>
	  <filename>/images/icons/normal/zip.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhMAAwAPdAAHsAAJQAAJQIAIRaCJQYCIwhEIxKKYxSKZRaKXNjUmtjY3Nzc1JSeyFShDlahEpKhCFajCFalClajClalCljlClrlDFjlDFrlDljjDVrlFJShFZmiGJvjHd7hHuEhIOGiSFjnCljnClrnDFjnDlrlEFwlFpmlFZ7lClroBx9yTl7nEN9rQCD7xWW8USV41qc4mNjlGNjnGNrlGV4lmtrnGt1omuEoH6ImXN3rWuDsXt7qY2Wq36GtYSctYCXuouWzP///5yltZyttYSlvYylvZSlvZStvZytvYStxpSlxpStxpSlzpStzpS1zlql1nOl1jml70Kl51Kt51ql72ul3mOl52ul52O162ut53Ot73ut53u173u974S975St1pS11hC1/xTB/ymt/zm4/0q9/1K5/0LG/07O/1q5/2u992O9/1rO/2u9/3O993PG93PG/3PO/3u193u994y174y975yl/5C985S995TG+4TO/3PW/4ze93Pe/5Te/5Tn93vn/6VSQudjKbV7McaMOd6lOeKxOee9OefGOd6cQrVSSuetSu+tSr1SUq2Ea72UhKWlpefOOe/OOe/WOe/eOffeOffeQvfnOffnQvfvOf/vQv/3AP/3Of/3Qv//CP//Of//QqWttZytxpy1xqW1xq21xqW1zqW9zq29zrW9zrXGzpyt1py11py13qHA2KfB4KnG77XG3rXO3rXO5729vb29zr3Gxr3GzsbGxsbGzsbO1sbW3s7Ozs7W3tbW1tbe597e3pzG96Wl/62t/621/63O77W1/7m9/8bG/7XO763O95zO/73W763W97XW973W96XW/63W/7XW/7Xe78be77Xe973e98be97Xe/73e/8be/5zn/63n/73n/5zv/63v/73v/8bn/8b3/8b//87O987O/87e787e987n987n/87//9be79bn79bn99bn/9bv/9b//97n997v997v/97//+fv9+fv/+f39+f3/+/v7+/v9+/39+/3//f39/f3//f//////yH5BAEAAEAALAAAAAAwADAAAAj/AIEIHEiwoMGDCBMqJKgMGrNkyYgRe0XRlUVWGFep2shkyZIkIHn4+LUQIZ5/KFPyW8myJT98MGPC5CGtxq2SBk+m3PnPn09//YIG3Ue06L4c4bTYxEnwDs+UP4EKHWqUKA5ub6gsZQrEDj+eUaUKrVr0Ho5tbNC8oHGTqdedYaf2I0v0ntlnaMqQccGWKZ2vKKPKnUvW7r16OJTpHSPGhYy2C+d8FSyX7j7D9erVKNOChWcWKWBALmhjgunTqCGgyke1sN3M9Xz44EGbNg4aH0iS/keHzpY2bd68gQNHzxrV9Ohihp3ZWLFiwoIFq8Njwa6CN1D2/h18ePE1KShY/0BtwYIPePUOM5fHvr27OjqsFxQhQsUKChRA6Nc/IQSYMGdo884/6HRxBRkl8IIebO016E478MlXUC+3VHhLLbPUoqGGG/z3hzj/cDMFFGhYYMs6DDbI3oMQxncdEI0YIOOMNNZYS4d8gMjNC1CUQQEq6mSmojzusNiifI4gwAknmVxySSWRHGJIIYUQIsgBBuxgSwmomRbCCUDWM6SR7bQTjItAAJIII2y26SabBSBiwAe1+JKLCl04cwIopKCiCzsqFkkmOmfKx8gniH6yJJOYNOpkAIoY4EEt8MBDARZOSMFFEL4AqmKZoLaDDqFoHhrIqaimGsgkkEpaCz1DiP8DTSteTEBKOYGSKeqohV5naifABhvsAKxG6gEq8JRDQR/+WBAEKri6N+iovNZg6CeBAAvAtttq0gmxrR4LTykiROGCFHkEoY57oe5KLaHW+spJtsIKO4Ak4SLbgzjRuFLrKOW0U2S7744KjjDxAsHIvAM07PDD+BqLrLJ90GOBENAKHGrBBh+c8MKZOOrkJCRLIgkk+cJTBAXmopFuwBtzDA442QhDg6HzqqoqyhKzg4Q4xNA6wSjTxFzwzDTbbCgm9NYL7AA8S3oKO+VcoE2zRZxSdJkyI51NzTf7yrS23ALgLdThTk0Eyy6osek0HHdM89fZFBO2wpc07fQAh7T/2gEpPgPdChMTaB2313RjY7eheT/sON8BDGLA3+ycI8ET/zhr+LtIz50NNqAXIwPjl5R8MiSoH6K6AAcocAMqJ3RpWg7WUIt44qGPfl0AvPfuu+8FJNBBEBOYsc08/7hjRxplWACLNZ3T/TnoocMg3y+PfKD99tp3sEAH4H+wwwxrnJFjiC+0UGIpy8ws/fTUY2OM9S/+ssstEkjQwP789z9BDmcIw/l2pD4LiGIZ74Mf9a4xPwkNJDu88Q1w3OCdNYwhDBSQHQVswD7pxW+BDKSfQWYQQe5QkDgWDEMQQqGCLSxjBkU4QilgUQ3cffAa14hGA19UkBLcJz/72Q8K/yoQCli08IVGgMUyaqhAEOZQhyI8CIVuwYBHjGIUsbPBEUYBiwyShxg+mMAJmnHDJ0YjGsfYgAMRIpppTGME/ziNBUQwIHQAwwqn+ccIWkFG0OHQjGhUIw8RQoNdlGkE1BhBN7rhBxGIwx/XeAEVJrCHETBjBEoghh8BGQ1opHGNBymkqCwQBzk6EpKSPE0WLJBJHJ7xlZ30pAZAaRAY7GJUGCDBCYoQilB48TQS6MEJSOCAVgISGsiUJS0LYstRTeMUpXCFLJABi1Io4ZrXXIUrVsGEVRADlrFM5jFmOciDNBMd1ljGEr9WjWUgAxkSkUgzmiFPWCZTnORcyDlv11TETXLynskkRz4VAoNxkOOgCE2oQhfKUIQqY6AJgYFEJbqBDWjgohjNqEY3qtEHQBQhv9jBAkZK0pKa9KQoNekOdKMQ++3ipTCNqUxnStOY/oIfAQEAOw==]]></data>
	</file>
	<file>
	  <filename>/images/icons/small/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/images/icons/small/bmp.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEAAQAJEAAAAAAP///wCAAP///yH5BAEAAAMALAAAAAAQABAAAAI5nAepewcBIwTNPBlVuzivDybCSJalCI2BKqQC2rbrHKNrnLowjZM22xuJTERh6EhxdCRJyzKzQSYKADs=]]></data>
	</file>
	<file>
	  <filename>/images/icons/small/def.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEAAQAMQAAKHU/zBlzf///9rp9hBKum2M0yNZyNfX1+vr68jIyFB5zper0+zu9jNt5RdRx/f393Oc7Nbe7/v773et+4yt787e+v//98PL40qM/4Gc0aW1ztbe96W951+I3u/3/wAxvSH5BAAAAAAALAAAAAAQABAAAAWooCAKQ2RGVfSMbMSwZITAkTgAOCDKYz1Mk4EkMsFUBLwBY4DpSAQci6XR8Awujxqk0RkoPhlBxwARXA6uRiBgcBAuAoUhgERX5muHRgBxsBkRCSZ4BgUCFARrBoBoD2xsBQOPDgoWZyoLiWsFim8MFwhZFgoEDgt8BAQZFhEHKwgDFhmJCwYGC6wJMyKwDwgaCxcSgLosFp8RAyURF8UwAr4HCQcHuyMhADs=]]></data>
	</file>
	<file>
	  <filename>/images/icons/small/doc.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEAAQAKIFAISGhMbHxgAA/wAAAP///////wAAAAAAACH5BAEAAAUALAAAAAAQABAAAANRWArcrrAAQisFQ4mxOx8XkYFWJVBD+nle4BJBuolnRwUwR9TgEOPAFG21A+Z4MQHO94r1eJRTJVmqMIOrrPSWWZRcza6kaolBAOB0WoxRud0JADs=]]></data>
	</file>
	<file>
	  <filename>/images/icons/small/eps.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEAAQAJEAAAAAAP////WQAP///yH5BAEAAAMALAAAAAAQABAAAAI6nAepewcBIwTNPBlVuzivDybCSJalKERpMEIjyrbp/AJt7K61zPOwG9MJUKbiMISkODoSpYWZ2SQTBQA7]]></data>
	</file>
	<file>
	  <filename>/images/icons/small/fla.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEAAQAMQAAGAFFP/BLurooZJjo/JWXfgDAf///6UAC8QAAP9zA/WDheP7+/01ALCQjvvGyf+zsvEoJfL//nc6A8eHev/q6kYAAPail+P338OIu//V5///8N///3IHXtIdHP//4rY5biH5BAAAAAAALAAAAAAQABAAAAV/oCGOZFkGY4GKi1kIRlIYUVR0USkwxrxBBcJmlGE8YoSEojDJlRwMRoDhsUwIEKeON+osCwoKqVGRiCzBzaJw1Ewq5QtgcLgAxTS4RBBxVBoECBEdBQ4iEoY5AAA0BxgGhCMLOWSPBh8IBgsKJhWMIhoIAyYiHJYiA5mkq6ytIQA7]]></data>
	</file>
	<file>
	  <filename>/images/icons/small/folder.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEAAQAMQAAP/PY//3nP/fe//vhKV5EP/3pffXhOe+Ut62Qt62Od62Sv/3jP//lP//9//ne//nhP/Xa72eMf//nJx5GLWOGP////f39wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAAQABAAAAVnoCWOZDlGaGSWUeU26mq1Ui1VVJ4TZ7D8P5eQJ4oMHrqkciagVBpQqNDQoEwiEIpNUtgCJNYIQMsomxmLA/g6ljze8MdAUQi3Hfi8Q4BYi7UQgYKBCQFWFkqJOhMiE46PkI8yk5QmIQA7]]></data>
	</file>
	<file>
	  <filename>/images/icons/small/gif.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEAAQAKIEAMDAwACAAP///wAAAP///wAAAAAAAAAAACH5BAEAAAQALAAAAAAQABAAAAM8SDrcPioOQWsdIJJpbZNd+IxkYJ4oypgU23pDIKSzfK5zbcstzv67wIrnyt1iqaSJxGSAQp4nlAJZNBsJADs=]]></data>
	</file>
	<file>
	  <filename>/images/icons/small/gz.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEAAQAPdAAHsAAJQAAJQIAIRaCJQYCIwhEIxKKYxSKZRaKXNjUmtjY3Nzc1JSeyFShDlahEpKhCFajCFalClajClalCljlClrlDFjlDFrlDljjDVrlFJShFZmiGJvjHd7hHuEhIOGiSFjnCljnClrnDFjnDlrlEFwlFpmlFZ7lClroBx9yTl7nEN9rQCD7xWW8USV41qc4mNjlGNjnGNrlGV4lmtrnGt1omuEoH6ImXN3rWuDsXt7qY2Wq36GtYSctYCXuouWzP///5yltZyttYSlvYylvZSlvZStvZytvYStxpSlxpStxpSlzpStzpS1zlql1nOl1jml70Kl51Kt51ql72ul3mOl52ul52O162ut53Ot73ut53u173u974S975St1pS11hC1/xTB/ymt/zm4/0q9/1K5/0LG/07O/1q5/2u992O9/1rO/2u9/3O993PG93PG/3PO/3u193u994y174y975yl/5C985S995TG+4TO/3PW/4ze93Pe/5Te/5Tn93vn/6VSQudjKbV7McaMOd6lOeKxOee9OefGOd6cQrVSSuetSu+tSr1SUq2Ea72UhKWlpefOOe/OOe/WOe/eOffeOffeQvfnOffnQvfvOf/vQv/3AP/3Of/3Qv//CP//Of//QqWttZytxpy1xqW1xq21xqW1zqW9zq29zrW9zrXGzpyt1py11py13qHA2KfB4KnG77XG3rXO3rXO5729vb29zr3Gxr3GzsbGxsbGzsbO1sbW3s7Ozs7W3tbW1tbe597e3pzG96Wl/62t/621/63O77W1/7m9/8bG/7XO763O95zO/73W763W97XW973W96XW/63W/7XW/7Xe78be77Xe973e98be97Xe/73e/8be/5zn/63n/73n/5zv/63v/73v/8bn/8b3/8b//87O987O/87e787e987n987n/87//9be79bn79bn99bn/9bv/9b//97n997v997v/97//+fv9+fv/+f39+f3/+/v7+/v9+/39+/3//f39/f3//f//////yH5BAEAAEAALAAAAAAQABAAAAjRAIEIBMKM2CtXrFQxScJjoMN/EP3167dvHw4qDgX+8yeR4r57OMi4GPhvyxs4ECp+rFevWLAFAm/dqlULjLgpFurJ29luASBGQBkhqqXiBKqd7tqhW8Cok9MBilBRsFBOXlJ0SxkN2ApVKtV2StGBY+q0E9RTFyxMCwsuG1OuAwaRkqBWbFtsC3592NvhwxpxLyy0zYYNr8YtbuCEUTGjFOHC0WAOnPZvwjtgE0ZguxYtskN0JEJNmNDDAWdo0CQLFPt4czTUqR0umE279oIdAQEAOw==]]></data>
	</file>
	<file>
	  <filename>/images/icons/small/html.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEAAQAOZOAISmxs7P/2Oezvf3973P/2tpnK3P/ylxpXOu3lJRhKXH5ymGzr3P53OGtRg4Y73f/87n/yGe5zmW3rXX70qu70LP/3uGrUJhhDmOzimW5zGe75y23t7v/+/3/ymOxufv92u+7zG+97XP/0Ku/0p5rdbv/zFBa8bX78bn93NxpYzv/yGOzjGe3nP3/5S+1muOrTlplDFBWjme52OWtb3X93PX/+f3/73f9ymW7/f//zmu9ymm75TH/ym29zGO3iF5vTFxtWNhlDGW7zGu763P73PX71JRjMbn/1pZjClZjFKOvYyu1nNxc////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAE4ALAAAAAAQABAAAAfLgE6CS4SFhA2CiYNNjI1NDQKKi00fJ4QTDQQykksCSp5KTSEFpBaJSkoqLRUhAk0gHzkEFkxOMwIoQx4eETskTR0dBCm1SgMABwpNPyMSLxw2BAVMxgA9KxQUPhojJAwc0kzHFRFJ5ucwDCUiQUwANQcZSTxH9UcQRBAiSNQS8ThAFCwYeGHCEQMJmLAYgOGABiE6ioCI4eLBA4RMEABgmMSBCQcXNtAIcDChEwQoAyjYwCDADZIBMCZCgsSIzZo4a9ZKxKSnz589AwEAOw==]]></data>
	</file>
	<file>
	  <filename>/images/icons/small/jpg.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEAAQAKIEAAAAAP///4CAAMDAwP///wAAAAAAAAAAACH5BAEAAAQALAAAAAAQABAAAAM8SArcDiqCQGsFI5JpbZNd+IykYJ4oyggVG5yUubLma6tAXb80P/M8Gm0VE+5kuZQSSWqCQp4nlAJZNB0JADs=]]></data>
	</file>
	<file>
	  <filename>/images/icons/small/js.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEAAQAKIAAP///4CAgAAAAAAA/wAAgAAAAAAAAAAAACH5BAAAAAAALAAAAAAQABAAAAM7CLrcGjBKF9yqDFsgMpDQ0l0bQBDj94HKMKSa48LrBMzkhj911L45y07FQP1ojAHhKBI4nwSXstRMARIAOw==]]></data>
	</file>
	<file>
	  <filename>/images/icons/small/mov.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEAAQAPcAAAAAABAI5xAQEBgYEBgYGBghGCEIziEY7yEhISFS3iFr5ykx5zExMTH/KTkhxjk5OTlC1kJS70Kt3kpz70qMvUqM50qt71Jz91paWlpj3lprvVqt92NjzmtzvXNjxnNzznuExnucrYSU54S91oycvZSUxpSczpStvZStzqW1ta293r3Gzsa1xtbW3tbe1t7W1t7e3u/n5+/v5////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////yH5BAEAAA0ALAAAAAAQABAAAAijABsAQIAAgMGDBxsoFDjjwYyHEGcAkLhwIIKIECdSZOjwBQULFTTAGGhQocUYEiZ4+CACwgwEAgCYbIhiA4sZIToEWMFgo8UREWacAPEiQQkCMWc+UDGhxcMUClL0lCmQoIwLC0iEkGDARYGkHGfIyHAAAgcHJqaaJIgRIkyqCOMe9DkDQ927dl+C1Xg3Iga1DO1iEHz3rUmDBBEMEMA4ZsmAAAA7]]></data>
	</file>
	<file>
	  <filename>/images/icons/small/pdf.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEAAQAMQdAOeOjOdBQueuredJSue2td7n597Pzudpa+eenN7X1udRWu9ZWueGhOd5e+e+vedZWu9BSu9RUudhY+dxc+84OecwMec4Que2vecoKRAQEP8AAAAAAN7f3v///wAAAAAAACH5BAEAAB0ALAAAAAAQABAAAAVjYCduZFlmmahuXOu2mZaaNMnF8qbtPM+eul6P5crUaK/U6DUQvG6rlwXxVHaILczEVYAuWwgD4JCMchILAaFCCSguViIjAGgQBAAJJM55BJ5nDnEHAwaAHAVxEYdFKiiPkJAhADs=]]></data>
	</file>
	<file>
	  <filename>/images/icons/small/php.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEAAQAKIAAP///54LDgAAANS6uKNsZwAAAAAAAAAAACH5BAAAAAAALAAAAAAQABAAAANFCErcrhCQGImgky5wYdZCKARkaZrDCAUAyypk6rb0HKvwugZyS9a+m+tnK8lOyJtHE0ktB9AoFODcMBVViXQL7UhE4HACADs=]]></data>
	</file>
	<file>
	  <filename>/images/icons/small/png.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEAAQAKIEAAAAAP///4AAAMDAwP///wAAAAAAAAAAACH5BAEAAAQALAAAAAAQABAAAAM8SArcDiqCQGsFI5JpbZNd+IykYJ4oygiUGbjuu740zZ7ze7f2fOo2lg92Y8kAqSSOxIQsQh3nBuqRNBsJADs=]]></data>
	</file>
	<file>
	  <filename>/images/icons/small/ppt.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEAAQAKIGAISGhISGAMbHxgAAAP8AAP///////wAAACH5BAEAAAYALAAAAAAQABAAAANQaArcrtCAQitligTNd7gFYHxWRVBDOpydVgRCXAjDtxUsbtH568Iyms3So/BwpF9MMKv5PMXmqUQBMoUt6G4Amcxmyyt3Qd12w+jYWKJquxMAOw==]]></data>
	</file>
	<file>
	  <filename>/images/icons/small/rar.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEAAQAOYAABAwAAAwUvf394SGAJSWpQBRlABRnJyerTEwMe/3/+fn973H1v//taWmtYSGlGsYIQCGUowAUgBZpVJRAABRhFrvvcbHGP951gBRpe9ZtYzvzhBBAHPH/zFRACnnpULnrQA4WiGe/3NxABDfnHPvxoTP//9pzr2+ADmm//dhxv++9/+m5/+W3rXn/wDflAA4a0qu//+G1pzX/73351q2/2O+/wCOWpQAWvf//4QAUtbf51IAAFoYABhJAAA4Y////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAAQABAAAAeZgDyCg4SFAg0HBA4PIjmOj487Czo6ChEMKissMRcXJikZOzo4Pz8PFjepqqkROzg4CToIAzu1trdAubq7vIeJDiAUPsPExAGTlRQMLTIlHDU0MCghAaOlLxYSEhgG3QXfAa+xs8XlAbzou76KGxM97/DwAMgKEwwzGiQVFR8eIy4ArP3ocMKGwYM2IEAAIE7WgHgQAaSbKCAQADs=]]></data>
	</file>
	<file>
	  <filename>/images/icons/small/rtf.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEAAQAKIFAISGhMbHxgAA/wAAAP///////wAAAAAAACH5BAEAAAUALAAAAAAQABAAAANRWArcrrAAQisFQ4mxOx8XkYFWJVBD+nle4BJBuolnRwUwR9TgEOPAFG21A+Z4MQHO94r1eJRTJVmqMIOrrPSWWZRcza6kaolBAOB0WoxRud0JADs=]]></data>
	</file>
	<file>
	  <filename>/images/icons/small/txt.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEAAQAKIAAP///0NDQwAAAMfHx1lZWQAAAAAAAAAAACH5BAAAAAAALAAAAAAQABAAAANECErcrhCQGImgky5wYdZCKARkaZrDCAUAyypkSrYuTQeyO5d3buu9EXAYE56OuI5EE0l5AIOoNApVfpjOxXQbtYq+4AQAOw==]]></data>
	</file>
	<file>
	  <filename>/images/icons/small/xls.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEAAQAKIGAPf39wCGAMbHxgAAAISGhP///////wAAACH5BAEAAAYALAAAAAAQABAAAANQaErcrtCQQislQwWyK5/FlH0dSQ3oEBRb+wlwIQzA6m4Clc9Azb6wGK/1I8pkKpMriCRxipbZ7UncZRYV13EGmQR3wqvEQkZ2v2iYGJNqtxMAOw==]]></data>
	</file>
	<file>
	  <filename>/images/icons/small/zip.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEAAQAPdAAHsAAJQAAJQIAIRaCJQYCIwhEIxKKYxSKZRaKXNjUmtjY3Nzc1JSeyFShDlahEpKhCFajCFalClajClalCljlClrlDFjlDFrlDljjDVrlFJShFZmiGJvjHd7hHuEhIOGiSFjnCljnClrnDFjnDlrlEFwlFpmlFZ7lClroBx9yTl7nEN9rQCD7xWW8USV41qc4mNjlGNjnGNrlGV4lmtrnGt1omuEoH6ImXN3rWuDsXt7qY2Wq36GtYSctYCXuouWzP///5yltZyttYSlvYylvZSlvZStvZytvYStxpSlxpStxpSlzpStzpS1zlql1nOl1jml70Kl51Kt51ql72ul3mOl52ul52O162ut53Ot73ut53u173u974S975St1pS11hC1/xTB/ymt/zm4/0q9/1K5/0LG/07O/1q5/2u992O9/1rO/2u9/3O993PG93PG/3PO/3u193u994y174y975yl/5C985S995TG+4TO/3PW/4ze93Pe/5Te/5Tn93vn/6VSQudjKbV7McaMOd6lOeKxOee9OefGOd6cQrVSSuetSu+tSr1SUq2Ea72UhKWlpefOOe/OOe/WOe/eOffeOffeQvfnOffnQvfvOf/vQv/3AP/3Of/3Qv//CP//Of//QqWttZytxpy1xqW1xq21xqW1zqW9zq29zrW9zrXGzpyt1py11py13qHA2KfB4KnG77XG3rXO3rXO5729vb29zr3Gxr3GzsbGxsbGzsbO1sbW3s7Ozs7W3tbW1tbe597e3pzG96Wl/62t/621/63O77W1/7m9/8bG/7XO763O95zO/73W763W97XW973W96XW/63W/7XW/7Xe78be77Xe973e98be97Xe/73e/8be/5zn/63n/73n/5zv/63v/73v/8bn/8b3/8b//87O987O/87e787e987n987n/87//9be79bn79bn99bn/9bv/9b//97n997v997v/97//+fv9+fv/+f39+f3/+/v7+/v9+/39+/3//f39/f3//f//////yH5BAEAAEAALAAAAAAQABAAAAjRAIEIBMKM2CtXrFQxScJjoMN/EP3167dvHw4qDgX+8yeR4r57OMi4GPhvyxs4ECp+rFevWLAFAm/dqlULjLgpFurJ29luASBGQBkhqqXiBKqd7tqhW8Cok9MBilBRsFBOXlJ0SxkN2ApVKtV2StGBY+q0E9RTFyxMCwsuG1OuAwaRkqBWbFtsC3592NvhwxpxLyy0zYYNr8YtbuCEUTGjFOHC0WAOnPZvwjtgE0ZguxYtskN0JEJNmNDDAWdo0CQLFPt4czTUqR0umE279oIdAQEAOw==]]></data>
	</file>
	<file>
	  <filename>/images/icons/sort_down.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhFAAPANUAAOfu8OLr7t7o693n7Mjh6bjY4r/R2LnR2qrQ3LHL063G0K7GzqzFzqnE0KnFz6XBy5y8yJu6xJu6xZG0wpCyvYmtu4OquoGpuoOotX2ltXqisnmitHSfsXWerHOcqnOcq2+ZqW2arG6Yp2uYqWeVp2WTomWTpGCQolmKnVeImlKFmEyAk0yBkkV7jv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEHAC4ALAAAAAAUAA8AAAZvQJdwSCwaG5ekcsm8NIYWQgFBrVqpFuJgc9hwvuAwZ1BUTCChtHqtMLo0jgxpTp9r3K7AKHHq+/sBeC4MFRUoh4gMgkIfDyYqkCofi0ICIBIrmSkClEILGB0tLQudQx4RLCKlQwAlFACrQwYGsatBADs=]]></data>
	</file>
	<file>
	  <filename>/images/icons/sort_up.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhFAAPANUAAPX4+fD19+bu8ePs79vn7Nfj58fY4LjO163I1KvH0qXF0KjCzKLBzKLAzKPAzKG/y529ypu7yJm5xZK5xpe4xJW3xI6ywI6xwIiuvoituoqtuoKuvYGpuX+ntX+nt36mt3mjtHqisnehsXSfsXOer3CcrmuYqmeVp2SSo2OSpGKRomORo16OoFWHmv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEHAC4ALAAAAAAUAA8AAAZwQJdwSCwajy4CAckMQBAB5tGRwDykRUOk8vkYsEKBhQEqcwTgS8Mzao8u2MPlUqrbD8wB6WHq+/sDRwAhFCInh4iHIQBGCx0ZKZGSkwtFBSsSKiybnJ0sBUMAKAoTG6anqKYojC4aLa+wsbItGmBMQQA7]]></data>
	</file>
	<file>
	  <filename>/images/pencil.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFUSURBVDjLrZM/SAJxGIZdWwuDlnCplkAEm1zkaIiGFFpyMIwGK5KGoK2lphDKkMDg3LLUSIJsSKhIi+684CokOtTiMizCGuzEU5K3vOEgKvtBDe/2Pc8H3x8NAM1fQlx4H9M3pcOWp6TXWmM8A7j0629v1nraiAVC0IrrwATKIgs5xyG5QiE+Z4iQdoeU2oAsnqCSO1NSTu+D9VhqRLD8nIB8F0Q2MgmJDyipCzjvYJkIfpN2UBLG8MpP4dxvQ3ZzGuyyBQ2H+AnOOCBd9aL6soh81A5hyYSGWyCFvxUcerqI4S+CvYVOFPMHxLAq8I3qdHVY5LbBhJzEsCrwutpRFBlUHy6wO2tEYtWAzLELPN2P03kjfj3luqDycV2F8AgefWbEnVqEHa2IznSD6BdsVDNStB0lfh0FPoQjdx8RrAqGzC0YprSgxzsUMOY2bf37N/6Ud1Vc9yYcH50CAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmcgPSBhcnJheSgKJ3Bvc3RpbnN0YWxsJyA9PiAnUG9zdCBJbnN0YWxsIE1lc3NhZ2UuJywKJ3Bvc3R1bmluc3RhbGwnID0+ICcnLAoncmVhbGx5X3VuaW5zdGFsbCcgPT4gJ1JlYWxseT8gQXJlIHlvdSBzdXJlCnlvdSB3YW50IHRvIHVuc2luc3RhbGwgdGhpcyBmaW5lIG1vZHVsZT8nLAondW5pbnN0YWxsZWQnID0+ICdNb2R1bGUgVW5pbnN0YWxsZWQuJywKJ2luc3RhbGxlZCcgPT4gJ01vZHVsZSB2ZXJzaW9uICVzIGluc3RhbGxlZC4nLAondXBncmFkZWQnID0+ICdNb2R1bGUgdXBncmFkZWQgdG8gdmVyc2lvbiAlcy4nLAovLyAnbW9kZGVzY3JpcHRpb24nID0+ICdUaGlzIG1vZHVsZSBpcyBnZW5lcmF0ZWQgYnkgTSZDIEZhY3RvcnknLAoKJ3RhYl9pdGVtcycgPT4gJ0l0ZW1zJywKJ3RhYl90ZW1wbGF0ZXMnID0+ICdUZW1wbGF0ZXMnLAondGFiX29wdGlvbnMnID0+ICdPcHRpb25zJywKJ3RhYl9oZWxwJyA9PiAnSGVscCcsCgonZXJyb3InID0+ICdFcnJvciEnLAovLyAnYWRtaW5fdGl0bGUnID0+ICdDb21wYW5pZXMgQWRtaW4gUGFuZWwnLAonYWRtaW5kZXNjcmlwdGlvbicgPT4gJ1RoaXMgbW9kdWxlIGhlbHBzIHlvdSB0byBtYW5hZ2Ugc3BlY2lmaWMgaXRlbXMnLAondGl0bGVUZW1wbGF0ZScgPT4gJ1RpdGxlJywKJ2NvZGVUZW1wbGF0ZScgPT4gJ1RlbXBsYXRlJywKJ2FjY2Vzc2RlbmllZCcgPT4gJ0FjY2VzcyBEZW5pZWQuIFBsZWFzZSBjaGVjayB5b3VyIHBlcm1pc3Npb25zLicsCidwb3N0aW5zdGFsbCcgPT4gJ0JlIHN1cmUgdG8gc2V0ICJNYW5hZ2UgQ29tcGFuaWVzIiBwZXJtaXNzaW9ucyB0byB1c2UgdGhpcyBtb2R1bGUhJywKCidzdWJtaXQnID0+ICdTdWJtaXQnLAonYXBwbHknID0+ICdBcHBseScsCidjYW5jZWwnID0+ICdDYW5jZWwnLAoncmVzdG9yZWxpc3QnID0+ICdSZXN0b3JlIGxpc3QnLAoncmVzdG9yZWRldGFpbHMnID0+ICdSZXN0b3JlIGRldGFpbHMnLAoncHVibGlzaCcgPT4gJ1B1Ymxpc2gnLAondW5wdWJsaXNoJyA9PiAnVW5wdWJsaXNoJywKCgonYWRkIHRlbXBsYXRlJyA9PiAnQWRkIHRlbXBsYXRlJywKJ3NlbGVjdCBvbmUnID0+ICdTZWxlY3Qgb25lJywKJ2Zvcm1fdGVtcGxhdGUnID0+ICdUZW1wbGF0ZScsCidmb3JtX3Jlc3RvcmVfdGVtcGxhdGVfZnJvbScgPT4gJ1Jlc3RvcmUgdGVtcGxhdGUgZnJvbScsCidmb3JtX2NvZGUnID0+ICdDb2RlJywKJ2Zvcm1fZGVmYXVsdF90ZW1wbGF0ZV9mb3InID0+ICdEZWZhdWx0IHRlbXBsYXRlIGZvcicsCidkZWZhdWx0IHRlbXBsYXRlIGZvcicgPT4gJ2RlZmF1bHQgdGVtcGxhdGUgZm9yICIlcyIgYWN0aW9uJywKCi8vIHVzZXIgZm9ybQoneW91IGRvIG5vdCBoYXZlIHRoZSBwZXJtaXNzaW9uIHRvIHVzZSB0aGlzIGFjdGlvbicgPT4gJ1lvdSBkbyBub3QgaGF2ZSB0aGUgcGVybWlzc2lvbiB0byB1c2UgdGhpcyBhY3Rpb24nLAonZm9ybV91c2VyX2lkJyA9PiAnVXNlciBpZCcsCidmb3JtX3RpdGxlJyA9PiAnVGl0bGUnLAonaXRlbSBwb3N0ZWQnID0+ICdJdGVtIHN1Y2Nlc3NmdWxseSBwb3N0ZWQnLAoKJ3NhdmUnID0+ICdTYXZlJywKJ3NhdmVfYWRkJyA9PiAnU2F2ZSAmYW1wOyBhZGQgYSBuZXcgaXRlbScsCidzYXZlX2NvbnRpbnVlJyA9PiAnU2F2ZSAmIGNvbnRpbnVlIGVkaXRpbmcnLAonZGVsZXRlJyA9PiAnRGVsZXRlJywKJ2FkZF9pdGVtJyA9PiAnQWRkIGl0ZW0nLAonYWRkX2l0ZW1fZm9yJyA9PiAnQWRkIGl0ZW0gZm9yIFslc10nLAonZWRpdF9pdGVtJyA9PiAnRWRpdCBpdGVtJywKJ3VwZGF0ZV9vYmplY3RzJyA9PiAnVXBkYXRlIG9iamVjdHMnLAoncHJldmlld19zJyA9PiAnUHJldmlldyBbJXNdJywKCidmb3JtX3BhcmVudF9pZCcgPT4gJ1BhcmVudCcsCidmb3JtX29yZGVyX2J5JyA9PiAnT3JkZXIgYnknLAonZm9ybV9vcmRlcl9ieV9kaXJlY3Rpb24nID0+ICdPcmRlciBkaXJlY3Rpb24nLAonZm9ybV9pdGVtc19wZXJfcGFnZScgPT4gJ0l0ZW1zIHBlciBwYWdlJywKJ2Zvcm1fZGF0ZV9mb3JtYXQnID0+ICdEYXRlIGZvcm1hdCcsCidmb3JtX2RlZmF1bHRfcGFnZScgPT4gJ0RlZmF1bHQgcGFnZScsCidmb3JtX3Nob3dfcGFyZW50JyA9PiAnU2hvdyBwYXJlbnRzIGRyb3Bkb3duJywKJ2Zvcm1fc2hvd19wYXJlbnRfZmlyc3RfbGV2ZWwnID0+ICdTaG93IHBhcmVudHMgZmlyc3QgbGV2ZWwgb25seScsCidmb3JtX3NhdmVfYWRkJyA9PiAnU2hvdyBTYXZlICZhbXA7IGFkZCBidXR0b24nLAonZm9ybV9pbmRleF9jb250ZW50JyA9PiAnSW5kZXggY29udGVudCcsCidmb3JtX3VzZV9jbW9uJyA9PiAnVXNlIENhbXBhaWduIE1vbml0b3InLAonZm9ybV9jbW9uX2Zyb20nID0+ICdDYW1wYWlnbiBNb25pdG9yIEZyb20nLAonZm9ybV9jbW9uX2Zyb21fZW1haWwnID0+ICdDYW1wYWlnbiBNb25pdG9yIEZyb20gZW1haWwnLAonZm9ybV9jbW9uX3RlbXBsYXRlJyA9PiAnQ2FtcGFpZ24gTW9uaXRvciB0ZW1wbGF0ZScsCidmb3JtX2Ntb25fdGVtcGxhdGVfcGxhaW4nID0+ICdDYW1wYWlnbiBNb25pdG9yIHRlbXBsYXRlIChwbGFpbiB0ZXh0IHZlcnNpb24pJywKJ2Zvcm1fY21vbl9kZWZhdWx0X3BhZ2UnID0+ICdEZWZhdWx0IHBhZ2UgZm9yIENhbXBhaWduIE1vbml0b3IgSFRNTCcsCidmb3JtX3VzZV90d2l0dGVyJyA9PiAnVXNlIFR3aXR0ZXInLAonZm9ybV90d2l0dGVyX3RlbXBsYXRlJyA9PiAnVHdpdHRlciB0ZW1wbGF0ZSAoYXZhaWxhYmxlIGZpZWxkczogeyR0aXRsZX0sIHskdXJsfSknLAonbW9kdWxlX29wdGlvbnMnID0+ICdPcHRpb25zJywKCgonZm9ybV9yZW1vdGVfZ2FsbGVyeScgPT4gJ1JlbW90ZSBnYWxsZXJ5IFVSTCcsCidmb3JtX2VuYWJsZV9hcGknID0+ICdFbmFibGUgQVBJJywKCidzZWxlY3Rfb25lJyA9PiAnU2VsZWN0IG9uZScsCidleHBvcnQnID0+ICdFeHBvcnQnLAonc2VyaWFsaXplZF9kYXRhcycgPT4gJ1BIUCBTZXJpYWxpemVkIGFycmF5JywKJ2Rvd25sb2FkJyA9PiAnRG93bmxvYWQnLAoKJ2Zvcm1fdXBsb2Fkc19wYXRoJyA9PiAnVXBsb2FkcyBwYXRoJywKJ2Zvcm1fbW9kdWxlJyA9PiAnTW9kdWxlJywKJ2Zvcm1fc2VsZWN0X21vZHVsZV9mb3JfbWlncmF0aW9uJyA9PiAnU2VsZWN0IHRoZSBtb2R1bGUgeW91IHdhbnQgdG8gbWlncmF0ZScsCidmb3JtX2ZpZWxkcycgPT4gJ0ZpZWxkcycsCidmb3JtX3NlbGVjdF9maWVsZHNfdG9fcG9wdWxhdGUnID0+ICdTZWxlY3QgdGhlIG1vZHVsZVwncyBmaWVsZHMgeW91IHdhbnQgdG8gcG9wdWxhdGUnLAonQ29udGludWUnID0+ICdDb250aW51ZScsCgonY2hhbmdlbG9nJyA9PiAnPHVsPgo8bGk+VmVyc2lvbiAwLjAuMSAtIDEgTm92ZW1iZXIgMjAxMi4gSW5pdGlhbCBSZWxlYXNlLjwvbGk+CjwvdWw+JywKJ2hlbHAnID0+ICcKPGgzPkhlbHA8LzM+CjxwPlRvIGNhbGwgYSBnYWxsZXJ5LCB1c2Uge01DTWVkaWFzIGNvbGxlY3Rpb25faWQ9IllvdXIgQ29sbGVjdGlvbiBJRCIgdGVtcGxhdGU9IllvdXIgdGVtcGxhdGUifS4gVGVtcGxhdGUgaXMgbm90IG1hbmRhdG9yeS4gWW91IGNhbiBhbHNvIHBhc3MgYSBsaXN0IG9mIGNvbGxlY3Rpb25zIElEcyB3aXRoIHBhcmFtIGNvbGxlY3Rpb25faWRzIGFuZCB0aGUgY29sbGVjdGlvbnMgaWRzIHNlcGFyYXRlZCBieSBjb21hLiBZb3UgY2FuIHBhc3MgcGFyYW1zIGFuZCByZWN1cGVyYXRlIHRoZW0gdmlhIHskbWNtZWRpYXNfcGFyYW1zfTwvcD4KPGg0PlRodW1ibmFpbHM8L2g0Pgo8cD5UbyBjcmVhdGUgdGh1bWJuYWlscywgdXNlIHtNQ01lZGlhcyBhY3Rpb249InRodW1ibmFpbCIgd2lkdGg9MTUwIGhlaWdodD0xNTAgZmlsZT0kZmlsZS0+Z2V0UmVsYXRpdmVQYXRoKCl9IHdoaWNoIHdpbGwgY3JlYXRlIHRoZW0gaW4gdGhlIGNhY2hlIGRpcmVjdG9yeS48L3A+CjxwPllvdSBjYW4gYWxzbyB1c2UgYW55IHBpY3R1cmVzIGluc2lkZSB0aGUgL3VwbG9hZHMvIGRpcmVjdG9yeS4gWW91ciBmaWxlbmFtZSBzaG91bGQgYmVnaW4gd2l0aCAiL3VwbG9hZHMvIjwvcD4KPHA+WW91IGNhbiB1c2UgdGhlIHNob3J0ZXIgdmVyc2lvbjoge1RodW1ibmFpbH08L3A+CjxwPjx1Pk9wdGlvbnM8L3U+PC9wPgo8dWw+CiAgPGxpPndpZHRoPC9saT4KICA8bGk+aGVpZ2h0PC9saT4KICA8bGk+c2l6ZTogc2V0IGJvdGggd2lkdGggYW5kIGhlaWdodDwvbGk+CiAgPGxpPm1vZGUgKG9ubHkgImRlZmF1bHQiIGZvciB0aGUgbW9tZW50KTwvbGk+CjwvdWw+CjxoND5Db3ZlcjwvaDQ+CjxwPllvdSBjYW4gZ2V0IHRoZSB0aHVtYm5haWwgb2YgdGhlIGNvdmVyIG9mIGEgZmlsZSB3aXRoIHtNQ01lZGlhcyBhY3Rpb249InRodW1ibmFpbCIgd2lkdGg9MTUwIGhlaWdodD0xNTB9LiBJdCB1c2VzIHRoZSBzYW1lIHBhcmFtZXRlcnMgYXMgVGh1bWJuYWlscy48L3A+CjxoND5EaXJlY3QgdGh1bWJuYWlsaW5nPC9oND4KPHA+SWYgeW91IG5lZWQgdG8gZG8gYSAiZGlyZWN0IiB0aHVtYm5haWxpbmcsIHlvdSBjYW4gdXNlIHRoZSBVUkwgXCcvdGh1bWJuYWlsL3BhdGhfdG9feW91cl9maWxlLmV4dFwnIGRpcmVjdGx5IGluIHRoZSBTUkMgYXR0cmlidXRlIG9mIHlvdXIgaW1hZ2UuIFlvdSBjYW4gYWxzbyBhZGQgdGhlIGRlc2lyZSBzaXplczogXCcvdGh1bWJuYWlsLzE1MC9wYXRoX3RvX3lvdXJfZmlsZS5leHRcJyB3aWxsIGNyZWF0ZSBhIDE1MHgxNTAgdGh1bWJuYWlsLiBcJy90aHVtYm5haWwvMzAwLzIwMC9wYXRoX3RvX3lvdXJfZmlsZS5leHRcJyB3aWxsIGNyZWF0ZSBhIHRodW1ibmFpbCAzMDBweCB3aWR0aCBhbmQgMjAwcHggaGVpZ2h0LiBUaG9zZSB1cmwgd2lsbCBkaXJlY3RseSBkZWxpdmVycyB5b3UgdGhlIGltYWdlICh0aHJvdWdoIGEgcmVkaXJlY3Rpb24pLjwvcD4KPGg0PkRpdmVyczwvaDQ+CjxwPkxpc3Qgb2YgZnVuY3Rpb25zIG9uIGEgTUNGaWxlIGVudHJ5PC9wPgo8dWw+CiAgPGxpPmdldEZpbGVTaXplKCk8L2xpPgogIDxsaT5nZXRGaWxlRXh0ZW5zaW9uKCk8L2xpPgogIDxsaT5nZXRGaWxlSWNvbigpPC9saT4KPC91bD4KPGgzPlN1cHBvcnQ8L2gzPgo8cD5BcyBwZXIgdGhlIEdQTCwgdGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBhcy1pcy4gUGxlYXNlIHJlYWQgdGhlIHRleHQgb2YgdGhlIGxpY2Vuc2UgZm9yIHRoZSBmdWxsIGRpc2NsYWltZXIuPC9wPgo8aDM+Q29weXJpZ2h0IGFuZCBMaWNlbnNlPC9oMz4KPHA+Q29weXJpZ2h0ICZjb3B5OyAyMDEwLCBKZWFuLUNocmlzdG9waGUgQ3V2ZWxpZXIgPGEgaHJlZj0ibWFpbHRvOmpjY0Btb3JyaXMtY2hhcG1hbi5jb20iPiZsdDtqY2NAbW9ycmlzLWNoYXBtYW4uY29tJmd0OzwvYT4gLSBNb3JyaXMgJmFtcDsgQ2hhcG1hbi4gQWxsIFJpZ2h0cyBBcmUgUmVzZXJ2ZWQuPC9wPgo8cD5UaGlzIG1vZHVsZSBoYXMgYmVlbiByZWxlYXNlZCB1bmRlciB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMIj5HTlUgUHVibGljIExpY2Vuc2U8L2E+LiBZb3UgbXVzdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UgYmVmb3JlIHVzaW5nIHRoZSBtb2R1bGUuPC9wPicKKTs=]]></data>
	</file>
	<file>
	  <filename>/lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/.DS_Store</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[AAAAAUJ1ZDEAABAAAAAIAAAAEAAAAACGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAIAAAABAAAQAGNsYm9vbAEAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAADAGMAcwBzZHNjbGJvb2wBAAAAAgBqAHNkc2NsYm9vbAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAgLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAACAAAAABAAAAQAAAAAEAAACAAAAAAQAAAQAAAAABAAACAAAAAAEAAAQAAAAAAAAAAAEAABAAAAAAAQAAIAAAAAABAABAAAAAAAEAAIAAAAAAAQABAAAAAAABAAIAAAAAAAEABAAAAAAAAQAIAAAAAAABABAAAAAAAAEAIAAAAAAAAQBAAAAAAAABAIAAAAAAAAEBAAAAAAAAAQIAAAAAAAABBAAAAAAAAAEIAAAAAAAAARAAAAAAAAABIAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAEAsAAABFAAAAhgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBERTREIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAIAAAAGAAAAABAAAAwAAAAAAAAAABAAABAAAAAAEAAAIAAAAAAQAABAAAAAACAAAIAAAAGAAAAAAAAAAAAQAAIAAAAAABAABAAAAAAAEAAIAAAAAAAQABAAAAAAABAAIAAAAAAAEABAAAAAAAAQAIAAAAAAABABAAAAAAAAEAIAAAAAAAAQBAAAAAAAABAIAAAAAAAAEBAAAAAAAAAQIAAAAAAAABBAAAAAAAAAEIAAAAAAAAARAAAAAAAAABIAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==]]></data>
	</file>
	<file>
	  <filename>/lib/class.CMSFormInputFiles.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCiAgLyoKICAgIENNU0Zvcm0gSW5wdXQgRmlsZXMKICAgIAogICAgVGhpcyBjbGFzcyBpcyBkZXNpZ25lZCB0byBoYW5kbGUgbXVsdGlwbGUgZmlsZXMgc2NlbmFyaW8KICAqLwppZihjbGFzc19leGlzdHMoJ0NNU0Zvcm1JbnB1dEhpZGRlbicpKQp7CiAgY2xhc3MgQ01TRm9ybUlucHV0RmlsZXMgZXh0ZW5kcyBDTVNGb3JtSW5wdXRIaWRkZW4KICB7CiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0dXAoJGlkLCAkbmFtZSwgJiRmb3JtLCAkbW9kdWxlX25hbWUsICRzZXR0aW5ncyA9IGFycmF5KCkpCiAgICB7CiAgICAgIHBhcmVudDo6c2V0dXAoJGlkLCAkbmFtZSwgJGZvcm0sICRtb2R1bGVfbmFtZSwgJHNldHRpbmdzKTsKICAgICAgCiAgICAgICR0aGlzLT5zZXRTZXR0aW5nKCdkZWZhdWx0X3ZhbHVlJywgTUNGaWxlQ29sbGVjdGlvbjo6Y3JlYXRlVW5pcXVlQ29sbGVjdGlvbklkKCkpOwogICAgICAkdGhpcy0+c2V0U2V0dGluZygndXBsb2FkX2J1dHRvbl90ZXh0JywgJ1NlbGVjdCBmaWxlcyB0byB1cGxvYWQnKTsKICAgICAgCiAgICAgICR0aGlzLT5zZXRTZXR0aW5nKCdhZG1pbl9saXN0X2FjdGlvbicsICdhZG1pbkxpc3QnKTsKCgkJCSRmb3JtLT5zZXRNdWx0aXBhcnRGb3JtKCk7CgkJCQogICAgICByZXR1cm4gJHRoaXM7CiAgICB9CiAgICAKICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGN1dFVybCgkb3JpZ2luKQogICAgewogICAgICBsaXN0KCR1cmwsICRxdWVyeSkgPSBleHBsb2RlKCc/JywgJG9yaWdpbik7CiAgICAgIAogICAgICAkcCA9IGV4cGxvZGUoJyZhbXA7JywgJHF1ZXJ5KTsKICAgICAgJHBhcmFtcyA9IGFycmF5KCk7CiAgICAgIAogICAgICBmb3JlYWNoKCRwIGFzICR2YSkKICAgICAgewogICAgICAgIGxpc3QoJGssJHYpID0gZXhwbG9kZSgnPScsJHZhKTsKICAgICAgICAkcGFyYW1zWyRrXSA9ICR2OwogICAgICB9CiAgICAgIAogICAgICByZXR1cm4gYXJyYXkoJ2Jhc2UnID0+ICR1cmwsICdwYXJhbXMnID0+ICRwYXJhbXMpOwogICAgfQogICAgCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0SW5wdXQoKQogICAgeyAgICAgCiAgICAgICRpbnB1dCA9IHBhcmVudDo6Z2V0SW5wdXQoKTsKICAgICAgJGNvbGxlY3Rpb25faWQgPSAkdGhpcy0+Z2V0VmFsdWUoKTsKICAgICAgCiAgICAgICRtb2R1bGUgPSBjbXNfdXRpbHM6OmdldF9tb2R1bGUoJ01DTWVkaWFzJyk7CiAgICAgICRoZWFkZXIgPSAkbW9kdWxlLT5sb2FkSGVhZGVyKCk7CiAgICAgIC8vICR1cGxvYWRlciA9ICRtb2R1bGUtPkdldE1vZHVsZVVSTFBhdGgoKSAuICcvdXBsb2FkZXIucGhwJzsKICAgICAgCiAgICAgICR1cmwgPSBzZWxmOjpjdXRVcmwoJG1vZHVsZS0+Q3JlYXRlTGluaygkdGhpcy0+aWQsJ3VwbG9hZCcsJycsJycsYXJyYXkoJ2NvbGxlY3Rpb25faWQnID0+ICRjb2xsZWN0aW9uX2lkKSwgJycsIHRydWUpIC4gJyZhbXA7c3VwcHJlc3NvdXRwdXQ9MSZhbXA7c2hvd3RlbXBsYXRlPTAnKTsKICAgICAgCiAgICAgICRtb2R1bGUtPnNtYXJ0eS0+YXNzaWduKCdlZGl0Jywgc3RyX3JlcGxhY2UoJyZhbXA7JywnJicsICRtb2R1bGUtPkNyZWF0ZUxpbmsoJHRoaXMtPmlkLCdlZGl0VGl0bGUnLCcnLCcnLGFycmF5KCksICcnLCB0cnVlKSAuICcmYW1wO3N1cHByZXNzb3V0cHV0PTEmYW1wO3Nob3d0ZW1wbGF0ZT0wJykpOwogICAgICAKICAgICAgLy8gJGNvbmZpZyA9IGNtc191dGlsczo6Z2V0X2NvbmZpZygpOwogICAgICAKICAgICAgJGxpc3QgPSAkbW9kdWxlLT5FeGVjdXRlQWN0aW9uKCR0aGlzLT5nZXRTZXR0aW5nKCdhZG1pbl9saXN0X2FjdGlvbicpLCAkdGhpcy0+aWQsIGFycmF5KCdjb2xsZWN0aW9uX2lkJyA9PiAkY29sbGVjdGlvbl9pZCkpOwogICAgICAkbGlzdHVybCA9IHN0cl9yZXBsYWNlKCcmYW1wOycsICcmJywgJG1vZHVsZS0+Q3JlYXRlTGluaygkdGhpcy0+aWQsICR0aGlzLT5nZXRTZXR0aW5nKCdhZG1pbl9saXN0X2FjdGlvbicpLCAnJywgJycsIGFycmF5KCdjb2xsZWN0aW9uX2lkJyA9PiAkY29sbGVjdGlvbl9pZCksICcnLCB0cnVlKSAuICcmYW1wO3N1cHByZXNzb3V0cHV0PTEmYW1wO3Nob3d0ZW1wbGF0ZT0wJyk7CiAgICAgICAgCiAgICAgICRtb2R1bGUtPnNtYXJ0eS0+YXNzaWduKCdjb2xsZWN0aW9uX2lkJywgJGNvbGxlY3Rpb25faWQpOwogICAgICAkbW9kdWxlLT5zbWFydHktPmFzc2lnbignZW5kcG9pbnQnLCAkdXJsWydiYXNlJ10pOwogICAgICAkbW9kdWxlLT5zbWFydHktPmFzc2lnbignbGlzdHVybCcsICRsaXN0dXJsKTsKICAgICAgJG1vZHVsZS0+c21hcnR5LT5hc3NpZ24oJ3BhcmFtcycsIGpzb25fZW5jb2RlKCR1cmxbJ3BhcmFtcyddKSk7CiAgICAgICRtb2R1bGUtPnNtYXJ0eS0+YXNzaWduKCd1cGxvYWRCdXR0b25UZXh0JywgJHRoaXMtPmdldFNldHRpbmcoJ3VwbG9hZF9idXR0b25fdGV4dCcpKTsKICAgICAgJG1vZHVsZS0+c21hcnR5LT5hc3NpZ24oJ2Z1X3ZhbGlkYXRpb24nLCAkdGhpcy0+Z2V0U2V0dGluZygndmFsaWRhdGlvbicpKTsgICAgICAKICAgICAgJG1vZHVsZS0+c21hcnR5LT5hc3NpZ24oJ2lkJywgJHRoaXMtPmlkKTsKICAgICAgJGpzID0gJG1vZHVsZS0+UHJvY2Vzc1RlbXBsYXRlKCdsaXN0LmpzJyk7CiAgICAgICAgCiAgICAgICRodG1sID0gJGhlYWRlciAuICRsaXN0IC4gJwogICAgICAgPGRpdiBpZD0iZnVwbG9hZGVyXycuJGNvbGxlY3Rpb25faWQuJyI+PC9kaXY+CiAgICAgICA8c2NyaXB0PicuJGpzLic8L3NjcmlwdD4KICAgICAgJzsKICAgICAgCiAgICAgIC8vIHZhcl9kdW1wKCRjb25maWcpOwogICAgICAKICAgICAgcmV0dXJuICRpbnB1dCAuICRodG1sOwogICAgfQogIH0KfQ==]]></data>
	</file>
	<file>
	  <filename>/lib/class.CMSFormInputImages.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCiAgLyoKICAgIENNU0Zvcm0gSW5wdXQgSW1hZ2VzCiAgICAKICAgIFRoaXMgY2xhc3MgaXMgZGVzaWduZWQgdG8gaGFuZGxlIG11bHRpcGxlIGZpbGVzIHNjZW5hcmlvCiAgKi8KaWYoY2xhc3NfZXhpc3RzKCdDTVNGb3JtSW5wdXRGaWxlcycpKQp7CiAgY2xhc3MgQ01TRm9ybUlucHV0SW1hZ2VzIGV4dGVuZHMgQ01TRm9ybUlucHV0RmlsZXMKICB7CiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0dXAoJGlkLCAkbmFtZSwgJiRmb3JtLCAkbW9kdWxlX25hbWUsICRzZXR0aW5ncyA9IGFycmF5KCkpCiAgICB7CiAgICAgIHBhcmVudDo6c2V0dXAoJGlkLCAkbmFtZSwgJGZvcm0sICRtb2R1bGVfbmFtZSwgJHNldHRpbmdzKTsKICAgICAgCiAgICAgICR0aGlzLT5zZXRTZXR0aW5nKCd1cGxvYWRfYnV0dG9uX3RleHQnLCAnU2VsZWN0IGltYWdlcyB0byB1cGxvYWQnKTsKICAgICAgCiAgICAgICR0aGlzLT5zZXRTZXR0aW5nKCdhZG1pbl9saXN0X2FjdGlvbicsICdhZG1pblBpY3R1cmVMaXN0Jyk7CiAgICAgIAogICAgICAkdGhpcy0+c2V0U2V0dGluZygndmFsaWRhdGlvbicsICcKICAgICAgdmFsaWRhdGlvbjogewogICAgICAgICAgICAgIGFsbG93ZWRFeHRlbnNpb25zOiBbXCdqcGVnXCcsIFwnanBnXCcsIFwnZ2lmXCcsIFwncG5nXCddCiAgICAgICAgICAgICAgLy8gLHNpemVMaW1pdDogNTEyMDAgLy8gNTAga0IgPSA1MCAqIDEwMjQgYnl0ZXMKICAgICAgICAgICAgfSwnKTsKCiAgICAgIHJldHVybiAkdGhpczsKICAgIH0KICB9Cn0=]]></data>
	</file>
	<file>
	  <filename>/lib/class.MCFile.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKICAvKgogICAgQSBmaWxlIGJlbG9uZyB0byBhIGNvbGxlY3Rpb24KICAqLwogIGNsYXNzIE1DRmlsZQogIHsKICAgIHByb3RlY3RlZCAkaWQ7CiAgICBwcm90ZWN0ZWQgJGNvbGxlY3Rpb25faWQ7CiAgICAKICAgIHByb3RlY3RlZCAkcG9zaXRpb247CiAgICBwcm90ZWN0ZWQgJHRpdGxlOwogICAgCiAgICBwcm90ZWN0ZWQgJGZpbGVuYW1lOwogICAgcHJvdGVjdGVkICRvcmlnaW5hbF9maWxlbmFtZTsKICAgIAogICAgcHJvdGVjdGVkICRjcmVhdGVkX2F0OwogICAgcHJvdGVjdGVkICR1cGRhdGVkX2F0OwoKCQlwcm90ZWN0ZWQgJGxhc3RfZXJyb3I7CiAgICAKICAgIGNvbnN0IERCX05BTUUgPSAnbW9kdWxlX01DTWVkaWFzX2ZpbGVzJzsKICAgIAogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRjb2xsZWN0aW9uX2lkID0gJycpICB7CiAgICAgICR0aGlzLT5jb2xsZWN0aW9uX2lkID0gJGNvbGxlY3Rpb25faWQ7CiAgICB9CiAgICAKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRJZCgpewogICAgICByZXR1cm4gJHRoaXMtPmlkOwogICAgfQoKCQlwdWJsaWMgZnVuY3Rpb24gc2V0SWQoJGlkKXsKCQkJJHRoaXMtPmlkID0gJGlkOwoJCX0KICAgIAogICAgcHVibGljIGZ1bmN0aW9uIGdldFRpdGxlKCkgewogICAgICByZXR1cm4gJHRoaXMtPnRpdGxlOwogICAgfQogICAgCgkJcHVibGljIGZ1bmN0aW9uIGdldENvbGxlY3Rpb25JZCgpewoJCQlyZXR1cm4gJHRoaXMtPmNvbGxlY3Rpb25faWQ7CgkJfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRUaXRsZSgkdmFsdWUpIHsKICAgICAgJHRoaXMtPnRpdGxlID0gJHZhbHVlOwogICAgfQogICAgCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0UG9zaXRpb24oJHBvc2l0aW9uKSAgewogICAgICAkdGhpcy0+cG9zaXRpb24gPSAoaW50KSRwb3NpdGlvbjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0Q3JlYXRlZEF0KCRjcmVhdGVkX2F0KQl7CgkJCSR0aGlzLT5jcmVhdGVkX2F0ID0gJGNyZWF0ZWRfYXQ7CgkJfQoJCQoJCXB1YmxpYyBmdW5jdGlvbiBnZXRVcGRhdGVkQXQoKSB7CgkJCXJldHVybiAkdGhpcy0+dXBkYXRlZF9hdDsKCQl9CgkJCgkJcHVibGljIGZ1bmN0aW9uIHNldFVwZGF0ZWRBdCgkdXBkYXRlZF9hdCkgewoJCQkkdGhpcy0+dXBkYXRlZF9hdCA9ICR1cGRhdGVkX2F0OwoJCX0KCQkKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRPcmlnaW5hbEZpbGVuYW1lKCkgewogICAgICByZXR1cm4gJHRoaXMtPm9yaWdpbmFsX2ZpbGVuYW1lOwogICAgfQogICAgCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0RmlsZW5hbWUoKSB7CiAgICAgIC8vIHJldHVybiAkdGhpcy0+aWQgLiAnXycgLiAkdGhpcy0+ZmlsZW5hbWU7CiAgICAgIHJldHVybiAkdGhpcy0+ZmlsZW5hbWU7CiAgICB9CiAgICAKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRGaWxlcGF0aCgpIHsKICAgICAgcmV0dXJuIHNlbGY6OmdldFVwbG9hZFBhdGgoJHRoaXMtPmNvbGxlY3Rpb25faWQpIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICR0aGlzLT5nZXRGaWxlbmFtZSgpOwogICAgfQogICAgCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UmVsYXRpdmVQYXRoKCkgewogICAgICByZXR1cm4gJHRoaXMtPmNvbGxlY3Rpb25faWQgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJHRoaXMtPmdldEZpbGVuYW1lKCk7CiAgICB9CiAgICAKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRVcmwoKSAgewogICAgICAkY29uZmlnID0gY21zX3V0aWxzOjpnZXRfY29uZmlnKCk7CiAgICAgIHJldHVybiAkY29uZmlnWyd1cGxvYWRzX3VybCddIC4gJHRoaXMtPmdldFJlbGF0aXZlVXJsKCR0aGlzLT5jb2xsZWN0aW9uX2lkKTsKICAgICAgCiAgICB9CiAgICAKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBnZXRSZWxhdGl2ZVVybCgkdXJsX3BhdGggPSBudWxsKSB7CiAgICAgICR1cmwgPSBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJ01vZHVsZXMnIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICdNQ01lZGlhcyc7CiAgICAgIGlmKCFpc19udWxsKCR1cmxfcGF0aCkpICAkdXJsIC49IERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkdXJsX3BhdGg7CiAgICAgICR1cmwgLj0gRElSRUNUT1JZX1NFUEFSQVRPUiAuICR0aGlzLT5nZXRGaWxlbmFtZSgpOwogICAgICByZXR1cm4gc3RyX3JlcGxhY2UoRElSRUNUT1JZX1NFUEFSQVRPUiwgJy8nLCAkdXJsKTsKICAgIH0KICAgIAogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRVcGxvYWRQYXRoKCR0YWlsX3BhdGggPSBudWxsKSAgewogICAgICAkTUNNZWRpYXMgPSBjbXNfdXRpbHM6OmdldF9tb2R1bGUoJ01DTWVkaWFzJyk7CiAgICAgICRwYXRoID0gJE1DTWVkaWFzLT5HZXRQcmVmZXJlbmNlKCd1cGxvYWRzX3BhdGgnLCAkTUNNZWRpYXMtPmNvbmZpZ1sndXBsb2Fkc19wYXRoJ10pIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICdNb2R1bGVzJyAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAnTUNNZWRpYXMnOwogICAgICAKICAgICAgaWYoIWlzX251bGwoJHRhaWxfcGF0aCkpICAkcGF0aCAuPSBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJHRhaWxfcGF0aDsKICAgICAgaWYgKCFpc19kaXIoJHBhdGgpKXsKCQkJCSBpZighbWtkaXIoJHBhdGgsMDc3Nyx0cnVlKSkKCQkJCXsJCQkJCQoJCQkJCSR0aGlzLT5sYXN0X2Vycm9yID0gJ0ltcG9zc2libGUgdG8gY3JlYXRlIHRoZSBwYXRoICcgLiAkcGF0aDsKCQkJCQlyZXR1cm4gbnVsbDsKCQkJCX0KCQkJfQogICAgICAKICAgICAgcmV0dXJuICRwYXRoOwogICAgfQogICAgCiAgICBwdWJsaWMgZnVuY3Rpb24gc2F2ZVVwbG9hZGVkRmlsZSgkZmllbGRuYW1lKSAgewogICAgIAogICAgICAkdXBsb2FkZXIgPSBuZXcgcXFGaWxlVXBsb2FkZXIoKTsKCgkJCSRwYXRoID0gc2VsZjo6Z2V0VXBsb2FkUGF0aCgkdGhpcy0+Y29sbGVjdGlvbl9pZCk7CgkJCQoJCQlpZihpc19udWxsKCRwYXRoKSkKCQkJewoJCQkJcmV0dXJuIGpzb25fZW5jb2RlKGFycmF5KCdzdWNjZXNzJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnSW1wb3NzaWJsZSB0byBjcmVhdGUgcGF0aCBmb3IgJyAuICR0aGlzLT5jb2xsZWN0aW9uX2lkIC4gJyB3aXRoIGVycm9yICcgLiAkdGhpcy0+bGFzdF9lcnJvciwgJ3ByZXZlbnRSZXRyeScgPT4gdHJ1ZSkpOwoJCQl9CgkJCQogICAgICAvLyBDYWxsIGhhbmRsZVVwbG9hZCgpIHdpdGggdGhlIG5hbWUgb2YgdGhlIGZvbGRlciwgcmVsYXRpdmUgdG8gUEhQJ3MgZ2V0Y3dkKCkKICAgICAgJHJlc3VsdCA9ICR1cGxvYWRlci0+aGFuZGxlVXBsb2FkKCRwYXRoLCAgc2VsZjo6Y2xlYW5GaWxlbmFtZSgkX0ZJTEVTWyRmaWVsZG5hbWVdWyduYW1lJ10pKTsKCiAgICAgIGlmKGlzc2V0KCRyZXN1bHRbJ3N1Y2Nlc3MnXSkpCiAgICAgIHsKICAgICAgICAkdGhpcy0+b3JpZ2luYWxfZmlsZW5hbWUgPSAkdXBsb2FkZXItPmdldE5hbWUoKTsKICAgICAgICAkdGhpcy0+ZmlsZW5hbWUgPSAkdXBsb2FkZXItPmdldFVwbG9hZE5hbWUoKTsKICAgICAgICAvLyAkdGhpcy0+ZmlsZW5hbWUgPSBzZWxmOjpjbGVhbkZpbGVuYW1lKCRfRklMRVNbJGZpZWxkbmFtZV1bJ25hbWUnXSk7CiAgICAgICAgCiAgICAgICAgJHRoaXMtPnNhdmUoKTsKICAgICAgICAKICAgICAgICAvLyBtb3ZlX3VwbG9hZGVkX2ZpbGUoJF9GSUxFU1skZmllbGRuYW1lXVsndG1wX25hbWUnXSwgJHRoaXMtPmdldEZpbGVwYXRoKCkpOwogICAgICAgIAogICAgICAgIC8vIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIAogICAgICAvLyByZXR1cm4ganNvbl9lbmNvZGUoYXJyYXkoJ2Vycm9yJyA9PiAnY29sbGVjdGlvbl9pZCAnIC4gJHRoaXMtPmNvbGxlY3Rpb25faWQpKTsKCiAgICAgIC8vIHRvIHBhc3MgZGF0YSB0aHJvdWdoIGlmcmFtZSB5b3Ugd2lsbCBuZWVkIHRvIGVuY29kZSBhbGwgaHRtbCB0YWdzCiAgICAgIHJldHVybiBodG1sc3BlY2lhbGNoYXJzKGpzb25fZW5jb2RlKCRyZXN1bHQpLCBFTlRfTk9RVU9URVMpOwoKICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgIH0KCgkJcHVibGljIGZ1bmN0aW9uIHVwbG9hZEZyb21Mb2NhbCgkZmlsZSwgJG1vdmUgPSB0cnVlKQl7CgkJCWlmKGlzX2ZpbGUoJGZpbGUpKQoJCQl7CgkJCQkkcGF0aCA9IHNlbGY6OmdldFVwbG9hZFBhdGgoJHRoaXMtPmNvbGxlY3Rpb25faWQpOwoJCQkJCgkJCQkkZmlsZW5hbWUgPSBlbmQoZXhwbG9kZShESVJFQ1RPUllfU0VQQVJBVE9SLCAkZmlsZSkpOwoJCQkJCgkJCQkkdGhpcy0+b3JpZ2luYWxfZmlsZW5hbWUgPSAkZmlsZW5hbWU7CgkJCQkkdGhpcy0+ZmlsZW5hbWUgPSAkdGhpcy0+Z2V0TmV4dEF2YWlsYWJsZUZpbGVuYW1lKHNlbGY6OmNsZWFuRmlsZW5hbWUoJGZpbGVuYW1lKSk7CgkJCQkKCQkJCWlmKCRtb3ZlKQoJCQkJewoJCQkJCS8vIHZhcl9kdW1wKCR0aGlzLT5maWxlbmFtZSk7CgkJCQkJLy8gdmFyX2R1bXAoJHRoaXMtPm9yaWdpbmFsX2ZpbGVuYW1lKTsJCQkJCQoJCQkJCXJlbmFtZSgkZmlsZSwgJHBhdGggLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJHRoaXMtPmZpbGVuYW1lKTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQljb3B5KCRmaWxlLCAkcGF0aCAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkdGhpcy0+ZmlsZW5hbWUpOwoJCQkJfQoJCQkJCgkJCX0KCQl9CiAgICAKCQlwdWJsaWMgZnVuY3Rpb24gdXBsb2FkRnJvbVVybCgkdXJsLCAkb3JpZ2luYWxfZmlsZW5hbWUgPSAnJywgJGZpbGVuYW1lID0gJycpewoJCQkKCQkJJGxvY2FsX3BhdGggPSBzZWxmOjpnZXRVcGxvYWRQYXRoKCR0aGlzLT5jb2xsZWN0aW9uX2lkKTsKCQkJCgkJCWlmKCRmaWxlbmFtZSAhPSAnJykKCQkJewoJCQkJJHRoaXMtPmZpbGVuYW1lID0gJGZpbGVuYW1lOwoJCQkJJHRoaXMtPm9yaWdpbmFsX2ZpbGVuYW1lID0gJG9yaWdpbmFsX2ZpbGVuYW1lOwoJCQkJCgkJCQkkaW1hZ2UgPSBmaWxlX2dldF9jb250ZW50cygkdXJsKTsKCQkJCWlmKCRpbWFnZSAhPT0gRkFMU0UpCgkJCQl7CgkJCQkJZmlsZV9wdXRfY29udGVudHMoJGxvY2FsX3BhdGggLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJGZpbGVuYW1lLCAkaW1hZ2UpOwoJCQkJfQoJCQl9CgkJfQoJCQogICAgcHVibGljIGZ1bmN0aW9uIGRvd25sb2FkUmVtb3RlRmlsZSgkdXJsKSAgewogICAgICAkcGF0aCA9IHNlbGY6OmdldFVwbG9hZFBhdGgoJHRoaXMtPmNvbGxlY3Rpb25faWQpOwogICAgICAKICAgICAgY29weSgkdXJsLCAkcGF0aCAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkdGhpcy0+ZmlsZW5hbWUpOyAgICAgIAogICAgfQoKCQlwdWJsaWMgZnVuY3Rpb24gZ2V0TmV4dEF2YWlsYWJsZUZpbGVuYW1lKCRmaWxlbmFtZSwgJHByZWZpeCA9IG51bGwpCXsKCQkJJGxvY2FsX3BhdGggPSBzZWxmOjpnZXRVcGxvYWRQYXRoKCR0aGlzLT5jb2xsZWN0aW9uX2lkKTsKCQkJCgkJCWlmKGlzX2ZpbGUoJGxvY2FsX3BhdGggLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJHByZWZpeCAuICRmaWxlbmFtZSkpCgkJCXsKCQkJCWlmKGlzX251bGwoJHByZWZpeCkpIAoJCQkJewoJCQkJCSRwcmVmaXggPSAxOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCSRwcmVmaXgrKzsKCQkJCX0KCQkJCXJldHVybiAkdGhpcy0+Z2V0TmV4dEF2YWlsYWJsZUZpbGVuYW1lKCRmaWxlbmFtZSwgJHByZWZpeCk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlyZXR1cm4gJHByZWZpeCAuICRmaWxlbmFtZTsKCQkJfQoJCQkKCQl9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRTeXN0ZW1TaXplTGltaXQoKSB7CiAgICAgICRtYXhzaXplID0gaW5pX2dldCgncG9zdF9tYXhfc2l6ZScpOwogICAgICAkYmFzZSA9IDE7CiAgICAgIGlmKHN0cnBvcygkbWF4c2l6ZSwgJ00nKSkKICAgICAgewogICAgICAgICRiYXNlID0gJGJhc2UgKiAxMDI0ICogMTAyNDsKICAgICAgICAkbWF4c2l6ZSA9IHN0cl9yZXBsYWNlKCdNJywgJycsICRtYXhzaXplKTsKICAgICAgfQogICAgICAKICAgICAgcmV0dXJuICRiYXNlICogJG1heHNpemU7CiAgICB9CiAgICAKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2xlYW5GaWxlbmFtZSgkZmlsZW5hbWUpICB7CiAgICAgICAgJHJlc3VsdCA9IHN0cnRvbG93ZXIoJGZpbGVuYW1lKTsKICAgICAgICAvLyBSZW1vdmUgYWNjZW50cwogICAgICAgICRyZXN1bHQgPSBzdHJ0cigkcmVzdWx0LCAgIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vSIsICAiYWFhYWFhYWFhYWFhb29vb29vb29vb29vZWVlZWVlZWVjY2lpaWlpaWlpdXV1dXV1dXV5bm4iKTsKCiAgICAgICAgLy8gU29mdCB3YXkKICAgICAgICAkcmVzdWx0ID0gc3RyX3JlcGxhY2UoIiMiLCAiTm8uIiwgJHJlc3VsdCk7IAogICAgICAgICRyZXN1bHQgPSBzdHJfcmVwbGFjZSgiJCIsICJEb2xsYXIiLCAkcmVzdWx0KTsgCiAgICAgICAgJHJlc3VsdCA9IHN0cl9yZXBsYWNlKCIlIiwgIlBlcmNlbnQiLCAkcmVzdWx0KTsgCiAgICAgICAgJHJlc3VsdCA9IHN0cl9yZXBsYWNlKCJeIiwgIiAiLCAkcmVzdWx0KTsgCiAgICAgICAgJHJlc3VsdCA9IHN0cl9yZXBsYWNlKCImIiwgImFuZCIsICRyZXN1bHQpOyAKICAgICAgICAkcmVzdWx0ID0gc3RyX3JlcGxhY2UoIioiLCAiICIsICRyZXN1bHQpOyAKICAgICAgICAkcmVzdWx0ID0gc3RyX3JlcGxhY2UoIj8iLCAiICIsICRyZXN1bHQpOwogICAgICAgICRyZXN1bHQgPSBzdHJfcmVwbGFjZSgiLCIsICIgIiwgJHJlc3VsdCk7CgogICAgICAgIC8vIHN0cmlwIGFsbCBub24gd29yZCBjaGFycwogICAgICAgIC8vJHJlc3VsdCA9IHByZWdfcmVwbGFjZSgnL1xXLycsICcgJywgJHJlc3VsdCk7IC8vIEhBUkQgV0FZLi4uCgogICAgICAgIC8vIHJlcGxhY2UgYWxsIHdoaXRlIHNwYWNlIHNlY3Rpb25zIHdpdGggYSBkYXNoCiAgICAgICAgJHJlc3VsdCA9IHByZWdfcmVwbGFjZSgnL1wgKy8nLCAnLScsICRyZXN1bHQpOwogICAgICAgIC8vIHRyaW0gZGFzaGVzCiAgICAgICAgJHJlc3VsdCA9IHByZWdfcmVwbGFjZSgnL1wtJC8nLCAnJywgJHJlc3VsdCk7CiAgICAgICAgJHJlc3VsdCA9IHByZWdfcmVwbGFjZSgnL15cLS8nLCAnJywgJHJlc3VsdCk7CiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9CiAgICAKICAgIC8vIEZJTEUgUFJPQ0VTU0lORwoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRGaWxlU2l6ZSgkcmVhZGFibGUgPSBmYWxzZSkgIHsKICAgICAgJGZpbGUgPSAkdGhpcy0+Z2V0RmlsZXBhdGgoKTsKICAgICAgaWYgKGlzX2ZpbGUoJGZpbGUpKSB7CiAgICAgICAgJHNpemUgPSBmaWxlc2l6ZSgkZmlsZSk7CgogICAgICAgIGlmICgkcmVhZGFibGUpCiAgICAgICAgewogICAgICAgICAgcmV0dXJuIHNlbGY6OnNpemVfcmVhZGFibGUoJHNpemUpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgcmV0dXJuICRzaXplOwogICAgICAgIH0KICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfQogICAgCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNpemVfcmVhZGFibGUgKCRzaXplLCAkcmV0c3RyaW5nID0gbnVsbCkgewogICAgICAkc2l6ZXMgPSBhcnJheSgnQicsICdrQicsICdNQicsICdHQicsICdUQicsICdQQicsICdFQicsICdaQicsICdZQicpOwoKICAgICAgaWYgKCRyZXRzdHJpbmcgPT09IG51bGwpIHsgJHJldHN0cmluZyA9ICclMDEuMmYgJXMnOyB9CgogICAgICAkbGFzdHNpemVzdHJpbmcgPSBlbmQoJHNpemVzKTsKCiAgICAgIGZvcmVhY2ggKCRzaXplcyBhcyAkc2l6ZXN0cmluZykgewogICAgICAgIGlmICgkc2l6ZSA8IDEwMjQpIHsgYnJlYWs7IH0KICAgICAgICBpZiAoJHNpemVzdHJpbmcgIT0gJGxhc3RzaXplc3RyaW5nKSB7ICRzaXplIC89IDEwMjQ7IH0KICAgICAgfQoKICAgICAgaWYgKCRzaXplc3RyaW5nID09ICRzaXplc1swXSkgeyAkcmV0c3RyaW5nID0gJyUwMWQgJXMnOyB9IC8vIEJ5dGVzIGFyZW4ndCBub3JtYWxseSBmcmFjdGlvbmFsCgogICAgICByZXR1cm4gc3ByaW50ZigkcmV0c3RyaW5nLCAkc2l6ZSwgJHNpemVzdHJpbmcpOwogICAgfQogICAgCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0RmlsZUV4dGVuc2lvbigpICB7CiAgICAgICRmaWxlID0gZXhwbG9kZSgnLicsICR0aGlzLT5nZXRGaWxlbmFtZSgpKTsKICAgICAgaWYgKGNvdW50KCRmaWxlKSA+IDEpCiAgICAgIHsKICAgICAgICByZXR1cm4gZW5kKCRmaWxlKTsKICAgICAgfQogICAgICBlbHNlIAogICAgICB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgIH0KICAgIAogICAgcHVibGljIGZ1bmN0aW9uIGdldEZpbGVJY29uKCRpY29uX3R5cGUgPSAnc21hbGwnKSB7CiAgICAgICRmaWxlID0gJHRoaXMtPmdldEZpbGVwYXRoKCk7CiAgICAgICRtb2R1bGUgPSBjbXNfdXRpbHM6OmdldF9tb2R1bGUoJ01DTWVkaWFzJyk7CiAgICAgICRpY29uID0gJG1vZHVsZS0+R2V0TW9kdWxlVVJMUGF0aCgpIC4gJy9pbWFnZXMvaWNvbnMvJy4kaWNvbl90eXBlLicvJzsgIAoKICAgICAgc3dpdGNoIChzdHJ0b2xvd2VyKHNlbGY6OmdldEZpbGVFeHRlbnNpb24oJGZpbGUpKSkgIHsKICAgICAgICBjYXNlICdwZGYnOgogICAgICAgICAgJGljb24gLj0gJ3BkZi5naWYnOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnanMnOgogICAgICAgICAgJGljb24gLj0gJ2pzLmdpZic7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdlcHMnOgogICAgICAgICAgJGljb24gLj0gJ2Vwcy5naWYnOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAncGhwJzoKICAgICAgICAgICRpY29uIC49ICdwaHAuZ2lmJzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3Jhcic6CiAgICAgICAgICAkaWNvbiAuPSAncmFyLmdpZic7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdkb2MnOgogICAgICAgICAgJGljb24gLj0gJ2RvYy5naWYnOwogICAgICAgICAgYnJlYWs7ICAgICAgICAgICAKICAgICAgICBjYXNlICdkb2N4JzoKICAgICAgICAgICRpY29uIC49ICdkb2MuZ2lmJzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3J0Zic6CiAgICAgICAgICAkaWNvbiAuPSAncnRmLmdpZic7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdnaWYnOgogICAgICAgICAgJGljb24gLj0gJ2dpZi5naWYnOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAndHh0JzoKICAgICAgICAgICRpY29uIC49ICd0eHQuZ2lmJzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3hscyc6CiAgICAgICAgICAkaWNvbiAuPSAneGxzLmdpZic7CiAgICAgICAgICBicmVhazsgICAgICAgICAgICAKICAgICAgICBjYXNlICd4bHN4JzoKICAgICAgICAgICRpY29uIC49ICd4bHMuZ2lmJzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3BwdCc6CiAgICAgICAgICAkaWNvbiAuPSAncHB0LmdpZic7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdwcHMnOgogICAgICAgICAJJGljb24gLj0gJ3BwdC5naWYnOwogICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgCiAgICAgICAgY2FzZSAncHB0eCc6CiAgICAgICAgICAkaWNvbiAuPSAncHB0LmdpZic7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdqcGcnOgogICAgICAgICAgJGljb24gLj0gJ2pwZy5naWYnOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnYm1wJzoKICAgICAgICAgICRpY29uIC49ICdibXAuZ2lmJzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2h0bWwnOgogICAgICAgICAgJGljb24gLj0gJ2h0bWwuZ2lmJzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2h0bSc6CiAgICAgICAgICAkaWNvbiAuPSAnaHRtbC5naWYnOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnbW92JzoKICAgICAgICAgICRpY29uIC49ICdtb3YuZ2lmJzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3ppcCc6CiAgICAgICAgICAkaWNvbiAuPSAnemlwLmdpZic7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgJGljb24gLj0gJ2RlZi5naWYnOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KCiAgICAgIHJldHVybiAkaWNvbjsKICAgIH0KICAgIAogICAgLy8gSU1BR0UgUFJPQ0VTU0lORwogICAgCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdlbmVyYXRlVGh1bWJuYWlsRmlsZW5hbWUoJGZpbGVuYW1lLCRwYXJhbXM9YXJyYXkoKSkgewogICAgICAKICAgICAgJGZpbGUgPSAnVGh1bWJuYWlsJzsKICAgICAgCiAgICAgICRmaWxlbmFtZSA9IHN0cl9yZXBsYWNlKCcuLicsICcnLCAkZmlsZW5hbWUpOwogICAgICAkZmlsZW5hbWUgPSBzdHJfcmVwbGFjZSgnICcsICcnLCAkZmlsZW5hbWUpOwogICAgICAkZmlsZW5hbWUgPSBzdHJfcmVwbGFjZSgnOycsICcnLCAkZmlsZW5hbWUpOwogICAgICAkZmlsZW5hbWUgPSBzdHJfcmVwbGFjZShESVJFQ1RPUllfU0VQQVJBVE9SLCAnXycsICRmaWxlbmFtZSk7CiAgICAgICRmaWxlbmFtZSA9IHN0cl9yZXBsYWNlKCcvJywgJ18nLCAkZmlsZW5hbWUpOwogICAgICAKICAgICAgaWYoaXNzZXQoJHBhcmFtc1snd2lkdGgnXSkpICRmaWxlIC49ICdfdycgLiAoaW50KSAkcGFyYW1zWyd3aWR0aCddOwogICAgICBpZihpc3NldCgkcGFyYW1zWydoZWlnaHQnXSkpICRmaWxlIC49ICdfaCcgLiAoaW50KSAkcGFyYW1zWydoZWlnaHQnXTsKICAgICAgaWYoaXNzZXQoJHBhcmFtc1snbW9kZSddKSkgJGZpbGUgLj0gJ19tXycgLiAoc3RyaW5nKSBzdHJfcmVwbGFjZShESVJFQ1RPUllfU0VQQVJBVE9SLCAnXycsICRwYXJhbXNbJ21vZGUnXSk7CiAgICAgIAogICAgICAkZmlsZSAuPSAnXycgLiAkZmlsZW5hbWU7CiAgICAgIHJldHVybiAkZmlsZTsKICAgIH0KICAgIAogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZW5lcmF0ZVRodW1ibmFpbCgkb3JpZ2luLCAkZGVzdGluYXRpb24sICRwYXJhbXMgPSBhcnJheSgpKSAgewogICAgICBpZihpc19maWxlKCRvcmlnaW4pKQogICAgICB7CiAgICAgICAgaWYoIWlzc2V0KCRwYXJhbXNbJ21vZGUnXSkpICRwYXJhbXNbJ21vZGUnXSA9ICdkZWZhdWx0JzsKICAgICAgICBpZighaXNzZXQoJHBhcmFtc1snd2lkdGgnXSkpICRwYXJhbXNbJ3dpZHRoJ10gPSAnMTAwJzsKICAgICAgICBpZighaXNzZXQoJHBhcmFtc1snaGVpZ2h0J10pKSAkcGFyYW1zWydoZWlnaHQnXSA9ICcxMDAnOwogICAgICAgIAogICAgICAgICRpbWFnZSA9IHNlbGY6OnJlc2l6ZUltYWdlKCRvcmlnaW4sICRwYXJhbXNbJ21vZGUnXSwgJHBhcmFtc1snd2lkdGgnXSwgJHBhcmFtc1snaGVpZ2h0J10pOwogICAgICAgIAogICAgICAgIGlmKCRpbWFnZSkKICAgICAgICB7CiAgICAgICAgICBpbWFnZWpwZWcoJGltYWdlLCAkZGVzdGluYXRpb24sIDEwMCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAKICAgIHByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gcmVzaXplSW1hZ2UoJGltYWdlLCAkbW9kZSwgJHdpZHRoLCAkaGVpZ2h0KSB7CiAgICAgIHN3aXRjaCgkbW9kZSkKICAgICAgewogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAvLyBEZWZhdWx0ID0gRG93bnNjYWxlICsgUHJlc2VydmUKICAgICAgICAgIHJldHVybiBzZWxmOjpkb3duc2NhbGUoJGltYWdlLCR3aWR0aCwkaGVpZ2h0LHRydWUpOwogICAgICB9CiAgICAgIAogICAgICAvLyBTSE9VTEQgQUREOgogICAgICAvLyBDUk9QOiBVUFNDQUxFIC0gUE9TSVRJT04gLSBDUk9QCiAgICAgIC8vIFVQU0NBTEU6IElNQUdFIEZJTEwgU1BBQ0UKICAgICAgLy8gRE9XTlNDQUxFOiBJTUFHRSBGSVQgU1BBQ0UgKHNtYWxsZXIgYXJlIG1hZGUgYmlnZ2VyKQogICAgfQogICAgCiAgICBwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGRvd25zY2FsZSgkaW1hZ2UsICR3aWR0aCwgJGhlaWdodCwgJHByZXNlcnZlID0gZmFsc2UpIHsKICAgICAgbGlzdCgkY3VycmVudF93aWR0aCwgJGN1cnJlbnRfaGVpZ2h0KSA9IGdldGltYWdlc2l6ZSgkaW1hZ2UpOyAgICAgIAogICAgICAKICAgICAgJG5ld19pbWFnZSA9IHNlbGY6OmNyZWF0ZUltYWdlKCRpbWFnZSk7CiAgICAgIAogICAgICAkcmF0aW9fb3JpZyA9ICRjdXJyZW50X3dpZHRoLyRjdXJyZW50X2hlaWdodDsKICAgICAgICAgICAgCiAgICAgIGlmKCgkY3VycmVudF9oZWlnaHQgPiAkaGVpZ2h0KSB8fCAoJGN1cnJlbnRfd2lkdGggPiAkd2lkdGgpKQogICAgICB7CiAgICAgICAgLy8gZWNobyAiVG9vIGJpZzogJGN1cnJlbnRfd2lkdGggLyAkd2lkdGggYW5kICRjdXJyZW50X2hlaWdodCAvICRoZWlnaHQiOwogICAgICAgIC8vIENIT09TRSBUSEUgQkVTVCBSQVRJTwogICAgICAgIGlmICgkd2lkdGgvJGhlaWdodCA+ICRyYXRpb19vcmlnKQogICAgICAgICB7CiAgICAgICAgICAgICAkd2lkdGggPSByb3VuZCgkaGVpZ2h0KiRyYXRpb19vcmlnKTsKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKICAgICAgICAgICAgICRoZWlnaHQgPSByb3VuZCgkd2lkdGgvJHJhdGlvX29yaWcpOwogICAgICAgICB9ICAgICAgICAgCiAgICAgICAgIC8vIGVjaG8gIjxiciAvPiBSZXNpemUgdG86ICAkd2lkdGggYW5kICRoZWlnaHQiOwogICAgICB9CiAgICAgIGVsc2VpZigkcHJlc2VydmUpCiAgICAgIHsKICAgICAgICAgLy8gZWNobyAiUHJlc2VydmU6ICRjdXJyZW50X3dpZHRoIC8gJHdpZHRoIGFuZCAkY3VycmVudF9oZWlnaHQgLyAkaGVpZ2h0IjsKICAgICAgICAvLyBCb3RoIGFyZSBzbWFsbGVyIG9yIGVxdWFsIGJ1dCB3ZSB3YW50IHRvIHByZXNlcnZlIHNpemUKICAgICAgICByZXR1cm4gJG5ld19pbWFnZTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICAvLyBUTyBGSVg6IFNob3VsZCB1cHNjYWxlCiAgICAgICAgcmV0dXJuICRuZXdfaW1hZ2U7CiAgICAgIH0KCiAgICAgIAogICAgICAkYmxhbmtfaW1hZ2UgPSBpbWFnZWNyZWF0ZXRydWVjb2xvcigkd2lkdGgsICRoZWlnaHQpOwogICAgICBpZihpbWFnZWNvcHlyZXNhbXBsZWQoJGJsYW5rX2ltYWdlLCAkbmV3X2ltYWdlLCAwLCAwLCAwLCAwLCAkd2lkdGgsICRoZWlnaHQsICRjdXJyZW50X3dpZHRoLCAkY3VycmVudF9oZWlnaHQpKSB7CiAgICAgICAgcmV0dXJuICRibGFua19pbWFnZTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICAvLyBBTiBFUlJPUiBPQ0NVUkVECiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICAKICAgIHByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlSW1hZ2UoJGltYWdlKSB7CiAgICAgICAgc3dpdGNoKGV4aWZfaW1hZ2V0eXBlKCRpbWFnZSkpCiAgICAgICAgewogICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAkc3JjaW1nID0gaW1hZ2VjcmVhdGVmcm9tZ2lmKCRpbWFnZSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgJHNyY2ltZyA9IGltYWdlY3JlYXRlZnJvbWpwZWcoJGltYWdlKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAkc3JjaW1nID0gaW1hZ2VjcmVhdGVmcm9tcG5nKCRpbWFnZSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkc3JjaW1nOwogICAgfQogICAgLy8gREFUQUJBU0UKICAgIAogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXRyaWV2ZUJ5UGsoJGlkKSAgewogICAgICByZXR1cm4gc2VsZjo6ZG9TZWxlY3RPbmUoYXJyYXkoJ3doZXJlJyA9PiBhcnJheSgnaWQnID0+IChpbnQpJGlkKSkpOwogICAgfQogICAgCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGRvU2VsZWN0T25lKCRwYXJhbXMgPSBhcnJheSgpKSB7CiAgICAgICRwYXJhbXNbJ2xpbWl0J10gPSAxOwogIAkJJGl0ZW1zID0gc2VsZjo6ZG9TZWxlY3QoJHBhcmFtcyk7CiAgCQlpZiAoJGl0ZW1zKQogIAkJewogIAkJCXJldHVybiBjdXJyZW50KCRpdGVtcyk7CiAgCQl9CiAgCQllbHNlIAogIAkJewogIAkJCXJldHVybiBudWxsOwogIAkJfQogICAgfQogICAgCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGRvU2VsZWN0KCRwYXJhbXMgPSBhcnJheSgpKXsKICAgICAgCiAgICAgICRxdWVyeSA9ICdTRUxFQ1QgKiBGUk9NICcuY21zX2RiX3ByZWZpeCgpLnNlbGY6OkRCX05BTUU7CiAgICAgIAogICAgICAkdmFsdWVzID0gYXJyYXkoKTsKICAgICAgCiAgICAgIGlmKGlzc2V0KCRwYXJhbXNbJ3doZXJlJ10pICYmIGlzX2FycmF5KCRwYXJhbXNbJ3doZXJlJ10pKQogICAgICB7CiAgICAgICAgJGZpZWxkcyA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaCgkcGFyYW1zWyd3aGVyZSddIGFzICRmaWVsZCA9PiAkdmFsdWUpCiAgICAgICAgewogICAgICAgICAgJGZpZWxkc1tdID0gJGZpZWxkIC4gJz0gPyc7CiAgICAgICAgICAkdmFsdWVzW10gPSAkdmFsdWU7CiAgICAgICAgfQogICAgICAgICRxdWVyeSAuPSAnIFdIRVJFICcgLiBpbXBsb2RlKCcgQU5EICcsICRmaWVsZHMpOwogICAgICB9CiAgICAgIAogICAgICBpZihpc3NldCgkcGFyYW1zWydvcmRlcl9ieSddKSkKICAgICAgewogICAgICAgJHF1ZXJ5IC49ICcgT1JERVIgQlkgJyAuIGltcGxvZGUoJywgJyAsICRwYXJhbXNbJ29yZGVyX2J5J10pOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgICRxdWVyeSAuPSAnIE9SREVSIEJZIHBvc2l0aW9uJzsKICAgICAgfQogICAgICAKICAgICAgaWYoaXNzZXQoJHBhcmFtc1snbGltaXQnXSkpCiAgICAgIHsKICAgICAgICAkcXVlcnkgLj0gJyBMSU1JVCAnIC4gKGludCkkcGFyYW1zWydsaW1pdCddOwogICAgICB9CiAgICAgIAogICAgICAkZGIgPSBjbXNfdXRpbHM6OmdldF9kYigpOwogICAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoJHF1ZXJ5LCAkdmFsdWVzKTsKICAgICAgJGl0ZW1zID0gYXJyYXkoKTsKCiAgICAgIGlmICgkZGJyZXN1bHQgJiYgJGRicmVzdWx0LT5SZWNvcmRDb3VudCgpID4gMCkKICAgICAgIHsKICAgICAgICAgd2hpbGUgKCRkYnJlc3VsdCAmJiAkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpKQogICAgICAgICB7CQogICAgICAgICAgICRpdGVtID0gbmV3IE1DRmlsZSgpOwogICAgICAgICAgICRpdGVtLT5wb3B1bGF0ZSgkcm93KTsKICAgICAgICAgICBpZihpc3NldCgkcGFyYW1zWyd3aXRoX2lkJ10pKQogICAgICAgICAgIHsKICAgICAgICAgICAgICRpdGVtc1skcm93WydpZCddXSA9ICRpdGVtOwogICAgICAgICAgIH0KICAgICAgICAgICBlbHNlCiAgICAgICAgICAgewogICAgICAgICAgICAgJGl0ZW1zW10gPSAkaXRlbTsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0KCiAgICAgICByZXR1cm4gICRpdGVtczsKICAgIH0KICAgIAogICAgcHVibGljIGZ1bmN0aW9uIHBvcHVsYXRlKCRyb3cpICB7CiAgICAgICR0aGlzLT5pZCA9ICRyb3dbJ2lkJ107CiAgICAgIAogICAgICAkdGhpcy0+Y3JlYXRlZF9hdCA9ICRyb3dbJ2NyZWF0ZWRfYXQnXTsKICAgICAgJHRoaXMtPnVwZGF0ZWRfYXQgPSAkcm93Wyd1cGRhdGVkX2F0J107CiAgICAgIAogICAgICAkdGhpcy0+Y29sbGVjdGlvbl9pZCA9ICRyb3dbJ2NvbGxlY3Rpb25faWQnXTsKICAgICAgJHRoaXMtPnBvc2l0aW9uID0gJHJvd1sncG9zaXRpb24nXTsKICAgICAgJHRoaXMtPnRpdGxlID0gJHJvd1sndGl0bGUnXTsKICAgICAgJHRoaXMtPmZpbGVuYW1lID0gJHJvd1snZmlsZW5hbWUnXTsKICAgICAgJHRoaXMtPm9yaWdpbmFsX2ZpbGVuYW1lID0gJHJvd1snb3JpZ2luYWxfZmlsZW5hbWUnXTsKICAgIH0KICAgIAogICAgcHVibGljIGZ1bmN0aW9uIHRvQXJyYXkoKSB7CiAgICAgIHJldHVybiBhcnJheSgKICAgICAgICAnaWQnID0+ICR0aGlzLT5pZCwKICAgICAgICAnY3JlYXRlZF9hdCcgPT4gJHRoaXMtPmNyZWF0ZWRfYXQsCiAgICAgICAgJ3VwZGF0ZWRfYXQnID0+ICR0aGlzLT51cGRhdGVkX2F0LAogICAgICAgICdjb2xsZWN0aW9uX2lkJyA9PiAkdGhpcy0+Y29sbGVjdGlvbl9pZCwKICAgICAgICAncG9zaXRpb24nID0+ICR0aGlzLT5wb3NpdGlvbiwKICAgICAgICAndGl0bGUnID0+ICR0aGlzLT50aXRsZSwKICAgICAgICAnZmlsZW5hbWUnID0+ICR0aGlzLT5maWxlbmFtZSwKICAgICAgICAnb3JpZ2luYWxfZmlsZW5hbWUnID0+ICR0aGlzLT5vcmlnaW5hbF9maWxlbmFtZSwKICAgICAgICAnZmlsZW5hbWVfdXJsJyA9PiAkdGhpcy0+Z2V0VXJsKCkKICAgICAgKTsKICAgIH0KICAgIAogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpdGVtc1RvQXJyYXkoQXJyYXkgJGxpc3QpIHsKICAgICAgJGFycmF5ID0gYXJyYXkoKTsKICAgICAgZm9yZWFjaCgkbGlzdCBhcyAkaXRlbSkKICAgICAgewogICAgICAgICRhcnJheVskaXRlbS0+aWRdID0gJGl0ZW0tPnRvQXJyYXkoKTsKICAgICAgfQogICAgICByZXR1cm4gJGFycmF5OwogICAgfQogICAgCiAgICBwdWJsaWMgZnVuY3Rpb24gc2F2ZSgkcGFyYW1zID0gYXJyYXkoKSkgewogICAgICBpZigkdGhpcy0+aWQgJiYgIWlzc2V0KCRwYXJhbXNbJ2ZvcmNlX2luc2VydCddKSl7CiAgICAgICAgJHRoaXMtPnVwZGF0ZSgkcGFyYW1zKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAkdGhpcy0+aW5zZXJ0KCRwYXJhbXMpOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBnZXROZXh0UG9zaXRpb24oKSAgewogICAgICAkZGIgPSBjbXNfdXRpbHM6OmdldF9kYigpOwogICAgICAkcXVlcnkgPSAnU0VMRUNUIE1BWChwb3NpdGlvbikgKyAxIEFTIHBvc2l0aW9uIEZST00gJy5jbXNfZGJfcHJlZml4KCkuc2VsZjo6REJfTkFNRSAgLicgV0hFUkUgY29sbGVjdGlvbl9pZCA9ID8nOwogICAgICAkcmVzdWx0ID0gJGRiLT5leGVjdXRlKCRxdWVyeSwgYXJyYXkoJHRoaXMtPmNvbGxlY3Rpb25faWQpKTsKICAgICAgJHJvdyA9ICRyZXN1bHQtPkZldGNoUm93KCk7CiAgICAgIHJldHVybiAkcm93Wydwb3NpdGlvbiddID8gJHJvd1sncG9zaXRpb24nXSA6IDE7CiAgICB9CiAgICAKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBpbnNlcnQoJHBhcmFtcyA9IGFycmF5KCkpIHsKICAgICAgCiAgICAgICRkYiA9IGNtc191dGlsczo6Z2V0X2RiKCk7CiAgICAgIAogICAgICBpZighaXNzZXQoJHRoaXMtPnBvc2l0aW9uKSB8fCBpc19udWxsKCR0aGlzLT5wb3NpdGlvbikpCiAgICAgIHsKICAgICAgICAkdGhpcy0+cG9zaXRpb24gPSAkdGhpcy0+Z2V0TmV4dFBvc2l0aW9uKCk7CiAgICAgIH0KICAgICAgCiAgICAgIGlmKGlzc2V0KCRwYXJhbXNbJ2Zyb250ZW5kJ10pKQogICAgICB7CiAgICAgICAgJHVzZXJpZCA9IG51bGw7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgJHVzZXJpZCA9IGdldF91c2VyaWQoKTsKICAgICAgfQogICAgICAKICAgICAgLy8gVVBEQVRFCiAgICAgIGlmKGlzc2V0KCRwYXJhbXNbJ25vX3RpbWVfaW5jcmVtZW50J10pKQogICAgICB7CiAgICAgICAgJHVwZGF0ZWRfYXQgPSAkdGhpcy0+dXBkYXRlZF9hdDsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICAkdXBkYXRlZF9hdCA9IHRpbWUoKTsKICAgICAgfQogICAgICAKICAgICAgJHF1ZXJ5ID0gJ0lOU0VSVCBJTlRPICcuY21zX2RiX3ByZWZpeCgpLnNlbGY6OkRCX05BTUUgLiAnCiAgICAgICAgU0VUIAogICAgICAgICAgY29sbGVjdGlvbl9pZCA9ID8sCiAgICAgICAgICAKICAgICAgICAgIGNyZWF0ZWRfYXQgPSA/LAogICAgICAgICAgY3JlYXRlZF9ieSA9ID8sCiAgICAgICAgICB1cGRhdGVkX2F0ID0gPywKICAgICAgICAgIHVwZGF0ZWRfYnkgPSA/LAoKICAgICAgICAgIHRpdGxlID0gPywKICAgICAgICAgIHBvc2l0aW9uID0gPywKICAgICAgICAgIGZpbGVuYW1lID0gPywKICAgICAgICAgIG9yaWdpbmFsX2ZpbGVuYW1lID0gPyc7CiAgICAgICAgICAKICAgICAgJHZhbHVlcyA9IGFycmF5KCR0aGlzLT5jb2xsZWN0aW9uX2lkLAogICAgICAgICAgIHRpbWUoKSwKICAgICAgICAgICAkdXNlcmlkLAogICAgICAgICAgICR1cGRhdGVkX2F0LAogICAgICAgICAgICR1c2VyaWQsCgogICAgICAgICAgICR0aGlzLT50aXRsZSwKICAgICAgICAgICAkdGhpcy0+cG9zaXRpb24sCiAgICAgICAgICAgJHRoaXMtPmZpbGVuYW1lLAogICAgICAgICAgICR0aGlzLT5vcmlnaW5hbF9maWxlbmFtZSk7CiAgICAgICAgICAKICAgICAgaWYoaXNzZXQoJHRoaXMtPmlkKSAmJiAhaXNfbnVsbCgkdGhpcy0+aWQpICYmIGlzc2V0KCRwYXJhbXNbJ2ZvcmNlX2luc2VydCddKSkKICAgICAgewogICAgICAgICRxdWVyeSAuPSAnLCBpZCA9ID8nOwogICAgICAgICR2YWx1ZXNbXSA9ICR0aGlzLT5pZDsKICAgICAgfQogICAgICAgICAgCiAgICAgICRkYi0+RXhlY3V0ZSgkcXVlcnksICR2YWx1ZXMpOwoKICAgICAgJHRoaXMtPmlkID0gJGRiLT5JbnNlcnRfSUQoKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHVwZGF0ZSgkcGFyYW1zID0gYXJyYXkoKSkgewogICAgICAkZGIgPSBjbXNfdXRpbHM6OmdldF9kYigpOwogICAgICBpZihpc3NldCgkcGFyYW1zWydmcm9udGVuZCddKSkKICAgICAgewogICAgICAgICR1c2VyaWQgPSBudWxsOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgICR1c2VyaWQgPSBnZXRfdXNlcmlkKCk7CiAgICAgIH0KICAgICAgJHF1ZXJ5ID0gJ1VQREFURSAnLmNtc19kYl9wcmVmaXgoKS5zZWxmOjpEQl9OQU1FLiAnCiAgICAgICAgU0VUIAogICAgICAgICAgdXBkYXRlZF9hdCA9ID8sCiAgICAgICAgICB1cGRhdGVkX2J5ID0gPywKCiAgICAgICAgICB0aXRsZSA9ID8sCiAgICAgICAgICBwb3NpdGlvbiA9ID8KICAgICAgICBXSEVSRSBpZCA9ID8nOwogICAgICAKICAgICAgLy8gVVBEQVRFCiAgICAgIGlmKGlzc2V0KCRwYXJhbXNbJ25vX3RpbWVfaW5jcmVtZW50J10pKQogICAgICB7CiAgICAgICAgJHVwZGF0ZWRfYXQgPSAkdGhpcy0+dXBkYXRlZF9hdDsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICAkdXBkYXRlZF9hdCA9IHRpbWUoKTsKICAgICAgfQogICAgICAgIAogICAgICAkZGItPkV4ZWN1dGUoJHF1ZXJ5LCBhcnJheSgKICAgICAgICAkdXBkYXRlZF9hdCwKICAgICAgICAkdXNlcmlkLAogICAgICAgICR0aGlzLT50aXRsZSwKICAgICAgICAkdGhpcy0+cG9zaXRpb24sICAgIAogICAgICAgICR0aGlzLT5pZAogICAgICApKTsKCiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgCiAgICBwdWJsaWMgZnVuY3Rpb24gZGVsZXRlKCkgewogICAgICBpZiAoJHRoaXMtPmlkKSB7CiAgICAgICAgLy8gRklSU1QgREVMRVRFIFRIRSBGSUxFCiAgICAgICAgJGZpbGUgPSAkdGhpcy0+Z2V0RmlsZXBhdGgoKTsKICAgICAgIAogICAgICAgIGlmKGlzX2ZpbGUoJGZpbGUpKQogICAgICAgIHsKICAgICAgICAgdW5saW5rKCRmaWxlKTsgCiAgICAgICAgfSAgICAgIAogICAgICAgIAogICAgICAgICRxdWVyeSA9ICdERUxFVEUgRlJPTSAnIC4gY21zX2RiX3ByZWZpeCgpIC4gc2VsZjo6REJfTkFNRSAuJyBXSEVSRSBpZCA9ID8nOwogICAgICAgICRkYiA9IGNtc191dGlsczo6Z2V0X2RiKCk7CiAgICAgICAgJGRiLT5FeGVjdXRlKCRxdWVyeSwgYXJyYXkoJHRoaXMtPmlkKSk7ICAgICAgIAogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFN5bmNGcm9tVXJsKCR1cmwsICRkZWxldGUgPSB0cnVlKSAgewogICAgICAgLy8gSU1QT1JUCiAgICAgICAgJGRhdGEgPSBmaWxlX2dldF9jb250ZW50cygkdXJsKTsKICAgICAgICBpZigkZGF0YSAhPT0gZmFsc2UpCiAgICAgICAgewogICAgICAgICAgJHJlc3VsdCA9IGpzb25fZGVjb2RlKCRkYXRhLCB0cnVlKTsKICAgICAgICAgIGlmKCgkcmVzdWx0ICE9IE5VTEwpICYmIChpc3NldCgkcmVzdWx0WydyZXN1bHRzJ10pKSkKICAgICAgICAgIHsKICAgICAgICAgICAgJHJlbW90ZV9pdGVtcyA9ICRyZXN1bHRbJ3Jlc3VsdHMnXTsKICAgICAgICAgICAgJGxvY2FsX2l0ZW1zID0gc2VsZjo6ZG9TZWxlY3QoYXJyYXkoJ3dpdGhfaWQnID0+IHRydWUpKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGZvcmVhY2goJHJlbW90ZV9pdGVtcyBhcyAkaWQgPT4gJGl0ZW0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBpZihpc3NldCgkbG9jYWxfaXRlbXNbJGlkXSkpCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYoJGl0ZW1bJ3VwZGF0ZWRfYXQnXSA+ICRsb2NhbF9pdGVtc1skaWRdLT51cGRhdGVkX2F0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgaXQKICAgICAgICAgICAgICAgICAgJGxvY2FsX2l0ZW1zWyRpZF0tPnBvcHVsYXRlKCRpdGVtKTsKICAgICAgICAgICAgICAgICAgJGxvY2FsX2l0ZW1zWyRpZF0tPmRvd25sb2FkUmVtb3RlRmlsZSgkaXRlbVsnZmlsZW5hbWVfdXJsJ10pOyAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAkbG9jYWxfaXRlbXNbJGlkXS0+c2F2ZShhcnJheSgnbm9fdGltZV9pbmNyZW1lbnQnID0+IHRydWUpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIENyZWF0ZQogICAgICAgICAgICAgICAgJGxvY2FsX2l0ZW1zWyRpZF0gPSBuZXcgc2VsZigpOwogICAgICAgICAgICAgICAgJGxvY2FsX2l0ZW1zWyRpZF0tPnBvcHVsYXRlKCRpdGVtKTsKICAgICAgICAgICAgICAgICRsb2NhbF9pdGVtc1skaWRdLT5kb3dubG9hZFJlbW90ZUZpbGUoJGl0ZW1bJ2ZpbGVuYW1lX3VybCddKTsgIAogICAgICAgICAgICAgICAgJGxvY2FsX2l0ZW1zWyRpZF0tPnNhdmUoYXJyYXkoJ25vX3RpbWVfaW5jcmVtZW50JyA9PiB0cnVlLCAnZm9yY2VfaW5zZXJ0JyA9PiB0cnVlKSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBERUxFVEUgTk9UIEVYSVNUQU5UCiAgICAgICAgICAgIGlmKCRkZWxldGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBmb3JlYWNoKCRsb2NhbF9pdGVtcyBhcyAkaWQgPT4gJGl0ZW0pCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYoIWlzc2V0KCRyZW1vdGVfaXRlbXNbJGlkXSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICRpdGVtLT5kZWxldGUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIAogIH0=]]></data>
	</file>
	<file>
	  <filename>/lib/class.MCFileCollection.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKICAvKgogICAgQSBjb2xsZWN0aW9uIGlzIGEgc2V0IG9mIGZpbGVzLgogICovCiAgY2xhc3MgTUNGaWxlQ29sbGVjdGlvbgogIHsKICAgIHByb3RlY3RlZCAkY29sbGVjdGlvbl9pZDsKICAgIHByb3RlY3RlZCAkZmlsZXMgPSBhcnJheSgpOyAvLyBBcnJheSBvZiBNQ0ZpbGUgb2JqZWN0cwogICAgcHJvdGVjdGVkICRsYXN0X2ZpbGU7IC8vIExhc3QgZmlsZSBhZGRlZAogICAgCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGNvbGxlY3Rpb25faWQgPSBudWxsKSB7CgkJCWlmKGlzX251bGwoJGNvbGxlY3Rpb25faWQpKQoJCQl7CgkJCQkkY29sbGVjdGlvbl9pZCA9IHNlbGY6OmNyZWF0ZVVuaXF1ZUNvbGxlY3Rpb25JZCgpOwoJCQl9CiAgICAgICR0aGlzLT5jb2xsZWN0aW9uX2lkID0gJGNvbGxlY3Rpb25faWQ7CiAgICB9CiAgICAKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRJZCgpIHsKICAgICAgcmV0dXJuICR0aGlzLT5jb2xsZWN0aW9uX2lkOwogICAgfQogICAgCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0Q29sbGVjdGlvbklkKCkgewogICAgICByZXR1cm4gJHRoaXMtPmNvbGxlY3Rpb25faWQ7CiAgICB9CiAgICAKICAgIHB1YmxpYyBmdW5jdGlvbiBoYXNGaWxlcygpICB7CiAgICAgIHJldHVybiAoYm9vbCljb3VudCgkdGhpcy0+ZmlsZXMpOwogICAgfQogICAgCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0RmlsZXMoKSAgewogICAgICByZXR1cm4gKGFycmF5KSAkdGhpcy0+ZmlsZXM7CiAgICB9CiAgICAKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRGaXJzdEZpbGUoKSAgewogICAgICByZXNldCgkdGhpcy0+ZmlsZXMpOwogICAgICByZXR1cm4gY3VycmVudCgkdGhpcy0+ZmlsZXMpOwogICAgfQogICAgCgkJcHVibGljIGZ1bmN0aW9uIGdldExhc3RGaWxlKCkKCQl7CgkJCXJldHVybiAkdGhpcy0+bGFzdF9maWxlOwoJCX0KCiAgICBwdWJsaWMgZnVuY3Rpb24gbG9hZCgpCiAgICB7CiAgICAgLy8gTG9hZCBmaWxlcyAKICAgICAkdGhpcy0+ZmlsZXMgPSBNQ0ZpbGU6OmRvU2VsZWN0KGFycmF5KCd3aGVyZScgPT4gYXJyYXkoJ2NvbGxlY3Rpb25faWQnID0+ICR0aGlzLT5jb2xsZWN0aW9uX2lkKSkpOwogICAgfQogICAgCiAgICBwdWJsaWMgZnVuY3Rpb24gbG9hZE9uZSgpCiAgICB7CiAgICAgICR0aGlzLT5maWxlcyA9IE1DRmlsZTo6ZG9TZWxlY3QoYXJyYXkoJ3doZXJlJyA9PiBhcnJheSgnY29sbGVjdGlvbl9pZCcgPT4gJHRoaXMtPmNvbGxlY3Rpb25faWQpLCAnbGltaXQnID0+ICcxJykpOwogICAgfQogICAgCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZVVuaXF1ZUNvbGxlY3Rpb25JZCgpCiAgICB7CiAgICAgIC8vIFRPRE8gQ2hlY2sgaW4gdGhlIERCIGZpcnN0Li4uCiAgICAgIHJldHVybiB0aW1lKCkgLiByYW5kKDAsMTAwMCk7CiAgICB9CiAgICAKCQlwdWJsaWMgZnVuY3Rpb24gYWRkRmlsZSgkZmlsZSwgJG1vdmUgPSB0cnVlKQoJCXsKICAgICAgJHRoaXMtPmxhc3RfZmlsZSA9IG5ldyBNQ0ZpbGUoJHRoaXMtPmNvbGxlY3Rpb25faWQpOwoJCQkKCQkJcmV0dXJuICR0aGlzLT5sYXN0X2ZpbGUtPnVwbG9hZEZyb21Mb2NhbCgkZmlsZSwgJG1vdmUpOwoJCX0KCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkVXBsb2FkZWRGaWxlKCRmaWVsZG5hbWUpCiAgICB7CiAgICAgICR0aGlzLT5sYXN0X2ZpbGUgPSBuZXcgTUNGaWxlKCR0aGlzLT5jb2xsZWN0aW9uX2lkKTsKCiAgICAgIHJldHVybiAkdGhpcy0+bGFzdF9maWxlLT5zYXZlVXBsb2FkZWRGaWxlKCRmaWVsZG5hbWUpOwogICAgfQogIH0=]]></data>
	</file>
	<file>
	  <filename>/lib/class.qqFileUploader.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmNsYXNzIHFxRmlsZVVwbG9hZGVyIHsKCiAgICBwdWJsaWMgJGFsbG93ZWRFeHRlbnNpb25zID0gYXJyYXkoKTsKICAgIHB1YmxpYyAkc2l6ZUxpbWl0ID0gbnVsbDsKICAgIHB1YmxpYyAkaW5wdXROYW1lID0gJ3FxZmlsZSc7CiAgICBwdWJsaWMgJGNodW5rc0ZvbGRlciA9ICdjaHVua3MnOwoKICAgIHB1YmxpYyAkY2h1bmtzQ2xlYW51cFByb2JhYmlsaXR5ID0gMC4wMDE7IC8vIE9uY2UgaW4gMTAwMCByZXF1ZXN0cyBvbiBhdmcKICAgIHB1YmxpYyAkY2h1bmtzRXhwaXJlSW4gPSA2MDQ4MDA7IC8vIE9uZSB3ZWVrCgogICAgcHJvdGVjdGVkICR1cGxvYWROYW1lOwoKICAgIGZ1bmN0aW9uIF9fY29uc3RydWN0KCl7CiAgICAgICAgJHRoaXMtPnNpemVMaW1pdCA9ICR0aGlzLT50b0J5dGVzKGluaV9nZXQoJ3VwbG9hZF9tYXhfZmlsZXNpemUnKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgdGhlIG9yaWdpbmFsIGZpbGVuYW1lCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCl7CiAgICAgICAgaWYgKGlzc2V0KCRfUkVRVUVTVFsncXFmaWxlbmFtZSddKSkKICAgICAgICAgICAgcmV0dXJuICRfUkVRVUVTVFsncXFmaWxlbmFtZSddOwoKICAgICAgICBpZiAoaXNzZXQoJF9GSUxFU1skdGhpcy0+aW5wdXROYW1lXSkpCiAgICAgICAgICAgIHJldHVybiAkX0ZJTEVTWyR0aGlzLT5pbnB1dE5hbWVdWyduYW1lJ107CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIHVwbG9hZGVkIGZpbGUKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFVwbG9hZE5hbWUoKXsKICAgICAgICByZXR1cm4gJHRoaXMtPnVwbG9hZE5hbWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBQcm9jZXNzIHRoZSB1cGxvYWQuCiAgICAgKiBAcGFyYW0gc3RyaW5nICR1cGxvYWREaXJlY3RvcnkgVGFyZ2V0IGRpcmVjdG9yeS4KICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgT3ZlcndyaXRlcyB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGhhbmRsZVVwbG9hZCgkdXBsb2FkRGlyZWN0b3J5LCAkbmFtZSA9IG51bGwpewoKICAgICAgICBpZiAoaXNfd3JpdGFibGUoJHRoaXMtPmNodW5rc0ZvbGRlcikgJiYKICAgICAgICAgICAgMSA9PSBtdF9yYW5kKDEsIDEvJHRoaXMtPmNodW5rc0NsZWFudXBQcm9iYWJpbGl0eSkpewoKICAgICAgICAgICAgLy8gUnVuIGdhcmJhZ2UgY29sbGVjdGlvbgogICAgICAgICAgICAkdGhpcy0+Y2xlYW51cENodW5rcygpOwogICAgICAgIH0KCiAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgbWF4IHVwbG9hZCBzaXplIHNwZWNpZmllZCBpbiBjbGFzcyBjb25maWd1cmF0aW9uIGRvZXMgbm90CiAgICAgICAgLy8gZXhjZWVkIHNpemUgYWxsb3dlZCBieSBzZXJ2ZXIgY29uZmlnCiAgICAgICAgaWYgKCR0aGlzLT50b0J5dGVzKGluaV9nZXQoJ3Bvc3RfbWF4X3NpemUnKSkgPCAkdGhpcy0+c2l6ZUxpbWl0IHx8CiAgICAgICAgICAgICR0aGlzLT50b0J5dGVzKGluaV9nZXQoJ3VwbG9hZF9tYXhfZmlsZXNpemUnKSkgPCAkdGhpcy0+c2l6ZUxpbWl0KXsKICAgICAgICAgICAgJHNpemUgPSBtYXgoMSwgJHRoaXMtPnNpemVMaW1pdCAvIDEwMjQgLyAxMDI0KSAuICdNJzsKICAgICAgICAgICAgcmV0dXJuIGFycmF5KCdlcnJvcic9PiJTZXJ2ZXIgZXJyb3IuIEluY3JlYXNlIHBvc3RfbWF4X3NpemUgYW5kIHVwbG9hZF9tYXhfZmlsZXNpemUgdG8gIi4kc2l6ZSk7CiAgICAgICAgfQoKCQkvLyBpc193cml0YWJsZSgpIGlzIG5vdCByZWxpYWJsZSBvbiBXaW5kb3dzIChodHRwOi8vd3d3LnBocC5uZXQvbWFudWFsL2VuL2Z1bmN0aW9uLmlzLWV4ZWN1dGFibGUucGhwIzExMTE0NikKCQkvLyBUaGUgZm9sbG93aW5nIHRlc3RzIGlmIHRoZSBjdXJyZW50IE9TIGlzIFdpbmRvd3MgYW5kIGlmIHNvLCBtZXJlbHkgY2hlY2tzIGlmIHRoZSBmb2xkZXIgaXMgd3JpdGFibGU7CgkJLy8gb3RoZXJ3aXNlLCBpdCBjaGVja3MgYWRkaXRpb25hbGx5IGZvciBleGVjdXRhYmxlIHN0YXR1cyAobGlrZSBiZWZvcmUpLgoJCQogICAgICAgICRpc1dpbiA9IChzdHJ0b3VwcGVyKHN1YnN0cihQSFBfT1MsIDAsIDMpKSA9PT0gJ1dJTicpOwogICAgICAgICRmb2xkZXJJbmFjY2Vzc2libGUgPSAoJGlzV2luKSA/ICFpc193cml0YWJsZSgkdXBsb2FkRGlyZWN0b3J5KSA6ICggIWlzX3dyaXRhYmxlKCR1cGxvYWREaXJlY3RvcnkpICYmICFpc19leGVjdXRhYmxlKCR1cGxvYWREaXJlY3RvcnkpICk7CgogICAgICAgIGlmICgkZm9sZGVySW5hY2Nlc3NpYmxlKXsKICAgICAgICAgICAgcmV0dXJuIGFycmF5KCdlcnJvcicgPT4gIlNlcnZlciBlcnJvci4gVXBsb2FkcyBkaXJlY3RvcnkgaXNuJ3Qgd3JpdGFibGUiIC4gKCEkaXNXaW4pID8gIiBvciBleGVjdXRhYmxlLiIgOiAiLiIpOwogICAgICAgIH0KCiAgICAgICAgaWYoIWlzc2V0KCRfU0VSVkVSWydDT05URU5UX1RZUEUnXSkpIHsKICAgICAgICAgICAgcmV0dXJuIGFycmF5KCdlcnJvcicgPT4gIk5vIGZpbGVzIHdlcmUgdXBsb2FkZWQuIik7CiAgICAgICAgfSBlbHNlIGlmIChzdHJwb3Moc3RydG9sb3dlcigkX1NFUlZFUlsnQ09OVEVOVF9UWVBFJ10pLCAnbXVsdGlwYXJ0LycpICE9PSAwKXsKICAgICAgICAgICAgcmV0dXJuIGFycmF5KCdlcnJvcicgPT4gIlNlcnZlciBlcnJvci4gTm90IGEgbXVsdGlwYXJ0IHJlcXVlc3QuIFBsZWFzZSBzZXQgZm9yY2VNdWx0aXBhcnQgdG8gZGVmYXVsdCB2YWx1ZSAodHJ1ZSkuIik7CiAgICAgICAgfQoKICAgICAgICAvLyBHZXQgc2l6ZSBhbmQgbmFtZQoKICAgICAgICAkZmlsZSA9ICRfRklMRVNbJHRoaXMtPmlucHV0TmFtZV07CiAgICAgICAgJHNpemUgPSAkZmlsZVsnc2l6ZSddOwoKICAgICAgICBpZiAoJG5hbWUgPT09IG51bGwpewogICAgICAgICAgICAkbmFtZSA9ICR0aGlzLT5nZXROYW1lKCk7CiAgICAgICAgfQoKICAgICAgICAvLyBWYWxpZGF0ZSBuYW1lCgogICAgICAgIGlmICgkbmFtZSA9PT0gbnVsbCB8fCAkbmFtZSA9PT0gJycpewogICAgICAgICAgICByZXR1cm4gYXJyYXkoJ2Vycm9yJyA9PiAnRmlsZSBuYW1lIGVtcHR5LicpOwogICAgICAgIH0KCiAgICAgICAgLy8gVmFsaWRhdGUgZmlsZSBzaXplCgogICAgICAgIGlmICgkc2l6ZSA9PSAwKXsKICAgICAgICAgICAgcmV0dXJuIGFycmF5KCdlcnJvcicgPT4gJ0ZpbGUgaXMgZW1wdHkuJyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHNpemUgPiAkdGhpcy0+c2l6ZUxpbWl0KXsKICAgICAgICAgICAgcmV0dXJuIGFycmF5KCdlcnJvcicgPT4gJ0ZpbGUgaXMgdG9vIGxhcmdlLicpOwogICAgICAgIH0KCiAgICAgICAgLy8gVmFsaWRhdGUgZmlsZSBleHRlbnNpb24KCiAgICAgICAgJHBhdGhpbmZvID0gcGF0aGluZm8oJG5hbWUpOwogICAgICAgICRleHQgPSBpc3NldCgkcGF0aGluZm9bJ2V4dGVuc2lvbiddKSA/ICRwYXRoaW5mb1snZXh0ZW5zaW9uJ10gOiAnJzsKCiAgICAgICAgaWYoJHRoaXMtPmFsbG93ZWRFeHRlbnNpb25zICYmICFpbl9hcnJheShzdHJ0b2xvd2VyKCRleHQpLCBhcnJheV9tYXAoInN0cnRvbG93ZXIiLCAkdGhpcy0+YWxsb3dlZEV4dGVuc2lvbnMpKSl7CiAgICAgICAgICAgICR0aGVzZSA9IGltcGxvZGUoJywgJywgJHRoaXMtPmFsbG93ZWRFeHRlbnNpb25zKTsKICAgICAgICAgICAgcmV0dXJuIGFycmF5KCdlcnJvcicgPT4gJ0ZpbGUgaGFzIGFuIGludmFsaWQgZXh0ZW5zaW9uLCBpdCBzaG91bGQgYmUgb25lIG9mICcuICR0aGVzZSAuICcuJyk7CiAgICAgICAgfQoKICAgICAgICAvLyBTYXZlIGEgY2h1bmsKCiAgICAgICAgJHRvdGFsUGFydHMgPSBpc3NldCgkX1JFUVVFU1RbJ3FxdG90YWxwYXJ0cyddKSA/IChpbnQpJF9SRVFVRVNUWydxcXRvdGFscGFydHMnXSA6IDE7CgogICAgICAgIGlmICgkdG90YWxQYXJ0cyA+IDEpewoKICAgICAgICAgICAgJGNodW5rc0ZvbGRlciA9ICR0aGlzLT5jaHVua3NGb2xkZXI7CiAgICAgICAgICAgICRwYXJ0SW5kZXggPSAoaW50KSRfUkVRVUVTVFsncXFwYXJ0aW5kZXgnXTsKICAgICAgICAgICAgJHV1aWQgPSAkX1JFUVVFU1RbJ3FxdXVpZCddOwoKICAgICAgICAgICAgaWYgKCFpc193cml0YWJsZSgkY2h1bmtzRm9sZGVyKSAmJiAhaXNfZXhlY3V0YWJsZSgkdXBsb2FkRGlyZWN0b3J5KSl7CiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkoJ2Vycm9yJyA9PiAiU2VydmVyIGVycm9yLiBDaHVua3MgZGlyZWN0b3J5IGlzbid0IHdyaXRhYmxlIG9yIGV4ZWN1dGFibGUuIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0YXJnZXRGb2xkZXIgPSAkdGhpcy0+Y2h1bmtzRm9sZGVyLkRJUkVDVE9SWV9TRVBBUkFUT1IuJHV1aWQ7CgogICAgICAgICAgICBpZiAoIWZpbGVfZXhpc3RzKCR0YXJnZXRGb2xkZXIpKXsKICAgICAgICAgICAgICAgIG1rZGlyKCR0YXJnZXRGb2xkZXIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGFyZ2V0ID0gJHRhcmdldEZvbGRlci4nLycuJHBhcnRJbmRleDsKICAgICAgICAgICAgJHN1Y2Nlc3MgPSBtb3ZlX3VwbG9hZGVkX2ZpbGUoJF9GSUxFU1skdGhpcy0+aW5wdXROYW1lXVsndG1wX25hbWUnXSwgJHRhcmdldCk7CgogICAgICAgICAgICAvLyBMYXN0IGNodW5rIHNhdmVkIHN1Y2Nlc3NmdWxseQogICAgICAgICAgICBpZiAoJHN1Y2Nlc3MgQU5EICgkdG90YWxQYXJ0cy0xID09ICRwYXJ0SW5kZXgpKXsKCiAgICAgICAgICAgICAgICAkdGFyZ2V0ID0gJHRoaXMtPmdldFVuaXF1ZVRhcmdldFBhdGgoJHVwbG9hZERpcmVjdG9yeSwgJG5hbWUpOwogICAgICAgICAgICAgICAgJHRoaXMtPnVwbG9hZE5hbWUgPSBiYXNlbmFtZSgkdGFyZ2V0KTsKCiAgICAgICAgICAgICAgICAkdGFyZ2V0ID0gZm9wZW4oJHRhcmdldCwgJ3diJyk7CgogICAgICAgICAgICAgICAgZm9yICgkaT0wOyAkaTwkdG90YWxQYXJ0czsgJGkrKyl7CiAgICAgICAgICAgICAgICAgICAgJGNodW5rID0gZm9wZW4oJHRhcmdldEZvbGRlci5ESVJFQ1RPUllfU0VQQVJBVE9SLiRpLCAicmIiKTsKICAgICAgICAgICAgICAgICAgICBzdHJlYW1fY29weV90b19zdHJlYW0oJGNodW5rLCAkdGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICBmY2xvc2UoJGNodW5rKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBTdWNjZXNzCiAgICAgICAgICAgICAgICBmY2xvc2UoJHRhcmdldCk7CgogICAgICAgICAgICAgICAgZm9yICgkaT0wOyAkaTwkdG90YWxQYXJ0czsgJGkrKyl7CiAgICAgICAgICAgICAgICAgICAgdW5saW5rKCR0YXJnZXRGb2xkZXIuRElSRUNUT1JZX1NFUEFSQVRPUi4kaSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcm1kaXIoJHRhcmdldEZvbGRlcik7CgogICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5KCJzdWNjZXNzIiA9PiB0cnVlKTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBhcnJheSgic3VjY2VzcyIgPT4gdHJ1ZSk7CgogICAgICAgIH0gZWxzZSB7CgogICAgICAgICAgICAkdGFyZ2V0ID0gJHRoaXMtPmdldFVuaXF1ZVRhcmdldFBhdGgoJHVwbG9hZERpcmVjdG9yeSwgJG5hbWUpOwoKICAgICAgICAgICAgaWYgKCR0YXJnZXQpewogICAgICAgICAgICAgICAgJHRoaXMtPnVwbG9hZE5hbWUgPSBiYXNlbmFtZSgkdGFyZ2V0KTsKCiAgICAgICAgICAgICAgICBpZiAobW92ZV91cGxvYWRlZF9maWxlKCRmaWxlWyd0bXBfbmFtZSddLCAkdGFyZ2V0KSl7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5KCdzdWNjZXNzJz0+IHRydWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYXJyYXkoJ2Vycm9yJz0+ICdDb3VsZCBub3Qgc2F2ZSB1cGxvYWRlZCBmaWxlLicgLgogICAgICAgICAgICAgICAgJ1RoZSB1cGxvYWQgd2FzIGNhbmNlbGxlZCwgb3Igc2VydmVyIGVycm9yIGVuY291bnRlcmVkJyk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhIHBhdGggdG8gdXNlIHdpdGggdGhpcyB1cGxvYWQuIENoZWNrIHRoYXQgdGhlIG5hbWUgZG9lcyBub3QgZXhpc3QsCiAgICAgKiBhbmQgYXBwZW5kcyBhIHN1ZmZpeCBvdGhlcndpc2UuCiAgICAgKiBAcGFyYW0gc3RyaW5nICR1cGxvYWREaXJlY3RvcnkgVGFyZ2V0IGRpcmVjdG9yeQogICAgICogQHBhcmFtIHN0cmluZyAkZmlsZW5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gdXNlLgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0VW5pcXVlVGFyZ2V0UGF0aCgkdXBsb2FkRGlyZWN0b3J5LCAkZmlsZW5hbWUpCiAgICB7CiAgICAgICAgLy8gQWxsb3cgb25seSBvbmUgcHJvY2VzcyBhdCB0aGUgdGltZSB0byBnZXQgYSB1bmlxdWUgZmlsZSBuYW1lLCBvdGhlcndpc2UKICAgICAgICAvLyBpZiBtdWx0aXBsZSBwZW9wbGUgd291bGQgdXBsb2FkIGEgZmlsZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXQgdGhlIHNhbWUgdGltZQogICAgICAgIC8vIG9ubHkgdGhlIGxhdGVzdCB3b3VsZCBiZSBzYXZlZC4KCiAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnc2VtX2FjcXVpcmUnKSl7CiAgICAgICAgICAgICRsb2NrID0gc2VtX2dldChmdG9rKF9fRklMRV9fLCAndScpKTsKICAgICAgICAgICAgc2VtX2FjcXVpcmUoJGxvY2spOwogICAgICAgIH0KCiAgICAgICAgJHBhdGhpbmZvID0gcGF0aGluZm8oJGZpbGVuYW1lKTsKICAgICAgICAkYmFzZSA9ICRwYXRoaW5mb1snZmlsZW5hbWUnXTsKICAgICAgICAkZXh0ID0gaXNzZXQoJHBhdGhpbmZvWydleHRlbnNpb24nXSkgPyAkcGF0aGluZm9bJ2V4dGVuc2lvbiddIDogJyc7CiAgICAgICAgJGV4dCA9ICRleHQgPT0gJycgPyAkZXh0IDogJy4nIC4gJGV4dDsKCiAgICAgICAgJHVuaXF1ZSA9ICRiYXNlOwogICAgICAgICRzdWZmaXggPSAwOwoKICAgICAgICAvLyBHZXQgdW5pcXVlIGZpbGUgbmFtZSBmb3IgdGhlIGZpbGUsIGJ5IGFwcGVuZGluZyByYW5kb20gc3VmZml4LgoKICAgICAgICB3aGlsZSAoZmlsZV9leGlzdHMoJHVwbG9hZERpcmVjdG9yeSAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkdW5pcXVlIC4gJGV4dCkpewogICAgICAgICAgICAkc3VmZml4ICs9IHJhbmQoMSwgOTk5KTsKICAgICAgICAgICAgJHVuaXF1ZSA9ICRiYXNlLictJy4kc3VmZml4OwogICAgICAgIH0KCiAgICAgICAgJHJlc3VsdCA9ICAkdXBsb2FkRGlyZWN0b3J5IC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICR1bmlxdWUgLiAkZXh0OwoKICAgICAgICAvLyBDcmVhdGUgYW4gZW1wdHkgdGFyZ2V0IGZpbGUKICAgICAgICBpZiAoIXRvdWNoKCRyZXN1bHQpKXsKICAgICAgICAgICAgLy8gRmFpbGVkCiAgICAgICAgICAgICRyZXN1bHQgPSBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ3NlbV9hY3F1aXJlJykpewogICAgICAgICAgICBzZW1fcmVsZWFzZSgkbG9jayk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KCiAgICAvKioKICAgICAqIERlbGV0ZXMgYWxsIGZpbGUgcGFydHMgaW4gdGhlIGNodW5rcyBmb2xkZXIgZm9yIGZpbGVzIHVwbG9hZGVkCiAgICAgKiBtb3JlIHRoYW4gY2h1bmtzRXhwaXJlSW4gc2Vjb25kcyBhZ28KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGNsZWFudXBDaHVua3MoKXsKICAgICAgICBmb3JlYWNoIChzY2FuZGlyKCR0aGlzLT5jaHVua3NGb2xkZXIpIGFzICRpdGVtKXsKICAgICAgICAgICAgaWYgKCRpdGVtID09ICIuIiB8fCAkaXRlbSA9PSAiLi4iKQogICAgICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICAgICAkcGF0aCA9ICR0aGlzLT5jaHVua3NGb2xkZXIuRElSRUNUT1JZX1NFUEFSQVRPUi4kaXRlbTsKCiAgICAgICAgICAgIGlmICghaXNfZGlyKCRwYXRoKSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgICAgaWYgKHRpbWUoKSAtIGZpbGVtdGltZSgkcGF0aCkgPiAkdGhpcy0+Y2h1bmtzRXhwaXJlSW4pewogICAgICAgICAgICAgICAgJHRoaXMtPnJlbW92ZURpcigkcGF0aCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBSZW1vdmVzIGEgZGlyZWN0b3J5IGFuZCBhbGwgZmlsZXMgY29udGFpbmVkIGluc2lkZQogICAgICogQHBhcmFtIHN0cmluZyAkZGlyCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiByZW1vdmVEaXIoJGRpcil7CiAgICAgICAgZm9yZWFjaCAoc2NhbmRpcigkZGlyKSBhcyAkaXRlbSl7CiAgICAgICAgICAgIGlmICgkaXRlbSA9PSAiLiIgfHwgJGl0ZW0gPT0gIi4uIikKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgICAgdW5saW5rKCRkaXIuRElSRUNUT1JZX1NFUEFSQVRPUi4kaXRlbSk7CiAgICAgICAgfQogICAgICAgIHJtZGlyKCRkaXIpOwogICAgfQoKICAgIC8qKgogICAgICogQ29udmVydHMgYSBnaXZlbiBzaXplIHdpdGggdW5pdHMgdG8gYnl0ZXMuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHIKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHRvQnl0ZXMoJHN0cil7CiAgICAgICAgJHZhbCA9IHRyaW0oJHN0cik7CiAgICAgICAgJGxhc3QgPSBzdHJ0b2xvd2VyKCRzdHJbc3RybGVuKCRzdHIpLTFdKTsKICAgICAgICBzd2l0Y2goJGxhc3QpIHsKICAgICAgICAgICAgY2FzZSAnZyc6ICR2YWwgKj0gMTAyNDsKICAgICAgICAgICAgY2FzZSAnbSc6ICR2YWwgKj0gMTAyNDsKICAgICAgICAgICAgY2FzZSAnayc6ICR2YWwgKj0gMTAyNDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR2YWw7CiAgICB9Cn0=]]></data>
	</file>
	<file>
	  <filename>/lib/class.qqUploadedFileForm.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBIYW5kbGUgZmlsZSB1cGxvYWRzIHZpYSByZWd1bGFyIGZvcm0gcG9zdCAodXNlcyB0aGUgJF9GSUxFUyBhcnJheSkKICovCmNsYXNzIHFxVXBsb2FkZWRGaWxlRm9ybSB7CgogICAgLyoqCiAgICAgKiBTYXZlIHRoZSBmaWxlIHRvIHRoZSBzcGVjaWZpZWQgcGF0aAogICAgICogQHJldHVybiBib29sZWFuIFRSVUUgb24gc3VjY2VzcwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2F2ZSgkcGF0aCkgewogICAgICAgIHJldHVybiBtb3ZlX3VwbG9hZGVkX2ZpbGUoJF9GSUxFU1sncXFmaWxlJ11bJ3RtcF9uYW1lJ10sICRwYXRoKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBHZXQgdGhlIG9yaWdpbmFsIGZpbGVuYW1lCiAgICAgKiBAcmV0dXJuIHN0cmluZyBmaWxlbmFtZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpIHsKICAgICAgICByZXR1cm4gJF9GSUxFU1sncXFmaWxlJ11bJ25hbWUnXTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBHZXQgdGhlIGZpbGUgc2l6ZQogICAgICogQHJldHVybiBpbnRlZ2VyIGZpbGUtc2l6ZSBpbiBieXRlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTaXplKCkgewogICAgICAgIHJldHVybiAkX0ZJTEVTWydxcWZpbGUnXVsnc2l6ZSddOwogICAgfQp9]]></data>
	</file>
	<file>
	  <filename>/lib/class.qqUploadedFileXhr.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBIYW5kbGUgZmlsZSB1cGxvYWRzIHZpYSBYTUxIdHRwUmVxdWVzdAogKi8KY2xhc3MgcXFVcGxvYWRlZEZpbGVYaHIgewogICAgLyoqCiAgICAgKiBTYXZlIHRoZSBmaWxlIHRvIHRoZSBzcGVjaWZpZWQgcGF0aAogICAgICogQHJldHVybiBib29sZWFuIFRSVUUgb24gc3VjY2VzcwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2F2ZSgkcGF0aCkgeyAgICAKICAgICAgICAkaW5wdXQgPSBmb3BlbigicGhwOi8vaW5wdXQiLCAiciIpOwogICAgICAgICR0ZW1wID0gdG1wZmlsZSgpOwogICAgICAgICRyZWFsU2l6ZSA9IHN0cmVhbV9jb3B5X3RvX3N0cmVhbSgkaW5wdXQsICR0ZW1wKTsKICAgICAgICBmY2xvc2UoJGlucHV0KTsKICAgICAgICAKICAgICAgICBpZiAoJHJlYWxTaXplICE9ICR0aGlzLT5nZXRTaXplKCkpeyAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIAogICAgICAgICR0YXJnZXQgPSBmb3BlbigkcGF0aCwgInciKTsgICAgICAgIAogICAgICAgIGZzZWVrKCR0ZW1wLCAwLCBTRUVLX1NFVCk7CiAgICAgICAgc3RyZWFtX2NvcHlfdG9fc3RyZWFtKCR0ZW1wLCAkdGFyZ2V0KTsKICAgICAgICBmY2xvc2UoJHRhcmdldCk7CiAgICAgICAgCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgdGhlIG9yaWdpbmFsIGZpbGVuYW1lCiAgICAgKiBAcmV0dXJuIHN0cmluZyBmaWxlbmFtZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpIHsKICAgICAgICByZXR1cm4gJF9HRVRbJ3FxZmlsZSddOwogICAgfQogICAgCiAgICAvKioKICAgICAqIEdldCB0aGUgZmlsZSBzaXplCiAgICAgKiBAcmV0dXJuIGludGVnZXIgZmlsZS1zaXplIGluIGJ5dGUKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFNpemUoKSB7CiAgICAgICAgaWYgKGlzc2V0KCRfU0VSVkVSWyJDT05URU5UX0xFTkdUSCJdKSl7CiAgICAgICAgICAgIHJldHVybiAoaW50KSRfU0VSVkVSWyJDT05URU5UX0xFTkdUSCJdOyAgICAgICAgICAgIAogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ0dldHRpbmcgY29udGVudCBsZW5ndGggaXMgbm90IHN1cHBvcnRlZC4nKTsKICAgICAgICB9ICAgICAgCiAgICB9ICAgCn0=]]></data>
	</file>
	<file>
	  <filename>/lib/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/css/.DS_Store</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[AAAAAUJ1ZDEAABAAAAAIAAAAEAAAAAAlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAABAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAgLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAACAAAAABAAAAQAAAAAEAAACAAAAAAQAAAQAAAAABAAACAAAAAAEAAAQAAAAAAAAAAAEAABAAAAAAAQAAIAAAAAABAABAAAAAAAEAAIAAAAAAAQABAAAAAAABAAIAAAAAAAEABAAAAAAAAQAIAAAAAAABABAAAAAAAAEAIAAAAAAAAQBAAAAAAAABAIAAAAAAAAEBAAAAAAAAAQIAAAAAAAABBAAAAAAAAAEIAAAAAAAAARAAAAAAAAABIAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAEAsAAABFAAAAJQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBERTREIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAYAAAAAAAAAABAAAAgAAAAAEAAAEAAAAAAQAAAgAAAAABAAAEAAAAAAIAAAgAAAAYAAAAAAAAAAABAAAgAAAAAAEAAEAAAAAAAQAAgAAAAAABAAEAAAAAAAEAAgAAAAAAAQAEAAAAAAABAAgAAAAAAAEAEAAAAAAAAQAgAAAAAAABAEAAAAAAAAEAgAAAAAAAAQEAAAAAAAABAgAAAAAAAAEEAAAAAAAAAQgAAAAAAAABEAAAAAAAAAEgAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==]]></data>
	</file>
	<file>
	  <filename>/lib/css/admin.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmVkaXRhYmxlOmhvdmVyCnsKLyogIHBhZGRpbmctbGVmdDogMjBweDsqLwogIGJhY2tncm91bmQtaW1hZ2U6IHVybCgnL21vZHVsZXMvTUNNZWRpYXMvaW1hZ2VzL3BlbmNpbC5wbmcnKTsKICBiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7Ci8qICBiYWNrZ3JvdW5kLWF0dGFjaG1lbnQ6Zml4ZWQ7Ki8KICBiYWNrZ3JvdW5kLXBvc2l0aW9uOnJpZ2h0Owp9]]></data>
	</file>
	<file>
	  <filename>/lib/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/js/.DS_Store</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[AAAAAUJ1ZDEAABAAAAAIAAAAEAAAAACGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAEAAAABAAAQAAB1AHAAbABvAGEAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAMAGYAaQBuAGUAdQBwAGwAbwBhAGQAZQByZHNjbGJvb2wBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAgLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAACAAAAABAAAAQAAAAAEAAACAAAAAAQAAAQAAAAABAAACAAAAAAEAAAQAAAAAAAAAAAEAABAAAAAAAQAAIAAAAAABAABAAAAAAAEAAIAAAAAAAQABAAAAAAABAAIAAAAAAAEABAAAAAAAAQAIAAAAAAABABAAAAAAAAEAIAAAAAAAAQBAAAAAAAABAIAAAAAAAAEBAAAAAAAAAQIAAAAAAAABBAAAAAAAAAEIAAAAAAAAARAAAAAAAAABIAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAEAsAAABFAAAAhgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBERTREIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAIAAAAGAAAAABAAAAwAAAAAAAAAABAAABAAAAAAEAAAIAAAAAAQAABAAAAAACAAAIAAAAGAAAAAAAAAAAAQAAIAAAAAABAABAAAAAAAEAAIAAAAAAAQABAAAAAAABAAIAAAAAAAEABAAAAAAAAQAIAAAAAAABABAAAAAAAAEAIAAAAAAAAQBAAAAAAAABAIAAAAAAAAEBAAAAAAAAAQIAAAAAAAABBAAAAAAAAAEIAAAAAAAAARAAAAAAAAABIAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==]]></data>
	</file>
	<file>
	  <filename>/lib/js/fineuploader/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/js/fineuploader/fineuploader-3.4.1.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogQ29weXJpZ2h0IDIwMTMsIFdpZGVuIEVudGVycHJpc2VzIGluZm9AZmluZXVwbG9hZGVyLmNvbQogKgogKiBMaWNlbnNlZCB1bmRlciBHTlUgR1BMIHYzLCBzZWUgbGljZW5zZS50eHQuCiAqLwoucXEtdXBsb2FkZXIgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IDEwMCU7Cn0KLnFxLXVwbG9hZC1idXR0b24gewogICAgZGlzcGxheTogYmxvY2s7CiAgICB3aWR0aDogMTA1cHg7CiAgICBwYWRkaW5nOiA3cHggMDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIGJhY2tncm91bmQ6ICM4ODAwMDA7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0RERDsKICAgIGNvbG9yOiAjRkZGOwp9Ci5xcS11cGxvYWQtYnV0dG9uLWhvdmVyIHsKICAgIGJhY2tncm91bmQ6ICNDQzAwMDA7Cn0KLnFxLXVwbG9hZC1idXR0b24tZm9jdXMgewogICAgb3V0bGluZTogMXB4IGRvdHRlZCAjMDAwMDAwOwp9Ci5xcS11cGxvYWQtZHJvcC1hcmVhLCAucXEtdXBsb2FkLWV4dHJhLWRyb3AtYXJlYSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDA7CiAgICBsZWZ0OiAwOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBtaW4taGVpZ2h0OiAzMHB4OwogICAgei1pbmRleDogMjsKICAgIGJhY2tncm91bmQ6ICNGRjk3OTc7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KLnFxLXVwbG9hZC1kcm9wLWFyZWEgc3BhbiB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogNTAlOwogICAgd2lkdGg6IDEwMCU7CiAgICBtYXJnaW4tdG9wOiAtOHB4OwogICAgZm9udC1zaXplOiAxNnB4Owp9Ci5xcS11cGxvYWQtZXh0cmEtZHJvcC1hcmVhIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIG1hcmdpbi10b3A6IDUwcHg7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICBwYWRkaW5nLXRvcDogMzBweDsKICAgIGhlaWdodDogMjBweDsKICAgIG1pbi1oZWlnaHQ6IDQwcHg7Cn0KLnFxLXVwbG9hZC1kcm9wLWFyZWEtYWN0aXZlIHsKICAgIGJhY2tncm91bmQ6ICNGRjcxNzE7Cn0KLnFxLXVwbG9hZC1saXN0IHsKICAgIG1hcmdpbjogMDsKICAgIHBhZGRpbmc6IDA7CiAgICBsaXN0LXN0eWxlOiBub25lOwp9Ci5xcS11cGxvYWQtbGlzdCBsaSB7CiAgICBtYXJnaW46IDA7CiAgICBwYWRkaW5nOiA5cHg7CiAgICBsaW5lLWhlaWdodDogMTVweDsKICAgIGZvbnQtc2l6ZTogMTZweDsKICAgIGJhY2tncm91bmQtY29sb3I6ICNGRkYwQkQ7Cn0KLnFxLXVwbG9hZC1maWxlLCAucXEtdXBsb2FkLXNwaW5uZXIsIC5xcS11cGxvYWQtc2l6ZSwgLnFxLXVwbG9hZC1jYW5jZWwsIC5xcS11cGxvYWQtcmV0cnksIC5xcS11cGxvYWQtZmFpbGVkLXRleHQsIC5xcS11cGxvYWQtZmluaXNoZWQsIC5xcS11cGxvYWQtZGVsZXRlIHsKICAgIG1hcmdpbi1yaWdodDogMTJweDsKfQoucXEtdXBsb2FkLWZpbGUgewp9Ci5xcS11cGxvYWQtc3Bpbm5lciB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICBiYWNrZ3JvdW5kOiB1cmwoImxvYWRpbmcuZ2lmIik7CiAgICB3aWR0aDogMTVweDsKICAgIGhlaWdodDogMTVweDsKICAgIHZlcnRpY2FsLWFsaWduOiB0ZXh0LWJvdHRvbTsKfQoucXEtZHJvcC1wcm9jZXNzaW5nIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KLnFxLWRyb3AtcHJvY2Vzc2luZy1zcGlubmVyIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIGJhY2tncm91bmQ6IHVybCgicHJvY2Vzc2luZy5naWYiKTsKICAgIHdpZHRoOiAyNHB4OwogICAgaGVpZ2h0OiAyNHB4OwogICAgdmVydGljYWwtYWxpZ246IHRleHQtYm90dG9tOwp9Ci5xcS11cGxvYWQtZmluaXNoZWQgewogICAgZGlzcGxheTpub25lOwogICAgd2lkdGg6MTVweDsKICAgIGhlaWdodDoxNXB4OwogICAgdmVydGljYWwtYWxpZ246dGV4dC1ib3R0b207Cn0KLnFxLXVwbG9hZC1yZXRyeSwgLnFxLXVwbG9hZC1kZWxldGUgewogICAgZGlzcGxheTogbm9uZTsKICAgIGNvbG9yOiAjMDAwMDAwOwp9Ci5xcS11cGxvYWQtY2FuY2VsLCAucXEtdXBsb2FkLWRlbGV0ZSB7Cgljb2xvcjogIzAwMDAwMDsKfQoucXEtdXBsb2FkLXJldHJ5YWJsZSAucXEtdXBsb2FkLXJldHJ5IHsKICAgIGRpc3BsYXk6IGlubGluZTsKfQoucXEtdXBsb2FkLXNpemUsIC5xcS11cGxvYWQtY2FuY2VsLCAucXEtdXBsb2FkLXJldHJ5LCAucXEtdXBsb2FkLWRlbGV0ZSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogbm9ybWFsOwp9Ci5xcS11cGxvYWQtZmFpbGVkLXRleHQgewogICAgZGlzcGxheTogbm9uZTsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwp9Ci5xcS11cGxvYWQtZmFpbGVkLWljb24gewogICAgZGlzcGxheTpub25lOwogICAgd2lkdGg6MTVweDsKICAgIGhlaWdodDoxNXB4OwogICAgdmVydGljYWwtYWxpZ246dGV4dC1ib3R0b207Cn0KLnFxLXVwbG9hZC1mYWlsIC5xcS11cGxvYWQtZmFpbGVkLXRleHQgewogICAgZGlzcGxheTogaW5saW5lOwp9Ci5xcS11cGxvYWQtcmV0cnlpbmcgLnFxLXVwbG9hZC1mYWlsZWQtdGV4dCB7CiAgICBkaXNwbGF5OiBpbmxpbmU7CiAgICBjb2xvcjogI0Q2MDAwMDsKfQoucXEtdXBsb2FkLWxpc3QgbGkucXEtdXBsb2FkLXN1Y2Nlc3MgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzVEQTMwQzsKICAgIGNvbG9yOiAjRkZGRkZGOwp9Ci5xcS11cGxvYWQtbGlzdCBsaS5xcS11cGxvYWQtZmFpbCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRDYwMDAwOwogICAgY29sb3I6ICNGRkZGRkY7Cn0KLnFxLXByb2dyZXNzLWJhciB7CiAgICBiYWNrZ3JvdW5kOiAtbW96LWxpbmVhci1ncmFkaWVudCh0b3AsICByZ2JhKDMwLDg3LDE1MywxKSAwJSwgcmdiYSg0MSwxMzcsMjE2LDEpIDUwJSwgcmdiYSgzMiwxMjQsMjAyLDEpIDUxJSwgcmdiYSgxMjUsMTg1LDIzMiwxKSAxMDAlKTsgLyogRkYzLjYrICovCiAgICBiYWNrZ3JvdW5kOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgbGVmdCB0b3AsIGxlZnQgYm90dG9tLCBjb2xvci1zdG9wKDAlLHJnYmEoMzAsODcsMTUzLDEpKSwgY29sb3Itc3RvcCg1MCUscmdiYSg0MSwxMzcsMjE2LDEpKSwgY29sb3Itc3RvcCg1MSUscmdiYSgzMiwxMjQsMjAyLDEpKSwgY29sb3Itc3RvcCgxMDAlLHJnYmEoMTI1LDE4NSwyMzIsMSkpKTsgLyogQ2hyb21lLFNhZmFyaTQrICovCiAgICBiYWNrZ3JvdW5kOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsICByZ2JhKDMwLDg3LDE1MywxKSAwJSxyZ2JhKDQxLDEzNywyMTYsMSkgNTAlLHJnYmEoMzIsMTI0LDIwMiwxKSA1MSUscmdiYSgxMjUsMTg1LDIzMiwxKSAxMDAlKTsgLyogQ2hyb21lMTArLFNhZmFyaTUuMSsgKi8KICAgIGJhY2tncm91bmQ6IC1vLWxpbmVhci1ncmFkaWVudCh0b3AsICByZ2JhKDMwLDg3LDE1MywxKSAwJSxyZ2JhKDQxLDEzNywyMTYsMSkgNTAlLHJnYmEoMzIsMTI0LDIwMiwxKSA1MSUscmdiYSgxMjUsMTg1LDIzMiwxKSAxMDAlKTsgLyogT3BlcmEgMTEuMTArICovCiAgICBiYWNrZ3JvdW5kOiAtbXMtbGluZWFyLWdyYWRpZW50KHRvcCwgIHJnYmEoMzAsODcsMTUzLDEpIDAlLHJnYmEoNDEsMTM3LDIxNiwxKSA1MCUscmdiYSgzMiwxMjQsMjAyLDEpIDUxJSxyZ2JhKDEyNSwxODUsMjMyLDEpIDEwMCUpOyAvKiBJRTEwKyAqLwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgIHJnYmEoMzAsODcsMTUzLDEpIDAlLHJnYmEoNDEsMTM3LDIxNiwxKSA1MCUscmdiYSgzMiwxMjQsMjAyLDEpIDUxJSxyZ2JhKDEyNSwxODUsMjMyLDEpIDEwMCUpOyAvKiBXM0MgKi8KICAgIHdpZHRoOiAwJTsKICAgIGhlaWdodDogMTVweDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIG1hcmdpbi1ib3R0b206IDNweDsKICAgIGRpc3BsYXk6IG5vbmU7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/js/fineuploader/fineuploader-fix.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogQ01TTVMgU1RZTEUgRklYICovCi5xcS11cGxvYWQtYnV0dG9uIHsKICB3aWR0aDogMTUwcHg7Cn0KLnFxLXVwbG9hZC1idXR0b24gZGl2IHsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQ==]]></data>
	</file>
	<file>
	  <filename>/lib/js/fineuploader/fineuploader.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogT3JpZ2luYWwgdmVyc2lvbjogMS4wIMKpIDIwMTAgQW5kcmV3IFZhbHVtcyAoIGFuZHJldyhhdCl2YWx1bXMuY29tICkKICogQ3VycmVudCBNYWludGFpbmVyICgyLjArKTogMjAxMiwgUmF5IE5pY2hvbHVzICggZmluZXVwbG9hZGVyKGF0KWdhcnN0YXNpby5jb20gKQogKgogKiBMaWNlbnNlZCB1bmRlciBNSVQgbGljZW5zZSwgR05VIEdQTCAyIG9yIGxhdGVyLCBHTlUgTEdQTCAyIG9yIGxhdGVyLCBzZWUgbGljZW5zZS50eHQuCiAqLwoucXEtdXBsb2FkZXIgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IDEwMCU7Cn0KLnFxLXVwbG9hZC1idXR0b24gewogICAgZGlzcGxheTogYmxvY2s7CiAgICAvKm9yIGlubGluZS1ibG9jayovCiAgICB3aWR0aDogMTA1cHg7CiAgICBwYWRkaW5nOiA3cHggMDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIGJhY2tncm91bmQ6ICM4ODAwMDA7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0RERDsKICAgIGNvbG9yOiAjRkZGOwp9Ci5xcS11cGxvYWQtYnV0dG9uLWhvdmVyIHsKICAgIGJhY2tncm91bmQ6ICNDQzAwMDA7Cn0KLnFxLXVwbG9hZC1idXR0b24tZm9jdXMgewogICAgb3V0bGluZTogMXB4IGRvdHRlZCAjMDAwMDAwOwp9Ci5xcS11cGxvYWQtZHJvcC1hcmVhLCAucXEtdXBsb2FkLWV4dHJhLWRyb3AtYXJlYSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDA7CiAgICBsZWZ0OiAwOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBtaW4taGVpZ2h0OiAzMHB4OwogICAgei1pbmRleDogMjsKICAgIGJhY2tncm91bmQ6ICNGRjk3OTc7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KLnFxLXVwbG9hZC1kcm9wLWFyZWEgc3BhbiB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogNTAlOwogICAgd2lkdGg6IDEwMCU7CiAgICBtYXJnaW4tdG9wOiAtOHB4OwogICAgZm9udC1zaXplOiAxNnB4Owp9Ci5xcS11cGxvYWQtZXh0cmEtZHJvcC1hcmVhIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIG1hcmdpbi10b3A6IDUwcHg7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICBwYWRkaW5nLXRvcDogMzBweDsKICAgIGhlaWdodDogMjBweDsKICAgIG1pbi1oZWlnaHQ6IDQwcHg7Cn0KLnFxLXVwbG9hZC1kcm9wLWFyZWEtYWN0aXZlIHsKICAgIGJhY2tncm91bmQ6ICNGRjcxNzE7Cn0KLnFxLXVwbG9hZC1saXN0IHsKICAgIG1hcmdpbjogMDsKICAgIHBhZGRpbmc6IDA7CiAgICBsaXN0LXN0eWxlOiBub25lOwp9Ci5xcS11cGxvYWQtbGlzdCBsaSB7CiAgICBtYXJnaW46IDA7CiAgICBwYWRkaW5nOiA5cHg7CiAgICBsaW5lLWhlaWdodDogMTVweDsKICAgIGZvbnQtc2l6ZTogMTZweDsKICAgIGJhY2tncm91bmQtY29sb3I6ICNGRkYwQkQ7Cn0KLnFxLXVwbG9hZC1maWxlLCAucXEtdXBsb2FkLXNwaW5uZXIsIC5xcS11cGxvYWQtc2l6ZSwgLnFxLXVwbG9hZC1jYW5jZWwsIC5xcS11cGxvYWQtcmV0cnksIC5xcS11cGxvYWQtZmFpbGVkLXRleHQsIC5xcS11cGxvYWQtZmluaXNoZWQgewogICAgbWFyZ2luLXJpZ2h0OiAxMnB4Owp9Ci5xcS11cGxvYWQtZmlsZSB7Cn0KLnFxLXVwbG9hZC1zcGlubmVyIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIGJhY2tncm91bmQ6IHVybCgibG9hZGluZy5naWYiKTsKICAgIHdpZHRoOiAxNXB4OwogICAgaGVpZ2h0OiAxNXB4OwogICAgdmVydGljYWwtYWxpZ246IHRleHQtYm90dG9tOwp9Ci5xcS11cGxvYWQtZmluaXNoZWQgewogICAgZGlzcGxheTpub25lOwogICAgd2lkdGg6MTVweDsKICAgIGhlaWdodDoxNXB4OwogICAgdmVydGljYWwtYWxpZ246dGV4dC1ib3R0b207Cn0KLnFxLXVwbG9hZC1yZXRyeSB7CiAgICBkaXNwbGF5OiBub25lOwogICAgY29sb3I6ICMwMDAwMDA7Cn0KLnFxLXVwbG9hZC1jYW5jZWwgewoJY29sb3I6ICMwMDAwMDA7Cn0KLnFxLXVwbG9hZC1yZXRyeWFibGUgLnFxLXVwbG9hZC1yZXRyeSB7CiAgICBkaXNwbGF5OiBpbmxpbmU7Cn0KLnFxLXVwbG9hZC1zaXplLCAucXEtdXBsb2FkLWNhbmNlbCwgLnFxLXVwbG9hZC1yZXRyeSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogbm9ybWFsOwp9Ci5xcS11cGxvYWQtZmFpbGVkLXRleHQgewogICAgZGlzcGxheTogbm9uZTsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwp9Ci5xcS11cGxvYWQtZmFpbGVkLWljb24gewogICAgZGlzcGxheTpub25lOwogICAgd2lkdGg6MTVweDsKICAgIGhlaWdodDoxNXB4OwogICAgdmVydGljYWwtYWxpZ246dGV4dC1ib3R0b207Cn0KLnFxLXVwbG9hZC1mYWlsIC5xcS11cGxvYWQtZmFpbGVkLXRleHQgewogICAgZGlzcGxheTogaW5saW5lOwp9Ci5xcS11cGxvYWQtcmV0cnlpbmcgLnFxLXVwbG9hZC1mYWlsZWQtdGV4dCB7CiAgICBkaXNwbGF5OiBpbmxpbmU7CiAgICBjb2xvcjogI0Q2MDAwMDsKfQoucXEtdXBsb2FkLWxpc3QgbGkucXEtdXBsb2FkLXN1Y2Nlc3MgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzVEQTMwQzsKICAgIGNvbG9yOiAjRkZGRkZGOwp9Ci5xcS11cGxvYWQtbGlzdCBsaS5xcS11cGxvYWQtZmFpbCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRDYwMDAwOwogICAgY29sb3I6ICNGRkZGRkY7Cn0KLnFxLXByb2dyZXNzLWJhciB7CiAgICBiYWNrZ3JvdW5kOiAtbW96LWxpbmVhci1ncmFkaWVudCh0b3AsICByZ2JhKDMwLDg3LDE1MywxKSAwJSwgcmdiYSg0MSwxMzcsMjE2LDEpIDUwJSwgcmdiYSgzMiwxMjQsMjAyLDEpIDUxJSwgcmdiYSgxMjUsMTg1LDIzMiwxKSAxMDAlKTsgLyogRkYzLjYrICovCiAgICBiYWNrZ3JvdW5kOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgbGVmdCB0b3AsIGxlZnQgYm90dG9tLCBjb2xvci1zdG9wKDAlLHJnYmEoMzAsODcsMTUzLDEpKSwgY29sb3Itc3RvcCg1MCUscmdiYSg0MSwxMzcsMjE2LDEpKSwgY29sb3Itc3RvcCg1MSUscmdiYSgzMiwxMjQsMjAyLDEpKSwgY29sb3Itc3RvcCgxMDAlLHJnYmEoMTI1LDE4NSwyMzIsMSkpKTsgLyogQ2hyb21lLFNhZmFyaTQrICovCiAgICBiYWNrZ3JvdW5kOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsICByZ2JhKDMwLDg3LDE1MywxKSAwJSxyZ2JhKDQxLDEzNywyMTYsMSkgNTAlLHJnYmEoMzIsMTI0LDIwMiwxKSA1MSUscmdiYSgxMjUsMTg1LDIzMiwxKSAxMDAlKTsgLyogQ2hyb21lMTArLFNhZmFyaTUuMSsgKi8KICAgIGJhY2tncm91bmQ6IC1vLWxpbmVhci1ncmFkaWVudCh0b3AsICByZ2JhKDMwLDg3LDE1MywxKSAwJSxyZ2JhKDQxLDEzNywyMTYsMSkgNTAlLHJnYmEoMzIsMTI0LDIwMiwxKSA1MSUscmdiYSgxMjUsMTg1LDIzMiwxKSAxMDAlKTsgLyogT3BlcmEgMTEuMTArICovCiAgICBiYWNrZ3JvdW5kOiAtbXMtbGluZWFyLWdyYWRpZW50KHRvcCwgIHJnYmEoMzAsODcsMTUzLDEpIDAlLHJnYmEoNDEsMTM3LDIxNiwxKSA1MCUscmdiYSgzMiwxMjQsMjAyLDEpIDUxJSxyZ2JhKDEyNSwxODUsMjMyLDEpIDEwMCUpOyAvKiBJRTEwKyAqLwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgIHJnYmEoMzAsODcsMTUzLDEpIDAlLHJnYmEoNDEsMTM3LDIxNiwxKSA1MCUscmdiYSgzMiwxMjQsMjAyLDEpIDUxJSxyZ2JhKDEyNSwxODUsMjMyLDEpIDEwMCUpOyAvKiBXM0MgKi8KICAgIHdpZHRoOiAwJTsKICAgIGhlaWdodDogMTVweDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIG1hcmdpbi1ib3R0b206IDNweDsKICAgIGRpc3BsYXk6IG5vbmU7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/js/fineuploader/iframe.xss.response-3.4.1.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCkgewogICAgdmFyIG1hdGNoID0gLyhcey4rXH0pLisvLmV4ZWMoZG9jdW1lbnQuYm9keS5pbm5lckhUTUwpOwogICAgaWYgKG1hdGNoKSB7CiAgICAgICAgcGFyZW50LnBvc3RNZXNzYWdlKG1hdGNoWzFdLCAnKicpOwogICAgfQp9KCkpOwo=]]></data>
	</file>
	<file>
	  <filename>/lib/js/fineuploader/jquery-plugin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCQpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciB1cGxvYWRlciwgJGVsLCBpbml0LCBkYXRhU3RvcmUsIHBsdWdpbk9wdGlvbiwgcGx1Z2luT3B0aW9ucywgYWRkQ2FsbGJhY2tzLCB0cmFuc2Zvcm1PcHRpb25zLCBpc1ZhbGlkQ29tbWFuZCwKICAgICAgICBkZWxlZ2F0ZUNvbW1hbmQ7CgogICAgcGx1Z2luT3B0aW9ucyA9IFsndXBsb2FkZXJUeXBlJ107CgogICAgaW5pdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgaWYgKG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIHhmb3JtZWRPcHRzID0gdHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zKTsKICAgICAgICAgICAgYWRkQ2FsbGJhY2tzKHhmb3JtZWRPcHRzKTsKCiAgICAgICAgICAgIGlmIChwbHVnaW5PcHRpb24oJ3VwbG9hZGVyVHlwZScpID09PSAnYmFzaWMnKSB7CiAgICAgICAgICAgICAgICB1cGxvYWRlcihuZXcgcXEuRmluZVVwbG9hZGVyQmFzaWMoeGZvcm1lZE9wdHMpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHVwbG9hZGVyKG5ldyBxcS5GaW5lVXBsb2FkZXIoeGZvcm1lZE9wdHMpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRlbDsKICAgIH07CgogICAgZGF0YVN0b3JlID0gZnVuY3Rpb24oa2V5LCB2YWwpIHsKICAgICAgICB2YXIgZGF0YSA9ICRlbC5kYXRhKCdmaW5ldXBsb2FkZXInKTsKCiAgICAgICAgaWYgKHZhbCkgewogICAgICAgICAgICBpZiAoZGF0YSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBkYXRhID0ge307CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGF0YVtrZXldID0gdmFsOwogICAgICAgICAgICAkZWwuZGF0YSgnZmluZXVwbG9hZGVyJywgZGF0YSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBpZiAoZGF0YSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZGF0YVtrZXldOwogICAgICAgIH0KICAgIH07CgogICAgLy90aGUgdW5kZXJseWluZyBGaW5lIFVwbG9hZGVyIGluc3RhbmNlIGlzIHN0b3JlZCBpbiBqUXVlcnkncyBkYXRhIHN0b3JlZCwgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbGVtZW50CiAgICAvLyB0aWVkIHRvIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIHBsdWctaW4KICAgIHVwbG9hZGVyID0gZnVuY3Rpb24oaW5zdGFuY2VUb1N0b3JlKSB7CiAgICAgICAgcmV0dXJuIGRhdGFTdG9yZSgndXBsb2FkZXInLCBpbnN0YW5jZVRvU3RvcmUpOwogICAgfTsKCiAgICBwbHVnaW5PcHRpb24gPSBmdW5jdGlvbihvcHRpb24sIG9wdGlvblZhbCkgewogICAgICAgIHJldHVybiBkYXRhU3RvcmUob3B0aW9uLCBvcHRpb25WYWwpOwogICAgfTsKCiAgICAvL2ltcGxlbWVudCBhbGwgY2FsbGJhY2tzIGRlZmluZWQgaW4gRmluZSBVcGxvYWRlciBhcyBmdW5jdGlvbnMgdGhhdCB0cmlnZ2VyIGFwcHJvcHJpYXRlbHkgbmFtZXMgZXZlbnRzIGFuZAogICAgLy8gcmV0dXJuIHRoZSByZXN1bHQgb2YgZXhlY3V0aW5nIHRoZSBib3VuZCBoYW5kbGVyIGJhY2sgdG8gRmluZSBVcGxvYWRlcgogICAgYWRkQ2FsbGJhY2tzID0gZnVuY3Rpb24odHJhbnNmb3JtZWRPcHRzKSB7CiAgICAgICAgdmFyIGNhbGxiYWNrcyA9IHRyYW5zZm9ybWVkT3B0cy5jYWxsYmFja3MgPSB7fTsKCiAgICAgICAgJC5lYWNoKG5ldyBxcS5GaW5lVXBsb2FkZXJCYXNpYygpLl9vcHRpb25zLmNhbGxiYWNrcywgZnVuY3Rpb24ocHJvcCwgZnVuYykgewogICAgICAgICAgICB2YXIgbmFtZSwgJGNhbGxiYWNrRWw7CgogICAgICAgICAgICBuYW1lID0gL15vbihcdyspLy5leGVjKHByb3ApWzFdOwogICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgMSkudG9Mb3dlckNhc2UoKSArIG5hbWUuc3Vic3RyaW5nKDEpOwogICAgICAgICAgICAkY2FsbGJhY2tFbCA9ICRlbDsKCiAgICAgICAgICAgIGNhbGxiYWNrc1twcm9wXSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgcmV0dXJuICRjYWxsYmFja0VsLnRyaWdnZXJIYW5kbGVyKG5hbWUsIGFyZ3MpOwogICAgICAgICAgICB9OwogICAgICAgIH0pOwogICAgfTsKCiAgICAvL3RyYW5zZm9ybSBqUXVlcnkgb2JqZWN0cyBpbnRvIEhUTUxFbGVtZW50cywgYW5kIHBhc3MgYWxvbmcgYWxsIG90aGVyIG9wdGlvbiBwcm9wZXJ0aWVzCiAgICB0cmFuc2Zvcm1PcHRpb25zID0gZnVuY3Rpb24oc291cmNlLCBkZXN0KSB7CiAgICAgICAgdmFyIHhmb3JtZWQsIGFycmF5VmFsczsKCiAgICAgICAgaWYgKGRlc3QgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBpZiAoc291cmNlLnVwbG9hZGVyVHlwZSAhPT0gJ2Jhc2ljJykgewogICAgICAgICAgICAgICAgeGZvcm1lZCA9IHsgZWxlbWVudCA6ICRlbFswXSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgeGZvcm1lZCA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB4Zm9ybWVkID0gZGVzdDsKICAgICAgICB9CgogICAgICAgICQuZWFjaChzb3VyY2UsIGZ1bmN0aW9uKHByb3AsIHZhbCkgewogICAgICAgICAgICBpZiAoJC5pbkFycmF5KHByb3AsIHBsdWdpbk9wdGlvbnMpID49IDApIHsKICAgICAgICAgICAgICAgIHBsdWdpbk9wdGlvbihwcm9wLCB2YWwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHZhbCBpbnN0YW5jZW9mICQpIHsKICAgICAgICAgICAgICAgIHhmb3JtZWRbcHJvcF0gPSB2YWxbMF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoJC5pc1BsYWluT2JqZWN0KHZhbCkpIHsKICAgICAgICAgICAgICAgIHhmb3JtZWRbcHJvcF0gPSB7fTsKICAgICAgICAgICAgICAgIHRyYW5zZm9ybU9wdGlvbnModmFsLCB4Zm9ybWVkW3Byb3BdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICgkLmlzQXJyYXkodmFsKSkgewogICAgICAgICAgICAgICAgYXJyYXlWYWxzID0gW107CiAgICAgICAgICAgICAgICAkLmVhY2godmFsLCBmdW5jdGlvbihpZHgsIGFycmF5VmFsKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGFycmF5VmFsIGluc3RhbmNlb2YgJCkgewogICAgICAgICAgICAgICAgICAgICAgICAkLm1lcmdlKGFycmF5VmFscywgYXJyYXlWYWwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlWYWxzLnB1c2goYXJyYXlWYWwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgeGZvcm1lZFtwcm9wXSA9IGFycmF5VmFsczsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHhmb3JtZWRbcHJvcF0gPSB2YWw7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgaWYgKGRlc3QgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICByZXR1cm4geGZvcm1lZDsKICAgICAgICB9CiAgICB9OwoKICAgIGlzVmFsaWRDb21tYW5kID0gZnVuY3Rpb24oY29tbWFuZCkgewogICAgICAgIHJldHVybiAkLnR5cGUoY29tbWFuZCkgPT09ICJzdHJpbmciICYmCiAgICAgICAgICAgICFjb21tYW5kLm1hdGNoKC9eXy8pICYmIC8vZW5mb3JjZSBwcml2YXRlIG1ldGhvZHMgY29udmVudGlvbgogICAgICAgICAgICB1cGxvYWRlcigpW2NvbW1hbmRdICE9PSB1bmRlZmluZWQ7CiAgICB9OwoKICAgIC8vYXNzdW1pbmcgd2UgaGF2ZSBhbHJlYWR5IHZlcmlmaWVkIHRoYXQgdGhpcyBpcyBhIHZhbGlkIGNvbW1hbmQsIGNhbGwgdGhlIGFzc29jaWF0ZWQgZnVuY3Rpb24gaW4gdGhlIHVuZGVybHlpbmcKICAgIC8vIEZpbmUgVXBsb2FkZXIgaW5zdGFuY2UgKHBhc3NpbmcgYWxvbmcgdGhlIGFyZ3VtZW50cyBmcm9tIHRoZSBjYWxsZXIpIGFuZCByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgY2FsbCBiYWNrIHRvIHRoZSBjYWxsZXIKICAgIGRlbGVnYXRlQ29tbWFuZCA9IGZ1bmN0aW9uKGNvbW1hbmQpIHsKICAgICAgICByZXR1cm4gdXBsb2FkZXIoKVtjb21tYW5kXS5hcHBseSh1cGxvYWRlcigpLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTsKICAgIH07CgogICAgJC5mbi5maW5lVXBsb2FkZXIgPSBmdW5jdGlvbihvcHRpb25zT3JDb21tYW5kKSB7CiAgICAgICAgJGVsID0gdGhpczsKCiAgICAgICAgaWYgKHVwbG9hZGVyKCkgJiYgaXNWYWxpZENvbW1hbmQob3B0aW9uc09yQ29tbWFuZCkpIHsKICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlQ29tbWFuZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh0eXBlb2Ygb3B0aW9uc09yQ29tbWFuZCA9PT0gJ29iamVjdCcgfHwgIW9wdGlvbnNPckNvbW1hbmQpIHsKICAgICAgICAgICAgcmV0dXJuIGluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICQuZXJyb3IoJ01ldGhvZCAnICsgIG9wdGlvbnNPckNvbW1hbmQgKyAnIGRvZXMgbm90IGV4aXN0IG9uIGpRdWVyeS5maW5lVXBsb2FkZXInKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB0aGlzOwogICAgfTsKCn0oalF1ZXJ5KSk7]]></data>
	</file>
	<file>
	  <filename>/lib/js/fineuploader/jquery.fineuploader-3.0.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGh0dHA6Ly9naXRodWIuY29tL1ZhbHVtcy1GaWxlLVVwbG9hZGVyL2ZpbGUtdXBsb2FkZXIKICoKICogTXVsdGlwbGUgZmlsZSB1cGxvYWQgY29tcG9uZW50IHdpdGggcHJvZ3Jlc3MtYmFyLCBkcmFnLWFuZC1kcm9wLCBzdXBwb3J0IGZvciBhbGwgbW9kZXJuIGJyb3dzZXJzLgogKgogKiBPcmlnaW5hbCB2ZXJzaW9uOiAxLjAgwqkgMjAxMCBBbmRyZXcgVmFsdW1zICggYW5kcmV3KGF0KXZhbHVtcy5jb20gKQogKiBDdXJyZW50IE1haW50YWluZXIgKDIuMCspOiDCqSAyMDEyLCBSYXkgTmljaG9sdXMgKCBmaW5ldXBsb2FkZXIoYXQpZ2Fyc3Rhc2lvLmNvbSApCiAqCiAqIExpY2Vuc2VkIHVuZGVyIE1JVCBsaWNlbnNlLCBHTlUgR1BMIDIgb3IgbGF0ZXIsIEdOVSBMR1BMIDIgb3IgbGF0ZXIsIHNlZSBsaWNlbnNlLnR4dC4KICovCgp2YXIgcXEgPSBxcSB8fCB7fTsKdmFyIHFxID0gZnVuY3Rpb24oZWxlbWVudCkgewogICAgInVzZSBzdHJpY3QiOwoKICAgIHJldHVybiB7CiAgICAgICAgaGlkZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqIFJldHVybnMgdGhlIGZ1bmN0aW9uIHdoaWNoIGRldGFjaGVzIGF0dGFjaGVkIGV2ZW50ICovCiAgICAgICAgYXR0YWNoOiBmdW5jdGlvbih0eXBlLCBmbikgewogICAgICAgICAgICBpZiAoZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKXsKICAgICAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBmbiwgZmFsc2UpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuYXR0YWNoRXZlbnQpewogICAgICAgICAgICAgICAgZWxlbWVudC5hdHRhY2hFdmVudCgnb24nICsgdHlwZSwgZm4pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHFxKGVsZW1lbnQpLmRldGFjaCh0eXBlLCBmbik7CiAgICAgICAgICAgIH07CiAgICAgICAgfSwKCiAgICAgICAgZGV0YWNoOiBmdW5jdGlvbih0eXBlLCBmbikgewogICAgICAgICAgICBpZiAoZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKXsKICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBmbiwgZmFsc2UpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuYXR0YWNoRXZlbnQpewogICAgICAgICAgICAgICAgZWxlbWVudC5kZXRhY2hFdmVudCgnb24nICsgdHlwZSwgZm4pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0sCgogICAgICAgIGNvbnRhaW5zOiBmdW5jdGlvbihkZXNjZW5kYW50KSB7CiAgICAgICAgICAgIC8vIGNvbXBhcmVwb3NpdGlvbiByZXR1cm5zIGZhbHNlIGluIHRoaXMgY2FzZQogICAgICAgICAgICBpZiAoZWxlbWVudCA9PSBkZXNjZW5kYW50KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGVsZW1lbnQuY29udGFpbnMpewogICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuY29udGFpbnMoZGVzY2VuZGFudCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gISEoZGVzY2VuZGFudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihlbGVtZW50KSAmIDgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSW5zZXJ0IHRoaXMgZWxlbWVudCBiZWZvcmUgZWxlbWVudEIuCiAgICAgICAgICovCiAgICAgICAgaW5zZXJ0QmVmb3JlOiBmdW5jdGlvbihlbGVtZW50QikgewogICAgICAgICAgICBlbGVtZW50Qi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlbGVtZW50LCBlbGVtZW50Qik7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0sCgogICAgICAgIHJlbW92ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtZW50KTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyBzdHlsZXMgZm9yIGFuIGVsZW1lbnQuCiAgICAgICAgICogRml4ZXMgb3BhY2l0eSBpbiBJRTYtOC4KICAgICAgICAgKi8KICAgICAgICBjc3M6IGZ1bmN0aW9uKHN0eWxlcykgewogICAgICAgICAgICBpZiAoc3R5bGVzLm9wYWNpdHkgIT0gbnVsbCl7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQuc3R5bGUub3BhY2l0eSAhPSAnc3RyaW5nJyAmJiB0eXBlb2YoZWxlbWVudC5maWx0ZXJzKSAhPSAndW5kZWZpbmVkJyl7CiAgICAgICAgICAgICAgICAgICAgc3R5bGVzLmZpbHRlciA9ICdhbHBoYShvcGFjaXR5PScgKyBNYXRoLnJvdW5kKDEwMCAqIHN0eWxlcy5vcGFjaXR5KSArICcpJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBxcS5leHRlbmQoZWxlbWVudC5zdHlsZSwgc3R5bGVzKTsKCiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0sCgogICAgICAgIGhhc0NsYXNzOiBmdW5jdGlvbihuYW1lKSB7CiAgICAgICAgICAgIHZhciByZSA9IG5ldyBSZWdFeHAoJyhefCApJyArIG5hbWUgKyAnKCB8JCknKTsKICAgICAgICAgICAgcmV0dXJuIHJlLnRlc3QoZWxlbWVudC5jbGFzc05hbWUpOwogICAgICAgIH0sCgogICAgICAgIGFkZENsYXNzOiBmdW5jdGlvbihuYW1lKSB7CiAgICAgICAgICAgIGlmICghcXEoZWxlbWVudCkuaGFzQ2xhc3MobmFtZSkpewogICAgICAgICAgICAgICAgZWxlbWVudC5jbGFzc05hbWUgKz0gJyAnICsgbmFtZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9LAoKICAgICAgICByZW1vdmVDbGFzczogZnVuY3Rpb24obmFtZSkgewogICAgICAgICAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKCcoXnwgKScgKyBuYW1lICsgJyggfCQpJyk7CiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gZWxlbWVudC5jbGFzc05hbWUucmVwbGFjZShyZSwgJyAnKS5yZXBsYWNlKC9eXHMrfFxzKyQvZywgIiIpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9LAoKICAgICAgICBnZXRCeUNsYXNzOiBmdW5jdGlvbihjbGFzc05hbWUpIHsKICAgICAgICAgICAgaWYgKGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCl7CiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuJyArIGNsYXNzTmFtZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTsKICAgICAgICAgICAgdmFyIGNhbmRpZGF0ZXMgPSBlbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7CiAgICAgICAgICAgIHZhciBsZW4gPSBjYW5kaWRhdGVzLmxlbmd0aDsKCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspewogICAgICAgICAgICAgICAgaWYgKHFxKGNhbmRpZGF0ZXNbaV0pLmhhc0NsYXNzKGNsYXNzTmFtZSkpewogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNhbmRpZGF0ZXNbaV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKCiAgICAgICAgY2hpbGRyZW46IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgY2hpbGRyZW4gPSBbXSwKICAgICAgICAgICAgICAgIGNoaWxkID0gZWxlbWVudC5maXJzdENoaWxkOwoKICAgICAgICAgICAgd2hpbGUgKGNoaWxkKXsKICAgICAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PSAxKXsKICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbjsKICAgICAgICB9LAoKICAgICAgICBzZXRUZXh0OiBmdW5jdGlvbih0ZXh0KSB7CiAgICAgICAgICAgIGVsZW1lbnQuaW5uZXJUZXh0ID0gdGV4dDsKICAgICAgICAgICAgZWxlbWVudC50ZXh0Q29udGVudCA9IHRleHQ7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0sCgogICAgICAgIGNsZWFyVGV4dDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBxcShlbGVtZW50KS5zZXRUZXh0KCIiKTsKICAgICAgICB9CiAgICB9Owp9OwoKcXEubG9nID0gZnVuY3Rpb24obWVzc2FnZSwgbGV2ZWwpIHsKICAgIGlmICh3aW5kb3cuY29uc29sZSkgewogICAgICAgIGlmICghbGV2ZWwgfHwgbGV2ZWwgPT09ICdpbmZvJykgewogICAgICAgICAgICB3aW5kb3cuY29uc29sZS5sb2cobWVzc2FnZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGlmICh3aW5kb3cuY29uc29sZVtsZXZlbF0pIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5jb25zb2xlW2xldmVsXShtZXNzYWdlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5jb25zb2xlLmxvZygnPCcgKyBsZXZlbCArICc+ICcgKyBtZXNzYWdlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfTsKCnFxLmlzT2JqZWN0ID0gZnVuY3Rpb24odmFyaWFibGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHJldHVybiB2YXJpYWJsZSAhPT0gbnVsbCAmJiB2YXJpYWJsZSAmJiB0eXBlb2YodmFyaWFibGUpID09PSAib2JqZWN0IiAmJiB2YXJpYWJsZS5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0Owp9OwoKcXEuZXh0ZW5kID0gZnVuY3Rpb24gKGZpcnN0LCBzZWNvbmQsIGV4dGVuZE5lc3RlZCkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIHByb3A7CiAgICBmb3IgKHByb3AgaW4gc2Vjb25kKSB7CiAgICAgICAgaWYgKHNlY29uZC5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgICBpZiAoZXh0ZW5kTmVzdGVkICYmIHFxLmlzT2JqZWN0KHNlY29uZFtwcm9wXSkpIHsKICAgICAgICAgICAgICAgIGlmIChmaXJzdFtwcm9wXSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgZmlyc3RbcHJvcF0gPSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHFxLmV4dGVuZChmaXJzdFtwcm9wXSwgc2Vjb25kW3Byb3BdLCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGZpcnN0W3Byb3BdID0gc2Vjb25kW3Byb3BdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9OwoKLyoqCiAqIFNlYXJjaGVzIGZvciBhIGdpdmVuIGVsZW1lbnQgaW4gdGhlIGFycmF5LCByZXR1cm5zIC0xIGlmIGl0IGlzIG5vdCBwcmVzZW50LgogKiBAcGFyYW0ge051bWJlcn0gW2Zyb21dIFRoZSBpbmRleCBhdCB3aGljaCB0byBiZWdpbiB0aGUgc2VhcmNoCiAqLwpxcS5pbmRleE9mID0gZnVuY3Rpb24oYXJyLCBlbHQsIGZyb20pewogICAgaWYgKGFyci5pbmRleE9mKSByZXR1cm4gYXJyLmluZGV4T2YoZWx0LCBmcm9tKTsKCiAgICBmcm9tID0gZnJvbSB8fCAwOwogICAgdmFyIGxlbiA9IGFyci5sZW5ndGg7CgogICAgaWYgKGZyb20gPCAwKSBmcm9tICs9IGxlbjsKCiAgICBmb3IgKDsgZnJvbSA8IGxlbjsgZnJvbSsrKXsKICAgICAgICBpZiAoZnJvbSBpbiBhcnIgJiYgYXJyW2Zyb21dID09PSBlbHQpewogICAgICAgICAgICByZXR1cm4gZnJvbTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gLTE7Cn07CgpxcS5nZXRVbmlxdWVJZCA9IChmdW5jdGlvbigpewogICAgdmFyIGlkID0gMDsKICAgIHJldHVybiBmdW5jdGlvbigpeyByZXR1cm4gaWQrKzsgfTsKfSkoKTsKCi8vCi8vIEJyb3dzZXJzIGFuZCBwbGF0Zm9ybXMgZGV0ZWN0aW9uCgpxcS5pZSAgICAgICA9IGZ1bmN0aW9uKCl7IHJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ01TSUUnKSAhPSAtMTsgfQpxcS5pZTEwICAgICA9IGZ1bmN0aW9uKCl7IHJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ01TSUUgMTAnKSAhPSAtMTsgfQpxcS5zYWZhcmkgICA9IGZ1bmN0aW9uKCl7IHJldHVybiBuYXZpZ2F0b3IudmVuZG9yICE9IHVuZGVmaW5lZCAmJiBuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIikgIT0gLTE7IH0KcXEuY2hyb21lICAgPSBmdW5jdGlvbigpeyByZXR1cm4gbmF2aWdhdG9yLnZlbmRvciAhPSB1bmRlZmluZWQgJiYgbmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCdHb29nbGUnKSAhPSAtMTsgfQpxcS5maXJlZm94ICA9IGZ1bmN0aW9uKCl7IHJldHVybiAobmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdNb3ppbGxhJykgIT0gLTEgJiYgbmF2aWdhdG9yLnZlbmRvciAhPSB1bmRlZmluZWQgJiYgbmF2aWdhdG9yLnZlbmRvciA9PSAnJyk7IH0KcXEud2luZG93cyAgPSBmdW5jdGlvbigpeyByZXR1cm4gbmF2aWdhdG9yLnBsYXRmb3JtID09ICJXaW4zMiI7IH0KCi8vCi8vIEV2ZW50cwoKcXEucHJldmVudERlZmF1bHQgPSBmdW5jdGlvbihlKXsKICAgIGlmIChlLnByZXZlbnREZWZhdWx0KXsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICB9IGVsc2V7CiAgICAgICAgZS5yZXR1cm5WYWx1ZSA9IGZhbHNlOwogICAgfQp9OwoKLyoqCiAqIENyZWF0ZXMgYW5kIHJldHVybnMgZWxlbWVudCBmcm9tIGh0bWwgc3RyaW5nCiAqIFVzZXMgaW5uZXJIVE1MIHRvIGNyZWF0ZSBhbiBlbGVtZW50CiAqLwpxcS50b0VsZW1lbnQgPSAoZnVuY3Rpb24oKXsKICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIHJldHVybiBmdW5jdGlvbihodG1sKXsKICAgICAgICBkaXYuaW5uZXJIVE1MID0gaHRtbDsKICAgICAgICB2YXIgZWxlbWVudCA9IGRpdi5maXJzdENoaWxkOwogICAgICAgIGRpdi5yZW1vdmVDaGlsZChlbGVtZW50KTsKICAgICAgICByZXR1cm4gZWxlbWVudDsKICAgIH07Cn0pKCk7CgovKioKICogb2JqMnVybCgpIHRha2VzIGEganNvbi1vYmplY3QgYXMgYXJndW1lbnQgYW5kIGdlbmVyYXRlcwogKiBhIHF1ZXJ5c3RyaW5nLiBwcmV0dHkgbXVjaCBsaWtlIGpRdWVyeS5wYXJhbSgpCiAqCiAqIGhvdyB0byB1c2U6CiAqCiAqICAgIGBxcS5vYmoydXJsKHthOidiJyxjOidkJ30sJ2h0dHA6Ly9hbnkudXJsL3VwbG9hZD9vdGhlclBhcmFtPXZhbHVlJyk7YAogKgogKiB3aWxsIHJlc3VsdCBpbjoKICoKICogICAgYGh0dHA6Ly9hbnkudXJsL3VwbG9hZD9vdGhlclBhcmFtPXZhbHVlJmE9YiZjPWRgCiAqCiAqIEBwYXJhbSAgT2JqZWN0IEpTT04tT2JqZWN0CiAqIEBwYXJhbSAgU3RyaW5nIGN1cnJlbnQgcXVlcnlzdHJpbmctcGFydAogKiBAcmV0dXJuIFN0cmluZyBlbmNvZGVkIHF1ZXJ5c3RyaW5nCiAqLwpxcS5vYmoydXJsID0gZnVuY3Rpb24ob2JqLCB0ZW1wLCBwcmVmaXhEb25lKXsKICAgIHZhciB1cmlzdHJpbmdzID0gW10sCiAgICAgICAgcHJlZml4ID0gJyYnLAogICAgICAgIGFkZCA9IGZ1bmN0aW9uKG5leHRPYmosIGkpewogICAgICAgICAgICB2YXIgbmV4dFRlbXAgPSB0ZW1wCiAgICAgICAgICAgICAgICA/ICgvXFtcXSQvLnRlc3QodGVtcCkpIC8vIHByZXZlbnQgZG91YmxlLWVuY29kaW5nCiAgICAgICAgICAgICAgICA/IHRlbXAKICAgICAgICAgICAgICAgIDogdGVtcCsnWycraSsnXScKICAgICAgICAgICAgICAgIDogaTsKICAgICAgICAgICAgaWYgKChuZXh0VGVtcCAhPSAndW5kZWZpbmVkJykgJiYgKGkgIT0gJ3VuZGVmaW5lZCcpKSB7CiAgICAgICAgICAgICAgICB1cmlzdHJpbmdzLnB1c2goCiAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiBuZXh0T2JqID09PSAnb2JqZWN0JykKICAgICAgICAgICAgICAgICAgICAgICAgPyBxcS5vYmoydXJsKG5leHRPYmosIG5leHRUZW1wLCB0cnVlKQogICAgICAgICAgICAgICAgICAgICAgICA6IChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobmV4dE9iaikgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXScpCiAgICAgICAgICAgICAgICAgICAgICAgID8gZW5jb2RlVVJJQ29tcG9uZW50KG5leHRUZW1wKSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudChuZXh0T2JqKCkpCiAgICAgICAgICAgICAgICAgICAgICAgIDogZW5jb2RlVVJJQ29tcG9uZW50KG5leHRUZW1wKSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudChuZXh0T2JqKQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgaWYgKCFwcmVmaXhEb25lICYmIHRlbXApIHsKICAgICAgICBwcmVmaXggPSAoL1w/Ly50ZXN0KHRlbXApKSA/ICgvXD8kLy50ZXN0KHRlbXApKSA/ICcnIDogJyYnIDogJz8nOwogICAgICAgIHVyaXN0cmluZ3MucHVzaCh0ZW1wKTsKICAgICAgICB1cmlzdHJpbmdzLnB1c2gocXEub2JqMnVybChvYmopKTsKICAgIH0gZWxzZSBpZiAoKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBBcnJheV0nKSAmJiAodHlwZW9mIG9iaiAhPSAndW5kZWZpbmVkJykgKSB7CiAgICAgICAgLy8gd2Ugd29udCB1c2UgYSBmb3ItaW4tbG9vcCBvbiBhbiBhcnJheSAocGVyZm9ybWFuY2UpCiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IG9iai5sZW5ndGg7IGkgPCBsZW47ICsraSl7CiAgICAgICAgICAgIGFkZChvYmpbaV0sIGkpOwogICAgICAgIH0KICAgIH0gZWxzZSBpZiAoKHR5cGVvZiBvYmogIT0gJ3VuZGVmaW5lZCcpICYmIChvYmogIT09IG51bGwpICYmICh0eXBlb2Ygb2JqID09PSAib2JqZWN0IikpewogICAgICAgIC8vIGZvciBhbnl0aGluZyBlbHNlIGJ1dCBhIHNjYWxhciwgd2Ugd2lsbCB1c2UgZm9yLWluLWxvb3AKICAgICAgICBmb3IgKHZhciBpIGluIG9iail7CiAgICAgICAgICAgIGFkZChvYmpbaV0sIGkpOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgdXJpc3RyaW5ncy5wdXNoKGVuY29kZVVSSUNvbXBvbmVudCh0ZW1wKSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudChvYmopKTsKICAgIH0KCiAgICBpZiAodGVtcCkgewogICAgICAgIHJldHVybiB1cmlzdHJpbmdzLmpvaW4ocHJlZml4KTsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHVyaXN0cmluZ3Muam9pbihwcmVmaXgpCiAgICAgICAgICAgIC5yZXBsYWNlKC9eJi8sICcnKQogICAgICAgICAgICAucmVwbGFjZSgvJTIwL2csICcrJyk7CiAgICB9Cn07CgovKioKICogQSBnZW5lcmljIG1vZHVsZSB3aGljaCBzdXBwb3J0cyBvYmplY3QgZGlzcG9zaW5nIGluIGRpc3Bvc2UoKSBtZXRob2QuCiAqICovCnFxLkRpc3Bvc2VTdXBwb3J0ID0gewogICAgX2Rpc3Bvc2VyczogW10sCgogICAgLyoqIFJ1biBhbGwgcmVnaXN0ZXJlZCBkaXNwb3NlcnMgKi8KICAgIGRpc3Bvc2U6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBkaXNwb3NlcjsKICAgICAgICB3aGlsZSAoZGlzcG9zZXIgPSB0aGlzLl9kaXNwb3NlcnMuc2hpZnQoKSkgewogICAgICAgICAgICBkaXNwb3NlcigpOwogICAgICAgIH0KICAgIH0sCgogICAgLyoqIEFkZCBkaXNwb3NlciB0byB0aGUgY29sbGVjdGlvbiAqLwogICAgYWRkRGlzcG9zZXI6IGZ1bmN0aW9uKGRpc3Bvc2VGdW5jdGlvbikgewogICAgICAgIHRoaXMuX2Rpc3Bvc2Vycy5wdXNoKGRpc3Bvc2VGdW5jdGlvbik7CiAgICB9LAoKICAgIC8qKiBBdHRhY2ggZXZlbnQgaGFuZGxlciBhbmQgcmVnaXN0ZXIgZGUtYXR0YWNoZXIgYXMgYSBkaXNwb3NlciAqLwogICAgX2F0dGFjaDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5hZGREaXNwb3NlcihxcShhcmd1bWVudHNbMF0pLmF0dGFjaC5hcHBseSh0aGlzLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKSk7CiAgICB9Cn07CnFxLlVwbG9hZEJ1dHRvbiA9IGZ1bmN0aW9uKG8pewogICAgdGhpcy5fb3B0aW9ucyA9IHsKICAgICAgICBlbGVtZW50OiBudWxsLAogICAgICAgIC8vIGlmIHNldCB0byB0cnVlIGFkZHMgbXVsdGlwbGUgYXR0cmlidXRlIHRvIGZpbGUgaW5wdXQKICAgICAgICBtdWx0aXBsZTogZmFsc2UsCiAgICAgICAgYWNjZXB0RmlsZXM6IG51bGwsCiAgICAgICAgLy8gbmFtZSBhdHRyaWJ1dGUgb2YgZmlsZSBpbnB1dAogICAgICAgIG5hbWU6ICdmaWxlJywKICAgICAgICBvbkNoYW5nZTogZnVuY3Rpb24oaW5wdXQpe30sCiAgICAgICAgaG92ZXJDbGFzczogJ3FxLXVwbG9hZC1idXR0b24taG92ZXInLAogICAgICAgIGZvY3VzQ2xhc3M6ICdxcS11cGxvYWQtYnV0dG9uLWZvY3VzJwogICAgfTsKCiAgICBxcS5leHRlbmQodGhpcy5fb3B0aW9ucywgbyk7CiAgICBxcS5leHRlbmQodGhpcywgcXEuRGlzcG9zZVN1cHBvcnQpOwoKICAgIHRoaXMuX2VsZW1lbnQgPSB0aGlzLl9vcHRpb25zLmVsZW1lbnQ7CgogICAgLy8gbWFrZSBidXR0b24gc3VpdGFibGUgY29udGFpbmVyIGZvciBpbnB1dAogICAgcXEodGhpcy5fZWxlbWVudCkuY3NzKHsKICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJywKICAgICAgICBvdmVyZmxvdzogJ2hpZGRlbicsCiAgICAgICAgLy8gTWFrZSBzdXJlIGJyb3dzZSBidXR0b24gaXMgaW4gdGhlIHJpZ2h0IHNpZGUKICAgICAgICAvLyBpbiBJbnRlcm5ldCBFeHBsb3JlcgogICAgICAgIGRpcmVjdGlvbjogJ2x0cicKICAgIH0pOwoKICAgIHRoaXMuX2lucHV0ID0gdGhpcy5fY3JlYXRlSW5wdXQoKTsKfTsKCnFxLlVwbG9hZEJ1dHRvbi5wcm90b3R5cGUgPSB7CiAgICAvKiByZXR1cm5zIGZpbGUgaW5wdXQgZWxlbWVudCAqLwogICAgZ2V0SW5wdXQ6IGZ1bmN0aW9uKCl7CiAgICAgICAgcmV0dXJuIHRoaXMuX2lucHV0OwogICAgfSwKICAgIC8qIGNsZWFucy9yZWNyZWF0ZXMgdGhlIGZpbGUgaW5wdXQgKi8KICAgIHJlc2V0OiBmdW5jdGlvbigpewogICAgICAgIGlmICh0aGlzLl9pbnB1dC5wYXJlbnROb2RlKXsKICAgICAgICAgICAgcXEodGhpcy5faW5wdXQpLnJlbW92ZSgpOwogICAgICAgIH0KCiAgICAgICAgcXEodGhpcy5fZWxlbWVudCkucmVtb3ZlQ2xhc3ModGhpcy5fb3B0aW9ucy5mb2N1c0NsYXNzKTsKICAgICAgICB0aGlzLl9pbnB1dCA9IHRoaXMuX2NyZWF0ZUlucHV0KCk7CiAgICB9LAogICAgX2NyZWF0ZUlucHV0OiBmdW5jdGlvbigpewogICAgICAgIHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7CgogICAgICAgIGlmICh0aGlzLl9vcHRpb25zLm11bHRpcGxlKXsKICAgICAgICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKCJtdWx0aXBsZSIsICJtdWx0aXBsZSIpOwogICAgICAgIH0KCiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMuYWNjZXB0RmlsZXMpIGlucHV0LnNldEF0dHJpYnV0ZSgiYWNjZXB0IiwgdGhpcy5fb3B0aW9ucy5hY2NlcHRGaWxlcyk7CgogICAgICAgIGlucHV0LnNldEF0dHJpYnV0ZSgidHlwZSIsICJmaWxlIik7CiAgICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKCJuYW1lIiwgdGhpcy5fb3B0aW9ucy5uYW1lKTsKCiAgICAgICAgcXEoaW5wdXQpLmNzcyh7CiAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLAogICAgICAgICAgICAvLyBpbiBPcGVyYSBvbmx5ICdicm93c2UnIGJ1dHRvbgogICAgICAgICAgICAvLyBpcyBjbGlja2FibGUgYW5kIGl0IGlzIGxvY2F0ZWQgYXQKICAgICAgICAgICAgLy8gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGlucHV0CiAgICAgICAgICAgIHJpZ2h0OiAwLAogICAgICAgICAgICB0b3A6IDAsCiAgICAgICAgICAgIGZvbnRGYW1pbHk6ICdBcmlhbCcsCiAgICAgICAgICAgIC8vIDQgcGVyc29ucyByZXBvcnRlZCB0aGlzLCB0aGUgbWF4IHZhbHVlcyB0aGF0IHdvcmtlZCBmb3IgdGhlbSB3ZXJlIDI0MywgMjM2LCAyMzYsIDExOAogICAgICAgICAgICBmb250U2l6ZTogJzExOHB4JywKICAgICAgICAgICAgbWFyZ2luOiAwLAogICAgICAgICAgICBwYWRkaW5nOiAwLAogICAgICAgICAgICBjdXJzb3I6ICdwb2ludGVyJywKICAgICAgICAgICAgb3BhY2l0eTogMAogICAgICAgIH0pOwoKICAgICAgICB0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKGlucHV0KTsKCiAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICAgIHRoaXMuX2F0dGFjaChpbnB1dCwgJ2NoYW5nZScsIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIHNlbGYuX29wdGlvbnMub25DaGFuZ2UoaW5wdXQpOwogICAgICAgIH0pOwoKICAgICAgICB0aGlzLl9hdHRhY2goaW5wdXQsICdtb3VzZW92ZXInLCBmdW5jdGlvbigpewogICAgICAgICAgICBxcShzZWxmLl9lbGVtZW50KS5hZGRDbGFzcyhzZWxmLl9vcHRpb25zLmhvdmVyQ2xhc3MpOwogICAgICAgIH0pOwogICAgICAgIHRoaXMuX2F0dGFjaChpbnB1dCwgJ21vdXNlb3V0JywgZnVuY3Rpb24oKXsKICAgICAgICAgICAgcXEoc2VsZi5fZWxlbWVudCkucmVtb3ZlQ2xhc3Moc2VsZi5fb3B0aW9ucy5ob3ZlckNsYXNzKTsKICAgICAgICB9KTsKICAgICAgICB0aGlzLl9hdHRhY2goaW5wdXQsICdmb2N1cycsIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIHFxKHNlbGYuX2VsZW1lbnQpLmFkZENsYXNzKHNlbGYuX29wdGlvbnMuZm9jdXNDbGFzcyk7CiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5fYXR0YWNoKGlucHV0LCAnYmx1cicsIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIHFxKHNlbGYuX2VsZW1lbnQpLnJlbW92ZUNsYXNzKHNlbGYuX29wdGlvbnMuZm9jdXNDbGFzcyk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIElFIGFuZCBPcGVyYSwgdW5mb3J0dW5hdGVseSBoYXZlIDIgdGFiIHN0b3BzIG9uIGZpbGUgaW5wdXQKICAgICAgICAvLyB3aGljaCBpcyB1bmFjY2VwdGFibGUgaW4gb3VyIGNhc2UsIGRpc2FibGUga2V5Ym9hcmQgYWNjZXNzCiAgICAgICAgaWYgKHdpbmRvdy5hdHRhY2hFdmVudCl7CiAgICAgICAgICAgIC8vIGl0IGlzIElFIG9yIE9wZXJhCiAgICAgICAgICAgIGlucHV0LnNldEF0dHJpYnV0ZSgndGFiSW5kZXgnLCAiLTEiKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBpbnB1dDsKICAgIH0KfTsKcXEuRmluZVVwbG9hZGVyQmFzaWMgPSBmdW5jdGlvbihvKXsKICAgIHZhciB0aGF0ID0gdGhpczsKICAgIHRoaXMuX29wdGlvbnMgPSB7CiAgICAgICAgZGVidWc6IGZhbHNlLAogICAgICAgIGJ1dHRvbjogbnVsbCwKICAgICAgICBtdWx0aXBsZTogdHJ1ZSwKICAgICAgICBtYXhDb25uZWN0aW9uczogMywKICAgICAgICBkaXNhYmxlQ2FuY2VsRm9yRm9ybVVwbG9hZHM6IGZhbHNlLAogICAgICAgIGF1dG9VcGxvYWQ6IHRydWUsCiAgICAgICAgcmVxdWVzdDogewogICAgICAgICAgICBlbmRwb2ludDogJy9zZXJ2ZXIvdXBsb2FkJywKICAgICAgICAgICAgcGFyYW1zOiB7fSwKICAgICAgICAgICAgY3VzdG9tSGVhZGVyczoge30sCiAgICAgICAgICAgIGZvcmNlTXVsdGlwYXJ0OiBmYWxzZSwKICAgICAgICAgICAgaW5wdXROYW1lOiAncXFmaWxlJwogICAgICAgIH0sCiAgICAgICAgdmFsaWRhdGlvbjogewogICAgICAgICAgICBhbGxvd2VkRXh0ZW5zaW9uczogW10sCiAgICAgICAgICAgIHNpemVMaW1pdDogMCwKICAgICAgICAgICAgbWluU2l6ZUxpbWl0OiAwLAogICAgICAgICAgICBzdG9wT25GaXJzdEludmFsaWRGaWxlOiB0cnVlCiAgICAgICAgfSwKICAgICAgICBjYWxsYmFja3M6IHsKICAgICAgICAgICAgb25TdWJtaXQ6IGZ1bmN0aW9uKGlkLCBmaWxlTmFtZSl7fSwgLy8gcmV0dXJuIGZhbHNlIHRvIGNhbmNlbCBzdWJtaXQKICAgICAgICAgICAgb25Db21wbGV0ZTogZnVuY3Rpb24oaWQsIGZpbGVOYW1lLCByZXNwb25zZUpTT04pe30sCiAgICAgICAgICAgIG9uQ2FuY2VsOiBmdW5jdGlvbihpZCwgZmlsZU5hbWUpe30sCiAgICAgICAgICAgIG9uVXBsb2FkOiBmdW5jdGlvbihpZCwgZmlsZU5hbWUsIHhocil7fSwKICAgICAgICAgICAgb25Qcm9ncmVzczogZnVuY3Rpb24oaWQsIGZpbGVOYW1lLCBsb2FkZWQsIHRvdGFsKXt9LAogICAgICAgICAgICBvbkVycm9yOiBmdW5jdGlvbihpZCwgZmlsZU5hbWUsIHJlYXNvbikge30sCiAgICAgICAgICAgIG9uQXV0b1JldHJ5OiBmdW5jdGlvbihpZCwgZmlsZU5hbWUsIGF0dGVtcHROdW1iZXIpIHt9LAogICAgICAgICAgICBvbk1hbnVhbFJldHJ5OiBmdW5jdGlvbihpZCwgZmlsZU5hbWUpIHt9LAogICAgICAgICAgICBvblZhbGlkYXRlOiBmdW5jdGlvbihmaWxlRGF0YSkge30gLy8gcmV0dXJuIGZhbHNlIHRvIHByZXZlbnQgdXBsb2FkCiAgICAgICAgfSwKICAgICAgICBtZXNzYWdlczogewogICAgICAgICAgICB0eXBlRXJyb3I6ICJ7ZmlsZX0gaGFzIGFuIGludmFsaWQgZXh0ZW5zaW9uLiBWYWxpZCBleHRlbnNpb24ocyk6IHtleHRlbnNpb25zfS4iLAogICAgICAgICAgICBzaXplRXJyb3I6ICJ7ZmlsZX0gaXMgdG9vIGxhcmdlLCBtYXhpbXVtIGZpbGUgc2l6ZSBpcyB7c2l6ZUxpbWl0fS4iLAogICAgICAgICAgICBtaW5TaXplRXJyb3I6ICJ7ZmlsZX0gaXMgdG9vIHNtYWxsLCBtaW5pbXVtIGZpbGUgc2l6ZSBpcyB7bWluU2l6ZUxpbWl0fS4iLAogICAgICAgICAgICBlbXB0eUVycm9yOiAie2ZpbGV9IGlzIGVtcHR5LCBwbGVhc2Ugc2VsZWN0IGZpbGVzIGFnYWluIHdpdGhvdXQgaXQuIiwKICAgICAgICAgICAgbm9GaWxlc0Vycm9yOiAiTm8gZmlsZXMgdG8gdXBsb2FkLiIsCiAgICAgICAgICAgIG9uTGVhdmU6ICJUaGUgZmlsZXMgYXJlIGJlaW5nIHVwbG9hZGVkLCBpZiB5b3UgbGVhdmUgbm93IHRoZSB1cGxvYWQgd2lsbCBiZSBjYW5jZWxsZWQuIgogICAgICAgIH0sCiAgICAgICAgcmV0cnk6IHsKICAgICAgICAgICAgZW5hYmxlQXV0bzogZmFsc2UsCiAgICAgICAgICAgIG1heEF1dG9BdHRlbXB0czogMywKICAgICAgICAgICAgYXV0b0F0dGVtcHREZWxheTogNSwKICAgICAgICAgICAgcHJldmVudFJldHJ5UmVzcG9uc2VQcm9wZXJ0eTogJ3ByZXZlbnRSZXRyeScKICAgICAgICB9CiAgICB9OwoKICAgIHFxLmV4dGVuZCh0aGlzLl9vcHRpb25zLCBvLCB0cnVlKTsKICAgIHRoaXMuX3dyYXBDYWxsYmFja3MoKTsKICAgIHFxLmV4dGVuZCh0aGlzLCBxcS5EaXNwb3NlU3VwcG9ydCk7CgogICAgLy8gbnVtYmVyIG9mIGZpbGVzIGJlaW5nIHVwbG9hZGVkCiAgICB0aGlzLl9maWxlc0luUHJvZ3Jlc3MgPSAwOwoKICAgIHRoaXMuX3N0b3JlZEZpbGVJZHMgPSBbXTsKCiAgICB0aGlzLl9hdXRvUmV0cmllcyA9IFtdOwogICAgdGhpcy5fcmV0cnlUaW1lb3V0cyA9IFtdOwogICAgdGhpcy5fcHJldmVudFJldHJpZXMgPSBbXTsKCiAgICB0aGlzLl9oYW5kbGVyID0gdGhpcy5fY3JlYXRlVXBsb2FkSGFuZGxlcigpOwoKICAgIGlmICh0aGlzLl9vcHRpb25zLmJ1dHRvbil7CiAgICAgICAgdGhpcy5fYnV0dG9uID0gdGhpcy5fY3JlYXRlVXBsb2FkQnV0dG9uKHRoaXMuX29wdGlvbnMuYnV0dG9uKTsKICAgIH0KCiAgICB0aGlzLl9wcmV2ZW50TGVhdmVJblByb2dyZXNzKCk7Cn07CgpxcS5GaW5lVXBsb2FkZXJCYXNpYy5wcm90b3R5cGUgPSB7CiAgICBsb2c6IGZ1bmN0aW9uKHN0ciwgbGV2ZWwpIHsKICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5kZWJ1ZyAmJiAoIWxldmVsIHx8IGxldmVsID09PSAnaW5mbycpKSB7CiAgICAgICAgICAgIHFxLmxvZygnW0ZpbmVVcGxvYWRlcl0gJyArIHN0cik7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGxldmVsICYmIGxldmVsICE9PSAnaW5mbycpIHsKICAgICAgICAgICAgcXEubG9nKCdbRmluZVVwbG9hZGVyXSAnICsgc3RyLCBsZXZlbCk7CgogICAgICAgIH0KICAgIH0sCiAgICBzZXRQYXJhbXM6IGZ1bmN0aW9uKHBhcmFtcyl7CiAgICAgICAgdGhpcy5fb3B0aW9ucy5yZXF1ZXN0LnBhcmFtcyA9IHBhcmFtczsKICAgIH0sCiAgICBnZXRJblByb2dyZXNzOiBmdW5jdGlvbigpewogICAgICAgIHJldHVybiB0aGlzLl9maWxlc0luUHJvZ3Jlc3M7CiAgICB9LAogICAgdXBsb2FkU3RvcmVkRmlsZXM6IGZ1bmN0aW9uKCl7CiAgICAgICAgInVzZSBzdHJpY3QiOwogICAgICAgIHdoaWxlKHRoaXMuX3N0b3JlZEZpbGVJZHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHRoaXMuX2ZpbGVzSW5Qcm9ncmVzcysrOwogICAgICAgICAgICB0aGlzLl9oYW5kbGVyLnVwbG9hZCh0aGlzLl9zdG9yZWRGaWxlSWRzLnNoaWZ0KCksIHRoaXMuX29wdGlvbnMucmVxdWVzdC5wYXJhbXMpOwogICAgICAgIH0KICAgIH0sCiAgICBjbGVhclN0b3JlZEZpbGVzOiBmdW5jdGlvbigpewogICAgICAgIHRoaXMuX3N0b3JlZEZpbGVJZHMgPSBbXTsKICAgIH0sCiAgICByZXRyeTogZnVuY3Rpb24oaWQpIHsKICAgICAgICBpZiAodGhpcy5fb25CZWZvcmVNYW51YWxSZXRyeShpZCkpIHsKICAgICAgICAgICAgdGhpcy5faGFuZGxlci5yZXRyeShpZCk7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0sCiAgICBjYW5jZWw6IGZ1bmN0aW9uKGZpbGVJZCkgewogICAgICAgIHRoaXMuX2hhbmRsZXIuY2FuY2VsKGZpbGVJZCk7CiAgICB9LAogICAgcmVzZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMubG9nKCJSZXNldHRpbmcgdXBsb2FkZXIuLi4iKTsKICAgICAgICB0aGlzLl9oYW5kbGVyLnJlc2V0KCk7CiAgICAgICAgdGhpcy5fZmlsZXNJblByb2dyZXNzID0gMDsKICAgICAgICB0aGlzLl9zdG9yZWRGaWxlSWRzID0gW107CiAgICAgICAgdGhpcy5fYXV0b1JldHJpZXMgPSBbXTsKICAgICAgICB0aGlzLl9yZXRyeVRpbWVvdXRzID0gW107CiAgICAgICAgdGhpcy5fcHJldmVudFJldHJpZXMgPSBbXTsKICAgICAgICB0aGlzLl9idXR0b24ucmVzZXQoKTsKICAgIH0sCiAgICBfY3JlYXRlVXBsb2FkQnV0dG9uOiBmdW5jdGlvbihlbGVtZW50KXsKICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgIHZhciBidXR0b24gPSBuZXcgcXEuVXBsb2FkQnV0dG9uKHsKICAgICAgICAgICAgZWxlbWVudDogZWxlbWVudCwKICAgICAgICAgICAgbXVsdGlwbGU6IHRoaXMuX29wdGlvbnMubXVsdGlwbGUgJiYgcXEuVXBsb2FkSGFuZGxlclhoci5pc1N1cHBvcnRlZCgpLAogICAgICAgICAgICBhY2NlcHRGaWxlczogdGhpcy5fb3B0aW9ucy52YWxpZGF0aW9uLmFjY2VwdEZpbGVzLAogICAgICAgICAgICBvbkNoYW5nZTogZnVuY3Rpb24oaW5wdXQpewogICAgICAgICAgICAgICAgc2VsZi5fb25JbnB1dENoYW5nZShpbnB1dCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgdGhpcy5hZGREaXNwb3NlcihmdW5jdGlvbigpIHsgYnV0dG9uLmRpc3Bvc2UoKTsgfSk7CiAgICAgICAgcmV0dXJuIGJ1dHRvbjsKICAgIH0sCiAgICBfY3JlYXRlVXBsb2FkSGFuZGxlcjogZnVuY3Rpb24oKXsKICAgICAgICB2YXIgc2VsZiA9IHRoaXMsCiAgICAgICAgICAgIGhhbmRsZXJDbGFzczsKCiAgICAgICAgaWYocXEuVXBsb2FkSGFuZGxlclhoci5pc1N1cHBvcnRlZCgpKXsKICAgICAgICAgICAgaGFuZGxlckNsYXNzID0gJ1VwbG9hZEhhbmRsZXJYaHInOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGhhbmRsZXJDbGFzcyA9ICdVcGxvYWRIYW5kbGVyRm9ybSc7CiAgICAgICAgfQoKICAgICAgICB2YXIgaGFuZGxlciA9IG5ldyBxcVtoYW5kbGVyQ2xhc3NdKHsKICAgICAgICAgICAgZGVidWc6IHRoaXMuX29wdGlvbnMuZGVidWcsCiAgICAgICAgICAgIGVuZHBvaW50OiB0aGlzLl9vcHRpb25zLnJlcXVlc3QuZW5kcG9pbnQsCiAgICAgICAgICAgIGZvcmNlTXVsdGlwYXJ0OiB0aGlzLl9vcHRpb25zLnJlcXVlc3QuZm9yY2VNdWx0aXBhcnQsCiAgICAgICAgICAgIG1heENvbm5lY3Rpb25zOiB0aGlzLl9vcHRpb25zLm1heENvbm5lY3Rpb25zLAogICAgICAgICAgICBjdXN0b21IZWFkZXJzOiB0aGlzLl9vcHRpb25zLnJlcXVlc3QuY3VzdG9tSGVhZGVycywKICAgICAgICAgICAgaW5wdXROYW1lOiB0aGlzLl9vcHRpb25zLnJlcXVlc3QuaW5wdXROYW1lLAogICAgICAgICAgICBkZW1vTW9kZTogdGhpcy5fb3B0aW9ucy5kZW1vTW9kZSwKICAgICAgICAgICAgbG9nOiB0aGlzLmxvZywKICAgICAgICAgICAgb25Qcm9ncmVzczogZnVuY3Rpb24oaWQsIGZpbGVOYW1lLCBsb2FkZWQsIHRvdGFsKXsKICAgICAgICAgICAgICAgIHNlbGYuX29uUHJvZ3Jlc3MoaWQsIGZpbGVOYW1lLCBsb2FkZWQsIHRvdGFsKTsKICAgICAgICAgICAgICAgIHNlbGYuX29wdGlvbnMuY2FsbGJhY2tzLm9uUHJvZ3Jlc3MoaWQsIGZpbGVOYW1lLCBsb2FkZWQsIHRvdGFsKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgb25Db21wbGV0ZTogZnVuY3Rpb24oaWQsIGZpbGVOYW1lLCByZXN1bHQsIHhocil7CiAgICAgICAgICAgICAgICBzZWxmLl9vbkNvbXBsZXRlKGlkLCBmaWxlTmFtZSwgcmVzdWx0LCB4aHIpOwogICAgICAgICAgICAgICAgc2VsZi5fb3B0aW9ucy5jYWxsYmFja3Mub25Db21wbGV0ZShpZCwgZmlsZU5hbWUsIHJlc3VsdCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG9uQ2FuY2VsOiBmdW5jdGlvbihpZCwgZmlsZU5hbWUpewogICAgICAgICAgICAgICAgc2VsZi5fb25DYW5jZWwoaWQsIGZpbGVOYW1lKTsKICAgICAgICAgICAgICAgIHNlbGYuX29wdGlvbnMuY2FsbGJhY2tzLm9uQ2FuY2VsKGlkLCBmaWxlTmFtZSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG9uVXBsb2FkOiBmdW5jdGlvbihpZCwgZmlsZU5hbWUsIHhocil7CiAgICAgICAgICAgICAgICBzZWxmLl9vblVwbG9hZChpZCwgZmlsZU5hbWUsIHhocik7CiAgICAgICAgICAgICAgICBzZWxmLl9vcHRpb25zLmNhbGxiYWNrcy5vblVwbG9hZChpZCwgZmlsZU5hbWUsIHhocik7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG9uQXV0b1JldHJ5OiBmdW5jdGlvbihpZCwgZmlsZU5hbWUsIHJlc3BvbnNlSlNPTiwgeGhyKSB7CiAgICAgICAgICAgICAgICBzZWxmLl9wcmV2ZW50UmV0cmllc1tpZF0gPSByZXNwb25zZUpTT05bc2VsZi5fb3B0aW9ucy5yZXRyeS5wcmV2ZW50UmV0cnlSZXNwb25zZVByb3BlcnR5XTsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi5fc2hvdWxkQXV0b1JldHJ5KGlkLCBmaWxlTmFtZSwgcmVzcG9uc2VKU09OKSkgewogICAgICAgICAgICAgICAgICAgIHNlbGYuX21heWJlUGFyc2VBbmRTZW5kVXBsb2FkRXJyb3IoaWQsIGZpbGVOYW1lLCByZXNwb25zZUpTT04sIHhocik7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fb3B0aW9ucy5jYWxsYmFja3Mub25BdXRvUmV0cnkoaWQsIGZpbGVOYW1lLCBzZWxmLl9hdXRvUmV0cmllc1tpZF0gKyAxKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLl9vbkJlZm9yZUF1dG9SZXRyeShpZCwgZmlsZU5hbWUpOwoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9yZXRyeVRpbWVvdXRzW2lkXSA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX29uQXV0b1JldHJ5KGlkLCBmaWxlTmFtZSwgcmVzcG9uc2VKU09OKQogICAgICAgICAgICAgICAgICAgIH0sIHNlbGYuX29wdGlvbnMucmV0cnkuYXV0b0F0dGVtcHREZWxheSAqIDEwMDApOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICByZXR1cm4gaGFuZGxlcjsKICAgIH0sCiAgICBfcHJldmVudExlYXZlSW5Qcm9ncmVzczogZnVuY3Rpb24oKXsKICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgIHRoaXMuX2F0dGFjaCh3aW5kb3csICdiZWZvcmV1bmxvYWQnLCBmdW5jdGlvbihlKXsKICAgICAgICAgICAgaWYgKCFzZWxmLl9maWxlc0luUHJvZ3Jlc3Mpe3JldHVybjt9CgogICAgICAgICAgICB2YXIgZSA9IGUgfHwgd2luZG93LmV2ZW50OwogICAgICAgICAgICAvLyBmb3IgaWUsIGZmCiAgICAgICAgICAgIGUucmV0dXJuVmFsdWUgPSBzZWxmLl9vcHRpb25zLm1lc3NhZ2VzLm9uTGVhdmU7CiAgICAgICAgICAgIC8vIGZvciB3ZWJraXQKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX29wdGlvbnMubWVzc2FnZXMub25MZWF2ZTsKICAgICAgICB9KTsKICAgIH0sCiAgICBfb25TdWJtaXQ6IGZ1bmN0aW9uKGlkLCBmaWxlTmFtZSl7CiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMuYXV0b1VwbG9hZCkgewogICAgICAgICAgICB0aGlzLl9maWxlc0luUHJvZ3Jlc3MrKzsKICAgICAgICB9CiAgICB9LAogICAgX29uUHJvZ3Jlc3M6IGZ1bmN0aW9uKGlkLCBmaWxlTmFtZSwgbG9hZGVkLCB0b3RhbCl7CiAgICB9LAogICAgX29uQ29tcGxldGU6IGZ1bmN0aW9uKGlkLCBmaWxlTmFtZSwgcmVzdWx0LCB4aHIpewogICAgICAgIHRoaXMuX2ZpbGVzSW5Qcm9ncmVzcy0tOwogICAgICAgIHRoaXMuX21heWJlUGFyc2VBbmRTZW5kVXBsb2FkRXJyb3IoaWQsIGZpbGVOYW1lLCByZXN1bHQsIHhocik7CiAgICB9LAogICAgX29uQ2FuY2VsOiBmdW5jdGlvbihpZCwgZmlsZU5hbWUpewogICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9yZXRyeVRpbWVvdXRzW2lkXSk7CgogICAgICAgIHZhciBzdG9yZWRGaWxlSW5kZXggPSBxcS5pbmRleE9mKHRoaXMuX3N0b3JlZEZpbGVJZHMsIGlkKTsKICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5hdXRvVXBsb2FkIHx8IHN0b3JlZEZpbGVJbmRleCA8IDApIHsKICAgICAgICAgICAgdGhpcy5fZmlsZXNJblByb2dyZXNzLS07CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCF0aGlzLl9vcHRpb25zLmF1dG9VcGxvYWQpIHsKICAgICAgICAgICAgdGhpcy5fc3RvcmVkRmlsZUlkcy5zcGxpY2Uoc3RvcmVkRmlsZUluZGV4LCAxKTsKICAgICAgICB9CiAgICB9LAogICAgX29uVXBsb2FkOiBmdW5jdGlvbihpZCwgZmlsZU5hbWUsIHhocil7CiAgICB9LAogICAgX29uSW5wdXRDaGFuZ2U6IGZ1bmN0aW9uKGlucHV0KXsKICAgICAgICBpZiAodGhpcy5faGFuZGxlciBpbnN0YW5jZW9mIHFxLlVwbG9hZEhhbmRsZXJYaHIpewogICAgICAgICAgICB0aGlzLl91cGxvYWRGaWxlTGlzdChpbnB1dC5maWxlcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKHRoaXMuX3ZhbGlkYXRlRmlsZShpbnB1dCkpewogICAgICAgICAgICAgICAgdGhpcy5fdXBsb2FkRmlsZShpbnB1dCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5fYnV0dG9uLnJlc2V0KCk7CiAgICB9LAogICAgX29uQmVmb3JlQXV0b1JldHJ5OiBmdW5jdGlvbihpZCwgZmlsZU5hbWUpIHsKICAgICAgICB0aGlzLmxvZygiV2FpdGluZyAiICsgdGhpcy5fb3B0aW9ucy5yZXRyeS5hdXRvQXR0ZW1wdERlbGF5ICsgIiBzZWNvbmRzIGJlZm9yZSByZXRyeWluZyAiICsgZmlsZU5hbWUgKyAiLi4uIik7CiAgICB9LAogICAgX29uQXV0b1JldHJ5OiBmdW5jdGlvbihpZCwgZmlsZU5hbWUsIHJlc3BvbnNlSlNPTikgewogICAgICAgIHRoaXMubG9nKCJSZXRyeWluZyAiICsgZmlsZU5hbWUgKyAiLi4uIik7CiAgICAgICAgdGhpcy5fYXV0b1JldHJpZXNbaWRdKys7CiAgICAgICAgdGhpcy5faGFuZGxlci5yZXRyeShpZCk7CiAgICB9LAogICAgX3Nob3VsZEF1dG9SZXRyeTogZnVuY3Rpb24oaWQsIGZpbGVOYW1lLCByZXNwb25zZUpTT04pIHsKICAgICAgICBpZiAoIXRoaXMuX3ByZXZlbnRSZXRyaWVzW2lkXSAmJiB0aGlzLl9vcHRpb25zLnJldHJ5LmVuYWJsZUF1dG8pIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2F1dG9SZXRyaWVzW2lkXSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9hdXRvUmV0cmllc1tpZF0gPSAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdGhpcy5fYXV0b1JldHJpZXNbaWRdIDwgdGhpcy5fb3B0aW9ucy5yZXRyeS5tYXhBdXRvQXR0ZW1wdHMKICAgICAgICB9CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0sCiAgICAvL3JldHVybiBmYWxzZSBpZiB3ZSBzaG91bGQgbm90IGF0dGVtcHQgdGhlIHJlcXVlc3RlZCByZXRyeQogICAgX29uQmVmb3JlTWFudWFsUmV0cnk6IGZ1bmN0aW9uKGlkKSB7CiAgICAgICAgaWYgKHRoaXMuX3ByZXZlbnRSZXRyaWVzW2lkXSkgewogICAgICAgICAgICB0aGlzLmxvZygiUmV0cmllcyBhcmUgZm9yYmlkZGVuIGZvciBpZCAiICsgaWQsICd3YXJuJyk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodGhpcy5faGFuZGxlci5pc1ZhbGlkKGlkKSkgewogICAgICAgICAgICB2YXIgZmlsZU5hbWUgPSB0aGlzLl9oYW5kbGVyLmdldE5hbWUoaWQpOwoKICAgICAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMuY2FsbGJhY2tzLm9uTWFudWFsUmV0cnkoaWQsIGZpbGVOYW1lKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5sb2coIlJldHJ5aW5nIHVwbG9hZCBmb3IgJyIgKyBmaWxlTmFtZSArICInIChpZDogIiArIGlkICsgIikuLi4iKTsKICAgICAgICAgICAgdGhpcy5fZmlsZXNJblByb2dyZXNzKys7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhpcy5sb2coIiciICsgaWQgKyAiJyBpcyBub3QgYSB2YWxpZCBmaWxlIElEIiwgJ2Vycm9yJyk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9LAogICAgX21heWJlUGFyc2VBbmRTZW5kVXBsb2FkRXJyb3I6IGZ1bmN0aW9uKGlkLCBmaWxlTmFtZSwgcmVzcG9uc2UsIHhocikgewogICAgICAgIC8vYXNzdW1pbmcgbm8gb25lIHdpbGwgYWN0dWFsbHkgc2V0IHRoZSByZXNwb25zZSBjb2RlIHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIDIwMCBhbmQgc3RpbGwgc2V0ICdzdWNjZXNzJyB0byB0cnVlCiAgICAgICAgaWYgKCFyZXNwb25zZS5zdWNjZXNzKXsKICAgICAgICAgICAgaWYgKHhociAmJiB4aHIuc3RhdHVzICE9PSAyMDAgJiYgIXJlc3BvbnNlLmVycm9yKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9vcHRpb25zLmNhbGxiYWNrcy5vbkVycm9yKGlkLCBmaWxlTmFtZSwgIlhIUiByZXR1cm5lZCByZXNwb25zZSBjb2RlICIgKyB4aHIuc3RhdHVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciBlcnJvclJlYXNvbiA9IHJlc3BvbnNlLmVycm9yID8gcmVzcG9uc2UuZXJyb3IgOiAiVXBsb2FkIGZhaWx1cmUgcmVhc29uIHVua25vd24iOwogICAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5jYWxsYmFja3Mub25FcnJvcihpZCwgZmlsZU5hbWUsIGVycm9yUmVhc29uKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0sCiAgICBfdXBsb2FkRmlsZUxpc3Q6IGZ1bmN0aW9uKGZpbGVzKXsKICAgICAgICB2YXIgdmFsaWRhdGlvbkRlc2NyaXB0b3JzLCBpbmRleCwgYmF0Y2hJbnZhbGlkOwoKICAgICAgICB2YWxpZGF0aW9uRGVzY3JpcHRvcnMgPSB0aGlzLl9nZXRWYWxpZGF0aW9uRGVzY3JpcHRvcnMoZmlsZXMpOwogICAgICAgIGlmICh2YWxpZGF0aW9uRGVzY3JpcHRvcnMubGVuZ3RoID4gMSkgewogICAgICAgICAgICBiYXRjaEludmFsaWQgPSB0aGlzLl9vcHRpb25zLmNhbGxiYWNrcy5vblZhbGlkYXRlKHZhbGlkYXRpb25EZXNjcmlwdG9ycykgPT09IGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFiYXRjaEludmFsaWQpIHsKICAgICAgICAgICAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IGZpbGVzLmxlbmd0aDsgaW5kZXgrKyl7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3ZhbGlkYXRlRmlsZShmaWxlc1tpbmRleF0pKXsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBsb2FkRmlsZShmaWxlc1tpbmRleF0pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zLnZhbGlkYXRpb24uc3RvcE9uRmlyc3RJbnZhbGlkRmlsZSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLl9lcnJvcignbm9GaWxlc0Vycm9yJywgIiIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSwKICAgIF91cGxvYWRGaWxlOiBmdW5jdGlvbihmaWxlQ29udGFpbmVyKXsKICAgICAgICB2YXIgaWQgPSB0aGlzLl9oYW5kbGVyLmFkZChmaWxlQ29udGFpbmVyKTsKICAgICAgICB2YXIgZmlsZU5hbWUgPSB0aGlzLl9oYW5kbGVyLmdldE5hbWUoaWQpOwoKICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5jYWxsYmFja3Mub25TdWJtaXQoaWQsIGZpbGVOYW1lKSAhPT0gZmFsc2UpewogICAgICAgICAgICB0aGlzLl9vblN1Ym1pdChpZCwgZmlsZU5hbWUpOwogICAgICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5hdXRvVXBsb2FkKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVyLnVwbG9hZChpZCwgdGhpcy5fb3B0aW9ucy5yZXF1ZXN0LnBhcmFtcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLl9zdG9yZUZpbGVGb3JMYXRlcihpZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9LAogICAgX3N0b3JlRmlsZUZvckxhdGVyOiBmdW5jdGlvbihpZCkgewogICAgICAgIHRoaXMuX3N0b3JlZEZpbGVJZHMucHVzaChpZCk7CiAgICB9LAogICAgX3ZhbGlkYXRlRmlsZTogZnVuY3Rpb24oZmlsZSl7CiAgICAgICAgdmFyIHZhbGlkYXRpb25EZXNjcmlwdG9yLCBuYW1lLCBzaXplOwoKICAgICAgICB2YWxpZGF0aW9uRGVzY3JpcHRvciA9IHRoaXMuX2dldFZhbGlkYXRpb25EZXNjcmlwdG9yKGZpbGUpOwogICAgICAgIG5hbWUgPSB2YWxpZGF0aW9uRGVzY3JpcHRvci5uYW1lOwogICAgICAgIHNpemUgPSB2YWxpZGF0aW9uRGVzY3JpcHRvci5zaXplOwoKICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5jYWxsYmFja3Mub25WYWxpZGF0ZShbdmFsaWRhdGlvbkRlc2NyaXB0b3JdKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCF0aGlzLl9pc0FsbG93ZWRFeHRlbnNpb24obmFtZSkpewogICAgICAgICAgICB0aGlzLl9lcnJvcigndHlwZUVycm9yJywgbmFtZSk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKCiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHNpemUgPT09IDApewogICAgICAgICAgICB0aGlzLl9lcnJvcignZW1wdHlFcnJvcicsIG5hbWUpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChzaXplICYmIHRoaXMuX29wdGlvbnMudmFsaWRhdGlvbi5zaXplTGltaXQgJiYgc2l6ZSA+IHRoaXMuX29wdGlvbnMudmFsaWRhdGlvbi5zaXplTGltaXQpewogICAgICAgICAgICB0aGlzLl9lcnJvcignc2l6ZUVycm9yJywgbmFtZSk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKCiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHNpemUgJiYgc2l6ZSA8IHRoaXMuX29wdGlvbnMudmFsaWRhdGlvbi5taW5TaXplTGltaXQpewogICAgICAgICAgICB0aGlzLl9lcnJvcignbWluU2l6ZUVycm9yJywgbmFtZSk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfSwKICAgIF9lcnJvcjogZnVuY3Rpb24oY29kZSwgZmlsZU5hbWUpewogICAgICAgIHZhciBtZXNzYWdlID0gdGhpcy5fb3B0aW9ucy5tZXNzYWdlc1tjb2RlXTsKICAgICAgICBmdW5jdGlvbiByKG5hbWUsIHJlcGxhY2VtZW50KXsgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZShuYW1lLCByZXBsYWNlbWVudCk7IH0KCiAgICAgICAgdmFyIGV4dGVuc2lvbnMgPSB0aGlzLl9vcHRpb25zLnZhbGlkYXRpb24uYWxsb3dlZEV4dGVuc2lvbnMuam9pbignLCAnKTsKCiAgICAgICAgcigne2ZpbGV9JywgdGhpcy5fZm9ybWF0RmlsZU5hbWUoZmlsZU5hbWUpKTsKICAgICAgICByKCd7ZXh0ZW5zaW9uc30nLCBleHRlbnNpb25zKTsKICAgICAgICByKCd7c2l6ZUxpbWl0fScsIHRoaXMuX2Zvcm1hdFNpemUodGhpcy5fb3B0aW9ucy52YWxpZGF0aW9uLnNpemVMaW1pdCkpOwogICAgICAgIHIoJ3ttaW5TaXplTGltaXR9JywgdGhpcy5fZm9ybWF0U2l6ZSh0aGlzLl9vcHRpb25zLnZhbGlkYXRpb24ubWluU2l6ZUxpbWl0KSk7CgogICAgICAgIHRoaXMuX29wdGlvbnMuY2FsbGJhY2tzLm9uRXJyb3IobnVsbCwgZmlsZU5hbWUsIG1lc3NhZ2UpOwoKICAgICAgICByZXR1cm4gbWVzc2FnZTsKICAgIH0sCiAgICBfZm9ybWF0RmlsZU5hbWU6IGZ1bmN0aW9uKG5hbWUpewogICAgICAgIGlmIChuYW1lLmxlbmd0aCA+IDMzKXsKICAgICAgICAgICAgbmFtZSA9IG5hbWUuc2xpY2UoMCwgMTkpICsgJy4uLicgKyBuYW1lLnNsaWNlKC0xMyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuYW1lOwogICAgfSwKICAgIF9pc0FsbG93ZWRFeHRlbnNpb246IGZ1bmN0aW9uKGZpbGVOYW1lKXsKICAgICAgICB2YXIgZXh0ID0gKC0xICE9PSBmaWxlTmFtZS5pbmRleE9mKCcuJykpCiAgICAgICAgICAgID8gZmlsZU5hbWUucmVwbGFjZSgvLipbLl0vLCAnJykudG9Mb3dlckNhc2UoKQogICAgICAgICAgICA6ICcnOwogICAgICAgIHZhciBhbGxvd2VkID0gdGhpcy5fb3B0aW9ucy52YWxpZGF0aW9uLmFsbG93ZWRFeHRlbnNpb25zOwoKICAgICAgICBpZiAoIWFsbG93ZWQubGVuZ3RoKXtyZXR1cm4gdHJ1ZTt9CgogICAgICAgIGZvciAodmFyIGk9MDsgaTxhbGxvd2VkLmxlbmd0aDsgaSsrKXsKICAgICAgICAgICAgaWYgKGFsbG93ZWRbaV0udG9Mb3dlckNhc2UoKSA9PSBleHQpeyByZXR1cm4gdHJ1ZTt9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9LAogICAgX2Zvcm1hdFNpemU6IGZ1bmN0aW9uKGJ5dGVzKXsKICAgICAgICB2YXIgaSA9IC0xOwogICAgICAgIGRvIHsKICAgICAgICAgICAgYnl0ZXMgPSBieXRlcyAvIDEwMjQ7CiAgICAgICAgICAgIGkrKzsKICAgICAgICB9IHdoaWxlIChieXRlcyA+IDk5KTsKCiAgICAgICAgcmV0dXJuIE1hdGgubWF4KGJ5dGVzLCAwLjEpLnRvRml4ZWQoMSkgKyBbJ2tCJywgJ01CJywgJ0dCJywgJ1RCJywgJ1BCJywgJ0VCJ11baV07CiAgICB9LAogICAgX3dyYXBDYWxsYmFja3M6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBzZWxmLCBzYWZlQ2FsbGJhY2s7CgogICAgICAgIHNlbGYgPSB0aGlzOwoKICAgICAgICBzYWZlQ2FsbGJhY2sgPSBmdW5jdGlvbihuYW1lLCBjYWxsYmFjaywgYXJncykgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KHNlbGYsIGFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChleGNlcHRpb24pIHsKICAgICAgICAgICAgICAgIHNlbGYubG9nKCJDYXVnaHQgZXhjZXB0aW9uIGluICciICsgbmFtZSArICInIGNhbGxiYWNrIC0gIiArIGV4Y2VwdGlvbiwgJ2Vycm9yJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZvciAodmFyIHByb3AgaW4gdGhpcy5fb3B0aW9ucy5jYWxsYmFja3MpIHsKICAgICAgICAgICAgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIG9sZENhbGxiYWNrID0gc2VsZi5fb3B0aW9ucy5jYWxsYmFja3NbcHJvcF07CiAgICAgICAgICAgICAgICBzZWxmLl9vcHRpb25zLmNhbGxiYWNrc1twcm9wXSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBzYWZlQ2FsbGJhY2socHJvcCwgb2xkQ2FsbGJhY2ssIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0oKSk7CiAgICAgICAgfQogICAgfSwKICAgIF9wYXJzZUZpbGVOYW1lOiBmdW5jdGlvbihmaWxlKSB7CiAgICAgICAgdmFyIG5hbWU7CgogICAgICAgIGlmIChmaWxlLnZhbHVlKXsKICAgICAgICAgICAgLy8gaXQgaXMgYSBmaWxlIGlucHV0CiAgICAgICAgICAgIC8vIGdldCBpbnB1dCB2YWx1ZSBhbmQgcmVtb3ZlIHBhdGggdG8gbm9ybWFsaXplCiAgICAgICAgICAgIG5hbWUgPSBmaWxlLnZhbHVlLnJlcGxhY2UoLy4qKFwvfFxcKS8sICIiKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBmaXggbWlzc2luZyBwcm9wZXJ0aWVzIGluIFNhZmFyaSA0IGFuZCBmaXJlZm94IDExLjBhMgogICAgICAgICAgICBuYW1lID0gKGZpbGUuZmlsZU5hbWUgIT09IG51bGwgJiYgZmlsZS5maWxlTmFtZSAhPT0gdW5kZWZpbmVkKSA/IGZpbGUuZmlsZU5hbWUgOiBmaWxlLm5hbWU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbmFtZTsKICAgIH0sCiAgICBfcGFyc2VGaWxlU2l6ZTogZnVuY3Rpb24oZmlsZSkgewogICAgICAgIHZhciBzaXplOwoKICAgICAgICBpZiAoIWZpbGUudmFsdWUpewogICAgICAgICAgICAvLyBmaXggbWlzc2luZyBwcm9wZXJ0aWVzIGluIFNhZmFyaSA0IGFuZCBmaXJlZm94IDExLjBhMgogICAgICAgICAgICBzaXplID0gKGZpbGUuZmlsZVNpemUgIT09IG51bGwgJiYgZmlsZS5maWxlU2l6ZSAhPT0gdW5kZWZpbmVkKSA/IGZpbGUuZmlsZVNpemUgOiBmaWxlLnNpemU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gc2l6ZTsKICAgIH0sCiAgICBfZ2V0VmFsaWRhdGlvbkRlc2NyaXB0b3I6IGZ1bmN0aW9uKGZpbGUpIHsKICAgICAgICB2YXIgbmFtZSwgc2l6ZSwgZmlsZURlc2NyaXB0b3I7CgogICAgICAgIGZpbGVEZXNjcmlwdG9yID0ge307CiAgICAgICAgbmFtZSA9IHRoaXMuX3BhcnNlRmlsZU5hbWUoZmlsZSk7CiAgICAgICAgc2l6ZSA9IHRoaXMuX3BhcnNlRmlsZVNpemUoZmlsZSk7CgogICAgICAgIGZpbGVEZXNjcmlwdG9yLm5hbWUgPSBuYW1lOwogICAgICAgIGlmIChzaXplKSB7CiAgICAgICAgICAgIGZpbGVEZXNjcmlwdG9yLnNpemUgPSBzaXplOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZpbGVEZXNjcmlwdG9yOwogICAgfSwKICAgIF9nZXRWYWxpZGF0aW9uRGVzY3JpcHRvcnM6IGZ1bmN0aW9uKGZpbGVzKSB7CiAgICAgICAgdmFyIGluZGV4LCBmaWxlRGVzY3JpcHRvcnM7CgogICAgICAgIGZpbGVEZXNjcmlwdG9ycyA9IFtdOwoKICAgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBmaWxlcy5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgICAgICAgZmlsZURlc2NyaXB0b3JzLnB1c2goZmlsZXNbaW5kZXhdKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBmaWxlRGVzY3JpcHRvcnM7CiAgICB9Cn07Ci8qKgogKiBDbGFzcyB0aGF0IGNyZWF0ZXMgdXBsb2FkIHdpZGdldCB3aXRoIGRyYWctYW5kLWRyb3AgYW5kIGZpbGUgbGlzdAogKiBAaW5oZXJpdHMgcXEuRmluZVVwbG9hZGVyQmFzaWMKICovCnFxLkZpbmVVcGxvYWRlciA9IGZ1bmN0aW9uKG8pewogICAgLy8gY2FsbCBwYXJlbnQgY29uc3RydWN0b3IKICAgIHFxLkZpbmVVcGxvYWRlckJhc2ljLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CgogICAgLy8gYWRkaXRpb25hbCBvcHRpb25zCiAgICBxcS5leHRlbmQodGhpcy5fb3B0aW9ucywgewogICAgICAgIGVsZW1lbnQ6IG51bGwsCiAgICAgICAgbGlzdEVsZW1lbnQ6IG51bGwsCiAgICAgICAgZHJhZ0FuZERyb3A6IHsKICAgICAgICAgICAgZXh0cmFEcm9wem9uZXM6IFtdLAogICAgICAgICAgICBoaWRlRHJvcHpvbmVzOiB0cnVlLAogICAgICAgICAgICBkaXNhYmxlRGVmYXVsdERyb3B6b25lOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgdGV4dDogewogICAgICAgICAgICB1cGxvYWRCdXR0b246ICdVcGxvYWQgYSBmaWxlJywKICAgICAgICAgICAgY2FuY2VsQnV0dG9uOiAnQ2FuY2VsJywKICAgICAgICAgICAgcmV0cnlCdXR0b246ICdSZXRyeScsCiAgICAgICAgICAgIGZhaWxVcGxvYWQ6ICdVcGxvYWQgZmFpbGVkJywKICAgICAgICAgICAgZHJhZ1pvbmU6ICdEcm9wIGZpbGVzIGhlcmUgdG8gdXBsb2FkJywKICAgICAgICAgICAgZm9ybWF0UHJvZ3Jlc3M6ICJ7cGVyY2VudH0lIG9mIHt0b3RhbF9zaXplfSIsCiAgICAgICAgICAgIHdhaXRpbmdGb3JSZXNwb25zZTogIlByb2Nlc3NpbmcuLi4iCiAgICAgICAgfSwKICAgICAgICB0ZW1wbGF0ZTogJzxkaXYgY2xhc3M9InFxLXVwbG9hZGVyIj4nICsKICAgICAgICAgICAgKCghdGhpcy5fb3B0aW9ucy5kcmFnQW5kRHJvcCB8fCAhdGhpcy5fb3B0aW9ucy5kcmFnQW5kRHJvcC5kaXNhYmxlRGVmYXVsdERyb3B6b25lKSA/ICc8ZGl2IGNsYXNzPSJxcS11cGxvYWQtZHJvcC1hcmVhIj48c3Bhbj57ZHJhZ1pvbmVUZXh0fTwvc3Bhbj48L2Rpdj4nIDogJycpICsKICAgICAgICAgICAgKCF0aGlzLl9vcHRpb25zLmJ1dHRvbiA/ICc8ZGl2IGNsYXNzPSJxcS11cGxvYWQtYnV0dG9uIj48ZGl2Pnt1cGxvYWRCdXR0b25UZXh0fTwvZGl2PjwvZGl2PicgOiAnJykgKwogICAgICAgICAgICAoIXRoaXMuX29wdGlvbnMubGlzdEVsZW1lbnQgPyAnPHVsIGNsYXNzPSJxcS11cGxvYWQtbGlzdCI+PC91bD4nIDogJycpICsKICAgICAgICAgICAgJzwvZGl2PicsCgogICAgICAgIC8vIHRlbXBsYXRlIGZvciBvbmUgaXRlbSBpbiBmaWxlIGxpc3QKICAgICAgICBmaWxlVGVtcGxhdGU6ICc8bGk+JyArCiAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJxcS1wcm9ncmVzcy1iYXIiPjwvZGl2PicgKwogICAgICAgICAgICAnPHNwYW4gY2xhc3M9InFxLXVwbG9hZC1zcGlubmVyIj48L3NwYW4+JyArCiAgICAgICAgICAgICc8c3BhbiBjbGFzcz0icXEtdXBsb2FkLWZpbmlzaGVkIj48L3NwYW4+JyArCiAgICAgICAgICAgICc8c3BhbiBjbGFzcz0icXEtdXBsb2FkLWZpbGUiPjwvc3Bhbj4nICsKICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJxcS11cGxvYWQtc2l6ZSI+PC9zcGFuPicgKwogICAgICAgICAgICAnPGEgY2xhc3M9InFxLXVwbG9hZC1jYW5jZWwiIGhyZWY9IiMiPntjYW5jZWxCdXR0b25UZXh0fTwvYT4nICsKICAgICAgICAgICAgJzxhIGNsYXNzPSJxcS11cGxvYWQtcmV0cnkiIGhyZWY9IiMiPntyZXRyeUJ1dHRvblRleHR9PC9hPicgKwogICAgICAgICAgICAnPHNwYW4gY2xhc3M9InFxLXVwbG9hZC1zdGF0dXMtdGV4dCI+e3N0YXR1c1RleHR9PC9zcGFuPicgKwogICAgICAgICAgICAnPC9saT4nLAogICAgICAgIGNsYXNzZXM6IHsKICAgICAgICAgICAgLy8gdXNlZCB0byBnZXQgZWxlbWVudHMgZnJvbSB0ZW1wbGF0ZXMKICAgICAgICAgICAgYnV0dG9uOiAncXEtdXBsb2FkLWJ1dHRvbicsCiAgICAgICAgICAgIGRyb3A6ICdxcS11cGxvYWQtZHJvcC1hcmVhJywKICAgICAgICAgICAgZHJvcEFjdGl2ZTogJ3FxLXVwbG9hZC1kcm9wLWFyZWEtYWN0aXZlJywKICAgICAgICAgICAgZHJvcERpc2FibGVkOiAncXEtdXBsb2FkLWRyb3AtYXJlYS1kaXNhYmxlZCcsCiAgICAgICAgICAgIGxpc3Q6ICdxcS11cGxvYWQtbGlzdCcsCiAgICAgICAgICAgIHByb2dyZXNzQmFyOiAncXEtcHJvZ3Jlc3MtYmFyJywKICAgICAgICAgICAgZmlsZTogJ3FxLXVwbG9hZC1maWxlJywKICAgICAgICAgICAgc3Bpbm5lcjogJ3FxLXVwbG9hZC1zcGlubmVyJywKICAgICAgICAgICAgZmluaXNoZWQ6ICdxcS11cGxvYWQtZmluaXNoZWQnLAogICAgICAgICAgICByZXRyeWluZzogJ3FxLXVwbG9hZC1yZXRyeWluZycsCiAgICAgICAgICAgIHJldHJ5YWJsZTogJ3FxLXVwbG9hZC1yZXRyeWFibGUnLAogICAgICAgICAgICBzaXplOiAncXEtdXBsb2FkLXNpemUnLAogICAgICAgICAgICBjYW5jZWw6ICdxcS11cGxvYWQtY2FuY2VsJywKICAgICAgICAgICAgcmV0cnk6ICdxcS11cGxvYWQtcmV0cnknLAogICAgICAgICAgICBzdGF0dXNUZXh0OiAncXEtdXBsb2FkLXN0YXR1cy10ZXh0JywKCiAgICAgICAgICAgIC8vIGFkZGVkIHRvIGxpc3QgaXRlbSA8bGk+IHdoZW4gdXBsb2FkIGNvbXBsZXRlcwogICAgICAgICAgICAvLyB1c2VkIGluIGNzcyB0byBoaWRlIHByb2dyZXNzIHNwaW5uZXIKICAgICAgICAgICAgc3VjY2VzczogJ3FxLXVwbG9hZC1zdWNjZXNzJywKICAgICAgICAgICAgZmFpbDogJ3FxLXVwbG9hZC1mYWlsJywKCiAgICAgICAgICAgIHN1Y2Nlc3NJY29uOiBudWxsLAogICAgICAgICAgICBmYWlsSWNvbjogbnVsbAogICAgICAgIH0sCiAgICAgICAgZmFpbGVkVXBsb2FkVGV4dERpc3BsYXk6IHsKICAgICAgICAgICAgbW9kZTogJ2RlZmF1bHQnLCAvL2RlZmF1bHQsIGN1c3RvbSwgb3Igbm9uZQogICAgICAgICAgICBtYXhDaGFyczogNTAsCiAgICAgICAgICAgIHJlc3BvbnNlUHJvcGVydHk6ICdlcnJvcicsCiAgICAgICAgICAgIGVuYWJsZVRvb2x0aXA6IHRydWUKICAgICAgICB9LAogICAgICAgIG1lc3NhZ2VzOiB7CiAgICAgICAgICAgIHRvb01hbnlGaWxlc0Vycm9yOiAiWW91IG1heSBvbmx5IGRyb3Agb25lIGZpbGUiCiAgICAgICAgfSwKICAgICAgICByZXRyeTogewogICAgICAgICAgICBzaG93QXV0b1JldHJ5Tm90ZTogdHJ1ZSwKICAgICAgICAgICAgYXV0b1JldHJ5Tm90ZTogIlJldHJ5aW5nIHtyZXRyeU51bX0ve21heEF1dG99Li4uIiwKICAgICAgICAgICAgc2hvd0J1dHRvbjogZmFsc2UKICAgICAgICB9LAogICAgICAgIHNob3dNZXNzYWdlOiBmdW5jdGlvbihtZXNzYWdlKXsKICAgICAgICAgICAgYWxlcnQobWVzc2FnZSk7CiAgICAgICAgfQogICAgfSwgdHJ1ZSk7CgogICAgLy8gb3ZlcndyaXRlIG9wdGlvbnMgd2l0aCB1c2VyIHN1cHBsaWVkCiAgICBxcS5leHRlbmQodGhpcy5fb3B0aW9ucywgbywgdHJ1ZSk7CiAgICB0aGlzLl93cmFwQ2FsbGJhY2tzKCk7CgogICAgLy8gb3ZlcndyaXRlIHRoZSB1cGxvYWQgYnV0dG9uIHRleHQgaWYgYW55CiAgICAvLyBzYW1lIGZvciB0aGUgQ2FuY2VsIGJ1dHRvbiBhbmQgRmFpbCBtZXNzYWdlIHRleHQKICAgIHRoaXMuX29wdGlvbnMudGVtcGxhdGUgICAgID0gdGhpcy5fb3B0aW9ucy50ZW1wbGF0ZS5yZXBsYWNlKC9ce2RyYWdab25lVGV4dFx9L2csIHRoaXMuX29wdGlvbnMudGV4dC5kcmFnWm9uZSk7CiAgICB0aGlzLl9vcHRpb25zLnRlbXBsYXRlICAgICA9IHRoaXMuX29wdGlvbnMudGVtcGxhdGUucmVwbGFjZSgvXHt1cGxvYWRCdXR0b25UZXh0XH0vZywgdGhpcy5fb3B0aW9ucy50ZXh0LnVwbG9hZEJ1dHRvbik7CiAgICB0aGlzLl9vcHRpb25zLmZpbGVUZW1wbGF0ZSA9IHRoaXMuX29wdGlvbnMuZmlsZVRlbXBsYXRlLnJlcGxhY2UoL1x7Y2FuY2VsQnV0dG9uVGV4dFx9L2csIHRoaXMuX29wdGlvbnMudGV4dC5jYW5jZWxCdXR0b24pOwogICAgdGhpcy5fb3B0aW9ucy5maWxlVGVtcGxhdGUgPSB0aGlzLl9vcHRpb25zLmZpbGVUZW1wbGF0ZS5yZXBsYWNlKC9ce3JldHJ5QnV0dG9uVGV4dFx9L2csIHRoaXMuX29wdGlvbnMudGV4dC5yZXRyeUJ1dHRvbik7CiAgICB0aGlzLl9vcHRpb25zLmZpbGVUZW1wbGF0ZSA9IHRoaXMuX29wdGlvbnMuZmlsZVRlbXBsYXRlLnJlcGxhY2UoL1x7c3RhdHVzVGV4dFx9L2csICIiKTsKCiAgICB0aGlzLl9lbGVtZW50ID0gdGhpcy5fb3B0aW9ucy5lbGVtZW50OwogICAgdGhpcy5fZWxlbWVudC5pbm5lckhUTUwgPSB0aGlzLl9vcHRpb25zLnRlbXBsYXRlOwogICAgdGhpcy5fbGlzdEVsZW1lbnQgPSB0aGlzLl9vcHRpb25zLmxpc3RFbGVtZW50IHx8IHRoaXMuX2ZpbmQodGhpcy5fZWxlbWVudCwgJ2xpc3QnKTsKCiAgICB0aGlzLl9jbGFzc2VzID0gdGhpcy5fb3B0aW9ucy5jbGFzc2VzOwoKICAgIGlmICghdGhpcy5fYnV0dG9uKSB7CiAgICAgICAgdGhpcy5fYnV0dG9uID0gdGhpcy5fY3JlYXRlVXBsb2FkQnV0dG9uKHRoaXMuX2ZpbmQodGhpcy5fZWxlbWVudCwgJ2J1dHRvbicpKTsKICAgIH0KCiAgICB0aGlzLl9iaW5kQ2FuY2VsQW5kUmV0cnlFdmVudHMoKTsKICAgIHRoaXMuX3NldHVwRHJhZ0Ryb3AoKTsKfTsKCi8vIGluaGVyaXQgZnJvbSBCYXNpYyBVcGxvYWRlcgpxcS5leHRlbmQocXEuRmluZVVwbG9hZGVyLnByb3RvdHlwZSwgcXEuRmluZVVwbG9hZGVyQmFzaWMucHJvdG90eXBlKTsKCnFxLmV4dGVuZChxcS5GaW5lVXBsb2FkZXIucHJvdG90eXBlLCB7CiAgICBjbGVhclN0b3JlZEZpbGVzOiBmdW5jdGlvbigpIHsKICAgICAgICBxcS5GaW5lVXBsb2FkZXJCYXNpYy5wcm90b3R5cGUuY2xlYXJTdG9yZWRGaWxlcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIHRoaXMuX2xpc3RFbGVtZW50LmlubmVySFRNTCA9ICIiOwogICAgfSwKICAgIGFkZEV4dHJhRHJvcHpvbmU6IGZ1bmN0aW9uKGVsZW1lbnQpewogICAgICAgIHRoaXMuX3NldHVwRXh0cmFEcm9wem9uZShlbGVtZW50KTsKICAgIH0sCiAgICByZW1vdmVFeHRyYURyb3B6b25lOiBmdW5jdGlvbihlbGVtZW50KXsKICAgICAgICB2YXIgZHpzID0gdGhpcy5fb3B0aW9ucy5kcmFnQW5kRHJvcC5leHRyYURyb3B6b25lczsKICAgICAgICBmb3IodmFyIGkgaW4gZHpzKSBpZiAoZHpzW2ldID09PSBlbGVtZW50KSByZXR1cm4gdGhpcy5fb3B0aW9ucy5kcmFnQW5kRHJvcC5leHRyYURyb3B6b25lcy5zcGxpY2UoaSwxKTsKICAgIH0sCiAgICBnZXRJdGVtQnlGaWxlSWQ6IGZ1bmN0aW9uKGlkKXsKICAgICAgICB2YXIgaXRlbSA9IHRoaXMuX2xpc3RFbGVtZW50LmZpcnN0Q2hpbGQ7CgogICAgICAgIC8vIHRoZXJlIGNhbid0IGJlIHR4dCBub2RlcyBpbiBkeW5hbWljYWxseSBjcmVhdGVkIGxpc3QKICAgICAgICAvLyBhbmQgd2UgY2FuICB1c2UgbmV4dFNpYmxpbmcKICAgICAgICB3aGlsZSAoaXRlbSl7CiAgICAgICAgICAgIGlmIChpdGVtLnFxRmlsZUlkID09IGlkKSByZXR1cm4gaXRlbTsKICAgICAgICAgICAgaXRlbSA9IGl0ZW0ubmV4dFNpYmxpbmc7CiAgICAgICAgfQogICAgfSwKICAgIHJlc2V0OiBmdW5jdGlvbigpIHsKICAgICAgICBxcS5GaW5lVXBsb2FkZXJCYXNpYy5wcm90b3R5cGUucmVzZXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB0aGlzLl9lbGVtZW50LmlubmVySFRNTCA9IHRoaXMuX29wdGlvbnMudGVtcGxhdGU7CiAgICAgICAgdGhpcy5fbGlzdEVsZW1lbnQgPSB0aGlzLl9vcHRpb25zLmxpc3RFbGVtZW50IHx8IHRoaXMuX2ZpbmQodGhpcy5fZWxlbWVudCwgJ2xpc3QnKTsKICAgICAgICBpZiAoIXRoaXMuX29wdGlvbnMuYnV0dG9uKSB7CiAgICAgICAgICAgIHRoaXMuX2J1dHRvbiA9IHRoaXMuX2NyZWF0ZVVwbG9hZEJ1dHRvbih0aGlzLl9maW5kKHRoaXMuX2VsZW1lbnQsICdidXR0b24nKSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2JpbmRDYW5jZWxBbmRSZXRyeUV2ZW50cygpOwogICAgICAgIHRoaXMuX3NldHVwRHJhZ0Ryb3AoKTsKICAgIH0sCiAgICBfbGVhdmluZ19kb2N1bWVudF9vdXQ6IGZ1bmN0aW9uKGUpewogICAgICAgIHJldHVybiAoKHFxLmNocm9tZSgpIHx8IChxcS5zYWZhcmkoKSAmJiBxcS53aW5kb3dzKCkpKSAmJiBlLmNsaWVudFggPT0gMCAmJiBlLmNsaWVudFkgPT0gMCkgLy8gbnVsbCBjb29yZHMgZm9yIENocm9tZSBhbmQgU2FmYXJpIFdpbmRvd3MKICAgICAgICAgICAgfHwgKHFxLmZpcmVmb3goKSAmJiAhZS5yZWxhdGVkVGFyZ2V0KTsgLy8gbnVsbCBlLnJlbGF0ZWRUYXJnZXQgZm9yIEZpcmVmb3gKICAgIH0sCiAgICBfc3RvcmVGaWxlRm9yTGF0ZXI6IGZ1bmN0aW9uKGlkKSB7CiAgICAgICAgcXEuRmluZVVwbG9hZGVyQmFzaWMucHJvdG90eXBlLl9zdG9yZUZpbGVGb3JMYXRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIHZhciBpdGVtID0gdGhpcy5nZXRJdGVtQnlGaWxlSWQoaWQpOwogICAgICAgIHFxKHRoaXMuX2ZpbmQoaXRlbSwgJ3NwaW5uZXInKSkuaGlkZSgpOwogICAgfSwKICAgIC8qKgogICAgICogR2V0cyBvbmUgb2YgdGhlIGVsZW1lbnRzIGxpc3RlZCBpbiB0aGlzLl9vcHRpb25zLmNsYXNzZXMKICAgICAqKi8KICAgIF9maW5kOiBmdW5jdGlvbihwYXJlbnQsIHR5cGUpewogICAgICAgIHZhciBlbGVtZW50ID0gcXEocGFyZW50KS5nZXRCeUNsYXNzKHRoaXMuX29wdGlvbnMuY2xhc3Nlc1t0eXBlXSlbMF07CiAgICAgICAgaWYgKCFlbGVtZW50KXsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdlbGVtZW50IG5vdCBmb3VuZCAnICsgdHlwZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZWxlbWVudDsKICAgIH0sCiAgICBfc2V0dXBFeHRyYURyb3B6b25lOiBmdW5jdGlvbihlbGVtZW50KXsKICAgICAgICB0aGlzLl9vcHRpb25zLmRyYWdBbmREcm9wLmV4dHJhRHJvcHpvbmVzLnB1c2goZWxlbWVudCk7CiAgICAgICAgdGhpcy5fc2V0dXBEcm9wem9uZShlbGVtZW50KTsKICAgIH0sCiAgICBfc2V0dXBEcm9wem9uZTogZnVuY3Rpb24oZHJvcEFyZWEpewogICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgdmFyIGR6ID0gbmV3IHFxLlVwbG9hZERyb3Bab25lKHsKICAgICAgICAgICAgZWxlbWVudDogZHJvcEFyZWEsCiAgICAgICAgICAgIG9uRW50ZXI6IGZ1bmN0aW9uKGUpewogICAgICAgICAgICAgICAgcXEoZHJvcEFyZWEpLmFkZENsYXNzKHNlbGYuX2NsYXNzZXMuZHJvcEFjdGl2ZSk7CiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBvbkxlYXZlOiBmdW5jdGlvbihlKXsKICAgICAgICAgICAgICAgIC8vZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgb25MZWF2ZU5vdERlc2NlbmRhbnRzOiBmdW5jdGlvbihlKXsKICAgICAgICAgICAgICAgIHFxKGRyb3BBcmVhKS5yZW1vdmVDbGFzcyhzZWxmLl9jbGFzc2VzLmRyb3BBY3RpdmUpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBvbkRyb3A6IGZ1bmN0aW9uKGUpewogICAgICAgICAgICAgICAgaWYgKHNlbGYuX29wdGlvbnMuZHJhZ0FuZERyb3AuaGlkZURyb3B6b25lcykgewogICAgICAgICAgICAgICAgICAgIHFxKGRyb3BBcmVhKS5oaWRlKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcXEoZHJvcEFyZWEpLnJlbW92ZUNsYXNzKHNlbGYuX2NsYXNzZXMuZHJvcEFjdGl2ZSk7CiAgICAgICAgICAgICAgICBpZiAoZS5kYXRhVHJhbnNmZXIuZmlsZXMubGVuZ3RoID4gMSAmJiAhc2VsZi5fb3B0aW9ucy5tdWx0aXBsZSkgewogICAgICAgICAgICAgICAgICAgIHNlbGYuX2Vycm9yKCd0b29NYW55RmlsZXNFcnJvcicsICIiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNlbGYuX3VwbG9hZEZpbGVMaXN0KGUuZGF0YVRyYW5zZmVyLmZpbGVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICB0aGlzLmFkZERpc3Bvc2VyKGZ1bmN0aW9uKCkgeyBkei5kaXNwb3NlKCk7IH0pOwoKICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5kcmFnQW5kRHJvcC5oaWRlRHJvcHpvbmVzKSB7CiAgICAgICAgICAgIHFxKGRyb3BBcmVhKS5oaWRlKCk7CiAgICAgICAgfQogICAgfSwKICAgIF9zZXR1cERyYWdEcm9wOiBmdW5jdGlvbigpewogICAgICAgIHZhciBzZWxmLCBkcm9wQXJlYTsKCiAgICAgICAgc2VsZiA9IHRoaXM7CgogICAgICAgIGlmICghdGhpcy5fb3B0aW9ucy5kcmFnQW5kRHJvcC5kaXNhYmxlRGVmYXVsdERyb3B6b25lKSB7CiAgICAgICAgICAgIGRyb3BBcmVhID0gdGhpcy5fZmluZCh0aGlzLl9lbGVtZW50LCAnZHJvcCcpOwogICAgICAgICAgICB0aGlzLl9vcHRpb25zLmRyYWdBbmREcm9wLmV4dHJhRHJvcHpvbmVzLnB1c2goZHJvcEFyZWEpOwogICAgICAgIH0KCiAgICAgICAgdmFyIGRyb3B6b25lcyA9IHRoaXMuX29wdGlvbnMuZHJhZ0FuZERyb3AuZXh0cmFEcm9wem9uZXM7CiAgICAgICAgdmFyIGk7CiAgICAgICAgZm9yIChpPTA7IGkgPCBkcm9wem9uZXMubGVuZ3RoOyBpKyspewogICAgICAgICAgICB0aGlzLl9zZXR1cERyb3B6b25lKGRyb3B6b25lc1tpXSk7CiAgICAgICAgfQoKICAgICAgICAvLyBJRSA8PSA5IGRvZXMgbm90IHN1cHBvcnQgdGhlIEZpbGUgQVBJIHVzZWQgZm9yIGRyYWcrZHJvcCB1cGxvYWRzCiAgICAgICAgaWYgKCF0aGlzLl9vcHRpb25zLmRyYWdBbmREcm9wLmRpc2FibGVEZWZhdWx0RHJvcHpvbmUgJiYgKCFxcS5pZSgpIHx8IHFxLmllMTAoKSkpIHsKICAgICAgICAgICAgdGhpcy5fYXR0YWNoKGRvY3VtZW50LCAnZHJhZ2VudGVyJywgZnVuY3Rpb24oZSl7CiAgICAgICAgICAgICAgICBpZiAocXEoZHJvcEFyZWEpLmhhc0NsYXNzKHNlbGYuX2NsYXNzZXMuZHJvcERpc2FibGVkKSkgcmV0dXJuOwoKICAgICAgICAgICAgICAgIGRyb3BBcmVhLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBkcm9wem9uZXMubGVuZ3RoOyBpKyspeyBkcm9wem9uZXNbaV0uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7IH0KCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICB0aGlzLl9hdHRhY2goZG9jdW1lbnQsICdkcmFnbGVhdmUnLCBmdW5jdGlvbihlKXsKICAgICAgICAgICAgaWYgKHNlbGYuX29wdGlvbnMuZHJhZ0FuZERyb3AuaGlkZURyb3B6b25lcyAmJiBxcS5GaW5lVXBsb2FkZXIucHJvdG90eXBlLl9sZWF2aW5nX2RvY3VtZW50X291dChlKSkgewogICAgICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBkcm9wem9uZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBxcShkcm9wem9uZXNbaV0pLmhpZGUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHFxKGRvY3VtZW50KS5hdHRhY2goJ2Ryb3AnLCBmdW5jdGlvbihlKXsKICAgICAgICAgICAgaWYgKHNlbGYuX29wdGlvbnMuZHJhZ0FuZERyb3AuaGlkZURyb3B6b25lcykgewogICAgICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBkcm9wem9uZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBxcShkcm9wem9uZXNbaV0pLmhpZGUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgfSk7CiAgICB9LAogICAgX29uU3VibWl0OiBmdW5jdGlvbihpZCwgZmlsZU5hbWUpewogICAgICAgIHFxLkZpbmVVcGxvYWRlckJhc2ljLnByb3RvdHlwZS5fb25TdWJtaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB0aGlzLl9hZGRUb0xpc3QoaWQsIGZpbGVOYW1lKTsKICAgIH0sCiAgICAvLyBVcGRhdGUgdGhlIHByb2dyZXNzIGJhciAmIHBlcmNlbnRhZ2UgYXMgdGhlIGZpbGUgaXMgdXBsb2FkZWQKICAgIF9vblByb2dyZXNzOiBmdW5jdGlvbihpZCwgZmlsZU5hbWUsIGxvYWRlZCwgdG90YWwpewogICAgICAgIHFxLkZpbmVVcGxvYWRlckJhc2ljLnByb3RvdHlwZS5fb25Qcm9ncmVzcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwoKICAgICAgICB2YXIgaXRlbSwgcHJvZ3Jlc3NCYXIsIHRleHQsIHBlcmNlbnQsIGNhbmNlbExpbmssIHNpemU7CgogICAgICAgIGl0ZW0gPSB0aGlzLmdldEl0ZW1CeUZpbGVJZChpZCk7CiAgICAgICAgcHJvZ3Jlc3NCYXIgPSB0aGlzLl9maW5kKGl0ZW0sICdwcm9ncmVzc0JhcicpOwogICAgICAgIHBlcmNlbnQgPSBNYXRoLnJvdW5kKGxvYWRlZCAvIHRvdGFsICogMTAwKTsKCiAgICAgICAgaWYgKGxvYWRlZCA9PT0gdG90YWwpIHsKICAgICAgICAgICAgY2FuY2VsTGluayA9IHRoaXMuX2ZpbmQoaXRlbSwgJ2NhbmNlbCcpOwogICAgICAgICAgICBxcShjYW5jZWxMaW5rKS5oaWRlKCk7CgogICAgICAgICAgICBxcShwcm9ncmVzc0JhcikuaGlkZSgpOwogICAgICAgICAgICBxcSh0aGlzLl9maW5kKGl0ZW0sICdzdGF0dXNUZXh0JykpLnNldFRleHQodGhpcy5fb3B0aW9ucy50ZXh0LndhaXRpbmdGb3JSZXNwb25zZSk7CgogICAgICAgICAgICAvLyBJZiBsYXN0IGJ5dGUgd2FzIHNlbnQsIGp1c3QgZGlzcGxheSBmaW5hbCBzaXplCiAgICAgICAgICAgIHRleHQgPSB0aGlzLl9mb3JtYXRTaXplKHRvdGFsKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8vIElmIHN0aWxsIHVwbG9hZGluZywgZGlzcGxheSBwZXJjZW50YWdlCiAgICAgICAgICAgIHRleHQgPSB0aGlzLl9mb3JtYXRQcm9ncmVzcyhsb2FkZWQsIHRvdGFsKTsKCiAgICAgICAgICAgIHFxKHByb2dyZXNzQmFyKS5jc3Moe2Rpc3BsYXk6ICdibG9jayd9KTsKICAgICAgICB9CgogICAgICAgIC8vIFVwZGF0ZSBwcm9ncmVzcyBiYXIgZWxlbWVudAogICAgICAgIHFxKHByb2dyZXNzQmFyKS5jc3Moe3dpZHRoOiBwZXJjZW50ICsgJyUnfSk7CgogICAgICAgIHNpemUgPSB0aGlzLl9maW5kKGl0ZW0sICdzaXplJyk7CiAgICAgICAgcXEoc2l6ZSkuY3NzKHtkaXNwbGF5OiAnaW5saW5lJ30pOwogICAgICAgIHFxKHNpemUpLnNldFRleHQodGV4dCk7CiAgICB9LAogICAgX29uQ29tcGxldGU6IGZ1bmN0aW9uKGlkLCBmaWxlTmFtZSwgcmVzdWx0LCB4aHIpewogICAgICAgIHFxLkZpbmVVcGxvYWRlckJhc2ljLnByb3RvdHlwZS5fb25Db21wbGV0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwoKICAgICAgICB2YXIgaXRlbSA9IHRoaXMuZ2V0SXRlbUJ5RmlsZUlkKGlkKTsKCiAgICAgICAgcXEodGhpcy5fZmluZChpdGVtLCAnc3RhdHVzVGV4dCcpKS5jbGVhclRleHQoKTsKCiAgICAgICAgcXEoaXRlbSkucmVtb3ZlQ2xhc3ModGhpcy5fY2xhc3Nlcy5yZXRyeWluZyk7CiAgICAgICAgcXEodGhpcy5fZmluZChpdGVtLCAncHJvZ3Jlc3NCYXInKSkuaGlkZSgpOwoKICAgICAgICBpZiAoIXRoaXMuX29wdGlvbnMuZGlzYWJsZUNhbmNlbEZvckZvcm1VcGxvYWRzIHx8IHFxLlVwbG9hZEhhbmRsZXJYaHIuaXNTdXBwb3J0ZWQoKSkgewogICAgICAgICAgICBxcSh0aGlzLl9maW5kKGl0ZW0sICdjYW5jZWwnKSkuaGlkZSgpOwogICAgICAgIH0KICAgICAgICBxcSh0aGlzLl9maW5kKGl0ZW0sICdzcGlubmVyJykpLmhpZGUoKTsKCiAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKXsKICAgICAgICAgICAgcXEoaXRlbSkuYWRkQ2xhc3ModGhpcy5fY2xhc3Nlcy5zdWNjZXNzKTsKICAgICAgICAgICAgaWYgKHRoaXMuX2NsYXNzZXMuc3VjY2Vzc0ljb24pIHsKICAgICAgICAgICAgICAgIHRoaXMuX2ZpbmQoaXRlbSwgJ2ZpbmlzaGVkJykuc3R5bGUuZGlzcGxheSA9ICJpbmxpbmUtYmxvY2siOwogICAgICAgICAgICAgICAgcXEoaXRlbSkuYWRkQ2xhc3ModGhpcy5fY2xhc3Nlcy5zdWNjZXNzSWNvbik7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBxcShpdGVtKS5hZGRDbGFzcyh0aGlzLl9jbGFzc2VzLmZhaWwpOwogICAgICAgICAgICBpZiAodGhpcy5fY2xhc3Nlcy5mYWlsSWNvbikgewogICAgICAgICAgICAgICAgdGhpcy5fZmluZChpdGVtLCAnZmluaXNoZWQnKS5zdHlsZS5kaXNwbGF5ID0gImlubGluZS1ibG9jayI7CiAgICAgICAgICAgICAgICBxcShpdGVtKS5hZGRDbGFzcyh0aGlzLl9jbGFzc2VzLmZhaWxJY29uKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5yZXRyeS5zaG93QnV0dG9uICYmICF0aGlzLl9wcmV2ZW50UmV0cmllc1tpZF0pIHsKICAgICAgICAgICAgICAgIHFxKGl0ZW0pLmFkZENsYXNzKHRoaXMuX2NsYXNzZXMucmV0cnlhYmxlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9jb250cm9sRmFpbHVyZVRleHREaXNwbGF5KGl0ZW0sIHJlc3VsdCk7CiAgICAgICAgfQogICAgfSwKICAgIF9vblVwbG9hZDogZnVuY3Rpb24oaWQsIGZpbGVOYW1lLCB4aHIpewogICAgICAgIHFxLkZpbmVVcGxvYWRlckJhc2ljLnByb3RvdHlwZS5fb25VcGxvYWQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKCiAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLmdldEl0ZW1CeUZpbGVJZChpZCk7CiAgICAgICAgdGhpcy5fc2hvd1NwaW5uZXIoaXRlbSk7CiAgICB9LAogICAgX29uQmVmb3JlQXV0b1JldHJ5OiBmdW5jdGlvbihpZCkgewogICAgICAgIHZhciBpdGVtLCBwcm9ncmVzc0JhciwgY2FuY2VsTGluaywgZmFpbFRleHRFbCwgcmV0cnlOdW1Gb3JEaXNwbGF5LCBtYXhBdXRvLCByZXRyeU5vdGU7CgogICAgICAgIHFxLkZpbmVVcGxvYWRlckJhc2ljLnByb3RvdHlwZS5fb25CZWZvcmVBdXRvUmV0cnkuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKCiAgICAgICAgaXRlbSA9IHRoaXMuZ2V0SXRlbUJ5RmlsZUlkKGlkKTsKICAgICAgICBwcm9ncmVzc0JhciA9IHRoaXMuX2ZpbmQoaXRlbSwgJ3Byb2dyZXNzQmFyJyk7CgogICAgICAgIHRoaXMuX3Nob3dDYW5jZWxMaW5rKGl0ZW0pOwogICAgICAgIHByb2dyZXNzQmFyLnN0eWxlLndpZHRoID0gMDsKICAgICAgICBxcShwcm9ncmVzc0JhcikuaGlkZSgpOwoKICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5yZXRyeS5zaG93QXV0b1JldHJ5Tm90ZSkgewogICAgICAgICAgICBmYWlsVGV4dEVsID0gdGhpcy5fZmluZChpdGVtLCAnc3RhdHVzVGV4dCcpOwogICAgICAgICAgICByZXRyeU51bUZvckRpc3BsYXkgPSB0aGlzLl9hdXRvUmV0cmllc1tpZF0gKyAxOwogICAgICAgICAgICBtYXhBdXRvID0gdGhpcy5fb3B0aW9ucy5yZXRyeS5tYXhBdXRvQXR0ZW1wdHM7CgogICAgICAgICAgICByZXRyeU5vdGUgPSB0aGlzLl9vcHRpb25zLnJldHJ5LmF1dG9SZXRyeU5vdGUucmVwbGFjZSgvXHtyZXRyeU51bVx9L2csIHJldHJ5TnVtRm9yRGlzcGxheSk7CiAgICAgICAgICAgIHJldHJ5Tm90ZSA9IHJldHJ5Tm90ZS5yZXBsYWNlKC9ce21heEF1dG9cfS9nLCBtYXhBdXRvKTsKCiAgICAgICAgICAgIHFxKGZhaWxUZXh0RWwpLnNldFRleHQocmV0cnlOb3RlKTsKICAgICAgICAgICAgaWYgKHJldHJ5TnVtRm9yRGlzcGxheSA9PT0gMSkgewogICAgICAgICAgICAgICAgcXEoaXRlbSkuYWRkQ2xhc3ModGhpcy5fY2xhc3Nlcy5yZXRyeWluZyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9LAogICAgLy9yZXR1cm4gZmFsc2UgaWYgd2Ugc2hvdWxkIG5vdCBhdHRlbXB0IHRoZSByZXF1ZXN0ZWQgcmV0cnkKICAgIF9vbkJlZm9yZU1hbnVhbFJldHJ5OiBmdW5jdGlvbihpZCkgewogICAgICAgIGlmIChxcS5GaW5lVXBsb2FkZXJCYXNpYy5wcm90b3R5cGUuX29uQmVmb3JlTWFudWFsUmV0cnkuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgewogICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMuZ2V0SXRlbUJ5RmlsZUlkKGlkKTsKICAgICAgICAgICAgdGhpcy5fZmluZChpdGVtLCAncHJvZ3Jlc3NCYXInKS5zdHlsZS53aWR0aCA9IDA7CiAgICAgICAgICAgIHFxKGl0ZW0pLnJlbW92ZUNsYXNzKHRoaXMuX2NsYXNzZXMuZmFpbCk7CiAgICAgICAgICAgIHRoaXMuX3Nob3dTcGlubmVyKGl0ZW0pOwogICAgICAgICAgICB0aGlzLl9zaG93Q2FuY2VsTGluayhpdGVtKTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0sCiAgICBfYWRkVG9MaXN0OiBmdW5jdGlvbihpZCwgZmlsZU5hbWUpewogICAgICAgIHZhciBpdGVtID0gcXEudG9FbGVtZW50KHRoaXMuX29wdGlvbnMuZmlsZVRlbXBsYXRlKTsKICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5kaXNhYmxlQ2FuY2VsRm9yRm9ybVVwbG9hZHMgJiYgIXFxLlVwbG9hZEhhbmRsZXJYaHIuaXNTdXBwb3J0ZWQoKSkgewogICAgICAgICAgICB2YXIgY2FuY2VsTGluayA9IHRoaXMuX2ZpbmQoaXRlbSwgJ2NhbmNlbCcpOwogICAgICAgICAgICBxcShjYW5jZWxMaW5rKS5yZW1vdmUoKTsKICAgICAgICB9CgogICAgICAgIGl0ZW0ucXFGaWxlSWQgPSBpZDsKCiAgICAgICAgdmFyIGZpbGVFbGVtZW50ID0gdGhpcy5fZmluZChpdGVtLCAnZmlsZScpOwogICAgICAgIHFxKGZpbGVFbGVtZW50KS5zZXRUZXh0KHRoaXMuX2Zvcm1hdEZpbGVOYW1lKGZpbGVOYW1lKSk7CiAgICAgICAgcXEodGhpcy5fZmluZChpdGVtLCAnc2l6ZScpKS5oaWRlKCk7CiAgICAgICAgaWYgKCF0aGlzLl9vcHRpb25zLm11bHRpcGxlKSB0aGlzLl9jbGVhckxpc3QoKTsKICAgICAgICB0aGlzLl9saXN0RWxlbWVudC5hcHBlbmRDaGlsZChpdGVtKTsKICAgIH0sCiAgICBfY2xlYXJMaXN0OiBmdW5jdGlvbigpewogICAgICAgIHRoaXMuX2xpc3RFbGVtZW50LmlubmVySFRNTCA9ICcnOwogICAgICAgIHRoaXMuY2xlYXJTdG9yZWRGaWxlcygpOwogICAgfSwKICAgIC8qKgogICAgICogZGVsZWdhdGUgY2xpY2sgZXZlbnQgZm9yIGNhbmNlbCAmIHJldHJ5IGxpbmtzCiAgICAgKiovCiAgICBfYmluZENhbmNlbEFuZFJldHJ5RXZlbnRzOiBmdW5jdGlvbigpewogICAgICAgIHZhciBzZWxmID0gdGhpcywKICAgICAgICAgICAgbGlzdCA9IHRoaXMuX2xpc3RFbGVtZW50OwoKICAgICAgICB0aGlzLl9hdHRhY2gobGlzdCwgJ2NsaWNrJywgZnVuY3Rpb24oZSl7CiAgICAgICAgICAgIGUgPSBlIHx8IHdpbmRvdy5ldmVudDsKICAgICAgICAgICAgdmFyIHRhcmdldCA9IGUudGFyZ2V0IHx8IGUuc3JjRWxlbWVudDsKCiAgICAgICAgICAgIGlmIChxcSh0YXJnZXQpLmhhc0NsYXNzKHNlbGYuX2NsYXNzZXMuY2FuY2VsKSB8fCBxcSh0YXJnZXQpLmhhc0NsYXNzKHNlbGYuX2NsYXNzZXMucmV0cnkpKXsKICAgICAgICAgICAgICAgIHFxLnByZXZlbnREZWZhdWx0KGUpOwoKICAgICAgICAgICAgICAgIHZhciBpdGVtID0gdGFyZ2V0LnBhcmVudE5vZGU7CiAgICAgICAgICAgICAgICB3aGlsZShpdGVtLnFxRmlsZUlkID09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgIGl0ZW0gPSB0YXJnZXQgPSB0YXJnZXQucGFyZW50Tm9kZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAocXEodGFyZ2V0KS5oYXNDbGFzcyhzZWxmLl9jbGFzc2VzLmNhbmNlbCkpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmNhbmNlbChpdGVtLnFxRmlsZUlkKTsKICAgICAgICAgICAgICAgICAgICBxcShpdGVtKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHFxKGl0ZW0pLnJlbW92ZUNsYXNzKHNlbGYuX2NsYXNzZXMucmV0cnlhYmxlKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnJldHJ5KGl0ZW0ucXFGaWxlSWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9LAogICAgX2Zvcm1hdFByb2dyZXNzOiBmdW5jdGlvbiAodXBsb2FkZWRTaXplLCB0b3RhbFNpemUpIHsKICAgICAgICB2YXIgbWVzc2FnZSA9IHRoaXMuX29wdGlvbnMudGV4dC5mb3JtYXRQcm9ncmVzczsKICAgICAgICBmdW5jdGlvbiByKG5hbWUsIHJlcGxhY2VtZW50KSB7IG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2UobmFtZSwgcmVwbGFjZW1lbnQpOyB9CgogICAgICAgIHIoJ3twZXJjZW50fScsIE1hdGgucm91bmQodXBsb2FkZWRTaXplIC8gdG90YWxTaXplICogMTAwKSk7CiAgICAgICAgcigne3RvdGFsX3NpemV9JywgdGhpcy5fZm9ybWF0U2l6ZSh0b3RhbFNpemUpKTsKICAgICAgICByZXR1cm4gbWVzc2FnZTsKICAgIH0sCiAgICBfY29udHJvbEZhaWx1cmVUZXh0RGlzcGxheTogZnVuY3Rpb24oaXRlbSwgcmVzcG9uc2UpIHsKICAgICAgICB2YXIgbW9kZSwgbWF4Q2hhcnMsIHJlc3BvbnNlUHJvcGVydHksIGZhaWx1cmVSZWFzb24sIHNob3J0RmFpbHVyZVJlYXNvbjsKCiAgICAgICAgbW9kZSA9IHRoaXMuX29wdGlvbnMuZmFpbGVkVXBsb2FkVGV4dERpc3BsYXkubW9kZTsKICAgICAgICBtYXhDaGFycyA9IHRoaXMuX29wdGlvbnMuZmFpbGVkVXBsb2FkVGV4dERpc3BsYXkubWF4Q2hhcnM7CiAgICAgICAgcmVzcG9uc2VQcm9wZXJ0eSA9IHRoaXMuX29wdGlvbnMuZmFpbGVkVXBsb2FkVGV4dERpc3BsYXkucmVzcG9uc2VQcm9wZXJ0eTsKCiAgICAgICAgaWYgKG1vZGUgPT09ICdjdXN0b20nKSB7CiAgICAgICAgICAgIGZhaWx1cmVSZWFzb24gPSByZXNwb25zZVtyZXNwb25zZVByb3BlcnR5XTsKICAgICAgICAgICAgaWYgKGZhaWx1cmVSZWFzb24pIHsKICAgICAgICAgICAgICAgIGlmIChmYWlsdXJlUmVhc29uLmxlbmd0aCA+IG1heENoYXJzKSB7CiAgICAgICAgICAgICAgICAgICAgc2hvcnRGYWlsdXJlUmVhc29uID0gZmFpbHVyZVJlYXNvbi5zdWJzdHJpbmcoMCwgbWF4Q2hhcnMpICsgJy4uLic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBmYWlsdXJlUmVhc29uID0gdGhpcy5fb3B0aW9ucy50ZXh0LmZhaWxVcGxvYWQ7CiAgICAgICAgICAgICAgICB0aGlzLmxvZygiJyIgKyByZXNwb25zZVByb3BlcnR5ICsgIicgaXMgbm90IGEgdmFsaWQgcHJvcGVydHkgb24gdGhlIHNlcnZlciByZXNwb25zZS4iLCAnd2FybicpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBxcSh0aGlzLl9maW5kKGl0ZW0sICdzdGF0dXNUZXh0JykpLnNldFRleHQoc2hvcnRGYWlsdXJlUmVhc29uIHx8IGZhaWx1cmVSZWFzb24pOwoKICAgICAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMuZmFpbGVkVXBsb2FkVGV4dERpc3BsYXkuZW5hYmxlVG9vbHRpcCkgewogICAgICAgICAgICAgICAgdGhpcy5fc2hvd1Rvb2x0aXAoaXRlbSwgZmFpbHVyZVJlYXNvbik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAobW9kZSA9PT0gJ2RlZmF1bHQnKSB7CiAgICAgICAgICAgIHFxKHRoaXMuX2ZpbmQoaXRlbSwgJ3N0YXR1c1RleHQnKSkuc2V0VGV4dCh0aGlzLl9vcHRpb25zLnRleHQuZmFpbFVwbG9hZCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG1vZGUgIT09ICdub25lJykgewogICAgICAgICAgICB0aGlzLmxvZygiZmFpbGVkVXBsb2FkVGV4dERpc3BsYXkubW9kZSB2YWx1ZSBvZiAnIiArIG1vZGUgKyAiJyBpcyBub3QgdmFsaWQiLCAnd2FybicpOwogICAgICAgIH0KICAgIH0sCiAgICAvL1RPRE8gdHVybiB0aGlzIGludG8gYSByZWFsIHRvb2x0aXAsIHdpdGggY2xpY2sgdHJpZ2dlciAoc28gaXQgaXMgdXNhYmxlIG9uIG1vYmlsZSBkZXZpY2VzKS4gIFNlZSBjYXNlICMzNTUgZm9yIGRldGFpbHMuCiAgICBfc2hvd1Rvb2x0aXA6IGZ1bmN0aW9uKGl0ZW0sIHRleHQpIHsKICAgICAgICBpdGVtLnRpdGxlID0gdGV4dDsKICAgIH0sCiAgICBfc2hvd1NwaW5uZXI6IGZ1bmN0aW9uKGl0ZW0pIHsKICAgICAgICB2YXIgc3Bpbm5lckVsID0gdGhpcy5fZmluZChpdGVtLCAnc3Bpbm5lcicpOwogICAgICAgIHNwaW5uZXJFbC5zdHlsZS5kaXNwbGF5ID0gImlubGluZS1ibG9jayI7CiAgICB9LAogICAgX3Nob3dDYW5jZWxMaW5rOiBmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgaWYgKCF0aGlzLl9vcHRpb25zLmRpc2FibGVDYW5jZWxGb3JGb3JtVXBsb2FkcyB8fCBxcS5VcGxvYWRIYW5kbGVyWGhyLmlzU3VwcG9ydGVkKCkpIHsKICAgICAgICAgICAgdmFyIGNhbmNlbExpbmsgPSB0aGlzLl9maW5kKGl0ZW0sICdjYW5jZWwnKTsKICAgICAgICAgICAgY2FuY2VsTGluay5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZSc7CiAgICAgICAgfQogICAgfSwKICAgIF9lcnJvcjogZnVuY3Rpb24oY29kZSwgZmlsZU5hbWUpewogICAgICAgIHZhciBtZXNzYWdlID0gcXEuRmluZVVwbG9hZGVyQmFzaWMucHJvdG90eXBlLl9lcnJvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIHRoaXMuX29wdGlvbnMuc2hvd01lc3NhZ2UobWVzc2FnZSk7CiAgICB9Cn0pOwoKcXEuVXBsb2FkRHJvcFpvbmUgPSBmdW5jdGlvbihvKXsKICAgIHRoaXMuX29wdGlvbnMgPSB7CiAgICAgICAgZWxlbWVudDogbnVsbCwKICAgICAgICBvbkVudGVyOiBmdW5jdGlvbihlKXt9LAogICAgICAgIG9uTGVhdmU6IGZ1bmN0aW9uKGUpe30sCiAgICAgICAgLy8gaXMgbm90IGZpcmVkIHdoZW4gbGVhdmluZyBlbGVtZW50IGJ5IGhvdmVyaW5nIGRlc2NlbmRhbnRzCiAgICAgICAgb25MZWF2ZU5vdERlc2NlbmRhbnRzOiBmdW5jdGlvbihlKXt9LAogICAgICAgIG9uRHJvcDogZnVuY3Rpb24oZSl7fQogICAgfTsKICAgIHFxLmV4dGVuZCh0aGlzLl9vcHRpb25zLCBvKTsKICAgIHFxLmV4dGVuZCh0aGlzLCBxcS5EaXNwb3NlU3VwcG9ydCk7CgogICAgdGhpcy5fZWxlbWVudCA9IHRoaXMuX29wdGlvbnMuZWxlbWVudDsKCiAgICB0aGlzLl9kaXNhYmxlRHJvcE91dHNpZGUoKTsKICAgIHRoaXMuX2F0dGFjaEV2ZW50cygpOwp9OwoKcXEuVXBsb2FkRHJvcFpvbmUucHJvdG90eXBlID0gewogICAgX2RyYWdvdmVyX3Nob3VsZF9iZV9jYW5jZWxlZDogZnVuY3Rpb24oKXsKICAgICAgICByZXR1cm4gcXEuc2FmYXJpKCkgfHwgKHFxLmZpcmVmb3goKSAmJiBxcS53aW5kb3dzKCkpOwogICAgfSwKICAgIF9kaXNhYmxlRHJvcE91dHNpZGU6IGZ1bmN0aW9uKGUpewogICAgICAgIC8vIHJ1biBvbmx5IG9uY2UgZm9yIGFsbCBpbnN0YW5jZXMKICAgICAgICBpZiAoIXFxLlVwbG9hZERyb3Bab25lLmRyb3BPdXRzaWRlRGlzYWJsZWQgKXsKCiAgICAgICAgICAgIC8vIGZvciB0aGVzZSBjYXNlcyB3ZSBuZWVkIHRvIGNhdGNoIG9uRHJvcCB0byByZXNldCBkcm9wQXJlYQogICAgICAgICAgICBpZiAodGhpcy5fZHJhZ292ZXJfc2hvdWxkX2JlX2NhbmNlbGVkKXsKICAgICAgICAgICAgICAgIHFxKGRvY3VtZW50KS5hdHRhY2goJ2RyYWdvdmVyJywgZnVuY3Rpb24oZSl7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBxcShkb2N1bWVudCkuYXR0YWNoKCdkcmFnb3ZlcicsIGZ1bmN0aW9uKGUpewogICAgICAgICAgICAgICAgICAgIGlmIChlLmRhdGFUcmFuc2Zlcil7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnbm9uZSc7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcXEuVXBsb2FkRHJvcFpvbmUuZHJvcE91dHNpZGVEaXNhYmxlZCA9IHRydWU7CiAgICAgICAgfQogICAgfSwKICAgIF9hdHRhY2hFdmVudHM6IGZ1bmN0aW9uKCl7CiAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICBzZWxmLl9hdHRhY2goc2VsZi5fZWxlbWVudCwgJ2RyYWdvdmVyJywgZnVuY3Rpb24oZSl7CiAgICAgICAgICAgIGlmICghc2VsZi5faXNWYWxpZEZpbGVEcmFnKGUpKSByZXR1cm47CgogICAgICAgICAgICB2YXIgZWZmZWN0ID0gcXEuaWUoKSA/IG51bGwgOiBlLmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkOwogICAgICAgICAgICBpZiAoZWZmZWN0ID09ICdtb3ZlJyB8fCBlZmZlY3QgPT0gJ2xpbmtNb3ZlJyl7CiAgICAgICAgICAgICAgICBlLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gJ21vdmUnOyAvLyBmb3IgRkYgKG9ubHkgbW92ZSBhbGxvd2VkKQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZS5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdjb3B5JzsgLy8gZm9yIENocm9tZQogICAgICAgICAgICB9CgogICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgfSk7CgogICAgICAgIHNlbGYuX2F0dGFjaChzZWxmLl9lbGVtZW50LCAnZHJhZ2VudGVyJywgZnVuY3Rpb24oZSl7CiAgICAgICAgICAgIGlmICghc2VsZi5faXNWYWxpZEZpbGVEcmFnKGUpKSByZXR1cm47CgogICAgICAgICAgICBzZWxmLl9vcHRpb25zLm9uRW50ZXIoZSk7CiAgICAgICAgfSk7CgogICAgICAgIHNlbGYuX2F0dGFjaChzZWxmLl9lbGVtZW50LCAnZHJhZ2xlYXZlJywgZnVuY3Rpb24oZSl7CiAgICAgICAgICAgIGlmICghc2VsZi5faXNWYWxpZEZpbGVEcmFnKGUpKSByZXR1cm47CgogICAgICAgICAgICBzZWxmLl9vcHRpb25zLm9uTGVhdmUoZSk7CgogICAgICAgICAgICB2YXIgcmVsYXRlZFRhcmdldCA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoZS5jbGllbnRYLCBlLmNsaWVudFkpOwogICAgICAgICAgICAvLyBkbyBub3QgZmlyZSB3aGVuIG1vdmluZyBhIG1vdXNlIG92ZXIgYSBkZXNjZW5kYW50CiAgICAgICAgICAgIGlmIChxcSh0aGlzKS5jb250YWlucyhyZWxhdGVkVGFyZ2V0KSkgcmV0dXJuOwoKICAgICAgICAgICAgc2VsZi5fb3B0aW9ucy5vbkxlYXZlTm90RGVzY2VuZGFudHMoZSk7CiAgICAgICAgfSk7CgogICAgICAgIHNlbGYuX2F0dGFjaChzZWxmLl9lbGVtZW50LCAnZHJvcCcsIGZ1bmN0aW9uKGUpewogICAgICAgICAgICBpZiAoIXNlbGYuX2lzVmFsaWRGaWxlRHJhZyhlKSkgcmV0dXJuOwoKICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICBzZWxmLl9vcHRpb25zLm9uRHJvcChlKTsKICAgICAgICB9KTsKICAgIH0sCiAgICBfaXNWYWxpZEZpbGVEcmFnOiBmdW5jdGlvbihlKXsKICAgICAgICAvLyBlLmRhdGFUcmFuc2ZlciBjdXJyZW50bHkgY2F1c2luZyBJRSBlcnJvcnMKICAgICAgICAvLyBJRTkgZG9lcyBOT1Qgc3VwcG9ydCBmaWxlIEFQSSwgc28gZHJhZy1hbmQtZHJvcCBpcyBub3QgcG9zc2libGUKICAgICAgICBpZiAocXEuaWUoKSAmJiAhcXEuaWUxMCgpKSByZXR1cm4gZmFsc2U7CgogICAgICAgIHZhciBkdCA9IGUuZGF0YVRyYW5zZmVyLAogICAgICAgIC8vIGRvIG5vdCBjaGVjayBkdC50eXBlcy5jb250YWlucyBpbiB3ZWJraXQsIGJlY2F1c2UgaXQgY3Jhc2hlcyBzYWZhcmkgNAogICAgICAgICAgICBpc1NhZmFyaSA9IHFxLnNhZmFyaSgpOwoKICAgICAgICAvLyBkdC5lZmZlY3RBbGxvd2VkIGlzIG5vbmUgaW4gU2FmYXJpIDUKICAgICAgICAvLyBkdC50eXBlcy5jb250YWlucyBjaGVjayBpcyBmb3IgZmlyZWZveAogICAgICAgIHZhciBlZmZlY3RUZXN0ID0gcXEuaWUxMCgpID8gdHJ1ZSA6IGR0LmVmZmVjdEFsbG93ZWQgIT0gJ25vbmUnOwogICAgICAgIHJldHVybiBkdCAmJiBlZmZlY3RUZXN0ICYmIChkdC5maWxlcyB8fCAoIWlzU2FmYXJpICYmIGR0LnR5cGVzLmNvbnRhaW5zICYmIGR0LnR5cGVzLmNvbnRhaW5zKCdGaWxlcycpKSk7CiAgICB9Cn07Ci8qKgogKiBDbGFzcyBmb3IgdXBsb2FkaW5nIGZpbGVzLCB1cGxvYWRpbmcgaXRzZWxmIGlzIGhhbmRsZWQgYnkgY2hpbGQgY2xhc3NlcwogKi8KcXEuVXBsb2FkSGFuZGxlckFic3RyYWN0ID0gZnVuY3Rpb24obyl7CiAgICAvLyBEZWZhdWx0IG9wdGlvbnMsIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSB1c2VyCiAgICB0aGlzLl9vcHRpb25zID0gewogICAgICAgIGRlYnVnOiBmYWxzZSwKICAgICAgICBlbmRwb2ludDogJy91cGxvYWQucGhwJywKICAgICAgICAvLyBtYXhpbXVtIG51bWJlciBvZiBjb25jdXJyZW50IHVwbG9hZHMKICAgICAgICBtYXhDb25uZWN0aW9uczogOTk5LAogICAgICAgIGxvZzogZnVuY3Rpb24oc3RyLCBsZXZlbCkge30sCiAgICAgICAgb25Qcm9ncmVzczogZnVuY3Rpb24oaWQsIGZpbGVOYW1lLCBsb2FkZWQsIHRvdGFsKXt9LAogICAgICAgIG9uQ29tcGxldGU6IGZ1bmN0aW9uKGlkLCBmaWxlTmFtZSwgcmVzcG9uc2UsIHhocil7fSwKICAgICAgICBvbkNhbmNlbDogZnVuY3Rpb24oaWQsIGZpbGVOYW1lKXt9LAogICAgICAgIG9uVXBsb2FkOiBmdW5jdGlvbihpZCwgZmlsZU5hbWUsIHhocil7fSwKICAgICAgICBvbkF1dG9SZXRyeTogZnVuY3Rpb24oaWQsIGZpbGVOYW1lLCByZXNwb25zZSwgeGhyKXt9CgogICAgfTsKICAgIHFxLmV4dGVuZCh0aGlzLl9vcHRpb25zLCBvKTsKCiAgICB0aGlzLl9xdWV1ZSA9IFtdOwogICAgLy8gcGFyYW1zIGZvciBmaWxlcyBpbiBxdWV1ZQogICAgdGhpcy5fcGFyYW1zID0gW107CgogICAgdGhpcy5sb2cgPSB0aGlzLl9vcHRpb25zLmxvZzsKfTsKcXEuVXBsb2FkSGFuZGxlckFic3RyYWN0LnByb3RvdHlwZSA9IHsKICAgIC8qKgogICAgICogQWRkcyBmaWxlIG9yIGZpbGUgaW5wdXQgdG8gdGhlIHF1ZXVlCiAgICAgKiBAcmV0dXJucyBpZAogICAgICoqLwogICAgYWRkOiBmdW5jdGlvbihmaWxlKXt9LAogICAgLyoqCiAgICAgKiBTZW5kcyB0aGUgZmlsZSBpZGVudGlmaWVkIGJ5IGlkIGFuZCBhZGRpdGlvbmFsIHF1ZXJ5IHBhcmFtcyB0byB0aGUgc2VydmVyCiAgICAgKi8KICAgIHVwbG9hZDogZnVuY3Rpb24oaWQsIHBhcmFtcyl7CiAgICAgICAgdmFyIGxlbiA9IHRoaXMuX3F1ZXVlLnB1c2goaWQpOwoKICAgICAgICB2YXIgY29weSA9IHt9OwogICAgICAgIHFxLmV4dGVuZChjb3B5LCBwYXJhbXMpOwogICAgICAgIHRoaXMuX3BhcmFtc1tpZF0gPSBjb3B5OwoKICAgICAgICAvLyBpZiB0b28gbWFueSBhY3RpdmUgdXBsb2Fkcywgd2FpdC4uLgogICAgICAgIGlmIChsZW4gPD0gdGhpcy5fb3B0aW9ucy5tYXhDb25uZWN0aW9ucyl7CiAgICAgICAgICAgIHRoaXMuX3VwbG9hZChpZCwgdGhpcy5fcGFyYW1zW2lkXSk7CiAgICAgICAgfQogICAgfSwKICAgIHJldHJ5OiBmdW5jdGlvbihpZCkgewogICAgICAgIHZhciBpID0gcXEuaW5kZXhPZih0aGlzLl9xdWV1ZSwgaWQpOwogICAgICAgIGlmIChpID49IDApIHsKICAgICAgICAgICAgdGhpcy5fdXBsb2FkKGlkLCB0aGlzLl9wYXJhbXNbaWRdKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRoaXMudXBsb2FkKGlkLCB0aGlzLl9wYXJhbXNbaWRdKTsKICAgICAgICB9CiAgICB9LAogICAgLyoqCiAgICAgKiBDYW5jZWxzIGZpbGUgdXBsb2FkIGJ5IGlkCiAgICAgKi8KICAgIGNhbmNlbDogZnVuY3Rpb24oaWQpewogICAgICAgIHRoaXMubG9nKCdDYW5jZWxsaW5nICcgKyBpZCk7CiAgICAgICAgdGhpcy5fY2FuY2VsKGlkKTsKICAgICAgICB0aGlzLl9kZXF1ZXVlKGlkKTsKICAgIH0sCiAgICAvKioKICAgICAqIENhbmNlbGxzIGFsbCB1cGxvYWRzCiAgICAgKi8KICAgIGNhbmNlbEFsbDogZnVuY3Rpb24oKXsKICAgICAgICBmb3IgKHZhciBpPTA7IGk8dGhpcy5fcXVldWUubGVuZ3RoOyBpKyspewogICAgICAgICAgICB0aGlzLl9jYW5jZWwodGhpcy5fcXVldWVbaV0pOwogICAgICAgIH0KICAgICAgICB0aGlzLl9xdWV1ZSA9IFtdOwogICAgfSwKICAgIC8qKgogICAgICogUmV0dXJucyBuYW1lIG9mIHRoZSBmaWxlIGlkZW50aWZpZWQgYnkgaWQKICAgICAqLwogICAgZ2V0TmFtZTogZnVuY3Rpb24oaWQpe30sCiAgICAvKioKICAgICAqIFJldHVybnMgc2l6ZSBvZiB0aGUgZmlsZSBpZGVudGlmaWVkIGJ5IGlkCiAgICAgKi8KICAgIGdldFNpemU6IGZ1bmN0aW9uKGlkKXt9LAogICAgLyoqCiAgICAgKiBSZXR1cm5zIGlkIG9mIGZpbGVzIGJlaW5nIHVwbG9hZGVkIG9yCiAgICAgKiB3YWl0aW5nIGZvciB0aGVpciB0dXJuCiAgICAgKi8KICAgIGdldFF1ZXVlOiBmdW5jdGlvbigpewogICAgICAgIHJldHVybiB0aGlzLl9xdWV1ZTsKICAgIH0sCiAgICByZXNldDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5sb2coJ1Jlc2V0dGluZyB1cGxvYWQgaGFuZGxlcicpOwogICAgICAgIHRoaXMuX3F1ZXVlID0gW107CiAgICAgICAgdGhpcy5fcGFyYW1zID0gW107CiAgICB9LAogICAgLyoqCiAgICAgKiBBY3R1YWwgdXBsb2FkIG1ldGhvZAogICAgICovCiAgICBfdXBsb2FkOiBmdW5jdGlvbihpZCl7fSwKICAgIC8qKgogICAgICogQWN0dWFsIGNhbmNlbCBtZXRob2QKICAgICAqLwogICAgX2NhbmNlbDogZnVuY3Rpb24oaWQpe30sCiAgICAvKioKICAgICAqIFJlbW92ZXMgZWxlbWVudCBmcm9tIHF1ZXVlLCBzdGFydHMgdXBsb2FkIG9mIG5leHQKICAgICAqLwogICAgX2RlcXVldWU6IGZ1bmN0aW9uKGlkKXsKICAgICAgICB2YXIgaSA9IHFxLmluZGV4T2YodGhpcy5fcXVldWUsIGlkKTsKICAgICAgICB0aGlzLl9xdWV1ZS5zcGxpY2UoaSwgMSk7CgogICAgICAgIHZhciBtYXggPSB0aGlzLl9vcHRpb25zLm1heENvbm5lY3Rpb25zOwoKICAgICAgICBpZiAodGhpcy5fcXVldWUubGVuZ3RoID49IG1heCAmJiBpIDwgbWF4KXsKICAgICAgICAgICAgdmFyIG5leHRJZCA9IHRoaXMuX3F1ZXVlW21heC0xXTsKICAgICAgICAgICAgdGhpcy5fdXBsb2FkKG5leHRJZCwgdGhpcy5fcGFyYW1zW25leHRJZF0pOwogICAgICAgIH0KICAgIH0sCiAgICAvKioKICAgICAqIERldGVybWluZSBpZiB0aGUgZmlsZSBleGlzdHMuCiAgICAgKi8KICAgIGlzVmFsaWQ6IGZ1bmN0aW9uKGlkKSB7fQp9OwovKioKICogQ2xhc3MgZm9yIHVwbG9hZGluZyBmaWxlcyB1c2luZyBmb3JtIGFuZCBpZnJhbWUKICogQGluaGVyaXRzIHFxLlVwbG9hZEhhbmRsZXJBYnN0cmFjdAogKi8KcXEuVXBsb2FkSGFuZGxlckZvcm0gPSBmdW5jdGlvbihvKXsKICAgIHFxLlVwbG9hZEhhbmRsZXJBYnN0cmFjdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwoKICAgIHRoaXMuX2lucHV0cyA9IHt9OwogICAgdGhpcy5fZGV0YWNoX2xvYWRfZXZlbnRzID0ge307Cn07Ci8vIEBpbmhlcml0cyBxcS5VcGxvYWRIYW5kbGVyQWJzdHJhY3QKcXEuZXh0ZW5kKHFxLlVwbG9hZEhhbmRsZXJGb3JtLnByb3RvdHlwZSwgcXEuVXBsb2FkSGFuZGxlckFic3RyYWN0LnByb3RvdHlwZSk7CgpxcS5leHRlbmQocXEuVXBsb2FkSGFuZGxlckZvcm0ucHJvdG90eXBlLCB7CiAgICBhZGQ6IGZ1bmN0aW9uKGZpbGVJbnB1dCl7CiAgICAgICAgZmlsZUlucHV0LnNldEF0dHJpYnV0ZSgnbmFtZScsIHRoaXMuX29wdGlvbnMuaW5wdXROYW1lKTsKICAgICAgICB2YXIgaWQgPSAncXEtdXBsb2FkLWhhbmRsZXItaWZyYW1lJyArIHFxLmdldFVuaXF1ZUlkKCk7CgogICAgICAgIHRoaXMuX2lucHV0c1tpZF0gPSBmaWxlSW5wdXQ7CgogICAgICAgIC8vIHJlbW92ZSBmaWxlIGlucHV0IGZyb20gRE9NCiAgICAgICAgaWYgKGZpbGVJbnB1dC5wYXJlbnROb2RlKXsKICAgICAgICAgICAgcXEoZmlsZUlucHV0KS5yZW1vdmUoKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBpZDsKICAgIH0sCiAgICBnZXROYW1lOiBmdW5jdGlvbihpZCl7CiAgICAgICAgLy8gZ2V0IGlucHV0IHZhbHVlIGFuZCByZW1vdmUgcGF0aCB0byBub3JtYWxpemUKICAgICAgICByZXR1cm4gdGhpcy5faW5wdXRzW2lkXS52YWx1ZS5yZXBsYWNlKC8uKihcL3xcXCkvLCAiIik7CiAgICB9LAogICAgaXNWYWxpZDogZnVuY3Rpb24oaWQpIHsKICAgICAgICByZXR1cm4gdGhpcy5faW5wdXRzW2lkXSAhPT0gdW5kZWZpbmVkOwogICAgfSwKICAgIHJlc2V0OiBmdW5jdGlvbigpIHsKICAgICAgICBxcS5VcGxvYWRIYW5kbGVyQWJzdHJhY3QucHJvdG90eXBlLnJlc2V0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgdGhpcy5faW5wdXRzID0ge307CiAgICAgICAgdGhpcy5fZGV0YWNoX2xvYWRfZXZlbnRzID0ge307CiAgICB9LAogICAgX2NhbmNlbDogZnVuY3Rpb24oaWQpewogICAgICAgIHRoaXMuX29wdGlvbnMub25DYW5jZWwoaWQsIHRoaXMuZ2V0TmFtZShpZCkpOwoKICAgICAgICBkZWxldGUgdGhpcy5faW5wdXRzW2lkXTsKICAgICAgICBkZWxldGUgdGhpcy5fZGV0YWNoX2xvYWRfZXZlbnRzW2lkXTsKCiAgICAgICAgdmFyIGlmcmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsKICAgICAgICBpZiAoaWZyYW1lKXsKICAgICAgICAgICAgLy8gdG8gY2FuY2VsIHJlcXVlc3Qgc2V0IHNyYyB0byBzb21ldGhpbmcgZWxzZQogICAgICAgICAgICAvLyB3ZSB1c2Ugc3JjPSJqYXZhc2NyaXB0OmZhbHNlOyIgYmVjYXVzZSBpdCBkb2Vzbid0CiAgICAgICAgICAgIC8vIHRyaWdnZXIgaWU2IHByb21wdCBvbiBodHRwcwogICAgICAgICAgICBpZnJhbWUuc2V0QXR0cmlidXRlKCdzcmMnLCAnamF2YXNjcmlwdDpmYWxzZTsnKTsKCiAgICAgICAgICAgIHFxKGlmcmFtZSkucmVtb3ZlKCk7CiAgICAgICAgfQogICAgfSwKICAgIF91cGxvYWQ6IGZ1bmN0aW9uKGlkLCBwYXJhbXMpewogICAgICAgIHRoaXMuX29wdGlvbnMub25VcGxvYWQoaWQsIHRoaXMuZ2V0TmFtZShpZCksIGZhbHNlKTsKICAgICAgICB2YXIgaW5wdXQgPSB0aGlzLl9pbnB1dHNbaWRdOwoKICAgICAgICBpZiAoIWlucHV0KXsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdmaWxlIHdpdGggcGFzc2VkIGlkIHdhcyBub3QgYWRkZWQsIG9yIGFscmVhZHkgdXBsb2FkZWQgb3IgY2FuY2VsbGVkJyk7CiAgICAgICAgfQoKICAgICAgICB2YXIgZmlsZU5hbWUgPSB0aGlzLmdldE5hbWUoaWQpOwogICAgICAgIHBhcmFtc1t0aGlzLl9vcHRpb25zLmlucHV0TmFtZV0gPSBmaWxlTmFtZTsKCiAgICAgICAgdmFyIGlmcmFtZSA9IHRoaXMuX2NyZWF0ZUlmcmFtZShpZCk7CiAgICAgICAgdmFyIGZvcm0gPSB0aGlzLl9jcmVhdGVGb3JtKGlmcmFtZSwgcGFyYW1zKTsKICAgICAgICBmb3JtLmFwcGVuZENoaWxkKGlucHV0KTsKCiAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICAgIHRoaXMuX2F0dGFjaExvYWRFdmVudChpZnJhbWUsIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIHNlbGYubG9nKCdpZnJhbWUgbG9hZGVkJyk7CgogICAgICAgICAgICB2YXIgcmVzcG9uc2UgPSBzZWxmLl9nZXRJZnJhbWVDb250ZW50SlNPTihpZnJhbWUpOwoKICAgICAgICAgICAgLy8gdGltZW91dCBhZGRlZCB0byBmaXggYnVzeSBzdGF0ZSBpbiBGRjMuNgogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICBzZWxmLl9kZXRhY2hfbG9hZF9ldmVudHNbaWRdKCk7CiAgICAgICAgICAgICAgICBkZWxldGUgc2VsZi5fZGV0YWNoX2xvYWRfZXZlbnRzW2lkXTsKICAgICAgICAgICAgICAgIHFxKGlmcmFtZSkucmVtb3ZlKCk7CiAgICAgICAgICAgIH0sIDEpOwoKICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5zdWNjZXNzKSB7CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5fb3B0aW9ucy5vbkF1dG9SZXRyeShpZCwgZmlsZU5hbWUsIHJlc3BvbnNlKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBzZWxmLl9vcHRpb25zLm9uQ29tcGxldGUoaWQsIGZpbGVOYW1lLCByZXNwb25zZSk7CiAgICAgICAgICAgIHNlbGYuX2RlcXVldWUoaWQpOwogICAgICAgIH0pOwoKICAgICAgICB0aGlzLmxvZygnU2VuZGluZyB1cGxvYWQgcmVxdWVzdCBmb3IgJyArIGlkKTsKICAgICAgICBmb3JtLnN1Ym1pdCgpOwogICAgICAgIHFxKGZvcm0pLnJlbW92ZSgpOwoKICAgICAgICByZXR1cm4gaWQ7CiAgICB9LAogICAgX2F0dGFjaExvYWRFdmVudDogZnVuY3Rpb24oaWZyYW1lLCBjYWxsYmFjayl7CiAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICAgIHRoaXMuX2RldGFjaF9sb2FkX2V2ZW50c1tpZnJhbWUuaWRdID0gcXEoaWZyYW1lKS5hdHRhY2goJ2xvYWQnLCBmdW5jdGlvbigpewogICAgICAgICAgICBzZWxmLmxvZygnUmVjZWl2ZWQgcmVzcG9uc2UgZm9yICcgKyBpZnJhbWUuaWQpOwoKICAgICAgICAgICAgLy8gd2hlbiB3ZSByZW1vdmUgaWZyYW1lIGZyb20gZG9tCiAgICAgICAgICAgIC8vIHRoZSByZXF1ZXN0IHN0b3BzLCBidXQgaW4gSUUgbG9hZAogICAgICAgICAgICAvLyBldmVudCBmaXJlcwogICAgICAgICAgICBpZiAoIWlmcmFtZS5wYXJlbnROb2RlKXsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIC8vIGZpeGluZyBPcGVyYSAxMC41MwogICAgICAgICAgICAgICAgaWYgKGlmcmFtZS5jb250ZW50RG9jdW1lbnQgJiYKICAgICAgICAgICAgICAgICAgICBpZnJhbWUuY29udGVudERvY3VtZW50LmJvZHkgJiYKICAgICAgICAgICAgICAgICAgICBpZnJhbWUuY29udGVudERvY3VtZW50LmJvZHkuaW5uZXJIVE1MID09ICJmYWxzZSIpewogICAgICAgICAgICAgICAgICAgIC8vIEluIE9wZXJhIGV2ZW50IGlzIGZpcmVkIHNlY29uZCB0aW1lCiAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiBib2R5LmlubmVySFRNTCBjaGFuZ2VkIGZyb20gZmFsc2UKICAgICAgICAgICAgICAgICAgICAvLyB0byBzZXJ2ZXIgcmVzcG9uc2UgYXBwcm94LiBhZnRlciAxIHNlYwogICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gd2UgdXBsb2FkIGZpbGUgd2l0aCBpZnJhbWUKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgICAgICAvL0lFIG1heSB0aHJvdyBhbiAiYWNjZXNzIGlzIGRlbmllZCIgZXJyb3Igd2hlbiBhdHRlbXB0aW5nIHRvIGFjY2VzcyBjb250ZW50RG9jdW1lbnQgb24gdGhlIGlmcmFtZSBpbiBzb21lIGNhc2VzCiAgICAgICAgICAgICAgICBzZWxmLmxvZygnRXJyb3Igd2hlbiBhdHRlbXB0aW5nIHRvIGFjY2VzcyBpZnJhbWUgZHVyaW5nIGhhbmRsaW5nIG9mIHVwbG9hZCByZXNwb25zZSAoJyArIGVycm9yICsgIikiLCAnZXJyb3InKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9KTsKICAgIH0sCiAgICAvKioKICAgICAqIFJldHVybnMganNvbiBvYmplY3QgcmVjZWl2ZWQgYnkgaWZyYW1lIGZyb20gc2VydmVyLgogICAgICovCiAgICBfZ2V0SWZyYW1lQ29udGVudEpTT046IGZ1bmN0aW9uKGlmcmFtZSl7CiAgICAgICAgLy9JRSBtYXkgdGhyb3cgYW4gImFjY2VzcyBpcyBkZW5pZWQiIGVycm9yIHdoZW4gYXR0ZW1wdGluZyB0byBhY2Nlc3MgY29udGVudERvY3VtZW50IG9uIHRoZSBpZnJhbWUgaW4gc29tZSBjYXNlcwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIC8vIGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50IC0gZm9yIElFPDcKICAgICAgICAgICAgdmFyIGRvYyA9IGlmcmFtZS5jb250ZW50RG9jdW1lbnQgPyBpZnJhbWUuY29udGVudERvY3VtZW50OiBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudCwKICAgICAgICAgICAgICAgIHJlc3BvbnNlOwoKICAgICAgICAgICAgdmFyIGlubmVySFRNTCA9IGRvYy5ib2R5LmlubmVySFRNTDsKICAgICAgICAgICAgdGhpcy5sb2coImNvbnZlcnRpbmcgaWZyYW1lJ3MgaW5uZXJIVE1MIHRvIEpTT04iKTsKICAgICAgICAgICAgdGhpcy5sb2coImlubmVySFRNTCA9ICIgKyBpbm5lckhUTUwpOwogICAgICAgICAgICAvL3BsYWluIHRleHQgcmVzcG9uc2UgbWF5IGJlIHdyYXBwZWQgaW4gPHByZT4gdGFnCiAgICAgICAgICAgIGlmIChpbm5lckhUTUwgJiYgaW5uZXJIVE1MLm1hdGNoKC9ePHByZS9pKSkgewogICAgICAgICAgICAgICAgaW5uZXJIVE1MID0gZG9jLmJvZHkuZmlyc3RDaGlsZC5maXJzdENoaWxkLm5vZGVWYWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXNwb25zZSA9IGV2YWwoIigiICsgaW5uZXJIVE1MICsgIikiKTsKICAgICAgICB9IGNhdGNoKGVycm9yKXsKICAgICAgICAgICAgdGhpcy5sb2coJ0Vycm9yIHdoZW4gYXR0ZW1wdGluZyB0byBwYXJzZSBmb3JtIHVwbG9hZCByZXNwb25zZSAoJyArIGVycm9yICsgIikiLCAnZXJyb3InKTsKICAgICAgICAgICAgcmVzcG9uc2UgPSB7c3VjY2VzczogZmFsc2V9OwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHJlc3BvbnNlOwogICAgfSwKICAgIC8qKgogICAgICogQ3JlYXRlcyBpZnJhbWUgd2l0aCB1bmlxdWUgbmFtZQogICAgICovCiAgICBfY3JlYXRlSWZyYW1lOiBmdW5jdGlvbihpZCl7CiAgICAgICAgLy8gV2UgY2FuJ3QgdXNlIGZvbGxvd2luZyBjb2RlIGFzIHRoZSBuYW1lIGF0dHJpYnV0ZQogICAgICAgIC8vIHdvbid0IGJlIHByb3Blcmx5IHJlZ2lzdGVyZWQgaW4gSUU2LCBhbmQgbmV3IHdpbmRvdwogICAgICAgIC8vIG9uIGZvcm0gc3VibWl0IHdpbGwgb3BlbgogICAgICAgIC8vIHZhciBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTsKICAgICAgICAvLyBpZnJhbWUuc2V0QXR0cmlidXRlKCduYW1lJywgaWQpOwoKICAgICAgICB2YXIgaWZyYW1lID0gcXEudG9FbGVtZW50KCc8aWZyYW1lIHNyYz0iamF2YXNjcmlwdDpmYWxzZTsiIG5hbWU9IicgKyBpZCArICciIC8+Jyk7CiAgICAgICAgLy8gc3JjPSJqYXZhc2NyaXB0OmZhbHNlOyIgcmVtb3ZlcyBpZTYgcHJvbXB0IG9uIGh0dHBzCgogICAgICAgIGlmcmFtZS5zZXRBdHRyaWJ1dGUoJ2lkJywgaWQpOwoKICAgICAgICBpZnJhbWUuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGlmcmFtZSk7CgogICAgICAgIHJldHVybiBpZnJhbWU7CiAgICB9LAogICAgLyoqCiAgICAgKiBDcmVhdGVzIGZvcm0sIHRoYXQgd2lsbCBiZSBzdWJtaXR0ZWQgdG8gaWZyYW1lCiAgICAgKi8KICAgIF9jcmVhdGVGb3JtOiBmdW5jdGlvbihpZnJhbWUsIHBhcmFtcyl7CiAgICAgICAgLy8gV2UgY2FuJ3QgdXNlIHRoZSBmb2xsb3dpbmcgY29kZSBpbiBJRTYKICAgICAgICAvLyB2YXIgZm9ybSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Zvcm0nKTsKICAgICAgICAvLyBmb3JtLnNldEF0dHJpYnV0ZSgnbWV0aG9kJywgJ3Bvc3QnKTsKICAgICAgICAvLyBmb3JtLnNldEF0dHJpYnV0ZSgnZW5jdHlwZScsICdtdWx0aXBhcnQvZm9ybS1kYXRhJyk7CiAgICAgICAgLy8gQmVjYXVzZSBpbiB0aGlzIGNhc2UgZmlsZSB3b24ndCBiZSBhdHRhY2hlZCB0byByZXF1ZXN0CiAgICAgICAgdmFyIHByb3RvY29sID0gdGhpcy5fb3B0aW9ucy5kZW1vTW9kZSA/ICJHRVQiIDogIlBPU1QiCiAgICAgICAgdmFyIGZvcm0gPSBxcS50b0VsZW1lbnQoJzxmb3JtIG1ldGhvZD0iJyArIHByb3RvY29sICsgJyIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+PC9mb3JtPicpOwoKICAgICAgICB2YXIgcXVlcnlTdHJpbmcgPSBxcS5vYmoydXJsKHBhcmFtcywgdGhpcy5fb3B0aW9ucy5lbmRwb2ludCk7CgogICAgICAgIGZvcm0uc2V0QXR0cmlidXRlKCdhY3Rpb24nLCBxdWVyeVN0cmluZyk7CiAgICAgICAgZm9ybS5zZXRBdHRyaWJ1dGUoJ3RhcmdldCcsIGlmcmFtZS5uYW1lKTsKICAgICAgICBmb3JtLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmb3JtKTsKCiAgICAgICAgcmV0dXJuIGZvcm07CiAgICB9Cn0pOwovKioKICogQ2xhc3MgZm9yIHVwbG9hZGluZyBmaWxlcyB1c2luZyB4aHIKICogQGluaGVyaXRzIHFxLlVwbG9hZEhhbmRsZXJBYnN0cmFjdAogKi8KcXEuVXBsb2FkSGFuZGxlclhociA9IGZ1bmN0aW9uKG8pewogICAgcXEuVXBsb2FkSGFuZGxlckFic3RyYWN0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CgogICAgdGhpcy5fZmlsZXMgPSBbXTsKICAgIHRoaXMuX3hocnMgPSBbXTsKCiAgICAvLyBjdXJyZW50IGxvYWRlZCBzaXplIGluIGJ5dGVzIGZvciBlYWNoIGZpbGUKICAgIHRoaXMuX2xvYWRlZCA9IFtdOwp9OwoKLy8gc3RhdGljIG1ldGhvZApxcS5VcGxvYWRIYW5kbGVyWGhyLmlzU3VwcG9ydGVkID0gZnVuY3Rpb24oKXsKICAgIHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7CiAgICBpbnB1dC50eXBlID0gJ2ZpbGUnOwoKICAgIHJldHVybiAoCiAgICAgICAgJ211bHRpcGxlJyBpbiBpbnB1dCAmJgogICAgICAgICAgICB0eXBlb2YgRmlsZSAhPSAidW5kZWZpbmVkIiAmJgogICAgICAgICAgICB0eXBlb2YgRm9ybURhdGEgIT0gInVuZGVmaW5lZCIgJiYKICAgICAgICAgICAgdHlwZW9mIChuZXcgWE1MSHR0cFJlcXVlc3QoKSkudXBsb2FkICE9ICJ1bmRlZmluZWQiICk7Cn07CgovLyBAaW5oZXJpdHMgcXEuVXBsb2FkSGFuZGxlckFic3RyYWN0CnFxLmV4dGVuZChxcS5VcGxvYWRIYW5kbGVyWGhyLnByb3RvdHlwZSwgcXEuVXBsb2FkSGFuZGxlckFic3RyYWN0LnByb3RvdHlwZSkKCnFxLmV4dGVuZChxcS5VcGxvYWRIYW5kbGVyWGhyLnByb3RvdHlwZSwgewogICAgLyoqCiAgICAgKiBBZGRzIGZpbGUgdG8gdGhlIHF1ZXVlCiAgICAgKiBSZXR1cm5zIGlkIHRvIHVzZSB3aXRoIHVwbG9hZCwgY2FuY2VsCiAgICAgKiovCiAgICBhZGQ6IGZ1bmN0aW9uKGZpbGUpewogICAgICAgIGlmICghKGZpbGUgaW5zdGFuY2VvZiBGaWxlKSl7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUGFzc2VkIG9iaiBpbiBub3QgYSBGaWxlIChpbiBxcS5VcGxvYWRIYW5kbGVyWGhyKScpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbGVzLnB1c2goZmlsZSkgLSAxOwogICAgfSwKICAgIGdldE5hbWU6IGZ1bmN0aW9uKGlkKXsKICAgICAgICB2YXIgZmlsZSA9IHRoaXMuX2ZpbGVzW2lkXTsKICAgICAgICAvLyBmaXggbWlzc2luZyBuYW1lIGluIFNhZmFyaSA0CiAgICAgICAgLy9OT1RFOiBmaXhlZCBtaXNzaW5nIG5hbWUgZmlyZWZveCAxMS4wYTIgZmlsZS5maWxlTmFtZSBpcyBhY3R1YWxseSB1bmRlZmluZWQKICAgICAgICByZXR1cm4gKGZpbGUuZmlsZU5hbWUgIT09IG51bGwgJiYgZmlsZS5maWxlTmFtZSAhPT0gdW5kZWZpbmVkKSA/IGZpbGUuZmlsZU5hbWUgOiBmaWxlLm5hbWU7CiAgICB9LAogICAgZ2V0U2l6ZTogZnVuY3Rpb24oaWQpewogICAgICAgIHZhciBmaWxlID0gdGhpcy5fZmlsZXNbaWRdOwogICAgICAgIHJldHVybiBmaWxlLmZpbGVTaXplICE9IG51bGwgPyBmaWxlLmZpbGVTaXplIDogZmlsZS5zaXplOwogICAgfSwKICAgIC8qKgogICAgICogUmV0dXJucyB1cGxvYWRlZCBieXRlcyBmb3IgZmlsZSBpZGVudGlmaWVkIGJ5IGlkCiAgICAgKi8KICAgIGdldExvYWRlZDogZnVuY3Rpb24oaWQpewogICAgICAgIHJldHVybiB0aGlzLl9sb2FkZWRbaWRdIHx8IDA7CiAgICB9LAogICAgaXNWYWxpZDogZnVuY3Rpb24oaWQpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZmlsZXNbaWRdICE9PSB1bmRlZmluZWQ7CiAgICB9LAogICAgcmVzZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHFxLlVwbG9hZEhhbmRsZXJBYnN0cmFjdC5wcm90b3R5cGUucmVzZXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB0aGlzLl9maWxlcyA9IFtdOwogICAgICAgIHRoaXMuX3hocnMgPSBbXTsKICAgICAgICB0aGlzLl9sb2FkZWQgPSBbXTsKICAgIH0sCiAgICAvKioKICAgICAqIFNlbmRzIHRoZSBmaWxlIGlkZW50aWZpZWQgYnkgaWQgYW5kIGFkZGl0aW9uYWwgcXVlcnkgcGFyYW1zIHRvIHRoZSBzZXJ2ZXIKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgbmFtZS12YWx1ZSBzdHJpbmcgcGFpcnMKICAgICAqLwogICAgX3VwbG9hZDogZnVuY3Rpb24oaWQsIHBhcmFtcyl7CiAgICAgICAgdGhpcy5fb3B0aW9ucy5vblVwbG9hZChpZCwgdGhpcy5nZXROYW1lKGlkKSwgdHJ1ZSk7CgogICAgICAgIHZhciBmaWxlID0gdGhpcy5fZmlsZXNbaWRdLAogICAgICAgICAgICBuYW1lID0gdGhpcy5nZXROYW1lKGlkKSwKICAgICAgICAgICAgc2l6ZSA9IHRoaXMuZ2V0U2l6ZShpZCk7CgogICAgICAgIHRoaXMuX2xvYWRlZFtpZF0gPSAwOwoKICAgICAgICB2YXIgeGhyID0gdGhpcy5feGhyc1tpZF0gPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgIHhoci51cGxvYWQub25wcm9ncmVzcyA9IGZ1bmN0aW9uKGUpewogICAgICAgICAgICBpZiAoZS5sZW5ndGhDb21wdXRhYmxlKXsKICAgICAgICAgICAgICAgIHNlbGYuX2xvYWRlZFtpZF0gPSBlLmxvYWRlZDsKICAgICAgICAgICAgICAgIHNlbGYuX29wdGlvbnMub25Qcm9ncmVzcyhpZCwgbmFtZSwgZS5sb2FkZWQsIGUudG90YWwpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PSA0KXsKICAgICAgICAgICAgICAgIHNlbGYuX29uQ29tcGxldGUoaWQsIHhocik7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICAvLyBidWlsZCBxdWVyeSBzdHJpbmcKICAgICAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307CiAgICAgICAgcGFyYW1zW3RoaXMuX29wdGlvbnMuaW5wdXROYW1lXSA9IG5hbWU7CiAgICAgICAgdmFyIHF1ZXJ5U3RyaW5nID0gcXEub2JqMnVybChwYXJhbXMsIHRoaXMuX29wdGlvbnMuZW5kcG9pbnQpOwoKICAgICAgICB2YXIgcHJvdG9jb2wgPSB0aGlzLl9vcHRpb25zLmRlbW9Nb2RlID8gIkdFVCIgOiAiUE9TVCI7CiAgICAgICAgeGhyLm9wZW4ocHJvdG9jb2wsIHF1ZXJ5U3RyaW5nLCB0cnVlKTsKICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcigiWC1SZXF1ZXN0ZWQtV2l0aCIsICJYTUxIdHRwUmVxdWVzdCIpOwogICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCJYLUZpbGUtTmFtZSIsIGVuY29kZVVSSUNvbXBvbmVudChuYW1lKSk7CiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoIkNhY2hlLUNvbnRyb2wiLCAibm8tY2FjaGUiKTsKICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5mb3JjZU11bHRpcGFydCkgewogICAgICAgICAgICB2YXIgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKHRoaXMuX29wdGlvbnMuaW5wdXROYW1lLCBmaWxlKTsKICAgICAgICAgICAgZmlsZSA9IGZvcm1EYXRhOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CiAgICAgICAgICAgIC8vTk9URTogcmV0dXJuIG1pbWUgdHlwZSBpbiB4aHIgd29ya3Mgb24gY2hyb21lIDE2LjAuOSBmaXJlZm94IDExLjBhMgogICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcigiWC1NaW1lLVR5cGUiLGZpbGUudHlwZSApOwogICAgICAgIH0KICAgICAgICBmb3IgKGtleSBpbiB0aGlzLl9vcHRpb25zLmN1c3RvbUhlYWRlcnMpewogICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihrZXksIHRoaXMuX29wdGlvbnMuY3VzdG9tSGVhZGVyc1trZXldKTsKICAgICAgICB9OwoKICAgICAgICB0aGlzLmxvZygnU2VuZGluZyB1cGxvYWQgcmVxdWVzdCBmb3IgJyArIGlkKTsKICAgICAgICB4aHIuc2VuZChmaWxlKTsKICAgIH0sCiAgICBfb25Db21wbGV0ZTogZnVuY3Rpb24oaWQsIHhocil7CiAgICAgICAgInVzZSBzdHJpY3QiOwogICAgICAgIC8vIHRoZSByZXF1ZXN0IHdhcyBhYm9ydGVkL2NhbmNlbGxlZAogICAgICAgIGlmICghdGhpcy5fZmlsZXNbaWRdKSB7IHJldHVybjsgfQoKICAgICAgICB2YXIgbmFtZSA9IHRoaXMuZ2V0TmFtZShpZCk7CiAgICAgICAgdmFyIHNpemUgPSB0aGlzLmdldFNpemUoaWQpOwogICAgICAgIHZhciByZXNwb25zZTsgLy90aGUgcGFyc2VkIEpTT04gcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLCBvciB0aGUgZW1wdHkgb2JqZWN0IGlmIHBhcnNpbmcgZmFpbGVkLgoKICAgICAgICB0aGlzLl9vcHRpb25zLm9uUHJvZ3Jlc3MoaWQsIG5hbWUsIHNpemUsIHNpemUpOwoKICAgICAgICB0aGlzLmxvZygieGhyIC0gc2VydmVyIHJlc3BvbnNlIHJlY2VpdmVkIGZvciAiICsgaWQpOwogICAgICAgIHRoaXMubG9nKCJyZXNwb25zZVRleHQgPSAiICsgeGhyLnJlc3BvbnNlVGV4dCk7CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgSlNPTi5wYXJzZSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBldmFsKCIoIiArIHhoci5yZXNwb25zZVRleHQgKyAiKSIpOwogICAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaChlcnJvcil7CiAgICAgICAgICAgIHRoaXMubG9nKCdFcnJvciB3aGVuIGF0dGVtcHRpbmcgdG8gcGFyc2UgeGhyIHJlc3BvbnNlIHRleHQgKCcgKyBlcnJvciArICcpJywgJ2Vycm9yJyk7CiAgICAgICAgICAgIHJlc3BvbnNlID0ge307CiAgICAgICAgfQoKICAgICAgICBpZiAoeGhyLnN0YXR1cyAhPT0gMjAwIHx8ICFyZXNwb25zZS5zdWNjZXNzKXsKICAgICAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMub25BdXRvUmV0cnkoaWQsIG5hbWUsIHJlc3BvbnNlLCB4aHIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHRoaXMuX29wdGlvbnMub25Db21wbGV0ZShpZCwgbmFtZSwgcmVzcG9uc2UsIHhocik7CgogICAgICAgIHRoaXMuX3hocnNbaWRdID0gbnVsbDsKICAgICAgICB0aGlzLl9kZXF1ZXVlKGlkKTsKICAgIH0sCiAgICBfY2FuY2VsOiBmdW5jdGlvbihpZCl7CiAgICAgICAgdGhpcy5fb3B0aW9ucy5vbkNhbmNlbChpZCwgdGhpcy5nZXROYW1lKGlkKSk7CgogICAgICAgIHRoaXMuX2ZpbGVzW2lkXSA9IG51bGw7CgogICAgICAgIGlmICh0aGlzLl94aHJzW2lkXSl7CiAgICAgICAgICAgIHRoaXMuX3hocnNbaWRdLmFib3J0KCk7CiAgICAgICAgICAgIHRoaXMuX3hocnNbaWRdID0gbnVsbDsKICAgICAgICB9CiAgICB9Cn0pOwooZnVuY3Rpb24oJCkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIHVwbG9hZGVyLCAkZWwsIGluaXQsIGRhdGFTdG9yZSwgcGx1Z2luT3B0aW9uLCBwbHVnaW5PcHRpb25zLCBhZGRDYWxsYmFja3MsIHRyYW5zZm9ybU9wdGlvbnMsIGlzVmFsaWRDb21tYW5kLAogICAgICAgIGRlbGVnYXRlQ29tbWFuZDsKCiAgICBwbHVnaW5PcHRpb25zID0gWyd1cGxvYWRlclR5cGUnXTsKCiAgICBpbml0ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICBpZiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgeGZvcm1lZE9wdHMgPSB0cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnMpOwogICAgICAgICAgICBhZGRDYWxsYmFja3MoeGZvcm1lZE9wdHMpOwoKICAgICAgICAgICAgaWYgKHBsdWdpbk9wdGlvbigndXBsb2FkZXJUeXBlJykgPT09ICdiYXNpYycpIHsKICAgICAgICAgICAgICAgIHVwbG9hZGVyKG5ldyBxcS5GaW5lVXBsb2FkZXJCYXNpYyh4Zm9ybWVkT3B0cykpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdXBsb2FkZXIobmV3IHFxLkZpbmVVcGxvYWRlcih4Zm9ybWVkT3B0cykpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGVsOwogICAgfTsKCiAgICBkYXRhU3RvcmUgPSBmdW5jdGlvbihrZXksIHZhbCkgewogICAgICAgIHZhciBkYXRhID0gJGVsLmRhdGEoJ2ZpbmV1cGxvYWRlcicpOwoKICAgICAgICBpZiAodmFsKSB7CiAgICAgICAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIGRhdGEgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBkYXRhW2tleV0gPSB2YWw7CiAgICAgICAgICAgICRlbC5kYXRhKCdmaW5ldXBsb2FkZXInLCBkYXRhKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBkYXRhW2tleV07CiAgICAgICAgfQogICAgfTsKCiAgICAvL3RoZSB1bmRlcmx5aW5nIEZpbmUgVXBsb2FkZXIgaW5zdGFuY2UgaXMgc3RvcmVkIGluIGpRdWVyeSdzIGRhdGEgc3RvcmVkLCBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnQKICAgIC8vIHRpZWQgdG8gdGhpcyBpbnN0YW5jZSBvZiB0aGUgcGx1Zy1pbgogICAgdXBsb2FkZXIgPSBmdW5jdGlvbihpbnN0YW5jZVRvU3RvcmUpIHsKICAgICAgICByZXR1cm4gZGF0YVN0b3JlKCd1cGxvYWRlcicsIGluc3RhbmNlVG9TdG9yZSk7CiAgICB9OwoKICAgIHBsdWdpbk9wdGlvbiA9IGZ1bmN0aW9uKG9wdGlvbiwgb3B0aW9uVmFsKSB7CiAgICAgICAgcmV0dXJuIGRhdGFTdG9yZShvcHRpb24sIG9wdGlvblZhbCk7CiAgICB9OwoKICAgIC8vaW1wbGVtZW50IGFsbCBjYWxsYmFja3MgZGVmaW5lZCBpbiBGaW5lIFVwbG9hZGVyIGFzIGZ1bmN0aW9ucyB0aGF0IHRyaWdnZXIgYXBwcm9wcmlhdGVseSBuYW1lcyBldmVudHMgYW5kCiAgICAvLyByZXR1cm4gdGhlIHJlc3VsdCBvZiBleGVjdXRpbmcgdGhlIGJvdW5kIGhhbmRsZXIgYmFjayB0byBGaW5lIFVwbG9hZGVyCiAgICBhZGRDYWxsYmFja3MgPSBmdW5jdGlvbih0cmFuc2Zvcm1lZE9wdHMpIHsKICAgICAgICB2YXIgY2FsbGJhY2tzID0gdHJhbnNmb3JtZWRPcHRzLmNhbGxiYWNrcyA9IHt9OwoKICAgICAgICAkLmVhY2gobmV3IHFxLkZpbmVVcGxvYWRlckJhc2ljKCkuX29wdGlvbnMuY2FsbGJhY2tzLCBmdW5jdGlvbihwcm9wLCBmdW5jKSB7CiAgICAgICAgICAgIHZhciBuYW1lLCAkY2FsbGJhY2tFbDsKCiAgICAgICAgICAgIG5hbWUgPSAvXm9uKFx3KykvLmV4ZWMocHJvcClbMV07CiAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCAxKS50b0xvd2VyQ2FzZSgpICsgbmFtZS5zdWJzdHJpbmcoMSk7CiAgICAgICAgICAgICRjYWxsYmFja0VsID0gJGVsOwoKICAgICAgICAgICAgY2FsbGJhY2tzW3Byb3BdID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICByZXR1cm4gJGNhbGxiYWNrRWwudHJpZ2dlckhhbmRsZXIobmFtZSwgYXJncyk7CiAgICAgICAgICAgIH07CiAgICAgICAgfSk7CiAgICB9OwoKICAgIC8vdHJhbnNmb3JtIGpRdWVyeSBvYmplY3RzIGludG8gSFRNTEVsZW1lbnRzLCBhbmQgcGFzcyBhbG9uZyBhbGwgb3RoZXIgb3B0aW9uIHByb3BlcnRpZXMKICAgIHRyYW5zZm9ybU9wdGlvbnMgPSBmdW5jdGlvbihzb3VyY2UsIGRlc3QpIHsKICAgICAgICB2YXIgeGZvcm1lZCwgYXJyYXlWYWxzOwoKICAgICAgICBpZiAoZGVzdCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGlmIChzb3VyY2UudXBsb2FkZXJUeXBlICE9PSAnYmFzaWMnKSB7CiAgICAgICAgICAgICAgICB4Zm9ybWVkID0geyBlbGVtZW50IDogJGVsWzBdIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB4Zm9ybWVkID0ge307CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHhmb3JtZWQgPSBkZXN0OwogICAgICAgIH0KCiAgICAgICAgJC5lYWNoKHNvdXJjZSwgZnVuY3Rpb24ocHJvcCwgdmFsKSB7CiAgICAgICAgICAgIGlmICgkLmluQXJyYXkocHJvcCwgcGx1Z2luT3B0aW9ucykgPj0gMCkgewogICAgICAgICAgICAgICAgcGx1Z2luT3B0aW9uKHByb3AsIHZhbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodmFsIGluc3RhbmNlb2YgJCkgewogICAgICAgICAgICAgICAgeGZvcm1lZFtwcm9wXSA9IHZhbFswXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICgkLmlzUGxhaW5PYmplY3QodmFsKSkgewogICAgICAgICAgICAgICAgeGZvcm1lZFtwcm9wXSA9IHt9OwogICAgICAgICAgICAgICAgdHJhbnNmb3JtT3B0aW9ucyh2YWwsIHhmb3JtZWRbcHJvcF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCQuaXNBcnJheSh2YWwpKSB7CiAgICAgICAgICAgICAgICBhcnJheVZhbHMgPSBbXTsKICAgICAgICAgICAgICAgICQuZWFjaCh2YWwsIGZ1bmN0aW9uKGlkeCwgYXJyYXlWYWwpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoYXJyYXlWYWwgaW5zdGFuY2VvZiAkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQubWVyZ2UoYXJyYXlWYWxzLCBhcnJheVZhbCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBhcnJheVZhbHMucHVzaChhcnJheVZhbCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB4Zm9ybWVkW3Byb3BdID0gYXJyYXlWYWxzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgeGZvcm1lZFtwcm9wXSA9IHZhbDsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICBpZiAoZGVzdCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIHJldHVybiB4Zm9ybWVkOwogICAgICAgIH0KICAgIH07CgogICAgaXNWYWxpZENvbW1hbmQgPSBmdW5jdGlvbihjb21tYW5kKSB7CiAgICAgICAgcmV0dXJuICQudHlwZShjb21tYW5kKSA9PT0gInN0cmluZyIgJiYKICAgICAgICAgICAgIWNvbW1hbmQubWF0Y2goL15fLykgJiYgLy9lbmZvcmNlIHByaXZhdGUgbWV0aG9kcyBjb252ZW50aW9uCiAgICAgICAgICAgIHVwbG9hZGVyKClbY29tbWFuZF0gIT09IHVuZGVmaW5lZDsKICAgIH07CgogICAgLy9hc3N1bWluZyB3ZSBoYXZlIGFscmVhZHkgdmVyaWZpZWQgdGhhdCB0aGlzIGlzIGEgdmFsaWQgY29tbWFuZCwgY2FsbCB0aGUgYXNzb2NpYXRlZCBmdW5jdGlvbiBpbiB0aGUgdW5kZXJseWluZwogICAgLy8gRmluZSBVcGxvYWRlciBpbnN0YW5jZSAocGFzc2luZyBhbG9uZyB0aGUgYXJndW1lbnRzIGZyb20gdGhlIGNhbGxlcikgYW5kIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBjYWxsIGJhY2sgdG8gdGhlIGNhbGxlcgogICAgZGVsZWdhdGVDb21tYW5kID0gZnVuY3Rpb24oY29tbWFuZCkgewogICAgICAgIHJldHVybiB1cGxvYWRlcigpW2NvbW1hbmRdLmFwcGx5KHVwbG9hZGVyKCksIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpOwogICAgfTsKCiAgICAkLmZuLmZpbmVVcGxvYWRlciA9IGZ1bmN0aW9uKG9wdGlvbnNPckNvbW1hbmQpIHsKICAgICAgICAkZWwgPSB0aGlzOwoKICAgICAgICBpZiAodXBsb2FkZXIoKSAmJiBpc1ZhbGlkQ29tbWFuZChvcHRpb25zT3JDb21tYW5kKSkgewogICAgICAgICAgICByZXR1cm4gZGVsZWdhdGVDb21tYW5kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zT3JDb21tYW5kID09PSAnb2JqZWN0JyB8fCAhb3B0aW9uc09yQ29tbWFuZCkgewogICAgICAgICAgICByZXR1cm4gaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJC5lcnJvcignTWV0aG9kICcgKyAgb3B0aW9uc09yQ29tbWFuZCArICcgZG9lcyBub3QgZXhpc3Qgb24galF1ZXJ5LmZpbmVVcGxvYWRlcicpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwoKfShqUXVlcnkpKTsK]]></data>
	</file>
	<file>
	  <filename>/lib/js/fineuploader/jquery.fineuploader-3.0.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dmFyIHFxPXFxfHx7fSxxcT1mdW5jdGlvbihhKXtyZXR1cm57aGlkZTpmdW5jdGlvbigpe2Euc3R5bGUuZGlzcGxheT0ibm9uZSI7cmV0dXJuIHRoaXN9LGF0dGFjaDpmdW5jdGlvbihiLGMpe2EuYWRkRXZlbnRMaXN0ZW5lcj9hLmFkZEV2ZW50TGlzdGVuZXIoYixjLCExKTphLmF0dGFjaEV2ZW50JiZhLmF0dGFjaEV2ZW50KCJvbiIrYixjKTtyZXR1cm4gZnVuY3Rpb24oKXtxcShhKS5kZXRhY2goYixjKX19LGRldGFjaDpmdW5jdGlvbihiLGMpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcj9hLnJlbW92ZUV2ZW50TGlzdGVuZXIoYixjLCExKTphLmF0dGFjaEV2ZW50JiZhLmRldGFjaEV2ZW50KCJvbiIrYixjKTtyZXR1cm4gdGhpc30sY29udGFpbnM6ZnVuY3Rpb24oYil7cmV0dXJuIGE9PWI/ITA6YS5jb250YWlucz9hLmNvbnRhaW5zKGIpOiEhKGIuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYSkmOCl9LGluc2VydEJlZm9yZTpmdW5jdGlvbihiKXtiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsCmIpO3JldHVybiB0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXthLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYSk7cmV0dXJuIHRoaXN9LGNzczpmdW5jdGlvbihiKXtudWxsIT1iLm9wYWNpdHkmJigic3RyaW5nIiE9dHlwZW9mIGEuc3R5bGUub3BhY2l0eSYmInVuZGVmaW5lZCIhPXR5cGVvZiBhLmZpbHRlcnMpJiYoYi5maWx0ZXI9ImFscGhhKG9wYWNpdHk9IitNYXRoLnJvdW5kKDEwMCpiLm9wYWNpdHkpKyIpIik7cXEuZXh0ZW5kKGEuc3R5bGUsYik7cmV0dXJuIHRoaXN9LGhhc0NsYXNzOmZ1bmN0aW9uKGIpe3JldHVybiBSZWdFeHAoIihefCApIitiKyIoIHwkKSIpLnRlc3QoYS5jbGFzc05hbWUpfSxhZGRDbGFzczpmdW5jdGlvbihiKXtxcShhKS5oYXNDbGFzcyhiKXx8KGEuY2xhc3NOYW1lKz0iICIrYik7cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGIpe2EuY2xhc3NOYW1lPWEuY2xhc3NOYW1lLnJlcGxhY2UoUmVnRXhwKCIoXnwgKSIrYisiKCB8JCkiKSwiICIpLnJlcGxhY2UoL15ccyt8XHMrJC9nLAoiIik7cmV0dXJuIHRoaXN9LGdldEJ5Q2xhc3M6ZnVuY3Rpb24oYil7aWYoYS5xdWVyeVNlbGVjdG9yQWxsKXJldHVybiBhLnF1ZXJ5U2VsZWN0b3JBbGwoIi4iK2IpO2Zvcih2YXIgYz1bXSxkPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSxlPWQubGVuZ3RoLGY9MDtmPGU7ZisrKXFxKGRbZl0pLmhhc0NsYXNzKGIpJiZjLnB1c2goZFtmXSk7cmV0dXJuIGN9LGNoaWxkcmVuOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPVtdLGM9YS5maXJzdENoaWxkO2M7KTE9PWMubm9kZVR5cGUmJmIucHVzaChjKSxjPWMubmV4dFNpYmxpbmc7cmV0dXJuIGJ9LHNldFRleHQ6ZnVuY3Rpb24oYil7YS5pbm5lclRleHQ9YjthLnRleHRDb250ZW50PWI7cmV0dXJuIHRoaXN9LGNsZWFyVGV4dDpmdW5jdGlvbigpe3JldHVybiBxcShhKS5zZXRUZXh0KCIiKX19fTsKcXEubG9nPWZ1bmN0aW9uKGEsYil7aWYod2luZG93LmNvbnNvbGUpaWYoIWJ8fCJpbmZvIj09PWIpd2luZG93LmNvbnNvbGUubG9nKGEpO2Vsc2UgaWYod2luZG93LmNvbnNvbGVbYl0pd2luZG93LmNvbnNvbGVbYl0oYSk7ZWxzZSB3aW5kb3cuY29uc29sZS5sb2coIjwiK2IrIj4gIithKX07cXEuaXNPYmplY3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPT1hJiZhJiYib2JqZWN0Ij09PXR5cGVvZiBhJiZhLmNvbnN0cnVjdG9yPT09T2JqZWN0fTtxcS5leHRlbmQ9ZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJihjJiZxcS5pc09iamVjdChiW2RdKT8odm9pZCAwPT09YVtkXSYmKGFbZF09e30pLHFxLmV4dGVuZChhW2RdLGJbZF0sITApKTphW2RdPWJbZF0pfTsKcXEuaW5kZXhPZj1mdW5jdGlvbihhLGIsYyl7aWYoYS5pbmRleE9mKXJldHVybiBhLmluZGV4T2YoYixjKTt2YXIgYz1jfHwwLGQ9YS5sZW5ndGg7Zm9yKDA+YyYmKGMrPWQpO2M8ZDtjKyspaWYoYyBpbiBhJiZhW2NdPT09YilyZXR1cm4gYztyZXR1cm4tMX07cXEuZ2V0VW5pcXVlSWQ9ZnVuY3Rpb24oKXt2YXIgYT0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBhKyt9fSgpO3FxLmllPWZ1bmN0aW9uKCl7cmV0dXJuLTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpfTtxcS5pZTEwPWZ1bmN0aW9uKCl7cmV0dXJuLTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSAxMCIpfTtxcS5zYWZhcmk9ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwIT1uYXZpZ2F0b3IudmVuZG9yJiYtMSE9bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfTtxcS5jaHJvbWU9ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwIT1uYXZpZ2F0b3IudmVuZG9yJiYtMSE9bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJHb29nbGUiKX07CnFxLmZpcmVmb3g9ZnVuY3Rpb24oKXtyZXR1cm4tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNb3ppbGxhIikmJnZvaWQgMCE9bmF2aWdhdG9yLnZlbmRvciYmIiI9PW5hdmlnYXRvci52ZW5kb3J9O3FxLndpbmRvd3M9ZnVuY3Rpb24oKXtyZXR1cm4iV2luMzIiPT1uYXZpZ2F0b3IucGxhdGZvcm19O3FxLnByZXZlbnREZWZhdWx0PWZ1bmN0aW9uKGEpe2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9O3FxLnRvRWxlbWVudD1mdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiBmdW5jdGlvbihiKXthLmlubmVySFRNTD1iO2I9YS5maXJzdENoaWxkO2EucmVtb3ZlQ2hpbGQoYik7cmV0dXJuIGJ9fSgpOwpxcS5vYmoydXJsPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1bXSxlPSImIixmPWZ1bmN0aW9uKGEsYyl7dmFyIGU9Yj8vXFtcXSQvLnRlc3QoYik/YjpiKyJbIitjKyJdIjpjOyJ1bmRlZmluZWQiIT1lJiYidW5kZWZpbmVkIiE9YyYmZC5wdXNoKCJvYmplY3QiPT09dHlwZW9mIGE/cXEub2JqMnVybChhLGUsITApOiJbb2JqZWN0IEZ1bmN0aW9uXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSk/ZW5jb2RlVVJJQ29tcG9uZW50KGUpKyI9IitlbmNvZGVVUklDb21wb25lbnQoYSgpKTplbmNvZGVVUklDb21wb25lbnQoZSkrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhKSl9O2lmKCFjJiZiKWU9L1w/Ly50ZXN0KGIpPy9cPyQvLnRlc3QoYik/IiI6IiYiOiI/IixkLnB1c2goYiksZC5wdXNoKHFxLm9iajJ1cmwoYSkpO2Vsc2UgaWYoIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKSYmInVuZGVmaW5lZCIhPXR5cGVvZiBhKWZvcih2YXIgZz0KMCxjPWEubGVuZ3RoO2c8YzsrK2cpZihhW2ddLGcpO2Vsc2UgaWYoInVuZGVmaW5lZCIhPXR5cGVvZiBhJiZudWxsIT09YSYmIm9iamVjdCI9PT10eXBlb2YgYSlmb3IoZyBpbiBhKWYoYVtnXSxnKTtlbHNlIGQucHVzaChlbmNvZGVVUklDb21wb25lbnQoYikrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhKSk7cmV0dXJuIGI/ZC5qb2luKGUpOmQuam9pbihlKS5yZXBsYWNlKC9eJi8sIiIpLnJlcGxhY2UoLyUyMC9nLCIrIil9O3FxLkRpc3Bvc2VTdXBwb3J0PXtfZGlzcG9zZXJzOltdLGRpc3Bvc2U6ZnVuY3Rpb24oKXtmb3IodmFyIGE7YT10aGlzLl9kaXNwb3NlcnMuc2hpZnQoKTspYSgpfSxhZGREaXNwb3NlcjpmdW5jdGlvbihhKXt0aGlzLl9kaXNwb3NlcnMucHVzaChhKX0sX2F0dGFjaDpmdW5jdGlvbigpe3RoaXMuYWRkRGlzcG9zZXIocXEoYXJndW1lbnRzWzBdKS5hdHRhY2guYXBwbHkodGhpcyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSkpKX19OwpxcS5VcGxvYWRCdXR0b249ZnVuY3Rpb24oYSl7dGhpcy5fb3B0aW9ucz17ZWxlbWVudDpudWxsLG11bHRpcGxlOiExLGFjY2VwdEZpbGVzOm51bGwsbmFtZToiZmlsZSIsb25DaGFuZ2U6ZnVuY3Rpb24oKXt9LGhvdmVyQ2xhc3M6InFxLXVwbG9hZC1idXR0b24taG92ZXIiLGZvY3VzQ2xhc3M6InFxLXVwbG9hZC1idXR0b24tZm9jdXMifTtxcS5leHRlbmQodGhpcy5fb3B0aW9ucyxhKTtxcS5leHRlbmQodGhpcyxxcS5EaXNwb3NlU3VwcG9ydCk7dGhpcy5fZWxlbWVudD10aGlzLl9vcHRpb25zLmVsZW1lbnQ7cXEodGhpcy5fZWxlbWVudCkuY3NzKHtwb3NpdGlvbjoicmVsYXRpdmUiLG92ZXJmbG93OiJoaWRkZW4iLGRpcmVjdGlvbjoibHRyIn0pO3RoaXMuX2lucHV0PXRoaXMuX2NyZWF0ZUlucHV0KCl9OwpxcS5VcGxvYWRCdXR0b24ucHJvdG90eXBlPXtnZXRJbnB1dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9pbnB1dH0scmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLl9pbnB1dC5wYXJlbnROb2RlJiZxcSh0aGlzLl9pbnB1dCkucmVtb3ZlKCk7cXEodGhpcy5fZWxlbWVudCkucmVtb3ZlQ2xhc3ModGhpcy5fb3B0aW9ucy5mb2N1c0NsYXNzKTt0aGlzLl9pbnB1dD10aGlzLl9jcmVhdGVJbnB1dCgpfSxfY3JlYXRlSW5wdXQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO3RoaXMuX29wdGlvbnMubXVsdGlwbGUmJmEuc2V0QXR0cmlidXRlKCJtdWx0aXBsZSIsIm11bHRpcGxlIik7dGhpcy5fb3B0aW9ucy5hY2NlcHRGaWxlcyYmYS5zZXRBdHRyaWJ1dGUoImFjY2VwdCIsdGhpcy5fb3B0aW9ucy5hY2NlcHRGaWxlcyk7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJmaWxlIik7YS5zZXRBdHRyaWJ1dGUoIm5hbWUiLHRoaXMuX29wdGlvbnMubmFtZSk7cXEoYSkuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLApyaWdodDowLHRvcDowLGZvbnRGYW1pbHk6IkFyaWFsIixmb250U2l6ZToiMTE4cHgiLG1hcmdpbjowLHBhZGRpbmc6MCxjdXJzb3I6InBvaW50ZXIiLG9wYWNpdHk6MH0pO3RoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQoYSk7dmFyIGI9dGhpczt0aGlzLl9hdHRhY2goYSwiY2hhbmdlIixmdW5jdGlvbigpe2IuX29wdGlvbnMub25DaGFuZ2UoYSl9KTt0aGlzLl9hdHRhY2goYSwibW91c2VvdmVyIixmdW5jdGlvbigpe3FxKGIuX2VsZW1lbnQpLmFkZENsYXNzKGIuX29wdGlvbnMuaG92ZXJDbGFzcyl9KTt0aGlzLl9hdHRhY2goYSwibW91c2VvdXQiLGZ1bmN0aW9uKCl7cXEoYi5fZWxlbWVudCkucmVtb3ZlQ2xhc3MoYi5fb3B0aW9ucy5ob3ZlckNsYXNzKX0pO3RoaXMuX2F0dGFjaChhLCJmb2N1cyIsZnVuY3Rpb24oKXtxcShiLl9lbGVtZW50KS5hZGRDbGFzcyhiLl9vcHRpb25zLmZvY3VzQ2xhc3MpfSk7dGhpcy5fYXR0YWNoKGEsImJsdXIiLGZ1bmN0aW9uKCl7cXEoYi5fZWxlbWVudCkucmVtb3ZlQ2xhc3MoYi5fb3B0aW9ucy5mb2N1c0NsYXNzKX0pOwp3aW5kb3cuYXR0YWNoRXZlbnQmJmEuc2V0QXR0cmlidXRlKCJ0YWJJbmRleCIsIi0xIik7cmV0dXJuIGF9fTsKcXEuRmluZVVwbG9hZGVyQmFzaWM9ZnVuY3Rpb24oYSl7dGhpcy5fb3B0aW9ucz17ZGVidWc6ITEsYnV0dG9uOm51bGwsbXVsdGlwbGU6ITAsbWF4Q29ubmVjdGlvbnM6MyxkaXNhYmxlQ2FuY2VsRm9yRm9ybVVwbG9hZHM6ITEsYXV0b1VwbG9hZDohMCxyZXF1ZXN0OntlbmRwb2ludDoiL3NlcnZlci91cGxvYWQiLHBhcmFtczp7fSxjdXN0b21IZWFkZXJzOnt9LGZvcmNlTXVsdGlwYXJ0OiExLGlucHV0TmFtZToicXFmaWxlIn0sdmFsaWRhdGlvbjp7YWxsb3dlZEV4dGVuc2lvbnM6W10sc2l6ZUxpbWl0OjAsbWluU2l6ZUxpbWl0OjAsc3RvcE9uRmlyc3RJbnZhbGlkRmlsZTohMH0sY2FsbGJhY2tzOntvblN1Ym1pdDpmdW5jdGlvbigpe30sb25Db21wbGV0ZTpmdW5jdGlvbigpe30sb25DYW5jZWw6ZnVuY3Rpb24oKXt9LG9uVXBsb2FkOmZ1bmN0aW9uKCl7fSxvblByb2dyZXNzOmZ1bmN0aW9uKCl7fSxvbkVycm9yOmZ1bmN0aW9uKCl7fSxvbkF1dG9SZXRyeTpmdW5jdGlvbigpe30sCm9uTWFudWFsUmV0cnk6ZnVuY3Rpb24oKXt9LG9uVmFsaWRhdGU6ZnVuY3Rpb24oKXt9fSxtZXNzYWdlczp7dHlwZUVycm9yOiJ7ZmlsZX0gaGFzIGFuIGludmFsaWQgZXh0ZW5zaW9uLiBWYWxpZCBleHRlbnNpb24ocyk6IHtleHRlbnNpb25zfS4iLHNpemVFcnJvcjoie2ZpbGV9IGlzIHRvbyBsYXJnZSwgbWF4aW11bSBmaWxlIHNpemUgaXMge3NpemVMaW1pdH0uIixtaW5TaXplRXJyb3I6IntmaWxlfSBpcyB0b28gc21hbGwsIG1pbmltdW0gZmlsZSBzaXplIGlzIHttaW5TaXplTGltaXR9LiIsZW1wdHlFcnJvcjoie2ZpbGV9IGlzIGVtcHR5LCBwbGVhc2Ugc2VsZWN0IGZpbGVzIGFnYWluIHdpdGhvdXQgaXQuIixub0ZpbGVzRXJyb3I6Ik5vIGZpbGVzIHRvIHVwbG9hZC4iLG9uTGVhdmU6IlRoZSBmaWxlcyBhcmUgYmVpbmcgdXBsb2FkZWQsIGlmIHlvdSBsZWF2ZSBub3cgdGhlIHVwbG9hZCB3aWxsIGJlIGNhbmNlbGxlZC4ifSxyZXRyeTp7ZW5hYmxlQXV0bzohMSxtYXhBdXRvQXR0ZW1wdHM6MywKYXV0b0F0dGVtcHREZWxheTo1LHByZXZlbnRSZXRyeVJlc3BvbnNlUHJvcGVydHk6InByZXZlbnRSZXRyeSJ9fTtxcS5leHRlbmQodGhpcy5fb3B0aW9ucyxhLCEwKTt0aGlzLl93cmFwQ2FsbGJhY2tzKCk7cXEuZXh0ZW5kKHRoaXMscXEuRGlzcG9zZVN1cHBvcnQpO3RoaXMuX2ZpbGVzSW5Qcm9ncmVzcz0wO3RoaXMuX3N0b3JlZEZpbGVJZHM9W107dGhpcy5fYXV0b1JldHJpZXM9W107dGhpcy5fcmV0cnlUaW1lb3V0cz1bXTt0aGlzLl9wcmV2ZW50UmV0cmllcz1bXTt0aGlzLl9oYW5kbGVyPXRoaXMuX2NyZWF0ZVVwbG9hZEhhbmRsZXIoKTt0aGlzLl9vcHRpb25zLmJ1dHRvbiYmKHRoaXMuX2J1dHRvbj10aGlzLl9jcmVhdGVVcGxvYWRCdXR0b24odGhpcy5fb3B0aW9ucy5idXR0b24pKTt0aGlzLl9wcmV2ZW50TGVhdmVJblByb2dyZXNzKCl9OwpxcS5GaW5lVXBsb2FkZXJCYXNpYy5wcm90b3R5cGU9e2xvZzpmdW5jdGlvbihhLGIpe3RoaXMuX29wdGlvbnMuZGVidWcmJighYnx8ImluZm8iPT09Yik/cXEubG9nKCJbRmluZVVwbG9hZGVyXSAiK2EpOmImJiJpbmZvIiE9PWImJnFxLmxvZygiW0ZpbmVVcGxvYWRlcl0gIithLGIpfSxzZXRQYXJhbXM6ZnVuY3Rpb24oYSl7dGhpcy5fb3B0aW9ucy5yZXF1ZXN0LnBhcmFtcz1hfSxnZXRJblByb2dyZXNzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZpbGVzSW5Qcm9ncmVzc30sdXBsb2FkU3RvcmVkRmlsZXM6ZnVuY3Rpb24oKXtmb3IoO3RoaXMuX3N0b3JlZEZpbGVJZHMubGVuZ3RoOyl0aGlzLl9maWxlc0luUHJvZ3Jlc3MrKyx0aGlzLl9oYW5kbGVyLnVwbG9hZCh0aGlzLl9zdG9yZWRGaWxlSWRzLnNoaWZ0KCksdGhpcy5fb3B0aW9ucy5yZXF1ZXN0LnBhcmFtcyl9LGNsZWFyU3RvcmVkRmlsZXM6ZnVuY3Rpb24oKXt0aGlzLl9zdG9yZWRGaWxlSWRzPVtdfSxyZXRyeTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fb25CZWZvcmVNYW51YWxSZXRyeShhKT8KKHRoaXMuX2hhbmRsZXIucmV0cnkoYSksITApOiExfSxjYW5jZWw6ZnVuY3Rpb24oYSl7dGhpcy5faGFuZGxlci5jYW5jZWwoYSl9LHJlc2V0OmZ1bmN0aW9uKCl7dGhpcy5sb2coIlJlc2V0dGluZyB1cGxvYWRlci4uLiIpO3RoaXMuX2hhbmRsZXIucmVzZXQoKTt0aGlzLl9maWxlc0luUHJvZ3Jlc3M9MDt0aGlzLl9zdG9yZWRGaWxlSWRzPVtdO3RoaXMuX2F1dG9SZXRyaWVzPVtdO3RoaXMuX3JldHJ5VGltZW91dHM9W107dGhpcy5fcHJldmVudFJldHJpZXM9W107dGhpcy5fYnV0dG9uLnJlc2V0KCl9LF9jcmVhdGVVcGxvYWRCdXR0b246ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcyxjPW5ldyBxcS5VcGxvYWRCdXR0b24oe2VsZW1lbnQ6YSxtdWx0aXBsZTp0aGlzLl9vcHRpb25zLm11bHRpcGxlJiZxcS5VcGxvYWRIYW5kbGVyWGhyLmlzU3VwcG9ydGVkKCksYWNjZXB0RmlsZXM6dGhpcy5fb3B0aW9ucy52YWxpZGF0aW9uLmFjY2VwdEZpbGVzLG9uQ2hhbmdlOmZ1bmN0aW9uKGEpe2IuX29uSW5wdXRDaGFuZ2UoYSl9fSk7CnRoaXMuYWRkRGlzcG9zZXIoZnVuY3Rpb24oKXtjLmRpc3Bvc2UoKX0pO3JldHVybiBjfSxfY3JlYXRlVXBsb2FkSGFuZGxlcjpmdW5jdGlvbigpe3ZhciBhPXRoaXMsYjtiPXFxLlVwbG9hZEhhbmRsZXJYaHIuaXNTdXBwb3J0ZWQoKT8iVXBsb2FkSGFuZGxlclhociI6IlVwbG9hZEhhbmRsZXJGb3JtIjtyZXR1cm4gbmV3IHFxW2JdKHtkZWJ1Zzp0aGlzLl9vcHRpb25zLmRlYnVnLGVuZHBvaW50OnRoaXMuX29wdGlvbnMucmVxdWVzdC5lbmRwb2ludCxmb3JjZU11bHRpcGFydDp0aGlzLl9vcHRpb25zLnJlcXVlc3QuZm9yY2VNdWx0aXBhcnQsbWF4Q29ubmVjdGlvbnM6dGhpcy5fb3B0aW9ucy5tYXhDb25uZWN0aW9ucyxjdXN0b21IZWFkZXJzOnRoaXMuX29wdGlvbnMucmVxdWVzdC5jdXN0b21IZWFkZXJzLGlucHV0TmFtZTp0aGlzLl9vcHRpb25zLnJlcXVlc3QuaW5wdXROYW1lLGRlbW9Nb2RlOnRoaXMuX29wdGlvbnMuZGVtb01vZGUsbG9nOnRoaXMubG9nLG9uUHJvZ3Jlc3M6ZnVuY3Rpb24oYiwKZCxlLGYpe2EuX29uUHJvZ3Jlc3MoYixkLGUsZik7YS5fb3B0aW9ucy5jYWxsYmFja3Mub25Qcm9ncmVzcyhiLGQsZSxmKX0sb25Db21wbGV0ZTpmdW5jdGlvbihiLGQsZSxmKXthLl9vbkNvbXBsZXRlKGIsZCxlLGYpO2EuX29wdGlvbnMuY2FsbGJhY2tzLm9uQ29tcGxldGUoYixkLGUpfSxvbkNhbmNlbDpmdW5jdGlvbihiLGQpe2EuX29uQ2FuY2VsKGIsZCk7YS5fb3B0aW9ucy5jYWxsYmFja3Mub25DYW5jZWwoYixkKX0sb25VcGxvYWQ6ZnVuY3Rpb24oYixkLGUpe2EuX29uVXBsb2FkKGIsZCxlKTthLl9vcHRpb25zLmNhbGxiYWNrcy5vblVwbG9hZChiLGQsZSl9LG9uQXV0b1JldHJ5OmZ1bmN0aW9uKGIsZCxlLGYpe2EuX3ByZXZlbnRSZXRyaWVzW2JdPWVbYS5fb3B0aW9ucy5yZXRyeS5wcmV2ZW50UmV0cnlSZXNwb25zZVByb3BlcnR5XTtyZXR1cm4gYS5fc2hvdWxkQXV0b1JldHJ5KGIsZCxlKT8oYS5fbWF5YmVQYXJzZUFuZFNlbmRVcGxvYWRFcnJvcihiLGQsZSxmKSxhLl9vcHRpb25zLmNhbGxiYWNrcy5vbkF1dG9SZXRyeShiLApkLGEuX2F1dG9SZXRyaWVzW2JdKzEpLGEuX29uQmVmb3JlQXV0b1JldHJ5KGIsZCksYS5fcmV0cnlUaW1lb3V0c1tiXT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YS5fb25BdXRvUmV0cnkoYixkLGUpfSwxRTMqYS5fb3B0aW9ucy5yZXRyeS5hdXRvQXR0ZW1wdERlbGF5KSwhMCk6ITF9fSl9LF9wcmV2ZW50TGVhdmVJblByb2dyZXNzOmZ1bmN0aW9uKCl7dmFyIGE9dGhpczt0aGlzLl9hdHRhY2god2luZG93LCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKGIpe2lmKGEuX2ZpbGVzSW5Qcm9ncmVzcylyZXR1cm4gYj1ifHx3aW5kb3cuZXZlbnQsYi5yZXR1cm5WYWx1ZT1hLl9vcHRpb25zLm1lc3NhZ2VzLm9uTGVhdmV9KX0sX29uU3VibWl0OmZ1bmN0aW9uKCl7dGhpcy5fb3B0aW9ucy5hdXRvVXBsb2FkJiZ0aGlzLl9maWxlc0luUHJvZ3Jlc3MrK30sX29uUHJvZ3Jlc3M6ZnVuY3Rpb24oKXt9LF9vbkNvbXBsZXRlOmZ1bmN0aW9uKGEsYixjLGQpe3RoaXMuX2ZpbGVzSW5Qcm9ncmVzcy0tO3RoaXMuX21heWJlUGFyc2VBbmRTZW5kVXBsb2FkRXJyb3IoYSwKYixjLGQpfSxfb25DYW5jZWw6ZnVuY3Rpb24oYSl7Y2xlYXJUaW1lb3V0KHRoaXMuX3JldHJ5VGltZW91dHNbYV0pO2E9cXEuaW5kZXhPZih0aGlzLl9zdG9yZWRGaWxlSWRzLGEpO3RoaXMuX29wdGlvbnMuYXV0b1VwbG9hZHx8MD5hP3RoaXMuX2ZpbGVzSW5Qcm9ncmVzcy0tOnRoaXMuX29wdGlvbnMuYXV0b1VwbG9hZHx8dGhpcy5fc3RvcmVkRmlsZUlkcy5zcGxpY2UoYSwxKX0sX29uVXBsb2FkOmZ1bmN0aW9uKCl7fSxfb25JbnB1dENoYW5nZTpmdW5jdGlvbihhKXt0aGlzLl9oYW5kbGVyIGluc3RhbmNlb2YgcXEuVXBsb2FkSGFuZGxlclhocj90aGlzLl91cGxvYWRGaWxlTGlzdChhLmZpbGVzKTp0aGlzLl92YWxpZGF0ZUZpbGUoYSkmJnRoaXMuX3VwbG9hZEZpbGUoYSk7dGhpcy5fYnV0dG9uLnJlc2V0KCl9LF9vbkJlZm9yZUF1dG9SZXRyeTpmdW5jdGlvbihhLGIpe3RoaXMubG9nKCJXYWl0aW5nICIrdGhpcy5fb3B0aW9ucy5yZXRyeS5hdXRvQXR0ZW1wdERlbGF5KyIgc2Vjb25kcyBiZWZvcmUgcmV0cnlpbmcgIisKYisiLi4uIil9LF9vbkF1dG9SZXRyeTpmdW5jdGlvbihhLGIpe3RoaXMubG9nKCJSZXRyeWluZyAiK2IrIi4uLiIpO3RoaXMuX2F1dG9SZXRyaWVzW2FdKys7dGhpcy5faGFuZGxlci5yZXRyeShhKX0sX3Nob3VsZEF1dG9SZXRyeTpmdW5jdGlvbihhKXtyZXR1cm4hdGhpcy5fcHJldmVudFJldHJpZXNbYV0mJnRoaXMuX29wdGlvbnMucmV0cnkuZW5hYmxlQXV0bz8odm9pZCAwPT09dGhpcy5fYXV0b1JldHJpZXNbYV0mJih0aGlzLl9hdXRvUmV0cmllc1thXT0wKSx0aGlzLl9hdXRvUmV0cmllc1thXTx0aGlzLl9vcHRpb25zLnJldHJ5Lm1heEF1dG9BdHRlbXB0cyk6ITF9LF9vbkJlZm9yZU1hbnVhbFJldHJ5OmZ1bmN0aW9uKGEpe2lmKHRoaXMuX3ByZXZlbnRSZXRyaWVzW2FdKXJldHVybiB0aGlzLmxvZygiUmV0cmllcyBhcmUgZm9yYmlkZGVuIGZvciBpZCAiK2EsIndhcm4iKSwhMTtpZih0aGlzLl9oYW5kbGVyLmlzVmFsaWQoYSkpe3ZhciBiPXRoaXMuX2hhbmRsZXIuZ2V0TmFtZShhKTsKaWYoITE9PT10aGlzLl9vcHRpb25zLmNhbGxiYWNrcy5vbk1hbnVhbFJldHJ5KGEsYikpcmV0dXJuITE7dGhpcy5sb2coIlJldHJ5aW5nIHVwbG9hZCBmb3IgJyIrYisiJyAoaWQ6ICIrYSsiKS4uLiIpO3RoaXMuX2ZpbGVzSW5Qcm9ncmVzcysrO3JldHVybiEwfXRoaXMubG9nKCInIithKyInIGlzIG5vdCBhIHZhbGlkIGZpbGUgSUQiLCJlcnJvciIpO3JldHVybiExfSxfbWF5YmVQYXJzZUFuZFNlbmRVcGxvYWRFcnJvcjpmdW5jdGlvbihhLGIsYyxkKXtpZighYy5zdWNjZXNzKWlmKGQmJjIwMCE9PWQuc3RhdHVzJiYhYy5lcnJvcil0aGlzLl9vcHRpb25zLmNhbGxiYWNrcy5vbkVycm9yKGEsYiwiWEhSIHJldHVybmVkIHJlc3BvbnNlIGNvZGUgIitkLnN0YXR1cyk7ZWxzZSB0aGlzLl9vcHRpb25zLmNhbGxiYWNrcy5vbkVycm9yKGEsYixjLmVycm9yP2MuZXJyb3I6IlVwbG9hZCBmYWlsdXJlIHJlYXNvbiB1bmtub3duIil9LF91cGxvYWRGaWxlTGlzdDpmdW5jdGlvbihhKXt2YXIgYiwKYztiPXRoaXMuX2dldFZhbGlkYXRpb25EZXNjcmlwdG9ycyhhKTsxPGIubGVuZ3RoJiYoYz0hMT09PXRoaXMuX29wdGlvbnMuY2FsbGJhY2tzLm9uVmFsaWRhdGUoYikpO2lmKCFjKWlmKDA8YS5sZW5ndGgpZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylpZih0aGlzLl92YWxpZGF0ZUZpbGUoYVtiXSkpdGhpcy5fdXBsb2FkRmlsZShhW2JdKTtlbHNle2lmKHRoaXMuX29wdGlvbnMudmFsaWRhdGlvbi5zdG9wT25GaXJzdEludmFsaWRGaWxlKWJyZWFrfWVsc2UgdGhpcy5fZXJyb3IoIm5vRmlsZXNFcnJvciIsIiIpfSxfdXBsb2FkRmlsZTpmdW5jdGlvbihhKXt2YXIgYT10aGlzLl9oYW5kbGVyLmFkZChhKSxiPXRoaXMuX2hhbmRsZXIuZ2V0TmFtZShhKTshMSE9PXRoaXMuX29wdGlvbnMuY2FsbGJhY2tzLm9uU3VibWl0KGEsYikmJih0aGlzLl9vblN1Ym1pdChhLGIpLHRoaXMuX29wdGlvbnMuYXV0b1VwbG9hZD90aGlzLl9oYW5kbGVyLnVwbG9hZChhLHRoaXMuX29wdGlvbnMucmVxdWVzdC5wYXJhbXMpOgp0aGlzLl9zdG9yZUZpbGVGb3JMYXRlcihhKSl9LF9zdG9yZUZpbGVGb3JMYXRlcjpmdW5jdGlvbihhKXt0aGlzLl9zdG9yZWRGaWxlSWRzLnB1c2goYSl9LF92YWxpZGF0ZUZpbGU6ZnVuY3Rpb24oYSl7dmFyIGIsYyxhPXRoaXMuX2dldFZhbGlkYXRpb25EZXNjcmlwdG9yKGEpO2I9YS5uYW1lO2M9YS5zaXplO2lmKCExPT09dGhpcy5fb3B0aW9ucy5jYWxsYmFja3Mub25WYWxpZGF0ZShbYV0pKXJldHVybiExO2lmKHRoaXMuX2lzQWxsb3dlZEV4dGVuc2lvbihiKSl7aWYoMD09PWMpcmV0dXJuIHRoaXMuX2Vycm9yKCJlbXB0eUVycm9yIixiKSwhMTtpZihjJiZ0aGlzLl9vcHRpb25zLnZhbGlkYXRpb24uc2l6ZUxpbWl0JiZjPnRoaXMuX29wdGlvbnMudmFsaWRhdGlvbi5zaXplTGltaXQpcmV0dXJuIHRoaXMuX2Vycm9yKCJzaXplRXJyb3IiLGIpLCExO2lmKGMmJmM8dGhpcy5fb3B0aW9ucy52YWxpZGF0aW9uLm1pblNpemVMaW1pdClyZXR1cm4gdGhpcy5fZXJyb3IoIm1pblNpemVFcnJvciIsCmIpLCExfWVsc2UgcmV0dXJuIHRoaXMuX2Vycm9yKCJ0eXBlRXJyb3IiLGIpLCExO3JldHVybiEwfSxfZXJyb3I6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLl9vcHRpb25zLm1lc3NhZ2VzW2FdLGQ9dGhpcy5fb3B0aW9ucy52YWxpZGF0aW9uLmFsbG93ZWRFeHRlbnNpb25zLmpvaW4oIiwgIiksZT10aGlzLl9mb3JtYXRGaWxlTmFtZShiKSxjPWMucmVwbGFjZSgie2ZpbGV9IixlKSxjPWMucmVwbGFjZSgie2V4dGVuc2lvbnN9IixkKSxkPXRoaXMuX2Zvcm1hdFNpemUodGhpcy5fb3B0aW9ucy52YWxpZGF0aW9uLnNpemVMaW1pdCksYz1jLnJlcGxhY2UoIntzaXplTGltaXR9IixkKSxkPXRoaXMuX2Zvcm1hdFNpemUodGhpcy5fb3B0aW9ucy52YWxpZGF0aW9uLm1pblNpemVMaW1pdCksYz1jLnJlcGxhY2UoInttaW5TaXplTGltaXR9IixkKTt0aGlzLl9vcHRpb25zLmNhbGxiYWNrcy5vbkVycm9yKG51bGwsYixjKTtyZXR1cm4gY30sX2Zvcm1hdEZpbGVOYW1lOmZ1bmN0aW9uKGEpezMzPAphLmxlbmd0aCYmKGE9YS5zbGljZSgwLDE5KSsiLi4uIithLnNsaWNlKC0xMykpO3JldHVybiBhfSxfaXNBbGxvd2VkRXh0ZW5zaW9uOmZ1bmN0aW9uKGEpe3ZhciBhPS0xIT09YS5pbmRleE9mKCIuIik/YS5yZXBsYWNlKC8uKlsuXS8sIiIpLnRvTG93ZXJDYXNlKCk6IiIsYj10aGlzLl9vcHRpb25zLnZhbGlkYXRpb24uYWxsb3dlZEV4dGVuc2lvbnM7aWYoIWIubGVuZ3RoKXJldHVybiEwO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKWlmKGJbY10udG9Mb3dlckNhc2UoKT09YSlyZXR1cm4hMDtyZXR1cm4hMX0sX2Zvcm1hdFNpemU6ZnVuY3Rpb24oYSl7dmFyIGI9LTE7ZG8gYS89MTAyNCxiKys7d2hpbGUoOTk8YSk7cmV0dXJuIE1hdGgubWF4KGEsMC4xKS50b0ZpeGVkKDEpKyJrQiBNQiBHQiBUQiBQQiBFQiIuc3BsaXQoIiAiKVtiXX0sX3dyYXBDYWxsYmFja3M6ZnVuY3Rpb24oKXt2YXIgYSxiO2E9dGhpcztiPWZ1bmN0aW9uKGIsYyxmKXt0cnl7cmV0dXJuIGMuYXBwbHkoYSwKZil9Y2F0Y2goZyl7YS5sb2coIkNhdWdodCBleGNlcHRpb24gaW4gJyIrYisiJyBjYWxsYmFjayAtICIrZywiZXJyb3IiKX19O2Zvcih2YXIgYyBpbiB0aGlzLl9vcHRpb25zLmNhbGxiYWNrcykoZnVuY3Rpb24oKXt2YXIgZD1hLl9vcHRpb25zLmNhbGxiYWNrc1tjXTthLl9vcHRpb25zLmNhbGxiYWNrc1tjXT1mdW5jdGlvbigpe3JldHVybiBiKGMsZCxhcmd1bWVudHMpfX0pKCl9LF9wYXJzZUZpbGVOYW1lOmZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlP2EudmFsdWUucmVwbGFjZSgvLiooXC98XFwpLywiIik6bnVsbCE9PWEuZmlsZU5hbWUmJnZvaWQgMCE9PWEuZmlsZU5hbWU/YS5maWxlTmFtZTphLm5hbWV9LF9wYXJzZUZpbGVTaXplOmZ1bmN0aW9uKGEpe3ZhciBiO2EudmFsdWV8fChiPW51bGwhPT1hLmZpbGVTaXplJiZ2b2lkIDAhPT1hLmZpbGVTaXplP2EuZmlsZVNpemU6YS5zaXplKTtyZXR1cm4gYn0sX2dldFZhbGlkYXRpb25EZXNjcmlwdG9yOmZ1bmN0aW9uKGEpe3ZhciBiLApjO2M9e307Yj10aGlzLl9wYXJzZUZpbGVOYW1lKGEpO2E9dGhpcy5fcGFyc2VGaWxlU2l6ZShhKTtjLm5hbWU9YjthJiYoYy5zaXplPWEpO3JldHVybiBjfSxfZ2V0VmFsaWRhdGlvbkRlc2NyaXB0b3JzOmZ1bmN0aW9uKGEpe3ZhciBiLGM7Yz1bXTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKTtyZXR1cm4gY319OwpxcS5GaW5lVXBsb2FkZXI9ZnVuY3Rpb24oYSl7cXEuRmluZVVwbG9hZGVyQmFzaWMuYXBwbHkodGhpcyxhcmd1bWVudHMpO3FxLmV4dGVuZCh0aGlzLl9vcHRpb25zLHtlbGVtZW50Om51bGwsbGlzdEVsZW1lbnQ6bnVsbCxkcmFnQW5kRHJvcDp7ZXh0cmFEcm9wem9uZXM6W10saGlkZURyb3B6b25lczohMCxkaXNhYmxlRGVmYXVsdERyb3B6b25lOiExfSx0ZXh0Ont1cGxvYWRCdXR0b246IlVwbG9hZCBhIGZpbGUiLGNhbmNlbEJ1dHRvbjoiQ2FuY2VsIixyZXRyeUJ1dHRvbjoiUmV0cnkiLGZhaWxVcGxvYWQ6IlVwbG9hZCBmYWlsZWQiLGRyYWdab25lOiJEcm9wIGZpbGVzIGhlcmUgdG8gdXBsb2FkIixmb3JtYXRQcm9ncmVzczoie3BlcmNlbnR9JSBvZiB7dG90YWxfc2l6ZX0iLHdhaXRpbmdGb3JSZXNwb25zZToiUHJvY2Vzc2luZy4uLiJ9LHRlbXBsYXRlOic8ZGl2IGNsYXNzPSJxcS11cGxvYWRlciI+JysoIXRoaXMuX29wdGlvbnMuZHJhZ0FuZERyb3B8fCF0aGlzLl9vcHRpb25zLmRyYWdBbmREcm9wLmRpc2FibGVEZWZhdWx0RHJvcHpvbmU/Cic8ZGl2IGNsYXNzPSJxcS11cGxvYWQtZHJvcC1hcmVhIj48c3Bhbj57ZHJhZ1pvbmVUZXh0fTwvc3Bhbj48L2Rpdj4nOiIiKSsoIXRoaXMuX29wdGlvbnMuYnV0dG9uPyc8ZGl2IGNsYXNzPSJxcS11cGxvYWQtYnV0dG9uIj48ZGl2Pnt1cGxvYWRCdXR0b25UZXh0fTwvZGl2PjwvZGl2Pic6IiIpKyghdGhpcy5fb3B0aW9ucy5saXN0RWxlbWVudD8nPHVsIGNsYXNzPSJxcS11cGxvYWQtbGlzdCI+PC91bD4nOiIiKSsiPC9kaXY+IixmaWxlVGVtcGxhdGU6JzxsaT48ZGl2IGNsYXNzPSJxcS1wcm9ncmVzcy1iYXIiPjwvZGl2PjxzcGFuIGNsYXNzPSJxcS11cGxvYWQtc3Bpbm5lciI+PC9zcGFuPjxzcGFuIGNsYXNzPSJxcS11cGxvYWQtZmluaXNoZWQiPjwvc3Bhbj48c3BhbiBjbGFzcz0icXEtdXBsb2FkLWZpbGUiPjwvc3Bhbj48c3BhbiBjbGFzcz0icXEtdXBsb2FkLXNpemUiPjwvc3Bhbj48YSBjbGFzcz0icXEtdXBsb2FkLWNhbmNlbCIgaHJlZj0iIyI+e2NhbmNlbEJ1dHRvblRleHR9PC9hPjxhIGNsYXNzPSJxcS11cGxvYWQtcmV0cnkiIGhyZWY9IiMiPntyZXRyeUJ1dHRvblRleHR9PC9hPjxzcGFuIGNsYXNzPSJxcS11cGxvYWQtc3RhdHVzLXRleHQiPntzdGF0dXNUZXh0fTwvc3Bhbj48L2xpPicsCmNsYXNzZXM6e2J1dHRvbjoicXEtdXBsb2FkLWJ1dHRvbiIsZHJvcDoicXEtdXBsb2FkLWRyb3AtYXJlYSIsZHJvcEFjdGl2ZToicXEtdXBsb2FkLWRyb3AtYXJlYS1hY3RpdmUiLGRyb3BEaXNhYmxlZDoicXEtdXBsb2FkLWRyb3AtYXJlYS1kaXNhYmxlZCIsbGlzdDoicXEtdXBsb2FkLWxpc3QiLHByb2dyZXNzQmFyOiJxcS1wcm9ncmVzcy1iYXIiLGZpbGU6InFxLXVwbG9hZC1maWxlIixzcGlubmVyOiJxcS11cGxvYWQtc3Bpbm5lciIsZmluaXNoZWQ6InFxLXVwbG9hZC1maW5pc2hlZCIscmV0cnlpbmc6InFxLXVwbG9hZC1yZXRyeWluZyIscmV0cnlhYmxlOiJxcS11cGxvYWQtcmV0cnlhYmxlIixzaXplOiJxcS11cGxvYWQtc2l6ZSIsY2FuY2VsOiJxcS11cGxvYWQtY2FuY2VsIixyZXRyeToicXEtdXBsb2FkLXJldHJ5IixzdGF0dXNUZXh0OiJxcS11cGxvYWQtc3RhdHVzLXRleHQiLHN1Y2Nlc3M6InFxLXVwbG9hZC1zdWNjZXNzIixmYWlsOiJxcS11cGxvYWQtZmFpbCIsc3VjY2Vzc0ljb246bnVsbCwKZmFpbEljb246bnVsbH0sZmFpbGVkVXBsb2FkVGV4dERpc3BsYXk6e21vZGU6ImRlZmF1bHQiLG1heENoYXJzOjUwLHJlc3BvbnNlUHJvcGVydHk6ImVycm9yIixlbmFibGVUb29sdGlwOiEwfSxtZXNzYWdlczp7dG9vTWFueUZpbGVzRXJyb3I6IllvdSBtYXkgb25seSBkcm9wIG9uZSBmaWxlIn0scmV0cnk6e3Nob3dBdXRvUmV0cnlOb3RlOiEwLGF1dG9SZXRyeU5vdGU6IlJldHJ5aW5nIHtyZXRyeU51bX0ve21heEF1dG99Li4uIixzaG93QnV0dG9uOiExfSxzaG93TWVzc2FnZTpmdW5jdGlvbihhKXthbGVydChhKX19LCEwKTtxcS5leHRlbmQodGhpcy5fb3B0aW9ucyxhLCEwKTt0aGlzLl93cmFwQ2FsbGJhY2tzKCk7dGhpcy5fb3B0aW9ucy50ZW1wbGF0ZT10aGlzLl9vcHRpb25zLnRlbXBsYXRlLnJlcGxhY2UoL1x7ZHJhZ1pvbmVUZXh0XH0vZyx0aGlzLl9vcHRpb25zLnRleHQuZHJhZ1pvbmUpO3RoaXMuX29wdGlvbnMudGVtcGxhdGU9dGhpcy5fb3B0aW9ucy50ZW1wbGF0ZS5yZXBsYWNlKC9ce3VwbG9hZEJ1dHRvblRleHRcfS9nLAp0aGlzLl9vcHRpb25zLnRleHQudXBsb2FkQnV0dG9uKTt0aGlzLl9vcHRpb25zLmZpbGVUZW1wbGF0ZT10aGlzLl9vcHRpb25zLmZpbGVUZW1wbGF0ZS5yZXBsYWNlKC9ce2NhbmNlbEJ1dHRvblRleHRcfS9nLHRoaXMuX29wdGlvbnMudGV4dC5jYW5jZWxCdXR0b24pO3RoaXMuX29wdGlvbnMuZmlsZVRlbXBsYXRlPXRoaXMuX29wdGlvbnMuZmlsZVRlbXBsYXRlLnJlcGxhY2UoL1x7cmV0cnlCdXR0b25UZXh0XH0vZyx0aGlzLl9vcHRpb25zLnRleHQucmV0cnlCdXR0b24pO3RoaXMuX29wdGlvbnMuZmlsZVRlbXBsYXRlPXRoaXMuX29wdGlvbnMuZmlsZVRlbXBsYXRlLnJlcGxhY2UoL1x7c3RhdHVzVGV4dFx9L2csIiIpO3RoaXMuX2VsZW1lbnQ9dGhpcy5fb3B0aW9ucy5lbGVtZW50O3RoaXMuX2VsZW1lbnQuaW5uZXJIVE1MPXRoaXMuX29wdGlvbnMudGVtcGxhdGU7dGhpcy5fbGlzdEVsZW1lbnQ9dGhpcy5fb3B0aW9ucy5saXN0RWxlbWVudHx8dGhpcy5fZmluZCh0aGlzLl9lbGVtZW50LAoibGlzdCIpO3RoaXMuX2NsYXNzZXM9dGhpcy5fb3B0aW9ucy5jbGFzc2VzO3RoaXMuX2J1dHRvbnx8KHRoaXMuX2J1dHRvbj10aGlzLl9jcmVhdGVVcGxvYWRCdXR0b24odGhpcy5fZmluZCh0aGlzLl9lbGVtZW50LCJidXR0b24iKSkpO3RoaXMuX2JpbmRDYW5jZWxBbmRSZXRyeUV2ZW50cygpO3RoaXMuX3NldHVwRHJhZ0Ryb3AoKX07cXEuZXh0ZW5kKHFxLkZpbmVVcGxvYWRlci5wcm90b3R5cGUscXEuRmluZVVwbG9hZGVyQmFzaWMucHJvdG90eXBlKTsKcXEuZXh0ZW5kKHFxLkZpbmVVcGxvYWRlci5wcm90b3R5cGUse2NsZWFyU3RvcmVkRmlsZXM6ZnVuY3Rpb24oKXtxcS5GaW5lVXBsb2FkZXJCYXNpYy5wcm90b3R5cGUuY2xlYXJTdG9yZWRGaWxlcy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5fbGlzdEVsZW1lbnQuaW5uZXJIVE1MPSIifSxhZGRFeHRyYURyb3B6b25lOmZ1bmN0aW9uKGEpe3RoaXMuX3NldHVwRXh0cmFEcm9wem9uZShhKX0scmVtb3ZlRXh0cmFEcm9wem9uZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLl9vcHRpb25zLmRyYWdBbmREcm9wLmV4dHJhRHJvcHpvbmVzLGM7Zm9yKGMgaW4gYilpZihiW2NdPT09YSlyZXR1cm4gdGhpcy5fb3B0aW9ucy5kcmFnQW5kRHJvcC5leHRyYURyb3B6b25lcy5zcGxpY2UoYywxKX0sZ2V0SXRlbUJ5RmlsZUlkOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLl9saXN0RWxlbWVudC5maXJzdENoaWxkO2I7KXtpZihiLnFxRmlsZUlkPT1hKXJldHVybiBiO2I9Yi5uZXh0U2libGluZ319LApyZXNldDpmdW5jdGlvbigpe3FxLkZpbmVVcGxvYWRlckJhc2ljLnByb3RvdHlwZS5yZXNldC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5fZWxlbWVudC5pbm5lckhUTUw9dGhpcy5fb3B0aW9ucy50ZW1wbGF0ZTt0aGlzLl9saXN0RWxlbWVudD10aGlzLl9vcHRpb25zLmxpc3RFbGVtZW50fHx0aGlzLl9maW5kKHRoaXMuX2VsZW1lbnQsImxpc3QiKTt0aGlzLl9vcHRpb25zLmJ1dHRvbnx8KHRoaXMuX2J1dHRvbj10aGlzLl9jcmVhdGVVcGxvYWRCdXR0b24odGhpcy5fZmluZCh0aGlzLl9lbGVtZW50LCJidXR0b24iKSkpO3RoaXMuX2JpbmRDYW5jZWxBbmRSZXRyeUV2ZW50cygpO3RoaXMuX3NldHVwRHJhZ0Ryb3AoKX0sX2xlYXZpbmdfZG9jdW1lbnRfb3V0OmZ1bmN0aW9uKGEpe3JldHVybihxcS5jaHJvbWUoKXx8cXEuc2FmYXJpKCkmJnFxLndpbmRvd3MoKSkmJjA9PWEuY2xpZW50WCYmMD09YS5jbGllbnRZfHxxcS5maXJlZm94KCkmJiFhLnJlbGF0ZWRUYXJnZXR9LF9zdG9yZUZpbGVGb3JMYXRlcjpmdW5jdGlvbihhKXtxcS5GaW5lVXBsb2FkZXJCYXNpYy5wcm90b3R5cGUuX3N0b3JlRmlsZUZvckxhdGVyLmFwcGx5KHRoaXMsCmFyZ3VtZW50cyk7dmFyIGI9dGhpcy5nZXRJdGVtQnlGaWxlSWQoYSk7cXEodGhpcy5fZmluZChiLCJzcGlubmVyIikpLmhpZGUoKX0sX2ZpbmQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz1xcShhKS5nZXRCeUNsYXNzKHRoaXMuX29wdGlvbnMuY2xhc3Nlc1tiXSlbMF07aWYoIWMpdGhyb3cgRXJyb3IoImVsZW1lbnQgbm90IGZvdW5kICIrYik7cmV0dXJuIGN9LF9zZXR1cEV4dHJhRHJvcHpvbmU6ZnVuY3Rpb24oYSl7dGhpcy5fb3B0aW9ucy5kcmFnQW5kRHJvcC5leHRyYURyb3B6b25lcy5wdXNoKGEpO3RoaXMuX3NldHVwRHJvcHpvbmUoYSl9LF9zZXR1cERyb3B6b25lOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYz1uZXcgcXEuVXBsb2FkRHJvcFpvbmUoe2VsZW1lbnQ6YSxvbkVudGVyOmZ1bmN0aW9uKGMpe3FxKGEpLmFkZENsYXNzKGIuX2NsYXNzZXMuZHJvcEFjdGl2ZSk7Yy5zdG9wUHJvcGFnYXRpb24oKX0sb25MZWF2ZTpmdW5jdGlvbigpe30sb25MZWF2ZU5vdERlc2NlbmRhbnRzOmZ1bmN0aW9uKCl7cXEoYSkucmVtb3ZlQ2xhc3MoYi5fY2xhc3Nlcy5kcm9wQWN0aXZlKX0sCm9uRHJvcDpmdW5jdGlvbihjKXtiLl9vcHRpb25zLmRyYWdBbmREcm9wLmhpZGVEcm9wem9uZXMmJnFxKGEpLmhpZGUoKTtxcShhKS5yZW1vdmVDbGFzcyhiLl9jbGFzc2VzLmRyb3BBY3RpdmUpOzE8Yy5kYXRhVHJhbnNmZXIuZmlsZXMubGVuZ3RoJiYhYi5fb3B0aW9ucy5tdWx0aXBsZT9iLl9lcnJvcigidG9vTWFueUZpbGVzRXJyb3IiLCIiKTpiLl91cGxvYWRGaWxlTGlzdChjLmRhdGFUcmFuc2Zlci5maWxlcyl9fSk7dGhpcy5hZGREaXNwb3NlcihmdW5jdGlvbigpe2MuZGlzcG9zZSgpfSk7dGhpcy5fb3B0aW9ucy5kcmFnQW5kRHJvcC5oaWRlRHJvcHpvbmVzJiZxcShhKS5oaWRlKCl9LF9zZXR1cERyYWdEcm9wOmZ1bmN0aW9uKCl7dmFyIGEsYjthPXRoaXM7dGhpcy5fb3B0aW9ucy5kcmFnQW5kRHJvcC5kaXNhYmxlRGVmYXVsdERyb3B6b25lfHwoYj10aGlzLl9maW5kKHRoaXMuX2VsZW1lbnQsImRyb3AiKSx0aGlzLl9vcHRpb25zLmRyYWdBbmREcm9wLmV4dHJhRHJvcHpvbmVzLnB1c2goYikpOwp2YXIgYz10aGlzLl9vcHRpb25zLmRyYWdBbmREcm9wLmV4dHJhRHJvcHpvbmVzLGQ7Zm9yKGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLl9zZXR1cERyb3B6b25lKGNbZF0pOyF0aGlzLl9vcHRpb25zLmRyYWdBbmREcm9wLmRpc2FibGVEZWZhdWx0RHJvcHpvbmUmJighcXEuaWUoKXx8cXEuaWUxMCgpKSYmdGhpcy5fYXR0YWNoKGRvY3VtZW50LCJkcmFnZW50ZXIiLGZ1bmN0aW9uKCl7aWYoIXFxKGIpLmhhc0NsYXNzKGEuX2NsYXNzZXMuZHJvcERpc2FibGVkKSl7Yi5zdHlsZS5kaXNwbGF5PSJibG9jayI7Zm9yKGQ9MDtkPGMubGVuZ3RoO2QrKyljW2RdLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn19KTt0aGlzLl9hdHRhY2goZG9jdW1lbnQsImRyYWdsZWF2ZSIsZnVuY3Rpb24oYil7aWYoYS5fb3B0aW9ucy5kcmFnQW5kRHJvcC5oaWRlRHJvcHpvbmVzJiZxcS5GaW5lVXBsb2FkZXIucHJvdG90eXBlLl9sZWF2aW5nX2RvY3VtZW50X291dChiKSlmb3IoZD0wO2Q8Yy5sZW5ndGg7ZCsrKXFxKGNbZF0pLmhpZGUoKX0pOwpxcShkb2N1bWVudCkuYXR0YWNoKCJkcm9wIixmdW5jdGlvbihiKXtpZihhLl9vcHRpb25zLmRyYWdBbmREcm9wLmhpZGVEcm9wem9uZXMpZm9yKGQ9MDtkPGMubGVuZ3RoO2QrKylxcShjW2RdKS5oaWRlKCk7Yi5wcmV2ZW50RGVmYXVsdCgpfSl9LF9vblN1Ym1pdDpmdW5jdGlvbihhLGIpe3FxLkZpbmVVcGxvYWRlckJhc2ljLnByb3RvdHlwZS5fb25TdWJtaXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuX2FkZFRvTGlzdChhLGIpfSxfb25Qcm9ncmVzczpmdW5jdGlvbihhLGIsYyxkKXtxcS5GaW5lVXBsb2FkZXJCYXNpYy5wcm90b3R5cGUuX29uUHJvZ3Jlc3MuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBlLGYsZyxoO2U9dGhpcy5nZXRJdGVtQnlGaWxlSWQoYSk7Zj10aGlzLl9maW5kKGUsInByb2dyZXNzQmFyIik7aD1NYXRoLnJvdW5kKDEwMCooYy9kKSk7Yz09PWQ/KGc9dGhpcy5fZmluZChlLCJjYW5jZWwiKSxxcShnKS5oaWRlKCkscXEoZikuaGlkZSgpLHFxKHRoaXMuX2ZpbmQoZSwKInN0YXR1c1RleHQiKSkuc2V0VGV4dCh0aGlzLl9vcHRpb25zLnRleHQud2FpdGluZ0ZvclJlc3BvbnNlKSxnPXRoaXMuX2Zvcm1hdFNpemUoZCkpOihnPXRoaXMuX2Zvcm1hdFByb2dyZXNzKGMsZCkscXEoZikuY3NzKHtkaXNwbGF5OiJibG9jayJ9KSk7cXEoZikuY3NzKHt3aWR0aDpoKyIlIn0pO2U9dGhpcy5fZmluZChlLCJzaXplIik7cXEoZSkuY3NzKHtkaXNwbGF5OiJpbmxpbmUifSk7cXEoZSkuc2V0VGV4dChnKX0sX29uQ29tcGxldGU6ZnVuY3Rpb24oYSxiLGMsZCl7cXEuRmluZVVwbG9hZGVyQmFzaWMucHJvdG90eXBlLl9vbkNvbXBsZXRlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgZT10aGlzLmdldEl0ZW1CeUZpbGVJZChhKTtxcSh0aGlzLl9maW5kKGUsInN0YXR1c1RleHQiKSkuY2xlYXJUZXh0KCk7cXEoZSkucmVtb3ZlQ2xhc3ModGhpcy5fY2xhc3Nlcy5yZXRyeWluZyk7cXEodGhpcy5fZmluZChlLCJwcm9ncmVzc0JhciIpKS5oaWRlKCk7KCF0aGlzLl9vcHRpb25zLmRpc2FibGVDYW5jZWxGb3JGb3JtVXBsb2Fkc3x8CnFxLlVwbG9hZEhhbmRsZXJYaHIuaXNTdXBwb3J0ZWQoKSkmJnFxKHRoaXMuX2ZpbmQoZSwiY2FuY2VsIikpLmhpZGUoKTtxcSh0aGlzLl9maW5kKGUsInNwaW5uZXIiKSkuaGlkZSgpO2Muc3VjY2Vzcz8ocXEoZSkuYWRkQ2xhc3ModGhpcy5fY2xhc3Nlcy5zdWNjZXNzKSx0aGlzLl9jbGFzc2VzLnN1Y2Nlc3NJY29uJiYodGhpcy5fZmluZChlLCJmaW5pc2hlZCIpLnN0eWxlLmRpc3BsYXk9ImlubGluZS1ibG9jayIscXEoZSkuYWRkQ2xhc3ModGhpcy5fY2xhc3Nlcy5zdWNjZXNzSWNvbikpKToocXEoZSkuYWRkQ2xhc3ModGhpcy5fY2xhc3Nlcy5mYWlsKSx0aGlzLl9jbGFzc2VzLmZhaWxJY29uJiYodGhpcy5fZmluZChlLCJmaW5pc2hlZCIpLnN0eWxlLmRpc3BsYXk9ImlubGluZS1ibG9jayIscXEoZSkuYWRkQ2xhc3ModGhpcy5fY2xhc3Nlcy5mYWlsSWNvbikpLHRoaXMuX29wdGlvbnMucmV0cnkuc2hvd0J1dHRvbiYmIXRoaXMuX3ByZXZlbnRSZXRyaWVzW2FdJiZxcShlKS5hZGRDbGFzcyh0aGlzLl9jbGFzc2VzLnJldHJ5YWJsZSksCnRoaXMuX2NvbnRyb2xGYWlsdXJlVGV4dERpc3BsYXkoZSxjKSl9LF9vblVwbG9hZDpmdW5jdGlvbihhLGIsYyl7cXEuRmluZVVwbG9hZGVyQmFzaWMucHJvdG90eXBlLl9vblVwbG9hZC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5fc2hvd1NwaW5uZXIodGhpcy5nZXRJdGVtQnlGaWxlSWQoYSkpfSxfb25CZWZvcmVBdXRvUmV0cnk6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZjtxcS5GaW5lVXBsb2FkZXJCYXNpYy5wcm90b3R5cGUuX29uQmVmb3JlQXV0b1JldHJ5LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtiPXRoaXMuZ2V0SXRlbUJ5RmlsZUlkKGEpO2M9dGhpcy5fZmluZChiLCJwcm9ncmVzc0JhciIpO3RoaXMuX3Nob3dDYW5jZWxMaW5rKGIpO2Muc3R5bGUud2lkdGg9MDtxcShjKS5oaWRlKCk7dGhpcy5fb3B0aW9ucy5yZXRyeS5zaG93QXV0b1JldHJ5Tm90ZSYmKGM9dGhpcy5fZmluZChiLCJzdGF0dXNUZXh0IiksZD10aGlzLl9hdXRvUmV0cmllc1thXSsxLGU9dGhpcy5fb3B0aW9ucy5yZXRyeS5tYXhBdXRvQXR0ZW1wdHMsCmY9dGhpcy5fb3B0aW9ucy5yZXRyeS5hdXRvUmV0cnlOb3RlLnJlcGxhY2UoL1x7cmV0cnlOdW1cfS9nLGQpLGY9Zi5yZXBsYWNlKC9ce21heEF1dG9cfS9nLGUpLHFxKGMpLnNldFRleHQoZiksMT09PWQmJnFxKGIpLmFkZENsYXNzKHRoaXMuX2NsYXNzZXMucmV0cnlpbmcpKX0sX29uQmVmb3JlTWFudWFsUmV0cnk6ZnVuY3Rpb24oYSl7aWYocXEuRmluZVVwbG9hZGVyQmFzaWMucHJvdG90eXBlLl9vbkJlZm9yZU1hbnVhbFJldHJ5LmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIGI9dGhpcy5nZXRJdGVtQnlGaWxlSWQoYSk7dGhpcy5fZmluZChiLCJwcm9ncmVzc0JhciIpLnN0eWxlLndpZHRoPTA7cXEoYikucmVtb3ZlQ2xhc3ModGhpcy5fY2xhc3Nlcy5mYWlsKTt0aGlzLl9zaG93U3Bpbm5lcihiKTt0aGlzLl9zaG93Q2FuY2VsTGluayhiKTtyZXR1cm4hMH1yZXR1cm4hMX0sX2FkZFRvTGlzdDpmdW5jdGlvbihhLGIpe3ZhciBjPXFxLnRvRWxlbWVudCh0aGlzLl9vcHRpb25zLmZpbGVUZW1wbGF0ZSk7CmlmKHRoaXMuX29wdGlvbnMuZGlzYWJsZUNhbmNlbEZvckZvcm1VcGxvYWRzJiYhcXEuVXBsb2FkSGFuZGxlclhoci5pc1N1cHBvcnRlZCgpKXt2YXIgZD10aGlzLl9maW5kKGMsImNhbmNlbCIpO3FxKGQpLnJlbW92ZSgpfWMucXFGaWxlSWQ9YTtkPXRoaXMuX2ZpbmQoYywiZmlsZSIpO3FxKGQpLnNldFRleHQodGhpcy5fZm9ybWF0RmlsZU5hbWUoYikpO3FxKHRoaXMuX2ZpbmQoYywic2l6ZSIpKS5oaWRlKCk7dGhpcy5fb3B0aW9ucy5tdWx0aXBsZXx8dGhpcy5fY2xlYXJMaXN0KCk7dGhpcy5fbGlzdEVsZW1lbnQuYXBwZW5kQ2hpbGQoYyl9LF9jbGVhckxpc3Q6ZnVuY3Rpb24oKXt0aGlzLl9saXN0RWxlbWVudC5pbm5lckhUTUw9IiI7dGhpcy5jbGVhclN0b3JlZEZpbGVzKCl9LF9iaW5kQ2FuY2VsQW5kUmV0cnlFdmVudHM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3RoaXMuX2F0dGFjaCh0aGlzLl9saXN0RWxlbWVudCwiY2xpY2siLGZ1bmN0aW9uKGIpe3ZhciBiPWJ8fHdpbmRvdy5ldmVudCwKYz1iLnRhcmdldHx8Yi5zcmNFbGVtZW50O2lmKHFxKGMpLmhhc0NsYXNzKGEuX2NsYXNzZXMuY2FuY2VsKXx8cXEoYykuaGFzQ2xhc3MoYS5fY2xhc3Nlcy5yZXRyeSkpe3FxLnByZXZlbnREZWZhdWx0KGIpO2ZvcihiPWMucGFyZW50Tm9kZTt2b2lkIDA9PWIucXFGaWxlSWQ7KWI9Yz1jLnBhcmVudE5vZGU7cXEoYykuaGFzQ2xhc3MoYS5fY2xhc3Nlcy5jYW5jZWwpPyhhLmNhbmNlbChiLnFxRmlsZUlkKSxxcShiKS5yZW1vdmUoKSk6KHFxKGIpLnJlbW92ZUNsYXNzKGEuX2NsYXNzZXMucmV0cnlhYmxlKSxhLnJldHJ5KGIucXFGaWxlSWQpKX19KX0sX2Zvcm1hdFByb2dyZXNzOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5fb3B0aW9ucy50ZXh0LmZvcm1hdFByb2dyZXNzLGQ9TWF0aC5yb3VuZCgxMDAqKGEvYikpLGM9Yy5yZXBsYWNlKCJ7cGVyY2VudH0iLGQpLGQ9dGhpcy5fZm9ybWF0U2l6ZShiKTtyZXR1cm4gYz1jLnJlcGxhY2UoInt0b3RhbF9zaXplfSIsZCl9LF9jb250cm9sRmFpbHVyZVRleHREaXNwbGF5OmZ1bmN0aW9uKGEsCmIpe3ZhciBjLGQsZSxmO2M9dGhpcy5fb3B0aW9ucy5mYWlsZWRVcGxvYWRUZXh0RGlzcGxheS5tb2RlO2Q9dGhpcy5fb3B0aW9ucy5mYWlsZWRVcGxvYWRUZXh0RGlzcGxheS5tYXhDaGFycztlPXRoaXMuX29wdGlvbnMuZmFpbGVkVXBsb2FkVGV4dERpc3BsYXkucmVzcG9uc2VQcm9wZXJ0eTsiY3VzdG9tIj09PWM/KChjPWJbZV0pP2MubGVuZ3RoPmQmJihmPWMuc3Vic3RyaW5nKDAsZCkrIi4uLiIpOihjPXRoaXMuX29wdGlvbnMudGV4dC5mYWlsVXBsb2FkLHRoaXMubG9nKCInIitlKyInIGlzIG5vdCBhIHZhbGlkIHByb3BlcnR5IG9uIHRoZSBzZXJ2ZXIgcmVzcG9uc2UuIiwid2FybiIpKSxxcSh0aGlzLl9maW5kKGEsInN0YXR1c1RleHQiKSkuc2V0VGV4dChmfHxjKSx0aGlzLl9vcHRpb25zLmZhaWxlZFVwbG9hZFRleHREaXNwbGF5LmVuYWJsZVRvb2x0aXAmJnRoaXMuX3Nob3dUb29sdGlwKGEsYykpOiJkZWZhdWx0Ij09PWM/cXEodGhpcy5fZmluZChhLCJzdGF0dXNUZXh0IikpLnNldFRleHQodGhpcy5fb3B0aW9ucy50ZXh0LmZhaWxVcGxvYWQpOgoibm9uZSIhPT1jJiZ0aGlzLmxvZygiZmFpbGVkVXBsb2FkVGV4dERpc3BsYXkubW9kZSB2YWx1ZSBvZiAnIitjKyInIGlzIG5vdCB2YWxpZCIsIndhcm4iKX0sX3Nob3dUb29sdGlwOmZ1bmN0aW9uKGEsYil7YS50aXRsZT1ifSxfc2hvd1NwaW5uZXI6ZnVuY3Rpb24oYSl7dGhpcy5fZmluZChhLCJzcGlubmVyIikuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIn0sX3Nob3dDYW5jZWxMaW5rOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLl9vcHRpb25zLmRpc2FibGVDYW5jZWxGb3JGb3JtVXBsb2Fkc3x8cXEuVXBsb2FkSGFuZGxlclhoci5pc1N1cHBvcnRlZCgpKXRoaXMuX2ZpbmQoYSwiY2FuY2VsIikuc3R5bGUuZGlzcGxheT0iaW5saW5lIn0sX2Vycm9yOmZ1bmN0aW9uKGEsYil7dGhpcy5fb3B0aW9ucy5zaG93TWVzc2FnZShxcS5GaW5lVXBsb2FkZXJCYXNpYy5wcm90b3R5cGUuX2Vycm9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9fSk7CnFxLlVwbG9hZERyb3Bab25lPWZ1bmN0aW9uKGEpe3RoaXMuX29wdGlvbnM9e2VsZW1lbnQ6bnVsbCxvbkVudGVyOmZ1bmN0aW9uKCl7fSxvbkxlYXZlOmZ1bmN0aW9uKCl7fSxvbkxlYXZlTm90RGVzY2VuZGFudHM6ZnVuY3Rpb24oKXt9LG9uRHJvcDpmdW5jdGlvbigpe319O3FxLmV4dGVuZCh0aGlzLl9vcHRpb25zLGEpO3FxLmV4dGVuZCh0aGlzLHFxLkRpc3Bvc2VTdXBwb3J0KTt0aGlzLl9lbGVtZW50PXRoaXMuX29wdGlvbnMuZWxlbWVudDt0aGlzLl9kaXNhYmxlRHJvcE91dHNpZGUoKTt0aGlzLl9hdHRhY2hFdmVudHMoKX07CnFxLlVwbG9hZERyb3Bab25lLnByb3RvdHlwZT17X2RyYWdvdmVyX3Nob3VsZF9iZV9jYW5jZWxlZDpmdW5jdGlvbigpe3JldHVybiBxcS5zYWZhcmkoKXx8cXEuZmlyZWZveCgpJiZxcS53aW5kb3dzKCl9LF9kaXNhYmxlRHJvcE91dHNpZGU6ZnVuY3Rpb24oKXtxcS5VcGxvYWREcm9wWm9uZS5kcm9wT3V0c2lkZURpc2FibGVkfHwodGhpcy5fZHJhZ292ZXJfc2hvdWxkX2JlX2NhbmNlbGVkP3FxKGRvY3VtZW50KS5hdHRhY2goImRyYWdvdmVyIixmdW5jdGlvbihhKXthLnByZXZlbnREZWZhdWx0KCl9KTpxcShkb2N1bWVudCkuYXR0YWNoKCJkcmFnb3ZlciIsZnVuY3Rpb24oYSl7YS5kYXRhVHJhbnNmZXImJihhLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0PSJub25lIixhLnByZXZlbnREZWZhdWx0KCkpfSkscXEuVXBsb2FkRHJvcFpvbmUuZHJvcE91dHNpZGVEaXNhYmxlZD0hMCl9LF9hdHRhY2hFdmVudHM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzO2EuX2F0dGFjaChhLl9lbGVtZW50LAoiZHJhZ292ZXIiLGZ1bmN0aW9uKGIpe2lmKGEuX2lzVmFsaWRGaWxlRHJhZyhiKSl7dmFyIGM9cXEuaWUoKT9udWxsOmIuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQ7Yi5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdD0ibW92ZSI9PWN8fCJsaW5rTW92ZSI9PWM/Im1vdmUiOiJjb3B5IjtiLnN0b3BQcm9wYWdhdGlvbigpO2IucHJldmVudERlZmF1bHQoKX19KTthLl9hdHRhY2goYS5fZWxlbWVudCwiZHJhZ2VudGVyIixmdW5jdGlvbihiKXtpZihhLl9pc1ZhbGlkRmlsZURyYWcoYikpYS5fb3B0aW9ucy5vbkVudGVyKGIpfSk7YS5fYXR0YWNoKGEuX2VsZW1lbnQsImRyYWdsZWF2ZSIsZnVuY3Rpb24oYil7aWYoYS5faXNWYWxpZEZpbGVEcmFnKGIpKXthLl9vcHRpb25zLm9uTGVhdmUoYik7dmFyIGM9ZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChiLmNsaWVudFgsYi5jbGllbnRZKTtpZighcXEodGhpcykuY29udGFpbnMoYykpYS5fb3B0aW9ucy5vbkxlYXZlTm90RGVzY2VuZGFudHMoYil9fSk7CmEuX2F0dGFjaChhLl9lbGVtZW50LCJkcm9wIixmdW5jdGlvbihiKXthLl9pc1ZhbGlkRmlsZURyYWcoYikmJihiLnByZXZlbnREZWZhdWx0KCksYS5fb3B0aW9ucy5vbkRyb3AoYikpfSl9LF9pc1ZhbGlkRmlsZURyYWc6ZnVuY3Rpb24oYSl7aWYocXEuaWUoKSYmIXFxLmllMTAoKSlyZXR1cm4hMTt2YXIgYT1hLmRhdGFUcmFuc2ZlcixiPXFxLnNhZmFyaSgpLGM9cXEuaWUxMCgpPyEwOiJub25lIiE9YS5lZmZlY3RBbGxvd2VkO3JldHVybiBhJiZjJiYoYS5maWxlc3x8IWImJmEudHlwZXMuY29udGFpbnMmJmEudHlwZXMuY29udGFpbnMoIkZpbGVzIikpfX07CnFxLlVwbG9hZEhhbmRsZXJBYnN0cmFjdD1mdW5jdGlvbihhKXt0aGlzLl9vcHRpb25zPXtkZWJ1ZzohMSxlbmRwb2ludDoiL3VwbG9hZC5waHAiLG1heENvbm5lY3Rpb25zOjk5OSxsb2c6ZnVuY3Rpb24oKXt9LG9uUHJvZ3Jlc3M6ZnVuY3Rpb24oKXt9LG9uQ29tcGxldGU6ZnVuY3Rpb24oKXt9LG9uQ2FuY2VsOmZ1bmN0aW9uKCl7fSxvblVwbG9hZDpmdW5jdGlvbigpe30sb25BdXRvUmV0cnk6ZnVuY3Rpb24oKXt9fTtxcS5leHRlbmQodGhpcy5fb3B0aW9ucyxhKTt0aGlzLl9xdWV1ZT1bXTt0aGlzLl9wYXJhbXM9W107dGhpcy5sb2c9dGhpcy5fb3B0aW9ucy5sb2d9OwpxcS5VcGxvYWRIYW5kbGVyQWJzdHJhY3QucHJvdG90eXBlPXthZGQ6ZnVuY3Rpb24oKXt9LHVwbG9hZDpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuX3F1ZXVlLnB1c2goYSksZD17fTtxcS5leHRlbmQoZCxiKTt0aGlzLl9wYXJhbXNbYV09ZDtjPD10aGlzLl9vcHRpb25zLm1heENvbm5lY3Rpb25zJiZ0aGlzLl91cGxvYWQoYSx0aGlzLl9wYXJhbXNbYV0pfSxyZXRyeTpmdW5jdGlvbihhKXswPD1xcS5pbmRleE9mKHRoaXMuX3F1ZXVlLGEpP3RoaXMuX3VwbG9hZChhLHRoaXMuX3BhcmFtc1thXSk6dGhpcy51cGxvYWQoYSx0aGlzLl9wYXJhbXNbYV0pfSxjYW5jZWw6ZnVuY3Rpb24oYSl7dGhpcy5sb2coIkNhbmNlbGxpbmcgIithKTt0aGlzLl9jYW5jZWwoYSk7dGhpcy5fZGVxdWV1ZShhKX0sY2FuY2VsQWxsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTx0aGlzLl9xdWV1ZS5sZW5ndGg7YSsrKXRoaXMuX2NhbmNlbCh0aGlzLl9xdWV1ZVthXSk7dGhpcy5fcXVldWU9W119LGdldE5hbWU6ZnVuY3Rpb24oKXt9LApnZXRTaXplOmZ1bmN0aW9uKCl7fSxnZXRRdWV1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9xdWV1ZX0scmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLmxvZygiUmVzZXR0aW5nIHVwbG9hZCBoYW5kbGVyIik7dGhpcy5fcXVldWU9W107dGhpcy5fcGFyYW1zPVtdfSxfdXBsb2FkOmZ1bmN0aW9uKCl7fSxfY2FuY2VsOmZ1bmN0aW9uKCl7fSxfZGVxdWV1ZTpmdW5jdGlvbihhKXthPXFxLmluZGV4T2YodGhpcy5fcXVldWUsYSk7dGhpcy5fcXVldWUuc3BsaWNlKGEsMSk7dmFyIGI9dGhpcy5fb3B0aW9ucy5tYXhDb25uZWN0aW9uczt0aGlzLl9xdWV1ZS5sZW5ndGg+PWImJmE8YiYmKGE9dGhpcy5fcXVldWVbYi0xXSx0aGlzLl91cGxvYWQoYSx0aGlzLl9wYXJhbXNbYV0pKX0saXNWYWxpZDpmdW5jdGlvbigpe319OwpxcS5VcGxvYWRIYW5kbGVyRm9ybT1mdW5jdGlvbihhKXtxcS5VcGxvYWRIYW5kbGVyQWJzdHJhY3QuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuX2lucHV0cz17fTt0aGlzLl9kZXRhY2hfbG9hZF9ldmVudHM9e319O3FxLmV4dGVuZChxcS5VcGxvYWRIYW5kbGVyRm9ybS5wcm90b3R5cGUscXEuVXBsb2FkSGFuZGxlckFic3RyYWN0LnByb3RvdHlwZSk7CnFxLmV4dGVuZChxcS5VcGxvYWRIYW5kbGVyRm9ybS5wcm90b3R5cGUse2FkZDpmdW5jdGlvbihhKXthLnNldEF0dHJpYnV0ZSgibmFtZSIsdGhpcy5fb3B0aW9ucy5pbnB1dE5hbWUpO3ZhciBiPSJxcS11cGxvYWQtaGFuZGxlci1pZnJhbWUiK3FxLmdldFVuaXF1ZUlkKCk7dGhpcy5faW5wdXRzW2JdPWE7YS5wYXJlbnROb2RlJiZxcShhKS5yZW1vdmUoKTtyZXR1cm4gYn0sZ2V0TmFtZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5faW5wdXRzW2FdLnZhbHVlLnJlcGxhY2UoLy4qKFwvfFxcKS8sIiIpfSxpc1ZhbGlkOmZ1bmN0aW9uKGEpe3JldHVybiB2b2lkIDAhPT10aGlzLl9pbnB1dHNbYV19LHJlc2V0OmZ1bmN0aW9uKCl7cXEuVXBsb2FkSGFuZGxlckFic3RyYWN0LnByb3RvdHlwZS5yZXNldC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5faW5wdXRzPXt9O3RoaXMuX2RldGFjaF9sb2FkX2V2ZW50cz17fX0sX2NhbmNlbDpmdW5jdGlvbihhKXt0aGlzLl9vcHRpb25zLm9uQ2FuY2VsKGEsCnRoaXMuZ2V0TmFtZShhKSk7ZGVsZXRlIHRoaXMuX2lucHV0c1thXTtkZWxldGUgdGhpcy5fZGV0YWNoX2xvYWRfZXZlbnRzW2FdO2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSkpYS5zZXRBdHRyaWJ1dGUoInNyYyIsImphdmFzY3JpcHQ6ZmFsc2U7IikscXEoYSkucmVtb3ZlKCl9LF91cGxvYWQ6ZnVuY3Rpb24oYSxiKXt0aGlzLl9vcHRpb25zLm9uVXBsb2FkKGEsdGhpcy5nZXROYW1lKGEpLCExKTt2YXIgYz10aGlzLl9pbnB1dHNbYV07aWYoIWMpdGhyb3cgRXJyb3IoImZpbGUgd2l0aCBwYXNzZWQgaWQgd2FzIG5vdCBhZGRlZCwgb3IgYWxyZWFkeSB1cGxvYWRlZCBvciBjYW5jZWxsZWQiKTt2YXIgZD10aGlzLmdldE5hbWUoYSk7Ylt0aGlzLl9vcHRpb25zLmlucHV0TmFtZV09ZDt2YXIgZT10aGlzLl9jcmVhdGVJZnJhbWUoYSksZj10aGlzLl9jcmVhdGVGb3JtKGUsYik7Zi5hcHBlbmRDaGlsZChjKTt2YXIgZz10aGlzO3RoaXMuX2F0dGFjaExvYWRFdmVudChlLGZ1bmN0aW9uKCl7Zy5sb2coImlmcmFtZSBsb2FkZWQiKTsKdmFyIGI9Zy5fZ2V0SWZyYW1lQ29udGVudEpTT04oZSk7c2V0VGltZW91dChmdW5jdGlvbigpe2cuX2RldGFjaF9sb2FkX2V2ZW50c1thXSgpO2RlbGV0ZSBnLl9kZXRhY2hfbG9hZF9ldmVudHNbYV07cXEoZSkucmVtb3ZlKCl9LDEpO2lmKGIuc3VjY2Vzc3x8IWcuX29wdGlvbnMub25BdXRvUmV0cnkoYSxkLGIpKWcuX29wdGlvbnMub25Db21wbGV0ZShhLGQsYiksZy5fZGVxdWV1ZShhKX0pO3RoaXMubG9nKCJTZW5kaW5nIHVwbG9hZCByZXF1ZXN0IGZvciAiK2EpO2Yuc3VibWl0KCk7cXEoZikucmVtb3ZlKCk7cmV0dXJuIGF9LF9hdHRhY2hMb2FkRXZlbnQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzO3RoaXMuX2RldGFjaF9sb2FkX2V2ZW50c1thLmlkXT1xcShhKS5hdHRhY2goImxvYWQiLGZ1bmN0aW9uKCl7Yy5sb2coIlJlY2VpdmVkIHJlc3BvbnNlIGZvciAiK2EuaWQpO2lmKGEucGFyZW50Tm9kZSl7dHJ5e2lmKGEuY29udGVudERvY3VtZW50JiZhLmNvbnRlbnREb2N1bWVudC5ib2R5JiYKImZhbHNlIj09YS5jb250ZW50RG9jdW1lbnQuYm9keS5pbm5lckhUTUwpcmV0dXJufWNhdGNoKGQpe2MubG9nKCJFcnJvciB3aGVuIGF0dGVtcHRpbmcgdG8gYWNjZXNzIGlmcmFtZSBkdXJpbmcgaGFuZGxpbmcgb2YgdXBsb2FkIHJlc3BvbnNlICgiK2QrIikiLCJlcnJvciIpfWIoKX19KX0sX2dldElmcmFtZUNvbnRlbnRKU09OOmZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmNvbnRlbnREb2N1bWVudD9hLmNvbnRlbnREb2N1bWVudDphLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQsYyxkPWIuYm9keS5pbm5lckhUTUw7dGhpcy5sb2coImNvbnZlcnRpbmcgaWZyYW1lJ3MgaW5uZXJIVE1MIHRvIEpTT04iKTt0aGlzLmxvZygiaW5uZXJIVE1MID0gIitkKTtkJiZkLm1hdGNoKC9ePHByZS9pKSYmKGQ9Yi5ib2R5LmZpcnN0Q2hpbGQuZmlyc3RDaGlsZC5ub2RlVmFsdWUpO2M9ZXZhbCgiKCIrZCsiKSIpfWNhdGNoKGUpe3RoaXMubG9nKCJFcnJvciB3aGVuIGF0dGVtcHRpbmcgdG8gcGFyc2UgZm9ybSB1cGxvYWQgcmVzcG9uc2UgKCIrCmUrIikiLCJlcnJvciIpLGM9e3N1Y2Nlc3M6ITF9fXJldHVybiBjfSxfY3JlYXRlSWZyYW1lOmZ1bmN0aW9uKGEpe3ZhciBiPXFxLnRvRWxlbWVudCgnPGlmcmFtZSBzcmM9ImphdmFzY3JpcHQ6ZmFsc2U7IiBuYW1lPSInK2ErJyIgLz4nKTtiLnNldEF0dHJpYnV0ZSgiaWQiLGEpO2Iuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTtyZXR1cm4gYn0sX2NyZWF0ZUZvcm06ZnVuY3Rpb24oYSxiKXt2YXIgYz1xcS50b0VsZW1lbnQoJzxmb3JtIG1ldGhvZD0iJysodGhpcy5fb3B0aW9ucy5kZW1vTW9kZT8iR0VUIjoiUE9TVCIpKyciIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPjwvZm9ybT4nKSxkPXFxLm9iajJ1cmwoYix0aGlzLl9vcHRpb25zLmVuZHBvaW50KTtjLnNldEF0dHJpYnV0ZSgiYWN0aW9uIixkKTtjLnNldEF0dHJpYnV0ZSgidGFyZ2V0IixhLm5hbWUpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjKTsKcmV0dXJuIGN9fSk7cXEuVXBsb2FkSGFuZGxlclhocj1mdW5jdGlvbihhKXtxcS5VcGxvYWRIYW5kbGVyQWJzdHJhY3QuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuX2ZpbGVzPVtdO3RoaXMuX3hocnM9W107dGhpcy5fbG9hZGVkPVtdfTtxcS5VcGxvYWRIYW5kbGVyWGhyLmlzU3VwcG9ydGVkPWZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTthLnR5cGU9ImZpbGUiO3JldHVybiJtdWx0aXBsZSJpbiBhJiYidW5kZWZpbmVkIiE9dHlwZW9mIEZpbGUmJiJ1bmRlZmluZWQiIT10eXBlb2YgRm9ybURhdGEmJiJ1bmRlZmluZWQiIT10eXBlb2YobmV3IFhNTEh0dHBSZXF1ZXN0KS51cGxvYWR9O3FxLmV4dGVuZChxcS5VcGxvYWRIYW5kbGVyWGhyLnByb3RvdHlwZSxxcS5VcGxvYWRIYW5kbGVyQWJzdHJhY3QucHJvdG90eXBlKTsKcXEuZXh0ZW5kKHFxLlVwbG9hZEhhbmRsZXJYaHIucHJvdG90eXBlLHthZGQ6ZnVuY3Rpb24oYSl7aWYoIShhIGluc3RhbmNlb2YgRmlsZSkpdGhyb3cgRXJyb3IoIlBhc3NlZCBvYmogaW4gbm90IGEgRmlsZSAoaW4gcXEuVXBsb2FkSGFuZGxlclhocikiKTtyZXR1cm4gdGhpcy5fZmlsZXMucHVzaChhKS0xfSxnZXROYW1lOmZ1bmN0aW9uKGEpe2E9dGhpcy5fZmlsZXNbYV07cmV0dXJuIG51bGwhPT1hLmZpbGVOYW1lJiZ2b2lkIDAhPT1hLmZpbGVOYW1lP2EuZmlsZU5hbWU6YS5uYW1lfSxnZXRTaXplOmZ1bmN0aW9uKGEpe2E9dGhpcy5fZmlsZXNbYV07cmV0dXJuIG51bGwhPWEuZmlsZVNpemU/YS5maWxlU2l6ZTphLnNpemV9LGdldExvYWRlZDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fbG9hZGVkW2FdfHwwfSxpc1ZhbGlkOmZ1bmN0aW9uKGEpe3JldHVybiB2b2lkIDAhPT10aGlzLl9maWxlc1thXX0scmVzZXQ6ZnVuY3Rpb24oKXtxcS5VcGxvYWRIYW5kbGVyQWJzdHJhY3QucHJvdG90eXBlLnJlc2V0LmFwcGx5KHRoaXMsCmFyZ3VtZW50cyk7dGhpcy5fZmlsZXM9W107dGhpcy5feGhycz1bXTt0aGlzLl9sb2FkZWQ9W119LF91cGxvYWQ6ZnVuY3Rpb24oYSxiKXt0aGlzLl9vcHRpb25zLm9uVXBsb2FkKGEsdGhpcy5nZXROYW1lKGEpLCEwKTt2YXIgYz10aGlzLl9maWxlc1thXSxkPXRoaXMuZ2V0TmFtZShhKTt0aGlzLmdldFNpemUoYSk7dGhpcy5fbG9hZGVkW2FdPTA7dmFyIGU9dGhpcy5feGhyc1thXT1uZXcgWE1MSHR0cFJlcXVlc3QsZj10aGlzO2UudXBsb2FkLm9ucHJvZ3Jlc3M9ZnVuY3Rpb24oYil7Yi5sZW5ndGhDb21wdXRhYmxlJiYoZi5fbG9hZGVkW2FdPWIubG9hZGVkLGYuX29wdGlvbnMub25Qcm9ncmVzcyhhLGQsYi5sb2FkZWQsYi50b3RhbCkpfTtlLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpezQ9PWUucmVhZHlTdGF0ZSYmZi5fb25Db21wbGV0ZShhLGUpfTtiPWJ8fHt9O2JbdGhpcy5fb3B0aW9ucy5pbnB1dE5hbWVdPWQ7dmFyIGc9cXEub2JqMnVybChiLHRoaXMuX29wdGlvbnMuZW5kcG9pbnQpOwplLm9wZW4odGhpcy5fb3B0aW9ucy5kZW1vTW9kZT8iR0VUIjoiUE9TVCIsZywhMCk7ZS5zZXRSZXF1ZXN0SGVhZGVyKCJYLVJlcXVlc3RlZC1XaXRoIiwiWE1MSHR0cFJlcXVlc3QiKTtlLnNldFJlcXVlc3RIZWFkZXIoIlgtRmlsZS1OYW1lIixlbmNvZGVVUklDb21wb25lbnQoZCkpO2Uuc2V0UmVxdWVzdEhlYWRlcigiQ2FjaGUtQ29udHJvbCIsIm5vLWNhY2hlIik7dGhpcy5fb3B0aW9ucy5mb3JjZU11bHRpcGFydD8oZz1uZXcgRm9ybURhdGEsZy5hcHBlbmQodGhpcy5fb3B0aW9ucy5pbnB1dE5hbWUsYyksYz1nKTooZS5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKSxlLnNldFJlcXVlc3RIZWFkZXIoIlgtTWltZS1UeXBlIixjLnR5cGUpKTtmb3Ioa2V5IGluIHRoaXMuX29wdGlvbnMuY3VzdG9tSGVhZGVycyllLnNldFJlcXVlc3RIZWFkZXIoa2V5LHRoaXMuX29wdGlvbnMuY3VzdG9tSGVhZGVyc1trZXldKTt0aGlzLmxvZygiU2VuZGluZyB1cGxvYWQgcmVxdWVzdCBmb3IgIisKYSk7ZS5zZW5kKGMpfSxfb25Db21wbGV0ZTpmdW5jdGlvbihhLGIpe2lmKHRoaXMuX2ZpbGVzW2FdKXt2YXIgYz10aGlzLmdldE5hbWUoYSksZD10aGlzLmdldFNpemUoYSksZTt0aGlzLl9vcHRpb25zLm9uUHJvZ3Jlc3MoYSxjLGQsZCk7dGhpcy5sb2coInhociAtIHNlcnZlciByZXNwb25zZSByZWNlaXZlZCBmb3IgIithKTt0aGlzLmxvZygicmVzcG9uc2VUZXh0ID0gIitiLnJlc3BvbnNlVGV4dCk7dHJ5e2U9ImZ1bmN0aW9uIj09PXR5cGVvZiBKU09OLnBhcnNlP0pTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpOmV2YWwoIigiK2IucmVzcG9uc2VUZXh0KyIpIil9Y2F0Y2goZil7dGhpcy5sb2coIkVycm9yIHdoZW4gYXR0ZW1wdGluZyB0byBwYXJzZSB4aHIgcmVzcG9uc2UgdGV4dCAoIitmKyIpIiwiZXJyb3IiKSxlPXt9fWlmKDIwMD09PWIuc3RhdHVzJiZlLnN1Y2Nlc3N8fCF0aGlzLl9vcHRpb25zLm9uQXV0b1JldHJ5KGEsYyxlLGIpKXRoaXMuX29wdGlvbnMub25Db21wbGV0ZShhLApjLGUsYiksdGhpcy5feGhyc1thXT1udWxsLHRoaXMuX2RlcXVldWUoYSl9fSxfY2FuY2VsOmZ1bmN0aW9uKGEpe3RoaXMuX29wdGlvbnMub25DYW5jZWwoYSx0aGlzLmdldE5hbWUoYSkpO3RoaXMuX2ZpbGVzW2FdPW51bGw7dGhpcy5feGhyc1thXSYmKHRoaXMuX3hocnNbYV0uYWJvcnQoKSx0aGlzLl94aHJzW2FdPW51bGwpfX0pOwooZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGgsaSxqLGs7Zz1bInVwbG9hZGVyVHlwZSJdO2Q9ZnVuY3Rpb24oYSl7YSYmKGE9aShhKSxoKGEpLCJiYXNpYyI9PT1mKCJ1cGxvYWRlclR5cGUiKT9iKG5ldyBxcS5GaW5lVXBsb2FkZXJCYXNpYyhhKSk6YihuZXcgcXEuRmluZVVwbG9hZGVyKGEpKSk7cmV0dXJuIGN9O2U9ZnVuY3Rpb24oYSxiKXt2YXIgZD1jLmRhdGEoImZpbmV1cGxvYWRlciIpO2lmKGIpdm9pZCAwPT09ZCYmKGQ9e30pLGRbYV09YixjLmRhdGEoImZpbmV1cGxvYWRlciIsZCk7ZWxzZSByZXR1cm4gdm9pZCAwPT09ZD9udWxsOmRbYV19O2I9ZnVuY3Rpb24oYSl7cmV0dXJuIGUoInVwbG9hZGVyIixhKX07Zj1mdW5jdGlvbihhLGIpe3JldHVybiBlKGEsYil9O2g9ZnVuY3Rpb24oYil7dmFyIGQ9Yi5jYWxsYmFja3M9e307YS5lYWNoKChuZXcgcXEuRmluZVVwbG9hZGVyQmFzaWMpLl9vcHRpb25zLmNhbGxiYWNrcyxmdW5jdGlvbihhKXt2YXIgYixlO2I9L15vbihcdyspLy5leGVjKGEpWzFdOwpiPWIuc3Vic3RyaW5nKDAsMSkudG9Mb3dlckNhc2UoKStiLnN1YnN0cmluZygxKTtlPWM7ZFthXT1mdW5jdGlvbigpe3ZhciBhPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7cmV0dXJuIGUudHJpZ2dlckhhbmRsZXIoYixhKX19KX07aT1mdW5jdGlvbihiLGQpe3ZhciBlLGg7ZT12b2lkIDA9PT1kPyJiYXNpYyIhPT1iLnVwbG9hZGVyVHlwZT97ZWxlbWVudDpjWzBdfTp7fTpkO2EuZWFjaChiLGZ1bmN0aW9uKGIsYyl7MDw9YS5pbkFycmF5KGIsZyk/ZihiLGMpOmMgaW5zdGFuY2VvZiBhP2VbYl09Y1swXTphLmlzUGxhaW5PYmplY3QoYyk/KGVbYl09e30saShjLGVbYl0pKTphLmlzQXJyYXkoYyk/KGg9W10sYS5lYWNoKGMsZnVuY3Rpb24oYixjKXtjIGluc3RhbmNlb2YgYT9hLm1lcmdlKGgsYyk6aC5wdXNoKGMpfSksZVtiXT1oKTplW2JdPWN9KTtpZih2b2lkIDA9PT1kKXJldHVybiBlfTtqPWZ1bmN0aW9uKGMpe3JldHVybiJzdHJpbmciPT09YS50eXBlKGMpJiYKIWMubWF0Y2goL15fLykmJnZvaWQgMCE9PWIoKVtjXX07az1mdW5jdGlvbihhKXtyZXR1cm4gYigpW2FdLmFwcGx5KGIoKSxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSkpfTthLmZuLmZpbmVVcGxvYWRlcj1mdW5jdGlvbihlKXtjPXRoaXM7aWYoYigpJiZqKGUpKXJldHVybiBrLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZigib2JqZWN0Ij09PXR5cGVvZiBlfHwhZSlyZXR1cm4gZC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7YS5lcnJvcigiTWV0aG9kICIrZSsiIGRvZXMgbm90IGV4aXN0IG9uIGpRdWVyeS5maW5lVXBsb2FkZXIiKTtyZXR1cm4gdGhpc319KShqUXVlcnkpOw==]]></data>
	</file>
	<file>
	  <filename>/lib/js/fineuploader/jquery.fineuploader-3.4.1.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGh0dHA6Ly9naXRodWIuY29tL1dpZGVuL2ZpbmUtdXBsb2FkZXIKICoKICogTXVsdGlwbGUgZmlsZSB1cGxvYWQgY29tcG9uZW50IHdpdGggcHJvZ3Jlc3MtYmFyLCBkcmFnLWFuZC1kcm9wLCBzdXBwb3J0IGZvciBhbGwgbW9kZXJuIGJyb3dzZXJzLgogKgogKiBDb3B5cmlnaHQgwqkgMjAxMywgV2lkZW4gRW50ZXJwcmlzZXMgaW5mb0BmaW5ldXBvYWRlci5jb20KICoKICogTGljZW5zZWQgdW5kZXIgR05VIEdQTCB2Mywgc2VlIGxpY2Vuc2UudHh0LgogKi8KLypnbG9iYWxzIHdpbmRvdywgbmF2aWdhdG9yLCBkb2N1bWVudCwgRm9ybURhdGEsIEZpbGUsIEhUTUxJbnB1dEVsZW1lbnQsIFhNTEh0dHBSZXF1ZXN0LCBCbG9iKi8KdmFyIHFxID0gZnVuY3Rpb24oZWxlbWVudCkgewogICAgInVzZSBzdHJpY3QiOwoKICAgIHJldHVybiB7CiAgICAgICAgaGlkZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqIFJldHVybnMgdGhlIGZ1bmN0aW9uIHdoaWNoIGRldGFjaGVzIGF0dGFjaGVkIGV2ZW50ICovCiAgICAgICAgYXR0YWNoOiBmdW5jdGlvbih0eXBlLCBmbikgewogICAgICAgICAgICBpZiAoZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKXsKICAgICAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBmbiwgZmFsc2UpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuYXR0YWNoRXZlbnQpewogICAgICAgICAgICAgICAgZWxlbWVudC5hdHRhY2hFdmVudCgnb24nICsgdHlwZSwgZm4pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHFxKGVsZW1lbnQpLmRldGFjaCh0eXBlLCBmbik7CiAgICAgICAgICAgIH07CiAgICAgICAgfSwKCiAgICAgICAgZGV0YWNoOiBmdW5jdGlvbih0eXBlLCBmbikgewogICAgICAgICAgICBpZiAoZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKXsKICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBmbiwgZmFsc2UpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuYXR0YWNoRXZlbnQpewogICAgICAgICAgICAgICAgZWxlbWVudC5kZXRhY2hFdmVudCgnb24nICsgdHlwZSwgZm4pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0sCgogICAgICAgIGNvbnRhaW5zOiBmdW5jdGlvbihkZXNjZW5kYW50KSB7CiAgICAgICAgICAgIC8vIGNvbXBhcmVwb3NpdGlvbiByZXR1cm5zIGZhbHNlIGluIHRoaXMgY2FzZQogICAgICAgICAgICBpZiAoZWxlbWVudCA9PT0gZGVzY2VuZGFudCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlbGVtZW50LmNvbnRhaW5zKXsKICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmNvbnRhaW5zKGRlc2NlbmRhbnQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLypqc2xpbnQgYml0d2lzZTogdHJ1ZSovCiAgICAgICAgICAgICAgICByZXR1cm4gISEoZGVzY2VuZGFudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihlbGVtZW50KSAmIDgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSW5zZXJ0IHRoaXMgZWxlbWVudCBiZWZvcmUgZWxlbWVudEIuCiAgICAgICAgICovCiAgICAgICAgaW5zZXJ0QmVmb3JlOiBmdW5jdGlvbihlbGVtZW50QikgewogICAgICAgICAgICBlbGVtZW50Qi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlbGVtZW50LCBlbGVtZW50Qik7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0sCgogICAgICAgIHJlbW92ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtZW50KTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyBzdHlsZXMgZm9yIGFuIGVsZW1lbnQuCiAgICAgICAgICogRml4ZXMgb3BhY2l0eSBpbiBJRTYtOC4KICAgICAgICAgKi8KICAgICAgICBjc3M6IGZ1bmN0aW9uKHN0eWxlcykgewogICAgICAgICAgICBpZiAoc3R5bGVzLm9wYWNpdHkgIT09IG51bGwpewogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50LnN0eWxlLm9wYWNpdHkgIT09ICdzdHJpbmcnICYmIHR5cGVvZihlbGVtZW50LmZpbHRlcnMpICE9PSAndW5kZWZpbmVkJyl7CiAgICAgICAgICAgICAgICAgICAgc3R5bGVzLmZpbHRlciA9ICdhbHBoYShvcGFjaXR5PScgKyBNYXRoLnJvdW5kKDEwMCAqIHN0eWxlcy5vcGFjaXR5KSArICcpJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBxcS5leHRlbmQoZWxlbWVudC5zdHlsZSwgc3R5bGVzKTsKCiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0sCgogICAgICAgIGhhc0NsYXNzOiBmdW5jdGlvbihuYW1lKSB7CiAgICAgICAgICAgIHZhciByZSA9IG5ldyBSZWdFeHAoJyhefCApJyArIG5hbWUgKyAnKCB8JCknKTsKICAgICAgICAgICAgcmV0dXJuIHJlLnRlc3QoZWxlbWVudC5jbGFzc05hbWUpOwogICAgICAgIH0sCgogICAgICAgIGFkZENsYXNzOiBmdW5jdGlvbihuYW1lKSB7CiAgICAgICAgICAgIGlmICghcXEoZWxlbWVudCkuaGFzQ2xhc3MobmFtZSkpewogICAgICAgICAgICAgICAgZWxlbWVudC5jbGFzc05hbWUgKz0gJyAnICsgbmFtZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9LAoKICAgICAgICByZW1vdmVDbGFzczogZnVuY3Rpb24obmFtZSkgewogICAgICAgICAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKCcoXnwgKScgKyBuYW1lICsgJyggfCQpJyk7CiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gZWxlbWVudC5jbGFzc05hbWUucmVwbGFjZShyZSwgJyAnKS5yZXBsYWNlKC9eXHMrfFxzKyQvZywgIiIpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9LAoKICAgICAgICBnZXRCeUNsYXNzOiBmdW5jdGlvbihjbGFzc05hbWUpIHsKICAgICAgICAgICAgdmFyIGNhbmRpZGF0ZXMsCiAgICAgICAgICAgICAgICByZXN1bHQgPSBbXTsKCiAgICAgICAgICAgIGlmIChlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwpewogICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLicgKyBjbGFzc05hbWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjYW5kaWRhdGVzID0gZWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOwoKICAgICAgICAgICAgcXEuZWFjaChjYW5kaWRhdGVzLCBmdW5jdGlvbihpZHgsIHZhbCkgewogICAgICAgICAgICAgICAgaWYgKHFxKHZhbCkuaGFzQ2xhc3MoY2xhc3NOYW1lKSl7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godmFsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSwKCiAgICAgICAgY2hpbGRyZW46IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgY2hpbGRyZW4gPSBbXSwKICAgICAgICAgICAgICAgIGNoaWxkID0gZWxlbWVudC5maXJzdENoaWxkOwoKICAgICAgICAgICAgd2hpbGUgKGNoaWxkKXsKICAgICAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PT0gMSl7CiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChjaGlsZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjaGlsZCA9IGNoaWxkLm5leHRTaWJsaW5nOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gY2hpbGRyZW47CiAgICAgICAgfSwKCiAgICAgICAgc2V0VGV4dDogZnVuY3Rpb24odGV4dCkgewogICAgICAgICAgICBlbGVtZW50LmlubmVyVGV4dCA9IHRleHQ7CiAgICAgICAgICAgIGVsZW1lbnQudGV4dENvbnRlbnQgPSB0ZXh0OwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9LAoKICAgICAgICBjbGVhclRleHQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gcXEoZWxlbWVudCkuc2V0VGV4dCgiIik7CiAgICAgICAgfQogICAgfTsKfTsKCnFxLmxvZyA9IGZ1bmN0aW9uKG1lc3NhZ2UsIGxldmVsKSB7CiAgICAidXNlIHN0cmljdCI7CgogICAgaWYgKHdpbmRvdy5jb25zb2xlKSB7CiAgICAgICAgaWYgKCFsZXZlbCB8fCBsZXZlbCA9PT0gJ2luZm8nKSB7CiAgICAgICAgICAgIHdpbmRvdy5jb25zb2xlLmxvZyhtZXNzYWdlKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHdpbmRvdy5jb25zb2xlW2xldmVsXSkgewogICAgICAgICAgICAgICAgd2luZG93LmNvbnNvbGVbbGV2ZWxdKG1lc3NhZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgd2luZG93LmNvbnNvbGUubG9nKCc8JyArIGxldmVsICsgJz4gJyArIG1lc3NhZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9OwoKcXEuaXNPYmplY3QgPSBmdW5jdGlvbih2YXJpYWJsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgcmV0dXJuIHZhcmlhYmxlICE9PSBudWxsICYmIHZhcmlhYmxlICYmIHR5cGVvZih2YXJpYWJsZSkgPT09ICJvYmplY3QiICYmIHZhcmlhYmxlLmNvbnN0cnVjdG9yID09PSBPYmplY3Q7Cn07CgpxcS5pc0Z1bmN0aW9uID0gZnVuY3Rpb24odmFyaWFibGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHJldHVybiB0eXBlb2YodmFyaWFibGUpID09PSAiZnVuY3Rpb24iOwp9OwoKcXEuaXNTdHJpbmcgPSBmdW5jdGlvbihtYXliZVN0cmluZykgewogICAgInVzZSBzdHJpY3QiOwogICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChtYXliZVN0cmluZykgPT09ICdbb2JqZWN0IFN0cmluZ10nOwp9OwoKcXEudHJpbVN0ciA9IGZ1bmN0aW9uKHN0cmluZykgewogICAgaWYgKFN0cmluZy5wcm90b3R5cGUudHJpbSkgewogICAgICAgIHJldHVybiBzdHJpbmcudHJpbSgpOwogICAgfQoKICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvXlxzK3xccyskL2csJycpOwp9OwoKcXEuaXNGaWxlT3JJbnB1dCA9IGZ1bmN0aW9uKG1heWJlRmlsZU9ySW5wdXQpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIGlmIChxcS5pc0Jsb2IobWF5YmVGaWxlT3JJbnB1dCkgJiYgd2luZG93LkZpbGUgJiYgbWF5YmVGaWxlT3JJbnB1dCBpbnN0YW5jZW9mIEZpbGUpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGVsc2UgaWYgKHdpbmRvdy5IVE1MSW5wdXRFbGVtZW50KSB7CiAgICAgICAgaWYgKG1heWJlRmlsZU9ySW5wdXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50KSB7CiAgICAgICAgICAgIGlmIChtYXliZUZpbGVPcklucHV0LnR5cGUgJiYgbWF5YmVGaWxlT3JJbnB1dC50eXBlLnRvTG93ZXJDYXNlKCkgPT09ICdmaWxlJykgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmIChtYXliZUZpbGVPcklucHV0LnRhZ05hbWUpIHsKICAgICAgICBpZiAobWF5YmVGaWxlT3JJbnB1dC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpbnB1dCcpIHsKICAgICAgICAgICAgaWYgKG1heWJlRmlsZU9ySW5wdXQudHlwZSAmJiBtYXliZUZpbGVPcklucHV0LnR5cGUudG9Mb3dlckNhc2UoKSA9PT0gJ2ZpbGUnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gZmFsc2U7Cn07CgpxcS5pc0Jsb2IgPSBmdW5jdGlvbihtYXliZUJsb2IpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHJldHVybiB3aW5kb3cuQmxvYiAmJiBtYXliZUJsb2IgaW5zdGFuY2VvZiBCbG9iOwp9OwoKcXEuaXNYaHJVcGxvYWRTdXBwb3J0ZWQgPSBmdW5jdGlvbigpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7CiAgICBpbnB1dC50eXBlID0gJ2ZpbGUnOwoKICAgIHJldHVybiAoCiAgICAgICAgaW5wdXQubXVsdGlwbGUgIT09IHVuZGVmaW5lZCAmJgogICAgICAgICAgICB0eXBlb2YgRmlsZSAhPT0gInVuZGVmaW5lZCIgJiYKICAgICAgICAgICAgdHlwZW9mIEZvcm1EYXRhICE9PSAidW5kZWZpbmVkIiAmJgogICAgICAgICAgICB0eXBlb2YgKG5ldyBYTUxIdHRwUmVxdWVzdCgpKS51cGxvYWQgIT09ICJ1bmRlZmluZWQiICk7Cn07CgpxcS5pc0ZvbGRlckRyb3BTdXBwb3J0ZWQgPSBmdW5jdGlvbihkYXRhVHJhbnNmZXIpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHJldHVybiAoZGF0YVRyYW5zZmVyLml0ZW1zICYmIGRhdGFUcmFuc2Zlci5pdGVtc1swXS53ZWJraXRHZXRBc0VudHJ5KTsKfTsKCnFxLmlzRmlsZUNodW5raW5nU3VwcG9ydGVkID0gZnVuY3Rpb24oKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICByZXR1cm4gIXFxLmFuZHJvaWQoKSAmJiAvL2FuZHJvaWQncyBpbXBsIG9mIEJsb2Iuc2xpY2UgaXMgYnJva2VuCiAgICAgICAgcXEuaXNYaHJVcGxvYWRTdXBwb3J0ZWQoKSAmJgogICAgICAgIChGaWxlLnByb3RvdHlwZS5zbGljZSB8fCBGaWxlLnByb3RvdHlwZS53ZWJraXRTbGljZSB8fCBGaWxlLnByb3RvdHlwZS5tb3pTbGljZSk7Cn07CgpxcS5leHRlbmQgPSBmdW5jdGlvbiAoZmlyc3QsIHNlY29uZCwgZXh0ZW5kTmVzdGVkKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBxcS5lYWNoKHNlY29uZCwgZnVuY3Rpb24ocHJvcCwgdmFsKSB7CiAgICAgICAgaWYgKGV4dGVuZE5lc3RlZCAmJiBxcS5pc09iamVjdCh2YWwpKSB7CiAgICAgICAgICAgIGlmIChmaXJzdFtwcm9wXSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBmaXJzdFtwcm9wXSA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHFxLmV4dGVuZChmaXJzdFtwcm9wXSwgdmFsLCB0cnVlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGZpcnN0W3Byb3BdID0gdmFsOwogICAgICAgIH0KICAgIH0pOwp9OwoKLyoqCiAqIFNlYXJjaGVzIGZvciBhIGdpdmVuIGVsZW1lbnQgaW4gdGhlIGFycmF5LCByZXR1cm5zIC0xIGlmIGl0IGlzIG5vdCBwcmVzZW50LgogKiBAcGFyYW0ge051bWJlcn0gW2Zyb21dIFRoZSBpbmRleCBhdCB3aGljaCB0byBiZWdpbiB0aGUgc2VhcmNoCiAqLwpxcS5pbmRleE9mID0gZnVuY3Rpb24oYXJyLCBlbHQsIGZyb20pewogICAgInVzZSBzdHJpY3QiOwoKICAgIGlmIChhcnIuaW5kZXhPZikgewogICAgICAgIHJldHVybiBhcnIuaW5kZXhPZihlbHQsIGZyb20pOwogICAgfQoKICAgIGZyb20gPSBmcm9tIHx8IDA7CiAgICB2YXIgbGVuID0gYXJyLmxlbmd0aDsKCiAgICBpZiAoZnJvbSA8IDApIHsKICAgICAgICBmcm9tICs9IGxlbjsKICAgIH0KCiAgICBmb3IgKDsgZnJvbSA8IGxlbjsgZnJvbSs9MSl7CiAgICAgICAgaWYgKGFyci5oYXNPd25Qcm9wZXJ0eShmcm9tKSAmJiBhcnJbZnJvbV0gPT09IGVsdCl7CiAgICAgICAgICAgIHJldHVybiBmcm9tOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAtMTsKfTsKCi8vdGhpcyBpcyBhIHZlcnNpb24gNCBVVUlECnFxLmdldFVuaXF1ZUlkID0gZnVuY3Rpb24oKXsKICAgICJ1c2Ugc3RyaWN0IjsKCiAgICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbihjKSB7CiAgICAgICAgLypqc2xpbnQgZXFlcTogdHJ1ZSwgYml0d2lzZTogdHJ1ZSovCiAgICAgICAgdmFyIHIgPSBNYXRoLnJhbmRvbSgpKjE2fDAsIHYgPSBjID09ICd4JyA/IHIgOiAociYweDN8MHg4KTsKICAgICAgICByZXR1cm4gdi50b1N0cmluZygxNik7CiAgICB9KTsKfTsKCi8vCi8vIEJyb3dzZXJzIGFuZCBwbGF0Zm9ybXMgZGV0ZWN0aW9uCgpxcS5pZSAgICAgICA9IGZ1bmN0aW9uKCl7CiAgICAidXNlIHN0cmljdCI7CiAgICByZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdNU0lFJykgIT09IC0xOwp9OwpxcS5pZTEwICAgICA9IGZ1bmN0aW9uKCl7CiAgICAidXNlIHN0cmljdCI7CiAgICByZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdNU0lFIDEwJykgIT09IC0xOwp9OwpxcS5zYWZhcmkgICA9IGZ1bmN0aW9uKCl7CiAgICAidXNlIHN0cmljdCI7CiAgICByZXR1cm4gbmF2aWdhdG9yLnZlbmRvciAhPT0gdW5kZWZpbmVkICYmIG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKSAhPT0gLTE7Cn07CnFxLmNocm9tZSAgID0gZnVuY3Rpb24oKXsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHJldHVybiBuYXZpZ2F0b3IudmVuZG9yICE9PSB1bmRlZmluZWQgJiYgbmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCdHb29nbGUnKSAhPT0gLTE7Cn07CnFxLmZpcmVmb3ggID0gZnVuY3Rpb24oKXsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHJldHVybiAobmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdNb3ppbGxhJykgIT09IC0xICYmIG5hdmlnYXRvci52ZW5kb3IgIT09IHVuZGVmaW5lZCAmJiBuYXZpZ2F0b3IudmVuZG9yID09PSAnJyk7Cn07CnFxLndpbmRvd3MgID0gZnVuY3Rpb24oKXsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHJldHVybiBuYXZpZ2F0b3IucGxhdGZvcm0gPT09ICJXaW4zMiI7Cn07CnFxLmFuZHJvaWQgPSBmdW5jdGlvbigpewogICAgInVzZSBzdHJpY3QiOwogICAgcmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdhbmRyb2lkJykgIT09IC0xOwp9OwoKLy8KLy8gRXZlbnRzCgpxcS5wcmV2ZW50RGVmYXVsdCA9IGZ1bmN0aW9uKGUpewogICAgInVzZSBzdHJpY3QiOwogICAgaWYgKGUucHJldmVudERlZmF1bHQpewogICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgIH0gZWxzZXsKICAgICAgICBlLnJldHVyblZhbHVlID0gZmFsc2U7CiAgICB9Cn07CgovKioKICogQ3JlYXRlcyBhbmQgcmV0dXJucyBlbGVtZW50IGZyb20gaHRtbCBzdHJpbmcKICogVXNlcyBpbm5lckhUTUwgdG8gY3JlYXRlIGFuIGVsZW1lbnQKICovCnFxLnRvRWxlbWVudCA9IChmdW5jdGlvbigpewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgcmV0dXJuIGZ1bmN0aW9uKGh0bWwpewogICAgICAgIGRpdi5pbm5lckhUTUwgPSBodG1sOwogICAgICAgIHZhciBlbGVtZW50ID0gZGl2LmZpcnN0Q2hpbGQ7CiAgICAgICAgZGl2LnJlbW92ZUNoaWxkKGVsZW1lbnQpOwogICAgICAgIHJldHVybiBlbGVtZW50OwogICAgfTsKfSgpKTsKCi8va2V5IGFuZCB2YWx1ZSBhcmUgcGFzc2VkIHRvIGNhbGxiYWNrIGZvciBlYWNoIGl0ZW0gaW4gdGhlIG9iamVjdCBvciBhcnJheQpxcS5lYWNoID0gZnVuY3Rpb24ob2JqLCBjYWxsYmFjaykgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIGtleSwgcmV0VmFsOwogICAgaWYgKG9iaikgewogICAgICAgIGZvciAoa2V5IGluIG9iaikgewogICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgewogICAgICAgICAgICAgICAgcmV0VmFsID0gY2FsbGJhY2soa2V5LCBvYmpba2V5XSk7CiAgICAgICAgICAgICAgICBpZiAocmV0VmFsID09PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9OwoKLyoqCiAqIG9iajJ1cmwoKSB0YWtlcyBhIGpzb24tb2JqZWN0IGFzIGFyZ3VtZW50IGFuZCBnZW5lcmF0ZXMKICogYSBxdWVyeXN0cmluZy4gcHJldHR5IG11Y2ggbGlrZSBqUXVlcnkucGFyYW0oKQogKgogKiBob3cgdG8gdXNlOgogKgogKiAgICBgcXEub2JqMnVybCh7YTonYicsYzonZCd9LCdodHRwOi8vYW55LnVybC91cGxvYWQ/b3RoZXJQYXJhbT12YWx1ZScpO2AKICoKICogd2lsbCByZXN1bHQgaW46CiAqCiAqICAgIGBodHRwOi8vYW55LnVybC91cGxvYWQ/b3RoZXJQYXJhbT12YWx1ZSZhPWImYz1kYAogKgogKiBAcGFyYW0gIE9iamVjdCBKU09OLU9iamVjdAogKiBAcGFyYW0gIFN0cmluZyBjdXJyZW50IHF1ZXJ5c3RyaW5nLXBhcnQKICogQHJldHVybiBTdHJpbmcgZW5jb2RlZCBxdWVyeXN0cmluZwogKi8KcXEub2JqMnVybCA9IGZ1bmN0aW9uKG9iaiwgdGVtcCwgcHJlZml4RG9uZSl7CiAgICAidXNlIHN0cmljdCI7CiAgICAvKmpzaGludCBsYXhicmVhazogdHJ1ZSovCiAgICAgdmFyIGksIGxlbiwKICAgICAgICAgdXJpc3RyaW5ncyA9IFtdLAogICAgICAgICBwcmVmaXggPSAnJicsCiAgICAgICAgIGFkZCA9IGZ1bmN0aW9uKG5leHRPYmosIGkpewogICAgICAgICAgICB2YXIgbmV4dFRlbXAgPSB0ZW1wCiAgICAgICAgICAgICAgICA/ICgvXFtcXSQvLnRlc3QodGVtcCkpIC8vIHByZXZlbnQgZG91YmxlLWVuY29kaW5nCiAgICAgICAgICAgICAgICA/IHRlbXAKICAgICAgICAgICAgICAgIDogdGVtcCsnWycraSsnXScKICAgICAgICAgICAgICAgIDogaTsKICAgICAgICAgICAgaWYgKChuZXh0VGVtcCAhPT0gJ3VuZGVmaW5lZCcpICYmIChpICE9PSAndW5kZWZpbmVkJykpIHsKICAgICAgICAgICAgICAgIHVyaXN0cmluZ3MucHVzaCgKICAgICAgICAgICAgICAgICAgICAodHlwZW9mIG5leHRPYmogPT09ICdvYmplY3QnKQogICAgICAgICAgICAgICAgICAgICAgICA/IHFxLm9iajJ1cmwobmV4dE9iaiwgbmV4dFRlbXAsIHRydWUpCiAgICAgICAgICAgICAgICAgICAgICAgIDogKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuZXh0T2JqKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJykKICAgICAgICAgICAgICAgICAgICAgICAgPyBlbmNvZGVVUklDb21wb25lbnQobmV4dFRlbXApICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KG5leHRPYmooKSkKICAgICAgICAgICAgICAgICAgICAgICAgOiBlbmNvZGVVUklDb21wb25lbnQobmV4dFRlbXApICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KG5leHRPYmopCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICBpZiAoIXByZWZpeERvbmUgJiYgdGVtcCkgewogICAgICAgIHByZWZpeCA9ICgvXD8vLnRlc3QodGVtcCkpID8gKC9cPyQvLnRlc3QodGVtcCkpID8gJycgOiAnJicgOiAnPyc7CiAgICAgICAgdXJpc3RyaW5ncy5wdXNoKHRlbXApOwogICAgICAgIHVyaXN0cmluZ3MucHVzaChxcS5vYmoydXJsKG9iaikpOwogICAgfSBlbHNlIGlmICgoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0IEFycmF5XScpICYmICh0eXBlb2Ygb2JqICE9PSAndW5kZWZpbmVkJykgKSB7CiAgICAgICAgLy8gd2Ugd29udCB1c2UgYSBmb3ItaW4tbG9vcCBvbiBhbiBhcnJheSAocGVyZm9ybWFuY2UpCiAgICAgICAgZm9yIChpID0gLTEsIGxlbiA9IG9iai5sZW5ndGg7IGkgPCBsZW47IGkrPTEpewogICAgICAgICAgICBhZGQob2JqW2ldLCBpKTsKICAgICAgICB9CiAgICB9IGVsc2UgaWYgKCh0eXBlb2Ygb2JqICE9PSAndW5kZWZpbmVkJykgJiYgKG9iaiAhPT0gbnVsbCkgJiYgKHR5cGVvZiBvYmogPT09ICJvYmplY3QiKSl7CiAgICAgICAgLy8gZm9yIGFueXRoaW5nIGVsc2UgYnV0IGEgc2NhbGFyLCB3ZSB3aWxsIHVzZSBmb3ItaW4tbG9vcAogICAgICAgIGZvciAoaSBpbiBvYmopewogICAgICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGkpKSB7CiAgICAgICAgICAgICAgICBhZGQob2JqW2ldLCBpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgdXJpc3RyaW5ncy5wdXNoKGVuY29kZVVSSUNvbXBvbmVudCh0ZW1wKSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudChvYmopKTsKICAgIH0KCiAgICBpZiAodGVtcCkgewogICAgICAgIHJldHVybiB1cmlzdHJpbmdzLmpvaW4ocHJlZml4KTsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHVyaXN0cmluZ3Muam9pbihwcmVmaXgpCiAgICAgICAgICAgIC5yZXBsYWNlKC9eJi8sICcnKQogICAgICAgICAgICAucmVwbGFjZSgvJTIwL2csICcrJyk7CiAgICB9Cn07CgpxcS5vYmoyRm9ybURhdGEgPSBmdW5jdGlvbihvYmosIGZvcm1EYXRhLCBhcnJheUtleU5hbWUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIGlmICghZm9ybURhdGEpIHsKICAgICAgICBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOwogICAgfQoKICAgIHFxLmVhY2gob2JqLCBmdW5jdGlvbihrZXksIHZhbCkgewogICAgICAgIGtleSA9IGFycmF5S2V5TmFtZSA/IGFycmF5S2V5TmFtZSArICdbJyArIGtleSArICddJyA6IGtleTsKCiAgICAgICAgaWYgKHFxLmlzT2JqZWN0KHZhbCkpIHsKICAgICAgICAgICAgcXEub2JqMkZvcm1EYXRhKHZhbCwgZm9ybURhdGEsIGtleSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHFxLmlzRnVuY3Rpb24odmFsKSkgewogICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCB2YWwoKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCB2YWwpOwogICAgICAgIH0KICAgIH0pOwoKICAgIHJldHVybiBmb3JtRGF0YTsKfTsKCnFxLm9iajJJbnB1dHMgPSBmdW5jdGlvbihvYmosIGZvcm0pIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBpbnB1dDsKCiAgICBpZiAoIWZvcm0pIHsKICAgICAgICBmb3JtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZm9ybScpOwogICAgfQoKICAgIHFxLm9iajJGb3JtRGF0YShvYmosIHsKICAgICAgICBhcHBlbmQ6IGZ1bmN0aW9uKGtleSwgdmFsKSB7CiAgICAgICAgICAgIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTsKICAgICAgICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKCduYW1lJywga2V5KTsKICAgICAgICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKCd2YWx1ZScsIHZhbCk7CiAgICAgICAgICAgIGZvcm0uYXBwZW5kQ2hpbGQoaW5wdXQpOwogICAgICAgIH0KICAgIH0pOwoKICAgIHJldHVybiBmb3JtOwp9OwoKcXEuc2V0Q29va2llID0gZnVuY3Rpb24obmFtZSwgdmFsdWUsIGRheXMpIHsKICAgIHZhciBkYXRlID0gbmV3IERhdGUoKSwKICAgICAgICBleHBpcmVzID0gIiI7CgoJaWYgKGRheXMpIHsKCQlkYXRlLnNldFRpbWUoZGF0ZS5nZXRUaW1lKCkrKGRheXMqMjQqNjAqNjAqMTAwMCkpOwoJCWV4cGlyZXMgPSAiOyBleHBpcmVzPSIrZGF0ZS50b0dNVFN0cmluZygpOwoJfQoKCWRvY3VtZW50LmNvb2tpZSA9IG5hbWUrIj0iK3ZhbHVlK2V4cGlyZXMrIjsgcGF0aD0vIjsKfTsKCnFxLmdldENvb2tpZSA9IGZ1bmN0aW9uKG5hbWUpIHsKCXZhciBuYW1lRVEgPSBuYW1lICsgIj0iLAogICAgICAgIGNhID0gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7JyksCiAgICAgICAgYzsKCglmb3IodmFyIGk9MDtpIDwgY2EubGVuZ3RoO2krKykgewoJCWMgPSBjYVtpXTsKCQl3aGlsZSAoYy5jaGFyQXQoMCk9PScgJykgewogICAgICAgICAgICBjID0gYy5zdWJzdHJpbmcoMSxjLmxlbmd0aCk7CiAgICAgICAgfQoJCWlmIChjLmluZGV4T2YobmFtZUVRKSA9PT0gMCkgewogICAgICAgICAgICByZXR1cm4gYy5zdWJzdHJpbmcobmFtZUVRLmxlbmd0aCxjLmxlbmd0aCk7CiAgICAgICAgfQoJfQp9OwoKcXEuZ2V0Q29va2llTmFtZXMgPSBmdW5jdGlvbihyZWdleHApIHsKICAgIHZhciBjb29raWVzID0gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7JyksCiAgICAgICAgY29va2llTmFtZXMgPSBbXTsKCiAgICBxcS5lYWNoKGNvb2tpZXMsIGZ1bmN0aW9uKGlkeCwgY29va2llKSB7CiAgICAgICAgY29va2llID0gcXEudHJpbVN0cihjb29raWUpOwoKICAgICAgICB2YXIgZXF1YWxzSWR4ID0gY29va2llLmluZGV4T2YoIj0iKTsKCiAgICAgICAgaWYgKGNvb2tpZS5tYXRjaChyZWdleHApKSB7CiAgICAgICAgICAgIGNvb2tpZU5hbWVzLnB1c2goY29va2llLnN1YnN0cigwLCBlcXVhbHNJZHgpKTsKICAgICAgICB9CiAgICB9KTsKCiAgICByZXR1cm4gY29va2llTmFtZXM7Cn07CgpxcS5kZWxldGVDb29raWUgPSBmdW5jdGlvbihuYW1lKSB7CglxcS5zZXRDb29raWUobmFtZSwgIiIsIC0xKTsKfTsKCnFxLmFyZUNvb2tpZXNFbmFibGVkID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgcmFuZE51bSA9IE1hdGgucmFuZG9tKCkgKiAxMDAwMDAsCiAgICAgICAgbmFtZSA9ICJxcUNvb2tpZVRlc3Q6IiArIHJhbmROdW07CiAgICBxcS5zZXRDb29raWUobmFtZSwgMSk7CgogICAgaWYgKHFxLmdldENvb2tpZShuYW1lKSkgewogICAgICAgIHFxLmRlbGV0ZUNvb2tpZShuYW1lKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKfTsKCi8qKgogKiBOb3QgcmVjb21tZW5kZWQgZm9yIHVzZSBvdXRzaWRlIG9mIEZpbmUgVXBsb2FkZXIgc2luY2UgdGhpcyBmYWxscyBiYWNrIHRvIGFuIHVuY2hlY2tlZCBldmFsIGlmIEpTT04ucGFyc2UgaXMgbm90CiAqIGltcGxlbWVudGVkLiAgRm9yIGEgbW9yZSBzZWN1cmUgSlNPTi5wYXJzZSBwb2x5ZmlsbCwgdXNlIERvdWdsYXMgQ3JvY2tmb3JkJ3MganNvbjIuanMuCiAqLwpxcS5wYXJzZUpzb24gPSBmdW5jdGlvbihqc29uKSB7CiAgICAvKmpzaGludCBldmlsOiB0cnVlKi8KICAgIGlmICh3aW5kb3cuSlNPTiAmJiBxcS5pc0Z1bmN0aW9uKEpTT04ucGFyc2UpKSB7CiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoanNvbik7CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBldmFsKCIoIiArIGpzb24gKyAiKSIpOwogICAgfQp9OwoKLyoqCiAqIEEgZ2VuZXJpYyBtb2R1bGUgd2hpY2ggc3VwcG9ydHMgb2JqZWN0IGRpc3Bvc2luZyBpbiBkaXNwb3NlKCkgbWV0aG9kLgogKiAqLwpxcS5EaXNwb3NlU3VwcG9ydCA9IGZ1bmN0aW9uKCkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIGRpc3Bvc2VycyA9IFtdOwoKICAgIHJldHVybiB7CiAgICAgICAgLyoqIFJ1biBhbGwgcmVnaXN0ZXJlZCBkaXNwb3NlcnMgKi8KICAgICAgICBkaXNwb3NlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGRpc3Bvc2VyOwogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICBkaXNwb3NlciA9IGRpc3Bvc2Vycy5zaGlmdCgpOwogICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2VyKSB7CiAgICAgICAgICAgICAgICAgICAgZGlzcG9zZXIoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB3aGlsZSAoZGlzcG9zZXIpOwogICAgICAgIH0sCgogICAgICAgIC8qKiBBdHRhY2ggZXZlbnQgaGFuZGxlciBhbmQgcmVnaXN0ZXIgZGUtYXR0YWNoZXIgYXMgYSBkaXNwb3NlciAqLwogICAgICAgIGF0dGFjaDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzOwogICAgICAgICAgICAvKmpzbGludCB1bmRlZjp0cnVlKi8KICAgICAgICAgICAgdGhpcy5hZGREaXNwb3NlcihxcShhcmdzWzBdKS5hdHRhY2guYXBwbHkodGhpcywgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSkpOwogICAgICAgIH0sCgogICAgICAgIC8qKiBBZGQgZGlzcG9zZXIgdG8gdGhlIGNvbGxlY3Rpb24gKi8KICAgICAgICBhZGREaXNwb3NlcjogZnVuY3Rpb24oZGlzcG9zZUZ1bmN0aW9uKSB7CiAgICAgICAgICAgIGRpc3Bvc2Vycy5wdXNoKGRpc3Bvc2VGdW5jdGlvbik7CiAgICAgICAgfQogICAgfTsKfTsKLypnbG9iYWxzIHFxKi8KcXEuUHJvbWlzZSA9IGZ1bmN0aW9uKCkgewogICAgInVzZSBzdHJpY3QiOwoKICAgIHZhciBzdWNjZXNzVmFsdWUsIGZhaWx1cmVWYWx1ZSwKICAgICAgICBzdWNjZXNzQ2FsbGJhY2ssIGZhaWx1cmVDYWxsYmFjaywKICAgICAgICBzdGF0ZSA9IDA7CgogICAgcmV0dXJuIHsKICAgICAgICB0aGVuOiBmdW5jdGlvbihvblN1Y2Nlc3MsIG9uRmFpbHVyZSkgewogICAgICAgICAgICBpZiAoc3RhdGUgPT09IDApIHsKICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjayA9IG9uU3VjY2VzczsKICAgICAgICAgICAgICAgIGZhaWx1cmVDYWxsYmFjayA9IG9uRmFpbHVyZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChzdGF0ZSA9PT0gLTEgJiYgb25GYWlsdXJlKSB7CiAgICAgICAgICAgICAgICBvbkZhaWx1cmUoZmFpbHVyZVZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChvblN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgIG9uU3VjY2VzcyhzdWNjZXNzVmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgc3VjY2VzczogZnVuY3Rpb24odmFsKSB7CiAgICAgICAgICAgIHN0YXRlID0gMTsKICAgICAgICAgICAgc3VjY2Vzc1ZhbHVlID0gdmFsOwoKICAgICAgICAgICAgaWYgKHN1Y2Nlc3NDYWxsYmFjaykgewogICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKHZhbCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0sCgogICAgICAgIGZhaWx1cmU6IGZ1bmN0aW9uKHZhbCkgewogICAgICAgICAgICBzdGF0ZSA9IC0xOwogICAgICAgICAgICBmYWlsdXJlVmFsdWUgPSB2YWw7CgogICAgICAgICAgICBpZiAoZmFpbHVyZUNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICBmYWlsdXJlQ2FsbGJhY2sodmFsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfQogICAgfTsKfTsKLypnbG9iYWxzIHFxKi8KcXEuVXBsb2FkQnV0dG9uID0gZnVuY3Rpb24obykgewogICAgInVzZSBzdHJpY3QiOwoKICAgIHZhciBpbnB1dCwKICAgICAgICBkaXNwb3NlU3VwcG9ydCA9IG5ldyBxcS5EaXNwb3NlU3VwcG9ydCgpLAogICAgICAgIG9wdGlvbnMgPSB7CiAgICAgICAgICAgIGVsZW1lbnQ6IG51bGwsCiAgICAgICAgICAgIC8vIGlmIHNldCB0byB0cnVlIGFkZHMgbXVsdGlwbGUgYXR0cmlidXRlIHRvIGZpbGUgaW5wdXQKICAgICAgICAgICAgbXVsdGlwbGU6IGZhbHNlLAogICAgICAgICAgICBhY2NlcHRGaWxlczogbnVsbCwKICAgICAgICAgICAgLy8gbmFtZSBhdHRyaWJ1dGUgb2YgZmlsZSBpbnB1dAogICAgICAgICAgICBuYW1lOiAnZmlsZScsCiAgICAgICAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbihpbnB1dCkge30sCiAgICAgICAgICAgIGhvdmVyQ2xhc3M6ICdxcS11cGxvYWQtYnV0dG9uLWhvdmVyJywKICAgICAgICAgICAgZm9jdXNDbGFzczogJ3FxLXVwbG9hZC1idXR0b24tZm9jdXMnCiAgICAgICAgfTsKCiAgICBmdW5jdGlvbiBjcmVhdGVJbnB1dCgpIHsKICAgICAgICB2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwoKICAgICAgICBpZiAob3B0aW9ucy5tdWx0aXBsZSl7CiAgICAgICAgICAgIGlucHV0LnNldEF0dHJpYnV0ZSgibXVsdGlwbGUiLCAibXVsdGlwbGUiKTsKICAgICAgICB9CgogICAgICAgIGlmIChvcHRpb25zLmFjY2VwdEZpbGVzKSB7CiAgICAgICAgICAgIGlucHV0LnNldEF0dHJpYnV0ZSgiYWNjZXB0Iiwgb3B0aW9ucy5hY2NlcHRGaWxlcyk7CiAgICAgICAgfQoKICAgICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoInR5cGUiLCAiZmlsZSIpOwogICAgICAgIGlucHV0LnNldEF0dHJpYnV0ZSgibmFtZSIsIG9wdGlvbnMubmFtZSk7CgogICAgICAgIHFxKGlucHV0KS5jc3MoewogICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJywKICAgICAgICAgICAgLy8gaW4gT3BlcmEgb25seSAnYnJvd3NlJyBidXR0b24KICAgICAgICAgICAgLy8gaXMgY2xpY2thYmxlIGFuZCBpdCBpcyBsb2NhdGVkIGF0CiAgICAgICAgICAgIC8vIHRoZSByaWdodCBzaWRlIG9mIHRoZSBpbnB1dAogICAgICAgICAgICByaWdodDogMCwKICAgICAgICAgICAgdG9wOiAwLAogICAgICAgICAgICBmb250RmFtaWx5OiAnQXJpYWwnLAogICAgICAgICAgICAvLyA0IHBlcnNvbnMgcmVwb3J0ZWQgdGhpcywgdGhlIG1heCB2YWx1ZXMgdGhhdCB3b3JrZWQgZm9yIHRoZW0gd2VyZSAyNDMsIDIzNiwgMjM2LCAxMTgKICAgICAgICAgICAgZm9udFNpemU6ICcxMThweCcsCiAgICAgICAgICAgIG1hcmdpbjogMCwKICAgICAgICAgICAgcGFkZGluZzogMCwKICAgICAgICAgICAgY3Vyc29yOiAncG9pbnRlcicsCiAgICAgICAgICAgIG9wYWNpdHk6IDAKICAgICAgICB9KTsKCiAgICAgICAgb3B0aW9ucy5lbGVtZW50LmFwcGVuZENoaWxkKGlucHV0KTsKCiAgICAgICAgZGlzcG9zZVN1cHBvcnQuYXR0YWNoKGlucHV0LCAnY2hhbmdlJywgZnVuY3Rpb24oKXsKICAgICAgICAgICAgb3B0aW9ucy5vbkNoYW5nZShpbnB1dCk7CiAgICAgICAgfSk7CgogICAgICAgIGRpc3Bvc2VTdXBwb3J0LmF0dGFjaChpbnB1dCwgJ21vdXNlb3ZlcicsIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIHFxKG9wdGlvbnMuZWxlbWVudCkuYWRkQ2xhc3Mob3B0aW9ucy5ob3ZlckNsYXNzKTsKICAgICAgICB9KTsKICAgICAgICBkaXNwb3NlU3VwcG9ydC5hdHRhY2goaW5wdXQsICdtb3VzZW91dCcsIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIHFxKG9wdGlvbnMuZWxlbWVudCkucmVtb3ZlQ2xhc3Mob3B0aW9ucy5ob3ZlckNsYXNzKTsKICAgICAgICB9KTsKICAgICAgICBkaXNwb3NlU3VwcG9ydC5hdHRhY2goaW5wdXQsICdmb2N1cycsIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIHFxKG9wdGlvbnMuZWxlbWVudCkuYWRkQ2xhc3Mob3B0aW9ucy5mb2N1c0NsYXNzKTsKICAgICAgICB9KTsKICAgICAgICBkaXNwb3NlU3VwcG9ydC5hdHRhY2goaW5wdXQsICdibHVyJywgZnVuY3Rpb24oKXsKICAgICAgICAgICAgcXEob3B0aW9ucy5lbGVtZW50KS5yZW1vdmVDbGFzcyhvcHRpb25zLmZvY3VzQ2xhc3MpOwogICAgICAgIH0pOwoKICAgICAgICAvLyBJRSBhbmQgT3BlcmEsIHVuZm9ydHVuYXRlbHkgaGF2ZSAyIHRhYiBzdG9wcyBvbiBmaWxlIGlucHV0CiAgICAgICAgLy8gd2hpY2ggaXMgdW5hY2NlcHRhYmxlIGluIG91ciBjYXNlLCBkaXNhYmxlIGtleWJvYXJkIGFjY2VzcwogICAgICAgIGlmICh3aW5kb3cuYXR0YWNoRXZlbnQpewogICAgICAgICAgICAvLyBpdCBpcyBJRSBvciBPcGVyYQogICAgICAgICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoJ3RhYkluZGV4JywgIi0xIik7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gaW5wdXQ7CiAgICB9CgoKICAgIHFxLmV4dGVuZChvcHRpb25zLCBvKTsKCiAgICAvLyBtYWtlIGJ1dHRvbiBzdWl0YWJsZSBjb250YWluZXIgZm9yIGlucHV0CiAgICBxcShvcHRpb25zLmVsZW1lbnQpLmNzcyh7CiAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsCiAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLAogICAgICAgIC8vIE1ha2Ugc3VyZSBicm93c2UgYnV0dG9uIGlzIGluIHRoZSByaWdodCBzaWRlCiAgICAgICAgLy8gaW4gSW50ZXJuZXQgRXhwbG9yZXIKICAgICAgICBkaXJlY3Rpb246ICdsdHInCiAgICB9KTsKCiAgICBpbnB1dCA9IGNyZWF0ZUlucHV0KCk7CgogICAgcmV0dXJuIHsKICAgICAgICBnZXRJbnB1dDogZnVuY3Rpb24oKXsKICAgICAgICAgICAgcmV0dXJuIGlucHV0OwogICAgICAgIH0sCgogICAgICAgIHJlc2V0OiBmdW5jdGlvbigpewogICAgICAgICAgICBpZiAoaW5wdXQucGFyZW50Tm9kZSl7CiAgICAgICAgICAgICAgICBxcShpbnB1dCkucmVtb3ZlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHFxKG9wdGlvbnMuZWxlbWVudCkucmVtb3ZlQ2xhc3Mob3B0aW9ucy5mb2N1c0NsYXNzKTsKICAgICAgICAgICAgaW5wdXQgPSBjcmVhdGVJbnB1dCgpOwogICAgICAgIH0KICAgIH07Cn07Ci8qZ2xvYmFscyBxcSovCnFxLlBhc3RlU3VwcG9ydCA9IGZ1bmN0aW9uKG8pIHsKICAgICJ1c2Ugc3RyaWN0IjsKCiAgICB2YXIgb3B0aW9ucywgZGV0YWNoUGFzdGVIYW5kbGVyOwoKICAgIG9wdGlvbnMgPSB7CiAgICAgICAgdGFyZ2V0RWxlbWVudDogbnVsbCwKICAgICAgICBjYWxsYmFja3M6IHsKICAgICAgICAgICAgbG9nOiBmdW5jdGlvbihtZXNzYWdlLCBsZXZlbCkge30sCiAgICAgICAgICAgIHBhc3RlUmVjZWl2ZWQ6IGZ1bmN0aW9uKGJsb2IpIHt9CiAgICAgICAgfQogICAgfTsKCiAgICBmdW5jdGlvbiBpc0ltYWdlKGl0ZW0pIHsKICAgICAgICByZXR1cm4gaXRlbS50eXBlICYmCiAgICAgICAgICAgIGl0ZW0udHlwZS5pbmRleE9mKCJpbWFnZS8iKSA9PT0gMDsKICAgIH0KCiAgICBmdW5jdGlvbiByZWdpc3RlclBhc3RlSGFuZGxlcigpIHsKICAgICAgICBxcShvcHRpb25zLnRhcmdldEVsZW1lbnQpLmF0dGFjaCgicGFzdGUiLCBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgICB2YXIgY2xpcGJvYXJkRGF0YSA9IGV2ZW50LmNsaXBib2FyZERhdGE7CgogICAgICAgICAgICBpZiAoY2xpcGJvYXJkRGF0YSkgewogICAgICAgICAgICAgICAgcXEuZWFjaChjbGlwYm9hcmREYXRhLml0ZW1zLCBmdW5jdGlvbihpZHgsIGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNJbWFnZShpdGVtKSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYmxvYiA9IGl0ZW0uZ2V0QXNGaWxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY2FsbGJhY2tzLnBhc3RlUmVjZWl2ZWQoYmxvYik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiB1bnJlZ2lzdGVyUGFzdGVIYW5kbGVyKCkgewogICAgICAgIGlmIChkZXRhY2hQYXN0ZUhhbmRsZXIpIHsKICAgICAgICAgICAgZGV0YWNoUGFzdGVIYW5kbGVyKCk7CiAgICAgICAgfQogICAgfQoKICAgIHFxLmV4dGVuZChvcHRpb25zLCBvKTsKICAgIHJlZ2lzdGVyUGFzdGVIYW5kbGVyKCk7CgogICAgcmV0dXJuIHsKICAgICAgICByZXNldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHVucmVnaXN0ZXJQYXN0ZUhhbmRsZXIoKTsKICAgICAgICB9CiAgICB9Owp9OwpxcS5GaW5lVXBsb2FkZXJCYXNpYyA9IGZ1bmN0aW9uKG8pewogICAgdmFyIHRoYXQgPSB0aGlzOwogICAgdGhpcy5fb3B0aW9ucyA9IHsKICAgICAgICBkZWJ1ZzogZmFsc2UsCiAgICAgICAgYnV0dG9uOiBudWxsLAogICAgICAgIG11bHRpcGxlOiB0cnVlLAogICAgICAgIG1heENvbm5lY3Rpb25zOiAzLAogICAgICAgIGRpc2FibGVDYW5jZWxGb3JGb3JtVXBsb2FkczogZmFsc2UsCiAgICAgICAgYXV0b1VwbG9hZDogdHJ1ZSwKICAgICAgICByZXF1ZXN0OiB7CiAgICAgICAgICAgIGVuZHBvaW50OiAnL3NlcnZlci91cGxvYWQnLAogICAgICAgICAgICBwYXJhbXM6IHt9LAogICAgICAgICAgICBwYXJhbXNJbkJvZHk6IHRydWUsCiAgICAgICAgICAgIGN1c3RvbUhlYWRlcnM6IHt9LAogICAgICAgICAgICBmb3JjZU11bHRpcGFydDogdHJ1ZSwKICAgICAgICAgICAgaW5wdXROYW1lOiAncXFmaWxlJywKICAgICAgICAgICAgdXVpZE5hbWU6ICdxcXV1aWQnLAogICAgICAgICAgICB0b3RhbEZpbGVTaXplTmFtZTogJ3FxdG90YWxmaWxlc2l6ZScKICAgICAgICB9LAogICAgICAgIHZhbGlkYXRpb246IHsKICAgICAgICAgICAgYWxsb3dlZEV4dGVuc2lvbnM6IFtdLAogICAgICAgICAgICBzaXplTGltaXQ6IDAsCiAgICAgICAgICAgIG1pblNpemVMaW1pdDogMCwKICAgICAgICAgICAgaXRlbUxpbWl0OiAwLAogICAgICAgICAgICBzdG9wT25GaXJzdEludmFsaWRGaWxlOiB0cnVlCiAgICAgICAgfSwKICAgICAgICBjYWxsYmFja3M6IHsKICAgICAgICAgICAgb25TdWJtaXQ6IGZ1bmN0aW9uKGlkLCBuYW1lKXt9LAogICAgICAgICAgICBvblN1Ym1pdHRlZDogZnVuY3Rpb24oaWQsIG5hbWUpe30sCiAgICAgICAgICAgIG9uQ29tcGxldGU6IGZ1bmN0aW9uKGlkLCBuYW1lLCByZXNwb25zZUpTT04pe30sCiAgICAgICAgICAgIG9uQ2FuY2VsOiBmdW5jdGlvbihpZCwgbmFtZSl7fSwKICAgICAgICAgICAgb25VcGxvYWQ6IGZ1bmN0aW9uKGlkLCBuYW1lKXt9LAogICAgICAgICAgICBvblVwbG9hZENodW5rOiBmdW5jdGlvbihpZCwgbmFtZSwgY2h1bmtEYXRhKXt9LAogICAgICAgICAgICBvblJlc3VtZTogZnVuY3Rpb24oaWQsIGZpbGVOYW1lLCBjaHVua0RhdGEpe30sCiAgICAgICAgICAgIG9uUHJvZ3Jlc3M6IGZ1bmN0aW9uKGlkLCBuYW1lLCBsb2FkZWQsIHRvdGFsKXt9LAogICAgICAgICAgICBvbkVycm9yOiBmdW5jdGlvbihpZCwgbmFtZSwgcmVhc29uLCBtYXliZVhocikge30sCiAgICAgICAgICAgIG9uQXV0b1JldHJ5OiBmdW5jdGlvbihpZCwgbmFtZSwgYXR0ZW1wdE51bWJlcikge30sCiAgICAgICAgICAgIG9uTWFudWFsUmV0cnk6IGZ1bmN0aW9uKGlkLCBuYW1lKSB7fSwKICAgICAgICAgICAgb25WYWxpZGF0ZUJhdGNoOiBmdW5jdGlvbihmaWxlT3JCbG9iRGF0YSkge30sCiAgICAgICAgICAgIG9uVmFsaWRhdGU6IGZ1bmN0aW9uKGZpbGVPckJsb2JEYXRhKSB7fSwKICAgICAgICAgICAgb25TdWJtaXREZWxldGU6IGZ1bmN0aW9uKGlkKSB7fSwKICAgICAgICAgICAgb25EZWxldGU6IGZ1bmN0aW9uKGlkKXt9LAogICAgICAgICAgICBvbkRlbGV0ZUNvbXBsZXRlOiBmdW5jdGlvbihpZCwgeGhyLCBpc0Vycm9yKXt9LAogICAgICAgICAgICBvblBhc3RlUmVjZWl2ZWQ6IGZ1bmN0aW9uKGJsb2IpIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgcXEuUHJvbWlzZSgpLnN1Y2Nlc3MoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgbWVzc2FnZXM6IHsKICAgICAgICAgICAgdHlwZUVycm9yOiAie2ZpbGV9IGhhcyBhbiBpbnZhbGlkIGV4dGVuc2lvbi4gVmFsaWQgZXh0ZW5zaW9uKHMpOiB7ZXh0ZW5zaW9uc30uIiwKICAgICAgICAgICAgc2l6ZUVycm9yOiAie2ZpbGV9IGlzIHRvbyBsYXJnZSwgbWF4aW11bSBmaWxlIHNpemUgaXMge3NpemVMaW1pdH0uIiwKICAgICAgICAgICAgbWluU2l6ZUVycm9yOiAie2ZpbGV9IGlzIHRvbyBzbWFsbCwgbWluaW11bSBmaWxlIHNpemUgaXMge21pblNpemVMaW1pdH0uIiwKICAgICAgICAgICAgZW1wdHlFcnJvcjogIntmaWxlfSBpcyBlbXB0eSwgcGxlYXNlIHNlbGVjdCBmaWxlcyBhZ2FpbiB3aXRob3V0IGl0LiIsCiAgICAgICAgICAgIG5vRmlsZXNFcnJvcjogIk5vIGZpbGVzIHRvIHVwbG9hZC4iLAogICAgICAgICAgICB0b29NYW55SXRlbXNFcnJvcjogIlRvbyBtYW55IGl0ZW1zICh7bmV0SXRlbXN9KSB3b3VsZCBiZSB1cGxvYWRlZC4gIEl0ZW0gbGltaXQgaXMge2l0ZW1MaW1pdH0uIiwKICAgICAgICAgICAgcmV0cnlGYWlsVG9vTWFueUl0ZW1zOiAiUmV0cnkgZmFpbGVkIC0geW91IGhhdmUgcmVhY2hlZCB5b3VyIGZpbGUgbGltaXQuIiwKICAgICAgICAgICAgb25MZWF2ZTogIlRoZSBmaWxlcyBhcmUgYmVpbmcgdXBsb2FkZWQsIGlmIHlvdSBsZWF2ZSBub3cgdGhlIHVwbG9hZCB3aWxsIGJlIGNhbmNlbGxlZC4iCiAgICAgICAgfSwKICAgICAgICByZXRyeTogewogICAgICAgICAgICBlbmFibGVBdXRvOiBmYWxzZSwKICAgICAgICAgICAgbWF4QXV0b0F0dGVtcHRzOiAzLAogICAgICAgICAgICBhdXRvQXR0ZW1wdERlbGF5OiA1LAogICAgICAgICAgICBwcmV2ZW50UmV0cnlSZXNwb25zZVByb3BlcnR5OiAncHJldmVudFJldHJ5JwogICAgICAgIH0sCiAgICAgICAgY2xhc3NlczogewogICAgICAgICAgICBidXR0b25Ib3ZlcjogJ3FxLXVwbG9hZC1idXR0b24taG92ZXInLAogICAgICAgICAgICBidXR0b25Gb2N1czogJ3FxLXVwbG9hZC1idXR0b24tZm9jdXMnCiAgICAgICAgfSwKICAgICAgICBjaHVua2luZzogewogICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKICAgICAgICAgICAgcGFydFNpemU6IDIwMDAwMDAsCiAgICAgICAgICAgIHBhcmFtTmFtZXM6IHsKICAgICAgICAgICAgICAgIHBhcnRJbmRleDogJ3FxcGFydGluZGV4JywKICAgICAgICAgICAgICAgIHBhcnRCeXRlT2Zmc2V0OiAncXFwYXJ0Ynl0ZW9mZnNldCcsCiAgICAgICAgICAgICAgICBjaHVua1NpemU6ICdxcWNodW5rc2l6ZScsCiAgICAgICAgICAgICAgICB0b3RhbEZpbGVTaXplOiAncXF0b3RhbGZpbGVzaXplJywKICAgICAgICAgICAgICAgIHRvdGFsUGFydHM6ICdxcXRvdGFscGFydHMnLAogICAgICAgICAgICAgICAgZmlsZW5hbWU6ICdxcWZpbGVuYW1lJwogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICByZXN1bWU6IHsKICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCiAgICAgICAgICAgIGlkOiBudWxsLAogICAgICAgICAgICBjb29raWVzRXhwaXJlSW46IDcsIC8vZGF5cwogICAgICAgICAgICBwYXJhbU5hbWVzOiB7CiAgICAgICAgICAgICAgICByZXN1bWluZzogInFxcmVzdW1lIgogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBmb3JtYXRGaWxlTmFtZTogZnVuY3Rpb24oZmlsZU9yQmxvYk5hbWUpIHsKICAgICAgICAgICAgaWYgKGZpbGVPckJsb2JOYW1lLmxlbmd0aCA+IDMzKSB7CiAgICAgICAgICAgICAgICBmaWxlT3JCbG9iTmFtZSA9IGZpbGVPckJsb2JOYW1lLnNsaWNlKDAsIDE5KSArICcuLi4nICsgZmlsZU9yQmxvYk5hbWUuc2xpY2UoLTE0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmlsZU9yQmxvYk5hbWU7CiAgICAgICAgfSwKICAgICAgICB0ZXh0OiB7CiAgICAgICAgICAgIHNpemVTeW1ib2xzOiBbJ2tCJywgJ01CJywgJ0dCJywgJ1RCJywgJ1BCJywgJ0VCJ10KICAgICAgICB9LAogICAgICAgIGRlbGV0ZUZpbGUgOiB7CiAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAogICAgICAgICAgICBlbmRwb2ludDogJy9zZXJ2ZXIvdXBsb2FkJywKICAgICAgICAgICAgY3VzdG9tSGVhZGVyczoge30sCiAgICAgICAgICAgIHBhcmFtczoge30KICAgICAgICB9LAogICAgICAgIGNvcnM6IHsKICAgICAgICAgICAgZXhwZWN0ZWQ6IGZhbHNlLAogICAgICAgICAgICBzZW5kQ3JlZGVudGlhbHM6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICBibG9iczogewogICAgICAgICAgICBkZWZhdWx0TmFtZTogJ21pc2NfZGF0YScsCiAgICAgICAgICAgIHBhcmFtTmFtZXM6IHsKICAgICAgICAgICAgICAgIG5hbWU6ICdxcWJsb2JuYW1lJwogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBwYXN0ZTogewogICAgICAgICAgICB0YXJnZXRFbGVtZW50OiBudWxsLAogICAgICAgICAgICBkZWZhdWx0TmFtZTogJ3Bhc3RlZF9pbWFnZScKICAgICAgICB9CiAgICB9OwoKICAgIHFxLmV4dGVuZCh0aGlzLl9vcHRpb25zLCBvLCB0cnVlKTsKICAgIHRoaXMuX3dyYXBDYWxsYmFja3MoKTsKICAgIHRoaXMuX2Rpc3Bvc2VTdXBwb3J0ID0gIG5ldyBxcS5EaXNwb3NlU3VwcG9ydCgpOwoKICAgIHRoaXMuX2ZpbGVzSW5Qcm9ncmVzcyA9IFtdOwogICAgdGhpcy5fc3RvcmVkSWRzID0gW107CiAgICB0aGlzLl9hdXRvUmV0cmllcyA9IFtdOwogICAgdGhpcy5fcmV0cnlUaW1lb3V0cyA9IFtdOwogICAgdGhpcy5fcHJldmVudFJldHJpZXMgPSBbXTsKICAgIHRoaXMuX25ldEZpbGVzVXBsb2FkZWRPclF1ZXVlZCA9IDA7CgogICAgdGhpcy5fcGFyYW1zU3RvcmUgPSB0aGlzLl9jcmVhdGVQYXJhbXNTdG9yZSgicmVxdWVzdCIpOwogICAgdGhpcy5fZGVsZXRlRmlsZVBhcmFtc1N0b3JlID0gdGhpcy5fY3JlYXRlUGFyYW1zU3RvcmUoImRlbGV0ZUZpbGUiKTsKCiAgICB0aGlzLl9lbmRwb2ludFN0b3JlID0gdGhpcy5fY3JlYXRlRW5kcG9pbnRTdG9yZSgicmVxdWVzdCIpOwogICAgdGhpcy5fZGVsZXRlRmlsZUVuZHBvaW50U3RvcmUgPSB0aGlzLl9jcmVhdGVFbmRwb2ludFN0b3JlKCJkZWxldGVGaWxlIik7CgogICAgdGhpcy5faGFuZGxlciA9IHRoaXMuX2NyZWF0ZVVwbG9hZEhhbmRsZXIoKTsKICAgIHRoaXMuX2RlbGV0ZUhhbmRsZXIgPSB0aGlzLl9jcmVhdGVEZWxldGVIYW5kbGVyKCk7CgogICAgaWYgKHRoaXMuX29wdGlvbnMuYnV0dG9uKXsKICAgICAgICB0aGlzLl9idXR0b24gPSB0aGlzLl9jcmVhdGVVcGxvYWRCdXR0b24odGhpcy5fb3B0aW9ucy5idXR0b24pOwogICAgfQoKICAgIGlmICh0aGlzLl9vcHRpb25zLnBhc3RlLnRhcmdldEVsZW1lbnQpIHsKICAgICAgICB0aGlzLl9wYXN0ZUhhbmRsZXIgPSB0aGlzLl9jcmVhdGVQYXN0ZUhhbmRsZXIoKTsKICAgIH0KCiAgICB0aGlzLl9wcmV2ZW50TGVhdmVJblByb2dyZXNzKCk7Cn07CgpxcS5GaW5lVXBsb2FkZXJCYXNpYy5wcm90b3R5cGUgPSB7CiAgICBsb2c6IGZ1bmN0aW9uKHN0ciwgbGV2ZWwpIHsKICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5kZWJ1ZyAmJiAoIWxldmVsIHx8IGxldmVsID09PSAnaW5mbycpKSB7CiAgICAgICAgICAgIHFxLmxvZygnW0ZpbmVVcGxvYWRlcl0gJyArIHN0cik7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGxldmVsICYmIGxldmVsICE9PSAnaW5mbycpIHsKICAgICAgICAgICAgcXEubG9nKCdbRmluZVVwbG9hZGVyXSAnICsgc3RyLCBsZXZlbCk7CgogICAgICAgIH0KICAgIH0sCiAgICBzZXRQYXJhbXM6IGZ1bmN0aW9uKHBhcmFtcywgaWQpIHsKICAgICAgICAvKmpzaGludCBlcWVxZXE6IHRydWUsIGVxbnVsbDogdHJ1ZSovCiAgICAgICAgaWYgKGlkID09IG51bGwpIHsKICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5yZXF1ZXN0LnBhcmFtcyA9IHBhcmFtczsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRoaXMuX3BhcmFtc1N0b3JlLnNldFBhcmFtcyhwYXJhbXMsIGlkKTsKICAgICAgICB9CiAgICB9LAogICAgc2V0RGVsZXRlRmlsZVBhcmFtczogZnVuY3Rpb24ocGFyYW1zLCBpZCkgewogICAgICAgIC8qanNoaW50IGVxZXFlcTogdHJ1ZSwgZXFudWxsOiB0cnVlKi8KICAgICAgICBpZiAoaWQgPT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLl9vcHRpb25zLmRlbGV0ZUZpbGUucGFyYW1zID0gcGFyYW1zOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhpcy5fZGVsZXRlRmlsZVBhcmFtc1N0b3JlLnNldFBhcmFtcyhwYXJhbXMsIGlkKTsKICAgICAgICB9CiAgICB9LAogICAgc2V0RW5kcG9pbnQ6IGZ1bmN0aW9uKGVuZHBvaW50LCBpZCkgewogICAgICAgIC8qanNoaW50IGVxZXFlcTogdHJ1ZSwgZXFudWxsOiB0cnVlKi8KICAgICAgICBpZiAoaWQgPT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLl9vcHRpb25zLnJlcXVlc3QuZW5kcG9pbnQgPSBlbmRwb2ludDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRoaXMuX2VuZHBvaW50U3RvcmUuc2V0RW5kcG9pbnQoZW5kcG9pbnQsIGlkKTsKICAgICAgICB9CiAgICB9LAogICAgZ2V0SW5Qcm9ncmVzczogZnVuY3Rpb24oKXsKICAgICAgICByZXR1cm4gdGhpcy5fZmlsZXNJblByb2dyZXNzLmxlbmd0aDsKICAgIH0sCiAgICB1cGxvYWRTdG9yZWRGaWxlczogZnVuY3Rpb24oKXsKICAgICAgICAidXNlIHN0cmljdCI7CiAgICAgICAgdmFyIGlkVG9VcGxvYWQ7CgogICAgICAgIHdoaWxlKHRoaXMuX3N0b3JlZElkcy5sZW5ndGgpIHsKICAgICAgICAgICAgaWRUb1VwbG9hZCA9IHRoaXMuX3N0b3JlZElkcy5zaGlmdCgpOwogICAgICAgICAgICB0aGlzLl9maWxlc0luUHJvZ3Jlc3MucHVzaChpZFRvVXBsb2FkKTsKICAgICAgICAgICAgdGhpcy5faGFuZGxlci51cGxvYWQoaWRUb1VwbG9hZCk7CiAgICAgICAgfQogICAgfSwKICAgIGNsZWFyU3RvcmVkRmlsZXM6IGZ1bmN0aW9uKCl7CiAgICAgICAgdGhpcy5fc3RvcmVkSWRzID0gW107CiAgICB9LAogICAgcmV0cnk6IGZ1bmN0aW9uKGlkKSB7CiAgICAgICAgaWYgKHRoaXMuX29uQmVmb3JlTWFudWFsUmV0cnkoaWQpKSB7CiAgICAgICAgICAgIHRoaXMuX25ldEZpbGVzVXBsb2FkZWRPclF1ZXVlZCsrOwogICAgICAgICAgICB0aGlzLl9oYW5kbGVyLnJldHJ5KGlkKTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfSwKICAgIGNhbmNlbDogZnVuY3Rpb24oaWQpIHsKICAgICAgICB0aGlzLl9oYW5kbGVyLmNhbmNlbChpZCk7CiAgICB9LAogICAgY2FuY2VsQWxsOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc3RvcmVkSWRzQ29weSA9IFtdLAogICAgICAgICAgICBzZWxmID0gdGhpczsKCiAgICAgICAgcXEuZXh0ZW5kKHN0b3JlZElkc0NvcHksIHRoaXMuX3N0b3JlZElkcyk7CiAgICAgICAgcXEuZWFjaChzdG9yZWRJZHNDb3B5LCBmdW5jdGlvbihpZHgsIHN0b3JlZEZpbGVJZCkgewogICAgICAgICAgICBzZWxmLmNhbmNlbChzdG9yZWRGaWxlSWQpOwogICAgICAgIH0pOwoKICAgICAgICB0aGlzLl9oYW5kbGVyLmNhbmNlbEFsbCgpOwogICAgfSwKICAgIHJlc2V0OiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLmxvZygiUmVzZXR0aW5nIHVwbG9hZGVyLi4uIik7CiAgICAgICAgdGhpcy5faGFuZGxlci5yZXNldCgpOwogICAgICAgIHRoaXMuX2ZpbGVzSW5Qcm9ncmVzcyA9IFtdOwogICAgICAgIHRoaXMuX3N0b3JlZElkcyA9IFtdOwogICAgICAgIHRoaXMuX2F1dG9SZXRyaWVzID0gW107CiAgICAgICAgdGhpcy5fcmV0cnlUaW1lb3V0cyA9IFtdOwogICAgICAgIHRoaXMuX3ByZXZlbnRSZXRyaWVzID0gW107CiAgICAgICAgdGhpcy5fYnV0dG9uLnJlc2V0KCk7CiAgICAgICAgdGhpcy5fcGFyYW1zU3RvcmUucmVzZXQoKTsKICAgICAgICB0aGlzLl9lbmRwb2ludFN0b3JlLnJlc2V0KCk7CiAgICAgICAgdGhpcy5fbmV0RmlsZXNVcGxvYWRlZE9yUXVldWVkID0gMDsKCiAgICAgICAgaWYgKHRoaXMuX3Bhc3RlSGFuZGxlcikgewogICAgICAgICAgICB0aGlzLl9wYXN0ZUhhbmRsZXIucmVzZXQoKTsKICAgICAgICB9CiAgICB9LAogICAgYWRkRmlsZXM6IGZ1bmN0aW9uKGZpbGVzQmxvYkRhdGFPcklucHV0cykgewogICAgICAgIHZhciBzZWxmID0gdGhpcywKICAgICAgICAgICAgdmVyaWZpZWRGaWxlc09ySW5wdXRzID0gW10sCiAgICAgICAgICAgIGluZGV4LCBmaWxlT3JJbnB1dDsKCiAgICAgICAgaWYgKGZpbGVzQmxvYkRhdGFPcklucHV0cykgewogICAgICAgICAgICBpZiAoIXdpbmRvdy5GaWxlTGlzdCB8fCAhKGZpbGVzQmxvYkRhdGFPcklucHV0cyBpbnN0YW5jZW9mIEZpbGVMaXN0KSkgewogICAgICAgICAgICAgICAgZmlsZXNCbG9iRGF0YU9ySW5wdXRzID0gW10uY29uY2F0KGZpbGVzQmxvYkRhdGFPcklucHV0cyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IGZpbGVzQmxvYkRhdGFPcklucHV0cy5sZW5ndGg7IGluZGV4Kz0xKSB7CiAgICAgICAgICAgICAgICBmaWxlT3JJbnB1dCA9IGZpbGVzQmxvYkRhdGFPcklucHV0c1tpbmRleF07CgogICAgICAgICAgICAgICAgaWYgKHFxLmlzRmlsZU9ySW5wdXQoZmlsZU9ySW5wdXQpKSB7CiAgICAgICAgICAgICAgICAgICAgdmVyaWZpZWRGaWxlc09ySW5wdXRzLnB1c2goZmlsZU9ySW5wdXQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2coZmlsZU9ySW5wdXQgKyAnIGlzIG5vdCBhIEZpbGUgb3IgSU5QVVQgZWxlbWVudCEgIElnbm9yaW5nIScsICd3YXJuJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMubG9nKCdQcm9jZXNzaW5nICcgKyB2ZXJpZmllZEZpbGVzT3JJbnB1dHMubGVuZ3RoICsgJyBmaWxlcyBvciBpbnB1dHMuLi4nKTsKICAgICAgICAgICAgdGhpcy5fdXBsb2FkRmlsZU9yQmxvYkRhdGFMaXN0KHZlcmlmaWVkRmlsZXNPcklucHV0cyk7CiAgICAgICAgfQogICAgfSwKICAgIGFkZEJsb2JzOiBmdW5jdGlvbihibG9iRGF0YU9yQXJyYXkpIHsKICAgICAgICBpZiAoYmxvYkRhdGFPckFycmF5KSB7CiAgICAgICAgICAgIHZhciBibG9iRGF0YUFycmF5ID0gW10uY29uY2F0KGJsb2JEYXRhT3JBcnJheSksCiAgICAgICAgICAgICAgICB2ZXJpZmllZEJsb2JEYXRhTGlzdCA9IFtdLAogICAgICAgICAgICAgICAgc2VsZiA9IHRoaXM7CgogICAgICAgICAgICBxcS5lYWNoKGJsb2JEYXRhQXJyYXksIGZ1bmN0aW9uKGlkeCwgYmxvYkRhdGEpIHsKICAgICAgICAgICAgICAgIGlmIChxcS5pc0Jsb2IoYmxvYkRhdGEpICYmICFxcS5pc0ZpbGVPcklucHV0KGJsb2JEYXRhKSkgewogICAgICAgICAgICAgICAgICAgIHZlcmlmaWVkQmxvYkRhdGFMaXN0LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICBibG9iOiBibG9iRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogc2VsZi5fb3B0aW9ucy5ibG9icy5kZWZhdWx0TmFtZQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAocXEuaXNPYmplY3QoYmxvYkRhdGEpICYmIGJsb2JEYXRhLmJsb2IgJiYgYmxvYkRhdGEubmFtZSkgewogICAgICAgICAgICAgICAgICAgIHZlcmlmaWVkQmxvYkRhdGFMaXN0LnB1c2goYmxvYkRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2coImFkZEJsb2JzOiBlbnRyeSBhdCBpbmRleCAiICsgaWR4ICsgIiBpcyBub3QgYSBCbG9iIG9yIGEgQmxvYkRhdGEgb2JqZWN0IiwgImVycm9yIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgdGhpcy5fdXBsb2FkRmlsZU9yQmxvYkRhdGFMaXN0KHZlcmlmaWVkQmxvYkRhdGFMaXN0KTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRoaXMubG9nKCJ1bmRlZmluZWQgb3Igbm9uLWFycmF5IHBhcmFtZXRlciBwYXNzZWQgaW50byBhZGRCbG9icyIsICJlcnJvciIpOwogICAgICAgIH0KICAgIH0sCiAgICBnZXRVdWlkOiBmdW5jdGlvbihpZCkgewogICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVyLmdldFV1aWQoaWQpOwogICAgfSwKICAgIGdldFJlc3VtYWJsZUZpbGVzRGF0YTogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZXIuZ2V0UmVzdW1hYmxlRmlsZXNEYXRhKCk7CiAgICB9LAogICAgZ2V0U2l6ZTogZnVuY3Rpb24oaWQpIHsKICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlci5nZXRTaXplKGlkKTsKICAgIH0sCiAgICBnZXROYW1lOiBmdW5jdGlvbihpZCkgewogICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVyLmdldE5hbWUoaWQpOwogICAgfSwKICAgIGdldEZpbGU6IGZ1bmN0aW9uKGZpbGVPckJsb2JJZCkgewogICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVyLmdldEZpbGUoZmlsZU9yQmxvYklkKTsKICAgIH0sCiAgICBkZWxldGVGaWxlOiBmdW5jdGlvbihpZCkgewogICAgICAgIHRoaXMuX29uU3VibWl0RGVsZXRlKGlkKTsKICAgIH0sCiAgICBzZXREZWxldGVGaWxlRW5kcG9pbnQ6IGZ1bmN0aW9uKGVuZHBvaW50LCBpZCkgewogICAgICAgIC8qanNoaW50IGVxZXFlcTogdHJ1ZSwgZXFudWxsOiB0cnVlKi8KICAgICAgICBpZiAoaWQgPT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLl9vcHRpb25zLmRlbGV0ZUZpbGUuZW5kcG9pbnQgPSBlbmRwb2ludDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRoaXMuX2RlbGV0ZUZpbGVFbmRwb2ludFN0b3JlLnNldEVuZHBvaW50KGVuZHBvaW50LCBpZCk7CiAgICAgICAgfQogICAgfSwKICAgIGdldFByb21pc3NvcnlDYWxsYmFja05hbWVzOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gWyJvblBhc3RlUmVjZWl2ZWQiXTsKICAgIH0sCiAgICBfY3JlYXRlVXBsb2FkQnV0dG9uOiBmdW5jdGlvbihlbGVtZW50KXsKICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgIHZhciBidXR0b24gPSBuZXcgcXEuVXBsb2FkQnV0dG9uKHsKICAgICAgICAgICAgZWxlbWVudDogZWxlbWVudCwKICAgICAgICAgICAgbXVsdGlwbGU6IHRoaXMuX29wdGlvbnMubXVsdGlwbGUgJiYgcXEuaXNYaHJVcGxvYWRTdXBwb3J0ZWQoKSwKICAgICAgICAgICAgYWNjZXB0RmlsZXM6IHRoaXMuX29wdGlvbnMudmFsaWRhdGlvbi5hY2NlcHRGaWxlcywKICAgICAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGlucHV0KXsKICAgICAgICAgICAgICAgIHNlbGYuX29uSW5wdXRDaGFuZ2UoaW5wdXQpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBob3ZlckNsYXNzOiB0aGlzLl9vcHRpb25zLmNsYXNzZXMuYnV0dG9uSG92ZXIsCiAgICAgICAgICAgIGZvY3VzQ2xhc3M6IHRoaXMuX29wdGlvbnMuY2xhc3Nlcy5idXR0b25Gb2N1cwogICAgICAgIH0pOwoKICAgICAgICB0aGlzLl9kaXNwb3NlU3VwcG9ydC5hZGREaXNwb3NlcihmdW5jdGlvbigpIHsgYnV0dG9uLmRpc3Bvc2UoKTsgfSk7CiAgICAgICAgcmV0dXJuIGJ1dHRvbjsKICAgIH0sCiAgICBfY3JlYXRlVXBsb2FkSGFuZGxlcjogZnVuY3Rpb24oKXsKICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgIHJldHVybiBuZXcgcXEuVXBsb2FkSGFuZGxlcih7CiAgICAgICAgICAgIGRlYnVnOiB0aGlzLl9vcHRpb25zLmRlYnVnLAogICAgICAgICAgICBmb3JjZU11bHRpcGFydDogdGhpcy5fb3B0aW9ucy5yZXF1ZXN0LmZvcmNlTXVsdGlwYXJ0LAogICAgICAgICAgICBtYXhDb25uZWN0aW9uczogdGhpcy5fb3B0aW9ucy5tYXhDb25uZWN0aW9ucywKICAgICAgICAgICAgY3VzdG9tSGVhZGVyczogdGhpcy5fb3B0aW9ucy5yZXF1ZXN0LmN1c3RvbUhlYWRlcnMsCiAgICAgICAgICAgIGlucHV0TmFtZTogdGhpcy5fb3B0aW9ucy5yZXF1ZXN0LmlucHV0TmFtZSwKICAgICAgICAgICAgdXVpZFBhcmFtTmFtZTogdGhpcy5fb3B0aW9ucy5yZXF1ZXN0LnV1aWROYW1lLAogICAgICAgICAgICB0b3RhbEZpbGVTaXplUGFyYW1OYW1lOiB0aGlzLl9vcHRpb25zLnJlcXVlc3QudG90YWxGaWxlU2l6ZU5hbWUsCiAgICAgICAgICAgIGNvcnM6IHRoaXMuX29wdGlvbnMuY29ycywKICAgICAgICAgICAgZGVtb01vZGU6IHRoaXMuX29wdGlvbnMuZGVtb01vZGUsCiAgICAgICAgICAgIHBhcmFtc0luQm9keTogdGhpcy5fb3B0aW9ucy5yZXF1ZXN0LnBhcmFtc0luQm9keSwKICAgICAgICAgICAgcGFyYW1zU3RvcmU6IHRoaXMuX3BhcmFtc1N0b3JlLAogICAgICAgICAgICBlbmRwb2ludFN0b3JlOiB0aGlzLl9lbmRwb2ludFN0b3JlLAogICAgICAgICAgICBjaHVua2luZzogdGhpcy5fb3B0aW9ucy5jaHVua2luZywKICAgICAgICAgICAgcmVzdW1lOiB0aGlzLl9vcHRpb25zLnJlc3VtZSwKICAgICAgICAgICAgYmxvYnM6IHRoaXMuX29wdGlvbnMuYmxvYnMsCiAgICAgICAgICAgIGxvZzogZnVuY3Rpb24oc3RyLCBsZXZlbCkgewogICAgICAgICAgICAgICAgc2VsZi5sb2coc3RyLCBsZXZlbCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG9uUHJvZ3Jlc3M6IGZ1bmN0aW9uKGlkLCBuYW1lLCBsb2FkZWQsIHRvdGFsKXsKICAgICAgICAgICAgICAgIHNlbGYuX29uUHJvZ3Jlc3MoaWQsIG5hbWUsIGxvYWRlZCwgdG90YWwpOwogICAgICAgICAgICAgICAgc2VsZi5fb3B0aW9ucy5jYWxsYmFja3Mub25Qcm9ncmVzcyhpZCwgbmFtZSwgbG9hZGVkLCB0b3RhbCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG9uQ29tcGxldGU6IGZ1bmN0aW9uKGlkLCBuYW1lLCByZXN1bHQsIHhocil7CiAgICAgICAgICAgICAgICBzZWxmLl9vbkNvbXBsZXRlKGlkLCBuYW1lLCByZXN1bHQsIHhocik7CiAgICAgICAgICAgICAgICBzZWxmLl9vcHRpb25zLmNhbGxiYWNrcy5vbkNvbXBsZXRlKGlkLCBuYW1lLCByZXN1bHQpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBvbkNhbmNlbDogZnVuY3Rpb24oaWQsIG5hbWUpewogICAgICAgICAgICAgICAgc2VsZi5fb25DYW5jZWwoaWQsIG5hbWUpOwogICAgICAgICAgICAgICAgc2VsZi5fb3B0aW9ucy5jYWxsYmFja3Mub25DYW5jZWwoaWQsIG5hbWUpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBvblVwbG9hZDogZnVuY3Rpb24oaWQsIG5hbWUpewogICAgICAgICAgICAgICAgc2VsZi5fb25VcGxvYWQoaWQsIG5hbWUpOwogICAgICAgICAgICAgICAgc2VsZi5fb3B0aW9ucy5jYWxsYmFja3Mub25VcGxvYWQoaWQsIG5hbWUpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBvblVwbG9hZENodW5rOiBmdW5jdGlvbihpZCwgbmFtZSwgY2h1bmtEYXRhKXsKICAgICAgICAgICAgICAgIHNlbGYuX29wdGlvbnMuY2FsbGJhY2tzLm9uVXBsb2FkQ2h1bmsoaWQsIG5hbWUsIGNodW5rRGF0YSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG9uUmVzdW1lOiBmdW5jdGlvbihpZCwgbmFtZSwgY2h1bmtEYXRhKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fb3B0aW9ucy5jYWxsYmFja3Mub25SZXN1bWUoaWQsIG5hbWUsIGNodW5rRGF0YSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG9uQXV0b1JldHJ5OiBmdW5jdGlvbihpZCwgbmFtZSwgcmVzcG9uc2VKU09OLCB4aHIpIHsKICAgICAgICAgICAgICAgIHNlbGYuX3ByZXZlbnRSZXRyaWVzW2lkXSA9IHJlc3BvbnNlSlNPTltzZWxmLl9vcHRpb25zLnJldHJ5LnByZXZlbnRSZXRyeVJlc3BvbnNlUHJvcGVydHldOwoKICAgICAgICAgICAgICAgIGlmIChzZWxmLl9zaG91bGRBdXRvUmV0cnkoaWQsIG5hbWUsIHJlc3BvbnNlSlNPTikpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLl9tYXliZVBhcnNlQW5kU2VuZFVwbG9hZEVycm9yKGlkLCBuYW1lLCByZXNwb25zZUpTT04sIHhocik7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fb3B0aW9ucy5jYWxsYmFja3Mub25BdXRvUmV0cnkoaWQsIG5hbWUsIHNlbGYuX2F1dG9SZXRyaWVzW2lkXSArIDEpOwogICAgICAgICAgICAgICAgICAgIHNlbGYuX29uQmVmb3JlQXV0b1JldHJ5KGlkLCBuYW1lKTsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmV0cnlUaW1lb3V0c1tpZF0gPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9vbkF1dG9SZXRyeShpZCwgbmFtZSwgcmVzcG9uc2VKU09OKQogICAgICAgICAgICAgICAgICAgIH0sIHNlbGYuX29wdGlvbnMucmV0cnkuYXV0b0F0dGVtcHREZWxheSAqIDEwMDApOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfSwKICAgIF9jcmVhdGVEZWxldGVIYW5kbGVyOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgIHJldHVybiBuZXcgcXEuRGVsZXRlRmlsZUFqYXhSZXF1ZXN0b3IoewogICAgICAgICAgICBtYXhDb25uZWN0aW9uczogdGhpcy5fb3B0aW9ucy5tYXhDb25uZWN0aW9ucywKICAgICAgICAgICAgY3VzdG9tSGVhZGVyczogdGhpcy5fb3B0aW9ucy5kZWxldGVGaWxlLmN1c3RvbUhlYWRlcnMsCiAgICAgICAgICAgIHBhcmFtc1N0b3JlOiB0aGlzLl9kZWxldGVGaWxlUGFyYW1zU3RvcmUsCiAgICAgICAgICAgIGVuZHBvaW50U3RvcmU6IHRoaXMuX2RlbGV0ZUZpbGVFbmRwb2ludFN0b3JlLAogICAgICAgICAgICBkZW1vTW9kZTogdGhpcy5fb3B0aW9ucy5kZW1vTW9kZSwKICAgICAgICAgICAgY29yczogdGhpcy5fb3B0aW9ucy5jb3JzLAogICAgICAgICAgICBsb2c6IGZ1bmN0aW9uKHN0ciwgbGV2ZWwpIHsKICAgICAgICAgICAgICAgIHNlbGYubG9nKHN0ciwgbGV2ZWwpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBvbkRlbGV0ZTogZnVuY3Rpb24oaWQpIHsKICAgICAgICAgICAgICAgIHNlbGYuX29uRGVsZXRlKGlkKTsKICAgICAgICAgICAgICAgIHNlbGYuX29wdGlvbnMuY2FsbGJhY2tzLm9uRGVsZXRlKGlkKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgb25EZWxldGVDb21wbGV0ZTogZnVuY3Rpb24oaWQsIHhociwgaXNFcnJvcikgewogICAgICAgICAgICAgICAgc2VsZi5fb25EZWxldGVDb21wbGV0ZShpZCwgeGhyLCBpc0Vycm9yKTsKICAgICAgICAgICAgICAgIHNlbGYuX29wdGlvbnMuY2FsbGJhY2tzLm9uRGVsZXRlQ29tcGxldGUoaWQsIHhociwgaXNFcnJvcik7CiAgICAgICAgICAgIH0KCiAgICAgICAgfSk7CiAgICB9LAogICAgX2NyZWF0ZVBhc3RlSGFuZGxlcjogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICByZXR1cm4gbmV3IHFxLlBhc3RlU3VwcG9ydCh7CiAgICAgICAgICAgIHRhcmdldEVsZW1lbnQ6IHRoaXMuX29wdGlvbnMucGFzdGUudGFyZ2V0RWxlbWVudCwKICAgICAgICAgICAgY2FsbGJhY2tzOiB7CiAgICAgICAgICAgICAgICBsb2c6IGZ1bmN0aW9uKHN0ciwgbGV2ZWwpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZyhzdHIsIGxldmVsKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBwYXN0ZVJlY2VpdmVkOiBmdW5jdGlvbihibG9iKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHBhc3RlUmVjZWl2ZWRDYWxsYmFjayA9IHNlbGYuX29wdGlvbnMuY2FsbGJhY2tzLm9uUGFzdGVSZWNlaXZlZCwKICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZSA9IHBhc3RlUmVjZWl2ZWRDYWxsYmFjayhibG9iKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHByb21pc2UudGhlbikgewogICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24oc3VjY2Vzc0RhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2hhbmRsZVBhc3RlU3VjY2VzcyhibG9iLCBzdWNjZXNzRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uKGZhaWx1cmVEYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZygiSWdub3JpbmcgcGFzdGVkIGltYWdlIHBlciBwYXN0ZSByZWNlaXZlZCBjYWxsYmFjay4gIFJlYXNvbiA9ICciICsgZmFpbHVyZURhdGEgKyAiJyIpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nKCJQcm9taXNlIGNvbnRyYWN0IG5vdCBmdWxmaWxsZWQgaW4gcGFzdGVSZWNlaXZlZCBjYWxsYmFjayBoYW5kbGVyISAgSWdub3JpbmcgcGFzdGVkIGl0ZW0uIiwgImVycm9yIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9LAogICAgX2hhbmRsZVBhc3RlU3VjY2VzczogZnVuY3Rpb24oYmxvYiwgZXh0U3VwcGxpZWROYW1lKSB7CiAgICAgICAgdmFyIGV4dGVuc2lvbiA9IGJsb2IudHlwZS5zcGxpdCgiLyIpWzFdLAogICAgICAgICAgICBuYW1lID0gZXh0U3VwcGxpZWROYW1lOwoKICAgICAgICAvKmpzaGludCBlcWVxZXE6IHRydWUsIGVxbnVsbDogdHJ1ZSovCiAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgewogICAgICAgICAgICBuYW1lID0gdGhpcy5fb3B0aW9ucy5wYXN0ZS5kZWZhdWx0TmFtZTsKICAgICAgICB9CgogICAgICAgIG5hbWUgKz0gJy4nICsgZXh0ZW5zaW9uOwoKICAgICAgICB0aGlzLmFkZEJsb2JzKHsKICAgICAgICAgICAgbmFtZTogbmFtZSwKICAgICAgICAgICAgYmxvYjogYmxvYgogICAgICAgIH0pOwogICAgfSwKICAgIF9wcmV2ZW50TGVhdmVJblByb2dyZXNzOiBmdW5jdGlvbigpewogICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgdGhpcy5fZGlzcG9zZVN1cHBvcnQuYXR0YWNoKHdpbmRvdywgJ2JlZm9yZXVubG9hZCcsIGZ1bmN0aW9uKGUpewogICAgICAgICAgICBpZiAoIXNlbGYuX2ZpbGVzSW5Qcm9ncmVzcy5sZW5ndGgpe3JldHVybjt9CgogICAgICAgICAgICB2YXIgZSA9IGUgfHwgd2luZG93LmV2ZW50OwogICAgICAgICAgICAvLyBmb3IgaWUsIGZmCiAgICAgICAgICAgIGUucmV0dXJuVmFsdWUgPSBzZWxmLl9vcHRpb25zLm1lc3NhZ2VzLm9uTGVhdmU7CiAgICAgICAgICAgIC8vIGZvciB3ZWJraXQKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX29wdGlvbnMubWVzc2FnZXMub25MZWF2ZTsKICAgICAgICB9KTsKICAgIH0sCiAgICBfb25TdWJtaXQ6IGZ1bmN0aW9uKGlkLCBuYW1lKSB7CiAgICAgICAgdGhpcy5fbmV0RmlsZXNVcGxvYWRlZE9yUXVldWVkKys7CgogICAgICAgIGlmICh0aGlzLl9vcHRpb25zLmF1dG9VcGxvYWQpIHsKICAgICAgICAgICAgdGhpcy5fZmlsZXNJblByb2dyZXNzLnB1c2goaWQpOwogICAgICAgIH0KICAgIH0sCiAgICBfb25Qcm9ncmVzczogZnVuY3Rpb24oaWQsIG5hbWUsIGxvYWRlZCwgdG90YWwpewogICAgfSwKICAgIF9vbkNvbXBsZXRlOiBmdW5jdGlvbihpZCwgbmFtZSwgcmVzdWx0LCB4aHIpIHsKICAgICAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKSB7CiAgICAgICAgICAgIHRoaXMuX25ldEZpbGVzVXBsb2FkZWRPclF1ZXVlZC0tOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5fcmVtb3ZlRnJvbUZpbGVzSW5Qcm9ncmVzcyhpZCk7CiAgICAgICAgdGhpcy5fbWF5YmVQYXJzZUFuZFNlbmRVcGxvYWRFcnJvcihpZCwgbmFtZSwgcmVzdWx0LCB4aHIpOwogICAgfSwKICAgIF9vbkNhbmNlbDogZnVuY3Rpb24oaWQsIG5hbWUpewogICAgICAgIHRoaXMuX25ldEZpbGVzVXBsb2FkZWRPclF1ZXVlZC0tOwoKICAgICAgICB0aGlzLl9yZW1vdmVGcm9tRmlsZXNJblByb2dyZXNzKGlkKTsKCiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3JldHJ5VGltZW91dHNbaWRdKTsKCiAgICAgICAgdmFyIHN0b3JlZEl0ZW1JbmRleCA9IHFxLmluZGV4T2YodGhpcy5fc3RvcmVkSWRzLCBpZCk7CiAgICAgICAgaWYgKCF0aGlzLl9vcHRpb25zLmF1dG9VcGxvYWQgJiYgc3RvcmVkSXRlbUluZGV4ID49IDApIHsKICAgICAgICAgICAgdGhpcy5fc3RvcmVkSWRzLnNwbGljZShzdG9yZWRJdGVtSW5kZXgsIDEpOwogICAgICAgIH0KICAgIH0sCiAgICBfaXNEZWxldGVQb3NzaWJsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuICh0aGlzLl9vcHRpb25zLmRlbGV0ZUZpbGUuZW5hYmxlZCAmJgogICAgICAgICAgICAoIXRoaXMuX29wdGlvbnMuY29ycy5leHBlY3RlZCB8fAogICAgICAgICAgICAgICAgKHRoaXMuX29wdGlvbnMuY29ycy5leHBlY3RlZCAmJiAocXEuaWUxMCgpIHx8ICFxcS5pZSgpKSkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKTsKICAgIH0sCiAgICBfb25TdWJtaXREZWxldGU6IGZ1bmN0aW9uKGlkKSB7CiAgICAgICAgaWYgKHRoaXMuX2lzRGVsZXRlUG9zc2libGUoKSkgewogICAgICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5jYWxsYmFja3Mub25TdWJtaXREZWxldGUoaWQpICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgdGhpcy5fZGVsZXRlSGFuZGxlci5zZW5kRGVsZXRlKGlkLCB0aGlzLmdldFV1aWQoaWQpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhpcy5sb2coIkRlbGV0ZSByZXF1ZXN0IGlnbm9yZWQgZm9yIElEICIgKyBpZCArICIsIGRlbGV0ZSBmZWF0dXJlIGlzIGRpc2FibGVkIG9yIHJlcXVlc3Qgbm90IHBvc3NpYmxlICIgKwogICAgICAgICAgICAgICAgImR1ZSB0byBDT1JTIG9uIGEgdXNlciBhZ2VudCB0aGF0IGRvZXMgbm90IHN1cHBvcnQgcHJlLWZsaWdodGluZy4iLCAid2FybiIpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfSwKICAgIF9vbkRlbGV0ZTogZnVuY3Rpb24oZmlsZUlkKSB7fSwKICAgIF9vbkRlbGV0ZUNvbXBsZXRlOiBmdW5jdGlvbihpZCwgeGhyLCBpc0Vycm9yKSB7CiAgICAgICAgdmFyIG5hbWUgPSB0aGlzLl9oYW5kbGVyLmdldE5hbWUoaWQpOwoKICAgICAgICBpZiAoaXNFcnJvcikgewogICAgICAgICAgICB0aGlzLmxvZygiRGVsZXRlIHJlcXVlc3QgZm9yICciICsgbmFtZSArICInIGhhcyBmYWlsZWQuIiwgImVycm9yIik7CiAgICAgICAgICAgIHRoaXMuX29wdGlvbnMuY2FsbGJhY2tzLm9uRXJyb3IoaWQsIG5hbWUsICJEZWxldGUgcmVxdWVzdCBmYWlsZWQgd2l0aCByZXNwb25zZSBjb2RlICIgKyB4aHIuc3RhdHVzLCB4aHIpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhpcy5fbmV0RmlsZXNVcGxvYWRlZE9yUXVldWVkLS07CiAgICAgICAgICAgIHRoaXMubG9nKCJEZWxldGUgcmVxdWVzdCBmb3IgJyIgKyBuYW1lICsgIicgaGFzIHN1Y2NlZWRlZC4iKTsKICAgICAgICB9CiAgICB9LAogICAgX3JlbW92ZUZyb21GaWxlc0luUHJvZ3Jlc3M6IGZ1bmN0aW9uKGlkKSB7CiAgICAgICAgdmFyIGluZGV4ID0gcXEuaW5kZXhPZih0aGlzLl9maWxlc0luUHJvZ3Jlc3MsIGlkKTsKICAgICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICAgICB0aGlzLl9maWxlc0luUHJvZ3Jlc3Muc3BsaWNlKGluZGV4LCAxKTsKICAgICAgICB9CiAgICB9LAogICAgX29uVXBsb2FkOiBmdW5jdGlvbihpZCwgbmFtZSl7fSwKICAgIF9vbklucHV0Q2hhbmdlOiBmdW5jdGlvbihpbnB1dCl7CiAgICAgICAgaWYgKHFxLmlzWGhyVXBsb2FkU3VwcG9ydGVkKCkpewogICAgICAgICAgICB0aGlzLmFkZEZpbGVzKGlucHV0LmZpbGVzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLmFkZEZpbGVzKGlucHV0KTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fYnV0dG9uLnJlc2V0KCk7CiAgICB9LAogICAgX29uQmVmb3JlQXV0b1JldHJ5OiBmdW5jdGlvbihpZCwgbmFtZSkgewogICAgICAgIHRoaXMubG9nKCJXYWl0aW5nICIgKyB0aGlzLl9vcHRpb25zLnJldHJ5LmF1dG9BdHRlbXB0RGVsYXkgKyAiIHNlY29uZHMgYmVmb3JlIHJldHJ5aW5nICIgKyBuYW1lICsgIi4uLiIpOwogICAgfSwKICAgIF9vbkF1dG9SZXRyeTogZnVuY3Rpb24oaWQsIG5hbWUsIHJlc3BvbnNlSlNPTikgewogICAgICAgIHRoaXMubG9nKCJSZXRyeWluZyAiICsgbmFtZSArICIuLi4iKTsKICAgICAgICB0aGlzLl9hdXRvUmV0cmllc1tpZF0rKzsKICAgICAgICB0aGlzLl9oYW5kbGVyLnJldHJ5KGlkKTsKICAgIH0sCiAgICBfc2hvdWxkQXV0b1JldHJ5OiBmdW5jdGlvbihpZCwgbmFtZSwgcmVzcG9uc2VKU09OKSB7CiAgICAgICAgaWYgKCF0aGlzLl9wcmV2ZW50UmV0cmllc1tpZF0gJiYgdGhpcy5fb3B0aW9ucy5yZXRyeS5lbmFibGVBdXRvKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9hdXRvUmV0cmllc1tpZF0gPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgdGhpcy5fYXV0b1JldHJpZXNbaWRdID0gMDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2F1dG9SZXRyaWVzW2lkXSA8IHRoaXMuX29wdGlvbnMucmV0cnkubWF4QXV0b0F0dGVtcHRzOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSwKICAgIC8vcmV0dXJuIGZhbHNlIGlmIHdlIHNob3VsZCBub3QgYXR0ZW1wdCB0aGUgcmVxdWVzdGVkIHJldHJ5CiAgICBfb25CZWZvcmVNYW51YWxSZXRyeTogZnVuY3Rpb24oaWQpIHsKICAgICAgICB2YXIgaXRlbUxpbWl0ID0gdGhpcy5fb3B0aW9ucy52YWxpZGF0aW9uLml0ZW1MaW1pdDsKCiAgICAgICAgaWYgKHRoaXMuX3ByZXZlbnRSZXRyaWVzW2lkXSkgewogICAgICAgICAgICB0aGlzLmxvZygiUmV0cmllcyBhcmUgZm9yYmlkZGVuIGZvciBpZCAiICsgaWQsICd3YXJuJyk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodGhpcy5faGFuZGxlci5pc1ZhbGlkKGlkKSkgewogICAgICAgICAgICB2YXIgZmlsZU5hbWUgPSB0aGlzLl9oYW5kbGVyLmdldE5hbWUoaWQpOwoKICAgICAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMuY2FsbGJhY2tzLm9uTWFudWFsUmV0cnkoaWQsIGZpbGVOYW1lKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGl0ZW1MaW1pdCA+IDAgJiYgdGhpcy5fbmV0RmlsZXNVcGxvYWRlZE9yUXVldWVkKzEgPiBpdGVtTGltaXQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2l0ZW1FcnJvcigicmV0cnlGYWlsVG9vTWFueUl0ZW1zIiwgIiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmxvZygiUmV0cnlpbmcgdXBsb2FkIGZvciAnIiArIGZpbGVOYW1lICsgIicgKGlkOiAiICsgaWQgKyAiKS4uLiIpOwogICAgICAgICAgICB0aGlzLl9maWxlc0luUHJvZ3Jlc3MucHVzaChpZCk7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhpcy5sb2coIiciICsgaWQgKyAiJyBpcyBub3QgYSB2YWxpZCBmaWxlIElEIiwgJ2Vycm9yJyk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9LAogICAgX21heWJlUGFyc2VBbmRTZW5kVXBsb2FkRXJyb3I6IGZ1bmN0aW9uKGlkLCBuYW1lLCByZXNwb25zZSwgeGhyKSB7CiAgICAgICAgLy9hc3N1bWluZyBubyBvbmUgd2lsbCBhY3R1YWxseSBzZXQgdGhlIHJlc3BvbnNlIGNvZGUgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gMjAwIGFuZCBzdGlsbCBzZXQgJ3N1Y2Nlc3MnIHRvIHRydWUKICAgICAgICBpZiAoIXJlc3BvbnNlLnN1Y2Nlc3MpewogICAgICAgICAgICBpZiAoeGhyICYmIHhoci5zdGF0dXMgIT09IDIwMCAmJiAhcmVzcG9uc2UuZXJyb3IpIHsKICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMuY2FsbGJhY2tzLm9uRXJyb3IoaWQsIG5hbWUsICJYSFIgcmV0dXJuZWQgcmVzcG9uc2UgY29kZSAiICsgeGhyLnN0YXR1cywgeGhyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciBlcnJvclJlYXNvbiA9IHJlc3BvbnNlLmVycm9yID8gcmVzcG9uc2UuZXJyb3IgOiAiVXBsb2FkIGZhaWx1cmUgcmVhc29uIHVua25vd24iOwogICAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5jYWxsYmFja3Mub25FcnJvcihpZCwgbmFtZSwgZXJyb3JSZWFzb24sIHhocik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9LAogICAgX3VwbG9hZEZpbGVPckJsb2JEYXRhTGlzdDogZnVuY3Rpb24oZmlsZU9yQmxvYkRhdGFMaXN0KXsKICAgICAgICB2YXIgaW5kZXgsCiAgICAgICAgICAgIHZhbGlkYXRpb25EZXNjcmlwdG9ycyA9IHRoaXMuX2dldFZhbGlkYXRpb25EZXNjcmlwdG9ycyhmaWxlT3JCbG9iRGF0YUxpc3QpLAogICAgICAgICAgICBiYXRjaFZhbGlkID0gdGhpcy5faXNCYXRjaFZhbGlkKHZhbGlkYXRpb25EZXNjcmlwdG9ycyk7CgogICAgICAgIGlmIChiYXRjaFZhbGlkKSB7CiAgICAgICAgICAgIGlmIChmaWxlT3JCbG9iRGF0YUxpc3QubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgZmlsZU9yQmxvYkRhdGFMaXN0Lmxlbmd0aDsgaW5kZXgrKyl7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3ZhbGlkYXRlRmlsZU9yQmxvYkRhdGEoZmlsZU9yQmxvYkRhdGFMaXN0W2luZGV4XSkpewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGxvYWQoZmlsZU9yQmxvYkRhdGFMaXN0W2luZGV4XSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMudmFsaWRhdGlvbi5zdG9wT25GaXJzdEludmFsaWRGaWxlKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX2l0ZW1FcnJvcigibm9GaWxlc0Vycm9yIiwgIiIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSwKICAgIF91cGxvYWQ6IGZ1bmN0aW9uKGJsb2JPckZpbGVDb250YWluZXIpewogICAgICAgIHZhciBpZCA9IHRoaXMuX2hhbmRsZXIuYWRkKGJsb2JPckZpbGVDb250YWluZXIpOwogICAgICAgIHZhciBuYW1lID0gdGhpcy5faGFuZGxlci5nZXROYW1lKGlkKTsKCiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMuY2FsbGJhY2tzLm9uU3VibWl0KGlkLCBuYW1lKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgdGhpcy5fb25TdWJtaXQoaWQsIG5hbWUpOwogICAgICAgICAgICB0aGlzLl9vcHRpb25zLmNhbGxiYWNrcy5vblN1Ym1pdHRlZChpZCwgbmFtZSk7CgogICAgICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5hdXRvVXBsb2FkKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVyLnVwbG9hZChpZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLl9zdG9yZUZvckxhdGVyKGlkKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0sCiAgICBfc3RvcmVGb3JMYXRlcjogZnVuY3Rpb24oaWQpIHsKICAgICAgICB0aGlzLl9zdG9yZWRJZHMucHVzaChpZCk7CiAgICB9LAogICAgX2lzQmF0Y2hWYWxpZDogZnVuY3Rpb24odmFsaWRhdGlvbkRlc2NyaXB0b3JzKSB7CiAgICAgICAgLy9maXJzdCwgZGVmZXIgdGhlIGNoZWNrIHRvIHRoZSBjYWxsYmFjayAoYXNrIHRoZSBpbnRlZ3JhdG9yKQogICAgICAgIHZhciBlcnJvck1lc3NhZ2UsCiAgICAgICAgICAgIGl0ZW1MaW1pdCA9IHRoaXMuX29wdGlvbnMudmFsaWRhdGlvbi5pdGVtTGltaXQsCiAgICAgICAgICAgIHByb3Bvc2VkTmV0RmlsZXNVcGxvYWRlZE9yUXVldWVkID0gdGhpcy5fbmV0RmlsZXNVcGxvYWRlZE9yUXVldWVkICsgdmFsaWRhdGlvbkRlc2NyaXB0b3JzLmxlbmd0aCwKICAgICAgICAgICAgYmF0Y2hWYWxpZCA9IHRoaXMuX29wdGlvbnMuY2FsbGJhY2tzLm9uVmFsaWRhdGVCYXRjaCh2YWxpZGF0aW9uRGVzY3JpcHRvcnMpICE9PSBmYWxzZTsKCiAgICAgICAgLy9pZiB0aGUgY2FsbGJhY2sgaGFzbid0IHJlamVjdGVkIHRoZSBiYXRjaCwgcnVuIHNvbWUgaW50ZXJuYWwgdGVzdHMgb24gdGhlIGJhdGNoIG5leHQKICAgICAgICBpZiAoYmF0Y2hWYWxpZCkgewogICAgICAgICAgICBpZiAoaXRlbUxpbWl0ID09PSAwIHx8IHByb3Bvc2VkTmV0RmlsZXNVcGxvYWRlZE9yUXVldWVkIDw9IGl0ZW1MaW1pdCkgewogICAgICAgICAgICAgICAgYmF0Y2hWYWxpZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBiYXRjaFZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSB0aGlzLl9vcHRpb25zLm1lc3NhZ2VzLnRvb01hbnlJdGVtc0Vycm9yCiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1x7bmV0SXRlbXNcfS9nLCBwcm9wb3NlZE5ldEZpbGVzVXBsb2FkZWRPclF1ZXVlZCkKICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXHtpdGVtTGltaXRcfS9nLCBpdGVtTGltaXQpOwogICAgICAgICAgICAgICAgdGhpcy5fYmF0Y2hFcnJvcihlcnJvck1lc3NhZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gYmF0Y2hWYWxpZDsKICAgIH0sCiAgICBfdmFsaWRhdGVGaWxlT3JCbG9iRGF0YTogZnVuY3Rpb24oZmlsZU9yQmxvYkRhdGEpewogICAgICAgIHZhciB2YWxpZGF0aW9uRGVzY3JpcHRvciwgbmFtZSwgc2l6ZTsKCiAgICAgICAgdmFsaWRhdGlvbkRlc2NyaXB0b3IgPSB0aGlzLl9nZXRWYWxpZGF0aW9uRGVzY3JpcHRvcihmaWxlT3JCbG9iRGF0YSk7CiAgICAgICAgbmFtZSA9IHZhbGlkYXRpb25EZXNjcmlwdG9yLm5hbWU7CiAgICAgICAgc2l6ZSA9IHZhbGlkYXRpb25EZXNjcmlwdG9yLnNpemU7CgogICAgICAgIGlmICh0aGlzLl9vcHRpb25zLmNhbGxiYWNrcy5vblZhbGlkYXRlKHZhbGlkYXRpb25EZXNjcmlwdG9yKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgaWYgKHFxLmlzRmlsZU9ySW5wdXQoZmlsZU9yQmxvYkRhdGEpICYmICF0aGlzLl9pc0FsbG93ZWRFeHRlbnNpb24obmFtZSkpewogICAgICAgICAgICB0aGlzLl9pdGVtRXJyb3IoJ3R5cGVFcnJvcicsIG5hbWUpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChzaXplID09PSAwKXsKICAgICAgICAgICAgdGhpcy5faXRlbUVycm9yKCdlbXB0eUVycm9yJywgbmFtZSk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKCiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHNpemUgJiYgdGhpcy5fb3B0aW9ucy52YWxpZGF0aW9uLnNpemVMaW1pdCAmJiBzaXplID4gdGhpcy5fb3B0aW9ucy52YWxpZGF0aW9uLnNpemVMaW1pdCl7CiAgICAgICAgICAgIHRoaXMuX2l0ZW1FcnJvcignc2l6ZUVycm9yJywgbmFtZSk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKCiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHNpemUgJiYgc2l6ZSA8IHRoaXMuX29wdGlvbnMudmFsaWRhdGlvbi5taW5TaXplTGltaXQpewogICAgICAgICAgICB0aGlzLl9pdGVtRXJyb3IoJ21pblNpemVFcnJvcicsIG5hbWUpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0sCiAgICBfaXRlbUVycm9yOiBmdW5jdGlvbihjb2RlLCBuYW1lKSB7CiAgICAgICAgdmFyIG1lc3NhZ2UgPSB0aGlzLl9vcHRpb25zLm1lc3NhZ2VzW2NvZGVdLAogICAgICAgICAgICBhbGxvd2VkRXh0ZW5zaW9ucyA9IFtdLAogICAgICAgICAgICBleHRlbnNpb25zRm9yTWVzc2FnZTsKCiAgICAgICAgZnVuY3Rpb24gcihuYW1lLCByZXBsYWNlbWVudCl7IG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2UobmFtZSwgcmVwbGFjZW1lbnQpOyB9CgogICAgICAgIHFxLmVhY2godGhpcy5fb3B0aW9ucy52YWxpZGF0aW9uLmFsbG93ZWRFeHRlbnNpb25zLCBmdW5jdGlvbihpZHgsIGFsbG93ZWRFeHRlbnNpb24pIHsKICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICogSWYgYW4gYXJndW1lbnQgaXMgbm90IGEgc3RyaW5nLCBpZ25vcmUgaXQuICBBZGRlZCB3aGVuIGEgcG9zc2libGUgaXNzdWUgd2l0aCBNb29Ub29scyBoaWphY2tpbmcgdGhlCiAgICAgICAgICAgICAgICAgKiBgYWxsb3dlZEV4dGVuc2lvbnNgIGFycmF5IHdhcyBkaXNjb3ZlcmVkLiAgU2VlIGNhc2UgIzczNSBpbiB0aGUgaXNzdWUgdHJhY2tlciBmb3IgbW9yZSBkZXRhaWxzLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpZiAocXEuaXNTdHJpbmcoYWxsb3dlZEV4dGVuc2lvbikpIHsKICAgICAgICAgICAgICAgICAgICBhbGxvd2VkRXh0ZW5zaW9ucy5wdXNoKGFsbG93ZWRFeHRlbnNpb24pOwogICAgICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICBleHRlbnNpb25zRm9yTWVzc2FnZSA9IGFsbG93ZWRFeHRlbnNpb25zLmpvaW4oJywgJykudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgcigne2ZpbGV9JywgdGhpcy5fb3B0aW9ucy5mb3JtYXRGaWxlTmFtZShuYW1lKSk7CiAgICAgICAgcigne2V4dGVuc2lvbnN9JywgZXh0ZW5zaW9uc0Zvck1lc3NhZ2UpOwogICAgICAgIHIoJ3tzaXplTGltaXR9JywgdGhpcy5fZm9ybWF0U2l6ZSh0aGlzLl9vcHRpb25zLnZhbGlkYXRpb24uc2l6ZUxpbWl0KSk7CiAgICAgICAgcigne21pblNpemVMaW1pdH0nLCB0aGlzLl9mb3JtYXRTaXplKHRoaXMuX29wdGlvbnMudmFsaWRhdGlvbi5taW5TaXplTGltaXQpKTsKCiAgICAgICAgdGhpcy5fb3B0aW9ucy5jYWxsYmFja3Mub25FcnJvcihudWxsLCBuYW1lLCBtZXNzYWdlKTsKCiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CiAgICB9LAogICAgX2JhdGNoRXJyb3I6IGZ1bmN0aW9uKG1lc3NhZ2UpIHsKICAgICAgICB0aGlzLl9vcHRpb25zLmNhbGxiYWNrcy5vbkVycm9yKG51bGwsIG51bGwsIG1lc3NhZ2UpOwogICAgfSwKICAgIF9pc0FsbG93ZWRFeHRlbnNpb246IGZ1bmN0aW9uKGZpbGVOYW1lKXsKICAgICAgICB2YXIgYWxsb3dlZCA9IHRoaXMuX29wdGlvbnMudmFsaWRhdGlvbi5hbGxvd2VkRXh0ZW5zaW9ucywKICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKCiAgICAgICAgaWYgKCFhbGxvd2VkLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHFxLmVhY2goYWxsb3dlZCwgZnVuY3Rpb24oaWR4LCBhbGxvd2VkRXh0KSB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBJZiBhbiBhcmd1bWVudCBpcyBub3QgYSBzdHJpbmcsIGlnbm9yZSBpdC4gIEFkZGVkIHdoZW4gYSBwb3NzaWJsZSBpc3N1ZSB3aXRoIE1vb1Rvb2xzIGhpamFja2luZyB0aGUKICAgICAgICAgICAgICogYGFsbG93ZWRFeHRlbnNpb25zYCBhcnJheSB3YXMgZGlzY292ZXJlZC4gIFNlZSBjYXNlICM3MzUgaW4gdGhlIGlzc3VlIHRyYWNrZXIgZm9yIG1vcmUgZGV0YWlscy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChxcS5pc1N0cmluZyhhbGxvd2VkRXh0KSkgewogICAgICAgICAgICAgICAgLypqc2hpbnQgZXFlcWVxOiB0cnVlLCBlcW51bGw6IHRydWUqLwogICAgICAgICAgICAgICAgdmFyIGV4dFJlZ2V4ID0gbmV3IFJlZ0V4cCgnXFwuJyArIGFsbG93ZWRFeHQgKyAiJCIsICdpJyk7CgogICAgICAgICAgICAgICAgaWYgKGZpbGVOYW1lLm1hdGNoKGV4dFJlZ2V4KSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICByZXR1cm4gdmFsaWQ7CiAgICB9LAogICAgX2Zvcm1hdFNpemU6IGZ1bmN0aW9uKGJ5dGVzKXsKICAgICAgICB2YXIgaSA9IC0xOwogICAgICAgIGRvIHsKICAgICAgICAgICAgYnl0ZXMgPSBieXRlcyAvIDEwMjQ7CiAgICAgICAgICAgIGkrKzsKICAgICAgICB9IHdoaWxlIChieXRlcyA+IDk5KTsKCiAgICAgICAgcmV0dXJuIE1hdGgubWF4KGJ5dGVzLCAwLjEpLnRvRml4ZWQoMSkgKyB0aGlzLl9vcHRpb25zLnRleHQuc2l6ZVN5bWJvbHNbaV07CiAgICB9LAogICAgX3dyYXBDYWxsYmFja3M6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBzZWxmLCBzYWZlQ2FsbGJhY2s7CgogICAgICAgIHNlbGYgPSB0aGlzOwoKICAgICAgICBzYWZlQ2FsbGJhY2sgPSBmdW5jdGlvbihuYW1lLCBjYWxsYmFjaywgYXJncykgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KHNlbGYsIGFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChleGNlcHRpb24pIHsKICAgICAgICAgICAgICAgIHNlbGYubG9nKCJDYXVnaHQgZXhjZXB0aW9uIGluICciICsgbmFtZSArICInIGNhbGxiYWNrIC0gIiArIGV4Y2VwdGlvbi5tZXNzYWdlLCAnZXJyb3InKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIGZvciAodmFyIHByb3AgaW4gdGhpcy5fb3B0aW9ucy5jYWxsYmFja3MpIHsKICAgICAgICAgICAgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrTmFtZSwgY2FsbGJhY2tGdW5jOwogICAgICAgICAgICAgICAgY2FsbGJhY2tOYW1lID0gcHJvcDsKICAgICAgICAgICAgICAgIGNhbGxiYWNrRnVuYyA9IHNlbGYuX29wdGlvbnMuY2FsbGJhY2tzW2NhbGxiYWNrTmFtZV07CiAgICAgICAgICAgICAgICBzZWxmLl9vcHRpb25zLmNhbGxiYWNrc1tjYWxsYmFja05hbWVdID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNhZmVDYWxsYmFjayhjYWxsYmFja05hbWUsIGNhbGxiYWNrRnVuYywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0oKSk7CiAgICAgICAgfQogICAgfSwKICAgIF9wYXJzZUZpbGVPckJsb2JEYXRhTmFtZTogZnVuY3Rpb24oZmlsZU9yQmxvYkRhdGEpIHsKICAgICAgICB2YXIgbmFtZTsKCiAgICAgICAgaWYgKHFxLmlzRmlsZU9ySW5wdXQoZmlsZU9yQmxvYkRhdGEpKSB7CiAgICAgICAgICAgIGlmIChmaWxlT3JCbG9iRGF0YS52YWx1ZSkgewogICAgICAgICAgICAgICAgLy8gaXQgaXMgYSBmaWxlIGlucHV0CiAgICAgICAgICAgICAgICAvLyBnZXQgaW5wdXQgdmFsdWUgYW5kIHJlbW92ZSBwYXRoIHRvIG5vcm1hbGl6ZQogICAgICAgICAgICAgICAgbmFtZSA9IGZpbGVPckJsb2JEYXRhLnZhbHVlLnJlcGxhY2UoLy4qKFwvfFxcKS8sICIiKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIGZpeCBtaXNzaW5nIHByb3BlcnRpZXMgaW4gU2FmYXJpIDQgYW5kIGZpcmVmb3ggMTEuMGEyCiAgICAgICAgICAgICAgICBuYW1lID0gKGZpbGVPckJsb2JEYXRhLmZpbGVOYW1lICE9PSBudWxsICYmIGZpbGVPckJsb2JEYXRhLmZpbGVOYW1lICE9PSB1bmRlZmluZWQpID8gZmlsZU9yQmxvYkRhdGEuZmlsZU5hbWUgOiBmaWxlT3JCbG9iRGF0YS5uYW1lOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBuYW1lID0gZmlsZU9yQmxvYkRhdGEubmFtZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBuYW1lOwogICAgfSwKICAgIF9wYXJzZUZpbGVPckJsb2JEYXRhU2l6ZTogZnVuY3Rpb24oZmlsZU9yQmxvYkRhdGEpIHsKICAgICAgICB2YXIgc2l6ZTsKCiAgICAgICAgaWYgKHFxLmlzRmlsZU9ySW5wdXQoZmlsZU9yQmxvYkRhdGEpKSB7CiAgICAgICAgICAgIGlmICghZmlsZU9yQmxvYkRhdGEudmFsdWUpewogICAgICAgICAgICAgICAgLy8gZml4IG1pc3NpbmcgcHJvcGVydGllcyBpbiBTYWZhcmkgNCBhbmQgZmlyZWZveCAxMS4wYTIKICAgICAgICAgICAgICAgIHNpemUgPSAoZmlsZU9yQmxvYkRhdGEuZmlsZVNpemUgIT09IG51bGwgJiYgZmlsZU9yQmxvYkRhdGEuZmlsZVNpemUgIT09IHVuZGVmaW5lZCkgPyBmaWxlT3JCbG9iRGF0YS5maWxlU2l6ZSA6IGZpbGVPckJsb2JEYXRhLnNpemU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHNpemUgPSBmaWxlT3JCbG9iRGF0YS5ibG9iLnNpemU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gc2l6ZTsKICAgIH0sCiAgICBfZ2V0VmFsaWRhdGlvbkRlc2NyaXB0b3I6IGZ1bmN0aW9uKGZpbGVPckJsb2JEYXRhKSB7CiAgICAgICAgdmFyIG5hbWUsIHNpemUsIGZpbGVEZXNjcmlwdG9yOwoKICAgICAgICBmaWxlRGVzY3JpcHRvciA9IHt9OwogICAgICAgIG5hbWUgPSB0aGlzLl9wYXJzZUZpbGVPckJsb2JEYXRhTmFtZShmaWxlT3JCbG9iRGF0YSk7CiAgICAgICAgc2l6ZSA9IHRoaXMuX3BhcnNlRmlsZU9yQmxvYkRhdGFTaXplKGZpbGVPckJsb2JEYXRhKTsKCiAgICAgICAgZmlsZURlc2NyaXB0b3IubmFtZSA9IG5hbWU7CiAgICAgICAgaWYgKHNpemUpIHsKICAgICAgICAgICAgZmlsZURlc2NyaXB0b3Iuc2l6ZSA9IHNpemU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmlsZURlc2NyaXB0b3I7CiAgICB9LAogICAgX2dldFZhbGlkYXRpb25EZXNjcmlwdG9yczogZnVuY3Rpb24oZmlsZXMpIHsKICAgICAgICB2YXIgc2VsZiA9IHRoaXMsCiAgICAgICAgICAgIGZpbGVEZXNjcmlwdG9ycyA9IFtdOwoKICAgICAgICBxcS5lYWNoKGZpbGVzLCBmdW5jdGlvbihpZHgsIGZpbGUpIHsKICAgICAgICAgICAgZmlsZURlc2NyaXB0b3JzLnB1c2goc2VsZi5fZ2V0VmFsaWRhdGlvbkRlc2NyaXB0b3IoZmlsZSkpOwogICAgICAgIH0pOwoKICAgICAgICByZXR1cm4gZmlsZURlc2NyaXB0b3JzOwogICAgfSwKICAgIF9jcmVhdGVQYXJhbXNTdG9yZTogZnVuY3Rpb24odHlwZSkgewogICAgICAgIHZhciBwYXJhbXNTdG9yZSA9IHt9LAogICAgICAgICAgICBzZWxmID0gdGhpczsKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgc2V0UGFyYW1zOiBmdW5jdGlvbihwYXJhbXMsIGlkKSB7CiAgICAgICAgICAgICAgICB2YXIgcGFyYW1zQ29weSA9IHt9OwogICAgICAgICAgICAgICAgcXEuZXh0ZW5kKHBhcmFtc0NvcHksIHBhcmFtcyk7CiAgICAgICAgICAgICAgICBwYXJhbXNTdG9yZVtpZF0gPSBwYXJhbXNDb3B5OwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgZ2V0UGFyYW1zOiBmdW5jdGlvbihpZCkgewogICAgICAgICAgICAgICAgLypqc2hpbnQgZXFlcWVxOiB0cnVlLCBlcW51bGw6IHRydWUqLwogICAgICAgICAgICAgICAgdmFyIHBhcmFtc0NvcHkgPSB7fTsKCiAgICAgICAgICAgICAgICBpZiAoaWQgIT0gbnVsbCAmJiBwYXJhbXNTdG9yZVtpZF0pIHsKICAgICAgICAgICAgICAgICAgICBxcS5leHRlbmQocGFyYW1zQ29weSwgcGFyYW1zU3RvcmVbaWRdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHFxLmV4dGVuZChwYXJhbXNDb3B5LCBzZWxmLl9vcHRpb25zW3R5cGVdLnBhcmFtcyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtc0NvcHk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICByZW1vdmU6IGZ1bmN0aW9uKGZpbGVJZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGRlbGV0ZSBwYXJhbXNTdG9yZVtmaWxlSWRdOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgcmVzZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcGFyYW1zU3RvcmUgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9LAogICAgX2NyZWF0ZUVuZHBvaW50U3RvcmU6IGZ1bmN0aW9uKHR5cGUpIHsKICAgICAgICB2YXIgZW5kcG9pbnRTdG9yZSA9IHt9LAogICAgICAgIHNlbGYgPSB0aGlzOwoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBzZXRFbmRwb2ludDogZnVuY3Rpb24oZW5kcG9pbnQsIGlkKSB7CiAgICAgICAgICAgICAgICBlbmRwb2ludFN0b3JlW2lkXSA9IGVuZHBvaW50OwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgZ2V0RW5kcG9pbnQ6IGZ1bmN0aW9uKGlkKSB7CiAgICAgICAgICAgICAgICAvKmpzaGludCBlcWVxZXE6IHRydWUsIGVxbnVsbDogdHJ1ZSovCiAgICAgICAgICAgICAgICBpZiAoaWQgIT0gbnVsbCAmJiBlbmRwb2ludFN0b3JlW2lkXSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlbmRwb2ludFN0b3JlW2lkXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fb3B0aW9uc1t0eXBlXS5lbmRwb2ludDsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIHJlbW92ZTogZnVuY3Rpb24oZmlsZUlkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZGVsZXRlIGVuZHBvaW50U3RvcmVbZmlsZUlkXTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIHJlc2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGVuZHBvaW50U3RvcmUgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9Cn07Ci8qZ2xvYmFscyBxcSwgZG9jdW1lbnQqLwpxcS5EcmFnQW5kRHJvcCA9IGZ1bmN0aW9uKG8pIHsKICAgICJ1c2Ugc3RyaWN0IjsKCiAgICB2YXIgb3B0aW9ucywgZHosIGRpclBlbmRpbmcsCiAgICAgICAgZHJvcHBlZEZpbGVzID0gW10sCiAgICAgICAgZHJvcHBlZEVudHJpZXNDb3VudCA9IDAsCiAgICAgICAgZHJvcHBlZEVudHJpZXNQYXJzZWRDb3VudCA9IDAsCiAgICAgICAgZGlzcG9zZVN1cHBvcnQgPSBuZXcgcXEuRGlzcG9zZVN1cHBvcnQoKTsKCiAgICAgb3B0aW9ucyA9IHsKICAgICAgICBkcm9wQXJlYTogbnVsbCwKICAgICAgICBleHRyYURyb3B6b25lczogW10sCiAgICAgICAgaGlkZURyb3B6b25lczogdHJ1ZSwKICAgICAgICBtdWx0aXBsZTogdHJ1ZSwKICAgICAgICBjbGFzc2VzOiB7CiAgICAgICAgICAgIGRyb3BBY3RpdmU6IG51bGwKICAgICAgICB9LAogICAgICAgIGNhbGxiYWNrczogewogICAgICAgICAgICBkcm9wUHJvY2Vzc2luZzogZnVuY3Rpb24oaXNQcm9jZXNzaW5nLCBmaWxlcykge30sCiAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbihjb2RlLCBmaWxlbmFtZSkge30sCiAgICAgICAgICAgIGxvZzogZnVuY3Rpb24obWVzc2FnZSwgbGV2ZWwpIHt9CiAgICAgICAgfQogICAgfTsKCiAgICBxcS5leHRlbmQob3B0aW9ucywgbyk7CgogICAgZnVuY3Rpb24gbWF5YmVVcGxvYWREcm9wcGVkRmlsZXMoKSB7CiAgICAgICAgaWYgKGRyb3BwZWRFbnRyaWVzQ291bnQgPT09IGRyb3BwZWRFbnRyaWVzUGFyc2VkQ291bnQgJiYgIWRpclBlbmRpbmcpIHsKICAgICAgICAgICAgb3B0aW9ucy5jYWxsYmFja3MubG9nKCdHcmFiYmVkICcgKyBkcm9wcGVkRmlsZXMubGVuZ3RoICsgIiBmaWxlcyBhZnRlciB0cmVlIHRyYXZlcnNhbC4iKTsKICAgICAgICAgICAgZHouZHJvcERpc2FibGVkKGZhbHNlKTsKICAgICAgICAgICAgb3B0aW9ucy5jYWxsYmFja3MuZHJvcFByb2Nlc3NpbmcoZmFsc2UsIGRyb3BwZWRGaWxlcyk7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gYWRkRHJvcHBlZEZpbGUoZmlsZSkgewogICAgICAgIGRyb3BwZWRGaWxlcy5wdXNoKGZpbGUpOwogICAgICAgIGRyb3BwZWRFbnRyaWVzUGFyc2VkQ291bnQrPTE7CiAgICAgICAgbWF5YmVVcGxvYWREcm9wcGVkRmlsZXMoKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmF2ZXJzZUZpbGVUcmVlKGVudHJ5KSB7CiAgICAgICAgdmFyIGRpclJlYWRlciwgaTsKCiAgICAgICAgZHJvcHBlZEVudHJpZXNDb3VudCs9MTsKCiAgICAgICAgaWYgKGVudHJ5LmlzRmlsZSkgewogICAgICAgICAgICBlbnRyeS5maWxlKGZ1bmN0aW9uKGZpbGUpIHsKICAgICAgICAgICAgICAgIGFkZERyb3BwZWRGaWxlKGZpbGUpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZW50cnkuaXNEaXJlY3RvcnkpIHsKICAgICAgICAgICAgZGlyUGVuZGluZyA9IHRydWU7CiAgICAgICAgICAgIGRpclJlYWRlciA9IGVudHJ5LmNyZWF0ZVJlYWRlcigpOwogICAgICAgICAgICBkaXJSZWFkZXIucmVhZEVudHJpZXMoZnVuY3Rpb24oZW50cmllcykgewogICAgICAgICAgICAgICAgZHJvcHBlZEVudHJpZXNQYXJzZWRDb3VudCs9MTsKICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSs9MSkgewogICAgICAgICAgICAgICAgICAgIHRyYXZlcnNlRmlsZVRyZWUoZW50cmllc1tpXSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZGlyUGVuZGluZyA9IGZhbHNlOwoKICAgICAgICAgICAgICAgIGlmICghZW50cmllcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBtYXliZVVwbG9hZERyb3BwZWRGaWxlcygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gaGFuZGxlRGF0YVRyYW5zZmVyKGRhdGFUcmFuc2ZlcikgewogICAgICAgIHZhciBpLCBpdGVtcywgZW50cnk7CgogICAgICAgIG9wdGlvbnMuY2FsbGJhY2tzLmRyb3BQcm9jZXNzaW5nKHRydWUpOwogICAgICAgIGR6LmRyb3BEaXNhYmxlZCh0cnVlKTsKCiAgICAgICAgaWYgKGRhdGFUcmFuc2Zlci5maWxlcy5sZW5ndGggPiAxICYmICFvcHRpb25zLm11bHRpcGxlKSB7CiAgICAgICAgICAgIG9wdGlvbnMuY2FsbGJhY2tzLmRyb3BQcm9jZXNzaW5nKGZhbHNlKTsKICAgICAgICAgICAgb3B0aW9ucy5jYWxsYmFja3MuZXJyb3IoJ3Rvb01hbnlGaWxlc0Vycm9yJywgIiIpOwogICAgICAgICAgICBkei5kcm9wRGlzYWJsZWQoZmFsc2UpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZHJvcHBlZEZpbGVzID0gW107CiAgICAgICAgICAgIGRyb3BwZWRFbnRyaWVzQ291bnQgPSAwOwogICAgICAgICAgICBkcm9wcGVkRW50cmllc1BhcnNlZENvdW50ID0gMDsKCiAgICAgICAgICAgIGlmIChxcS5pc0ZvbGRlckRyb3BTdXBwb3J0ZWQoZGF0YVRyYW5zZmVyKSkgewogICAgICAgICAgICAgICAgaXRlbXMgPSBkYXRhVHJhbnNmZXIuaXRlbXM7CgogICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSs9MSkgewogICAgICAgICAgICAgICAgICAgIGVudHJ5ID0gaXRlbXNbaV0ud2Via2l0R2V0QXNFbnRyeSgpOwogICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAvL2R1ZSB0byBhIGJ1ZyBpbiBDaHJvbWUncyBGaWxlIFN5c3RlbSBBUEkgaW1wbCAtICMxNDk3MzUKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmlzRmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcHBlZEZpbGVzLnB1c2goaXRlbXNbaV0uZ2V0QXNGaWxlKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IGl0ZW1zLmxlbmd0aC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5YmVVcGxvYWREcm9wcGVkRmlsZXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmF2ZXJzZUZpbGVUcmVlKGVudHJ5KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuY2FsbGJhY2tzLmRyb3BQcm9jZXNzaW5nKGZhbHNlLCBkYXRhVHJhbnNmZXIuZmlsZXMpOwogICAgICAgICAgICAgICAgZHouZHJvcERpc2FibGVkKGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBzZXR1cERyb3B6b25lKGRyb3BBcmVhKXsKICAgICAgICBkeiA9IG5ldyBxcS5VcGxvYWREcm9wWm9uZSh7CiAgICAgICAgICAgIGVsZW1lbnQ6IGRyb3BBcmVhLAogICAgICAgICAgICBvbkVudGVyOiBmdW5jdGlvbihlKXsKICAgICAgICAgICAgICAgIHFxKGRyb3BBcmVhKS5hZGRDbGFzcyhvcHRpb25zLmNsYXNzZXMuZHJvcEFjdGl2ZSk7CiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBvbkxlYXZlTm90RGVzY2VuZGFudHM6IGZ1bmN0aW9uKGUpewogICAgICAgICAgICAgICAgcXEoZHJvcEFyZWEpLnJlbW92ZUNsYXNzKG9wdGlvbnMuY2xhc3Nlcy5kcm9wQWN0aXZlKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgb25Ecm9wOiBmdW5jdGlvbihlKXsKICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmhpZGVEcm9wem9uZXMpIHsKICAgICAgICAgICAgICAgICAgICBxcShkcm9wQXJlYSkuaGlkZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcXEoZHJvcEFyZWEpLnJlbW92ZUNsYXNzKG9wdGlvbnMuY2xhc3Nlcy5kcm9wQWN0aXZlKTsKCiAgICAgICAgICAgICAgICBoYW5kbGVEYXRhVHJhbnNmZXIoZS5kYXRhVHJhbnNmZXIpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIGRpc3Bvc2VTdXBwb3J0LmFkZERpc3Bvc2VyKGZ1bmN0aW9uKCkgewogICAgICAgICAgICBkei5kaXNwb3NlKCk7CiAgICAgICAgfSk7CgogICAgICAgIGlmIChvcHRpb25zLmhpZGVEcm9wem9uZXMpIHsKICAgICAgICAgICAgcXEoZHJvcEFyZWEpLmhpZGUoKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gaXNGaWxlRHJhZyhkcmFnRXZlbnQpIHsKICAgICAgICB2YXIgZmlsZURyYWc7CgogICAgICAgIHFxLmVhY2goZHJhZ0V2ZW50LmRhdGFUcmFuc2Zlci50eXBlcywgZnVuY3Rpb24oa2V5LCB2YWwpIHsKICAgICAgICAgICAgaWYgKHZhbCA9PT0gJ0ZpbGVzJykgewogICAgICAgICAgICAgICAgZmlsZURyYWcgPSB0cnVlOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIHJldHVybiBmaWxlRHJhZzsKICAgIH0KCiAgICBmdW5jdGlvbiBzZXR1cERyYWdEcm9wKCl7CiAgICAgICAgaWYgKG9wdGlvbnMuZHJvcEFyZWEpIHsKICAgICAgICAgICAgb3B0aW9ucy5leHRyYURyb3B6b25lcy5wdXNoKG9wdGlvbnMuZHJvcEFyZWEpOwogICAgICAgIH0KCiAgICAgICAgdmFyIGksIGRyb3B6b25lcyA9IG9wdGlvbnMuZXh0cmFEcm9wem9uZXM7CgogICAgICAgIGZvciAoaT0wOyBpIDwgZHJvcHpvbmVzLmxlbmd0aDsgaSs9MSl7CiAgICAgICAgICAgIHNldHVwRHJvcHpvbmUoZHJvcHpvbmVzW2ldKTsKICAgICAgICB9CgogICAgICAgIC8vIElFIDw9IDkgZG9lcyBub3Qgc3VwcG9ydCB0aGUgRmlsZSBBUEkgdXNlZCBmb3IgZHJhZytkcm9wIHVwbG9hZHMKICAgICAgICBpZiAob3B0aW9ucy5kcm9wQXJlYSAmJiAoIXFxLmllKCkgfHwgcXEuaWUxMCgpKSkgewogICAgICAgICAgICBkaXNwb3NlU3VwcG9ydC5hdHRhY2goZG9jdW1lbnQsICdkcmFnZW50ZXInLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICBpZiAoIWR6LmRyb3BEaXNhYmxlZCgpICYmIGlzRmlsZURyYWcoZSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAocXEob3B0aW9ucy5kcm9wQXJlYSkuaGFzQ2xhc3Mob3B0aW9ucy5jbGFzc2VzLmRyb3BEaXNhYmxlZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kcm9wQXJlYS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IGRyb3B6b25lcy5sZW5ndGg7IGkrPTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZHJvcHpvbmVzW2ldLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGRpc3Bvc2VTdXBwb3J0LmF0dGFjaChkb2N1bWVudCwgJ2RyYWdsZWF2ZScsIGZ1bmN0aW9uKGUpewogICAgICAgICAgICBpZiAob3B0aW9ucy5oaWRlRHJvcHpvbmVzICYmIHFxLkZpbmVVcGxvYWRlci5wcm90b3R5cGUuX2xlYXZpbmdfZG9jdW1lbnRfb3V0KGUpKSB7CiAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IGRyb3B6b25lcy5sZW5ndGg7IGkrPTEpIHsKICAgICAgICAgICAgICAgICAgICBxcShkcm9wem9uZXNbaV0pLmhpZGUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGRpc3Bvc2VTdXBwb3J0LmF0dGFjaChkb2N1bWVudCwgJ2Ryb3AnLCBmdW5jdGlvbihlKXsKICAgICAgICAgICAgaWYgKG9wdGlvbnMuaGlkZURyb3B6b25lcykgewogICAgICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBkcm9wem9uZXMubGVuZ3RoOyBpKz0xKSB7CiAgICAgICAgICAgICAgICAgICAgcXEoZHJvcHpvbmVzW2ldKS5oaWRlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIH0pOwogICAgfQoKICAgIHJldHVybiB7CiAgICAgICAgc2V0dXA6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBzZXR1cERyYWdEcm9wKCk7CiAgICAgICAgfSwKCiAgICAgICAgc2V0dXBFeHRyYURyb3B6b25lOiBmdW5jdGlvbihlbGVtZW50KSB7CiAgICAgICAgICAgIG9wdGlvbnMuZXh0cmFEcm9wem9uZXMucHVzaChlbGVtZW50KTsKICAgICAgICAgICAgc2V0dXBEcm9wem9uZShlbGVtZW50KTsKICAgICAgICB9LAoKICAgICAgICByZW1vdmVFeHRyYURyb3B6b25lOiBmdW5jdGlvbihlbGVtZW50KSB7CiAgICAgICAgICAgIHZhciBpLCBkenMgPSBvcHRpb25zLmV4dHJhRHJvcHpvbmVzOwogICAgICAgICAgICBmb3IoaSBpbiBkenMpIHsKICAgICAgICAgICAgICAgIGlmIChkenNbaV0gPT09IGVsZW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZHpzLnNwbGljZShpLCAxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRpc3Bvc2U6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBkaXNwb3NlU3VwcG9ydC5kaXNwb3NlKCk7CiAgICAgICAgICAgIGR6LmRpc3Bvc2UoKTsKICAgICAgICB9CiAgICB9Owp9OwoKCnFxLlVwbG9hZERyb3Bab25lID0gZnVuY3Rpb24obyl7CiAgICAidXNlIHN0cmljdCI7CgogICAgdmFyIG9wdGlvbnMsIGVsZW1lbnQsIHByZXZlbnREcm9wLCBkcm9wT3V0c2lkZURpc2FibGVkLCBkaXNwb3NlU3VwcG9ydCA9IG5ldyBxcS5EaXNwb3NlU3VwcG9ydCgpOwoKICAgIG9wdGlvbnMgPSB7CiAgICAgICAgZWxlbWVudDogbnVsbCwKICAgICAgICBvbkVudGVyOiBmdW5jdGlvbihlKXt9LAogICAgICAgIG9uTGVhdmU6IGZ1bmN0aW9uKGUpe30sCiAgICAgICAgLy8gaXMgbm90IGZpcmVkIHdoZW4gbGVhdmluZyBlbGVtZW50IGJ5IGhvdmVyaW5nIGRlc2NlbmRhbnRzCiAgICAgICAgb25MZWF2ZU5vdERlc2NlbmRhbnRzOiBmdW5jdGlvbihlKXt9LAogICAgICAgIG9uRHJvcDogZnVuY3Rpb24oZSl7fQogICAgfTsKCiAgICBxcS5leHRlbmQob3B0aW9ucywgbyk7CiAgICBlbGVtZW50ID0gb3B0aW9ucy5lbGVtZW50OwoKICAgIGZ1bmN0aW9uIGRyYWdvdmVyX3Nob3VsZF9iZV9jYW5jZWxlZCgpewogICAgICAgIHJldHVybiBxcS5zYWZhcmkoKSB8fCAocXEuZmlyZWZveCgpICYmIHFxLndpbmRvd3MoKSk7CiAgICB9CgogICAgZnVuY3Rpb24gZGlzYWJsZURyb3BPdXRzaWRlKGUpewogICAgICAgIC8vIHJ1biBvbmx5IG9uY2UgZm9yIGFsbCBpbnN0YW5jZXMKICAgICAgICBpZiAoIWRyb3BPdXRzaWRlRGlzYWJsZWQgKXsKCiAgICAgICAgICAgIC8vIGZvciB0aGVzZSBjYXNlcyB3ZSBuZWVkIHRvIGNhdGNoIG9uRHJvcCB0byByZXNldCBkcm9wQXJlYQogICAgICAgICAgICBpZiAoZHJhZ292ZXJfc2hvdWxkX2JlX2NhbmNlbGVkKXsKICAgICAgICAgICAgICAgZGlzcG9zZVN1cHBvcnQuYXR0YWNoKGRvY3VtZW50LCAnZHJhZ292ZXInLCBmdW5jdGlvbihlKXsKICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGRpc3Bvc2VTdXBwb3J0LmF0dGFjaChkb2N1bWVudCwgJ2RyYWdvdmVyJywgZnVuY3Rpb24oZSl7CiAgICAgICAgICAgICAgICAgICAgaWYgKGUuZGF0YVRyYW5zZmVyKXsKICAgICAgICAgICAgICAgICAgICAgICAgZS5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdub25lJzsKICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICBkcm9wT3V0c2lkZURpc2FibGVkID0gdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gaXNWYWxpZEZpbGVEcmFnKGUpewogICAgICAgIC8vIGUuZGF0YVRyYW5zZmVyIGN1cnJlbnRseSBjYXVzaW5nIElFIGVycm9ycwogICAgICAgIC8vIElFOSBkb2VzIE5PVCBzdXBwb3J0IGZpbGUgQVBJLCBzbyBkcmFnLWFuZC1kcm9wIGlzIG5vdCBwb3NzaWJsZQogICAgICAgIGlmIChxcS5pZSgpICYmICFxcS5pZTEwKCkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgdmFyIGVmZmVjdFRlc3QsIGR0ID0gZS5kYXRhVHJhbnNmZXIsCiAgICAgICAgLy8gZG8gbm90IGNoZWNrIGR0LnR5cGVzLmNvbnRhaW5zIGluIHdlYmtpdCwgYmVjYXVzZSBpdCBjcmFzaGVzIHNhZmFyaSA0CiAgICAgICAgaXNTYWZhcmkgPSBxcS5zYWZhcmkoKTsKCiAgICAgICAgLy8gZHQuZWZmZWN0QWxsb3dlZCBpcyBub25lIGluIFNhZmFyaSA1CiAgICAgICAgLy8gZHQudHlwZXMuY29udGFpbnMgY2hlY2sgaXMgZm9yIGZpcmVmb3gKICAgICAgICBlZmZlY3RUZXN0ID0gcXEuaWUxMCgpID8gdHJ1ZSA6IGR0LmVmZmVjdEFsbG93ZWQgIT09ICdub25lJzsKICAgICAgICByZXR1cm4gZHQgJiYgZWZmZWN0VGVzdCAmJiAoZHQuZmlsZXMgfHwgKCFpc1NhZmFyaSAmJiBkdC50eXBlcy5jb250YWlucyAmJiBkdC50eXBlcy5jb250YWlucygnRmlsZXMnKSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIGlzT3JTZXREcm9wRGlzYWJsZWQoaXNEaXNhYmxlZCkgewogICAgICAgIGlmIChpc0Rpc2FibGVkICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgcHJldmVudERyb3AgPSBpc0Rpc2FibGVkOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcHJldmVudERyb3A7CiAgICB9CgogICAgZnVuY3Rpb24gYXR0YWNoRXZlbnRzKCl7CiAgICAgICAgZGlzcG9zZVN1cHBvcnQuYXR0YWNoKGVsZW1lbnQsICdkcmFnb3ZlcicsIGZ1bmN0aW9uKGUpewogICAgICAgICAgICBpZiAoIWlzVmFsaWRGaWxlRHJhZyhlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgZWZmZWN0ID0gcXEuaWUoKSA/IG51bGwgOiBlLmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkOwogICAgICAgICAgICBpZiAoZWZmZWN0ID09PSAnbW92ZScgfHwgZWZmZWN0ID09PSAnbGlua01vdmUnKXsKICAgICAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnbW92ZSc7IC8vIGZvciBGRiAob25seSBtb3ZlIGFsbG93ZWQpCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBlLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gJ2NvcHknOyAvLyBmb3IgQ2hyb21lCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICB9KTsKCiAgICAgICAgZGlzcG9zZVN1cHBvcnQuYXR0YWNoKGVsZW1lbnQsICdkcmFnZW50ZXInLCBmdW5jdGlvbihlKXsKICAgICAgICAgICAgaWYgKCFpc09yU2V0RHJvcERpc2FibGVkKCkpIHsKICAgICAgICAgICAgICAgIGlmICghaXNWYWxpZEZpbGVEcmFnKGUpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgb3B0aW9ucy5vbkVudGVyKGUpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIGRpc3Bvc2VTdXBwb3J0LmF0dGFjaChlbGVtZW50LCAnZHJhZ2xlYXZlJywgZnVuY3Rpb24oZSl7CiAgICAgICAgICAgIGlmICghaXNWYWxpZEZpbGVEcmFnKGUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG9wdGlvbnMub25MZWF2ZShlKTsKCiAgICAgICAgICAgIHZhciByZWxhdGVkVGFyZ2V0ID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChlLmNsaWVudFgsIGUuY2xpZW50WSk7CiAgICAgICAgICAgIC8vIGRvIG5vdCBmaXJlIHdoZW4gbW92aW5nIGEgbW91c2Ugb3ZlciBhIGRlc2NlbmRhbnQKICAgICAgICAgICAgaWYgKHFxKHRoaXMpLmNvbnRhaW5zKHJlbGF0ZWRUYXJnZXQpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG9wdGlvbnMub25MZWF2ZU5vdERlc2NlbmRhbnRzKGUpOwogICAgICAgIH0pOwoKICAgICAgICBkaXNwb3NlU3VwcG9ydC5hdHRhY2goZWxlbWVudCwgJ2Ryb3AnLCBmdW5jdGlvbihlKXsKICAgICAgICAgICAgaWYgKCFpc09yU2V0RHJvcERpc2FibGVkKCkpIHsKICAgICAgICAgICAgICAgIGlmICghaXNWYWxpZEZpbGVEcmFnKGUpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIG9wdGlvbnMub25Ecm9wKGUpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CgogICAgZGlzYWJsZURyb3BPdXRzaWRlKCk7CiAgICBhdHRhY2hFdmVudHMoKTsKCiAgICByZXR1cm4gewogICAgICAgIGRyb3BEaXNhYmxlZDogZnVuY3Rpb24oaXNEaXNhYmxlZCkgewogICAgICAgICAgICByZXR1cm4gaXNPclNldERyb3BEaXNhYmxlZChpc0Rpc2FibGVkKTsKICAgICAgICB9LAoKICAgICAgICBkaXNwb3NlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgZGlzcG9zZVN1cHBvcnQuZGlzcG9zZSgpOwogICAgICAgIH0KICAgIH07Cn07Ci8qKgogKiBDbGFzcyB0aGF0IGNyZWF0ZXMgdXBsb2FkIHdpZGdldCB3aXRoIGRyYWctYW5kLWRyb3AgYW5kIGZpbGUgbGlzdAogKiBAaW5oZXJpdHMgcXEuRmluZVVwbG9hZGVyQmFzaWMKICovCnFxLkZpbmVVcGxvYWRlciA9IGZ1bmN0aW9uKG8pewogICAgLy8gY2FsbCBwYXJlbnQgY29uc3RydWN0b3IKICAgIHFxLkZpbmVVcGxvYWRlckJhc2ljLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CgogICAgLy8gYWRkaXRpb25hbCBvcHRpb25zCiAgICBxcS5leHRlbmQodGhpcy5fb3B0aW9ucywgewogICAgICAgIGVsZW1lbnQ6IG51bGwsCiAgICAgICAgbGlzdEVsZW1lbnQ6IG51bGwsCiAgICAgICAgZHJhZ0FuZERyb3A6IHsKICAgICAgICAgICAgZXh0cmFEcm9wem9uZXM6IFtdLAogICAgICAgICAgICBoaWRlRHJvcHpvbmVzOiB0cnVlLAogICAgICAgICAgICBkaXNhYmxlRGVmYXVsdERyb3B6b25lOiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgdGV4dDogewogICAgICAgICAgICB1cGxvYWRCdXR0b246ICdVcGxvYWQgYSBmaWxlJywKICAgICAgICAgICAgY2FuY2VsQnV0dG9uOiAnQ2FuY2VsJywKICAgICAgICAgICAgcmV0cnlCdXR0b246ICdSZXRyeScsCiAgICAgICAgICAgIGRlbGV0ZUJ1dHRvbjogJ0RlbGV0ZScsCiAgICAgICAgICAgIGZhaWxVcGxvYWQ6ICdVcGxvYWQgZmFpbGVkJywKICAgICAgICAgICAgZHJhZ1pvbmU6ICdEcm9wIGZpbGVzIGhlcmUgdG8gdXBsb2FkJywKICAgICAgICAgICAgZHJvcFByb2Nlc3Npbmc6ICdQcm9jZXNzaW5nIGRyb3BwZWQgZmlsZXMuLi4nLAogICAgICAgICAgICBmb3JtYXRQcm9ncmVzczogIntwZXJjZW50fSUgb2Yge3RvdGFsX3NpemV9IiwKICAgICAgICAgICAgd2FpdGluZ0ZvclJlc3BvbnNlOiAiUHJvY2Vzc2luZy4uLiIKICAgICAgICB9LAogICAgICAgIHRlbXBsYXRlOiAnPGRpdiBjbGFzcz0icXEtdXBsb2FkZXIiPicgKwogICAgICAgICAgICAoKCF0aGlzLl9vcHRpb25zLmRyYWdBbmREcm9wIHx8ICF0aGlzLl9vcHRpb25zLmRyYWdBbmREcm9wLmRpc2FibGVEZWZhdWx0RHJvcHpvbmUpID8gJzxkaXYgY2xhc3M9InFxLXVwbG9hZC1kcm9wLWFyZWEiPjxzcGFuPntkcmFnWm9uZVRleHR9PC9zcGFuPjwvZGl2PicgOiAnJykgKwogICAgICAgICAgICAoIXRoaXMuX29wdGlvbnMuYnV0dG9uID8gJzxkaXYgY2xhc3M9InFxLXVwbG9hZC1idXR0b24iPjxkaXY+e3VwbG9hZEJ1dHRvblRleHR9PC9kaXY+PC9kaXY+JyA6ICcnKSArCiAgICAgICAgICAgICc8c3BhbiBjbGFzcz0icXEtZHJvcC1wcm9jZXNzaW5nIj48c3Bhbj57ZHJvcFByb2Nlc3NpbmdUZXh0fTwvc3Bhbj48c3BhbiBjbGFzcz0icXEtZHJvcC1wcm9jZXNzaW5nLXNwaW5uZXIiPjwvc3Bhbj48L3NwYW4+JyArCiAgICAgICAgICAgICghdGhpcy5fb3B0aW9ucy5saXN0RWxlbWVudCA/ICc8dWwgY2xhc3M9InFxLXVwbG9hZC1saXN0Ij48L3VsPicgOiAnJykgKwogICAgICAgICAgICAnPC9kaXY+JywKCiAgICAgICAgLy8gdGVtcGxhdGUgZm9yIG9uZSBpdGVtIGluIGZpbGUgbGlzdAogICAgICAgIGZpbGVUZW1wbGF0ZTogJzxsaT4nICsKICAgICAgICAgICAgJzxkaXYgY2xhc3M9InFxLXByb2dyZXNzLWJhciI+PC9kaXY+JyArCiAgICAgICAgICAgICc8c3BhbiBjbGFzcz0icXEtdXBsb2FkLXNwaW5uZXIiPjwvc3Bhbj4nICsKICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJxcS11cGxvYWQtZmluaXNoZWQiPjwvc3Bhbj4nICsKICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJxcS11cGxvYWQtZmlsZSI+PC9zcGFuPicgKwogICAgICAgICAgICAnPHNwYW4gY2xhc3M9InFxLXVwbG9hZC1zaXplIj48L3NwYW4+JyArCiAgICAgICAgICAgICc8YSBjbGFzcz0icXEtdXBsb2FkLWNhbmNlbCIgaHJlZj0iIyI+e2NhbmNlbEJ1dHRvblRleHR9PC9hPicgKwogICAgICAgICAgICAnPGEgY2xhc3M9InFxLXVwbG9hZC1yZXRyeSIgaHJlZj0iIyI+e3JldHJ5QnV0dG9uVGV4dH08L2E+JyArCiAgICAgICAgICAgICc8YSBjbGFzcz0icXEtdXBsb2FkLWRlbGV0ZSIgaHJlZj0iIyI+e2RlbGV0ZUJ1dHRvblRleHR9PC9hPicgKwogICAgICAgICAgICAnPHNwYW4gY2xhc3M9InFxLXVwbG9hZC1zdGF0dXMtdGV4dCI+e3N0YXR1c1RleHR9PC9zcGFuPicgKwogICAgICAgICAgICAnPC9saT4nLAogICAgICAgIGNsYXNzZXM6IHsKICAgICAgICAgICAgYnV0dG9uOiAncXEtdXBsb2FkLWJ1dHRvbicsCiAgICAgICAgICAgIGRyb3A6ICdxcS11cGxvYWQtZHJvcC1hcmVhJywKICAgICAgICAgICAgZHJvcEFjdGl2ZTogJ3FxLXVwbG9hZC1kcm9wLWFyZWEtYWN0aXZlJywKICAgICAgICAgICAgZHJvcERpc2FibGVkOiAncXEtdXBsb2FkLWRyb3AtYXJlYS1kaXNhYmxlZCcsCiAgICAgICAgICAgIGxpc3Q6ICdxcS11cGxvYWQtbGlzdCcsCiAgICAgICAgICAgIHByb2dyZXNzQmFyOiAncXEtcHJvZ3Jlc3MtYmFyJywKICAgICAgICAgICAgZmlsZTogJ3FxLXVwbG9hZC1maWxlJywKICAgICAgICAgICAgc3Bpbm5lcjogJ3FxLXVwbG9hZC1zcGlubmVyJywKICAgICAgICAgICAgZmluaXNoZWQ6ICdxcS11cGxvYWQtZmluaXNoZWQnLAogICAgICAgICAgICByZXRyeWluZzogJ3FxLXVwbG9hZC1yZXRyeWluZycsCiAgICAgICAgICAgIHJldHJ5YWJsZTogJ3FxLXVwbG9hZC1yZXRyeWFibGUnLAogICAgICAgICAgICBzaXplOiAncXEtdXBsb2FkLXNpemUnLAogICAgICAgICAgICBjYW5jZWw6ICdxcS11cGxvYWQtY2FuY2VsJywKICAgICAgICAgICAgZGVsZXRlQnV0dG9uOiAncXEtdXBsb2FkLWRlbGV0ZScsCiAgICAgICAgICAgIHJldHJ5OiAncXEtdXBsb2FkLXJldHJ5JywKICAgICAgICAgICAgc3RhdHVzVGV4dDogJ3FxLXVwbG9hZC1zdGF0dXMtdGV4dCcsCgogICAgICAgICAgICBzdWNjZXNzOiAncXEtdXBsb2FkLXN1Y2Nlc3MnLAogICAgICAgICAgICBmYWlsOiAncXEtdXBsb2FkLWZhaWwnLAoKICAgICAgICAgICAgc3VjY2Vzc0ljb246IG51bGwsCiAgICAgICAgICAgIGZhaWxJY29uOiBudWxsLAoKICAgICAgICAgICAgZHJvcFByb2Nlc3Npbmc6ICdxcS1kcm9wLXByb2Nlc3NpbmcnLAogICAgICAgICAgICBkcm9wUHJvY2Vzc2luZ1NwaW5uZXI6ICdxcS1kcm9wLXByb2Nlc3Npbmctc3Bpbm5lcicKICAgICAgICB9LAogICAgICAgIGZhaWxlZFVwbG9hZFRleHREaXNwbGF5OiB7CiAgICAgICAgICAgIG1vZGU6ICdkZWZhdWx0JywgLy9kZWZhdWx0LCBjdXN0b20sIG9yIG5vbmUKICAgICAgICAgICAgbWF4Q2hhcnM6IDUwLAogICAgICAgICAgICByZXNwb25zZVByb3BlcnR5OiAnZXJyb3InLAogICAgICAgICAgICBlbmFibGVUb29sdGlwOiB0cnVlCiAgICAgICAgfSwKICAgICAgICBtZXNzYWdlczogewogICAgICAgICAgICB0b29NYW55RmlsZXNFcnJvcjogIllvdSBtYXkgb25seSBkcm9wIG9uZSBmaWxlIgogICAgICAgIH0sCiAgICAgICAgcmV0cnk6IHsKICAgICAgICAgICAgc2hvd0F1dG9SZXRyeU5vdGU6IHRydWUsCiAgICAgICAgICAgIGF1dG9SZXRyeU5vdGU6ICJSZXRyeWluZyB7cmV0cnlOdW19L3ttYXhBdXRvfS4uLiIsCiAgICAgICAgICAgIHNob3dCdXR0b246IGZhbHNlCiAgICAgICAgfSwKICAgICAgICBkZWxldGVGaWxlOiB7CiAgICAgICAgICAgIGZvcmNlQ29uZmlybTogZmFsc2UsCiAgICAgICAgICAgIGNvbmZpcm1NZXNzYWdlOiAiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB7ZmlsZW5hbWV9PyIsCiAgICAgICAgICAgIGRlbGV0aW5nU3RhdHVzVGV4dDogIkRlbGV0aW5nLi4uIiwKICAgICAgICAgICAgZGVsZXRpbmdGYWlsZWRUZXh0OiAiRGVsZXRlIGZhaWxlZCIKCiAgICAgICAgfSwKICAgICAgICBkaXNwbGF5OiB7CiAgICAgICAgICAgIGZpbGVTaXplT25TdWJtaXQ6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICBwYXN0ZTogewogICAgICAgICAgICBwcm9tcHRGb3JOYW1lOiBmYWxzZSwKICAgICAgICAgICAgbmFtZVByb21wdE1lc3NhZ2U6ICJQbGVhc2UgbmFtZSB0aGlzIGltYWdlIgogICAgICAgIH0sCiAgICAgICAgc2hvd01lc3NhZ2U6IGZ1bmN0aW9uKG1lc3NhZ2UpewogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgd2luZG93LmFsZXJ0KG1lc3NhZ2UpOwogICAgICAgICAgICB9LCAwKTsKICAgICAgICB9LAogICAgICAgIHNob3dDb25maXJtOiBmdW5jdGlvbihtZXNzYWdlLCBva0NhbGxiYWNrLCBjYW5jZWxDYWxsYmFjaykgewogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHdpbmRvdy5jb25maXJtKG1lc3NhZ2UpOwogICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgIG9rQ2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNhbmNlbENhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgY2FuY2VsQ2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgMCk7CiAgICAgICAgfSwKICAgICAgICBzaG93UHJvbXB0OiBmdW5jdGlvbihtZXNzYWdlLCBkZWZhdWx0VmFsdWUpIHsKICAgICAgICAgICAgdmFyIHByb21pc2UgPSBuZXcgcXEuUHJvbWlzZSgpLAogICAgICAgICAgICAgICAgcmV0VmFsID0gd2luZG93LnByb21wdChtZXNzYWdlLCBkZWZhdWx0VmFsdWUpOwoKICAgICAgICAgICAgLypqc2hpbnQgZXFlcWVxOiB0cnVlLCBlcW51bGw6IHRydWUqLwogICAgICAgICAgICBpZiAocmV0VmFsICE9IG51bGwgJiYgcXEudHJpbVN0cihyZXRWYWwpLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIHByb21pc2Uuc3VjY2VzcyhyZXRWYWwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcHJvbWlzZS5mYWlsdXJlKCJVbmRlZmluZWQgb3IgaW52YWxpZCB1c2VyLXN1cHBsaWVkIHZhbHVlLiIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcHJvbWlzZTsKICAgICAgICB9CiAgICB9LCB0cnVlKTsKCiAgICAvLyBvdmVyd3JpdGUgb3B0aW9ucyB3aXRoIHVzZXIgc3VwcGxpZWQKICAgIHFxLmV4dGVuZCh0aGlzLl9vcHRpb25zLCBvLCB0cnVlKTsKICAgIHRoaXMuX3dyYXBDYWxsYmFja3MoKTsKCiAgICAvLyBvdmVyd3JpdGUgdGhlIHVwbG9hZCBidXR0b24gdGV4dCBpZiBhbnkKICAgIC8vIHNhbWUgZm9yIHRoZSBDYW5jZWwgYnV0dG9uIGFuZCBGYWlsIG1lc3NhZ2UgdGV4dAogICAgdGhpcy5fb3B0aW9ucy50ZW1wbGF0ZSAgICAgPSB0aGlzLl9vcHRpb25zLnRlbXBsYXRlLnJlcGxhY2UoL1x7ZHJhZ1pvbmVUZXh0XH0vZywgdGhpcy5fb3B0aW9ucy50ZXh0LmRyYWdab25lKTsKICAgIHRoaXMuX29wdGlvbnMudGVtcGxhdGUgICAgID0gdGhpcy5fb3B0aW9ucy50ZW1wbGF0ZS5yZXBsYWNlKC9ce3VwbG9hZEJ1dHRvblRleHRcfS9nLCB0aGlzLl9vcHRpb25zLnRleHQudXBsb2FkQnV0dG9uKTsKICAgIHRoaXMuX29wdGlvbnMudGVtcGxhdGUgICAgID0gdGhpcy5fb3B0aW9ucy50ZW1wbGF0ZS5yZXBsYWNlKC9ce2Ryb3BQcm9jZXNzaW5nVGV4dFx9L2csIHRoaXMuX29wdGlvbnMudGV4dC5kcm9wUHJvY2Vzc2luZyk7CiAgICB0aGlzLl9vcHRpb25zLmZpbGVUZW1wbGF0ZSA9IHRoaXMuX29wdGlvbnMuZmlsZVRlbXBsYXRlLnJlcGxhY2UoL1x7Y2FuY2VsQnV0dG9uVGV4dFx9L2csIHRoaXMuX29wdGlvbnMudGV4dC5jYW5jZWxCdXR0b24pOwogICAgdGhpcy5fb3B0aW9ucy5maWxlVGVtcGxhdGUgPSB0aGlzLl9vcHRpb25zLmZpbGVUZW1wbGF0ZS5yZXBsYWNlKC9ce3JldHJ5QnV0dG9uVGV4dFx9L2csIHRoaXMuX29wdGlvbnMudGV4dC5yZXRyeUJ1dHRvbik7CiAgICB0aGlzLl9vcHRpb25zLmZpbGVUZW1wbGF0ZSA9IHRoaXMuX29wdGlvbnMuZmlsZVRlbXBsYXRlLnJlcGxhY2UoL1x7ZGVsZXRlQnV0dG9uVGV4dFx9L2csIHRoaXMuX29wdGlvbnMudGV4dC5kZWxldGVCdXR0b24pOwogICAgdGhpcy5fb3B0aW9ucy5maWxlVGVtcGxhdGUgPSB0aGlzLl9vcHRpb25zLmZpbGVUZW1wbGF0ZS5yZXBsYWNlKC9ce3N0YXR1c1RleHRcfS9nLCAiIik7CgogICAgdGhpcy5fZWxlbWVudCA9IHRoaXMuX29wdGlvbnMuZWxlbWVudDsKICAgIHRoaXMuX2VsZW1lbnQuaW5uZXJIVE1MID0gdGhpcy5fb3B0aW9ucy50ZW1wbGF0ZTsKICAgIHRoaXMuX2xpc3RFbGVtZW50ID0gdGhpcy5fb3B0aW9ucy5saXN0RWxlbWVudCB8fCB0aGlzLl9maW5kKHRoaXMuX2VsZW1lbnQsICdsaXN0Jyk7CgogICAgdGhpcy5fY2xhc3NlcyA9IHRoaXMuX29wdGlvbnMuY2xhc3NlczsKCiAgICBpZiAoIXRoaXMuX2J1dHRvbikgewogICAgICAgIHRoaXMuX2J1dHRvbiA9IHRoaXMuX2NyZWF0ZVVwbG9hZEJ1dHRvbih0aGlzLl9maW5kKHRoaXMuX2VsZW1lbnQsICdidXR0b24nKSk7CiAgICB9CgogICAgdGhpcy5fYmluZENhbmNlbEFuZFJldHJ5RXZlbnRzKCk7CgogICAgdGhpcy5fZG5kID0gdGhpcy5fc2V0dXBEcmFnQW5kRHJvcCgpOwoKICAgIGlmICh0aGlzLl9vcHRpb25zLnBhc3RlLnRhcmdldEVsZW1lbnQgJiYgdGhpcy5fb3B0aW9ucy5wYXN0ZS5wcm9tcHRGb3JOYW1lKSB7CiAgICAgICAgdGhpcy5fc2V0dXBQYXN0ZVByb21wdCgpOwogICAgfQp9OwoKLy8gaW5oZXJpdCBmcm9tIEJhc2ljIFVwbG9hZGVyCnFxLmV4dGVuZChxcS5GaW5lVXBsb2FkZXIucHJvdG90eXBlLCBxcS5GaW5lVXBsb2FkZXJCYXNpYy5wcm90b3R5cGUpOwoKcXEuZXh0ZW5kKHFxLkZpbmVVcGxvYWRlci5wcm90b3R5cGUsIHsKICAgIGNsZWFyU3RvcmVkRmlsZXM6IGZ1bmN0aW9uKCkgewogICAgICAgIHFxLkZpbmVVcGxvYWRlckJhc2ljLnByb3RvdHlwZS5jbGVhclN0b3JlZEZpbGVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgdGhpcy5fbGlzdEVsZW1lbnQuaW5uZXJIVE1MID0gIiI7CiAgICB9LAogICAgYWRkRXh0cmFEcm9wem9uZTogZnVuY3Rpb24oZWxlbWVudCl7CiAgICAgICAgdGhpcy5fZG5kLnNldHVwRXh0cmFEcm9wem9uZShlbGVtZW50KTsKICAgIH0sCiAgICByZW1vdmVFeHRyYURyb3B6b25lOiBmdW5jdGlvbihlbGVtZW50KXsKICAgICAgICByZXR1cm4gdGhpcy5fZG5kLnJlbW92ZUV4dHJhRHJvcHpvbmUoZWxlbWVudCk7CiAgICB9LAogICAgZ2V0SXRlbUJ5RmlsZUlkOiBmdW5jdGlvbihpZCl7CiAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLl9saXN0RWxlbWVudC5maXJzdENoaWxkOwoKICAgICAgICAvLyB0aGVyZSBjYW4ndCBiZSB0eHQgbm9kZXMgaW4gZHluYW1pY2FsbHkgY3JlYXRlZCBsaXN0CiAgICAgICAgLy8gYW5kIHdlIGNhbiAgdXNlIG5leHRTaWJsaW5nCiAgICAgICAgd2hpbGUgKGl0ZW0pewogICAgICAgICAgICBpZiAoaXRlbS5xcUZpbGVJZCA9PSBpZCkgcmV0dXJuIGl0ZW07CiAgICAgICAgICAgIGl0ZW0gPSBpdGVtLm5leHRTaWJsaW5nOwogICAgICAgIH0KICAgIH0sCiAgICByZXNldDogZnVuY3Rpb24oKSB7CiAgICAgICAgcXEuRmluZVVwbG9hZGVyQmFzaWMucHJvdG90eXBlLnJlc2V0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgdGhpcy5fZWxlbWVudC5pbm5lckhUTUwgPSB0aGlzLl9vcHRpb25zLnRlbXBsYXRlOwogICAgICAgIHRoaXMuX2xpc3RFbGVtZW50ID0gdGhpcy5fb3B0aW9ucy5saXN0RWxlbWVudCB8fCB0aGlzLl9maW5kKHRoaXMuX2VsZW1lbnQsICdsaXN0Jyk7CiAgICAgICAgaWYgKCF0aGlzLl9vcHRpb25zLmJ1dHRvbikgewogICAgICAgICAgICB0aGlzLl9idXR0b24gPSB0aGlzLl9jcmVhdGVVcGxvYWRCdXR0b24odGhpcy5fZmluZCh0aGlzLl9lbGVtZW50LCAnYnV0dG9uJykpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9iaW5kQ2FuY2VsQW5kUmV0cnlFdmVudHMoKTsKICAgICAgICB0aGlzLl9kbmQuZGlzcG9zZSgpOwogICAgICAgIHRoaXMuX2RuZCA9IHRoaXMuX3NldHVwRHJhZ0FuZERyb3AoKTsKICAgIH0sCiAgICBfcmVtb3ZlRmlsZUl0ZW06IGZ1bmN0aW9uKGZpbGVJZCkgewogICAgICAgIHZhciBpdGVtID0gdGhpcy5nZXRJdGVtQnlGaWxlSWQoZmlsZUlkKTsKICAgICAgICBxcShpdGVtKS5yZW1vdmUoKTsKICAgIH0sCiAgICBfc2V0dXBEcmFnQW5kRHJvcDogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHNlbGYgPSB0aGlzLAogICAgICAgICAgICBkcm9wUHJvY2Vzc2luZ0VsID0gdGhpcy5fZmluZCh0aGlzLl9lbGVtZW50LCAnZHJvcFByb2Nlc3NpbmcnKSwKICAgICAgICAgICAgZG5kLCBwcmV2ZW50U2VsZWN0RmlsZXMsIGRlZmF1bHREcm9wQXJlYUVsOwoKICAgICAgICBwcmV2ZW50U2VsZWN0RmlsZXMgPSBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIH07CgogICAgICAgIGlmICghdGhpcy5fb3B0aW9ucy5kcmFnQW5kRHJvcC5kaXNhYmxlRGVmYXVsdERyb3B6b25lKSB7CiAgICAgICAgICAgIGRlZmF1bHREcm9wQXJlYUVsID0gdGhpcy5fZmluZCh0aGlzLl9vcHRpb25zLmVsZW1lbnQsICdkcm9wJyk7CiAgICAgICAgfQoKICAgICAgICBkbmQgPSBuZXcgcXEuRHJhZ0FuZERyb3AoewogICAgICAgICAgICBkcm9wQXJlYTogZGVmYXVsdERyb3BBcmVhRWwsCiAgICAgICAgICAgIGV4dHJhRHJvcHpvbmVzOiB0aGlzLl9vcHRpb25zLmRyYWdBbmREcm9wLmV4dHJhRHJvcHpvbmVzLAogICAgICAgICAgICBoaWRlRHJvcHpvbmVzOiB0aGlzLl9vcHRpb25zLmRyYWdBbmREcm9wLmhpZGVEcm9wem9uZXMsCiAgICAgICAgICAgIG11bHRpcGxlOiB0aGlzLl9vcHRpb25zLm11bHRpcGxlLAogICAgICAgICAgICBjbGFzc2VzOiB7CiAgICAgICAgICAgICAgICBkcm9wQWN0aXZlOiB0aGlzLl9vcHRpb25zLmNsYXNzZXMuZHJvcEFjdGl2ZQogICAgICAgICAgICB9LAogICAgICAgICAgICBjYWxsYmFja3M6IHsKICAgICAgICAgICAgICAgIGRyb3BQcm9jZXNzaW5nOiBmdW5jdGlvbihpc1Byb2Nlc3NpbmcsIGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gc2VsZi5fYnV0dG9uLmdldElucHV0KCk7CgogICAgICAgICAgICAgICAgICAgIGlmIChpc1Byb2Nlc3NpbmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcXEoZHJvcFByb2Nlc3NpbmdFbCkuY3NzKHtkaXNwbGF5OiAnYmxvY2snfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHFxKGlucHV0KS5hdHRhY2goJ2NsaWNrJywgcHJldmVudFNlbGVjdEZpbGVzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHFxKGRyb3BQcm9jZXNzaW5nRWwpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcXEoaW5wdXQpLmRldGFjaCgnY2xpY2snLCBwcmV2ZW50U2VsZWN0RmlsZXMpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkRmlsZXMoZmlsZXMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24oY29kZSwgZmlsZW5hbWUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLl9pdGVtRXJyb3IoY29kZSwgZmlsZW5hbWUpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGxvZzogZnVuY3Rpb24obWVzc2FnZSwgbGV2ZWwpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZyhtZXNzYWdlLCBsZXZlbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgZG5kLnNldHVwKCk7CgogICAgICAgIHJldHVybiBkbmQ7CiAgICB9LAogICAgX2xlYXZpbmdfZG9jdW1lbnRfb3V0OiBmdW5jdGlvbihlKXsKICAgICAgICByZXR1cm4gKChxcS5jaHJvbWUoKSB8fCAocXEuc2FmYXJpKCkgJiYgcXEud2luZG93cygpKSkgJiYgZS5jbGllbnRYID09IDAgJiYgZS5jbGllbnRZID09IDApIC8vIG51bGwgY29vcmRzIGZvciBDaHJvbWUgYW5kIFNhZmFyaSBXaW5kb3dzCiAgICAgICAgICAgIHx8IChxcS5maXJlZm94KCkgJiYgIWUucmVsYXRlZFRhcmdldCk7IC8vIG51bGwgZS5yZWxhdGVkVGFyZ2V0IGZvciBGaXJlZm94CiAgICB9LAogICAgX3N0b3JlRm9yTGF0ZXI6IGZ1bmN0aW9uKGlkKSB7CiAgICAgICAgcXEuRmluZVVwbG9hZGVyQmFzaWMucHJvdG90eXBlLl9zdG9yZUZvckxhdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLmdldEl0ZW1CeUZpbGVJZChpZCk7CiAgICAgICAgcXEodGhpcy5fZmluZChpdGVtLCAnc3Bpbm5lcicpKS5oaWRlKCk7CiAgICB9LAogICAgLyoqCiAgICAgKiBHZXRzIG9uZSBvZiB0aGUgZWxlbWVudHMgbGlzdGVkIGluIHRoaXMuX29wdGlvbnMuY2xhc3NlcwogICAgICoqLwogICAgX2ZpbmQ6IGZ1bmN0aW9uKHBhcmVudCwgdHlwZSl7CiAgICAgICAgdmFyIGVsZW1lbnQgPSBxcShwYXJlbnQpLmdldEJ5Q2xhc3ModGhpcy5fb3B0aW9ucy5jbGFzc2VzW3R5cGVdKVswXTsKICAgICAgICBpZiAoIWVsZW1lbnQpewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VsZW1lbnQgbm90IGZvdW5kICcgKyB0eXBlKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBlbGVtZW50OwogICAgfSwKICAgIF9vblN1Ym1pdDogZnVuY3Rpb24oaWQsIG5hbWUpewogICAgICAgIHFxLkZpbmVVcGxvYWRlckJhc2ljLnByb3RvdHlwZS5fb25TdWJtaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB0aGlzLl9hZGRUb0xpc3QoaWQsIG5hbWUpOwogICAgfSwKICAgIC8vIFVwZGF0ZSB0aGUgcHJvZ3Jlc3MgYmFyICYgcGVyY2VudGFnZSBhcyB0aGUgZmlsZSBpcyB1cGxvYWRlZAogICAgX29uUHJvZ3Jlc3M6IGZ1bmN0aW9uKGlkLCBuYW1lLCBsb2FkZWQsIHRvdGFsKXsKICAgICAgICBxcS5GaW5lVXBsb2FkZXJCYXNpYy5wcm90b3R5cGUuX29uUHJvZ3Jlc3MuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKCiAgICAgICAgdmFyIGl0ZW0sIHByb2dyZXNzQmFyLCBwZXJjZW50LCBjYW5jZWxMaW5rOwoKICAgICAgICBpdGVtID0gdGhpcy5nZXRJdGVtQnlGaWxlSWQoaWQpOwogICAgICAgIHByb2dyZXNzQmFyID0gdGhpcy5fZmluZChpdGVtLCAncHJvZ3Jlc3NCYXInKTsKICAgICAgICBwZXJjZW50ID0gTWF0aC5yb3VuZChsb2FkZWQgLyB0b3RhbCAqIDEwMCk7CgogICAgICAgIGlmIChsb2FkZWQgPT09IHRvdGFsKSB7CiAgICAgICAgICAgIGNhbmNlbExpbmsgPSB0aGlzLl9maW5kKGl0ZW0sICdjYW5jZWwnKTsKICAgICAgICAgICAgcXEoY2FuY2VsTGluaykuaGlkZSgpOwoKICAgICAgICAgICAgcXEocHJvZ3Jlc3NCYXIpLmhpZGUoKTsKICAgICAgICAgICAgcXEodGhpcy5fZmluZChpdGVtLCAnc3RhdHVzVGV4dCcpKS5zZXRUZXh0KHRoaXMuX29wdGlvbnMudGV4dC53YWl0aW5nRm9yUmVzcG9uc2UpOwoKICAgICAgICAgICAgLy8gSWYgbGFzdCBieXRlIHdhcyBzZW50LCBkaXNwbGF5IHRvdGFsIGZpbGUgc2l6ZQogICAgICAgICAgICB0aGlzLl9kaXNwbGF5RmlsZVNpemUoaWQpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLy8gSWYgc3RpbGwgdXBsb2FkaW5nLCBkaXNwbGF5IHBlcmNlbnRhZ2UgLSB0b3RhbCBzaXplIGlzIGFjdHVhbGx5IHRoZSB0b3RhbCByZXF1ZXN0KHMpIHNpemUKICAgICAgICAgICAgdGhpcy5fZGlzcGxheUZpbGVTaXplKGlkLCBsb2FkZWQsIHRvdGFsKTsKCiAgICAgICAgICAgIHFxKHByb2dyZXNzQmFyKS5jc3Moe2Rpc3BsYXk6ICdibG9jayd9KTsKICAgICAgICB9CgogICAgICAgIC8vIFVwZGF0ZSBwcm9ncmVzcyBiYXIgZWxlbWVudAogICAgICAgIHFxKHByb2dyZXNzQmFyKS5jc3Moe3dpZHRoOiBwZXJjZW50ICsgJyUnfSk7CiAgICB9LAogICAgX29uQ29tcGxldGU6IGZ1bmN0aW9uKGlkLCBuYW1lLCByZXN1bHQsIHhocil7CiAgICAgICAgcXEuRmluZVVwbG9hZGVyQmFzaWMucHJvdG90eXBlLl9vbkNvbXBsZXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CgogICAgICAgIHZhciBpdGVtID0gdGhpcy5nZXRJdGVtQnlGaWxlSWQoaWQpOwoKICAgICAgICBxcSh0aGlzLl9maW5kKGl0ZW0sICdzdGF0dXNUZXh0JykpLmNsZWFyVGV4dCgpOwoKICAgICAgICBxcShpdGVtKS5yZW1vdmVDbGFzcyh0aGlzLl9jbGFzc2VzLnJldHJ5aW5nKTsKICAgICAgICBxcSh0aGlzLl9maW5kKGl0ZW0sICdwcm9ncmVzc0JhcicpKS5oaWRlKCk7CgogICAgICAgIGlmICghdGhpcy5fb3B0aW9ucy5kaXNhYmxlQ2FuY2VsRm9yRm9ybVVwbG9hZHMgfHwgcXEuaXNYaHJVcGxvYWRTdXBwb3J0ZWQoKSkgewogICAgICAgICAgICBxcSh0aGlzLl9maW5kKGl0ZW0sICdjYW5jZWwnKSkuaGlkZSgpOwogICAgICAgIH0KICAgICAgICBxcSh0aGlzLl9maW5kKGl0ZW0sICdzcGlubmVyJykpLmhpZGUoKTsKCiAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9pc0RlbGV0ZVBvc3NpYmxlKCkpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3Nob3dEZWxldGVMaW5rKGlkKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcXEoaXRlbSkuYWRkQ2xhc3ModGhpcy5fY2xhc3Nlcy5zdWNjZXNzKTsKICAgICAgICAgICAgaWYgKHRoaXMuX2NsYXNzZXMuc3VjY2Vzc0ljb24pIHsKICAgICAgICAgICAgICAgIHRoaXMuX2ZpbmQoaXRlbSwgJ2ZpbmlzaGVkJykuc3R5bGUuZGlzcGxheSA9ICJpbmxpbmUtYmxvY2siOwogICAgICAgICAgICAgICAgcXEoaXRlbSkuYWRkQ2xhc3ModGhpcy5fY2xhc3Nlcy5zdWNjZXNzSWNvbik7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBxcShpdGVtKS5hZGRDbGFzcyh0aGlzLl9jbGFzc2VzLmZhaWwpOwogICAgICAgICAgICBpZiAodGhpcy5fY2xhc3Nlcy5mYWlsSWNvbikgewogICAgICAgICAgICAgICAgdGhpcy5fZmluZChpdGVtLCAnZmluaXNoZWQnKS5zdHlsZS5kaXNwbGF5ID0gImlubGluZS1ibG9jayI7CiAgICAgICAgICAgICAgICBxcShpdGVtKS5hZGRDbGFzcyh0aGlzLl9jbGFzc2VzLmZhaWxJY29uKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5yZXRyeS5zaG93QnV0dG9uICYmICF0aGlzLl9wcmV2ZW50UmV0cmllc1tpZF0pIHsKICAgICAgICAgICAgICAgIHFxKGl0ZW0pLmFkZENsYXNzKHRoaXMuX2NsYXNzZXMucmV0cnlhYmxlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9jb250cm9sRmFpbHVyZVRleHREaXNwbGF5KGl0ZW0sIHJlc3VsdCk7CiAgICAgICAgfQogICAgfSwKICAgIF9vblVwbG9hZDogZnVuY3Rpb24oaWQsIG5hbWUpewogICAgICAgIHFxLkZpbmVVcGxvYWRlckJhc2ljLnByb3RvdHlwZS5fb25VcGxvYWQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKCiAgICAgICAgdGhpcy5fc2hvd1NwaW5uZXIoaWQpOwogICAgfSwKICAgIF9vbkNhbmNlbDogZnVuY3Rpb24oaWQsIG5hbWUpIHsKICAgICAgICBxcS5GaW5lVXBsb2FkZXJCYXNpYy5wcm90b3R5cGUuX29uQ2FuY2VsLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgdGhpcy5fcmVtb3ZlRmlsZUl0ZW0oaWQpOwogICAgfSwKICAgIF9vbkJlZm9yZUF1dG9SZXRyeTogZnVuY3Rpb24oaWQpIHsKICAgICAgICB2YXIgaXRlbSwgcHJvZ3Jlc3NCYXIsIGZhaWxUZXh0RWwsIHJldHJ5TnVtRm9yRGlzcGxheSwgbWF4QXV0bywgcmV0cnlOb3RlOwoKICAgICAgICBxcS5GaW5lVXBsb2FkZXJCYXNpYy5wcm90b3R5cGUuX29uQmVmb3JlQXV0b1JldHJ5LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CgogICAgICAgIGl0ZW0gPSB0aGlzLmdldEl0ZW1CeUZpbGVJZChpZCk7CiAgICAgICAgcHJvZ3Jlc3NCYXIgPSB0aGlzLl9maW5kKGl0ZW0sICdwcm9ncmVzc0JhcicpOwoKICAgICAgICB0aGlzLl9zaG93Q2FuY2VsTGluayhpdGVtKTsKICAgICAgICBwcm9ncmVzc0Jhci5zdHlsZS53aWR0aCA9IDA7CiAgICAgICAgcXEocHJvZ3Jlc3NCYXIpLmhpZGUoKTsKCiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMucmV0cnkuc2hvd0F1dG9SZXRyeU5vdGUpIHsKICAgICAgICAgICAgZmFpbFRleHRFbCA9IHRoaXMuX2ZpbmQoaXRlbSwgJ3N0YXR1c1RleHQnKTsKICAgICAgICAgICAgcmV0cnlOdW1Gb3JEaXNwbGF5ID0gdGhpcy5fYXV0b1JldHJpZXNbaWRdICsgMTsKICAgICAgICAgICAgbWF4QXV0byA9IHRoaXMuX29wdGlvbnMucmV0cnkubWF4QXV0b0F0dGVtcHRzOwoKICAgICAgICAgICAgcmV0cnlOb3RlID0gdGhpcy5fb3B0aW9ucy5yZXRyeS5hdXRvUmV0cnlOb3RlLnJlcGxhY2UoL1x7cmV0cnlOdW1cfS9nLCByZXRyeU51bUZvckRpc3BsYXkpOwogICAgICAgICAgICByZXRyeU5vdGUgPSByZXRyeU5vdGUucmVwbGFjZSgvXHttYXhBdXRvXH0vZywgbWF4QXV0byk7CgogICAgICAgICAgICBxcShmYWlsVGV4dEVsKS5zZXRUZXh0KHJldHJ5Tm90ZSk7CiAgICAgICAgICAgIGlmIChyZXRyeU51bUZvckRpc3BsYXkgPT09IDEpIHsKICAgICAgICAgICAgICAgIHFxKGl0ZW0pLmFkZENsYXNzKHRoaXMuX2NsYXNzZXMucmV0cnlpbmcpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSwKICAgIC8vcmV0dXJuIGZhbHNlIGlmIHdlIHNob3VsZCBub3QgYXR0ZW1wdCB0aGUgcmVxdWVzdGVkIHJldHJ5CiAgICBfb25CZWZvcmVNYW51YWxSZXRyeTogZnVuY3Rpb24oaWQpIHsKICAgICAgICB2YXIgaXRlbSA9IHRoaXMuZ2V0SXRlbUJ5RmlsZUlkKGlkKTsKCiAgICAgICAgaWYgKHFxLkZpbmVVcGxvYWRlckJhc2ljLnByb3RvdHlwZS5fb25CZWZvcmVNYW51YWxSZXRyeS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSB7CiAgICAgICAgICAgIHRoaXMuX2ZpbmQoaXRlbSwgJ3Byb2dyZXNzQmFyJykuc3R5bGUud2lkdGggPSAwOwogICAgICAgICAgICBxcShpdGVtKS5yZW1vdmVDbGFzcyh0aGlzLl9jbGFzc2VzLmZhaWwpOwogICAgICAgICAgICBxcSh0aGlzLl9maW5kKGl0ZW0sICdzdGF0dXNUZXh0JykpLmNsZWFyVGV4dCgpOwogICAgICAgICAgICB0aGlzLl9zaG93U3Bpbm5lcihpZCk7CiAgICAgICAgICAgIHRoaXMuX3Nob3dDYW5jZWxMaW5rKGl0ZW0pOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHFxKGl0ZW0pLmFkZENsYXNzKHRoaXMuX2NsYXNzZXMucmV0cnlhYmxlKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0sCiAgICBfb25TdWJtaXREZWxldGU6IGZ1bmN0aW9uKGlkKSB7CiAgICAgICAgaWYgKHRoaXMuX2lzRGVsZXRlUG9zc2libGUoKSkgewogICAgICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5jYWxsYmFja3Mub25TdWJtaXREZWxldGUoaWQpICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMuZGVsZXRlRmlsZS5mb3JjZUNvbmZpcm0pIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaG93RGVsZXRlQ29uZmlybShpZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZW5kRGVsZXRlUmVxdWVzdChpZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRoaXMubG9nKCJEZWxldGUgcmVxdWVzdCBpZ25vcmVkIGZvciBmaWxlIElEICIgKyBpZCArICIsIGRlbGV0ZSBmZWF0dXJlIGlzIGRpc2FibGVkLiIsICJ3YXJuIik7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9LAogICAgX29uRGVsZXRlQ29tcGxldGU6IGZ1bmN0aW9uKGlkLCB4aHIsIGlzRXJyb3IpIHsKICAgICAgICBxcS5GaW5lVXBsb2FkZXJCYXNpYy5wcm90b3R5cGUuX29uRGVsZXRlQ29tcGxldGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKCiAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLmdldEl0ZW1CeUZpbGVJZChpZCksCiAgICAgICAgICAgIHNwaW5uZXJFbCA9IHRoaXMuX2ZpbmQoaXRlbSwgJ3NwaW5uZXInKSwKICAgICAgICAgICAgc3RhdHVzVGV4dEVsID0gdGhpcy5fZmluZChpdGVtLCAnc3RhdHVzVGV4dCcpOwoKICAgICAgICBxcShzcGlubmVyRWwpLmhpZGUoKTsKCiAgICAgICAgaWYgKGlzRXJyb3IpIHsKICAgICAgICAgICAgcXEoc3RhdHVzVGV4dEVsKS5zZXRUZXh0KHRoaXMuX29wdGlvbnMuZGVsZXRlRmlsZS5kZWxldGluZ0ZhaWxlZFRleHQpOwogICAgICAgICAgICB0aGlzLl9zaG93RGVsZXRlTGluayhpZCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aGlzLl9yZW1vdmVGaWxlSXRlbShpZCk7CiAgICAgICAgfQogICAgfSwKICAgIF9zZW5kRGVsZXRlUmVxdWVzdDogZnVuY3Rpb24oaWQpIHsKICAgICAgICB2YXIgaXRlbSA9IHRoaXMuZ2V0SXRlbUJ5RmlsZUlkKGlkKSwKICAgICAgICAgICAgZGVsZXRlTGluayA9IHRoaXMuX2ZpbmQoaXRlbSwgJ2RlbGV0ZUJ1dHRvbicpLAogICAgICAgICAgICBzdGF0dXNUZXh0RWwgPSB0aGlzLl9maW5kKGl0ZW0sICdzdGF0dXNUZXh0Jyk7CgogICAgICAgIHFxKGRlbGV0ZUxpbmspLmhpZGUoKTsKICAgICAgICB0aGlzLl9zaG93U3Bpbm5lcihpZCk7CiAgICAgICAgcXEoc3RhdHVzVGV4dEVsKS5zZXRUZXh0KHRoaXMuX29wdGlvbnMuZGVsZXRlRmlsZS5kZWxldGluZ1N0YXR1c1RleHQpOwogICAgICAgIHRoaXMuX2RlbGV0ZUhhbmRsZXIuc2VuZERlbGV0ZShpZCwgdGhpcy5nZXRVdWlkKGlkKSk7CiAgICB9LAogICAgX3Nob3dEZWxldGVDb25maXJtOiBmdW5jdGlvbihpZCkgewogICAgICAgIHZhciBmaWxlTmFtZSA9IHRoaXMuX2hhbmRsZXIuZ2V0TmFtZShpZCksCiAgICAgICAgICAgIGNvbmZpcm1NZXNzYWdlID0gdGhpcy5fb3B0aW9ucy5kZWxldGVGaWxlLmNvbmZpcm1NZXNzYWdlLnJlcGxhY2UoL1x7ZmlsZW5hbWVcfS9nLCBmaWxlTmFtZSksCiAgICAgICAgICAgIHV1aWQgPSB0aGlzLmdldFV1aWQoaWQpLAogICAgICAgICAgICBzZWxmID0gdGhpczsKCiAgICAgICAgdGhpcy5fb3B0aW9ucy5zaG93Q29uZmlybShjb25maXJtTWVzc2FnZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHNlbGYuX3NlbmREZWxldGVSZXF1ZXN0KGlkKTsKICAgICAgICB9KTsKICAgIH0sCiAgICBfYWRkVG9MaXN0OiBmdW5jdGlvbihpZCwgbmFtZSl7CiAgICAgICAgdmFyIGl0ZW0gPSBxcS50b0VsZW1lbnQodGhpcy5fb3B0aW9ucy5maWxlVGVtcGxhdGUpOwogICAgICAgIGlmICh0aGlzLl9vcHRpb25zLmRpc2FibGVDYW5jZWxGb3JGb3JtVXBsb2FkcyAmJiAhcXEuaXNYaHJVcGxvYWRTdXBwb3J0ZWQoKSkgewogICAgICAgICAgICB2YXIgY2FuY2VsTGluayA9IHRoaXMuX2ZpbmQoaXRlbSwgJ2NhbmNlbCcpOwogICAgICAgICAgICBxcShjYW5jZWxMaW5rKS5yZW1vdmUoKTsKICAgICAgICB9CgogICAgICAgIGl0ZW0ucXFGaWxlSWQgPSBpZDsKCiAgICAgICAgdmFyIGZpbGVFbGVtZW50ID0gdGhpcy5fZmluZChpdGVtLCAnZmlsZScpOwogICAgICAgIHFxKGZpbGVFbGVtZW50KS5zZXRUZXh0KHRoaXMuX29wdGlvbnMuZm9ybWF0RmlsZU5hbWUobmFtZSkpOwogICAgICAgIHFxKHRoaXMuX2ZpbmQoaXRlbSwgJ3NpemUnKSkuaGlkZSgpOwogICAgICAgIGlmICghdGhpcy5fb3B0aW9ucy5tdWx0aXBsZSkgewogICAgICAgICAgICB0aGlzLl9oYW5kbGVyLmNhbmNlbEFsbCgpOwogICAgICAgICAgICB0aGlzLl9jbGVhckxpc3QoKTsKICAgICAgICB9CgogICAgICAgIHRoaXMuX2xpc3RFbGVtZW50LmFwcGVuZENoaWxkKGl0ZW0pOwoKICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5kaXNwbGF5LmZpbGVTaXplT25TdWJtaXQgJiYgcXEuaXNYaHJVcGxvYWRTdXBwb3J0ZWQoKSkgewogICAgICAgICAgICB0aGlzLl9kaXNwbGF5RmlsZVNpemUoaWQpOwogICAgICAgIH0KICAgIH0sCiAgICBfY2xlYXJMaXN0OiBmdW5jdGlvbigpewogICAgICAgIHRoaXMuX2xpc3RFbGVtZW50LmlubmVySFRNTCA9ICcnOwogICAgICAgIHRoaXMuY2xlYXJTdG9yZWRGaWxlcygpOwogICAgfSwKICAgIF9kaXNwbGF5RmlsZVNpemU6IGZ1bmN0aW9uKGlkLCBsb2FkZWRTaXplLCB0b3RhbFNpemUpIHsKICAgICAgICB2YXIgaXRlbSA9IHRoaXMuZ2V0SXRlbUJ5RmlsZUlkKGlkKSwKICAgICAgICAgICAgc2l6ZSA9IHRoaXMuZ2V0U2l6ZShpZCksCiAgICAgICAgICAgIHNpemVGb3JEaXNwbGF5ID0gdGhpcy5fZm9ybWF0U2l6ZShzaXplKSwKICAgICAgICAgICAgc2l6ZUVsID0gdGhpcy5fZmluZChpdGVtLCAnc2l6ZScpOwoKICAgICAgICBpZiAobG9hZGVkU2l6ZSAhPT0gdW5kZWZpbmVkICYmIHRvdGFsU2l6ZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIHNpemVGb3JEaXNwbGF5ID0gdGhpcy5fZm9ybWF0UHJvZ3Jlc3MobG9hZGVkU2l6ZSwgdG90YWxTaXplKTsKICAgICAgICB9CgogICAgICAgIHFxKHNpemVFbCkuY3NzKHtkaXNwbGF5OiAnaW5saW5lJ30pOwogICAgICAgIHFxKHNpemVFbCkuc2V0VGV4dChzaXplRm9yRGlzcGxheSk7CiAgICB9LAogICAgLyoqCiAgICAgKiBkZWxlZ2F0ZSBjbGljayBldmVudCBmb3IgY2FuY2VsICYgcmV0cnkgbGlua3MKICAgICAqKi8KICAgIF9iaW5kQ2FuY2VsQW5kUmV0cnlFdmVudHM6IGZ1bmN0aW9uKCl7CiAgICAgICAgdmFyIHNlbGYgPSB0aGlzLAogICAgICAgICAgICBsaXN0ID0gdGhpcy5fbGlzdEVsZW1lbnQ7CgogICAgICAgIHRoaXMuX2Rpc3Bvc2VTdXBwb3J0LmF0dGFjaChsaXN0LCAnY2xpY2snLCBmdW5jdGlvbihlKXsKICAgICAgICAgICAgZSA9IGUgfHwgd2luZG93LmV2ZW50OwogICAgICAgICAgICB2YXIgdGFyZ2V0ID0gZS50YXJnZXQgfHwgZS5zcmNFbGVtZW50OwoKICAgICAgICAgICAgaWYgKHFxKHRhcmdldCkuaGFzQ2xhc3Moc2VsZi5fY2xhc3Nlcy5jYW5jZWwpIHx8IHFxKHRhcmdldCkuaGFzQ2xhc3Moc2VsZi5fY2xhc3Nlcy5yZXRyeSkgfHwgcXEodGFyZ2V0KS5oYXNDbGFzcyhzZWxmLl9jbGFzc2VzLmRlbGV0ZUJ1dHRvbikpewogICAgICAgICAgICAgICAgcXEucHJldmVudERlZmF1bHQoZSk7CgogICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSB0YXJnZXQucGFyZW50Tm9kZTsKICAgICAgICAgICAgICAgIHdoaWxlKGl0ZW0ucXFGaWxlSWQgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgIGl0ZW0gPSB0YXJnZXQgPSB0YXJnZXQucGFyZW50Tm9kZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAocXEodGFyZ2V0KS5oYXNDbGFzcyhzZWxmLl9jbGFzc2VzLmRlbGV0ZUJ1dHRvbikpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLmRlbGV0ZUZpbGUoaXRlbS5xcUZpbGVJZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChxcSh0YXJnZXQpLmhhc0NsYXNzKHNlbGYuX2NsYXNzZXMuY2FuY2VsKSkgewogICAgICAgICAgICAgICAgICAgIHNlbGYuY2FuY2VsKGl0ZW0ucXFGaWxlSWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcXEoaXRlbSkucmVtb3ZlQ2xhc3Moc2VsZi5fY2xhc3Nlcy5yZXRyeWFibGUpOwogICAgICAgICAgICAgICAgICAgIHNlbGYucmV0cnkoaXRlbS5xcUZpbGVJZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0sCiAgICBfZm9ybWF0UHJvZ3Jlc3M6IGZ1bmN0aW9uICh1cGxvYWRlZFNpemUsIHRvdGFsU2l6ZSkgewogICAgICAgIHZhciBtZXNzYWdlID0gdGhpcy5fb3B0aW9ucy50ZXh0LmZvcm1hdFByb2dyZXNzOwogICAgICAgIGZ1bmN0aW9uIHIobmFtZSwgcmVwbGFjZW1lbnQpIHsgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZShuYW1lLCByZXBsYWNlbWVudCk7IH0KCiAgICAgICAgcigne3BlcmNlbnR9JywgTWF0aC5yb3VuZCh1cGxvYWRlZFNpemUgLyB0b3RhbFNpemUgKiAxMDApKTsKICAgICAgICByKCd7dG90YWxfc2l6ZX0nLCB0aGlzLl9mb3JtYXRTaXplKHRvdGFsU2l6ZSkpOwogICAgICAgIHJldHVybiBtZXNzYWdlOwogICAgfSwKICAgIF9jb250cm9sRmFpbHVyZVRleHREaXNwbGF5OiBmdW5jdGlvbihpdGVtLCByZXNwb25zZSkgewogICAgICAgIHZhciBtb2RlLCBtYXhDaGFycywgcmVzcG9uc2VQcm9wZXJ0eSwgZmFpbHVyZVJlYXNvbiwgc2hvcnRGYWlsdXJlUmVhc29uOwoKICAgICAgICBtb2RlID0gdGhpcy5fb3B0aW9ucy5mYWlsZWRVcGxvYWRUZXh0RGlzcGxheS5tb2RlOwogICAgICAgIG1heENoYXJzID0gdGhpcy5fb3B0aW9ucy5mYWlsZWRVcGxvYWRUZXh0RGlzcGxheS5tYXhDaGFyczsKICAgICAgICByZXNwb25zZVByb3BlcnR5ID0gdGhpcy5fb3B0aW9ucy5mYWlsZWRVcGxvYWRUZXh0RGlzcGxheS5yZXNwb25zZVByb3BlcnR5OwoKICAgICAgICBpZiAobW9kZSA9PT0gJ2N1c3RvbScpIHsKICAgICAgICAgICAgZmFpbHVyZVJlYXNvbiA9IHJlc3BvbnNlW3Jlc3BvbnNlUHJvcGVydHldOwogICAgICAgICAgICBpZiAoZmFpbHVyZVJlYXNvbikgewogICAgICAgICAgICAgICAgaWYgKGZhaWx1cmVSZWFzb24ubGVuZ3RoID4gbWF4Q2hhcnMpIHsKICAgICAgICAgICAgICAgICAgICBzaG9ydEZhaWx1cmVSZWFzb24gPSBmYWlsdXJlUmVhc29uLnN1YnN0cmluZygwLCBtYXhDaGFycykgKyAnLi4uJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGZhaWx1cmVSZWFzb24gPSB0aGlzLl9vcHRpb25zLnRleHQuZmFpbFVwbG9hZDsKICAgICAgICAgICAgICAgIHRoaXMubG9nKCInIiArIHJlc3BvbnNlUHJvcGVydHkgKyAiJyBpcyBub3QgYSB2YWxpZCBwcm9wZXJ0eSBvbiB0aGUgc2VydmVyIHJlc3BvbnNlLiIsICd3YXJuJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHFxKHRoaXMuX2ZpbmQoaXRlbSwgJ3N0YXR1c1RleHQnKSkuc2V0VGV4dChzaG9ydEZhaWx1cmVSZWFzb24gfHwgZmFpbHVyZVJlYXNvbik7CgogICAgICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5mYWlsZWRVcGxvYWRUZXh0RGlzcGxheS5lbmFibGVUb29sdGlwKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9zaG93VG9vbHRpcChpdGVtLCBmYWlsdXJlUmVhc29uKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChtb2RlID09PSAnZGVmYXVsdCcpIHsKICAgICAgICAgICAgcXEodGhpcy5fZmluZChpdGVtLCAnc3RhdHVzVGV4dCcpKS5zZXRUZXh0KHRoaXMuX29wdGlvbnMudGV4dC5mYWlsVXBsb2FkKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAobW9kZSAhPT0gJ25vbmUnKSB7CiAgICAgICAgICAgIHRoaXMubG9nKCJmYWlsZWRVcGxvYWRUZXh0RGlzcGxheS5tb2RlIHZhbHVlIG9mICciICsgbW9kZSArICInIGlzIG5vdCB2YWxpZCIsICd3YXJuJyk7CiAgICAgICAgfQogICAgfSwKICAgIF9zaG93VG9vbHRpcDogZnVuY3Rpb24oaXRlbSwgdGV4dCkgewogICAgICAgIGl0ZW0udGl0bGUgPSB0ZXh0OwogICAgfSwKICAgIF9zaG93U3Bpbm5lcjogZnVuY3Rpb24oaWQpIHsKICAgICAgICB2YXIgaXRlbSA9IHRoaXMuZ2V0SXRlbUJ5RmlsZUlkKGlkKSwKICAgICAgICAgICAgc3Bpbm5lckVsID0gdGhpcy5fZmluZChpdGVtLCAnc3Bpbm5lcicpOwoKICAgICAgICBzcGlubmVyRWwuc3R5bGUuZGlzcGxheSA9ICJpbmxpbmUtYmxvY2siOwogICAgfSwKICAgIF9zaG93Q2FuY2VsTGluazogZnVuY3Rpb24oaXRlbSkgewogICAgICAgIGlmICghdGhpcy5fb3B0aW9ucy5kaXNhYmxlQ2FuY2VsRm9yRm9ybVVwbG9hZHMgfHwgcXEuaXNYaHJVcGxvYWRTdXBwb3J0ZWQoKSkgewogICAgICAgICAgICB2YXIgY2FuY2VsTGluayA9IHRoaXMuX2ZpbmQoaXRlbSwgJ2NhbmNlbCcpOwoKICAgICAgICAgICAgcXEoY2FuY2VsTGluaykuY3NzKHtkaXNwbGF5OiAnaW5saW5lJ30pOwogICAgICAgIH0KICAgIH0sCiAgICBfc2hvd0RlbGV0ZUxpbms6IGZ1bmN0aW9uKGlkKSB7CiAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLmdldEl0ZW1CeUZpbGVJZChpZCksCiAgICAgICAgICAgIGRlbGV0ZUxpbmsgPSB0aGlzLl9maW5kKGl0ZW0sICdkZWxldGVCdXR0b24nKTsKCiAgICAgICAgcXEoZGVsZXRlTGluaykuY3NzKHtkaXNwbGF5OiAnaW5saW5lJ30pOwogICAgfSwKICAgIF9pdGVtRXJyb3I6IGZ1bmN0aW9uKGNvZGUsIG5hbWUpewogICAgICAgIHZhciBtZXNzYWdlID0gcXEuRmluZVVwbG9hZGVyQmFzaWMucHJvdG90eXBlLl9pdGVtRXJyb3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB0aGlzLl9vcHRpb25zLnNob3dNZXNzYWdlKG1lc3NhZ2UpOwogICAgfSwKICAgIF9iYXRjaEVycm9yOiBmdW5jdGlvbihtZXNzYWdlKSB7CiAgICAgICAgcXEuRmluZVVwbG9hZGVyQmFzaWMucHJvdG90eXBlLl9iYXRjaEVycm9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgdGhpcy5fb3B0aW9ucy5zaG93TWVzc2FnZShtZXNzYWdlKTsKICAgIH0sCiAgICBfc2V0dXBQYXN0ZVByb21wdDogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICB0aGlzLl9vcHRpb25zLmNhbGxiYWNrcy5vblBhc3RlUmVjZWl2ZWQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBzZWxmLl9vcHRpb25zLnBhc3RlLm5hbWVQcm9tcHRNZXNzYWdlLAogICAgICAgICAgICAgICAgZGVmYXVsdFZhbCA9IHNlbGYuX29wdGlvbnMucGFzdGUuZGVmYXVsdE5hbWU7CgogICAgICAgICAgICByZXR1cm4gc2VsZi5fb3B0aW9ucy5zaG93UHJvbXB0KG1lc3NhZ2UsIGRlZmF1bHRWYWwpOwogICAgICAgIH07CiAgICB9Cn0pOwovKiogR2VuZXJpYyBjbGFzcyBmb3Igc2VuZGluZyBub24tdXBsb2FkIGFqYXggcmVxdWVzdHMgYW5kIGhhbmRsaW5nIHRoZSBhc3NvY2lhdGVkIHJlc3BvbnNlcyAqKi8KLy9UT0RPIFVzZSBYRG9tYWluUmVxdWVzdCBpZiBleHBlY3RDb3JzID0gdHJ1ZS4gIE5vdCBuZWNlc3Nhcnkgbm93IHNpbmNlIG9ubHkgREVMRVRFIHJlcXVlc3RzIGFyZSBzZW50IGFuZCBYRFIgZG9lc24ndCBzdXBwb3J0IHByZS1mbGlnaHRpbmcuCi8qZ2xvYmFscyBxcSwgWE1MSHR0cFJlcXVlc3QqLwpxcS5BamF4UmVxdWVzdG9yID0gZnVuY3Rpb24obykgewogICAgInVzZSBzdHJpY3QiOwoKICAgIHZhciBsb2csIHNob3VsZFBhcmFtc0JlSW5RdWVyeVN0cmluZywKICAgICAgICBxdWV1ZSA9IFtdLAogICAgICAgIHJlcXVlc3RTdGF0ZSA9IFtdLAogICAgICAgIG9wdGlvbnMgPSB7CiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgICAgICBtYXhDb25uZWN0aW9uczogMywKICAgICAgICAgICAgY3VzdG9tSGVhZGVyczoge30sCiAgICAgICAgICAgIGVuZHBvaW50U3RvcmU6IHt9LAogICAgICAgICAgICBwYXJhbXNTdG9yZToge30sCiAgICAgICAgICAgIHN1Y2Nlc3NmdWxSZXNwb25zZUNvZGVzOiBbMjAwXSwKICAgICAgICAgICAgZGVtb01vZGU6IGZhbHNlLAogICAgICAgICAgICBjb3JzOiB7CiAgICAgICAgICAgICAgICBleHBlY3RlZDogZmFsc2UsCiAgICAgICAgICAgICAgICBzZW5kQ3JlZGVudGlhbHM6IGZhbHNlCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGxvZzogZnVuY3Rpb24oc3RyLCBsZXZlbCkge30sCiAgICAgICAgICAgIG9uU2VuZDogZnVuY3Rpb24oaWQpIHt9LAogICAgICAgICAgICBvbkNvbXBsZXRlOiBmdW5jdGlvbihpZCwgeGhyLCBpc0Vycm9yKSB7fSwKICAgICAgICAgICAgb25DYW5jZWw6IGZ1bmN0aW9uKGlkKSB7fQogICAgICAgIH07CgogICAgcXEuZXh0ZW5kKG9wdGlvbnMsIG8pOwogICAgbG9nID0gb3B0aW9ucy5sb2c7CiAgICBzaG91bGRQYXJhbXNCZUluUXVlcnlTdHJpbmcgPSBnZXRNZXRob2QoKSA9PT0gJ0dFVCcgfHwgZ2V0TWV0aG9kKCkgPT09ICdERUxFVEUnOwoKCiAgICAvKioKICAgICAqIFJlbW92ZXMgZWxlbWVudCBmcm9tIHF1ZXVlLCBzZW5kcyBuZXh0IHJlcXVlc3QKICAgICAqLwogICAgZnVuY3Rpb24gZGVxdWV1ZShpZCkgewogICAgICAgIHZhciBpID0gcXEuaW5kZXhPZihxdWV1ZSwgaWQpLAogICAgICAgICAgICBtYXggPSBvcHRpb25zLm1heENvbm5lY3Rpb25zLAogICAgICAgICAgICBuZXh0SWQ7CgogICAgICAgIGRlbGV0ZSByZXF1ZXN0U3RhdGVbaWRdOwogICAgICAgIHF1ZXVlLnNwbGljZShpLCAxKTsKCiAgICAgICAgaWYgKHF1ZXVlLmxlbmd0aCA+PSBtYXggJiYgaSA8IG1heCl7CiAgICAgICAgICAgIG5leHRJZCA9IHF1ZXVlW21heC0xXTsKICAgICAgICAgICAgc2VuZFJlcXVlc3QobmV4dElkKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gb25Db21wbGV0ZShpZCkgewogICAgICAgIHZhciB4aHIgPSByZXF1ZXN0U3RhdGVbaWRdLnhociwKICAgICAgICAgICAgbWV0aG9kID0gZ2V0TWV0aG9kKCksCiAgICAgICAgICAgIGlzRXJyb3IgPSBmYWxzZTsKCiAgICAgICAgZGVxdWV1ZShpZCk7CgogICAgICAgIGlmICghaXNSZXNwb25zZVN1Y2Nlc3NmdWwoeGhyLnN0YXR1cykpIHsKICAgICAgICAgICAgaXNFcnJvciA9IHRydWU7CiAgICAgICAgICAgIGxvZyhtZXRob2QgKyAiIHJlcXVlc3QgZm9yICIgKyBpZCArICIgaGFzIGZhaWxlZCAtIHJlc3BvbnNlIGNvZGUgIiArIHhoci5zdGF0dXMsICJlcnJvciIpOwogICAgICAgIH0KCiAgICAgICAgb3B0aW9ucy5vbkNvbXBsZXRlKGlkLCB4aHIsIGlzRXJyb3IpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbmRSZXF1ZXN0KGlkKSB7CiAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpLAogICAgICAgICAgICBtZXRob2QgPSBnZXRNZXRob2QoKSwKICAgICAgICAgICAgcGFyYW1zID0ge30sCiAgICAgICAgICAgIHVybDsKCiAgICAgICAgb3B0aW9ucy5vblNlbmQoaWQpOwoKICAgICAgICBpZiAob3B0aW9ucy5wYXJhbXNTdG9yZS5nZXRQYXJhbXMpIHsKICAgICAgICAgICAgcGFyYW1zID0gb3B0aW9ucy5wYXJhbXNTdG9yZS5nZXRQYXJhbXMoaWQpOwogICAgICAgIH0KCiAgICAgICAgdXJsID0gY3JlYXRlVXJsKGlkLCBwYXJhbXMpOwoKICAgICAgICByZXF1ZXN0U3RhdGVbaWRdLnhociA9IHhocjsKICAgICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZ2V0UmVhZHlTdGF0ZUNoYW5nZUhhbmRsZXIoaWQpOwogICAgICAgIHhoci5vcGVuKG1ldGhvZCwgdXJsLCB0cnVlKTsKCiAgICAgICAgaWYgKG9wdGlvbnMuY29ycy5leHBlY3RlZCAmJiBvcHRpb25zLmNvcnMuc2VuZENyZWRlbnRpYWxzKSB7CiAgICAgICAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgc2V0SGVhZGVycyhpZCk7CgogICAgICAgIGxvZygnU2VuZGluZyAnICsgbWV0aG9kICsgIiByZXF1ZXN0IGZvciAiICsgaWQpOwogICAgICAgIGlmICghc2hvdWxkUGFyYW1zQmVJblF1ZXJ5U3RyaW5nICYmIHBhcmFtcykgewogICAgICAgICAgICB4aHIuc2VuZChxcS5vYmoydXJsKHBhcmFtcywgIiIpKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHhoci5zZW5kKCk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0ZVVybChpZCwgcGFyYW1zKSB7CiAgICAgICAgdmFyIGVuZHBvaW50ID0gb3B0aW9ucy5lbmRwb2ludFN0b3JlLmdldEVuZHBvaW50KGlkKSwKICAgICAgICAgICAgYWRkVG9QYXRoID0gcmVxdWVzdFN0YXRlW2lkXS5hZGRUb1BhdGg7CgogICAgICAgIGlmIChhZGRUb1BhdGggIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBlbmRwb2ludCArPSAiLyIgKyBhZGRUb1BhdGg7CiAgICAgICAgfQoKICAgICAgICBpZiAoc2hvdWxkUGFyYW1zQmVJblF1ZXJ5U3RyaW5nICYmIHBhcmFtcykgewogICAgICAgICAgICByZXR1cm4gcXEub2JqMnVybChwYXJhbXMsIGVuZHBvaW50KTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBlbmRwb2ludDsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0UmVhZHlTdGF0ZUNoYW5nZUhhbmRsZXIoaWQpIHsKICAgICAgICB2YXIgeGhyID0gcmVxdWVzdFN0YXRlW2lkXS54aHI7CgogICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSA0KSB7CiAgICAgICAgICAgICAgICBvbkNvbXBsZXRlKGlkLCB4aHIpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZXRIZWFkZXJzKGlkKSB7CiAgICAgICAgdmFyIHhociA9IHJlcXVlc3RTdGF0ZVtpZF0ueGhyLAogICAgICAgICAgICBjdXN0b21IZWFkZXJzID0gb3B0aW9ucy5jdXN0b21IZWFkZXJzOwoKICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcigiWC1SZXF1ZXN0ZWQtV2l0aCIsICJYTUxIdHRwUmVxdWVzdCIpOwogICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCJDYWNoZS1Db250cm9sIiwgIm5vLWNhY2hlIik7CgogICAgICAgIHFxLmVhY2goY3VzdG9tSGVhZGVycywgZnVuY3Rpb24obmFtZSwgdmFsKSB7CiAgICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKG5hbWUsIHZhbCk7CiAgICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gY2FuY2VsUmVxdWVzdChpZCkgewogICAgICAgIHZhciB4aHIgPSByZXF1ZXN0U3RhdGVbaWRdLnhociwKICAgICAgICAgICAgbWV0aG9kID0gZ2V0TWV0aG9kKCk7CgogICAgICAgIGlmICh4aHIpIHsKICAgICAgICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7CiAgICAgICAgICAgIHhoci5hYm9ydCgpOwogICAgICAgICAgICBkZXF1ZXVlKGlkKTsKCiAgICAgICAgICAgIGxvZygnQ2FuY2VsbGVkICcgKyBtZXRob2QgKyAiIGZvciAiICsgaWQpOwogICAgICAgICAgICBvcHRpb25zLm9uQ2FuY2VsKGlkKTsKCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIGZ1bmN0aW9uIGlzUmVzcG9uc2VTdWNjZXNzZnVsKHJlc3BvbnNlQ29kZSkgewogICAgICAgIHJldHVybiBxcS5pbmRleE9mKG9wdGlvbnMuc3VjY2Vzc2Z1bFJlc3BvbnNlQ29kZXMsIHJlc3BvbnNlQ29kZSkgPj0gMDsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRNZXRob2QoKSB7CiAgICAgICAgaWYgKG9wdGlvbnMuZGVtb01vZGUpIHsKICAgICAgICAgICAgcmV0dXJuICJHRVQiOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG9wdGlvbnMubWV0aG9kOwogICAgfQoKCiAgICByZXR1cm4gewogICAgICAgIHNlbmQ6IGZ1bmN0aW9uKGlkLCBhZGRUb1BhdGgpIHsKICAgICAgICAgICAgcmVxdWVzdFN0YXRlW2lkXSA9IHsKICAgICAgICAgICAgICAgIGFkZFRvUGF0aDogYWRkVG9QYXRoCiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgbGVuID0gcXVldWUucHVzaChpZCk7CgogICAgICAgICAgICAvLyBpZiB0b28gbWFueSBhY3RpdmUgY29ubmVjdGlvbnMsIHdhaXQuLi4KICAgICAgICAgICAgaWYgKGxlbiA8PSBvcHRpb25zLm1heENvbm5lY3Rpb25zKXsKICAgICAgICAgICAgICAgIHNlbmRSZXF1ZXN0KGlkKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgY2FuY2VsOiBmdW5jdGlvbihpZCkgewogICAgICAgICAgICByZXR1cm4gY2FuY2VsUmVxdWVzdChpZCk7CiAgICAgICAgfQogICAgfTsKfTsKLyoqIEdlbmVyaWMgY2xhc3MgZm9yIHNlbmRpbmcgbm9uLXVwbG9hZCBhamF4IHJlcXVlc3RzIGFuZCBoYW5kbGluZyB0aGUgYXNzb2NpYXRlZCByZXNwb25zZXMgKiovCi8qZ2xvYmFscyBxcSwgWE1MSHR0cFJlcXVlc3QqLwpxcS5EZWxldGVGaWxlQWpheFJlcXVlc3RvciA9IGZ1bmN0aW9uKG8pIHsKICAgICJ1c2Ugc3RyaWN0IjsKCiAgICB2YXIgcmVxdWVzdG9yLAogICAgICAgIG9wdGlvbnMgPSB7CiAgICAgICAgICAgIGVuZHBvaW50U3RvcmU6IHt9LAogICAgICAgICAgICBtYXhDb25uZWN0aW9uczogMywKICAgICAgICAgICAgY3VzdG9tSGVhZGVyczoge30sCiAgICAgICAgICAgIHBhcmFtc1N0b3JlOiB7fSwKICAgICAgICAgICAgZGVtb01vZGU6IGZhbHNlLAogICAgICAgICAgICBjb3JzOiB7CiAgICAgICAgICAgICAgICBleHBlY3RlZDogZmFsc2UsCiAgICAgICAgICAgICAgICBzZW5kQ3JlZGVudGlhbHM6IGZhbHNlCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGxvZzogZnVuY3Rpb24oc3RyLCBsZXZlbCkge30sCiAgICAgICAgICAgIG9uRGVsZXRlOiBmdW5jdGlvbihpZCkge30sCiAgICAgICAgICAgIG9uRGVsZXRlQ29tcGxldGU6IGZ1bmN0aW9uKGlkLCB4aHIsIGlzRXJyb3IpIHt9CiAgICAgICAgfTsKCiAgICBxcS5leHRlbmQob3B0aW9ucywgbyk7CgogICAgcmVxdWVzdG9yID0gbmV3IHFxLkFqYXhSZXF1ZXN0b3IoewogICAgICAgIG1ldGhvZDogJ0RFTEVURScsCiAgICAgICAgZW5kcG9pbnRTdG9yZTogb3B0aW9ucy5lbmRwb2ludFN0b3JlLAogICAgICAgIHBhcmFtc1N0b3JlOiBvcHRpb25zLnBhcmFtc1N0b3JlLAogICAgICAgIG1heENvbm5lY3Rpb25zOiBvcHRpb25zLm1heENvbm5lY3Rpb25zLAogICAgICAgIGN1c3RvbUhlYWRlcnM6IG9wdGlvbnMuY3VzdG9tSGVhZGVycywKICAgICAgICBzdWNjZXNzZnVsUmVzcG9uc2VDb2RlczogWzIwMCwgMjAyLCAyMDRdLAogICAgICAgIGRlbW9Nb2RlOiBvcHRpb25zLmRlbW9Nb2RlLAogICAgICAgIGxvZzogb3B0aW9ucy5sb2csCiAgICAgICAgb25TZW5kOiBvcHRpb25zLm9uRGVsZXRlLAogICAgICAgIG9uQ29tcGxldGU6IG9wdGlvbnMub25EZWxldGVDb21wbGV0ZQogICAgfSk7CgoKICAgIHJldHVybiB7CiAgICAgICAgc2VuZERlbGV0ZTogZnVuY3Rpb24oaWQsIHV1aWQpIHsKICAgICAgICAgICAgcmVxdWVzdG9yLnNlbmQoaWQsIHV1aWQpOwogICAgICAgICAgICBvcHRpb25zLmxvZygiU3VibWl0dGVkIGRlbGV0ZSBmaWxlIHJlcXVlc3QgZm9yICIgKyBpZCk7CiAgICAgICAgfQogICAgfTsKfTsKcXEuV2luZG93UmVjZWl2ZU1lc3NhZ2UgPSBmdW5jdGlvbihvKSB7CiAgICB2YXIgb3B0aW9ucyA9IHsKICAgICAgICAgICAgbG9nOiBmdW5jdGlvbihtZXNzYWdlLCBsZXZlbCkge30KICAgICAgICB9LAogICAgICAgIGNhbGxiYWNrV3JhcHBlckRldGFjaGVycyA9IHt9OwoKICAgIHFxLmV4dGVuZChvcHRpb25zLCBvKTsKCiAgICByZXR1cm4gewogICAgICAgIHJlY2VpdmVNZXNzYWdlIDogZnVuY3Rpb24oaWQsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciBvbk1lc3NhZ2VDYWxsYmFja1dyYXBwZXIgPSBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGV2ZW50LmRhdGEpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmICh3aW5kb3cucG9zdE1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrV3JhcHBlckRldGFjaGVyc1tpZF0gPSBxcSh3aW5kb3cpLmF0dGFjaCgibWVzc2FnZSIsIG9uTWVzc2FnZUNhbGxiYWNrV3JhcHBlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBsb2coImlmcmFtZSBtZXNzYWdlIHBhc3Npbmcgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGJyb3dzZXIhIiwgImVycm9yIik7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBzdG9wUmVjZWl2aW5nTWVzc2FnZXMgOiBmdW5jdGlvbihpZCkgewogICAgICAgICAgICBpZiAod2luZG93LnBvc3RNZXNzYWdlKSB7CiAgICAgICAgICAgICAgICB2YXIgZGV0YWNoZXIgPSBjYWxsYmFja1dyYXBwZXJEZXRhY2hlcnNbaWRdOwogICAgICAgICAgICAgICAgaWYgKGRldGFjaGVyKSB7CiAgICAgICAgICAgICAgICAgICAgZGV0YWNoZXIoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07Cn07Ci8qKgogKiBDbGFzcyBmb3IgdXBsb2FkaW5nIGZpbGVzLCB1cGxvYWRpbmcgaXRzZWxmIGlzIGhhbmRsZWQgYnkgY2hpbGQgY2xhc3NlcwogKi8KLypnbG9iYWxzIHFxKi8KcXEuVXBsb2FkSGFuZGxlciA9IGZ1bmN0aW9uKG8pIHsKICAgICJ1c2Ugc3RyaWN0IjsKCiAgICB2YXIgcXVldWUgPSBbXSwKICAgICAgICBvcHRpb25zLCBsb2csIGRlcXVldWUsIGhhbmRsZXJJbXBsOwoKICAgIC8vIERlZmF1bHQgb3B0aW9ucywgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIHVzZXIKICAgIG9wdGlvbnMgPSB7CiAgICAgICAgZGVidWc6IGZhbHNlLAogICAgICAgIGZvcmNlTXVsdGlwYXJ0OiB0cnVlLAogICAgICAgIHBhcmFtc0luQm9keTogZmFsc2UsCiAgICAgICAgcGFyYW1zU3RvcmU6IHt9LAogICAgICAgIGVuZHBvaW50U3RvcmU6IHt9LAogICAgICAgIGNvcnM6IHsKICAgICAgICAgICAgZXhwZWN0ZWQ6IGZhbHNlLAogICAgICAgICAgICBzZW5kQ3JlZGVudGlhbHM6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICBtYXhDb25uZWN0aW9uczogMywgLy8gbWF4aW11bSBudW1iZXIgb2YgY29uY3VycmVudCB1cGxvYWRzCiAgICAgICAgdXVpZFBhcmFtTmFtZTogJ3FxdXVpZCcsCiAgICAgICAgdG90YWxGaWxlU2l6ZVBhcmFtTmFtZTogJ3FxdG90YWxmaWxlc2l6ZScsCiAgICAgICAgY2h1bmtpbmc6IHsKICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCiAgICAgICAgICAgIHBhcnRTaXplOiAyMDAwMDAwLCAvL2J5dGVzCiAgICAgICAgICAgIHBhcmFtTmFtZXM6IHsKICAgICAgICAgICAgICAgIHBhcnRJbmRleDogJ3FxcGFydGluZGV4JywKICAgICAgICAgICAgICAgIHBhcnRCeXRlT2Zmc2V0OiAncXFwYXJ0Ynl0ZW9mZnNldCcsCiAgICAgICAgICAgICAgICBjaHVua1NpemU6ICdxcWNodW5rc2l6ZScsCiAgICAgICAgICAgICAgICB0b3RhbFBhcnRzOiAncXF0b3RhbHBhcnRzJywKICAgICAgICAgICAgICAgIGZpbGVuYW1lOiAncXFmaWxlbmFtZScKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgcmVzdW1lOiB7CiAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAogICAgICAgICAgICBpZDogbnVsbCwKICAgICAgICAgICAgY29va2llc0V4cGlyZUluOiA3LCAvL2RheXMKICAgICAgICAgICAgcGFyYW1OYW1lczogewogICAgICAgICAgICAgICAgcmVzdW1pbmc6ICJxcXJlc3VtZSIKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgYmxvYnM6IHsKICAgICAgICAgICAgcGFyYW1OYW1lczogewogICAgICAgICAgICAgICAgbmFtZTogJ3FxYmxvYm5hbWUnCiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIGxvZzogZnVuY3Rpb24oc3RyLCBsZXZlbCkge30sCiAgICAgICAgb25Qcm9ncmVzczogZnVuY3Rpb24oaWQsIGZpbGVOYW1lLCBsb2FkZWQsIHRvdGFsKXt9LAogICAgICAgIG9uQ29tcGxldGU6IGZ1bmN0aW9uKGlkLCBmaWxlTmFtZSwgcmVzcG9uc2UsIHhocil7fSwKICAgICAgICBvbkNhbmNlbDogZnVuY3Rpb24oaWQsIGZpbGVOYW1lKXt9LAogICAgICAgIG9uVXBsb2FkOiBmdW5jdGlvbihpZCwgZmlsZU5hbWUpe30sCiAgICAgICAgb25VcGxvYWRDaHVuazogZnVuY3Rpb24oaWQsIGZpbGVOYW1lLCBjaHVua0RhdGEpe30sCiAgICAgICAgb25BdXRvUmV0cnk6IGZ1bmN0aW9uKGlkLCBmaWxlTmFtZSwgcmVzcG9uc2UsIHhocil7fSwKICAgICAgICBvblJlc3VtZTogZnVuY3Rpb24oaWQsIGZpbGVOYW1lLCBjaHVua0RhdGEpe30KCiAgICB9OwogICAgcXEuZXh0ZW5kKG9wdGlvbnMsIG8pOwoKICAgIGxvZyA9IG9wdGlvbnMubG9nOwoKICAgIC8qKgogICAgICogUmVtb3ZlcyBlbGVtZW50IGZyb20gcXVldWUsIHN0YXJ0cyB1cGxvYWQgb2YgbmV4dAogICAgICovCiAgICBkZXF1ZXVlID0gZnVuY3Rpb24oaWQpIHsKICAgICAgICB2YXIgaSA9IHFxLmluZGV4T2YocXVldWUsIGlkKSwKICAgICAgICAgICAgbWF4ID0gb3B0aW9ucy5tYXhDb25uZWN0aW9ucywKICAgICAgICAgICAgbmV4dElkOwoKICAgICAgICBpZiAoaSA+PSAwKSB7CiAgICAgICAgICAgIHF1ZXVlLnNwbGljZShpLCAxKTsKCiAgICAgICAgICAgIGlmIChxdWV1ZS5sZW5ndGggPj0gbWF4ICYmIGkgPCBtYXgpewogICAgICAgICAgICAgICAgbmV4dElkID0gcXVldWVbbWF4LTFdOwogICAgICAgICAgICAgICAgaGFuZGxlckltcGwudXBsb2FkKG5leHRJZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIGlmIChxcS5pc1hoclVwbG9hZFN1cHBvcnRlZCgpKSB7CiAgICAgICAgaGFuZGxlckltcGwgPSBuZXcgcXEuVXBsb2FkSGFuZGxlclhocihvcHRpb25zLCBkZXF1ZXVlLCBsb2cpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgaGFuZGxlckltcGwgPSBuZXcgcXEuVXBsb2FkSGFuZGxlckZvcm0ob3B0aW9ucywgZGVxdWV1ZSwgbG9nKTsKICAgIH0KCgogICAgcmV0dXJuIHsKICAgICAgICAvKioKICAgICAgICAgKiBBZGRzIGZpbGUgb3IgZmlsZSBpbnB1dCB0byB0aGUgcXVldWUKICAgICAgICAgKiBAcmV0dXJucyBpZAogICAgICAgICAqKi8KICAgICAgICBhZGQ6IGZ1bmN0aW9uKGZpbGUpewogICAgICAgICAgICByZXR1cm4gaGFuZGxlckltcGwuYWRkKGZpbGUpOwogICAgICAgIH0sCiAgICAgICAgLyoqCiAgICAgICAgICogU2VuZHMgdGhlIGZpbGUgaWRlbnRpZmllZCBieSBpZAogICAgICAgICAqLwogICAgICAgIHVwbG9hZDogZnVuY3Rpb24oaWQpewogICAgICAgICAgICB2YXIgbGVuID0gcXVldWUucHVzaChpZCk7CgogICAgICAgICAgICAvLyBpZiB0b28gbWFueSBhY3RpdmUgdXBsb2Fkcywgd2FpdC4uLgogICAgICAgICAgICBpZiAobGVuIDw9IG9wdGlvbnMubWF4Q29ubmVjdGlvbnMpewogICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXJJbXBsLnVwbG9hZChpZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHJldHJ5OiBmdW5jdGlvbihpZCkgewogICAgICAgICAgICB2YXIgaSA9IHFxLmluZGV4T2YocXVldWUsIGlkKTsKICAgICAgICAgICAgaWYgKGkgPj0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXJJbXBsLnVwbG9hZChpZCwgdHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy51cGxvYWQoaWQpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAvKioKICAgICAgICAgKiBDYW5jZWxzIGZpbGUgdXBsb2FkIGJ5IGlkCiAgICAgICAgICovCiAgICAgICAgY2FuY2VsOiBmdW5jdGlvbihpZCkgewogICAgICAgICAgICBsb2coJ0NhbmNlbGxpbmcgJyArIGlkKTsKICAgICAgICAgICAgb3B0aW9ucy5wYXJhbXNTdG9yZS5yZW1vdmUoaWQpOwogICAgICAgICAgICBoYW5kbGVySW1wbC5jYW5jZWwoaWQpOwogICAgICAgICAgICBkZXF1ZXVlKGlkKTsKICAgICAgICB9LAogICAgICAgIC8qKgogICAgICAgICAqIENhbmNlbHMgYWxsIHF1ZXVlZCBvciBpbi1wcm9ncmVzcyB1cGxvYWRzCiAgICAgICAgICovCiAgICAgICAgY2FuY2VsQWxsOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzLAogICAgICAgICAgICAgICAgcXVldWVDb3B5ID0gW107CgogICAgICAgICAgICBxcS5leHRlbmQocXVldWVDb3B5LCBxdWV1ZSk7CiAgICAgICAgICAgIHFxLmVhY2gocXVldWVDb3B5LCBmdW5jdGlvbihpZHgsIGZpbGVJZCkgewogICAgICAgICAgICAgICAgc2VsZi5jYW5jZWwoZmlsZUlkKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBxdWV1ZSA9IFtdOwogICAgICAgIH0sCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBuYW1lIG9mIHRoZSBmaWxlIGlkZW50aWZpZWQgYnkgaWQKICAgICAgICAgKi8KICAgICAgICBnZXROYW1lOiBmdW5jdGlvbihpZCl7CiAgICAgICAgICAgIHJldHVybiBoYW5kbGVySW1wbC5nZXROYW1lKGlkKTsKICAgICAgICB9LAogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgc2l6ZSBvZiB0aGUgZmlsZSBpZGVudGlmaWVkIGJ5IGlkCiAgICAgICAgICovCiAgICAgICAgZ2V0U2l6ZTogZnVuY3Rpb24oaWQpewogICAgICAgICAgICBpZiAoaGFuZGxlckltcGwuZ2V0U2l6ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXJJbXBsLmdldFNpemUoaWQpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBnZXRGaWxlOiBmdW5jdGlvbihpZCkgewogICAgICAgICAgICBpZiAoaGFuZGxlckltcGwuZ2V0RmlsZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXJJbXBsLmdldEZpbGUoaWQpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGlkIG9mIGZpbGVzIGJlaW5nIHVwbG9hZGVkIG9yCiAgICAgICAgICogd2FpdGluZyBmb3IgdGhlaXIgdHVybgogICAgICAgICAqLwogICAgICAgIGdldFF1ZXVlOiBmdW5jdGlvbigpewogICAgICAgICAgICByZXR1cm4gcXVldWU7CiAgICAgICAgfSwKICAgICAgICByZXNldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGxvZygnUmVzZXR0aW5nIHVwbG9hZCBoYW5kbGVyJyk7CiAgICAgICAgICAgIHF1ZXVlID0gW107CiAgICAgICAgICAgIGhhbmRsZXJJbXBsLnJlc2V0KCk7CiAgICAgICAgfSwKICAgICAgICBnZXRVdWlkOiBmdW5jdGlvbihpZCkgewogICAgICAgICAgICByZXR1cm4gaGFuZGxlckltcGwuZ2V0VXVpZChpZCk7CiAgICAgICAgfSwKICAgICAgICAvKioKICAgICAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIGZpbGUgZXhpc3RzLgogICAgICAgICAqLwogICAgICAgIGlzVmFsaWQ6IGZ1bmN0aW9uKGlkKSB7CiAgICAgICAgICAgIHJldHVybiBoYW5kbGVySW1wbC5pc1ZhbGlkKGlkKTsKICAgICAgICB9LAogICAgICAgIGdldFJlc3VtYWJsZUZpbGVzRGF0YTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmIChoYW5kbGVySW1wbC5nZXRSZXN1bWFibGVGaWxlc0RhdGEpIHsKICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVySW1wbC5nZXRSZXN1bWFibGVGaWxlc0RhdGEoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfQogICAgfTsKfTsKLypnbG9iYWxzIHFxLCBkb2N1bWVudCwgc2V0VGltZW91dCovCi8qZ2xvYmFscyBjbGVhclRpbWVvdXQqLwpxcS5VcGxvYWRIYW5kbGVyRm9ybSA9IGZ1bmN0aW9uKG8sIHVwbG9hZENvbXBsZXRlQ2FsbGJhY2ssIGxvZ0NhbGxiYWNrKSB7CiAgICAidXNlIHN0cmljdCI7CgogICAgdmFyIG9wdGlvbnMgPSBvLAogICAgICAgIGlucHV0cyA9IFtdLAogICAgICAgIHV1aWRzID0gW10sCiAgICAgICAgZGV0YWNoTG9hZEV2ZW50cyA9IHt9LAogICAgICAgIHBvc3RNZXNzYWdlQ2FsbGJhY2tUaW1lcnMgPSB7fSwKICAgICAgICB1cGxvYWRDb21wbGV0ZSA9IHVwbG9hZENvbXBsZXRlQ2FsbGJhY2ssCiAgICAgICAgbG9nID0gbG9nQ2FsbGJhY2ssCiAgICAgICAgY29yc01lc3NhZ2VSZWNlaXZlciA9IG5ldyBxcS5XaW5kb3dSZWNlaXZlTWVzc2FnZSh7bG9nOiBsb2d9KSwKICAgICAgICBvbmxvYWRDYWxsYmFja3MgPSB7fSwKICAgICAgICBhcGk7CgoKICAgIGZ1bmN0aW9uIGRldGFjaExvYWRFdmVudChpZCkgewogICAgICAgIGlmIChkZXRhY2hMb2FkRXZlbnRzW2lkXSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGRldGFjaExvYWRFdmVudHNbaWRdKCk7CiAgICAgICAgICAgIGRlbGV0ZSBkZXRhY2hMb2FkRXZlbnRzW2lkXTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gcmVnaXN0ZXJQb3N0TWVzc2FnZUNhbGxiYWNrKGlmcmFtZSwgY2FsbGJhY2spIHsKICAgICAgICB2YXIgaWQgPSBpZnJhbWUuaWQ7CgogICAgICAgIG9ubG9hZENhbGxiYWNrc1t1dWlkc1tpZF1dID0gY2FsbGJhY2s7CgogICAgICAgIGRldGFjaExvYWRFdmVudHNbaWRdID0gcXEoaWZyYW1lKS5hdHRhY2goJ2xvYWQnLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgaWYgKGlucHV0c1tpZF0pIHsKICAgICAgICAgICAgICAgIGxvZygiUmVjZWl2ZWQgaWZyYW1lIGxvYWQgZXZlbnQgZm9yIENPUlMgdXBsb2FkIHJlcXVlc3QgKGZpbGUgaWQgIiArIGlkICsgIikiKTsKCiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZUNhbGxiYWNrVGltZXJzW2lkXSA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGVycm9yTWVzc2FnZSA9ICJObyB2YWxpZCBtZXNzYWdlIHJlY2VpdmVkIGZyb20gbG9hZGVkIGlmcmFtZSBmb3IgZmlsZSBpZCAiICsgaWQ7CiAgICAgICAgICAgICAgICAgICAgbG9nKGVycm9yTWVzc2FnZSwgImVycm9yIik7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soewogICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3JNZXNzYWdlCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9LCAxMDAwKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICBjb3JzTWVzc2FnZVJlY2VpdmVyLnJlY2VpdmVNZXNzYWdlKGlkLCBmdW5jdGlvbihtZXNzYWdlKSB7CiAgICAgICAgICAgIGxvZygiUmVjZWl2ZWQgdGhlIGZvbGxvd2luZyB3aW5kb3cgbWVzc2FnZTogJyIgKyBtZXNzYWdlICsgIiciKTsKICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gcXEucGFyc2VKc29uKG1lc3NhZ2UpLAogICAgICAgICAgICAgICAgdXVpZCA9IHJlc3BvbnNlLnV1aWQsCiAgICAgICAgICAgICAgICBvbmxvYWRDYWxsYmFjazsKCiAgICAgICAgICAgIGlmICh1dWlkICYmIG9ubG9hZENhbGxiYWNrc1t1dWlkXSkgewogICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHBvc3RNZXNzYWdlQ2FsbGJhY2tUaW1lcnNbaWRdKTsKICAgICAgICAgICAgICAgIGRlbGV0ZSBwb3N0TWVzc2FnZUNhbGxiYWNrVGltZXJzW2lkXTsKCiAgICAgICAgICAgICAgICBkZXRhY2hMb2FkRXZlbnQoaWQpOwoKICAgICAgICAgICAgICAgIG9ubG9hZENhbGxiYWNrID0gb25sb2FkQ2FsbGJhY2tzW3V1aWRdOwoKICAgICAgICAgICAgICAgIGRlbGV0ZSBvbmxvYWRDYWxsYmFja3NbdXVpZF07CiAgICAgICAgICAgICAgICBjb3JzTWVzc2FnZVJlY2VpdmVyLnN0b3BSZWNlaXZpbmdNZXNzYWdlcyhpZCk7CiAgICAgICAgICAgICAgICBvbmxvYWRDYWxsYmFjayhyZXNwb25zZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoIXV1aWQpIHsKICAgICAgICAgICAgICAgIGxvZygiJyIgKyBtZXNzYWdlICsgIicgZG9lcyBub3QgY29udGFpbiBhIFVVSUQgLSBpZ25vcmluZy4iKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGF0dGFjaExvYWRFdmVudChpZnJhbWUsIGNhbGxiYWNrKSB7CiAgICAgICAgLypqc2xpbnQgZXFlcTogdHJ1ZSovCgogICAgICAgIGlmIChvcHRpb25zLmNvcnMuZXhwZWN0ZWQpIHsKICAgICAgICAgICAgcmVnaXN0ZXJQb3N0TWVzc2FnZUNhbGxiYWNrKGlmcmFtZSwgY2FsbGJhY2spOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZGV0YWNoTG9hZEV2ZW50c1tpZnJhbWUuaWRdID0gcXEoaWZyYW1lKS5hdHRhY2goJ2xvYWQnLCBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgbG9nKCdSZWNlaXZlZCByZXNwb25zZSBmb3IgJyArIGlmcmFtZS5pZCk7CgogICAgICAgICAgICAgICAgLy8gd2hlbiB3ZSByZW1vdmUgaWZyYW1lIGZyb20gZG9tCiAgICAgICAgICAgICAgICAvLyB0aGUgcmVxdWVzdCBzdG9wcywgYnV0IGluIElFIGxvYWQKICAgICAgICAgICAgICAgIC8vIGV2ZW50IGZpcmVzCiAgICAgICAgICAgICAgICBpZiAoIWlmcmFtZS5wYXJlbnROb2RlKXsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAvLyBmaXhpbmcgT3BlcmEgMTAuNTMKICAgICAgICAgICAgICAgICAgICBpZiAoaWZyYW1lLmNvbnRlbnREb2N1bWVudCAmJgogICAgICAgICAgICAgICAgICAgICAgICBpZnJhbWUuY29udGVudERvY3VtZW50LmJvZHkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgaWZyYW1lLmNvbnRlbnREb2N1bWVudC5ib2R5LmlubmVySFRNTCA9PSAiZmFsc2UiKXsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gT3BlcmEgZXZlbnQgaXMgZmlyZWQgc2Vjb25kIHRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiBib2R5LmlubmVySFRNTCBjaGFuZ2VkIGZyb20gZmFsc2UKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gc2VydmVyIHJlc3BvbnNlIGFwcHJveC4gYWZ0ZXIgMSBzZWMKICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiB3ZSB1cGxvYWQgZmlsZSB3aXRoIGlmcmFtZQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgLy9JRSBtYXkgdGhyb3cgYW4gImFjY2VzcyBpcyBkZW5pZWQiIGVycm9yIHdoZW4gYXR0ZW1wdGluZyB0byBhY2Nlc3MgY29udGVudERvY3VtZW50IG9uIHRoZSBpZnJhbWUgaW4gc29tZSBjYXNlcwogICAgICAgICAgICAgICAgICAgIGxvZygnRXJyb3Igd2hlbiBhdHRlbXB0aW5nIHRvIGFjY2VzcyBpZnJhbWUgZHVyaW5nIGhhbmRsaW5nIG9mIHVwbG9hZCByZXNwb25zZSAoJyArIGVycm9yICsgIikiLCAnZXJyb3InKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGpzb24gb2JqZWN0IHJlY2VpdmVkIGJ5IGlmcmFtZSBmcm9tIHNlcnZlci4KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0SWZyYW1lQ29udGVudEpzb24oaWZyYW1lKSB7CiAgICAgICAgLypqc2hpbnQgZXZpbDogdHJ1ZSovCgogICAgICAgIHZhciByZXNwb25zZTsKCiAgICAgICAgLy9JRSBtYXkgdGhyb3cgYW4gImFjY2VzcyBpcyBkZW5pZWQiIGVycm9yIHdoZW4gYXR0ZW1wdGluZyB0byBhY2Nlc3MgY29udGVudERvY3VtZW50IG9uIHRoZSBpZnJhbWUgaW4gc29tZSBjYXNlcwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIC8vIGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50IC0gZm9yIElFPDcKICAgICAgICAgICAgdmFyIGRvYyA9IGlmcmFtZS5jb250ZW50RG9jdW1lbnQgfHwgaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQsCiAgICAgICAgICAgICAgICBpbm5lckhUTUwgPSBkb2MuYm9keS5pbm5lckhUTUw7CgogICAgICAgICAgICBsb2coImNvbnZlcnRpbmcgaWZyYW1lJ3MgaW5uZXJIVE1MIHRvIEpTT04iKTsKICAgICAgICAgICAgbG9nKCJpbm5lckhUTUwgPSAiICsgaW5uZXJIVE1MKTsKICAgICAgICAgICAgLy9wbGFpbiB0ZXh0IHJlc3BvbnNlIG1heSBiZSB3cmFwcGVkIGluIDxwcmU+IHRhZwogICAgICAgICAgICBpZiAoaW5uZXJIVE1MICYmIGlubmVySFRNTC5tYXRjaCgvXjxwcmUvaSkpIHsKICAgICAgICAgICAgICAgIGlubmVySFRNTCA9IGRvYy5ib2R5LmZpcnN0Q2hpbGQuZmlyc3RDaGlsZC5ub2RlVmFsdWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJlc3BvbnNlID0gcXEucGFyc2VKc29uKGlubmVySFRNTCk7CiAgICAgICAgfSBjYXRjaChlcnJvcil7CiAgICAgICAgICAgIGxvZygnRXJyb3Igd2hlbiBhdHRlbXB0aW5nIHRvIHBhcnNlIGZvcm0gdXBsb2FkIHJlc3BvbnNlICgnICsgZXJyb3IgKyAiKSIsICdlcnJvcicpOwogICAgICAgICAgICByZXNwb25zZSA9IHtzdWNjZXNzOiBmYWxzZX07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmVzcG9uc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGlmcmFtZSB3aXRoIHVuaXF1ZSBuYW1lCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNyZWF0ZUlmcmFtZShpZCl7CiAgICAgICAgLy8gV2UgY2FuJ3QgdXNlIGZvbGxvd2luZyBjb2RlIGFzIHRoZSBuYW1lIGF0dHJpYnV0ZQogICAgICAgIC8vIHdvbid0IGJlIHByb3Blcmx5IHJlZ2lzdGVyZWQgaW4gSUU2LCBhbmQgbmV3IHdpbmRvdwogICAgICAgIC8vIG9uIGZvcm0gc3VibWl0IHdpbGwgb3BlbgogICAgICAgIC8vIHZhciBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTsKICAgICAgICAvLyBpZnJhbWUuc2V0QXR0cmlidXRlKCduYW1lJywgaWQpOwoKICAgICAgICB2YXIgaWZyYW1lID0gcXEudG9FbGVtZW50KCc8aWZyYW1lIHNyYz0iamF2YXNjcmlwdDpmYWxzZTsiIG5hbWU9IicgKyBpZCArICciIC8+Jyk7CgogICAgICAgIGlmcmFtZS5zZXRBdHRyaWJ1dGUoJ2lkJywgaWQpOwoKICAgICAgICBpZnJhbWUuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGlmcmFtZSk7CgogICAgICAgIHJldHVybiBpZnJhbWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGZvcm0sIHRoYXQgd2lsbCBiZSBzdWJtaXR0ZWQgdG8gaWZyYW1lCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNyZWF0ZUZvcm0oaWQsIGlmcmFtZSl7CiAgICAgICAgdmFyIHBhcmFtcyA9IG9wdGlvbnMucGFyYW1zU3RvcmUuZ2V0UGFyYW1zKGlkKSwKICAgICAgICAgICAgcHJvdG9jb2wgPSBvcHRpb25zLmRlbW9Nb2RlID8gIkdFVCIgOiAiUE9TVCIsCiAgICAgICAgICAgIGZvcm0gPSBxcS50b0VsZW1lbnQoJzxmb3JtIG1ldGhvZD0iJyArIHByb3RvY29sICsgJyIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+PC9mb3JtPicpLAogICAgICAgICAgICBlbmRwb2ludCA9IG9wdGlvbnMuZW5kcG9pbnRTdG9yZS5nZXRFbmRwb2ludChpZCksCiAgICAgICAgICAgIHVybCA9IGVuZHBvaW50OwoKICAgICAgICBwYXJhbXNbb3B0aW9ucy51dWlkUGFyYW1OYW1lXSA9IHV1aWRzW2lkXTsKCiAgICAgICAgaWYgKCFvcHRpb25zLnBhcmFtc0luQm9keSkgewogICAgICAgICAgICB1cmwgPSBxcS5vYmoydXJsKHBhcmFtcywgZW5kcG9pbnQpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcXEub2JqMklucHV0cyhwYXJhbXMsIGZvcm0pOwogICAgICAgIH0KCiAgICAgICAgZm9ybS5zZXRBdHRyaWJ1dGUoJ2FjdGlvbicsIHVybCk7CiAgICAgICAgZm9ybS5zZXRBdHRyaWJ1dGUoJ3RhcmdldCcsIGlmcmFtZS5uYW1lKTsKICAgICAgICBmb3JtLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmb3JtKTsKCiAgICAgICAgcmV0dXJuIGZvcm07CiAgICB9CgoKICAgIGFwaSA9IHsKICAgICAgICBhZGQ6IGZ1bmN0aW9uKGZpbGVJbnB1dCkgewogICAgICAgICAgICBmaWxlSW5wdXQuc2V0QXR0cmlidXRlKCduYW1lJywgb3B0aW9ucy5pbnB1dE5hbWUpOwoKICAgICAgICAgICAgdmFyIGlkID0gaW5wdXRzLnB1c2goZmlsZUlucHV0KSAtIDE7CiAgICAgICAgICAgIHV1aWRzW2lkXSA9IHFxLmdldFVuaXF1ZUlkKCk7CgogICAgICAgICAgICAvLyByZW1vdmUgZmlsZSBpbnB1dCBmcm9tIERPTQogICAgICAgICAgICBpZiAoZmlsZUlucHV0LnBhcmVudE5vZGUpewogICAgICAgICAgICAgICAgcXEoZmlsZUlucHV0KS5yZW1vdmUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGlkOwogICAgICAgIH0sCiAgICAgICAgZ2V0TmFtZTogZnVuY3Rpb24oaWQpIHsKICAgICAgICAgICAgLypqc2xpbnQgcmVnZXhwOiB0cnVlKi8KCiAgICAgICAgICAgIGlmIChhcGkuaXNWYWxpZChpZCkpIHsKICAgICAgICAgICAgICAgIC8vIGdldCBpbnB1dCB2YWx1ZSBhbmQgcmVtb3ZlIHBhdGggdG8gbm9ybWFsaXplCiAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXRzW2lkXS52YWx1ZS5yZXBsYWNlKC8uKihcL3xcXCkvLCAiIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBsb2coaWQgKyAiIGlzIG5vdCBhIHZhbGlkIGl0ZW0gSUQuIiwgImVycm9yIik7CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIGlzVmFsaWQ6IGZ1bmN0aW9uKGlkKSB7CiAgICAgICAgICAgIHJldHVybiBpbnB1dHNbaWRdICE9PSB1bmRlZmluZWQ7CiAgICAgICAgfSwKICAgICAgICByZXNldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlucHV0cyA9IFtdOwogICAgICAgICAgICB1dWlkcyA9IFtdOwogICAgICAgICAgICBkZXRhY2hMb2FkRXZlbnRzID0ge307CiAgICAgICAgfSwKICAgICAgICBnZXRVdWlkOiBmdW5jdGlvbihpZCkgewogICAgICAgICAgICByZXR1cm4gdXVpZHNbaWRdOwogICAgICAgIH0sCiAgICAgICAgY2FuY2VsOiBmdW5jdGlvbihpZCkgewogICAgICAgICAgICBvcHRpb25zLm9uQ2FuY2VsKGlkLCB0aGlzLmdldE5hbWUoaWQpKTsKCiAgICAgICAgICAgIGRlbGV0ZSBpbnB1dHNbaWRdOwogICAgICAgICAgICBkZWxldGUgdXVpZHNbaWRdOwogICAgICAgICAgICBkZWxldGUgZGV0YWNoTG9hZEV2ZW50c1tpZF07CgogICAgICAgICAgICBpZiAob3B0aW9ucy5jb3JzLmV4cGVjdGVkKSB7CiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocG9zdE1lc3NhZ2VDYWxsYmFja1RpbWVyc1tpZF0pOwogICAgICAgICAgICAgICAgZGVsZXRlIHBvc3RNZXNzYWdlQ2FsbGJhY2tUaW1lcnNbaWRdOwogICAgICAgICAgICAgICAgY29yc01lc3NhZ2VSZWNlaXZlci5zdG9wUmVjZWl2aW5nTWVzc2FnZXMoaWQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgaWZyYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOwogICAgICAgICAgICBpZiAoaWZyYW1lKSB7CiAgICAgICAgICAgICAgICAvLyB0byBjYW5jZWwgcmVxdWVzdCBzZXQgc3JjIHRvIHNvbWV0aGluZyBlbHNlCiAgICAgICAgICAgICAgICAvLyB3ZSB1c2Ugc3JjPSJqYXZhc2NyaXB0OmZhbHNlOyIgYmVjYXVzZSBpdCBkb2Vzbid0CiAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGllNiBwcm9tcHQgb24gaHR0cHMKICAgICAgICAgICAgICAgIGlmcmFtZS5zZXRBdHRyaWJ1dGUoJ3NyYycsICdqYXZhJyArIFN0cmluZy5mcm9tQ2hhckNvZGUoMTE1KSArICdjcmlwdDpmYWxzZTsnKTsgLy9kZWFsIHdpdGggIkpTTGludDogamF2YXNjcmlwdCBVUkwiIHdhcm5pbmcsIHdoaWNoIGFwcGFyZW50bHkgY2Fubm90IGJlIHR1cm5lZCBvZmYKCiAgICAgICAgICAgICAgICBxcShpZnJhbWUpLnJlbW92ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICB1cGxvYWQ6IGZ1bmN0aW9uKGlkKXsKICAgICAgICAgICAgdmFyIGlucHV0ID0gaW5wdXRzW2lkXSwKICAgICAgICAgICAgICAgIGZpbGVOYW1lID0gYXBpLmdldE5hbWUoaWQpLAogICAgICAgICAgICAgICAgaWZyYW1lID0gY3JlYXRlSWZyYW1lKGlkKSwKICAgICAgICAgICAgICAgIGZvcm07CgogICAgICAgICAgICBpZiAoIWlucHV0KXsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZmlsZSB3aXRoIHBhc3NlZCBpZCB3YXMgbm90IGFkZGVkLCBvciBhbHJlYWR5IHVwbG9hZGVkIG9yIGNhbmNlbGxlZCcpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBvcHRpb25zLm9uVXBsb2FkKGlkLCB0aGlzLmdldE5hbWUoaWQpKTsKCiAgICAgICAgICAgIGZvcm0gPSBjcmVhdGVGb3JtKGlkLCBpZnJhbWUpOwogICAgICAgICAgICBmb3JtLmFwcGVuZENoaWxkKGlucHV0KTsKCiAgICAgICAgICAgIGF0dGFjaExvYWRFdmVudChpZnJhbWUsIGZ1bmN0aW9uKHJlc3BvbnNlRnJvbU1lc3NhZ2UpewogICAgICAgICAgICAgICAgbG9nKCdpZnJhbWUgbG9hZGVkJyk7CgogICAgICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gcmVzcG9uc2VGcm9tTWVzc2FnZSA/IHJlc3BvbnNlRnJvbU1lc3NhZ2UgOiBnZXRJZnJhbWVDb250ZW50SnNvbihpZnJhbWUpOwoKICAgICAgICAgICAgICAgIGRldGFjaExvYWRFdmVudChpZCk7CgogICAgICAgICAgICAgICAgLy93ZSBjYW4ndCByZW1vdmUgYW4gaWZyYW1lIGlmIHRoZSBpZnJhbWUgZG9lc24ndCBiZWxvbmcgdG8gdGhlIHNhbWUgZG9tYWluCiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuY29ycy5leHBlY3RlZCkgewogICAgICAgICAgICAgICAgICAgIHFxKGlmcmFtZSkucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5zdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMub25BdXRvUmV0cnkoaWQsIGZpbGVOYW1lLCByZXNwb25zZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG9wdGlvbnMub25Db21wbGV0ZShpZCwgZmlsZU5hbWUsIHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgIHVwbG9hZENvbXBsZXRlKGlkKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBsb2coJ1NlbmRpbmcgdXBsb2FkIHJlcXVlc3QgZm9yICcgKyBpZCk7CiAgICAgICAgICAgIGZvcm0uc3VibWl0KCk7CiAgICAgICAgICAgIHFxKGZvcm0pLnJlbW92ZSgpOwoKICAgICAgICAgICAgcmV0dXJuIGlkOwogICAgICAgIH0KICAgIH07CgogICAgcmV0dXJuIGFwaTsKfTsKLypnbG9iYWxzIHFxLCBGaWxlLCBYTUxIdHRwUmVxdWVzdCwgRm9ybURhdGEsIEJsb2IqLwpxcS5VcGxvYWRIYW5kbGVyWGhyID0gZnVuY3Rpb24obywgdXBsb2FkQ29tcGxldGVDYWxsYmFjaywgbG9nQ2FsbGJhY2spIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIAogICAgdmFyIG9wdGlvbnMgPSBvLAogICAgICAgIHVwbG9hZENvbXBsZXRlID0gdXBsb2FkQ29tcGxldGVDYWxsYmFjaywKICAgICAgICBsb2cgPSBsb2dDYWxsYmFjaywKICAgICAgICBmaWxlU3RhdGUgPSBbXSwKICAgICAgICBjb29raWVJdGVtRGVsaW1pdGVyID0gInwiLAogICAgICAgIGNodW5rRmlsZXMgPSBvcHRpb25zLmNodW5raW5nLmVuYWJsZWQgJiYgcXEuaXNGaWxlQ2h1bmtpbmdTdXBwb3J0ZWQoKSwKICAgICAgICByZXN1bWVFbmFibGVkID0gb3B0aW9ucy5yZXN1bWUuZW5hYmxlZCAmJiBjaHVua0ZpbGVzICYmIHFxLmFyZUNvb2tpZXNFbmFibGVkKCksCiAgICAgICAgcmVzdW1lSWQgPSBnZXRSZXN1bWVJZCgpLAogICAgICAgIG11bHRpcGFydCA9IG9wdGlvbnMuZm9yY2VNdWx0aXBhcnQgfHwgb3B0aW9ucy5wYXJhbXNJbkJvZHksCiAgICAgICAgYXBpOwoKCiAgICAgZnVuY3Rpb24gYWRkQ2h1bmtpbmdTcGVjaWZpY1BhcmFtcyhpZCwgcGFyYW1zLCBjaHVua0RhdGEpIHsKICAgICAgICB2YXIgc2l6ZSA9IGFwaS5nZXRTaXplKGlkKSwKICAgICAgICAgICAgbmFtZSA9IGFwaS5nZXROYW1lKGlkKTsKCiAgICAgICAgcGFyYW1zW29wdGlvbnMuY2h1bmtpbmcucGFyYW1OYW1lcy5wYXJ0SW5kZXhdID0gY2h1bmtEYXRhLnBhcnQ7CiAgICAgICAgcGFyYW1zW29wdGlvbnMuY2h1bmtpbmcucGFyYW1OYW1lcy5wYXJ0Qnl0ZU9mZnNldF0gPSBjaHVua0RhdGEuc3RhcnQ7CiAgICAgICAgcGFyYW1zW29wdGlvbnMuY2h1bmtpbmcucGFyYW1OYW1lcy5jaHVua1NpemVdID0gY2h1bmtEYXRhLnNpemU7CiAgICAgICAgcGFyYW1zW29wdGlvbnMuY2h1bmtpbmcucGFyYW1OYW1lcy50b3RhbFBhcnRzXSA9IGNodW5rRGF0YS5jb3VudDsKICAgICAgICBwYXJhbXNbb3B0aW9ucy50b3RhbEZpbGVTaXplUGFyYW1OYW1lXSA9IHNpemU7CgogICAgICAgIC8qKgogICAgICAgICAqIFdoZW4gYSBCbG9iIGlzIHNlbnQgaW4gYSBtdWx0aXBhcnQgcmVxdWVzdCwgdGhlIGZpbGVuYW1lIHZhbHVlIGluIHRoZSBjb250ZW50LWRpc3Bvc2l0aW9uIGhlYWRlciBpcyBlaXRoZXIgImJsb2IiCiAgICAgICAgICogb3IgYW4gZW1wdHkgc3RyaW5nLiAgU28sIHdlIHdpbGwgbmVlZCB0byBpbmNsdWRlIHRoZSBhY3R1YWwgZmlsZSBuYW1lIGFzIGEgcGFyYW0gaW4gdGhpcyBjYXNlLgogICAgICAgICAqLwogICAgICAgIGlmIChtdWx0aXBhcnQpIHsKICAgICAgICAgICAgcGFyYW1zW29wdGlvbnMuY2h1bmtpbmcucGFyYW1OYW1lcy5maWxlbmFtZV0gPSBuYW1lOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBhZGRSZXN1bWVTcGVjaWZpY1BhcmFtcyhwYXJhbXMpIHsKICAgICAgICBwYXJhbXNbb3B0aW9ucy5yZXN1bWUucGFyYW1OYW1lcy5yZXN1bWluZ10gPSB0cnVlOwogICAgfQoKICAgICBmdW5jdGlvbiBnZXRDaHVuayhmaWxlT3JCbG9iLCBzdGFydEJ5dGUsIGVuZEJ5dGUpIHsKICAgICAgICBpZiAoZmlsZU9yQmxvYi5zbGljZSkgewogICAgICAgICAgICByZXR1cm4gZmlsZU9yQmxvYi5zbGljZShzdGFydEJ5dGUsIGVuZEJ5dGUpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChmaWxlT3JCbG9iLm1velNsaWNlKSB7CiAgICAgICAgICAgIHJldHVybiBmaWxlT3JCbG9iLm1velNsaWNlKHN0YXJ0Qnl0ZSwgZW5kQnl0ZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGZpbGVPckJsb2Iud2Via2l0U2xpY2UpIHsKICAgICAgICAgICAgcmV0dXJuIGZpbGVPckJsb2Iud2Via2l0U2xpY2Uoc3RhcnRCeXRlLCBlbmRCeXRlKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0Q2h1bmtEYXRhKGlkLCBjaHVua0luZGV4KSB7CiAgICAgICAgdmFyIGNodW5rU2l6ZSA9IG9wdGlvbnMuY2h1bmtpbmcucGFydFNpemUsCiAgICAgICAgICAgIGZpbGVTaXplID0gYXBpLmdldFNpemUoaWQpLAogICAgICAgICAgICBmaWxlT3JCbG9iID0gZmlsZVN0YXRlW2lkXS5maWxlIHx8IGZpbGVTdGF0ZVtpZF0uYmxvYkRhdGEuYmxvYiwKICAgICAgICAgICAgc3RhcnRCeXRlcyA9IGNodW5rU2l6ZSAqIGNodW5rSW5kZXgsCiAgICAgICAgICAgIGVuZEJ5dGVzID0gc3RhcnRCeXRlcytjaHVua1NpemUgPj0gZmlsZVNpemUgPyBmaWxlU2l6ZSA6IHN0YXJ0Qnl0ZXMrY2h1bmtTaXplLAogICAgICAgICAgICB0b3RhbENodW5rcyA9IGdldFRvdGFsQ2h1bmtzKGlkKTsKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcGFydDogY2h1bmtJbmRleCwKICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0Qnl0ZXMsCiAgICAgICAgICAgIGVuZDogZW5kQnl0ZXMsCiAgICAgICAgICAgIGNvdW50OiB0b3RhbENodW5rcywKICAgICAgICAgICAgYmxvYjogZ2V0Q2h1bmsoZmlsZU9yQmxvYiwgc3RhcnRCeXRlcywgZW5kQnl0ZXMpLAogICAgICAgICAgICBzaXplOiBlbmRCeXRlcyAtIHN0YXJ0Qnl0ZXMKICAgICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGdldFRvdGFsQ2h1bmtzKGlkKSB7CiAgICAgICAgdmFyIGZpbGVTaXplID0gYXBpLmdldFNpemUoaWQpLAogICAgICAgICAgICBjaHVua1NpemUgPSBvcHRpb25zLmNodW5raW5nLnBhcnRTaXplOwoKICAgICAgICByZXR1cm4gTWF0aC5jZWlsKGZpbGVTaXplIC8gY2h1bmtTaXplKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdGVYaHIoaWQpIHsKICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CgogICAgICAgIGZpbGVTdGF0ZVtpZF0ueGhyID0geGhyOwoKICAgICAgICByZXR1cm4geGhyOwogICAgfQoKICAgIGZ1bmN0aW9uIHNldFBhcmFtc0FuZEdldEVudGl0eVRvU2VuZChwYXJhbXMsIHhociwgZmlsZU9yQmxvYiwgaWQpIHsKICAgICAgICB2YXIgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKSwKICAgICAgICAgICAgbWV0aG9kID0gb3B0aW9ucy5kZW1vTW9kZSA/ICJHRVQiIDogIlBPU1QiLAogICAgICAgICAgICBlbmRwb2ludCA9IG9wdGlvbnMuZW5kcG9pbnRTdG9yZS5nZXRFbmRwb2ludChpZCksCiAgICAgICAgICAgIHVybCA9IGVuZHBvaW50LAogICAgICAgICAgICBuYW1lID0gYXBpLmdldE5hbWUoaWQpLAogICAgICAgICAgICBzaXplID0gYXBpLmdldFNpemUoaWQpLAogICAgICAgICAgICBibG9iRGF0YSA9IGZpbGVTdGF0ZVtpZF0uYmxvYkRhdGE7CgogICAgICAgIHBhcmFtc1tvcHRpb25zLnV1aWRQYXJhbU5hbWVdID0gZmlsZVN0YXRlW2lkXS51dWlkOwoKICAgICAgICBpZiAobXVsdGlwYXJ0KSB7CiAgICAgICAgICAgIHBhcmFtc1tvcHRpb25zLnRvdGFsRmlsZVNpemVQYXJhbU5hbWVdID0gc2l6ZTsKCiAgICAgICAgICAgIGlmIChibG9iRGF0YSkgewogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBXaGVuIGEgQmxvYiBpcyBzZW50IGluIGEgbXVsdGlwYXJ0IHJlcXVlc3QsIHRoZSBmaWxlbmFtZSB2YWx1ZSBpbiB0aGUgY29udGVudC1kaXNwb3NpdGlvbiBoZWFkZXIgaXMgZWl0aGVyICJibG9iIgogICAgICAgICAgICAgICAgICogb3IgYW4gZW1wdHkgc3RyaW5nLiAgU28sIHdlIHdpbGwgbmVlZCB0byBpbmNsdWRlIHRoZSBhY3R1YWwgZmlsZSBuYW1lIGFzIGEgcGFyYW0gaW4gdGhpcyBjYXNlLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBwYXJhbXNbb3B0aW9ucy5ibG9icy5wYXJhbU5hbWVzLm5hbWVdID0gYmxvYkRhdGEubmFtZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy9idWlsZCBxdWVyeSBzdHJpbmcKICAgICAgICBpZiAoIW9wdGlvbnMucGFyYW1zSW5Cb2R5KSB7CiAgICAgICAgICAgIGlmICghbXVsdGlwYXJ0KSB7CiAgICAgICAgICAgICAgICBwYXJhbXNbb3B0aW9ucy5pbnB1dE5hbWVdID0gbmFtZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB1cmwgPSBxcS5vYmoydXJsKHBhcmFtcywgZW5kcG9pbnQpOwogICAgICAgIH0KCiAgICAgICAgeGhyLm9wZW4obWV0aG9kLCB1cmwsIHRydWUpOwoKICAgICAgICBpZiAob3B0aW9ucy5jb3JzLmV4cGVjdGVkICYmIG9wdGlvbnMuY29ycy5zZW5kQ3JlZGVudGlhbHMpIHsKICAgICAgICAgICAgeGhyLndpdGhDcmVkZW50aWFscyA9IHRydWU7CiAgICAgICAgfQoKICAgICAgICBpZiAobXVsdGlwYXJ0KSB7CiAgICAgICAgICAgIGlmIChvcHRpb25zLnBhcmFtc0luQm9keSkgewogICAgICAgICAgICAgICAgcXEub2JqMkZvcm1EYXRhKHBhcmFtcywgZm9ybURhdGEpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQob3B0aW9ucy5pbnB1dE5hbWUsIGZpbGVPckJsb2IpOwogICAgICAgICAgICByZXR1cm4gZm9ybURhdGE7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmlsZU9yQmxvYjsKICAgIH0KCiAgICBmdW5jdGlvbiBzZXRIZWFkZXJzKGlkLCB4aHIpIHsKICAgICAgICB2YXIgZXh0cmFIZWFkZXJzID0gb3B0aW9ucy5jdXN0b21IZWFkZXJzLAogICAgICAgICAgICBmaWxlT3JCbG9iID0gZmlsZVN0YXRlW2lkXS5maWxlIHx8IGZpbGVTdGF0ZVtpZF0uYmxvYkRhdGEuYmxvYjsKCiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoIlgtUmVxdWVzdGVkLVdpdGgiLCAiWE1MSHR0cFJlcXVlc3QiKTsKICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcigiQ2FjaGUtQ29udHJvbCIsICJuby1jYWNoZSIpOwoKICAgICAgICBpZiAoIW11bHRpcGFydCkgewogICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIiwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOwogICAgICAgICAgICAvL05PVEU6IHJldHVybiBtaW1lIHR5cGUgaW4geGhyIHdvcmtzIG9uIGNocm9tZSAxNi4wLjkgZmlyZWZveCAxMS4wYTIKICAgICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoIlgtTWltZS1UeXBlIiwgZmlsZU9yQmxvYi50eXBlKTsKICAgICAgICB9CgogICAgICAgIHFxLmVhY2goZXh0cmFIZWFkZXJzLCBmdW5jdGlvbihuYW1lLCB2YWwpIHsKICAgICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIobmFtZSwgdmFsKTsKICAgICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBoYW5kbGVDb21wbGV0ZWRJdGVtKGlkLCByZXNwb25zZSwgeGhyKSB7CiAgICAgICAgdmFyIG5hbWUgPSBhcGkuZ2V0TmFtZShpZCksCiAgICAgICAgICAgIHNpemUgPSBhcGkuZ2V0U2l6ZShpZCk7CgogICAgICAgIGZpbGVTdGF0ZVtpZF0uYXR0ZW1wdGluZ1Jlc3VtZSA9IGZhbHNlOwoKICAgICAgICBvcHRpb25zLm9uUHJvZ3Jlc3MoaWQsIG5hbWUsIHNpemUsIHNpemUpOwoKICAgICAgICBvcHRpb25zLm9uQ29tcGxldGUoaWQsIG5hbWUsIHJlc3BvbnNlLCB4aHIpOwogICAgICAgIGRlbGV0ZSBmaWxlU3RhdGVbaWRdLnhocjsKICAgICAgICB1cGxvYWRDb21wbGV0ZShpZCk7CiAgICB9CgogICAgZnVuY3Rpb24gdXBsb2FkTmV4dENodW5rKGlkKSB7CiAgICAgICAgdmFyIGNodW5rSWR4ID0gZmlsZVN0YXRlW2lkXS5yZW1haW5pbmdDaHVua0lkeHNbMF0sCiAgICAgICAgICAgIGNodW5rRGF0YSA9IGdldENodW5rRGF0YShpZCwgY2h1bmtJZHgpLAogICAgICAgICAgICB4aHIgPSBjcmVhdGVYaHIoaWQpLAogICAgICAgICAgICBzaXplID0gYXBpLmdldFNpemUoaWQpLAogICAgICAgICAgICBuYW1lID0gYXBpLmdldE5hbWUoaWQpLAogICAgICAgICAgICB0b1NlbmQsIHBhcmFtczsKCiAgICAgICAgaWYgKGZpbGVTdGF0ZVtpZF0ubG9hZGVkID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgZmlsZVN0YXRlW2lkXS5sb2FkZWQgPSAwOwogICAgICAgIH0KCiAgICAgICAgaWYgKHJlc3VtZUVuYWJsZWQgJiYgZmlsZVN0YXRlW2lkXS5maWxlKSB7CiAgICAgICAgICAgIHBlcnNpc3RDaHVua0RhdGEoaWQsIGNodW5rRGF0YSk7CiAgICAgICAgfQoKICAgICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZ2V0UmVhZHlTdGF0ZUNoYW5nZUhhbmRsZXIoaWQsIHhocik7CgogICAgICAgIHhoci51cGxvYWQub25wcm9ncmVzcyA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgaWYgKGUubGVuZ3RoQ29tcHV0YWJsZSkgewogICAgICAgICAgICAgICAgdmFyIHRvdGFsTG9hZGVkID0gZS5sb2FkZWQgKyBmaWxlU3RhdGVbaWRdLmxvYWRlZCwKICAgICAgICAgICAgICAgICAgICBlc3RUb3RhbFJlcXVlc3RzU2l6ZSA9IGNhbGNBbGxSZXF1ZXN0c1NpemVGb3JDaHVua2VkVXBsb2FkKGlkLCBjaHVua0lkeCwgZS50b3RhbCk7CgogICAgICAgICAgICAgICAgb3B0aW9ucy5vblByb2dyZXNzKGlkLCBuYW1lLCB0b3RhbExvYWRlZCwgZXN0VG90YWxSZXF1ZXN0c1NpemUpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgb3B0aW9ucy5vblVwbG9hZENodW5rKGlkLCBuYW1lLCBnZXRDaHVua0RhdGFGb3JDYWxsYmFjayhjaHVua0RhdGEpKTsKCiAgICAgICAgcGFyYW1zID0gb3B0aW9ucy5wYXJhbXNTdG9yZS5nZXRQYXJhbXMoaWQpOwogICAgICAgIGFkZENodW5raW5nU3BlY2lmaWNQYXJhbXMoaWQsIHBhcmFtcywgY2h1bmtEYXRhKTsKCiAgICAgICAgaWYgKGZpbGVTdGF0ZVtpZF0uYXR0ZW1wdGluZ1Jlc3VtZSkgewogICAgICAgICAgICBhZGRSZXN1bWVTcGVjaWZpY1BhcmFtcyhwYXJhbXMpOwogICAgICAgIH0KCiAgICAgICAgdG9TZW5kID0gc2V0UGFyYW1zQW5kR2V0RW50aXR5VG9TZW5kKHBhcmFtcywgeGhyLCBjaHVua0RhdGEuYmxvYiwgaWQpOwogICAgICAgIHNldEhlYWRlcnMoaWQsIHhocik7CgogICAgICAgIGxvZygnU2VuZGluZyBjaHVua2VkIHVwbG9hZCByZXF1ZXN0IGZvciBpdGVtICcgKyBpZCArICI6IGJ5dGVzICIgKyAoY2h1bmtEYXRhLnN0YXJ0KzEpICsgIi0iICsgY2h1bmtEYXRhLmVuZCArICIgb2YgIiArIHNpemUpOwogICAgICAgIHhoci5zZW5kKHRvU2VuZCk7CiAgICB9CgogICAgZnVuY3Rpb24gY2FsY0FsbFJlcXVlc3RzU2l6ZUZvckNodW5rZWRVcGxvYWQoaWQsIGNodW5rSWR4LCByZXF1ZXN0U2l6ZSkgewogICAgICAgIHZhciBjaHVua0RhdGEgPSBnZXRDaHVua0RhdGEoaWQsIGNodW5rSWR4KSwKICAgICAgICAgICAgYmxvYlNpemUgPSBjaHVua0RhdGEuc2l6ZSwKICAgICAgICAgICAgb3ZlcmhlYWQgPSByZXF1ZXN0U2l6ZSAtIGJsb2JTaXplLAogICAgICAgICAgICBzaXplID0gYXBpLmdldFNpemUoaWQpLAogICAgICAgICAgICBjaHVua0NvdW50ID0gY2h1bmtEYXRhLmNvdW50LAogICAgICAgICAgICBpbml0aWFsUmVxdWVzdE92ZXJoZWFkID0gZmlsZVN0YXRlW2lkXS5pbml0aWFsUmVxdWVzdE92ZXJoZWFkLAogICAgICAgICAgICBvdmVyaGVhZERpZmYgPSBvdmVyaGVhZCAtIGluaXRpYWxSZXF1ZXN0T3ZlcmhlYWQ7CgogICAgICAgIGZpbGVTdGF0ZVtpZF0ubGFzdFJlcXVlc3RPdmVyaGVhZCA9IG92ZXJoZWFkOwoKICAgICAgICBpZiAoY2h1bmtJZHggPT09IDApIHsKICAgICAgICAgICAgZmlsZVN0YXRlW2lkXS5sYXN0Q2h1bmtJZHhQcm9ncmVzcyA9IDA7CiAgICAgICAgICAgIGZpbGVTdGF0ZVtpZF0uaW5pdGlhbFJlcXVlc3RPdmVyaGVhZCA9IG92ZXJoZWFkOwogICAgICAgICAgICBmaWxlU3RhdGVbaWRdLmVzdFRvdGFsUmVxdWVzdHNTaXplID0gc2l6ZSArIChjaHVua0NvdW50ICogb3ZlcmhlYWQpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChmaWxlU3RhdGVbaWRdLmxhc3RDaHVua0lkeFByb2dyZXNzICE9PSBjaHVua0lkeCkgewogICAgICAgICAgICBmaWxlU3RhdGVbaWRdLmxhc3RDaHVua0lkeFByb2dyZXNzID0gY2h1bmtJZHg7CiAgICAgICAgICAgIGZpbGVTdGF0ZVtpZF0uZXN0VG90YWxSZXF1ZXN0c1NpemUgKz0gb3ZlcmhlYWREaWZmOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZpbGVTdGF0ZVtpZF0uZXN0VG90YWxSZXF1ZXN0c1NpemU7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0TGFzdFJlcXVlc3RPdmVyaGVhZChpZCkgewogICAgICAgIGlmIChtdWx0aXBhcnQpIHsKICAgICAgICAgICAgcmV0dXJuIGZpbGVTdGF0ZVtpZF0ubGFzdFJlcXVlc3RPdmVyaGVhZDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBoYW5kbGVTdWNjZXNzZnVsbHlDb21wbGV0ZWRDaHVuayhpZCwgcmVzcG9uc2UsIHhocikgewogICAgICAgIHZhciBjaHVua0lkeCA9IGZpbGVTdGF0ZVtpZF0ucmVtYWluaW5nQ2h1bmtJZHhzLnNoaWZ0KCksCiAgICAgICAgICAgIGNodW5rRGF0YSA9IGdldENodW5rRGF0YShpZCwgY2h1bmtJZHgpOwoKICAgICAgICBmaWxlU3RhdGVbaWRdLmF0dGVtcHRpbmdSZXN1bWUgPSBmYWxzZTsKICAgICAgICBmaWxlU3RhdGVbaWRdLmxvYWRlZCArPSBjaHVua0RhdGEuc2l6ZSArIGdldExhc3RSZXF1ZXN0T3ZlcmhlYWQoaWQpOwoKICAgICAgICBpZiAoZmlsZVN0YXRlW2lkXS5yZW1haW5pbmdDaHVua0lkeHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICB1cGxvYWROZXh0Q2h1bmsoaWQpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaWYgKHJlc3VtZUVuYWJsZWQpIHsKICAgICAgICAgICAgICAgIGRlbGV0ZVBlcnNpc3RlZENodW5rRGF0YShpZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGhhbmRsZUNvbXBsZXRlZEl0ZW0oaWQsIHJlc3BvbnNlLCB4aHIpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBpc0Vycm9yUmVzcG9uc2UoeGhyLCByZXNwb25zZSkgewogICAgICAgIHJldHVybiB4aHIuc3RhdHVzICE9PSAyMDAgfHwgIXJlc3BvbnNlLnN1Y2Nlc3MgfHwgcmVzcG9uc2UucmVzZXQ7CiAgICB9CgogICAgZnVuY3Rpb24gcGFyc2VSZXNwb25zZSh4aHIpIHsKICAgICAgICB2YXIgcmVzcG9uc2U7CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHJlc3BvbnNlID0gcXEucGFyc2VKc29uKHhoci5yZXNwb25zZVRleHQpOwogICAgICAgIH0KICAgICAgICBjYXRjaChlcnJvcikgewogICAgICAgICAgICBsb2coJ0Vycm9yIHdoZW4gYXR0ZW1wdGluZyB0byBwYXJzZSB4aHIgcmVzcG9uc2UgdGV4dCAoJyArIGVycm9yICsgJyknLCAnZXJyb3InKTsKICAgICAgICAgICAgcmVzcG9uc2UgPSB7fTsKICAgICAgICB9CgogICAgICAgIHJldHVybiByZXNwb25zZTsKICAgIH0KCiAgICBmdW5jdGlvbiBoYW5kbGVSZXNldFJlc3BvbnNlKGlkKSB7CiAgICAgICAgbG9nKCdTZXJ2ZXIgaGFzIG9yZGVyZWQgY2h1bmtpbmcgZWZmb3J0IHRvIGJlIHJlc3RhcnRlZCBvbiBuZXh0IGF0dGVtcHQgZm9yIGl0ZW0gSUQgJyArIGlkLCAnZXJyb3InKTsKCiAgICAgICAgaWYgKHJlc3VtZUVuYWJsZWQpIHsKICAgICAgICAgICAgZGVsZXRlUGVyc2lzdGVkQ2h1bmtEYXRhKGlkKTsKICAgICAgICAgICAgZmlsZVN0YXRlW2lkXS5hdHRlbXB0aW5nUmVzdW1lID0gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBmaWxlU3RhdGVbaWRdLnJlbWFpbmluZ0NodW5rSWR4cyA9IFtdOwogICAgICAgIGRlbGV0ZSBmaWxlU3RhdGVbaWRdLmxvYWRlZDsKICAgICAgICBkZWxldGUgZmlsZVN0YXRlW2lkXS5lc3RUb3RhbFJlcXVlc3RzU2l6ZTsKICAgICAgICBkZWxldGUgZmlsZVN0YXRlW2lkXS5pbml0aWFsUmVxdWVzdE92ZXJoZWFkOwogICAgfQoKICAgIGZ1bmN0aW9uIGhhbmRsZVJlc2V0UmVzcG9uc2VPblJlc3VtZUF0dGVtcHQoaWQpIHsKICAgICAgICBmaWxlU3RhdGVbaWRdLmF0dGVtcHRpbmdSZXN1bWUgPSBmYWxzZTsKICAgICAgICBsb2coIlNlcnZlciBoYXMgZGVjbGFyZWQgdGhhdCBpdCBjYW5ub3QgaGFuZGxlIHJlc3VtZSBmb3IgaXRlbSBJRCAiICsgaWQgKyAiIC0gc3RhcnRpbmcgZnJvbSB0aGUgZmlyc3QgY2h1bmsiLCAnZXJyb3InKTsKICAgICAgICBoYW5kbGVSZXNldFJlc3BvbnNlKGlkKTsKICAgICAgICBhcGkudXBsb2FkKGlkLCB0cnVlKTsKICAgIH0KCiAgICBmdW5jdGlvbiBoYW5kbGVOb25SZXNldEVycm9yUmVzcG9uc2UoaWQsIHJlc3BvbnNlLCB4aHIpIHsKICAgICAgICB2YXIgbmFtZSA9IGFwaS5nZXROYW1lKGlkKTsKCiAgICAgICAgaWYgKG9wdGlvbnMub25BdXRvUmV0cnkoaWQsIG5hbWUsIHJlc3BvbnNlLCB4aHIpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGhhbmRsZUNvbXBsZXRlZEl0ZW0oaWQsIHJlc3BvbnNlLCB4aHIpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBvbkNvbXBsZXRlKGlkLCB4aHIpIHsKICAgICAgICB2YXIgcmVzcG9uc2U7CgogICAgICAgIC8vIHRoZSByZXF1ZXN0IHdhcyBhYm9ydGVkL2NhbmNlbGxlZAogICAgICAgIGlmICghZmlsZVN0YXRlW2lkXSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBsb2coInhociAtIHNlcnZlciByZXNwb25zZSByZWNlaXZlZCBmb3IgIiArIGlkKTsKICAgICAgICBsb2coInJlc3BvbnNlVGV4dCA9ICIgKyB4aHIucmVzcG9uc2VUZXh0KTsKICAgICAgICByZXNwb25zZSA9IHBhcnNlUmVzcG9uc2UoeGhyKTsKCiAgICAgICAgaWYgKGlzRXJyb3JSZXNwb25zZSh4aHIsIHJlc3BvbnNlKSkgewogICAgICAgICAgICBpZiAocmVzcG9uc2UucmVzZXQpIHsKICAgICAgICAgICAgICAgIGhhbmRsZVJlc2V0UmVzcG9uc2UoaWQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZmlsZVN0YXRlW2lkXS5hdHRlbXB0aW5nUmVzdW1lICYmIHJlc3BvbnNlLnJlc2V0KSB7CiAgICAgICAgICAgICAgICBoYW5kbGVSZXNldFJlc3BvbnNlT25SZXN1bWVBdHRlbXB0KGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGhhbmRsZU5vblJlc2V0RXJyb3JSZXNwb25zZShpZCwgcmVzcG9uc2UsIHhocik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoY2h1bmtGaWxlcykgewogICAgICAgICAgICBoYW5kbGVTdWNjZXNzZnVsbHlDb21wbGV0ZWRDaHVuayhpZCwgcmVzcG9uc2UsIHhocik7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBoYW5kbGVDb21wbGV0ZWRJdGVtKGlkLCByZXNwb25zZSwgeGhyKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0Q2h1bmtEYXRhRm9yQ2FsbGJhY2soY2h1bmtEYXRhKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcGFydEluZGV4OiBjaHVua0RhdGEucGFydCwKICAgICAgICAgICAgc3RhcnRCeXRlOiBjaHVua0RhdGEuc3RhcnQgKyAxLAogICAgICAgICAgICBlbmRCeXRlOiBjaHVua0RhdGEuZW5kLAogICAgICAgICAgICB0b3RhbFBhcnRzOiBjaHVua0RhdGEuY291bnQKICAgICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGdldFJlYWR5U3RhdGVDaGFuZ2VIYW5kbGVyKGlkLCB4aHIpIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gNCkgewogICAgICAgICAgICAgICAgb25Db21wbGV0ZShpZCwgeGhyKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gcGVyc2lzdENodW5rRGF0YShpZCwgY2h1bmtEYXRhKSB7CiAgICAgICAgdmFyIGZpbGVVdWlkID0gYXBpLmdldFV1aWQoaWQpLAogICAgICAgICAgICBsYXN0Qnl0ZVNlbnQgPSBmaWxlU3RhdGVbaWRdLmxvYWRlZCwKICAgICAgICAgICAgaW5pdGlhbFJlcXVlc3RPdmVyaGVhZCA9IGZpbGVTdGF0ZVtpZF0uaW5pdGlhbFJlcXVlc3RPdmVyaGVhZCwKICAgICAgICAgICAgZXN0VG90YWxSZXF1ZXN0c1NpemUgPSBmaWxlU3RhdGVbaWRdLmVzdFRvdGFsUmVxdWVzdHNTaXplLAogICAgICAgICAgICBjb29raWVOYW1lID0gZ2V0Q2h1bmtEYXRhQ29va2llTmFtZShpZCksCiAgICAgICAgICAgIGNvb2tpZVZhbHVlID0gZmlsZVV1aWQgKwogICAgICAgICAgICAgICAgY29va2llSXRlbURlbGltaXRlciArIGNodW5rRGF0YS5wYXJ0ICsKICAgICAgICAgICAgICAgIGNvb2tpZUl0ZW1EZWxpbWl0ZXIgKyBsYXN0Qnl0ZVNlbnQgKwogICAgICAgICAgICAgICAgY29va2llSXRlbURlbGltaXRlciArIGluaXRpYWxSZXF1ZXN0T3ZlcmhlYWQgKwogICAgICAgICAgICAgICAgY29va2llSXRlbURlbGltaXRlciArIGVzdFRvdGFsUmVxdWVzdHNTaXplLAogICAgICAgICAgICBjb29raWVFeHBEYXlzID0gb3B0aW9ucy5yZXN1bWUuY29va2llc0V4cGlyZUluOwoKICAgICAgICBxcS5zZXRDb29raWUoY29va2llTmFtZSwgY29va2llVmFsdWUsIGNvb2tpZUV4cERheXMpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlbGV0ZVBlcnNpc3RlZENodW5rRGF0YShpZCkgewogICAgICAgIGlmIChmaWxlU3RhdGVbaWRdLmZpbGUpIHsKICAgICAgICAgICAgdmFyIGNvb2tpZU5hbWUgPSBnZXRDaHVua0RhdGFDb29raWVOYW1lKGlkKTsKICAgICAgICAgICAgcXEuZGVsZXRlQ29va2llKGNvb2tpZU5hbWUpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBnZXRQZXJzaXN0ZWRDaHVua0RhdGEoaWQpIHsKICAgICAgICB2YXIgY2h1bmtDb29raWVWYWx1ZSA9IHFxLmdldENvb2tpZShnZXRDaHVua0RhdGFDb29raWVOYW1lKGlkKSksCiAgICAgICAgICAgIGZpbGVuYW1lID0gYXBpLmdldE5hbWUoaWQpLAogICAgICAgICAgICBzZWN0aW9ucywgdXVpZCwgcGFydEluZGV4LCBsYXN0Qnl0ZVNlbnQsIGluaXRpYWxSZXF1ZXN0T3ZlcmhlYWQsIGVzdFRvdGFsUmVxdWVzdHNTaXplOwoKICAgICAgICBpZiAoY2h1bmtDb29raWVWYWx1ZSkgewogICAgICAgICAgICBzZWN0aW9ucyA9IGNodW5rQ29va2llVmFsdWUuc3BsaXQoY29va2llSXRlbURlbGltaXRlcik7CgogICAgICAgICAgICBpZiAoc2VjdGlvbnMubGVuZ3RoID09PSA1KSB7CiAgICAgICAgICAgICAgICB1dWlkID0gc2VjdGlvbnNbMF07CiAgICAgICAgICAgICAgICBwYXJ0SW5kZXggPSBwYXJzZUludChzZWN0aW9uc1sxXSwgMTApOwogICAgICAgICAgICAgICAgbGFzdEJ5dGVTZW50ID0gcGFyc2VJbnQoc2VjdGlvbnNbMl0sIDEwKTsKICAgICAgICAgICAgICAgIGluaXRpYWxSZXF1ZXN0T3ZlcmhlYWQgPSBwYXJzZUludChzZWN0aW9uc1szXSwgMTApOwogICAgICAgICAgICAgICAgZXN0VG90YWxSZXF1ZXN0c1NpemUgPSBwYXJzZUludChzZWN0aW9uc1s0XSwgMTApOwoKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdXVpZDogdXVpZCwKICAgICAgICAgICAgICAgICAgICBwYXJ0OiBwYXJ0SW5kZXgsCiAgICAgICAgICAgICAgICAgICAgbGFzdEJ5dGVTZW50OiBsYXN0Qnl0ZVNlbnQsCiAgICAgICAgICAgICAgICAgICAgaW5pdGlhbFJlcXVlc3RPdmVyaGVhZDogaW5pdGlhbFJlcXVlc3RPdmVyaGVhZCwKICAgICAgICAgICAgICAgICAgICBlc3RUb3RhbFJlcXVlc3RzU2l6ZTogZXN0VG90YWxSZXF1ZXN0c1NpemUKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBsb2coJ0lnbm9yaW5nIHByZXZpb3VzbHkgc3RvcmVkIHJlc3VtZS9jaHVuayBjb29raWUgZm9yICcgKyBmaWxlbmFtZSArICIgLSBvbGQgY29va2llIGZvcm1hdCIsICJ3YXJuIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0Q2h1bmtEYXRhQ29va2llTmFtZShpZCkgewogICAgICAgIHZhciBmaWxlbmFtZSA9IGFwaS5nZXROYW1lKGlkKSwKICAgICAgICAgICAgZmlsZVNpemUgPSBhcGkuZ2V0U2l6ZShpZCksCiAgICAgICAgICAgIG1heENodW5rU2l6ZSA9IG9wdGlvbnMuY2h1bmtpbmcucGFydFNpemUsCiAgICAgICAgICAgIGNvb2tpZU5hbWU7CgogICAgICAgIGNvb2tpZU5hbWUgPSAicXFmaWxlY2h1bmsiICsgY29va2llSXRlbURlbGltaXRlciArIGVuY29kZVVSSUNvbXBvbmVudChmaWxlbmFtZSkgKyBjb29raWVJdGVtRGVsaW1pdGVyICsgZmlsZVNpemUgKyBjb29raWVJdGVtRGVsaW1pdGVyICsgbWF4Q2h1bmtTaXplOwoKICAgICAgICBpZiAocmVzdW1lSWQgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBjb29raWVOYW1lICs9IGNvb2tpZUl0ZW1EZWxpbWl0ZXIgKyByZXN1bWVJZDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBjb29raWVOYW1lOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldFJlc3VtZUlkKCkgewogICAgICAgIGlmIChvcHRpb25zLnJlc3VtZS5pZCAhPT0gbnVsbCAmJgogICAgICAgICAgICBvcHRpb25zLnJlc3VtZS5pZCAhPT0gdW5kZWZpbmVkICYmCiAgICAgICAgICAgICFxcS5pc0Z1bmN0aW9uKG9wdGlvbnMucmVzdW1lLmlkKSAmJgogICAgICAgICAgICAhcXEuaXNPYmplY3Qob3B0aW9ucy5yZXN1bWUuaWQpKSB7CgogICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5yZXN1bWUuaWQ7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGhhbmRsZUZpbGVDaHVua2luZ1VwbG9hZChpZCwgcmV0cnkpIHsKICAgICAgICB2YXIgbmFtZSA9IGFwaS5nZXROYW1lKGlkKSwKICAgICAgICAgICAgZmlyc3RDaHVua0luZGV4ID0gMCwKICAgICAgICAgICAgcGVyc2lzdGVkQ2h1bmtJbmZvRm9yUmVzdW1lLCBmaXJzdENodW5rRGF0YUZvclJlc3VtZSwgY3VycmVudENodW5rSW5kZXg7CgogICAgICAgIGlmICghZmlsZVN0YXRlW2lkXS5yZW1haW5pbmdDaHVua0lkeHMgfHwgZmlsZVN0YXRlW2lkXS5yZW1haW5pbmdDaHVua0lkeHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIGZpbGVTdGF0ZVtpZF0ucmVtYWluaW5nQ2h1bmtJZHhzID0gW107CgogICAgICAgICAgICBpZiAocmVzdW1lRW5hYmxlZCAmJiAhcmV0cnkgJiYgZmlsZVN0YXRlW2lkXS5maWxlKSB7CiAgICAgICAgICAgICAgICBwZXJzaXN0ZWRDaHVua0luZm9Gb3JSZXN1bWUgPSBnZXRQZXJzaXN0ZWRDaHVua0RhdGEoaWQpOwogICAgICAgICAgICAgICAgaWYgKHBlcnNpc3RlZENodW5rSW5mb0ZvclJlc3VtZSkgewogICAgICAgICAgICAgICAgICAgIGZpcnN0Q2h1bmtEYXRhRm9yUmVzdW1lID0gZ2V0Q2h1bmtEYXRhKGlkLCBwZXJzaXN0ZWRDaHVua0luZm9Gb3JSZXN1bWUucGFydCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMub25SZXN1bWUoaWQsIG5hbWUsIGdldENodW5rRGF0YUZvckNhbGxiYWNrKGZpcnN0Q2h1bmtEYXRhRm9yUmVzdW1lKSkgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q2h1bmtJbmRleCA9IHBlcnNpc3RlZENodW5rSW5mb0ZvclJlc3VtZS5wYXJ0OwogICAgICAgICAgICAgICAgICAgICAgICBmaWxlU3RhdGVbaWRdLnV1aWQgPSBwZXJzaXN0ZWRDaHVua0luZm9Gb3JSZXN1bWUudXVpZDsKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVN0YXRlW2lkXS5sb2FkZWQgPSBwZXJzaXN0ZWRDaHVua0luZm9Gb3JSZXN1bWUubGFzdEJ5dGVTZW50OwogICAgICAgICAgICAgICAgICAgICAgICBmaWxlU3RhdGVbaWRdLmVzdFRvdGFsUmVxdWVzdHNTaXplID0gcGVyc2lzdGVkQ2h1bmtJbmZvRm9yUmVzdW1lLmVzdFRvdGFsUmVxdWVzdHNTaXplOwogICAgICAgICAgICAgICAgICAgICAgICBmaWxlU3RhdGVbaWRdLmluaXRpYWxSZXF1ZXN0T3ZlcmhlYWQgPSBwZXJzaXN0ZWRDaHVua0luZm9Gb3JSZXN1bWUuaW5pdGlhbFJlcXVlc3RPdmVyaGVhZDsKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVN0YXRlW2lkXS5hdHRlbXB0aW5nUmVzdW1lID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCdSZXN1bWluZyAnICsgbmFtZSArICIgYXQgcGFydGl0aW9uIGluZGV4ICIgKyBmaXJzdENodW5rSW5kZXgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yIChjdXJyZW50Q2h1bmtJbmRleCA9IGdldFRvdGFsQ2h1bmtzKGlkKS0xOyBjdXJyZW50Q2h1bmtJbmRleCA+PSBmaXJzdENodW5rSW5kZXg7IGN1cnJlbnRDaHVua0luZGV4LT0xKSB7CiAgICAgICAgICAgICAgICBmaWxlU3RhdGVbaWRdLnJlbWFpbmluZ0NodW5rSWR4cy51bnNoaWZ0KGN1cnJlbnRDaHVua0luZGV4KTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdXBsb2FkTmV4dENodW5rKGlkKTsKICAgIH0KCiAgICBmdW5jdGlvbiBoYW5kbGVTdGFuZGFyZEZpbGVVcGxvYWQoaWQpIHsKICAgICAgICB2YXIgZmlsZU9yQmxvYiA9IGZpbGVTdGF0ZVtpZF0uZmlsZSB8fCBmaWxlU3RhdGVbaWRdLmJsb2JEYXRhLmJsb2IsCiAgICAgICAgICAgIG5hbWUgPSBhcGkuZ2V0TmFtZShpZCksCiAgICAgICAgICAgIHhociwgcGFyYW1zLCB0b1NlbmQ7CgogICAgICAgIGZpbGVTdGF0ZVtpZF0ubG9hZGVkID0gMDsKCiAgICAgICAgeGhyID0gY3JlYXRlWGhyKGlkKTsKCiAgICAgICAgeGhyLnVwbG9hZC5vbnByb2dyZXNzID0gZnVuY3Rpb24oZSl7CiAgICAgICAgICAgIGlmIChlLmxlbmd0aENvbXB1dGFibGUpewogICAgICAgICAgICAgICAgZmlsZVN0YXRlW2lkXS5sb2FkZWQgPSBlLmxvYWRlZDsKICAgICAgICAgICAgICAgIG9wdGlvbnMub25Qcm9ncmVzcyhpZCwgbmFtZSwgZS5sb2FkZWQsIGUudG90YWwpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGdldFJlYWR5U3RhdGVDaGFuZ2VIYW5kbGVyKGlkLCB4aHIpOwoKICAgICAgICBwYXJhbXMgPSBvcHRpb25zLnBhcmFtc1N0b3JlLmdldFBhcmFtcyhpZCk7CiAgICAgICAgdG9TZW5kID0gc2V0UGFyYW1zQW5kR2V0RW50aXR5VG9TZW5kKHBhcmFtcywgeGhyLCBmaWxlT3JCbG9iLCBpZCk7CiAgICAgICAgc2V0SGVhZGVycyhpZCwgeGhyKTsKCiAgICAgICAgbG9nKCdTZW5kaW5nIHVwbG9hZCByZXF1ZXN0IGZvciAnICsgaWQpOwogICAgICAgIHhoci5zZW5kKHRvU2VuZCk7CiAgICB9CgoKICAgIGFwaSA9IHsKICAgICAgICAvKioKICAgICAgICAgKiBBZGRzIEZpbGUgb3IgQmxvYiB0byB0aGUgcXVldWUKICAgICAgICAgKiBSZXR1cm5zIGlkIHRvIHVzZSB3aXRoIHVwbG9hZCwgY2FuY2VsCiAgICAgICAgICoqLwogICAgICAgIGFkZDogZnVuY3Rpb24oZmlsZU9yQmxvYkRhdGEpewogICAgICAgICAgICB2YXIgaWQ7CgogICAgICAgICAgICBpZiAoZmlsZU9yQmxvYkRhdGEgaW5zdGFuY2VvZiBGaWxlKSB7CiAgICAgICAgICAgICAgICBpZCA9IGZpbGVTdGF0ZS5wdXNoKHtmaWxlOiBmaWxlT3JCbG9iRGF0YX0pIC0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChmaWxlT3JCbG9iRGF0YS5ibG9iIGluc3RhbmNlb2YgQmxvYikgewogICAgICAgICAgICAgICAgaWQgPSBmaWxlU3RhdGUucHVzaCh7YmxvYkRhdGE6IGZpbGVPckJsb2JEYXRhfSkgLSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXNzZWQgb2JqIGluIG5vdCBhIEZpbGUgb3IgQmxvYkRhdGEgKGluIHFxLlVwbG9hZEhhbmRsZXJYaHIpJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZpbGVTdGF0ZVtpZF0udXVpZCA9IHFxLmdldFVuaXF1ZUlkKCk7CiAgICAgICAgICAgIHJldHVybiBpZDsKICAgICAgICB9LAogICAgICAgIGdldE5hbWU6IGZ1bmN0aW9uKGlkKXsKICAgICAgICAgICAgaWYgKGFwaS5pc1ZhbGlkKGlkKSkgewogICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBmaWxlU3RhdGVbaWRdLmZpbGUsCiAgICAgICAgICAgICAgICAgICAgYmxvYkRhdGEgPSBmaWxlU3RhdGVbaWRdLmJsb2JEYXRhOwoKICAgICAgICAgICAgICAgIGlmIChmaWxlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gZml4IG1pc3NpbmcgbmFtZSBpbiBTYWZhcmkgNAogICAgICAgICAgICAgICAgICAgIC8vTk9URTogZml4ZWQgbWlzc2luZyBuYW1lIGZpcmVmb3ggMTEuMGEyIGZpbGUuZmlsZU5hbWUgaXMgYWN0dWFsbHkgdW5kZWZpbmVkCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChmaWxlLmZpbGVOYW1lICE9PSBudWxsICYmIGZpbGUuZmlsZU5hbWUgIT09IHVuZGVmaW5lZCkgPyBmaWxlLmZpbGVOYW1lIDogZmlsZS5uYW1lOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJsb2JEYXRhLm5hbWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBsb2coaWQgKyAiIGlzIG5vdCBhIHZhbGlkIGl0ZW0gSUQuIiwgImVycm9yIik7CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIGdldFNpemU6IGZ1bmN0aW9uKGlkKXsKICAgICAgICAgICAgLypqc2hpbnQgZXFudWxsOiB0cnVlKi8KICAgICAgICAgICAgdmFyIGZpbGVPckJsb2IgPSBmaWxlU3RhdGVbaWRdLmZpbGUgfHwgZmlsZVN0YXRlW2lkXS5ibG9iRGF0YS5ibG9iOwoKICAgICAgICAgICAgaWYgKHFxLmlzRmlsZU9ySW5wdXQoZmlsZU9yQmxvYikpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmaWxlT3JCbG9iLmZpbGVTaXplICE9IG51bGwgPyBmaWxlT3JCbG9iLmZpbGVTaXplIDogZmlsZU9yQmxvYi5zaXplOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIGZpbGVPckJsb2Iuc2l6ZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgZ2V0RmlsZTogZnVuY3Rpb24oaWQpIHsKICAgICAgICAgICAgaWYgKGZpbGVTdGF0ZVtpZF0pIHsKICAgICAgICAgICAgICAgIHJldHVybiBmaWxlU3RhdGVbaWRdLmZpbGUgfHwgZmlsZVN0YXRlW2lkXS5ibG9iRGF0YS5ibG9iOwogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHVwbG9hZGVkIGJ5dGVzIGZvciBmaWxlIGlkZW50aWZpZWQgYnkgaWQKICAgICAgICAgKi8KICAgICAgICBnZXRMb2FkZWQ6IGZ1bmN0aW9uKGlkKXsKICAgICAgICAgICAgcmV0dXJuIGZpbGVTdGF0ZVtpZF0ubG9hZGVkIHx8IDA7CiAgICAgICAgfSwKICAgICAgICBpc1ZhbGlkOiBmdW5jdGlvbihpZCkgewogICAgICAgICAgICByZXR1cm4gZmlsZVN0YXRlW2lkXSAhPT0gdW5kZWZpbmVkOwogICAgICAgIH0sCiAgICAgICAgcmVzZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBmaWxlU3RhdGUgPSBbXTsKICAgICAgICB9LAogICAgICAgIGdldFV1aWQ6IGZ1bmN0aW9uKGlkKSB7CiAgICAgICAgICAgIHJldHVybiBmaWxlU3RhdGVbaWRdLnV1aWQ7CiAgICAgICAgfSwKICAgICAgICAvKioKICAgICAgICAgKiBTZW5kcyB0aGUgZmlsZSBpZGVudGlmaWVkIGJ5IGlkIHRvIHRoZSBzZXJ2ZXIKICAgICAgICAgKi8KICAgICAgICB1cGxvYWQ6IGZ1bmN0aW9uKGlkLCByZXRyeSl7CiAgICAgICAgICAgIHZhciBuYW1lID0gdGhpcy5nZXROYW1lKGlkKTsKCiAgICAgICAgICAgIG9wdGlvbnMub25VcGxvYWQoaWQsIG5hbWUpOwoKICAgICAgICAgICAgaWYgKGNodW5rRmlsZXMpIHsKICAgICAgICAgICAgICAgIGhhbmRsZUZpbGVDaHVua2luZ1VwbG9hZChpZCwgcmV0cnkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaGFuZGxlU3RhbmRhcmRGaWxlVXBsb2FkKGlkKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgY2FuY2VsOiBmdW5jdGlvbihpZCl7CiAgICAgICAgICAgIHZhciB4aHIgPSBmaWxlU3RhdGVbaWRdLnhocjsKCiAgICAgICAgICAgIG9wdGlvbnMub25DYW5jZWwoaWQsIHRoaXMuZ2V0TmFtZShpZCkpOwoKICAgICAgICAgICAgaWYgKHhocikgewogICAgICAgICAgICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7CiAgICAgICAgICAgICAgICB4aHIuYWJvcnQoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHJlc3VtZUVuYWJsZWQpIHsKICAgICAgICAgICAgICAgIGRlbGV0ZVBlcnNpc3RlZENodW5rRGF0YShpZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGRlbGV0ZSBmaWxlU3RhdGVbaWRdOwogICAgICAgIH0sCiAgICAgICAgZ2V0UmVzdW1hYmxlRmlsZXNEYXRhOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIG1hdGNoaW5nQ29va2llTmFtZXMgPSBbXSwKICAgICAgICAgICAgICAgIHJlc3VtYWJsZUZpbGVzRGF0YSA9IFtdOwoKICAgICAgICAgICAgaWYgKGNodW5rRmlsZXMgJiYgcmVzdW1lRW5hYmxlZCkgewogICAgICAgICAgICAgICAgaWYgKHJlc3VtZUlkID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICBtYXRjaGluZ0Nvb2tpZU5hbWVzID0gcXEuZ2V0Q29va2llTmFtZXMobmV3IFJlZ0V4cCgiXnFxZmlsZWNodW5rXFwiICsgY29va2llSXRlbURlbGltaXRlciArICIuK1xcIiArCiAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZUl0ZW1EZWxpbWl0ZXIgKyAiXFxkK1xcIiArIGNvb2tpZUl0ZW1EZWxpbWl0ZXIgKyBvcHRpb25zLmNodW5raW5nLnBhcnRTaXplICsgIj0iKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBtYXRjaGluZ0Nvb2tpZU5hbWVzID0gcXEuZ2V0Q29va2llTmFtZXMobmV3IFJlZ0V4cCgiXnFxZmlsZWNodW5rXFwiICsgY29va2llSXRlbURlbGltaXRlciArICIuK1xcIiArCiAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZUl0ZW1EZWxpbWl0ZXIgKyAiXFxkK1xcIiArIGNvb2tpZUl0ZW1EZWxpbWl0ZXIgKyBvcHRpb25zLmNodW5raW5nLnBhcnRTaXplICsgIlxcIiArCiAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZUl0ZW1EZWxpbWl0ZXIgKyByZXN1bWVJZCArICI9IikpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHFxLmVhY2gobWF0Y2hpbmdDb29raWVOYW1lcywgZnVuY3Rpb24oaWR4LCBjb29raWVOYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNvb2tpZXNOYW1lUGFydHMgPSBjb29raWVOYW1lLnNwbGl0KGNvb2tpZUl0ZW1EZWxpbWl0ZXIpOwogICAgICAgICAgICAgICAgICAgIHZhciBjb29raWVWYWx1ZVBhcnRzID0gcXEuZ2V0Q29va2llKGNvb2tpZU5hbWUpLnNwbGl0KGNvb2tpZUl0ZW1EZWxpbWl0ZXIpOwoKICAgICAgICAgICAgICAgICAgICByZXN1bWFibGVGaWxlc0RhdGEucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGRlY29kZVVSSUNvbXBvbmVudChjb29raWVzTmFtZVBhcnRzWzFdKSwKICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogY29va2llc05hbWVQYXJ0c1syXSwKICAgICAgICAgICAgICAgICAgICAgICAgdXVpZDogY29va2llVmFsdWVQYXJ0c1swXSwKICAgICAgICAgICAgICAgICAgICAgICAgcGFydElkeDogY29va2llVmFsdWVQYXJ0c1sxXQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VtYWJsZUZpbGVzRGF0YTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfQogICAgfTsKCiAgICByZXR1cm4gYXBpOwp9OwovKmdsb2JhbHMgalF1ZXJ5LCBxcSovCihmdW5jdGlvbigkKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgdXBsb2FkZXIsICRlbCwgaW5pdCwgZGF0YVN0b3JlLCBwbHVnaW5PcHRpb24sIHBsdWdpbk9wdGlvbnMsIGFkZENhbGxiYWNrcywgdHJhbnNmb3JtVmFyaWFibGVzLCBpc1ZhbGlkQ29tbWFuZCwKICAgICAgICBkZWxlZ2F0ZUNvbW1hbmQ7CgogICAgcGx1Z2luT3B0aW9ucyA9IFsndXBsb2FkZXJUeXBlJ107CgogICAgaW5pdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgaWYgKG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIHhmb3JtZWRPcHRzID0gdHJhbnNmb3JtVmFyaWFibGVzKG9wdGlvbnMpOwogICAgICAgICAgICBhZGRDYWxsYmFja3MoeGZvcm1lZE9wdHMpOwoKICAgICAgICAgICAgaWYgKHBsdWdpbk9wdGlvbigndXBsb2FkZXJUeXBlJykgPT09ICdiYXNpYycpIHsKICAgICAgICAgICAgICAgIHVwbG9hZGVyKG5ldyBxcS5GaW5lVXBsb2FkZXJCYXNpYyh4Zm9ybWVkT3B0cykpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdXBsb2FkZXIobmV3IHFxLkZpbmVVcGxvYWRlcih4Zm9ybWVkT3B0cykpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGVsOwogICAgfTsKCiAgICBkYXRhU3RvcmUgPSBmdW5jdGlvbihrZXksIHZhbCkgewogICAgICAgIHZhciBkYXRhID0gJGVsLmRhdGEoJ2ZpbmV1cGxvYWRlcicpOwoKICAgICAgICBpZiAodmFsKSB7CiAgICAgICAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIGRhdGEgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBkYXRhW2tleV0gPSB2YWw7CiAgICAgICAgICAgICRlbC5kYXRhKCdmaW5ldXBsb2FkZXInLCBkYXRhKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBkYXRhW2tleV07CiAgICAgICAgfQogICAgfTsKCiAgICAvL3RoZSB1bmRlcmx5aW5nIEZpbmUgVXBsb2FkZXIgaW5zdGFuY2UgaXMgc3RvcmVkIGluIGpRdWVyeSdzIGRhdGEgc3RvcmVkLCBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnQKICAgIC8vIHRpZWQgdG8gdGhpcyBpbnN0YW5jZSBvZiB0aGUgcGx1Zy1pbgogICAgdXBsb2FkZXIgPSBmdW5jdGlvbihpbnN0YW5jZVRvU3RvcmUpIHsKICAgICAgICByZXR1cm4gZGF0YVN0b3JlKCd1cGxvYWRlcicsIGluc3RhbmNlVG9TdG9yZSk7CiAgICB9OwoKICAgIHBsdWdpbk9wdGlvbiA9IGZ1bmN0aW9uKG9wdGlvbiwgb3B0aW9uVmFsKSB7CiAgICAgICAgcmV0dXJuIGRhdGFTdG9yZShvcHRpb24sIG9wdGlvblZhbCk7CiAgICB9OwoKICAgIC8vaW1wbGVtZW50IGFsbCBjYWxsYmFja3MgZGVmaW5lZCBpbiBGaW5lIFVwbG9hZGVyIGFzIGZ1bmN0aW9ucyB0aGF0IHRyaWdnZXIgYXBwcm9wcmlhdGVseSBuYW1lcyBldmVudHMgYW5kCiAgICAvLyByZXR1cm4gdGhlIHJlc3VsdCBvZiBleGVjdXRpbmcgdGhlIGJvdW5kIGhhbmRsZXIgYmFjayB0byBGaW5lIFVwbG9hZGVyCiAgICBhZGRDYWxsYmFja3MgPSBmdW5jdGlvbih0cmFuc2Zvcm1lZE9wdHMpIHsKICAgICAgICB2YXIgY2FsbGJhY2tzID0gdHJhbnNmb3JtZWRPcHRzLmNhbGxiYWNrcyA9IHt9LAogICAgICAgICAgICB1cGxvYWRlckluc3QgPSBuZXcgcXEuRmluZVVwbG9hZGVyQmFzaWMoKTsKCiAgICAgICAgJC5lYWNoKHVwbG9hZGVySW5zdC5fb3B0aW9ucy5jYWxsYmFja3MsIGZ1bmN0aW9uKHByb3AsIGZ1bmMpIHsKICAgICAgICAgICAgdmFyIG5hbWUsICRjYWxsYmFja0VsOwoKICAgICAgICAgICAgbmFtZSA9IC9eb24oXHcrKS8uZXhlYyhwcm9wKVsxXTsKICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIDEpLnRvTG93ZXJDYXNlKCkgKyBuYW1lLnN1YnN0cmluZygxKTsKICAgICAgICAgICAgJGNhbGxiYWNrRWwgPSAkZWw7CgogICAgICAgICAgICBjYWxsYmFja3NbcHJvcF0gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBvcmlnRnVuYyA9IGZ1bmMsCiAgICAgICAgICAgICAgICAgICAgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyksCiAgICAgICAgICAgICAgICAgICAganF1ZXJ5SGFuZGxlclJlc3VsdCA9ICRjYWxsYmFja0VsLnRyaWdnZXJIYW5kbGVyKG5hbWUsIGFyZ3MpOwoKICAgICAgICAgICAgICAgIGlmIChqcXVlcnlIYW5kbGVyUmVzdWx0ID09PSB1bmRlZmluZWQgJiYKICAgICAgICAgICAgICAgICAgICAgICAgJC5pbkFycmF5KHByb3AsIHVwbG9hZGVySW5zdC5nZXRQcm9taXNzb3J5Q2FsbGJhY2tOYW1lcygpKSA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdGdW5jKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIGpxdWVyeUhhbmRsZXJSZXN1bHQ7CiAgICAgICAgICAgIH07CiAgICAgICAgfSk7CiAgICB9OwoKICAgIC8vdHJhbnNmb3JtIGpRdWVyeSBvYmplY3RzIGludG8gSFRNTEVsZW1lbnRzLCBhbmQgcGFzcyBhbG9uZyBhbGwgb3RoZXIgb3B0aW9uIHByb3BlcnRpZXMKICAgIHRyYW5zZm9ybVZhcmlhYmxlcyA9IGZ1bmN0aW9uKHNvdXJjZSwgZGVzdCkgewogICAgICAgIHZhciB4Zm9ybWVkLCBhcnJheVZhbHM7CgogICAgICAgIGlmIChkZXN0ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgaWYgKHNvdXJjZS51cGxvYWRlclR5cGUgIT09ICdiYXNpYycpIHsKICAgICAgICAgICAgICAgIHhmb3JtZWQgPSB7IGVsZW1lbnQgOiAkZWxbMF0gfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHhmb3JtZWQgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgeGZvcm1lZCA9IGRlc3Q7CiAgICAgICAgfQoKICAgICAgICAkLmVhY2goc291cmNlLCBmdW5jdGlvbihwcm9wLCB2YWwpIHsKICAgICAgICAgICAgaWYgKCQuaW5BcnJheShwcm9wLCBwbHVnaW5PcHRpb25zKSA+PSAwKSB7CiAgICAgICAgICAgICAgICBwbHVnaW5PcHRpb24ocHJvcCwgdmFsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh2YWwgaW5zdGFuY2VvZiAkKSB7CiAgICAgICAgICAgICAgICB4Zm9ybWVkW3Byb3BdID0gdmFsWzBdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCQuaXNQbGFpbk9iamVjdCh2YWwpKSB7CiAgICAgICAgICAgICAgICB4Zm9ybWVkW3Byb3BdID0ge307CiAgICAgICAgICAgICAgICB0cmFuc2Zvcm1WYXJpYWJsZXModmFsLCB4Zm9ybWVkW3Byb3BdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICgkLmlzQXJyYXkodmFsKSkgewogICAgICAgICAgICAgICAgYXJyYXlWYWxzID0gW107CiAgICAgICAgICAgICAgICAkLmVhY2godmFsLCBmdW5jdGlvbihpZHgsIGFycmF5VmFsKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGFycmF5VmFsIGluc3RhbmNlb2YgJCkgewogICAgICAgICAgICAgICAgICAgICAgICAkLm1lcmdlKGFycmF5VmFscywgYXJyYXlWYWwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlWYWxzLnB1c2goYXJyYXlWYWwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgeGZvcm1lZFtwcm9wXSA9IGFycmF5VmFsczsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHhmb3JtZWRbcHJvcF0gPSB2YWw7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgaWYgKGRlc3QgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICByZXR1cm4geGZvcm1lZDsKICAgICAgICB9CiAgICB9OwoKICAgIGlzVmFsaWRDb21tYW5kID0gZnVuY3Rpb24oY29tbWFuZCkgewogICAgICAgIHJldHVybiAkLnR5cGUoY29tbWFuZCkgPT09ICJzdHJpbmciICYmCiAgICAgICAgICAgICFjb21tYW5kLm1hdGNoKC9eXy8pICYmIC8vZW5mb3JjZSBwcml2YXRlIG1ldGhvZHMgY29udmVudGlvbgogICAgICAgICAgICB1cGxvYWRlcigpW2NvbW1hbmRdICE9PSB1bmRlZmluZWQ7CiAgICB9OwoKICAgIC8vYXNzdW1pbmcgd2UgaGF2ZSBhbHJlYWR5IHZlcmlmaWVkIHRoYXQgdGhpcyBpcyBhIHZhbGlkIGNvbW1hbmQsIGNhbGwgdGhlIGFzc29jaWF0ZWQgZnVuY3Rpb24gaW4gdGhlIHVuZGVybHlpbmcKICAgIC8vIEZpbmUgVXBsb2FkZXIgaW5zdGFuY2UgKHBhc3NpbmcgYWxvbmcgdGhlIGFyZ3VtZW50cyBmcm9tIHRoZSBjYWxsZXIpIGFuZCByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgY2FsbCBiYWNrIHRvIHRoZSBjYWxsZXIKICAgIGRlbGVnYXRlQ29tbWFuZCA9IGZ1bmN0aW9uKGNvbW1hbmQpIHsKICAgICAgICB2YXIgeGZvcm1lZEFyZ3MgPSBbXSwgb3JpZ0FyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwoKICAgICAgICB0cmFuc2Zvcm1WYXJpYWJsZXMob3JpZ0FyZ3MsIHhmb3JtZWRBcmdzKTsKCiAgICAgICAgcmV0dXJuIHVwbG9hZGVyKClbY29tbWFuZF0uYXBwbHkodXBsb2FkZXIoKSwgeGZvcm1lZEFyZ3MpOwogICAgfTsKCiAgICAkLmZuLmZpbmVVcGxvYWRlciA9IGZ1bmN0aW9uKG9wdGlvbnNPckNvbW1hbmQpIHsKICAgICAgICB2YXIgc2VsZiA9IHRoaXMsIHNlbGZBcmdzID0gYXJndW1lbnRzLCByZXRWYWxzID0gW107CgogICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbihpbmRleCwgZWwpIHsKICAgICAgICAgICAgJGVsID0gJChlbCk7CgogICAgICAgICAgICBpZiAodXBsb2FkZXIoKSAmJiBpc1ZhbGlkQ29tbWFuZChvcHRpb25zT3JDb21tYW5kKSkgewogICAgICAgICAgICAgICAgcmV0VmFscy5wdXNoKGRlbGVnYXRlQ29tbWFuZC5hcHBseShzZWxmLCBzZWxmQXJncykpOwoKICAgICAgICAgICAgICAgIGlmIChzZWxmLmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0eXBlb2Ygb3B0aW9uc09yQ29tbWFuZCA9PT0gJ29iamVjdCcgfHwgIW9wdGlvbnNPckNvbW1hbmQpIHsKICAgICAgICAgICAgICAgIGluaXQuYXBwbHkoc2VsZiwgc2VsZkFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJC5lcnJvcignTWV0aG9kICcgKyAgb3B0aW9uc09yQ29tbWFuZCArICcgZG9lcyBub3QgZXhpc3Qgb24galF1ZXJ5LmZpbmVVcGxvYWRlcicpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIGlmIChyZXRWYWxzLmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICByZXR1cm4gcmV0VmFsc1swXTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAocmV0VmFscy5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgIHJldHVybiByZXRWYWxzOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwoKfShqUXVlcnkpKTsK]]></data>
	</file>
	<file>
	  <filename>/lib/js/fineuploader/jquery.fineuploader-3.4.1.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dmFyIHFxPWZ1bmN0aW9uKGEpe3JldHVybntoaWRlOmZ1bmN0aW9uKCl7YS5zdHlsZS5kaXNwbGF5PSJub25lIjtyZXR1cm4gdGhpc30sYXR0YWNoOmZ1bmN0aW9uKGIsYyl7YS5hZGRFdmVudExpc3RlbmVyP2EuYWRkRXZlbnRMaXN0ZW5lcihiLGMsITEpOmEuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9uIitiLGMpO3JldHVybiBmdW5jdGlvbigpe3FxKGEpLmRldGFjaChiLGMpfX0sZGV0YWNoOmZ1bmN0aW9uKGIsYyl7YS5yZW1vdmVFdmVudExpc3RlbmVyP2EucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGMsITEpOmEuYXR0YWNoRXZlbnQmJmEuZGV0YWNoRXZlbnQoIm9uIitiLGMpO3JldHVybiB0aGlzfSxjb250YWluczpmdW5jdGlvbihiKXtyZXR1cm4gYT09PWI/ITA6YS5jb250YWlucz9hLmNvbnRhaW5zKGIpOiEhKGIuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYSkmOCl9LGluc2VydEJlZm9yZTpmdW5jdGlvbihiKXtiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsYik7CnJldHVybiB0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXthLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYSk7cmV0dXJuIHRoaXN9LGNzczpmdW5jdGlvbihiKXtudWxsIT09Yi5vcGFjaXR5JiYoInN0cmluZyIhPT10eXBlb2YgYS5zdHlsZS5vcGFjaXR5JiYidW5kZWZpbmVkIiE9PXR5cGVvZiBhLmZpbHRlcnMpJiYoYi5maWx0ZXI9ImFscGhhKG9wYWNpdHk9IitNYXRoLnJvdW5kKDEwMCpiLm9wYWNpdHkpKyIpIik7cXEuZXh0ZW5kKGEuc3R5bGUsYik7cmV0dXJuIHRoaXN9LGhhc0NsYXNzOmZ1bmN0aW9uKGIpe3JldHVybiBSZWdFeHAoIihefCApIitiKyIoIHwkKSIpLnRlc3QoYS5jbGFzc05hbWUpfSxhZGRDbGFzczpmdW5jdGlvbihiKXtxcShhKS5oYXNDbGFzcyhiKXx8KGEuY2xhc3NOYW1lKz0iICIrYik7cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGIpe2EuY2xhc3NOYW1lPWEuY2xhc3NOYW1lLnJlcGxhY2UoUmVnRXhwKCIoXnwgKSIrYisiKCB8JCkiKSwiICIpLnJlcGxhY2UoL15ccyt8XHMrJC9nLAoiIik7cmV0dXJuIHRoaXN9LGdldEJ5Q2xhc3M6ZnVuY3Rpb24oYil7dmFyIGMsZD1bXTtpZihhLnF1ZXJ5U2VsZWN0b3JBbGwpcmV0dXJuIGEucXVlcnlTZWxlY3RvckFsbCgiLiIrYik7Yz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7cXEuZWFjaChjLGZ1bmN0aW9uKGEsYyl7cXEoYykuaGFzQ2xhc3MoYikmJmQucHVzaChjKX0pO3JldHVybiBkfSxjaGlsZHJlbjpmdW5jdGlvbigpe2Zvcih2YXIgYj1bXSxjPWEuZmlyc3RDaGlsZDtjOykxPT09Yy5ub2RlVHlwZSYmYi5wdXNoKGMpLGM9Yy5uZXh0U2libGluZztyZXR1cm4gYn0sc2V0VGV4dDpmdW5jdGlvbihiKXthLmlubmVyVGV4dD1iO2EudGV4dENvbnRlbnQ9YjtyZXR1cm4gdGhpc30sY2xlYXJUZXh0OmZ1bmN0aW9uKCl7cmV0dXJuIHFxKGEpLnNldFRleHQoIiIpfX19OwpxcS5sb2c9ZnVuY3Rpb24oYSxiKXtpZih3aW5kb3cuY29uc29sZSlpZighYnx8ImluZm8iPT09Yil3aW5kb3cuY29uc29sZS5sb2coYSk7ZWxzZSBpZih3aW5kb3cuY29uc29sZVtiXSl3aW5kb3cuY29uc29sZVtiXShhKTtlbHNlIHdpbmRvdy5jb25zb2xlLmxvZygiPCIrYisiPiAiK2EpfTtxcS5pc09iamVjdD1mdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9PWEmJmEmJiJvYmplY3QiPT09dHlwZW9mIGEmJmEuY29uc3RydWN0b3I9PT1PYmplY3R9O3FxLmlzRnVuY3Rpb249ZnVuY3Rpb24oYSl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiBhfTtxcS5pc1N0cmluZz1mdW5jdGlvbihhKXtyZXR1cm4iW29iamVjdCBTdHJpbmddIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKX07cXEudHJpbVN0cj1mdW5jdGlvbihhKXtyZXR1cm4gU3RyaW5nLnByb3RvdHlwZS50cmltP2EudHJpbSgpOmEucmVwbGFjZSgvXlxzK3xccyskL2csIiIpfTsKcXEuaXNGaWxlT3JJbnB1dD1mdW5jdGlvbihhKXtpZihxcS5pc0Jsb2IoYSkmJndpbmRvdy5GaWxlJiZhIGluc3RhbmNlb2YgRmlsZSlyZXR1cm4hMDtpZih3aW5kb3cuSFRNTElucHV0RWxlbWVudCl7aWYoYSBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQmJmEudHlwZSYmImZpbGUiPT09YS50eXBlLnRvTG93ZXJDYXNlKCkpcmV0dXJuITB9ZWxzZSBpZihhLnRhZ05hbWUmJiJpbnB1dCI9PT1hLnRhZ05hbWUudG9Mb3dlckNhc2UoKSYmYS50eXBlJiYiZmlsZSI9PT1hLnR5cGUudG9Mb3dlckNhc2UoKSlyZXR1cm4hMDtyZXR1cm4hMX07cXEuaXNCbG9iPWZ1bmN0aW9uKGEpe3JldHVybiB3aW5kb3cuQmxvYiYmYSBpbnN0YW5jZW9mIEJsb2J9OwpxcS5pc1hoclVwbG9hZFN1cHBvcnRlZD1mdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7YS50eXBlPSJmaWxlIjtyZXR1cm4gdm9pZCAwIT09YS5tdWx0aXBsZSYmInVuZGVmaW5lZCIhPT10eXBlb2YgRmlsZSYmInVuZGVmaW5lZCIhPT10eXBlb2YgRm9ybURhdGEmJiJ1bmRlZmluZWQiIT09dHlwZW9mKG5ldyBYTUxIdHRwUmVxdWVzdCkudXBsb2FkfTtxcS5pc0ZvbGRlckRyb3BTdXBwb3J0ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXRlbXMmJmEuaXRlbXNbMF0ud2Via2l0R2V0QXNFbnRyeX07cXEuaXNGaWxlQ2h1bmtpbmdTdXBwb3J0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hcXEuYW5kcm9pZCgpJiZxcS5pc1hoclVwbG9hZFN1cHBvcnRlZCgpJiYoRmlsZS5wcm90b3R5cGUuc2xpY2V8fEZpbGUucHJvdG90eXBlLndlYmtpdFNsaWNlfHxGaWxlLnByb3RvdHlwZS5tb3pTbGljZSl9OwpxcS5leHRlbmQ9ZnVuY3Rpb24oYSxiLGMpe3FxLmVhY2goYixmdW5jdGlvbihiLGUpe2MmJnFxLmlzT2JqZWN0KGUpPyh2b2lkIDA9PT1hW2JdJiYoYVtiXT17fSkscXEuZXh0ZW5kKGFbYl0sZSwhMCkpOmFbYl09ZX0pfTtxcS5pbmRleE9mPWZ1bmN0aW9uKGEsYixjKXtpZihhLmluZGV4T2YpcmV0dXJuIGEuaW5kZXhPZihiLGMpO3ZhciBjPWN8fDAsZD1hLmxlbmd0aDtmb3IoMD5jJiYoYys9ZCk7YzxkO2MrPTEpaWYoYS5oYXNPd25Qcm9wZXJ0eShjKSYmYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9O3FxLmdldFVuaXF1ZUlkPWZ1bmN0aW9uKCl7cmV0dXJuInh4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCIucmVwbGFjZSgvW3h5XS9nLGZ1bmN0aW9uKGEpe3ZhciBiPTE2Kk1hdGgucmFuZG9tKCl8MDtyZXR1cm4oIngiPT1hP2I6YiYzfDgpLnRvU3RyaW5nKDE2KX0pfTtxcS5pZT1mdW5jdGlvbigpe3JldHVybi0xIT09bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIil9OwpxcS5pZTEwPWZ1bmN0aW9uKCl7cmV0dXJuLTEhPT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUgMTAiKX07cXEuc2FmYXJpPWZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMCE9PW5hdmlnYXRvci52ZW5kb3ImJi0xIT09bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfTtxcS5jaHJvbWU9ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwIT09bmF2aWdhdG9yLnZlbmRvciYmLTEhPT1uYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkdvb2dsZSIpfTtxcS5maXJlZm94PWZ1bmN0aW9uKCl7cmV0dXJuLTEhPT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1vemlsbGEiKSYmdm9pZCAwIT09bmF2aWdhdG9yLnZlbmRvciYmIiI9PT1uYXZpZ2F0b3IudmVuZG9yfTtxcS53aW5kb3dzPWZ1bmN0aW9uKCl7cmV0dXJuIldpbjMyIj09PW5hdmlnYXRvci5wbGF0Zm9ybX07cXEuYW5kcm9pZD1mdW5jdGlvbigpe3JldHVybi0xIT09bmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImFuZHJvaWQiKX07CnFxLnByZXZlbnREZWZhdWx0PWZ1bmN0aW9uKGEpe2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9O3FxLnRvRWxlbWVudD1mdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiBmdW5jdGlvbihiKXthLmlubmVySFRNTD1iO2I9YS5maXJzdENoaWxkO2EucmVtb3ZlQ2hpbGQoYik7cmV0dXJuIGJ9fSgpO3FxLmVhY2g9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkO2lmKGEpZm9yKGMgaW4gYSlpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxjKSYmKGQ9YihjLGFbY10pLCExPT09ZCkpYnJlYWt9OwpxcS5vYmoydXJsPWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlPVtdLGY9IiYiLGc9ZnVuY3Rpb24oYSxjKXt2YXIgZD1iPy9cW1xdJC8udGVzdChiKT9iOmIrIlsiK2MrIl0iOmM7InVuZGVmaW5lZCIhPT1kJiYidW5kZWZpbmVkIiE9PWMmJmUucHVzaCgib2JqZWN0Ij09PXR5cGVvZiBhP3FxLm9iajJ1cmwoYSxkLCEwKToiW29iamVjdCBGdW5jdGlvbl0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpP2VuY29kZVVSSUNvbXBvbmVudChkKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEoKSk6ZW5jb2RlVVJJQ29tcG9uZW50KGQpKyI9IitlbmNvZGVVUklDb21wb25lbnQoYSkpfTtpZighYyYmYilmPS9cPy8udGVzdChiKT8vXD8kLy50ZXN0KGIpPyIiOiImIjoiPyIsZS5wdXNoKGIpLGUucHVzaChxcS5vYmoydXJsKGEpKTtlbHNlIGlmKCJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSkmJiJ1bmRlZmluZWQiIT09dHlwZW9mIGEpe2Q9Ci0xO2ZvcihjPWEubGVuZ3RoO2Q8YztkKz0xKWcoYVtkXSxkKX1lbHNlIGlmKCJ1bmRlZmluZWQiIT09dHlwZW9mIGEmJm51bGwhPT1hJiYib2JqZWN0Ij09PXR5cGVvZiBhKWZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmZyhhW2RdLGQpO2Vsc2UgZS5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChiKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKTtyZXR1cm4gYj9lLmpvaW4oZik6ZS5qb2luKGYpLnJlcGxhY2UoL14mLywiIikucmVwbGFjZSgvJTIwL2csIisiKX07cXEub2JqMkZvcm1EYXRhPWZ1bmN0aW9uKGEsYixjKXtifHwoYj1uZXcgRm9ybURhdGEpO3FxLmVhY2goYSxmdW5jdGlvbihhLGUpe2E9Yz9jKyJbIithKyJdIjphO3FxLmlzT2JqZWN0KGUpP3FxLm9iajJGb3JtRGF0YShlLGIsYSk6cXEuaXNGdW5jdGlvbihlKT9iLmFwcGVuZChhLGUoKSk6Yi5hcHBlbmQoYSxlKX0pO3JldHVybiBifTsKcXEub2JqMklucHV0cz1mdW5jdGlvbihhLGIpe3ZhciBjO2J8fChiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImZvcm0iKSk7cXEub2JqMkZvcm1EYXRhKGEse2FwcGVuZDpmdW5jdGlvbihhLGUpe2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtjLnNldEF0dHJpYnV0ZSgibmFtZSIsYSk7Yy5zZXRBdHRyaWJ1dGUoInZhbHVlIixlKTtiLmFwcGVuZENoaWxkKGMpfX0pO3JldHVybiBifTtxcS5zZXRDb29raWU9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPW5ldyBEYXRlLGU9IiI7YyYmKGQuc2V0VGltZShkLmdldFRpbWUoKSs4NjRFNSpjKSxlPSI7IGV4cGlyZXM9IitkLnRvR01UU3RyaW5nKCkpO2RvY3VtZW50LmNvb2tpZT1hKyI9IitiK2UrIjsgcGF0aD0vIn07CnFxLmdldENvb2tpZT1mdW5jdGlvbihhKXtmb3IodmFyIGE9YSsiPSIsYj1kb2N1bWVudC5jb29raWUuc3BsaXQoIjsiKSxjLGQ9MDtkPGIubGVuZ3RoO2QrKyl7Zm9yKGM9YltkXTsiICI9PWMuY2hhckF0KDApOyljPWMuc3Vic3RyaW5nKDEsYy5sZW5ndGgpO2lmKDA9PT1jLmluZGV4T2YoYSkpcmV0dXJuIGMuc3Vic3RyaW5nKGEubGVuZ3RoLGMubGVuZ3RoKX19O3FxLmdldENvb2tpZU5hbWVzPWZ1bmN0aW9uKGEpe3ZhciBiPWRvY3VtZW50LmNvb2tpZS5zcGxpdCgiOyIpLGM9W107cXEuZWFjaChiLGZ1bmN0aW9uKGIsZSl7dmFyIGU9cXEudHJpbVN0cihlKSxmPWUuaW5kZXhPZigiPSIpO2UubWF0Y2goYSkmJmMucHVzaChlLnN1YnN0cigwLGYpKX0pO3JldHVybiBjfTtxcS5kZWxldGVDb29raWU9ZnVuY3Rpb24oYSl7cXEuc2V0Q29va2llKGEsIiIsLTEpfTsKcXEuYXJlQ29va2llc0VuYWJsZWQ9ZnVuY3Rpb24oKXt2YXIgYT0icXFDb29raWVUZXN0OiIrMUU1Kk1hdGgucmFuZG9tKCk7cXEuc2V0Q29va2llKGEsMSk7cmV0dXJuIHFxLmdldENvb2tpZShhKT8ocXEuZGVsZXRlQ29va2llKGEpLCEwKTohMX07cXEucGFyc2VKc29uPWZ1bmN0aW9uKGEpe3JldHVybiB3aW5kb3cuSlNPTiYmcXEuaXNGdW5jdGlvbihKU09OLnBhcnNlKT9KU09OLnBhcnNlKGEpOmV2YWwoIigiK2ErIikiKX07cXEuRGlzcG9zZVN1cHBvcnQ9ZnVuY3Rpb24oKXt2YXIgYT1bXTtyZXR1cm57ZGlzcG9zZTpmdW5jdGlvbigpe3ZhciBiO2RvKGI9YS5zaGlmdCgpKSYmYigpO3doaWxlKGIpfSxhdHRhY2g6ZnVuY3Rpb24oKXt0aGlzLmFkZERpc3Bvc2VyKHFxKGFyZ3VtZW50c1swXSkuYXR0YWNoLmFwcGx5KHRoaXMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpKSl9LGFkZERpc3Bvc2VyOmZ1bmN0aW9uKGIpe2EucHVzaChiKX19fTsKcXEuUHJvbWlzZT1mdW5jdGlvbigpe3ZhciBhLGIsYyxkLGU9MDtyZXR1cm57dGhlbjpmdW5jdGlvbihmLGcpezA9PT1lPyhjPWYsZD1nKTotMT09PWUmJmc/ZyhiKTpmJiZmKGEpfSxzdWNjZXNzOmZ1bmN0aW9uKGIpe2U9MTthPWI7YyYmYyhiKTtyZXR1cm4gdGhpc30sZmFpbHVyZTpmdW5jdGlvbihhKXtlPS0xO2I9YTtkJiZkKGEpO3JldHVybiB0aGlzfX19OwpxcS5VcGxvYWRCdXR0b249ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYigpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7ZS5tdWx0aXBsZSYmYS5zZXRBdHRyaWJ1dGUoIm11bHRpcGxlIiwibXVsdGlwbGUiKTtlLmFjY2VwdEZpbGVzJiZhLnNldEF0dHJpYnV0ZSgiYWNjZXB0IixlLmFjY2VwdEZpbGVzKTthLnNldEF0dHJpYnV0ZSgidHlwZSIsImZpbGUiKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsZS5uYW1lKTtxcShhKS5jc3Moe3Bvc2l0aW9uOiJhYnNvbHV0ZSIscmlnaHQ6MCx0b3A6MCxmb250RmFtaWx5OiJBcmlhbCIsZm9udFNpemU6IjExOHB4IixtYXJnaW46MCxwYWRkaW5nOjAsY3Vyc29yOiJwb2ludGVyIixvcGFjaXR5OjB9KTtlLmVsZW1lbnQuYXBwZW5kQ2hpbGQoYSk7ZC5hdHRhY2goYSwiY2hhbmdlIixmdW5jdGlvbigpe2Uub25DaGFuZ2UoYSl9KTtkLmF0dGFjaChhLCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7cXEoZS5lbGVtZW50KS5hZGRDbGFzcyhlLmhvdmVyQ2xhc3MpfSk7CmQuYXR0YWNoKGEsIm1vdXNlb3V0IixmdW5jdGlvbigpe3FxKGUuZWxlbWVudCkucmVtb3ZlQ2xhc3MoZS5ob3ZlckNsYXNzKX0pO2QuYXR0YWNoKGEsImZvY3VzIixmdW5jdGlvbigpe3FxKGUuZWxlbWVudCkuYWRkQ2xhc3MoZS5mb2N1c0NsYXNzKX0pO2QuYXR0YWNoKGEsImJsdXIiLGZ1bmN0aW9uKCl7cXEoZS5lbGVtZW50KS5yZW1vdmVDbGFzcyhlLmZvY3VzQ2xhc3MpfSk7d2luZG93LmF0dGFjaEV2ZW50JiZhLnNldEF0dHJpYnV0ZSgidGFiSW5kZXgiLCItMSIpO3JldHVybiBhfXZhciBjLGQ9bmV3IHFxLkRpc3Bvc2VTdXBwb3J0LGU9e2VsZW1lbnQ6bnVsbCxtdWx0aXBsZTohMSxhY2NlcHRGaWxlczpudWxsLG5hbWU6ImZpbGUiLG9uQ2hhbmdlOmZ1bmN0aW9uKCl7fSxob3ZlckNsYXNzOiJxcS11cGxvYWQtYnV0dG9uLWhvdmVyIixmb2N1c0NsYXNzOiJxcS11cGxvYWQtYnV0dG9uLWZvY3VzIn07cXEuZXh0ZW5kKGUsYSk7cXEoZS5lbGVtZW50KS5jc3Moe3Bvc2l0aW9uOiJyZWxhdGl2ZSIsCm92ZXJmbG93OiJoaWRkZW4iLGRpcmVjdGlvbjoibHRyIn0pO2M9YigpO3JldHVybntnZXRJbnB1dDpmdW5jdGlvbigpe3JldHVybiBjfSxyZXNldDpmdW5jdGlvbigpe2MucGFyZW50Tm9kZSYmcXEoYykucmVtb3ZlKCk7cXEoZS5lbGVtZW50KS5yZW1vdmVDbGFzcyhlLmZvY3VzQ2xhc3MpO2M9YigpfX19OwpxcS5QYXN0ZVN1cHBvcnQ9ZnVuY3Rpb24oYSl7dmFyIGI7Yj17dGFyZ2V0RWxlbWVudDpudWxsLGNhbGxiYWNrczp7bG9nOmZ1bmN0aW9uKCl7fSxwYXN0ZVJlY2VpdmVkOmZ1bmN0aW9uKCl7fX19O3FxLmV4dGVuZChiLGEpOyhmdW5jdGlvbigpe3FxKGIudGFyZ2V0RWxlbWVudCkuYXR0YWNoKCJwYXN0ZSIsZnVuY3Rpb24oYSl7KGE9YS5jbGlwYm9hcmREYXRhKSYmcXEuZWFjaChhLml0ZW1zLGZ1bmN0aW9uKGEsYyl7aWYoYy50eXBlJiYwPT09Yy50eXBlLmluZGV4T2YoImltYWdlLyIpKXt2YXIgZj1jLmdldEFzRmlsZSgpO2IuY2FsbGJhY2tzLnBhc3RlUmVjZWl2ZWQoZil9fSl9KX0pKCk7cmV0dXJue3Jlc2V0OmZ1bmN0aW9uKCl7fX19OwpxcS5GaW5lVXBsb2FkZXJCYXNpYz1mdW5jdGlvbihhKXt0aGlzLl9vcHRpb25zPXtkZWJ1ZzohMSxidXR0b246bnVsbCxtdWx0aXBsZTohMCxtYXhDb25uZWN0aW9uczozLGRpc2FibGVDYW5jZWxGb3JGb3JtVXBsb2FkczohMSxhdXRvVXBsb2FkOiEwLHJlcXVlc3Q6e2VuZHBvaW50OiIvc2VydmVyL3VwbG9hZCIscGFyYW1zOnt9LHBhcmFtc0luQm9keTohMCxjdXN0b21IZWFkZXJzOnt9LGZvcmNlTXVsdGlwYXJ0OiEwLGlucHV0TmFtZToicXFmaWxlIix1dWlkTmFtZToicXF1dWlkIix0b3RhbEZpbGVTaXplTmFtZToicXF0b3RhbGZpbGVzaXplIn0sdmFsaWRhdGlvbjp7YWxsb3dlZEV4dGVuc2lvbnM6W10sc2l6ZUxpbWl0OjAsbWluU2l6ZUxpbWl0OjAsaXRlbUxpbWl0OjAsc3RvcE9uRmlyc3RJbnZhbGlkRmlsZTohMH0sY2FsbGJhY2tzOntvblN1Ym1pdDpmdW5jdGlvbigpe30sb25TdWJtaXR0ZWQ6ZnVuY3Rpb24oKXt9LG9uQ29tcGxldGU6ZnVuY3Rpb24oKXt9LG9uQ2FuY2VsOmZ1bmN0aW9uKCl7fSwKb25VcGxvYWQ6ZnVuY3Rpb24oKXt9LG9uVXBsb2FkQ2h1bms6ZnVuY3Rpb24oKXt9LG9uUmVzdW1lOmZ1bmN0aW9uKCl7fSxvblByb2dyZXNzOmZ1bmN0aW9uKCl7fSxvbkVycm9yOmZ1bmN0aW9uKCl7fSxvbkF1dG9SZXRyeTpmdW5jdGlvbigpe30sb25NYW51YWxSZXRyeTpmdW5jdGlvbigpe30sb25WYWxpZGF0ZUJhdGNoOmZ1bmN0aW9uKCl7fSxvblZhbGlkYXRlOmZ1bmN0aW9uKCl7fSxvblN1Ym1pdERlbGV0ZTpmdW5jdGlvbigpe30sb25EZWxldGU6ZnVuY3Rpb24oKXt9LG9uRGVsZXRlQ29tcGxldGU6ZnVuY3Rpb24oKXt9LG9uUGFzdGVSZWNlaXZlZDpmdW5jdGlvbigpe3JldHVybihuZXcgcXEuUHJvbWlzZSkuc3VjY2VzcygpfX0sbWVzc2FnZXM6e3R5cGVFcnJvcjoie2ZpbGV9IGhhcyBhbiBpbnZhbGlkIGV4dGVuc2lvbi4gVmFsaWQgZXh0ZW5zaW9uKHMpOiB7ZXh0ZW5zaW9uc30uIixzaXplRXJyb3I6IntmaWxlfSBpcyB0b28gbGFyZ2UsIG1heGltdW0gZmlsZSBzaXplIGlzIHtzaXplTGltaXR9LiIsCm1pblNpemVFcnJvcjoie2ZpbGV9IGlzIHRvbyBzbWFsbCwgbWluaW11bSBmaWxlIHNpemUgaXMge21pblNpemVMaW1pdH0uIixlbXB0eUVycm9yOiJ7ZmlsZX0gaXMgZW1wdHksIHBsZWFzZSBzZWxlY3QgZmlsZXMgYWdhaW4gd2l0aG91dCBpdC4iLG5vRmlsZXNFcnJvcjoiTm8gZmlsZXMgdG8gdXBsb2FkLiIsdG9vTWFueUl0ZW1zRXJyb3I6IlRvbyBtYW55IGl0ZW1zICh7bmV0SXRlbXN9KSB3b3VsZCBiZSB1cGxvYWRlZC4gIEl0ZW0gbGltaXQgaXMge2l0ZW1MaW1pdH0uIixyZXRyeUZhaWxUb29NYW55SXRlbXM6IlJldHJ5IGZhaWxlZCAtIHlvdSBoYXZlIHJlYWNoZWQgeW91ciBmaWxlIGxpbWl0LiIsb25MZWF2ZToiVGhlIGZpbGVzIGFyZSBiZWluZyB1cGxvYWRlZCwgaWYgeW91IGxlYXZlIG5vdyB0aGUgdXBsb2FkIHdpbGwgYmUgY2FuY2VsbGVkLiJ9LHJldHJ5OntlbmFibGVBdXRvOiExLG1heEF1dG9BdHRlbXB0czozLGF1dG9BdHRlbXB0RGVsYXk6NSxwcmV2ZW50UmV0cnlSZXNwb25zZVByb3BlcnR5OiJwcmV2ZW50UmV0cnkifSwKY2xhc3Nlczp7YnV0dG9uSG92ZXI6InFxLXVwbG9hZC1idXR0b24taG92ZXIiLGJ1dHRvbkZvY3VzOiJxcS11cGxvYWQtYnV0dG9uLWZvY3VzIn0sY2h1bmtpbmc6e2VuYWJsZWQ6ITEscGFydFNpemU6MkU2LHBhcmFtTmFtZXM6e3BhcnRJbmRleDoicXFwYXJ0aW5kZXgiLHBhcnRCeXRlT2Zmc2V0OiJxcXBhcnRieXRlb2Zmc2V0IixjaHVua1NpemU6InFxY2h1bmtzaXplIix0b3RhbEZpbGVTaXplOiJxcXRvdGFsZmlsZXNpemUiLHRvdGFsUGFydHM6InFxdG90YWxwYXJ0cyIsZmlsZW5hbWU6InFxZmlsZW5hbWUifX0scmVzdW1lOntlbmFibGVkOiExLGlkOm51bGwsY29va2llc0V4cGlyZUluOjcscGFyYW1OYW1lczp7cmVzdW1pbmc6InFxcmVzdW1lIn19LGZvcm1hdEZpbGVOYW1lOmZ1bmN0aW9uKGEpezMzPGEubGVuZ3RoJiYoYT1hLnNsaWNlKDAsMTkpKyIuLi4iK2Euc2xpY2UoLTE0KSk7cmV0dXJuIGF9LHRleHQ6e3NpemVTeW1ib2xzOiJrQiBNQiBHQiBUQiBQQiBFQiIuc3BsaXQoIiAiKX0sCmRlbGV0ZUZpbGU6e2VuYWJsZWQ6ITEsZW5kcG9pbnQ6Ii9zZXJ2ZXIvdXBsb2FkIixjdXN0b21IZWFkZXJzOnt9LHBhcmFtczp7fX0sY29yczp7ZXhwZWN0ZWQ6ITEsc2VuZENyZWRlbnRpYWxzOiExfSxibG9iczp7ZGVmYXVsdE5hbWU6Im1pc2NfZGF0YSIscGFyYW1OYW1lczp7bmFtZToicXFibG9ibmFtZSJ9fSxwYXN0ZTp7dGFyZ2V0RWxlbWVudDpudWxsLGRlZmF1bHROYW1lOiJwYXN0ZWRfaW1hZ2UifX07cXEuZXh0ZW5kKHRoaXMuX29wdGlvbnMsYSwhMCk7dGhpcy5fd3JhcENhbGxiYWNrcygpO3RoaXMuX2Rpc3Bvc2VTdXBwb3J0PW5ldyBxcS5EaXNwb3NlU3VwcG9ydDt0aGlzLl9maWxlc0luUHJvZ3Jlc3M9W107dGhpcy5fc3RvcmVkSWRzPVtdO3RoaXMuX2F1dG9SZXRyaWVzPVtdO3RoaXMuX3JldHJ5VGltZW91dHM9W107dGhpcy5fcHJldmVudFJldHJpZXM9W107dGhpcy5fbmV0RmlsZXNVcGxvYWRlZE9yUXVldWVkPTA7dGhpcy5fcGFyYW1zU3RvcmU9dGhpcy5fY3JlYXRlUGFyYW1zU3RvcmUoInJlcXVlc3QiKTsKdGhpcy5fZGVsZXRlRmlsZVBhcmFtc1N0b3JlPXRoaXMuX2NyZWF0ZVBhcmFtc1N0b3JlKCJkZWxldGVGaWxlIik7dGhpcy5fZW5kcG9pbnRTdG9yZT10aGlzLl9jcmVhdGVFbmRwb2ludFN0b3JlKCJyZXF1ZXN0Iik7dGhpcy5fZGVsZXRlRmlsZUVuZHBvaW50U3RvcmU9dGhpcy5fY3JlYXRlRW5kcG9pbnRTdG9yZSgiZGVsZXRlRmlsZSIpO3RoaXMuX2hhbmRsZXI9dGhpcy5fY3JlYXRlVXBsb2FkSGFuZGxlcigpO3RoaXMuX2RlbGV0ZUhhbmRsZXI9dGhpcy5fY3JlYXRlRGVsZXRlSGFuZGxlcigpO3RoaXMuX29wdGlvbnMuYnV0dG9uJiYodGhpcy5fYnV0dG9uPXRoaXMuX2NyZWF0ZVVwbG9hZEJ1dHRvbih0aGlzLl9vcHRpb25zLmJ1dHRvbikpO3RoaXMuX29wdGlvbnMucGFzdGUudGFyZ2V0RWxlbWVudCYmKHRoaXMuX3Bhc3RlSGFuZGxlcj10aGlzLl9jcmVhdGVQYXN0ZUhhbmRsZXIoKSk7dGhpcy5fcHJldmVudExlYXZlSW5Qcm9ncmVzcygpfTsKcXEuRmluZVVwbG9hZGVyQmFzaWMucHJvdG90eXBlPXtsb2c6ZnVuY3Rpb24oYSxiKXt0aGlzLl9vcHRpb25zLmRlYnVnJiYoIWJ8fCJpbmZvIj09PWIpP3FxLmxvZygiW0ZpbmVVcGxvYWRlcl0gIithKTpiJiYiaW5mbyIhPT1iJiZxcS5sb2coIltGaW5lVXBsb2FkZXJdICIrYSxiKX0sc2V0UGFyYW1zOmZ1bmN0aW9uKGEsYil7bnVsbD09Yj90aGlzLl9vcHRpb25zLnJlcXVlc3QucGFyYW1zPWE6dGhpcy5fcGFyYW1zU3RvcmUuc2V0UGFyYW1zKGEsYil9LHNldERlbGV0ZUZpbGVQYXJhbXM6ZnVuY3Rpb24oYSxiKXtudWxsPT1iP3RoaXMuX29wdGlvbnMuZGVsZXRlRmlsZS5wYXJhbXM9YTp0aGlzLl9kZWxldGVGaWxlUGFyYW1zU3RvcmUuc2V0UGFyYW1zKGEsYil9LHNldEVuZHBvaW50OmZ1bmN0aW9uKGEsYil7bnVsbD09Yj90aGlzLl9vcHRpb25zLnJlcXVlc3QuZW5kcG9pbnQ9YTp0aGlzLl9lbmRwb2ludFN0b3JlLnNldEVuZHBvaW50KGEsYil9LGdldEluUHJvZ3Jlc3M6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZmlsZXNJblByb2dyZXNzLmxlbmd0aH0sCnVwbG9hZFN0b3JlZEZpbGVzOmZ1bmN0aW9uKCl7Zm9yKHZhciBhO3RoaXMuX3N0b3JlZElkcy5sZW5ndGg7KWE9dGhpcy5fc3RvcmVkSWRzLnNoaWZ0KCksdGhpcy5fZmlsZXNJblByb2dyZXNzLnB1c2goYSksdGhpcy5faGFuZGxlci51cGxvYWQoYSl9LGNsZWFyU3RvcmVkRmlsZXM6ZnVuY3Rpb24oKXt0aGlzLl9zdG9yZWRJZHM9W119LHJldHJ5OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9vbkJlZm9yZU1hbnVhbFJldHJ5KGEpPyh0aGlzLl9uZXRGaWxlc1VwbG9hZGVkT3JRdWV1ZWQrKyx0aGlzLl9oYW5kbGVyLnJldHJ5KGEpLCEwKTohMX0sY2FuY2VsOmZ1bmN0aW9uKGEpe3RoaXMuX2hhbmRsZXIuY2FuY2VsKGEpfSxjYW5jZWxBbGw6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiPXRoaXM7cXEuZXh0ZW5kKGEsdGhpcy5fc3RvcmVkSWRzKTtxcS5lYWNoKGEsZnVuY3Rpb24oYSxkKXtiLmNhbmNlbChkKX0pO3RoaXMuX2hhbmRsZXIuY2FuY2VsQWxsKCl9LHJlc2V0OmZ1bmN0aW9uKCl7dGhpcy5sb2coIlJlc2V0dGluZyB1cGxvYWRlci4uLiIpOwp0aGlzLl9oYW5kbGVyLnJlc2V0KCk7dGhpcy5fZmlsZXNJblByb2dyZXNzPVtdO3RoaXMuX3N0b3JlZElkcz1bXTt0aGlzLl9hdXRvUmV0cmllcz1bXTt0aGlzLl9yZXRyeVRpbWVvdXRzPVtdO3RoaXMuX3ByZXZlbnRSZXRyaWVzPVtdO3RoaXMuX2J1dHRvbi5yZXNldCgpO3RoaXMuX3BhcmFtc1N0b3JlLnJlc2V0KCk7dGhpcy5fZW5kcG9pbnRTdG9yZS5yZXNldCgpO3RoaXMuX25ldEZpbGVzVXBsb2FkZWRPclF1ZXVlZD0wO3RoaXMuX3Bhc3RlSGFuZGxlciYmdGhpcy5fcGFzdGVIYW5kbGVyLnJlc2V0KCl9LGFkZEZpbGVzOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGMsZDtpZihhKXtpZighd2luZG93LkZpbGVMaXN0fHwhKGEgaW5zdGFuY2VvZiBGaWxlTGlzdCkpYT1bXS5jb25jYXQoYSk7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrPTEpZD1hW2NdLHFxLmlzRmlsZU9ySW5wdXQoZCk/Yi5wdXNoKGQpOnRoaXMubG9nKGQrIiBpcyBub3QgYSBGaWxlIG9yIElOUFVUIGVsZW1lbnQhICBJZ25vcmluZyEiLAoid2FybiIpO3RoaXMubG9nKCJQcm9jZXNzaW5nICIrYi5sZW5ndGgrIiBmaWxlcyBvciBpbnB1dHMuLi4iKTt0aGlzLl91cGxvYWRGaWxlT3JCbG9iRGF0YUxpc3QoYil9fSxhZGRCbG9iczpmdW5jdGlvbihhKXtpZihhKXt2YXIgYT1bXS5jb25jYXQoYSksYj1bXSxjPXRoaXM7cXEuZWFjaChhLGZ1bmN0aW9uKGEsZSl7cXEuaXNCbG9iKGUpJiYhcXEuaXNGaWxlT3JJbnB1dChlKT9iLnB1c2goe2Jsb2I6ZSxuYW1lOmMuX29wdGlvbnMuYmxvYnMuZGVmYXVsdE5hbWV9KTpxcS5pc09iamVjdChlKSYmZS5ibG9iJiZlLm5hbWU/Yi5wdXNoKGUpOmMubG9nKCJhZGRCbG9iczogZW50cnkgYXQgaW5kZXggIithKyIgaXMgbm90IGEgQmxvYiBvciBhIEJsb2JEYXRhIG9iamVjdCIsImVycm9yIil9KTt0aGlzLl91cGxvYWRGaWxlT3JCbG9iRGF0YUxpc3QoYil9ZWxzZSB0aGlzLmxvZygidW5kZWZpbmVkIG9yIG5vbi1hcnJheSBwYXJhbWV0ZXIgcGFzc2VkIGludG8gYWRkQmxvYnMiLCJlcnJvciIpfSwKZ2V0VXVpZDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5faGFuZGxlci5nZXRVdWlkKGEpfSxnZXRSZXN1bWFibGVGaWxlc0RhdGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faGFuZGxlci5nZXRSZXN1bWFibGVGaWxlc0RhdGEoKX0sZ2V0U2l6ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5faGFuZGxlci5nZXRTaXplKGEpfSxnZXROYW1lOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9oYW5kbGVyLmdldE5hbWUoYSl9LGdldEZpbGU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX2hhbmRsZXIuZ2V0RmlsZShhKX0sZGVsZXRlRmlsZTpmdW5jdGlvbihhKXt0aGlzLl9vblN1Ym1pdERlbGV0ZShhKX0sc2V0RGVsZXRlRmlsZUVuZHBvaW50OmZ1bmN0aW9uKGEsYil7bnVsbD09Yj90aGlzLl9vcHRpb25zLmRlbGV0ZUZpbGUuZW5kcG9pbnQ9YTp0aGlzLl9kZWxldGVGaWxlRW5kcG9pbnRTdG9yZS5zZXRFbmRwb2ludChhLGIpfSxnZXRQcm9taXNzb3J5Q2FsbGJhY2tOYW1lczpmdW5jdGlvbigpe3JldHVyblsib25QYXN0ZVJlY2VpdmVkIl19LApfY3JlYXRlVXBsb2FkQnV0dG9uOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYz1uZXcgcXEuVXBsb2FkQnV0dG9uKHtlbGVtZW50OmEsbXVsdGlwbGU6dGhpcy5fb3B0aW9ucy5tdWx0aXBsZSYmcXEuaXNYaHJVcGxvYWRTdXBwb3J0ZWQoKSxhY2NlcHRGaWxlczp0aGlzLl9vcHRpb25zLnZhbGlkYXRpb24uYWNjZXB0RmlsZXMsb25DaGFuZ2U6ZnVuY3Rpb24oYSl7Yi5fb25JbnB1dENoYW5nZShhKX0saG92ZXJDbGFzczp0aGlzLl9vcHRpb25zLmNsYXNzZXMuYnV0dG9uSG92ZXIsZm9jdXNDbGFzczp0aGlzLl9vcHRpb25zLmNsYXNzZXMuYnV0dG9uRm9jdXN9KTt0aGlzLl9kaXNwb3NlU3VwcG9ydC5hZGREaXNwb3NlcihmdW5jdGlvbigpe2MuZGlzcG9zZSgpfSk7cmV0dXJuIGN9LF9jcmVhdGVVcGxvYWRIYW5kbGVyOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcztyZXR1cm4gbmV3IHFxLlVwbG9hZEhhbmRsZXIoe2RlYnVnOnRoaXMuX29wdGlvbnMuZGVidWcsZm9yY2VNdWx0aXBhcnQ6dGhpcy5fb3B0aW9ucy5yZXF1ZXN0LmZvcmNlTXVsdGlwYXJ0LAptYXhDb25uZWN0aW9uczp0aGlzLl9vcHRpb25zLm1heENvbm5lY3Rpb25zLGN1c3RvbUhlYWRlcnM6dGhpcy5fb3B0aW9ucy5yZXF1ZXN0LmN1c3RvbUhlYWRlcnMsaW5wdXROYW1lOnRoaXMuX29wdGlvbnMucmVxdWVzdC5pbnB1dE5hbWUsdXVpZFBhcmFtTmFtZTp0aGlzLl9vcHRpb25zLnJlcXVlc3QudXVpZE5hbWUsdG90YWxGaWxlU2l6ZVBhcmFtTmFtZTp0aGlzLl9vcHRpb25zLnJlcXVlc3QudG90YWxGaWxlU2l6ZU5hbWUsY29yczp0aGlzLl9vcHRpb25zLmNvcnMsZGVtb01vZGU6dGhpcy5fb3B0aW9ucy5kZW1vTW9kZSxwYXJhbXNJbkJvZHk6dGhpcy5fb3B0aW9ucy5yZXF1ZXN0LnBhcmFtc0luQm9keSxwYXJhbXNTdG9yZTp0aGlzLl9wYXJhbXNTdG9yZSxlbmRwb2ludFN0b3JlOnRoaXMuX2VuZHBvaW50U3RvcmUsY2h1bmtpbmc6dGhpcy5fb3B0aW9ucy5jaHVua2luZyxyZXN1bWU6dGhpcy5fb3B0aW9ucy5yZXN1bWUsYmxvYnM6dGhpcy5fb3B0aW9ucy5ibG9icyxsb2c6ZnVuY3Rpb24oYiwKYyl7YS5sb2coYixjKX0sb25Qcm9ncmVzczpmdW5jdGlvbihiLGMsZCxlKXthLl9vblByb2dyZXNzKGIsYyxkLGUpO2EuX29wdGlvbnMuY2FsbGJhY2tzLm9uUHJvZ3Jlc3MoYixjLGQsZSl9LG9uQ29tcGxldGU6ZnVuY3Rpb24oYixjLGQsZSl7YS5fb25Db21wbGV0ZShiLGMsZCxlKTthLl9vcHRpb25zLmNhbGxiYWNrcy5vbkNvbXBsZXRlKGIsYyxkKX0sb25DYW5jZWw6ZnVuY3Rpb24oYixjKXthLl9vbkNhbmNlbChiLGMpO2EuX29wdGlvbnMuY2FsbGJhY2tzLm9uQ2FuY2VsKGIsYyl9LG9uVXBsb2FkOmZ1bmN0aW9uKGIsYyl7YS5fb25VcGxvYWQoYixjKTthLl9vcHRpb25zLmNhbGxiYWNrcy5vblVwbG9hZChiLGMpfSxvblVwbG9hZENodW5rOmZ1bmN0aW9uKGIsYyxkKXthLl9vcHRpb25zLmNhbGxiYWNrcy5vblVwbG9hZENodW5rKGIsYyxkKX0sb25SZXN1bWU6ZnVuY3Rpb24oYixjLGQpe3JldHVybiBhLl9vcHRpb25zLmNhbGxiYWNrcy5vblJlc3VtZShiLGMsZCl9LG9uQXV0b1JldHJ5OmZ1bmN0aW9uKGIsCmMsZCxlKXthLl9wcmV2ZW50UmV0cmllc1tiXT1kW2EuX29wdGlvbnMucmV0cnkucHJldmVudFJldHJ5UmVzcG9uc2VQcm9wZXJ0eV07cmV0dXJuIGEuX3Nob3VsZEF1dG9SZXRyeShiLGMsZCk/KGEuX21heWJlUGFyc2VBbmRTZW5kVXBsb2FkRXJyb3IoYixjLGQsZSksYS5fb3B0aW9ucy5jYWxsYmFja3Mub25BdXRvUmV0cnkoYixjLGEuX2F1dG9SZXRyaWVzW2JdKzEpLGEuX29uQmVmb3JlQXV0b1JldHJ5KGIsYyksYS5fcmV0cnlUaW1lb3V0c1tiXT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YS5fb25BdXRvUmV0cnkoYixjLGQpfSwxRTMqYS5fb3B0aW9ucy5yZXRyeS5hdXRvQXR0ZW1wdERlbGF5KSwhMCk6ITF9fSl9LF9jcmVhdGVEZWxldGVIYW5kbGVyOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcztyZXR1cm4gbmV3IHFxLkRlbGV0ZUZpbGVBamF4UmVxdWVzdG9yKHttYXhDb25uZWN0aW9uczp0aGlzLl9vcHRpb25zLm1heENvbm5lY3Rpb25zLGN1c3RvbUhlYWRlcnM6dGhpcy5fb3B0aW9ucy5kZWxldGVGaWxlLmN1c3RvbUhlYWRlcnMsCnBhcmFtc1N0b3JlOnRoaXMuX2RlbGV0ZUZpbGVQYXJhbXNTdG9yZSxlbmRwb2ludFN0b3JlOnRoaXMuX2RlbGV0ZUZpbGVFbmRwb2ludFN0b3JlLGRlbW9Nb2RlOnRoaXMuX29wdGlvbnMuZGVtb01vZGUsY29yczp0aGlzLl9vcHRpb25zLmNvcnMsbG9nOmZ1bmN0aW9uKGIsYyl7YS5sb2coYixjKX0sb25EZWxldGU6ZnVuY3Rpb24oYil7YS5fb25EZWxldGUoYik7YS5fb3B0aW9ucy5jYWxsYmFja3Mub25EZWxldGUoYil9LG9uRGVsZXRlQ29tcGxldGU6ZnVuY3Rpb24oYixjLGQpe2EuX29uRGVsZXRlQ29tcGxldGUoYixjLGQpO2EuX29wdGlvbnMuY2FsbGJhY2tzLm9uRGVsZXRlQ29tcGxldGUoYixjLGQpfX0pfSxfY3JlYXRlUGFzdGVIYW5kbGVyOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcztyZXR1cm4gbmV3IHFxLlBhc3RlU3VwcG9ydCh7dGFyZ2V0RWxlbWVudDp0aGlzLl9vcHRpb25zLnBhc3RlLnRhcmdldEVsZW1lbnQsY2FsbGJhY2tzOntsb2c6ZnVuY3Rpb24oYixjKXthLmxvZyhiLApjKX0scGFzdGVSZWNlaXZlZDpmdW5jdGlvbihiKXt2YXIgYz1hLl9vcHRpb25zLmNhbGxiYWNrcy5vblBhc3RlUmVjZWl2ZWQsYz1jKGIpO2MudGhlbj9jLnRoZW4oZnVuY3Rpb24oYyl7YS5faGFuZGxlUGFzdGVTdWNjZXNzKGIsYyl9LGZ1bmN0aW9uKGIpe2EubG9nKCJJZ25vcmluZyBwYXN0ZWQgaW1hZ2UgcGVyIHBhc3RlIHJlY2VpdmVkIGNhbGxiYWNrLiAgUmVhc29uID0gJyIrYisiJyIpfSk6YS5sb2coIlByb21pc2UgY29udHJhY3Qgbm90IGZ1bGZpbGxlZCBpbiBwYXN0ZVJlY2VpdmVkIGNhbGxiYWNrIGhhbmRsZXIhICBJZ25vcmluZyBwYXN0ZWQgaXRlbS4iLCJlcnJvciIpfX19KX0sX2hhbmRsZVBhc3RlU3VjY2VzczpmdW5jdGlvbihhLGIpe3ZhciBjPWEudHlwZS5zcGxpdCgiLyIpWzFdLGQ9YjtudWxsPT1kJiYoZD10aGlzLl9vcHRpb25zLnBhc3RlLmRlZmF1bHROYW1lKTt0aGlzLmFkZEJsb2JzKHtuYW1lOmQrKCIuIitjKSxibG9iOmF9KX0sX3ByZXZlbnRMZWF2ZUluUHJvZ3Jlc3M6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpczt0aGlzLl9kaXNwb3NlU3VwcG9ydC5hdHRhY2god2luZG93LCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKGIpe2lmKGEuX2ZpbGVzSW5Qcm9ncmVzcy5sZW5ndGgpcmV0dXJuIGI9Ynx8d2luZG93LmV2ZW50LGIucmV0dXJuVmFsdWU9YS5fb3B0aW9ucy5tZXNzYWdlcy5vbkxlYXZlfSl9LF9vblN1Ym1pdDpmdW5jdGlvbihhKXt0aGlzLl9uZXRGaWxlc1VwbG9hZGVkT3JRdWV1ZWQrKzt0aGlzLl9vcHRpb25zLmF1dG9VcGxvYWQmJnRoaXMuX2ZpbGVzSW5Qcm9ncmVzcy5wdXNoKGEpfSxfb25Qcm9ncmVzczpmdW5jdGlvbigpe30sX29uQ29tcGxldGU6ZnVuY3Rpb24oYSxiLGMsZCl7Yy5zdWNjZXNzfHx0aGlzLl9uZXRGaWxlc1VwbG9hZGVkT3JRdWV1ZWQtLTt0aGlzLl9yZW1vdmVGcm9tRmlsZXNJblByb2dyZXNzKGEpO3RoaXMuX21heWJlUGFyc2VBbmRTZW5kVXBsb2FkRXJyb3IoYSxiLGMsZCl9LF9vbkNhbmNlbDpmdW5jdGlvbihhKXt0aGlzLl9uZXRGaWxlc1VwbG9hZGVkT3JRdWV1ZWQtLTsKdGhpcy5fcmVtb3ZlRnJvbUZpbGVzSW5Qcm9ncmVzcyhhKTtjbGVhclRpbWVvdXQodGhpcy5fcmV0cnlUaW1lb3V0c1thXSk7YT1xcS5pbmRleE9mKHRoaXMuX3N0b3JlZElkcyxhKTshdGhpcy5fb3B0aW9ucy5hdXRvVXBsb2FkJiYwPD1hJiZ0aGlzLl9zdG9yZWRJZHMuc3BsaWNlKGEsMSl9LF9pc0RlbGV0ZVBvc3NpYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29wdGlvbnMuZGVsZXRlRmlsZS5lbmFibGVkJiYoIXRoaXMuX29wdGlvbnMuY29ycy5leHBlY3RlZHx8dGhpcy5fb3B0aW9ucy5jb3JzLmV4cGVjdGVkJiYocXEuaWUxMCgpfHwhcXEuaWUoKSkpfSxfb25TdWJtaXREZWxldGU6ZnVuY3Rpb24oYSl7aWYodGhpcy5faXNEZWxldGVQb3NzaWJsZSgpKSExIT09dGhpcy5fb3B0aW9ucy5jYWxsYmFja3Mub25TdWJtaXREZWxldGUoYSkmJnRoaXMuX2RlbGV0ZUhhbmRsZXIuc2VuZERlbGV0ZShhLHRoaXMuZ2V0VXVpZChhKSk7ZWxzZSByZXR1cm4gdGhpcy5sb2coIkRlbGV0ZSByZXF1ZXN0IGlnbm9yZWQgZm9yIElEICIrCmErIiwgZGVsZXRlIGZlYXR1cmUgaXMgZGlzYWJsZWQgb3IgcmVxdWVzdCBub3QgcG9zc2libGUgZHVlIHRvIENPUlMgb24gYSB1c2VyIGFnZW50IHRoYXQgZG9lcyBub3Qgc3VwcG9ydCBwcmUtZmxpZ2h0aW5nLiIsIndhcm4iKSwhMX0sX29uRGVsZXRlOmZ1bmN0aW9uKCl7fSxfb25EZWxldGVDb21wbGV0ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5faGFuZGxlci5nZXROYW1lKGEpO2M/KHRoaXMubG9nKCJEZWxldGUgcmVxdWVzdCBmb3IgJyIrZCsiJyBoYXMgZmFpbGVkLiIsImVycm9yIiksdGhpcy5fb3B0aW9ucy5jYWxsYmFja3Mub25FcnJvcihhLGQsIkRlbGV0ZSByZXF1ZXN0IGZhaWxlZCB3aXRoIHJlc3BvbnNlIGNvZGUgIitiLnN0YXR1cyxiKSk6KHRoaXMuX25ldEZpbGVzVXBsb2FkZWRPclF1ZXVlZC0tLHRoaXMubG9nKCJEZWxldGUgcmVxdWVzdCBmb3IgJyIrZCsiJyBoYXMgc3VjY2VlZGVkLiIpKX0sX3JlbW92ZUZyb21GaWxlc0luUHJvZ3Jlc3M6ZnVuY3Rpb24oYSl7YT0KcXEuaW5kZXhPZih0aGlzLl9maWxlc0luUHJvZ3Jlc3MsYSk7MDw9YSYmdGhpcy5fZmlsZXNJblByb2dyZXNzLnNwbGljZShhLDEpfSxfb25VcGxvYWQ6ZnVuY3Rpb24oKXt9LF9vbklucHV0Q2hhbmdlOmZ1bmN0aW9uKGEpe3FxLmlzWGhyVXBsb2FkU3VwcG9ydGVkKCk/dGhpcy5hZGRGaWxlcyhhLmZpbGVzKTp0aGlzLmFkZEZpbGVzKGEpO3RoaXMuX2J1dHRvbi5yZXNldCgpfSxfb25CZWZvcmVBdXRvUmV0cnk6ZnVuY3Rpb24oYSxiKXt0aGlzLmxvZygiV2FpdGluZyAiK3RoaXMuX29wdGlvbnMucmV0cnkuYXV0b0F0dGVtcHREZWxheSsiIHNlY29uZHMgYmVmb3JlIHJldHJ5aW5nICIrYisiLi4uIil9LF9vbkF1dG9SZXRyeTpmdW5jdGlvbihhLGIpe3RoaXMubG9nKCJSZXRyeWluZyAiK2IrIi4uLiIpO3RoaXMuX2F1dG9SZXRyaWVzW2FdKys7dGhpcy5faGFuZGxlci5yZXRyeShhKX0sX3Nob3VsZEF1dG9SZXRyeTpmdW5jdGlvbihhKXtyZXR1cm4hdGhpcy5fcHJldmVudFJldHJpZXNbYV0mJgp0aGlzLl9vcHRpb25zLnJldHJ5LmVuYWJsZUF1dG8/KHZvaWQgMD09PXRoaXMuX2F1dG9SZXRyaWVzW2FdJiYodGhpcy5fYXV0b1JldHJpZXNbYV09MCksdGhpcy5fYXV0b1JldHJpZXNbYV08dGhpcy5fb3B0aW9ucy5yZXRyeS5tYXhBdXRvQXR0ZW1wdHMpOiExfSxfb25CZWZvcmVNYW51YWxSZXRyeTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLl9vcHRpb25zLnZhbGlkYXRpb24uaXRlbUxpbWl0O2lmKHRoaXMuX3ByZXZlbnRSZXRyaWVzW2FdKXJldHVybiB0aGlzLmxvZygiUmV0cmllcyBhcmUgZm9yYmlkZGVuIGZvciBpZCAiK2EsIndhcm4iKSwhMTtpZih0aGlzLl9oYW5kbGVyLmlzVmFsaWQoYSkpe3ZhciBjPXRoaXMuX2hhbmRsZXIuZ2V0TmFtZShhKTtpZighMT09PXRoaXMuX29wdGlvbnMuY2FsbGJhY2tzLm9uTWFudWFsUmV0cnkoYSxjKSlyZXR1cm4hMTtpZigwPGImJnRoaXMuX25ldEZpbGVzVXBsb2FkZWRPclF1ZXVlZCsxPmIpcmV0dXJuIHRoaXMuX2l0ZW1FcnJvcigicmV0cnlGYWlsVG9vTWFueUl0ZW1zIiwKIiIpLCExO3RoaXMubG9nKCJSZXRyeWluZyB1cGxvYWQgZm9yICciK2MrIicgKGlkOiAiK2ErIikuLi4iKTt0aGlzLl9maWxlc0luUHJvZ3Jlc3MucHVzaChhKTtyZXR1cm4hMH10aGlzLmxvZygiJyIrYSsiJyBpcyBub3QgYSB2YWxpZCBmaWxlIElEIiwiZXJyb3IiKTtyZXR1cm4hMX0sX21heWJlUGFyc2VBbmRTZW5kVXBsb2FkRXJyb3I6ZnVuY3Rpb24oYSxiLGMsZCl7aWYoIWMuc3VjY2VzcylpZihkJiYyMDAhPT1kLnN0YXR1cyYmIWMuZXJyb3IpdGhpcy5fb3B0aW9ucy5jYWxsYmFja3Mub25FcnJvcihhLGIsIlhIUiByZXR1cm5lZCByZXNwb25zZSBjb2RlICIrZC5zdGF0dXMsZCk7ZWxzZSB0aGlzLl9vcHRpb25zLmNhbGxiYWNrcy5vbkVycm9yKGEsYixjLmVycm9yP2MuZXJyb3I6IlVwbG9hZCBmYWlsdXJlIHJlYXNvbiB1bmtub3duIixkKX0sX3VwbG9hZEZpbGVPckJsb2JEYXRhTGlzdDpmdW5jdGlvbihhKXt2YXIgYjtpZih0aGlzLl9pc0JhdGNoVmFsaWQodGhpcy5fZ2V0VmFsaWRhdGlvbkRlc2NyaXB0b3JzKGEpKSlpZigwPAphLmxlbmd0aClmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWlmKHRoaXMuX3ZhbGlkYXRlRmlsZU9yQmxvYkRhdGEoYVtiXSkpdGhpcy5fdXBsb2FkKGFbYl0pO2Vsc2V7aWYodGhpcy5fb3B0aW9ucy52YWxpZGF0aW9uLnN0b3BPbkZpcnN0SW52YWxpZEZpbGUpYnJlYWt9ZWxzZSB0aGlzLl9pdGVtRXJyb3IoIm5vRmlsZXNFcnJvciIsIiIpfSxfdXBsb2FkOmZ1bmN0aW9uKGEpe3ZhciBhPXRoaXMuX2hhbmRsZXIuYWRkKGEpLGI9dGhpcy5faGFuZGxlci5nZXROYW1lKGEpOyExIT09dGhpcy5fb3B0aW9ucy5jYWxsYmFja3Mub25TdWJtaXQoYSxiKSYmKHRoaXMuX29uU3VibWl0KGEsYiksdGhpcy5fb3B0aW9ucy5jYWxsYmFja3Mub25TdWJtaXR0ZWQoYSxiKSx0aGlzLl9vcHRpb25zLmF1dG9VcGxvYWQ/dGhpcy5faGFuZGxlci51cGxvYWQoYSk6dGhpcy5fc3RvcmVGb3JMYXRlcihhKSl9LF9zdG9yZUZvckxhdGVyOmZ1bmN0aW9uKGEpe3RoaXMuX3N0b3JlZElkcy5wdXNoKGEpfSxfaXNCYXRjaFZhbGlkOmZ1bmN0aW9uKGEpe3ZhciBiOwpiPXRoaXMuX29wdGlvbnMudmFsaWRhdGlvbi5pdGVtTGltaXQ7dmFyIGM9dGhpcy5fbmV0RmlsZXNVcGxvYWRlZE9yUXVldWVkK2EubGVuZ3RoO2lmKGE9ITEhPT10aGlzLl9vcHRpb25zLmNhbGxiYWNrcy5vblZhbGlkYXRlQmF0Y2goYSkpMD09PWJ8fGM8PWI/YT0hMDooYT0hMSxiPXRoaXMuX29wdGlvbnMubWVzc2FnZXMudG9vTWFueUl0ZW1zRXJyb3IucmVwbGFjZSgvXHtuZXRJdGVtc1x9L2csYykucmVwbGFjZSgvXHtpdGVtTGltaXRcfS9nLGIpLHRoaXMuX2JhdGNoRXJyb3IoYikpO3JldHVybiBhfSxfdmFsaWRhdGVGaWxlT3JCbG9iRGF0YTpmdW5jdGlvbihhKXt2YXIgYixjLGQ7Yj10aGlzLl9nZXRWYWxpZGF0aW9uRGVzY3JpcHRvcihhKTtjPWIubmFtZTtkPWIuc2l6ZTtyZXR1cm4hMT09PXRoaXMuX29wdGlvbnMuY2FsbGJhY2tzLm9uVmFsaWRhdGUoYik/ITE6cXEuaXNGaWxlT3JJbnB1dChhKSYmIXRoaXMuX2lzQWxsb3dlZEV4dGVuc2lvbihjKT8odGhpcy5faXRlbUVycm9yKCJ0eXBlRXJyb3IiLApjKSwhMSk6MD09PWQ/KHRoaXMuX2l0ZW1FcnJvcigiZW1wdHlFcnJvciIsYyksITEpOmQmJnRoaXMuX29wdGlvbnMudmFsaWRhdGlvbi5zaXplTGltaXQmJmQ+dGhpcy5fb3B0aW9ucy52YWxpZGF0aW9uLnNpemVMaW1pdD8odGhpcy5faXRlbUVycm9yKCJzaXplRXJyb3IiLGMpLCExKTpkJiZkPHRoaXMuX29wdGlvbnMudmFsaWRhdGlvbi5taW5TaXplTGltaXQ/KHRoaXMuX2l0ZW1FcnJvcigibWluU2l6ZUVycm9yIixjKSwhMSk6ITB9LF9pdGVtRXJyb3I6ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYil7ZD1kLnJlcGxhY2UoYSxiKX12YXIgZD10aGlzLl9vcHRpb25zLm1lc3NhZ2VzW2FdLGU9W10sZjtxcS5lYWNoKHRoaXMuX29wdGlvbnMudmFsaWRhdGlvbi5hbGxvd2VkRXh0ZW5zaW9ucyxmdW5jdGlvbihhLGIpe3FxLmlzU3RyaW5nKGIpJiZlLnB1c2goYil9KTtmPWUuam9pbigiLCAiKS50b0xvd2VyQ2FzZSgpO2MoIntmaWxlfSIsdGhpcy5fb3B0aW9ucy5mb3JtYXRGaWxlTmFtZShiKSk7CmMoIntleHRlbnNpb25zfSIsZik7Yygie3NpemVMaW1pdH0iLHRoaXMuX2Zvcm1hdFNpemUodGhpcy5fb3B0aW9ucy52YWxpZGF0aW9uLnNpemVMaW1pdCkpO2MoInttaW5TaXplTGltaXR9Iix0aGlzLl9mb3JtYXRTaXplKHRoaXMuX29wdGlvbnMudmFsaWRhdGlvbi5taW5TaXplTGltaXQpKTt0aGlzLl9vcHRpb25zLmNhbGxiYWNrcy5vbkVycm9yKG51bGwsYixkKTtyZXR1cm4gZH0sX2JhdGNoRXJyb3I6ZnVuY3Rpb24oYSl7dGhpcy5fb3B0aW9ucy5jYWxsYmFja3Mub25FcnJvcihudWxsLG51bGwsYSl9LF9pc0FsbG93ZWRFeHRlbnNpb246ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5fb3B0aW9ucy52YWxpZGF0aW9uLmFsbG93ZWRFeHRlbnNpb25zLGM9ITE7aWYoIWIubGVuZ3RoKXJldHVybiEwO3FxLmVhY2goYixmdW5jdGlvbihiLGUpe2lmKHFxLmlzU3RyaW5nKGUpJiZudWxsIT1hLm1hdGNoKFJlZ0V4cCgiXFwuIitlKyIkIiwiaSIpKSlyZXR1cm4gYz0hMCwhMX0pO3JldHVybiBjfSwKX2Zvcm1hdFNpemU6ZnVuY3Rpb24oYSl7dmFyIGI9LTE7ZG8gYS89MTAyNCxiKys7d2hpbGUoOTk8YSk7cmV0dXJuIE1hdGgubWF4KGEsMC4xKS50b0ZpeGVkKDEpK3RoaXMuX29wdGlvbnMudGV4dC5zaXplU3ltYm9sc1tiXX0sX3dyYXBDYWxsYmFja3M6ZnVuY3Rpb24oKXt2YXIgYSxiO2E9dGhpcztiPWZ1bmN0aW9uKGIsYyxmKXt0cnl7cmV0dXJuIGMuYXBwbHkoYSxmKX1jYXRjaChnKXthLmxvZygiQ2F1Z2h0IGV4Y2VwdGlvbiBpbiAnIitiKyInIGNhbGxiYWNrIC0gIitnLm1lc3NhZ2UsImVycm9yIil9fTtmb3IodmFyIGMgaW4gdGhpcy5fb3B0aW9ucy5jYWxsYmFja3MpKGZ1bmN0aW9uKCl7dmFyIGQsZTtkPWM7ZT1hLl9vcHRpb25zLmNhbGxiYWNrc1tkXTthLl9vcHRpb25zLmNhbGxiYWNrc1tkXT1mdW5jdGlvbigpe3JldHVybiBiKGQsZSxhcmd1bWVudHMpfX0pKCl9LF9wYXJzZUZpbGVPckJsb2JEYXRhTmFtZTpmdW5jdGlvbihhKXtyZXR1cm4gcXEuaXNGaWxlT3JJbnB1dChhKT8KYS52YWx1ZT9hLnZhbHVlLnJlcGxhY2UoLy4qKFwvfFxcKS8sIiIpOm51bGwhPT1hLmZpbGVOYW1lJiZ2b2lkIDAhPT1hLmZpbGVOYW1lP2EuZmlsZU5hbWU6YS5uYW1lOmEubmFtZX0sX3BhcnNlRmlsZU9yQmxvYkRhdGFTaXplOmZ1bmN0aW9uKGEpe3ZhciBiO3FxLmlzRmlsZU9ySW5wdXQoYSk/YS52YWx1ZXx8KGI9bnVsbCE9PWEuZmlsZVNpemUmJnZvaWQgMCE9PWEuZmlsZVNpemU/YS5maWxlU2l6ZTphLnNpemUpOmI9YS5ibG9iLnNpemU7cmV0dXJuIGJ9LF9nZXRWYWxpZGF0aW9uRGVzY3JpcHRvcjpmdW5jdGlvbihhKXt2YXIgYixjO2M9e307Yj10aGlzLl9wYXJzZUZpbGVPckJsb2JEYXRhTmFtZShhKTthPXRoaXMuX3BhcnNlRmlsZU9yQmxvYkRhdGFTaXplKGEpO2MubmFtZT1iO2EmJihjLnNpemU9YSk7cmV0dXJuIGN9LF9nZXRWYWxpZGF0aW9uRGVzY3JpcHRvcnM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcyxjPVtdO3FxLmVhY2goYSxmdW5jdGlvbihhLGUpe2MucHVzaChiLl9nZXRWYWxpZGF0aW9uRGVzY3JpcHRvcihlKSl9KTsKcmV0dXJuIGN9LF9jcmVhdGVQYXJhbXNTdG9yZTpmdW5jdGlvbihhKXt2YXIgYj17fSxjPXRoaXM7cmV0dXJue3NldFBhcmFtczpmdW5jdGlvbihhLGMpe3ZhciBmPXt9O3FxLmV4dGVuZChmLGEpO2JbY109Zn0sZ2V0UGFyYW1zOmZ1bmN0aW9uKGQpe3ZhciBlPXt9O251bGwhPWQmJmJbZF0/cXEuZXh0ZW5kKGUsYltkXSk6cXEuZXh0ZW5kKGUsYy5fb3B0aW9uc1thXS5wYXJhbXMpO3JldHVybiBlfSxyZW1vdmU6ZnVuY3Rpb24oYSl7cmV0dXJuIGRlbGV0ZSBiW2FdfSxyZXNldDpmdW5jdGlvbigpe2I9e319fX0sX2NyZWF0ZUVuZHBvaW50U3RvcmU6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz10aGlzO3JldHVybntzZXRFbmRwb2ludDpmdW5jdGlvbihhLGMpe2JbY109YX0sZ2V0RW5kcG9pbnQ6ZnVuY3Rpb24oZCl7cmV0dXJuIG51bGwhPWQmJmJbZF0/YltkXTpjLl9vcHRpb25zW2FdLmVuZHBvaW50fSxyZW1vdmU6ZnVuY3Rpb24oYSl7cmV0dXJuIGRlbGV0ZSBiW2FdfSxyZXNldDpmdW5jdGlvbigpe2I9Cnt9fX19fTsKcXEuRHJhZ0FuZERyb3A9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYigpe2s9PT1sJiYhaSYmKGcuY2FsbGJhY2tzLmxvZygiR3JhYmJlZCAiK20ubGVuZ3RoKyIgZmlsZXMgYWZ0ZXIgdHJlZSB0cmF2ZXJzYWwuIiksbi5kcm9wRGlzYWJsZWQoITEpLGcuY2FsbGJhY2tzLmRyb3BQcm9jZXNzaW5nKCExLG0pKX1mdW5jdGlvbiBjKGEpe3ZhciBkO2srPTE7YS5pc0ZpbGU/YS5maWxlKGZ1bmN0aW9uKGEpe20ucHVzaChhKTtsKz0xO2IoKX0pOmEuaXNEaXJlY3RvcnkmJihpPSEwLGE9YS5jcmVhdGVSZWFkZXIoKSxhLnJlYWRFbnRyaWVzKGZ1bmN0aW9uKGEpe2wrPTE7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrPTEpYyhhW2RdKTtpPSExO2EubGVuZ3RofHxiKCl9KSl9ZnVuY3Rpb24gZChhKXtuPW5ldyBxcS5VcGxvYWREcm9wWm9uZSh7ZWxlbWVudDphLG9uRW50ZXI6ZnVuY3Rpb24oYil7cXEoYSkuYWRkQ2xhc3MoZy5jbGFzc2VzLmRyb3BBY3RpdmUpO2Iuc3RvcFByb3BhZ2F0aW9uKCl9LG9uTGVhdmVOb3REZXNjZW5kYW50czpmdW5jdGlvbigpe3FxKGEpLnJlbW92ZUNsYXNzKGcuY2xhc3Nlcy5kcm9wQWN0aXZlKX0sCm9uRHJvcDpmdW5jdGlvbihkKXtnLmhpZGVEcm9wem9uZXMmJnFxKGEpLmhpZGUoKTtxcShhKS5yZW1vdmVDbGFzcyhnLmNsYXNzZXMuZHJvcEFjdGl2ZSk7dmFyIGQ9ZC5kYXRhVHJhbnNmZXIsZSxmO2cuY2FsbGJhY2tzLmRyb3BQcm9jZXNzaW5nKCEwKTtuLmRyb3BEaXNhYmxlZCghMCk7aWYoMTxkLmZpbGVzLmxlbmd0aCYmIWcubXVsdGlwbGUpZy5jYWxsYmFja3MuZHJvcFByb2Nlc3NpbmcoITEpLGcuY2FsbGJhY2tzLmVycm9yKCJ0b29NYW55RmlsZXNFcnJvciIsIiIpLG4uZHJvcERpc2FibGVkKCExKTtlbHNlIGlmKG09W10sbD1rPTAscXEuaXNGb2xkZXJEcm9wU3VwcG9ydGVkKGQpKXtlPWQuaXRlbXM7Zm9yKGQ9MDtkPGUubGVuZ3RoO2QrPTEpaWYoZj1lW2RdLndlYmtpdEdldEFzRW50cnkoKSlmLmlzRmlsZT8obS5wdXNoKGVbZF0uZ2V0QXNGaWxlKCkpLGQ9PT1lLmxlbmd0aC0xJiZiKCkpOmMoZil9ZWxzZSBnLmNhbGxiYWNrcy5kcm9wUHJvY2Vzc2luZyghMSxkLmZpbGVzKSwKbi5kcm9wRGlzYWJsZWQoITEpfX0pO3QuYWRkRGlzcG9zZXIoZnVuY3Rpb24oKXtuLmRpc3Bvc2UoKX0pO2cuaGlkZURyb3B6b25lcyYmcXEoYSkuaGlkZSgpfWZ1bmN0aW9uIGUoYSl7dmFyIGI7cXEuZWFjaChhLmRhdGFUcmFuc2Zlci50eXBlcyxmdW5jdGlvbihhLGMpe2lmKCJGaWxlcyI9PT1jKXJldHVybiBiPSEwLCExfSk7cmV0dXJuIGJ9ZnVuY3Rpb24gZigpe2cuZHJvcEFyZWEmJmcuZXh0cmFEcm9wem9uZXMucHVzaChnLmRyb3BBcmVhKTt2YXIgYSxiPWcuZXh0cmFEcm9wem9uZXM7Zm9yKGE9MDthPGIubGVuZ3RoO2ErPTEpZChiW2FdKTtnLmRyb3BBcmVhJiYoIXFxLmllKCl8fHFxLmllMTAoKSkmJnQuYXR0YWNoKGRvY3VtZW50LCJkcmFnZW50ZXIiLGZ1bmN0aW9uKGMpe2lmKCFuLmRyb3BEaXNhYmxlZCgpJiZlKGMpJiYhcXEoZy5kcm9wQXJlYSkuaGFzQ2xhc3MoZy5jbGFzc2VzLmRyb3BEaXNhYmxlZCkpe2cuZHJvcEFyZWEuc3R5bGUuZGlzcGxheT0iYmxvY2siO2ZvcihhPQowO2E8Yi5sZW5ndGg7YSs9MSliW2FdLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn19KTt0LmF0dGFjaChkb2N1bWVudCwiZHJhZ2xlYXZlIixmdW5jdGlvbihjKXtpZihnLmhpZGVEcm9wem9uZXMmJnFxLkZpbmVVcGxvYWRlci5wcm90b3R5cGUuX2xlYXZpbmdfZG9jdW1lbnRfb3V0KGMpKWZvcihhPTA7YTxiLmxlbmd0aDthKz0xKXFxKGJbYV0pLmhpZGUoKX0pO3QuYXR0YWNoKGRvY3VtZW50LCJkcm9wIixmdW5jdGlvbihjKXtpZihnLmhpZGVEcm9wem9uZXMpZm9yKGE9MDthPGIubGVuZ3RoO2ErPTEpcXEoYlthXSkuaGlkZSgpO2MucHJldmVudERlZmF1bHQoKX0pfXZhciBnLG4saSxtPVtdLGs9MCxsPTAsdD1uZXcgcXEuRGlzcG9zZVN1cHBvcnQ7Zz17ZHJvcEFyZWE6bnVsbCxleHRyYURyb3B6b25lczpbXSxoaWRlRHJvcHpvbmVzOiEwLG11bHRpcGxlOiEwLGNsYXNzZXM6e2Ryb3BBY3RpdmU6bnVsbH0sY2FsbGJhY2tzOntkcm9wUHJvY2Vzc2luZzpmdW5jdGlvbigpe30sZXJyb3I6ZnVuY3Rpb24oKXt9LApsb2c6ZnVuY3Rpb24oKXt9fX07cXEuZXh0ZW5kKGcsYSk7cmV0dXJue3NldHVwOmZ1bmN0aW9uKCl7ZigpfSxzZXR1cEV4dHJhRHJvcHpvbmU6ZnVuY3Rpb24oYSl7Zy5leHRyYURyb3B6b25lcy5wdXNoKGEpO2QoYSl9LHJlbW92ZUV4dHJhRHJvcHpvbmU6ZnVuY3Rpb24oYSl7dmFyIGIsYz1nLmV4dHJhRHJvcHpvbmVzO2ZvcihiIGluIGMpaWYoY1tiXT09PWEpcmV0dXJuIGMuc3BsaWNlKGIsMSl9LGRpc3Bvc2U6ZnVuY3Rpb24oKXt0LmRpc3Bvc2UoKTtuLmRpc3Bvc2UoKX19fTsKcXEuVXBsb2FkRHJvcFpvbmU9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYigpe3JldHVybiBxcS5zYWZhcmkoKXx8cXEuZmlyZWZveCgpJiZxcS53aW5kb3dzKCl9ZnVuY3Rpb24gYyhhKXtpZihxcS5pZSgpJiYhcXEuaWUxMCgpKXJldHVybiExO3ZhciBiPWEuZGF0YVRyYW5zZmVyLGM9cXEuc2FmYXJpKCksYT1xcS5pZTEwKCk/ITA6Im5vbmUiIT09Yi5lZmZlY3RBbGxvd2VkO3JldHVybiBiJiZhJiYoYi5maWxlc3x8IWMmJmIudHlwZXMuY29udGFpbnMmJmIudHlwZXMuY29udGFpbnMoIkZpbGVzIikpfWZ1bmN0aW9uIGQoYSl7dm9pZCAwIT09YSYmKGc9YSk7cmV0dXJuIGd9dmFyIGUsZixnLG4saT1uZXcgcXEuRGlzcG9zZVN1cHBvcnQ7ZT17ZWxlbWVudDpudWxsLG9uRW50ZXI6ZnVuY3Rpb24oKXt9LG9uTGVhdmU6ZnVuY3Rpb24oKXt9LG9uTGVhdmVOb3REZXNjZW5kYW50czpmdW5jdGlvbigpe30sb25Ecm9wOmZ1bmN0aW9uKCl7fX07cXEuZXh0ZW5kKGUsYSk7Zj1lLmVsZW1lbnQ7CihmdW5jdGlvbigpe258fChiP2kuYXR0YWNoKGRvY3VtZW50LCJkcmFnb3ZlciIsZnVuY3Rpb24oYSl7YS5wcmV2ZW50RGVmYXVsdCgpfSk6aS5hdHRhY2goZG9jdW1lbnQsImRyYWdvdmVyIixmdW5jdGlvbihhKXthLmRhdGFUcmFuc2ZlciYmKGEuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3Q9Im5vbmUiLGEucHJldmVudERlZmF1bHQoKSl9KSxuPSEwKX0pKCk7KGZ1bmN0aW9uKCl7aS5hdHRhY2goZiwiZHJhZ292ZXIiLGZ1bmN0aW9uKGEpe2lmKGMoYSkpe3ZhciBiPXFxLmllKCk/bnVsbDphLmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkO2EuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3Q9Im1vdmUiPT09Ynx8ImxpbmtNb3ZlIj09PWI/Im1vdmUiOiJjb3B5IjthLnN0b3BQcm9wYWdhdGlvbigpO2EucHJldmVudERlZmF1bHQoKX19KTtpLmF0dGFjaChmLCJkcmFnZW50ZXIiLGZ1bmN0aW9uKGEpe2lmKCFkKCkmJmMoYSkpZS5vbkVudGVyKGEpfSk7aS5hdHRhY2goZiwiZHJhZ2xlYXZlIiwKZnVuY3Rpb24oYSl7aWYoYyhhKSl7ZS5vbkxlYXZlKGEpO3ZhciBiPWRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoYS5jbGllbnRYLGEuY2xpZW50WSk7aWYoIXFxKHRoaXMpLmNvbnRhaW5zKGIpKWUub25MZWF2ZU5vdERlc2NlbmRhbnRzKGEpfX0pO2kuYXR0YWNoKGYsImRyb3AiLGZ1bmN0aW9uKGEpeyFkKCkmJmMoYSkmJihhLnByZXZlbnREZWZhdWx0KCksZS5vbkRyb3AoYSkpfSl9KSgpO3JldHVybntkcm9wRGlzYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGQoYSl9LGRpc3Bvc2U6ZnVuY3Rpb24oKXtpLmRpc3Bvc2UoKX19fTsKcXEuRmluZVVwbG9hZGVyPWZ1bmN0aW9uKGEpe3FxLkZpbmVVcGxvYWRlckJhc2ljLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtxcS5leHRlbmQodGhpcy5fb3B0aW9ucyx7ZWxlbWVudDpudWxsLGxpc3RFbGVtZW50Om51bGwsZHJhZ0FuZERyb3A6e2V4dHJhRHJvcHpvbmVzOltdLGhpZGVEcm9wem9uZXM6ITAsZGlzYWJsZURlZmF1bHREcm9wem9uZTohMX0sdGV4dDp7dXBsb2FkQnV0dG9uOiJVcGxvYWQgYSBmaWxlIixjYW5jZWxCdXR0b246IkNhbmNlbCIscmV0cnlCdXR0b246IlJldHJ5IixkZWxldGVCdXR0b246IkRlbGV0ZSIsZmFpbFVwbG9hZDoiVXBsb2FkIGZhaWxlZCIsZHJhZ1pvbmU6IkRyb3AgZmlsZXMgaGVyZSB0byB1cGxvYWQiLGRyb3BQcm9jZXNzaW5nOiJQcm9jZXNzaW5nIGRyb3BwZWQgZmlsZXMuLi4iLGZvcm1hdFByb2dyZXNzOiJ7cGVyY2VudH0lIG9mIHt0b3RhbF9zaXplfSIsd2FpdGluZ0ZvclJlc3BvbnNlOiJQcm9jZXNzaW5nLi4uIn0sdGVtcGxhdGU6JzxkaXYgY2xhc3M9InFxLXVwbG9hZGVyIj4nKwooIXRoaXMuX29wdGlvbnMuZHJhZ0FuZERyb3B8fCF0aGlzLl9vcHRpb25zLmRyYWdBbmREcm9wLmRpc2FibGVEZWZhdWx0RHJvcHpvbmU/JzxkaXYgY2xhc3M9InFxLXVwbG9hZC1kcm9wLWFyZWEiPjxzcGFuPntkcmFnWm9uZVRleHR9PC9zcGFuPjwvZGl2Pic6IiIpKyghdGhpcy5fb3B0aW9ucy5idXR0b24/JzxkaXYgY2xhc3M9InFxLXVwbG9hZC1idXR0b24iPjxkaXY+e3VwbG9hZEJ1dHRvblRleHR9PC9kaXY+PC9kaXY+JzoiIikrJzxzcGFuIGNsYXNzPSJxcS1kcm9wLXByb2Nlc3NpbmciPjxzcGFuPntkcm9wUHJvY2Vzc2luZ1RleHR9PC9zcGFuPjxzcGFuIGNsYXNzPSJxcS1kcm9wLXByb2Nlc3Npbmctc3Bpbm5lciI+PC9zcGFuPjwvc3Bhbj4nKyghdGhpcy5fb3B0aW9ucy5saXN0RWxlbWVudD8nPHVsIGNsYXNzPSJxcS11cGxvYWQtbGlzdCI+PC91bD4nOiIiKSsiPC9kaXY+IixmaWxlVGVtcGxhdGU6JzxsaT48ZGl2IGNsYXNzPSJxcS1wcm9ncmVzcy1iYXIiPjwvZGl2PjxzcGFuIGNsYXNzPSJxcS11cGxvYWQtc3Bpbm5lciI+PC9zcGFuPjxzcGFuIGNsYXNzPSJxcS11cGxvYWQtZmluaXNoZWQiPjwvc3Bhbj48c3BhbiBjbGFzcz0icXEtdXBsb2FkLWZpbGUiPjwvc3Bhbj48c3BhbiBjbGFzcz0icXEtdXBsb2FkLXNpemUiPjwvc3Bhbj48YSBjbGFzcz0icXEtdXBsb2FkLWNhbmNlbCIgaHJlZj0iIyI+e2NhbmNlbEJ1dHRvblRleHR9PC9hPjxhIGNsYXNzPSJxcS11cGxvYWQtcmV0cnkiIGhyZWY9IiMiPntyZXRyeUJ1dHRvblRleHR9PC9hPjxhIGNsYXNzPSJxcS11cGxvYWQtZGVsZXRlIiBocmVmPSIjIj57ZGVsZXRlQnV0dG9uVGV4dH08L2E+PHNwYW4gY2xhc3M9InFxLXVwbG9hZC1zdGF0dXMtdGV4dCI+e3N0YXR1c1RleHR9PC9zcGFuPjwvbGk+JywKY2xhc3Nlczp7YnV0dG9uOiJxcS11cGxvYWQtYnV0dG9uIixkcm9wOiJxcS11cGxvYWQtZHJvcC1hcmVhIixkcm9wQWN0aXZlOiJxcS11cGxvYWQtZHJvcC1hcmVhLWFjdGl2ZSIsZHJvcERpc2FibGVkOiJxcS11cGxvYWQtZHJvcC1hcmVhLWRpc2FibGVkIixsaXN0OiJxcS11cGxvYWQtbGlzdCIscHJvZ3Jlc3NCYXI6InFxLXByb2dyZXNzLWJhciIsZmlsZToicXEtdXBsb2FkLWZpbGUiLHNwaW5uZXI6InFxLXVwbG9hZC1zcGlubmVyIixmaW5pc2hlZDoicXEtdXBsb2FkLWZpbmlzaGVkIixyZXRyeWluZzoicXEtdXBsb2FkLXJldHJ5aW5nIixyZXRyeWFibGU6InFxLXVwbG9hZC1yZXRyeWFibGUiLHNpemU6InFxLXVwbG9hZC1zaXplIixjYW5jZWw6InFxLXVwbG9hZC1jYW5jZWwiLGRlbGV0ZUJ1dHRvbjoicXEtdXBsb2FkLWRlbGV0ZSIscmV0cnk6InFxLXVwbG9hZC1yZXRyeSIsc3RhdHVzVGV4dDoicXEtdXBsb2FkLXN0YXR1cy10ZXh0IixzdWNjZXNzOiJxcS11cGxvYWQtc3VjY2VzcyIsCmZhaWw6InFxLXVwbG9hZC1mYWlsIixzdWNjZXNzSWNvbjpudWxsLGZhaWxJY29uOm51bGwsZHJvcFByb2Nlc3Npbmc6InFxLWRyb3AtcHJvY2Vzc2luZyIsZHJvcFByb2Nlc3NpbmdTcGlubmVyOiJxcS1kcm9wLXByb2Nlc3Npbmctc3Bpbm5lciJ9LGZhaWxlZFVwbG9hZFRleHREaXNwbGF5Onttb2RlOiJkZWZhdWx0IixtYXhDaGFyczo1MCxyZXNwb25zZVByb3BlcnR5OiJlcnJvciIsZW5hYmxlVG9vbHRpcDohMH0sbWVzc2FnZXM6e3Rvb01hbnlGaWxlc0Vycm9yOiJZb3UgbWF5IG9ubHkgZHJvcCBvbmUgZmlsZSJ9LHJldHJ5OntzaG93QXV0b1JldHJ5Tm90ZTohMCxhdXRvUmV0cnlOb3RlOiJSZXRyeWluZyB7cmV0cnlOdW19L3ttYXhBdXRvfS4uLiIsc2hvd0J1dHRvbjohMX0sZGVsZXRlRmlsZTp7Zm9yY2VDb25maXJtOiExLGNvbmZpcm1NZXNzYWdlOiJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHtmaWxlbmFtZX0/IixkZWxldGluZ1N0YXR1c1RleHQ6IkRlbGV0aW5nLi4uIiwKZGVsZXRpbmdGYWlsZWRUZXh0OiJEZWxldGUgZmFpbGVkIn0sZGlzcGxheTp7ZmlsZVNpemVPblN1Ym1pdDohMX0scGFzdGU6e3Byb21wdEZvck5hbWU6ITEsbmFtZVByb21wdE1lc3NhZ2U6IlBsZWFzZSBuYW1lIHRoaXMgaW1hZ2UifSxzaG93TWVzc2FnZTpmdW5jdGlvbihhKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7d2luZG93LmFsZXJ0KGEpfSwwKX0sc2hvd0NvbmZpcm06ZnVuY3Rpb24oYSxjLGQpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt3aW5kb3cuY29uZmlybShhKT9jKCk6ZCYmZCgpfSwwKX0sc2hvd1Byb21wdDpmdW5jdGlvbihhLGMpe3ZhciBkPW5ldyBxcS5Qcm9taXNlLGU9d2luZG93LnByb21wdChhLGMpO251bGwhPWUmJjA8cXEudHJpbVN0cihlKS5sZW5ndGg/ZC5zdWNjZXNzKGUpOmQuZmFpbHVyZSgiVW5kZWZpbmVkIG9yIGludmFsaWQgdXNlci1zdXBwbGllZCB2YWx1ZS4iKTtyZXR1cm4gZH19LCEwKTtxcS5leHRlbmQodGhpcy5fb3B0aW9ucyxhLCEwKTt0aGlzLl93cmFwQ2FsbGJhY2tzKCk7CnRoaXMuX29wdGlvbnMudGVtcGxhdGU9dGhpcy5fb3B0aW9ucy50ZW1wbGF0ZS5yZXBsYWNlKC9ce2RyYWdab25lVGV4dFx9L2csdGhpcy5fb3B0aW9ucy50ZXh0LmRyYWdab25lKTt0aGlzLl9vcHRpb25zLnRlbXBsYXRlPXRoaXMuX29wdGlvbnMudGVtcGxhdGUucmVwbGFjZSgvXHt1cGxvYWRCdXR0b25UZXh0XH0vZyx0aGlzLl9vcHRpb25zLnRleHQudXBsb2FkQnV0dG9uKTt0aGlzLl9vcHRpb25zLnRlbXBsYXRlPXRoaXMuX29wdGlvbnMudGVtcGxhdGUucmVwbGFjZSgvXHtkcm9wUHJvY2Vzc2luZ1RleHRcfS9nLHRoaXMuX29wdGlvbnMudGV4dC5kcm9wUHJvY2Vzc2luZyk7dGhpcy5fb3B0aW9ucy5maWxlVGVtcGxhdGU9dGhpcy5fb3B0aW9ucy5maWxlVGVtcGxhdGUucmVwbGFjZSgvXHtjYW5jZWxCdXR0b25UZXh0XH0vZyx0aGlzLl9vcHRpb25zLnRleHQuY2FuY2VsQnV0dG9uKTt0aGlzLl9vcHRpb25zLmZpbGVUZW1wbGF0ZT10aGlzLl9vcHRpb25zLmZpbGVUZW1wbGF0ZS5yZXBsYWNlKC9ce3JldHJ5QnV0dG9uVGV4dFx9L2csCnRoaXMuX29wdGlvbnMudGV4dC5yZXRyeUJ1dHRvbik7dGhpcy5fb3B0aW9ucy5maWxlVGVtcGxhdGU9dGhpcy5fb3B0aW9ucy5maWxlVGVtcGxhdGUucmVwbGFjZSgvXHtkZWxldGVCdXR0b25UZXh0XH0vZyx0aGlzLl9vcHRpb25zLnRleHQuZGVsZXRlQnV0dG9uKTt0aGlzLl9vcHRpb25zLmZpbGVUZW1wbGF0ZT10aGlzLl9vcHRpb25zLmZpbGVUZW1wbGF0ZS5yZXBsYWNlKC9ce3N0YXR1c1RleHRcfS9nLCIiKTt0aGlzLl9lbGVtZW50PXRoaXMuX29wdGlvbnMuZWxlbWVudDt0aGlzLl9lbGVtZW50LmlubmVySFRNTD10aGlzLl9vcHRpb25zLnRlbXBsYXRlO3RoaXMuX2xpc3RFbGVtZW50PXRoaXMuX29wdGlvbnMubGlzdEVsZW1lbnR8fHRoaXMuX2ZpbmQodGhpcy5fZWxlbWVudCwibGlzdCIpO3RoaXMuX2NsYXNzZXM9dGhpcy5fb3B0aW9ucy5jbGFzc2VzO3RoaXMuX2J1dHRvbnx8KHRoaXMuX2J1dHRvbj10aGlzLl9jcmVhdGVVcGxvYWRCdXR0b24odGhpcy5fZmluZCh0aGlzLl9lbGVtZW50LAoiYnV0dG9uIikpKTt0aGlzLl9iaW5kQ2FuY2VsQW5kUmV0cnlFdmVudHMoKTt0aGlzLl9kbmQ9dGhpcy5fc2V0dXBEcmFnQW5kRHJvcCgpO3RoaXMuX29wdGlvbnMucGFzdGUudGFyZ2V0RWxlbWVudCYmdGhpcy5fb3B0aW9ucy5wYXN0ZS5wcm9tcHRGb3JOYW1lJiZ0aGlzLl9zZXR1cFBhc3RlUHJvbXB0KCl9O3FxLmV4dGVuZChxcS5GaW5lVXBsb2FkZXIucHJvdG90eXBlLHFxLkZpbmVVcGxvYWRlckJhc2ljLnByb3RvdHlwZSk7CnFxLmV4dGVuZChxcS5GaW5lVXBsb2FkZXIucHJvdG90eXBlLHtjbGVhclN0b3JlZEZpbGVzOmZ1bmN0aW9uKCl7cXEuRmluZVVwbG9hZGVyQmFzaWMucHJvdG90eXBlLmNsZWFyU3RvcmVkRmlsZXMuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuX2xpc3RFbGVtZW50LmlubmVySFRNTD0iIn0sYWRkRXh0cmFEcm9wem9uZTpmdW5jdGlvbihhKXt0aGlzLl9kbmQuc2V0dXBFeHRyYURyb3B6b25lKGEpfSxyZW1vdmVFeHRyYURyb3B6b25lOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9kbmQucmVtb3ZlRXh0cmFEcm9wem9uZShhKX0sZ2V0SXRlbUJ5RmlsZUlkOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLl9saXN0RWxlbWVudC5maXJzdENoaWxkO2I7KXtpZihiLnFxRmlsZUlkPT1hKXJldHVybiBiO2I9Yi5uZXh0U2libGluZ319LHJlc2V0OmZ1bmN0aW9uKCl7cXEuRmluZVVwbG9hZGVyQmFzaWMucHJvdG90eXBlLnJlc2V0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLl9lbGVtZW50LmlubmVySFRNTD0KdGhpcy5fb3B0aW9ucy50ZW1wbGF0ZTt0aGlzLl9saXN0RWxlbWVudD10aGlzLl9vcHRpb25zLmxpc3RFbGVtZW50fHx0aGlzLl9maW5kKHRoaXMuX2VsZW1lbnQsImxpc3QiKTt0aGlzLl9vcHRpb25zLmJ1dHRvbnx8KHRoaXMuX2J1dHRvbj10aGlzLl9jcmVhdGVVcGxvYWRCdXR0b24odGhpcy5fZmluZCh0aGlzLl9lbGVtZW50LCJidXR0b24iKSkpO3RoaXMuX2JpbmRDYW5jZWxBbmRSZXRyeUV2ZW50cygpO3RoaXMuX2RuZC5kaXNwb3NlKCk7dGhpcy5fZG5kPXRoaXMuX3NldHVwRHJhZ0FuZERyb3AoKX0sX3JlbW92ZUZpbGVJdGVtOmZ1bmN0aW9uKGEpe2E9dGhpcy5nZXRJdGVtQnlGaWxlSWQoYSk7cXEoYSkucmVtb3ZlKCl9LF9zZXR1cERyYWdBbmREcm9wOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxiPXRoaXMuX2ZpbmQodGhpcy5fZWxlbWVudCwiZHJvcFByb2Nlc3NpbmciKSxjLGQ7ZD1mdW5jdGlvbihhKXthLnByZXZlbnREZWZhdWx0KCl9O3RoaXMuX29wdGlvbnMuZHJhZ0FuZERyb3AuZGlzYWJsZURlZmF1bHREcm9wem9uZXx8CihjPXRoaXMuX2ZpbmQodGhpcy5fb3B0aW9ucy5lbGVtZW50LCJkcm9wIikpO2M9bmV3IHFxLkRyYWdBbmREcm9wKHtkcm9wQXJlYTpjLGV4dHJhRHJvcHpvbmVzOnRoaXMuX29wdGlvbnMuZHJhZ0FuZERyb3AuZXh0cmFEcm9wem9uZXMsaGlkZURyb3B6b25lczp0aGlzLl9vcHRpb25zLmRyYWdBbmREcm9wLmhpZGVEcm9wem9uZXMsbXVsdGlwbGU6dGhpcy5fb3B0aW9ucy5tdWx0aXBsZSxjbGFzc2VzOntkcm9wQWN0aXZlOnRoaXMuX29wdGlvbnMuY2xhc3Nlcy5kcm9wQWN0aXZlfSxjYWxsYmFja3M6e2Ryb3BQcm9jZXNzaW5nOmZ1bmN0aW9uKGMsZil7dmFyIGc9YS5fYnV0dG9uLmdldElucHV0KCk7Yz8ocXEoYikuY3NzKHtkaXNwbGF5OiJibG9jayJ9KSxxcShnKS5hdHRhY2goImNsaWNrIixkKSk6KHFxKGIpLmhpZGUoKSxxcShnKS5kZXRhY2goImNsaWNrIixkKSk7ZiYmYS5hZGRGaWxlcyhmKX0sZXJyb3I6ZnVuY3Rpb24oYixjKXthLl9pdGVtRXJyb3IoYixjKX0sbG9nOmZ1bmN0aW9uKGIsCmMpe2EubG9nKGIsYyl9fX0pO2Muc2V0dXAoKTtyZXR1cm4gY30sX2xlYXZpbmdfZG9jdW1lbnRfb3V0OmZ1bmN0aW9uKGEpe3JldHVybihxcS5jaHJvbWUoKXx8cXEuc2FmYXJpKCkmJnFxLndpbmRvd3MoKSkmJjA9PWEuY2xpZW50WCYmMD09YS5jbGllbnRZfHxxcS5maXJlZm94KCkmJiFhLnJlbGF0ZWRUYXJnZXR9LF9zdG9yZUZvckxhdGVyOmZ1bmN0aW9uKGEpe3FxLkZpbmVVcGxvYWRlckJhc2ljLnByb3RvdHlwZS5fc3RvcmVGb3JMYXRlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGI9dGhpcy5nZXRJdGVtQnlGaWxlSWQoYSk7cXEodGhpcy5fZmluZChiLCJzcGlubmVyIikpLmhpZGUoKX0sX2ZpbmQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz1xcShhKS5nZXRCeUNsYXNzKHRoaXMuX29wdGlvbnMuY2xhc3Nlc1tiXSlbMF07aWYoIWMpdGhyb3cgRXJyb3IoImVsZW1lbnQgbm90IGZvdW5kICIrYik7cmV0dXJuIGN9LF9vblN1Ym1pdDpmdW5jdGlvbihhLGIpe3FxLkZpbmVVcGxvYWRlckJhc2ljLnByb3RvdHlwZS5fb25TdWJtaXQuYXBwbHkodGhpcywKYXJndW1lbnRzKTt0aGlzLl9hZGRUb0xpc3QoYSxiKX0sX29uUHJvZ3Jlc3M6ZnVuY3Rpb24oYSxiLGMsZCl7cXEuRmluZVVwbG9hZGVyQmFzaWMucHJvdG90eXBlLl9vblByb2dyZXNzLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgZSxmLGcsbjtlPXRoaXMuZ2V0SXRlbUJ5RmlsZUlkKGEpO2Y9dGhpcy5fZmluZChlLCJwcm9ncmVzc0JhciIpO2c9TWF0aC5yb3VuZCgxMDAqKGMvZCkpO2M9PT1kPyhuPXRoaXMuX2ZpbmQoZSwiY2FuY2VsIikscXEobikuaGlkZSgpLHFxKGYpLmhpZGUoKSxxcSh0aGlzLl9maW5kKGUsInN0YXR1c1RleHQiKSkuc2V0VGV4dCh0aGlzLl9vcHRpb25zLnRleHQud2FpdGluZ0ZvclJlc3BvbnNlKSx0aGlzLl9kaXNwbGF5RmlsZVNpemUoYSkpOih0aGlzLl9kaXNwbGF5RmlsZVNpemUoYSxjLGQpLHFxKGYpLmNzcyh7ZGlzcGxheToiYmxvY2sifSkpO3FxKGYpLmNzcyh7d2lkdGg6ZysiJSJ9KX0sX29uQ29tcGxldGU6ZnVuY3Rpb24oYSxiLGMsZCl7cXEuRmluZVVwbG9hZGVyQmFzaWMucHJvdG90eXBlLl9vbkNvbXBsZXRlLmFwcGx5KHRoaXMsCmFyZ3VtZW50cyk7dmFyIGU9dGhpcy5nZXRJdGVtQnlGaWxlSWQoYSk7cXEodGhpcy5fZmluZChlLCJzdGF0dXNUZXh0IikpLmNsZWFyVGV4dCgpO3FxKGUpLnJlbW92ZUNsYXNzKHRoaXMuX2NsYXNzZXMucmV0cnlpbmcpO3FxKHRoaXMuX2ZpbmQoZSwicHJvZ3Jlc3NCYXIiKSkuaGlkZSgpOyghdGhpcy5fb3B0aW9ucy5kaXNhYmxlQ2FuY2VsRm9yRm9ybVVwbG9hZHN8fHFxLmlzWGhyVXBsb2FkU3VwcG9ydGVkKCkpJiZxcSh0aGlzLl9maW5kKGUsImNhbmNlbCIpKS5oaWRlKCk7cXEodGhpcy5fZmluZChlLCJzcGlubmVyIikpLmhpZGUoKTtjLnN1Y2Nlc3M/KHRoaXMuX2lzRGVsZXRlUG9zc2libGUoKSYmdGhpcy5fc2hvd0RlbGV0ZUxpbmsoYSkscXEoZSkuYWRkQ2xhc3ModGhpcy5fY2xhc3Nlcy5zdWNjZXNzKSx0aGlzLl9jbGFzc2VzLnN1Y2Nlc3NJY29uJiYodGhpcy5fZmluZChlLCJmaW5pc2hlZCIpLnN0eWxlLmRpc3BsYXk9ImlubGluZS1ibG9jayIscXEoZSkuYWRkQ2xhc3ModGhpcy5fY2xhc3Nlcy5zdWNjZXNzSWNvbikpKToKKHFxKGUpLmFkZENsYXNzKHRoaXMuX2NsYXNzZXMuZmFpbCksdGhpcy5fY2xhc3Nlcy5mYWlsSWNvbiYmKHRoaXMuX2ZpbmQoZSwiZmluaXNoZWQiKS5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siLHFxKGUpLmFkZENsYXNzKHRoaXMuX2NsYXNzZXMuZmFpbEljb24pKSx0aGlzLl9vcHRpb25zLnJldHJ5LnNob3dCdXR0b24mJiF0aGlzLl9wcmV2ZW50UmV0cmllc1thXSYmcXEoZSkuYWRkQ2xhc3ModGhpcy5fY2xhc3Nlcy5yZXRyeWFibGUpLHRoaXMuX2NvbnRyb2xGYWlsdXJlVGV4dERpc3BsYXkoZSxjKSl9LF9vblVwbG9hZDpmdW5jdGlvbihhLGIpe3FxLkZpbmVVcGxvYWRlckJhc2ljLnByb3RvdHlwZS5fb25VcGxvYWQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuX3Nob3dTcGlubmVyKGEpfSxfb25DYW5jZWw6ZnVuY3Rpb24oYSxiKXtxcS5GaW5lVXBsb2FkZXJCYXNpYy5wcm90b3R5cGUuX29uQ2FuY2VsLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLl9yZW1vdmVGaWxlSXRlbShhKX0sCl9vbkJlZm9yZUF1dG9SZXRyeTpmdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmO3FxLkZpbmVVcGxvYWRlckJhc2ljLnByb3RvdHlwZS5fb25CZWZvcmVBdXRvUmV0cnkuYXBwbHkodGhpcyxhcmd1bWVudHMpO2I9dGhpcy5nZXRJdGVtQnlGaWxlSWQoYSk7Yz10aGlzLl9maW5kKGIsInByb2dyZXNzQmFyIik7dGhpcy5fc2hvd0NhbmNlbExpbmsoYik7Yy5zdHlsZS53aWR0aD0wO3FxKGMpLmhpZGUoKTt0aGlzLl9vcHRpb25zLnJldHJ5LnNob3dBdXRvUmV0cnlOb3RlJiYoYz10aGlzLl9maW5kKGIsInN0YXR1c1RleHQiKSxkPXRoaXMuX2F1dG9SZXRyaWVzW2FdKzEsZT10aGlzLl9vcHRpb25zLnJldHJ5Lm1heEF1dG9BdHRlbXB0cyxmPXRoaXMuX29wdGlvbnMucmV0cnkuYXV0b1JldHJ5Tm90ZS5yZXBsYWNlKC9ce3JldHJ5TnVtXH0vZyxkKSxmPWYucmVwbGFjZSgvXHttYXhBdXRvXH0vZyxlKSxxcShjKS5zZXRUZXh0KGYpLDE9PT1kJiZxcShiKS5hZGRDbGFzcyh0aGlzLl9jbGFzc2VzLnJldHJ5aW5nKSl9LApfb25CZWZvcmVNYW51YWxSZXRyeTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldEl0ZW1CeUZpbGVJZChhKTtpZihxcS5GaW5lVXBsb2FkZXJCYXNpYy5wcm90b3R5cGUuX29uQmVmb3JlTWFudWFsUmV0cnkuYXBwbHkodGhpcyxhcmd1bWVudHMpKXJldHVybiB0aGlzLl9maW5kKGIsInByb2dyZXNzQmFyIikuc3R5bGUud2lkdGg9MCxxcShiKS5yZW1vdmVDbGFzcyh0aGlzLl9jbGFzc2VzLmZhaWwpLHFxKHRoaXMuX2ZpbmQoYiwic3RhdHVzVGV4dCIpKS5jbGVhclRleHQoKSx0aGlzLl9zaG93U3Bpbm5lcihhKSx0aGlzLl9zaG93Q2FuY2VsTGluayhiKSwhMDtxcShiKS5hZGRDbGFzcyh0aGlzLl9jbGFzc2VzLnJldHJ5YWJsZSk7cmV0dXJuITF9LF9vblN1Ym1pdERlbGV0ZTpmdW5jdGlvbihhKXtpZih0aGlzLl9pc0RlbGV0ZVBvc3NpYmxlKCkpITEhPT10aGlzLl9vcHRpb25zLmNhbGxiYWNrcy5vblN1Ym1pdERlbGV0ZShhKSYmKHRoaXMuX29wdGlvbnMuZGVsZXRlRmlsZS5mb3JjZUNvbmZpcm0/CnRoaXMuX3Nob3dEZWxldGVDb25maXJtKGEpOnRoaXMuX3NlbmREZWxldGVSZXF1ZXN0KGEpKTtlbHNlIHJldHVybiB0aGlzLmxvZygiRGVsZXRlIHJlcXVlc3QgaWdub3JlZCBmb3IgZmlsZSBJRCAiK2ErIiwgZGVsZXRlIGZlYXR1cmUgaXMgZGlzYWJsZWQuIiwid2FybiIpLCExfSxfb25EZWxldGVDb21wbGV0ZTpmdW5jdGlvbihhLGIsYyl7cXEuRmluZVVwbG9hZGVyQmFzaWMucHJvdG90eXBlLl9vbkRlbGV0ZUNvbXBsZXRlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgZD10aGlzLmdldEl0ZW1CeUZpbGVJZChhKSxlPXRoaXMuX2ZpbmQoZCwic3Bpbm5lciIpLGQ9dGhpcy5fZmluZChkLCJzdGF0dXNUZXh0Iik7cXEoZSkuaGlkZSgpO2M/KHFxKGQpLnNldFRleHQodGhpcy5fb3B0aW9ucy5kZWxldGVGaWxlLmRlbGV0aW5nRmFpbGVkVGV4dCksdGhpcy5fc2hvd0RlbGV0ZUxpbmsoYSkpOnRoaXMuX3JlbW92ZUZpbGVJdGVtKGEpfSxfc2VuZERlbGV0ZVJlcXVlc3Q6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMuZ2V0SXRlbUJ5RmlsZUlkKGEpLGM9dGhpcy5fZmluZChiLCJkZWxldGVCdXR0b24iKSxiPXRoaXMuX2ZpbmQoYiwic3RhdHVzVGV4dCIpO3FxKGMpLmhpZGUoKTt0aGlzLl9zaG93U3Bpbm5lcihhKTtxcShiKS5zZXRUZXh0KHRoaXMuX29wdGlvbnMuZGVsZXRlRmlsZS5kZWxldGluZ1N0YXR1c1RleHQpO3RoaXMuX2RlbGV0ZUhhbmRsZXIuc2VuZERlbGV0ZShhLHRoaXMuZ2V0VXVpZChhKSl9LF9zaG93RGVsZXRlQ29uZmlybTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLl9vcHRpb25zLmRlbGV0ZUZpbGUuY29uZmlybU1lc3NhZ2UucmVwbGFjZSgvXHtmaWxlbmFtZVx9L2csdGhpcy5faGFuZGxlci5nZXROYW1lKGEpKTt0aGlzLmdldFV1aWQoYSk7dmFyIGM9dGhpczt0aGlzLl9vcHRpb25zLnNob3dDb25maXJtKGIsZnVuY3Rpb24oKXtjLl9zZW5kRGVsZXRlUmVxdWVzdChhKX0pfSxfYWRkVG9MaXN0OmZ1bmN0aW9uKGEsYil7dmFyIGM9cXEudG9FbGVtZW50KHRoaXMuX29wdGlvbnMuZmlsZVRlbXBsYXRlKTsKaWYodGhpcy5fb3B0aW9ucy5kaXNhYmxlQ2FuY2VsRm9yRm9ybVVwbG9hZHMmJiFxcS5pc1hoclVwbG9hZFN1cHBvcnRlZCgpKXt2YXIgZD10aGlzLl9maW5kKGMsImNhbmNlbCIpO3FxKGQpLnJlbW92ZSgpfWMucXFGaWxlSWQ9YTtkPXRoaXMuX2ZpbmQoYywiZmlsZSIpO3FxKGQpLnNldFRleHQodGhpcy5fb3B0aW9ucy5mb3JtYXRGaWxlTmFtZShiKSk7cXEodGhpcy5fZmluZChjLCJzaXplIikpLmhpZGUoKTt0aGlzLl9vcHRpb25zLm11bHRpcGxlfHwodGhpcy5faGFuZGxlci5jYW5jZWxBbGwoKSx0aGlzLl9jbGVhckxpc3QoKSk7dGhpcy5fbGlzdEVsZW1lbnQuYXBwZW5kQ2hpbGQoYyk7dGhpcy5fb3B0aW9ucy5kaXNwbGF5LmZpbGVTaXplT25TdWJtaXQmJnFxLmlzWGhyVXBsb2FkU3VwcG9ydGVkKCkmJnRoaXMuX2Rpc3BsYXlGaWxlU2l6ZShhKX0sX2NsZWFyTGlzdDpmdW5jdGlvbigpe3RoaXMuX2xpc3RFbGVtZW50LmlubmVySFRNTD0iIjt0aGlzLmNsZWFyU3RvcmVkRmlsZXMoKX0sCl9kaXNwbGF5RmlsZVNpemU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuZ2V0SXRlbUJ5RmlsZUlkKGEpLGE9dGhpcy5fZm9ybWF0U2l6ZSh0aGlzLmdldFNpemUoYSkpLGQ9dGhpcy5fZmluZChkLCJzaXplIik7dm9pZCAwIT09YiYmdm9pZCAwIT09YyYmKGE9dGhpcy5fZm9ybWF0UHJvZ3Jlc3MoYixjKSk7cXEoZCkuY3NzKHtkaXNwbGF5OiJpbmxpbmUifSk7cXEoZCkuc2V0VGV4dChhKX0sX2JpbmRDYW5jZWxBbmRSZXRyeUV2ZW50czpmdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy5fZGlzcG9zZVN1cHBvcnQuYXR0YWNoKHRoaXMuX2xpc3RFbGVtZW50LCJjbGljayIsZnVuY3Rpb24oYil7dmFyIGI9Ynx8d2luZG93LmV2ZW50LGM9Yi50YXJnZXR8fGIuc3JjRWxlbWVudDtpZihxcShjKS5oYXNDbGFzcyhhLl9jbGFzc2VzLmNhbmNlbCl8fHFxKGMpLmhhc0NsYXNzKGEuX2NsYXNzZXMucmV0cnkpfHxxcShjKS5oYXNDbGFzcyhhLl9jbGFzc2VzLmRlbGV0ZUJ1dHRvbikpe3FxLnByZXZlbnREZWZhdWx0KGIpOwpmb3IoYj1jLnBhcmVudE5vZGU7dm9pZCAwPT09Yi5xcUZpbGVJZDspYj1jPWMucGFyZW50Tm9kZTtxcShjKS5oYXNDbGFzcyhhLl9jbGFzc2VzLmRlbGV0ZUJ1dHRvbik/YS5kZWxldGVGaWxlKGIucXFGaWxlSWQpOnFxKGMpLmhhc0NsYXNzKGEuX2NsYXNzZXMuY2FuY2VsKT9hLmNhbmNlbChiLnFxRmlsZUlkKToocXEoYikucmVtb3ZlQ2xhc3MoYS5fY2xhc3Nlcy5yZXRyeWFibGUpLGEucmV0cnkoYi5xcUZpbGVJZCkpfX0pfSxfZm9ybWF0UHJvZ3Jlc3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLl9vcHRpb25zLnRleHQuZm9ybWF0UHJvZ3Jlc3MsZD1NYXRoLnJvdW5kKDEwMCooYS9iKSksYz1jLnJlcGxhY2UoIntwZXJjZW50fSIsZCksZD10aGlzLl9mb3JtYXRTaXplKGIpO3JldHVybiBjPWMucmVwbGFjZSgie3RvdGFsX3NpemV9IixkKX0sX2NvbnRyb2xGYWlsdXJlVGV4dERpc3BsYXk6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZjtjPXRoaXMuX29wdGlvbnMuZmFpbGVkVXBsb2FkVGV4dERpc3BsYXkubW9kZTsKZD10aGlzLl9vcHRpb25zLmZhaWxlZFVwbG9hZFRleHREaXNwbGF5Lm1heENoYXJzO2U9dGhpcy5fb3B0aW9ucy5mYWlsZWRVcGxvYWRUZXh0RGlzcGxheS5yZXNwb25zZVByb3BlcnR5OyJjdXN0b20iPT09Yz8oKGM9YltlXSk/Yy5sZW5ndGg+ZCYmKGY9Yy5zdWJzdHJpbmcoMCxkKSsiLi4uIik6KGM9dGhpcy5fb3B0aW9ucy50ZXh0LmZhaWxVcGxvYWQsdGhpcy5sb2coIiciK2UrIicgaXMgbm90IGEgdmFsaWQgcHJvcGVydHkgb24gdGhlIHNlcnZlciByZXNwb25zZS4iLCJ3YXJuIikpLHFxKHRoaXMuX2ZpbmQoYSwic3RhdHVzVGV4dCIpKS5zZXRUZXh0KGZ8fGMpLHRoaXMuX29wdGlvbnMuZmFpbGVkVXBsb2FkVGV4dERpc3BsYXkuZW5hYmxlVG9vbHRpcCYmdGhpcy5fc2hvd1Rvb2x0aXAoYSxjKSk6ImRlZmF1bHQiPT09Yz9xcSh0aGlzLl9maW5kKGEsInN0YXR1c1RleHQiKSkuc2V0VGV4dCh0aGlzLl9vcHRpb25zLnRleHQuZmFpbFVwbG9hZCk6Im5vbmUiIT09YyYmdGhpcy5sb2coImZhaWxlZFVwbG9hZFRleHREaXNwbGF5Lm1vZGUgdmFsdWUgb2YgJyIrCmMrIicgaXMgbm90IHZhbGlkIiwid2FybiIpfSxfc2hvd1Rvb2x0aXA6ZnVuY3Rpb24oYSxiKXthLnRpdGxlPWJ9LF9zaG93U3Bpbm5lcjpmdW5jdGlvbihhKXt0aGlzLl9maW5kKHRoaXMuZ2V0SXRlbUJ5RmlsZUlkKGEpLCJzcGlubmVyIikuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIn0sX3Nob3dDYW5jZWxMaW5rOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLl9vcHRpb25zLmRpc2FibGVDYW5jZWxGb3JGb3JtVXBsb2Fkc3x8cXEuaXNYaHJVcGxvYWRTdXBwb3J0ZWQoKSlhPXRoaXMuX2ZpbmQoYSwiY2FuY2VsIikscXEoYSkuY3NzKHtkaXNwbGF5OiJpbmxpbmUifSl9LF9zaG93RGVsZXRlTGluazpmdW5jdGlvbihhKXthPXRoaXMuX2ZpbmQodGhpcy5nZXRJdGVtQnlGaWxlSWQoYSksImRlbGV0ZUJ1dHRvbiIpO3FxKGEpLmNzcyh7ZGlzcGxheToiaW5saW5lIn0pfSxfaXRlbUVycm9yOmZ1bmN0aW9uKGEsYil7dGhpcy5fb3B0aW9ucy5zaG93TWVzc2FnZShxcS5GaW5lVXBsb2FkZXJCYXNpYy5wcm90b3R5cGUuX2l0ZW1FcnJvci5hcHBseSh0aGlzLAphcmd1bWVudHMpKX0sX2JhdGNoRXJyb3I6ZnVuY3Rpb24oYSl7cXEuRmluZVVwbG9hZGVyQmFzaWMucHJvdG90eXBlLl9iYXRjaEVycm9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLl9vcHRpb25zLnNob3dNZXNzYWdlKGEpfSxfc2V0dXBQYXN0ZVByb21wdDpmdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy5fb3B0aW9ucy5jYWxsYmFja3Mub25QYXN0ZVJlY2VpdmVkPWZ1bmN0aW9uKCl7cmV0dXJuIGEuX29wdGlvbnMuc2hvd1Byb21wdChhLl9vcHRpb25zLnBhc3RlLm5hbWVQcm9tcHRNZXNzYWdlLGEuX29wdGlvbnMucGFzdGUuZGVmYXVsdE5hbWUpfX19KTsKcXEuQWpheFJlcXVlc3Rvcj1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBiPXFxLmluZGV4T2YoaSxhKSxkPWsubWF4Q29ubmVjdGlvbnM7ZGVsZXRlIG1bYV07aS5zcGxpY2UoYiwxKTtpLmxlbmd0aD49ZCYmYjxkJiYoYT1pW2QtMV0sYyhhKSl9ZnVuY3Rpb24gYyhhKXt2YXIgYj1uZXcgWE1MSHR0cFJlcXVlc3QsYz1mKCksaT17fSxyO2sub25TZW5kKGEpO2sucGFyYW1zU3RvcmUuZ2V0UGFyYW1zJiYoaT1rLnBhcmFtc1N0b3JlLmdldFBhcmFtcyhhKSk7cj1pO3ZhciBzPWsuZW5kcG9pbnRTdG9yZS5nZXRFbmRwb2ludChhKSx6PW1bYV0uYWRkVG9QYXRoO3ZvaWQgMCE9PXomJihzKz0iLyIreik7cj1uJiZyP3FxLm9iajJ1cmwocixzKTpzO21bYV0ueGhyPWI7Yi5vbnJlYWR5c3RhdGVjaGFuZ2U9ZChhKTtiLm9wZW4oYyxyLCEwKTtrLmNvcnMuZXhwZWN0ZWQmJmsuY29ycy5zZW5kQ3JlZGVudGlhbHMmJihiLndpdGhDcmVkZW50aWFscz0hMCk7ZShhKTtnKCJTZW5kaW5nICIrCmMrIiByZXF1ZXN0IGZvciAiK2EpOyFuJiZpP2Iuc2VuZChxcS5vYmoydXJsKGksIiIpKTpiLnNlbmQoKX1mdW5jdGlvbiBkKGEpe3ZhciBjPW1bYV0ueGhyO3JldHVybiBmdW5jdGlvbigpe2lmKDQ9PT1jLnJlYWR5U3RhdGUpe3ZhciBkPW1bYV0ueGhyLGU9ZigpLGk9ITE7YihhKTswPD1xcS5pbmRleE9mKGsuc3VjY2Vzc2Z1bFJlc3BvbnNlQ29kZXMsZC5zdGF0dXMpfHwoaT0hMCxnKGUrIiByZXF1ZXN0IGZvciAiK2ErIiBoYXMgZmFpbGVkIC0gcmVzcG9uc2UgY29kZSAiK2Quc3RhdHVzLCJlcnJvciIpKTtrLm9uQ29tcGxldGUoYSxkLGkpfX19ZnVuY3Rpb24gZShhKXt2YXIgYj1tW2FdLnhocixhPWsuY3VzdG9tSGVhZGVycztiLnNldFJlcXVlc3RIZWFkZXIoIlgtUmVxdWVzdGVkLVdpdGgiLCJYTUxIdHRwUmVxdWVzdCIpO2Iuc2V0UmVxdWVzdEhlYWRlcigiQ2FjaGUtQ29udHJvbCIsIm5vLWNhY2hlIik7cXEuZWFjaChhLGZ1bmN0aW9uKGEsYyl7Yi5zZXRSZXF1ZXN0SGVhZGVyKGEsCmMpfSl9ZnVuY3Rpb24gZigpe3JldHVybiBrLmRlbW9Nb2RlPyJHRVQiOmsubWV0aG9kfXZhciBnLG4saT1bXSxtPVtdLGs9e21ldGhvZDoiUE9TVCIsbWF4Q29ubmVjdGlvbnM6MyxjdXN0b21IZWFkZXJzOnt9LGVuZHBvaW50U3RvcmU6e30scGFyYW1zU3RvcmU6e30sc3VjY2Vzc2Z1bFJlc3BvbnNlQ29kZXM6WzIwMF0sZGVtb01vZGU6ITEsY29yczp7ZXhwZWN0ZWQ6ITEsc2VuZENyZWRlbnRpYWxzOiExfSxsb2c6ZnVuY3Rpb24oKXt9LG9uU2VuZDpmdW5jdGlvbigpe30sb25Db21wbGV0ZTpmdW5jdGlvbigpe30sb25DYW5jZWw6ZnVuY3Rpb24oKXt9fTtxcS5leHRlbmQoayxhKTtnPWsubG9nO249IkdFVCI9PT1mKCl8fCJERUxFVEUiPT09ZigpO3JldHVybntzZW5kOmZ1bmN0aW9uKGEsYil7bVthXT17YWRkVG9QYXRoOmJ9O2kucHVzaChhKTw9ay5tYXhDb25uZWN0aW9ucyYmYyhhKX0sY2FuY2VsOmZ1bmN0aW9uKGEpe3ZhciBjPW1bYV0ueGhyLGQ9ZigpO2M/KGMub25yZWFkeXN0YXRlY2hhbmdlPQpudWxsLGMuYWJvcnQoKSxiKGEpLGcoIkNhbmNlbGxlZCAiK2QrIiBmb3IgIithKSxrLm9uQ2FuY2VsKGEpLGE9ITApOmE9ITE7cmV0dXJuIGF9fX07CnFxLkRlbGV0ZUZpbGVBamF4UmVxdWVzdG9yPWZ1bmN0aW9uKGEpe3ZhciBiLGM9e2VuZHBvaW50U3RvcmU6e30sbWF4Q29ubmVjdGlvbnM6MyxjdXN0b21IZWFkZXJzOnt9LHBhcmFtc1N0b3JlOnt9LGRlbW9Nb2RlOiExLGNvcnM6e2V4cGVjdGVkOiExLHNlbmRDcmVkZW50aWFsczohMX0sbG9nOmZ1bmN0aW9uKCl7fSxvbkRlbGV0ZTpmdW5jdGlvbigpe30sb25EZWxldGVDb21wbGV0ZTpmdW5jdGlvbigpe319O3FxLmV4dGVuZChjLGEpO2I9bmV3IHFxLkFqYXhSZXF1ZXN0b3Ioe21ldGhvZDoiREVMRVRFIixlbmRwb2ludFN0b3JlOmMuZW5kcG9pbnRTdG9yZSxwYXJhbXNTdG9yZTpjLnBhcmFtc1N0b3JlLG1heENvbm5lY3Rpb25zOmMubWF4Q29ubmVjdGlvbnMsY3VzdG9tSGVhZGVyczpjLmN1c3RvbUhlYWRlcnMsc3VjY2Vzc2Z1bFJlc3BvbnNlQ29kZXM6WzIwMCwyMDIsMjA0XSxkZW1vTW9kZTpjLmRlbW9Nb2RlLGxvZzpjLmxvZyxvblNlbmQ6Yy5vbkRlbGV0ZSxvbkNvbXBsZXRlOmMub25EZWxldGVDb21wbGV0ZX0pOwpyZXR1cm57c2VuZERlbGV0ZTpmdW5jdGlvbihhLGUpe2Iuc2VuZChhLGUpO2MubG9nKCJTdWJtaXR0ZWQgZGVsZXRlIGZpbGUgcmVxdWVzdCBmb3IgIithKX19fTtxcS5XaW5kb3dSZWNlaXZlTWVzc2FnZT1mdW5jdGlvbihhKXt2YXIgYj17fTtxcS5leHRlbmQoe2xvZzpmdW5jdGlvbigpe319LGEpO3JldHVybntyZWNlaXZlTWVzc2FnZTpmdW5jdGlvbihhLGQpe3ZhciBlPWZ1bmN0aW9uKGEpe2QoYS5kYXRhKX07d2luZG93LnBvc3RNZXNzYWdlP2JbYV09cXEod2luZG93KS5hdHRhY2goIm1lc3NhZ2UiLGUpOmxvZygiaWZyYW1lIG1lc3NhZ2UgcGFzc2luZyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlciEiLCJlcnJvciIpfSxzdG9wUmVjZWl2aW5nTWVzc2FnZXM6ZnVuY3Rpb24oYSl7d2luZG93LnBvc3RNZXNzYWdlJiYoYT1iW2FdKSYmYSgpfX19OwpxcS5VcGxvYWRIYW5kbGVyPWZ1bmN0aW9uKGEpe3ZhciBiPVtdLGMsZCxlLGY7Yz17ZGVidWc6ITEsZm9yY2VNdWx0aXBhcnQ6ITAscGFyYW1zSW5Cb2R5OiExLHBhcmFtc1N0b3JlOnt9LGVuZHBvaW50U3RvcmU6e30sY29yczp7ZXhwZWN0ZWQ6ITEsc2VuZENyZWRlbnRpYWxzOiExfSxtYXhDb25uZWN0aW9uczozLHV1aWRQYXJhbU5hbWU6InFxdXVpZCIsdG90YWxGaWxlU2l6ZVBhcmFtTmFtZToicXF0b3RhbGZpbGVzaXplIixjaHVua2luZzp7ZW5hYmxlZDohMSxwYXJ0U2l6ZToyRTYscGFyYW1OYW1lczp7cGFydEluZGV4OiJxcXBhcnRpbmRleCIscGFydEJ5dGVPZmZzZXQ6InFxcGFydGJ5dGVvZmZzZXQiLGNodW5rU2l6ZToicXFjaHVua3NpemUiLHRvdGFsUGFydHM6InFxdG90YWxwYXJ0cyIsZmlsZW5hbWU6InFxZmlsZW5hbWUifX0scmVzdW1lOntlbmFibGVkOiExLGlkOm51bGwsY29va2llc0V4cGlyZUluOjcscGFyYW1OYW1lczp7cmVzdW1pbmc6InFxcmVzdW1lIn19LGJsb2JzOntwYXJhbU5hbWVzOntuYW1lOiJxcWJsb2JuYW1lIn19LApsb2c6ZnVuY3Rpb24oKXt9LG9uUHJvZ3Jlc3M6ZnVuY3Rpb24oKXt9LG9uQ29tcGxldGU6ZnVuY3Rpb24oKXt9LG9uQ2FuY2VsOmZ1bmN0aW9uKCl7fSxvblVwbG9hZDpmdW5jdGlvbigpe30sb25VcGxvYWRDaHVuazpmdW5jdGlvbigpe30sb25BdXRvUmV0cnk6ZnVuY3Rpb24oKXt9LG9uUmVzdW1lOmZ1bmN0aW9uKCl7fX07cXEuZXh0ZW5kKGMsYSk7ZD1jLmxvZztlPWZ1bmN0aW9uKGEpe3ZhciBhPXFxLmluZGV4T2YoYixhKSxkPWMubWF4Q29ubmVjdGlvbnM7MDw9YSYmKGIuc3BsaWNlKGEsMSksYi5sZW5ndGg+PWQmJmE8ZCYmKGE9YltkLTFdLGYudXBsb2FkKGEpKSl9O2Y9cXEuaXNYaHJVcGxvYWRTdXBwb3J0ZWQoKT9uZXcgcXEuVXBsb2FkSGFuZGxlclhocihjLGUsZCk6bmV3IHFxLlVwbG9hZEhhbmRsZXJGb3JtKGMsZSxkKTtyZXR1cm57YWRkOmZ1bmN0aW9uKGEpe3JldHVybiBmLmFkZChhKX0sdXBsb2FkOmZ1bmN0aW9uKGEpe2lmKGIucHVzaChhKTw9Yy5tYXhDb25uZWN0aW9ucylyZXR1cm4gZi51cGxvYWQoYSl9LApyZXRyeTpmdW5jdGlvbihhKXtyZXR1cm4gMDw9cXEuaW5kZXhPZihiLGEpP2YudXBsb2FkKGEsITApOnRoaXMudXBsb2FkKGEpfSxjYW5jZWw6ZnVuY3Rpb24oYSl7ZCgiQ2FuY2VsbGluZyAiK2EpO2MucGFyYW1zU3RvcmUucmVtb3ZlKGEpO2YuY2FuY2VsKGEpO2UoYSl9LGNhbmNlbEFsbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMsYz1bXTtxcS5leHRlbmQoYyxiKTtxcS5lYWNoKGMsZnVuY3Rpb24oYixjKXthLmNhbmNlbChjKX0pO2I9W119LGdldE5hbWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGYuZ2V0TmFtZShhKX0sZ2V0U2l6ZTpmdW5jdGlvbihhKXtpZihmLmdldFNpemUpcmV0dXJuIGYuZ2V0U2l6ZShhKX0sZ2V0RmlsZTpmdW5jdGlvbihhKXtpZihmLmdldEZpbGUpcmV0dXJuIGYuZ2V0RmlsZShhKX0sZ2V0UXVldWU6ZnVuY3Rpb24oKXtyZXR1cm4gYn0scmVzZXQ6ZnVuY3Rpb24oKXtkKCJSZXNldHRpbmcgdXBsb2FkIGhhbmRsZXIiKTtiPVtdO2YucmVzZXQoKX0sZ2V0VXVpZDpmdW5jdGlvbihhKXtyZXR1cm4gZi5nZXRVdWlkKGEpfSwKaXNWYWxpZDpmdW5jdGlvbihhKXtyZXR1cm4gZi5pc1ZhbGlkKGEpfSxnZXRSZXN1bWFibGVGaWxlc0RhdGE6ZnVuY3Rpb24oKXtyZXR1cm4gZi5nZXRSZXN1bWFibGVGaWxlc0RhdGE/Zi5nZXRSZXN1bWFibGVGaWxlc0RhdGEoKTpbXX19fTsKcXEuVXBsb2FkSGFuZGxlckZvcm09ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7dm9pZCAwIT09bFthXSYmKGxbYV0oKSxkZWxldGUgbFthXSl9ZnVuY3Rpb24gZShhLGIpe3ZhciBjPWEuaWQ7cltrW2NdXT1iO2xbY109cXEoYSkuYXR0YWNoKCJsb2FkIixmdW5jdGlvbigpe21bY10mJihvKCJSZWNlaXZlZCBpZnJhbWUgbG9hZCBldmVudCBmb3IgQ09SUyB1cGxvYWQgcmVxdWVzdCAoZmlsZSBpZCAiK2MrIikiKSx0W2NdPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iTm8gdmFsaWQgbWVzc2FnZSByZWNlaXZlZCBmcm9tIGxvYWRlZCBpZnJhbWUgZm9yIGZpbGUgaWQgIitjO28oYSwiZXJyb3IiKTtiKHtlcnJvcjphfSl9LDFFMykpfSk7eC5yZWNlaXZlTWVzc2FnZShjLGZ1bmN0aW9uKGEpe28oIlJlY2VpdmVkIHRoZSBmb2xsb3dpbmcgd2luZG93IG1lc3NhZ2U6ICciK2ErIiciKTt2YXIgYj1xcS5wYXJzZUpzb24oYSksZT1iLnV1aWQ7ZSYmcltlXT8oY2xlYXJUaW1lb3V0KHRbY10pLApkZWxldGUgdFtjXSxkKGMpLGE9cltlXSxkZWxldGUgcltlXSx4LnN0b3BSZWNlaXZpbmdNZXNzYWdlcyhjKSxhKGIpKTplfHxvKCInIithKyInIGRvZXMgbm90IGNvbnRhaW4gYSBVVUlEIC0gaWdub3JpbmcuIil9KX1mdW5jdGlvbiBmKGEsYil7aS5jb3JzLmV4cGVjdGVkP2UoYSxiKTpsW2EuaWRdPXFxKGEpLmF0dGFjaCgibG9hZCIsZnVuY3Rpb24oKXtvKCJSZWNlaXZlZCByZXNwb25zZSBmb3IgIithLmlkKTtpZihhLnBhcmVudE5vZGUpe3RyeXtpZihhLmNvbnRlbnREb2N1bWVudCYmYS5jb250ZW50RG9jdW1lbnQuYm9keSYmImZhbHNlIj09YS5jb250ZW50RG9jdW1lbnQuYm9keS5pbm5lckhUTUwpcmV0dXJufWNhdGNoKGMpe28oIkVycm9yIHdoZW4gYXR0ZW1wdGluZyB0byBhY2Nlc3MgaWZyYW1lIGR1cmluZyBoYW5kbGluZyBvZiB1cGxvYWQgcmVzcG9uc2UgKCIrYysiKSIsImVycm9yIil9YigpfX0pfWZ1bmN0aW9uIGcoYSl7dmFyIGI9cXEudG9FbGVtZW50KCc8aWZyYW1lIHNyYz0iamF2YXNjcmlwdDpmYWxzZTsiIG5hbWU9IicrCmErJyIgLz4nKTtiLnNldEF0dHJpYnV0ZSgiaWQiLGEpO2Iuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTtyZXR1cm4gYn1mdW5jdGlvbiBuKGEsYil7dmFyIGM9aS5wYXJhbXNTdG9yZS5nZXRQYXJhbXMoYSksZD1xcS50b0VsZW1lbnQoJzxmb3JtIG1ldGhvZD0iJysoaS5kZW1vTW9kZT8iR0VUIjoiUE9TVCIpKyciIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPjwvZm9ybT4nKSxlPWkuZW5kcG9pbnRTdG9yZS5nZXRFbmRwb2ludChhKSxmPWU7Y1tpLnV1aWRQYXJhbU5hbWVdPWtbYV07aS5wYXJhbXNJbkJvZHk/cXEub2JqMklucHV0cyhjLGQpOmY9cXEub2JqMnVybChjLGUpO2Quc2V0QXR0cmlidXRlKCJhY3Rpb24iLGYpO2Quc2V0QXR0cmlidXRlKCJ0YXJnZXQiLGIubmFtZSk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGQpO3JldHVybiBkfXZhciBpPWEsbT1bXSxrPVtdLGw9e30sdD0Ke30sbz1jLHg9bmV3IHFxLldpbmRvd1JlY2VpdmVNZXNzYWdlKHtsb2c6b30pLHI9e30scztyZXR1cm4gcz17YWRkOmZ1bmN0aW9uKGEpe2Euc2V0QXR0cmlidXRlKCJuYW1lIixpLmlucHV0TmFtZSk7dmFyIGI9bS5wdXNoKGEpLTE7a1tiXT1xcS5nZXRVbmlxdWVJZCgpO2EucGFyZW50Tm9kZSYmcXEoYSkucmVtb3ZlKCk7cmV0dXJuIGJ9LGdldE5hbWU6ZnVuY3Rpb24oYSl7aWYocy5pc1ZhbGlkKGEpKXJldHVybiBtW2FdLnZhbHVlLnJlcGxhY2UoLy4qKFwvfFxcKS8sIiIpO28oYSsiIGlzIG5vdCBhIHZhbGlkIGl0ZW0gSUQuIiwiZXJyb3IiKX0saXNWYWxpZDpmdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwIT09bVthXX0scmVzZXQ6ZnVuY3Rpb24oKXttPVtdO2s9W107bD17fX0sZ2V0VXVpZDpmdW5jdGlvbihhKXtyZXR1cm4ga1thXX0sY2FuY2VsOmZ1bmN0aW9uKGEpe2kub25DYW5jZWwoYSx0aGlzLmdldE5hbWUoYSkpO2RlbGV0ZSBtW2FdO2RlbGV0ZSBrW2FdO2RlbGV0ZSBsW2FdOwppLmNvcnMuZXhwZWN0ZWQmJihjbGVhclRpbWVvdXQodFthXSksZGVsZXRlIHRbYV0seC5zdG9wUmVjZWl2aW5nTWVzc2FnZXMoYSkpO2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSkpYS5zZXRBdHRyaWJ1dGUoInNyYyIsImphdmEiK1N0cmluZy5mcm9tQ2hhckNvZGUoMTE1KSsiY3JpcHQ6ZmFsc2U7IikscXEoYSkucmVtb3ZlKCl9LHVwbG9hZDpmdW5jdGlvbihhKXt2YXIgYz1tW2FdLGU9cy5nZXROYW1lKGEpLGw9ZyhhKSxoO2lmKCFjKXRocm93IEVycm9yKCJmaWxlIHdpdGggcGFzc2VkIGlkIHdhcyBub3QgYWRkZWQsIG9yIGFscmVhZHkgdXBsb2FkZWQgb3IgY2FuY2VsbGVkIik7aS5vblVwbG9hZChhLHRoaXMuZ2V0TmFtZShhKSk7aD1uKGEsbCk7aC5hcHBlbmRDaGlsZChjKTtmKGwsZnVuY3Rpb24oYyl7bygiaWZyYW1lIGxvYWRlZCIpO2lmKCFjKXt2YXIgZjt0cnl7dmFyIGg9bC5jb250ZW50RG9jdW1lbnR8fGwuY29udGVudFdpbmRvdy5kb2N1bWVudCxnPWguYm9keS5pbm5lckhUTUw7Cm8oImNvbnZlcnRpbmcgaWZyYW1lJ3MgaW5uZXJIVE1MIHRvIEpTT04iKTtvKCJpbm5lckhUTUwgPSAiK2cpO2cmJmcubWF0Y2goL148cHJlL2kpJiYoZz1oLmJvZHkuZmlyc3RDaGlsZC5maXJzdENoaWxkLm5vZGVWYWx1ZSk7Zj1xcS5wYXJzZUpzb24oZyl9Y2F0Y2goail7bygiRXJyb3Igd2hlbiBhdHRlbXB0aW5nIHRvIHBhcnNlIGZvcm0gdXBsb2FkIHJlc3BvbnNlICgiK2orIikiLCJlcnJvciIpLGY9e3N1Y2Nlc3M6ITF9fWM9Zn1kKGEpO2kuY29ycy5leHBlY3RlZHx8cXEobCkucmVtb3ZlKCk7aWYoYy5zdWNjZXNzfHwhaS5vbkF1dG9SZXRyeShhLGUsYykpaS5vbkNvbXBsZXRlKGEsZSxjKSxiKGEpfSk7bygiU2VuZGluZyB1cGxvYWQgcmVxdWVzdCBmb3IgIithKTtoLnN1Ym1pdCgpO3FxKGgpLnJlbW92ZSgpO3JldHVybiBhfX19OwpxcS5VcGxvYWRIYW5kbGVyWGhyPWZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEsYixjKXt2YXIgZD1wLmdldFNpemUoYSksYT1wLmdldE5hbWUoYSk7YltqLmNodW5raW5nLnBhcmFtTmFtZXMucGFydEluZGV4XT1jLnBhcnQ7YltqLmNodW5raW5nLnBhcmFtTmFtZXMucGFydEJ5dGVPZmZzZXRdPWMuc3RhcnQ7YltqLmNodW5raW5nLnBhcmFtTmFtZXMuY2h1bmtTaXplXT1jLnNpemU7YltqLmNodW5raW5nLnBhcmFtTmFtZXMudG90YWxQYXJ0c109Yy5jb3VudDtiW2oudG90YWxGaWxlU2l6ZVBhcmFtTmFtZV09ZDt3JiYoYltqLmNodW5raW5nLnBhcmFtTmFtZXMuZmlsZW5hbWVdPWEpfWZ1bmN0aW9uIGUoYSxiKXt2YXIgYz1qLmNodW5raW5nLnBhcnRTaXplLGQ9cC5nZXRTaXplKGEpLGU9aFthXS5maWxlfHxoW2FdLmJsb2JEYXRhLmJsb2IsZz1jKmIsYz1nK2M+PWQ/ZDpnK2MsZD1mKGEpLGw7ZS5zbGljZT9sPWUuc2xpY2UoZyxjKTplLm1velNsaWNlP2w9ZS5tb3pTbGljZShnLApjKTplLndlYmtpdFNsaWNlJiYobD1lLndlYmtpdFNsaWNlKGcsYykpO3JldHVybntwYXJ0OmIsc3RhcnQ6ZyxlbmQ6Yyxjb3VudDpkLGJsb2I6bCxzaXplOmMtZ319ZnVuY3Rpb24gZihhKXthPXAuZ2V0U2l6ZShhKTtyZXR1cm4gTWF0aC5jZWlsKGEvai5jaHVua2luZy5wYXJ0U2l6ZSl9ZnVuY3Rpb24gZyhhKXt2YXIgYj1uZXcgWE1MSHR0cFJlcXVlc3Q7cmV0dXJuIGhbYV0ueGhyPWJ9ZnVuY3Rpb24gbihhLGIsYyxkKXt2YXIgZT1uZXcgRm9ybURhdGEsZj1qLmRlbW9Nb2RlPyJHRVQiOiJQT1NUIixnPWouZW5kcG9pbnRTdG9yZS5nZXRFbmRwb2ludChkKSxsPWcsaT1wLmdldE5hbWUoZCksbz1wLmdldFNpemUoZCksaz1oW2RdLmJsb2JEYXRhO2Fbai51dWlkUGFyYW1OYW1lXT1oW2RdLnV1aWQ7dyYmKGFbai50b3RhbEZpbGVTaXplUGFyYW1OYW1lXT1vLGsmJihhW2ouYmxvYnMucGFyYW1OYW1lcy5uYW1lXT1rLm5hbWUpKTtqLnBhcmFtc0luQm9keXx8KHd8fChhW2ouaW5wdXROYW1lXT0KaSksbD1xcS5vYmoydXJsKGEsZykpO2Iub3BlbihmLGwsITApO2ouY29ycy5leHBlY3RlZCYmai5jb3JzLnNlbmRDcmVkZW50aWFscyYmKGIud2l0aENyZWRlbnRpYWxzPSEwKTtyZXR1cm4gdz8oai5wYXJhbXNJbkJvZHkmJnFxLm9iajJGb3JtRGF0YShhLGUpLGUuYXBwZW5kKGouaW5wdXROYW1lLGMpLGUpOmN9ZnVuY3Rpb24gaShhLGIpe3ZhciBjPWouY3VzdG9tSGVhZGVycyxkPWhbYV0uZmlsZXx8aFthXS5ibG9iRGF0YS5ibG9iO2Iuc2V0UmVxdWVzdEhlYWRlcigiWC1SZXF1ZXN0ZWQtV2l0aCIsIlhNTEh0dHBSZXF1ZXN0Iik7Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDYWNoZS1Db250cm9sIiwibm8tY2FjaGUiKTt3fHwoYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKSxiLnNldFJlcXVlc3RIZWFkZXIoIlgtTWltZS1UeXBlIixkLnR5cGUpKTtxcS5lYWNoKGMsZnVuY3Rpb24oYSxjKXtiLnNldFJlcXVlc3RIZWFkZXIoYSwKYyl9KX1mdW5jdGlvbiBtKGEsYixjKXt2YXIgZD1wLmdldE5hbWUoYSksZT1wLmdldFNpemUoYSk7aFthXS5hdHRlbXB0aW5nUmVzdW1lPSExO2oub25Qcm9ncmVzcyhhLGQsZSxlKTtqLm9uQ29tcGxldGUoYSxkLGIsYyk7ZGVsZXRlIGhbYV0ueGhyO0IoYSl9ZnVuY3Rpb24gayhhKXt2YXIgYj1oW2FdLnJlbWFpbmluZ0NodW5rSWR4c1swXSxjPWUoYSxiKSxmPWcoYSksbD1wLmdldFNpemUoYSksaz1wLmdldE5hbWUoYSksbTt2b2lkIDA9PT1oW2FdLmxvYWRlZCYmKGhbYV0ubG9hZGVkPTApO3YmJmhbYV0uZmlsZSYmeChhLGMpO2Yub25yZWFkeXN0YXRlY2hhbmdlPW8oYSxmKTtmLnVwbG9hZC5vbnByb2dyZXNzPWZ1bmN0aW9uKGMpe2lmKGMubGVuZ3RoQ29tcHV0YWJsZSl7dmFyIGQ9Yy5sb2FkZWQraFthXS5sb2FkZWQsYz1jLnRvdGFsLGY9ZShhLGIpLGM9Yy1mLnNpemUsZz1wLmdldFNpemUoYSksZj1mLmNvdW50LGw9Yy1oW2FdLmluaXRpYWxSZXF1ZXN0T3ZlcmhlYWQ7aFthXS5sYXN0UmVxdWVzdE92ZXJoZWFkPQpjO2lmKGI9PT0wKXtoW2FdLmxhc3RDaHVua0lkeFByb2dyZXNzPTA7aFthXS5pbml0aWFsUmVxdWVzdE92ZXJoZWFkPWM7aFthXS5lc3RUb3RhbFJlcXVlc3RzU2l6ZT1nK2YqY31lbHNlIGlmKGhbYV0ubGFzdENodW5rSWR4UHJvZ3Jlc3MhPT1iKXtoW2FdLmxhc3RDaHVua0lkeFByb2dyZXNzPWI7aFthXS5lc3RUb3RhbFJlcXVlc3RzU2l6ZT1oW2FdLmVzdFRvdGFsUmVxdWVzdHNTaXplK2x9ai5vblByb2dyZXNzKGEsayxkLGhbYV0uZXN0VG90YWxSZXF1ZXN0c1NpemUpfX07ai5vblVwbG9hZENodW5rKGEsayx0KGMpKTttPWoucGFyYW1zU3RvcmUuZ2V0UGFyYW1zKGEpO2QoYSxtLGMpO2hbYV0uYXR0ZW1wdGluZ1Jlc3VtZSYmKG1bai5yZXN1bWUucGFyYW1OYW1lcy5yZXN1bWluZ109ITApO209bihtLGYsYy5ibG9iLGEpO2koYSxmKTt1KCJTZW5kaW5nIGNodW5rZWQgdXBsb2FkIHJlcXVlc3QgZm9yIGl0ZW0gIithKyI6IGJ5dGVzICIrKGMuc3RhcnQrMSkrIi0iK2MuZW5kKyIgb2YgIisKbCk7Zi5zZW5kKG0pfWZ1bmN0aW9uIGwoYSl7dSgiU2VydmVyIGhhcyBvcmRlcmVkIGNodW5raW5nIGVmZm9ydCB0byBiZSByZXN0YXJ0ZWQgb24gbmV4dCBhdHRlbXB0IGZvciBpdGVtIElEICIrYSwiZXJyb3IiKTt2JiYocihhKSxoW2FdLmF0dGVtcHRpbmdSZXN1bWU9ITEpO2hbYV0ucmVtYWluaW5nQ2h1bmtJZHhzPVtdO2RlbGV0ZSBoW2FdLmxvYWRlZDtkZWxldGUgaFthXS5lc3RUb3RhbFJlcXVlc3RzU2l6ZTtkZWxldGUgaFthXS5pbml0aWFsUmVxdWVzdE92ZXJoZWFkfWZ1bmN0aW9uIHQoYSl7cmV0dXJue3BhcnRJbmRleDphLnBhcnQsc3RhcnRCeXRlOmEuc3RhcnQrMSxlbmRCeXRlOmEuZW5kLHRvdGFsUGFydHM6YS5jb3VudH19ZnVuY3Rpb24gbyhhLGIpe3JldHVybiBmdW5jdGlvbigpe2lmKDQ9PT1iLnJlYWR5U3RhdGUpe3ZhciBjO2lmKGhbYV0pe3UoInhociAtIHNlcnZlciByZXNwb25zZSByZWNlaXZlZCBmb3IgIithKTt1KCJyZXNwb25zZVRleHQgPSAiK2IucmVzcG9uc2VUZXh0KTsKdHJ5e2M9cXEucGFyc2VKc29uKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXt1KCJFcnJvciB3aGVuIGF0dGVtcHRpbmcgdG8gcGFyc2UgeGhyIHJlc3BvbnNlIHRleHQgKCIrZCsiKSIsImVycm9yIiksYz17fX1pZigyMDAhPT1iLnN0YXR1c3x8IWMuc3VjY2Vzc3x8Yy5yZXNldClpZihjLnJlc2V0JiZsKGEpLGhbYV0uYXR0ZW1wdGluZ1Jlc3VtZSYmYy5yZXNldCloW2FdLmF0dGVtcHRpbmdSZXN1bWU9ITEsdSgiU2VydmVyIGhhcyBkZWNsYXJlZCB0aGF0IGl0IGNhbm5vdCBoYW5kbGUgcmVzdW1lIGZvciBpdGVtIElEICIrYSsiIC0gc3RhcnRpbmcgZnJvbSB0aGUgZmlyc3QgY2h1bmsiLCJlcnJvciIpLGwoYSkscC51cGxvYWQoYSwhMCk7ZWxzZXt2YXIgZj1wLmdldE5hbWUoYSk7ai5vbkF1dG9SZXRyeShhLGYsYyxiKXx8bShhLGMsYil9ZWxzZSBpZihBKXt2YXIgZj1oW2FdLnJlbWFpbmluZ0NodW5rSWR4cy5zaGlmdCgpLGc9ZShhLGYpO2hbYV0uYXR0ZW1wdGluZ1Jlc3VtZT0hMTsKdmFyIGY9aFthXSxpPWYubG9hZGVkLGc9Zy5zaXplLG87bz13P2hbYV0ubGFzdFJlcXVlc3RPdmVyaGVhZDowO2YubG9hZGVkPWkrKGcrbyk7MDxoW2FdLnJlbWFpbmluZ0NodW5rSWR4cy5sZW5ndGg/ayhhKToodiYmcihhKSxtKGEsYyxiKSl9ZWxzZSBtKGEsYyxiKX19fX1mdW5jdGlvbiB4KGEsYil7dmFyIGM9cC5nZXRVdWlkKGEpLGQ9aFthXS5sb2FkZWQsZT1oW2FdLmluaXRpYWxSZXF1ZXN0T3ZlcmhlYWQsZj1oW2FdLmVzdFRvdGFsUmVxdWVzdHNTaXplLGc9cyhhKTtxcS5zZXRDb29raWUoZyxjK3ErYi5wYXJ0K3ErZCtxK2UrcStmLGoucmVzdW1lLmNvb2tpZXNFeHBpcmVJbil9ZnVuY3Rpb24gcihhKXtoW2FdLmZpbGUmJihhPXMoYSkscXEuZGVsZXRlQ29va2llKGEpKX1mdW5jdGlvbiBzKGEpe3ZhciBiPXAuZ2V0TmFtZShhKSxhPXAuZ2V0U2l6ZShhKSxjPWouY2h1bmtpbmcucGFydFNpemUsYj0icXFmaWxlY2h1bmsiK3ErZW5jb2RlVVJJQ29tcG9uZW50KGIpK3ErYStxKwpjO3ZvaWQgMCE9PXkmJihiKz1xK3kpO3JldHVybiBifWZ1bmN0aW9uIHooYSl7dmFyIGI9aFthXS5maWxlfHxoW2FdLmJsb2JEYXRhLmJsb2IsYz1wLmdldE5hbWUoYSksZCxlO2hbYV0ubG9hZGVkPTA7ZD1nKGEpO2QudXBsb2FkLm9ucHJvZ3Jlc3M9ZnVuY3Rpb24oYil7Yi5sZW5ndGhDb21wdXRhYmxlJiYoaFthXS5sb2FkZWQ9Yi5sb2FkZWQsai5vblByb2dyZXNzKGEsYyxiLmxvYWRlZCxiLnRvdGFsKSl9O2Qub25yZWFkeXN0YXRlY2hhbmdlPW8oYSxkKTtlPWoucGFyYW1zU3RvcmUuZ2V0UGFyYW1zKGEpO2I9bihlLGQsYixhKTtpKGEsZCk7dSgiU2VuZGluZyB1cGxvYWQgcmVxdWVzdCBmb3IgIithKTtkLnNlbmQoYil9dmFyIGo9YSxCPWIsdT1jLGg9W10scT0ifCIsQT1qLmNodW5raW5nLmVuYWJsZWQmJnFxLmlzRmlsZUNodW5raW5nU3VwcG9ydGVkKCksdj1qLnJlc3VtZS5lbmFibGVkJiZBJiZxcS5hcmVDb29raWVzRW5hYmxlZCgpLHk7eT1udWxsIT09ai5yZXN1bWUuaWQmJgp2b2lkIDAhPT1qLnJlc3VtZS5pZCYmIXFxLmlzRnVuY3Rpb24oai5yZXN1bWUuaWQpJiYhcXEuaXNPYmplY3Qoai5yZXN1bWUuaWQpP2oucmVzdW1lLmlkOnZvaWQgMDt2YXIgdz1qLmZvcmNlTXVsdGlwYXJ0fHxqLnBhcmFtc0luQm9keSxwO3JldHVybiBwPXthZGQ6ZnVuY3Rpb24oYSl7aWYoYSBpbnN0YW5jZW9mIEZpbGUpYT1oLnB1c2goe2ZpbGU6YX0pLTE7ZWxzZSBpZihhLmJsb2IgaW5zdGFuY2VvZiBCbG9iKWE9aC5wdXNoKHtibG9iRGF0YTphfSktMTtlbHNlIHRocm93IEVycm9yKCJQYXNzZWQgb2JqIGluIG5vdCBhIEZpbGUgb3IgQmxvYkRhdGEgKGluIHFxLlVwbG9hZEhhbmRsZXJYaHIpIik7aFthXS51dWlkPXFxLmdldFVuaXF1ZUlkKCk7cmV0dXJuIGF9LGdldE5hbWU6ZnVuY3Rpb24oYSl7aWYocC5pc1ZhbGlkKGEpKXt2YXIgYj1oW2FdLmZpbGUsYT1oW2FdLmJsb2JEYXRhO3JldHVybiBiP251bGwhPT1iLmZpbGVOYW1lJiZ2b2lkIDAhPT1iLmZpbGVOYW1lP2IuZmlsZU5hbWU6CmIubmFtZTphLm5hbWV9dShhKyIgaXMgbm90IGEgdmFsaWQgaXRlbSBJRC4iLCJlcnJvciIpfSxnZXRTaXplOmZ1bmN0aW9uKGEpe2E9aFthXS5maWxlfHxoW2FdLmJsb2JEYXRhLmJsb2I7cmV0dXJuIHFxLmlzRmlsZU9ySW5wdXQoYSk/bnVsbCE9YS5maWxlU2l6ZT9hLmZpbGVTaXplOmEuc2l6ZTphLnNpemV9LGdldEZpbGU6ZnVuY3Rpb24oYSl7aWYoaFthXSlyZXR1cm4gaFthXS5maWxlfHxoW2FdLmJsb2JEYXRhLmJsb2J9LGdldExvYWRlZDpmdW5jdGlvbihhKXtyZXR1cm4gaFthXS5sb2FkZWR8fDB9LGlzVmFsaWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHZvaWQgMCE9PWhbYV19LHJlc2V0OmZ1bmN0aW9uKCl7aD1bXX0sZ2V0VXVpZDpmdW5jdGlvbihhKXtyZXR1cm4gaFthXS51dWlkfSx1cGxvYWQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmdldE5hbWUoYSk7ai5vblVwbG9hZChhLGMpO2lmKEEpe3ZhciBkPXAuZ2V0TmFtZShhKSxjPTAsZyxsO2lmKCFoW2FdLnJlbWFpbmluZ0NodW5rSWR4c3x8CjA9PT1oW2FdLnJlbWFpbmluZ0NodW5rSWR4cy5sZW5ndGgpe2hbYV0ucmVtYWluaW5nQ2h1bmtJZHhzPVtdO2lmKHYmJiFiJiZoW2FdLmZpbGUpe2E6e2c9cXEuZ2V0Q29va2llKHMoYSkpO2w9cC5nZXROYW1lKGEpO3ZhciBpLG8sbTtpZihnKXtnPWcuc3BsaXQocSk7aWYoNT09PWcubGVuZ3RoKXtsPWdbMF07aT1wYXJzZUludChnWzFdLDEwKTtvPXBhcnNlSW50KGdbMl0sMTApO209cGFyc2VJbnQoZ1szXSwxMCk7Zz1wYXJzZUludChnWzRdLDEwKTtnPXt1dWlkOmwscGFydDppLGxhc3RCeXRlU2VudDpvLGluaXRpYWxSZXF1ZXN0T3ZlcmhlYWQ6bSxlc3RUb3RhbFJlcXVlc3RzU2l6ZTpnfTticmVhayBhfXUoIklnbm9yaW5nIHByZXZpb3VzbHkgc3RvcmVkIHJlc3VtZS9jaHVuayBjb29raWUgZm9yICIrbCsiIC0gb2xkIGNvb2tpZSBmb3JtYXQiLCJ3YXJuIil9Zz12b2lkIDB9ZyYmKGw9ZShhLGcucGFydCksITEhPT1qLm9uUmVzdW1lKGEsZCx0KGwpKSYmKGM9Zy5wYXJ0LGhbYV0udXVpZD0KZy51dWlkLGhbYV0ubG9hZGVkPWcubGFzdEJ5dGVTZW50LGhbYV0uZXN0VG90YWxSZXF1ZXN0c1NpemU9Zy5lc3RUb3RhbFJlcXVlc3RzU2l6ZSxoW2FdLmluaXRpYWxSZXF1ZXN0T3ZlcmhlYWQ9Zy5pbml0aWFsUmVxdWVzdE92ZXJoZWFkLGhbYV0uYXR0ZW1wdGluZ1Jlc3VtZT0hMCx1KCJSZXN1bWluZyAiK2QrIiBhdCBwYXJ0aXRpb24gaW5kZXggIitjKSkpfWZvcihkPWYoYSktMTtkPj1jO2QtPTEpaFthXS5yZW1haW5pbmdDaHVua0lkeHMudW5zaGlmdChkKX1rKGEpfWVsc2UgeihhKX0sY2FuY2VsOmZ1bmN0aW9uKGEpe3ZhciBiPWhbYV0ueGhyO2oub25DYW5jZWwoYSx0aGlzLmdldE5hbWUoYSkpO2ImJihiLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLGIuYWJvcnQoKSk7diYmcihhKTtkZWxldGUgaFthXX0sZ2V0UmVzdW1hYmxlRmlsZXNEYXRhOmZ1bmN0aW9uKCl7dmFyIGE9W10sYj1bXTtyZXR1cm4gQSYmdj8oYT12b2lkIDA9PT15P3FxLmdldENvb2tpZU5hbWVzKFJlZ0V4cCgiXnFxZmlsZWNodW5rXFwiKwpxKyIuK1xcIitxKyJcXGQrXFwiK3Erai5jaHVua2luZy5wYXJ0U2l6ZSsiPSIpKTpxcS5nZXRDb29raWVOYW1lcyhSZWdFeHAoIl5xcWZpbGVjaHVua1xcIitxKyIuK1xcIitxKyJcXGQrXFwiK3Erai5jaHVua2luZy5wYXJ0U2l6ZSsiXFwiK3EreSsiPSIpKSxxcS5lYWNoKGEsZnVuY3Rpb24oYSxjKXt2YXIgZD1jLnNwbGl0KHEpLGU9cXEuZ2V0Q29va2llKGMpLnNwbGl0KHEpO2IucHVzaCh7bmFtZTpkZWNvZGVVUklDb21wb25lbnQoZFsxXSksc2l6ZTpkWzJdLHV1aWQ6ZVswXSxwYXJ0SWR4OmVbMV19KX0pLGIpOltdfX19OwooZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLG4saSxtLGs7Zz1bInVwbG9hZGVyVHlwZSJdO2Q9ZnVuY3Rpb24oYSl7YSYmKGE9aShhKSxuKGEpLCJiYXNpYyI9PT1mKCJ1cGxvYWRlclR5cGUiKT9iKG5ldyBxcS5GaW5lVXBsb2FkZXJCYXNpYyhhKSk6YihuZXcgcXEuRmluZVVwbG9hZGVyKGEpKSk7cmV0dXJuIGN9O2U9ZnVuY3Rpb24oYSxiKXt2YXIgZD1jLmRhdGEoImZpbmV1cGxvYWRlciIpO2lmKGIpdm9pZCAwPT09ZCYmKGQ9e30pLGRbYV09YixjLmRhdGEoImZpbmV1cGxvYWRlciIsZCk7ZWxzZSByZXR1cm4gdm9pZCAwPT09ZD9udWxsOmRbYV19O2I9ZnVuY3Rpb24oYSl7cmV0dXJuIGUoInVwbG9hZGVyIixhKX07Zj1mdW5jdGlvbihhLGIpe3JldHVybiBlKGEsYil9O249ZnVuY3Rpb24oYil7dmFyIGQ9Yi5jYWxsYmFja3M9e30sZT1uZXcgcXEuRmluZVVwbG9hZGVyQmFzaWM7YS5lYWNoKGUuX29wdGlvbnMuY2FsbGJhY2tzLGZ1bmN0aW9uKGIsZil7dmFyIGcsbDtnPS9eb24oXHcrKS8uZXhlYyhiKVsxXTsKZz1nLnN1YnN0cmluZygwLDEpLnRvTG93ZXJDYXNlKCkrZy5zdWJzdHJpbmcoMSk7bD1jO2RbYl09ZnVuY3Rpb24oKXt2YXIgYz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLGM9bC50cmlnZ2VySGFuZGxlcihnLGMpO3JldHVybiB2b2lkIDA9PT1jJiYwPD1hLmluQXJyYXkoYixlLmdldFByb21pc3NvcnlDYWxsYmFja05hbWVzKCkpP2YoKTpjfX0pfTtpPWZ1bmN0aW9uKGIsZCl7dmFyIGUsaztlPXZvaWQgMD09PWQ/ImJhc2ljIiE9PWIudXBsb2FkZXJUeXBlP3tlbGVtZW50OmNbMF19Ont9OmQ7YS5lYWNoKGIsZnVuY3Rpb24oYixjKXswPD1hLmluQXJyYXkoYixnKT9mKGIsYyk6YyBpbnN0YW5jZW9mIGE/ZVtiXT1jWzBdOmEuaXNQbGFpbk9iamVjdChjKT8oZVtiXT17fSxpKGMsZVtiXSkpOmEuaXNBcnJheShjKT8oaz1bXSxhLmVhY2goYyxmdW5jdGlvbihiLGMpe2MgaW5zdGFuY2VvZiBhP2EubWVyZ2UoayxjKTprLnB1c2goYyl9KSxlW2JdPWspOmVbYl09CmN9KTtpZih2b2lkIDA9PT1kKXJldHVybiBlfTttPWZ1bmN0aW9uKGMpe3JldHVybiJzdHJpbmciPT09YS50eXBlKGMpJiYhYy5tYXRjaCgvXl8vKSYmdm9pZCAwIT09YigpW2NdfTtrPWZ1bmN0aW9uKGEpe3ZhciBjPVtdLGQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO2koZCxjKTtyZXR1cm4gYigpW2FdLmFwcGx5KGIoKSxjKX07YS5mbi5maW5lVXBsb2FkZXI9ZnVuY3Rpb24oZSl7dmFyIGY9dGhpcyxnPWFyZ3VtZW50cyxpPVtdO3RoaXMuZWFjaChmdW5jdGlvbihuLHMpe2M9YShzKTtpZihiKCkmJm0oZSkpe2lmKGkucHVzaChrLmFwcGx5KGYsZykpLDE9PT1mLmxlbmd0aClyZXR1cm4hMX1lbHNlIm9iamVjdCI9PT10eXBlb2YgZXx8IWU/ZC5hcHBseShmLGcpOmEuZXJyb3IoIk1ldGhvZCAiK2UrIiBkb2VzIG5vdCBleGlzdCBvbiBqUXVlcnkuZmluZVVwbG9hZGVyIil9KTtyZXR1cm4gMT09PWkubGVuZ3RoP2lbMF06MTxpLmxlbmd0aD9pOnRoaXN9fSkoalF1ZXJ5KTs=]]></data>
	</file>
	<file>
	  <filename>/lib/js/fineuploader/loading.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhDwAPAKUAAEQ+PKSmpHx6fNTW1FxaXOzu7ExOTIyOjGRmZMTCxPz6/ERGROTi5Pz29JyanGxubMzKzIyKjGReXPT29FxWVGxmZExGROzq7ERCRLy6vISChNze3FxeXPTy9FROTJSSlMTGxPz+/OTm5JyenNTOzGxqbExKTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJBgAhACwAAAAADwAPAAAGd8CQcEgsChuTZMNIDFgsC1Nn9GEwDwDAoqMBWEDFiweA2YoiZevwA9BkDAUhW0MkADYhiEJYwJj2QhYGTBwAE0MUGGp5IR1+RBEAEUMVDg4AAkQMJhgfFyEIWRgDRSALABKgWQ+HRQwaCCEVC7R0TEITHbmtt0xBACH5BAkGACYALAAAAAAPAA8AhUQ+PKSmpHRydNTW1FxWVOzu7MTCxIyKjExKTOTi5LSytHx+fPz6/ERGROTe3GxqbNTS1JyWlFRSVKympNze3FxeXPT29MzKzFROTOzq7ISGhERCRHx6fNza3FxaXPTy9MTGxJSSlExOTOTm5LS2tISChPz+/ExGRJyenKyqrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ6QJNQeIkUhsjkp+EhMZLITKgBAGigQgiiCtiAKJdkBgNYgDYLhmDjQIbKwgfF9C4hPYC5KSMsbBBIJyJYFQAWQwQbI0J8Jh8nDUgHAAcmDA+LKAAcSAkIEhYTAAEoGxsdSSAKIyJcGyRYJiQbVRwDsVkPXrhDDCQBSUEAIfkECQYAEAAsAAAAAA8ADwCFRD48pKKkdHZ01NLUXFpc7OrsTE5MlJKU9Pb03N7cREZExMbEhIKEbGpsXFZUVFZU/P78tLa0fH583NrcZGJk9PL0VE5MnJ6c/Pb05ObkTEZEREJErKqsfHp81NbUXF5c7O7slJaU5OLkzMrMjIaEdG5sVFJU/Pr8TEpMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABndAiHA4DICISCIllBQWQgSNY6NJJAcoAMCw0XaQBQtAYj0ANgcE0SwZlgSe04hI2FiFAyEFRdQYmh8AakIOJhgQHhVCFQoaRAsVGSQWihAXAF9EHFkNEBUXGxsTSBxaGx9dGxFJGKgKAAoSEydNIwoFg01DF7oQQQAh+QQJBgAYACwAAAAADwAPAIVEPjykoqR0cnTU0tRUUlSMiozs6uxMSkx8fnzc3txcXlyUlpT09vRcWlxMRkS0trR8enzc2txcVlSUkpRUTkyMhoTk5uScnpz8/vxEQkR8dnTU1tRUVlSMjoz08vRMTkyEgoTk4uRkYmSclpT8+vy8urwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGc0CMcEgsGo9Gw6LhkHRCmICFODgAAJ8M4FDJTIUGCgCRwIQKV+9wMiaWtIAvRqOACiMKwucjJzFIJEN+gEQiHAQcJUMeBROCBFcLRBcAEESQAB0GGB4XGRkbghwCnxkiWhkPRRMMCSAfABkIoUhCDLW4Q0EAIfkECQYAGQAsAAAAAA8ADwCFRD48pKKkdHJ01NLU7OrsXFZUjIqMvLq8TEpM3N7c9Pb0lJaUxMbErK6sfH58bGpsVFJUTEZE3Nrc9PL0XF5clJKUxMLEVE5M5Obk/P78nJ6ctLa0hIaEREJE1NbU7O7sXFpcjI6MvL68TE5M5OLk/Pr8nJqczM7MtLK0hIKEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABnPAjHBILBqPRsICFCmESMcBAgAYdQAIi9HzSCUyJEOnAx0GBqUSsQJwYFAZyTiFGZZEgHGlJKACQBIZEwJXVR8iYwANE0MTAVMNGSISHAAhRSUYC2pCJFMhH4IaEAdGDGMdFFcdG0cJKSNYDoFIQgqctblBADs=]]></data>
	</file>
	<file>
	  <filename>/lib/js/fineuploader/processing.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhGAAYAKUAAAQCBISGhMTGxERGROzu7KSmpCQiJGxqbNza3JyenFxaXPz6/Ly6vBwaHAwKDIyOjMzOzPT29Dw+POTi5GRiZMTCxAQGBExKTPTy9LSytCwqLHx+fNze3KSipFxeXPz+/Ly+vJSSlNTS1P///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCQAjACwAAAAAGAAYAAAGvsCRcEgcYTDFpHIYcjhCy2RkMiQ4AAAHITrsXCVbzBVgQY4mm8KniLFgARthyPIULjTYQnHyBniGEWYjVlhxRRJvDFEBFhocSQQbFBlcIxELlZlJFR4eFZqbbmSfmR8dHWsefX+ZCVgJI6pvCpquALAVohaklR8JCWsjnJ6gURwCEcVECwpYDYrKIw99DVtKCwkiSQN9AAJLrg3BQ819CEsQBgdJEKIAtEIZlETJShAeAw/1Ixoa0UUcqPxTFgQAIfkECQkAJAAsAAAAABgAGACFBAIEhIaEzMrMREJEJCIkpKak5ObkFBIUNDI09Pb0lJaUXF5ctLa0dHZ0DAoM3NrcLC4srK6s9PL0HBocPDo8/P78nJ6cZGZkBAYEjIqMJCYk7OrsNDY0/Pr8ZGJkvL683N7ctLK0HB4cpKKk////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABrVAknBILBqPRgGHI0A6hxwAgPMcPiiaDFRKHYIkx4EU8BEKEIimUAEggIuiscW5kIKMAalo4wQtFEgfFnxVhYZFEgUjb4dDEhBSEIxVBgZCBWMAI4YGBw6WI5mbhZ0Hlo+Rk0+VjiMFqo1EHbFFDAgHF7CFDxhjHk8gCUZsYwcVJB8eC2VCIAC/RRGZEBXSYxFCCR7YRR0UUhgMJN9jXU8dEQoPQhqZGrQkDZkN8BIeGBgeukJBACH5BAkJACYALAAAAAAYABgAhQQCBISGhExKTMTGxOTm5CwqLGRmZKyqrPT29BQSFHR2dLy6vAwKDFRWVNTW1Ozu7DQyNJyanLSytPz+/Hx+fOTi5AQGBExOTOzq7CwuLHRydKyurPz6/BwaHHx6fMTCxAwODFxaXNza3PTy9DQ2NJyenP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa2QJNwSCwaj0ZOKcJBOoclACDyHCIooc8wIqVWTRQp6CHkREpNoSPjOYakAIfzACgcPyBAI32cHERIDw58X4WGJhUVh0YeABZti0IVcACKhQICkpSWX5hDChYACpFEiaSnExUjRxgKIRtODhAADBRFEyRwsEYTs3AHRCKUIUIjGwerk5QGRBihUqMYBVIFBCPPUpBboRAYJgGUAWBwCQRGDyJpGpQaQhsGFOZVA88WA6cSFwIST0EAIfkECQkAKAAsAAAAABgAGACFBAIEhIKExMLEREJEJCIk5OLktLK0ZGZk9PL0FBIUNDI0lJKUzM7MLCos7OrsvLq8dHJ0HBocjI6MzMrMTEpM/Pr8BAYEhIaExMbEJCYk5ObktLa0bG5sFBYUPDo8nJqc1NbULC4s7O7svL68dHZ0HB4cTE5M/P78////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABrpAlHBILBqPR00BySRqEollc1gYVahQ6bSQAHCIBS2qwnkcRwCAp6mxfI3kAWbquE7v+PzwZL+fFiEKCycoDwQZZncLaWkLFSVpBH1MIYwAIRUZaSWTSJWMISgbhxt4i4wSQnx5JxIhIYN6fg8fGkwVFwomDEYBaRG2R75pCSJFEYwLQyIOQ59pBkUejKUnJAAWEIQUlhNFIB4RAVcT3SgMXQAHdxuW0SgiBnN3CJoAGQiyQw4SEs1MQQAAIfkECQkAKAAsAAAAABgAGACFBAIEhIKExMLEREZE7OrsJCIkpKKkbGpsFBIUlJKU9Pb01NLUdHZ0DAoMXF5ctLK0jIqMzMrMVFJU9PL0LC4sHBocnJqc/P78fH58vLq8BAYEhIaETEpM7O7sdHJ0FBYU/Pr83NrcfHp8DA4MzM7MNDI0nJ6cvL68////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABrtAlHBILBqPyKSSyBkQSQHT5HgBFQdOoQHApSiKF0dFgLwUuFxLEfQBJJCTBhoQMEYSX6RkHlkeCRwjBSZ+SQpWhUkhGCIhQgoQEHlLIQhcCI4QXBCFDHMMKJoAnH4icyIokBuTSiEjXCOOiUSLjbOJBAsXShEMeEYnlhy7RxEaXBJGe1wkSB5zU0SeAA0EQg8UFBlCogAIiEMKDBInj20AH18KewgPfh3HXB1DE6xKB1wHt0QgESTgR4IAACH5BAkJACUALAAAAAAYABgAhQQCBISGhMzKzDw6PKSmpPTy9FRWVCwqLNza3Ly6vAwODExKTJyanPz6/GRmZAwKDNTW1LSytDQyNOTi5MTCxFRSVAQGBIyOjMzOzERGRKyqrPT29FxaXCwuLNze3Ly+vBQSFExOTKSipPz+/GxqbP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaxwJJwOBxdDp1Lg8hsDi+AKODirA4PUsBBuMFMrESsdOsRB5wETkEIlVId2S/TAIAIG8eDsrTICpoFdlYMYxtgVSMMIQ4eh46PYA0fH0tCHgiQDRlRGUsIDw+Yjh9ZHyUIFgqih6RSpqerhxubAJ2QTJKUt7uHBREYTg0kAxRWBR1RDE0JUQNWGlIdTZ8AJEMTDg5yGFIVTh4RI0O0GUMMHRVyh2JbvEIaCgoa7kMbhmBBACH5BAkJACEALAAAAAAYABgAhQQCBIyKjDw+PMzKzFxeXOTm5BwaHGxubKyqrAwODPT29ExOTNTW1GRmZJSSlHR2dMTCxBQWFPz+/AwKDIyOjExKTNTS1GRiZPTy9CwuLHRydLSytBQSFPz6/FRWVNze3GxqbP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa9wJBwSGQ8HgyiclnkAACJJJNouSwcnZDm+dRMh5YJl6DlArydQyIzUBLMgA8j8YyGENyMsgKHhIxIQgFcE0oUZhEKTB90AAdKHW8AEX5THwEIWUsfA4pfn6BLGBhEEpqhIQ4TEw5CEgICp58YYgATpB2wsl+0T7dCHbufFKsUqFOjx8rKBaRMEBSeUw0ABm2QTgFfBVwNSxIeHJVCA9chGBFPxksd0iEbTxtDAw0UwkyHAOvLQhggIM74KQsCACH5BAkJACMALAAAAAAYABgAhQQCBJSWlNTS1ERCRBweHOzq7LSytGRmZBQWFPT29MTCxAwKDNze3FRWVDQyNKSmpExKTPTy9Hx+fPz+/MzKzOTm5AQGBJyanERGRCwqLOzu7Ly6vGxqbBwaHPz6/MTGxAwODOTi5DQ2NP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa0wJFwSPRsNgmicklMYACAQZJZNAQYwg0UuqEOPU+ApavddkcGDEejNGwBmZETKh0xFtCDMvDuTORHUx9bGEoMFlt6TAkDYgZLGw4IBxFeHh9YVH9eVAkcCyAclZxMB2+KpBQiIhQjeFsLm5wiUCKubxayXrQAtqaJpEKqrHIHCwsHU8HLzM3MEQKkAhgSukMNANFeYa1LDw1sXx5EEgAIFcsaGRnhIxMU6MsMYpnOQwpn9s5BADs=]]></data>
	</file>
	<file>
	  <filename>/lib/js/jquery-1.7.2.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIGpRdWVyeSB2MS43LjIganF1ZXJ5LmNvbSB8IGpxdWVyeS5vcmcvbGljZW5zZSAqLwooZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjeShhKXtyZXR1cm4gZi5pc1dpbmRvdyhhKT9hOmEubm9kZVR5cGU9PT05P2EuZGVmYXVsdFZpZXd8fGEucGFyZW50V2luZG93OiExfWZ1bmN0aW9uIGN1KGEpe2lmKCFjalthXSl7dmFyIGI9Yy5ib2R5LGQ9ZigiPCIrYSsiPiIpLmFwcGVuZFRvKGIpLGU9ZC5jc3MoImRpc3BsYXkiKTtkLnJlbW92ZSgpO2lmKGU9PT0ibm9uZSJ8fGU9PT0iIil7Y2t8fChjaz1jLmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGNrLmZyYW1lQm9yZGVyPWNrLndpZHRoPWNrLmhlaWdodD0wKSxiLmFwcGVuZENoaWxkKGNrKTtpZighY2x8fCFjay5jcmVhdGVFbGVtZW50KWNsPShjay5jb250ZW50V2luZG93fHxjay5jb250ZW50RG9jdW1lbnQpLmRvY3VtZW50LGNsLndyaXRlKChmLnN1cHBvcnQuYm94TW9kZWw/IjwhZG9jdHlwZSBodG1sPiI6IiIpKyI8aHRtbD48Ym9keT4iKSxjbC5jbG9zZSgpO2Q9Y2wuY3JlYXRlRWxlbWVudChhKSxjbC5ib2R5LmFwcGVuZENoaWxkKGQpLGU9Zi5jc3MoZCwiZGlzcGxheSIpLGIucmVtb3ZlQ2hpbGQoY2spfWNqW2FdPWV9cmV0dXJuIGNqW2FdfWZ1bmN0aW9uIGN0KGEsYil7dmFyIGM9e307Zi5lYWNoKGNwLmNvbmNhdC5hcHBseShbXSxjcC5zbGljZSgwLGIpKSxmdW5jdGlvbigpe2NbdGhpc109YX0pO3JldHVybiBjfWZ1bmN0aW9uIGNzKCl7Y3E9Yn1mdW5jdGlvbiBjcigpe3NldFRpbWVvdXQoY3MsMCk7cmV0dXJuIGNxPWYubm93KCl9ZnVuY3Rpb24gY2koKXt0cnl7cmV0dXJuIG5ldyBhLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9Y2F0Y2goYil7fX1mdW5jdGlvbiBjaCgpe3RyeXtyZXR1cm4gbmV3IGEuWE1MSHR0cFJlcXVlc3R9Y2F0Y2goYil7fX1mdW5jdGlvbiBjYihhLGMpe2EuZGF0YUZpbHRlciYmKGM9YS5kYXRhRmlsdGVyKGMsYS5kYXRhVHlwZSkpO3ZhciBkPWEuZGF0YVR5cGVzLGU9e30sZyxoLGk9ZC5sZW5ndGgsaixrPWRbMF0sbCxtLG4sbyxwO2ZvcihnPTE7ZzxpO2crKyl7aWYoZz09PTEpZm9yKGggaW4gYS5jb252ZXJ0ZXJzKXR5cGVvZiBoPT0ic3RyaW5nIiYmKGVbaC50b0xvd2VyQ2FzZSgpXT1hLmNvbnZlcnRlcnNbaF0pO2w9ayxrPWRbZ107aWYoaz09PSIqIilrPWw7ZWxzZSBpZihsIT09IioiJiZsIT09ayl7bT1sKyIgIitrLG49ZVttXXx8ZVsiKiAiK2tdO2lmKCFuKXtwPWI7Zm9yKG8gaW4gZSl7aj1vLnNwbGl0KCIgIik7aWYoalswXT09PWx8fGpbMF09PT0iKiIpe3A9ZVtqWzFdKyIgIitrXTtpZihwKXtvPWVbb10sbz09PSEwP249cDpwPT09ITAmJihuPW8pO2JyZWFrfX19fSFuJiYhcCYmZi5lcnJvcigiTm8gY29udmVyc2lvbiBmcm9tICIrbS5yZXBsYWNlKCIgIiwiIHRvICIpKSxuIT09ITAmJihjPW4/bihjKTpwKG8oYykpKX19cmV0dXJuIGN9ZnVuY3Rpb24gY2EoYSxjLGQpe3ZhciBlPWEuY29udGVudHMsZj1hLmRhdGFUeXBlcyxnPWEucmVzcG9uc2VGaWVsZHMsaCxpLGosaztmb3IoaSBpbiBnKWkgaW4gZCYmKGNbZ1tpXV09ZFtpXSk7d2hpbGUoZlswXT09PSIqIilmLnNoaWZ0KCksaD09PWImJihoPWEubWltZVR5cGV8fGMuZ2V0UmVzcG9uc2VIZWFkZXIoImNvbnRlbnQtdHlwZSIpKTtpZihoKWZvcihpIGluIGUpaWYoZVtpXSYmZVtpXS50ZXN0KGgpKXtmLnVuc2hpZnQoaSk7YnJlYWt9aWYoZlswXWluIGQpaj1mWzBdO2Vsc2V7Zm9yKGkgaW4gZCl7aWYoIWZbMF18fGEuY29udmVydGVyc1tpKyIgIitmWzBdXSl7aj1pO2JyZWFrfWt8fChrPWkpfWo9anx8a31pZihqKXtqIT09ZlswXSYmZi51bnNoaWZ0KGopO3JldHVybiBkW2pdfX1mdW5jdGlvbiBiXyhhLGIsYyxkKXtpZihmLmlzQXJyYXkoYikpZi5lYWNoKGIsZnVuY3Rpb24oYixlKXtjfHxiRC50ZXN0KGEpP2QoYSxlKTpiXyhhKyJbIisodHlwZW9mIGU9PSJvYmplY3QiP2I6IiIpKyJdIixlLGMsZCl9KTtlbHNlIGlmKCFjJiZmLnR5cGUoYik9PT0ib2JqZWN0Iilmb3IodmFyIGUgaW4gYiliXyhhKyJbIitlKyJdIixiW2VdLGMsZCk7ZWxzZSBkKGEsYil9ZnVuY3Rpb24gYiQoYSxjKXt2YXIgZCxlLGc9Zi5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihkIGluIGMpY1tkXSE9PWImJigoZ1tkXT9hOmV8fChlPXt9KSlbZF09Y1tkXSk7ZSYmZi5leHRlbmQoITAsYSxlKX1mdW5jdGlvbiBiWihhLGMsZCxlLGYsZyl7Zj1mfHxjLmRhdGFUeXBlc1swXSxnPWd8fHt9LGdbZl09ITA7dmFyIGg9YVtmXSxpPTAsaj1oP2gubGVuZ3RoOjAsaz1hPT09YlMsbDtmb3IoO2k8aiYmKGt8fCFsKTtpKyspbD1oW2ldKGMsZCxlKSx0eXBlb2YgbD09InN0cmluZyImJigha3x8Z1tsXT9sPWI6KGMuZGF0YVR5cGVzLnVuc2hpZnQobCksbD1iWihhLGMsZCxlLGwsZykpKTsoa3x8IWwpJiYhZ1siKiJdJiYobD1iWihhLGMsZCxlLCIqIixnKSk7cmV0dXJuIGx9ZnVuY3Rpb24gYlkoYSl7cmV0dXJuIGZ1bmN0aW9uKGIsYyl7dHlwZW9mIGIhPSJzdHJpbmciJiYoYz1iLGI9IioiKTtpZihmLmlzRnVuY3Rpb24oYykpe3ZhciBkPWIudG9Mb3dlckNhc2UoKS5zcGxpdChiTyksZT0wLGc9ZC5sZW5ndGgsaCxpLGo7Zm9yKDtlPGc7ZSsrKWg9ZFtlXSxqPS9eXCsvLnRlc3QoaCksaiYmKGg9aC5zdWJzdHIoMSl8fCIqIiksaT1hW2hdPWFbaF18fFtdLGlbaj8idW5zaGlmdCI6InB1c2giXShjKX19fWZ1bmN0aW9uIGJCKGEsYixjKXt2YXIgZD1iPT09IndpZHRoIj9hLm9mZnNldFdpZHRoOmEub2Zmc2V0SGVpZ2h0LGU9Yj09PSJ3aWR0aCI/MTowLGc9NDtpZihkPjApe2lmKGMhPT0iYm9yZGVyIilmb3IoO2U8ZztlKz0yKWN8fChkLT1wYXJzZUZsb2F0KGYuY3NzKGEsInBhZGRpbmciK2J4W2VdKSl8fDApLGM9PT0ibWFyZ2luIj9kKz1wYXJzZUZsb2F0KGYuY3NzKGEsYytieFtlXSkpfHwwOmQtPXBhcnNlRmxvYXQoZi5jc3MoYSwiYm9yZGVyIitieFtlXSsiV2lkdGgiKSl8fDA7cmV0dXJuIGQrInB4In1kPWJ5KGEsYik7aWYoZDwwfHxkPT1udWxsKWQ9YS5zdHlsZVtiXTtpZihidC50ZXN0KGQpKXJldHVybiBkO2Q9cGFyc2VGbG9hdChkKXx8MDtpZihjKWZvcig7ZTxnO2UrPTIpZCs9cGFyc2VGbG9hdChmLmNzcyhhLCJwYWRkaW5nIitieFtlXSkpfHwwLGMhPT0icGFkZGluZyImJihkKz1wYXJzZUZsb2F0KGYuY3NzKGEsImJvcmRlciIrYnhbZV0rIldpZHRoIikpfHwwKSxjPT09Im1hcmdpbiImJihkKz1wYXJzZUZsb2F0KGYuY3NzKGEsYytieFtlXSkpfHwwKTtyZXR1cm4gZCsicHgifWZ1bmN0aW9uIGJvKGEpe3ZhciBiPWMuY3JlYXRlRWxlbWVudCgiZGl2Iik7YmguYXBwZW5kQ2hpbGQoYiksYi5pbm5lckhUTUw9YS5vdXRlckhUTUw7cmV0dXJuIGIuZmlyc3RDaGlsZH1mdW5jdGlvbiBibihhKXt2YXIgYj0oYS5ub2RlTmFtZXx8IiIpLnRvTG93ZXJDYXNlKCk7Yj09PSJpbnB1dCI/Ym0oYSk6YiE9PSJzY3JpcHQiJiZ0eXBlb2YgYS5nZXRFbGVtZW50c0J5VGFnTmFtZSE9InVuZGVmaW5lZCImJmYuZ3JlcChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpLGJtKX1mdW5jdGlvbiBibShhKXtpZihhLnR5cGU9PT0iY2hlY2tib3gifHxhLnR5cGU9PT0icmFkaW8iKWEuZGVmYXVsdENoZWNrZWQ9YS5jaGVja2VkfWZ1bmN0aW9uIGJsKGEpe3JldHVybiB0eXBlb2YgYS5nZXRFbGVtZW50c0J5VGFnTmFtZSE9InVuZGVmaW5lZCI/YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOnR5cGVvZiBhLnF1ZXJ5U2VsZWN0b3JBbGwhPSJ1bmRlZmluZWQiP2EucXVlcnlTZWxlY3RvckFsbCgiKiIpOltdfWZ1bmN0aW9uIGJrKGEsYil7dmFyIGM7Yi5ub2RlVHlwZT09PTEmJihiLmNsZWFyQXR0cmlidXRlcyYmYi5jbGVhckF0dHJpYnV0ZXMoKSxiLm1lcmdlQXR0cmlidXRlcyYmYi5tZXJnZUF0dHJpYnV0ZXMoYSksYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksYz09PSJvYmplY3QiP2Iub3V0ZXJIVE1MPWEub3V0ZXJIVE1MOmMhPT0iaW5wdXQifHxhLnR5cGUhPT0iY2hlY2tib3giJiZhLnR5cGUhPT0icmFkaW8iP2M9PT0ib3B0aW9uIj9iLnNlbGVjdGVkPWEuZGVmYXVsdFNlbGVjdGVkOmM9PT0iaW5wdXQifHxjPT09InRleHRhcmVhIj9iLmRlZmF1bHRWYWx1ZT1hLmRlZmF1bHRWYWx1ZTpjPT09InNjcmlwdCImJmIudGV4dCE9PWEudGV4dCYmKGIudGV4dD1hLnRleHQpOihhLmNoZWNrZWQmJihiLmRlZmF1bHRDaGVja2VkPWIuY2hlY2tlZD1hLmNoZWNrZWQpLGIudmFsdWUhPT1hLnZhbHVlJiYoYi52YWx1ZT1hLnZhbHVlKSksYi5yZW1vdmVBdHRyaWJ1dGUoZi5leHBhbmRvKSxiLnJlbW92ZUF0dHJpYnV0ZSgiX3N1Ym1pdF9hdHRhY2hlZCIpLGIucmVtb3ZlQXR0cmlidXRlKCJfY2hhbmdlX2F0dGFjaGVkIikpfWZ1bmN0aW9uIGJqKGEsYil7aWYoYi5ub2RlVHlwZT09PTEmJiEhZi5oYXNEYXRhKGEpKXt2YXIgYyxkLGUsZz1mLl9kYXRhKGEpLGg9Zi5fZGF0YShiLGcpLGk9Zy5ldmVudHM7aWYoaSl7ZGVsZXRlIGguaGFuZGxlLGguZXZlbnRzPXt9O2ZvcihjIGluIGkpZm9yKGQ9MCxlPWlbY10ubGVuZ3RoO2Q8ZTtkKyspZi5ldmVudC5hZGQoYixjLGlbY11bZF0pfWguZGF0YSYmKGguZGF0YT1mLmV4dGVuZCh7fSxoLmRhdGEpKX19ZnVuY3Rpb24gYmkoYSxiKXtyZXR1cm4gZi5ub2RlTmFtZShhLCJ0YWJsZSIpP2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IilbMF18fGEuYXBwZW5kQ2hpbGQoYS5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRib2R5IikpOmF9ZnVuY3Rpb24gVShhKXt2YXIgYj1WLnNwbGl0KCJ8IiksYz1hLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihjLmNyZWF0ZUVsZW1lbnQpd2hpbGUoYi5sZW5ndGgpYy5jcmVhdGVFbGVtZW50KGIucG9wKCkpO3JldHVybiBjfWZ1bmN0aW9uIFQoYSxiLGMpe2I9Ynx8MDtpZihmLmlzRnVuY3Rpb24oYikpcmV0dXJuIGYuZ3JlcChhLGZ1bmN0aW9uKGEsZCl7dmFyIGU9ISFiLmNhbGwoYSxkLGEpO3JldHVybiBlPT09Y30pO2lmKGIubm9kZVR5cGUpcmV0dXJuIGYuZ3JlcChhLGZ1bmN0aW9uKGEsZCl7cmV0dXJuIGE9PT1iPT09Y30pO2lmKHR5cGVvZiBiPT0ic3RyaW5nIil7dmFyIGQ9Zi5ncmVwKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9kZVR5cGU9PT0xfSk7aWYoTy50ZXN0KGIpKXJldHVybiBmLmZpbHRlcihiLGQsIWMpO2I9Zi5maWx0ZXIoYixkKX1yZXR1cm4gZi5ncmVwKGEsZnVuY3Rpb24oYSxkKXtyZXR1cm4gZi5pbkFycmF5KGEsYik+PTA9PT1jfSl9ZnVuY3Rpb24gUyhhKXtyZXR1cm4hYXx8IWEucGFyZW50Tm9kZXx8YS5wYXJlbnROb2RlLm5vZGVUeXBlPT09MTF9ZnVuY3Rpb24gSygpe3JldHVybiEwfWZ1bmN0aW9uIEooKXtyZXR1cm4hMX1mdW5jdGlvbiBuKGEsYixjKXt2YXIgZD1iKyJkZWZlciIsZT1iKyJxdWV1ZSIsZz1iKyJtYXJrIixoPWYuX2RhdGEoYSxkKTtoJiYoYz09PSJxdWV1ZSJ8fCFmLl9kYXRhKGEsZSkpJiYoYz09PSJtYXJrInx8IWYuX2RhdGEoYSxnKSkmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXshZi5fZGF0YShhLGUpJiYhZi5fZGF0YShhLGcpJiYoZi5yZW1vdmVEYXRhKGEsZCwhMCksaC5maXJlKCkpfSwwKX1mdW5jdGlvbiBtKGEpe2Zvcih2YXIgYiBpbiBhKXtpZihiPT09ImRhdGEiJiZmLmlzRW1wdHlPYmplY3QoYVtiXSkpY29udGludWU7aWYoYiE9PSJ0b0pTT04iKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIGwoYSxjLGQpe2lmKGQ9PT1iJiZhLm5vZGVUeXBlPT09MSl7dmFyIGU9ImRhdGEtIitjLnJlcGxhY2UoaywiLSQxIikudG9Mb3dlckNhc2UoKTtkPWEuZ2V0QXR0cmlidXRlKGUpO2lmKHR5cGVvZiBkPT0ic3RyaW5nIil7dHJ5e2Q9ZD09PSJ0cnVlIj8hMDpkPT09ImZhbHNlIj8hMTpkPT09Im51bGwiP251bGw6Zi5pc051bWVyaWMoZCk/K2Q6ai50ZXN0KGQpP2YucGFyc2VKU09OKGQpOmR9Y2F0Y2goZyl7fWYuZGF0YShhLGMsZCl9ZWxzZSBkPWJ9cmV0dXJuIGR9ZnVuY3Rpb24gaChhKXt2YXIgYj1nW2FdPXt9LGMsZDthPWEuc3BsaXQoL1xzKy8pO2ZvcihjPTAsZD1hLmxlbmd0aDtjPGQ7YysrKWJbYVtjXV09ITA7cmV0dXJuIGJ9dmFyIGM9YS5kb2N1bWVudCxkPWEubmF2aWdhdG9yLGU9YS5sb2NhdGlvbixmPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gSigpe2lmKCFlLmlzUmVhZHkpe3RyeXtjLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCgibGVmdCIpfWNhdGNoKGEpe3NldFRpbWVvdXQoSiwxKTtyZXR1cm59ZS5yZWFkeSgpfX12YXIgZT1mdW5jdGlvbihhLGIpe3JldHVybiBuZXcgZS5mbi5pbml0KGEsYixoKX0sZj1hLmpRdWVyeSxnPWEuJCxoLGk9L14oPzpbXiM8XSooPFtcd1xXXSs+KVtePl0qJHwjKFtcd1wtXSopJCkvLGo9L1xTLyxrPS9eXHMrLyxsPS9ccyskLyxtPS9ePChcdyspXHMqXC8/Pig/OjxcL1wxPik/JC8sbj0vXltcXSw6e31cc10qJC8sbz0vXFwoPzpbIlxcXC9iZm5ydF18dVswLTlhLWZBLUZdezR9KS9nLHA9LyJbXiJcXFxuXHJdKiJ8dHJ1ZXxmYWxzZXxudWxsfC0/XGQrKD86XC5cZCopPyg/OltlRV1bK1wtXT9cZCspPy9nLHE9Lyg/Ol58OnwsKSg/OlxzKlxbKSsvZyxyPS8od2Via2l0KVsgXC9dKFtcdy5dKykvLHM9LyhvcGVyYSkoPzouKnZlcnNpb24pP1sgXC9dKFtcdy5dKykvLHQ9Lyhtc2llKSAoW1x3Ll0rKS8sdT0vKG1vemlsbGEpKD86Lio/IHJ2OihbXHcuXSspKT8vLHY9Ly0oW2Etel18WzAtOV0pL2lnLHc9L14tbXMtLyx4PWZ1bmN0aW9uKGEsYil7cmV0dXJuKGIrIiIpLnRvVXBwZXJDYXNlKCl9LHk9ZC51c2VyQWdlbnQseixBLEIsQz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLEQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxFPUFycmF5LnByb3RvdHlwZS5wdXNoLEY9QXJyYXkucHJvdG90eXBlLnNsaWNlLEc9U3RyaW5nLnByb3RvdHlwZS50cmltLEg9QXJyYXkucHJvdG90eXBlLmluZGV4T2YsST17fTtlLmZuPWUucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjplLGluaXQ6ZnVuY3Rpb24oYSxkLGYpe3ZhciBnLGgsaixrO2lmKCFhKXJldHVybiB0aGlzO2lmKGEubm9kZVR5cGUpe3RoaXMuY29udGV4dD10aGlzWzBdPWEsdGhpcy5sZW5ndGg9MTtyZXR1cm4gdGhpc31pZihhPT09ImJvZHkiJiYhZCYmYy5ib2R5KXt0aGlzLmNvbnRleHQ9Yyx0aGlzWzBdPWMuYm9keSx0aGlzLnNlbGVjdG9yPWEsdGhpcy5sZW5ndGg9MTtyZXR1cm4gdGhpc31pZih0eXBlb2YgYT09InN0cmluZyIpe2EuY2hhckF0KDApIT09IjwifHxhLmNoYXJBdChhLmxlbmd0aC0xKSE9PSI+Inx8YS5sZW5ndGg8Mz9nPWkuZXhlYyhhKTpnPVtudWxsLGEsbnVsbF07aWYoZyYmKGdbMV18fCFkKSl7aWYoZ1sxXSl7ZD1kIGluc3RhbmNlb2YgZT9kWzBdOmQsaz1kP2Qub3duZXJEb2N1bWVudHx8ZDpjLGo9bS5leGVjKGEpLGo/ZS5pc1BsYWluT2JqZWN0KGQpPyhhPVtjLmNyZWF0ZUVsZW1lbnQoalsxXSldLGUuZm4uYXR0ci5jYWxsKGEsZCwhMCkpOmE9W2suY3JlYXRlRWxlbWVudChqWzFdKV06KGo9ZS5idWlsZEZyYWdtZW50KFtnWzFdXSxba10pLGE9KGouY2FjaGVhYmxlP2UuY2xvbmUoai5mcmFnbWVudCk6ai5mcmFnbWVudCkuY2hpbGROb2Rlcyk7cmV0dXJuIGUubWVyZ2UodGhpcyxhKX1oPWMuZ2V0RWxlbWVudEJ5SWQoZ1syXSk7aWYoaCYmaC5wYXJlbnROb2RlKXtpZihoLmlkIT09Z1syXSlyZXR1cm4gZi5maW5kKGEpO3RoaXMubGVuZ3RoPTEsdGhpc1swXT1ofXRoaXMuY29udGV4dD1jLHRoaXMuc2VsZWN0b3I9YTtyZXR1cm4gdGhpc31yZXR1cm4hZHx8ZC5qcXVlcnk/KGR8fGYpLmZpbmQoYSk6dGhpcy5jb25zdHJ1Y3RvcihkKS5maW5kKGEpfWlmKGUuaXNGdW5jdGlvbihhKSlyZXR1cm4gZi5yZWFkeShhKTthLnNlbGVjdG9yIT09YiYmKHRoaXMuc2VsZWN0b3I9YS5zZWxlY3Rvcix0aGlzLmNvbnRleHQ9YS5jb250ZXh0KTtyZXR1cm4gZS5tYWtlQXJyYXkoYSx0aGlzKX0sc2VsZWN0b3I6IiIsanF1ZXJ5OiIxLjcuMiIsbGVuZ3RoOjAsc2l6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxlbmd0aH0sdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBGLmNhbGwodGhpcywwKX0sZ2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsP3RoaXMudG9BcnJheSgpOmE8MD90aGlzW3RoaXMubGVuZ3RoK2FdOnRoaXNbYV19LHB1c2hTdGFjazpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5jb25zdHJ1Y3RvcigpO2UuaXNBcnJheShhKT9FLmFwcGx5KGQsYSk6ZS5tZXJnZShkLGEpLGQucHJldk9iamVjdD10aGlzLGQuY29udGV4dD10aGlzLmNvbnRleHQsYj09PSJmaW5kIj9kLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3IrKHRoaXMuc2VsZWN0b3I/IiAiOiIiKStjOmImJihkLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3IrIi4iK2IrIigiK2MrIikiKTtyZXR1cm4gZH0sZWFjaDpmdW5jdGlvbihhLGIpe3JldHVybiBlLmVhY2godGhpcyxhLGIpfSxyZWFkeTpmdW5jdGlvbihhKXtlLmJpbmRSZWFkeSgpLEEuYWRkKGEpO3JldHVybiB0aGlzfSxlcTpmdW5jdGlvbihhKXthPSthO3JldHVybiBhPT09LTE/dGhpcy5zbGljZShhKTp0aGlzLnNsaWNlKGEsYSsxKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soRi5hcHBseSh0aGlzLGFyZ3VtZW50cyksInNsaWNlIixGLmNhbGwoYXJndW1lbnRzKS5qb2luKCIsIikpfSxtYXA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGUubWFwKHRoaXMsZnVuY3Rpb24oYixjKXtyZXR1cm4gYS5jYWxsKGIsYyxiKX0pKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8dGhpcy5jb25zdHJ1Y3RvcihudWxsKX0scHVzaDpFLHNvcnQ6W10uc29ydCxzcGxpY2U6W10uc3BsaWNlfSxlLmZuLmluaXQucHJvdG90eXBlPWUuZm4sZS5leHRlbmQ9ZS5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgYSxjLGQsZixnLGgsaT1hcmd1bWVudHNbMF18fHt9LGo9MSxrPWFyZ3VtZW50cy5sZW5ndGgsbD0hMTt0eXBlb2YgaT09ImJvb2xlYW4iJiYobD1pLGk9YXJndW1lbnRzWzFdfHx7fSxqPTIpLHR5cGVvZiBpIT0ib2JqZWN0IiYmIWUuaXNGdW5jdGlvbihpKSYmKGk9e30pLGs9PT1qJiYoaT10aGlzLC0taik7Zm9yKDtqPGs7aisrKWlmKChhPWFyZ3VtZW50c1tqXSkhPW51bGwpZm9yKGMgaW4gYSl7ZD1pW2NdLGY9YVtjXTtpZihpPT09Ziljb250aW51ZTtsJiZmJiYoZS5pc1BsYWluT2JqZWN0KGYpfHwoZz1lLmlzQXJyYXkoZikpKT8oZz8oZz0hMSxoPWQmJmUuaXNBcnJheShkKT9kOltdKTpoPWQmJmUuaXNQbGFpbk9iamVjdChkKT9kOnt9LGlbY109ZS5leHRlbmQobCxoLGYpKTpmIT09YiYmKGlbY109Zil9cmV0dXJuIGl9LGUuZXh0ZW5kKHtub0NvbmZsaWN0OmZ1bmN0aW9uKGIpe2EuJD09PWUmJihhLiQ9ZyksYiYmYS5qUXVlcnk9PT1lJiYoYS5qUXVlcnk9Zik7cmV0dXJuIGV9LGlzUmVhZHk6ITEscmVhZHlXYWl0OjEsaG9sZFJlYWR5OmZ1bmN0aW9uKGEpe2E/ZS5yZWFkeVdhaXQrKzplLnJlYWR5KCEwKX0scmVhZHk6ZnVuY3Rpb24oYSl7aWYoYT09PSEwJiYhLS1lLnJlYWR5V2FpdHx8YSE9PSEwJiYhZS5pc1JlYWR5KXtpZighYy5ib2R5KXJldHVybiBzZXRUaW1lb3V0KGUucmVhZHksMSk7ZS5pc1JlYWR5PSEwO2lmKGEhPT0hMCYmLS1lLnJlYWR5V2FpdD4wKXJldHVybjtBLmZpcmVXaXRoKGMsW2VdKSxlLmZuLnRyaWdnZXImJmUoYykudHJpZ2dlcigicmVhZHkiKS5vZmYoInJlYWR5Iil9fSxiaW5kUmVhZHk6ZnVuY3Rpb24oKXtpZighQSl7QT1lLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKTtpZihjLnJlYWR5U3RhdGU9PT0iY29tcGxldGUiKXJldHVybiBzZXRUaW1lb3V0KGUucmVhZHksMSk7aWYoYy5hZGRFdmVudExpc3RlbmVyKWMuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsQiwhMSksYS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixlLnJlYWR5LCExKTtlbHNlIGlmKGMuYXR0YWNoRXZlbnQpe2MuYXR0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsQiksYS5hdHRhY2hFdmVudCgib25sb2FkIixlLnJlYWR5KTt2YXIgYj0hMTt0cnl7Yj1hLmZyYW1lRWxlbWVudD09bnVsbH1jYXRjaChkKXt9Yy5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwmJmImJkooKX19fSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKGEpe3JldHVybiBlLnR5cGUoYSk9PT0iZnVuY3Rpb24ifSxpc0FycmF5OkFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGEpe3JldHVybiBlLnR5cGUoYSk9PT0iYXJyYXkifSxpc1dpbmRvdzpmdW5jdGlvbihhKXtyZXR1cm4gYSE9bnVsbCYmYT09YS53aW5kb3d9LGlzTnVtZXJpYzpmdW5jdGlvbihhKXtyZXR1cm4haXNOYU4ocGFyc2VGbG9hdChhKSkmJmlzRmluaXRlKGEpfSx0eXBlOmZ1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsP1N0cmluZyhhKTpJW0MuY2FsbChhKV18fCJvYmplY3QifSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGEpe2lmKCFhfHxlLnR5cGUoYSkhPT0ib2JqZWN0Inx8YS5ub2RlVHlwZXx8ZS5pc1dpbmRvdyhhKSlyZXR1cm4hMTt0cnl7aWYoYS5jb25zdHJ1Y3RvciYmIUQuY2FsbChhLCJjb25zdHJ1Y3RvciIpJiYhRC5jYWxsKGEuY29uc3RydWN0b3IucHJvdG90eXBlLCJpc1Byb3RvdHlwZU9mIikpcmV0dXJuITF9Y2F0Y2goYyl7cmV0dXJuITF9dmFyIGQ7Zm9yKGQgaW4gYSk7cmV0dXJuIGQ9PT1ifHxELmNhbGwoYSxkKX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihhKXtmb3IodmFyIGIgaW4gYSlyZXR1cm4hMTtyZXR1cm4hMH0sZXJyb3I6ZnVuY3Rpb24oYSl7dGhyb3cgbmV3IEVycm9yKGEpfSxwYXJzZUpTT046ZnVuY3Rpb24oYil7aWYodHlwZW9mIGIhPSJzdHJpbmcifHwhYilyZXR1cm4gbnVsbDtiPWUudHJpbShiKTtpZihhLkpTT04mJmEuSlNPTi5wYXJzZSlyZXR1cm4gYS5KU09OLnBhcnNlKGIpO2lmKG4udGVzdChiLnJlcGxhY2UobywiQCIpLnJlcGxhY2UocCwiXSIpLnJlcGxhY2UocSwiIikpKXJldHVybihuZXcgRnVuY3Rpb24oInJldHVybiAiK2IpKSgpO2UuZXJyb3IoIkludmFsaWQgSlNPTjogIitiKX0scGFyc2VYTUw6ZnVuY3Rpb24oYyl7aWYodHlwZW9mIGMhPSJzdHJpbmcifHwhYylyZXR1cm4gbnVsbDt2YXIgZCxmO3RyeXthLkRPTVBhcnNlcj8oZj1uZXcgRE9NUGFyc2VyLGQ9Zi5wYXJzZUZyb21TdHJpbmcoYywidGV4dC94bWwiKSk6KGQ9bmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxET00iKSxkLmFzeW5jPSJmYWxzZSIsZC5sb2FkWE1MKGMpKX1jYXRjaChnKXtkPWJ9KCFkfHwhZC5kb2N1bWVudEVsZW1lbnR8fGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhcnNlcmVycm9yIikubGVuZ3RoKSYmZS5lcnJvcigiSW52YWxpZCBYTUw6ICIrYyk7cmV0dXJuIGR9LG5vb3A6ZnVuY3Rpb24oKXt9LGdsb2JhbEV2YWw6ZnVuY3Rpb24oYil7YiYmai50ZXN0KGIpJiYoYS5leGVjU2NyaXB0fHxmdW5jdGlvbihiKXthLmV2YWwuY2FsbChhLGIpfSkoYil9LGNhbWVsQ2FzZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKHcsIm1zLSIpLnJlcGxhY2Uodix4KX0sbm9kZU5hbWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpPT09Yi50b1VwcGVyQ2FzZSgpfSxlYWNoOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZixnPTAsaD1hLmxlbmd0aCxpPWg9PT1ifHxlLmlzRnVuY3Rpb24oYSk7aWYoZCl7aWYoaSl7Zm9yKGYgaW4gYSlpZihjLmFwcGx5KGFbZl0sZCk9PT0hMSlicmVha31lbHNlIGZvcig7ZzxoOylpZihjLmFwcGx5KGFbZysrXSxkKT09PSExKWJyZWFrfWVsc2UgaWYoaSl7Zm9yKGYgaW4gYSlpZihjLmNhbGwoYVtmXSxmLGFbZl0pPT09ITEpYnJlYWt9ZWxzZSBmb3IoO2c8aDspaWYoYy5jYWxsKGFbZ10sZyxhW2crK10pPT09ITEpYnJlYWs7cmV0dXJuIGF9LHRyaW06Rz9mdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbD8iIjpHLmNhbGwoYSl9OmZ1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsPyIiOihhKyIiKS5yZXBsYWNlKGssIiIpLnJlcGxhY2UobCwiIil9LG1ha2VBcnJheTpmdW5jdGlvbihhLGIpe3ZhciBjPWJ8fFtdO2lmKGEhPW51bGwpe3ZhciBkPWUudHlwZShhKTthLmxlbmd0aD09bnVsbHx8ZD09PSJzdHJpbmcifHxkPT09ImZ1bmN0aW9uInx8ZD09PSJyZWdleHAifHxlLmlzV2luZG93KGEpP0UuY2FsbChjLGEpOmUubWVyZ2UoYyxhKX1yZXR1cm4gY30saW5BcnJheTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7aWYoYil7aWYoSClyZXR1cm4gSC5jYWxsKGIsYSxjKTtkPWIubGVuZ3RoLGM9Yz9jPDA/TWF0aC5tYXgoMCxkK2MpOmM6MDtmb3IoO2M8ZDtjKyspaWYoYyBpbiBiJiZiW2NdPT09YSlyZXR1cm4gY31yZXR1cm4tMX0sbWVyZ2U6ZnVuY3Rpb24oYSxjKXt2YXIgZD1hLmxlbmd0aCxlPTA7aWYodHlwZW9mIGMubGVuZ3RoPT0ibnVtYmVyIilmb3IodmFyIGY9Yy5sZW5ndGg7ZTxmO2UrKylhW2QrK109Y1tlXTtlbHNlIHdoaWxlKGNbZV0hPT1iKWFbZCsrXT1jW2UrK107YS5sZW5ndGg9ZDtyZXR1cm4gYX0sZ3JlcDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9W10sZTtjPSEhYztmb3IodmFyIGY9MCxnPWEubGVuZ3RoO2Y8ZztmKyspZT0hIWIoYVtmXSxmKSxjIT09ZSYmZC5wdXNoKGFbZl0pO3JldHVybiBkfSxtYXA6ZnVuY3Rpb24oYSxjLGQpe3ZhciBmLGcsaD1bXSxpPTAsaj1hLmxlbmd0aCxrPWEgaW5zdGFuY2VvZiBlfHxqIT09YiYmdHlwZW9mIGo9PSJudW1iZXIiJiYoaj4wJiZhWzBdJiZhW2otMV18fGo9PT0wfHxlLmlzQXJyYXkoYSkpO2lmKGspZm9yKDtpPGo7aSsrKWY9YyhhW2ldLGksZCksZiE9bnVsbCYmKGhbaC5sZW5ndGhdPWYpO2Vsc2UgZm9yKGcgaW4gYSlmPWMoYVtnXSxnLGQpLGYhPW51bGwmJihoW2gubGVuZ3RoXT1mKTtyZXR1cm4gaC5jb25jYXQuYXBwbHkoW10saCl9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihhLGMpe2lmKHR5cGVvZiBjPT0ic3RyaW5nIil7dmFyIGQ9YVtjXTtjPWEsYT1kfWlmKCFlLmlzRnVuY3Rpb24oYSkpcmV0dXJuIGI7dmFyIGY9Ri5jYWxsKGFyZ3VtZW50cywyKSxnPWZ1bmN0aW9uKCl7cmV0dXJuIGEuYXBwbHkoYyxmLmNvbmNhdChGLmNhbGwoYXJndW1lbnRzKSkpfTtnLmd1aWQ9YS5ndWlkPWEuZ3VpZHx8Zy5ndWlkfHxlLmd1aWQrKztyZXR1cm4gZ30sYWNjZXNzOmZ1bmN0aW9uKGEsYyxkLGYsZyxoLGkpe3ZhciBqLGs9ZD09bnVsbCxsPTAsbT1hLmxlbmd0aDtpZihkJiZ0eXBlb2YgZD09Im9iamVjdCIpe2ZvcihsIGluIGQpZS5hY2Nlc3MoYSxjLGwsZFtsXSwxLGgsZik7Zz0xfWVsc2UgaWYoZiE9PWIpe2o9aT09PWImJmUuaXNGdW5jdGlvbihmKSxrJiYoaj8oaj1jLGM9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBqLmNhbGwoZShhKSxjKX0pOihjLmNhbGwoYSxmKSxjPW51bGwpKTtpZihjKWZvcig7bDxtO2wrKyljKGFbbF0sZCxqP2YuY2FsbChhW2xdLGwsYyhhW2xdLGQpKTpmLGkpO2c9MX1yZXR1cm4gZz9hOms/Yy5jYWxsKGEpOm0/YyhhWzBdLGQpOmh9LG5vdzpmdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfSx1YU1hdGNoOmZ1bmN0aW9uKGEpe2E9YS50b0xvd2VyQ2FzZSgpO3ZhciBiPXIuZXhlYyhhKXx8cy5leGVjKGEpfHx0LmV4ZWMoYSl8fGEuaW5kZXhPZigiY29tcGF0aWJsZSIpPDAmJnUuZXhlYyhhKXx8W107cmV0dXJue2Jyb3dzZXI6YlsxXXx8IiIsdmVyc2lvbjpiWzJdfHwiMCJ9fSxzdWI6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIsYyl7cmV0dXJuIG5ldyBhLmZuLmluaXQoYixjKX1lLmV4dGVuZCghMCxhLHRoaXMpLGEuc3VwZXJjbGFzcz10aGlzLGEuZm49YS5wcm90b3R5cGU9dGhpcygpLGEuZm4uY29uc3RydWN0b3I9YSxhLnN1Yj10aGlzLnN1YixhLmZuLmluaXQ9ZnVuY3Rpb24oZCxmKXtmJiZmIGluc3RhbmNlb2YgZSYmIShmIGluc3RhbmNlb2YgYSkmJihmPWEoZikpO3JldHVybiBlLmZuLmluaXQuY2FsbCh0aGlzLGQsZixiKX0sYS5mbi5pbml0LnByb3RvdHlwZT1hLmZuO3ZhciBiPWEoYyk7cmV0dXJuIGF9LGJyb3dzZXI6e319KSxlLmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtJWyJbb2JqZWN0ICIrYisiXSJdPWIudG9Mb3dlckNhc2UoKX0pLHo9ZS51YU1hdGNoKHkpLHouYnJvd3NlciYmKGUuYnJvd3Nlclt6LmJyb3dzZXJdPSEwLGUuYnJvd3Nlci52ZXJzaW9uPXoudmVyc2lvbiksZS5icm93c2VyLndlYmtpdCYmKGUuYnJvd3Nlci5zYWZhcmk9ITApLGoudGVzdCgiw4IgIikmJihrPS9eW1xzXHhBMF0rLyxsPS9bXHNceEEwXSskLyksaD1lKGMpLGMuYWRkRXZlbnRMaXN0ZW5lcj9CPWZ1bmN0aW9uKCl7Yy5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixCLCExKSxlLnJlYWR5KCl9OmMuYXR0YWNoRXZlbnQmJihCPWZ1bmN0aW9uKCl7Yy5yZWFkeVN0YXRlPT09ImNvbXBsZXRlIiYmKGMuZGV0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsQiksZS5yZWFkeSgpKX0pO3JldHVybiBlfSgpLGc9e307Zi5DYWxsYmFja3M9ZnVuY3Rpb24oYSl7YT1hP2dbYV18fGgoYSk6e307dmFyIGM9W10sZD1bXSxlLGksaixrLGwsbSxuPWZ1bmN0aW9uKGIpe3ZhciBkLGUsZyxoLGk7Zm9yKGQ9MCxlPWIubGVuZ3RoO2Q8ZTtkKyspZz1iW2RdLGg9Zi50eXBlKGcpLGg9PT0iYXJyYXkiP24oZyk6aD09PSJmdW5jdGlvbiImJighYS51bmlxdWV8fCFwLmhhcyhnKSkmJmMucHVzaChnKX0sbz1mdW5jdGlvbihiLGYpe2Y9Znx8W10sZT0hYS5tZW1vcnl8fFtiLGZdLGk9ITAsaj0hMCxtPWt8fDAsaz0wLGw9Yy5sZW5ndGg7Zm9yKDtjJiZtPGw7bSsrKWlmKGNbbV0uYXBwbHkoYixmKT09PSExJiZhLnN0b3BPbkZhbHNlKXtlPSEwO2JyZWFrfWo9ITEsYyYmKGEub25jZT9lPT09ITA/cC5kaXNhYmxlKCk6Yz1bXTpkJiZkLmxlbmd0aCYmKGU9ZC5zaGlmdCgpLHAuZmlyZVdpdGgoZVswXSxlWzFdKSkpfSxwPXthZGQ6ZnVuY3Rpb24oKXtpZihjKXt2YXIgYT1jLmxlbmd0aDtuKGFyZ3VtZW50cyksaj9sPWMubGVuZ3RoOmUmJmUhPT0hMCYmKGs9YSxvKGVbMF0sZVsxXSkpfXJldHVybiB0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXtpZihjKXt2YXIgYj1hcmd1bWVudHMsZD0wLGU9Yi5sZW5ndGg7Zm9yKDtkPGU7ZCsrKWZvcih2YXIgZj0wO2Y8Yy5sZW5ndGg7ZisrKWlmKGJbZF09PT1jW2ZdKXtqJiZmPD1sJiYobC0tLGY8PW0mJm0tLSksYy5zcGxpY2UoZi0tLDEpO2lmKGEudW5pcXVlKWJyZWFrfX1yZXR1cm4gdGhpc30saGFzOmZ1bmN0aW9uKGEpe2lmKGMpe3ZhciBiPTAsZD1jLmxlbmd0aDtmb3IoO2I8ZDtiKyspaWYoYT09PWNbYl0pcmV0dXJuITB9cmV0dXJuITF9LGVtcHR5OmZ1bmN0aW9uKCl7Yz1bXTtyZXR1cm4gdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe2M9ZD1lPWI7cmV0dXJuIHRoaXN9LGRpc2FibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIWN9LGxvY2s6ZnVuY3Rpb24oKXtkPWIsKCFlfHxlPT09ITApJiZwLmRpc2FibGUoKTtyZXR1cm4gdGhpc30sbG9ja2VkOmZ1bmN0aW9uKCl7cmV0dXJuIWR9LGZpcmVXaXRoOmZ1bmN0aW9uKGIsYyl7ZCYmKGo/YS5vbmNlfHxkLnB1c2goW2IsY10pOighYS5vbmNlfHwhZSkmJm8oYixjKSk7cmV0dXJuIHRoaXN9LGZpcmU6ZnVuY3Rpb24oKXtwLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gdGhpc30sZmlyZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIWl9fTtyZXR1cm4gcH07dmFyIGk9W10uc2xpY2U7Zi5leHRlbmQoe0RlZmVycmVkOmZ1bmN0aW9uKGEpe3ZhciBiPWYuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLGM9Zi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksZD1mLkNhbGxiYWNrcygibWVtb3J5IiksZT0icGVuZGluZyIsZz17cmVzb2x2ZTpiLHJlamVjdDpjLG5vdGlmeTpkfSxoPXtkb25lOmIuYWRkLGZhaWw6Yy5hZGQscHJvZ3Jlc3M6ZC5hZGQsc3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gZX0saXNSZXNvbHZlZDpiLmZpcmVkLGlzUmVqZWN0ZWQ6Yy5maXJlZCx0aGVuOmZ1bmN0aW9uKGEsYixjKXtpLmRvbmUoYSkuZmFpbChiKS5wcm9ncmVzcyhjKTtyZXR1cm4gdGhpc30sYWx3YXlzOmZ1bmN0aW9uKCl7aS5kb25lLmFwcGx5KGksYXJndW1lbnRzKS5mYWlsLmFwcGx5KGksYXJndW1lbnRzKTtyZXR1cm4gdGhpc30scGlwZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuRGVmZXJyZWQoZnVuY3Rpb24oZCl7Zi5lYWNoKHtkb25lOlthLCJyZXNvbHZlIl0sZmFpbDpbYiwicmVqZWN0Il0scHJvZ3Jlc3M6W2MsIm5vdGlmeSJdfSxmdW5jdGlvbihhLGIpe3ZhciBjPWJbMF0sZT1iWzFdLGc7Zi5pc0Z1bmN0aW9uKGMpP2lbYV0oZnVuY3Rpb24oKXtnPWMuYXBwbHkodGhpcyxhcmd1bWVudHMpLGcmJmYuaXNGdW5jdGlvbihnLnByb21pc2UpP2cucHJvbWlzZSgpLnRoZW4oZC5yZXNvbHZlLGQucmVqZWN0LGQubm90aWZ5KTpkW2UrIldpdGgiXSh0aGlzPT09aT9kOnRoaXMsW2ddKX0pOmlbYV0oZFtlXSl9KX0pLnByb21pc2UoKX0scHJvbWlzZTpmdW5jdGlvbihhKXtpZihhPT1udWxsKWE9aDtlbHNlIGZvcih2YXIgYiBpbiBoKWFbYl09aFtiXTtyZXR1cm4gYX19LGk9aC5wcm9taXNlKHt9KSxqO2ZvcihqIGluIGcpaVtqXT1nW2pdLmZpcmUsaVtqKyJXaXRoIl09Z1tqXS5maXJlV2l0aDtpLmRvbmUoZnVuY3Rpb24oKXtlPSJyZXNvbHZlZCJ9LGMuZGlzYWJsZSxkLmxvY2spLmZhaWwoZnVuY3Rpb24oKXtlPSJyZWplY3RlZCJ9LGIuZGlzYWJsZSxkLmxvY2spLGEmJmEuY2FsbChpLGkpO3JldHVybiBpfSx3aGVuOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIG0oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe2VbYV09YXJndW1lbnRzLmxlbmd0aD4xP2kuY2FsbChhcmd1bWVudHMsMCk6YixqLm5vdGlmeVdpdGgoayxlKX19ZnVuY3Rpb24gbChhKXtyZXR1cm4gZnVuY3Rpb24oYyl7YlthXT1hcmd1bWVudHMubGVuZ3RoPjE/aS5jYWxsKGFyZ3VtZW50cywwKTpjLC0tZ3x8ai5yZXNvbHZlV2l0aChqLGIpfX12YXIgYj1pLmNhbGwoYXJndW1lbnRzLDApLGM9MCxkPWIubGVuZ3RoLGU9QXJyYXkoZCksZz1kLGg9ZCxqPWQ8PTEmJmEmJmYuaXNGdW5jdGlvbihhLnByb21pc2UpP2E6Zi5EZWZlcnJlZCgpLGs9ai5wcm9taXNlKCk7aWYoZD4xKXtmb3IoO2M8ZDtjKyspYltjXSYmYltjXS5wcm9taXNlJiZmLmlzRnVuY3Rpb24oYltjXS5wcm9taXNlKT9iW2NdLnByb21pc2UoKS50aGVuKGwoYyksai5yZWplY3QsbShjKSk6LS1nO2d8fGoucmVzb2x2ZVdpdGgoaixiKX1lbHNlIGohPT1hJiZqLnJlc29sdmVXaXRoKGosZD9bYV06W10pO3JldHVybiBrfX0pLGYuc3VwcG9ydD1mdW5jdGlvbigpe3ZhciBiLGQsZSxnLGgsaSxqLGssbCxtLG4sbyxwPWMuY3JlYXRlRWxlbWVudCgiZGl2IikscT1jLmRvY3VtZW50RWxlbWVudDtwLnNldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIiwidCIpLHAuaW5uZXJIVE1MPSIgICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnIHN0eWxlPSd0b3A6MXB4O2Zsb2F0OmxlZnQ7b3BhY2l0eTouNTU7Jz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiIsZD1wLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIiksZT1wLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF07aWYoIWR8fCFkLmxlbmd0aHx8IWUpcmV0dXJue307Zz1jLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLGg9Zy5hcHBlbmRDaGlsZChjLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKSxpPXAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IilbMF0sYj17bGVhZGluZ1doaXRlc3BhY2U6cC5maXJzdENoaWxkLm5vZGVUeXBlPT09Myx0Ym9keTohcC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsaHRtbFNlcmlhbGl6ZTohIXAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKS5sZW5ndGgsc3R5bGU6L3RvcC8udGVzdChlLmdldEF0dHJpYnV0ZSgic3R5bGUiKSksaHJlZk5vcm1hbGl6ZWQ6ZS5nZXRBdHRyaWJ1dGUoImhyZWYiKT09PSIvYSIsb3BhY2l0eTovXjAuNTUvLnRlc3QoZS5zdHlsZS5vcGFjaXR5KSxjc3NGbG9hdDohIWUuc3R5bGUuY3NzRmxvYXQsY2hlY2tPbjppLnZhbHVlPT09Im9uIixvcHRTZWxlY3RlZDpoLnNlbGVjdGVkLGdldFNldEF0dHJpYnV0ZTpwLmNsYXNzTmFtZSE9PSJ0IixlbmN0eXBlOiEhYy5jcmVhdGVFbGVtZW50KCJmb3JtIikuZW5jdHlwZSxodG1sNUNsb25lOmMuY3JlYXRlRWxlbWVudCgibmF2IikuY2xvbmVOb2RlKCEwKS5vdXRlckhUTUwhPT0iPDpuYXY+PC86bmF2PiIsc3VibWl0QnViYmxlczohMCxjaGFuZ2VCdWJibGVzOiEwLGZvY3VzaW5CdWJibGVzOiExLGRlbGV0ZUV4cGFuZG86ITAsbm9DbG9uZUV2ZW50OiEwLGlubGluZUJsb2NrTmVlZHNMYXlvdXQ6ITEsc2hyaW5rV3JhcEJsb2NrczohMSxyZWxpYWJsZU1hcmdpblJpZ2h0OiEwLHBpeGVsTWFyZ2luOiEwfSxmLmJveE1vZGVsPWIuYm94TW9kZWw9Yy5jb21wYXRNb2RlPT09IkNTUzFDb21wYXQiLGkuY2hlY2tlZD0hMCxiLm5vQ2xvbmVDaGVja2VkPWkuY2xvbmVOb2RlKCEwKS5jaGVja2VkLGcuZGlzYWJsZWQ9ITAsYi5vcHREaXNhYmxlZD0haC5kaXNhYmxlZDt0cnl7ZGVsZXRlIHAudGVzdH1jYXRjaChyKXtiLmRlbGV0ZUV4cGFuZG89ITF9IXAuYWRkRXZlbnRMaXN0ZW5lciYmcC5hdHRhY2hFdmVudCYmcC5maXJlRXZlbnQmJihwLmF0dGFjaEV2ZW50KCJvbmNsaWNrIixmdW5jdGlvbigpe2Iubm9DbG9uZUV2ZW50PSExfSkscC5jbG9uZU5vZGUoITApLmZpcmVFdmVudCgib25jbGljayIpKSxpPWMuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxpLnZhbHVlPSJ0IixpLnNldEF0dHJpYnV0ZSgidHlwZSIsInJhZGlvIiksYi5yYWRpb1ZhbHVlPWkudmFsdWU9PT0idCIsaS5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIiksaS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJ0IikscC5hcHBlbmRDaGlsZChpKSxqPWMuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLGouYXBwZW5kQ2hpbGQocC5sYXN0Q2hpbGQpLGIuY2hlY2tDbG9uZT1qLmNsb25lTm9kZSghMCkuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuY2hlY2tlZCxiLmFwcGVuZENoZWNrZWQ9aS5jaGVja2VkLGoucmVtb3ZlQ2hpbGQoaSksai5hcHBlbmRDaGlsZChwKTtpZihwLmF0dGFjaEV2ZW50KWZvcihuIGlue3N1Ym1pdDoxLGNoYW5nZToxLGZvY3VzaW46MX0pbT0ib24iK24sbz1tIGluIHAsb3x8KHAuc2V0QXR0cmlidXRlKG0sInJldHVybjsiKSxvPXR5cGVvZiBwW21dPT0iZnVuY3Rpb24iKSxiW24rIkJ1YmJsZXMiXT1vO2oucmVtb3ZlQ2hpbGQocCksaj1nPWg9cD1pPW51bGwsZihmdW5jdGlvbigpe3ZhciBkLGUsZyxoLGksaixsLG0sbixxLHIscyx0LHU9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdOyF1fHwobT0xLHQ9InBhZGRpbmc6MDttYXJnaW46MDtib3JkZXI6IixyPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7d2lkdGg6MXB4O2hlaWdodDoxcHg7IixzPXQrIjA7dmlzaWJpbGl0eTpoaWRkZW47IixuPSJzdHlsZT0nIityK3QrIjVweCBzb2xpZCAjMDAwOyIscT0iPGRpdiAiK24rImRpc3BsYXk6YmxvY2s7Jz48ZGl2IHN0eWxlPSciK3QrIjA7ZGlzcGxheTpibG9jaztvdmVyZmxvdzpoaWRkZW47Jz48L2Rpdj48L2Rpdj4iKyI8dGFibGUgIituKyInIGNlbGxwYWRkaW5nPScwJyBjZWxsc3BhY2luZz0nMCc+IisiPHRyPjx0ZD48L3RkPjwvdHI+PC90YWJsZT4iLGQ9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKSxkLnN0eWxlLmNzc1RleHQ9cysid2lkdGg6MDtoZWlnaHQ6MDtwb3NpdGlvbjpzdGF0aWM7dG9wOjA7bWFyZ2luLXRvcDoiK20rInB4Iix1Lmluc2VydEJlZm9yZShkLHUuZmlyc3RDaGlsZCkscD1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQuYXBwZW5kQ2hpbGQocCkscC5pbm5lckhUTUw9Ijx0YWJsZT48dHI+PHRkIHN0eWxlPSciK3QrIjA7ZGlzcGxheTpub25lJz48L3RkPjx0ZD50PC90ZD48L3RyPjwvdGFibGU+IixrPXAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIiksbz1rWzBdLm9mZnNldEhlaWdodD09PTAsa1swXS5zdHlsZS5kaXNwbGF5PSIiLGtbMV0uc3R5bGUuZGlzcGxheT0ibm9uZSIsYi5yZWxpYWJsZUhpZGRlbk9mZnNldHM9byYma1swXS5vZmZzZXRIZWlnaHQ9PT0wLGEuZ2V0Q29tcHV0ZWRTdHlsZSYmKHAuaW5uZXJIVE1MPSIiLGw9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKSxsLnN0eWxlLndpZHRoPSIwIixsLnN0eWxlLm1hcmdpblJpZ2h0PSIwIixwLnN0eWxlLndpZHRoPSIycHgiLHAuYXBwZW5kQ2hpbGQobCksYi5yZWxpYWJsZU1hcmdpblJpZ2h0PShwYXJzZUludCgoYS5nZXRDb21wdXRlZFN0eWxlKGwsbnVsbCl8fHttYXJnaW5SaWdodDowfSkubWFyZ2luUmlnaHQsMTApfHwwKT09PTApLHR5cGVvZiBwLnN0eWxlLnpvb20hPSJ1bmRlZmluZWQiJiYocC5pbm5lckhUTUw9IiIscC5zdHlsZS53aWR0aD1wLnN0eWxlLnBhZGRpbmc9IjFweCIscC5zdHlsZS5ib3JkZXI9MCxwLnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iLHAuc3R5bGUuZGlzcGxheT0iaW5saW5lIixwLnN0eWxlLnpvb209MSxiLmlubGluZUJsb2NrTmVlZHNMYXlvdXQ9cC5vZmZzZXRXaWR0aD09PTMscC5zdHlsZS5kaXNwbGF5PSJibG9jayIscC5zdHlsZS5vdmVyZmxvdz0idmlzaWJsZSIscC5pbm5lckhUTUw9IjxkaXYgc3R5bGU9J3dpZHRoOjVweDsnPjwvZGl2PiIsYi5zaHJpbmtXcmFwQmxvY2tzPXAub2Zmc2V0V2lkdGghPT0zKSxwLnN0eWxlLmNzc1RleHQ9citzLHAuaW5uZXJIVE1MPXEsZT1wLmZpcnN0Q2hpbGQsZz1lLmZpcnN0Q2hpbGQsaT1lLm5leHRTaWJsaW5nLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZCxqPXtkb2VzTm90QWRkQm9yZGVyOmcub2Zmc2V0VG9wIT09NSxkb2VzQWRkQm9yZGVyRm9yVGFibGVBbmRDZWxsczppLm9mZnNldFRvcD09PTV9LGcuc3R5bGUucG9zaXRpb249ImZpeGVkIixnLnN0eWxlLnRvcD0iMjBweCIsai5maXhlZFBvc2l0aW9uPWcub2Zmc2V0VG9wPT09MjB8fGcub2Zmc2V0VG9wPT09MTUsZy5zdHlsZS5wb3NpdGlvbj1nLnN0eWxlLnRvcD0iIixlLnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iLGUuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixqLnN1YnRyYWN0c0JvcmRlckZvck92ZXJmbG93Tm90VmlzaWJsZT1nLm9mZnNldFRvcD09PS01LGouZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQ9dS5vZmZzZXRUb3AhPT1tLGEuZ2V0Q29tcHV0ZWRTdHlsZSYmKHAuc3R5bGUubWFyZ2luVG9wPSIxJSIsYi5waXhlbE1hcmdpbj0oYS5nZXRDb21wdXRlZFN0eWxlKHAsbnVsbCl8fHttYXJnaW5Ub3A6MH0pLm1hcmdpblRvcCE9PSIxJSIpLHR5cGVvZiBkLnN0eWxlLnpvb20hPSJ1bmRlZmluZWQiJiYoZC5zdHlsZS56b29tPTEpLHUucmVtb3ZlQ2hpbGQoZCksbD1wPWQ9bnVsbCxmLmV4dGVuZChiLGopKX0pO3JldHVybiBifSgpO3ZhciBqPS9eKD86XHsuKlx9fFxbLipcXSkkLyxrPS8oW0EtWl0pL2c7Zi5leHRlbmQoe2NhY2hlOnt9LHV1aWQ6MCxleHBhbmRvOiJqUXVlcnkiKyhmLmZuLmpxdWVyeStNYXRoLnJhbmRvbSgpKS5yZXBsYWNlKC9cRC9nLCIiKSxub0RhdGE6e2VtYmVkOiEwLG9iamVjdDoiY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIixhcHBsZXQ6ITB9LGhhc0RhdGE6ZnVuY3Rpb24oYSl7YT1hLm5vZGVUeXBlP2YuY2FjaGVbYVtmLmV4cGFuZG9dXTphW2YuZXhwYW5kb107cmV0dXJuISFhJiYhbShhKX0sZGF0YTpmdW5jdGlvbihhLGMsZCxlKXtpZighIWYuYWNjZXB0RGF0YShhKSl7dmFyIGcsaCxpLGo9Zi5leHBhbmRvLGs9dHlwZW9mIGM9PSJzdHJpbmciLGw9YS5ub2RlVHlwZSxtPWw/Zi5jYWNoZTphLG49bD9hW2pdOmFbal0mJmosbz1jPT09ImV2ZW50cyI7aWYoKCFufHwhbVtuXXx8IW8mJiFlJiYhbVtuXS5kYXRhKSYmayYmZD09PWIpcmV0dXJuO258fChsP2Fbal09bj0rK2YudXVpZDpuPWopLG1bbl18fChtW25dPXt9LGx8fChtW25dLnRvSlNPTj1mLm5vb3ApKTtpZih0eXBlb2YgYz09Im9iamVjdCJ8fHR5cGVvZiBjPT0iZnVuY3Rpb24iKWU/bVtuXT1mLmV4dGVuZChtW25dLGMpOm1bbl0uZGF0YT1mLmV4dGVuZChtW25dLmRhdGEsYyk7Zz1oPW1bbl0sZXx8KGguZGF0YXx8KGguZGF0YT17fSksaD1oLmRhdGEpLGQhPT1iJiYoaFtmLmNhbWVsQ2FzZShjKV09ZCk7aWYobyYmIWhbY10pcmV0dXJuIGcuZXZlbnRzO2s/KGk9aFtjXSxpPT1udWxsJiYoaT1oW2YuY2FtZWxDYXNlKGMpXSkpOmk9aDtyZXR1cm4gaX19LHJlbW92ZURhdGE6ZnVuY3Rpb24oYSxiLGMpe2lmKCEhZi5hY2NlcHREYXRhKGEpKXt2YXIgZCxlLGcsaD1mLmV4cGFuZG8saT1hLm5vZGVUeXBlLGo9aT9mLmNhY2hlOmEsaz1pP2FbaF06aDtpZighaltrXSlyZXR1cm47aWYoYil7ZD1jP2pba106altrXS5kYXRhO2lmKGQpe2YuaXNBcnJheShiKXx8KGIgaW4gZD9iPVtiXTooYj1mLmNhbWVsQ2FzZShiKSxiIGluIGQ/Yj1bYl06Yj1iLnNwbGl0KCIgIikpKTtmb3IoZT0wLGc9Yi5sZW5ndGg7ZTxnO2UrKylkZWxldGUgZFtiW2VdXTtpZighKGM/bTpmLmlzRW1wdHlPYmplY3QpKGQpKXJldHVybn19aWYoIWMpe2RlbGV0ZSBqW2tdLmRhdGE7aWYoIW0oaltrXSkpcmV0dXJufWYuc3VwcG9ydC5kZWxldGVFeHBhbmRvfHwhai5zZXRJbnRlcnZhbD9kZWxldGUgaltrXTpqW2tdPW51bGwsaSYmKGYuc3VwcG9ydC5kZWxldGVFeHBhbmRvP2RlbGV0ZSBhW2hdOmEucmVtb3ZlQXR0cmlidXRlP2EucmVtb3ZlQXR0cmlidXRlKGgpOmFbaF09bnVsbCl9fSxfZGF0YTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuZGF0YShhLGIsYywhMCl9LGFjY2VwdERhdGE6ZnVuY3Rpb24oYSl7aWYoYS5ub2RlTmFtZSl7dmFyIGI9Zi5ub0RhdGFbYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXTtpZihiKXJldHVybiBiIT09ITAmJmEuZ2V0QXR0cmlidXRlKCJjbGFzc2lkIik9PT1ifXJldHVybiEwfX0pLGYuZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGEsYyl7dmFyIGQsZSxnLGgsaSxqPXRoaXNbMF0saz0wLG09bnVsbDtpZihhPT09Yil7aWYodGhpcy5sZW5ndGgpe209Zi5kYXRhKGopO2lmKGoubm9kZVR5cGU9PT0xJiYhZi5fZGF0YShqLCJwYXJzZWRBdHRycyIpKXtnPWouYXR0cmlidXRlcztmb3IoaT1nLmxlbmd0aDtrPGk7aysrKWg9Z1trXS5uYW1lLGguaW5kZXhPZigiZGF0YS0iKT09PTAmJihoPWYuY2FtZWxDYXNlKGguc3Vic3RyaW5nKDUpKSxsKGosaCxtW2hdKSk7Zi5fZGF0YShqLCJwYXJzZWRBdHRycyIsITApfX1yZXR1cm4gbX1pZih0eXBlb2YgYT09Im9iamVjdCIpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YuZGF0YSh0aGlzLGEpfSk7ZD1hLnNwbGl0KCIuIiwyKSxkWzFdPWRbMV0/Ii4iK2RbMV06IiIsZT1kWzFdKyIhIjtyZXR1cm4gZi5hY2Nlc3ModGhpcyxmdW5jdGlvbihjKXtpZihjPT09Yil7bT10aGlzLnRyaWdnZXJIYW5kbGVyKCJnZXREYXRhIitlLFtkWzBdXSksbT09PWImJmomJihtPWYuZGF0YShqLGEpLG09bChqLGEsbSkpO3JldHVybiBtPT09YiYmZFsxXT90aGlzLmRhdGEoZFswXSk6bX1kWzFdPWMsdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9Zih0aGlzKTtiLnRyaWdnZXJIYW5kbGVyKCJzZXREYXRhIitlLGQpLGYuZGF0YSh0aGlzLGEsYyksYi50cmlnZ2VySGFuZGxlcigiY2hhbmdlRGF0YSIrZSxkKX0pfSxudWxsLGMsYXJndW1lbnRzLmxlbmd0aD4xLG51bGwsITEpfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmLnJlbW92ZURhdGEodGhpcyxhKX0pfX0pLGYuZXh0ZW5kKHtfbWFyazpmdW5jdGlvbihhLGIpe2EmJihiPShifHwiZngiKSsibWFyayIsZi5fZGF0YShhLGIsKGYuX2RhdGEoYSxiKXx8MCkrMSkpfSxfdW5tYXJrOmZ1bmN0aW9uKGEsYixjKXthIT09ITAmJihjPWIsYj1hLGE9ITEpO2lmKGIpe2M9Y3x8ImZ4Ijt2YXIgZD1jKyJtYXJrIixlPWE/MDooZi5fZGF0YShiLGQpfHwxKS0xO2U/Zi5fZGF0YShiLGQsZSk6KGYucmVtb3ZlRGF0YShiLGQsITApLG4oYixjLCJtYXJrIikpfX0scXVldWU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2lmKGEpe2I9KGJ8fCJmeCIpKyJxdWV1ZSIsZD1mLl9kYXRhKGEsYiksYyYmKCFkfHxmLmlzQXJyYXkoYyk/ZD1mLl9kYXRhKGEsYixmLm1ha2VBcnJheShjKSk6ZC5wdXNoKGMpKTtyZXR1cm4gZHx8W119fSxkZXF1ZXVlOmZ1bmN0aW9uKGEsYil7Yj1ifHwiZngiO3ZhciBjPWYucXVldWUoYSxiKSxkPWMuc2hpZnQoKSxlPXt9O2Q9PT0iaW5wcm9ncmVzcyImJihkPWMuc2hpZnQoKSksZCYmKGI9PT0iZngiJiZjLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxmLl9kYXRhKGEsYisiLnJ1biIsZSksZC5jYWxsKGEsZnVuY3Rpb24oKXtmLmRlcXVldWUoYSxiKX0sZSkpLGMubGVuZ3RofHwoZi5yZW1vdmVEYXRhKGEsYisicXVldWUgIitiKyIucnVuIiwhMCksbihhLGIsInF1ZXVlIikpfX0pLGYuZm4uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGMpe3ZhciBkPTI7dHlwZW9mIGEhPSJzdHJpbmciJiYoYz1hLGE9ImZ4IixkLS0pO2lmKGFyZ3VtZW50cy5sZW5ndGg8ZClyZXR1cm4gZi5xdWV1ZSh0aGlzWzBdLGEpO3JldHVybiBjPT09Yj90aGlzOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPWYucXVldWUodGhpcyxhLGMpO2E9PT0iZngiJiZiWzBdIT09ImlucHJvZ3Jlc3MiJiZmLmRlcXVldWUodGhpcyxhKX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmLmRlcXVldWUodGhpcyxhKX0pfSxkZWxheTpmdW5jdGlvbihhLGIpe2E9Zi5meD9mLmZ4LnNwZWVkc1thXXx8YTphLGI9Ynx8ImZ4IjtyZXR1cm4gdGhpcy5xdWV1ZShiLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9c2V0VGltZW91dChiLGEpO2Muc3RvcD1mdW5jdGlvbigpe2NsZWFyVGltZW91dChkKX19KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5xdWV1ZShhfHwiZngiLFtdKX0scHJvbWlzZTpmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIG0oKXstLWh8fGQucmVzb2x2ZVdpdGgoZSxbZV0pfXR5cGVvZiBhIT0ic3RyaW5nIiYmKGM9YSxhPWIpLGE9YXx8ImZ4Ijt2YXIgZD1mLkRlZmVycmVkKCksZT10aGlzLGc9ZS5sZW5ndGgsaD0xLGk9YSsiZGVmZXIiLGo9YSsicXVldWUiLGs9YSsibWFyayIsbDt3aGlsZShnLS0paWYobD1mLmRhdGEoZVtnXSxpLGIsITApfHwoZi5kYXRhKGVbZ10saixiLCEwKXx8Zi5kYXRhKGVbZ10sayxiLCEwKSkmJmYuZGF0YShlW2ddLGksZi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksITApKWgrKyxsLmFkZChtKTttKCk7cmV0dXJuIGQucHJvbWlzZShjKX19KTt2YXIgbz0vW1xuXHRccl0vZyxwPS9ccysvLHE9L1xyL2cscj0vXig/OmJ1dHRvbnxpbnB1dCkkL2kscz0vXig/OmJ1dHRvbnxpbnB1dHxvYmplY3R8c2VsZWN0fHRleHRhcmVhKSQvaSx0PS9eYSg/OnJlYSk/JC9pLHU9L14oPzphdXRvZm9jdXN8YXV0b3BsYXl8YXN5bmN8Y2hlY2tlZHxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZHxzZWxlY3RlZCkkL2ksdj1mLnN1cHBvcnQuZ2V0U2V0QXR0cmlidXRlLHcseCx5O2YuZm4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGYuYWNjZXNzKHRoaXMsZi5hdHRyLGEsYixhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmLnJlbW92ZUF0dHIodGhpcyxhKX0pfSxwcm9wOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGYuYWNjZXNzKHRoaXMsZi5wcm9wLGEsYixhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVQcm9wOmZ1bmN0aW9uKGEpe2E9Zi5wcm9wRml4W2FdfHxhO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt0cnl7dGhpc1thXT1iLGRlbGV0ZSB0aGlzW2FdfWNhdGNoKGMpe319KX0sYWRkQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZyxoLGk7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Zih0aGlzKS5hZGRDbGFzcyhhLmNhbGwodGhpcyxiLHRoaXMuY2xhc3NOYW1lKSl9KTtpZihhJiZ0eXBlb2YgYT09InN0cmluZyIpe2I9YS5zcGxpdChwKTtmb3IoYz0wLGQ9dGhpcy5sZW5ndGg7YzxkO2MrKyl7ZT10aGlzW2NdO2lmKGUubm9kZVR5cGU9PT0xKWlmKCFlLmNsYXNzTmFtZSYmYi5sZW5ndGg9PT0xKWUuY2xhc3NOYW1lPWE7ZWxzZXtnPSIgIitlLmNsYXNzTmFtZSsiICI7Zm9yKGg9MCxpPWIubGVuZ3RoO2g8aTtoKyspfmcuaW5kZXhPZigiICIrYltoXSsiICIpfHwoZys9YltoXSsiICIpO2UuY2xhc3NOYW1lPWYudHJpbShnKX19fXJldHVybiB0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbihhKXt2YXIgYyxkLGUsZyxoLGksajtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtmKHRoaXMpLnJlbW92ZUNsYXNzKGEuY2FsbCh0aGlzLGIsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGEmJnR5cGVvZiBhPT0ic3RyaW5nInx8YT09PWIpe2M9KGF8fCIiKS5zcGxpdChwKTtmb3IoZD0wLGU9dGhpcy5sZW5ndGg7ZDxlO2QrKyl7Zz10aGlzW2RdO2lmKGcubm9kZVR5cGU9PT0xJiZnLmNsYXNzTmFtZSlpZihhKXtoPSgiICIrZy5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKG8sIiAiKTtmb3IoaT0wLGo9Yy5sZW5ndGg7aTxqO2krKyloPWgucmVwbGFjZSgiICIrY1tpXSsiICIsIiAiKTtnLmNsYXNzTmFtZT1mLnRyaW0oaCl9ZWxzZSBnLmNsYXNzTmFtZT0iIn19cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGEsZD10eXBlb2YgYj09ImJvb2xlYW4iO2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGMpe2YodGhpcykudG9nZ2xlQ2xhc3MoYS5jYWxsKHRoaXMsYyx0aGlzLmNsYXNzTmFtZSxiKSxiKX0pO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtpZihjPT09InN0cmluZyIpe3ZhciBlLGc9MCxoPWYodGhpcyksaT1iLGo9YS5zcGxpdChwKTt3aGlsZShlPWpbZysrXSlpPWQ/aTohaC5oYXNDbGFzcyhlKSxoW2k/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiXShlKX1lbHNlIGlmKGM9PT0idW5kZWZpbmVkInx8Yz09PSJib29sZWFuIil0aGlzLmNsYXNzTmFtZSYmZi5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIix0aGlzLmNsYXNzTmFtZSksdGhpcy5jbGFzc05hbWU9dGhpcy5jbGFzc05hbWV8fGE9PT0hMT8iIjpmLl9kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiJ9KX0saGFzQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGI9IiAiK2ErIiAiLGM9MCxkPXRoaXMubGVuZ3RoO2Zvcig7YzxkO2MrKylpZih0aGlzW2NdLm5vZGVUeXBlPT09MSYmKCIgIit0aGlzW2NdLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UobywiICIpLmluZGV4T2YoYik+LTEpcmV0dXJuITA7cmV0dXJuITF9LHZhbDpmdW5jdGlvbihhKXt2YXIgYyxkLGUsZz10aGlzWzBdO3tpZighIWFyZ3VtZW50cy5sZW5ndGgpe2U9Zi5pc0Z1bmN0aW9uKGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZCl7dmFyIGc9Zih0aGlzKSxoO2lmKHRoaXMubm9kZVR5cGU9PT0xKXtlP2g9YS5jYWxsKHRoaXMsZCxnLnZhbCgpKTpoPWEsaD09bnVsbD9oPSIiOnR5cGVvZiBoPT0ibnVtYmVyIj9oKz0iIjpmLmlzQXJyYXkoaCkmJihoPWYubWFwKGgsZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/IiI6YSsiIn0pKSxjPWYudmFsSG9va3NbdGhpcy50eXBlXXx8Zi52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldO2lmKCFjfHwhKCJzZXQiaW4gYyl8fGMuc2V0KHRoaXMsaCwidmFsdWUiKT09PWIpdGhpcy52YWx1ZT1ofX0pfWlmKGcpe2M9Zi52YWxIb29rc1tnLnR5cGVdfHxmLnZhbEhvb2tzW2cubm9kZU5hbWUudG9Mb3dlckNhc2UoKV07aWYoYyYmImdldCJpbiBjJiYoZD1jLmdldChnLCJ2YWx1ZSIpKSE9PWIpcmV0dXJuIGQ7ZD1nLnZhbHVlO3JldHVybiB0eXBlb2YgZD09InN0cmluZyI/ZC5yZXBsYWNlKHEsIiIpOmQ9PW51bGw/IiI6ZH19fX0pLGYuZXh0ZW5kKHt2YWxIb29rczp7b3B0aW9uOntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5hdHRyaWJ1dGVzLnZhbHVlO3JldHVybiFifHxiLnNwZWNpZmllZD9hLnZhbHVlOmEudGV4dH19LHNlbGVjdDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGc9YS5zZWxlY3RlZEluZGV4LGg9W10saT1hLm9wdGlvbnMsaj1hLnR5cGU9PT0ic2VsZWN0LW9uZSI7aWYoZzwwKXJldHVybiBudWxsO2M9aj9nOjAsZD1qP2crMTppLmxlbmd0aDtmb3IoO2M8ZDtjKyspe2U9aVtjXTtpZihlLnNlbGVjdGVkJiYoZi5zdXBwb3J0Lm9wdERpc2FibGVkPyFlLmRpc2FibGVkOmUuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpPT09bnVsbCkmJighZS5wYXJlbnROb2RlLmRpc2FibGVkfHwhZi5ub2RlTmFtZShlLnBhcmVudE5vZGUsIm9wdGdyb3VwIikpKXtiPWYoZSkudmFsKCk7aWYoailyZXR1cm4gYjtoLnB1c2goYil9fWlmKGomJiFoLmxlbmd0aCYmaS5sZW5ndGgpcmV0dXJuIGYoaVtnXSkudmFsKCk7cmV0dXJuIGh9LHNldDpmdW5jdGlvbihhLGIpe3ZhciBjPWYubWFrZUFycmF5KGIpO2YoYSkuZmluZCgib3B0aW9uIikuZWFjaChmdW5jdGlvbigpe3RoaXMuc2VsZWN0ZWQ9Zi5pbkFycmF5KGYodGhpcykudmFsKCksYyk+PTB9KSxjLmxlbmd0aHx8KGEuc2VsZWN0ZWRJbmRleD0tMSk7cmV0dXJuIGN9fX0sYXR0ckZuOnt2YWw6ITAsY3NzOiEwLGh0bWw6ITAsdGV4dDohMCxkYXRhOiEwLHdpZHRoOiEwLGhlaWdodDohMCxvZmZzZXQ6ITB9LGF0dHI6ZnVuY3Rpb24oYSxjLGQsZSl7dmFyIGcsaCxpLGo9YS5ub2RlVHlwZTtpZighIWEmJmohPT0zJiZqIT09OCYmaiE9PTIpe2lmKGUmJmMgaW4gZi5hdHRyRm4pcmV0dXJuIGYoYSlbY10oZCk7aWYodHlwZW9mIGEuZ2V0QXR0cmlidXRlPT0idW5kZWZpbmVkIilyZXR1cm4gZi5wcm9wKGEsYyxkKTtpPWohPT0xfHwhZi5pc1hNTERvYyhhKSxpJiYoYz1jLnRvTG93ZXJDYXNlKCksaD1mLmF0dHJIb29rc1tjXXx8KHUudGVzdChjKT94OncpKTtpZihkIT09Yil7aWYoZD09PW51bGwpe2YucmVtb3ZlQXR0cihhLGMpO3JldHVybn1pZihoJiYic2V0ImluIGgmJmkmJihnPWguc2V0KGEsZCxjKSkhPT1iKXJldHVybiBnO2Euc2V0QXR0cmlidXRlKGMsIiIrZCk7cmV0dXJuIGR9aWYoaCYmImdldCJpbiBoJiZpJiYoZz1oLmdldChhLGMpKSE9PW51bGwpcmV0dXJuIGc7Zz1hLmdldEF0dHJpYnV0ZShjKTtyZXR1cm4gZz09PW51bGw/YjpnfX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxnLGgsaT0wO2lmKGImJmEubm9kZVR5cGU9PT0xKXtkPWIudG9Mb3dlckNhc2UoKS5zcGxpdChwKSxnPWQubGVuZ3RoO2Zvcig7aTxnO2krKyllPWRbaV0sZSYmKGM9Zi5wcm9wRml4W2VdfHxlLGg9dS50ZXN0KGUpLGh8fGYuYXR0cihhLGUsIiIpLGEucmVtb3ZlQXR0cmlidXRlKHY/ZTpjKSxoJiZjIGluIGEmJihhW2NdPSExKSl9fSxhdHRySG9va3M6e3R5cGU6e3NldDpmdW5jdGlvbihhLGIpe2lmKHIudGVzdChhLm5vZGVOYW1lKSYmYS5wYXJlbnROb2RlKWYuZXJyb3IoInR5cGUgcHJvcGVydHkgY2FuJ3QgYmUgY2hhbmdlZCIpO2Vsc2UgaWYoIWYuc3VwcG9ydC5yYWRpb1ZhbHVlJiZiPT09InJhZGlvIiYmZi5ub2RlTmFtZShhLCJpbnB1dCIpKXt2YXIgYz1hLnZhbHVlO2Euc2V0QXR0cmlidXRlKCJ0eXBlIixiKSxjJiYoYS52YWx1ZT1jKTtyZXR1cm4gYn19fSx2YWx1ZTp7Z2V0OmZ1bmN0aW9uKGEsYil7aWYodyYmZi5ub2RlTmFtZShhLCJidXR0b24iKSlyZXR1cm4gdy5nZXQoYSxiKTtyZXR1cm4gYiBpbiBhP2EudmFsdWU6bnVsbH0sc2V0OmZ1bmN0aW9uKGEsYixjKXtpZih3JiZmLm5vZGVOYW1lKGEsImJ1dHRvbiIpKXJldHVybiB3LnNldChhLGIsYyk7YS52YWx1ZT1ifX19LHByb3BGaXg6e3RhYmluZGV4OiJ0YWJJbmRleCIscmVhZG9ubHk6InJlYWRPbmx5IiwiZm9yIjoiaHRtbEZvciIsImNsYXNzIjoiY2xhc3NOYW1lIixtYXhsZW5ndGg6Im1heExlbmd0aCIsY2VsbHNwYWNpbmc6ImNlbGxTcGFjaW5nIixjZWxscGFkZGluZzoiY2VsbFBhZGRpbmciLHJvd3NwYW46InJvd1NwYW4iLGNvbHNwYW46ImNvbFNwYW4iLHVzZW1hcDoidXNlTWFwIixmcmFtZWJvcmRlcjoiZnJhbWVCb3JkZXIiLGNvbnRlbnRlZGl0YWJsZToiY29udGVudEVkaXRhYmxlIn0scHJvcDpmdW5jdGlvbihhLGMsZCl7dmFyIGUsZyxoLGk9YS5ub2RlVHlwZTtpZighIWEmJmkhPT0zJiZpIT09OCYmaSE9PTIpe2g9aSE9PTF8fCFmLmlzWE1MRG9jKGEpLGgmJihjPWYucHJvcEZpeFtjXXx8YyxnPWYucHJvcEhvb2tzW2NdKTtyZXR1cm4gZCE9PWI/ZyYmInNldCJpbiBnJiYoZT1nLnNldChhLGQsYykpIT09Yj9lOmFbY109ZDpnJiYiZ2V0ImluIGcmJihlPWcuZ2V0KGEsYykpIT09bnVsbD9lOmFbY119fSxwcm9wSG9va3M6e3RhYkluZGV4OntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGVOb2RlKCJ0YWJpbmRleCIpO3JldHVybiBjJiZjLnNwZWNpZmllZD9wYXJzZUludChjLnZhbHVlLDEwKTpzLnRlc3QoYS5ub2RlTmFtZSl8fHQudGVzdChhLm5vZGVOYW1lKSYmYS5ocmVmPzA6Yn19fX0pLGYuYXR0ckhvb2tzLnRhYmluZGV4PWYucHJvcEhvb2tzLnRhYkluZGV4LHg9e2dldDpmdW5jdGlvbihhLGMpe3ZhciBkLGU9Zi5wcm9wKGEsYyk7cmV0dXJuIGU9PT0hMHx8dHlwZW9mIGUhPSJib29sZWFuIiYmKGQ9YS5nZXRBdHRyaWJ1dGVOb2RlKGMpKSYmZC5ub2RlVmFsdWUhPT0hMT9jLnRvTG93ZXJDYXNlKCk6Yn0sc2V0OmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtiPT09ITE/Zi5yZW1vdmVBdHRyKGEsYyk6KGQ9Zi5wcm9wRml4W2NdfHxjLGQgaW4gYSYmKGFbZF09ITApLGEuc2V0QXR0cmlidXRlKGMsYy50b0xvd2VyQ2FzZSgpKSk7cmV0dXJuIGN9fSx2fHwoeT17bmFtZTohMCxpZDohMCxjb29yZHM6ITB9LHc9Zi52YWxIb29rcy5idXR0b249e2dldDpmdW5jdGlvbihhLGMpe3ZhciBkO2Q9YS5nZXRBdHRyaWJ1dGVOb2RlKGMpO3JldHVybiBkJiYoeVtjXT9kLm5vZGVWYWx1ZSE9PSIiOmQuc3BlY2lmaWVkKT9kLm5vZGVWYWx1ZTpifSxzZXQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPWEuZ2V0QXR0cmlidXRlTm9kZShkKTtlfHwoZT1jLmNyZWF0ZUF0dHJpYnV0ZShkKSxhLnNldEF0dHJpYnV0ZU5vZGUoZSkpO3JldHVybiBlLm5vZGVWYWx1ZT1iKyIifX0sZi5hdHRySG9va3MudGFiaW5kZXguc2V0PXcuc2V0LGYuZWFjaChbIndpZHRoIiwiaGVpZ2h0Il0sZnVuY3Rpb24oYSxiKXtmLmF0dHJIb29rc1tiXT1mLmV4dGVuZChmLmF0dHJIb29rc1tiXSx7c2V0OmZ1bmN0aW9uKGEsYyl7aWYoYz09PSIiKXthLnNldEF0dHJpYnV0ZShiLCJhdXRvIik7cmV0dXJuIGN9fX0pfSksZi5hdHRySG9va3MuY29udGVudGVkaXRhYmxlPXtnZXQ6dy5nZXQsc2V0OmZ1bmN0aW9uKGEsYixjKXtiPT09IiImJihiPSJmYWxzZSIpLHcuc2V0KGEsYixjKX19KSxmLnN1cHBvcnQuaHJlZk5vcm1hbGl6ZWR8fGYuZWFjaChbImhyZWYiLCJzcmMiLCJ3aWR0aCIsImhlaWdodCJdLGZ1bmN0aW9uKGEsYyl7Zi5hdHRySG9va3NbY109Zi5leHRlbmQoZi5hdHRySG9va3NbY10se2dldDpmdW5jdGlvbihhKXt2YXIgZD1hLmdldEF0dHJpYnV0ZShjLDIpO3JldHVybiBkPT09bnVsbD9iOmR9fSl9KSxmLnN1cHBvcnQuc3R5bGV8fChmLmF0dHJIb29rcy5zdHlsZT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLnN0eWxlLmNzc1RleHQudG9Mb3dlckNhc2UoKXx8Yn0sc2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc3R5bGUuY3NzVGV4dD0iIitifX0pLGYuc3VwcG9ydC5vcHRTZWxlY3RlZHx8KGYucHJvcEhvb2tzLnNlbGVjdGVkPWYuZXh0ZW5kKGYucHJvcEhvb2tzLnNlbGVjdGVkLHtnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO2ImJihiLnNlbGVjdGVkSW5kZXgsYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCk7cmV0dXJuIG51bGx9fSkpLGYuc3VwcG9ydC5lbmN0eXBlfHwoZi5wcm9wRml4LmVuY3R5cGU9ImVuY29kaW5nIiksZi5zdXBwb3J0LmNoZWNrT258fGYuZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe2YudmFsSG9va3NbdGhpc109e2dldDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInZhbHVlIik9PT1udWxsPyJvbiI6YS52YWx1ZX19fSksZi5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7Zi52YWxIb29rc1t0aGlzXT1mLmV4dGVuZChmLnZhbEhvb2tzW3RoaXNdLHtzZXQ6ZnVuY3Rpb24oYSxiKXtpZihmLmlzQXJyYXkoYikpcmV0dXJuIGEuY2hlY2tlZD1mLmluQXJyYXkoZihhKS52YWwoKSxiKT49MH19KX0pO3ZhciB6PS9eKD86dGV4dGFyZWF8aW5wdXR8c2VsZWN0KSQvaSxBPS9eKFteXC5dKik/KD86XC4oLispKT8kLyxCPS8oPzpefFxzKWhvdmVyKFwuXFMrKT9cYi8sQz0vXmtleS8sRD0vXig/Om1vdXNlfGNvbnRleHRtZW51KXxjbGljay8sRT0vXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sRj0vXihcdyopKD86IyhbXHdcLV0rKSk/KD86XC4oW1x3XC1dKykpPyQvLEc9ZnVuY3Rpb24oCmEpe3ZhciBiPUYuZXhlYyhhKTtiJiYoYlsxXT0oYlsxXXx8IiIpLnRvTG93ZXJDYXNlKCksYlszXT1iWzNdJiZuZXcgUmVnRXhwKCIoPzpefFxccykiK2JbM10rIig/Olxcc3wkKSIpKTtyZXR1cm4gYn0sSD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuYXR0cmlidXRlc3x8e307cmV0dXJuKCFiWzFdfHxhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iWzFdKSYmKCFiWzJdfHwoYy5pZHx8e30pLnZhbHVlPT09YlsyXSkmJighYlszXXx8YlszXS50ZXN0KChjWyJjbGFzcyJdfHx7fSkudmFsdWUpKX0sST1mdW5jdGlvbihhKXtyZXR1cm4gZi5ldmVudC5zcGVjaWFsLmhvdmVyP2E6YS5yZXBsYWNlKEIsIm1vdXNlZW50ZXIkMSBtb3VzZWxlYXZlJDEiKX07Zi5ldmVudD17YWRkOmZ1bmN0aW9uKGEsYyxkLGUsZyl7dmFyIGgsaSxqLGssbCxtLG4sbyxwLHEscixzO2lmKCEoYS5ub2RlVHlwZT09PTN8fGEubm9kZVR5cGU9PT04fHwhY3x8IWR8fCEoaD1mLl9kYXRhKGEpKSkpe2QuaGFuZGxlciYmKHA9ZCxkPXAuaGFuZGxlcixnPXAuc2VsZWN0b3IpLGQuZ3VpZHx8KGQuZ3VpZD1mLmd1aWQrKyksaj1oLmV2ZW50cyxqfHwoaC5ldmVudHM9aj17fSksaT1oLmhhbmRsZSxpfHwoaC5oYW5kbGU9aT1mdW5jdGlvbihhKXtyZXR1cm4gdHlwZW9mIGYhPSJ1bmRlZmluZWQiJiYoIWF8fGYuZXZlbnQudHJpZ2dlcmVkIT09YS50eXBlKT9mLmV2ZW50LmRpc3BhdGNoLmFwcGx5KGkuZWxlbSxhcmd1bWVudHMpOmJ9LGkuZWxlbT1hKSxjPWYudHJpbShJKGMpKS5zcGxpdCgiICIpO2ZvcihrPTA7azxjLmxlbmd0aDtrKyspe2w9QS5leGVjKGNba10pfHxbXSxtPWxbMV0sbj0obFsyXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLHM9Zi5ldmVudC5zcGVjaWFsW21dfHx7fSxtPShnP3MuZGVsZWdhdGVUeXBlOnMuYmluZFR5cGUpfHxtLHM9Zi5ldmVudC5zcGVjaWFsW21dfHx7fSxvPWYuZXh0ZW5kKHt0eXBlOm0sb3JpZ1R5cGU6bFsxXSxkYXRhOmUsaGFuZGxlcjpkLGd1aWQ6ZC5ndWlkLHNlbGVjdG9yOmcscXVpY2s6ZyYmRyhnKSxuYW1lc3BhY2U6bi5qb2luKCIuIil9LHApLHI9alttXTtpZighcil7cj1qW21dPVtdLHIuZGVsZWdhdGVDb3VudD0wO2lmKCFzLnNldHVwfHxzLnNldHVwLmNhbGwoYSxlLG4saSk9PT0hMSlhLmFkZEV2ZW50TGlzdGVuZXI/YS5hZGRFdmVudExpc3RlbmVyKG0saSwhMSk6YS5hdHRhY2hFdmVudCYmYS5hdHRhY2hFdmVudCgib24iK20saSl9cy5hZGQmJihzLmFkZC5jYWxsKGEsbyksby5oYW5kbGVyLmd1aWR8fChvLmhhbmRsZXIuZ3VpZD1kLmd1aWQpKSxnP3Iuc3BsaWNlKHIuZGVsZWdhdGVDb3VudCsrLDAsbyk6ci5wdXNoKG8pLGYuZXZlbnQuZ2xvYmFsW21dPSEwfWE9bnVsbH19LGdsb2JhbDp7fSxyZW1vdmU6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZz1mLmhhc0RhdGEoYSkmJmYuX2RhdGEoYSksaCxpLGosayxsLG0sbixvLHAscSxyLHM7aWYoISFnJiYhIShvPWcuZXZlbnRzKSl7Yj1mLnRyaW0oSShifHwiIikpLnNwbGl0KCIgIik7Zm9yKGg9MDtoPGIubGVuZ3RoO2grKyl7aT1BLmV4ZWMoYltoXSl8fFtdLGo9az1pWzFdLGw9aVsyXTtpZighail7Zm9yKGogaW4gbylmLmV2ZW50LnJlbW92ZShhLGorYltoXSxjLGQsITApO2NvbnRpbnVlfXA9Zi5ldmVudC5zcGVjaWFsW2pdfHx7fSxqPShkP3AuZGVsZWdhdGVUeXBlOnAuYmluZFR5cGUpfHxqLHI9b1tqXXx8W10sbT1yLmxlbmd0aCxsPWw/bmV3IFJlZ0V4cCgiKF58XFwuKSIrbC5zcGxpdCgiLiIpLnNvcnQoKS5qb2luKCJcXC4oPzouKlxcLik/IikrIihcXC58JCkiKTpudWxsO2ZvcihuPTA7bjxyLmxlbmd0aDtuKyspcz1yW25dLChlfHxrPT09cy5vcmlnVHlwZSkmJighY3x8Yy5ndWlkPT09cy5ndWlkKSYmKCFsfHxsLnRlc3Qocy5uYW1lc3BhY2UpKSYmKCFkfHxkPT09cy5zZWxlY3Rvcnx8ZD09PSIqKiImJnMuc2VsZWN0b3IpJiYoci5zcGxpY2Uobi0tLDEpLHMuc2VsZWN0b3ImJnIuZGVsZWdhdGVDb3VudC0tLHAucmVtb3ZlJiZwLnJlbW92ZS5jYWxsKGEscykpO3IubGVuZ3RoPT09MCYmbSE9PXIubGVuZ3RoJiYoKCFwLnRlYXJkb3dufHxwLnRlYXJkb3duLmNhbGwoYSxsKT09PSExKSYmZi5yZW1vdmVFdmVudChhLGosZy5oYW5kbGUpLGRlbGV0ZSBvW2pdKX1mLmlzRW1wdHlPYmplY3QobykmJihxPWcuaGFuZGxlLHEmJihxLmVsZW09bnVsbCksZi5yZW1vdmVEYXRhKGEsWyJldmVudHMiLCJoYW5kbGUiXSwhMCkpfX0sY3VzdG9tRXZlbnQ6e2dldERhdGE6ITAsc2V0RGF0YTohMCxjaGFuZ2VEYXRhOiEwfSx0cmlnZ2VyOmZ1bmN0aW9uKGMsZCxlLGcpe2lmKCFlfHxlLm5vZGVUeXBlIT09MyYmZS5ub2RlVHlwZSE9PTgpe3ZhciBoPWMudHlwZXx8YyxpPVtdLGosayxsLG0sbixvLHAscSxyLHM7aWYoRS50ZXN0KGgrZi5ldmVudC50cmlnZ2VyZWQpKXJldHVybjtoLmluZGV4T2YoIiEiKT49MCYmKGg9aC5zbGljZSgwLC0xKSxrPSEwKSxoLmluZGV4T2YoIi4iKT49MCYmKGk9aC5zcGxpdCgiLiIpLGg9aS5zaGlmdCgpLGkuc29ydCgpKTtpZigoIWV8fGYuZXZlbnQuY3VzdG9tRXZlbnRbaF0pJiYhZi5ldmVudC5nbG9iYWxbaF0pcmV0dXJuO2M9dHlwZW9mIGM9PSJvYmplY3QiP2NbZi5leHBhbmRvXT9jOm5ldyBmLkV2ZW50KGgsYyk6bmV3IGYuRXZlbnQoaCksYy50eXBlPWgsYy5pc1RyaWdnZXI9ITAsYy5leGNsdXNpdmU9ayxjLm5hbWVzcGFjZT1pLmpvaW4oIi4iKSxjLm5hbWVzcGFjZV9yZT1jLm5hbWVzcGFjZT9uZXcgUmVnRXhwKCIoXnxcXC4pIitpLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSsiKFxcLnwkKSIpOm51bGwsbz1oLmluZGV4T2YoIjoiKTwwPyJvbiIraDoiIjtpZighZSl7aj1mLmNhY2hlO2ZvcihsIGluIGopaltsXS5ldmVudHMmJmpbbF0uZXZlbnRzW2hdJiZmLmV2ZW50LnRyaWdnZXIoYyxkLGpbbF0uaGFuZGxlLmVsZW0sITApO3JldHVybn1jLnJlc3VsdD1iLGMudGFyZ2V0fHwoYy50YXJnZXQ9ZSksZD1kIT1udWxsP2YubWFrZUFycmF5KGQpOltdLGQudW5zaGlmdChjKSxwPWYuZXZlbnQuc3BlY2lhbFtoXXx8e307aWYocC50cmlnZ2VyJiZwLnRyaWdnZXIuYXBwbHkoZSxkKT09PSExKXJldHVybjtyPVtbZSxwLmJpbmRUeXBlfHxoXV07aWYoIWcmJiFwLm5vQnViYmxlJiYhZi5pc1dpbmRvdyhlKSl7cz1wLmRlbGVnYXRlVHlwZXx8aCxtPUUudGVzdChzK2gpP2U6ZS5wYXJlbnROb2RlLG49bnVsbDtmb3IoO207bT1tLnBhcmVudE5vZGUpci5wdXNoKFttLHNdKSxuPW07biYmbj09PWUub3duZXJEb2N1bWVudCYmci5wdXNoKFtuLmRlZmF1bHRWaWV3fHxuLnBhcmVudFdpbmRvd3x8YSxzXSl9Zm9yKGw9MDtsPHIubGVuZ3RoJiYhYy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpO2wrKyltPXJbbF1bMF0sYy50eXBlPXJbbF1bMV0scT0oZi5fZGF0YShtLCJldmVudHMiKXx8e30pW2MudHlwZV0mJmYuX2RhdGEobSwiaGFuZGxlIikscSYmcS5hcHBseShtLGQpLHE9byYmbVtvXSxxJiZmLmFjY2VwdERhdGEobSkmJnEuYXBwbHkobSxkKT09PSExJiZjLnByZXZlbnREZWZhdWx0KCk7Yy50eXBlPWgsIWcmJiFjLmlzRGVmYXVsdFByZXZlbnRlZCgpJiYoIXAuX2RlZmF1bHR8fHAuX2RlZmF1bHQuYXBwbHkoZS5vd25lckRvY3VtZW50LGQpPT09ITEpJiYoaCE9PSJjbGljayJ8fCFmLm5vZGVOYW1lKGUsImEiKSkmJmYuYWNjZXB0RGF0YShlKSYmbyYmZVtoXSYmKGghPT0iZm9jdXMiJiZoIT09ImJsdXIifHxjLnRhcmdldC5vZmZzZXRXaWR0aCE9PTApJiYhZi5pc1dpbmRvdyhlKSYmKG49ZVtvXSxuJiYoZVtvXT1udWxsKSxmLmV2ZW50LnRyaWdnZXJlZD1oLGVbaF0oKSxmLmV2ZW50LnRyaWdnZXJlZD1iLG4mJihlW29dPW4pKTtyZXR1cm4gYy5yZXN1bHR9fSxkaXNwYXRjaDpmdW5jdGlvbihjKXtjPWYuZXZlbnQuZml4KGN8fGEuZXZlbnQpO3ZhciBkPShmLl9kYXRhKHRoaXMsImV2ZW50cyIpfHx7fSlbYy50eXBlXXx8W10sZT1kLmRlbGVnYXRlQ291bnQsZz1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSxoPSFjLmV4Y2x1c2l2ZSYmIWMubmFtZXNwYWNlLGk9Zi5ldmVudC5zcGVjaWFsW2MudHlwZV18fHt9LGo9W10sayxsLG0sbixvLHAscSxyLHMsdCx1O2dbMF09YyxjLmRlbGVnYXRlVGFyZ2V0PXRoaXM7aWYoIWkucHJlRGlzcGF0Y2h8fGkucHJlRGlzcGF0Y2guY2FsbCh0aGlzLGMpIT09ITEpe2lmKGUmJighYy5idXR0b258fGMudHlwZSE9PSJjbGljayIpKXtuPWYodGhpcyksbi5jb250ZXh0PXRoaXMub3duZXJEb2N1bWVudHx8dGhpcztmb3IobT1jLnRhcmdldDttIT10aGlzO209bS5wYXJlbnROb2RlfHx0aGlzKWlmKG0uZGlzYWJsZWQhPT0hMCl7cD17fSxyPVtdLG5bMF09bTtmb3Ioaz0wO2s8ZTtrKyspcz1kW2tdLHQ9cy5zZWxlY3RvcixwW3RdPT09YiYmKHBbdF09cy5xdWljaz9IKG0scy5xdWljayk6bi5pcyh0KSkscFt0XSYmci5wdXNoKHMpO3IubGVuZ3RoJiZqLnB1c2goe2VsZW06bSxtYXRjaGVzOnJ9KX19ZC5sZW5ndGg+ZSYmai5wdXNoKHtlbGVtOnRoaXMsbWF0Y2hlczpkLnNsaWNlKGUpfSk7Zm9yKGs9MDtrPGoubGVuZ3RoJiYhYy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpO2srKyl7cT1qW2tdLGMuY3VycmVudFRhcmdldD1xLmVsZW07Zm9yKGw9MDtsPHEubWF0Y2hlcy5sZW5ndGgmJiFjLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCk7bCsrKXtzPXEubWF0Y2hlc1tsXTtpZihofHwhYy5uYW1lc3BhY2UmJiFzLm5hbWVzcGFjZXx8Yy5uYW1lc3BhY2VfcmUmJmMubmFtZXNwYWNlX3JlLnRlc3Qocy5uYW1lc3BhY2UpKWMuZGF0YT1zLmRhdGEsYy5oYW5kbGVPYmo9cyxvPSgoZi5ldmVudC5zcGVjaWFsW3Mub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxzLmhhbmRsZXIpLmFwcGx5KHEuZWxlbSxnKSxvIT09YiYmKGMucmVzdWx0PW8sbz09PSExJiYoYy5wcmV2ZW50RGVmYXVsdCgpLGMuc3RvcFByb3BhZ2F0aW9uKCkpKX19aS5wb3N0RGlzcGF0Y2gmJmkucG9zdERpc3BhdGNoLmNhbGwodGhpcyxjKTtyZXR1cm4gYy5yZXN1bHR9fSxwcm9wczoiYXR0ckNoYW5nZSBhdHRyTmFtZSByZWxhdGVkTm9kZSBzcmNFbGVtZW50IGFsdEtleSBidWJibGVzIGNhbmNlbGFibGUgY3RybEtleSBjdXJyZW50VGFyZ2V0IGV2ZW50UGhhc2UgbWV0YUtleSByZWxhdGVkVGFyZ2V0IHNoaWZ0S2V5IHRhcmdldCB0aW1lU3RhbXAgdmlldyB3aGljaCIuc3BsaXQoIiAiKSxmaXhIb29rczp7fSxrZXlIb29rczp7cHJvcHM6ImNoYXIgY2hhckNvZGUga2V5IGtleUNvZGUiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsYil7YS53aGljaD09bnVsbCYmKGEud2hpY2g9Yi5jaGFyQ29kZSE9bnVsbD9iLmNoYXJDb2RlOmIua2V5Q29kZSk7cmV0dXJuIGF9fSxtb3VzZUhvb2tzOntwcm9wczoiYnV0dG9uIGJ1dHRvbnMgY2xpZW50WCBjbGllbnRZIGZyb21FbGVtZW50IG9mZnNldFggb2Zmc2V0WSBwYWdlWCBwYWdlWSBzY3JlZW5YIHNjcmVlblkgdG9FbGVtZW50Ii5zcGxpdCgiICIpLGZpbHRlcjpmdW5jdGlvbihhLGQpe3ZhciBlLGYsZyxoPWQuYnV0dG9uLGk9ZC5mcm9tRWxlbWVudDthLnBhZ2VYPT1udWxsJiZkLmNsaWVudFghPW51bGwmJihlPWEudGFyZ2V0Lm93bmVyRG9jdW1lbnR8fGMsZj1lLmRvY3VtZW50RWxlbWVudCxnPWUuYm9keSxhLnBhZ2VYPWQuY2xpZW50WCsoZiYmZi5zY3JvbGxMZWZ0fHxnJiZnLnNjcm9sbExlZnR8fDApLShmJiZmLmNsaWVudExlZnR8fGcmJmcuY2xpZW50TGVmdHx8MCksYS5wYWdlWT1kLmNsaWVudFkrKGYmJmYuc2Nyb2xsVG9wfHxnJiZnLnNjcm9sbFRvcHx8MCktKGYmJmYuY2xpZW50VG9wfHxnJiZnLmNsaWVudFRvcHx8MCkpLCFhLnJlbGF0ZWRUYXJnZXQmJmkmJihhLnJlbGF0ZWRUYXJnZXQ9aT09PWEudGFyZ2V0P2QudG9FbGVtZW50OmkpLCFhLndoaWNoJiZoIT09YiYmKGEud2hpY2g9aCYxPzE6aCYyPzM6aCY0PzI6MCk7cmV0dXJuIGF9fSxmaXg6ZnVuY3Rpb24oYSl7aWYoYVtmLmV4cGFuZG9dKXJldHVybiBhO3ZhciBkLGUsZz1hLGg9Zi5ldmVudC5maXhIb29rc1thLnR5cGVdfHx7fSxpPWgucHJvcHM/dGhpcy5wcm9wcy5jb25jYXQoaC5wcm9wcyk6dGhpcy5wcm9wczthPWYuRXZlbnQoZyk7Zm9yKGQ9aS5sZW5ndGg7ZDspZT1pWy0tZF0sYVtlXT1nW2VdO2EudGFyZ2V0fHwoYS50YXJnZXQ9Zy5zcmNFbGVtZW50fHxjKSxhLnRhcmdldC5ub2RlVHlwZT09PTMmJihhLnRhcmdldD1hLnRhcmdldC5wYXJlbnROb2RlKSxhLm1ldGFLZXk9PT1iJiYoYS5tZXRhS2V5PWEuY3RybEtleSk7cmV0dXJuIGguZmlsdGVyP2guZmlsdGVyKGEsZyk6YX0sc3BlY2lhbDp7cmVhZHk6e3NldHVwOmYuYmluZFJlYWR5fSxsb2FkOntub0J1YmJsZTohMH0sZm9jdXM6e2RlbGVnYXRlVHlwZToiZm9jdXNpbiJ9LGJsdXI6e2RlbGVnYXRlVHlwZToiZm9jdXNvdXQifSxiZWZvcmV1bmxvYWQ6e3NldHVwOmZ1bmN0aW9uKGEsYixjKXtmLmlzV2luZG93KHRoaXMpJiYodGhpcy5vbmJlZm9yZXVubG9hZD1jKX0sdGVhcmRvd246ZnVuY3Rpb24oYSxiKXt0aGlzLm9uYmVmb3JldW5sb2FkPT09YiYmKHRoaXMub25iZWZvcmV1bmxvYWQ9bnVsbCl9fX0sc2ltdWxhdGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9Zi5leHRlbmQobmV3IGYuRXZlbnQsYyx7dHlwZTphLGlzU2ltdWxhdGVkOiEwLG9yaWdpbmFsRXZlbnQ6e319KTtkP2YuZXZlbnQudHJpZ2dlcihlLG51bGwsYik6Zi5ldmVudC5kaXNwYXRjaC5jYWxsKGIsZSksZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmYy5wcmV2ZW50RGVmYXVsdCgpfX0sZi5ldmVudC5oYW5kbGU9Zi5ldmVudC5kaXNwYXRjaCxmLnJlbW92ZUV2ZW50PWMucmVtb3ZlRXZlbnRMaXN0ZW5lcj9mdW5jdGlvbihhLGIsYyl7YS5yZW1vdmVFdmVudExpc3RlbmVyJiZhLnJlbW92ZUV2ZW50TGlzdGVuZXIoYixjLCExKX06ZnVuY3Rpb24oYSxiLGMpe2EuZGV0YWNoRXZlbnQmJmEuZGV0YWNoRXZlbnQoIm9uIitiLGMpfSxmLkV2ZW50PWZ1bmN0aW9uKGEsYil7aWYoISh0aGlzIGluc3RhbmNlb2YgZi5FdmVudCkpcmV0dXJuIG5ldyBmLkV2ZW50KGEsYik7YSYmYS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9YSx0aGlzLnR5cGU9YS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEuZGVmYXVsdFByZXZlbnRlZHx8YS5yZXR1cm5WYWx1ZT09PSExfHxhLmdldFByZXZlbnREZWZhdWx0JiZhLmdldFByZXZlbnREZWZhdWx0KCk/SzpKKTp0aGlzLnR5cGU9YSxiJiZmLmV4dGVuZCh0aGlzLGIpLHRoaXMudGltZVN0YW1wPWEmJmEudGltZVN0YW1wfHxmLm5vdygpLHRoaXNbZi5leHBhbmRvXT0hMH0sZi5FdmVudC5wcm90b3R5cGU9e3ByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9Szt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7IWF8fChhLnByZXZlbnREZWZhdWx0P2EucHJldmVudERlZmF1bHQoKTphLnJldHVyblZhbHVlPSExKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1LO3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDshYXx8KGEuc3RvcFByb3BhZ2F0aW9uJiZhLnN0b3BQcm9wYWdhdGlvbigpLGEuY2FuY2VsQnViYmxlPSEwKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1LLHRoaXMuc3RvcFByb3BhZ2F0aW9uKCl9LGlzRGVmYXVsdFByZXZlbnRlZDpKLGlzUHJvcGFnYXRpb25TdG9wcGVkOkosaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6Sn0sZi5lYWNoKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0In0sZnVuY3Rpb24oYSxiKXtmLmV2ZW50LnNwZWNpYWxbYV09e2RlbGVnYXRlVHlwZTpiLGJpbmRUeXBlOmIsaGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMsZD1hLnJlbGF0ZWRUYXJnZXQsZT1hLmhhbmRsZU9iaixnPWUuc2VsZWN0b3IsaDtpZighZHx8ZCE9PWMmJiFmLmNvbnRhaW5zKGMsZCkpYS50eXBlPWUub3JpZ1R5cGUsaD1lLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGEudHlwZT1iO3JldHVybiBofX19KSxmLnN1cHBvcnQuc3VibWl0QnViYmxlc3x8KGYuZXZlbnQuc3BlY2lhbC5zdWJtaXQ9e3NldHVwOmZ1bmN0aW9uKCl7aWYoZi5ub2RlTmFtZSh0aGlzLCJmb3JtIikpcmV0dXJuITE7Zi5ldmVudC5hZGQodGhpcywiY2xpY2suX3N1Ym1pdCBrZXlwcmVzcy5fc3VibWl0IixmdW5jdGlvbihhKXt2YXIgYz1hLnRhcmdldCxkPWYubm9kZU5hbWUoYywiaW5wdXQiKXx8Zi5ub2RlTmFtZShjLCJidXR0b24iKT9jLmZvcm06YjtkJiYhZC5fc3VibWl0X2F0dGFjaGVkJiYoZi5ldmVudC5hZGQoZCwic3VibWl0Ll9zdWJtaXQiLGZ1bmN0aW9uKGEpe2EuX3N1Ym1pdF9idWJibGU9ITB9KSxkLl9zdWJtaXRfYXR0YWNoZWQ9ITApfSl9LHBvc3REaXNwYXRjaDpmdW5jdGlvbihhKXthLl9zdWJtaXRfYnViYmxlJiYoZGVsZXRlIGEuX3N1Ym1pdF9idWJibGUsdGhpcy5wYXJlbnROb2RlJiYhYS5pc1RyaWdnZXImJmYuZXZlbnQuc2ltdWxhdGUoInN1Ym1pdCIsdGhpcy5wYXJlbnROb2RlLGEsITApKX0sdGVhcmRvd246ZnVuY3Rpb24oKXtpZihmLm5vZGVOYW1lKHRoaXMsImZvcm0iKSlyZXR1cm4hMTtmLmV2ZW50LnJlbW92ZSh0aGlzLCIuX3N1Ym1pdCIpfX0pLGYuc3VwcG9ydC5jaGFuZ2VCdWJibGVzfHwoZi5ldmVudC5zcGVjaWFsLmNoYW5nZT17c2V0dXA6ZnVuY3Rpb24oKXtpZih6LnRlc3QodGhpcy5ub2RlTmFtZSkpe2lmKHRoaXMudHlwZT09PSJjaGVja2JveCJ8fHRoaXMudHlwZT09PSJyYWRpbyIpZi5ldmVudC5hZGQodGhpcywicHJvcGVydHljaGFuZ2UuX2NoYW5nZSIsZnVuY3Rpb24oYSl7YS5vcmlnaW5hbEV2ZW50LnByb3BlcnR5TmFtZT09PSJjaGVja2VkIiYmKHRoaXMuX2p1c3RfY2hhbmdlZD0hMCl9KSxmLmV2ZW50LmFkZCh0aGlzLCJjbGljay5fY2hhbmdlIixmdW5jdGlvbihhKXt0aGlzLl9qdXN0X2NoYW5nZWQmJiFhLmlzVHJpZ2dlciYmKHRoaXMuX2p1c3RfY2hhbmdlZD0hMSxmLmV2ZW50LnNpbXVsYXRlKCJjaGFuZ2UiLHRoaXMsYSwhMCkpfSk7cmV0dXJuITF9Zi5ldmVudC5hZGQodGhpcywiYmVmb3JlYWN0aXZhdGUuX2NoYW5nZSIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQ7ei50ZXN0KGIubm9kZU5hbWUpJiYhYi5fY2hhbmdlX2F0dGFjaGVkJiYoZi5ldmVudC5hZGQoYiwiY2hhbmdlLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZSYmIWEuaXNTaW11bGF0ZWQmJiFhLmlzVHJpZ2dlciYmZi5ldmVudC5zaW11bGF0ZSgiY2hhbmdlIix0aGlzLnBhcmVudE5vZGUsYSwhMCl9KSxiLl9jaGFuZ2VfYXR0YWNoZWQ9ITApfSl9LGhhbmRsZTpmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldDtpZih0aGlzIT09Ynx8YS5pc1NpbXVsYXRlZHx8YS5pc1RyaWdnZXJ8fGIudHlwZSE9PSJyYWRpbyImJmIudHlwZSE9PSJjaGVja2JveCIpcmV0dXJuIGEuaGFuZGxlT2JqLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpfSx0ZWFyZG93bjpmdW5jdGlvbigpe2YuZXZlbnQucmVtb3ZlKHRoaXMsIi5fY2hhbmdlIik7cmV0dXJuIHoudGVzdCh0aGlzLm5vZGVOYW1lKX19KSxmLnN1cHBvcnQuZm9jdXNpbkJ1YmJsZXN8fGYuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGU9ZnVuY3Rpb24oYSl7Zi5ldmVudC5zaW11bGF0ZShiLGEudGFyZ2V0LGYuZXZlbnQuZml4KGEpLCEwKX07Zi5ldmVudC5zcGVjaWFsW2JdPXtzZXR1cDpmdW5jdGlvbigpe2QrKz09PTAmJmMuYWRkRXZlbnRMaXN0ZW5lcihhLGUsITApfSx0ZWFyZG93bjpmdW5jdGlvbigpey0tZD09PTAmJmMucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGUsITApfX19KSxmLmZuLmV4dGVuZCh7b246ZnVuY3Rpb24oYSxjLGQsZSxnKXt2YXIgaCxpO2lmKHR5cGVvZiBhPT0ib2JqZWN0Iil7dHlwZW9mIGMhPSJzdHJpbmciJiYoZD1kfHxjLGM9Yik7Zm9yKGkgaW4gYSl0aGlzLm9uKGksYyxkLGFbaV0sZyk7cmV0dXJuIHRoaXN9ZD09bnVsbCYmZT09bnVsbD8oZT1jLGQ9Yz1iKTplPT1udWxsJiYodHlwZW9mIGM9PSJzdHJpbmciPyhlPWQsZD1iKTooZT1kLGQ9YyxjPWIpKTtpZihlPT09ITEpZT1KO2Vsc2UgaWYoIWUpcmV0dXJuIHRoaXM7Zz09PTEmJihoPWUsZT1mdW5jdGlvbihhKXtmKCkub2ZmKGEpO3JldHVybiBoLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5ndWlkPWguZ3VpZHx8KGguZ3VpZD1mLmd1aWQrKykpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmLmV2ZW50LmFkZCh0aGlzLGEsZSxkLGMpfSl9LG9uZTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5vbihhLGIsYyxkLDEpfSxvZmY6ZnVuY3Rpb24oYSxjLGQpe2lmKGEmJmEucHJldmVudERlZmF1bHQmJmEuaGFuZGxlT2JqKXt2YXIgZT1hLmhhbmRsZU9iajtmKGEuZGVsZWdhdGVUYXJnZXQpLm9mZihlLm5hbWVzcGFjZT9lLm9yaWdUeXBlKyIuIitlLm5hbWVzcGFjZTplLm9yaWdUeXBlLGUuc2VsZWN0b3IsZS5oYW5kbGVyKTtyZXR1cm4gdGhpc31pZih0eXBlb2YgYT09Im9iamVjdCIpe2Zvcih2YXIgZyBpbiBhKXRoaXMub2ZmKGcsYyxhW2ddKTtyZXR1cm4gdGhpc31pZihjPT09ITF8fHR5cGVvZiBjPT0iZnVuY3Rpb24iKWQ9YyxjPWI7ZD09PSExJiYoZD1KKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5ldmVudC5yZW1vdmUodGhpcyxhLGQsYyl9KX0sYmluZDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMub24oYSxudWxsLGIsYyl9LHVuYmluZDpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm9mZihhLG51bGwsYil9LGxpdmU6ZnVuY3Rpb24oYSxiLGMpe2YodGhpcy5jb250ZXh0KS5vbihhLHRoaXMuc2VsZWN0b3IsYixjKTtyZXR1cm4gdGhpc30sZGllOmZ1bmN0aW9uKGEsYil7Zih0aGlzLmNvbnRleHQpLm9mZihhLHRoaXMuc2VsZWN0b3J8fCIqKiIsYik7cmV0dXJuIHRoaXN9LGRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uKGIsYSxjLGQpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09MT90aGlzLm9mZihhLCIqKiIpOnRoaXMub2ZmKGIsYSxjKX0sdHJpZ2dlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmLmV2ZW50LnRyaWdnZXIoYSxiLHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGEsYil7aWYodGhpc1swXSlyZXR1cm4gZi5ldmVudC50cmlnZ2VyKGEsYix0aGlzWzBdLCEwKX0sdG9nZ2xlOmZ1bmN0aW9uKGEpe3ZhciBiPWFyZ3VtZW50cyxjPWEuZ3VpZHx8Zi5ndWlkKyssZD0wLGU9ZnVuY3Rpb24oYyl7dmFyIGU9KGYuX2RhdGEodGhpcywibGFzdFRvZ2dsZSIrYS5ndWlkKXx8MCklZDtmLl9kYXRhKHRoaXMsImxhc3RUb2dnbGUiK2EuZ3VpZCxlKzEpLGMucHJldmVudERlZmF1bHQoKTtyZXR1cm4gYltlXS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fCExfTtlLmd1aWQ9Yzt3aGlsZShkPGIubGVuZ3RoKWJbZCsrXS5ndWlkPWM7cmV0dXJuIHRoaXMuY2xpY2soZSl9LGhvdmVyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubW91c2VlbnRlcihhKS5tb3VzZWxlYXZlKGJ8fGEpfX0pLGYuZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe2YuZm5bYl09ZnVuY3Rpb24oYSxjKXtjPT1udWxsJiYoYz1hLGE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MD90aGlzLm9uKGIsbnVsbCxhLGMpOnRoaXMudHJpZ2dlcihiKX0sZi5hdHRyRm4mJihmLmF0dHJGbltiXT0hMCksQy50ZXN0KGIpJiYoZi5ldmVudC5maXhIb29rc1tiXT1mLmV2ZW50LmtleUhvb2tzKSxELnRlc3QoYikmJihmLmV2ZW50LmZpeEhvb2tzW2JdPWYuZXZlbnQubW91c2VIb29rcyl9KSxmdW5jdGlvbigpe2Z1bmN0aW9uIHgoYSxiLGMsZSxmLGcpe2Zvcih2YXIgaD0wLGk9ZS5sZW5ndGg7aDxpO2grKyl7dmFyIGo9ZVtoXTtpZihqKXt2YXIgaz0hMTtqPWpbYV07d2hpbGUoail7aWYoaltkXT09PWMpe2s9ZVtqLnNpenNldF07YnJlYWt9aWYoai5ub2RlVHlwZT09PTEpe2d8fChqW2RdPWMsai5zaXpzZXQ9aCk7aWYodHlwZW9mIGIhPSJzdHJpbmciKXtpZihqPT09Yil7az0hMDticmVha319ZWxzZSBpZihtLmZpbHRlcihiLFtqXSkubGVuZ3RoPjApe2s9ajticmVha319aj1qW2FdfWVbaF09a319fWZ1bmN0aW9uIHcoYSxiLGMsZSxmLGcpe2Zvcih2YXIgaD0wLGk9ZS5sZW5ndGg7aDxpO2grKyl7dmFyIGo9ZVtoXTtpZihqKXt2YXIgaz0hMTtqPWpbYV07d2hpbGUoail7aWYoaltkXT09PWMpe2s9ZVtqLnNpenNldF07YnJlYWt9ai5ub2RlVHlwZT09PTEmJiFnJiYoaltkXT1jLGouc2l6c2V0PWgpO2lmKGoubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWIpe2s9ajticmVha31qPWpbYV19ZVtoXT1rfX19dmFyIGE9LygoPzpcKCg/OlwoW14oKV0rXCl8W14oKV0rKStcKXxcWyg/OlxbW15cW1xdXSpcXXxbJyJdW14nIl0qWyciXXxbXlxbXF0nIl0rKStcXXxcXC58W14gPit+LChcW1xcXSspK3xbPit+XSkoXHMqLFxzKik/KCg/Oi58XHJ8XG4pKikvZyxkPSJzaXpjYWNoZSIrKE1hdGgucmFuZG9tKCkrIiIpLnJlcGxhY2UoIi4iLCIiKSxlPTAsZz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLGg9ITEsaT0hMCxqPS9cXC9nLGs9L1xyXG4vZyxsPS9cVy87WzAsMF0uc29ydChmdW5jdGlvbigpe2k9ITE7cmV0dXJuIDB9KTt2YXIgbT1mdW5jdGlvbihiLGQsZSxmKXtlPWV8fFtdLGQ9ZHx8Yzt2YXIgaD1kO2lmKGQubm9kZVR5cGUhPT0xJiZkLm5vZGVUeXBlIT09OSlyZXR1cm5bXTtpZighYnx8dHlwZW9mIGIhPSJzdHJpbmciKXJldHVybiBlO3ZhciBpLGosayxsLG4scSxyLHQsdT0hMCx2PW0uaXNYTUwoZCksdz1bXSx4PWI7ZG97YS5leGVjKCIiKSxpPWEuZXhlYyh4KTtpZihpKXt4PWlbM10sdy5wdXNoKGlbMV0pO2lmKGlbMl0pe2w9aVszXTticmVha319fXdoaWxlKGkpO2lmKHcubGVuZ3RoPjEmJnAuZXhlYyhiKSlpZih3Lmxlbmd0aD09PTImJm8ucmVsYXRpdmVbd1swXV0paj15KHdbMF0rd1sxXSxkLGYpO2Vsc2V7aj1vLnJlbGF0aXZlW3dbMF1dP1tkXTptKHcuc2hpZnQoKSxkKTt3aGlsZSh3Lmxlbmd0aCliPXcuc2hpZnQoKSxvLnJlbGF0aXZlW2JdJiYoYis9dy5zaGlmdCgpKSxqPXkoYixqLGYpfWVsc2V7IWYmJncubGVuZ3RoPjEmJmQubm9kZVR5cGU9PT05JiYhdiYmby5tYXRjaC5JRC50ZXN0KHdbMF0pJiYhby5tYXRjaC5JRC50ZXN0KHdbdy5sZW5ndGgtMV0pJiYobj1tLmZpbmQody5zaGlmdCgpLGQsdiksZD1uLmV4cHI/bS5maWx0ZXIobi5leHByLG4uc2V0KVswXTpuLnNldFswXSk7aWYoZCl7bj1mP3tleHByOncucG9wKCksc2V0OnMoZil9Om0uZmluZCh3LnBvcCgpLHcubGVuZ3RoPT09MSYmKHdbMF09PT0ifiJ8fHdbMF09PT0iKyIpJiZkLnBhcmVudE5vZGU/ZC5wYXJlbnROb2RlOmQsdiksaj1uLmV4cHI/bS5maWx0ZXIobi5leHByLG4uc2V0KTpuLnNldCx3Lmxlbmd0aD4wP2s9cyhqKTp1PSExO3doaWxlKHcubGVuZ3RoKXE9dy5wb3AoKSxyPXEsby5yZWxhdGl2ZVtxXT9yPXcucG9wKCk6cT0iIixyPT1udWxsJiYocj1kKSxvLnJlbGF0aXZlW3FdKGsscix2KX1lbHNlIGs9dz1bXX1rfHwoaz1qKSxrfHxtLmVycm9yKHF8fGIpO2lmKGcuY2FsbChrKT09PSJbb2JqZWN0IEFycmF5XSIpaWYoIXUpZS5wdXNoLmFwcGx5KGUsayk7ZWxzZSBpZihkJiZkLm5vZGVUeXBlPT09MSlmb3IodD0wO2tbdF0hPW51bGw7dCsrKWtbdF0mJihrW3RdPT09ITB8fGtbdF0ubm9kZVR5cGU9PT0xJiZtLmNvbnRhaW5zKGQsa1t0XSkpJiZlLnB1c2goalt0XSk7ZWxzZSBmb3IodD0wO2tbdF0hPW51bGw7dCsrKWtbdF0mJmtbdF0ubm9kZVR5cGU9PT0xJiZlLnB1c2goalt0XSk7ZWxzZSBzKGssZSk7bCYmKG0obCxoLGUsZiksbS51bmlxdWVTb3J0KGUpKTtyZXR1cm4gZX07bS51bmlxdWVTb3J0PWZ1bmN0aW9uKGEpe2lmKHUpe2g9aSxhLnNvcnQodSk7aWYoaClmb3IodmFyIGI9MTtiPGEubGVuZ3RoO2IrKylhW2JdPT09YVtiLTFdJiZhLnNwbGljZShiLS0sMSl9cmV0dXJuIGF9LG0ubWF0Y2hlcz1mdW5jdGlvbihhLGIpe3JldHVybiBtKGEsbnVsbCxudWxsLGIpfSxtLm1hdGNoZXNTZWxlY3Rvcj1mdW5jdGlvbihhLGIpe3JldHVybiBtKGIsbnVsbCxudWxsLFthXSkubGVuZ3RoPjB9LG0uZmluZD1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaCxpO2lmKCFhKXJldHVybltdO2ZvcihlPTAsZj1vLm9yZGVyLmxlbmd0aDtlPGY7ZSsrKXtoPW8ub3JkZXJbZV07aWYoZz1vLmxlZnRNYXRjaFtoXS5leGVjKGEpKXtpPWdbMV0sZy5zcGxpY2UoMSwxKTtpZihpLnN1YnN0cihpLmxlbmd0aC0xKSE9PSJcXCIpe2dbMV09KGdbMV18fCIiKS5yZXBsYWNlKGosIiIpLGQ9by5maW5kW2hdKGcsYixjKTtpZihkIT1udWxsKXthPWEucmVwbGFjZShvLm1hdGNoW2hdLCIiKTticmVha319fX1kfHwoZD10eXBlb2YgYi5nZXRFbGVtZW50c0J5VGFnTmFtZSE9InVuZGVmaW5lZCI/Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOltdKTtyZXR1cm57c2V0OmQsZXhwcjphfX0sbS5maWx0ZXI9ZnVuY3Rpb24oYSxjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbixwLHE9YSxyPVtdLHM9Yyx0PWMmJmNbMF0mJm0uaXNYTUwoY1swXSk7d2hpbGUoYSYmYy5sZW5ndGgpe2ZvcihoIGluIG8uZmlsdGVyKWlmKChmPW8ubGVmdE1hdGNoW2hdLmV4ZWMoYSkpIT1udWxsJiZmWzJdKXtrPW8uZmlsdGVyW2hdLGw9ZlsxXSxnPSExLGYuc3BsaWNlKDEsMSk7aWYobC5zdWJzdHIobC5sZW5ndGgtMSk9PT0iXFwiKWNvbnRpbnVlO3M9PT1yJiYocj1bXSk7aWYoby5wcmVGaWx0ZXJbaF0pe2Y9by5wcmVGaWx0ZXJbaF0oZixzLGQscixlLHQpO2lmKCFmKWc9aT0hMDtlbHNlIGlmKGY9PT0hMCljb250aW51ZX1pZihmKWZvcihuPTA7KGo9c1tuXSkhPW51bGw7bisrKWomJihpPWsoaixmLG4scykscD1lXmksZCYmaSE9bnVsbD9wP2c9ITA6c1tuXT0hMTpwJiYoci5wdXNoKGopLGc9ITApKTtpZihpIT09Yil7ZHx8KHM9ciksYT1hLnJlcGxhY2Uoby5tYXRjaFtoXSwiIik7aWYoIWcpcmV0dXJuW107YnJlYWt9fWlmKGE9PT1xKWlmKGc9PW51bGwpbS5lcnJvcihhKTtlbHNlIGJyZWFrO3E9YX1yZXR1cm4gc30sbS5lcnJvcj1mdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrYSl9O3ZhciBuPW0uZ2V0VGV4dD1mdW5jdGlvbihhKXt2YXIgYixjLGQ9YS5ub2RlVHlwZSxlPSIiO2lmKGQpe2lmKGQ9PT0xfHxkPT09OXx8ZD09PTExKXtpZih0eXBlb2YgYS50ZXh0Q29udGVudD09InN0cmluZyIpcmV0dXJuIGEudGV4dENvbnRlbnQ7aWYodHlwZW9mIGEuaW5uZXJUZXh0PT0ic3RyaW5nIilyZXR1cm4gYS5pbm5lclRleHQucmVwbGFjZShrLCIiKTtmb3IoYT1hLmZpcnN0Q2hpbGQ7YTthPWEubmV4dFNpYmxpbmcpZSs9bihhKX1lbHNlIGlmKGQ9PT0zfHxkPT09NClyZXR1cm4gYS5ub2RlVmFsdWV9ZWxzZSBmb3IoYj0wO2M9YVtiXTtiKyspYy5ub2RlVHlwZSE9PTgmJihlKz1uKGMpKTtyZXR1cm4gZX0sbz1tLnNlbGVjdG9ycz17b3JkZXI6WyJJRCIsIk5BTUUiLCJUQUciXSxtYXRjaDp7SUQ6LyMoKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykvLENMQVNTOi9cLigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKS8sTkFNRTovXFtuYW1lPVsnIl0qKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspWyciXSpcXS8sQVRUUjovXFtccyooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKylccyooPzooXFM/PSlccyooPzooWyciXSkoLio/KVwzfCgjPyg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSopfCl8KVxzKlxdLyxUQUc6L14oKD86W1x3XHUwMGMwLVx1RkZGRlwqXC1dfFxcLikrKS8sQ0hJTEQ6Lzoob25seXxudGh8bGFzdHxmaXJzdCktY2hpbGQoPzpcKFxzKihldmVufG9kZHwoPzpbK1wtXT9cZCt8KD86WytcLV0/XGQqKT9uXHMqKD86WytcLV1ccypcZCspPykpXHMqXCkpPy8sUE9TOi86KG50aHxlcXxndHxsdHxmaXJzdHxsYXN0fGV2ZW58b2RkKSg/OlwoKFxkKilcKSk/KD89W15cLV18JCkvLFBTRVVETzovOigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKSg/OlwoKFsnIl0/KSgoPzpcKFteXCldK1wpfFteXChcKV0qKSspXDJcKSk/L30sbGVmdE1hdGNoOnt9LGF0dHJNYXA6eyJjbGFzcyI6ImNsYXNzTmFtZSIsImZvciI6Imh0bWxGb3IifSxhdHRySGFuZGxlOntocmVmOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSx0eXBlOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgidHlwZSIpfX0scmVsYXRpdmU6eyIrIjpmdW5jdGlvbihhLGIpe3ZhciBjPXR5cGVvZiBiPT0ic3RyaW5nIixkPWMmJiFsLnRlc3QoYiksZT1jJiYhZDtkJiYoYj1iLnRvTG93ZXJDYXNlKCkpO2Zvcih2YXIgZj0wLGc9YS5sZW5ndGgsaDtmPGc7ZisrKWlmKGg9YVtmXSl7d2hpbGUoKGg9aC5wcmV2aW91c1NpYmxpbmcpJiZoLm5vZGVUeXBlIT09MSk7YVtmXT1lfHxoJiZoLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iP2h8fCExOmg9PT1ifWUmJm0uZmlsdGVyKGIsYSwhMCl9LCI+IjpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9dHlwZW9mIGI9PSJzdHJpbmciLGU9MCxmPWEubGVuZ3RoO2lmKGQmJiFsLnRlc3QoYikpe2I9Yi50b0xvd2VyQ2FzZSgpO2Zvcig7ZTxmO2UrKyl7Yz1hW2VdO2lmKGMpe3ZhciBnPWMucGFyZW50Tm9kZTthW2VdPWcubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWI/ZzohMX19fWVsc2V7Zm9yKDtlPGY7ZSsrKWM9YVtlXSxjJiYoYVtlXT1kP2MucGFyZW50Tm9kZTpjLnBhcmVudE5vZGU9PT1iKTtkJiZtLmZpbHRlcihiLGEsITApfX0sIiI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGY9ZSsrLGc9eDt0eXBlb2YgYj09InN0cmluZyImJiFsLnRlc3QoYikmJihiPWIudG9Mb3dlckNhc2UoKSxkPWIsZz13KSxnKCJwYXJlbnROb2RlIixiLGYsYSxkLGMpfSwifiI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGY9ZSsrLGc9eDt0eXBlb2YgYj09InN0cmluZyImJiFsLnRlc3QoYikmJihiPWIudG9Mb3dlckNhc2UoKSxkPWIsZz13KSxnKCJwcmV2aW91c1NpYmxpbmciLGIsZixhLGQsYyl9fSxmaW5kOntJRDpmdW5jdGlvbihhLGIsYyl7aWYodHlwZW9mIGIuZ2V0RWxlbWVudEJ5SWQhPSJ1bmRlZmluZWQiJiYhYyl7dmFyIGQ9Yi5nZXRFbGVtZW50QnlJZChhWzFdKTtyZXR1cm4gZCYmZC5wYXJlbnROb2RlP1tkXTpbXX19LE5BTUU6ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYi5nZXRFbGVtZW50c0J5TmFtZSE9InVuZGVmaW5lZCIpe3ZhciBjPVtdLGQ9Yi5nZXRFbGVtZW50c0J5TmFtZShhWzFdKTtmb3IodmFyIGU9MCxmPWQubGVuZ3RoO2U8ZjtlKyspZFtlXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKT09PWFbMV0mJmMucHVzaChkW2VdKTtyZXR1cm4gYy5sZW5ndGg9PT0wP251bGw6Y319LFRBRzpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRzQnlUYWdOYW1lIT0idW5kZWZpbmVkIilyZXR1cm4gYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhWzFdKX19LHByZUZpbHRlcjp7Q0xBU1M6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2E9IiAiK2FbMV0ucmVwbGFjZShqLCIiKSsiICI7aWYoZilyZXR1cm4gYTtmb3IodmFyIGc9MCxoOyhoPWJbZ10pIT1udWxsO2crKyloJiYoZV4oaC5jbGFzc05hbWUmJigiICIraC5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKC9bXHRcblxyXS9nLCIgIikuaW5kZXhPZihhKT49MCk/Y3x8ZC5wdXNoKGgpOmMmJihiW2ddPSExKSk7cmV0dXJuITF9LElEOmZ1bmN0aW9uKGEpe3JldHVybiBhWzFdLnJlcGxhY2UoaiwiIil9LFRBRzpmdW5jdGlvbihhLGIpe3JldHVybiBhWzFdLnJlcGxhY2UoaiwiIikudG9Mb3dlckNhc2UoKX0sQ0hJTEQ6ZnVuY3Rpb24oYSl7aWYoYVsxXT09PSJudGgiKXthWzJdfHxtLmVycm9yKGFbMF0pLGFbMl09YVsyXS5yZXBsYWNlKC9eXCt8XHMqL2csIiIpO3ZhciBiPS8oLT8pKFxkKikoPzpuKFsrXC1dP1xkKikpPy8uZXhlYyhhWzJdPT09ImV2ZW4iJiYiMm4ifHxhWzJdPT09Im9kZCImJiIybisxInx8IS9cRC8udGVzdChhWzJdKSYmIjBuKyIrYVsyXXx8YVsyXSk7YVsyXT1iWzFdKyhiWzJdfHwxKS0wLGFbM109YlszXS0wfWVsc2UgYVsyXSYmbS5lcnJvcihhWzBdKTthWzBdPWUrKztyZXR1cm4gYX0sQVRUUjpmdW5jdGlvbihhLGIsYyxkLGUsZil7dmFyIGc9YVsxXT1hWzFdLnJlcGxhY2UoaiwiIik7IWYmJm8uYXR0ck1hcFtnXSYmKGFbMV09by5hdHRyTWFwW2ddKSxhWzRdPShhWzRdfHxhWzVdfHwiIikucmVwbGFjZShqLCIiKSxhWzJdPT09In49IiYmKGFbNF09IiAiK2FbNF0rIiAiKTtyZXR1cm4gYX0sUFNFVURPOmZ1bmN0aW9uKGIsYyxkLGUsZil7aWYoYlsxXT09PSJub3QiKWlmKChhLmV4ZWMoYlszXSl8fCIiKS5sZW5ndGg+MXx8L15cdy8udGVzdChiWzNdKSliWzNdPW0oYlszXSxudWxsLG51bGwsYyk7ZWxzZXt2YXIgZz1tLmZpbHRlcihiWzNdLGMsZCwhMF5mKTtkfHxlLnB1c2guYXBwbHkoZSxnKTtyZXR1cm4hMX1lbHNlIGlmKG8ubWF0Y2guUE9TLnRlc3QoYlswXSl8fG8ubWF0Y2guQ0hJTEQudGVzdChiWzBdKSlyZXR1cm4hMDtyZXR1cm4gYn0sUE9TOmZ1bmN0aW9uKGEpe2EudW5zaGlmdCghMCk7cmV0dXJuIGF9fSxmaWx0ZXJzOntlbmFibGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc2FibGVkPT09ITEmJmEudHlwZSE9PSJoaWRkZW4ifSxkaXNhYmxlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXNhYmxlZD09PSEwfSxjaGVja2VkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmNoZWNrZWQ9PT0hMH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oYSl7YS5wYXJlbnROb2RlJiZhLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDtyZXR1cm4gYS5zZWxlY3RlZD09PSEwfSxwYXJlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuISFhLmZpcnN0Q2hpbGR9LGVtcHR5OmZ1bmN0aW9uKGEpe3JldHVybiFhLmZpcnN0Q2hpbGR9LGhhczpmdW5jdGlvbihhLGIsYyl7cmV0dXJuISFtKGNbM10sYSkubGVuZ3RofSxoZWFkZXI6ZnVuY3Rpb24oYSl7cmV0dXJuL2hcZC9pLnRlc3QoYS5ub2RlTmFtZSl9LHRleHQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxjPWEudHlwZTtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmInRleHQiPT09YyYmKGI9PT1jfHxiPT09bnVsbCl9LHJhZGlvOmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYicmFkaW8iPT09YS50eXBlfSxjaGVja2JveDpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmImNoZWNrYm94Ij09PWEudHlwZX0sZmlsZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmImZpbGUiPT09YS50eXBlfSxwYXNzd29yZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmInBhc3N3b3JkIj09PWEudHlwZX0sc3VibWl0OmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oYj09PSJpbnB1dCJ8fGI9PT0iYnV0dG9uIikmJiJzdWJtaXQiPT09YS50eXBlfSxpbWFnZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmImltYWdlIj09PWEudHlwZX0scmVzZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybihiPT09ImlucHV0Inx8Yj09PSJidXR0b24iKSYmInJlc2V0Ij09PWEudHlwZX0sYnV0dG9uOmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gYj09PSJpbnB1dCImJiJidXR0b24iPT09YS50eXBlfHxiPT09ImJ1dHRvbiJ9LGlucHV0OmZ1bmN0aW9uKGEpe3JldHVybi9pbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uL2kudGVzdChhLm5vZGVOYW1lKX0sZm9jdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1hLm93bmVyRG9jdW1lbnQuYWN0aXZlRWxlbWVudH19LHNldEZpbHRlcnM6e2ZpcnN0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGI9PT0wfSxsYXN0OmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBiPT09ZC5sZW5ndGgtMX0sZXZlbjpmdW5jdGlvbihhLGIpe3JldHVybiBiJTI9PT0wfSxvZGQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYiUyPT09MX0sbHQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBiPGNbM10tMH0sZ3Q6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBiPmNbM10tMH0sbnRoOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gY1szXS0wPT09Yn0sZXE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjWzNdLTA9PT1ifX0sZmlsdGVyOntQU0VVRE86ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9YlsxXSxmPW8uZmlsdGVyc1tlXTtpZihmKXJldHVybiBmKGEsYyxiLGQpO2lmKGU9PT0iY29udGFpbnMiKXJldHVybihhLnRleHRDb250ZW50fHxhLmlubmVyVGV4dHx8bihbYV0pfHwiIikuaW5kZXhPZihiWzNdKT49MDtpZihlPT09Im5vdCIpe3ZhciBnPWJbM107Zm9yKHZhciBoPTAsaT1nLmxlbmd0aDtoPGk7aCsrKWlmKGdbaF09PT1hKXJldHVybiExO3JldHVybiEwfW0uZXJyb3IoZSl9LENISUxEOmZ1bmN0aW9uKGEsYil7dmFyIGMsZSxmLGcsaCxpLGosaz1iWzFdLGw9YTtzd2l0Y2goayl7Y2FzZSJvbmx5IjpjYXNlImZpcnN0Ijp3aGlsZShsPWwucHJldmlvdXNTaWJsaW5nKWlmKGwubm9kZVR5cGU9PT0xKXJldHVybiExO2lmKGs9PT0iZmlyc3QiKXJldHVybiEwO2w9YTtjYXNlImxhc3QiOndoaWxlKGw9bC5uZXh0U2libGluZylpZihsLm5vZGVUeXBlPT09MSlyZXR1cm4hMTtyZXR1cm4hMDtjYXNlIm50aCI6Yz1iWzJdLGU9YlszXTtpZihjPT09MSYmZT09PTApcmV0dXJuITA7Zj1iWzBdLGc9YS5wYXJlbnROb2RlO2lmKGcmJihnW2RdIT09Znx8IWEubm9kZUluZGV4KSl7aT0wO2ZvcihsPWcuZmlyc3RDaGlsZDtsO2w9bC5uZXh0U2libGluZylsLm5vZGVUeXBlPT09MSYmKGwubm9kZUluZGV4PSsraSk7Z1tkXT1mfWo9YS5ub2RlSW5kZXgtZTtyZXR1cm4gYz09PTA/aj09PTA6aiVjPT09MCYmai9jPj0wfX0sSUQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5ub2RlVHlwZT09PTEmJmEuZ2V0QXR0cmlidXRlKCJpZCIpPT09Yn0sVEFHOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGI9PT0iKiImJmEubm9kZVR5cGU9PT0xfHwhIWEubm9kZU5hbWUmJmEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWJ9LENMQVNTOmZ1bmN0aW9uKGEsYil7cmV0dXJuKCIgIisoYS5jbGFzc05hbWV8fGEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpKSsiICIpLmluZGV4T2YoYik+LTF9LEFUVFI6ZnVuY3Rpb24oYSxiKXt2YXIgYz1iWzFdLGQ9bS5hdHRyP20uYXR0cihhLGMpOm8uYXR0ckhhbmRsZVtjXT9vLmF0dHJIYW5kbGVbY10oYSk6YVtjXSE9bnVsbD9hW2NdOmEuZ2V0QXR0cmlidXRlKGMpLGU9ZCsiIixmPWJbMl0sZz1iWzRdO3JldHVybiBkPT1udWxsP2Y9PT0iIT0iOiFmJiZtLmF0dHI/ZCE9bnVsbDpmPT09Ij0iP2U9PT1nOmY9PT0iKj0iP2UuaW5kZXhPZihnKT49MDpmPT09In49Ij8oIiAiK2UrIiAiKS5pbmRleE9mKGcpPj0wOmc/Zj09PSIhPSI/ZSE9PWc6Zj09PSJePSI/ZS5pbmRleE9mKGcpPT09MDpmPT09IiQ9Ij9lLnN1YnN0cihlLmxlbmd0aC1nLmxlbmd0aCk9PT1nOmY9PT0ifD0iP2U9PT1nfHxlLnN1YnN0cigwLGcubGVuZ3RoKzEpPT09ZysiLSI6ITE6ZSYmZCE9PSExfSxQT1M6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9YlsyXSxmPW8uc2V0RmlsdGVyc1tlXTtpZihmKXJldHVybiBmKGEsYyxiLGQpfX19LHA9by5tYXRjaC5QT1MscT1mdW5jdGlvbihhLGIpe3JldHVybiJcXCIrKGItMCsxKX07Zm9yKHZhciByIGluIG8ubWF0Y2gpby5tYXRjaFtyXT1uZXcgUmVnRXhwKG8ubWF0Y2hbcl0uc291cmNlKy8oPyFbXlxbXSpcXSkoPyFbXlwoXSpcKSkvLnNvdXJjZSksby5sZWZ0TWF0Y2hbcl09bmV3IFJlZ0V4cCgvKF4oPzoufFxyfFxuKSo/KS8uc291cmNlK28ubWF0Y2hbcl0uc291cmNlLnJlcGxhY2UoL1xcKFxkKykvZyxxKSk7by5tYXRjaC5nbG9iYWxQT1M9cDt2YXIgcz1mdW5jdGlvbihhLGIpe2E9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSwwKTtpZihiKXtiLnB1c2guYXBwbHkoYixhKTtyZXR1cm4gYn1yZXR1cm4gYX07dHJ5e0FycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGMuZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMsMClbMF0ubm9kZVR5cGV9Y2F0Y2godCl7cz1mdW5jdGlvbihhLGIpe3ZhciBjPTAsZD1ifHxbXTtpZihnLmNhbGwoYSk9PT0iW29iamVjdCBBcnJheV0iKUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGQsYSk7ZWxzZSBpZih0eXBlb2YgYS5sZW5ndGg9PSJudW1iZXIiKWZvcih2YXIgZT1hLmxlbmd0aDtjPGU7YysrKWQucHVzaChhW2NdKTtlbHNlIGZvcig7YVtjXTtjKyspZC5wdXNoKGFbY10pO3JldHVybiBkfX12YXIgdSx2O2MuZG9jdW1lbnRFbGVtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP3U9ZnVuY3Rpb24oYSxiKXtpZihhPT09Yil7aD0hMDtyZXR1cm4gMH1pZighYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbnx8IWIuY29tcGFyZURvY3VtZW50UG9zaXRpb24pcmV0dXJuIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24/LTE6MTtyZXR1cm4gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSY0Py0xOjF9Oih1PWZ1bmN0aW9uKGEsYil7aWYoYT09PWIpe2g9ITA7cmV0dXJuIDB9aWYoYS5zb3VyY2VJbmRleCYmYi5zb3VyY2VJbmRleClyZXR1cm4gYS5zb3VyY2VJbmRleC1iLnNvdXJjZUluZGV4O3ZhciBjLGQsZT1bXSxmPVtdLGc9YS5wYXJlbnROb2RlLGk9Yi5wYXJlbnROb2RlLGo9ZztpZihnPT09aSlyZXR1cm4gdihhLGIpO2lmKCFnKXJldHVybi0xO2lmKCFpKXJldHVybiAxO3doaWxlKGopZS51bnNoaWZ0KGopLGo9ai5wYXJlbnROb2RlO2o9aTt3aGlsZShqKWYudW5zaGlmdChqKSxqPWoucGFyZW50Tm9kZTtjPWUubGVuZ3RoLGQ9Zi5sZW5ndGg7Zm9yKHZhciBrPTA7azxjJiZrPGQ7aysrKWlmKGVba10hPT1mW2tdKXJldHVybiB2KGVba10sZltrXSk7cmV0dXJuIGs9PT1jP3YoYSxmW2tdLC0xKTp2KGVba10sYiwxKX0sdj1mdW5jdGlvbihhLGIsYyl7aWYoYT09PWIpcmV0dXJuIGM7dmFyIGQ9YS5uZXh0U2libGluZzt3aGlsZShkKXtpZihkPT09YilyZXR1cm4tMTtkPWQubmV4dFNpYmxpbmd9cmV0dXJuIDF9KSxmdW5jdGlvbigpe3ZhciBhPWMuY3JlYXRlRWxlbWVudCgiZGl2IiksZD0ic2NyaXB0IisobmV3IERhdGUpLmdldFRpbWUoKSxlPWMuZG9jdW1lbnRFbGVtZW50O2EuaW5uZXJIVE1MPSI8YSBuYW1lPSciK2QrIicvPiIsZS5pbnNlcnRCZWZvcmUoYSxlLmZpcnN0Q2hpbGQpLGMuZ2V0RWxlbWVudEJ5SWQoZCkmJihvLmZpbmQuSUQ9ZnVuY3Rpb24oYSxjLGQpe2lmKHR5cGVvZiBjLmdldEVsZW1lbnRCeUlkIT0idW5kZWZpbmVkIiYmIWQpe3ZhciBlPWMuZ2V0RWxlbWVudEJ5SWQoYVsxXSk7cmV0dXJuIGU/ZS5pZD09PWFbMV18fHR5cGVvZiBlLmdldEF0dHJpYnV0ZU5vZGUhPSJ1bmRlZmluZWQiJiZlLmdldEF0dHJpYnV0ZU5vZGUoImlkIikubm9kZVZhbHVlPT09YVsxXT9bZV06YjpbXX19LG8uZmlsdGVyLklEPWZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGEuZ2V0QXR0cmlidXRlTm9kZSE9InVuZGVmaW5lZCImJmEuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gYS5ub2RlVHlwZT09PTEmJmMmJmMubm9kZVZhbHVlPT09Yn0pLGUucmVtb3ZlQ2hpbGQoYSksZT1hPW51bGx9KCksZnVuY3Rpb24oKXt2YXIgYT1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuYXBwZW5kQ2hpbGQoYy5jcmVhdGVDb21tZW50KCIiKSksYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aD4wJiYoby5maW5kLlRBRz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYVsxXSk7aWYoYVsxXT09PSIqIil7dmFyIGQ9W107Zm9yKHZhciBlPTA7Y1tlXTtlKyspY1tlXS5ub2RlVHlwZT09PTEmJmQucHVzaChjW2VdKTtjPWR9cmV0dXJuIGN9KSxhLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsYS5maXJzdENoaWxkJiZ0eXBlb2YgYS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSE9InVuZGVmaW5lZCImJmEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSE9PSIjIiYmKG8uYXR0ckhhbmRsZS5ocmVmPWZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgiaHJlZiIsMil9KSxhPW51bGx9KCksYy5xdWVyeVNlbGVjdG9yQWxsJiZmdW5jdGlvbigpe3ZhciBhPW0sYj1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQ9Il9fc2l6emxlX18iO2IuaW5uZXJIVE1MPSI8cCBjbGFzcz0nVEVTVCc+PC9wPiI7aWYoIWIucXVlcnlTZWxlY3RvckFsbHx8Yi5xdWVyeVNlbGVjdG9yQWxsKCIuVEVTVCIpLmxlbmd0aCE9PTApe209ZnVuY3Rpb24oYixlLGYsZyl7ZT1lfHxjO2lmKCFnJiYhbS5pc1hNTChlKSl7dmFyIGg9L14oXHcrJCl8XlwuKFtcd1wtXSskKXxeIyhbXHdcLV0rJCkvLmV4ZWMoYik7aWYoaCYmKGUubm9kZVR5cGU9PT0xfHxlLm5vZGVUeXBlPT09OSkpe2lmKGhbMV0pcmV0dXJuIHMoZS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKSxmKTtpZihoWzJdJiZvLmZpbmQuQ0xBU1MmJmUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSlyZXR1cm4gcyhlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoaFsyXSksZil9aWYoZS5ub2RlVHlwZT09PTkpe2lmKGI9PT0iYm9keSImJmUuYm9keSlyZXR1cm4gcyhbZS5ib2R5XSxmKTtpZihoJiZoWzNdKXt2YXIgaT1lLmdldEVsZW1lbnRCeUlkKGhbM10pO2lmKCFpfHwhaS5wYXJlbnROb2RlKXJldHVybiBzKFtdLGYpO2lmKGkuaWQ9PT1oWzNdKXJldHVybiBzKFtpXSxmKX10cnl7cmV0dXJuIHMoZS5xdWVyeVNlbGVjdG9yQWxsKGIpLGYpfWNhdGNoKGope319ZWxzZSBpZihlLm5vZGVUeXBlPT09MSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT09Im9iamVjdCIpe3ZhciBrPWUsbD1lLmdldEF0dHJpYnV0ZSgiaWQiKSxuPWx8fGQscD1lLnBhcmVudE5vZGUscT0vXlxzKlsrfl0vLnRlc3QoYik7bD9uPW4ucmVwbGFjZSgvJy9nLCJcXCQmIik6ZS5zZXRBdHRyaWJ1dGUoImlkIixuKSxxJiZwJiYoZT1lLnBhcmVudE5vZGUpO3RyeXtpZighcXx8cClyZXR1cm4gcyhlLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZD0nIituKyInXSAiK2IpLGYpfWNhdGNoKHIpe31maW5hbGx5e2x8fGsucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIGEoYixlLGYsZyl9O2Zvcih2YXIgZSBpbiBhKW1bZV09YVtlXTtiPW51bGx9fSgpLGZ1bmN0aW9uKCl7dmFyIGE9Yy5kb2N1bWVudEVsZW1lbnQsYj1hLm1hdGNoZXNTZWxlY3Rvcnx8YS5tb3pNYXRjaGVzU2VsZWN0b3J8fGEud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxhLm1zTWF0Y2hlc1NlbGVjdG9yO2lmKGIpe3ZhciBkPSFiLmNhbGwoYy5jcmVhdGVFbGVtZW50KCJkaXYiKSwiZGl2IiksZT0hMTt0cnl7Yi5jYWxsKGMuZG9jdW1lbnRFbGVtZW50LCJbdGVzdCE9JyddOnNpenpsZSIpfWNhdGNoKGYpe2U9ITB9bS5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYSxjKXtjPWMucmVwbGFjZSgvXD1ccyooW14nIlxdXSopXHMqXF0vZywiPSckMSddIik7aWYoIW0uaXNYTUwoYSkpdHJ5e2lmKGV8fCFvLm1hdGNoLlBTRVVETy50ZXN0KGMpJiYhLyE9Ly50ZXN0KGMpKXt2YXIgZj1iLmNhbGwoYSxjKTtpZihmfHwhZHx8YS5kb2N1bWVudCYmYS5kb2N1bWVudC5ub2RlVHlwZSE9PTExKXJldHVybiBmfX1jYXRjaChnKXt9cmV0dXJuIG0oYyxudWxsLG51bGwsW2FdKS5sZW5ndGg+MH19fSgpLGZ1bmN0aW9uKCl7dmFyIGE9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKTthLmlubmVySFRNTD0iPGRpdiBjbGFzcz0ndGVzdCBlJz48L2Rpdj48ZGl2IGNsYXNzPSd0ZXN0Jz48L2Rpdj4iO2lmKCEhYS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZhLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGghPT0wKXthLmxhc3RDaGlsZC5jbGFzc05hbWU9ImUiO2lmKGEuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aD09PTEpcmV0dXJuO28ub3JkZXIuc3BsaWNlKDEsMCwiQ0xBU1MiKSxvLmZpbmQuQ0xBU1M9ZnVuY3Rpb24oYSxiLGMpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUhPSJ1bmRlZmluZWQiJiYhYylyZXR1cm4gYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGFbMV0pfSxhPW51bGx9fSgpLGMuZG9jdW1lbnRFbGVtZW50LmNvbnRhaW5zP20uY29udGFpbnM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSE9PWImJihhLmNvbnRhaW5zP2EuY29udGFpbnMoYik6ITApfTpjLmRvY3VtZW50RWxlbWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj9tLmNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7cmV0dXJuISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNil9Om0uY29udGFpbnM9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbS5pc1hNTD1mdW5jdGlvbihhKXt2YXIgYj0oYT9hLm93bmVyRG9jdW1lbnR8fGE6MCkuZG9jdW1lbnRFbGVtZW50O3JldHVybiBiP2Iubm9kZU5hbWUhPT0iSFRNTCI6ITF9O3ZhciB5PWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlPVtdLGY9IiIsZz1iLm5vZGVUeXBlP1tiXTpiO3doaWxlKGQ9by5tYXRjaC5QU0VVRE8uZXhlYyhhKSlmKz1kWzBdLGE9YS5yZXBsYWNlKG8ubWF0Y2guUFNFVURPLCIiKTthPW8ucmVsYXRpdmVbYV0/YSsiKiI6YTtmb3IodmFyIGg9MCxpPWcubGVuZ3RoO2g8aTtoKyspbShhLGdbaF0sZSxjKTtyZXR1cm4gbS5maWx0ZXIoZixlKX07bS5hdHRyPWYuYXR0cixtLnNlbGVjdG9ycy5hdHRyTWFwPXt9LGYuZmluZD1tLGYuZXhwcj1tLnNlbGVjdG9ycyxmLmV4cHJbIjoiXT1mLmV4cHIuZmlsdGVycyxmLnVuaXF1ZT1tLnVuaXF1ZVNvcnQsZi50ZXh0PW0uZ2V0VGV4dCxmLmlzWE1MRG9jPW0uaXNYTUwsZi5jb250YWlucz1tLmNvbnRhaW5zfSgpO3ZhciBMPS9VbnRpbCQvLE09L14oPzpwYXJlbnRzfHByZXZVbnRpbHxwcmV2QWxsKS8sTj0vLC8sTz0vXi5bXjojXFtcLixdKiQvLFA9QXJyYXkucHJvdG90eXBlLnNsaWNlLFE9Zi5leHByLm1hdGNoLmdsb2JhbFBPUyxSPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O2YuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYyxkO2lmKHR5cGVvZiBhIT0ic3RyaW5nIilyZXR1cm4gZihhKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYz0wLGQ9Yi5sZW5ndGg7YzxkO2MrKylpZihmLmNvbnRhaW5zKGJbY10sdGhpcykpcmV0dXJuITB9KTt2YXIgZT10aGlzLnB1c2hTdGFjaygiIiwiZmluZCIsYSksZyxoLGk7Zm9yKGM9MCxkPXRoaXMubGVuZ3RoO2M8ZDtjKyspe2c9ZS5sZW5ndGgsZi5maW5kKGEsdGhpc1tjXSxlKTtpZihjPjApZm9yKGg9ZztoPGUubGVuZ3RoO2grKylmb3IoaT0wO2k8ZztpKyspaWYoZVtpXT09PWVbaF0pe2Uuc3BsaWNlKGgtLSwxKTticmVha319cmV0dXJuIGV9LGhhczpmdW5jdGlvbihhKXt2YXIgYj1mKGEpO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih2YXIgYT0wLGM9Yi5sZW5ndGg7YTxjO2ErKylpZihmLmNvbnRhaW5zKHRoaXMsYlthXSkpcmV0dXJuITB9KX0sbm90OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhUKHRoaXMsYSwhMSksIm5vdCIsYSl9LGZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soVCh0aGlzLGEsITApLCJmaWx0ZXIiLGEpfSxpczpmdW5jdGlvbihhKXtyZXR1cm4hIWEmJih0eXBlb2YgYT09InN0cmluZyI/US50ZXN0KGEpP2YoYSx0aGlzLmNvbnRleHQpLmluZGV4KHRoaXNbMF0pPj0wOmYuZmlsdGVyKGEsdGhpcykubGVuZ3RoPjA6dGhpcy5maWx0ZXIoYSkubGVuZ3RoPjApfSxjbG9zZXN0OmZ1bmN0aW9uKGEsYil7dmFyIGM9W10sZCxlLGc9dGhpc1swXTtpZihmLmlzQXJyYXkoYSkpe3ZhciBoPTE7d2hpbGUoZyYmZy5vd25lckRvY3VtZW50JiZnIT09Yil7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmKGcpLmlzKGFbZF0pJiZjLnB1c2goe3NlbGVjdG9yOmFbZF0sZWxlbTpnLGxldmVsOmh9KTtnPWcucGFyZW50Tm9kZSxoKyt9cmV0dXJuIGN9dmFyIGk9US50ZXN0KGEpfHx0eXBlb2YgYSE9InN0cmluZyI/ZihhLGJ8fHRoaXMuY29udGV4dCk6MDtmb3IoZD0wLGU9dGhpcy5sZW5ndGg7ZDxlO2QrKyl7Zz10aGlzW2RdO3doaWxlKGcpe2lmKGk/aS5pbmRleChnKT4tMTpmLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGcsYSkpe2MucHVzaChnKTticmVha31nPWcucGFyZW50Tm9kZTtpZighZ3x8IWcub3duZXJEb2N1bWVudHx8Zz09PWJ8fGcubm9kZVR5cGU9PT0xMSlicmVha319Yz1jLmxlbmd0aD4xP2YudW5pcXVlKGMpOmM7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGMsImNsb3Nlc3QiLGEpfSxpbmRleDpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4gdGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMucHJldkFsbCgpLmxlbmd0aDotMTtpZih0eXBlb2YgYT09InN0cmluZyIpcmV0dXJuIGYuaW5BcnJheSh0aGlzWzBdLGYoYSkpO3JldHVybiBmLmluQXJyYXkoYS5qcXVlcnk/YVswXTphLHRoaXMpfSxhZGQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYT09InN0cmluZyI/ZihhLGIpOmYubWFrZUFycmF5KGEmJmEubm9kZVR5cGU/W2FdOmEpLGQ9Zi5tZXJnZSh0aGlzLmdldCgpLGMpO3JldHVybiB0aGlzLnB1c2hTdGFjayhTKGNbMF0pfHxTKGRbMF0pP2Q6Zi51bmlxdWUoZCkpfSxhbmRTZWxmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWRkKHRoaXMucHJldk9iamVjdCl9fSksZi5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO3JldHVybiBiJiZiLm5vZGVUeXBlIT09MTE/YjpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBmLmRpcihhLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuZGlyKGEsInBhcmVudE5vZGUiLGMpfSxuZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBmLm50aChhLDIsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIGYubnRoKGEsMiwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGYuZGlyKGEsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGYuZGlyKGEsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmRpcihhLCJuZXh0U2libGluZyIsYyl9LHByZXZVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuZGlyKGEsInByZXZpb3VzU2libGluZyIsYyl9LHNpYmxpbmdzOmZ1bmN0aW9uKGEpe3JldHVybiBmLnNpYmxpbmcoKGEucGFyZW50Tm9kZXx8e30pLmZpcnN0Q2hpbGQsYSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGEpe3JldHVybiBmLnNpYmxpbmcoYS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGYubm9kZU5hbWUoYSwiaWZyYW1lIik/YS5jb250ZW50RG9jdW1lbnR8fGEuY29udGVudFdpbmRvdy5kb2N1bWVudDpmLm1ha2VBcnJheShhLmNoaWxkTm9kZXMpfX0sZnVuY3Rpb24oYSxiKXtmLmZuW2FdPWZ1bmN0aW9uKGMsZCl7dmFyIGU9Zi5tYXAodGhpcyxiLGMpO0wudGVzdChhKXx8KGQ9YyksZCYmdHlwZW9mIGQ9PSJzdHJpbmciJiYoZT1mLmZpbHRlcihkLGUpKSxlPXRoaXMubGVuZ3RoPjEmJiFSW2FdP2YudW5pcXVlKGUpOmUsKHRoaXMubGVuZ3RoPjF8fE4udGVzdChkKSkmJk0udGVzdChhKSYmKGU9ZS5yZXZlcnNlKCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhlLGEsUC5jYWxsKGFyZ3VtZW50cykuam9pbigiLCIpKX19KSxmLmV4dGVuZCh7ZmlsdGVyOmZ1bmN0aW9uKGEsYixjKXtjJiYoYT0iOm5vdCgiK2ErIikiKTtyZXR1cm4gYi5sZW5ndGg9PT0xP2YuZmluZC5tYXRjaGVzU2VsZWN0b3IoYlswXSxhKT9bYlswXV06W106Zi5maW5kLm1hdGNoZXMoYSxiKX0sZGlyOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZT1bXSxnPWFbY107d2hpbGUoZyYmZy5ub2RlVHlwZSE9PTkmJihkPT09Ynx8Zy5ub2RlVHlwZSE9PTF8fCFmKGcpLmlzKGQpKSlnLm5vZGVUeXBlPT09MSYmZS5wdXNoKGcpLGc9Z1tjXTtyZXR1cm4gZX0sbnRoOmZ1bmN0aW9uKGEsYixjLGQpe2I9Ynx8MTt2YXIgZT0wO2Zvcig7YTthPWFbY10paWYoYS5ub2RlVHlwZT09PTEmJisrZT09PWIpYnJlYWs7cmV0dXJuIGF9LHNpYmxpbmc6ZnVuY3Rpb24oYSxiKXt2YXIgYz1bXTtmb3IoO2E7YT1hLm5leHRTaWJsaW5nKWEubm9kZVR5cGU9PT0xJiZhIT09YiYmYy5wdXNoKGEpO3JldHVybiBjfX0pO3ZhciBWPSJhYmJyfGFydGljbGV8YXNpZGV8YXVkaW98YmRpfGNhbnZhc3xkYXRhfGRhdGFsaXN0fGRldGFpbHN8ZmlnY2FwdGlvbnxmaWd1cmV8Zm9vdGVyfGhlYWRlcnxoZ3JvdXB8bWFya3xtZXRlcnxuYXZ8b3V0cHV0fHByb2dyZXNzfHNlY3Rpb258c3VtbWFyeXx0aW1lfHZpZGVvIixXPS8galF1ZXJ5XGQrPSIoPzpcZCt8bnVsbCkiL2csWD0vXlxzKy8sWT0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXHc6XSspW14+XSopXC8+L2lnLFo9LzwoW1x3Ol0rKS8sJD0vPHRib2R5L2ksXz0vPHwmIz9cdys7LyxiYT0vPCg/OnNjcmlwdHxzdHlsZSkvaSxiYj0vPCg/OnNjcmlwdHxvYmplY3R8ZW1iZWR8b3B0aW9ufHN0eWxlKS9pLGJjPW5ldyBSZWdFeHAoIjwoPzoiK1YrIilbXFxzLz5dIiwiaSIpLGJkPS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLGJlPS9cLyhqYXZhfGVjbWEpc2NyaXB0L2ksYmY9L15ccyo8ISg/OlxbQ0RBVEFcW3xcLVwtKS8sYmc9e29wdGlvbjpbMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsIjwvc2VsZWN0PiJdLGxlZ2VuZDpbMSwiPGZpZWxkc2V0PiIsIjwvZmllbGRzZXQ+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSxhcmVhOlsxLCI8bWFwPiIsIjwvbWFwPiJdLF9kZWZhdWx0OlswLCIiLCIiXX0sYmg9VShjKTtiZy5vcHRncm91cD1iZy5vcHRpb24sYmcudGJvZHk9YmcudGZvb3Q9YmcuY29sZ3JvdXA9YmcuY2FwdGlvbj1iZy50aGVhZCxiZy50aD1iZy50ZCxmLnN1cHBvcnQuaHRtbFNlcmlhbGl6ZXx8KGJnLl9kZWZhdWx0PVsxLCJkaXY8ZGl2PiIsIjwvZGl2PiJdKSxmLmZuLmV4dGVuZCh7dGV4dDpmdW5jdGlvbihhKXtyZXR1cm4gZi5hY2Nlc3ModGhpcyxmdW5jdGlvbihhKXtyZXR1cm4gYT09PWI/Zi50ZXh0KHRoaXMpOnRoaXMuZW1wdHkoKS5hcHBlbmQoKHRoaXNbMF0mJnRoaXNbMF0ub3duZXJEb2N1bWVudHx8YykuY3JlYXRlVGV4dE5vZGUoYSkpfSxudWxsLGEsYXJndW1lbnRzLmxlbmd0aCl9LHdyYXBBbGw6ZnVuY3Rpb24oYSl7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Zih0aGlzKS53cmFwQWxsKGEuY2FsbCh0aGlzLGIpKX0pO2lmKHRoaXNbMF0pe3ZhciBiPWYoYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKTt0aGlzWzBdLnBhcmVudE5vZGUmJmIuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLGIubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpczt3aGlsZShhLmZpcnN0Q2hpbGQmJmEuZmlyc3RDaGlsZC5ub2RlVHlwZT09PTEpYT1hLmZpcnN0Q2hpbGQ7cmV0dXJuIGF9KS5hcHBlbmQodGhpcyl9cmV0dXJuIHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihhKXtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtmKHRoaXMpLndyYXBJbm5lcihhLmNhbGwodGhpcyxiKSl9KTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9Zih0aGlzKSxjPWIuY29udGVudHMoKTtjLmxlbmd0aD9jLndyYXBBbGwoYSk6Yi5hcHBlbmQoYSl9KX0sd3JhcDpmdW5jdGlvbihhKXt2YXIgYj1mLmlzRnVuY3Rpb24oYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXtmKHRoaXMpLndyYXBBbGwoYj9hLmNhbGwodGhpcyxjKTphKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7Zi5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fGYodGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITAsZnVuY3Rpb24oYSl7dGhpcy5ub2RlVHlwZT09PTEmJnRoaXMuYXBwZW5kQ2hpbGQoYSl9KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywhMCxmdW5jdGlvbihhKXt0aGlzLm5vZGVUeXBlPT09MSYmdGhpcy5pbnNlcnRCZWZvcmUoYSx0aGlzLmZpcnN0Q2hpbGQpfSl9LGJlZm9yZTpmdW5jdGlvbigpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITEsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLHRoaXMpfSk7aWYoYXJndW1lbnRzLmxlbmd0aCl7dmFyIGE9ZgouY2xlYW4oYXJndW1lbnRzKTthLnB1c2guYXBwbHkoYSx0aGlzLnRvQXJyYXkoKSk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGEsImJlZm9yZSIsYXJndW1lbnRzKX19LGFmdGVyOmZ1bmN0aW9uKCl7aWYodGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlKXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywhMSxmdW5jdGlvbihhKXt0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcy5uZXh0U2libGluZyl9KTtpZihhcmd1bWVudHMubGVuZ3RoKXt2YXIgYT10aGlzLnB1c2hTdGFjayh0aGlzLCJhZnRlciIsYXJndW1lbnRzKTthLnB1c2guYXBwbHkoYSxmLmNsZWFuKGFyZ3VtZW50cykpO3JldHVybiBhfX0scmVtb3ZlOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTAsZDsoZD10aGlzW2NdKSE9bnVsbDtjKyspaWYoIWF8fGYuZmlsdGVyKGEsW2RdKS5sZW5ndGgpIWImJmQubm9kZVR5cGU9PT0xJiYoZi5jbGVhbkRhdGEoZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpKSxmLmNsZWFuRGF0YShbZF0pKSxkLnBhcmVudE5vZGUmJmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkKTtyZXR1cm4gdGhpc30sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MCxiOyhiPXRoaXNbYV0pIT1udWxsO2ErKyl7Yi5ub2RlVHlwZT09PTEmJmYuY2xlYW5EYXRhKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSk7d2hpbGUoYi5maXJzdENoaWxkKWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKX1yZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oYSxiKXthPWE9PW51bGw/ITE6YSxiPWI9PW51bGw/YTpiO3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiBmLmNsb25lKHRoaXMsYSxiKX0pfSxodG1sOmZ1bmN0aW9uKGEpe3JldHVybiBmLmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGEpe3ZhciBjPXRoaXNbMF18fHt9LGQ9MCxlPXRoaXMubGVuZ3RoO2lmKGE9PT1iKXJldHVybiBjLm5vZGVUeXBlPT09MT9jLmlubmVySFRNTC5yZXBsYWNlKFcsIiIpOm51bGw7aWYodHlwZW9mIGE9PSJzdHJpbmciJiYhYmEudGVzdChhKSYmKGYuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZXx8IVgudGVzdChhKSkmJiFiZ1soWi5leGVjKGEpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSl7YT1hLnJlcGxhY2UoWSwiPCQxPjwvJDI+Iik7dHJ5e2Zvcig7ZDxlO2QrKyljPXRoaXNbZF18fHt9LGMubm9kZVR5cGU9PT0xJiYoZi5jbGVhbkRhdGEoYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpKSxjLmlubmVySFRNTD1hKTtjPTB9Y2F0Y2goZyl7fX1jJiZ0aGlzLmVtcHR5KCkuYXBwZW5kKGEpfSxudWxsLGEsYXJndW1lbnRzLmxlbmd0aCl9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKGEpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSl7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7dmFyIGM9Zih0aGlzKSxkPWMuaHRtbCgpO2MucmVwbGFjZVdpdGgoYS5jYWxsKHRoaXMsYixkKSl9KTt0eXBlb2YgYSE9InN0cmluZyImJihhPWYoYSkuZGV0YWNoKCkpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj10aGlzLm5leHRTaWJsaW5nLGM9dGhpcy5wYXJlbnROb2RlO2YodGhpcykucmVtb3ZlKCksYj9mKGIpLmJlZm9yZShhKTpmKGMpLmFwcGVuZChhKX0pfXJldHVybiB0aGlzLmxlbmd0aD90aGlzLnB1c2hTdGFjayhmKGYuaXNGdW5jdGlvbihhKT9hKCk6YSksInJlcGxhY2VXaXRoIixhKTp0aGlzfSxkZXRhY2g6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucmVtb3ZlKGEsITApfSxkb21NYW5pcDpmdW5jdGlvbihhLGMsZCl7dmFyIGUsZyxoLGksaj1hWzBdLGs9W107aWYoIWYuc3VwcG9ydC5jaGVja0Nsb25lJiZhcmd1bWVudHMubGVuZ3RoPT09MyYmdHlwZW9mIGo9PSJzdHJpbmciJiZiZC50ZXN0KGopKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmKHRoaXMpLmRvbU1hbmlwKGEsYyxkLCEwKX0pO2lmKGYuaXNGdW5jdGlvbihqKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe3ZhciBnPWYodGhpcyk7YVswXT1qLmNhbGwodGhpcyxlLGM/Zy5odG1sKCk6YiksZy5kb21NYW5pcChhLGMsZCl9KTtpZih0aGlzWzBdKXtpPWomJmoucGFyZW50Tm9kZSxmLnN1cHBvcnQucGFyZW50Tm9kZSYmaSYmaS5ub2RlVHlwZT09PTExJiZpLmNoaWxkTm9kZXMubGVuZ3RoPT09dGhpcy5sZW5ndGg/ZT17ZnJhZ21lbnQ6aX06ZT1mLmJ1aWxkRnJhZ21lbnQoYSx0aGlzLGspLGg9ZS5mcmFnbWVudCxoLmNoaWxkTm9kZXMubGVuZ3RoPT09MT9nPWg9aC5maXJzdENoaWxkOmc9aC5maXJzdENoaWxkO2lmKGcpe2M9YyYmZi5ub2RlTmFtZShnLCJ0ciIpO2Zvcih2YXIgbD0wLG09dGhpcy5sZW5ndGgsbj1tLTE7bDxtO2wrKylkLmNhbGwoYz9iaSh0aGlzW2xdLGcpOnRoaXNbbF0sZS5jYWNoZWFibGV8fG0+MSYmbDxuP2YuY2xvbmUoaCwhMCwhMCk6aCl9ay5sZW5ndGgmJmYuZWFjaChrLGZ1bmN0aW9uKGEsYil7Yi5zcmM/Zi5hamF4KHt0eXBlOiJHRVQiLGdsb2JhbDohMSx1cmw6Yi5zcmMsYXN5bmM6ITEsZGF0YVR5cGU6InNjcmlwdCJ9KTpmLmdsb2JhbEV2YWwoKGIudGV4dHx8Yi50ZXh0Q29udGVudHx8Yi5pbm5lckhUTUx8fCIiKS5yZXBsYWNlKGJmLCIvKiQwKi8iKSksYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYil9KX1yZXR1cm4gdGhpc319KSxmLmJ1aWxkRnJhZ21lbnQ9ZnVuY3Rpb24oYSxiLGQpe3ZhciBlLGcsaCxpLGo9YVswXTtiJiZiWzBdJiYoaT1iWzBdLm93bmVyRG9jdW1lbnR8fGJbMF0pLGkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudHx8KGk9YyksYS5sZW5ndGg9PT0xJiZ0eXBlb2Ygaj09InN0cmluZyImJmoubGVuZ3RoPDUxMiYmaT09PWMmJmouY2hhckF0KDApPT09IjwiJiYhYmIudGVzdChqKSYmKGYuc3VwcG9ydC5jaGVja0Nsb25lfHwhYmQudGVzdChqKSkmJihmLnN1cHBvcnQuaHRtbDVDbG9uZXx8IWJjLnRlc3QoaikpJiYoZz0hMCxoPWYuZnJhZ21lbnRzW2pdLGgmJmghPT0xJiYoZT1oKSksZXx8KGU9aS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksZi5jbGVhbihhLGksZSxkKSksZyYmKGYuZnJhZ21lbnRzW2pdPWg/ZToxKTtyZXR1cm57ZnJhZ21lbnQ6ZSxjYWNoZWFibGU6Z319LGYuZnJhZ21lbnRzPXt9LGYuZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGEsYil7Zi5mblthXT1mdW5jdGlvbihjKXt2YXIgZD1bXSxlPWYoYyksZz10aGlzLmxlbmd0aD09PTEmJnRoaXNbMF0ucGFyZW50Tm9kZTtpZihnJiZnLm5vZGVUeXBlPT09MTEmJmcuY2hpbGROb2Rlcy5sZW5ndGg9PT0xJiZlLmxlbmd0aD09PTEpe2VbYl0odGhpc1swXSk7cmV0dXJuIHRoaXN9Zm9yKHZhciBoPTAsaT1lLmxlbmd0aDtoPGk7aCsrKXt2YXIgaj0oaD4wP3RoaXMuY2xvbmUoITApOnRoaXMpLmdldCgpO2YoZVtoXSlbYl0oaiksZD1kLmNvbmNhdChqKX1yZXR1cm4gdGhpcy5wdXNoU3RhY2soZCxhLGUuc2VsZWN0b3IpfX0pLGYuZXh0ZW5kKHtjbG9uZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxnLGg9Zi5zdXBwb3J0Lmh0bWw1Q2xvbmV8fGYuaXNYTUxEb2MoYSl8fCFiYy50ZXN0KCI8IithLm5vZGVOYW1lKyI+Iik/YS5jbG9uZU5vZGUoITApOmJvKGEpO2lmKCghZi5zdXBwb3J0Lm5vQ2xvbmVFdmVudHx8IWYuc3VwcG9ydC5ub0Nsb25lQ2hlY2tlZCkmJihhLm5vZGVUeXBlPT09MXx8YS5ub2RlVHlwZT09PTExKSYmIWYuaXNYTUxEb2MoYSkpe2JrKGEsaCksZD1ibChhKSxlPWJsKGgpO2ZvcihnPTA7ZFtnXTsrK2cpZVtnXSYmYmsoZFtnXSxlW2ddKX1pZihiKXtiaihhLGgpO2lmKGMpe2Q9YmwoYSksZT1ibChoKTtmb3IoZz0wO2RbZ107KytnKWJqKGRbZ10sZVtnXSl9fWQ9ZT1udWxsO3JldHVybiBofSxjbGVhbjpmdW5jdGlvbihhLGIsZCxlKXt2YXIgZyxoLGksaj1bXTtiPWJ8fGMsdHlwZW9mIGIuY3JlYXRlRWxlbWVudD09InVuZGVmaW5lZCImJihiPWIub3duZXJEb2N1bWVudHx8YlswXSYmYlswXS5vd25lckRvY3VtZW50fHxjKTtmb3IodmFyIGs9MCxsOyhsPWFba10pIT1udWxsO2srKyl7dHlwZW9mIGw9PSJudW1iZXIiJiYobCs9IiIpO2lmKCFsKWNvbnRpbnVlO2lmKHR5cGVvZiBsPT0ic3RyaW5nIilpZighXy50ZXN0KGwpKWw9Yi5jcmVhdGVUZXh0Tm9kZShsKTtlbHNle2w9bC5yZXBsYWNlKFksIjwkMT48LyQyPiIpO3ZhciBtPShaLmV4ZWMobCl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCksbj1iZ1ttXXx8YmcuX2RlZmF1bHQsbz1uWzBdLHA9Yi5jcmVhdGVFbGVtZW50KCJkaXYiKSxxPWJoLmNoaWxkTm9kZXMscjtiPT09Yz9iaC5hcHBlbmRDaGlsZChwKTpVKGIpLmFwcGVuZENoaWxkKHApLHAuaW5uZXJIVE1MPW5bMV0rbCtuWzJdO3doaWxlKG8tLSlwPXAubGFzdENoaWxkO2lmKCFmLnN1cHBvcnQudGJvZHkpe3ZhciBzPSQudGVzdChsKSx0PW09PT0idGFibGUiJiYhcz9wLmZpcnN0Q2hpbGQmJnAuZmlyc3RDaGlsZC5jaGlsZE5vZGVzOm5bMV09PT0iPHRhYmxlPiImJiFzP3AuY2hpbGROb2RlczpbXTtmb3IoaT10Lmxlbmd0aC0xO2k+PTA7LS1pKWYubm9kZU5hbWUodFtpXSwidGJvZHkiKSYmIXRbaV0uY2hpbGROb2Rlcy5sZW5ndGgmJnRbaV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0W2ldKX0hZi5zdXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNlJiZYLnRlc3QobCkmJnAuaW5zZXJ0QmVmb3JlKGIuY3JlYXRlVGV4dE5vZGUoWC5leGVjKGwpWzBdKSxwLmZpcnN0Q2hpbGQpLGw9cC5jaGlsZE5vZGVzLHAmJihwLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocCkscS5sZW5ndGg+MCYmKHI9cVtxLmxlbmd0aC0xXSxyJiZyLnBhcmVudE5vZGUmJnIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChyKSkpfXZhciB1O2lmKCFmLnN1cHBvcnQuYXBwZW5kQ2hlY2tlZClpZihsWzBdJiZ0eXBlb2YgKHU9bC5sZW5ndGgpPT0ibnVtYmVyIilmb3IoaT0wO2k8dTtpKyspYm4obFtpXSk7ZWxzZSBibihsKTtsLm5vZGVUeXBlP2oucHVzaChsKTpqPWYubWVyZ2UoaixsKX1pZihkKXtnPWZ1bmN0aW9uKGEpe3JldHVybiFhLnR5cGV8fGJlLnRlc3QoYS50eXBlKX07Zm9yKGs9MDtqW2tdO2srKyl7aD1qW2tdO2lmKGUmJmYubm9kZU5hbWUoaCwic2NyaXB0IikmJighaC50eXBlfHxiZS50ZXN0KGgudHlwZSkpKWUucHVzaChoLnBhcmVudE5vZGU/aC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGgpOmgpO2Vsc2V7aWYoaC5ub2RlVHlwZT09PTEpe3ZhciB2PWYuZ3JlcChoLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSxnKTtqLnNwbGljZS5hcHBseShqLFtrKzEsMF0uY29uY2F0KHYpKX1kLmFwcGVuZENoaWxkKGgpfX19cmV0dXJuIGp9LGNsZWFuRGF0YTpmdW5jdGlvbihhKXt2YXIgYixjLGQ9Zi5jYWNoZSxlPWYuZXZlbnQuc3BlY2lhbCxnPWYuc3VwcG9ydC5kZWxldGVFeHBhbmRvO2Zvcih2YXIgaD0wLGk7KGk9YVtoXSkhPW51bGw7aCsrKXtpZihpLm5vZGVOYW1lJiZmLm5vRGF0YVtpLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKWNvbnRpbnVlO2M9aVtmLmV4cGFuZG9dO2lmKGMpe2I9ZFtjXTtpZihiJiZiLmV2ZW50cyl7Zm9yKHZhciBqIGluIGIuZXZlbnRzKWVbal0/Zi5ldmVudC5yZW1vdmUoaSxqKTpmLnJlbW92ZUV2ZW50KGksaixiLmhhbmRsZSk7Yi5oYW5kbGUmJihiLmhhbmRsZS5lbGVtPW51bGwpfWc/ZGVsZXRlIGlbZi5leHBhbmRvXTppLnJlbW92ZUF0dHJpYnV0ZSYmaS5yZW1vdmVBdHRyaWJ1dGUoZi5leHBhbmRvKSxkZWxldGUgZFtjXX19fX0pO3ZhciBicD0vYWxwaGFcKFteKV0qXCkvaSxicT0vb3BhY2l0eT0oW14pXSopLyxicj0vKFtBLVpdfF5tcykvZyxicz0vXltcLStdPyg/OlxkKlwuKT9cZCskL2ksYnQ9L14tPyg/OlxkKlwuKT9cZCsoPyFweClbXlxkXHNdKyQvaSxidT0vXihbXC0rXSk9KFtcLSsuXGRlXSspLyxidj0vXm1hcmdpbi8sYnc9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LGJ4PVsiVG9wIiwiUmlnaHQiLCJCb3R0b20iLCJMZWZ0Il0sYnksYnosYkE7Zi5mbi5jc3M9ZnVuY3Rpb24oYSxjKXtyZXR1cm4gZi5hY2Nlc3ModGhpcyxmdW5jdGlvbihhLGMsZCl7cmV0dXJuIGQhPT1iP2Yuc3R5bGUoYSxjLGQpOmYuY3NzKGEsYyl9LGEsYyxhcmd1bWVudHMubGVuZ3RoPjEpfSxmLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihhLGIpe2lmKGIpe3ZhciBjPWJ5KGEsIm9wYWNpdHkiKTtyZXR1cm4gYz09PSIiPyIxIjpjfXJldHVybiBhLnN0eWxlLm9wYWNpdHl9fX0sY3NzTnVtYmVyOntmaWxsT3BhY2l0eTohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6Zi5zdXBwb3J0LmNzc0Zsb2F0PyJjc3NGbG9hdCI6InN0eWxlRmxvYXQifSxzdHlsZTpmdW5jdGlvbihhLGMsZCxlKXtpZighIWEmJmEubm9kZVR5cGUhPT0zJiZhLm5vZGVUeXBlIT09OCYmISFhLnN0eWxlKXt2YXIgZyxoLGk9Zi5jYW1lbENhc2UoYyksaj1hLnN0eWxlLGs9Zi5jc3NIb29rc1tpXTtjPWYuY3NzUHJvcHNbaV18fGk7aWYoZD09PWIpe2lmKGsmJiJnZXQiaW4gayYmKGc9ay5nZXQoYSwhMSxlKSkhPT1iKXJldHVybiBnO3JldHVybiBqW2NdfWg9dHlwZW9mIGQsaD09PSJzdHJpbmciJiYoZz1idS5leGVjKGQpKSYmKGQ9KyhnWzFdKzEpKitnWzJdK3BhcnNlRmxvYXQoZi5jc3MoYSxjKSksaD0ibnVtYmVyIik7aWYoZD09bnVsbHx8aD09PSJudW1iZXIiJiZpc05hTihkKSlyZXR1cm47aD09PSJudW1iZXIiJiYhZi5jc3NOdW1iZXJbaV0mJihkKz0icHgiKTtpZigha3x8ISgic2V0ImluIGspfHwoZD1rLnNldChhLGQpKSE9PWIpdHJ5e2pbY109ZH1jYXRjaChsKXt9fX0sY3NzOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZSxnO2M9Zi5jYW1lbENhc2UoYyksZz1mLmNzc0hvb2tzW2NdLGM9Zi5jc3NQcm9wc1tjXXx8YyxjPT09ImNzc0Zsb2F0IiYmKGM9ImZsb2F0Iik7aWYoZyYmImdldCJpbiBnJiYoZT1nLmdldChhLCEwLGQpKSE9PWIpcmV0dXJuIGU7aWYoYnkpcmV0dXJuIGJ5KGEsYyl9LHN3YXA6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXt9LGUsZjtmb3IoZiBpbiBiKWRbZl09YS5zdHlsZVtmXSxhLnN0eWxlW2ZdPWJbZl07ZT1jLmNhbGwoYSk7Zm9yKGYgaW4gYilhLnN0eWxlW2ZdPWRbZl07cmV0dXJuIGV9fSksZi5jdXJDU1M9Zi5jc3MsYy5kZWZhdWx0VmlldyYmYy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlJiYoYno9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZyxoPWEuc3R5bGU7Yj1iLnJlcGxhY2UoYnIsIi0kMSIpLnRvTG93ZXJDYXNlKCksKGQ9YS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KSYmKGU9ZC5nZXRDb21wdXRlZFN0eWxlKGEsbnVsbCkpJiYoYz1lLmdldFByb3BlcnR5VmFsdWUoYiksYz09PSIiJiYhZi5jb250YWlucyhhLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGEpJiYoYz1mLnN0eWxlKGEsYikpKSwhZi5zdXBwb3J0LnBpeGVsTWFyZ2luJiZlJiZidi50ZXN0KGIpJiZidC50ZXN0KGMpJiYoZz1oLndpZHRoLGgud2lkdGg9YyxjPWUud2lkdGgsaC53aWR0aD1nKTtyZXR1cm4gY30pLGMuZG9jdW1lbnRFbGVtZW50LmN1cnJlbnRTdHlsZSYmKGJBPWZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9YS5jdXJyZW50U3R5bGUmJmEuY3VycmVudFN0eWxlW2JdLGc9YS5zdHlsZTtmPT1udWxsJiZnJiYoZT1nW2JdKSYmKGY9ZSksYnQudGVzdChmKSYmKGM9Zy5sZWZ0LGQ9YS5ydW50aW1lU3R5bGUmJmEucnVudGltZVN0eWxlLmxlZnQsZCYmKGEucnVudGltZVN0eWxlLmxlZnQ9YS5jdXJyZW50U3R5bGUubGVmdCksZy5sZWZ0PWI9PT0iZm9udFNpemUiPyIxZW0iOmYsZj1nLnBpeGVsTGVmdCsicHgiLGcubGVmdD1jLGQmJihhLnJ1bnRpbWVTdHlsZS5sZWZ0PWQpKTtyZXR1cm4gZj09PSIiPyJhdXRvIjpmfSksYnk9Ynp8fGJBLGYuZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24oYSxiKXtmLmNzc0hvb2tzW2JdPXtnZXQ6ZnVuY3Rpb24oYSxjLGQpe2lmKGMpcmV0dXJuIGEub2Zmc2V0V2lkdGghPT0wP2JCKGEsYixkKTpmLnN3YXAoYSxidyxmdW5jdGlvbigpe3JldHVybiBiQihhLGIsZCl9KX0sc2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGJzLnRlc3QoYik/YisicHgiOmJ9fX0pLGYuc3VwcG9ydC5vcGFjaXR5fHwoZi5jc3NIb29rcy5vcGFjaXR5PXtnZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYnEudGVzdCgoYiYmYS5jdXJyZW50U3R5bGU/YS5jdXJyZW50U3R5bGUuZmlsdGVyOmEuc3R5bGUuZmlsdGVyKXx8IiIpP3BhcnNlRmxvYXQoUmVnRXhwLiQxKS8xMDArIiI6Yj8iMSI6IiJ9LHNldDpmdW5jdGlvbihhLGIpe3ZhciBjPWEuc3R5bGUsZD1hLmN1cnJlbnRTdHlsZSxlPWYuaXNOdW1lcmljKGIpPyJhbHBoYShvcGFjaXR5PSIrYioxMDArIikiOiIiLGc9ZCYmZC5maWx0ZXJ8fGMuZmlsdGVyfHwiIjtjLnpvb209MTtpZihiPj0xJiZmLnRyaW0oZy5yZXBsYWNlKGJwLCIiKSk9PT0iIil7Yy5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpO2lmKGQmJiFkLmZpbHRlcilyZXR1cm59Yy5maWx0ZXI9YnAudGVzdChnKT9nLnJlcGxhY2UoYnAsZSk6ZysiICIrZX19KSxmKGZ1bmN0aW9uKCl7Zi5zdXBwb3J0LnJlbGlhYmxlTWFyZ2luUmlnaHR8fChmLmNzc0hvb2tzLm1hcmdpblJpZ2h0PXtnZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZi5zd2FwKGEse2Rpc3BsYXk6ImlubGluZS1ibG9jayJ9LGZ1bmN0aW9uKCl7cmV0dXJuIGI/YnkoYSwibWFyZ2luLXJpZ2h0Iik6YS5zdHlsZS5tYXJnaW5SaWdodH0pfX0pfSksZi5leHByJiZmLmV4cHIuZmlsdGVycyYmKGYuZXhwci5maWx0ZXJzLmhpZGRlbj1mdW5jdGlvbihhKXt2YXIgYj1hLm9mZnNldFdpZHRoLGM9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGI9PT0wJiZjPT09MHx8IWYuc3VwcG9ydC5yZWxpYWJsZUhpZGRlbk9mZnNldHMmJihhLnN0eWxlJiZhLnN0eWxlLmRpc3BsYXl8fGYuY3NzKGEsImRpc3BsYXkiKSk9PT0ibm9uZSJ9LGYuZXhwci5maWx0ZXJzLnZpc2libGU9ZnVuY3Rpb24oYSl7cmV0dXJuIWYuZXhwci5maWx0ZXJzLmhpZGRlbihhKX0pLGYuZWFjaCh7bWFyZ2luOiIiLHBhZGRpbmc6IiIsYm9yZGVyOiJXaWR0aCJ9LGZ1bmN0aW9uKGEsYil7Zi5jc3NIb29rc1thK2JdPXtleHBhbmQ6ZnVuY3Rpb24oYyl7dmFyIGQsZT10eXBlb2YgYz09InN0cmluZyI/Yy5zcGxpdCgiICIpOltjXSxmPXt9O2ZvcihkPTA7ZDw0O2QrKylmW2ErYnhbZF0rYl09ZVtkXXx8ZVtkLTJdfHxlWzBdO3JldHVybiBmfX19KTt2YXIgYkM9LyUyMC9nLGJEPS9cW1xdJC8sYkU9L1xyP1xuL2csYkY9LyMuKiQvLGJHPS9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKVxyPyQvbWcsYkg9L14oPzpjb2xvcnxkYXRlfGRhdGV0aW1lfGRhdGV0aW1lLWxvY2FsfGVtYWlsfGhpZGRlbnxtb250aHxudW1iZXJ8cGFzc3dvcmR8cmFuZ2V8c2VhcmNofHRlbHx0ZXh0fHRpbWV8dXJsfHdlZWspJC9pLGJJPS9eKD86YWJvdXR8YXBwfGFwcFwtc3RvcmFnZXwuK1wtZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8sYko9L14oPzpHRVR8SEVBRCkkLyxiSz0vXlwvXC8vLGJMPS9cPy8sYk09LzxzY3JpcHRcYltePF0qKD86KD8hPFwvc2NyaXB0Pik8W148XSopKjxcL3NjcmlwdD4vZ2ksYk49L14oPzpzZWxlY3R8dGV4dGFyZWEpL2ksYk89L1xzKy8sYlA9LyhbPyZdKV89W14mXSovLGJRPS9eKFtcd1wrXC5cLV0rOikoPzpcL1wvKFteXC8/IzpdKikoPzo6KFxkKykpPyk/LyxiUj1mLmZuLmxvYWQsYlM9e30sYlQ9e30sYlUsYlYsYlc9WyIqLyJdK1siKiJdO3RyeXtiVT1lLmhyZWZ9Y2F0Y2goYlgpe2JVPWMuY3JlYXRlRWxlbWVudCgiYSIpLGJVLmhyZWY9IiIsYlU9YlUuaHJlZn1iVj1iUS5leGVjKGJVLnRvTG93ZXJDYXNlKCkpfHxbXSxmLmZuLmV4dGVuZCh7bG9hZDpmdW5jdGlvbihhLGMsZCl7aWYodHlwZW9mIGEhPSJzdHJpbmciJiZiUilyZXR1cm4gYlIuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKCF0aGlzLmxlbmd0aClyZXR1cm4gdGhpczt2YXIgZT1hLmluZGV4T2YoIiAiKTtpZihlPj0wKXt2YXIgZz1hLnNsaWNlKGUsYS5sZW5ndGgpO2E9YS5zbGljZSgwLGUpfXZhciBoPSJHRVQiO2MmJihmLmlzRnVuY3Rpb24oYyk/KGQ9YyxjPWIpOnR5cGVvZiBjPT0ib2JqZWN0IiYmKGM9Zi5wYXJhbShjLGYuYWpheFNldHRpbmdzLnRyYWRpdGlvbmFsKSxoPSJQT1NUIikpO3ZhciBpPXRoaXM7Zi5hamF4KHt1cmw6YSx0eXBlOmgsZGF0YVR5cGU6Imh0bWwiLGRhdGE6Yyxjb21wbGV0ZTpmdW5jdGlvbihhLGIsYyl7Yz1hLnJlc3BvbnNlVGV4dCxhLmlzUmVzb2x2ZWQoKSYmKGEuZG9uZShmdW5jdGlvbihhKXtjPWF9KSxpLmh0bWwoZz9mKCI8ZGl2PiIpLmFwcGVuZChjLnJlcGxhY2UoYk0sIiIpKS5maW5kKGcpOmMpKSxkJiZpLmVhY2goZCxbYyxiLGFdKX19KTtyZXR1cm4gdGhpc30sc2VyaWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIGYucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50cz9mLm1ha2VBcnJheSh0aGlzLmVsZW1lbnRzKTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmFtZSYmIXRoaXMuZGlzYWJsZWQmJih0aGlzLmNoZWNrZWR8fGJOLnRlc3QodGhpcy5ub2RlTmFtZSl8fGJILnRlc3QodGhpcy50eXBlKSl9KS5tYXAoZnVuY3Rpb24oYSxiKXt2YXIgYz1mKHRoaXMpLnZhbCgpO3JldHVybiBjPT1udWxsP251bGw6Zi5pc0FycmF5KGMpP2YubWFwKGMsZnVuY3Rpb24oYSxjKXtyZXR1cm57bmFtZTpiLm5hbWUsdmFsdWU6YS5yZXBsYWNlKGJFLCJcclxuIil9fSk6e25hbWU6Yi5uYW1lLHZhbHVlOmMucmVwbGFjZShiRSwiXHJcbiIpfX0pLmdldCgpfX0pLGYuZWFjaCgiYWpheFN0YXJ0IGFqYXhTdG9wIGFqYXhDb21wbGV0ZSBhamF4RXJyb3IgYWpheFN1Y2Nlc3MgYWpheFNlbmQiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtmLmZuW2JdPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm9uKGIsYSl9fSksZi5lYWNoKFsiZ2V0IiwicG9zdCJdLGZ1bmN0aW9uKGEsYyl7ZltjXT1mdW5jdGlvbihhLGQsZSxnKXtmLmlzRnVuY3Rpb24oZCkmJihnPWd8fGUsZT1kLGQ9Yik7cmV0dXJuIGYuYWpheCh7dHlwZTpjLHVybDphLGRhdGE6ZCxzdWNjZXNzOmUsZGF0YVR5cGU6Z30pfX0pLGYuZXh0ZW5kKHtnZXRTY3JpcHQ6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gZi5nZXQoYSxiLGMsInNjcmlwdCIpfSxnZXRKU09OOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZi5nZXQoYSxiLGMsImpzb24iKX0sYWpheFNldHVwOmZ1bmN0aW9uKGEsYil7Yj9iJChhLGYuYWpheFNldHRpbmdzKTooYj1hLGE9Zi5hamF4U2V0dGluZ3MpLGIkKGEsYik7cmV0dXJuIGF9LGFqYXhTZXR0aW5nczp7dXJsOmJVLGlzTG9jYWw6YkkudGVzdChiVlsxXSksZ2xvYmFsOiEwLHR5cGU6IkdFVCIsY29udGVudFR5cGU6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIscHJvY2Vzc0RhdGE6ITAsYXN5bmM6ITAsYWNjZXB0czp7eG1sOiJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIixodG1sOiJ0ZXh0L2h0bWwiLHRleHQ6InRleHQvcGxhaW4iLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCIsIioiOmJXfSxjb250ZW50czp7eG1sOi94bWwvLGh0bWw6L2h0bWwvLGpzb246L2pzb24vfSxyZXNwb25zZUZpZWxkczp7eG1sOiJyZXNwb25zZVhNTCIsdGV4dDoicmVzcG9uc2VUZXh0In0sY29udmVydGVyczp7IiogdGV4dCI6YS5TdHJpbmcsInRleHQgaHRtbCI6ITAsInRleHQganNvbiI6Zi5wYXJzZUpTT04sInRleHQgeG1sIjpmLnBhcnNlWE1MfSxmbGF0T3B0aW9uczp7Y29udGV4dDohMCx1cmw6ITB9fSxhamF4UHJlZmlsdGVyOmJZKGJTKSxhamF4VHJhbnNwb3J0OmJZKGJUKSxhamF4OmZ1bmN0aW9uKGEsYyl7ZnVuY3Rpb24gdyhhLGMsbCxtKXtpZihzIT09Mil7cz0yLHEmJmNsZWFyVGltZW91dChxKSxwPWIsbj1tfHwiIix2LnJlYWR5U3RhdGU9YT4wPzQ6MDt2YXIgbyxyLHUsdz1jLHg9bD9jYShkLHYsbCk6Yix5LHo7aWYoYT49MjAwJiZhPDMwMHx8YT09PTMwNCl7aWYoZC5pZk1vZGlmaWVkKXtpZih5PXYuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSlmLmxhc3RNb2RpZmllZFtrXT15O2lmKHo9di5nZXRSZXNwb25zZUhlYWRlcigiRXRhZyIpKWYuZXRhZ1trXT16fWlmKGE9PT0zMDQpdz0ibm90bW9kaWZpZWQiLG89ITA7ZWxzZSB0cnl7cj1jYihkLHgpLHc9InN1Y2Nlc3MiLG89ITB9Y2F0Y2goQSl7dz0icGFyc2VyZXJyb3IiLHU9QX19ZWxzZXt1PXc7aWYoIXd8fGEpdz0iZXJyb3IiLGE8MCYmKGE9MCl9di5zdGF0dXM9YSx2LnN0YXR1c1RleHQ9IiIrKGN8fHcpLG8/aC5yZXNvbHZlV2l0aChlLFtyLHcsdl0pOmgucmVqZWN0V2l0aChlLFt2LHcsdV0pLHYuc3RhdHVzQ29kZShqKSxqPWIsdCYmZy50cmlnZ2VyKCJhamF4Iisobz8iU3VjY2VzcyI6IkVycm9yIiksW3YsZCxvP3I6dV0pLGkuZmlyZVdpdGgoZSxbdix3XSksdCYmKGcudHJpZ2dlcigiYWpheENvbXBsZXRlIixbdixkXSksLS1mLmFjdGl2ZXx8Zi5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpKX19dHlwZW9mIGE9PSJvYmplY3QiJiYoYz1hLGE9YiksYz1jfHx7fTt2YXIgZD1mLmFqYXhTZXR1cCh7fSxjKSxlPWQuY29udGV4dHx8ZCxnPWUhPT1kJiYoZS5ub2RlVHlwZXx8ZSBpbnN0YW5jZW9mIGYpP2YoZSk6Zi5ldmVudCxoPWYuRGVmZXJyZWQoKSxpPWYuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLGo9ZC5zdGF0dXNDb2RlfHx7fSxrLGw9e30sbT17fSxuLG8scCxxLHIscz0wLHQsdSx2PXtyZWFkeVN0YXRlOjAsc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbihhLGIpe2lmKCFzKXt2YXIgYz1hLnRvTG93ZXJDYXNlKCk7YT1tW2NdPW1bY118fGEsbFthXT1ifXJldHVybiB0aGlzfSxnZXRBbGxSZXNwb25zZUhlYWRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gcz09PTI/bjpudWxsfSxnZXRSZXNwb25zZUhlYWRlcjpmdW5jdGlvbihhKXt2YXIgYztpZihzPT09Mil7aWYoIW8pe289e307d2hpbGUoYz1iRy5leGVjKG4pKW9bY1sxXS50b0xvd2VyQ2FzZSgpXT1jWzJdfWM9b1thLnRvTG93ZXJDYXNlKCldfXJldHVybiBjPT09Yj9udWxsOmN9LG92ZXJyaWRlTWltZVR5cGU6ZnVuY3Rpb24oYSl7c3x8KGQubWltZVR5cGU9YSk7cmV0dXJuIHRoaXN9LGFib3J0OmZ1bmN0aW9uKGEpe2E9YXx8ImFib3J0IixwJiZwLmFib3J0KGEpLHcoMCxhKTtyZXR1cm4gdGhpc319O2gucHJvbWlzZSh2KSx2LnN1Y2Nlc3M9di5kb25lLHYuZXJyb3I9di5mYWlsLHYuY29tcGxldGU9aS5hZGQsdi5zdGF0dXNDb2RlPWZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBiO2lmKHM8Milmb3IoYiBpbiBhKWpbYl09W2pbYl0sYVtiXV07ZWxzZSBiPWFbdi5zdGF0dXNdLHYudGhlbihiLGIpfXJldHVybiB0aGlzfSxkLnVybD0oKGF8fGQudXJsKSsiIikucmVwbGFjZShiRiwiIikucmVwbGFjZShiSyxiVlsxXSsiLy8iKSxkLmRhdGFUeXBlcz1mLnRyaW0oZC5kYXRhVHlwZXx8IioiKS50b0xvd2VyQ2FzZSgpLnNwbGl0KGJPKSxkLmNyb3NzRG9tYWluPT1udWxsJiYocj1iUS5leGVjKGQudXJsLnRvTG93ZXJDYXNlKCkpLGQuY3Jvc3NEb21haW49ISghcnx8clsxXT09YlZbMV0mJnJbMl09PWJWWzJdJiYoclszXXx8KHJbMV09PT0iaHR0cDoiPzgwOjQ0MykpPT0oYlZbM118fChiVlsxXT09PSJodHRwOiI/ODA6NDQzKSkpKSxkLmRhdGEmJmQucHJvY2Vzc0RhdGEmJnR5cGVvZiBkLmRhdGEhPSJzdHJpbmciJiYoZC5kYXRhPWYucGFyYW0oZC5kYXRhLGQudHJhZGl0aW9uYWwpKSxiWihiUyxkLGMsdik7aWYocz09PTIpcmV0dXJuITE7dD1kLmdsb2JhbCxkLnR5cGU9ZC50eXBlLnRvVXBwZXJDYXNlKCksZC5oYXNDb250ZW50PSFiSi50ZXN0KGQudHlwZSksdCYmZi5hY3RpdmUrKz09PTAmJmYuZXZlbnQudHJpZ2dlcigiYWpheFN0YXJ0Iik7aWYoIWQuaGFzQ29udGVudCl7ZC5kYXRhJiYoZC51cmwrPShiTC50ZXN0KGQudXJsKT8iJiI6Ij8iKStkLmRhdGEsZGVsZXRlIGQuZGF0YSksaz1kLnVybDtpZihkLmNhY2hlPT09ITEpe3ZhciB4PWYubm93KCkseT1kLnVybC5yZXBsYWNlKGJQLCIkMV89Iit4KTtkLnVybD15Kyh5PT09ZC51cmw/KGJMLnRlc3QoZC51cmwpPyImIjoiPyIpKyJfPSIreDoiIil9fShkLmRhdGEmJmQuaGFzQ29udGVudCYmZC5jb250ZW50VHlwZSE9PSExfHxjLmNvbnRlbnRUeXBlKSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLGQuY29udGVudFR5cGUpLGQuaWZNb2RpZmllZCYmKGs9a3x8ZC51cmwsZi5sYXN0TW9kaWZpZWRba10mJnYuc2V0UmVxdWVzdEhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLGYubGFzdE1vZGlmaWVkW2tdKSxmLmV0YWdba10mJnYuc2V0UmVxdWVzdEhlYWRlcigiSWYtTm9uZS1NYXRjaCIsZi5ldGFnW2tdKSksdi5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLGQuZGF0YVR5cGVzWzBdJiZkLmFjY2VwdHNbZC5kYXRhVHlwZXNbMF1dP2QuYWNjZXB0c1tkLmRhdGFUeXBlc1swXV0rKGQuZGF0YVR5cGVzWzBdIT09IioiPyIsICIrYlcrIjsgcT0wLjAxIjoiIik6ZC5hY2NlcHRzWyIqIl0pO2Zvcih1IGluIGQuaGVhZGVycyl2LnNldFJlcXVlc3RIZWFkZXIodSxkLmhlYWRlcnNbdV0pO2lmKGQuYmVmb3JlU2VuZCYmKGQuYmVmb3JlU2VuZC5jYWxsKGUsdixkKT09PSExfHxzPT09Mikpe3YuYWJvcnQoKTtyZXR1cm4hMX1mb3IodSBpbntzdWNjZXNzOjEsZXJyb3I6MSxjb21wbGV0ZToxfSl2W3VdKGRbdV0pO3A9YlooYlQsZCxjLHYpO2lmKCFwKXcoLTEsIk5vIFRyYW5zcG9ydCIpO2Vsc2V7di5yZWFkeVN0YXRlPTEsdCYmZy50cmlnZ2VyKCJhamF4U2VuZCIsW3YsZF0pLGQuYXN5bmMmJmQudGltZW91dD4wJiYocT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7di5hYm9ydCgidGltZW91dCIpfSxkLnRpbWVvdXQpKTt0cnl7cz0xLHAuc2VuZChsLHcpfWNhdGNoKHope2lmKHM8Mil3KC0xLHopO2Vsc2UgdGhyb3cgen19cmV0dXJuIHZ9LHBhcmFtOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9W10sZT1mdW5jdGlvbihhLGIpe2I9Zi5pc0Z1bmN0aW9uKGIpP2IoKTpiLGRbZC5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudChhKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpfTtjPT09YiYmKGM9Zi5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpO2lmKGYuaXNBcnJheShhKXx8YS5qcXVlcnkmJiFmLmlzUGxhaW5PYmplY3QoYSkpZi5lYWNoKGEsZnVuY3Rpb24oKXtlKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKHZhciBnIGluIGEpYl8oZyxhW2ddLGMsZSk7cmV0dXJuIGQuam9pbigiJiIpLnJlcGxhY2UoYkMsIisiKX19KSxmLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e319KTt2YXIgY2M9Zi5ub3coKSxjZD0vKFw9KVw/KCZ8JCl8XD9cPy9pO2YuYWpheFNldHVwKHtqc29ucDoiY2FsbGJhY2siLGpzb25wQ2FsbGJhY2s6ZnVuY3Rpb24oKXtyZXR1cm4gZi5leHBhbmRvKyJfIitjYysrfX0pLGYuYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oYixjLGQpe3ZhciBlPXR5cGVvZiBiLmRhdGE9PSJzdHJpbmciJiYvXmFwcGxpY2F0aW9uXC94XC13d3dcLWZvcm1cLXVybGVuY29kZWQvLnRlc3QoYi5jb250ZW50VHlwZSk7aWYoYi5kYXRhVHlwZXNbMF09PT0ianNvbnAifHxiLmpzb25wIT09ITEmJihjZC50ZXN0KGIudXJsKXx8ZSYmY2QudGVzdChiLmRhdGEpKSl7dmFyIGcsaD1iLmpzb25wQ2FsbGJhY2s9Zi5pc0Z1bmN0aW9uKGIuanNvbnBDYWxsYmFjayk/Yi5qc29ucENhbGxiYWNrKCk6Yi5qc29ucENhbGxiYWNrLGk9YVtoXSxqPWIudXJsLGs9Yi5kYXRhLGw9IiQxIitoKyIkMiI7Yi5qc29ucCE9PSExJiYoaj1qLnJlcGxhY2UoY2QsbCksYi51cmw9PT1qJiYoZSYmKGs9ay5yZXBsYWNlKGNkLGwpKSxiLmRhdGE9PT1rJiYoais9KC9cPy8udGVzdChqKT8iJiI6Ij8iKStiLmpzb25wKyI9IitoKSkpLGIudXJsPWosYi5kYXRhPWssYVtoXT1mdW5jdGlvbihhKXtnPVthXX0sZC5hbHdheXMoZnVuY3Rpb24oKXthW2hdPWksZyYmZi5pc0Z1bmN0aW9uKGkpJiZhW2hdKGdbMF0pfSksYi5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdPWZ1bmN0aW9uKCl7Z3x8Zi5lcnJvcihoKyIgd2FzIG5vdCBjYWxsZWQiKTtyZXR1cm4gZ1swXX0sYi5kYXRhVHlwZXNbMF09Impzb24iO3JldHVybiJzY3JpcHQifX0pLGYuYWpheFNldHVwKHthY2NlcHRzOntzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0In0sY29udGVudHM6e3NjcmlwdDovamF2YXNjcmlwdHxlY21hc2NyaXB0L30sY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbihhKXtmLmdsb2JhbEV2YWwoYSk7cmV0dXJuIGF9fX0pLGYuYWpheFByZWZpbHRlcigic2NyaXB0IixmdW5jdGlvbihhKXthLmNhY2hlPT09YiYmKGEuY2FjaGU9ITEpLGEuY3Jvc3NEb21haW4mJihhLnR5cGU9IkdFVCIsYS5nbG9iYWw9ITEpfSksZi5hamF4VHJhbnNwb3J0KCJzY3JpcHQiLGZ1bmN0aW9uKGEpe2lmKGEuY3Jvc3NEb21haW4pe3ZhciBkLGU9Yy5oZWFkfHxjLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF18fGMuZG9jdW1lbnRFbGVtZW50O3JldHVybntzZW5kOmZ1bmN0aW9uKGYsZyl7ZD1jLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLGQuYXN5bmM9ImFzeW5jIixhLnNjcmlwdENoYXJzZXQmJihkLmNoYXJzZXQ9YS5zY3JpcHRDaGFyc2V0KSxkLnNyYz1hLnVybCxkLm9ubG9hZD1kLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbihhLGMpe2lmKGN8fCFkLnJlYWR5U3RhdGV8fC9sb2FkZWR8Y29tcGxldGUvLnRlc3QoZC5yZWFkeVN0YXRlKSlkLm9ubG9hZD1kLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLGUmJmQucGFyZW50Tm9kZSYmZS5yZW1vdmVDaGlsZChkKSxkPWIsY3x8ZygyMDAsInN1Y2Nlc3MiKX0sZS5pbnNlcnRCZWZvcmUoZCxlLmZpcnN0Q2hpbGQpfSxhYm9ydDpmdW5jdGlvbigpe2QmJmQub25sb2FkKDAsMSl9fX19KTt2YXIgY2U9YS5BY3RpdmVYT2JqZWN0P2Z1bmN0aW9uKCl7Zm9yKHZhciBhIGluIGNnKWNnW2FdKDAsMSl9OiExLGNmPTAsY2c7Zi5hamF4U2V0dGluZ3MueGhyPWEuQWN0aXZlWE9iamVjdD9mdW5jdGlvbigpe3JldHVybiF0aGlzLmlzTG9jYWwmJmNoKCl8fGNpKCl9OmNoLGZ1bmN0aW9uKGEpe2YuZXh0ZW5kKGYuc3VwcG9ydCx7YWpheDohIWEsY29yczohIWEmJiJ3aXRoQ3JlZGVudGlhbHMiaW4gYX0pfShmLmFqYXhTZXR0aW5ncy54aHIoKSksZi5zdXBwb3J0LmFqYXgmJmYuYWpheFRyYW5zcG9ydChmdW5jdGlvbihjKXtpZighYy5jcm9zc0RvbWFpbnx8Zi5zdXBwb3J0LmNvcnMpe3ZhciBkO3JldHVybntzZW5kOmZ1bmN0aW9uKGUsZyl7dmFyIGg9Yy54aHIoKSxpLGo7Yy51c2VybmFtZT9oLm9wZW4oYy50eXBlLGMudXJsLGMuYXN5bmMsYy51c2VybmFtZSxjLnBhc3N3b3JkKTpoLm9wZW4oYy50eXBlLGMudXJsLGMuYXN5bmMpO2lmKGMueGhyRmllbGRzKWZvcihqIGluIGMueGhyRmllbGRzKWhbal09Yy54aHJGaWVsZHNbal07Yy5taW1lVHlwZSYmaC5vdmVycmlkZU1pbWVUeXBlJiZoLm92ZXJyaWRlTWltZVR5cGUoYy5taW1lVHlwZSksIWMuY3Jvc3NEb21haW4mJiFlWyJYLVJlcXVlc3RlZC1XaXRoIl0mJihlWyJYLVJlcXVlc3RlZC1XaXRoIl09IlhNTEh0dHBSZXF1ZXN0Iik7dHJ5e2ZvcihqIGluIGUpaC5zZXRSZXF1ZXN0SGVhZGVyKGosZVtqXSl9Y2F0Y2goayl7fWguc2VuZChjLmhhc0NvbnRlbnQmJmMuZGF0YXx8bnVsbCksZD1mdW5jdGlvbihhLGUpe3ZhciBqLGssbCxtLG47dHJ5e2lmKGQmJihlfHxoLnJlYWR5U3RhdGU9PT00KSl7ZD1iLGkmJihoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mLm5vb3AsY2UmJmRlbGV0ZSBjZ1tpXSk7aWYoZSloLnJlYWR5U3RhdGUhPT00JiZoLmFib3J0KCk7ZWxzZXtqPWguc3RhdHVzLGw9aC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSxtPXt9LG49aC5yZXNwb25zZVhNTCxuJiZuLmRvY3VtZW50RWxlbWVudCYmKG0ueG1sPW4pO3RyeXttLnRleHQ9aC5yZXNwb25zZVRleHR9Y2F0Y2goYSl7fXRyeXtrPWguc3RhdHVzVGV4dH1jYXRjaChvKXtrPSIifSFqJiZjLmlzTG9jYWwmJiFjLmNyb3NzRG9tYWluP2o9bS50ZXh0PzIwMDo0MDQ6aj09PTEyMjMmJihqPTIwNCl9fX1jYXRjaChwKXtlfHxnKC0xLHApfW0mJmcoaixrLG0sbCl9LCFjLmFzeW5jfHxoLnJlYWR5U3RhdGU9PT00P2QoKTooaT0rK2NmLGNlJiYoY2d8fChjZz17fSxmKGEpLnVubG9hZChjZSkpLGNnW2ldPWQpLGgub25yZWFkeXN0YXRlY2hhbmdlPWQpfSxhYm9ydDpmdW5jdGlvbigpe2QmJmQoMCwxKX19fX0pO3ZhciBjaj17fSxjayxjbCxjbT0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sY249L14oWytcLV09KT8oW1xkKy5cLV0rKShbYS16JV0qKSQvaSxjbyxjcD1bWyJoZWlnaHQiLCJtYXJnaW5Ub3AiLCJtYXJnaW5Cb3R0b20iLCJwYWRkaW5nVG9wIiwicGFkZGluZ0JvdHRvbSJdLFsid2lkdGgiLCJtYXJnaW5MZWZ0IiwibWFyZ2luUmlnaHQiLCJwYWRkaW5nTGVmdCIsInBhZGRpbmdSaWdodCJdLFsib3BhY2l0eSJdXSxjcTtmLmZuLmV4dGVuZCh7c2hvdzpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZTtpZihhfHxhPT09MClyZXR1cm4gdGhpcy5hbmltYXRlKGN0KCJzaG93IiwzKSxhLGIsYyk7Zm9yKHZhciBnPTAsaD10aGlzLmxlbmd0aDtnPGg7ZysrKWQ9dGhpc1tnXSxkLnN0eWxlJiYoZT1kLnN0eWxlLmRpc3BsYXksIWYuX2RhdGEoZCwib2xkZGlzcGxheSIpJiZlPT09Im5vbmUiJiYoZT1kLnN0eWxlLmRpc3BsYXk9IiIpLChlPT09IiImJmYuY3NzKGQsImRpc3BsYXkiKT09PSJub25lInx8IWYuY29udGFpbnMoZC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxkKSkmJmYuX2RhdGEoZCwib2xkZGlzcGxheSIsY3UoZC5ub2RlTmFtZSkpKTtmb3IoZz0wO2c8aDtnKyspe2Q9dGhpc1tnXTtpZihkLnN0eWxlKXtlPWQuc3R5bGUuZGlzcGxheTtpZihlPT09IiJ8fGU9PT0ibm9uZSIpZC5zdHlsZS5kaXNwbGF5PWYuX2RhdGEoZCwib2xkZGlzcGxheSIpfHwiIn19cmV0dXJuIHRoaXN9LGhpZGU6ZnVuY3Rpb24oYSxiLGMpe2lmKGF8fGE9PT0wKXJldHVybiB0aGlzLmFuaW1hdGUoY3QoImhpZGUiLDMpLGEsYixjKTt2YXIgZCxlLGc9MCxoPXRoaXMubGVuZ3RoO2Zvcig7ZzxoO2crKylkPXRoaXNbZ10sZC5zdHlsZSYmKGU9Zi5jc3MoZCwiZGlzcGxheSIpLGUhPT0ibm9uZSImJiFmLl9kYXRhKGQsIm9sZGRpc3BsYXkiKSYmZi5fZGF0YShkLCJvbGRkaXNwbGF5IixlKSk7Zm9yKGc9MDtnPGg7ZysrKXRoaXNbZ10uc3R5bGUmJih0aGlzW2ddLnN0eWxlLmRpc3BsYXk9Im5vbmUiKTtyZXR1cm4gdGhpc30sX3RvZ2dsZTpmLmZuLnRvZ2dsZSx0b2dnbGU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXR5cGVvZiBhPT0iYm9vbGVhbiI7Zi5pc0Z1bmN0aW9uKGEpJiZmLmlzRnVuY3Rpb24oYik/dGhpcy5fdG9nZ2xlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTphPT1udWxsfHxkP3RoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPWQ/YTpmKHRoaXMpLmlzKCI6aGlkZGVuIik7Zih0aGlzKVtiPyJzaG93IjoiaGlkZSJdKCl9KTp0aGlzLmFuaW1hdGUoY3QoInRvZ2dsZSIsMyksYSxiLGMpO3JldHVybiB0aGlzfSxmYWRlVG86ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMuZmlsdGVyKCI6aGlkZGVuIikuY3NzKCJvcGFjaXR5IiwwKS5zaG93KCkuZW5kKCkuYW5pbWF0ZSh7b3BhY2l0eTpifSxhLGMsZCl9LGFuaW1hdGU6ZnVuY3Rpb24oYSxiLGMsZCl7ZnVuY3Rpb24gZygpe2UucXVldWU9PT0hMSYmZi5fbWFyayh0aGlzKTt2YXIgYj1mLmV4dGVuZCh7fSxlKSxjPXRoaXMubm9kZVR5cGU9PT0xLGQ9YyYmZih0aGlzKS5pcygiOmhpZGRlbiIpLGcsaCxpLGosayxsLG0sbixvLHAscTtiLmFuaW1hdGVkUHJvcGVydGllcz17fTtmb3IoaSBpbiBhKXtnPWYuY2FtZWxDYXNlKGkpLGkhPT1nJiYoYVtnXT1hW2ldLGRlbGV0ZSBhW2ldKTtpZigoaz1mLmNzc0hvb2tzW2ddKSYmImV4cGFuZCJpbiBrKXtsPWsuZXhwYW5kKGFbZ10pLGRlbGV0ZSBhW2ddO2ZvcihpIGluIGwpaSBpbiBhfHwoYVtpXT1sW2ldKX19Zm9yKGcgaW4gYSl7aD1hW2ddLGYuaXNBcnJheShoKT8oYi5hbmltYXRlZFByb3BlcnRpZXNbZ109aFsxXSxoPWFbZ109aFswXSk6Yi5hbmltYXRlZFByb3BlcnRpZXNbZ109Yi5zcGVjaWFsRWFzaW5nJiZiLnNwZWNpYWxFYXNpbmdbZ118fGIuZWFzaW5nfHwic3dpbmciO2lmKGg9PT0iaGlkZSImJmR8fGg9PT0ic2hvdyImJiFkKXJldHVybiBiLmNvbXBsZXRlLmNhbGwodGhpcyk7YyYmKGc9PT0iaGVpZ2h0Inx8Zz09PSJ3aWR0aCIpJiYoYi5vdmVyZmxvdz1bdGhpcy5zdHlsZS5vdmVyZmxvdyx0aGlzLnN0eWxlLm92ZXJmbG93WCx0aGlzLnN0eWxlLm92ZXJmbG93WV0sZi5jc3ModGhpcywiZGlzcGxheSIpPT09ImlubGluZSImJmYuY3NzKHRoaXMsImZsb2F0Iik9PT0ibm9uZSImJighZi5zdXBwb3J0LmlubGluZUJsb2NrTmVlZHNMYXlvdXR8fGN1KHRoaXMubm9kZU5hbWUpPT09ImlubGluZSI/dGhpcy5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siOnRoaXMuc3R5bGUuem9vbT0xKSl9Yi5vdmVyZmxvdyE9bnVsbCYmKHRoaXMuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIpO2ZvcihpIGluIGEpaj1uZXcgZi5meCh0aGlzLGIsaSksaD1hW2ldLGNtLnRlc3QoaCk/KHE9Zi5fZGF0YSh0aGlzLCJ0b2dnbGUiK2kpfHwoaD09PSJ0b2dnbGUiP2Q/InNob3ciOiJoaWRlIjowKSxxPyhmLl9kYXRhKHRoaXMsInRvZ2dsZSIraSxxPT09InNob3ciPyJoaWRlIjoic2hvdyIpLGpbcV0oKSk6altoXSgpKToobT1jbi5leGVjKGgpLG49ai5jdXIoKSxtPyhvPXBhcnNlRmxvYXQobVsyXSkscD1tWzNdfHwoZi5jc3NOdW1iZXJbaV0/IiI6InB4IikscCE9PSJweCImJihmLnN0eWxlKHRoaXMsaSwob3x8MSkrcCksbj0ob3x8MSkvai5jdXIoKSpuLGYuc3R5bGUodGhpcyxpLG4rcCkpLG1bMV0mJihvPShtWzFdPT09Ii09Ij8tMToxKSpvK24pLGouY3VzdG9tKG4sbyxwKSk6ai5jdXN0b20obixoLCIiKSk7cmV0dXJuITB9dmFyIGU9Zi5zcGVlZChiLGMsZCk7aWYoZi5pc0VtcHR5T2JqZWN0KGEpKXJldHVybiB0aGlzLmVhY2goZS5jb21wbGV0ZSxbITFdKTthPWYuZXh0ZW5kKHt9LGEpO3JldHVybiBlLnF1ZXVlPT09ITE/dGhpcy5lYWNoKGcpOnRoaXMucXVldWUoZS5xdWV1ZSxnKX0sc3RvcDpmdW5jdGlvbihhLGMsZCl7dHlwZW9mIGEhPSJzdHJpbmciJiYoZD1jLGM9YSxhPWIpLGMmJmEhPT0hMSYmdGhpcy5xdWV1ZShhfHwiZngiLFtdKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gaChhLGIsYyl7dmFyIGU9YltjXTtmLnJlbW92ZURhdGEoYSxjLCEwKSxlLnN0b3AoZCl9dmFyIGIsYz0hMSxlPWYudGltZXJzLGc9Zi5fZGF0YSh0aGlzKTtkfHxmLl91bm1hcmsoITAsdGhpcyk7aWYoYT09bnVsbClmb3IoYiBpbiBnKWdbYl0mJmdbYl0uc3RvcCYmYi5pbmRleE9mKCIucnVuIik9PT1iLmxlbmd0aC00JiZoKHRoaXMsZyxiKTtlbHNlIGdbYj1hKyIucnVuIl0mJmdbYl0uc3RvcCYmaCh0aGlzLGcsYik7Zm9yKGI9ZS5sZW5ndGg7Yi0tOyllW2JdLmVsZW09PT10aGlzJiYoYT09bnVsbHx8ZVtiXS5xdWV1ZT09PWEpJiYoZD9lW2JdKCEwKTplW2JdLnNhdmVTdGF0ZSgpLGM9ITAsZS5zcGxpY2UoYiwxKSk7KCFkfHwhYykmJmYuZGVxdWV1ZSh0aGlzLGEpfSl9fSksZi5lYWNoKHtzbGlkZURvd246Y3QoInNob3ciLDEpLHNsaWRlVXA6Y3QoImhpZGUiLDEpLHNsaWRlVG9nZ2xlOmN0KCJ0b2dnbGUiLDEpLGZhZGVJbjp7b3BhY2l0eToic2hvdyJ9LGZhZGVPdXQ6e29wYWNpdHk6ImhpZGUifSxmYWRlVG9nZ2xlOntvcGFjaXR5OiJ0b2dnbGUifX0sZnVuY3Rpb24oYSxiKXtmLmZuW2FdPWZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gdGhpcy5hbmltYXRlKGIsYSxjLGQpfX0pLGYuZXh0ZW5kKHtzcGVlZDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSYmdHlwZW9mIGE9PSJvYmplY3QiP2YuZXh0ZW5kKHt9LGEpOntjb21wbGV0ZTpjfHwhYyYmYnx8Zi5pc0Z1bmN0aW9uKGEpJiZhLGR1cmF0aW9uOmEsZWFzaW5nOmMmJmJ8fGImJiFmLmlzRnVuY3Rpb24oYikmJmJ9O2QuZHVyYXRpb249Zi5meC5vZmY/MDp0eXBlb2YgZC5kdXJhdGlvbj09Im51bWJlciI/ZC5kdXJhdGlvbjpkLmR1cmF0aW9uIGluIGYuZnguc3BlZWRzP2YuZnguc3BlZWRzW2QuZHVyYXRpb25dOmYuZnguc3BlZWRzLl9kZWZhdWx0O2lmKGQucXVldWU9PW51bGx8fGQucXVldWU9PT0hMClkLnF1ZXVlPSJmeCI7ZC5vbGQ9ZC5jb21wbGV0ZSxkLmNvbXBsZXRlPWZ1bmN0aW9uKGEpe2YuaXNGdW5jdGlvbihkLm9sZCkmJmQub2xkLmNhbGwodGhpcyksZC5xdWV1ZT9mLmRlcXVldWUodGhpcyxkLnF1ZXVlKTphIT09ITEmJmYuX3VubWFyayh0aGlzKX07cmV0dXJuIGR9LGVhc2luZzp7bGluZWFyOmZ1bmN0aW9uKGEpe3JldHVybiBhfSxzd2luZzpmdW5jdGlvbihhKXtyZXR1cm4tTWF0aC5jb3MoYSpNYXRoLlBJKS8yKy41fX0sdGltZXJzOltdLGZ4OmZ1bmN0aW9uKGEsYixjKXt0aGlzLm9wdGlvbnM9Yix0aGlzLmVsZW09YSx0aGlzLnByb3A9YyxiLm9yaWc9Yi5vcmlnfHx7fX19KSxmLmZ4LnByb3RvdHlwZT17dXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLChmLmZ4LnN0ZXBbdGhpcy5wcm9wXXx8Zi5meC5zdGVwLl9kZWZhdWx0KSh0aGlzKX0sY3VyOmZ1bmN0aW9uKCl7aWYodGhpcy5lbGVtW3RoaXMucHJvcF0hPW51bGwmJighdGhpcy5lbGVtLnN0eWxlfHx0aGlzLmVsZW0uc3R5bGVbdGhpcy5wcm9wXT09bnVsbCkpcmV0dXJuIHRoaXMuZWxlbVt0aGlzLnByb3BdO3ZhciBhLGI9Zi5jc3ModGhpcy5lbGVtLHRoaXMucHJvcCk7cmV0dXJuIGlzTmFOKGE9cGFyc2VGbG9hdChiKSk/IWJ8fGI9PT0iYXV0byI/MDpiOmF9LGN1c3RvbTpmdW5jdGlvbihhLGMsZCl7ZnVuY3Rpb24gaChhKXtyZXR1cm4gZS5zdGVwKGEpfXZhciBlPXRoaXMsZz1mLmZ4O3RoaXMuc3RhcnRUaW1lPWNxfHxjcigpLHRoaXMuZW5kPWMsdGhpcy5ub3c9dGhpcy5zdGFydD1hLHRoaXMucG9zPXRoaXMuc3RhdGU9MCx0aGlzLnVuaXQ9ZHx8dGhpcy51bml0fHwoZi5jc3NOdW1iZXJbdGhpcy5wcm9wXT8iIjoicHgiKSxoLnF1ZXVlPXRoaXMub3B0aW9ucy5xdWV1ZSxoLmVsZW09dGhpcy5lbGVtLGguc2F2ZVN0YXRlPWZ1bmN0aW9uKCl7Zi5fZGF0YShlLmVsZW0sImZ4c2hvdyIrZS5wcm9wKT09PWImJihlLm9wdGlvbnMuaGlkZT9mLl9kYXRhKGUuZWxlbSwiZnhzaG93IitlLnByb3AsZS5zdGFydCk6ZS5vcHRpb25zLnNob3cmJmYuX2RhdGEoZS5lbGVtLCJmeHNob3ciK2UucHJvcCxlLmVuZCkpfSxoKCkmJmYudGltZXJzLnB1c2goaCkmJiFjbyYmKGNvPXNldEludGVydmFsKGcudGljayxnLmludGVydmFsKSl9LHNob3c6ZnVuY3Rpb24oKXt2YXIgYT1mLl9kYXRhKHRoaXMuZWxlbSwiZnhzaG93Iit0aGlzLnByb3ApO3RoaXMub3B0aW9ucy5vcmlnW3RoaXMucHJvcF09YXx8Zi5zdHlsZSh0aGlzLmVsZW0sdGhpcy5wcm9wKSx0aGlzLm9wdGlvbnMuc2hvdz0hMCxhIT09Yj90aGlzLmN1c3RvbSh0aGlzLmN1cigpLGEpOnRoaXMuY3VzdG9tKHRoaXMucHJvcD09PSJ3aWR0aCJ8fHRoaXMucHJvcD09PSJoZWlnaHQiPzE6MCx0aGlzLmN1cigpKSxmKHRoaXMuZWxlbSkuc2hvdygpfSxoaWRlOmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLm9yaWdbdGhpcy5wcm9wXT1mLl9kYXRhKHRoaXMuZWxlbSwiZnhzaG93Iit0aGlzLnByb3ApfHxmLnN0eWxlKHRoaXMuZWxlbSx0aGlzLnByb3ApLHRoaXMub3B0aW9ucy5oaWRlPSEwLHRoaXMuY3VzdG9tKHRoaXMuY3VyKCksMCl9LHN0ZXA6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGU9Y3F8fGNyKCksZz0hMCxoPXRoaXMuZWxlbSxpPXRoaXMub3B0aW9ucztpZihhfHxlPj1pLmR1cmF0aW9uK3RoaXMuc3RhcnRUaW1lKXt0aGlzLm5vdz10aGlzLmVuZCx0aGlzLnBvcz10aGlzLnN0YXRlPTEsdGhpcy51cGRhdGUoKSxpLmFuaW1hdGVkUHJvcGVydGllc1t0aGlzLnByb3BdPSEwO2ZvcihiIGluIGkuYW5pbWF0ZWRQcm9wZXJ0aWVzKWkuYW5pbWF0ZWRQcm9wZXJ0aWVzW2JdIT09ITAmJihnPSExKTtpZihnKXtpLm92ZXJmbG93IT1udWxsJiYhZi5zdXBwb3J0LnNocmlua1dyYXBCbG9ja3MmJmYuZWFjaChbIiIsIlgiLCJZIl0sZnVuY3Rpb24oYSxiKXtoLnN0eWxlWyJvdmVyZmxvdyIrYl09aS5vdmVyZmxvd1thXX0pLGkuaGlkZSYmZihoKS5oaWRlKCk7aWYoaS5oaWRlfHxpLnNob3cpZm9yKGIgaW4gaS5hbmltYXRlZFByb3BlcnRpZXMpZi5zdHlsZShoLGIsaS5vcmlnW2JdKSxmLnJlbW92ZURhdGEoaCwiZnhzaG93IitiLCEwKSxmLnJlbW92ZURhdGEoaCwidG9nZ2xlIitiLCEwKTtkPWkuY29tcGxldGUsZCYmKGkuY29tcGxldGU9ITEsZC5jYWxsKGgpKX1yZXR1cm4hMX1pLmR1cmF0aW9uPT1JbmZpbml0eT90aGlzLm5vdz1lOihjPWUtdGhpcy5zdGFydFRpbWUsdGhpcy5zdGF0ZT1jL2kuZHVyYXRpb24sdGhpcy5wb3M9Zi5lYXNpbmdbaS5hbmltYXRlZFByb3BlcnRpZXNbdGhpcy5wcm9wXV0odGhpcy5zdGF0ZSxjLDAsMSxpLmR1cmF0aW9uKSx0aGlzLm5vdz10aGlzLnN0YXJ0Kyh0aGlzLmVuZC10aGlzLnN0YXJ0KSp0aGlzLnBvcyksdGhpcy51cGRhdGUoKTtyZXR1cm4hMH19LGYuZXh0ZW5kKGYuZngse3RpY2s6ZnVuY3Rpb24oKXt2YXIgYSxiPWYudGltZXJzLGM9MDtmb3IoO2M8Yi5sZW5ndGg7YysrKWE9YltjXSwhYSgpJiZiW2NdPT09YSYmYi5zcGxpY2UoYy0tLDEpO2IubGVuZ3RofHxmLmZ4LnN0b3AoKX0saW50ZXJ2YWw6MTMsc3RvcDpmdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwoY28pLGNvPW51bGx9LHNwZWVkczp7c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxzdGVwOntvcGFjaXR5OmZ1bmN0aW9uKGEpe2Yuc3R5bGUoYS5lbGVtLCJvcGFjaXR5IixhLm5vdyl9LF9kZWZhdWx0OmZ1bmN0aW9uKGEpe2EuZWxlbS5zdHlsZSYmYS5lbGVtLnN0eWxlW2EucHJvcF0hPW51bGw/YS5lbGVtLnN0eWxlW2EucHJvcF09YS5ub3crYS51bml0OmEuZWxlbVthLnByb3BdPWEubm93fX19KSxmLmVhY2goY3AuY29uY2F0LmFwcGx5KFtdLGNwKSxmdW5jdGlvbihhLGIpe2IuaW5kZXhPZigibWFyZ2luIikmJihmLmZ4LnN0ZXBbYl09ZnVuY3Rpb24oYSl7Zi5zdHlsZShhLmVsZW0sYixNYXRoLm1heCgwLGEubm93KSthLnVuaXQpfSl9KSxmLmV4cHImJmYuZXhwci5maWx0ZXJzJiYoZi5leHByLmZpbHRlcnMuYW5pbWF0ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGYuZ3JlcChmLnRpbWVycyxmdW5jdGlvbihiKXtyZXR1cm4gYT09PWIuZWxlbX0pLmxlbmd0aH0pO3ZhciBjdixjdz0vXnQoPzphYmxlfGR8aCkkL2ksY3g9L14oPzpib2R5fGh0bWwpJC9pOyJnZXRCb3VuZGluZ0NsaWVudFJlY3QiaW4gYy5kb2N1bWVudEVsZW1lbnQ/Y3Y9ZnVuY3Rpb24oYSxiLGMsZCl7dHJ5e2Q9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX1jYXRjaChlKXt9aWYoIWR8fCFmLmNvbnRhaW5zKGMsYSkpcmV0dXJuIGQ/e3RvcDpkLnRvcCxsZWZ0OmQubGVmdH06e3RvcDowLGxlZnQ6MH07dmFyIGc9Yi5ib2R5LGg9Y3koYiksaT1jLmNsaWVudFRvcHx8Zy5jbGllbnRUb3B8fDAsaj1jLmNsaWVudExlZnR8fGcuY2xpZW50TGVmdHx8MCxrPWgucGFnZVlPZmZzZXR8fGYuc3VwcG9ydC5ib3hNb2RlbCYmYy5zY3JvbGxUb3B8fGcuc2Nyb2xsVG9wLGw9aC5wYWdlWE9mZnNldHx8Zi5zdXBwb3J0LmJveE1vZGVsJiZjLnNjcm9sbExlZnR8fGcuc2Nyb2xsTGVmdCxtPWQudG9wK2staSxuPWQubGVmdCtsLWo7cmV0dXJue3RvcDptLGxlZnQ6bn19OmN2PWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlPWEub2Zmc2V0UGFyZW50LGc9YSxoPWIuYm9keSxpPWIuZGVmYXVsdFZpZXcsaj1pP2kuZ2V0Q29tcHV0ZWRTdHlsZShhLG51bGwpOmEuY3VycmVudFN0eWxlLGs9YS5vZmZzZXRUb3AsbD1hLm9mZnNldExlZnQ7d2hpbGUoKGE9YS5wYXJlbnROb2RlKSYmYSE9PWgmJmEhPT1jKXtpZihmLnN1cHBvcnQuZml4ZWRQb3NpdGlvbiYmai5wb3NpdGlvbj09PSJmaXhlZCIpYnJlYWs7ZD1pP2kuZ2V0Q29tcHV0ZWRTdHlsZShhLG51bGwpOmEuY3VycmVudFN0eWxlLGstPWEuc2Nyb2xsVG9wLGwtPWEuc2Nyb2xsTGVmdCxhPT09ZSYmKGsrPWEub2Zmc2V0VG9wLGwrPWEub2Zmc2V0TGVmdCxmLnN1cHBvcnQuZG9lc05vdEFkZEJvcmRlciYmKCFmLnN1cHBvcnQuZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHN8fCFjdy50ZXN0KGEubm9kZU5hbWUpKSYmKGsrPXBhcnNlRmxvYXQoZC5ib3JkZXJUb3BXaWR0aCl8fDAsbCs9cGFyc2VGbG9hdChkLmJvcmRlckxlZnRXaWR0aCl8fDApLGc9ZSxlPWEub2Zmc2V0UGFyZW50KSxmLnN1cHBvcnQuc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlJiZkLm92ZXJmbG93IT09InZpc2libGUiJiYoays9cGFyc2VGbG9hdChkLmJvcmRlclRvcFdpZHRoKXx8MCxsKz1wYXJzZUZsb2F0KGQuYm9yZGVyTGVmdFdpZHRoKXx8MCksaj1kfWlmKGoucG9zaXRpb249PT0icmVsYXRpdmUifHxqLnBvc2l0aW9uPT09InN0YXRpYyIpays9aC5vZmZzZXRUb3AsbCs9aC5vZmZzZXRMZWZ0O2Yuc3VwcG9ydC5maXhlZFBvc2l0aW9uJiZqLnBvc2l0aW9uPT09ImZpeGVkIiYmKGsrPU1hdGgubWF4KGMuc2Nyb2xsVG9wLGguc2Nyb2xsVG9wKSxsKz1NYXRoLm1heChjLnNjcm9sbExlZnQsaC5zY3JvbGxMZWZ0KSk7cmV0dXJue3RvcDprLGxlZnQ6bH19LGYuZm4ub2Zmc2V0PWZ1bmN0aW9uKGEpe2lmKGFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGE9PT1iP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2Yub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsYil9KTt2YXIgYz10aGlzWzBdLGQ9YyYmYy5vd25lckRvY3VtZW50O2lmKCFkKXJldHVybiBudWxsO2lmKGM9PT1kLmJvZHkpcmV0dXJuIGYub2Zmc2V0LmJvZHlPZmZzZXQoYyk7cmV0dXJuIGN2KGMsZCxkLmRvY3VtZW50RWxlbWVudCl9LGYub2Zmc2V0PXtib2R5T2Zmc2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEub2Zmc2V0VG9wLGM9YS5vZmZzZXRMZWZ0O2Yuc3VwcG9ydC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldCYmKGIrPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luVG9wIikpfHwwLGMrPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luTGVmdCIpKXx8MCk7cmV0dXJue3RvcDpiLGxlZnQ6Y319LHNldE9mZnNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9Zi5jc3MoYSwicG9zaXRpb24iKTtkPT09InN0YXRpYyImJihhLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpO3ZhciBlPWYoYSksZz1lLm9mZnNldCgpLGg9Zi5jc3MoYSwidG9wIiksaT1mLmNzcyhhLCJsZWZ0Iiksaj0oZD09PSJhYnNvbHV0ZSJ8fGQ9PT0iZml4ZWQiKSYmZi5pbkFycmF5KCJhdXRvIixbaCxpXSk+LTEsaz17fSxsPXt9LG0sbjtqPyhsPWUucG9zaXRpb24oKSxtPWwudG9wLG49bC5sZWZ0KToobT1wYXJzZUZsb2F0KGgpfHwwLG49cGFyc2VGbG9hdChpKXx8MCksZi5pc0Z1bmN0aW9uKGIpJiYoYj1iLmNhbGwoYSxjLGcpKSxiLnRvcCE9bnVsbCYmKGsudG9wPWIudG9wLWcudG9wK20pLGIubGVmdCE9bnVsbCYmKGsubGVmdD1iLmxlZnQtZy5sZWZ0K24pLCJ1c2luZyJpbiBiP2IudXNpbmcuY2FsbChhLGspOmUuY3NzKGspfX0sZi5mbi5leHRlbmQoe3Bvc2l0aW9uOmZ1bmN0aW9uKCl7aWYoIXRoaXNbMF0pcmV0dXJuIG51bGw7dmFyIGE9dGhpc1swXSxiPXRoaXMub2Zmc2V0UGFyZW50KCksYz10aGlzLm9mZnNldCgpLGQ9Y3gudGVzdChiWzBdLm5vZGVOYW1lKT97dG9wOjAsbGVmdDowfTpiLm9mZnNldCgpO2MudG9wLT1wYXJzZUZsb2F0KGYuY3NzKGEsIm1hcmdpblRvcCIpKXx8MCxjLmxlZnQtPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luTGVmdCIpKXx8MCxkLnRvcCs9cGFyc2VGbG9hdChmLmNzcyhiWzBdLCJib3JkZXJUb3BXaWR0aCIpKXx8MCxkLmxlZnQrPXBhcnNlRmxvYXQoZi5jc3MoYlswXSwiYm9yZGVyTGVmdFdpZHRoIikpfHwwO3JldHVybnt0b3A6Yy50b3AtZC50b3AsbGVmdDpjLmxlZnQtZC5sZWZ0fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vZmZzZXRQYXJlbnR8fGMuYm9keTt3aGlsZShhJiYhY3gudGVzdChhLm5vZGVOYW1lKSYmZi5jc3MoYSwicG9zaXRpb24iKT09PSJzdGF0aWMiKWE9YS5vZmZzZXRQYXJlbnQ7cmV0dXJuIGF9KX19KSxmLmVhY2goe3Njcm9sbExlZnQ6InBhZ2VYT2Zmc2V0IixzY3JvbGxUb3A6InBhZ2VZT2Zmc2V0In0sZnVuY3Rpb24oYSxjKXt2YXIgZD0vWS8udGVzdChjKTtmLmZuW2FdPWZ1bmN0aW9uKGUpe3JldHVybiBmLmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGEsZSxnKXt2YXIgaD1jeShhKTtpZihnPT09YilyZXR1cm4gaD9jIGluIGg/aFtjXTpmLnN1cHBvcnQuYm94TW9kZWwmJmguZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50W2VdfHxoLmRvY3VtZW50LmJvZHlbZV06YVtlXTtoP2guc2Nyb2xsVG8oZD9mKGgpLnNjcm9sbExlZnQoKTpnLGQ/ZzpmKGgpLnNjcm9sbFRvcCgpKTphW2VdPWd9LGEsZSxhcmd1bWVudHMubGVuZ3RoLG51bGwpfX0pLGYuZWFjaCh7SGVpZ2h0OiJoZWlnaHQiLFdpZHRoOiJ3aWR0aCJ9LGZ1bmN0aW9uKGEsYyl7dmFyIGQ9ImNsaWVudCIrYSxlPSJzY3JvbGwiK2EsZz0ib2Zmc2V0IithO2YuZm5bImlubmVyIithXT1mdW5jdGlvbigpe3ZhciBhPXRoaXNbMF07cmV0dXJuIGE/YS5zdHlsZT9wYXJzZUZsb2F0KGYuY3NzKGEsYywicGFkZGluZyIpKTp0aGlzW2NdKCk6bnVsbH0sZi5mblsib3V0ZXIiK2FdPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF07cmV0dXJuIGI/Yi5zdHlsZT9wYXJzZUZsb2F0KGYuY3NzKGIsYyxhPyJtYXJnaW4iOiJib3JkZXIiKSk6dGhpc1tjXSgpOm51bGx9LGYuZm5bY109ZnVuY3Rpb24oYSl7cmV0dXJuIGYuYWNjZXNzKHRoaXMsZnVuY3Rpb24oYSxjLGgpe3ZhciBpLGosayxsO2lmKGYuaXNXaW5kb3coYSkpe2k9YS5kb2N1bWVudCxqPWkuZG9jdW1lbnRFbGVtZW50W2RdO3JldHVybiBmLnN1cHBvcnQuYm94TW9kZWwmJmp8fGkuYm9keSYmaS5ib2R5W2RdfHxqfWlmKGEubm9kZVR5cGU9PT05KXtpPWEuZG9jdW1lbnRFbGVtZW50O2lmKGlbZF0+PWlbZV0pcmV0dXJuIGlbZF07cmV0dXJuIE1hdGgubWF4KGEuYm9keVtlXSxpW2VdLGEuYm9keVtnXSxpW2ddKX1pZihoPT09Yil7az1mLmNzcyhhLGMpLGw9cGFyc2VGbG9hdChrKTtyZXR1cm4gZi5pc051bWVyaWMobCk/bDprfWYoYSkuY3NzKGMsaCl9LGMsYSxhcmd1bWVudHMubGVuZ3RoLG51bGwpfX0pLGEualF1ZXJ5PWEuJD1mLHR5cGVvZiBkZWZpbmU9PSJmdW5jdGlvbiImJmRlZmluZS5hbWQmJmRlZmluZS5hbWQualF1ZXJ5JiZkZWZpbmUoImpxdWVyeSIsW10sZnVuY3Rpb24oKXtyZXR1cm4gZn0pfSkod2luZG93KTs=]]></data>
	</file>
	<file>
	  <filename>/lib/js/jquery-1.8.3.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjEuOC4zCiAqIGh0dHA6Ly9qcXVlcnkuY29tLwogKgogKiBJbmNsdWRlcyBTaXp6bGUuanMKICogaHR0cDovL3NpenpsZWpzLmNvbS8KICoKICogQ29weXJpZ2h0IDIwMTIgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycwogKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UKICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBEYXRlOiBUdWUgTm92IDEzIDIwMTIgMDg6MjA6MzMgR01ULTA1MDAgKEVhc3Rlcm4gU3RhbmRhcmQgVGltZSkKICovCihmdW5jdGlvbiggd2luZG93LCB1bmRlZmluZWQgKSB7CnZhcgoJLy8gQSBjZW50cmFsIHJlZmVyZW5jZSB0byB0aGUgcm9vdCBqUXVlcnkoZG9jdW1lbnQpCglyb290alF1ZXJ5LAoKCS8vIFRoZSBkZWZlcnJlZCB1c2VkIG9uIERPTSByZWFkeQoJcmVhZHlMaXN0LAoKCS8vIFVzZSB0aGUgY29ycmVjdCBkb2N1bWVudCBhY2NvcmRpbmdseSB3aXRoIHdpbmRvdyBhcmd1bWVudCAoc2FuZGJveCkKCWRvY3VtZW50ID0gd2luZG93LmRvY3VtZW50LAoJbG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb24sCgluYXZpZ2F0b3IgPSB3aW5kb3cubmF2aWdhdG9yLAoKCS8vIE1hcCBvdmVyIGpRdWVyeSBpbiBjYXNlIG9mIG92ZXJ3cml0ZQoJX2pRdWVyeSA9IHdpbmRvdy5qUXVlcnksCgoJLy8gTWFwIG92ZXIgdGhlICQgaW4gY2FzZSBvZiBvdmVyd3JpdGUKCV8kID0gd2luZG93LiQsCgoJLy8gU2F2ZSBhIHJlZmVyZW5jZSB0byBzb21lIGNvcmUgbWV0aG9kcwoJY29yZV9wdXNoID0gQXJyYXkucHJvdG90eXBlLnB1c2gsCgljb3JlX3NsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLAoJY29yZV9pbmRleE9mID0gQXJyYXkucHJvdG90eXBlLmluZGV4T2YsCgljb3JlX3RvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZywKCWNvcmVfaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSwKCWNvcmVfdHJpbSA9IFN0cmluZy5wcm90b3R5cGUudHJpbSwKCgkvLyBEZWZpbmUgYSBsb2NhbCBjb3B5IG9mIGpRdWVyeQoJalF1ZXJ5ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgewoJCS8vIFRoZSBqUXVlcnkgb2JqZWN0IGlzIGFjdHVhbGx5IGp1c3QgdGhlIGluaXQgY29uc3RydWN0b3IgJ2VuaGFuY2VkJwoJCXJldHVybiBuZXcgalF1ZXJ5LmZuLmluaXQoIHNlbGVjdG9yLCBjb250ZXh0LCByb290alF1ZXJ5ICk7Cgl9LAoKCS8vIFVzZWQgZm9yIG1hdGNoaW5nIG51bWJlcnMKCWNvcmVfcG51bSA9IC9bXC0rXT8oPzpcZCpcLnwpXGQrKD86W2VFXVtcLStdP1xkK3wpLy5zb3VyY2UsCgoJLy8gVXNlZCBmb3IgZGV0ZWN0aW5nIGFuZCB0cmltbWluZyB3aGl0ZXNwYWNlCgljb3JlX3Jub3R3aGl0ZSA9IC9cUy8sCgljb3JlX3JzcGFjZSA9IC9ccysvLAoKCS8vIE1ha2Ugc3VyZSB3ZSB0cmltIEJPTSBhbmQgTkJTUCAoaGVyZSdzIGxvb2tpbmcgYXQgeW91LCBTYWZhcmkgNS4wIGFuZCBJRSkKCXJ0cmltID0gL15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nLAoKCS8vIEEgc2ltcGxlIHdheSB0byBjaGVjayBmb3IgSFRNTCBzdHJpbmdzCgkvLyBQcmlvcml0aXplICNpZCBvdmVyIDx0YWc+IHRvIGF2b2lkIFhTUyB2aWEgbG9jYXRpb24uaGFzaCAoIzk1MjEpCglycXVpY2tFeHByID0gL14oPzpbXiM8XSooPFtcd1xXXSs+KVtePl0qJHwjKFtcd1wtXSopJCkvLAoKCS8vIE1hdGNoIGEgc3RhbmRhbG9uZSB0YWcKCXJzaW5nbGVUYWcgPSAvXjwoXHcrKVxzKlwvPz4oPzo8XC9cMT58KSQvLAoKCS8vIEpTT04gUmVnRXhwCglydmFsaWRjaGFycyA9IC9eW1xdLDp7fVxzXSokLywKCXJ2YWxpZGJyYWNlcyA9IC8oPzpefDp8LCkoPzpccypcWykrL2csCglydmFsaWRlc2NhcGUgPSAvXFwoPzpbIlxcXC9iZm5ydF18dVtcZGEtZkEtRl17NH0pL2csCglydmFsaWR0b2tlbnMgPSAvIlteIlxcXHJcbl0qInx0cnVlfGZhbHNlfG51bGx8LT8oPzpcZFxkKlwufClcZCsoPzpbZUVdW1wtK10/XGQrfCkvZywKCgkvLyBNYXRjaGVzIGRhc2hlZCBzdHJpbmcgZm9yIGNhbWVsaXppbmcKCXJtc1ByZWZpeCA9IC9eLW1zLS8sCglyZGFzaEFscGhhID0gLy0oW1xkYS16XSkvZ2ksCgoJLy8gVXNlZCBieSBqUXVlcnkuY2FtZWxDYXNlIGFzIGNhbGxiYWNrIHRvIHJlcGxhY2UoKQoJZmNhbWVsQ2FzZSA9IGZ1bmN0aW9uKCBhbGwsIGxldHRlciApIHsKCQlyZXR1cm4gKCBsZXR0ZXIgKyAiIiApLnRvVXBwZXJDYXNlKCk7Cgl9LAoKCS8vIFRoZSByZWFkeSBldmVudCBoYW5kbGVyIGFuZCBzZWxmIGNsZWFudXAgbWV0aG9kCglET01Db250ZW50TG9hZGVkID0gZnVuY3Rpb24oKSB7CgkJaWYgKCBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyICkgewoJCQlkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCAiRE9NQ29udGVudExvYWRlZCIsIERPTUNvbnRlbnRMb2FkZWQsIGZhbHNlICk7CgkJCWpRdWVyeS5yZWFkeSgpOwoJCX0gZWxzZSBpZiAoIGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJjb21wbGV0ZSIgKSB7CgkJCS8vIHdlJ3JlIGhlcmUgYmVjYXVzZSByZWFkeVN0YXRlID09PSAiY29tcGxldGUiIGluIG9sZElFCgkJCS8vIHdoaWNoIGlzIGdvb2QgZW5vdWdoIGZvciB1cyB0byBjYWxsIHRoZSBkb20gcmVhZHkhCgkJCWRvY3VtZW50LmRldGFjaEV2ZW50KCAib25yZWFkeXN0YXRlY2hhbmdlIiwgRE9NQ29udGVudExvYWRlZCApOwoJCQlqUXVlcnkucmVhZHkoKTsKCQl9Cgl9LAoKCS8vIFtbQ2xhc3NdXSAtPiB0eXBlIHBhaXJzCgljbGFzczJ0eXBlID0ge307CgpqUXVlcnkuZm4gPSBqUXVlcnkucHJvdG90eXBlID0gewoJY29uc3RydWN0b3I6IGpRdWVyeSwKCWluaXQ6IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCwgcm9vdGpRdWVyeSApIHsKCQl2YXIgbWF0Y2gsIGVsZW0sIHJldCwgZG9jOwoKCQkvLyBIYW5kbGUgJCgiIiksICQobnVsbCksICQodW5kZWZpbmVkKSwgJChmYWxzZSkKCQlpZiAoICFzZWxlY3RvciApIHsKCQkJcmV0dXJuIHRoaXM7CgkJfQoKCQkvLyBIYW5kbGUgJChET01FbGVtZW50KQoJCWlmICggc2VsZWN0b3Iubm9kZVR5cGUgKSB7CgkJCXRoaXMuY29udGV4dCA9IHRoaXNbMF0gPSBzZWxlY3RvcjsKCQkJdGhpcy5sZW5ndGggPSAxOwoJCQlyZXR1cm4gdGhpczsKCQl9CgoJCS8vIEhhbmRsZSBIVE1MIHN0cmluZ3MKCQlpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CgkJCWlmICggc2VsZWN0b3IuY2hhckF0KDApID09PSAiPCIgJiYgc2VsZWN0b3IuY2hhckF0KCBzZWxlY3Rvci5sZW5ndGggLSAxICkgPT09ICI+IiAmJiBzZWxlY3Rvci5sZW5ndGggPj0gMyApIHsKCQkJCS8vIEFzc3VtZSB0aGF0IHN0cmluZ3MgdGhhdCBzdGFydCBhbmQgZW5kIHdpdGggPD4gYXJlIEhUTUwgYW5kIHNraXAgdGhlIHJlZ2V4IGNoZWNrCgkJCQltYXRjaCA9IFsgbnVsbCwgc2VsZWN0b3IsIG51bGwgXTsKCgkJCX0gZWxzZSB7CgkJCQltYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKTsKCQkJfQoKCQkJLy8gTWF0Y2ggaHRtbCBvciBtYWtlIHN1cmUgbm8gY29udGV4dCBpcyBzcGVjaWZpZWQgZm9yICNpZAoJCQlpZiAoIG1hdGNoICYmIChtYXRjaFsxXSB8fCAhY29udGV4dCkgKSB7CgoJCQkJLy8gSEFORExFOiAkKGh0bWwpIC0+ICQoYXJyYXkpCgkJCQlpZiAoIG1hdGNoWzFdICkgewoJCQkJCWNvbnRleHQgPSBjb250ZXh0IGluc3RhbmNlb2YgalF1ZXJ5ID8gY29udGV4dFswXSA6IGNvbnRleHQ7CgkJCQkJZG9jID0gKCBjb250ZXh0ICYmIGNvbnRleHQubm9kZVR5cGUgPyBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCA6IGRvY3VtZW50ICk7CgoJCQkJCS8vIHNjcmlwdHMgaXMgdHJ1ZSBmb3IgYmFjay1jb21wYXQKCQkJCQlzZWxlY3RvciA9IGpRdWVyeS5wYXJzZUhUTUwoIG1hdGNoWzFdLCBkb2MsIHRydWUgKTsKCQkJCQlpZiAoIHJzaW5nbGVUYWcudGVzdCggbWF0Y2hbMV0gKSAmJiBqUXVlcnkuaXNQbGFpbk9iamVjdCggY29udGV4dCApICkgewoJCQkJCQl0aGlzLmF0dHIuY2FsbCggc2VsZWN0b3IsIGNvbnRleHQsIHRydWUgKTsKCQkJCQl9CgoJCQkJCXJldHVybiBqUXVlcnkubWVyZ2UoIHRoaXMsIHNlbGVjdG9yICk7CgoJCQkJLy8gSEFORExFOiAkKCNpZCkKCQkJCX0gZWxzZSB7CgkJCQkJZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBtYXRjaFsyXSApOwoKCQkJCQkvLyBDaGVjayBwYXJlbnROb2RlIHRvIGNhdGNoIHdoZW4gQmxhY2tiZXJyeSA0LjYgcmV0dXJucwoJCQkJCS8vIG5vZGVzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQgIzY5NjMKCQkJCQlpZiAoIGVsZW0gJiYgZWxlbS5wYXJlbnROb2RlICkgewoJCQkJCQkvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgSUUgYW5kIE9wZXJhIHJldHVybiBpdGVtcwoJCQkJCQkvLyBieSBuYW1lIGluc3RlYWQgb2YgSUQKCQkJCQkJaWYgKCBlbGVtLmlkICE9PSBtYXRjaFsyXSApIHsKCQkJCQkJCXJldHVybiByb290alF1ZXJ5LmZpbmQoIHNlbGVjdG9yICk7CgkJCQkJCX0KCgkJCQkJCS8vIE90aGVyd2lzZSwgd2UgaW5qZWN0IHRoZSBlbGVtZW50IGRpcmVjdGx5IGludG8gdGhlIGpRdWVyeSBvYmplY3QKCQkJCQkJdGhpcy5sZW5ndGggPSAxOwoJCQkJCQl0aGlzWzBdID0gZWxlbTsKCQkJCQl9CgoJCQkJCXRoaXMuY29udGV4dCA9IGRvY3VtZW50OwoJCQkJCXRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjsKCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0KCgkJCS8vIEhBTkRMRTogJChleHByLCAkKC4uLikpCgkJCX0gZWxzZSBpZiAoICFjb250ZXh0IHx8IGNvbnRleHQuanF1ZXJ5ICkgewoJCQkJcmV0dXJuICggY29udGV4dCB8fCByb290alF1ZXJ5ICkuZmluZCggc2VsZWN0b3IgKTsKCgkJCS8vIEhBTkRMRTogJChleHByLCBjb250ZXh0KQoJCQkvLyAod2hpY2ggaXMganVzdCBlcXVpdmFsZW50IHRvOiAkKGNvbnRleHQpLmZpbmQoZXhwcikKCQkJfSBlbHNlIHsKCQkJCXJldHVybiB0aGlzLmNvbnN0cnVjdG9yKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKTsKCQkJfQoKCQkvLyBIQU5ETEU6ICQoZnVuY3Rpb24pCgkJLy8gU2hvcnRjdXQgZm9yIGRvY3VtZW50IHJlYWR5CgkJfSBlbHNlIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHNlbGVjdG9yICkgKSB7CgkJCXJldHVybiByb290alF1ZXJ5LnJlYWR5KCBzZWxlY3RvciApOwoJCX0KCgkJaWYgKCBzZWxlY3Rvci5zZWxlY3RvciAhPT0gdW5kZWZpbmVkICkgewoJCQl0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3Iuc2VsZWN0b3I7CgkJCXRoaXMuY29udGV4dCA9IHNlbGVjdG9yLmNvbnRleHQ7CgkJfQoKCQlyZXR1cm4galF1ZXJ5Lm1ha2VBcnJheSggc2VsZWN0b3IsIHRoaXMgKTsKCX0sCgoJLy8gU3RhcnQgd2l0aCBhbiBlbXB0eSBzZWxlY3RvcgoJc2VsZWN0b3I6ICIiLAoKCS8vIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgalF1ZXJ5IGJlaW5nIHVzZWQKCWpxdWVyeTogIjEuOC4zIiwKCgkvLyBUaGUgZGVmYXVsdCBsZW5ndGggb2YgYSBqUXVlcnkgb2JqZWN0IGlzIDAKCWxlbmd0aDogMCwKCgkvLyBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50IHNldAoJc2l6ZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMubGVuZ3RoOwoJfSwKCgl0b0FycmF5OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gY29yZV9zbGljZS5jYWxsKCB0aGlzICk7Cgl9LAoKCS8vIEdldCB0aGUgTnRoIGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQgT1IKCS8vIEdldCB0aGUgd2hvbGUgbWF0Y2hlZCBlbGVtZW50IHNldCBhcyBhIGNsZWFuIGFycmF5CglnZXQ6IGZ1bmN0aW9uKCBudW0gKSB7CgkJcmV0dXJuIG51bSA9PSBudWxsID8KCgkJCS8vIFJldHVybiBhICdjbGVhbicgYXJyYXkKCQkJdGhpcy50b0FycmF5KCkgOgoKCQkJLy8gUmV0dXJuIGp1c3QgdGhlIG9iamVjdAoJCQkoIG51bSA8IDAgPyB0aGlzWyB0aGlzLmxlbmd0aCArIG51bSBdIDogdGhpc1sgbnVtIF0gKTsKCX0sCgoJLy8gVGFrZSBhbiBhcnJheSBvZiBlbGVtZW50cyBhbmQgcHVzaCBpdCBvbnRvIHRoZSBzdGFjawoJLy8gKHJldHVybmluZyB0aGUgbmV3IG1hdGNoZWQgZWxlbWVudCBzZXQpCglwdXNoU3RhY2s6IGZ1bmN0aW9uKCBlbGVtcywgbmFtZSwgc2VsZWN0b3IgKSB7CgoJCS8vIEJ1aWxkIGEgbmV3IGpRdWVyeSBtYXRjaGVkIGVsZW1lbnQgc2V0CgkJdmFyIHJldCA9IGpRdWVyeS5tZXJnZSggdGhpcy5jb25zdHJ1Y3RvcigpLCBlbGVtcyApOwoKCQkvLyBBZGQgdGhlIG9sZCBvYmplY3Qgb250byB0aGUgc3RhY2sgKGFzIGEgcmVmZXJlbmNlKQoJCXJldC5wcmV2T2JqZWN0ID0gdGhpczsKCgkJcmV0LmNvbnRleHQgPSB0aGlzLmNvbnRleHQ7CgoJCWlmICggbmFtZSA9PT0gImZpbmQiICkgewoJCQlyZXQuc2VsZWN0b3IgPSB0aGlzLnNlbGVjdG9yICsgKCB0aGlzLnNlbGVjdG9yID8gIiAiIDogIiIgKSArIHNlbGVjdG9yOwoJCX0gZWxzZSBpZiAoIG5hbWUgKSB7CgkJCXJldC5zZWxlY3RvciA9IHRoaXMuc2VsZWN0b3IgKyAiLiIgKyBuYW1lICsgIigiICsgc2VsZWN0b3IgKyAiKSI7CgkJfQoKCQkvLyBSZXR1cm4gdGhlIG5ld2x5LWZvcm1lZCBlbGVtZW50IHNldAoJCXJldHVybiByZXQ7Cgl9LAoKCS8vIEV4ZWN1dGUgYSBjYWxsYmFjayBmb3IgZXZlcnkgZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBzZXQuCgkvLyAoWW91IGNhbiBzZWVkIHRoZSBhcmd1bWVudHMgd2l0aCBhbiBhcnJheSBvZiBhcmdzLCBidXQgdGhpcyBpcwoJLy8gb25seSB1c2VkIGludGVybmFsbHkuKQoJZWFjaDogZnVuY3Rpb24oIGNhbGxiYWNrLCBhcmdzICkgewoJCXJldHVybiBqUXVlcnkuZWFjaCggdGhpcywgY2FsbGJhY2ssIGFyZ3MgKTsKCX0sCgoJcmVhZHk6IGZ1bmN0aW9uKCBmbiApIHsKCQkvLyBBZGQgdGhlIGNhbGxiYWNrCgkJalF1ZXJ5LnJlYWR5LnByb21pc2UoKS5kb25lKCBmbiApOwoKCQlyZXR1cm4gdGhpczsKCX0sCgoJZXE6IGZ1bmN0aW9uKCBpICkgewoJCWkgPSAraTsKCQlyZXR1cm4gaSA9PT0gLTEgPwoJCQl0aGlzLnNsaWNlKCBpICkgOgoJCQl0aGlzLnNsaWNlKCBpLCBpICsgMSApOwoJfSwKCglmaXJzdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZXEoIDAgKTsKCX0sCgoJbGFzdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZXEoIC0xICk7Cgl9LAoKCXNsaWNlOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGNvcmVfc2xpY2UuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApLAoJCQkic2xpY2UiLCBjb3JlX3NsaWNlLmNhbGwoYXJndW1lbnRzKS5qb2luKCIsIikgKTsKCX0sCgoJbWFwOiBmdW5jdGlvbiggY2FsbGJhY2sgKSB7CgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkubWFwKHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBpICkgewoJCQlyZXR1cm4gY2FsbGJhY2suY2FsbCggZWxlbSwgaSwgZWxlbSApOwoJCX0pKTsKCX0sCgoJZW5kOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5wcmV2T2JqZWN0IHx8IHRoaXMuY29uc3RydWN0b3IobnVsbCk7Cgl9LAoKCS8vIEZvciBpbnRlcm5hbCB1c2Ugb25seS4KCS8vIEJlaGF2ZXMgbGlrZSBhbiBBcnJheSdzIG1ldGhvZCwgbm90IGxpa2UgYSBqUXVlcnkgbWV0aG9kLgoJcHVzaDogY29yZV9wdXNoLAoJc29ydDogW10uc29ydCwKCXNwbGljZTogW10uc3BsaWNlCn07CgovLyBHaXZlIHRoZSBpbml0IGZ1bmN0aW9uIHRoZSBqUXVlcnkgcHJvdG90eXBlIGZvciBsYXRlciBpbnN0YW50aWF0aW9uCmpRdWVyeS5mbi5pbml0LnByb3RvdHlwZSA9IGpRdWVyeS5mbjsKCmpRdWVyeS5leHRlbmQgPSBqUXVlcnkuZm4uZXh0ZW5kID0gZnVuY3Rpb24oKSB7Cgl2YXIgb3B0aW9ucywgbmFtZSwgc3JjLCBjb3B5LCBjb3B5SXNBcnJheSwgY2xvbmUsCgkJdGFyZ2V0ID0gYXJndW1lbnRzWzBdIHx8IHt9LAoJCWkgPSAxLAoJCWxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsCgkJZGVlcCA9IGZhbHNlOwoKCS8vIEhhbmRsZSBhIGRlZXAgY29weSBzaXR1YXRpb24KCWlmICggdHlwZW9mIHRhcmdldCA9PT0gImJvb2xlYW4iICkgewoJCWRlZXAgPSB0YXJnZXQ7CgkJdGFyZ2V0ID0gYXJndW1lbnRzWzFdIHx8IHt9OwoJCS8vIHNraXAgdGhlIGJvb2xlYW4gYW5kIHRoZSB0YXJnZXQKCQlpID0gMjsKCX0KCgkvLyBIYW5kbGUgY2FzZSB3aGVuIHRhcmdldCBpcyBhIHN0cmluZyBvciBzb21ldGhpbmcgKHBvc3NpYmxlIGluIGRlZXAgY29weSkKCWlmICggdHlwZW9mIHRhcmdldCAhPT0gIm9iamVjdCIgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKHRhcmdldCkgKSB7CgkJdGFyZ2V0ID0ge307Cgl9CgoJLy8gZXh0ZW5kIGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFzc2VkCglpZiAoIGxlbmd0aCA9PT0gaSApIHsKCQl0YXJnZXQgPSB0aGlzOwoJCS0taTsKCX0KCglmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKCQkvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91bmRlZmluZWQgdmFsdWVzCgkJaWYgKCAob3B0aW9ucyA9IGFyZ3VtZW50c1sgaSBdKSAhPSBudWxsICkgewoJCQkvLyBFeHRlbmQgdGhlIGJhc2Ugb2JqZWN0CgkJCWZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHsKCQkJCXNyYyA9IHRhcmdldFsgbmFtZSBdOwoJCQkJY29weSA9IG9wdGlvbnNbIG5hbWUgXTsKCgkJCQkvLyBQcmV2ZW50IG5ldmVyLWVuZGluZyBsb29wCgkJCQlpZiAoIHRhcmdldCA9PT0gY29weSApIHsKCQkJCQljb250aW51ZTsKCQkJCX0KCgkJCQkvLyBSZWN1cnNlIGlmIHdlJ3JlIG1lcmdpbmcgcGxhaW4gb2JqZWN0cyBvciBhcnJheXMKCQkJCWlmICggZGVlcCAmJiBjb3B5ICYmICggalF1ZXJ5LmlzUGxhaW5PYmplY3QoY29weSkgfHwgKGNvcHlJc0FycmF5ID0galF1ZXJ5LmlzQXJyYXkoY29weSkpICkgKSB7CgkJCQkJaWYgKCBjb3B5SXNBcnJheSApIHsKCQkJCQkJY29weUlzQXJyYXkgPSBmYWxzZTsKCQkJCQkJY2xvbmUgPSBzcmMgJiYgalF1ZXJ5LmlzQXJyYXkoc3JjKSA/IHNyYyA6IFtdOwoKCQkJCQl9IGVsc2UgewoJCQkJCQljbG9uZSA9IHNyYyAmJiBqUXVlcnkuaXNQbGFpbk9iamVjdChzcmMpID8gc3JjIDoge307CgkJCQkJfQoKCQkJCQkvLyBOZXZlciBtb3ZlIG9yaWdpbmFsIG9iamVjdHMsIGNsb25lIHRoZW0KCQkJCQl0YXJnZXRbIG5hbWUgXSA9IGpRdWVyeS5leHRlbmQoIGRlZXAsIGNsb25lLCBjb3B5ICk7CgoJCQkJLy8gRG9uJ3QgYnJpbmcgaW4gdW5kZWZpbmVkIHZhbHVlcwoJCQkJfSBlbHNlIGlmICggY29weSAhPT0gdW5kZWZpbmVkICkgewoJCQkJCXRhcmdldFsgbmFtZSBdID0gY29weTsKCQkJCX0KCQkJfQoJCX0KCX0KCgkvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdAoJcmV0dXJuIHRhcmdldDsKfTsKCmpRdWVyeS5leHRlbmQoewoJbm9Db25mbGljdDogZnVuY3Rpb24oIGRlZXAgKSB7CgkJaWYgKCB3aW5kb3cuJCA9PT0galF1ZXJ5ICkgewoJCQl3aW5kb3cuJCA9IF8kOwoJCX0KCgkJaWYgKCBkZWVwICYmIHdpbmRvdy5qUXVlcnkgPT09IGpRdWVyeSApIHsKCQkJd2luZG93LmpRdWVyeSA9IF9qUXVlcnk7CgkJfQoKCQlyZXR1cm4galF1ZXJ5OwoJfSwKCgkvLyBJcyB0aGUgRE9NIHJlYWR5IHRvIGJlIHVzZWQ/IFNldCB0byB0cnVlIG9uY2UgaXQgb2NjdXJzLgoJaXNSZWFkeTogZmFsc2UsCgoJLy8gQSBjb3VudGVyIHRvIHRyYWNrIGhvdyBtYW55IGl0ZW1zIHRvIHdhaXQgZm9yIGJlZm9yZQoJLy8gdGhlIHJlYWR5IGV2ZW50IGZpcmVzLiBTZWUgIzY3ODEKCXJlYWR5V2FpdDogMSwKCgkvLyBIb2xkIChvciByZWxlYXNlKSB0aGUgcmVhZHkgZXZlbnQKCWhvbGRSZWFkeTogZnVuY3Rpb24oIGhvbGQgKSB7CgkJaWYgKCBob2xkICkgewoJCQlqUXVlcnkucmVhZHlXYWl0Kys7CgkJfSBlbHNlIHsKCQkJalF1ZXJ5LnJlYWR5KCB0cnVlICk7CgkJfQoJfSwKCgkvLyBIYW5kbGUgd2hlbiB0aGUgRE9NIGlzIHJlYWR5CglyZWFkeTogZnVuY3Rpb24oIHdhaXQgKSB7CgoJCS8vIEFib3J0IGlmIHRoZXJlIGFyZSBwZW5kaW5nIGhvbGRzIG9yIHdlJ3JlIGFscmVhZHkgcmVhZHkKCQlpZiAoIHdhaXQgPT09IHRydWUgPyAtLWpRdWVyeS5yZWFkeVdhaXQgOiBqUXVlcnkuaXNSZWFkeSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gTWFrZSBzdXJlIGJvZHkgZXhpc3RzLCBhdCBsZWFzdCwgaW4gY2FzZSBJRSBnZXRzIGEgbGl0dGxlIG92ZXJ6ZWFsb3VzICh0aWNrZXQgIzU0NDMpLgoJCWlmICggIWRvY3VtZW50LmJvZHkgKSB7CgkJCXJldHVybiBzZXRUaW1lb3V0KCBqUXVlcnkucmVhZHksIDEgKTsKCQl9CgoJCS8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeQoJCWpRdWVyeS5pc1JlYWR5ID0gdHJ1ZTsKCgkJLy8gSWYgYSBub3JtYWwgRE9NIFJlYWR5IGV2ZW50IGZpcmVkLCBkZWNyZW1lbnQsIGFuZCB3YWl0IGlmIG5lZWQgYmUKCQlpZiAoIHdhaXQgIT09IHRydWUgJiYgLS1qUXVlcnkucmVhZHlXYWl0ID4gMCApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwgdG8gZXhlY3V0ZQoJCXJlYWR5TGlzdC5yZXNvbHZlV2l0aCggZG9jdW1lbnQsIFsgalF1ZXJ5IF0gKTsKCgkJLy8gVHJpZ2dlciBhbnkgYm91bmQgcmVhZHkgZXZlbnRzCgkJaWYgKCBqUXVlcnkuZm4udHJpZ2dlciApIHsKCQkJalF1ZXJ5KCBkb2N1bWVudCApLnRyaWdnZXIoInJlYWR5Iikub2ZmKCJyZWFkeSIpOwoJCX0KCX0sCgoJLy8gU2VlIHRlc3QvdW5pdC9jb3JlLmpzIGZvciBkZXRhaWxzIGNvbmNlcm5pbmcgaXNGdW5jdGlvbi4KCS8vIFNpbmNlIHZlcnNpb24gMS4zLCBET00gbWV0aG9kcyBhbmQgZnVuY3Rpb25zIGxpa2UgYWxlcnQKCS8vIGFyZW4ndCBzdXBwb3J0ZWQuIFRoZXkgcmV0dXJuIGZhbHNlIG9uIElFICgjMjk2OCkuCglpc0Z1bmN0aW9uOiBmdW5jdGlvbiggb2JqICkgewoJCXJldHVybiBqUXVlcnkudHlwZShvYmopID09PSAiZnVuY3Rpb24iOwoJfSwKCglpc0FycmF5OiBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uKCBvYmogKSB7CgkJcmV0dXJuIGpRdWVyeS50eXBlKG9iaikgPT09ICJhcnJheSI7Cgl9LAoKCWlzV2luZG93OiBmdW5jdGlvbiggb2JqICkgewoJCXJldHVybiBvYmogIT0gbnVsbCAmJiBvYmogPT0gb2JqLndpbmRvdzsKCX0sCgoJaXNOdW1lcmljOiBmdW5jdGlvbiggb2JqICkgewoJCXJldHVybiAhaXNOYU4oIHBhcnNlRmxvYXQob2JqKSApICYmIGlzRmluaXRlKCBvYmogKTsKCX0sCgoJdHlwZTogZnVuY3Rpb24oIG9iaiApIHsKCQlyZXR1cm4gb2JqID09IG51bGwgPwoJCQlTdHJpbmcoIG9iaiApIDoKCQkJY2xhc3MydHlwZVsgY29yZV90b1N0cmluZy5jYWxsKG9iaikgXSB8fCAib2JqZWN0IjsKCX0sCgoJaXNQbGFpbk9iamVjdDogZnVuY3Rpb24oIG9iaiApIHsKCQkvLyBNdXN0IGJlIGFuIE9iamVjdC4KCQkvLyBCZWNhdXNlIG9mIElFLCB3ZSBhbHNvIGhhdmUgdG8gY2hlY2sgdGhlIHByZXNlbmNlIG9mIHRoZSBjb25zdHJ1Y3RvciBwcm9wZXJ0eS4KCQkvLyBNYWtlIHN1cmUgdGhhdCBET00gbm9kZXMgYW5kIHdpbmRvdyBvYmplY3RzIGRvbid0IHBhc3MgdGhyb3VnaCwgYXMgd2VsbAoJCWlmICggIW9iaiB8fCBqUXVlcnkudHlwZShvYmopICE9PSAib2JqZWN0IiB8fCBvYmoubm9kZVR5cGUgfHwgalF1ZXJ5LmlzV2luZG93KCBvYmogKSApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJdHJ5IHsKCQkJLy8gTm90IG93biBjb25zdHJ1Y3RvciBwcm9wZXJ0eSBtdXN0IGJlIE9iamVjdAoJCQlpZiAoIG9iai5jb25zdHJ1Y3RvciAmJgoJCQkJIWNvcmVfaGFzT3duLmNhbGwob2JqLCAiY29uc3RydWN0b3IiKSAmJgoJCQkJIWNvcmVfaGFzT3duLmNhbGwob2JqLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwgImlzUHJvdG90eXBlT2YiKSApIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0gY2F0Y2ggKCBlICkgewoJCQkvLyBJRTgsOSBXaWxsIHRocm93IGV4Y2VwdGlvbnMgb24gY2VydGFpbiBob3N0IG9iamVjdHMgIzk4OTcKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJLy8gT3duIHByb3BlcnRpZXMgYXJlIGVudW1lcmF0ZWQgZmlyc3RseSwgc28gdG8gc3BlZWQgdXAsCgkJLy8gaWYgbGFzdCBvbmUgaXMgb3duLCB0aGVuIGFsbCBwcm9wZXJ0aWVzIGFyZSBvd24uCgoJCXZhciBrZXk7CgkJZm9yICgga2V5IGluIG9iaiApIHt9CgoJCXJldHVybiBrZXkgPT09IHVuZGVmaW5lZCB8fCBjb3JlX2hhc093bi5jYWxsKCBvYmosIGtleSApOwoJfSwKCglpc0VtcHR5T2JqZWN0OiBmdW5jdGlvbiggb2JqICkgewoJCXZhciBuYW1lOwoJCWZvciAoIG5hbWUgaW4gb2JqICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCXJldHVybiB0cnVlOwoJfSwKCgllcnJvcjogZnVuY3Rpb24oIG1zZyApIHsKCQl0aHJvdyBuZXcgRXJyb3IoIG1zZyApOwoJfSwKCgkvLyBkYXRhOiBzdHJpbmcgb2YgaHRtbAoJLy8gY29udGV4dCAob3B0aW9uYWwpOiBJZiBzcGVjaWZpZWQsIHRoZSBmcmFnbWVudCB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhpcyBjb250ZXh0LCBkZWZhdWx0cyB0byBkb2N1bWVudAoJLy8gc2NyaXB0cyAob3B0aW9uYWwpOiBJZiB0cnVlLCB3aWxsIGluY2x1ZGUgc2NyaXB0cyBwYXNzZWQgaW4gdGhlIGh0bWwgc3RyaW5nCglwYXJzZUhUTUw6IGZ1bmN0aW9uKCBkYXRhLCBjb250ZXh0LCBzY3JpcHRzICkgewoJCXZhciBwYXJzZWQ7CgkJaWYgKCAhZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gInN0cmluZyIgKSB7CgkJCXJldHVybiBudWxsOwoJCX0KCQlpZiAoIHR5cGVvZiBjb250ZXh0ID09PSAiYm9vbGVhbiIgKSB7CgkJCXNjcmlwdHMgPSBjb250ZXh0OwoJCQljb250ZXh0ID0gMDsKCQl9CgkJY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7CgoJCS8vIFNpbmdsZSB0YWcKCQlpZiAoIChwYXJzZWQgPSByc2luZ2xlVGFnLmV4ZWMoIGRhdGEgKSkgKSB7CgkJCXJldHVybiBbIGNvbnRleHQuY3JlYXRlRWxlbWVudCggcGFyc2VkWzFdICkgXTsKCQl9CgoJCXBhcnNlZCA9IGpRdWVyeS5idWlsZEZyYWdtZW50KCBbIGRhdGEgXSwgY29udGV4dCwgc2NyaXB0cyA/IG51bGwgOiBbXSApOwoJCXJldHVybiBqUXVlcnkubWVyZ2UoIFtdLAoJCQkocGFyc2VkLmNhY2hlYWJsZSA/IGpRdWVyeS5jbG9uZSggcGFyc2VkLmZyYWdtZW50ICkgOiBwYXJzZWQuZnJhZ21lbnQpLmNoaWxkTm9kZXMgKTsKCX0sCgoJcGFyc2VKU09OOiBmdW5jdGlvbiggZGF0YSApIHsKCQlpZiAoICFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSAic3RyaW5nIikgewoJCQlyZXR1cm4gbnVsbDsKCQl9CgoJCS8vIE1ha2Ugc3VyZSBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2UgaXMgcmVtb3ZlZCAoSUUgY2FuJ3QgaGFuZGxlIGl0KQoJCWRhdGEgPSBqUXVlcnkudHJpbSggZGF0YSApOwoKCQkvLyBBdHRlbXB0IHRvIHBhcnNlIHVzaW5nIHRoZSBuYXRpdmUgSlNPTiBwYXJzZXIgZmlyc3QKCQlpZiAoIHdpbmRvdy5KU09OICYmIHdpbmRvdy5KU09OLnBhcnNlICkgewoJCQlyZXR1cm4gd2luZG93LkpTT04ucGFyc2UoIGRhdGEgKTsKCQl9CgoJCS8vIE1ha2Ugc3VyZSB0aGUgaW5jb21pbmcgZGF0YSBpcyBhY3R1YWwgSlNPTgoJCS8vIExvZ2ljIGJvcnJvd2VkIGZyb20gaHR0cDovL2pzb24ub3JnL2pzb24yLmpzCgkJaWYgKCBydmFsaWRjaGFycy50ZXN0KCBkYXRhLnJlcGxhY2UoIHJ2YWxpZGVzY2FwZSwgIkAiICkKCQkJLnJlcGxhY2UoIHJ2YWxpZHRva2VucywgIl0iICkKCQkJLnJlcGxhY2UoIHJ2YWxpZGJyYWNlcywgIiIpKSApIHsKCgkJCXJldHVybiAoIG5ldyBGdW5jdGlvbiggInJldHVybiAiICsgZGF0YSApICkoKTsKCgkJfQoJCWpRdWVyeS5lcnJvciggIkludmFsaWQgSlNPTjogIiArIGRhdGEgKTsKCX0sCgoJLy8gQ3Jvc3MtYnJvd3NlciB4bWwgcGFyc2luZwoJcGFyc2VYTUw6IGZ1bmN0aW9uKCBkYXRhICkgewoJCXZhciB4bWwsIHRtcDsKCQlpZiAoICFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSAic3RyaW5nIiApIHsKCQkJcmV0dXJuIG51bGw7CgkJfQoJCXRyeSB7CgkJCWlmICggd2luZG93LkRPTVBhcnNlciApIHsgLy8gU3RhbmRhcmQKCQkJCXRtcCA9IG5ldyBET01QYXJzZXIoKTsKCQkJCXhtbCA9IHRtcC5wYXJzZUZyb21TdHJpbmcoIGRhdGEgLCAidGV4dC94bWwiICk7CgkJCX0gZWxzZSB7IC8vIElFCgkJCQl4bWwgPSBuZXcgQWN0aXZlWE9iamVjdCggIk1pY3Jvc29mdC5YTUxET00iICk7CgkJCQl4bWwuYXN5bmMgPSAiZmFsc2UiOwoJCQkJeG1sLmxvYWRYTUwoIGRhdGEgKTsKCQkJfQoJCX0gY2F0Y2goIGUgKSB7CgkJCXhtbCA9IHVuZGVmaW5lZDsKCQl9CgkJaWYgKCAheG1sIHx8ICF4bWwuZG9jdW1lbnRFbGVtZW50IHx8IHhtbC5nZXRFbGVtZW50c0J5VGFnTmFtZSggInBhcnNlcmVycm9yIiApLmxlbmd0aCApIHsKCQkJalF1ZXJ5LmVycm9yKCAiSW52YWxpZCBYTUw6ICIgKyBkYXRhICk7CgkJfQoJCXJldHVybiB4bWw7Cgl9LAoKCW5vb3A6IGZ1bmN0aW9uKCkge30sCgoJLy8gRXZhbHVhdGVzIGEgc2NyaXB0IGluIGEgZ2xvYmFsIGNvbnRleHQKCS8vIFdvcmthcm91bmRzIGJhc2VkIG9uIGZpbmRpbmdzIGJ5IEppbSBEcmlzY29sbAoJLy8gaHR0cDovL3dlYmxvZ3MuamF2YS5uZXQvYmxvZy9kcmlzY29sbC9hcmNoaXZlLzIwMDkvMDkvMDgvZXZhbC1qYXZhc2NyaXB0LWdsb2JhbC1jb250ZXh0CglnbG9iYWxFdmFsOiBmdW5jdGlvbiggZGF0YSApIHsKCQlpZiAoIGRhdGEgJiYgY29yZV9ybm90d2hpdGUudGVzdCggZGF0YSApICkgewoJCQkvLyBXZSB1c2UgZXhlY1NjcmlwdCBvbiBJbnRlcm5ldCBFeHBsb3JlcgoJCQkvLyBXZSB1c2UgYW4gYW5vbnltb3VzIGZ1bmN0aW9uIHNvIHRoYXQgY29udGV4dCBpcyB3aW5kb3cKCQkJLy8gcmF0aGVyIHRoYW4galF1ZXJ5IGluIEZpcmVmb3gKCQkJKCB3aW5kb3cuZXhlY1NjcmlwdCB8fCBmdW5jdGlvbiggZGF0YSApIHsKCQkJCXdpbmRvd1sgImV2YWwiIF0uY2FsbCggd2luZG93LCBkYXRhICk7CgkJCX0gKSggZGF0YSApOwoJCX0KCX0sCgoJLy8gQ29udmVydCBkYXNoZWQgdG8gY2FtZWxDYXNlOyB1c2VkIGJ5IHRoZSBjc3MgYW5kIGRhdGEgbW9kdWxlcwoJLy8gTWljcm9zb2Z0IGZvcmdvdCB0byBodW1wIHRoZWlyIHZlbmRvciBwcmVmaXggKCM5NTcyKQoJY2FtZWxDYXNlOiBmdW5jdGlvbiggc3RyaW5nICkgewoJCXJldHVybiBzdHJpbmcucmVwbGFjZSggcm1zUHJlZml4LCAibXMtIiApLnJlcGxhY2UoIHJkYXNoQWxwaGEsIGZjYW1lbENhc2UgKTsKCX0sCgoJbm9kZU5hbWU6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewoJCXJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpOwoJfSwKCgkvLyBhcmdzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5CgllYWNoOiBmdW5jdGlvbiggb2JqLCBjYWxsYmFjaywgYXJncyApIHsKCQl2YXIgbmFtZSwKCQkJaSA9IDAsCgkJCWxlbmd0aCA9IG9iai5sZW5ndGgsCgkJCWlzT2JqID0gbGVuZ3RoID09PSB1bmRlZmluZWQgfHwgalF1ZXJ5LmlzRnVuY3Rpb24oIG9iaiApOwoKCQlpZiAoIGFyZ3MgKSB7CgkJCWlmICggaXNPYmogKSB7CgkJCQlmb3IgKCBuYW1lIGluIG9iaiApIHsKCQkJCQlpZiAoIGNhbGxiYWNrLmFwcGx5KCBvYmpbIG5hbWUgXSwgYXJncyApID09PSBmYWxzZSApIHsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQl9IGVsc2UgewoJCQkJZm9yICggOyBpIDwgbGVuZ3RoOyApIHsKCQkJCQlpZiAoIGNhbGxiYWNrLmFwcGx5KCBvYmpbIGkrKyBdLCBhcmdzICkgPT09IGZhbHNlICkgewoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJLy8gQSBzcGVjaWFsLCBmYXN0LCBjYXNlIGZvciB0aGUgbW9zdCBjb21tb24gdXNlIG9mIGVhY2gKCQl9IGVsc2UgewoJCQlpZiAoIGlzT2JqICkgewoJCQkJZm9yICggbmFtZSBpbiBvYmogKSB7CgkJCQkJaWYgKCBjYWxsYmFjay5jYWxsKCBvYmpbIG5hbWUgXSwgbmFtZSwgb2JqWyBuYW1lIF0gKSA9PT0gZmFsc2UgKSB7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJfSBlbHNlIHsKCQkJCWZvciAoIDsgaSA8IGxlbmd0aDsgKSB7CgkJCQkJaWYgKCBjYWxsYmFjay5jYWxsKCBvYmpbIGkgXSwgaSwgb2JqWyBpKysgXSApID09PSBmYWxzZSApIHsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gb2JqOwoJfSwKCgkvLyBVc2UgbmF0aXZlIFN0cmluZy50cmltIGZ1bmN0aW9uIHdoZXJldmVyIHBvc3NpYmxlCgl0cmltOiBjb3JlX3RyaW0gJiYgIWNvcmVfdHJpbS5jYWxsKCJcdUZFRkZceEEwIikgPwoJCWZ1bmN0aW9uKCB0ZXh0ICkgewoJCQlyZXR1cm4gdGV4dCA9PSBudWxsID8KCQkJCSIiIDoKCQkJCWNvcmVfdHJpbS5jYWxsKCB0ZXh0ICk7CgkJfSA6CgoJCS8vIE90aGVyd2lzZSB1c2Ugb3VyIG93biB0cmltbWluZyBmdW5jdGlvbmFsaXR5CgkJZnVuY3Rpb24oIHRleHQgKSB7CgkJCXJldHVybiB0ZXh0ID09IG51bGwgPwoJCQkJIiIgOgoJCQkJKCB0ZXh0ICsgIiIgKS5yZXBsYWNlKCBydHJpbSwgIiIgKTsKCQl9LAoKCS8vIHJlc3VsdHMgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHkKCW1ha2VBcnJheTogZnVuY3Rpb24oIGFyciwgcmVzdWx0cyApIHsKCQl2YXIgdHlwZSwKCQkJcmV0ID0gcmVzdWx0cyB8fCBbXTsKCgkJaWYgKCBhcnIgIT0gbnVsbCApIHsKCQkJLy8gVGhlIHdpbmRvdywgc3RyaW5ncyAoYW5kIGZ1bmN0aW9ucykgYWxzbyBoYXZlICdsZW5ndGgnCgkJCS8vIFR3ZWFrZWQgbG9naWMgc2xpZ2h0bHkgdG8gaGFuZGxlIEJsYWNrYmVycnkgNC43IFJlZ0V4cCBpc3N1ZXMgIzY5MzAKCQkJdHlwZSA9IGpRdWVyeS50eXBlKCBhcnIgKTsKCgkJCWlmICggYXJyLmxlbmd0aCA9PSBudWxsIHx8IHR5cGUgPT09ICJzdHJpbmciIHx8IHR5cGUgPT09ICJmdW5jdGlvbiIgfHwgdHlwZSA9PT0gInJlZ2V4cCIgfHwgalF1ZXJ5LmlzV2luZG93KCBhcnIgKSApIHsKCQkJCWNvcmVfcHVzaC5jYWxsKCByZXQsIGFyciApOwoJCQl9IGVsc2UgewoJCQkJalF1ZXJ5Lm1lcmdlKCByZXQsIGFyciApOwoJCQl9CgkJfQoKCQlyZXR1cm4gcmV0OwoJfSwKCglpbkFycmF5OiBmdW5jdGlvbiggZWxlbSwgYXJyLCBpICkgewoJCXZhciBsZW47CgoJCWlmICggYXJyICkgewoJCQlpZiAoIGNvcmVfaW5kZXhPZiApIHsKCQkJCXJldHVybiBjb3JlX2luZGV4T2YuY2FsbCggYXJyLCBlbGVtLCBpICk7CgkJCX0KCgkJCWxlbiA9IGFyci5sZW5ndGg7CgkJCWkgPSBpID8gaSA8IDAgPyBNYXRoLm1heCggMCwgbGVuICsgaSApIDogaSA6IDA7CgoJCQlmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKCQkJCS8vIFNraXAgYWNjZXNzaW5nIGluIHNwYXJzZSBhcnJheXMKCQkJCWlmICggaSBpbiBhcnIgJiYgYXJyWyBpIF0gPT09IGVsZW0gKSB7CgkJCQkJcmV0dXJuIGk7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiAtMTsKCX0sCgoJbWVyZ2U6IGZ1bmN0aW9uKCBmaXJzdCwgc2Vjb25kICkgewoJCXZhciBsID0gc2Vjb25kLmxlbmd0aCwKCQkJaSA9IGZpcnN0Lmxlbmd0aCwKCQkJaiA9IDA7CgoJCWlmICggdHlwZW9mIGwgPT09ICJudW1iZXIiICkgewoJCQlmb3IgKCA7IGogPCBsOyBqKysgKSB7CgkJCQlmaXJzdFsgaSsrIF0gPSBzZWNvbmRbIGogXTsKCQkJfQoKCQl9IGVsc2UgewoJCQl3aGlsZSAoIHNlY29uZFtqXSAhPT0gdW5kZWZpbmVkICkgewoJCQkJZmlyc3RbIGkrKyBdID0gc2Vjb25kWyBqKysgXTsKCQkJfQoJCX0KCgkJZmlyc3QubGVuZ3RoID0gaTsKCgkJcmV0dXJuIGZpcnN0OwoJfSwKCglncmVwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBpbnYgKSB7CgkJdmFyIHJldFZhbCwKCQkJcmV0ID0gW10sCgkJCWkgPSAwLAoJCQlsZW5ndGggPSBlbGVtcy5sZW5ndGg7CgkJaW52ID0gISFpbnY7CgoJCS8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCBvbmx5IHNhdmluZyB0aGUgaXRlbXMKCQkvLyB0aGF0IHBhc3MgdGhlIHZhbGlkYXRvciBmdW5jdGlvbgoJCWZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkgewoJCQlyZXRWYWwgPSAhIWNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICk7CgkJCWlmICggaW52ICE9PSByZXRWYWwgKSB7CgkJCQlyZXQucHVzaCggZWxlbXNbIGkgXSApOwoJCQl9CgkJfQoKCQlyZXR1cm4gcmV0OwoJfSwKCgkvLyBhcmcgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHkKCW1hcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgYXJnICkgewoJCXZhciB2YWx1ZSwga2V5LAoJCQlyZXQgPSBbXSwKCQkJaSA9IDAsCgkJCWxlbmd0aCA9IGVsZW1zLmxlbmd0aCwKCQkJLy8ganF1ZXJ5IG9iamVjdHMgYXJlIHRyZWF0ZWQgYXMgYXJyYXlzCgkJCWlzQXJyYXkgPSBlbGVtcyBpbnN0YW5jZW9mIGpRdWVyeSB8fCBsZW5ndGggIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgbGVuZ3RoID09PSAibnVtYmVyIiAmJiAoICggbGVuZ3RoID4gMCAmJiBlbGVtc1sgMCBdICYmIGVsZW1zWyBsZW5ndGggLTEgXSApIHx8IGxlbmd0aCA9PT0gMCB8fCBqUXVlcnkuaXNBcnJheSggZWxlbXMgKSApIDsKCgkJLy8gR28gdGhyb3VnaCB0aGUgYXJyYXksIHRyYW5zbGF0aW5nIGVhY2ggb2YgdGhlIGl0ZW1zIHRvIHRoZWlyCgkJaWYgKCBpc0FycmF5ICkgewoJCQlmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKCQkJCXZhbHVlID0gY2FsbGJhY2soIGVsZW1zWyBpIF0sIGksIGFyZyApOwoKCQkJCWlmICggdmFsdWUgIT0gbnVsbCApIHsKCQkJCQlyZXRbIHJldC5sZW5ndGggXSA9IHZhbHVlOwoJCQkJfQoJCQl9CgoJCS8vIEdvIHRocm91Z2ggZXZlcnkga2V5IG9uIHRoZSBvYmplY3QsCgkJfSBlbHNlIHsKCQkJZm9yICgga2V5IGluIGVsZW1zICkgewoJCQkJdmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGtleSBdLCBrZXksIGFyZyApOwoKCQkJCWlmICggdmFsdWUgIT0gbnVsbCApIHsKCQkJCQlyZXRbIHJldC5sZW5ndGggXSA9IHZhbHVlOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBGbGF0dGVuIGFueSBuZXN0ZWQgYXJyYXlzCgkJcmV0dXJuIHJldC5jb25jYXQuYXBwbHkoIFtdLCByZXQgKTsKCX0sCgoJLy8gQSBnbG9iYWwgR1VJRCBjb3VudGVyIGZvciBvYmplY3RzCglndWlkOiAxLAoKCS8vIEJpbmQgYSBmdW5jdGlvbiB0byBhIGNvbnRleHQsIG9wdGlvbmFsbHkgcGFydGlhbGx5IGFwcGx5aW5nIGFueQoJLy8gYXJndW1lbnRzLgoJcHJveHk6IGZ1bmN0aW9uKCBmbiwgY29udGV4dCApIHsKCQl2YXIgdG1wLCBhcmdzLCBwcm94eTsKCgkJaWYgKCB0eXBlb2YgY29udGV4dCA9PT0gInN0cmluZyIgKSB7CgkJCXRtcCA9IGZuWyBjb250ZXh0IF07CgkJCWNvbnRleHQgPSBmbjsKCQkJZm4gPSB0bXA7CgkJfQoKCQkvLyBRdWljayBjaGVjayB0byBkZXRlcm1pbmUgaWYgdGFyZ2V0IGlzIGNhbGxhYmxlLCBpbiB0aGUgc3BlYwoJCS8vIHRoaXMgdGhyb3dzIGEgVHlwZUVycm9yLCBidXQgd2Ugd2lsbCBqdXN0IHJldHVybiB1bmRlZmluZWQuCgkJaWYgKCAhalF1ZXJ5LmlzRnVuY3Rpb24oIGZuICkgKSB7CgkJCXJldHVybiB1bmRlZmluZWQ7CgkJfQoKCQkvLyBTaW11bGF0ZWQgYmluZAoJCWFyZ3MgPSBjb3JlX3NsaWNlLmNhbGwoIGFyZ3VtZW50cywgMiApOwoJCXByb3h5ID0gZnVuY3Rpb24oKSB7CgkJCXJldHVybiBmbi5hcHBseSggY29udGV4dCwgYXJncy5jb25jYXQoIGNvcmVfc2xpY2UuY2FsbCggYXJndW1lbnRzICkgKSApOwoJCX07CgoJCS8vIFNldCB0aGUgZ3VpZCBvZiB1bmlxdWUgaGFuZGxlciB0byB0aGUgc2FtZSBvZiBvcmlnaW5hbCBoYW5kbGVyLCBzbyBpdCBjYW4gYmUgcmVtb3ZlZAoJCXByb3h5Lmd1aWQgPSBmbi5ndWlkID0gZm4uZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrOwoKCQlyZXR1cm4gcHJveHk7Cgl9LAoKCS8vIE11bHRpZnVuY3Rpb25hbCBtZXRob2QgdG8gZ2V0IGFuZCBzZXQgdmFsdWVzIG9mIGEgY29sbGVjdGlvbgoJLy8gVGhlIHZhbHVlL3MgY2FuIG9wdGlvbmFsbHkgYmUgZXhlY3V0ZWQgaWYgaXQncyBhIGZ1bmN0aW9uCglhY2Nlc3M6IGZ1bmN0aW9uKCBlbGVtcywgZm4sIGtleSwgdmFsdWUsIGNoYWluYWJsZSwgZW1wdHlHZXQsIHBhc3MgKSB7CgkJdmFyIGV4ZWMsCgkJCWJ1bGsgPSBrZXkgPT0gbnVsbCwKCQkJaSA9IDAsCgkJCWxlbmd0aCA9IGVsZW1zLmxlbmd0aDsKCgkJLy8gU2V0cyBtYW55IHZhbHVlcwoJCWlmICgga2V5ICYmIHR5cGVvZiBrZXkgPT09ICJvYmplY3QiICkgewoJCQlmb3IgKCBpIGluIGtleSApIHsKCQkJCWpRdWVyeS5hY2Nlc3MoIGVsZW1zLCBmbiwgaSwga2V5W2ldLCAxLCBlbXB0eUdldCwgdmFsdWUgKTsKCQkJfQoJCQljaGFpbmFibGUgPSAxOwoKCQkvLyBTZXRzIG9uZSB2YWx1ZQoJCX0gZWxzZSBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJCS8vIE9wdGlvbmFsbHksIGZ1bmN0aW9uIHZhbHVlcyBnZXQgZXhlY3V0ZWQgaWYgZXhlYyBpcyB0cnVlCgkJCWV4ZWMgPSBwYXNzID09PSB1bmRlZmluZWQgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICk7CgoJCQlpZiAoIGJ1bGsgKSB7CgkJCQkvLyBCdWxrIG9wZXJhdGlvbnMgb25seSBpdGVyYXRlIHdoZW4gZXhlY3V0aW5nIGZ1bmN0aW9uIHZhbHVlcwoJCQkJaWYgKCBleGVjICkgewoJCQkJCWV4ZWMgPSBmbjsKCQkJCQlmbiA9IGZ1bmN0aW9uKCBlbGVtLCBrZXksIHZhbHVlICkgewoJCQkJCQlyZXR1cm4gZXhlYy5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdmFsdWUgKTsKCQkJCQl9OwoKCQkJCS8vIE90aGVyd2lzZSB0aGV5IHJ1biBhZ2FpbnN0IHRoZSBlbnRpcmUgc2V0CgkJCQl9IGVsc2UgewoJCQkJCWZuLmNhbGwoIGVsZW1zLCB2YWx1ZSApOwoJCQkJCWZuID0gbnVsbDsKCQkJCX0KCQkJfQoKCQkJaWYgKCBmbiApIHsKCQkJCWZvciAoOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCQkJZm4oIGVsZW1zW2ldLCBrZXksIGV4ZWMgPyB2YWx1ZS5jYWxsKCBlbGVtc1tpXSwgaSwgZm4oIGVsZW1zW2ldLCBrZXkgKSApIDogdmFsdWUsIHBhc3MgKTsKCQkJCX0KCQkJfQoKCQkJY2hhaW5hYmxlID0gMTsKCQl9CgoJCXJldHVybiBjaGFpbmFibGUgPwoJCQllbGVtcyA6CgoJCQkvLyBHZXRzCgkJCWJ1bGsgPwoJCQkJZm4uY2FsbCggZWxlbXMgKSA6CgkJCQlsZW5ndGggPyBmbiggZWxlbXNbMF0sIGtleSApIDogZW1wdHlHZXQ7Cgl9LAoKCW5vdzogZnVuY3Rpb24oKSB7CgkJcmV0dXJuICggbmV3IERhdGUoKSApLmdldFRpbWUoKTsKCX0KfSk7CgpqUXVlcnkucmVhZHkucHJvbWlzZSA9IGZ1bmN0aW9uKCBvYmogKSB7CglpZiAoICFyZWFkeUxpc3QgKSB7CgoJCXJlYWR5TGlzdCA9IGpRdWVyeS5EZWZlcnJlZCgpOwoKCQkvLyBDYXRjaCBjYXNlcyB3aGVyZSAkKGRvY3VtZW50KS5yZWFkeSgpIGlzIGNhbGxlZCBhZnRlciB0aGUgYnJvd3NlciBldmVudCBoYXMgYWxyZWFkeSBvY2N1cnJlZC4KCQkvLyB3ZSBvbmNlIHRyaWVkIHRvIHVzZSByZWFkeVN0YXRlICJpbnRlcmFjdGl2ZSIgaGVyZSwgYnV0IGl0IGNhdXNlZCBpc3N1ZXMgbGlrZSB0aGUgb25lCgkJLy8gZGlzY292ZXJlZCBieSBDaHJpc1MgaGVyZTogaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTIyODIjY29tbWVudDoxNQoJCWlmICggZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIiApIHsKCQkJLy8gSGFuZGxlIGl0IGFzeW5jaHJvbm91c2x5IHRvIGFsbG93IHNjcmlwdHMgdGhlIG9wcG9ydHVuaXR5IHRvIGRlbGF5IHJlYWR5CgkJCXNldFRpbWVvdXQoIGpRdWVyeS5yZWFkeSwgMSApOwoKCQkvLyBTdGFuZGFyZHMtYmFzZWQgYnJvd3NlcnMgc3VwcG9ydCBET01Db250ZW50TG9hZGVkCgkJfSBlbHNlIGlmICggZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciApIHsKCQkJLy8gVXNlIHRoZSBoYW5keSBldmVudCBjYWxsYmFjawoJCQlkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAiRE9NQ29udGVudExvYWRlZCIsIERPTUNvbnRlbnRMb2FkZWQsIGZhbHNlICk7CgoJCQkvLyBBIGZhbGxiYWNrIHRvIHdpbmRvdy5vbmxvYWQsIHRoYXQgd2lsbCBhbHdheXMgd29yawoJCQl3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggImxvYWQiLCBqUXVlcnkucmVhZHksIGZhbHNlICk7CgoJCS8vIElmIElFIGV2ZW50IG1vZGVsIGlzIHVzZWQKCQl9IGVsc2UgewoJCQkvLyBFbnN1cmUgZmlyaW5nIGJlZm9yZSBvbmxvYWQsIG1heWJlIGxhdGUgYnV0IHNhZmUgYWxzbyBmb3IgaWZyYW1lcwoJCQlkb2N1bWVudC5hdHRhY2hFdmVudCggIm9ucmVhZHlzdGF0ZWNoYW5nZSIsIERPTUNvbnRlbnRMb2FkZWQgKTsKCgkJCS8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrCgkJCXdpbmRvdy5hdHRhY2hFdmVudCggIm9ubG9hZCIsIGpRdWVyeS5yZWFkeSApOwoKCQkJLy8gSWYgSUUgYW5kIG5vdCBhIGZyYW1lCgkJCS8vIGNvbnRpbnVhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGUgZG9jdW1lbnQgaXMgcmVhZHkKCQkJdmFyIHRvcCA9IGZhbHNlOwoKCQkJdHJ5IHsKCQkJCXRvcCA9IHdpbmRvdy5mcmFtZUVsZW1lbnQgPT0gbnVsbCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7CgkJCX0gY2F0Y2goZSkge30KCgkJCWlmICggdG9wICYmIHRvcC5kb1Njcm9sbCApIHsKCQkJCShmdW5jdGlvbiBkb1Njcm9sbENoZWNrKCkgewoJCQkJCWlmICggIWpRdWVyeS5pc1JlYWR5ICkgewoKCQkJCQkJdHJ5IHsKCQkJCQkJCS8vIFVzZSB0aGUgdHJpY2sgYnkgRGllZ28gUGVyaW5pCgkJCQkJCQkvLyBodHRwOi8vamF2YXNjcmlwdC5ud2JveC5jb20vSUVDb250ZW50TG9hZGVkLwoJCQkJCQkJdG9wLmRvU2Nyb2xsKCJsZWZ0Iik7CgkJCQkJCX0gY2F0Y2goZSkgewoJCQkJCQkJcmV0dXJuIHNldFRpbWVvdXQoIGRvU2Nyb2xsQ2hlY2ssIDUwICk7CgkJCQkJCX0KCgkJCQkJCS8vIGFuZCBleGVjdXRlIGFueSB3YWl0aW5nIGZ1bmN0aW9ucwoJCQkJCQlqUXVlcnkucmVhZHkoKTsKCQkJCQl9CgkJCQl9KSgpOwoJCQl9CgkJfQoJfQoJcmV0dXJuIHJlYWR5TGlzdC5wcm9taXNlKCBvYmogKTsKfTsKCi8vIFBvcHVsYXRlIHRoZSBjbGFzczJ0eXBlIG1hcApqUXVlcnkuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCIuc3BsaXQoIiAiKSwgZnVuY3Rpb24oaSwgbmFtZSkgewoJY2xhc3MydHlwZVsgIltvYmplY3QgIiArIG5hbWUgKyAiXSIgXSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKfSk7CgovLyBBbGwgalF1ZXJ5IG9iamVjdHMgc2hvdWxkIHBvaW50IGJhY2sgdG8gdGhlc2UKcm9vdGpRdWVyeSA9IGpRdWVyeShkb2N1bWVudCk7Ci8vIFN0cmluZyB0byBPYmplY3Qgb3B0aW9ucyBmb3JtYXQgY2FjaGUKdmFyIG9wdGlvbnNDYWNoZSA9IHt9OwoKLy8gQ29udmVydCBTdHJpbmctZm9ybWF0dGVkIG9wdGlvbnMgaW50byBPYmplY3QtZm9ybWF0dGVkIG9uZXMgYW5kIHN0b3JlIGluIGNhY2hlCmZ1bmN0aW9uIGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSB7Cgl2YXIgb2JqZWN0ID0gb3B0aW9uc0NhY2hlWyBvcHRpb25zIF0gPSB7fTsKCWpRdWVyeS5lYWNoKCBvcHRpb25zLnNwbGl0KCBjb3JlX3JzcGFjZSApLCBmdW5jdGlvbiggXywgZmxhZyApIHsKCQlvYmplY3RbIGZsYWcgXSA9IHRydWU7Cgl9KTsKCXJldHVybiBvYmplY3Q7Cn0KCi8qCiAqIENyZWF0ZSBhIGNhbGxiYWNrIGxpc3QgdXNpbmcgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgogKgogKglvcHRpb25zOiBhbiBvcHRpb25hbCBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBvcHRpb25zIHRoYXQgd2lsbCBjaGFuZ2UgaG93CiAqCQkJdGhlIGNhbGxiYWNrIGxpc3QgYmVoYXZlcyBvciBhIG1vcmUgdHJhZGl0aW9uYWwgb3B0aW9uIG9iamVjdAogKgogKiBCeSBkZWZhdWx0IGEgY2FsbGJhY2sgbGlzdCB3aWxsIGFjdCBsaWtlIGFuIGV2ZW50IGNhbGxiYWNrIGxpc3QgYW5kIGNhbiBiZQogKiAiZmlyZWQiIG11bHRpcGxlIHRpbWVzLgogKgogKiBQb3NzaWJsZSBvcHRpb25zOgogKgogKglvbmNlOgkJCXdpbGwgZW5zdXJlIHRoZSBjYWxsYmFjayBsaXN0IGNhbiBvbmx5IGJlIGZpcmVkIG9uY2UgKGxpa2UgYSBEZWZlcnJlZCkKICoKICoJbWVtb3J5OgkJCXdpbGwga2VlcCB0cmFjayBvZiBwcmV2aW91cyB2YWx1ZXMgYW5kIHdpbGwgY2FsbCBhbnkgY2FsbGJhY2sgYWRkZWQKICoJCQkJCWFmdGVyIHRoZSBsaXN0IGhhcyBiZWVuIGZpcmVkIHJpZ2h0IGF3YXkgd2l0aCB0aGUgbGF0ZXN0ICJtZW1vcml6ZWQiCiAqCQkJCQl2YWx1ZXMgKGxpa2UgYSBEZWZlcnJlZCkKICoKICoJdW5pcXVlOgkJCXdpbGwgZW5zdXJlIGEgY2FsbGJhY2sgY2FuIG9ubHkgYmUgYWRkZWQgb25jZSAobm8gZHVwbGljYXRlIGluIHRoZSBsaXN0KQogKgogKglzdG9wT25GYWxzZToJaW50ZXJydXB0IGNhbGxpbmdzIHdoZW4gYSBjYWxsYmFjayByZXR1cm5zIGZhbHNlCiAqCiAqLwpqUXVlcnkuQ2FsbGJhY2tzID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7CgoJLy8gQ29udmVydCBvcHRpb25zIGZyb20gU3RyaW5nLWZvcm1hdHRlZCB0byBPYmplY3QtZm9ybWF0dGVkIGlmIG5lZWRlZAoJLy8gKHdlIGNoZWNrIGluIGNhY2hlIGZpcnN0KQoJb3B0aW9ucyA9IHR5cGVvZiBvcHRpb25zID09PSAic3RyaW5nIiA/CgkJKCBvcHRpb25zQ2FjaGVbIG9wdGlvbnMgXSB8fCBjcmVhdGVPcHRpb25zKCBvcHRpb25zICkgKSA6CgkJalF1ZXJ5LmV4dGVuZCgge30sIG9wdGlvbnMgKTsKCgl2YXIgLy8gTGFzdCBmaXJlIHZhbHVlIChmb3Igbm9uLWZvcmdldHRhYmxlIGxpc3RzKQoJCW1lbW9yeSwKCQkvLyBGbGFnIHRvIGtub3cgaWYgbGlzdCB3YXMgYWxyZWFkeSBmaXJlZAoJCWZpcmVkLAoJCS8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IGlzIGN1cnJlbnRseSBmaXJpbmcKCQlmaXJpbmcsCgkJLy8gRmlyc3QgY2FsbGJhY2sgdG8gZmlyZSAodXNlZCBpbnRlcm5hbGx5IGJ5IGFkZCBhbmQgZmlyZVdpdGgpCgkJZmlyaW5nU3RhcnQsCgkJLy8gRW5kIG9mIHRoZSBsb29wIHdoZW4gZmlyaW5nCgkJZmlyaW5nTGVuZ3RoLAoJCS8vIEluZGV4IG9mIGN1cnJlbnRseSBmaXJpbmcgY2FsbGJhY2sgKG1vZGlmaWVkIGJ5IHJlbW92ZSBpZiBuZWVkZWQpCgkJZmlyaW5nSW5kZXgsCgkJLy8gQWN0dWFsIGNhbGxiYWNrIGxpc3QKCQlsaXN0ID0gW10sCgkJLy8gU3RhY2sgb2YgZmlyZSBjYWxscyBmb3IgcmVwZWF0YWJsZSBsaXN0cwoJCXN0YWNrID0gIW9wdGlvbnMub25jZSAmJiBbXSwKCQkvLyBGaXJlIGNhbGxiYWNrcwoJCWZpcmUgPSBmdW5jdGlvbiggZGF0YSApIHsKCQkJbWVtb3J5ID0gb3B0aW9ucy5tZW1vcnkgJiYgZGF0YTsKCQkJZmlyZWQgPSB0cnVlOwoJCQlmaXJpbmdJbmRleCA9IGZpcmluZ1N0YXJ0IHx8IDA7CgkJCWZpcmluZ1N0YXJ0ID0gMDsKCQkJZmlyaW5nTGVuZ3RoID0gbGlzdC5sZW5ndGg7CgkJCWZpcmluZyA9IHRydWU7CgkJCWZvciAoIDsgbGlzdCAmJiBmaXJpbmdJbmRleCA8IGZpcmluZ0xlbmd0aDsgZmlyaW5nSW5kZXgrKyApIHsKCQkJCWlmICggbGlzdFsgZmlyaW5nSW5kZXggXS5hcHBseSggZGF0YVsgMCBdLCBkYXRhWyAxIF0gKSA9PT0gZmFsc2UgJiYgb3B0aW9ucy5zdG9wT25GYWxzZSApIHsKCQkJCQltZW1vcnkgPSBmYWxzZTsgLy8gVG8gcHJldmVudCBmdXJ0aGVyIGNhbGxzIHVzaW5nIGFkZAoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJCWZpcmluZyA9IGZhbHNlOwoJCQlpZiAoIGxpc3QgKSB7CgkJCQlpZiAoIHN0YWNrICkgewoJCQkJCWlmICggc3RhY2subGVuZ3RoICkgewoJCQkJCQlmaXJlKCBzdGFjay5zaGlmdCgpICk7CgkJCQkJfQoJCQkJfSBlbHNlIGlmICggbWVtb3J5ICkgewoJCQkJCWxpc3QgPSBbXTsKCQkJCX0gZWxzZSB7CgkJCQkJc2VsZi5kaXNhYmxlKCk7CgkJCQl9CgkJCX0KCQl9LAoJCS8vIEFjdHVhbCBDYWxsYmFja3Mgb2JqZWN0CgkJc2VsZiA9IHsKCQkJLy8gQWRkIGEgY2FsbGJhY2sgb3IgYSBjb2xsZWN0aW9uIG9mIGNhbGxiYWNrcyB0byB0aGUgbGlzdAoJCQlhZGQ6IGZ1bmN0aW9uKCkgewoJCQkJaWYgKCBsaXN0ICkgewoJCQkJCS8vIEZpcnN0LCB3ZSBzYXZlIHRoZSBjdXJyZW50IGxlbmd0aAoJCQkJCXZhciBzdGFydCA9IGxpc3QubGVuZ3RoOwoJCQkJCShmdW5jdGlvbiBhZGQoIGFyZ3MgKSB7CgkJCQkJCWpRdWVyeS5lYWNoKCBhcmdzLCBmdW5jdGlvbiggXywgYXJnICkgewoJCQkJCQkJdmFyIHR5cGUgPSBqUXVlcnkudHlwZSggYXJnICk7CgkJCQkJCQlpZiAoIHR5cGUgPT09ICJmdW5jdGlvbiIgKSB7CgkJCQkJCQkJaWYgKCAhb3B0aW9ucy51bmlxdWUgfHwgIXNlbGYuaGFzKCBhcmcgKSApIHsKCQkJCQkJCQkJbGlzdC5wdXNoKCBhcmcgKTsKCQkJCQkJCQl9CgkJCQkJCQl9IGVsc2UgaWYgKCBhcmcgJiYgYXJnLmxlbmd0aCAmJiB0eXBlICE9PSAic3RyaW5nIiApIHsKCQkJCQkJCQkvLyBJbnNwZWN0IHJlY3Vyc2l2ZWx5CgkJCQkJCQkJYWRkKCBhcmcgKTsKCQkJCQkJCX0KCQkJCQkJfSk7CgkJCQkJfSkoIGFyZ3VtZW50cyApOwoJCQkJCS8vIERvIHdlIG5lZWQgdG8gYWRkIHRoZSBjYWxsYmFja3MgdG8gdGhlCgkJCQkJLy8gY3VycmVudCBmaXJpbmcgYmF0Y2g/CgkJCQkJaWYgKCBmaXJpbmcgKSB7CgkJCQkJCWZpcmluZ0xlbmd0aCA9IGxpc3QubGVuZ3RoOwoJCQkJCS8vIFdpdGggbWVtb3J5LCBpZiB3ZSdyZSBub3QgZmlyaW5nIHRoZW4KCQkJCQkvLyB3ZSBzaG91bGQgY2FsbCByaWdodCBhd2F5CgkJCQkJfSBlbHNlIGlmICggbWVtb3J5ICkgewoJCQkJCQlmaXJpbmdTdGFydCA9IHN0YXJ0OwoJCQkJCQlmaXJlKCBtZW1vcnkgKTsKCQkJCQl9CgkJCQl9CgkJCQlyZXR1cm4gdGhpczsKCQkJfSwKCQkJLy8gUmVtb3ZlIGEgY2FsbGJhY2sgZnJvbSB0aGUgbGlzdAoJCQlyZW1vdmU6IGZ1bmN0aW9uKCkgewoJCQkJaWYgKCBsaXN0ICkgewoJCQkJCWpRdWVyeS5lYWNoKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBfLCBhcmcgKSB7CgkJCQkJCXZhciBpbmRleDsKCQkJCQkJd2hpbGUoICggaW5kZXggPSBqUXVlcnkuaW5BcnJheSggYXJnLCBsaXN0LCBpbmRleCApICkgPiAtMSApIHsKCQkJCQkJCWxpc3Quc3BsaWNlKCBpbmRleCwgMSApOwoJCQkJCQkJLy8gSGFuZGxlIGZpcmluZyBpbmRleGVzCgkJCQkJCQlpZiAoIGZpcmluZyApIHsKCQkJCQkJCQlpZiAoIGluZGV4IDw9IGZpcmluZ0xlbmd0aCApIHsKCQkJCQkJCQkJZmlyaW5nTGVuZ3RoLS07CgkJCQkJCQkJfQoJCQkJCQkJCWlmICggaW5kZXggPD0gZmlyaW5nSW5kZXggKSB7CgkJCQkJCQkJCWZpcmluZ0luZGV4LS07CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfSk7CgkJCQl9CgkJCQlyZXR1cm4gdGhpczsKCQkJfSwKCQkJLy8gQ29udHJvbCBpZiBhIGdpdmVuIGNhbGxiYWNrIGlzIGluIHRoZSBsaXN0CgkJCWhhczogZnVuY3Rpb24oIGZuICkgewoJCQkJcmV0dXJuIGpRdWVyeS5pbkFycmF5KCBmbiwgbGlzdCApID4gLTE7CgkJCX0sCgkJCS8vIFJlbW92ZSBhbGwgY2FsbGJhY2tzIGZyb20gdGhlIGxpc3QKCQkJZW1wdHk6IGZ1bmN0aW9uKCkgewoJCQkJbGlzdCA9IFtdOwoJCQkJcmV0dXJuIHRoaXM7CgkJCX0sCgkJCS8vIEhhdmUgdGhlIGxpc3QgZG8gbm90aGluZyBhbnltb3JlCgkJCWRpc2FibGU6IGZ1bmN0aW9uKCkgewoJCQkJbGlzdCA9IHN0YWNrID0gbWVtb3J5ID0gdW5kZWZpbmVkOwoJCQkJcmV0dXJuIHRoaXM7CgkJCX0sCgkJCS8vIElzIGl0IGRpc2FibGVkPwoJCQlkaXNhYmxlZDogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gIWxpc3Q7CgkJCX0sCgkJCS8vIExvY2sgdGhlIGxpc3QgaW4gaXRzIGN1cnJlbnQgc3RhdGUKCQkJbG9jazogZnVuY3Rpb24oKSB7CgkJCQlzdGFjayA9IHVuZGVmaW5lZDsKCQkJCWlmICggIW1lbW9yeSApIHsKCQkJCQlzZWxmLmRpc2FibGUoKTsKCQkJCX0KCQkJCXJldHVybiB0aGlzOwoJCQl9LAoJCQkvLyBJcyBpdCBsb2NrZWQ/CgkJCWxvY2tlZDogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gIXN0YWNrOwoJCQl9LAoJCQkvLyBDYWxsIGFsbCBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gY29udGV4dCBhbmQgYXJndW1lbnRzCgkJCWZpcmVXaXRoOiBmdW5jdGlvbiggY29udGV4dCwgYXJncyApIHsKCQkJCWFyZ3MgPSBhcmdzIHx8IFtdOwoJCQkJYXJncyA9IFsgY29udGV4dCwgYXJncy5zbGljZSA/IGFyZ3Muc2xpY2UoKSA6IGFyZ3MgXTsKCQkJCWlmICggbGlzdCAmJiAoICFmaXJlZCB8fCBzdGFjayApICkgewoJCQkJCWlmICggZmlyaW5nICkgewoJCQkJCQlzdGFjay5wdXNoKCBhcmdzICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJZmlyZSggYXJncyApOwoJCQkJCX0KCQkJCX0KCQkJCXJldHVybiB0aGlzOwoJCQl9LAoJCQkvLyBDYWxsIGFsbCB0aGUgY2FsbGJhY2tzIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cwoJCQlmaXJlOiBmdW5jdGlvbigpIHsKCQkJCXNlbGYuZmlyZVdpdGgoIHRoaXMsIGFyZ3VtZW50cyApOwoJCQkJcmV0dXJuIHRoaXM7CgkJCX0sCgkJCS8vIFRvIGtub3cgaWYgdGhlIGNhbGxiYWNrcyBoYXZlIGFscmVhZHkgYmVlbiBjYWxsZWQgYXQgbGVhc3Qgb25jZQoJCQlmaXJlZDogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gISFmaXJlZDsKCQkJfQoJCX07CgoJcmV0dXJuIHNlbGY7Cn07CmpRdWVyeS5leHRlbmQoewoKCURlZmVycmVkOiBmdW5jdGlvbiggZnVuYyApIHsKCQl2YXIgdHVwbGVzID0gWwoJCQkJLy8gYWN0aW9uLCBhZGQgbGlzdGVuZXIsIGxpc3RlbmVyIGxpc3QsIGZpbmFsIHN0YXRlCgkJCQlbICJyZXNvbHZlIiwgImRvbmUiLCBqUXVlcnkuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCAicmVzb2x2ZWQiIF0sCgkJCQlbICJyZWplY3QiLCAiZmFpbCIsIGpRdWVyeS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksICJyZWplY3RlZCIgXSwKCQkJCVsgIm5vdGlmeSIsICJwcm9ncmVzcyIsIGpRdWVyeS5DYWxsYmFja3MoIm1lbW9yeSIpIF0KCQkJXSwKCQkJc3RhdGUgPSAicGVuZGluZyIsCgkJCXByb21pc2UgPSB7CgkJCQlzdGF0ZTogZnVuY3Rpb24oKSB7CgkJCQkJcmV0dXJuIHN0YXRlOwoJCQkJfSwKCQkJCWFsd2F5czogZnVuY3Rpb24oKSB7CgkJCQkJZGVmZXJyZWQuZG9uZSggYXJndW1lbnRzICkuZmFpbCggYXJndW1lbnRzICk7CgkJCQkJcmV0dXJuIHRoaXM7CgkJCQl9LAoJCQkJdGhlbjogZnVuY3Rpb24oIC8qIGZuRG9uZSwgZm5GYWlsLCBmblByb2dyZXNzICovICkgewoJCQkJCXZhciBmbnMgPSBhcmd1bWVudHM7CgkJCQkJcmV0dXJuIGpRdWVyeS5EZWZlcnJlZChmdW5jdGlvbiggbmV3RGVmZXIgKSB7CgkJCQkJCWpRdWVyeS5lYWNoKCB0dXBsZXMsIGZ1bmN0aW9uKCBpLCB0dXBsZSApIHsKCQkJCQkJCXZhciBhY3Rpb24gPSB0dXBsZVsgMCBdLAoJCQkJCQkJCWZuID0gZm5zWyBpIF07CgkJCQkJCQkvLyBkZWZlcnJlZFsgZG9uZSB8IGZhaWwgfCBwcm9ncmVzcyBdIGZvciBmb3J3YXJkaW5nIGFjdGlvbnMgdG8gbmV3RGVmZXIKCQkJCQkJCWRlZmVycmVkWyB0dXBsZVsxXSBdKCBqUXVlcnkuaXNGdW5jdGlvbiggZm4gKSA/CgkJCQkJCQkJZnVuY3Rpb24oKSB7CgkJCQkJCQkJCXZhciByZXR1cm5lZCA9IGZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJCQkJCQkJaWYgKCByZXR1cm5lZCAmJiBqUXVlcnkuaXNGdW5jdGlvbiggcmV0dXJuZWQucHJvbWlzZSApICkgewoJCQkJCQkJCQkJcmV0dXJuZWQucHJvbWlzZSgpCgkJCQkJCQkJCQkJLmRvbmUoIG5ld0RlZmVyLnJlc29sdmUgKQoJCQkJCQkJCQkJCS5mYWlsKCBuZXdEZWZlci5yZWplY3QgKQoJCQkJCQkJCQkJCS5wcm9ncmVzcyggbmV3RGVmZXIubm90aWZ5ICk7CgkJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCQluZXdEZWZlclsgYWN0aW9uICsgIldpdGgiIF0oIHRoaXMgPT09IGRlZmVycmVkID8gbmV3RGVmZXIgOiB0aGlzLCBbIHJldHVybmVkIF0gKTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0gOgoJCQkJCQkJCW5ld0RlZmVyWyBhY3Rpb24gXQoJCQkJCQkJKTsKCQkJCQkJfSk7CgkJCQkJCWZucyA9IG51bGw7CgkJCQkJfSkucHJvbWlzZSgpOwoJCQkJfSwKCQkJCS8vIEdldCBhIHByb21pc2UgZm9yIHRoaXMgZGVmZXJyZWQKCQkJCS8vIElmIG9iaiBpcyBwcm92aWRlZCwgdGhlIHByb21pc2UgYXNwZWN0IGlzIGFkZGVkIHRvIHRoZSBvYmplY3QKCQkJCXByb21pc2U6IGZ1bmN0aW9uKCBvYmogKSB7CgkJCQkJcmV0dXJuIG9iaiAhPSBudWxsID8galF1ZXJ5LmV4dGVuZCggb2JqLCBwcm9taXNlICkgOiBwcm9taXNlOwoJCQkJfQoJCQl9LAoJCQlkZWZlcnJlZCA9IHt9OwoKCQkvLyBLZWVwIHBpcGUgZm9yIGJhY2stY29tcGF0CgkJcHJvbWlzZS5waXBlID0gcHJvbWlzZS50aGVuOwoKCQkvLyBBZGQgbGlzdC1zcGVjaWZpYyBtZXRob2RzCgkJalF1ZXJ5LmVhY2goIHR1cGxlcywgZnVuY3Rpb24oIGksIHR1cGxlICkgewoJCQl2YXIgbGlzdCA9IHR1cGxlWyAyIF0sCgkJCQlzdGF0ZVN0cmluZyA9IHR1cGxlWyAzIF07CgoJCQkvLyBwcm9taXNlWyBkb25lIHwgZmFpbCB8IHByb2dyZXNzIF0gPSBsaXN0LmFkZAoJCQlwcm9taXNlWyB0dXBsZVsxXSBdID0gbGlzdC5hZGQ7CgoJCQkvLyBIYW5kbGUgc3RhdGUKCQkJaWYgKCBzdGF0ZVN0cmluZyApIHsKCQkJCWxpc3QuYWRkKGZ1bmN0aW9uKCkgewoJCQkJCS8vIHN0YXRlID0gWyByZXNvbHZlZCB8IHJlamVjdGVkIF0KCQkJCQlzdGF0ZSA9IHN0YXRlU3RyaW5nOwoKCQkJCS8vIFsgcmVqZWN0X2xpc3QgfCByZXNvbHZlX2xpc3QgXS5kaXNhYmxlOyBwcm9ncmVzc19saXN0LmxvY2sKCQkJCX0sIHR1cGxlc1sgaSBeIDEgXVsgMiBdLmRpc2FibGUsIHR1cGxlc1sgMiBdWyAyIF0ubG9jayApOwoJCQl9CgoJCQkvLyBkZWZlcnJlZFsgcmVzb2x2ZSB8IHJlamVjdCB8IG5vdGlmeSBdID0gbGlzdC5maXJlCgkJCWRlZmVycmVkWyB0dXBsZVswXSBdID0gbGlzdC5maXJlOwoJCQlkZWZlcnJlZFsgdHVwbGVbMF0gKyAiV2l0aCIgXSA9IGxpc3QuZmlyZVdpdGg7CgkJfSk7CgoJCS8vIE1ha2UgdGhlIGRlZmVycmVkIGEgcHJvbWlzZQoJCXByb21pc2UucHJvbWlzZSggZGVmZXJyZWQgKTsKCgkJLy8gQ2FsbCBnaXZlbiBmdW5jIGlmIGFueQoJCWlmICggZnVuYyApIHsKCQkJZnVuYy5jYWxsKCBkZWZlcnJlZCwgZGVmZXJyZWQgKTsKCQl9CgoJCS8vIEFsbCBkb25lIQoJCXJldHVybiBkZWZlcnJlZDsKCX0sCgoJLy8gRGVmZXJyZWQgaGVscGVyCgl3aGVuOiBmdW5jdGlvbiggc3Vib3JkaW5hdGUgLyogLCAuLi4sIHN1Ym9yZGluYXRlTiAqLyApIHsKCQl2YXIgaSA9IDAsCgkJCXJlc29sdmVWYWx1ZXMgPSBjb3JlX3NsaWNlLmNhbGwoIGFyZ3VtZW50cyApLAoJCQlsZW5ndGggPSByZXNvbHZlVmFsdWVzLmxlbmd0aCwKCgkJCS8vIHRoZSBjb3VudCBvZiB1bmNvbXBsZXRlZCBzdWJvcmRpbmF0ZXMKCQkJcmVtYWluaW5nID0gbGVuZ3RoICE9PSAxIHx8ICggc3Vib3JkaW5hdGUgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIHN1Ym9yZGluYXRlLnByb21pc2UgKSApID8gbGVuZ3RoIDogMCwKCgkJCS8vIHRoZSBtYXN0ZXIgRGVmZXJyZWQuIElmIHJlc29sdmVWYWx1ZXMgY29uc2lzdCBvZiBvbmx5IGEgc2luZ2xlIERlZmVycmVkLCBqdXN0IHVzZSB0aGF0LgoJCQlkZWZlcnJlZCA9IHJlbWFpbmluZyA9PT0gMSA/IHN1Ym9yZGluYXRlIDogalF1ZXJ5LkRlZmVycmVkKCksCgoJCQkvLyBVcGRhdGUgZnVuY3Rpb24gZm9yIGJvdGggcmVzb2x2ZSBhbmQgcHJvZ3Jlc3MgdmFsdWVzCgkJCXVwZGF0ZUZ1bmMgPSBmdW5jdGlvbiggaSwgY29udGV4dHMsIHZhbHVlcyApIHsKCQkJCXJldHVybiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJCQkJY29udGV4dHNbIGkgXSA9IHRoaXM7CgkJCQkJdmFsdWVzWyBpIF0gPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGNvcmVfc2xpY2UuY2FsbCggYXJndW1lbnRzICkgOiB2YWx1ZTsKCQkJCQlpZiggdmFsdWVzID09PSBwcm9ncmVzc1ZhbHVlcyApIHsKCQkJCQkJZGVmZXJyZWQubm90aWZ5V2l0aCggY29udGV4dHMsIHZhbHVlcyApOwoJCQkJCX0gZWxzZSBpZiAoICEoIC0tcmVtYWluaW5nICkgKSB7CgkJCQkJCWRlZmVycmVkLnJlc29sdmVXaXRoKCBjb250ZXh0cywgdmFsdWVzICk7CgkJCQkJfQoJCQkJfTsKCQkJfSwKCgkJCXByb2dyZXNzVmFsdWVzLCBwcm9ncmVzc0NvbnRleHRzLCByZXNvbHZlQ29udGV4dHM7CgoJCS8vIGFkZCBsaXN0ZW5lcnMgdG8gRGVmZXJyZWQgc3Vib3JkaW5hdGVzOyB0cmVhdCBvdGhlcnMgYXMgcmVzb2x2ZWQKCQlpZiAoIGxlbmd0aCA+IDEgKSB7CgkJCXByb2dyZXNzVmFsdWVzID0gbmV3IEFycmF5KCBsZW5ndGggKTsKCQkJcHJvZ3Jlc3NDb250ZXh0cyA9IG5ldyBBcnJheSggbGVuZ3RoICk7CgkJCXJlc29sdmVDb250ZXh0cyA9IG5ldyBBcnJheSggbGVuZ3RoICk7CgkJCWZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkgewoJCQkJaWYgKCByZXNvbHZlVmFsdWVzWyBpIF0gJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIHJlc29sdmVWYWx1ZXNbIGkgXS5wcm9taXNlICkgKSB7CgkJCQkJcmVzb2x2ZVZhbHVlc1sgaSBdLnByb21pc2UoKQoJCQkJCQkuZG9uZSggdXBkYXRlRnVuYyggaSwgcmVzb2x2ZUNvbnRleHRzLCByZXNvbHZlVmFsdWVzICkgKQoJCQkJCQkuZmFpbCggZGVmZXJyZWQucmVqZWN0ICkKCQkJCQkJLnByb2dyZXNzKCB1cGRhdGVGdW5jKCBpLCBwcm9ncmVzc0NvbnRleHRzLCBwcm9ncmVzc1ZhbHVlcyApICk7CgkJCQl9IGVsc2UgewoJCQkJCS0tcmVtYWluaW5nOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBpZiB3ZSdyZSBub3Qgd2FpdGluZyBvbiBhbnl0aGluZywgcmVzb2x2ZSB0aGUgbWFzdGVyCgkJaWYgKCAhcmVtYWluaW5nICkgewoJCQlkZWZlcnJlZC5yZXNvbHZlV2l0aCggcmVzb2x2ZUNvbnRleHRzLCByZXNvbHZlVmFsdWVzICk7CgkJfQoKCQlyZXR1cm4gZGVmZXJyZWQucHJvbWlzZSgpOwoJfQp9KTsKalF1ZXJ5LnN1cHBvcnQgPSAoZnVuY3Rpb24oKSB7CgoJdmFyIHN1cHBvcnQsCgkJYWxsLAoJCWEsCgkJc2VsZWN0LAoJCW9wdCwKCQlpbnB1dCwKCQlmcmFnbWVudCwKCQlldmVudE5hbWUsCgkJaSwKCQlpc1N1cHBvcnRlZCwKCQljbGlja0ZuLAoJCWRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwoKCS8vIFNldHVwCglkaXYuc2V0QXR0cmlidXRlKCAiY2xhc3NOYW1lIiwgInQiICk7CglkaXYuaW5uZXJIVE1MID0gIiAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiI7CgoJLy8gU3VwcG9ydCB0ZXN0cyB3b24ndCBydW4gaW4gc29tZSBsaW1pdGVkIG9yIG5vbi1icm93c2VyIGVudmlyb25tZW50cwoJYWxsID0gZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7CglhID0gZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbIDAgXTsKCWlmICggIWFsbCB8fCAhYSB8fCAhYWxsLmxlbmd0aCApIHsKCQlyZXR1cm4ge307Cgl9CgoJLy8gRmlyc3QgYmF0Y2ggb2YgdGVzdHMKCXNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpOwoJb3B0ID0gc2VsZWN0LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSApOwoJaW5wdXQgPSBkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IilbIDAgXTsKCglhLnN0eWxlLmNzc1RleHQgPSAidG9wOjFweDtmbG9hdDpsZWZ0O29wYWNpdHk6LjUiOwoJc3VwcG9ydCA9IHsKCQkvLyBJRSBzdHJpcHMgbGVhZGluZyB3aGl0ZXNwYWNlIHdoZW4gLmlubmVySFRNTCBpcyB1c2VkCgkJbGVhZGluZ1doaXRlc3BhY2U6ICggZGl2LmZpcnN0Q2hpbGQubm9kZVR5cGUgPT09IDMgKSwKCgkJLy8gTWFrZSBzdXJlIHRoYXQgdGJvZHkgZWxlbWVudHMgYXJlbid0IGF1dG9tYXRpY2FsbHkgaW5zZXJ0ZWQKCQkvLyBJRSB3aWxsIGluc2VydCB0aGVtIGludG8gZW1wdHkgdGFibGVzCgkJdGJvZHk6ICFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IikubGVuZ3RoLAoKCQkvLyBNYWtlIHN1cmUgdGhhdCBsaW5rIGVsZW1lbnRzIGdldCBzZXJpYWxpemVkIGNvcnJlY3RseSBieSBpbm5lckhUTUwKCQkvLyBUaGlzIHJlcXVpcmVzIGEgd3JhcHBlciBlbGVtZW50IGluIElFCgkJaHRtbFNlcmlhbGl6ZTogISFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKS5sZW5ndGgsCgoJCS8vIEdldCB0aGUgc3R5bGUgaW5mb3JtYXRpb24gZnJvbSBnZXRBdHRyaWJ1dGUKCQkvLyAoSUUgdXNlcyAuY3NzVGV4dCBpbnN0ZWFkKQoJCXN0eWxlOiAvdG9wLy50ZXN0KCBhLmdldEF0dHJpYnV0ZSgic3R5bGUiKSApLAoKCQkvLyBNYWtlIHN1cmUgdGhhdCBVUkxzIGFyZW4ndCBtYW5pcHVsYXRlZAoJCS8vIChJRSBub3JtYWxpemVzIGl0IGJ5IGRlZmF1bHQpCgkJaHJlZk5vcm1hbGl6ZWQ6ICggYS5nZXRBdHRyaWJ1dGUoImhyZWYiKSA9PT0gIi9hIiApLAoKCQkvLyBNYWtlIHN1cmUgdGhhdCBlbGVtZW50IG9wYWNpdHkgZXhpc3RzCgkJLy8gKElFIHVzZXMgZmlsdGVyIGluc3RlYWQpCgkJLy8gVXNlIGEgcmVnZXggdG8gd29yayBhcm91bmQgYSBXZWJLaXQgaXNzdWUuIFNlZSAjNTE0NQoJCW9wYWNpdHk6IC9eMC41Ly50ZXN0KCBhLnN0eWxlLm9wYWNpdHkgKSwKCgkJLy8gVmVyaWZ5IHN0eWxlIGZsb2F0IGV4aXN0ZW5jZQoJCS8vIChJRSB1c2VzIHN0eWxlRmxvYXQgaW5zdGVhZCBvZiBjc3NGbG9hdCkKCQljc3NGbG9hdDogISFhLnN0eWxlLmNzc0Zsb2F0LAoKCQkvLyBNYWtlIHN1cmUgdGhhdCBpZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQgZm9yIGEgY2hlY2tib3gKCQkvLyB0aGF0IGl0IGRlZmF1bHRzIHRvICJvbiIuCgkJLy8gKFdlYktpdCBkZWZhdWx0cyB0byAiIiBpbnN0ZWFkKQoJCWNoZWNrT246ICggaW5wdXQudmFsdWUgPT09ICJvbiIgKSwKCgkJLy8gTWFrZSBzdXJlIHRoYXQgYSBzZWxlY3RlZC1ieS1kZWZhdWx0IG9wdGlvbiBoYXMgYSB3b3JraW5nIHNlbGVjdGVkIHByb3BlcnR5LgoJCS8vIChXZWJLaXQgZGVmYXVsdHMgdG8gZmFsc2UgaW5zdGVhZCBvZiB0cnVlLCBJRSB0b28sIGlmIGl0J3MgaW4gYW4gb3B0Z3JvdXApCgkJb3B0U2VsZWN0ZWQ6IG9wdC5zZWxlY3RlZCwKCgkJLy8gVGVzdCBzZXRBdHRyaWJ1dGUgb24gY2FtZWxDYXNlIGNsYXNzLiBJZiBpdCB3b3Jrcywgd2UgbmVlZCBhdHRyRml4ZXMgd2hlbiBkb2luZyBnZXQvc2V0QXR0cmlidXRlIChpZTYvNykKCQlnZXRTZXRBdHRyaWJ1dGU6IGRpdi5jbGFzc05hbWUgIT09ICJ0IiwKCgkJLy8gVGVzdHMgZm9yIGVuY3R5cGUgc3VwcG9ydCBvbiBhIGZvcm0gKCM2NzQzKQoJCWVuY3R5cGU6ICEhZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZm9ybSIpLmVuY3R5cGUsCgoJCS8vIE1ha2VzIHN1cmUgY2xvbmluZyBhbiBodG1sNSBlbGVtZW50IGRvZXMgbm90IGNhdXNlIHByb2JsZW1zCgkJLy8gV2hlcmUgb3V0ZXJIVE1MIGlzIHVuZGVmaW5lZCwgdGhpcyBzdGlsbCB3b3JrcwoJCWh0bWw1Q2xvbmU6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm5hdiIpLmNsb25lTm9kZSggdHJ1ZSApLm91dGVySFRNTCAhPT0gIjw6bmF2PjwvOm5hdj4iLAoKCQkvLyBqUXVlcnkuc3VwcG9ydC5ib3hNb2RlbCBERVBSRUNBVEVEIGluIDEuOCBzaW5jZSB3ZSBkb24ndCBzdXBwb3J0IFF1aXJrcyBNb2RlCgkJYm94TW9kZWw6ICggZG9jdW1lbnQuY29tcGF0TW9kZSA9PT0gIkNTUzFDb21wYXQiICksCgoJCS8vIFdpbGwgYmUgZGVmaW5lZCBsYXRlcgoJCXN1Ym1pdEJ1YmJsZXM6IHRydWUsCgkJY2hhbmdlQnViYmxlczogdHJ1ZSwKCQlmb2N1c2luQnViYmxlczogZmFsc2UsCgkJZGVsZXRlRXhwYW5kbzogdHJ1ZSwKCQlub0Nsb25lRXZlbnQ6IHRydWUsCgkJaW5saW5lQmxvY2tOZWVkc0xheW91dDogZmFsc2UsCgkJc2hyaW5rV3JhcEJsb2NrczogZmFsc2UsCgkJcmVsaWFibGVNYXJnaW5SaWdodDogdHJ1ZSwKCQlib3hTaXppbmdSZWxpYWJsZTogdHJ1ZSwKCQlwaXhlbFBvc2l0aW9uOiBmYWxzZQoJfTsKCgkvLyBNYWtlIHN1cmUgY2hlY2tlZCBzdGF0dXMgaXMgcHJvcGVybHkgY2xvbmVkCglpbnB1dC5jaGVja2VkID0gdHJ1ZTsKCXN1cHBvcnQubm9DbG9uZUNoZWNrZWQgPSBpbnB1dC5jbG9uZU5vZGUoIHRydWUgKS5jaGVja2VkOwoKCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBvcHRpb25zIGluc2lkZSBkaXNhYmxlZCBzZWxlY3RzIGFyZW4ndCBtYXJrZWQgYXMgZGlzYWJsZWQKCS8vIChXZWJLaXQgbWFya3MgdGhlbSBhcyBkaXNhYmxlZCkKCXNlbGVjdC5kaXNhYmxlZCA9IHRydWU7CglzdXBwb3J0Lm9wdERpc2FibGVkID0gIW9wdC5kaXNhYmxlZDsKCgkvLyBUZXN0IHRvIHNlZSBpZiBpdCdzIHBvc3NpYmxlIHRvIGRlbGV0ZSBhbiBleHBhbmRvIGZyb20gYW4gZWxlbWVudAoJLy8gRmFpbHMgaW4gSW50ZXJuZXQgRXhwbG9yZXIKCXRyeSB7CgkJZGVsZXRlIGRpdi50ZXN0OwoJfSBjYXRjaCggZSApIHsKCQlzdXBwb3J0LmRlbGV0ZUV4cGFuZG8gPSBmYWxzZTsKCX0KCglpZiAoICFkaXYuYWRkRXZlbnRMaXN0ZW5lciAmJiBkaXYuYXR0YWNoRXZlbnQgJiYgZGl2LmZpcmVFdmVudCApIHsKCQlkaXYuYXR0YWNoRXZlbnQoICJvbmNsaWNrIiwgY2xpY2tGbiA9IGZ1bmN0aW9uKCkgewoJCQkvLyBDbG9uaW5nIGEgbm9kZSBzaG91bGRuJ3QgY29weSBvdmVyIGFueQoJCQkvLyBib3VuZCBldmVudCBoYW5kbGVycyAoSUUgZG9lcyB0aGlzKQoJCQlzdXBwb3J0Lm5vQ2xvbmVFdmVudCA9IGZhbHNlOwoJCX0pOwoJCWRpdi5jbG9uZU5vZGUoIHRydWUgKS5maXJlRXZlbnQoIm9uY2xpY2siKTsKCQlkaXYuZGV0YWNoRXZlbnQoICJvbmNsaWNrIiwgY2xpY2tGbiApOwoJfQoKCS8vIENoZWNrIGlmIGEgcmFkaW8gbWFpbnRhaW5zIGl0cyB2YWx1ZQoJLy8gYWZ0ZXIgYmVpbmcgYXBwZW5kZWQgdG8gdGhlIERPTQoJaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwoJaW5wdXQudmFsdWUgPSAidCI7CglpbnB1dC5zZXRBdHRyaWJ1dGUoICJ0eXBlIiwgInJhZGlvIiApOwoJc3VwcG9ydC5yYWRpb1ZhbHVlID0gaW5wdXQudmFsdWUgPT09ICJ0IjsKCglpbnB1dC5zZXRBdHRyaWJ1dGUoICJjaGVja2VkIiwgImNoZWNrZWQiICk7CgoJLy8gIzExMjE3IC0gV2ViS2l0IGxvc2VzIGNoZWNrIHdoZW4gdGhlIG5hbWUgaXMgYWZ0ZXIgdGhlIGNoZWNrZWQgYXR0cmlidXRlCglpbnB1dC5zZXRBdHRyaWJ1dGUoICJuYW1lIiwgInQiICk7CgoJZGl2LmFwcGVuZENoaWxkKCBpbnB1dCApOwoJZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CglmcmFnbWVudC5hcHBlbmRDaGlsZCggZGl2Lmxhc3RDaGlsZCApOwoKCS8vIFdlYktpdCBkb2Vzbid0IGNsb25lIGNoZWNrZWQgc3RhdGUgY29ycmVjdGx5IGluIGZyYWdtZW50cwoJc3VwcG9ydC5jaGVja0Nsb25lID0gZnJhZ21lbnQuY2xvbmVOb2RlKCB0cnVlICkuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmNoZWNrZWQ7CgoJLy8gQ2hlY2sgaWYgYSBkaXNjb25uZWN0ZWQgY2hlY2tib3ggd2lsbCByZXRhaW4gaXRzIGNoZWNrZWQKCS8vIHZhbHVlIG9mIHRydWUgYWZ0ZXIgYXBwZW5kZWQgdG8gdGhlIERPTSAoSUU2LzcpCglzdXBwb3J0LmFwcGVuZENoZWNrZWQgPSBpbnB1dC5jaGVja2VkOwoKCWZyYWdtZW50LnJlbW92ZUNoaWxkKCBpbnB1dCApOwoJZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGRpdiApOwoKCS8vIFRlY2huaXF1ZSBmcm9tIEp1cml5IFpheXRzZXYKCS8vIGh0dHA6Ly9wZXJmZWN0aW9ua2lsbHMuY29tL2RldGVjdGluZy1ldmVudC1zdXBwb3J0LXdpdGhvdXQtYnJvd3Nlci1zbmlmZmluZy8KCS8vIFdlIG9ubHkgY2FyZSBhYm91dCB0aGUgY2FzZSB3aGVyZSBub24tc3RhbmRhcmQgZXZlbnQgc3lzdGVtcwoJLy8gYXJlIHVzZWQsIG5hbWVseSBpbiBJRS4gU2hvcnQtY2lyY3VpdGluZyBoZXJlIGhlbHBzIHVzIHRvCgkvLyBhdm9pZCBhbiBldmFsIGNhbGwgKGluIHNldEF0dHJpYnV0ZSkgd2hpY2ggY2FuIGNhdXNlIENTUAoJLy8gdG8gZ28gaGF5d2lyZS4gU2VlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9TZWN1cml0eS9DU1AKCWlmICggZGl2LmF0dGFjaEV2ZW50ICkgewoJCWZvciAoIGkgaW4gewoJCQlzdWJtaXQ6IHRydWUsCgkJCWNoYW5nZTogdHJ1ZSwKCQkJZm9jdXNpbjogdHJ1ZQoJCX0pIHsKCQkJZXZlbnROYW1lID0gIm9uIiArIGk7CgkJCWlzU3VwcG9ydGVkID0gKCBldmVudE5hbWUgaW4gZGl2ICk7CgkJCWlmICggIWlzU3VwcG9ydGVkICkgewoJCQkJZGl2LnNldEF0dHJpYnV0ZSggZXZlbnROYW1lLCAicmV0dXJuOyIgKTsKCQkJCWlzU3VwcG9ydGVkID0gKCB0eXBlb2YgZGl2WyBldmVudE5hbWUgXSA9PT0gImZ1bmN0aW9uIiApOwoJCQl9CgkJCXN1cHBvcnRbIGkgKyAiQnViYmxlcyIgXSA9IGlzU3VwcG9ydGVkOwoJCX0KCX0KCgkvLyBSdW4gdGVzdHMgdGhhdCBuZWVkIGEgYm9keSBhdCBkb2MgcmVhZHkKCWpRdWVyeShmdW5jdGlvbigpIHsKCQl2YXIgY29udGFpbmVyLCBkaXYsIHRkcywgbWFyZ2luRGl2LAoJCQlkaXZSZXNldCA9ICJwYWRkaW5nOjA7bWFyZ2luOjA7Ym9yZGVyOjA7ZGlzcGxheTpibG9jaztvdmVyZmxvdzpoaWRkZW47IiwKCQkJYm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF07CgoJCWlmICggIWJvZHkgKSB7CgkJCS8vIFJldHVybiBmb3IgZnJhbWVzZXQgZG9jcyB0aGF0IGRvbid0IGhhdmUgYSBib2R5CgkJCXJldHVybjsKCQl9CgoJCWNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwoJCWNvbnRhaW5lci5zdHlsZS5jc3NUZXh0ID0gInZpc2liaWxpdHk6aGlkZGVuO2JvcmRlcjowO3dpZHRoOjA7aGVpZ2h0OjA7cG9zaXRpb246c3RhdGljO3RvcDowO21hcmdpbi10b3A6MXB4IjsKCQlib2R5Lmluc2VydEJlZm9yZSggY29udGFpbmVyLCBib2R5LmZpcnN0Q2hpbGQgKTsKCgkJLy8gQ29uc3RydWN0IHRoZSB0ZXN0IGVsZW1lbnQKCQlkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKCQljb250YWluZXIuYXBwZW5kQ2hpbGQoIGRpdiApOwoKCQkvLyBDaGVjayBpZiB0YWJsZSBjZWxscyBzdGlsbCBoYXZlIG9mZnNldFdpZHRoL0hlaWdodCB3aGVuIHRoZXkgYXJlIHNldAoJCS8vIHRvIGRpc3BsYXk6bm9uZSBhbmQgdGhlcmUgYXJlIHN0aWxsIG90aGVyIHZpc2libGUgdGFibGUgY2VsbHMgaW4gYQoJCS8vIHRhYmxlIHJvdzsgaWYgc28sIG9mZnNldFdpZHRoL0hlaWdodCBhcmUgbm90IHJlbGlhYmxlIGZvciB1c2Ugd2hlbgoJCS8vIGRldGVybWluaW5nIGlmIGFuIGVsZW1lbnQgaGFzIGJlZW4gaGlkZGVuIGRpcmVjdGx5IHVzaW5nCgkJLy8gZGlzcGxheTpub25lIChpdCBpcyBzdGlsbCBzYWZlIHRvIHVzZSBvZmZzZXRzIGlmIGEgcGFyZW50IGVsZW1lbnQgaXMKCQkvLyBoaWRkZW47IGRvbiBzYWZldHkgZ29nZ2xlcyBhbmQgc2VlIGJ1ZyAjNDUxMiBmb3IgbW9yZSBpbmZvcm1hdGlvbikuCgkJLy8gKG9ubHkgSUUgOCBmYWlscyB0aGlzIHRlc3QpCgkJZGl2LmlubmVySFRNTCA9ICI8dGFibGU+PHRyPjx0ZD48L3RkPjx0ZD50PC90ZD48L3RyPjwvdGFibGU+IjsKCQl0ZHMgPSBkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7CgkJdGRzWyAwIF0uc3R5bGUuY3NzVGV4dCA9ICJwYWRkaW5nOjA7bWFyZ2luOjA7Ym9yZGVyOjA7ZGlzcGxheTpub25lIjsKCQlpc1N1cHBvcnRlZCA9ICggdGRzWyAwIF0ub2Zmc2V0SGVpZ2h0ID09PSAwICk7CgoJCXRkc1sgMCBdLnN0eWxlLmRpc3BsYXkgPSAiIjsKCQl0ZHNbIDEgXS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwoKCQkvLyBDaGVjayBpZiBlbXB0eSB0YWJsZSBjZWxscyBzdGlsbCBoYXZlIG9mZnNldFdpZHRoL0hlaWdodAoJCS8vIChJRSA8PSA4IGZhaWwgdGhpcyB0ZXN0KQoJCXN1cHBvcnQucmVsaWFibGVIaWRkZW5PZmZzZXRzID0gaXNTdXBwb3J0ZWQgJiYgKCB0ZHNbIDAgXS5vZmZzZXRIZWlnaHQgPT09IDAgKTsKCgkJLy8gQ2hlY2sgYm94LXNpemluZyBhbmQgbWFyZ2luIGJlaGF2aW9yCgkJZGl2LmlubmVySFRNTCA9ICIiOwoJCWRpdi5zdHlsZS5jc3NUZXh0ID0gImJveC1zaXppbmc6Ym9yZGVyLWJveDstbW96LWJveC1zaXppbmc6Ym9yZGVyLWJveDstd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjFweDtib3JkZXI6MXB4O2Rpc3BsYXk6YmxvY2s7d2lkdGg6NHB4O21hcmdpbi10b3A6MSU7cG9zaXRpb246YWJzb2x1dGU7dG9wOjElOyI7CgkJc3VwcG9ydC5ib3hTaXppbmcgPSAoIGRpdi5vZmZzZXRXaWR0aCA9PT0gNCApOwoJCXN1cHBvcnQuZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQgPSAoIGJvZHkub2Zmc2V0VG9wICE9PSAxICk7CgoJCS8vIE5PVEU6IFRvIGFueSBmdXR1cmUgbWFpbnRhaW5lciwgd2UndmUgd2luZG93LmdldENvbXB1dGVkU3R5bGUKCQkvLyBiZWNhdXNlIGpzZG9tIG9uIG5vZGUuanMgd2lsbCBicmVhayB3aXRob3V0IGl0LgoJCWlmICggd2luZG93LmdldENvbXB1dGVkU3R5bGUgKSB7CgkJCXN1cHBvcnQucGl4ZWxQb3NpdGlvbiA9ICggd2luZG93LmdldENvbXB1dGVkU3R5bGUoIGRpdiwgbnVsbCApIHx8IHt9ICkudG9wICE9PSAiMSUiOwoJCQlzdXBwb3J0LmJveFNpemluZ1JlbGlhYmxlID0gKCB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSggZGl2LCBudWxsICkgfHwgeyB3aWR0aDogIjRweCIgfSApLndpZHRoID09PSAiNHB4IjsKCgkJCS8vIENoZWNrIGlmIGRpdiB3aXRoIGV4cGxpY2l0IHdpZHRoIGFuZCBubyBtYXJnaW4tcmlnaHQgaW5jb3JyZWN0bHkKCQkJLy8gZ2V0cyBjb21wdXRlZCBtYXJnaW4tcmlnaHQgYmFzZWQgb24gd2lkdGggb2YgY29udGFpbmVyLiBGb3IgbW9yZQoJCQkvLyBpbmZvIHNlZSBidWcgIzMzMzMKCQkJLy8gRmFpbHMgaW4gV2ViS2l0IGJlZm9yZSBGZWIgMjAxMSBuaWdodGxpZXMKCQkJLy8gV2ViS2l0IEJ1ZyAxMzM0MyAtIGdldENvbXB1dGVkU3R5bGUgcmV0dXJucyB3cm9uZyB2YWx1ZSBmb3IgbWFyZ2luLXJpZ2h0CgkJCW1hcmdpbkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwoJCQltYXJnaW5EaXYuc3R5bGUuY3NzVGV4dCA9IGRpdi5zdHlsZS5jc3NUZXh0ID0gZGl2UmVzZXQ7CgkJCW1hcmdpbkRpdi5zdHlsZS5tYXJnaW5SaWdodCA9IG1hcmdpbkRpdi5zdHlsZS53aWR0aCA9ICIwIjsKCQkJZGl2LnN0eWxlLndpZHRoID0gIjFweCI7CgkJCWRpdi5hcHBlbmRDaGlsZCggbWFyZ2luRGl2ICk7CgkJCXN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodCA9CgkJCQkhcGFyc2VGbG9hdCggKCB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSggbWFyZ2luRGl2LCBudWxsICkgfHwge30gKS5tYXJnaW5SaWdodCApOwoJCX0KCgkJaWYgKCB0eXBlb2YgZGl2LnN0eWxlLnpvb20gIT09ICJ1bmRlZmluZWQiICkgewoJCQkvLyBDaGVjayBpZiBuYXRpdmVseSBibG9jay1sZXZlbCBlbGVtZW50cyBhY3QgbGlrZSBpbmxpbmUtYmxvY2sKCQkJLy8gZWxlbWVudHMgd2hlbiBzZXR0aW5nIHRoZWlyIGRpc3BsYXkgdG8gJ2lubGluZScgYW5kIGdpdmluZwoJCQkvLyB0aGVtIGxheW91dAoJCQkvLyAoSUUgPCA4IGRvZXMgdGhpcykKCQkJZGl2LmlubmVySFRNTCA9ICIiOwoJCQlkaXYuc3R5bGUuY3NzVGV4dCA9IGRpdlJlc2V0ICsgIndpZHRoOjFweDtwYWRkaW5nOjFweDtkaXNwbGF5OmlubGluZTt6b29tOjEiOwoJCQlzdXBwb3J0LmlubGluZUJsb2NrTmVlZHNMYXlvdXQgPSAoIGRpdi5vZmZzZXRXaWR0aCA9PT0gMyApOwoKCQkJLy8gQ2hlY2sgaWYgZWxlbWVudHMgd2l0aCBsYXlvdXQgc2hyaW5rLXdyYXAgdGhlaXIgY2hpbGRyZW4KCQkJLy8gKElFIDYgZG9lcyB0aGlzKQoJCQlkaXYuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7CgkJCWRpdi5zdHlsZS5vdmVyZmxvdyA9ICJ2aXNpYmxlIjsKCQkJZGl2LmlubmVySFRNTCA9ICI8ZGl2PjwvZGl2PiI7CgkJCWRpdi5maXJzdENoaWxkLnN0eWxlLndpZHRoID0gIjVweCI7CgkJCXN1cHBvcnQuc2hyaW5rV3JhcEJsb2NrcyA9ICggZGl2Lm9mZnNldFdpZHRoICE9PSAzICk7CgoJCQljb250YWluZXIuc3R5bGUuem9vbSA9IDE7CgkJfQoKCQkvLyBOdWxsIGVsZW1lbnRzIHRvIGF2b2lkIGxlYWtzIGluIElFCgkJYm9keS5yZW1vdmVDaGlsZCggY29udGFpbmVyICk7CgkJY29udGFpbmVyID0gZGl2ID0gdGRzID0gbWFyZ2luRGl2ID0gbnVsbDsKCX0pOwoKCS8vIE51bGwgZWxlbWVudHMgdG8gYXZvaWQgbGVha3MgaW4gSUUKCWZyYWdtZW50LnJlbW92ZUNoaWxkKCBkaXYgKTsKCWFsbCA9IGEgPSBzZWxlY3QgPSBvcHQgPSBpbnB1dCA9IGZyYWdtZW50ID0gZGl2ID0gbnVsbDsKCglyZXR1cm4gc3VwcG9ydDsKfSkoKTsKdmFyIHJicmFjZSA9IC8oPzpce1tcc1xTXSpcfXxcW1tcc1xTXSpcXSkkLywKCXJtdWx0aURhc2ggPSAvKFtBLVpdKS9nOwoKalF1ZXJ5LmV4dGVuZCh7CgljYWNoZToge30sCgoJZGVsZXRlZElkczogW10sCgoJLy8gUmVtb3ZlIGF0IG5leHQgbWFqb3IgcmVsZWFzZSAoMS45LzIuMCkKCXV1aWQ6IDAsCgoJLy8gVW5pcXVlIGZvciBlYWNoIGNvcHkgb2YgalF1ZXJ5IG9uIHRoZSBwYWdlCgkvLyBOb24tZGlnaXRzIHJlbW92ZWQgdG8gbWF0Y2ggcmlubGluZWpRdWVyeQoJZXhwYW5kbzogImpRdWVyeSIgKyAoIGpRdWVyeS5mbi5qcXVlcnkgKyBNYXRoLnJhbmRvbSgpICkucmVwbGFjZSggL1xEL2csICIiICksCgoJLy8gVGhlIGZvbGxvd2luZyBlbGVtZW50cyB0aHJvdyB1bmNhdGNoYWJsZSBleGNlcHRpb25zIGlmIHlvdQoJLy8gYXR0ZW1wdCB0byBhZGQgZXhwYW5kbyBwcm9wZXJ0aWVzIHRvIHRoZW0uCglub0RhdGE6IHsKCQkiZW1iZWQiOiB0cnVlLAoJCS8vIEJhbiBhbGwgb2JqZWN0cyBleGNlcHQgZm9yIEZsYXNoICh3aGljaCBoYW5kbGUgZXhwYW5kb3MpCgkJIm9iamVjdCI6ICJjbHNpZDpEMjdDREI2RS1BRTZELTExY2YtOTZCOC00NDQ1NTM1NDAwMDAiLAoJCSJhcHBsZXQiOiB0cnVlCgl9LAoKCWhhc0RhdGE6IGZ1bmN0aW9uKCBlbGVtICkgewoJCWVsZW0gPSBlbGVtLm5vZGVUeXBlID8galF1ZXJ5LmNhY2hlWyBlbGVtW2pRdWVyeS5leHBhbmRvXSBdIDogZWxlbVsgalF1ZXJ5LmV4cGFuZG8gXTsKCQlyZXR1cm4gISFlbGVtICYmICFpc0VtcHR5RGF0YU9iamVjdCggZWxlbSApOwoJfSwKCglkYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSwgcHZ0IC8qIEludGVybmFsIFVzZSBPbmx5ICovICkgewoJCWlmICggIWpRdWVyeS5hY2NlcHREYXRhKCBlbGVtICkgKSB7CgkJCXJldHVybjsKCQl9CgoJCXZhciB0aGlzQ2FjaGUsIHJldCwKCQkJaW50ZXJuYWxLZXkgPSBqUXVlcnkuZXhwYW5kbywKCQkJZ2V0QnlOYW1lID0gdHlwZW9mIG5hbWUgPT09ICJzdHJpbmciLAoKCQkJLy8gV2UgaGF2ZSB0byBoYW5kbGUgRE9NIG5vZGVzIGFuZCBKUyBvYmplY3RzIGRpZmZlcmVudGx5IGJlY2F1c2UgSUU2LTcKCQkJLy8gY2FuJ3QgR0Mgb2JqZWN0IHJlZmVyZW5jZXMgcHJvcGVybHkgYWNyb3NzIHRoZSBET00tSlMgYm91bmRhcnkKCQkJaXNOb2RlID0gZWxlbS5ub2RlVHlwZSwKCgkJCS8vIE9ubHkgRE9NIG5vZGVzIG5lZWQgdGhlIGdsb2JhbCBqUXVlcnkgY2FjaGU7IEpTIG9iamVjdCBkYXRhIGlzCgkJCS8vIGF0dGFjaGVkIGRpcmVjdGx5IHRvIHRoZSBvYmplY3Qgc28gR0MgY2FuIG9jY3VyIGF1dG9tYXRpY2FsbHkKCQkJY2FjaGUgPSBpc05vZGUgPyBqUXVlcnkuY2FjaGUgOiBlbGVtLAoKCQkJLy8gT25seSBkZWZpbmluZyBhbiBJRCBmb3IgSlMgb2JqZWN0cyBpZiBpdHMgY2FjaGUgYWxyZWFkeSBleGlzdHMgYWxsb3dzCgkJCS8vIHRoZSBjb2RlIHRvIHNob3J0Y3V0IG9uIHRoZSBzYW1lIHBhdGggYXMgYSBET00gbm9kZSB3aXRoIG5vIGNhY2hlCgkJCWlkID0gaXNOb2RlID8gZWxlbVsgaW50ZXJuYWxLZXkgXSA6IGVsZW1bIGludGVybmFsS2V5IF0gJiYgaW50ZXJuYWxLZXk7CgoJCS8vIEF2b2lkIGRvaW5nIGFueSBtb3JlIHdvcmsgdGhhbiB3ZSBuZWVkIHRvIHdoZW4gdHJ5aW5nIHRvIGdldCBkYXRhIG9uIGFuCgkJLy8gb2JqZWN0IHRoYXQgaGFzIG5vIGRhdGEgYXQgYWxsCgkJaWYgKCAoIWlkIHx8ICFjYWNoZVtpZF0gfHwgKCFwdnQgJiYgIWNhY2hlW2lkXS5kYXRhKSkgJiYgZ2V0QnlOYW1lICYmIGRhdGEgPT09IHVuZGVmaW5lZCApIHsKCQkJcmV0dXJuOwoJCX0KCgkJaWYgKCAhaWQgKSB7CgkJCS8vIE9ubHkgRE9NIG5vZGVzIG5lZWQgYSBuZXcgdW5pcXVlIElEIGZvciBlYWNoIGVsZW1lbnQgc2luY2UgdGhlaXIgZGF0YQoJCQkvLyBlbmRzIHVwIGluIHRoZSBnbG9iYWwgY2FjaGUKCQkJaWYgKCBpc05vZGUgKSB7CgkJCQllbGVtWyBpbnRlcm5hbEtleSBdID0gaWQgPSBqUXVlcnkuZGVsZXRlZElkcy5wb3AoKSB8fCBqUXVlcnkuZ3VpZCsrOwoJCQl9IGVsc2UgewoJCQkJaWQgPSBpbnRlcm5hbEtleTsKCQkJfQoJCX0KCgkJaWYgKCAhY2FjaGVbIGlkIF0gKSB7CgkJCWNhY2hlWyBpZCBdID0ge307CgoJCQkvLyBBdm9pZHMgZXhwb3NpbmcgalF1ZXJ5IG1ldGFkYXRhIG9uIHBsYWluIEpTIG9iamVjdHMgd2hlbiB0aGUgb2JqZWN0CgkJCS8vIGlzIHNlcmlhbGl6ZWQgdXNpbmcgSlNPTi5zdHJpbmdpZnkKCQkJaWYgKCAhaXNOb2RlICkgewoJCQkJY2FjaGVbIGlkIF0udG9KU09OID0galF1ZXJ5Lm5vb3A7CgkJCX0KCQl9CgoJCS8vIEFuIG9iamVjdCBjYW4gYmUgcGFzc2VkIHRvIGpRdWVyeS5kYXRhIGluc3RlYWQgb2YgYSBrZXkvdmFsdWUgcGFpcjsgdGhpcyBnZXRzCgkJLy8gc2hhbGxvdyBjb3BpZWQgb3ZlciBvbnRvIHRoZSBleGlzdGluZyBjYWNoZQoJCWlmICggdHlwZW9mIG5hbWUgPT09ICJvYmplY3QiIHx8IHR5cGVvZiBuYW1lID09PSAiZnVuY3Rpb24iICkgewoJCQlpZiAoIHB2dCApIHsKCQkJCWNhY2hlWyBpZCBdID0galF1ZXJ5LmV4dGVuZCggY2FjaGVbIGlkIF0sIG5hbWUgKTsKCQkJfSBlbHNlIHsKCQkJCWNhY2hlWyBpZCBdLmRhdGEgPSBqUXVlcnkuZXh0ZW5kKCBjYWNoZVsgaWQgXS5kYXRhLCBuYW1lICk7CgkJCX0KCQl9CgoJCXRoaXNDYWNoZSA9IGNhY2hlWyBpZCBdOwoKCQkvLyBqUXVlcnkgZGF0YSgpIGlzIHN0b3JlZCBpbiBhIHNlcGFyYXRlIG9iamVjdCBpbnNpZGUgdGhlIG9iamVjdCdzIGludGVybmFsIGRhdGEKCQkvLyBjYWNoZSBpbiBvcmRlciB0byBhdm9pZCBrZXkgY29sbGlzaW9ucyBiZXR3ZWVuIGludGVybmFsIGRhdGEgYW5kIHVzZXItZGVmaW5lZAoJCS8vIGRhdGEuCgkJaWYgKCAhcHZ0ICkgewoJCQlpZiAoICF0aGlzQ2FjaGUuZGF0YSApIHsKCQkJCXRoaXNDYWNoZS5kYXRhID0ge307CgkJCX0KCgkJCXRoaXNDYWNoZSA9IHRoaXNDYWNoZS5kYXRhOwoJCX0KCgkJaWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7CgkJCXRoaXNDYWNoZVsgalF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApIF0gPSBkYXRhOwoJCX0KCgkJLy8gQ2hlY2sgZm9yIGJvdGggY29udmVydGVkLXRvLWNhbWVsIGFuZCBub24tY29udmVydGVkIGRhdGEgcHJvcGVydHkgbmFtZXMKCQkvLyBJZiBhIGRhdGEgcHJvcGVydHkgd2FzIHNwZWNpZmllZAoJCWlmICggZ2V0QnlOYW1lICkgewoKCQkJLy8gRmlyc3QgVHJ5IHRvIGZpbmQgYXMtaXMgcHJvcGVydHkgZGF0YQoJCQlyZXQgPSB0aGlzQ2FjaGVbIG5hbWUgXTsKCgkJCS8vIFRlc3QgZm9yIG51bGx8dW5kZWZpbmVkIHByb3BlcnR5IGRhdGEKCQkJaWYgKCByZXQgPT0gbnVsbCApIHsKCgkJCQkvLyBUcnkgdG8gZmluZCB0aGUgY2FtZWxDYXNlZCBwcm9wZXJ0eQoJCQkJcmV0ID0gdGhpc0NhY2hlWyBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lICkgXTsKCQkJfQoJCX0gZWxzZSB7CgkJCXJldCA9IHRoaXNDYWNoZTsKCQl9CgoJCXJldHVybiByZXQ7Cgl9LAoKCXJlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBwdnQgLyogSW50ZXJuYWwgVXNlIE9ubHkgKi8gKSB7CgkJaWYgKCAhalF1ZXJ5LmFjY2VwdERhdGEoIGVsZW0gKSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJdmFyIHRoaXNDYWNoZSwgaSwgbCwKCgkJCWlzTm9kZSA9IGVsZW0ubm9kZVR5cGUsCgoJCQkvLyBTZWUgalF1ZXJ5LmRhdGEgZm9yIG1vcmUgaW5mb3JtYXRpb24KCQkJY2FjaGUgPSBpc05vZGUgPyBqUXVlcnkuY2FjaGUgOiBlbGVtLAoJCQlpZCA9IGlzTm9kZSA/IGVsZW1bIGpRdWVyeS5leHBhbmRvIF0gOiBqUXVlcnkuZXhwYW5kbzsKCgkJLy8gSWYgdGhlcmUgaXMgYWxyZWFkeSBubyBjYWNoZSBlbnRyeSBmb3IgdGhpcyBvYmplY3QsIHRoZXJlIGlzIG5vCgkJLy8gcHVycG9zZSBpbiBjb250aW51aW5nCgkJaWYgKCAhY2FjaGVbIGlkIF0gKSB7CgkJCXJldHVybjsKCQl9CgoJCWlmICggbmFtZSApIHsKCgkJCXRoaXNDYWNoZSA9IHB2dCA/IGNhY2hlWyBpZCBdIDogY2FjaGVbIGlkIF0uZGF0YTsKCgkJCWlmICggdGhpc0NhY2hlICkgewoKCQkJCS8vIFN1cHBvcnQgYXJyYXkgb3Igc3BhY2Ugc2VwYXJhdGVkIHN0cmluZyBuYW1lcyBmb3IgZGF0YSBrZXlzCgkJCQlpZiAoICFqUXVlcnkuaXNBcnJheSggbmFtZSApICkgewoKCQkJCQkvLyB0cnkgdGhlIHN0cmluZyBhcyBhIGtleSBiZWZvcmUgYW55IG1hbmlwdWxhdGlvbgoJCQkJCWlmICggbmFtZSBpbiB0aGlzQ2FjaGUgKSB7CgkJCQkJCW5hbWUgPSBbIG5hbWUgXTsKCQkJCQl9IGVsc2UgewoKCQkJCQkJLy8gc3BsaXQgdGhlIGNhbWVsIGNhc2VkIHZlcnNpb24gYnkgc3BhY2VzIHVubGVzcyBhIGtleSB3aXRoIHRoZSBzcGFjZXMgZXhpc3RzCgkJCQkJCW5hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lICk7CgkJCQkJCWlmICggbmFtZSBpbiB0aGlzQ2FjaGUgKSB7CgkJCQkJCQluYW1lID0gWyBuYW1lIF07CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQluYW1lID0gbmFtZS5zcGxpdCgiICIpOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoKCQkJCWZvciAoIGkgPSAwLCBsID0gbmFtZS5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQkJZGVsZXRlIHRoaXNDYWNoZVsgbmFtZVtpXSBdOwoJCQkJfQoKCQkJCS8vIElmIHRoZXJlIGlzIG5vIGRhdGEgbGVmdCBpbiB0aGUgY2FjaGUsIHdlIHdhbnQgdG8gY29udGludWUKCQkJCS8vIGFuZCBsZXQgdGhlIGNhY2hlIG9iamVjdCBpdHNlbGYgZ2V0IGRlc3Ryb3llZAoJCQkJaWYgKCAhKCBwdnQgPyBpc0VtcHR5RGF0YU9iamVjdCA6IGpRdWVyeS5pc0VtcHR5T2JqZWN0ICkoIHRoaXNDYWNoZSApICkgewoJCQkJCXJldHVybjsKCQkJCX0KCQkJfQoJCX0KCgkJLy8gU2VlIGpRdWVyeS5kYXRhIGZvciBtb3JlIGluZm9ybWF0aW9uCgkJaWYgKCAhcHZ0ICkgewoJCQlkZWxldGUgY2FjaGVbIGlkIF0uZGF0YTsKCgkJCS8vIERvbid0IGRlc3Ryb3kgdGhlIHBhcmVudCBjYWNoZSB1bmxlc3MgdGhlIGludGVybmFsIGRhdGEgb2JqZWN0CgkJCS8vIGhhZCBiZWVuIHRoZSBvbmx5IHRoaW5nIGxlZnQgaW4gaXQKCQkJaWYgKCAhaXNFbXB0eURhdGFPYmplY3QoIGNhY2hlWyBpZCBdICkgKSB7CgkJCQlyZXR1cm47CgkJCX0KCQl9CgoJCS8vIERlc3Ryb3kgdGhlIGNhY2hlCgkJaWYgKCBpc05vZGUgKSB7CgkJCWpRdWVyeS5jbGVhbkRhdGEoIFsgZWxlbSBdLCB0cnVlICk7CgoJCS8vIFVzZSBkZWxldGUgd2hlbiBzdXBwb3J0ZWQgZm9yIGV4cGFuZG9zIG9yIGBjYWNoZWAgaXMgbm90IGEgd2luZG93IHBlciBpc1dpbmRvdyAoIzEwMDgwKQoJCX0gZWxzZSBpZiAoIGpRdWVyeS5zdXBwb3J0LmRlbGV0ZUV4cGFuZG8gfHwgY2FjaGUgIT0gY2FjaGUud2luZG93ICkgewoJCQlkZWxldGUgY2FjaGVbIGlkIF07CgoJCS8vIFdoZW4gYWxsIGVsc2UgZmFpbHMsIG51bGwKCQl9IGVsc2UgewoJCQljYWNoZVsgaWQgXSA9IG51bGw7CgkJfQoJfSwKCgkvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCglfZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7CgkJcmV0dXJuIGpRdWVyeS5kYXRhKCBlbGVtLCBuYW1lLCBkYXRhLCB0cnVlICk7Cgl9LAoKCS8vIEEgbWV0aG9kIGZvciBkZXRlcm1pbmluZyBpZiBhIERPTSBub2RlIGNhbiBoYW5kbGUgdGhlIGRhdGEgZXhwYW5kbwoJYWNjZXB0RGF0YTogZnVuY3Rpb24oIGVsZW0gKSB7CgkJdmFyIG5vRGF0YSA9IGVsZW0ubm9kZU5hbWUgJiYgalF1ZXJ5Lm5vRGF0YVsgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07CgoJCS8vIG5vZGVzIGFjY2VwdCBkYXRhIHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkOyByZWplY3Rpb24gY2FuIGJlIGNvbmRpdGlvbmFsCgkJcmV0dXJuICFub0RhdGEgfHwgbm9EYXRhICE9PSB0cnVlICYmIGVsZW0uZ2V0QXR0cmlidXRlKCJjbGFzc2lkIikgPT09IG5vRGF0YTsKCX0KfSk7CgpqUXVlcnkuZm4uZXh0ZW5kKHsKCWRhdGE6IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkgewoJCXZhciBwYXJ0cywgcGFydCwgYXR0ciwgbmFtZSwgbCwKCQkJZWxlbSA9IHRoaXNbMF0sCgkJCWkgPSAwLAoJCQlkYXRhID0gbnVsbDsKCgkJLy8gR2V0cyBhbGwgdmFsdWVzCgkJaWYgKCBrZXkgPT09IHVuZGVmaW5lZCApIHsKCQkJaWYgKCB0aGlzLmxlbmd0aCApIHsKCQkJCWRhdGEgPSBqUXVlcnkuZGF0YSggZWxlbSApOwoKCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAhalF1ZXJ5Ll9kYXRhKCBlbGVtLCAicGFyc2VkQXR0cnMiICkgKSB7CgkJCQkJYXR0ciA9IGVsZW0uYXR0cmlidXRlczsKCQkJCQlmb3IgKCBsID0gYXR0ci5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQkJCW5hbWUgPSBhdHRyW2ldLm5hbWU7CgoJCQkJCQlpZiAoICFuYW1lLmluZGV4T2YoICJkYXRhLSIgKSApIHsKCQkJCQkJCW5hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lLnN1YnN0cmluZyg1KSApOwoKCQkJCQkJCWRhdGFBdHRyKCBlbGVtLCBuYW1lLCBkYXRhWyBuYW1lIF0gKTsKCQkJCQkJfQoJCQkJCX0KCQkJCQlqUXVlcnkuX2RhdGEoIGVsZW0sICJwYXJzZWRBdHRycyIsIHRydWUgKTsKCQkJCX0KCQkJfQoKCQkJcmV0dXJuIGRhdGE7CgkJfQoKCQkvLyBTZXRzIG11bHRpcGxlIHZhbHVlcwoJCWlmICggdHlwZW9mIGtleSA9PT0gIm9iamVjdCIgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCQlqUXVlcnkuZGF0YSggdGhpcywga2V5ICk7CgkJCX0pOwoJCX0KCgkJcGFydHMgPSBrZXkuc3BsaXQoICIuIiwgMiApOwoJCXBhcnRzWzFdID0gcGFydHNbMV0gPyAiLiIgKyBwYXJ0c1sxXSA6ICIiOwoJCXBhcnQgPSBwYXJ0c1sxXSArICIhIjsKCgkJcmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHsKCgkJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHsKCQkJCWRhdGEgPSB0aGlzLnRyaWdnZXJIYW5kbGVyKCAiZ2V0RGF0YSIgKyBwYXJ0LCBbIHBhcnRzWzBdIF0gKTsKCgkJCQkvLyBUcnkgdG8gZmV0Y2ggYW55IGludGVybmFsbHkgc3RvcmVkIGRhdGEgZmlyc3QKCQkJCWlmICggZGF0YSA9PT0gdW5kZWZpbmVkICYmIGVsZW0gKSB7CgkJCQkJZGF0YSA9IGpRdWVyeS5kYXRhKCBlbGVtLCBrZXkgKTsKCQkJCQlkYXRhID0gZGF0YUF0dHIoIGVsZW0sIGtleSwgZGF0YSApOwoJCQkJfQoKCQkJCXJldHVybiBkYXRhID09PSB1bmRlZmluZWQgJiYgcGFydHNbMV0gPwoJCQkJCXRoaXMuZGF0YSggcGFydHNbMF0gKSA6CgkJCQkJZGF0YTsKCQkJfQoKCQkJcGFydHNbMV0gPSB2YWx1ZTsKCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIHNlbGYgPSBqUXVlcnkoIHRoaXMgKTsKCgkJCQlzZWxmLnRyaWdnZXJIYW5kbGVyKCAic2V0RGF0YSIgKyBwYXJ0LCBwYXJ0cyApOwoJCQkJalF1ZXJ5LmRhdGEoIHRoaXMsIGtleSwgdmFsdWUgKTsKCQkJCXNlbGYudHJpZ2dlckhhbmRsZXIoICJjaGFuZ2VEYXRhIiArIHBhcnQsIHBhcnRzICk7CgkJCX0pOwoJCX0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSwgbnVsbCwgZmFsc2UgKTsKCX0sCgoJcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGtleSApIHsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkucmVtb3ZlRGF0YSggdGhpcywga2V5ICk7CgkJfSk7Cgl9Cn0pOwoKZnVuY3Rpb24gZGF0YUF0dHIoIGVsZW0sIGtleSwgZGF0YSApIHsKCS8vIElmIG5vdGhpbmcgd2FzIGZvdW5kIGludGVybmFsbHksIHRyeSB0byBmZXRjaCBhbnkKCS8vIGRhdGEgZnJvbSB0aGUgSFRNTDUgZGF0YS0qIGF0dHJpYnV0ZQoJaWYgKCBkYXRhID09PSB1bmRlZmluZWQgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKCgkJdmFyIG5hbWUgPSAiZGF0YS0iICsga2V5LnJlcGxhY2UoIHJtdWx0aURhc2gsICItJDEiICkudG9Mb3dlckNhc2UoKTsKCgkJZGF0YSA9IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICk7CgoJCWlmICggdHlwZW9mIGRhdGEgPT09ICJzdHJpbmciICkgewoJCQl0cnkgewoJCQkJZGF0YSA9IGRhdGEgPT09ICJ0cnVlIiA/IHRydWUgOgoJCQkJZGF0YSA9PT0gImZhbHNlIiA/IGZhbHNlIDoKCQkJCWRhdGEgPT09ICJudWxsIiA/IG51bGwgOgoJCQkJLy8gT25seSBjb252ZXJ0IHRvIGEgbnVtYmVyIGlmIGl0IGRvZXNuJ3QgY2hhbmdlIHRoZSBzdHJpbmcKCQkJCStkYXRhICsgIiIgPT09IGRhdGEgPyArZGF0YSA6CgkJCQlyYnJhY2UudGVzdCggZGF0YSApID8galF1ZXJ5LnBhcnNlSlNPTiggZGF0YSApIDoKCQkJCQlkYXRhOwoJCQl9IGNhdGNoKCBlICkge30KCgkJCS8vIE1ha2Ugc3VyZSB3ZSBzZXQgdGhlIGRhdGEgc28gaXQgaXNuJ3QgY2hhbmdlZCBsYXRlcgoJCQlqUXVlcnkuZGF0YSggZWxlbSwga2V5LCBkYXRhICk7CgoJCX0gZWxzZSB7CgkJCWRhdGEgPSB1bmRlZmluZWQ7CgkJfQoJfQoKCXJldHVybiBkYXRhOwp9CgovLyBjaGVja3MgYSBjYWNoZSBvYmplY3QgZm9yIGVtcHRpbmVzcwpmdW5jdGlvbiBpc0VtcHR5RGF0YU9iamVjdCggb2JqICkgewoJdmFyIG5hbWU7Cglmb3IgKCBuYW1lIGluIG9iaiApIHsKCgkJLy8gaWYgdGhlIHB1YmxpYyBkYXRhIG9iamVjdCBpcyBlbXB0eSwgdGhlIHByaXZhdGUgaXMgc3RpbGwgZW1wdHkKCQlpZiAoIG5hbWUgPT09ICJkYXRhIiAmJiBqUXVlcnkuaXNFbXB0eU9iamVjdCggb2JqW25hbWVdICkgKSB7CgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAoIG5hbWUgIT09ICJ0b0pTT04iICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJfQoKCXJldHVybiB0cnVlOwp9CmpRdWVyeS5leHRlbmQoewoJcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBkYXRhICkgewoJCXZhciBxdWV1ZTsKCgkJaWYgKCBlbGVtICkgewoJCQl0eXBlID0gKCB0eXBlIHx8ICJmeCIgKSArICJxdWV1ZSI7CgkJCXF1ZXVlID0galF1ZXJ5Ll9kYXRhKCBlbGVtLCB0eXBlICk7CgoJCQkvLyBTcGVlZCB1cCBkZXF1ZXVlIGJ5IGdldHRpbmcgb3V0IHF1aWNrbHkgaWYgdGhpcyBpcyBqdXN0IGEgbG9va3VwCgkJCWlmICggZGF0YSApIHsKCQkJCWlmICggIXF1ZXVlIHx8IGpRdWVyeS5pc0FycmF5KGRhdGEpICkgewoJCQkJCXF1ZXVlID0galF1ZXJ5Ll9kYXRhKCBlbGVtLCB0eXBlLCBqUXVlcnkubWFrZUFycmF5KGRhdGEpICk7CgkJCQl9IGVsc2UgewoJCQkJCXF1ZXVlLnB1c2goIGRhdGEgKTsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gcXVldWUgfHwgW107CgkJfQoJfSwKCglkZXF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHsKCQl0eXBlID0gdHlwZSB8fCAiZngiOwoKCQl2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIGVsZW0sIHR5cGUgKSwKCQkJc3RhcnRMZW5ndGggPSBxdWV1ZS5sZW5ndGgsCgkJCWZuID0gcXVldWUuc2hpZnQoKSwKCQkJaG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sIHR5cGUgKSwKCQkJbmV4dCA9IGZ1bmN0aW9uKCkgewoJCQkJalF1ZXJ5LmRlcXVldWUoIGVsZW0sIHR5cGUgKTsKCQkJfTsKCgkJLy8gSWYgdGhlIGZ4IHF1ZXVlIGlzIGRlcXVldWVkLCBhbHdheXMgcmVtb3ZlIHRoZSBwcm9ncmVzcyBzZW50aW5lbAoJCWlmICggZm4gPT09ICJpbnByb2dyZXNzIiApIHsKCQkJZm4gPSBxdWV1ZS5zaGlmdCgpOwoJCQlzdGFydExlbmd0aC0tOwoJCX0KCgkJaWYgKCBmbiApIHsKCgkJCS8vIEFkZCBhIHByb2dyZXNzIHNlbnRpbmVsIHRvIHByZXZlbnQgdGhlIGZ4IHF1ZXVlIGZyb20gYmVpbmcKCQkJLy8gYXV0b21hdGljYWxseSBkZXF1ZXVlZAoJCQlpZiAoIHR5cGUgPT09ICJmeCIgKSB7CgkJCQlxdWV1ZS51bnNoaWZ0KCAiaW5wcm9ncmVzcyIgKTsKCQkJfQoKCQkJLy8gY2xlYXIgdXAgdGhlIGxhc3QgcXVldWUgc3RvcCBmdW5jdGlvbgoJCQlkZWxldGUgaG9va3Muc3RvcDsKCQkJZm4uY2FsbCggZWxlbSwgbmV4dCwgaG9va3MgKTsKCQl9CgoJCWlmICggIXN0YXJ0TGVuZ3RoICYmIGhvb2tzICkgewoJCQlob29rcy5lbXB0eS5maXJlKCk7CgkJfQoJfSwKCgkvLyBub3QgaW50ZW5kZWQgZm9yIHB1YmxpYyBjb25zdW1wdGlvbiAtIGdlbmVyYXRlcyBhIHF1ZXVlSG9va3Mgb2JqZWN0LCBvciByZXR1cm5zIHRoZSBjdXJyZW50IG9uZQoJX3F1ZXVlSG9va3M6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlICkgewoJCXZhciBrZXkgPSB0eXBlICsgInF1ZXVlSG9va3MiOwoJCXJldHVybiBqUXVlcnkuX2RhdGEoIGVsZW0sIGtleSApIHx8IGpRdWVyeS5fZGF0YSggZWxlbSwga2V5LCB7CgkJCWVtcHR5OiBqUXVlcnkuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLmFkZChmdW5jdGlvbigpIHsKCQkJCWpRdWVyeS5yZW1vdmVEYXRhKCBlbGVtLCB0eXBlICsgInF1ZXVlIiwgdHJ1ZSApOwoJCQkJalF1ZXJ5LnJlbW92ZURhdGEoIGVsZW0sIGtleSwgdHJ1ZSApOwoJCQl9KQoJCX0pOwoJfQp9KTsKCmpRdWVyeS5mbi5leHRlbmQoewoJcXVldWU6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgewoJCXZhciBzZXR0ZXIgPSAyOwoKCQlpZiAoIHR5cGVvZiB0eXBlICE9PSAic3RyaW5nIiApIHsKCQkJZGF0YSA9IHR5cGU7CgkJCXR5cGUgPSAiZngiOwoJCQlzZXR0ZXItLTsKCQl9CgoJCWlmICggYXJndW1lbnRzLmxlbmd0aCA8IHNldHRlciApIHsKCQkJcmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1swXSwgdHlwZSApOwoJCX0KCgkJcmV0dXJuIGRhdGEgPT09IHVuZGVmaW5lZCA/CgkJCXRoaXMgOgoJCQl0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCQl2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIGRhdGEgKTsKCgkJCQkvLyBlbnN1cmUgYSBob29rcyBmb3IgdGhpcyBxdWV1ZQoJCQkJalF1ZXJ5Ll9xdWV1ZUhvb2tzKCB0aGlzLCB0eXBlICk7CgoJCQkJaWYgKCB0eXBlID09PSAiZngiICYmIHF1ZXVlWzBdICE9PSAiaW5wcm9ncmVzcyIgKSB7CgkJCQkJalF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTsKCQkJCX0KCQkJfSk7Cgl9LAoJZGVxdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7CgkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJalF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTsKCQl9KTsKCX0sCgkvLyBCYXNlZCBvZmYgb2YgdGhlIHBsdWdpbiBieSBDbGludCBIZWxmZXJzLCB3aXRoIHBlcm1pc3Npb24uCgkvLyBodHRwOi8vYmxpbmRzaWduYWxzLmNvbS9pbmRleC5waHAvMjAwOS8wNy9qcXVlcnktZGVsYXkvCglkZWxheTogZnVuY3Rpb24oIHRpbWUsIHR5cGUgKSB7CgkJdGltZSA9IGpRdWVyeS5meCA/IGpRdWVyeS5meC5zcGVlZHNbIHRpbWUgXSB8fCB0aW1lIDogdGltZTsKCQl0eXBlID0gdHlwZSB8fCAiZngiOwoKCQlyZXR1cm4gdGhpcy5xdWV1ZSggdHlwZSwgZnVuY3Rpb24oIG5leHQsIGhvb2tzICkgewoJCQl2YXIgdGltZW91dCA9IHNldFRpbWVvdXQoIG5leHQsIHRpbWUgKTsKCQkJaG9va3Muc3RvcCA9IGZ1bmN0aW9uKCkgewoJCQkJY2xlYXJUaW1lb3V0KCB0aW1lb3V0ICk7CgkJCX07CgkJfSk7Cgl9LAoJY2xlYXJRdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7CgkJcmV0dXJuIHRoaXMucXVldWUoIHR5cGUgfHwgImZ4IiwgW10gKTsKCX0sCgkvLyBHZXQgYSBwcm9taXNlIHJlc29sdmVkIHdoZW4gcXVldWVzIG9mIGEgY2VydGFpbiB0eXBlCgkvLyBhcmUgZW1wdGllZCAoZnggaXMgdGhlIHR5cGUgYnkgZGVmYXVsdCkKCXByb21pc2U6IGZ1bmN0aW9uKCB0eXBlLCBvYmogKSB7CgkJdmFyIHRtcCwKCQkJY291bnQgPSAxLAoJCQlkZWZlciA9IGpRdWVyeS5EZWZlcnJlZCgpLAoJCQllbGVtZW50cyA9IHRoaXMsCgkJCWkgPSB0aGlzLmxlbmd0aCwKCQkJcmVzb2x2ZSA9IGZ1bmN0aW9uKCkgewoJCQkJaWYgKCAhKCAtLWNvdW50ICkgKSB7CgkJCQkJZGVmZXIucmVzb2x2ZVdpdGgoIGVsZW1lbnRzLCBbIGVsZW1lbnRzIF0gKTsKCQkJCX0KCQkJfTsKCgkJaWYgKCB0eXBlb2YgdHlwZSAhPT0gInN0cmluZyIgKSB7CgkJCW9iaiA9IHR5cGU7CgkJCXR5cGUgPSB1bmRlZmluZWQ7CgkJfQoJCXR5cGUgPSB0eXBlIHx8ICJmeCI7CgoJCXdoaWxlKCBpLS0gKSB7CgkJCXRtcCA9IGpRdWVyeS5fZGF0YSggZWxlbWVudHNbIGkgXSwgdHlwZSArICJxdWV1ZUhvb2tzIiApOwoJCQlpZiAoIHRtcCAmJiB0bXAuZW1wdHkgKSB7CgkJCQljb3VudCsrOwoJCQkJdG1wLmVtcHR5LmFkZCggcmVzb2x2ZSApOwoJCQl9CgkJfQoJCXJlc29sdmUoKTsKCQlyZXR1cm4gZGVmZXIucHJvbWlzZSggb2JqICk7Cgl9Cn0pOwp2YXIgbm9kZUhvb2ssIGJvb2xIb29rLCBmaXhTcGVjaWZpZWQsCglyY2xhc3MgPSAvW1x0XHJcbl0vZywKCXJyZXR1cm4gPSAvXHIvZywKCXJ0eXBlID0gL14oPzpidXR0b258aW5wdXQpJC9pLAoJcmZvY3VzYWJsZSA9IC9eKD86YnV0dG9ufGlucHV0fG9iamVjdHxzZWxlY3R8dGV4dGFyZWEpJC9pLAoJcmNsaWNrYWJsZSA9IC9eYSg/OnJlYXwpJC9pLAoJcmJvb2xlYW4gPSAvXig/OmF1dG9mb2N1c3xhdXRvcGxheXxhc3luY3xjaGVja2VkfGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkfHNlbGVjdGVkKSQvaSwKCWdldFNldEF0dHJpYnV0ZSA9IGpRdWVyeS5zdXBwb3J0LmdldFNldEF0dHJpYnV0ZTsKCmpRdWVyeS5mbi5leHRlbmQoewoJYXR0cjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkgewoJCXJldHVybiBqUXVlcnkuYWNjZXNzKCB0aGlzLCBqUXVlcnkuYXR0ciwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7Cgl9LAoKCXJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBuYW1lICkgewoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCWpRdWVyeS5yZW1vdmVBdHRyKCB0aGlzLCBuYW1lICk7CgkJfSk7Cgl9LAoKCXByb3A6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsKCQlyZXR1cm4galF1ZXJ5LmFjY2VzcyggdGhpcywgalF1ZXJ5LnByb3AsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApOwoJfSwKCglyZW1vdmVQcm9wOiBmdW5jdGlvbiggbmFtZSApIHsKCQluYW1lID0galF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lOwoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCS8vIHRyeS9jYXRjaCBoYW5kbGVzIGNhc2VzIHdoZXJlIElFIGJhbGtzIChzdWNoIGFzIHJlbW92aW5nIGEgcHJvcGVydHkgb24gd2luZG93KQoJCQl0cnkgewoJCQkJdGhpc1sgbmFtZSBdID0gdW5kZWZpbmVkOwoJCQkJZGVsZXRlIHRoaXNbIG5hbWUgXTsKCQkJfSBjYXRjaCggZSApIHt9CgkJfSk7Cgl9LAoKCWFkZENsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJdmFyIGNsYXNzTmFtZXMsIGksIGwsIGVsZW0sCgkJCXNldENsYXNzLCBjLCBjbDsKCgkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaiApIHsKCQkJCWpRdWVyeSggdGhpcyApLmFkZENsYXNzKCB2YWx1ZS5jYWxsKHRoaXMsIGosIHRoaXMuY2xhc3NOYW1lKSApOwoJCQl9KTsKCQl9CgoJCWlmICggdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiApIHsKCQkJY2xhc3NOYW1lcyA9IHZhbHVlLnNwbGl0KCBjb3JlX3JzcGFjZSApOwoKCQkJZm9yICggaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQkJCWVsZW0gPSB0aGlzWyBpIF07CgoJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCWlmICggIWVsZW0uY2xhc3NOYW1lICYmIGNsYXNzTmFtZXMubGVuZ3RoID09PSAxICkgewoJCQkJCQllbGVtLmNsYXNzTmFtZSA9IHZhbHVlOwoKCQkJCQl9IGVsc2UgewoJCQkJCQlzZXRDbGFzcyA9ICIgIiArIGVsZW0uY2xhc3NOYW1lICsgIiAiOwoKCQkJCQkJZm9yICggYyA9IDAsIGNsID0gY2xhc3NOYW1lcy5sZW5ndGg7IGMgPCBjbDsgYysrICkgewoJCQkJCQkJaWYgKCBzZXRDbGFzcy5pbmRleE9mKCAiICIgKyBjbGFzc05hbWVzWyBjIF0gKyAiICIgKSA8IDAgKSB7CgkJCQkJCQkJc2V0Q2xhc3MgKz0gY2xhc3NOYW1lc1sgYyBdICsgIiAiOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWVsZW0uY2xhc3NOYW1lID0galF1ZXJ5LnRyaW0oIHNldENsYXNzICk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJcmVtb3ZlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQl2YXIgcmVtb3ZlcywgY2xhc3NOYW1lLCBlbGVtLCBjLCBjbCwgaSwgbDsKCgkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaiApIHsKCQkJCWpRdWVyeSggdGhpcyApLnJlbW92ZUNsYXNzKCB2YWx1ZS5jYWxsKHRoaXMsIGosIHRoaXMuY2xhc3NOYW1lKSApOwoJCQl9KTsKCQl9CgkJaWYgKCAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIikgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCApIHsKCQkJcmVtb3ZlcyA9ICggdmFsdWUgfHwgIiIgKS5zcGxpdCggY29yZV9yc3BhY2UgKTsKCgkJCWZvciAoIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQllbGVtID0gdGhpc1sgaSBdOwoJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmIGVsZW0uY2xhc3NOYW1lICkgewoKCQkJCQljbGFzc05hbWUgPSAoIiAiICsgZWxlbS5jbGFzc05hbWUgKyAiICIpLnJlcGxhY2UoIHJjbGFzcywgIiAiICk7CgoJCQkJCS8vIGxvb3Agb3ZlciBlYWNoIGl0ZW0gaW4gdGhlIHJlbW92YWwgbGlzdAoJCQkJCWZvciAoIGMgPSAwLCBjbCA9IHJlbW92ZXMubGVuZ3RoOyBjIDwgY2w7IGMrKyApIHsKCQkJCQkJLy8gUmVtb3ZlIHVudGlsIHRoZXJlIGlzIG5vdGhpbmcgdG8gcmVtb3ZlLAoJCQkJCQl3aGlsZSAoIGNsYXNzTmFtZS5pbmRleE9mKCIgIiArIHJlbW92ZXNbIGMgXSArICIgIikgPj0gMCApIHsKCQkJCQkJCWNsYXNzTmFtZSA9IGNsYXNzTmFtZS5yZXBsYWNlKCAiICIgKyByZW1vdmVzWyBjIF0gKyAiICIgLCAiICIgKTsKCQkJCQkJfQoJCQkJCX0KCQkJCQllbGVtLmNsYXNzTmFtZSA9IHZhbHVlID8galF1ZXJ5LnRyaW0oIGNsYXNzTmFtZSApIDogIiI7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiB0aGlzOwoJfSwKCgl0b2dnbGVDbGFzczogZnVuY3Rpb24oIHZhbHVlLCBzdGF0ZVZhbCApIHsKCQl2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZSwKCQkJaXNCb29sID0gdHlwZW9mIHN0YXRlVmFsID09PSAiYm9vbGVhbiI7CgoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7CgkJCQlqUXVlcnkoIHRoaXMgKS50b2dnbGVDbGFzcyggdmFsdWUuY2FsbCh0aGlzLCBpLCB0aGlzLmNsYXNzTmFtZSwgc3RhdGVWYWwpLCBzdGF0ZVZhbCApOwoJCQl9KTsKCQl9CgoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCWlmICggdHlwZSA9PT0gInN0cmluZyIgKSB7CgkJCQkvLyB0b2dnbGUgaW5kaXZpZHVhbCBjbGFzcyBuYW1lcwoJCQkJdmFyIGNsYXNzTmFtZSwKCQkJCQlpID0gMCwKCQkJCQlzZWxmID0galF1ZXJ5KCB0aGlzICksCgkJCQkJc3RhdGUgPSBzdGF0ZVZhbCwKCQkJCQljbGFzc05hbWVzID0gdmFsdWUuc3BsaXQoIGNvcmVfcnNwYWNlICk7CgoJCQkJd2hpbGUgKCAoY2xhc3NOYW1lID0gY2xhc3NOYW1lc1sgaSsrIF0pICkgewoJCQkJCS8vIGNoZWNrIGVhY2ggY2xhc3NOYW1lIGdpdmVuLCBzcGFjZSBzZXBhcmF0ZWQgbGlzdAoJCQkJCXN0YXRlID0gaXNCb29sID8gc3RhdGUgOiAhc2VsZi5oYXNDbGFzcyggY2xhc3NOYW1lICk7CgkJCQkJc2VsZlsgc3RhdGUgPyAiYWRkQ2xhc3MiIDogInJlbW92ZUNsYXNzIiBdKCBjbGFzc05hbWUgKTsKCQkJCX0KCgkJCX0gZWxzZSBpZiAoIHR5cGUgPT09ICJ1bmRlZmluZWQiIHx8IHR5cGUgPT09ICJib29sZWFuIiApIHsKCQkJCWlmICggdGhpcy5jbGFzc05hbWUgKSB7CgkJCQkJLy8gc3RvcmUgY2xhc3NOYW1lIGlmIHNldAoJCQkJCWpRdWVyeS5fZGF0YSggdGhpcywgIl9fY2xhc3NOYW1lX18iLCB0aGlzLmNsYXNzTmFtZSApOwoJCQkJfQoKCQkJCS8vIHRvZ2dsZSB3aG9sZSBjbGFzc05hbWUKCQkJCXRoaXMuY2xhc3NOYW1lID0gdGhpcy5jbGFzc05hbWUgfHwgdmFsdWUgPT09IGZhbHNlID8gIiIgOiBqUXVlcnkuX2RhdGEoIHRoaXMsICJfX2NsYXNzTmFtZV9fIiApIHx8ICIiOwoJCQl9CgkJfSk7Cgl9LAoKCWhhc0NsYXNzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJdmFyIGNsYXNzTmFtZSA9ICIgIiArIHNlbGVjdG9yICsgIiAiLAoJCQlpID0gMCwKCQkJbCA9IHRoaXMubGVuZ3RoOwoJCWZvciAoIDsgaSA8IGw7IGkrKyApIHsKCQkJaWYgKCB0aGlzW2ldLm5vZGVUeXBlID09PSAxICYmICgiICIgKyB0aGlzW2ldLmNsYXNzTmFtZSArICIgIikucmVwbGFjZShyY2xhc3MsICIgIikuaW5kZXhPZiggY2xhc3NOYW1lICkgPj0gMCApIHsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJfQoKCQlyZXR1cm4gZmFsc2U7Cgl9LAoKCXZhbDogZnVuY3Rpb24oIHZhbHVlICkgewoJCXZhciBob29rcywgcmV0LCBpc0Z1bmN0aW9uLAoJCQllbGVtID0gdGhpc1swXTsKCgkJaWYgKCAhYXJndW1lbnRzLmxlbmd0aCApIHsKCQkJaWYgKCBlbGVtICkgewoJCQkJaG9va3MgPSBqUXVlcnkudmFsSG9va3NbIGVsZW0udHlwZSBdIHx8IGpRdWVyeS52YWxIb29rc1sgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07CgoJCQkJaWYgKCBob29rcyAmJiAiZ2V0IiBpbiBob29rcyAmJiAocmV0ID0gaG9va3MuZ2V0KCBlbGVtLCAidmFsdWUiICkpICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJcmV0dXJuIHJldDsKCQkJCX0KCgkJCQlyZXQgPSBlbGVtLnZhbHVlOwoKCQkJCXJldHVybiB0eXBlb2YgcmV0ID09PSAic3RyaW5nIiA/CgkJCQkJLy8gaGFuZGxlIG1vc3QgY29tbW9uIHN0cmluZyBjYXNlcwoJCQkJCXJldC5yZXBsYWNlKHJyZXR1cm4sICIiKSA6CgkJCQkJLy8gaGFuZGxlIGNhc2VzIHdoZXJlIHZhbHVlIGlzIG51bGwvdW5kZWYgb3IgbnVtYmVyCgkJCQkJcmV0ID09IG51bGwgPyAiIiA6IHJldDsKCQkJfQoKCQkJcmV0dXJuOwoJCX0KCgkJaXNGdW5jdGlvbiA9IGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApOwoKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBpICkgewoJCQl2YXIgdmFsLAoJCQkJc2VsZiA9IGpRdWVyeSh0aGlzKTsKCgkJCWlmICggdGhpcy5ub2RlVHlwZSAhPT0gMSApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJaWYgKCBpc0Z1bmN0aW9uICkgewoJCQkJdmFsID0gdmFsdWUuY2FsbCggdGhpcywgaSwgc2VsZi52YWwoKSApOwoJCQl9IGVsc2UgewoJCQkJdmFsID0gdmFsdWU7CgkJCX0KCgkJCS8vIFRyZWF0IG51bGwvdW5kZWZpbmVkIGFzICIiOyBjb252ZXJ0IG51bWJlcnMgdG8gc3RyaW5nCgkJCWlmICggdmFsID09IG51bGwgKSB7CgkJCQl2YWwgPSAiIjsKCQkJfSBlbHNlIGlmICggdHlwZW9mIHZhbCA9PT0gIm51bWJlciIgKSB7CgkJCQl2YWwgKz0gIiI7CgkJCX0gZWxzZSBpZiAoIGpRdWVyeS5pc0FycmF5KCB2YWwgKSApIHsKCQkJCXZhbCA9IGpRdWVyeS5tYXAodmFsLCBmdW5jdGlvbiAoIHZhbHVlICkgewoJCQkJCXJldHVybiB2YWx1ZSA9PSBudWxsID8gIiIgOiB2YWx1ZSArICIiOwoJCQkJfSk7CgkJCX0KCgkJCWhvb2tzID0galF1ZXJ5LnZhbEhvb2tzWyB0aGlzLnR5cGUgXSB8fCBqUXVlcnkudmFsSG9va3NbIHRoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKSBdOwoKCQkJLy8gSWYgc2V0IHJldHVybnMgdW5kZWZpbmVkLCBmYWxsIGJhY2sgdG8gbm9ybWFsIHNldHRpbmcKCQkJaWYgKCAhaG9va3MgfHwgISgic2V0IiBpbiBob29rcykgfHwgaG9va3Muc2V0KCB0aGlzLCB2YWwsICJ2YWx1ZSIgKSA9PT0gdW5kZWZpbmVkICkgewoJCQkJdGhpcy52YWx1ZSA9IHZhbDsKCQkJfQoJCX0pOwoJfQp9KTsKCmpRdWVyeS5leHRlbmQoewoJdmFsSG9va3M6IHsKCQlvcHRpb246IHsKCQkJZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKCQkJCS8vIGF0dHJpYnV0ZXMudmFsdWUgaXMgdW5kZWZpbmVkIGluIEJsYWNrYmVycnkgNC43IGJ1dAoJCQkJLy8gdXNlcyAudmFsdWUuIFNlZSAjNjkzMgoJCQkJdmFyIHZhbCA9IGVsZW0uYXR0cmlidXRlcy52YWx1ZTsKCQkJCXJldHVybiAhdmFsIHx8IHZhbC5zcGVjaWZpZWQgPyBlbGVtLnZhbHVlIDogZWxlbS50ZXh0OwoJCQl9CgkJfSwKCQlzZWxlY3Q6IHsKCQkJZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKCQkJCXZhciB2YWx1ZSwgb3B0aW9uLAoJCQkJCW9wdGlvbnMgPSBlbGVtLm9wdGlvbnMsCgkJCQkJaW5kZXggPSBlbGVtLnNlbGVjdGVkSW5kZXgsCgkJCQkJb25lID0gZWxlbS50eXBlID09PSAic2VsZWN0LW9uZSIgfHwgaW5kZXggPCAwLAoJCQkJCXZhbHVlcyA9IG9uZSA/IG51bGwgOiBbXSwKCQkJCQltYXggPSBvbmUgPyBpbmRleCArIDEgOiBvcHRpb25zLmxlbmd0aCwKCQkJCQlpID0gaW5kZXggPCAwID8KCQkJCQkJbWF4IDoKCQkJCQkJb25lID8gaW5kZXggOiAwOwoKCQkJCS8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIHNlbGVjdGVkIG9wdGlvbnMKCQkJCWZvciAoIDsgaSA8IG1heDsgaSsrICkgewoJCQkJCW9wdGlvbiA9IG9wdGlvbnNbIGkgXTsKCgkJCQkJLy8gb2xkSUUgZG9lc24ndCB1cGRhdGUgc2VsZWN0ZWQgYWZ0ZXIgZm9ybSByZXNldCAoIzI1NTEpCgkJCQkJaWYgKCAoIG9wdGlvbi5zZWxlY3RlZCB8fCBpID09PSBpbmRleCApICYmCgkJCQkJCQkvLyBEb24ndCByZXR1cm4gb3B0aW9ucyB0aGF0IGFyZSBkaXNhYmxlZCBvciBpbiBhIGRpc2FibGVkIG9wdGdyb3VwCgkJCQkJCQkoIGpRdWVyeS5zdXBwb3J0Lm9wdERpc2FibGVkID8gIW9wdGlvbi5kaXNhYmxlZCA6IG9wdGlvbi5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIikgPT09IG51bGwgKSAmJgoJCQkJCQkJKCAhb3B0aW9uLnBhcmVudE5vZGUuZGlzYWJsZWQgfHwgIWpRdWVyeS5ub2RlTmFtZSggb3B0aW9uLnBhcmVudE5vZGUsICJvcHRncm91cCIgKSApICkgewoKCQkJCQkJLy8gR2V0IHRoZSBzcGVjaWZpYyB2YWx1ZSBmb3IgdGhlIG9wdGlvbgoJCQkJCQl2YWx1ZSA9IGpRdWVyeSggb3B0aW9uICkudmFsKCk7CgoJCQkJCQkvLyBXZSBkb24ndCBuZWVkIGFuIGFycmF5IGZvciBvbmUgc2VsZWN0cwoJCQkJCQlpZiAoIG9uZSApIHsKCQkJCQkJCXJldHVybiB2YWx1ZTsKCQkJCQkJfQoKCQkJCQkJLy8gTXVsdGktU2VsZWN0cyByZXR1cm4gYW4gYXJyYXkKCQkJCQkJdmFsdWVzLnB1c2goIHZhbHVlICk7CgkJCQkJfQoJCQkJfQoKCQkJCXJldHVybiB2YWx1ZXM7CgkJCX0sCgoJCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKCQkJCXZhciB2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KCB2YWx1ZSApOwoKCQkJCWpRdWVyeShlbGVtKS5maW5kKCJvcHRpb24iKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJCXRoaXMuc2VsZWN0ZWQgPSBqUXVlcnkuaW5BcnJheSggalF1ZXJ5KHRoaXMpLnZhbCgpLCB2YWx1ZXMgKSA+PSAwOwoJCQkJfSk7CgoJCQkJaWYgKCAhdmFsdWVzLmxlbmd0aCApIHsKCQkJCQllbGVtLnNlbGVjdGVkSW5kZXggPSAtMTsKCQkJCX0KCQkJCXJldHVybiB2YWx1ZXM7CgkJCX0KCQl9Cgl9LAoKCS8vIFVudXNlZCBpbiAxLjgsIGxlZnQgaW4gc28gYXR0ckZuLXN0YWJiZXJzIHdvbid0IGRpZTsgcmVtb3ZlIGluIDEuOQoJYXR0ckZuOiB7fSwKCglhdHRyOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUsIHBhc3MgKSB7CgkJdmFyIHJldCwgaG9va3MsIG5vdHhtbCwKCQkJblR5cGUgPSBlbGVtLm5vZGVUeXBlOwoKCQkvLyBkb24ndCBnZXQvc2V0IGF0dHJpYnV0ZXMgb24gdGV4dCwgY29tbWVudCBhbmQgYXR0cmlidXRlIG5vZGVzCgkJaWYgKCAhZWxlbSB8fCBuVHlwZSA9PT0gMyB8fCBuVHlwZSA9PT0gOCB8fCBuVHlwZSA9PT0gMiApIHsKCQkJcmV0dXJuOwoJCX0KCgkJaWYgKCBwYXNzICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBqUXVlcnkuZm5bIG5hbWUgXSApICkgewoJCQlyZXR1cm4galF1ZXJ5KCBlbGVtIClbIG5hbWUgXSggdmFsdWUgKTsKCQl9CgoJCS8vIEZhbGxiYWNrIHRvIHByb3Agd2hlbiBhdHRyaWJ1dGVzIGFyZSBub3Qgc3VwcG9ydGVkCgkJaWYgKCB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGUgPT09ICJ1bmRlZmluZWQiICkgewoJCQlyZXR1cm4galF1ZXJ5LnByb3AoIGVsZW0sIG5hbWUsIHZhbHVlICk7CgkJfQoKCQlub3R4bWwgPSBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICk7CgoJCS8vIEFsbCBhdHRyaWJ1dGVzIGFyZSBsb3dlcmNhc2UKCQkvLyBHcmFiIG5lY2Vzc2FyeSBob29rIGlmIG9uZSBpcyBkZWZpbmVkCgkJaWYgKCBub3R4bWwgKSB7CgkJCW5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CgkJCWhvb2tzID0galF1ZXJ5LmF0dHJIb29rc1sgbmFtZSBdIHx8ICggcmJvb2xlYW4udGVzdCggbmFtZSApID8gYm9vbEhvb2sgOiBub2RlSG9vayApOwoJCX0KCgkJaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgewoKCQkJaWYgKCB2YWx1ZSA9PT0gbnVsbCApIHsKCQkJCWpRdWVyeS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7CgkJCQlyZXR1cm47CgoJCQl9IGVsc2UgaWYgKCBob29rcyAmJiAic2V0IiBpbiBob29rcyAmJiBub3R4bWwgJiYgKHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSkgIT09IHVuZGVmaW5lZCApIHsKCQkJCXJldHVybiByZXQ7CgoJCQl9IGVsc2UgewoJCQkJZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsIHZhbHVlICsgIiIgKTsKCQkJCXJldHVybiB2YWx1ZTsKCQkJfQoKCQl9IGVsc2UgaWYgKCBob29rcyAmJiAiZ2V0IiBpbiBob29rcyAmJiBub3R4bWwgJiYgKHJldCA9IGhvb2tzLmdldCggZWxlbSwgbmFtZSApKSAhPT0gbnVsbCApIHsKCQkJcmV0dXJuIHJldDsKCgkJfSBlbHNlIHsKCgkJCXJldCA9IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICk7CgoJCQkvLyBOb24tZXhpc3RlbnQgYXR0cmlidXRlcyByZXR1cm4gbnVsbCwgd2Ugbm9ybWFsaXplIHRvIHVuZGVmaW5lZAoJCQlyZXR1cm4gcmV0ID09PSBudWxsID8KCQkJCXVuZGVmaW5lZCA6CgkJCQlyZXQ7CgkJfQoJfSwKCglyZW1vdmVBdHRyOiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJdmFyIHByb3BOYW1lLCBhdHRyTmFtZXMsIG5hbWUsIGlzQm9vbCwKCQkJaSA9IDA7CgoJCWlmICggdmFsdWUgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKCgkJCWF0dHJOYW1lcyA9IHZhbHVlLnNwbGl0KCBjb3JlX3JzcGFjZSApOwoKCQkJZm9yICggOyBpIDwgYXR0ck5hbWVzLmxlbmd0aDsgaSsrICkgewoJCQkJbmFtZSA9IGF0dHJOYW1lc1sgaSBdOwoKCQkJCWlmICggbmFtZSApIHsKCQkJCQlwcm9wTmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTsKCQkJCQlpc0Jvb2wgPSByYm9vbGVhbi50ZXN0KCBuYW1lICk7CgoJCQkJCS8vIFNlZSAjOTY5OSBmb3IgZXhwbGFuYXRpb24gb2YgdGhpcyBhcHByb2FjaCAoc2V0dGluZyBmaXJzdCwgdGhlbiByZW1vdmFsKQoJCQkJCS8vIERvIG5vdCBkbyB0aGlzIGZvciBib29sZWFuIGF0dHJpYnV0ZXMgKHNlZSAjMTA4NzApCgkJCQkJaWYgKCAhaXNCb29sICkgewoJCQkJCQlqUXVlcnkuYXR0ciggZWxlbSwgbmFtZSwgIiIgKTsKCQkJCQl9CgkJCQkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIGdldFNldEF0dHJpYnV0ZSA/IG5hbWUgOiBwcm9wTmFtZSApOwoKCQkJCQkvLyBTZXQgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSB0byBmYWxzZSBmb3IgYm9vbGVhbiBhdHRyaWJ1dGVzCgkJCQkJaWYgKCBpc0Jvb2wgJiYgcHJvcE5hbWUgaW4gZWxlbSApIHsKCQkJCQkJZWxlbVsgcHJvcE5hbWUgXSA9IGZhbHNlOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCX0sCgoJYXR0ckhvb2tzOiB7CgkJdHlwZTogewoJCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKCQkJCS8vIFdlIGNhbid0IGFsbG93IHRoZSB0eXBlIHByb3BlcnR5IHRvIGJlIGNoYW5nZWQgKHNpbmNlIGl0IGNhdXNlcyBwcm9ibGVtcyBpbiBJRSkKCQkJCWlmICggcnR5cGUudGVzdCggZWxlbS5ub2RlTmFtZSApICYmIGVsZW0ucGFyZW50Tm9kZSApIHsKCQkJCQlqUXVlcnkuZXJyb3IoICJ0eXBlIHByb3BlcnR5IGNhbid0IGJlIGNoYW5nZWQiICk7CgkJCQl9IGVsc2UgaWYgKCAhalF1ZXJ5LnN1cHBvcnQucmFkaW9WYWx1ZSAmJiB2YWx1ZSA9PT0gInJhZGlvIiAmJiBqUXVlcnkubm9kZU5hbWUoZWxlbSwgImlucHV0IikgKSB7CgkJCQkJLy8gU2V0dGluZyB0aGUgdHlwZSBvbiBhIHJhZGlvIGJ1dHRvbiBhZnRlciB0aGUgdmFsdWUgcmVzZXRzIHRoZSB2YWx1ZSBpbiBJRTYtOQoJCQkJCS8vIFJlc2V0IHZhbHVlIHRvIGl0J3MgZGVmYXVsdCBpbiBjYXNlIHR5cGUgaXMgc2V0IGFmdGVyIHZhbHVlCgkJCQkJLy8gVGhpcyBpcyBmb3IgZWxlbWVudCBjcmVhdGlvbgoJCQkJCXZhciB2YWwgPSBlbGVtLnZhbHVlOwoJCQkJCWVsZW0uc2V0QXR0cmlidXRlKCAidHlwZSIsIHZhbHVlICk7CgkJCQkJaWYgKCB2YWwgKSB7CgkJCQkJCWVsZW0udmFsdWUgPSB2YWw7CgkJCQkJfQoJCQkJCXJldHVybiB2YWx1ZTsKCQkJCX0KCQkJfQoJCX0sCgkJLy8gVXNlIHRoZSB2YWx1ZSBwcm9wZXJ0eSBmb3IgYmFjayBjb21wYXQKCQkvLyBVc2UgdGhlIG5vZGVIb29rIGZvciBidXR0b24gZWxlbWVudHMgaW4gSUU2LzcgKCMxOTU0KQoJCXZhbHVlOiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CgkJCQlpZiAoIG5vZGVIb29rICYmIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImJ1dHRvbiIgKSApIHsKCQkJCQlyZXR1cm4gbm9kZUhvb2suZ2V0KCBlbGVtLCBuYW1lICk7CgkJCQl9CgkJCQlyZXR1cm4gbmFtZSBpbiBlbGVtID8KCQkJCQllbGVtLnZhbHVlIDoKCQkJCQludWxsOwoJCQl9LAoJCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgbmFtZSApIHsKCQkJCWlmICggbm9kZUhvb2sgJiYgalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAiYnV0dG9uIiApICkgewoJCQkJCXJldHVybiBub2RlSG9vay5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICk7CgkJCQl9CgkJCQkvLyBEb2VzIG5vdCByZXR1cm4gc28gdGhhdCBzZXRBdHRyaWJ1dGUgaXMgYWxzbyB1c2VkCgkJCQllbGVtLnZhbHVlID0gdmFsdWU7CgkJCX0KCQl9Cgl9LAoKCXByb3BGaXg6IHsKCQl0YWJpbmRleDogInRhYkluZGV4IiwKCQlyZWFkb25seTogInJlYWRPbmx5IiwKCQkiZm9yIjogImh0bWxGb3IiLAoJCSJjbGFzcyI6ICJjbGFzc05hbWUiLAoJCW1heGxlbmd0aDogIm1heExlbmd0aCIsCgkJY2VsbHNwYWNpbmc6ICJjZWxsU3BhY2luZyIsCgkJY2VsbHBhZGRpbmc6ICJjZWxsUGFkZGluZyIsCgkJcm93c3BhbjogInJvd1NwYW4iLAoJCWNvbHNwYW46ICJjb2xTcGFuIiwKCQl1c2VtYXA6ICJ1c2VNYXAiLAoJCWZyYW1lYm9yZGVyOiAiZnJhbWVCb3JkZXIiLAoJCWNvbnRlbnRlZGl0YWJsZTogImNvbnRlbnRFZGl0YWJsZSIKCX0sCgoJcHJvcDogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkgewoJCXZhciByZXQsIGhvb2tzLCBub3R4bWwsCgkJCW5UeXBlID0gZWxlbS5ub2RlVHlwZTsKCgkJLy8gZG9uJ3QgZ2V0L3NldCBwcm9wZXJ0aWVzIG9uIHRleHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBub2RlcwoJCWlmICggIWVsZW0gfHwgblR5cGUgPT09IDMgfHwgblR5cGUgPT09IDggfHwgblR5cGUgPT09IDIgKSB7CgkJCXJldHVybjsKCQl9CgoJCW5vdHhtbCA9IG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKTsKCgkJaWYgKCBub3R4bWwgKSB7CgkJCS8vIEZpeCBuYW1lIGFuZCBhdHRhY2ggaG9va3MKCQkJbmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTsKCQkJaG9va3MgPSBqUXVlcnkucHJvcEhvb2tzWyBuYW1lIF07CgkJfQoKCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJCWlmICggaG9va3MgJiYgInNldCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSkgIT09IHVuZGVmaW5lZCApIHsKCQkJCXJldHVybiByZXQ7CgoJCQl9IGVsc2UgewoJCQkJcmV0dXJuICggZWxlbVsgbmFtZSBdID0gdmFsdWUgKTsKCQkJfQoKCQl9IGVsc2UgewoJCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sIG5hbWUgKSkgIT09IG51bGwgKSB7CgkJCQlyZXR1cm4gcmV0OwoKCQkJfSBlbHNlIHsKCQkJCXJldHVybiBlbGVtWyBuYW1lIF07CgkJCX0KCQl9Cgl9LAoKCXByb3BIb29rczogewoJCXRhYkluZGV4OiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQkvLyBlbGVtLnRhYkluZGV4IGRvZXNuJ3QgYWx3YXlzIHJldHVybiB0aGUgY29ycmVjdCB2YWx1ZSB3aGVuIGl0IGhhc24ndCBiZWVuIGV4cGxpY2l0bHkgc2V0CgkJCQkvLyBodHRwOi8vZmx1aWRwcm9qZWN0Lm9yZy9ibG9nLzIwMDgvMDEvMDkvZ2V0dGluZy1zZXR0aW5nLWFuZC1yZW1vdmluZy10YWJpbmRleC12YWx1ZXMtd2l0aC1qYXZhc2NyaXB0LwoJCQkJdmFyIGF0dHJpYnV0ZU5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoInRhYmluZGV4Iik7CgoJCQkJcmV0dXJuIGF0dHJpYnV0ZU5vZGUgJiYgYXR0cmlidXRlTm9kZS5zcGVjaWZpZWQgPwoJCQkJCXBhcnNlSW50KCBhdHRyaWJ1dGVOb2RlLnZhbHVlLCAxMCApIDoKCQkJCQlyZm9jdXNhYmxlLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSB8fCByY2xpY2thYmxlLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSAmJiBlbGVtLmhyZWYgPwoJCQkJCQkwIDoKCQkJCQkJdW5kZWZpbmVkOwoJCQl9CgkJfQoJfQp9KTsKCi8vIEhvb2sgZm9yIGJvb2xlYW4gYXR0cmlidXRlcwpib29sSG9vayA9IHsKCWdldDogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CgkJLy8gQWxpZ24gYm9vbGVhbiBhdHRyaWJ1dGVzIHdpdGggY29ycmVzcG9uZGluZyBwcm9wZXJ0aWVzCgkJLy8gRmFsbCBiYWNrIHRvIGF0dHJpYnV0ZSBwcmVzZW5jZSB3aGVyZSBzb21lIGJvb2xlYW5zIGFyZSBub3Qgc3VwcG9ydGVkCgkJdmFyIGF0dHJOb2RlLAoJCQlwcm9wZXJ0eSA9IGpRdWVyeS5wcm9wKCBlbGVtLCBuYW1lICk7CgkJcmV0dXJuIHByb3BlcnR5ID09PSB0cnVlIHx8IHR5cGVvZiBwcm9wZXJ0eSAhPT0gImJvb2xlYW4iICYmICggYXR0ck5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUobmFtZSkgKSAmJiBhdHRyTm9kZS5ub2RlVmFsdWUgIT09IGZhbHNlID8KCQkJbmFtZS50b0xvd2VyQ2FzZSgpIDoKCQkJdW5kZWZpbmVkOwoJfSwKCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkgewoJCXZhciBwcm9wTmFtZTsKCQlpZiAoIHZhbHVlID09PSBmYWxzZSApIHsKCQkJLy8gUmVtb3ZlIGJvb2xlYW4gYXR0cmlidXRlcyB3aGVuIHNldCB0byBmYWxzZQoJCQlqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApOwoJCX0gZWxzZSB7CgkJCS8vIHZhbHVlIGlzIHRydWUgc2luY2Ugd2Uga25vdyBhdCB0aGlzIHBvaW50IGl0J3MgdHlwZSBib29sZWFuIGFuZCBub3QgZmFsc2UKCQkJLy8gU2V0IGJvb2xlYW4gYXR0cmlidXRlcyB0byB0aGUgc2FtZSBuYW1lIGFuZCBzZXQgdGhlIERPTSBwcm9wZXJ0eQoJCQlwcm9wTmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTsKCQkJaWYgKCBwcm9wTmFtZSBpbiBlbGVtICkgewoJCQkJLy8gT25seSBzZXQgdGhlIElETCBzcGVjaWZpY2FsbHkgaWYgaXQgYWxyZWFkeSBleGlzdHMgb24gdGhlIGVsZW1lbnQKCQkJCWVsZW1bIHByb3BOYW1lIF0gPSB0cnVlOwoJCQl9CgoJCQllbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgbmFtZS50b0xvd2VyQ2FzZSgpICk7CgkJfQoJCXJldHVybiBuYW1lOwoJfQp9OwoKLy8gSUU2LzcgZG8gbm90IHN1cHBvcnQgZ2V0dGluZy9zZXR0aW5nIHNvbWUgYXR0cmlidXRlcyB3aXRoIGdldC9zZXRBdHRyaWJ1dGUKaWYgKCAhZ2V0U2V0QXR0cmlidXRlICkgewoKCWZpeFNwZWNpZmllZCA9IHsKCQluYW1lOiB0cnVlLAoJCWlkOiB0cnVlLAoJCWNvb3JkczogdHJ1ZQoJfTsKCgkvLyBVc2UgdGhpcyBmb3IgYW55IGF0dHJpYnV0ZSBpbiBJRTYvNwoJLy8gVGhpcyBmaXhlcyBhbG1vc3QgZXZlcnkgSUU2LzcgaXNzdWUKCW5vZGVIb29rID0galF1ZXJ5LnZhbEhvb2tzLmJ1dHRvbiA9IHsKCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewoJCQl2YXIgcmV0OwoJCQlyZXQgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoIG5hbWUgKTsKCQkJcmV0dXJuIHJldCAmJiAoIGZpeFNwZWNpZmllZFsgbmFtZSBdID8gcmV0LnZhbHVlICE9PSAiIiA6IHJldC5zcGVjaWZpZWQgKSA/CgkJCQlyZXQudmFsdWUgOgoJCQkJdW5kZWZpbmVkOwoJCX0sCgkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIG5hbWUgKSB7CgkJCS8vIFNldCB0aGUgZXhpc3Rpbmcgb3IgY3JlYXRlIGEgbmV3IGF0dHJpYnV0ZSBub2RlCgkJCXZhciByZXQgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoIG5hbWUgKTsKCQkJaWYgKCAhcmV0ICkgewoJCQkJcmV0ID0gZG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKCBuYW1lICk7CgkJCQllbGVtLnNldEF0dHJpYnV0ZU5vZGUoIHJldCApOwoJCQl9CgkJCXJldHVybiAoIHJldC52YWx1ZSA9IHZhbHVlICsgIiIgKTsKCQl9Cgl9OwoKCS8vIFNldCB3aWR0aCBhbmQgaGVpZ2h0IHRvIGF1dG8gaW5zdGVhZCBvZiAwIG9uIGVtcHR5IHN0cmluZyggQnVnICM4MTUwICkKCS8vIFRoaXMgaXMgZm9yIHJlbW92YWxzCglqUXVlcnkuZWFjaChbICJ3aWR0aCIsICJoZWlnaHQiIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkgewoJCWpRdWVyeS5hdHRySG9va3NbIG5hbWUgXSA9IGpRdWVyeS5leHRlbmQoIGpRdWVyeS5hdHRySG9va3NbIG5hbWUgXSwgewoJCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKCQkJCWlmICggdmFsdWUgPT09ICIiICkgewoJCQkJCWVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCAiYXV0byIgKTsKCQkJCQlyZXR1cm4gdmFsdWU7CgkJCQl9CgkJCX0KCQl9KTsKCX0pOwoKCS8vIFNldCBjb250ZW50ZWRpdGFibGUgdG8gZmFsc2Ugb24gcmVtb3ZhbHMoIzEwNDI5KQoJLy8gU2V0dGluZyB0byBlbXB0eSBzdHJpbmcgdGhyb3dzIGFuIGVycm9yIGFzIGFuIGludmFsaWQgdmFsdWUKCWpRdWVyeS5hdHRySG9va3MuY29udGVudGVkaXRhYmxlID0gewoJCWdldDogbm9kZUhvb2suZ2V0LAoJCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkgewoJCQlpZiAoIHZhbHVlID09PSAiIiApIHsKCQkJCXZhbHVlID0gImZhbHNlIjsKCQkJfQoJCQlub2RlSG9vay5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICk7CgkJfQoJfTsKfQoKCi8vIFNvbWUgYXR0cmlidXRlcyByZXF1aXJlIGEgc3BlY2lhbCBjYWxsIG9uIElFCmlmICggIWpRdWVyeS5zdXBwb3J0LmhyZWZOb3JtYWxpemVkICkgewoJalF1ZXJ5LmVhY2goWyAiaHJlZiIsICJzcmMiLCAid2lkdGgiLCAiaGVpZ2h0IiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKCQlqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0gPSBqUXVlcnkuZXh0ZW5kKCBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0sIHsKCQkJZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKCQkJCXZhciByZXQgPSBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSwgMiApOwoJCQkJcmV0dXJuIHJldCA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IHJldDsKCQkJfQoJCX0pOwoJfSk7Cn0KCmlmICggIWpRdWVyeS5zdXBwb3J0LnN0eWxlICkgewoJalF1ZXJ5LmF0dHJIb29rcy5zdHlsZSA9IHsKCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQkvLyBSZXR1cm4gdW5kZWZpbmVkIGluIHRoZSBjYXNlIG9mIGVtcHR5IHN0cmluZwoJCQkvLyBOb3JtYWxpemUgdG8gbG93ZXJjYXNlIHNpbmNlIElFIHVwcGVyY2FzZXMgY3NzIHByb3BlcnR5IG5hbWVzCgkJCXJldHVybiBlbGVtLnN0eWxlLmNzc1RleHQudG9Mb3dlckNhc2UoKSB8fCB1bmRlZmluZWQ7CgkJfSwKCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKCQkJcmV0dXJuICggZWxlbS5zdHlsZS5jc3NUZXh0ID0gdmFsdWUgKyAiIiApOwoJCX0KCX07Cn0KCi8vIFNhZmFyaSBtaXMtcmVwb3J0cyB0aGUgZGVmYXVsdCBzZWxlY3RlZCBwcm9wZXJ0eSBvZiBhbiBvcHRpb24KLy8gQWNjZXNzaW5nIHRoZSBwYXJlbnQncyBzZWxlY3RlZEluZGV4IHByb3BlcnR5IGZpeGVzIGl0CmlmICggIWpRdWVyeS5zdXBwb3J0Lm9wdFNlbGVjdGVkICkgewoJalF1ZXJ5LnByb3BIb29rcy5zZWxlY3RlZCA9IGpRdWVyeS5leHRlbmQoIGpRdWVyeS5wcm9wSG9va3Muc2VsZWN0ZWQsIHsKCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQl2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlOwoKCQkJaWYgKCBwYXJlbnQgKSB7CgkJCQlwYXJlbnQuc2VsZWN0ZWRJbmRleDsKCgkJCQkvLyBNYWtlIHN1cmUgdGhhdCBpdCBhbHNvIHdvcmtzIHdpdGggb3B0Z3JvdXBzLCBzZWUgIzU3MDEKCQkJCWlmICggcGFyZW50LnBhcmVudE5vZGUgKSB7CgkJCQkJcGFyZW50LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9KTsKfQoKLy8gSUU2LzcgY2FsbCBlbmN0eXBlIGVuY29kaW5nCmlmICggIWpRdWVyeS5zdXBwb3J0LmVuY3R5cGUgKSB7CglqUXVlcnkucHJvcEZpeC5lbmN0eXBlID0gImVuY29kaW5nIjsKfQoKLy8gUmFkaW9zIGFuZCBjaGVja2JveGVzIGdldHRlci9zZXR0ZXIKaWYgKCAhalF1ZXJ5LnN1cHBvcnQuY2hlY2tPbiApIHsKCWpRdWVyeS5lYWNoKFsgInJhZGlvIiwgImNoZWNrYm94IiBdLCBmdW5jdGlvbigpIHsKCQlqUXVlcnkudmFsSG9va3NbIHRoaXMgXSA9IHsKCQkJZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKCQkJCS8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBpbiBXZWJraXQgIiIgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiAib24iIGlmIGEgdmFsdWUgaXNuJ3Qgc3BlY2lmaWVkCgkJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoInZhbHVlIikgPT09IG51bGwgPyAib24iIDogZWxlbS52YWx1ZTsKCQkJfQoJCX07Cgl9KTsKfQpqUXVlcnkuZWFjaChbICJyYWRpbyIsICJjaGVja2JveCIgXSwgZnVuY3Rpb24oKSB7CglqUXVlcnkudmFsSG9va3NbIHRoaXMgXSA9IGpRdWVyeS5leHRlbmQoIGpRdWVyeS52YWxIb29rc1sgdGhpcyBdLCB7CgkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCWlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbHVlICkgKSB7CgkJCQlyZXR1cm4gKCBlbGVtLmNoZWNrZWQgPSBqUXVlcnkuaW5BcnJheSggalF1ZXJ5KGVsZW0pLnZhbCgpLCB2YWx1ZSApID49IDAgKTsKCQkJfQoJCX0KCX0pOwp9KTsKdmFyIHJmb3JtRWxlbXMgPSAvXig/OnRleHRhcmVhfGlucHV0fHNlbGVjdCkkL2ksCglydHlwZW5hbWVzcGFjZSA9IC9eKFteXC5dKnwpKD86XC4oLispfCkkLywKCXJob3ZlckhhY2sgPSAvKD86Xnxccylob3ZlcihcLlxTK3wpXGIvLAoJcmtleUV2ZW50ID0gL15rZXkvLAoJcm1vdXNlRXZlbnQgPSAvXig/Om1vdXNlfGNvbnRleHRtZW51KXxjbGljay8sCglyZm9jdXNNb3JwaCA9IC9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLywKCWhvdmVySGFjayA9IGZ1bmN0aW9uKCBldmVudHMgKSB7CgkJcmV0dXJuIGpRdWVyeS5ldmVudC5zcGVjaWFsLmhvdmVyID8gZXZlbnRzIDogZXZlbnRzLnJlcGxhY2UoIHJob3ZlckhhY2ssICJtb3VzZWVudGVyJDEgbW91c2VsZWF2ZSQxIiApOwoJfTsKCi8qCiAqIEhlbHBlciBmdW5jdGlvbnMgZm9yIG1hbmFnaW5nIGV2ZW50cyAtLSBub3QgcGFydCBvZiB0aGUgcHVibGljIGludGVyZmFjZS4KICogUHJvcHMgdG8gRGVhbiBFZHdhcmRzJyBhZGRFdmVudCBsaWJyYXJ5IGZvciBtYW55IG9mIHRoZSBpZGVhcy4KICovCmpRdWVyeS5ldmVudCA9IHsKCglhZGQ6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgZGF0YSwgc2VsZWN0b3IgKSB7CgoJCXZhciBlbGVtRGF0YSwgZXZlbnRIYW5kbGUsIGV2ZW50cywKCQkJdCwgdG5zLCB0eXBlLCBuYW1lc3BhY2VzLCBoYW5kbGVPYmosCgkJCWhhbmRsZU9iakluLCBoYW5kbGVycywgc3BlY2lhbDsKCgkJLy8gRG9uJ3QgYXR0YWNoIGV2ZW50cyB0byBub0RhdGEgb3IgdGV4dC9jb21tZW50IG5vZGVzIChhbGxvdyBwbGFpbiBvYmplY3RzIHRobykKCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCB8fCAhdHlwZXMgfHwgIWhhbmRsZXIgfHwgIShlbGVtRGF0YSA9IGpRdWVyeS5fZGF0YSggZWxlbSApKSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gQ2FsbGVyIGNhbiBwYXNzIGluIGFuIG9iamVjdCBvZiBjdXN0b20gZGF0YSBpbiBsaWV1IG9mIHRoZSBoYW5kbGVyCgkJaWYgKCBoYW5kbGVyLmhhbmRsZXIgKSB7CgkJCWhhbmRsZU9iakluID0gaGFuZGxlcjsKCQkJaGFuZGxlciA9IGhhbmRsZU9iakluLmhhbmRsZXI7CgkJCXNlbGVjdG9yID0gaGFuZGxlT2JqSW4uc2VsZWN0b3I7CgkJfQoKCQkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgaGFuZGxlciBoYXMgYSB1bmlxdWUgSUQsIHVzZWQgdG8gZmluZC9yZW1vdmUgaXQgbGF0ZXIKCQlpZiAoICFoYW5kbGVyLmd1aWQgKSB7CgkJCWhhbmRsZXIuZ3VpZCA9IGpRdWVyeS5ndWlkKys7CgkJfQoKCQkvLyBJbml0IHRoZSBlbGVtZW50J3MgZXZlbnQgc3RydWN0dXJlIGFuZCBtYWluIGhhbmRsZXIsIGlmIHRoaXMgaXMgdGhlIGZpcnN0CgkJZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzOwoJCWlmICggIWV2ZW50cyApIHsKCQkJZWxlbURhdGEuZXZlbnRzID0gZXZlbnRzID0ge307CgkJfQoJCWV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlOwoJCWlmICggIWV2ZW50SGFuZGxlICkgewoJCQllbGVtRGF0YS5oYW5kbGUgPSBldmVudEhhbmRsZSA9IGZ1bmN0aW9uKCBlICkgewoJCQkJLy8gRGlzY2FyZCB0aGUgc2Vjb25kIGV2ZW50IG9mIGEgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoKSBhbmQKCQkJCS8vIHdoZW4gYW4gZXZlbnQgaXMgY2FsbGVkIGFmdGVyIGEgcGFnZSBoYXMgdW5sb2FkZWQKCQkJCXJldHVybiB0eXBlb2YgalF1ZXJ5ICE9PSAidW5kZWZpbmVkIiAmJiAoIWUgfHwgalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCAhPT0gZS50eXBlKSA/CgkJCQkJalF1ZXJ5LmV2ZW50LmRpc3BhdGNoLmFwcGx5KCBldmVudEhhbmRsZS5lbGVtLCBhcmd1bWVudHMgKSA6CgkJCQkJdW5kZWZpbmVkOwoJCQl9OwoJCQkvLyBBZGQgZWxlbSBhcyBhIHByb3BlcnR5IG9mIHRoZSBoYW5kbGUgZm4gdG8gcHJldmVudCBhIG1lbW9yeSBsZWFrIHdpdGggSUUgbm9uLW5hdGl2ZSBldmVudHMKCQkJZXZlbnRIYW5kbGUuZWxlbSA9IGVsZW07CgkJfQoKCQkvLyBIYW5kbGUgbXVsdGlwbGUgZXZlbnRzIHNlcGFyYXRlZCBieSBhIHNwYWNlCgkJLy8galF1ZXJ5KC4uLikuYmluZCgibW91c2VvdmVyIG1vdXNlb3V0IiwgZm4pOwoJCXR5cGVzID0galF1ZXJ5LnRyaW0oIGhvdmVySGFjayh0eXBlcykgKS5zcGxpdCggIiAiICk7CgkJZm9yICggdCA9IDA7IHQgPCB0eXBlcy5sZW5ndGg7IHQrKyApIHsKCgkJCXRucyA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMoIHR5cGVzW3RdICkgfHwgW107CgkJCXR5cGUgPSB0bnNbMV07CgkJCW5hbWVzcGFjZXMgPSAoIHRuc1syXSB8fCAiIiApLnNwbGl0KCAiLiIgKS5zb3J0KCk7CgoJCQkvLyBJZiBldmVudCBjaGFuZ2VzIGl0cyB0eXBlLCB1c2UgdGhlIHNwZWNpYWwgZXZlbnQgaGFuZGxlcnMgZm9yIHRoZSBjaGFuZ2VkIHR5cGUKCQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307CgoJCQkvLyBJZiBzZWxlY3RvciBkZWZpbmVkLCBkZXRlcm1pbmUgc3BlY2lhbCBldmVudCBhcGkgdHlwZSwgb3RoZXJ3aXNlIGdpdmVuIHR5cGUKCQkJdHlwZSA9ICggc2VsZWN0b3IgPyBzcGVjaWFsLmRlbGVnYXRlVHlwZSA6IHNwZWNpYWwuYmluZFR5cGUgKSB8fCB0eXBlOwoKCQkJLy8gVXBkYXRlIHNwZWNpYWwgYmFzZWQgb24gbmV3bHkgcmVzZXQgdHlwZQoJCQlzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKCgkJCS8vIGhhbmRsZU9iaiBpcyBwYXNzZWQgdG8gYWxsIGV2ZW50IGhhbmRsZXJzCgkJCWhhbmRsZU9iaiA9IGpRdWVyeS5leHRlbmQoewoJCQkJdHlwZTogdHlwZSwKCQkJCW9yaWdUeXBlOiB0bnNbMV0sCgkJCQlkYXRhOiBkYXRhLAoJCQkJaGFuZGxlcjogaGFuZGxlciwKCQkJCWd1aWQ6IGhhbmRsZXIuZ3VpZCwKCQkJCXNlbGVjdG9yOiBzZWxlY3RvciwKCQkJCW5lZWRzQ29udGV4dDogc2VsZWN0b3IgJiYgalF1ZXJ5LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9yICksCgkJCQluYW1lc3BhY2U6IG5hbWVzcGFjZXMuam9pbigiLiIpCgkJCX0sIGhhbmRsZU9iakluICk7CgoJCQkvLyBJbml0IHRoZSBldmVudCBoYW5kbGVyIHF1ZXVlIGlmIHdlJ3JlIHRoZSBmaXJzdAoJCQloYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdOwoJCQlpZiAoICFoYW5kbGVycyApIHsKCQkJCWhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gPSBbXTsKCQkJCWhhbmRsZXJzLmRlbGVnYXRlQ291bnQgPSAwOwoKCQkJCS8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIvYXR0YWNoRXZlbnQgaWYgdGhlIHNwZWNpYWwgZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZQoJCQkJaWYgKCAhc3BlY2lhbC5zZXR1cCB8fCBzcGVjaWFsLnNldHVwLmNhbGwoIGVsZW0sIGRhdGEsIG5hbWVzcGFjZXMsIGV2ZW50SGFuZGxlICkgPT09IGZhbHNlICkgewoJCQkJCS8vIEJpbmQgdGhlIGdsb2JhbCBldmVudCBoYW5kbGVyIHRvIHRoZSBlbGVtZW50CgkJCQkJaWYgKCBlbGVtLmFkZEV2ZW50TGlzdGVuZXIgKSB7CgkJCQkJCWVsZW0uYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgZXZlbnRIYW5kbGUsIGZhbHNlICk7CgoJCQkJCX0gZWxzZSBpZiAoIGVsZW0uYXR0YWNoRXZlbnQgKSB7CgkJCQkJCWVsZW0uYXR0YWNoRXZlbnQoICJvbiIgKyB0eXBlLCBldmVudEhhbmRsZSApOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJaWYgKCBzcGVjaWFsLmFkZCApIHsKCQkJCXNwZWNpYWwuYWRkLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApOwoKCQkJCWlmICggIWhhbmRsZU9iai5oYW5kbGVyLmd1aWQgKSB7CgkJCQkJaGFuZGxlT2JqLmhhbmRsZXIuZ3VpZCA9IGhhbmRsZXIuZ3VpZDsKCQkJCX0KCQkJfQoKCQkJLy8gQWRkIHRvIHRoZSBlbGVtZW50J3MgaGFuZGxlciBsaXN0LCBkZWxlZ2F0ZXMgaW4gZnJvbnQKCQkJaWYgKCBzZWxlY3RvciApIHsKCQkJCWhhbmRsZXJzLnNwbGljZSggaGFuZGxlcnMuZGVsZWdhdGVDb3VudCsrLCAwLCBoYW5kbGVPYmogKTsKCQkJfSBlbHNlIHsKCQkJCWhhbmRsZXJzLnB1c2goIGhhbmRsZU9iaiApOwoJCQl9CgoJCQkvLyBLZWVwIHRyYWNrIG9mIHdoaWNoIGV2ZW50cyBoYXZlIGV2ZXIgYmVlbiB1c2VkLCBmb3IgZXZlbnQgb3B0aW1pemF0aW9uCgkJCWpRdWVyeS5ldmVudC5nbG9iYWxbIHR5cGUgXSA9IHRydWU7CgkJfQoKCQkvLyBOdWxsaWZ5IGVsZW0gdG8gcHJldmVudCBtZW1vcnkgbGVha3MgaW4gSUUKCQllbGVtID0gbnVsbDsKCX0sCgoJZ2xvYmFsOiB7fSwKCgkvLyBEZXRhY2ggYW4gZXZlbnQgb3Igc2V0IG9mIGV2ZW50cyBmcm9tIGFuIGVsZW1lbnQKCXJlbW92ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBzZWxlY3RvciwgbWFwcGVkVHlwZXMgKSB7CgoJCXZhciB0LCB0bnMsIHR5cGUsIG9yaWdUeXBlLCBuYW1lc3BhY2VzLCBvcmlnQ291bnQsCgkJCWosIGV2ZW50cywgc3BlY2lhbCwgZXZlbnRUeXBlLCBoYW5kbGVPYmosCgkJCWVsZW1EYXRhID0galF1ZXJ5Lmhhc0RhdGEoIGVsZW0gKSAmJiBqUXVlcnkuX2RhdGEoIGVsZW0gKTsKCgkJaWYgKCAhZWxlbURhdGEgfHwgIShldmVudHMgPSBlbGVtRGF0YS5ldmVudHMpICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBPbmNlIGZvciBlYWNoIHR5cGUubmFtZXNwYWNlIGluIHR5cGVzOyB0eXBlIG1heSBiZSBvbWl0dGVkCgkJdHlwZXMgPSBqUXVlcnkudHJpbSggaG92ZXJIYWNrKCB0eXBlcyB8fCAiIiApICkuc3BsaXQoIiAiKTsKCQlmb3IgKCB0ID0gMDsgdCA8IHR5cGVzLmxlbmd0aDsgdCsrICkgewoJCQl0bnMgPSBydHlwZW5hbWVzcGFjZS5leGVjKCB0eXBlc1t0XSApIHx8IFtdOwoJCQl0eXBlID0gb3JpZ1R5cGUgPSB0bnNbMV07CgkJCW5hbWVzcGFjZXMgPSB0bnNbMl07CgoJCQkvLyBVbmJpbmQgYWxsIGV2ZW50cyAob24gdGhpcyBuYW1lc3BhY2UsIGlmIHByb3ZpZGVkKSBmb3IgdGhlIGVsZW1lbnQKCQkJaWYgKCAhdHlwZSApIHsKCQkJCWZvciAoIHR5cGUgaW4gZXZlbnRzICkgewoJCQkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIGVsZW0sIHR5cGUgKyB0eXBlc1sgdCBdLCBoYW5kbGVyLCBzZWxlY3RvciwgdHJ1ZSApOwoJCQkJfQoJCQkJY29udGludWU7CgkJCX0KCgkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9OwoJCQl0eXBlID0gKCBzZWxlY3Rvcj8gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgOiBzcGVjaWFsLmJpbmRUeXBlICkgfHwgdHlwZTsKCQkJZXZlbnRUeXBlID0gZXZlbnRzWyB0eXBlIF0gfHwgW107CgkJCW9yaWdDb3VudCA9IGV2ZW50VHlwZS5sZW5ndGg7CgkJCW5hbWVzcGFjZXMgPSBuYW1lc3BhY2VzID8gbmV3IFJlZ0V4cCgiKF58XFwuKSIgKyBuYW1lc3BhY2VzLnNwbGl0KCIuIikuc29ydCgpLmpvaW4oIlxcLig/Oi4qXFwufCkiKSArICIoXFwufCQpIikgOiBudWxsOwoKCQkJLy8gUmVtb3ZlIG1hdGNoaW5nIGV2ZW50cwoJCQlmb3IgKCBqID0gMDsgaiA8IGV2ZW50VHlwZS5sZW5ndGg7IGorKyApIHsKCQkJCWhhbmRsZU9iaiA9IGV2ZW50VHlwZVsgaiBdOwoKCQkJCWlmICggKCBtYXBwZWRUeXBlcyB8fCBvcmlnVHlwZSA9PT0gaGFuZGxlT2JqLm9yaWdUeXBlICkgJiYKCQkJCQkgKCAhaGFuZGxlciB8fCBoYW5kbGVyLmd1aWQgPT09IGhhbmRsZU9iai5ndWlkICkgJiYKCQkJCQkgKCAhbmFtZXNwYWNlcyB8fCBuYW1lc3BhY2VzLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApICYmCgkJCQkJICggIXNlbGVjdG9yIHx8IHNlbGVjdG9yID09PSBoYW5kbGVPYmouc2VsZWN0b3IgfHwgc2VsZWN0b3IgPT09ICIqKiIgJiYgaGFuZGxlT2JqLnNlbGVjdG9yICkgKSB7CgkJCQkJZXZlbnRUeXBlLnNwbGljZSggai0tLCAxICk7CgoJCQkJCWlmICggaGFuZGxlT2JqLnNlbGVjdG9yICkgewoJCQkJCQlldmVudFR5cGUuZGVsZWdhdGVDb3VudC0tOwoJCQkJCX0KCQkJCQlpZiAoIHNwZWNpYWwucmVtb3ZlICkgewoJCQkJCQlzcGVjaWFsLnJlbW92ZS5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCS8vIFJlbW92ZSBnZW5lcmljIGV2ZW50IGhhbmRsZXIgaWYgd2UgcmVtb3ZlZCBzb21ldGhpbmcgYW5kIG5vIG1vcmUgaGFuZGxlcnMgZXhpc3QKCQkJLy8gKGF2b2lkcyBwb3RlbnRpYWwgZm9yIGVuZGxlc3MgcmVjdXJzaW9uIGR1cmluZyByZW1vdmFsIG9mIHNwZWNpYWwgZXZlbnQgaGFuZGxlcnMpCgkJCWlmICggZXZlbnRUeXBlLmxlbmd0aCA9PT0gMCAmJiBvcmlnQ291bnQgIT09IGV2ZW50VHlwZS5sZW5ndGggKSB7CgkJCQlpZiAoICFzcGVjaWFsLnRlYXJkb3duIHx8IHNwZWNpYWwudGVhcmRvd24uY2FsbCggZWxlbSwgbmFtZXNwYWNlcywgZWxlbURhdGEuaGFuZGxlICkgPT09IGZhbHNlICkgewoJCQkJCWpRdWVyeS5yZW1vdmVFdmVudCggZWxlbSwgdHlwZSwgZWxlbURhdGEuaGFuZGxlICk7CgkJCQl9CgoJCQkJZGVsZXRlIGV2ZW50c1sgdHlwZSBdOwoJCQl9CgkJfQoKCQkvLyBSZW1vdmUgdGhlIGV4cGFuZG8gaWYgaXQncyBubyBsb25nZXIgdXNlZAoJCWlmICggalF1ZXJ5LmlzRW1wdHlPYmplY3QoIGV2ZW50cyApICkgewoJCQlkZWxldGUgZWxlbURhdGEuaGFuZGxlOwoKCQkJLy8gcmVtb3ZlRGF0YSBhbHNvIGNoZWNrcyBmb3IgZW1wdGluZXNzIGFuZCBjbGVhcnMgdGhlIGV4cGFuZG8gaWYgZW1wdHkKCQkJLy8gc28gdXNlIGl0IGluc3RlYWQgb2YgZGVsZXRlCgkJCWpRdWVyeS5yZW1vdmVEYXRhKCBlbGVtLCAiZXZlbnRzIiwgdHJ1ZSApOwoJCX0KCX0sCgoJLy8gRXZlbnRzIHRoYXQgYXJlIHNhZmUgdG8gc2hvcnQtY2lyY3VpdCBpZiBubyBoYW5kbGVycyBhcmUgYXR0YWNoZWQuCgkvLyBOYXRpdmUgRE9NIGV2ZW50cyBzaG91bGQgbm90IGJlIGFkZGVkLCB0aGV5IG1heSBoYXZlIGlubGluZSBoYW5kbGVycy4KCWN1c3RvbUV2ZW50OiB7CgkJImdldERhdGEiOiB0cnVlLAoJCSJzZXREYXRhIjogdHJ1ZSwKCQkiY2hhbmdlRGF0YSI6IHRydWUKCX0sCgoJdHJpZ2dlcjogZnVuY3Rpb24oIGV2ZW50LCBkYXRhLCBlbGVtLCBvbmx5SGFuZGxlcnMgKSB7CgkJLy8gRG9uJ3QgZG8gZXZlbnRzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXMKCQlpZiAoIGVsZW0gJiYgKGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCkgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIEV2ZW50IG9iamVjdCBvciBldmVudCB0eXBlCgkJdmFyIGNhY2hlLCBleGNsdXNpdmUsIGksIGN1ciwgb2xkLCBvbnR5cGUsIHNwZWNpYWwsIGhhbmRsZSwgZXZlbnRQYXRoLCBidWJibGVUeXBlLAoJCQl0eXBlID0gZXZlbnQudHlwZSB8fCBldmVudCwKCQkJbmFtZXNwYWNlcyA9IFtdOwoKCQkvLyBmb2N1cy9ibHVyIG1vcnBocyB0byBmb2N1c2luL291dDsgZW5zdXJlIHdlJ3JlIG5vdCBmaXJpbmcgdGhlbSByaWdodCBub3cKCQlpZiAoIHJmb2N1c01vcnBoLnRlc3QoIHR5cGUgKyBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICkgKSB7CgkJCXJldHVybjsKCQl9CgoJCWlmICggdHlwZS5pbmRleE9mKCAiISIgKSA+PSAwICkgewoJCQkvLyBFeGNsdXNpdmUgZXZlbnRzIHRyaWdnZXIgb25seSBmb3IgdGhlIGV4YWN0IGV2ZW50IChubyBuYW1lc3BhY2VzKQoJCQl0eXBlID0gdHlwZS5zbGljZSgwLCAtMSk7CgkJCWV4Y2x1c2l2ZSA9IHRydWU7CgkJfQoKCQlpZiAoIHR5cGUuaW5kZXhPZiggIi4iICkgPj0gMCApIHsKCQkJLy8gTmFtZXNwYWNlZCB0cmlnZ2VyOyBjcmVhdGUgYSByZWdleHAgdG8gbWF0Y2ggZXZlbnQgdHlwZSBpbiBoYW5kbGUoKQoJCQluYW1lc3BhY2VzID0gdHlwZS5zcGxpdCgiLiIpOwoJCQl0eXBlID0gbmFtZXNwYWNlcy5zaGlmdCgpOwoJCQluYW1lc3BhY2VzLnNvcnQoKTsKCQl9CgoJCWlmICggKCFlbGVtIHx8IGpRdWVyeS5ldmVudC5jdXN0b21FdmVudFsgdHlwZSBdKSAmJiAhalF1ZXJ5LmV2ZW50Lmdsb2JhbFsgdHlwZSBdICkgewoJCQkvLyBObyBqUXVlcnkgaGFuZGxlcnMgZm9yIHRoaXMgZXZlbnQgdHlwZSwgYW5kIGl0IGNhbid0IGhhdmUgaW5saW5lIGhhbmRsZXJzCgkJCXJldHVybjsKCQl9CgoJCS8vIENhbGxlciBjYW4gcGFzcyBpbiBhbiBFdmVudCwgT2JqZWN0LCBvciBqdXN0IGFuIGV2ZW50IHR5cGUgc3RyaW5nCgkJZXZlbnQgPSB0eXBlb2YgZXZlbnQgPT09ICJvYmplY3QiID8KCQkJLy8galF1ZXJ5LkV2ZW50IG9iamVjdAoJCQlldmVudFsgalF1ZXJ5LmV4cGFuZG8gXSA/IGV2ZW50IDoKCQkJLy8gT2JqZWN0IGxpdGVyYWwKCQkJbmV3IGpRdWVyeS5FdmVudCggdHlwZSwgZXZlbnQgKSA6CgkJCS8vIEp1c3QgdGhlIGV2ZW50IHR5cGUgKHN0cmluZykKCQkJbmV3IGpRdWVyeS5FdmVudCggdHlwZSApOwoKCQlldmVudC50eXBlID0gdHlwZTsKCQlldmVudC5pc1RyaWdnZXIgPSB0cnVlOwoJCWV2ZW50LmV4Y2x1c2l2ZSA9IGV4Y2x1c2l2ZTsKCQlldmVudC5uYW1lc3BhY2UgPSBuYW1lc3BhY2VzLmpvaW4oICIuIiApOwoJCWV2ZW50Lm5hbWVzcGFjZV9yZSA9IGV2ZW50Lm5hbWVzcGFjZT8gbmV3IFJlZ0V4cCgiKF58XFwuKSIgKyBuYW1lc3BhY2VzLmpvaW4oIlxcLig/Oi4qXFwufCkiKSArICIoXFwufCQpIikgOiBudWxsOwoJCW9udHlwZSA9IHR5cGUuaW5kZXhPZiggIjoiICkgPCAwID8gIm9uIiArIHR5cGUgOiAiIjsKCgkJLy8gSGFuZGxlIGEgZ2xvYmFsIHRyaWdnZXIKCQlpZiAoICFlbGVtICkgewoKCQkJLy8gVE9ETzogU3RvcCB0YXVudGluZyB0aGUgZGF0YSBjYWNoZTsgcmVtb3ZlIGdsb2JhbCBldmVudHMgYW5kIGFsd2F5cyBhdHRhY2ggdG8gZG9jdW1lbnQKCQkJY2FjaGUgPSBqUXVlcnkuY2FjaGU7CgkJCWZvciAoIGkgaW4gY2FjaGUgKSB7CgkJCQlpZiAoIGNhY2hlWyBpIF0uZXZlbnRzICYmIGNhY2hlWyBpIF0uZXZlbnRzWyB0eXBlIF0gKSB7CgkJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGV2ZW50LCBkYXRhLCBjYWNoZVsgaSBdLmhhbmRsZS5lbGVtLCB0cnVlICk7CgkJCQl9CgkJCX0KCQkJcmV0dXJuOwoJCX0KCgkJLy8gQ2xlYW4gdXAgdGhlIGV2ZW50IGluIGNhc2UgaXQgaXMgYmVpbmcgcmV1c2VkCgkJZXZlbnQucmVzdWx0ID0gdW5kZWZpbmVkOwoJCWlmICggIWV2ZW50LnRhcmdldCApIHsKCQkJZXZlbnQudGFyZ2V0ID0gZWxlbTsKCQl9CgoJCS8vIENsb25lIGFueSBpbmNvbWluZyBkYXRhIGFuZCBwcmVwZW5kIHRoZSBldmVudCwgY3JlYXRpbmcgdGhlIGhhbmRsZXIgYXJnIGxpc3QKCQlkYXRhID0gZGF0YSAhPSBudWxsID8galF1ZXJ5Lm1ha2VBcnJheSggZGF0YSApIDogW107CgkJZGF0YS51bnNoaWZ0KCBldmVudCApOwoKCQkvLyBBbGxvdyBzcGVjaWFsIGV2ZW50cyB0byBkcmF3IG91dHNpZGUgdGhlIGxpbmVzCgkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307CgkJaWYgKCBzcGVjaWFsLnRyaWdnZXIgJiYgc3BlY2lhbC50cmlnZ2VyLmFwcGx5KCBlbGVtLCBkYXRhICkgPT09IGZhbHNlICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBEZXRlcm1pbmUgZXZlbnQgcHJvcGFnYXRpb24gcGF0aCBpbiBhZHZhbmNlLCBwZXIgVzNDIGV2ZW50cyBzcGVjICgjOTk1MSkKCQkvLyBCdWJibGUgdXAgdG8gZG9jdW1lbnQsIHRoZW4gdG8gd2luZG93OyB3YXRjaCBmb3IgYSBnbG9iYWwgb3duZXJEb2N1bWVudCB2YXIgKCM5NzI0KQoJCWV2ZW50UGF0aCA9IFtbIGVsZW0sIHNwZWNpYWwuYmluZFR5cGUgfHwgdHlwZSBdXTsKCQlpZiAoICFvbmx5SGFuZGxlcnMgJiYgIXNwZWNpYWwubm9CdWJibGUgJiYgIWpRdWVyeS5pc1dpbmRvdyggZWxlbSApICkgewoKCQkJYnViYmxlVHlwZSA9IHNwZWNpYWwuZGVsZWdhdGVUeXBlIHx8IHR5cGU7CgkJCWN1ciA9IHJmb2N1c01vcnBoLnRlc3QoIGJ1YmJsZVR5cGUgKyB0eXBlICkgPyBlbGVtIDogZWxlbS5wYXJlbnROb2RlOwoJCQlmb3IgKCBvbGQgPSBlbGVtOyBjdXI7IGN1ciA9IGN1ci5wYXJlbnROb2RlICkgewoJCQkJZXZlbnRQYXRoLnB1c2goWyBjdXIsIGJ1YmJsZVR5cGUgXSk7CgkJCQlvbGQgPSBjdXI7CgkJCX0KCgkJCS8vIE9ubHkgYWRkIHdpbmRvdyBpZiB3ZSBnb3QgdG8gZG9jdW1lbnQgKGUuZy4sIG5vdCBwbGFpbiBvYmogb3IgZGV0YWNoZWQgRE9NKQoJCQlpZiAoIG9sZCA9PT0gKGVsZW0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCkgKSB7CgkJCQlldmVudFBhdGgucHVzaChbIG9sZC5kZWZhdWx0VmlldyB8fCBvbGQucGFyZW50V2luZG93IHx8IHdpbmRvdywgYnViYmxlVHlwZSBdKTsKCQkJfQoJCX0KCgkJLy8gRmlyZSBoYW5kbGVycyBvbiB0aGUgZXZlbnQgcGF0aAoJCWZvciAoIGkgPSAwOyBpIDwgZXZlbnRQYXRoLmxlbmd0aCAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKTsgaSsrICkgewoKCQkJY3VyID0gZXZlbnRQYXRoW2ldWzBdOwoJCQlldmVudC50eXBlID0gZXZlbnRQYXRoW2ldWzFdOwoKCQkJaGFuZGxlID0gKCBqUXVlcnkuX2RhdGEoIGN1ciwgImV2ZW50cyIgKSB8fCB7fSApWyBldmVudC50eXBlIF0gJiYgalF1ZXJ5Ll9kYXRhKCBjdXIsICJoYW5kbGUiICk7CgkJCWlmICggaGFuZGxlICkgewoJCQkJaGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTsKCQkJfQoJCQkvLyBOb3RlIHRoYXQgdGhpcyBpcyBhIGJhcmUgSlMgZnVuY3Rpb24gYW5kIG5vdCBhIGpRdWVyeSBoYW5kbGVyCgkJCWhhbmRsZSA9IG9udHlwZSAmJiBjdXJbIG9udHlwZSBdOwoJCQlpZiAoIGhhbmRsZSAmJiBqUXVlcnkuYWNjZXB0RGF0YSggY3VyICkgJiYgaGFuZGxlLmFwcGx5ICYmIGhhbmRsZS5hcHBseSggY3VyLCBkYXRhICkgPT09IGZhbHNlICkgewoJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJfQoJCX0KCQlldmVudC50eXBlID0gdHlwZTsKCgkJLy8gSWYgbm9ib2R5IHByZXZlbnRlZCB0aGUgZGVmYXVsdCBhY3Rpb24sIGRvIGl0IG5vdwoJCWlmICggIW9ubHlIYW5kbGVycyAmJiAhZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgKSB7CgoJCQlpZiAoICghc3BlY2lhbC5fZGVmYXVsdCB8fCBzcGVjaWFsLl9kZWZhdWx0LmFwcGx5KCBlbGVtLm93bmVyRG9jdW1lbnQsIGRhdGEgKSA9PT0gZmFsc2UpICYmCgkJCQkhKHR5cGUgPT09ICJjbGljayIgJiYgalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAiYSIgKSkgJiYgalF1ZXJ5LmFjY2VwdERhdGEoIGVsZW0gKSApIHsKCgkJCQkvLyBDYWxsIGEgbmF0aXZlIERPTSBtZXRob2Qgb24gdGhlIHRhcmdldCB3aXRoIHRoZSBzYW1lIG5hbWUgbmFtZSBhcyB0aGUgZXZlbnQuCgkJCQkvLyBDYW4ndCB1c2UgYW4gLmlzRnVuY3Rpb24oKSBjaGVjayBoZXJlIGJlY2F1c2UgSUU2LzcgZmFpbHMgdGhhdCB0ZXN0LgoJCQkJLy8gRG9uJ3QgZG8gZGVmYXVsdCBhY3Rpb25zIG9uIHdpbmRvdywgdGhhdCdzIHdoZXJlIGdsb2JhbCB2YXJpYWJsZXMgYmUgKCM2MTcwKQoJCQkJLy8gSUU8OSBkaWVzIG9uIGZvY3VzL2JsdXIgdG8gaGlkZGVuIGVsZW1lbnQgKCMxNDg2KQoJCQkJaWYgKCBvbnR5cGUgJiYgZWxlbVsgdHlwZSBdICYmICgodHlwZSAhPT0gImZvY3VzIiAmJiB0eXBlICE9PSAiYmx1ciIpIHx8IGV2ZW50LnRhcmdldC5vZmZzZXRXaWR0aCAhPT0gMCkgJiYgIWpRdWVyeS5pc1dpbmRvdyggZWxlbSApICkgewoKCQkJCQkvLyBEb24ndCByZS10cmlnZ2VyIGFuIG9uRk9PIGV2ZW50IHdoZW4gd2UgY2FsbCBpdHMgRk9PKCkgbWV0aG9kCgkJCQkJb2xkID0gZWxlbVsgb250eXBlIF07CgoJCQkJCWlmICggb2xkICkgewoJCQkJCQllbGVtWyBvbnR5cGUgXSA9IG51bGw7CgkJCQkJfQoKCQkJCQkvLyBQcmV2ZW50IHJlLXRyaWdnZXJpbmcgb2YgdGhlIHNhbWUgZXZlbnQsIHNpbmNlIHdlIGFscmVhZHkgYnViYmxlZCBpdCBhYm92ZQoJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB0eXBlOwoJCQkJCWVsZW1bIHR5cGUgXSgpOwoJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB1bmRlZmluZWQ7CgoJCQkJCWlmICggb2xkICkgewoJCQkJCQllbGVtWyBvbnR5cGUgXSA9IG9sZDsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiBldmVudC5yZXN1bHQ7Cgl9LAoKCWRpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7CgoJCS8vIE1ha2UgYSB3cml0YWJsZSBqUXVlcnkuRXZlbnQgZnJvbSB0aGUgbmF0aXZlIGV2ZW50IG9iamVjdAoJCWV2ZW50ID0galF1ZXJ5LmV2ZW50LmZpeCggZXZlbnQgfHwgd2luZG93LmV2ZW50ICk7CgoJCXZhciBpLCBqLCBjdXIsIHJldCwgc2VsTWF0Y2gsIG1hdGNoZWQsIG1hdGNoZXMsIGhhbmRsZU9iaiwgc2VsLCByZWxhdGVkLAoJCQloYW5kbGVycyA9ICggKGpRdWVyeS5fZGF0YSggdGhpcywgImV2ZW50cyIgKSB8fCB7fSApWyBldmVudC50eXBlIF0gfHwgW10pLAoJCQlkZWxlZ2F0ZUNvdW50ID0gaGFuZGxlcnMuZGVsZWdhdGVDb3VudCwKCQkJYXJncyA9IGNvcmVfc2xpY2UuY2FsbCggYXJndW1lbnRzICksCgkJCXJ1bl9hbGwgPSAhZXZlbnQuZXhjbHVzaXZlICYmICFldmVudC5uYW1lc3BhY2UsCgkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZXZlbnQudHlwZSBdIHx8IHt9LAoJCQloYW5kbGVyUXVldWUgPSBbXTsKCgkJLy8gVXNlIHRoZSBmaXgtZWQgalF1ZXJ5LkV2ZW50IHJhdGhlciB0aGFuIHRoZSAocmVhZC1vbmx5KSBuYXRpdmUgZXZlbnQKCQlhcmdzWzBdID0gZXZlbnQ7CgkJZXZlbnQuZGVsZWdhdGVUYXJnZXQgPSB0aGlzOwoKCQkvLyBDYWxsIHRoZSBwcmVEaXNwYXRjaCBob29rIGZvciB0aGUgbWFwcGVkIHR5cGUsIGFuZCBsZXQgaXQgYmFpbCBpZiBkZXNpcmVkCgkJaWYgKCBzcGVjaWFsLnByZURpc3BhdGNoICYmIHNwZWNpYWwucHJlRGlzcGF0Y2guY2FsbCggdGhpcywgZXZlbnQgKSA9PT0gZmFsc2UgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIERldGVybWluZSBoYW5kbGVycyB0aGF0IHNob3VsZCBydW4gaWYgdGhlcmUgYXJlIGRlbGVnYXRlZCBldmVudHMKCQkvLyBBdm9pZCBub24tbGVmdC1jbGljayBidWJibGluZyBpbiBGaXJlZm94ICgjMzg2MSkKCQlpZiAoIGRlbGVnYXRlQ291bnQgJiYgIShldmVudC5idXR0b24gJiYgZXZlbnQudHlwZSA9PT0gImNsaWNrIikgKSB7CgoJCQlmb3IgKCBjdXIgPSBldmVudC50YXJnZXQ7IGN1ciAhPSB0aGlzOyBjdXIgPSBjdXIucGFyZW50Tm9kZSB8fCB0aGlzICkgewoKCQkJCS8vIERvbid0IHByb2Nlc3MgY2xpY2tzIChPTkxZKSBvbiBkaXNhYmxlZCBlbGVtZW50cyAoIzY5MTEsICM4MTY1LCAjMTEzODIsICMxMTc2NCkKCQkJCWlmICggY3VyLmRpc2FibGVkICE9PSB0cnVlIHx8IGV2ZW50LnR5cGUgIT09ICJjbGljayIgKSB7CgkJCQkJc2VsTWF0Y2ggPSB7fTsKCQkJCQltYXRjaGVzID0gW107CgkJCQkJZm9yICggaSA9IDA7IGkgPCBkZWxlZ2F0ZUNvdW50OyBpKysgKSB7CgkJCQkJCWhhbmRsZU9iaiA9IGhhbmRsZXJzWyBpIF07CgkJCQkJCXNlbCA9IGhhbmRsZU9iai5zZWxlY3RvcjsKCgkJCQkJCWlmICggc2VsTWF0Y2hbIHNlbCBdID09PSB1bmRlZmluZWQgKSB7CgkJCQkJCQlzZWxNYXRjaFsgc2VsIF0gPSBoYW5kbGVPYmoubmVlZHNDb250ZXh0ID8KCQkJCQkJCQlqUXVlcnkoIHNlbCwgdGhpcyApLmluZGV4KCBjdXIgKSA+PSAwIDoKCQkJCQkJCQlqUXVlcnkuZmluZCggc2VsLCB0aGlzLCBudWxsLCBbIGN1ciBdICkubGVuZ3RoOwoJCQkJCQl9CgkJCQkJCWlmICggc2VsTWF0Y2hbIHNlbCBdICkgewoJCQkJCQkJbWF0Y2hlcy5wdXNoKCBoYW5kbGVPYmogKTsKCQkJCQkJfQoJCQkJCX0KCQkJCQlpZiAoIG1hdGNoZXMubGVuZ3RoICkgewoJCQkJCQloYW5kbGVyUXVldWUucHVzaCh7IGVsZW06IGN1ciwgbWF0Y2hlczogbWF0Y2hlcyB9KTsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgoJCS8vIEFkZCB0aGUgcmVtYWluaW5nIChkaXJlY3RseS1ib3VuZCkgaGFuZGxlcnMKCQlpZiAoIGhhbmRsZXJzLmxlbmd0aCA+IGRlbGVnYXRlQ291bnQgKSB7CgkJCWhhbmRsZXJRdWV1ZS5wdXNoKHsgZWxlbTogdGhpcywgbWF0Y2hlczogaGFuZGxlcnMuc2xpY2UoIGRlbGVnYXRlQ291bnQgKSB9KTsKCQl9CgoJCS8vIFJ1biBkZWxlZ2F0ZXMgZmlyc3Q7IHRoZXkgbWF5IHdhbnQgdG8gc3RvcCBwcm9wYWdhdGlvbiBiZW5lYXRoIHVzCgkJZm9yICggaSA9IDA7IGkgPCBoYW5kbGVyUXVldWUubGVuZ3RoICYmICFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpOyBpKysgKSB7CgkJCW1hdGNoZWQgPSBoYW5kbGVyUXVldWVbIGkgXTsKCQkJZXZlbnQuY3VycmVudFRhcmdldCA9IG1hdGNoZWQuZWxlbTsKCgkJCWZvciAoIGogPSAwOyBqIDwgbWF0Y2hlZC5tYXRjaGVzLmxlbmd0aCAmJiAhZXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKTsgaisrICkgewoJCQkJaGFuZGxlT2JqID0gbWF0Y2hlZC5tYXRjaGVzWyBqIF07CgoJCQkJLy8gVHJpZ2dlcmVkIGV2ZW50IG11c3QgZWl0aGVyIDEpIGJlIG5vbi1leGNsdXNpdmUgYW5kIGhhdmUgbm8gbmFtZXNwYWNlLCBvcgoJCQkJLy8gMikgaGF2ZSBuYW1lc3BhY2UocykgYSBzdWJzZXQgb3IgZXF1YWwgdG8gdGhvc2UgaW4gdGhlIGJvdW5kIGV2ZW50IChib3RoIGNhbiBoYXZlIG5vIG5hbWVzcGFjZSkuCgkJCQlpZiAoIHJ1bl9hbGwgfHwgKCFldmVudC5uYW1lc3BhY2UgJiYgIWhhbmRsZU9iai5uYW1lc3BhY2UpIHx8IGV2ZW50Lm5hbWVzcGFjZV9yZSAmJiBldmVudC5uYW1lc3BhY2VfcmUudGVzdCggaGFuZGxlT2JqLm5hbWVzcGFjZSApICkgewoKCQkJCQlldmVudC5kYXRhID0gaGFuZGxlT2JqLmRhdGE7CgkJCQkJZXZlbnQuaGFuZGxlT2JqID0gaGFuZGxlT2JqOwoKCQkJCQlyZXQgPSAoIChqUXVlcnkuZXZlbnQuc3BlY2lhbFsgaGFuZGxlT2JqLm9yaWdUeXBlIF0gfHwge30pLmhhbmRsZSB8fCBoYW5kbGVPYmouaGFuZGxlciApCgkJCQkJCQkuYXBwbHkoIG1hdGNoZWQuZWxlbSwgYXJncyApOwoKCQkJCQlpZiAoIHJldCAhPT0gdW5kZWZpbmVkICkgewoJCQkJCQlldmVudC5yZXN1bHQgPSByZXQ7CgkJCQkJCWlmICggcmV0ID09PSBmYWxzZSApIHsKCQkJCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCQkJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJLy8gQ2FsbCB0aGUgcG9zdERpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZQoJCWlmICggc3BlY2lhbC5wb3N0RGlzcGF0Y2ggKSB7CgkJCXNwZWNpYWwucG9zdERpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICk7CgkJfQoKCQlyZXR1cm4gZXZlbnQucmVzdWx0OwoJfSwKCgkvLyBJbmNsdWRlcyBzb21lIGV2ZW50IHByb3BzIHNoYXJlZCBieSBLZXlFdmVudCBhbmQgTW91c2VFdmVudAoJLy8gKioqIGF0dHJDaGFuZ2UgYXR0ck5hbWUgcmVsYXRlZE5vZGUgc3JjRWxlbWVudCAgYXJlIG5vdCBub3JtYWxpemVkLCBub24tVzNDLCBkZXByZWNhdGVkLCB3aWxsIGJlIHJlbW92ZWQgaW4gMS44ICoqKgoJcHJvcHM6ICJhdHRyQ2hhbmdlIGF0dHJOYW1lIHJlbGF0ZWROb2RlIHNyY0VsZW1lbnQgYWx0S2V5IGJ1YmJsZXMgY2FuY2VsYWJsZSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFtcCB2aWV3IHdoaWNoIi5zcGxpdCgiICIpLAoKCWZpeEhvb2tzOiB7fSwKCglrZXlIb29rczogewoJCXByb3BzOiAiY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZSIuc3BsaXQoIiAiKSwKCQlmaWx0ZXI6IGZ1bmN0aW9uKCBldmVudCwgb3JpZ2luYWwgKSB7CgoJCQkvLyBBZGQgd2hpY2ggZm9yIGtleSBldmVudHMKCQkJaWYgKCBldmVudC53aGljaCA9PSBudWxsICkgewoJCQkJZXZlbnQud2hpY2ggPSBvcmlnaW5hbC5jaGFyQ29kZSAhPSBudWxsID8gb3JpZ2luYWwuY2hhckNvZGUgOiBvcmlnaW5hbC5rZXlDb2RlOwoJCQl9CgoJCQlyZXR1cm4gZXZlbnQ7CgkJfQoJfSwKCgltb3VzZUhvb2tzOiB7CgkJcHJvcHM6ICJidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgZnJvbUVsZW1lbnQgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnQiLnNwbGl0KCIgIiksCgkJZmlsdGVyOiBmdW5jdGlvbiggZXZlbnQsIG9yaWdpbmFsICkgewoJCQl2YXIgZXZlbnREb2MsIGRvYywgYm9keSwKCQkJCWJ1dHRvbiA9IG9yaWdpbmFsLmJ1dHRvbiwKCQkJCWZyb21FbGVtZW50ID0gb3JpZ2luYWwuZnJvbUVsZW1lbnQ7CgoJCQkvLyBDYWxjdWxhdGUgcGFnZVgvWSBpZiBtaXNzaW5nIGFuZCBjbGllbnRYL1kgYXZhaWxhYmxlCgkJCWlmICggZXZlbnQucGFnZVggPT0gbnVsbCAmJiBvcmlnaW5hbC5jbGllbnRYICE9IG51bGwgKSB7CgkJCQlldmVudERvYyA9IGV2ZW50LnRhcmdldC5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50OwoJCQkJZG9jID0gZXZlbnREb2MuZG9jdW1lbnRFbGVtZW50OwoJCQkJYm9keSA9IGV2ZW50RG9jLmJvZHk7CgoJCQkJZXZlbnQucGFnZVggPSBvcmlnaW5hbC5jbGllbnRYICsgKCBkb2MgJiYgZG9jLnNjcm9sbExlZnQgfHwgYm9keSAmJiBib2R5LnNjcm9sbExlZnQgfHwgMCApIC0gKCBkb2MgJiYgZG9jLmNsaWVudExlZnQgfHwgYm9keSAmJiBib2R5LmNsaWVudExlZnQgfHwgMCApOwoJCQkJZXZlbnQucGFnZVkgPSBvcmlnaW5hbC5jbGllbnRZICsgKCBkb2MgJiYgZG9jLnNjcm9sbFRvcCAgfHwgYm9keSAmJiBib2R5LnNjcm9sbFRvcCAgfHwgMCApIC0gKCBkb2MgJiYgZG9jLmNsaWVudFRvcCAgfHwgYm9keSAmJiBib2R5LmNsaWVudFRvcCAgfHwgMCApOwoJCQl9CgoJCQkvLyBBZGQgcmVsYXRlZFRhcmdldCwgaWYgbmVjZXNzYXJ5CgkJCWlmICggIWV2ZW50LnJlbGF0ZWRUYXJnZXQgJiYgZnJvbUVsZW1lbnQgKSB7CgkJCQlldmVudC5yZWxhdGVkVGFyZ2V0ID0gZnJvbUVsZW1lbnQgPT09IGV2ZW50LnRhcmdldCA/IG9yaWdpbmFsLnRvRWxlbWVudCA6IGZyb21FbGVtZW50OwoJCQl9CgoJCQkvLyBBZGQgd2hpY2ggZm9yIGNsaWNrOiAxID09PSBsZWZ0OyAyID09PSBtaWRkbGU7IDMgPT09IHJpZ2h0CgkJCS8vIE5vdGU6IGJ1dHRvbiBpcyBub3Qgbm9ybWFsaXplZCwgc28gZG9uJ3QgdXNlIGl0CgkJCWlmICggIWV2ZW50LndoaWNoICYmIGJ1dHRvbiAhPT0gdW5kZWZpbmVkICkgewoJCQkJZXZlbnQud2hpY2ggPSAoIGJ1dHRvbiAmIDEgPyAxIDogKCBidXR0b24gJiAyID8gMyA6ICggYnV0dG9uICYgNCA/IDIgOiAwICkgKSApOwoJCQl9CgoJCQlyZXR1cm4gZXZlbnQ7CgkJfQoJfSwKCglmaXg6IGZ1bmN0aW9uKCBldmVudCApIHsKCQlpZiAoIGV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdICkgewoJCQlyZXR1cm4gZXZlbnQ7CgkJfQoKCQkvLyBDcmVhdGUgYSB3cml0YWJsZSBjb3B5IG9mIHRoZSBldmVudCBvYmplY3QgYW5kIG5vcm1hbGl6ZSBzb21lIHByb3BlcnRpZXMKCQl2YXIgaSwgcHJvcCwKCQkJb3JpZ2luYWxFdmVudCA9IGV2ZW50LAoJCQlmaXhIb29rID0galF1ZXJ5LmV2ZW50LmZpeEhvb2tzWyBldmVudC50eXBlIF0gfHwge30sCgkJCWNvcHkgPSBmaXhIb29rLnByb3BzID8gdGhpcy5wcm9wcy5jb25jYXQoIGZpeEhvb2sucHJvcHMgKSA6IHRoaXMucHJvcHM7CgoJCWV2ZW50ID0galF1ZXJ5LkV2ZW50KCBvcmlnaW5hbEV2ZW50ICk7CgoJCWZvciAoIGkgPSBjb3B5Lmxlbmd0aDsgaTsgKSB7CgkJCXByb3AgPSBjb3B5WyAtLWkgXTsKCQkJZXZlbnRbIHByb3AgXSA9IG9yaWdpbmFsRXZlbnRbIHByb3AgXTsKCQl9CgoJCS8vIEZpeCB0YXJnZXQgcHJvcGVydHksIGlmIG5lY2Vzc2FyeSAoIzE5MjUsIElFIDYvNy84ICYgU2FmYXJpMikKCQlpZiAoICFldmVudC50YXJnZXQgKSB7CgkJCWV2ZW50LnRhcmdldCA9IG9yaWdpbmFsRXZlbnQuc3JjRWxlbWVudCB8fCBkb2N1bWVudDsKCQl9CgoJCS8vIFRhcmdldCBzaG91bGQgbm90IGJlIGEgdGV4dCBub2RlICgjNTA0LCBTYWZhcmkpCgkJaWYgKCBldmVudC50YXJnZXQubm9kZVR5cGUgPT09IDMgKSB7CgkJCWV2ZW50LnRhcmdldCA9IGV2ZW50LnRhcmdldC5wYXJlbnROb2RlOwoJCX0KCgkJLy8gRm9yIG1vdXNlL2tleSBldmVudHMsIG1ldGFLZXk9PWZhbHNlIGlmIGl0J3MgdW5kZWZpbmVkICgjMzM2OCwgIzExMzI4OyBJRTYvNy84KQoJCWV2ZW50Lm1ldGFLZXkgPSAhIWV2ZW50Lm1ldGFLZXk7CgoJCXJldHVybiBmaXhIb29rLmZpbHRlcj8gZml4SG9vay5maWx0ZXIoIGV2ZW50LCBvcmlnaW5hbEV2ZW50ICkgOiBldmVudDsKCX0sCgoJc3BlY2lhbDogewoJCWxvYWQ6IHsKCQkJLy8gUHJldmVudCB0cmlnZ2VyZWQgaW1hZ2UubG9hZCBldmVudHMgZnJvbSBidWJibGluZyB0byB3aW5kb3cubG9hZAoJCQlub0J1YmJsZTogdHJ1ZQoJCX0sCgoJCWZvY3VzOiB7CgkJCWRlbGVnYXRlVHlwZTogImZvY3VzaW4iCgkJfSwKCQlibHVyOiB7CgkJCWRlbGVnYXRlVHlwZTogImZvY3Vzb3V0IgoJCX0sCgoJCWJlZm9yZXVubG9hZDogewoJCQlzZXR1cDogZnVuY3Rpb24oIGRhdGEsIG5hbWVzcGFjZXMsIGV2ZW50SGFuZGxlICkgewoJCQkJLy8gV2Ugb25seSB3YW50IHRvIGRvIHRoaXMgc3BlY2lhbCBjYXNlIG9uIHdpbmRvd3MKCQkJCWlmICggalF1ZXJ5LmlzV2luZG93KCB0aGlzICkgKSB7CgkJCQkJdGhpcy5vbmJlZm9yZXVubG9hZCA9IGV2ZW50SGFuZGxlOwoJCQkJfQoJCQl9LAoKCQkJdGVhcmRvd246IGZ1bmN0aW9uKCBuYW1lc3BhY2VzLCBldmVudEhhbmRsZSApIHsKCQkJCWlmICggdGhpcy5vbmJlZm9yZXVubG9hZCA9PT0gZXZlbnRIYW5kbGUgKSB7CgkJCQkJdGhpcy5vbmJlZm9yZXVubG9hZCA9IG51bGw7CgkJCQl9CgkJCX0KCQl9Cgl9LAoKCXNpbXVsYXRlOiBmdW5jdGlvbiggdHlwZSwgZWxlbSwgZXZlbnQsIGJ1YmJsZSApIHsKCQkvLyBQaWdneWJhY2sgb24gYSBkb25vciBldmVudCB0byBzaW11bGF0ZSBhIGRpZmZlcmVudCBvbmUuCgkJLy8gRmFrZSBvcmlnaW5hbEV2ZW50IHRvIGF2b2lkIGRvbm9yJ3Mgc3RvcFByb3BhZ2F0aW9uLCBidXQgaWYgdGhlCgkJLy8gc2ltdWxhdGVkIGV2ZW50IHByZXZlbnRzIGRlZmF1bHQgdGhlbiB3ZSBkbyB0aGUgc2FtZSBvbiB0aGUgZG9ub3IuCgkJdmFyIGUgPSBqUXVlcnkuZXh0ZW5kKAoJCQluZXcgalF1ZXJ5LkV2ZW50KCksCgkJCWV2ZW50LAoJCQl7IHR5cGU6IHR5cGUsCgkJCQlpc1NpbXVsYXRlZDogdHJ1ZSwKCQkJCW9yaWdpbmFsRXZlbnQ6IHt9CgkJCX0KCQkpOwoJCWlmICggYnViYmxlICkgewoJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggZSwgbnVsbCwgZWxlbSApOwoJCX0gZWxzZSB7CgkJCWpRdWVyeS5ldmVudC5kaXNwYXRjaC5jYWxsKCBlbGVtLCBlICk7CgkJfQoJCWlmICggZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSApIHsKCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQl9Cgl9Cn07CgovLyBTb21lIHBsdWdpbnMgYXJlIHVzaW5nLCBidXQgaXQncyB1bmRvY3VtZW50ZWQvZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkLgovLyBUaGUgMS43IHNwZWNpYWwgZXZlbnQgaW50ZXJmYWNlIHNob3VsZCBwcm92aWRlIGFsbCB0aGUgaG9va3MgbmVlZGVkIG5vdy4KalF1ZXJ5LmV2ZW50LmhhbmRsZSA9IGpRdWVyeS5ldmVudC5kaXNwYXRjaDsKCmpRdWVyeS5yZW1vdmVFdmVudCA9IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIgPwoJZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGhhbmRsZSApIHsKCQlpZiAoIGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lciApIHsKCQkJZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKCB0eXBlLCBoYW5kbGUsIGZhbHNlICk7CgkJfQoJfSA6CglmdW5jdGlvbiggZWxlbSwgdHlwZSwgaGFuZGxlICkgewoJCXZhciBuYW1lID0gIm9uIiArIHR5cGU7CgoJCWlmICggZWxlbS5kZXRhY2hFdmVudCApIHsKCgkJCS8vICM4NTQ1LCAjNzA1NCwgcHJldmVudGluZyBtZW1vcnkgbGVha3MgZm9yIGN1c3RvbSBldmVudHMgaW4gSUU2LTgKCQkJLy8gZGV0YWNoRXZlbnQgbmVlZGVkIHByb3BlcnR5IG9uIGVsZW1lbnQsIGJ5IG5hbWUgb2YgdGhhdCBldmVudCwgdG8gcHJvcGVybHkgZXhwb3NlIGl0IHRvIEdDCgkJCWlmICggdHlwZW9mIGVsZW1bIG5hbWUgXSA9PT0gInVuZGVmaW5lZCIgKSB7CgkJCQllbGVtWyBuYW1lIF0gPSBudWxsOwoJCQl9CgoJCQllbGVtLmRldGFjaEV2ZW50KCBuYW1lLCBoYW5kbGUgKTsKCQl9Cgl9OwoKalF1ZXJ5LkV2ZW50ID0gZnVuY3Rpb24oIHNyYywgcHJvcHMgKSB7CgkvLyBBbGxvdyBpbnN0YW50aWF0aW9uIHdpdGhvdXQgdGhlICduZXcnIGtleXdvcmQKCWlmICggISh0aGlzIGluc3RhbmNlb2YgalF1ZXJ5LkV2ZW50KSApIHsKCQlyZXR1cm4gbmV3IGpRdWVyeS5FdmVudCggc3JjLCBwcm9wcyApOwoJfQoKCS8vIEV2ZW50IG9iamVjdAoJaWYgKCBzcmMgJiYgc3JjLnR5cGUgKSB7CgkJdGhpcy5vcmlnaW5hbEV2ZW50ID0gc3JjOwoJCXRoaXMudHlwZSA9IHNyYy50eXBlOwoKCQkvLyBFdmVudHMgYnViYmxpbmcgdXAgdGhlIGRvY3VtZW50IG1heSBoYXZlIGJlZW4gbWFya2VkIGFzIHByZXZlbnRlZAoJCS8vIGJ5IGEgaGFuZGxlciBsb3dlciBkb3duIHRoZSB0cmVlOyByZWZsZWN0IHRoZSBjb3JyZWN0IHZhbHVlLgoJCXRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gKCBzcmMuZGVmYXVsdFByZXZlbnRlZCB8fCBzcmMucmV0dXJuVmFsdWUgPT09IGZhbHNlIHx8CgkJCXNyYy5nZXRQcmV2ZW50RGVmYXVsdCAmJiBzcmMuZ2V0UHJldmVudERlZmF1bHQoKSApID8gcmV0dXJuVHJ1ZSA6IHJldHVybkZhbHNlOwoKCS8vIEV2ZW50IHR5cGUKCX0gZWxzZSB7CgkJdGhpcy50eXBlID0gc3JjOwoJfQoKCS8vIFB1dCBleHBsaWNpdGx5IHByb3ZpZGVkIHByb3BlcnRpZXMgb250byB0aGUgZXZlbnQgb2JqZWN0CglpZiAoIHByb3BzICkgewoJCWpRdWVyeS5leHRlbmQoIHRoaXMsIHByb3BzICk7Cgl9CgoJLy8gQ3JlYXRlIGEgdGltZXN0YW1wIGlmIGluY29taW5nIGV2ZW50IGRvZXNuJ3QgaGF2ZSBvbmUKCXRoaXMudGltZVN0YW1wID0gc3JjICYmIHNyYy50aW1lU3RhbXAgfHwgalF1ZXJ5Lm5vdygpOwoKCS8vIE1hcmsgaXQgYXMgZml4ZWQKCXRoaXNbIGpRdWVyeS5leHBhbmRvIF0gPSB0cnVlOwp9OwoKZnVuY3Rpb24gcmV0dXJuRmFsc2UoKSB7CglyZXR1cm4gZmFsc2U7Cn0KZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHsKCXJldHVybiB0cnVlOwp9CgovLyBqUXVlcnkuRXZlbnQgaXMgYmFzZWQgb24gRE9NMyBFdmVudHMgYXMgc3BlY2lmaWVkIGJ5IHRoZSBFQ01BU2NyaXB0IExhbmd1YWdlIEJpbmRpbmcKLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAwMzAzMzEvZWNtYS1zY3JpcHQtYmluZGluZy5odG1sCmpRdWVyeS5FdmVudC5wcm90b3R5cGUgPSB7CglwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7CgkJdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSByZXR1cm5UcnVlOwoKCQl2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDsKCQlpZiAoICFlICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBpZiBwcmV2ZW50RGVmYXVsdCBleGlzdHMgcnVuIGl0IG9uIHRoZSBvcmlnaW5hbCBldmVudAoJCWlmICggZS5wcmV2ZW50RGVmYXVsdCApIHsKCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoKCQkvLyBvdGhlcndpc2Ugc2V0IHRoZSByZXR1cm5WYWx1ZSBwcm9wZXJ0eSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQgdG8gZmFsc2UgKElFKQoJCX0gZWxzZSB7CgkJCWUucmV0dXJuVmFsdWUgPSBmYWxzZTsKCQl9Cgl9LAoJc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHsKCQl0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTsKCgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgkJaWYgKCAhZSApIHsKCQkJcmV0dXJuOwoJCX0KCQkvLyBpZiBzdG9wUHJvcGFnYXRpb24gZXhpc3RzIHJ1biBpdCBvbiB0aGUgb3JpZ2luYWwgZXZlbnQKCQlpZiAoIGUuc3RvcFByb3BhZ2F0aW9uICkgewoJCQllLnN0b3BQcm9wYWdhdGlvbigpOwoJCX0KCQkvLyBvdGhlcndpc2Ugc2V0IHRoZSBjYW5jZWxCdWJibGUgcHJvcGVydHkgb2YgdGhlIG9yaWdpbmFsIGV2ZW50IHRvIHRydWUgKElFKQoJCWUuY2FuY2VsQnViYmxlID0gdHJ1ZTsKCX0sCglzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkgewoJCXRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOwoJCXRoaXMuc3RvcFByb3BhZ2F0aW9uKCk7Cgl9LAoJaXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSwKCWlzUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSwKCWlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZQp9OwoKLy8gQ3JlYXRlIG1vdXNlZW50ZXIvbGVhdmUgZXZlbnRzIHVzaW5nIG1vdXNlb3Zlci9vdXQgYW5kIGV2ZW50LXRpbWUgY2hlY2tzCmpRdWVyeS5lYWNoKHsKCW1vdXNlZW50ZXI6ICJtb3VzZW92ZXIiLAoJbW91c2VsZWF2ZTogIm1vdXNlb3V0Igp9LCBmdW5jdGlvbiggb3JpZywgZml4ICkgewoJalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIG9yaWcgXSA9IHsKCQlkZWxlZ2F0ZVR5cGU6IGZpeCwKCQliaW5kVHlwZTogZml4LAoKCQloYW5kbGU6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJdmFyIHJldCwKCQkJCXRhcmdldCA9IHRoaXMsCgkJCQlyZWxhdGVkID0gZXZlbnQucmVsYXRlZFRhcmdldCwKCQkJCWhhbmRsZU9iaiA9IGV2ZW50LmhhbmRsZU9iaiwKCQkJCXNlbGVjdG9yID0gaGFuZGxlT2JqLnNlbGVjdG9yOwoKCQkJLy8gRm9yIG1vdXNlbnRlci9sZWF2ZSBjYWxsIHRoZSBoYW5kbGVyIGlmIHJlbGF0ZWQgaXMgb3V0c2lkZSB0aGUgdGFyZ2V0LgoJCQkvLyBOQjogTm8gcmVsYXRlZFRhcmdldCBpZiB0aGUgbW91c2UgbGVmdC9lbnRlcmVkIHRoZSBicm93c2VyIHdpbmRvdwoJCQlpZiAoICFyZWxhdGVkIHx8IChyZWxhdGVkICE9PSB0YXJnZXQgJiYgIWpRdWVyeS5jb250YWlucyggdGFyZ2V0LCByZWxhdGVkICkpICkgewoJCQkJZXZlbnQudHlwZSA9IGhhbmRsZU9iai5vcmlnVHlwZTsKCQkJCXJldCA9IGhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJCWV2ZW50LnR5cGUgPSBmaXg7CgkJCX0KCQkJcmV0dXJuIHJldDsKCQl9Cgl9Owp9KTsKCi8vIElFIHN1Ym1pdCBkZWxlZ2F0aW9uCmlmICggIWpRdWVyeS5zdXBwb3J0LnN1Ym1pdEJ1YmJsZXMgKSB7CgoJalF1ZXJ5LmV2ZW50LnNwZWNpYWwuc3VibWl0ID0gewoJCXNldHVwOiBmdW5jdGlvbigpIHsKCQkJLy8gT25seSBuZWVkIHRoaXMgZm9yIGRlbGVnYXRlZCBmb3JtIHN1Ym1pdCBldmVudHMKCQkJaWYgKCBqUXVlcnkubm9kZU5hbWUoIHRoaXMsICJmb3JtIiApICkgewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgoJCQkvLyBMYXp5LWFkZCBhIHN1Ym1pdCBoYW5kbGVyIHdoZW4gYSBkZXNjZW5kYW50IGZvcm0gbWF5IHBvdGVudGlhbGx5IGJlIHN1Ym1pdHRlZAoJCQlqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCAiY2xpY2suX3N1Ym1pdCBrZXlwcmVzcy5fc3VibWl0IiwgZnVuY3Rpb24oIGUgKSB7CgkJCQkvLyBOb2RlIG5hbWUgY2hlY2sgYXZvaWRzIGEgVk1MLXJlbGF0ZWQgY3Jhc2ggaW4gSUUgKCM5ODA3KQoJCQkJdmFyIGVsZW0gPSBlLnRhcmdldCwKCQkJCQlmb3JtID0galF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAiaW5wdXQiICkgfHwgalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAiYnV0dG9uIiApID8gZWxlbS5mb3JtIDogdW5kZWZpbmVkOwoJCQkJaWYgKCBmb3JtICYmICFqUXVlcnkuX2RhdGEoIGZvcm0sICJfc3VibWl0X2F0dGFjaGVkIiApICkgewoJCQkJCWpRdWVyeS5ldmVudC5hZGQoIGZvcm0sICJzdWJtaXQuX3N1Ym1pdCIsIGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCQkJZXZlbnQuX3N1Ym1pdF9idWJibGUgPSB0cnVlOwoJCQkJCX0pOwoJCQkJCWpRdWVyeS5fZGF0YSggZm9ybSwgIl9zdWJtaXRfYXR0YWNoZWQiLCB0cnVlICk7CgkJCQl9CgkJCX0pOwoJCQkvLyByZXR1cm4gdW5kZWZpbmVkIHNpbmNlIHdlIGRvbid0IG5lZWQgYW4gZXZlbnQgbGlzdGVuZXIKCQl9LAoKCQlwb3N0RGlzcGF0Y2g6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJLy8gSWYgZm9ybSB3YXMgc3VibWl0dGVkIGJ5IHRoZSB1c2VyLCBidWJibGUgdGhlIGV2ZW50IHVwIHRoZSB0cmVlCgkJCWlmICggZXZlbnQuX3N1Ym1pdF9idWJibGUgKSB7CgkJCQlkZWxldGUgZXZlbnQuX3N1Ym1pdF9idWJibGU7CgkJCQlpZiAoIHRoaXMucGFyZW50Tm9kZSAmJiAhZXZlbnQuaXNUcmlnZ2VyICkgewoJCQkJCWpRdWVyeS5ldmVudC5zaW11bGF0ZSggInN1Ym1pdCIsIHRoaXMucGFyZW50Tm9kZSwgZXZlbnQsIHRydWUgKTsKCQkJCX0KCQkJfQoJCX0sCgoJCXRlYXJkb3duOiBmdW5jdGlvbigpIHsKCQkJLy8gT25seSBuZWVkIHRoaXMgZm9yIGRlbGVnYXRlZCBmb3JtIHN1Ym1pdCBldmVudHMKCQkJaWYgKCBqUXVlcnkubm9kZU5hbWUoIHRoaXMsICJmb3JtIiApICkgewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgoJCQkvLyBSZW1vdmUgZGVsZWdhdGVkIGhhbmRsZXJzOyBjbGVhbkRhdGEgZXZlbnR1YWxseSByZWFwcyBzdWJtaXQgaGFuZGxlcnMgYXR0YWNoZWQgYWJvdmUKCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgIi5fc3VibWl0IiApOwoJCX0KCX07Cn0KCi8vIElFIGNoYW5nZSBkZWxlZ2F0aW9uIGFuZCBjaGVja2JveC9yYWRpbyBmaXgKaWYgKCAhalF1ZXJ5LnN1cHBvcnQuY2hhbmdlQnViYmxlcyApIHsKCglqUXVlcnkuZXZlbnQuc3BlY2lhbC5jaGFuZ2UgPSB7CgoJCXNldHVwOiBmdW5jdGlvbigpIHsKCgkJCWlmICggcmZvcm1FbGVtcy50ZXN0KCB0aGlzLm5vZGVOYW1lICkgKSB7CgkJCQkvLyBJRSBkb2Vzbid0IGZpcmUgY2hhbmdlIG9uIGEgY2hlY2svcmFkaW8gdW50aWwgYmx1cjsgdHJpZ2dlciBpdCBvbiBjbGljawoJCQkJLy8gYWZ0ZXIgYSBwcm9wZXJ0eWNoYW5nZS4gRWF0IHRoZSBibHVyLWNoYW5nZSBpbiBzcGVjaWFsLmNoYW5nZS5oYW5kbGUuCgkJCQkvLyBUaGlzIHN0aWxsIGZpcmVzIG9uY2hhbmdlIGEgc2Vjb25kIHRpbWUgZm9yIGNoZWNrL3JhZGlvIGFmdGVyIGJsdXIuCgkJCQlpZiAoIHRoaXMudHlwZSA9PT0gImNoZWNrYm94IiB8fCB0aGlzLnR5cGUgPT09ICJyYWRpbyIgKSB7CgkJCQkJalF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgInByb3BlcnR5Y2hhbmdlLl9jaGFuZ2UiLCBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkJCWlmICggZXZlbnQub3JpZ2luYWxFdmVudC5wcm9wZXJ0eU5hbWUgPT09ICJjaGVja2VkIiApIHsKCQkJCQkJCXRoaXMuX2p1c3RfY2hhbmdlZCA9IHRydWU7CgkJCQkJCX0KCQkJCQl9KTsKCQkJCQlqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCAiY2xpY2suX2NoYW5nZSIsIGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCQkJaWYgKCB0aGlzLl9qdXN0X2NoYW5nZWQgJiYgIWV2ZW50LmlzVHJpZ2dlciApIHsKCQkJCQkJCXRoaXMuX2p1c3RfY2hhbmdlZCA9IGZhbHNlOwoJCQkJCQl9CgkJCQkJCS8vIEFsbG93IHRyaWdnZXJlZCwgc2ltdWxhdGVkIGNoYW5nZSBldmVudHMgKCMxMTUwMCkKCQkJCQkJalF1ZXJ5LmV2ZW50LnNpbXVsYXRlKCAiY2hhbmdlIiwgdGhpcywgZXZlbnQsIHRydWUgKTsKCQkJCQl9KTsKCQkJCX0KCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCQkvLyBEZWxlZ2F0ZWQgZXZlbnQ7IGxhenktYWRkIGEgY2hhbmdlIGhhbmRsZXIgb24gZGVzY2VuZGFudCBpbnB1dHMKCQkJalF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgImJlZm9yZWFjdGl2YXRlLl9jaGFuZ2UiLCBmdW5jdGlvbiggZSApIHsKCQkJCXZhciBlbGVtID0gZS50YXJnZXQ7CgoJCQkJaWYgKCByZm9ybUVsZW1zLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSAmJiAhalF1ZXJ5Ll9kYXRhKCBlbGVtLCAiX2NoYW5nZV9hdHRhY2hlZCIgKSApIHsKCQkJCQlqUXVlcnkuZXZlbnQuYWRkKCBlbGVtLCAiY2hhbmdlLl9jaGFuZ2UiLCBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkJCWlmICggdGhpcy5wYXJlbnROb2RlICYmICFldmVudC5pc1NpbXVsYXRlZCAmJiAhZXZlbnQuaXNUcmlnZ2VyICkgewoJCQkJCQkJalF1ZXJ5LmV2ZW50LnNpbXVsYXRlKCAiY2hhbmdlIiwgdGhpcy5wYXJlbnROb2RlLCBldmVudCwgdHJ1ZSApOwoJCQkJCQl9CgkJCQkJfSk7CgkJCQkJalF1ZXJ5Ll9kYXRhKCBlbGVtLCAiX2NoYW5nZV9hdHRhY2hlZCIsIHRydWUgKTsKCQkJCX0KCQkJfSk7CgkJfSwKCgkJaGFuZGxlOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCXZhciBlbGVtID0gZXZlbnQudGFyZ2V0OwoKCQkJLy8gU3dhbGxvdyBuYXRpdmUgY2hhbmdlIGV2ZW50cyBmcm9tIGNoZWNrYm94L3JhZGlvLCB3ZSBhbHJlYWR5IHRyaWdnZXJlZCB0aGVtIGFib3ZlCgkJCWlmICggdGhpcyAhPT0gZWxlbSB8fCBldmVudC5pc1NpbXVsYXRlZCB8fCBldmVudC5pc1RyaWdnZXIgfHwgKGVsZW0udHlwZSAhPT0gInJhZGlvIiAmJiBlbGVtLnR5cGUgIT09ICJjaGVja2JveCIpICkgewoJCQkJcmV0dXJuIGV2ZW50LmhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJfQoJCX0sCgoJCXRlYXJkb3duOiBmdW5jdGlvbigpIHsKCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgIi5fY2hhbmdlIiApOwoKCQkJcmV0dXJuICFyZm9ybUVsZW1zLnRlc3QoIHRoaXMubm9kZU5hbWUgKTsKCQl9Cgl9Owp9CgovLyBDcmVhdGUgImJ1YmJsaW5nIiBmb2N1cyBhbmQgYmx1ciBldmVudHMKaWYgKCAhalF1ZXJ5LnN1cHBvcnQuZm9jdXNpbkJ1YmJsZXMgKSB7CglqUXVlcnkuZWFjaCh7IGZvY3VzOiAiZm9jdXNpbiIsIGJsdXI6ICJmb2N1c291dCIgfSwgZnVuY3Rpb24oIG9yaWcsIGZpeCApIHsKCgkJLy8gQXR0YWNoIGEgc2luZ2xlIGNhcHR1cmluZyBoYW5kbGVyIHdoaWxlIHNvbWVvbmUgd2FudHMgZm9jdXNpbi9mb2N1c291dAoJCXZhciBhdHRhY2hlcyA9IDAsCgkJCWhhbmRsZXIgPSBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQlqUXVlcnkuZXZlbnQuc2ltdWxhdGUoIGZpeCwgZXZlbnQudGFyZ2V0LCBqUXVlcnkuZXZlbnQuZml4KCBldmVudCApLCB0cnVlICk7CgkJCX07CgoJCWpRdWVyeS5ldmVudC5zcGVjaWFsWyBmaXggXSA9IHsKCQkJc2V0dXA6IGZ1bmN0aW9uKCkgewoJCQkJaWYgKCBhdHRhY2hlcysrID09PSAwICkgewoJCQkJCWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTsKCQkJCX0KCQkJfSwKCQkJdGVhcmRvd246IGZ1bmN0aW9uKCkgewoJCQkJaWYgKCAtLWF0dGFjaGVzID09PSAwICkgewoJCQkJCWRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTsKCQkJCX0KCQkJfQoJCX07Cgl9KTsKfQoKalF1ZXJ5LmZuLmV4dGVuZCh7CgoJb246IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuLCAvKklOVEVSTkFMKi8gb25lICkgewoJCXZhciBvcmlnRm4sIHR5cGU7CgoJCS8vIFR5cGVzIGNhbiBiZSBhIG1hcCBvZiB0eXBlcy9oYW5kbGVycwoJCWlmICggdHlwZW9mIHR5cGVzID09PSAib2JqZWN0IiApIHsKCQkJLy8gKCB0eXBlcy1PYmplY3QsIHNlbGVjdG9yLCBkYXRhICkKCQkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgeyAvLyAmJiBzZWxlY3RvciAhPSBudWxsCgkJCQkvLyAoIHR5cGVzLU9iamVjdCwgZGF0YSApCgkJCQlkYXRhID0gZGF0YSB8fCBzZWxlY3RvcjsKCQkJCXNlbGVjdG9yID0gdW5kZWZpbmVkOwoJCQl9CgkJCWZvciAoIHR5cGUgaW4gdHlwZXMgKSB7CgkJCQl0aGlzLm9uKCB0eXBlLCBzZWxlY3RvciwgZGF0YSwgdHlwZXNbIHR5cGUgXSwgb25lICk7CgkJCX0KCQkJcmV0dXJuIHRoaXM7CgkJfQoKCQlpZiAoIGRhdGEgPT0gbnVsbCAmJiBmbiA9PSBudWxsICkgewoJCQkvLyAoIHR5cGVzLCBmbiApCgkJCWZuID0gc2VsZWN0b3I7CgkJCWRhdGEgPSBzZWxlY3RvciA9IHVuZGVmaW5lZDsKCQl9IGVsc2UgaWYgKCBmbiA9PSBudWxsICkgewoJCQlpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CgkJCQkvLyAoIHR5cGVzLCBzZWxlY3RvciwgZm4gKQoJCQkJZm4gPSBkYXRhOwoJCQkJZGF0YSA9IHVuZGVmaW5lZDsKCQkJfSBlbHNlIHsKCQkJCS8vICggdHlwZXMsIGRhdGEsIGZuICkKCQkJCWZuID0gZGF0YTsKCQkJCWRhdGEgPSBzZWxlY3RvcjsKCQkJCXNlbGVjdG9yID0gdW5kZWZpbmVkOwoJCQl9CgkJfQoJCWlmICggZm4gPT09IGZhbHNlICkgewoJCQlmbiA9IHJldHVybkZhbHNlOwoJCX0gZWxzZSBpZiAoICFmbiApIHsKCQkJcmV0dXJuIHRoaXM7CgkJfQoKCQlpZiAoIG9uZSA9PT0gMSApIHsKCQkJb3JpZ0ZuID0gZm47CgkJCWZuID0gZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJLy8gQ2FuIHVzZSBhbiBlbXB0eSBzZXQsIHNpbmNlIGV2ZW50IGNvbnRhaW5zIHRoZSBpbmZvCgkJCQlqUXVlcnkoKS5vZmYoIGV2ZW50ICk7CgkJCQlyZXR1cm4gb3JpZ0ZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJfTsKCQkJLy8gVXNlIHNhbWUgZ3VpZCBzbyBjYWxsZXIgY2FuIHJlbW92ZSB1c2luZyBvcmlnRm4KCQkJZm4uZ3VpZCA9IG9yaWdGbi5ndWlkIHx8ICggb3JpZ0ZuLmd1aWQgPSBqUXVlcnkuZ3VpZCsrICk7CgkJfQoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCB0eXBlcywgZm4sIGRhdGEsIHNlbGVjdG9yICk7CgkJfSk7Cgl9LAoJb25lOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApIHsKCQlyZXR1cm4gdGhpcy5vbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiwgMSApOwoJfSwKCW9mZjogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZm4gKSB7CgkJdmFyIGhhbmRsZU9iaiwgdHlwZTsKCQlpZiAoIHR5cGVzICYmIHR5cGVzLnByZXZlbnREZWZhdWx0ICYmIHR5cGVzLmhhbmRsZU9iaiApIHsKCQkJLy8gKCBldmVudCApICBkaXNwYXRjaGVkIGpRdWVyeS5FdmVudAoJCQloYW5kbGVPYmogPSB0eXBlcy5oYW5kbGVPYmo7CgkJCWpRdWVyeSggdHlwZXMuZGVsZWdhdGVUYXJnZXQgKS5vZmYoCgkJCQloYW5kbGVPYmoubmFtZXNwYWNlID8gaGFuZGxlT2JqLm9yaWdUeXBlICsgIi4iICsgaGFuZGxlT2JqLm5hbWVzcGFjZSA6IGhhbmRsZU9iai5vcmlnVHlwZSwKCQkJCWhhbmRsZU9iai5zZWxlY3RvciwKCQkJCWhhbmRsZU9iai5oYW5kbGVyCgkJCSk7CgkJCXJldHVybiB0aGlzOwoJCX0KCQlpZiAoIHR5cGVvZiB0eXBlcyA9PT0gIm9iamVjdCIgKSB7CgkJCS8vICggdHlwZXMtb2JqZWN0IFssIHNlbGVjdG9yXSApCgkJCWZvciAoIHR5cGUgaW4gdHlwZXMgKSB7CgkJCQl0aGlzLm9mZiggdHlwZSwgc2VsZWN0b3IsIHR5cGVzWyB0eXBlIF0gKTsKCQkJfQoJCQlyZXR1cm4gdGhpczsKCQl9CgkJaWYgKCBzZWxlY3RvciA9PT0gZmFsc2UgfHwgdHlwZW9mIHNlbGVjdG9yID09PSAiZnVuY3Rpb24iICkgewoJCQkvLyAoIHR5cGVzIFssIGZuXSApCgkJCWZuID0gc2VsZWN0b3I7CgkJCXNlbGVjdG9yID0gdW5kZWZpbmVkOwoJCX0KCQlpZiAoIGZuID09PSBmYWxzZSApIHsKCQkJZm4gPSByZXR1cm5GYWxzZTsKCQl9CgkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgdHlwZXMsIGZuLCBzZWxlY3RvciApOwoJCX0pOwoJfSwKCgliaW5kOiBmdW5jdGlvbiggdHlwZXMsIGRhdGEsIGZuICkgewoJCXJldHVybiB0aGlzLm9uKCB0eXBlcywgbnVsbCwgZGF0YSwgZm4gKTsKCX0sCgl1bmJpbmQ6IGZ1bmN0aW9uKCB0eXBlcywgZm4gKSB7CgkJcmV0dXJuIHRoaXMub2ZmKCB0eXBlcywgbnVsbCwgZm4gKTsKCX0sCgoJbGl2ZTogZnVuY3Rpb24oIHR5cGVzLCBkYXRhLCBmbiApIHsKCQlqUXVlcnkoIHRoaXMuY29udGV4dCApLm9uKCB0eXBlcywgdGhpcy5zZWxlY3RvciwgZGF0YSwgZm4gKTsKCQlyZXR1cm4gdGhpczsKCX0sCglkaWU6IGZ1bmN0aW9uKCB0eXBlcywgZm4gKSB7CgkJalF1ZXJ5KCB0aGlzLmNvbnRleHQgKS5vZmYoIHR5cGVzLCB0aGlzLnNlbGVjdG9yIHx8ICIqKiIsIGZuICk7CgkJcmV0dXJuIHRoaXM7Cgl9LAoKCWRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBkYXRhLCBmbiApIHsKCQlyZXR1cm4gdGhpcy5vbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApOwoJfSwKCXVuZGVsZWdhdGU6IGZ1bmN0aW9uKCBzZWxlY3RvciwgdHlwZXMsIGZuICkgewoJCS8vICggbmFtZXNwYWNlICkgb3IgKCBzZWxlY3RvciwgdHlwZXMgWywgZm5dICkKCQlyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IHRoaXMub2ZmKCBzZWxlY3RvciwgIioqIiApIDogdGhpcy5vZmYoIHR5cGVzLCBzZWxlY3RvciB8fCAiKioiLCBmbiApOwoJfSwKCgl0cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpcyApOwoJCX0pOwoJfSwKCXRyaWdnZXJIYW5kbGVyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHsKCQlpZiAoIHRoaXNbMF0gKSB7CgkJCXJldHVybiBqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpc1swXSwgdHJ1ZSApOwoJCX0KCX0sCgoJdG9nZ2xlOiBmdW5jdGlvbiggZm4gKSB7CgkJLy8gU2F2ZSByZWZlcmVuY2UgdG8gYXJndW1lbnRzIGZvciBhY2Nlc3MgaW4gY2xvc3VyZQoJCXZhciBhcmdzID0gYXJndW1lbnRzLAoJCQlndWlkID0gZm4uZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrLAoJCQlpID0gMCwKCQkJdG9nZ2xlciA9IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCS8vIEZpZ3VyZSBvdXQgd2hpY2ggZnVuY3Rpb24gdG8gZXhlY3V0ZQoJCQkJdmFyIGxhc3RUb2dnbGUgPSAoIGpRdWVyeS5fZGF0YSggdGhpcywgImxhc3RUb2dnbGUiICsgZm4uZ3VpZCApIHx8IDAgKSAlIGk7CgkJCQlqUXVlcnkuX2RhdGEoIHRoaXMsICJsYXN0VG9nZ2xlIiArIGZuLmd1aWQsIGxhc3RUb2dnbGUgKyAxICk7CgoJCQkJLy8gTWFrZSBzdXJlIHRoYXQgY2xpY2tzIHN0b3AKCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgoJCQkJLy8gYW5kIGV4ZWN1dGUgdGhlIGZ1bmN0aW9uCgkJCQlyZXR1cm4gYXJnc1sgbGFzdFRvZ2dsZSBdLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSB8fCBmYWxzZTsKCQkJfTsKCgkJLy8gbGluayBhbGwgdGhlIGZ1bmN0aW9ucywgc28gYW55IG9mIHRoZW0gY2FuIHVuYmluZCB0aGlzIGNsaWNrIGhhbmRsZXIKCQl0b2dnbGVyLmd1aWQgPSBndWlkOwoJCXdoaWxlICggaSA8IGFyZ3MubGVuZ3RoICkgewoJCQlhcmdzWyBpKysgXS5ndWlkID0gZ3VpZDsKCQl9CgoJCXJldHVybiB0aGlzLmNsaWNrKCB0b2dnbGVyICk7Cgl9LAoKCWhvdmVyOiBmdW5jdGlvbiggZm5PdmVyLCBmbk91dCApIHsKCQlyZXR1cm4gdGhpcy5tb3VzZWVudGVyKCBmbk92ZXIgKS5tb3VzZWxlYXZlKCBmbk91dCB8fCBmbk92ZXIgKTsKCX0KfSk7CgpqUXVlcnkuZWFjaCggKCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgbG9hZCByZXNpemUgc2Nyb2xsIHVubG9hZCBjbGljayBkYmxjbGljayAiICsKCSJtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSAiICsKCSJjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGVycm9yIGNvbnRleHRtZW51Iikuc3BsaXQoIiAiKSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7CgoJLy8gSGFuZGxlIGV2ZW50IGJpbmRpbmcKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIGRhdGEsIGZuICkgewoJCWlmICggZm4gPT0gbnVsbCApIHsKCQkJZm4gPSBkYXRhOwoJCQlkYXRhID0gbnVsbDsKCQl9CgoJCXJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMCA/CgkJCXRoaXMub24oIG5hbWUsIG51bGwsIGRhdGEsIGZuICkgOgoJCQl0aGlzLnRyaWdnZXIoIG5hbWUgKTsKCX07CgoJaWYgKCBya2V5RXZlbnQudGVzdCggbmFtZSApICkgewoJCWpRdWVyeS5ldmVudC5maXhIb29rc1sgbmFtZSBdID0galF1ZXJ5LmV2ZW50LmtleUhvb2tzOwoJfQoKCWlmICggcm1vdXNlRXZlbnQudGVzdCggbmFtZSApICkgewoJCWpRdWVyeS5ldmVudC5maXhIb29rc1sgbmFtZSBdID0galF1ZXJ5LmV2ZW50Lm1vdXNlSG9va3M7Cgl9Cn0pOwovKiENCiAqIFNpenpsZSBDU1MgU2VsZWN0b3IgRW5naW5lDQogKiBDb3B5cmlnaHQgMjAxMiBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzDQogKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UNCiAqIGh0dHA6Ly9zaXp6bGVqcy5jb20vDQogKi8NCihmdW5jdGlvbiggd2luZG93LCB1bmRlZmluZWQgKSB7DQoNCnZhciBjYWNoZWRydW5zLA0KCWFzc2VydEdldElkTm90TmFtZSwNCglFeHByLA0KCWdldFRleHQsDQoJaXNYTUwsDQoJY29udGFpbnMsDQoJY29tcGlsZSwNCglzb3J0T3JkZXIsDQoJaGFzRHVwbGljYXRlLA0KCW91dGVybW9zdENvbnRleHQsDQoNCgliYXNlSGFzRHVwbGljYXRlID0gdHJ1ZSwNCglzdHJ1bmRlZmluZWQgPSAidW5kZWZpbmVkIiwNCg0KCWV4cGFuZG8gPSAoICJzaXpjYWNoZSIgKyBNYXRoLnJhbmRvbSgpICkucmVwbGFjZSggIi4iLCAiIiApLA0KDQoJVG9rZW4gPSBTdHJpbmcsDQoJZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQsDQoJZG9jRWxlbSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwNCglkaXJydW5zID0gMCwNCglkb25lID0gMCwNCglwb3AgPSBbXS5wb3AsDQoJcHVzaCA9IFtdLnB1c2gsDQoJc2xpY2UgPSBbXS5zbGljZSwNCgkvLyBVc2UgYSBzdHJpcHBlZC1kb3duIGluZGV4T2YgaWYgYSBuYXRpdmUgb25lIGlzIHVuYXZhaWxhYmxlDQoJaW5kZXhPZiA9IFtdLmluZGV4T2YgfHwgZnVuY3Rpb24oIGVsZW0gKSB7DQoJCXZhciBpID0gMCwNCgkJCWxlbiA9IHRoaXMubGVuZ3RoOw0KCQlmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsNCgkJCWlmICggdGhpc1tpXSA9PT0gZWxlbSApIHsNCgkJCQlyZXR1cm4gaTsNCgkJCX0NCgkJfQ0KCQlyZXR1cm4gLTE7DQoJfSwNCg0KCS8vIEF1Z21lbnQgYSBmdW5jdGlvbiBmb3Igc3BlY2lhbCB1c2UgYnkgU2l6emxlDQoJbWFya0Z1bmN0aW9uID0gZnVuY3Rpb24oIGZuLCB2YWx1ZSApIHsNCgkJZm5bIGV4cGFuZG8gXSA9IHZhbHVlID09IG51bGwgfHwgdmFsdWU7DQoJCXJldHVybiBmbjsNCgl9LA0KDQoJY3JlYXRlQ2FjaGUgPSBmdW5jdGlvbigpIHsNCgkJdmFyIGNhY2hlID0ge30sDQoJCQlrZXlzID0gW107DQoNCgkJcmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsNCgkJCS8vIE9ubHkga2VlcCB0aGUgbW9zdCByZWNlbnQgZW50cmllcw0KCQkJaWYgKCBrZXlzLnB1c2goIGtleSApID4gRXhwci5jYWNoZUxlbmd0aCApIHsNCgkJCQlkZWxldGUgY2FjaGVbIGtleXMuc2hpZnQoKSBdOw0KCQkJfQ0KDQoJCQkvLyBSZXRyaWV2ZSB3aXRoIChrZXkgKyAiICIpIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIG5hdGl2ZSBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKHNlZSBJc3N1ZSAjMTU3KQ0KCQkJcmV0dXJuIChjYWNoZVsga2V5ICsgIiAiIF0gPSB2YWx1ZSk7DQoJCX0sIGNhY2hlICk7DQoJfSwNCg0KCWNsYXNzQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLA0KCXRva2VuQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLA0KCWNvbXBpbGVyQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLA0KDQoJLy8gUmVnZXgNCg0KCS8vIFdoaXRlc3BhY2UgY2hhcmFjdGVycyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXNlbGVjdG9ycy8jd2hpdGVzcGFjZQ0KCXdoaXRlc3BhY2UgPSAiW1xceDIwXFx0XFxyXFxuXFxmXSIsDQoJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1zeW50YXgvI2NoYXJhY3RlcnMNCgljaGFyYWN0ZXJFbmNvZGluZyA9ICIoPzpcXFxcLnxbLVxcd118W15cXHgwMC1cXHhhMF0pKyIsDQoNCgkvLyBMb29zZWx5IG1vZGVsZWQgb24gQ1NTIGlkZW50aWZpZXIgY2hhcmFjdGVycw0KCS8vIEFuIHVucXVvdGVkIHZhbHVlIHNob3VsZCBiZSBhIENTUyBpZGVudGlmaWVyIChodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXNlbGVjdG9ycy8jYXR0cmlidXRlLXNlbGVjdG9ycykNCgkvLyBQcm9wZXIgc3ludGF4OiBodHRwOi8vd3d3LnczLm9yZy9UUi9DU1MyMS9zeW5kYXRhLmh0bWwjdmFsdWUtZGVmLWlkZW50aWZpZXINCglpZGVudGlmaWVyID0gY2hhcmFjdGVyRW5jb2RpbmcucmVwbGFjZSggInciLCAidyMiICksDQoNCgkvLyBBY2NlcHRhYmxlIG9wZXJhdG9ycyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2F0dHJpYnV0ZS1zZWxlY3RvcnMNCglvcGVyYXRvcnMgPSAiKFsqXiR8IX5dPz0pIiwNCglhdHRyaWJ1dGVzID0gIlxcWyIgKyB3aGl0ZXNwYWNlICsgIiooIiArIGNoYXJhY3RlckVuY29kaW5nICsgIikiICsgd2hpdGVzcGFjZSArDQoJCSIqKD86IiArIG9wZXJhdG9ycyArIHdoaXRlc3BhY2UgKyAiKig/OihbJ1wiXSkoKD86XFxcXC58W15cXFxcXSkqPylcXDN8KCIgKyBpZGVudGlmaWVyICsgIil8KXwpIiArIHdoaXRlc3BhY2UgKyAiKlxcXSIsDQoNCgkvLyBQcmVmZXIgYXJndW1lbnRzIG5vdCBpbiBwYXJlbnMvYnJhY2tldHMsDQoJLy8gICB0aGVuIGF0dHJpYnV0ZSBzZWxlY3RvcnMgYW5kIG5vbi1wc2V1ZG9zIChkZW5vdGVkIGJ5IDopLA0KCS8vICAgdGhlbiBhbnl0aGluZyBlbHNlDQoJLy8gVGhlc2UgcHJlZmVyZW5jZXMgYXJlIGhlcmUgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2Ygc2VsZWN0b3JzDQoJLy8gICBuZWVkaW5nIHRva2VuaXplIGluIHRoZSBQU0VVRE8gcHJlRmlsdGVyDQoJcHNldWRvcyA9ICI6KCIgKyBjaGFyYWN0ZXJFbmNvZGluZyArICIpKD86XFwoKD86KFsnXCJdKSgoPzpcXFxcLnxbXlxcXFxdKSo/KVxcMnwoW14oKVtcXF1dKnwoPzooPzoiICsgYXR0cmlidXRlcyArICIpfFteOl18XFxcXC4pKnwuKikpXFwpfCkiLA0KDQoJLy8gRm9yIG1hdGNoRXhwci5QT1MgYW5kIG1hdGNoRXhwci5uZWVkc0NvbnRleHQNCglwb3MgPSAiOihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXCgiICsgd2hpdGVzcGFjZSArDQoJCSIqKCg/Oi1cXGQpP1xcZCopIiArIHdoaXRlc3BhY2UgKyAiKlxcKXwpKD89W14tXXwkKSIsDQoNCgkvLyBMZWFkaW5nIGFuZCBub24tZXNjYXBlZCB0cmFpbGluZyB3aGl0ZXNwYWNlLCBjYXB0dXJpbmcgc29tZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHByZWNlZGluZyB0aGUgbGF0dGVyDQoJcnRyaW0gPSBuZXcgUmVnRXhwKCAiXiIgKyB3aGl0ZXNwYWNlICsgIit8KCg/Ol58W15cXFxcXSkoPzpcXFxcLikqKSIgKyB3aGl0ZXNwYWNlICsgIiskIiwgImciICksDQoNCglyY29tbWEgPSBuZXcgUmVnRXhwKCAiXiIgKyB3aGl0ZXNwYWNlICsgIiosIiArIHdoaXRlc3BhY2UgKyAiKiIgKSwNCglyY29tYmluYXRvcnMgPSBuZXcgUmVnRXhwKCAiXiIgKyB3aGl0ZXNwYWNlICsgIiooW1xceDIwXFx0XFxyXFxuXFxmPit+XSkiICsgd2hpdGVzcGFjZSArICIqIiApLA0KCXJwc2V1ZG8gPSBuZXcgUmVnRXhwKCBwc2V1ZG9zICksDQoNCgkvLyBFYXNpbHktcGFyc2VhYmxlL3JldHJpZXZhYmxlIElEIG9yIFRBRyBvciBDTEFTUyBzZWxlY3RvcnMNCglycXVpY2tFeHByID0gL14oPzojKFtcd1wtXSspfChcdyspfFwuKFtcd1wtXSspKSQvLA0KDQoJcm5vdCA9IC9eOm5vdC8sDQoJcnNpYmxpbmcgPSAvW1x4MjBcdFxyXG5cZl0qWyt+XS8sDQoJcmVuZHNXaXRoTm90ID0gLzpub3RcKCQvLA0KDQoJcmhlYWRlciA9IC9oXGQvaSwNCglyaW5wdXRzID0gL2lucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24vaSwNCg0KCXJiYWNrc2xhc2ggPSAvXFwoPyFcXCkvZywNCg0KCW1hdGNoRXhwciA9IHsNCgkJIklEIjogbmV3IFJlZ0V4cCggIl4jKCIgKyBjaGFyYWN0ZXJFbmNvZGluZyArICIpIiApLA0KCQkiQ0xBU1MiOiBuZXcgUmVnRXhwKCAiXlxcLigiICsgY2hhcmFjdGVyRW5jb2RpbmcgKyAiKSIgKSwNCgkJIk5BTUUiOiBuZXcgUmVnRXhwKCAiXlxcW25hbWU9WydcIl0/KCIgKyBjaGFyYWN0ZXJFbmNvZGluZyArICIpWydcIl0/XFxdIiApLA0KCQkiVEFHIjogbmV3IFJlZ0V4cCggIl4oIiArIGNoYXJhY3RlckVuY29kaW5nLnJlcGxhY2UoICJ3IiwgIncqIiApICsgIikiICksDQoJCSJBVFRSIjogbmV3IFJlZ0V4cCggIl4iICsgYXR0cmlidXRlcyApLA0KCQkiUFNFVURPIjogbmV3IFJlZ0V4cCggIl4iICsgcHNldWRvcyApLA0KCQkiUE9TIjogbmV3IFJlZ0V4cCggcG9zLCAiaSIgKSwNCgkJIkNISUxEIjogbmV3IFJlZ0V4cCggIl46KG9ubHl8bnRofGZpcnN0fGxhc3QpLWNoaWxkKD86XFwoIiArIHdoaXRlc3BhY2UgKw0KCQkJIiooZXZlbnxvZGR8KChbKy1dfCkoXFxkKilufCkiICsgd2hpdGVzcGFjZSArICIqKD86KFsrLV18KSIgKyB3aGl0ZXNwYWNlICsNCgkJCSIqKFxcZCspfCkpIiArIHdoaXRlc3BhY2UgKyAiKlxcKXwpIiwgImkiICksDQoJCS8vIEZvciB1c2UgaW4gbGlicmFyaWVzIGltcGxlbWVudGluZyAuaXMoKQ0KCQkibmVlZHNDb250ZXh0IjogbmV3IFJlZ0V4cCggIl4iICsgd2hpdGVzcGFjZSArICIqWz4rfl18IiArIHBvcywgImkiICkNCgl9LA0KDQoJLy8gU3VwcG9ydA0KDQoJLy8gVXNlZCBmb3IgdGVzdGluZyBzb21ldGhpbmcgb24gYW4gZWxlbWVudA0KCWFzc2VydCA9IGZ1bmN0aW9uKCBmbiApIHsNCgkJdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KDQoJCXRyeSB7DQoJCQlyZXR1cm4gZm4oIGRpdiApOw0KCQl9IGNhdGNoIChlKSB7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0gZmluYWxseSB7DQoJCQkvLyByZWxlYXNlIG1lbW9yeSBpbiBJRQ0KCQkJZGl2ID0gbnVsbDsNCgkJfQ0KCX0sDQoNCgkvLyBDaGVjayBpZiBnZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpIHJldHVybnMgb25seSBlbGVtZW50cw0KCWFzc2VydFRhZ05hbWVOb0NvbW1lbnRzID0gYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7DQoJCWRpdi5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlQ29tbWVudCgiIikgKTsNCgkJcmV0dXJuICFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGg7DQoJfSksDQoNCgkvLyBDaGVjayBpZiBnZXRBdHRyaWJ1dGUgcmV0dXJucyBub3JtYWxpemVkIGhyZWYgYXR0cmlidXRlcw0KCWFzc2VydEhyZWZOb3ROb3JtYWxpemVkID0gYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7DQoJCWRpdi5pbm5lckhUTUwgPSAiPGEgaHJlZj0nIyc+PC9hPiI7DQoJCXJldHVybiBkaXYuZmlyc3RDaGlsZCAmJiB0eXBlb2YgZGl2LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlICE9PSBzdHJ1bmRlZmluZWQgJiYNCgkJCWRpdi5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpID09PSAiIyI7DQoJfSksDQoNCgkvLyBDaGVjayBpZiBhdHRyaWJ1dGVzIHNob3VsZCBiZSByZXRyaWV2ZWQgYnkgYXR0cmlidXRlIG5vZGVzDQoJYXNzZXJ0QXR0cmlidXRlcyA9IGFzc2VydChmdW5jdGlvbiggZGl2ICkgew0KCQlkaXYuaW5uZXJIVE1MID0gIjxzZWxlY3Q+PC9zZWxlY3Q+IjsNCgkJdmFyIHR5cGUgPSB0eXBlb2YgZGl2Lmxhc3RDaGlsZC5nZXRBdHRyaWJ1dGUoIm11bHRpcGxlIik7DQoJCS8vIElFOCByZXR1cm5zIGEgc3RyaW5nIGZvciBzb21lIGF0dHJpYnV0ZXMgZXZlbiB3aGVuIG5vdCBwcmVzZW50DQoJCXJldHVybiB0eXBlICE9PSAiYm9vbGVhbiIgJiYgdHlwZSAhPT0gInN0cmluZyI7DQoJfSksDQoNCgkvLyBDaGVjayBpZiBnZXRFbGVtZW50c0J5Q2xhc3NOYW1lIGNhbiBiZSB0cnVzdGVkDQoJYXNzZXJ0VXNhYmxlQ2xhc3NOYW1lID0gYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7DQoJCS8vIE9wZXJhIGNhbid0IGZpbmQgYSBzZWNvbmQgY2xhc3NuYW1lIChpbiA5LjYpDQoJCWRpdi5pbm5lckhUTUwgPSAiPGRpdiBjbGFzcz0naGlkZGVuIGUnPjwvZGl2PjxkaXYgY2xhc3M9J2hpZGRlbic+PC9kaXY+IjsNCgkJaWYgKCAhZGl2LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgfHwgIWRpdi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoICkgew0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoNCgkJLy8gU2FmYXJpIDMuMiBjYWNoZXMgY2xhc3MgYXR0cmlidXRlcyBhbmQgZG9lc24ndCBjYXRjaCBjaGFuZ2VzDQoJCWRpdi5sYXN0Q2hpbGQuY2xhc3NOYW1lID0gImUiOw0KCQlyZXR1cm4gZGl2LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGggPT09IDI7DQoJfSksDQoNCgkvLyBDaGVjayBpZiBnZXRFbGVtZW50QnlJZCByZXR1cm5zIGVsZW1lbnRzIGJ5IG5hbWUNCgkvLyBDaGVjayBpZiBnZXRFbGVtZW50c0J5TmFtZSBwcml2aWxlZ2VzIGZvcm0gY29udHJvbHMgb3IgcmV0dXJucyBlbGVtZW50cyBieSBJRA0KCWFzc2VydFVzYWJsZU5hbWUgPSBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsNCgkJLy8gSW5qZWN0IGNvbnRlbnQNCgkJZGl2LmlkID0gZXhwYW5kbyArIDA7DQoJCWRpdi5pbm5lckhUTUwgPSAiPGEgbmFtZT0nIiArIGV4cGFuZG8gKyAiJz48L2E+PGRpdiBuYW1lPSciICsgZXhwYW5kbyArICInPjwvZGl2PiI7DQoJCWRvY0VsZW0uaW5zZXJ0QmVmb3JlKCBkaXYsIGRvY0VsZW0uZmlyc3RDaGlsZCApOw0KDQoJCS8vIFRlc3QNCgkJdmFyIHBhc3MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSAmJg0KCQkJLy8gYnVnZ3kgYnJvd3NlcnMgd2lsbCByZXR1cm4gZmV3ZXIgdGhhbiB0aGUgY29ycmVjdCAyDQoJCQlkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSggZXhwYW5kbyApLmxlbmd0aCA9PT0gMiArDQoJCQkvLyBidWdneSBicm93c2VycyB3aWxsIHJldHVybiBtb3JlIHRoYW4gdGhlIGNvcnJlY3QgMA0KCQkJZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoIGV4cGFuZG8gKyAwICkubGVuZ3RoOw0KCQlhc3NlcnRHZXRJZE5vdE5hbWUgPSAhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIGV4cGFuZG8gKTsNCg0KCQkvLyBDbGVhbnVwDQoJCWRvY0VsZW0ucmVtb3ZlQ2hpbGQoIGRpdiApOw0KDQoJCXJldHVybiBwYXNzOw0KCX0pOw0KDQovLyBJZiBzbGljZSBpcyBub3QgYXZhaWxhYmxlLCBwcm92aWRlIGEgYmFja3VwDQp0cnkgew0KCXNsaWNlLmNhbGwoIGRvY0VsZW0uY2hpbGROb2RlcywgMCApWzBdLm5vZGVUeXBlOw0KfSBjYXRjaCAoIGUgKSB7DQoJc2xpY2UgPSBmdW5jdGlvbiggaSApIHsNCgkJdmFyIGVsZW0sDQoJCQlyZXN1bHRzID0gW107DQoJCWZvciAoIDsgKGVsZW0gPSB0aGlzW2ldKTsgaSsrICkgew0KCQkJcmVzdWx0cy5wdXNoKCBlbGVtICk7DQoJCX0NCgkJcmV0dXJuIHJlc3VsdHM7DQoJfTsNCn0NCg0KZnVuY3Rpb24gU2l6emxlKCBzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApIHsNCglyZXN1bHRzID0gcmVzdWx0cyB8fCBbXTsNCgljb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDsNCgl2YXIgbWF0Y2gsIGVsZW0sIHhtbCwgbSwNCgkJbm9kZVR5cGUgPSBjb250ZXh0Lm5vZGVUeXBlOw0KDQoJaWYgKCAhc2VsZWN0b3IgfHwgdHlwZW9mIHNlbGVjdG9yICE9PSAic3RyaW5nIiApIHsNCgkJcmV0dXJuIHJlc3VsdHM7DQoJfQ0KDQoJaWYgKCBub2RlVHlwZSAhPT0gMSAmJiBub2RlVHlwZSAhPT0gOSApIHsNCgkJcmV0dXJuIFtdOw0KCX0NCg0KCXhtbCA9IGlzWE1MKCBjb250ZXh0ICk7DQoNCglpZiAoICF4bWwgJiYgIXNlZWQgKSB7DQoJCWlmICggKG1hdGNoID0gcnF1aWNrRXhwci5leGVjKCBzZWxlY3RvciApKSApIHsNCgkJCS8vIFNwZWVkLXVwOiBTaXp6bGUoIiNJRCIpDQoJCQlpZiAoIChtID0gbWF0Y2hbMV0pICkgew0KCQkJCWlmICggbm9kZVR5cGUgPT09IDkgKSB7DQoJCQkJCWVsZW0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICk7DQoJCQkJCS8vIENoZWNrIHBhcmVudE5vZGUgdG8gY2F0Y2ggd2hlbiBCbGFja2JlcnJ5IDQuNiByZXR1cm5zDQoJCQkJCS8vIG5vZGVzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQgIzY5NjMNCgkJCQkJaWYgKCBlbGVtICYmIGVsZW0ucGFyZW50Tm9kZSApIHsNCgkJCQkJCS8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBJRSwgT3BlcmEsIGFuZCBXZWJraXQgcmV0dXJuIGl0ZW1zDQoJCQkJCQkvLyBieSBuYW1lIGluc3RlYWQgb2YgSUQNCgkJCQkJCWlmICggZWxlbS5pZCA9PT0gbSApIHsNCgkJCQkJCQlyZXN1bHRzLnB1c2goIGVsZW0gKTsNCgkJCQkJCQlyZXR1cm4gcmVzdWx0czsNCgkJCQkJCX0NCgkJCQkJfSBlbHNlIHsNCgkJCQkJCXJldHVybiByZXN1bHRzOw0KCQkJCQl9DQoJCQkJfSBlbHNlIHsNCgkJCQkJLy8gQ29udGV4dCBpcyBub3QgYSBkb2N1bWVudA0KCQkJCQlpZiAoIGNvbnRleHQub3duZXJEb2N1bWVudCAmJiAoZWxlbSA9IGNvbnRleHQub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZCggbSApKSAmJg0KCQkJCQkJY29udGFpbnMoIGNvbnRleHQsIGVsZW0gKSAmJiBlbGVtLmlkID09PSBtICkgew0KCQkJCQkJcmVzdWx0cy5wdXNoKCBlbGVtICk7DQoJCQkJCQlyZXR1cm4gcmVzdWx0czsNCgkJCQkJfQ0KCQkJCX0NCg0KCQkJLy8gU3BlZWQtdXA6IFNpenpsZSgiVEFHIikNCgkJCX0gZWxzZSBpZiAoIG1hdGNoWzJdICkgew0KCQkJCXB1c2guYXBwbHkoIHJlc3VsdHMsIHNsaWNlLmNhbGwoY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggc2VsZWN0b3IgKSwgMCkgKTsNCgkJCQlyZXR1cm4gcmVzdWx0czsNCg0KCQkJLy8gU3BlZWQtdXA6IFNpenpsZSgiLkNMQVNTIikNCgkJCX0gZWxzZSBpZiAoIChtID0gbWF0Y2hbM10pICYmIGFzc2VydFVzYWJsZUNsYXNzTmFtZSAmJiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKSB7DQoJCQkJcHVzaC5hcHBseSggcmVzdWx0cywgc2xpY2UuY2FsbChjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIG0gKSwgMCkgKTsNCgkJCQlyZXR1cm4gcmVzdWx0czsNCgkJCX0NCgkJfQ0KCX0NCg0KCS8vIEFsbCBvdGhlcnMNCglyZXR1cm4gc2VsZWN0KCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgIiQxIiApLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkLCB4bWwgKTsNCn0NCg0KU2l6emxlLm1hdGNoZXMgPSBmdW5jdGlvbiggZXhwciwgZWxlbWVudHMgKSB7DQoJcmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgZWxlbWVudHMgKTsNCn07DQoNClNpenpsZS5tYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbiggZWxlbSwgZXhwciApIHsNCglyZXR1cm4gU2l6emxlKCBleHByLCBudWxsLCBudWxsLCBbIGVsZW0gXSApLmxlbmd0aCA+IDA7DQp9Ow0KDQovLyBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIGlucHV0IHR5cGVzDQpmdW5jdGlvbiBjcmVhdGVJbnB1dFBzZXVkbyggdHlwZSApIHsNCglyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7DQoJCXZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOw0KCQlyZXR1cm4gbmFtZSA9PT0gImlucHV0IiAmJiBlbGVtLnR5cGUgPT09IHR5cGU7DQoJfTsNCn0NCg0KLy8gUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBidXR0b25zDQpmdW5jdGlvbiBjcmVhdGVCdXR0b25Qc2V1ZG8oIHR5cGUgKSB7DQoJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgew0KCQl2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsNCgkJcmV0dXJuIChuYW1lID09PSAiaW5wdXQiIHx8IG5hbWUgPT09ICJidXR0b24iKSAmJiBlbGVtLnR5cGUgPT09IHR5cGU7DQoJfTsNCn0NCg0KLy8gUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBwb3NpdGlvbmFscw0KZnVuY3Rpb24gY3JlYXRlUG9zaXRpb25hbFBzZXVkbyggZm4gKSB7DQoJcmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggYXJndW1lbnQgKSB7DQoJCWFyZ3VtZW50ID0gK2FyZ3VtZW50Ow0KCQlyZXR1cm4gbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWVkLCBtYXRjaGVzICkgew0KCQkJdmFyIGosDQoJCQkJbWF0Y2hJbmRleGVzID0gZm4oIFtdLCBzZWVkLmxlbmd0aCwgYXJndW1lbnQgKSwNCgkJCQlpID0gbWF0Y2hJbmRleGVzLmxlbmd0aDsNCg0KCQkJLy8gTWF0Y2ggZWxlbWVudHMgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBpbmRleGVzDQoJCQl3aGlsZSAoIGktLSApIHsNCgkJCQlpZiAoIHNlZWRbIChqID0gbWF0Y2hJbmRleGVzW2ldKSBdICkgew0KCQkJCQlzZWVkW2pdID0gIShtYXRjaGVzW2pdID0gc2VlZFtqXSk7DQoJCQkJfQ0KCQkJfQ0KCQl9KTsNCgl9KTsNCn0NCg0KLyoqDQogKiBVdGlsaXR5IGZ1bmN0aW9uIGZvciByZXRyaWV2aW5nIHRoZSB0ZXh0IHZhbHVlIG9mIGFuIGFycmF5IG9mIERPTSBub2Rlcw0KICogQHBhcmFtIHtBcnJheXxFbGVtZW50fSBlbGVtDQogKi8NCmdldFRleHQgPSBTaXp6bGUuZ2V0VGV4dCA9IGZ1bmN0aW9uKCBlbGVtICkgew0KCXZhciBub2RlLA0KCQlyZXQgPSAiIiwNCgkJaSA9IDAsDQoJCW5vZGVUeXBlID0gZWxlbS5ub2RlVHlwZTsNCg0KCWlmICggbm9kZVR5cGUgKSB7DQoJCWlmICggbm9kZVR5cGUgPT09IDEgfHwgbm9kZVR5cGUgPT09IDkgfHwgbm9kZVR5cGUgPT09IDExICkgew0KCQkJLy8gVXNlIHRleHRDb250ZW50IGZvciBlbGVtZW50cw0KCQkJLy8gaW5uZXJUZXh0IHVzYWdlIHJlbW92ZWQgZm9yIGNvbnNpc3RlbmN5IG9mIG5ldyBsaW5lcyAoc2VlICMxMTE1MykNCgkJCWlmICggdHlwZW9mIGVsZW0udGV4dENvbnRlbnQgPT09ICJzdHJpbmciICkgew0KCQkJCXJldHVybiBlbGVtLnRleHRDb250ZW50Ow0KCQkJfSBlbHNlIHsNCgkJCQkvLyBUcmF2ZXJzZSBpdHMgY2hpbGRyZW4NCgkJCQlmb3IgKCBlbGVtID0gZWxlbS5maXJzdENoaWxkOyBlbGVtOyBlbGVtID0gZWxlbS5uZXh0U2libGluZyApIHsNCgkJCQkJcmV0ICs9IGdldFRleHQoIGVsZW0gKTsNCgkJCQl9DQoJCQl9DQoJCX0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAzIHx8IG5vZGVUeXBlID09PSA0ICkgew0KCQkJcmV0dXJuIGVsZW0ubm9kZVZhbHVlOw0KCQl9DQoJCS8vIERvIG5vdCBpbmNsdWRlIGNvbW1lbnQgb3IgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBub2Rlcw0KCX0gZWxzZSB7DQoNCgkJLy8gSWYgbm8gbm9kZVR5cGUsIHRoaXMgaXMgZXhwZWN0ZWQgdG8gYmUgYW4gYXJyYXkNCgkJZm9yICggOyAobm9kZSA9IGVsZW1baV0pOyBpKysgKSB7DQoJCQkvLyBEbyBub3QgdHJhdmVyc2UgY29tbWVudCBub2Rlcw0KCQkJcmV0ICs9IGdldFRleHQoIG5vZGUgKTsNCgkJfQ0KCX0NCglyZXR1cm4gcmV0Ow0KfTsNCg0KaXNYTUwgPSBTaXp6bGUuaXNYTUwgPSBmdW5jdGlvbiggZWxlbSApIHsNCgkvLyBkb2N1bWVudEVsZW1lbnQgaXMgdmVyaWZpZWQgZm9yIGNhc2VzIHdoZXJlIGl0IGRvZXNuJ3QgeWV0IGV4aXN0DQoJLy8gKHN1Y2ggYXMgbG9hZGluZyBpZnJhbWVzIGluIElFIC0gIzQ4MzMpDQoJdmFyIGRvY3VtZW50RWxlbWVudCA9IGVsZW0gJiYgKGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtKS5kb2N1bWVudEVsZW1lbnQ7DQoJcmV0dXJuIGRvY3VtZW50RWxlbWVudCA/IGRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gIkhUTUwiIDogZmFsc2U7DQp9Ow0KDQovLyBFbGVtZW50IGNvbnRhaW5zIGFub3RoZXINCmNvbnRhaW5zID0gU2l6emxlLmNvbnRhaW5zID0gZG9jRWxlbS5jb250YWlucyA/DQoJZnVuY3Rpb24oIGEsIGIgKSB7DQoJCXZhciBhZG93biA9IGEubm9kZVR5cGUgPT09IDkgPyBhLmRvY3VtZW50RWxlbWVudCA6IGEsDQoJCQlidXAgPSBiICYmIGIucGFyZW50Tm9kZTsNCgkJcmV0dXJuIGEgPT09IGJ1cCB8fCAhISggYnVwICYmIGJ1cC5ub2RlVHlwZSA9PT0gMSAmJiBhZG93bi5jb250YWlucyAmJiBhZG93bi5jb250YWlucyhidXApICk7DQoJfSA6DQoJZG9jRWxlbS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiA/DQoJZnVuY3Rpb24oIGEsIGIgKSB7DQoJCXJldHVybiBiICYmICEhKCBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBiICkgJiAxNiApOw0KCX0gOg0KCWZ1bmN0aW9uKCBhLCBiICkgew0KCQl3aGlsZSAoIChiID0gYi5wYXJlbnROb2RlKSApIHsNCgkJCWlmICggYiA9PT0gYSApIHsNCgkJCQlyZXR1cm4gdHJ1ZTsNCgkJCX0NCgkJfQ0KCQlyZXR1cm4gZmFsc2U7DQoJfTsNCg0KU2l6emxlLmF0dHIgPSBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsNCgl2YXIgdmFsLA0KCQl4bWwgPSBpc1hNTCggZWxlbSApOw0KDQoJaWYgKCAheG1sICkgew0KCQluYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOw0KCX0NCglpZiAoICh2YWwgPSBFeHByLmF0dHJIYW5kbGVbIG5hbWUgXSkgKSB7DQoJCXJldHVybiB2YWwoIGVsZW0gKTsNCgl9DQoJaWYgKCB4bWwgfHwgYXNzZXJ0QXR0cmlidXRlcyApIHsNCgkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICk7DQoJfQ0KCXZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApOw0KCXJldHVybiB2YWwgPw0KCQl0eXBlb2YgZWxlbVsgbmFtZSBdID09PSAiYm9vbGVhbiIgPw0KCQkJZWxlbVsgbmFtZSBdID8gbmFtZSA6IG51bGwgOg0KCQkJdmFsLnNwZWNpZmllZCA/IHZhbC52YWx1ZSA6IG51bGwgOg0KCQludWxsOw0KfTsNCg0KRXhwciA9IFNpenpsZS5zZWxlY3RvcnMgPSB7DQoNCgkvLyBDYW4gYmUgYWRqdXN0ZWQgYnkgdGhlIHVzZXINCgljYWNoZUxlbmd0aDogNTAsDQoNCgljcmVhdGVQc2V1ZG86IG1hcmtGdW5jdGlvbiwNCg0KCW1hdGNoOiBtYXRjaEV4cHIsDQoNCgkvLyBJRTYvNyByZXR1cm4gYSBtb2RpZmllZCBocmVmDQoJYXR0ckhhbmRsZTogYXNzZXJ0SHJlZk5vdE5vcm1hbGl6ZWQgPw0KCQl7fSA6DQoJCXsNCgkJCSJocmVmIjogZnVuY3Rpb24oIGVsZW0gKSB7DQoJCQkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCAiaHJlZiIsIDIgKTsNCgkJCX0sDQoJCQkidHlwZSI6IGZ1bmN0aW9uKCBlbGVtICkgew0KCQkJCXJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSgidHlwZSIpOw0KCQkJfQ0KCQl9LA0KDQoJZmluZDogew0KCQkiSUQiOiBhc3NlcnRHZXRJZE5vdE5hbWUgPw0KCQkJZnVuY3Rpb24oIGlkLCBjb250ZXh0LCB4bWwgKSB7DQoJCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gc3RydW5kZWZpbmVkICYmICF4bWwgKSB7DQoJCQkJCXZhciBtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggaWQgKTsNCgkJCQkJLy8gQ2hlY2sgcGFyZW50Tm9kZSB0byBjYXRjaCB3aGVuIEJsYWNrYmVycnkgNC42IHJldHVybnMNCgkJCQkJLy8gbm9kZXMgdGhhdCBhcmUgbm8gbG9uZ2VyIGluIHRoZSBkb2N1bWVudCAjNjk2Mw0KCQkJCQlyZXR1cm4gbSAmJiBtLnBhcmVudE5vZGUgPyBbbV0gOiBbXTsNCgkJCQl9DQoJCQl9IDoNCgkJCWZ1bmN0aW9uKCBpZCwgY29udGV4dCwgeG1sICkgew0KCQkJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQgIT09IHN0cnVuZGVmaW5lZCAmJiAheG1sICkgew0KCQkJCQl2YXIgbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIGlkICk7DQoNCgkJCQkJcmV0dXJuIG0gPw0KCQkJCQkJbS5pZCA9PT0gaWQgfHwgdHlwZW9mIG0uZ2V0QXR0cmlidXRlTm9kZSAhPT0gc3RydW5kZWZpbmVkICYmIG0uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKS52YWx1ZSA9PT0gaWQgPw0KCQkJCQkJCVttXSA6DQoJCQkJCQkJdW5kZWZpbmVkIDoNCgkJCQkJCVtdOw0KCQkJCX0NCgkJCX0sDQoNCgkJIlRBRyI6IGFzc2VydFRhZ05hbWVOb0NvbW1lbnRzID8NCgkJCWZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7DQoJCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gc3RydW5kZWZpbmVkICkgew0KCQkJCQlyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnICk7DQoJCQkJfQ0KCQkJfSA6DQoJCQlmdW5jdGlvbiggdGFnLCBjb250ZXh0ICkgew0KCQkJCXZhciByZXN1bHRzID0gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnICk7DQoNCgkJCQkvLyBGaWx0ZXIgb3V0IHBvc3NpYmxlIGNvbW1lbnRzDQoJCQkJaWYgKCB0YWcgPT09ICIqIiApIHsNCgkJCQkJdmFyIGVsZW0sDQoJCQkJCQl0bXAgPSBbXSwNCgkJCQkJCWkgPSAwOw0KDQoJCQkJCWZvciAoIDsgKGVsZW0gPSByZXN1bHRzW2ldKTsgaSsrICkgew0KCQkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgew0KCQkJCQkJCXRtcC5wdXNoKCBlbGVtICk7DQoJCQkJCQl9DQoJCQkJCX0NCg0KCQkJCQlyZXR1cm4gdG1wOw0KCQkJCX0NCgkJCQlyZXR1cm4gcmVzdWx0czsNCgkJCX0sDQoNCgkJIk5BTUUiOiBhc3NlcnRVc2FibGVOYW1lICYmIGZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7DQoJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlOYW1lICE9PSBzdHJ1bmRlZmluZWQgKSB7DQoJCQkJcmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeU5hbWUoIG5hbWUgKTsNCgkJCX0NCgkJfSwNCg0KCQkiQ0xBU1MiOiBhc3NlcnRVc2FibGVDbGFzc05hbWUgJiYgZnVuY3Rpb24oIGNsYXNzTmFtZSwgY29udGV4dCwgeG1sICkgew0KCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICE9PSBzdHJ1bmRlZmluZWQgJiYgIXhtbCApIHsNCgkJCQlyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCBjbGFzc05hbWUgKTsNCgkJCX0NCgkJfQ0KCX0sDQoNCglyZWxhdGl2ZTogew0KCQkiPiI6IHsgZGlyOiAicGFyZW50Tm9kZSIsIGZpcnN0OiB0cnVlIH0sDQoJCSIgIjogeyBkaXI6ICJwYXJlbnROb2RlIiB9LA0KCQkiKyI6IHsgZGlyOiAicHJldmlvdXNTaWJsaW5nIiwgZmlyc3Q6IHRydWUgfSwNCgkJIn4iOiB7IGRpcjogInByZXZpb3VzU2libGluZyIgfQ0KCX0sDQoNCglwcmVGaWx0ZXI6IHsNCgkJIkFUVFIiOiBmdW5jdGlvbiggbWF0Y2ggKSB7DQoJCQltYXRjaFsxXSA9IG1hdGNoWzFdLnJlcGxhY2UoIHJiYWNrc2xhc2gsICIiICk7DQoNCgkJCS8vIE1vdmUgdGhlIGdpdmVuIHZhbHVlIHRvIG1hdGNoWzNdIHdoZXRoZXIgcXVvdGVkIG9yIHVucXVvdGVkDQoJCQltYXRjaFszXSA9ICggbWF0Y2hbNF0gfHwgbWF0Y2hbNV0gfHwgIiIgKS5yZXBsYWNlKCByYmFja3NsYXNoLCAiIiApOw0KDQoJCQlpZiAoIG1hdGNoWzJdID09PSAifj0iICkgew0KCQkJCW1hdGNoWzNdID0gIiAiICsgbWF0Y2hbM10gKyAiICI7DQoJCQl9DQoNCgkJCXJldHVybiBtYXRjaC5zbGljZSggMCwgNCApOw0KCQl9LA0KDQoJCSJDSElMRCI6IGZ1bmN0aW9uKCBtYXRjaCApIHsNCgkJCS8qIG1hdGNoZXMgZnJvbSBtYXRjaEV4cHJbIkNISUxEIl0NCgkJCQkxIHR5cGUgKG9ubHl8bnRofC4uLikNCgkJCQkyIGFyZ3VtZW50IChldmVufG9kZHxcZCp8XGQqbihbKy1dXGQrKT98Li4uKQ0KCQkJCTMgeG4tY29tcG9uZW50IG9mIHhuK3kgYXJndW1lbnQgKFsrLV0/XGQqbnwpDQoJCQkJNCBzaWduIG9mIHhuLWNvbXBvbmVudA0KCQkJCTUgeCBvZiB4bi1jb21wb25lbnQNCgkJCQk2IHNpZ24gb2YgeS1jb21wb25lbnQNCgkJCQk3IHkgb2YgeS1jb21wb25lbnQNCgkJCSovDQoJCQltYXRjaFsxXSA9IG1hdGNoWzFdLnRvTG93ZXJDYXNlKCk7DQoNCgkJCWlmICggbWF0Y2hbMV0gPT09ICJudGgiICkgew0KCQkJCS8vIG50aC1jaGlsZCByZXF1aXJlcyBhcmd1bWVudA0KCQkJCWlmICggIW1hdGNoWzJdICkgew0KCQkJCQlTaXp6bGUuZXJyb3IoIG1hdGNoWzBdICk7DQoJCQkJfQ0KDQoJCQkJLy8gbnVtZXJpYyB4IGFuZCB5IHBhcmFtZXRlcnMgZm9yIEV4cHIuZmlsdGVyLkNISUxEDQoJCQkJLy8gcmVtZW1iZXIgdGhhdCBmYWxzZS90cnVlIGNhc3QgcmVzcGVjdGl2ZWx5IHRvIDAvMQ0KCQkJCW1hdGNoWzNdID0gKyggbWF0Y2hbM10gPyBtYXRjaFs0XSArIChtYXRjaFs1XSB8fCAxKSA6IDIgKiAoIG1hdGNoWzJdID09PSAiZXZlbiIgfHwgbWF0Y2hbMl0gPT09ICJvZGQiICkgKTsNCgkJCQltYXRjaFs0XSA9ICsoICggbWF0Y2hbNl0gKyBtYXRjaFs3XSApIHx8IG1hdGNoWzJdID09PSAib2RkIiApOw0KDQoJCQkvLyBvdGhlciB0eXBlcyBwcm9oaWJpdCBhcmd1bWVudHMNCgkJCX0gZWxzZSBpZiAoIG1hdGNoWzJdICkgew0KCQkJCVNpenpsZS5lcnJvciggbWF0Y2hbMF0gKTsNCgkJCX0NCg0KCQkJcmV0dXJuIG1hdGNoOw0KCQl9LA0KDQoJCSJQU0VVRE8iOiBmdW5jdGlvbiggbWF0Y2ggKSB7DQoJCQl2YXIgdW5xdW90ZWQsIGV4Y2VzczsNCgkJCWlmICggbWF0Y2hFeHByWyJDSElMRCJdLnRlc3QoIG1hdGNoWzBdICkgKSB7DQoJCQkJcmV0dXJuIG51bGw7DQoJCQl9DQoNCgkJCWlmICggbWF0Y2hbM10gKSB7DQoJCQkJbWF0Y2hbMl0gPSBtYXRjaFszXTsNCgkJCX0gZWxzZSBpZiAoICh1bnF1b3RlZCA9IG1hdGNoWzRdKSApIHsNCgkJCQkvLyBPbmx5IGNoZWNrIGFyZ3VtZW50cyB0aGF0IGNvbnRhaW4gYSBwc2V1ZG8NCgkJCQlpZiAoIHJwc2V1ZG8udGVzdCh1bnF1b3RlZCkgJiYNCgkJCQkJLy8gR2V0IGV4Y2VzcyBmcm9tIHRva2VuaXplIChyZWN1cnNpdmVseSkNCgkJCQkJKGV4Y2VzcyA9IHRva2VuaXplKCB1bnF1b3RlZCwgdHJ1ZSApKSAmJg0KCQkJCQkvLyBhZHZhbmNlIHRvIHRoZSBuZXh0IGNsb3NpbmcgcGFyZW50aGVzaXMNCgkJCQkJKGV4Y2VzcyA9IHVucXVvdGVkLmluZGV4T2YoICIpIiwgdW5xdW90ZWQubGVuZ3RoIC0gZXhjZXNzICkgLSB1bnF1b3RlZC5sZW5ndGgpICkgew0KDQoJCQkJCS8vIGV4Y2VzcyBpcyBhIG5lZ2F0aXZlIGluZGV4DQoJCQkJCXVucXVvdGVkID0gdW5xdW90ZWQuc2xpY2UoIDAsIGV4Y2VzcyApOw0KCQkJCQltYXRjaFswXSA9IG1hdGNoWzBdLnNsaWNlKCAwLCBleGNlc3MgKTsNCgkJCQl9DQoJCQkJbWF0Y2hbMl0gPSB1bnF1b3RlZDsNCgkJCX0NCg0KCQkJLy8gUmV0dXJuIG9ubHkgY2FwdHVyZXMgbmVlZGVkIGJ5IHRoZSBwc2V1ZG8gZmlsdGVyIG1ldGhvZCAodHlwZSBhbmQgYXJndW1lbnQpDQoJCQlyZXR1cm4gbWF0Y2guc2xpY2UoIDAsIDMgKTsNCgkJfQ0KCX0sDQoNCglmaWx0ZXI6IHsNCgkJIklEIjogYXNzZXJ0R2V0SWROb3ROYW1lID8NCgkJCWZ1bmN0aW9uKCBpZCApIHsNCgkJCQlpZCA9IGlkLnJlcGxhY2UoIHJiYWNrc2xhc2gsICIiICk7DQoJCQkJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgew0KCQkJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoImlkIikgPT09IGlkOw0KCQkJCX07DQoJCQl9IDoNCgkJCWZ1bmN0aW9uKCBpZCApIHsNCgkJCQlpZCA9IGlkLnJlcGxhY2UoIHJiYWNrc2xhc2gsICIiICk7DQoJCQkJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgew0KCQkJCQl2YXIgbm9kZSA9IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUgIT09IHN0cnVuZGVmaW5lZCAmJiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7DQoJCQkJCXJldHVybiBub2RlICYmIG5vZGUudmFsdWUgPT09IGlkOw0KCQkJCX07DQoJCQl9LA0KDQoJCSJUQUciOiBmdW5jdGlvbiggbm9kZU5hbWUgKSB7DQoJCQlpZiAoIG5vZGVOYW1lID09PSAiKiIgKSB7DQoJCQkJcmV0dXJuIGZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1ZTsgfTsNCgkJCX0NCgkJCW5vZGVOYW1lID0gbm9kZU5hbWUucmVwbGFjZSggcmJhY2tzbGFzaCwgIiIgKS50b0xvd2VyQ2FzZSgpOw0KDQoJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7DQoJCQkJcmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBub2RlTmFtZTsNCgkJCX07DQoJCX0sDQoNCgkJIkNMQVNTIjogZnVuY3Rpb24oIGNsYXNzTmFtZSApIHsNCgkJCXZhciBwYXR0ZXJuID0gY2xhc3NDYWNoZVsgZXhwYW5kbyBdWyBjbGFzc05hbWUgKyAiICIgXTsNCg0KCQkJcmV0dXJuIHBhdHRlcm4gfHwNCgkJCQkocGF0dGVybiA9IG5ldyBSZWdFeHAoICIoXnwiICsgd2hpdGVzcGFjZSArICIpIiArIGNsYXNzTmFtZSArICIoIiArIHdoaXRlc3BhY2UgKyAifCQpIiApKSAmJg0KCQkJCWNsYXNzQ2FjaGUoIGNsYXNzTmFtZSwgZnVuY3Rpb24oIGVsZW0gKSB7DQoJCQkJCXJldHVybiBwYXR0ZXJuLnRlc3QoIGVsZW0uY2xhc3NOYW1lIHx8ICh0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGUgIT09IHN0cnVuZGVmaW5lZCAmJiBlbGVtLmdldEF0dHJpYnV0ZSgiY2xhc3MiKSkgfHwgIiIgKTsNCgkJCQl9KTsNCgkJfSwNCg0KCQkiQVRUUiI6IGZ1bmN0aW9uKCBuYW1lLCBvcGVyYXRvciwgY2hlY2sgKSB7DQoJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQgKSB7DQoJCQkJdmFyIHJlc3VsdCA9IFNpenpsZS5hdHRyKCBlbGVtLCBuYW1lICk7DQoNCgkJCQlpZiAoIHJlc3VsdCA9PSBudWxsICkgew0KCQkJCQlyZXR1cm4gb3BlcmF0b3IgPT09ICIhPSI7DQoJCQkJfQ0KCQkJCWlmICggIW9wZXJhdG9yICkgew0KCQkJCQlyZXR1cm4gdHJ1ZTsNCgkJCQl9DQoNCgkJCQlyZXN1bHQgKz0gIiI7DQoNCgkJCQlyZXR1cm4gb3BlcmF0b3IgPT09ICI9IiA/IHJlc3VsdCA9PT0gY2hlY2sgOg0KCQkJCQlvcGVyYXRvciA9PT0gIiE9IiA/IHJlc3VsdCAhPT0gY2hlY2sgOg0KCQkJCQlvcGVyYXRvciA9PT0gIl49IiA/IGNoZWNrICYmIHJlc3VsdC5pbmRleE9mKCBjaGVjayApID09PSAwIDoNCgkJCQkJb3BlcmF0b3IgPT09ICIqPSIgPyBjaGVjayAmJiByZXN1bHQuaW5kZXhPZiggY2hlY2sgKSA+IC0xIDoNCgkJCQkJb3BlcmF0b3IgPT09ICIkPSIgPyBjaGVjayAmJiByZXN1bHQuc3Vic3RyKCByZXN1bHQubGVuZ3RoIC0gY2hlY2subGVuZ3RoICkgPT09IGNoZWNrIDoNCgkJCQkJb3BlcmF0b3IgPT09ICJ+PSIgPyAoICIgIiArIHJlc3VsdCArICIgIiApLmluZGV4T2YoIGNoZWNrICkgPiAtMSA6DQoJCQkJCW9wZXJhdG9yID09PSAifD0iID8gcmVzdWx0ID09PSBjaGVjayB8fCByZXN1bHQuc3Vic3RyKCAwLCBjaGVjay5sZW5ndGggKyAxICkgPT09IGNoZWNrICsgIi0iIDoNCgkJCQkJZmFsc2U7DQoJCQl9Ow0KCQl9LA0KDQoJCSJDSElMRCI6IGZ1bmN0aW9uKCB0eXBlLCBhcmd1bWVudCwgZmlyc3QsIGxhc3QgKSB7DQoNCgkJCWlmICggdHlwZSA9PT0gIm50aCIgKSB7DQoJCQkJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgew0KCQkJCQl2YXIgbm9kZSwgZGlmZiwNCgkJCQkJCXBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsNCg0KCQkJCQlpZiAoIGZpcnN0ID09PSAxICYmIGxhc3QgPT09IDAgKSB7DQoJCQkJCQlyZXR1cm4gdHJ1ZTsNCgkJCQkJfQ0KDQoJCQkJCWlmICggcGFyZW50ICkgew0KCQkJCQkJZGlmZiA9IDA7DQoJCQkJCQlmb3IgKCBub2RlID0gcGFyZW50LmZpcnN0Q2hpbGQ7IG5vZGU7IG5vZGUgPSBub2RlLm5leHRTaWJsaW5nICkgew0KCQkJCQkJCWlmICggbm9kZS5ub2RlVHlwZSA9PT0gMSApIHsNCgkJCQkJCQkJZGlmZisrOw0KCQkJCQkJCQlpZiAoIGVsZW0gPT09IG5vZGUgKSB7DQoJCQkJCQkJCQlicmVhazsNCgkJCQkJCQkJfQ0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJfQ0KDQoJCQkJCS8vIEluY29ycG9yYXRlIHRoZSBvZmZzZXQgKG9yIGNhc3QgdG8gTmFOKSwgdGhlbiBjaGVjayBhZ2FpbnN0IGN5Y2xlIHNpemUNCgkJCQkJZGlmZiAtPSBsYXN0Ow0KCQkJCQlyZXR1cm4gZGlmZiA9PT0gZmlyc3QgfHwgKCBkaWZmICUgZmlyc3QgPT09IDAgJiYgZGlmZiAvIGZpcnN0ID49IDAgKTsNCgkJCQl9Ow0KCQkJfQ0KDQoJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7DQoJCQkJdmFyIG5vZGUgPSBlbGVtOw0KDQoJCQkJc3dpdGNoICggdHlwZSApIHsNCgkJCQkJY2FzZSAib25seSI6DQoJCQkJCWNhc2UgImZpcnN0IjoNCgkJCQkJCXdoaWxlICggKG5vZGUgPSBub2RlLnByZXZpb3VzU2libGluZykgKSB7DQoJCQkJCQkJaWYgKCBub2RlLm5vZGVUeXBlID09PSAxICkgew0KCQkJCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KDQoJCQkJCQlpZiAoIHR5cGUgPT09ICJmaXJzdCIgKSB7DQoJCQkJCQkJcmV0dXJuIHRydWU7DQoJCQkJCQl9DQoNCgkJCQkJCW5vZGUgPSBlbGVtOw0KDQoJCQkJCQkvKiBmYWxscyB0aHJvdWdoICovDQoJCQkJCWNhc2UgImxhc3QiOg0KCQkJCQkJd2hpbGUgKCAobm9kZSA9IG5vZGUubmV4dFNpYmxpbmcpICkgew0KCQkJCQkJCWlmICggbm9kZS5ub2RlVHlwZSA9PT0gMSApIHsNCgkJCQkJCQkJcmV0dXJuIGZhbHNlOw0KCQkJCQkJCX0NCgkJCQkJCX0NCg0KCQkJCQkJcmV0dXJuIHRydWU7DQoJCQkJfQ0KCQkJfTsNCgkJfSwNCg0KCQkiUFNFVURPIjogZnVuY3Rpb24oIHBzZXVkbywgYXJndW1lbnQgKSB7DQoJCQkvLyBwc2V1ZG8tY2xhc3MgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUNCgkJCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jcHNldWRvLWNsYXNzZXMNCgkJCS8vIFByaW9yaXRpemUgYnkgY2FzZSBzZW5zaXRpdml0eSBpbiBjYXNlIGN1c3RvbSBwc2V1ZG9zIGFyZSBhZGRlZCB3aXRoIHVwcGVyY2FzZSBsZXR0ZXJzDQoJCQkvLyBSZW1lbWJlciB0aGF0IHNldEZpbHRlcnMgaW5oZXJpdHMgZnJvbSBwc2V1ZG9zDQoJCQl2YXIgYXJncywNCgkJCQlmbiA9IEV4cHIucHNldWRvc1sgcHNldWRvIF0gfHwgRXhwci5zZXRGaWx0ZXJzWyBwc2V1ZG8udG9Mb3dlckNhc2UoKSBdIHx8DQoJCQkJCVNpenpsZS5lcnJvciggInVuc3VwcG9ydGVkIHBzZXVkbzogIiArIHBzZXVkbyApOw0KDQoJCQkvLyBUaGUgdXNlciBtYXkgdXNlIGNyZWF0ZVBzZXVkbyB0byBpbmRpY2F0ZSB0aGF0DQoJCQkvLyBhcmd1bWVudHMgYXJlIG5lZWRlZCB0byBjcmVhdGUgdGhlIGZpbHRlciBmdW5jdGlvbg0KCQkJLy8ganVzdCBhcyBTaXp6bGUgZG9lcw0KCQkJaWYgKCBmblsgZXhwYW5kbyBdICkgew0KCQkJCXJldHVybiBmbiggYXJndW1lbnQgKTsNCgkJCX0NCg0KCQkJLy8gQnV0IG1haW50YWluIHN1cHBvcnQgZm9yIG9sZCBzaWduYXR1cmVzDQoJCQlpZiAoIGZuLmxlbmd0aCA+IDEgKSB7DQoJCQkJYXJncyA9IFsgcHNldWRvLCBwc2V1ZG8sICIiLCBhcmd1bWVudCBdOw0KCQkJCXJldHVybiBFeHByLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoIHBzZXVkby50b0xvd2VyQ2FzZSgpICkgPw0KCQkJCQltYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMgKSB7DQoJCQkJCQl2YXIgaWR4LA0KCQkJCQkJCW1hdGNoZWQgPSBmbiggc2VlZCwgYXJndW1lbnQgKSwNCgkJCQkJCQlpID0gbWF0Y2hlZC5sZW5ndGg7DQoJCQkJCQl3aGlsZSAoIGktLSApIHsNCgkJCQkJCQlpZHggPSBpbmRleE9mLmNhbGwoIHNlZWQsIG1hdGNoZWRbaV0gKTsNCgkJCQkJCQlzZWVkWyBpZHggXSA9ICEoIG1hdGNoZXNbIGlkeCBdID0gbWF0Y2hlZFtpXSApOw0KCQkJCQkJfQ0KCQkJCQl9KSA6DQoJCQkJCWZ1bmN0aW9uKCBlbGVtICkgew0KCQkJCQkJcmV0dXJuIGZuKCBlbGVtLCAwLCBhcmdzICk7DQoJCQkJCX07DQoJCQl9DQoNCgkJCXJldHVybiBmbjsNCgkJfQ0KCX0sDQoNCglwc2V1ZG9zOiB7DQoJCSJub3QiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlbGVjdG9yICkgew0KCQkJLy8gVHJpbSB0aGUgc2VsZWN0b3IgcGFzc2VkIHRvIGNvbXBpbGUNCgkJCS8vIHRvIGF2b2lkIHRyZWF0aW5nIGxlYWRpbmcgYW5kIHRyYWlsaW5nDQoJCQkvLyBzcGFjZXMgYXMgY29tYmluYXRvcnMNCgkJCXZhciBpbnB1dCA9IFtdLA0KCQkJCXJlc3VsdHMgPSBbXSwNCgkJCQltYXRjaGVyID0gY29tcGlsZSggc2VsZWN0b3IucmVwbGFjZSggcnRyaW0sICIkMSIgKSApOw0KDQoJCQlyZXR1cm4gbWF0Y2hlclsgZXhwYW5kbyBdID8NCgkJCQltYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMsIGNvbnRleHQsIHhtbCApIHsNCgkJCQkJdmFyIGVsZW0sDQoJCQkJCQl1bm1hdGNoZWQgPSBtYXRjaGVyKCBzZWVkLCBudWxsLCB4bWwsIFtdICksDQoJCQkJCQlpID0gc2VlZC5sZW5ndGg7DQoNCgkJCQkJLy8gTWF0Y2ggZWxlbWVudHMgdW5tYXRjaGVkIGJ5IGBtYXRjaGVyYA0KCQkJCQl3aGlsZSAoIGktLSApIHsNCgkJCQkJCWlmICggKGVsZW0gPSB1bm1hdGNoZWRbaV0pICkgew0KCQkJCQkJCXNlZWRbaV0gPSAhKG1hdGNoZXNbaV0gPSBlbGVtKTsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0pIDoNCgkJCQlmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkgew0KCQkJCQlpbnB1dFswXSA9IGVsZW07DQoJCQkJCW1hdGNoZXIoIGlucHV0LCBudWxsLCB4bWwsIHJlc3VsdHMgKTsNCgkJCQkJcmV0dXJuICFyZXN1bHRzLnBvcCgpOw0KCQkJCX07DQoJCX0pLA0KDQoJCSJoYXMiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlbGVjdG9yICkgew0KCQkJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgew0KCQkJCXJldHVybiBTaXp6bGUoIHNlbGVjdG9yLCBlbGVtICkubGVuZ3RoID4gMDsNCgkJCX07DQoJCX0pLA0KDQoJCSJjb250YWlucyI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggdGV4dCApIHsNCgkJCXJldHVybiBmdW5jdGlvbiggZWxlbSApIHsNCgkJCQlyZXR1cm4gKCBlbGVtLnRleHRDb250ZW50IHx8IGVsZW0uaW5uZXJUZXh0IHx8IGdldFRleHQoIGVsZW0gKSApLmluZGV4T2YoIHRleHQgKSA+IC0xOw0KCQkJfTsNCgkJfSksDQoNCgkJImVuYWJsZWQiOiBmdW5jdGlvbiggZWxlbSApIHsNCgkJCXJldHVybiBlbGVtLmRpc2FibGVkID09PSBmYWxzZTsNCgkJfSwNCg0KCQkiZGlzYWJsZWQiOiBmdW5jdGlvbiggZWxlbSApIHsNCgkJCXJldHVybiBlbGVtLmRpc2FibGVkID09PSB0cnVlOw0KCQl9LA0KDQoJCSJjaGVja2VkIjogZnVuY3Rpb24oIGVsZW0gKSB7DQoJCQkvLyBJbiBDU1MzLCA6Y2hlY2tlZCBzaG91bGQgcmV0dXJuIGJvdGggY2hlY2tlZCBhbmQgc2VsZWN0ZWQgZWxlbWVudHMNCgkJCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTEvUkVDLWNzczMtc2VsZWN0b3JzLTIwMTEwOTI5LyNjaGVja2VkDQoJCQl2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7DQoJCQlyZXR1cm4gKG5vZGVOYW1lID09PSAiaW5wdXQiICYmICEhZWxlbS5jaGVja2VkKSB8fCAobm9kZU5hbWUgPT09ICJvcHRpb24iICYmICEhZWxlbS5zZWxlY3RlZCk7DQoJCX0sDQoNCgkJInNlbGVjdGVkIjogZnVuY3Rpb24oIGVsZW0gKSB7DQoJCQkvLyBBY2Nlc3NpbmcgdGhpcyBwcm9wZXJ0eSBtYWtlcyBzZWxlY3RlZC1ieS1kZWZhdWx0DQoJCQkvLyBvcHRpb25zIGluIFNhZmFyaSB3b3JrIHByb3Blcmx5DQoJCQlpZiAoIGVsZW0ucGFyZW50Tm9kZSApIHsNCgkJCQllbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsNCgkJCX0NCg0KCQkJcmV0dXJuIGVsZW0uc2VsZWN0ZWQgPT09IHRydWU7DQoJCX0sDQoNCgkJInBhcmVudCI6IGZ1bmN0aW9uKCBlbGVtICkgew0KCQkJcmV0dXJuICFFeHByLnBzZXVkb3NbImVtcHR5Il0oIGVsZW0gKTsNCgkJfSwNCg0KCQkiZW1wdHkiOiBmdW5jdGlvbiggZWxlbSApIHsNCgkJCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jZW1wdHktcHNldWRvDQoJCQkvLyA6ZW1wdHkgaXMgb25seSBhZmZlY3RlZCBieSBlbGVtZW50IG5vZGVzIGFuZCBjb250ZW50IG5vZGVzKGluY2x1ZGluZyB0ZXh0KDMpLCBjZGF0YSg0KSksDQoJCQkvLyAgIG5vdCBjb21tZW50LCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucywgb3Igb3RoZXJzDQoJCQkvLyBUaGFua3MgdG8gRGllZ28gUGVyaW5pIGZvciB0aGUgbm9kZU5hbWUgc2hvcnRjdXQNCgkJCS8vICAgR3JlYXRlciB0aGFuICJAIiBtZWFucyBhbHBoYSBjaGFyYWN0ZXJzIChzcGVjaWZpY2FsbHkgbm90IHN0YXJ0aW5nIHdpdGggIiMiIG9yICI/IikNCgkJCXZhciBub2RlVHlwZTsNCgkJCWVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7DQoJCQl3aGlsZSAoIGVsZW0gKSB7DQoJCQkJaWYgKCBlbGVtLm5vZGVOYW1lID4gIkAiIHx8IChub2RlVHlwZSA9IGVsZW0ubm9kZVR5cGUpID09PSAzIHx8IG5vZGVUeXBlID09PSA0ICkgew0KCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJfQ0KCQkJCWVsZW0gPSBlbGVtLm5leHRTaWJsaW5nOw0KCQkJfQ0KCQkJcmV0dXJuIHRydWU7DQoJCX0sDQoNCgkJImhlYWRlciI6IGZ1bmN0aW9uKCBlbGVtICkgew0KCQkJcmV0dXJuIHJoZWFkZXIudGVzdCggZWxlbS5ub2RlTmFtZSApOw0KCQl9LA0KDQoJCSJ0ZXh0IjogZnVuY3Rpb24oIGVsZW0gKSB7DQoJCQl2YXIgdHlwZSwgYXR0cjsNCgkJCS8vIElFNiBhbmQgNyB3aWxsIG1hcCBlbGVtLnR5cGUgdG8gJ3RleHQnIGZvciBuZXcgSFRNTDUgdHlwZXMgKHNlYXJjaCwgZXRjKQ0KCQkJLy8gdXNlIGdldEF0dHJpYnV0ZSBpbnN0ZWFkIHRvIHRlc3QgdGhpcyBjYXNlDQoJCQlyZXR1cm4gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAiaW5wdXQiICYmDQoJCQkJKHR5cGUgPSBlbGVtLnR5cGUpID09PSAidGV4dCIgJiYNCgkJCQkoIChhdHRyID0gZWxlbS5nZXRBdHRyaWJ1dGUoInR5cGUiKSkgPT0gbnVsbCB8fCBhdHRyLnRvTG93ZXJDYXNlKCkgPT09IHR5cGUgKTsNCgkJfSwNCg0KCQkvLyBJbnB1dCB0eXBlcw0KCQkicmFkaW8iOiBjcmVhdGVJbnB1dFBzZXVkbygicmFkaW8iKSwNCgkJImNoZWNrYm94IjogY3JlYXRlSW5wdXRQc2V1ZG8oImNoZWNrYm94IiksDQoJCSJmaWxlIjogY3JlYXRlSW5wdXRQc2V1ZG8oImZpbGUiKSwNCgkJInBhc3N3b3JkIjogY3JlYXRlSW5wdXRQc2V1ZG8oInBhc3N3b3JkIiksDQoJCSJpbWFnZSI6IGNyZWF0ZUlucHV0UHNldWRvKCJpbWFnZSIpLA0KDQoJCSJzdWJtaXQiOiBjcmVhdGVCdXR0b25Qc2V1ZG8oInN1Ym1pdCIpLA0KCQkicmVzZXQiOiBjcmVhdGVCdXR0b25Qc2V1ZG8oInJlc2V0IiksDQoNCgkJImJ1dHRvbiI6IGZ1bmN0aW9uKCBlbGVtICkgew0KCQkJdmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7DQoJCQlyZXR1cm4gbmFtZSA9PT0gImlucHV0IiAmJiBlbGVtLnR5cGUgPT09ICJidXR0b24iIHx8IG5hbWUgPT09ICJidXR0b24iOw0KCQl9LA0KDQoJCSJpbnB1dCI6IGZ1bmN0aW9uKCBlbGVtICkgew0KCQkJcmV0dXJuIHJpbnB1dHMudGVzdCggZWxlbS5ub2RlTmFtZSApOw0KCQl9LA0KDQoJCSJmb2N1cyI6IGZ1bmN0aW9uKCBlbGVtICkgew0KCQkJdmFyIGRvYyA9IGVsZW0ub3duZXJEb2N1bWVudDsNCgkJCXJldHVybiBlbGVtID09PSBkb2MuYWN0aXZlRWxlbWVudCAmJiAoIWRvYy5oYXNGb2N1cyB8fCBkb2MuaGFzRm9jdXMoKSkgJiYgISEoZWxlbS50eXBlIHx8IGVsZW0uaHJlZiB8fCB+ZWxlbS50YWJJbmRleCk7DQoJCX0sDQoNCgkJImFjdGl2ZSI6IGZ1bmN0aW9uKCBlbGVtICkgew0KCQkJcmV0dXJuIGVsZW0gPT09IGVsZW0ub3duZXJEb2N1bWVudC5hY3RpdmVFbGVtZW50Ow0KCQl9LA0KDQoJCS8vIFBvc2l0aW9uYWwgdHlwZXMNCgkJImZpcnN0IjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbigpIHsNCgkJCXJldHVybiBbIDAgXTsNCgkJfSksDQoNCgkJImxhc3QiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCApIHsNCgkJCXJldHVybiBbIGxlbmd0aCAtIDEgXTsNCgkJfSksDQoNCgkJImVxIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkgew0KCQkJcmV0dXJuIFsgYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudCBdOw0KCQl9KSwNCg0KCQkiZXZlbiI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkgew0KCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDIgKSB7DQoJCQkJbWF0Y2hJbmRleGVzLnB1c2goIGkgKTsNCgkJCX0NCgkJCXJldHVybiBtYXRjaEluZGV4ZXM7DQoJCX0pLA0KDQoJCSJvZGQiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCApIHsNCgkJCWZvciAoIHZhciBpID0gMTsgaSA8IGxlbmd0aDsgaSArPSAyICkgew0KCQkJCW1hdGNoSW5kZXhlcy5wdXNoKCBpICk7DQoJCQl9DQoJCQlyZXR1cm4gbWF0Y2hJbmRleGVzOw0KCQl9KSwNCg0KCQkibHQiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7DQoJCQlmb3IgKCB2YXIgaSA9IGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQ7IC0taSA+PSAwOyApIHsNCgkJCQltYXRjaEluZGV4ZXMucHVzaCggaSApOw0KCQkJfQ0KCQkJcmV0dXJuIG1hdGNoSW5kZXhlczsNCgkJfSksDQoNCgkJImd0IjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkgew0KCQkJZm9yICggdmFyIGkgPSBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50OyArK2kgPCBsZW5ndGg7ICkgew0KCQkJCW1hdGNoSW5kZXhlcy5wdXNoKCBpICk7DQoJCQl9DQoJCQlyZXR1cm4gbWF0Y2hJbmRleGVzOw0KCQl9KQ0KCX0NCn07DQoNCmZ1bmN0aW9uIHNpYmxpbmdDaGVjayggYSwgYiwgcmV0ICkgew0KCWlmICggYSA9PT0gYiApIHsNCgkJcmV0dXJuIHJldDsNCgl9DQoNCgl2YXIgY3VyID0gYS5uZXh0U2libGluZzsNCg0KCXdoaWxlICggY3VyICkgew0KCQlpZiAoIGN1ciA9PT0gYiApIHsNCgkJCXJldHVybiAtMTsNCgkJfQ0KDQoJCWN1ciA9IGN1ci5uZXh0U2libGluZzsNCgl9DQoNCglyZXR1cm4gMTsNCn0NCg0Kc29ydE9yZGVyID0gZG9jRWxlbS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiA/DQoJZnVuY3Rpb24oIGEsIGIgKSB7DQoJCWlmICggYSA9PT0gYiApIHsNCgkJCWhhc0R1cGxpY2F0ZSA9IHRydWU7DQoJCQlyZXR1cm4gMDsNCgkJfQ0KDQoJCXJldHVybiAoICFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIHx8ICFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uID8NCgkJCWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gOg0KCQkJYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSAmIDQNCgkJKSA/IC0xIDogMTsNCgl9IDoNCglmdW5jdGlvbiggYSwgYiApIHsNCgkJLy8gVGhlIG5vZGVzIGFyZSBpZGVudGljYWwsIHdlIGNhbiBleGl0IGVhcmx5DQoJCWlmICggYSA9PT0gYiApIHsNCgkJCWhhc0R1cGxpY2F0ZSA9IHRydWU7DQoJCQlyZXR1cm4gMDsNCg0KCQkvLyBGYWxsYmFjayB0byB1c2luZyBzb3VyY2VJbmRleCAoaW4gSUUpIGlmIGl0J3MgYXZhaWxhYmxlIG9uIGJvdGggbm9kZXMNCgkJfSBlbHNlIGlmICggYS5zb3VyY2VJbmRleCAmJiBiLnNvdXJjZUluZGV4ICkgew0KCQkJcmV0dXJuIGEuc291cmNlSW5kZXggLSBiLnNvdXJjZUluZGV4Ow0KCQl9DQoNCgkJdmFyIGFsLCBibCwNCgkJCWFwID0gW10sDQoJCQlicCA9IFtdLA0KCQkJYXVwID0gYS5wYXJlbnROb2RlLA0KCQkJYnVwID0gYi5wYXJlbnROb2RlLA0KCQkJY3VyID0gYXVwOw0KDQoJCS8vIElmIHRoZSBub2RlcyBhcmUgc2libGluZ3MgKG9yIGlkZW50aWNhbCkgd2UgY2FuIGRvIGEgcXVpY2sgY2hlY2sNCgkJaWYgKCBhdXAgPT09IGJ1cCApIHsNCgkJCXJldHVybiBzaWJsaW5nQ2hlY2soIGEsIGIgKTsNCg0KCQkvLyBJZiBubyBwYXJlbnRzIHdlcmUgZm91bmQgdGhlbiB0aGUgbm9kZXMgYXJlIGRpc2Nvbm5lY3RlZA0KCQl9IGVsc2UgaWYgKCAhYXVwICkgew0KCQkJcmV0dXJuIC0xOw0KDQoJCX0gZWxzZSBpZiAoICFidXAgKSB7DQoJCQlyZXR1cm4gMTsNCgkJfQ0KDQoJCS8vIE90aGVyd2lzZSB0aGV5J3JlIHNvbWV3aGVyZSBlbHNlIGluIHRoZSB0cmVlIHNvIHdlIG5lZWQNCgkJLy8gdG8gYnVpbGQgdXAgYSBmdWxsIGxpc3Qgb2YgdGhlIHBhcmVudE5vZGVzIGZvciBjb21wYXJpc29uDQoJCXdoaWxlICggY3VyICkgew0KCQkJYXAudW5zaGlmdCggY3VyICk7DQoJCQljdXIgPSBjdXIucGFyZW50Tm9kZTsNCgkJfQ0KDQoJCWN1ciA9IGJ1cDsNCg0KCQl3aGlsZSAoIGN1ciApIHsNCgkJCWJwLnVuc2hpZnQoIGN1ciApOw0KCQkJY3VyID0gY3VyLnBhcmVudE5vZGU7DQoJCX0NCg0KCQlhbCA9IGFwLmxlbmd0aDsNCgkJYmwgPSBicC5sZW5ndGg7DQoNCgkJLy8gU3RhcnQgd2Fsa2luZyBkb3duIHRoZSB0cmVlIGxvb2tpbmcgZm9yIGEgZGlzY3JlcGFuY3kNCgkJZm9yICggdmFyIGkgPSAwOyBpIDwgYWwgJiYgaSA8IGJsOyBpKysgKSB7DQoJCQlpZiAoIGFwW2ldICE9PSBicFtpXSApIHsNCgkJCQlyZXR1cm4gc2libGluZ0NoZWNrKCBhcFtpXSwgYnBbaV0gKTsNCgkJCX0NCgkJfQ0KDQoJCS8vIFdlIGVuZGVkIHNvbWVwbGFjZSB1cCB0aGUgdHJlZSBzbyBkbyBhIHNpYmxpbmcgY2hlY2sNCgkJcmV0dXJuIGkgPT09IGFsID8NCgkJCXNpYmxpbmdDaGVjayggYSwgYnBbaV0sIC0xICkgOg0KCQkJc2libGluZ0NoZWNrKCBhcFtpXSwgYiwgMSApOw0KCX07DQoNCi8vIEFsd2F5cyBhc3N1bWUgdGhlIHByZXNlbmNlIG9mIGR1cGxpY2F0ZXMgaWYgc29ydCBkb2Vzbid0DQovLyBwYXNzIHRoZW0gdG8gb3VyIGNvbXBhcmlzb24gZnVuY3Rpb24gKGFzIGluIEdvb2dsZSBDaHJvbWUpLg0KWzAsIDBdLnNvcnQoIHNvcnRPcmRlciApOw0KYmFzZUhhc0R1cGxpY2F0ZSA9ICFoYXNEdXBsaWNhdGU7DQoNCi8vIERvY3VtZW50IHNvcnRpbmcgYW5kIHJlbW92aW5nIGR1cGxpY2F0ZXMNClNpenpsZS51bmlxdWVTb3J0ID0gZnVuY3Rpb24oIHJlc3VsdHMgKSB7DQoJdmFyIGVsZW0sDQoJCWR1cGxpY2F0ZXMgPSBbXSwNCgkJaSA9IDEsDQoJCWogPSAwOw0KDQoJaGFzRHVwbGljYXRlID0gYmFzZUhhc0R1cGxpY2F0ZTsNCglyZXN1bHRzLnNvcnQoIHNvcnRPcmRlciApOw0KDQoJaWYgKCBoYXNEdXBsaWNhdGUgKSB7DQoJCWZvciAoIDsgKGVsZW0gPSByZXN1bHRzW2ldKTsgaSsrICkgew0KCQkJaWYgKCBlbGVtID09PSByZXN1bHRzWyBpIC0gMSBdICkgew0KCQkJCWogPSBkdXBsaWNhdGVzLnB1c2goIGkgKTsNCgkJCX0NCgkJfQ0KCQl3aGlsZSAoIGotLSApIHsNCgkJCXJlc3VsdHMuc3BsaWNlKCBkdXBsaWNhdGVzWyBqIF0sIDEgKTsNCgkJfQ0KCX0NCg0KCXJldHVybiByZXN1bHRzOw0KfTsNCg0KU2l6emxlLmVycm9yID0gZnVuY3Rpb24oIG1zZyApIHsNCgl0aHJvdyBuZXcgRXJyb3IoICJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiICsgbXNnICk7DQp9Ow0KDQpmdW5jdGlvbiB0b2tlbml6ZSggc2VsZWN0b3IsIHBhcnNlT25seSApIHsNCgl2YXIgbWF0Y2hlZCwgbWF0Y2gsIHRva2VucywgdHlwZSwNCgkJc29GYXIsIGdyb3VwcywgcHJlRmlsdGVycywNCgkJY2FjaGVkID0gdG9rZW5DYWNoZVsgZXhwYW5kbyBdWyBzZWxlY3RvciArICIgIiBdOw0KDQoJaWYgKCBjYWNoZWQgKSB7DQoJCXJldHVybiBwYXJzZU9ubHkgPyAwIDogY2FjaGVkLnNsaWNlKCAwICk7DQoJfQ0KDQoJc29GYXIgPSBzZWxlY3RvcjsNCglncm91cHMgPSBbXTsNCglwcmVGaWx0ZXJzID0gRXhwci5wcmVGaWx0ZXI7DQoNCgl3aGlsZSAoIHNvRmFyICkgew0KDQoJCS8vIENvbW1hIGFuZCBmaXJzdCBydW4NCgkJaWYgKCAhbWF0Y2hlZCB8fCAobWF0Y2ggPSByY29tbWEuZXhlYyggc29GYXIgKSkgKSB7DQoJCQlpZiAoIG1hdGNoICkgew0KCQkJCS8vIERvbid0IGNvbnN1bWUgdHJhaWxpbmcgY29tbWFzIGFzIHZhbGlkDQoJCQkJc29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hbMF0ubGVuZ3RoICkgfHwgc29GYXI7DQoJCQl9DQoJCQlncm91cHMucHVzaCggdG9rZW5zID0gW10gKTsNCgkJfQ0KDQoJCW1hdGNoZWQgPSBmYWxzZTsNCg0KCQkvLyBDb21iaW5hdG9ycw0KCQlpZiAoIChtYXRjaCA9IHJjb21iaW5hdG9ycy5leGVjKCBzb0ZhciApKSApIHsNCgkJCXRva2Vucy5wdXNoKCBtYXRjaGVkID0gbmV3IFRva2VuKCBtYXRjaC5zaGlmdCgpICkgKTsNCgkJCXNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7DQoNCgkJCS8vIENhc3QgZGVzY2VuZGFudCBjb21iaW5hdG9ycyB0byBzcGFjZQ0KCQkJbWF0Y2hlZC50eXBlID0gbWF0Y2hbMF0ucmVwbGFjZSggcnRyaW0sICIgIiApOw0KCQl9DQoNCgkJLy8gRmlsdGVycw0KCQlmb3IgKCB0eXBlIGluIEV4cHIuZmlsdGVyICkgew0KCQkJaWYgKCAobWF0Y2ggPSBtYXRjaEV4cHJbIHR5cGUgXS5leGVjKCBzb0ZhciApKSAmJiAoIXByZUZpbHRlcnNbIHR5cGUgXSB8fA0KCQkJCShtYXRjaCA9IHByZUZpbHRlcnNbIHR5cGUgXSggbWF0Y2ggKSkpICkgew0KDQoJCQkJdG9rZW5zLnB1c2goIG1hdGNoZWQgPSBuZXcgVG9rZW4oIG1hdGNoLnNoaWZ0KCkgKSApOw0KCQkJCXNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7DQoJCQkJbWF0Y2hlZC50eXBlID0gdHlwZTsNCgkJCQltYXRjaGVkLm1hdGNoZXMgPSBtYXRjaDsNCgkJCX0NCgkJfQ0KDQoJCWlmICggIW1hdGNoZWQgKSB7DQoJCQlicmVhazsNCgkJfQ0KCX0NCg0KCS8vIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnZhbGlkIGV4Y2Vzcw0KCS8vIGlmIHdlJ3JlIGp1c3QgcGFyc2luZw0KCS8vIE90aGVyd2lzZSwgdGhyb3cgYW4gZXJyb3Igb3IgcmV0dXJuIHRva2Vucw0KCXJldHVybiBwYXJzZU9ubHkgPw0KCQlzb0Zhci5sZW5ndGggOg0KCQlzb0ZhciA/DQoJCQlTaXp6bGUuZXJyb3IoIHNlbGVjdG9yICkgOg0KCQkJLy8gQ2FjaGUgdGhlIHRva2Vucw0KCQkJdG9rZW5DYWNoZSggc2VsZWN0b3IsIGdyb3VwcyApLnNsaWNlKCAwICk7DQp9DQoNCmZ1bmN0aW9uIGFkZENvbWJpbmF0b3IoIG1hdGNoZXIsIGNvbWJpbmF0b3IsIGJhc2UgKSB7DQoJdmFyIGRpciA9IGNvbWJpbmF0b3IuZGlyLA0KCQljaGVja05vbkVsZW1lbnRzID0gYmFzZSAmJiBjb21iaW5hdG9yLmRpciA9PT0gInBhcmVudE5vZGUiLA0KCQlkb25lTmFtZSA9IGRvbmUrKzsNCg0KCXJldHVybiBjb21iaW5hdG9yLmZpcnN0ID8NCgkJLy8gQ2hlY2sgYWdhaW5zdCBjbG9zZXN0IGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50DQoJCWZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7DQoJCQl3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkgew0KCQkJCWlmICggY2hlY2tOb25FbGVtZW50cyB8fCBlbGVtLm5vZGVUeXBlID09PSAxICApIHsNCgkJCQkJcmV0dXJuIG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApOw0KCQkJCX0NCgkJCX0NCgkJfSA6DQoNCgkJLy8gQ2hlY2sgYWdhaW5zdCBhbGwgYW5jZXN0b3IvcHJlY2VkaW5nIGVsZW1lbnRzDQoJCWZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7DQoJCQkvLyBXZSBjYW4ndCBzZXQgYXJiaXRyYXJ5IGRhdGEgb24gWE1MIG5vZGVzLCBzbyB0aGV5IGRvbid0IGJlbmVmaXQgZnJvbSBkaXIgY2FjaGluZw0KCQkJaWYgKCAheG1sICkgew0KCQkJCXZhciBjYWNoZSwNCgkJCQkJZGlya2V5ID0gZGlycnVucyArICIgIiArIGRvbmVOYW1lICsgIiAiLA0KCQkJCQljYWNoZWRrZXkgPSBkaXJrZXkgKyBjYWNoZWRydW5zOw0KCQkJCXdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7DQoJCQkJCWlmICggY2hlY2tOb25FbGVtZW50cyB8fCBlbGVtLm5vZGVUeXBlID09PSAxICkgew0KCQkJCQkJaWYgKCAoY2FjaGUgPSBlbGVtWyBleHBhbmRvIF0pID09PSBjYWNoZWRrZXkgKSB7DQoJCQkJCQkJcmV0dXJuIGVsZW0uc2l6c2V0Ow0KCQkJCQkJfSBlbHNlIGlmICggdHlwZW9mIGNhY2hlID09PSAic3RyaW5nIiAmJiBjYWNoZS5pbmRleE9mKGRpcmtleSkgPT09IDAgKSB7DQoJCQkJCQkJaWYgKCBlbGVtLnNpenNldCApIHsNCgkJCQkJCQkJcmV0dXJuIGVsZW07DQoJCQkJCQkJfQ0KCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQllbGVtWyBleHBhbmRvIF0gPSBjYWNoZWRrZXk7DQoJCQkJCQkJaWYgKCBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHsNCgkJCQkJCQkJZWxlbS5zaXpzZXQgPSB0cnVlOw0KCQkJCQkJCQlyZXR1cm4gZWxlbTsNCgkJCQkJCQl9DQoJCQkJCQkJZWxlbS5zaXpzZXQgPSBmYWxzZTsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0NCgkJCX0gZWxzZSB7DQoJCQkJd2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHsNCgkJCQkJaWYgKCBjaGVja05vbkVsZW1lbnRzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7DQoJCQkJCQlpZiAoIG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkgew0KCQkJCQkJCXJldHVybiBlbGVtOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQl9Ow0KfQ0KDQpmdW5jdGlvbiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSB7DQoJcmV0dXJuIG1hdGNoZXJzLmxlbmd0aCA+IDEgPw0KCQlmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkgew0KCQkJdmFyIGkgPSBtYXRjaGVycy5sZW5ndGg7DQoJCQl3aGlsZSAoIGktLSApIHsNCgkJCQlpZiAoICFtYXRjaGVyc1tpXSggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7DQoJCQkJCXJldHVybiBmYWxzZTsNCgkJCQl9DQoJCQl9DQoJCQlyZXR1cm4gdHJ1ZTsNCgkJfSA6DQoJCW1hdGNoZXJzWzBdOw0KfQ0KDQpmdW5jdGlvbiBjb25kZW5zZSggdW5tYXRjaGVkLCBtYXAsIGZpbHRlciwgY29udGV4dCwgeG1sICkgew0KCXZhciBlbGVtLA0KCQluZXdVbm1hdGNoZWQgPSBbXSwNCgkJaSA9IDAsDQoJCWxlbiA9IHVubWF0Y2hlZC5sZW5ndGgsDQoJCW1hcHBlZCA9IG1hcCAhPSBudWxsOw0KDQoJZm9yICggOyBpIDwgbGVuOyBpKysgKSB7DQoJCWlmICggKGVsZW0gPSB1bm1hdGNoZWRbaV0pICkgew0KCQkJaWYgKCAhZmlsdGVyIHx8IGZpbHRlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7DQoJCQkJbmV3VW5tYXRjaGVkLnB1c2goIGVsZW0gKTsNCgkJCQlpZiAoIG1hcHBlZCApIHsNCgkJCQkJbWFwLnB1c2goIGkgKTsNCgkJCQl9DQoJCQl9DQoJCX0NCgl9DQoNCglyZXR1cm4gbmV3VW5tYXRjaGVkOw0KfQ0KDQpmdW5jdGlvbiBzZXRNYXRjaGVyKCBwcmVGaWx0ZXIsIHNlbGVjdG9yLCBtYXRjaGVyLCBwb3N0RmlsdGVyLCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKSB7DQoJaWYgKCBwb3N0RmlsdGVyICYmICFwb3N0RmlsdGVyWyBleHBhbmRvIF0gKSB7DQoJCXBvc3RGaWx0ZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmlsdGVyICk7DQoJfQ0KCWlmICggcG9zdEZpbmRlciAmJiAhcG9zdEZpbmRlclsgZXhwYW5kbyBdICkgew0KCQlwb3N0RmluZGVyID0gc2V0TWF0Y2hlciggcG9zdEZpbmRlciwgcG9zdFNlbGVjdG9yICk7DQoJfQ0KCXJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIHJlc3VsdHMsIGNvbnRleHQsIHhtbCApIHsNCgkJdmFyIHRlbXAsIGksIGVsZW0sDQoJCQlwcmVNYXAgPSBbXSwNCgkJCXBvc3RNYXAgPSBbXSwNCgkJCXByZWV4aXN0aW5nID0gcmVzdWx0cy5sZW5ndGgsDQoNCgkJCS8vIEdldCBpbml0aWFsIGVsZW1lbnRzIGZyb20gc2VlZCBvciBjb250ZXh0DQoJCQllbGVtcyA9IHNlZWQgfHwgbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IgfHwgIioiLCBjb250ZXh0Lm5vZGVUeXBlID8gWyBjb250ZXh0IF0gOiBjb250ZXh0LCBbXSApLA0KDQoJCQkvLyBQcmVmaWx0ZXIgdG8gZ2V0IG1hdGNoZXIgaW5wdXQsIHByZXNlcnZpbmcgYSBtYXAgZm9yIHNlZWQtcmVzdWx0cyBzeW5jaHJvbml6YXRpb24NCgkJCW1hdGNoZXJJbiA9IHByZUZpbHRlciAmJiAoIHNlZWQgfHwgIXNlbGVjdG9yICkgPw0KCQkJCWNvbmRlbnNlKCBlbGVtcywgcHJlTWFwLCBwcmVGaWx0ZXIsIGNvbnRleHQsIHhtbCApIDoNCgkJCQllbGVtcywNCg0KCQkJbWF0Y2hlck91dCA9IG1hdGNoZXIgPw0KCQkJCS8vIElmIHdlIGhhdmUgYSBwb3N0RmluZGVyLCBvciBmaWx0ZXJlZCBzZWVkLCBvciBub24tc2VlZCBwb3N0RmlsdGVyIG9yIHByZWV4aXN0aW5nIHJlc3VsdHMsDQoJCQkJcG9zdEZpbmRlciB8fCAoIHNlZWQgPyBwcmVGaWx0ZXIgOiBwcmVleGlzdGluZyB8fCBwb3N0RmlsdGVyICkgPw0KDQoJCQkJCS8vIC4uLmludGVybWVkaWF0ZSBwcm9jZXNzaW5nIGlzIG5lY2Vzc2FyeQ0KCQkJCQlbXSA6DQoNCgkJCQkJLy8gLi4ub3RoZXJ3aXNlIHVzZSByZXN1bHRzIGRpcmVjdGx5DQoJCQkJCXJlc3VsdHMgOg0KCQkJCW1hdGNoZXJJbjsNCg0KCQkvLyBGaW5kIHByaW1hcnkgbWF0Y2hlcw0KCQlpZiAoIG1hdGNoZXIgKSB7DQoJCQltYXRjaGVyKCBtYXRjaGVySW4sIG1hdGNoZXJPdXQsIGNvbnRleHQsIHhtbCApOw0KCQl9DQoNCgkJLy8gQXBwbHkgcG9zdEZpbHRlcg0KCQlpZiAoIHBvc3RGaWx0ZXIgKSB7DQoJCQl0ZW1wID0gY29uZGVuc2UoIG1hdGNoZXJPdXQsIHBvc3RNYXAgKTsNCgkJCXBvc3RGaWx0ZXIoIHRlbXAsIFtdLCBjb250ZXh0LCB4bWwgKTsNCg0KCQkJLy8gVW4tbWF0Y2ggZmFpbGluZyBlbGVtZW50cyBieSBtb3ZpbmcgdGhlbSBiYWNrIHRvIG1hdGNoZXJJbg0KCQkJaSA9IHRlbXAubGVuZ3RoOw0KCQkJd2hpbGUgKCBpLS0gKSB7DQoJCQkJaWYgKCAoZWxlbSA9IHRlbXBbaV0pICkgew0KCQkJCQltYXRjaGVyT3V0WyBwb3N0TWFwW2ldIF0gPSAhKG1hdGNoZXJJblsgcG9zdE1hcFtpXSBdID0gZWxlbSk7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoNCgkJaWYgKCBzZWVkICkgew0KCQkJaWYgKCBwb3N0RmluZGVyIHx8IHByZUZpbHRlciApIHsNCgkJCQlpZiAoIHBvc3RGaW5kZXIgKSB7DQoJCQkJCS8vIEdldCB0aGUgZmluYWwgbWF0Y2hlck91dCBieSBjb25kZW5zaW5nIHRoaXMgaW50ZXJtZWRpYXRlIGludG8gcG9zdEZpbmRlciBjb250ZXh0cw0KCQkJCQl0ZW1wID0gW107DQoJCQkJCWkgPSBtYXRjaGVyT3V0Lmxlbmd0aDsNCgkJCQkJd2hpbGUgKCBpLS0gKSB7DQoJCQkJCQlpZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgKSB7DQoJCQkJCQkJLy8gUmVzdG9yZSBtYXRjaGVySW4gc2luY2UgZWxlbSBpcyBub3QgeWV0IGEgZmluYWwgbWF0Y2gNCgkJCQkJCQl0ZW1wLnB1c2goIChtYXRjaGVySW5baV0gPSBlbGVtKSApOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJCXBvc3RGaW5kZXIoIG51bGwsIChtYXRjaGVyT3V0ID0gW10pLCB0ZW1wLCB4bWwgKTsNCgkJCQl9DQoNCgkJCQkvLyBNb3ZlIG1hdGNoZWQgZWxlbWVudHMgZnJvbSBzZWVkIHRvIHJlc3VsdHMgdG8ga2VlcCB0aGVtIHN5bmNocm9uaXplZA0KCQkJCWkgPSBtYXRjaGVyT3V0Lmxlbmd0aDsNCgkJCQl3aGlsZSAoIGktLSApIHsNCgkJCQkJaWYgKCAoZWxlbSA9IG1hdGNoZXJPdXRbaV0pICYmDQoJCQkJCQkodGVtcCA9IHBvc3RGaW5kZXIgPyBpbmRleE9mLmNhbGwoIHNlZWQsIGVsZW0gKSA6IHByZU1hcFtpXSkgPiAtMSApIHsNCg0KCQkJCQkJc2VlZFt0ZW1wXSA9ICEocmVzdWx0c1t0ZW1wXSA9IGVsZW0pOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KDQoJCS8vIEFkZCBlbGVtZW50cyB0byByZXN1bHRzLCB0aHJvdWdoIHBvc3RGaW5kZXIgaWYgZGVmaW5lZA0KCQl9IGVsc2Ugew0KCQkJbWF0Y2hlck91dCA9IGNvbmRlbnNlKA0KCQkJCW1hdGNoZXJPdXQgPT09IHJlc3VsdHMgPw0KCQkJCQltYXRjaGVyT3V0LnNwbGljZSggcHJlZXhpc3RpbmcsIG1hdGNoZXJPdXQubGVuZ3RoICkgOg0KCQkJCQltYXRjaGVyT3V0DQoJCQkpOw0KCQkJaWYgKCBwb3N0RmluZGVyICkgew0KCQkJCXBvc3RGaW5kZXIoIG51bGwsIHJlc3VsdHMsIG1hdGNoZXJPdXQsIHhtbCApOw0KCQkJfSBlbHNlIHsNCgkJCQlwdXNoLmFwcGx5KCByZXN1bHRzLCBtYXRjaGVyT3V0ICk7DQoJCQl9DQoJCX0NCgl9KTsNCn0NCg0KZnVuY3Rpb24gbWF0Y2hlckZyb21Ub2tlbnMoIHRva2VucyApIHsNCgl2YXIgY2hlY2tDb250ZXh0LCBtYXRjaGVyLCBqLA0KCQlsZW4gPSB0b2tlbnMubGVuZ3RoLA0KCQlsZWFkaW5nUmVsYXRpdmUgPSBFeHByLnJlbGF0aXZlWyB0b2tlbnNbMF0udHlwZSBdLA0KCQlpbXBsaWNpdFJlbGF0aXZlID0gbGVhZGluZ1JlbGF0aXZlIHx8IEV4cHIucmVsYXRpdmVbIiAiXSwNCgkJaSA9IGxlYWRpbmdSZWxhdGl2ZSA/IDEgOiAwLA0KDQoJCS8vIFRoZSBmb3VuZGF0aW9uYWwgbWF0Y2hlciBlbnN1cmVzIHRoYXQgZWxlbWVudHMgYXJlIHJlYWNoYWJsZSBmcm9tIHRvcC1sZXZlbCBjb250ZXh0KHMpDQoJCW1hdGNoQ29udGV4dCA9IGFkZENvbWJpbmF0b3IoIGZ1bmN0aW9uKCBlbGVtICkgew0KCQkJcmV0dXJuIGVsZW0gPT09IGNoZWNrQ29udGV4dDsNCgkJfSwgaW1wbGljaXRSZWxhdGl2ZSwgdHJ1ZSApLA0KCQltYXRjaEFueUNvbnRleHQgPSBhZGRDb21iaW5hdG9yKCBmdW5jdGlvbiggZWxlbSApIHsNCgkJCXJldHVybiBpbmRleE9mLmNhbGwoIGNoZWNrQ29udGV4dCwgZWxlbSApID4gLTE7DQoJCX0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSwNCgkJbWF0Y2hlcnMgPSBbIGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7DQoJCQlyZXR1cm4gKCAhbGVhZGluZ1JlbGF0aXZlICYmICggeG1sIHx8IGNvbnRleHQgIT09IG91dGVybW9zdENvbnRleHQgKSApIHx8ICgNCgkJCQkoY2hlY2tDb250ZXh0ID0gY29udGV4dCkubm9kZVR5cGUgPw0KCQkJCQltYXRjaENvbnRleHQoIGVsZW0sIGNvbnRleHQsIHhtbCApIDoNCgkJCQkJbWF0Y2hBbnlDb250ZXh0KCBlbGVtLCBjb250ZXh0LCB4bWwgKSApOw0KCQl9IF07DQoNCglmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsNCgkJaWYgKCAobWF0Y2hlciA9IEV4cHIucmVsYXRpdmVbIHRva2Vuc1tpXS50eXBlIF0pICkgew0KCQkJbWF0Y2hlcnMgPSBbIGFkZENvbWJpbmF0b3IoIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApLCBtYXRjaGVyICkgXTsNCgkJfSBlbHNlIHsNCgkJCW1hdGNoZXIgPSBFeHByLmZpbHRlclsgdG9rZW5zW2ldLnR5cGUgXS5hcHBseSggbnVsbCwgdG9rZW5zW2ldLm1hdGNoZXMgKTsNCg0KCQkJLy8gUmV0dXJuIHNwZWNpYWwgdXBvbiBzZWVpbmcgYSBwb3NpdGlvbmFsIG1hdGNoZXINCgkJCWlmICggbWF0Y2hlclsgZXhwYW5kbyBdICkgew0KCQkJCS8vIEZpbmQgdGhlIG5leHQgcmVsYXRpdmUgb3BlcmF0b3IgKGlmIGFueSkgZm9yIHByb3BlciBoYW5kbGluZw0KCQkJCWogPSArK2k7DQoJCQkJZm9yICggOyBqIDwgbGVuOyBqKysgKSB7DQoJCQkJCWlmICggRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2pdLnR5cGUgXSApIHsNCgkJCQkJCWJyZWFrOw0KCQkJCQl9DQoJCQkJfQ0KCQkJCXJldHVybiBzZXRNYXRjaGVyKA0KCQkJCQlpID4gMSAmJiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSwNCgkJCQkJaSA+IDEgJiYgdG9rZW5zLnNsaWNlKCAwLCBpIC0gMSApLmpvaW4oIiIpLnJlcGxhY2UoIHJ0cmltLCAiJDEiICksDQoJCQkJCW1hdGNoZXIsDQoJCQkJCWkgPCBqICYmIG1hdGNoZXJGcm9tVG9rZW5zKCB0b2tlbnMuc2xpY2UoIGksIGogKSApLA0KCQkJCQlqIDwgbGVuICYmIG1hdGNoZXJGcm9tVG9rZW5zKCAodG9rZW5zID0gdG9rZW5zLnNsaWNlKCBqICkpICksDQoJCQkJCWogPCBsZW4gJiYgdG9rZW5zLmpvaW4oIiIpDQoJCQkJKTsNCgkJCX0NCgkJCW1hdGNoZXJzLnB1c2goIG1hdGNoZXIgKTsNCgkJfQ0KCX0NCg0KCXJldHVybiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKTsNCn0NCg0KZnVuY3Rpb24gbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgew0KCXZhciBieVNldCA9IHNldE1hdGNoZXJzLmxlbmd0aCA+IDAsDQoJCWJ5RWxlbWVudCA9IGVsZW1lbnRNYXRjaGVycy5sZW5ndGggPiAwLA0KCQlzdXBlck1hdGNoZXIgPSBmdW5jdGlvbiggc2VlZCwgY29udGV4dCwgeG1sLCByZXN1bHRzLCBleHBhbmRDb250ZXh0ICkgew0KCQkJdmFyIGVsZW0sIGosIG1hdGNoZXIsDQoJCQkJc2V0TWF0Y2hlZCA9IFtdLA0KCQkJCW1hdGNoZWRDb3VudCA9IDAsDQoJCQkJaSA9ICIwIiwNCgkJCQl1bm1hdGNoZWQgPSBzZWVkICYmIFtdLA0KCQkJCW91dGVybW9zdCA9IGV4cGFuZENvbnRleHQgIT0gbnVsbCwNCgkJCQljb250ZXh0QmFja3VwID0gb3V0ZXJtb3N0Q29udGV4dCwNCgkJCQkvLyBXZSBtdXN0IGFsd2F5cyBoYXZlIGVpdGhlciBzZWVkIGVsZW1lbnRzIG9yIGNvbnRleHQNCgkJCQllbGVtcyA9IHNlZWQgfHwgYnlFbGVtZW50ICYmIEV4cHIuZmluZFsiVEFHIl0oICIqIiwgZXhwYW5kQ29udGV4dCAmJiBjb250ZXh0LnBhcmVudE5vZGUgfHwgY29udGV4dCApLA0KCQkJCS8vIE5lc3RlZCBtYXRjaGVycyBzaG91bGQgdXNlIG5vbi1pbnRlZ2VyIGRpcnJ1bnMNCgkJCQlkaXJydW5zVW5pcXVlID0gKGRpcnJ1bnMgKz0gY29udGV4dEJhY2t1cCA9PSBudWxsID8gMSA6IE1hdGguRSk7DQoNCgkJCWlmICggb3V0ZXJtb3N0ICkgew0KCQkJCW91dGVybW9zdENvbnRleHQgPSBjb250ZXh0ICE9PSBkb2N1bWVudCAmJiBjb250ZXh0Ow0KCQkJCWNhY2hlZHJ1bnMgPSBzdXBlck1hdGNoZXIuZWw7DQoJCQl9DQoNCgkJCS8vIEFkZCBlbGVtZW50cyBwYXNzaW5nIGVsZW1lbnRNYXRjaGVycyBkaXJlY3RseSB0byByZXN1bHRzDQoJCQlmb3IgKCA7IChlbGVtID0gZWxlbXNbaV0pICE9IG51bGw7IGkrKyApIHsNCgkJCQlpZiAoIGJ5RWxlbWVudCAmJiBlbGVtICkgew0KCQkJCQlmb3IgKCBqID0gMDsgKG1hdGNoZXIgPSBlbGVtZW50TWF0Y2hlcnNbal0pOyBqKysgKSB7DQoJCQkJCQlpZiAoIG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkgew0KCQkJCQkJCXJlc3VsdHMucHVzaCggZWxlbSApOw0KCQkJCQkJCWJyZWFrOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJCWlmICggb3V0ZXJtb3N0ICkgew0KCQkJCQkJZGlycnVucyA9IGRpcnJ1bnNVbmlxdWU7DQoJCQkJCQljYWNoZWRydW5zID0gKytzdXBlck1hdGNoZXIuZWw7DQoJCQkJCX0NCgkJCQl9DQoNCgkJCQkvLyBUcmFjayB1bm1hdGNoZWQgZWxlbWVudHMgZm9yIHNldCBmaWx0ZXJzDQoJCQkJaWYgKCBieVNldCApIHsNCgkJCQkJLy8gVGhleSB3aWxsIGhhdmUgZ29uZSB0aHJvdWdoIGFsbCBwb3NzaWJsZSBtYXRjaGVycw0KCQkJCQlpZiAoIChlbGVtID0gIW1hdGNoZXIgJiYgZWxlbSkgKSB7DQoJCQkJCQltYXRjaGVkQ291bnQtLTsNCgkJCQkJfQ0KDQoJCQkJCS8vIExlbmd0aGVuIHRoZSBhcnJheSBmb3IgZXZlcnkgZWxlbWVudCwgbWF0Y2hlZCBvciBub3QNCgkJCQkJaWYgKCBzZWVkICkgew0KCQkJCQkJdW5tYXRjaGVkLnB1c2goIGVsZW0gKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCg0KCQkJLy8gQXBwbHkgc2V0IGZpbHRlcnMgdG8gdW5tYXRjaGVkIGVsZW1lbnRzDQoJCQltYXRjaGVkQ291bnQgKz0gaTsNCgkJCWlmICggYnlTZXQgJiYgaSAhPT0gbWF0Y2hlZENvdW50ICkgew0KCQkJCWZvciAoIGogPSAwOyAobWF0Y2hlciA9IHNldE1hdGNoZXJzW2pdKTsgaisrICkgew0KCQkJCQltYXRjaGVyKCB1bm1hdGNoZWQsIHNldE1hdGNoZWQsIGNvbnRleHQsIHhtbCApOw0KCQkJCX0NCg0KCQkJCWlmICggc2VlZCApIHsNCgkJCQkJLy8gUmVpbnRlZ3JhdGUgZWxlbWVudCBtYXRjaGVzIHRvIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3Igc29ydGluZw0KCQkJCQlpZiAoIG1hdGNoZWRDb3VudCA+IDAgKSB7DQoJCQkJCQl3aGlsZSAoIGktLSApIHsNCgkJCQkJCQlpZiAoICEodW5tYXRjaGVkW2ldIHx8IHNldE1hdGNoZWRbaV0pICkgew0KCQkJCQkJCQlzZXRNYXRjaGVkW2ldID0gcG9wLmNhbGwoIHJlc3VsdHMgKTsNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0NCg0KCQkJCQkvLyBEaXNjYXJkIGluZGV4IHBsYWNlaG9sZGVyIHZhbHVlcyB0byBnZXQgb25seSBhY3R1YWwgbWF0Y2hlcw0KCQkJCQlzZXRNYXRjaGVkID0gY29uZGVuc2UoIHNldE1hdGNoZWQgKTsNCgkJCQl9DQoNCgkJCQkvLyBBZGQgbWF0Y2hlcyB0byByZXN1bHRzDQoJCQkJcHVzaC5hcHBseSggcmVzdWx0cywgc2V0TWF0Y2hlZCApOw0KDQoJCQkJLy8gU2VlZGxlc3Mgc2V0IG1hdGNoZXMgc3VjY2VlZGluZyBtdWx0aXBsZSBzdWNjZXNzZnVsIG1hdGNoZXJzIHN0aXB1bGF0ZSBzb3J0aW5nDQoJCQkJaWYgKCBvdXRlcm1vc3QgJiYgIXNlZWQgJiYgc2V0TWF0Y2hlZC5sZW5ndGggPiAwICYmDQoJCQkJCSggbWF0Y2hlZENvdW50ICsgc2V0TWF0Y2hlcnMubGVuZ3RoICkgPiAxICkgew0KDQoJCQkJCVNpenpsZS51bmlxdWVTb3J0KCByZXN1bHRzICk7DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBPdmVycmlkZSBtYW5pcHVsYXRpb24gb2YgZ2xvYmFscyBieSBuZXN0ZWQgbWF0Y2hlcnMNCgkJCWlmICggb3V0ZXJtb3N0ICkgew0KCQkJCWRpcnJ1bnMgPSBkaXJydW5zVW5pcXVlOw0KCQkJCW91dGVybW9zdENvbnRleHQgPSBjb250ZXh0QmFja3VwOw0KCQkJfQ0KDQoJCQlyZXR1cm4gdW5tYXRjaGVkOw0KCQl9Ow0KDQoJc3VwZXJNYXRjaGVyLmVsID0gMDsNCglyZXR1cm4gYnlTZXQgPw0KCQltYXJrRnVuY3Rpb24oIHN1cGVyTWF0Y2hlciApIDoNCgkJc3VwZXJNYXRjaGVyOw0KfQ0KDQpjb21waWxlID0gU2l6emxlLmNvbXBpbGUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGdyb3VwIC8qIEludGVybmFsIFVzZSBPbmx5ICovICkgew0KCXZhciBpLA0KCQlzZXRNYXRjaGVycyA9IFtdLA0KCQllbGVtZW50TWF0Y2hlcnMgPSBbXSwNCgkJY2FjaGVkID0gY29tcGlsZXJDYWNoZVsgZXhwYW5kbyBdWyBzZWxlY3RvciArICIgIiBdOw0KDQoJaWYgKCAhY2FjaGVkICkgew0KCQkvLyBHZW5lcmF0ZSBhIGZ1bmN0aW9uIG9mIHJlY3Vyc2l2ZSBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCB0byBjaGVjayBlYWNoIGVsZW1lbnQNCgkJaWYgKCAhZ3JvdXAgKSB7DQoJCQlncm91cCA9IHRva2VuaXplKCBzZWxlY3RvciApOw0KCQl9DQoJCWkgPSBncm91cC5sZW5ndGg7DQoJCXdoaWxlICggaS0tICkgew0KCQkJY2FjaGVkID0gbWF0Y2hlckZyb21Ub2tlbnMoIGdyb3VwW2ldICk7DQoJCQlpZiAoIGNhY2hlZFsgZXhwYW5kbyBdICkgew0KCQkJCXNldE1hdGNoZXJzLnB1c2goIGNhY2hlZCApOw0KCQkJfSBlbHNlIHsNCgkJCQllbGVtZW50TWF0Y2hlcnMucHVzaCggY2FjaGVkICk7DQoJCQl9DQoJCX0NCg0KCQkvLyBDYWNoZSB0aGUgY29tcGlsZWQgZnVuY3Rpb24NCgkJY2FjaGVkID0gY29tcGlsZXJDYWNoZSggc2VsZWN0b3IsIG1hdGNoZXJGcm9tR3JvdXBNYXRjaGVycyggZWxlbWVudE1hdGNoZXJzLCBzZXRNYXRjaGVycyApICk7DQoJfQ0KCXJldHVybiBjYWNoZWQ7DQp9Ow0KDQpmdW5jdGlvbiBtdWx0aXBsZUNvbnRleHRzKCBzZWxlY3RvciwgY29udGV4dHMsIHJlc3VsdHMgKSB7DQoJdmFyIGkgPSAwLA0KCQlsZW4gPSBjb250ZXh0cy5sZW5ndGg7DQoJZm9yICggOyBpIDwgbGVuOyBpKysgKSB7DQoJCVNpenpsZSggc2VsZWN0b3IsIGNvbnRleHRzW2ldLCByZXN1bHRzICk7DQoJfQ0KCXJldHVybiByZXN1bHRzOw0KfQ0KDQpmdW5jdGlvbiBzZWxlY3QoIHNlbGVjdG9yLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkLCB4bWwgKSB7DQoJdmFyIGksIHRva2VucywgdG9rZW4sIHR5cGUsIGZpbmQsDQoJCW1hdGNoID0gdG9rZW5pemUoIHNlbGVjdG9yICksDQoJCWogPSBtYXRjaC5sZW5ndGg7DQoNCglpZiAoICFzZWVkICkgew0KCQkvLyBUcnkgdG8gbWluaW1pemUgb3BlcmF0aW9ucyBpZiB0aGVyZSBpcyBvbmx5IG9uZSBncm91cA0KCQlpZiAoIG1hdGNoLmxlbmd0aCA9PT0gMSApIHsNCg0KCQkJLy8gVGFrZSBhIHNob3J0Y3V0IGFuZCBzZXQgdGhlIGNvbnRleHQgaWYgdGhlIHJvb3Qgc2VsZWN0b3IgaXMgYW4gSUQNCgkJCXRva2VucyA9IG1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAgKTsNCgkJCWlmICggdG9rZW5zLmxlbmd0aCA+IDIgJiYgKHRva2VuID0gdG9rZW5zWzBdKS50eXBlID09PSAiSUQiICYmDQoJCQkJCWNvbnRleHQubm9kZVR5cGUgPT09IDkgJiYgIXhtbCAmJg0KCQkJCQlFeHByLnJlbGF0aXZlWyB0b2tlbnNbMV0udHlwZSBdICkgew0KDQoJCQkJY29udGV4dCA9IEV4cHIuZmluZFsiSUQiXSggdG9rZW4ubWF0Y2hlc1swXS5yZXBsYWNlKCByYmFja3NsYXNoLCAiIiApLCBjb250ZXh0LCB4bWwgKVswXTsNCgkJCQlpZiAoICFjb250ZXh0ICkgew0KCQkJCQlyZXR1cm4gcmVzdWx0czsNCgkJCQl9DQoNCgkJCQlzZWxlY3RvciA9IHNlbGVjdG9yLnNsaWNlKCB0b2tlbnMuc2hpZnQoKS5sZW5ndGggKTsNCgkJCX0NCg0KCQkJLy8gRmV0Y2ggYSBzZWVkIHNldCBmb3IgcmlnaHQtdG8tbGVmdCBtYXRjaGluZw0KCQkJZm9yICggaSA9IG1hdGNoRXhwclsiUE9TIl0udGVzdCggc2VsZWN0b3IgKSA/IC0xIDogdG9rZW5zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tICkgew0KCQkJCXRva2VuID0gdG9rZW5zW2ldOw0KDQoJCQkJLy8gQWJvcnQgaWYgd2UgaGl0IGEgY29tYmluYXRvcg0KCQkJCWlmICggRXhwci5yZWxhdGl2ZVsgKHR5cGUgPSB0b2tlbi50eXBlKSBdICkgew0KCQkJCQlicmVhazsNCgkJCQl9DQoJCQkJaWYgKCAoZmluZCA9IEV4cHIuZmluZFsgdHlwZSBdKSApIHsNCgkJCQkJLy8gU2VhcmNoLCBleHBhbmRpbmcgY29udGV4dCBmb3IgbGVhZGluZyBzaWJsaW5nIGNvbWJpbmF0b3JzDQoJCQkJCWlmICggKHNlZWQgPSBmaW5kKA0KCQkJCQkJdG9rZW4ubWF0Y2hlc1swXS5yZXBsYWNlKCByYmFja3NsYXNoLCAiIiApLA0KCQkJCQkJcnNpYmxpbmcudGVzdCggdG9rZW5zWzBdLnR5cGUgKSAmJiBjb250ZXh0LnBhcmVudE5vZGUgfHwgY29udGV4dCwNCgkJCQkJCXhtbA0KCQkJCQkpKSApIHsNCg0KCQkJCQkJLy8gSWYgc2VlZCBpcyBlbXB0eSBvciBubyB0b2tlbnMgcmVtYWluLCB3ZSBjYW4gcmV0dXJuIGVhcmx5DQoJCQkJCQl0b2tlbnMuc3BsaWNlKCBpLCAxICk7DQoJCQkJCQlzZWxlY3RvciA9IHNlZWQubGVuZ3RoICYmIHRva2Vucy5qb2luKCIiKTsNCgkJCQkJCWlmICggIXNlbGVjdG9yICkgew0KCQkJCQkJCXB1c2guYXBwbHkoIHJlc3VsdHMsIHNsaWNlLmNhbGwoIHNlZWQsIDAgKSApOw0KCQkJCQkJCXJldHVybiByZXN1bHRzOw0KCQkJCQkJfQ0KDQoJCQkJCQlicmVhazsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0NCg0KCS8vIENvbXBpbGUgYW5kIGV4ZWN1dGUgYSBmaWx0ZXJpbmcgZnVuY3Rpb24NCgkvLyBQcm92aWRlIGBtYXRjaGAgdG8gYXZvaWQgcmV0b2tlbml6YXRpb24gaWYgd2UgbW9kaWZpZWQgdGhlIHNlbGVjdG9yIGFib3ZlDQoJY29tcGlsZSggc2VsZWN0b3IsIG1hdGNoICkoDQoJCXNlZWQsDQoJCWNvbnRleHQsDQoJCXhtbCwNCgkJcmVzdWx0cywNCgkJcnNpYmxpbmcudGVzdCggc2VsZWN0b3IgKQ0KCSk7DQoJcmV0dXJuIHJlc3VsdHM7DQp9DQoNCmlmICggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCApIHsNCgkoZnVuY3Rpb24oKSB7DQoJCXZhciBkaXNjb25uZWN0ZWRNYXRjaCwNCgkJCW9sZFNlbGVjdCA9IHNlbGVjdCwNCgkJCXJlc2NhcGUgPSAvJ3xcXC9nLA0KCQkJcmF0dHJpYnV0ZVF1b3RlcyA9IC9cPVtceDIwXHRcclxuXGZdKihbXiciXF1dKilbXHgyMFx0XHJcblxmXSpcXS9nLA0KDQoJCQkvLyBxU2EoOmZvY3VzKSByZXBvcnRzIGZhbHNlIHdoZW4gdHJ1ZSAoQ2hyb21lIDIxKSwgbm8gbmVlZCB0byBhbHNvIGFkZCB0byBidWdneU1hdGNoZXMgc2luY2UgbWF0Y2hlcyBjaGVja3MgYnVnZ3lRU0ENCgkJCS8vIEEgc3VwcG9ydCB0ZXN0IHdvdWxkIHJlcXVpcmUgdG9vIG11Y2ggY29kZSAod291bGQgaW5jbHVkZSBkb2N1bWVudCByZWFkeSkNCgkJCXJidWdneVFTQSA9IFsgIjpmb2N1cyIgXSwNCg0KCQkJLy8gbWF0Y2hlc1NlbGVjdG9yKDphY3RpdmUpIHJlcG9ydHMgZmFsc2Ugd2hlbiB0cnVlIChJRTkvT3BlcmEgMTEuNSkNCgkJCS8vIEEgc3VwcG9ydCB0ZXN0IHdvdWxkIHJlcXVpcmUgdG9vIG11Y2ggY29kZSAod291bGQgaW5jbHVkZSBkb2N1bWVudCByZWFkeSkNCgkJCS8vIGp1c3Qgc2tpcCBtYXRjaGVzU2VsZWN0b3IgZm9yIDphY3RpdmUNCgkJCXJidWdneU1hdGNoZXMgPSBbICI6YWN0aXZlIiBdLA0KCQkJbWF0Y2hlcyA9IGRvY0VsZW0ubWF0Y2hlc1NlbGVjdG9yIHx8DQoJCQkJZG9jRWxlbS5tb3pNYXRjaGVzU2VsZWN0b3IgfHwNCgkJCQlkb2NFbGVtLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fA0KCQkJCWRvY0VsZW0ub01hdGNoZXNTZWxlY3RvciB8fA0KCQkJCWRvY0VsZW0ubXNNYXRjaGVzU2VsZWN0b3I7DQoNCgkJLy8gQnVpbGQgUVNBIHJlZ2V4DQoJCS8vIFJlZ2V4IHN0cmF0ZWd5IGFkb3B0ZWQgZnJvbSBEaWVnbyBQZXJpbmkNCgkJYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7DQoJCQkvLyBTZWxlY3QgaXMgc2V0IHRvIGVtcHR5IHN0cmluZyBvbiBwdXJwb3NlDQoJCQkvLyBUaGlzIGlzIHRvIHRlc3QgSUUncyB0cmVhdG1lbnQgb2Ygbm90IGV4cGxpY3RseQ0KCQkJLy8gc2V0dGluZyBhIGJvb2xlYW4gY29udGVudCBhdHRyaWJ1dGUsDQoJCQkvLyBzaW5jZSBpdHMgcHJlc2VuY2Ugc2hvdWxkIGJlIGVub3VnaA0KCQkJLy8gaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTIzNTkNCgkJCWRpdi5pbm5lckhUTUwgPSAiPHNlbGVjdD48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PiI7DQoNCgkJCS8vIElFOCAtIFNvbWUgYm9vbGVhbiBhdHRyaWJ1dGVzIGFyZSBub3QgdHJlYXRlZCBjb3JyZWN0bHkNCgkJCWlmICggIWRpdi5xdWVyeVNlbGVjdG9yQWxsKCJbc2VsZWN0ZWRdIikubGVuZ3RoICkgew0KCQkJCXJidWdneVFTQS5wdXNoKCAiXFxbIiArIHdoaXRlc3BhY2UgKyAiKig/OmNoZWNrZWR8ZGlzYWJsZWR8aXNtYXB8bXVsdGlwbGV8cmVhZG9ubHl8c2VsZWN0ZWR8dmFsdWUpIiApOw0KCQkJfQ0KDQoJCQkvLyBXZWJraXQvT3BlcmEgLSA6Y2hlY2tlZCBzaG91bGQgcmV0dXJuIHNlbGVjdGVkIG9wdGlvbiBlbGVtZW50cw0KCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMS9SRUMtY3NzMy1zZWxlY3RvcnMtMjAxMTA5MjkvI2NoZWNrZWQNCgkJCS8vIElFOCB0aHJvd3MgZXJyb3IgaGVyZSAoZG8gbm90IHB1dCB0ZXN0cyBhZnRlciB0aGlzIG9uZSkNCgkJCWlmICggIWRpdi5xdWVyeVNlbGVjdG9yQWxsKCI6Y2hlY2tlZCIpLmxlbmd0aCApIHsNCgkJCQlyYnVnZ3lRU0EucHVzaCgiOmNoZWNrZWQiKTsNCgkJCX0NCgkJfSk7DQoNCgkJYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7DQoNCgkJCS8vIE9wZXJhIDEwLTEyL0lFOSAtIF49ICQ9ICo9IGFuZCBlbXB0eSB2YWx1ZXMNCgkJCS8vIFNob3VsZCBub3Qgc2VsZWN0IGFueXRoaW5nDQoJCQlkaXYuaW5uZXJIVE1MID0gIjxwIHRlc3Q9Jyc+PC9wPiI7DQoJCQlpZiAoIGRpdi5xdWVyeVNlbGVjdG9yQWxsKCJbdGVzdF49JyddIikubGVuZ3RoICkgew0KCQkJCXJidWdneVFTQS5wdXNoKCAiWypeJF09IiArIHdoaXRlc3BhY2UgKyAiKig/OlwiXCJ8JycpIiApOw0KCQkJfQ0KDQoJCQkvLyBGRiAzLjUgLSA6ZW5hYmxlZC86ZGlzYWJsZWQgYW5kIGhpZGRlbiBlbGVtZW50cyAoaGlkZGVuIGVsZW1lbnRzIGFyZSBzdGlsbCBlbmFibGVkKQ0KCQkJLy8gSUU4IHRocm93cyBlcnJvciBoZXJlIChkbyBub3QgcHV0IHRlc3RzIGFmdGVyIHRoaXMgb25lKQ0KCQkJZGl2LmlubmVySFRNTCA9ICI8aW5wdXQgdHlwZT0naGlkZGVuJy8+IjsNCgkJCWlmICggIWRpdi5xdWVyeVNlbGVjdG9yQWxsKCI6ZW5hYmxlZCIpLmxlbmd0aCApIHsNCgkJCQlyYnVnZ3lRU0EucHVzaCgiOmVuYWJsZWQiLCAiOmRpc2FibGVkIik7DQoJCQl9DQoJCX0pOw0KDQoJCS8vIHJidWdneVFTQSBhbHdheXMgY29udGFpbnMgOmZvY3VzLCBzbyBubyBuZWVkIGZvciBhIGxlbmd0aCBjaGVjaw0KCQlyYnVnZ3lRU0EgPSAvKiByYnVnZ3lRU0EubGVuZ3RoICYmICovIG5ldyBSZWdFeHAoIHJidWdneVFTQS5qb2luKCJ8IikgKTsNCg0KCQlzZWxlY3QgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQsIHhtbCApIHsNCgkJCS8vIE9ubHkgdXNlIHF1ZXJ5U2VsZWN0b3JBbGwgd2hlbiBub3QgZmlsdGVyaW5nLA0KCQkJLy8gd2hlbiB0aGlzIGlzIG5vdCB4bWwsDQoJCQkvLyBhbmQgd2hlbiBubyBRU0EgYnVncyBhcHBseQ0KCQkJaWYgKCAhc2VlZCAmJiAheG1sICYmICFyYnVnZ3lRU0EudGVzdCggc2VsZWN0b3IgKSApIHsNCgkJCQl2YXIgZ3JvdXBzLCBpLA0KCQkJCQlvbGQgPSB0cnVlLA0KCQkJCQluaWQgPSBleHBhbmRvLA0KCQkJCQluZXdDb250ZXh0ID0gY29udGV4dCwNCgkJCQkJbmV3U2VsZWN0b3IgPSBjb250ZXh0Lm5vZGVUeXBlID09PSA5ICYmIHNlbGVjdG9yOw0KDQoJCQkJLy8gcVNBIHdvcmtzIHN0cmFuZ2VseSBvbiBFbGVtZW50LXJvb3RlZCBxdWVyaWVzDQoJCQkJLy8gV2UgY2FuIHdvcmsgYXJvdW5kIHRoaXMgYnkgc3BlY2lmeWluZyBhbiBleHRyYSBJRCBvbiB0aGUgcm9vdA0KCQkJCS8vIGFuZCB3b3JraW5nIHVwIGZyb20gdGhlcmUgKFRoYW5rcyB0byBBbmRyZXcgRHVwb250IGZvciB0aGUgdGVjaG5pcXVlKQ0KCQkJCS8vIElFIDggZG9lc24ndCB3b3JrIG9uIG9iamVjdCBlbGVtZW50cw0KCQkJCWlmICggY29udGV4dC5ub2RlVHlwZSA9PT0gMSAmJiBjb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09ICJvYmplY3QiICkgew0KCQkJCQlncm91cHMgPSB0b2tlbml6ZSggc2VsZWN0b3IgKTsNCg0KCQkJCQlpZiAoIChvbGQgPSBjb250ZXh0LmdldEF0dHJpYnV0ZSgiaWQiKSkgKSB7DQoJCQkJCQluaWQgPSBvbGQucmVwbGFjZSggcmVzY2FwZSwgIlxcJCYiICk7DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQljb250ZXh0LnNldEF0dHJpYnV0ZSggImlkIiwgbmlkICk7DQoJCQkJCX0NCgkJCQkJbmlkID0gIltpZD0nIiArIG5pZCArICInXSAiOw0KDQoJCQkJCWkgPSBncm91cHMubGVuZ3RoOw0KCQkJCQl3aGlsZSAoIGktLSApIHsNCgkJCQkJCWdyb3Vwc1tpXSA9IG5pZCArIGdyb3Vwc1tpXS5qb2luKCIiKTsNCgkJCQkJfQ0KCQkJCQluZXdDb250ZXh0ID0gcnNpYmxpbmcudGVzdCggc2VsZWN0b3IgKSAmJiBjb250ZXh0LnBhcmVudE5vZGUgfHwgY29udGV4dDsNCgkJCQkJbmV3U2VsZWN0b3IgPSBncm91cHMuam9pbigiLCIpOw0KCQkJCX0NCg0KCQkJCWlmICggbmV3U2VsZWN0b3IgKSB7DQoJCQkJCXRyeSB7DQoJCQkJCQlwdXNoLmFwcGx5KCByZXN1bHRzLCBzbGljZS5jYWxsKCBuZXdDb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoDQoJCQkJCQkJbmV3U2VsZWN0b3INCgkJCQkJCSksIDAgKSApOw0KCQkJCQkJcmV0dXJuIHJlc3VsdHM7DQoJCQkJCX0gY2F0Y2gocXNhRXJyb3IpIHsNCgkJCQkJfSBmaW5hbGx5IHsNCgkJCQkJCWlmICggIW9sZCApIHsNCgkJCQkJCQljb250ZXh0LnJlbW92ZUF0dHJpYnV0ZSgiaWQiKTsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCg0KCQkJcmV0dXJuIG9sZFNlbGVjdCggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQsIHhtbCApOw0KCQl9Ow0KDQoJCWlmICggbWF0Y2hlcyApIHsNCgkJCWFzc2VydChmdW5jdGlvbiggZGl2ICkgew0KCQkJCS8vIENoZWNrIHRvIHNlZSBpZiBpdCdzIHBvc3NpYmxlIHRvIGRvIG1hdGNoZXNTZWxlY3Rvcg0KCQkJCS8vIG9uIGEgZGlzY29ubmVjdGVkIG5vZGUgKElFIDkpDQoJCQkJZGlzY29ubmVjdGVkTWF0Y2ggPSBtYXRjaGVzLmNhbGwoIGRpdiwgImRpdiIgKTsNCg0KCQkJCS8vIFRoaXMgc2hvdWxkIGZhaWwgd2l0aCBhbiBleGNlcHRpb24NCgkJCQkvLyBHZWNrbyBkb2VzIG5vdCBlcnJvciwgcmV0dXJucyBmYWxzZSBpbnN0ZWFkDQoJCQkJdHJ5IHsNCgkJCQkJbWF0Y2hlcy5jYWxsKCBkaXYsICJbdGVzdCE9JyddOnNpenpsZSIgKTsNCgkJCQkJcmJ1Z2d5TWF0Y2hlcy5wdXNoKCAiIT0iLCBwc2V1ZG9zICk7DQoJCQkJfSBjYXRjaCAoIGUgKSB7fQ0KCQkJfSk7DQoNCgkJCS8vIHJidWdneU1hdGNoZXMgYWx3YXlzIGNvbnRhaW5zIDphY3RpdmUgYW5kIDpmb2N1cywgc28gbm8gbmVlZCBmb3IgYSBsZW5ndGggY2hlY2sNCgkJCXJidWdneU1hdGNoZXMgPSAvKiByYnVnZ3lNYXRjaGVzLmxlbmd0aCAmJiAqLyBuZXcgUmVnRXhwKCByYnVnZ3lNYXRjaGVzLmpvaW4oInwiKSApOw0KDQoJCQlTaXp6bGUubWF0Y2hlc1NlbGVjdG9yID0gZnVuY3Rpb24oIGVsZW0sIGV4cHIgKSB7DQoJCQkJLy8gTWFrZSBzdXJlIHRoYXQgYXR0cmlidXRlIHNlbGVjdG9ycyBhcmUgcXVvdGVkDQoJCQkJZXhwciA9IGV4cHIucmVwbGFjZSggcmF0dHJpYnV0ZVF1b3RlcywgIj0nJDEnXSIgKTsNCg0KCQkJCS8vIHJidWdneU1hdGNoZXMgYWx3YXlzIGNvbnRhaW5zIDphY3RpdmUsIHNvIG5vIG5lZWQgZm9yIGFuIGV4aXN0ZW5jZSBjaGVjaw0KCQkJCWlmICggIWlzWE1MKCBlbGVtICkgJiYgIXJidWdneU1hdGNoZXMudGVzdCggZXhwciApICYmICFyYnVnZ3lRU0EudGVzdCggZXhwciApICkgew0KCQkJCQl0cnkgew0KCQkJCQkJdmFyIHJldCA9IG1hdGNoZXMuY2FsbCggZWxlbSwgZXhwciApOw0KDQoJCQkJCQkvLyBJRSA5J3MgbWF0Y2hlc1NlbGVjdG9yIHJldHVybnMgZmFsc2Ugb24gZGlzY29ubmVjdGVkIG5vZGVzDQoJCQkJCQlpZiAoIHJldCB8fCBkaXNjb25uZWN0ZWRNYXRjaCB8fA0KCQkJCQkJCQkvLyBBcyB3ZWxsLCBkaXNjb25uZWN0ZWQgbm9kZXMgYXJlIHNhaWQgdG8gYmUgaW4gYSBkb2N1bWVudA0KCQkJCQkJCQkvLyBmcmFnbWVudCBpbiBJRSA5DQoJCQkJCQkJCWVsZW0uZG9jdW1lbnQgJiYgZWxlbS5kb2N1bWVudC5ub2RlVHlwZSAhPT0gMTEgKSB7DQoJCQkJCQkJcmV0dXJuIHJldDsNCgkJCQkJCX0NCgkJCQkJfSBjYXRjaChlKSB7fQ0KCQkJCX0NCg0KCQkJCXJldHVybiBTaXp6bGUoIGV4cHIsIG51bGwsIG51bGwsIFsgZWxlbSBdICkubGVuZ3RoID4gMDsNCgkJCX07DQoJCX0NCgl9KSgpOw0KfQ0KDQovLyBEZXByZWNhdGVkDQpFeHByLnBzZXVkb3NbIm50aCJdID0gRXhwci5wc2V1ZG9zWyJlcSJdOw0KDQovLyBCYWNrLWNvbXBhdA0KZnVuY3Rpb24gc2V0RmlsdGVycygpIHt9DQpFeHByLmZpbHRlcnMgPSBzZXRGaWx0ZXJzLnByb3RvdHlwZSA9IEV4cHIucHNldWRvczsNCkV4cHIuc2V0RmlsdGVycyA9IG5ldyBzZXRGaWx0ZXJzKCk7DQoNCi8vIE92ZXJyaWRlIHNpenpsZSBhdHRyaWJ1dGUgcmV0cmlldmFsClNpenpsZS5hdHRyID0galF1ZXJ5LmF0dHI7CmpRdWVyeS5maW5kID0gU2l6emxlOwpqUXVlcnkuZXhwciA9IFNpenpsZS5zZWxlY3RvcnM7CmpRdWVyeS5leHByWyI6Il0gPSBqUXVlcnkuZXhwci5wc2V1ZG9zOwpqUXVlcnkudW5pcXVlID0gU2l6emxlLnVuaXF1ZVNvcnQ7CmpRdWVyeS50ZXh0ID0gU2l6emxlLmdldFRleHQ7CmpRdWVyeS5pc1hNTERvYyA9IFNpenpsZS5pc1hNTDsKalF1ZXJ5LmNvbnRhaW5zID0gU2l6emxlLmNvbnRhaW5zOwoNCg0KfSkoIHdpbmRvdyApOw0KdmFyIHJ1bnRpbCA9IC9VbnRpbCQvLAoJcnBhcmVudHNwcmV2ID0gL14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sCglpc1NpbXBsZSA9IC9eLlteOiNcW1wuLF0qJC8sCglybmVlZHNDb250ZXh0ID0galF1ZXJ5LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LAoJLy8gbWV0aG9kcyBndWFyYW50ZWVkIHRvIHByb2R1Y2UgYSB1bmlxdWUgc2V0IHdoZW4gc3RhcnRpbmcgZnJvbSBhIHVuaXF1ZSBzZXQKCWd1YXJhbnRlZWRVbmlxdWUgPSB7CgkJY2hpbGRyZW46IHRydWUsCgkJY29udGVudHM6IHRydWUsCgkJbmV4dDogdHJ1ZSwKCQlwcmV2OiB0cnVlCgl9OwoKalF1ZXJ5LmZuLmV4dGVuZCh7CglmaW5kOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJdmFyIGksIGwsIGxlbmd0aCwgbiwgciwgcmV0LAoJCQlzZWxmID0gdGhpczsKCgkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgewoJCQlyZXR1cm4galF1ZXJ5KCBzZWxlY3RvciApLmZpbHRlcihmdW5jdGlvbigpIHsKCQkJCWZvciAoIGkgPSAwLCBsID0gc2VsZi5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQkJaWYgKCBqUXVlcnkuY29udGFpbnMoIHNlbGZbIGkgXSwgdGhpcyApICkgewoJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQl9CgkJCQl9CgkJCX0pOwoJCX0KCgkJcmV0ID0gdGhpcy5wdXNoU3RhY2soICIiLCAiZmluZCIsIHNlbGVjdG9yICk7CgoJCWZvciAoIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCWxlbmd0aCA9IHJldC5sZW5ndGg7CgkJCWpRdWVyeS5maW5kKCBzZWxlY3RvciwgdGhpc1tpXSwgcmV0ICk7CgoJCQlpZiAoIGkgPiAwICkgewoJCQkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHJlc3VsdHMgYXJlIHVuaXF1ZQoJCQkJZm9yICggbiA9IGxlbmd0aDsgbiA8IHJldC5sZW5ndGg7IG4rKyApIHsKCQkJCQlmb3IgKCByID0gMDsgciA8IGxlbmd0aDsgcisrICkgewoJCQkJCQlpZiAoIHJldFtyXSA9PT0gcmV0W25dICkgewoJCQkJCQkJcmV0LnNwbGljZShuLS0sIDEpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiByZXQ7Cgl9LAoKCWhhczogZnVuY3Rpb24oIHRhcmdldCApIHsKCQl2YXIgaSwKCQkJdGFyZ2V0cyA9IGpRdWVyeSggdGFyZ2V0LCB0aGlzICksCgkJCWxlbiA9IHRhcmdldHMubGVuZ3RoOwoKCQlyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKSB7CgkJCWZvciAoIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7CgkJCQlpZiAoIGpRdWVyeS5jb250YWlucyggdGhpcywgdGFyZ2V0c1tpXSApICkgewoJCQkJCXJldHVybiB0cnVlOwoJCQkJfQoJCQl9CgkJfSk7Cgl9LAoKCW5vdDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KHRoaXMsIHNlbGVjdG9yLCBmYWxzZSksICJub3QiLCBzZWxlY3Rvcik7Cgl9LAoKCWZpbHRlcjogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KHRoaXMsIHNlbGVjdG9yLCB0cnVlKSwgImZpbHRlciIsIHNlbGVjdG9yICk7Cgl9LAoKCWlzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuICEhc2VsZWN0b3IgJiYgKAoJCQl0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciID8KCQkJCS8vIElmIHRoaXMgaXMgYSBwb3NpdGlvbmFsL3JlbGF0aXZlIHNlbGVjdG9yLCBjaGVjayBtZW1iZXJzaGlwIGluIHRoZSByZXR1cm5lZCBzZXQKCQkJCS8vIHNvICQoInA6Zmlyc3QiKS5pcygicDpsYXN0Iikgd29uJ3QgcmV0dXJuIHRydWUgZm9yIGEgZG9jIHdpdGggdHdvICJwIi4KCQkJCXJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3IgKSA/CgkJCQkJalF1ZXJ5KCBzZWxlY3RvciwgdGhpcy5jb250ZXh0ICkuaW5kZXgoIHRoaXNbMF0gKSA+PSAwIDoKCQkJCQlqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgdGhpcyApLmxlbmd0aCA+IDAgOgoJCQkJdGhpcy5maWx0ZXIoIHNlbGVjdG9yICkubGVuZ3RoID4gMCApOwoJfSwKCgljbG9zZXN0OiBmdW5jdGlvbiggc2VsZWN0b3JzLCBjb250ZXh0ICkgewoJCXZhciBjdXIsCgkJCWkgPSAwLAoJCQlsID0gdGhpcy5sZW5ndGgsCgkJCXJldCA9IFtdLAoJCQlwb3MgPSBybmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9ycyApIHx8IHR5cGVvZiBzZWxlY3RvcnMgIT09ICJzdHJpbmciID8KCQkJCWpRdWVyeSggc2VsZWN0b3JzLCBjb250ZXh0IHx8IHRoaXMuY29udGV4dCApIDoKCQkJCTA7CgoJCWZvciAoIDsgaSA8IGw7IGkrKyApIHsKCQkJY3VyID0gdGhpc1tpXTsKCgkJCXdoaWxlICggY3VyICYmIGN1ci5vd25lckRvY3VtZW50ICYmIGN1ciAhPT0gY29udGV4dCAmJiBjdXIubm9kZVR5cGUgIT09IDExICkgewoJCQkJaWYgKCBwb3MgPyBwb3MuaW5kZXgoY3VyKSA+IC0xIDogalF1ZXJ5LmZpbmQubWF0Y2hlc1NlbGVjdG9yKGN1ciwgc2VsZWN0b3JzKSApIHsKCQkJCQlyZXQucHVzaCggY3VyICk7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCQljdXIgPSBjdXIucGFyZW50Tm9kZTsKCQkJfQoJCX0KCgkJcmV0ID0gcmV0Lmxlbmd0aCA+IDEgPyBqUXVlcnkudW5pcXVlKCByZXQgKSA6IHJldDsKCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCByZXQsICJjbG9zZXN0Iiwgc2VsZWN0b3JzICk7Cgl9LAoKCS8vIERldGVybWluZSB0aGUgcG9zaXRpb24gb2YgYW4gZWxlbWVudCB3aXRoaW4KCS8vIHRoZSBtYXRjaGVkIHNldCBvZiBlbGVtZW50cwoJaW5kZXg6IGZ1bmN0aW9uKCBlbGVtICkgewoKCQkvLyBObyBhcmd1bWVudCwgcmV0dXJuIGluZGV4IGluIHBhcmVudAoJCWlmICggIWVsZW0gKSB7CgkJCXJldHVybiAoIHRoaXNbMF0gJiYgdGhpc1swXS5wYXJlbnROb2RlICkgPyB0aGlzLnByZXZBbGwoKS5sZW5ndGggOiAtMTsKCQl9CgoJCS8vIGluZGV4IGluIHNlbGVjdG9yCgkJaWYgKCB0eXBlb2YgZWxlbSA9PT0gInN0cmluZyIgKSB7CgkJCXJldHVybiBqUXVlcnkuaW5BcnJheSggdGhpc1swXSwgalF1ZXJ5KCBlbGVtICkgKTsKCQl9CgoJCS8vIExvY2F0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIGRlc2lyZWQgZWxlbWVudAoJCXJldHVybiBqUXVlcnkuaW5BcnJheSgKCQkJLy8gSWYgaXQgcmVjZWl2ZXMgYSBqUXVlcnkgb2JqZWN0LCB0aGUgZmlyc3QgZWxlbWVudCBpcyB1c2VkCgkJCWVsZW0uanF1ZXJ5ID8gZWxlbVswXSA6IGVsZW0sIHRoaXMgKTsKCX0sCgoJYWRkOiBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7CgkJdmFyIHNldCA9IHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgPwoJCQkJalF1ZXJ5KCBzZWxlY3RvciwgY29udGV4dCApIDoKCQkJCWpRdWVyeS5tYWtlQXJyYXkoIHNlbGVjdG9yICYmIHNlbGVjdG9yLm5vZGVUeXBlID8gWyBzZWxlY3RvciBdIDogc2VsZWN0b3IgKSwKCQkJYWxsID0galF1ZXJ5Lm1lcmdlKCB0aGlzLmdldCgpLCBzZXQgKTsKCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBpc0Rpc2Nvbm5lY3RlZCggc2V0WzBdICkgfHwgaXNEaXNjb25uZWN0ZWQoIGFsbFswXSApID8KCQkJYWxsIDoKCQkJalF1ZXJ5LnVuaXF1ZSggYWxsICkgKTsKCX0sCgoJYWRkQmFjazogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiB0aGlzLmFkZCggc2VsZWN0b3IgPT0gbnVsbCA/CgkJCXRoaXMucHJldk9iamVjdCA6IHRoaXMucHJldk9iamVjdC5maWx0ZXIoc2VsZWN0b3IpCgkJKTsKCX0KfSk7CgpqUXVlcnkuZm4uYW5kU2VsZiA9IGpRdWVyeS5mbi5hZGRCYWNrOwoKLy8gQSBwYWluZnVsbHkgc2ltcGxlIGNoZWNrIHRvIHNlZSBpZiBhbiBlbGVtZW50IGlzIGRpc2Nvbm5lY3RlZAovLyBmcm9tIGEgZG9jdW1lbnQgKHNob3VsZCBiZSBpbXByb3ZlZCwgd2hlcmUgZmVhc2libGUpLgpmdW5jdGlvbiBpc0Rpc2Nvbm5lY3RlZCggbm9kZSApIHsKCXJldHVybiAhbm9kZSB8fCAhbm9kZS5wYXJlbnROb2RlIHx8IG5vZGUucGFyZW50Tm9kZS5ub2RlVHlwZSA9PT0gMTE7Cn0KCmZ1bmN0aW9uIHNpYmxpbmcoIGN1ciwgZGlyICkgewoJZG8gewoJCWN1ciA9IGN1clsgZGlyIF07Cgl9IHdoaWxlICggY3VyICYmIGN1ci5ub2RlVHlwZSAhPT0gMSApOwoKCXJldHVybiBjdXI7Cn0KCmpRdWVyeS5lYWNoKHsKCXBhcmVudDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQlyZXR1cm4gcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSAhPT0gMTEgPyBwYXJlbnQgOiBudWxsOwoJfSwKCXBhcmVudHM6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCAicGFyZW50Tm9kZSIgKTsKCX0sCglwYXJlbnRzVW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHsKCQlyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgInBhcmVudE5vZGUiLCB1bnRpbCApOwoJfSwKCW5leHQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBzaWJsaW5nKCBlbGVtLCAibmV4dFNpYmxpbmciICk7Cgl9LAoJcHJldjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJcmV0dXJuIHNpYmxpbmcoIGVsZW0sICJwcmV2aW91c1NpYmxpbmciICk7Cgl9LAoJbmV4dEFsbDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJcmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sICJuZXh0U2libGluZyIgKTsKCX0sCglwcmV2QWxsOiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgInByZXZpb3VzU2libGluZyIgKTsKCX0sCgluZXh0VW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHsKCQlyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgIm5leHRTaWJsaW5nIiwgdW50aWwgKTsKCX0sCglwcmV2VW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHsKCQlyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgInByZXZpb3VzU2libGluZyIsIHVudGlsICk7Cgl9LAoJc2libGluZ3M6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBqUXVlcnkuc2libGluZyggKCBlbGVtLnBhcmVudE5vZGUgfHwge30gKS5maXJzdENoaWxkLCBlbGVtICk7Cgl9LAoJY2hpbGRyZW46IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBqUXVlcnkuc2libGluZyggZWxlbS5maXJzdENoaWxkICk7Cgl9LAoJY29udGVudHM6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJpZnJhbWUiICkgPwoJCQllbGVtLmNvbnRlbnREb2N1bWVudCB8fCBlbGVtLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQgOgoJCQlqUXVlcnkubWVyZ2UoIFtdLCBlbGVtLmNoaWxkTm9kZXMgKTsKCX0KfSwgZnVuY3Rpb24oIG5hbWUsIGZuICkgewoJalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggdW50aWwsIHNlbGVjdG9yICkgewoJCXZhciByZXQgPSBqUXVlcnkubWFwKCB0aGlzLCBmbiwgdW50aWwgKTsKCgkJaWYgKCAhcnVudGlsLnRlc3QoIG5hbWUgKSApIHsKCQkJc2VsZWN0b3IgPSB1bnRpbDsKCQl9CgoJCWlmICggc2VsZWN0b3IgJiYgdHlwZW9mIHNlbGVjdG9yID09PSAic3RyaW5nIiApIHsKCQkJcmV0ID0galF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIHJldCApOwoJCX0KCgkJcmV0ID0gdGhpcy5sZW5ndGggPiAxICYmICFndWFyYW50ZWVkVW5pcXVlWyBuYW1lIF0gPyBqUXVlcnkudW5pcXVlKCByZXQgKSA6IHJldDsKCgkJaWYgKCB0aGlzLmxlbmd0aCA+IDEgJiYgcnBhcmVudHNwcmV2LnRlc3QoIG5hbWUgKSApIHsKCQkJcmV0ID0gcmV0LnJldmVyc2UoKTsKCQl9CgoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggcmV0LCBuYW1lLCBjb3JlX3NsaWNlLmNhbGwoIGFyZ3VtZW50cyApLmpvaW4oIiwiKSApOwoJfTsKfSk7CgpqUXVlcnkuZXh0ZW5kKHsKCWZpbHRlcjogZnVuY3Rpb24oIGV4cHIsIGVsZW1zLCBub3QgKSB7CgkJaWYgKCBub3QgKSB7CgkJCWV4cHIgPSAiOm5vdCgiICsgZXhwciArICIpIjsKCQl9CgoJCXJldHVybiBlbGVtcy5sZW5ndGggPT09IDEgPwoJCQlqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoZWxlbXNbMF0sIGV4cHIpID8gWyBlbGVtc1swXSBdIDogW10gOgoJCQlqUXVlcnkuZmluZC5tYXRjaGVzKGV4cHIsIGVsZW1zKTsKCX0sCgoJZGlyOiBmdW5jdGlvbiggZWxlbSwgZGlyLCB1bnRpbCApIHsKCQl2YXIgbWF0Y2hlZCA9IFtdLAoJCQljdXIgPSBlbGVtWyBkaXIgXTsKCgkJd2hpbGUgKCBjdXIgJiYgY3VyLm5vZGVUeXBlICE9PSA5ICYmICh1bnRpbCA9PT0gdW5kZWZpbmVkIHx8IGN1ci5ub2RlVHlwZSAhPT0gMSB8fCAhalF1ZXJ5KCBjdXIgKS5pcyggdW50aWwgKSkgKSB7CgkJCWlmICggY3VyLm5vZGVUeXBlID09PSAxICkgewoJCQkJbWF0Y2hlZC5wdXNoKCBjdXIgKTsKCQkJfQoJCQljdXIgPSBjdXJbZGlyXTsKCQl9CgkJcmV0dXJuIG1hdGNoZWQ7Cgl9LAoKCXNpYmxpbmc6IGZ1bmN0aW9uKCBuLCBlbGVtICkgewoJCXZhciByID0gW107CgoJCWZvciAoIDsgbjsgbiA9IG4ubmV4dFNpYmxpbmcgKSB7CgkJCWlmICggbi5ub2RlVHlwZSA9PT0gMSAmJiBuICE9PSBlbGVtICkgewoJCQkJci5wdXNoKCBuICk7CgkJCX0KCQl9CgoJCXJldHVybiByOwoJfQp9KTsKCi8vIEltcGxlbWVudCB0aGUgaWRlbnRpY2FsIGZ1bmN0aW9uYWxpdHkgZm9yIGZpbHRlciBhbmQgbm90CmZ1bmN0aW9uIHdpbm5vdyggZWxlbWVudHMsIHF1YWxpZmllciwga2VlcCApIHsKCgkvLyBDYW4ndCBwYXNzIG51bGwgb3IgdW5kZWZpbmVkIHRvIGluZGV4T2YgaW4gRmlyZWZveCA0CgkvLyBTZXQgdG8gMCB0byBza2lwIHN0cmluZyBjaGVjawoJcXVhbGlmaWVyID0gcXVhbGlmaWVyIHx8IDA7CgoJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcXVhbGlmaWVyICkgKSB7CgkJcmV0dXJuIGpRdWVyeS5ncmVwKGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHsKCQkJdmFyIHJldFZhbCA9ICEhcXVhbGlmaWVyLmNhbGwoIGVsZW0sIGksIGVsZW0gKTsKCQkJcmV0dXJuIHJldFZhbCA9PT0ga2VlcDsKCQl9KTsKCgl9IGVsc2UgaWYgKCBxdWFsaWZpZXIubm9kZVR5cGUgKSB7CgkJcmV0dXJuIGpRdWVyeS5ncmVwKGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHsKCQkJcmV0dXJuICggZWxlbSA9PT0gcXVhbGlmaWVyICkgPT09IGtlZXA7CgkJfSk7CgoJfSBlbHNlIGlmICggdHlwZW9mIHF1YWxpZmllciA9PT0gInN0cmluZyIgKSB7CgkJdmFyIGZpbHRlcmVkID0galF1ZXJ5LmdyZXAoZWxlbWVudHMsIGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMTsKCQl9KTsKCgkJaWYgKCBpc1NpbXBsZS50ZXN0KCBxdWFsaWZpZXIgKSApIHsKCQkJcmV0dXJuIGpRdWVyeS5maWx0ZXIocXVhbGlmaWVyLCBmaWx0ZXJlZCwgIWtlZXApOwoJCX0gZWxzZSB7CgkJCXF1YWxpZmllciA9IGpRdWVyeS5maWx0ZXIoIHF1YWxpZmllciwgZmlsdGVyZWQgKTsKCQl9Cgl9CgoJcmV0dXJuIGpRdWVyeS5ncmVwKGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHsKCQlyZXR1cm4gKCBqUXVlcnkuaW5BcnJheSggZWxlbSwgcXVhbGlmaWVyICkgPj0gMCApID09PSBrZWVwOwoJfSk7Cn0KZnVuY3Rpb24gY3JlYXRlU2FmZUZyYWdtZW50KCBkb2N1bWVudCApIHsKCXZhciBsaXN0ID0gbm9kZU5hbWVzLnNwbGl0KCAifCIgKSwKCXNhZmVGcmFnID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOwoKCWlmICggc2FmZUZyYWcuY3JlYXRlRWxlbWVudCApIHsKCQl3aGlsZSAoIGxpc3QubGVuZ3RoICkgewoJCQlzYWZlRnJhZy5jcmVhdGVFbGVtZW50KAoJCQkJbGlzdC5wb3AoKQoJCQkpOwoJCX0KCX0KCXJldHVybiBzYWZlRnJhZzsKfQoKdmFyIG5vZGVOYW1lcyA9ICJhYmJyfGFydGljbGV8YXNpZGV8YXVkaW98YmRpfGNhbnZhc3xkYXRhfGRhdGFsaXN0fGRldGFpbHN8ZmlnY2FwdGlvbnxmaWd1cmV8Zm9vdGVyfCIgKwoJCSJoZWFkZXJ8aGdyb3VwfG1hcmt8bWV0ZXJ8bmF2fG91dHB1dHxwcm9ncmVzc3xzZWN0aW9ufHN1bW1hcnl8dGltZXx2aWRlbyIsCglyaW5saW5lalF1ZXJ5ID0gLyBqUXVlcnlcZCs9Iig/Om51bGx8XGQrKSIvZywKCXJsZWFkaW5nV2hpdGVzcGFjZSA9IC9eXHMrLywKCXJ4aHRtbFRhZyA9IC88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcdzpdKylbXj5dKilcLz4vZ2ksCglydGFnTmFtZSA9IC88KFtcdzpdKykvLAoJcnRib2R5ID0gLzx0Ym9keS9pLAoJcmh0bWwgPSAvPHwmIz9cdys7LywKCXJub0lubmVyaHRtbCA9IC88KD86c2NyaXB0fHN0eWxlfGxpbmspL2ksCglybm9jYWNoZSA9IC88KD86c2NyaXB0fG9iamVjdHxlbWJlZHxvcHRpb258c3R5bGUpL2ksCglybm9zaGltY2FjaGUgPSBuZXcgUmVnRXhwKCI8KD86IiArIG5vZGVOYW1lcyArICIpW1xccy8+XSIsICJpIiksCglyY2hlY2thYmxlVHlwZSA9IC9eKD86Y2hlY2tib3h8cmFkaW8pJC8sCgkvLyBjaGVja2VkPSJjaGVja2VkIiBvciBjaGVja2VkCglyY2hlY2tlZCA9IC9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLAoJcnNjcmlwdFR5cGUgPSAvXC8oamF2YXxlY21hKXNjcmlwdC9pLAoJcmNsZWFuU2NyaXB0ID0gL15ccyo8ISg/OlxbQ0RBVEFcW3xcLVwtKXxbXF1cLV17Mn0+XHMqJC9nLAoJd3JhcE1hcCA9IHsKCQlvcHRpb246IFsgMSwgIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCAiPC9zZWxlY3Q+IiBdLAoJCWxlZ2VuZDogWyAxLCAiPGZpZWxkc2V0PiIsICI8L2ZpZWxkc2V0PiIgXSwKCQl0aGVhZDogWyAxLCAiPHRhYmxlPiIsICI8L3RhYmxlPiIgXSwKCQl0cjogWyAyLCAiPHRhYmxlPjx0Ym9keT4iLCAiPC90Ym9keT48L3RhYmxlPiIgXSwKCQl0ZDogWyAzLCAiPHRhYmxlPjx0Ym9keT48dHI+IiwgIjwvdHI+PC90Ym9keT48L3RhYmxlPiIgXSwKCQljb2w6IFsgMiwgIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwgIjwvY29sZ3JvdXA+PC90YWJsZT4iIF0sCgkJYXJlYTogWyAxLCAiPG1hcD4iLCAiPC9tYXA+IiBdLAoJCV9kZWZhdWx0OiBbIDAsICIiLCAiIiBdCgl9LAoJc2FmZUZyYWdtZW50ID0gY3JlYXRlU2FmZUZyYWdtZW50KCBkb2N1bWVudCApLAoJZnJhZ21lbnREaXYgPSBzYWZlRnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpICk7Cgp3cmFwTWFwLm9wdGdyb3VwID0gd3JhcE1hcC5vcHRpb247CndyYXBNYXAudGJvZHkgPSB3cmFwTWFwLnRmb290ID0gd3JhcE1hcC5jb2xncm91cCA9IHdyYXBNYXAuY2FwdGlvbiA9IHdyYXBNYXAudGhlYWQ7CndyYXBNYXAudGggPSB3cmFwTWFwLnRkOwoKLy8gSUU2LTggY2FuJ3Qgc2VyaWFsaXplIGxpbmssIHNjcmlwdCwgc3R5bGUsIG9yIGFueSBodG1sNSAoTm9TY29wZSkgdGFncywKLy8gdW5sZXNzIHdyYXBwZWQgaW4gYSBkaXYgd2l0aCBub24tYnJlYWtpbmcgY2hhcmFjdGVycyBpbiBmcm9udCBvZiBpdC4KaWYgKCAhalF1ZXJ5LnN1cHBvcnQuaHRtbFNlcmlhbGl6ZSApIHsKCXdyYXBNYXAuX2RlZmF1bHQgPSBbIDEsICJYPGRpdj4iLCAiPC9kaXY+IiBdOwp9CgpqUXVlcnkuZm4uZXh0ZW5kKHsKCXRleHQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQlyZXR1cm4galF1ZXJ5LmFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkgewoJCQlyZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/CgkJCQlqUXVlcnkudGV4dCggdGhpcyApIDoKCQkJCXRoaXMuZW1wdHkoKS5hcHBlbmQoICggdGhpc1swXSAmJiB0aGlzWzBdLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQgKS5jcmVhdGVUZXh0Tm9kZSggdmFsdWUgKSApOwoJCX0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7Cgl9LAoKCXdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkgewoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKSB7CgkJCQlqUXVlcnkodGhpcykud3JhcEFsbCggaHRtbC5jYWxsKHRoaXMsIGkpICk7CgkJCX0pOwoJCX0KCgkJaWYgKCB0aGlzWzBdICkgewoJCQkvLyBUaGUgZWxlbWVudHMgdG8gd3JhcCB0aGUgdGFyZ2V0IGFyb3VuZAoJCQl2YXIgd3JhcCA9IGpRdWVyeSggaHRtbCwgdGhpc1swXS5vd25lckRvY3VtZW50ICkuZXEoMCkuY2xvbmUodHJ1ZSk7CgoJCQlpZiAoIHRoaXNbMF0ucGFyZW50Tm9kZSApIHsKCQkJCXdyYXAuaW5zZXJ0QmVmb3JlKCB0aGlzWzBdICk7CgkJCX0KCgkJCXdyYXAubWFwKGZ1bmN0aW9uKCkgewoJCQkJdmFyIGVsZW0gPSB0aGlzOwoKCQkJCXdoaWxlICggZWxlbS5maXJzdENoaWxkICYmIGVsZW0uZmlyc3RDaGlsZC5ub2RlVHlwZSA9PT0gMSApIHsKCQkJCQllbGVtID0gZWxlbS5maXJzdENoaWxkOwoJCQkJfQoKCQkJCXJldHVybiBlbGVtOwoJCQl9KS5hcHBlbmQoIHRoaXMgKTsKCQl9CgoJCXJldHVybiB0aGlzOwoJfSwKCgl3cmFwSW5uZXI6IGZ1bmN0aW9uKCBodG1sICkgewoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKSB7CgkJCQlqUXVlcnkodGhpcykud3JhcElubmVyKCBodG1sLmNhbGwodGhpcywgaSkgKTsKCQkJfSk7CgkJfQoKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQl2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApLAoJCQkJY29udGVudHMgPSBzZWxmLmNvbnRlbnRzKCk7CgoJCQlpZiAoIGNvbnRlbnRzLmxlbmd0aCApIHsKCQkJCWNvbnRlbnRzLndyYXBBbGwoIGh0bWwgKTsKCgkJCX0gZWxzZSB7CgkJCQlzZWxmLmFwcGVuZCggaHRtbCApOwoJCQl9CgkJfSk7Cgl9LAoKCXdyYXA6IGZ1bmN0aW9uKCBodG1sICkgewoJCXZhciBpc0Z1bmN0aW9uID0galF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKTsKCgkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKSB7CgkJCWpRdWVyeSggdGhpcyApLndyYXBBbGwoIGlzRnVuY3Rpb24gPyBodG1sLmNhbGwodGhpcywgaSkgOiBodG1sICk7CgkJfSk7Cgl9LAoKCXVud3JhcDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMucGFyZW50KCkuZWFjaChmdW5jdGlvbigpIHsKCQkJaWYgKCAhalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCAiYm9keSIgKSApIHsKCQkJCWpRdWVyeSggdGhpcyApLnJlcGxhY2VXaXRoKCB0aGlzLmNoaWxkTm9kZXMgKTsKCQkJfQoJCX0pLmVuZCgpOwoJfSwKCglhcHBlbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywgdHJ1ZSwgZnVuY3Rpb24oIGVsZW0gKSB7CgkJCWlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSB8fCB0aGlzLm5vZGVUeXBlID09PSAxMSApIHsKCQkJCXRoaXMuYXBwZW5kQ2hpbGQoIGVsZW0gKTsKCQkJfQoJCX0pOwoJfSwKCglwcmVwZW5kOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsIHRydWUsIGZ1bmN0aW9uKCBlbGVtICkgewoJCQlpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgKSB7CgkJCQl0aGlzLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcy5maXJzdENoaWxkICk7CgkJCX0KCQl9KTsKCX0sCgoJYmVmb3JlOiBmdW5jdGlvbigpIHsKCQlpZiAoICFpc0Rpc2Nvbm5lY3RlZCggdGhpc1swXSApICkgewoJCQlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsIGZhbHNlLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJCXRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMgKTsKCQkJfSk7CgkJfQoKCQlpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7CgkJCXZhciBzZXQgPSBqUXVlcnkuY2xlYW4oIGFyZ3VtZW50cyApOwoJCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS5tZXJnZSggc2V0LCB0aGlzICksICJiZWZvcmUiLCB0aGlzLnNlbGVjdG9yICk7CgkJfQoJfSwKCglhZnRlcjogZnVuY3Rpb24oKSB7CgkJaWYgKCAhaXNEaXNjb25uZWN0ZWQoIHRoaXNbMF0gKSApIHsKCQkJcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCBmYWxzZSwgZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQl0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLm5leHRTaWJsaW5nICk7CgkJCX0pOwoJCX0KCgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoICkgewoJCQl2YXIgc2V0ID0galF1ZXJ5LmNsZWFuKCBhcmd1bWVudHMgKTsKCQkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkubWVyZ2UoIHRoaXMsIHNldCApLCAiYWZ0ZXIiLCB0aGlzLnNlbGVjdG9yICk7CgkJfQoJfSwKCgkvLyBrZWVwRGF0YSBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHktLWRvIG5vdCBkb2N1bWVudAoJcmVtb3ZlOiBmdW5jdGlvbiggc2VsZWN0b3IsIGtlZXBEYXRhICkgewoJCXZhciBlbGVtLAoJCQlpID0gMDsKCgkJZm9yICggOyAoZWxlbSA9IHRoaXNbaV0pICE9IG51bGw7IGkrKyApIHsKCQkJaWYgKCAhc2VsZWN0b3IgfHwgalF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIFsgZWxlbSBdICkubGVuZ3RoICkgewoJCQkJaWYgKCAha2VlcERhdGEgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJCQlqUXVlcnkuY2xlYW5EYXRhKCBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikgKTsKCQkJCQlqUXVlcnkuY2xlYW5EYXRhKCBbIGVsZW0gXSApOwoJCQkJfQoKCQkJCWlmICggZWxlbS5wYXJlbnROb2RlICkgewoJCQkJCWVsZW0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggZWxlbSApOwoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJZW1wdHk6IGZ1bmN0aW9uKCkgewoJCXZhciBlbGVtLAoJCQlpID0gMDsKCgkJZm9yICggOyAoZWxlbSA9IHRoaXNbaV0pICE9IG51bGw7IGkrKyApIHsKCQkJLy8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQgbWVtb3J5IGxlYWtzCgkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJCWpRdWVyeS5jbGVhbkRhdGEoIGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSApOwoJCQl9CgoJCQkvLyBSZW1vdmUgYW55IHJlbWFpbmluZyBub2RlcwoJCQl3aGlsZSAoIGVsZW0uZmlyc3RDaGlsZCApIHsKCQkJCWVsZW0ucmVtb3ZlQ2hpbGQoIGVsZW0uZmlyc3RDaGlsZCApOwoJCQl9CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJY2xvbmU6IGZ1bmN0aW9uKCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKCQlkYXRhQW5kRXZlbnRzID0gZGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZmFsc2UgOiBkYXRhQW5kRXZlbnRzOwoJCWRlZXBEYXRhQW5kRXZlbnRzID0gZGVlcERhdGFBbmRFdmVudHMgPT0gbnVsbCA/IGRhdGFBbmRFdmVudHMgOiBkZWVwRGF0YUFuZEV2ZW50czsKCgkJcmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbiAoKSB7CgkJCXJldHVybiBqUXVlcnkuY2xvbmUoIHRoaXMsIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICk7CgkJfSk7Cgl9LAoKCWh0bWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQlyZXR1cm4galF1ZXJ5LmFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkgewoJCQl2YXIgZWxlbSA9IHRoaXNbMF0gfHwge30sCgkJCQlpID0gMCwKCQkJCWwgPSB0aGlzLmxlbmd0aDsKCgkJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHsKCQkJCXJldHVybiBlbGVtLm5vZGVUeXBlID09PSAxID8KCQkJCQllbGVtLmlubmVySFRNTC5yZXBsYWNlKCByaW5saW5lalF1ZXJ5LCAiIiApIDoKCQkJCQl1bmRlZmluZWQ7CgkJCX0KCgkJCS8vIFNlZSBpZiB3ZSBjYW4gdGFrZSBhIHNob3J0Y3V0IGFuZCBqdXN0IHVzZSBpbm5lckhUTUwKCQkJaWYgKCB0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciICYmICFybm9Jbm5lcmh0bWwudGVzdCggdmFsdWUgKSAmJgoJCQkJKCBqUXVlcnkuc3VwcG9ydC5odG1sU2VyaWFsaXplIHx8ICFybm9zaGltY2FjaGUudGVzdCggdmFsdWUgKSAgKSAmJgoJCQkJKCBqUXVlcnkuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSB8fCAhcmxlYWRpbmdXaGl0ZXNwYWNlLnRlc3QoIHZhbHVlICkgKSAmJgoJCQkJIXdyYXBNYXBbICggcnRhZ05hbWUuZXhlYyggdmFsdWUgKSB8fCBbIiIsICIiXSApWzFdLnRvTG93ZXJDYXNlKCkgXSApIHsKCgkJCQl2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoIHJ4aHRtbFRhZywgIjwkMT48LyQyPiIgKTsKCgkJCQl0cnkgewoJCQkJCWZvciAoOyBpIDwgbDsgaSsrICkgewoJCQkJCQkvLyBSZW1vdmUgZWxlbWVudCBub2RlcyBhbmQgcHJldmVudCBtZW1vcnkgbGVha3MKCQkJCQkJZWxlbSA9IHRoaXNbaV0gfHwge307CgkJCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJCQkJCWpRdWVyeS5jbGVhbkRhdGEoIGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoICIqIiApICk7CgkJCQkJCQllbGVtLmlubmVySFRNTCA9IHZhbHVlOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQllbGVtID0gMDsKCgkJCQkvLyBJZiB1c2luZyBpbm5lckhUTUwgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdXNlIHRoZSBmYWxsYmFjayBtZXRob2QKCQkJCX0gY2F0Y2goZSkge30KCQkJfQoKCQkJaWYgKCBlbGVtICkgewoJCQkJdGhpcy5lbXB0eSgpLmFwcGVuZCggdmFsdWUgKTsKCQkJfQoJCX0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7Cgl9LAoKCXJlcGxhY2VXaXRoOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJaWYgKCAhaXNEaXNjb25uZWN0ZWQoIHRoaXNbMF0gKSApIHsKCQkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGVsZW1lbnRzIGFyZSByZW1vdmVkIGZyb20gdGhlIERPTSBiZWZvcmUgdGhleSBhcmUgaW5zZXJ0ZWQKCQkJLy8gdGhpcyBjYW4gaGVscCBmaXggcmVwbGFjaW5nIGEgcGFyZW50IHdpdGggY2hpbGQgZWxlbWVudHMKCQkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHsKCQkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oaSkgewoJCQkJCXZhciBzZWxmID0galF1ZXJ5KHRoaXMpLCBvbGQgPSBzZWxmLmh0bWwoKTsKCQkJCQlzZWxmLnJlcGxhY2VXaXRoKCB2YWx1ZS5jYWxsKCB0aGlzLCBpLCBvbGQgKSApOwoJCQkJfSk7CgkJCX0KCgkJCWlmICggdHlwZW9mIHZhbHVlICE9PSAic3RyaW5nIiApIHsKCQkJCXZhbHVlID0galF1ZXJ5KCB2YWx1ZSApLmRldGFjaCgpOwoJCQl9CgoJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIG5leHQgPSB0aGlzLm5leHRTaWJsaW5nLAoJCQkJCXBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTsKCgkJCQlqUXVlcnkoIHRoaXMgKS5yZW1vdmUoKTsKCgkJCQlpZiAoIG5leHQgKSB7CgkJCQkJalF1ZXJ5KG5leHQpLmJlZm9yZSggdmFsdWUgKTsKCQkJCX0gZWxzZSB7CgkJCQkJalF1ZXJ5KHBhcmVudCkuYXBwZW5kKCB2YWx1ZSApOwoJCQkJfQoJCQl9KTsKCQl9CgoJCXJldHVybiB0aGlzLmxlbmd0aCA/CgkJCXRoaXMucHVzaFN0YWNrKCBqUXVlcnkoalF1ZXJ5LmlzRnVuY3Rpb24odmFsdWUpID8gdmFsdWUoKSA6IHZhbHVlKSwgInJlcGxhY2VXaXRoIiwgdmFsdWUgKSA6CgkJCXRoaXM7Cgl9LAoKCWRldGFjaDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiB0aGlzLnJlbW92ZSggc2VsZWN0b3IsIHRydWUgKTsKCX0sCgoJZG9tTWFuaXA6IGZ1bmN0aW9uKCBhcmdzLCB0YWJsZSwgY2FsbGJhY2sgKSB7CgoJCS8vIEZsYXR0ZW4gYW55IG5lc3RlZCBhcnJheXMKCQlhcmdzID0gW10uY29uY2F0LmFwcGx5KCBbXSwgYXJncyApOwoKCQl2YXIgcmVzdWx0cywgZmlyc3QsIGZyYWdtZW50LCBpTm9DbG9uZSwKCQkJaSA9IDAsCgkJCXZhbHVlID0gYXJnc1swXSwKCQkJc2NyaXB0cyA9IFtdLAoJCQlsID0gdGhpcy5sZW5ndGg7CgoJCS8vIFdlIGNhbid0IGNsb25lTm9kZSBmcmFnbWVudHMgdGhhdCBjb250YWluIGNoZWNrZWQsIGluIFdlYktpdAoJCWlmICggIWpRdWVyeS5zdXBwb3J0LmNoZWNrQ2xvbmUgJiYgbCA+IDEgJiYgdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiAmJiByY2hlY2tlZC50ZXN0KCB2YWx1ZSApICkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJalF1ZXJ5KHRoaXMpLmRvbU1hbmlwKCBhcmdzLCB0YWJsZSwgY2FsbGJhY2sgKTsKCQkJfSk7CgkJfQoKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKHZhbHVlKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKSB7CgkJCQl2YXIgc2VsZiA9IGpRdWVyeSh0aGlzKTsKCQkJCWFyZ3NbMF0gPSB2YWx1ZS5jYWxsKCB0aGlzLCBpLCB0YWJsZSA/IHNlbGYuaHRtbCgpIDogdW5kZWZpbmVkICk7CgkJCQlzZWxmLmRvbU1hbmlwKCBhcmdzLCB0YWJsZSwgY2FsbGJhY2sgKTsKCQkJfSk7CgkJfQoKCQlpZiAoIHRoaXNbMF0gKSB7CgkJCXJlc3VsdHMgPSBqUXVlcnkuYnVpbGRGcmFnbWVudCggYXJncywgdGhpcywgc2NyaXB0cyApOwoJCQlmcmFnbWVudCA9IHJlc3VsdHMuZnJhZ21lbnQ7CgkJCWZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDsKCgkJCWlmICggZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDEgKSB7CgkJCQlmcmFnbWVudCA9IGZpcnN0OwoJCQl9CgoJCQlpZiAoIGZpcnN0ICkgewoJCQkJdGFibGUgPSB0YWJsZSAmJiBqUXVlcnkubm9kZU5hbWUoIGZpcnN0LCAidHIiICk7CgoJCQkJLy8gVXNlIHRoZSBvcmlnaW5hbCBmcmFnbWVudCBmb3IgdGhlIGxhc3QgaXRlbSBpbnN0ZWFkIG9mIHRoZSBmaXJzdCBiZWNhdXNlIGl0IGNhbiBlbmQgdXAKCQkJCS8vIGJlaW5nIGVtcHRpZWQgaW5jb3JyZWN0bHkgaW4gY2VydGFpbiBzaXR1YXRpb25zICgjODA3MCkuCgkJCQkvLyBGcmFnbWVudHMgZnJvbSB0aGUgZnJhZ21lbnQgY2FjaGUgbXVzdCBhbHdheXMgYmUgY2xvbmVkIGFuZCBuZXZlciB1c2VkIGluIHBsYWNlLgoJCQkJZm9yICggaU5vQ2xvbmUgPSByZXN1bHRzLmNhY2hlYWJsZSB8fCBsIC0gMTsgaSA8IGw7IGkrKyApIHsKCQkJCQljYWxsYmFjay5jYWxsKAoJCQkJCQl0YWJsZSAmJiBqUXVlcnkubm9kZU5hbWUoIHRoaXNbaV0sICJ0YWJsZSIgKSA/CgkJCQkJCQlmaW5kT3JBcHBlbmQoIHRoaXNbaV0sICJ0Ym9keSIgKSA6CgkJCQkJCQl0aGlzW2ldLAoJCQkJCQlpID09PSBpTm9DbG9uZSA/CgkJCQkJCQlmcmFnbWVudCA6CgkJCQkJCQlqUXVlcnkuY2xvbmUoIGZyYWdtZW50LCB0cnVlLCB0cnVlICkKCQkJCQkpOwoJCQkJfQoJCQl9CgoJCQkvLyBGaXggIzExODA5OiBBdm9pZCBsZWFraW5nIG1lbW9yeQoJCQlmcmFnbWVudCA9IGZpcnN0ID0gbnVsbDsKCgkJCWlmICggc2NyaXB0cy5sZW5ndGggKSB7CgkJCQlqUXVlcnkuZWFjaCggc2NyaXB0cywgZnVuY3Rpb24oIGksIGVsZW0gKSB7CgkJCQkJaWYgKCBlbGVtLnNyYyApIHsKCQkJCQkJaWYgKCBqUXVlcnkuYWpheCApIHsKCQkJCQkJCWpRdWVyeS5hamF4KHsKCQkJCQkJCQl1cmw6IGVsZW0uc3JjLAoJCQkJCQkJCXR5cGU6ICJHRVQiLAoJCQkJCQkJCWRhdGFUeXBlOiAic2NyaXB0IiwKCQkJCQkJCQlhc3luYzogZmFsc2UsCgkJCQkJCQkJZ2xvYmFsOiBmYWxzZSwKCQkJCQkJCQkidGhyb3dzIjogdHJ1ZQoJCQkJCQkJfSk7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQlqUXVlcnkuZXJyb3IoIm5vIGFqYXgiKTsKCQkJCQkJfQoJCQkJCX0gZWxzZSB7CgkJCQkJCWpRdWVyeS5nbG9iYWxFdmFsKCAoIGVsZW0udGV4dCB8fCBlbGVtLnRleHRDb250ZW50IHx8IGVsZW0uaW5uZXJIVE1MIHx8ICIiICkucmVwbGFjZSggcmNsZWFuU2NyaXB0LCAiIiApICk7CgkJCQkJfQoKCQkJCQlpZiAoIGVsZW0ucGFyZW50Tm9kZSApIHsKCQkJCQkJZWxlbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBlbGVtICk7CgkJCQkJfQoJCQkJfSk7CgkJCX0KCQl9CgoJCXJldHVybiB0aGlzOwoJfQp9KTsKCmZ1bmN0aW9uIGZpbmRPckFwcGVuZCggZWxlbSwgdGFnICkgewoJcmV0dXJuIGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApWzBdIHx8IGVsZW0uYXBwZW5kQ2hpbGQoIGVsZW0ub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCB0YWcgKSApOwp9CgpmdW5jdGlvbiBjbG9uZUNvcHlFdmVudCggc3JjLCBkZXN0ICkgewoKCWlmICggZGVzdC5ub2RlVHlwZSAhPT0gMSB8fCAhalF1ZXJ5Lmhhc0RhdGEoIHNyYyApICkgewoJCXJldHVybjsKCX0KCgl2YXIgdHlwZSwgaSwgbCwKCQlvbGREYXRhID0galF1ZXJ5Ll9kYXRhKCBzcmMgKSwKCQljdXJEYXRhID0galF1ZXJ5Ll9kYXRhKCBkZXN0LCBvbGREYXRhICksCgkJZXZlbnRzID0gb2xkRGF0YS5ldmVudHM7CgoJaWYgKCBldmVudHMgKSB7CgkJZGVsZXRlIGN1ckRhdGEuaGFuZGxlOwoJCWN1ckRhdGEuZXZlbnRzID0ge307CgoJCWZvciAoIHR5cGUgaW4gZXZlbnRzICkgewoJCQlmb3IgKCBpID0gMCwgbCA9IGV2ZW50c1sgdHlwZSBdLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQkJCWpRdWVyeS5ldmVudC5hZGQoIGRlc3QsIHR5cGUsIGV2ZW50c1sgdHlwZSBdWyBpIF0gKTsKCQkJfQoJCX0KCX0KCgkvLyBtYWtlIHRoZSBjbG9uZWQgcHVibGljIGRhdGEgb2JqZWN0IGEgY29weSBmcm9tIHRoZSBvcmlnaW5hbAoJaWYgKCBjdXJEYXRhLmRhdGEgKSB7CgkJY3VyRGF0YS5kYXRhID0galF1ZXJ5LmV4dGVuZCgge30sIGN1ckRhdGEuZGF0YSApOwoJfQp9CgpmdW5jdGlvbiBjbG9uZUZpeEF0dHJpYnV0ZXMoIHNyYywgZGVzdCApIHsKCXZhciBub2RlTmFtZTsKCgkvLyBXZSBkbyBub3QgbmVlZCB0byBkbyBhbnl0aGluZyBmb3Igbm9uLUVsZW1lbnRzCglpZiAoIGRlc3Qubm9kZVR5cGUgIT09IDEgKSB7CgkJcmV0dXJuOwoJfQoKCS8vIGNsZWFyQXR0cmlidXRlcyByZW1vdmVzIHRoZSBhdHRyaWJ1dGVzLCB3aGljaCB3ZSBkb24ndCB3YW50LAoJLy8gYnV0IGFsc28gcmVtb3ZlcyB0aGUgYXR0YWNoRXZlbnQgZXZlbnRzLCB3aGljaCB3ZSAqZG8qIHdhbnQKCWlmICggZGVzdC5jbGVhckF0dHJpYnV0ZXMgKSB7CgkJZGVzdC5jbGVhckF0dHJpYnV0ZXMoKTsKCX0KCgkvLyBtZXJnZUF0dHJpYnV0ZXMsIGluIGNvbnRyYXN0LCBvbmx5IG1lcmdlcyBiYWNrIG9uIHRoZQoJLy8gb3JpZ2luYWwgYXR0cmlidXRlcywgbm90IHRoZSBldmVudHMKCWlmICggZGVzdC5tZXJnZUF0dHJpYnV0ZXMgKSB7CgkJZGVzdC5tZXJnZUF0dHJpYnV0ZXMoIHNyYyApOwoJfQoKCW5vZGVOYW1lID0gZGVzdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwoKCWlmICggbm9kZU5hbWUgPT09ICJvYmplY3QiICkgewoJCS8vIElFNi0xMCBpbXByb3Blcmx5IGNsb25lcyBjaGlsZHJlbiBvZiBvYmplY3QgZWxlbWVudHMgdXNpbmcgY2xhc3NpZC4KCQkvLyBJRTEwIHRocm93cyBOb01vZGlmaWNhdGlvbkFsbG93ZWRFcnJvciBpZiBwYXJlbnQgaXMgbnVsbCwgIzEyMTMyLgoJCWlmICggZGVzdC5wYXJlbnROb2RlICkgewoJCQlkZXN0Lm91dGVySFRNTCA9IHNyYy5vdXRlckhUTUw7CgkJfQoKCQkvLyBUaGlzIHBhdGggYXBwZWFycyB1bmF2b2lkYWJsZSBmb3IgSUU5LiBXaGVuIGNsb25pbmcgYW4gb2JqZWN0CgkJLy8gZWxlbWVudCBpbiBJRTksIHRoZSBvdXRlckhUTUwgc3RyYXRlZ3kgYWJvdmUgaXMgbm90IHN1ZmZpY2llbnQuCgkJLy8gSWYgdGhlIHNyYyBoYXMgaW5uZXJIVE1MIGFuZCB0aGUgZGVzdGluYXRpb24gZG9lcyBub3QsCgkJLy8gY29weSB0aGUgc3JjLmlubmVySFRNTCBpbnRvIHRoZSBkZXN0LmlubmVySFRNTC4gIzEwMzI0CgkJaWYgKCBqUXVlcnkuc3VwcG9ydC5odG1sNUNsb25lICYmIChzcmMuaW5uZXJIVE1MICYmICFqUXVlcnkudHJpbShkZXN0LmlubmVySFRNTCkpICkgewoJCQlkZXN0LmlubmVySFRNTCA9IHNyYy5pbm5lckhUTUw7CgkJfQoKCX0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSAiaW5wdXQiICYmIHJjaGVja2FibGVUeXBlLnRlc3QoIHNyYy50eXBlICkgKSB7CgkJLy8gSUU2LTggZmFpbHMgdG8gcGVyc2lzdCB0aGUgY2hlY2tlZCBzdGF0ZSBvZiBhIGNsb25lZCBjaGVja2JveAoJCS8vIG9yIHJhZGlvIGJ1dHRvbi4gV29yc2UsIElFNi03IGZhaWwgdG8gZ2l2ZSB0aGUgY2xvbmVkIGVsZW1lbnQKCQkvLyBhIGNoZWNrZWQgYXBwZWFyYW5jZSBpZiB0aGUgZGVmYXVsdENoZWNrZWQgdmFsdWUgaXNuJ3QgYWxzbyBzZXQKCgkJZGVzdC5kZWZhdWx0Q2hlY2tlZCA9IGRlc3QuY2hlY2tlZCA9IHNyYy5jaGVja2VkOwoKCQkvLyBJRTYtNyBnZXQgY29uZnVzZWQgYW5kIGVuZCB1cCBzZXR0aW5nIHRoZSB2YWx1ZSBvZiBhIGNsb25lZAoJCS8vIGNoZWNrYm94L3JhZGlvIGJ1dHRvbiB0byBhbiBlbXB0eSBzdHJpbmcgaW5zdGVhZCBvZiAib24iCgkJaWYgKCBkZXN0LnZhbHVlICE9PSBzcmMudmFsdWUgKSB7CgkJCWRlc3QudmFsdWUgPSBzcmMudmFsdWU7CgkJfQoKCS8vIElFNi04IGZhaWxzIHRvIHJldHVybiB0aGUgc2VsZWN0ZWQgb3B0aW9uIHRvIHRoZSBkZWZhdWx0IHNlbGVjdGVkCgkvLyBzdGF0ZSB3aGVuIGNsb25pbmcgb3B0aW9ucwoJfSBlbHNlIGlmICggbm9kZU5hbWUgPT09ICJvcHRpb24iICkgewoJCWRlc3Quc2VsZWN0ZWQgPSBzcmMuZGVmYXVsdFNlbGVjdGVkOwoKCS8vIElFNi04IGZhaWxzIHRvIHNldCB0aGUgZGVmYXVsdFZhbHVlIHRvIHRoZSBjb3JyZWN0IHZhbHVlIHdoZW4KCS8vIGNsb25pbmcgb3RoZXIgdHlwZXMgb2YgaW5wdXQgZmllbGRzCgl9IGVsc2UgaWYgKCBub2RlTmFtZSA9PT0gImlucHV0IiB8fCBub2RlTmFtZSA9PT0gInRleHRhcmVhIiApIHsKCQlkZXN0LmRlZmF1bHRWYWx1ZSA9IHNyYy5kZWZhdWx0VmFsdWU7CgoJLy8gSUUgYmxhbmtzIGNvbnRlbnRzIHdoZW4gY2xvbmluZyBzY3JpcHRzCgl9IGVsc2UgaWYgKCBub2RlTmFtZSA9PT0gInNjcmlwdCIgJiYgZGVzdC50ZXh0ICE9PSBzcmMudGV4dCApIHsKCQlkZXN0LnRleHQgPSBzcmMudGV4dDsKCX0KCgkvLyBFdmVudCBkYXRhIGdldHMgcmVmZXJlbmNlZCBpbnN0ZWFkIG9mIGNvcGllZCBpZiB0aGUgZXhwYW5kbwoJLy8gZ2V0cyBjb3BpZWQgdG9vCglkZXN0LnJlbW92ZUF0dHJpYnV0ZSggalF1ZXJ5LmV4cGFuZG8gKTsKfQoKalF1ZXJ5LmJ1aWxkRnJhZ21lbnQgPSBmdW5jdGlvbiggYXJncywgY29udGV4dCwgc2NyaXB0cyApIHsKCXZhciBmcmFnbWVudCwgY2FjaGVhYmxlLCBjYWNoZWhpdCwKCQlmaXJzdCA9IGFyZ3NbIDAgXTsKCgkvLyBTZXQgY29udGV4dCBmcm9tIHdoYXQgbWF5IGNvbWUgaW4gYXMgdW5kZWZpbmVkIG9yIGEgalF1ZXJ5IGNvbGxlY3Rpb24gb3IgYSBub2RlCgkvLyBVcGRhdGVkIHRvIGZpeCAjMTIyNjYgd2hlcmUgYWNjZXNzaW5nIGNvbnRleHRbMF0gY291bGQgdGhyb3cgYW4gZXhjZXB0aW9uIGluIElFOS8xMCAmCgkvLyBhbHNvIGRvdWJsZXMgYXMgZml4IGZvciAjODk1MCB3aGVyZSBwbGFpbiBvYmplY3RzIGNhdXNlZCBjcmVhdGVEb2N1bWVudEZyYWdtZW50IGV4Y2VwdGlvbgoJY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7Cgljb250ZXh0ID0gIWNvbnRleHQubm9kZVR5cGUgJiYgY29udGV4dFswXSB8fCBjb250ZXh0OwoJY29udGV4dCA9IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0OwoKCS8vIE9ubHkgY2FjaGUgInNtYWxsIiAoMS8yIEtCKSBIVE1MIHN0cmluZ3MgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBtYWluIGRvY3VtZW50CgkvLyBDbG9uaW5nIG9wdGlvbnMgbG9zZXMgdGhlIHNlbGVjdGVkIHN0YXRlLCBzbyBkb24ndCBjYWNoZSB0aGVtCgkvLyBJRSA2IGRvZXNuJ3QgbGlrZSBpdCB3aGVuIHlvdSBwdXQgPG9iamVjdD4gb3IgPGVtYmVkPiBlbGVtZW50cyBpbiBhIGZyYWdtZW50CgkvLyBBbHNvLCBXZWJLaXQgZG9lcyBub3QgY2xvbmUgJ2NoZWNrZWQnIGF0dHJpYnV0ZXMgb24gY2xvbmVOb2RlLCBzbyBkb24ndCBjYWNoZQoJLy8gTGFzdGx5LCBJRTYsNyw4IHdpbGwgbm90IGNvcnJlY3RseSByZXVzZSBjYWNoZWQgZnJhZ21lbnRzIHRoYXQgd2VyZSBjcmVhdGVkIGZyb20gdW5rbm93biBlbGVtcyAjMTA1MDEKCWlmICggYXJncy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGZpcnN0ID09PSAic3RyaW5nIiAmJiBmaXJzdC5sZW5ndGggPCA1MTIgJiYgY29udGV4dCA9PT0gZG9jdW1lbnQgJiYKCQlmaXJzdC5jaGFyQXQoMCkgPT09ICI8IiAmJiAhcm5vY2FjaGUudGVzdCggZmlyc3QgKSAmJgoJCShqUXVlcnkuc3VwcG9ydC5jaGVja0Nsb25lIHx8ICFyY2hlY2tlZC50ZXN0KCBmaXJzdCApKSAmJgoJCShqUXVlcnkuc3VwcG9ydC5odG1sNUNsb25lIHx8ICFybm9zaGltY2FjaGUudGVzdCggZmlyc3QgKSkgKSB7CgoJCS8vIE1hcmsgY2FjaGVhYmxlIGFuZCBsb29rIGZvciBhIGhpdAoJCWNhY2hlYWJsZSA9IHRydWU7CgkJZnJhZ21lbnQgPSBqUXVlcnkuZnJhZ21lbnRzWyBmaXJzdCBdOwoJCWNhY2hlaGl0ID0gZnJhZ21lbnQgIT09IHVuZGVmaW5lZDsKCX0KCglpZiAoICFmcmFnbWVudCApIHsKCQlmcmFnbWVudCA9IGNvbnRleHQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOwoJCWpRdWVyeS5jbGVhbiggYXJncywgY29udGV4dCwgZnJhZ21lbnQsIHNjcmlwdHMgKTsKCgkJLy8gVXBkYXRlIHRoZSBjYWNoZSwgYnV0IG9ubHkgc3RvcmUgZmFsc2UKCQkvLyB1bmxlc3MgdGhpcyBpcyBhIHNlY29uZCBwYXJzaW5nIG9mIHRoZSBzYW1lIGNvbnRlbnQKCQlpZiAoIGNhY2hlYWJsZSApIHsKCQkJalF1ZXJ5LmZyYWdtZW50c1sgZmlyc3QgXSA9IGNhY2hlaGl0ICYmIGZyYWdtZW50OwoJCX0KCX0KCglyZXR1cm4geyBmcmFnbWVudDogZnJhZ21lbnQsIGNhY2hlYWJsZTogY2FjaGVhYmxlIH07Cn07CgpqUXVlcnkuZnJhZ21lbnRzID0ge307CgpqUXVlcnkuZWFjaCh7CglhcHBlbmRUbzogImFwcGVuZCIsCglwcmVwZW5kVG86ICJwcmVwZW5kIiwKCWluc2VydEJlZm9yZTogImJlZm9yZSIsCglpbnNlcnRBZnRlcjogImFmdGVyIiwKCXJlcGxhY2VBbGw6ICJyZXBsYWNlV2l0aCIKfSwgZnVuY3Rpb24oIG5hbWUsIG9yaWdpbmFsICkgewoJalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJdmFyIGVsZW1zLAoJCQlpID0gMCwKCQkJcmV0ID0gW10sCgkJCWluc2VydCA9IGpRdWVyeSggc2VsZWN0b3IgKSwKCQkJbCA9IGluc2VydC5sZW5ndGgsCgkJCXBhcmVudCA9IHRoaXMubGVuZ3RoID09PSAxICYmIHRoaXNbMF0ucGFyZW50Tm9kZTsKCgkJaWYgKCAocGFyZW50ID09IG51bGwgfHwgcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSA9PT0gMTEgJiYgcGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoID09PSAxKSAmJiBsID09PSAxICkgewoJCQlpbnNlcnRbIG9yaWdpbmFsIF0oIHRoaXNbMF0gKTsKCQkJcmV0dXJuIHRoaXM7CgkJfSBlbHNlIHsKCQkJZm9yICggOyBpIDwgbDsgaSsrICkgewoJCQkJZWxlbXMgPSAoIGkgPiAwID8gdGhpcy5jbG9uZSh0cnVlKSA6IHRoaXMgKS5nZXQoKTsKCQkJCWpRdWVyeSggaW5zZXJ0W2ldIClbIG9yaWdpbmFsIF0oIGVsZW1zICk7CgkJCQlyZXQgPSByZXQuY29uY2F0KCBlbGVtcyApOwoJCQl9CgoJCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHJldCwgbmFtZSwgaW5zZXJ0LnNlbGVjdG9yICk7CgkJfQoJfTsKfSk7CgpmdW5jdGlvbiBnZXRBbGwoIGVsZW0gKSB7CglpZiAoIHR5cGVvZiBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSAidW5kZWZpbmVkIiApIHsKCQlyZXR1cm4gZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSggIioiICk7CgoJfSBlbHNlIGlmICggdHlwZW9mIGVsZW0ucXVlcnlTZWxlY3RvckFsbCAhPT0gInVuZGVmaW5lZCIgKSB7CgkJcmV0dXJuIGVsZW0ucXVlcnlTZWxlY3RvckFsbCggIioiICk7CgoJfSBlbHNlIHsKCQlyZXR1cm4gW107Cgl9Cn0KCi8vIFVzZWQgaW4gY2xlYW4sIGZpeGVzIHRoZSBkZWZhdWx0Q2hlY2tlZCBwcm9wZXJ0eQpmdW5jdGlvbiBmaXhEZWZhdWx0Q2hlY2tlZCggZWxlbSApIHsKCWlmICggcmNoZWNrYWJsZVR5cGUudGVzdCggZWxlbS50eXBlICkgKSB7CgkJZWxlbS5kZWZhdWx0Q2hlY2tlZCA9IGVsZW0uY2hlY2tlZDsKCX0KfQoKalF1ZXJ5LmV4dGVuZCh7CgljbG9uZTogZnVuY3Rpb24oIGVsZW0sIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkgewoJCXZhciBzcmNFbGVtZW50cywKCQkJZGVzdEVsZW1lbnRzLAoJCQlpLAoJCQljbG9uZTsKCgkJaWYgKCBqUXVlcnkuc3VwcG9ydC5odG1sNUNsb25lIHx8IGpRdWVyeS5pc1hNTERvYyhlbGVtKSB8fCAhcm5vc2hpbWNhY2hlLnRlc3QoICI8IiArIGVsZW0ubm9kZU5hbWUgKyAiPiIgKSApIHsKCQkJY2xvbmUgPSBlbGVtLmNsb25lTm9kZSggdHJ1ZSApOwoKCQkvLyBJRTw9OCBkb2VzIG5vdCBwcm9wZXJseSBjbG9uZSBkZXRhY2hlZCwgdW5rbm93biBlbGVtZW50IG5vZGVzCgkJfSBlbHNlIHsKCQkJZnJhZ21lbnREaXYuaW5uZXJIVE1MID0gZWxlbS5vdXRlckhUTUw7CgkJCWZyYWdtZW50RGl2LnJlbW92ZUNoaWxkKCBjbG9uZSA9IGZyYWdtZW50RGl2LmZpcnN0Q2hpbGQgKTsKCQl9CgoJCWlmICggKCFqUXVlcnkuc3VwcG9ydC5ub0Nsb25lRXZlbnQgfHwgIWpRdWVyeS5zdXBwb3J0Lm5vQ2xvbmVDaGVja2VkKSAmJgoJCQkJKGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgZWxlbS5ub2RlVHlwZSA9PT0gMTEpICYmICFqUXVlcnkuaXNYTUxEb2MoZWxlbSkgKSB7CgkJCS8vIElFIGNvcGllcyBldmVudHMgYm91bmQgdmlhIGF0dGFjaEV2ZW50IHdoZW4gdXNpbmcgY2xvbmVOb2RlLgoJCQkvLyBDYWxsaW5nIGRldGFjaEV2ZW50IG9uIHRoZSBjbG9uZSB3aWxsIGFsc28gcmVtb3ZlIHRoZSBldmVudHMKCQkJLy8gZnJvbSB0aGUgb3JpZ2luYWwuIEluIG9yZGVyIHRvIGdldCBhcm91bmQgdGhpcywgd2UgdXNlIHNvbWUKCQkJLy8gcHJvcHJpZXRhcnkgbWV0aG9kcyB0byBjbGVhciB0aGUgZXZlbnRzLiBUaGFua3MgdG8gTW9vVG9vbHMKCQkJLy8gZ3V5cyBmb3IgdGhpcyBob3RuZXNzLgoKCQkJY2xvbmVGaXhBdHRyaWJ1dGVzKCBlbGVtLCBjbG9uZSApOwoKCQkJLy8gVXNpbmcgU2l6emxlIGhlcmUgaXMgY3Jhenkgc2xvdywgc28gd2UgdXNlIGdldEVsZW1lbnRzQnlUYWdOYW1lIGluc3RlYWQKCQkJc3JjRWxlbWVudHMgPSBnZXRBbGwoIGVsZW0gKTsKCQkJZGVzdEVsZW1lbnRzID0gZ2V0QWxsKCBjbG9uZSApOwoKCQkJLy8gV2VpcmQgaXRlcmF0aW9uIGJlY2F1c2UgSUUgd2lsbCByZXBsYWNlIHRoZSBsZW5ndGggcHJvcGVydHkKCQkJLy8gd2l0aCBhbiBlbGVtZW50IGlmIHlvdSBhcmUgY2xvbmluZyB0aGUgYm9keSBhbmQgb25lIG9mIHRoZQoJCQkvLyBlbGVtZW50cyBvbiB0aGUgcGFnZSBoYXMgYSBuYW1lIG9yIGlkIG9mICJsZW5ndGgiCgkJCWZvciAoIGkgPSAwOyBzcmNFbGVtZW50c1tpXTsgKytpICkgewoJCQkJLy8gRW5zdXJlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIG5vZGUgaXMgbm90IG51bGw7IEZpeGVzICM5NTg3CgkJCQlpZiAoIGRlc3RFbGVtZW50c1tpXSApIHsKCQkJCQljbG9uZUZpeEF0dHJpYnV0ZXMoIHNyY0VsZW1lbnRzW2ldLCBkZXN0RWxlbWVudHNbaV0gKTsKCQkJCX0KCQkJfQoJCX0KCgkJLy8gQ29weSB0aGUgZXZlbnRzIGZyb20gdGhlIG9yaWdpbmFsIHRvIHRoZSBjbG9uZQoJCWlmICggZGF0YUFuZEV2ZW50cyApIHsKCQkJY2xvbmVDb3B5RXZlbnQoIGVsZW0sIGNsb25lICk7CgoJCQlpZiAoIGRlZXBEYXRhQW5kRXZlbnRzICkgewoJCQkJc3JjRWxlbWVudHMgPSBnZXRBbGwoIGVsZW0gKTsKCQkJCWRlc3RFbGVtZW50cyA9IGdldEFsbCggY2xvbmUgKTsKCgkJCQlmb3IgKCBpID0gMDsgc3JjRWxlbWVudHNbaV07ICsraSApIHsKCQkJCQljbG9uZUNvcHlFdmVudCggc3JjRWxlbWVudHNbaV0sIGRlc3RFbGVtZW50c1tpXSApOwoJCQkJfQoJCQl9CgkJfQoKCQlzcmNFbGVtZW50cyA9IGRlc3RFbGVtZW50cyA9IG51bGw7CgoJCS8vIFJldHVybiB0aGUgY2xvbmVkIHNldAoJCXJldHVybiBjbG9uZTsKCX0sCgoJY2xlYW46IGZ1bmN0aW9uKCBlbGVtcywgY29udGV4dCwgZnJhZ21lbnQsIHNjcmlwdHMgKSB7CgkJdmFyIGksIGosIGVsZW0sIHRhZywgd3JhcCwgZGVwdGgsIGRpdiwgaGFzQm9keSwgdGJvZHksIGxlbiwgaGFuZGxlU2NyaXB0LCBqc1RhZ3MsCgkJCXNhZmUgPSBjb250ZXh0ID09PSBkb2N1bWVudCAmJiBzYWZlRnJhZ21lbnQsCgkJCXJldCA9IFtdOwoKCQkvLyBFbnN1cmUgdGhhdCBjb250ZXh0IGlzIGEgZG9jdW1lbnQKCQlpZiAoICFjb250ZXh0IHx8IHR5cGVvZiBjb250ZXh0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQgPT09ICJ1bmRlZmluZWQiICkgewoJCQljb250ZXh0ID0gZG9jdW1lbnQ7CgkJfQoKCQkvLyBVc2UgdGhlIGFscmVhZHktY3JlYXRlZCBzYWZlIGZyYWdtZW50IGlmIGNvbnRleHQgcGVybWl0cwoJCWZvciAoIGkgPSAwOyAoZWxlbSA9IGVsZW1zW2ldKSAhPSBudWxsOyBpKysgKSB7CgkJCWlmICggdHlwZW9mIGVsZW0gPT09ICJudW1iZXIiICkgewoJCQkJZWxlbSArPSAiIjsKCQkJfQoKCQkJaWYgKCAhZWxlbSApIHsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQkvLyBDb252ZXJ0IGh0bWwgc3RyaW5nIGludG8gRE9NIG5vZGVzCgkJCWlmICggdHlwZW9mIGVsZW0gPT09ICJzdHJpbmciICkgewoJCQkJaWYgKCAhcmh0bWwudGVzdCggZWxlbSApICkgewoJCQkJCWVsZW0gPSBjb250ZXh0LmNyZWF0ZVRleHROb2RlKCBlbGVtICk7CgkJCQl9IGVsc2UgewoJCQkJCS8vIEVuc3VyZSBhIHNhZmUgY29udGFpbmVyIGluIHdoaWNoIHRvIHJlbmRlciB0aGUgaHRtbAoJCQkJCXNhZmUgPSBzYWZlIHx8IGNyZWF0ZVNhZmVGcmFnbWVudCggY29udGV4dCApOwoJCQkJCWRpdiA9IGNvbnRleHQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CgkJCQkJc2FmZS5hcHBlbmRDaGlsZCggZGl2ICk7CgoJCQkJCS8vIEZpeCAiWEhUTUwiLXN0eWxlIHRhZ3MgaW4gYWxsIGJyb3dzZXJzCgkJCQkJZWxlbSA9IGVsZW0ucmVwbGFjZShyeGh0bWxUYWcsICI8JDE+PC8kMj4iKTsKCgkJCQkJLy8gR28gdG8gaHRtbCBhbmQgYmFjaywgdGhlbiBwZWVsIG9mZiBleHRyYSB3cmFwcGVycwoJCQkJCXRhZyA9ICggcnRhZ05hbWUuZXhlYyggZWxlbSApIHx8IFsiIiwgIiJdIClbMV0udG9Mb3dlckNhc2UoKTsKCQkJCQl3cmFwID0gd3JhcE1hcFsgdGFnIF0gfHwgd3JhcE1hcC5fZGVmYXVsdDsKCQkJCQlkZXB0aCA9IHdyYXBbMF07CgkJCQkJZGl2LmlubmVySFRNTCA9IHdyYXBbMV0gKyBlbGVtICsgd3JhcFsyXTsKCgkJCQkJLy8gTW92ZSB0byB0aGUgcmlnaHQgZGVwdGgKCQkJCQl3aGlsZSAoIGRlcHRoLS0gKSB7CgkJCQkJCWRpdiA9IGRpdi5sYXN0Q2hpbGQ7CgkJCQkJfQoKCQkJCQkvLyBSZW1vdmUgSUUncyBhdXRvaW5zZXJ0ZWQgPHRib2R5PiBmcm9tIHRhYmxlIGZyYWdtZW50cwoJCQkJCWlmICggIWpRdWVyeS5zdXBwb3J0LnRib2R5ICkgewoKCQkJCQkJLy8gU3RyaW5nIHdhcyBhIDx0YWJsZT4sICptYXkqIGhhdmUgc3B1cmlvdXMgPHRib2R5PgoJCQkJCQloYXNCb2R5ID0gcnRib2R5LnRlc3QoZWxlbSk7CgkJCQkJCQl0Ym9keSA9IHRhZyA9PT0gInRhYmxlIiAmJiAhaGFzQm9keSA/CgkJCQkJCQkJZGl2LmZpcnN0Q2hpbGQgJiYgZGl2LmZpcnN0Q2hpbGQuY2hpbGROb2RlcyA6CgoJCQkJCQkJCS8vIFN0cmluZyB3YXMgYSBiYXJlIDx0aGVhZD4gb3IgPHRmb290PgoJCQkJCQkJCXdyYXBbMV0gPT09ICI8dGFibGU+IiAmJiAhaGFzQm9keSA/CgkJCQkJCQkJCWRpdi5jaGlsZE5vZGVzIDoKCQkJCQkJCQkJW107CgoJCQkJCQlmb3IgKCBqID0gdGJvZHkubGVuZ3RoIC0gMTsgaiA+PSAwIDsgLS1qICkgewoJCQkJCQkJaWYgKCBqUXVlcnkubm9kZU5hbWUoIHRib2R5WyBqIF0sICJ0Ym9keSIgKSAmJiAhdGJvZHlbIGogXS5jaGlsZE5vZGVzLmxlbmd0aCApIHsKCQkJCQkJCQl0Ym9keVsgaiBdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHRib2R5WyBqIF0gKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCgkJCQkJLy8gSUUgY29tcGxldGVseSBraWxscyBsZWFkaW5nIHdoaXRlc3BhY2Ugd2hlbiBpbm5lckhUTUwgaXMgdXNlZAoJCQkJCWlmICggIWpRdWVyeS5zdXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNlICYmIHJsZWFkaW5nV2hpdGVzcGFjZS50ZXN0KCBlbGVtICkgKSB7CgkJCQkJCWRpdi5pbnNlcnRCZWZvcmUoIGNvbnRleHQuY3JlYXRlVGV4dE5vZGUoIHJsZWFkaW5nV2hpdGVzcGFjZS5leGVjKGVsZW0pWzBdICksIGRpdi5maXJzdENoaWxkICk7CgkJCQkJfQoKCQkJCQllbGVtID0gZGl2LmNoaWxkTm9kZXM7CgoJCQkJCS8vIFRha2Ugb3V0IG9mIGZyYWdtZW50IGNvbnRhaW5lciAod2UgbmVlZCBhIGZyZXNoIGRpdiBlYWNoIHRpbWUpCgkJCQkJZGl2LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGRpdiApOwoJCQkJfQoJCQl9CgoJCQlpZiAoIGVsZW0ubm9kZVR5cGUgKSB7CgkJCQlyZXQucHVzaCggZWxlbSApOwoJCQl9IGVsc2UgewoJCQkJalF1ZXJ5Lm1lcmdlKCByZXQsIGVsZW0gKTsKCQkJfQoJCX0KCgkJLy8gRml4ICMxMTM1NjogQ2xlYXIgZWxlbWVudHMgZnJvbSBzYWZlRnJhZ21lbnQKCQlpZiAoIGRpdiApIHsKCQkJZWxlbSA9IGRpdiA9IHNhZmUgPSBudWxsOwoJCX0KCgkJLy8gUmVzZXQgZGVmYXVsdENoZWNrZWQgZm9yIGFueSByYWRpb3MgYW5kIGNoZWNrYm94ZXMKCQkvLyBhYm91dCB0byBiZSBhcHBlbmRlZCB0byB0aGUgRE9NIGluIElFIDYvNyAoIzgwNjApCgkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQuYXBwZW5kQ2hlY2tlZCApIHsKCQkJZm9yICggaSA9IDA7IChlbGVtID0gcmV0W2ldKSAhPSBudWxsOyBpKysgKSB7CgkJCQlpZiAoIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImlucHV0IiApICkgewoJCQkJCWZpeERlZmF1bHRDaGVja2VkKCBlbGVtICk7CgkJCQl9IGVsc2UgaWYgKCB0eXBlb2YgZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gInVuZGVmaW5lZCIgKSB7CgkJCQkJalF1ZXJ5LmdyZXAoIGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IiksIGZpeERlZmF1bHRDaGVja2VkICk7CgkJCQl9CgkJCX0KCQl9CgoJCS8vIEFwcGVuZCBlbGVtZW50cyB0byBhIHByb3ZpZGVkIGRvY3VtZW50IGZyYWdtZW50CgkJaWYgKCBmcmFnbWVudCApIHsKCQkJLy8gU3BlY2lhbCBoYW5kbGluZyBvZiBlYWNoIHNjcmlwdCBlbGVtZW50CgkJCWhhbmRsZVNjcmlwdCA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJLy8gQ2hlY2sgaWYgd2UgY29uc2lkZXIgaXQgZXhlY3V0YWJsZQoJCQkJaWYgKCAhZWxlbS50eXBlIHx8IHJzY3JpcHRUeXBlLnRlc3QoIGVsZW0udHlwZSApICkgewoJCQkJCS8vIERldGFjaCB0aGUgc2NyaXB0IGFuZCBzdG9yZSBpdCBpbiB0aGUgc2NyaXB0cyBhcnJheSAoaWYgcHJvdmlkZWQpIG9yIHRoZSBmcmFnbWVudAoJCQkJCS8vIFJldHVybiB0cnV0aHkgdG8gaW5kaWNhdGUgdGhhdCBpdCBoYXMgYmVlbiBoYW5kbGVkCgkJCQkJcmV0dXJuIHNjcmlwdHMgPwoJCQkJCQlzY3JpcHRzLnB1c2goIGVsZW0ucGFyZW50Tm9kZSA/IGVsZW0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggZWxlbSApIDogZWxlbSApIDoKCQkJCQkJZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGVsZW0gKTsKCQkJCX0KCQkJfTsKCgkJCWZvciAoIGkgPSAwOyAoZWxlbSA9IHJldFtpXSkgIT0gbnVsbDsgaSsrICkgewoJCQkJLy8gQ2hlY2sgaWYgd2UncmUgZG9uZSBhZnRlciBoYW5kbGluZyBhbiBleGVjdXRhYmxlIHNjcmlwdAoJCQkJaWYgKCAhKCBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJzY3JpcHQiICkgJiYgaGFuZGxlU2NyaXB0KCBlbGVtICkgKSApIHsKCQkJCQkvLyBBcHBlbmQgdG8gZnJhZ21lbnQgYW5kIGhhbmRsZSBlbWJlZGRlZCBzY3JpcHRzCgkJCQkJZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGVsZW0gKTsKCQkJCQlpZiAoIHR5cGVvZiBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSAidW5kZWZpbmVkIiApIHsKCQkJCQkJLy8gaGFuZGxlU2NyaXB0IGFsdGVycyB0aGUgRE9NLCBzbyB1c2UgalF1ZXJ5Lm1lcmdlIHRvIGVuc3VyZSBzbmFwc2hvdCBpdGVyYXRpb24KCQkJCQkJanNUYWdzID0galF1ZXJ5LmdyZXAoIGpRdWVyeS5tZXJnZSggW10sIGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpICksIGhhbmRsZVNjcmlwdCApOwoKCQkJCQkJLy8gU3BsaWNlIHRoZSBzY3JpcHRzIGludG8gcmV0IGFmdGVyIHRoZWlyIGZvcm1lciBhbmNlc3RvciBhbmQgYWR2YW5jZSBvdXIgaW5kZXggYmV5b25kIHRoZW0KCQkJCQkJcmV0LnNwbGljZS5hcHBseSggcmV0LCBbaSArIDEsIDBdLmNvbmNhdCgganNUYWdzICkgKTsKCQkJCQkJaSArPSBqc1RhZ3MubGVuZ3RoOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHJldDsKCX0sCgoJY2xlYW5EYXRhOiBmdW5jdGlvbiggZWxlbXMsIC8qIGludGVybmFsICovIGFjY2VwdERhdGEgKSB7CgkJdmFyIGRhdGEsIGlkLCBlbGVtLCB0eXBlLAoJCQlpID0gMCwKCQkJaW50ZXJuYWxLZXkgPSBqUXVlcnkuZXhwYW5kbywKCQkJY2FjaGUgPSBqUXVlcnkuY2FjaGUsCgkJCWRlbGV0ZUV4cGFuZG8gPSBqUXVlcnkuc3VwcG9ydC5kZWxldGVFeHBhbmRvLAoJCQlzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWw7CgoJCWZvciAoIDsgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgewoKCQkJaWYgKCBhY2NlcHREYXRhIHx8IGpRdWVyeS5hY2NlcHREYXRhKCBlbGVtICkgKSB7CgoJCQkJaWQgPSBlbGVtWyBpbnRlcm5hbEtleSBdOwoJCQkJZGF0YSA9IGlkICYmIGNhY2hlWyBpZCBdOwoKCQkJCWlmICggZGF0YSApIHsKCQkJCQlpZiAoIGRhdGEuZXZlbnRzICkgewoJCQkJCQlmb3IgKCB0eXBlIGluIGRhdGEuZXZlbnRzICkgewoJCQkJCQkJaWYgKCBzcGVjaWFsWyB0eXBlIF0gKSB7CgkJCQkJCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSApOwoKCQkJCQkJCS8vIFRoaXMgaXMgYSBzaG9ydGN1dCB0byBhdm9pZCBqUXVlcnkuZXZlbnQucmVtb3ZlJ3Mgb3ZlcmhlYWQKCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJalF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBkYXRhLmhhbmRsZSApOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoKCQkJCQkvLyBSZW1vdmUgY2FjaGUgb25seSBpZiBpdCB3YXMgbm90IGFscmVhZHkgcmVtb3ZlZCBieSBqUXVlcnkuZXZlbnQucmVtb3ZlCgkJCQkJaWYgKCBjYWNoZVsgaWQgXSApIHsKCgkJCQkJCWRlbGV0ZSBjYWNoZVsgaWQgXTsKCgkJCQkJCS8vIElFIGRvZXMgbm90IGFsbG93IHVzIHRvIGRlbGV0ZSBleHBhbmRvIHByb3BlcnRpZXMgZnJvbSBub2RlcywKCQkJCQkJLy8gbm9yIGRvZXMgaXQgaGF2ZSBhIHJlbW92ZUF0dHJpYnV0ZSBmdW5jdGlvbiBvbiBEb2N1bWVudCBub2RlczsKCQkJCQkJLy8gd2UgbXVzdCBoYW5kbGUgYWxsIG9mIHRoZXNlIGNhc2VzCgkJCQkJCWlmICggZGVsZXRlRXhwYW5kbyApIHsKCQkJCQkJCWRlbGV0ZSBlbGVtWyBpbnRlcm5hbEtleSBdOwoKCQkJCQkJfSBlbHNlIGlmICggZWxlbS5yZW1vdmVBdHRyaWJ1dGUgKSB7CgkJCQkJCQllbGVtLnJlbW92ZUF0dHJpYnV0ZSggaW50ZXJuYWxLZXkgKTsKCgkJCQkJCX0gZWxzZSB7CgkJCQkJCQllbGVtWyBpbnRlcm5hbEtleSBdID0gbnVsbDsKCQkJCQkJfQoKCQkJCQkJalF1ZXJ5LmRlbGV0ZWRJZHMucHVzaCggaWQgKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9Cgl9Cn0pOwovLyBMaW1pdCBzY29wZSBwb2xsdXRpb24gZnJvbSBhbnkgZGVwcmVjYXRlZCBBUEkKKGZ1bmN0aW9uKCkgewoKdmFyIG1hdGNoZWQsIGJyb3dzZXI7CgovLyBVc2Ugb2YgalF1ZXJ5LmJyb3dzZXIgaXMgZnJvd25lZCB1cG9uLgovLyBNb3JlIGRldGFpbHM6IGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9qUXVlcnkuYnJvd3NlcgovLyBqUXVlcnkudWFNYXRjaCBtYWludGFpbmVkIGZvciBiYWNrLWNvbXBhdApqUXVlcnkudWFNYXRjaCA9IGZ1bmN0aW9uKCB1YSApIHsKCXVhID0gdWEudG9Mb3dlckNhc2UoKTsKCgl2YXIgbWF0Y2ggPSAvKGNocm9tZSlbIFwvXShbXHcuXSspLy5leGVjKCB1YSApIHx8CgkJLyh3ZWJraXQpWyBcL10oW1x3Ll0rKS8uZXhlYyggdWEgKSB8fAoJCS8ob3BlcmEpKD86Lip2ZXJzaW9ufClbIFwvXShbXHcuXSspLy5leGVjKCB1YSApIHx8CgkJLyhtc2llKSAoW1x3Ll0rKS8uZXhlYyggdWEgKSB8fAoJCXVhLmluZGV4T2YoImNvbXBhdGlibGUiKSA8IDAgJiYgLyhtb3ppbGxhKSg/Oi4qPyBydjooW1x3Ll0rKXwpLy5leGVjKCB1YSApIHx8CgkJW107CgoJcmV0dXJuIHsKCQlicm93c2VyOiBtYXRjaFsgMSBdIHx8ICIiLAoJCXZlcnNpb246IG1hdGNoWyAyIF0gfHwgIjAiCgl9Owp9OwoKbWF0Y2hlZCA9IGpRdWVyeS51YU1hdGNoKCBuYXZpZ2F0b3IudXNlckFnZW50ICk7CmJyb3dzZXIgPSB7fTsKCmlmICggbWF0Y2hlZC5icm93c2VyICkgewoJYnJvd3NlclsgbWF0Y2hlZC5icm93c2VyIF0gPSB0cnVlOwoJYnJvd3Nlci52ZXJzaW9uID0gbWF0Y2hlZC52ZXJzaW9uOwp9CgovLyBDaHJvbWUgaXMgV2Via2l0LCBidXQgV2Via2l0IGlzIGFsc28gU2FmYXJpLgppZiAoIGJyb3dzZXIuY2hyb21lICkgewoJYnJvd3Nlci53ZWJraXQgPSB0cnVlOwp9IGVsc2UgaWYgKCBicm93c2VyLndlYmtpdCApIHsKCWJyb3dzZXIuc2FmYXJpID0gdHJ1ZTsKfQoKalF1ZXJ5LmJyb3dzZXIgPSBicm93c2VyOwoKalF1ZXJ5LnN1YiA9IGZ1bmN0aW9uKCkgewoJZnVuY3Rpb24galF1ZXJ5U3ViKCBzZWxlY3RvciwgY29udGV4dCApIHsKCQlyZXR1cm4gbmV3IGpRdWVyeVN1Yi5mbi5pbml0KCBzZWxlY3RvciwgY29udGV4dCApOwoJfQoJalF1ZXJ5LmV4dGVuZCggdHJ1ZSwgalF1ZXJ5U3ViLCB0aGlzICk7CglqUXVlcnlTdWIuc3VwZXJjbGFzcyA9IHRoaXM7CglqUXVlcnlTdWIuZm4gPSBqUXVlcnlTdWIucHJvdG90eXBlID0gdGhpcygpOwoJalF1ZXJ5U3ViLmZuLmNvbnN0cnVjdG9yID0galF1ZXJ5U3ViOwoJalF1ZXJ5U3ViLnN1YiA9IHRoaXMuc3ViOwoJalF1ZXJ5U3ViLmZuLmluaXQgPSBmdW5jdGlvbiBpbml0KCBzZWxlY3RvciwgY29udGV4dCApIHsKCQlpZiAoIGNvbnRleHQgJiYgY29udGV4dCBpbnN0YW5jZW9mIGpRdWVyeSAmJiAhKGNvbnRleHQgaW5zdGFuY2VvZiBqUXVlcnlTdWIpICkgewoJCQljb250ZXh0ID0galF1ZXJ5U3ViKCBjb250ZXh0ICk7CgkJfQoKCQlyZXR1cm4galF1ZXJ5LmZuLmluaXQuY2FsbCggdGhpcywgc2VsZWN0b3IsIGNvbnRleHQsIHJvb3RqUXVlcnlTdWIgKTsKCX07CglqUXVlcnlTdWIuZm4uaW5pdC5wcm90b3R5cGUgPSBqUXVlcnlTdWIuZm47Cgl2YXIgcm9vdGpRdWVyeVN1YiA9IGpRdWVyeVN1Yihkb2N1bWVudCk7CglyZXR1cm4galF1ZXJ5U3ViOwp9OwoKfSkoKTsKdmFyIGN1ckNTUywgaWZyYW1lLCBpZnJhbWVEb2MsCglyYWxwaGEgPSAvYWxwaGFcKFteKV0qXCkvaSwKCXJvcGFjaXR5ID0gL29wYWNpdHk9KFteKV0qKS8sCglycG9zaXRpb24gPSAvXih0b3B8cmlnaHR8Ym90dG9tfGxlZnQpJC8sCgkvLyBzd2FwcGFibGUgaWYgZGlzcGxheSBpcyBub25lIG9yIHN0YXJ0cyB3aXRoIHRhYmxlIGV4Y2VwdCAidGFibGUiLCAidGFibGUtY2VsbCIsIG9yICJ0YWJsZS1jYXB0aW9uIgoJLy8gc2VlIGhlcmUgZm9yIGRpc3BsYXkgdmFsdWVzOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0NTUy9kaXNwbGF5CglyZGlzcGxheXN3YXAgPSAvXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sCglybWFyZ2luID0gL15tYXJnaW4vLAoJcm51bXNwbGl0ID0gbmV3IFJlZ0V4cCggIl4oIiArIGNvcmVfcG51bSArICIpKC4qKSQiLCAiaSIgKSwKCXJudW1ub25weCA9IG5ldyBSZWdFeHAoICJeKCIgKyBjb3JlX3BudW0gKyAiKSg/IXB4KVthLXolXSskIiwgImkiICksCglycmVsTnVtID0gbmV3IFJlZ0V4cCggIl4oWy0rXSk9KCIgKyBjb3JlX3BudW0gKyAiKSIsICJpIiApLAoJZWxlbWRpc3BsYXkgPSB7IEJPRFk6ICJibG9jayIgfSwKCgljc3NTaG93ID0geyBwb3NpdGlvbjogImFic29sdXRlIiwgdmlzaWJpbGl0eTogImhpZGRlbiIsIGRpc3BsYXk6ICJibG9jayIgfSwKCWNzc05vcm1hbFRyYW5zZm9ybSA9IHsKCQlsZXR0ZXJTcGFjaW5nOiAwLAoJCWZvbnRXZWlnaHQ6IDQwMAoJfSwKCgljc3NFeHBhbmQgPSBbICJUb3AiLCAiUmlnaHQiLCAiQm90dG9tIiwgIkxlZnQiIF0sCgljc3NQcmVmaXhlcyA9IFsgIldlYmtpdCIsICJPIiwgIk1veiIsICJtcyIgXSwKCglldmVudHNUb2dnbGUgPSBqUXVlcnkuZm4udG9nZ2xlOwoKLy8gcmV0dXJuIGEgY3NzIHByb3BlcnR5IG1hcHBlZCB0byBhIHBvdGVudGlhbGx5IHZlbmRvciBwcmVmaXhlZCBwcm9wZXJ0eQpmdW5jdGlvbiB2ZW5kb3JQcm9wTmFtZSggc3R5bGUsIG5hbWUgKSB7CgoJLy8gc2hvcnRjdXQgZm9yIG5hbWVzIHRoYXQgYXJlIG5vdCB2ZW5kb3IgcHJlZml4ZWQKCWlmICggbmFtZSBpbiBzdHlsZSApIHsKCQlyZXR1cm4gbmFtZTsKCX0KCgkvLyBjaGVjayBmb3IgdmVuZG9yIHByZWZpeGVkIG5hbWVzCgl2YXIgY2FwTmFtZSA9IG5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpLAoJCW9yaWdOYW1lID0gbmFtZSwKCQlpID0gY3NzUHJlZml4ZXMubGVuZ3RoOwoKCXdoaWxlICggaS0tICkgewoJCW5hbWUgPSBjc3NQcmVmaXhlc1sgaSBdICsgY2FwTmFtZTsKCQlpZiAoIG5hbWUgaW4gc3R5bGUgKSB7CgkJCXJldHVybiBuYW1lOwoJCX0KCX0KCglyZXR1cm4gb3JpZ05hbWU7Cn0KCmZ1bmN0aW9uIGlzSGlkZGVuKCBlbGVtLCBlbCApIHsKCWVsZW0gPSBlbCB8fCBlbGVtOwoJcmV0dXJuIGpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApID09PSAibm9uZSIgfHwgIWpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICk7Cn0KCmZ1bmN0aW9uIHNob3dIaWRlKCBlbGVtZW50cywgc2hvdyApIHsKCXZhciBlbGVtLCBkaXNwbGF5LAoJCXZhbHVlcyA9IFtdLAoJCWluZGV4ID0gMCwKCQlsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7CgoJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQllbGVtID0gZWxlbWVudHNbIGluZGV4IF07CgkJaWYgKCAhZWxlbS5zdHlsZSApIHsKCQkJY29udGludWU7CgkJfQoJCXZhbHVlc1sgaW5kZXggXSA9IGpRdWVyeS5fZGF0YSggZWxlbSwgIm9sZGRpc3BsYXkiICk7CgkJaWYgKCBzaG93ICkgewoJCQkvLyBSZXNldCB0aGUgaW5saW5lIGRpc3BsYXkgb2YgdGhpcyBlbGVtZW50IHRvIGxlYXJuIGlmIGl0IGlzCgkJCS8vIGJlaW5nIGhpZGRlbiBieSBjYXNjYWRlZCBydWxlcyBvciBub3QKCQkJaWYgKCAhdmFsdWVzWyBpbmRleCBdICYmIGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gIm5vbmUiICkgewoJCQkJZWxlbS5zdHlsZS5kaXNwbGF5ID0gIiI7CgkJCX0KCgkJCS8vIFNldCBlbGVtZW50cyB3aGljaCBoYXZlIGJlZW4gb3ZlcnJpZGRlbiB3aXRoIGRpc3BsYXk6IG5vbmUKCQkJLy8gaW4gYSBzdHlsZXNoZWV0IHRvIHdoYXRldmVyIHRoZSBkZWZhdWx0IGJyb3dzZXIgc3R5bGUgaXMKCQkJLy8gZm9yIHN1Y2ggYW4gZWxlbWVudAoJCQlpZiAoIGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gIiIgJiYgaXNIaWRkZW4oIGVsZW0gKSApIHsKCQkJCXZhbHVlc1sgaW5kZXggXSA9IGpRdWVyeS5fZGF0YSggZWxlbSwgIm9sZGRpc3BsYXkiLCBjc3NfZGVmYXVsdERpc3BsYXkoZWxlbS5ub2RlTmFtZSkgKTsKCQkJfQoJCX0gZWxzZSB7CgkJCWRpc3BsYXkgPSBjdXJDU1MoIGVsZW0sICJkaXNwbGF5IiApOwoKCQkJaWYgKCAhdmFsdWVzWyBpbmRleCBdICYmIGRpc3BsYXkgIT09ICJub25lIiApIHsKCQkJCWpRdWVyeS5fZGF0YSggZWxlbSwgIm9sZGRpc3BsYXkiLCBkaXNwbGF5ICk7CgkJCX0KCQl9Cgl9CgoJLy8gU2V0IHRoZSBkaXNwbGF5IG9mIG1vc3Qgb2YgdGhlIGVsZW1lbnRzIGluIGEgc2Vjb25kIGxvb3AKCS8vIHRvIGF2b2lkIHRoZSBjb25zdGFudCByZWZsb3cKCWZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7CgkJZWxlbSA9IGVsZW1lbnRzWyBpbmRleCBdOwoJCWlmICggIWVsZW0uc3R5bGUgKSB7CgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAoICFzaG93IHx8IGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gIm5vbmUiIHx8IGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gIiIgKSB7CgkJCWVsZW0uc3R5bGUuZGlzcGxheSA9IHNob3cgPyB2YWx1ZXNbIGluZGV4IF0gfHwgIiIgOiAibm9uZSI7CgkJfQoJfQoKCXJldHVybiBlbGVtZW50czsKfQoKalF1ZXJ5LmZuLmV4dGVuZCh7Cgljc3M6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsKCQlyZXR1cm4galF1ZXJ5LmFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkgewoJCQlyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/CgkJCQlqUXVlcnkuc3R5bGUoIGVsZW0sIG5hbWUsIHZhbHVlICkgOgoJCQkJalF1ZXJ5LmNzcyggZWxlbSwgbmFtZSApOwoJCX0sIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApOwoJfSwKCXNob3c6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBzaG93SGlkZSggdGhpcywgdHJ1ZSApOwoJfSwKCWhpZGU6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBzaG93SGlkZSggdGhpcyApOwoJfSwKCXRvZ2dsZTogZnVuY3Rpb24oIHN0YXRlLCBmbjIgKSB7CgkJdmFyIGJvb2wgPSB0eXBlb2Ygc3RhdGUgPT09ICJib29sZWFuIjsKCgkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggc3RhdGUgKSAmJiBqUXVlcnkuaXNGdW5jdGlvbiggZm4yICkgKSB7CgkJCXJldHVybiBldmVudHNUb2dnbGUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoJCX0KCgkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJaWYgKCBib29sID8gc3RhdGUgOiBpc0hpZGRlbiggdGhpcyApICkgewoJCQkJalF1ZXJ5KCB0aGlzICkuc2hvdygpOwoJCQl9IGVsc2UgewoJCQkJalF1ZXJ5KCB0aGlzICkuaGlkZSgpOwoJCQl9CgkJfSk7Cgl9Cn0pOwoKalF1ZXJ5LmV4dGVuZCh7CgkvLyBBZGQgaW4gc3R5bGUgcHJvcGVydHkgaG9va3MgZm9yIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQKCS8vIGJlaGF2aW9yIG9mIGdldHRpbmcgYW5kIHNldHRpbmcgYSBzdHlsZSBwcm9wZXJ0eQoJY3NzSG9va3M6IHsKCQlvcGFjaXR5OiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCQkJaWYgKCBjb21wdXRlZCApIHsKCQkJCQkvLyBXZSBzaG91bGQgYWx3YXlzIGdldCBhIG51bWJlciBiYWNrIGZyb20gb3BhY2l0eQoJCQkJCXZhciByZXQgPSBjdXJDU1MoIGVsZW0sICJvcGFjaXR5IiApOwoJCQkJCXJldHVybiByZXQgPT09ICIiID8gIjEiIDogcmV0OwoKCQkJCX0KCQkJfQoJCX0KCX0sCgoJLy8gRXhjbHVkZSB0aGUgZm9sbG93aW5nIGNzcyBwcm9wZXJ0aWVzIHRvIGFkZCBweAoJY3NzTnVtYmVyOiB7CgkJImZpbGxPcGFjaXR5IjogdHJ1ZSwKCQkiZm9udFdlaWdodCI6IHRydWUsCgkJImxpbmVIZWlnaHQiOiB0cnVlLAoJCSJvcGFjaXR5IjogdHJ1ZSwKCQkib3JwaGFucyI6IHRydWUsCgkJIndpZG93cyI6IHRydWUsCgkJInpJbmRleCI6IHRydWUsCgkJInpvb20iOiB0cnVlCgl9LAoKCS8vIEFkZCBpbiBwcm9wZXJ0aWVzIHdob3NlIG5hbWVzIHlvdSB3aXNoIHRvIGZpeCBiZWZvcmUKCS8vIHNldHRpbmcgb3IgZ2V0dGluZyB0aGUgdmFsdWUKCWNzc1Byb3BzOiB7CgkJLy8gbm9ybWFsaXplIGZsb2F0IGNzcyBwcm9wZXJ0eQoJCSJmbG9hdCI6IGpRdWVyeS5zdXBwb3J0LmNzc0Zsb2F0ID8gImNzc0Zsb2F0IiA6ICJzdHlsZUZsb2F0IgoJfSwKCgkvLyBHZXQgYW5kIHNldCB0aGUgc3R5bGUgcHJvcGVydHkgb24gYSBET00gTm9kZQoJc3R5bGU6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSwgZXh0cmEgKSB7CgkJLy8gRG9uJ3Qgc2V0IHN0eWxlcyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzCgkJaWYgKCAhZWxlbSB8fCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggfHwgIWVsZW0uc3R5bGUgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZQoJCXZhciByZXQsIHR5cGUsIGhvb2tzLAoJCQlvcmlnTmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKSwKCQkJc3R5bGUgPSBlbGVtLnN0eWxlOwoKCQluYW1lID0galF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdIHx8ICggalF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdID0gdmVuZG9yUHJvcE5hbWUoIHN0eWxlLCBvcmlnTmFtZSApICk7CgoJCS8vIGdldHMgaG9vayBmb3IgdGhlIHByZWZpeGVkIHZlcnNpb24KCQkvLyBmb2xsb3dlZCBieSB0aGUgdW5wcmVmaXhlZCB2ZXJzaW9uCgkJaG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07CgoJCS8vIENoZWNrIGlmIHdlJ3JlIHNldHRpbmcgYSB2YWx1ZQoJCWlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKCQkJdHlwZSA9IHR5cGVvZiB2YWx1ZTsKCgkJCS8vIGNvbnZlcnQgcmVsYXRpdmUgbnVtYmVyIHN0cmluZ3MgKCs9IG9yIC09KSB0byByZWxhdGl2ZSBudW1iZXJzLiAjNzM0NQoJCQlpZiAoIHR5cGUgPT09ICJzdHJpbmciICYmIChyZXQgPSBycmVsTnVtLmV4ZWMoIHZhbHVlICkpICkgewoJCQkJdmFsdWUgPSAoIHJldFsxXSArIDEgKSAqIHJldFsyXSArIHBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoIGVsZW0sIG5hbWUgKSApOwoJCQkJLy8gRml4ZXMgYnVnICM5MjM3CgkJCQl0eXBlID0gIm51bWJlciI7CgkJCX0KCgkJCS8vIE1ha2Ugc3VyZSB0aGF0IE5hTiBhbmQgbnVsbCB2YWx1ZXMgYXJlbid0IHNldC4gU2VlOiAjNzExNgoJCQlpZiAoIHZhbHVlID09IG51bGwgfHwgdHlwZSA9PT0gIm51bWJlciIgJiYgaXNOYU4oIHZhbHVlICkgKSB7CgkJCQlyZXR1cm47CgkJCX0KCgkJCS8vIElmIGEgbnVtYmVyIHdhcyBwYXNzZWQgaW4sIGFkZCAncHgnIHRvIHRoZSAoZXhjZXB0IGZvciBjZXJ0YWluIENTUyBwcm9wZXJ0aWVzKQoJCQlpZiAoIHR5cGUgPT09ICJudW1iZXIiICYmICFqUXVlcnkuY3NzTnVtYmVyWyBvcmlnTmFtZSBdICkgewoJCQkJdmFsdWUgKz0gInB4IjsKCQkJfQoKCQkJLy8gSWYgYSBob29rIHdhcyBwcm92aWRlZCwgdXNlIHRoYXQgdmFsdWUsIG90aGVyd2lzZSBqdXN0IHNldCB0aGUgc3BlY2lmaWVkIHZhbHVlCgkJCWlmICggIWhvb2tzIHx8ICEoInNldCIgaW4gaG9va3MpIHx8ICh2YWx1ZSA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIGV4dHJhICkpICE9PSB1bmRlZmluZWQgKSB7CgkJCQkvLyBXcmFwcGVkIHRvIHByZXZlbnQgSUUgZnJvbSB0aHJvd2luZyBlcnJvcnMgd2hlbiAnaW52YWxpZCcgdmFsdWVzIGFyZSBwcm92aWRlZAoJCQkJLy8gRml4ZXMgYnVnICM1NTA5CgkJCQl0cnkgewoJCQkJCXN0eWxlWyBuYW1lIF0gPSB2YWx1ZTsKCQkJCX0gY2F0Y2goZSkge30KCQkJfQoKCQl9IGVsc2UgewoJCQkvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkIGdldCB0aGUgbm9uLWNvbXB1dGVkIHZhbHVlIGZyb20gdGhlcmUKCQkJaWYgKCBob29rcyAmJiAiZ2V0IiBpbiBob29rcyAmJiAocmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBmYWxzZSwgZXh0cmEgKSkgIT09IHVuZGVmaW5lZCApIHsKCQkJCXJldHVybiByZXQ7CgkJCX0KCgkJCS8vIE90aGVyd2lzZSBqdXN0IGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgc3R5bGUgb2JqZWN0CgkJCXJldHVybiBzdHlsZVsgbmFtZSBdOwoJCX0KCX0sCgoJY3NzOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgbnVtZXJpYywgZXh0cmEgKSB7CgkJdmFyIHZhbCwgbnVtLCBob29rcywKCQkJb3JpZ05hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lICk7CgoJCS8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZQoJCW5hbWUgPSBqUXVlcnkuY3NzUHJvcHNbIG9yaWdOYW1lIF0gfHwgKCBqUXVlcnkuY3NzUHJvcHNbIG9yaWdOYW1lIF0gPSB2ZW5kb3JQcm9wTmFtZSggZWxlbS5zdHlsZSwgb3JpZ05hbWUgKSApOwoKCQkvLyBnZXRzIGhvb2sgZm9yIHRoZSBwcmVmaXhlZCB2ZXJzaW9uCgkJLy8gZm9sbG93ZWQgYnkgdGhlIHVucHJlZml4ZWQgdmVyc2lvbgoJCWhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gfHwgalF1ZXJ5LmNzc0hvb2tzWyBvcmlnTmFtZSBdOwoKCQkvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkIGdldCB0aGUgY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZQoJCWlmICggaG9va3MgJiYgImdldCIgaW4gaG9va3MgKSB7CgkJCXZhbCA9IGhvb2tzLmdldCggZWxlbSwgdHJ1ZSwgZXh0cmEgKTsKCQl9CgoJCS8vIE90aGVyd2lzZSwgaWYgYSB3YXkgdG8gZ2V0IHRoZSBjb21wdXRlZCB2YWx1ZSBleGlzdHMsIHVzZSB0aGF0CgkJaWYgKCB2YWwgPT09IHVuZGVmaW5lZCApIHsKCQkJdmFsID0gY3VyQ1NTKCBlbGVtLCBuYW1lICk7CgkJfQoKCQkvL2NvbnZlcnQgIm5vcm1hbCIgdG8gY29tcHV0ZWQgdmFsdWUKCQlpZiAoIHZhbCA9PT0gIm5vcm1hbCIgJiYgbmFtZSBpbiBjc3NOb3JtYWxUcmFuc2Zvcm0gKSB7CgkJCXZhbCA9IGNzc05vcm1hbFRyYW5zZm9ybVsgbmFtZSBdOwoJCX0KCgkJLy8gUmV0dXJuLCBjb252ZXJ0aW5nIHRvIG51bWJlciBpZiBmb3JjZWQgb3IgYSBxdWFsaWZpZXIgd2FzIHByb3ZpZGVkIGFuZCB2YWwgbG9va3MgbnVtZXJpYwoJCWlmICggbnVtZXJpYyB8fCBleHRyYSAhPT0gdW5kZWZpbmVkICkgewoJCQludW0gPSBwYXJzZUZsb2F0KCB2YWwgKTsKCQkJcmV0dXJuIG51bWVyaWMgfHwgalF1ZXJ5LmlzTnVtZXJpYyggbnVtICkgPyBudW0gfHwgMCA6IHZhbDsKCQl9CgkJcmV0dXJuIHZhbDsKCX0sCgoJLy8gQSBtZXRob2QgZm9yIHF1aWNrbHkgc3dhcHBpbmcgaW4vb3V0IENTUyBwcm9wZXJ0aWVzIHRvIGdldCBjb3JyZWN0IGNhbGN1bGF0aW9ucwoJc3dhcDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIGNhbGxiYWNrICkgewoJCXZhciByZXQsIG5hbWUsCgkJCW9sZCA9IHt9OwoKCQkvLyBSZW1lbWJlciB0aGUgb2xkIHZhbHVlcywgYW5kIGluc2VydCB0aGUgbmV3IG9uZXMKCQlmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7CgkJCW9sZFsgbmFtZSBdID0gZWxlbS5zdHlsZVsgbmFtZSBdOwoJCQllbGVtLnN0eWxlWyBuYW1lIF0gPSBvcHRpb25zWyBuYW1lIF07CgkJfQoKCQlyZXQgPSBjYWxsYmFjay5jYWxsKCBlbGVtICk7CgoJCS8vIFJldmVydCB0aGUgb2xkIHZhbHVlcwoJCWZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHsKCQkJZWxlbS5zdHlsZVsgbmFtZSBdID0gb2xkWyBuYW1lIF07CgkJfQoKCQlyZXR1cm4gcmV0OwoJfQp9KTsKCi8vIE5PVEU6IFRvIGFueSBmdXR1cmUgbWFpbnRhaW5lciwgd2UndmUgd2luZG93LmdldENvbXB1dGVkU3R5bGUKLy8gYmVjYXVzZSBqc2RvbSBvbiBub2RlLmpzIHdpbGwgYnJlYWsgd2l0aG91dCBpdC4KaWYgKCB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSApIHsKCWN1ckNTUyA9IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewoJCXZhciByZXQsIHdpZHRoLCBtaW5XaWR0aCwgbWF4V2lkdGgsCgkJCWNvbXB1dGVkID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoIGVsZW0sIG51bGwgKSwKCQkJc3R5bGUgPSBlbGVtLnN0eWxlOwoKCQlpZiAoIGNvbXB1dGVkICkgewoKCQkJLy8gZ2V0UHJvcGVydHlWYWx1ZSBpcyBvbmx5IG5lZWRlZCBmb3IgLmNzcygnZmlsdGVyJykgaW4gSUU5LCBzZWUgIzEyNTM3CgkJCXJldCA9IGNvbXB1dGVkLmdldFByb3BlcnR5VmFsdWUoIG5hbWUgKSB8fCBjb21wdXRlZFsgbmFtZSBdOwoKCQkJaWYgKCByZXQgPT09ICIiICYmICFqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApICkgewoJCQkJcmV0ID0galF1ZXJ5LnN0eWxlKCBlbGVtLCBuYW1lICk7CgkJCX0KCgkJCS8vIEEgdHJpYnV0ZSB0byB0aGUgImF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHMiCgkJCS8vIENocm9tZSA8IDE3IGFuZCBTYWZhcmkgNS4wIHVzZXMgImNvbXB1dGVkIHZhbHVlIiBpbnN0ZWFkIG9mICJ1c2VkIHZhbHVlIiBmb3IgbWFyZ2luLXJpZ2h0CgkJCS8vIFNhZmFyaSA1LjEuNyAoYXQgbGVhc3QpIHJldHVybnMgcGVyY2VudGFnZSBmb3IgYSBsYXJnZXIgc2V0IG9mIHZhbHVlcywgYnV0IHdpZHRoIHNlZW1zIHRvIGJlIHJlbGlhYmx5IHBpeGVscwoJCQkvLyB0aGlzIGlzIGFnYWluc3QgdGhlIENTU09NIGRyYWZ0IHNwZWM6IGh0dHA6Ly9kZXYudzMub3JnL2Nzc3dnL2Nzc29tLyNyZXNvbHZlZC12YWx1ZXMKCQkJaWYgKCBybnVtbm9ucHgudGVzdCggcmV0ICkgJiYgcm1hcmdpbi50ZXN0KCBuYW1lICkgKSB7CgkJCQl3aWR0aCA9IHN0eWxlLndpZHRoOwoJCQkJbWluV2lkdGggPSBzdHlsZS5taW5XaWR0aDsKCQkJCW1heFdpZHRoID0gc3R5bGUubWF4V2lkdGg7CgoJCQkJc3R5bGUubWluV2lkdGggPSBzdHlsZS5tYXhXaWR0aCA9IHN0eWxlLndpZHRoID0gcmV0OwoJCQkJcmV0ID0gY29tcHV0ZWQud2lkdGg7CgoJCQkJc3R5bGUud2lkdGggPSB3aWR0aDsKCQkJCXN0eWxlLm1pbldpZHRoID0gbWluV2lkdGg7CgkJCQlzdHlsZS5tYXhXaWR0aCA9IG1heFdpZHRoOwoJCQl9CgkJfQoKCQlyZXR1cm4gcmV0OwoJfTsKfSBlbHNlIGlmICggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmN1cnJlbnRTdHlsZSApIHsKCWN1ckNTUyA9IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewoJCXZhciBsZWZ0LCByc0xlZnQsCgkJCXJldCA9IGVsZW0uY3VycmVudFN0eWxlICYmIGVsZW0uY3VycmVudFN0eWxlWyBuYW1lIF0sCgkJCXN0eWxlID0gZWxlbS5zdHlsZTsKCgkJLy8gQXZvaWQgc2V0dGluZyByZXQgdG8gZW1wdHkgc3RyaW5nIGhlcmUKCQkvLyBzbyB3ZSBkb24ndCBkZWZhdWx0IHRvIGF1dG8KCQlpZiAoIHJldCA9PSBudWxsICYmIHN0eWxlICYmIHN0eWxlWyBuYW1lIF0gKSB7CgkJCXJldCA9IHN0eWxlWyBuYW1lIF07CgkJfQoKCQkvLyBGcm9tIHRoZSBhd2Vzb21lIGhhY2sgYnkgRGVhbiBFZHdhcmRzCgkJLy8gaHR0cDovL2VyaWsuZWFlLm5ldC9hcmNoaXZlcy8yMDA3LzA3LzI3LzE4LjU0LjE1LyNjb21tZW50LTEwMjI5MQoKCQkvLyBJZiB3ZSdyZSBub3QgZGVhbGluZyB3aXRoIGEgcmVndWxhciBwaXhlbCBudW1iZXIKCQkvLyBidXQgYSBudW1iZXIgdGhhdCBoYXMgYSB3ZWlyZCBlbmRpbmcsIHdlIG5lZWQgdG8gY29udmVydCBpdCB0byBwaXhlbHMKCQkvLyBidXQgbm90IHBvc2l0aW9uIGNzcyBhdHRyaWJ1dGVzLCBhcyB0aG9zZSBhcmUgcHJvcG9ydGlvbmFsIHRvIHRoZSBwYXJlbnQgZWxlbWVudCBpbnN0ZWFkCgkJLy8gYW5kIHdlIGNhbid0IG1lYXN1cmUgdGhlIHBhcmVudCBpbnN0ZWFkIGJlY2F1c2UgaXQgbWlnaHQgdHJpZ2dlciBhICJzdGFja2luZyBkb2xscyIgcHJvYmxlbQoJCWlmICggcm51bW5vbnB4LnRlc3QoIHJldCApICYmICFycG9zaXRpb24udGVzdCggbmFtZSApICkgewoKCQkJLy8gUmVtZW1iZXIgdGhlIG9yaWdpbmFsIHZhbHVlcwoJCQlsZWZ0ID0gc3R5bGUubGVmdDsKCQkJcnNMZWZ0ID0gZWxlbS5ydW50aW1lU3R5bGUgJiYgZWxlbS5ydW50aW1lU3R5bGUubGVmdDsKCgkJCS8vIFB1dCBpbiB0aGUgbmV3IHZhbHVlcyB0byBnZXQgYSBjb21wdXRlZCB2YWx1ZSBvdXQKCQkJaWYgKCByc0xlZnQgKSB7CgkJCQllbGVtLnJ1bnRpbWVTdHlsZS5sZWZ0ID0gZWxlbS5jdXJyZW50U3R5bGUubGVmdDsKCQkJfQoJCQlzdHlsZS5sZWZ0ID0gbmFtZSA9PT0gImZvbnRTaXplIiA/ICIxZW0iIDogcmV0OwoJCQlyZXQgPSBzdHlsZS5waXhlbExlZnQgKyAicHgiOwoKCQkJLy8gUmV2ZXJ0IHRoZSBjaGFuZ2VkIHZhbHVlcwoJCQlzdHlsZS5sZWZ0ID0gbGVmdDsKCQkJaWYgKCByc0xlZnQgKSB7CgkJCQllbGVtLnJ1bnRpbWVTdHlsZS5sZWZ0ID0gcnNMZWZ0OwoJCQl9CgkJfQoKCQlyZXR1cm4gcmV0ID09PSAiIiA/ICJhdXRvIiA6IHJldDsKCX07Cn0KCmZ1bmN0aW9uIHNldFBvc2l0aXZlTnVtYmVyKCBlbGVtLCB2YWx1ZSwgc3VidHJhY3QgKSB7Cgl2YXIgbWF0Y2hlcyA9IHJudW1zcGxpdC5leGVjKCB2YWx1ZSApOwoJcmV0dXJuIG1hdGNoZXMgPwoJCQlNYXRoLm1heCggMCwgbWF0Y2hlc1sgMSBdIC0gKCBzdWJ0cmFjdCB8fCAwICkgKSArICggbWF0Y2hlc1sgMiBdIHx8ICJweCIgKSA6CgkJCXZhbHVlOwp9CgpmdW5jdGlvbiBhdWdtZW50V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwgZXh0cmEsIGlzQm9yZGVyQm94ICkgewoJdmFyIGkgPSBleHRyYSA9PT0gKCBpc0JvcmRlckJveCA/ICJib3JkZXIiIDogImNvbnRlbnQiICkgPwoJCS8vIElmIHdlIGFscmVhZHkgaGF2ZSB0aGUgcmlnaHQgbWVhc3VyZW1lbnQsIGF2b2lkIGF1Z21lbnRhdGlvbgoJCTQgOgoJCS8vIE90aGVyd2lzZSBpbml0aWFsaXplIGZvciBob3Jpem9udGFsIG9yIHZlcnRpY2FsIHByb3BlcnRpZXMKCQluYW1lID09PSAid2lkdGgiID8gMSA6IDAsCgoJCXZhbCA9IDA7CgoJZm9yICggOyBpIDwgNDsgaSArPSAyICkgewoJCS8vIGJvdGggYm94IG1vZGVscyBleGNsdWRlIG1hcmdpbiwgc28gYWRkIGl0IGlmIHdlIHdhbnQgaXQKCQlpZiAoIGV4dHJhID09PSAibWFyZ2luIiApIHsKCQkJLy8gd2UgdXNlIGpRdWVyeS5jc3MgaW5zdGVhZCBvZiBjdXJDU1MgaGVyZQoJCQkvLyBiZWNhdXNlIG9mIHRoZSByZWxpYWJsZU1hcmdpblJpZ2h0IENTUyBob29rIQoJCQl2YWwgKz0galF1ZXJ5LmNzcyggZWxlbSwgZXh0cmEgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSApOwoJCX0KCgkJLy8gRnJvbSB0aGlzIHBvaW50IG9uIHdlIHVzZSBjdXJDU1MgZm9yIG1heGltdW0gcGVyZm9ybWFuY2UgKHJlbGV2YW50IGluIGFuaW1hdGlvbnMpCgkJaWYgKCBpc0JvcmRlckJveCApIHsKCQkJLy8gYm9yZGVyLWJveCBpbmNsdWRlcyBwYWRkaW5nLCBzbyByZW1vdmUgaXQgaWYgd2Ugd2FudCBjb250ZW50CgkJCWlmICggZXh0cmEgPT09ICJjb250ZW50IiApIHsKCQkJCXZhbCAtPSBwYXJzZUZsb2F0KCBjdXJDU1MoIGVsZW0sICJwYWRkaW5nIiArIGNzc0V4cGFuZFsgaSBdICkgKSB8fCAwOwoJCQl9CgoJCQkvLyBhdCB0aGlzIHBvaW50LCBleHRyYSBpc24ndCBib3JkZXIgbm9yIG1hcmdpbiwgc28gcmVtb3ZlIGJvcmRlcgoJCQlpZiAoIGV4dHJhICE9PSAibWFyZ2luIiApIHsKCQkJCXZhbCAtPSBwYXJzZUZsb2F0KCBjdXJDU1MoIGVsZW0sICJib3JkZXIiICsgY3NzRXhwYW5kWyBpIF0gKyAiV2lkdGgiICkgKSB8fCAwOwoJCQl9CgkJfSBlbHNlIHsKCQkJLy8gYXQgdGhpcyBwb2ludCwgZXh0cmEgaXNuJ3QgY29udGVudCwgc28gYWRkIHBhZGRpbmcKCQkJdmFsICs9IHBhcnNlRmxvYXQoIGN1ckNTUyggZWxlbSwgInBhZGRpbmciICsgY3NzRXhwYW5kWyBpIF0gKSApIHx8IDA7CgoJCQkvLyBhdCB0aGlzIHBvaW50LCBleHRyYSBpc24ndCBjb250ZW50IG5vciBwYWRkaW5nLCBzbyBhZGQgYm9yZGVyCgkJCWlmICggZXh0cmEgIT09ICJwYWRkaW5nIiApIHsKCQkJCXZhbCArPSBwYXJzZUZsb2F0KCBjdXJDU1MoIGVsZW0sICJib3JkZXIiICsgY3NzRXhwYW5kWyBpIF0gKyAiV2lkdGgiICkgKSB8fCAwOwoJCQl9CgkJfQoJfQoKCXJldHVybiB2YWw7Cn0KCmZ1bmN0aW9uIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhICkgewoKCS8vIFN0YXJ0IHdpdGggb2Zmc2V0IHByb3BlcnR5LCB3aGljaCBpcyBlcXVpdmFsZW50IHRvIHRoZSBib3JkZXItYm94IHZhbHVlCgl2YXIgdmFsID0gbmFtZSA9PT0gIndpZHRoIiA/IGVsZW0ub2Zmc2V0V2lkdGggOiBlbGVtLm9mZnNldEhlaWdodCwKCQl2YWx1ZUlzQm9yZGVyQm94ID0gdHJ1ZSwKCQlpc0JvcmRlckJveCA9IGpRdWVyeS5zdXBwb3J0LmJveFNpemluZyAmJiBqUXVlcnkuY3NzKCBlbGVtLCAiYm94U2l6aW5nIiApID09PSAiYm9yZGVyLWJveCI7CgoJLy8gc29tZSBub24taHRtbCBlbGVtZW50cyByZXR1cm4gdW5kZWZpbmVkIGZvciBvZmZzZXRXaWR0aCwgc28gY2hlY2sgZm9yIG51bGwvdW5kZWZpbmVkCgkvLyBzdmcgLSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02NDkyODUKCS8vIE1hdGhNTCAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTQ5MTY2OAoJaWYgKCB2YWwgPD0gMCB8fCB2YWwgPT0gbnVsbCApIHsKCQkvLyBGYWxsIGJhY2sgdG8gY29tcHV0ZWQgdGhlbiB1bmNvbXB1dGVkIGNzcyBpZiBuZWNlc3NhcnkKCQl2YWwgPSBjdXJDU1MoIGVsZW0sIG5hbWUgKTsKCQlpZiAoIHZhbCA8IDAgfHwgdmFsID09IG51bGwgKSB7CgkJCXZhbCA9IGVsZW0uc3R5bGVbIG5hbWUgXTsKCQl9CgoJCS8vIENvbXB1dGVkIHVuaXQgaXMgbm90IHBpeGVscy4gU3RvcCBoZXJlIGFuZCByZXR1cm4uCgkJaWYgKCBybnVtbm9ucHgudGVzdCh2YWwpICkgewoJCQlyZXR1cm4gdmFsOwoJCX0KCgkJLy8gd2UgbmVlZCB0aGUgY2hlY2sgZm9yIHN0eWxlIGluIGNhc2UgYSBicm93c2VyIHdoaWNoIHJldHVybnMgdW5yZWxpYWJsZSB2YWx1ZXMKCQkvLyBmb3IgZ2V0Q29tcHV0ZWRTdHlsZSBzaWxlbnRseSBmYWxscyBiYWNrIHRvIHRoZSByZWxpYWJsZSBlbGVtLnN0eWxlCgkJdmFsdWVJc0JvcmRlckJveCA9IGlzQm9yZGVyQm94ICYmICggalF1ZXJ5LnN1cHBvcnQuYm94U2l6aW5nUmVsaWFibGUgfHwgdmFsID09PSBlbGVtLnN0eWxlWyBuYW1lIF0gKTsKCgkJLy8gTm9ybWFsaXplICIiLCBhdXRvLCBhbmQgcHJlcGFyZSBmb3IgZXh0cmEKCQl2YWwgPSBwYXJzZUZsb2F0KCB2YWwgKSB8fCAwOwoJfQoKCS8vIHVzZSB0aGUgYWN0aXZlIGJveC1zaXppbmcgbW9kZWwgdG8gYWRkL3N1YnRyYWN0IGlycmVsZXZhbnQgc3R5bGVzCglyZXR1cm4gKCB2YWwgKwoJCWF1Z21lbnRXaWR0aE9ySGVpZ2h0KAoJCQllbGVtLAoJCQluYW1lLAoJCQlleHRyYSB8fCAoIGlzQm9yZGVyQm94ID8gImJvcmRlciIgOiAiY29udGVudCIgKSwKCQkJdmFsdWVJc0JvcmRlckJveAoJCSkKCSkgKyAicHgiOwp9CgoKLy8gVHJ5IHRvIGRldGVybWluZSB0aGUgZGVmYXVsdCBkaXNwbGF5IHZhbHVlIG9mIGFuIGVsZW1lbnQKZnVuY3Rpb24gY3NzX2RlZmF1bHREaXNwbGF5KCBub2RlTmFtZSApIHsKCWlmICggZWxlbWRpc3BsYXlbIG5vZGVOYW1lIF0gKSB7CgkJcmV0dXJuIGVsZW1kaXNwbGF5WyBub2RlTmFtZSBdOwoJfQoKCXZhciBlbGVtID0galF1ZXJ5KCAiPCIgKyBub2RlTmFtZSArICI+IiApLmFwcGVuZFRvKCBkb2N1bWVudC5ib2R5ICksCgkJZGlzcGxheSA9IGVsZW0uY3NzKCJkaXNwbGF5Iik7CgllbGVtLnJlbW92ZSgpOwoKCS8vIElmIHRoZSBzaW1wbGUgd2F5IGZhaWxzLAoJLy8gZ2V0IGVsZW1lbnQncyByZWFsIGRlZmF1bHQgZGlzcGxheSBieSBhdHRhY2hpbmcgaXQgdG8gYSB0ZW1wIGlmcmFtZQoJaWYgKCBkaXNwbGF5ID09PSAibm9uZSIgfHwgZGlzcGxheSA9PT0gIiIgKSB7CgkJLy8gVXNlIHRoZSBhbHJlYWR5LWNyZWF0ZWQgaWZyYW1lIGlmIHBvc3NpYmxlCgkJaWZyYW1lID0gZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCgKCQkJaWZyYW1lIHx8IGpRdWVyeS5leHRlbmQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLCB7CgkJCQlmcmFtZUJvcmRlcjogMCwKCQkJCXdpZHRoOiAwLAoJCQkJaGVpZ2h0OiAwCgkJCX0pCgkJKTsKCgkJLy8gQ3JlYXRlIGEgY2FjaGVhYmxlIGNvcHkgb2YgdGhlIGlmcmFtZSBkb2N1bWVudCBvbiBmaXJzdCBjYWxsLgoJCS8vIElFIGFuZCBPcGVyYSB3aWxsIGFsbG93IHVzIHRvIHJldXNlIHRoZSBpZnJhbWVEb2Mgd2l0aG91dCByZS13cml0aW5nIHRoZSBmYWtlIEhUTUwKCQkvLyBkb2N1bWVudCB0byBpdDsgV2ViS2l0ICYgRmlyZWZveCB3b24ndCBhbGxvdyByZXVzaW5nIHRoZSBpZnJhbWUgZG9jdW1lbnQuCgkJaWYgKCAhaWZyYW1lRG9jIHx8ICFpZnJhbWUuY3JlYXRlRWxlbWVudCApIHsKCQkJaWZyYW1lRG9jID0gKCBpZnJhbWUuY29udGVudFdpbmRvdyB8fCBpZnJhbWUuY29udGVudERvY3VtZW50ICkuZG9jdW1lbnQ7CgkJCWlmcmFtZURvYy53cml0ZSgiPCFkb2N0eXBlIGh0bWw+PGh0bWw+PGJvZHk+Iik7CgkJCWlmcmFtZURvYy5jbG9zZSgpOwoJCX0KCgkJZWxlbSA9IGlmcmFtZURvYy5ib2R5LmFwcGVuZENoaWxkKCBpZnJhbWVEb2MuY3JlYXRlRWxlbWVudChub2RlTmFtZSkgKTsKCgkJZGlzcGxheSA9IGN1ckNTUyggZWxlbSwgImRpc3BsYXkiICk7CgkJZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCggaWZyYW1lICk7Cgl9CgoJLy8gU3RvcmUgdGhlIGNvcnJlY3QgZGVmYXVsdCBkaXNwbGF5CgllbGVtZGlzcGxheVsgbm9kZU5hbWUgXSA9IGRpc3BsYXk7CgoJcmV0dXJuIGRpc3BsYXk7Cn0KCmpRdWVyeS5lYWNoKFsgImhlaWdodCIsICJ3aWR0aCIgXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7CglqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSA9IHsKCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCwgZXh0cmEgKSB7CgkJCWlmICggY29tcHV0ZWQgKSB7CgkJCQkvLyBjZXJ0YWluIGVsZW1lbnRzIGNhbiBoYXZlIGRpbWVuc2lvbiBpbmZvIGlmIHdlIGludmlzaWJseSBzaG93IHRoZW0KCQkJCS8vIGhvd2V2ZXIsIGl0IG11c3QgaGF2ZSBhIGN1cnJlbnQgZGlzcGxheSBzdHlsZSB0aGF0IHdvdWxkIGJlbmVmaXQgZnJvbSB0aGlzCgkJCQlpZiAoIGVsZW0ub2Zmc2V0V2lkdGggPT09IDAgJiYgcmRpc3BsYXlzd2FwLnRlc3QoIGN1ckNTUyggZWxlbSwgImRpc3BsYXkiICkgKSApIHsKCQkJCQlyZXR1cm4galF1ZXJ5LnN3YXAoIGVsZW0sIGNzc1Nob3csIGZ1bmN0aW9uKCkgewoJCQkJCQlyZXR1cm4gZ2V0V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwgZXh0cmEgKTsKCQkJCQl9KTsKCQkJCX0gZWxzZSB7CgkJCQkJcmV0dXJuIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhICk7CgkJCQl9CgkJCX0KCQl9LAoKCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgZXh0cmEgKSB7CgkJCXJldHVybiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIGV4dHJhID8KCQkJCWF1Z21lbnRXaWR0aE9ySGVpZ2h0KAoJCQkJCWVsZW0sCgkJCQkJbmFtZSwKCQkJCQlleHRyYSwKCQkJCQlqUXVlcnkuc3VwcG9ydC5ib3hTaXppbmcgJiYgalF1ZXJ5LmNzcyggZWxlbSwgImJveFNpemluZyIgKSA9PT0gImJvcmRlci1ib3giCgkJCQkpIDogMAoJCQkpOwoJCX0KCX07Cn0pOwoKaWYgKCAhalF1ZXJ5LnN1cHBvcnQub3BhY2l0eSApIHsKCWpRdWVyeS5jc3NIb29rcy5vcGFjaXR5ID0gewoJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCQkvLyBJRSB1c2VzIGZpbHRlcnMgZm9yIG9wYWNpdHkKCQkJcmV0dXJuIHJvcGFjaXR5LnRlc3QoIChjb21wdXRlZCAmJiBlbGVtLmN1cnJlbnRTdHlsZSA/IGVsZW0uY3VycmVudFN0eWxlLmZpbHRlciA6IGVsZW0uc3R5bGUuZmlsdGVyKSB8fCAiIiApID8KCQkJCSggMC4wMSAqIHBhcnNlRmxvYXQoIFJlZ0V4cC4kMSApICkgKyAiIiA6CgkJCQljb21wdXRlZCA/ICIxIiA6ICIiOwoJCX0sCgoJCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgewoJCQl2YXIgc3R5bGUgPSBlbGVtLnN0eWxlLAoJCQkJY3VycmVudFN0eWxlID0gZWxlbS5jdXJyZW50U3R5bGUsCgkJCQlvcGFjaXR5ID0galF1ZXJ5LmlzTnVtZXJpYyggdmFsdWUgKSA/ICJhbHBoYShvcGFjaXR5PSIgKyB2YWx1ZSAqIDEwMCArICIpIiA6ICIiLAoJCQkJZmlsdGVyID0gY3VycmVudFN0eWxlICYmIGN1cnJlbnRTdHlsZS5maWx0ZXIgfHwgc3R5bGUuZmlsdGVyIHx8ICIiOwoKCQkJLy8gSUUgaGFzIHRyb3VibGUgd2l0aCBvcGFjaXR5IGlmIGl0IGRvZXMgbm90IGhhdmUgbGF5b3V0CgkJCS8vIEZvcmNlIGl0IGJ5IHNldHRpbmcgdGhlIHpvb20gbGV2ZWwKCQkJc3R5bGUuem9vbSA9IDE7CgoJCQkvLyBpZiBzZXR0aW5nIG9wYWNpdHkgdG8gMSwgYW5kIG5vIG90aGVyIGZpbHRlcnMgZXhpc3QgLSBhdHRlbXB0IHRvIHJlbW92ZSBmaWx0ZXIgYXR0cmlidXRlICM2NjUyCgkJCWlmICggdmFsdWUgPj0gMSAmJiBqUXVlcnkudHJpbSggZmlsdGVyLnJlcGxhY2UoIHJhbHBoYSwgIiIgKSApID09PSAiIiAmJgoJCQkJc3R5bGUucmVtb3ZlQXR0cmlidXRlICkgewoKCQkJCS8vIFNldHRpbmcgc3R5bGUuZmlsdGVyIHRvIG51bGwsICIiICYgIiAiIHN0aWxsIGxlYXZlICJmaWx0ZXI6IiBpbiB0aGUgY3NzVGV4dAoJCQkJLy8gaWYgImZpbHRlcjoiIGlzIHByZXNlbnQgYXQgYWxsLCBjbGVhclR5cGUgaXMgZGlzYWJsZWQsIHdlIHdhbnQgdG8gYXZvaWQgdGhpcwoJCQkJLy8gc3R5bGUucmVtb3ZlQXR0cmlidXRlIGlzIElFIE9ubHksIGJ1dCBzbyBhcHBhcmVudGx5IGlzIHRoaXMgY29kZSBwYXRoLi4uCgkJCQlzdHlsZS5yZW1vdmVBdHRyaWJ1dGUoICJmaWx0ZXIiICk7CgoJCQkJLy8gaWYgdGhlcmUgdGhlcmUgaXMgbm8gZmlsdGVyIHN0eWxlIGFwcGxpZWQgaW4gYSBjc3MgcnVsZSwgd2UgYXJlIGRvbmUKCQkJCWlmICggY3VycmVudFN0eWxlICYmICFjdXJyZW50U3R5bGUuZmlsdGVyICkgewoJCQkJCXJldHVybjsKCQkJCX0KCQkJfQoKCQkJLy8gb3RoZXJ3aXNlLCBzZXQgbmV3IGZpbHRlciB2YWx1ZXMKCQkJc3R5bGUuZmlsdGVyID0gcmFscGhhLnRlc3QoIGZpbHRlciApID8KCQkJCWZpbHRlci5yZXBsYWNlKCByYWxwaGEsIG9wYWNpdHkgKSA6CgkJCQlmaWx0ZXIgKyAiICIgKyBvcGFjaXR5OwoJCX0KCX07Cn0KCi8vIFRoZXNlIGhvb2tzIGNhbm5vdCBiZSBhZGRlZCB1bnRpbCBET00gcmVhZHkgYmVjYXVzZSB0aGUgc3VwcG9ydCB0ZXN0Ci8vIGZvciBpdCBpcyBub3QgcnVuIHVudGlsIGFmdGVyIERPTSByZWFkeQpqUXVlcnkoZnVuY3Rpb24oKSB7CglpZiAoICFqUXVlcnkuc3VwcG9ydC5yZWxpYWJsZU1hcmdpblJpZ2h0ICkgewoJCWpRdWVyeS5jc3NIb29rcy5tYXJnaW5SaWdodCA9IHsKCQkJZ2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7CgkJCQkvLyBXZWJLaXQgQnVnIDEzMzQzIC0gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5zIHdyb25nIHZhbHVlIGZvciBtYXJnaW4tcmlnaHQKCQkJCS8vIFdvcmsgYXJvdW5kIGJ5IHRlbXBvcmFyaWx5IHNldHRpbmcgZWxlbWVudCBkaXNwbGF5IHRvIGlubGluZS1ibG9jawoJCQkJcmV0dXJuIGpRdWVyeS5zd2FwKCBlbGVtLCB7ICJkaXNwbGF5IjogImlubGluZS1ibG9jayIgfSwgZnVuY3Rpb24oKSB7CgkJCQkJaWYgKCBjb21wdXRlZCApIHsKCQkJCQkJcmV0dXJuIGN1ckNTUyggZWxlbSwgIm1hcmdpblJpZ2h0IiApOwoJCQkJCX0KCQkJCX0pOwoJCQl9CgkJfTsKCX0KCgkvLyBXZWJraXQgYnVnOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjkwODQKCS8vIGdldENvbXB1dGVkU3R5bGUgcmV0dXJucyBwZXJjZW50IHdoZW4gc3BlY2lmaWVkIGZvciB0b3AvbGVmdC9ib3R0b20vcmlnaHQKCS8vIHJhdGhlciB0aGFuIG1ha2UgdGhlIGNzcyBtb2R1bGUgZGVwZW5kIG9uIHRoZSBvZmZzZXQgbW9kdWxlLCB3ZSBqdXN0IGNoZWNrIGZvciBpdCBoZXJlCglpZiAoICFqUXVlcnkuc3VwcG9ydC5waXhlbFBvc2l0aW9uICYmIGpRdWVyeS5mbi5wb3NpdGlvbiApIHsKCQlqUXVlcnkuZWFjaCggWyAidG9wIiwgImxlZnQiIF0sIGZ1bmN0aW9uKCBpLCBwcm9wICkgewoJCQlqUXVlcnkuY3NzSG9va3NbIHByb3AgXSA9IHsKCQkJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCQkJCWlmICggY29tcHV0ZWQgKSB7CgkJCQkJCXZhciByZXQgPSBjdXJDU1MoIGVsZW0sIHByb3AgKTsKCQkJCQkJLy8gaWYgY3VyQ1NTIHJldHVybnMgcGVyY2VudGFnZSwgZmFsbGJhY2sgdG8gb2Zmc2V0CgkJCQkJCXJldHVybiBybnVtbm9ucHgudGVzdCggcmV0ICkgPyBqUXVlcnkoIGVsZW0gKS5wb3NpdGlvbigpWyBwcm9wIF0gKyAicHgiIDogcmV0OwoJCQkJCX0KCQkJCX0KCQkJfTsKCQl9KTsKCX0KCn0pOwoKaWYgKCBqUXVlcnkuZXhwciAmJiBqUXVlcnkuZXhwci5maWx0ZXJzICkgewoJalF1ZXJ5LmV4cHIuZmlsdGVycy5oaWRkZW4gPSBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gKCBlbGVtLm9mZnNldFdpZHRoID09PSAwICYmIGVsZW0ub2Zmc2V0SGVpZ2h0ID09PSAwICkgfHwgKCFqUXVlcnkuc3VwcG9ydC5yZWxpYWJsZUhpZGRlbk9mZnNldHMgJiYgKChlbGVtLnN0eWxlICYmIGVsZW0uc3R5bGUuZGlzcGxheSkgfHwgY3VyQ1NTKCBlbGVtLCAiZGlzcGxheSIgKSkgPT09ICJub25lIik7Cgl9OwoKCWpRdWVyeS5leHByLmZpbHRlcnMudmlzaWJsZSA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiAhalF1ZXJ5LmV4cHIuZmlsdGVycy5oaWRkZW4oIGVsZW0gKTsKCX07Cn0KCi8vIFRoZXNlIGhvb2tzIGFyZSB1c2VkIGJ5IGFuaW1hdGUgdG8gZXhwYW5kIHByb3BlcnRpZXMKalF1ZXJ5LmVhY2goewoJbWFyZ2luOiAiIiwKCXBhZGRpbmc6ICIiLAoJYm9yZGVyOiAiV2lkdGgiCn0sIGZ1bmN0aW9uKCBwcmVmaXgsIHN1ZmZpeCApIHsKCWpRdWVyeS5jc3NIb29rc1sgcHJlZml4ICsgc3VmZml4IF0gPSB7CgkJZXhwYW5kOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJCXZhciBpLAoKCQkJCS8vIGFzc3VtZXMgYSBzaW5nbGUgbnVtYmVyIGlmIG5vdCBhIHN0cmluZwoJCQkJcGFydHMgPSB0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciID8gdmFsdWUuc3BsaXQoIiAiKSA6IFsgdmFsdWUgXSwKCQkJCWV4cGFuZGVkID0ge307CgoJCQlmb3IgKCBpID0gMDsgaSA8IDQ7IGkrKyApIHsKCQkJCWV4cGFuZGVkWyBwcmVmaXggKyBjc3NFeHBhbmRbIGkgXSArIHN1ZmZpeCBdID0KCQkJCQlwYXJ0c1sgaSBdIHx8IHBhcnRzWyBpIC0gMiBdIHx8IHBhcnRzWyAwIF07CgkJCX0KCgkJCXJldHVybiBleHBhbmRlZDsKCQl9Cgl9OwoKCWlmICggIXJtYXJnaW4udGVzdCggcHJlZml4ICkgKSB7CgkJalF1ZXJ5LmNzc0hvb2tzWyBwcmVmaXggKyBzdWZmaXggXS5zZXQgPSBzZXRQb3NpdGl2ZU51bWJlcjsKCX0KfSk7CnZhciByMjAgPSAvJTIwL2csCglyYnJhY2tldCA9IC9cW1xdJC8sCglyQ1JMRiA9IC9ccj9cbi9nLAoJcmlucHV0ID0gL14oPzpjb2xvcnxkYXRlfGRhdGV0aW1lfGRhdGV0aW1lLWxvY2FsfGVtYWlsfGhpZGRlbnxtb250aHxudW1iZXJ8cGFzc3dvcmR8cmFuZ2V8c2VhcmNofHRlbHx0ZXh0fHRpbWV8dXJsfHdlZWspJC9pLAoJcnNlbGVjdFRleHRhcmVhID0gL14oPzpzZWxlY3R8dGV4dGFyZWEpL2k7CgpqUXVlcnkuZm4uZXh0ZW5kKHsKCXNlcmlhbGl6ZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGpRdWVyeS5wYXJhbSggdGhpcy5zZXJpYWxpemVBcnJheSgpICk7Cgl9LAoJc2VyaWFsaXplQXJyYXk6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLm1hcChmdW5jdGlvbigpewoJCQlyZXR1cm4gdGhpcy5lbGVtZW50cyA/IGpRdWVyeS5tYWtlQXJyYXkoIHRoaXMuZWxlbWVudHMgKSA6IHRoaXM7CgkJfSkKCQkuZmlsdGVyKGZ1bmN0aW9uKCl7CgkJCXJldHVybiB0aGlzLm5hbWUgJiYgIXRoaXMuZGlzYWJsZWQgJiYKCQkJCSggdGhpcy5jaGVja2VkIHx8IHJzZWxlY3RUZXh0YXJlYS50ZXN0KCB0aGlzLm5vZGVOYW1lICkgfHwKCQkJCQlyaW5wdXQudGVzdCggdGhpcy50eXBlICkgKTsKCQl9KQoJCS5tYXAoZnVuY3Rpb24oIGksIGVsZW0gKXsKCQkJdmFyIHZhbCA9IGpRdWVyeSggdGhpcyApLnZhbCgpOwoKCQkJcmV0dXJuIHZhbCA9PSBudWxsID8KCQkJCW51bGwgOgoJCQkJalF1ZXJ5LmlzQXJyYXkoIHZhbCApID8KCQkJCQlqUXVlcnkubWFwKCB2YWwsIGZ1bmN0aW9uKCB2YWwsIGkgKXsKCQkJCQkJcmV0dXJuIHsgbmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsLnJlcGxhY2UoIHJDUkxGLCAiXHJcbiIgKSB9OwoJCQkJCX0pIDoKCQkJCQl7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgIlxyXG4iICkgfTsKCQl9KS5nZXQoKTsKCX0KfSk7CgovL1NlcmlhbGl6ZSBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzIG9yIGEgc2V0IG9mCi8va2V5L3ZhbHVlcyBpbnRvIGEgcXVlcnkgc3RyaW5nCmpRdWVyeS5wYXJhbSA9IGZ1bmN0aW9uKCBhLCB0cmFkaXRpb25hbCApIHsKCXZhciBwcmVmaXgsCgkJcyA9IFtdLAoJCWFkZCA9IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkgewoJCQkvLyBJZiB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBpbnZva2UgaXQgYW5kIHJldHVybiBpdHMgdmFsdWUKCQkJdmFsdWUgPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSA/IHZhbHVlKCkgOiAoIHZhbHVlID09IG51bGwgPyAiIiA6IHZhbHVlICk7CgkJCXNbIHMubGVuZ3RoIF0gPSBlbmNvZGVVUklDb21wb25lbnQoIGtleSApICsgIj0iICsgZW5jb2RlVVJJQ29tcG9uZW50KCB2YWx1ZSApOwoJCX07CgoJLy8gU2V0IHRyYWRpdGlvbmFsIHRvIHRydWUgZm9yIGpRdWVyeSA8PSAxLjMuMiBiZWhhdmlvci4KCWlmICggdHJhZGl0aW9uYWwgPT09IHVuZGVmaW5lZCApIHsKCQl0cmFkaXRpb25hbCA9IGpRdWVyeS5hamF4U2V0dGluZ3MgJiYgalF1ZXJ5LmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbDsKCX0KCgkvLyBJZiBhbiBhcnJheSB3YXMgcGFzc2VkIGluLCBhc3N1bWUgdGhhdCBpdCBpcyBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzLgoJaWYgKCBqUXVlcnkuaXNBcnJheSggYSApIHx8ICggYS5qcXVlcnkgJiYgIWpRdWVyeS5pc1BsYWluT2JqZWN0KCBhICkgKSApIHsKCQkvLyBTZXJpYWxpemUgdGhlIGZvcm0gZWxlbWVudHMKCQlqUXVlcnkuZWFjaCggYSwgZnVuY3Rpb24oKSB7CgkJCWFkZCggdGhpcy5uYW1lLCB0aGlzLnZhbHVlICk7CgkJfSk7CgoJfSBlbHNlIHsKCQkvLyBJZiB0cmFkaXRpb25hbCwgZW5jb2RlIHRoZSAib2xkIiB3YXkgKHRoZSB3YXkgMS4zLjIgb3Igb2xkZXIKCQkvLyBkaWQgaXQpLCBvdGhlcndpc2UgZW5jb2RlIHBhcmFtcyByZWN1cnNpdmVseS4KCQlmb3IgKCBwcmVmaXggaW4gYSApIHsKCQkJYnVpbGRQYXJhbXMoIHByZWZpeCwgYVsgcHJlZml4IF0sIHRyYWRpdGlvbmFsLCBhZGQgKTsKCQl9Cgl9CgoJLy8gUmV0dXJuIHRoZSByZXN1bHRpbmcgc2VyaWFsaXphdGlvbgoJcmV0dXJuIHMuam9pbiggIiYiICkucmVwbGFjZSggcjIwLCAiKyIgKTsKfTsKCmZ1bmN0aW9uIGJ1aWxkUGFyYW1zKCBwcmVmaXgsIG9iaiwgdHJhZGl0aW9uYWwsIGFkZCApIHsKCXZhciBuYW1lOwoKCWlmICggalF1ZXJ5LmlzQXJyYXkoIG9iaiApICkgewoJCS8vIFNlcmlhbGl6ZSBhcnJheSBpdGVtLgoJCWpRdWVyeS5lYWNoKCBvYmosIGZ1bmN0aW9uKCBpLCB2ICkgewoJCQlpZiAoIHRyYWRpdGlvbmFsIHx8IHJicmFja2V0LnRlc3QoIHByZWZpeCApICkgewoJCQkJLy8gVHJlYXQgZWFjaCBhcnJheSBpdGVtIGFzIGEgc2NhbGFyLgoJCQkJYWRkKCBwcmVmaXgsIHYgKTsKCgkJCX0gZWxzZSB7CgkJCQkvLyBJZiBhcnJheSBpdGVtIGlzIG5vbi1zY2FsYXIgKGFycmF5IG9yIG9iamVjdCksIGVuY29kZSBpdHMKCQkJCS8vIG51bWVyaWMgaW5kZXggdG8gcmVzb2x2ZSBkZXNlcmlhbGl6YXRpb24gYW1iaWd1aXR5IGlzc3Vlcy4KCQkJCS8vIE5vdGUgdGhhdCByYWNrIChhcyBvZiAxLjAuMCkgY2FuJ3QgY3VycmVudGx5IGRlc2VyaWFsaXplCgkJCQkvLyBuZXN0ZWQgYXJyYXlzIHByb3Blcmx5LCBhbmQgYXR0ZW1wdGluZyB0byBkbyBzbyBtYXkgY2F1c2UKCQkJCS8vIGEgc2VydmVyIGVycm9yLiBQb3NzaWJsZSBmaXhlcyBhcmUgdG8gbW9kaWZ5IHJhY2sncwoJCQkJLy8gZGVzZXJpYWxpemF0aW9uIGFsZ29yaXRobSBvciB0byBwcm92aWRlIGFuIG9wdGlvbiBvciBmbGFnCgkJCQkvLyB0byBmb3JjZSBhcnJheSBzZXJpYWxpemF0aW9uIHRvIGJlIHNoYWxsb3cuCgkJCQlidWlsZFBhcmFtcyggcHJlZml4ICsgIlsiICsgKCB0eXBlb2YgdiA9PT0gIm9iamVjdCIgPyBpIDogIiIgKSArICJdIiwgdiwgdHJhZGl0aW9uYWwsIGFkZCApOwoJCQl9CgkJfSk7CgoJfSBlbHNlIGlmICggIXRyYWRpdGlvbmFsICYmIGpRdWVyeS50eXBlKCBvYmogKSA9PT0gIm9iamVjdCIgKSB7CgkJLy8gU2VyaWFsaXplIG9iamVjdCBpdGVtLgoJCWZvciAoIG5hbWUgaW4gb2JqICkgewoJCQlidWlsZFBhcmFtcyggcHJlZml4ICsgIlsiICsgbmFtZSArICJdIiwgb2JqWyBuYW1lIF0sIHRyYWRpdGlvbmFsLCBhZGQgKTsKCQl9CgoJfSBlbHNlIHsKCQkvLyBTZXJpYWxpemUgc2NhbGFyIGl0ZW0uCgkJYWRkKCBwcmVmaXgsIG9iaiApOwoJfQp9CnZhcgoJLy8gRG9jdW1lbnQgbG9jYXRpb24KCWFqYXhMb2NQYXJ0cywKCWFqYXhMb2NhdGlvbiwKCglyaGFzaCA9IC8jLiokLywKCXJoZWFkZXJzID0gL14oLio/KTpbIFx0XSooW15cclxuXSopXHI/JC9tZywgLy8gSUUgbGVhdmVzIGFuIFxyIGNoYXJhY3RlciBhdCBFT0wKCS8vICM3NjUzLCAjODEyNSwgIzgxNTI6IGxvY2FsIHByb3RvY29sIGRldGVjdGlvbgoJcmxvY2FsUHJvdG9jb2wgPSAvXig/OmFib3V0fGFwcHxhcHBcLXN0b3JhZ2V8LitcLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLAoJcm5vQ29udGVudCA9IC9eKD86R0VUfEhFQUQpJC8sCglycHJvdG9jb2wgPSAvXlwvXC8vLAoJcnF1ZXJ5ID0gL1w/LywKCXJzY3JpcHQgPSAvPHNjcmlwdFxiW148XSooPzooPyE8XC9zY3JpcHQ+KTxbXjxdKikqPFwvc2NyaXB0Pi9naSwKCXJ0cyA9IC8oWz8mXSlfPVteJl0qLywKCXJ1cmwgPSAvXihbXHdcK1wuXC1dKzopKD86XC9cLyhbXlwvPyM6XSopKD86OihcZCspfCl8KS8sCgoJLy8gS2VlcCBhIGNvcHkgb2YgdGhlIG9sZCBsb2FkIG1ldGhvZAoJX2xvYWQgPSBqUXVlcnkuZm4ubG9hZCwKCgkvKiBQcmVmaWx0ZXJzCgkgKiAxKSBUaGV5IGFyZSB1c2VmdWwgdG8gaW50cm9kdWNlIGN1c3RvbSBkYXRhVHlwZXMgKHNlZSBhamF4L2pzb25wLmpzIGZvciBhbiBleGFtcGxlKQoJICogMikgVGhlc2UgYXJlIGNhbGxlZDoKCSAqICAgIC0gQkVGT1JFIGFza2luZyBmb3IgYSB0cmFuc3BvcnQKCSAqICAgIC0gQUZURVIgcGFyYW0gc2VyaWFsaXphdGlvbiAocy5kYXRhIGlzIGEgc3RyaW5nIGlmIHMucHJvY2Vzc0RhdGEgaXMgdHJ1ZSkKCSAqIDMpIGtleSBpcyB0aGUgZGF0YVR5cGUKCSAqIDQpIHRoZSBjYXRjaGFsbCBzeW1ib2wgIioiIGNhbiBiZSB1c2VkCgkgKiA1KSBleGVjdXRpb24gd2lsbCBzdGFydCB3aXRoIHRyYW5zcG9ydCBkYXRhVHlwZSBhbmQgVEhFTiBjb250aW51ZSBkb3duIHRvICIqIiBpZiBuZWVkZWQKCSAqLwoJcHJlZmlsdGVycyA9IHt9LAoKCS8qIFRyYW5zcG9ydHMgYmluZGluZ3MKCSAqIDEpIGtleSBpcyB0aGUgZGF0YVR5cGUKCSAqIDIpIHRoZSBjYXRjaGFsbCBzeW1ib2wgIioiIGNhbiBiZSB1c2VkCgkgKiAzKSBzZWxlY3Rpb24gd2lsbCBzdGFydCB3aXRoIHRyYW5zcG9ydCBkYXRhVHlwZSBhbmQgVEhFTiBnbyB0byAiKiIgaWYgbmVlZGVkCgkgKi8KCXRyYW5zcG9ydHMgPSB7fSwKCgkvLyBBdm9pZCBjb21tZW50LXByb2xvZyBjaGFyIHNlcXVlbmNlICgjMTAwOTgpOyBtdXN0IGFwcGVhc2UgbGludCBhbmQgZXZhZGUgY29tcHJlc3Npb24KCWFsbFR5cGVzID0gWyIqLyJdICsgWyIqIl07CgovLyAjODEzOCwgSUUgbWF5IHRocm93IGFuIGV4Y2VwdGlvbiB3aGVuIGFjY2Vzc2luZwovLyBhIGZpZWxkIGZyb20gd2luZG93LmxvY2F0aW9uIGlmIGRvY3VtZW50LmRvbWFpbiBoYXMgYmVlbiBzZXQKdHJ5IHsKCWFqYXhMb2NhdGlvbiA9IGxvY2F0aW9uLmhyZWY7Cn0gY2F0Y2goIGUgKSB7CgkvLyBVc2UgdGhlIGhyZWYgYXR0cmlidXRlIG9mIGFuIEEgZWxlbWVudAoJLy8gc2luY2UgSUUgd2lsbCBtb2RpZnkgaXQgZ2l2ZW4gZG9jdW1lbnQubG9jYXRpb24KCWFqYXhMb2NhdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJhIiApOwoJYWpheExvY2F0aW9uLmhyZWYgPSAiIjsKCWFqYXhMb2NhdGlvbiA9IGFqYXhMb2NhdGlvbi5ocmVmOwp9CgovLyBTZWdtZW50IGxvY2F0aW9uIGludG8gcGFydHMKYWpheExvY1BhcnRzID0gcnVybC5leGVjKCBhamF4TG9jYXRpb24udG9Mb3dlckNhc2UoKSApIHx8IFtdOwoKLy8gQmFzZSAiY29uc3RydWN0b3IiIGZvciBqUXVlcnkuYWpheFByZWZpbHRlciBhbmQgalF1ZXJ5LmFqYXhUcmFuc3BvcnQKZnVuY3Rpb24gYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7CgoJLy8gZGF0YVR5cGVFeHByZXNzaW9uIGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byAiKiIKCXJldHVybiBmdW5jdGlvbiggZGF0YVR5cGVFeHByZXNzaW9uLCBmdW5jICkgewoKCQlpZiAoIHR5cGVvZiBkYXRhVHlwZUV4cHJlc3Npb24gIT09ICJzdHJpbmciICkgewoJCQlmdW5jID0gZGF0YVR5cGVFeHByZXNzaW9uOwoJCQlkYXRhVHlwZUV4cHJlc3Npb24gPSAiKiI7CgkJfQoKCQl2YXIgZGF0YVR5cGUsIGxpc3QsIHBsYWNlQmVmb3JlLAoJCQlkYXRhVHlwZXMgPSBkYXRhVHlwZUV4cHJlc3Npb24udG9Mb3dlckNhc2UoKS5zcGxpdCggY29yZV9yc3BhY2UgKSwKCQkJaSA9IDAsCgkJCWxlbmd0aCA9IGRhdGFUeXBlcy5sZW5ndGg7CgoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGZ1bmMgKSApIHsKCQkJLy8gRm9yIGVhY2ggZGF0YVR5cGUgaW4gdGhlIGRhdGFUeXBlRXhwcmVzc2lvbgoJCQlmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKCQkJCWRhdGFUeXBlID0gZGF0YVR5cGVzWyBpIF07CgkJCQkvLyBXZSBjb250cm9sIGlmIHdlJ3JlIGFza2VkIHRvIGFkZCBiZWZvcmUKCQkJCS8vIGFueSBleGlzdGluZyBlbGVtZW50CgkJCQlwbGFjZUJlZm9yZSA9IC9eXCsvLnRlc3QoIGRhdGFUeXBlICk7CgkJCQlpZiAoIHBsYWNlQmVmb3JlICkgewoJCQkJCWRhdGFUeXBlID0gZGF0YVR5cGUuc3Vic3RyKCAxICkgfHwgIioiOwoJCQkJfQoJCQkJbGlzdCA9IHN0cnVjdHVyZVsgZGF0YVR5cGUgXSA9IHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXTsKCQkJCS8vIHRoZW4gd2UgYWRkIHRvIHRoZSBzdHJ1Y3R1cmUgYWNjb3JkaW5nbHkKCQkJCWxpc3RbIHBsYWNlQmVmb3JlID8gInVuc2hpZnQiIDogInB1c2giIF0oIGZ1bmMgKTsKCQkJfQoJCX0KCX07Cn0KCi8vIEJhc2UgaW5zcGVjdGlvbiBmdW5jdGlvbiBmb3IgcHJlZmlsdGVycyBhbmQgdHJhbnNwb3J0cwpmdW5jdGlvbiBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggc3RydWN0dXJlLCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSLAoJCWRhdGFUeXBlIC8qIGludGVybmFsICovLCBpbnNwZWN0ZWQgLyogaW50ZXJuYWwgKi8gKSB7CgoJZGF0YVR5cGUgPSBkYXRhVHlwZSB8fCBvcHRpb25zLmRhdGFUeXBlc1sgMCBdOwoJaW5zcGVjdGVkID0gaW5zcGVjdGVkIHx8IHt9OwoKCWluc3BlY3RlZFsgZGF0YVR5cGUgXSA9IHRydWU7CgoJdmFyIHNlbGVjdGlvbiwKCQlsaXN0ID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdLAoJCWkgPSAwLAoJCWxlbmd0aCA9IGxpc3QgPyBsaXN0Lmxlbmd0aCA6IDAsCgkJZXhlY3V0ZU9ubHkgPSAoIHN0cnVjdHVyZSA9PT0gcHJlZmlsdGVycyApOwoKCWZvciAoIDsgaSA8IGxlbmd0aCAmJiAoIGV4ZWN1dGVPbmx5IHx8ICFzZWxlY3Rpb24gKTsgaSsrICkgewoJCXNlbGVjdGlvbiA9IGxpc3RbIGkgXSggb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiApOwoJCS8vIElmIHdlIGdvdCByZWRpcmVjdGVkIHRvIGFub3RoZXIgZGF0YVR5cGUKCQkvLyB3ZSB0cnkgdGhlcmUgaWYgZXhlY3V0aW5nIG9ubHkgYW5kIG5vdCBkb25lIGFscmVhZHkKCQlpZiAoIHR5cGVvZiBzZWxlY3Rpb24gPT09ICJzdHJpbmciICkgewoJCQlpZiAoICFleGVjdXRlT25seSB8fCBpbnNwZWN0ZWRbIHNlbGVjdGlvbiBdICkgewoJCQkJc2VsZWN0aW9uID0gdW5kZWZpbmVkOwoJCQl9IGVsc2UgewoJCQkJb3B0aW9ucy5kYXRhVHlwZXMudW5zaGlmdCggc2VsZWN0aW9uICk7CgkJCQlzZWxlY3Rpb24gPSBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cygKCQkJCQkJc3RydWN0dXJlLCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSLCBzZWxlY3Rpb24sIGluc3BlY3RlZCApOwoJCQl9CgkJfQoJfQoJLy8gSWYgd2UncmUgb25seSBleGVjdXRpbmcgb3Igbm90aGluZyB3YXMgc2VsZWN0ZWQKCS8vIHdlIHRyeSB0aGUgY2F0Y2hhbGwgZGF0YVR5cGUgaWYgbm90IGRvbmUgYWxyZWFkeQoJaWYgKCAoIGV4ZWN1dGVPbmx5IHx8ICFzZWxlY3Rpb24gKSAmJiAhaW5zcGVjdGVkWyAiKiIgXSApIHsKCQlzZWxlY3Rpb24gPSBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cygKCQkJCXN0cnVjdHVyZSwgb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiwgIioiLCBpbnNwZWN0ZWQgKTsKCX0KCS8vIHVubmVjZXNzYXJ5IHdoZW4gb25seSBleGVjdXRpbmcgKHByZWZpbHRlcnMpCgkvLyBidXQgaXQnbGwgYmUgaWdub3JlZCBieSB0aGUgY2FsbGVyIGluIHRoYXQgY2FzZQoJcmV0dXJuIHNlbGVjdGlvbjsKfQoKLy8gQSBzcGVjaWFsIGV4dGVuZCBmb3IgYWpheCBvcHRpb25zCi8vIHRoYXQgdGFrZXMgImZsYXQiIG9wdGlvbnMgKG5vdCB0byBiZSBkZWVwIGV4dGVuZGVkKQovLyBGaXhlcyAjOTg4NwpmdW5jdGlvbiBhamF4RXh0ZW5kKCB0YXJnZXQsIHNyYyApIHsKCXZhciBrZXksIGRlZXAsCgkJZmxhdE9wdGlvbnMgPSBqUXVlcnkuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zIHx8IHt9OwoJZm9yICgga2V5IGluIHNyYyApIHsKCQlpZiAoIHNyY1sga2V5IF0gIT09IHVuZGVmaW5lZCApIHsKCQkJKCBmbGF0T3B0aW9uc1sga2V5IF0gPyB0YXJnZXQgOiAoIGRlZXAgfHwgKCBkZWVwID0ge30gKSApIClbIGtleSBdID0gc3JjWyBrZXkgXTsKCQl9Cgl9CglpZiAoIGRlZXAgKSB7CgkJalF1ZXJ5LmV4dGVuZCggdHJ1ZSwgdGFyZ2V0LCBkZWVwICk7Cgl9Cn0KCmpRdWVyeS5mbi5sb2FkID0gZnVuY3Rpb24oIHVybCwgcGFyYW1zLCBjYWxsYmFjayApIHsKCWlmICggdHlwZW9mIHVybCAhPT0gInN0cmluZyIgJiYgX2xvYWQgKSB7CgkJcmV0dXJuIF9sb2FkLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCX0KCgkvLyBEb24ndCBkbyBhIHJlcXVlc3QgaWYgbm8gZWxlbWVudHMgYXJlIGJlaW5nIHJlcXVlc3RlZAoJaWYgKCAhdGhpcy5sZW5ndGggKSB7CgkJcmV0dXJuIHRoaXM7Cgl9CgoJdmFyIHNlbGVjdG9yLCB0eXBlLCByZXNwb25zZSwKCQlzZWxmID0gdGhpcywKCQlvZmYgPSB1cmwuaW5kZXhPZigiICIpOwoKCWlmICggb2ZmID49IDAgKSB7CgkJc2VsZWN0b3IgPSB1cmwuc2xpY2UoIG9mZiwgdXJsLmxlbmd0aCApOwoJCXVybCA9IHVybC5zbGljZSggMCwgb2ZmICk7Cgl9CgoJLy8gSWYgaXQncyBhIGZ1bmN0aW9uCglpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBwYXJhbXMgKSApIHsKCgkJLy8gV2UgYXNzdW1lIHRoYXQgaXQncyB0aGUgY2FsbGJhY2sKCQljYWxsYmFjayA9IHBhcmFtczsKCQlwYXJhbXMgPSB1bmRlZmluZWQ7CgoJLy8gT3RoZXJ3aXNlLCBidWlsZCBhIHBhcmFtIHN0cmluZwoJfSBlbHNlIGlmICggcGFyYW1zICYmIHR5cGVvZiBwYXJhbXMgPT09ICJvYmplY3QiICkgewoJCXR5cGUgPSAiUE9TVCI7Cgl9CgoJLy8gUmVxdWVzdCB0aGUgcmVtb3RlIGRvY3VtZW50CglqUXVlcnkuYWpheCh7CgkJdXJsOiB1cmwsCgoJCS8vIGlmICJ0eXBlIiB2YXJpYWJsZSBpcyB1bmRlZmluZWQsIHRoZW4gIkdFVCIgbWV0aG9kIHdpbGwgYmUgdXNlZAoJCXR5cGU6IHR5cGUsCgkJZGF0YVR5cGU6ICJodG1sIiwKCQlkYXRhOiBwYXJhbXMsCgkJY29tcGxldGU6IGZ1bmN0aW9uKCBqcVhIUiwgc3RhdHVzICkgewoJCQlpZiAoIGNhbGxiYWNrICkgewoJCQkJc2VsZi5lYWNoKCBjYWxsYmFjaywgcmVzcG9uc2UgfHwgWyBqcVhIUi5yZXNwb25zZVRleHQsIHN0YXR1cywganFYSFIgXSApOwoJCQl9CgkJfQoJfSkuZG9uZShmdW5jdGlvbiggcmVzcG9uc2VUZXh0ICkgewoKCQkvLyBTYXZlIHJlc3BvbnNlIGZvciB1c2UgaW4gY29tcGxldGUgY2FsbGJhY2sKCQlyZXNwb25zZSA9IGFyZ3VtZW50czsKCgkJLy8gU2VlIGlmIGEgc2VsZWN0b3Igd2FzIHNwZWNpZmllZAoJCXNlbGYuaHRtbCggc2VsZWN0b3IgPwoKCQkJLy8gQ3JlYXRlIGEgZHVtbXkgZGl2IHRvIGhvbGQgdGhlIHJlc3VsdHMKCQkJalF1ZXJ5KCI8ZGl2PiIpCgoJCQkJLy8gaW5qZWN0IHRoZSBjb250ZW50cyBvZiB0aGUgZG9jdW1lbnQgaW4sIHJlbW92aW5nIHRoZSBzY3JpcHRzCgkJCQkvLyB0byBhdm9pZCBhbnkgJ1Blcm1pc3Npb24gRGVuaWVkJyBlcnJvcnMgaW4gSUUKCQkJCS5hcHBlbmQoIHJlc3BvbnNlVGV4dC5yZXBsYWNlKCByc2NyaXB0LCAiIiApICkKCgkJCQkvLyBMb2NhdGUgdGhlIHNwZWNpZmllZCBlbGVtZW50cwoJCQkJLmZpbmQoIHNlbGVjdG9yICkgOgoKCQkJLy8gSWYgbm90LCBqdXN0IGluamVjdCB0aGUgZnVsbCByZXN1bHQKCQkJcmVzcG9uc2VUZXh0ICk7CgoJfSk7CgoJcmV0dXJuIHRoaXM7Cn07CgovLyBBdHRhY2ggYSBidW5jaCBvZiBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIGNvbW1vbiBBSkFYIGV2ZW50cwpqUXVlcnkuZWFjaCggImFqYXhTdGFydCBhamF4U3RvcCBhamF4Q29tcGxldGUgYWpheEVycm9yIGFqYXhTdWNjZXNzIGFqYXhTZW5kIi5zcGxpdCggIiAiICksIGZ1bmN0aW9uKCBpLCBvICl7CglqUXVlcnkuZm5bIG8gXSA9IGZ1bmN0aW9uKCBmICl7CgkJcmV0dXJuIHRoaXMub24oIG8sIGYgKTsKCX07Cn0pOwoKalF1ZXJ5LmVhY2goIFsgImdldCIsICJwb3N0IiBdLCBmdW5jdGlvbiggaSwgbWV0aG9kICkgewoJalF1ZXJ5WyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrLCB0eXBlICkgewoJCS8vIHNoaWZ0IGFyZ3VtZW50cyBpZiBkYXRhIGFyZ3VtZW50IHdhcyBvbWl0dGVkCgkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZGF0YSApICkgewoJCQl0eXBlID0gdHlwZSB8fCBjYWxsYmFjazsKCQkJY2FsbGJhY2sgPSBkYXRhOwoJCQlkYXRhID0gdW5kZWZpbmVkOwoJCX0KCgkJcmV0dXJuIGpRdWVyeS5hamF4KHsKCQkJdHlwZTogbWV0aG9kLAoJCQl1cmw6IHVybCwKCQkJZGF0YTogZGF0YSwKCQkJc3VjY2VzczogY2FsbGJhY2ssCgkJCWRhdGFUeXBlOiB0eXBlCgkJfSk7Cgl9Owp9KTsKCmpRdWVyeS5leHRlbmQoewoKCWdldFNjcmlwdDogZnVuY3Rpb24oIHVybCwgY2FsbGJhY2sgKSB7CgkJcmV0dXJuIGpRdWVyeS5nZXQoIHVybCwgdW5kZWZpbmVkLCBjYWxsYmFjaywgInNjcmlwdCIgKTsKCX0sCgoJZ2V0SlNPTjogZnVuY3Rpb24oIHVybCwgZGF0YSwgY2FsbGJhY2sgKSB7CgkJcmV0dXJuIGpRdWVyeS5nZXQoIHVybCwgZGF0YSwgY2FsbGJhY2ssICJqc29uIiApOwoJfSwKCgkvLyBDcmVhdGVzIGEgZnVsbCBmbGVkZ2VkIHNldHRpbmdzIG9iamVjdCBpbnRvIHRhcmdldAoJLy8gd2l0aCBib3RoIGFqYXhTZXR0aW5ncyBhbmQgc2V0dGluZ3MgZmllbGRzLgoJLy8gSWYgdGFyZ2V0IGlzIG9taXR0ZWQsIHdyaXRlcyBpbnRvIGFqYXhTZXR0aW5ncy4KCWFqYXhTZXR1cDogZnVuY3Rpb24oIHRhcmdldCwgc2V0dGluZ3MgKSB7CgkJaWYgKCBzZXR0aW5ncyApIHsKCQkJLy8gQnVpbGRpbmcgYSBzZXR0aW5ncyBvYmplY3QKCQkJYWpheEV4dGVuZCggdGFyZ2V0LCBqUXVlcnkuYWpheFNldHRpbmdzICk7CgkJfSBlbHNlIHsKCQkJLy8gRXh0ZW5kaW5nIGFqYXhTZXR0aW5ncwoJCQlzZXR0aW5ncyA9IHRhcmdldDsKCQkJdGFyZ2V0ID0galF1ZXJ5LmFqYXhTZXR0aW5nczsKCQl9CgkJYWpheEV4dGVuZCggdGFyZ2V0LCBzZXR0aW5ncyApOwoJCXJldHVybiB0YXJnZXQ7Cgl9LAoKCWFqYXhTZXR0aW5nczogewoJCXVybDogYWpheExvY2F0aW9uLAoJCWlzTG9jYWw6IHJsb2NhbFByb3RvY29sLnRlc3QoIGFqYXhMb2NQYXJ0c1sgMSBdICksCgkJZ2xvYmFsOiB0cnVlLAoJCXR5cGU6ICJHRVQiLAoJCWNvbnRlbnRUeXBlOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IiwKCQlwcm9jZXNzRGF0YTogdHJ1ZSwKCQlhc3luYzogdHJ1ZSwKCQkvKgoJCXRpbWVvdXQ6IDAsCgkJZGF0YTogbnVsbCwKCQlkYXRhVHlwZTogbnVsbCwKCQl1c2VybmFtZTogbnVsbCwKCQlwYXNzd29yZDogbnVsbCwKCQljYWNoZTogbnVsbCwKCQl0aHJvd3M6IGZhbHNlLAoJCXRyYWRpdGlvbmFsOiBmYWxzZSwKCQloZWFkZXJzOiB7fSwKCQkqLwoKCQlhY2NlcHRzOiB7CgkJCXhtbDogImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLAoJCQlodG1sOiAidGV4dC9odG1sIiwKCQkJdGV4dDogInRleHQvcGxhaW4iLAoJCQlqc29uOiAiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0IiwKCQkJIioiOiBhbGxUeXBlcwoJCX0sCgoJCWNvbnRlbnRzOiB7CgkJCXhtbDogL3htbC8sCgkJCWh0bWw6IC9odG1sLywKCQkJanNvbjogL2pzb24vCgkJfSwKCgkJcmVzcG9uc2VGaWVsZHM6IHsKCQkJeG1sOiAicmVzcG9uc2VYTUwiLAoJCQl0ZXh0OiAicmVzcG9uc2VUZXh0IgoJCX0sCgoJCS8vIExpc3Qgb2YgZGF0YSBjb252ZXJ0ZXJzCgkJLy8gMSkga2V5IGZvcm1hdCBpcyAic291cmNlX3R5cGUgZGVzdGluYXRpb25fdHlwZSIgKGEgc2luZ2xlIHNwYWNlIGluLWJldHdlZW4pCgkJLy8gMikgdGhlIGNhdGNoYWxsIHN5bWJvbCAiKiIgY2FuIGJlIHVzZWQgZm9yIHNvdXJjZV90eXBlCgkJY29udmVydGVyczogewoKCQkJLy8gQ29udmVydCBhbnl0aGluZyB0byB0ZXh0CgkJCSIqIHRleHQiOiB3aW5kb3cuU3RyaW5nLAoKCQkJLy8gVGV4dCB0byBodG1sICh0cnVlID0gbm8gdHJhbnNmb3JtYXRpb24pCgkJCSJ0ZXh0IGh0bWwiOiB0cnVlLAoKCQkJLy8gRXZhbHVhdGUgdGV4dCBhcyBhIGpzb24gZXhwcmVzc2lvbgoJCQkidGV4dCBqc29uIjogalF1ZXJ5LnBhcnNlSlNPTiwKCgkJCS8vIFBhcnNlIHRleHQgYXMgeG1sCgkJCSJ0ZXh0IHhtbCI6IGpRdWVyeS5wYXJzZVhNTAoJCX0sCgoJCS8vIEZvciBvcHRpb25zIHRoYXQgc2hvdWxkbid0IGJlIGRlZXAgZXh0ZW5kZWQ6CgkJLy8geW91IGNhbiBhZGQgeW91ciBvd24gY3VzdG9tIG9wdGlvbnMgaGVyZSBpZgoJCS8vIGFuZCB3aGVuIHlvdSBjcmVhdGUgb25lIHRoYXQgc2hvdWxkbid0IGJlCgkJLy8gZGVlcCBleHRlbmRlZCAoc2VlIGFqYXhFeHRlbmQpCgkJZmxhdE9wdGlvbnM6IHsKCQkJY29udGV4dDogdHJ1ZSwKCQkJdXJsOiB0cnVlCgkJfQoJfSwKCglhamF4UHJlZmlsdGVyOiBhZGRUb1ByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHByZWZpbHRlcnMgKSwKCWFqYXhUcmFuc3BvcnQ6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cyApLAoKCS8vIE1haW4gbWV0aG9kCglhamF4OiBmdW5jdGlvbiggdXJsLCBvcHRpb25zICkgewoKCQkvLyBJZiB1cmwgaXMgYW4gb2JqZWN0LCBzaW11bGF0ZSBwcmUtMS41IHNpZ25hdHVyZQoJCWlmICggdHlwZW9mIHVybCA9PT0gIm9iamVjdCIgKSB7CgkJCW9wdGlvbnMgPSB1cmw7CgkJCXVybCA9IHVuZGVmaW5lZDsKCQl9CgoJCS8vIEZvcmNlIG9wdGlvbnMgdG8gYmUgYW4gb2JqZWN0CgkJb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CgoJCXZhciAvLyBpZk1vZGlmaWVkIGtleQoJCQlpZk1vZGlmaWVkS2V5LAoJCQkvLyBSZXNwb25zZSBoZWFkZXJzCgkJCXJlc3BvbnNlSGVhZGVyc1N0cmluZywKCQkJcmVzcG9uc2VIZWFkZXJzLAoJCQkvLyB0cmFuc3BvcnQKCQkJdHJhbnNwb3J0LAoJCQkvLyB0aW1lb3V0IGhhbmRsZQoJCQl0aW1lb3V0VGltZXIsCgkJCS8vIENyb3NzLWRvbWFpbiBkZXRlY3Rpb24gdmFycwoJCQlwYXJ0cywKCQkJLy8gVG8ga25vdyBpZiBnbG9iYWwgZXZlbnRzIGFyZSB0byBiZSBkaXNwYXRjaGVkCgkJCWZpcmVHbG9iYWxzLAoJCQkvLyBMb29wIHZhcmlhYmxlCgkJCWksCgkJCS8vIENyZWF0ZSB0aGUgZmluYWwgb3B0aW9ucyBvYmplY3QKCQkJcyA9IGpRdWVyeS5hamF4U2V0dXAoIHt9LCBvcHRpb25zICksCgkJCS8vIENhbGxiYWNrcyBjb250ZXh0CgkJCWNhbGxiYWNrQ29udGV4dCA9IHMuY29udGV4dCB8fCBzLAoJCQkvLyBDb250ZXh0IGZvciBnbG9iYWwgZXZlbnRzCgkJCS8vIEl0J3MgdGhlIGNhbGxiYWNrQ29udGV4dCBpZiBvbmUgd2FzIHByb3ZpZGVkIGluIHRoZSBvcHRpb25zCgkJCS8vIGFuZCBpZiBpdCdzIGEgRE9NIG5vZGUgb3IgYSBqUXVlcnkgY29sbGVjdGlvbgoJCQlnbG9iYWxFdmVudENvbnRleHQgPSBjYWxsYmFja0NvbnRleHQgIT09IHMgJiYKCQkJCSggY2FsbGJhY2tDb250ZXh0Lm5vZGVUeXBlIHx8IGNhbGxiYWNrQ29udGV4dCBpbnN0YW5jZW9mIGpRdWVyeSApID8KCQkJCQkJalF1ZXJ5KCBjYWxsYmFja0NvbnRleHQgKSA6IGpRdWVyeS5ldmVudCwKCQkJLy8gRGVmZXJyZWRzCgkJCWRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCksCgkJCWNvbXBsZXRlRGVmZXJyZWQgPSBqUXVlcnkuQ2FsbGJhY2tzKCAib25jZSBtZW1vcnkiICksCgkJCS8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzCgkJCXN0YXR1c0NvZGUgPSBzLnN0YXR1c0NvZGUgfHwge30sCgkJCS8vIEhlYWRlcnMgKHRoZXkgYXJlIHNlbnQgYWxsIGF0IG9uY2UpCgkJCXJlcXVlc3RIZWFkZXJzID0ge30sCgkJCXJlcXVlc3RIZWFkZXJzTmFtZXMgPSB7fSwKCQkJLy8gVGhlIGpxWEhSIHN0YXRlCgkJCXN0YXRlID0gMCwKCQkJLy8gRGVmYXVsdCBhYm9ydCBtZXNzYWdlCgkJCXN0ckFib3J0ID0gImNhbmNlbGVkIiwKCQkJLy8gRmFrZSB4aHIKCQkJanFYSFIgPSB7CgoJCQkJcmVhZHlTdGF0ZTogMCwKCgkJCQkvLyBDYWNoZXMgdGhlIGhlYWRlcgoJCQkJc2V0UmVxdWVzdEhlYWRlcjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkgewoJCQkJCWlmICggIXN0YXRlICkgewoJCQkJCQl2YXIgbG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CgkJCQkJCW5hbWUgPSByZXF1ZXN0SGVhZGVyc05hbWVzWyBsbmFtZSBdID0gcmVxdWVzdEhlYWRlcnNOYW1lc1sgbG5hbWUgXSB8fCBuYW1lOwoJCQkJCQlyZXF1ZXN0SGVhZGVyc1sgbmFtZSBdID0gdmFsdWU7CgkJCQkJfQoJCQkJCXJldHVybiB0aGlzOwoJCQkJfSwKCgkJCQkvLyBSYXcgc3RyaW5nCgkJCQlnZXRBbGxSZXNwb25zZUhlYWRlcnM6IGZ1bmN0aW9uKCkgewoJCQkJCXJldHVybiBzdGF0ZSA9PT0gMiA/IHJlc3BvbnNlSGVhZGVyc1N0cmluZyA6IG51bGw7CgkJCQl9LAoKCQkJCS8vIEJ1aWxkcyBoZWFkZXJzIGhhc2h0YWJsZSBpZiBuZWVkZWQKCQkJCWdldFJlc3BvbnNlSGVhZGVyOiBmdW5jdGlvbigga2V5ICkgewoJCQkJCXZhciBtYXRjaDsKCQkJCQlpZiAoIHN0YXRlID09PSAyICkgewoJCQkJCQlpZiAoICFyZXNwb25zZUhlYWRlcnMgKSB7CgkJCQkJCQlyZXNwb25zZUhlYWRlcnMgPSB7fTsKCQkJCQkJCXdoaWxlKCAoIG1hdGNoID0gcmhlYWRlcnMuZXhlYyggcmVzcG9uc2VIZWFkZXJzU3RyaW5nICkgKSApIHsKCQkJCQkJCQlyZXNwb25zZUhlYWRlcnNbIG1hdGNoWzFdLnRvTG93ZXJDYXNlKCkgXSA9IG1hdGNoWyAyIF07CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJbWF0Y2ggPSByZXNwb25zZUhlYWRlcnNbIGtleS50b0xvd2VyQ2FzZSgpIF07CgkJCQkJfQoJCQkJCXJldHVybiBtYXRjaCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IG1hdGNoOwoJCQkJfSwKCgkJCQkvLyBPdmVycmlkZXMgcmVzcG9uc2UgY29udGVudC10eXBlIGhlYWRlcgoJCQkJb3ZlcnJpZGVNaW1lVHlwZTogZnVuY3Rpb24oIHR5cGUgKSB7CgkJCQkJaWYgKCAhc3RhdGUgKSB7CgkJCQkJCXMubWltZVR5cGUgPSB0eXBlOwoJCQkJCX0KCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0sCgoJCQkJLy8gQ2FuY2VsIHRoZSByZXF1ZXN0CgkJCQlhYm9ydDogZnVuY3Rpb24oIHN0YXR1c1RleHQgKSB7CgkJCQkJc3RhdHVzVGV4dCA9IHN0YXR1c1RleHQgfHwgc3RyQWJvcnQ7CgkJCQkJaWYgKCB0cmFuc3BvcnQgKSB7CgkJCQkJCXRyYW5zcG9ydC5hYm9ydCggc3RhdHVzVGV4dCApOwoJCQkJCX0KCQkJCQlkb25lKCAwLCBzdGF0dXNUZXh0ICk7CgkJCQkJcmV0dXJuIHRoaXM7CgkJCQl9CgkJCX07CgoJCS8vIENhbGxiYWNrIGZvciB3aGVuIGV2ZXJ5dGhpbmcgaXMgZG9uZQoJCS8vIEl0IGlzIGRlZmluZWQgaGVyZSBiZWNhdXNlIGpzbGludCBjb21wbGFpbnMgaWYgaXQgaXMgZGVjbGFyZWQKCQkvLyBhdCB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbiAod2hpY2ggd291bGQgYmUgbW9yZSBsb2dpY2FsIGFuZCByZWFkYWJsZSkKCQlmdW5jdGlvbiBkb25lKCBzdGF0dXMsIG5hdGl2ZVN0YXR1c1RleHQsIHJlc3BvbnNlcywgaGVhZGVycyApIHsKCQkJdmFyIGlzU3VjY2Vzcywgc3VjY2VzcywgZXJyb3IsIHJlc3BvbnNlLCBtb2RpZmllZCwKCQkJCXN0YXR1c1RleHQgPSBuYXRpdmVTdGF0dXNUZXh0OwoKCQkJLy8gQ2FsbGVkIG9uY2UKCQkJaWYgKCBzdGF0ZSA9PT0gMiApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJLy8gU3RhdGUgaXMgImRvbmUiIG5vdwoJCQlzdGF0ZSA9IDI7CgoJCQkvLyBDbGVhciB0aW1lb3V0IGlmIGl0IGV4aXN0cwoJCQlpZiAoIHRpbWVvdXRUaW1lciApIHsKCQkJCWNsZWFyVGltZW91dCggdGltZW91dFRpbWVyICk7CgkJCX0KCgkJCS8vIERlcmVmZXJlbmNlIHRyYW5zcG9ydCBmb3IgZWFybHkgZ2FyYmFnZSBjb2xsZWN0aW9uCgkJCS8vIChubyBtYXR0ZXIgaG93IGxvbmcgdGhlIGpxWEhSIG9iamVjdCB3aWxsIGJlIHVzZWQpCgkJCXRyYW5zcG9ydCA9IHVuZGVmaW5lZDsKCgkJCS8vIENhY2hlIHJlc3BvbnNlIGhlYWRlcnMKCQkJcmVzcG9uc2VIZWFkZXJzU3RyaW5nID0gaGVhZGVycyB8fCAiIjsKCgkJCS8vIFNldCByZWFkeVN0YXRlCgkJCWpxWEhSLnJlYWR5U3RhdGUgPSBzdGF0dXMgPiAwID8gNCA6IDA7CgoJCQkvLyBHZXQgcmVzcG9uc2UgZGF0YQoJCQlpZiAoIHJlc3BvbnNlcyApIHsKCQkJCXJlc3BvbnNlID0gYWpheEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApOwoJCQl9CgoJCQkvLyBJZiBzdWNjZXNzZnVsLCBoYW5kbGUgdHlwZSBjaGFpbmluZwoJCQlpZiAoIHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwIHx8IHN0YXR1cyA9PT0gMzA0ICkgewoKCQkJCS8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuCgkJCQlpZiAoIHMuaWZNb2RpZmllZCApIHsKCgkJCQkJbW9kaWZpZWQgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpOwoJCQkJCWlmICggbW9kaWZpZWQgKSB7CgkJCQkJCWpRdWVyeS5sYXN0TW9kaWZpZWRbIGlmTW9kaWZpZWRLZXkgXSA9IG1vZGlmaWVkOwoJCQkJCX0KCQkJCQltb2RpZmllZCA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCJFdGFnIik7CgkJCQkJaWYgKCBtb2RpZmllZCApIHsKCQkJCQkJalF1ZXJ5LmV0YWdbIGlmTW9kaWZpZWRLZXkgXSA9IG1vZGlmaWVkOwoJCQkJCX0KCQkJCX0KCgkJCQkvLyBJZiBub3QgbW9kaWZpZWQKCQkJCWlmICggc3RhdHVzID09PSAzMDQgKSB7CgoJCQkJCXN0YXR1c1RleHQgPSAibm90bW9kaWZpZWQiOwoJCQkJCWlzU3VjY2VzcyA9IHRydWU7CgoJCQkJLy8gSWYgd2UgaGF2ZSBkYXRhCgkJCQl9IGVsc2UgewoKCQkJCQlpc1N1Y2Nlc3MgPSBhamF4Q29udmVydCggcywgcmVzcG9uc2UgKTsKCQkJCQlzdGF0dXNUZXh0ID0gaXNTdWNjZXNzLnN0YXRlOwoJCQkJCXN1Y2Nlc3MgPSBpc1N1Y2Nlc3MuZGF0YTsKCQkJCQllcnJvciA9IGlzU3VjY2Vzcy5lcnJvcjsKCQkJCQlpc1N1Y2Nlc3MgPSAhZXJyb3I7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQkvLyBXZSBleHRyYWN0IGVycm9yIGZyb20gc3RhdHVzVGV4dAoJCQkJLy8gdGhlbiBub3JtYWxpemUgc3RhdHVzVGV4dCBhbmQgc3RhdHVzIGZvciBub24tYWJvcnRzCgkJCQllcnJvciA9IHN0YXR1c1RleHQ7CgkJCQlpZiAoICFzdGF0dXNUZXh0IHx8IHN0YXR1cyApIHsKCQkJCQlzdGF0dXNUZXh0ID0gImVycm9yIjsKCQkJCQlpZiAoIHN0YXR1cyA8IDAgKSB7CgkJCQkJCXN0YXR1cyA9IDA7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQkvLyBTZXQgZGF0YSBmb3IgdGhlIGZha2UgeGhyIG9iamVjdAoJCQlqcVhIUi5zdGF0dXMgPSBzdGF0dXM7CgkJCWpxWEhSLnN0YXR1c1RleHQgPSAoIG5hdGl2ZVN0YXR1c1RleHQgfHwgc3RhdHVzVGV4dCApICsgIiI7CgoJCQkvLyBTdWNjZXNzL0Vycm9yCgkJCWlmICggaXNTdWNjZXNzICkgewoJCQkJZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBzdWNjZXNzLCBzdGF0dXNUZXh0LCBqcVhIUiBdICk7CgkJCX0gZWxzZSB7CgkJCQlkZWZlcnJlZC5yZWplY3RXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQsIGVycm9yIF0gKTsKCQkJfQoKCQkJLy8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3MKCQkJanFYSFIuc3RhdHVzQ29kZSggc3RhdHVzQ29kZSApOwoJCQlzdGF0dXNDb2RlID0gdW5kZWZpbmVkOwoKCQkJaWYgKCBmaXJlR2xvYmFscyApIHsKCQkJCWdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCAiYWpheCIgKyAoIGlzU3VjY2VzcyA/ICJTdWNjZXNzIiA6ICJFcnJvciIgKSwKCQkJCQkJWyBqcVhIUiwgcywgaXNTdWNjZXNzID8gc3VjY2VzcyA6IGVycm9yIF0gKTsKCQkJfQoKCQkJLy8gQ29tcGxldGUKCQkJY29tcGxldGVEZWZlcnJlZC5maXJlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIGpxWEhSLCBzdGF0dXNUZXh0IF0gKTsKCgkJCWlmICggZmlyZUdsb2JhbHMgKSB7CgkJCQlnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggImFqYXhDb21wbGV0ZSIsIFsganFYSFIsIHMgXSApOwoJCQkJLy8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyCgkJCQlpZiAoICEoIC0talF1ZXJ5LmFjdGl2ZSApICkgewoJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheFN0b3AiICk7CgkJCQl9CgkJCX0KCQl9CgoJCS8vIEF0dGFjaCBkZWZlcnJlZHMKCQlkZWZlcnJlZC5wcm9taXNlKCBqcVhIUiApOwoJCWpxWEhSLnN1Y2Nlc3MgPSBqcVhIUi5kb25lOwoJCWpxWEhSLmVycm9yID0ganFYSFIuZmFpbDsKCQlqcVhIUi5jb21wbGV0ZSA9IGNvbXBsZXRlRGVmZXJyZWQuYWRkOwoKCQkvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrcwoJCWpxWEhSLnN0YXR1c0NvZGUgPSBmdW5jdGlvbiggbWFwICkgewoJCQlpZiAoIG1hcCApIHsKCQkJCXZhciB0bXA7CgkJCQlpZiAoIHN0YXRlIDwgMiApIHsKCQkJCQlmb3IgKCB0bXAgaW4gbWFwICkgewoJCQkJCQlzdGF0dXNDb2RlWyB0bXAgXSA9IFsgc3RhdHVzQ29kZVt0bXBdLCBtYXBbdG1wXSBdOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJdG1wID0gbWFwWyBqcVhIUi5zdGF0dXMgXTsKCQkJCQlqcVhIUi5hbHdheXMoIHRtcCApOwoJCQkJfQoJCQl9CgkJCXJldHVybiB0aGlzOwoJCX07CgoJCS8vIFJlbW92ZSBoYXNoIGNoYXJhY3RlciAoIzc1MzE6IGFuZCBzdHJpbmcgcHJvbW90aW9uKQoJCS8vIEFkZCBwcm90b2NvbCBpZiBub3QgcHJvdmlkZWQgKCM1ODY2OiBJRTcgaXNzdWUgd2l0aCBwcm90b2NvbC1sZXNzIHVybHMpCgkJLy8gV2UgYWxzbyB1c2UgdGhlIHVybCBwYXJhbWV0ZXIgaWYgYXZhaWxhYmxlCgkJcy51cmwgPSAoICggdXJsIHx8IHMudXJsICkgKyAiIiApLnJlcGxhY2UoIHJoYXNoLCAiIiApLnJlcGxhY2UoIHJwcm90b2NvbCwgYWpheExvY1BhcnRzWyAxIF0gKyAiLy8iICk7CgoJCS8vIEV4dHJhY3QgZGF0YVR5cGVzIGxpc3QKCQlzLmRhdGFUeXBlcyA9IGpRdWVyeS50cmltKCBzLmRhdGFUeXBlIHx8ICIqIiApLnRvTG93ZXJDYXNlKCkuc3BsaXQoIGNvcmVfcnNwYWNlICk7CgoJCS8vIEEgY3Jvc3MtZG9tYWluIHJlcXVlc3QgaXMgaW4gb3JkZXIgd2hlbiB3ZSBoYXZlIGEgcHJvdG9jb2w6aG9zdDpwb3J0IG1pc21hdGNoCgkJaWYgKCBzLmNyb3NzRG9tYWluID09IG51bGwgKSB7CgkJCXBhcnRzID0gcnVybC5leGVjKCBzLnVybC50b0xvd2VyQ2FzZSgpICk7CgkJCXMuY3Jvc3NEb21haW4gPSAhISggcGFydHMgJiYKCQkJCSggcGFydHNbIDEgXSAhPT0gYWpheExvY1BhcnRzWyAxIF0gfHwgcGFydHNbIDIgXSAhPT0gYWpheExvY1BhcnRzWyAyIF0gfHwKCQkJCQkoIHBhcnRzWyAzIF0gfHwgKCBwYXJ0c1sgMSBdID09PSAiaHR0cDoiID8gODAgOiA0NDMgKSApICE9CgkJCQkJCSggYWpheExvY1BhcnRzWyAzIF0gfHwgKCBhamF4TG9jUGFydHNbIDEgXSA9PT0gImh0dHA6IiA/IDgwIDogNDQzICkgKSApCgkJCSk7CgkJfQoKCQkvLyBDb252ZXJ0IGRhdGEgaWYgbm90IGFscmVhZHkgYSBzdHJpbmcKCQlpZiAoIHMuZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYmIHR5cGVvZiBzLmRhdGEgIT09ICJzdHJpbmciICkgewoJCQlzLmRhdGEgPSBqUXVlcnkucGFyYW0oIHMuZGF0YSwgcy50cmFkaXRpb25hbCApOwoJCX0KCgkJLy8gQXBwbHkgcHJlZmlsdGVycwoJCWluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzLCBzLCBvcHRpb25zLCBqcVhIUiApOwoKCQkvLyBJZiByZXF1ZXN0IHdhcyBhYm9ydGVkIGluc2lkZSBhIHByZWZpbHRlciwgc3RvcCB0aGVyZQoJCWlmICggc3RhdGUgPT09IDIgKSB7CgkJCXJldHVybiBqcVhIUjsKCQl9CgoJCS8vIFdlIGNhbiBmaXJlIGdsb2JhbCBldmVudHMgYXMgb2Ygbm93IGlmIGFza2VkIHRvCgkJZmlyZUdsb2JhbHMgPSBzLmdsb2JhbDsKCgkJLy8gVXBwZXJjYXNlIHRoZSB0eXBlCgkJcy50eXBlID0gcy50eXBlLnRvVXBwZXJDYXNlKCk7CgoJCS8vIERldGVybWluZSBpZiByZXF1ZXN0IGhhcyBjb250ZW50CgkJcy5oYXNDb250ZW50ID0gIXJub0NvbnRlbnQudGVzdCggcy50eXBlICk7CgoJCS8vIFdhdGNoIGZvciBhIG5ldyBzZXQgb2YgcmVxdWVzdHMKCQlpZiAoIGZpcmVHbG9iYWxzICYmIGpRdWVyeS5hY3RpdmUrKyA9PT0gMCApIHsKCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3RhcnQiICk7CgkJfQoKCQkvLyBNb3JlIG9wdGlvbnMgaGFuZGxpbmcgZm9yIHJlcXVlc3RzIHdpdGggbm8gY29udGVudAoJCWlmICggIXMuaGFzQ29udGVudCApIHsKCgkJCS8vIElmIGRhdGEgaXMgYXZhaWxhYmxlLCBhcHBlbmQgZGF0YSB0byB1cmwKCQkJaWYgKCBzLmRhdGEgKSB7CgkJCQlzLnVybCArPSAoIHJxdWVyeS50ZXN0KCBzLnVybCApID8gIiYiIDogIj8iICkgKyBzLmRhdGE7CgkJCQkvLyAjOTY4MjogcmVtb3ZlIGRhdGEgc28gdGhhdCBpdCdzIG5vdCB1c2VkIGluIGFuIGV2ZW50dWFsIHJldHJ5CgkJCQlkZWxldGUgcy5kYXRhOwoJCQl9CgoJCQkvLyBHZXQgaWZNb2RpZmllZEtleSBiZWZvcmUgYWRkaW5nIHRoZSBhbnRpLWNhY2hlIHBhcmFtZXRlcgoJCQlpZk1vZGlmaWVkS2V5ID0gcy51cmw7CgoJCQkvLyBBZGQgYW50aS1jYWNoZSBpbiB1cmwgaWYgbmVlZGVkCgkJCWlmICggcy5jYWNoZSA9PT0gZmFsc2UgKSB7CgoJCQkJdmFyIHRzID0galF1ZXJ5Lm5vdygpLAoJCQkJCS8vIHRyeSByZXBsYWNpbmcgXz0gaWYgaXQgaXMgdGhlcmUKCQkJCQlyZXQgPSBzLnVybC5yZXBsYWNlKCBydHMsICIkMV89IiArIHRzICk7CgoJCQkJLy8gaWYgbm90aGluZyB3YXMgcmVwbGFjZWQsIGFkZCB0aW1lc3RhbXAgdG8gdGhlIGVuZAoJCQkJcy51cmwgPSByZXQgKyAoICggcmV0ID09PSBzLnVybCApID8gKCBycXVlcnkudGVzdCggcy51cmwgKSA/ICImIiA6ICI/IiApICsgIl89IiArIHRzIDogIiIgKTsKCQkJfQoJCX0KCgkJLy8gU2V0IHRoZSBjb3JyZWN0IGhlYWRlciwgaWYgZGF0YSBpcyBiZWluZyBzZW50CgkJaWYgKCBzLmRhdGEgJiYgcy5oYXNDb250ZW50ICYmIHMuY29udGVudFR5cGUgIT09IGZhbHNlIHx8IG9wdGlvbnMuY29udGVudFR5cGUgKSB7CgkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoICJDb250ZW50LVR5cGUiLCBzLmNvbnRlbnRUeXBlICk7CgkJfQoKCQkvLyBTZXQgdGhlIElmLU1vZGlmaWVkLVNpbmNlIGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciwgaWYgaW4gaWZNb2RpZmllZCBtb2RlLgoJCWlmICggcy5pZk1vZGlmaWVkICkgewoJCQlpZk1vZGlmaWVkS2V5ID0gaWZNb2RpZmllZEtleSB8fCBzLnVybDsKCQkJaWYgKCBqUXVlcnkubGFzdE1vZGlmaWVkWyBpZk1vZGlmaWVkS2V5IF0gKSB7CgkJCQlqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCAiSWYtTW9kaWZpZWQtU2luY2UiLCBqUXVlcnkubGFzdE1vZGlmaWVkWyBpZk1vZGlmaWVkS2V5IF0gKTsKCQkJfQoJCQlpZiAoIGpRdWVyeS5ldGFnWyBpZk1vZGlmaWVkS2V5IF0gKSB7CgkJCQlqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCAiSWYtTm9uZS1NYXRjaCIsIGpRdWVyeS5ldGFnWyBpZk1vZGlmaWVkS2V5IF0gKTsKCQkJfQoJCX0KCgkJLy8gU2V0IHRoZSBBY2NlcHRzIGhlYWRlciBmb3IgdGhlIHNlcnZlciwgZGVwZW5kaW5nIG9uIHRoZSBkYXRhVHlwZQoJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoCgkJCSJBY2NlcHQiLAoJCQlzLmRhdGFUeXBlc1sgMCBdICYmIHMuYWNjZXB0c1sgcy5kYXRhVHlwZXNbMF0gXSA/CgkJCQlzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWzBdIF0gKyAoIHMuZGF0YVR5cGVzWyAwIF0gIT09ICIqIiA/ICIsICIgKyBhbGxUeXBlcyArICI7IHE9MC4wMSIgOiAiIiApIDoKCQkJCXMuYWNjZXB0c1sgIioiIF0KCQkpOwoKCQkvLyBDaGVjayBmb3IgaGVhZGVycyBvcHRpb24KCQlmb3IgKCBpIGluIHMuaGVhZGVycyApIHsKCQkJanFYSFIuc2V0UmVxdWVzdEhlYWRlciggaSwgcy5oZWFkZXJzWyBpIF0gKTsKCQl9CgoJCS8vIEFsbG93IGN1c3RvbSBoZWFkZXJzL21pbWV0eXBlcyBhbmQgZWFybHkgYWJvcnQKCQlpZiAoIHMuYmVmb3JlU2VuZCAmJiAoIHMuYmVmb3JlU2VuZC5jYWxsKCBjYWxsYmFja0NvbnRleHQsIGpxWEhSLCBzICkgPT09IGZhbHNlIHx8IHN0YXRlID09PSAyICkgKSB7CgkJCQkvLyBBYm9ydCBpZiBub3QgZG9uZSBhbHJlYWR5IGFuZCByZXR1cm4KCQkJCXJldHVybiBqcVhIUi5hYm9ydCgpOwoKCQl9CgoJCS8vIGFib3J0aW5nIGlzIG5vIGxvbmdlciBhIGNhbmNlbGxhdGlvbgoJCXN0ckFib3J0ID0gImFib3J0IjsKCgkJLy8gSW5zdGFsbCBjYWxsYmFja3Mgb24gZGVmZXJyZWRzCgkJZm9yICggaSBpbiB7IHN1Y2Nlc3M6IDEsIGVycm9yOiAxLCBjb21wbGV0ZTogMSB9ICkgewoJCQlqcVhIUlsgaSBdKCBzWyBpIF0gKTsKCQl9CgoJCS8vIEdldCB0cmFuc3BvcnQKCQl0cmFuc3BvcnQgPSBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cywgcywgb3B0aW9ucywganFYSFIgKTsKCgkJLy8gSWYgbm8gdHJhbnNwb3J0LCB3ZSBhdXRvLWFib3J0CgkJaWYgKCAhdHJhbnNwb3J0ICkgewoJCQlkb25lKCAtMSwgIk5vIFRyYW5zcG9ydCIgKTsKCQl9IGVsc2UgewoJCQlqcVhIUi5yZWFkeVN0YXRlID0gMTsKCQkJLy8gU2VuZCBnbG9iYWwgZXZlbnQKCQkJaWYgKCBmaXJlR2xvYmFscyApIHsKCQkJCWdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCAiYWpheFNlbmQiLCBbIGpxWEhSLCBzIF0gKTsKCQkJfQoJCQkvLyBUaW1lb3V0CgkJCWlmICggcy5hc3luYyAmJiBzLnRpbWVvdXQgPiAwICkgewoJCQkJdGltZW91dFRpbWVyID0gc2V0VGltZW91dCggZnVuY3Rpb24oKXsKCQkJCQlqcVhIUi5hYm9ydCggInRpbWVvdXQiICk7CgkJCQl9LCBzLnRpbWVvdXQgKTsKCQkJfQoKCQkJdHJ5IHsKCQkJCXN0YXRlID0gMTsKCQkJCXRyYW5zcG9ydC5zZW5kKCByZXF1ZXN0SGVhZGVycywgZG9uZSApOwoJCQl9IGNhdGNoIChlKSB7CgkJCQkvLyBQcm9wYWdhdGUgZXhjZXB0aW9uIGFzIGVycm9yIGlmIG5vdCBkb25lCgkJCQlpZiAoIHN0YXRlIDwgMiApIHsKCQkJCQlkb25lKCAtMSwgZSApOwoJCQkJLy8gU2ltcGx5IHJldGhyb3cgb3RoZXJ3aXNlCgkJCQl9IGVsc2UgewoJCQkJCXRocm93IGU7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiBqcVhIUjsKCX0sCgoJLy8gQ291bnRlciBmb3IgaG9sZGluZyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBxdWVyaWVzCglhY3RpdmU6IDAsCgoJLy8gTGFzdC1Nb2RpZmllZCBoZWFkZXIgY2FjaGUgZm9yIG5leHQgcmVxdWVzdAoJbGFzdE1vZGlmaWVkOiB7fSwKCWV0YWc6IHt9Cgp9KTsKCi8qIEhhbmRsZXMgcmVzcG9uc2VzIHRvIGFuIGFqYXggcmVxdWVzdDoKICogLSBzZXRzIGFsbCByZXNwb25zZVhYWCBmaWVsZHMgYWNjb3JkaW5nbHkKICogLSBmaW5kcyB0aGUgcmlnaHQgZGF0YVR5cGUgKG1lZGlhdGVzIGJldHdlZW4gY29udGVudC10eXBlIGFuZCBleHBlY3RlZCBkYXRhVHlwZSkKICogLSByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlCiAqLwpmdW5jdGlvbiBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVzcG9uc2VzICkgewoKCXZhciBjdCwgdHlwZSwgZmluYWxEYXRhVHlwZSwgZmlyc3REYXRhVHlwZSwKCQljb250ZW50cyA9IHMuY29udGVudHMsCgkJZGF0YVR5cGVzID0gcy5kYXRhVHlwZXMsCgkJcmVzcG9uc2VGaWVsZHMgPSBzLnJlc3BvbnNlRmllbGRzOwoKCS8vIEZpbGwgcmVzcG9uc2VYWFggZmllbGRzCglmb3IgKCB0eXBlIGluIHJlc3BvbnNlRmllbGRzICkgewoJCWlmICggdHlwZSBpbiByZXNwb25zZXMgKSB7CgkJCWpxWEhSWyByZXNwb25zZUZpZWxkc1t0eXBlXSBdID0gcmVzcG9uc2VzWyB0eXBlIF07CgkJfQoJfQoKCS8vIFJlbW92ZSBhdXRvIGRhdGFUeXBlIGFuZCBnZXQgY29udGVudC10eXBlIGluIHRoZSBwcm9jZXNzCgl3aGlsZSggZGF0YVR5cGVzWyAwIF0gPT09ICIqIiApIHsKCQlkYXRhVHlwZXMuc2hpZnQoKTsKCQlpZiAoIGN0ID09PSB1bmRlZmluZWQgKSB7CgkJCWN0ID0gcy5taW1lVHlwZSB8fCBqcVhIUi5nZXRSZXNwb25zZUhlYWRlciggImNvbnRlbnQtdHlwZSIgKTsKCQl9Cgl9CgoJLy8gQ2hlY2sgaWYgd2UncmUgZGVhbGluZyB3aXRoIGEga25vd24gY29udGVudC10eXBlCglpZiAoIGN0ICkgewoJCWZvciAoIHR5cGUgaW4gY29udGVudHMgKSB7CgkJCWlmICggY29udGVudHNbIHR5cGUgXSAmJiBjb250ZW50c1sgdHlwZSBdLnRlc3QoIGN0ICkgKSB7CgkJCQlkYXRhVHlwZXMudW5zaGlmdCggdHlwZSApOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9CgoJLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYSByZXNwb25zZSBmb3IgdGhlIGV4cGVjdGVkIGRhdGFUeXBlCglpZiAoIGRhdGFUeXBlc1sgMCBdIGluIHJlc3BvbnNlcyApIHsKCQlmaW5hbERhdGFUeXBlID0gZGF0YVR5cGVzWyAwIF07Cgl9IGVsc2UgewoJCS8vIFRyeSBjb252ZXJ0aWJsZSBkYXRhVHlwZXMKCQlmb3IgKCB0eXBlIGluIHJlc3BvbnNlcyApIHsKCQkJaWYgKCAhZGF0YVR5cGVzWyAwIF0gfHwgcy5jb252ZXJ0ZXJzWyB0eXBlICsgIiAiICsgZGF0YVR5cGVzWzBdIF0gKSB7CgkJCQlmaW5hbERhdGFUeXBlID0gdHlwZTsKCQkJCWJyZWFrOwoJCQl9CgkJCWlmICggIWZpcnN0RGF0YVR5cGUgKSB7CgkJCQlmaXJzdERhdGFUeXBlID0gdHlwZTsKCQkJfQoJCX0KCQkvLyBPciBqdXN0IHVzZSBmaXJzdCBvbmUKCQlmaW5hbERhdGFUeXBlID0gZmluYWxEYXRhVHlwZSB8fCBmaXJzdERhdGFUeXBlOwoJfQoKCS8vIElmIHdlIGZvdW5kIGEgZGF0YVR5cGUKCS8vIFdlIGFkZCB0aGUgZGF0YVR5cGUgdG8gdGhlIGxpc3QgaWYgbmVlZGVkCgkvLyBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlCglpZiAoIGZpbmFsRGF0YVR5cGUgKSB7CgkJaWYgKCBmaW5hbERhdGFUeXBlICE9PSBkYXRhVHlwZXNbIDAgXSApIHsKCQkJZGF0YVR5cGVzLnVuc2hpZnQoIGZpbmFsRGF0YVR5cGUgKTsKCQl9CgkJcmV0dXJuIHJlc3BvbnNlc1sgZmluYWxEYXRhVHlwZSBdOwoJfQp9CgovLyBDaGFpbiBjb252ZXJzaW9ucyBnaXZlbiB0aGUgcmVxdWVzdCBhbmQgdGhlIG9yaWdpbmFsIHJlc3BvbnNlCmZ1bmN0aW9uIGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSApIHsKCgl2YXIgY29udiwgY29udjIsIGN1cnJlbnQsIHRtcCwKCQkvLyBXb3JrIHdpdGggYSBjb3B5IG9mIGRhdGFUeXBlcyBpbiBjYXNlIHdlIG5lZWQgdG8gbW9kaWZ5IGl0IGZvciBjb252ZXJzaW9uCgkJZGF0YVR5cGVzID0gcy5kYXRhVHlwZXMuc2xpY2UoKSwKCQlwcmV2ID0gZGF0YVR5cGVzWyAwIF0sCgkJY29udmVydGVycyA9IHt9LAoJCWkgPSAwOwoKCS8vIEFwcGx5IHRoZSBkYXRhRmlsdGVyIGlmIHByb3ZpZGVkCglpZiAoIHMuZGF0YUZpbHRlciApIHsKCQlyZXNwb25zZSA9IHMuZGF0YUZpbHRlciggcmVzcG9uc2UsIHMuZGF0YVR5cGUgKTsKCX0KCgkvLyBDcmVhdGUgY29udmVydGVycyBtYXAgd2l0aCBsb3dlcmNhc2VkIGtleXMKCWlmICggZGF0YVR5cGVzWyAxIF0gKSB7CgkJZm9yICggY29udiBpbiBzLmNvbnZlcnRlcnMgKSB7CgkJCWNvbnZlcnRlcnNbIGNvbnYudG9Mb3dlckNhc2UoKSBdID0gcy5jb252ZXJ0ZXJzWyBjb252IF07CgkJfQoJfQoKCS8vIENvbnZlcnQgdG8gZWFjaCBzZXF1ZW50aWFsIGRhdGFUeXBlLCB0b2xlcmF0aW5nIGxpc3QgbW9kaWZpY2F0aW9uCglmb3IgKCA7IChjdXJyZW50ID0gZGF0YVR5cGVzWysraV0pOyApIHsKCgkJLy8gVGhlcmUncyBvbmx5IHdvcmsgdG8gZG8gaWYgY3VycmVudCBkYXRhVHlwZSBpcyBub24tYXV0bwoJCWlmICggY3VycmVudCAhPT0gIioiICkgewoKCQkJLy8gQ29udmVydCByZXNwb25zZSBpZiBwcmV2IGRhdGFUeXBlIGlzIG5vbi1hdXRvIGFuZCBkaWZmZXJzIGZyb20gY3VycmVudAoJCQlpZiAoIHByZXYgIT09ICIqIiAmJiBwcmV2ICE9PSBjdXJyZW50ICkgewoKCQkJCS8vIFNlZWsgYSBkaXJlY3QgY29udmVydGVyCgkJCQljb252ID0gY29udmVydGVyc1sgcHJldiArICIgIiArIGN1cnJlbnQgXSB8fCBjb252ZXJ0ZXJzWyAiKiAiICsgY3VycmVudCBdOwoKCQkJCS8vIElmIG5vbmUgZm91bmQsIHNlZWsgYSBwYWlyCgkJCQlpZiAoICFjb252ICkgewoJCQkJCWZvciAoIGNvbnYyIGluIGNvbnZlcnRlcnMgKSB7CgoJCQkJCQkvLyBJZiBjb252MiBvdXRwdXRzIGN1cnJlbnQKCQkJCQkJdG1wID0gY29udjIuc3BsaXQoIiAiKTsKCQkJCQkJaWYgKCB0bXBbIDEgXSA9PT0gY3VycmVudCApIHsKCgkJCQkJCQkvLyBJZiBwcmV2IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYWNjZXB0ZWQgaW5wdXQKCQkJCQkJCWNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgIiAiICsgdG1wWyAwIF0gXSB8fAoJCQkJCQkJCWNvbnZlcnRlcnNbICIqICIgKyB0bXBbIDAgXSBdOwoJCQkJCQkJaWYgKCBjb252ICkgewoJCQkJCQkJCS8vIENvbmRlbnNlIGVxdWl2YWxlbmNlIGNvbnZlcnRlcnMKCQkJCQkJCQlpZiAoIGNvbnYgPT09IHRydWUgKSB7CgkJCQkJCQkJCWNvbnYgPSBjb252ZXJ0ZXJzWyBjb252MiBdOwoKCQkJCQkJCQkvLyBPdGhlcndpc2UsIGluc2VydCB0aGUgaW50ZXJtZWRpYXRlIGRhdGFUeXBlCgkJCQkJCQkJfSBlbHNlIGlmICggY29udmVydGVyc1sgY29udjIgXSAhPT0gdHJ1ZSApIHsKCQkJCQkJCQkJY3VycmVudCA9IHRtcFsgMCBdOwoJCQkJCQkJCQlkYXRhVHlwZXMuc3BsaWNlKCBpLS0sIDAsIGN1cnJlbnQgKTsKCQkJCQkJCQl9CgoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJfQoKCQkJCS8vIEFwcGx5IGNvbnZlcnRlciAoaWYgbm90IGFuIGVxdWl2YWxlbmNlKQoJCQkJaWYgKCBjb252ICE9PSB0cnVlICkgewoKCQkJCQkvLyBVbmxlc3MgZXJyb3JzIGFyZSBhbGxvd2VkIHRvIGJ1YmJsZSwgY2F0Y2ggYW5kIHJldHVybiB0aGVtCgkJCQkJaWYgKCBjb252ICYmIHNbInRocm93cyJdICkgewoJCQkJCQlyZXNwb25zZSA9IGNvbnYoIHJlc3BvbnNlICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJdHJ5IHsKCQkJCQkJCXJlc3BvbnNlID0gY29udiggcmVzcG9uc2UgKTsKCQkJCQkJfSBjYXRjaCAoIGUgKSB7CgkJCQkJCQlyZXR1cm4geyBzdGF0ZTogInBhcnNlcmVycm9yIiwgZXJyb3I6IGNvbnYgPyBlIDogIk5vIGNvbnZlcnNpb24gZnJvbSAiICsgcHJldiArICIgdG8gIiArIGN1cnJlbnQgfTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gVXBkYXRlIHByZXYgZm9yIG5leHQgaXRlcmF0aW9uCgkJCXByZXYgPSBjdXJyZW50OwoJCX0KCX0KCglyZXR1cm4geyBzdGF0ZTogInN1Y2Nlc3MiLCBkYXRhOiByZXNwb25zZSB9Owp9CnZhciBvbGRDYWxsYmFja3MgPSBbXSwKCXJxdWVzdGlvbiA9IC9cPy8sCglyanNvbnAgPSAvKD0pXD8oPz0mfCQpfFw/XD8vLAoJbm9uY2UgPSBqUXVlcnkubm93KCk7CgovLyBEZWZhdWx0IGpzb25wIHNldHRpbmdzCmpRdWVyeS5hamF4U2V0dXAoewoJanNvbnA6ICJjYWxsYmFjayIsCglqc29ucENhbGxiYWNrOiBmdW5jdGlvbigpIHsKCQl2YXIgY2FsbGJhY2sgPSBvbGRDYWxsYmFja3MucG9wKCkgfHwgKCBqUXVlcnkuZXhwYW5kbyArICJfIiArICggbm9uY2UrKyApICk7CgkJdGhpc1sgY2FsbGJhY2sgXSA9IHRydWU7CgkJcmV0dXJuIGNhbGxiYWNrOwoJfQp9KTsKCi8vIERldGVjdCwgbm9ybWFsaXplIG9wdGlvbnMgYW5kIGluc3RhbGwgY2FsbGJhY2tzIGZvciBqc29ucCByZXF1ZXN0cwpqUXVlcnkuYWpheFByZWZpbHRlciggImpzb24ganNvbnAiLCBmdW5jdGlvbiggcywgb3JpZ2luYWxTZXR0aW5ncywganFYSFIgKSB7CgoJdmFyIGNhbGxiYWNrTmFtZSwgb3ZlcndyaXR0ZW4sIHJlc3BvbnNlQ29udGFpbmVyLAoJCWRhdGEgPSBzLmRhdGEsCgkJdXJsID0gcy51cmwsCgkJaGFzQ2FsbGJhY2sgPSBzLmpzb25wICE9PSBmYWxzZSwKCQlyZXBsYWNlSW5VcmwgPSBoYXNDYWxsYmFjayAmJiByanNvbnAudGVzdCggdXJsICksCgkJcmVwbGFjZUluRGF0YSA9IGhhc0NhbGxiYWNrICYmICFyZXBsYWNlSW5VcmwgJiYgdHlwZW9mIGRhdGEgPT09ICJzdHJpbmciICYmCgkJCSEoIHMuY29udGVudFR5cGUgfHwgIiIgKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSAmJgoJCQlyanNvbnAudGVzdCggZGF0YSApOwoKCS8vIEhhbmRsZSBpZmYgdGhlIGV4cGVjdGVkIGRhdGEgdHlwZSBpcyAianNvbnAiIG9yIHdlIGhhdmUgYSBwYXJhbWV0ZXIgdG8gc2V0CglpZiAoIHMuZGF0YVR5cGVzWyAwIF0gPT09ICJqc29ucCIgfHwgcmVwbGFjZUluVXJsIHx8IHJlcGxhY2VJbkRhdGEgKSB7CgoJCS8vIEdldCBjYWxsYmFjayBuYW1lLCByZW1lbWJlcmluZyBwcmVleGlzdGluZyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggaXQKCQljYWxsYmFja05hbWUgPSBzLmpzb25wQ2FsbGJhY2sgPSBqUXVlcnkuaXNGdW5jdGlvbiggcy5qc29ucENhbGxiYWNrICkgPwoJCQlzLmpzb25wQ2FsbGJhY2soKSA6CgkJCXMuanNvbnBDYWxsYmFjazsKCQlvdmVyd3JpdHRlbiA9IHdpbmRvd1sgY2FsbGJhY2tOYW1lIF07CgoJCS8vIEluc2VydCBjYWxsYmFjayBpbnRvIHVybCBvciBmb3JtIGRhdGEKCQlpZiAoIHJlcGxhY2VJblVybCApIHsKCQkJcy51cmwgPSB1cmwucmVwbGFjZSggcmpzb25wLCAiJDEiICsgY2FsbGJhY2tOYW1lICk7CgkJfSBlbHNlIGlmICggcmVwbGFjZUluRGF0YSApIHsKCQkJcy5kYXRhID0gZGF0YS5yZXBsYWNlKCByanNvbnAsICIkMSIgKyBjYWxsYmFja05hbWUgKTsKCQl9IGVsc2UgaWYgKCBoYXNDYWxsYmFjayApIHsKCQkJcy51cmwgKz0gKCBycXVlc3Rpb24udGVzdCggdXJsICkgPyAiJiIgOiAiPyIgKSArIHMuanNvbnAgKyAiPSIgKyBjYWxsYmFja05hbWU7CgkJfQoKCQkvLyBVc2UgZGF0YSBjb252ZXJ0ZXIgdG8gcmV0cmlldmUganNvbiBhZnRlciBzY3JpcHQgZXhlY3V0aW9uCgkJcy5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdID0gZnVuY3Rpb24oKSB7CgkJCWlmICggIXJlc3BvbnNlQ29udGFpbmVyICkgewoJCQkJalF1ZXJ5LmVycm9yKCBjYWxsYmFja05hbWUgKyAiIHdhcyBub3QgY2FsbGVkIiApOwoJCQl9CgkJCXJldHVybiByZXNwb25zZUNvbnRhaW5lclsgMCBdOwoJCX07CgoJCS8vIGZvcmNlIGpzb24gZGF0YVR5cGUKCQlzLmRhdGFUeXBlc1sgMCBdID0gImpzb24iOwoKCQkvLyBJbnN0YWxsIGNhbGxiYWNrCgkJd2luZG93WyBjYWxsYmFja05hbWUgXSA9IGZ1bmN0aW9uKCkgewoJCQlyZXNwb25zZUNvbnRhaW5lciA9IGFyZ3VtZW50czsKCQl9OwoKCQkvLyBDbGVhbi11cCBmdW5jdGlvbiAoZmlyZXMgYWZ0ZXIgY29udmVydGVycykKCQlqcVhIUi5hbHdheXMoZnVuY3Rpb24oKSB7CgkJCS8vIFJlc3RvcmUgcHJlZXhpc3RpbmcgdmFsdWUKCQkJd2luZG93WyBjYWxsYmFja05hbWUgXSA9IG92ZXJ3cml0dGVuOwoKCQkJLy8gU2F2ZSBiYWNrIGFzIGZyZWUKCQkJaWYgKCBzWyBjYWxsYmFja05hbWUgXSApIHsKCQkJCS8vIG1ha2Ugc3VyZSB0aGF0IHJlLXVzaW5nIHRoZSBvcHRpb25zIGRvZXNuJ3Qgc2NyZXcgdGhpbmdzIGFyb3VuZAoJCQkJcy5qc29ucENhbGxiYWNrID0gb3JpZ2luYWxTZXR0aW5ncy5qc29ucENhbGxiYWNrOwoKCQkJCS8vIHNhdmUgdGhlIGNhbGxiYWNrIG5hbWUgZm9yIGZ1dHVyZSB1c2UKCQkJCW9sZENhbGxiYWNrcy5wdXNoKCBjYWxsYmFja05hbWUgKTsKCQkJfQoKCQkJLy8gQ2FsbCBpZiBpdCB3YXMgYSBmdW5jdGlvbiBhbmQgd2UgaGF2ZSBhIHJlc3BvbnNlCgkJCWlmICggcmVzcG9uc2VDb250YWluZXIgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIG92ZXJ3cml0dGVuICkgKSB7CgkJCQlvdmVyd3JpdHRlbiggcmVzcG9uc2VDb250YWluZXJbIDAgXSApOwoJCQl9CgoJCQlyZXNwb25zZUNvbnRhaW5lciA9IG92ZXJ3cml0dGVuID0gdW5kZWZpbmVkOwoJCX0pOwoKCQkvLyBEZWxlZ2F0ZSB0byBzY3JpcHQKCQlyZXR1cm4gInNjcmlwdCI7Cgl9Cn0pOwovLyBJbnN0YWxsIHNjcmlwdCBkYXRhVHlwZQpqUXVlcnkuYWpheFNldHVwKHsKCWFjY2VwdHM6IHsKCQlzY3JpcHQ6ICJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIKCX0sCgljb250ZW50czogewoJCXNjcmlwdDogL2phdmFzY3JpcHR8ZWNtYXNjcmlwdC8KCX0sCgljb252ZXJ0ZXJzOiB7CgkJInRleHQgc2NyaXB0IjogZnVuY3Rpb24oIHRleHQgKSB7CgkJCWpRdWVyeS5nbG9iYWxFdmFsKCB0ZXh0ICk7CgkJCXJldHVybiB0ZXh0OwoJCX0KCX0KfSk7CgovLyBIYW5kbGUgY2FjaGUncyBzcGVjaWFsIGNhc2UgYW5kIGdsb2JhbApqUXVlcnkuYWpheFByZWZpbHRlciggInNjcmlwdCIsIGZ1bmN0aW9uKCBzICkgewoJaWYgKCBzLmNhY2hlID09PSB1bmRlZmluZWQgKSB7CgkJcy5jYWNoZSA9IGZhbHNlOwoJfQoJaWYgKCBzLmNyb3NzRG9tYWluICkgewoJCXMudHlwZSA9ICJHRVQiOwoJCXMuZ2xvYmFsID0gZmFsc2U7Cgl9Cn0pOwoKLy8gQmluZCBzY3JpcHQgdGFnIGhhY2sgdHJhbnNwb3J0CmpRdWVyeS5hamF4VHJhbnNwb3J0KCAic2NyaXB0IiwgZnVuY3Rpb24ocykgewoKCS8vIFRoaXMgdHJhbnNwb3J0IG9ubHkgZGVhbHMgd2l0aCBjcm9zcyBkb21haW4gcmVxdWVzdHMKCWlmICggcy5jcm9zc0RvbWFpbiApIHsKCgkJdmFyIHNjcmlwdCwKCQkJaGVhZCA9IGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoICJoZWFkIiApWzBdIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKCgkJcmV0dXJuIHsKCgkJCXNlbmQ6IGZ1bmN0aW9uKCBfLCBjYWxsYmFjayApIHsKCgkJCQlzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAic2NyaXB0IiApOwoKCQkJCXNjcmlwdC5hc3luYyA9ICJhc3luYyI7CgoJCQkJaWYgKCBzLnNjcmlwdENoYXJzZXQgKSB7CgkJCQkJc2NyaXB0LmNoYXJzZXQgPSBzLnNjcmlwdENoYXJzZXQ7CgkJCQl9CgoJCQkJc2NyaXB0LnNyYyA9IHMudXJsOwoKCQkJCS8vIEF0dGFjaCBoYW5kbGVycyBmb3IgYWxsIGJyb3dzZXJzCgkJCQlzY3JpcHQub25sb2FkID0gc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCBfLCBpc0Fib3J0ICkgewoKCQkJCQlpZiAoIGlzQWJvcnQgfHwgIXNjcmlwdC5yZWFkeVN0YXRlIHx8IC9sb2FkZWR8Y29tcGxldGUvLnRlc3QoIHNjcmlwdC5yZWFkeVN0YXRlICkgKSB7CgoJCQkJCQkvLyBIYW5kbGUgbWVtb3J5IGxlYWsgaW4gSUUKCQkJCQkJc2NyaXB0Lm9ubG9hZCA9IHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsOwoKCQkJCQkJLy8gUmVtb3ZlIHRoZSBzY3JpcHQKCQkJCQkJaWYgKCBoZWFkICYmIHNjcmlwdC5wYXJlbnROb2RlICkgewoJCQkJCQkJaGVhZC5yZW1vdmVDaGlsZCggc2NyaXB0ICk7CgkJCQkJCX0KCgkJCQkJCS8vIERlcmVmZXJlbmNlIHRoZSBzY3JpcHQKCQkJCQkJc2NyaXB0ID0gdW5kZWZpbmVkOwoKCQkJCQkJLy8gQ2FsbGJhY2sgaWYgbm90IGFib3J0CgkJCQkJCWlmICggIWlzQWJvcnQgKSB7CgkJCQkJCQljYWxsYmFjayggMjAwLCAic3VjY2VzcyIgKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX07CgkJCQkvLyBVc2UgaW5zZXJ0QmVmb3JlIGluc3RlYWQgb2YgYXBwZW5kQ2hpbGQgIHRvIGNpcmN1bXZlbnQgYW4gSUU2IGJ1Zy4KCQkJCS8vIFRoaXMgYXJpc2VzIHdoZW4gYSBiYXNlIG5vZGUgaXMgdXNlZCAoIzI3MDkgYW5kICM0Mzc4KS4KCQkJCWhlYWQuaW5zZXJ0QmVmb3JlKCBzY3JpcHQsIGhlYWQuZmlyc3RDaGlsZCApOwoJCQl9LAoKCQkJYWJvcnQ6IGZ1bmN0aW9uKCkgewoJCQkJaWYgKCBzY3JpcHQgKSB7CgkJCQkJc2NyaXB0Lm9ubG9hZCggMCwgMSApOwoJCQkJfQoJCQl9CgkJfTsKCX0KfSk7CnZhciB4aHJDYWxsYmFja3MsCgkvLyAjNTI4MDogSW50ZXJuZXQgRXhwbG9yZXIgd2lsbCBrZWVwIGNvbm5lY3Rpb25zIGFsaXZlIGlmIHdlIGRvbid0IGFib3J0IG9uIHVubG9hZAoJeGhyT25VbmxvYWRBYm9ydCA9IHdpbmRvdy5BY3RpdmVYT2JqZWN0ID8gZnVuY3Rpb24oKSB7CgkJLy8gQWJvcnQgYWxsIHBlbmRpbmcgcmVxdWVzdHMKCQlmb3IgKCB2YXIga2V5IGluIHhockNhbGxiYWNrcyApIHsKCQkJeGhyQ2FsbGJhY2tzWyBrZXkgXSggMCwgMSApOwoJCX0KCX0gOiBmYWxzZSwKCXhocklkID0gMDsKCi8vIEZ1bmN0aW9ucyB0byBjcmVhdGUgeGhycwpmdW5jdGlvbiBjcmVhdGVTdGFuZGFyZFhIUigpIHsKCXRyeSB7CgkJcmV0dXJuIG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTsKCX0gY2F0Y2goIGUgKSB7fQp9CgpmdW5jdGlvbiBjcmVhdGVBY3RpdmVYSFIoKSB7Cgl0cnkgewoJCXJldHVybiBuZXcgd2luZG93LkFjdGl2ZVhPYmplY3QoICJNaWNyb3NvZnQuWE1MSFRUUCIgKTsKCX0gY2F0Y2goIGUgKSB7fQp9CgovLyBDcmVhdGUgdGhlIHJlcXVlc3Qgb2JqZWN0Ci8vIChUaGlzIGlzIHN0aWxsIGF0dGFjaGVkIHRvIGFqYXhTZXR0aW5ncyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSkKalF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIgPSB3aW5kb3cuQWN0aXZlWE9iamVjdCA/CgkvKiBNaWNyb3NvZnQgZmFpbGVkIHRvIHByb3Blcmx5CgkgKiBpbXBsZW1lbnQgdGhlIFhNTEh0dHBSZXF1ZXN0IGluIElFNyAoY2FuJ3QgcmVxdWVzdCBsb2NhbCBmaWxlcyksCgkgKiBzbyB3ZSB1c2UgdGhlIEFjdGl2ZVhPYmplY3Qgd2hlbiBpdCBpcyBhdmFpbGFibGUKCSAqIEFkZGl0aW9uYWxseSBYTUxIdHRwUmVxdWVzdCBjYW4gYmUgZGlzYWJsZWQgaW4gSUU3L0lFOCBzbwoJICogd2UgbmVlZCBhIGZhbGxiYWNrLgoJICovCglmdW5jdGlvbigpIHsKCQlyZXR1cm4gIXRoaXMuaXNMb2NhbCAmJiBjcmVhdGVTdGFuZGFyZFhIUigpIHx8IGNyZWF0ZUFjdGl2ZVhIUigpOwoJfSA6CgkvLyBGb3IgYWxsIG90aGVyIGJyb3dzZXJzLCB1c2UgdGhlIHN0YW5kYXJkIFhNTEh0dHBSZXF1ZXN0IG9iamVjdAoJY3JlYXRlU3RhbmRhcmRYSFI7CgovLyBEZXRlcm1pbmUgc3VwcG9ydCBwcm9wZXJ0aWVzCihmdW5jdGlvbiggeGhyICkgewoJalF1ZXJ5LmV4dGVuZCggalF1ZXJ5LnN1cHBvcnQsIHsKCQlhamF4OiAhIXhociwKCQljb3JzOiAhIXhociAmJiAoICJ3aXRoQ3JlZGVudGlhbHMiIGluIHhociApCgl9KTsKfSkoIGpRdWVyeS5hamF4U2V0dGluZ3MueGhyKCkgKTsKCi8vIENyZWF0ZSB0cmFuc3BvcnQgaWYgdGhlIGJyb3dzZXIgY2FuIHByb3ZpZGUgYW4geGhyCmlmICggalF1ZXJ5LnN1cHBvcnQuYWpheCApIHsKCglqUXVlcnkuYWpheFRyYW5zcG9ydChmdW5jdGlvbiggcyApIHsKCQkvLyBDcm9zcyBkb21haW4gb25seSBhbGxvd2VkIGlmIHN1cHBvcnRlZCB0aHJvdWdoIFhNTEh0dHBSZXF1ZXN0CgkJaWYgKCAhcy5jcm9zc0RvbWFpbiB8fCBqUXVlcnkuc3VwcG9ydC5jb3JzICkgewoKCQkJdmFyIGNhbGxiYWNrOwoKCQkJcmV0dXJuIHsKCQkJCXNlbmQ6IGZ1bmN0aW9uKCBoZWFkZXJzLCBjb21wbGV0ZSApIHsKCgkJCQkJLy8gR2V0IGEgbmV3IHhocgoJCQkJCXZhciBoYW5kbGUsIGksCgkJCQkJCXhociA9IHMueGhyKCk7CgoJCQkJCS8vIE9wZW4gdGhlIHNvY2tldAoJCQkJCS8vIFBhc3NpbmcgbnVsbCB1c2VybmFtZSwgZ2VuZXJhdGVzIGEgbG9naW4gcG9wdXAgb24gT3BlcmEgKCMyODY1KQoJCQkJCWlmICggcy51c2VybmFtZSApIHsKCQkJCQkJeGhyLm9wZW4oIHMudHlwZSwgcy51cmwsIHMuYXN5bmMsIHMudXNlcm5hbWUsIHMucGFzc3dvcmQgKTsKCQkJCQl9IGVsc2UgewoJCQkJCQl4aHIub3Blbiggcy50eXBlLCBzLnVybCwgcy5hc3luYyApOwoJCQkJCX0KCgkJCQkJLy8gQXBwbHkgY3VzdG9tIGZpZWxkcyBpZiBwcm92aWRlZAoJCQkJCWlmICggcy54aHJGaWVsZHMgKSB7CgkJCQkJCWZvciAoIGkgaW4gcy54aHJGaWVsZHMgKSB7CgkJCQkJCQl4aHJbIGkgXSA9IHMueGhyRmllbGRzWyBpIF07CgkJCQkJCX0KCQkJCQl9CgoJCQkJCS8vIE92ZXJyaWRlIG1pbWUgdHlwZSBpZiBuZWVkZWQKCQkJCQlpZiAoIHMubWltZVR5cGUgJiYgeGhyLm92ZXJyaWRlTWltZVR5cGUgKSB7CgkJCQkJCXhoci5vdmVycmlkZU1pbWVUeXBlKCBzLm1pbWVUeXBlICk7CgkJCQkJfQoKCQkJCQkvLyBYLVJlcXVlc3RlZC1XaXRoIGhlYWRlcgoJCQkJCS8vIEZvciBjcm9zcy1kb21haW4gcmVxdWVzdHMsIHNlZWluZyBhcyBjb25kaXRpb25zIGZvciBhIHByZWZsaWdodCBhcmUKCQkJCQkvLyBha2luIHRvIGEgamlnc2F3IHB1enpsZSwgd2Ugc2ltcGx5IG5ldmVyIHNldCBpdCB0byBiZSBzdXJlLgoJCQkJCS8vIChpdCBjYW4gYWx3YXlzIGJlIHNldCBvbiBhIHBlci1yZXF1ZXN0IGJhc2lzIG9yIGV2ZW4gdXNpbmcgYWpheFNldHVwKQoJCQkJCS8vIEZvciBzYW1lLWRvbWFpbiByZXF1ZXN0cywgd29uJ3QgY2hhbmdlIGhlYWRlciBpZiBhbHJlYWR5IHByb3ZpZGVkLgoJCQkJCWlmICggIXMuY3Jvc3NEb21haW4gJiYgIWhlYWRlcnNbIlgtUmVxdWVzdGVkLVdpdGgiXSApIHsKCQkJCQkJaGVhZGVyc1sgIlgtUmVxdWVzdGVkLVdpdGgiIF0gPSAiWE1MSHR0cFJlcXVlc3QiOwoJCQkJCX0KCgkJCQkJLy8gTmVlZCBhbiBleHRyYSB0cnkvY2F0Y2ggZm9yIGNyb3NzIGRvbWFpbiByZXF1ZXN0cyBpbiBGaXJlZm94IDMKCQkJCQl0cnkgewoJCQkJCQlmb3IgKCBpIGluIGhlYWRlcnMgKSB7CgkJCQkJCQl4aHIuc2V0UmVxdWVzdEhlYWRlciggaSwgaGVhZGVyc1sgaSBdICk7CgkJCQkJCX0KCQkJCQl9IGNhdGNoKCBfICkge30KCgkJCQkJLy8gRG8gc2VuZCB0aGUgcmVxdWVzdAoJCQkJCS8vIFRoaXMgbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbiB3aGljaCBpcyBhY3R1YWxseQoJCQkJCS8vIGhhbmRsZWQgaW4galF1ZXJ5LmFqYXggKHNvIG5vIHRyeS9jYXRjaCBoZXJlKQoJCQkJCXhoci5zZW5kKCAoIHMuaGFzQ29udGVudCAmJiBzLmRhdGEgKSB8fCBudWxsICk7CgoJCQkJCS8vIExpc3RlbmVyCgkJCQkJY2FsbGJhY2sgPSBmdW5jdGlvbiggXywgaXNBYm9ydCApIHsKCgkJCQkJCXZhciBzdGF0dXMsCgkJCQkJCQlzdGF0dXNUZXh0LAoJCQkJCQkJcmVzcG9uc2VIZWFkZXJzLAoJCQkJCQkJcmVzcG9uc2VzLAoJCQkJCQkJeG1sOwoKCQkJCQkJLy8gRmlyZWZveCB0aHJvd3MgZXhjZXB0aW9ucyB3aGVuIGFjY2Vzc2luZyBwcm9wZXJ0aWVzCgkJCQkJCS8vIG9mIGFuIHhociB3aGVuIGEgbmV0d29yayBlcnJvciBvY2N1cnJlZAoJCQkJCQkvLyBodHRwOi8vaGVscGZ1bC5rbm9icy1kaWFscy5jb20vaW5kZXgucGhwL0NvbXBvbmVudF9yZXR1cm5lZF9mYWlsdXJlX2NvZGU6XzB4ODAwNDAxMTFfKE5TX0VSUk9SX05PVF9BVkFJTEFCTEUpCgkJCQkJCXRyeSB7CgoJCQkJCQkJLy8gV2FzIG5ldmVyIGNhbGxlZCBhbmQgaXMgYWJvcnRlZCBvciBjb21wbGV0ZQoJCQkJCQkJaWYgKCBjYWxsYmFjayAmJiAoIGlzQWJvcnQgfHwgeGhyLnJlYWR5U3RhdGUgPT09IDQgKSApIHsKCgkJCQkJCQkJLy8gT25seSBjYWxsZWQgb25jZQoJCQkJCQkJCWNhbGxiYWNrID0gdW5kZWZpbmVkOwoKCQkJCQkJCQkvLyBEbyBub3Qga2VlcCBhcyBhY3RpdmUgYW55bW9yZQoJCQkJCQkJCWlmICggaGFuZGxlICkgewoJCQkJCQkJCQl4aHIub25yZWFkeXN0YXRlY2hhbmdlID0galF1ZXJ5Lm5vb3A7CgkJCQkJCQkJCWlmICggeGhyT25VbmxvYWRBYm9ydCApIHsKCQkJCQkJCQkJCWRlbGV0ZSB4aHJDYWxsYmFja3NbIGhhbmRsZSBdOwoJCQkJCQkJCQl9CgkJCQkJCQkJfQoKCQkJCQkJCQkvLyBJZiBpdCdzIGFuIGFib3J0CgkJCQkJCQkJaWYgKCBpc0Fib3J0ICkgewoJCQkJCQkJCQkvLyBBYm9ydCBpdCBtYW51YWxseSBpZiBuZWVkZWQKCQkJCQkJCQkJaWYgKCB4aHIucmVhZHlTdGF0ZSAhPT0gNCApIHsKCQkJCQkJCQkJCXhoci5hYm9ydCgpOwoJCQkJCQkJCQl9CgkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkJc3RhdHVzID0geGhyLnN0YXR1czsKCQkJCQkJCQkJcmVzcG9uc2VIZWFkZXJzID0geGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpOwoJCQkJCQkJCQlyZXNwb25zZXMgPSB7fTsKCQkJCQkJCQkJeG1sID0geGhyLnJlc3BvbnNlWE1MOwoKCQkJCQkJCQkJLy8gQ29uc3RydWN0IHJlc3BvbnNlIGxpc3QKCQkJCQkJCQkJaWYgKCB4bWwgJiYgeG1sLmRvY3VtZW50RWxlbWVudCAvKiAjNDk1OCAqLyApIHsKCQkJCQkJCQkJCXJlc3BvbnNlcy54bWwgPSB4bWw7CgkJCQkJCQkJCX0KCgkJCQkJCQkJCS8vIFdoZW4gcmVxdWVzdGluZyBiaW5hcnkgZGF0YSwgSUU2LTkgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24KCQkJCQkJCQkJLy8gb24gYW55IGF0dGVtcHQgdG8gYWNjZXNzIHJlc3BvbnNlVGV4dCAoIzExNDI2KQoJCQkJCQkJCQl0cnkgewoJCQkJCQkJCQkJcmVzcG9uc2VzLnRleHQgPSB4aHIucmVzcG9uc2VUZXh0OwoJCQkJCQkJCQl9IGNhdGNoKCBlICkgewoJCQkJCQkJCQl9CgoJCQkJCQkJCQkvLyBGaXJlZm94IHRocm93cyBhbiBleGNlcHRpb24gd2hlbiBhY2Nlc3NpbmcKCQkJCQkJCQkJLy8gc3RhdHVzVGV4dCBmb3IgZmF1bHR5IGNyb3NzLWRvbWFpbiByZXF1ZXN0cwoJCQkJCQkJCQl0cnkgewoJCQkJCQkJCQkJc3RhdHVzVGV4dCA9IHhoci5zdGF0dXNUZXh0OwoJCQkJCQkJCQl9IGNhdGNoKCBlICkgewoJCQkJCQkJCQkJLy8gV2Ugbm9ybWFsaXplIHdpdGggV2Via2l0IGdpdmluZyBhbiBlbXB0eSBzdGF0dXNUZXh0CgkJCQkJCQkJCQlzdGF0dXNUZXh0ID0gIiI7CgkJCQkJCQkJCX0KCgkJCQkJCQkJCS8vIEZpbHRlciBzdGF0dXMgZm9yIG5vbiBzdGFuZGFyZCBiZWhhdmlvcnMKCgkJCQkJCQkJCS8vIElmIHRoZSByZXF1ZXN0IGlzIGxvY2FsIGFuZCB3ZSBoYXZlIGRhdGE6IGFzc3VtZSBhIHN1Y2Nlc3MKCQkJCQkJCQkJLy8gKHN1Y2Nlc3Mgd2l0aCBubyBkYXRhIHdvbid0IGdldCBub3RpZmllZCwgdGhhdCdzIHRoZSBiZXN0IHdlCgkJCQkJCQkJCS8vIGNhbiBkbyBnaXZlbiBjdXJyZW50IGltcGxlbWVudGF0aW9ucykKCQkJCQkJCQkJaWYgKCAhc3RhdHVzICYmIHMuaXNMb2NhbCAmJiAhcy5jcm9zc0RvbWFpbiApIHsKCQkJCQkJCQkJCXN0YXR1cyA9IHJlc3BvbnNlcy50ZXh0ID8gMjAwIDogNDA0OwoJCQkJCQkJCQkvLyBJRSAtICMxNDUwOiBzb21ldGltZXMgcmV0dXJucyAxMjIzIHdoZW4gaXQgc2hvdWxkIGJlIDIwNAoJCQkJCQkJCQl9IGVsc2UgaWYgKCBzdGF0dXMgPT09IDEyMjMgKSB7CgkJCQkJCQkJCQlzdGF0dXMgPSAyMDQ7CgkJCQkJCQkJCX0KCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCX0gY2F0Y2goIGZpcmVmb3hBY2Nlc3NFeGNlcHRpb24gKSB7CgkJCQkJCQlpZiAoICFpc0Fib3J0ICkgewoJCQkJCQkJCWNvbXBsZXRlKCAtMSwgZmlyZWZveEFjY2Vzc0V4Y2VwdGlvbiApOwoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQkvLyBDYWxsIGNvbXBsZXRlIGlmIG5lZWRlZAoJCQkJCQlpZiAoIHJlc3BvbnNlcyApIHsKCQkJCQkJCWNvbXBsZXRlKCBzdGF0dXMsIHN0YXR1c1RleHQsIHJlc3BvbnNlcywgcmVzcG9uc2VIZWFkZXJzICk7CgkJCQkJCX0KCQkJCQl9OwoKCQkJCQlpZiAoICFzLmFzeW5jICkgewoJCQkJCQkvLyBpZiB3ZSdyZSBpbiBzeW5jIG1vZGUgd2UgZmlyZSB0aGUgY2FsbGJhY2sKCQkJCQkJY2FsbGJhY2soKTsKCQkJCQl9IGVsc2UgaWYgKCB4aHIucmVhZHlTdGF0ZSA9PT0gNCApIHsKCQkJCQkJLy8gKElFNiAmIElFNykgaWYgaXQncyBpbiBjYWNoZSBhbmQgaGFzIGJlZW4KCQkJCQkJLy8gcmV0cmlldmVkIGRpcmVjdGx5IHdlIG5lZWQgdG8gZmlyZSB0aGUgY2FsbGJhY2sKCQkJCQkJc2V0VGltZW91dCggY2FsbGJhY2ssIDAgKTsKCQkJCQl9IGVsc2UgewoJCQkJCQloYW5kbGUgPSArK3hocklkOwoJCQkJCQlpZiAoIHhock9uVW5sb2FkQWJvcnQgKSB7CgkJCQkJCQkvLyBDcmVhdGUgdGhlIGFjdGl2ZSB4aHJzIGNhbGxiYWNrcyBsaXN0IGlmIG5lZWRlZAoJCQkJCQkJLy8gYW5kIGF0dGFjaCB0aGUgdW5sb2FkIGhhbmRsZXIKCQkJCQkJCWlmICggIXhockNhbGxiYWNrcyApIHsKCQkJCQkJCQl4aHJDYWxsYmFja3MgPSB7fTsKCQkJCQkJCQlqUXVlcnkoIHdpbmRvdyApLnVubG9hZCggeGhyT25VbmxvYWRBYm9ydCApOwoJCQkJCQkJfQoJCQkJCQkJLy8gQWRkIHRvIGxpc3Qgb2YgYWN0aXZlIHhocnMgY2FsbGJhY2tzCgkJCQkJCQl4aHJDYWxsYmFja3NbIGhhbmRsZSBdID0gY2FsbGJhY2s7CgkJCQkJCX0KCQkJCQkJeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGNhbGxiYWNrOwoJCQkJCX0KCQkJCX0sCgoJCQkJYWJvcnQ6IGZ1bmN0aW9uKCkgewoJCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJCWNhbGxiYWNrKDAsMSk7CgkJCQkJfQoJCQkJfQoJCQl9OwoJCX0KCX0pOwp9CnZhciBmeE5vdywgdGltZXJJZCwKCXJmeHR5cGVzID0gL14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLAoJcmZ4bnVtID0gbmV3IFJlZ0V4cCggIl4oPzooWy0rXSk9fCkoIiArIGNvcmVfcG51bSArICIpKFthLXolXSopJCIsICJpIiApLAoJcnJ1biA9IC9xdWV1ZUhvb2tzJC8sCglhbmltYXRpb25QcmVmaWx0ZXJzID0gWyBkZWZhdWx0UHJlZmlsdGVyIF0sCgl0d2VlbmVycyA9IHsKCQkiKiI6IFtmdW5jdGlvbiggcHJvcCwgdmFsdWUgKSB7CgkJCXZhciBlbmQsIHVuaXQsCgkJCQl0d2VlbiA9IHRoaXMuY3JlYXRlVHdlZW4oIHByb3AsIHZhbHVlICksCgkJCQlwYXJ0cyA9IHJmeG51bS5leGVjKCB2YWx1ZSApLAoJCQkJdGFyZ2V0ID0gdHdlZW4uY3VyKCksCgkJCQlzdGFydCA9ICt0YXJnZXQgfHwgMCwKCQkJCXNjYWxlID0gMSwKCQkJCW1heEl0ZXJhdGlvbnMgPSAyMDsKCgkJCWlmICggcGFydHMgKSB7CgkJCQllbmQgPSArcGFydHNbMl07CgkJCQl1bml0ID0gcGFydHNbM10gfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBwcm9wIF0gPyAiIiA6ICJweCIgKTsKCgkJCQkvLyBXZSBuZWVkIHRvIGNvbXB1dGUgc3RhcnRpbmcgdmFsdWUKCQkJCWlmICggdW5pdCAhPT0gInB4IiAmJiBzdGFydCApIHsKCQkJCQkvLyBJdGVyYXRpdmVseSBhcHByb3hpbWF0ZSBmcm9tIGEgbm9uemVybyBzdGFydGluZyBwb2ludAoJCQkJCS8vIFByZWZlciB0aGUgY3VycmVudCBwcm9wZXJ0eSwgYmVjYXVzZSB0aGlzIHByb2Nlc3Mgd2lsbCBiZSB0cml2aWFsIGlmIGl0IHVzZXMgdGhlIHNhbWUgdW5pdHMKCQkJCQkvLyBGYWxsYmFjayB0byBlbmQgb3IgYSBzaW1wbGUgY29uc3RhbnQKCQkJCQlzdGFydCA9IGpRdWVyeS5jc3MoIHR3ZWVuLmVsZW0sIHByb3AsIHRydWUgKSB8fCBlbmQgfHwgMTsKCgkJCQkJZG8gewoJCQkJCQkvLyBJZiBwcmV2aW91cyBpdGVyYXRpb24gemVyb2VkIG91dCwgZG91YmxlIHVudGlsIHdlIGdldCAqc29tZXRoaW5nKgoJCQkJCQkvLyBVc2UgYSBzdHJpbmcgZm9yIGRvdWJsaW5nIGZhY3RvciBzbyB3ZSBkb24ndCBhY2NpZGVudGFsbHkgc2VlIHNjYWxlIGFzIHVuY2hhbmdlZCBiZWxvdwoJCQkJCQlzY2FsZSA9IHNjYWxlIHx8ICIuNSI7CgoJCQkJCQkvLyBBZGp1c3QgYW5kIGFwcGx5CgkJCQkJCXN0YXJ0ID0gc3RhcnQgLyBzY2FsZTsKCQkJCQkJalF1ZXJ5LnN0eWxlKCB0d2Vlbi5lbGVtLCBwcm9wLCBzdGFydCArIHVuaXQgKTsKCgkJCQkJLy8gVXBkYXRlIHNjYWxlLCB0b2xlcmF0aW5nIHplcm8gb3IgTmFOIGZyb20gdHdlZW4uY3VyKCkKCQkJCQkvLyBBbmQgYnJlYWtpbmcgdGhlIGxvb3AgaWYgc2NhbGUgaXMgdW5jaGFuZ2VkIG9yIHBlcmZlY3QsIG9yIGlmIHdlJ3ZlIGp1c3QgaGFkIGVub3VnaAoJCQkJCX0gd2hpbGUgKCBzY2FsZSAhPT0gKHNjYWxlID0gdHdlZW4uY3VyKCkgLyB0YXJnZXQpICYmIHNjYWxlICE9PSAxICYmIC0tbWF4SXRlcmF0aW9ucyApOwoJCQkJfQoKCQkJCXR3ZWVuLnVuaXQgPSB1bml0OwoJCQkJdHdlZW4uc3RhcnQgPSBzdGFydDsKCQkJCS8vIElmIGEgKz0vLT0gdG9rZW4gd2FzIHByb3ZpZGVkLCB3ZSdyZSBkb2luZyBhIHJlbGF0aXZlIGFuaW1hdGlvbgoJCQkJdHdlZW4uZW5kID0gcGFydHNbMV0gPyBzdGFydCArICggcGFydHNbMV0gKyAxICkgKiBlbmQgOiBlbmQ7CgkJCX0KCQkJcmV0dXJuIHR3ZWVuOwoJCX1dCgl9OwoKLy8gQW5pbWF0aW9ucyBjcmVhdGVkIHN5bmNocm9ub3VzbHkgd2lsbCBydW4gc3luY2hyb25vdXNseQpmdW5jdGlvbiBjcmVhdGVGeE5vdygpIHsKCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgkJZnhOb3cgPSB1bmRlZmluZWQ7Cgl9LCAwICk7CglyZXR1cm4gKCBmeE5vdyA9IGpRdWVyeS5ub3coKSApOwp9CgpmdW5jdGlvbiBjcmVhdGVUd2VlbnMoIGFuaW1hdGlvbiwgcHJvcHMgKSB7CglqUXVlcnkuZWFjaCggcHJvcHMsIGZ1bmN0aW9uKCBwcm9wLCB2YWx1ZSApIHsKCQl2YXIgY29sbGVjdGlvbiA9ICggdHdlZW5lcnNbIHByb3AgXSB8fCBbXSApLmNvbmNhdCggdHdlZW5lcnNbICIqIiBdICksCgkJCWluZGV4ID0gMCwKCQkJbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7CgkJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQkJaWYgKCBjb2xsZWN0aW9uWyBpbmRleCBdLmNhbGwoIGFuaW1hdGlvbiwgcHJvcCwgdmFsdWUgKSApIHsKCgkJCQkvLyB3ZSdyZSBkb25lIHdpdGggdGhpcyBwcm9wZXJ0eQoJCQkJcmV0dXJuOwoJCQl9CgkJfQoJfSk7Cn0KCmZ1bmN0aW9uIEFuaW1hdGlvbiggZWxlbSwgcHJvcGVydGllcywgb3B0aW9ucyApIHsKCXZhciByZXN1bHQsCgkJaW5kZXggPSAwLAoJCXR3ZWVuZXJJbmRleCA9IDAsCgkJbGVuZ3RoID0gYW5pbWF0aW9uUHJlZmlsdGVycy5sZW5ndGgsCgkJZGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKS5hbHdheXMoIGZ1bmN0aW9uKCkgewoJCQkvLyBkb24ndCBtYXRjaCBlbGVtIGluIHRoZSA6YW5pbWF0ZWQgc2VsZWN0b3IKCQkJZGVsZXRlIHRpY2suZWxlbTsKCQl9KSwKCQl0aWNrID0gZnVuY3Rpb24oKSB7CgkJCXZhciBjdXJyZW50VGltZSA9IGZ4Tm93IHx8IGNyZWF0ZUZ4Tm93KCksCgkJCQlyZW1haW5pbmcgPSBNYXRoLm1heCggMCwgYW5pbWF0aW9uLnN0YXJ0VGltZSArIGFuaW1hdGlvbi5kdXJhdGlvbiAtIGN1cnJlbnRUaW1lICksCgkJCQkvLyBhcmNoYWljIGNyYXNoIGJ1ZyB3b24ndCBhbGxvdyB1cyB0byB1c2UgMSAtICggMC41IHx8IDAgKSAoIzEyNDk3KQoJCQkJdGVtcCA9IHJlbWFpbmluZyAvIGFuaW1hdGlvbi5kdXJhdGlvbiB8fCAwLAoJCQkJcGVyY2VudCA9IDEgLSB0ZW1wLAoJCQkJaW5kZXggPSAwLAoJCQkJbGVuZ3RoID0gYW5pbWF0aW9uLnR3ZWVucy5sZW5ndGg7CgoJCQlmb3IgKCA7IGluZGV4IDwgbGVuZ3RoIDsgaW5kZXgrKyApIHsKCQkJCWFuaW1hdGlvbi50d2VlbnNbIGluZGV4IF0ucnVuKCBwZXJjZW50ICk7CgkJCX0KCgkJCWRlZmVycmVkLm5vdGlmeVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBwZXJjZW50LCByZW1haW5pbmcgXSk7CgoJCQlpZiAoIHBlcmNlbnQgPCAxICYmIGxlbmd0aCApIHsKCQkJCXJldHVybiByZW1haW5pbmc7CgkJCX0gZWxzZSB7CgkJCQlkZWZlcnJlZC5yZXNvbHZlV2l0aCggZWxlbSwgWyBhbmltYXRpb24gXSApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJfSwKCQlhbmltYXRpb24gPSBkZWZlcnJlZC5wcm9taXNlKHsKCQkJZWxlbTogZWxlbSwKCQkJcHJvcHM6IGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wZXJ0aWVzICksCgkJCW9wdHM6IGpRdWVyeS5leHRlbmQoIHRydWUsIHsgc3BlY2lhbEVhc2luZzoge30gfSwgb3B0aW9ucyApLAoJCQlvcmlnaW5hbFByb3BlcnRpZXM6IHByb3BlcnRpZXMsCgkJCW9yaWdpbmFsT3B0aW9uczogb3B0aW9ucywKCQkJc3RhcnRUaW1lOiBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLAoJCQlkdXJhdGlvbjogb3B0aW9ucy5kdXJhdGlvbiwKCQkJdHdlZW5zOiBbXSwKCQkJY3JlYXRlVHdlZW46IGZ1bmN0aW9uKCBwcm9wLCBlbmQsIGVhc2luZyApIHsKCQkJCXZhciB0d2VlbiA9IGpRdWVyeS5Ud2VlbiggZWxlbSwgYW5pbWF0aW9uLm9wdHMsIHByb3AsIGVuZCwKCQkJCQkJYW5pbWF0aW9uLm9wdHMuc3BlY2lhbEVhc2luZ1sgcHJvcCBdIHx8IGFuaW1hdGlvbi5vcHRzLmVhc2luZyApOwoJCQkJYW5pbWF0aW9uLnR3ZWVucy5wdXNoKCB0d2VlbiApOwoJCQkJcmV0dXJuIHR3ZWVuOwoJCQl9LAoJCQlzdG9wOiBmdW5jdGlvbiggZ290b0VuZCApIHsKCQkJCXZhciBpbmRleCA9IDAsCgkJCQkJLy8gaWYgd2UgYXJlIGdvaW5nIHRvIHRoZSBlbmQsIHdlIHdhbnQgdG8gcnVuIGFsbCB0aGUgdHdlZW5zCgkJCQkJLy8gb3RoZXJ3aXNlIHdlIHNraXAgdGhpcyBwYXJ0CgkJCQkJbGVuZ3RoID0gZ290b0VuZCA/IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoIDogMDsKCgkJCQlmb3IgKCA7IGluZGV4IDwgbGVuZ3RoIDsgaW5kZXgrKyApIHsKCQkJCQlhbmltYXRpb24udHdlZW5zWyBpbmRleCBdLnJ1biggMSApOwoJCQkJfQoKCQkJCS8vIHJlc29sdmUgd2hlbiB3ZSBwbGF5ZWQgdGhlIGxhc3QgZnJhbWUKCQkJCS8vIG90aGVyd2lzZSwgcmVqZWN0CgkJCQlpZiAoIGdvdG9FbmQgKSB7CgkJCQkJZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTsKCQkJCX0gZWxzZSB7CgkJCQkJZGVmZXJyZWQucmVqZWN0V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIGdvdG9FbmQgXSApOwoJCQkJfQoJCQkJcmV0dXJuIHRoaXM7CgkJCX0KCQl9KSwKCQlwcm9wcyA9IGFuaW1hdGlvbi5wcm9wczsKCglwcm9wRmlsdGVyKCBwcm9wcywgYW5pbWF0aW9uLm9wdHMuc3BlY2lhbEVhc2luZyApOwoKCWZvciAoIDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsrICkgewoJCXJlc3VsdCA9IGFuaW1hdGlvblByZWZpbHRlcnNbIGluZGV4IF0uY2FsbCggYW5pbWF0aW9uLCBlbGVtLCBwcm9wcywgYW5pbWF0aW9uLm9wdHMgKTsKCQlpZiAoIHJlc3VsdCApIHsKCQkJcmV0dXJuIHJlc3VsdDsKCQl9Cgl9CgoJY3JlYXRlVHdlZW5zKCBhbmltYXRpb24sIHByb3BzICk7CgoJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggYW5pbWF0aW9uLm9wdHMuc3RhcnQgKSApIHsKCQlhbmltYXRpb24ub3B0cy5zdGFydC5jYWxsKCBlbGVtLCBhbmltYXRpb24gKTsKCX0KCglqUXVlcnkuZngudGltZXIoCgkJalF1ZXJ5LmV4dGVuZCggdGljaywgewoJCQlhbmltOiBhbmltYXRpb24sCgkJCXF1ZXVlOiBhbmltYXRpb24ub3B0cy5xdWV1ZSwKCQkJZWxlbTogZWxlbQoJCX0pCgkpOwoKCS8vIGF0dGFjaCBjYWxsYmFja3MgZnJvbSBvcHRpb25zCglyZXR1cm4gYW5pbWF0aW9uLnByb2dyZXNzKCBhbmltYXRpb24ub3B0cy5wcm9ncmVzcyApCgkJLmRvbmUoIGFuaW1hdGlvbi5vcHRzLmRvbmUsIGFuaW1hdGlvbi5vcHRzLmNvbXBsZXRlICkKCQkuZmFpbCggYW5pbWF0aW9uLm9wdHMuZmFpbCApCgkJLmFsd2F5cyggYW5pbWF0aW9uLm9wdHMuYWx3YXlzICk7Cn0KCmZ1bmN0aW9uIHByb3BGaWx0ZXIoIHByb3BzLCBzcGVjaWFsRWFzaW5nICkgewoJdmFyIGluZGV4LCBuYW1lLCBlYXNpbmcsIHZhbHVlLCBob29rczsKCgkvLyBjYW1lbENhc2UsIHNwZWNpYWxFYXNpbmcgYW5kIGV4cGFuZCBjc3NIb29rIHBhc3MKCWZvciAoIGluZGV4IGluIHByb3BzICkgewoJCW5hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBpbmRleCApOwoJCWVhc2luZyA9IHNwZWNpYWxFYXNpbmdbIG5hbWUgXTsKCQl2YWx1ZSA9IHByb3BzWyBpbmRleCBdOwoJCWlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbHVlICkgKSB7CgkJCWVhc2luZyA9IHZhbHVlWyAxIF07CgkJCXZhbHVlID0gcHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsgMCBdOwoJCX0KCgkJaWYgKCBpbmRleCAhPT0gbmFtZSApIHsKCQkJcHJvcHNbIG5hbWUgXSA9IHZhbHVlOwoJCQlkZWxldGUgcHJvcHNbIGluZGV4IF07CgkJfQoKCQlob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdOwoJCWlmICggaG9va3MgJiYgImV4cGFuZCIgaW4gaG9va3MgKSB7CgkJCXZhbHVlID0gaG9va3MuZXhwYW5kKCB2YWx1ZSApOwoJCQlkZWxldGUgcHJvcHNbIG5hbWUgXTsKCgkJCS8vIG5vdCBxdWl0ZSAkLmV4dGVuZCwgdGhpcyB3b250IG92ZXJ3cml0ZSBrZXlzIGFscmVhZHkgcHJlc2VudC4KCQkJLy8gYWxzbyAtIHJldXNpbmcgJ2luZGV4JyBmcm9tIGFib3ZlIGJlY2F1c2Ugd2UgaGF2ZSB0aGUgY29ycmVjdCAibmFtZSIKCQkJZm9yICggaW5kZXggaW4gdmFsdWUgKSB7CgkJCQlpZiAoICEoIGluZGV4IGluIHByb3BzICkgKSB7CgkJCQkJcHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsgaW5kZXggXTsKCQkJCQlzcGVjaWFsRWFzaW5nWyBpbmRleCBdID0gZWFzaW5nOwoJCQkJfQoJCQl9CgkJfSBlbHNlIHsKCQkJc3BlY2lhbEVhc2luZ1sgbmFtZSBdID0gZWFzaW5nOwoJCX0KCX0KfQoKalF1ZXJ5LkFuaW1hdGlvbiA9IGpRdWVyeS5leHRlbmQoIEFuaW1hdGlvbiwgewoKCXR3ZWVuZXI6IGZ1bmN0aW9uKCBwcm9wcywgY2FsbGJhY2sgKSB7CgkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcHJvcHMgKSApIHsKCQkJY2FsbGJhY2sgPSBwcm9wczsKCQkJcHJvcHMgPSBbICIqIiBdOwoJCX0gZWxzZSB7CgkJCXByb3BzID0gcHJvcHMuc3BsaXQoIiAiKTsKCQl9CgoJCXZhciBwcm9wLAoJCQlpbmRleCA9IDAsCgkJCWxlbmd0aCA9IHByb3BzLmxlbmd0aDsKCgkJZm9yICggOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7CgkJCXByb3AgPSBwcm9wc1sgaW5kZXggXTsKCQkJdHdlZW5lcnNbIHByb3AgXSA9IHR3ZWVuZXJzWyBwcm9wIF0gfHwgW107CgkJCXR3ZWVuZXJzWyBwcm9wIF0udW5zaGlmdCggY2FsbGJhY2sgKTsKCQl9Cgl9LAoKCXByZWZpbHRlcjogZnVuY3Rpb24oIGNhbGxiYWNrLCBwcmVwZW5kICkgewoJCWlmICggcHJlcGVuZCApIHsKCQkJYW5pbWF0aW9uUHJlZmlsdGVycy51bnNoaWZ0KCBjYWxsYmFjayApOwoJCX0gZWxzZSB7CgkJCWFuaW1hdGlvblByZWZpbHRlcnMucHVzaCggY2FsbGJhY2sgKTsKCQl9Cgl9Cn0pOwoKZnVuY3Rpb24gZGVmYXVsdFByZWZpbHRlciggZWxlbSwgcHJvcHMsIG9wdHMgKSB7Cgl2YXIgaW5kZXgsIHByb3AsIHZhbHVlLCBsZW5ndGgsIGRhdGFTaG93LCB0b2dnbGUsIHR3ZWVuLCBob29rcywgb2xkZmlyZSwKCQlhbmltID0gdGhpcywKCQlzdHlsZSA9IGVsZW0uc3R5bGUsCgkJb3JpZyA9IHt9LAoJCWhhbmRsZWQgPSBbXSwKCQloaWRkZW4gPSBlbGVtLm5vZGVUeXBlICYmIGlzSGlkZGVuKCBlbGVtICk7CgoJLy8gaGFuZGxlIHF1ZXVlOiBmYWxzZSBwcm9taXNlcwoJaWYgKCAhb3B0cy5xdWV1ZSApIHsKCQlob29rcyA9IGpRdWVyeS5fcXVldWVIb29rcyggZWxlbSwgImZ4IiApOwoJCWlmICggaG9va3MudW5xdWV1ZWQgPT0gbnVsbCApIHsKCQkJaG9va3MudW5xdWV1ZWQgPSAwOwoJCQlvbGRmaXJlID0gaG9va3MuZW1wdHkuZmlyZTsKCQkJaG9va3MuZW1wdHkuZmlyZSA9IGZ1bmN0aW9uKCkgewoJCQkJaWYgKCAhaG9va3MudW5xdWV1ZWQgKSB7CgkJCQkJb2xkZmlyZSgpOwoJCQkJfQoJCQl9OwoJCX0KCQlob29rcy51bnF1ZXVlZCsrOwoKCQlhbmltLmFsd2F5cyhmdW5jdGlvbigpIHsKCQkJLy8gZG9pbmcgdGhpcyBtYWtlcyBzdXJlIHRoYXQgdGhlIGNvbXBsZXRlIGhhbmRsZXIgd2lsbCBiZSBjYWxsZWQKCQkJLy8gYmVmb3JlIHRoaXMgY29tcGxldGVzCgkJCWFuaW0uYWx3YXlzKGZ1bmN0aW9uKCkgewoJCQkJaG9va3MudW5xdWV1ZWQtLTsKCQkJCWlmICggIWpRdWVyeS5xdWV1ZSggZWxlbSwgImZ4IiApLmxlbmd0aCApIHsKCQkJCQlob29rcy5lbXB0eS5maXJlKCk7CgkJCQl9CgkJCX0pOwoJCX0pOwoJfQoKCS8vIGhlaWdodC93aWR0aCBvdmVyZmxvdyBwYXNzCglpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgKCAiaGVpZ2h0IiBpbiBwcm9wcyB8fCAid2lkdGgiIGluIHByb3BzICkgKSB7CgkJLy8gTWFrZSBzdXJlIHRoYXQgbm90aGluZyBzbmVha3Mgb3V0CgkJLy8gUmVjb3JkIGFsbCAzIG92ZXJmbG93IGF0dHJpYnV0ZXMgYmVjYXVzZSBJRSBkb2VzIG5vdAoJCS8vIGNoYW5nZSB0aGUgb3ZlcmZsb3cgYXR0cmlidXRlIHdoZW4gb3ZlcmZsb3dYIGFuZAoJCS8vIG92ZXJmbG93WSBhcmUgc2V0IHRvIHRoZSBzYW1lIHZhbHVlCgkJb3B0cy5vdmVyZmxvdyA9IFsgc3R5bGUub3ZlcmZsb3csIHN0eWxlLm92ZXJmbG93WCwgc3R5bGUub3ZlcmZsb3dZIF07CgoJCS8vIFNldCBkaXNwbGF5IHByb3BlcnR5IHRvIGlubGluZS1ibG9jayBmb3IgaGVpZ2h0L3dpZHRoCgkJLy8gYW5pbWF0aW9ucyBvbiBpbmxpbmUgZWxlbWVudHMgdGhhdCBhcmUgaGF2aW5nIHdpZHRoL2hlaWdodCBhbmltYXRlZAoJCWlmICggalF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiICkgPT09ICJpbmxpbmUiICYmCgkJCQlqUXVlcnkuY3NzKCBlbGVtLCAiZmxvYXQiICkgPT09ICJub25lIiApIHsKCgkJCS8vIGlubGluZS1sZXZlbCBlbGVtZW50cyBhY2NlcHQgaW5saW5lLWJsb2NrOwoJCQkvLyBibG9jay1sZXZlbCBlbGVtZW50cyBuZWVkIHRvIGJlIGlubGluZSB3aXRoIGxheW91dAoJCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5pbmxpbmVCbG9ja05lZWRzTGF5b3V0IHx8IGNzc19kZWZhdWx0RGlzcGxheSggZWxlbS5ub2RlTmFtZSApID09PSAiaW5saW5lIiApIHsKCQkJCXN0eWxlLmRpc3BsYXkgPSAiaW5saW5lLWJsb2NrIjsKCgkJCX0gZWxzZSB7CgkJCQlzdHlsZS56b29tID0gMTsKCQkJfQoJCX0KCX0KCglpZiAoIG9wdHMub3ZlcmZsb3cgKSB7CgkJc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIjsKCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5zaHJpbmtXcmFwQmxvY2tzICkgewoJCQlhbmltLmRvbmUoZnVuY3Rpb24oKSB7CgkJCQlzdHlsZS5vdmVyZmxvdyA9IG9wdHMub3ZlcmZsb3dbIDAgXTsKCQkJCXN0eWxlLm92ZXJmbG93WCA9IG9wdHMub3ZlcmZsb3dbIDEgXTsKCQkJCXN0eWxlLm92ZXJmbG93WSA9IG9wdHMub3ZlcmZsb3dbIDIgXTsKCQkJfSk7CgkJfQoJfQoKCgkvLyBzaG93L2hpZGUgcGFzcwoJZm9yICggaW5kZXggaW4gcHJvcHMgKSB7CgkJdmFsdWUgPSBwcm9wc1sgaW5kZXggXTsKCQlpZiAoIHJmeHR5cGVzLmV4ZWMoIHZhbHVlICkgKSB7CgkJCWRlbGV0ZSBwcm9wc1sgaW5kZXggXTsKCQkJdG9nZ2xlID0gdG9nZ2xlIHx8IHZhbHVlID09PSAidG9nZ2xlIjsKCQkJaWYgKCB2YWx1ZSA9PT0gKCBoaWRkZW4gPyAiaGlkZSIgOiAic2hvdyIgKSApIHsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJCWhhbmRsZWQucHVzaCggaW5kZXggKTsKCQl9Cgl9CgoJbGVuZ3RoID0gaGFuZGxlZC5sZW5ndGg7CglpZiAoIGxlbmd0aCApIHsKCQlkYXRhU2hvdyA9IGpRdWVyeS5fZGF0YSggZWxlbSwgImZ4c2hvdyIgKSB8fCBqUXVlcnkuX2RhdGEoIGVsZW0sICJmeHNob3ciLCB7fSApOwoJCWlmICggImhpZGRlbiIgaW4gZGF0YVNob3cgKSB7CgkJCWhpZGRlbiA9IGRhdGFTaG93LmhpZGRlbjsKCQl9CgoJCS8vIHN0b3JlIHN0YXRlIGlmIGl0cyB0b2dnbGUgLSBlbmFibGVzIC5zdG9wKCkudG9nZ2xlKCkgdG8gInJldmVyc2UiCgkJaWYgKCB0b2dnbGUgKSB7CgkJCWRhdGFTaG93LmhpZGRlbiA9ICFoaWRkZW47CgkJfQoJCWlmICggaGlkZGVuICkgewoJCQlqUXVlcnkoIGVsZW0gKS5zaG93KCk7CgkJfSBlbHNlIHsKCQkJYW5pbS5kb25lKGZ1bmN0aW9uKCkgewoJCQkJalF1ZXJ5KCBlbGVtICkuaGlkZSgpOwoJCQl9KTsKCQl9CgkJYW5pbS5kb25lKGZ1bmN0aW9uKCkgewoJCQl2YXIgcHJvcDsKCQkJalF1ZXJ5LnJlbW92ZURhdGEoIGVsZW0sICJmeHNob3ciLCB0cnVlICk7CgkJCWZvciAoIHByb3AgaW4gb3JpZyApIHsKCQkJCWpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgb3JpZ1sgcHJvcCBdICk7CgkJCX0KCQl9KTsKCQlmb3IgKCBpbmRleCA9IDAgOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7CgkJCXByb3AgPSBoYW5kbGVkWyBpbmRleCBdOwoJCQl0d2VlbiA9IGFuaW0uY3JlYXRlVHdlZW4oIHByb3AsIGhpZGRlbiA/IGRhdGFTaG93WyBwcm9wIF0gOiAwICk7CgkJCW9yaWdbIHByb3AgXSA9IGRhdGFTaG93WyBwcm9wIF0gfHwgalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wICk7CgoJCQlpZiAoICEoIHByb3AgaW4gZGF0YVNob3cgKSApIHsKCQkJCWRhdGFTaG93WyBwcm9wIF0gPSB0d2Vlbi5zdGFydDsKCQkJCWlmICggaGlkZGVuICkgewoJCQkJCXR3ZWVuLmVuZCA9IHR3ZWVuLnN0YXJ0OwoJCQkJCXR3ZWVuLnN0YXJ0ID0gcHJvcCA9PT0gIndpZHRoIiB8fCBwcm9wID09PSAiaGVpZ2h0IiA/IDEgOiAwOwoJCQkJfQoJCQl9CgkJfQoJfQp9CgpmdW5jdGlvbiBUd2VlbiggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcgKSB7CglyZXR1cm4gbmV3IFR3ZWVuLnByb3RvdHlwZS5pbml0KCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApOwp9CmpRdWVyeS5Ud2VlbiA9IFR3ZWVuOwoKVHdlZW4ucHJvdG90eXBlID0gewoJY29uc3RydWN0b3I6IFR3ZWVuLAoJaW5pdDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nLCB1bml0ICkgewoJCXRoaXMuZWxlbSA9IGVsZW07CgkJdGhpcy5wcm9wID0gcHJvcDsKCQl0aGlzLmVhc2luZyA9IGVhc2luZyB8fCAic3dpbmciOwoJCXRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CgkJdGhpcy5zdGFydCA9IHRoaXMubm93ID0gdGhpcy5jdXIoKTsKCQl0aGlzLmVuZCA9IGVuZDsKCQl0aGlzLnVuaXQgPSB1bml0IHx8ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gIiIgOiAicHgiICk7Cgl9LAoJY3VyOiBmdW5jdGlvbigpIHsKCQl2YXIgaG9va3MgPSBUd2Vlbi5wcm9wSG9va3NbIHRoaXMucHJvcCBdOwoKCQlyZXR1cm4gaG9va3MgJiYgaG9va3MuZ2V0ID8KCQkJaG9va3MuZ2V0KCB0aGlzICkgOgoJCQlUd2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KCB0aGlzICk7Cgl9LAoJcnVuOiBmdW5jdGlvbiggcGVyY2VudCApIHsKCQl2YXIgZWFzZWQsCgkJCWhvb2tzID0gVHdlZW4ucHJvcEhvb2tzWyB0aGlzLnByb3AgXTsKCgkJaWYgKCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKSB7CgkJCXRoaXMucG9zID0gZWFzZWQgPSBqUXVlcnkuZWFzaW5nWyB0aGlzLmVhc2luZyBdKAoJCQkJcGVyY2VudCwgdGhpcy5vcHRpb25zLmR1cmF0aW9uICogcGVyY2VudCwgMCwgMSwgdGhpcy5vcHRpb25zLmR1cmF0aW9uCgkJCSk7CgkJfSBlbHNlIHsKCQkJdGhpcy5wb3MgPSBlYXNlZCA9IHBlcmNlbnQ7CgkJfQoJCXRoaXMubm93ID0gKCB0aGlzLmVuZCAtIHRoaXMuc3RhcnQgKSAqIGVhc2VkICsgdGhpcy5zdGFydDsKCgkJaWYgKCB0aGlzLm9wdGlvbnMuc3RlcCApIHsKCQkJdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApOwoJCX0KCgkJaWYgKCBob29rcyAmJiBob29rcy5zZXQgKSB7CgkJCWhvb2tzLnNldCggdGhpcyApOwoJCX0gZWxzZSB7CgkJCVR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5zZXQoIHRoaXMgKTsKCQl9CgkJcmV0dXJuIHRoaXM7Cgl9Cn07CgpUd2Vlbi5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGUgPSBUd2Vlbi5wcm90b3R5cGU7CgpUd2Vlbi5wcm9wSG9va3MgPSB7CglfZGVmYXVsdDogewoJCWdldDogZnVuY3Rpb24oIHR3ZWVuICkgewoJCQl2YXIgcmVzdWx0OwoKCQkJaWYgKCB0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gIT0gbnVsbCAmJgoJCQkJKCF0d2Vlbi5lbGVtLnN0eWxlIHx8IHR3ZWVuLmVsZW0uc3R5bGVbIHR3ZWVuLnByb3AgXSA9PSBudWxsKSApIHsKCQkJCXJldHVybiB0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF07CgkJCX0KCgkJCS8vIHBhc3NpbmcgYW55IHZhbHVlIGFzIGEgNHRoIHBhcmFtZXRlciB0byAuY3NzIHdpbGwgYXV0b21hdGljYWxseQoJCQkvLyBhdHRlbXB0IGEgcGFyc2VGbG9hdCBhbmQgZmFsbGJhY2sgdG8gYSBzdHJpbmcgaWYgdGhlIHBhcnNlIGZhaWxzCgkJCS8vIHNvLCBzaW1wbGUgdmFsdWVzIHN1Y2ggYXMgIjEwcHgiIGFyZSBwYXJzZWQgdG8gRmxvYXQuCgkJCS8vIGNvbXBsZXggdmFsdWVzIHN1Y2ggYXMgInJvdGF0ZSgxcmFkKSIgYXJlIHJldHVybmVkIGFzIGlzLgoJCQlyZXN1bHQgPSBqUXVlcnkuY3NzKCB0d2Vlbi5lbGVtLCB0d2Vlbi5wcm9wLCBmYWxzZSwgIiIgKTsKCQkJLy8gRW1wdHkgc3RyaW5ncywgbnVsbCwgdW5kZWZpbmVkIGFuZCAiYXV0byIgYXJlIGNvbnZlcnRlZCB0byAwLgoJCQlyZXR1cm4gIXJlc3VsdCB8fCByZXN1bHQgPT09ICJhdXRvIiA/IDAgOiByZXN1bHQ7CgkJfSwKCQlzZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHsKCQkJLy8gdXNlIHN0ZXAgaG9vayBmb3IgYmFjayBjb21wYXQgLSB1c2UgY3NzSG9vayBpZiBpdHMgdGhlcmUgLSB1c2UgLnN0eWxlIGlmIGl0cwoJCQkvLyBhdmFpbGFibGUgYW5kIHVzZSBwbGFpbiBwcm9wZXJ0aWVzIHdoZXJlIGF2YWlsYWJsZQoJCQlpZiAoIGpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0gKSB7CgkJCQlqUXVlcnkuZnguc3RlcFsgdHdlZW4ucHJvcCBdKCB0d2VlbiApOwoJCQl9IGVsc2UgaWYgKCB0d2Vlbi5lbGVtLnN0eWxlICYmICggdHdlZW4uZWxlbS5zdHlsZVsgalF1ZXJ5LmNzc1Byb3BzWyB0d2Vlbi5wcm9wIF0gXSAhPSBudWxsIHx8IGpRdWVyeS5jc3NIb29rc1sgdHdlZW4ucHJvcCBdICkgKSB7CgkJCQlqUXVlcnkuc3R5bGUoIHR3ZWVuLmVsZW0sIHR3ZWVuLnByb3AsIHR3ZWVuLm5vdyArIHR3ZWVuLnVuaXQgKTsKCQkJfSBlbHNlIHsKCQkJCXR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSA9IHR3ZWVuLm5vdzsKCQkJfQoJCX0KCX0KfTsKCi8vIFJlbW92ZSBpbiAyLjAgLSB0aGlzIHN1cHBvcnRzIElFOCdzIHBhbmljIGJhc2VkIGFwcHJvYWNoCi8vIHRvIHNldHRpbmcgdGhpbmdzIG9uIGRpc2Nvbm5lY3RlZCBub2RlcwoKVHdlZW4ucHJvcEhvb2tzLnNjcm9sbFRvcCA9IFR3ZWVuLnByb3BIb29rcy5zY3JvbGxMZWZ0ID0gewoJc2V0OiBmdW5jdGlvbiggdHdlZW4gKSB7CgkJaWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlICYmIHR3ZWVuLmVsZW0ucGFyZW50Tm9kZSApIHsKCQkJdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdID0gdHdlZW4ubm93OwoJCX0KCX0KfTsKCmpRdWVyeS5lYWNoKFsgInRvZ2dsZSIsICJzaG93IiwgImhpZGUiIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkgewoJdmFyIGNzc0ZuID0galF1ZXJ5LmZuWyBuYW1lIF07CglqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHsKCQlyZXR1cm4gc3BlZWQgPT0gbnVsbCB8fCB0eXBlb2Ygc3BlZWQgPT09ICJib29sZWFuIiB8fAoJCQkvLyBzcGVjaWFsIGNoZWNrIGZvciAudG9nZ2xlKCBoYW5kbGVyLCBoYW5kbGVyLCAuLi4gKQoJCQkoICFpICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBzcGVlZCApICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBlYXNpbmcgKSApID8KCQkJY3NzRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApIDoKCQkJdGhpcy5hbmltYXRlKCBnZW5GeCggbmFtZSwgdHJ1ZSApLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApOwoJfTsKfSk7CgpqUXVlcnkuZm4uZXh0ZW5kKHsKCWZhZGVUbzogZnVuY3Rpb24oIHNwZWVkLCB0bywgZWFzaW5nLCBjYWxsYmFjayApIHsKCgkJLy8gc2hvdyBhbnkgaGlkZGVuIGVsZW1lbnRzIGFmdGVyIHNldHRpbmcgb3BhY2l0eSB0byAwCgkJcmV0dXJuIHRoaXMuZmlsdGVyKCBpc0hpZGRlbiApLmNzcyggIm9wYWNpdHkiLCAwICkuc2hvdygpCgoJCQkvLyBhbmltYXRlIHRvIHRoZSB2YWx1ZSBzcGVjaWZpZWQKCQkJLmVuZCgpLmFuaW1hdGUoeyBvcGFjaXR5OiB0byB9LCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApOwoJfSwKCWFuaW1hdGU6IGZ1bmN0aW9uKCBwcm9wLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHsKCQl2YXIgZW1wdHkgPSBqUXVlcnkuaXNFbXB0eU9iamVjdCggcHJvcCApLAoJCQlvcHRhbGwgPSBqUXVlcnkuc3BlZWQoIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICksCgkJCWRvQW5pbWF0aW9uID0gZnVuY3Rpb24oKSB7CgkJCQkvLyBPcGVyYXRlIG9uIGEgY29weSBvZiBwcm9wIHNvIHBlci1wcm9wZXJ0eSBlYXNpbmcgd29uJ3QgYmUgbG9zdAoJCQkJdmFyIGFuaW0gPSBBbmltYXRpb24oIHRoaXMsIGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wICksIG9wdGFsbCApOwoKCQkJCS8vIEVtcHR5IGFuaW1hdGlvbnMgcmVzb2x2ZSBpbW1lZGlhdGVseQoJCQkJaWYgKCBlbXB0eSApIHsKCQkJCQlhbmltLnN0b3AoIHRydWUgKTsKCQkJCX0KCQkJfTsKCgkJcmV0dXJuIGVtcHR5IHx8IG9wdGFsbC5xdWV1ZSA9PT0gZmFsc2UgPwoJCQl0aGlzLmVhY2goIGRvQW5pbWF0aW9uICkgOgoJCQl0aGlzLnF1ZXVlKCBvcHRhbGwucXVldWUsIGRvQW5pbWF0aW9uICk7Cgl9LAoJc3RvcDogZnVuY3Rpb24oIHR5cGUsIGNsZWFyUXVldWUsIGdvdG9FbmQgKSB7CgkJdmFyIHN0b3BRdWV1ZSA9IGZ1bmN0aW9uKCBob29rcyApIHsKCQkJdmFyIHN0b3AgPSBob29rcy5zdG9wOwoJCQlkZWxldGUgaG9va3Muc3RvcDsKCQkJc3RvcCggZ290b0VuZCApOwoJCX07CgoJCWlmICggdHlwZW9mIHR5cGUgIT09ICJzdHJpbmciICkgewoJCQlnb3RvRW5kID0gY2xlYXJRdWV1ZTsKCQkJY2xlYXJRdWV1ZSA9IHR5cGU7CgkJCXR5cGUgPSB1bmRlZmluZWQ7CgkJfQoJCWlmICggY2xlYXJRdWV1ZSAmJiB0eXBlICE9PSBmYWxzZSApIHsKCQkJdGhpcy5xdWV1ZSggdHlwZSB8fCAiZngiLCBbXSApOwoJCX0KCgkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJdmFyIGRlcXVldWUgPSB0cnVlLAoJCQkJaW5kZXggPSB0eXBlICE9IG51bGwgJiYgdHlwZSArICJxdWV1ZUhvb2tzIiwKCQkJCXRpbWVycyA9IGpRdWVyeS50aW1lcnMsCgkJCQlkYXRhID0galF1ZXJ5Ll9kYXRhKCB0aGlzICk7CgoJCQlpZiAoIGluZGV4ICkgewoJCQkJaWYgKCBkYXRhWyBpbmRleCBdICYmIGRhdGFbIGluZGV4IF0uc3RvcCApIHsKCQkJCQlzdG9wUXVldWUoIGRhdGFbIGluZGV4IF0gKTsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCWZvciAoIGluZGV4IGluIGRhdGEgKSB7CgkJCQkJaWYgKCBkYXRhWyBpbmRleCBdICYmIGRhdGFbIGluZGV4IF0uc3RvcCAmJiBycnVuLnRlc3QoIGluZGV4ICkgKSB7CgkJCQkJCXN0b3BRdWV1ZSggZGF0YVsgaW5kZXggXSApOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJZm9yICggaW5kZXggPSB0aW1lcnMubGVuZ3RoOyBpbmRleC0tOyApIHsKCQkJCWlmICggdGltZXJzWyBpbmRleCBdLmVsZW0gPT09IHRoaXMgJiYgKHR5cGUgPT0gbnVsbCB8fCB0aW1lcnNbIGluZGV4IF0ucXVldWUgPT09IHR5cGUpICkgewoJCQkJCXRpbWVyc1sgaW5kZXggXS5hbmltLnN0b3AoIGdvdG9FbmQgKTsKCQkJCQlkZXF1ZXVlID0gZmFsc2U7CgkJCQkJdGltZXJzLnNwbGljZSggaW5kZXgsIDEgKTsKCQkJCX0KCQkJfQoKCQkJLy8gc3RhcnQgdGhlIG5leHQgaW4gdGhlIHF1ZXVlIGlmIHRoZSBsYXN0IHN0ZXAgd2Fzbid0IGZvcmNlZAoJCQkvLyB0aW1lcnMgY3VycmVudGx5IHdpbGwgY2FsbCB0aGVpciBjb21wbGV0ZSBjYWxsYmFja3MsIHdoaWNoIHdpbGwgZGVxdWV1ZQoJCQkvLyBidXQgb25seSBpZiB0aGV5IHdlcmUgZ290b0VuZAoJCQlpZiAoIGRlcXVldWUgfHwgIWdvdG9FbmQgKSB7CgkJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOwoJCQl9CgkJfSk7Cgl9Cn0pOwoKLy8gR2VuZXJhdGUgcGFyYW1ldGVycyB0byBjcmVhdGUgYSBzdGFuZGFyZCBhbmltYXRpb24KZnVuY3Rpb24gZ2VuRngoIHR5cGUsIGluY2x1ZGVXaWR0aCApIHsKCXZhciB3aGljaCwKCQlhdHRycyA9IHsgaGVpZ2h0OiB0eXBlIH0sCgkJaSA9IDA7CgoJLy8gaWYgd2UgaW5jbHVkZSB3aWR0aCwgc3RlcCB2YWx1ZSBpcyAxIHRvIGRvIGFsbCBjc3NFeHBhbmQgdmFsdWVzLAoJLy8gaWYgd2UgZG9uJ3QgaW5jbHVkZSB3aWR0aCwgc3RlcCB2YWx1ZSBpcyAyIHRvIHNraXAgb3ZlciBMZWZ0IGFuZCBSaWdodAoJaW5jbHVkZVdpZHRoID0gaW5jbHVkZVdpZHRoPyAxIDogMDsKCWZvciggOyBpIDwgNCA7IGkgKz0gMiAtIGluY2x1ZGVXaWR0aCApIHsKCQl3aGljaCA9IGNzc0V4cGFuZFsgaSBdOwoJCWF0dHJzWyAibWFyZ2luIiArIHdoaWNoIF0gPSBhdHRyc1sgInBhZGRpbmciICsgd2hpY2ggXSA9IHR5cGU7Cgl9CgoJaWYgKCBpbmNsdWRlV2lkdGggKSB7CgkJYXR0cnMub3BhY2l0eSA9IGF0dHJzLndpZHRoID0gdHlwZTsKCX0KCglyZXR1cm4gYXR0cnM7Cn0KCi8vIEdlbmVyYXRlIHNob3J0Y3V0cyBmb3IgY3VzdG9tIGFuaW1hdGlvbnMKalF1ZXJ5LmVhY2goewoJc2xpZGVEb3duOiBnZW5GeCgic2hvdyIpLAoJc2xpZGVVcDogZ2VuRngoImhpZGUiKSwKCXNsaWRlVG9nZ2xlOiBnZW5GeCgidG9nZ2xlIiksCglmYWRlSW46IHsgb3BhY2l0eTogInNob3ciIH0sCglmYWRlT3V0OiB7IG9wYWNpdHk6ICJoaWRlIiB9LAoJZmFkZVRvZ2dsZTogeyBvcGFjaXR5OiAidG9nZ2xlIiB9Cn0sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXJldHVybiB0aGlzLmFuaW1hdGUoIHByb3BzLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApOwoJfTsKfSk7CgpqUXVlcnkuc3BlZWQgPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgZm4gKSB7Cgl2YXIgb3B0ID0gc3BlZWQgJiYgdHlwZW9mIHNwZWVkID09PSAib2JqZWN0IiA/IGpRdWVyeS5leHRlbmQoIHt9LCBzcGVlZCApIDogewoJCWNvbXBsZXRlOiBmbiB8fCAhZm4gJiYgZWFzaW5nIHx8CgkJCWpRdWVyeS5pc0Z1bmN0aW9uKCBzcGVlZCApICYmIHNwZWVkLAoJCWR1cmF0aW9uOiBzcGVlZCwKCQllYXNpbmc6IGZuICYmIGVhc2luZyB8fCBlYXNpbmcgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKCBlYXNpbmcgKSAmJiBlYXNpbmcKCX07CgoJb3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4Lm9mZiA/IDAgOiB0eXBlb2Ygb3B0LmR1cmF0aW9uID09PSAibnVtYmVyIiA/IG9wdC5kdXJhdGlvbiA6CgkJb3B0LmR1cmF0aW9uIGluIGpRdWVyeS5meC5zcGVlZHMgPyBqUXVlcnkuZnguc3BlZWRzWyBvcHQuZHVyYXRpb24gXSA6IGpRdWVyeS5meC5zcGVlZHMuX2RlZmF1bHQ7CgoJLy8gbm9ybWFsaXplIG9wdC5xdWV1ZSAtIHRydWUvdW5kZWZpbmVkL251bGwgLT4gImZ4IgoJaWYgKCBvcHQucXVldWUgPT0gbnVsbCB8fCBvcHQucXVldWUgPT09IHRydWUgKSB7CgkJb3B0LnF1ZXVlID0gImZ4IjsKCX0KCgkvLyBRdWV1ZWluZwoJb3B0Lm9sZCA9IG9wdC5jb21wbGV0ZTsKCglvcHQuY29tcGxldGUgPSBmdW5jdGlvbigpIHsKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBvcHQub2xkICkgKSB7CgkJCW9wdC5vbGQuY2FsbCggdGhpcyApOwoJCX0KCgkJaWYgKCBvcHQucXVldWUgKSB7CgkJCWpRdWVyeS5kZXF1ZXVlKCB0aGlzLCBvcHQucXVldWUgKTsKCQl9Cgl9OwoKCXJldHVybiBvcHQ7Cn07CgpqUXVlcnkuZWFzaW5nID0gewoJbGluZWFyOiBmdW5jdGlvbiggcCApIHsKCQlyZXR1cm4gcDsKCX0sCglzd2luZzogZnVuY3Rpb24oIHAgKSB7CgkJcmV0dXJuIDAuNSAtIE1hdGguY29zKCBwKk1hdGguUEkgKSAvIDI7Cgl9Cn07CgpqUXVlcnkudGltZXJzID0gW107CmpRdWVyeS5meCA9IFR3ZWVuLnByb3RvdHlwZS5pbml0OwpqUXVlcnkuZngudGljayA9IGZ1bmN0aW9uKCkgewoJdmFyIHRpbWVyLAoJCXRpbWVycyA9IGpRdWVyeS50aW1lcnMsCgkJaSA9IDA7CgoJZnhOb3cgPSBqUXVlcnkubm93KCk7CgoJZm9yICggOyBpIDwgdGltZXJzLmxlbmd0aDsgaSsrICkgewoJCXRpbWVyID0gdGltZXJzWyBpIF07CgkJLy8gQ2hlY2tzIHRoZSB0aW1lciBoYXMgbm90IGFscmVhZHkgYmVlbiByZW1vdmVkCgkJaWYgKCAhdGltZXIoKSAmJiB0aW1lcnNbIGkgXSA9PT0gdGltZXIgKSB7CgkJCXRpbWVycy5zcGxpY2UoIGktLSwgMSApOwoJCX0KCX0KCglpZiAoICF0aW1lcnMubGVuZ3RoICkgewoJCWpRdWVyeS5meC5zdG9wKCk7Cgl9CglmeE5vdyA9IHVuZGVmaW5lZDsKfTsKCmpRdWVyeS5meC50aW1lciA9IGZ1bmN0aW9uKCB0aW1lciApIHsKCWlmICggdGltZXIoKSAmJiBqUXVlcnkudGltZXJzLnB1c2goIHRpbWVyICkgJiYgIXRpbWVySWQgKSB7CgkJdGltZXJJZCA9IHNldEludGVydmFsKCBqUXVlcnkuZngudGljaywgalF1ZXJ5LmZ4LmludGVydmFsICk7Cgl9Cn07CgpqUXVlcnkuZnguaW50ZXJ2YWwgPSAxMzsKCmpRdWVyeS5meC5zdG9wID0gZnVuY3Rpb24oKSB7CgljbGVhckludGVydmFsKCB0aW1lcklkICk7Cgl0aW1lcklkID0gbnVsbDsKfTsKCmpRdWVyeS5meC5zcGVlZHMgPSB7CglzbG93OiA2MDAsCglmYXN0OiAyMDAsCgkvLyBEZWZhdWx0IHNwZWVkCglfZGVmYXVsdDogNDAwCn07CgovLyBCYWNrIENvbXBhdCA8MS44IGV4dGVuc2lvbiBwb2ludApqUXVlcnkuZnguc3RlcCA9IHt9OwoKaWYgKCBqUXVlcnkuZXhwciAmJiBqUXVlcnkuZXhwci5maWx0ZXJzICkgewoJalF1ZXJ5LmV4cHIuZmlsdGVycy5hbmltYXRlZCA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBqUXVlcnkuZ3JlcChqUXVlcnkudGltZXJzLCBmdW5jdGlvbiggZm4gKSB7CgkJCXJldHVybiBlbGVtID09PSBmbi5lbGVtOwoJCX0pLmxlbmd0aDsKCX07Cn0KdmFyIHJyb290ID0gL14oPzpib2R5fGh0bWwpJC9pOwoKalF1ZXJ5LmZuLm9mZnNldCA9IGZ1bmN0aW9uKCBvcHRpb25zICkgewoJaWYgKCBhcmd1bWVudHMubGVuZ3RoICkgewoJCXJldHVybiBvcHRpb25zID09PSB1bmRlZmluZWQgPwoJCQl0aGlzIDoKCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCBpICkgewoJCQkJalF1ZXJ5Lm9mZnNldC5zZXRPZmZzZXQoIHRoaXMsIG9wdGlvbnMsIGkgKTsKCQkJfSk7Cgl9CgoJdmFyIGRvY0VsZW0sIGJvZHksIHdpbiwgY2xpZW50VG9wLCBjbGllbnRMZWZ0LCBzY3JvbGxUb3AsIHNjcm9sbExlZnQsCgkJYm94ID0geyB0b3A6IDAsIGxlZnQ6IDAgfSwKCQllbGVtID0gdGhpc1sgMCBdLAoJCWRvYyA9IGVsZW0gJiYgZWxlbS5vd25lckRvY3VtZW50OwoKCWlmICggIWRvYyApIHsKCQlyZXR1cm47Cgl9CgoJaWYgKCAoYm9keSA9IGRvYy5ib2R5KSA9PT0gZWxlbSApIHsKCQlyZXR1cm4galF1ZXJ5Lm9mZnNldC5ib2R5T2Zmc2V0KCBlbGVtICk7Cgl9CgoJZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7CgoJLy8gTWFrZSBzdXJlIGl0J3Mgbm90IGEgZGlzY29ubmVjdGVkIERPTSBub2RlCglpZiAoICFqUXVlcnkuY29udGFpbnMoIGRvY0VsZW0sIGVsZW0gKSApIHsKCQlyZXR1cm4gYm94OwoJfQoKCS8vIElmIHdlIGRvbid0IGhhdmUgZ0JDUiwganVzdCB1c2UgMCwwIHJhdGhlciB0aGFuIGVycm9yCgkvLyBCbGFja0JlcnJ5IDUsIGlPUyAzIChvcmlnaW5hbCBpUGhvbmUpCglpZiAoIHR5cGVvZiBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCAhPT0gInVuZGVmaW5lZCIgKSB7CgkJYm94ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKCX0KCXdpbiA9IGdldFdpbmRvdyggZG9jICk7CgljbGllbnRUb3AgID0gZG9jRWxlbS5jbGllbnRUb3AgIHx8IGJvZHkuY2xpZW50VG9wICB8fCAwOwoJY2xpZW50TGVmdCA9IGRvY0VsZW0uY2xpZW50TGVmdCB8fCBib2R5LmNsaWVudExlZnQgfHwgMDsKCXNjcm9sbFRvcCAgPSB3aW4ucGFnZVlPZmZzZXQgfHwgZG9jRWxlbS5zY3JvbGxUb3A7CglzY3JvbGxMZWZ0ID0gd2luLnBhZ2VYT2Zmc2V0IHx8IGRvY0VsZW0uc2Nyb2xsTGVmdDsKCXJldHVybiB7CgkJdG9wOiBib3gudG9wICArIHNjcm9sbFRvcCAgLSBjbGllbnRUb3AsCgkJbGVmdDogYm94LmxlZnQgKyBzY3JvbGxMZWZ0IC0gY2xpZW50TGVmdAoJfTsKfTsKCmpRdWVyeS5vZmZzZXQgPSB7CgoJYm9keU9mZnNldDogZnVuY3Rpb24oIGJvZHkgKSB7CgkJdmFyIHRvcCA9IGJvZHkub2Zmc2V0VG9wLAoJCQlsZWZ0ID0gYm9keS5vZmZzZXRMZWZ0OwoKCQlpZiAoIGpRdWVyeS5zdXBwb3J0LmRvZXNOb3RJbmNsdWRlTWFyZ2luSW5Cb2R5T2Zmc2V0ICkgewoJCQl0b3AgICs9IHBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoYm9keSwgIm1hcmdpblRvcCIpICkgfHwgMDsKCQkJbGVmdCArPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKGJvZHksICJtYXJnaW5MZWZ0IikgKSB8fCAwOwoJCX0KCgkJcmV0dXJuIHsgdG9wOiB0b3AsIGxlZnQ6IGxlZnQgfTsKCX0sCgoJc2V0T2Zmc2V0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgaSApIHsKCQl2YXIgcG9zaXRpb24gPSBqUXVlcnkuY3NzKCBlbGVtLCAicG9zaXRpb24iICk7CgoJCS8vIHNldCBwb3NpdGlvbiBmaXJzdCwgaW4tY2FzZSB0b3AvbGVmdCBhcmUgc2V0IGV2ZW4gb24gc3RhdGljIGVsZW0KCQlpZiAoIHBvc2l0aW9uID09PSAic3RhdGljIiApIHsKCQkJZWxlbS5zdHlsZS5wb3NpdGlvbiA9ICJyZWxhdGl2ZSI7CgkJfQoKCQl2YXIgY3VyRWxlbSA9IGpRdWVyeSggZWxlbSApLAoJCQljdXJPZmZzZXQgPSBjdXJFbGVtLm9mZnNldCgpLAoJCQljdXJDU1NUb3AgPSBqUXVlcnkuY3NzKCBlbGVtLCAidG9wIiApLAoJCQljdXJDU1NMZWZ0ID0galF1ZXJ5LmNzcyggZWxlbSwgImxlZnQiICksCgkJCWNhbGN1bGF0ZVBvc2l0aW9uID0gKCBwb3NpdGlvbiA9PT0gImFic29sdXRlIiB8fCBwb3NpdGlvbiA9PT0gImZpeGVkIiApICYmIGpRdWVyeS5pbkFycmF5KCJhdXRvIiwgW2N1ckNTU1RvcCwgY3VyQ1NTTGVmdF0pID4gLTEsCgkJCXByb3BzID0ge30sIGN1clBvc2l0aW9uID0ge30sIGN1clRvcCwgY3VyTGVmdDsKCgkJLy8gbmVlZCB0byBiZSBhYmxlIHRvIGNhbGN1bGF0ZSBwb3NpdGlvbiBpZiBlaXRoZXIgdG9wIG9yIGxlZnQgaXMgYXV0byBhbmQgcG9zaXRpb24gaXMgZWl0aGVyIGFic29sdXRlIG9yIGZpeGVkCgkJaWYgKCBjYWxjdWxhdGVQb3NpdGlvbiApIHsKCQkJY3VyUG9zaXRpb24gPSBjdXJFbGVtLnBvc2l0aW9uKCk7CgkJCWN1clRvcCA9IGN1clBvc2l0aW9uLnRvcDsKCQkJY3VyTGVmdCA9IGN1clBvc2l0aW9uLmxlZnQ7CgkJfSBlbHNlIHsKCQkJY3VyVG9wID0gcGFyc2VGbG9hdCggY3VyQ1NTVG9wICkgfHwgMDsKCQkJY3VyTGVmdCA9IHBhcnNlRmxvYXQoIGN1ckNTU0xlZnQgKSB8fCAwOwoJCX0KCgkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggb3B0aW9ucyApICkgewoJCQlvcHRpb25zID0gb3B0aW9ucy5jYWxsKCBlbGVtLCBpLCBjdXJPZmZzZXQgKTsKCQl9CgoJCWlmICggb3B0aW9ucy50b3AgIT0gbnVsbCApIHsKCQkJcHJvcHMudG9wID0gKCBvcHRpb25zLnRvcCAtIGN1ck9mZnNldC50b3AgKSArIGN1clRvcDsKCQl9CgkJaWYgKCBvcHRpb25zLmxlZnQgIT0gbnVsbCApIHsKCQkJcHJvcHMubGVmdCA9ICggb3B0aW9ucy5sZWZ0IC0gY3VyT2Zmc2V0LmxlZnQgKSArIGN1ckxlZnQ7CgkJfQoKCQlpZiAoICJ1c2luZyIgaW4gb3B0aW9ucyApIHsKCQkJb3B0aW9ucy51c2luZy5jYWxsKCBlbGVtLCBwcm9wcyApOwoJCX0gZWxzZSB7CgkJCWN1ckVsZW0uY3NzKCBwcm9wcyApOwoJCX0KCX0KfTsKCgpqUXVlcnkuZm4uZXh0ZW5kKHsKCglwb3NpdGlvbjogZnVuY3Rpb24oKSB7CgkJaWYgKCAhdGhpc1swXSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJdmFyIGVsZW0gPSB0aGlzWzBdLAoKCQkvLyBHZXQgKnJlYWwqIG9mZnNldFBhcmVudAoJCW9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50KCksCgoJCS8vIEdldCBjb3JyZWN0IG9mZnNldHMKCQlvZmZzZXQgICAgICAgPSB0aGlzLm9mZnNldCgpLAoJCXBhcmVudE9mZnNldCA9IHJyb290LnRlc3Qob2Zmc2V0UGFyZW50WzBdLm5vZGVOYW1lKSA/IHsgdG9wOiAwLCBsZWZ0OiAwIH0gOiBvZmZzZXRQYXJlbnQub2Zmc2V0KCk7CgoJCS8vIFN1YnRyYWN0IGVsZW1lbnQgbWFyZ2lucwoJCS8vIG5vdGU6IHdoZW4gYW4gZWxlbWVudCBoYXMgbWFyZ2luOiBhdXRvIHRoZSBvZmZzZXRMZWZ0IGFuZCBtYXJnaW5MZWZ0CgkJLy8gYXJlIHRoZSBzYW1lIGluIFNhZmFyaSBjYXVzaW5nIG9mZnNldC5sZWZ0IHRvIGluY29ycmVjdGx5IGJlIDAKCQlvZmZzZXQudG9wICAtPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKGVsZW0sICJtYXJnaW5Ub3AiKSApIHx8IDA7CgkJb2Zmc2V0LmxlZnQgLT0gcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyhlbGVtLCAibWFyZ2luTGVmdCIpICkgfHwgMDsKCgkJLy8gQWRkIG9mZnNldFBhcmVudCBib3JkZXJzCgkJcGFyZW50T2Zmc2V0LnRvcCAgKz0gcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyhvZmZzZXRQYXJlbnRbMF0sICJib3JkZXJUb3BXaWR0aCIpICkgfHwgMDsKCQlwYXJlbnRPZmZzZXQubGVmdCArPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKG9mZnNldFBhcmVudFswXSwgImJvcmRlckxlZnRXaWR0aCIpICkgfHwgMDsKCgkJLy8gU3VidHJhY3QgdGhlIHR3byBvZmZzZXRzCgkJcmV0dXJuIHsKCQkJdG9wOiAgb2Zmc2V0LnRvcCAgLSBwYXJlbnRPZmZzZXQudG9wLAoJCQlsZWZ0OiBvZmZzZXQubGVmdCAtIHBhcmVudE9mZnNldC5sZWZ0CgkJfTsKCX0sCgoJb2Zmc2V0UGFyZW50OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKSB7CgkJCXZhciBvZmZzZXRQYXJlbnQgPSB0aGlzLm9mZnNldFBhcmVudCB8fCBkb2N1bWVudC5ib2R5OwoJCQl3aGlsZSAoIG9mZnNldFBhcmVudCAmJiAoIXJyb290LnRlc3Qob2Zmc2V0UGFyZW50Lm5vZGVOYW1lKSAmJiBqUXVlcnkuY3NzKG9mZnNldFBhcmVudCwgInBvc2l0aW9uIikgPT09ICJzdGF0aWMiKSApIHsKCQkJCW9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudC5vZmZzZXRQYXJlbnQ7CgkJCX0KCQkJcmV0dXJuIG9mZnNldFBhcmVudCB8fCBkb2N1bWVudC5ib2R5OwoJCX0pOwoJfQp9KTsKCgovLyBDcmVhdGUgc2Nyb2xsTGVmdCBhbmQgc2Nyb2xsVG9wIG1ldGhvZHMKalF1ZXJ5LmVhY2goIHtzY3JvbGxMZWZ0OiAicGFnZVhPZmZzZXQiLCBzY3JvbGxUb3A6ICJwYWdlWU9mZnNldCJ9LCBmdW5jdGlvbiggbWV0aG9kLCBwcm9wICkgewoJdmFyIHRvcCA9IC9ZLy50ZXN0KCBwcm9wICk7CgoJalF1ZXJ5LmZuWyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB2YWwgKSB7CgkJcmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBtZXRob2QsIHZhbCApIHsKCQkJdmFyIHdpbiA9IGdldFdpbmRvdyggZWxlbSApOwoKCQkJaWYgKCB2YWwgPT09IHVuZGVmaW5lZCApIHsKCQkJCXJldHVybiB3aW4gPyAocHJvcCBpbiB3aW4pID8gd2luWyBwcm9wIF0gOgoJCQkJCXdpbi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbIG1ldGhvZCBdIDoKCQkJCQllbGVtWyBtZXRob2QgXTsKCQkJfQoKCQkJaWYgKCB3aW4gKSB7CgkJCQl3aW4uc2Nyb2xsVG8oCgkJCQkJIXRvcCA/IHZhbCA6IGpRdWVyeSggd2luICkuc2Nyb2xsTGVmdCgpLAoJCQkJCSB0b3AgPyB2YWwgOiBqUXVlcnkoIHdpbiApLnNjcm9sbFRvcCgpCgkJCQkpOwoKCQkJfSBlbHNlIHsKCQkJCWVsZW1bIG1ldGhvZCBdID0gdmFsOwoJCQl9CgkJfSwgbWV0aG9kLCB2YWwsIGFyZ3VtZW50cy5sZW5ndGgsIG51bGwgKTsKCX07Cn0pOwoKZnVuY3Rpb24gZ2V0V2luZG93KCBlbGVtICkgewoJcmV0dXJuIGpRdWVyeS5pc1dpbmRvdyggZWxlbSApID8KCQllbGVtIDoKCQllbGVtLm5vZGVUeXBlID09PSA5ID8KCQkJZWxlbS5kZWZhdWx0VmlldyB8fCBlbGVtLnBhcmVudFdpbmRvdyA6CgkJCWZhbHNlOwp9Ci8vIENyZWF0ZSBpbm5lckhlaWdodCwgaW5uZXJXaWR0aCwgaGVpZ2h0LCB3aWR0aCwgb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGggbWV0aG9kcwpqUXVlcnkuZWFjaCggeyBIZWlnaHQ6ICJoZWlnaHQiLCBXaWR0aDogIndpZHRoIiB9LCBmdW5jdGlvbiggbmFtZSwgdHlwZSApIHsKCWpRdWVyeS5lYWNoKCB7IHBhZGRpbmc6ICJpbm5lciIgKyBuYW1lLCBjb250ZW50OiB0eXBlLCAiIjogIm91dGVyIiArIG5hbWUgfSwgZnVuY3Rpb24oIGRlZmF1bHRFeHRyYSwgZnVuY05hbWUgKSB7CgkJLy8gbWFyZ2luIGlzIG9ubHkgZm9yIG91dGVySGVpZ2h0LCBvdXRlcldpZHRoCgkJalF1ZXJ5LmZuWyBmdW5jTmFtZSBdID0gZnVuY3Rpb24oIG1hcmdpbiwgdmFsdWUgKSB7CgkJCXZhciBjaGFpbmFibGUgPSBhcmd1bWVudHMubGVuZ3RoICYmICggZGVmYXVsdEV4dHJhIHx8IHR5cGVvZiBtYXJnaW4gIT09ICJib29sZWFuIiApLAoJCQkJZXh0cmEgPSBkZWZhdWx0RXh0cmEgfHwgKCBtYXJnaW4gPT09IHRydWUgfHwgdmFsdWUgPT09IHRydWUgPyAibWFyZ2luIiA6ICJib3JkZXIiICk7CgoJCQlyZXR1cm4galF1ZXJ5LmFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIHR5cGUsIHZhbHVlICkgewoJCQkJdmFyIGRvYzsKCgkJCQlpZiAoIGpRdWVyeS5pc1dpbmRvdyggZWxlbSApICkgewoJCQkJCS8vIEFzIG9mIDUvOC8yMDEyIHRoaXMgd2lsbCB5aWVsZCBpbmNvcnJlY3QgcmVzdWx0cyBmb3IgTW9iaWxlIFNhZmFyaSwgYnV0IHRoZXJlCgkJCQkJLy8gaXNuJ3QgYSB3aG9sZSBsb3Qgd2UgY2FuIGRvLiBTZWUgcHVsbCByZXF1ZXN0IGF0IHRoaXMgVVJMIGZvciBkaXNjdXNzaW9uOgoJCQkJCS8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5L3B1bGwvNzY0CgkJCQkJcmV0dXJuIGVsZW0uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyAiY2xpZW50IiArIG5hbWUgXTsKCQkJCX0KCgkJCQkvLyBHZXQgZG9jdW1lbnQgd2lkdGggb3IgaGVpZ2h0CgkJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDkgKSB7CgkJCQkJZG9jID0gZWxlbS5kb2N1bWVudEVsZW1lbnQ7CgoJCQkJCS8vIEVpdGhlciBzY3JvbGxbV2lkdGgvSGVpZ2h0XSBvciBvZmZzZXRbV2lkdGgvSGVpZ2h0XSBvciBjbGllbnRbV2lkdGgvSGVpZ2h0XSwgd2hpY2hldmVyIGlzIGdyZWF0ZXN0CgkJCQkJLy8gdW5mb3J0dW5hdGVseSwgdGhpcyBjYXVzZXMgYnVnICMzODM4IGluIElFNi84IG9ubHksIGJ1dCB0aGVyZSBpcyBjdXJyZW50bHkgbm8gZ29vZCwgc21hbGwgd2F5IHRvIGZpeCBpdC4KCQkJCQlyZXR1cm4gTWF0aC5tYXgoCgkJCQkJCWVsZW0uYm9keVsgInNjcm9sbCIgKyBuYW1lIF0sIGRvY1sgInNjcm9sbCIgKyBuYW1lIF0sCgkJCQkJCWVsZW0uYm9keVsgIm9mZnNldCIgKyBuYW1lIF0sIGRvY1sgIm9mZnNldCIgKyBuYW1lIF0sCgkJCQkJCWRvY1sgImNsaWVudCIgKyBuYW1lIF0KCQkJCQkpOwoJCQkJfQoKCQkJCXJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8KCQkJCQkvLyBHZXQgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50LCByZXF1ZXN0aW5nIGJ1dCBub3QgZm9yY2luZyBwYXJzZUZsb2F0CgkJCQkJalF1ZXJ5LmNzcyggZWxlbSwgdHlwZSwgdmFsdWUsIGV4dHJhICkgOgoKCQkJCQkvLyBTZXQgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50CgkJCQkJalF1ZXJ5LnN0eWxlKCBlbGVtLCB0eXBlLCB2YWx1ZSwgZXh0cmEgKTsKCQkJfSwgdHlwZSwgY2hhaW5hYmxlID8gbWFyZ2luIDogdW5kZWZpbmVkLCBjaGFpbmFibGUsIG51bGwgKTsKCQl9OwoJfSk7Cn0pOwovLyBFeHBvc2UgalF1ZXJ5IHRvIHRoZSBnbG9iYWwgb2JqZWN0CndpbmRvdy5qUXVlcnkgPSB3aW5kb3cuJCA9IGpRdWVyeTsKCi8vIEV4cG9zZSBqUXVlcnkgYXMgYW4gQU1EIG1vZHVsZSwgYnV0IG9ubHkgZm9yIEFNRCBsb2FkZXJzIHRoYXQKLy8gdW5kZXJzdGFuZCB0aGUgaXNzdWVzIHdpdGggbG9hZGluZyBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBqUXVlcnkKLy8gaW4gYSBwYWdlIHRoYXQgYWxsIG1pZ2h0IGNhbGwgZGVmaW5lKCkuIFRoZSBsb2FkZXIgd2lsbCBpbmRpY2F0ZQovLyB0aGV5IGhhdmUgc3BlY2lhbCBhbGxvd2FuY2VzIGZvciBtdWx0aXBsZSBqUXVlcnkgdmVyc2lvbnMgYnkKLy8gc3BlY2lmeWluZyBkZWZpbmUuYW1kLmpRdWVyeSA9IHRydWUuIFJlZ2lzdGVyIGFzIGEgbmFtZWQgbW9kdWxlLAovLyBzaW5jZSBqUXVlcnkgY2FuIGJlIGNvbmNhdGVuYXRlZCB3aXRoIG90aGVyIGZpbGVzIHRoYXQgbWF5IHVzZSBkZWZpbmUsCi8vIGJ1dCBub3QgdXNlIGEgcHJvcGVyIGNvbmNhdGVuYXRpb24gc2NyaXB0IHRoYXQgdW5kZXJzdGFuZHMgYW5vbnltb3VzCi8vIEFNRCBtb2R1bGVzLiBBIG5hbWVkIEFNRCBpcyBzYWZlc3QgYW5kIG1vc3Qgcm9idXN0IHdheSB0byByZWdpc3Rlci4KLy8gTG93ZXJjYXNlIGpxdWVyeSBpcyB1c2VkIGJlY2F1c2UgQU1EIG1vZHVsZSBuYW1lcyBhcmUgZGVyaXZlZCBmcm9tCi8vIGZpbGUgbmFtZXMsIGFuZCBqUXVlcnkgaXMgbm9ybWFsbHkgZGVsaXZlcmVkIGluIGEgbG93ZXJjYXNlIGZpbGUgbmFtZS4KLy8gRG8gdGhpcyBhZnRlciBjcmVhdGluZyB0aGUgZ2xvYmFsIHNvIHRoYXQgaWYgYW4gQU1EIG1vZHVsZSB3YW50cyB0byBjYWxsCi8vIG5vQ29uZmxpY3QgdG8gaGlkZSB0aGlzIHZlcnNpb24gb2YgalF1ZXJ5LCBpdCB3aWxsIHdvcmsuCmlmICggdHlwZW9mIGRlZmluZSA9PT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kICYmIGRlZmluZS5hbWQualF1ZXJ5ICkgewoJZGVmaW5lKCAianF1ZXJ5IiwgW10sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGpRdWVyeTsgfSApOwp9Cgp9KSggd2luZG93ICk7Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/js/jquery-ui-1.9.2.custom.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIGpRdWVyeSBVSSAtIHYxLjkuMiAtIDIwMTItMTItMTMKKiBodHRwOi8vanF1ZXJ5dWkuY29tCiogSW5jbHVkZXM6IGpxdWVyeS51aS5jb3JlLmpzLCBqcXVlcnkudWkud2lkZ2V0LmpzLCBqcXVlcnkudWkubW91c2UuanMsIGpxdWVyeS51aS5wb3NpdGlvbi5qcywganF1ZXJ5LnVpLmRyYWdnYWJsZS5qcywganF1ZXJ5LnVpLmRyb3BwYWJsZS5qcywganF1ZXJ5LnVpLnJlc2l6YWJsZS5qcywganF1ZXJ5LnVpLnNlbGVjdGFibGUuanMsIGpxdWVyeS51aS5zb3J0YWJsZS5qcywganF1ZXJ5LnVpLmFjY29yZGlvbi5qcywganF1ZXJ5LnVpLmF1dG9jb21wbGV0ZS5qcywganF1ZXJ5LnVpLmJ1dHRvbi5qcywganF1ZXJ5LnVpLmRhdGVwaWNrZXIuanMsIGpxdWVyeS51aS5kaWFsb2cuanMsIGpxdWVyeS51aS5tZW51LmpzLCBqcXVlcnkudWkucHJvZ3Jlc3NiYXIuanMsIGpxdWVyeS51aS5zbGlkZXIuanMsIGpxdWVyeS51aS5zcGlubmVyLmpzLCBqcXVlcnkudWkudGFicy5qcywganF1ZXJ5LnVpLnRvb2x0aXAuanMsIGpxdWVyeS51aS5lZmZlY3QuanMsIGpxdWVyeS51aS5lZmZlY3QtYmxpbmQuanMsIGpxdWVyeS51aS5lZmZlY3QtYm91bmNlLmpzLCBqcXVlcnkudWkuZWZmZWN0LWNsaXAuanMsIGpxdWVyeS51aS5lZmZlY3QtZHJvcC5qcywganF1ZXJ5LnVpLmVmZmVjdC1leHBsb2RlLmpzLCBqcXVlcnkudWkuZWZmZWN0LWZhZGUuanMsIGpxdWVyeS51aS5lZmZlY3QtZm9sZC5qcywganF1ZXJ5LnVpLmVmZmVjdC1oaWdobGlnaHQuanMsIGpxdWVyeS51aS5lZmZlY3QtcHVsc2F0ZS5qcywganF1ZXJ5LnVpLmVmZmVjdC1zY2FsZS5qcywganF1ZXJ5LnVpLmVmZmVjdC1zaGFrZS5qcywganF1ZXJ5LnVpLmVmZmVjdC1zbGlkZS5qcywganF1ZXJ5LnVpLmVmZmVjdC10cmFuc2Zlci5qcwoqIENvcHlyaWdodCAoYykgMjAxMiBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIExpY2Vuc2VkIE1JVCAqLwoKKGZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gaSh0LG4pe3ZhciByLGksbyx1PXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iYXJlYSI9PT11PyhyPXQucGFyZW50Tm9kZSxpPXIubmFtZSwhdC5ocmVmfHwhaXx8ci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT09Im1hcCI/ITE6KG89ZSgiaW1nW3VzZW1hcD0jIitpKyJdIilbMF0sISFvJiZzKG8pKSk6KC9pbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9ufG9iamVjdC8udGVzdCh1KT8hdC5kaXNhYmxlZDoiYSI9PT11P3QuaHJlZnx8bjpuKSYmcyh0KX1mdW5jdGlvbiBzKHQpe3JldHVybiBlLmV4cHIuZmlsdGVycy52aXNpYmxlKHQpJiYhZSh0KS5wYXJlbnRzKCkuYW5kU2VsZigpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiBlLmNzcyh0aGlzLCJ2aXNpYmlsaXR5Iik9PT0iaGlkZGVuIn0pLmxlbmd0aH12YXIgbj0wLHI9L151aS1pZC1cZCskLztlLnVpPWUudWl8fHt9O2lmKGUudWkudmVyc2lvbilyZXR1cm47ZS5leHRlbmQoZS51aSx7dmVyc2lvbjoiMS45LjIiLGtleUNvZGU6e0JBQ0tTUEFDRTo4LENPTU1BOjE4OCxERUxFVEU6NDYsRE9XTjo0MCxFTkQ6MzUsRU5URVI6MTMsRVNDQVBFOjI3LEhPTUU6MzYsTEVGVDozNyxOVU1QQURfQUREOjEwNyxOVU1QQURfREVDSU1BTDoxMTAsTlVNUEFEX0RJVklERToxMTEsTlVNUEFEX0VOVEVSOjEwOCxOVU1QQURfTVVMVElQTFk6MTA2LE5VTVBBRF9TVUJUUkFDVDoxMDksUEFHRV9ET1dOOjM0LFBBR0VfVVA6MzMsUEVSSU9EOjE5MCxSSUdIVDozOSxTUEFDRTozMixUQUI6OSxVUDozOH19KSxlLmZuLmV4dGVuZCh7X2ZvY3VzOmUuZm4uZm9jdXMsZm9jdXM6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdHlwZW9mIHQ9PSJudW1iZXIiP3RoaXMuZWFjaChmdW5jdGlvbigpe3ZhciByPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2UocikuZm9jdXMoKSxuJiZuLmNhbGwocil9LHQpfSk6dGhpcy5fZm9jdXMuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxzY3JvbGxQYXJlbnQ6ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gZS51aS5pZSYmLyhzdGF0aWN8cmVsYXRpdmUpLy50ZXN0KHRoaXMuY3NzKCJwb3NpdGlvbiIpKXx8L2Fic29sdXRlLy50ZXN0KHRoaXMuY3NzKCJwb3NpdGlvbiIpKT90PXRoaXMucGFyZW50cygpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybi8ocmVsYXRpdmV8YWJzb2x1dGV8Zml4ZWQpLy50ZXN0KGUuY3NzKHRoaXMsInBvc2l0aW9uIikpJiYvKGF1dG98c2Nyb2xsKS8udGVzdChlLmNzcyh0aGlzLCJvdmVyZmxvdyIpK2UuY3NzKHRoaXMsIm92ZXJmbG93LXkiKStlLmNzcyh0aGlzLCJvdmVyZmxvdy14IikpfSkuZXEoMCk6dD10aGlzLnBhcmVudHMoKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4vKGF1dG98c2Nyb2xsKS8udGVzdChlLmNzcyh0aGlzLCJvdmVyZmxvdyIpK2UuY3NzKHRoaXMsIm92ZXJmbG93LXkiKStlLmNzcyh0aGlzLCJvdmVyZmxvdy14IikpfSkuZXEoMCksL2ZpeGVkLy50ZXN0KHRoaXMuY3NzKCJwb3NpdGlvbiIpKXx8IXQubGVuZ3RoP2UoZG9jdW1lbnQpOnR9LHpJbmRleDpmdW5jdGlvbihuKXtpZihuIT09dClyZXR1cm4gdGhpcy5jc3MoInpJbmRleCIsbik7aWYodGhpcy5sZW5ndGgpe3ZhciByPWUodGhpc1swXSksaSxzO3doaWxlKHIubGVuZ3RoJiZyWzBdIT09ZG9jdW1lbnQpe2k9ci5jc3MoInBvc2l0aW9uIik7aWYoaT09PSJhYnNvbHV0ZSJ8fGk9PT0icmVsYXRpdmUifHxpPT09ImZpeGVkIil7cz1wYXJzZUludChyLmNzcygiekluZGV4IiksMTApO2lmKCFpc05hTihzKSYmcyE9PTApcmV0dXJuIHN9cj1yLnBhcmVudCgpfX1yZXR1cm4gMH0sdW5pcXVlSWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5pZHx8KHRoaXMuaWQ9InVpLWlkLSIrICsrbil9KX0scmVtb3ZlVW5pcXVlSWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ci50ZXN0KHRoaXMuaWQpJiZlKHRoaXMpLnJlbW92ZUF0dHIoImlkIil9KX19KSxlLmV4dGVuZChlLmV4cHJbIjoiXSx7ZGF0YTplLmV4cHIuY3JlYXRlUHNldWRvP2UuZXhwci5jcmVhdGVQc2V1ZG8oZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiEhZS5kYXRhKG4sdCl9fSk6ZnVuY3Rpb24odCxuLHIpe3JldHVybiEhZS5kYXRhKHQsclszXSl9LGZvY3VzYWJsZTpmdW5jdGlvbih0KXtyZXR1cm4gaSh0LCFpc05hTihlLmF0dHIodCwidGFiaW5kZXgiKSkpfSx0YWJiYWJsZTpmdW5jdGlvbih0KXt2YXIgbj1lLmF0dHIodCwidGFiaW5kZXgiKSxyPWlzTmFOKG4pO3JldHVybihyfHxuPj0wKSYmaSh0LCFyKX19KSxlKGZ1bmN0aW9uKCl7dmFyIHQ9ZG9jdW1lbnQuYm9keSxuPXQuYXBwZW5kQ2hpbGQobj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSk7bi5vZmZzZXRIZWlnaHQsZS5leHRlbmQobi5zdHlsZSx7bWluSGVpZ2h0OiIxMDBweCIsaGVpZ2h0OiJhdXRvIixwYWRkaW5nOjAsYm9yZGVyV2lkdGg6MH0pLGUuc3VwcG9ydC5taW5IZWlnaHQ9bi5vZmZzZXRIZWlnaHQ9PT0xMDAsZS5zdXBwb3J0LnNlbGVjdHN0YXJ0PSJvbnNlbGVjdHN0YXJ0ImluIG4sdC5yZW1vdmVDaGlsZChuKS5zdHlsZS5kaXNwbGF5PSJub25lIn0pLGUoIjxhPiIpLm91dGVyV2lkdGgoMSkuanF1ZXJ5fHxlLmVhY2goWyJXaWR0aCIsIkhlaWdodCJdLGZ1bmN0aW9uKG4scil7ZnVuY3Rpb24gdSh0LG4scixzKXtyZXR1cm4gZS5lYWNoKGksZnVuY3Rpb24oKXtuLT1wYXJzZUZsb2F0KGUuY3NzKHQsInBhZGRpbmciK3RoaXMpKXx8MCxyJiYobi09cGFyc2VGbG9hdChlLmNzcyh0LCJib3JkZXIiK3RoaXMrIldpZHRoIikpfHwwKSxzJiYobi09cGFyc2VGbG9hdChlLmNzcyh0LCJtYXJnaW4iK3RoaXMpKXx8MCl9KSxufXZhciBpPXI9PT0iV2lkdGgiP1siTGVmdCIsIlJpZ2h0Il06WyJUb3AiLCJCb3R0b20iXSxzPXIudG9Mb3dlckNhc2UoKSxvPXtpbm5lcldpZHRoOmUuZm4uaW5uZXJXaWR0aCxpbm5lckhlaWdodDplLmZuLmlubmVySGVpZ2h0LG91dGVyV2lkdGg6ZS5mbi5vdXRlcldpZHRoLG91dGVySGVpZ2h0OmUuZm4ub3V0ZXJIZWlnaHR9O2UuZm5bImlubmVyIityXT1mdW5jdGlvbihuKXtyZXR1cm4gbj09PXQ/b1siaW5uZXIiK3JdLmNhbGwodGhpcyk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZSh0aGlzKS5jc3Mocyx1KHRoaXMsbikrInB4Iil9KX0sZS5mblsib3V0ZXIiK3JdPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHR5cGVvZiB0IT0ibnVtYmVyIj9vWyJvdXRlciIrcl0uY2FsbCh0aGlzLHQpOnRoaXMuZWFjaChmdW5jdGlvbigpe2UodGhpcykuY3NzKHMsdSh0aGlzLHQsITAsbikrInB4Iil9KX19KSxlKCI8YT4iKS5kYXRhKCJhLWIiLCJhIikucmVtb3ZlRGF0YSgiYS1iIikuZGF0YSgiYS1iIikmJihlLmZuLnJlbW92ZURhdGE9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3QuY2FsbCh0aGlzLGUuY2FtZWxDYXNlKG4pKTp0LmNhbGwodGhpcyl9fShlLmZuLnJlbW92ZURhdGEpKSxmdW5jdGlvbigpe3ZhciB0PS9tc2llIChbXHcuXSspLy5leGVjKG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKSl8fFtdO2UudWkuaWU9dC5sZW5ndGg/ITA6ITEsZS51aS5pZTY9cGFyc2VGbG9hdCh0WzFdLDEwKT09PTZ9KCksZS5mbi5leHRlbmQoe2Rpc2FibGVTZWxlY3Rpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iaW5kKChlLnN1cHBvcnQuc2VsZWN0c3RhcnQ/InNlbGVjdHN0YXJ0IjoibW91c2Vkb3duIikrIi51aS1kaXNhYmxlU2VsZWN0aW9uIixmdW5jdGlvbihlKXtlLnByZXZlbnREZWZhdWx0KCl9KX0sZW5hYmxlU2VsZWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5iaW5kKCIudWktZGlzYWJsZVNlbGVjdGlvbiIpfX0pLGUuZXh0ZW5kKGUudWkse3BsdWdpbjp7YWRkOmZ1bmN0aW9uKHQsbixyKXt2YXIgaSxzPWUudWlbdF0ucHJvdG90eXBlO2ZvcihpIGluIHIpcy5wbHVnaW5zW2ldPXMucGx1Z2luc1tpXXx8W10scy5wbHVnaW5zW2ldLnB1c2goW24scltpXV0pfSxjYWxsOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPWUucGx1Z2luc1t0XTtpZighaXx8IWUuZWxlbWVudFswXS5wYXJlbnROb2RlfHxlLmVsZW1lbnRbMF0ucGFyZW50Tm9kZS5ub2RlVHlwZT09PTExKXJldHVybjtmb3Iocj0wO3I8aS5sZW5ndGg7cisrKWUub3B0aW9uc1tpW3JdWzBdXSYmaVtyXVsxXS5hcHBseShlLmVsZW1lbnQsbil9fSxjb250YWluczplLmNvbnRhaW5zLGhhc1Njcm9sbDpmdW5jdGlvbih0LG4pe2lmKGUodCkuY3NzKCJvdmVyZmxvdyIpPT09ImhpZGRlbiIpcmV0dXJuITE7dmFyIHI9biYmbj09PSJsZWZ0Ij8ic2Nyb2xsTGVmdCI6InNjcm9sbFRvcCIsaT0hMTtyZXR1cm4gdFtyXT4wPyEwOih0W3JdPTEsaT10W3JdPjAsdFtyXT0wLGkpfSxpc092ZXJBeGlzOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT50JiZlPHQrbn0saXNPdmVyOmZ1bmN0aW9uKHQsbixyLGkscyxvKXtyZXR1cm4gZS51aS5pc092ZXJBeGlzKHQscixzKSYmZS51aS5pc092ZXJBeGlzKG4saSxvKX19KX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGUsdCl7dmFyIG49MCxyPUFycmF5LnByb3RvdHlwZS5zbGljZSxpPWUuY2xlYW5EYXRhO2UuY2xlYW5EYXRhPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbj0wLHI7KHI9dFtuXSkhPW51bGw7bisrKXRyeXtlKHIpLnRyaWdnZXJIYW5kbGVyKCJyZW1vdmUiKX1jYXRjaChzKXt9aSh0KX0sZS53aWRnZXQ9ZnVuY3Rpb24odCxuLHIpe3ZhciBpLHMsbyx1LGE9dC5zcGxpdCgiLiIpWzBdO3Q9dC5zcGxpdCgiLiIpWzFdLGk9YSsiLSIrdCxyfHwocj1uLG49ZS5XaWRnZXQpLGUuZXhwclsiOiJdW2kudG9Mb3dlckNhc2UoKV09ZnVuY3Rpb24odCl7cmV0dXJuISFlLmRhdGEodCxpKX0sZVthXT1lW2FdfHx7fSxzPWVbYV1bdF0sbz1lW2FdW3RdPWZ1bmN0aW9uKGUsdCl7aWYoIXRoaXMuX2NyZWF0ZVdpZGdldClyZXR1cm4gbmV3IG8oZSx0KTthcmd1bWVudHMubGVuZ3RoJiZ0aGlzLl9jcmVhdGVXaWRnZXQoZSx0KX0sZS5leHRlbmQobyxzLHt2ZXJzaW9uOnIudmVyc2lvbixfcHJvdG86ZS5leHRlbmQoe30sciksX2NoaWxkQ29uc3RydWN0b3JzOltdfSksdT1uZXcgbix1Lm9wdGlvbnM9ZS53aWRnZXQuZXh0ZW5kKHt9LHUub3B0aW9ucyksZS5lYWNoKHIsZnVuY3Rpb24odCxpKXtlLmlzRnVuY3Rpb24oaSkmJihyW3RdPWZ1bmN0aW9uKCl7dmFyIGU9ZnVuY3Rpb24oKXtyZXR1cm4gbi5wcm90b3R5cGVbdF0uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxyPWZ1bmN0aW9uKGUpe3JldHVybiBuLnByb3RvdHlwZVt0XS5hcHBseSh0aGlzLGUpfTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9zdXBlcixuPXRoaXMuX3N1cGVyQXBwbHkscztyZXR1cm4gdGhpcy5fc3VwZXI9ZSx0aGlzLl9zdXBlckFwcGx5PXIscz1pLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl9zdXBlcj10LHRoaXMuX3N1cGVyQXBwbHk9bixzfX0oKSl9KSxvLnByb3RvdHlwZT1lLndpZGdldC5leHRlbmQodSx7d2lkZ2V0RXZlbnRQcmVmaXg6cz91LndpZGdldEV2ZW50UHJlZml4OnR9LHIse2NvbnN0cnVjdG9yOm8sbmFtZXNwYWNlOmEsd2lkZ2V0TmFtZTp0LHdpZGdldEJhc2VDbGFzczppLHdpZGdldEZ1bGxOYW1lOml9KSxzPyhlLmVhY2gocy5fY2hpbGRDb25zdHJ1Y3RvcnMsZnVuY3Rpb24odCxuKXt2YXIgcj1uLnByb3RvdHlwZTtlLndpZGdldChyLm5hbWVzcGFjZSsiLiIrci53aWRnZXROYW1lLG8sbi5fcHJvdG8pfSksZGVsZXRlIHMuX2NoaWxkQ29uc3RydWN0b3JzKTpuLl9jaGlsZENvbnN0cnVjdG9ycy5wdXNoKG8pLGUud2lkZ2V0LmJyaWRnZSh0LG8pfSxlLndpZGdldC5leHRlbmQ9ZnVuY3Rpb24obil7dmFyIGk9ci5jYWxsKGFyZ3VtZW50cywxKSxzPTAsbz1pLmxlbmd0aCx1LGE7Zm9yKDtzPG87cysrKWZvcih1IGluIGlbc10pYT1pW3NdW3VdLGlbc10uaGFzT3duUHJvcGVydHkodSkmJmEhPT10JiYoZS5pc1BsYWluT2JqZWN0KGEpP25bdV09ZS5pc1BsYWluT2JqZWN0KG5bdV0pP2Uud2lkZ2V0LmV4dGVuZCh7fSxuW3VdLGEpOmUud2lkZ2V0LmV4dGVuZCh7fSxhKTpuW3VdPWEpO3JldHVybiBufSxlLndpZGdldC5icmlkZ2U9ZnVuY3Rpb24obixpKXt2YXIgcz1pLnByb3RvdHlwZS53aWRnZXRGdWxsTmFtZXx8bjtlLmZuW25dPWZ1bmN0aW9uKG8pe3ZhciB1PXR5cGVvZiBvPT0ic3RyaW5nIixhPXIuY2FsbChhcmd1bWVudHMsMSksZj10aGlzO3JldHVybiBvPSF1JiZhLmxlbmd0aD9lLndpZGdldC5leHRlbmQuYXBwbHkobnVsbCxbb10uY29uY2F0KGEpKTpvLHU/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHIsaT1lLmRhdGEodGhpcyxzKTtpZighaSlyZXR1cm4gZS5lcnJvcigiY2Fubm90IGNhbGwgbWV0aG9kcyBvbiAiK24rIiBwcmlvciB0byBpbml0aWFsaXphdGlvbjsgIisiYXR0ZW1wdGVkIHRvIGNhbGwgbWV0aG9kICciK28rIiciKTtpZighZS5pc0Z1bmN0aW9uKGlbb10pfHxvLmNoYXJBdCgwKT09PSJfIilyZXR1cm4gZS5lcnJvcigibm8gc3VjaCBtZXRob2QgJyIrbysiJyBmb3IgIituKyIgd2lkZ2V0IGluc3RhbmNlIik7cj1pW29dLmFwcGx5KGksYSk7aWYociE9PWkmJnIhPT10KXJldHVybiBmPXImJnIuanF1ZXJ5P2YucHVzaFN0YWNrKHIuZ2V0KCkpOnIsITF9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lLmRhdGEodGhpcyxzKTt0P3Qub3B0aW9uKG98fHt9KS5faW5pdCgpOmUuZGF0YSh0aGlzLHMsbmV3IGkobyx0aGlzKSl9KSxmfX0sZS5XaWRnZXQ9ZnVuY3Rpb24oKXt9LGUuV2lkZ2V0Ll9jaGlsZENvbnN0cnVjdG9ycz1bXSxlLldpZGdldC5wcm90b3R5cGU9e3dpZGdldE5hbWU6IndpZGdldCIsd2lkZ2V0RXZlbnRQcmVmaXg6IiIsZGVmYXVsdEVsZW1lbnQ6IjxkaXY+IixvcHRpb25zOntkaXNhYmxlZDohMSxjcmVhdGU6bnVsbH0sX2NyZWF0ZVdpZGdldDpmdW5jdGlvbih0LHIpe3I9ZShyfHx0aGlzLmRlZmF1bHRFbGVtZW50fHx0aGlzKVswXSx0aGlzLmVsZW1lbnQ9ZShyKSx0aGlzLnV1aWQ9bisrLHRoaXMuZXZlbnROYW1lc3BhY2U9Ii4iK3RoaXMud2lkZ2V0TmFtZSt0aGlzLnV1aWQsdGhpcy5vcHRpb25zPWUud2lkZ2V0LmV4dGVuZCh7fSx0aGlzLm9wdGlvbnMsdGhpcy5fZ2V0Q3JlYXRlT3B0aW9ucygpLHQpLHRoaXMuYmluZGluZ3M9ZSgpLHRoaXMuaG92ZXJhYmxlPWUoKSx0aGlzLmZvY3VzYWJsZT1lKCksciE9PXRoaXMmJihlLmRhdGEocix0aGlzLndpZGdldE5hbWUsdGhpcyksZS5kYXRhKHIsdGhpcy53aWRnZXRGdWxsTmFtZSx0aGlzKSx0aGlzLl9vbighMCx0aGlzLmVsZW1lbnQse3JlbW92ZTpmdW5jdGlvbihlKXtlLnRhcmdldD09PXImJnRoaXMuZGVzdHJveSgpfX0pLHRoaXMuZG9jdW1lbnQ9ZShyLnN0eWxlP3Iub3duZXJEb2N1bWVudDpyLmRvY3VtZW50fHxyKSx0aGlzLndpbmRvdz1lKHRoaXMuZG9jdW1lbnRbMF0uZGVmYXVsdFZpZXd8fHRoaXMuZG9jdW1lbnRbMF0ucGFyZW50V2luZG93KSksdGhpcy5fY3JlYXRlKCksdGhpcy5fdHJpZ2dlcigiY3JlYXRlIixudWxsLHRoaXMuX2dldENyZWF0ZUV2ZW50RGF0YSgpKSx0aGlzLl9pbml0KCl9LF9nZXRDcmVhdGVPcHRpb25zOmUubm9vcCxfZ2V0Q3JlYXRlRXZlbnREYXRhOmUubm9vcCxfY3JlYXRlOmUubm9vcCxfaW5pdDplLm5vb3AsZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuX2Rlc3Ryb3koKSx0aGlzLmVsZW1lbnQudW5iaW5kKHRoaXMuZXZlbnROYW1lc3BhY2UpLnJlbW92ZURhdGEodGhpcy53aWRnZXROYW1lKS5yZW1vdmVEYXRhKHRoaXMud2lkZ2V0RnVsbE5hbWUpLnJlbW92ZURhdGEoZS5jYW1lbENhc2UodGhpcy53aWRnZXRGdWxsTmFtZSkpLHRoaXMud2lkZ2V0KCkudW5iaW5kKHRoaXMuZXZlbnROYW1lc3BhY2UpLnJlbW92ZUF0dHIoImFyaWEtZGlzYWJsZWQiKS5yZW1vdmVDbGFzcyh0aGlzLndpZGdldEZ1bGxOYW1lKyItZGlzYWJsZWQgIisidWktc3RhdGUtZGlzYWJsZWQiKSx0aGlzLmJpbmRpbmdzLnVuYmluZCh0aGlzLmV2ZW50TmFtZXNwYWNlKSx0aGlzLmhvdmVyYWJsZS5yZW1vdmVDbGFzcygidWktc3RhdGUtaG92ZXIiKSx0aGlzLmZvY3VzYWJsZS5yZW1vdmVDbGFzcygidWktc3RhdGUtZm9jdXMiKX0sX2Rlc3Ryb3k6ZS5ub29wLHdpZGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnR9LG9wdGlvbjpmdW5jdGlvbihuLHIpe3ZhciBpPW4scyxvLHU7aWYoYXJndW1lbnRzLmxlbmd0aD09PTApcmV0dXJuIGUud2lkZ2V0LmV4dGVuZCh7fSx0aGlzLm9wdGlvbnMpO2lmKHR5cGVvZiBuPT0ic3RyaW5nIil7aT17fSxzPW4uc3BsaXQoIi4iKSxuPXMuc2hpZnQoKTtpZihzLmxlbmd0aCl7bz1pW25dPWUud2lkZ2V0LmV4dGVuZCh7fSx0aGlzLm9wdGlvbnNbbl0pO2Zvcih1PTA7dTxzLmxlbmd0aC0xO3UrKylvW3NbdV1dPW9bc1t1XV18fHt9LG89b1tzW3VdXTtuPXMucG9wKCk7aWYocj09PXQpcmV0dXJuIG9bbl09PT10P251bGw6b1tuXTtvW25dPXJ9ZWxzZXtpZihyPT09dClyZXR1cm4gdGhpcy5vcHRpb25zW25dPT09dD9udWxsOnRoaXMub3B0aW9uc1tuXTtpW25dPXJ9fXJldHVybiB0aGlzLl9zZXRPcHRpb25zKGkpLHRoaXN9LF9zZXRPcHRpb25zOmZ1bmN0aW9uKGUpe3ZhciB0O2Zvcih0IGluIGUpdGhpcy5fc2V0T3B0aW9uKHQsZVt0XSk7cmV0dXJuIHRoaXN9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5vcHRpb25zW2VdPXQsZT09PSJkaXNhYmxlZCImJih0aGlzLndpZGdldCgpLnRvZ2dsZUNsYXNzKHRoaXMud2lkZ2V0RnVsbE5hbWUrIi1kaXNhYmxlZCB1aS1zdGF0ZS1kaXNhYmxlZCIsISF0KS5hdHRyKCJhcmlhLWRpc2FibGVkIix0KSx0aGlzLmhvdmVyYWJsZS5yZW1vdmVDbGFzcygidWktc3RhdGUtaG92ZXIiKSx0aGlzLmZvY3VzYWJsZS5yZW1vdmVDbGFzcygidWktc3RhdGUtZm9jdXMiKSksdGhpc30sZW5hYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NldE9wdGlvbigiZGlzYWJsZWQiLCExKX0sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zZXRPcHRpb24oImRpc2FibGVkIiwhMCl9LF9vbjpmdW5jdGlvbih0LG4scil7dmFyIGkscz10aGlzO3R5cGVvZiB0IT0iYm9vbGVhbiImJihyPW4sbj10LHQ9ITEpLHI/KG49aT1lKG4pLHRoaXMuYmluZGluZ3M9dGhpcy5iaW5kaW5ncy5hZGQobikpOihyPW4sbj10aGlzLmVsZW1lbnQsaT10aGlzLndpZGdldCgpKSxlLmVhY2gocixmdW5jdGlvbihyLG8pe2Z1bmN0aW9uIHUoKXtpZighdCYmKHMub3B0aW9ucy5kaXNhYmxlZD09PSEwfHxlKHRoaXMpLmhhc0NsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIpKSlyZXR1cm47cmV0dXJuKHR5cGVvZiBvPT0ic3RyaW5nIj9zW29dOm8pLmFwcGx5KHMsYXJndW1lbnRzKX10eXBlb2YgbyE9InN0cmluZyImJih1Lmd1aWQ9by5ndWlkPW8uZ3VpZHx8dS5ndWlkfHxlLmd1aWQrKyk7dmFyIGE9ci5tYXRjaCgvXihcdyspXHMqKC4qKSQvKSxmPWFbMV0rcy5ldmVudE5hbWVzcGFjZSxsPWFbMl07bD9pLmRlbGVnYXRlKGwsZix1KTpuLmJpbmQoZix1KX0pfSxfb2ZmOmZ1bmN0aW9uKGUsdCl7dD0odHx8IiIpLnNwbGl0KCIgIikuam9pbih0aGlzLmV2ZW50TmFtZXNwYWNlKyIgIikrdGhpcy5ldmVudE5hbWVzcGFjZSxlLnVuYmluZCh0KS51bmRlbGVnYXRlKHQpfSxfZGVsYXk6ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKCl7cmV0dXJuKHR5cGVvZiBlPT0ic3RyaW5nIj9yW2VdOmUpLmFwcGx5KHIsYXJndW1lbnRzKX12YXIgcj10aGlzO3JldHVybiBzZXRUaW1lb3V0KG4sdHx8MCl9LF9ob3ZlcmFibGU6ZnVuY3Rpb24odCl7dGhpcy5ob3ZlcmFibGU9dGhpcy5ob3ZlcmFibGUuYWRkKHQpLHRoaXMuX29uKHQse21vdXNlZW50ZXI6ZnVuY3Rpb24odCl7ZSh0LmN1cnJlbnRUYXJnZXQpLmFkZENsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpfSxtb3VzZWxlYXZlOmZ1bmN0aW9uKHQpe2UodC5jdXJyZW50VGFyZ2V0KS5yZW1vdmVDbGFzcygidWktc3RhdGUtaG92ZXIiKX19KX0sX2ZvY3VzYWJsZTpmdW5jdGlvbih0KXt0aGlzLmZvY3VzYWJsZT10aGlzLmZvY3VzYWJsZS5hZGQodCksdGhpcy5fb24odCx7Zm9jdXNpbjpmdW5jdGlvbih0KXtlKHQuY3VycmVudFRhcmdldCkuYWRkQ2xhc3MoInVpLXN0YXRlLWZvY3VzIil9LGZvY3Vzb3V0OmZ1bmN0aW9uKHQpe2UodC5jdXJyZW50VGFyZ2V0KS5yZW1vdmVDbGFzcygidWktc3RhdGUtZm9jdXMiKX19KX0sX3RyaWdnZXI6ZnVuY3Rpb24odCxuLHIpe3ZhciBpLHMsbz10aGlzLm9wdGlvbnNbdF07cj1yfHx7fSxuPWUuRXZlbnQobiksbi50eXBlPSh0PT09dGhpcy53aWRnZXRFdmVudFByZWZpeD90OnRoaXMud2lkZ2V0RXZlbnRQcmVmaXgrdCkudG9Mb3dlckNhc2UoKSxuLnRhcmdldD10aGlzLmVsZW1lbnRbMF0scz1uLm9yaWdpbmFsRXZlbnQ7aWYocylmb3IoaSBpbiBzKWkgaW4gbnx8KG5baV09c1tpXSk7cmV0dXJuIHRoaXMuZWxlbWVudC50cmlnZ2VyKG4sciksIShlLmlzRnVuY3Rpb24obykmJm8uYXBwbHkodGhpcy5lbGVtZW50WzBdLFtuXS5jb25jYXQocikpPT09ITF8fG4uaXNEZWZhdWx0UHJldmVudGVkKCkpfX0sZS5lYWNoKHtzaG93OiJmYWRlSW4iLGhpZGU6ImZhZGVPdXQifSxmdW5jdGlvbih0LG4pe2UuV2lkZ2V0LnByb3RvdHlwZVsiXyIrdF09ZnVuY3Rpb24ocixpLHMpe3R5cGVvZiBpPT0ic3RyaW5nIiYmKGk9e2VmZmVjdDppfSk7dmFyIG8sdT1pP2k9PT0hMHx8dHlwZW9mIGk9PSJudW1iZXIiP246aS5lZmZlY3R8fG46dDtpPWl8fHt9LHR5cGVvZiBpPT0ibnVtYmVyIiYmKGk9e2R1cmF0aW9uOml9KSxvPSFlLmlzRW1wdHlPYmplY3QoaSksaS5jb21wbGV0ZT1zLGkuZGVsYXkmJnIuZGVsYXkoaS5kZWxheSksbyYmZS5lZmZlY3RzJiYoZS5lZmZlY3RzLmVmZmVjdFt1XXx8ZS51aUJhY2tDb21wYXQhPT0hMSYmZS5lZmZlY3RzW3VdKT9yW3RdKGkpOnUhPT10JiZyW3VdP3JbdV0oaS5kdXJhdGlvbixpLmVhc2luZyxzKTpyLnF1ZXVlKGZ1bmN0aW9uKG4pe2UodGhpcylbdF0oKSxzJiZzLmNhbGwoclswXSksbigpfSl9fSksZS51aUJhY2tDb21wYXQhPT0hMSYmKGUuV2lkZ2V0LnByb3RvdHlwZS5fZ2V0Q3JlYXRlT3B0aW9ucz1mdW5jdGlvbigpe3JldHVybiBlLm1ldGFkYXRhJiZlLm1ldGFkYXRhLmdldCh0aGlzLmVsZW1lbnRbMF0pW3RoaXMud2lkZ2V0TmFtZV19KX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGUsdCl7dmFyIG49ITE7ZShkb2N1bWVudCkubW91c2V1cChmdW5jdGlvbihlKXtuPSExfSksZS53aWRnZXQoInVpLm1vdXNlIix7dmVyc2lvbjoiMS45LjIiLG9wdGlvbnM6e2NhbmNlbDoiaW5wdXQsdGV4dGFyZWEsYnV0dG9uLHNlbGVjdCxvcHRpb24iLGRpc3RhbmNlOjEsZGVsYXk6MH0sX21vdXNlSW5pdDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5lbGVtZW50LmJpbmQoIm1vdXNlZG93bi4iK3RoaXMud2lkZ2V0TmFtZSxmdW5jdGlvbihlKXtyZXR1cm4gdC5fbW91c2VEb3duKGUpfSkuYmluZCgiY2xpY2suIit0aGlzLndpZGdldE5hbWUsZnVuY3Rpb24obil7aWYoITA9PT1lLmRhdGEobi50YXJnZXQsdC53aWRnZXROYW1lKyIucHJldmVudENsaWNrRXZlbnQiKSlyZXR1cm4gZS5yZW1vdmVEYXRhKG4udGFyZ2V0LHQud2lkZ2V0TmFtZSsiLnByZXZlbnRDbGlja0V2ZW50Iiksbi5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSwhMX0pLHRoaXMuc3RhcnRlZD0hMX0sX21vdXNlRGVzdHJveTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC51bmJpbmQoIi4iK3RoaXMud2lkZ2V0TmFtZSksdGhpcy5fbW91c2VNb3ZlRGVsZWdhdGUmJmUoZG9jdW1lbnQpLnVuYmluZCgibW91c2Vtb3ZlLiIrdGhpcy53aWRnZXROYW1lLHRoaXMuX21vdXNlTW92ZURlbGVnYXRlKS51bmJpbmQoIm1vdXNldXAuIit0aGlzLndpZGdldE5hbWUsdGhpcy5fbW91c2VVcERlbGVnYXRlKX0sX21vdXNlRG93bjpmdW5jdGlvbih0KXtpZihuKXJldHVybjt0aGlzLl9tb3VzZVN0YXJ0ZWQmJnRoaXMuX21vdXNlVXAodCksdGhpcy5fbW91c2VEb3duRXZlbnQ9dDt2YXIgcj10aGlzLGk9dC53aGljaD09PTEscz10eXBlb2YgdGhpcy5vcHRpb25zLmNhbmNlbD09InN0cmluZyImJnQudGFyZ2V0Lm5vZGVOYW1lP2UodC50YXJnZXQpLmNsb3Nlc3QodGhpcy5vcHRpb25zLmNhbmNlbCkubGVuZ3RoOiExO2lmKCFpfHxzfHwhdGhpcy5fbW91c2VDYXB0dXJlKHQpKXJldHVybiEwO3RoaXMubW91c2VEZWxheU1ldD0hdGhpcy5vcHRpb25zLmRlbGF5LHRoaXMubW91c2VEZWxheU1ldHx8KHRoaXMuX21vdXNlRGVsYXlUaW1lcj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5tb3VzZURlbGF5TWV0PSEwfSx0aGlzLm9wdGlvbnMuZGVsYXkpKTtpZih0aGlzLl9tb3VzZURpc3RhbmNlTWV0KHQpJiZ0aGlzLl9tb3VzZURlbGF5TWV0KHQpKXt0aGlzLl9tb3VzZVN0YXJ0ZWQ9dGhpcy5fbW91c2VTdGFydCh0KSE9PSExO2lmKCF0aGlzLl9tb3VzZVN0YXJ0ZWQpcmV0dXJuIHQucHJldmVudERlZmF1bHQoKSwhMH1yZXR1cm4hMD09PWUuZGF0YSh0LnRhcmdldCx0aGlzLndpZGdldE5hbWUrIi5wcmV2ZW50Q2xpY2tFdmVudCIpJiZlLnJlbW92ZURhdGEodC50YXJnZXQsdGhpcy53aWRnZXROYW1lKyIucHJldmVudENsaWNrRXZlbnQiKSx0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZT1mdW5jdGlvbihlKXtyZXR1cm4gci5fbW91c2VNb3ZlKGUpfSx0aGlzLl9tb3VzZVVwRGVsZWdhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHIuX21vdXNlVXAoZSl9LGUoZG9jdW1lbnQpLmJpbmQoIm1vdXNlbW92ZS4iK3RoaXMud2lkZ2V0TmFtZSx0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZSkuYmluZCgibW91c2V1cC4iK3RoaXMud2lkZ2V0TmFtZSx0aGlzLl9tb3VzZVVwRGVsZWdhdGUpLHQucHJldmVudERlZmF1bHQoKSxuPSEwLCEwfSxfbW91c2VNb3ZlOmZ1bmN0aW9uKHQpe3JldHVybiFlLnVpLmllfHxkb2N1bWVudC5kb2N1bWVudE1vZGU+PTl8fCEhdC5idXR0b24/dGhpcy5fbW91c2VTdGFydGVkPyh0aGlzLl9tb3VzZURyYWcodCksdC5wcmV2ZW50RGVmYXVsdCgpKToodGhpcy5fbW91c2VEaXN0YW5jZU1ldCh0KSYmdGhpcy5fbW91c2VEZWxheU1ldCh0KSYmKHRoaXMuX21vdXNlU3RhcnRlZD10aGlzLl9tb3VzZVN0YXJ0KHRoaXMuX21vdXNlRG93bkV2ZW50LHQpIT09ITEsdGhpcy5fbW91c2VTdGFydGVkP3RoaXMuX21vdXNlRHJhZyh0KTp0aGlzLl9tb3VzZVVwKHQpKSwhdGhpcy5fbW91c2VTdGFydGVkKTp0aGlzLl9tb3VzZVVwKHQpfSxfbW91c2VVcDpmdW5jdGlvbih0KXtyZXR1cm4gZShkb2N1bWVudCkudW5iaW5kKCJtb3VzZW1vdmUuIit0aGlzLndpZGdldE5hbWUsdGhpcy5fbW91c2VNb3ZlRGVsZWdhdGUpLnVuYmluZCgibW91c2V1cC4iK3RoaXMud2lkZ2V0TmFtZSx0aGlzLl9tb3VzZVVwRGVsZWdhdGUpLHRoaXMuX21vdXNlU3RhcnRlZCYmKHRoaXMuX21vdXNlU3RhcnRlZD0hMSx0LnRhcmdldD09PXRoaXMuX21vdXNlRG93bkV2ZW50LnRhcmdldCYmZS5kYXRhKHQudGFyZ2V0LHRoaXMud2lkZ2V0TmFtZSsiLnByZXZlbnRDbGlja0V2ZW50IiwhMCksdGhpcy5fbW91c2VTdG9wKHQpKSwhMX0sX21vdXNlRGlzdGFuY2VNZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgubWF4KE1hdGguYWJzKHRoaXMuX21vdXNlRG93bkV2ZW50LnBhZ2VYLWUucGFnZVgpLE1hdGguYWJzKHRoaXMuX21vdXNlRG93bkV2ZW50LnBhZ2VZLWUucGFnZVkpKT49dGhpcy5vcHRpb25zLmRpc3RhbmNlfSxfbW91c2VEZWxheU1ldDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5tb3VzZURlbGF5TWV0fSxfbW91c2VTdGFydDpmdW5jdGlvbihlKXt9LF9tb3VzZURyYWc6ZnVuY3Rpb24oZSl7fSxfbW91c2VTdG9wOmZ1bmN0aW9uKGUpe30sX21vdXNlQ2FwdHVyZTpmdW5jdGlvbihlKXtyZXR1cm4hMH19KX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gaChlLHQsbil7cmV0dXJuW3BhcnNlSW50KGVbMF0sMTApKihsLnRlc3QoZVswXSk/dC8xMDA6MSkscGFyc2VJbnQoZVsxXSwxMCkqKGwudGVzdChlWzFdKT9uLzEwMDoxKV19ZnVuY3Rpb24gcCh0LG4pe3JldHVybiBwYXJzZUludChlLmNzcyh0LG4pLDEwKXx8MH1lLnVpPWUudWl8fHt9O3ZhciBuLHI9TWF0aC5tYXgsaT1NYXRoLmFicyxzPU1hdGgucm91bmQsbz0vbGVmdHxjZW50ZXJ8cmlnaHQvLHU9L3RvcHxjZW50ZXJ8Ym90dG9tLyxhPS9bXCtcLV1cZCslPy8sZj0vXlx3Ky8sbD0vJSQvLGM9ZS5mbi5wb3NpdGlvbjtlLnBvc2l0aW9uPXtzY3JvbGxiYXJXaWR0aDpmdW5jdGlvbigpe2lmKG4hPT10KXJldHVybiBuO3ZhciByLGkscz1lKCI8ZGl2IHN0eWxlPSdkaXNwbGF5OmJsb2NrO3dpZHRoOjUwcHg7aGVpZ2h0OjUwcHg7b3ZlcmZsb3c6aGlkZGVuOyc+PGRpdiBzdHlsZT0naGVpZ2h0OjEwMHB4O3dpZHRoOmF1dG87Jz48L2Rpdj48L2Rpdj4iKSxvPXMuY2hpbGRyZW4oKVswXTtyZXR1cm4gZSgiYm9keSIpLmFwcGVuZChzKSxyPW8ub2Zmc2V0V2lkdGgscy5jc3MoIm92ZXJmbG93Iiwic2Nyb2xsIiksaT1vLm9mZnNldFdpZHRoLHI9PT1pJiYoaT1zWzBdLmNsaWVudFdpZHRoKSxzLnJlbW92ZSgpLG49ci1pfSxnZXRTY3JvbGxJbmZvOmZ1bmN0aW9uKHQpe3ZhciBuPXQuaXNXaW5kb3c/IiI6dC5lbGVtZW50LmNzcygib3ZlcmZsb3cteCIpLHI9dC5pc1dpbmRvdz8iIjp0LmVsZW1lbnQuY3NzKCJvdmVyZmxvdy15IiksaT1uPT09InNjcm9sbCJ8fG49PT0iYXV0byImJnQud2lkdGg8dC5lbGVtZW50WzBdLnNjcm9sbFdpZHRoLHM9cj09PSJzY3JvbGwifHxyPT09ImF1dG8iJiZ0LmhlaWdodDx0LmVsZW1lbnRbMF0uc2Nyb2xsSGVpZ2h0O3JldHVybnt3aWR0aDppP2UucG9zaXRpb24uc2Nyb2xsYmFyV2lkdGgoKTowLGhlaWdodDpzP2UucG9zaXRpb24uc2Nyb2xsYmFyV2lkdGgoKTowfX0sZ2V0V2l0aGluSW5mbzpmdW5jdGlvbih0KXt2YXIgbj1lKHR8fHdpbmRvdykscj1lLmlzV2luZG93KG5bMF0pO3JldHVybntlbGVtZW50Om4saXNXaW5kb3c6cixvZmZzZXQ6bi5vZmZzZXQoKXx8e2xlZnQ6MCx0b3A6MH0sc2Nyb2xsTGVmdDpuLnNjcm9sbExlZnQoKSxzY3JvbGxUb3A6bi5zY3JvbGxUb3AoKSx3aWR0aDpyP24ud2lkdGgoKTpuLm91dGVyV2lkdGgoKSxoZWlnaHQ6cj9uLmhlaWdodCgpOm4ub3V0ZXJIZWlnaHQoKX19fSxlLmZuLnBvc2l0aW9uPWZ1bmN0aW9uKHQpe2lmKCF0fHwhdC5vZilyZXR1cm4gYy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dD1lLmV4dGVuZCh7fSx0KTt2YXIgbixsLGQsdixtLGc9ZSh0Lm9mKSx5PWUucG9zaXRpb24uZ2V0V2l0aGluSW5mbyh0LndpdGhpbiksYj1lLnBvc2l0aW9uLmdldFNjcm9sbEluZm8oeSksdz1nWzBdLEU9KHQuY29sbGlzaW9ufHwiZmxpcCIpLnNwbGl0KCIgIiksUz17fTtyZXR1cm4gdy5ub2RlVHlwZT09PTk/KGw9Zy53aWR0aCgpLGQ9Zy5oZWlnaHQoKSx2PXt0b3A6MCxsZWZ0OjB9KTplLmlzV2luZG93KHcpPyhsPWcud2lkdGgoKSxkPWcuaGVpZ2h0KCksdj17dG9wOmcuc2Nyb2xsVG9wKCksbGVmdDpnLnNjcm9sbExlZnQoKX0pOncucHJldmVudERlZmF1bHQ/KHQuYXQ9ImxlZnQgdG9wIixsPWQ9MCx2PXt0b3A6dy5wYWdlWSxsZWZ0OncucGFnZVh9KToobD1nLm91dGVyV2lkdGgoKSxkPWcub3V0ZXJIZWlnaHQoKSx2PWcub2Zmc2V0KCkpLG09ZS5leHRlbmQoe30sdiksZS5lYWNoKFsibXkiLCJhdCJdLGZ1bmN0aW9uKCl7dmFyIGU9KHRbdGhpc118fCIiKS5zcGxpdCgiICIpLG4scjtlLmxlbmd0aD09PTEmJihlPW8udGVzdChlWzBdKT9lLmNvbmNhdChbImNlbnRlciJdKTp1LnRlc3QoZVswXSk/WyJjZW50ZXIiXS5jb25jYXQoZSk6WyJjZW50ZXIiLCJjZW50ZXIiXSksZVswXT1vLnRlc3QoZVswXSk/ZVswXToiY2VudGVyIixlWzFdPXUudGVzdChlWzFdKT9lWzFdOiJjZW50ZXIiLG49YS5leGVjKGVbMF0pLHI9YS5leGVjKGVbMV0pLFNbdGhpc109W24/blswXTowLHI/clswXTowXSx0W3RoaXNdPVtmLmV4ZWMoZVswXSlbMF0sZi5leGVjKGVbMV0pWzBdXX0pLEUubGVuZ3RoPT09MSYmKEVbMV09RVswXSksdC5hdFswXT09PSJyaWdodCI/bS5sZWZ0Kz1sOnQuYXRbMF09PT0iY2VudGVyIiYmKG0ubGVmdCs9bC8yKSx0LmF0WzFdPT09ImJvdHRvbSI/bS50b3ArPWQ6dC5hdFsxXT09PSJjZW50ZXIiJiYobS50b3ArPWQvMiksbj1oKFMuYXQsbCxkKSxtLmxlZnQrPW5bMF0sbS50b3ArPW5bMV0sdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIG8sdSxhPWUodGhpcyksZj1hLm91dGVyV2lkdGgoKSxjPWEub3V0ZXJIZWlnaHQoKSx3PXAodGhpcywibWFyZ2luTGVmdCIpLHg9cCh0aGlzLCJtYXJnaW5Ub3AiKSxUPWYrdytwKHRoaXMsIm1hcmdpblJpZ2h0IikrYi53aWR0aCxOPWMreCtwKHRoaXMsIm1hcmdpbkJvdHRvbSIpK2IuaGVpZ2h0LEM9ZS5leHRlbmQoe30sbSksaz1oKFMubXksYS5vdXRlcldpZHRoKCksYS5vdXRlckhlaWdodCgpKTt0Lm15WzBdPT09InJpZ2h0Ij9DLmxlZnQtPWY6dC5teVswXT09PSJjZW50ZXIiJiYoQy5sZWZ0LT1mLzIpLHQubXlbMV09PT0iYm90dG9tIj9DLnRvcC09Yzp0Lm15WzFdPT09ImNlbnRlciImJihDLnRvcC09Yy8yKSxDLmxlZnQrPWtbMF0sQy50b3ArPWtbMV0sZS5zdXBwb3J0Lm9mZnNldEZyYWN0aW9uc3x8KEMubGVmdD1zKEMubGVmdCksQy50b3A9cyhDLnRvcCkpLG89e21hcmdpbkxlZnQ6dyxtYXJnaW5Ub3A6eH0sZS5lYWNoKFsibGVmdCIsInRvcCJdLGZ1bmN0aW9uKHIsaSl7ZS51aS5wb3NpdGlvbltFW3JdXSYmZS51aS5wb3NpdGlvbltFW3JdXVtpXShDLHt0YXJnZXRXaWR0aDpsLHRhcmdldEhlaWdodDpkLGVsZW1XaWR0aDpmLGVsZW1IZWlnaHQ6Yyxjb2xsaXNpb25Qb3NpdGlvbjpvLGNvbGxpc2lvbldpZHRoOlQsY29sbGlzaW9uSGVpZ2h0Ok4sb2Zmc2V0OltuWzBdK2tbMF0sblsxXStrWzFdXSxteTp0Lm15LGF0OnQuYXQsd2l0aGluOnksZWxlbTphfSl9KSxlLmZuLmJnaWZyYW1lJiZhLmJnaWZyYW1lKCksdC51c2luZyYmKHU9ZnVuY3Rpb24oZSl7dmFyIG49di5sZWZ0LUMubGVmdCxzPW4rbC1mLG89di50b3AtQy50b3AsdT1vK2QtYyxoPXt0YXJnZXQ6e2VsZW1lbnQ6ZyxsZWZ0OnYubGVmdCx0b3A6di50b3Asd2lkdGg6bCxoZWlnaHQ6ZH0sZWxlbWVudDp7ZWxlbWVudDphLGxlZnQ6Qy5sZWZ0LHRvcDpDLnRvcCx3aWR0aDpmLGhlaWdodDpjfSxob3Jpem9udGFsOnM8MD8ibGVmdCI6bj4wPyJyaWdodCI6ImNlbnRlciIsdmVydGljYWw6dTwwPyJ0b3AiOm8+MD8iYm90dG9tIjoibWlkZGxlIn07bDxmJiZpKG4rcyk8bCYmKGguaG9yaXpvbnRhbD0iY2VudGVyIiksZDxjJiZpKG8rdSk8ZCYmKGgudmVydGljYWw9Im1pZGRsZSIpLHIoaShuKSxpKHMpKT5yKGkobyksaSh1KSk/aC5pbXBvcnRhbnQ9Imhvcml6b250YWwiOmguaW1wb3J0YW50PSJ2ZXJ0aWNhbCIsdC51c2luZy5jYWxsKHRoaXMsZSxoKX0pLGEub2Zmc2V0KGUuZXh0ZW5kKEMse3VzaW5nOnV9KSl9KX0sZS51aS5wb3NpdGlvbj17Zml0OntsZWZ0OmZ1bmN0aW9uKGUsdCl7dmFyIG49dC53aXRoaW4saT1uLmlzV2luZG93P24uc2Nyb2xsTGVmdDpuLm9mZnNldC5sZWZ0LHM9bi53aWR0aCxvPWUubGVmdC10LmNvbGxpc2lvblBvc2l0aW9uLm1hcmdpbkxlZnQsdT1pLW8sYT1vK3QuY29sbGlzaW9uV2lkdGgtcy1pLGY7dC5jb2xsaXNpb25XaWR0aD5zP3U+MCYmYTw9MD8oZj1lLmxlZnQrdSt0LmNvbGxpc2lvbldpZHRoLXMtaSxlLmxlZnQrPXUtZik6YT4wJiZ1PD0wP2UubGVmdD1pOnU+YT9lLmxlZnQ9aStzLXQuY29sbGlzaW9uV2lkdGg6ZS5sZWZ0PWk6dT4wP2UubGVmdCs9dTphPjA/ZS5sZWZ0LT1hOmUubGVmdD1yKGUubGVmdC1vLGUubGVmdCl9LHRvcDpmdW5jdGlvbihlLHQpe3ZhciBuPXQud2l0aGluLGk9bi5pc1dpbmRvdz9uLnNjcm9sbFRvcDpuLm9mZnNldC50b3Ascz10LndpdGhpbi5oZWlnaHQsbz1lLnRvcC10LmNvbGxpc2lvblBvc2l0aW9uLm1hcmdpblRvcCx1PWktbyxhPW8rdC5jb2xsaXNpb25IZWlnaHQtcy1pLGY7dC5jb2xsaXNpb25IZWlnaHQ+cz91PjAmJmE8PTA/KGY9ZS50b3ArdSt0LmNvbGxpc2lvbkhlaWdodC1zLWksZS50b3ArPXUtZik6YT4wJiZ1PD0wP2UudG9wPWk6dT5hP2UudG9wPWkrcy10LmNvbGxpc2lvbkhlaWdodDplLnRvcD1pOnU+MD9lLnRvcCs9dTphPjA/ZS50b3AtPWE6ZS50b3A9cihlLnRvcC1vLGUudG9wKX19LGZsaXA6e2xlZnQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj10LndpdGhpbixyPW4ub2Zmc2V0LmxlZnQrbi5zY3JvbGxMZWZ0LHM9bi53aWR0aCxvPW4uaXNXaW5kb3c/bi5zY3JvbGxMZWZ0Om4ub2Zmc2V0LmxlZnQsdT1lLmxlZnQtdC5jb2xsaXNpb25Qb3NpdGlvbi5tYXJnaW5MZWZ0LGE9dS1vLGY9dSt0LmNvbGxpc2lvbldpZHRoLXMtbyxsPXQubXlbMF09PT0ibGVmdCI/LXQuZWxlbVdpZHRoOnQubXlbMF09PT0icmlnaHQiP3QuZWxlbVdpZHRoOjAsYz10LmF0WzBdPT09ImxlZnQiP3QudGFyZ2V0V2lkdGg6dC5hdFswXT09PSJyaWdodCI/LXQudGFyZ2V0V2lkdGg6MCxoPS0yKnQub2Zmc2V0WzBdLHAsZDtpZihhPDApe3A9ZS5sZWZ0K2wrYytoK3QuY29sbGlzaW9uV2lkdGgtcy1yO2lmKHA8MHx8cDxpKGEpKWUubGVmdCs9bCtjK2h9ZWxzZSBpZihmPjApe2Q9ZS5sZWZ0LXQuY29sbGlzaW9uUG9zaXRpb24ubWFyZ2luTGVmdCtsK2MraC1vO2lmKGQ+MHx8aShkKTxmKWUubGVmdCs9bCtjK2h9fSx0b3A6ZnVuY3Rpb24oZSx0KXt2YXIgbj10LndpdGhpbixyPW4ub2Zmc2V0LnRvcCtuLnNjcm9sbFRvcCxzPW4uaGVpZ2h0LG89bi5pc1dpbmRvdz9uLnNjcm9sbFRvcDpuLm9mZnNldC50b3AsdT1lLnRvcC10LmNvbGxpc2lvblBvc2l0aW9uLm1hcmdpblRvcCxhPXUtbyxmPXUrdC5jb2xsaXNpb25IZWlnaHQtcy1vLGw9dC5teVsxXT09PSJ0b3AiLGM9bD8tdC5lbGVtSGVpZ2h0OnQubXlbMV09PT0iYm90dG9tIj90LmVsZW1IZWlnaHQ6MCxoPXQuYXRbMV09PT0idG9wIj90LnRhcmdldEhlaWdodDp0LmF0WzFdPT09ImJvdHRvbSI/LXQudGFyZ2V0SGVpZ2h0OjAscD0tMip0Lm9mZnNldFsxXSxkLHY7YTwwPyh2PWUudG9wK2MraCtwK3QuY29sbGlzaW9uSGVpZ2h0LXMtcixlLnRvcCtjK2grcD5hJiYodjwwfHx2PGkoYSkpJiYoZS50b3ArPWMraCtwKSk6Zj4wJiYoZD1lLnRvcC10LmNvbGxpc2lvblBvc2l0aW9uLm1hcmdpblRvcCtjK2grcC1vLGUudG9wK2MraCtwPmYmJihkPjB8fGkoZCk8ZikmJihlLnRvcCs9YytoK3ApKX19LGZsaXBmaXQ6e2xlZnQ6ZnVuY3Rpb24oKXtlLnVpLnBvc2l0aW9uLmZsaXAubGVmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyksZS51aS5wb3NpdGlvbi5maXQubGVmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHRvcDpmdW5jdGlvbigpe2UudWkucG9zaXRpb24uZmxpcC50b3AuYXBwbHkodGhpcyxhcmd1bWVudHMpLGUudWkucG9zaXRpb24uZml0LnRvcC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fX0sZnVuY3Rpb24oKXt2YXIgdCxuLHIsaSxzLG89ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSx1PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChvPyJkaXYiOiJib2R5Iikscj17dmlzaWJpbGl0eToiaGlkZGVuIix3aWR0aDowLGhlaWdodDowLGJvcmRlcjowLG1hcmdpbjowLGJhY2tncm91bmQ6Im5vbmUifSxvJiZlLmV4dGVuZChyLHtwb3NpdGlvbjoiYWJzb2x1dGUiLGxlZnQ6Ii0xMDAwcHgiLHRvcDoiLTEwMDBweCJ9KTtmb3IocyBpbiByKXQuc3R5bGVbc109cltzXTt0LmFwcGVuZENoaWxkKHUpLG49b3x8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LG4uaW5zZXJ0QmVmb3JlKHQsbi5maXJzdENoaWxkKSx1LnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogMTAuNzQzMjIyMnB4OyIsaT1lKHUpLm9mZnNldCgpLmxlZnQsZS5zdXBwb3J0Lm9mZnNldEZyYWN0aW9ucz1pPjEwJiZpPDExLHQuaW5uZXJIVE1MPSIiLG4ucmVtb3ZlQ2hpbGQodCl9KCksZS51aUJhY2tDb21wYXQhPT0hMSYmZnVuY3Rpb24oZSl7dmFyIG49ZS5mbi5wb3NpdGlvbjtlLmZuLnBvc2l0aW9uPWZ1bmN0aW9uKHIpe2lmKCFyfHwhci5vZmZzZXQpcmV0dXJuIG4uY2FsbCh0aGlzLHIpO3ZhciBpPXIub2Zmc2V0LnNwbGl0KCIgIikscz1yLmF0LnNwbGl0KCIgIik7cmV0dXJuIGkubGVuZ3RoPT09MSYmKGlbMV09aVswXSksL15cZC8udGVzdChpWzBdKSYmKGlbMF09IisiK2lbMF0pLC9eXGQvLnRlc3QoaVsxXSkmJihpWzFdPSIrIitpWzFdKSxzLmxlbmd0aD09PTEmJigvbGVmdHxjZW50ZXJ8cmlnaHQvLnRlc3Qoc1swXSk/c1sxXT0iY2VudGVyIjooc1sxXT1zWzBdLHNbMF09ImNlbnRlciIpKSxuLmNhbGwodGhpcyxlLmV4dGVuZChyLHthdDpzWzBdK2lbMF0rIiAiK3NbMV0raVsxXSxvZmZzZXQ6dH0pKX19KGpRdWVyeSl9KShqUXVlcnkpOyhmdW5jdGlvbihlLHQpe2Uud2lkZ2V0KCJ1aS5kcmFnZ2FibGUiLGUudWkubW91c2Use3ZlcnNpb246IjEuOS4yIix3aWRnZXRFdmVudFByZWZpeDoiZHJhZyIsb3B0aW9uczp7YWRkQ2xhc3NlczohMCxhcHBlbmRUbzoicGFyZW50IixheGlzOiExLGNvbm5lY3RUb1NvcnRhYmxlOiExLGNvbnRhaW5tZW50OiExLGN1cnNvcjoiYXV0byIsY3Vyc29yQXQ6ITEsZ3JpZDohMSxoYW5kbGU6ITEsaGVscGVyOiJvcmlnaW5hbCIsaWZyYW1lRml4OiExLG9wYWNpdHk6ITEscmVmcmVzaFBvc2l0aW9uczohMSxyZXZlcnQ6ITEscmV2ZXJ0RHVyYXRpb246NTAwLHNjb3BlOiJkZWZhdWx0IixzY3JvbGw6ITAsc2Nyb2xsU2Vuc2l0aXZpdHk6MjAsc2Nyb2xsU3BlZWQ6MjAsc25hcDohMSxzbmFwTW9kZToiYm90aCIsc25hcFRvbGVyYW5jZToyMCxzdGFjazohMSx6SW5kZXg6ITF9LF9jcmVhdGU6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMuaGVscGVyPT0ib3JpZ2luYWwiJiYhL14oPzpyfGF8ZikvLnRlc3QodGhpcy5lbGVtZW50LmNzcygicG9zaXRpb24iKSkmJih0aGlzLmVsZW1lbnRbMF0uc3R5bGUucG9zaXRpb249InJlbGF0aXZlIiksdGhpcy5vcHRpb25zLmFkZENsYXNzZXMmJnRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktZHJhZ2dhYmxlIiksdGhpcy5vcHRpb25zLmRpc2FibGVkJiZ0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWRyYWdnYWJsZS1kaXNhYmxlZCIpLHRoaXMuX21vdXNlSW5pdCgpfSxfZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktZHJhZ2dhYmxlIHVpLWRyYWdnYWJsZS1kcmFnZ2luZyB1aS1kcmFnZ2FibGUtZGlzYWJsZWQiKSx0aGlzLl9tb3VzZURlc3Ryb3koKX0sX21vdXNlQ2FwdHVyZTpmdW5jdGlvbih0KXt2YXIgbj10aGlzLm9wdGlvbnM7cmV0dXJuIHRoaXMuaGVscGVyfHxuLmRpc2FibGVkfHxlKHQudGFyZ2V0KS5pcygiLnVpLXJlc2l6YWJsZS1oYW5kbGUiKT8hMToodGhpcy5oYW5kbGU9dGhpcy5fZ2V0SGFuZGxlKHQpLHRoaXMuaGFuZGxlPyhlKG4uaWZyYW1lRml4PT09ITA/ImlmcmFtZSI6bi5pZnJhbWVGaXgpLmVhY2goZnVuY3Rpb24oKXtlKCc8ZGl2IGNsYXNzPSJ1aS1kcmFnZ2FibGUtaWZyYW1lRml4IiBzdHlsZT0iYmFja2dyb3VuZDogI2ZmZjsiPjwvZGl2PicpLmNzcyh7d2lkdGg6dGhpcy5vZmZzZXRXaWR0aCsicHgiLGhlaWdodDp0aGlzLm9mZnNldEhlaWdodCsicHgiLHBvc2l0aW9uOiJhYnNvbHV0ZSIsb3BhY2l0eToiMC4wMDEiLHpJbmRleDoxZTN9KS5jc3MoZSh0aGlzKS5vZmZzZXQoKSkuYXBwZW5kVG8oImJvZHkiKX0pLCEwKTohMSl9LF9tb3VzZVN0YXJ0OmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMub3B0aW9ucztyZXR1cm4gdGhpcy5oZWxwZXI9dGhpcy5fY3JlYXRlSGVscGVyKHQpLHRoaXMuaGVscGVyLmFkZENsYXNzKCJ1aS1kcmFnZ2FibGUtZHJhZ2dpbmciKSx0aGlzLl9jYWNoZUhlbHBlclByb3BvcnRpb25zKCksZS51aS5kZG1hbmFnZXImJihlLnVpLmRkbWFuYWdlci5jdXJyZW50PXRoaXMpLHRoaXMuX2NhY2hlTWFyZ2lucygpLHRoaXMuY3NzUG9zaXRpb249dGhpcy5oZWxwZXIuY3NzKCJwb3NpdGlvbiIpLHRoaXMuc2Nyb2xsUGFyZW50PXRoaXMuaGVscGVyLnNjcm9sbFBhcmVudCgpLHRoaXMub2Zmc2V0PXRoaXMucG9zaXRpb25BYnM9dGhpcy5lbGVtZW50Lm9mZnNldCgpLHRoaXMub2Zmc2V0PXt0b3A6dGhpcy5vZmZzZXQudG9wLXRoaXMubWFyZ2lucy50b3AsbGVmdDp0aGlzLm9mZnNldC5sZWZ0LXRoaXMubWFyZ2lucy5sZWZ0fSxlLmV4dGVuZCh0aGlzLm9mZnNldCx7Y2xpY2s6e2xlZnQ6dC5wYWdlWC10aGlzLm9mZnNldC5sZWZ0LHRvcDp0LnBhZ2VZLXRoaXMub2Zmc2V0LnRvcH0scGFyZW50OnRoaXMuX2dldFBhcmVudE9mZnNldCgpLHJlbGF0aXZlOnRoaXMuX2dldFJlbGF0aXZlT2Zmc2V0KCl9KSx0aGlzLm9yaWdpbmFsUG9zaXRpb249dGhpcy5wb3NpdGlvbj10aGlzLl9nZW5lcmF0ZVBvc2l0aW9uKHQpLHRoaXMub3JpZ2luYWxQYWdlWD10LnBhZ2VYLHRoaXMub3JpZ2luYWxQYWdlWT10LnBhZ2VZLG4uY3Vyc29yQXQmJnRoaXMuX2FkanVzdE9mZnNldEZyb21IZWxwZXIobi5jdXJzb3JBdCksbi5jb250YWlubWVudCYmdGhpcy5fc2V0Q29udGFpbm1lbnQoKSx0aGlzLl90cmlnZ2VyKCJzdGFydCIsdCk9PT0hMT8odGhpcy5fY2xlYXIoKSwhMSk6KHRoaXMuX2NhY2hlSGVscGVyUHJvcG9ydGlvbnMoKSxlLnVpLmRkbWFuYWdlciYmIW4uZHJvcEJlaGF2aW91ciYmZS51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHModGhpcyx0KSx0aGlzLl9tb3VzZURyYWcodCwhMCksZS51aS5kZG1hbmFnZXImJmUudWkuZGRtYW5hZ2VyLmRyYWdTdGFydCh0aGlzLHQpLCEwKX0sX21vdXNlRHJhZzpmdW5jdGlvbih0LG4pe3RoaXMucG9zaXRpb249dGhpcy5fZ2VuZXJhdGVQb3NpdGlvbih0KSx0aGlzLnBvc2l0aW9uQWJzPXRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJhYnNvbHV0ZSIpO2lmKCFuKXt2YXIgcj10aGlzLl91aUhhc2goKTtpZih0aGlzLl90cmlnZ2VyKCJkcmFnIix0LHIpPT09ITEpcmV0dXJuIHRoaXMuX21vdXNlVXAoe30pLCExO3RoaXMucG9zaXRpb249ci5wb3NpdGlvbn1pZighdGhpcy5vcHRpb25zLmF4aXN8fHRoaXMub3B0aW9ucy5heGlzIT0ieSIpdGhpcy5oZWxwZXJbMF0uc3R5bGUubGVmdD10aGlzLnBvc2l0aW9uLmxlZnQrInB4IjtpZighdGhpcy5vcHRpb25zLmF4aXN8fHRoaXMub3B0aW9ucy5heGlzIT0ieCIpdGhpcy5oZWxwZXJbMF0uc3R5bGUudG9wPXRoaXMucG9zaXRpb24udG9wKyJweCI7cmV0dXJuIGUudWkuZGRtYW5hZ2VyJiZlLnVpLmRkbWFuYWdlci5kcmFnKHRoaXMsdCksITF9LF9tb3VzZVN0b3A6ZnVuY3Rpb24odCl7dmFyIG49ITE7ZS51aS5kZG1hbmFnZXImJiF0aGlzLm9wdGlvbnMuZHJvcEJlaGF2aW91ciYmKG49ZS51aS5kZG1hbmFnZXIuZHJvcCh0aGlzLHQpKSx0aGlzLmRyb3BwZWQmJihuPXRoaXMuZHJvcHBlZCx0aGlzLmRyb3BwZWQ9ITEpO3ZhciByPXRoaXMuZWxlbWVudFswXSxpPSExO3doaWxlKHImJihyPXIucGFyZW50Tm9kZSkpcj09ZG9jdW1lbnQmJihpPSEwKTtpZighaSYmdGhpcy5vcHRpb25zLmhlbHBlcj09PSJvcmlnaW5hbCIpcmV0dXJuITE7aWYodGhpcy5vcHRpb25zLnJldmVydD09ImludmFsaWQiJiYhbnx8dGhpcy5vcHRpb25zLnJldmVydD09InZhbGlkIiYmbnx8dGhpcy5vcHRpb25zLnJldmVydD09PSEwfHxlLmlzRnVuY3Rpb24odGhpcy5vcHRpb25zLnJldmVydCkmJnRoaXMub3B0aW9ucy5yZXZlcnQuY2FsbCh0aGlzLmVsZW1lbnQsbikpe3ZhciBzPXRoaXM7ZSh0aGlzLmhlbHBlcikuYW5pbWF0ZSh0aGlzLm9yaWdpbmFsUG9zaXRpb24scGFyc2VJbnQodGhpcy5vcHRpb25zLnJldmVydER1cmF0aW9uLDEwKSxmdW5jdGlvbigpe3MuX3RyaWdnZXIoInN0b3AiLHQpIT09ITEmJnMuX2NsZWFyKCl9KX1lbHNlIHRoaXMuX3RyaWdnZXIoInN0b3AiLHQpIT09ITEmJnRoaXMuX2NsZWFyKCk7cmV0dXJuITF9LF9tb3VzZVVwOmZ1bmN0aW9uKHQpe3JldHVybiBlKCJkaXYudWktZHJhZ2dhYmxlLWlmcmFtZUZpeCIpLmVhY2goZnVuY3Rpb24oKXt0aGlzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcyl9KSxlLnVpLmRkbWFuYWdlciYmZS51aS5kZG1hbmFnZXIuZHJhZ1N0b3AodGhpcyx0KSxlLnVpLm1vdXNlLnByb3RvdHlwZS5fbW91c2VVcC5jYWxsKHRoaXMsdCl9LGNhbmNlbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmhlbHBlci5pcygiLnVpLWRyYWdnYWJsZS1kcmFnZ2luZyIpP3RoaXMuX21vdXNlVXAoe30pOnRoaXMuX2NsZWFyKCksdGhpc30sX2dldEhhbmRsZTpmdW5jdGlvbih0KXt2YXIgbj0hdGhpcy5vcHRpb25zLmhhbmRsZXx8IWUodGhpcy5vcHRpb25zLmhhbmRsZSx0aGlzLmVsZW1lbnQpLmxlbmd0aD8hMDohMTtyZXR1cm4gZSh0aGlzLm9wdGlvbnMuaGFuZGxlLHRoaXMuZWxlbWVudCkuZmluZCgiKiIpLmFuZFNlbGYoKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcz09dC50YXJnZXQmJihuPSEwKX0pLG59LF9jcmVhdGVIZWxwZXI6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5vcHRpb25zLHI9ZS5pc0Z1bmN0aW9uKG4uaGVscGVyKT9lKG4uaGVscGVyLmFwcGx5KHRoaXMuZWxlbWVudFswXSxbdF0pKTpuLmhlbHBlcj09ImNsb25lIj90aGlzLmVsZW1lbnQuY2xvbmUoKS5yZW1vdmVBdHRyKCJpZCIpOnRoaXMuZWxlbWVudDtyZXR1cm4gci5wYXJlbnRzKCJib2R5IikubGVuZ3RofHxyLmFwcGVuZFRvKG4uYXBwZW5kVG89PSJwYXJlbnQiP3RoaXMuZWxlbWVudFswXS5wYXJlbnROb2RlOm4uYXBwZW5kVG8pLHJbMF0hPXRoaXMuZWxlbWVudFswXSYmIS8oZml4ZWR8YWJzb2x1dGUpLy50ZXN0KHIuY3NzKCJwb3NpdGlvbiIpKSYmci5jc3MoInBvc2l0aW9uIiwiYWJzb2x1dGUiKSxyfSxfYWRqdXN0T2Zmc2V0RnJvbUhlbHBlcjpmdW5jdGlvbih0KXt0eXBlb2YgdD09InN0cmluZyImJih0PXQuc3BsaXQoIiAiKSksZS5pc0FycmF5KHQpJiYodD17bGVmdDordFswXSx0b3A6K3RbMV18fDB9KSwibGVmdCJpbiB0JiYodGhpcy5vZmZzZXQuY2xpY2subGVmdD10LmxlZnQrdGhpcy5tYXJnaW5zLmxlZnQpLCJyaWdodCJpbiB0JiYodGhpcy5vZmZzZXQuY2xpY2subGVmdD10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLXQucmlnaHQrdGhpcy5tYXJnaW5zLmxlZnQpLCJ0b3AiaW4gdCYmKHRoaXMub2Zmc2V0LmNsaWNrLnRvcD10LnRvcCt0aGlzLm1hcmdpbnMudG9wKSwiYm90dG9tImluIHQmJih0aGlzLm9mZnNldC5jbGljay50b3A9dGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQtdC5ib3R0b20rdGhpcy5tYXJnaW5zLnRvcCl9LF9nZXRQYXJlbnRPZmZzZXQ6ZnVuY3Rpb24oKXt0aGlzLm9mZnNldFBhcmVudD10aGlzLmhlbHBlci5vZmZzZXRQYXJlbnQoKTt2YXIgdD10aGlzLm9mZnNldFBhcmVudC5vZmZzZXQoKTt0aGlzLmNzc1Bvc2l0aW9uPT0iYWJzb2x1dGUiJiZ0aGlzLnNjcm9sbFBhcmVudFswXSE9ZG9jdW1lbnQmJmUuY29udGFpbnModGhpcy5zY3JvbGxQYXJlbnRbMF0sdGhpcy5vZmZzZXRQYXJlbnRbMF0pJiYodC5sZWZ0Kz10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCksdC50b3ArPXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpKTtpZih0aGlzLm9mZnNldFBhcmVudFswXT09ZG9jdW1lbnQuYm9keXx8dGhpcy5vZmZzZXRQYXJlbnRbMF0udGFnTmFtZSYmdGhpcy5vZmZzZXRQYXJlbnRbMF0udGFnTmFtZS50b0xvd2VyQ2FzZSgpPT0iaHRtbCImJmUudWkuaWUpdD17dG9wOjAsbGVmdDowfTtyZXR1cm57dG9wOnQudG9wKyhwYXJzZUludCh0aGlzLm9mZnNldFBhcmVudC5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKSxsZWZ0OnQubGVmdCsocGFyc2VJbnQodGhpcy5vZmZzZXRQYXJlbnQuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCl8fDApfX0sX2dldFJlbGF0aXZlT2Zmc2V0OmZ1bmN0aW9uKCl7aWYodGhpcy5jc3NQb3NpdGlvbj09InJlbGF0aXZlIil7dmFyIGU9dGhpcy5lbGVtZW50LnBvc2l0aW9uKCk7cmV0dXJue3RvcDplLnRvcC0ocGFyc2VJbnQodGhpcy5oZWxwZXIuY3NzKCJ0b3AiKSwxMCl8fDApK3RoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpLGxlZnQ6ZS5sZWZ0LShwYXJzZUludCh0aGlzLmhlbHBlci5jc3MoImxlZnQiKSwxMCl8fDApK3RoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKX19cmV0dXJue3RvcDowLGxlZnQ6MH19LF9jYWNoZU1hcmdpbnM6ZnVuY3Rpb24oKXt0aGlzLm1hcmdpbnM9e2xlZnQ6cGFyc2VJbnQodGhpcy5lbGVtZW50LmNzcygibWFyZ2luTGVmdCIpLDEwKXx8MCx0b3A6cGFyc2VJbnQodGhpcy5lbGVtZW50LmNzcygibWFyZ2luVG9wIiksMTApfHwwLHJpZ2h0OnBhcnNlSW50KHRoaXMuZWxlbWVudC5jc3MoIm1hcmdpblJpZ2h0IiksMTApfHwwLGJvdHRvbTpwYXJzZUludCh0aGlzLmVsZW1lbnQuY3NzKCJtYXJnaW5Cb3R0b20iKSwxMCl8fDB9fSxfY2FjaGVIZWxwZXJQcm9wb3J0aW9uczpmdW5jdGlvbigpe3RoaXMuaGVscGVyUHJvcG9ydGlvbnM9e3dpZHRoOnRoaXMuaGVscGVyLm91dGVyV2lkdGgoKSxoZWlnaHQ6dGhpcy5oZWxwZXIub3V0ZXJIZWlnaHQoKX19LF9zZXRDb250YWlubWVudDpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9uczt0LmNvbnRhaW5tZW50PT0icGFyZW50IiYmKHQuY29udGFpbm1lbnQ9dGhpcy5oZWxwZXJbMF0ucGFyZW50Tm9kZSk7aWYodC5jb250YWlubWVudD09ImRvY3VtZW50Inx8dC5jb250YWlubWVudD09IndpbmRvdyIpdGhpcy5jb250YWlubWVudD1bdC5jb250YWlubWVudD09ImRvY3VtZW50Ij8wOmUod2luZG93KS5zY3JvbGxMZWZ0KCktdGhpcy5vZmZzZXQucmVsYXRpdmUubGVmdC10aGlzLm9mZnNldC5wYXJlbnQubGVmdCx0LmNvbnRhaW5tZW50PT0iZG9jdW1lbnQiPzA6ZSh3aW5kb3cpLnNjcm9sbFRvcCgpLXRoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcC10aGlzLm9mZnNldC5wYXJlbnQudG9wLCh0LmNvbnRhaW5tZW50PT0iZG9jdW1lbnQiPzA6ZSh3aW5kb3cpLnNjcm9sbExlZnQoKSkrZSh0LmNvbnRhaW5tZW50PT0iZG9jdW1lbnQiP2RvY3VtZW50OndpbmRvdykud2lkdGgoKS10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLXRoaXMubWFyZ2lucy5sZWZ0LCh0LmNvbnRhaW5tZW50PT0iZG9jdW1lbnQiPzA6ZSh3aW5kb3cpLnNjcm9sbFRvcCgpKSsoZSh0LmNvbnRhaW5tZW50PT0iZG9jdW1lbnQiP2RvY3VtZW50OndpbmRvdykuaGVpZ2h0KCl8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZS5zY3JvbGxIZWlnaHQpLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LXRoaXMubWFyZ2lucy50b3BdO2lmKCEvXihkb2N1bWVudHx3aW5kb3d8cGFyZW50KSQvLnRlc3QodC5jb250YWlubWVudCkmJnQuY29udGFpbm1lbnQuY29uc3RydWN0b3IhPUFycmF5KXt2YXIgbj1lKHQuY29udGFpbm1lbnQpLHI9blswXTtpZighcilyZXR1cm47dmFyIGk9bi5vZmZzZXQoKSxzPWUocikuY3NzKCJvdmVyZmxvdyIpIT0iaGlkZGVuIjt0aGlzLmNvbnRhaW5tZW50PVsocGFyc2VJbnQoZShyKS5jc3MoImJvcmRlckxlZnRXaWR0aCIpLDEwKXx8MCkrKHBhcnNlSW50KGUocikuY3NzKCJwYWRkaW5nTGVmdCIpLDEwKXx8MCksKHBhcnNlSW50KGUocikuY3NzKCJib3JkZXJUb3BXaWR0aCIpLDEwKXx8MCkrKHBhcnNlSW50KGUocikuY3NzKCJwYWRkaW5nVG9wIiksMTApfHwwKSwocz9NYXRoLm1heChyLnNjcm9sbFdpZHRoLHIub2Zmc2V0V2lkdGgpOnIub2Zmc2V0V2lkdGgpLShwYXJzZUludChlKHIpLmNzcygiYm9yZGVyTGVmdFdpZHRoIiksMTApfHwwKS0ocGFyc2VJbnQoZShyKS5jc3MoInBhZGRpbmdSaWdodCIpLDEwKXx8MCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC10aGlzLm1hcmdpbnMubGVmdC10aGlzLm1hcmdpbnMucmlnaHQsKHM/TWF0aC5tYXgoci5zY3JvbGxIZWlnaHQsci5vZmZzZXRIZWlnaHQpOnIub2Zmc2V0SGVpZ2h0KS0ocGFyc2VJbnQoZShyKS5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKS0ocGFyc2VJbnQoZShyKS5jc3MoInBhZGRpbmdCb3R0b20iKSwxMCl8fDApLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LXRoaXMubWFyZ2lucy50b3AtdGhpcy5tYXJnaW5zLmJvdHRvbV0sdGhpcy5yZWxhdGl2ZV9jb250YWluZXI9bn1lbHNlIHQuY29udGFpbm1lbnQuY29uc3RydWN0b3I9PUFycmF5JiYodGhpcy5jb250YWlubWVudD10LmNvbnRhaW5tZW50KX0sX2NvbnZlcnRQb3NpdGlvblRvOmZ1bmN0aW9uKHQsbil7bnx8KG49dGhpcy5wb3NpdGlvbik7dmFyIHI9dD09ImFic29sdXRlIj8xOi0xLGk9dGhpcy5vcHRpb25zLHM9dGhpcy5jc3NQb3NpdGlvbiE9ImFic29sdXRlInx8dGhpcy5zY3JvbGxQYXJlbnRbMF0hPWRvY3VtZW50JiYhIWUuY29udGFpbnModGhpcy5zY3JvbGxQYXJlbnRbMF0sdGhpcy5vZmZzZXRQYXJlbnRbMF0pP3RoaXMuc2Nyb2xsUGFyZW50OnRoaXMub2Zmc2V0UGFyZW50LG89LyhodG1sfGJvZHkpL2kudGVzdChzWzBdLnRhZ05hbWUpO3JldHVybnt0b3A6bi50b3ArdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wKnIrdGhpcy5vZmZzZXQucGFyZW50LnRvcCpyLSh0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKTpvPzA6cy5zY3JvbGxUb3AoKSkqcixsZWZ0Om4ubGVmdCt0aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0KnIrdGhpcy5vZmZzZXQucGFyZW50LmxlZnQqci0odGhpcy5jc3NQb3NpdGlvbj09ImZpeGVkIj8tdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdCgpOm8/MDpzLnNjcm9sbExlZnQoKSkqcn19LF9nZW5lcmF0ZVBvc2l0aW9uOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMub3B0aW9ucyxyPXRoaXMuY3NzUG9zaXRpb24hPSJhYnNvbHV0ZSJ8fHRoaXMuc2Nyb2xsUGFyZW50WzBdIT1kb2N1bWVudCYmISFlLmNvbnRhaW5zKHRoaXMuc2Nyb2xsUGFyZW50WzBdLHRoaXMub2Zmc2V0UGFyZW50WzBdKT90aGlzLnNjcm9sbFBhcmVudDp0aGlzLm9mZnNldFBhcmVudCxpPS8oaHRtbHxib2R5KS9pLnRlc3QoclswXS50YWdOYW1lKSxzPXQucGFnZVgsbz10LnBhZ2VZO2lmKHRoaXMub3JpZ2luYWxQb3NpdGlvbil7dmFyIHU7aWYodGhpcy5jb250YWlubWVudCl7aWYodGhpcy5yZWxhdGl2ZV9jb250YWluZXIpe3ZhciBhPXRoaXMucmVsYXRpdmVfY29udGFpbmVyLm9mZnNldCgpO3U9W3RoaXMuY29udGFpbm1lbnRbMF0rYS5sZWZ0LHRoaXMuY29udGFpbm1lbnRbMV0rYS50b3AsdGhpcy5jb250YWlubWVudFsyXSthLmxlZnQsdGhpcy5jb250YWlubWVudFszXSthLnRvcF19ZWxzZSB1PXRoaXMuY29udGFpbm1lbnQ7dC5wYWdlWC10aGlzLm9mZnNldC5jbGljay5sZWZ0PHVbMF0mJihzPXVbMF0rdGhpcy5vZmZzZXQuY2xpY2subGVmdCksdC5wYWdlWS10aGlzLm9mZnNldC5jbGljay50b3A8dVsxXSYmKG89dVsxXSt0aGlzLm9mZnNldC5jbGljay50b3ApLHQucGFnZVgtdGhpcy5vZmZzZXQuY2xpY2subGVmdD51WzJdJiYocz11WzJdK3RoaXMub2Zmc2V0LmNsaWNrLmxlZnQpLHQucGFnZVktdGhpcy5vZmZzZXQuY2xpY2sudG9wPnVbM10mJihvPXVbM10rdGhpcy5vZmZzZXQuY2xpY2sudG9wKX1pZihuLmdyaWQpe3ZhciBmPW4uZ3JpZFsxXT90aGlzLm9yaWdpbmFsUGFnZVkrTWF0aC5yb3VuZCgoby10aGlzLm9yaWdpbmFsUGFnZVkpL24uZ3JpZFsxXSkqbi5ncmlkWzFdOnRoaXMub3JpZ2luYWxQYWdlWTtvPXU/Zi10aGlzLm9mZnNldC5jbGljay50b3A8dVsxXXx8Zi10aGlzLm9mZnNldC5jbGljay50b3A+dVszXT9mLXRoaXMub2Zmc2V0LmNsaWNrLnRvcDx1WzFdP2Yrbi5ncmlkWzFdOmYtbi5ncmlkWzFdOmY6Zjt2YXIgbD1uLmdyaWRbMF0/dGhpcy5vcmlnaW5hbFBhZ2VYK01hdGgucm91bmQoKHMtdGhpcy5vcmlnaW5hbFBhZ2VYKS9uLmdyaWRbMF0pKm4uZ3JpZFswXTp0aGlzLm9yaWdpbmFsUGFnZVg7cz11P2wtdGhpcy5vZmZzZXQuY2xpY2subGVmdDx1WzBdfHxsLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ+dVsyXT9sLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ8dVswXT9sK24uZ3JpZFswXTpsLW4uZ3JpZFswXTpsOmx9fXJldHVybnt0b3A6by10aGlzLm9mZnNldC5jbGljay50b3AtdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wLXRoaXMub2Zmc2V0LnBhcmVudC50b3ArKHRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpOmk/MDpyLnNjcm9sbFRvcCgpKSxsZWZ0OnMtdGhpcy5vZmZzZXQuY2xpY2subGVmdC10aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0LXRoaXMub2Zmc2V0LnBhcmVudC5sZWZ0Kyh0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCk6aT8wOnIuc2Nyb2xsTGVmdCgpKX19LF9jbGVhcjpmdW5jdGlvbigpe3RoaXMuaGVscGVyLnJlbW92ZUNsYXNzKCJ1aS1kcmFnZ2FibGUtZHJhZ2dpbmciKSx0aGlzLmhlbHBlclswXSE9dGhpcy5lbGVtZW50WzBdJiYhdGhpcy5jYW5jZWxIZWxwZXJSZW1vdmFsJiZ0aGlzLmhlbHBlci5yZW1vdmUoKSx0aGlzLmhlbHBlcj1udWxsLHRoaXMuY2FuY2VsSGVscGVyUmVtb3ZhbD0hMX0sX3RyaWdnZXI6ZnVuY3Rpb24odCxuLHIpe3JldHVybiByPXJ8fHRoaXMuX3VpSGFzaCgpLGUudWkucGx1Z2luLmNhbGwodGhpcyx0LFtuLHJdKSx0PT0iZHJhZyImJih0aGlzLnBvc2l0aW9uQWJzPXRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJhYnNvbHV0ZSIpKSxlLldpZGdldC5wcm90b3R5cGUuX3RyaWdnZXIuY2FsbCh0aGlzLHQsbixyKX0scGx1Z2luczp7fSxfdWlIYXNoOmZ1bmN0aW9uKGUpe3JldHVybntoZWxwZXI6dGhpcy5oZWxwZXIscG9zaXRpb246dGhpcy5wb3NpdGlvbixvcmlnaW5hbFBvc2l0aW9uOnRoaXMub3JpZ2luYWxQb3NpdGlvbixvZmZzZXQ6dGhpcy5wb3NpdGlvbkFic319fSksZS51aS5wbHVnaW4uYWRkKCJkcmFnZ2FibGUiLCJjb25uZWN0VG9Tb3J0YWJsZSIse3N0YXJ0OmZ1bmN0aW9uKHQsbil7dmFyIHI9ZSh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKSxpPXIub3B0aW9ucyxzPWUuZXh0ZW5kKHt9LG4se2l0ZW06ci5lbGVtZW50fSk7ci5zb3J0YWJsZXM9W10sZShpLmNvbm5lY3RUb1NvcnRhYmxlKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIG49ZS5kYXRhKHRoaXMsInNvcnRhYmxlIik7biYmIW4ub3B0aW9ucy5kaXNhYmxlZCYmKHIuc29ydGFibGVzLnB1c2goe2luc3RhbmNlOm4sc2hvdWxkUmV2ZXJ0Om4ub3B0aW9ucy5yZXZlcnR9KSxuLnJlZnJlc2hQb3NpdGlvbnMoKSxuLl90cmlnZ2VyKCJhY3RpdmF0ZSIsdCxzKSl9KX0sc3RvcDpmdW5jdGlvbih0LG4pe3ZhciByPWUodGhpcykuZGF0YSgiZHJhZ2dhYmxlIiksaT1lLmV4dGVuZCh7fSxuLHtpdGVtOnIuZWxlbWVudH0pO2UuZWFjaChyLnNvcnRhYmxlcyxmdW5jdGlvbigpe3RoaXMuaW5zdGFuY2UuaXNPdmVyPyh0aGlzLmluc3RhbmNlLmlzT3Zlcj0wLHIuY2FuY2VsSGVscGVyUmVtb3ZhbD0hMCx0aGlzLmluc3RhbmNlLmNhbmNlbEhlbHBlclJlbW92YWw9ITEsdGhpcy5zaG91bGRSZXZlcnQmJih0aGlzLmluc3RhbmNlLm9wdGlvbnMucmV2ZXJ0PSEwKSx0aGlzLmluc3RhbmNlLl9tb3VzZVN0b3AodCksdGhpcy5pbnN0YW5jZS5vcHRpb25zLmhlbHBlcj10aGlzLmluc3RhbmNlLm9wdGlvbnMuX2hlbHBlcixyLm9wdGlvbnMuaGVscGVyPT0ib3JpZ2luYWwiJiZ0aGlzLmluc3RhbmNlLmN1cnJlbnRJdGVtLmNzcyh7dG9wOiJhdXRvIixsZWZ0OiJhdXRvIn0pKToodGhpcy5pbnN0YW5jZS5jYW5jZWxIZWxwZXJSZW1vdmFsPSExLHRoaXMuaW5zdGFuY2UuX3RyaWdnZXIoImRlYWN0aXZhdGUiLHQsaSkpfSl9LGRyYWc6ZnVuY3Rpb24odCxuKXt2YXIgcj1lKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLGk9dGhpcyxzPWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMub2Zmc2V0LmNsaWNrLnRvcCxyPXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQsaT10aGlzLnBvc2l0aW9uQWJzLnRvcCxzPXRoaXMucG9zaXRpb25BYnMubGVmdCxvPXQuaGVpZ2h0LHU9dC53aWR0aCxhPXQudG9wLGY9dC5sZWZ0O3JldHVybiBlLnVpLmlzT3ZlcihpK24scytyLGEsZixvLHUpfTtlLmVhY2goci5zb3J0YWJsZXMsZnVuY3Rpb24ocyl7dmFyIG89ITEsdT10aGlzO3RoaXMuaW5zdGFuY2UucG9zaXRpb25BYnM9ci5wb3NpdGlvbkFicyx0aGlzLmluc3RhbmNlLmhlbHBlclByb3BvcnRpb25zPXIuaGVscGVyUHJvcG9ydGlvbnMsdGhpcy5pbnN0YW5jZS5vZmZzZXQuY2xpY2s9ci5vZmZzZXQuY2xpY2ssdGhpcy5pbnN0YW5jZS5faW50ZXJzZWN0c1dpdGgodGhpcy5pbnN0YW5jZS5jb250YWluZXJDYWNoZSkmJihvPSEwLGUuZWFjaChyLnNvcnRhYmxlcyxmdW5jdGlvbigpe3JldHVybiB0aGlzLmluc3RhbmNlLnBvc2l0aW9uQWJzPXIucG9zaXRpb25BYnMsdGhpcy5pbnN0YW5jZS5oZWxwZXJQcm9wb3J0aW9ucz1yLmhlbHBlclByb3BvcnRpb25zLHRoaXMuaW5zdGFuY2Uub2Zmc2V0LmNsaWNrPXIub2Zmc2V0LmNsaWNrLHRoaXMhPXUmJnRoaXMuaW5zdGFuY2UuX2ludGVyc2VjdHNXaXRoKHRoaXMuaW5zdGFuY2UuY29udGFpbmVyQ2FjaGUpJiZlLnVpLmNvbnRhaW5zKHUuaW5zdGFuY2UuZWxlbWVudFswXSx0aGlzLmluc3RhbmNlLmVsZW1lbnRbMF0pJiYobz0hMSksb30pKSxvPyh0aGlzLmluc3RhbmNlLmlzT3Zlcnx8KHRoaXMuaW5zdGFuY2UuaXNPdmVyPTEsdGhpcy5pbnN0YW5jZS5jdXJyZW50SXRlbT1lKGkpLmNsb25lKCkucmVtb3ZlQXR0cigiaWQiKS5hcHBlbmRUbyh0aGlzLmluc3RhbmNlLmVsZW1lbnQpLmRhdGEoInNvcnRhYmxlLWl0ZW0iLCEwKSx0aGlzLmluc3RhbmNlLm9wdGlvbnMuX2hlbHBlcj10aGlzLmluc3RhbmNlLm9wdGlvbnMuaGVscGVyLHRoaXMuaW5zdGFuY2Uub3B0aW9ucy5oZWxwZXI9ZnVuY3Rpb24oKXtyZXR1cm4gbi5oZWxwZXJbMF19LHQudGFyZ2V0PXRoaXMuaW5zdGFuY2UuY3VycmVudEl0ZW1bMF0sdGhpcy5pbnN0YW5jZS5fbW91c2VDYXB0dXJlKHQsITApLHRoaXMuaW5zdGFuY2UuX21vdXNlU3RhcnQodCwhMCwhMCksdGhpcy5pbnN0YW5jZS5vZmZzZXQuY2xpY2sudG9wPXIub2Zmc2V0LmNsaWNrLnRvcCx0aGlzLmluc3RhbmNlLm9mZnNldC5jbGljay5sZWZ0PXIub2Zmc2V0LmNsaWNrLmxlZnQsdGhpcy5pbnN0YW5jZS5vZmZzZXQucGFyZW50LmxlZnQtPXIub2Zmc2V0LnBhcmVudC5sZWZ0LXRoaXMuaW5zdGFuY2Uub2Zmc2V0LnBhcmVudC5sZWZ0LHRoaXMuaW5zdGFuY2Uub2Zmc2V0LnBhcmVudC50b3AtPXIub2Zmc2V0LnBhcmVudC50b3AtdGhpcy5pbnN0YW5jZS5vZmZzZXQucGFyZW50LnRvcCxyLl90cmlnZ2VyKCJ0b1NvcnRhYmxlIix0KSxyLmRyb3BwZWQ9dGhpcy5pbnN0YW5jZS5lbGVtZW50LHIuY3VycmVudEl0ZW09ci5lbGVtZW50LHRoaXMuaW5zdGFuY2UuZnJvbU91dHNpZGU9ciksdGhpcy5pbnN0YW5jZS5jdXJyZW50SXRlbSYmdGhpcy5pbnN0YW5jZS5fbW91c2VEcmFnKHQpKTp0aGlzLmluc3RhbmNlLmlzT3ZlciYmKHRoaXMuaW5zdGFuY2UuaXNPdmVyPTAsdGhpcy5pbnN0YW5jZS5jYW5jZWxIZWxwZXJSZW1vdmFsPSEwLHRoaXMuaW5zdGFuY2Uub3B0aW9ucy5yZXZlcnQ9ITEsdGhpcy5pbnN0YW5jZS5fdHJpZ2dlcigib3V0Iix0LHRoaXMuaW5zdGFuY2UuX3VpSGFzaCh0aGlzLmluc3RhbmNlKSksdGhpcy5pbnN0YW5jZS5fbW91c2VTdG9wKHQsITApLHRoaXMuaW5zdGFuY2Uub3B0aW9ucy5oZWxwZXI9dGhpcy5pbnN0YW5jZS5vcHRpb25zLl9oZWxwZXIsdGhpcy5pbnN0YW5jZS5jdXJyZW50SXRlbS5yZW1vdmUoKSx0aGlzLmluc3RhbmNlLnBsYWNlaG9sZGVyJiZ0aGlzLmluc3RhbmNlLnBsYWNlaG9sZGVyLnJlbW92ZSgpLHIuX3RyaWdnZXIoImZyb21Tb3J0YWJsZSIsdCksci5kcm9wcGVkPSExKX0pfX0pLGUudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwiY3Vyc29yIix7c3RhcnQ6ZnVuY3Rpb24odCxuKXt2YXIgcj1lKCJib2R5IiksaT1lKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnM7ci5jc3MoImN1cnNvciIpJiYoaS5fY3Vyc29yPXIuY3NzKCJjdXJzb3IiKSksci5jc3MoImN1cnNvciIsaS5jdXJzb3IpfSxzdG9wOmZ1bmN0aW9uKHQsbil7dmFyIHI9ZSh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKS5vcHRpb25zO3IuX2N1cnNvciYmZSgiYm9keSIpLmNzcygiY3Vyc29yIixyLl9jdXJzb3IpfX0pLGUudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwib3BhY2l0eSIse3N0YXJ0OmZ1bmN0aW9uKHQsbil7dmFyIHI9ZShuLmhlbHBlciksaT1lKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnM7ci5jc3MoIm9wYWNpdHkiKSYmKGkuX29wYWNpdHk9ci5jc3MoIm9wYWNpdHkiKSksci5jc3MoIm9wYWNpdHkiLGkub3BhY2l0eSl9LHN0b3A6ZnVuY3Rpb24odCxuKXt2YXIgcj1lKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnM7ci5fb3BhY2l0eSYmZShuLmhlbHBlcikuY3NzKCJvcGFjaXR5IixyLl9vcGFjaXR5KX19KSxlLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsInNjcm9sbCIse3N0YXJ0OmZ1bmN0aW9uKHQsbil7dmFyIHI9ZSh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKTtyLnNjcm9sbFBhcmVudFswXSE9ZG9jdW1lbnQmJnIuc2Nyb2xsUGFyZW50WzBdLnRhZ05hbWUhPSJIVE1MIiYmKHIub3ZlcmZsb3dPZmZzZXQ9ci5zY3JvbGxQYXJlbnQub2Zmc2V0KCkpfSxkcmFnOmZ1bmN0aW9uKHQsbil7dmFyIHI9ZSh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKSxpPXIub3B0aW9ucyxzPSExO2lmKHIuc2Nyb2xsUGFyZW50WzBdIT1kb2N1bWVudCYmci5zY3JvbGxQYXJlbnRbMF0udGFnTmFtZSE9IkhUTUwiKXtpZighaS5heGlzfHxpLmF4aXMhPSJ4IilyLm92ZXJmbG93T2Zmc2V0LnRvcCtyLnNjcm9sbFBhcmVudFswXS5vZmZzZXRIZWlnaHQtdC5wYWdlWTxpLnNjcm9sbFNlbnNpdGl2aXR5P3Iuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcD1zPXIuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcCtpLnNjcm9sbFNwZWVkOnQucGFnZVktci5vdmVyZmxvd09mZnNldC50b3A8aS5zY3JvbGxTZW5zaXRpdml0eSYmKHIuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcD1zPXIuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcC1pLnNjcm9sbFNwZWVkKTtpZighaS5heGlzfHxpLmF4aXMhPSJ5IilyLm92ZXJmbG93T2Zmc2V0LmxlZnQrci5zY3JvbGxQYXJlbnRbMF0ub2Zmc2V0V2lkdGgtdC5wYWdlWDxpLnNjcm9sbFNlbnNpdGl2aXR5P3Iuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQ9cz1yLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0K2kuc2Nyb2xsU3BlZWQ6dC5wYWdlWC1yLm92ZXJmbG93T2Zmc2V0LmxlZnQ8aS5zY3JvbGxTZW5zaXRpdml0eSYmKHIuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQ9cz1yLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0LWkuc2Nyb2xsU3BlZWQpfWVsc2V7aWYoIWkuYXhpc3x8aS5heGlzIT0ieCIpdC5wYWdlWS1lKGRvY3VtZW50KS5zY3JvbGxUb3AoKTxpLnNjcm9sbFNlbnNpdGl2aXR5P3M9ZShkb2N1bWVudCkuc2Nyb2xsVG9wKGUoZG9jdW1lbnQpLnNjcm9sbFRvcCgpLWkuc2Nyb2xsU3BlZWQpOmUod2luZG93KS5oZWlnaHQoKS0odC5wYWdlWS1lKGRvY3VtZW50KS5zY3JvbGxUb3AoKSk8aS5zY3JvbGxTZW5zaXRpdml0eSYmKHM9ZShkb2N1bWVudCkuc2Nyb2xsVG9wKGUoZG9jdW1lbnQpLnNjcm9sbFRvcCgpK2kuc2Nyb2xsU3BlZWQpKTtpZighaS5heGlzfHxpLmF4aXMhPSJ5Iil0LnBhZ2VYLWUoZG9jdW1lbnQpLnNjcm9sbExlZnQoKTxpLnNjcm9sbFNlbnNpdGl2aXR5P3M9ZShkb2N1bWVudCkuc2Nyb2xsTGVmdChlKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCktaS5zY3JvbGxTcGVlZCk6ZSh3aW5kb3cpLndpZHRoKCktKHQucGFnZVgtZShkb2N1bWVudCkuc2Nyb2xsTGVmdCgpKTxpLnNjcm9sbFNlbnNpdGl2aXR5JiYocz1lKGRvY3VtZW50KS5zY3JvbGxMZWZ0KGUoZG9jdW1lbnQpLnNjcm9sbExlZnQoKStpLnNjcm9sbFNwZWVkKSl9cyE9PSExJiZlLnVpLmRkbWFuYWdlciYmIWkuZHJvcEJlaGF2aW91ciYmZS51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHMocix0KX19KSxlLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsInNuYXAiLHtzdGFydDpmdW5jdGlvbih0LG4pe3ZhciByPWUodGhpcykuZGF0YSgiZHJhZ2dhYmxlIiksaT1yLm9wdGlvbnM7ci5zbmFwRWxlbWVudHM9W10sZShpLnNuYXAuY29uc3RydWN0b3IhPVN0cmluZz9pLnNuYXAuaXRlbXN8fCI6ZGF0YShkcmFnZ2FibGUpIjppLnNuYXApLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLG49dC5vZmZzZXQoKTt0aGlzIT1yLmVsZW1lbnRbMF0mJnIuc25hcEVsZW1lbnRzLnB1c2goe2l0ZW06dGhpcyx3aWR0aDp0Lm91dGVyV2lkdGgoKSxoZWlnaHQ6dC5vdXRlckhlaWdodCgpLHRvcDpuLnRvcCxsZWZ0Om4ubGVmdH0pfSl9LGRyYWc6ZnVuY3Rpb24odCxuKXt2YXIgcj1lKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLGk9ci5vcHRpb25zLHM9aS5zbmFwVG9sZXJhbmNlLG89bi5vZmZzZXQubGVmdCx1PW8rci5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aCxhPW4ub2Zmc2V0LnRvcCxmPWErci5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQ7Zm9yKHZhciBsPXIuc25hcEVsZW1lbnRzLmxlbmd0aC0xO2w+PTA7bC0tKXt2YXIgYz1yLnNuYXBFbGVtZW50c1tsXS5sZWZ0LGg9YytyLnNuYXBFbGVtZW50c1tsXS53aWR0aCxwPXIuc25hcEVsZW1lbnRzW2xdLnRvcCxkPXArci5zbmFwRWxlbWVudHNbbF0uaGVpZ2h0O2lmKCEoYy1zPG8mJm88aCtzJiZwLXM8YSYmYTxkK3N8fGMtczxvJiZvPGgrcyYmcC1zPGYmJmY8ZCtzfHxjLXM8dSYmdTxoK3MmJnAtczxhJiZhPGQrc3x8Yy1zPHUmJnU8aCtzJiZwLXM8ZiYmZjxkK3MpKXtyLnNuYXBFbGVtZW50c1tsXS5zbmFwcGluZyYmci5vcHRpb25zLnNuYXAucmVsZWFzZSYmci5vcHRpb25zLnNuYXAucmVsZWFzZS5jYWxsKHIuZWxlbWVudCx0LGUuZXh0ZW5kKHIuX3VpSGFzaCgpLHtzbmFwSXRlbTpyLnNuYXBFbGVtZW50c1tsXS5pdGVtfSkpLHIuc25hcEVsZW1lbnRzW2xdLnNuYXBwaW5nPSExO2NvbnRpbnVlfWlmKGkuc25hcE1vZGUhPSJpbm5lciIpe3ZhciB2PU1hdGguYWJzKHAtZik8PXMsbT1NYXRoLmFicyhkLWEpPD1zLGc9TWF0aC5hYnMoYy11KTw9cyx5PU1hdGguYWJzKGgtbyk8PXM7diYmKG4ucG9zaXRpb24udG9wPXIuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDpwLXIuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LGxlZnQ6MH0pLnRvcC1yLm1hcmdpbnMudG9wKSxtJiYobi5wb3NpdGlvbi50b3A9ci5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOmQsbGVmdDowfSkudG9wLXIubWFyZ2lucy50b3ApLGcmJihuLnBvc2l0aW9uLmxlZnQ9ci5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOjAsbGVmdDpjLXIuaGVscGVyUHJvcG9ydGlvbnMud2lkdGh9KS5sZWZ0LXIubWFyZ2lucy5sZWZ0KSx5JiYobi5wb3NpdGlvbi5sZWZ0PXIuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDowLGxlZnQ6aH0pLmxlZnQtci5tYXJnaW5zLmxlZnQpfXZhciBiPXZ8fG18fGd8fHk7aWYoaS5zbmFwTW9kZSE9Im91dGVyIil7dmFyIHY9TWF0aC5hYnMocC1hKTw9cyxtPU1hdGguYWJzKGQtZik8PXMsZz1NYXRoLmFicyhjLW8pPD1zLHk9TWF0aC5hYnMoaC11KTw9czt2JiYobi5wb3NpdGlvbi50b3A9ci5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOnAsbGVmdDowfSkudG9wLXIubWFyZ2lucy50b3ApLG0mJihuLnBvc2l0aW9uLnRvcD1yLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6ZC1yLmhlbHBlclByb3BvcnRpb25zLmhlaWdodCxsZWZ0OjB9KS50b3Atci5tYXJnaW5zLnRvcCksZyYmKG4ucG9zaXRpb24ubGVmdD1yLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6MCxsZWZ0OmN9KS5sZWZ0LXIubWFyZ2lucy5sZWZ0KSx5JiYobi5wb3NpdGlvbi5sZWZ0PXIuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDowLGxlZnQ6aC1yLmhlbHBlclByb3BvcnRpb25zLndpZHRofSkubGVmdC1yLm1hcmdpbnMubGVmdCl9IXIuc25hcEVsZW1lbnRzW2xdLnNuYXBwaW5nJiYodnx8bXx8Z3x8eXx8YikmJnIub3B0aW9ucy5zbmFwLnNuYXAmJnIub3B0aW9ucy5zbmFwLnNuYXAuY2FsbChyLmVsZW1lbnQsdCxlLmV4dGVuZChyLl91aUhhc2goKSx7c25hcEl0ZW06ci5zbmFwRWxlbWVudHNbbF0uaXRlbX0pKSxyLnNuYXBFbGVtZW50c1tsXS5zbmFwcGluZz12fHxtfHxnfHx5fHxifX19KSxlLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsInN0YWNrIix7c3RhcnQ6ZnVuY3Rpb24odCxuKXt2YXIgcj1lKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnMsaT1lLm1ha2VBcnJheShlKHIuc3RhY2spKS5zb3J0KGZ1bmN0aW9uKHQsbil7cmV0dXJuKHBhcnNlSW50KGUodCkuY3NzKCJ6SW5kZXgiKSwxMCl8fDApLShwYXJzZUludChlKG4pLmNzcygiekluZGV4IiksMTApfHwwKX0pO2lmKCFpLmxlbmd0aClyZXR1cm47dmFyIHM9cGFyc2VJbnQoaVswXS5zdHlsZS56SW5kZXgpfHwwO2UoaSkuZWFjaChmdW5jdGlvbihlKXt0aGlzLnN0eWxlLnpJbmRleD1zK2V9KSx0aGlzWzBdLnN0eWxlLnpJbmRleD1zK2kubGVuZ3RofX0pLGUudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwiekluZGV4Iix7c3RhcnQ6ZnVuY3Rpb24odCxuKXt2YXIgcj1lKG4uaGVscGVyKSxpPWUodGhpcykuZGF0YSgiZHJhZ2dhYmxlIikub3B0aW9ucztyLmNzcygiekluZGV4IikmJihpLl96SW5kZXg9ci5jc3MoInpJbmRleCIpKSxyLmNzcygiekluZGV4IixpLnpJbmRleCl9LHN0b3A6ZnVuY3Rpb24odCxuKXt2YXIgcj1lKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnM7ci5fekluZGV4JiZlKG4uaGVscGVyKS5jc3MoInpJbmRleCIsci5fekluZGV4KX19KX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGUsdCl7ZS53aWRnZXQoInVpLmRyb3BwYWJsZSIse3ZlcnNpb246IjEuOS4yIix3aWRnZXRFdmVudFByZWZpeDoiZHJvcCIsb3B0aW9uczp7YWNjZXB0OiIqIixhY3RpdmVDbGFzczohMSxhZGRDbGFzc2VzOiEwLGdyZWVkeTohMSxob3ZlckNsYXNzOiExLHNjb3BlOiJkZWZhdWx0Iix0b2xlcmFuY2U6ImludGVyc2VjdCJ9LF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMsbj10LmFjY2VwdDt0aGlzLmlzb3Zlcj0wLHRoaXMuaXNvdXQ9MSx0aGlzLmFjY2VwdD1lLmlzRnVuY3Rpb24obik/bjpmdW5jdGlvbihlKXtyZXR1cm4gZS5pcyhuKX0sdGhpcy5wcm9wb3J0aW9ucz17d2lkdGg6dGhpcy5lbGVtZW50WzBdLm9mZnNldFdpZHRoLGhlaWdodDp0aGlzLmVsZW1lbnRbMF0ub2Zmc2V0SGVpZ2h0fSxlLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW3Quc2NvcGVdPWUudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbdC5zY29wZV18fFtdLGUudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbdC5zY29wZV0ucHVzaCh0aGlzKSx0LmFkZENsYXNzZXMmJnRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktZHJvcHBhYmxlIil9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dmFyIHQ9ZS51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1t0aGlzLm9wdGlvbnMuc2NvcGVdO2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXRbbl09PXRoaXMmJnQuc3BsaWNlKG4sMSk7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1kcm9wcGFibGUgdWktZHJvcHBhYmxlLWRpc2FibGVkIil9LF9zZXRPcHRpb246ZnVuY3Rpb24odCxuKXt0PT0iYWNjZXB0IiYmKHRoaXMuYWNjZXB0PWUuaXNGdW5jdGlvbihuKT9uOmZ1bmN0aW9uKGUpe3JldHVybiBlLmlzKG4pfSksZS5XaWRnZXQucHJvdG90eXBlLl9zZXRPcHRpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfYWN0aXZhdGU6ZnVuY3Rpb24odCl7dmFyIG49ZS51aS5kZG1hbmFnZXIuY3VycmVudDt0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MmJnRoaXMuZWxlbWVudC5hZGRDbGFzcyh0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MpLG4mJnRoaXMuX3RyaWdnZXIoImFjdGl2YXRlIix0LHRoaXMudWkobikpfSxfZGVhY3RpdmF0ZTpmdW5jdGlvbih0KXt2YXIgbj1lLnVpLmRkbWFuYWdlci5jdXJyZW50O3RoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyYmdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyksbiYmdGhpcy5fdHJpZ2dlcigiZGVhY3RpdmF0ZSIsdCx0aGlzLnVpKG4pKX0sX292ZXI6ZnVuY3Rpb24odCl7dmFyIG49ZS51aS5kZG1hbmFnZXIuY3VycmVudDtpZighbnx8KG4uY3VycmVudEl0ZW18fG4uZWxlbWVudClbMF09PXRoaXMuZWxlbWVudFswXSlyZXR1cm47dGhpcy5hY2NlcHQuY2FsbCh0aGlzLmVsZW1lbnRbMF0sbi5jdXJyZW50SXRlbXx8bi5lbGVtZW50KSYmKHRoaXMub3B0aW9ucy5ob3ZlckNsYXNzJiZ0aGlzLmVsZW1lbnQuYWRkQ2xhc3ModGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MpLHRoaXMuX3RyaWdnZXIoIm92ZXIiLHQsdGhpcy51aShuKSkpfSxfb3V0OmZ1bmN0aW9uKHQpe3ZhciBuPWUudWkuZGRtYW5hZ2VyLmN1cnJlbnQ7aWYoIW58fChuLmN1cnJlbnRJdGVtfHxuLmVsZW1lbnQpWzBdPT10aGlzLmVsZW1lbnRbMF0pcmV0dXJuO3RoaXMuYWNjZXB0LmNhbGwodGhpcy5lbGVtZW50WzBdLG4uY3VycmVudEl0ZW18fG4uZWxlbWVudCkmJih0aGlzLm9wdGlvbnMuaG92ZXJDbGFzcyYmdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5ob3ZlckNsYXNzKSx0aGlzLl90cmlnZ2VyKCJvdXQiLHQsdGhpcy51aShuKSkpfSxfZHJvcDpmdW5jdGlvbih0LG4pe3ZhciByPW58fGUudWkuZGRtYW5hZ2VyLmN1cnJlbnQ7aWYoIXJ8fChyLmN1cnJlbnRJdGVtfHxyLmVsZW1lbnQpWzBdPT10aGlzLmVsZW1lbnRbMF0pcmV0dXJuITE7dmFyIGk9ITE7cmV0dXJuIHRoaXMuZWxlbWVudC5maW5kKCI6ZGF0YShkcm9wcGFibGUpIikubm90KCIudWktZHJhZ2dhYmxlLWRyYWdnaW5nIikuZWFjaChmdW5jdGlvbigpe3ZhciB0PWUuZGF0YSh0aGlzLCJkcm9wcGFibGUiKTtpZih0Lm9wdGlvbnMuZ3JlZWR5JiYhdC5vcHRpb25zLmRpc2FibGVkJiZ0Lm9wdGlvbnMuc2NvcGU9PXIub3B0aW9ucy5zY29wZSYmdC5hY2NlcHQuY2FsbCh0LmVsZW1lbnRbMF0sci5jdXJyZW50SXRlbXx8ci5lbGVtZW50KSYmZS51aS5pbnRlcnNlY3QocixlLmV4dGVuZCh0LHtvZmZzZXQ6dC5lbGVtZW50Lm9mZnNldCgpfSksdC5vcHRpb25zLnRvbGVyYW5jZSkpcmV0dXJuIGk9ITAsITF9KSxpPyExOnRoaXMuYWNjZXB0LmNhbGwodGhpcy5lbGVtZW50WzBdLHIuY3VycmVudEl0ZW18fHIuZWxlbWVudCk/KHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyYmdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyksdGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MmJnRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuaG92ZXJDbGFzcyksdGhpcy5fdHJpZ2dlcigiZHJvcCIsdCx0aGlzLnVpKHIpKSx0aGlzLmVsZW1lbnQpOiExfSx1aTpmdW5jdGlvbihlKXtyZXR1cm57ZHJhZ2dhYmxlOmUuY3VycmVudEl0ZW18fGUuZWxlbWVudCxoZWxwZXI6ZS5oZWxwZXIscG9zaXRpb246ZS5wb3NpdGlvbixvZmZzZXQ6ZS5wb3NpdGlvbkFic319fSksZS51aS5pbnRlcnNlY3Q9ZnVuY3Rpb24odCxuLHIpe2lmKCFuLm9mZnNldClyZXR1cm4hMTt2YXIgaT0odC5wb3NpdGlvbkFic3x8dC5wb3NpdGlvbi5hYnNvbHV0ZSkubGVmdCxzPWkrdC5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aCxvPSh0LnBvc2l0aW9uQWJzfHx0LnBvc2l0aW9uLmFic29sdXRlKS50b3AsdT1vK3QuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LGE9bi5vZmZzZXQubGVmdCxmPWErbi5wcm9wb3J0aW9ucy53aWR0aCxsPW4ub2Zmc2V0LnRvcCxjPWwrbi5wcm9wb3J0aW9ucy5oZWlnaHQ7c3dpdGNoKHIpe2Nhc2UiZml0IjpyZXR1cm4gYTw9aSYmczw9ZiYmbDw9byYmdTw9YztjYXNlImludGVyc2VjdCI6cmV0dXJuIGE8aSt0LmhlbHBlclByb3BvcnRpb25zLndpZHRoLzImJnMtdC5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC8yPGYmJmw8byt0LmhlbHBlclByb3BvcnRpb25zLmhlaWdodC8yJiZ1LXQuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LzI8YztjYXNlInBvaW50ZXIiOnZhciBoPSh0LnBvc2l0aW9uQWJzfHx0LnBvc2l0aW9uLmFic29sdXRlKS5sZWZ0Kyh0LmNsaWNrT2Zmc2V0fHx0Lm9mZnNldC5jbGljaykubGVmdCxwPSh0LnBvc2l0aW9uQWJzfHx0LnBvc2l0aW9uLmFic29sdXRlKS50b3ArKHQuY2xpY2tPZmZzZXR8fHQub2Zmc2V0LmNsaWNrKS50b3AsZD1lLnVpLmlzT3ZlcihwLGgsbCxhLG4ucHJvcG9ydGlvbnMuaGVpZ2h0LG4ucHJvcG9ydGlvbnMud2lkdGgpO3JldHVybiBkO2Nhc2UidG91Y2giOnJldHVybihvPj1sJiZvPD1jfHx1Pj1sJiZ1PD1jfHxvPGwmJnU+YykmJihpPj1hJiZpPD1mfHxzPj1hJiZzPD1mfHxpPGEmJnM+Zik7ZGVmYXVsdDpyZXR1cm4hMX19LGUudWkuZGRtYW5hZ2VyPXtjdXJyZW50Om51bGwsZHJvcHBhYmxlczp7ImRlZmF1bHQiOltdfSxwcmVwYXJlT2Zmc2V0czpmdW5jdGlvbih0LG4pe3ZhciByPWUudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbdC5vcHRpb25zLnNjb3BlXXx8W10saT1uP24udHlwZTpudWxsLHM9KHQuY3VycmVudEl0ZW18fHQuZWxlbWVudCkuZmluZCgiOmRhdGEoZHJvcHBhYmxlKSIpLmFuZFNlbGYoKTtlOmZvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXtpZihyW29dLm9wdGlvbnMuZGlzYWJsZWR8fHQmJiFyW29dLmFjY2VwdC5jYWxsKHJbb10uZWxlbWVudFswXSx0LmN1cnJlbnRJdGVtfHx0LmVsZW1lbnQpKWNvbnRpbnVlO2Zvcih2YXIgdT0wO3U8cy5sZW5ndGg7dSsrKWlmKHNbdV09PXJbb10uZWxlbWVudFswXSl7cltvXS5wcm9wb3J0aW9ucy5oZWlnaHQ9MDtjb250aW51ZSBlfXJbb10udmlzaWJsZT1yW29dLmVsZW1lbnQuY3NzKCJkaXNwbGF5IikhPSJub25lIjtpZighcltvXS52aXNpYmxlKWNvbnRpbnVlO2k9PSJtb3VzZWRvd24iJiZyW29dLl9hY3RpdmF0ZS5jYWxsKHJbb10sbikscltvXS5vZmZzZXQ9cltvXS5lbGVtZW50Lm9mZnNldCgpLHJbb10ucHJvcG9ydGlvbnM9e3dpZHRoOnJbb10uZWxlbWVudFswXS5vZmZzZXRXaWR0aCxoZWlnaHQ6cltvXS5lbGVtZW50WzBdLm9mZnNldEhlaWdodH19fSxkcm9wOmZ1bmN0aW9uKHQsbil7dmFyIHI9ITE7cmV0dXJuIGUuZWFjaChlLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW3Qub3B0aW9ucy5zY29wZV18fFtdLGZ1bmN0aW9uKCl7aWYoIXRoaXMub3B0aW9ucylyZXR1cm47IXRoaXMub3B0aW9ucy5kaXNhYmxlZCYmdGhpcy52aXNpYmxlJiZlLnVpLmludGVyc2VjdCh0LHRoaXMsdGhpcy5vcHRpb25zLnRvbGVyYW5jZSkmJihyPXRoaXMuX2Ryb3AuY2FsbCh0aGlzLG4pfHxyKSwhdGhpcy5vcHRpb25zLmRpc2FibGVkJiZ0aGlzLnZpc2libGUmJnRoaXMuYWNjZXB0LmNhbGwodGhpcy5lbGVtZW50WzBdLHQuY3VycmVudEl0ZW18fHQuZWxlbWVudCkmJih0aGlzLmlzb3V0PTEsdGhpcy5pc292ZXI9MCx0aGlzLl9kZWFjdGl2YXRlLmNhbGwodGhpcyxuKSl9KSxyfSxkcmFnU3RhcnQ6ZnVuY3Rpb24odCxuKXt0LmVsZW1lbnQucGFyZW50c1VudGlsKCJib2R5IikuYmluZCgic2Nyb2xsLmRyb3BwYWJsZSIsZnVuY3Rpb24oKXt0Lm9wdGlvbnMucmVmcmVzaFBvc2l0aW9uc3x8ZS51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHModCxuKX0pfSxkcmFnOmZ1bmN0aW9uKHQsbil7dC5vcHRpb25zLnJlZnJlc2hQb3NpdGlvbnMmJmUudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKHQsbiksZS5lYWNoKGUudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbdC5vcHRpb25zLnNjb3BlXXx8W10sZnVuY3Rpb24oKXtpZih0aGlzLm9wdGlvbnMuZGlzYWJsZWR8fHRoaXMuZ3JlZWR5Q2hpbGR8fCF0aGlzLnZpc2libGUpcmV0dXJuO3ZhciByPWUudWkuaW50ZXJzZWN0KHQsdGhpcyx0aGlzLm9wdGlvbnMudG9sZXJhbmNlKSxpPSFyJiZ0aGlzLmlzb3Zlcj09MT8iaXNvdXQiOnImJnRoaXMuaXNvdmVyPT0wPyJpc292ZXIiOm51bGw7aWYoIWkpcmV0dXJuO3ZhciBzO2lmKHRoaXMub3B0aW9ucy5ncmVlZHkpe3ZhciBvPXRoaXMub3B0aW9ucy5zY29wZSx1PXRoaXMuZWxlbWVudC5wYXJlbnRzKCI6ZGF0YShkcm9wcGFibGUpIikuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIGUuZGF0YSh0aGlzLCJkcm9wcGFibGUiKS5vcHRpb25zLnNjb3BlPT09b30pO3UubGVuZ3RoJiYocz1lLmRhdGEodVswXSwiZHJvcHBhYmxlIikscy5ncmVlZHlDaGlsZD1pPT0iaXNvdmVyIj8xOjApfXMmJmk9PSJpc292ZXIiJiYocy5pc292ZXI9MCxzLmlzb3V0PTEscy5fb3V0LmNhbGwocyxuKSksdGhpc1tpXT0xLHRoaXNbaT09Imlzb3V0Ij8iaXNvdmVyIjoiaXNvdXQiXT0wLHRoaXNbaT09Imlzb3ZlciI/Il9vdmVyIjoiX291dCJdLmNhbGwodGhpcyxuKSxzJiZpPT0iaXNvdXQiJiYocy5pc291dD0wLHMuaXNvdmVyPTEscy5fb3Zlci5jYWxsKHMsbikpfSl9LGRyYWdTdG9wOmZ1bmN0aW9uKHQsbil7dC5lbGVtZW50LnBhcmVudHNVbnRpbCgiYm9keSIpLnVuYmluZCgic2Nyb2xsLmRyb3BwYWJsZSIpLHQub3B0aW9ucy5yZWZyZXNoUG9zaXRpb25zfHxlLnVpLmRkbWFuYWdlci5wcmVwYXJlT2Zmc2V0cyh0LG4pfX19KShqUXVlcnkpOyhmdW5jdGlvbihlLHQpe2Uud2lkZ2V0KCJ1aS5yZXNpemFibGUiLGUudWkubW91c2Use3ZlcnNpb246IjEuOS4yIix3aWRnZXRFdmVudFByZWZpeDoicmVzaXplIixvcHRpb25zOnthbHNvUmVzaXplOiExLGFuaW1hdGU6ITEsYW5pbWF0ZUR1cmF0aW9uOiJzbG93IixhbmltYXRlRWFzaW5nOiJzd2luZyIsYXNwZWN0UmF0aW86ITEsYXV0b0hpZGU6ITEsY29udGFpbm1lbnQ6ITEsZ2hvc3Q6ITEsZ3JpZDohMSxoYW5kbGVzOiJlLHMsc2UiLGhlbHBlcjohMSxtYXhIZWlnaHQ6bnVsbCxtYXhXaWR0aDpudWxsLG1pbkhlaWdodDoxMCxtaW5XaWR0aDoxMCx6SW5kZXg6MWUzfSxfY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxuPXRoaXMub3B0aW9uczt0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLXJlc2l6YWJsZSIpLGUuZXh0ZW5kKHRoaXMse19hc3BlY3RSYXRpbzohIW4uYXNwZWN0UmF0aW8sYXNwZWN0UmF0aW86bi5hc3BlY3RSYXRpbyxvcmlnaW5hbEVsZW1lbnQ6dGhpcy5lbGVtZW50LF9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzOltdLF9oZWxwZXI6bi5oZWxwZXJ8fG4uZ2hvc3R8fG4uYW5pbWF0ZT9uLmhlbHBlcnx8InVpLXJlc2l6YWJsZS1oZWxwZXIiOm51bGx9KSx0aGlzLmVsZW1lbnRbMF0ubm9kZU5hbWUubWF0Y2goL2NhbnZhc3x0ZXh0YXJlYXxpbnB1dHxzZWxlY3R8YnV0dG9ufGltZy9pKSYmKHRoaXMuZWxlbWVudC53cmFwKGUoJzxkaXYgY2xhc3M9InVpLXdyYXBwZXIiIHN0eWxlPSJvdmVyZmxvdzogaGlkZGVuOyI+PC9kaXY+JykuY3NzKHtwb3NpdGlvbjp0aGlzLmVsZW1lbnQuY3NzKCJwb3NpdGlvbiIpLHdpZHRoOnRoaXMuZWxlbWVudC5vdXRlcldpZHRoKCksaGVpZ2h0OnRoaXMuZWxlbWVudC5vdXRlckhlaWdodCgpLHRvcDp0aGlzLmVsZW1lbnQuY3NzKCJ0b3AiKSxsZWZ0OnRoaXMuZWxlbWVudC5jc3MoImxlZnQiKX0pKSx0aGlzLmVsZW1lbnQ9dGhpcy5lbGVtZW50LnBhcmVudCgpLmRhdGEoInJlc2l6YWJsZSIsdGhpcy5lbGVtZW50LmRhdGEoInJlc2l6YWJsZSIpKSx0aGlzLmVsZW1lbnRJc1dyYXBwZXI9ITAsdGhpcy5lbGVtZW50LmNzcyh7bWFyZ2luTGVmdDp0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoIm1hcmdpbkxlZnQiKSxtYXJnaW5Ub3A6dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJtYXJnaW5Ub3AiKSxtYXJnaW5SaWdodDp0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoIm1hcmdpblJpZ2h0IiksbWFyZ2luQm90dG9tOnRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygibWFyZ2luQm90dG9tIil9KSx0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3Moe21hcmdpbkxlZnQ6MCxtYXJnaW5Ub3A6MCxtYXJnaW5SaWdodDowLG1hcmdpbkJvdHRvbTowfSksdGhpcy5vcmlnaW5hbFJlc2l6ZVN0eWxlPXRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygicmVzaXplIiksdGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJyZXNpemUiLCJub25lIiksdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50cy5wdXNoKHRoaXMub3JpZ2luYWxFbGVtZW50LmNzcyh7cG9zaXRpb246InN0YXRpYyIsem9vbToxLGRpc3BsYXk6ImJsb2NrIn0pKSx0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3Moe21hcmdpbjp0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoIm1hcmdpbiIpfSksdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemUoKSksdGhpcy5oYW5kbGVzPW4uaGFuZGxlc3x8KGUoIi51aS1yZXNpemFibGUtaGFuZGxlIix0aGlzLmVsZW1lbnQpLmxlbmd0aD97bjoiLnVpLXJlc2l6YWJsZS1uIixlOiIudWktcmVzaXphYmxlLWUiLHM6Ii51aS1yZXNpemFibGUtcyIsdzoiLnVpLXJlc2l6YWJsZS13IixzZToiLnVpLXJlc2l6YWJsZS1zZSIsc3c6Ii51aS1yZXNpemFibGUtc3ciLG5lOiIudWktcmVzaXphYmxlLW5lIixudzoiLnVpLXJlc2l6YWJsZS1udyJ9OiJlLHMsc2UiKTtpZih0aGlzLmhhbmRsZXMuY29uc3RydWN0b3I9PVN0cmluZyl7dGhpcy5oYW5kbGVzPT0iYWxsIiYmKHRoaXMuaGFuZGxlcz0ibixlLHMsdyxzZSxzdyxuZSxudyIpO3ZhciByPXRoaXMuaGFuZGxlcy5zcGxpdCgiLCIpO3RoaXMuaGFuZGxlcz17fTtmb3IodmFyIGk9MDtpPHIubGVuZ3RoO2krKyl7dmFyIHM9ZS50cmltKHJbaV0pLG89InVpLXJlc2l6YWJsZS0iK3MsdT1lKCc8ZGl2IGNsYXNzPSJ1aS1yZXNpemFibGUtaGFuZGxlICcrbysnIj48L2Rpdj4nKTt1LmNzcyh7ekluZGV4Om4uekluZGV4fSksInNlIj09cyYmdS5hZGRDbGFzcygidWktaWNvbiB1aS1pY29uLWdyaXBzbWFsbC1kaWFnb25hbC1zZSIpLHRoaXMuaGFuZGxlc1tzXT0iLnVpLXJlc2l6YWJsZS0iK3MsdGhpcy5lbGVtZW50LmFwcGVuZCh1KX19dGhpcy5fcmVuZGVyQXhpcz1mdW5jdGlvbih0KXt0PXR8fHRoaXMuZWxlbWVudDtmb3IodmFyIG4gaW4gdGhpcy5oYW5kbGVzKXt0aGlzLmhhbmRsZXNbbl0uY29uc3RydWN0b3I9PVN0cmluZyYmKHRoaXMuaGFuZGxlc1tuXT1lKHRoaXMuaGFuZGxlc1tuXSx0aGlzLmVsZW1lbnQpLnNob3coKSk7aWYodGhpcy5lbGVtZW50SXNXcmFwcGVyJiZ0aGlzLm9yaWdpbmFsRWxlbWVudFswXS5ub2RlTmFtZS5tYXRjaCgvdGV4dGFyZWF8aW5wdXR8c2VsZWN0fGJ1dHRvbi9pKSl7dmFyIHI9ZSh0aGlzLmhhbmRsZXNbbl0sdGhpcy5lbGVtZW50KSxpPTA7aT0vc3d8bmV8bnd8c2V8bnxzLy50ZXN0KG4pP3Iub3V0ZXJIZWlnaHQoKTpyLm91dGVyV2lkdGgoKTt2YXIgcz1bInBhZGRpbmciLC9uZXxud3xuLy50ZXN0KG4pPyJUb3AiOi9zZXxzd3xzLy50ZXN0KG4pPyJCb3R0b20iOi9eZSQvLnRlc3Qobik/IlJpZ2h0IjoiTGVmdCJdLmpvaW4oIiIpO3QuY3NzKHMsaSksdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemUoKX1pZighZSh0aGlzLmhhbmRsZXNbbl0pLmxlbmd0aCljb250aW51ZX19LHRoaXMuX3JlbmRlckF4aXModGhpcy5lbGVtZW50KSx0aGlzLl9oYW5kbGVzPWUoIi51aS1yZXNpemFibGUtaGFuZGxlIix0aGlzLmVsZW1lbnQpLmRpc2FibGVTZWxlY3Rpb24oKSx0aGlzLl9oYW5kbGVzLm1vdXNlb3ZlcihmdW5jdGlvbigpe2lmKCF0LnJlc2l6aW5nKXtpZih0aGlzLmNsYXNzTmFtZSl2YXIgZT10aGlzLmNsYXNzTmFtZS5tYXRjaCgvdWktcmVzaXphYmxlLShzZXxzd3xuZXxud3xufGV8c3x3KS9pKTt0LmF4aXM9ZSYmZVsxXT9lWzFdOiJzZSJ9fSksbi5hdXRvSGlkZSYmKHRoaXMuX2hhbmRsZXMuaGlkZSgpLGUodGhpcy5lbGVtZW50KS5hZGRDbGFzcygidWktcmVzaXphYmxlLWF1dG9oaWRlIikubW91c2VlbnRlcihmdW5jdGlvbigpe2lmKG4uZGlzYWJsZWQpcmV0dXJuO2UodGhpcykucmVtb3ZlQ2xhc3MoInVpLXJlc2l6YWJsZS1hdXRvaGlkZSIpLHQuX2hhbmRsZXMuc2hvdygpfSkubW91c2VsZWF2ZShmdW5jdGlvbigpe2lmKG4uZGlzYWJsZWQpcmV0dXJuO3QucmVzaXppbmd8fChlKHRoaXMpLmFkZENsYXNzKCJ1aS1yZXNpemFibGUtYXV0b2hpZGUiKSx0Ll9oYW5kbGVzLmhpZGUoKSl9KSksdGhpcy5fbW91c2VJbml0KCl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5fbW91c2VEZXN0cm95KCk7dmFyIHQ9ZnVuY3Rpb24odCl7ZSh0KS5yZW1vdmVDbGFzcygidWktcmVzaXphYmxlIHVpLXJlc2l6YWJsZS1kaXNhYmxlZCB1aS1yZXNpemFibGUtcmVzaXppbmciKS5yZW1vdmVEYXRhKCJyZXNpemFibGUiKS5yZW1vdmVEYXRhKCJ1aS1yZXNpemFibGUiKS51bmJpbmQoIi5yZXNpemFibGUiKS5maW5kKCIudWktcmVzaXphYmxlLWhhbmRsZSIpLnJlbW92ZSgpfTtpZih0aGlzLmVsZW1lbnRJc1dyYXBwZXIpe3QodGhpcy5lbGVtZW50KTt2YXIgbj10aGlzLmVsZW1lbnQ7dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKHtwb3NpdGlvbjpuLmNzcygicG9zaXRpb24iKSx3aWR0aDpuLm91dGVyV2lkdGgoKSxoZWlnaHQ6bi5vdXRlckhlaWdodCgpLHRvcDpuLmNzcygidG9wIiksbGVmdDpuLmNzcygibGVmdCIpfSkuaW5zZXJ0QWZ0ZXIobiksbi5yZW1vdmUoKX1yZXR1cm4gdGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJyZXNpemUiLHRoaXMub3JpZ2luYWxSZXNpemVTdHlsZSksdCh0aGlzLm9yaWdpbmFsRWxlbWVudCksdGhpc30sX21vdXNlQ2FwdHVyZTpmdW5jdGlvbih0KXt2YXIgbj0hMTtmb3IodmFyIHIgaW4gdGhpcy5oYW5kbGVzKWUodGhpcy5oYW5kbGVzW3JdKVswXT09dC50YXJnZXQmJihuPSEwKTtyZXR1cm4hdGhpcy5vcHRpb25zLmRpc2FibGVkJiZufSxfbW91c2VTdGFydDpmdW5jdGlvbih0KXt2YXIgcj10aGlzLm9wdGlvbnMsaT10aGlzLmVsZW1lbnQucG9zaXRpb24oKSxzPXRoaXMuZWxlbWVudDt0aGlzLnJlc2l6aW5nPSEwLHRoaXMuZG9jdW1lbnRTY3JvbGw9e3RvcDplKGRvY3VtZW50KS5zY3JvbGxUb3AoKSxsZWZ0OmUoZG9jdW1lbnQpLnNjcm9sbExlZnQoKX0sKHMuaXMoIi51aS1kcmFnZ2FibGUiKXx8L2Fic29sdXRlLy50ZXN0KHMuY3NzKCJwb3NpdGlvbiIpKSkmJnMuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDppLnRvcCxsZWZ0OmkubGVmdH0pLHRoaXMuX3JlbmRlclByb3h5KCk7dmFyIG89bih0aGlzLmhlbHBlci5jc3MoImxlZnQiKSksdT1uKHRoaXMuaGVscGVyLmNzcygidG9wIikpO3IuY29udGFpbm1lbnQmJihvKz1lKHIuY29udGFpbm1lbnQpLnNjcm9sbExlZnQoKXx8MCx1Kz1lKHIuY29udGFpbm1lbnQpLnNjcm9sbFRvcCgpfHwwKSx0aGlzLm9mZnNldD10aGlzLmhlbHBlci5vZmZzZXQoKSx0aGlzLnBvc2l0aW9uPXtsZWZ0Om8sdG9wOnV9LHRoaXMuc2l6ZT10aGlzLl9oZWxwZXI/e3dpZHRoOnMub3V0ZXJXaWR0aCgpLGhlaWdodDpzLm91dGVySGVpZ2h0KCl9Ont3aWR0aDpzLndpZHRoKCksaGVpZ2h0OnMuaGVpZ2h0KCl9LHRoaXMub3JpZ2luYWxTaXplPXRoaXMuX2hlbHBlcj97d2lkdGg6cy5vdXRlcldpZHRoKCksaGVpZ2h0OnMub3V0ZXJIZWlnaHQoKX06e3dpZHRoOnMud2lkdGgoKSxoZWlnaHQ6cy5oZWlnaHQoKX0sdGhpcy5vcmlnaW5hbFBvc2l0aW9uPXtsZWZ0Om8sdG9wOnV9LHRoaXMuc2l6ZURpZmY9e3dpZHRoOnMub3V0ZXJXaWR0aCgpLXMud2lkdGgoKSxoZWlnaHQ6cy5vdXRlckhlaWdodCgpLXMuaGVpZ2h0KCl9LHRoaXMub3JpZ2luYWxNb3VzZVBvc2l0aW9uPXtsZWZ0OnQucGFnZVgsdG9wOnQucGFnZVl9LHRoaXMuYXNwZWN0UmF0aW89dHlwZW9mIHIuYXNwZWN0UmF0aW89PSJudW1iZXIiP3IuYXNwZWN0UmF0aW86dGhpcy5vcmlnaW5hbFNpemUud2lkdGgvdGhpcy5vcmlnaW5hbFNpemUuaGVpZ2h0fHwxO3ZhciBhPWUoIi51aS1yZXNpemFibGUtIit0aGlzLmF4aXMpLmNzcygiY3Vyc29yIik7cmV0dXJuIGUoImJvZHkiKS5jc3MoImN1cnNvciIsYT09ImF1dG8iP3RoaXMuYXhpcysiLXJlc2l6ZSI6YSkscy5hZGRDbGFzcygidWktcmVzaXphYmxlLXJlc2l6aW5nIiksdGhpcy5fcHJvcGFnYXRlKCJzdGFydCIsdCksITB9LF9tb3VzZURyYWc6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5oZWxwZXIsbj10aGlzLm9wdGlvbnMscj17fSxpPXRoaXMscz10aGlzLm9yaWdpbmFsTW91c2VQb3NpdGlvbixvPXRoaXMuYXhpcyx1PWUucGFnZVgtcy5sZWZ0fHwwLGE9ZS5wYWdlWS1zLnRvcHx8MCxmPXRoaXMuX2NoYW5nZVtvXTtpZighZilyZXR1cm4hMTt2YXIgbD1mLmFwcGx5KHRoaXMsW2UsdSxhXSk7dGhpcy5fdXBkYXRlVmlydHVhbEJvdW5kYXJpZXMoZS5zaGlmdEtleSk7aWYodGhpcy5fYXNwZWN0UmF0aW98fGUuc2hpZnRLZXkpbD10aGlzLl91cGRhdGVSYXRpbyhsLGUpO3JldHVybiBsPXRoaXMuX3Jlc3BlY3RTaXplKGwsZSksdGhpcy5fcHJvcGFnYXRlKCJyZXNpemUiLGUpLHQuY3NzKHt0b3A6dGhpcy5wb3NpdGlvbi50b3ArInB4IixsZWZ0OnRoaXMucG9zaXRpb24ubGVmdCsicHgiLHdpZHRoOnRoaXMuc2l6ZS53aWR0aCsicHgiLGhlaWdodDp0aGlzLnNpemUuaGVpZ2h0KyJweCJ9KSwhdGhpcy5faGVscGVyJiZ0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLmxlbmd0aCYmdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemUoKSx0aGlzLl91cGRhdGVDYWNoZShsKSx0aGlzLl90cmlnZ2VyKCJyZXNpemUiLGUsdGhpcy51aSgpKSwhMX0sX21vdXNlU3RvcDpmdW5jdGlvbih0KXt0aGlzLnJlc2l6aW5nPSExO3ZhciBuPXRoaXMub3B0aW9ucyxyPXRoaXM7aWYodGhpcy5faGVscGVyKXt2YXIgaT10aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLHM9aS5sZW5ndGgmJi90ZXh0YXJlYS9pLnRlc3QoaVswXS5ub2RlTmFtZSksbz1zJiZlLnVpLmhhc1Njcm9sbChpWzBdLCJsZWZ0Iik/MDpyLnNpemVEaWZmLmhlaWdodCx1PXM/MDpyLnNpemVEaWZmLndpZHRoLGE9e3dpZHRoOnIuaGVscGVyLndpZHRoKCktdSxoZWlnaHQ6ci5oZWxwZXIuaGVpZ2h0KCktb30sZj1wYXJzZUludChyLmVsZW1lbnQuY3NzKCJsZWZ0IiksMTApKyhyLnBvc2l0aW9uLmxlZnQtci5vcmlnaW5hbFBvc2l0aW9uLmxlZnQpfHxudWxsLGw9cGFyc2VJbnQoci5lbGVtZW50LmNzcygidG9wIiksMTApKyhyLnBvc2l0aW9uLnRvcC1yLm9yaWdpbmFsUG9zaXRpb24udG9wKXx8bnVsbDtuLmFuaW1hdGV8fHRoaXMuZWxlbWVudC5jc3MoZS5leHRlbmQoYSx7dG9wOmwsbGVmdDpmfSkpLHIuaGVscGVyLmhlaWdodChyLnNpemUuaGVpZ2h0KSxyLmhlbHBlci53aWR0aChyLnNpemUud2lkdGgpLHRoaXMuX2hlbHBlciYmIW4uYW5pbWF0ZSYmdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemUoKX1yZXR1cm4gZSgiYm9keSIpLmNzcygiY3Vyc29yIiwiYXV0byIpLHRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktcmVzaXphYmxlLXJlc2l6aW5nIiksdGhpcy5fcHJvcGFnYXRlKCJzdG9wIix0KSx0aGlzLl9oZWxwZXImJnRoaXMuaGVscGVyLnJlbW92ZSgpLCExfSxfdXBkYXRlVmlydHVhbEJvdW5kYXJpZXM6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5vcHRpb25zLG4saSxzLG8sdTt1PXttaW5XaWR0aDpyKHQubWluV2lkdGgpP3QubWluV2lkdGg6MCxtYXhXaWR0aDpyKHQubWF4V2lkdGgpP3QubWF4V2lkdGg6SW5maW5pdHksbWluSGVpZ2h0OnIodC5taW5IZWlnaHQpP3QubWluSGVpZ2h0OjAsbWF4SGVpZ2h0OnIodC5tYXhIZWlnaHQpP3QubWF4SGVpZ2h0OkluZmluaXR5fTtpZih0aGlzLl9hc3BlY3RSYXRpb3x8ZSluPXUubWluSGVpZ2h0KnRoaXMuYXNwZWN0UmF0aW8scz11Lm1pbldpZHRoL3RoaXMuYXNwZWN0UmF0aW8saT11Lm1heEhlaWdodCp0aGlzLmFzcGVjdFJhdGlvLG89dS5tYXhXaWR0aC90aGlzLmFzcGVjdFJhdGlvLG4+dS5taW5XaWR0aCYmKHUubWluV2lkdGg9bikscz51Lm1pbkhlaWdodCYmKHUubWluSGVpZ2h0PXMpLGk8dS5tYXhXaWR0aCYmKHUubWF4V2lkdGg9aSksbzx1Lm1heEhlaWdodCYmKHUubWF4SGVpZ2h0PW8pO3RoaXMuX3ZCb3VuZGFyaWVzPXV9LF91cGRhdGVDYWNoZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLm9wdGlvbnM7dGhpcy5vZmZzZXQ9dGhpcy5oZWxwZXIub2Zmc2V0KCkscihlLmxlZnQpJiYodGhpcy5wb3NpdGlvbi5sZWZ0PWUubGVmdCkscihlLnRvcCkmJih0aGlzLnBvc2l0aW9uLnRvcD1lLnRvcCkscihlLmhlaWdodCkmJih0aGlzLnNpemUuaGVpZ2h0PWUuaGVpZ2h0KSxyKGUud2lkdGgpJiYodGhpcy5zaXplLndpZHRoPWUud2lkdGgpfSxfdXBkYXRlUmF0aW86ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLm9wdGlvbnMsaT10aGlzLnBvc2l0aW9uLHM9dGhpcy5zaXplLG89dGhpcy5heGlzO3JldHVybiByKGUuaGVpZ2h0KT9lLndpZHRoPWUuaGVpZ2h0KnRoaXMuYXNwZWN0UmF0aW86cihlLndpZHRoKSYmKGUuaGVpZ2h0PWUud2lkdGgvdGhpcy5hc3BlY3RSYXRpbyksbz09InN3IiYmKGUubGVmdD1pLmxlZnQrKHMud2lkdGgtZS53aWR0aCksZS50b3A9bnVsbCksbz09Im53IiYmKGUudG9wPWkudG9wKyhzLmhlaWdodC1lLmhlaWdodCksZS5sZWZ0PWkubGVmdCsocy53aWR0aC1lLndpZHRoKSksZX0sX3Jlc3BlY3RTaXplOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5oZWxwZXIsaT10aGlzLl92Qm91bmRhcmllcyxzPXRoaXMuX2FzcGVjdFJhdGlvfHx0LnNoaWZ0S2V5LG89dGhpcy5heGlzLHU9cihlLndpZHRoKSYmaS5tYXhXaWR0aCYmaS5tYXhXaWR0aDxlLndpZHRoLGE9cihlLmhlaWdodCkmJmkubWF4SGVpZ2h0JiZpLm1heEhlaWdodDxlLmhlaWdodCxmPXIoZS53aWR0aCkmJmkubWluV2lkdGgmJmkubWluV2lkdGg+ZS53aWR0aCxsPXIoZS5oZWlnaHQpJiZpLm1pbkhlaWdodCYmaS5taW5IZWlnaHQ+ZS5oZWlnaHQ7ZiYmKGUud2lkdGg9aS5taW5XaWR0aCksbCYmKGUuaGVpZ2h0PWkubWluSGVpZ2h0KSx1JiYoZS53aWR0aD1pLm1heFdpZHRoKSxhJiYoZS5oZWlnaHQ9aS5tYXhIZWlnaHQpO3ZhciBjPXRoaXMub3JpZ2luYWxQb3NpdGlvbi5sZWZ0K3RoaXMub3JpZ2luYWxTaXplLndpZHRoLGg9dGhpcy5wb3NpdGlvbi50b3ArdGhpcy5zaXplLmhlaWdodCxwPS9zd3xud3x3Ly50ZXN0KG8pLGQ9L253fG5lfG4vLnRlc3Qobyk7ZiYmcCYmKGUubGVmdD1jLWkubWluV2lkdGgpLHUmJnAmJihlLmxlZnQ9Yy1pLm1heFdpZHRoKSxsJiZkJiYoZS50b3A9aC1pLm1pbkhlaWdodCksYSYmZCYmKGUudG9wPWgtaS5tYXhIZWlnaHQpO3ZhciB2PSFlLndpZHRoJiYhZS5oZWlnaHQ7cmV0dXJuIHYmJiFlLmxlZnQmJmUudG9wP2UudG9wPW51bGw6diYmIWUudG9wJiZlLmxlZnQmJihlLmxlZnQ9bnVsbCksZX0sX3Byb3BvcnRpb25hbGx5UmVzaXplOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zO2lmKCF0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLmxlbmd0aClyZXR1cm47dmFyIG49dGhpcy5oZWxwZXJ8fHRoaXMuZWxlbWVudDtmb3IodmFyIHI9MDtyPHRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMubGVuZ3RoO3IrKyl7dmFyIGk9dGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50c1tyXTtpZighdGhpcy5ib3JkZXJEaWYpe3ZhciBzPVtpLmNzcygiYm9yZGVyVG9wV2lkdGgiKSxpLmNzcygiYm9yZGVyUmlnaHRXaWR0aCIpLGkuY3NzKCJib3JkZXJCb3R0b21XaWR0aCIpLGkuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKV0sbz1baS5jc3MoInBhZGRpbmdUb3AiKSxpLmNzcygicGFkZGluZ1JpZ2h0IiksaS5jc3MoInBhZGRpbmdCb3R0b20iKSxpLmNzcygicGFkZGluZ0xlZnQiKV07dGhpcy5ib3JkZXJEaWY9ZS5tYXAocyxmdW5jdGlvbihlLHQpe3ZhciBuPXBhcnNlSW50KGUsMTApfHwwLHI9cGFyc2VJbnQob1t0XSwxMCl8fDA7cmV0dXJuIG4rcn0pfWkuY3NzKHtoZWlnaHQ6bi5oZWlnaHQoKS10aGlzLmJvcmRlckRpZlswXS10aGlzLmJvcmRlckRpZlsyXXx8MCx3aWR0aDpuLndpZHRoKCktdGhpcy5ib3JkZXJEaWZbMV0tdGhpcy5ib3JkZXJEaWZbM118fDB9KX19LF9yZW5kZXJQcm94eTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZWxlbWVudCxuPXRoaXMub3B0aW9uczt0aGlzLmVsZW1lbnRPZmZzZXQ9dC5vZmZzZXQoKTtpZih0aGlzLl9oZWxwZXIpe3RoaXMuaGVscGVyPXRoaXMuaGVscGVyfHxlKCc8ZGl2IHN0eWxlPSJvdmVyZmxvdzpoaWRkZW47Ij48L2Rpdj4nKTt2YXIgcj1lLnVpLmllNj8xOjAsaT1lLnVpLmllNj8yOi0xO3RoaXMuaGVscGVyLmFkZENsYXNzKHRoaXMuX2hlbHBlcikuY3NzKHt3aWR0aDp0aGlzLmVsZW1lbnQub3V0ZXJXaWR0aCgpK2ksaGVpZ2h0OnRoaXMuZWxlbWVudC5vdXRlckhlaWdodCgpK2kscG9zaXRpb246ImFic29sdXRlIixsZWZ0OnRoaXMuZWxlbWVudE9mZnNldC5sZWZ0LXIrInB4Iix0b3A6dGhpcy5lbGVtZW50T2Zmc2V0LnRvcC1yKyJweCIsekluZGV4Oisrbi56SW5kZXh9KSx0aGlzLmhlbHBlci5hcHBlbmRUbygiYm9keSIpLmRpc2FibGVTZWxlY3Rpb24oKX1lbHNlIHRoaXMuaGVscGVyPXRoaXMuZWxlbWVudH0sX2NoYW5nZTp7ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJue3dpZHRoOnRoaXMub3JpZ2luYWxTaXplLndpZHRoK3R9fSx3OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLm9wdGlvbnMsaT10aGlzLm9yaWdpbmFsU2l6ZSxzPXRoaXMub3JpZ2luYWxQb3NpdGlvbjtyZXR1cm57bGVmdDpzLmxlZnQrdCx3aWR0aDppLndpZHRoLXR9fSxuOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLm9wdGlvbnMsaT10aGlzLm9yaWdpbmFsU2l6ZSxzPXRoaXMub3JpZ2luYWxQb3NpdGlvbjtyZXR1cm57dG9wOnMudG9wK24saGVpZ2h0OmkuaGVpZ2h0LW59fSxzOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm57aGVpZ2h0OnRoaXMub3JpZ2luYWxTaXplLmhlaWdodCtufX0sc2U6ZnVuY3Rpb24odCxuLHIpe3JldHVybiBlLmV4dGVuZCh0aGlzLl9jaGFuZ2Uucy5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5fY2hhbmdlLmUuYXBwbHkodGhpcyxbdCxuLHJdKSl9LHN3OmZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gZS5leHRlbmQodGhpcy5fY2hhbmdlLnMuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX2NoYW5nZS53LmFwcGx5KHRoaXMsW3QsbixyXSkpfSxuZTpmdW5jdGlvbih0LG4scil7cmV0dXJuIGUuZXh0ZW5kKHRoaXMuX2NoYW5nZS5uLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl9jaGFuZ2UuZS5hcHBseSh0aGlzLFt0LG4scl0pKX0sbnc6ZnVuY3Rpb24odCxuLHIpe3JldHVybiBlLmV4dGVuZCh0aGlzLl9jaGFuZ2Uubi5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5fY2hhbmdlLncuYXBwbHkodGhpcyxbdCxuLHJdKSl9fSxfcHJvcGFnYXRlOmZ1bmN0aW9uKHQsbil7ZS51aS5wbHVnaW4uY2FsbCh0aGlzLHQsW24sdGhpcy51aSgpXSksdCE9InJlc2l6ZSImJnRoaXMuX3RyaWdnZXIodCxuLHRoaXMudWkoKSl9LHBsdWdpbnM6e30sdWk6ZnVuY3Rpb24oKXtyZXR1cm57b3JpZ2luYWxFbGVtZW50OnRoaXMub3JpZ2luYWxFbGVtZW50LGVsZW1lbnQ6dGhpcy5lbGVtZW50LGhlbHBlcjp0aGlzLmhlbHBlcixwb3NpdGlvbjp0aGlzLnBvc2l0aW9uLHNpemU6dGhpcy5zaXplLG9yaWdpbmFsU2l6ZTp0aGlzLm9yaWdpbmFsU2l6ZSxvcmlnaW5hbFBvc2l0aW9uOnRoaXMub3JpZ2luYWxQb3NpdGlvbn19fSksZS51aS5wbHVnaW4uYWRkKCJyZXNpemFibGUiLCJhbHNvUmVzaXplIix7c3RhcnQ6ZnVuY3Rpb24odCxuKXt2YXIgcj1lKHRoaXMpLmRhdGEoInJlc2l6YWJsZSIpLGk9ci5vcHRpb25zLHM9ZnVuY3Rpb24odCl7ZSh0KS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKTt0LmRhdGEoInJlc2l6YWJsZS1hbHNvcmVzaXplIix7d2lkdGg6cGFyc2VJbnQodC53aWR0aCgpLDEwKSxoZWlnaHQ6cGFyc2VJbnQodC5oZWlnaHQoKSwxMCksbGVmdDpwYXJzZUludCh0LmNzcygibGVmdCIpLDEwKSx0b3A6cGFyc2VJbnQodC5jc3MoInRvcCIpLDEwKX0pfSl9O3R5cGVvZiBpLmFsc29SZXNpemU9PSJvYmplY3QiJiYhaS5hbHNvUmVzaXplLnBhcmVudE5vZGU/aS5hbHNvUmVzaXplLmxlbmd0aD8oaS5hbHNvUmVzaXplPWkuYWxzb1Jlc2l6ZVswXSxzKGkuYWxzb1Jlc2l6ZSkpOmUuZWFjaChpLmFsc29SZXNpemUsZnVuY3Rpb24oZSl7cyhlKX0pOnMoaS5hbHNvUmVzaXplKX0scmVzaXplOmZ1bmN0aW9uKHQsbil7dmFyIHI9ZSh0aGlzKS5kYXRhKCJyZXNpemFibGUiKSxpPXIub3B0aW9ucyxzPXIub3JpZ2luYWxTaXplLG89ci5vcmlnaW5hbFBvc2l0aW9uLHU9e2hlaWdodDpyLnNpemUuaGVpZ2h0LXMuaGVpZ2h0fHwwLHdpZHRoOnIuc2l6ZS53aWR0aC1zLndpZHRofHwwLHRvcDpyLnBvc2l0aW9uLnRvcC1vLnRvcHx8MCxsZWZ0OnIucG9zaXRpb24ubGVmdC1vLmxlZnR8fDB9LGE9ZnVuY3Rpb24odCxyKXtlKHQpLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLGk9ZSh0aGlzKS5kYXRhKCJyZXNpemFibGUtYWxzb3Jlc2l6ZSIpLHM9e30sbz1yJiZyLmxlbmd0aD9yOnQucGFyZW50cyhuLm9yaWdpbmFsRWxlbWVudFswXSkubGVuZ3RoP1sid2lkdGgiLCJoZWlnaHQiXTpbIndpZHRoIiwiaGVpZ2h0IiwidG9wIiwibGVmdCJdO2UuZWFjaChvLGZ1bmN0aW9uKGUsdCl7dmFyIG49KGlbdF18fDApKyh1W3RdfHwwKTtuJiZuPj0wJiYoc1t0XT1ufHxudWxsKX0pLHQuY3NzKHMpfSl9O3R5cGVvZiBpLmFsc29SZXNpemU9PSJvYmplY3QiJiYhaS5hbHNvUmVzaXplLm5vZGVUeXBlP2UuZWFjaChpLmFsc29SZXNpemUsZnVuY3Rpb24oZSx0KXthKGUsdCl9KTphKGkuYWxzb1Jlc2l6ZSl9LHN0b3A6ZnVuY3Rpb24odCxuKXtlKHRoaXMpLnJlbW92ZURhdGEoInJlc2l6YWJsZS1hbHNvcmVzaXplIil9fSksZS51aS5wbHVnaW4uYWRkKCJyZXNpemFibGUiLCJhbmltYXRlIix7c3RvcDpmdW5jdGlvbih0LG4pe3ZhciByPWUodGhpcykuZGF0YSgicmVzaXphYmxlIiksaT1yLm9wdGlvbnMscz1yLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLG89cy5sZW5ndGgmJi90ZXh0YXJlYS9pLnRlc3Qoc1swXS5ub2RlTmFtZSksdT1vJiZlLnVpLmhhc1Njcm9sbChzWzBdLCJsZWZ0Iik/MDpyLnNpemVEaWZmLmhlaWdodCxhPW8/MDpyLnNpemVEaWZmLndpZHRoLGY9e3dpZHRoOnIuc2l6ZS53aWR0aC1hLGhlaWdodDpyLnNpemUuaGVpZ2h0LXV9LGw9cGFyc2VJbnQoci5lbGVtZW50LmNzcygibGVmdCIpLDEwKSsoci5wb3NpdGlvbi5sZWZ0LXIub3JpZ2luYWxQb3NpdGlvbi5sZWZ0KXx8bnVsbCxjPXBhcnNlSW50KHIuZWxlbWVudC5jc3MoInRvcCIpLDEwKSsoci5wb3NpdGlvbi50b3Atci5vcmlnaW5hbFBvc2l0aW9uLnRvcCl8fG51bGw7ci5lbGVtZW50LmFuaW1hdGUoZS5leHRlbmQoZixjJiZsP3t0b3A6YyxsZWZ0Omx9Ont9KSx7ZHVyYXRpb246aS5hbmltYXRlRHVyYXRpb24sZWFzaW5nOmkuYW5pbWF0ZUVhc2luZyxzdGVwOmZ1bmN0aW9uKCl7dmFyIG49e3dpZHRoOnBhcnNlSW50KHIuZWxlbWVudC5jc3MoIndpZHRoIiksMTApLGhlaWdodDpwYXJzZUludChyLmVsZW1lbnQuY3NzKCJoZWlnaHQiKSwxMCksdG9wOnBhcnNlSW50KHIuZWxlbWVudC5jc3MoInRvcCIpLDEwKSxsZWZ0OnBhcnNlSW50KHIuZWxlbWVudC5jc3MoImxlZnQiKSwxMCl9O3MmJnMubGVuZ3RoJiZlKHNbMF0pLmNzcyh7d2lkdGg6bi53aWR0aCxoZWlnaHQ6bi5oZWlnaHR9KSxyLl91cGRhdGVDYWNoZShuKSxyLl9wcm9wYWdhdGUoInJlc2l6ZSIsdCl9fSl9fSksZS51aS5wbHVnaW4uYWRkKCJyZXNpemFibGUiLCJjb250YWlubWVudCIse3N0YXJ0OmZ1bmN0aW9uKHQscil7dmFyIGk9ZSh0aGlzKS5kYXRhKCJyZXNpemFibGUiKSxzPWkub3B0aW9ucyxvPWkuZWxlbWVudCx1PXMuY29udGFpbm1lbnQsYT11IGluc3RhbmNlb2YgZT91LmdldCgwKTovcGFyZW50Ly50ZXN0KHUpP28ucGFyZW50KCkuZ2V0KDApOnU7aWYoIWEpcmV0dXJuO2kuY29udGFpbmVyRWxlbWVudD1lKGEpO2lmKC9kb2N1bWVudC8udGVzdCh1KXx8dT09ZG9jdW1lbnQpaS5jb250YWluZXJPZmZzZXQ9e2xlZnQ6MCx0b3A6MH0saS5jb250YWluZXJQb3NpdGlvbj17bGVmdDowLHRvcDowfSxpLnBhcmVudERhdGE9e2VsZW1lbnQ6ZShkb2N1bWVudCksbGVmdDowLHRvcDowLHdpZHRoOmUoZG9jdW1lbnQpLndpZHRoKCksaGVpZ2h0OmUoZG9jdW1lbnQpLmhlaWdodCgpfHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGUuc2Nyb2xsSGVpZ2h0fTtlbHNle3ZhciBmPWUoYSksbD1bXTtlKFsiVG9wIiwiUmlnaHQiLCJMZWZ0IiwiQm90dG9tIl0pLmVhY2goZnVuY3Rpb24oZSx0KXtsW2VdPW4oZi5jc3MoInBhZGRpbmciK3QpKX0pLGkuY29udGFpbmVyT2Zmc2V0PWYub2Zmc2V0KCksaS5jb250YWluZXJQb3NpdGlvbj1mLnBvc2l0aW9uKCksaS5jb250YWluZXJTaXplPXtoZWlnaHQ6Zi5pbm5lckhlaWdodCgpLWxbM10sd2lkdGg6Zi5pbm5lcldpZHRoKCktbFsxXX07dmFyIGM9aS5jb250YWluZXJPZmZzZXQsaD1pLmNvbnRhaW5lclNpemUuaGVpZ2h0LHA9aS5jb250YWluZXJTaXplLndpZHRoLGQ9ZS51aS5oYXNTY3JvbGwoYSwibGVmdCIpP2Euc2Nyb2xsV2lkdGg6cCx2PWUudWkuaGFzU2Nyb2xsKGEpP2Euc2Nyb2xsSGVpZ2h0Omg7aS5wYXJlbnREYXRhPXtlbGVtZW50OmEsbGVmdDpjLmxlZnQsdG9wOmMudG9wLHdpZHRoOmQsaGVpZ2h0OnZ9fX0scmVzaXplOmZ1bmN0aW9uKHQsbil7dmFyIHI9ZSh0aGlzKS5kYXRhKCJyZXNpemFibGUiKSxpPXIub3B0aW9ucyxzPXIuY29udGFpbmVyU2l6ZSxvPXIuY29udGFpbmVyT2Zmc2V0LHU9ci5zaXplLGE9ci5wb3NpdGlvbixmPXIuX2FzcGVjdFJhdGlvfHx0LnNoaWZ0S2V5LGw9e3RvcDowLGxlZnQ6MH0sYz1yLmNvbnRhaW5lckVsZW1lbnQ7Y1swXSE9ZG9jdW1lbnQmJi9zdGF0aWMvLnRlc3QoYy5jc3MoInBvc2l0aW9uIikpJiYobD1vKSxhLmxlZnQ8KHIuX2hlbHBlcj9vLmxlZnQ6MCkmJihyLnNpemUud2lkdGg9ci5zaXplLndpZHRoKyhyLl9oZWxwZXI/ci5wb3NpdGlvbi5sZWZ0LW8ubGVmdDpyLnBvc2l0aW9uLmxlZnQtbC5sZWZ0KSxmJiYoci5zaXplLmhlaWdodD1yLnNpemUud2lkdGgvci5hc3BlY3RSYXRpbyksci5wb3NpdGlvbi5sZWZ0PWkuaGVscGVyP28ubGVmdDowKSxhLnRvcDwoci5faGVscGVyP28udG9wOjApJiYoci5zaXplLmhlaWdodD1yLnNpemUuaGVpZ2h0KyhyLl9oZWxwZXI/ci5wb3NpdGlvbi50b3Atby50b3A6ci5wb3NpdGlvbi50b3ApLGYmJihyLnNpemUud2lkdGg9ci5zaXplLmhlaWdodCpyLmFzcGVjdFJhdGlvKSxyLnBvc2l0aW9uLnRvcD1yLl9oZWxwZXI/by50b3A6MCksci5vZmZzZXQubGVmdD1yLnBhcmVudERhdGEubGVmdCtyLnBvc2l0aW9uLmxlZnQsci5vZmZzZXQudG9wPXIucGFyZW50RGF0YS50b3Arci5wb3NpdGlvbi50b3A7dmFyIGg9TWF0aC5hYnMoKHIuX2hlbHBlcj9yLm9mZnNldC5sZWZ0LWwubGVmdDpyLm9mZnNldC5sZWZ0LWwubGVmdCkrci5zaXplRGlmZi53aWR0aCkscD1NYXRoLmFicygoci5faGVscGVyP3Iub2Zmc2V0LnRvcC1sLnRvcDpyLm9mZnNldC50b3Atby50b3ApK3Iuc2l6ZURpZmYuaGVpZ2h0KSxkPXIuY29udGFpbmVyRWxlbWVudC5nZXQoMCk9PXIuZWxlbWVudC5wYXJlbnQoKS5nZXQoMCksdj0vcmVsYXRpdmV8YWJzb2x1dGUvLnRlc3Qoci5jb250YWluZXJFbGVtZW50LmNzcygicG9zaXRpb24iKSk7ZCYmdiYmKGgtPXIucGFyZW50RGF0YS5sZWZ0KSxoK3Iuc2l6ZS53aWR0aD49ci5wYXJlbnREYXRhLndpZHRoJiYoci5zaXplLndpZHRoPXIucGFyZW50RGF0YS53aWR0aC1oLGYmJihyLnNpemUuaGVpZ2h0PXIuc2l6ZS53aWR0aC9yLmFzcGVjdFJhdGlvKSkscCtyLnNpemUuaGVpZ2h0Pj1yLnBhcmVudERhdGEuaGVpZ2h0JiYoci5zaXplLmhlaWdodD1yLnBhcmVudERhdGEuaGVpZ2h0LXAsZiYmKHIuc2l6ZS53aWR0aD1yLnNpemUuaGVpZ2h0KnIuYXNwZWN0UmF0aW8pKX0sc3RvcDpmdW5jdGlvbih0LG4pe3ZhciByPWUodGhpcykuZGF0YSgicmVzaXphYmxlIiksaT1yLm9wdGlvbnMscz1yLnBvc2l0aW9uLG89ci5jb250YWluZXJPZmZzZXQsdT1yLmNvbnRhaW5lclBvc2l0aW9uLGE9ci5jb250YWluZXJFbGVtZW50LGY9ZShyLmhlbHBlciksbD1mLm9mZnNldCgpLGM9Zi5vdXRlcldpZHRoKCktci5zaXplRGlmZi53aWR0aCxoPWYub3V0ZXJIZWlnaHQoKS1yLnNpemVEaWZmLmhlaWdodDtyLl9oZWxwZXImJiFpLmFuaW1hdGUmJi9yZWxhdGl2ZS8udGVzdChhLmNzcygicG9zaXRpb24iKSkmJmUodGhpcykuY3NzKHtsZWZ0OmwubGVmdC11LmxlZnQtby5sZWZ0LHdpZHRoOmMsaGVpZ2h0Omh9KSxyLl9oZWxwZXImJiFpLmFuaW1hdGUmJi9zdGF0aWMvLnRlc3QoYS5jc3MoInBvc2l0aW9uIikpJiZlKHRoaXMpLmNzcyh7bGVmdDpsLmxlZnQtdS5sZWZ0LW8ubGVmdCx3aWR0aDpjLGhlaWdodDpofSl9fSksZS51aS5wbHVnaW4uYWRkKCJyZXNpemFibGUiLCJnaG9zdCIse3N0YXJ0OmZ1bmN0aW9uKHQsbil7dmFyIHI9ZSh0aGlzKS5kYXRhKCJyZXNpemFibGUiKSxpPXIub3B0aW9ucyxzPXIuc2l6ZTtyLmdob3N0PXIub3JpZ2luYWxFbGVtZW50LmNsb25lKCksci5naG9zdC5jc3Moe29wYWNpdHk6LjI1LGRpc3BsYXk6ImJsb2NrIixwb3NpdGlvbjoicmVsYXRpdmUiLGhlaWdodDpzLmhlaWdodCx3aWR0aDpzLndpZHRoLG1hcmdpbjowLGxlZnQ6MCx0b3A6MH0pLmFkZENsYXNzKCJ1aS1yZXNpemFibGUtZ2hvc3QiKS5hZGRDbGFzcyh0eXBlb2YgaS5naG9zdD09InN0cmluZyI/aS5naG9zdDoiIiksci5naG9zdC5hcHBlbmRUbyhyLmhlbHBlcil9LHJlc2l6ZTpmdW5jdGlvbih0LG4pe3ZhciByPWUodGhpcykuZGF0YSgicmVzaXphYmxlIiksaT1yLm9wdGlvbnM7ci5naG9zdCYmci5naG9zdC5jc3Moe3Bvc2l0aW9uOiJyZWxhdGl2ZSIsaGVpZ2h0OnIuc2l6ZS5oZWlnaHQsd2lkdGg6ci5zaXplLndpZHRofSl9LHN0b3A6ZnVuY3Rpb24odCxuKXt2YXIgcj1lKHRoaXMpLmRhdGEoInJlc2l6YWJsZSIpLGk9ci5vcHRpb25zO3IuZ2hvc3QmJnIuaGVscGVyJiZyLmhlbHBlci5nZXQoMCkucmVtb3ZlQ2hpbGQoci5naG9zdC5nZXQoMCkpfX0pLGUudWkucGx1Z2luLmFkZCgicmVzaXphYmxlIiwiZ3JpZCIse3Jlc2l6ZTpmdW5jdGlvbih0LG4pe3ZhciByPWUodGhpcykuZGF0YSgicmVzaXphYmxlIiksaT1yLm9wdGlvbnMscz1yLnNpemUsbz1yLm9yaWdpbmFsU2l6ZSx1PXIub3JpZ2luYWxQb3NpdGlvbixhPXIuYXhpcyxmPWkuX2FzcGVjdFJhdGlvfHx0LnNoaWZ0S2V5O2kuZ3JpZD10eXBlb2YgaS5ncmlkPT0ibnVtYmVyIj9baS5ncmlkLGkuZ3JpZF06aS5ncmlkO3ZhciBsPU1hdGgucm91bmQoKHMud2lkdGgtby53aWR0aCkvKGkuZ3JpZFswXXx8MSkpKihpLmdyaWRbMF18fDEpLGM9TWF0aC5yb3VuZCgocy5oZWlnaHQtby5oZWlnaHQpLyhpLmdyaWRbMV18fDEpKSooaS5ncmlkWzFdfHwxKTsvXihzZXxzfGUpJC8udGVzdChhKT8oci5zaXplLndpZHRoPW8ud2lkdGgrbCxyLnNpemUuaGVpZ2h0PW8uaGVpZ2h0K2MpOi9eKG5lKSQvLnRlc3QoYSk/KHIuc2l6ZS53aWR0aD1vLndpZHRoK2wsci5zaXplLmhlaWdodD1vLmhlaWdodCtjLHIucG9zaXRpb24udG9wPXUudG9wLWMpOi9eKHN3KSQvLnRlc3QoYSk/KHIuc2l6ZS53aWR0aD1vLndpZHRoK2wsci5zaXplLmhlaWdodD1vLmhlaWdodCtjLHIucG9zaXRpb24ubGVmdD11LmxlZnQtbCk6KHIuc2l6ZS53aWR0aD1vLndpZHRoK2wsci5zaXplLmhlaWdodD1vLmhlaWdodCtjLHIucG9zaXRpb24udG9wPXUudG9wLWMsci5wb3NpdGlvbi5sZWZ0PXUubGVmdC1sKX19KTt2YXIgbj1mdW5jdGlvbihlKXtyZXR1cm4gcGFyc2VJbnQoZSwxMCl8fDB9LHI9ZnVuY3Rpb24oZSl7cmV0dXJuIWlzTmFOKHBhcnNlSW50KGUsMTApKX19KShqUXVlcnkpOyhmdW5jdGlvbihlLHQpe2Uud2lkZ2V0KCJ1aS5zZWxlY3RhYmxlIixlLnVpLm1vdXNlLHt2ZXJzaW9uOiIxLjkuMiIsb3B0aW9uczp7YXBwZW5kVG86ImJvZHkiLGF1dG9SZWZyZXNoOiEwLGRpc3RhbmNlOjAsZmlsdGVyOiIqIix0b2xlcmFuY2U6InRvdWNoIn0sX2NyZWF0ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1zZWxlY3RhYmxlIiksdGhpcy5kcmFnZ2VkPSExO3ZhciBuO3RoaXMucmVmcmVzaD1mdW5jdGlvbigpe249ZSh0Lm9wdGlvbnMuZmlsdGVyLHQuZWxlbWVudFswXSksbi5hZGRDbGFzcygidWktc2VsZWN0ZWUiKSxuLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLG49dC5vZmZzZXQoKTtlLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIix7ZWxlbWVudDp0aGlzLCRlbGVtZW50OnQsbGVmdDpuLmxlZnQsdG9wOm4udG9wLHJpZ2h0Om4ubGVmdCt0Lm91dGVyV2lkdGgoKSxib3R0b206bi50b3ArdC5vdXRlckhlaWdodCgpLHN0YXJ0c2VsZWN0ZWQ6ITEsc2VsZWN0ZWQ6dC5oYXNDbGFzcygidWktc2VsZWN0ZWQiKSxzZWxlY3Rpbmc6dC5oYXNDbGFzcygidWktc2VsZWN0aW5nIiksdW5zZWxlY3Rpbmc6dC5oYXNDbGFzcygidWktdW5zZWxlY3RpbmciKX0pfSl9LHRoaXMucmVmcmVzaCgpLHRoaXMuc2VsZWN0ZWVzPW4uYWRkQ2xhc3MoInVpLXNlbGVjdGVlIiksdGhpcy5fbW91c2VJbml0KCksdGhpcy5oZWxwZXI9ZSgiPGRpdiBjbGFzcz0ndWktc2VsZWN0YWJsZS1oZWxwZXInPjwvZGl2PiIpfSxfZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuc2VsZWN0ZWVzLnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RlZSIpLnJlbW92ZURhdGEoInNlbGVjdGFibGUtaXRlbSIpLHRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0YWJsZSB1aS1zZWxlY3RhYmxlLWRpc2FibGVkIiksdGhpcy5fbW91c2VEZXN0cm95KCl9LF9tb3VzZVN0YXJ0OmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXM7dGhpcy5vcG9zPVt0LnBhZ2VYLHQucGFnZVldO2lmKHRoaXMub3B0aW9ucy5kaXNhYmxlZClyZXR1cm47dmFyIHI9dGhpcy5vcHRpb25zO3RoaXMuc2VsZWN0ZWVzPWUoci5maWx0ZXIsdGhpcy5lbGVtZW50WzBdKSx0aGlzLl90cmlnZ2VyKCJzdGFydCIsdCksZShyLmFwcGVuZFRvKS5hcHBlbmQodGhpcy5oZWxwZXIpLHRoaXMuaGVscGVyLmNzcyh7bGVmdDp0LmNsaWVudFgsdG9wOnQuY2xpZW50WSx3aWR0aDowLGhlaWdodDowfSksci5hdXRvUmVmcmVzaCYmdGhpcy5yZWZyZXNoKCksdGhpcy5zZWxlY3RlZXMuZmlsdGVyKCIudWktc2VsZWN0ZWQiKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHI9ZS5kYXRhKHRoaXMsInNlbGVjdGFibGUtaXRlbSIpO3Iuc3RhcnRzZWxlY3RlZD0hMCwhdC5tZXRhS2V5JiYhdC5jdHJsS2V5JiYoci4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0ZWQiKSxyLnNlbGVjdGVkPSExLHIuJGVsZW1lbnQuYWRkQ2xhc3MoInVpLXVuc2VsZWN0aW5nIiksci51bnNlbGVjdGluZz0hMCxuLl90cmlnZ2VyKCJ1bnNlbGVjdGluZyIsdCx7dW5zZWxlY3Rpbmc6ci5lbGVtZW50fSkpfSksZSh0LnRhcmdldCkucGFyZW50cygpLmFuZFNlbGYoKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHI9ZS5kYXRhKHRoaXMsInNlbGVjdGFibGUtaXRlbSIpO2lmKHIpe3ZhciBpPSF0Lm1ldGFLZXkmJiF0LmN0cmxLZXl8fCFyLiRlbGVtZW50Lmhhc0NsYXNzKCJ1aS1zZWxlY3RlZCIpO3JldHVybiByLiRlbGVtZW50LnJlbW92ZUNsYXNzKGk/InVpLXVuc2VsZWN0aW5nIjoidWktc2VsZWN0ZWQiKS5hZGRDbGFzcyhpPyJ1aS1zZWxlY3RpbmciOiJ1aS11bnNlbGVjdGluZyIpLHIudW5zZWxlY3Rpbmc9IWksci5zZWxlY3Rpbmc9aSxyLnNlbGVjdGVkPWksaT9uLl90cmlnZ2VyKCJzZWxlY3RpbmciLHQse3NlbGVjdGluZzpyLmVsZW1lbnR9KTpuLl90cmlnZ2VyKCJ1bnNlbGVjdGluZyIsdCx7dW5zZWxlY3Rpbmc6ci5lbGVtZW50fSksITF9fSl9LF9tb3VzZURyYWc6ZnVuY3Rpb24odCl7dmFyIG49dGhpczt0aGlzLmRyYWdnZWQ9ITA7aWYodGhpcy5vcHRpb25zLmRpc2FibGVkKXJldHVybjt2YXIgcj10aGlzLm9wdGlvbnMsaT10aGlzLm9wb3NbMF0scz10aGlzLm9wb3NbMV0sbz10LnBhZ2VYLHU9dC5wYWdlWTtpZihpPm8pe3ZhciBhPW87bz1pLGk9YX1pZihzPnUpe3ZhciBhPXU7dT1zLHM9YX1yZXR1cm4gdGhpcy5oZWxwZXIuY3NzKHtsZWZ0OmksdG9wOnMsd2lkdGg6by1pLGhlaWdodDp1LXN9KSx0aGlzLnNlbGVjdGVlcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGE9ZS5kYXRhKHRoaXMsInNlbGVjdGFibGUtaXRlbSIpO2lmKCFhfHxhLmVsZW1lbnQ9PW4uZWxlbWVudFswXSlyZXR1cm47dmFyIGY9ITE7ci50b2xlcmFuY2U9PSJ0b3VjaCI/Zj0hKGEubGVmdD5vfHxhLnJpZ2h0PGl8fGEudG9wPnV8fGEuYm90dG9tPHMpOnIudG9sZXJhbmNlPT0iZml0IiYmKGY9YS5sZWZ0PmkmJmEucmlnaHQ8byYmYS50b3A+cyYmYS5ib3R0b208dSksZj8oYS5zZWxlY3RlZCYmKGEuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNlbGVjdGVkIiksYS5zZWxlY3RlZD0hMSksYS51bnNlbGVjdGluZyYmKGEuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXVuc2VsZWN0aW5nIiksYS51bnNlbGVjdGluZz0hMSksYS5zZWxlY3Rpbmd8fChhLiRlbGVtZW50LmFkZENsYXNzKCJ1aS1zZWxlY3RpbmciKSxhLnNlbGVjdGluZz0hMCxuLl90cmlnZ2VyKCJzZWxlY3RpbmciLHQse3NlbGVjdGluZzphLmVsZW1lbnR9KSkpOihhLnNlbGVjdGluZyYmKCh0Lm1ldGFLZXl8fHQuY3RybEtleSkmJmEuc3RhcnRzZWxlY3RlZD8oYS4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0aW5nIiksYS5zZWxlY3Rpbmc9ITEsYS4kZWxlbWVudC5hZGRDbGFzcygidWktc2VsZWN0ZWQiKSxhLnNlbGVjdGVkPSEwKTooYS4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0aW5nIiksYS5zZWxlY3Rpbmc9ITEsYS5zdGFydHNlbGVjdGVkJiYoYS4kZWxlbWVudC5hZGRDbGFzcygidWktdW5zZWxlY3RpbmciKSxhLnVuc2VsZWN0aW5nPSEwKSxuLl90cmlnZ2VyKCJ1bnNlbGVjdGluZyIsdCx7dW5zZWxlY3Rpbmc6YS5lbGVtZW50fSkpKSxhLnNlbGVjdGVkJiYhdC5tZXRhS2V5JiYhdC5jdHJsS2V5JiYhYS5zdGFydHNlbGVjdGVkJiYoYS4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0ZWQiKSxhLnNlbGVjdGVkPSExLGEuJGVsZW1lbnQuYWRkQ2xhc3MoInVpLXVuc2VsZWN0aW5nIiksYS51bnNlbGVjdGluZz0hMCxuLl90cmlnZ2VyKCJ1bnNlbGVjdGluZyIsdCx7dW5zZWxlY3Rpbmc6YS5lbGVtZW50fSkpKX0pLCExfSxfbW91c2VTdG9wOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXM7dGhpcy5kcmFnZ2VkPSExO3ZhciByPXRoaXMub3B0aW9ucztyZXR1cm4gZSgiLnVpLXVuc2VsZWN0aW5nIix0aGlzLmVsZW1lbnRbMF0pLmVhY2goZnVuY3Rpb24oKXt2YXIgcj1lLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIik7ci4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktdW5zZWxlY3RpbmciKSxyLnVuc2VsZWN0aW5nPSExLHIuc3RhcnRzZWxlY3RlZD0hMSxuLl90cmlnZ2VyKCJ1bnNlbGVjdGVkIix0LHt1bnNlbGVjdGVkOnIuZWxlbWVudH0pfSksZSgiLnVpLXNlbGVjdGluZyIsdGhpcy5lbGVtZW50WzBdKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHI9ZS5kYXRhKHRoaXMsInNlbGVjdGFibGUtaXRlbSIpO3IuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNlbGVjdGluZyIpLmFkZENsYXNzKCJ1aS1zZWxlY3RlZCIpLHIuc2VsZWN0aW5nPSExLHIuc2VsZWN0ZWQ9ITAsci5zdGFydHNlbGVjdGVkPSEwLG4uX3RyaWdnZXIoInNlbGVjdGVkIix0LHtzZWxlY3RlZDpyLmVsZW1lbnR9KX0pLHRoaXMuX3RyaWdnZXIoInN0b3AiLHQpLHRoaXMuaGVscGVyLnJlbW92ZSgpLCExfX0pfSkoalF1ZXJ5KTsoZnVuY3Rpb24oZSx0KXtlLndpZGdldCgidWkuc29ydGFibGUiLGUudWkubW91c2Use3ZlcnNpb246IjEuOS4yIix3aWRnZXRFdmVudFByZWZpeDoic29ydCIscmVhZHk6ITEsb3B0aW9uczp7YXBwZW5kVG86InBhcmVudCIsYXhpczohMSxjb25uZWN0V2l0aDohMSxjb250YWlubWVudDohMSxjdXJzb3I6ImF1dG8iLGN1cnNvckF0OiExLGRyb3BPbkVtcHR5OiEwLGZvcmNlUGxhY2Vob2xkZXJTaXplOiExLGZvcmNlSGVscGVyU2l6ZTohMSxncmlkOiExLGhhbmRsZTohMSxoZWxwZXI6Im9yaWdpbmFsIixpdGVtczoiPiAqIixvcGFjaXR5OiExLHBsYWNlaG9sZGVyOiExLHJldmVydDohMSxzY3JvbGw6ITAsc2Nyb2xsU2Vuc2l0aXZpdHk6MjAsc2Nyb2xsU3BlZWQ6MjAsc2NvcGU6ImRlZmF1bHQiLHRvbGVyYW5jZToiaW50ZXJzZWN0Iix6SW5kZXg6MWUzfSxfY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcHRpb25zO3RoaXMuY29udGFpbmVyQ2FjaGU9e30sdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1zb3J0YWJsZSIpLHRoaXMucmVmcmVzaCgpLHRoaXMuZmxvYXRpbmc9dGhpcy5pdGVtcy5sZW5ndGg/ZS5heGlzPT09IngifHwvbGVmdHxyaWdodC8udGVzdCh0aGlzLml0ZW1zWzBdLml0ZW0uY3NzKCJmbG9hdCIpKXx8L2lubGluZXx0YWJsZS1jZWxsLy50ZXN0KHRoaXMuaXRlbXNbMF0uaXRlbS5jc3MoImRpc3BsYXkiKSk6ITEsdGhpcy5vZmZzZXQ9dGhpcy5lbGVtZW50Lm9mZnNldCgpLHRoaXMuX21vdXNlSW5pdCgpLHRoaXMucmVhZHk9ITB9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zb3J0YWJsZSB1aS1zb3J0YWJsZS1kaXNhYmxlZCIpLHRoaXMuX21vdXNlRGVzdHJveSgpO2Zvcih2YXIgZT10aGlzLml0ZW1zLmxlbmd0aC0xO2U+PTA7ZS0tKXRoaXMuaXRlbXNbZV0uaXRlbS5yZW1vdmVEYXRhKHRoaXMud2lkZ2V0TmFtZSsiLWl0ZW0iKTtyZXR1cm4gdGhpc30sX3NldE9wdGlvbjpmdW5jdGlvbih0LG4pe3Q9PT0iZGlzYWJsZWQiPyh0aGlzLm9wdGlvbnNbdF09bix0aGlzLndpZGdldCgpLnRvZ2dsZUNsYXNzKCJ1aS1zb3J0YWJsZS1kaXNhYmxlZCIsISFuKSk6ZS5XaWRnZXQucHJvdG90eXBlLl9zZXRPcHRpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfbW91c2VDYXB0dXJlOmZ1bmN0aW9uKHQsbil7dmFyIHI9dGhpcztpZih0aGlzLnJldmVydGluZylyZXR1cm4hMTtpZih0aGlzLm9wdGlvbnMuZGlzYWJsZWR8fHRoaXMub3B0aW9ucy50eXBlPT0ic3RhdGljIilyZXR1cm4hMTt0aGlzLl9yZWZyZXNoSXRlbXModCk7dmFyIGk9bnVsbCxzPWUodC50YXJnZXQpLnBhcmVudHMoKS5lYWNoKGZ1bmN0aW9uKCl7aWYoZS5kYXRhKHRoaXMsci53aWRnZXROYW1lKyItaXRlbSIpPT1yKXJldHVybiBpPWUodGhpcyksITF9KTtlLmRhdGEodC50YXJnZXQsci53aWRnZXROYW1lKyItaXRlbSIpPT1yJiYoaT1lKHQudGFyZ2V0KSk7aWYoIWkpcmV0dXJuITE7aWYodGhpcy5vcHRpb25zLmhhbmRsZSYmIW4pe3ZhciBvPSExO2UodGhpcy5vcHRpb25zLmhhbmRsZSxpKS5maW5kKCIqIikuYW5kU2VsZigpLmVhY2goZnVuY3Rpb24oKXt0aGlzPT10LnRhcmdldCYmKG89ITApfSk7aWYoIW8pcmV0dXJuITF9cmV0dXJuIHRoaXMuY3VycmVudEl0ZW09aSx0aGlzLl9yZW1vdmVDdXJyZW50c0Zyb21JdGVtcygpLCEwfSxfbW91c2VTdGFydDpmdW5jdGlvbih0LG4scil7dmFyIGk9dGhpcy5vcHRpb25zO3RoaXMuY3VycmVudENvbnRhaW5lcj10aGlzLHRoaXMucmVmcmVzaFBvc2l0aW9ucygpLHRoaXMuaGVscGVyPXRoaXMuX2NyZWF0ZUhlbHBlcih0KSx0aGlzLl9jYWNoZUhlbHBlclByb3BvcnRpb25zKCksdGhpcy5fY2FjaGVNYXJnaW5zKCksdGhpcy5zY3JvbGxQYXJlbnQ9dGhpcy5oZWxwZXIuc2Nyb2xsUGFyZW50KCksdGhpcy5vZmZzZXQ9dGhpcy5jdXJyZW50SXRlbS5vZmZzZXQoKSx0aGlzLm9mZnNldD17dG9wOnRoaXMub2Zmc2V0LnRvcC10aGlzLm1hcmdpbnMudG9wLGxlZnQ6dGhpcy5vZmZzZXQubGVmdC10aGlzLm1hcmdpbnMubGVmdH0sZS5leHRlbmQodGhpcy5vZmZzZXQse2NsaWNrOntsZWZ0OnQucGFnZVgtdGhpcy5vZmZzZXQubGVmdCx0b3A6dC5wYWdlWS10aGlzLm9mZnNldC50b3B9LHBhcmVudDp0aGlzLl9nZXRQYXJlbnRPZmZzZXQoKSxyZWxhdGl2ZTp0aGlzLl9nZXRSZWxhdGl2ZU9mZnNldCgpfSksdGhpcy5oZWxwZXIuY3NzKCJwb3NpdGlvbiIsImFic29sdXRlIiksdGhpcy5jc3NQb3NpdGlvbj10aGlzLmhlbHBlci5jc3MoInBvc2l0aW9uIiksdGhpcy5vcmlnaW5hbFBvc2l0aW9uPXRoaXMuX2dlbmVyYXRlUG9zaXRpb24odCksdGhpcy5vcmlnaW5hbFBhZ2VYPXQucGFnZVgsdGhpcy5vcmlnaW5hbFBhZ2VZPXQucGFnZVksaS5jdXJzb3JBdCYmdGhpcy5fYWRqdXN0T2Zmc2V0RnJvbUhlbHBlcihpLmN1cnNvckF0KSx0aGlzLmRvbVBvc2l0aW9uPXtwcmV2OnRoaXMuY3VycmVudEl0ZW0ucHJldigpWzBdLHBhcmVudDp0aGlzLmN1cnJlbnRJdGVtLnBhcmVudCgpWzBdfSx0aGlzLmhlbHBlclswXSE9dGhpcy5jdXJyZW50SXRlbVswXSYmdGhpcy5jdXJyZW50SXRlbS5oaWRlKCksdGhpcy5fY3JlYXRlUGxhY2Vob2xkZXIoKSxpLmNvbnRhaW5tZW50JiZ0aGlzLl9zZXRDb250YWlubWVudCgpLGkuY3Vyc29yJiYoZSgiYm9keSIpLmNzcygiY3Vyc29yIikmJih0aGlzLl9zdG9yZWRDdXJzb3I9ZSgiYm9keSIpLmNzcygiY3Vyc29yIikpLGUoImJvZHkiKS5jc3MoImN1cnNvciIsaS5jdXJzb3IpKSxpLm9wYWNpdHkmJih0aGlzLmhlbHBlci5jc3MoIm9wYWNpdHkiKSYmKHRoaXMuX3N0b3JlZE9wYWNpdHk9dGhpcy5oZWxwZXIuY3NzKCJvcGFjaXR5IikpLHRoaXMuaGVscGVyLmNzcygib3BhY2l0eSIsaS5vcGFjaXR5KSksaS56SW5kZXgmJih0aGlzLmhlbHBlci5jc3MoInpJbmRleCIpJiYodGhpcy5fc3RvcmVkWkluZGV4PXRoaXMuaGVscGVyLmNzcygiekluZGV4IikpLHRoaXMuaGVscGVyLmNzcygiekluZGV4IixpLnpJbmRleCkpLHRoaXMuc2Nyb2xsUGFyZW50WzBdIT1kb2N1bWVudCYmdGhpcy5zY3JvbGxQYXJlbnRbMF0udGFnTmFtZSE9IkhUTUwiJiYodGhpcy5vdmVyZmxvd09mZnNldD10aGlzLnNjcm9sbFBhcmVudC5vZmZzZXQoKSksdGhpcy5fdHJpZ2dlcigic3RhcnQiLHQsdGhpcy5fdWlIYXNoKCkpLHRoaXMuX3ByZXNlcnZlSGVscGVyUHJvcG9ydGlvbnN8fHRoaXMuX2NhY2hlSGVscGVyUHJvcG9ydGlvbnMoKTtpZighcilmb3IodmFyIHM9dGhpcy5jb250YWluZXJzLmxlbmd0aC0xO3M+PTA7cy0tKXRoaXMuY29udGFpbmVyc1tzXS5fdHJpZ2dlcigiYWN0aXZhdGUiLHQsdGhpcy5fdWlIYXNoKHRoaXMpKTtyZXR1cm4gZS51aS5kZG1hbmFnZXImJihlLnVpLmRkbWFuYWdlci5jdXJyZW50PXRoaXMpLGUudWkuZGRtYW5hZ2VyJiYhaS5kcm9wQmVoYXZpb3VyJiZlLnVpLmRkbWFuYWdlci5wcmVwYXJlT2Zmc2V0cyh0aGlzLHQpLHRoaXMuZHJhZ2dpbmc9ITAsdGhpcy5oZWxwZXIuYWRkQ2xhc3MoInVpLXNvcnRhYmxlLWhlbHBlciIpLHRoaXMuX21vdXNlRHJhZyh0KSwhMH0sX21vdXNlRHJhZzpmdW5jdGlvbih0KXt0aGlzLnBvc2l0aW9uPXRoaXMuX2dlbmVyYXRlUG9zaXRpb24odCksdGhpcy5wb3NpdGlvbkFicz10aGlzLl9jb252ZXJ0UG9zaXRpb25UbygiYWJzb2x1dGUiKSx0aGlzLmxhc3RQb3NpdGlvbkFic3x8KHRoaXMubGFzdFBvc2l0aW9uQWJzPXRoaXMucG9zaXRpb25BYnMpO2lmKHRoaXMub3B0aW9ucy5zY3JvbGwpe3ZhciBuPXRoaXMub3B0aW9ucyxyPSExO3RoaXMuc2Nyb2xsUGFyZW50WzBdIT1kb2N1bWVudCYmdGhpcy5zY3JvbGxQYXJlbnRbMF0udGFnTmFtZSE9IkhUTUwiPyh0aGlzLm92ZXJmbG93T2Zmc2V0LnRvcCt0aGlzLnNjcm9sbFBhcmVudFswXS5vZmZzZXRIZWlnaHQtdC5wYWdlWTxuLnNjcm9sbFNlbnNpdGl2aXR5P3RoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcD1yPXRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcCtuLnNjcm9sbFNwZWVkOnQucGFnZVktdGhpcy5vdmVyZmxvd09mZnNldC50b3A8bi5zY3JvbGxTZW5zaXRpdml0eSYmKHRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcD1yPXRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcC1uLnNjcm9sbFNwZWVkKSx0aGlzLm92ZXJmbG93T2Zmc2V0LmxlZnQrdGhpcy5zY3JvbGxQYXJlbnRbMF0ub2Zmc2V0V2lkdGgtdC5wYWdlWDxuLnNjcm9sbFNlbnNpdGl2aXR5P3RoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQ9cj10aGlzLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0K24uc2Nyb2xsU3BlZWQ6dC5wYWdlWC10aGlzLm92ZXJmbG93T2Zmc2V0LmxlZnQ8bi5zY3JvbGxTZW5zaXRpdml0eSYmKHRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQ9cj10aGlzLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0LW4uc2Nyb2xsU3BlZWQpKToodC5wYWdlWS1lKGRvY3VtZW50KS5zY3JvbGxUb3AoKTxuLnNjcm9sbFNlbnNpdGl2aXR5P3I9ZShkb2N1bWVudCkuc2Nyb2xsVG9wKGUoZG9jdW1lbnQpLnNjcm9sbFRvcCgpLW4uc2Nyb2xsU3BlZWQpOmUod2luZG93KS5oZWlnaHQoKS0odC5wYWdlWS1lKGRvY3VtZW50KS5zY3JvbGxUb3AoKSk8bi5zY3JvbGxTZW5zaXRpdml0eSYmKHI9ZShkb2N1bWVudCkuc2Nyb2xsVG9wKGUoZG9jdW1lbnQpLnNjcm9sbFRvcCgpK24uc2Nyb2xsU3BlZWQpKSx0LnBhZ2VYLWUoZG9jdW1lbnQpLnNjcm9sbExlZnQoKTxuLnNjcm9sbFNlbnNpdGl2aXR5P3I9ZShkb2N1bWVudCkuc2Nyb2xsTGVmdChlKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCktbi5zY3JvbGxTcGVlZCk6ZSh3aW5kb3cpLndpZHRoKCktKHQucGFnZVgtZShkb2N1bWVudCkuc2Nyb2xsTGVmdCgpKTxuLnNjcm9sbFNlbnNpdGl2aXR5JiYocj1lKGRvY3VtZW50KS5zY3JvbGxMZWZ0KGUoZG9jdW1lbnQpLnNjcm9sbExlZnQoKStuLnNjcm9sbFNwZWVkKSkpLHIhPT0hMSYmZS51aS5kZG1hbmFnZXImJiFuLmRyb3BCZWhhdmlvdXImJmUudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKHRoaXMsdCl9dGhpcy5wb3NpdGlvbkFicz10aGlzLl9jb252ZXJ0UG9zaXRpb25UbygiYWJzb2x1dGUiKTtpZighdGhpcy5vcHRpb25zLmF4aXN8fHRoaXMub3B0aW9ucy5heGlzIT0ieSIpdGhpcy5oZWxwZXJbMF0uc3R5bGUubGVmdD10aGlzLnBvc2l0aW9uLmxlZnQrInB4IjtpZighdGhpcy5vcHRpb25zLmF4aXN8fHRoaXMub3B0aW9ucy5heGlzIT0ieCIpdGhpcy5oZWxwZXJbMF0uc3R5bGUudG9wPXRoaXMucG9zaXRpb24udG9wKyJweCI7Zm9yKHZhciBpPXRoaXMuaXRlbXMubGVuZ3RoLTE7aT49MDtpLS0pe3ZhciBzPXRoaXMuaXRlbXNbaV0sbz1zLml0ZW1bMF0sdT10aGlzLl9pbnRlcnNlY3RzV2l0aFBvaW50ZXIocyk7aWYoIXUpY29udGludWU7aWYocy5pbnN0YW5jZSE9PXRoaXMuY3VycmVudENvbnRhaW5lciljb250aW51ZTtpZihvIT10aGlzLmN1cnJlbnRJdGVtWzBdJiZ0aGlzLnBsYWNlaG9sZGVyW3U9PTE/Im5leHQiOiJwcmV2Il0oKVswXSE9byYmIWUuY29udGFpbnModGhpcy5wbGFjZWhvbGRlclswXSxvKSYmKHRoaXMub3B0aW9ucy50eXBlPT0ic2VtaS1keW5hbWljIj8hZS5jb250YWlucyh0aGlzLmVsZW1lbnRbMF0sbyk6ITApKXt0aGlzLmRpcmVjdGlvbj11PT0xPyJkb3duIjoidXAiO2lmKHRoaXMub3B0aW9ucy50b2xlcmFuY2UhPSJwb2ludGVyIiYmIXRoaXMuX2ludGVyc2VjdHNXaXRoU2lkZXMocykpYnJlYWs7dGhpcy5fcmVhcnJhbmdlKHQscyksdGhpcy5fdHJpZ2dlcigiY2hhbmdlIix0LHRoaXMuX3VpSGFzaCgpKTticmVha319cmV0dXJuIHRoaXMuX2NvbnRhY3RDb250YWluZXJzKHQpLGUudWkuZGRtYW5hZ2VyJiZlLnVpLmRkbWFuYWdlci5kcmFnKHRoaXMsdCksdGhpcy5fdHJpZ2dlcigic29ydCIsdCx0aGlzLl91aUhhc2goKSksdGhpcy5sYXN0UG9zaXRpb25BYnM9dGhpcy5wb3NpdGlvbkFicywhMX0sX21vdXNlU3RvcDpmdW5jdGlvbih0LG4pe2lmKCF0KXJldHVybjtlLnVpLmRkbWFuYWdlciYmIXRoaXMub3B0aW9ucy5kcm9wQmVoYXZpb3VyJiZlLnVpLmRkbWFuYWdlci5kcm9wKHRoaXMsdCk7aWYodGhpcy5vcHRpb25zLnJldmVydCl7dmFyIHI9dGhpcyxpPXRoaXMucGxhY2Vob2xkZXIub2Zmc2V0KCk7dGhpcy5yZXZlcnRpbmc9ITAsZSh0aGlzLmhlbHBlcikuYW5pbWF0ZSh7bGVmdDppLmxlZnQtdGhpcy5vZmZzZXQucGFyZW50LmxlZnQtdGhpcy5tYXJnaW5zLmxlZnQrKHRoaXMub2Zmc2V0UGFyZW50WzBdPT1kb2N1bWVudC5ib2R5PzA6dGhpcy5vZmZzZXRQYXJlbnRbMF0uc2Nyb2xsTGVmdCksdG9wOmkudG9wLXRoaXMub2Zmc2V0LnBhcmVudC50b3AtdGhpcy5tYXJnaW5zLnRvcCsodGhpcy5vZmZzZXRQYXJlbnRbMF09PWRvY3VtZW50LmJvZHk/MDp0aGlzLm9mZnNldFBhcmVudFswXS5zY3JvbGxUb3ApfSxwYXJzZUludCh0aGlzLm9wdGlvbnMucmV2ZXJ0LDEwKXx8NTAwLGZ1bmN0aW9uKCl7ci5fY2xlYXIodCl9KX1lbHNlIHRoaXMuX2NsZWFyKHQsbik7cmV0dXJuITF9LGNhbmNlbDpmdW5jdGlvbigpe2lmKHRoaXMuZHJhZ2dpbmcpe3RoaXMuX21vdXNlVXAoe3RhcmdldDpudWxsfSksdGhpcy5vcHRpb25zLmhlbHBlcj09Im9yaWdpbmFsIj90aGlzLmN1cnJlbnRJdGVtLmNzcyh0aGlzLl9zdG9yZWRDU1MpLnJlbW92ZUNsYXNzKCJ1aS1zb3J0YWJsZS1oZWxwZXIiKTp0aGlzLmN1cnJlbnRJdGVtLnNob3coKTtmb3IodmFyIHQ9dGhpcy5jb250YWluZXJzLmxlbmd0aC0xO3Q+PTA7dC0tKXRoaXMuY29udGFpbmVyc1t0XS5fdHJpZ2dlcigiZGVhY3RpdmF0ZSIsbnVsbCx0aGlzLl91aUhhc2godGhpcykpLHRoaXMuY29udGFpbmVyc1t0XS5jb250YWluZXJDYWNoZS5vdmVyJiYodGhpcy5jb250YWluZXJzW3RdLl90cmlnZ2VyKCJvdXQiLG51bGwsdGhpcy5fdWlIYXNoKHRoaXMpKSx0aGlzLmNvbnRhaW5lcnNbdF0uY29udGFpbmVyQ2FjaGUub3Zlcj0wKX1yZXR1cm4gdGhpcy5wbGFjZWhvbGRlciYmKHRoaXMucGxhY2Vob2xkZXJbMF0ucGFyZW50Tm9kZSYmdGhpcy5wbGFjZWhvbGRlclswXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMucGxhY2Vob2xkZXJbMF0pLHRoaXMub3B0aW9ucy5oZWxwZXIhPSJvcmlnaW5hbCImJnRoaXMuaGVscGVyJiZ0aGlzLmhlbHBlclswXS5wYXJlbnROb2RlJiZ0aGlzLmhlbHBlci5yZW1vdmUoKSxlLmV4dGVuZCh0aGlzLHtoZWxwZXI6bnVsbCxkcmFnZ2luZzohMSxyZXZlcnRpbmc6ITEsX25vRmluYWxTb3J0Om51bGx9KSx0aGlzLmRvbVBvc2l0aW9uLnByZXY/ZSh0aGlzLmRvbVBvc2l0aW9uLnByZXYpLmFmdGVyKHRoaXMuY3VycmVudEl0ZW0pOmUodGhpcy5kb21Qb3NpdGlvbi5wYXJlbnQpLnByZXBlbmQodGhpcy5jdXJyZW50SXRlbSkpLHRoaXN9LHNlcmlhbGl6ZTpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9nZXRJdGVtc0FzalF1ZXJ5KHQmJnQuY29ubmVjdGVkKSxyPVtdO3JldHVybiB0PXR8fHt9LGUobikuZWFjaChmdW5jdGlvbigpe3ZhciBuPShlKHQuaXRlbXx8dGhpcykuYXR0cih0LmF0dHJpYnV0ZXx8ImlkIil8fCIiKS5tYXRjaCh0LmV4cHJlc3Npb258fC8oLispWy09X10oLispLyk7biYmci5wdXNoKCh0LmtleXx8blsxXSsiW10iKSsiPSIrKHQua2V5JiZ0LmV4cHJlc3Npb24/blsxXTpuWzJdKSl9KSwhci5sZW5ndGgmJnQua2V5JiZyLnB1c2godC5rZXkrIj0iKSxyLmpvaW4oIiYiKX0sdG9BcnJheTpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9nZXRJdGVtc0FzalF1ZXJ5KHQmJnQuY29ubmVjdGVkKSxyPVtdO3JldHVybiB0PXR8fHt9LG4uZWFjaChmdW5jdGlvbigpe3IucHVzaChlKHQuaXRlbXx8dGhpcykuYXR0cih0LmF0dHJpYnV0ZXx8ImlkIil8fCIiKX0pLHJ9LF9pbnRlcnNlY3RzV2l0aDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLnBvc2l0aW9uQWJzLmxlZnQsbj10K3RoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgscj10aGlzLnBvc2l0aW9uQWJzLnRvcCxpPXIrdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQscz1lLmxlZnQsbz1zK2Uud2lkdGgsdT1lLnRvcCxhPXUrZS5oZWlnaHQsZj10aGlzLm9mZnNldC5jbGljay50b3AsbD10aGlzLm9mZnNldC5jbGljay5sZWZ0LGM9citmPnUmJnIrZjxhJiZ0K2w+cyYmdCtsPG87cmV0dXJuIHRoaXMub3B0aW9ucy50b2xlcmFuY2U9PSJwb2ludGVyInx8dGhpcy5vcHRpb25zLmZvcmNlUG9pbnRlckZvckNvbnRhaW5lcnN8fHRoaXMub3B0aW9ucy50b2xlcmFuY2UhPSJwb2ludGVyIiYmdGhpcy5oZWxwZXJQcm9wb3J0aW9uc1t0aGlzLmZsb2F0aW5nPyJ3aWR0aCI6ImhlaWdodCJdPmVbdGhpcy5mbG9hdGluZz8id2lkdGgiOiJoZWlnaHQiXT9jOnM8dCt0aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLzImJm4tdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC8yPG8mJnU8cit0aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC8yJiZpLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LzI8YX0sX2ludGVyc2VjdHNXaXRoUG9pbnRlcjpmdW5jdGlvbih0KXt2YXIgbj10aGlzLm9wdGlvbnMuYXhpcz09PSJ4Inx8ZS51aS5pc092ZXJBeGlzKHRoaXMucG9zaXRpb25BYnMudG9wK3RoaXMub2Zmc2V0LmNsaWNrLnRvcCx0LnRvcCx0LmhlaWdodCkscj10aGlzLm9wdGlvbnMuYXhpcz09PSJ5Inx8ZS51aS5pc092ZXJBeGlzKHRoaXMucG9zaXRpb25BYnMubGVmdCt0aGlzLm9mZnNldC5jbGljay5sZWZ0LHQubGVmdCx0LndpZHRoKSxpPW4mJnIscz10aGlzLl9nZXREcmFnVmVydGljYWxEaXJlY3Rpb24oKSxvPXRoaXMuX2dldERyYWdIb3Jpem9udGFsRGlyZWN0aW9uKCk7cmV0dXJuIGk/dGhpcy5mbG9hdGluZz9vJiZvPT0icmlnaHQifHxzPT0iZG93biI/MjoxOnMmJihzPT0iZG93biI/MjoxKTohMX0sX2ludGVyc2VjdHNXaXRoU2lkZXM6ZnVuY3Rpb24odCl7dmFyIG49ZS51aS5pc092ZXJBeGlzKHRoaXMucG9zaXRpb25BYnMudG9wK3RoaXMub2Zmc2V0LmNsaWNrLnRvcCx0LnRvcCt0LmhlaWdodC8yLHQuaGVpZ2h0KSxyPWUudWkuaXNPdmVyQXhpcyh0aGlzLnBvc2l0aW9uQWJzLmxlZnQrdGhpcy5vZmZzZXQuY2xpY2subGVmdCx0LmxlZnQrdC53aWR0aC8yLHQud2lkdGgpLGk9dGhpcy5fZ2V0RHJhZ1ZlcnRpY2FsRGlyZWN0aW9uKCkscz10aGlzLl9nZXREcmFnSG9yaXpvbnRhbERpcmVjdGlvbigpO3JldHVybiB0aGlzLmZsb2F0aW5nJiZzP3M9PSJyaWdodCImJnJ8fHM9PSJsZWZ0IiYmIXI6aSYmKGk9PSJkb3duIiYmbnx8aT09InVwIiYmIW4pfSxfZ2V0RHJhZ1ZlcnRpY2FsRGlyZWN0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wb3NpdGlvbkFicy50b3AtdGhpcy5sYXN0UG9zaXRpb25BYnMudG9wO3JldHVybiBlIT0wJiYoZT4wPyJkb3duIjoidXAiKX0sX2dldERyYWdIb3Jpem9udGFsRGlyZWN0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wb3NpdGlvbkFicy5sZWZ0LXRoaXMubGFzdFBvc2l0aW9uQWJzLmxlZnQ7cmV0dXJuIGUhPTAmJihlPjA/InJpZ2h0IjoibGVmdCIpfSxyZWZyZXNoOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9yZWZyZXNoSXRlbXMoZSksdGhpcy5yZWZyZXNoUG9zaXRpb25zKCksdGhpc30sX2Nvbm5lY3RXaXRoOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcHRpb25zO3JldHVybiBlLmNvbm5lY3RXaXRoLmNvbnN0cnVjdG9yPT1TdHJpbmc/W2UuY29ubmVjdFdpdGhdOmUuY29ubmVjdFdpdGh9LF9nZXRJdGVtc0FzalF1ZXJ5OmZ1bmN0aW9uKHQpe3ZhciBuPVtdLHI9W10saT10aGlzLl9jb25uZWN0V2l0aCgpO2lmKGkmJnQpZm9yKHZhciBzPWkubGVuZ3RoLTE7cz49MDtzLS0pe3ZhciBvPWUoaVtzXSk7Zm9yKHZhciB1PW8ubGVuZ3RoLTE7dT49MDt1LS0pe3ZhciBhPWUuZGF0YShvW3VdLHRoaXMud2lkZ2V0TmFtZSk7YSYmYSE9dGhpcyYmIWEub3B0aW9ucy5kaXNhYmxlZCYmci5wdXNoKFtlLmlzRnVuY3Rpb24oYS5vcHRpb25zLml0ZW1zKT9hLm9wdGlvbnMuaXRlbXMuY2FsbChhLmVsZW1lbnQpOmUoYS5vcHRpb25zLml0ZW1zLGEuZWxlbWVudCkubm90KCIudWktc29ydGFibGUtaGVscGVyIikubm90KCIudWktc29ydGFibGUtcGxhY2Vob2xkZXIiKSxhXSl9fXIucHVzaChbZS5pc0Z1bmN0aW9uKHRoaXMub3B0aW9ucy5pdGVtcyk/dGhpcy5vcHRpb25zLml0ZW1zLmNhbGwodGhpcy5lbGVtZW50LG51bGwse29wdGlvbnM6dGhpcy5vcHRpb25zLGl0ZW06dGhpcy5jdXJyZW50SXRlbX0pOmUodGhpcy5vcHRpb25zLml0ZW1zLHRoaXMuZWxlbWVudCkubm90KCIudWktc29ydGFibGUtaGVscGVyIikubm90KCIudWktc29ydGFibGUtcGxhY2Vob2xkZXIiKSx0aGlzXSk7Zm9yKHZhciBzPXIubGVuZ3RoLTE7cz49MDtzLS0pcltzXVswXS5lYWNoKGZ1bmN0aW9uKCl7bi5wdXNoKHRoaXMpfSk7cmV0dXJuIGUobil9LF9yZW1vdmVDdXJyZW50c0Zyb21JdGVtczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuY3VycmVudEl0ZW0uZmluZCgiOmRhdGEoIit0aGlzLndpZGdldE5hbWUrIi1pdGVtKSIpO3RoaXMuaXRlbXM9ZS5ncmVwKHRoaXMuaXRlbXMsZnVuY3Rpb24oZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspaWYodFtuXT09ZS5pdGVtWzBdKXJldHVybiExO3JldHVybiEwfSl9LF9yZWZyZXNoSXRlbXM6ZnVuY3Rpb24odCl7dGhpcy5pdGVtcz1bXSx0aGlzLmNvbnRhaW5lcnM9W3RoaXNdO3ZhciBuPXRoaXMuaXRlbXMscj1bW2UuaXNGdW5jdGlvbih0aGlzLm9wdGlvbnMuaXRlbXMpP3RoaXMub3B0aW9ucy5pdGVtcy5jYWxsKHRoaXMuZWxlbWVudFswXSx0LHtpdGVtOnRoaXMuY3VycmVudEl0ZW19KTplKHRoaXMub3B0aW9ucy5pdGVtcyx0aGlzLmVsZW1lbnQpLHRoaXNdXSxpPXRoaXMuX2Nvbm5lY3RXaXRoKCk7aWYoaSYmdGhpcy5yZWFkeSlmb3IodmFyIHM9aS5sZW5ndGgtMTtzPj0wO3MtLSl7dmFyIG89ZShpW3NdKTtmb3IodmFyIHU9by5sZW5ndGgtMTt1Pj0wO3UtLSl7dmFyIGE9ZS5kYXRhKG9bdV0sdGhpcy53aWRnZXROYW1lKTthJiZhIT10aGlzJiYhYS5vcHRpb25zLmRpc2FibGVkJiYoci5wdXNoKFtlLmlzRnVuY3Rpb24oYS5vcHRpb25zLml0ZW1zKT9hLm9wdGlvbnMuaXRlbXMuY2FsbChhLmVsZW1lbnRbMF0sdCx7aXRlbTp0aGlzLmN1cnJlbnRJdGVtfSk6ZShhLm9wdGlvbnMuaXRlbXMsYS5lbGVtZW50KSxhXSksdGhpcy5jb250YWluZXJzLnB1c2goYSkpfX1mb3IodmFyIHM9ci5sZW5ndGgtMTtzPj0wO3MtLSl7dmFyIGY9cltzXVsxXSxsPXJbc11bMF07Zm9yKHZhciB1PTAsYz1sLmxlbmd0aDt1PGM7dSsrKXt2YXIgaD1lKGxbdV0pO2guZGF0YSh0aGlzLndpZGdldE5hbWUrIi1pdGVtIixmKSxuLnB1c2goe2l0ZW06aCxpbnN0YW5jZTpmLHdpZHRoOjAsaGVpZ2h0OjAsbGVmdDowLHRvcDowfSl9fX0scmVmcmVzaFBvc2l0aW9uczpmdW5jdGlvbih0KXt0aGlzLm9mZnNldFBhcmVudCYmdGhpcy5oZWxwZXImJih0aGlzLm9mZnNldC5wYXJlbnQ9dGhpcy5fZ2V0UGFyZW50T2Zmc2V0KCkpO2Zvcih2YXIgbj10aGlzLml0ZW1zLmxlbmd0aC0xO24+PTA7bi0tKXt2YXIgcj10aGlzLml0ZW1zW25dO2lmKHIuaW5zdGFuY2UhPXRoaXMuY3VycmVudENvbnRhaW5lciYmdGhpcy5jdXJyZW50Q29udGFpbmVyJiZyLml0ZW1bMF0hPXRoaXMuY3VycmVudEl0ZW1bMF0pY29udGludWU7dmFyIGk9dGhpcy5vcHRpb25zLnRvbGVyYW5jZUVsZW1lbnQ/ZSh0aGlzLm9wdGlvbnMudG9sZXJhbmNlRWxlbWVudCxyLml0ZW0pOnIuaXRlbTt0fHwoci53aWR0aD1pLm91dGVyV2lkdGgoKSxyLmhlaWdodD1pLm91dGVySGVpZ2h0KCkpO3ZhciBzPWkub2Zmc2V0KCk7ci5sZWZ0PXMubGVmdCxyLnRvcD1zLnRvcH1pZih0aGlzLm9wdGlvbnMuY3VzdG9tJiZ0aGlzLm9wdGlvbnMuY3VzdG9tLnJlZnJlc2hDb250YWluZXJzKXRoaXMub3B0aW9ucy5jdXN0b20ucmVmcmVzaENvbnRhaW5lcnMuY2FsbCh0aGlzKTtlbHNlIGZvcih2YXIgbj10aGlzLmNvbnRhaW5lcnMubGVuZ3RoLTE7bj49MDtuLS0pe3ZhciBzPXRoaXMuY29udGFpbmVyc1tuXS5lbGVtZW50Lm9mZnNldCgpO3RoaXMuY29udGFpbmVyc1tuXS5jb250YWluZXJDYWNoZS5sZWZ0PXMubGVmdCx0aGlzLmNvbnRhaW5lcnNbbl0uY29udGFpbmVyQ2FjaGUudG9wPXMudG9wLHRoaXMuY29udGFpbmVyc1tuXS5jb250YWluZXJDYWNoZS53aWR0aD10aGlzLmNvbnRhaW5lcnNbbl0uZWxlbWVudC5vdXRlcldpZHRoKCksdGhpcy5jb250YWluZXJzW25dLmNvbnRhaW5lckNhY2hlLmhlaWdodD10aGlzLmNvbnRhaW5lcnNbbl0uZWxlbWVudC5vdXRlckhlaWdodCgpfXJldHVybiB0aGlzfSxfY3JlYXRlUGxhY2Vob2xkZXI6ZnVuY3Rpb24odCl7dD10fHx0aGlzO3ZhciBuPXQub3B0aW9ucztpZighbi5wbGFjZWhvbGRlcnx8bi5wbGFjZWhvbGRlci5jb25zdHJ1Y3Rvcj09U3RyaW5nKXt2YXIgcj1uLnBsYWNlaG9sZGVyO24ucGxhY2Vob2xkZXI9e2VsZW1lbnQ6ZnVuY3Rpb24oKXt2YXIgbj1lKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodC5jdXJyZW50SXRlbVswXS5ub2RlTmFtZSkpLmFkZENsYXNzKHJ8fHQuY3VycmVudEl0ZW1bMF0uY2xhc3NOYW1lKyIgdWktc29ydGFibGUtcGxhY2Vob2xkZXIiKS5yZW1vdmVDbGFzcygidWktc29ydGFibGUtaGVscGVyIilbMF07cmV0dXJuIHJ8fChuLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIpLG59LHVwZGF0ZTpmdW5jdGlvbihlLGkpe2lmKHImJiFuLmZvcmNlUGxhY2Vob2xkZXJTaXplKXJldHVybjtpLmhlaWdodCgpfHxpLmhlaWdodCh0LmN1cnJlbnRJdGVtLmlubmVySGVpZ2h0KCktcGFyc2VJbnQodC5jdXJyZW50SXRlbS5jc3MoInBhZGRpbmdUb3AiKXx8MCwxMCktcGFyc2VJbnQodC5jdXJyZW50SXRlbS5jc3MoInBhZGRpbmdCb3R0b20iKXx8MCwxMCkpLGkud2lkdGgoKXx8aS53aWR0aCh0LmN1cnJlbnRJdGVtLmlubmVyV2lkdGgoKS1wYXJzZUludCh0LmN1cnJlbnRJdGVtLmNzcygicGFkZGluZ0xlZnQiKXx8MCwxMCktcGFyc2VJbnQodC5jdXJyZW50SXRlbS5jc3MoInBhZGRpbmdSaWdodCIpfHwwLDEwKSl9fX10LnBsYWNlaG9sZGVyPWUobi5wbGFjZWhvbGRlci5lbGVtZW50LmNhbGwodC5lbGVtZW50LHQuY3VycmVudEl0ZW0pKSx0LmN1cnJlbnRJdGVtLmFmdGVyKHQucGxhY2Vob2xkZXIpLG4ucGxhY2Vob2xkZXIudXBkYXRlKHQsdC5wbGFjZWhvbGRlcil9LF9jb250YWN0Q29udGFpbmVyczpmdW5jdGlvbih0KXt2YXIgbj1udWxsLHI9bnVsbDtmb3IodmFyIGk9dGhpcy5jb250YWluZXJzLmxlbmd0aC0xO2k+PTA7aS0tKXtpZihlLmNvbnRhaW5zKHRoaXMuY3VycmVudEl0ZW1bMF0sdGhpcy5jb250YWluZXJzW2ldLmVsZW1lbnRbMF0pKWNvbnRpbnVlO2lmKHRoaXMuX2ludGVyc2VjdHNXaXRoKHRoaXMuY29udGFpbmVyc1tpXS5jb250YWluZXJDYWNoZSkpe2lmKG4mJmUuY29udGFpbnModGhpcy5jb250YWluZXJzW2ldLmVsZW1lbnRbMF0sbi5lbGVtZW50WzBdKSljb250aW51ZTtuPXRoaXMuY29udGFpbmVyc1tpXSxyPWl9ZWxzZSB0aGlzLmNvbnRhaW5lcnNbaV0uY29udGFpbmVyQ2FjaGUub3ZlciYmKHRoaXMuY29udGFpbmVyc1tpXS5fdHJpZ2dlcigib3V0Iix0LHRoaXMuX3VpSGFzaCh0aGlzKSksdGhpcy5jb250YWluZXJzW2ldLmNvbnRhaW5lckNhY2hlLm92ZXI9MCl9aWYoIW4pcmV0dXJuO2lmKHRoaXMuY29udGFpbmVycy5sZW5ndGg9PT0xKXRoaXMuY29udGFpbmVyc1tyXS5fdHJpZ2dlcigib3ZlciIsdCx0aGlzLl91aUhhc2godGhpcykpLHRoaXMuY29udGFpbmVyc1tyXS5jb250YWluZXJDYWNoZS5vdmVyPTE7ZWxzZXt2YXIgcz0xZTQsbz1udWxsLHU9dGhpcy5jb250YWluZXJzW3JdLmZsb2F0aW5nPyJsZWZ0IjoidG9wIixhPXRoaXMuY29udGFpbmVyc1tyXS5mbG9hdGluZz8id2lkdGgiOiJoZWlnaHQiLGY9dGhpcy5wb3NpdGlvbkFic1t1XSt0aGlzLm9mZnNldC5jbGlja1t1XTtmb3IodmFyIGw9dGhpcy5pdGVtcy5sZW5ndGgtMTtsPj0wO2wtLSl7aWYoIWUuY29udGFpbnModGhpcy5jb250YWluZXJzW3JdLmVsZW1lbnRbMF0sdGhpcy5pdGVtc1tsXS5pdGVtWzBdKSljb250aW51ZTtpZih0aGlzLml0ZW1zW2xdLml0ZW1bMF09PXRoaXMuY3VycmVudEl0ZW1bMF0pY29udGludWU7dmFyIGM9dGhpcy5pdGVtc1tsXS5pdGVtLm9mZnNldCgpW3VdLGg9ITE7TWF0aC5hYnMoYy1mKT5NYXRoLmFicyhjK3RoaXMuaXRlbXNbbF1bYV0tZikmJihoPSEwLGMrPXRoaXMuaXRlbXNbbF1bYV0pLE1hdGguYWJzKGMtZik8cyYmKHM9TWF0aC5hYnMoYy1mKSxvPXRoaXMuaXRlbXNbbF0sdGhpcy5kaXJlY3Rpb249aD8idXAiOiJkb3duIil9aWYoIW8mJiF0aGlzLm9wdGlvbnMuZHJvcE9uRW1wdHkpcmV0dXJuO3RoaXMuY3VycmVudENvbnRhaW5lcj10aGlzLmNvbnRhaW5lcnNbcl0sbz90aGlzLl9yZWFycmFuZ2UodCxvLG51bGwsITApOnRoaXMuX3JlYXJyYW5nZSh0LG51bGwsdGhpcy5jb250YWluZXJzW3JdLmVsZW1lbnQsITApLHRoaXMuX3RyaWdnZXIoImNoYW5nZSIsdCx0aGlzLl91aUhhc2goKSksdGhpcy5jb250YWluZXJzW3JdLl90cmlnZ2VyKCJjaGFuZ2UiLHQsdGhpcy5fdWlIYXNoKHRoaXMpKSx0aGlzLm9wdGlvbnMucGxhY2Vob2xkZXIudXBkYXRlKHRoaXMuY3VycmVudENvbnRhaW5lcix0aGlzLnBsYWNlaG9sZGVyKSx0aGlzLmNvbnRhaW5lcnNbcl0uX3RyaWdnZXIoIm92ZXIiLHQsdGhpcy5fdWlIYXNoKHRoaXMpKSx0aGlzLmNvbnRhaW5lcnNbcl0uY29udGFpbmVyQ2FjaGUub3Zlcj0xfX0sX2NyZWF0ZUhlbHBlcjpmdW5jdGlvbih0KXt2YXIgbj10aGlzLm9wdGlvbnMscj1lLmlzRnVuY3Rpb24obi5oZWxwZXIpP2Uobi5oZWxwZXIuYXBwbHkodGhpcy5lbGVtZW50WzBdLFt0LHRoaXMuY3VycmVudEl0ZW1dKSk6bi5oZWxwZXI9PSJjbG9uZSI/dGhpcy5jdXJyZW50SXRlbS5jbG9uZSgpOnRoaXMuY3VycmVudEl0ZW07cmV0dXJuIHIucGFyZW50cygiYm9keSIpLmxlbmd0aHx8ZShuLmFwcGVuZFRvIT0icGFyZW50Ij9uLmFwcGVuZFRvOnRoaXMuY3VycmVudEl0ZW1bMF0ucGFyZW50Tm9kZSlbMF0uYXBwZW5kQ2hpbGQoclswXSksclswXT09dGhpcy5jdXJyZW50SXRlbVswXSYmKHRoaXMuX3N0b3JlZENTUz17d2lkdGg6dGhpcy5jdXJyZW50SXRlbVswXS5zdHlsZS53aWR0aCxoZWlnaHQ6dGhpcy5jdXJyZW50SXRlbVswXS5zdHlsZS5oZWlnaHQscG9zaXRpb246dGhpcy5jdXJyZW50SXRlbS5jc3MoInBvc2l0aW9uIiksdG9wOnRoaXMuY3VycmVudEl0ZW0uY3NzKCJ0b3AiKSxsZWZ0OnRoaXMuY3VycmVudEl0ZW0uY3NzKCJsZWZ0Iil9KSwoclswXS5zdHlsZS53aWR0aD09IiJ8fG4uZm9yY2VIZWxwZXJTaXplKSYmci53aWR0aCh0aGlzLmN1cnJlbnRJdGVtLndpZHRoKCkpLChyWzBdLnN0eWxlLmhlaWdodD09IiJ8fG4uZm9yY2VIZWxwZXJTaXplKSYmci5oZWlnaHQodGhpcy5jdXJyZW50SXRlbS5oZWlnaHQoKSkscn0sX2FkanVzdE9mZnNldEZyb21IZWxwZXI6ZnVuY3Rpb24odCl7dHlwZW9mIHQ9PSJzdHJpbmciJiYodD10LnNwbGl0KCIgIikpLGUuaXNBcnJheSh0KSYmKHQ9e2xlZnQ6K3RbMF0sdG9wOit0WzFdfHwwfSksImxlZnQiaW4gdCYmKHRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ9dC5sZWZ0K3RoaXMubWFyZ2lucy5sZWZ0KSwicmlnaHQiaW4gdCYmKHRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ9dGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC10LnJpZ2h0K3RoaXMubWFyZ2lucy5sZWZ0KSwidG9wImluIHQmJih0aGlzLm9mZnNldC5jbGljay50b3A9dC50b3ArdGhpcy5tYXJnaW5zLnRvcCksImJvdHRvbSJpbiB0JiYodGhpcy5vZmZzZXQuY2xpY2sudG9wPXRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LXQuYm90dG9tK3RoaXMubWFyZ2lucy50b3ApfSxfZ2V0UGFyZW50T2Zmc2V0OmZ1bmN0aW9uKCl7dGhpcy5vZmZzZXRQYXJlbnQ9dGhpcy5oZWxwZXIub2Zmc2V0UGFyZW50KCk7dmFyIHQ9dGhpcy5vZmZzZXRQYXJlbnQub2Zmc2V0KCk7dGhpcy5jc3NQb3NpdGlvbj09ImFic29sdXRlIiYmdGhpcy5zY3JvbGxQYXJlbnRbMF0hPWRvY3VtZW50JiZlLmNvbnRhaW5zKHRoaXMuc2Nyb2xsUGFyZW50WzBdLHRoaXMub2Zmc2V0UGFyZW50WzBdKSYmKHQubGVmdCs9dGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdCgpLHQudG9wKz10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKSk7aWYodGhpcy5vZmZzZXRQYXJlbnRbMF09PWRvY3VtZW50LmJvZHl8fHRoaXMub2Zmc2V0UGFyZW50WzBdLnRhZ05hbWUmJnRoaXMub2Zmc2V0UGFyZW50WzBdLnRhZ05hbWUudG9Mb3dlckNhc2UoKT09Imh0bWwiJiZlLnVpLmllKXQ9e3RvcDowLGxlZnQ6MH07cmV0dXJue3RvcDp0LnRvcCsocGFyc2VJbnQodGhpcy5vZmZzZXRQYXJlbnQuY3NzKCJib3JkZXJUb3BXaWR0aCIpLDEwKXx8MCksbGVmdDp0LmxlZnQrKHBhcnNlSW50KHRoaXMub2Zmc2V0UGFyZW50LmNzcygiYm9yZGVyTGVmdFdpZHRoIiksMTApfHwwKX19LF9nZXRSZWxhdGl2ZU9mZnNldDpmdW5jdGlvbigpe2lmKHRoaXMuY3NzUG9zaXRpb249PSJyZWxhdGl2ZSIpe3ZhciBlPXRoaXMuY3VycmVudEl0ZW0ucG9zaXRpb24oKTtyZXR1cm57dG9wOmUudG9wLShwYXJzZUludCh0aGlzLmhlbHBlci5jc3MoInRvcCIpLDEwKXx8MCkrdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCksbGVmdDplLmxlZnQtKHBhcnNlSW50KHRoaXMuaGVscGVyLmNzcygibGVmdCIpLDEwKXx8MCkrdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdCgpfX1yZXR1cm57dG9wOjAsbGVmdDowfX0sX2NhY2hlTWFyZ2luczpmdW5jdGlvbigpe3RoaXMubWFyZ2lucz17bGVmdDpwYXJzZUludCh0aGlzLmN1cnJlbnRJdGVtLmNzcygibWFyZ2luTGVmdCIpLDEwKXx8MCx0b3A6cGFyc2VJbnQodGhpcy5jdXJyZW50SXRlbS5jc3MoIm1hcmdpblRvcCIpLDEwKXx8MH19LF9jYWNoZUhlbHBlclByb3BvcnRpb25zOmZ1bmN0aW9uKCl7dGhpcy5oZWxwZXJQcm9wb3J0aW9ucz17d2lkdGg6dGhpcy5oZWxwZXIub3V0ZXJXaWR0aCgpLGhlaWdodDp0aGlzLmhlbHBlci5vdXRlckhlaWdodCgpfX0sX3NldENvbnRhaW5tZW50OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zO3QuY29udGFpbm1lbnQ9PSJwYXJlbnQiJiYodC5jb250YWlubWVudD10aGlzLmhlbHBlclswXS5wYXJlbnROb2RlKTtpZih0LmNvbnRhaW5tZW50PT0iZG9jdW1lbnQifHx0LmNvbnRhaW5tZW50PT0id2luZG93Iil0aGlzLmNvbnRhaW5tZW50PVswLXRoaXMub2Zmc2V0LnJlbGF0aXZlLmxlZnQtdGhpcy5vZmZzZXQucGFyZW50LmxlZnQsMC10aGlzLm9mZnNldC5yZWxhdGl2ZS50b3AtdGhpcy5vZmZzZXQucGFyZW50LnRvcCxlKHQuY29udGFpbm1lbnQ9PSJkb2N1bWVudCI/ZG9jdW1lbnQ6d2luZG93KS53aWR0aCgpLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgtdGhpcy5tYXJnaW5zLmxlZnQsKGUodC5jb250YWlubWVudD09ImRvY3VtZW50Ij9kb2N1bWVudDp3aW5kb3cpLmhlaWdodCgpfHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGUuc2Nyb2xsSGVpZ2h0KS10aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC10aGlzLm1hcmdpbnMudG9wXTtpZighL14oZG9jdW1lbnR8d2luZG93fHBhcmVudCkkLy50ZXN0KHQuY29udGFpbm1lbnQpKXt2YXIgbj1lKHQuY29udGFpbm1lbnQpWzBdLHI9ZSh0LmNvbnRhaW5tZW50KS5vZmZzZXQoKSxpPWUobikuY3NzKCJvdmVyZmxvdyIpIT0iaGlkZGVuIjt0aGlzLmNvbnRhaW5tZW50PVtyLmxlZnQrKHBhcnNlSW50KGUobikuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCl8fDApKyhwYXJzZUludChlKG4pLmNzcygicGFkZGluZ0xlZnQiKSwxMCl8fDApLXRoaXMubWFyZ2lucy5sZWZ0LHIudG9wKyhwYXJzZUludChlKG4pLmNzcygiYm9yZGVyVG9wV2lkdGgiKSwxMCl8fDApKyhwYXJzZUludChlKG4pLmNzcygicGFkZGluZ1RvcCIpLDEwKXx8MCktdGhpcy5tYXJnaW5zLnRvcCxyLmxlZnQrKGk/TWF0aC5tYXgobi5zY3JvbGxXaWR0aCxuLm9mZnNldFdpZHRoKTpuLm9mZnNldFdpZHRoKS0ocGFyc2VJbnQoZShuKS5jc3MoImJvcmRlckxlZnRXaWR0aCIpLDEwKXx8MCktKHBhcnNlSW50KGUobikuY3NzKCJwYWRkaW5nUmlnaHQiKSwxMCl8fDApLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgtdGhpcy5tYXJnaW5zLmxlZnQsci50b3ArKGk/TWF0aC5tYXgobi5zY3JvbGxIZWlnaHQsbi5vZmZzZXRIZWlnaHQpOm4ub2Zmc2V0SGVpZ2h0KS0ocGFyc2VJbnQoZShuKS5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKS0ocGFyc2VJbnQoZShuKS5jc3MoInBhZGRpbmdCb3R0b20iKSwxMCl8fDApLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LXRoaXMubWFyZ2lucy50b3BdfX0sX2NvbnZlcnRQb3NpdGlvblRvOmZ1bmN0aW9uKHQsbil7bnx8KG49dGhpcy5wb3NpdGlvbik7dmFyIHI9dD09ImFic29sdXRlIj8xOi0xLGk9dGhpcy5vcHRpb25zLHM9dGhpcy5jc3NQb3NpdGlvbiE9ImFic29sdXRlInx8dGhpcy5zY3JvbGxQYXJlbnRbMF0hPWRvY3VtZW50JiYhIWUuY29udGFpbnModGhpcy5zY3JvbGxQYXJlbnRbMF0sdGhpcy5vZmZzZXRQYXJlbnRbMF0pP3RoaXMuc2Nyb2xsUGFyZW50OnRoaXMub2Zmc2V0UGFyZW50LG89LyhodG1sfGJvZHkpL2kudGVzdChzWzBdLnRhZ05hbWUpO3JldHVybnt0b3A6bi50b3ArdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wKnIrdGhpcy5vZmZzZXQucGFyZW50LnRvcCpyLSh0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKTpvPzA6cy5zY3JvbGxUb3AoKSkqcixsZWZ0Om4ubGVmdCt0aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0KnIrdGhpcy5vZmZzZXQucGFyZW50LmxlZnQqci0odGhpcy5jc3NQb3NpdGlvbj09ImZpeGVkIj8tdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdCgpOm8/MDpzLnNjcm9sbExlZnQoKSkqcn19LF9nZW5lcmF0ZVBvc2l0aW9uOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMub3B0aW9ucyxyPXRoaXMuY3NzUG9zaXRpb24hPSJhYnNvbHV0ZSJ8fHRoaXMuc2Nyb2xsUGFyZW50WzBdIT1kb2N1bWVudCYmISFlLmNvbnRhaW5zKHRoaXMuc2Nyb2xsUGFyZW50WzBdLHRoaXMub2Zmc2V0UGFyZW50WzBdKT90aGlzLnNjcm9sbFBhcmVudDp0aGlzLm9mZnNldFBhcmVudCxpPS8oaHRtbHxib2R5KS9pLnRlc3QoclswXS50YWdOYW1lKTt0aGlzLmNzc1Bvc2l0aW9uPT0icmVsYXRpdmUiJiYodGhpcy5zY3JvbGxQYXJlbnRbMF09PWRvY3VtZW50fHx0aGlzLnNjcm9sbFBhcmVudFswXT09dGhpcy5vZmZzZXRQYXJlbnRbMF0pJiYodGhpcy5vZmZzZXQucmVsYXRpdmU9dGhpcy5fZ2V0UmVsYXRpdmVPZmZzZXQoKSk7dmFyIHM9dC5wYWdlWCxvPXQucGFnZVk7aWYodGhpcy5vcmlnaW5hbFBvc2l0aW9uKXt0aGlzLmNvbnRhaW5tZW50JiYodC5wYWdlWC10aGlzLm9mZnNldC5jbGljay5sZWZ0PHRoaXMuY29udGFpbm1lbnRbMF0mJihzPXRoaXMuY29udGFpbm1lbnRbMF0rdGhpcy5vZmZzZXQuY2xpY2subGVmdCksdC5wYWdlWS10aGlzLm9mZnNldC5jbGljay50b3A8dGhpcy5jb250YWlubWVudFsxXSYmKG89dGhpcy5jb250YWlubWVudFsxXSt0aGlzLm9mZnNldC5jbGljay50b3ApLHQucGFnZVgtdGhpcy5vZmZzZXQuY2xpY2subGVmdD50aGlzLmNvbnRhaW5tZW50WzJdJiYocz10aGlzLmNvbnRhaW5tZW50WzJdK3RoaXMub2Zmc2V0LmNsaWNrLmxlZnQpLHQucGFnZVktdGhpcy5vZmZzZXQuY2xpY2sudG9wPnRoaXMuY29udGFpbm1lbnRbM10mJihvPXRoaXMuY29udGFpbm1lbnRbM10rdGhpcy5vZmZzZXQuY2xpY2sudG9wKSk7aWYobi5ncmlkKXt2YXIgdT10aGlzLm9yaWdpbmFsUGFnZVkrTWF0aC5yb3VuZCgoby10aGlzLm9yaWdpbmFsUGFnZVkpL24uZ3JpZFsxXSkqbi5ncmlkWzFdO289dGhpcy5jb250YWlubWVudD91LXRoaXMub2Zmc2V0LmNsaWNrLnRvcDx0aGlzLmNvbnRhaW5tZW50WzFdfHx1LXRoaXMub2Zmc2V0LmNsaWNrLnRvcD50aGlzLmNvbnRhaW5tZW50WzNdP3UtdGhpcy5vZmZzZXQuY2xpY2sudG9wPHRoaXMuY29udGFpbm1lbnRbMV0/dStuLmdyaWRbMV06dS1uLmdyaWRbMV06dTp1O3ZhciBhPXRoaXMub3JpZ2luYWxQYWdlWCtNYXRoLnJvdW5kKChzLXRoaXMub3JpZ2luYWxQYWdlWCkvbi5ncmlkWzBdKSpuLmdyaWRbMF07cz10aGlzLmNvbnRhaW5tZW50P2EtdGhpcy5vZmZzZXQuY2xpY2subGVmdDx0aGlzLmNvbnRhaW5tZW50WzBdfHxhLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ+dGhpcy5jb250YWlubWVudFsyXT9hLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ8dGhpcy5jb250YWlubWVudFswXT9hK24uZ3JpZFswXTphLW4uZ3JpZFswXTphOmF9fXJldHVybnt0b3A6by10aGlzLm9mZnNldC5jbGljay50b3AtdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wLXRoaXMub2Zmc2V0LnBhcmVudC50b3ArKHRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpOmk/MDpyLnNjcm9sbFRvcCgpKSxsZWZ0OnMtdGhpcy5vZmZzZXQuY2xpY2subGVmdC10aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0LXRoaXMub2Zmc2V0LnBhcmVudC5sZWZ0Kyh0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCk6aT8wOnIuc2Nyb2xsTGVmdCgpKX19LF9yZWFycmFuZ2U6ZnVuY3Rpb24oZSx0LG4scil7bj9uWzBdLmFwcGVuZENoaWxkKHRoaXMucGxhY2Vob2xkZXJbMF0pOnQuaXRlbVswXS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLnBsYWNlaG9sZGVyWzBdLHRoaXMuZGlyZWN0aW9uPT0iZG93biI/dC5pdGVtWzBdOnQuaXRlbVswXS5uZXh0U2libGluZyksdGhpcy5jb3VudGVyPXRoaXMuY291bnRlcj8rK3RoaXMuY291bnRlcjoxO3ZhciBpPXRoaXMuY291bnRlcjt0aGlzLl9kZWxheShmdW5jdGlvbigpe2k9PXRoaXMuY291bnRlciYmdGhpcy5yZWZyZXNoUG9zaXRpb25zKCFyKX0pfSxfY2xlYXI6ZnVuY3Rpb24odCxuKXt0aGlzLnJldmVydGluZz0hMTt2YXIgcj1bXTshdGhpcy5fbm9GaW5hbFNvcnQmJnRoaXMuY3VycmVudEl0ZW0ucGFyZW50KCkubGVuZ3RoJiZ0aGlzLnBsYWNlaG9sZGVyLmJlZm9yZSh0aGlzLmN1cnJlbnRJdGVtKSx0aGlzLl9ub0ZpbmFsU29ydD1udWxsO2lmKHRoaXMuaGVscGVyWzBdPT10aGlzLmN1cnJlbnRJdGVtWzBdKXtmb3IodmFyIGkgaW4gdGhpcy5fc3RvcmVkQ1NTKWlmKHRoaXMuX3N0b3JlZENTU1tpXT09ImF1dG8ifHx0aGlzLl9zdG9yZWRDU1NbaV09PSJzdGF0aWMiKXRoaXMuX3N0b3JlZENTU1tpXT0iIjt0aGlzLmN1cnJlbnRJdGVtLmNzcyh0aGlzLl9zdG9yZWRDU1MpLnJlbW92ZUNsYXNzKCJ1aS1zb3J0YWJsZS1oZWxwZXIiKX1lbHNlIHRoaXMuY3VycmVudEl0ZW0uc2hvdygpO3RoaXMuZnJvbU91dHNpZGUmJiFuJiZyLnB1c2goZnVuY3Rpb24oZSl7dGhpcy5fdHJpZ2dlcigicmVjZWl2ZSIsZSx0aGlzLl91aUhhc2godGhpcy5mcm9tT3V0c2lkZSkpfSksKHRoaXMuZnJvbU91dHNpZGV8fHRoaXMuZG9tUG9zaXRpb24ucHJldiE9dGhpcy5jdXJyZW50SXRlbS5wcmV2KCkubm90KCIudWktc29ydGFibGUtaGVscGVyIilbMF18fHRoaXMuZG9tUG9zaXRpb24ucGFyZW50IT10aGlzLmN1cnJlbnRJdGVtLnBhcmVudCgpWzBdKSYmIW4mJnIucHVzaChmdW5jdGlvbihlKXt0aGlzLl90cmlnZ2VyKCJ1cGRhdGUiLGUsdGhpcy5fdWlIYXNoKCkpfSksdGhpcyE9PXRoaXMuY3VycmVudENvbnRhaW5lciYmKG58fChyLnB1c2goZnVuY3Rpb24oZSl7dGhpcy5fdHJpZ2dlcigicmVtb3ZlIixlLHRoaXMuX3VpSGFzaCgpKX0pLHIucHVzaChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7ZS5fdHJpZ2dlcigicmVjZWl2ZSIsdCx0aGlzLl91aUhhc2godGhpcykpfX0uY2FsbCh0aGlzLHRoaXMuY3VycmVudENvbnRhaW5lcikpLHIucHVzaChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7ZS5fdHJpZ2dlcigidXBkYXRlIix0LHRoaXMuX3VpSGFzaCh0aGlzKSl9fS5jYWxsKHRoaXMsdGhpcy5jdXJyZW50Q29udGFpbmVyKSkpKTtmb3IodmFyIGk9dGhpcy5jb250YWluZXJzLmxlbmd0aC0xO2k+PTA7aS0tKW58fHIucHVzaChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7ZS5fdHJpZ2dlcigiZGVhY3RpdmF0ZSIsdCx0aGlzLl91aUhhc2godGhpcykpfX0uY2FsbCh0aGlzLHRoaXMuY29udGFpbmVyc1tpXSkpLHRoaXMuY29udGFpbmVyc1tpXS5jb250YWluZXJDYWNoZS5vdmVyJiYoci5wdXNoKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtlLl90cmlnZ2VyKCJvdXQiLHQsdGhpcy5fdWlIYXNoKHRoaXMpKX19LmNhbGwodGhpcyx0aGlzLmNvbnRhaW5lcnNbaV0pKSx0aGlzLmNvbnRhaW5lcnNbaV0uY29udGFpbmVyQ2FjaGUub3Zlcj0wKTt0aGlzLl9zdG9yZWRDdXJzb3ImJmUoImJvZHkiKS5jc3MoImN1cnNvciIsdGhpcy5fc3RvcmVkQ3Vyc29yKSx0aGlzLl9zdG9yZWRPcGFjaXR5JiZ0aGlzLmhlbHBlci5jc3MoIm9wYWNpdHkiLHRoaXMuX3N0b3JlZE9wYWNpdHkpLHRoaXMuX3N0b3JlZFpJbmRleCYmdGhpcy5oZWxwZXIuY3NzKCJ6SW5kZXgiLHRoaXMuX3N0b3JlZFpJbmRleD09ImF1dG8iPyIiOnRoaXMuX3N0b3JlZFpJbmRleCksdGhpcy5kcmFnZ2luZz0hMTtpZih0aGlzLmNhbmNlbEhlbHBlclJlbW92YWwpe2lmKCFuKXt0aGlzLl90cmlnZ2VyKCJiZWZvcmVTdG9wIix0LHRoaXMuX3VpSGFzaCgpKTtmb3IodmFyIGk9MDtpPHIubGVuZ3RoO2krKylyW2ldLmNhbGwodGhpcyx0KTt0aGlzLl90cmlnZ2VyKCJzdG9wIix0LHRoaXMuX3VpSGFzaCgpKX1yZXR1cm4gdGhpcy5mcm9tT3V0c2lkZT0hMSwhMX1ufHx0aGlzLl90cmlnZ2VyKCJiZWZvcmVTdG9wIix0LHRoaXMuX3VpSGFzaCgpKSx0aGlzLnBsYWNlaG9sZGVyWzBdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5wbGFjZWhvbGRlclswXSksdGhpcy5oZWxwZXJbMF0hPXRoaXMuY3VycmVudEl0ZW1bMF0mJnRoaXMuaGVscGVyLnJlbW92ZSgpLHRoaXMuaGVscGVyPW51bGw7aWYoIW4pe2Zvcih2YXIgaT0wO2k8ci5sZW5ndGg7aSsrKXJbaV0uY2FsbCh0aGlzLHQpO3RoaXMuX3RyaWdnZXIoInN0b3AiLHQsdGhpcy5fdWlIYXNoKCkpfXJldHVybiB0aGlzLmZyb21PdXRzaWRlPSExLCEwfSxfdHJpZ2dlcjpmdW5jdGlvbigpe2UuV2lkZ2V0LnByb3RvdHlwZS5fdHJpZ2dlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk9PT0hMSYmdGhpcy5jYW5jZWwoKX0sX3VpSGFzaDpmdW5jdGlvbih0KXt2YXIgbj10fHx0aGlzO3JldHVybntoZWxwZXI6bi5oZWxwZXIscGxhY2Vob2xkZXI6bi5wbGFjZWhvbGRlcnx8ZShbXSkscG9zaXRpb246bi5wb3NpdGlvbixvcmlnaW5hbFBvc2l0aW9uOm4ub3JpZ2luYWxQb3NpdGlvbixvZmZzZXQ6bi5wb3NpdGlvbkFicyxpdGVtOm4uY3VycmVudEl0ZW0sc2VuZGVyOnQ/dC5lbGVtZW50Om51bGx9fX0pfSkoalF1ZXJ5KTsoZnVuY3Rpb24oZSx0KXt2YXIgbj0wLHI9e30saT17fTtyLmhlaWdodD1yLnBhZGRpbmdUb3A9ci5wYWRkaW5nQm90dG9tPXIuYm9yZGVyVG9wV2lkdGg9ci5ib3JkZXJCb3R0b21XaWR0aD0iaGlkZSIsaS5oZWlnaHQ9aS5wYWRkaW5nVG9wPWkucGFkZGluZ0JvdHRvbT1pLmJvcmRlclRvcFdpZHRoPWkuYm9yZGVyQm90dG9tV2lkdGg9InNob3ciLGUud2lkZ2V0KCJ1aS5hY2NvcmRpb24iLHt2ZXJzaW9uOiIxLjkuMiIsb3B0aW9uczp7YWN0aXZlOjAsYW5pbWF0ZTp7fSxjb2xsYXBzaWJsZTohMSxldmVudDoiY2xpY2siLGhlYWRlcjoiPiBsaSA+IDpmaXJzdC1jaGlsZCw+IDpub3QobGkpOmV2ZW4iLGhlaWdodFN0eWxlOiJhdXRvIixpY29uczp7YWN0aXZlSGVhZGVyOiJ1aS1pY29uLXRyaWFuZ2xlLTEtcyIsaGVhZGVyOiJ1aS1pY29uLXRyaWFuZ2xlLTEtZSJ9LGFjdGl2YXRlOm51bGwsYmVmb3JlQWN0aXZhdGU6bnVsbH0sX2NyZWF0ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuYWNjb3JkaW9uSWQ9InVpLWFjY29yZGlvbi0iKyh0aGlzLmVsZW1lbnQuYXR0cigiaWQiKXx8KytuKSxyPXRoaXMub3B0aW9uczt0aGlzLnByZXZTaG93PXRoaXMucHJldkhpZGU9ZSgpLHRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktYWNjb3JkaW9uIHVpLXdpZGdldCB1aS1oZWxwZXItcmVzZXQiKSx0aGlzLmhlYWRlcnM9dGhpcy5lbGVtZW50LmZpbmQoci5oZWFkZXIpLmFkZENsYXNzKCJ1aS1hY2NvcmRpb24taGVhZGVyIHVpLWhlbHBlci1yZXNldCB1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwiKSx0aGlzLl9ob3ZlcmFibGUodGhpcy5oZWFkZXJzKSx0aGlzLl9mb2N1c2FibGUodGhpcy5oZWFkZXJzKSx0aGlzLmhlYWRlcnMubmV4dCgpLmFkZENsYXNzKCJ1aS1hY2NvcmRpb24tY29udGVudCB1aS1oZWxwZXItcmVzZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRvbSIpLmhpZGUoKSwhci5jb2xsYXBzaWJsZSYmKHIuYWN0aXZlPT09ITF8fHIuYWN0aXZlPT1udWxsKSYmKHIuYWN0aXZlPTApLHIuYWN0aXZlPDAmJihyLmFjdGl2ZSs9dGhpcy5oZWFkZXJzLmxlbmd0aCksdGhpcy5hY3RpdmU9dGhpcy5fZmluZEFjdGl2ZShyLmFjdGl2ZSkuYWRkQ2xhc3MoInVpLWFjY29yZGlvbi1oZWFkZXItYWN0aXZlIHVpLXN0YXRlLWFjdGl2ZSIpLnRvZ2dsZUNsYXNzKCJ1aS1jb3JuZXItYWxsIHVpLWNvcm5lci10b3AiKSx0aGlzLmFjdGl2ZS5uZXh0KCkuYWRkQ2xhc3MoInVpLWFjY29yZGlvbi1jb250ZW50LWFjdGl2ZSIpLnNob3coKSx0aGlzLl9jcmVhdGVJY29ucygpLHRoaXMucmVmcmVzaCgpLHRoaXMuZWxlbWVudC5hdHRyKCJyb2xlIiwidGFibGlzdCIpLHRoaXMuaGVhZGVycy5hdHRyKCJyb2xlIiwidGFiIikuZWFjaChmdW5jdGlvbihuKXt2YXIgcj1lKHRoaXMpLGk9ci5hdHRyKCJpZCIpLHM9ci5uZXh0KCksbz1zLmF0dHIoImlkIik7aXx8KGk9dCsiLWhlYWRlci0iK24sci5hdHRyKCJpZCIsaSkpLG98fChvPXQrIi1wYW5lbC0iK24scy5hdHRyKCJpZCIsbykpLHIuYXR0cigiYXJpYS1jb250cm9scyIsbykscy5hdHRyKCJhcmlhLWxhYmVsbGVkYnkiLGkpfSkubmV4dCgpLmF0dHIoInJvbGUiLCJ0YWJwYW5lbCIpLHRoaXMuaGVhZGVycy5ub3QodGhpcy5hY3RpdmUpLmF0dHIoeyJhcmlhLXNlbGVjdGVkIjoiZmFsc2UiLHRhYkluZGV4Oi0xfSkubmV4dCgpLmF0dHIoeyJhcmlhLWV4cGFuZGVkIjoiZmFsc2UiLCJhcmlhLWhpZGRlbiI6InRydWUifSkuaGlkZSgpLHRoaXMuYWN0aXZlLmxlbmd0aD90aGlzLmFjdGl2ZS5hdHRyKHsiYXJpYS1zZWxlY3RlZCI6InRydWUiLHRhYkluZGV4OjB9KS5uZXh0KCkuYXR0cih7ImFyaWEtZXhwYW5kZWQiOiJ0cnVlIiwiYXJpYS1oaWRkZW4iOiJmYWxzZSJ9KTp0aGlzLmhlYWRlcnMuZXEoMCkuYXR0cigidGFiSW5kZXgiLDApLHRoaXMuX29uKHRoaXMuaGVhZGVycyx7a2V5ZG93bjoiX2tleWRvd24ifSksdGhpcy5fb24odGhpcy5oZWFkZXJzLm5leHQoKSx7a2V5ZG93bjoiX3BhbmVsS2V5RG93biJ9KSx0aGlzLl9zZXR1cEV2ZW50cyhyLmV2ZW50KX0sX2dldENyZWF0ZUV2ZW50RGF0YTpmdW5jdGlvbigpe3JldHVybntoZWFkZXI6dGhpcy5hY3RpdmUsY29udGVudDp0aGlzLmFjdGl2ZS5sZW5ndGg/dGhpcy5hY3RpdmUubmV4dCgpOmUoKX19LF9jcmVhdGVJY29uczpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9ucy5pY29uczt0JiYoZSgiPHNwYW4+IikuYWRkQ2xhc3MoInVpLWFjY29yZGlvbi1oZWFkZXItaWNvbiB1aS1pY29uICIrdC5oZWFkZXIpLnByZXBlbmRUbyh0aGlzLmhlYWRlcnMpLHRoaXMuYWN0aXZlLmNoaWxkcmVuKCIudWktYWNjb3JkaW9uLWhlYWRlci1pY29uIikucmVtb3ZlQ2xhc3ModC5oZWFkZXIpLmFkZENsYXNzKHQuYWN0aXZlSGVhZGVyKSx0aGlzLmhlYWRlcnMuYWRkQ2xhc3MoInVpLWFjY29yZGlvbi1pY29ucyIpKX0sX2Rlc3Ryb3lJY29uczpmdW5jdGlvbigpe3RoaXMuaGVhZGVycy5yZW1vdmVDbGFzcygidWktYWNjb3JkaW9uLWljb25zIikuY2hpbGRyZW4oIi51aS1hY2NvcmRpb24taGVhZGVyLWljb24iKS5yZW1vdmUoKX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt2YXIgZTt0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLWFjY29yZGlvbiB1aS13aWRnZXQgdWktaGVscGVyLXJlc2V0IikucmVtb3ZlQXR0cigicm9sZSIpLHRoaXMuaGVhZGVycy5yZW1vdmVDbGFzcygidWktYWNjb3JkaW9uLWhlYWRlciB1aS1hY2NvcmRpb24taGVhZGVyLWFjdGl2ZSB1aS1oZWxwZXItcmVzZXQgdWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsIHVpLXN0YXRlLWFjdGl2ZSB1aS1zdGF0ZS1kaXNhYmxlZCB1aS1jb3JuZXItdG9wIikucmVtb3ZlQXR0cigicm9sZSIpLnJlbW92ZUF0dHIoImFyaWEtc2VsZWN0ZWQiKS5yZW1vdmVBdHRyKCJhcmlhLWNvbnRyb2xzIikucmVtb3ZlQXR0cigidGFiSW5kZXgiKS5lYWNoKGZ1bmN0aW9uKCl7L151aS1hY2NvcmRpb24vLnRlc3QodGhpcy5pZCkmJnRoaXMucmVtb3ZlQXR0cmlidXRlKCJpZCIpfSksdGhpcy5fZGVzdHJveUljb25zKCksZT10aGlzLmhlYWRlcnMubmV4dCgpLmNzcygiZGlzcGxheSIsIiIpLnJlbW92ZUF0dHIoInJvbGUiKS5yZW1vdmVBdHRyKCJhcmlhLWV4cGFuZGVkIikucmVtb3ZlQXR0cigiYXJpYS1oaWRkZW4iKS5yZW1vdmVBdHRyKCJhcmlhLWxhYmVsbGVkYnkiKS5yZW1vdmVDbGFzcygidWktaGVscGVyLXJlc2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1ib3R0b20gdWktYWNjb3JkaW9uLWNvbnRlbnQgdWktYWNjb3JkaW9uLWNvbnRlbnQtYWN0aXZlIHVpLXN0YXRlLWRpc2FibGVkIikuZWFjaChmdW5jdGlvbigpey9edWktYWNjb3JkaW9uLy50ZXN0KHRoaXMuaWQpJiZ0aGlzLnJlbW92ZUF0dHJpYnV0ZSgiaWQiKX0pLHRoaXMub3B0aW9ucy5oZWlnaHRTdHlsZSE9PSJjb250ZW50IiYmZS5jc3MoImhlaWdodCIsIiIpfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKGUsdCl7aWYoZT09PSJhY3RpdmUiKXt0aGlzLl9hY3RpdmF0ZSh0KTtyZXR1cm59ZT09PSJldmVudCImJih0aGlzLm9wdGlvbnMuZXZlbnQmJnRoaXMuX29mZih0aGlzLmhlYWRlcnMsdGhpcy5vcHRpb25zLmV2ZW50KSx0aGlzLl9zZXR1cEV2ZW50cyh0KSksdGhpcy5fc3VwZXIoZSx0KSxlPT09ImNvbGxhcHNpYmxlIiYmIXQmJnRoaXMub3B0aW9ucy5hY3RpdmU9PT0hMSYmdGhpcy5fYWN0aXZhdGUoMCksZT09PSJpY29ucyImJih0aGlzLl9kZXN0cm95SWNvbnMoKSx0JiZ0aGlzLl9jcmVhdGVJY29ucygpKSxlPT09ImRpc2FibGVkIiYmdGhpcy5oZWFkZXJzLmFkZCh0aGlzLmhlYWRlcnMubmV4dCgpKS50b2dnbGVDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiLCEhdCl9LF9rZXlkb3duOmZ1bmN0aW9uKHQpe2lmKHQuYWx0S2V5fHx0LmN0cmxLZXkpcmV0dXJuO3ZhciBuPWUudWkua2V5Q29kZSxyPXRoaXMuaGVhZGVycy5sZW5ndGgsaT10aGlzLmhlYWRlcnMuaW5kZXgodC50YXJnZXQpLHM9ITE7c3dpdGNoKHQua2V5Q29kZSl7Y2FzZSBuLlJJR0hUOmNhc2Ugbi5ET1dOOnM9dGhpcy5oZWFkZXJzWyhpKzEpJXJdO2JyZWFrO2Nhc2Ugbi5MRUZUOmNhc2Ugbi5VUDpzPXRoaXMuaGVhZGVyc1soaS0xK3IpJXJdO2JyZWFrO2Nhc2Ugbi5TUEFDRTpjYXNlIG4uRU5URVI6dGhpcy5fZXZlbnRIYW5kbGVyKHQpO2JyZWFrO2Nhc2Ugbi5IT01FOnM9dGhpcy5oZWFkZXJzWzBdO2JyZWFrO2Nhc2Ugbi5FTkQ6cz10aGlzLmhlYWRlcnNbci0xXX1zJiYoZSh0LnRhcmdldCkuYXR0cigidGFiSW5kZXgiLC0xKSxlKHMpLmF0dHIoInRhYkluZGV4IiwwKSxzLmZvY3VzKCksdC5wcmV2ZW50RGVmYXVsdCgpKX0sX3BhbmVsS2V5RG93bjpmdW5jdGlvbih0KXt0LmtleUNvZGU9PT1lLnVpLmtleUNvZGUuVVAmJnQuY3RybEtleSYmZSh0LmN1cnJlbnRUYXJnZXQpLnByZXYoKS5mb2N1cygpfSxyZWZyZXNoOmZ1bmN0aW9uKCl7dmFyIHQsbixyPXRoaXMub3B0aW9ucy5oZWlnaHRTdHlsZSxpPXRoaXMuZWxlbWVudC5wYXJlbnQoKTtyPT09ImZpbGwiPyhlLnN1cHBvcnQubWluSGVpZ2h0fHwobj1pLmNzcygib3ZlcmZsb3ciKSxpLmNzcygib3ZlcmZsb3ciLCJoaWRkZW4iKSksdD1pLmhlaWdodCgpLHRoaXMuZWxlbWVudC5zaWJsaW5ncygiOnZpc2libGUiKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIG49ZSh0aGlzKSxyPW4uY3NzKCJwb3NpdGlvbiIpO2lmKHI9PT0iYWJzb2x1dGUifHxyPT09ImZpeGVkIilyZXR1cm47dC09bi5vdXRlckhlaWdodCghMCl9KSxuJiZpLmNzcygib3ZlcmZsb3ciLG4pLHRoaXMuaGVhZGVycy5lYWNoKGZ1bmN0aW9uKCl7dC09ZSh0aGlzKS5vdXRlckhlaWdodCghMCl9KSx0aGlzLmhlYWRlcnMubmV4dCgpLmVhY2goZnVuY3Rpb24oKXtlKHRoaXMpLmhlaWdodChNYXRoLm1heCgwLHQtZSh0aGlzKS5pbm5lckhlaWdodCgpK2UodGhpcykuaGVpZ2h0KCkpKX0pLmNzcygib3ZlcmZsb3ciLCJhdXRvIikpOnI9PT0iYXV0byImJih0PTAsdGhpcy5oZWFkZXJzLm5leHQoKS5lYWNoKGZ1bmN0aW9uKCl7dD1NYXRoLm1heCh0LGUodGhpcykuY3NzKCJoZWlnaHQiLCIiKS5oZWlnaHQoKSl9KS5oZWlnaHQodCkpfSxfYWN0aXZhdGU6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5fZmluZEFjdGl2ZSh0KVswXTtpZihuPT09dGhpcy5hY3RpdmVbMF0pcmV0dXJuO249bnx8dGhpcy5hY3RpdmVbMF0sdGhpcy5fZXZlbnRIYW5kbGVyKHt0YXJnZXQ6bixjdXJyZW50VGFyZ2V0Om4scHJldmVudERlZmF1bHQ6ZS5ub29wfSl9LF9maW5kQWN0aXZlOmZ1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdD09Im51bWJlciI/dGhpcy5oZWFkZXJzLmVxKHQpOmUoKX0sX3NldHVwRXZlbnRzOmZ1bmN0aW9uKHQpe3ZhciBuPXt9O2lmKCF0KXJldHVybjtlLmVhY2godC5zcGxpdCgiICIpLGZ1bmN0aW9uKGUsdCl7blt0XT0iX2V2ZW50SGFuZGxlciJ9KSx0aGlzLl9vbih0aGlzLmhlYWRlcnMsbil9LF9ldmVudEhhbmRsZXI6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5vcHRpb25zLHI9dGhpcy5hY3RpdmUsaT1lKHQuY3VycmVudFRhcmdldCkscz1pWzBdPT09clswXSxvPXMmJm4uY29sbGFwc2libGUsdT1vP2UoKTppLm5leHQoKSxhPXIubmV4dCgpLGY9e29sZEhlYWRlcjpyLG9sZFBhbmVsOmEsbmV3SGVhZGVyOm8/ZSgpOmksbmV3UGFuZWw6dX07dC5wcmV2ZW50RGVmYXVsdCgpO2lmKHMmJiFuLmNvbGxhcHNpYmxlfHx0aGlzLl90cmlnZ2VyKCJiZWZvcmVBY3RpdmF0ZSIsdCxmKT09PSExKXJldHVybjtuLmFjdGl2ZT1vPyExOnRoaXMuaGVhZGVycy5pbmRleChpKSx0aGlzLmFjdGl2ZT1zP2UoKTppLHRoaXMuX3RvZ2dsZShmKSxyLnJlbW92ZUNsYXNzKCJ1aS1hY2NvcmRpb24taGVhZGVyLWFjdGl2ZSB1aS1zdGF0ZS1hY3RpdmUiKSxuLmljb25zJiZyLmNoaWxkcmVuKCIudWktYWNjb3JkaW9uLWhlYWRlci1pY29uIikucmVtb3ZlQ2xhc3Mobi5pY29ucy5hY3RpdmVIZWFkZXIpLmFkZENsYXNzKG4uaWNvbnMuaGVhZGVyKSxzfHwoaS5yZW1vdmVDbGFzcygidWktY29ybmVyLWFsbCIpLmFkZENsYXNzKCJ1aS1hY2NvcmRpb24taGVhZGVyLWFjdGl2ZSB1aS1zdGF0ZS1hY3RpdmUgdWktY29ybmVyLXRvcCIpLG4uaWNvbnMmJmkuY2hpbGRyZW4oIi51aS1hY2NvcmRpb24taGVhZGVyLWljb24iKS5yZW1vdmVDbGFzcyhuLmljb25zLmhlYWRlcikuYWRkQ2xhc3Mobi5pY29ucy5hY3RpdmVIZWFkZXIpLGkubmV4dCgpLmFkZENsYXNzKCJ1aS1hY2NvcmRpb24tY29udGVudC1hY3RpdmUiKSl9LF90b2dnbGU6ZnVuY3Rpb24odCl7dmFyIG49dC5uZXdQYW5lbCxyPXRoaXMucHJldlNob3cubGVuZ3RoP3RoaXMucHJldlNob3c6dC5vbGRQYW5lbDt0aGlzLnByZXZTaG93LmFkZCh0aGlzLnByZXZIaWRlKS5zdG9wKCEwLCEwKSx0aGlzLnByZXZTaG93PW4sdGhpcy5wcmV2SGlkZT1yLHRoaXMub3B0aW9ucy5hbmltYXRlP3RoaXMuX2FuaW1hdGUobixyLHQpOihyLmhpZGUoKSxuLnNob3coKSx0aGlzLl90b2dnbGVDb21wbGV0ZSh0KSksci5hdHRyKHsiYXJpYS1leHBhbmRlZCI6ImZhbHNlIiwiYXJpYS1oaWRkZW4iOiJ0cnVlIn0pLHIucHJldigpLmF0dHIoImFyaWEtc2VsZWN0ZWQiLCJmYWxzZSIpLG4ubGVuZ3RoJiZyLmxlbmd0aD9yLnByZXYoKS5hdHRyKCJ0YWJJbmRleCIsLTEpOm4ubGVuZ3RoJiZ0aGlzLmhlYWRlcnMuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIGUodGhpcykuYXR0cigidGFiSW5kZXgiKT09PTB9KS5hdHRyKCJ0YWJJbmRleCIsLTEpLG4uYXR0cih7ImFyaWEtZXhwYW5kZWQiOiJ0cnVlIiwiYXJpYS1oaWRkZW4iOiJmYWxzZSJ9KS5wcmV2KCkuYXR0cih7ImFyaWEtc2VsZWN0ZWQiOiJ0cnVlIix0YWJJbmRleDowfSl9LF9hbmltYXRlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcyxvLHUsYT10aGlzLGY9MCxsPWUubGVuZ3RoJiYoIXQubGVuZ3RofHxlLmluZGV4KCk8dC5pbmRleCgpKSxjPXRoaXMub3B0aW9ucy5hbmltYXRlfHx7fSxoPWwmJmMuZG93bnx8YyxwPWZ1bmN0aW9uKCl7YS5fdG9nZ2xlQ29tcGxldGUobil9O3R5cGVvZiBoPT0ibnVtYmVyIiYmKHU9aCksdHlwZW9mIGg9PSJzdHJpbmciJiYobz1oKSxvPW98fGguZWFzaW5nfHxjLmVhc2luZyx1PXV8fGguZHVyYXRpb258fGMuZHVyYXRpb247aWYoIXQubGVuZ3RoKXJldHVybiBlLmFuaW1hdGUoaSx1LG8scCk7aWYoIWUubGVuZ3RoKXJldHVybiB0LmFuaW1hdGUocix1LG8scCk7cz1lLnNob3coKS5vdXRlckhlaWdodCgpLHQuYW5pbWF0ZShyLHtkdXJhdGlvbjp1LGVhc2luZzpvLHN0ZXA6ZnVuY3Rpb24oZSx0KXt0Lm5vdz1NYXRoLnJvdW5kKGUpfX0pLGUuaGlkZSgpLmFuaW1hdGUoaSx7ZHVyYXRpb246dSxlYXNpbmc6byxjb21wbGV0ZTpwLHN0ZXA6ZnVuY3Rpb24oZSxuKXtuLm5vdz1NYXRoLnJvdW5kKGUpLG4ucHJvcCE9PSJoZWlnaHQiP2YrPW4ubm93OmEub3B0aW9ucy5oZWlnaHRTdHlsZSE9PSJjb250ZW50IiYmKG4ubm93PU1hdGgucm91bmQocy10Lm91dGVySGVpZ2h0KCktZiksZj0wKX19KX0sX3RvZ2dsZUNvbXBsZXRlOmZ1bmN0aW9uKGUpe3ZhciB0PWUub2xkUGFuZWw7dC5yZW1vdmVDbGFzcygidWktYWNjb3JkaW9uLWNvbnRlbnQtYWN0aXZlIikucHJldigpLnJlbW92ZUNsYXNzKCJ1aS1jb3JuZXItdG9wIikuYWRkQ2xhc3MoInVpLWNvcm5lci1hbGwiKSx0Lmxlbmd0aCYmKHQucGFyZW50KClbMF0uY2xhc3NOYW1lPXQucGFyZW50KClbMF0uY2xhc3NOYW1lKSx0aGlzLl90cmlnZ2VyKCJhY3RpdmF0ZSIsbnVsbCxlKX19KSxlLnVpQmFja0NvbXBhdCE9PSExJiYoZnVuY3Rpb24oZSx0KXtlLmV4dGVuZCh0Lm9wdGlvbnMse25hdmlnYXRpb246ITEsbmF2aWdhdGlvbkZpbHRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmhyZWYudG9Mb3dlckNhc2UoKT09PWxvY2F0aW9uLmhyZWYudG9Mb3dlckNhc2UoKX19KTt2YXIgbj10Ll9jcmVhdGU7dC5fY3JlYXRlPWZ1bmN0aW9uKCl7aWYodGhpcy5vcHRpb25zLm5hdmlnYXRpb24pe3ZhciB0PXRoaXMscj10aGlzLmVsZW1lbnQuZmluZCh0aGlzLm9wdGlvbnMuaGVhZGVyKSxpPXIubmV4dCgpLHM9ci5hZGQoaSkuZmluZCgiYSIpLmZpbHRlcih0aGlzLm9wdGlvbnMubmF2aWdhdGlvbkZpbHRlcilbMF07cyYmci5hZGQoaSkuZWFjaChmdW5jdGlvbihuKXtpZihlLmNvbnRhaW5zKHRoaXMscykpcmV0dXJuIHQub3B0aW9ucy5hY3RpdmU9TWF0aC5mbG9vcihuLzIpLCExfSl9bi5jYWxsKHRoaXMpfX0oalF1ZXJ5LGpRdWVyeS51aS5hY2NvcmRpb24ucHJvdG90eXBlKSxmdW5jdGlvbihlLHQpe2UuZXh0ZW5kKHQub3B0aW9ucyx7aGVpZ2h0U3R5bGU6bnVsbCxhdXRvSGVpZ2h0OiEwLGNsZWFyU3R5bGU6ITEsZmlsbFNwYWNlOiExfSk7dmFyIG49dC5fY3JlYXRlLHI9dC5fc2V0T3B0aW9uO2UuZXh0ZW5kKHQse19jcmVhdGU6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMuaGVpZ2h0U3R5bGU9dGhpcy5vcHRpb25zLmhlaWdodFN0eWxlfHx0aGlzLl9tZXJnZUhlaWdodFN0eWxlKCksbi5jYWxsKHRoaXMpfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKGUpe2lmKGU9PT0iYXV0b0hlaWdodCJ8fGU9PT0iY2xlYXJTdHlsZSJ8fGU9PT0iZmlsbFNwYWNlIil0aGlzLm9wdGlvbnMuaGVpZ2h0U3R5bGU9dGhpcy5fbWVyZ2VIZWlnaHRTdHlsZSgpO3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfbWVyZ2VIZWlnaHRTdHlsZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3B0aW9ucztpZihlLmZpbGxTcGFjZSlyZXR1cm4iZmlsbCI7aWYoZS5jbGVhclN0eWxlKXJldHVybiJjb250ZW50IjtpZihlLmF1dG9IZWlnaHQpcmV0dXJuImF1dG8ifX0pfShqUXVlcnksalF1ZXJ5LnVpLmFjY29yZGlvbi5wcm90b3R5cGUpLGZ1bmN0aW9uKGUsdCl7ZS5leHRlbmQodC5vcHRpb25zLmljb25zLHthY3RpdmVIZWFkZXI6bnVsbCxoZWFkZXJTZWxlY3RlZDoidWktaWNvbi10cmlhbmdsZS0xLXMifSk7dmFyIG49dC5fY3JlYXRlSWNvbnM7dC5fY3JlYXRlSWNvbnM9ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMuaWNvbnMmJih0aGlzLm9wdGlvbnMuaWNvbnMuYWN0aXZlSGVhZGVyPXRoaXMub3B0aW9ucy5pY29ucy5hY3RpdmVIZWFkZXJ8fHRoaXMub3B0aW9ucy5pY29ucy5oZWFkZXJTZWxlY3RlZCksbi5jYWxsKHRoaXMpfX0oalF1ZXJ5LGpRdWVyeS51aS5hY2NvcmRpb24ucHJvdG90eXBlKSxmdW5jdGlvbihlLHQpe3QuYWN0aXZhdGU9dC5fYWN0aXZhdGU7dmFyIG49dC5fZmluZEFjdGl2ZTt0Ll9maW5kQWN0aXZlPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09LTEmJihlPSExKSxlJiZ0eXBlb2YgZSE9Im51bWJlciImJihlPXRoaXMuaGVhZGVycy5pbmRleCh0aGlzLmhlYWRlcnMuZmlsdGVyKGUpKSxlPT09LTEmJihlPSExKSksbi5jYWxsKHRoaXMsZSl9fShqUXVlcnksalF1ZXJ5LnVpLmFjY29yZGlvbi5wcm90b3R5cGUpLGpRdWVyeS51aS5hY2NvcmRpb24ucHJvdG90eXBlLnJlc2l6ZT1qUXVlcnkudWkuYWNjb3JkaW9uLnByb3RvdHlwZS5yZWZyZXNoLGZ1bmN0aW9uKGUsdCl7ZS5leHRlbmQodC5vcHRpb25zLHtjaGFuZ2U6bnVsbCxjaGFuZ2VzdGFydDpudWxsfSk7dmFyIG49dC5fdHJpZ2dlcjt0Ll90cmlnZ2VyPWZ1bmN0aW9uKGUsdCxyKXt2YXIgaT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gaT8oZT09PSJiZWZvcmVBY3RpdmF0ZSI/aT1uLmNhbGwodGhpcywiY2hhbmdlc3RhcnQiLHQse29sZEhlYWRlcjpyLm9sZEhlYWRlcixvbGRDb250ZW50OnIub2xkUGFuZWwsbmV3SGVhZGVyOnIubmV3SGVhZGVyLG5ld0NvbnRlbnQ6ci5uZXdQYW5lbH0pOmU9PT0iYWN0aXZhdGUiJiYoaT1uLmNhbGwodGhpcywiY2hhbmdlIix0LHtvbGRIZWFkZXI6ci5vbGRIZWFkZXIsb2xkQ29udGVudDpyLm9sZFBhbmVsLG5ld0hlYWRlcjpyLm5ld0hlYWRlcixuZXdDb250ZW50OnIubmV3UGFuZWx9KSksaSk6ITF9fShqUXVlcnksalF1ZXJ5LnVpLmFjY29yZGlvbi5wcm90b3R5cGUpLGZ1bmN0aW9uKGUsdCl7ZS5leHRlbmQodC5vcHRpb25zLHthbmltYXRlOm51bGwsYW5pbWF0ZWQ6InNsaWRlIn0pO3ZhciBuPXQuX2NyZWF0ZTt0Ll9jcmVhdGU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9wdGlvbnM7ZS5hbmltYXRlPT09bnVsbCYmKGUuYW5pbWF0ZWQ/ZS5hbmltYXRlZD09PSJzbGlkZSI/ZS5hbmltYXRlPTMwMDplLmFuaW1hdGVkPT09ImJvdW5jZXNsaWRlIj9lLmFuaW1hdGU9e2R1cmF0aW9uOjIwMCxkb3duOntlYXNpbmc6ImVhc2VPdXRCb3VuY2UiLGR1cmF0aW9uOjFlM319OmUuYW5pbWF0ZT1lLmFuaW1hdGVkOmUuYW5pbWF0ZT0hMSksbi5jYWxsKHRoaXMpfX0oalF1ZXJ5LGpRdWVyeS51aS5hY2NvcmRpb24ucHJvdG90eXBlKSl9KShqUXVlcnkpOyhmdW5jdGlvbihlLHQpe3ZhciBuPTA7ZS53aWRnZXQoInVpLmF1dG9jb21wbGV0ZSIse3ZlcnNpb246IjEuOS4yIixkZWZhdWx0RWxlbWVudDoiPGlucHV0PiIsb3B0aW9uczp7YXBwZW5kVG86ImJvZHkiLGF1dG9Gb2N1czohMSxkZWxheTozMDAsbWluTGVuZ3RoOjEscG9zaXRpb246e215OiJsZWZ0IHRvcCIsYXQ6ImxlZnQgYm90dG9tIixjb2xsaXNpb246Im5vbmUifSxzb3VyY2U6bnVsbCxjaGFuZ2U6bnVsbCxjbG9zZTpudWxsLGZvY3VzOm51bGwsb3BlbjpudWxsLHJlc3BvbnNlOm51bGwsc2VhcmNoOm51bGwsc2VsZWN0Om51bGx9LHBlbmRpbmc6MCxfY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIHQsbixyO3RoaXMuaXNNdWx0aUxpbmU9dGhpcy5faXNNdWx0aUxpbmUoKSx0aGlzLnZhbHVlTWV0aG9kPXRoaXMuZWxlbWVudFt0aGlzLmVsZW1lbnQuaXMoImlucHV0LHRleHRhcmVhIik/InZhbCI6InRleHQiXSx0aGlzLmlzTmV3TWVudT0hMCx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWF1dG9jb21wbGV0ZS1pbnB1dCIpLmF0dHIoImF1dG9jb21wbGV0ZSIsIm9mZiIpLHRoaXMuX29uKHRoaXMuZWxlbWVudCx7a2V5ZG93bjpmdW5jdGlvbihpKXtpZih0aGlzLmVsZW1lbnQucHJvcCgicmVhZE9ubHkiKSl7dD0hMCxyPSEwLG49ITA7cmV0dXJufXQ9ITEscj0hMSxuPSExO3ZhciBzPWUudWkua2V5Q29kZTtzd2l0Y2goaS5rZXlDb2RlKXtjYXNlIHMuUEFHRV9VUDp0PSEwLHRoaXMuX21vdmUoInByZXZpb3VzUGFnZSIsaSk7YnJlYWs7Y2FzZSBzLlBBR0VfRE9XTjp0PSEwLHRoaXMuX21vdmUoIm5leHRQYWdlIixpKTticmVhaztjYXNlIHMuVVA6dD0hMCx0aGlzLl9rZXlFdmVudCgicHJldmlvdXMiLGkpO2JyZWFrO2Nhc2Ugcy5ET1dOOnQ9ITAsdGhpcy5fa2V5RXZlbnQoIm5leHQiLGkpO2JyZWFrO2Nhc2Ugcy5FTlRFUjpjYXNlIHMuTlVNUEFEX0VOVEVSOnRoaXMubWVudS5hY3RpdmUmJih0PSEwLGkucHJldmVudERlZmF1bHQoKSx0aGlzLm1lbnUuc2VsZWN0KGkpKTticmVhaztjYXNlIHMuVEFCOnRoaXMubWVudS5hY3RpdmUmJnRoaXMubWVudS5zZWxlY3QoaSk7YnJlYWs7Y2FzZSBzLkVTQ0FQRTp0aGlzLm1lbnUuZWxlbWVudC5pcygiOnZpc2libGUiKSYmKHRoaXMuX3ZhbHVlKHRoaXMudGVybSksdGhpcy5jbG9zZShpKSxpLnByZXZlbnREZWZhdWx0KCkpO2JyZWFrO2RlZmF1bHQ6bj0hMCx0aGlzLl9zZWFyY2hUaW1lb3V0KGkpfX0sa2V5cHJlc3M6ZnVuY3Rpb24ocil7aWYodCl7dD0hMSxyLnByZXZlbnREZWZhdWx0KCk7cmV0dXJufWlmKG4pcmV0dXJuO3ZhciBpPWUudWkua2V5Q29kZTtzd2l0Y2goci5rZXlDb2RlKXtjYXNlIGkuUEFHRV9VUDp0aGlzLl9tb3ZlKCJwcmV2aW91c1BhZ2UiLHIpO2JyZWFrO2Nhc2UgaS5QQUdFX0RPV046dGhpcy5fbW92ZSgibmV4dFBhZ2UiLHIpO2JyZWFrO2Nhc2UgaS5VUDp0aGlzLl9rZXlFdmVudCgicHJldmlvdXMiLHIpO2JyZWFrO2Nhc2UgaS5ET1dOOnRoaXMuX2tleUV2ZW50KCJuZXh0IixyKX19LGlucHV0OmZ1bmN0aW9uKGUpe2lmKHIpe3I9ITEsZS5wcmV2ZW50RGVmYXVsdCgpO3JldHVybn10aGlzLl9zZWFyY2hUaW1lb3V0KGUpfSxmb2N1czpmdW5jdGlvbigpe3RoaXMuc2VsZWN0ZWRJdGVtPW51bGwsdGhpcy5wcmV2aW91cz10aGlzLl92YWx1ZSgpfSxibHVyOmZ1bmN0aW9uKGUpe2lmKHRoaXMuY2FuY2VsQmx1cil7ZGVsZXRlIHRoaXMuY2FuY2VsQmx1cjtyZXR1cm59Y2xlYXJUaW1lb3V0KHRoaXMuc2VhcmNoaW5nKSx0aGlzLmNsb3NlKGUpLHRoaXMuX2NoYW5nZShlKX19KSx0aGlzLl9pbml0U291cmNlKCksdGhpcy5tZW51PWUoIjx1bD4iKS5hZGRDbGFzcygidWktYXV0b2NvbXBsZXRlIikuYXBwZW5kVG8odGhpcy5kb2N1bWVudC5maW5kKHRoaXMub3B0aW9ucy5hcHBlbmRUb3x8ImJvZHkiKVswXSkubWVudSh7aW5wdXQ6ZSgpLHJvbGU6bnVsbH0pLnpJbmRleCh0aGlzLmVsZW1lbnQuekluZGV4KCkrMSkuaGlkZSgpLmRhdGEoIm1lbnUiKSx0aGlzLl9vbih0aGlzLm1lbnUuZWxlbWVudCx7bW91c2Vkb3duOmZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKSx0aGlzLmNhbmNlbEJsdXI9ITAsdGhpcy5fZGVsYXkoZnVuY3Rpb24oKXtkZWxldGUgdGhpcy5jYW5jZWxCbHVyfSk7dmFyIG49dGhpcy5tZW51LmVsZW1lbnRbMF07ZSh0LnRhcmdldCkuY2xvc2VzdCgiLnVpLW1lbnUtaXRlbSIpLmxlbmd0aHx8dGhpcy5fZGVsYXkoZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuZG9jdW1lbnQub25lKCJtb3VzZWRvd24iLGZ1bmN0aW9uKHIpe3IudGFyZ2V0IT09dC5lbGVtZW50WzBdJiZyLnRhcmdldCE9PW4mJiFlLmNvbnRhaW5zKG4sci50YXJnZXQpJiZ0LmNsb3NlKCl9KX0pfSxtZW51Zm9jdXM6ZnVuY3Rpb24odCxuKXtpZih0aGlzLmlzTmV3TWVudSl7dGhpcy5pc05ld01lbnU9ITE7aWYodC5vcmlnaW5hbEV2ZW50JiYvXm1vdXNlLy50ZXN0KHQub3JpZ2luYWxFdmVudC50eXBlKSl7dGhpcy5tZW51LmJsdXIoKSx0aGlzLmRvY3VtZW50Lm9uZSgibW91c2Vtb3ZlIixmdW5jdGlvbigpe2UodC50YXJnZXQpLnRyaWdnZXIodC5vcmlnaW5hbEV2ZW50KX0pO3JldHVybn19dmFyIHI9bi5pdGVtLmRhdGEoInVpLWF1dG9jb21wbGV0ZS1pdGVtIil8fG4uaXRlbS5kYXRhKCJpdGVtLmF1dG9jb21wbGV0ZSIpOyExIT09dGhpcy5fdHJpZ2dlcigiZm9jdXMiLHQse2l0ZW06cn0pP3Qub3JpZ2luYWxFdmVudCYmL15rZXkvLnRlc3QodC5vcmlnaW5hbEV2ZW50LnR5cGUpJiZ0aGlzLl92YWx1ZShyLnZhbHVlKTp0aGlzLmxpdmVSZWdpb24udGV4dChyLnZhbHVlKX0sbWVudXNlbGVjdDpmdW5jdGlvbihlLHQpe3ZhciBuPXQuaXRlbS5kYXRhKCJ1aS1hdXRvY29tcGxldGUtaXRlbSIpfHx0Lml0ZW0uZGF0YSgiaXRlbS5hdXRvY29tcGxldGUiKSxyPXRoaXMucHJldmlvdXM7dGhpcy5lbGVtZW50WzBdIT09dGhpcy5kb2N1bWVudFswXS5hY3RpdmVFbGVtZW50JiYodGhpcy5lbGVtZW50LmZvY3VzKCksdGhpcy5wcmV2aW91cz1yLHRoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7dGhpcy5wcmV2aW91cz1yLHRoaXMuc2VsZWN0ZWRJdGVtPW59KSksITEhPT10aGlzLl90cmlnZ2VyKCJzZWxlY3QiLGUse2l0ZW06bn0pJiZ0aGlzLl92YWx1ZShuLnZhbHVlKSx0aGlzLnRlcm09dGhpcy5fdmFsdWUoKSx0aGlzLmNsb3NlKGUpLHRoaXMuc2VsZWN0ZWRJdGVtPW59fSksdGhpcy5saXZlUmVnaW9uPWUoIjxzcGFuPiIse3JvbGU6InN0YXR1cyIsImFyaWEtbGl2ZSI6InBvbGl0ZSJ9KS5hZGRDbGFzcygidWktaGVscGVyLWhpZGRlbi1hY2Nlc3NpYmxlIikuaW5zZXJ0QWZ0ZXIodGhpcy5lbGVtZW50KSxlLmZuLmJnaWZyYW1lJiZ0aGlzLm1lbnUuZWxlbWVudC5iZ2lmcmFtZSgpLHRoaXMuX29uKHRoaXMud2luZG93LHtiZWZvcmV1bmxvYWQ6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQucmVtb3ZlQXR0cigiYXV0b2NvbXBsZXRlIil9fSl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHRoaXMuc2VhcmNoaW5nKSx0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLWF1dG9jb21wbGV0ZS1pbnB1dCIpLnJlbW92ZUF0dHIoImF1dG9jb21wbGV0ZSIpLHRoaXMubWVudS5lbGVtZW50LnJlbW92ZSgpLHRoaXMubGl2ZVJlZ2lvbi5yZW1vdmUoKX0sX3NldE9wdGlvbjpmdW5jdGlvbihlLHQpe3RoaXMuX3N1cGVyKGUsdCksZT09PSJzb3VyY2UiJiZ0aGlzLl9pbml0U291cmNlKCksZT09PSJhcHBlbmRUbyImJnRoaXMubWVudS5lbGVtZW50LmFwcGVuZFRvKHRoaXMuZG9jdW1lbnQuZmluZCh0fHwiYm9keSIpWzBdKSxlPT09ImRpc2FibGVkIiYmdCYmdGhpcy54aHImJnRoaXMueGhyLmFib3J0KCl9LF9pc011bHRpTGluZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnQuaXMoInRleHRhcmVhIik/ITA6dGhpcy5lbGVtZW50LmlzKCJpbnB1dCIpPyExOnRoaXMuZWxlbWVudC5wcm9wKCJpc0NvbnRlbnRFZGl0YWJsZSIpfSxfaW5pdFNvdXJjZTpmdW5jdGlvbigpe3ZhciB0LG4scj10aGlzO2UuaXNBcnJheSh0aGlzLm9wdGlvbnMuc291cmNlKT8odD10aGlzLm9wdGlvbnMuc291cmNlLHRoaXMuc291cmNlPWZ1bmN0aW9uKG4scil7cihlLnVpLmF1dG9jb21wbGV0ZS5maWx0ZXIodCxuLnRlcm0pKX0pOnR5cGVvZiB0aGlzLm9wdGlvbnMuc291cmNlPT0ic3RyaW5nIj8obj10aGlzLm9wdGlvbnMuc291cmNlLHRoaXMuc291cmNlPWZ1bmN0aW9uKHQsaSl7ci54aHImJnIueGhyLmFib3J0KCksci54aHI9ZS5hamF4KHt1cmw6bixkYXRhOnQsZGF0YVR5cGU6Impzb24iLHN1Y2Nlc3M6ZnVuY3Rpb24oZSl7aShlKX0sZXJyb3I6ZnVuY3Rpb24oKXtpKFtdKX19KX0pOnRoaXMuc291cmNlPXRoaXMub3B0aW9ucy5zb3VyY2V9LF9zZWFyY2hUaW1lb3V0OmZ1bmN0aW9uKGUpe2NsZWFyVGltZW91dCh0aGlzLnNlYXJjaGluZyksdGhpcy5zZWFyY2hpbmc9dGhpcy5fZGVsYXkoZnVuY3Rpb24oKXt0aGlzLnRlcm0hPT10aGlzLl92YWx1ZSgpJiYodGhpcy5zZWxlY3RlZEl0ZW09bnVsbCx0aGlzLnNlYXJjaChudWxsLGUpKX0sdGhpcy5vcHRpb25zLmRlbGF5KX0sc2VhcmNoOmZ1bmN0aW9uKGUsdCl7ZT1lIT1udWxsP2U6dGhpcy5fdmFsdWUoKSx0aGlzLnRlcm09dGhpcy5fdmFsdWUoKTtpZihlLmxlbmd0aDx0aGlzLm9wdGlvbnMubWluTGVuZ3RoKXJldHVybiB0aGlzLmNsb3NlKHQpO2lmKHRoaXMuX3RyaWdnZXIoInNlYXJjaCIsdCk9PT0hMSlyZXR1cm47cmV0dXJuIHRoaXMuX3NlYXJjaChlKX0sX3NlYXJjaDpmdW5jdGlvbihlKXt0aGlzLnBlbmRpbmcrKyx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWF1dG9jb21wbGV0ZS1sb2FkaW5nIiksdGhpcy5jYW5jZWxTZWFyY2g9ITEsdGhpcy5zb3VyY2Uoe3Rlcm06ZX0sdGhpcy5fcmVzcG9uc2UoKSl9LF9yZXNwb25zZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD0rK247cmV0dXJuIGZ1bmN0aW9uKHIpe3Q9PT1uJiZlLl9fcmVzcG9uc2UociksZS5wZW5kaW5nLS0sZS5wZW5kaW5nfHxlLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLWF1dG9jb21wbGV0ZS1sb2FkaW5nIil9fSxfX3Jlc3BvbnNlOmZ1bmN0aW9uKGUpe2UmJihlPXRoaXMuX25vcm1hbGl6ZShlKSksdGhpcy5fdHJpZ2dlcigicmVzcG9uc2UiLG51bGwse2NvbnRlbnQ6ZX0pLCF0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJmUmJmUubGVuZ3RoJiYhdGhpcy5jYW5jZWxTZWFyY2g/KHRoaXMuX3N1Z2dlc3QoZSksdGhpcy5fdHJpZ2dlcigib3BlbiIpKTp0aGlzLl9jbG9zZSgpfSxjbG9zZTpmdW5jdGlvbihlKXt0aGlzLmNhbmNlbFNlYXJjaD0hMCx0aGlzLl9jbG9zZShlKX0sX2Nsb3NlOmZ1bmN0aW9uKGUpe3RoaXMubWVudS5lbGVtZW50LmlzKCI6dmlzaWJsZSIpJiYodGhpcy5tZW51LmVsZW1lbnQuaGlkZSgpLHRoaXMubWVudS5ibHVyKCksdGhpcy5pc05ld01lbnU9ITAsdGhpcy5fdHJpZ2dlcigiY2xvc2UiLGUpKX0sX2NoYW5nZTpmdW5jdGlvbihlKXt0aGlzLnByZXZpb3VzIT09dGhpcy5fdmFsdWUoKSYmdGhpcy5fdHJpZ2dlcigiY2hhbmdlIixlLHtpdGVtOnRoaXMuc2VsZWN0ZWRJdGVtfSl9LF9ub3JtYWxpemU6ZnVuY3Rpb24odCl7cmV0dXJuIHQubGVuZ3RoJiZ0WzBdLmxhYmVsJiZ0WzBdLnZhbHVlP3Q6ZS5tYXAodCxmdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHQ9PSJzdHJpbmciP3tsYWJlbDp0LHZhbHVlOnR9OmUuZXh0ZW5kKHtsYWJlbDp0LmxhYmVsfHx0LnZhbHVlLHZhbHVlOnQudmFsdWV8fHQubGFiZWx9LHQpfSl9LF9zdWdnZXN0OmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMubWVudS5lbGVtZW50LmVtcHR5KCkuekluZGV4KHRoaXMuZWxlbWVudC56SW5kZXgoKSsxKTt0aGlzLl9yZW5kZXJNZW51KG4sdCksdGhpcy5tZW51LnJlZnJlc2goKSxuLnNob3coKSx0aGlzLl9yZXNpemVNZW51KCksbi5wb3NpdGlvbihlLmV4dGVuZCh7b2Y6dGhpcy5lbGVtZW50fSx0aGlzLm9wdGlvbnMucG9zaXRpb24pKSx0aGlzLm9wdGlvbnMuYXV0b0ZvY3VzJiZ0aGlzLm1lbnUubmV4dCgpfSxfcmVzaXplTWVudTpmdW5jdGlvbigpe3ZhciBlPXRoaXMubWVudS5lbGVtZW50O2Uub3V0ZXJXaWR0aChNYXRoLm1heChlLndpZHRoKCIiKS5vdXRlcldpZHRoKCkrMSx0aGlzLmVsZW1lbnQub3V0ZXJXaWR0aCgpKSl9LF9yZW5kZXJNZW51OmZ1bmN0aW9uKHQsbil7dmFyIHI9dGhpcztlLmVhY2gobixmdW5jdGlvbihlLG4pe3IuX3JlbmRlckl0ZW1EYXRhKHQsbil9KX0sX3JlbmRlckl0ZW1EYXRhOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuX3JlbmRlckl0ZW0oZSx0KS5kYXRhKCJ1aS1hdXRvY29tcGxldGUtaXRlbSIsdCl9LF9yZW5kZXJJdGVtOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGUoIjxsaT4iKS5hcHBlbmQoZSgiPGE+IikudGV4dChuLmxhYmVsKSkuYXBwZW5kVG8odCl9LF9tb3ZlOmZ1bmN0aW9uKGUsdCl7aWYoIXRoaXMubWVudS5lbGVtZW50LmlzKCI6dmlzaWJsZSIpKXt0aGlzLnNlYXJjaChudWxsLHQpO3JldHVybn1pZih0aGlzLm1lbnUuaXNGaXJzdEl0ZW0oKSYmL15wcmV2aW91cy8udGVzdChlKXx8dGhpcy5tZW51LmlzTGFzdEl0ZW0oKSYmL15uZXh0Ly50ZXN0KGUpKXt0aGlzLl92YWx1ZSh0aGlzLnRlcm0pLHRoaXMubWVudS5ibHVyKCk7cmV0dXJufXRoaXMubWVudVtlXSh0KX0sd2lkZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWVudS5lbGVtZW50fSxfdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZU1ldGhvZC5hcHBseSh0aGlzLmVsZW1lbnQsYXJndW1lbnRzKX0sX2tleUV2ZW50OmZ1bmN0aW9uKGUsdCl7aWYoIXRoaXMuaXNNdWx0aUxpbmV8fHRoaXMubWVudS5lbGVtZW50LmlzKCI6dmlzaWJsZSIpKXRoaXMuX21vdmUoZSx0KSx0LnByZXZlbnREZWZhdWx0KCl9fSksZS5leHRlbmQoZS51aS5hdXRvY29tcGxldGUse2VzY2FwZVJlZ2V4OmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoL1tcLVxbXF17fSgpKis/LixcXFxeJHwjXHNdL2csIlxcJCYiKX0sZmlsdGVyOmZ1bmN0aW9uKHQsbil7dmFyIHI9bmV3IFJlZ0V4cChlLnVpLmF1dG9jb21wbGV0ZS5lc2NhcGVSZWdleChuKSwiaSIpO3JldHVybiBlLmdyZXAodCxmdW5jdGlvbihlKXtyZXR1cm4gci50ZXN0KGUubGFiZWx8fGUudmFsdWV8fGUpfSl9fSksZS53aWRnZXQoInVpLmF1dG9jb21wbGV0ZSIsZS51aS5hdXRvY29tcGxldGUse29wdGlvbnM6e21lc3NhZ2VzOntub1Jlc3VsdHM6Ik5vIHNlYXJjaCByZXN1bHRzLiIscmVzdWx0czpmdW5jdGlvbihlKXtyZXR1cm4gZSsoZT4xPyIgcmVzdWx0cyBhcmUiOiIgcmVzdWx0IGlzIikrIiBhdmFpbGFibGUsIHVzZSB1cCBhbmQgZG93biBhcnJvdyBrZXlzIHRvIG5hdmlnYXRlLiJ9fX0sX19yZXNwb25zZTpmdW5jdGlvbihlKXt2YXIgdDt0aGlzLl9zdXBlckFwcGx5KGFyZ3VtZW50cyk7aWYodGhpcy5vcHRpb25zLmRpc2FibGVkfHx0aGlzLmNhbmNlbFNlYXJjaClyZXR1cm47ZSYmZS5sZW5ndGg/dD10aGlzLm9wdGlvbnMubWVzc2FnZXMucmVzdWx0cyhlLmxlbmd0aCk6dD10aGlzLm9wdGlvbnMubWVzc2FnZXMubm9SZXN1bHRzLHRoaXMubGl2ZVJlZ2lvbi50ZXh0KHQpfX0pfSkoalF1ZXJ5KTsoZnVuY3Rpb24oZSx0KXt2YXIgbixyLGkscyxvPSJ1aS1idXR0b24gdWktd2lkZ2V0IHVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLWFsbCIsdT0idWktc3RhdGUtaG92ZXIgdWktc3RhdGUtYWN0aXZlICIsYT0idWktYnV0dG9uLWljb25zLW9ubHkgdWktYnV0dG9uLWljb24tb25seSB1aS1idXR0b24tdGV4dC1pY29ucyB1aS1idXR0b24tdGV4dC1pY29uLXByaW1hcnkgdWktYnV0dG9uLXRleHQtaWNvbi1zZWNvbmRhcnkgdWktYnV0dG9uLXRleHQtb25seSIsZj1mdW5jdGlvbigpe3ZhciB0PWUodGhpcykuZmluZCgiOnVpLWJ1dHRvbiIpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0LmJ1dHRvbigicmVmcmVzaCIpfSwxKX0sbD1mdW5jdGlvbih0KXt2YXIgbj10Lm5hbWUscj10LmZvcm0saT1lKFtdKTtyZXR1cm4gbiYmKHI/aT1lKHIpLmZpbmQoIltuYW1lPSciK24rIiddIik6aT1lKCJbbmFtZT0nIituKyInXSIsdC5vd25lckRvY3VtZW50KS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5mb3JtfSkpLGl9O2Uud2lkZ2V0KCJ1aS5idXR0b24iLHt2ZXJzaW9uOiIxLjkuMiIsZGVmYXVsdEVsZW1lbnQ6IjxidXR0b24+IixvcHRpb25zOntkaXNhYmxlZDpudWxsLHRleHQ6ITAsbGFiZWw6bnVsbCxpY29uczp7cHJpbWFyeTpudWxsLHNlY29uZGFyeTpudWxsfX0sX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5jbG9zZXN0KCJmb3JtIikudW5iaW5kKCJyZXNldCIrdGhpcy5ldmVudE5hbWVzcGFjZSkuYmluZCgicmVzZXQiK3RoaXMuZXZlbnROYW1lc3BhY2UsZiksdHlwZW9mIHRoaXMub3B0aW9ucy5kaXNhYmxlZCE9ImJvb2xlYW4iP3RoaXMub3B0aW9ucy5kaXNhYmxlZD0hIXRoaXMuZWxlbWVudC5wcm9wKCJkaXNhYmxlZCIpOnRoaXMuZWxlbWVudC5wcm9wKCJkaXNhYmxlZCIsdGhpcy5vcHRpb25zLmRpc2FibGVkKSx0aGlzLl9kZXRlcm1pbmVCdXR0b25UeXBlKCksdGhpcy5oYXNUaXRsZT0hIXRoaXMuYnV0dG9uRWxlbWVudC5hdHRyKCJ0aXRsZSIpO3ZhciB0PXRoaXMsdT10aGlzLm9wdGlvbnMsYT10aGlzLnR5cGU9PT0iY2hlY2tib3gifHx0aGlzLnR5cGU9PT0icmFkaW8iLGM9YT8iIjoidWktc3RhdGUtYWN0aXZlIixoPSJ1aS1zdGF0ZS1mb2N1cyI7dS5sYWJlbD09PW51bGwmJih1LmxhYmVsPXRoaXMudHlwZT09PSJpbnB1dCI/dGhpcy5idXR0b25FbGVtZW50LnZhbCgpOnRoaXMuYnV0dG9uRWxlbWVudC5odG1sKCkpLHRoaXMuX2hvdmVyYWJsZSh0aGlzLmJ1dHRvbkVsZW1lbnQpLHRoaXMuYnV0dG9uRWxlbWVudC5hZGRDbGFzcyhvKS5hdHRyKCJyb2xlIiwiYnV0dG9uIikuYmluZCgibW91c2VlbnRlciIrdGhpcy5ldmVudE5hbWVzcGFjZSxmdW5jdGlvbigpe2lmKHUuZGlzYWJsZWQpcmV0dXJuO3RoaXM9PT1uJiZlKHRoaXMpLmFkZENsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKX0pLmJpbmQoIm1vdXNlbGVhdmUiK3RoaXMuZXZlbnROYW1lc3BhY2UsZnVuY3Rpb24oKXtpZih1LmRpc2FibGVkKXJldHVybjtlKHRoaXMpLnJlbW92ZUNsYXNzKGMpfSkuYmluZCgiY2xpY2siK3RoaXMuZXZlbnROYW1lc3BhY2UsZnVuY3Rpb24oZSl7dS5kaXNhYmxlZCYmKGUucHJldmVudERlZmF1bHQoKSxlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpKX0pLHRoaXMuZWxlbWVudC5iaW5kKCJmb2N1cyIrdGhpcy5ldmVudE5hbWVzcGFjZSxmdW5jdGlvbigpe3QuYnV0dG9uRWxlbWVudC5hZGRDbGFzcyhoKX0pLmJpbmQoImJsdXIiK3RoaXMuZXZlbnROYW1lc3BhY2UsZnVuY3Rpb24oKXt0LmJ1dHRvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoaCl9KSxhJiYodGhpcy5lbGVtZW50LmJpbmQoImNoYW5nZSIrdGhpcy5ldmVudE5hbWVzcGFjZSxmdW5jdGlvbigpe2lmKHMpcmV0dXJuO3QucmVmcmVzaCgpfSksdGhpcy5idXR0b25FbGVtZW50LmJpbmQoIm1vdXNlZG93biIrdGhpcy5ldmVudE5hbWVzcGFjZSxmdW5jdGlvbihlKXtpZih1LmRpc2FibGVkKXJldHVybjtzPSExLHI9ZS5wYWdlWCxpPWUucGFnZVl9KS5iaW5kKCJtb3VzZXVwIit0aGlzLmV2ZW50TmFtZXNwYWNlLGZ1bmN0aW9uKGUpe2lmKHUuZGlzYWJsZWQpcmV0dXJuO2lmKHIhPT1lLnBhZ2VYfHxpIT09ZS5wYWdlWSlzPSEwfSkpLHRoaXMudHlwZT09PSJjaGVja2JveCI/dGhpcy5idXR0b25FbGVtZW50LmJpbmQoImNsaWNrIit0aGlzLmV2ZW50TmFtZXNwYWNlLGZ1bmN0aW9uKCl7aWYodS5kaXNhYmxlZHx8cylyZXR1cm4hMTtlKHRoaXMpLnRvZ2dsZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKSx0LmJ1dHRvbkVsZW1lbnQuYXR0cigiYXJpYS1wcmVzc2VkIix0LmVsZW1lbnRbMF0uY2hlY2tlZCl9KTp0aGlzLnR5cGU9PT0icmFkaW8iP3RoaXMuYnV0dG9uRWxlbWVudC5iaW5kKCJjbGljayIrdGhpcy5ldmVudE5hbWVzcGFjZSxmdW5jdGlvbigpe2lmKHUuZGlzYWJsZWR8fHMpcmV0dXJuITE7ZSh0aGlzKS5hZGRDbGFzcygidWktc3RhdGUtYWN0aXZlIiksdC5idXR0b25FbGVtZW50LmF0dHIoImFyaWEtcHJlc3NlZCIsInRydWUiKTt2YXIgbj10LmVsZW1lbnRbMF07bChuKS5ub3QobikubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIGUodGhpcykuYnV0dG9uKCJ3aWRnZXQiKVswXX0pLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKS5hdHRyKCJhcmlhLXByZXNzZWQiLCJmYWxzZSIpfSk6KHRoaXMuYnV0dG9uRWxlbWVudC5iaW5kKCJtb3VzZWRvd24iK3RoaXMuZXZlbnROYW1lc3BhY2UsZnVuY3Rpb24oKXtpZih1LmRpc2FibGVkKXJldHVybiExO2UodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLG49dGhpcyx0LmRvY3VtZW50Lm9uZSgibW91c2V1cCIsZnVuY3Rpb24oKXtuPW51bGx9KX0pLmJpbmQoIm1vdXNldXAiK3RoaXMuZXZlbnROYW1lc3BhY2UsZnVuY3Rpb24oKXtpZih1LmRpc2FibGVkKXJldHVybiExO2UodGhpcykucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpfSkuYmluZCgia2V5ZG93biIrdGhpcy5ldmVudE5hbWVzcGFjZSxmdW5jdGlvbih0KXtpZih1LmRpc2FibGVkKXJldHVybiExOyh0LmtleUNvZGU9PT1lLnVpLmtleUNvZGUuU1BBQ0V8fHQua2V5Q29kZT09PWUudWkua2V5Q29kZS5FTlRFUikmJmUodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpfSkuYmluZCgia2V5dXAiK3RoaXMuZXZlbnROYW1lc3BhY2UsZnVuY3Rpb24oKXtlKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKX0pLHRoaXMuYnV0dG9uRWxlbWVudC5pcygiYSIpJiZ0aGlzLmJ1dHRvbkVsZW1lbnQua2V5dXAoZnVuY3Rpb24odCl7dC5rZXlDb2RlPT09ZS51aS5rZXlDb2RlLlNQQUNFJiZlKHRoaXMpLmNsaWNrKCl9KSksdGhpcy5fc2V0T3B0aW9uKCJkaXNhYmxlZCIsdS5kaXNhYmxlZCksdGhpcy5fcmVzZXRCdXR0b24oKX0sX2RldGVybWluZUJ1dHRvblR5cGU6ZnVuY3Rpb24oKXt2YXIgZSx0LG47dGhpcy5lbGVtZW50LmlzKCJbdHlwZT1jaGVja2JveF0iKT90aGlzLnR5cGU9ImNoZWNrYm94Ijp0aGlzLmVsZW1lbnQuaXMoIlt0eXBlPXJhZGlvXSIpP3RoaXMudHlwZT0icmFkaW8iOnRoaXMuZWxlbWVudC5pcygiaW5wdXQiKT90aGlzLnR5cGU9ImlucHV0Ijp0aGlzLnR5cGU9ImJ1dHRvbiIsdGhpcy50eXBlPT09ImNoZWNrYm94Inx8dGhpcy50eXBlPT09InJhZGlvIj8oZT10aGlzLmVsZW1lbnQucGFyZW50cygpLmxhc3QoKSx0PSJsYWJlbFtmb3I9JyIrdGhpcy5lbGVtZW50LmF0dHIoImlkIikrIiddIix0aGlzLmJ1dHRvbkVsZW1lbnQ9ZS5maW5kKHQpLHRoaXMuYnV0dG9uRWxlbWVudC5sZW5ndGh8fChlPWUubGVuZ3RoP2Uuc2libGluZ3MoKTp0aGlzLmVsZW1lbnQuc2libGluZ3MoKSx0aGlzLmJ1dHRvbkVsZW1lbnQ9ZS5maWx0ZXIodCksdGhpcy5idXR0b25FbGVtZW50Lmxlbmd0aHx8KHRoaXMuYnV0dG9uRWxlbWVudD1lLmZpbmQodCkpKSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWhlbHBlci1oaWRkZW4tYWNjZXNzaWJsZSIpLG49dGhpcy5lbGVtZW50LmlzKCI6Y2hlY2tlZCIpLG4mJnRoaXMuYnV0dG9uRWxlbWVudC5hZGRDbGFzcygidWktc3RhdGUtYWN0aXZlIiksdGhpcy5idXR0b25FbGVtZW50LnByb3AoImFyaWEtcHJlc3NlZCIsbikpOnRoaXMuYnV0dG9uRWxlbWVudD10aGlzLmVsZW1lbnR9LHdpZGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJ1dHRvbkVsZW1lbnR9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1oZWxwZXItaGlkZGVuLWFjY2Vzc2libGUiKSx0aGlzLmJ1dHRvbkVsZW1lbnQucmVtb3ZlQ2xhc3MobysiICIrdSsiICIrYSkucmVtb3ZlQXR0cigicm9sZSIpLnJlbW92ZUF0dHIoImFyaWEtcHJlc3NlZCIpLmh0bWwodGhpcy5idXR0b25FbGVtZW50LmZpbmQoIi51aS1idXR0b24tdGV4dCIpLmh0bWwoKSksdGhpcy5oYXNUaXRsZXx8dGhpcy5idXR0b25FbGVtZW50LnJlbW92ZUF0dHIoInRpdGxlIil9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXt0aGlzLl9zdXBlcihlLHQpO2lmKGU9PT0iZGlzYWJsZWQiKXt0P3RoaXMuZWxlbWVudC5wcm9wKCJkaXNhYmxlZCIsITApOnRoaXMuZWxlbWVudC5wcm9wKCJkaXNhYmxlZCIsITEpO3JldHVybn10aGlzLl9yZXNldEJ1dHRvbigpfSxyZWZyZXNoOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5lbGVtZW50LmlzKCJpbnB1dCwgYnV0dG9uIik/dGhpcy5lbGVtZW50LmlzKCI6ZGlzYWJsZWQiKTp0aGlzLmVsZW1lbnQuaGFzQ2xhc3MoInVpLWJ1dHRvbi1kaXNhYmxlZCIpO3QhPT10aGlzLm9wdGlvbnMuZGlzYWJsZWQmJnRoaXMuX3NldE9wdGlvbigiZGlzYWJsZWQiLHQpLHRoaXMudHlwZT09PSJyYWRpbyI/bCh0aGlzLmVsZW1lbnRbMF0pLmVhY2goZnVuY3Rpb24oKXtlKHRoaXMpLmlzKCI6Y2hlY2tlZCIpP2UodGhpcykuYnV0dG9uKCJ3aWRnZXQiKS5hZGRDbGFzcygidWktc3RhdGUtYWN0aXZlIikuYXR0cigiYXJpYS1wcmVzc2VkIiwidHJ1ZSIpOmUodGhpcykuYnV0dG9uKCJ3aWRnZXQiKS5yZW1vdmVDbGFzcygidWktc3RhdGUtYWN0aXZlIikuYXR0cigiYXJpYS1wcmVzc2VkIiwiZmFsc2UiKX0pOnRoaXMudHlwZT09PSJjaGVja2JveCImJih0aGlzLmVsZW1lbnQuaXMoIjpjaGVja2VkIik/dGhpcy5idXR0b25FbGVtZW50LmFkZENsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKS5hdHRyKCJhcmlhLXByZXNzZWQiLCJ0cnVlIik6dGhpcy5idXR0b25FbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKS5hdHRyKCJhcmlhLXByZXNzZWQiLCJmYWxzZSIpKX0sX3Jlc2V0QnV0dG9uOmZ1bmN0aW9uKCl7aWYodGhpcy50eXBlPT09ImlucHV0Iil7dGhpcy5vcHRpb25zLmxhYmVsJiZ0aGlzLmVsZW1lbnQudmFsKHRoaXMub3B0aW9ucy5sYWJlbCk7cmV0dXJufXZhciB0PXRoaXMuYnV0dG9uRWxlbWVudC5yZW1vdmVDbGFzcyhhKSxuPWUoIjxzcGFuPjwvc3Bhbj4iLHRoaXMuZG9jdW1lbnRbMF0pLmFkZENsYXNzKCJ1aS1idXR0b24tdGV4dCIpLmh0bWwodGhpcy5vcHRpb25zLmxhYmVsKS5hcHBlbmRUbyh0LmVtcHR5KCkpLnRleHQoKSxyPXRoaXMub3B0aW9ucy5pY29ucyxpPXIucHJpbWFyeSYmci5zZWNvbmRhcnkscz1bXTtyLnByaW1hcnl8fHIuc2Vjb25kYXJ5Pyh0aGlzLm9wdGlvbnMudGV4dCYmcy5wdXNoKCJ1aS1idXR0b24tdGV4dC1pY29uIisoaT8icyI6ci5wcmltYXJ5PyItcHJpbWFyeSI6Ii1zZWNvbmRhcnkiKSksci5wcmltYXJ5JiZ0LnByZXBlbmQoIjxzcGFuIGNsYXNzPSd1aS1idXR0b24taWNvbi1wcmltYXJ5IHVpLWljb24gIityLnByaW1hcnkrIic+PC9zcGFuPiIpLHIuc2Vjb25kYXJ5JiZ0LmFwcGVuZCgiPHNwYW4gY2xhc3M9J3VpLWJ1dHRvbi1pY29uLXNlY29uZGFyeSB1aS1pY29uICIrci5zZWNvbmRhcnkrIic+PC9zcGFuPiIpLHRoaXMub3B0aW9ucy50ZXh0fHwocy5wdXNoKGk/InVpLWJ1dHRvbi1pY29ucy1vbmx5IjoidWktYnV0dG9uLWljb24tb25seSIpLHRoaXMuaGFzVGl0bGV8fHQuYXR0cigidGl0bGUiLGUudHJpbShuKSkpKTpzLnB1c2goInVpLWJ1dHRvbi10ZXh0LW9ubHkiKSx0LmFkZENsYXNzKHMuam9pbigiICIpKX19KSxlLndpZGdldCgidWkuYnV0dG9uc2V0Iix7dmVyc2lvbjoiMS45LjIiLG9wdGlvbnM6e2l0ZW1zOiJidXR0b24sIGlucHV0W3R5cGU9YnV0dG9uXSwgaW5wdXRbdHlwZT1zdWJtaXRdLCBpbnB1dFt0eXBlPXJlc2V0XSwgaW5wdXRbdHlwZT1jaGVja2JveF0sIGlucHV0W3R5cGU9cmFkaW9dLCBhLCA6ZGF0YShidXR0b24pIn0sX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5hZGRDbGFzcygidWktYnV0dG9uc2V0Iil9LF9pbml0OmZ1bmN0aW9uKCl7dGhpcy5yZWZyZXNoKCl9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXtlPT09ImRpc2FibGVkIiYmdGhpcy5idXR0b25zLmJ1dHRvbigib3B0aW9uIixlLHQpLHRoaXMuX3N1cGVyKGUsdCl9LHJlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVsZW1lbnQuY3NzKCJkaXJlY3Rpb24iKT09PSJydGwiO3RoaXMuYnV0dG9ucz10aGlzLmVsZW1lbnQuZmluZCh0aGlzLm9wdGlvbnMuaXRlbXMpLmZpbHRlcigiOnVpLWJ1dHRvbiIpLmJ1dHRvbigicmVmcmVzaCIpLmVuZCgpLm5vdCgiOnVpLWJ1dHRvbiIpLmJ1dHRvbigpLmVuZCgpLm1hcChmdW5jdGlvbigpe3JldHVybiBlKHRoaXMpLmJ1dHRvbigid2lkZ2V0IilbMF19KS5yZW1vdmVDbGFzcygidWktY29ybmVyLWFsbCB1aS1jb3JuZXItbGVmdCB1aS1jb3JuZXItcmlnaHQiKS5maWx0ZXIoIjpmaXJzdCIpLmFkZENsYXNzKHQ/InVpLWNvcm5lci1yaWdodCI6InVpLWNvcm5lci1sZWZ0IikuZW5kKCkuZmlsdGVyKCI6bGFzdCIpLmFkZENsYXNzKHQ/InVpLWNvcm5lci1sZWZ0IjoidWktY29ybmVyLXJpZ2h0IikuZW5kKCkuZW5kKCl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1idXR0b25zZXQiKSx0aGlzLmJ1dHRvbnMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIGUodGhpcykuYnV0dG9uKCJ3aWRnZXQiKVswXX0pLnJlbW92ZUNsYXNzKCJ1aS1jb3JuZXItbGVmdCB1aS1jb3JuZXItcmlnaHQiKS5lbmQoKS5idXR0b24oImRlc3Ryb3kiKX19KX0pKGpRdWVyeSk7KGZ1bmN0aW9uKCQsdW5kZWZpbmVkKXtmdW5jdGlvbiBEYXRlcGlja2VyKCl7dGhpcy5kZWJ1Zz0hMSx0aGlzLl9jdXJJbnN0PW51bGwsdGhpcy5fa2V5RXZlbnQ9ITEsdGhpcy5fZGlzYWJsZWRJbnB1dHM9W10sdGhpcy5fZGF0ZXBpY2tlclNob3dpbmc9ITEsdGhpcy5faW5EaWFsb2c9ITEsdGhpcy5fbWFpbkRpdklkPSJ1aS1kYXRlcGlja2VyLWRpdiIsdGhpcy5faW5saW5lQ2xhc3M9InVpLWRhdGVwaWNrZXItaW5saW5lIix0aGlzLl9hcHBlbmRDbGFzcz0idWktZGF0ZXBpY2tlci1hcHBlbmQiLHRoaXMuX3RyaWdnZXJDbGFzcz0idWktZGF0ZXBpY2tlci10cmlnZ2VyIix0aGlzLl9kaWFsb2dDbGFzcz0idWktZGF0ZXBpY2tlci1kaWFsb2ciLHRoaXMuX2Rpc2FibGVDbGFzcz0idWktZGF0ZXBpY2tlci1kaXNhYmxlZCIsdGhpcy5fdW5zZWxlY3RhYmxlQ2xhc3M9InVpLWRhdGVwaWNrZXItdW5zZWxlY3RhYmxlIix0aGlzLl9jdXJyZW50Q2xhc3M9InVpLWRhdGVwaWNrZXItY3VycmVudC1kYXkiLHRoaXMuX2RheU92ZXJDbGFzcz0idWktZGF0ZXBpY2tlci1kYXlzLWNlbGwtb3ZlciIsdGhpcy5yZWdpb25hbD1bXSx0aGlzLnJlZ2lvbmFsWyIiXT17Y2xvc2VUZXh0OiJEb25lIixwcmV2VGV4dDoiUHJldiIsbmV4dFRleHQ6Ik5leHQiLGN1cnJlbnRUZXh0OiJUb2RheSIsbW9udGhOYW1lczpbIkphbnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1Z3VzdCIsIlNlcHRlbWJlciIsIk9jdG9iZXIiLCJOb3ZlbWJlciIsIkRlY2VtYmVyIl0sbW9udGhOYW1lc1Nob3J0OlsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIl0sZGF5TmFtZXM6WyJTdW5kYXkiLCJNb25kYXkiLCJUdWVzZGF5IiwiV2VkbmVzZGF5IiwiVGh1cnNkYXkiLCJGcmlkYXkiLCJTYXR1cmRheSJdLGRheU5hbWVzU2hvcnQ6WyJTdW4iLCJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiXSxkYXlOYW1lc01pbjpbIlN1IiwiTW8iLCJUdSIsIldlIiwiVGgiLCJGciIsIlNhIl0sd2Vla0hlYWRlcjoiV2siLGRhdGVGb3JtYXQ6Im1tL2RkL3l5IixmaXJzdERheTowLGlzUlRMOiExLHNob3dNb250aEFmdGVyWWVhcjohMSx5ZWFyU3VmZml4OiIifSx0aGlzLl9kZWZhdWx0cz17c2hvd09uOiJmb2N1cyIsc2hvd0FuaW06ImZhZGVJbiIsc2hvd09wdGlvbnM6e30sZGVmYXVsdERhdGU6bnVsbCxhcHBlbmRUZXh0OiIiLGJ1dHRvblRleHQ6Ii4uLiIsYnV0dG9uSW1hZ2U6IiIsYnV0dG9uSW1hZ2VPbmx5OiExLGhpZGVJZk5vUHJldk5leHQ6ITEsbmF2aWdhdGlvbkFzRGF0ZUZvcm1hdDohMSxnb3RvQ3VycmVudDohMSxjaGFuZ2VNb250aDohMSxjaGFuZ2VZZWFyOiExLHllYXJSYW5nZToiYy0xMDpjKzEwIixzaG93T3RoZXJNb250aHM6ITEsc2VsZWN0T3RoZXJNb250aHM6ITEsc2hvd1dlZWs6ITEsY2FsY3VsYXRlV2Vlazp0aGlzLmlzbzg2MDFXZWVrLHNob3J0WWVhckN1dG9mZjoiKzEwIixtaW5EYXRlOm51bGwsbWF4RGF0ZTpudWxsLGR1cmF0aW9uOiJmYXN0IixiZWZvcmVTaG93RGF5Om51bGwsYmVmb3JlU2hvdzpudWxsLG9uU2VsZWN0Om51bGwsb25DaGFuZ2VNb250aFllYXI6bnVsbCxvbkNsb3NlOm51bGwsbnVtYmVyT2ZNb250aHM6MSxzaG93Q3VycmVudEF0UG9zOjAsc3RlcE1vbnRoczoxLHN0ZXBCaWdNb250aHM6MTIsYWx0RmllbGQ6IiIsYWx0Rm9ybWF0OiIiLGNvbnN0cmFpbklucHV0OiEwLHNob3dCdXR0b25QYW5lbDohMSxhdXRvU2l6ZTohMSxkaXNhYmxlZDohMX0sJC5leHRlbmQodGhpcy5fZGVmYXVsdHMsdGhpcy5yZWdpb25hbFsiIl0pLHRoaXMuZHBEaXY9YmluZEhvdmVyKCQoJzxkaXYgaWQ9IicrdGhpcy5fbWFpbkRpdklkKyciIGNsYXNzPSJ1aS1kYXRlcGlja2VyIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1oZWxwZXItY2xlYXJmaXggdWktY29ybmVyLWFsbCI+PC9kaXY+JykpfWZ1bmN0aW9uIGJpbmRIb3ZlcihlKXt2YXIgdD0iYnV0dG9uLCAudWktZGF0ZXBpY2tlci1wcmV2LCAudWktZGF0ZXBpY2tlci1uZXh0LCAudWktZGF0ZXBpY2tlci1jYWxlbmRhciB0ZCBhIjtyZXR1cm4gZS5kZWxlZ2F0ZSh0LCJtb3VzZW91dCIsZnVuY3Rpb24oKXskKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpLHRoaXMuY2xhc3NOYW1lLmluZGV4T2YoInVpLWRhdGVwaWNrZXItcHJldiIpIT0tMSYmJCh0aGlzKS5yZW1vdmVDbGFzcygidWktZGF0ZXBpY2tlci1wcmV2LWhvdmVyIiksdGhpcy5jbGFzc05hbWUuaW5kZXhPZigidWktZGF0ZXBpY2tlci1uZXh0IikhPS0xJiYkKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1kYXRlcGlja2VyLW5leHQtaG92ZXIiKX0pLmRlbGVnYXRlKHQsIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXskLmRhdGVwaWNrZXIuX2lzRGlzYWJsZWREYXRlcGlja2VyKGluc3RBY3RpdmUuaW5saW5lP2UucGFyZW50KClbMF06aW5zdEFjdGl2ZS5pbnB1dFswXSl8fCgkKHRoaXMpLnBhcmVudHMoIi51aS1kYXRlcGlja2VyLWNhbGVuZGFyIikuZmluZCgiYSIpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpLCQodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWhvdmVyIiksdGhpcy5jbGFzc05hbWUuaW5kZXhPZigidWktZGF0ZXBpY2tlci1wcmV2IikhPS0xJiYkKHRoaXMpLmFkZENsYXNzKCJ1aS1kYXRlcGlja2VyLXByZXYtaG92ZXIiKSx0aGlzLmNsYXNzTmFtZS5pbmRleE9mKCJ1aS1kYXRlcGlja2VyLW5leHQiKSE9LTEmJiQodGhpcykuYWRkQ2xhc3MoInVpLWRhdGVwaWNrZXItbmV4dC1ob3ZlciIpKX0pfWZ1bmN0aW9uIGV4dGVuZFJlbW92ZShlLHQpeyQuZXh0ZW5kKGUsdCk7Zm9yKHZhciBuIGluIHQpaWYodFtuXT09bnVsbHx8dFtuXT09dW5kZWZpbmVkKWVbbl09dFtuXTtyZXR1cm4gZX0kLmV4dGVuZCgkLnVpLHtkYXRlcGlja2VyOnt2ZXJzaW9uOiIxLjkuMiJ9fSk7dmFyIFBST1BfTkFNRT0iZGF0ZXBpY2tlciIsZHB1dWlkPShuZXcgRGF0ZSkuZ2V0VGltZSgpLGluc3RBY3RpdmU7JC5leHRlbmQoRGF0ZXBpY2tlci5wcm90b3R5cGUse21hcmtlckNsYXNzTmFtZToiaGFzRGF0ZXBpY2tlciIsbWF4Um93czo0LGxvZzpmdW5jdGlvbigpe3RoaXMuZGVidWcmJmNvbnNvbGUubG9nLmFwcGx5KCIiLGFyZ3VtZW50cyl9LF93aWRnZXREYXRlcGlja2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHBEaXZ9LHNldERlZmF1bHRzOmZ1bmN0aW9uKGUpe3JldHVybiBleHRlbmRSZW1vdmUodGhpcy5fZGVmYXVsdHMsZXx8e30pLHRoaXN9LF9hdHRhY2hEYXRlcGlja2VyOmZ1bmN0aW9uKHRhcmdldCxzZXR0aW5ncyl7dmFyIGlubGluZVNldHRpbmdzPW51bGw7Zm9yKHZhciBhdHRyTmFtZSBpbiB0aGlzLl9kZWZhdWx0cyl7dmFyIGF0dHJWYWx1ZT10YXJnZXQuZ2V0QXR0cmlidXRlKCJkYXRlOiIrYXR0ck5hbWUpO2lmKGF0dHJWYWx1ZSl7aW5saW5lU2V0dGluZ3M9aW5saW5lU2V0dGluZ3N8fHt9O3RyeXtpbmxpbmVTZXR0aW5nc1thdHRyTmFtZV09ZXZhbChhdHRyVmFsdWUpfWNhdGNoKGVycil7aW5saW5lU2V0dGluZ3NbYXR0ck5hbWVdPWF0dHJWYWx1ZX19fXZhciBub2RlTmFtZT10YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxpbmxpbmU9bm9kZU5hbWU9PSJkaXYifHxub2RlTmFtZT09InNwYW4iO3RhcmdldC5pZHx8KHRoaXMudXVpZCs9MSx0YXJnZXQuaWQ9ImRwIit0aGlzLnV1aWQpO3ZhciBpbnN0PXRoaXMuX25ld0luc3QoJCh0YXJnZXQpLGlubGluZSk7aW5zdC5zZXR0aW5ncz0kLmV4dGVuZCh7fSxzZXR0aW5nc3x8e30saW5saW5lU2V0dGluZ3N8fHt9KSxub2RlTmFtZT09ImlucHV0Ij90aGlzLl9jb25uZWN0RGF0ZXBpY2tlcih0YXJnZXQsaW5zdCk6aW5saW5lJiZ0aGlzLl9pbmxpbmVEYXRlcGlja2VyKHRhcmdldCxpbnN0KX0sX25ld0luc3Q6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lWzBdLmlkLnJlcGxhY2UoLyhbXkEtWmEtejAtOV8tXSkvZywiXFxcXCQxIik7cmV0dXJue2lkOm4saW5wdXQ6ZSxzZWxlY3RlZERheTowLHNlbGVjdGVkTW9udGg6MCxzZWxlY3RlZFllYXI6MCxkcmF3TW9udGg6MCxkcmF3WWVhcjowLGlubGluZTp0LGRwRGl2OnQ/YmluZEhvdmVyKCQoJzxkaXYgY2xhc3M9IicrdGhpcy5faW5saW5lQ2xhc3MrJyB1aS1kYXRlcGlja2VyIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1oZWxwZXItY2xlYXJmaXggdWktY29ybmVyLWFsbCI+PC9kaXY+JykpOnRoaXMuZHBEaXZ9fSxfY29ubmVjdERhdGVwaWNrZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj0kKGUpO3QuYXBwZW5kPSQoW10pLHQudHJpZ2dlcj0kKFtdKTtpZihuLmhhc0NsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKSlyZXR1cm47dGhpcy5fYXR0YWNobWVudHMobix0KSxuLmFkZENsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKS5rZXlkb3duKHRoaXMuX2RvS2V5RG93bikua2V5cHJlc3ModGhpcy5fZG9LZXlQcmVzcykua2V5dXAodGhpcy5fZG9LZXlVcCkuYmluZCgic2V0RGF0YS5kYXRlcGlja2VyIixmdW5jdGlvbihlLG4scil7dC5zZXR0aW5nc1tuXT1yfSkuYmluZCgiZ2V0RGF0YS5kYXRlcGlja2VyIixmdW5jdGlvbihlLG4pe3JldHVybiB0aGlzLl9nZXQodCxuKX0pLHRoaXMuX2F1dG9TaXplKHQpLCQuZGF0YShlLFBST1BfTkFNRSx0KSx0LnNldHRpbmdzLmRpc2FibGVkJiZ0aGlzLl9kaXNhYmxlRGF0ZXBpY2tlcihlKX0sX2F0dGFjaG1lbnRzOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5fZ2V0KHQsImFwcGVuZFRleHQiKSxyPXRoaXMuX2dldCh0LCJpc1JUTCIpO3QuYXBwZW5kJiZ0LmFwcGVuZC5yZW1vdmUoKSxuJiYodC5hcHBlbmQ9JCgnPHNwYW4gY2xhc3M9IicrdGhpcy5fYXBwZW5kQ2xhc3MrJyI+JytuKyI8L3NwYW4+IiksZVtyPyJiZWZvcmUiOiJhZnRlciJdKHQuYXBwZW5kKSksZS51bmJpbmQoImZvY3VzIix0aGlzLl9zaG93RGF0ZXBpY2tlciksdC50cmlnZ2VyJiZ0LnRyaWdnZXIucmVtb3ZlKCk7dmFyIGk9dGhpcy5fZ2V0KHQsInNob3dPbiIpOyhpPT0iZm9jdXMifHxpPT0iYm90aCIpJiZlLmZvY3VzKHRoaXMuX3Nob3dEYXRlcGlja2VyKTtpZihpPT0iYnV0dG9uInx8aT09ImJvdGgiKXt2YXIgcz10aGlzLl9nZXQodCwiYnV0dG9uVGV4dCIpLG89dGhpcy5fZ2V0KHQsImJ1dHRvbkltYWdlIik7dC50cmlnZ2VyPSQodGhpcy5fZ2V0KHQsImJ1dHRvbkltYWdlT25seSIpPyQoIjxpbWcvPiIpLmFkZENsYXNzKHRoaXMuX3RyaWdnZXJDbGFzcykuYXR0cih7c3JjOm8sYWx0OnMsdGl0bGU6c30pOiQoJzxidXR0b24gdHlwZT0iYnV0dG9uIj48L2J1dHRvbj4nKS5hZGRDbGFzcyh0aGlzLl90cmlnZ2VyQ2xhc3MpLmh0bWwobz09IiI/czokKCI8aW1nLz4iKS5hdHRyKHtzcmM6byxhbHQ6cyx0aXRsZTpzfSkpKSxlW3I/ImJlZm9yZSI6ImFmdGVyIl0odC50cmlnZ2VyKSx0LnRyaWdnZXIuY2xpY2soZnVuY3Rpb24oKXtyZXR1cm4gJC5kYXRlcGlja2VyLl9kYXRlcGlja2VyU2hvd2luZyYmJC5kYXRlcGlja2VyLl9sYXN0SW5wdXQ9PWVbMF0/JC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpOiQuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmcmJiQuZGF0ZXBpY2tlci5fbGFzdElucHV0IT1lWzBdPygkLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCksJC5kYXRlcGlja2VyLl9zaG93RGF0ZXBpY2tlcihlWzBdKSk6JC5kYXRlcGlja2VyLl9zaG93RGF0ZXBpY2tlcihlWzBdKSwhMX0pfX0sX2F1dG9TaXplOmZ1bmN0aW9uKGUpe2lmKHRoaXMuX2dldChlLCJhdXRvU2l6ZSIpJiYhZS5pbmxpbmUpe3ZhciB0PW5ldyBEYXRlKDIwMDksMTEsMjApLG49dGhpcy5fZ2V0KGUsImRhdGVGb3JtYXQiKTtpZihuLm1hdGNoKC9bRE1dLykpe3ZhciByPWZ1bmN0aW9uKGUpe3ZhciB0PTAsbj0wO2Zvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKWVbcl0ubGVuZ3RoPnQmJih0PWVbcl0ubGVuZ3RoLG49cik7cmV0dXJuIG59O3Quc2V0TW9udGgocih0aGlzLl9nZXQoZSxuLm1hdGNoKC9NTS8pPyJtb250aE5hbWVzIjoibW9udGhOYW1lc1Nob3J0IikpKSx0LnNldERhdGUocih0aGlzLl9nZXQoZSxuLm1hdGNoKC9ERC8pPyJkYXlOYW1lcyI6ImRheU5hbWVzU2hvcnQiKSkrMjAtdC5nZXREYXkoKSl9ZS5pbnB1dC5hdHRyKCJzaXplIix0aGlzLl9mb3JtYXREYXRlKGUsdCkubGVuZ3RoKX19LF9pbmxpbmVEYXRlcGlja2VyOmZ1bmN0aW9uKGUsdCl7dmFyIG49JChlKTtpZihuLmhhc0NsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKSlyZXR1cm47bi5hZGRDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkuYXBwZW5kKHQuZHBEaXYpLmJpbmQoInNldERhdGEuZGF0ZXBpY2tlciIsZnVuY3Rpb24oZSxuLHIpe3Quc2V0dGluZ3Nbbl09cn0pLmJpbmQoImdldERhdGEuZGF0ZXBpY2tlciIsZnVuY3Rpb24oZSxuKXtyZXR1cm4gdGhpcy5fZ2V0KHQsbil9KSwkLmRhdGEoZSxQUk9QX05BTUUsdCksdGhpcy5fc2V0RGF0ZSh0LHRoaXMuX2dldERlZmF1bHREYXRlKHQpLCEwKSx0aGlzLl91cGRhdGVEYXRlcGlja2VyKHQpLHRoaXMuX3VwZGF0ZUFsdGVybmF0ZSh0KSx0LnNldHRpbmdzLmRpc2FibGVkJiZ0aGlzLl9kaXNhYmxlRGF0ZXBpY2tlcihlKSx0LmRwRGl2LmNzcygiZGlzcGxheSIsImJsb2NrIil9LF9kaWFsb2dEYXRlcGlja2VyOmZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIHM9dGhpcy5fZGlhbG9nSW5zdDtpZighcyl7dGhpcy51dWlkKz0xO3ZhciBvPSJkcCIrdGhpcy51dWlkO3RoaXMuX2RpYWxvZ0lucHV0PSQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iJytvKyciIHN0eWxlPSJwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogLTEwMHB4OyB3aWR0aDogMHB4OyIvPicpLHRoaXMuX2RpYWxvZ0lucHV0LmtleWRvd24odGhpcy5fZG9LZXlEb3duKSwkKCJib2R5IikuYXBwZW5kKHRoaXMuX2RpYWxvZ0lucHV0KSxzPXRoaXMuX2RpYWxvZ0luc3Q9dGhpcy5fbmV3SW5zdCh0aGlzLl9kaWFsb2dJbnB1dCwhMSkscy5zZXR0aW5ncz17fSwkLmRhdGEodGhpcy5fZGlhbG9nSW5wdXRbMF0sUFJPUF9OQU1FLHMpfWV4dGVuZFJlbW92ZShzLnNldHRpbmdzLHJ8fHt9KSx0PXQmJnQuY29uc3RydWN0b3I9PURhdGU/dGhpcy5fZm9ybWF0RGF0ZShzLHQpOnQsdGhpcy5fZGlhbG9nSW5wdXQudmFsKHQpLHRoaXMuX3Bvcz1pP2kubGVuZ3RoP2k6W2kucGFnZVgsaS5wYWdlWV06bnVsbDtpZighdGhpcy5fcG9zKXt2YXIgdT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsYT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LGY9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnR8fGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdCxsPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3B8fGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wO3RoaXMuX3Bvcz1bdS8yLTEwMCtmLGEvMi0xNTArbF19cmV0dXJuIHRoaXMuX2RpYWxvZ0lucHV0LmNzcygibGVmdCIsdGhpcy5fcG9zWzBdKzIwKyJweCIpLmNzcygidG9wIix0aGlzLl9wb3NbMV0rInB4Iikscy5zZXR0aW5ncy5vblNlbGVjdD1uLHRoaXMuX2luRGlhbG9nPSEwLHRoaXMuZHBEaXYuYWRkQ2xhc3ModGhpcy5fZGlhbG9nQ2xhc3MpLHRoaXMuX3Nob3dEYXRlcGlja2VyKHRoaXMuX2RpYWxvZ0lucHV0WzBdKSwkLmJsb2NrVUkmJiQuYmxvY2tVSSh0aGlzLmRwRGl2KSwkLmRhdGEodGhpcy5fZGlhbG9nSW5wdXRbMF0sUFJPUF9OQU1FLHMpLHRoaXN9LF9kZXN0cm95RGF0ZXBpY2tlcjpmdW5jdGlvbihlKXt2YXIgdD0kKGUpLG49JC5kYXRhKGUsUFJPUF9OQU1FKTtpZighdC5oYXNDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkpcmV0dXJuO3ZhciByPWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTskLnJlbW92ZURhdGEoZSxQUk9QX05BTUUpLHI9PSJpbnB1dCI/KG4uYXBwZW5kLnJlbW92ZSgpLG4udHJpZ2dlci5yZW1vdmUoKSx0LnJlbW92ZUNsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKS51bmJpbmQoImZvY3VzIix0aGlzLl9zaG93RGF0ZXBpY2tlcikudW5iaW5kKCJrZXlkb3duIix0aGlzLl9kb0tleURvd24pLnVuYmluZCgia2V5cHJlc3MiLHRoaXMuX2RvS2V5UHJlc3MpLnVuYmluZCgia2V5dXAiLHRoaXMuX2RvS2V5VXApKToocj09ImRpdiJ8fHI9PSJzcGFuIikmJnQucmVtb3ZlQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpLmVtcHR5KCl9LF9lbmFibGVEYXRlcGlja2VyOmZ1bmN0aW9uKGUpe3ZhciB0PSQoZSksbj0kLmRhdGEoZSxQUk9QX05BTUUpO2lmKCF0Lmhhc0NsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKSlyZXR1cm47dmFyIHI9ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO2lmKHI9PSJpbnB1dCIpZS5kaXNhYmxlZD0hMSxuLnRyaWdnZXIuZmlsdGVyKCJidXR0b24iKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5kaXNhYmxlZD0hMX0pLmVuZCgpLmZpbHRlcigiaW1nIikuY3NzKHtvcGFjaXR5OiIxLjAiLGN1cnNvcjoiIn0pO2Vsc2UgaWYocj09ImRpdiJ8fHI9PSJzcGFuIil7dmFyIGk9dC5jaGlsZHJlbigiLiIrdGhpcy5faW5saW5lQ2xhc3MpO2kuY2hpbGRyZW4oKS5yZW1vdmVDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiKSxpLmZpbmQoInNlbGVjdC51aS1kYXRlcGlja2VyLW1vbnRoLCBzZWxlY3QudWktZGF0ZXBpY2tlci15ZWFyIikucHJvcCgiZGlzYWJsZWQiLCExKX10aGlzLl9kaXNhYmxlZElucHV0cz0kLm1hcCh0aGlzLl9kaXNhYmxlZElucHV0cyxmdW5jdGlvbih0KXtyZXR1cm4gdD09ZT9udWxsOnR9KX0sX2Rpc2FibGVEYXRlcGlja2VyOmZ1bmN0aW9uKGUpe3ZhciB0PSQoZSksbj0kLmRhdGEoZSxQUk9QX05BTUUpO2lmKCF0Lmhhc0NsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKSlyZXR1cm47dmFyIHI9ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO2lmKHI9PSJpbnB1dCIpZS5kaXNhYmxlZD0hMCxuLnRyaWdnZXIuZmlsdGVyKCJidXR0b24iKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5kaXNhYmxlZD0hMH0pLmVuZCgpLmZpbHRlcigiaW1nIikuY3NzKHtvcGFjaXR5OiIwLjUiLGN1cnNvcjoiZGVmYXVsdCJ9KTtlbHNlIGlmKHI9PSJkaXYifHxyPT0ic3BhbiIpe3ZhciBpPXQuY2hpbGRyZW4oIi4iK3RoaXMuX2lubGluZUNsYXNzKTtpLmNoaWxkcmVuKCkuYWRkQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIiksaS5maW5kKCJzZWxlY3QudWktZGF0ZXBpY2tlci1tb250aCwgc2VsZWN0LnVpLWRhdGVwaWNrZXIteWVhciIpLnByb3AoImRpc2FibGVkIiwhMCl9dGhpcy5fZGlzYWJsZWRJbnB1dHM9JC5tYXAodGhpcy5fZGlzYWJsZWRJbnB1dHMsZnVuY3Rpb24odCl7cmV0dXJuIHQ9PWU/bnVsbDp0fSksdGhpcy5fZGlzYWJsZWRJbnB1dHNbdGhpcy5fZGlzYWJsZWRJbnB1dHMubGVuZ3RoXT1lfSxfaXNEaXNhYmxlZERhdGVwaWNrZXI6ZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuITE7Zm9yKHZhciB0PTA7dDx0aGlzLl9kaXNhYmxlZElucHV0cy5sZW5ndGg7dCsrKWlmKHRoaXMuX2Rpc2FibGVkSW5wdXRzW3RdPT1lKXJldHVybiEwO3JldHVybiExfSxfZ2V0SW5zdDpmdW5jdGlvbihlKXt0cnl7cmV0dXJuICQuZGF0YShlLFBST1BfTkFNRSl9Y2F0Y2godCl7dGhyb3ciTWlzc2luZyBpbnN0YW5jZSBkYXRhIGZvciB0aGlzIGRhdGVwaWNrZXIifX0sX29wdGlvbkRhdGVwaWNrZXI6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuX2dldEluc3QoZSk7aWYoYXJndW1lbnRzLmxlbmd0aD09MiYmdHlwZW9mIHQ9PSJzdHJpbmciKXJldHVybiB0PT0iZGVmYXVsdHMiPyQuZXh0ZW5kKHt9LCQuZGF0ZXBpY2tlci5fZGVmYXVsdHMpOnI/dD09ImFsbCI/JC5leHRlbmQoe30sci5zZXR0aW5ncyk6dGhpcy5fZ2V0KHIsdCk6bnVsbDt2YXIgaT10fHx7fTt0eXBlb2YgdD09InN0cmluZyImJihpPXt9LGlbdF09bik7aWYocil7dGhpcy5fY3VySW5zdD09ciYmdGhpcy5faGlkZURhdGVwaWNrZXIoKTt2YXIgcz10aGlzLl9nZXREYXRlRGF0ZXBpY2tlcihlLCEwKSxvPXRoaXMuX2dldE1pbk1heERhdGUociwibWluIiksdT10aGlzLl9nZXRNaW5NYXhEYXRlKHIsIm1heCIpO2V4dGVuZFJlbW92ZShyLnNldHRpbmdzLGkpLG8hPT1udWxsJiZpLmRhdGVGb3JtYXQhPT11bmRlZmluZWQmJmkubWluRGF0ZT09PXVuZGVmaW5lZCYmKHIuc2V0dGluZ3MubWluRGF0ZT10aGlzLl9mb3JtYXREYXRlKHIsbykpLHUhPT1udWxsJiZpLmRhdGVGb3JtYXQhPT11bmRlZmluZWQmJmkubWF4RGF0ZT09PXVuZGVmaW5lZCYmKHIuc2V0dGluZ3MubWF4RGF0ZT10aGlzLl9mb3JtYXREYXRlKHIsdSkpLHRoaXMuX2F0dGFjaG1lbnRzKCQoZSksciksdGhpcy5fYXV0b1NpemUociksdGhpcy5fc2V0RGF0ZShyLHMpLHRoaXMuX3VwZGF0ZUFsdGVybmF0ZShyKSx0aGlzLl91cGRhdGVEYXRlcGlja2VyKHIpfX0sX2NoYW5nZURhdGVwaWNrZXI6ZnVuY3Rpb24oZSx0LG4pe3RoaXMuX29wdGlvbkRhdGVwaWNrZXIoZSx0LG4pfSxfcmVmcmVzaERhdGVwaWNrZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fZ2V0SW5zdChlKTt0JiZ0aGlzLl91cGRhdGVEYXRlcGlja2VyKHQpfSxfc2V0RGF0ZURhdGVwaWNrZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLl9nZXRJbnN0KGUpO24mJih0aGlzLl9zZXREYXRlKG4sdCksdGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihuKSx0aGlzLl91cGRhdGVBbHRlcm5hdGUobikpfSxfZ2V0RGF0ZURhdGVwaWNrZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLl9nZXRJbnN0KGUpO3JldHVybiBuJiYhbi5pbmxpbmUmJnRoaXMuX3NldERhdGVGcm9tRmllbGQobix0KSxuP3RoaXMuX2dldERhdGUobik6bnVsbH0sX2RvS2V5RG93bjpmdW5jdGlvbihlKXt2YXIgdD0kLmRhdGVwaWNrZXIuX2dldEluc3QoZS50YXJnZXQpLG49ITAscj10LmRwRGl2LmlzKCIudWktZGF0ZXBpY2tlci1ydGwiKTt0Ll9rZXlFdmVudD0hMDtpZigkLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nKXN3aXRjaChlLmtleUNvZGUpe2Nhc2UgOTokLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCksbj0hMTticmVhaztjYXNlIDEzOnZhciBpPSQoInRkLiIrJC5kYXRlcGlja2VyLl9kYXlPdmVyQ2xhc3MrIjpub3QoLiIrJC5kYXRlcGlja2VyLl9jdXJyZW50Q2xhc3MrIikiLHQuZHBEaXYpO2lbMF0mJiQuZGF0ZXBpY2tlci5fc2VsZWN0RGF5KGUudGFyZ2V0LHQuc2VsZWN0ZWRNb250aCx0LnNlbGVjdGVkWWVhcixpWzBdKTt2YXIgcz0kLmRhdGVwaWNrZXIuX2dldCh0LCJvblNlbGVjdCIpO2lmKHMpe3ZhciBvPSQuZGF0ZXBpY2tlci5fZm9ybWF0RGF0ZSh0KTtzLmFwcGx5KHQuaW5wdXQ/dC5pbnB1dFswXTpudWxsLFtvLHRdKX1lbHNlICQuZGF0ZXBpY2tlci5faGlkZURhdGVwaWNrZXIoKTtyZXR1cm4hMTtjYXNlIDI3OiQuZGF0ZXBpY2tlci5faGlkZURhdGVwaWNrZXIoKTticmVhaztjYXNlIDMzOiQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShlLnRhcmdldCxlLmN0cmxLZXk/LSQuZGF0ZXBpY2tlci5fZ2V0KHQsInN0ZXBCaWdNb250aHMiKTotJC5kYXRlcGlja2VyLl9nZXQodCwic3RlcE1vbnRocyIpLCJNIik7YnJlYWs7Y2FzZSAzNDokLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoZS50YXJnZXQsZS5jdHJsS2V5PyskLmRhdGVwaWNrZXIuX2dldCh0LCJzdGVwQmlnTW9udGhzIik6KyQuZGF0ZXBpY2tlci5fZ2V0KHQsInN0ZXBNb250aHMiKSwiTSIpO2JyZWFrO2Nhc2UgMzU6KGUuY3RybEtleXx8ZS5tZXRhS2V5KSYmJC5kYXRlcGlja2VyLl9jbGVhckRhdGUoZS50YXJnZXQpLG49ZS5jdHJsS2V5fHxlLm1ldGFLZXk7YnJlYWs7Y2FzZSAzNjooZS5jdHJsS2V5fHxlLm1ldGFLZXkpJiYkLmRhdGVwaWNrZXIuX2dvdG9Ub2RheShlLnRhcmdldCksbj1lLmN0cmxLZXl8fGUubWV0YUtleTticmVhaztjYXNlIDM3OihlLmN0cmxLZXl8fGUubWV0YUtleSkmJiQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShlLnRhcmdldCxyPzE6LTEsIkQiKSxuPWUuY3RybEtleXx8ZS5tZXRhS2V5LGUub3JpZ2luYWxFdmVudC5hbHRLZXkmJiQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShlLnRhcmdldCxlLmN0cmxLZXk/LSQuZGF0ZXBpY2tlci5fZ2V0KHQsInN0ZXBCaWdNb250aHMiKTotJC5kYXRlcGlja2VyLl9nZXQodCwic3RlcE1vbnRocyIpLCJNIik7YnJlYWs7Y2FzZSAzODooZS5jdHJsS2V5fHxlLm1ldGFLZXkpJiYkLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoZS50YXJnZXQsLTcsIkQiKSxuPWUuY3RybEtleXx8ZS5tZXRhS2V5O2JyZWFrO2Nhc2UgMzk6KGUuY3RybEtleXx8ZS5tZXRhS2V5KSYmJC5kYXRlcGlja2VyLl9hZGp1c3REYXRlKGUudGFyZ2V0LHI/LTE6MSwiRCIpLG49ZS5jdHJsS2V5fHxlLm1ldGFLZXksZS5vcmlnaW5hbEV2ZW50LmFsdEtleSYmJC5kYXRlcGlja2VyLl9hZGp1c3REYXRlKGUudGFyZ2V0LGUuY3RybEtleT8rJC5kYXRlcGlja2VyLl9nZXQodCwic3RlcEJpZ01vbnRocyIpOiskLmRhdGVwaWNrZXIuX2dldCh0LCJzdGVwTW9udGhzIiksIk0iKTticmVhaztjYXNlIDQwOihlLmN0cmxLZXl8fGUubWV0YUtleSkmJiQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShlLnRhcmdldCw3LCJEIiksbj1lLmN0cmxLZXl8fGUubWV0YUtleTticmVhaztkZWZhdWx0Om49ITF9ZWxzZSBlLmtleUNvZGU9PTM2JiZlLmN0cmxLZXk/JC5kYXRlcGlja2VyLl9zaG93RGF0ZXBpY2tlcih0aGlzKTpuPSExO24mJihlLnByZXZlbnREZWZhdWx0KCksZS5zdG9wUHJvcGFnYXRpb24oKSl9LF9kb0tleVByZXNzOmZ1bmN0aW9uKGUpe3ZhciB0PSQuZGF0ZXBpY2tlci5fZ2V0SW5zdChlLnRhcmdldCk7aWYoJC5kYXRlcGlja2VyLl9nZXQodCwiY29uc3RyYWluSW5wdXQiKSl7dmFyIG49JC5kYXRlcGlja2VyLl9wb3NzaWJsZUNoYXJzKCQuZGF0ZXBpY2tlci5fZ2V0KHQsImRhdGVGb3JtYXQiKSkscj1TdHJpbmcuZnJvbUNoYXJDb2RlKGUuY2hhckNvZGU9PXVuZGVmaW5lZD9lLmtleUNvZGU6ZS5jaGFyQ29kZSk7cmV0dXJuIGUuY3RybEtleXx8ZS5tZXRhS2V5fHxyPCIgInx8IW58fG4uaW5kZXhPZihyKT4tMX19LF9kb0tleVVwOmZ1bmN0aW9uKGUpe3ZhciB0PSQuZGF0ZXBpY2tlci5fZ2V0SW5zdChlLnRhcmdldCk7aWYodC5pbnB1dC52YWwoKSE9dC5sYXN0VmFsKXRyeXt2YXIgbj0kLmRhdGVwaWNrZXIucGFyc2VEYXRlKCQuZGF0ZXBpY2tlci5fZ2V0KHQsImRhdGVGb3JtYXQiKSx0LmlucHV0P3QuaW5wdXQudmFsKCk6bnVsbCwkLmRhdGVwaWNrZXIuX2dldEZvcm1hdENvbmZpZyh0KSk7biYmKCQuZGF0ZXBpY2tlci5fc2V0RGF0ZUZyb21GaWVsZCh0KSwkLmRhdGVwaWNrZXIuX3VwZGF0ZUFsdGVybmF0ZSh0KSwkLmRhdGVwaWNrZXIuX3VwZGF0ZURhdGVwaWNrZXIodCkpfWNhdGNoKHIpeyQuZGF0ZXBpY2tlci5sb2cocil9cmV0dXJuITB9LF9zaG93RGF0ZXBpY2tlcjpmdW5jdGlvbihlKXtlPWUudGFyZ2V0fHxlLGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSE9ImlucHV0IiYmKGU9JCgiaW5wdXQiLGUucGFyZW50Tm9kZSlbMF0pO2lmKCQuZGF0ZXBpY2tlci5faXNEaXNhYmxlZERhdGVwaWNrZXIoZSl8fCQuZGF0ZXBpY2tlci5fbGFzdElucHV0PT1lKXJldHVybjt2YXIgdD0kLmRhdGVwaWNrZXIuX2dldEluc3QoZSk7JC5kYXRlcGlja2VyLl9jdXJJbnN0JiYkLmRhdGVwaWNrZXIuX2N1ckluc3QhPXQmJigkLmRhdGVwaWNrZXIuX2N1ckluc3QuZHBEaXYuc3RvcCghMCwhMCksdCYmJC5kYXRlcGlja2VyLl9kYXRlcGlja2VyU2hvd2luZyYmJC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigkLmRhdGVwaWNrZXIuX2N1ckluc3QuaW5wdXRbMF0pKTt2YXIgbj0kLmRhdGVwaWNrZXIuX2dldCh0LCJiZWZvcmVTaG93Iikscj1uP24uYXBwbHkoZSxbZSx0XSk6e307aWYocj09PSExKXJldHVybjtleHRlbmRSZW1vdmUodC5zZXR0aW5ncyxyKSx0Lmxhc3RWYWw9bnVsbCwkLmRhdGVwaWNrZXIuX2xhc3RJbnB1dD1lLCQuZGF0ZXBpY2tlci5fc2V0RGF0ZUZyb21GaWVsZCh0KSwkLmRhdGVwaWNrZXIuX2luRGlhbG9nJiYoZS52YWx1ZT0iIiksJC5kYXRlcGlja2VyLl9wb3N8fCgkLmRhdGVwaWNrZXIuX3Bvcz0kLmRhdGVwaWNrZXIuX2ZpbmRQb3MoZSksJC5kYXRlcGlja2VyLl9wb3NbMV0rPWUub2Zmc2V0SGVpZ2h0KTt2YXIgaT0hMTskKGUpLnBhcmVudHMoKS5lYWNoKGZ1bmN0aW9uKCl7cmV0dXJuIGl8PSQodGhpcykuY3NzKCJwb3NpdGlvbiIpPT0iZml4ZWQiLCFpfSk7dmFyIHM9e2xlZnQ6JC5kYXRlcGlja2VyLl9wb3NbMF0sdG9wOiQuZGF0ZXBpY2tlci5fcG9zWzFdfTskLmRhdGVwaWNrZXIuX3Bvcz1udWxsLHQuZHBEaXYuZW1wdHkoKSx0LmRwRGl2LmNzcyh7cG9zaXRpb246ImFic29sdXRlIixkaXNwbGF5OiJibG9jayIsdG9wOiItMTAwMHB4In0pLCQuZGF0ZXBpY2tlci5fdXBkYXRlRGF0ZXBpY2tlcih0KSxzPSQuZGF0ZXBpY2tlci5fY2hlY2tPZmZzZXQodCxzLGkpLHQuZHBEaXYuY3NzKHtwb3NpdGlvbjokLmRhdGVwaWNrZXIuX2luRGlhbG9nJiYkLmJsb2NrVUk/InN0YXRpYyI6aT8iZml4ZWQiOiJhYnNvbHV0ZSIsZGlzcGxheToibm9uZSIsbGVmdDpzLmxlZnQrInB4Iix0b3A6cy50b3ArInB4In0pO2lmKCF0LmlubGluZSl7dmFyIG89JC5kYXRlcGlja2VyLl9nZXQodCwic2hvd0FuaW0iKSx1PSQuZGF0ZXBpY2tlci5fZ2V0KHQsImR1cmF0aW9uIiksYT1mdW5jdGlvbigpe3ZhciBlPXQuZHBEaXYuZmluZCgiaWZyYW1lLnVpLWRhdGVwaWNrZXItY292ZXIiKTtpZighIWUubGVuZ3RoKXt2YXIgbj0kLmRhdGVwaWNrZXIuX2dldEJvcmRlcnModC5kcERpdik7ZS5jc3Moe2xlZnQ6LW5bMF0sdG9wOi1uWzFdLHdpZHRoOnQuZHBEaXYub3V0ZXJXaWR0aCgpLGhlaWdodDp0LmRwRGl2Lm91dGVySGVpZ2h0KCl9KX19O3QuZHBEaXYuekluZGV4KCQoZSkuekluZGV4KCkrMSksJC5kYXRlcGlja2VyLl9kYXRlcGlja2VyU2hvd2luZz0hMCwkLmVmZmVjdHMmJigkLmVmZmVjdHMuZWZmZWN0W29dfHwkLmVmZmVjdHNbb10pP3QuZHBEaXYuc2hvdyhvLCQuZGF0ZXBpY2tlci5fZ2V0KHQsInNob3dPcHRpb25zIiksdSxhKTp0LmRwRGl2W298fCJzaG93Il0obz91Om51bGwsYSksKCFvfHwhdSkmJmEoKSx0LmlucHV0LmlzKCI6dmlzaWJsZSIpJiYhdC5pbnB1dC5pcygiOmRpc2FibGVkIikmJnQuaW5wdXQuZm9jdXMoKSwkLmRhdGVwaWNrZXIuX2N1ckluc3Q9dH19LF91cGRhdGVEYXRlcGlja2VyOmZ1bmN0aW9uKGUpe3RoaXMubWF4Um93cz00O3ZhciB0PSQuZGF0ZXBpY2tlci5fZ2V0Qm9yZGVycyhlLmRwRGl2KTtpbnN0QWN0aXZlPWUsZS5kcERpdi5lbXB0eSgpLmFwcGVuZCh0aGlzLl9nZW5lcmF0ZUhUTUwoZSkpLHRoaXMuX2F0dGFjaEhhbmRsZXJzKGUpO3ZhciBuPWUuZHBEaXYuZmluZCgiaWZyYW1lLnVpLWRhdGVwaWNrZXItY292ZXIiKTshbi5sZW5ndGh8fG4uY3NzKHtsZWZ0Oi10WzBdLHRvcDotdFsxXSx3aWR0aDplLmRwRGl2Lm91dGVyV2lkdGgoKSxoZWlnaHQ6ZS5kcERpdi5vdXRlckhlaWdodCgpfSksZS5kcERpdi5maW5kKCIuIit0aGlzLl9kYXlPdmVyQ2xhc3MrIiBhIikubW91c2VvdmVyKCk7dmFyIHI9dGhpcy5fZ2V0TnVtYmVyT2ZNb250aHMoZSksaT1yWzFdLHM9MTc7ZS5kcERpdi5yZW1vdmVDbGFzcygidWktZGF0ZXBpY2tlci1tdWx0aS0yIHVpLWRhdGVwaWNrZXItbXVsdGktMyB1aS1kYXRlcGlja2VyLW11bHRpLTQiKS53aWR0aCgiIiksaT4xJiZlLmRwRGl2LmFkZENsYXNzKCJ1aS1kYXRlcGlja2VyLW11bHRpLSIraSkuY3NzKCJ3aWR0aCIscyppKyJlbSIpLGUuZHBEaXZbKHJbMF0hPTF8fHJbMV0hPTE/ImFkZCI6InJlbW92ZSIpKyJDbGFzcyJdKCJ1aS1kYXRlcGlja2VyLW11bHRpIiksZS5kcERpdlsodGhpcy5fZ2V0KGUsImlzUlRMIik/ImFkZCI6InJlbW92ZSIpKyJDbGFzcyJdKCJ1aS1kYXRlcGlja2VyLXJ0bCIpLGU9PSQuZGF0ZXBpY2tlci5fY3VySW5zdCYmJC5kYXRlcGlja2VyLl9kYXRlcGlja2VyU2hvd2luZyYmZS5pbnB1dCYmZS5pbnB1dC5pcygiOnZpc2libGUiKSYmIWUuaW5wdXQuaXMoIjpkaXNhYmxlZCIpJiZlLmlucHV0WzBdIT1kb2N1bWVudC5hY3RpdmVFbGVtZW50JiZlLmlucHV0LmZvY3VzKCk7aWYoZS55ZWFyc2h0bWwpe3ZhciBvPWUueWVhcnNodG1sO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtvPT09ZS55ZWFyc2h0bWwmJmUueWVhcnNodG1sJiZlLmRwRGl2LmZpbmQoInNlbGVjdC51aS1kYXRlcGlja2VyLXllYXI6Zmlyc3QiKS5yZXBsYWNlV2l0aChlLnllYXJzaHRtbCksbz1lLnllYXJzaHRtbD1udWxsfSwwKX19LF9nZXRCb3JkZXJzOmZ1bmN0aW9uKGUpe3ZhciB0PWZ1bmN0aW9uKGUpe3JldHVybnt0aGluOjEsbWVkaXVtOjIsdGhpY2s6M31bZV18fGV9O3JldHVybltwYXJzZUZsb2F0KHQoZS5jc3MoImJvcmRlci1sZWZ0LXdpZHRoIikpKSxwYXJzZUZsb2F0KHQoZS5jc3MoImJvcmRlci10b3Atd2lkdGgiKSkpXX0sX2NoZWNrT2Zmc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lLmRwRGl2Lm91dGVyV2lkdGgoKSxpPWUuZHBEaXYub3V0ZXJIZWlnaHQoKSxzPWUuaW5wdXQ/ZS5pbnB1dC5vdXRlcldpZHRoKCk6MCxvPWUuaW5wdXQ/ZS5pbnB1dC5vdXRlckhlaWdodCgpOjAsdT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgrKG4/MDokKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCkpLGE9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCsobj8wOiQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpKTtyZXR1cm4gdC5sZWZ0LT10aGlzLl9nZXQoZSwiaXNSVEwiKT9yLXM6MCx0LmxlZnQtPW4mJnQubGVmdD09ZS5pbnB1dC5vZmZzZXQoKS5sZWZ0PyQoZG9jdW1lbnQpLnNjcm9sbExlZnQoKTowLHQudG9wLT1uJiZ0LnRvcD09ZS5pbnB1dC5vZmZzZXQoKS50b3Arbz8kKGRvY3VtZW50KS5zY3JvbGxUb3AoKTowLHQubGVmdC09TWF0aC5taW4odC5sZWZ0LHQubGVmdCtyPnUmJnU+cj9NYXRoLmFicyh0LmxlZnQrci11KTowKSx0LnRvcC09TWF0aC5taW4odC50b3AsdC50b3AraT5hJiZhPmk/TWF0aC5hYnMoaStvKTowKSx0fSxfZmluZFBvczpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9nZXRJbnN0KGUpLG49dGhpcy5fZ2V0KHQsImlzUlRMIik7d2hpbGUoZSYmKGUudHlwZT09ImhpZGRlbiJ8fGUubm9kZVR5cGUhPTF8fCQuZXhwci5maWx0ZXJzLmhpZGRlbihlKSkpZT1lW24/InByZXZpb3VzU2libGluZyI6Im5leHRTaWJsaW5nIl07dmFyIHI9JChlKS5vZmZzZXQoKTtyZXR1cm5bci5sZWZ0LHIudG9wXX0sX2hpZGVEYXRlcGlja2VyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2N1ckluc3Q7aWYoIXR8fGUmJnQhPSQuZGF0YShlLFBST1BfTkFNRSkpcmV0dXJuO2lmKHRoaXMuX2RhdGVwaWNrZXJTaG93aW5nKXt2YXIgbj10aGlzLl9nZXQodCwic2hvd0FuaW0iKSxyPXRoaXMuX2dldCh0LCJkdXJhdGlvbiIpLGk9ZnVuY3Rpb24oKXskLmRhdGVwaWNrZXIuX3RpZHlEaWFsb2codCl9OyQuZWZmZWN0cyYmKCQuZWZmZWN0cy5lZmZlY3Rbbl18fCQuZWZmZWN0c1tuXSk/dC5kcERpdi5oaWRlKG4sJC5kYXRlcGlja2VyLl9nZXQodCwic2hvd09wdGlvbnMiKSxyLGkpOnQuZHBEaXZbbj09InNsaWRlRG93biI/InNsaWRlVXAiOm49PSJmYWRlSW4iPyJmYWRlT3V0IjoiaGlkZSJdKG4/cjpudWxsLGkpLG58fGkoKSx0aGlzLl9kYXRlcGlja2VyU2hvd2luZz0hMTt2YXIgcz10aGlzLl9nZXQodCwib25DbG9zZSIpO3MmJnMuYXBwbHkodC5pbnB1dD90LmlucHV0WzBdOm51bGwsW3QuaW5wdXQ/dC5pbnB1dC52YWwoKToiIix0XSksdGhpcy5fbGFzdElucHV0PW51bGwsdGhpcy5faW5EaWFsb2cmJih0aGlzLl9kaWFsb2dJbnB1dC5jc3Moe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDoiMCIsdG9wOiItMTAwcHgifSksJC5ibG9ja1VJJiYoJC51bmJsb2NrVUkoKSwkKCJib2R5IikuYXBwZW5kKHRoaXMuZHBEaXYpKSksdGhpcy5faW5EaWFsb2c9ITF9fSxfdGlkeURpYWxvZzpmdW5jdGlvbihlKXtlLmRwRGl2LnJlbW92ZUNsYXNzKHRoaXMuX2RpYWxvZ0NsYXNzKS51bmJpbmQoIi51aS1kYXRlcGlja2VyLWNhbGVuZGFyIil9LF9jaGVja0V4dGVybmFsQ2xpY2s6ZnVuY3Rpb24oZSl7aWYoISQuZGF0ZXBpY2tlci5fY3VySW5zdClyZXR1cm47dmFyIHQ9JChlLnRhcmdldCksbj0kLmRhdGVwaWNrZXIuX2dldEluc3QodFswXSk7KHRbMF0uaWQhPSQuZGF0ZXBpY2tlci5fbWFpbkRpdklkJiZ0LnBhcmVudHMoIiMiKyQuZGF0ZXBpY2tlci5fbWFpbkRpdklkKS5sZW5ndGg9PTAmJiF0Lmhhc0NsYXNzKCQuZGF0ZXBpY2tlci5tYXJrZXJDbGFzc05hbWUpJiYhdC5jbG9zZXN0KCIuIiskLmRhdGVwaWNrZXIuX3RyaWdnZXJDbGFzcykubGVuZ3RoJiYkLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nJiYoISQuZGF0ZXBpY2tlci5faW5EaWFsb2d8fCEkLmJsb2NrVUkpfHx0Lmhhc0NsYXNzKCQuZGF0ZXBpY2tlci5tYXJrZXJDbGFzc05hbWUpJiYkLmRhdGVwaWNrZXIuX2N1ckluc3QhPW4pJiYkLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCl9LF9hZGp1c3REYXRlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0kKGUpLGk9dGhpcy5fZ2V0SW5zdChyWzBdKTtpZih0aGlzLl9pc0Rpc2FibGVkRGF0ZXBpY2tlcihyWzBdKSlyZXR1cm47dGhpcy5fYWRqdXN0SW5zdERhdGUoaSx0KyhuPT0iTSI/dGhpcy5fZ2V0KGksInNob3dDdXJyZW50QXRQb3MiKTowKSxuKSx0aGlzLl91cGRhdGVEYXRlcGlja2VyKGkpfSxfZ290b1RvZGF5OmZ1bmN0aW9uKGUpe3ZhciB0PSQoZSksbj10aGlzLl9nZXRJbnN0KHRbMF0pO2lmKHRoaXMuX2dldChuLCJnb3RvQ3VycmVudCIpJiZuLmN1cnJlbnREYXkpbi5zZWxlY3RlZERheT1uLmN1cnJlbnREYXksbi5kcmF3TW9udGg9bi5zZWxlY3RlZE1vbnRoPW4uY3VycmVudE1vbnRoLG4uZHJhd1llYXI9bi5zZWxlY3RlZFllYXI9bi5jdXJyZW50WWVhcjtlbHNle3ZhciByPW5ldyBEYXRlO24uc2VsZWN0ZWREYXk9ci5nZXREYXRlKCksbi5kcmF3TW9udGg9bi5zZWxlY3RlZE1vbnRoPXIuZ2V0TW9udGgoKSxuLmRyYXdZZWFyPW4uc2VsZWN0ZWRZZWFyPXIuZ2V0RnVsbFllYXIoKX10aGlzLl9ub3RpZnlDaGFuZ2UobiksdGhpcy5fYWRqdXN0RGF0ZSh0KX0sX3NlbGVjdE1vbnRoWWVhcjpmdW5jdGlvbihlLHQsbil7dmFyIHI9JChlKSxpPXRoaXMuX2dldEluc3QoclswXSk7aVsic2VsZWN0ZWQiKyhuPT0iTSI/Ik1vbnRoIjoiWWVhciIpXT1pWyJkcmF3Iisobj09Ik0iPyJNb250aCI6IlllYXIiKV09cGFyc2VJbnQodC5vcHRpb25zW3Quc2VsZWN0ZWRJbmRleF0udmFsdWUsMTApLHRoaXMuX25vdGlmeUNoYW5nZShpKSx0aGlzLl9hZGp1c3REYXRlKHIpfSxfc2VsZWN0RGF5OmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPSQoZSk7aWYoJChyKS5oYXNDbGFzcyh0aGlzLl91bnNlbGVjdGFibGVDbGFzcyl8fHRoaXMuX2lzRGlzYWJsZWREYXRlcGlja2VyKGlbMF0pKXJldHVybjt2YXIgcz10aGlzLl9nZXRJbnN0KGlbMF0pO3Muc2VsZWN0ZWREYXk9cy5jdXJyZW50RGF5PSQoImEiLHIpLmh0bWwoKSxzLnNlbGVjdGVkTW9udGg9cy5jdXJyZW50TW9udGg9dCxzLnNlbGVjdGVkWWVhcj1zLmN1cnJlbnRZZWFyPW4sdGhpcy5fc2VsZWN0RGF0ZShlLHRoaXMuX2Zvcm1hdERhdGUocyxzLmN1cnJlbnREYXkscy5jdXJyZW50TW9udGgscy5jdXJyZW50WWVhcikpfSxfY2xlYXJEYXRlOmZ1bmN0aW9uKGUpe3ZhciB0PSQoZSksbj10aGlzLl9nZXRJbnN0KHRbMF0pO3RoaXMuX3NlbGVjdERhdGUodCwiIil9LF9zZWxlY3REYXRlOmZ1bmN0aW9uKGUsdCl7dmFyIG49JChlKSxyPXRoaXMuX2dldEluc3QoblswXSk7dD10IT1udWxsP3Q6dGhpcy5fZm9ybWF0RGF0ZShyKSxyLmlucHV0JiZyLmlucHV0LnZhbCh0KSx0aGlzLl91cGRhdGVBbHRlcm5hdGUocik7dmFyIGk9dGhpcy5fZ2V0KHIsIm9uU2VsZWN0Iik7aT9pLmFwcGx5KHIuaW5wdXQ/ci5pbnB1dFswXTpudWxsLFt0LHJdKTpyLmlucHV0JiZyLmlucHV0LnRyaWdnZXIoImNoYW5nZSIpLHIuaW5saW5lP3RoaXMuX3VwZGF0ZURhdGVwaWNrZXIocik6KHRoaXMuX2hpZGVEYXRlcGlja2VyKCksdGhpcy5fbGFzdElucHV0PXIuaW5wdXRbMF0sdHlwZW9mIHIuaW5wdXRbMF0hPSJvYmplY3QiJiZyLmlucHV0LmZvY3VzKCksdGhpcy5fbGFzdElucHV0PW51bGwpfSxfdXBkYXRlQWx0ZXJuYXRlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2dldChlLCJhbHRGaWVsZCIpO2lmKHQpe3ZhciBuPXRoaXMuX2dldChlLCJhbHRGb3JtYXQiKXx8dGhpcy5fZ2V0KGUsImRhdGVGb3JtYXQiKSxyPXRoaXMuX2dldERhdGUoZSksaT10aGlzLmZvcm1hdERhdGUobixyLHRoaXMuX2dldEZvcm1hdENvbmZpZyhlKSk7JCh0KS5lYWNoKGZ1bmN0aW9uKCl7JCh0aGlzKS52YWwoaSl9KX19LG5vV2Vla2VuZHM6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5nZXREYXkoKTtyZXR1cm5bdD4wJiZ0PDYsIiJdfSxpc284NjAxV2VlazpmdW5jdGlvbihlKXt2YXIgdD1uZXcgRGF0ZShlLmdldFRpbWUoKSk7dC5zZXREYXRlKHQuZ2V0RGF0ZSgpKzQtKHQuZ2V0RGF5KCl8fDcpKTt2YXIgbj10LmdldFRpbWUoKTtyZXR1cm4gdC5zZXRNb250aCgwKSx0LnNldERhdGUoMSksTWF0aC5mbG9vcihNYXRoLnJvdW5kKChuLXQpLzg2NGU1KS83KSsxfSxwYXJzZURhdGU6ZnVuY3Rpb24oZSx0LG4pe2lmKGU9PW51bGx8fHQ9PW51bGwpdGhyb3ciSW52YWxpZCBhcmd1bWVudHMiO3Q9dHlwZW9mIHQ9PSJvYmplY3QiP3QudG9TdHJpbmcoKTp0KyIiO2lmKHQ9PSIiKXJldHVybiBudWxsO3ZhciByPShuP24uc2hvcnRZZWFyQ3V0b2ZmOm51bGwpfHx0aGlzLl9kZWZhdWx0cy5zaG9ydFllYXJDdXRvZmY7cj10eXBlb2YgciE9InN0cmluZyI/cjoobmV3IERhdGUpLmdldEZ1bGxZZWFyKCklMTAwK3BhcnNlSW50KHIsMTApO3ZhciBpPShuP24uZGF5TmFtZXNTaG9ydDpudWxsKXx8dGhpcy5fZGVmYXVsdHMuZGF5TmFtZXNTaG9ydCxzPShuP24uZGF5TmFtZXM6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLmRheU5hbWVzLG89KG4/bi5tb250aE5hbWVzU2hvcnQ6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLm1vbnRoTmFtZXNTaG9ydCx1PShuP24ubW9udGhOYW1lczpudWxsKXx8dGhpcy5fZGVmYXVsdHMubW9udGhOYW1lcyxhPS0xLGY9LTEsbD0tMSxjPS0xLGg9ITEscD1mdW5jdGlvbih0KXt2YXIgbj15KzE8ZS5sZW5ndGgmJmUuY2hhckF0KHkrMSk9PXQ7cmV0dXJuIG4mJnkrKyxufSxkPWZ1bmN0aW9uKGUpe3ZhciBuPXAoZSkscj1lPT0iQCI/MTQ6ZT09IiEiPzIwOmU9PSJ5IiYmbj80OmU9PSJvIj8zOjIsaT1uZXcgUmVnRXhwKCJeXFxkezEsIityKyJ9Iikscz10LnN1YnN0cmluZyhnKS5tYXRjaChpKTtpZighcyl0aHJvdyJNaXNzaW5nIG51bWJlciBhdCBwb3NpdGlvbiAiK2c7cmV0dXJuIGcrPXNbMF0ubGVuZ3RoLHBhcnNlSW50KHNbMF0sMTApfSx2PWZ1bmN0aW9uKGUsbixyKXt2YXIgaT0kLm1hcChwKGUpP3I6bixmdW5jdGlvbihlLHQpe3JldHVybltbdCxlXV19KS5zb3J0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuLShlWzFdLmxlbmd0aC10WzFdLmxlbmd0aCl9KSxzPS0xOyQuZWFjaChpLGZ1bmN0aW9uKGUsbil7dmFyIHI9blsxXTtpZih0LnN1YnN0cihnLHIubGVuZ3RoKS50b0xvd2VyQ2FzZSgpPT1yLnRvTG93ZXJDYXNlKCkpcmV0dXJuIHM9blswXSxnKz1yLmxlbmd0aCwhMX0pO2lmKHMhPS0xKXJldHVybiBzKzE7dGhyb3ciVW5rbm93biBuYW1lIGF0IHBvc2l0aW9uICIrZ30sbT1mdW5jdGlvbigpe2lmKHQuY2hhckF0KGcpIT1lLmNoYXJBdCh5KSl0aHJvdyJVbmV4cGVjdGVkIGxpdGVyYWwgYXQgcG9zaXRpb24gIitnO2crK30sZz0wO2Zvcih2YXIgeT0wO3k8ZS5sZW5ndGg7eSsrKWlmKGgpZS5jaGFyQXQoeSk9PSInIiYmIXAoIiciKT9oPSExOm0oKTtlbHNlIHN3aXRjaChlLmNoYXJBdCh5KSl7Y2FzZSJkIjpsPWQoImQiKTticmVhaztjYXNlIkQiOnYoIkQiLGkscyk7YnJlYWs7Y2FzZSJvIjpjPWQoIm8iKTticmVhaztjYXNlIm0iOmY9ZCgibSIpO2JyZWFrO2Nhc2UiTSI6Zj12KCJNIixvLHUpO2JyZWFrO2Nhc2UieSI6YT1kKCJ5Iik7YnJlYWs7Y2FzZSJAIjp2YXIgYj1uZXcgRGF0ZShkKCJAIikpO2E9Yi5nZXRGdWxsWWVhcigpLGY9Yi5nZXRNb250aCgpKzEsbD1iLmdldERhdGUoKTticmVhaztjYXNlIiEiOnZhciBiPW5ldyBEYXRlKChkKCIhIiktdGhpcy5fdGlja3NUbzE5NzApLzFlNCk7YT1iLmdldEZ1bGxZZWFyKCksZj1iLmdldE1vbnRoKCkrMSxsPWIuZ2V0RGF0ZSgpO2JyZWFrO2Nhc2UiJyI6cCgiJyIpP20oKTpoPSEwO2JyZWFrO2RlZmF1bHQ6bSgpfWlmKGc8dC5sZW5ndGgpe3ZhciB3PXQuc3Vic3RyKGcpO2lmKCEvXlxzKy8udGVzdCh3KSl0aHJvdyJFeHRyYS91bnBhcnNlZCBjaGFyYWN0ZXJzIGZvdW5kIGluIGRhdGU6ICIrd31hPT0tMT9hPShuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKTphPDEwMCYmKGErPShuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKS0obmV3IERhdGUpLmdldEZ1bGxZZWFyKCklMTAwKyhhPD1yPzA6LTEwMCkpO2lmKGM+LTEpe2Y9MSxsPWM7ZG97dmFyIEU9dGhpcy5fZ2V0RGF5c0luTW9udGgoYSxmLTEpO2lmKGw8PUUpYnJlYWs7ZisrLGwtPUV9d2hpbGUoITApfXZhciBiPXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGEsZi0xLGwpKTtpZihiLmdldEZ1bGxZZWFyKCkhPWF8fGIuZ2V0TW9udGgoKSsxIT1mfHxiLmdldERhdGUoKSE9bCl0aHJvdyJJbnZhbGlkIGRhdGUiO3JldHVybiBifSxBVE9NOiJ5eS1tbS1kZCIsQ09PS0lFOiJELCBkZCBNIHl5IixJU09fODYwMToieXktbW0tZGQiLFJGQ184MjI6IkQsIGQgTSB5IixSRkNfODUwOiJERCwgZGQtTS15IixSRkNfMTAzNjoiRCwgZCBNIHkiLFJGQ18xMTIzOiJELCBkIE0geXkiLFJGQ18yODIyOiJELCBkIE0geXkiLFJTUzoiRCwgZCBNIHkiLFRJQ0tTOiIhIixUSU1FU1RBTVA6IkAiLFczQzoieXktbW0tZGQiLF90aWNrc1RvMTk3MDooNzE4Njg1K01hdGguZmxvb3IoNDkyLjUpLU1hdGguZmxvb3IoMTkuNykrTWF0aC5mbG9vcig0LjkyNSkpKjI0KjYwKjYwKjFlNyxmb3JtYXREYXRlOmZ1bmN0aW9uKGUsdCxuKXtpZighdClyZXR1cm4iIjt2YXIgcj0obj9uLmRheU5hbWVzU2hvcnQ6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLmRheU5hbWVzU2hvcnQsaT0obj9uLmRheU5hbWVzOm51bGwpfHx0aGlzLl9kZWZhdWx0cy5kYXlOYW1lcyxzPShuP24ubW9udGhOYW1lc1Nob3J0Om51bGwpfHx0aGlzLl9kZWZhdWx0cy5tb250aE5hbWVzU2hvcnQsbz0obj9uLm1vbnRoTmFtZXM6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLm1vbnRoTmFtZXMsdT1mdW5jdGlvbih0KXt2YXIgbj1oKzE8ZS5sZW5ndGgmJmUuY2hhckF0KGgrMSk9PXQ7cmV0dXJuIG4mJmgrKyxufSxhPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0iIit0O2lmKHUoZSkpd2hpbGUoci5sZW5ndGg8bilyPSIwIityO3JldHVybiByfSxmPWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiB1KGUpP3JbdF06blt0XX0sbD0iIixjPSExO2lmKHQpZm9yKHZhciBoPTA7aDxlLmxlbmd0aDtoKyspaWYoYyllLmNoYXJBdChoKT09IiciJiYhdSgiJyIpP2M9ITE6bCs9ZS5jaGFyQXQoaCk7ZWxzZSBzd2l0Y2goZS5jaGFyQXQoaCkpe2Nhc2UiZCI6bCs9YSgiZCIsdC5nZXREYXRlKCksMik7YnJlYWs7Y2FzZSJEIjpsKz1mKCJEIix0LmdldERheSgpLHIsaSk7YnJlYWs7Y2FzZSJvIjpsKz1hKCJvIixNYXRoLnJvdW5kKCgobmV3IERhdGUodC5nZXRGdWxsWWVhcigpLHQuZ2V0TW9udGgoKSx0LmdldERhdGUoKSkpLmdldFRpbWUoKS0obmV3IERhdGUodC5nZXRGdWxsWWVhcigpLDAsMCkpLmdldFRpbWUoKSkvODY0ZTUpLDMpO2JyZWFrO2Nhc2UibSI6bCs9YSgibSIsdC5nZXRNb250aCgpKzEsMik7YnJlYWs7Y2FzZSJNIjpsKz1mKCJNIix0LmdldE1vbnRoKCkscyxvKTticmVhaztjYXNlInkiOmwrPXUoInkiKT90LmdldEZ1bGxZZWFyKCk6KHQuZ2V0WWVhcigpJTEwMDwxMD8iMCI6IiIpK3QuZ2V0WWVhcigpJTEwMDticmVhaztjYXNlIkAiOmwrPXQuZ2V0VGltZSgpO2JyZWFrO2Nhc2UiISI6bCs9dC5nZXRUaW1lKCkqMWU0K3RoaXMuX3RpY2tzVG8xOTcwO2JyZWFrO2Nhc2UiJyI6dSgiJyIpP2wrPSInIjpjPSEwO2JyZWFrO2RlZmF1bHQ6bCs9ZS5jaGFyQXQoaCl9cmV0dXJuIGx9LF9wb3NzaWJsZUNoYXJzOmZ1bmN0aW9uKGUpe3ZhciB0PSIiLG49ITEscj1mdW5jdGlvbih0KXt2YXIgbj1pKzE8ZS5sZW5ndGgmJmUuY2hhckF0KGkrMSk9PXQ7cmV0dXJuIG4mJmkrKyxufTtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKylpZihuKWUuY2hhckF0KGkpPT0iJyImJiFyKCInIik/bj0hMTp0Kz1lLmNoYXJBdChpKTtlbHNlIHN3aXRjaChlLmNoYXJBdChpKSl7Y2FzZSJkIjpjYXNlIm0iOmNhc2UieSI6Y2FzZSJAIjp0Kz0iMDEyMzQ1Njc4OSI7YnJlYWs7Y2FzZSJEIjpjYXNlIk0iOnJldHVybiBudWxsO2Nhc2UiJyI6cigiJyIpP3QrPSInIjpuPSEwO2JyZWFrO2RlZmF1bHQ6dCs9ZS5jaGFyQXQoaSl9cmV0dXJuIHR9LF9nZXQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5zZXR0aW5nc1t0XSE9PXVuZGVmaW5lZD9lLnNldHRpbmdzW3RdOnRoaXMuX2RlZmF1bHRzW3RdfSxfc2V0RGF0ZUZyb21GaWVsZDpmdW5jdGlvbihlLHQpe2lmKGUuaW5wdXQudmFsKCk9PWUubGFzdFZhbClyZXR1cm47dmFyIG49dGhpcy5fZ2V0KGUsImRhdGVGb3JtYXQiKSxyPWUubGFzdFZhbD1lLmlucHV0P2UuaW5wdXQudmFsKCk6bnVsbCxpLHM7aT1zPXRoaXMuX2dldERlZmF1bHREYXRlKGUpO3ZhciBvPXRoaXMuX2dldEZvcm1hdENvbmZpZyhlKTt0cnl7aT10aGlzLnBhcnNlRGF0ZShuLHIsbyl8fHN9Y2F0Y2godSl7dGhpcy5sb2codSkscj10PyIiOnJ9ZS5zZWxlY3RlZERheT1pLmdldERhdGUoKSxlLmRyYXdNb250aD1lLnNlbGVjdGVkTW9udGg9aS5nZXRNb250aCgpLGUuZHJhd1llYXI9ZS5zZWxlY3RlZFllYXI9aS5nZXRGdWxsWWVhcigpLGUuY3VycmVudERheT1yP2kuZ2V0RGF0ZSgpOjAsZS5jdXJyZW50TW9udGg9cj9pLmdldE1vbnRoKCk6MCxlLmN1cnJlbnRZZWFyPXI/aS5nZXRGdWxsWWVhcigpOjAsdGhpcy5fYWRqdXN0SW5zdERhdGUoZSl9LF9nZXREZWZhdWx0RGF0ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fcmVzdHJpY3RNaW5NYXgoZSx0aGlzLl9kZXRlcm1pbmVEYXRlKGUsdGhpcy5fZ2V0KGUsImRlZmF1bHREYXRlIiksbmV3IERhdGUpKX0sX2RldGVybWluZURhdGU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBEYXRlO3JldHVybiB0LnNldERhdGUodC5nZXREYXRlKCkrZSksdH0saT1mdW5jdGlvbih0KXt0cnl7cmV0dXJuICQuZGF0ZXBpY2tlci5wYXJzZURhdGUoJC5kYXRlcGlja2VyLl9nZXQoZSwiZGF0ZUZvcm1hdCIpLHQsJC5kYXRlcGlja2VyLl9nZXRGb3JtYXRDb25maWcoZSkpfWNhdGNoKG4pe312YXIgcj0odC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9eYy8pPyQuZGF0ZXBpY2tlci5fZ2V0RGF0ZShlKTpudWxsKXx8bmV3IERhdGUsaT1yLmdldEZ1bGxZZWFyKCkscz1yLmdldE1vbnRoKCksbz1yLmdldERhdGUoKSx1PS8oWystXT9bMC05XSspXHMqKGR8RHx3fFd8bXxNfHl8WSk/L2csYT11LmV4ZWModCk7d2hpbGUoYSl7c3dpdGNoKGFbMl18fCJkIil7Y2FzZSJkIjpjYXNlIkQiOm8rPXBhcnNlSW50KGFbMV0sMTApO2JyZWFrO2Nhc2UidyI6Y2FzZSJXIjpvKz1wYXJzZUludChhWzFdLDEwKSo3O2JyZWFrO2Nhc2UibSI6Y2FzZSJNIjpzKz1wYXJzZUludChhWzFdLDEwKSxvPU1hdGgubWluKG8sJC5kYXRlcGlja2VyLl9nZXREYXlzSW5Nb250aChpLHMpKTticmVhaztjYXNlInkiOmNhc2UiWSI6aSs9cGFyc2VJbnQoYVsxXSwxMCksbz1NYXRoLm1pbihvLCQuZGF0ZXBpY2tlci5fZ2V0RGF5c0luTW9udGgoaSxzKSl9YT11LmV4ZWModCl9cmV0dXJuIG5ldyBEYXRlKGkscyxvKX0scz10PT1udWxsfHx0PT09IiI/bjp0eXBlb2YgdD09InN0cmluZyI/aSh0KTp0eXBlb2YgdD09Im51bWJlciI/aXNOYU4odCk/bjpyKHQpOm5ldyBEYXRlKHQuZ2V0VGltZSgpKTtyZXR1cm4gcz1zJiZzLnRvU3RyaW5nKCk9PSJJbnZhbGlkIERhdGUiP246cyxzJiYocy5zZXRIb3VycygwKSxzLnNldE1pbnV0ZXMoMCkscy5zZXRTZWNvbmRzKDApLHMuc2V0TWlsbGlzZWNvbmRzKDApKSx0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChzKX0sX2RheWxpZ2h0U2F2aW5nQWRqdXN0OmZ1bmN0aW9uKGUpe3JldHVybiBlPyhlLnNldEhvdXJzKGUuZ2V0SG91cnMoKT4xMj9lLmdldEhvdXJzKCkrMjowKSxlKTpudWxsfSxfc2V0RGF0ZTpmdW5jdGlvbihlLHQsbil7dmFyIHI9IXQsaT1lLnNlbGVjdGVkTW9udGgscz1lLnNlbGVjdGVkWWVhcixvPXRoaXMuX3Jlc3RyaWN0TWluTWF4KGUsdGhpcy5fZGV0ZXJtaW5lRGF0ZShlLHQsbmV3IERhdGUpKTtlLnNlbGVjdGVkRGF5PWUuY3VycmVudERheT1vLmdldERhdGUoKSxlLmRyYXdNb250aD1lLnNlbGVjdGVkTW9udGg9ZS5jdXJyZW50TW9udGg9by5nZXRNb250aCgpLGUuZHJhd1llYXI9ZS5zZWxlY3RlZFllYXI9ZS5jdXJyZW50WWVhcj1vLmdldEZ1bGxZZWFyKCksKGkhPWUuc2VsZWN0ZWRNb250aHx8cyE9ZS5zZWxlY3RlZFllYXIpJiYhbiYmdGhpcy5fbm90aWZ5Q2hhbmdlKGUpLHRoaXMuX2FkanVzdEluc3REYXRlKGUpLGUuaW5wdXQmJmUuaW5wdXQudmFsKHI/IiI6dGhpcy5fZm9ybWF0RGF0ZShlKSl9LF9nZXREYXRlOmZ1bmN0aW9uKGUpe3ZhciB0PSFlLmN1cnJlbnRZZWFyfHxlLmlucHV0JiZlLmlucHV0LnZhbCgpPT0iIj9udWxsOnRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGUuY3VycmVudFllYXIsZS5jdXJyZW50TW9udGgsZS5jdXJyZW50RGF5KSk7cmV0dXJuIHR9LF9hdHRhY2hIYW5kbGVyczpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9nZXQoZSwic3RlcE1vbnRocyIpLG49IiMiK2UuaWQucmVwbGFjZSgvXFxcXC9nLCJcXCIpO2UuZHBEaXYuZmluZCgiW2RhdGEtaGFuZGxlcl0iKS5tYXAoZnVuY3Rpb24oKXt2YXIgZT17cHJldjpmdW5jdGlvbigpe3dpbmRvd1siRFBfalF1ZXJ5XyIrZHB1dWlkXS5kYXRlcGlja2VyLl9hZGp1c3REYXRlKG4sLXQsIk0iKX0sbmV4dDpmdW5jdGlvbigpe3dpbmRvd1siRFBfalF1ZXJ5XyIrZHB1dWlkXS5kYXRlcGlja2VyLl9hZGp1c3REYXRlKG4sK3QsIk0iKX0saGlkZTpmdW5jdGlvbigpe3dpbmRvd1siRFBfalF1ZXJ5XyIrZHB1dWlkXS5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpfSx0b2RheTpmdW5jdGlvbigpe3dpbmRvd1siRFBfalF1ZXJ5XyIrZHB1dWlkXS5kYXRlcGlja2VyLl9nb3RvVG9kYXkobil9LHNlbGVjdERheTpmdW5jdGlvbigpe3JldHVybiB3aW5kb3dbIkRQX2pRdWVyeV8iK2RwdXVpZF0uZGF0ZXBpY2tlci5fc2VsZWN0RGF5KG4sK3RoaXMuZ2V0QXR0cmlidXRlKCJkYXRhLW1vbnRoIiksK3RoaXMuZ2V0QXR0cmlidXRlKCJkYXRhLXllYXIiKSx0aGlzKSwhMX0sc2VsZWN0TW9udGg6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93WyJEUF9qUXVlcnlfIitkcHV1aWRdLmRhdGVwaWNrZXIuX3NlbGVjdE1vbnRoWWVhcihuLHRoaXMsIk0iKSwhMX0sc2VsZWN0WWVhcjpmdW5jdGlvbigpe3JldHVybiB3aW5kb3dbIkRQX2pRdWVyeV8iK2RwdXVpZF0uZGF0ZXBpY2tlci5fc2VsZWN0TW9udGhZZWFyKG4sdGhpcywiWSIpLCExfX07JCh0aGlzKS5iaW5kKHRoaXMuZ2V0QXR0cmlidXRlKCJkYXRhLWV2ZW50IiksZVt0aGlzLmdldEF0dHJpYnV0ZSgiZGF0YS1oYW5kbGVyIildKX0pfSxfZ2VuZXJhdGVIVE1MOmZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBEYXRlO3Q9dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUodC5nZXRGdWxsWWVhcigpLHQuZ2V0TW9udGgoKSx0LmdldERhdGUoKSkpO3ZhciBuPXRoaXMuX2dldChlLCJpc1JUTCIpLHI9dGhpcy5fZ2V0KGUsInNob3dCdXR0b25QYW5lbCIpLGk9dGhpcy5fZ2V0KGUsImhpZGVJZk5vUHJldk5leHQiKSxzPXRoaXMuX2dldChlLCJuYXZpZ2F0aW9uQXNEYXRlRm9ybWF0Iiksbz10aGlzLl9nZXROdW1iZXJPZk1vbnRocyhlKSx1PXRoaXMuX2dldChlLCJzaG93Q3VycmVudEF0UG9zIiksYT10aGlzLl9nZXQoZSwic3RlcE1vbnRocyIpLGY9b1swXSE9MXx8b1sxXSE9MSxsPXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KGUuY3VycmVudERheT9uZXcgRGF0ZShlLmN1cnJlbnRZZWFyLGUuY3VycmVudE1vbnRoLGUuY3VycmVudERheSk6bmV3IERhdGUoOTk5OSw5LDkpKSxjPXRoaXMuX2dldE1pbk1heERhdGUoZSwibWluIiksaD10aGlzLl9nZXRNaW5NYXhEYXRlKGUsIm1heCIpLHA9ZS5kcmF3TW9udGgtdSxkPWUuZHJhd1llYXI7cDwwJiYocCs9MTIsZC0tKTtpZihoKXt2YXIgdj10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShoLmdldEZ1bGxZZWFyKCksaC5nZXRNb250aCgpLW9bMF0qb1sxXSsxLGguZ2V0RGF0ZSgpKSk7dj1jJiZ2PGM/Yzp2O3doaWxlKHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGQscCwxKSk+dilwLS0scDwwJiYocD0xMSxkLS0pfWUuZHJhd01vbnRoPXAsZS5kcmF3WWVhcj1kO3ZhciBtPXRoaXMuX2dldChlLCJwcmV2VGV4dCIpO209cz90aGlzLmZvcm1hdERhdGUobSx0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShkLHAtYSwxKSksdGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKGUpKTptO3ZhciBnPXRoaXMuX2NhbkFkanVzdE1vbnRoKGUsLTEsZCxwKT8nPGEgY2xhc3M9InVpLWRhdGVwaWNrZXItcHJldiB1aS1jb3JuZXItYWxsIiBkYXRhLWhhbmRsZXI9InByZXYiIGRhdGEtZXZlbnQ9ImNsaWNrIiB0aXRsZT0iJyttKyciPjxzcGFuIGNsYXNzPSJ1aS1pY29uIHVpLWljb24tY2lyY2xlLXRyaWFuZ2xlLScrKG4/ImUiOiJ3IikrJyI+JyttKyI8L3NwYW4+PC9hPiI6aT8iIjonPGEgY2xhc3M9InVpLWRhdGVwaWNrZXItcHJldiB1aS1jb3JuZXItYWxsIHVpLXN0YXRlLWRpc2FibGVkIiB0aXRsZT0iJyttKyciPjxzcGFuIGNsYXNzPSJ1aS1pY29uIHVpLWljb24tY2lyY2xlLXRyaWFuZ2xlLScrKG4/ImUiOiJ3IikrJyI+JyttKyI8L3NwYW4+PC9hPiIseT10aGlzLl9nZXQoZSwibmV4dFRleHQiKTt5PXM/dGhpcy5mb3JtYXREYXRlKHksdGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoZCxwK2EsMSkpLHRoaXMuX2dldEZvcm1hdENvbmZpZyhlKSk6eTt2YXIgYj10aGlzLl9jYW5BZGp1c3RNb250aChlLDEsZCxwKT8nPGEgY2xhc3M9InVpLWRhdGVwaWNrZXItbmV4dCB1aS1jb3JuZXItYWxsIiBkYXRhLWhhbmRsZXI9Im5leHQiIGRhdGEtZXZlbnQ9ImNsaWNrIiB0aXRsZT0iJyt5KyciPjxzcGFuIGNsYXNzPSJ1aS1pY29uIHVpLWljb24tY2lyY2xlLXRyaWFuZ2xlLScrKG4/InciOiJlIikrJyI+Jyt5KyI8L3NwYW4+PC9hPiI6aT8iIjonPGEgY2xhc3M9InVpLWRhdGVwaWNrZXItbmV4dCB1aS1jb3JuZXItYWxsIHVpLXN0YXRlLWRpc2FibGVkIiB0aXRsZT0iJyt5KyciPjxzcGFuIGNsYXNzPSJ1aS1pY29uIHVpLWljb24tY2lyY2xlLXRyaWFuZ2xlLScrKG4/InciOiJlIikrJyI+Jyt5KyI8L3NwYW4+PC9hPiIsdz10aGlzLl9nZXQoZSwiY3VycmVudFRleHQiKSxFPXRoaXMuX2dldChlLCJnb3RvQ3VycmVudCIpJiZlLmN1cnJlbnREYXk/bDp0O3c9cz90aGlzLmZvcm1hdERhdGUodyxFLHRoaXMuX2dldEZvcm1hdENvbmZpZyhlKSk6dzt2YXIgUz1lLmlubGluZT8iIjonPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJ1aS1kYXRlcGlja2VyLWNsb3NlIHVpLXN0YXRlLWRlZmF1bHQgdWktcHJpb3JpdHktcHJpbWFyeSB1aS1jb3JuZXItYWxsIiBkYXRhLWhhbmRsZXI9ImhpZGUiIGRhdGEtZXZlbnQ9ImNsaWNrIj4nK3RoaXMuX2dldChlLCJjbG9zZVRleHQiKSsiPC9idXR0b24+Iix4PXI/JzxkaXYgY2xhc3M9InVpLWRhdGVwaWNrZXItYnV0dG9ucGFuZSB1aS13aWRnZXQtY29udGVudCI+Jysobj9TOiIiKSsodGhpcy5faXNJblJhbmdlKGUsRSk/JzxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0idWktZGF0ZXBpY2tlci1jdXJyZW50IHVpLXN0YXRlLWRlZmF1bHQgdWktcHJpb3JpdHktc2Vjb25kYXJ5IHVpLWNvcm5lci1hbGwiIGRhdGEtaGFuZGxlcj0idG9kYXkiIGRhdGEtZXZlbnQ9ImNsaWNrIj4nK3crIjwvYnV0dG9uPiI6IiIpKyhuPyIiOlMpKyI8L2Rpdj4iOiIiLFQ9cGFyc2VJbnQodGhpcy5fZ2V0KGUsImZpcnN0RGF5IiksMTApO1Q9aXNOYU4oVCk/MDpUO3ZhciBOPXRoaXMuX2dldChlLCJzaG93V2VlayIpLEM9dGhpcy5fZ2V0KGUsImRheU5hbWVzIiksaz10aGlzLl9nZXQoZSwiZGF5TmFtZXNTaG9ydCIpLEw9dGhpcy5fZ2V0KGUsImRheU5hbWVzTWluIiksQT10aGlzLl9nZXQoZSwibW9udGhOYW1lcyIpLE89dGhpcy5fZ2V0KGUsIm1vbnRoTmFtZXNTaG9ydCIpLE09dGhpcy5fZ2V0KGUsImJlZm9yZVNob3dEYXkiKSxfPXRoaXMuX2dldChlLCJzaG93T3RoZXJNb250aHMiKSxEPXRoaXMuX2dldChlLCJzZWxlY3RPdGhlck1vbnRocyIpLFA9dGhpcy5fZ2V0KGUsImNhbGN1bGF0ZVdlZWsiKXx8dGhpcy5pc284NjAxV2VlayxIPXRoaXMuX2dldERlZmF1bHREYXRlKGUpLEI9IiI7Zm9yKHZhciBqPTA7ajxvWzBdO2orKyl7dmFyIEY9IiI7dGhpcy5tYXhSb3dzPTQ7Zm9yKHZhciBJPTA7STxvWzFdO0krKyl7dmFyIHE9dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoZCxwLGUuc2VsZWN0ZWREYXkpKSxSPSIgdWktY29ybmVyLWFsbCIsVT0iIjtpZihmKXtVKz0nPGRpdiBjbGFzcz0idWktZGF0ZXBpY2tlci1ncm91cCc7aWYob1sxXT4xKXN3aXRjaChJKXtjYXNlIDA6VSs9IiB1aS1kYXRlcGlja2VyLWdyb3VwLWZpcnN0IixSPSIgdWktY29ybmVyLSIrKG4/InJpZ2h0IjoibGVmdCIpO2JyZWFrO2Nhc2Ugb1sxXS0xOlUrPSIgdWktZGF0ZXBpY2tlci1ncm91cC1sYXN0IixSPSIgdWktY29ybmVyLSIrKG4/ImxlZnQiOiJyaWdodCIpO2JyZWFrO2RlZmF1bHQ6VSs9IiB1aS1kYXRlcGlja2VyLWdyb3VwLW1pZGRsZSIsUj0iIn1VKz0nIj4nfVUrPSc8ZGl2IGNsYXNzPSJ1aS1kYXRlcGlja2VyLWhlYWRlciB1aS13aWRnZXQtaGVhZGVyIHVpLWhlbHBlci1jbGVhcmZpeCcrUisnIj4nKygvYWxsfGxlZnQvLnRlc3QoUikmJmo9PTA/bj9iOmc6IiIpKygvYWxsfHJpZ2h0Ly50ZXN0KFIpJiZqPT0wP24/ZzpiOiIiKSt0aGlzLl9nZW5lcmF0ZU1vbnRoWWVhckhlYWRlcihlLHAsZCxjLGgsaj4wfHxJPjAsQSxPKSsnPC9kaXY+PHRhYmxlIGNsYXNzPSJ1aS1kYXRlcGlja2VyLWNhbGVuZGFyIj48dGhlYWQ+JysiPHRyPiI7dmFyIHo9Tj8nPHRoIGNsYXNzPSJ1aS1kYXRlcGlja2VyLXdlZWstY29sIj4nK3RoaXMuX2dldChlLCJ3ZWVrSGVhZGVyIikrIjwvdGg+IjoiIjtmb3IodmFyIFc9MDtXPDc7VysrKXt2YXIgWD0oVytUKSU3O3orPSI8dGgiKygoVytUKzYpJTc+PTU/JyBjbGFzcz0idWktZGF0ZXBpY2tlci13ZWVrLWVuZCInOiIiKSsiPiIrJzxzcGFuIHRpdGxlPSInK0NbWF0rJyI+JytMW1hdKyI8L3NwYW4+PC90aD4ifVUrPXorIjwvdHI+PC90aGVhZD48dGJvZHk+Ijt2YXIgVj10aGlzLl9nZXREYXlzSW5Nb250aChkLHApO2Q9PWUuc2VsZWN0ZWRZZWFyJiZwPT1lLnNlbGVjdGVkTW9udGgmJihlLnNlbGVjdGVkRGF5PU1hdGgubWluKGUuc2VsZWN0ZWREYXksVikpO3ZhciBKPSh0aGlzLl9nZXRGaXJzdERheU9mTW9udGgoZCxwKS1UKzcpJTcsSz1NYXRoLmNlaWwoKEorVikvNyksUT1mP3RoaXMubWF4Um93cz5LP3RoaXMubWF4Um93czpLOks7dGhpcy5tYXhSb3dzPVE7dmFyIEc9dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoZCxwLDEtSikpO2Zvcih2YXIgWT0wO1k8UTtZKyspe1UrPSI8dHI+Ijt2YXIgWj1OPyc8dGQgY2xhc3M9InVpLWRhdGVwaWNrZXItd2Vlay1jb2wiPicrdGhpcy5fZ2V0KGUsImNhbGN1bGF0ZVdlZWsiKShHKSsiPC90ZD4iOiIiO2Zvcih2YXIgVz0wO1c8NztXKyspe3ZhciBldD1NP00uYXBwbHkoZS5pbnB1dD9lLmlucHV0WzBdOm51bGwsW0ddKTpbITAsIiJdLHR0PUcuZ2V0TW9udGgoKSE9cCxudD10dCYmIUR8fCFldFswXXx8YyYmRzxjfHxoJiZHPmg7Wis9Jzx0ZCBjbGFzcz0iJysoKFcrVCs2KSU3Pj01PyIgdWktZGF0ZXBpY2tlci13ZWVrLWVuZCI6IiIpKyh0dD8iIHVpLWRhdGVwaWNrZXItb3RoZXItbW9udGgiOiIiKSsoRy5nZXRUaW1lKCk9PXEuZ2V0VGltZSgpJiZwPT1lLnNlbGVjdGVkTW9udGgmJmUuX2tleUV2ZW50fHxILmdldFRpbWUoKT09Ry5nZXRUaW1lKCkmJkguZ2V0VGltZSgpPT1xLmdldFRpbWUoKT8iICIrdGhpcy5fZGF5T3ZlckNsYXNzOiIiKSsobnQ/IiAiK3RoaXMuX3Vuc2VsZWN0YWJsZUNsYXNzKyIgdWktc3RhdGUtZGlzYWJsZWQiOiIiKSsodHQmJiFfPyIiOiIgIitldFsxXSsoRy5nZXRUaW1lKCk9PWwuZ2V0VGltZSgpPyIgIit0aGlzLl9jdXJyZW50Q2xhc3M6IiIpKyhHLmdldFRpbWUoKT09dC5nZXRUaW1lKCk/IiB1aS1kYXRlcGlja2VyLXRvZGF5IjoiIikpKyciJysoKCF0dHx8XykmJmV0WzJdPycgdGl0bGU9IicrZXRbMl0rJyInOiIiKSsobnQ/IiI6JyBkYXRhLWhhbmRsZXI9InNlbGVjdERheSIgZGF0YS1ldmVudD0iY2xpY2siIGRhdGEtbW9udGg9IicrRy5nZXRNb250aCgpKyciIGRhdGEteWVhcj0iJytHLmdldEZ1bGxZZWFyKCkrJyInKSsiPiIrKHR0JiYhXz8iJiN4YTA7IjpudD8nPHNwYW4gY2xhc3M9InVpLXN0YXRlLWRlZmF1bHQiPicrRy5nZXREYXRlKCkrIjwvc3Bhbj4iOic8YSBjbGFzcz0idWktc3RhdGUtZGVmYXVsdCcrKEcuZ2V0VGltZSgpPT10LmdldFRpbWUoKT8iIHVpLXN0YXRlLWhpZ2hsaWdodCI6IiIpKyhHLmdldFRpbWUoKT09bC5nZXRUaW1lKCk/IiB1aS1zdGF0ZS1hY3RpdmUiOiIiKSsodHQ/IiB1aS1wcmlvcml0eS1zZWNvbmRhcnkiOiIiKSsnIiBocmVmPSIjIj4nK0cuZ2V0RGF0ZSgpKyI8L2E+IikrIjwvdGQ+IixHLnNldERhdGUoRy5nZXREYXRlKCkrMSksRz10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChHKX1VKz1aKyI8L3RyPiJ9cCsrLHA+MTEmJihwPTAsZCsrKSxVKz0iPC90Ym9keT48L3RhYmxlPiIrKGY/IjwvZGl2PiIrKG9bMF0+MCYmST09b1sxXS0xPyc8ZGl2IGNsYXNzPSJ1aS1kYXRlcGlja2VyLXJvdy1icmVhayI+PC9kaXY+JzoiIik6IiIpLEYrPVV9Qis9Rn1yZXR1cm4gQis9eCsoJC51aS5pZTYmJiFlLmlubGluZT8nPGlmcmFtZSBzcmM9ImphdmFzY3JpcHQ6ZmFsc2U7IiBjbGFzcz0idWktZGF0ZXBpY2tlci1jb3ZlciIgZnJhbWVib3JkZXI9IjAiPjwvaWZyYW1lPic6IiIpLGUuX2tleUV2ZW50PSExLEJ9LF9nZW5lcmF0ZU1vbnRoWWVhckhlYWRlcjpmdW5jdGlvbihlLHQsbixyLGkscyxvLHUpe3ZhciBhPXRoaXMuX2dldChlLCJjaGFuZ2VNb250aCIpLGY9dGhpcy5fZ2V0KGUsImNoYW5nZVllYXIiKSxsPXRoaXMuX2dldChlLCJzaG93TW9udGhBZnRlclllYXIiKSxjPSc8ZGl2IGNsYXNzPSJ1aS1kYXRlcGlja2VyLXRpdGxlIj4nLGg9IiI7aWYoc3x8IWEpaCs9JzxzcGFuIGNsYXNzPSJ1aS1kYXRlcGlja2VyLW1vbnRoIj4nK29bdF0rIjwvc3Bhbj4iO2Vsc2V7dmFyIHA9ciYmci5nZXRGdWxsWWVhcigpPT1uLGQ9aSYmaS5nZXRGdWxsWWVhcigpPT1uO2grPSc8c2VsZWN0IGNsYXNzPSJ1aS1kYXRlcGlja2VyLW1vbnRoIiBkYXRhLWhhbmRsZXI9InNlbGVjdE1vbnRoIiBkYXRhLWV2ZW50PSJjaGFuZ2UiPic7Zm9yKHZhciB2PTA7djwxMjt2KyspKCFwfHx2Pj1yLmdldE1vbnRoKCkpJiYoIWR8fHY8PWkuZ2V0TW9udGgoKSkmJihoKz0nPG9wdGlvbiB2YWx1ZT0iJyt2KyciJysodj09dD8nIHNlbGVjdGVkPSJzZWxlY3RlZCInOiIiKSsiPiIrdVt2XSsiPC9vcHRpb24+Iik7aCs9Ijwvc2VsZWN0PiJ9bHx8KGMrPWgrKHN8fCFhfHwhZj8iJiN4YTA7IjoiIikpO2lmKCFlLnllYXJzaHRtbCl7ZS55ZWFyc2h0bWw9IiI7aWYoc3x8IWYpYys9JzxzcGFuIGNsYXNzPSJ1aS1kYXRlcGlja2VyLXllYXIiPicrbisiPC9zcGFuPiI7ZWxzZXt2YXIgbT10aGlzLl9nZXQoZSwieWVhclJhbmdlIikuc3BsaXQoIjoiKSxnPShuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKSx5PWZ1bmN0aW9uKGUpe3ZhciB0PWUubWF0Y2goL2NbKy1dLiovKT9uK3BhcnNlSW50KGUuc3Vic3RyaW5nKDEpLDEwKTplLm1hdGNoKC9bKy1dLiovKT9nK3BhcnNlSW50KGUsMTApOnBhcnNlSW50KGUsMTApO3JldHVybiBpc05hTih0KT9nOnR9LGI9eShtWzBdKSx3PU1hdGgubWF4KGIseShtWzFdfHwiIikpO2I9cj9NYXRoLm1heChiLHIuZ2V0RnVsbFllYXIoKSk6Yix3PWk/TWF0aC5taW4odyxpLmdldEZ1bGxZZWFyKCkpOncsZS55ZWFyc2h0bWwrPSc8c2VsZWN0IGNsYXNzPSJ1aS1kYXRlcGlja2VyLXllYXIiIGRhdGEtaGFuZGxlcj0ic2VsZWN0WWVhciIgZGF0YS1ldmVudD0iY2hhbmdlIj4nO2Zvcig7Yjw9dztiKyspZS55ZWFyc2h0bWwrPSc8b3B0aW9uIHZhbHVlPSInK2IrJyInKyhiPT1uPycgc2VsZWN0ZWQ9InNlbGVjdGVkIic6IiIpKyI+IitiKyI8L29wdGlvbj4iO2UueWVhcnNodG1sKz0iPC9zZWxlY3Q+IixjKz1lLnllYXJzaHRtbCxlLnllYXJzaHRtbD1udWxsfX1yZXR1cm4gYys9dGhpcy5fZ2V0KGUsInllYXJTdWZmaXgiKSxsJiYoYys9KHN8fCFhfHwhZj8iJiN4YTA7IjoiIikraCksYys9IjwvZGl2PiIsY30sX2FkanVzdEluc3REYXRlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lLmRyYXdZZWFyKyhuPT0iWSI/dDowKSxpPWUuZHJhd01vbnRoKyhuPT0iTSI/dDowKSxzPU1hdGgubWluKGUuc2VsZWN0ZWREYXksdGhpcy5fZ2V0RGF5c0luTW9udGgocixpKSkrKG49PSJEIj90OjApLG89dGhpcy5fcmVzdHJpY3RNaW5NYXgoZSx0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShyLGkscykpKTtlLnNlbGVjdGVkRGF5PW8uZ2V0RGF0ZSgpLGUuZHJhd01vbnRoPWUuc2VsZWN0ZWRNb250aD1vLmdldE1vbnRoKCksZS5kcmF3WWVhcj1lLnNlbGVjdGVkWWVhcj1vLmdldEZ1bGxZZWFyKCksKG49PSJNInx8bj09IlkiKSYmdGhpcy5fbm90aWZ5Q2hhbmdlKGUpfSxfcmVzdHJpY3RNaW5NYXg6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLl9nZXRNaW5NYXhEYXRlKGUsIm1pbiIpLHI9dGhpcy5fZ2V0TWluTWF4RGF0ZShlLCJtYXgiKSxpPW4mJnQ8bj9uOnQ7cmV0dXJuIGk9ciYmaT5yP3I6aSxpfSxfbm90aWZ5Q2hhbmdlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2dldChlLCJvbkNoYW5nZU1vbnRoWWVhciIpO3QmJnQuYXBwbHkoZS5pbnB1dD9lLmlucHV0WzBdOm51bGwsW2Uuc2VsZWN0ZWRZZWFyLGUuc2VsZWN0ZWRNb250aCsxLGVdKX0sX2dldE51bWJlck9mTW9udGhzOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2dldChlLCJudW1iZXJPZk1vbnRocyIpO3JldHVybiB0PT1udWxsP1sxLDFdOnR5cGVvZiB0PT0ibnVtYmVyIj9bMSx0XTp0fSxfZ2V0TWluTWF4RGF0ZTpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLl9kZXRlcm1pbmVEYXRlKGUsdGhpcy5fZ2V0KGUsdCsiRGF0ZSIpLG51bGwpfSxfZ2V0RGF5c0luTW9udGg6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gMzItdGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoZSx0LDMyKSkuZ2V0RGF0ZSgpfSxfZ2V0Rmlyc3REYXlPZk1vbnRoOmZ1bmN0aW9uKGUsdCl7cmV0dXJuKG5ldyBEYXRlKGUsdCwxKSkuZ2V0RGF5KCl9LF9jYW5BZGp1c3RNb250aDpmdW5jdGlvbihlLHQsbixyKXt2YXIgaT10aGlzLl9nZXROdW1iZXJPZk1vbnRocyhlKSxzPXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKG4scisodDwwP3Q6aVswXSppWzFdKSwxKSk7cmV0dXJuIHQ8MCYmcy5zZXREYXRlKHRoaXMuX2dldERheXNJbk1vbnRoKHMuZ2V0RnVsbFllYXIoKSxzLmdldE1vbnRoKCkpKSx0aGlzLl9pc0luUmFuZ2UoZSxzKX0sX2lzSW5SYW5nZTpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuX2dldE1pbk1heERhdGUoZSwibWluIikscj10aGlzLl9nZXRNaW5NYXhEYXRlKGUsIm1heCIpO3JldHVybighbnx8dC5nZXRUaW1lKCk+PW4uZ2V0VGltZSgpKSYmKCFyfHx0LmdldFRpbWUoKTw9ci5nZXRUaW1lKCkpfSxfZ2V0Rm9ybWF0Q29uZmlnOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2dldChlLCJzaG9ydFllYXJDdXRvZmYiKTtyZXR1cm4gdD10eXBlb2YgdCE9InN0cmluZyI/dDoobmV3IERhdGUpLmdldEZ1bGxZZWFyKCklMTAwK3BhcnNlSW50KHQsMTApLHtzaG9ydFllYXJDdXRvZmY6dCxkYXlOYW1lc1Nob3J0OnRoaXMuX2dldChlLCJkYXlOYW1lc1Nob3J0IiksZGF5TmFtZXM6dGhpcy5fZ2V0KGUsImRheU5hbWVzIiksbW9udGhOYW1lc1Nob3J0OnRoaXMuX2dldChlLCJtb250aE5hbWVzU2hvcnQiKSxtb250aE5hbWVzOnRoaXMuX2dldChlLCJtb250aE5hbWVzIil9fSxfZm9ybWF0RGF0ZTpmdW5jdGlvbihlLHQsbixyKXt0fHwoZS5jdXJyZW50RGF5PWUuc2VsZWN0ZWREYXksZS5jdXJyZW50TW9udGg9ZS5zZWxlY3RlZE1vbnRoLGUuY3VycmVudFllYXI9ZS5zZWxlY3RlZFllYXIpO3ZhciBpPXQ/dHlwZW9mIHQ9PSJvYmplY3QiP3Q6dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUocixuLHQpKTp0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShlLmN1cnJlbnRZZWFyLGUuY3VycmVudE1vbnRoLGUuY3VycmVudERheSkpO3JldHVybiB0aGlzLmZvcm1hdERhdGUodGhpcy5fZ2V0KGUsImRhdGVGb3JtYXQiKSxpLHRoaXMuX2dldEZvcm1hdENvbmZpZyhlKSl9fSksJC5mbi5kYXRlcGlja2VyPWZ1bmN0aW9uKGUpe2lmKCF0aGlzLmxlbmd0aClyZXR1cm4gdGhpczskLmRhdGVwaWNrZXIuaW5pdGlhbGl6ZWR8fCgkKGRvY3VtZW50KS5tb3VzZWRvd24oJC5kYXRlcGlja2VyLl9jaGVja0V4dGVybmFsQ2xpY2spLmZpbmQoZG9jdW1lbnQuYm9keSkuYXBwZW5kKCQuZGF0ZXBpY2tlci5kcERpdiksJC5kYXRlcGlja2VyLmluaXRpYWxpemVkPSEwKTt2YXIgdD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSk7cmV0dXJuIHR5cGVvZiBlIT0ic3RyaW5nInx8ZSE9ImlzRGlzYWJsZWQiJiZlIT0iZ2V0RGF0ZSImJmUhPSJ3aWRnZXQiP2U9PSJvcHRpb24iJiZhcmd1bWVudHMubGVuZ3RoPT0yJiZ0eXBlb2YgYXJndW1lbnRzWzFdPT0ic3RyaW5nIj8kLmRhdGVwaWNrZXJbIl8iK2UrIkRhdGVwaWNrZXIiXS5hcHBseSgkLmRhdGVwaWNrZXIsW3RoaXNbMF1dLmNvbmNhdCh0KSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dHlwZW9mIGU9PSJzdHJpbmciPyQuZGF0ZXBpY2tlclsiXyIrZSsiRGF0ZXBpY2tlciJdLmFwcGx5KCQuZGF0ZXBpY2tlcixbdGhpc10uY29uY2F0KHQpKTokLmRhdGVwaWNrZXIuX2F0dGFjaERhdGVwaWNrZXIodGhpcyxlKX0pOiQuZGF0ZXBpY2tlclsiXyIrZSsiRGF0ZXBpY2tlciJdLmFwcGx5KCQuZGF0ZXBpY2tlcixbdGhpc1swXV0uY29uY2F0KHQpKX0sJC5kYXRlcGlja2VyPW5ldyBEYXRlcGlja2VyLCQuZGF0ZXBpY2tlci5pbml0aWFsaXplZD0hMSwkLmRhdGVwaWNrZXIudXVpZD0obmV3IERhdGUpLmdldFRpbWUoKSwkLmRhdGVwaWNrZXIudmVyc2lvbj0iMS45LjIiLHdpbmRvd1siRFBfalF1ZXJ5XyIrZHB1dWlkXT0kfSkoalF1ZXJ5KTsoZnVuY3Rpb24oZSx0KXt2YXIgbj0idWktZGlhbG9nIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsICIscj17YnV0dG9uczohMCxoZWlnaHQ6ITAsbWF4SGVpZ2h0OiEwLG1heFdpZHRoOiEwLG1pbkhlaWdodDohMCxtaW5XaWR0aDohMCx3aWR0aDohMH0saT17bWF4SGVpZ2h0OiEwLG1heFdpZHRoOiEwLG1pbkhlaWdodDohMCxtaW5XaWR0aDohMH07ZS53aWRnZXQoInVpLmRpYWxvZyIse3ZlcnNpb246IjEuOS4yIixvcHRpb25zOnthdXRvT3BlbjohMCxidXR0b25zOnt9LGNsb3NlT25Fc2NhcGU6ITAsY2xvc2VUZXh0OiJjbG9zZSIsZGlhbG9nQ2xhc3M6IiIsZHJhZ2dhYmxlOiEwLGhpZGU6bnVsbCxoZWlnaHQ6ImF1dG8iLG1heEhlaWdodDohMSxtYXhXaWR0aDohMSxtaW5IZWlnaHQ6MTUwLG1pbldpZHRoOjE1MCxtb2RhbDohMSxwb3NpdGlvbjp7bXk6ImNlbnRlciIsYXQ6ImNlbnRlciIsb2Y6d2luZG93LGNvbGxpc2lvbjoiZml0Iix1c2luZzpmdW5jdGlvbih0KXt2YXIgbj1lKHRoaXMpLmNzcyh0KS5vZmZzZXQoKS50b3A7bjwwJiZlKHRoaXMpLmNzcygidG9wIix0LnRvcC1uKX19LHJlc2l6YWJsZTohMCxzaG93Om51bGwsc3RhY2s6ITAsdGl0bGU6IiIsd2lkdGg6MzAwLHpJbmRleDoxZTN9LF9jcmVhdGU6ZnVuY3Rpb24oKXt0aGlzLm9yaWdpbmFsVGl0bGU9dGhpcy5lbGVtZW50LmF0dHIoInRpdGxlIiksdHlwZW9mIHRoaXMub3JpZ2luYWxUaXRsZSE9InN0cmluZyImJih0aGlzLm9yaWdpbmFsVGl0bGU9IiIpLHRoaXMub2xkUG9zaXRpb249e3BhcmVudDp0aGlzLmVsZW1lbnQucGFyZW50KCksaW5kZXg6dGhpcy5lbGVtZW50LnBhcmVudCgpLmNoaWxkcmVuKCkuaW5kZXgodGhpcy5lbGVtZW50KX0sdGhpcy5vcHRpb25zLnRpdGxlPXRoaXMub3B0aW9ucy50aXRsZXx8dGhpcy5vcmlnaW5hbFRpdGxlO3ZhciB0PXRoaXMscj10aGlzLm9wdGlvbnMsaT1yLnRpdGxlfHwiJiMxNjA7IixzLG8sdSxhLGY7cz0odGhpcy51aURpYWxvZz1lKCI8ZGl2PiIpKS5hZGRDbGFzcyhuK3IuZGlhbG9nQ2xhc3MpLmNzcyh7ZGlzcGxheToibm9uZSIsb3V0bGluZTowLHpJbmRleDpyLnpJbmRleH0pLmF0dHIoInRhYkluZGV4IiwtMSkua2V5ZG93bihmdW5jdGlvbihuKXtyLmNsb3NlT25Fc2NhcGUmJiFuLmlzRGVmYXVsdFByZXZlbnRlZCgpJiZuLmtleUNvZGUmJm4ua2V5Q29kZT09PWUudWkua2V5Q29kZS5FU0NBUEUmJih0LmNsb3NlKG4pLG4ucHJldmVudERlZmF1bHQoKSl9KS5tb3VzZWRvd24oZnVuY3Rpb24oZSl7dC5tb3ZlVG9Ub3AoITEsZSl9KS5hcHBlbmRUbygiYm9keSIpLHRoaXMuZWxlbWVudC5zaG93KCkucmVtb3ZlQXR0cigidGl0bGUiKS5hZGRDbGFzcygidWktZGlhbG9nLWNvbnRlbnQgdWktd2lkZ2V0LWNvbnRlbnQiKS5hcHBlbmRUbyhzKSxvPSh0aGlzLnVpRGlhbG9nVGl0bGViYXI9ZSgiPGRpdj4iKSkuYWRkQ2xhc3MoInVpLWRpYWxvZy10aXRsZWJhciAgdWktd2lkZ2V0LWhlYWRlciAgdWktY29ybmVyLWFsbCAgdWktaGVscGVyLWNsZWFyZml4IikuYmluZCgibW91c2Vkb3duIixmdW5jdGlvbigpe3MuZm9jdXMoKX0pLnByZXBlbmRUbyhzKSx1PWUoIjxhIGhyZWY9JyMnPjwvYT4iKS5hZGRDbGFzcygidWktZGlhbG9nLXRpdGxlYmFyLWNsb3NlICB1aS1jb3JuZXItYWxsIikuYXR0cigicm9sZSIsImJ1dHRvbiIpLmNsaWNrKGZ1bmN0aW9uKGUpe2UucHJldmVudERlZmF1bHQoKSx0LmNsb3NlKGUpfSkuYXBwZW5kVG8obyksKHRoaXMudWlEaWFsb2dUaXRsZWJhckNsb3NlVGV4dD1lKCI8c3Bhbj4iKSkuYWRkQ2xhc3MoInVpLWljb24gdWktaWNvbi1jbG9zZXRoaWNrIikudGV4dChyLmNsb3NlVGV4dCkuYXBwZW5kVG8odSksYT1lKCI8c3Bhbj4iKS51bmlxdWVJZCgpLmFkZENsYXNzKCJ1aS1kaWFsb2ctdGl0bGUiKS5odG1sKGkpLnByZXBlbmRUbyhvKSxmPSh0aGlzLnVpRGlhbG9nQnV0dG9uUGFuZT1lKCI8ZGl2PiIpKS5hZGRDbGFzcygidWktZGlhbG9nLWJ1dHRvbnBhbmUgdWktd2lkZ2V0LWNvbnRlbnQgdWktaGVscGVyLWNsZWFyZml4IiksKHRoaXMudWlCdXR0b25TZXQ9ZSgiPGRpdj4iKSkuYWRkQ2xhc3MoInVpLWRpYWxvZy1idXR0b25zZXQiKS5hcHBlbmRUbyhmKSxzLmF0dHIoe3JvbGU6ImRpYWxvZyIsImFyaWEtbGFiZWxsZWRieSI6YS5hdHRyKCJpZCIpfSksby5maW5kKCIqIikuYWRkKG8pLmRpc2FibGVTZWxlY3Rpb24oKSx0aGlzLl9ob3ZlcmFibGUodSksdGhpcy5fZm9jdXNhYmxlKHUpLHIuZHJhZ2dhYmxlJiZlLmZuLmRyYWdnYWJsZSYmdGhpcy5fbWFrZURyYWdnYWJsZSgpLHIucmVzaXphYmxlJiZlLmZuLnJlc2l6YWJsZSYmdGhpcy5fbWFrZVJlc2l6YWJsZSgpLHRoaXMuX2NyZWF0ZUJ1dHRvbnMoci5idXR0b25zKSx0aGlzLl9pc09wZW49ITEsZS5mbi5iZ2lmcmFtZSYmcy5iZ2lmcmFtZSgpLHRoaXMuX29uKHMse2tleWRvd246ZnVuY3Rpb24odCl7aWYoIXIubW9kYWx8fHQua2V5Q29kZSE9PWUudWkua2V5Q29kZS5UQUIpcmV0dXJuO3ZhciBuPWUoIjp0YWJiYWJsZSIscyksaT1uLmZpbHRlcigiOmZpcnN0Iiksbz1uLmZpbHRlcigiOmxhc3QiKTtpZih0LnRhcmdldD09PW9bMF0mJiF0LnNoaWZ0S2V5KXJldHVybiBpLmZvY3VzKDEpLCExO2lmKHQudGFyZ2V0PT09aVswXSYmdC5zaGlmdEtleSlyZXR1cm4gby5mb2N1cygxKSwhMX19KX0sX2luaXQ6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMuYXV0b09wZW4mJnRoaXMub3BlbigpfSxfZGVzdHJveTpmdW5jdGlvbigpe3ZhciBlLHQ9dGhpcy5vbGRQb3NpdGlvbjt0aGlzLm92ZXJsYXkmJnRoaXMub3ZlcmxheS5kZXN0cm95KCksdGhpcy51aURpYWxvZy5oaWRlKCksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1kaWFsb2ctY29udGVudCB1aS13aWRnZXQtY29udGVudCIpLmhpZGUoKS5hcHBlbmRUbygiYm9keSIpLHRoaXMudWlEaWFsb2cucmVtb3ZlKCksdGhpcy5vcmlnaW5hbFRpdGxlJiZ0aGlzLmVsZW1lbnQuYXR0cigidGl0bGUiLHRoaXMub3JpZ2luYWxUaXRsZSksZT10LnBhcmVudC5jaGlsZHJlbigpLmVxKHQuaW5kZXgpLGUubGVuZ3RoJiZlWzBdIT09dGhpcy5lbGVtZW50WzBdP2UuYmVmb3JlKHRoaXMuZWxlbWVudCk6dC5wYXJlbnQuYXBwZW5kKHRoaXMuZWxlbWVudCl9LHdpZGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVpRGlhbG9nfSxjbG9zZTpmdW5jdGlvbih0KXt2YXIgbj10aGlzLHIsaTtpZighdGhpcy5faXNPcGVuKXJldHVybjtpZighMT09PXRoaXMuX3RyaWdnZXIoImJlZm9yZUNsb3NlIix0KSlyZXR1cm47cmV0dXJuIHRoaXMuX2lzT3Blbj0hMSx0aGlzLm92ZXJsYXkmJnRoaXMub3ZlcmxheS5kZXN0cm95KCksdGhpcy5vcHRpb25zLmhpZGU/dGhpcy5faGlkZSh0aGlzLnVpRGlhbG9nLHRoaXMub3B0aW9ucy5oaWRlLGZ1bmN0aW9uKCl7bi5fdHJpZ2dlcigiY2xvc2UiLHQpfSk6KHRoaXMudWlEaWFsb2cuaGlkZSgpLHRoaXMuX3RyaWdnZXIoImNsb3NlIix0KSksZS51aS5kaWFsb2cub3ZlcmxheS5yZXNpemUoKSx0aGlzLm9wdGlvbnMubW9kYWwmJihyPTAsZSgiLnVpLWRpYWxvZyIpLmVhY2goZnVuY3Rpb24oKXt0aGlzIT09bi51aURpYWxvZ1swXSYmKGk9ZSh0aGlzKS5jc3MoInotaW5kZXgiKSxpc05hTihpKXx8KHI9TWF0aC5tYXgocixpKSkpfSksZS51aS5kaWFsb2cubWF4Wj1yKSx0aGlzfSxpc09wZW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNPcGVufSxtb3ZlVG9Ub3A6ZnVuY3Rpb24odCxuKXt2YXIgcj10aGlzLm9wdGlvbnMsaTtyZXR1cm4gci5tb2RhbCYmIXR8fCFyLnN0YWNrJiYhci5tb2RhbD90aGlzLl90cmlnZ2VyKCJmb2N1cyIsbik6KHIuekluZGV4PmUudWkuZGlhbG9nLm1heFomJihlLnVpLmRpYWxvZy5tYXhaPXIuekluZGV4KSx0aGlzLm92ZXJsYXkmJihlLnVpLmRpYWxvZy5tYXhaKz0xLGUudWkuZGlhbG9nLm92ZXJsYXkubWF4Wj1lLnVpLmRpYWxvZy5tYXhaLHRoaXMub3ZlcmxheS4kZWwuY3NzKCJ6LWluZGV4IixlLnVpLmRpYWxvZy5vdmVybGF5Lm1heFopKSxpPXtzY3JvbGxUb3A6dGhpcy5lbGVtZW50LnNjcm9sbFRvcCgpLHNjcm9sbExlZnQ6dGhpcy5lbGVtZW50LnNjcm9sbExlZnQoKX0sZS51aS5kaWFsb2cubWF4Wis9MSx0aGlzLnVpRGlhbG9nLmNzcygiei1pbmRleCIsZS51aS5kaWFsb2cubWF4WiksdGhpcy5lbGVtZW50LmF0dHIoaSksdGhpcy5fdHJpZ2dlcigiZm9jdXMiLG4pLHRoaXMpfSxvcGVuOmZ1bmN0aW9uKCl7aWYodGhpcy5faXNPcGVuKXJldHVybjt2YXIgdCxuPXRoaXMub3B0aW9ucyxyPXRoaXMudWlEaWFsb2c7cmV0dXJuIHRoaXMuX3NpemUoKSx0aGlzLl9wb3NpdGlvbihuLnBvc2l0aW9uKSxyLnNob3cobi5zaG93KSx0aGlzLm92ZXJsYXk9bi5tb2RhbD9uZXcgZS51aS5kaWFsb2cub3ZlcmxheSh0aGlzKTpudWxsLHRoaXMubW92ZVRvVG9wKCEwKSx0PXRoaXMuZWxlbWVudC5maW5kKCI6dGFiYmFibGUiKSx0Lmxlbmd0aHx8KHQ9dGhpcy51aURpYWxvZ0J1dHRvblBhbmUuZmluZCgiOnRhYmJhYmxlIiksdC5sZW5ndGh8fCh0PXIpKSx0LmVxKDApLmZvY3VzKCksdGhpcy5faXNPcGVuPSEwLHRoaXMuX3RyaWdnZXIoIm9wZW4iKSx0aGlzfSxfY3JlYXRlQnV0dG9uczpmdW5jdGlvbih0KXt2YXIgbj10aGlzLHI9ITE7dGhpcy51aURpYWxvZ0J1dHRvblBhbmUucmVtb3ZlKCksdGhpcy51aUJ1dHRvblNldC5lbXB0eSgpLHR5cGVvZiB0PT0ib2JqZWN0IiYmdCE9PW51bGwmJmUuZWFjaCh0LGZ1bmN0aW9uKCl7cmV0dXJuIShyPSEwKX0pLHI/KGUuZWFjaCh0LGZ1bmN0aW9uKHQscil7dmFyIGkscztyPWUuaXNGdW5jdGlvbihyKT97Y2xpY2s6cix0ZXh0OnR9OnIscj1lLmV4dGVuZCh7dHlwZToiYnV0dG9uIn0scikscz1yLmNsaWNrLHIuY2xpY2s9ZnVuY3Rpb24oKXtzLmFwcGx5KG4uZWxlbWVudFswXSxhcmd1bWVudHMpfSxpPWUoIjxidXR0b24+PC9idXR0b24+IixyKS5hcHBlbmRUbyhuLnVpQnV0dG9uU2V0KSxlLmZuLmJ1dHRvbiYmaS5idXR0b24oKX0pLHRoaXMudWlEaWFsb2cuYWRkQ2xhc3MoInVpLWRpYWxvZy1idXR0b25zIiksdGhpcy51aURpYWxvZ0J1dHRvblBhbmUuYXBwZW5kVG8odGhpcy51aURpYWxvZykpOnRoaXMudWlEaWFsb2cucmVtb3ZlQ2xhc3MoInVpLWRpYWxvZy1idXR0b25zIil9LF9tYWtlRHJhZ2dhYmxlOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlKXtyZXR1cm57cG9zaXRpb246ZS5wb3NpdGlvbixvZmZzZXQ6ZS5vZmZzZXR9fXZhciB0PXRoaXMsbj10aGlzLm9wdGlvbnM7dGhpcy51aURpYWxvZy5kcmFnZ2FibGUoe2NhbmNlbDoiLnVpLWRpYWxvZy1jb250ZW50LCAudWktZGlhbG9nLXRpdGxlYmFyLWNsb3NlIixoYW5kbGU6Ii51aS1kaWFsb2ctdGl0bGViYXIiLGNvbnRhaW5tZW50OiJkb2N1bWVudCIsc3RhcnQ6ZnVuY3Rpb24obixpKXtlKHRoaXMpLmFkZENsYXNzKCJ1aS1kaWFsb2ctZHJhZ2dpbmciKSx0Ll90cmlnZ2VyKCJkcmFnU3RhcnQiLG4scihpKSl9LGRyYWc6ZnVuY3Rpb24oZSxuKXt0Ll90cmlnZ2VyKCJkcmFnIixlLHIobikpfSxzdG9wOmZ1bmN0aW9uKGkscyl7bi5wb3NpdGlvbj1bcy5wb3NpdGlvbi5sZWZ0LXQuZG9jdW1lbnQuc2Nyb2xsTGVmdCgpLHMucG9zaXRpb24udG9wLXQuZG9jdW1lbnQuc2Nyb2xsVG9wKCldLGUodGhpcykucmVtb3ZlQ2xhc3MoInVpLWRpYWxvZy1kcmFnZ2luZyIpLHQuX3RyaWdnZXIoImRyYWdTdG9wIixpLHIocykpLGUudWkuZGlhbG9nLm92ZXJsYXkucmVzaXplKCl9fSl9LF9tYWtlUmVzaXphYmxlOmZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHUoZSl7cmV0dXJue29yaWdpbmFsUG9zaXRpb246ZS5vcmlnaW5hbFBvc2l0aW9uLG9yaWdpbmFsU2l6ZTplLm9yaWdpbmFsU2l6ZSxwb3NpdGlvbjplLnBvc2l0aW9uLHNpemU6ZS5zaXplfX1uPW49PT10P3RoaXMub3B0aW9ucy5yZXNpemFibGU6bjt2YXIgcj10aGlzLGk9dGhpcy5vcHRpb25zLHM9dGhpcy51aURpYWxvZy5jc3MoInBvc2l0aW9uIiksbz10eXBlb2Ygbj09InN0cmluZyI/bjoibixlLHMsdyxzZSxzdyxuZSxudyI7dGhpcy51aURpYWxvZy5yZXNpemFibGUoe2NhbmNlbDoiLnVpLWRpYWxvZy1jb250ZW50Iixjb250YWlubWVudDoiZG9jdW1lbnQiLGFsc29SZXNpemU6dGhpcy5lbGVtZW50LG1heFdpZHRoOmkubWF4V2lkdGgsbWF4SGVpZ2h0OmkubWF4SGVpZ2h0LG1pbldpZHRoOmkubWluV2lkdGgsbWluSGVpZ2h0OnRoaXMuX21pbkhlaWdodCgpLGhhbmRsZXM6byxzdGFydDpmdW5jdGlvbih0LG4pe2UodGhpcykuYWRkQ2xhc3MoInVpLWRpYWxvZy1yZXNpemluZyIpLHIuX3RyaWdnZXIoInJlc2l6ZVN0YXJ0Iix0LHUobikpfSxyZXNpemU6ZnVuY3Rpb24oZSx0KXtyLl90cmlnZ2VyKCJyZXNpemUiLGUsdSh0KSl9LHN0b3A6ZnVuY3Rpb24odCxuKXtlKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1kaWFsb2ctcmVzaXppbmciKSxpLmhlaWdodD1lKHRoaXMpLmhlaWdodCgpLGkud2lkdGg9ZSh0aGlzKS53aWR0aCgpLHIuX3RyaWdnZXIoInJlc2l6ZVN0b3AiLHQsdShuKSksZS51aS5kaWFsb2cub3ZlcmxheS5yZXNpemUoKX19KS5jc3MoInBvc2l0aW9uIixzKS5maW5kKCIudWktcmVzaXphYmxlLXNlIikuYWRkQ2xhc3MoInVpLWljb24gdWktaWNvbi1ncmlwLWRpYWdvbmFsLXNlIil9LF9taW5IZWlnaHQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9wdGlvbnM7cmV0dXJuIGUuaGVpZ2h0PT09ImF1dG8iP2UubWluSGVpZ2h0Ok1hdGgubWluKGUubWluSGVpZ2h0LGUuaGVpZ2h0KX0sX3Bvc2l0aW9uOmZ1bmN0aW9uKHQpe3ZhciBuPVtdLHI9WzAsMF0saTtpZih0KXtpZih0eXBlb2YgdD09InN0cmluZyJ8fHR5cGVvZiB0PT0ib2JqZWN0IiYmIjAiaW4gdCluPXQuc3BsaXQ/dC5zcGxpdCgiICIpOlt0WzBdLHRbMV1dLG4ubGVuZ3RoPT09MSYmKG5bMV09blswXSksZS5lYWNoKFsibGVmdCIsInRvcCJdLGZ1bmN0aW9uKGUsdCl7K25bZV09PT1uW2VdJiYocltlXT1uW2VdLG5bZV09dCl9KSx0PXtteTpuWzBdKyhyWzBdPDA/clswXToiKyIrclswXSkrIiAiK25bMV0rKHJbMV08MD9yWzFdOiIrIityWzFdKSxhdDpuLmpvaW4oIiAiKX07dD1lLmV4dGVuZCh7fSxlLnVpLmRpYWxvZy5wcm90b3R5cGUub3B0aW9ucy5wb3NpdGlvbix0KX1lbHNlIHQ9ZS51aS5kaWFsb2cucHJvdG90eXBlLm9wdGlvbnMucG9zaXRpb247aT10aGlzLnVpRGlhbG9nLmlzKCI6dmlzaWJsZSIpLGl8fHRoaXMudWlEaWFsb2cuc2hvdygpLHRoaXMudWlEaWFsb2cucG9zaXRpb24odCksaXx8dGhpcy51aURpYWxvZy5oaWRlKCl9LF9zZXRPcHRpb25zOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMscz17fSxvPSExO2UuZWFjaCh0LGZ1bmN0aW9uKGUsdCl7bi5fc2V0T3B0aW9uKGUsdCksZSBpbiByJiYobz0hMCksZSBpbiBpJiYoc1tlXT10KX0pLG8mJnRoaXMuX3NpemUoKSx0aGlzLnVpRGlhbG9nLmlzKCI6ZGF0YShyZXNpemFibGUpIikmJnRoaXMudWlEaWFsb2cucmVzaXphYmxlKCJvcHRpb24iLHMpfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKHQscil7dmFyIGkscyxvPXRoaXMudWlEaWFsb2c7c3dpdGNoKHQpe2Nhc2UiYnV0dG9ucyI6dGhpcy5fY3JlYXRlQnV0dG9ucyhyKTticmVhaztjYXNlImNsb3NlVGV4dCI6dGhpcy51aURpYWxvZ1RpdGxlYmFyQ2xvc2VUZXh0LnRleHQoIiIrcik7YnJlYWs7Y2FzZSJkaWFsb2dDbGFzcyI6by5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuZGlhbG9nQ2xhc3MpLmFkZENsYXNzKG4rcik7YnJlYWs7Y2FzZSJkaXNhYmxlZCI6cj9vLmFkZENsYXNzKCJ1aS1kaWFsb2ctZGlzYWJsZWQiKTpvLnJlbW92ZUNsYXNzKCJ1aS1kaWFsb2ctZGlzYWJsZWQiKTticmVhaztjYXNlImRyYWdnYWJsZSI6aT1vLmlzKCI6ZGF0YShkcmFnZ2FibGUpIiksaSYmIXImJm8uZHJhZ2dhYmxlKCJkZXN0cm95IiksIWkmJnImJnRoaXMuX21ha2VEcmFnZ2FibGUoKTticmVhaztjYXNlInBvc2l0aW9uIjp0aGlzLl9wb3NpdGlvbihyKTticmVhaztjYXNlInJlc2l6YWJsZSI6cz1vLmlzKCI6ZGF0YShyZXNpemFibGUpIikscyYmIXImJm8ucmVzaXphYmxlKCJkZXN0cm95IikscyYmdHlwZW9mIHI9PSJzdHJpbmciJiZvLnJlc2l6YWJsZSgib3B0aW9uIiwiaGFuZGxlcyIsciksIXMmJnIhPT0hMSYmdGhpcy5fbWFrZVJlc2l6YWJsZShyKTticmVhaztjYXNlInRpdGxlIjplKCIudWktZGlhbG9nLXRpdGxlIix0aGlzLnVpRGlhbG9nVGl0bGViYXIpLmh0bWwoIiIrKHJ8fCImIzE2MDsiKSl9dGhpcy5fc3VwZXIodCxyKX0sX3NpemU6ZnVuY3Rpb24oKXt2YXIgdCxuLHIsaT10aGlzLm9wdGlvbnMscz10aGlzLnVpRGlhbG9nLmlzKCI6dmlzaWJsZSIpO3RoaXMuZWxlbWVudC5zaG93KCkuY3NzKHt3aWR0aDoiYXV0byIsbWluSGVpZ2h0OjAsaGVpZ2h0OjB9KSxpLm1pbldpZHRoPmkud2lkdGgmJihpLndpZHRoPWkubWluV2lkdGgpLHQ9dGhpcy51aURpYWxvZy5jc3Moe2hlaWdodDoiYXV0byIsd2lkdGg6aS53aWR0aH0pLm91dGVySGVpZ2h0KCksbj1NYXRoLm1heCgwLGkubWluSGVpZ2h0LXQpLGkuaGVpZ2h0PT09ImF1dG8iP2Uuc3VwcG9ydC5taW5IZWlnaHQ/dGhpcy5lbGVtZW50LmNzcyh7bWluSGVpZ2h0Om4saGVpZ2h0OiJhdXRvIn0pOih0aGlzLnVpRGlhbG9nLnNob3coKSxyPXRoaXMuZWxlbWVudC5jc3MoImhlaWdodCIsImF1dG8iKS5oZWlnaHQoKSxzfHx0aGlzLnVpRGlhbG9nLmhpZGUoKSx0aGlzLmVsZW1lbnQuaGVpZ2h0KE1hdGgubWF4KHIsbikpKTp0aGlzLmVsZW1lbnQuaGVpZ2h0KE1hdGgubWF4KGkuaGVpZ2h0LXQsMCkpLHRoaXMudWlEaWFsb2cuaXMoIjpkYXRhKHJlc2l6YWJsZSkiKSYmdGhpcy51aURpYWxvZy5yZXNpemFibGUoIm9wdGlvbiIsIm1pbkhlaWdodCIsdGhpcy5fbWluSGVpZ2h0KCkpfX0pLGUuZXh0ZW5kKGUudWkuZGlhbG9nLHt1dWlkOjAsbWF4WjowLGdldFRpdGxlSWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5hdHRyKCJpZCIpO3JldHVybiB0fHwodGhpcy51dWlkKz0xLHQ9dGhpcy51dWlkKSwidWktZGlhbG9nLXRpdGxlLSIrdH0sb3ZlcmxheTpmdW5jdGlvbih0KXt0aGlzLiRlbD1lLnVpLmRpYWxvZy5vdmVybGF5LmNyZWF0ZSh0KX19KSxlLmV4dGVuZChlLnVpLmRpYWxvZy5vdmVybGF5LHtpbnN0YW5jZXM6W10sb2xkSW5zdGFuY2VzOltdLG1heFo6MCxldmVudHM6ZS5tYXAoImZvY3VzLG1vdXNlZG93bixtb3VzZXVwLGtleWRvd24sa2V5cHJlc3MsY2xpY2siLnNwbGl0KCIsIiksZnVuY3Rpb24oZSl7cmV0dXJuIGUrIi5kaWFsb2ctb3ZlcmxheSJ9KS5qb2luKCIgIiksY3JlYXRlOmZ1bmN0aW9uKHQpe3RoaXMuaW5zdGFuY2VzLmxlbmd0aD09PTAmJihzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS51aS5kaWFsb2cub3ZlcmxheS5pbnN0YW5jZXMubGVuZ3RoJiZlKGRvY3VtZW50KS5iaW5kKGUudWkuZGlhbG9nLm92ZXJsYXkuZXZlbnRzLGZ1bmN0aW9uKHQpe2lmKGUodC50YXJnZXQpLnpJbmRleCgpPGUudWkuZGlhbG9nLm92ZXJsYXkubWF4WilyZXR1cm4hMX0pfSwxKSxlKHdpbmRvdykuYmluZCgicmVzaXplLmRpYWxvZy1vdmVybGF5IixlLnVpLmRpYWxvZy5vdmVybGF5LnJlc2l6ZSkpO3ZhciBuPXRoaXMub2xkSW5zdGFuY2VzLnBvcCgpfHxlKCI8ZGl2PiIpLmFkZENsYXNzKCJ1aS13aWRnZXQtb3ZlcmxheSIpO3JldHVybiBlKGRvY3VtZW50KS5iaW5kKCJrZXlkb3duLmRpYWxvZy1vdmVybGF5IixmdW5jdGlvbihyKXt2YXIgaT1lLnVpLmRpYWxvZy5vdmVybGF5Lmluc3RhbmNlcztpLmxlbmd0aCE9PTAmJmlbaS5sZW5ndGgtMV09PT1uJiZ0Lm9wdGlvbnMuY2xvc2VPbkVzY2FwZSYmIXIuaXNEZWZhdWx0UHJldmVudGVkKCkmJnIua2V5Q29kZSYmci5rZXlDb2RlPT09ZS51aS5rZXlDb2RlLkVTQ0FQRSYmKHQuY2xvc2Uociksci5wcmV2ZW50RGVmYXVsdCgpKX0pLG4uYXBwZW5kVG8oZG9jdW1lbnQuYm9keSkuY3NzKHt3aWR0aDp0aGlzLndpZHRoKCksaGVpZ2h0OnRoaXMuaGVpZ2h0KCl9KSxlLmZuLmJnaWZyYW1lJiZuLmJnaWZyYW1lKCksdGhpcy5pbnN0YW5jZXMucHVzaChuKSxufSxkZXN0cm95OmZ1bmN0aW9uKHQpe3ZhciBuPWUuaW5BcnJheSh0LHRoaXMuaW5zdGFuY2VzKSxyPTA7biE9PS0xJiZ0aGlzLm9sZEluc3RhbmNlcy5wdXNoKHRoaXMuaW5zdGFuY2VzLnNwbGljZShuLDEpWzBdKSx0aGlzLmluc3RhbmNlcy5sZW5ndGg9PT0wJiZlKFtkb2N1bWVudCx3aW5kb3ddKS51bmJpbmQoIi5kaWFsb2ctb3ZlcmxheSIpLHQuaGVpZ2h0KDApLndpZHRoKDApLnJlbW92ZSgpLGUuZWFjaCh0aGlzLmluc3RhbmNlcyxmdW5jdGlvbigpe3I9TWF0aC5tYXgocix0aGlzLmNzcygiei1pbmRleCIpKX0pLHRoaXMubWF4Wj1yfSxoZWlnaHQ6ZnVuY3Rpb24oKXt2YXIgdCxuO3JldHVybiBlLnVpLmllPyh0PU1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQsZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQpLG49TWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm9mZnNldEhlaWdodCxkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCksdDxuP2Uod2luZG93KS5oZWlnaHQoKSsicHgiOnQrInB4Iik6ZShkb2N1bWVudCkuaGVpZ2h0KCkrInB4In0sd2lkdGg6ZnVuY3Rpb24oKXt2YXIgdCxuO3JldHVybiBlLnVpLmllPyh0PU1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxXaWR0aCxkb2N1bWVudC5ib2R5LnNjcm9sbFdpZHRoKSxuPU1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vZmZzZXRXaWR0aCxkb2N1bWVudC5ib2R5Lm9mZnNldFdpZHRoKSx0PG4/ZSh3aW5kb3cpLndpZHRoKCkrInB4Ijp0KyJweCIpOmUoZG9jdW1lbnQpLndpZHRoKCkrInB4In0scmVzaXplOmZ1bmN0aW9uKCl7dmFyIHQ9ZShbXSk7ZS5lYWNoKGUudWkuZGlhbG9nLm92ZXJsYXkuaW5zdGFuY2VzLGZ1bmN0aW9uKCl7dD10LmFkZCh0aGlzKX0pLHQuY3NzKHt3aWR0aDowLGhlaWdodDowfSkuY3NzKHt3aWR0aDplLnVpLmRpYWxvZy5vdmVybGF5LndpZHRoKCksaGVpZ2h0OmUudWkuZGlhbG9nLm92ZXJsYXkuaGVpZ2h0KCl9KX19KSxlLmV4dGVuZChlLnVpLmRpYWxvZy5vdmVybGF5LnByb3RvdHlwZSx7ZGVzdHJveTpmdW5jdGlvbigpe2UudWkuZGlhbG9nLm92ZXJsYXkuZGVzdHJveSh0aGlzLiRlbCl9fSl9KShqUXVlcnkpOyhmdW5jdGlvbihlLHQpe3ZhciBuPSExO2Uud2lkZ2V0KCJ1aS5tZW51Iix7dmVyc2lvbjoiMS45LjIiLGRlZmF1bHRFbGVtZW50OiI8dWw+IixkZWxheTozMDAsb3B0aW9uczp7aWNvbnM6e3N1Ym1lbnU6InVpLWljb24tY2FyYXQtMS1lIn0sbWVudXM6InVsIixwb3NpdGlvbjp7bXk6ImxlZnQgdG9wIixhdDoicmlnaHQgdG9wIn0scm9sZToibWVudSIsYmx1cjpudWxsLGZvY3VzOm51bGwsc2VsZWN0Om51bGx9LF9jcmVhdGU6ZnVuY3Rpb24oKXt0aGlzLmFjdGl2ZU1lbnU9dGhpcy5lbGVtZW50LHRoaXMuZWxlbWVudC51bmlxdWVJZCgpLmFkZENsYXNzKCJ1aS1tZW51IHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIikudG9nZ2xlQ2xhc3MoInVpLW1lbnUtaWNvbnMiLCEhdGhpcy5lbGVtZW50LmZpbmQoIi51aS1pY29uIikubGVuZ3RoKS5hdHRyKHtyb2xlOnRoaXMub3B0aW9ucy5yb2xlLHRhYkluZGV4OjB9KS5iaW5kKCJjbGljayIrdGhpcy5ldmVudE5hbWVzcGFjZSxlLnByb3h5KGZ1bmN0aW9uKGUpe3RoaXMub3B0aW9ucy5kaXNhYmxlZCYmZS5wcmV2ZW50RGVmYXVsdCgpfSx0aGlzKSksdGhpcy5vcHRpb25zLmRpc2FibGVkJiZ0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIikuYXR0cigiYXJpYS1kaXNhYmxlZCIsInRydWUiKSx0aGlzLl9vbih7Im1vdXNlZG93biAudWktbWVudS1pdGVtID4gYSI6ZnVuY3Rpb24oZSl7ZS5wcmV2ZW50RGVmYXVsdCgpfSwiY2xpY2sgLnVpLXN0YXRlLWRpc2FibGVkID4gYSI6ZnVuY3Rpb24oZSl7ZS5wcmV2ZW50RGVmYXVsdCgpfSwiY2xpY2sgLnVpLW1lbnUtaXRlbTpoYXMoYSkiOmZ1bmN0aW9uKHQpe3ZhciByPWUodC50YXJnZXQpLmNsb3Nlc3QoIi51aS1tZW51LWl0ZW0iKTshbiYmci5ub3QoIi51aS1zdGF0ZS1kaXNhYmxlZCIpLmxlbmd0aCYmKG49ITAsdGhpcy5zZWxlY3QodCksci5oYXMoIi51aS1tZW51IikubGVuZ3RoP3RoaXMuZXhwYW5kKHQpOnRoaXMuZWxlbWVudC5pcygiOmZvY3VzIil8fCh0aGlzLmVsZW1lbnQudHJpZ2dlcigiZm9jdXMiLFshMF0pLHRoaXMuYWN0aXZlJiZ0aGlzLmFjdGl2ZS5wYXJlbnRzKCIudWktbWVudSIpLmxlbmd0aD09PTEmJmNsZWFyVGltZW91dCh0aGlzLnRpbWVyKSkpfSwibW91c2VlbnRlciAudWktbWVudS1pdGVtIjpmdW5jdGlvbih0KXt2YXIgbj1lKHQuY3VycmVudFRhcmdldCk7bi5zaWJsaW5ncygpLmNoaWxkcmVuKCIudWktc3RhdGUtYWN0aXZlIikucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLHRoaXMuZm9jdXModCxuKX0sbW91c2VsZWF2ZToiY29sbGFwc2VBbGwiLCJtb3VzZWxlYXZlIC51aS1tZW51IjoiY29sbGFwc2VBbGwiLGZvY3VzOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5hY3RpdmV8fHRoaXMuZWxlbWVudC5jaGlsZHJlbigiLnVpLW1lbnUtaXRlbSIpLmVxKDApO3R8fHRoaXMuZm9jdXMoZSxuKX0sYmx1cjpmdW5jdGlvbih0KXt0aGlzLl9kZWxheShmdW5jdGlvbigpe2UuY29udGFpbnModGhpcy5lbGVtZW50WzBdLHRoaXMuZG9jdW1lbnRbMF0uYWN0aXZlRWxlbWVudCl8fHRoaXMuY29sbGFwc2VBbGwodCl9KX0sa2V5ZG93bjoiX2tleWRvd24ifSksdGhpcy5yZWZyZXNoKCksdGhpcy5fb24odGhpcy5kb2N1bWVudCx7Y2xpY2s6ZnVuY3Rpb24odCl7ZSh0LnRhcmdldCkuY2xvc2VzdCgiLnVpLW1lbnUiKS5sZW5ndGh8fHRoaXMuY29sbGFwc2VBbGwodCksbj0hMX19KX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQucmVtb3ZlQXR0cigiYXJpYS1hY3RpdmVkZXNjZW5kYW50IikuZmluZCgiLnVpLW1lbnUiKS5hbmRTZWxmKCkucmVtb3ZlQ2xhc3MoInVpLW1lbnUgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwgdWktbWVudS1pY29ucyIpLnJlbW92ZUF0dHIoInJvbGUiKS5yZW1vdmVBdHRyKCJ0YWJJbmRleCIpLnJlbW92ZUF0dHIoImFyaWEtbGFiZWxsZWRieSIpLnJlbW92ZUF0dHIoImFyaWEtZXhwYW5kZWQiKS5yZW1vdmVBdHRyKCJhcmlhLWhpZGRlbiIpLnJlbW92ZUF0dHIoImFyaWEtZGlzYWJsZWQiKS5yZW1vdmVVbmlxdWVJZCgpLnNob3coKSx0aGlzLmVsZW1lbnQuZmluZCgiLnVpLW1lbnUtaXRlbSIpLnJlbW92ZUNsYXNzKCJ1aS1tZW51LWl0ZW0iKS5yZW1vdmVBdHRyKCJyb2xlIikucmVtb3ZlQXR0cigiYXJpYS1kaXNhYmxlZCIpLmNoaWxkcmVuKCJhIikucmVtb3ZlVW5pcXVlSWQoKS5yZW1vdmVDbGFzcygidWktY29ybmVyLWFsbCB1aS1zdGF0ZS1ob3ZlciIpLnJlbW92ZUF0dHIoInRhYkluZGV4IikucmVtb3ZlQXR0cigicm9sZSIpLnJlbW92ZUF0dHIoImFyaWEtaGFzcG9wdXAiKS5jaGlsZHJlbigpLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpO3QuZGF0YSgidWktbWVudS1zdWJtZW51LWNhcmF0IikmJnQucmVtb3ZlKCl9KSx0aGlzLmVsZW1lbnQuZmluZCgiLnVpLW1lbnUtZGl2aWRlciIpLnJlbW92ZUNsYXNzKCJ1aS1tZW51LWRpdmlkZXIgdWktd2lkZ2V0LWNvbnRlbnQiKX0sX2tleWRvd246ZnVuY3Rpb24odCl7ZnVuY3Rpb24gYShlKXtyZXR1cm4gZS5yZXBsYWNlKC9bXC1cW1xde30oKSorPy4sXFxcXiR8I1xzXS9nLCJcXCQmIil9dmFyIG4scixpLHMsbyx1PSEwO3N3aXRjaCh0LmtleUNvZGUpe2Nhc2UgZS51aS5rZXlDb2RlLlBBR0VfVVA6dGhpcy5wcmV2aW91c1BhZ2UodCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuUEFHRV9ET1dOOnRoaXMubmV4dFBhZ2UodCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuSE9NRTp0aGlzLl9tb3ZlKCJmaXJzdCIsImZpcnN0Iix0KTticmVhaztjYXNlIGUudWkua2V5Q29kZS5FTkQ6dGhpcy5fbW92ZSgibGFzdCIsImxhc3QiLHQpO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLlVQOnRoaXMucHJldmlvdXModCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuRE9XTjp0aGlzLm5leHQodCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuTEVGVDp0aGlzLmNvbGxhcHNlKHQpO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLlJJR0hUOnRoaXMuYWN0aXZlJiYhdGhpcy5hY3RpdmUuaXMoIi51aS1zdGF0ZS1kaXNhYmxlZCIpJiZ0aGlzLmV4cGFuZCh0KTticmVhaztjYXNlIGUudWkua2V5Q29kZS5FTlRFUjpjYXNlIGUudWkua2V5Q29kZS5TUEFDRTp0aGlzLl9hY3RpdmF0ZSh0KTticmVhaztjYXNlIGUudWkua2V5Q29kZS5FU0NBUEU6dGhpcy5jb2xsYXBzZSh0KTticmVhaztkZWZhdWx0OnU9ITEscj10aGlzLnByZXZpb3VzRmlsdGVyfHwiIixpPVN0cmluZy5mcm9tQ2hhckNvZGUodC5rZXlDb2RlKSxzPSExLGNsZWFyVGltZW91dCh0aGlzLmZpbHRlclRpbWVyKSxpPT09cj9zPSEwOmk9citpLG89bmV3IFJlZ0V4cCgiXiIrYShpKSwiaSIpLG49dGhpcy5hY3RpdmVNZW51LmNoaWxkcmVuKCIudWktbWVudS1pdGVtIikuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIG8udGVzdChlKHRoaXMpLmNoaWxkcmVuKCJhIikudGV4dCgpKX0pLG49cyYmbi5pbmRleCh0aGlzLmFjdGl2ZS5uZXh0KCkpIT09LTE/dGhpcy5hY3RpdmUubmV4dEFsbCgiLnVpLW1lbnUtaXRlbSIpOm4sbi5sZW5ndGh8fChpPVN0cmluZy5mcm9tQ2hhckNvZGUodC5rZXlDb2RlKSxvPW5ldyBSZWdFeHAoIl4iK2EoaSksImkiKSxuPXRoaXMuYWN0aXZlTWVudS5jaGlsZHJlbigiLnVpLW1lbnUtaXRlbSIpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiBvLnRlc3QoZSh0aGlzKS5jaGlsZHJlbigiYSIpLnRleHQoKSl9KSksbi5sZW5ndGg/KHRoaXMuZm9jdXModCxuKSxuLmxlbmd0aD4xPyh0aGlzLnByZXZpb3VzRmlsdGVyPWksdGhpcy5maWx0ZXJUaW1lcj10aGlzLl9kZWxheShmdW5jdGlvbigpe2RlbGV0ZSB0aGlzLnByZXZpb3VzRmlsdGVyfSwxZTMpKTpkZWxldGUgdGhpcy5wcmV2aW91c0ZpbHRlcik6ZGVsZXRlIHRoaXMucHJldmlvdXNGaWx0ZXJ9dSYmdC5wcmV2ZW50RGVmYXVsdCgpfSxfYWN0aXZhdGU6ZnVuY3Rpb24oZSl7dGhpcy5hY3RpdmUuaXMoIi51aS1zdGF0ZS1kaXNhYmxlZCIpfHwodGhpcy5hY3RpdmUuY2hpbGRyZW4oImFbYXJpYS1oYXNwb3B1cD0ndHJ1ZSddIikubGVuZ3RoP3RoaXMuZXhwYW5kKGUpOnRoaXMuc2VsZWN0KGUpKX0scmVmcmVzaDpmdW5jdGlvbigpe3ZhciB0LG49dGhpcy5vcHRpb25zLmljb25zLnN1Ym1lbnUscj10aGlzLmVsZW1lbnQuZmluZCh0aGlzLm9wdGlvbnMubWVudXMpO3IuZmlsdGVyKCI6bm90KC51aS1tZW51KSIpLmFkZENsYXNzKCJ1aS1tZW51IHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIikuaGlkZSgpLmF0dHIoe3JvbGU6dGhpcy5vcHRpb25zLnJvbGUsImFyaWEtaGlkZGVuIjoidHJ1ZSIsImFyaWEtZXhwYW5kZWQiOiJmYWxzZSJ9KS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKSxyPXQucHJldigiYSIpLGk9ZSgiPHNwYW4+IikuYWRkQ2xhc3MoInVpLW1lbnUtaWNvbiB1aS1pY29uICIrbikuZGF0YSgidWktbWVudS1zdWJtZW51LWNhcmF0IiwhMCk7ci5hdHRyKCJhcmlhLWhhc3BvcHVwIiwidHJ1ZSIpLnByZXBlbmQoaSksdC5hdHRyKCJhcmlhLWxhYmVsbGVkYnkiLHIuYXR0cigiaWQiKSl9KSx0PXIuYWRkKHRoaXMuZWxlbWVudCksdC5jaGlsZHJlbigiOm5vdCgudWktbWVudS1pdGVtKTpoYXMoYSkiKS5hZGRDbGFzcygidWktbWVudS1pdGVtIikuYXR0cigicm9sZSIsInByZXNlbnRhdGlvbiIpLmNoaWxkcmVuKCJhIikudW5pcXVlSWQoKS5hZGRDbGFzcygidWktY29ybmVyLWFsbCIpLmF0dHIoe3RhYkluZGV4Oi0xLHJvbGU6dGhpcy5faXRlbVJvbGUoKX0pLHQuY2hpbGRyZW4oIjpub3QoLnVpLW1lbnUtaXRlbSkiKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKTsvW15cLeKAlOKAk1xzXS8udGVzdCh0LnRleHQoKSl8fHQuYWRkQ2xhc3MoInVpLXdpZGdldC1jb250ZW50IHVpLW1lbnUtZGl2aWRlciIpfSksdC5jaGlsZHJlbigiLnVpLXN0YXRlLWRpc2FibGVkIikuYXR0cigiYXJpYS1kaXNhYmxlZCIsInRydWUiKSx0aGlzLmFjdGl2ZSYmIWUuY29udGFpbnModGhpcy5lbGVtZW50WzBdLHRoaXMuYWN0aXZlWzBdKSYmdGhpcy5ibHVyKCl9LF9pdGVtUm9sZTpmdW5jdGlvbigpe3JldHVybnttZW51OiJtZW51aXRlbSIsbGlzdGJveDoib3B0aW9uIn1bdGhpcy5vcHRpb25zLnJvbGVdfSxmb2N1czpmdW5jdGlvbihlLHQpe3ZhciBuLHI7dGhpcy5ibHVyKGUsZSYmZS50eXBlPT09ImZvY3VzIiksdGhpcy5fc2Nyb2xsSW50b1ZpZXcodCksdGhpcy5hY3RpdmU9dC5maXJzdCgpLHI9dGhpcy5hY3RpdmUuY2hpbGRyZW4oImEiKS5hZGRDbGFzcygidWktc3RhdGUtZm9jdXMiKSx0aGlzLm9wdGlvbnMucm9sZSYmdGhpcy5lbGVtZW50LmF0dHIoImFyaWEtYWN0aXZlZGVzY2VuZGFudCIsci5hdHRyKCJpZCIpKSx0aGlzLmFjdGl2ZS5wYXJlbnQoKS5jbG9zZXN0KCIudWktbWVudS1pdGVtIikuY2hpbGRyZW4oImE6Zmlyc3QiKS5hZGRDbGFzcygidWktc3RhdGUtYWN0aXZlIiksZSYmZS50eXBlPT09ImtleWRvd24iP3RoaXMuX2Nsb3NlKCk6dGhpcy50aW1lcj10aGlzLl9kZWxheShmdW5jdGlvbigpe3RoaXMuX2Nsb3NlKCl9LHRoaXMuZGVsYXkpLG49dC5jaGlsZHJlbigiLnVpLW1lbnUiKSxuLmxlbmd0aCYmL15tb3VzZS8udGVzdChlLnR5cGUpJiZ0aGlzLl9zdGFydE9wZW5pbmcobiksdGhpcy5hY3RpdmVNZW51PXQucGFyZW50KCksdGhpcy5fdHJpZ2dlcigiZm9jdXMiLGUse2l0ZW06dH0pfSxfc2Nyb2xsSW50b1ZpZXc6ZnVuY3Rpb24odCl7dmFyIG4scixpLHMsbyx1O3RoaXMuX2hhc1Njcm9sbCgpJiYobj1wYXJzZUZsb2F0KGUuY3NzKHRoaXMuYWN0aXZlTWVudVswXSwiYm9yZGVyVG9wV2lkdGgiKSl8fDAscj1wYXJzZUZsb2F0KGUuY3NzKHRoaXMuYWN0aXZlTWVudVswXSwicGFkZGluZ1RvcCIpKXx8MCxpPXQub2Zmc2V0KCkudG9wLXRoaXMuYWN0aXZlTWVudS5vZmZzZXQoKS50b3Atbi1yLHM9dGhpcy5hY3RpdmVNZW51LnNjcm9sbFRvcCgpLG89dGhpcy5hY3RpdmVNZW51LmhlaWdodCgpLHU9dC5oZWlnaHQoKSxpPDA/dGhpcy5hY3RpdmVNZW51LnNjcm9sbFRvcChzK2kpOmkrdT5vJiZ0aGlzLmFjdGl2ZU1lbnUuc2Nyb2xsVG9wKHMraS1vK3UpKX0sYmx1cjpmdW5jdGlvbihlLHQpe3R8fGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKTtpZighdGhpcy5hY3RpdmUpcmV0dXJuO3RoaXMuYWN0aXZlLmNoaWxkcmVuKCJhIikucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWZvY3VzIiksdGhpcy5hY3RpdmU9bnVsbCx0aGlzLl90cmlnZ2VyKCJibHVyIixlLHtpdGVtOnRoaXMuYWN0aXZlfSl9LF9zdGFydE9wZW5pbmc6ZnVuY3Rpb24oZSl7Y2xlYXJUaW1lb3V0KHRoaXMudGltZXIpO2lmKGUuYXR0cigiYXJpYS1oaWRkZW4iKSE9PSJ0cnVlIilyZXR1cm47dGhpcy50aW1lcj10aGlzLl9kZWxheShmdW5jdGlvbigpe3RoaXMuX2Nsb3NlKCksdGhpcy5fb3BlbihlKX0sdGhpcy5kZWxheSl9LF9vcGVuOmZ1bmN0aW9uKHQpe3ZhciBuPWUuZXh0ZW5kKHtvZjp0aGlzLmFjdGl2ZX0sdGhpcy5vcHRpb25zLnBvc2l0aW9uKTtjbGVhclRpbWVvdXQodGhpcy50aW1lciksdGhpcy5lbGVtZW50LmZpbmQoIi51aS1tZW51Iikubm90KHQucGFyZW50cygiLnVpLW1lbnUiKSkuaGlkZSgpLmF0dHIoImFyaWEtaGlkZGVuIiwidHJ1ZSIpLHQuc2hvdygpLnJlbW92ZUF0dHIoImFyaWEtaGlkZGVuIikuYXR0cigiYXJpYS1leHBhbmRlZCIsInRydWUiKS5wb3NpdGlvbihuKX0sY29sbGFwc2VBbGw6ZnVuY3Rpb24odCxuKXtjbGVhclRpbWVvdXQodGhpcy50aW1lciksdGhpcy50aW1lcj10aGlzLl9kZWxheShmdW5jdGlvbigpe3ZhciByPW4/dGhpcy5lbGVtZW50OmUodCYmdC50YXJnZXQpLmNsb3Nlc3QodGhpcy5lbGVtZW50LmZpbmQoIi51aS1tZW51IikpO3IubGVuZ3RofHwocj10aGlzLmVsZW1lbnQpLHRoaXMuX2Nsb3NlKHIpLHRoaXMuYmx1cih0KSx0aGlzLmFjdGl2ZU1lbnU9cn0sdGhpcy5kZWxheSl9LF9jbG9zZTpmdW5jdGlvbihlKXtlfHwoZT10aGlzLmFjdGl2ZT90aGlzLmFjdGl2ZS5wYXJlbnQoKTp0aGlzLmVsZW1lbnQpLGUuZmluZCgiLnVpLW1lbnUiKS5oaWRlKCkuYXR0cigiYXJpYS1oaWRkZW4iLCJ0cnVlIikuYXR0cigiYXJpYS1leHBhbmRlZCIsImZhbHNlIikuZW5kKCkuZmluZCgiYS51aS1zdGF0ZS1hY3RpdmUiKS5yZW1vdmVDbGFzcygidWktc3RhdGUtYWN0aXZlIil9LGNvbGxhcHNlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuYWN0aXZlJiZ0aGlzLmFjdGl2ZS5wYXJlbnQoKS5jbG9zZXN0KCIudWktbWVudS1pdGVtIix0aGlzLmVsZW1lbnQpO3QmJnQubGVuZ3RoJiYodGhpcy5fY2xvc2UoKSx0aGlzLmZvY3VzKGUsdCkpfSxleHBhbmQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5hY3RpdmUmJnRoaXMuYWN0aXZlLmNoaWxkcmVuKCIudWktbWVudSAiKS5jaGlsZHJlbigiLnVpLW1lbnUtaXRlbSIpLmZpcnN0KCk7dCYmdC5sZW5ndGgmJih0aGlzLl9vcGVuKHQucGFyZW50KCkpLHRoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7dGhpcy5mb2N1cyhlLHQpfSkpfSxuZXh0OmZ1bmN0aW9uKGUpe3RoaXMuX21vdmUoIm5leHQiLCJmaXJzdCIsZSl9LHByZXZpb3VzOmZ1bmN0aW9uKGUpe3RoaXMuX21vdmUoInByZXYiLCJsYXN0IixlKX0saXNGaXJzdEl0ZW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hY3RpdmUmJiF0aGlzLmFjdGl2ZS5wcmV2QWxsKCIudWktbWVudS1pdGVtIikubGVuZ3RofSxpc0xhc3RJdGVtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWN0aXZlJiYhdGhpcy5hY3RpdmUubmV4dEFsbCgiLnVpLW1lbnUtaXRlbSIpLmxlbmd0aH0sX21vdmU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByO3RoaXMuYWN0aXZlJiYoZT09PSJmaXJzdCJ8fGU9PT0ibGFzdCI/cj10aGlzLmFjdGl2ZVtlPT09ImZpcnN0Ij8icHJldkFsbCI6Im5leHRBbGwiXSgiLnVpLW1lbnUtaXRlbSIpLmVxKC0xKTpyPXRoaXMuYWN0aXZlW2UrIkFsbCJdKCIudWktbWVudS1pdGVtIikuZXEoMCkpO2lmKCFyfHwhci5sZW5ndGh8fCF0aGlzLmFjdGl2ZSlyPXRoaXMuYWN0aXZlTWVudS5jaGlsZHJlbigiLnVpLW1lbnUtaXRlbSIpW3RdKCk7dGhpcy5mb2N1cyhuLHIpfSxuZXh0UGFnZTpmdW5jdGlvbih0KXt2YXIgbixyLGk7aWYoIXRoaXMuYWN0aXZlKXt0aGlzLm5leHQodCk7cmV0dXJufWlmKHRoaXMuaXNMYXN0SXRlbSgpKXJldHVybjt0aGlzLl9oYXNTY3JvbGwoKT8ocj10aGlzLmFjdGl2ZS5vZmZzZXQoKS50b3AsaT10aGlzLmVsZW1lbnQuaGVpZ2h0KCksdGhpcy5hY3RpdmUubmV4dEFsbCgiLnVpLW1lbnUtaXRlbSIpLmVhY2goZnVuY3Rpb24oKXtyZXR1cm4gbj1lKHRoaXMpLG4ub2Zmc2V0KCkudG9wLXItaTwwfSksdGhpcy5mb2N1cyh0LG4pKTp0aGlzLmZvY3VzKHQsdGhpcy5hY3RpdmVNZW51LmNoaWxkcmVuKCIudWktbWVudS1pdGVtIilbdGhpcy5hY3RpdmU/Imxhc3QiOiJmaXJzdCJdKCkpfSxwcmV2aW91c1BhZ2U6ZnVuY3Rpb24odCl7dmFyIG4scixpO2lmKCF0aGlzLmFjdGl2ZSl7dGhpcy5uZXh0KHQpO3JldHVybn1pZih0aGlzLmlzRmlyc3RJdGVtKCkpcmV0dXJuO3RoaXMuX2hhc1Njcm9sbCgpPyhyPXRoaXMuYWN0aXZlLm9mZnNldCgpLnRvcCxpPXRoaXMuZWxlbWVudC5oZWlnaHQoKSx0aGlzLmFjdGl2ZS5wcmV2QWxsKCIudWktbWVudS1pdGVtIikuZWFjaChmdW5jdGlvbigpe3JldHVybiBuPWUodGhpcyksbi5vZmZzZXQoKS50b3AtcitpPjB9KSx0aGlzLmZvY3VzKHQsbikpOnRoaXMuZm9jdXModCx0aGlzLmFjdGl2ZU1lbnUuY2hpbGRyZW4oIi51aS1tZW51LWl0ZW0iKS5maXJzdCgpKX0sX2hhc1Njcm9sbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnQub3V0ZXJIZWlnaHQoKTx0aGlzLmVsZW1lbnQucHJvcCgic2Nyb2xsSGVpZ2h0Iil9LHNlbGVjdDpmdW5jdGlvbih0KXt0aGlzLmFjdGl2ZT10aGlzLmFjdGl2ZXx8ZSh0LnRhcmdldCkuY2xvc2VzdCgiLnVpLW1lbnUtaXRlbSIpO3ZhciBuPXtpdGVtOnRoaXMuYWN0aXZlfTt0aGlzLmFjdGl2ZS5oYXMoIi51aS1tZW51IikubGVuZ3RofHx0aGlzLmNvbGxhcHNlQWxsKHQsITApLHRoaXMuX3RyaWdnZXIoInNlbGVjdCIsdCxuKX19KX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGUsdCl7ZS53aWRnZXQoInVpLnByb2dyZXNzYmFyIix7dmVyc2lvbjoiMS45LjIiLG9wdGlvbnM6e3ZhbHVlOjAsbWF4OjEwMH0sbWluOjAsX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5hZGRDbGFzcygidWktcHJvZ3Jlc3NiYXIgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwiKS5hdHRyKHtyb2xlOiJwcm9ncmVzc2JhciIsImFyaWEtdmFsdWVtaW4iOnRoaXMubWluLCJhcmlhLXZhbHVlbWF4Ijp0aGlzLm9wdGlvbnMubWF4LCJhcmlhLXZhbHVlbm93Ijp0aGlzLl92YWx1ZSgpfSksdGhpcy52YWx1ZURpdj1lKCI8ZGl2IGNsYXNzPSd1aS1wcm9ncmVzc2Jhci12YWx1ZSB1aS13aWRnZXQtaGVhZGVyIHVpLWNvcm5lci1sZWZ0Jz48L2Rpdj4iKS5hcHBlbmRUbyh0aGlzLmVsZW1lbnQpLHRoaXMub2xkVmFsdWU9dGhpcy5fdmFsdWUoKSx0aGlzLl9yZWZyZXNoVmFsdWUoKX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXByb2dyZXNzYmFyIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIikucmVtb3ZlQXR0cigicm9sZSIpLnJlbW92ZUF0dHIoImFyaWEtdmFsdWVtaW4iKS5yZW1vdmVBdHRyKCJhcmlhLXZhbHVlbWF4IikucmVtb3ZlQXR0cigiYXJpYS12YWx1ZW5vdyIpLHRoaXMudmFsdWVEaXYucmVtb3ZlKCl9LHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBlPT09dD90aGlzLl92YWx1ZSgpOih0aGlzLl9zZXRPcHRpb24oInZhbHVlIixlKSx0aGlzKX0sX3NldE9wdGlvbjpmdW5jdGlvbihlLHQpe2U9PT0idmFsdWUiJiYodGhpcy5vcHRpb25zLnZhbHVlPXQsdGhpcy5fcmVmcmVzaFZhbHVlKCksdGhpcy5fdmFsdWUoKT09PXRoaXMub3B0aW9ucy5tYXgmJnRoaXMuX3RyaWdnZXIoImNvbXBsZXRlIikpLHRoaXMuX3N1cGVyKGUsdCl9LF92YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3B0aW9ucy52YWx1ZTtyZXR1cm4gdHlwZW9mIGUhPSJudW1iZXIiJiYoZT0wKSxNYXRoLm1pbih0aGlzLm9wdGlvbnMubWF4LE1hdGgubWF4KHRoaXMubWluLGUpKX0sX3BlcmNlbnRhZ2U6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKnRoaXMuX3ZhbHVlKCkvdGhpcy5vcHRpb25zLm1heH0sX3JlZnJlc2hWYWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMudmFsdWUoKSx0PXRoaXMuX3BlcmNlbnRhZ2UoKTt0aGlzLm9sZFZhbHVlIT09ZSYmKHRoaXMub2xkVmFsdWU9ZSx0aGlzLl90cmlnZ2VyKCJjaGFuZ2UiKSksdGhpcy52YWx1ZURpdi50b2dnbGUoZT50aGlzLm1pbikudG9nZ2xlQ2xhc3MoInVpLWNvcm5lci1yaWdodCIsZT09PXRoaXMub3B0aW9ucy5tYXgpLndpZHRoKHQudG9GaXhlZCgwKSsiJSIpLHRoaXMuZWxlbWVudC5hdHRyKCJhcmlhLXZhbHVlbm93IixlKX19KX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGUsdCl7dmFyIG49NTtlLndpZGdldCgidWkuc2xpZGVyIixlLnVpLm1vdXNlLHt2ZXJzaW9uOiIxLjkuMiIsd2lkZ2V0RXZlbnRQcmVmaXg6InNsaWRlIixvcHRpb25zOnthbmltYXRlOiExLGRpc3RhbmNlOjAsbWF4OjEwMCxtaW46MCxvcmllbnRhdGlvbjoiaG9yaXpvbnRhbCIscmFuZ2U6ITEsc3RlcDoxLHZhbHVlOjAsdmFsdWVzOm51bGx9LF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgdCxyLGk9dGhpcy5vcHRpb25zLHM9dGhpcy5lbGVtZW50LmZpbmQoIi51aS1zbGlkZXItaGFuZGxlIikuYWRkQ2xhc3MoInVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLWFsbCIpLG89IjxhIGNsYXNzPSd1aS1zbGlkZXItaGFuZGxlIHVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLWFsbCcgaHJlZj0nIyc+PC9hPiIsdT1bXTt0aGlzLl9rZXlTbGlkaW5nPSExLHRoaXMuX21vdXNlU2xpZGluZz0hMSx0aGlzLl9hbmltYXRlT2ZmPSEwLHRoaXMuX2hhbmRsZUluZGV4PW51bGwsdGhpcy5fZGV0ZWN0T3JpZW50YXRpb24oKSx0aGlzLl9tb3VzZUluaXQoKSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLXNsaWRlciB1aS1zbGlkZXItIit0aGlzLm9yaWVudGF0aW9uKyIgdWktd2lkZ2V0IisiIHVpLXdpZGdldC1jb250ZW50IisiIHVpLWNvcm5lci1hbGwiKyhpLmRpc2FibGVkPyIgdWktc2xpZGVyLWRpc2FibGVkIHVpLWRpc2FibGVkIjoiIikpLHRoaXMucmFuZ2U9ZShbXSksaS5yYW5nZSYmKGkucmFuZ2U9PT0hMCYmKGkudmFsdWVzfHwoaS52YWx1ZXM9W3RoaXMuX3ZhbHVlTWluKCksdGhpcy5fdmFsdWVNaW4oKV0pLGkudmFsdWVzLmxlbmd0aCYmaS52YWx1ZXMubGVuZ3RoIT09MiYmKGkudmFsdWVzPVtpLnZhbHVlc1swXSxpLnZhbHVlc1swXV0pKSx0aGlzLnJhbmdlPWUoIjxkaXY+PC9kaXY+IikuYXBwZW5kVG8odGhpcy5lbGVtZW50KS5hZGRDbGFzcygidWktc2xpZGVyLXJhbmdlIHVpLXdpZGdldC1oZWFkZXIiKyhpLnJhbmdlPT09Im1pbiJ8fGkucmFuZ2U9PT0ibWF4Ij8iIHVpLXNsaWRlci1yYW5nZS0iK2kucmFuZ2U6IiIpKSkscj1pLnZhbHVlcyYmaS52YWx1ZXMubGVuZ3RofHwxO2Zvcih0PXMubGVuZ3RoO3Q8cjt0KyspdS5wdXNoKG8pO3RoaXMuaGFuZGxlcz1zLmFkZChlKHUuam9pbigiIikpLmFwcGVuZFRvKHRoaXMuZWxlbWVudCkpLHRoaXMuaGFuZGxlPXRoaXMuaGFuZGxlcy5lcSgwKSx0aGlzLmhhbmRsZXMuYWRkKHRoaXMucmFuZ2UpLmZpbHRlcigiYSIpLmNsaWNrKGZ1bmN0aW9uKGUpe2UucHJldmVudERlZmF1bHQoKX0pLm1vdXNlZW50ZXIoZnVuY3Rpb24oKXtpLmRpc2FibGVkfHxlKHRoaXMpLmFkZENsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpfSkubW91c2VsZWF2ZShmdW5jdGlvbigpe2UodGhpcykucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWhvdmVyIil9KS5mb2N1cyhmdW5jdGlvbigpe2kuZGlzYWJsZWQ/ZSh0aGlzKS5ibHVyKCk6KGUoIi51aS1zbGlkZXIgLnVpLXN0YXRlLWZvY3VzIikucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWZvY3VzIiksZSh0aGlzKS5hZGRDbGFzcygidWktc3RhdGUtZm9jdXMiKSl9KS5ibHVyKGZ1bmN0aW9uKCl7ZSh0aGlzKS5yZW1vdmVDbGFzcygidWktc3RhdGUtZm9jdXMiKX0pLHRoaXMuaGFuZGxlcy5lYWNoKGZ1bmN0aW9uKHQpe2UodGhpcykuZGF0YSgidWktc2xpZGVyLWhhbmRsZS1pbmRleCIsdCl9KSx0aGlzLl9vbih0aGlzLmhhbmRsZXMse2tleWRvd246ZnVuY3Rpb24odCl7dmFyIHIsaSxzLG8sdT1lKHQudGFyZ2V0KS5kYXRhKCJ1aS1zbGlkZXItaGFuZGxlLWluZGV4Iik7c3dpdGNoKHQua2V5Q29kZSl7Y2FzZSBlLnVpLmtleUNvZGUuSE9NRTpjYXNlIGUudWkua2V5Q29kZS5FTkQ6Y2FzZSBlLnVpLmtleUNvZGUuUEFHRV9VUDpjYXNlIGUudWkua2V5Q29kZS5QQUdFX0RPV046Y2FzZSBlLnVpLmtleUNvZGUuVVA6Y2FzZSBlLnVpLmtleUNvZGUuUklHSFQ6Y2FzZSBlLnVpLmtleUNvZGUuRE9XTjpjYXNlIGUudWkua2V5Q29kZS5MRUZUOnQucHJldmVudERlZmF1bHQoKTtpZighdGhpcy5fa2V5U2xpZGluZyl7dGhpcy5fa2V5U2xpZGluZz0hMCxlKHQudGFyZ2V0KS5hZGRDbGFzcygidWktc3RhdGUtYWN0aXZlIikscj10aGlzLl9zdGFydCh0LHUpO2lmKHI9PT0hMSlyZXR1cm59fW89dGhpcy5vcHRpb25zLnN0ZXAsdGhpcy5vcHRpb25zLnZhbHVlcyYmdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGg/aT1zPXRoaXMudmFsdWVzKHUpOmk9cz10aGlzLnZhbHVlKCk7c3dpdGNoKHQua2V5Q29kZSl7Y2FzZSBlLnVpLmtleUNvZGUuSE9NRTpzPXRoaXMuX3ZhbHVlTWluKCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuRU5EOnM9dGhpcy5fdmFsdWVNYXgoKTticmVhaztjYXNlIGUudWkua2V5Q29kZS5QQUdFX1VQOnM9dGhpcy5fdHJpbUFsaWduVmFsdWUoaSsodGhpcy5fdmFsdWVNYXgoKS10aGlzLl92YWx1ZU1pbigpKS9uKTticmVhaztjYXNlIGUudWkua2V5Q29kZS5QQUdFX0RPV046cz10aGlzLl90cmltQWxpZ25WYWx1ZShpLSh0aGlzLl92YWx1ZU1heCgpLXRoaXMuX3ZhbHVlTWluKCkpL24pO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLlVQOmNhc2UgZS51aS5rZXlDb2RlLlJJR0hUOmlmKGk9PT10aGlzLl92YWx1ZU1heCgpKXJldHVybjtzPXRoaXMuX3RyaW1BbGlnblZhbHVlKGkrbyk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuRE9XTjpjYXNlIGUudWkua2V5Q29kZS5MRUZUOmlmKGk9PT10aGlzLl92YWx1ZU1pbigpKXJldHVybjtzPXRoaXMuX3RyaW1BbGlnblZhbHVlKGktbyl9dGhpcy5fc2xpZGUodCx1LHMpfSxrZXl1cDpmdW5jdGlvbih0KXt2YXIgbj1lKHQudGFyZ2V0KS5kYXRhKCJ1aS1zbGlkZXItaGFuZGxlLWluZGV4Iik7dGhpcy5fa2V5U2xpZGluZyYmKHRoaXMuX2tleVNsaWRpbmc9ITEsdGhpcy5fc3RvcCh0LG4pLHRoaXMuX2NoYW5nZSh0LG4pLGUodC50YXJnZXQpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKSl9fSksdGhpcy5fcmVmcmVzaFZhbHVlKCksdGhpcy5fYW5pbWF0ZU9mZj0hMX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmhhbmRsZXMucmVtb3ZlKCksdGhpcy5yYW5nZS5yZW1vdmUoKSx0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNsaWRlciB1aS1zbGlkZXItaG9yaXpvbnRhbCB1aS1zbGlkZXItdmVydGljYWwgdWktc2xpZGVyLWRpc2FibGVkIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIiksdGhpcy5fbW91c2VEZXN0cm95KCl9LF9tb3VzZUNhcHR1cmU6ZnVuY3Rpb24odCl7dmFyIG4scixpLHMsbyx1LGEsZixsPXRoaXMsYz10aGlzLm9wdGlvbnM7cmV0dXJuIGMuZGlzYWJsZWQ/ITE6KHRoaXMuZWxlbWVudFNpemU9e3dpZHRoOnRoaXMuZWxlbWVudC5vdXRlcldpZHRoKCksaGVpZ2h0OnRoaXMuZWxlbWVudC5vdXRlckhlaWdodCgpfSx0aGlzLmVsZW1lbnRPZmZzZXQ9dGhpcy5lbGVtZW50Lm9mZnNldCgpLG49e3g6dC5wYWdlWCx5OnQucGFnZVl9LHI9dGhpcy5fbm9ybVZhbHVlRnJvbU1vdXNlKG4pLGk9dGhpcy5fdmFsdWVNYXgoKS10aGlzLl92YWx1ZU1pbigpKzEsdGhpcy5oYW5kbGVzLmVhY2goZnVuY3Rpb24odCl7dmFyIG49TWF0aC5hYnMoci1sLnZhbHVlcyh0KSk7aT5uJiYoaT1uLHM9ZSh0aGlzKSxvPXQpfSksYy5yYW5nZT09PSEwJiZ0aGlzLnZhbHVlcygxKT09PWMubWluJiYobys9MSxzPWUodGhpcy5oYW5kbGVzW29dKSksdT10aGlzLl9zdGFydCh0LG8pLHU9PT0hMT8hMToodGhpcy5fbW91c2VTbGlkaW5nPSEwLHRoaXMuX2hhbmRsZUluZGV4PW8scy5hZGRDbGFzcygidWktc3RhdGUtYWN0aXZlIikuZm9jdXMoKSxhPXMub2Zmc2V0KCksZj0hZSh0LnRhcmdldCkucGFyZW50cygpLmFuZFNlbGYoKS5pcygiLnVpLXNsaWRlci1oYW5kbGUiKSx0aGlzLl9jbGlja09mZnNldD1mP3tsZWZ0OjAsdG9wOjB9OntsZWZ0OnQucGFnZVgtYS5sZWZ0LXMud2lkdGgoKS8yLHRvcDp0LnBhZ2VZLWEudG9wLXMuaGVpZ2h0KCkvMi0ocGFyc2VJbnQocy5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKS0ocGFyc2VJbnQocy5jc3MoImJvcmRlckJvdHRvbVdpZHRoIiksMTApfHwwKSsocGFyc2VJbnQocy5jc3MoIm1hcmdpblRvcCIpLDEwKXx8MCl9LHRoaXMuaGFuZGxlcy5oYXNDbGFzcygidWktc3RhdGUtaG92ZXIiKXx8dGhpcy5fc2xpZGUodCxvLHIpLHRoaXMuX2FuaW1hdGVPZmY9ITAsITApKX0sX21vdXNlU3RhcnQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sX21vdXNlRHJhZzpmdW5jdGlvbihlKXt2YXIgdD17eDplLnBhZ2VYLHk6ZS5wYWdlWX0sbj10aGlzLl9ub3JtVmFsdWVGcm9tTW91c2UodCk7cmV0dXJuIHRoaXMuX3NsaWRlKGUsdGhpcy5faGFuZGxlSW5kZXgsbiksITF9LF9tb3VzZVN0b3A6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuaGFuZGxlcy5yZW1vdmVDbGFzcygidWktc3RhdGUtYWN0aXZlIiksdGhpcy5fbW91c2VTbGlkaW5nPSExLHRoaXMuX3N0b3AoZSx0aGlzLl9oYW5kbGVJbmRleCksdGhpcy5fY2hhbmdlKGUsdGhpcy5faGFuZGxlSW5kZXgpLHRoaXMuX2hhbmRsZUluZGV4PW51bGwsdGhpcy5fY2xpY2tPZmZzZXQ9bnVsbCx0aGlzLl9hbmltYXRlT2ZmPSExLCExfSxfZGV0ZWN0T3JpZW50YXRpb246ZnVuY3Rpb24oKXt0aGlzLm9yaWVudGF0aW9uPXRoaXMub3B0aW9ucy5vcmllbnRhdGlvbj09PSJ2ZXJ0aWNhbCI/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9LF9ub3JtVmFsdWVGcm9tTW91c2U6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGkscztyZXR1cm4gdGhpcy5vcmllbnRhdGlvbj09PSJob3Jpem9udGFsIj8odD10aGlzLmVsZW1lbnRTaXplLndpZHRoLG49ZS54LXRoaXMuZWxlbWVudE9mZnNldC5sZWZ0LSh0aGlzLl9jbGlja09mZnNldD90aGlzLl9jbGlja09mZnNldC5sZWZ0OjApKToodD10aGlzLmVsZW1lbnRTaXplLmhlaWdodCxuPWUueS10aGlzLmVsZW1lbnRPZmZzZXQudG9wLSh0aGlzLl9jbGlja09mZnNldD90aGlzLl9jbGlja09mZnNldC50b3A6MCkpLHI9bi90LHI+MSYmKHI9MSkscjwwJiYocj0wKSx0aGlzLm9yaWVudGF0aW9uPT09InZlcnRpY2FsIiYmKHI9MS1yKSxpPXRoaXMuX3ZhbHVlTWF4KCktdGhpcy5fdmFsdWVNaW4oKSxzPXRoaXMuX3ZhbHVlTWluKCkrcippLHRoaXMuX3RyaW1BbGlnblZhbHVlKHMpfSxfc3RhcnQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj17aGFuZGxlOnRoaXMuaGFuZGxlc1t0XSx2YWx1ZTp0aGlzLnZhbHVlKCl9O3JldHVybiB0aGlzLm9wdGlvbnMudmFsdWVzJiZ0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aCYmKG4udmFsdWU9dGhpcy52YWx1ZXModCksbi52YWx1ZXM9dGhpcy52YWx1ZXMoKSksdGhpcy5fdHJpZ2dlcigic3RhcnQiLGUsbil9LF9zbGlkZTpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxzO3RoaXMub3B0aW9ucy52YWx1ZXMmJnRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoPyhyPXRoaXMudmFsdWVzKHQ/MDoxKSx0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aD09PTImJnRoaXMub3B0aW9ucy5yYW5nZT09PSEwJiYodD09PTAmJm4+cnx8dD09PTEmJm48cikmJihuPXIpLG4hPT10aGlzLnZhbHVlcyh0KSYmKGk9dGhpcy52YWx1ZXMoKSxpW3RdPW4scz10aGlzLl90cmlnZ2VyKCJzbGlkZSIsZSx7aGFuZGxlOnRoaXMuaGFuZGxlc1t0XSx2YWx1ZTpuLHZhbHVlczppfSkscj10aGlzLnZhbHVlcyh0PzA6MSkscyE9PSExJiZ0aGlzLnZhbHVlcyh0LG4sITApKSk6biE9PXRoaXMudmFsdWUoKSYmKHM9dGhpcy5fdHJpZ2dlcigic2xpZGUiLGUse2hhbmRsZTp0aGlzLmhhbmRsZXNbdF0sdmFsdWU6bn0pLHMhPT0hMSYmdGhpcy52YWx1ZShuKSl9LF9zdG9wOmZ1bmN0aW9uKGUsdCl7dmFyIG49e2hhbmRsZTp0aGlzLmhhbmRsZXNbdF0sdmFsdWU6dGhpcy52YWx1ZSgpfTt0aGlzLm9wdGlvbnMudmFsdWVzJiZ0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aCYmKG4udmFsdWU9dGhpcy52YWx1ZXModCksbi52YWx1ZXM9dGhpcy52YWx1ZXMoKSksdGhpcy5fdHJpZ2dlcigic3RvcCIsZSxuKX0sX2NoYW5nZTpmdW5jdGlvbihlLHQpe2lmKCF0aGlzLl9rZXlTbGlkaW5nJiYhdGhpcy5fbW91c2VTbGlkaW5nKXt2YXIgbj17aGFuZGxlOnRoaXMuaGFuZGxlc1t0XSx2YWx1ZTp0aGlzLnZhbHVlKCl9O3RoaXMub3B0aW9ucy52YWx1ZXMmJnRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoJiYobi52YWx1ZT10aGlzLnZhbHVlcyh0KSxuLnZhbHVlcz10aGlzLnZhbHVlcygpKSx0aGlzLl90cmlnZ2VyKCJjaGFuZ2UiLGUsbil9fSx2YWx1ZTpmdW5jdGlvbihlKXtpZihhcmd1bWVudHMubGVuZ3RoKXt0aGlzLm9wdGlvbnMudmFsdWU9dGhpcy5fdHJpbUFsaWduVmFsdWUoZSksdGhpcy5fcmVmcmVzaFZhbHVlKCksdGhpcy5fY2hhbmdlKG51bGwsMCk7cmV0dXJufXJldHVybiB0aGlzLl92YWx1ZSgpfSx2YWx1ZXM6ZnVuY3Rpb24odCxuKXt2YXIgcixpLHM7aWYoYXJndW1lbnRzLmxlbmd0aD4xKXt0aGlzLm9wdGlvbnMudmFsdWVzW3RdPXRoaXMuX3RyaW1BbGlnblZhbHVlKG4pLHRoaXMuX3JlZnJlc2hWYWx1ZSgpLHRoaXMuX2NoYW5nZShudWxsLHQpO3JldHVybn1pZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5fdmFsdWVzKCk7aWYoIWUuaXNBcnJheShhcmd1bWVudHNbMF0pKXJldHVybiB0aGlzLm9wdGlvbnMudmFsdWVzJiZ0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aD90aGlzLl92YWx1ZXModCk6dGhpcy52YWx1ZSgpO3I9dGhpcy5vcHRpb25zLnZhbHVlcyxpPWFyZ3VtZW50c1swXTtmb3Iocz0wO3M8ci5sZW5ndGg7cys9MSlyW3NdPXRoaXMuX3RyaW1BbGlnblZhbHVlKGlbc10pLHRoaXMuX2NoYW5nZShudWxsLHMpO3RoaXMuX3JlZnJlc2hWYWx1ZSgpfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKHQsbil7dmFyIHIsaT0wO2UuaXNBcnJheSh0aGlzLm9wdGlvbnMudmFsdWVzKSYmKGk9dGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGgpLGUuV2lkZ2V0LnByb3RvdHlwZS5fc2V0T3B0aW9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtzd2l0Y2godCl7Y2FzZSJkaXNhYmxlZCI6bj8odGhpcy5oYW5kbGVzLmZpbHRlcigiLnVpLXN0YXRlLWZvY3VzIikuYmx1cigpLHRoaXMuaGFuZGxlcy5yZW1vdmVDbGFzcygidWktc3RhdGUtaG92ZXIiKSx0aGlzLmhhbmRsZXMucHJvcCgiZGlzYWJsZWQiLCEwKSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWRpc2FibGVkIikpOih0aGlzLmhhbmRsZXMucHJvcCgiZGlzYWJsZWQiLCExKSx0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLWRpc2FibGVkIikpO2JyZWFrO2Nhc2Uib3JpZW50YXRpb24iOnRoaXMuX2RldGVjdE9yaWVudGF0aW9uKCksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zbGlkZXItaG9yaXpvbnRhbCB1aS1zbGlkZXItdmVydGljYWwiKS5hZGRDbGFzcygidWktc2xpZGVyLSIrdGhpcy5vcmllbnRhdGlvbiksdGhpcy5fcmVmcmVzaFZhbHVlKCk7YnJlYWs7Y2FzZSJ2YWx1ZSI6dGhpcy5fYW5pbWF0ZU9mZj0hMCx0aGlzLl9yZWZyZXNoVmFsdWUoKSx0aGlzLl9jaGFuZ2UobnVsbCwwKSx0aGlzLl9hbmltYXRlT2ZmPSExO2JyZWFrO2Nhc2UidmFsdWVzIjp0aGlzLl9hbmltYXRlT2ZmPSEwLHRoaXMuX3JlZnJlc2hWYWx1ZSgpO2ZvcihyPTA7cjxpO3IrPTEpdGhpcy5fY2hhbmdlKG51bGwscik7dGhpcy5fYW5pbWF0ZU9mZj0hMTticmVhaztjYXNlIm1pbiI6Y2FzZSJtYXgiOnRoaXMuX2FuaW1hdGVPZmY9ITAsdGhpcy5fcmVmcmVzaFZhbHVlKCksdGhpcy5fYW5pbWF0ZU9mZj0hMX19LF92YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3B0aW9ucy52YWx1ZTtyZXR1cm4gZT10aGlzLl90cmltQWxpZ25WYWx1ZShlKSxlfSxfdmFsdWVzOmZ1bmN0aW9uKGUpe3ZhciB0LG4scjtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiB0PXRoaXMub3B0aW9ucy52YWx1ZXNbZV0sdD10aGlzLl90cmltQWxpZ25WYWx1ZSh0KSx0O249dGhpcy5vcHRpb25zLnZhbHVlcy5zbGljZSgpO2ZvcihyPTA7cjxuLmxlbmd0aDtyKz0xKW5bcl09dGhpcy5fdHJpbUFsaWduVmFsdWUobltyXSk7cmV0dXJuIG59LF90cmltQWxpZ25WYWx1ZTpmdW5jdGlvbihlKXtpZihlPD10aGlzLl92YWx1ZU1pbigpKXJldHVybiB0aGlzLl92YWx1ZU1pbigpO2lmKGU+PXRoaXMuX3ZhbHVlTWF4KCkpcmV0dXJuIHRoaXMuX3ZhbHVlTWF4KCk7dmFyIHQ9dGhpcy5vcHRpb25zLnN0ZXA+MD90aGlzLm9wdGlvbnMuc3RlcDoxLG49KGUtdGhpcy5fdmFsdWVNaW4oKSkldCxyPWUtbjtyZXR1cm4gTWF0aC5hYnMobikqMj49dCYmKHIrPW4+MD90Oi10KSxwYXJzZUZsb2F0KHIudG9GaXhlZCg1KSl9LF92YWx1ZU1pbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMubWlufSxfdmFsdWVNYXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLm1heH0sX3JlZnJlc2hWYWx1ZTpmdW5jdGlvbigpe3ZhciB0LG4scixpLHMsbz10aGlzLm9wdGlvbnMucmFuZ2UsdT10aGlzLm9wdGlvbnMsYT10aGlzLGY9dGhpcy5fYW5pbWF0ZU9mZj8hMTp1LmFuaW1hdGUsbD17fTt0aGlzLm9wdGlvbnMudmFsdWVzJiZ0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aD90aGlzLmhhbmRsZXMuZWFjaChmdW5jdGlvbihyKXtuPShhLnZhbHVlcyhyKS1hLl92YWx1ZU1pbigpKS8oYS5fdmFsdWVNYXgoKS1hLl92YWx1ZU1pbigpKSoxMDAsbFthLm9yaWVudGF0aW9uPT09Imhvcml6b250YWwiPyJsZWZ0IjoiYm90dG9tIl09bisiJSIsZSh0aGlzKS5zdG9wKDEsMSlbZj8iYW5pbWF0ZSI6ImNzcyJdKGwsdS5hbmltYXRlKSxhLm9wdGlvbnMucmFuZ2U9PT0hMCYmKGEub3JpZW50YXRpb249PT0iaG9yaXpvbnRhbCI/KHI9PT0wJiZhLnJhbmdlLnN0b3AoMSwxKVtmPyJhbmltYXRlIjoiY3NzIl0oe2xlZnQ6bisiJSJ9LHUuYW5pbWF0ZSkscj09PTEmJmEucmFuZ2VbZj8iYW5pbWF0ZSI6ImNzcyJdKHt3aWR0aDpuLXQrIiUifSx7cXVldWU6ITEsZHVyYXRpb246dS5hbmltYXRlfSkpOihyPT09MCYmYS5yYW5nZS5zdG9wKDEsMSlbZj8iYW5pbWF0ZSI6ImNzcyJdKHtib3R0b206bisiJSJ9LHUuYW5pbWF0ZSkscj09PTEmJmEucmFuZ2VbZj8iYW5pbWF0ZSI6ImNzcyJdKHtoZWlnaHQ6bi10KyIlIn0se3F1ZXVlOiExLGR1cmF0aW9uOnUuYW5pbWF0ZX0pKSksdD1ufSk6KHI9dGhpcy52YWx1ZSgpLGk9dGhpcy5fdmFsdWVNaW4oKSxzPXRoaXMuX3ZhbHVlTWF4KCksbj1zIT09aT8oci1pKS8ocy1pKSoxMDA6MCxsW3RoaXMub3JpZW50YXRpb249PT0iaG9yaXpvbnRhbCI/ImxlZnQiOiJib3R0b20iXT1uKyIlIix0aGlzLmhhbmRsZS5zdG9wKDEsMSlbZj8iYW5pbWF0ZSI6ImNzcyJdKGwsdS5hbmltYXRlKSxvPT09Im1pbiImJnRoaXMub3JpZW50YXRpb249PT0iaG9yaXpvbnRhbCImJnRoaXMucmFuZ2Uuc3RvcCgxLDEpW2Y/ImFuaW1hdGUiOiJjc3MiXSh7d2lkdGg6bisiJSJ9LHUuYW5pbWF0ZSksbz09PSJtYXgiJiZ0aGlzLm9yaWVudGF0aW9uPT09Imhvcml6b250YWwiJiZ0aGlzLnJhbmdlW2Y/ImFuaW1hdGUiOiJjc3MiXSh7d2lkdGg6MTAwLW4rIiUifSx7cXVldWU6ITEsZHVyYXRpb246dS5hbmltYXRlfSksbz09PSJtaW4iJiZ0aGlzLm9yaWVudGF0aW9uPT09InZlcnRpY2FsIiYmdGhpcy5yYW5nZS5zdG9wKDEsMSlbZj8iYW5pbWF0ZSI6ImNzcyJdKHtoZWlnaHQ6bisiJSJ9LHUuYW5pbWF0ZSksbz09PSJtYXgiJiZ0aGlzLm9yaWVudGF0aW9uPT09InZlcnRpY2FsIiYmdGhpcy5yYW5nZVtmPyJhbmltYXRlIjoiY3NzIl0oe2hlaWdodDoxMDAtbisiJSJ9LHtxdWV1ZTohMSxkdXJhdGlvbjp1LmFuaW1hdGV9KSl9fSl9KShqUXVlcnkpOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciB0PXRoaXMuZWxlbWVudC52YWwoKTtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl9yZWZyZXNoKCksdCE9PXRoaXMuZWxlbWVudC52YWwoKSYmdGhpcy5fdHJpZ2dlcigiY2hhbmdlIil9fWUud2lkZ2V0KCJ1aS5zcGlubmVyIix7dmVyc2lvbjoiMS45LjIiLGRlZmF1bHRFbGVtZW50OiI8aW5wdXQ+Iix3aWRnZXRFdmVudFByZWZpeDoic3BpbiIsb3B0aW9uczp7Y3VsdHVyZTpudWxsLGljb25zOntkb3duOiJ1aS1pY29uLXRyaWFuZ2xlLTEtcyIsdXA6InVpLWljb24tdHJpYW5nbGUtMS1uIn0saW5jcmVtZW50YWw6ITAsbWF4Om51bGwsbWluOm51bGwsbnVtYmVyRm9ybWF0Om51bGwscGFnZToxMCxzdGVwOjEsY2hhbmdlOm51bGwsc3BpbjpudWxsLHN0YXJ0Om51bGwsc3RvcDpudWxsfSxfY3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5fc2V0T3B0aW9uKCJtYXgiLHRoaXMub3B0aW9ucy5tYXgpLHRoaXMuX3NldE9wdGlvbigibWluIix0aGlzLm9wdGlvbnMubWluKSx0aGlzLl9zZXRPcHRpb24oInN0ZXAiLHRoaXMub3B0aW9ucy5zdGVwKSx0aGlzLl92YWx1ZSh0aGlzLmVsZW1lbnQudmFsKCksITApLHRoaXMuX2RyYXcoKSx0aGlzLl9vbih0aGlzLl9ldmVudHMpLHRoaXMuX3JlZnJlc2goKSx0aGlzLl9vbih0aGlzLndpbmRvdyx7YmVmb3JldW5sb2FkOmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUF0dHIoImF1dG9jb21wbGV0ZSIpfX0pfSxfZ2V0Q3JlYXRlT3B0aW9uczpmdW5jdGlvbigpe3ZhciB0PXt9LG49dGhpcy5lbGVtZW50O3JldHVybiBlLmVhY2goWyJtaW4iLCJtYXgiLCJzdGVwIl0sZnVuY3Rpb24oZSxyKXt2YXIgaT1uLmF0dHIocik7aSE9PXVuZGVmaW5lZCYmaS5sZW5ndGgmJih0W3JdPWkpfSksdH0sX2V2ZW50czp7a2V5ZG93bjpmdW5jdGlvbihlKXt0aGlzLl9zdGFydChlKSYmdGhpcy5fa2V5ZG93bihlKSYmZS5wcmV2ZW50RGVmYXVsdCgpfSxrZXl1cDoiX3N0b3AiLGZvY3VzOmZ1bmN0aW9uKCl7dGhpcy5wcmV2aW91cz10aGlzLmVsZW1lbnQudmFsKCl9LGJsdXI6ZnVuY3Rpb24oZSl7aWYodGhpcy5jYW5jZWxCbHVyKXtkZWxldGUgdGhpcy5jYW5jZWxCbHVyO3JldHVybn10aGlzLl9yZWZyZXNoKCksdGhpcy5wcmV2aW91cyE9PXRoaXMuZWxlbWVudC52YWwoKSYmdGhpcy5fdHJpZ2dlcigiY2hhbmdlIixlKX0sbW91c2V3aGVlbDpmdW5jdGlvbihlLHQpe2lmKCF0KXJldHVybjtpZighdGhpcy5zcGlubmluZyYmIXRoaXMuX3N0YXJ0KGUpKXJldHVybiExO3RoaXMuX3NwaW4oKHQ+MD8xOi0xKSp0aGlzLm9wdGlvbnMuc3RlcCxlKSxjbGVhclRpbWVvdXQodGhpcy5tb3VzZXdoZWVsVGltZXIpLHRoaXMubW91c2V3aGVlbFRpbWVyPXRoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7dGhpcy5zcGlubmluZyYmdGhpcy5fc3RvcChlKX0sMTAwKSxlLnByZXZlbnREZWZhdWx0KCl9LCJtb3VzZWRvd24gLnVpLXNwaW5uZXItYnV0dG9uIjpmdW5jdGlvbih0KXtmdW5jdGlvbiByKCl7dmFyIGU9dGhpcy5lbGVtZW50WzBdPT09dGhpcy5kb2N1bWVudFswXS5hY3RpdmVFbGVtZW50O2V8fCh0aGlzLmVsZW1lbnQuZm9jdXMoKSx0aGlzLnByZXZpb3VzPW4sdGhpcy5fZGVsYXkoZnVuY3Rpb24oKXt0aGlzLnByZXZpb3VzPW59KSl9dmFyIG47bj10aGlzLmVsZW1lbnRbMF09PT10aGlzLmRvY3VtZW50WzBdLmFjdGl2ZUVsZW1lbnQ/dGhpcy5wcmV2aW91czp0aGlzLmVsZW1lbnQudmFsKCksdC5wcmV2ZW50RGVmYXVsdCgpLHIuY2FsbCh0aGlzKSx0aGlzLmNhbmNlbEJsdXI9ITAsdGhpcy5fZGVsYXkoZnVuY3Rpb24oKXtkZWxldGUgdGhpcy5jYW5jZWxCbHVyLHIuY2FsbCh0aGlzKX0pO2lmKHRoaXMuX3N0YXJ0KHQpPT09ITEpcmV0dXJuO3RoaXMuX3JlcGVhdChudWxsLGUodC5jdXJyZW50VGFyZ2V0KS5oYXNDbGFzcygidWktc3Bpbm5lci11cCIpPzE6LTEsdCl9LCJtb3VzZXVwIC51aS1zcGlubmVyLWJ1dHRvbiI6Il9zdG9wIiwibW91c2VlbnRlciAudWktc3Bpbm5lci1idXR0b24iOmZ1bmN0aW9uKHQpe2lmKCFlKHQuY3VycmVudFRhcmdldCkuaGFzQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpKXJldHVybjtpZih0aGlzLl9zdGFydCh0KT09PSExKXJldHVybiExO3RoaXMuX3JlcGVhdChudWxsLGUodC5jdXJyZW50VGFyZ2V0KS5oYXNDbGFzcygidWktc3Bpbm5lci11cCIpPzE6LTEsdCl9LCJtb3VzZWxlYXZlIC51aS1zcGlubmVyLWJ1dHRvbiI6Il9zdG9wIn0sX2RyYXc6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnVpU3Bpbm5lcj10aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLXNwaW5uZXItaW5wdXQiKS5hdHRyKCJhdXRvY29tcGxldGUiLCJvZmYiKS53cmFwKHRoaXMuX3VpU3Bpbm5lckh0bWwoKSkucGFyZW50KCkuYXBwZW5kKHRoaXMuX2J1dHRvbkh0bWwoKSk7dGhpcy5lbGVtZW50LmF0dHIoInJvbGUiLCJzcGluYnV0dG9uIiksdGhpcy5idXR0b25zPWUuZmluZCgiLnVpLXNwaW5uZXItYnV0dG9uIikuYXR0cigidGFiSW5kZXgiLC0xKS5idXR0b24oKS5yZW1vdmVDbGFzcygidWktY29ybmVyLWFsbCIpLHRoaXMuYnV0dG9ucy5oZWlnaHQoKT5NYXRoLmNlaWwoZS5oZWlnaHQoKSouNSkmJmUuaGVpZ2h0KCk+MCYmZS5oZWlnaHQoZS5oZWlnaHQoKSksdGhpcy5vcHRpb25zLmRpc2FibGVkJiZ0aGlzLmRpc2FibGUoKX0sX2tleWRvd246ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5vcHRpb25zLHI9ZS51aS5rZXlDb2RlO3N3aXRjaCh0LmtleUNvZGUpe2Nhc2Ugci5VUDpyZXR1cm4gdGhpcy5fcmVwZWF0KG51bGwsMSx0KSwhMDtjYXNlIHIuRE9XTjpyZXR1cm4gdGhpcy5fcmVwZWF0KG51bGwsLTEsdCksITA7Y2FzZSByLlBBR0VfVVA6cmV0dXJuIHRoaXMuX3JlcGVhdChudWxsLG4ucGFnZSx0KSwhMDtjYXNlIHIuUEFHRV9ET1dOOnJldHVybiB0aGlzLl9yZXBlYXQobnVsbCwtbi5wYWdlLHQpLCEwfXJldHVybiExfSxfdWlTcGlubmVySHRtbDpmdW5jdGlvbigpe3JldHVybiI8c3BhbiBjbGFzcz0ndWktc3Bpbm5lciB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCc+PC9zcGFuPiJ9LF9idXR0b25IdG1sOmZ1bmN0aW9uKCl7cmV0dXJuIjxhIGNsYXNzPSd1aS1zcGlubmVyLWJ1dHRvbiB1aS1zcGlubmVyLXVwIHVpLWNvcm5lci10cic+PHNwYW4gY2xhc3M9J3VpLWljb24gIit0aGlzLm9wdGlvbnMuaWNvbnMudXArIic+JiM5NjUwOzwvc3Bhbj4iKyI8L2E+IisiPGEgY2xhc3M9J3VpLXNwaW5uZXItYnV0dG9uIHVpLXNwaW5uZXItZG93biB1aS1jb3JuZXItYnInPiIrIjxzcGFuIGNsYXNzPSd1aS1pY29uICIrdGhpcy5vcHRpb25zLmljb25zLmRvd24rIic+JiM5NjYwOzwvc3Bhbj4iKyI8L2E+In0sX3N0YXJ0OmZ1bmN0aW9uKGUpe3JldHVybiF0aGlzLnNwaW5uaW5nJiZ0aGlzLl90cmlnZ2VyKCJzdGFydCIsZSk9PT0hMT8hMToodGhpcy5jb3VudGVyfHwodGhpcy5jb3VudGVyPTEpLHRoaXMuc3Bpbm5pbmc9ITAsITApfSxfcmVwZWF0OmZ1bmN0aW9uKGUsdCxuKXtlPWV8fDUwMCxjbGVhclRpbWVvdXQodGhpcy50aW1lciksdGhpcy50aW1lcj10aGlzLl9kZWxheShmdW5jdGlvbigpe3RoaXMuX3JlcGVhdCg0MCx0LG4pfSxlKSx0aGlzLl9zcGluKHQqdGhpcy5vcHRpb25zLnN0ZXAsbil9LF9zcGluOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy52YWx1ZSgpfHwwO3RoaXMuY291bnRlcnx8KHRoaXMuY291bnRlcj0xKSxuPXRoaXMuX2FkanVzdFZhbHVlKG4rZSp0aGlzLl9pbmNyZW1lbnQodGhpcy5jb3VudGVyKSk7aWYoIXRoaXMuc3Bpbm5pbmd8fHRoaXMuX3RyaWdnZXIoInNwaW4iLHQse3ZhbHVlOm59KSE9PSExKXRoaXMuX3ZhbHVlKG4pLHRoaXMuY291bnRlcisrfSxfaW5jcmVtZW50OmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMub3B0aW9ucy5pbmNyZW1lbnRhbDtyZXR1cm4gbj9lLmlzRnVuY3Rpb24obik/bih0KTpNYXRoLmZsb29yKHQqdCp0LzVlNC10KnQvNTAwKzE3KnQvMjAwKzEpOjF9LF9wcmVjaXNpb246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9wcmVjaXNpb25PZih0aGlzLm9wdGlvbnMuc3RlcCk7cmV0dXJuIHRoaXMub3B0aW9ucy5taW4hPT1udWxsJiYoZT1NYXRoLm1heChlLHRoaXMuX3ByZWNpc2lvbk9mKHRoaXMub3B0aW9ucy5taW4pKSksZX0sX3ByZWNpc2lvbk9mOmZ1bmN0aW9uKGUpe3ZhciB0PWUudG9TdHJpbmcoKSxuPXQuaW5kZXhPZigiLiIpO3JldHVybiBuPT09LTE/MDp0Lmxlbmd0aC1uLTF9LF9hZGp1c3RWYWx1ZTpmdW5jdGlvbihlKXt2YXIgdCxuLHI9dGhpcy5vcHRpb25zO3JldHVybiB0PXIubWluIT09bnVsbD9yLm1pbjowLG49ZS10LG49TWF0aC5yb3VuZChuL3Iuc3RlcCkqci5zdGVwLGU9dCtuLGU9cGFyc2VGbG9hdChlLnRvRml4ZWQodGhpcy5fcHJlY2lzaW9uKCkpKSxyLm1heCE9PW51bGwmJmU+ci5tYXg/ci5tYXg6ci5taW4hPT1udWxsJiZlPHIubWluP3IubWluOmV9LF9zdG9wOmZ1bmN0aW9uKGUpe2lmKCF0aGlzLnNwaW5uaW5nKXJldHVybjtjbGVhclRpbWVvdXQodGhpcy50aW1lciksY2xlYXJUaW1lb3V0KHRoaXMubW91c2V3aGVlbFRpbWVyKSx0aGlzLmNvdW50ZXI9MCx0aGlzLnNwaW5uaW5nPSExLHRoaXMuX3RyaWdnZXIoInN0b3AiLGUpfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKGUsdCl7aWYoZT09PSJjdWx0dXJlInx8ZT09PSJudW1iZXJGb3JtYXQiKXt2YXIgbj10aGlzLl9wYXJzZSh0aGlzLmVsZW1lbnQudmFsKCkpO3RoaXMub3B0aW9uc1tlXT10LHRoaXMuZWxlbWVudC52YWwodGhpcy5fZm9ybWF0KG4pKTtyZXR1cm59KGU9PT0ibWF4Inx8ZT09PSJtaW4ifHxlPT09InN0ZXAiKSYmdHlwZW9mIHQ9PSJzdHJpbmciJiYodD10aGlzLl9wYXJzZSh0KSksdGhpcy5fc3VwZXIoZSx0KSxlPT09ImRpc2FibGVkIiYmKHQ/KHRoaXMuZWxlbWVudC5wcm9wKCJkaXNhYmxlZCIsITApLHRoaXMuYnV0dG9ucy5idXR0b24oImRpc2FibGUiKSk6KHRoaXMuZWxlbWVudC5wcm9wKCJkaXNhYmxlZCIsITEpLHRoaXMuYnV0dG9ucy5idXR0b24oImVuYWJsZSIpKSl9LF9zZXRPcHRpb25zOnQoZnVuY3Rpb24oZSl7dGhpcy5fc3VwZXIoZSksdGhpcy5fdmFsdWUodGhpcy5lbGVtZW50LnZhbCgpKX0pLF9wYXJzZTpmdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGU9PSJzdHJpbmciJiZlIT09IiImJihlPXdpbmRvdy5HbG9iYWxpemUmJnRoaXMub3B0aW9ucy5udW1iZXJGb3JtYXQ/R2xvYmFsaXplLnBhcnNlRmxvYXQoZSwxMCx0aGlzLm9wdGlvbnMuY3VsdHVyZSk6K2UpLGU9PT0iInx8aXNOYU4oZSk/bnVsbDplfSxfZm9ybWF0OmZ1bmN0aW9uKGUpe3JldHVybiBlPT09IiI/IiI6d2luZG93Lkdsb2JhbGl6ZSYmdGhpcy5vcHRpb25zLm51bWJlckZvcm1hdD9HbG9iYWxpemUuZm9ybWF0KGUsdGhpcy5vcHRpb25zLm51bWJlckZvcm1hdCx0aGlzLm9wdGlvbnMuY3VsdHVyZSk6ZX0sX3JlZnJlc2g6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQuYXR0cih7ImFyaWEtdmFsdWVtaW4iOnRoaXMub3B0aW9ucy5taW4sImFyaWEtdmFsdWVtYXgiOnRoaXMub3B0aW9ucy5tYXgsImFyaWEtdmFsdWVub3ciOnRoaXMuX3BhcnNlKHRoaXMuZWxlbWVudC52YWwoKSl9KX0sX3ZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG47ZSE9PSIiJiYobj10aGlzLl9wYXJzZShlKSxuIT09bnVsbCYmKHR8fChuPXRoaXMuX2FkanVzdFZhbHVlKG4pKSxlPXRoaXMuX2Zvcm1hdChuKSkpLHRoaXMuZWxlbWVudC52YWwoZSksdGhpcy5fcmVmcmVzaCgpfSxfZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktc3Bpbm5lci1pbnB1dCIpLnByb3AoImRpc2FibGVkIiwhMSkucmVtb3ZlQXR0cigiYXV0b2NvbXBsZXRlIikucmVtb3ZlQXR0cigicm9sZSIpLnJlbW92ZUF0dHIoImFyaWEtdmFsdWVtaW4iKS5yZW1vdmVBdHRyKCJhcmlhLXZhbHVlbWF4IikucmVtb3ZlQXR0cigiYXJpYS12YWx1ZW5vdyIpLHRoaXMudWlTcGlubmVyLnJlcGxhY2VXaXRoKHRoaXMuZWxlbWVudCl9LHN0ZXBVcDp0KGZ1bmN0aW9uKGUpe3RoaXMuX3N0ZXBVcChlKX0pLF9zdGVwVXA6ZnVuY3Rpb24oZSl7dGhpcy5fc3BpbigoZXx8MSkqdGhpcy5vcHRpb25zLnN0ZXApfSxzdGVwRG93bjp0KGZ1bmN0aW9uKGUpe3RoaXMuX3N0ZXBEb3duKGUpfSksX3N0ZXBEb3duOmZ1bmN0aW9uKGUpe3RoaXMuX3NwaW4oKGV8fDEpKi10aGlzLm9wdGlvbnMuc3RlcCl9LHBhZ2VVcDp0KGZ1bmN0aW9uKGUpe3RoaXMuX3N0ZXBVcCgoZXx8MSkqdGhpcy5vcHRpb25zLnBhZ2UpfSkscGFnZURvd246dChmdW5jdGlvbihlKXt0aGlzLl9zdGVwRG93bigoZXx8MSkqdGhpcy5vcHRpb25zLnBhZ2UpfSksdmFsdWU6ZnVuY3Rpb24oZSl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuX3BhcnNlKHRoaXMuZWxlbWVudC52YWwoKSk7dCh0aGlzLl92YWx1ZSkuY2FsbCh0aGlzLGUpfSx3aWRnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51aVNwaW5uZXJ9fSl9KShqUXVlcnkpOyhmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIGkoKXtyZXR1cm4rK259ZnVuY3Rpb24gcyhlKXtyZXR1cm4gZS5oYXNoLmxlbmd0aD4xJiZlLmhyZWYucmVwbGFjZShyLCIiKT09PWxvY2F0aW9uLmhyZWYucmVwbGFjZShyLCIiKS5yZXBsYWNlKC9ccy9nLCIlMjAiKX12YXIgbj0wLHI9LyMuKiQvO2Uud2lkZ2V0KCJ1aS50YWJzIix7dmVyc2lvbjoiMS45LjIiLGRlbGF5OjMwMCxvcHRpb25zOnthY3RpdmU6bnVsbCxjb2xsYXBzaWJsZTohMSxldmVudDoiY2xpY2siLGhlaWdodFN0eWxlOiJjb250ZW50IixoaWRlOm51bGwsc2hvdzpudWxsLGFjdGl2YXRlOm51bGwsYmVmb3JlQWN0aXZhdGU6bnVsbCxiZWZvcmVMb2FkOm51bGwsbG9hZDpudWxsfSxfY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxuPXRoaXMub3B0aW9ucyxyPW4uYWN0aXZlLGk9bG9jYXRpb24uaGFzaC5zdWJzdHJpbmcoMSk7dGhpcy5ydW5uaW5nPSExLHRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktdGFicyB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCIpLnRvZ2dsZUNsYXNzKCJ1aS10YWJzLWNvbGxhcHNpYmxlIixuLmNvbGxhcHNpYmxlKS5kZWxlZ2F0ZSgiLnVpLXRhYnMtbmF2ID4gbGkiLCJtb3VzZWRvd24iK3RoaXMuZXZlbnROYW1lc3BhY2UsZnVuY3Rpb24odCl7ZSh0aGlzKS5pcygiLnVpLXN0YXRlLWRpc2FibGVkIikmJnQucHJldmVudERlZmF1bHQoKX0pLmRlbGVnYXRlKCIudWktdGFicy1hbmNob3IiLCJmb2N1cyIrdGhpcy5ldmVudE5hbWVzcGFjZSxmdW5jdGlvbigpe2UodGhpcykuY2xvc2VzdCgibGkiKS5pcygiLnVpLXN0YXRlLWRpc2FibGVkIikmJnRoaXMuYmx1cigpfSksdGhpcy5fcHJvY2Vzc1RhYnMoKTtpZihyPT09bnVsbCl7aSYmdGhpcy50YWJzLmVhY2goZnVuY3Rpb24odCxuKXtpZihlKG4pLmF0dHIoImFyaWEtY29udHJvbHMiKT09PWkpcmV0dXJuIHI9dCwhMX0pLHI9PT1udWxsJiYocj10aGlzLnRhYnMuaW5kZXgodGhpcy50YWJzLmZpbHRlcigiLnVpLXRhYnMtYWN0aXZlIikpKTtpZihyPT09bnVsbHx8cj09PS0xKXI9dGhpcy50YWJzLmxlbmd0aD8wOiExfXIhPT0hMSYmKHI9dGhpcy50YWJzLmluZGV4KHRoaXMudGFicy5lcShyKSkscj09PS0xJiYocj1uLmNvbGxhcHNpYmxlPyExOjApKSxuLmFjdGl2ZT1yLCFuLmNvbGxhcHNpYmxlJiZuLmFjdGl2ZT09PSExJiZ0aGlzLmFuY2hvcnMubGVuZ3RoJiYobi5hY3RpdmU9MCksZS5pc0FycmF5KG4uZGlzYWJsZWQpJiYobi5kaXNhYmxlZD1lLnVuaXF1ZShuLmRpc2FibGVkLmNvbmNhdChlLm1hcCh0aGlzLnRhYnMuZmlsdGVyKCIudWktc3RhdGUtZGlzYWJsZWQiKSxmdW5jdGlvbihlKXtyZXR1cm4gdC50YWJzLmluZGV4KGUpfSkpKS5zb3J0KCkpLHRoaXMub3B0aW9ucy5hY3RpdmUhPT0hMSYmdGhpcy5hbmNob3JzLmxlbmd0aD90aGlzLmFjdGl2ZT10aGlzLl9maW5kQWN0aXZlKHRoaXMub3B0aW9ucy5hY3RpdmUpOnRoaXMuYWN0aXZlPWUoKSx0aGlzLl9yZWZyZXNoKCksdGhpcy5hY3RpdmUubGVuZ3RoJiZ0aGlzLmxvYWQobi5hY3RpdmUpfSxfZ2V0Q3JlYXRlRXZlbnREYXRhOmZ1bmN0aW9uKCl7cmV0dXJue3RhYjp0aGlzLmFjdGl2ZSxwYW5lbDp0aGlzLmFjdGl2ZS5sZW5ndGg/dGhpcy5fZ2V0UGFuZWxGb3JUYWIodGhpcy5hY3RpdmUpOmUoKX19LF90YWJLZXlkb3duOmZ1bmN0aW9uKHQpe3ZhciBuPWUodGhpcy5kb2N1bWVudFswXS5hY3RpdmVFbGVtZW50KS5jbG9zZXN0KCJsaSIpLHI9dGhpcy50YWJzLmluZGV4KG4pLGk9ITA7aWYodGhpcy5faGFuZGxlUGFnZU5hdih0KSlyZXR1cm47c3dpdGNoKHQua2V5Q29kZSl7Y2FzZSBlLnVpLmtleUNvZGUuUklHSFQ6Y2FzZSBlLnVpLmtleUNvZGUuRE9XTjpyKys7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuVVA6Y2FzZSBlLnVpLmtleUNvZGUuTEVGVDppPSExLHItLTticmVhaztjYXNlIGUudWkua2V5Q29kZS5FTkQ6cj10aGlzLmFuY2hvcnMubGVuZ3RoLTE7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuSE9NRTpyPTA7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuU1BBQ0U6dC5wcmV2ZW50RGVmYXVsdCgpLGNsZWFyVGltZW91dCh0aGlzLmFjdGl2YXRpbmcpLHRoaXMuX2FjdGl2YXRlKHIpO3JldHVybjtjYXNlIGUudWkua2V5Q29kZS5FTlRFUjp0LnByZXZlbnREZWZhdWx0KCksY2xlYXJUaW1lb3V0KHRoaXMuYWN0aXZhdGluZyksdGhpcy5fYWN0aXZhdGUocj09PXRoaXMub3B0aW9ucy5hY3RpdmU/ITE6cik7cmV0dXJuO2RlZmF1bHQ6cmV0dXJufXQucHJldmVudERlZmF1bHQoKSxjbGVhclRpbWVvdXQodGhpcy5hY3RpdmF0aW5nKSxyPXRoaXMuX2ZvY3VzTmV4dFRhYihyLGkpLHQuY3RybEtleXx8KG4uYXR0cigiYXJpYS1zZWxlY3RlZCIsImZhbHNlIiksdGhpcy50YWJzLmVxKHIpLmF0dHIoImFyaWEtc2VsZWN0ZWQiLCJ0cnVlIiksdGhpcy5hY3RpdmF0aW5nPXRoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7dGhpcy5vcHRpb24oImFjdGl2ZSIscil9LHRoaXMuZGVsYXkpKX0sX3BhbmVsS2V5ZG93bjpmdW5jdGlvbih0KXtpZih0aGlzLl9oYW5kbGVQYWdlTmF2KHQpKXJldHVybjt0LmN0cmxLZXkmJnQua2V5Q29kZT09PWUudWkua2V5Q29kZS5VUCYmKHQucHJldmVudERlZmF1bHQoKSx0aGlzLmFjdGl2ZS5mb2N1cygpKX0sX2hhbmRsZVBhZ2VOYXY6ZnVuY3Rpb24odCl7aWYodC5hbHRLZXkmJnQua2V5Q29kZT09PWUudWkua2V5Q29kZS5QQUdFX1VQKXJldHVybiB0aGlzLl9hY3RpdmF0ZSh0aGlzLl9mb2N1c05leHRUYWIodGhpcy5vcHRpb25zLmFjdGl2ZS0xLCExKSksITA7aWYodC5hbHRLZXkmJnQua2V5Q29kZT09PWUudWkua2V5Q29kZS5QQUdFX0RPV04pcmV0dXJuIHRoaXMuX2FjdGl2YXRlKHRoaXMuX2ZvY3VzTmV4dFRhYih0aGlzLm9wdGlvbnMuYWN0aXZlKzEsITApKSwhMH0sX2ZpbmROZXh0VGFiOmZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gaSgpe3JldHVybiB0PnImJih0PTApLHQ8MCYmKHQ9ciksdH12YXIgcj10aGlzLnRhYnMubGVuZ3RoLTE7d2hpbGUoZS5pbkFycmF5KGkoKSx0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIT09LTEpdD1uP3QrMTp0LTE7cmV0dXJuIHR9LF9mb2N1c05leHRUYWI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT10aGlzLl9maW5kTmV4dFRhYihlLHQpLHRoaXMudGFicy5lcShlKS5mb2N1cygpLGV9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXtpZihlPT09ImFjdGl2ZSIpe3RoaXMuX2FjdGl2YXRlKHQpO3JldHVybn1pZihlPT09ImRpc2FibGVkIil7dGhpcy5fc2V0dXBEaXNhYmxlZCh0KTtyZXR1cm59dGhpcy5fc3VwZXIoZSx0KSxlPT09ImNvbGxhcHNpYmxlIiYmKHRoaXMuZWxlbWVudC50b2dnbGVDbGFzcygidWktdGFicy1jb2xsYXBzaWJsZSIsdCksIXQmJnRoaXMub3B0aW9ucy5hY3RpdmU9PT0hMSYmdGhpcy5fYWN0aXZhdGUoMCkpLGU9PT0iZXZlbnQiJiZ0aGlzLl9zZXR1cEV2ZW50cyh0KSxlPT09ImhlaWdodFN0eWxlIiYmdGhpcy5fc2V0dXBIZWlnaHRTdHlsZSh0KX0sX3RhYklkOmZ1bmN0aW9uKGUpe3JldHVybiBlLmF0dHIoImFyaWEtY29udHJvbHMiKXx8InVpLXRhYnMtIitpKCl9LF9zYW5pdGl6ZVNlbGVjdG9yOmZ1bmN0aW9uKGUpe3JldHVybiBlP2UucmVwbGFjZSgvWyEiJCUmJygpKissLlwvOjs8PT4/QFxbXF1cXmB7fH1+XS9nLCJcXCQmIik6IiJ9LHJlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMsbj10aGlzLnRhYmxpc3QuY2hpbGRyZW4oIjpoYXMoYVtocmVmXSkiKTt0LmRpc2FibGVkPWUubWFwKG4uZmlsdGVyKCIudWktc3RhdGUtZGlzYWJsZWQiKSxmdW5jdGlvbihlKXtyZXR1cm4gbi5pbmRleChlKX0pLHRoaXMuX3Byb2Nlc3NUYWJzKCksdC5hY3RpdmU9PT0hMXx8IXRoaXMuYW5jaG9ycy5sZW5ndGg/KHQuYWN0aXZlPSExLHRoaXMuYWN0aXZlPWUoKSk6dGhpcy5hY3RpdmUubGVuZ3RoJiYhZS5jb250YWlucyh0aGlzLnRhYmxpc3RbMF0sdGhpcy5hY3RpdmVbMF0pP3RoaXMudGFicy5sZW5ndGg9PT10LmRpc2FibGVkLmxlbmd0aD8odC5hY3RpdmU9ITEsdGhpcy5hY3RpdmU9ZSgpKTp0aGlzLl9hY3RpdmF0ZSh0aGlzLl9maW5kTmV4dFRhYihNYXRoLm1heCgwLHQuYWN0aXZlLTEpLCExKSk6dC5hY3RpdmU9dGhpcy50YWJzLmluZGV4KHRoaXMuYWN0aXZlKSx0aGlzLl9yZWZyZXNoKCl9LF9yZWZyZXNoOmZ1bmN0aW9uKCl7dGhpcy5fc2V0dXBEaXNhYmxlZCh0aGlzLm9wdGlvbnMuZGlzYWJsZWQpLHRoaXMuX3NldHVwRXZlbnRzKHRoaXMub3B0aW9ucy5ldmVudCksdGhpcy5fc2V0dXBIZWlnaHRTdHlsZSh0aGlzLm9wdGlvbnMuaGVpZ2h0U3R5bGUpLHRoaXMudGFicy5ub3QodGhpcy5hY3RpdmUpLmF0dHIoeyJhcmlhLXNlbGVjdGVkIjoiZmFsc2UiLHRhYkluZGV4Oi0xfSksdGhpcy5wYW5lbHMubm90KHRoaXMuX2dldFBhbmVsRm9yVGFiKHRoaXMuYWN0aXZlKSkuaGlkZSgpLmF0dHIoeyJhcmlhLWV4cGFuZGVkIjoiZmFsc2UiLCJhcmlhLWhpZGRlbiI6InRydWUifSksdGhpcy5hY3RpdmUubGVuZ3RoPyh0aGlzLmFjdGl2ZS5hZGRDbGFzcygidWktdGFicy1hY3RpdmUgdWktc3RhdGUtYWN0aXZlIikuYXR0cih7ImFyaWEtc2VsZWN0ZWQiOiJ0cnVlIix0YWJJbmRleDowfSksdGhpcy5fZ2V0UGFuZWxGb3JUYWIodGhpcy5hY3RpdmUpLnNob3coKS5hdHRyKHsiYXJpYS1leHBhbmRlZCI6InRydWUiLCJhcmlhLWhpZGRlbiI6ImZhbHNlIn0pKTp0aGlzLnRhYnMuZXEoMCkuYXR0cigidGFiSW5kZXgiLDApfSxfcHJvY2Vzc1RhYnM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMudGFibGlzdD10aGlzLl9nZXRMaXN0KCkuYWRkQ2xhc3MoInVpLXRhYnMtbmF2IHVpLWhlbHBlci1yZXNldCB1aS1oZWxwZXItY2xlYXJmaXggdWktd2lkZ2V0LWhlYWRlciB1aS1jb3JuZXItYWxsIikuYXR0cigicm9sZSIsInRhYmxpc3QiKSx0aGlzLnRhYnM9dGhpcy50YWJsaXN0LmZpbmQoIj4gbGk6aGFzKGFbaHJlZl0pIikuYWRkQ2xhc3MoInVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLXRvcCIpLmF0dHIoe3JvbGU6InRhYiIsdGFiSW5kZXg6LTF9KSx0aGlzLmFuY2hvcnM9dGhpcy50YWJzLm1hcChmdW5jdGlvbigpe3JldHVybiBlKCJhIix0aGlzKVswXX0pLmFkZENsYXNzKCJ1aS10YWJzLWFuY2hvciIpLmF0dHIoe3JvbGU6InByZXNlbnRhdGlvbiIsdGFiSW5kZXg6LTF9KSx0aGlzLnBhbmVscz1lKCksdGhpcy5hbmNob3JzLmVhY2goZnVuY3Rpb24obixyKXt2YXIgaSxvLHUsYT1lKHIpLnVuaXF1ZUlkKCkuYXR0cigiaWQiKSxmPWUocikuY2xvc2VzdCgibGkiKSxsPWYuYXR0cigiYXJpYS1jb250cm9scyIpO3Mocik/KGk9ci5oYXNoLG89dC5lbGVtZW50LmZpbmQodC5fc2FuaXRpemVTZWxlY3RvcihpKSkpOih1PXQuX3RhYklkKGYpLGk9IiMiK3Usbz10LmVsZW1lbnQuZmluZChpKSxvLmxlbmd0aHx8KG89dC5fY3JlYXRlUGFuZWwodSksby5pbnNlcnRBZnRlcih0LnBhbmVsc1tuLTFdfHx0LnRhYmxpc3QpKSxvLmF0dHIoImFyaWEtbGl2ZSIsInBvbGl0ZSIpKSxvLmxlbmd0aCYmKHQucGFuZWxzPXQucGFuZWxzLmFkZChvKSksbCYmZi5kYXRhKCJ1aS10YWJzLWFyaWEtY29udHJvbHMiLGwpLGYuYXR0cih7ImFyaWEtY29udHJvbHMiOmkuc3Vic3RyaW5nKDEpLCJhcmlhLWxhYmVsbGVkYnkiOmF9KSxvLmF0dHIoImFyaWEtbGFiZWxsZWRieSIsYSl9KSx0aGlzLnBhbmVscy5hZGRDbGFzcygidWktdGFicy1wYW5lbCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYm90dG9tIikuYXR0cigicm9sZSIsInRhYnBhbmVsIil9LF9nZXRMaXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudC5maW5kKCJvbCx1bCIpLmVxKDApfSxfY3JlYXRlUGFuZWw6ZnVuY3Rpb24odCl7cmV0dXJuIGUoIjxkaXY+IikuYXR0cigiaWQiLHQpLmFkZENsYXNzKCJ1aS10YWJzLXBhbmVsIHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1ib3R0b20iKS5kYXRhKCJ1aS10YWJzLWRlc3Ryb3kiLCEwKX0sX3NldHVwRGlzYWJsZWQ6ZnVuY3Rpb24odCl7ZS5pc0FycmF5KHQpJiYodC5sZW5ndGg/dC5sZW5ndGg9PT10aGlzLmFuY2hvcnMubGVuZ3RoJiYodD0hMCk6dD0hMSk7Zm9yKHZhciBuPTAscjtyPXRoaXMudGFic1tuXTtuKyspdD09PSEwfHxlLmluQXJyYXkobix0KSE9PS0xP2UocikuYWRkQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIikuYXR0cigiYXJpYS1kaXNhYmxlZCIsInRydWUiKTplKHIpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIpLnJlbW92ZUF0dHIoImFyaWEtZGlzYWJsZWQiKTt0aGlzLm9wdGlvbnMuZGlzYWJsZWQ9dH0sX3NldHVwRXZlbnRzOmZ1bmN0aW9uKHQpe3ZhciBuPXtjbGljazpmdW5jdGlvbihlKXtlLnByZXZlbnREZWZhdWx0KCl9fTt0JiZlLmVhY2godC5zcGxpdCgiICIpLGZ1bmN0aW9uKGUsdCl7blt0XT0iX2V2ZW50SGFuZGxlciJ9KSx0aGlzLl9vZmYodGhpcy5hbmNob3JzLmFkZCh0aGlzLnRhYnMpLmFkZCh0aGlzLnBhbmVscykpLHRoaXMuX29uKHRoaXMuYW5jaG9ycyxuKSx0aGlzLl9vbih0aGlzLnRhYnMse2tleWRvd246Il90YWJLZXlkb3duIn0pLHRoaXMuX29uKHRoaXMucGFuZWxzLHtrZXlkb3duOiJfcGFuZWxLZXlkb3duIn0pLHRoaXMuX2ZvY3VzYWJsZSh0aGlzLnRhYnMpLHRoaXMuX2hvdmVyYWJsZSh0aGlzLnRhYnMpfSxfc2V0dXBIZWlnaHRTdHlsZTpmdW5jdGlvbih0KXt2YXIgbixyLGk9dGhpcy5lbGVtZW50LnBhcmVudCgpO3Q9PT0iZmlsbCI/KGUuc3VwcG9ydC5taW5IZWlnaHR8fChyPWkuY3NzKCJvdmVyZmxvdyIpLGkuY3NzKCJvdmVyZmxvdyIsImhpZGRlbiIpKSxuPWkuaGVpZ2h0KCksdGhpcy5lbGVtZW50LnNpYmxpbmdzKCI6dmlzaWJsZSIpLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLHI9dC5jc3MoInBvc2l0aW9uIik7aWYocj09PSJhYnNvbHV0ZSJ8fHI9PT0iZml4ZWQiKXJldHVybjtuLT10Lm91dGVySGVpZ2h0KCEwKX0pLHImJmkuY3NzKCJvdmVyZmxvdyIsciksdGhpcy5lbGVtZW50LmNoaWxkcmVuKCkubm90KHRoaXMucGFuZWxzKS5lYWNoKGZ1bmN0aW9uKCl7bi09ZSh0aGlzKS5vdXRlckhlaWdodCghMCl9KSx0aGlzLnBhbmVscy5lYWNoKGZ1bmN0aW9uKCl7ZSh0aGlzKS5oZWlnaHQoTWF0aC5tYXgoMCxuLWUodGhpcykuaW5uZXJIZWlnaHQoKStlKHRoaXMpLmhlaWdodCgpKSl9KS5jc3MoIm92ZXJmbG93IiwiYXV0byIpKTp0PT09ImF1dG8iJiYobj0wLHRoaXMucGFuZWxzLmVhY2goZnVuY3Rpb24oKXtuPU1hdGgubWF4KG4sZSh0aGlzKS5oZWlnaHQoIiIpLmhlaWdodCgpKX0pLmhlaWdodChuKSl9LF9ldmVudEhhbmRsZXI6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5vcHRpb25zLHI9dGhpcy5hY3RpdmUsaT1lKHQuY3VycmVudFRhcmdldCkscz1pLmNsb3Nlc3QoImxpIiksbz1zWzBdPT09clswXSx1PW8mJm4uY29sbGFwc2libGUsYT11P2UoKTp0aGlzLl9nZXRQYW5lbEZvclRhYihzKSxmPXIubGVuZ3RoP3RoaXMuX2dldFBhbmVsRm9yVGFiKHIpOmUoKSxsPXtvbGRUYWI6cixvbGRQYW5lbDpmLG5ld1RhYjp1P2UoKTpzLG5ld1BhbmVsOmF9O3QucHJldmVudERlZmF1bHQoKTtpZihzLmhhc0NsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIpfHxzLmhhc0NsYXNzKCJ1aS10YWJzLWxvYWRpbmciKXx8dGhpcy5ydW5uaW5nfHxvJiYhbi5jb2xsYXBzaWJsZXx8dGhpcy5fdHJpZ2dlcigiYmVmb3JlQWN0aXZhdGUiLHQsbCk9PT0hMSlyZXR1cm47bi5hY3RpdmU9dT8hMTp0aGlzLnRhYnMuaW5kZXgocyksdGhpcy5hY3RpdmU9bz9lKCk6cyx0aGlzLnhociYmdGhpcy54aHIuYWJvcnQoKSwhZi5sZW5ndGgmJiFhLmxlbmd0aCYmZS5lcnJvcigialF1ZXJ5IFVJIFRhYnM6IE1pc21hdGNoaW5nIGZyYWdtZW50IGlkZW50aWZpZXIuIiksYS5sZW5ndGgmJnRoaXMubG9hZCh0aGlzLnRhYnMuaW5kZXgocyksdCksdGhpcy5fdG9nZ2xlKHQsbCl9LF90b2dnbGU6ZnVuY3Rpb24odCxuKXtmdW5jdGlvbiBvKCl7ci5ydW5uaW5nPSExLHIuX3RyaWdnZXIoImFjdGl2YXRlIix0LG4pfWZ1bmN0aW9uIHUoKXtuLm5ld1RhYi5jbG9zZXN0KCJsaSIpLmFkZENsYXNzKCJ1aS10YWJzLWFjdGl2ZSB1aS1zdGF0ZS1hY3RpdmUiKSxpLmxlbmd0aCYmci5vcHRpb25zLnNob3c/ci5fc2hvdyhpLHIub3B0aW9ucy5zaG93LG8pOihpLnNob3coKSxvKCkpfXZhciByPXRoaXMsaT1uLm5ld1BhbmVsLHM9bi5vbGRQYW5lbDt0aGlzLnJ1bm5pbmc9ITAscy5sZW5ndGgmJnRoaXMub3B0aW9ucy5oaWRlP3RoaXMuX2hpZGUocyx0aGlzLm9wdGlvbnMuaGlkZSxmdW5jdGlvbigpe24ub2xkVGFiLmNsb3Nlc3QoImxpIikucmVtb3ZlQ2xhc3MoInVpLXRhYnMtYWN0aXZlIHVpLXN0YXRlLWFjdGl2ZSIpLHUoKX0pOihuLm9sZFRhYi5jbG9zZXN0KCJsaSIpLnJlbW92ZUNsYXNzKCJ1aS10YWJzLWFjdGl2ZSB1aS1zdGF0ZS1hY3RpdmUiKSxzLmhpZGUoKSx1KCkpLHMuYXR0cih7ImFyaWEtZXhwYW5kZWQiOiJmYWxzZSIsImFyaWEtaGlkZGVuIjoidHJ1ZSJ9KSxuLm9sZFRhYi5hdHRyKCJhcmlhLXNlbGVjdGVkIiwiZmFsc2UiKSxpLmxlbmd0aCYmcy5sZW5ndGg/bi5vbGRUYWIuYXR0cigidGFiSW5kZXgiLC0xKTppLmxlbmd0aCYmdGhpcy50YWJzLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiBlKHRoaXMpLmF0dHIoInRhYkluZGV4Iik9PT0wfSkuYXR0cigidGFiSW5kZXgiLC0xKSxpLmF0dHIoeyJhcmlhLWV4cGFuZGVkIjoidHJ1ZSIsImFyaWEtaGlkZGVuIjoiZmFsc2UifSksbi5uZXdUYWIuYXR0cih7ImFyaWEtc2VsZWN0ZWQiOiJ0cnVlIix0YWJJbmRleDowfSl9LF9hY3RpdmF0ZTpmdW5jdGlvbih0KXt2YXIgbixyPXRoaXMuX2ZpbmRBY3RpdmUodCk7aWYoclswXT09PXRoaXMuYWN0aXZlWzBdKXJldHVybjtyLmxlbmd0aHx8KHI9dGhpcy5hY3RpdmUpLG49ci5maW5kKCIudWktdGFicy1hbmNob3IiKVswXSx0aGlzLl9ldmVudEhhbmRsZXIoe3RhcmdldDpuLGN1cnJlbnRUYXJnZXQ6bixwcmV2ZW50RGVmYXVsdDplLm5vb3B9KX0sX2ZpbmRBY3RpdmU6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT0hMT9lKCk6dGhpcy50YWJzLmVxKHQpfSxfZ2V0SW5kZXg6ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBlPT0ic3RyaW5nIiYmKGU9dGhpcy5hbmNob3JzLmluZGV4KHRoaXMuYW5jaG9ycy5maWx0ZXIoIltocmVmJD0nIitlKyInXSIpKSksZX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLnhociYmdGhpcy54aHIuYWJvcnQoKSx0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXRhYnMgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwgdWktdGFicy1jb2xsYXBzaWJsZSIpLHRoaXMudGFibGlzdC5yZW1vdmVDbGFzcygidWktdGFicy1uYXYgdWktaGVscGVyLXJlc2V0IHVpLWhlbHBlci1jbGVhcmZpeCB1aS13aWRnZXQtaGVhZGVyIHVpLWNvcm5lci1hbGwiKS5yZW1vdmVBdHRyKCJyb2xlIiksdGhpcy5hbmNob3JzLnJlbW92ZUNsYXNzKCJ1aS10YWJzLWFuY2hvciIpLnJlbW92ZUF0dHIoInJvbGUiKS5yZW1vdmVBdHRyKCJ0YWJJbmRleCIpLnJlbW92ZURhdGEoImhyZWYudGFicyIpLnJlbW92ZURhdGEoImxvYWQudGFicyIpLnJlbW92ZVVuaXF1ZUlkKCksdGhpcy50YWJzLmFkZCh0aGlzLnBhbmVscykuZWFjaChmdW5jdGlvbigpe2UuZGF0YSh0aGlzLCJ1aS10YWJzLWRlc3Ryb3kiKT9lKHRoaXMpLnJlbW92ZSgpOmUodGhpcykucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWRlZmF1bHQgdWktc3RhdGUtYWN0aXZlIHVpLXN0YXRlLWRpc2FibGVkIHVpLWNvcm5lci10b3AgdWktY29ybmVyLWJvdHRvbSB1aS13aWRnZXQtY29udGVudCB1aS10YWJzLWFjdGl2ZSB1aS10YWJzLXBhbmVsIikucmVtb3ZlQXR0cigidGFiSW5kZXgiKS5yZW1vdmVBdHRyKCJhcmlhLWxpdmUiKS5yZW1vdmVBdHRyKCJhcmlhLWJ1c3kiKS5yZW1vdmVBdHRyKCJhcmlhLXNlbGVjdGVkIikucmVtb3ZlQXR0cigiYXJpYS1sYWJlbGxlZGJ5IikucmVtb3ZlQXR0cigiYXJpYS1oaWRkZW4iKS5yZW1vdmVBdHRyKCJhcmlhLWV4cGFuZGVkIikucmVtb3ZlQXR0cigicm9sZSIpfSksdGhpcy50YWJzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLG49dC5kYXRhKCJ1aS10YWJzLWFyaWEtY29udHJvbHMiKTtuP3QuYXR0cigiYXJpYS1jb250cm9scyIsbik6dC5yZW1vdmVBdHRyKCJhcmlhLWNvbnRyb2xzIil9KSx0aGlzLnBhbmVscy5zaG93KCksdGhpcy5vcHRpb25zLmhlaWdodFN0eWxlIT09ImNvbnRlbnQiJiZ0aGlzLnBhbmVscy5jc3MoImhlaWdodCIsIiIpfSxlbmFibGU6ZnVuY3Rpb24obil7dmFyIHI9dGhpcy5vcHRpb25zLmRpc2FibGVkO2lmKHI9PT0hMSlyZXR1cm47bj09PXQ/cj0hMToobj10aGlzLl9nZXRJbmRleChuKSxlLmlzQXJyYXkocik/cj1lLm1hcChyLGZ1bmN0aW9uKGUpe3JldHVybiBlIT09bj9lOm51bGx9KTpyPWUubWFwKHRoaXMudGFicyxmdW5jdGlvbihlLHQpe3JldHVybiB0IT09bj90Om51bGx9KSksdGhpcy5fc2V0dXBEaXNhYmxlZChyKX0sZGlzYWJsZTpmdW5jdGlvbihuKXt2YXIgcj10aGlzLm9wdGlvbnMuZGlzYWJsZWQ7aWYocj09PSEwKXJldHVybjtpZihuPT09dClyPSEwO2Vsc2V7bj10aGlzLl9nZXRJbmRleChuKTtpZihlLmluQXJyYXkobixyKSE9PS0xKXJldHVybjtlLmlzQXJyYXkocik/cj1lLm1lcmdlKFtuXSxyKS5zb3J0KCk6cj1bbl19dGhpcy5fc2V0dXBEaXNhYmxlZChyKX0sbG9hZDpmdW5jdGlvbih0LG4pe3Q9dGhpcy5fZ2V0SW5kZXgodCk7dmFyIHI9dGhpcyxpPXRoaXMudGFicy5lcSh0KSxvPWkuZmluZCgiLnVpLXRhYnMtYW5jaG9yIiksdT10aGlzLl9nZXRQYW5lbEZvclRhYihpKSxhPXt0YWI6aSxwYW5lbDp1fTtpZihzKG9bMF0pKXJldHVybjt0aGlzLnhocj1lLmFqYXgodGhpcy5fYWpheFNldHRpbmdzKG8sbixhKSksdGhpcy54aHImJnRoaXMueGhyLnN0YXR1c1RleHQhPT0iY2FuY2VsZWQiJiYoaS5hZGRDbGFzcygidWktdGFicy1sb2FkaW5nIiksdS5hdHRyKCJhcmlhLWJ1c3kiLCJ0cnVlIiksdGhpcy54aHIuc3VjY2VzcyhmdW5jdGlvbihlKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dS5odG1sKGUpLHIuX3RyaWdnZXIoImxvYWQiLG4sYSl9LDEpfSkuY29tcGxldGUoZnVuY3Rpb24oZSx0KXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dD09PSJhYm9ydCImJnIucGFuZWxzLnN0b3AoITEsITApLGkucmVtb3ZlQ2xhc3MoInVpLXRhYnMtbG9hZGluZyIpLHUucmVtb3ZlQXR0cigiYXJpYS1idXN5IiksZT09PXIueGhyJiZkZWxldGUgci54aHJ9LDEpfSkpfSxfYWpheFNldHRpbmdzOmZ1bmN0aW9uKHQsbixyKXt2YXIgaT10aGlzO3JldHVybnt1cmw6dC5hdHRyKCJocmVmIiksYmVmb3JlU2VuZDpmdW5jdGlvbih0LHMpe3JldHVybiBpLl90cmlnZ2VyKCJiZWZvcmVMb2FkIixuLGUuZXh0ZW5kKHtqcVhIUjp0LGFqYXhTZXR0aW5nczpzfSxyKSl9fX0sX2dldFBhbmVsRm9yVGFiOmZ1bmN0aW9uKHQpe3ZhciBuPWUodCkuYXR0cigiYXJpYS1jb250cm9scyIpO3JldHVybiB0aGlzLmVsZW1lbnQuZmluZCh0aGlzLl9zYW5pdGl6ZVNlbGVjdG9yKCIjIituKSl9fSksZS51aUJhY2tDb21wYXQhPT0hMSYmKGUudWkudGFicy5wcm90b3R5cGUuX3VpPWZ1bmN0aW9uKGUsdCl7cmV0dXJue3RhYjplLHBhbmVsOnQsaW5kZXg6dGhpcy5hbmNob3JzLmluZGV4KGUpfX0sZS53aWRnZXQoInVpLnRhYnMiLGUudWkudGFicyx7dXJsOmZ1bmN0aW9uKGUsdCl7dGhpcy5hbmNob3JzLmVxKGUpLmF0dHIoImhyZWYiLHQpfX0pLGUud2lkZ2V0KCJ1aS50YWJzIixlLnVpLnRhYnMse29wdGlvbnM6e2FqYXhPcHRpb25zOm51bGwsY2FjaGU6ITF9LF9jcmVhdGU6ZnVuY3Rpb24oKXt0aGlzLl9zdXBlcigpO3ZhciB0PXRoaXM7dGhpcy5fb24oe3RhYnNiZWZvcmVsb2FkOmZ1bmN0aW9uKG4scil7aWYoZS5kYXRhKHIudGFiWzBdLCJjYWNoZS50YWJzIikpe24ucHJldmVudERlZmF1bHQoKTtyZXR1cm59ci5qcVhIUi5zdWNjZXNzKGZ1bmN0aW9uKCl7dC5vcHRpb25zLmNhY2hlJiZlLmRhdGEoci50YWJbMF0sImNhY2hlLnRhYnMiLCEwKX0pfX0pfSxfYWpheFNldHRpbmdzOmZ1bmN0aW9uKHQsbixyKXt2YXIgaT10aGlzLm9wdGlvbnMuYWpheE9wdGlvbnM7cmV0dXJuIGUuZXh0ZW5kKHt9LGkse2Vycm9yOmZ1bmN0aW9uKGUsdCl7dHJ5e2kuZXJyb3IoZSx0LHIudGFiLmNsb3Nlc3QoImxpIikuaW5kZXgoKSxyLnRhYlswXSl9Y2F0Y2gobil7fX19LHRoaXMuX3N1cGVyQXBwbHkoYXJndW1lbnRzKSl9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXtlPT09ImNhY2hlIiYmdD09PSExJiZ0aGlzLmFuY2hvcnMucmVtb3ZlRGF0YSgiY2FjaGUudGFicyIpLHRoaXMuX3N1cGVyKGUsdCl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5hbmNob3JzLnJlbW92ZURhdGEoImNhY2hlLnRhYnMiKSx0aGlzLl9zdXBlcigpfSx1cmw6ZnVuY3Rpb24oZSl7dGhpcy5hbmNob3JzLmVxKGUpLnJlbW92ZURhdGEoImNhY2hlLnRhYnMiKSx0aGlzLl9zdXBlckFwcGx5KGFyZ3VtZW50cyl9fSksZS53aWRnZXQoInVpLnRhYnMiLGUudWkudGFicyx7YWJvcnQ6ZnVuY3Rpb24oKXt0aGlzLnhociYmdGhpcy54aHIuYWJvcnQoKX19KSxlLndpZGdldCgidWkudGFicyIsZS51aS50YWJzLHtvcHRpb25zOntzcGlubmVyOiI8ZW0+TG9hZGluZyYjODIzMDs8L2VtPiJ9LF9jcmVhdGU6ZnVuY3Rpb24oKXt0aGlzLl9zdXBlcigpLHRoaXMuX29uKHt0YWJzYmVmb3JlbG9hZDpmdW5jdGlvbihlLHQpe2lmKGUudGFyZ2V0IT09dGhpcy5lbGVtZW50WzBdfHwhdGhpcy5vcHRpb25zLnNwaW5uZXIpcmV0dXJuO3ZhciBuPXQudGFiLmZpbmQoInNwYW4iKSxyPW4uaHRtbCgpO24uaHRtbCh0aGlzLm9wdGlvbnMuc3Bpbm5lciksdC5qcVhIUi5jb21wbGV0ZShmdW5jdGlvbigpe24uaHRtbChyKX0pfX0pfX0pLGUud2lkZ2V0KCJ1aS50YWJzIixlLnVpLnRhYnMse29wdGlvbnM6e2VuYWJsZTpudWxsLGRpc2FibGU6bnVsbH0sZW5hYmxlOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMub3B0aW9ucyxyO2lmKHQmJm4uZGlzYWJsZWQ9PT0hMHx8ZS5pc0FycmF5KG4uZGlzYWJsZWQpJiZlLmluQXJyYXkodCxuLmRpc2FibGVkKSE9PS0xKXI9ITA7dGhpcy5fc3VwZXJBcHBseShhcmd1bWVudHMpLHImJnRoaXMuX3RyaWdnZXIoImVuYWJsZSIsbnVsbCx0aGlzLl91aSh0aGlzLmFuY2hvcnNbdF0sdGhpcy5wYW5lbHNbdF0pKX0sZGlzYWJsZTpmdW5jdGlvbih0KXt2YXIgbj10aGlzLm9wdGlvbnMscjtpZih0JiZuLmRpc2FibGVkPT09ITF8fGUuaXNBcnJheShuLmRpc2FibGVkKSYmZS5pbkFycmF5KHQsbi5kaXNhYmxlZCk9PT0tMSlyPSEwO3RoaXMuX3N1cGVyQXBwbHkoYXJndW1lbnRzKSxyJiZ0aGlzLl90cmlnZ2VyKCJkaXNhYmxlIixudWxsLHRoaXMuX3VpKHRoaXMuYW5jaG9yc1t0XSx0aGlzLnBhbmVsc1t0XSkpfX0pLGUud2lkZ2V0KCJ1aS50YWJzIixlLnVpLnRhYnMse29wdGlvbnM6e2FkZDpudWxsLHJlbW92ZTpudWxsLHRhYlRlbXBsYXRlOiI8bGk+PGEgaHJlZj0nI3tocmVmfSc+PHNwYW4+I3tsYWJlbH08L3NwYW4+PC9hPjwvbGk+In0sYWRkOmZ1bmN0aW9uKG4scixpKXtpPT09dCYmKGk9dGhpcy5hbmNob3JzLmxlbmd0aCk7dmFyIHMsbyx1PXRoaXMub3B0aW9ucyxhPWUodS50YWJUZW1wbGF0ZS5yZXBsYWNlKC8jXHtocmVmXH0vZyxuKS5yZXBsYWNlKC8jXHtsYWJlbFx9L2cscikpLGY9bi5pbmRleE9mKCIjIik/dGhpcy5fdGFiSWQoYSk6bi5yZXBsYWNlKCIjIiwiIik7cmV0dXJuIGEuYWRkQ2xhc3MoInVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLXRvcCIpLmRhdGEoInVpLXRhYnMtZGVzdHJveSIsITApLGEuYXR0cigiYXJpYS1jb250cm9scyIsZikscz1pPj10aGlzLnRhYnMubGVuZ3RoLG89dGhpcy5lbGVtZW50LmZpbmQoIiMiK2YpLG8ubGVuZ3RofHwobz10aGlzLl9jcmVhdGVQYW5lbChmKSxzP2k+MD9vLmluc2VydEFmdGVyKHRoaXMucGFuZWxzLmVxKC0xKSk6by5hcHBlbmRUbyh0aGlzLmVsZW1lbnQpOm8uaW5zZXJ0QmVmb3JlKHRoaXMucGFuZWxzW2ldKSksby5hZGRDbGFzcygidWktdGFicy1wYW5lbCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYm90dG9tIikuaGlkZSgpLHM/YS5hcHBlbmRUbyh0aGlzLnRhYmxpc3QpOmEuaW5zZXJ0QmVmb3JlKHRoaXMudGFic1tpXSksdS5kaXNhYmxlZD1lLm1hcCh1LmRpc2FibGVkLGZ1bmN0aW9uKGUpe3JldHVybiBlPj1pPysrZTplfSksdGhpcy5yZWZyZXNoKCksdGhpcy50YWJzLmxlbmd0aD09PTEmJnUuYWN0aXZlPT09ITEmJnRoaXMub3B0aW9uKCJhY3RpdmUiLDApLHRoaXMuX3RyaWdnZXIoImFkZCIsbnVsbCx0aGlzLl91aSh0aGlzLmFuY2hvcnNbaV0sdGhpcy5wYW5lbHNbaV0pKSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24odCl7dD10aGlzLl9nZXRJbmRleCh0KTt2YXIgbj10aGlzLm9wdGlvbnMscj10aGlzLnRhYnMuZXEodCkucmVtb3ZlKCksaT10aGlzLl9nZXRQYW5lbEZvclRhYihyKS5yZW1vdmUoKTtyZXR1cm4gci5oYXNDbGFzcygidWktdGFicy1hY3RpdmUiKSYmdGhpcy5hbmNob3JzLmxlbmd0aD4yJiZ0aGlzLl9hY3RpdmF0ZSh0Kyh0KzE8dGhpcy5hbmNob3JzLmxlbmd0aD8xOi0xKSksbi5kaXNhYmxlZD1lLm1hcChlLmdyZXAobi5kaXNhYmxlZCxmdW5jdGlvbihlKXtyZXR1cm4gZSE9PXR9KSxmdW5jdGlvbihlKXtyZXR1cm4gZT49dD8tLWU6ZX0pLHRoaXMucmVmcmVzaCgpLHRoaXMuX3RyaWdnZXIoInJlbW92ZSIsbnVsbCx0aGlzLl91aShyLmZpbmQoImEiKVswXSxpWzBdKSksdGhpc319KSxlLndpZGdldCgidWkudGFicyIsZS51aS50YWJzLHtsZW5ndGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hbmNob3JzLmxlbmd0aH19KSxlLndpZGdldCgidWkudGFicyIsZS51aS50YWJzLHtvcHRpb25zOntpZFByZWZpeDoidWktdGFicy0ifSxfdGFiSWQ6ZnVuY3Rpb24odCl7dmFyIG49dC5pcygibGkiKT90LmZpbmQoImFbaHJlZl0iKTp0O3JldHVybiBuPW5bMF0sZShuKS5jbG9zZXN0KCJsaSIpLmF0dHIoImFyaWEtY29udHJvbHMiKXx8bi50aXRsZSYmbi50aXRsZS5yZXBsYWNlKC9ccy9nLCJfIikucmVwbGFjZSgvW15cd1x1MDBjMC1cdUZGRkZcLV0vZywiIil8fHRoaXMub3B0aW9ucy5pZFByZWZpeCtpKCl9fSksZS53aWRnZXQoInVpLnRhYnMiLGUudWkudGFicyx7b3B0aW9uczp7cGFuZWxUZW1wbGF0ZToiPGRpdj48L2Rpdj4ifSxfY3JlYXRlUGFuZWw6ZnVuY3Rpb24odCl7cmV0dXJuIGUodGhpcy5vcHRpb25zLnBhbmVsVGVtcGxhdGUpLmF0dHIoImlkIix0KS5hZGRDbGFzcygidWktdGFicy1wYW5lbCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYm90dG9tIikuZGF0YSgidWktdGFicy1kZXN0cm95IiwhMCl9fSksZS53aWRnZXQoInVpLnRhYnMiLGUudWkudGFicyx7X2NyZWF0ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3B0aW9ucztlLmFjdGl2ZT09PW51bGwmJmUuc2VsZWN0ZWQhPT10JiYoZS5hY3RpdmU9ZS5zZWxlY3RlZD09PS0xPyExOmUuc2VsZWN0ZWQpLHRoaXMuX3N1cGVyKCksZS5zZWxlY3RlZD1lLmFjdGl2ZSxlLnNlbGVjdGVkPT09ITEmJihlLnNlbGVjdGVkPS0xKX0sX3NldE9wdGlvbjpmdW5jdGlvbihlLHQpe2lmKGUhPT0ic2VsZWN0ZWQiKXJldHVybiB0aGlzLl9zdXBlcihlLHQpO3ZhciBuPXRoaXMub3B0aW9uczt0aGlzLl9zdXBlcigiYWN0aXZlIix0PT09LTE/ITE6dCksbi5zZWxlY3RlZD1uLmFjdGl2ZSxuLnNlbGVjdGVkPT09ITEmJihuLnNlbGVjdGVkPS0xKX0sX2V2ZW50SGFuZGxlcjpmdW5jdGlvbigpe3RoaXMuX3N1cGVyQXBwbHkoYXJndW1lbnRzKSx0aGlzLm9wdGlvbnMuc2VsZWN0ZWQ9dGhpcy5vcHRpb25zLmFjdGl2ZSx0aGlzLm9wdGlvbnMuc2VsZWN0ZWQ9PT0hMSYmKHRoaXMub3B0aW9ucy5zZWxlY3RlZD0tMSl9fSksZS53aWRnZXQoInVpLnRhYnMiLGUudWkudGFicyx7b3B0aW9uczp7c2hvdzpudWxsLHNlbGVjdDpudWxsfSxfY3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5fc3VwZXIoKSx0aGlzLm9wdGlvbnMuYWN0aXZlIT09ITEmJnRoaXMuX3RyaWdnZXIoInNob3ciLG51bGwsdGhpcy5fdWkodGhpcy5hY3RpdmUuZmluZCgiLnVpLXRhYnMtYW5jaG9yIilbMF0sdGhpcy5fZ2V0UGFuZWxGb3JUYWIodGhpcy5hY3RpdmUpWzBdKSl9LF90cmlnZ2VyOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLHM9dGhpcy5fc3VwZXJBcHBseShhcmd1bWVudHMpO3JldHVybiBzPyhlPT09ImJlZm9yZUFjdGl2YXRlIj8ocj1uLm5ld1RhYi5sZW5ndGg/bi5uZXdUYWI6bi5vbGRUYWIsaT1uLm5ld1BhbmVsLmxlbmd0aD9uLm5ld1BhbmVsOm4ub2xkUGFuZWwscz10aGlzLl9zdXBlcigic2VsZWN0Iix0LHt0YWI6ci5maW5kKCIudWktdGFicy1hbmNob3IiKVswXSxwYW5lbDppWzBdLGluZGV4OnIuY2xvc2VzdCgibGkiKS5pbmRleCgpfSkpOmU9PT0iYWN0aXZhdGUiJiZuLm5ld1RhYi5sZW5ndGgmJihzPXRoaXMuX3N1cGVyKCJzaG93Iix0LHt0YWI6bi5uZXdUYWIuZmluZCgiLnVpLXRhYnMtYW5jaG9yIilbMF0scGFuZWw6bi5uZXdQYW5lbFswXSxpbmRleDpuLm5ld1RhYi5jbG9zZXN0KCJsaSIpLmluZGV4KCl9KSkscyk6ITF9fSksZS53aWRnZXQoInVpLnRhYnMiLGUudWkudGFicyx7c2VsZWN0OmZ1bmN0aW9uKGUpe2U9dGhpcy5fZ2V0SW5kZXgoZSk7aWYoZT09PS0xKXtpZighdGhpcy5vcHRpb25zLmNvbGxhcHNpYmxlfHx0aGlzLm9wdGlvbnMuc2VsZWN0ZWQ9PT0tMSlyZXR1cm47ZT10aGlzLm9wdGlvbnMuc2VsZWN0ZWR9dGhpcy5hbmNob3JzLmVxKGUpLnRyaWdnZXIodGhpcy5vcHRpb25zLmV2ZW50K3RoaXMuZXZlbnROYW1lc3BhY2UpfX0pLGZ1bmN0aW9uKCl7dmFyIHQ9MDtlLndpZGdldCgidWkudGFicyIsZS51aS50YWJzLHtvcHRpb25zOntjb29raWU6bnVsbH0sX2NyZWF0ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3B0aW9ucyx0O2UuYWN0aXZlPT1udWxsJiZlLmNvb2tpZSYmKHQ9cGFyc2VJbnQodGhpcy5fY29va2llKCksMTApLHQ9PT0tMSYmKHQ9ITEpLGUuYWN0aXZlPXQpLHRoaXMuX3N1cGVyKCl9LF9jb29raWU6ZnVuY3Rpb24obil7dmFyIHI9W3RoaXMuY29va2llfHwodGhpcy5jb29raWU9dGhpcy5vcHRpb25zLmNvb2tpZS5uYW1lfHwidWktdGFicy0iKyArK3QpXTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCYmKHIucHVzaChuPT09ITE/LTE6biksci5wdXNoKHRoaXMub3B0aW9ucy5jb29raWUpKSxlLmNvb2tpZS5hcHBseShudWxsLHIpfSxfcmVmcmVzaDpmdW5jdGlvbigpe3RoaXMuX3N1cGVyKCksdGhpcy5vcHRpb25zLmNvb2tpZSYmdGhpcy5fY29va2llKHRoaXMub3B0aW9ucy5hY3RpdmUsdGhpcy5vcHRpb25zLmNvb2tpZSl9LF9ldmVudEhhbmRsZXI6ZnVuY3Rpb24oKXt0aGlzLl9zdXBlckFwcGx5KGFyZ3VtZW50cyksdGhpcy5vcHRpb25zLmNvb2tpZSYmdGhpcy5fY29va2llKHRoaXMub3B0aW9ucy5hY3RpdmUsdGhpcy5vcHRpb25zLmNvb2tpZSl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5fc3VwZXIoKSx0aGlzLm9wdGlvbnMuY29va2llJiZ0aGlzLl9jb29raWUobnVsbCx0aGlzLm9wdGlvbnMuY29va2llKX19KX0oKSxlLndpZGdldCgidWkudGFicyIsZS51aS50YWJzLHtfdHJpZ2dlcjpmdW5jdGlvbih0LG4scil7dmFyIGk9ZS5leHRlbmQoe30scik7cmV0dXJuIHQ9PT0ibG9hZCImJihpLnBhbmVsPWkucGFuZWxbMF0saS50YWI9aS50YWIuZmluZCgiLnVpLXRhYnMtYW5jaG9yIilbMF0pLHRoaXMuX3N1cGVyKHQsbixpKX19KSxlLndpZGdldCgidWkudGFicyIsZS51aS50YWJzLHtvcHRpb25zOntmeDpudWxsfSxfZ2V0Rng6ZnVuY3Rpb24oKXt2YXIgdCxuLHI9dGhpcy5vcHRpb25zLmZ4O3JldHVybiByJiYoZS5pc0FycmF5KHIpPyh0PXJbMF0sbj1yWzFdKTp0PW49cikscj97c2hvdzpuLGhpZGU6dH06bnVsbH0sX3RvZ2dsZTpmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG8oKXtuLnJ1bm5pbmc9ITEsbi5fdHJpZ2dlcigiYWN0aXZhdGUiLGUsdCl9ZnVuY3Rpb24gdSgpe3QubmV3VGFiLmNsb3Nlc3QoImxpIikuYWRkQ2xhc3MoInVpLXRhYnMtYWN0aXZlIHVpLXN0YXRlLWFjdGl2ZSIpLHIubGVuZ3RoJiZzLnNob3c/ci5hbmltYXRlKHMuc2hvdyxzLnNob3cuZHVyYXRpb24sZnVuY3Rpb24oKXtvKCl9KTooci5zaG93KCksbygpKX12YXIgbj10aGlzLHI9dC5uZXdQYW5lbCxpPXQub2xkUGFuZWwscz10aGlzLl9nZXRGeCgpO2lmKCFzKXJldHVybiB0aGlzLl9zdXBlcihlLHQpO24ucnVubmluZz0hMCxpLmxlbmd0aCYmcy5oaWRlP2kuYW5pbWF0ZShzLmhpZGUscy5oaWRlLmR1cmF0aW9uLGZ1bmN0aW9uKCl7dC5vbGRUYWIuY2xvc2VzdCgibGkiKS5yZW1vdmVDbGFzcygidWktdGFicy1hY3RpdmUgdWktc3RhdGUtYWN0aXZlIiksdSgpfSk6KHQub2xkVGFiLmNsb3Nlc3QoImxpIikucmVtb3ZlQ2xhc3MoInVpLXRhYnMtYWN0aXZlIHVpLXN0YXRlLWFjdGl2ZSIpLGkuaGlkZSgpLHUoKSl9fSkpfSkoalF1ZXJ5KTsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbih0LG4pe3ZhciByPSh0LmF0dHIoImFyaWEtZGVzY3JpYmVkYnkiKXx8IiIpLnNwbGl0KC9ccysvKTtyLnB1c2gobiksdC5kYXRhKCJ1aS10b29sdGlwLWlkIixuKS5hdHRyKCJhcmlhLWRlc2NyaWJlZGJ5IixlLnRyaW0oci5qb2luKCIgIikpKX1mdW5jdGlvbiByKHQpe3ZhciBuPXQuZGF0YSgidWktdG9vbHRpcC1pZCIpLHI9KHQuYXR0cigiYXJpYS1kZXNjcmliZWRieSIpfHwiIikuc3BsaXQoL1xzKy8pLGk9ZS5pbkFycmF5KG4scik7aSE9PS0xJiZyLnNwbGljZShpLDEpLHQucmVtb3ZlRGF0YSgidWktdG9vbHRpcC1pZCIpLHI9ZS50cmltKHIuam9pbigiICIpKSxyP3QuYXR0cigiYXJpYS1kZXNjcmliZWRieSIscik6dC5yZW1vdmVBdHRyKCJhcmlhLWRlc2NyaWJlZGJ5Iil9dmFyIHQ9MDtlLndpZGdldCgidWkudG9vbHRpcCIse3ZlcnNpb246IjEuOS4yIixvcHRpb25zOntjb250ZW50OmZ1bmN0aW9uKCl7cmV0dXJuIGUodGhpcykuYXR0cigidGl0bGUiKX0saGlkZTohMCxpdGVtczoiW3RpdGxlXTpub3QoW2Rpc2FibGVkXSkiLHBvc2l0aW9uOntteToibGVmdCB0b3ArMTUiLGF0OiJsZWZ0IGJvdHRvbSIsY29sbGlzaW9uOiJmbGlwZml0IGZsaXAifSxzaG93OiEwLHRvb2x0aXBDbGFzczpudWxsLHRyYWNrOiExLGNsb3NlOm51bGwsb3BlbjpudWxsfSxfY3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5fb24oe21vdXNlb3Zlcjoib3BlbiIsZm9jdXNpbjoib3BlbiJ9KSx0aGlzLnRvb2x0aXBzPXt9LHRoaXMucGFyZW50cz17fSx0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJnRoaXMuX2Rpc2FibGUoKX0sX3NldE9wdGlvbjpmdW5jdGlvbih0LG4pe3ZhciByPXRoaXM7aWYodD09PSJkaXNhYmxlZCIpe3RoaXNbbj8iX2Rpc2FibGUiOiJfZW5hYmxlIl0oKSx0aGlzLm9wdGlvbnNbdF09bjtyZXR1cm59dGhpcy5fc3VwZXIodCxuKSx0PT09ImNvbnRlbnQiJiZlLmVhY2godGhpcy50b29sdGlwcyxmdW5jdGlvbihlLHQpe3IuX3VwZGF0ZUNvbnRlbnQodCl9KX0sX2Rpc2FibGU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2UuZWFjaCh0aGlzLnRvb2x0aXBzLGZ1bmN0aW9uKG4scil7dmFyIGk9ZS5FdmVudCgiYmx1ciIpO2kudGFyZ2V0PWkuY3VycmVudFRhcmdldD1yWzBdLHQuY2xvc2UoaSwhMCl9KSx0aGlzLmVsZW1lbnQuZmluZCh0aGlzLm9wdGlvbnMuaXRlbXMpLmFuZFNlbGYoKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKTt0LmlzKCJbdGl0bGVdIikmJnQuZGF0YSgidWktdG9vbHRpcC10aXRsZSIsdC5hdHRyKCJ0aXRsZSIpKS5hdHRyKCJ0aXRsZSIsIiIpfSl9LF9lbmFibGU6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQuZmluZCh0aGlzLm9wdGlvbnMuaXRlbXMpLmFuZFNlbGYoKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKTt0LmRhdGEoInVpLXRvb2x0aXAtdGl0bGUiKSYmdC5hdHRyKCJ0aXRsZSIsdC5kYXRhKCJ1aS10b29sdGlwLXRpdGxlIikpfSl9LG9wZW46ZnVuY3Rpb24odCl7dmFyIG49dGhpcyxyPWUodD90LnRhcmdldDp0aGlzLmVsZW1lbnQpLmNsb3Nlc3QodGhpcy5vcHRpb25zLml0ZW1zKTtpZighci5sZW5ndGh8fHIuZGF0YSgidWktdG9vbHRpcC1pZCIpKXJldHVybjtyLmF0dHIoInRpdGxlIikmJnIuZGF0YSgidWktdG9vbHRpcC10aXRsZSIsci5hdHRyKCJ0aXRsZSIpKSxyLmRhdGEoInVpLXRvb2x0aXAtb3BlbiIsITApLHQmJnQudHlwZT09PSJtb3VzZW92ZXIiJiZyLnBhcmVudHMoKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKSxyO3QuZGF0YSgidWktdG9vbHRpcC1vcGVuIikmJihyPWUuRXZlbnQoImJsdXIiKSxyLnRhcmdldD1yLmN1cnJlbnRUYXJnZXQ9dGhpcyxuLmNsb3NlKHIsITApKSx0LmF0dHIoInRpdGxlIikmJih0LnVuaXF1ZUlkKCksbi5wYXJlbnRzW3RoaXMuaWRdPXtlbGVtZW50OnRoaXMsdGl0bGU6dC5hdHRyKCJ0aXRsZSIpfSx0LmF0dHIoInRpdGxlIiwiIikpfSksdGhpcy5fdXBkYXRlQ29udGVudChyLHQpfSxfdXBkYXRlQ29udGVudDpmdW5jdGlvbihlLHQpe3ZhciBuLHI9dGhpcy5vcHRpb25zLmNvbnRlbnQsaT10aGlzLHM9dD90LnR5cGU6bnVsbDtpZih0eXBlb2Ygcj09InN0cmluZyIpcmV0dXJuIHRoaXMuX29wZW4odCxlLHIpO249ci5jYWxsKGVbMF0sZnVuY3Rpb24obil7aWYoIWUuZGF0YSgidWktdG9vbHRpcC1vcGVuIikpcmV0dXJuO2kuX2RlbGF5KGZ1bmN0aW9uKCl7dCYmKHQudHlwZT1zKSx0aGlzLl9vcGVuKHQsZSxuKX0pfSksbiYmdGhpcy5fb3Blbih0LGUsbil9LF9vcGVuOmZ1bmN0aW9uKHQscixpKXtmdW5jdGlvbiBmKGUpe2Eub2Y9ZTtpZihzLmlzKCI6aGlkZGVuIikpcmV0dXJuO3MucG9zaXRpb24oYSl9dmFyIHMsbyx1LGE9ZS5leHRlbmQoe30sdGhpcy5vcHRpb25zLnBvc2l0aW9uKTtpZighaSlyZXR1cm47cz10aGlzLl9maW5kKHIpO2lmKHMubGVuZ3RoKXtzLmZpbmQoIi51aS10b29sdGlwLWNvbnRlbnQiKS5odG1sKGkpO3JldHVybn1yLmlzKCJbdGl0bGVdIikmJih0JiZ0LnR5cGU9PT0ibW91c2VvdmVyIj9yLmF0dHIoInRpdGxlIiwiIik6ci5yZW1vdmVBdHRyKCJ0aXRsZSIpKSxzPXRoaXMuX3Rvb2x0aXAociksbihyLHMuYXR0cigiaWQiKSkscy5maW5kKCIudWktdG9vbHRpcC1jb250ZW50IikuaHRtbChpKSx0aGlzLm9wdGlvbnMudHJhY2smJnQmJi9ebW91c2UvLnRlc3QodC50eXBlKT8odGhpcy5fb24odGhpcy5kb2N1bWVudCx7bW91c2Vtb3ZlOmZ9KSxmKHQpKTpzLnBvc2l0aW9uKGUuZXh0ZW5kKHtvZjpyfSx0aGlzLm9wdGlvbnMucG9zaXRpb24pKSxzLmhpZGUoKSx0aGlzLl9zaG93KHMsdGhpcy5vcHRpb25zLnNob3cpLHRoaXMub3B0aW9ucy5zaG93JiZ0aGlzLm9wdGlvbnMuc2hvdy5kZWxheSYmKHU9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXtzLmlzKCI6dmlzaWJsZSIpJiYoZihhLm9mKSxjbGVhckludGVydmFsKHUpKX0sZS5meC5pbnRlcnZhbCkpLHRoaXMuX3RyaWdnZXIoIm9wZW4iLHQse3Rvb2x0aXA6c30pLG89e2tleXVwOmZ1bmN0aW9uKHQpe2lmKHQua2V5Q29kZT09PWUudWkua2V5Q29kZS5FU0NBUEUpe3ZhciBuPWUuRXZlbnQodCk7bi5jdXJyZW50VGFyZ2V0PXJbMF0sdGhpcy5jbG9zZShuLCEwKX19LHJlbW92ZTpmdW5jdGlvbigpe3RoaXMuX3JlbW92ZVRvb2x0aXAocyl9fTtpZighdHx8dC50eXBlPT09Im1vdXNlb3ZlciIpby5tb3VzZWxlYXZlPSJjbG9zZSI7aWYoIXR8fHQudHlwZT09PSJmb2N1c2luIilvLmZvY3Vzb3V0PSJjbG9zZSI7dGhpcy5fb24oITAscixvKX0sY2xvc2U6ZnVuY3Rpb24odCl7dmFyIG49dGhpcyxpPWUodD90LmN1cnJlbnRUYXJnZXQ6dGhpcy5lbGVtZW50KSxzPXRoaXMuX2ZpbmQoaSk7aWYodGhpcy5jbG9zaW5nKXJldHVybjtpLmRhdGEoInVpLXRvb2x0aXAtdGl0bGUiKSYmaS5hdHRyKCJ0aXRsZSIsaS5kYXRhKCJ1aS10b29sdGlwLXRpdGxlIikpLHIoaSkscy5zdG9wKCEwKSx0aGlzLl9oaWRlKHMsdGhpcy5vcHRpb25zLmhpZGUsZnVuY3Rpb24oKXtuLl9yZW1vdmVUb29sdGlwKGUodGhpcykpfSksaS5yZW1vdmVEYXRhKCJ1aS10b29sdGlwLW9wZW4iKSx0aGlzLl9vZmYoaSwibW91c2VsZWF2ZSBmb2N1c291dCBrZXl1cCIpLGlbMF0hPT10aGlzLmVsZW1lbnRbMF0mJnRoaXMuX29mZihpLCJyZW1vdmUiKSx0aGlzLl9vZmYodGhpcy5kb2N1bWVudCwibW91c2Vtb3ZlIiksdCYmdC50eXBlPT09Im1vdXNlbGVhdmUiJiZlLmVhY2godGhpcy5wYXJlbnRzLGZ1bmN0aW9uKHQscil7ZShyLmVsZW1lbnQpLmF0dHIoInRpdGxlIixyLnRpdGxlKSxkZWxldGUgbi5wYXJlbnRzW3RdfSksdGhpcy5jbG9zaW5nPSEwLHRoaXMuX3RyaWdnZXIoImNsb3NlIix0LHt0b29sdGlwOnN9KSx0aGlzLmNsb3Npbmc9ITF9LF90b29sdGlwOmZ1bmN0aW9uKG4pe3ZhciByPSJ1aS10b29sdGlwLSIrdCsrLGk9ZSgiPGRpdj4iKS5hdHRyKHtpZDpyLHJvbGU6InRvb2x0aXAifSkuYWRkQ2xhc3MoInVpLXRvb2x0aXAgdWktd2lkZ2V0IHVpLWNvcm5lci1hbGwgdWktd2lkZ2V0LWNvbnRlbnQgIisodGhpcy5vcHRpb25zLnRvb2x0aXBDbGFzc3x8IiIpKTtyZXR1cm4gZSgiPGRpdj4iKS5hZGRDbGFzcygidWktdG9vbHRpcC1jb250ZW50IikuYXBwZW5kVG8oaSksaS5hcHBlbmRUbyh0aGlzLmRvY3VtZW50WzBdLmJvZHkpLGUuZm4uYmdpZnJhbWUmJmkuYmdpZnJhbWUoKSx0aGlzLnRvb2x0aXBzW3JdPW4saX0sX2ZpbmQ6ZnVuY3Rpb24odCl7dmFyIG49dC5kYXRhKCJ1aS10b29sdGlwLWlkIik7cmV0dXJuIG4/ZSgiIyIrbik6ZSgpfSxfcmVtb3ZlVG9vbHRpcDpmdW5jdGlvbihlKXtlLnJlbW92ZSgpLGRlbGV0ZSB0aGlzLnRvb2x0aXBzW2UuYXR0cigiaWQiKV19LF9kZXN0cm95OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztlLmVhY2godGhpcy50b29sdGlwcyxmdW5jdGlvbihuLHIpe3ZhciBpPWUuRXZlbnQoImJsdXIiKTtpLnRhcmdldD1pLmN1cnJlbnRUYXJnZXQ9clswXSx0LmNsb3NlKGksITApLGUoIiMiK24pLnJlbW92ZSgpLHIuZGF0YSgidWktdG9vbHRpcC10aXRsZSIpJiYoci5hdHRyKCJ0aXRsZSIsci5kYXRhKCJ1aS10b29sdGlwLXRpdGxlIikpLHIucmVtb3ZlRGF0YSgidWktdG9vbHRpcC10aXRsZSIpKX0pfX0pfSkoalF1ZXJ5KTtqUXVlcnkuZWZmZWN0c3x8ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnVpQmFja0NvbXBhdCE9PSExLHI9InVpLWVmZmVjdHMtIjtlLmVmZmVjdHM9e2VmZmVjdDp7fX0sZnVuY3Rpb24odCxuKXtmdW5jdGlvbiBwKGUsdCxuKXt2YXIgcj1hW3QudHlwZV18fHt9O3JldHVybiBlPT1udWxsP258fCF0LmRlZj9udWxsOnQuZGVmOihlPXIuZmxvb3I/fn5lOnBhcnNlRmxvYXQoZSksaXNOYU4oZSk/dC5kZWY6ci5tb2Q/KGUrci5tb2QpJXIubW9kOjA+ZT8wOnIubWF4PGU/ci5tYXg6ZSl9ZnVuY3Rpb24gZChlKXt2YXIgbj1vKCkscj1uLl9yZ2JhPVtdO3JldHVybiBlPWUudG9Mb3dlckNhc2UoKSxoKHMsZnVuY3Rpb24odCxpKXt2YXIgcyxvPWkucmUuZXhlYyhlKSxhPW8mJmkucGFyc2UobyksZj1pLnNwYWNlfHwicmdiYSI7aWYoYSlyZXR1cm4gcz1uW2ZdKGEpLG5bdVtmXS5jYWNoZV09c1t1W2ZdLmNhY2hlXSxyPW4uX3JnYmE9cy5fcmdiYSwhMX0pLHIubGVuZ3RoPyhyLmpvaW4oKT09PSIwLDAsMCwwIiYmdC5leHRlbmQocixjLnRyYW5zcGFyZW50KSxuKTpjW2VdfWZ1bmN0aW9uIHYoZSx0LG4pe3JldHVybiBuPShuKzEpJTEsbio2PDE/ZSsodC1lKSpuKjY6bioyPDE/dDpuKjM8Mj9lKyh0LWUpKigyLzMtbikqNjplfXZhciByPSJiYWNrZ3JvdW5kQ29sb3IgYm9yZGVyQm90dG9tQ29sb3IgYm9yZGVyTGVmdENvbG9yIGJvcmRlclJpZ2h0Q29sb3IgYm9yZGVyVG9wQ29sb3IgY29sb3IgY29sdW1uUnVsZUNvbG9yIG91dGxpbmVDb2xvciB0ZXh0RGVjb3JhdGlvbkNvbG9yIHRleHRFbXBoYXNpc0NvbG9yIi5zcGxpdCgiICIpLGk9L14oW1wtK10pPVxzKihcZCtcLj9cZCopLyxzPVt7cmU6L3JnYmE/XChccyooXGR7MSwzfSlccyosXHMqKFxkezEsM30pXHMqLFxzKihcZHsxLDN9KVxzKig/OixccyooXGQrKD86XC5cZCspPylccyopP1wpLyxwYXJzZTpmdW5jdGlvbihlKXtyZXR1cm5bZVsxXSxlWzJdLGVbM10sZVs0XV19fSx7cmU6L3JnYmE/XChccyooXGQrKD86XC5cZCspPylcJVxzKixccyooXGQrKD86XC5cZCspPylcJVxzKixccyooXGQrKD86XC5cZCspPylcJVxzKig/OixccyooXGQrKD86XC5cZCspPylccyopP1wpLyxwYXJzZTpmdW5jdGlvbihlKXtyZXR1cm5bZVsxXSoyLjU1LGVbMl0qMi41NSxlWzNdKjIuNTUsZVs0XV19fSx7cmU6LyMoW2EtZjAtOV17Mn0pKFthLWYwLTldezJ9KShbYS1mMC05XXsyfSkvLHBhcnNlOmZ1bmN0aW9uKGUpe3JldHVybltwYXJzZUludChlWzFdLDE2KSxwYXJzZUludChlWzJdLDE2KSxwYXJzZUludChlWzNdLDE2KV19fSx7cmU6LyMoW2EtZjAtOV0pKFthLWYwLTldKShbYS1mMC05XSkvLHBhcnNlOmZ1bmN0aW9uKGUpe3JldHVybltwYXJzZUludChlWzFdK2VbMV0sMTYpLHBhcnNlSW50KGVbMl0rZVsyXSwxNikscGFyc2VJbnQoZVszXStlWzNdLDE2KV19fSx7cmU6L2hzbGE/XChccyooXGQrKD86XC5cZCspPylccyosXHMqKFxkKyg/OlwuXGQrKT8pXCVccyosXHMqKFxkKyg/OlwuXGQrKT8pXCVccyooPzosXHMqKFxkKyg/OlwuXGQrKT8pXHMqKT9cKS8sc3BhY2U6ImhzbGEiLHBhcnNlOmZ1bmN0aW9uKGUpe3JldHVybltlWzFdLGVbMl0vMTAwLGVbM10vMTAwLGVbNF1dfX1dLG89dC5Db2xvcj1mdW5jdGlvbihlLG4scixpKXtyZXR1cm4gbmV3IHQuQ29sb3IuZm4ucGFyc2UoZSxuLHIsaSl9LHU9e3JnYmE6e3Byb3BzOntyZWQ6e2lkeDowLHR5cGU6ImJ5dGUifSxncmVlbjp7aWR4OjEsdHlwZToiYnl0ZSJ9LGJsdWU6e2lkeDoyLHR5cGU6ImJ5dGUifX19LGhzbGE6e3Byb3BzOntodWU6e2lkeDowLHR5cGU6ImRlZ3JlZXMifSxzYXR1cmF0aW9uOntpZHg6MSx0eXBlOiJwZXJjZW50In0sbGlnaHRuZXNzOntpZHg6Mix0eXBlOiJwZXJjZW50In19fX0sYT17ImJ5dGUiOntmbG9vcjohMCxtYXg6MjU1fSxwZXJjZW50OnttYXg6MX0sZGVncmVlczp7bW9kOjM2MCxmbG9vcjohMH19LGY9by5zdXBwb3J0PXt9LGw9dCgiPHA+IilbMF0sYyxoPXQuZWFjaDtsLnN0eWxlLmNzc1RleHQ9ImJhY2tncm91bmQtY29sb3I6cmdiYSgxLDEsMSwuNSkiLGYucmdiYT1sLnN0eWxlLmJhY2tncm91bmRDb2xvci5pbmRleE9mKCJyZ2JhIik+LTEsaCh1LGZ1bmN0aW9uKGUsdCl7dC5jYWNoZT0iXyIrZSx0LnByb3BzLmFscGhhPXtpZHg6Myx0eXBlOiJwZXJjZW50IixkZWY6MX19KSxvLmZuPXQuZXh0ZW5kKG8ucHJvdG90eXBlLHtwYXJzZTpmdW5jdGlvbihyLGkscyxhKXtpZihyPT09bilyZXR1cm4gdGhpcy5fcmdiYT1bbnVsbCxudWxsLG51bGwsbnVsbF0sdGhpcztpZihyLmpxdWVyeXx8ci5ub2RlVHlwZSlyPXQocikuY3NzKGkpLGk9bjt2YXIgZj10aGlzLGw9dC50eXBlKHIpLHY9dGhpcy5fcmdiYT1bXTtpIT09biYmKHI9W3IsaSxzLGFdLGw9ImFycmF5Iik7aWYobD09PSJzdHJpbmciKXJldHVybiB0aGlzLnBhcnNlKGQocil8fGMuX2RlZmF1bHQpO2lmKGw9PT0iYXJyYXkiKXJldHVybiBoKHUucmdiYS5wcm9wcyxmdW5jdGlvbihlLHQpe3ZbdC5pZHhdPXAoclt0LmlkeF0sdCl9KSx0aGlzO2lmKGw9PT0ib2JqZWN0IilyZXR1cm4gciBpbnN0YW5jZW9mIG8/aCh1LGZ1bmN0aW9uKGUsdCl7clt0LmNhY2hlXSYmKGZbdC5jYWNoZV09clt0LmNhY2hlXS5zbGljZSgpKX0pOmgodSxmdW5jdGlvbih0LG4pe3ZhciBpPW4uY2FjaGU7aChuLnByb3BzLGZ1bmN0aW9uKGUsdCl7aWYoIWZbaV0mJm4udG8pe2lmKGU9PT0iYWxwaGEifHxyW2VdPT1udWxsKXJldHVybjtmW2ldPW4udG8oZi5fcmdiYSl9ZltpXVt0LmlkeF09cChyW2VdLHQsITApfSksZltpXSYmZS5pbkFycmF5KG51bGwsZltpXS5zbGljZSgwLDMpKTwwJiYoZltpXVszXT0xLG4uZnJvbSYmKGYuX3JnYmE9bi5mcm9tKGZbaV0pKSl9KSx0aGlzfSxpczpmdW5jdGlvbihlKXt2YXIgdD1vKGUpLG49ITAscj10aGlzO3JldHVybiBoKHUsZnVuY3Rpb24oZSxpKXt2YXIgcyxvPXRbaS5jYWNoZV07cmV0dXJuIG8mJihzPXJbaS5jYWNoZV18fGkudG8mJmkudG8oci5fcmdiYSl8fFtdLGgoaS5wcm9wcyxmdW5jdGlvbihlLHQpe2lmKG9bdC5pZHhdIT1udWxsKXJldHVybiBuPW9bdC5pZHhdPT09c1t0LmlkeF0sbn0pKSxufSksbn0sX3NwYWNlOmZ1bmN0aW9uKCl7dmFyIGU9W10sdD10aGlzO3JldHVybiBoKHUsZnVuY3Rpb24obixyKXt0W3IuY2FjaGVdJiZlLnB1c2gobil9KSxlLnBvcCgpfSx0cmFuc2l0aW9uOmZ1bmN0aW9uKGUsdCl7dmFyIG49byhlKSxyPW4uX3NwYWNlKCksaT11W3JdLHM9dGhpcy5hbHBoYSgpPT09MD9vKCJ0cmFuc3BhcmVudCIpOnRoaXMsZj1zW2kuY2FjaGVdfHxpLnRvKHMuX3JnYmEpLGw9Zi5zbGljZSgpO3JldHVybiBuPW5baS5jYWNoZV0saChpLnByb3BzLGZ1bmN0aW9uKGUscil7dmFyIGk9ci5pZHgscz1mW2ldLG89bltpXSx1PWFbci50eXBlXXx8e307aWYobz09PW51bGwpcmV0dXJuO3M9PT1udWxsP2xbaV09bzoodS5tb2QmJihvLXM+dS5tb2QvMj9zKz11Lm1vZDpzLW8+dS5tb2QvMiYmKHMtPXUubW9kKSksbFtpXT1wKChvLXMpKnQrcyxyKSl9KSx0aGlzW3JdKGwpfSxibGVuZDpmdW5jdGlvbihlKXtpZih0aGlzLl9yZ2JhWzNdPT09MSlyZXR1cm4gdGhpczt2YXIgbj10aGlzLl9yZ2JhLnNsaWNlKCkscj1uLnBvcCgpLGk9byhlKS5fcmdiYTtyZXR1cm4gbyh0Lm1hcChuLGZ1bmN0aW9uKGUsdCl7cmV0dXJuKDEtcikqaVt0XStyKmV9KSl9LHRvUmdiYVN0cmluZzpmdW5jdGlvbigpe3ZhciBlPSJyZ2JhKCIsbj10Lm1hcCh0aGlzLl9yZ2JhLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9PW51bGw/dD4yPzE6MDplfSk7cmV0dXJuIG5bM109PT0xJiYobi5wb3AoKSxlPSJyZ2IoIiksZStuLmpvaW4oKSsiKSJ9LHRvSHNsYVN0cmluZzpmdW5jdGlvbigpe3ZhciBlPSJoc2xhKCIsbj10Lm1hcCh0aGlzLmhzbGEoKSxmdW5jdGlvbihlLHQpe3JldHVybiBlPT1udWxsJiYoZT10PjI/MTowKSx0JiZ0PDMmJihlPU1hdGgucm91bmQoZSoxMDApKyIlIiksZX0pO3JldHVybiBuWzNdPT09MSYmKG4ucG9wKCksZT0iaHNsKCIpLGUrbi5qb2luKCkrIikifSx0b0hleFN0cmluZzpmdW5jdGlvbihlKXt2YXIgbj10aGlzLl9yZ2JhLnNsaWNlKCkscj1uLnBvcCgpO3JldHVybiBlJiZuLnB1c2gofn4ocioyNTUpKSwiIyIrdC5tYXAobixmdW5jdGlvbihlKXtyZXR1cm4gZT0oZXx8MCkudG9TdHJpbmcoMTYpLGUubGVuZ3RoPT09MT8iMCIrZTplfSkuam9pbigiIil9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JnYmFbM109PT0wPyJ0cmFuc3BhcmVudCI6dGhpcy50b1JnYmFTdHJpbmcoKX19KSxvLmZuLnBhcnNlLnByb3RvdHlwZT1vLmZuLHUuaHNsYS50bz1mdW5jdGlvbihlKXtpZihlWzBdPT1udWxsfHxlWzFdPT1udWxsfHxlWzJdPT1udWxsKXJldHVybltudWxsLG51bGwsbnVsbCxlWzNdXTt2YXIgdD1lWzBdLzI1NSxuPWVbMV0vMjU1LHI9ZVsyXS8yNTUsaT1lWzNdLHM9TWF0aC5tYXgodCxuLHIpLG89TWF0aC5taW4odCxuLHIpLHU9cy1vLGE9cytvLGY9YSouNSxsLGM7cmV0dXJuIG89PT1zP2w9MDp0PT09cz9sPTYwKihuLXIpL3UrMzYwOm49PT1zP2w9NjAqKHItdCkvdSsxMjA6bD02MCoodC1uKS91KzI0MCxmPT09MHx8Zj09PTE/Yz1mOmY8PS41P2M9dS9hOmM9dS8oMi1hKSxbTWF0aC5yb3VuZChsKSUzNjAsYyxmLGk9PW51bGw/MTppXX0sdS5oc2xhLmZyb209ZnVuY3Rpb24oZSl7aWYoZVswXT09bnVsbHx8ZVsxXT09bnVsbHx8ZVsyXT09bnVsbClyZXR1cm5bbnVsbCxudWxsLG51bGwsZVszXV07dmFyIHQ9ZVswXS8zNjAsbj1lWzFdLHI9ZVsyXSxpPWVbM10scz1yPD0uNT9yKigxK24pOnIrbi1yKm4sbz0yKnItcztyZXR1cm5bTWF0aC5yb3VuZCh2KG8scyx0KzEvMykqMjU1KSxNYXRoLnJvdW5kKHYobyxzLHQpKjI1NSksTWF0aC5yb3VuZCh2KG8scyx0LTEvMykqMjU1KSxpXX0saCh1LGZ1bmN0aW9uKGUscil7dmFyIHM9ci5wcm9wcyx1PXIuY2FjaGUsYT1yLnRvLGY9ci5mcm9tO28uZm5bZV09ZnVuY3Rpb24oZSl7YSYmIXRoaXNbdV0mJih0aGlzW3VdPWEodGhpcy5fcmdiYSkpO2lmKGU9PT1uKXJldHVybiB0aGlzW3VdLnNsaWNlKCk7dmFyIHIsaT10LnR5cGUoZSksbD1pPT09ImFycmF5Inx8aT09PSJvYmplY3QiP2U6YXJndW1lbnRzLGM9dGhpc1t1XS5zbGljZSgpO3JldHVybiBoKHMsZnVuY3Rpb24oZSx0KXt2YXIgbj1sW2k9PT0ib2JqZWN0Ij9lOnQuaWR4XTtuPT1udWxsJiYobj1jW3QuaWR4XSksY1t0LmlkeF09cChuLHQpfSksZj8ocj1vKGYoYykpLHJbdV09YyxyKTpvKGMpfSxoKHMsZnVuY3Rpb24obixyKXtpZihvLmZuW25dKXJldHVybjtvLmZuW25dPWZ1bmN0aW9uKHMpe3ZhciBvPXQudHlwZShzKSx1PW49PT0iYWxwaGEiP3RoaXMuX2hzbGE/ImhzbGEiOiJyZ2JhIjplLGE9dGhpc1t1XSgpLGY9YVtyLmlkeF0sbDtyZXR1cm4gbz09PSJ1bmRlZmluZWQiP2Y6KG89PT0iZnVuY3Rpb24iJiYocz1zLmNhbGwodGhpcyxmKSxvPXQudHlwZShzKSkscz09bnVsbCYmci5lbXB0eT90aGlzOihvPT09InN0cmluZyImJihsPWkuZXhlYyhzKSxsJiYocz1mK3BhcnNlRmxvYXQobFsyXSkqKGxbMV09PT0iKyI/MTotMSkpKSxhW3IuaWR4XT1zLHRoaXNbdV0oYSkpKX19KX0pLGgocixmdW5jdGlvbihlLG4pe3QuY3NzSG9va3Nbbl09e3NldDpmdW5jdGlvbihlLHIpe3ZhciBpLHMsdT0iIjtpZih0LnR5cGUocikhPT0ic3RyaW5nInx8KGk9ZChyKSkpe3I9byhpfHxyKTtpZighZi5yZ2JhJiZyLl9yZ2JhWzNdIT09MSl7cz1uPT09ImJhY2tncm91bmRDb2xvciI/ZS5wYXJlbnROb2RlOmU7d2hpbGUoKHU9PT0iInx8dT09PSJ0cmFuc3BhcmVudCIpJiZzJiZzLnN0eWxlKXRyeXt1PXQuY3NzKHMsImJhY2tncm91bmRDb2xvciIpLHM9cy5wYXJlbnROb2RlfWNhdGNoKGEpe31yPXIuYmxlbmQodSYmdSE9PSJ0cmFuc3BhcmVudCI/dToiX2RlZmF1bHQiKX1yPXIudG9SZ2JhU3RyaW5nKCl9dHJ5e2Uuc3R5bGVbbl09cn1jYXRjaChsKXt9fX0sdC5meC5zdGVwW25dPWZ1bmN0aW9uKGUpe2UuY29sb3JJbml0fHwoZS5zdGFydD1vKGUuZWxlbSxuKSxlLmVuZD1vKGUuZW5kKSxlLmNvbG9ySW5pdD0hMCksdC5jc3NIb29rc1tuXS5zZXQoZS5lbGVtLGUuc3RhcnQudHJhbnNpdGlvbihlLmVuZCxlLnBvcykpfX0pLHQuY3NzSG9va3MuYm9yZGVyQ29sb3I9e2V4cGFuZDpmdW5jdGlvbihlKXt2YXIgdD17fTtyZXR1cm4gaChbIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLGZ1bmN0aW9uKG4scil7dFsiYm9yZGVyIityKyJDb2xvciJdPWV9KSx0fX0sYz10LkNvbG9yLm5hbWVzPXthcXVhOiIjMDBmZmZmIixibGFjazoiIzAwMDAwMCIsYmx1ZToiIzAwMDBmZiIsZnVjaHNpYToiI2ZmMDBmZiIsZ3JheToiIzgwODA4MCIsZ3JlZW46IiMwMDgwMDAiLGxpbWU6IiMwMGZmMDAiLG1hcm9vbjoiIzgwMDAwMCIsbmF2eToiIzAwMDA4MCIsb2xpdmU6IiM4MDgwMDAiLHB1cnBsZToiIzgwMDA4MCIscmVkOiIjZmYwMDAwIixzaWx2ZXI6IiNjMGMwYzAiLHRlYWw6IiMwMDgwODAiLHdoaXRlOiIjZmZmZmZmIix5ZWxsb3c6IiNmZmZmMDAiLHRyYW5zcGFyZW50OltudWxsLG51bGwsbnVsbCwwXSxfZGVmYXVsdDoiI2ZmZmZmZiJ9fShqUXVlcnkpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gaSgpe3ZhciB0PXRoaXMub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldz90aGlzLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLG51bGwpOnRoaXMuY3VycmVudFN0eWxlLG49e30scixpO2lmKHQmJnQubGVuZ3RoJiZ0WzBdJiZ0W3RbMF1dKXtpPXQubGVuZ3RoO3doaWxlKGktLSlyPXRbaV0sdHlwZW9mIHRbcl09PSJzdHJpbmciJiYobltlLmNhbWVsQ2FzZShyKV09dFtyXSl9ZWxzZSBmb3IociBpbiB0KXR5cGVvZiB0W3JdPT0ic3RyaW5nIiYmKG5bcl09dFtyXSk7cmV0dXJuIG59ZnVuY3Rpb24gcyh0LG4pe3ZhciBpPXt9LHMsbztmb3IocyBpbiBuKW89bltzXSx0W3NdIT09byYmIXJbc10mJihlLmZ4LnN0ZXBbc118fCFpc05hTihwYXJzZUZsb2F0KG8pKSkmJihpW3NdPW8pO3JldHVybiBpfXZhciBuPVsiYWRkIiwicmVtb3ZlIiwidG9nZ2xlIl0scj17Ym9yZGVyOjEsYm9yZGVyQm90dG9tOjEsYm9yZGVyQ29sb3I6MSxib3JkZXJMZWZ0OjEsYm9yZGVyUmlnaHQ6MSxib3JkZXJUb3A6MSxib3JkZXJXaWR0aDoxLG1hcmdpbjoxLHBhZGRpbmc6MX07ZS5lYWNoKFsiYm9yZGVyTGVmdFN0eWxlIiwiYm9yZGVyUmlnaHRTdHlsZSIsImJvcmRlckJvdHRvbVN0eWxlIiwiYm9yZGVyVG9wU3R5bGUiXSxmdW5jdGlvbih0LG4pe2UuZnguc3RlcFtuXT1mdW5jdGlvbihlKXtpZihlLmVuZCE9PSJub25lIiYmIWUuc2V0QXR0cnx8ZS5wb3M9PT0xJiYhZS5zZXRBdHRyKWpRdWVyeS5zdHlsZShlLmVsZW0sbixlLmVuZCksZS5zZXRBdHRyPSEwfX0pLGUuZWZmZWN0cy5hbmltYXRlQ2xhc3M9ZnVuY3Rpb24odCxyLG8sdSl7dmFyIGE9ZS5zcGVlZChyLG8sdSk7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgcj1lKHRoaXMpLG89ci5hdHRyKCJjbGFzcyIpfHwiIix1LGY9YS5jaGlsZHJlbj9yLmZpbmQoIioiKS5hbmRTZWxmKCk6cjtmPWYubWFwKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKTtyZXR1cm57ZWw6dCxzdGFydDppLmNhbGwodGhpcyl9fSksdT1mdW5jdGlvbigpe2UuZWFjaChuLGZ1bmN0aW9uKGUsbil7dFtuXSYmcltuKyJDbGFzcyJdKHRbbl0pfSl9LHUoKSxmPWYubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW5kPWkuY2FsbCh0aGlzLmVsWzBdKSx0aGlzLmRpZmY9cyh0aGlzLnN0YXJ0LHRoaXMuZW5kKSx0aGlzfSksci5hdHRyKCJjbGFzcyIsbyksZj1mLm1hcChmdW5jdGlvbigpe3ZhciB0PXRoaXMsbj1lLkRlZmVycmVkKCkscj1qUXVlcnkuZXh0ZW5kKHt9LGEse3F1ZXVlOiExLGNvbXBsZXRlOmZ1bmN0aW9uKCl7bi5yZXNvbHZlKHQpfX0pO3JldHVybiB0aGlzLmVsLmFuaW1hdGUodGhpcy5kaWZmLHIpLG4ucHJvbWlzZSgpfSksZS53aGVuLmFwcGx5KGUsZi5nZXQoKSkuZG9uZShmdW5jdGlvbigpe3UoKSxlLmVhY2goYXJndW1lbnRzLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5lbDtlLmVhY2godGhpcy5kaWZmLGZ1bmN0aW9uKGUpe3QuY3NzKGUsIiIpfSl9KSxhLmNvbXBsZXRlLmNhbGwoclswXSl9KX0pfSxlLmZuLmV4dGVuZCh7X2FkZENsYXNzOmUuZm4uYWRkQ2xhc3MsYWRkQ2xhc3M6ZnVuY3Rpb24odCxuLHIsaSl7cmV0dXJuIG4/ZS5lZmZlY3RzLmFuaW1hdGVDbGFzcy5jYWxsKHRoaXMse2FkZDp0fSxuLHIsaSk6dGhpcy5fYWRkQ2xhc3ModCl9LF9yZW1vdmVDbGFzczplLmZuLnJlbW92ZUNsYXNzLHJlbW92ZUNsYXNzOmZ1bmN0aW9uKHQsbixyLGkpe3JldHVybiBuP2UuZWZmZWN0cy5hbmltYXRlQ2xhc3MuY2FsbCh0aGlzLHtyZW1vdmU6dH0sbixyLGkpOnRoaXMuX3JlbW92ZUNsYXNzKHQpfSxfdG9nZ2xlQ2xhc3M6ZS5mbi50b2dnbGVDbGFzcyx0b2dnbGVDbGFzczpmdW5jdGlvbihuLHIsaSxzLG8pe3JldHVybiB0eXBlb2Ygcj09ImJvb2xlYW4ifHxyPT09dD9pP2UuZWZmZWN0cy5hbmltYXRlQ2xhc3MuY2FsbCh0aGlzLHI/e2FkZDpufTp7cmVtb3ZlOm59LGkscyxvKTp0aGlzLl90b2dnbGVDbGFzcyhuLHIpOmUuZWZmZWN0cy5hbmltYXRlQ2xhc3MuY2FsbCh0aGlzLHt0b2dnbGU6bn0scixpLHMpfSxzd2l0Y2hDbGFzczpmdW5jdGlvbih0LG4scixpLHMpe3JldHVybiBlLmVmZmVjdHMuYW5pbWF0ZUNsYXNzLmNhbGwodGhpcyx7YWRkOm4scmVtb3ZlOnR9LHIsaSxzKX19KX0oKSxmdW5jdGlvbigpe2Z1bmN0aW9uIGkodCxuLHIsaSl7ZS5pc1BsYWluT2JqZWN0KHQpJiYobj10LHQ9dC5lZmZlY3QpLHQ9e2VmZmVjdDp0fSxuPT1udWxsJiYobj17fSksZS5pc0Z1bmN0aW9uKG4pJiYoaT1uLHI9bnVsbCxuPXt9KTtpZih0eXBlb2Ygbj09Im51bWJlciJ8fGUuZnguc3BlZWRzW25dKWk9cixyPW4sbj17fTtyZXR1cm4gZS5pc0Z1bmN0aW9uKHIpJiYoaT1yLHI9bnVsbCksbiYmZS5leHRlbmQodCxuKSxyPXJ8fG4uZHVyYXRpb24sdC5kdXJhdGlvbj1lLmZ4Lm9mZj8wOnR5cGVvZiByPT0ibnVtYmVyIj9yOnIgaW4gZS5meC5zcGVlZHM/ZS5meC5zcGVlZHNbcl06ZS5meC5zcGVlZHMuX2RlZmF1bHQsdC5jb21wbGV0ZT1pfHxuLmNvbXBsZXRlLHR9ZnVuY3Rpb24gcyh0KXtyZXR1cm4hdHx8dHlwZW9mIHQ9PSJudW1iZXIifHxlLmZ4LnNwZWVkc1t0XT8hMDp0eXBlb2YgdD09InN0cmluZyImJiFlLmVmZmVjdHMuZWZmZWN0W3RdP24mJmUuZWZmZWN0c1t0XT8hMTohMDohMX1lLmV4dGVuZChlLmVmZmVjdHMse3ZlcnNpb246IjEuOS4yIixzYXZlOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspdFtuXSE9PW51bGwmJmUuZGF0YShyK3Rbbl0sZVswXS5zdHlsZVt0W25dXSl9LHJlc3RvcmU6ZnVuY3Rpb24oZSxuKXt2YXIgaSxzO2ZvcihzPTA7czxuLmxlbmd0aDtzKyspbltzXSE9PW51bGwmJihpPWUuZGF0YShyK25bc10pLGk9PT10JiYoaT0iIiksZS5jc3MobltzXSxpKSl9LHNldE1vZGU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD09PSJ0b2dnbGUiJiYodD1lLmlzKCI6aGlkZGVuIik/InNob3ciOiJoaWRlIiksdH0sZ2V0QmFzZWxpbmU6ZnVuY3Rpb24oZSx0KXt2YXIgbixyO3N3aXRjaChlWzBdKXtjYXNlInRvcCI6bj0wO2JyZWFrO2Nhc2UibWlkZGxlIjpuPS41O2JyZWFrO2Nhc2UiYm90dG9tIjpuPTE7YnJlYWs7ZGVmYXVsdDpuPWVbMF0vdC5oZWlnaHR9c3dpdGNoKGVbMV0pe2Nhc2UibGVmdCI6cj0wO2JyZWFrO2Nhc2UiY2VudGVyIjpyPS41O2JyZWFrO2Nhc2UicmlnaHQiOnI9MTticmVhaztkZWZhdWx0OnI9ZVsxXS90LndpZHRofXJldHVybnt4OnIseTpufX0sY3JlYXRlV3JhcHBlcjpmdW5jdGlvbih0KXtpZih0LnBhcmVudCgpLmlzKCIudWktZWZmZWN0cy13cmFwcGVyIikpcmV0dXJuIHQucGFyZW50KCk7dmFyIG49e3dpZHRoOnQub3V0ZXJXaWR0aCghMCksaGVpZ2h0OnQub3V0ZXJIZWlnaHQoITApLCJmbG9hdCI6dC5jc3MoImZsb2F0Iil9LHI9ZSgiPGRpdj48L2Rpdj4iKS5hZGRDbGFzcygidWktZWZmZWN0cy13cmFwcGVyIikuY3NzKHtmb250U2l6ZToiMTAwJSIsYmFja2dyb3VuZDoidHJhbnNwYXJlbnQiLGJvcmRlcjoibm9uZSIsbWFyZ2luOjAscGFkZGluZzowfSksaT17d2lkdGg6dC53aWR0aCgpLGhlaWdodDp0LmhlaWdodCgpfSxzPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7dHJ5e3MuaWR9Y2F0Y2gobyl7cz1kb2N1bWVudC5ib2R5fXJldHVybiB0LndyYXAociksKHRbMF09PT1zfHxlLmNvbnRhaW5zKHRbMF0scykpJiZlKHMpLmZvY3VzKCkscj10LnBhcmVudCgpLHQuY3NzKCJwb3NpdGlvbiIpPT09InN0YXRpYyI/KHIuY3NzKHtwb3NpdGlvbjoicmVsYXRpdmUifSksdC5jc3Moe3Bvc2l0aW9uOiJyZWxhdGl2ZSJ9KSk6KGUuZXh0ZW5kKG4se3Bvc2l0aW9uOnQuY3NzKCJwb3NpdGlvbiIpLHpJbmRleDp0LmNzcygiei1pbmRleCIpfSksZS5lYWNoKFsidG9wIiwibGVmdCIsImJvdHRvbSIsInJpZ2h0Il0sZnVuY3Rpb24oZSxyKXtuW3JdPXQuY3NzKHIpLGlzTmFOKHBhcnNlSW50KG5bcl0sMTApKSYmKG5bcl09ImF1dG8iKX0pLHQuY3NzKHtwb3NpdGlvbjoicmVsYXRpdmUiLHRvcDowLGxlZnQ6MCxyaWdodDoiYXV0byIsYm90dG9tOiJhdXRvIn0pKSx0LmNzcyhpKSxyLmNzcyhuKS5zaG93KCl9LHJlbW92ZVdyYXBwZXI6ZnVuY3Rpb24odCl7dmFyIG49ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtyZXR1cm4gdC5wYXJlbnQoKS5pcygiLnVpLWVmZmVjdHMtd3JhcHBlciIpJiYodC5wYXJlbnQoKS5yZXBsYWNlV2l0aCh0KSwodFswXT09PW58fGUuY29udGFpbnModFswXSxuKSkmJmUobikuZm9jdXMoKSksdH0sc2V0VHJhbnNpdGlvbjpmdW5jdGlvbih0LG4scixpKXtyZXR1cm4gaT1pfHx7fSxlLmVhY2gobixmdW5jdGlvbihlLG4pe3ZhciBzPXQuY3NzVW5pdChuKTtzWzBdPjAmJihpW25dPXNbMF0qcitzWzFdKX0pLGl9fSksZS5mbi5leHRlbmQoe2VmZmVjdDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEobil7ZnVuY3Rpb24gdSgpe2UuaXNGdW5jdGlvbihpKSYmaS5jYWxsKHJbMF0pLGUuaXNGdW5jdGlvbihuKSYmbigpfXZhciByPWUodGhpcyksaT10LmNvbXBsZXRlLHM9dC5tb2RlOyhyLmlzKCI6aGlkZGVuIik/cz09PSJoaWRlIjpzPT09InNob3ciKT91KCk6by5jYWxsKHJbMF0sdCx1KX12YXIgdD1pLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxyPXQubW9kZSxzPXQucXVldWUsbz1lLmVmZmVjdHMuZWZmZWN0W3QuZWZmZWN0XSx1PSFvJiZuJiZlLmVmZmVjdHNbdC5lZmZlY3RdO3JldHVybiBlLmZ4Lm9mZnx8IW8mJiF1P3I/dGhpc1tyXSh0LmR1cmF0aW9uLHQuY29tcGxldGUpOnRoaXMuZWFjaChmdW5jdGlvbigpe3QuY29tcGxldGUmJnQuY29tcGxldGUuY2FsbCh0aGlzKX0pOm8/cz09PSExP3RoaXMuZWFjaChhKTp0aGlzLnF1ZXVlKHN8fCJmeCIsYSk6dS5jYWxsKHRoaXMse29wdGlvbnM6dCxkdXJhdGlvbjp0LmR1cmF0aW9uLGNhbGxiYWNrOnQuY29tcGxldGUsbW9kZTp0Lm1vZGV9KX0sX3Nob3c6ZS5mbi5zaG93LHNob3c6ZnVuY3Rpb24oZSl7aWYocyhlKSlyZXR1cm4gdGhpcy5fc2hvdy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIHQ9aS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHQubW9kZT0ic2hvdyIsdGhpcy5lZmZlY3QuY2FsbCh0aGlzLHQpfSxfaGlkZTplLmZuLmhpZGUsaGlkZTpmdW5jdGlvbihlKXtpZihzKGUpKXJldHVybiB0aGlzLl9oaWRlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgdD1pLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gdC5tb2RlPSJoaWRlIix0aGlzLmVmZmVjdC5jYWxsKHRoaXMsdCl9LF9fdG9nZ2xlOmUuZm4udG9nZ2xlLHRvZ2dsZTpmdW5jdGlvbih0KXtpZihzKHQpfHx0eXBlb2YgdD09ImJvb2xlYW4ifHxlLmlzRnVuY3Rpb24odCkpcmV0dXJuIHRoaXMuX190b2dnbGUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBuPWkuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBuLm1vZGU9InRvZ2dsZSIsdGhpcy5lZmZlY3QuY2FsbCh0aGlzLG4pfSxjc3NVbml0OmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuY3NzKHQpLHI9W107cmV0dXJuIGUuZWFjaChbImVtIiwicHgiLCIlIiwicHQiXSxmdW5jdGlvbihlLHQpe24uaW5kZXhPZih0KT4wJiYocj1bcGFyc2VGbG9hdChuKSx0XSl9KSxyfX0pfSgpLGZ1bmN0aW9uKCl7dmFyIHQ9e307ZS5lYWNoKFsiUXVhZCIsIkN1YmljIiwiUXVhcnQiLCJRdWludCIsIkV4cG8iXSxmdW5jdGlvbihlLG4pe3Rbbl09ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucG93KHQsZSsyKX19KSxlLmV4dGVuZCh0LHtTaW5lOmZ1bmN0aW9uKGUpe3JldHVybiAxLU1hdGguY29zKGUqTWF0aC5QSS8yKX0sQ2lyYzpmdW5jdGlvbihlKXtyZXR1cm4gMS1NYXRoLnNxcnQoMS1lKmUpfSxFbGFzdGljOmZ1bmN0aW9uKGUpe3JldHVybiBlPT09MHx8ZT09PTE/ZTotTWF0aC5wb3coMiw4KihlLTEpKSpNYXRoLnNpbigoKGUtMSkqODAtNy41KSpNYXRoLlBJLzE1KX0sQmFjazpmdW5jdGlvbihlKXtyZXR1cm4gZSplKigzKmUtMil9LEJvdW5jZTpmdW5jdGlvbihlKXt2YXIgdCxuPTQ7d2hpbGUoZTwoKHQ9TWF0aC5wb3coMiwtLW4pKS0xKS8xMSk7cmV0dXJuIDEvTWF0aC5wb3coNCwzLW4pLTcuNTYyNSpNYXRoLnBvdygodCozLTIpLzIyLWUsMil9fSksZS5lYWNoKHQsZnVuY3Rpb24odCxuKXtlLmVhc2luZ1siZWFzZUluIit0XT1uLGUuZWFzaW5nWyJlYXNlT3V0Iit0XT1mdW5jdGlvbihlKXtyZXR1cm4gMS1uKDEtZSl9LGUuZWFzaW5nWyJlYXNlSW5PdXQiK3RdPWZ1bmN0aW9uKGUpe3JldHVybiBlPC41P24oZSoyKS8yOjEtbihlKi0yKzIpLzJ9fSl9KCl9KGpRdWVyeSk7KGZ1bmN0aW9uKGUsdCl7dmFyIG49L3VwfGRvd258dmVydGljYWwvLHI9L3VwfGxlZnR8dmVydGljYWx8aG9yaXpvbnRhbC87ZS5lZmZlY3RzLmVmZmVjdC5ibGluZD1mdW5jdGlvbih0LGkpe3ZhciBzPWUodGhpcyksbz1bInBvc2l0aW9uIiwidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0IiwiaGVpZ2h0Iiwid2lkdGgiXSx1PWUuZWZmZWN0cy5zZXRNb2RlKHMsdC5tb2RlfHwiaGlkZSIpLGE9dC5kaXJlY3Rpb258fCJ1cCIsZj1uLnRlc3QoYSksbD1mPyJoZWlnaHQiOiJ3aWR0aCIsYz1mPyJ0b3AiOiJsZWZ0IixoPXIudGVzdChhKSxwPXt9LGQ9dT09PSJzaG93Iix2LG0sZztzLnBhcmVudCgpLmlzKCIudWktZWZmZWN0cy13cmFwcGVyIik/ZS5lZmZlY3RzLnNhdmUocy5wYXJlbnQoKSxvKTplLmVmZmVjdHMuc2F2ZShzLG8pLHMuc2hvdygpLHY9ZS5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIocykuY3NzKHtvdmVyZmxvdzoiaGlkZGVuIn0pLG09dltsXSgpLGc9cGFyc2VGbG9hdCh2LmNzcyhjKSl8fDAscFtsXT1kP206MCxofHwocy5jc3MoZj8iYm90dG9tIjoicmlnaHQiLDApLmNzcyhmPyJ0b3AiOiJsZWZ0IiwiYXV0byIpLmNzcyh7cG9zaXRpb246ImFic29sdXRlIn0pLHBbY109ZD9nOm0rZyksZCYmKHYuY3NzKGwsMCksaHx8di5jc3MoYyxnK20pKSx2LmFuaW1hdGUocCx7ZHVyYXRpb246dC5kdXJhdGlvbixlYXNpbmc6dC5lYXNpbmcscXVldWU6ITEsY29tcGxldGU6ZnVuY3Rpb24oKXt1PT09ImhpZGUiJiZzLmhpZGUoKSxlLmVmZmVjdHMucmVzdG9yZShzLG8pLGUuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKHMpLGkoKX19KX19KShqUXVlcnkpOyhmdW5jdGlvbihlLHQpe2UuZWZmZWN0cy5lZmZlY3QuYm91bmNlPWZ1bmN0aW9uKHQsbil7dmFyIHI9ZSh0aGlzKSxpPVsicG9zaXRpb24iLCJ0b3AiLCJib3R0b20iLCJsZWZ0IiwicmlnaHQiLCJoZWlnaHQiLCJ3aWR0aCJdLHM9ZS5lZmZlY3RzLnNldE1vZGUocix0Lm1vZGV8fCJlZmZlY3QiKSxvPXM9PT0iaGlkZSIsdT1zPT09InNob3ciLGE9dC5kaXJlY3Rpb258fCJ1cCIsZj10LmRpc3RhbmNlLGw9dC50aW1lc3x8NSxjPWwqMisodXx8bz8xOjApLGg9dC5kdXJhdGlvbi9jLHA9dC5lYXNpbmcsZD1hPT09InVwInx8YT09PSJkb3duIj8idG9wIjoibGVmdCIsdj1hPT09InVwInx8YT09PSJsZWZ0IixtLGcseSxiPXIucXVldWUoKSx3PWIubGVuZ3RoOyh1fHxvKSYmaS5wdXNoKCJvcGFjaXR5IiksZS5lZmZlY3RzLnNhdmUocixpKSxyLnNob3coKSxlLmVmZmVjdHMuY3JlYXRlV3JhcHBlcihyKSxmfHwoZj1yW2Q9PT0idG9wIj8ib3V0ZXJIZWlnaHQiOiJvdXRlcldpZHRoIl0oKS8zKSx1JiYoeT17b3BhY2l0eToxfSx5W2RdPTAsci5jc3MoIm9wYWNpdHkiLDApLmNzcyhkLHY/LWYqMjpmKjIpLmFuaW1hdGUoeSxoLHApKSxvJiYoZi89TWF0aC5wb3coMixsLTEpKSx5PXt9LHlbZF09MDtmb3IobT0wO208bDttKyspZz17fSxnW2RdPSh2PyItPSI6Iis9IikrZixyLmFuaW1hdGUoZyxoLHApLmFuaW1hdGUoeSxoLHApLGY9bz9mKjI6Zi8yO28mJihnPXtvcGFjaXR5OjB9LGdbZF09KHY/Ii09IjoiKz0iKStmLHIuYW5pbWF0ZShnLGgscCkpLHIucXVldWUoZnVuY3Rpb24oKXtvJiZyLmhpZGUoKSxlLmVmZmVjdHMucmVzdG9yZShyLGkpLGUuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKHIpLG4oKX0pLHc+MSYmYi5zcGxpY2UuYXBwbHkoYixbMSwwXS5jb25jYXQoYi5zcGxpY2UodyxjKzEpKSksci5kZXF1ZXVlKCl9fSkoalF1ZXJ5KTsoZnVuY3Rpb24oZSx0KXtlLmVmZmVjdHMuZWZmZWN0LmNsaXA9ZnVuY3Rpb24odCxuKXt2YXIgcj1lKHRoaXMpLGk9WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCIsImhlaWdodCIsIndpZHRoIl0scz1lLmVmZmVjdHMuc2V0TW9kZShyLHQubW9kZXx8ImhpZGUiKSxvPXM9PT0ic2hvdyIsdT10LmRpcmVjdGlvbnx8InZlcnRpY2FsIixhPXU9PT0idmVydGljYWwiLGY9YT8iaGVpZ2h0Ijoid2lkdGgiLGw9YT8idG9wIjoibGVmdCIsYz17fSxoLHAsZDtlLmVmZmVjdHMuc2F2ZShyLGkpLHIuc2hvdygpLGg9ZS5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIocikuY3NzKHtvdmVyZmxvdzoiaGlkZGVuIn0pLHA9clswXS50YWdOYW1lPT09IklNRyI/aDpyLGQ9cFtmXSgpLG8mJihwLmNzcyhmLDApLHAuY3NzKGwsZC8yKSksY1tmXT1vP2Q6MCxjW2xdPW8/MDpkLzIscC5hbmltYXRlKGMse3F1ZXVlOiExLGR1cmF0aW9uOnQuZHVyYXRpb24sZWFzaW5nOnQuZWFzaW5nLGNvbXBsZXRlOmZ1bmN0aW9uKCl7b3x8ci5oaWRlKCksZS5lZmZlY3RzLnJlc3RvcmUocixpKSxlLmVmZmVjdHMucmVtb3ZlV3JhcHBlcihyKSxuKCl9fSl9fSkoalF1ZXJ5KTsoZnVuY3Rpb24oZSx0KXtlLmVmZmVjdHMuZWZmZWN0LmRyb3A9ZnVuY3Rpb24odCxuKXt2YXIgcj1lKHRoaXMpLGk9WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCIsIm9wYWNpdHkiLCJoZWlnaHQiLCJ3aWR0aCJdLHM9ZS5lZmZlY3RzLnNldE1vZGUocix0Lm1vZGV8fCJoaWRlIiksbz1zPT09InNob3ciLHU9dC5kaXJlY3Rpb258fCJsZWZ0IixhPXU9PT0idXAifHx1PT09ImRvd24iPyJ0b3AiOiJsZWZ0IixmPXU9PT0idXAifHx1PT09ImxlZnQiPyJwb3MiOiJuZWciLGw9e29wYWNpdHk6bz8xOjB9LGM7ZS5lZmZlY3RzLnNhdmUocixpKSxyLnNob3coKSxlLmVmZmVjdHMuY3JlYXRlV3JhcHBlcihyKSxjPXQuZGlzdGFuY2V8fHJbYT09PSJ0b3AiPyJvdXRlckhlaWdodCI6Im91dGVyV2lkdGgiXSghMCkvMixvJiZyLmNzcygib3BhY2l0eSIsMCkuY3NzKGEsZj09PSJwb3MiPy1jOmMpLGxbYV09KG8/Zj09PSJwb3MiPyIrPSI6Ii09IjpmPT09InBvcyI/Ii09IjoiKz0iKStjLHIuYW5pbWF0ZShsLHtxdWV1ZTohMSxkdXJhdGlvbjp0LmR1cmF0aW9uLGVhc2luZzp0LmVhc2luZyxjb21wbGV0ZTpmdW5jdGlvbigpe3M9PT0iaGlkZSImJnIuaGlkZSgpLGUuZWZmZWN0cy5yZXN0b3JlKHIsaSksZS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIociksbigpfX0pfX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGUsdCl7ZS5lZmZlY3RzLmVmZmVjdC5leHBsb2RlPWZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24geSgpe2MucHVzaCh0aGlzKSxjLmxlbmd0aD09PXIqaSYmYigpfWZ1bmN0aW9uIGIoKXtzLmNzcyh7dmlzaWJpbGl0eToidmlzaWJsZSJ9KSxlKGMpLnJlbW92ZSgpLHV8fHMuaGlkZSgpLG4oKX12YXIgcj10LnBpZWNlcz9NYXRoLnJvdW5kKE1hdGguc3FydCh0LnBpZWNlcykpOjMsaT1yLHM9ZSh0aGlzKSxvPWUuZWZmZWN0cy5zZXRNb2RlKHMsdC5tb2RlfHwiaGlkZSIpLHU9bz09PSJzaG93IixhPXMuc2hvdygpLmNzcygidmlzaWJpbGl0eSIsImhpZGRlbiIpLm9mZnNldCgpLGY9TWF0aC5jZWlsKHMub3V0ZXJXaWR0aCgpL2kpLGw9TWF0aC5jZWlsKHMub3V0ZXJIZWlnaHQoKS9yKSxjPVtdLGgscCxkLHYsbSxnO2ZvcihoPTA7aDxyO2grKyl7dj1hLnRvcCtoKmwsZz1oLShyLTEpLzI7Zm9yKHA9MDtwPGk7cCsrKWQ9YS5sZWZ0K3AqZixtPXAtKGktMSkvMixzLmNsb25lKCkuYXBwZW5kVG8oImJvZHkiKS53cmFwKCI8ZGl2PjwvZGl2PiIpLmNzcyh7cG9zaXRpb246ImFic29sdXRlIix2aXNpYmlsaXR5OiJ2aXNpYmxlIixsZWZ0Oi1wKmYsdG9wOi1oKmx9KS5wYXJlbnQoKS5hZGRDbGFzcygidWktZWZmZWN0cy1leHBsb2RlIikuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLG92ZXJmbG93OiJoaWRkZW4iLHdpZHRoOmYsaGVpZ2h0OmwsbGVmdDpkKyh1P20qZjowKSx0b3A6disodT9nKmw6MCksb3BhY2l0eTp1PzA6MX0pLmFuaW1hdGUoe2xlZnQ6ZCsodT8wOm0qZiksdG9wOnYrKHU/MDpnKmwpLG9wYWNpdHk6dT8xOjB9LHQuZHVyYXRpb258fDUwMCx0LmVhc2luZyx5KX19fSkoalF1ZXJ5KTsoZnVuY3Rpb24oZSx0KXtlLmVmZmVjdHMuZWZmZWN0LmZhZGU9ZnVuY3Rpb24odCxuKXt2YXIgcj1lKHRoaXMpLGk9ZS5lZmZlY3RzLnNldE1vZGUocix0Lm1vZGV8fCJ0b2dnbGUiKTtyLmFuaW1hdGUoe29wYWNpdHk6aX0se3F1ZXVlOiExLGR1cmF0aW9uOnQuZHVyYXRpb24sZWFzaW5nOnQuZWFzaW5nLGNvbXBsZXRlOm59KX19KShqUXVlcnkpOyhmdW5jdGlvbihlLHQpe2UuZWZmZWN0cy5lZmZlY3QuZm9sZD1mdW5jdGlvbih0LG4pe3ZhciByPWUodGhpcyksaT1bInBvc2l0aW9uIiwidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0IiwiaGVpZ2h0Iiwid2lkdGgiXSxzPWUuZWZmZWN0cy5zZXRNb2RlKHIsdC5tb2RlfHwiaGlkZSIpLG89cz09PSJzaG93Iix1PXM9PT0iaGlkZSIsYT10LnNpemV8fDE1LGY9LyhbMC05XSspJS8uZXhlYyhhKSxsPSEhdC5ob3JpekZpcnN0LGM9byE9PWwsaD1jP1sid2lkdGgiLCJoZWlnaHQiXTpbImhlaWdodCIsIndpZHRoIl0scD10LmR1cmF0aW9uLzIsZCx2LG09e30sZz17fTtlLmVmZmVjdHMuc2F2ZShyLGkpLHIuc2hvdygpLGQ9ZS5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIocikuY3NzKHtvdmVyZmxvdzoiaGlkZGVuIn0pLHY9Yz9bZC53aWR0aCgpLGQuaGVpZ2h0KCldOltkLmhlaWdodCgpLGQud2lkdGgoKV0sZiYmKGE9cGFyc2VJbnQoZlsxXSwxMCkvMTAwKnZbdT8wOjFdKSxvJiZkLmNzcyhsP3toZWlnaHQ6MCx3aWR0aDphfTp7aGVpZ2h0OmEsd2lkdGg6MH0pLG1baFswXV09bz92WzBdOmEsZ1toWzFdXT1vP3ZbMV06MCxkLmFuaW1hdGUobSxwLHQuZWFzaW5nKS5hbmltYXRlKGcscCx0LmVhc2luZyxmdW5jdGlvbigpe3UmJnIuaGlkZSgpLGUuZWZmZWN0cy5yZXN0b3JlKHIsaSksZS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIociksbigpfSl9fSkoalF1ZXJ5KTsoZnVuY3Rpb24oZSx0KXtlLmVmZmVjdHMuZWZmZWN0LmhpZ2hsaWdodD1mdW5jdGlvbih0LG4pe3ZhciByPWUodGhpcyksaT1bImJhY2tncm91bmRJbWFnZSIsImJhY2tncm91bmRDb2xvciIsIm9wYWNpdHkiXSxzPWUuZWZmZWN0cy5zZXRNb2RlKHIsdC5tb2RlfHwic2hvdyIpLG89e2JhY2tncm91bmRDb2xvcjpyLmNzcygiYmFja2dyb3VuZENvbG9yIil9O3M9PT0iaGlkZSImJihvLm9wYWNpdHk9MCksZS5lZmZlY3RzLnNhdmUocixpKSxyLnNob3coKS5jc3Moe2JhY2tncm91bmRJbWFnZToibm9uZSIsYmFja2dyb3VuZENvbG9yOnQuY29sb3J8fCIjZmZmZjk5In0pLmFuaW1hdGUobyx7cXVldWU6ITEsZHVyYXRpb246dC5kdXJhdGlvbixlYXNpbmc6dC5lYXNpbmcsY29tcGxldGU6ZnVuY3Rpb24oKXtzPT09ImhpZGUiJiZyLmhpZGUoKSxlLmVmZmVjdHMucmVzdG9yZShyLGkpLG4oKX19KX19KShqUXVlcnkpOyhmdW5jdGlvbihlLHQpe2UuZWZmZWN0cy5lZmZlY3QucHVsc2F0ZT1mdW5jdGlvbih0LG4pe3ZhciByPWUodGhpcyksaT1lLmVmZmVjdHMuc2V0TW9kZShyLHQubW9kZXx8InNob3ciKSxzPWk9PT0ic2hvdyIsbz1pPT09ImhpZGUiLHU9c3x8aT09PSJoaWRlIixhPSh0LnRpbWVzfHw1KSoyKyh1PzE6MCksZj10LmR1cmF0aW9uL2EsbD0wLGM9ci5xdWV1ZSgpLGg9Yy5sZW5ndGgscDtpZihzfHwhci5pcygiOnZpc2libGUiKSlyLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLGw9MTtmb3IocD0xO3A8YTtwKyspci5hbmltYXRlKHtvcGFjaXR5Omx9LGYsdC5lYXNpbmcpLGw9MS1sO3IuYW5pbWF0ZSh7b3BhY2l0eTpsfSxmLHQuZWFzaW5nKSxyLnF1ZXVlKGZ1bmN0aW9uKCl7byYmci5oaWRlKCksbigpfSksaD4xJiZjLnNwbGljZS5hcHBseShjLFsxLDBdLmNvbmNhdChjLnNwbGljZShoLGErMSkpKSxyLmRlcXVldWUoKX19KShqUXVlcnkpOyhmdW5jdGlvbihlLHQpe2UuZWZmZWN0cy5lZmZlY3QucHVmZj1mdW5jdGlvbih0LG4pe3ZhciByPWUodGhpcyksaT1lLmVmZmVjdHMuc2V0TW9kZShyLHQubW9kZXx8ImhpZGUiKSxzPWk9PT0iaGlkZSIsbz1wYXJzZUludCh0LnBlcmNlbnQsMTApfHwxNTAsdT1vLzEwMCxhPXtoZWlnaHQ6ci5oZWlnaHQoKSx3aWR0aDpyLndpZHRoKCksb3V0ZXJIZWlnaHQ6ci5vdXRlckhlaWdodCgpLG91dGVyV2lkdGg6ci5vdXRlcldpZHRoKCl9O2UuZXh0ZW5kKHQse2VmZmVjdDoic2NhbGUiLHF1ZXVlOiExLGZhZGU6ITAsbW9kZTppLGNvbXBsZXRlOm4scGVyY2VudDpzP286MTAwLGZyb206cz9hOntoZWlnaHQ6YS5oZWlnaHQqdSx3aWR0aDphLndpZHRoKnUsb3V0ZXJIZWlnaHQ6YS5vdXRlckhlaWdodCp1LG91dGVyV2lkdGg6YS5vdXRlcldpZHRoKnV9fSksci5lZmZlY3QodCl9LGUuZWZmZWN0cy5lZmZlY3Quc2NhbGU9ZnVuY3Rpb24odCxuKXt2YXIgcj1lKHRoaXMpLGk9ZS5leHRlbmQoITAse30sdCkscz1lLmVmZmVjdHMuc2V0TW9kZShyLHQubW9kZXx8ImVmZmVjdCIpLG89cGFyc2VJbnQodC5wZXJjZW50LDEwKXx8KHBhcnNlSW50KHQucGVyY2VudCwxMCk9PT0wPzA6cz09PSJoaWRlIj8wOjEwMCksdT10LmRpcmVjdGlvbnx8ImJvdGgiLGE9dC5vcmlnaW4sZj17aGVpZ2h0OnIuaGVpZ2h0KCksd2lkdGg6ci53aWR0aCgpLG91dGVySGVpZ2h0OnIub3V0ZXJIZWlnaHQoKSxvdXRlcldpZHRoOnIub3V0ZXJXaWR0aCgpfSxsPXt5OnUhPT0iaG9yaXpvbnRhbCI/by8xMDA6MSx4OnUhPT0idmVydGljYWwiP28vMTAwOjF9O2kuZWZmZWN0PSJzaXplIixpLnF1ZXVlPSExLGkuY29tcGxldGU9bixzIT09ImVmZmVjdCImJihpLm9yaWdpbj1hfHxbIm1pZGRsZSIsImNlbnRlciJdLGkucmVzdG9yZT0hMCksaS5mcm9tPXQuZnJvbXx8KHM9PT0ic2hvdyI/e2hlaWdodDowLHdpZHRoOjAsb3V0ZXJIZWlnaHQ6MCxvdXRlcldpZHRoOjB9OmYpLGkudG89e2hlaWdodDpmLmhlaWdodCpsLnksd2lkdGg6Zi53aWR0aCpsLngsb3V0ZXJIZWlnaHQ6Zi5vdXRlckhlaWdodCpsLnksb3V0ZXJXaWR0aDpmLm91dGVyV2lkdGgqbC54fSxpLmZhZGUmJihzPT09InNob3ciJiYoaS5mcm9tLm9wYWNpdHk9MCxpLnRvLm9wYWNpdHk9MSkscz09PSJoaWRlIiYmKGkuZnJvbS5vcGFjaXR5PTEsaS50by5vcGFjaXR5PTApKSxyLmVmZmVjdChpKX0sZS5lZmZlY3RzLmVmZmVjdC5zaXplPWZ1bmN0aW9uKHQsbil7dmFyIHIsaSxzLG89ZSh0aGlzKSx1PVsicG9zaXRpb24iLCJ0b3AiLCJib3R0b20iLCJsZWZ0IiwicmlnaHQiLCJ3aWR0aCIsImhlaWdodCIsIm92ZXJmbG93Iiwib3BhY2l0eSJdLGE9WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCIsIm92ZXJmbG93Iiwib3BhY2l0eSJdLGY9WyJ3aWR0aCIsImhlaWdodCIsIm92ZXJmbG93Il0sbD1bImZvbnRTaXplIl0sYz1bImJvcmRlclRvcFdpZHRoIiwiYm9yZGVyQm90dG9tV2lkdGgiLCJwYWRkaW5nVG9wIiwicGFkZGluZ0JvdHRvbSJdLGg9WyJib3JkZXJMZWZ0V2lkdGgiLCJib3JkZXJSaWdodFdpZHRoIiwicGFkZGluZ0xlZnQiLCJwYWRkaW5nUmlnaHQiXSxwPWUuZWZmZWN0cy5zZXRNb2RlKG8sdC5tb2RlfHwiZWZmZWN0IiksZD10LnJlc3RvcmV8fHAhPT0iZWZmZWN0Iix2PXQuc2NhbGV8fCJib3RoIixtPXQub3JpZ2lufHxbIm1pZGRsZSIsImNlbnRlciJdLGc9by5jc3MoInBvc2l0aW9uIikseT1kP3U6YSxiPXtoZWlnaHQ6MCx3aWR0aDowLG91dGVySGVpZ2h0OjAsb3V0ZXJXaWR0aDowfTtwPT09InNob3ciJiZvLnNob3coKSxyPXtoZWlnaHQ6by5oZWlnaHQoKSx3aWR0aDpvLndpZHRoKCksb3V0ZXJIZWlnaHQ6by5vdXRlckhlaWdodCgpLG91dGVyV2lkdGg6by5vdXRlcldpZHRoKCl9LHQubW9kZT09PSJ0b2dnbGUiJiZwPT09InNob3ciPyhvLmZyb209dC50b3x8YixvLnRvPXQuZnJvbXx8cik6KG8uZnJvbT10LmZyb218fChwPT09InNob3ciP2I6ciksby50bz10LnRvfHwocD09PSJoaWRlIj9iOnIpKSxzPXtmcm9tOnt5Om8uZnJvbS5oZWlnaHQvci5oZWlnaHQseDpvLmZyb20ud2lkdGgvci53aWR0aH0sdG86e3k6by50by5oZWlnaHQvci5oZWlnaHQseDpvLnRvLndpZHRoL3Iud2lkdGh9fTtpZih2PT09ImJveCJ8fHY9PT0iYm90aCIpcy5mcm9tLnkhPT1zLnRvLnkmJih5PXkuY29uY2F0KGMpLG8uZnJvbT1lLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihvLGMscy5mcm9tLnksby5mcm9tKSxvLnRvPWUuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKG8sYyxzLnRvLnksby50bykpLHMuZnJvbS54IT09cy50by54JiYoeT15LmNvbmNhdChoKSxvLmZyb209ZS5lZmZlY3RzLnNldFRyYW5zaXRpb24obyxoLHMuZnJvbS54LG8uZnJvbSksby50bz1lLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihvLGgscy50by54LG8udG8pKTsodj09PSJjb250ZW50Inx8dj09PSJib3RoIikmJnMuZnJvbS55IT09cy50by55JiYoeT15LmNvbmNhdChsKS5jb25jYXQoZiksby5mcm9tPWUuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKG8sbCxzLmZyb20ueSxvLmZyb20pLG8udG89ZS5lZmZlY3RzLnNldFRyYW5zaXRpb24obyxsLHMudG8ueSxvLnRvKSksZS5lZmZlY3RzLnNhdmUobyx5KSxvLnNob3coKSxlLmVmZmVjdHMuY3JlYXRlV3JhcHBlcihvKSxvLmNzcygib3ZlcmZsb3ciLCJoaWRkZW4iKS5jc3Moby5mcm9tKSxtJiYoaT1lLmVmZmVjdHMuZ2V0QmFzZWxpbmUobSxyKSxvLmZyb20udG9wPShyLm91dGVySGVpZ2h0LW8ub3V0ZXJIZWlnaHQoKSkqaS55LG8uZnJvbS5sZWZ0PShyLm91dGVyV2lkdGgtby5vdXRlcldpZHRoKCkpKmkueCxvLnRvLnRvcD0oci5vdXRlckhlaWdodC1vLnRvLm91dGVySGVpZ2h0KSppLnksby50by5sZWZ0PShyLm91dGVyV2lkdGgtby50by5vdXRlcldpZHRoKSppLngpLG8uY3NzKG8uZnJvbSk7aWYodj09PSJjb250ZW50Inx8dj09PSJib3RoIiljPWMuY29uY2F0KFsibWFyZ2luVG9wIiwibWFyZ2luQm90dG9tIl0pLmNvbmNhdChsKSxoPWguY29uY2F0KFsibWFyZ2luTGVmdCIsIm1hcmdpblJpZ2h0Il0pLGY9dS5jb25jYXQoYykuY29uY2F0KGgpLG8uZmluZCgiKlt3aWR0aF0iKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIG49ZSh0aGlzKSxyPXtoZWlnaHQ6bi5oZWlnaHQoKSx3aWR0aDpuLndpZHRoKCksb3V0ZXJIZWlnaHQ6bi5vdXRlckhlaWdodCgpLG91dGVyV2lkdGg6bi5vdXRlcldpZHRoKCl9O2QmJmUuZWZmZWN0cy5zYXZlKG4sZiksbi5mcm9tPXtoZWlnaHQ6ci5oZWlnaHQqcy5mcm9tLnksd2lkdGg6ci53aWR0aCpzLmZyb20ueCxvdXRlckhlaWdodDpyLm91dGVySGVpZ2h0KnMuZnJvbS55LG91dGVyV2lkdGg6ci5vdXRlcldpZHRoKnMuZnJvbS54fSxuLnRvPXtoZWlnaHQ6ci5oZWlnaHQqcy50by55LHdpZHRoOnIud2lkdGgqcy50by54LG91dGVySGVpZ2h0OnIuaGVpZ2h0KnMudG8ueSxvdXRlcldpZHRoOnIud2lkdGgqcy50by54fSxzLmZyb20ueSE9PXMudG8ueSYmKG4uZnJvbT1lLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihuLGMscy5mcm9tLnksbi5mcm9tKSxuLnRvPWUuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKG4sYyxzLnRvLnksbi50bykpLHMuZnJvbS54IT09cy50by54JiYobi5mcm9tPWUuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKG4saCxzLmZyb20ueCxuLmZyb20pLG4udG89ZS5lZmZlY3RzLnNldFRyYW5zaXRpb24obixoLHMudG8ueCxuLnRvKSksbi5jc3Mobi5mcm9tKSxuLmFuaW1hdGUobi50byx0LmR1cmF0aW9uLHQuZWFzaW5nLGZ1bmN0aW9uKCl7ZCYmZS5lZmZlY3RzLnJlc3RvcmUobixmKX0pfSk7by5hbmltYXRlKG8udG8se3F1ZXVlOiExLGR1cmF0aW9uOnQuZHVyYXRpb24sZWFzaW5nOnQuZWFzaW5nLGNvbXBsZXRlOmZ1bmN0aW9uKCl7by50by5vcGFjaXR5PT09MCYmby5jc3MoIm9wYWNpdHkiLG8uZnJvbS5vcGFjaXR5KSxwPT09ImhpZGUiJiZvLmhpZGUoKSxlLmVmZmVjdHMucmVzdG9yZShvLHkpLGR8fChnPT09InN0YXRpYyI/by5jc3Moe3Bvc2l0aW9uOiJyZWxhdGl2ZSIsdG9wOm8udG8udG9wLGxlZnQ6by50by5sZWZ0fSk6ZS5lYWNoKFsidG9wIiwibGVmdCJdLGZ1bmN0aW9uKGUsdCl7by5jc3ModCxmdW5jdGlvbih0LG4pe3ZhciByPXBhcnNlSW50KG4sMTApLGk9ZT9vLnRvLmxlZnQ6by50by50b3A7cmV0dXJuIG49PT0iYXV0byI/aSsicHgiOnIraSsicHgifSl9KSksZS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIobyksbigpfX0pfX0pKGpRdWVyeSk7KGZ1bmN0aW9uKGUsdCl7ZS5lZmZlY3RzLmVmZmVjdC5zaGFrZT1mdW5jdGlvbih0LG4pe3ZhciByPWUodGhpcyksaT1bInBvc2l0aW9uIiwidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0IiwiaGVpZ2h0Iiwid2lkdGgiXSxzPWUuZWZmZWN0cy5zZXRNb2RlKHIsdC5tb2RlfHwiZWZmZWN0Iiksbz10LmRpcmVjdGlvbnx8ImxlZnQiLHU9dC5kaXN0YW5jZXx8MjAsYT10LnRpbWVzfHwzLGY9YSoyKzEsbD1NYXRoLnJvdW5kKHQuZHVyYXRpb24vZiksYz1vPT09InVwInx8bz09PSJkb3duIj8idG9wIjoibGVmdCIsaD1vPT09InVwInx8bz09PSJsZWZ0IixwPXt9LGQ9e30sdj17fSxtLGc9ci5xdWV1ZSgpLHk9Zy5sZW5ndGg7ZS5lZmZlY3RzLnNhdmUocixpKSxyLnNob3coKSxlLmVmZmVjdHMuY3JlYXRlV3JhcHBlcihyKSxwW2NdPShoPyItPSI6Iis9IikrdSxkW2NdPShoPyIrPSI6Ii09IikrdSoyLHZbY109KGg/Ii09IjoiKz0iKSt1KjIsci5hbmltYXRlKHAsbCx0LmVhc2luZyk7Zm9yKG09MTttPGE7bSsrKXIuYW5pbWF0ZShkLGwsdC5lYXNpbmcpLmFuaW1hdGUodixsLHQuZWFzaW5nKTtyLmFuaW1hdGUoZCxsLHQuZWFzaW5nKS5hbmltYXRlKHAsbC8yLHQuZWFzaW5nKS5xdWV1ZShmdW5jdGlvbigpe3M9PT0iaGlkZSImJnIuaGlkZSgpLGUuZWZmZWN0cy5yZXN0b3JlKHIsaSksZS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIociksbigpfSkseT4xJiZnLnNwbGljZS5hcHBseShnLFsxLDBdLmNvbmNhdChnLnNwbGljZSh5LGYrMSkpKSxyLmRlcXVldWUoKX19KShqUXVlcnkpOyhmdW5jdGlvbihlLHQpe2UuZWZmZWN0cy5lZmZlY3Quc2xpZGU9ZnVuY3Rpb24odCxuKXt2YXIgcj1lKHRoaXMpLGk9WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCIsIndpZHRoIiwiaGVpZ2h0Il0scz1lLmVmZmVjdHMuc2V0TW9kZShyLHQubW9kZXx8InNob3ciKSxvPXM9PT0ic2hvdyIsdT10LmRpcmVjdGlvbnx8ImxlZnQiLGE9dT09PSJ1cCJ8fHU9PT0iZG93biI/InRvcCI6ImxlZnQiLGY9dT09PSJ1cCJ8fHU9PT0ibGVmdCIsbCxjPXt9O2UuZWZmZWN0cy5zYXZlKHIsaSksci5zaG93KCksbD10LmRpc3RhbmNlfHxyW2E9PT0idG9wIj8ib3V0ZXJIZWlnaHQiOiJvdXRlcldpZHRoIl0oITApLGUuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKHIpLmNzcyh7b3ZlcmZsb3c6ImhpZGRlbiJ9KSxvJiZyLmNzcyhhLGY/aXNOYU4obCk/Ii0iK2w6LWw6bCksY1thXT0obz9mPyIrPSI6Ii09IjpmPyItPSI6Iis9IikrbCxyLmFuaW1hdGUoYyx7cXVldWU6ITEsZHVyYXRpb246dC5kdXJhdGlvbixlYXNpbmc6dC5lYXNpbmcsY29tcGxldGU6ZnVuY3Rpb24oKXtzPT09ImhpZGUiJiZyLmhpZGUoKSxlLmVmZmVjdHMucmVzdG9yZShyLGkpLGUuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKHIpLG4oKX19KX19KShqUXVlcnkpOyhmdW5jdGlvbihlLHQpe2UuZWZmZWN0cy5lZmZlY3QudHJhbnNmZXI9ZnVuY3Rpb24odCxuKXt2YXIgcj1lKHRoaXMpLGk9ZSh0LnRvKSxzPWkuY3NzKCJwb3NpdGlvbiIpPT09ImZpeGVkIixvPWUoImJvZHkiKSx1PXM/by5zY3JvbGxUb3AoKTowLGE9cz9vLnNjcm9sbExlZnQoKTowLGY9aS5vZmZzZXQoKSxsPXt0b3A6Zi50b3AtdSxsZWZ0OmYubGVmdC1hLGhlaWdodDppLmlubmVySGVpZ2h0KCksd2lkdGg6aS5pbm5lcldpZHRoKCl9LGM9ci5vZmZzZXQoKSxoPWUoJzxkaXYgY2xhc3M9InVpLWVmZmVjdHMtdHJhbnNmZXIiPjwvZGl2PicpLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpLmFkZENsYXNzKHQuY2xhc3NOYW1lKS5jc3Moe3RvcDpjLnRvcC11LGxlZnQ6Yy5sZWZ0LWEsaGVpZ2h0OnIuaW5uZXJIZWlnaHQoKSx3aWR0aDpyLmlubmVyV2lkdGgoKSxwb3NpdGlvbjpzPyJmaXhlZCI6ImFic29sdXRlIn0pLmFuaW1hdGUobCx0LmR1cmF0aW9uLHQuZWFzaW5nLGZ1bmN0aW9uKCl7aC5yZW1vdmUoKSxuKCl9KX19KShqUXVlcnkpOw==]]></data>
	</file>
	<file>
	  <filename>/lib/js/jquery.jeditable.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCQpeyQuZm4uZWRpdGFibGU9ZnVuY3Rpb24odGFyZ2V0LG9wdGlvbnMpe2lmKCdkaXNhYmxlJz09dGFyZ2V0KXskKHRoaXMpLmRhdGEoJ2Rpc2FibGVkLmVkaXRhYmxlJyx0cnVlKTtyZXR1cm47fQppZignZW5hYmxlJz09dGFyZ2V0KXskKHRoaXMpLmRhdGEoJ2Rpc2FibGVkLmVkaXRhYmxlJyxmYWxzZSk7cmV0dXJuO30KaWYoJ2Rlc3Ryb3knPT10YXJnZXQpeyQodGhpcykudW5iaW5kKCQodGhpcykuZGF0YSgnZXZlbnQuZWRpdGFibGUnKSkucmVtb3ZlRGF0YSgnZGlzYWJsZWQuZWRpdGFibGUnKS5yZW1vdmVEYXRhKCdldmVudC5lZGl0YWJsZScpO3JldHVybjt9CnZhciBzZXR0aW5ncz0kLmV4dGVuZCh7fSwkLmZuLmVkaXRhYmxlLmRlZmF1bHRzLHt0YXJnZXQ6dGFyZ2V0fSxvcHRpb25zKTt2YXIgcGx1Z2luPSQuZWRpdGFibGUudHlwZXNbc2V0dGluZ3MudHlwZV0ucGx1Z2lufHxmdW5jdGlvbigpe307dmFyIHN1Ym1pdD0kLmVkaXRhYmxlLnR5cGVzW3NldHRpbmdzLnR5cGVdLnN1Ym1pdHx8ZnVuY3Rpb24oKXt9O3ZhciBidXR0b25zPSQuZWRpdGFibGUudHlwZXNbc2V0dGluZ3MudHlwZV0uYnV0dG9uc3x8JC5lZGl0YWJsZS50eXBlc1snZGVmYXVsdHMnXS5idXR0b25zO3ZhciBjb250ZW50PSQuZWRpdGFibGUudHlwZXNbc2V0dGluZ3MudHlwZV0uY29udGVudHx8JC5lZGl0YWJsZS50eXBlc1snZGVmYXVsdHMnXS5jb250ZW50O3ZhciBlbGVtZW50PSQuZWRpdGFibGUudHlwZXNbc2V0dGluZ3MudHlwZV0uZWxlbWVudHx8JC5lZGl0YWJsZS50eXBlc1snZGVmYXVsdHMnXS5lbGVtZW50O3ZhciByZXNldD0kLmVkaXRhYmxlLnR5cGVzW3NldHRpbmdzLnR5cGVdLnJlc2V0fHwkLmVkaXRhYmxlLnR5cGVzWydkZWZhdWx0cyddLnJlc2V0O3ZhciBjYWxsYmFjaz1zZXR0aW5ncy5jYWxsYmFja3x8ZnVuY3Rpb24oKXt9O3ZhciBvbmVkaXQ9c2V0dGluZ3Mub25lZGl0fHxmdW5jdGlvbigpe307dmFyIG9uc3VibWl0PXNldHRpbmdzLm9uc3VibWl0fHxmdW5jdGlvbigpe307dmFyIG9ucmVzZXQ9c2V0dGluZ3Mub25yZXNldHx8ZnVuY3Rpb24oKXt9O3ZhciBvbmVycm9yPXNldHRpbmdzLm9uZXJyb3J8fHJlc2V0O2lmKHNldHRpbmdzLnRvb2x0aXApeyQodGhpcykuYXR0cigndGl0bGUnLHNldHRpbmdzLnRvb2x0aXApO30Kc2V0dGluZ3MuYXV0b3dpZHRoPSdhdXRvJz09c2V0dGluZ3Mud2lkdGg7c2V0dGluZ3MuYXV0b2hlaWdodD0nYXV0byc9PXNldHRpbmdzLmhlaWdodDtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHNlbGY9dGhpczt2YXIgc2F2ZWR3aWR0aD0kKHNlbGYpLndpZHRoKCk7dmFyIHNhdmVkaGVpZ2h0PSQoc2VsZikuaGVpZ2h0KCk7JCh0aGlzKS5kYXRhKCdldmVudC5lZGl0YWJsZScsc2V0dGluZ3MuZXZlbnQpO2lmKCEkLnRyaW0oJCh0aGlzKS5odG1sKCkpKXskKHRoaXMpLmh0bWwoc2V0dGluZ3MucGxhY2Vob2xkZXIpO30KJCh0aGlzKS5iaW5kKHNldHRpbmdzLmV2ZW50LGZ1bmN0aW9uKGUpe2lmKHRydWU9PT0kKHRoaXMpLmRhdGEoJ2Rpc2FibGVkLmVkaXRhYmxlJykpe3JldHVybjt9CmlmKHNlbGYuZWRpdGluZyl7cmV0dXJuO30KaWYoZmFsc2U9PT1vbmVkaXQuYXBwbHkodGhpcyxbc2V0dGluZ3Msc2VsZl0pKXtyZXR1cm47fQplLnByZXZlbnREZWZhdWx0KCk7ZS5zdG9wUHJvcGFnYXRpb24oKTtpZihzZXR0aW5ncy50b29sdGlwKXskKHNlbGYpLnJlbW92ZUF0dHIoJ3RpdGxlJyk7fQppZigwPT0kKHNlbGYpLndpZHRoKCkpe3NldHRpbmdzLndpZHRoPXNhdmVkd2lkdGg7c2V0dGluZ3MuaGVpZ2h0PXNhdmVkaGVpZ2h0O31lbHNle2lmKHNldHRpbmdzLndpZHRoIT0nbm9uZScpe3NldHRpbmdzLndpZHRoPXNldHRpbmdzLmF1dG93aWR0aD8kKHNlbGYpLndpZHRoKCk6c2V0dGluZ3Mud2lkdGg7fQppZihzZXR0aW5ncy5oZWlnaHQhPSdub25lJyl7c2V0dGluZ3MuaGVpZ2h0PXNldHRpbmdzLmF1dG9oZWlnaHQ/JChzZWxmKS5oZWlnaHQoKTpzZXR0aW5ncy5oZWlnaHQ7fX0KaWYoJCh0aGlzKS5odG1sKCkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC8oO3wiKS9nLCcnKT09c2V0dGluZ3MucGxhY2Vob2xkZXIudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC8oO3wiKS9nLCcnKSl7JCh0aGlzKS5odG1sKCcnKTt9CnNlbGYuZWRpdGluZz10cnVlO3NlbGYucmV2ZXJ0PSQoc2VsZikuaHRtbCgpOyQoc2VsZikuaHRtbCgnJyk7dmFyIGZvcm09JCgnPGZvcm0gLz4nKTtpZihzZXR0aW5ncy5jc3NjbGFzcyl7aWYoJ2luaGVyaXQnPT1zZXR0aW5ncy5jc3NjbGFzcyl7Zm9ybS5hdHRyKCdjbGFzcycsJChzZWxmKS5hdHRyKCdjbGFzcycpKTt9ZWxzZXtmb3JtLmF0dHIoJ2NsYXNzJyxzZXR0aW5ncy5jc3NjbGFzcyk7fX0KaWYoc2V0dGluZ3Muc3R5bGUpe2lmKCdpbmhlcml0Jz09c2V0dGluZ3Muc3R5bGUpe2Zvcm0uYXR0cignc3R5bGUnLCQoc2VsZikuYXR0cignc3R5bGUnKSk7Zm9ybS5jc3MoJ2Rpc3BsYXknLCQoc2VsZikuY3NzKCdkaXNwbGF5JykpO31lbHNle2Zvcm0uYXR0cignc3R5bGUnLHNldHRpbmdzLnN0eWxlKTt9fQp2YXIgaW5wdXQ9ZWxlbWVudC5hcHBseShmb3JtLFtzZXR0aW5ncyxzZWxmXSk7dmFyIGlucHV0X2NvbnRlbnQ7aWYoc2V0dGluZ3MubG9hZHVybCl7dmFyIHQ9c2V0VGltZW91dChmdW5jdGlvbigpe2lucHV0LmRpc2FibGVkPXRydWU7Y29udGVudC5hcHBseShmb3JtLFtzZXR0aW5ncy5sb2FkdGV4dCxzZXR0aW5ncyxzZWxmXSk7fSwxMDApO3ZhciBsb2FkZGF0YT17fTtsb2FkZGF0YVtzZXR0aW5ncy5pZF09c2VsZi5pZDtpZigkLmlzRnVuY3Rpb24oc2V0dGluZ3MubG9hZGRhdGEpKXskLmV4dGVuZChsb2FkZGF0YSxzZXR0aW5ncy5sb2FkZGF0YS5hcHBseShzZWxmLFtzZWxmLnJldmVydCxzZXR0aW5nc10pKTt9ZWxzZXskLmV4dGVuZChsb2FkZGF0YSxzZXR0aW5ncy5sb2FkZGF0YSk7fQokLmFqYXgoe3R5cGU6c2V0dGluZ3MubG9hZHR5cGUsdXJsOnNldHRpbmdzLmxvYWR1cmwsZGF0YTpsb2FkZGF0YSxhc3luYzpmYWxzZSxzdWNjZXNzOmZ1bmN0aW9uKHJlc3VsdCl7d2luZG93LmNsZWFyVGltZW91dCh0KTtpbnB1dF9jb250ZW50PXJlc3VsdDtpbnB1dC5kaXNhYmxlZD1mYWxzZTt9fSk7fWVsc2UgaWYoc2V0dGluZ3MuZGF0YSl7aW5wdXRfY29udGVudD1zZXR0aW5ncy5kYXRhO2lmKCQuaXNGdW5jdGlvbihzZXR0aW5ncy5kYXRhKSl7aW5wdXRfY29udGVudD1zZXR0aW5ncy5kYXRhLmFwcGx5KHNlbGYsW3NlbGYucmV2ZXJ0LHNldHRpbmdzXSk7fX1lbHNle2lucHV0X2NvbnRlbnQ9c2VsZi5yZXZlcnQ7fQpjb250ZW50LmFwcGx5KGZvcm0sW2lucHV0X2NvbnRlbnQsc2V0dGluZ3Msc2VsZl0pO2lucHV0LmF0dHIoJ25hbWUnLHNldHRpbmdzLm5hbWUpO2J1dHRvbnMuYXBwbHkoZm9ybSxbc2V0dGluZ3Msc2VsZl0pOyQoc2VsZikuYXBwZW5kKGZvcm0pO3BsdWdpbi5hcHBseShmb3JtLFtzZXR0aW5ncyxzZWxmXSk7JCgnOmlucHV0OnZpc2libGU6ZW5hYmxlZDpmaXJzdCcsZm9ybSkuZm9jdXMoKTtpZihzZXR0aW5ncy5zZWxlY3Qpe2lucHV0LnNlbGVjdCgpO30KaW5wdXQua2V5ZG93bihmdW5jdGlvbihlKXtpZihlLmtleUNvZGU9PTI3KXtlLnByZXZlbnREZWZhdWx0KCk7cmVzZXQuYXBwbHkoZm9ybSxbc2V0dGluZ3Msc2VsZl0pO319KTt2YXIgdDtpZignY2FuY2VsJz09c2V0dGluZ3Mub25ibHVyKXtpbnB1dC5ibHVyKGZ1bmN0aW9uKGUpe3Q9c2V0VGltZW91dChmdW5jdGlvbigpe3Jlc2V0LmFwcGx5KGZvcm0sW3NldHRpbmdzLHNlbGZdKTt9LDUwMCk7fSk7fWVsc2UgaWYoJ3N1Ym1pdCc9PXNldHRpbmdzLm9uYmx1cil7aW5wdXQuYmx1cihmdW5jdGlvbihlKXt0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtmb3JtLnN1Ym1pdCgpO30sMjAwKTt9KTt9ZWxzZSBpZigkLmlzRnVuY3Rpb24oc2V0dGluZ3Mub25ibHVyKSl7aW5wdXQuYmx1cihmdW5jdGlvbihlKXtzZXR0aW5ncy5vbmJsdXIuYXBwbHkoc2VsZixbaW5wdXQudmFsKCksc2V0dGluZ3NdKTt9KTt9ZWxzZXtpbnB1dC5ibHVyKGZ1bmN0aW9uKGUpe30pO30KZm9ybS5zdWJtaXQoZnVuY3Rpb24oZSl7aWYodCl7Y2xlYXJUaW1lb3V0KHQpO30KZS5wcmV2ZW50RGVmYXVsdCgpO2lmKGZhbHNlIT09b25zdWJtaXQuYXBwbHkoZm9ybSxbc2V0dGluZ3Msc2VsZl0pKXtpZihmYWxzZSE9PXN1Ym1pdC5hcHBseShmb3JtLFtzZXR0aW5ncyxzZWxmXSkpe2lmKCQuaXNGdW5jdGlvbihzZXR0aW5ncy50YXJnZXQpKXt2YXIgc3RyPXNldHRpbmdzLnRhcmdldC5hcHBseShzZWxmLFtpbnB1dC52YWwoKSxzZXR0aW5nc10pOyQoc2VsZikuaHRtbChzdHIpO3NlbGYuZWRpdGluZz1mYWxzZTtjYWxsYmFjay5hcHBseShzZWxmLFtzZWxmLmlubmVySFRNTCxzZXR0aW5nc10pO2lmKCEkLnRyaW0oJChzZWxmKS5odG1sKCkpKXskKHNlbGYpLmh0bWwoc2V0dGluZ3MucGxhY2Vob2xkZXIpO319ZWxzZXt2YXIgc3VibWl0ZGF0YT17fTtzdWJtaXRkYXRhW3NldHRpbmdzLm5hbWVdPWlucHV0LnZhbCgpO3N1Ym1pdGRhdGFbc2V0dGluZ3MuaWRdPXNlbGYuaWQ7aWYoJC5pc0Z1bmN0aW9uKHNldHRpbmdzLnN1Ym1pdGRhdGEpKXskLmV4dGVuZChzdWJtaXRkYXRhLHNldHRpbmdzLnN1Ym1pdGRhdGEuYXBwbHkoc2VsZixbc2VsZi5yZXZlcnQsc2V0dGluZ3NdKSk7fWVsc2V7JC5leHRlbmQoc3VibWl0ZGF0YSxzZXR0aW5ncy5zdWJtaXRkYXRhKTt9CmlmKCdQVVQnPT1zZXR0aW5ncy5tZXRob2Qpe3N1Ym1pdGRhdGFbJ19tZXRob2QnXT0ncHV0Jzt9CiQoc2VsZikuaHRtbChzZXR0aW5ncy5pbmRpY2F0b3IpO3ZhciBhamF4b3B0aW9ucz17dHlwZTonUE9TVCcsZGF0YTpzdWJtaXRkYXRhLGRhdGFUeXBlOidodG1sJyx1cmw6c2V0dGluZ3MudGFyZ2V0LHN1Y2Nlc3M6ZnVuY3Rpb24ocmVzdWx0LHN0YXR1cyl7aWYoYWpheG9wdGlvbnMuZGF0YVR5cGU9PSdodG1sJyl7JChzZWxmKS5odG1sKHJlc3VsdCk7fQpzZWxmLmVkaXRpbmc9ZmFsc2U7Y2FsbGJhY2suYXBwbHkoc2VsZixbcmVzdWx0LHNldHRpbmdzXSk7aWYoISQudHJpbSgkKHNlbGYpLmh0bWwoKSkpeyQoc2VsZikuaHRtbChzZXR0aW5ncy5wbGFjZWhvbGRlcik7fX0sZXJyb3I6ZnVuY3Rpb24oeGhyLHN0YXR1cyxlcnJvcil7b25lcnJvci5hcHBseShmb3JtLFtzZXR0aW5ncyxzZWxmLHhocl0pO319OyQuZXh0ZW5kKGFqYXhvcHRpb25zLHNldHRpbmdzLmFqYXhvcHRpb25zKTskLmFqYXgoYWpheG9wdGlvbnMpO319fQokKHNlbGYpLmF0dHIoJ3RpdGxlJyxzZXR0aW5ncy50b29sdGlwKTtyZXR1cm4gZmFsc2U7fSk7fSk7dGhpcy5yZXNldD1mdW5jdGlvbihmb3JtKXtpZih0aGlzLmVkaXRpbmcpe2lmKGZhbHNlIT09b25yZXNldC5hcHBseShmb3JtLFtzZXR0aW5ncyxzZWxmXSkpeyQoc2VsZikuaHRtbChzZWxmLnJldmVydCk7c2VsZi5lZGl0aW5nPWZhbHNlO2lmKCEkLnRyaW0oJChzZWxmKS5odG1sKCkpKXskKHNlbGYpLmh0bWwoc2V0dGluZ3MucGxhY2Vob2xkZXIpO30KaWYoc2V0dGluZ3MudG9vbHRpcCl7JChzZWxmKS5hdHRyKCd0aXRsZScsc2V0dGluZ3MudG9vbHRpcCk7fX19fTt9KTt9OyQuZWRpdGFibGU9e3R5cGVzOntkZWZhdWx0czp7ZWxlbWVudDpmdW5jdGlvbihzZXR0aW5ncyxvcmlnaW5hbCl7dmFyIGlucHV0PSQoJzxpbnB1dCB0eXBlPSJoaWRkZW4iPjwvaW5wdXQ+Jyk7JCh0aGlzKS5hcHBlbmQoaW5wdXQpO3JldHVybihpbnB1dCk7fSxjb250ZW50OmZ1bmN0aW9uKHN0cmluZyxzZXR0aW5ncyxvcmlnaW5hbCl7JCgnOmlucHV0OmZpcnN0Jyx0aGlzKS52YWwoc3RyaW5nKTt9LHJlc2V0OmZ1bmN0aW9uKHNldHRpbmdzLG9yaWdpbmFsKXtvcmlnaW5hbC5yZXNldCh0aGlzKTt9LGJ1dHRvbnM6ZnVuY3Rpb24oc2V0dGluZ3Msb3JpZ2luYWwpe3ZhciBmb3JtPXRoaXM7aWYoc2V0dGluZ3Muc3VibWl0KXtpZihzZXR0aW5ncy5zdWJtaXQubWF0Y2goLz4kLykpe3ZhciBzdWJtaXQ9JChzZXR0aW5ncy5zdWJtaXQpLmNsaWNrKGZ1bmN0aW9uKCl7aWYoc3VibWl0LmF0dHIoInR5cGUiKSE9InN1Ym1pdCIpe2Zvcm0uc3VibWl0KCk7fX0pO31lbHNle3ZhciBzdWJtaXQ9JCgnPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIC8+Jyk7c3VibWl0Lmh0bWwoc2V0dGluZ3Muc3VibWl0KTt9CiQodGhpcykuYXBwZW5kKHN1Ym1pdCk7fQppZihzZXR0aW5ncy5jYW5jZWwpe2lmKHNldHRpbmdzLmNhbmNlbC5tYXRjaCgvPiQvKSl7dmFyIGNhbmNlbD0kKHNldHRpbmdzLmNhbmNlbCk7fWVsc2V7dmFyIGNhbmNlbD0kKCc8YnV0dG9uIHR5cGU9ImNhbmNlbCIgLz4nKTtjYW5jZWwuaHRtbChzZXR0aW5ncy5jYW5jZWwpO30KJCh0aGlzKS5hcHBlbmQoY2FuY2VsKTskKGNhbmNlbCkuY2xpY2soZnVuY3Rpb24oZXZlbnQpe2lmKCQuaXNGdW5jdGlvbigkLmVkaXRhYmxlLnR5cGVzW3NldHRpbmdzLnR5cGVdLnJlc2V0KSl7dmFyIHJlc2V0PSQuZWRpdGFibGUudHlwZXNbc2V0dGluZ3MudHlwZV0ucmVzZXQ7fWVsc2V7dmFyIHJlc2V0PSQuZWRpdGFibGUudHlwZXNbJ2RlZmF1bHRzJ10ucmVzZXQ7fQpyZXNldC5hcHBseShmb3JtLFtzZXR0aW5ncyxvcmlnaW5hbF0pO3JldHVybiBmYWxzZTt9KTt9fX0sdGV4dDp7ZWxlbWVudDpmdW5jdGlvbihzZXR0aW5ncyxvcmlnaW5hbCl7dmFyIGlucHV0PSQoJzxpbnB1dCAvPicpO2lmKHNldHRpbmdzLndpZHRoIT0nbm9uZScpe2lucHV0LndpZHRoKHNldHRpbmdzLndpZHRoKTt9CmlmKHNldHRpbmdzLmhlaWdodCE9J25vbmUnKXtpbnB1dC5oZWlnaHQoc2V0dGluZ3MuaGVpZ2h0KTt9CmlucHV0LmF0dHIoJ2F1dG9jb21wbGV0ZScsJ29mZicpOyQodGhpcykuYXBwZW5kKGlucHV0KTtyZXR1cm4oaW5wdXQpO319LHRleHRhcmVhOntlbGVtZW50OmZ1bmN0aW9uKHNldHRpbmdzLG9yaWdpbmFsKXt2YXIgdGV4dGFyZWE9JCgnPHRleHRhcmVhIC8+Jyk7aWYoc2V0dGluZ3Mucm93cyl7dGV4dGFyZWEuYXR0cigncm93cycsc2V0dGluZ3Mucm93cyk7fWVsc2UgaWYoc2V0dGluZ3MuaGVpZ2h0IT0ibm9uZSIpe3RleHRhcmVhLmhlaWdodChzZXR0aW5ncy5oZWlnaHQpO30KaWYoc2V0dGluZ3MuY29scyl7dGV4dGFyZWEuYXR0cignY29scycsc2V0dGluZ3MuY29scyk7fWVsc2UgaWYoc2V0dGluZ3Mud2lkdGghPSJub25lIil7dGV4dGFyZWEud2lkdGgoc2V0dGluZ3Mud2lkdGgpO30KJCh0aGlzKS5hcHBlbmQodGV4dGFyZWEpO3JldHVybih0ZXh0YXJlYSk7fX0sc2VsZWN0OntlbGVtZW50OmZ1bmN0aW9uKHNldHRpbmdzLG9yaWdpbmFsKXt2YXIgc2VsZWN0PSQoJzxzZWxlY3QgLz4nKTskKHRoaXMpLmFwcGVuZChzZWxlY3QpO3JldHVybihzZWxlY3QpO30sY29udGVudDpmdW5jdGlvbihkYXRhLHNldHRpbmdzLG9yaWdpbmFsKXtpZihTdHJpbmc9PWRhdGEuY29uc3RydWN0b3Ipe2V2YWwoJ3ZhciBqc29uID0gJytkYXRhKTt9ZWxzZXt2YXIganNvbj1kYXRhO30KZm9yKHZhciBrZXkgaW4ganNvbil7aWYoIWpzb24uaGFzT3duUHJvcGVydHkoa2V5KSl7Y29udGludWU7fQppZignc2VsZWN0ZWQnPT1rZXkpe2NvbnRpbnVlO30KdmFyIG9wdGlvbj0kKCc8b3B0aW9uIC8+JykudmFsKGtleSkuYXBwZW5kKGpzb25ba2V5XSk7JCgnc2VsZWN0Jyx0aGlzKS5hcHBlbmQob3B0aW9uKTt9CiQoJ3NlbGVjdCcsdGhpcykuY2hpbGRyZW4oKS5lYWNoKGZ1bmN0aW9uKCl7aWYoJCh0aGlzKS52YWwoKT09anNvblsnc2VsZWN0ZWQnXXx8JCh0aGlzKS50ZXh0KCk9PSQudHJpbShvcmlnaW5hbC5yZXZlcnQpKXskKHRoaXMpLmF0dHIoJ3NlbGVjdGVkJywnc2VsZWN0ZWQnKTt9fSk7fX19LGFkZElucHV0VHlwZTpmdW5jdGlvbihuYW1lLGlucHV0KXskLmVkaXRhYmxlLnR5cGVzW25hbWVdPWlucHV0O319OyQuZm4uZWRpdGFibGUuZGVmYXVsdHM9e25hbWU6J3ZhbHVlJyxpZDonaWQnLHR5cGU6J3RleHQnLHdpZHRoOidhdXRvJyxoZWlnaHQ6J2F1dG8nLGV2ZW50OidjbGljay5lZGl0YWJsZScsb25ibHVyOidjYW5jZWwnLGxvYWR0eXBlOidHRVQnLGxvYWR0ZXh0OidMb2FkaW5nLi4uJyxwbGFjZWhvbGRlcjonQ2xpY2sgdG8gZWRpdCcsbG9hZGRhdGE6e30sc3VibWl0ZGF0YTp7fSxhamF4b3B0aW9uczp7fX07fSkoalF1ZXJ5KTs=]]></data>
	</file>
	<file>
	  <filename>/MCMedias.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IE1DTWVkaWFzIC0gTXVsdGlwbGUgZmlsZXMgJiBpbWFnZXMgZmllbGRzIGZvciBDTVNGb3JtcwojIFZlcnNpb246IDAuMC4zLCBKZWFuLUNocmlzdG9waGUgQ3V2ZWxpZXIKIwoKY2xhc3MgTUNNZWRpYXMgZXh0ZW5kcyBDTVNNb2R1bGUKewoKICB2YXIgJGpxdWVyeV9sb2FkZWQgPSBmYWxzZTsKICAKICBwdWJsaWMgc3RhdGljICRmcm9udGVuZF90ZW1wbGF0ZXMgPSBhcnJheSgKICAgICAgJ2RlZmF1bHQnICAgICA9PiAnZGVmYXVsdCcKICAgICk7CiAgCgogIHB1YmxpYyBmdW5jdGlvbiBHZXROYW1lKCkgICAgICAgICAgICAgeyByZXR1cm4gJ01DTWVkaWFzJzsgfQogIHB1YmxpYyBmdW5jdGlvbiBHZXRGcmllbmRseU5hbWUoKSAgICAgeyByZXR1cm4gJ00mQyBNZWRpYXMnOyB9CiAgcHVibGljIGZ1bmN0aW9uIEdldFZlcnNpb24oKSAgICAgICAgICB7IHJldHVybiAnMS4wLjEwJzsgfQogIHB1YmxpYyBmdW5jdGlvbiBHZXRIZWxwKCkgICAgICAgICAgICAgeyByZXR1cm4gJHRoaXMtPkxhbmcoJ2hlbHAnKTsgfQogIHB1YmxpYyBmdW5jdGlvbiBHZXRBdXRob3IoKSAgICAgICAgICAgeyByZXR1cm4gJ0plYW4tQ2hyaXN0b3BoZSBDdXZlbGllcic7ICB9CiAgcHVibGljIGZ1bmN0aW9uIEdldEF1dGhvckVtYWlsKCkgICAgICB7IHJldHVybiAnamNjQG1vcnJpcy1jaGFwbWFuLmNvbSc7ICB9CiAgLy8gcHVibGljIGZ1bmN0aW9uIEdldENoYW5nZUxvZygpICAgICAgICB7IHJldHVybiAkdGhpcy0+TGFuZygnY2hhbmdlbG9nJyk7ICAgIH0KICBwdWJsaWMgZnVuY3Rpb24gSXNQbHVnaW5Nb2R1bGUoKSAgICAgIHsgcmV0dXJuIHRydWU7ICB9CiAgcHVibGljIGZ1bmN0aW9uIEhhc0FkbWluKCkgICAgICAgICAgICB7IHJldHVybiB0cnVlOyAgfQogIHB1YmxpYyBmdW5jdGlvbiBHZXRBZG1pblNlY3Rpb24oKSAgICAgeyByZXR1cm4gJ2V4dGVuc2lvbnMnOyAgfQogIC8vIHB1YmxpYyBmdW5jdGlvbiBHZXRBZG1pbkRlc2NyaXB0aW9uKCkgICB7IHJldHVybiAkdGhpcy0+TGFuZygnYWRtaW5kZXNjcmlwdGlvbicpOyB9CiAgcHVibGljIGZ1bmN0aW9uIFZpc2libGVUb0FkbWluVXNlcigpICAgICB7IHJldHVybiAkdGhpcy0+Q2hlY2tBY2Nlc3MoJ01hbmFnZSBNQyBNZWRpYXMnKTsgIH0KICBwdWJsaWMgZnVuY3Rpb24gQ2hlY2tBY2Nlc3MoJHBlcm0gPSAnTWFuYWdlIE1DTWVkaWFzJykgIHsgcmV0dXJuICR0aGlzLT5DaGVja1Blcm1pc3Npb24oJHBlcm0pOyAgfQoKICBwdWJsaWMgZnVuY3Rpb24gR2V0RGVwZW5kZW5jaWVzKCkgICAgIHsgcmV0dXJuIGFycmF5KCdDTVNGb3JtcycgPT4gJzEuMC4zJyk7ICB9CiAgcHVibGljIGZ1bmN0aW9uIE1pbmltdW1DTVNWZXJzaW9uKCkgICB7IHJldHVybiAiMS4xMCI7ICB9CgogIC8vIGZ1bmN0aW9uIEluc3RhbGxQb3N0TWVzc2FnZSgpICAgIHsgcmV0dXJuICR0aGlzLT5MYW5nKCdwb3N0aW5zdGFsbCcpOyAgfQogIC8vIGZ1bmN0aW9uIFVuaW5zdGFsbFBvc3RNZXNzYWdlKCkgICAgeyByZXR1cm4gJHRoaXMtPkxhbmcoJ3Bvc3R1bmluc3RhbGwnKTsgIH0KICAvLyBmdW5jdGlvbiBVbmluc3RhbGxQcmVNZXNzYWdlKCkgICB7IHJldHVybiAkdGhpcy0+TGFuZygncmVhbGx5X3VuaW5zdGFsbCcpOyB9CiAgZnVuY3Rpb24gU2V0UGFyYW1ldGVycygpICAgICB7ICAgJHRoaXMtPkluaXRpYWxpemVHbG9iYWwoKTsgIH0KICAKICBmdW5jdGlvbiBJbml0aWFsaXplR2xvYmFsKCkgeyAgCiAgICAkdGhpcy0+UmVnaXN0ZXJNb2R1bGVQbHVnaW4oKTsKICAgIAogICAgJHRoaXMtPnNtYXJ0eS0+cmVnaXN0ZXJfZnVuY3Rpb24oJ1RodW1ibmFpbCcsICBhcnJheSgnTUNNZWRpYXMnLCd0aHVtYm5haWwnKSk7CiAgICAKICAgICR0aGlzLT5SZWdpc3RlclJvdXRlKCcvbWNtZWRpYXNcL2FwaVwvKD9QPGNvbW1hbmQ+W2EtekEtWjAtOV8tXSspKFwvLio/KT8kLycsIGFycmF5KCdhY3Rpb24nID0+ICdhcGknLCAnc2hvd3RlbXBsYXRlJyA9PiAnZmFsc2UnLCdyZXR1cm5pZCcgPT4gY21zbXMoKS0+R2V0Q29udGVudE9wZXJhdGlvbnMoKS0+R2V0RGVmYXVsdFBhZ2VJRCgpKSk7CgogICAgJHRoaXMtPlJlZ2lzdGVyUm91dGUoJy9tY21lZGlhc1wvc3luY1wvKD9QPGNvbW1hbmQ+W2EtekEtWjAtOV8tXSspKFwvLio/KT8kLycsIGFycmF5KCdhY3Rpb24nID0+ICdzeW5jJywgJ3Nob3d0ZW1wbGF0ZScgPT4gJ2ZhbHNlJywncmV0dXJuaWQnID0+IGNtc21zKCktPkdldENvbnRlbnRPcGVyYXRpb25zKCktPkdldERlZmF1bHRQYWdlSUQoKSkpOwogICAgCiAgICAkdGhpcy0+UmVnaXN0ZXJSb3V0ZSgnL3RodW1ibmFpbFwvKD9QPHdpZHRoPlswLTldKylcLyg/UDxoZWlnaHQ+WzAtOV0rKVwvKD9QPHNyYz5bLlwvYS16QS1aMC05Xy1dKykoXC8uKj8pPyQvJywgYXJyYXkoJ2FjdGlvbicgPT4gJ3RodW1ibmFpbCcsICdyZWRpcmVjdCcgPT4gdHJ1ZSwgICdzaG93dGVtcGxhdGUnID0+ICdmYWxzZScsJ3JldHVybmlkJyA9PiBjbXNtcygpLT5HZXRDb250ZW50T3BlcmF0aW9ucygpLT5HZXREZWZhdWx0UGFnZUlEKCkpKTsKICAgIAogICAgJHRoaXMtPlJlZ2lzdGVyUm91dGUoJy90aHVtYm5haWxcLyg/UDxzaXplPlswLTldKylcLyg/UDxzcmM+Wy5cL2EtekEtWjAtOV8tXSspKFwvLio/KT8kLycsIGFycmF5KCdhY3Rpb24nID0+ICd0aHVtYm5haWwnLCAncmVkaXJlY3QnID0+IHRydWUsICdzaG93dGVtcGxhdGUnID0+ICdmYWxzZScsJ3JldHVybmlkJyA9PiBjbXNtcygpLT5HZXRDb250ZW50T3BlcmF0aW9ucygpLT5HZXREZWZhdWx0UGFnZUlEKCkpKTsKICAgIAogICAgJHRoaXMtPlJlZ2lzdGVyUm91dGUoJy90aHVtYm5haWxcLyg/UDxzcmM+Wy5cL2EtekEtWjAtOV8tXSspKFwvLio/KT8kLycsIGFycmF5KCdhY3Rpb24nID0+ICd0aHVtYm5haWwnLCAncmVkaXJlY3QnID0+IHRydWUsICdzaG93dGVtcGxhdGUnID0+ICdmYWxzZScsJ3JldHVybmlkJyA9PiBjbXNtcygpLT5HZXRDb250ZW50T3BlcmF0aW9ucygpLT5HZXREZWZhdWx0UGFnZUlEKCkpKTsKICAgIAogIH0KICAKICBwdWJsaWMgZnVuY3Rpb24gR2V0SGVhZGVySFRNTCgpIHsKICAgIAogICAgJGh0bWwgPSAnJzsKICAgIC8vIENoZWNrIHZlcnNpb24KICAgIGdsb2JhbCAkQ01TX1ZFUlNJT047CiAgICBpZigoJENNU19WRVJTSU9OICE9ICcnKSAmJiB2ZXJzaW9uX2NvbXBhcmUoJENNU19WRVJTSU9OLCAnMS4xMScsICc8JykpCiAgICB7CiAgICAgICRodG1sIC49ICcgICAgPHNjcmlwdCBzcmM9IicuJHRoaXMtPkdldE1vZHVsZVVSTFBhdGgoKS4nL2xpYi9qcy9qcXVlcnktMS44LjMuanMiPjwvc2NyaXB0Pic7CiAgICAgICRodG1sIC49ICcgICAgPHNjcmlwdCBzcmM9IicuJHRoaXMtPkdldE1vZHVsZVVSTFBhdGgoKS4nL2xpYi9qcy9qcXVlcnktdWktMS45LjIuY3VzdG9tLm1pbi5qcyI+PC9zY3JpcHQ+JzsKICAgIH0KICAgIAogICAgJGh0bWwgLj0gJwogICAgICA8bGluayBocmVmPSInLiR0aGlzLT5HZXRNb2R1bGVVUkxQYXRoKCkuJy9saWIvY3NzL2FkbWluLmNzcyIgcmVsPSJzdHlsZXNoZWV0Ij4gIAogICAgICA8bGluayBocmVmPSInLiR0aGlzLT5HZXRNb2R1bGVVUkxQYXRoKCkuJy9saWIvanMvZmluZXVwbG9hZGVyL2ZpbmV1cGxvYWRlci0zLjQuMS5jc3MiIHJlbD0ic3R5bGVzaGVldCI+ICAKICAgICAgPGxpbmsgaHJlZj0iJy4kdGhpcy0+R2V0TW9kdWxlVVJMUGF0aCgpLicvbGliL2pzL2ZpbmV1cGxvYWRlci9maW5ldXBsb2FkZXItZml4LmNzcyIgcmVsPSJzdHlsZXNoZWV0Ij4gIAogICAgICA8c2NyaXB0IHNyYz0iJy4kdGhpcy0+R2V0TW9kdWxlVVJMUGF0aCgpLicvbGliL2pzL2ZpbmV1cGxvYWRlci9qcXVlcnkuZmluZXVwbG9hZGVyLTMuNC4xLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICAgIDxzY3JpcHQgc3JjPSInLiR0aGlzLT5HZXRNb2R1bGVVUkxQYXRoKCkuJy9saWIvanMvanF1ZXJ5LmplZGl0YWJsZS5taW4uanMiPjwvc2NyaXB0PgogICAgICAnOwogICAgCiAgICAkdGhpcy0+anF1ZXJ5X2xvYWRlZCA9IHRydWU7CiAgICAKICAgIHJldHVybiAkaHRtbDsKICB9CiAgCiAgcHVibGljIGZ1bmN0aW9uIGxvYWRIZWFkZXIoKSAgewogICAgaWYoISR0aGlzLT5qcXVlcnlfbG9hZGVkKSB7CiAgICAgIHJldHVybiAkdGhpcy0+R2V0SGVhZGVySFRNTCgpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KICAKICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEltYWdlKCRpbWFnZSkKICB7CiAgICAkbW9kdWxlID0gY21zX3V0aWxzOjpnZXRfbW9kdWxlKCdNQ01lZGlhcycpOwogICByZXR1cm4gJG1vZHVsZS0+R2V0TW9kdWxlVVJMUGF0aCgpIC4gJy9pbWFnZXMvJyAuICRpbWFnZTsgIAogIH0KICAKICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEltYWdlVGFnKCRpbWFnZSwgJGFsdD0nJykKICB7CiAgICByZXR1cm4gJzxpbWcgc3JjPSInIC4gc2VsZjo6Z2V0SW1hZ2UoJGltYWdlKSAuICciIGFsdD0iJy4kYWx0LiciLz4nOwogIH0KICAKICAvLyBFVkVOVFMKICBmdW5jdGlvbiBIYW5kbGVzRXZlbnRzICgpCiAgewogICAgcmV0dXJuIHRydWU7CiAgfQogIAogIHB1YmxpYyBmdW5jdGlvbiBEb0V2ZW50KCRvcmlnaW5hdG9yLCAkZXZlbnRuYW1lLCAmJHBhcmFtcykgewoJCWlmICgoJGV2ZW50bmFtZSA9PSAnQ3JvbkRhaWx5JykgfHwgKCRldmVudG5hbWUgPT0gJ0Nyb24xNW1pbicpKSB7CgkJCS8vIERvIGRlc2lyZWQgYWN0aW9uIGhlcmUKICAgICAgaWYoJHRoaXMtPkdldFByZWZlcmVuY2UoJ3JlbW90ZV9nYWxsZXJ5JywgZmFsc2UpKQogICAgICB7CiAgICAgICAgLy8gSU1QT1JUCiAgICAgIH0KICAgICAgLy8gaWYgKCR0aGlzLT5HZXRQcmVmZXJlbmNlKCdzZW5kX2VtYWlscycpID09ICd0cnVlJykKICAgICAgLy8gewogICAgICAvLyAKICAgICAgLy8gfQoJCX0KCX0KCiAgLyoqCiAgKiBJbXBvcnQgZnJvbSBhbiBleHRlcm5hbCBnYWxsZXJ5CiAgKi8KICAKICBwdWJsaWMgZnVuY3Rpb24gSW1wb3J0KCkKICB7CiAgICAgaWYoJHVybCA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdyZW1vdGVfZ2FsbGVyeScsIGZhbHNlKSkKICAgICAgewogICAgICAgICRyZXN1bHQgPSBNQ0ZpbGU6OlN5bmNGcm9tVXJsKCR1cmwpOwogICAgICB9CiAgfQogIAogIC8qKgogICogRXhlY3V0ZSBhbiBhY3Rpb24gYW5kIHJldHVybiB0aGUgb3V0cHV0IGluc3RlYWQgb2Ygc2hvd2luZyBpdAogICovCiAgcHVibGljIGZ1bmN0aW9uIEV4ZWN1dGVBY3Rpb24oJG5hbWUsJGlkLCRwYXJhbXMsJHJldHVybmlkPScnKSB7CiAgICBAb2Jfc3RhcnQoKTsKICAgICR0aGlzLT5Eb0FjdGlvbigkbmFtZSwgJGlkLCAkcGFyYW1zLCRyZXR1cm5pZCk7CiAgICAkb2ZfdGhlX2plZGkgPSBvYl9nZXRfY29udGVudHMoKTsKICAgIEBvYl9lbmRfY2xlYW4oKTsKICAgIHJldHVybiAkb2ZfdGhlX2plZGk7CiAgfQogIAogIC8vIFRFTVBMQVRFUwogIAogIHB1YmxpYyBmdW5jdGlvbiBHZXREZWZhdWx0VGVtcGxhdGVzKCkgewogICAgJGFycmF5ID0gdW5zZXJpYWxpemUoJHRoaXMtPkdldFByZWZlcmVuY2UoJ2RlZmF1bHRfdGVtcGxhdGVzJykpOwogICAgaWYgKGlzX2FycmF5KCRhcnJheSkpCiAgICB7CiAgICAgIHJldHVybiAkYXJyYXk7CiAgICB9CiAgICByZXR1cm4gYXJyYXkoKTsKICB9IAogIAogIHB1YmxpYyBmdW5jdGlvbiBTZXREZWZhdWx0VGVtcGxhdGVzKCRsaXN0ID0gYXJyYXkoKSkgIHsKICAgIHJldHVybiAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnZGVmYXVsdF90ZW1wbGF0ZXMnLCBzZXJpYWxpemUoJGxpc3QpKTsKICB9CiAgCiAgcHVibGljIGZ1bmN0aW9uIEFkZERlZmF1bHRUZW1wbGF0ZSgkYWN0aW9uLCAkdGVtcGxhdGUpICB7CiAgICAkbGlzdCA9ICR0aGlzLT5HZXREZWZhdWx0VGVtcGxhdGVzKCk7CiAgICAkbGlzdFskYWN0aW9uXSA9ICR0ZW1wbGF0ZTsKICAgICR0aGlzLT5TZXREZWZhdWx0VGVtcGxhdGVzKCRsaXN0KTsKICB9CiAgCiAgcHVibGljIGZ1bmN0aW9uIEdldERlZmF1bHRUZW1wbGF0ZSgkYWN0aW9uKSB7CiAgICAgICRsaXN0ID0gJHRoaXMtPkdldERlZmF1bHRUZW1wbGF0ZXMoKTsKICAgICAgaWYgKCFpc19hcnJheSgkbGlzdCkpICRsaXN0ID0gYXJyYXkoKTsKICAgICAgaWYgKGFycmF5X2tleV9leGlzdHMoJGFjdGlvbiwgJGxpc3QpKSAvLyBUT0RPOiBQb3NzaWJsZSBwcm9ibGVtIHdpdGggbGlzdAogICAgICB7CiAgICAgICAgcmV0dXJuICRsaXN0WyRhY3Rpb25dOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogIH0KICAKICBwdWJsaWMgZnVuY3Rpb24gaXNEZWZhdWx0VGVtcGxhdGUoJHRlbXBsYXRlKSAgeyAgICAKICAgICRsaXN0ID0gJHRoaXMtPkdldERlZmF1bHRUZW1wbGF0ZXMoKTsKICAgICRhY3Rpb24gPSBhcnJheV9zZWFyY2goJHRlbXBsYXRlLCAkbGlzdCk7CiAgICBpZigkYWN0aW9uICE9PSBmYWxzZSkKICAgIHsKICAgICAgcmV0dXJuICRhY3Rpb247CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfSAgCiAgCiAgcHVibGljIGZ1bmN0aW9uIHJlbW92ZURlZmF1bHRUZW1wbGF0ZSgkdGVtcGxhdGUpICB7ICAgIAogICAgJGxpc3QgPSAkdGhpcy0+R2V0RGVmYXVsdFRlbXBsYXRlcygpOwogICAgJGFjdGlvbiA9IGFycmF5X3NlYXJjaCgkdGVtcGxhdGUsICRsaXN0KTsKICAgIGlmKCRhY3Rpb24gIT09IGZhbHNlKQogICAgewogICAgICB1bnNldCgkbGlzdFskYWN0aW9uXSk7CiAgICAgICR0aGlzLT5TZXREZWZhdWx0VGVtcGxhdGVzKCRsaXN0KTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CiAgCiAgcHVibGljIGZ1bmN0aW9uIFByb2Nlc3NUZW1wbGF0ZUZvcigkYWN0aW9uLCAkcGFyYW1zID0gYXJyYXkoKSkgIHsKICAgIGlmIChpc3NldCgkcGFyYW1zWyd0ZW1wbGF0ZSddKSAmJiAkdGhpcy0+R2V0VGVtcGxhdGUoJHBhcmFtc1sndGVtcGxhdGUnXSkpIHsKICAgICAgcmV0dXJuICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGVGcm9tRGF0YWJhc2UoJHBhcmFtc1sndGVtcGxhdGUnXSk7CiAgICB9CiAgICBlbHNlaWYgKCgkdGVtcGxhdGUgPSAkdGhpcy0+R2V0RGVmYXVsdFRlbXBsYXRlKCRhY3Rpb24pKSAgJiYgICgkdGhpcy0+R2V0VGVtcGxhdGUoJHRlbXBsYXRlKSAhPT0gZmFsc2UpKQogICAgewogICAgICByZXR1cm4gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZUZyb21EYXRhYmFzZSgkdGVtcGxhdGUpOwogICAgfQogICAgZWxzZQogICAgewogICAgICByZXR1cm4gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnZnJvbnRlbmQuJy4kYWN0aW9uLicudHBsJyk7CiAgICB9CiAgfQoKICAvLyBJTUFHRVMgUEFSVAogIAogIHB1YmxpYyBmdW5jdGlvbiBnZXRQcmV2aWV3c1VybCgpICB7CiAgICAkY29uZmlnID0gJHRoaXMtPmdldENvbmZpZygpOwogICAgJHJlbGF0aXZlX3BhdGggPSBzdHJfcmVwbGFjZSgkY29uZmlnWydyb290X3BhdGgnXSwgJycsICRjb25maWdbJ3ByZXZpZXdzX3BhdGgnXSk7CiAgICAKICAgIHJldHVybiAkY29uZmlnWydyb290X3VybCddIC4gJHJlbGF0aXZlX3BhdGg7CiAgfQoKICBwdWJsaWMgZnVuY3Rpb24gZ2V0VGh1bWJuYWlsKCRwYXJhbXMpIHsKICAgIAogICAgaWYoaXNzZXQoJHBhcmFtc1snc3JjJ10pKSAkcGFyYW1zWydmaWxlJ10gPSAkcGFyYW1zWydzcmMnXTsKICAgIAogICAgaWYoaXNzZXQoJHBhcmFtc1snc2l6ZSddKSkgeyAkcGFyYW1zWyd3aWR0aCddID0gKGludCkkcGFyYW1zWydzaXplJ107ICAkcGFyYW1zWydoZWlnaHQnXSA9IChpbnQpJHBhcmFtc1snc2l6ZSddOyB9CiAgICAKICAgIGlmKGlzc2V0KCRwYXJhbXNbJ2ZpbGUnXSkpCiAgICB7CiAgICAgICRmaWxlID0gc3RyX3JlcGxhY2UoJy4uJywgJycsICRwYXJhbXNbJ2ZpbGUnXSk7CiAgICAgICRmaWxlID0gc3RyX3JlcGxhY2UoJyAnLCAnJywgJGZpbGUpOwogICAgICAkZmlsZSA9IHN0cl9yZXBsYWNlKCc7JywgJycsICRmaWxlKTsKCiAgICAgIGlmKCFpc3NldCgkcGFyYW1zWydtb2RlJ10pKSAkcGFyYW1zWydtb2RlJ10gPSAnZGVmYXVsdCc7CiAgICAgIGlmKCFpc3NldCgkcGFyYW1zWyd3aWR0aCddKSkgJHBhcmFtc1snd2lkdGgnXSA9ICcxMDAnOwogICAgICBpZighaXNzZXQoJHBhcmFtc1snaGVpZ2h0J10pKSAkcGFyYW1zWydoZWlnaHQnXSA9ICcxMDAnOwoKICAgICAgJGNvbmZpZyA9ICR0aGlzLT5nZXRDb25maWcoKTsKICAgICAgCiAgICAgIGlmKHN0cnBvcygkZmlsZSwgJy91cGxvYWRzLycpID09PSAwKQogICAgICB7CiAgICAgICAgJG9yaWdpbiA9ICRjb25maWdbJ3VwbG9hZHNfcGF0aCddIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuIHN0cl9yZXBsYWNlKCcvJywgRElSRUNUT1JZX1NFUEFSQVRPUiwgc3RyX3JlcGxhY2UoJy91cGxvYWRzLycsICcnLCAkZmlsZSkpOwogICAgICB9CiAgICAgIGVsc2VpZihzdHJwb3MoJGZpbGUsICd1cGxvYWRzLycpID09PSAwKQogICAgICB7CiAgICAgICAgJG9yaWdpbiA9ICRjb25maWdbJ3VwbG9hZHNfcGF0aCddIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuIHN0cl9yZXBsYWNlKCcvJywgRElSRUNUT1JZX1NFUEFSQVRPUiwgc3RyX3JlcGxhY2UoJ3VwbG9hZHMvJywgJycsICRmaWxlKSk7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgJG9yaWdpbiA9ICRjb25maWdbJ3VwbG9hZHNfcGF0aCddIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICdNb2R1bGVzJyAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAnTUNNZWRpYXMnIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRmaWxlOwogICAgICB9CgogICAgICBpZihpc19maWxlKCRvcmlnaW4pKQogICAgICB7CiAgICAgICAgLy8gQkVHSU4gVEhVTUJOQUlMIFBST0NFU1MKICAgICAgICAkZGVzdGluYXRpb25fdXJsID0gJHRoaXMtPmdldFByZXZpZXdzVXJsKCk7CiAgICAgICAgJGRlc3RpbmF0aW9uX3BhdGggPSAkY29uZmlnWydwcmV2aWV3c19wYXRoJ107CiAgICAgICAgJHRodW1ibmFpbF9uYW1lID0gTUNGaWxlOjpnZW5lcmF0ZVRodW1ibmFpbEZpbGVuYW1lKCRmaWxlLCAkcGFyYW1zKTsKICAgICAgICAkZGVzdGluYXRpb24gPSAkZGVzdGluYXRpb25fcGF0aCAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkdGh1bWJuYWlsX25hbWU7CgogICAgICAgIGlmKCFpc19maWxlKCRkZXN0aW5hdGlvbikpCiAgICAgICAgewogICAgICAgICAgLy8gR2VuZXJhdGUgdGh1bWJuYWlsICAgICAgICAKICAgICAgICAgIE1DRmlsZTo6Z2VuZXJhdGVUaHVtYm5haWwoJG9yaWdpbiwgJGRlc3RpbmF0aW9uLCAkcGFyYW1zKTsKICAgICAgICB9CiAgICAgICAgLy8gVEVTVAogICAgICAgIC8vIE1DRmlsZTo6Z2VuZXJhdGVUaHVtYm5haWwoJG9yaWdpbiwgJGRlc3RpbmF0aW9uLCAkcGFyYW1zKTsgLy8gR0VORVJBVEUgSVQgQUxMIFRIRSBUSU1FCgogICAgICAgIC8vIFJFVFVSTiBVUkwKICAgICAgICByZXR1cm4gJGRlc3RpbmF0aW9uX3VybCAuICcvJyAuICR0aHVtYm5haWxfbmFtZTsKICAgICAgfQogICAgfQogIH0KfQoKCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/method.install.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYgKCFjbXNtcygpKSBleGl0OwoKJGRiID0gJHRoaXMtPkdldERiKCk7CiRkaWN0ID0gTmV3RGF0YURpY3Rpb25hcnkoJGRiKTsKCiRmbGRzID0gYXJyYXkoCgknaWQgSSBLRVkgQVVUTycsCgknY29sbGVjdGlvbl9pZCBDKDI1NSknLCAvLyBGKioqKmluZyBPUk0KCSdjcmVhdGVkX2F0IEknLAoJJ2NyZWF0ZWRfYnkgSScsCgkndXBkYXRlZF9hdCBJJywKCSd1cGRhdGVkX2J5IEknLAoJJ3RpdGxlIEMoMjU1KScsCgkncG9zaXRpb24gSScsCgknZmlsZW5hbWUJWEwnLAoJJ29yaWdpbmFsX2ZpbGVuYW1lCVhMJwopOwoKJHNxbCA9ICRkaWN0LT5DcmVhdGVUYWJsZVNRTChjbXNfZGJfcHJlZml4KCkgLiAnbW9kdWxlX01DTWVkaWFzX2ZpbGVzJywgaW1wbG9kZSgnLCcsICRmbGRzKSwgYXJyYXkoJ215c3FsJyA9PiAnVFlQRT1NeUlTQU0nKSk7CiRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbCk7CgovLyAkdGhpcy0+U2V0UHJlZmVyZW5jZSgndXBsb2Fkc19wYXRoJywgJHRoaXMtPmNvbmZpZ1sndXBsb2Fkc19wYXRoJ10pOwoKJHRoaXMtPkNyZWF0ZVBlcm1pc3Npb24oJ01hbmFnZSBNQ01lZGlhcycsICdNYW5hZ2UgTUMgTWVkaWFzJyk7CgovLyAkY3JvbiA9IGNtc191dGlsczo6Z2V0X21vZHVsZSgnQ3JvbicpOwovLyAkY3Jvbi0+Q3JlYXRlRXZlbnQoJ0Nyb24xNW1pbicpOwoKJHRoaXMtPkFkZEV2ZW50SGFuZGxlcignQ3JvbicsICdDcm9uMTVtaW4nLCBmYWxzZSk7CiR0aGlzLT5BZGRFdmVudEhhbmRsZXIoJ0Nyb24nLCAnQ3JvbkhvdXJseScsIGZhbHNlKTsKJHRoaXMtPkF1ZGl0KDAsICR0aGlzLT5HZXROYW1lKCksICR0aGlzLT5MYW5nKCdpbnN0YWxsZWQnLCAkdGhpcy0+R2V0VmVyc2lvbigpKSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/method.uninstall.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmlmICghY21zbXMoKSkgZXhpdDsKCiRkYiA9ICR0aGlzLT5HZXREYigpOwoKJGRpY3QgPSBOZXdEYXRhRGljdGlvbmFyeSgkZGIpOwoKJHNxbCA9ICRkaWN0LT5Ecm9wVGFibGVTUUwoY21zX2RiX3ByZWZpeCgpIC4gJ21vZHVsZV9NQ01lZGlhc19maWxlcycpOwokZGljdC0+RXhlY3V0ZVNRTEFycmF5KCRzcWwpOwoKJHRoaXMtPlJlbW92ZVBlcm1pc3Npb24oJ01hbmFnZSBNQ01lZGlhcycpOwokdGhpcy0+UmVtb3ZlRXZlbnRIYW5kbGVyKCdDcm9uJywgJ0Nyb24xNW1pbicpOwoKJHRoaXMtPlJlbW92ZVByZWZlcmVuY2UoKTsKICAgIAokdGhpcy0+QXVkaXQoMCwgJHRoaXMtPmdldEZyaWVuZGx5TmFtZSgpLCAkdGhpcy0+TGFuZygndW5pbnN0YWxsZWQnKSk7Cgo/Pg==]]></data>
	</file>
	<file>
	  <filename>/method.upgrade.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmlmICghY21zbXMoKSkgZXhpdDsKLy8gCi8vICRkYiA9ICR0aGlzLT5HZXREYigpOwovLyAkZGljdCA9IE5ld0RhdGFEaWN0aW9uYXJ5KCRkYik7Cgpzd2l0Y2godHJ1ZSkgewogIGNhc2UgdmVyc2lvbl9jb21wYXJlKCRvbGR2ZXJzaW9uLCAnMC45JywgJzwnKToKICAgIC8vICRzcWwgPSAkZGljdC0+QWRkQ29sdW1uU1FMKGNtc19kYl9wcmVmaXgoKSAuICdtb2R1bGVfbWNmYWN0b3J5X21vZHVsZXMnLCAnZmlsdGVycyBYJyk7CiAgICAvLyAkZGljdC0+RXhlY3V0ZVNRTEFycmF5KCRzcWwpOwogICAgJHRoaXMtPkFkZEV2ZW50SGFuZGxlcignQ3JvbicsICdDcm9uMTVtaW4nLCBmYWxzZSk7CiAgICAkdGhpcy0+QWRkRXZlbnRIYW5kbGVyKCdDcm9uJywgJ0Nyb25Ib3VybHknLCBmYWxzZSk7Cn0KCiR0aGlzLT5BdWRpdCgwLCAkdGhpcy0+Z2V0RnJpZW5kbHlOYW1lKCksICR0aGlzLT5MYW5nKCd1cGdyYWRlZCcsICR0aGlzLT5HZXRWZXJzaW9uKCkpKTsK]]></data>
	</file>
	<file>
	  <filename>/README.md</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[TSZDIE1lZGlhcyBmb3IgQ01TIE1hZGUgU2ltcGxlCj09PT09PT09PT09PT09CgpNJkMgTWVkaWFzIGlzIGFuIGV4dGVuc2lvbiBmb3IgQ01TIEZvcm1zICYgTSZDIEZhY3RvcnkgdG8gYWxsb3dzIHlvdSB0byBjcmVhdGUgbXVsdGlwbGUgZmlsZXMgJiBwaWN0dXJlcyBmaWxlcy4gSXQgYWxzbyBhbGxvd3MgeW91IHRvIGNyZWF0ZSB0aHVtYm5haWxzIG9uIHRoZSBmbHkgd2l0aCBhbnkgcGljdHVyZXMgaW4gdGhlIC91cGxvYWRzLyBkaXJlY3RvcnkKCiMjIyBDcmVkaXRzCgotIERldmVsb3BtZW50IGJ5IFtUb3RvcGhlXShodHRwOi8vd3d3LnRvdG9waGUuY29tKQotIEJ1aWx0IGJ5IFtNb3JyaXMgJiBDaGFwbWFuXShodHRwOi8vd3d3Lm1vcnJpcy1jaGFwbWFuLmNvbSkKLSBCdWlsdCBmb3IgW0NNUyBNYWRlIFNpbXBsZV0oaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZykKCg==]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/admin.list.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[e2lmIGlzc2V0KCRjb2xsZWN0aW9uKX0KPGRpdiBpZD0iY29sbGVjdGlvbl97JGNvbGxlY3Rpb24tPmdldElkKCl9Ij4KICB7aWYgJGNvbGxlY3Rpb24tPmhhc0ZpbGVzKCl9CiAgPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0icGFnZXRhYmxlIj4KICAgIDx0aGVhZD4KICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0aD5UaXRsZTwvdGg+CiAgICAgICAgICAgIDx0aD5GaWxlbmFtZTwvdGg+CiAgICAgICAgICAgIDx0aCBjbGFzcz0icGFnZWljb24iPiZuYnNwOzwvdGg+CiAgICAgICAgPC90cj4KICAgIDwvdGhlYWQ+CiAgICA8dGJvZHkgY2xhc3M9InNvcnRhYmxlIiBkYXRhLXVybD0ieyRzb3J0fSI+CiAgICAgIHtmb3JlYWNoIGZyb209JGNvbGxlY3Rpb24tPmdldEZpbGVzKCkgaXRlbT1maWxlfQogICAgICA8dHIgY2xhc3M9IntjeWNsZSB2YWx1ZXM9InJvdzEscm93MiJ9IiBvbm1vdXNlb3Zlcj0idGhpcy5jbGFzc05hbWU9J3tjeWNsZSB2YWx1ZXM9InJvdzEscm93MiJ9aG92ZXInOyIgb25tb3VzZW91dD0idGhpcy5jbGFzc05hbWU9J3tjeWNsZSB2YWx1ZXM9InJvdzEscm93MiJ9JzsiIGRhdGEtaWQ9InskaWR9bWVkaWFfaWRfeyRmaWxlLT5nZXRJZCgpfSI+CiAgICAgICAgPHRkPjxkaXYgY2xhc3M9ImVkaXRhYmxlIiBpZD0ibWVkaWFfeyRmaWxlLT5nZXRJZCgpfSI+eyRmaWxlLT5nZXRUaXRsZSgpfTwvZGl2PjwvdGQ+CiAgICAgICAgPHRkPnskZmlsZS0+Z2V0T3JpZ2luYWxGaWxlbmFtZSgpfTwvdGQ+CiAgICAgICAgPHRkPjxhIGhyZWY9InskZGVsZXRlfSZhbXA7eyRpZH1maWxlX2lkPXskZmlsZS0+Z2V0SWQoKX0mYW1wO3N1cHByZXNzb3V0cHV0PTEmYW1wO3Nob3d0ZW1wbGF0ZT0wIiBjbGFzcz0iZGVsZXRlIj57JGRlbGV0ZV9pY29ufTwvYT48L3RkPgogICAgICA8L3RyPgogICAgICB7L2ZvcmVhY2h9CiAgICA8L3Rib2R5PgogIDwvdGFibGU+CiAgey9pZn0KPC9kaXY+CnsvaWZ9]]></data>
	</file>
	<file>
	  <filename>/templates/admin.pictureList.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[e2lmIGlzc2V0KCRjb2xsZWN0aW9uKX0KPGRpdiBpZD0iY29sbGVjdGlvbl97JGNvbGxlY3Rpb24tPmdldElkKCl9Ij4KICB7aWYgJGNvbGxlY3Rpb24tPmhhc0ZpbGVzKCl9CiAgPHVsIGNsYXNzPSJzb3J0YWJsZSIgZGF0YS11cmw9Inskc29ydH0iPgogICAge2ZvcmVhY2ggZnJvbT0kY29sbGVjdGlvbi0+Z2V0RmlsZXMoKSBpdGVtPWZpbGV9CiAgICA8bGkgc3R5bGU9ImZsb2F0OiBsZWZ0OyBib3JkZXI6IDFweCBzb2xpZCBncmF5OyBwYWRkaW5nOiAwcHg7IG1hcmdpbjogNXB4OyBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7IiBkYXRhLWlkPSJ7JGlkfW1lZGlhX2lkX3skZmlsZS0+Z2V0SWQoKX0iPgogICAgICAKICAgICAgICA8YSBocmVmPSJ7JGZpbGUtPmdldFVybCgpfSIgdGFyZ2V0PSJfbmV3IiByZWw9ImV4dGVybmFsIj48aW1nIHNyYz0ie01DTWVkaWFzIGFjdGlvbj0idGh1bWJuYWlsIiB3aWR0aD0xNTAgaGVpZ2h0PTE1MCBmaWxlPSRmaWxlLT5nZXRSZWxhdGl2ZVBhdGgoKX0iIGFsdD0ieyRmaWxlLT5nZXRPcmlnaW5hbEZpbGVuYW1lKCl9IiAvPjwvYT4KICAgICAgICA8ZGl2IHN0eWxlPSJwYWRkaW5nOiAycHg7IGJhY2tncm91bmQtY29sb3I6ICNDQ0M7Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImVkaXRhYmxlIiBpZD0ibWVkaWFfeyRmaWxlLT5nZXRJZCgpfSI+eyRmaWxlLT5nZXRUaXRsZSgpfTwvZGl2PgogICAgICAgICAgPGEgaHJlZj0ieyRkZWxldGV9JmFtcDt7JGlkfWZpbGVfaWQ9eyRmaWxlLT5nZXRJZCgpfSZhbXA7c3VwcHJlc3NvdXRwdXQ9MSZhbXA7c2hvd3RlbXBsYXRlPTAiIGNsYXNzPSJkZWxldGUiIHN0eWxlPSJmbG9hdDogcmlnaHQ7Ij57JGRlbGV0ZV9pY29ufTwvYT4KICAgICAgICAgIDxkaXYgc3R5bGU9ImNsZWFyOmJvdGg7Ij48L2Rpdj4KICAgICAgICA8L2Rpdj4gICAgICAKICAgIDwvbGk+CiAgICB7L2ZvcmVhY2h9CiAgPC91bD4KICA8ZGl2IHN0eWxlPSJjbGVhcjogYm90aDsiPjwvZGl2PgogIHsvaWZ9CjwvZGl2Pgp7L2lmfQ==]]></data>
	</file>
	<file>
	  <filename>/templates/admin.templates.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[e2lmICR0ZW1wbGF0ZXN8Y291bnQgPiAwfQo8dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJwYWdldGFibGUiPgogIDx0aGVhZD4KICAgIDx0cj4KICAgICAgPHRoPjwvdGg+CiAgICAgIDx0aD48L3RoPgogICAgICA8dGggY2xhc3M9InBhZ2VpY29uIj4mbmJzcDs8L3RoPgogICAgICA8dGggY2xhc3M9InBhZ2VpY29uIj4mbmJzcDs8L3RoPgogICAgPC90cj4KICA8L3RoZWFkPgogIDx0Ym9keT4KICB7Zm9yZWFjaCBmcm9tPSR0ZW1wbGF0ZXMgaXRlbT1yb3d9CiAgICA8dHIgY2xhc3M9IntjeWNsZSB2YWx1ZXM9InJvdzEscm93MiJ9IiBvbm1vdXNlb3Zlcj0idGhpcy5jbGFzc05hbWU9J3tjeWNsZSB2YWx1ZXM9InJvdzEscm93MiJ9aG92ZXInOyIgb25tb3VzZW91dD0idGhpcy5jbGFzc05hbWU9J3tjeWNsZSB2YWx1ZXM9InJvdzEscm93MiJ9JzsiPgogICAgICA8dGQ+eyRyb3cudGl0bGVsaW5rfTwvdGQ+CiAgICAgIDx0ZD57JHJvdy5kZWZhdWx0fTwvdGQ+CiAgICAgIDx0ZD57JHJvdy5lZGl0bGlua308L3RkPgogICAgICA8dGQ+eyRyb3cuZGVsZXRlbGlua308L3RkPgogICAgPC90cj4Key9mb3JlYWNofQogIDwvdGJvZHk+CjwvdGFibGU+CnsvaWZ9Cgo8ZGl2IGNsYXNzPSJwYWdlb3B0aW9ucyI+Cgk8cCBjbGFzcz0icGFnZW9wdGlvbnMiPnskYWRkX3RlbXBsYXRlc19pY29ufSB7JGFkZF90ZW1wbGF0ZXNfbGlua308L3A+CjwvZGl2Pg==]]></data>
	</file>
	<file>
	  <filename>/templates/admin.template_edit.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[e2lmIGlzc2V0KCRmb3JtKX0KCTxkaXYgc3R5bGU9ImNvbG9yOiByZWQ7Ij57JGZvcm0tPnNob3dFcnJvcnMoKX08L2Rpdj4KCXskZm9ybS0+Z2V0SGVhZGVycygpfQoJPHAgc3R5bGU9InRleHQtYWxpZ246IHJpZ2h0OyI+CgkJeyRmb3JtLT5nZXRCdXR0b25zKCl9Cgk8L3A+CgoJeyRmb3JtLT5zaG93V2lkZ2V0cygnPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8ZGl2IGNsYXNzPSJwYWdldGV4dCI+JUxBQkVMJTo8L2Rpdj4KCQk8ZGl2IGNsYXNzPSJwYWdlaW5wdXQiPiVJTlBVVCUgPGVtPiVUSVBTJTwvZW0+PC9kaXY+CgkJPGRpdiBjbGFzcz0icGFnZWlucHV0IiBzdHlsZT0iY29sb3I6IHJlZDsiPiVFUlJPUlMlPC9kaXY+Cgk8L2Rpdj4nKX0KCgk8cCBzdHlsZT0idGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi10b3A6IDE1cHg7Ij4KCQl7JGZvcm0tPmdldEJ1dHRvbnMoKX0KCTwvcD4KCXskZm9ybS0+Z2V0Rm9vdGVycygpfQp7L2lmfQ==]]></data>
	</file>
	<file>
	  <filename>/templates/frontend.default.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[e2lmIGlzc2V0KCRjb2xsZWN0aW9uKX0KPHVsPgogIHtmb3JlYWNoIGZyb209JGNvbGxlY3Rpb24tPmdldEZpbGVzKCkgaXRlbT1maWxlfQogIDxsaT48YSBocmVmPSJ7JGZpbGUtPmdldFVybCgpfSI+eyRmaWxlLT5nZXRPcmlnaW5hbEZpbGVuYW1lKCl9PC9hPjwvbGk+CiAgey9mb3JlYWNofQo8L3VsPgp7L2lmfQ==]]></data>
	</file>
	<file>
	  <filename>/templates/list.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[e2xpdGVyYWx9CiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgpIHsKICAvLyBjb25zb2xlLmxvZygney9saXRlcmFsfXskbGlzdHVybH17bGl0ZXJhbH0nKTsKICAgJCgnI2Z1cGxvYWRlcl97L2xpdGVyYWx9eyRjb2xsZWN0aW9uX2lkfXtsaXRlcmFsfScpLmZpbmVVcGxvYWRlcih7CiAgICAgcmVxdWVzdDogewogICAgICAgZW5kcG9pbnQ6ICd7L2xpdGVyYWx9eyRlbmRwb2ludH17bGl0ZXJhbH0nLAogICAgICAgcGFyYW1zOiB7L2xpdGVyYWx9eyRwYXJhbXN9e2xpdGVyYWx9CiAgICAgfSwKICAgICAvLyBkZWJ1ZzogdHJ1ZSwKICAgICBmYWlsZWRVcGxvYWRUZXh0RGlzcGxheTogewogICAgICAgbW9kZTogJ2N1c3RvbScKICAgICB9LAogICAgIHsvbGl0ZXJhbH17JGZ1X3ZhbGlkYXRpb259e2xpdGVyYWx9CiAgICAgdGV4dDogewogICAgICAgdXBsb2FkQnV0dG9uOiAney9saXRlcmFsfXskdXBsb2FkQnV0dG9uVGV4dH17bGl0ZXJhbH0nCiAgICAgfQogICB9KS5vbignY29tcGxldGUnLCBmdW5jdGlvbihldmVudCwgaWQsIGZpbGVOYW1lLCByZXNwb25zZUpTT04pIHsKICAgICBpZiAocmVzcG9uc2VKU09OLnN1Y2Nlc3MpIHsKICAgICAgICAvLyBSZWZyZXNoIHNvbWV0aGluZwogICAgICAgICQuYWpheCh7CiAgICAgICAgICB1cmw6J3svbGl0ZXJhbH17JGxpc3R1cmx9e2xpdGVyYWx9JwogICAgICAgIH0pLmRvbmUoZnVuY3Rpb24oZGF0YSl7CiAgICAgICAgICAkKCcjY29sbGVjdGlvbl97L2xpdGVyYWx9eyRjb2xsZWN0aW9uX2lkfXtsaXRlcmFsfScpLnJlcGxhY2VXaXRoKGRhdGEpOwogICAgICAgICAgJCgnI2NvbGxlY3Rpb25fey9saXRlcmFsfXskY29sbGVjdGlvbl9pZH17bGl0ZXJhbH0gLmRlbGV0ZScpLmVhY2goZnVuY3Rpb24oKXsKICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJCh0aGlzKSk7CiAgICAgICAgICAgICQodGhpcykuYmluZCgnY2xpY2snLCBmdW5jdGlvbigpewogICAgICAgICAgICAgIHJlc3VsdCA9IGNvbmZpcm0oJ0RvIHlvdSByZWFsbHkgd2FudCB0byBkbyB0aGF0PycpOwogICAgICAgICAgICAgIGlmKHJlc3VsdCkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBsaWduZSA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhsaW5lKTsgICAgCiAgICAgICAgICAgICAgICAkLmFqYXgoewogICAgICAgICAgICAgICAgICB1cmw6IGxpZ25lLmF0dHIoJ2hyZWYnKQogICAgICAgICAgICAgICAgfSkuZG9uZShmdW5jdGlvbihkYXRhKXsKICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2cobGluZS5wYXJlbnQoKS5wYXJlbnQoKSk7CiAgICAgICAgICAgICAgICAgIGxpZ25lLnBhcmVudCgpLnBhcmVudCgpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAvLyBsaW5lLnBhcmVudCgpLnBhcmVudCgpLmVmZmVjdCgnZHJvcCcpOyAvLyBET05UV09SSwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9KTsKICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICB9CiAgICB9KTsKICAgIAoKICAgICQoIiNjb2xsZWN0aW9uX3svbGl0ZXJhbH17JGNvbGxlY3Rpb25faWR9e2xpdGVyYWx9IC5zb3J0YWJsZSIgKS5zb3J0YWJsZSh7CiAgICAgIG9wYWNpdHk6IDAuNSwKICAgICAgc3RvcDogZnVuY3Rpb24oKXsKICAgICAgICB2YXIgb3JkZXIgPSAkKCIjY29sbGVjdGlvbl97L2xpdGVyYWx9eyRjb2xsZWN0aW9uX2lkfXtsaXRlcmFsfSAuc29ydGFibGUiICkuc29ydGFibGUoJ3NlcmlhbGl6ZScsIHsKICAgICAgICAgIGF0dHJpYnV0ZTogJ2RhdGEtaWQnCiAgICAgICAgfSk7CiAgICAgICAgdXJsID0gJCh0aGlzKS5hdHRyKCdkYXRhLXVybCcpICsgJyYnICsgb3JkZXI7CiAgICAgICAgLy8gY29uc29sZS5sb2codXJsKTsKICAgICAgICAkLmFqYXgoewogICAgICAgICAgICB1cmw6IHVybAogICAgICAgICAgfSk7CiAgICAgICAgCiAgICAgIH0KICAgIH0pOwogICAgLy8gJCggIi5zb3J0YWJsZSIgKS5kaXNhYmxlU2VsZWN0aW9uKCk7CgogICAgJCgnI2NvbGxlY3Rpb25fey9saXRlcmFsfXskY29sbGVjdGlvbl9pZH17bGl0ZXJhbH0gLmVkaXRhYmxlJykuZWRpdGFibGUoJ3svbGl0ZXJhbH17JGVkaXR9e2xpdGVyYWx9JywgewogICAgICBpZDogJ3svbGl0ZXJhbH17JGlkfXtsaXRlcmFsfW1lZGlhX2lkJywKICAgICAgbmFtZTogJ3svbGl0ZXJhbH17JGlkfXtsaXRlcmFsfXZhbHVlJwogICAgfSk7CiAgICAKICAgICQoJyNjb2xsZWN0aW9uX3svbGl0ZXJhbH17JGNvbGxlY3Rpb25faWR9e2xpdGVyYWx9IC5kZWxldGUnKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAgIC8vIGNvbnNvbGUubG9nKCQodGhpcykpOwogICAgICAkKHRoaXMpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24oKXsKICAgICAgICByZXN1bHQgPSBjb25maXJtKCdEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZG8gdGhhdD8nKTsKICAgICAgICBpZihyZXN1bHQpCiAgICAgICAgewogICAgICAgICAgbGlnbmUgPSAkKHRoaXMpOwogICAgICAgICAgLy8gY29uc29sZS5sb2cobGluZSk7ICAgIAogICAgICAgICAgJC5hamF4KHsKICAgICAgICAgICAgdXJsOiBsaWduZS5hdHRyKCdocmVmJykKICAgICAgICAgIH0pLmRvbmUoZnVuY3Rpb24oZGF0YSl7CiAgICAgICAgICAgIGxpZ25lLnBhcmVudCgpLnBhcmVudCgpLmhpZGUoJ2hpZ2hsaWdodCcpOwogICAgICAgICAgICAvLyBsaWduZS5wYXJlbnQoKS5wYXJlbnQoKS5yZW1vdmUoKTsKICAgICAgICAgIH0pOwogICAgICAgICAgCiAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgIAogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAKICAgICAgfSk7CiAgICB9KTsKICAgIAogfSk7CnsvbGl0ZXJhbH0=]]></data>
	</file>
</module>
