<?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>Gallery3</name>
	<version>0.1</version>
  <mincmsversion>1.10.3</mincmsversion>
	<help><![CDATA[PGgzPldoYXQgZG9lcyB0aGlzIGRvPzwvaDM+CjxwPkdhbGxlcnkgMyBpcyBhIG1vZHVsZSB0byBkaXNwbGF5IGFsYnVtcyBhbmQgaW1hZ2VzIGZyb20geW91ciBHYWxsZXJ5MyBpbnN0YWxsYXRpb24gaW4gQ01TIE1hZGUgU2ltcGxlLgpXaGVuIHRoZSBtb2R1bGUgaXMgaW5zdGFsbGVkLCBhIEdhbGxlcnkgMyBhZG1pbiBwYWdlIGlzIGFkZGVkIHRvIHRoZSBFeHRlbnNpb25zIG1lbnUgdGhhdCB3aWxsIGFsbG93IHlvdSB0byBzZXQgdGhlIHJlcXVpcmVkIG9wdGlvbnMuPC9wPgo8aDI+R2V0dGluZyBzdGFydGVkPC9oMj4KPHA+CkFmdGVyIGluc3RhbGxpbmcgdGhlIG1vZHVsZSB5b3Ugd2lsbCBoYXZlIHRvIGRvIGEgY291cGxlIHRoaW5ncyB0byBtYWtlIHRoZSBtb2R1bGUgd29yayBjb21wbGV0ZWx5Lgo8L3A+CjxoND4xLiBBdHRhY2ggdGhlIEdhbGxlcnkzIE1vZHVsZSBzdHlsZXNoZWV0IHRvIHlvdXIgdGVtcGxhdGUocyk8L2g0Pgo8cD5UaGUgbW9kdWxlIHdpbGwgaW5zdGFsbCBhIG5ldyBTdHlsZXNoZWV0IG5hbWVkICdHYWxsZXJ5MyBNb2R1bGUnIGluIExheW91dCAtPiBTdHlsZXNoZWV0cy4gVGhpcyBzdHlsZXNoZWV0IG5lZWRzIHRvIGJlIGF0dGFjaGVkIG1hbnVhbGx5IHRvIHRoZSBkZXNpcmVkIHRlbXBsYXRlcy48L3A+CjxoND4yLiBDaGFuZ2UgcmVxdWlyZWQgb3B0aW9uczwvaDQ+CjxwPgpTZXQgdGhlIHJlcXVpcmVkIG9wdGlvbnMgaW4gRXh0ZW5zaW9ucyAtPiBHYWxsZXJ5IDMKPC9wPgo8cD4KPHN0cm9uZz5NYWluIFVSTDo8L3N0cm9uZz48YnIvPgpTZXQgdGhpcyB0byB0aGUgbWFpbiBwYWdlIG9mIHRoZSBHYWxsZXJ5IDMgaW5zdGFsbGF0aW9uIHlvdSB3YW50IHRvIHVzZS4KPC9wPgo8cD4KPHN0cm9uZz5HYWxsZXJ5MyBSRVNUIEFQSSBLZXk6PC9zdHJvbmc+PGJyLz4KRXZlcnkgR2FsbGVyeSAzIHVzZXIgaGFzIGhpcy8gaGVyIG93biBSRVNUIEFQSSBLZXkuIFlvdSBjYW4gZmluZCB0aGlzIGtleSBieSBnb2luZyB0byB0aGUgYWRtaW4gcGFuZWwgb2YgeW91ciBHYWxsZXJ5IDMgaW5zdGFsbGF0aW9uIGFuZCAnRWRpdCcgdGhlIHVzZXIgeW91IHdhbnQgdG8gdXNlLiBUaGUga2V5IGlzIGxpc3RlZCBhcyAnUmVtb3RlIGFjY2VzcyBrZXknLgo8L3A+CjxwPgo8c3Ryb25nPkl0ZW1JZDo8L3N0cm9uZz48YnIvPgpUaGUgR2FsbGVyeSAzIGl0ZW0gaWQgb2YgdGhlIGFsYnVtIG9yIHBob3RvIHlvdSB3YW50IHRvIHNob3cuIFdoZW4gdGhpcyBpcyB0aGUgaWQgb2YgYW4gYWxidW0sIGl0IHdpbGwgYmUgdXNlZCBhcyB0aGUgJ3Jvb3QnIGFsYnVtIHRvIHNob3cgaW4geW91ciBDTVMgTWFkZSBTaW1wbGUgcGFnZS4KVGhlcmUgaXMgbm8gc2ltcGxlIHdheSB0byBmaW5kIHRoaXMgaWQuPGJyLz4KVG8gZmluZCB0aGUgaWQgb2YgYW4gYWxidW0geW91IGNhbiBnbyBpbnRvIHRoaXMgYWxidW0gc28geW91IHdpbGwgZ2V0IHRoZSAnQWxidW0gb3B0aW9ucycgbGluayBhbmQgdGhlbiBjaGVjayB0aGUgc291cmNlIG9mIHRoZSBwYWdlLiBVbmRlciA8cHJlPjxsaSB0aXRsZT0iQWxidW0gb3B0aW9ucyI+PC9wcmU+IHlvdSB3aWxsIGZpbmQgc2V2ZXJhbCBsaW5rcyB3aXRoIGFsbCB1c2luZyB0aGUgc2FtZSBudW1iZXIgaW4gaXQuIFRoaXMgaXMgdGhlIElkIG9mIHlvdXIgYWxidW0uPGJyLz4KWW91IGNhbiBkbyB0aGUgc2FtZSBmb3IgYSBzcGVjaWZpYyBwaG90by4gR28gdG8gdGhlIHBob3RvIHlvdSB3YW50IHRvIHNob3cgc28geW91IHdpbGwgZ2V0IHRoZSAnUGhvdG8gb3B0aW9ucycgbWVudSBvbiB0b3AuIFRIZW4gY2hlY2sgdGhlIHNvdXJjZSBvZiB0aGUgcGFnZS4gVW5kZXIgPHByZT48bGkgdGl0bGU9IlBob3RvIG9wdGlvbnMiPjwvcHJlPiB5b3Ugd2lsbCBmaW5kIHRoZSBsaW5rcyB3aXRoIHRoZSBJZCBvZiB5b3VyIHBob3RvIGluIGl0Lgo8L3A+CjxwPgo8c3Ryb25nPlNob3cgQWxidW0gVGl0bGVzOjwvc3Ryb25nPjxici8+CldoZW4gdGhpcyBpcyBjaGVja2VkLCB0aGUgbW9kdWxlIHdpbGwgZ2VuZXJhdGUgYSBoMiB0YWcgd2l0aCB0aGUgYWxidW0gdGl0bGUgaW4gaXQuCjwvcD4KPHA+CjxzdHJvbmc+RW5hYmxlIEdhbGxlcmlhIHRvIGRpc3BsYXkgaW1hZ2VzOjwvc3Ryb25nPjxici8+CkdhbGxlcmlhIGlzIGEgbmljZSBqcXVlcnkgYWRkb24gdGhhdCBkaXNwbGF5cyB5b3VyIGltYWdlcyBpbiBhIG1vcmUgZmFuY3kgd2F5LiBUaGUgR2FsbGVyeSAzIG1vZHVsZSBkaXN0cmlidXRlcyBhbGwgcmVxdWlyZWQgZmlsZXMgdG8gdXNlIHRoaXMgYWRkb24gZm9yIGRpc3BsYXlpbmcgeW91ciBHYWxsZXJ5IDMgcGhvdG8ncyBpbiBDTVMgTWFkZSBTaW1wbGUuIFNpbXBseSBjaGVjayB0aGlzIGNoZWNrYm94IGFuZCB0aGUgR2xvYmFsIENvbnRlbnQgQmxvY2sgJ0dhbGxlcnkzIGdhbGxlcmlhJyB0aGF0IGhhcyBiZWVuIGFkZGVkIGR1cmluZyBpbnN0YWxsYXRpb24gb2YgdGhpcyBtb2R1bGUgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGluY2x1ZGVkIGluIHRoZSB0ZW1wbGF0ZS48YnIvPgpNb3JlIGluZm9ybWF0aW4gYWJvdXQgR2FsbGVyaWEgY2FuIGJlIGZvdW5kIGhlcmU6IDxhIGhyZWY9Imh0dHA6Ly9nYWxsZXJpYS5pby9kb2NzLyI+R2FsbGVyaWEgZG9jdW1lbnRhdGlvbjwvYT4uCjwvcD4KPGg0PjMuIEluY2x1ZGUgdGhlIG1vZHVsZSBpbiB5b3VyIHBhZ2U8L2g0PgpZb3UgY2FuIGluY2x1ZGUgdGhlIG1vZHVsZSBpbiB5b3VyIHBhZ2UgYnkgdXNpbmcgdGhlIGZvbGxvd2luZyB0YWc6IHtjbXNfbW9kdWxlIG1vZHVsZT0nR2FsbGVyeTMnfQo8aDM+VGhpbmdzIHRvIGtub3c8L2gzPgo8cD4KVGhlIFJFU1QgQVBJIEtleSBpcyBvbmx5IHVzZWQgdG8gZ2V0IGFsbCBhbGJ1bSBhbmQgaW1hZ2UgaW5mb3JtYXRpb24gdG8gZ2VuZXJhdGUgdGhlIGh0bWwgZm9yIENNUyBNYWRlIFNpbXBsZS4gQWZ0ZXIgdGhhdCwgdGhlIHB1YmxpYyB1cmxzIGFyZSB1c2VkLiBUaGlzIG1lYW5zIHRoYXQgb25seSBpbWFnZXMgdGhhdCBhcmUgdmlzaWJsZSBmb3IgZ3Vlc3QgdXNlcnMgd2lsbCBiZSBkaXNwbGF5ZWQuIFlvdSB3aWxsIG1vc3RsaWtlbHkgYWxtb3N0IGVuZCB1cCB1c2luZyB0aGUgUkVTVCBBUEkgS2V5IGZyb20gdGhlIGd1ZXN0IGFjY291bnQgb2YgR2FsbGVyeSAzLgo8L3A+PGgzPlBhcmFtZXRlcnM8L2gzPjx1bD48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBsYW5nPSJlbl9VUyIgLSBQYXJhbWV0ZXIgaXMgdXNlZCB0byBzcGVjaWZ5IHdoYXQgbGFuZ3VhZ2UgdG8gdXNlIGZvciBkaXNwbGF5IG9uIHRoZSBmcm9udGVuZC4gTm90IGFsbCBtb2R1bGVzIHN1cHBvcnQgb3IgbmVlZCB0aGlzLjwvbGk+PC91bD4=]]></help>
	<about><![CDATA[PGJyIC8+VmVyc2lvbjogMC4xPGJyIC8+]]></about>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/action.default.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmlmICghaXNzZXQoJGdDbXMpKSBleGl0OwokY29uZmlnID0gJGdDbXMtPkdldENvbmZpZygpOwoKJGl0ZW1JZCA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdpdGVtSWQnKTsKaWYgKGlzc2V0KCRwYXJhbXNbJ2l0ZW1JZCddKSAmJiBwcmVnX21hdGNoKCIvXlxkKyQvIiwgJHBhcmFtc1snaXRlbUlkJ10pKQp7CgkkaXRlbUlkID0gJHBhcmFtc1snaXRlbUlkJ107Cn0KaWYgKEZBTFNFICE9IGVtcHR5KCRpdGVtSWQpKQp7CgllY2hvICI8aDI+RVJST1IhPC9oMj48cD5JdGVtSWQgbm90IHNldCwgY2hlY2sgeW91ciBzZXR0aW5ncyE8L3A+IjsKCXJldHVybjsKfQoKJHNob3dBbGJ1bVRpdGxlID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ3Nob3dBbGJ1bVRpdGxlJywgMSk7CiR1c2VHYWxsZXJpYSA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCd1c2VHYWxsZXJpYScsIDApOwoKaWYgKGlzc2V0KCRwYXJhbXNbJ3Nob3dBbGJ1bVRpdGxlJ10pICYmICRwYXJhbXNbJ3Nob3dBbGJ1bVRpdGxlJ10pCnsKCSRzaG93QWxidW1UaXRsZSA9ICRwYXJhbXNbJ3Nob3dBbGJ1bVRpdGxlJ107Cn0KaWYgKGlzc2V0KCRwYXJhbXNbJ3VzZUdhbGxlcmlhJ10pICYmICRwYXJhbXNbJ3VzZUdhbGxlcmlhJ10pCnsKCSR1c2VHYWxsZXJpYSA9ICRwYXJhbXNbJ3VzZUdhbGxlcmlhJ107Cn0KCiRpdGVtID0gJHRoaXMtPmdldFJlc3RJdGVtKCRpdGVtSWQsIDEpOwoKJGFsYnVtcyA9IEFycmF5KCk7CiRwaG90b3MgPSBBcnJheSgpOwokYWxidW1zID0gKGFycmF5KSRpdGVtWydhbGJ1bXMnXTsKJHBob3RvcyA9IChhcnJheSkkaXRlbVsncGhvdG9zJ107CiR0aGlzLT5zbWFydHktPmFzc2lnbigncGFyZW50JywgJGl0ZW0pOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2FsYnVtcycsICRhbGJ1bXMpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Bob3RvcycsICRwaG90b3MpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Nob3dBbGJ1bVRpdGxlJywkc2hvd0FsYnVtVGl0bGUpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3VzZUdhbGxlcmlhJywkdXNlR2FsbGVyaWEpOwoKLy8gRGlzcGxheSB0aGUgcG9wdWxhdGVkIHRlbXBsYXRlCmVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnZGlzcGxheUFsYnVtLnRwbCcpOwoKPz4K]]></data>
	</file>
	<file>
	  <filename>/action.defaultadmin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7CgojVGhlIHRhYiBoZWFkZXJzCmVjaG8gJHRoaXMtPlN0YXJ0VGFiSGVhZGVycygpOwppZiAoRkFMU0UgPT0gZW1wdHkoJHBhcmFtc1snYWN0aXZlX3RhYiddKSkKewoJJHRhYiA9ICRwYXJhbXNbJ2FjdGl2ZV90YWInXTsKfQplbHNlCnsKCSR0YWIgPSAnJzsKfQoKZWNobyAkdGhpcy0+U2V0VGFiSGVhZGVyKCdHYWxsZXJ5MycsJHRoaXMtPkxhbmcoJ2FkbWluX2dhbGxlcnkzJykpOwplY2hvICR0aGlzLT5FbmRUYWJIZWFkZXJzKCk7CgojVGhlIGNvbnRlbnQgb2YgdGhlIHRhYnMKZWNobyAkdGhpcy0+U3RhcnRUYWJDb250ZW50KCk7CmVjaG8gJHRoaXMtPlN0YXJ0VGFiKCdHYWxsZXJ5MycsICRwYXJhbXMpOwppZiAoJHRoaXMtPkNoZWNrUGVybWlzc2lvbignTW9kaWZ5IFNpdGUgUHJlZmVyZW5jZXMnKSkKewoJZWNobyAkdGhpcy0+U3RhcnRUYWIoJ29wdGlvbnMnLCAkcGFyYW1zKTsKCWluY2x1ZGUoZGlybmFtZShfX0ZJTEVfXykuJy9mdW5jdGlvbi5hZG1pbl9vcHRpb25zdGFiLnBocCcpOwoJZWNobyAkdGhpcy0+RW5kVGFiKCk7Cn0KZWxzZQp7CgllY2hvICc8cD5ObyBwZXJtaXNzaW9ucyBmb3IgeW91LjwvcD4nOwp9CmVjaG8gJHRoaXMtPkVuZFRhYkNvbnRlbnQoKTsKCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/action.updateoptions.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7CgppZiggISR0aGlzLT5DaGVja1Blcm1pc3Npb24oICdNb2RpZnkgU2l0ZSBQcmVmZXJlbmNlcycgKSApCnsKCWVjaG8gIjxwPk5vIHBlcm1pc3Npb25zIHRvIHNhdmUhPC9wPiI7CglyZXR1cm47Cn0KCiR0aGlzLT5TZXRQcmVmZXJlbmNlKCdpdGVtSWQnLCAoaW50KSRwYXJhbXNbJ2l0ZW1JZCddKTsKJHRoaXMtPlNldFByZWZlcmVuY2UoJ3Nob3dBbGJ1bVRpdGxlJywgKGlzc2V0KCRwYXJhbXNbJ3Nob3dBbGJ1bVRpdGxlJ10pPycxJzonMCcpKTsKJHRoaXMtPlNldFByZWZlcmVuY2UoJ3VzZUdhbGxlcmlhJywgKGlzc2V0KCRwYXJhbXNbJ3VzZUdhbGxlcmlhJ10pPycxJzonMCcpKTsKJHRoaXMtPlNldFByZWZlcmVuY2UoJ2dhbGxlcnlVcmwnLCB0cmltKCRwYXJhbXNbJ2dhbGxlcnlVcmwnXSkpOwokdGhpcy0+U2V0UHJlZmVyZW5jZSgnZ2FsbGVyeVJlc3RBcGlLZXknLCB0cmltKCRwYXJhbXNbJ2dhbGxlcnlSZXN0QXBpS2V5J10pKTsKCiRwYXJhbXMgPSBhcnJheSgndGFiX21lc3NhZ2UnPT4gJ2FkbWluX3NhdmVkJywgJ2FjdGl2ZV90YWInID0+ICdvcHRpb25zJyk7CiR0aGlzLT5SZWRpcmVjdCgkaWQsICdkZWZhdWx0YWRtaW4nLCAnJywgJHBhcmFtcyk7Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/css/stylesheet.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmFsYnVtIHsKCWZsb2F0OiBsZWZ0Owp9CgouYWxidW1zIGltZyB7CgoJbWF4LWhlaWdodDogMjAwcHg7CgltYXgtd2lkdGg6IDIwMHB4Owp9CgoucGhvdG9zIGltZyB7CgltYXgtaGVpZ2h0OiAxNTBweDsKCW1heC13aWR0aDogMTUwcHg7Cn0KCmEuaW1nVXJsIHsKCWJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOwoJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJaGVpZ2h0OiAxNTJweDsKCWxpbmUtaGVpZ2h0OiAxNTJweDsKCW1hcmdpbjogMnB4OwoJdGV4dC1hbGlnbjogY2VudGVyOwoJdmVydGljYWwtYWxpZ246IG1pZGRsZTsKCXdpZHRoOiAxNTJweDsKfQo=]]></data>
	</file>
	<file>
	  <filename>/function.admin_optionstab.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYoICFpc3NldCgkZ0NtcykgKSBleGl0OwoKLy8gQ3JlYXRlRm9ybVN0YXJ0IHNldHMgdXAgYSBwcm9wZXIgZm9ybSB0YWcgdGhhdCB3aWxsIGNhdXNlIHRoZSBzdWJtaXQgdG8KLy8gcmV0dXJuIGNvbnRyb2wgdG8gdGhpcyBtb2R1bGUgZm9yIHByb2Nlc3NpbmcuCiRzbWFydHktPmFzc2lnbignc3RhcnRmb3JtJywgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCAoJGlkLCAndXBkYXRlb3B0aW9ucycsICRyZXR1cm5pZCkpOwokc21hcnR5LT5hc3NpZ24oJ2VuZGZvcm0nLCAkdGhpcy0+Q3JlYXRlRm9ybUVuZCAoKSk7Cgokc21hcnR5LT5hc3NpZ24oJ3RpdGxlX2dhbGxlcnlfdXJsJywkdGhpcy0+TGFuZygnaGVscF9nYWxsZXJ5X3VybCcpKTsKJHNtYXJ0eS0+YXNzaWduKCdpbnB1dF9nYWxsZXJ5X3VybCcsCgkJJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgkaWQsJ2dhbGxlcnlVcmwnLAoJCQkJICAgICAgICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdnYWxsZXJ5VXJsJywnaHR0cDovL2dhbGxlcnkueW91cmRvbWFpbi5jb20vJyksMTQwKSk7Cgokc21hcnR5LT5hc3NpZ24oJ3RpdGxlX2dhbGxlcnlfcmVzdF9hcGlfa2V5JywkdGhpcy0+TGFuZygnaGVscF9nYWxsZXJ5X3Jlc3RfYXBpX2tleScpKTsKJHNtYXJ0eS0+YXNzaWduKCdpbnB1dF9nYWxsZXJ5X3Jlc3RfYXBpX2tleScsCgkJJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgkaWQsJ2dhbGxlcnlSZXN0QXBpS2V5JywKCQkJCSAgICAgICAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnZ2FsbGVyeVJlc3RBcGlLZXknLCcnKSw2NCkpOwoKJHNtYXJ0eS0+YXNzaWduKCd0aXRsZV9kZWZhdWx0X2l0ZW1pZCcsJHRoaXMtPkxhbmcoJ2hlbHBfaXRlbUlkJykpOwokc21hcnR5LT5hc3NpZ24oJ2lucHV0X2RlZmF1bHRfaXRlbWlkJywKCQkkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwnaXRlbUlkJywKCQkJCSAgICAgICAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnaXRlbUlkJywnJyksNTApKTsKCiRzbWFydHktPmFzc2lnbigndGl0bGVfc2hvd19hbGJ1bV90aXRsZScsJHRoaXMtPkxhbmcoJ2hlbHBfc2hvd0FsYnVtVGl0bGUnKSk7CiRzbWFydHktPmFzc2lnbignaW5wdXRfc2hvd19hbGJ1bV90aXRsZScsCgkJJHRoaXMtPkNyZWF0ZUlucHV0Q2hlY2tib3goJGlkLCdzaG93QWxidW1UaXRsZScsJzEnLAoJCQkJCSAgICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdzaG93QWxidW1UaXRsZScsJzEnKSkpOwoKJHNtYXJ0eS0+YXNzaWduKCd0aXRsZV91c2VfZ2FsbGVyaWEnLCR0aGlzLT5MYW5nKCdoZWxwX3VzZUdhbGxlcmlhJykpOwokc21hcnR5LT5hc3NpZ24oJ2lucHV0X3VzZV9nYWxsZXJpYScsCgkJJHRoaXMtPkNyZWF0ZUlucHV0Q2hlY2tib3goJGlkLCd1c2VHYWxsZXJpYScsJzEnLAoJCQkJCSAgICR0aGlzLT5HZXRQcmVmZXJlbmNlKCd1c2VHYWxsZXJpYScsJzAnKSkpOwoKJHNtYXJ0eS0+YXNzaWduKCdzdWJtaXQnLCAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ29wdGlvbnNzdWJtaXRidXR0b24nLCAkdGhpcy0+TGFuZygnYWRtaW5fc3VibWl0JykpKTsKCiRzbWFydHktPmFzc2lnbigndGl0bGVfZ2FsbGVyeTNfc2V0dGluZ3MnLCR0aGlzLT5MYW5nKCdhZG1pbl9nYWxsZXJ5MycpKTsKCi8vIERpc3BsYXkgdGhlIHBvcHVsYXRlZCB0ZW1wbGF0ZQplY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUgKCdhZG1pbnByZWZzLnRwbCcpOwoKPz4K]]></data>
	</file>
	<file>
	  <filename>/Gallery3.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogU2ltcGxlIGdhbGxlcnkzIGRpc3BsYXkgbW9kdWxlLgogKiBNYWRlIGJ5IFdvdXRlciBkZSBHZXVzICh3b3V0ZXItY21zbXMtZ2FsbGVyeTNAb3dsLWljdC5ubCkKKi8gCmNsYXNzIEdhbGxlcnkzIGV4dGVuZHMgQ01TTW9kdWxlCnsKCWZ1bmN0aW9uIEdldE5hbWUoKQoJewoJCXJldHVybiAnR2FsbGVyeTMnOwoJfQoKCWZ1bmN0aW9uIEdldEZyaWVuZGx5TmFtZSgpCgl7CgkJcmV0dXJuICR0aGlzLT5MYW5nKCdmcmllbmRseW5hbWUnKTsKCX0KCglmdW5jdGlvbiBHZXRWZXJzaW9uKCkKCXsKCQlyZXR1cm4gJzAuMSc7Cgl9CgoJZnVuY3Rpb24gSXNQbHVnaW5Nb2R1bGUoKQoJewoJCSByZXR1cm4gdHJ1ZTsKCX0KCglmdW5jdGlvbiBIYXNBZG1pbigpCgl7CgkJcmV0dXJuIHRydWU7Cgl9CgoJZnVuY3Rpb24gR2V0QWRtaW5TZWN0aW9uKCkKCXsKCQkvLyBUZWxscywgd2hpY2ggdGFiIHdlIHdhbnQgdG8gcHV0IHRoZSBtZW51aXRlbSBvZiBvdXIgbW9kdWxlLgoJCS8vIENhbiBiZSBhdCBsZWFzdCAnY29udGVudCcsICdleHRlbnNpb25zJyBhbmQgJ3VzZXJncm91cHMnICwKCQkvLyBtYXliZSBvdGhlcnMgdG9vLgoJCXJldHVybiAnZXh0ZW5zaW9ucyc7Cgl9CgoJZnVuY3Rpb24gVmlzaWJsZVRvQWRtaW5Vc2VyKCkKCXsKCQlyZXR1cm4gdHJ1ZTsKCX0KCglmdW5jdGlvbiBJbml0aWFsaXplRnJvbnRlbmQoKQoJewoJCSRnQ21zID0gY21zbXMoKTsKCgkJJHRoaXMtPlJlZ2lzdGVyUm91dGUoJyNbZ0ddYWxsZXJ5Lyg/UDxpdGVtSWQ+WzAtOV0rKS4qPyQjJywgIGFycmF5KCdhY3Rpb24nPT4nZGVmYXVsdCcpKTsKCgkJJHRoaXMtPlJlc3RyaWN0VW5rbm93blBhcmFtcygpOwoJCSR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCdpdGVtSWQnLENMRUFOX0lOVCk7CgkJJHRoaXMtPlNldFBhcmFtZXRlclR5cGUoJ3VzZUdhbGxlcmlhJyxDTEVBTl9JTlQpOwoJCSR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCdzaG93QWxidW1UaXRsZScsQ0xFQU5fSU5UKTsKCQkkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgnZ2FsbGVyeVVybCcsQ0xFQU5fU1RSSU5HKTsKCQkkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgnZ2FsbGVyeVJlc3RBcGlLZXknLENMRUFOX1NUUklORyk7CgkJJHRoaXMtPkNyZWF0ZVBhcmFtZXRlcignaXRlbUlkJywxMDY5NCwkdGhpcy0+TGFuZygnaGVscF9pdGVtSWQnKSxmYWxzZSk7CgkJJHRoaXMtPkNyZWF0ZVBhcmFtZXRlcigndXNlR2FsbGVyaWEnLDAsJHRoaXMtPkxhbmcoJ2hlbHBfdXNlR2FsbGVyaWEnKSx0cnVlKTsKCQkkdGhpcy0+Q3JlYXRlUGFyYW1ldGVyKCdzaG93QWxidW1UaXRsZScsMSwkdGhpcy0+TGFuZygnaGVscF9zaG93QWxidW1UaXRsZScpLHRydWUpOwoJCSMgJHRoaXMtPkNyZWF0ZVBhcmFtZXRlcignZ2FsbGVyeVVybCcsMSwkdGhpcy0+TGFuZygnaGVscF9nYWxsZXJ5VXJsJyksdHJ1ZSk7CgkJIyAkdGhpcy0+Q3JlYXRlUGFyYW1ldGVyKCdnYWxsZXJ5UmVzdEFwaUtleScsMSwkdGhpcy0+TGFuZygnaGVscF9nYWxsZXJ5UmVzdEFwaUtleScpLHRydWUpOwoJfQoKCWZ1bmN0aW9uICZMb2FkU3R5bGVzaGVldEJ5TmFtZSgkbmFtZSkKCXsKCQkkcmVzdWx0ID0gZmFsc2U7CgoJCSRnQ21zID0gY21zbXMoKTsKCQkkZGIgPSAkZ0Ntcy0+R2V0RGIoKTsKCgkJJHF1ZXJ5ID0gIlNFTEVDVCBjc3NfaWQsIGNzc19uYW1lLCBjc3NfdGV4dCwgbWVkaWFfdHlwZSBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJjc3MgV0hFUkUgY3NzX25hbWUgPSA/IjsKCQkkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoJHF1ZXJ5LCBhcnJheSgkbmFtZSkpOwoKCQl3aGlsZSAoJGRicmVzdWx0ICYmICRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCkpCgkJewoJCQkkb25lc3R5bGVzaGVldCA9IG5ldyBTdHlsZXNoZWV0KCk7CgkJCSRvbmVzdHlsZXNoZWV0LT5pZCA9ICRyb3dbJ2Nzc19pZCddOwoJCQkkb25lc3R5bGVzaGVldC0+bmFtZSA9ICRyb3dbJ2Nzc19uYW1lJ107CgkJCSRvbmVzdHlsZXNoZWV0LT52YWx1ZSA9ICRyb3dbJ2Nzc190ZXh0J107CgkJCSRvbmVzdHlsZXNoZWV0LT5tZWRpYV90eXBlID0gJHJvd1snbWVkaWFfdHlwZSddOwoJCQkkcmVzdWx0ID0mICRvbmVzdHlsZXNoZWV0OwoJCX0KCgkJcmV0dXJuICRyZXN1bHQ7Cgl9CgoJZnVuY3Rpb24gSW5zdGFsbCgpCgl7CgkJLy8gbXlzcWwtc3BlY2lmaWMsIGJ1dCBpZ25vcmVkIGJ5IG90aGVyIGRhdGFiYXNlCgkJJHRhYm9wdGFycmF5ID0gYXJyYXkoJ215c3FsJyA9PiAnVFlQRT1Jbm5vREInKTsKCgkJLy9NYWtlIGEgbmV3ICJkaWN0aW9uYXJ5IiAoQURPREItc3BlYWsgZm9yIGEgdGFibGUpCgkJLy8gJGRpY3QgPSBOZXdEYXRhRGljdGlvbmFyeSgkZGIpOwoKCQkvL0FkZCB0aGUgZmllbGRzIGFzIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZy4KCQkvLyBTZWUgdGhlIEFET0RCIG1hbnVhbCBmb3IgYSBsaXN0IG9mIGF2YWlsYWJsZSBmaWVsZCB0eXBlcy4KCQkvL0luIG91ciBjYXNlLCB0aGUgaWQgaXMgYW4gaW50ZWdlciwgdGhlIG5hbWUgaXMgYSB2YXJjaGFyKDEwMCkgZmllbGQsCgkJLy8gdGhlIGRlc2NyaXB0aW9uIGlzIGEgdGV4dCBmaWVsZCwgYW5kIHRoZSBwcmljZSBpcyBhIGZsb2F0LgoJCSRmbGRzID0gImlkIEkgS0VZLAoJCQluYW1lIEMoMTAwKSwKCQkJZGVzY3JpcHRpb24gWCwKCQkJcHJpY2UgRiI7CgoJCS8vVGVsbCBBRE9EQiB0byBjcmVhdGUgdGhlIHRhYmxlIGNhbGxlZCAibW9kdWxlX2NhdGxpc3RfcHJvZHVjdHMiLCAKCQkvLyB1c2luZyB0aGUgb3VyIGZpZWxkIGRlc2NyaXB0aW9ucyBmcm9tIGFib3ZlLgoJCS8vTm90ZSB0aGUgbmFtaW5nIHNjaGVtZSB0aGF0IHNob3VsZCBiZSBmb2xsb3dlZCB3aGVuIGFkZGluZyB0YWJsZXMgdG8gdGhlIGRhdGFiYXNlLAoJCS8vIHNvIGFzIHRvIG1ha2UgaXQgZWFzeSB0byByZWNvZ25pemUgd2hvIHRoZSB0YWJsZSBiZWxvbmdzIHRvLCBhbmQgdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCBvdGhlciBtb2R1bGVzLgoJCS8vICRzcWxhcnJheSA9ICRkaWN0LT5DcmVhdGVUYWJsZVNRTChjbXNfZGJfcHJlZml4KCkuJ21vZHVsZV9nYWxsZXJ5M19pbWFnZXMnLCAkZmxkcywgJHRhYm9wdGFycmF5KTsKCQkvLyAkZGljdC0+RXhlY3V0ZVNRTEFycmF5KCRzcWxhcnJheSk7CgoJCS8vTm93IGNyZWF0ZSBhICJzZXF1ZW5jZSIsIHdoaWNoIGlzIHVzZWQgaW50ZXJuYWxseSBieSBDTVNNUyBhbmQgQURPREIKCQkvLyB0byBpbmNyZW1lbnQgb3VyIGlkIHZhbHVlIGVhY2ggdGltZSBhIG5ldyByZWNvcmQgaXMgaW5zZXJ0ZWQgaW50byB0aGUgdGFibGUuCgkJLy8gJGRiLT5DcmVhdGVTZXF1ZW5jZShjbXNfZGJfcHJlZml4KCkuJ21vZHVsZV9tb2R1bGVfZ2FsbGVyeTNfc2VxJyk7CgoJCS8vQWRkIHN0eWxlc2hlZXQKCQkkc3R5bGVzaGVldG9wcyA9IGNtc21zKCktPkdldFN0eWxlc2hlZXRPcGVyYXRpb25zKCk7CgkJaWYoICEkc3R5bGVzaGVldG9wcy0+Q2hlY2tFeGlzdGluZ1N0eWxlc2hlZXROYW1lKCdHYWxsZXJ5MyBNb2R1bGUnKSApCgkJewoJCQkkc3R5bGVzaGVldCA9IG5ldyBTdHlsZXNoZWV0KCk7CgkJCSRzdHlsZXNoZWV0LT5uYW1lID0gJ0dhbGxlcnkzIE1vZHVsZSc7CgkJCSRzdHlsZXNoZWV0LT52YWx1ZSA9IGZpbGVfZ2V0X2NvbnRlbnRzKCR0aGlzLT5HZXRNb2R1bGVQYXRoKCkuJy9jc3Mvc3R5bGVzaGVldC5jc3MnKTsKCQkJJHN0eWxlc2hlZXQtPm1lZGlhX3R5cGUgPSAnc2NyZWVuJzsKCQkJJHN0eWxlc2hlZXRvcHMtPkluc2VydFN0eWxlc2hlZXQoJHN0eWxlc2hlZXQpOwoJCX0KCgkJLy9BZGQgZ2xvYmFsIGNvbnRlbnQgYmxvY2sgZm9yIGdhbGxlcmlhCgkJJGdsb2JhbGNvbnRlbnRvcHMgPSBjbXNtcygpLT5HZXRHbG9iYWxDb250ZW50T3BlcmF0aW9ucygpOwoJCWlmKCAhJGdsb2JhbGNvbnRlbnRvcHMtPkNoZWNrRXhpc3RpbmdIdG1sQmxvYk5hbWUoJ0dhbGxlcnkzIGdhbGxlcmlhJykgKQoJCXsKCQkJJGdsb2JhbGNvbnRlbnQgPSBuZXcgR2xvYmFsQ29udGVudCgpOwoJCQkkZ2xvYmFsY29udGVudC0+bmFtZSA9ICdHYWxsZXJ5MyBnYWxsZXJpYSc7CgkJCSRnbG9iYWxjb250ZW50LT5jb250ZW50ID0gZmlsZV9nZXRfY29udGVudHMoJHRoaXMtPkdldE1vZHVsZVBhdGgoKS4nL3RlbXBsYXRlcy9nYWxsZXJpYS1pbmNsdWRlLnRwbCcpOwoJCQkkZ2xvYmFsY29udGVudC0+dXNlX3d5c2l3eWcgPSAwOwoJCQkkZ2xvYmFsY29udGVudG9wcy0+SW5zZXJ0SHRtbEJsb2IoJGdsb2JhbGNvbnRlbnQpOwoJCX0KCgkJLy9DcmVhdGUgYSBwZXJtaXNzaW9uCgkJLy9UaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIG5hbWUgZm9yIHRoZSBwZXJtaXNzaW9uIHRoYXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBzeXN0ZW0uCgkJLy9UaGUgc2Vjb25kIGFyZ3VtZW50IGlzIGEgbW9yZSBkZXRhaWxlZCBleHBsYW5hdGlvbiBvZiB0aGUgcGVybWlzc2lvbi4KCQkvLyAkdGhpcy0+Q3JlYXRlUGVybWlzc2lvbignR2FsbGVyeTMgQWRtaW4nLCAnQ2F0bGlzdCcpOwoJfQoKCWZ1bmN0aW9uIEluc3RhbGxQb3N0TWVzc2FnZSgpCgl7CgkJcmV0dXJuICR0aGlzLT5MYW5nKCdwb3N0aW5zdGFsbCcpOwoJfQoJZnVuY3Rpb24gVW5pbnN0YWxsKCkKCXsKCQkvL1JlbW92ZSBzdHlsZXNoZWV0CgkJJHN0eWxlc2hlZXRvcHMgPSBjbXNtcygpLT5HZXRTdHlsZXNoZWV0T3BlcmF0aW9ucygpOwoJCSRzdHlsZXNoZWV0ID0gJHRoaXMtPkxvYWRTdHlsZXNoZWV0QnlOYW1lKCdHYWxsZXJ5MyBNb2R1bGUnKTsKCQkkc3R5bGVzaGVldG9wcy0+RGVsZXRlU3R5bGVzaGVldEJ5SUQoJHN0eWxlc2hlZXQtPmlkKTsKCgkJLy9SZW1vdmUgZ2xvYmFsIGNvbnRlbnQgYmxjb2sKCQkkZ2xvYmFsY29udGVudG9wcyA9IGNtc21zKCktPkdldEdsb2JhbENvbnRlbnRPcGVyYXRpb25zKCk7CgkJJGdsb2JhbGNvbnRlbnQgPSAkZ2xvYmFsY29udGVudG9wcy0+TG9hZEh0bWxCbG9iQnlOYW1lKCdHYWxsZXJ5MyBnYWxsZXJpYScpOwoJCSRnbG9iYWxjb250ZW50b3BzLT5EZWxldGVIdG1sQmxvYkJ5SUQoJGdsb2JhbGNvbnRlbnQtPmlkKTsKCgkJLy9SZW1vdmUgdGhlIHBlcm1pc3Npb24KCQkvLyAkdGhpcy0+UmVtb3ZlUGVybWlzc2lvbignR2FsbGVyeTMgQWRtaW4nKTsKCX0KCglmdW5jdGlvbiBVbmluc3RhbGxQcmVNZXNzYWdlKCkKCXsKCQlyZXR1cm4gJHRoaXMtPkxhbmcoJ3VuaW5zdGFsbF9jb25maXJtJyk7Cgl9CgoJZnVuY3Rpb24gVW5pbnN0YWxsUG9zdE1lc3NhZ2UoKQoJewoJCXJldHVybiAkdGhpcy0+TGFuZygncG9zdHVuaW5zdGFsbCcpOwoJfQoKCWZ1bmN0aW9uIEdldEhlbHAoKQoJewoJCXJldHVybiAkdGhpcy0+TGFuZygnaGVscCcpOwoJfQoKCWZ1bmN0aW9uIGdldFJlc3RJdGVtcygkdXJscywgJGdldE1lbWJlcnMgPSAwKQoJewoJCSRtYyA9IGN1cmxfbXVsdGlfaW5pdCgpOwoJCSRoYW5kbGVzID0gYXJyYXkoKTsKCgkJIyBHZXQgc2V0dGluZ3MKCQkkZ2FsbGVyeVVybCA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdnYWxsZXJ5VXJsJyk7CgkJJHJlc3RBcGlLZXkgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnZ2FsbGVyeVJlc3RBcGlLZXknKTsKCQlpZiAoZW1wdHkoJGdhbGxlcnlVcmwpKQoJCXsKCQkJZWNobyAiPGgyPkVSUk9SPC9oMj48cD5HYWxsZXJ5MyBSZXN0IFVSTCBtaXNzaW5nISBDaGVjayB5b3VyIG1vZHVsZSBzZXR0aW5ncyE8L3A+IjsKCQkJcmV0dXJuOwoJCX0KCQlpZiAoZW1wdHkoJHJlc3RBcGlLZXkpKQoJCXsKCQkJZWNobyAiPGgyPkVSUk9SPC9oMj48cD5HYWxsZXJ5MyBSZXN0IEFwaSBrZXkgbWlzc2luZyEgQ2hlY2sgeW91ciBtb2R1bGUgc2V0dGluZ3MhPC9wPiI7CgkJCXJldHVybjsKCQl9CgoJCSRjID0gY3VybF9pbml0KCk7CgkJY3VybF9zZXRvcHQoJGMsIENVUkxPUFRfVkVSQk9TRSwgMCk7CgkJY3VybF9zZXRvcHQoJGMsIENVUkxPUFRfSEVBREVSLCAwKTsgLy8gZGlzYWJsZSBvdXRwdXQgaGVhZGVyCgkJY3VybF9zZXRvcHQoJGMsIENVUkxPUFRfSFRUUEhFQURFUiwgYXJyYXkoIlgtR2FsbGVyeS1SZXF1ZXN0LU1ldGhvZDogZ2V0IiwiWC1HYWxsZXJ5LVJlcXVlc3QtS2V5OiAkcmVzdEFwaUtleSIsICJDb250ZW50LUxlbmd0aDogMCIpKTsKCQljdXJsX3NldG9wdCgkYywgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7IC8vIHdpdGhvdXQgdGhpcyB0aGV5IGlkaW90cyBvdXRwdXQgdGhlIHJlc3VsdHMKCQljdXJsX3NldG9wdCgkYywgQ1VSTE9QVF9USU1FT1VULCA4KTsKCgkJZm9yZWFjaCAoJHVybHMgYXMgJGluZGV4ID0+ICR1cmwpCgkJewoJCQkkY3QgPSBjdXJsX2NvcHlfaGFuZGxlKCRjKTsKCQkJaWYgKHByZWdfbWF0Y2goJy9cL2l0ZW1cLyhbXGRdKykvJywgJHVybCwgJG1hdGNoZXMpKQoJCQl7CgkJCQkkdXJsID0gJG1hdGNoZXNbMV07CgkJCX0KCQkJIyBjdXJsX3NldG9wdCgkY3QsIENVUkxPUFRfVVJMLCAiaHR0cDovL2dhbGxlcnkub3dsLWljdC5ubC9yZXN0L2l0ZW0vJHVybCIpOwoJCQljdXJsX3NldG9wdCgkY3QsIENVUkxPUFRfVVJMLCAiJGdhbGxlcnlVcmwvcmVzdC9pdGVtLyR1cmwiKTsKCQkJY3VybF9tdWx0aV9hZGRfaGFuZGxlKCRtYywkY3QpOwoJCQlhcnJheV9wdXNoKCRoYW5kbGVzLCAkY3QpOwoJCX0KCgkJLy8gRmV0Y2ggdGltZS4KCQkkcnVubmluZz1udWxsOwoJCWRvCgkJewoJCQljdXJsX211bHRpX2V4ZWMoJG1jLCRydW5uaW5nKTsKCQkJLy8gYWRkZWQgYSB1c2xlZXAgZm9yIDAuMSBzZWNvbmRzIHRvIHJlZHVjZSBsb2FkCgkJCXVzbGVlcCAoMTAwMDAwKTsKCQl9IHdoaWxlICgkcnVubmluZyA+IDApOwoKCQkvLyBSZXN1bHRzLgoJCSRyZXQgPSBhcnJheSgpOwoJCWZvcigkaT0wOyRpPGNvdW50KCRoYW5kbGVzKTskaSsrKQoJCXsKCQkJJHJlcyA9IGN1cmxfbXVsdGlfZ2V0Y29udGVudCgkaGFuZGxlc1skaV0pOwoJCQljdXJsX211bHRpX3JlbW92ZV9oYW5kbGUoJG1jLCRoYW5kbGVzWyRpXSk7CgkJCSRyZXN0ID0ganNvbl9kZWNvZGUoJHJlcywgdHJ1ZSk7CgkJCSRpdGVtID0gKGFycmF5KSRyZXN0WydlbnRpdHknXTsKCQkJJGl0ZW1bJ2FsYnVtcyddID0gQXJyYXkoKTsKCQkJJGl0ZW1bJ3Bob3RvcyddID0gQXJyYXkoKTsKCQkJYXJyYXlfcHVzaCgkcmV0LCAkaXRlbSk7CgkJfQoJCWN1cmxfbXVsdGlfY2xvc2UoJG1jKTsKCQlyZXR1cm4gJHJldDsKCX0KCglmdW5jdGlvbiBnZXRSZXN0SXRlbSgkaXRlbUlkLCAkZ2V0TWVtYmVycyA9IDApCgl7CgkJaWYgKHByZWdfbWF0Y2goJy9cL2l0ZW1cLyhbXGRdKykvJywgJGl0ZW1JZCwgJG1hdGNoZXMpKQoJCXsKCQkJJGl0ZW1JZCA9ICRtYXRjaGVzWzFdOwoJCX0KCgkJIyBHZXQgc2V0dGluZ3MKCQkkZ2FsbGVyeVVybCA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdnYWxsZXJ5VXJsJyk7CgkJJHJlc3RBcGlLZXkgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnZ2FsbGVyeVJlc3RBcGlLZXknKTsKCQlpZiAoZW1wdHkoJGdhbGxlcnlVcmwpKQoJCXsKCQkJZWNobyAiPGgyPkVSUk9SPC9oMj48cD5HYWxsZXJ5MyBSZXN0IFVSTCBtaXNzaW5nISBDaGVjayB5b3VyIG1vZHVsZSBzZXR0aW5ncyE8L3A+IjsKCQkJcmV0dXJuOwoJCX0KCQlpZiAoZW1wdHkoJHJlc3RBcGlLZXkpKQoJCXsKCQkJZWNobyAiPGgyPkVSUk9SPC9oMj48cD5HYWxsZXJ5MyBSZXN0IEFwaSBrZXkgbWlzc2luZyEgQ2hlY2sgeW91ciBtb2R1bGUgc2V0dGluZ3MhPC9wPiI7CgkJCXJldHVybjsKCQl9CgoJCSRjID0gY3VybF9pbml0KCk7CgkJY3VybF9zZXRvcHQoJGMsIENVUkxPUFRfVVJMLCAiJGdhbGxlcnlVcmwvcmVzdC9pdGVtLyRpdGVtSWQiKTsKCQljdXJsX3NldG9wdCgkYywgQ1VSTE9QVF9WRVJCT1NFLCAwKTsKCQljdXJsX3NldG9wdCgkYywgQ1VSTE9QVF9IRUFERVIsIDApOyAvLyBkaXNhYmxlIG91dHB1dCBoZWFkZXIKCQljdXJsX3NldG9wdCgkYywgQ1VSTE9QVF9IVFRQSEVBREVSLCBhcnJheSgiWC1HYWxsZXJ5LVJlcXVlc3QtTWV0aG9kOiBnZXQiLCJYLUdhbGxlcnktUmVxdWVzdC1LZXk6ICRyZXN0QXBpS2V5IiwgIkNvbnRlbnQtTGVuZ3RoOiAwIikpOwoJCWN1cmxfc2V0b3B0KCRjLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCAxKTsgLy8gd2l0aG91dCB0aGlzIHRoZXkgaWRpb3RzIG91dHB1dCB0aGUgcmVzdWx0cwoKCQkkcmVzID0gY3VybF9leGVjKCRjKTsKCQlpZihjdXJsX2Vycm5vKCRjKSkKCQl7CgkJCWVjaG8gJ0N1cmwgZXJyb3I6ICcgLiBjdXJsX2Vycm9yKCRjKTsKCQkJcmV0dXJuOwoJCX0KCQljdXJsX2Nsb3NlKCRjKTsKCgkJLy8gRGVjb2RlIEpTT04KCQkkcmVzdCA9IGpzb25fZGVjb2RlKCRyZXMsIHRydWUpOwoKCQkvLyBUdXJuIGl0IGludG8gc29tZXRoaW5nIHVzZWZ1bC4KCQkkaXRlbSA9IChhcnJheSkkcmVzdFsnZW50aXR5J107CgkJJGl0ZW1bJ2FsYnVtcyddID0gQXJyYXkoKTsKCQkkaXRlbVsncGhvdG9zJ10gPSBBcnJheSgpOwoKCQkvLyBJZiB0aGlzIGlzIGFuIGFsYnVtLCBhZGQgbWVtYmVycwoJCWlmICgkZ2V0TWVtYmVycykKCQl7CgkJCSR1cmxzID0gQXJyYXkoKTsKCQkJaWYgKGNvdW50KCRyZXN0WydtZW1iZXJzJ10pIDwgMSkKCQkJewoJCQkJcHJpbnQgIjxwPk5vIGl0ZW1zIGZvdW5kITwvcD4iOwoJCQkJcmV0dXJuOwoJCQl9CgkJCWZvcmVhY2ggKCRyZXN0WydtZW1iZXJzJ10gYXMgJGluZGV4ID0+ICR1cmwpCgkJCXsKCQkJCWFycmF5X3B1c2goJHVybHMsICR1cmwpOwoJCQl9CgkJCSRyZXN1bHQgPSAkdGhpcy0+Z2V0UmVzdEl0ZW1zKCR1cmxzLCAwKTsKCQkJaWYgKCFjb3VudCgkcmVzdWx0KSkKCQkJewoJCQkJcHJpbnQgIjxwPk5vIGl0ZW1zIGZvdW5kITwvcD4iOwoJCQkJcmV0dXJuOwoJCQl9CgkJCWZvcmVhY2ggKCRyZXN1bHQgYXMgJGluZGV4ID0+ICR0bXApCgkJCXsKCQkJCWlmICgkdG1wWyd0eXBlJ10gPT0gJ2FsYnVtJykKCQkJCXsKCQkJCQkkcHJldHR5dXJsID0gJ2dhbGxlcnkvJyAuICR0bXBbJ2lkJ10uJy8nOwoJCQkJCS8vIENyZWF0ZUxpbmsoJGlkLCAkYWN0aW9uLCAkcmV0dXJuaWQ9JycsICRjb250ZW50cz0nJywgJHBhcmFtcz1hcnJheSgpLCAkd2Fybl9tZXNzYWdlPScnLCAkb25seWhyZWY9ZmFsc2UsICRpbmxpbmU9ZmFsc2UsICRhZGR0dGV4dD0nJywgJHRhcmdldGNvbnRlbnRvbmx5PWZhbHNlLCAkcHJldHR5dXJsPScnKQoJCQkJCS8vCgkJCQkJJHAgPSBhcnJheSgpOwoJCQkJCSRwWydpdGVtSWQnXSA9ICR0bXBbJ2lkJ107CgkJCQkJJHRtcFsnX2xpbmt1cmwnXSA9ICR0aGlzLT5DcmVhdGVMaW5rKCR0bXBbJ2lkJ10sICdkZWZhdWx0JywgJycsICcnLCAkcCwnJywgdHJ1ZSwgZmFsc2UsICcnLCBmYWxzZSwgJHByZXR0eXVybCk7CgkJCQl9CgkJCQlpZiAoaXNzZXQoJHRtcFsndGh1bWJfdXJsX3B1YmxpYyddKSkKCQkJCXsgLy8gc2tpcCBub24tcHVibGljIHRoaW5ncwoJCQkJCWlmICgkdG1wWyd0eXBlJ10gPT0gJ2FsYnVtJykKCQkJCQl7CgkJCQkJCWFycmF5X3B1c2goJGl0ZW1bJ2FsYnVtcyddLCAkdG1wKTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJYXJyYXlfcHVzaCgkaXRlbVsncGhvdG9zJ10sICR0bXApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCQllbHNlCgkJewoJCQkkaXRlbVsnbWVtYmVycyddID0gJHJlc3RbJ21lbWJlcnMnXTsKCQl9CgoJCS8vIHByaW50ICc8aDQ+Z2V0UmVzdEl0ZW0gZGVidWchPC9oND48cHJlPic7cHJpbnRfcigkcmVzdCk7cHJpbnQnPC9wcmU+JzsKCQkvLyBwcmludCAnPGg0PmdldFJlc3RJdGVtIGRlYnVnITwvaDQ+PHByZT4nO3ByaW50X3IoJGl0ZW0pO3ByaW50JzwvcHJlPic7CgoJCXJldHVybiAkaXRlbTsKCX0KfQo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCSRsYW5nWydmcmllbmRseW5hbWUnXSAgICAgID0gJ0dhbGxlcnkzIE1vZHVsZSB0byBkaXNwbGF5IGFsYnVtcy9pbWFnZXMnOwoJJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gICAgICAgPSAnR2FsbGVyeTMgTW9kdWxlIGluc3RhbGxlZC4nOwoJJGxhbmdbJ3VuaW5zdGFsbF9jb25maXJtJ10gPSAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHJlbW92ZSBhbGwgdHJhY2VzIG9mIHRoZSBHYWxsZXJ5MyBNb2R1bGU/JzsKCSRsYW5nWydwb3N0dW5pbnN0YWxsJ10gICAgID0gJ0dhbGxlcnkzIE1vZHVsZSBoYXMgYmVlbiBjb21wbGV0ZWx5IHJlbW92ZWQuJzsKCSRsYW5nWydoZWxwX2l0ZW1JZCddICAgICAgICAgPSAnSXRlbUlkIHRvIHNob3cuIEZpbmQgaXQgZnJvbSB5b3VyIGdhbGxlcnksIHRyeSBlZGl0IGFsYnVtIG9yIHBob3RvIGFuZCBjaGVjayB0aGUgdXJsLic7CgkkbGFuZ1snaGVscF91c2VHYWxsZXJpYSddICAgID0gJ0VuYWJsZSBHYWxsZXJpYSB0byBkaXNwbGF5IGltYWdlcy4nOwoJJGxhbmdbJ2hlbHBfc2hvd0FsYnVtVGl0bGUnXSA9ICdTaG93IEFsYnVtIFRpdGxlcy4nOwoJJGxhbmdbJ2FkbWluX2dhbGxlcnkzJ10gICAgICA9ICdHYWxsZXJ5MyBzZXR0aW5ncyc7CgkkbGFuZ1snYWRtaW5fc3VibWl0J10gICAgICAgID0gJ1NhdmUnOwoJJGxhbmdbJ2FkbWluX3VwZGF0ZWQnXSAgICAgICA9ICdTZXR0aW5ncyB1cGRhdGVkLic7CgkkbGFuZ1snaGVscF9nYWxsZXJ5X3Jlc3RfYXBpX2tleSddID0gJ0dhbGxlcnkzIFJFU1QgQVBJIEtleS4gVG8gZmluZCB0aGlzIGdvIHRvIHlvdXIgR2FsbGVyeSAzIHVzZXIgcHJvZmlsZS4nOwoJJGxhbmdbJ2hlbHBfZ2FsbGVyeV91cmwnXSAgICA9ICdNYWluIFVSTCB0byB5b3VyIEdhbGxlcnkgMy4gRm9yIGV4YW1wbGU6IGh0dHA6Ly95b3VyLmRvbWFpbi5jb20vZ2FsbGVyeTMvJzsKJGxhbmdbJ2hlbHAnXSA9IDw8PEVPRgo8aDM+V2hhdCBkb2VzIHRoaXMgZG8/PC9oMz4KPHA+R2FsbGVyeSAzIGlzIGEgbW9kdWxlIHRvIGRpc3BsYXkgYWxidW1zIGFuZCBpbWFnZXMgZnJvbSB5b3VyIEdhbGxlcnkzIGluc3RhbGxhdGlvbiBpbiBDTVMgTWFkZSBTaW1wbGUuCldoZW4gdGhlIG1vZHVsZSBpcyBpbnN0YWxsZWQsIGEgR2FsbGVyeSAzIGFkbWluIHBhZ2UgaXMgYWRkZWQgdG8gdGhlIEV4dGVuc2lvbnMgbWVudSB0aGF0IHdpbGwgYWxsb3cgeW91IHRvIHNldCB0aGUgcmVxdWlyZWQgb3B0aW9ucy48L3A+CjxoMj5HZXR0aW5nIHN0YXJ0ZWQ8L2gyPgo8cD4KQWZ0ZXIgaW5zdGFsbGluZyB0aGUgbW9kdWxlIHlvdSB3aWxsIGhhdmUgdG8gZG8gYSBjb3VwbGUgdGhpbmdzIHRvIG1ha2UgdGhlIG1vZHVsZSB3b3JrIGNvbXBsZXRlbHkuCjwvcD4KPGg0PjEuIEF0dGFjaCB0aGUgR2FsbGVyeTMgTW9kdWxlIHN0eWxlc2hlZXQgdG8geW91ciB0ZW1wbGF0ZShzKTwvaDQ+CjxwPlRoZSBtb2R1bGUgd2lsbCBpbnN0YWxsIGEgbmV3IFN0eWxlc2hlZXQgbmFtZWQgJ0dhbGxlcnkzIE1vZHVsZScgaW4gTGF5b3V0IC0+IFN0eWxlc2hlZXRzLiBUaGlzIHN0eWxlc2hlZXQgbmVlZHMgdG8gYmUgYXR0YWNoZWQgbWFudWFsbHkgdG8gdGhlIGRlc2lyZWQgdGVtcGxhdGVzLjwvcD4KPGg0PjIuIENoYW5nZSByZXF1aXJlZCBvcHRpb25zPC9oND4KPHA+ClNldCB0aGUgcmVxdWlyZWQgb3B0aW9ucyBpbiBFeHRlbnNpb25zIC0+IEdhbGxlcnkgMwo8L3A+CjxwPgo8c3Ryb25nPk1haW4gVVJMOjwvc3Ryb25nPjxici8+ClNldCB0aGlzIHRvIHRoZSBtYWluIHBhZ2Ugb2YgdGhlIEdhbGxlcnkgMyBpbnN0YWxsYXRpb24geW91IHdhbnQgdG8gdXNlLgo8L3A+CjxwPgo8c3Ryb25nPkdhbGxlcnkzIFJFU1QgQVBJIEtleTo8L3N0cm9uZz48YnIvPgpFdmVyeSBHYWxsZXJ5IDMgdXNlciBoYXMgaGlzLyBoZXIgb3duIFJFU1QgQVBJIEtleS4gWW91IGNhbiBmaW5kIHRoaXMga2V5IGJ5IGdvaW5nIHRvIHRoZSBhZG1pbiBwYW5lbCBvZiB5b3VyIEdhbGxlcnkgMyBpbnN0YWxsYXRpb24gYW5kICdFZGl0JyB0aGUgdXNlciB5b3Ugd2FudCB0byB1c2UuIFRoZSBrZXkgaXMgbGlzdGVkIGFzICdSZW1vdGUgYWNjZXNzIGtleScuCjwvcD4KPHA+CjxzdHJvbmc+SXRlbUlkOjwvc3Ryb25nPjxici8+ClRoZSBHYWxsZXJ5IDMgaXRlbSBpZCBvZiB0aGUgYWxidW0gb3IgcGhvdG8geW91IHdhbnQgdG8gc2hvdy4gV2hlbiB0aGlzIGlzIHRoZSBpZCBvZiBhbiBhbGJ1bSwgaXQgd2lsbCBiZSB1c2VkIGFzIHRoZSAncm9vdCcgYWxidW0gdG8gc2hvdyBpbiB5b3VyIENNUyBNYWRlIFNpbXBsZSBwYWdlLgpUaGVyZSBpcyBubyBzaW1wbGUgd2F5IHRvIGZpbmQgdGhpcyBpZC48YnIvPgpUbyBmaW5kIHRoZSBpZCBvZiBhbiBhbGJ1bSB5b3UgY2FuIGdvIGludG8gdGhpcyBhbGJ1bSBzbyB5b3Ugd2lsbCBnZXQgdGhlICdBbGJ1bSBvcHRpb25zJyBsaW5rIGFuZCB0aGVuIGNoZWNrIHRoZSBzb3VyY2Ugb2YgdGhlIHBhZ2UuIFVuZGVyIDxwcmU+PGxpIHRpdGxlPSJBbGJ1bSBvcHRpb25zIj48L3ByZT4geW91IHdpbGwgZmluZCBzZXZlcmFsIGxpbmtzIHdpdGggYWxsIHVzaW5nIHRoZSBzYW1lIG51bWJlciBpbiBpdC4gVGhpcyBpcyB0aGUgSWQgb2YgeW91ciBhbGJ1bS48YnIvPgpZb3UgY2FuIGRvIHRoZSBzYW1lIGZvciBhIHNwZWNpZmljIHBob3RvLiBHbyB0byB0aGUgcGhvdG8geW91IHdhbnQgdG8gc2hvdyBzbyB5b3Ugd2lsbCBnZXQgdGhlICdQaG90byBvcHRpb25zJyBtZW51IG9uIHRvcC4gVEhlbiBjaGVjayB0aGUgc291cmNlIG9mIHRoZSBwYWdlLiBVbmRlciA8cHJlPjxsaSB0aXRsZT0iUGhvdG8gb3B0aW9ucyI+PC9wcmU+IHlvdSB3aWxsIGZpbmQgdGhlIGxpbmtzIHdpdGggdGhlIElkIG9mIHlvdXIgcGhvdG8gaW4gaXQuCjwvcD4KPHA+CjxzdHJvbmc+U2hvdyBBbGJ1bSBUaXRsZXM6PC9zdHJvbmc+PGJyLz4KV2hlbiB0aGlzIGlzIGNoZWNrZWQsIHRoZSBtb2R1bGUgd2lsbCBnZW5lcmF0ZSBhIGgyIHRhZyB3aXRoIHRoZSBhbGJ1bSB0aXRsZSBpbiBpdC4KPC9wPgo8cD4KPHN0cm9uZz5FbmFibGUgR2FsbGVyaWEgdG8gZGlzcGxheSBpbWFnZXM6PC9zdHJvbmc+PGJyLz4KR2FsbGVyaWEgaXMgYSBuaWNlIGpxdWVyeSBhZGRvbiB0aGF0IGRpc3BsYXlzIHlvdXIgaW1hZ2VzIGluIGEgbW9yZSBmYW5jeSB3YXkuIFRoZSBHYWxsZXJ5IDMgbW9kdWxlIGRpc3RyaWJ1dGVzIGFsbCByZXF1aXJlZCBmaWxlcyB0byB1c2UgdGhpcyBhZGRvbiBmb3IgZGlzcGxheWluZyB5b3VyIEdhbGxlcnkgMyBwaG90bydzIGluIENNUyBNYWRlIFNpbXBsZS4gU2ltcGx5IGNoZWNrIHRoaXMgY2hlY2tib3ggYW5kIHRoZSBHbG9iYWwgQ29udGVudCBCbG9jayAnR2FsbGVyeTMgZ2FsbGVyaWEnIHRoYXQgaGFzIGJlZW4gYWRkZWQgZHVyaW5nIGluc3RhbGxhdGlvbiBvZiB0aGlzIG1vZHVsZSB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgaW5jbHVkZWQgaW4gdGhlIHRlbXBsYXRlLjxici8+Ck1vcmUgaW5mb3JtYXRpbiBhYm91dCBHYWxsZXJpYSBjYW4gYmUgZm91bmQgaGVyZTogPGEgaHJlZj0iaHR0cDovL2dhbGxlcmlhLmlvL2RvY3MvIj5HYWxsZXJpYSBkb2N1bWVudGF0aW9uPC9hPi4KPC9wPgo8aDQ+My4gSW5jbHVkZSB0aGUgbW9kdWxlIGluIHlvdXIgcGFnZTwvaDQ+CllvdSBjYW4gaW5jbHVkZSB0aGUgbW9kdWxlIGluIHlvdXIgcGFnZSBieSB1c2luZyB0aGUgZm9sbG93aW5nIHRhZzoge2Ntc19tb2R1bGUgbW9kdWxlPSdHYWxsZXJ5Myd9CjxoMz5UaGluZ3MgdG8ga25vdzwvaDM+CjxwPgpUaGUgUkVTVCBBUEkgS2V5IGlzIG9ubHkgdXNlZCB0byBnZXQgYWxsIGFsYnVtIGFuZCBpbWFnZSBpbmZvcm1hdGlvbiB0byBnZW5lcmF0ZSB0aGUgaHRtbCBmb3IgQ01TIE1hZGUgU2ltcGxlLiBBZnRlciB0aGF0LCB0aGUgcHVibGljIHVybHMgYXJlIHVzZWQuIFRoaXMgbWVhbnMgdGhhdCBvbmx5IGltYWdlcyB0aGF0IGFyZSB2aXNpYmxlIGZvciBndWVzdCB1c2VycyB3aWxsIGJlIGRpc3BsYXllZC4gWW91IHdpbGwgbW9zdGxpa2VseSBhbG1vc3QgZW5kIHVwIHVzaW5nIHRoZSBSRVNUIEFQSSBLZXkgZnJvbSB0aGUgZ3Vlc3QgYWNjb3VudCBvZiBHYWxsZXJ5IDMuCjwvcD4KRU9GOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/script/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/script/jquery-1.6.2.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjEuNi4yCiAqIGh0dHA6Ly9qcXVlcnkuY29tLwogKgogKiBDb3B5cmlnaHQgMjAxMSwgSm9obiBSZXNpZwogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBJbmNsdWRlcyBTaXp6bGUuanMKICogaHR0cDovL3NpenpsZWpzLmNvbS8KICogQ29weXJpZ2h0IDIwMTEsIFRoZSBEb2pvIEZvdW5kYXRpb24KICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCwgQlNELCBhbmQgR1BMIExpY2Vuc2VzLgogKgogKiBEYXRlOiBUaHUgSnVuIDMwIDE0OjE2OjU2IDIwMTEgLTA0MDAKICovCihmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGN2KGEpe3JldHVybiBmLmlzV2luZG93KGEpP2E6YS5ub2RlVHlwZT09PTk/YS5kZWZhdWx0Vmlld3x8YS5wYXJlbnRXaW5kb3c6ITF9ZnVuY3Rpb24gY3MoYSl7aWYoIWNnW2FdKXt2YXIgYj1jLmJvZHksZD1mKCI8IithKyI+IikuYXBwZW5kVG8oYiksZT1kLmNzcygiZGlzcGxheSIpO2QucmVtb3ZlKCk7aWYoZT09PSJub25lInx8ZT09PSIiKXtjaHx8KGNoPWMuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksY2guZnJhbWVCb3JkZXI9Y2gud2lkdGg9Y2guaGVpZ2h0PTApLGIuYXBwZW5kQ2hpbGQoY2gpO2lmKCFjaXx8IWNoLmNyZWF0ZUVsZW1lbnQpY2k9KGNoLmNvbnRlbnRXaW5kb3d8fGNoLmNvbnRlbnREb2N1bWVudCkuZG9jdW1lbnQsY2kud3JpdGUoKGMuY29tcGF0TW9kZT09PSJDU1MxQ29tcGF0Ij8iPCFkb2N0eXBlIGh0bWw+IjoiIikrIjxodG1sPjxib2R5PiIpLGNpLmNsb3NlKCk7ZD1jaS5jcmVhdGVFbGVtZW50KGEpLGNpLmJvZHkuYXBwZW5kQ2hpbGQoZCksZT1mLmNzcyhkLCJkaXNwbGF5IiksYi5yZW1vdmVDaGlsZChjaCl9Y2dbYV09ZX1yZXR1cm4gY2dbYV19ZnVuY3Rpb24gY3IoYSxiKXt2YXIgYz17fTtmLmVhY2goY20uY29uY2F0LmFwcGx5KFtdLGNtLnNsaWNlKDAsYikpLGZ1bmN0aW9uKCl7Y1t0aGlzXT1hfSk7cmV0dXJuIGN9ZnVuY3Rpb24gY3EoKXtjbj1ifWZ1bmN0aW9uIGNwKCl7c2V0VGltZW91dChjcSwwKTtyZXR1cm4gY249Zi5ub3coKX1mdW5jdGlvbiBjZigpe3RyeXtyZXR1cm4gbmV3IGEuQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTEhUVFAiKX1jYXRjaChiKXt9fWZ1bmN0aW9uIGNlKCl7dHJ5e3JldHVybiBuZXcgYS5YTUxIdHRwUmVxdWVzdH1jYXRjaChiKXt9fWZ1bmN0aW9uIGIkKGEsYyl7YS5kYXRhRmlsdGVyJiYoYz1hLmRhdGFGaWx0ZXIoYyxhLmRhdGFUeXBlKSk7dmFyIGQ9YS5kYXRhVHlwZXMsZT17fSxnLGgsaT1kLmxlbmd0aCxqLGs9ZFswXSxsLG0sbixvLHA7Zm9yKGc9MTtnPGk7ZysrKXtpZihnPT09MSlmb3IoaCBpbiBhLmNvbnZlcnRlcnMpdHlwZW9mIGg9PSJzdHJpbmciJiYoZVtoLnRvTG93ZXJDYXNlKCldPWEuY29udmVydGVyc1toXSk7bD1rLGs9ZFtnXTtpZihrPT09IioiKWs9bDtlbHNlIGlmKGwhPT0iKiImJmwhPT1rKXttPWwrIiAiK2ssbj1lW21dfHxlWyIqICIra107aWYoIW4pe3A9Yjtmb3IobyBpbiBlKXtqPW8uc3BsaXQoIiAiKTtpZihqWzBdPT09bHx8alswXT09PSIqIil7cD1lW2pbMV0rIiAiK2tdO2lmKHApe289ZVtvXSxvPT09ITA/bj1wOnA9PT0hMCYmKG49byk7YnJlYWt9fX19IW4mJiFwJiZmLmVycm9yKCJObyBjb252ZXJzaW9uIGZyb20gIittLnJlcGxhY2UoIiAiLCIgdG8gIikpLG4hPT0hMCYmKGM9bj9uKGMpOnAobyhjKSkpfX1yZXR1cm4gY31mdW5jdGlvbiBiWihhLGMsZCl7dmFyIGU9YS5jb250ZW50cyxmPWEuZGF0YVR5cGVzLGc9YS5yZXNwb25zZUZpZWxkcyxoLGksaixrO2ZvcihpIGluIGcpaSBpbiBkJiYoY1tnW2ldXT1kW2ldKTt3aGlsZShmWzBdPT09IioiKWYuc2hpZnQoKSxoPT09YiYmKGg9YS5taW1lVHlwZXx8Yy5nZXRSZXNwb25zZUhlYWRlcigiY29udGVudC10eXBlIikpO2lmKGgpZm9yKGkgaW4gZSlpZihlW2ldJiZlW2ldLnRlc3QoaCkpe2YudW5zaGlmdChpKTticmVha31pZihmWzBdaW4gZClqPWZbMF07ZWxzZXtmb3IoaSBpbiBkKXtpZighZlswXXx8YS5jb252ZXJ0ZXJzW2krIiAiK2ZbMF1dKXtqPWk7YnJlYWt9a3x8KGs9aSl9aj1qfHxrfWlmKGope2ohPT1mWzBdJiZmLnVuc2hpZnQoaik7cmV0dXJuIGRbal19fWZ1bmN0aW9uIGJZKGEsYixjLGQpe2lmKGYuaXNBcnJheShiKSlmLmVhY2goYixmdW5jdGlvbihiLGUpe2N8fGJDLnRlc3QoYSk/ZChhLGUpOmJZKGErIlsiKyh0eXBlb2YgZT09Im9iamVjdCJ8fGYuaXNBcnJheShlKT9iOiIiKSsiXSIsZSxjLGQpfSk7ZWxzZSBpZighYyYmYiE9bnVsbCYmdHlwZW9mIGI9PSJvYmplY3QiKWZvcih2YXIgZSBpbiBiKWJZKGErIlsiK2UrIl0iLGJbZV0sYyxkKTtlbHNlIGQoYSxiKX1mdW5jdGlvbiBiWChhLGMsZCxlLGYsZyl7Zj1mfHxjLmRhdGFUeXBlc1swXSxnPWd8fHt9LGdbZl09ITA7dmFyIGg9YVtmXSxpPTAsaj1oP2gubGVuZ3RoOjAsaz1hPT09YlIsbDtmb3IoO2k8aiYmKGt8fCFsKTtpKyspbD1oW2ldKGMsZCxlKSx0eXBlb2YgbD09InN0cmluZyImJigha3x8Z1tsXT9sPWI6KGMuZGF0YVR5cGVzLnVuc2hpZnQobCksbD1iWChhLGMsZCxlLGwsZykpKTsoa3x8IWwpJiYhZ1siKiJdJiYobD1iWChhLGMsZCxlLCIqIixnKSk7cmV0dXJuIGx9ZnVuY3Rpb24gYlcoYSl7cmV0dXJuIGZ1bmN0aW9uKGIsYyl7dHlwZW9mIGIhPSJzdHJpbmciJiYoYz1iLGI9IioiKTtpZihmLmlzRnVuY3Rpb24oYykpe3ZhciBkPWIudG9Mb3dlckNhc2UoKS5zcGxpdChiTiksZT0wLGc9ZC5sZW5ndGgsaCxpLGo7Zm9yKDtlPGc7ZSsrKWg9ZFtlXSxqPS9eXCsvLnRlc3QoaCksaiYmKGg9aC5zdWJzdHIoMSl8fCIqIiksaT1hW2hdPWFbaF18fFtdLGlbaj8idW5zaGlmdCI6InB1c2giXShjKX19fWZ1bmN0aW9uIGJBKGEsYixjKXt2YXIgZD1iPT09IndpZHRoIj9hLm9mZnNldFdpZHRoOmEub2Zmc2V0SGVpZ2h0LGU9Yj09PSJ3aWR0aCI/YnY6Ync7aWYoZD4wKXtjIT09ImJvcmRlciImJmYuZWFjaChlLGZ1bmN0aW9uKCl7Y3x8KGQtPXBhcnNlRmxvYXQoZi5jc3MoYSwicGFkZGluZyIrdGhpcykpfHwwKSxjPT09Im1hcmdpbiI/ZCs9cGFyc2VGbG9hdChmLmNzcyhhLGMrdGhpcykpfHwwOmQtPXBhcnNlRmxvYXQoZi5jc3MoYSwiYm9yZGVyIit0aGlzKyJXaWR0aCIpKXx8MH0pO3JldHVybiBkKyJweCJ9ZD1ieChhLGIsYik7aWYoZDwwfHxkPT1udWxsKWQ9YS5zdHlsZVtiXXx8MDtkPXBhcnNlRmxvYXQoZCl8fDAsYyYmZi5lYWNoKGUsZnVuY3Rpb24oKXtkKz1wYXJzZUZsb2F0KGYuY3NzKGEsInBhZGRpbmciK3RoaXMpKXx8MCxjIT09InBhZGRpbmciJiYoZCs9cGFyc2VGbG9hdChmLmNzcyhhLCJib3JkZXIiK3RoaXMrIldpZHRoIikpfHwwKSxjPT09Im1hcmdpbiImJihkKz1wYXJzZUZsb2F0KGYuY3NzKGEsYyt0aGlzKSl8fDApfSk7cmV0dXJuIGQrInB4In1mdW5jdGlvbiBibShhLGIpe2Iuc3JjP2YuYWpheCh7dXJsOmIuc3JjLGFzeW5jOiExLGRhdGFUeXBlOiJzY3JpcHQifSk6Zi5nbG9iYWxFdmFsKChiLnRleHR8fGIudGV4dENvbnRlbnR8fGIuaW5uZXJIVE1MfHwiIikucmVwbGFjZShiZSwiLyokMCovIikpLGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpfWZ1bmN0aW9uIGJsKGEpe2Yubm9kZU5hbWUoYSwiaW5wdXQiKT9iayhhKToiZ2V0RWxlbWVudHNCeVRhZ05hbWUiaW4gYSYmZi5ncmVwKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IiksYmspfWZ1bmN0aW9uIGJrKGEpe2lmKGEudHlwZT09PSJjaGVja2JveCJ8fGEudHlwZT09PSJyYWRpbyIpYS5kZWZhdWx0Q2hlY2tlZD1hLmNoZWNrZWR9ZnVuY3Rpb24gYmooYSl7cmV0dXJuImdldEVsZW1lbnRzQnlUYWdOYW1lImluIGE/YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOiJxdWVyeVNlbGVjdG9yQWxsImluIGE/YS5xdWVyeVNlbGVjdG9yQWxsKCIqIik6W119ZnVuY3Rpb24gYmkoYSxiKXt2YXIgYztpZihiLm5vZGVUeXBlPT09MSl7Yi5jbGVhckF0dHJpYnV0ZXMmJmIuY2xlYXJBdHRyaWJ1dGVzKCksYi5tZXJnZUF0dHJpYnV0ZXMmJmIubWVyZ2VBdHRyaWJ1dGVzKGEpLGM9Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO2lmKGM9PT0ib2JqZWN0IiliLm91dGVySFRNTD1hLm91dGVySFRNTDtlbHNlIGlmKGMhPT0iaW5wdXQifHxhLnR5cGUhPT0iY2hlY2tib3giJiZhLnR5cGUhPT0icmFkaW8iKXtpZihjPT09Im9wdGlvbiIpYi5zZWxlY3RlZD1hLmRlZmF1bHRTZWxlY3RlZDtlbHNlIGlmKGM9PT0iaW5wdXQifHxjPT09InRleHRhcmVhIiliLmRlZmF1bHRWYWx1ZT1hLmRlZmF1bHRWYWx1ZX1lbHNlIGEuY2hlY2tlZCYmKGIuZGVmYXVsdENoZWNrZWQ9Yi5jaGVja2VkPWEuY2hlY2tlZCksYi52YWx1ZSE9PWEudmFsdWUmJihiLnZhbHVlPWEudmFsdWUpO2IucmVtb3ZlQXR0cmlidXRlKGYuZXhwYW5kbyl9fWZ1bmN0aW9uIGJoKGEsYil7aWYoYi5ub2RlVHlwZT09PTEmJiEhZi5oYXNEYXRhKGEpKXt2YXIgYz1mLmV4cGFuZG8sZD1mLmRhdGEoYSksZT1mLmRhdGEoYixkKTtpZihkPWRbY10pe3ZhciBnPWQuZXZlbnRzO2U9ZVtjXT1mLmV4dGVuZCh7fSxkKTtpZihnKXtkZWxldGUgZS5oYW5kbGUsZS5ldmVudHM9e307Zm9yKHZhciBoIGluIGcpZm9yKHZhciBpPTAsaj1nW2hdLmxlbmd0aDtpPGo7aSsrKWYuZXZlbnQuYWRkKGIsaCsoZ1toXVtpXS5uYW1lc3BhY2U/Ii4iOiIiKStnW2hdW2ldLm5hbWVzcGFjZSxnW2hdW2ldLGdbaF1baV0uZGF0YSl9fX19ZnVuY3Rpb24gYmcoYSxiKXtyZXR1cm4gZi5ub2RlTmFtZShhLCJ0YWJsZSIpP2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IilbMF18fGEuYXBwZW5kQ2hpbGQoYS5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRib2R5IikpOmF9ZnVuY3Rpb24gVyhhLGIsYyl7Yj1ifHwwO2lmKGYuaXNGdW5jdGlvbihiKSlyZXR1cm4gZi5ncmVwKGEsZnVuY3Rpb24oYSxkKXt2YXIgZT0hIWIuY2FsbChhLGQsYSk7cmV0dXJuIGU9PT1jfSk7aWYoYi5ub2RlVHlwZSlyZXR1cm4gZi5ncmVwKGEsZnVuY3Rpb24oYSxkKXtyZXR1cm4gYT09PWI9PT1jfSk7aWYodHlwZW9mIGI9PSJzdHJpbmciKXt2YXIgZD1mLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlVHlwZT09PTF9KTtpZihSLnRlc3QoYikpcmV0dXJuIGYuZmlsdGVyKGIsZCwhYyk7Yj1mLmZpbHRlcihiLGQpfXJldHVybiBmLmdyZXAoYSxmdW5jdGlvbihhLGQpe3JldHVybiBmLmluQXJyYXkoYSxiKT49MD09PWN9KX1mdW5jdGlvbiBWKGEpe3JldHVybiFhfHwhYS5wYXJlbnROb2RlfHxhLnBhcmVudE5vZGUubm9kZVR5cGU9PT0xMX1mdW5jdGlvbiBOKGEsYil7cmV0dXJuKGEmJmEhPT0iKiI/YSsiLiI6IiIpK2IucmVwbGFjZSh6LCJgIikucmVwbGFjZShBLCImIil9ZnVuY3Rpb24gTShhKXt2YXIgYixjLGQsZSxnLGgsaSxqLGssbCxtLG4sbyxwPVtdLHE9W10scj1mLl9kYXRhKHRoaXMsImV2ZW50cyIpO2lmKCEoYS5saXZlRmlyZWQ9PT10aGlzfHwhcnx8IXIubGl2ZXx8YS50YXJnZXQuZGlzYWJsZWR8fGEuYnV0dG9uJiZhLnR5cGU9PT0iY2xpY2siKSl7YS5uYW1lc3BhY2UmJihuPW5ldyBSZWdFeHAoIihefFxcLikiK2EubmFtZXNwYWNlLnNwbGl0KCIuIikuam9pbigiXFwuKD86LipcXC4pPyIpKyIoXFwufCQpIikpLGEubGl2ZUZpcmVkPXRoaXM7dmFyIHM9ci5saXZlLnNsaWNlKDApO2ZvcihpPTA7aTxzLmxlbmd0aDtpKyspZz1zW2ldLGcub3JpZ1R5cGUucmVwbGFjZSh4LCIiKT09PWEudHlwZT9xLnB1c2goZy5zZWxlY3Rvcik6cy5zcGxpY2UoaS0tLDEpO2U9ZihhLnRhcmdldCkuY2xvc2VzdChxLGEuY3VycmVudFRhcmdldCk7Zm9yKGo9MCxrPWUubGVuZ3RoO2o8aztqKyspe209ZVtqXTtmb3IoaT0wO2k8cy5sZW5ndGg7aSsrKXtnPXNbaV07aWYobS5zZWxlY3Rvcj09PWcuc2VsZWN0b3ImJighbnx8bi50ZXN0KGcubmFtZXNwYWNlKSkmJiFtLmVsZW0uZGlzYWJsZWQpe2g9bS5lbGVtLGQ9bnVsbDtpZihnLnByZVR5cGU9PT0ibW91c2VlbnRlciJ8fGcucHJlVHlwZT09PSJtb3VzZWxlYXZlIilhLnR5cGU9Zy5wcmVUeXBlLGQ9ZihhLnJlbGF0ZWRUYXJnZXQpLmNsb3Nlc3QoZy5zZWxlY3RvcilbMF0sZCYmZi5jb250YWlucyhoLGQpJiYoZD1oKTsoIWR8fGQhPT1oKSYmcC5wdXNoKHtlbGVtOmgsaGFuZGxlT2JqOmcsbGV2ZWw6bS5sZXZlbH0pfX19Zm9yKGo9MCxrPXAubGVuZ3RoO2o8aztqKyspe2U9cFtqXTtpZihjJiZlLmxldmVsPmMpYnJlYWs7YS5jdXJyZW50VGFyZ2V0PWUuZWxlbSxhLmRhdGE9ZS5oYW5kbGVPYmouZGF0YSxhLmhhbmRsZU9iaj1lLmhhbmRsZU9iaixvPWUuaGFuZGxlT2JqLm9yaWdIYW5kbGVyLmFwcGx5KGUuZWxlbSxhcmd1bWVudHMpO2lmKG89PT0hMXx8YS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKXtjPWUubGV2ZWwsbz09PSExJiYoYj0hMSk7aWYoYS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKWJyZWFrfX1yZXR1cm4gYn19ZnVuY3Rpb24gSyhhLGMsZCl7dmFyIGU9Zi5leHRlbmQoe30sZFswXSk7ZS50eXBlPWEsZS5vcmlnaW5hbEV2ZW50PXt9LGUubGl2ZUZpcmVkPWIsZi5ldmVudC5oYW5kbGUuY2FsbChjLGUpLGUuaXNEZWZhdWx0UHJldmVudGVkKCkmJmRbMF0ucHJldmVudERlZmF1bHQoKX1mdW5jdGlvbiBFKCl7cmV0dXJuITB9ZnVuY3Rpb24gRCgpe3JldHVybiExfWZ1bmN0aW9uIG0oYSxjLGQpe3ZhciBlPWMrImRlZmVyIixnPWMrInF1ZXVlIixoPWMrIm1hcmsiLGk9Zi5kYXRhKGEsZSxiLCEwKTtpJiYoZD09PSJxdWV1ZSJ8fCFmLmRhdGEoYSxnLGIsITApKSYmKGQ9PT0ibWFyayJ8fCFmLmRhdGEoYSxoLGIsITApKSYmc2V0VGltZW91dChmdW5jdGlvbigpeyFmLmRhdGEoYSxnLGIsITApJiYhZi5kYXRhKGEsaCxiLCEwKSYmKGYucmVtb3ZlRGF0YShhLGUsITApLGkucmVzb2x2ZSgpKX0sMCl9ZnVuY3Rpb24gbChhKXtmb3IodmFyIGIgaW4gYSlpZihiIT09InRvSlNPTiIpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gayhhLGMsZCl7aWYoZD09PWImJmEubm9kZVR5cGU9PT0xKXt2YXIgZT0iZGF0YS0iK2MucmVwbGFjZShqLCIkMS0kMiIpLnRvTG93ZXJDYXNlKCk7ZD1hLmdldEF0dHJpYnV0ZShlKTtpZih0eXBlb2YgZD09InN0cmluZyIpe3RyeXtkPWQ9PT0idHJ1ZSI/ITA6ZD09PSJmYWxzZSI/ITE6ZD09PSJudWxsIj9udWxsOmYuaXNOYU4oZCk/aS50ZXN0KGQpP2YucGFyc2VKU09OKGQpOmQ6cGFyc2VGbG9hdChkKX1jYXRjaChnKXt9Zi5kYXRhKGEsYyxkKX1lbHNlIGQ9Yn1yZXR1cm4gZH12YXIgYz1hLmRvY3VtZW50LGQ9YS5uYXZpZ2F0b3IsZT1hLmxvY2F0aW9uLGY9ZnVuY3Rpb24oKXtmdW5jdGlvbiBKKCl7aWYoIWUuaXNSZWFkeSl7dHJ5e2MuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsKCJsZWZ0Iil9Y2F0Y2goYSl7c2V0VGltZW91dChKLDEpO3JldHVybn1lLnJlYWR5KCl9fXZhciBlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBlLmZuLmluaXQoYSxiLGgpfSxmPWEualF1ZXJ5LGc9YS4kLGgsaT0vXig/OltePF0qKDxbXHdcV10rPilbXj5dKiR8IyhbXHdcLV0qKSQpLyxqPS9cUy8saz0vXlxzKy8sbD0vXHMrJC8sbT0vXGQvLG49L148KFx3KylccypcLz8+KD86PFwvXDE+KT8kLyxvPS9eW1xdLDp7fVxzXSokLyxwPS9cXCg/OlsiXFxcL2JmbnJ0XXx1WzAtOWEtZkEtRl17NH0pL2cscT0vIlteIlxcXG5ccl0qInx0cnVlfGZhbHNlfG51bGx8LT9cZCsoPzpcLlxkKik/KD86W2VFXVsrXC1dP1xkKyk/L2cscj0vKD86Xnw6fCwpKD86XHMqXFspKy9nLHM9Lyh3ZWJraXQpWyBcL10oW1x3Ll0rKS8sdD0vKG9wZXJhKSg/Oi4qdmVyc2lvbik/WyBcL10oW1x3Ll0rKS8sdT0vKG1zaWUpIChbXHcuXSspLyx2PS8obW96aWxsYSkoPzouKj8gcnY6KFtcdy5dKykpPy8sdz0vLShbYS16XSkvaWcseD1mdW5jdGlvbihhLGIpe3JldHVybiBiLnRvVXBwZXJDYXNlKCl9LHk9ZC51c2VyQWdlbnQseixBLEIsQz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLEQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxFPUFycmF5LnByb3RvdHlwZS5wdXNoLEY9QXJyYXkucHJvdG90eXBlLnNsaWNlLEc9U3RyaW5nLnByb3RvdHlwZS50cmltLEg9QXJyYXkucHJvdG90eXBlLmluZGV4T2YsST17fTtlLmZuPWUucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjplLGluaXQ6ZnVuY3Rpb24oYSxkLGYpe3ZhciBnLGgsaixrO2lmKCFhKXJldHVybiB0aGlzO2lmKGEubm9kZVR5cGUpe3RoaXMuY29udGV4dD10aGlzWzBdPWEsdGhpcy5sZW5ndGg9MTtyZXR1cm4gdGhpc31pZihhPT09ImJvZHkiJiYhZCYmYy5ib2R5KXt0aGlzLmNvbnRleHQ9Yyx0aGlzWzBdPWMuYm9keSx0aGlzLnNlbGVjdG9yPWEsdGhpcy5sZW5ndGg9MTtyZXR1cm4gdGhpc31pZih0eXBlb2YgYT09InN0cmluZyIpe2EuY2hhckF0KDApIT09IjwifHxhLmNoYXJBdChhLmxlbmd0aC0xKSE9PSI+Inx8YS5sZW5ndGg8Mz9nPWkuZXhlYyhhKTpnPVtudWxsLGEsbnVsbF07aWYoZyYmKGdbMV18fCFkKSl7aWYoZ1sxXSl7ZD1kIGluc3RhbmNlb2YgZT9kWzBdOmQsaz1kP2Qub3duZXJEb2N1bWVudHx8ZDpjLGo9bi5leGVjKGEpLGo/ZS5pc1BsYWluT2JqZWN0KGQpPyhhPVtjLmNyZWF0ZUVsZW1lbnQoalsxXSldLGUuZm4uYXR0ci5jYWxsKGEsZCwhMCkpOmE9W2suY3JlYXRlRWxlbWVudChqWzFdKV06KGo9ZS5idWlsZEZyYWdtZW50KFtnWzFdXSxba10pLGE9KGouY2FjaGVhYmxlP2UuY2xvbmUoai5mcmFnbWVudCk6ai5mcmFnbWVudCkuY2hpbGROb2Rlcyk7cmV0dXJuIGUubWVyZ2UodGhpcyxhKX1oPWMuZ2V0RWxlbWVudEJ5SWQoZ1syXSk7aWYoaCYmaC5wYXJlbnROb2RlKXtpZihoLmlkIT09Z1syXSlyZXR1cm4gZi5maW5kKGEpO3RoaXMubGVuZ3RoPTEsdGhpc1swXT1ofXRoaXMuY29udGV4dD1jLHRoaXMuc2VsZWN0b3I9YTtyZXR1cm4gdGhpc31yZXR1cm4hZHx8ZC5qcXVlcnk/KGR8fGYpLmZpbmQoYSk6dGhpcy5jb25zdHJ1Y3RvcihkKS5maW5kKGEpfWlmKGUuaXNGdW5jdGlvbihhKSlyZXR1cm4gZi5yZWFkeShhKTthLnNlbGVjdG9yIT09YiYmKHRoaXMuc2VsZWN0b3I9YS5zZWxlY3Rvcix0aGlzLmNvbnRleHQ9YS5jb250ZXh0KTtyZXR1cm4gZS5tYWtlQXJyYXkoYSx0aGlzKX0sc2VsZWN0b3I6IiIsanF1ZXJ5OiIxLjYuMiIsbGVuZ3RoOjAsc2l6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxlbmd0aH0sdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBGLmNhbGwodGhpcywwKX0sZ2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsP3RoaXMudG9BcnJheSgpOmE8MD90aGlzW3RoaXMubGVuZ3RoK2FdOnRoaXNbYV19LHB1c2hTdGFjazpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5jb25zdHJ1Y3RvcigpO2UuaXNBcnJheShhKT9FLmFwcGx5KGQsYSk6ZS5tZXJnZShkLGEpLGQucHJldk9iamVjdD10aGlzLGQuY29udGV4dD10aGlzLmNvbnRleHQsYj09PSJmaW5kIj9kLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3IrKHRoaXMuc2VsZWN0b3I/IiAiOiIiKStjOmImJihkLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3IrIi4iK2IrIigiK2MrIikiKTtyZXR1cm4gZH0sZWFjaDpmdW5jdGlvbihhLGIpe3JldHVybiBlLmVhY2godGhpcyxhLGIpfSxyZWFkeTpmdW5jdGlvbihhKXtlLmJpbmRSZWFkeSgpLEEuZG9uZShhKTtyZXR1cm4gdGhpc30sZXE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT0tMT90aGlzLnNsaWNlKGEpOnRoaXMuc2xpY2UoYSwrYSsxKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soRi5hcHBseSh0aGlzLGFyZ3VtZW50cyksInNsaWNlIixGLmNhbGwoYXJndW1lbnRzKS5qb2luKCIsIikpfSxtYXA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGUubWFwKHRoaXMsZnVuY3Rpb24oYixjKXtyZXR1cm4gYS5jYWxsKGIsYyxiKX0pKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8dGhpcy5jb25zdHJ1Y3RvcihudWxsKX0scHVzaDpFLHNvcnQ6W10uc29ydCxzcGxpY2U6W10uc3BsaWNlfSxlLmZuLmluaXQucHJvdG90eXBlPWUuZm4sZS5leHRlbmQ9ZS5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgYSxjLGQsZixnLGgsaT1hcmd1bWVudHNbMF18fHt9LGo9MSxrPWFyZ3VtZW50cy5sZW5ndGgsbD0hMTt0eXBlb2YgaT09ImJvb2xlYW4iJiYobD1pLGk9YXJndW1lbnRzWzFdfHx7fSxqPTIpLHR5cGVvZiBpIT0ib2JqZWN0IiYmIWUuaXNGdW5jdGlvbihpKSYmKGk9e30pLGs9PT1qJiYoaT10aGlzLC0taik7Zm9yKDtqPGs7aisrKWlmKChhPWFyZ3VtZW50c1tqXSkhPW51bGwpZm9yKGMgaW4gYSl7ZD1pW2NdLGY9YVtjXTtpZihpPT09Ziljb250aW51ZTtsJiZmJiYoZS5pc1BsYWluT2JqZWN0KGYpfHwoZz1lLmlzQXJyYXkoZikpKT8oZz8oZz0hMSxoPWQmJmUuaXNBcnJheShkKT9kOltdKTpoPWQmJmUuaXNQbGFpbk9iamVjdChkKT9kOnt9LGlbY109ZS5leHRlbmQobCxoLGYpKTpmIT09YiYmKGlbY109Zil9cmV0dXJuIGl9LGUuZXh0ZW5kKHtub0NvbmZsaWN0OmZ1bmN0aW9uKGIpe2EuJD09PWUmJihhLiQ9ZyksYiYmYS5qUXVlcnk9PT1lJiYoYS5qUXVlcnk9Zik7cmV0dXJuIGV9LGlzUmVhZHk6ITEscmVhZHlXYWl0OjEsaG9sZFJlYWR5OmZ1bmN0aW9uKGEpe2E/ZS5yZWFkeVdhaXQrKzplLnJlYWR5KCEwKX0scmVhZHk6ZnVuY3Rpb24oYSl7aWYoYT09PSEwJiYhLS1lLnJlYWR5V2FpdHx8YSE9PSEwJiYhZS5pc1JlYWR5KXtpZighYy5ib2R5KXJldHVybiBzZXRUaW1lb3V0KGUucmVhZHksMSk7ZS5pc1JlYWR5PSEwO2lmKGEhPT0hMCYmLS1lLnJlYWR5V2FpdD4wKXJldHVybjtBLnJlc29sdmVXaXRoKGMsW2VdKSxlLmZuLnRyaWdnZXImJmUoYykudHJpZ2dlcigicmVhZHkiKS51bmJpbmQoInJlYWR5Iil9fSxiaW5kUmVhZHk6ZnVuY3Rpb24oKXtpZighQSl7QT1lLl9EZWZlcnJlZCgpO2lmKGMucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSIpcmV0dXJuIHNldFRpbWVvdXQoZS5yZWFkeSwxKTtpZihjLmFkZEV2ZW50TGlzdGVuZXIpYy5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixCLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGUucmVhZHksITEpO2Vsc2UgaWYoYy5hdHRhY2hFdmVudCl7Yy5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixCKSxhLmF0dGFjaEV2ZW50KCJvbmxvYWQiLGUucmVhZHkpO3ZhciBiPSExO3RyeXtiPWEuZnJhbWVFbGVtZW50PT1udWxsfWNhdGNoKGQpe31jLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCYmYiYmSigpfX19LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuIGUudHlwZShhKT09PSJmdW5jdGlvbiJ9LGlzQXJyYXk6QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGUudHlwZShhKT09PSJhcnJheSJ9LGlzV2luZG93OmZ1bmN0aW9uKGEpe3JldHVybiBhJiZ0eXBlb2YgYT09Im9iamVjdCImJiJzZXRJbnRlcnZhbCJpbiBhfSxpc05hTjpmdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbHx8IW0udGVzdChhKXx8aXNOYU4oYSl9LHR5cGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/U3RyaW5nKGEpOklbQy5jYWxsKGEpXXx8Im9iamVjdCJ9LGlzUGxhaW5PYmplY3Q6ZnVuY3Rpb24oYSl7aWYoIWF8fGUudHlwZShhKSE9PSJvYmplY3QifHxhLm5vZGVUeXBlfHxlLmlzV2luZG93KGEpKXJldHVybiExO2lmKGEuY29uc3RydWN0b3ImJiFELmNhbGwoYSwiY29uc3RydWN0b3IiKSYmIUQuY2FsbChhLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwiaXNQcm90b3R5cGVPZiIpKXJldHVybiExO3ZhciBjO2ZvcihjIGluIGEpO3JldHVybiBjPT09Ynx8RC5jYWxsKGEsYyl9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiIGluIGEpcmV0dXJuITE7cmV0dXJuITB9LGVycm9yOmZ1bmN0aW9uKGEpe3Rocm93IGF9LHBhcnNlSlNPTjpmdW5jdGlvbihiKXtpZih0eXBlb2YgYiE9InN0cmluZyJ8fCFiKXJldHVybiBudWxsO2I9ZS50cmltKGIpO2lmKGEuSlNPTiYmYS5KU09OLnBhcnNlKXJldHVybiBhLkpTT04ucGFyc2UoYik7aWYoby50ZXN0KGIucmVwbGFjZShwLCJAIikucmVwbGFjZShxLCJdIikucmVwbGFjZShyLCIiKSkpcmV0dXJuKG5ldyBGdW5jdGlvbigicmV0dXJuICIrYikpKCk7ZS5lcnJvcigiSW52YWxpZCBKU09OOiAiK2IpfSxwYXJzZVhNTDpmdW5jdGlvbihiLGMsZCl7YS5ET01QYXJzZXI/KGQ9bmV3IERPTVBhcnNlcixjPWQucGFyc2VGcm9tU3RyaW5nKGIsInRleHQveG1sIikpOihjPW5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MRE9NIiksYy5hc3luYz0iZmFsc2UiLGMubG9hZFhNTChiKSksZD1jLmRvY3VtZW50RWxlbWVudCwoIWR8fCFkLm5vZGVOYW1lfHxkLm5vZGVOYW1lPT09InBhcnNlcmVycm9yIikmJmUuZXJyb3IoIkludmFsaWQgWE1MOiAiK2IpO3JldHVybiBjfSxub29wOmZ1bmN0aW9uKCl7fSxnbG9iYWxFdmFsOmZ1bmN0aW9uKGIpe2ImJmoudGVzdChiKSYmKGEuZXhlY1NjcmlwdHx8ZnVuY3Rpb24oYil7YS5ldmFsLmNhbGwoYSxiKX0pKGIpfSxjYW1lbENhc2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZSh3LHgpfSxub2RlTmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk9PT1iLnRvVXBwZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oYSxjLGQpe3ZhciBmLGc9MCxoPWEubGVuZ3RoLGk9aD09PWJ8fGUuaXNGdW5jdGlvbihhKTtpZihkKXtpZihpKXtmb3IoZiBpbiBhKWlmKGMuYXBwbHkoYVtmXSxkKT09PSExKWJyZWFrfWVsc2UgZm9yKDtnPGg7KWlmKGMuYXBwbHkoYVtnKytdLGQpPT09ITEpYnJlYWt9ZWxzZSBpZihpKXtmb3IoZiBpbiBhKWlmKGMuY2FsbChhW2ZdLGYsYVtmXSk9PT0hMSlicmVha31lbHNlIGZvcig7ZzxoOylpZihjLmNhbGwoYVtnXSxnLGFbZysrXSk9PT0hMSlicmVhaztyZXR1cm4gYX0sdHJpbTpHP2Z1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsPyIiOkcuY2FsbChhKX06ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/IiI6KGErIiIpLnJlcGxhY2UoaywiIikucmVwbGFjZShsLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGEsYil7dmFyIGM9Ynx8W107aWYoYSE9bnVsbCl7dmFyIGQ9ZS50eXBlKGEpO2EubGVuZ3RoPT1udWxsfHxkPT09InN0cmluZyJ8fGQ9PT0iZnVuY3Rpb24ifHxkPT09InJlZ2V4cCJ8fGUuaXNXaW5kb3coYSk/RS5jYWxsKGMsYSk6ZS5tZXJnZShjLGEpfXJldHVybiBjfSxpbkFycmF5OmZ1bmN0aW9uKGEsYil7aWYoSClyZXR1cm4gSC5jYWxsKGIsYSk7Zm9yKHZhciBjPTAsZD1iLmxlbmd0aDtjPGQ7YysrKWlmKGJbY109PT1hKXJldHVybiBjO3JldHVybi0xfSxtZXJnZTpmdW5jdGlvbihhLGMpe3ZhciBkPWEubGVuZ3RoLGU9MDtpZih0eXBlb2YgYy5sZW5ndGg9PSJudW1iZXIiKWZvcih2YXIgZj1jLmxlbmd0aDtlPGY7ZSsrKWFbZCsrXT1jW2VdO2Vsc2Ugd2hpbGUoY1tlXSE9PWIpYVtkKytdPWNbZSsrXTthLmxlbmd0aD1kO3JldHVybiBhfSxncmVwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1bXSxlO2M9ISFjO2Zvcih2YXIgZj0wLGc9YS5sZW5ndGg7ZjxnO2YrKyllPSEhYihhW2ZdLGYpLGMhPT1lJiZkLnB1c2goYVtmXSk7cmV0dXJuIGR9LG1hcDpmdW5jdGlvbihhLGMsZCl7dmFyIGYsZyxoPVtdLGk9MCxqPWEubGVuZ3RoLGs9YSBpbnN0YW5jZW9mIGV8fGohPT1iJiZ0eXBlb2Ygaj09Im51bWJlciImJihqPjAmJmFbMF0mJmFbai0xXXx8aj09PTB8fGUuaXNBcnJheShhKSk7aWYoaylmb3IoO2k8ajtpKyspZj1jKGFbaV0saSxkKSxmIT1udWxsJiYoaFtoLmxlbmd0aF09Zik7ZWxzZSBmb3IoZyBpbiBhKWY9YyhhW2ddLGcsZCksZiE9bnVsbCYmKGhbaC5sZW5ndGhdPWYpO3JldHVybiBoLmNvbmNhdC5hcHBseShbXSxoKX0sZ3VpZDoxLHByb3h5OmZ1bmN0aW9uKGEsYyl7aWYodHlwZW9mIGM9PSJzdHJpbmciKXt2YXIgZD1hW2NdO2M9YSxhPWR9aWYoIWUuaXNGdW5jdGlvbihhKSlyZXR1cm4gYjt2YXIgZj1GLmNhbGwoYXJndW1lbnRzLDIpLGc9ZnVuY3Rpb24oKXtyZXR1cm4gYS5hcHBseShjLGYuY29uY2F0KEYuY2FsbChhcmd1bWVudHMpKSl9O2cuZ3VpZD1hLmd1aWQ9YS5ndWlkfHxnLmd1aWR8fGUuZ3VpZCsrO3JldHVybiBnfSxhY2Nlc3M6ZnVuY3Rpb24oYSxjLGQsZixnLGgpe3ZhciBpPWEubGVuZ3RoO2lmKHR5cGVvZiBjPT0ib2JqZWN0Iil7Zm9yKHZhciBqIGluIGMpZS5hY2Nlc3MoYSxqLGNbal0sZixnLGQpO3JldHVybiBhfWlmKGQhPT1iKXtmPSFoJiZmJiZlLmlzRnVuY3Rpb24oZCk7Zm9yKHZhciBrPTA7azxpO2srKylnKGFba10sYyxmP2QuY2FsbChhW2tdLGssZyhhW2tdLGMpKTpkLGgpO3JldHVybiBhfXJldHVybiBpP2coYVswXSxjKTpifSxub3c6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX0sdWFNYXRjaDpmdW5jdGlvbihhKXthPWEudG9Mb3dlckNhc2UoKTt2YXIgYj1zLmV4ZWMoYSl8fHQuZXhlYyhhKXx8dS5leGVjKGEpfHxhLmluZGV4T2YoImNvbXBhdGlibGUiKTwwJiZ2LmV4ZWMoYSl8fFtdO3JldHVybnticm93c2VyOmJbMV18fCIiLHZlcnNpb246YlsyXXx8IjAifX0sc3ViOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGMpe3JldHVybiBuZXcgYS5mbi5pbml0KGIsYyl9ZS5leHRlbmQoITAsYSx0aGlzKSxhLnN1cGVyY2xhc3M9dGhpcyxhLmZuPWEucHJvdG90eXBlPXRoaXMoKSxhLmZuLmNvbnN0cnVjdG9yPWEsYS5zdWI9dGhpcy5zdWIsYS5mbi5pbml0PWZ1bmN0aW9uKGQsZil7ZiYmZiBpbnN0YW5jZW9mIGUmJiEoZiBpbnN0YW5jZW9mIGEpJiYoZj1hKGYpKTtyZXR1cm4gZS5mbi5pbml0LmNhbGwodGhpcyxkLGYsYil9LGEuZm4uaW5pdC5wcm90b3R5cGU9YS5mbjt2YXIgYj1hKGMpO3JldHVybiBhfSxicm93c2VyOnt9fSksZS5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0Ii5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7SVsiW29iamVjdCAiK2IrIl0iXT1iLnRvTG93ZXJDYXNlKCl9KSx6PWUudWFNYXRjaCh5KSx6LmJyb3dzZXImJihlLmJyb3dzZXJbei5icm93c2VyXT0hMCxlLmJyb3dzZXIudmVyc2lvbj16LnZlcnNpb24pLGUuYnJvd3Nlci53ZWJraXQmJihlLmJyb3dzZXIuc2FmYXJpPSEwKSxqLnRlc3QoIsKgIikmJihrPS9eW1xzXHhBMF0rLyxsPS9bXHNceEEwXSskLyksaD1lKGMpLGMuYWRkRXZlbnRMaXN0ZW5lcj9CPWZ1bmN0aW9uKCl7Yy5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixCLCExKSxlLnJlYWR5KCl9OmMuYXR0YWNoRXZlbnQmJihCPWZ1bmN0aW9uKCl7Yy5yZWFkeVN0YXRlPT09ImNvbXBsZXRlIiYmKGMuZGV0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsQiksZS5yZWFkeSgpKX0pO3JldHVybiBlfSgpLGc9ImRvbmUgZmFpbCBpc1Jlc29sdmVkIGlzUmVqZWN0ZWQgcHJvbWlzZSB0aGVuIGFsd2F5cyBwaXBlIi5zcGxpdCgiICIpLGg9W10uc2xpY2U7Zi5leHRlbmQoe19EZWZlcnJlZDpmdW5jdGlvbigpe3ZhciBhPVtdLGIsYyxkLGU9e2RvbmU6ZnVuY3Rpb24oKXtpZighZCl7dmFyIGM9YXJndW1lbnRzLGcsaCxpLGosaztiJiYoaz1iLGI9MCk7Zm9yKGc9MCxoPWMubGVuZ3RoO2c8aDtnKyspaT1jW2ddLGo9Zi50eXBlKGkpLGo9PT0iYXJyYXkiP2UuZG9uZS5hcHBseShlLGkpOmo9PT0iZnVuY3Rpb24iJiZhLnB1c2goaSk7ayYmZS5yZXNvbHZlV2l0aChrWzBdLGtbMV0pfXJldHVybiB0aGlzfSxyZXNvbHZlV2l0aDpmdW5jdGlvbihlLGYpe2lmKCFkJiYhYiYmIWMpe2Y9Znx8W10sYz0xO3RyeXt3aGlsZShhWzBdKWEuc2hpZnQoKS5hcHBseShlLGYpfWZpbmFsbHl7Yj1bZSxmXSxjPTB9fXJldHVybiB0aGlzfSxyZXNvbHZlOmZ1bmN0aW9uKCl7ZS5yZXNvbHZlV2l0aCh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHRoaXN9LGlzUmVzb2x2ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIWN8fCEhYn0sY2FuY2VsOmZ1bmN0aW9uKCl7ZD0xLGE9W107cmV0dXJuIHRoaXN9fTtyZXR1cm4gZX0sRGVmZXJyZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9Zi5fRGVmZXJyZWQoKSxjPWYuX0RlZmVycmVkKCksZDtmLmV4dGVuZChiLHt0aGVuOmZ1bmN0aW9uKGEsYyl7Yi5kb25lKGEpLmZhaWwoYyk7cmV0dXJuIHRoaXN9LGFsd2F5czpmdW5jdGlvbigpe3JldHVybiBiLmRvbmUuYXBwbHkoYixhcmd1bWVudHMpLmZhaWwuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxmYWlsOmMuZG9uZSxyZWplY3RXaXRoOmMucmVzb2x2ZVdpdGgscmVqZWN0OmMucmVzb2x2ZSxpc1JlamVjdGVkOmMuaXNSZXNvbHZlZCxwaXBlOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGYuRGVmZXJyZWQoZnVuY3Rpb24oZCl7Zi5lYWNoKHtkb25lOlthLCJyZXNvbHZlIl0sZmFpbDpbYywicmVqZWN0Il19LGZ1bmN0aW9uKGEsYyl7dmFyIGU9Y1swXSxnPWNbMV0saDtmLmlzRnVuY3Rpb24oZSk/YlthXShmdW5jdGlvbigpe2g9ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksaCYmZi5pc0Z1bmN0aW9uKGgucHJvbWlzZSk/aC5wcm9taXNlKCkudGhlbihkLnJlc29sdmUsZC5yZWplY3QpOmRbZ10oaCl9KTpiW2FdKGRbZ10pfSl9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24oYSl7aWYoYT09bnVsbCl7aWYoZClyZXR1cm4gZDtkPWE9e319dmFyIGM9Zy5sZW5ndGg7d2hpbGUoYy0tKWFbZ1tjXV09YltnW2NdXTtyZXR1cm4gYX19KSxiLmRvbmUoYy5jYW5jZWwpLmZhaWwoYi5jYW5jZWwpLGRlbGV0ZSBiLmNhbmNlbCxhJiZhLmNhbGwoYixiKTtyZXR1cm4gYn0sd2hlbjpmdW5jdGlvbihhKXtmdW5jdGlvbiBpKGEpe3JldHVybiBmdW5jdGlvbihjKXtiW2FdPWFyZ3VtZW50cy5sZW5ndGg+MT9oLmNhbGwoYXJndW1lbnRzLDApOmMsLS1lfHxnLnJlc29sdmVXaXRoKGcsaC5jYWxsKGIsMCkpfX12YXIgYj1hcmd1bWVudHMsYz0wLGQ9Yi5sZW5ndGgsZT1kLGc9ZDw9MSYmYSYmZi5pc0Z1bmN0aW9uKGEucHJvbWlzZSk/YTpmLkRlZmVycmVkKCk7aWYoZD4xKXtmb3IoO2M8ZDtjKyspYltjXSYmZi5pc0Z1bmN0aW9uKGJbY10ucHJvbWlzZSk/YltjXS5wcm9taXNlKCkudGhlbihpKGMpLGcucmVqZWN0KTotLWU7ZXx8Zy5yZXNvbHZlV2l0aChnLGIpfWVsc2UgZyE9PWEmJmcucmVzb2x2ZVdpdGgoZyxkP1thXTpbXSk7cmV0dXJuIGcucHJvbWlzZSgpfX0pLGYuc3VwcG9ydD1mdW5jdGlvbigpe3ZhciBhPWMuY3JlYXRlRWxlbWVudCgiZGl2IiksYj1jLmRvY3VtZW50RWxlbWVudCxkLGUsZyxoLGksaixrLGwsbSxuLG8scCxxLHIscyx0LHU7YS5zZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIsInQiKSxhLmlubmVySFRNTD0iICAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJyBzdHlsZT0ndG9wOjFweDtmbG9hdDpsZWZ0O29wYWNpdHk6LjU1Oyc+YTwvYT48aW5wdXQgdHlwZT0nY2hlY2tib3gnLz4iLGQ9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLGU9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIpWzBdO2lmKCFkfHwhZC5sZW5ndGh8fCFlKXJldHVybnt9O2c9Yy5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKSxoPWcuYXBwZW5kQ2hpbGQoYy5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSksaT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpWzBdLGs9e2xlYWRpbmdXaGl0ZXNwYWNlOmEuZmlyc3RDaGlsZC5ub2RlVHlwZT09PTMsdGJvZHk6IWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IikubGVuZ3RoLGh0bWxTZXJpYWxpemU6ISFhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJsaW5rIikubGVuZ3RoLHN0eWxlOi90b3AvLnRlc3QoZS5nZXRBdHRyaWJ1dGUoInN0eWxlIikpLGhyZWZOb3JtYWxpemVkOmUuZ2V0QXR0cmlidXRlKCJocmVmIik9PT0iL2EiLG9wYWNpdHk6L14wLjU1JC8udGVzdChlLnN0eWxlLm9wYWNpdHkpLGNzc0Zsb2F0OiEhZS5zdHlsZS5jc3NGbG9hdCxjaGVja09uOmkudmFsdWU9PT0ib24iLG9wdFNlbGVjdGVkOmguc2VsZWN0ZWQsZ2V0U2V0QXR0cmlidXRlOmEuY2xhc3NOYW1lIT09InQiLHN1Ym1pdEJ1YmJsZXM6ITAsY2hhbmdlQnViYmxlczohMCxmb2N1c2luQnViYmxlczohMSxkZWxldGVFeHBhbmRvOiEwLG5vQ2xvbmVFdmVudDohMCxpbmxpbmVCbG9ja05lZWRzTGF5b3V0OiExLHNocmlua1dyYXBCbG9ja3M6ITEscmVsaWFibGVNYXJnaW5SaWdodDohMH0saS5jaGVja2VkPSEwLGsubm9DbG9uZUNoZWNrZWQ9aS5jbG9uZU5vZGUoITApLmNoZWNrZWQsZy5kaXNhYmxlZD0hMCxrLm9wdERpc2FibGVkPSFoLmRpc2FibGVkO3RyeXtkZWxldGUgYS50ZXN0fWNhdGNoKHYpe2suZGVsZXRlRXhwYW5kbz0hMX0hYS5hZGRFdmVudExpc3RlbmVyJiZhLmF0dGFjaEV2ZW50JiZhLmZpcmVFdmVudCYmKGEuYXR0YWNoRXZlbnQoIm9uY2xpY2siLGZ1bmN0aW9uKCl7ay5ub0Nsb25lRXZlbnQ9ITF9KSxhLmNsb25lTm9kZSghMCkuZmlyZUV2ZW50KCJvbmNsaWNrIikpLGk9Yy5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLGkudmFsdWU9InQiLGkuc2V0QXR0cmlidXRlKCJ0eXBlIiwicmFkaW8iKSxrLnJhZGlvVmFsdWU9aS52YWx1ZT09PSJ0IixpLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNoZWNrZWQiKSxhLmFwcGVuZENoaWxkKGkpLGw9Yy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksbC5hcHBlbmRDaGlsZChhLmZpcnN0Q2hpbGQpLGsuY2hlY2tDbG9uZT1sLmNsb25lTm9kZSghMCkuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuY2hlY2tlZCxhLmlubmVySFRNTD0iIixhLnN0eWxlLndpZHRoPWEuc3R5bGUucGFkZGluZ0xlZnQ9IjFweCIsbT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF0sbz1jLmNyZWF0ZUVsZW1lbnQobT8iZGl2IjoiYm9keSIpLHA9e3Zpc2liaWxpdHk6ImhpZGRlbiIsd2lkdGg6MCxoZWlnaHQ6MCxib3JkZXI6MCxtYXJnaW46MH0sbSYmZi5leHRlbmQocCx7cG9zaXRpb246ImFic29sdXRlIixsZWZ0Oi0xZTMsdG9wOi0xZTN9KTtmb3IodCBpbiBwKW8uc3R5bGVbdF09cFt0XTtvLmFwcGVuZENoaWxkKGEpLG49bXx8YixuLmluc2VydEJlZm9yZShvLG4uZmlyc3RDaGlsZCksay5hcHBlbmRDaGVja2VkPWkuY2hlY2tlZCxrLmJveE1vZGVsPWEub2Zmc2V0V2lkdGg9PT0yLCJ6b29tImluIGEuc3R5bGUmJihhLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsYS5zdHlsZS56b29tPTEsay5pbmxpbmVCbG9ja05lZWRzTGF5b3V0PWEub2Zmc2V0V2lkdGg9PT0yLGEuc3R5bGUuZGlzcGxheT0iIixhLmlubmVySFRNTD0iPGRpdiBzdHlsZT0nd2lkdGg6NHB4Oyc+PC9kaXY+IixrLnNocmlua1dyYXBCbG9ja3M9YS5vZmZzZXRXaWR0aCE9PTIpLGEuaW5uZXJIVE1MPSI8dGFibGU+PHRyPjx0ZCBzdHlsZT0ncGFkZGluZzowO2JvcmRlcjowO2Rpc3BsYXk6bm9uZSc+PC90ZD48dGQ+dDwvdGQ+PC90cj48L3RhYmxlPiIscT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpLHU9cVswXS5vZmZzZXRIZWlnaHQ9PT0wLHFbMF0uc3R5bGUuZGlzcGxheT0iIixxWzFdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGsucmVsaWFibGVIaWRkZW5PZmZzZXRzPXUmJnFbMF0ub2Zmc2V0SGVpZ2h0PT09MCxhLmlubmVySFRNTD0iIixjLmRlZmF1bHRWaWV3JiZjLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUmJihqPWMuY3JlYXRlRWxlbWVudCgiZGl2Iiksai5zdHlsZS53aWR0aD0iMCIsai5zdHlsZS5tYXJnaW5SaWdodD0iMCIsYS5hcHBlbmRDaGlsZChqKSxrLnJlbGlhYmxlTWFyZ2luUmlnaHQ9KHBhcnNlSW50KChjLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoaixudWxsKXx8e21hcmdpblJpZ2h0OjB9KS5tYXJnaW5SaWdodCwxMCl8fDApPT09MCksby5pbm5lckhUTUw9IiIsbi5yZW1vdmVDaGlsZChvKTtpZihhLmF0dGFjaEV2ZW50KWZvcih0IGlue3N1Ym1pdDoxLGNoYW5nZToxLGZvY3VzaW46MX0pcz0ib24iK3QsdT1zIGluIGEsdXx8KGEuc2V0QXR0cmlidXRlKHMsInJldHVybjsiKSx1PXR5cGVvZiBhW3NdPT0iZnVuY3Rpb24iKSxrW3QrIkJ1YmJsZXMiXT11O289bD1nPWg9bT1qPWE9aT1udWxsO3JldHVybiBrfSgpLGYuYm94TW9kZWw9Zi5zdXBwb3J0LmJveE1vZGVsO3ZhciBpPS9eKD86XHsuKlx9fFxbLipcXSkkLyxqPS8oW2Etel0pKFtBLVpdKS9nO2YuZXh0ZW5kKHtjYWNoZTp7fSx1dWlkOjAsZXhwYW5kbzoialF1ZXJ5IisoZi5mbi5qcXVlcnkrTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksbm9EYXRhOntlbWJlZDohMCxvYmplY3Q6ImNsc2lkOkQyN0NEQjZFLUFFNkQtMTFjZi05NkI4LTQ0NDU1MzU0MDAwMCIsYXBwbGV0OiEwfSxoYXNEYXRhOmZ1bmN0aW9uKGEpe2E9YS5ub2RlVHlwZT9mLmNhY2hlW2FbZi5leHBhbmRvXV06YVtmLmV4cGFuZG9dO3JldHVybiEhYSYmIWwoYSl9LGRhdGE6ZnVuY3Rpb24oYSxjLGQsZSl7aWYoISFmLmFjY2VwdERhdGEoYSkpe3ZhciBnPWYuZXhwYW5kbyxoPXR5cGVvZiBjPT0ic3RyaW5nIixpLGo9YS5ub2RlVHlwZSxrPWo/Zi5jYWNoZTphLGw9aj9hW2YuZXhwYW5kb106YVtmLmV4cGFuZG9dJiZmLmV4cGFuZG87aWYoKCFsfHxlJiZsJiYha1tsXVtnXSkmJmgmJmQ9PT1iKXJldHVybjtsfHwoaj9hW2YuZXhwYW5kb109bD0rK2YudXVpZDpsPWYuZXhwYW5kbyksa1tsXXx8KGtbbF09e30sanx8KGtbbF0udG9KU09OPWYubm9vcCkpO2lmKHR5cGVvZiBjPT0ib2JqZWN0Inx8dHlwZW9mIGM9PSJmdW5jdGlvbiIpZT9rW2xdW2ddPWYuZXh0ZW5kKGtbbF1bZ10sYyk6a1tsXT1mLmV4dGVuZChrW2xdLGMpO2k9a1tsXSxlJiYoaVtnXXx8KGlbZ109e30pLGk9aVtnXSksZCE9PWImJihpW2YuY2FtZWxDYXNlKGMpXT1kKTtpZihjPT09ImV2ZW50cyImJiFpW2NdKXJldHVybiBpW2ddJiZpW2ddLmV2ZW50cztyZXR1cm4gaD9pW2YuY2FtZWxDYXNlKGMpXXx8aVtjXTppfX0scmVtb3ZlRGF0YTpmdW5jdGlvbihiLGMsZCl7aWYoISFmLmFjY2VwdERhdGEoYikpe3ZhciBlPWYuZXhwYW5kbyxnPWIubm9kZVR5cGUsaD1nP2YuY2FjaGU6YixpPWc/YltmLmV4cGFuZG9dOmYuZXhwYW5kbztpZighaFtpXSlyZXR1cm47aWYoYyl7dmFyIGo9ZD9oW2ldW2VdOmhbaV07aWYoail7ZGVsZXRlIGpbY107aWYoIWwoaikpcmV0dXJufX1pZihkKXtkZWxldGUgaFtpXVtlXTtpZighbChoW2ldKSlyZXR1cm59dmFyIGs9aFtpXVtlXTtmLnN1cHBvcnQuZGVsZXRlRXhwYW5kb3x8aCE9YT9kZWxldGUgaFtpXTpoW2ldPW51bGwsaz8oaFtpXT17fSxnfHwoaFtpXS50b0pTT049Zi5ub29wKSxoW2ldW2VdPWspOmcmJihmLnN1cHBvcnQuZGVsZXRlRXhwYW5kbz9kZWxldGUgYltmLmV4cGFuZG9dOmIucmVtb3ZlQXR0cmlidXRlP2IucmVtb3ZlQXR0cmlidXRlKGYuZXhwYW5kbyk6YltmLmV4cGFuZG9dPW51bGwpfX0sX2RhdGE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmRhdGEoYSxiLGMsITApfSxhY2NlcHREYXRhOmZ1bmN0aW9uKGEpe2lmKGEubm9kZU5hbWUpe3ZhciBiPWYubm9EYXRhW2Eubm9kZU5hbWUudG9Mb3dlckNhc2UoKV07aWYoYilyZXR1cm4gYiE9PSEwJiZhLmdldEF0dHJpYnV0ZSgiY2xhc3NpZCIpPT09Yn1yZXR1cm4hMH19KSxmLmZuLmV4dGVuZCh7ZGF0YTpmdW5jdGlvbihhLGMpe3ZhciBkPW51bGw7aWYodHlwZW9mIGE9PSJ1bmRlZmluZWQiKXtpZih0aGlzLmxlbmd0aCl7ZD1mLmRhdGEodGhpc1swXSk7aWYodGhpc1swXS5ub2RlVHlwZT09PTEpe3ZhciBlPXRoaXNbMF0uYXR0cmlidXRlcyxnO2Zvcih2YXIgaD0wLGk9ZS5sZW5ndGg7aDxpO2grKylnPWVbaF0ubmFtZSxnLmluZGV4T2YoImRhdGEtIik9PT0wJiYoZz1mLmNhbWVsQ2FzZShnLnN1YnN0cmluZyg1KSksayh0aGlzWzBdLGcsZFtnXSkpfX1yZXR1cm4gZH1pZih0eXBlb2YgYT09Im9iamVjdCIpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YuZGF0YSh0aGlzLGEpfSk7dmFyIGo9YS5zcGxpdCgiLiIpO2pbMV09alsxXT8iLiIralsxXToiIjtpZihjPT09Yil7ZD10aGlzLnRyaWdnZXJIYW5kbGVyKCJnZXREYXRhIitqWzFdKyIhIixbalswXV0pLGQ9PT1iJiZ0aGlzLmxlbmd0aCYmKGQ9Zi5kYXRhKHRoaXNbMF0sYSksZD1rKHRoaXNbMF0sYSxkKSk7cmV0dXJuIGQ9PT1iJiZqWzFdP3RoaXMuZGF0YShqWzBdKTpkfXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1mKHRoaXMpLGQ9W2pbMF0sY107Yi50cmlnZ2VySGFuZGxlcigic2V0RGF0YSIralsxXSsiISIsZCksZi5kYXRhKHRoaXMsYSxjKSxiLnRyaWdnZXJIYW5kbGVyKCJjaGFuZ2VEYXRhIitqWzFdKyIhIixkKX0pfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmLnJlbW92ZURhdGEodGhpcyxhKX0pfX0pLGYuZXh0ZW5kKHtfbWFyazpmdW5jdGlvbihhLGMpe2EmJihjPShjfHwiZngiKSsibWFyayIsZi5kYXRhKGEsYywoZi5kYXRhKGEsYyxiLCEwKXx8MCkrMSwhMCkpfSxfdW5tYXJrOmZ1bmN0aW9uKGEsYyxkKXthIT09ITAmJihkPWMsYz1hLGE9ITEpO2lmKGMpe2Q9ZHx8ImZ4Ijt2YXIgZT1kKyJtYXJrIixnPWE/MDooZi5kYXRhKGMsZSxiLCEwKXx8MSktMTtnP2YuZGF0YShjLGUsZywhMCk6KGYucmVtb3ZlRGF0YShjLGUsITApLG0oYyxkLCJtYXJrIikpfX0scXVldWU6ZnVuY3Rpb24oYSxjLGQpe2lmKGEpe2M9KGN8fCJmeCIpKyJxdWV1ZSI7dmFyIGU9Zi5kYXRhKGEsYyxiLCEwKTtkJiYoIWV8fGYuaXNBcnJheShkKT9lPWYuZGF0YShhLGMsZi5tYWtlQXJyYXkoZCksITApOmUucHVzaChkKSk7cmV0dXJuIGV8fFtdfX0sZGVxdWV1ZTpmdW5jdGlvbihhLGIpe2I9Ynx8ImZ4Ijt2YXIgYz1mLnF1ZXVlKGEsYiksZD1jLnNoaWZ0KCksZTtkPT09ImlucHJvZ3Jlc3MiJiYoZD1jLnNoaWZ0KCkpLGQmJihiPT09ImZ4IiYmYy51bnNoaWZ0KCJpbnByb2dyZXNzIiksZC5jYWxsKGEsZnVuY3Rpb24oKXtmLmRlcXVldWUoYSxiKX0pKSxjLmxlbmd0aHx8KGYucmVtb3ZlRGF0YShhLGIrInF1ZXVlIiwhMCksbShhLGIsInF1ZXVlIikpfX0pLGYuZm4uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGMpe3R5cGVvZiBhIT0ic3RyaW5nIiYmKGM9YSxhPSJmeCIpO2lmKGM9PT1iKXJldHVybiBmLnF1ZXVlKHRoaXNbMF0sYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPWYucXVldWUodGhpcyxhLGMpO2E9PT0iZngiJiZiWzBdIT09ImlucHJvZ3Jlc3MiJiZmLmRlcXVldWUodGhpcyxhKX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmLmRlcXVldWUodGhpcyxhKX0pfSxkZWxheTpmdW5jdGlvbihhLGIpe2E9Zi5meD9mLmZ4LnNwZWVkc1thXXx8YTphLGI9Ynx8ImZ4IjtyZXR1cm4gdGhpcy5xdWV1ZShiLGZ1bmN0aW9uKCl7dmFyIGM9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5kZXF1ZXVlKGMsYil9LGEpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucXVldWUoYXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBtKCl7LS1ofHxkLnJlc29sdmVXaXRoKGUsW2VdKX10eXBlb2YgYSE9InN0cmluZyImJihjPWEsYT1iKSxhPWF8fCJmeCI7dmFyIGQ9Zi5EZWZlcnJlZCgpLGU9dGhpcyxnPWUubGVuZ3RoLGg9MSxpPWErImRlZmVyIixqPWErInF1ZXVlIixrPWErIm1hcmsiLGw7d2hpbGUoZy0tKWlmKGw9Zi5kYXRhKGVbZ10saSxiLCEwKXx8KGYuZGF0YShlW2ddLGosYiwhMCl8fGYuZGF0YShlW2ddLGssYiwhMCkpJiZmLmRhdGEoZVtnXSxpLGYuX0RlZmVycmVkKCksITApKWgrKyxsLmRvbmUobSk7bSgpO3JldHVybiBkLnByb21pc2UoKX19KTt2YXIgbj0vW1xuXHRccl0vZyxvPS9ccysvLHA9L1xyL2cscT0vXig/OmJ1dHRvbnxpbnB1dCkkL2kscj0vXig/OmJ1dHRvbnxpbnB1dHxvYmplY3R8c2VsZWN0fHRleHRhcmVhKSQvaSxzPS9eYSg/OnJlYSk/JC9pLHQ9L14oPzphdXRvZm9jdXN8YXV0b3BsYXl8YXN5bmN8Y2hlY2tlZHxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZHxzZWxlY3RlZCkkL2ksdT0vXDp8Xm9uLyx2LHc7Zi5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZi5hY2Nlc3ModGhpcyxhLGIsITAsZi5hdHRyKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5yZW1vdmVBdHRyKHRoaXMsYSl9KX0scHJvcDpmdW5jdGlvbihhLGIpe3JldHVybiBmLmFjY2Vzcyh0aGlzLGEsYiwhMCxmLnByb3ApfSxyZW1vdmVQcm9wOmZ1bmN0aW9uKGEpe2E9Zi5wcm9wRml4W2FdfHxhO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt0cnl7dGhpc1thXT1iLGRlbGV0ZSB0aGlzW2FdfWNhdGNoKGMpe319KX0sYWRkQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZyxoLGk7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Zih0aGlzKS5hZGRDbGFzcyhhLmNhbGwodGhpcyxiLHRoaXMuY2xhc3NOYW1lKSl9KTtpZihhJiZ0eXBlb2YgYT09InN0cmluZyIpe2I9YS5zcGxpdChvKTtmb3IoYz0wLGQ9dGhpcy5sZW5ndGg7YzxkO2MrKyl7ZT10aGlzW2NdO2lmKGUubm9kZVR5cGU9PT0xKWlmKCFlLmNsYXNzTmFtZSYmYi5sZW5ndGg9PT0xKWUuY2xhc3NOYW1lPWE7ZWxzZXtnPSIgIitlLmNsYXNzTmFtZSsiICI7Zm9yKGg9MCxpPWIubGVuZ3RoO2g8aTtoKyspfmcuaW5kZXhPZigiICIrYltoXSsiICIpfHwoZys9YltoXSsiICIpO2UuY2xhc3NOYW1lPWYudHJpbShnKX19fXJldHVybiB0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbihhKXt2YXIgYyxkLGUsZyxoLGksajtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtmKHRoaXMpLnJlbW92ZUNsYXNzKGEuY2FsbCh0aGlzLGIsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGEmJnR5cGVvZiBhPT0ic3RyaW5nInx8YT09PWIpe2M9KGF8fCIiKS5zcGxpdChvKTtmb3IoZD0wLGU9dGhpcy5sZW5ndGg7ZDxlO2QrKyl7Zz10aGlzW2RdO2lmKGcubm9kZVR5cGU9PT0xJiZnLmNsYXNzTmFtZSlpZihhKXtoPSgiICIrZy5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKG4sIiAiKTtmb3IoaT0wLGo9Yy5sZW5ndGg7aTxqO2krKyloPWgucmVwbGFjZSgiICIrY1tpXSsiICIsIiAiKTtnLmNsYXNzTmFtZT1mLnRyaW0oaCl9ZWxzZSBnLmNsYXNzTmFtZT0iIn19cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGEsZD10eXBlb2YgYj09ImJvb2xlYW4iO2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGMpe2YodGhpcykudG9nZ2xlQ2xhc3MoYS5jYWxsKHRoaXMsYyx0aGlzLmNsYXNzTmFtZSxiKSxiKX0pO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtpZihjPT09InN0cmluZyIpe3ZhciBlLGc9MCxoPWYodGhpcyksaT1iLGo9YS5zcGxpdChvKTt3aGlsZShlPWpbZysrXSlpPWQ/aTohaC5oYXNDbGFzcyhlKSxoW2k/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiXShlKX1lbHNlIGlmKGM9PT0idW5kZWZpbmVkInx8Yz09PSJib29sZWFuIil0aGlzLmNsYXNzTmFtZSYmZi5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIix0aGlzLmNsYXNzTmFtZSksdGhpcy5jbGFzc05hbWU9dGhpcy5jbGFzc05hbWV8fGE9PT0hMT8iIjpmLl9kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiJ9KX0saGFzQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGI9IiAiK2ErIiAiO2Zvcih2YXIgYz0wLGQ9dGhpcy5sZW5ndGg7YzxkO2MrKylpZigoIiAiK3RoaXNbY10uY2xhc3NOYW1lKyIgIikucmVwbGFjZShuLCIgIikuaW5kZXhPZihiKT4tMSlyZXR1cm4hMDtyZXR1cm4hMX0sdmFsOmZ1bmN0aW9uKGEpe3ZhciBjLGQsZT10aGlzWzBdO2lmKCFhcmd1bWVudHMubGVuZ3RoKXtpZihlKXtjPWYudmFsSG9va3NbZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXXx8Zi52YWxIb29rc1tlLnR5cGVdO2lmKGMmJiJnZXQiaW4gYyYmKGQ9Yy5nZXQoZSwidmFsdWUiKSkhPT1iKXJldHVybiBkO2Q9ZS52YWx1ZTtyZXR1cm4gdHlwZW9mIGQ9PSJzdHJpbmciP2QucmVwbGFjZShwLCIiKTpkPT1udWxsPyIiOmR9cmV0dXJuIGJ9dmFyIGc9Zi5pc0Z1bmN0aW9uKGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZCl7dmFyIGU9Zih0aGlzKSxoO2lmKHRoaXMubm9kZVR5cGU9PT0xKXtnP2g9YS5jYWxsKHRoaXMsZCxlLnZhbCgpKTpoPWEsaD09bnVsbD9oPSIiOnR5cGVvZiBoPT0ibnVtYmVyIj9oKz0iIjpmLmlzQXJyYXkoaCkmJihoPWYubWFwKGgsZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/IiI6YSsiIn0pKSxjPWYudmFsSG9va3NbdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXXx8Zi52YWxIb29rc1t0aGlzLnR5cGVdO2lmKCFjfHwhKCJzZXQiaW4gYyl8fGMuc2V0KHRoaXMsaCwidmFsdWUiKT09PWIpdGhpcy52YWx1ZT1ofX0pfX0pLGYuZXh0ZW5kKHt2YWxIb29rczp7b3B0aW9uOntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5hdHRyaWJ1dGVzLnZhbHVlO3JldHVybiFifHxiLnNwZWNpZmllZD9hLnZhbHVlOmEudGV4dH19LHNlbGVjdDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiLGM9YS5zZWxlY3RlZEluZGV4LGQ9W10sZT1hLm9wdGlvbnMsZz1hLnR5cGU9PT0ic2VsZWN0LW9uZSI7aWYoYzwwKXJldHVybiBudWxsO2Zvcih2YXIgaD1nP2M6MCxpPWc/YysxOmUubGVuZ3RoO2g8aTtoKyspe3ZhciBqPWVbaF07aWYoai5zZWxlY3RlZCYmKGYuc3VwcG9ydC5vcHREaXNhYmxlZD8hai5kaXNhYmxlZDpqLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKT09PW51bGwpJiYoIWoucGFyZW50Tm9kZS5kaXNhYmxlZHx8IWYubm9kZU5hbWUoai5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7Yj1mKGopLnZhbCgpO2lmKGcpcmV0dXJuIGI7ZC5wdXNoKGIpfX1pZihnJiYhZC5sZW5ndGgmJmUubGVuZ3RoKXJldHVybiBmKGVbY10pLnZhbCgpO3JldHVybiBkfSxzZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz1mLm1ha2VBcnJheShiKTtmKGEpLmZpbmQoIm9wdGlvbiIpLmVhY2goZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGVkPWYuaW5BcnJheShmKHRoaXMpLnZhbCgpLGMpPj0wfSksYy5sZW5ndGh8fChhLnNlbGVjdGVkSW5kZXg9LTEpO3JldHVybiBjfX19LGF0dHJGbjp7dmFsOiEwLGNzczohMCxodG1sOiEwLHRleHQ6ITAsZGF0YTohMCx3aWR0aDohMCxoZWlnaHQ6ITAsb2Zmc2V0OiEwfSxhdHRyRml4Ont0YWJpbmRleDoidGFiSW5kZXgifSxhdHRyOmZ1bmN0aW9uKGEsYyxkLGUpe3ZhciBnPWEubm9kZVR5cGU7aWYoIWF8fGc9PT0zfHxnPT09OHx8Zz09PTIpcmV0dXJuIGI7aWYoZSYmYyBpbiBmLmF0dHJGbilyZXR1cm4gZihhKVtjXShkKTtpZighKCJnZXRBdHRyaWJ1dGUiaW4gYSkpcmV0dXJuIGYucHJvcChhLGMsZCk7dmFyIGgsaSxqPWchPT0xfHwhZi5pc1hNTERvYyhhKTtqJiYoYz1mLmF0dHJGaXhbY118fGMsaT1mLmF0dHJIb29rc1tjXSxpfHwodC50ZXN0KGMpP2k9dzp2JiZjIT09ImNsYXNzTmFtZSImJihmLm5vZGVOYW1lKGEsImZvcm0iKXx8dS50ZXN0KGMpKSYmKGk9dikpKTtpZihkIT09Yil7aWYoZD09PW51bGwpe2YucmVtb3ZlQXR0cihhLGMpO3JldHVybiBifWlmKGkmJiJzZXQiaW4gaSYmaiYmKGg9aS5zZXQoYSxkLGMpKSE9PWIpcmV0dXJuIGg7YS5zZXRBdHRyaWJ1dGUoYywiIitkKTtyZXR1cm4gZH1pZihpJiYiZ2V0ImluIGkmJmomJihoPWkuZ2V0KGEsYykpIT09bnVsbClyZXR1cm4gaDtoPWEuZ2V0QXR0cmlidXRlKGMpO3JldHVybiBoPT09bnVsbD9iOmh9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSxiKXt2YXIgYzthLm5vZGVUeXBlPT09MSYmKGI9Zi5hdHRyRml4W2JdfHxiLGYuc3VwcG9ydC5nZXRTZXRBdHRyaWJ1dGU/YS5yZW1vdmVBdHRyaWJ1dGUoYik6KGYuYXR0cihhLGIsIiIpLGEucmVtb3ZlQXR0cmlidXRlTm9kZShhLmdldEF0dHJpYnV0ZU5vZGUoYikpKSx0LnRlc3QoYikmJihjPWYucHJvcEZpeFtiXXx8YilpbiBhJiYoYVtjXT0hMSkpfSxhdHRySG9va3M6e3R5cGU6e3NldDpmdW5jdGlvbihhLGIpe2lmKHEudGVzdChhLm5vZGVOYW1lKSYmYS5wYXJlbnROb2RlKWYuZXJyb3IoInR5cGUgcHJvcGVydHkgY2FuJ3QgYmUgY2hhbmdlZCIpO2Vsc2UgaWYoIWYuc3VwcG9ydC5yYWRpb1ZhbHVlJiZiPT09InJhZGlvIiYmZi5ub2RlTmFtZShhLCJpbnB1dCIpKXt2YXIgYz1hLnZhbHVlO2Euc2V0QXR0cmlidXRlKCJ0eXBlIixiKSxjJiYoYS52YWx1ZT1jKTtyZXR1cm4gYn19fSx0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBjPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiSW5kZXgiKTtyZXR1cm4gYyYmYy5zcGVjaWZpZWQ/cGFyc2VJbnQoYy52YWx1ZSwxMCk6ci50ZXN0KGEubm9kZU5hbWUpfHxzLnRlc3QoYS5ub2RlTmFtZSkmJmEuaHJlZj8wOmJ9fSx2YWx1ZTp7Z2V0OmZ1bmN0aW9uKGEsYil7aWYodiYmZi5ub2RlTmFtZShhLCJidXR0b24iKSlyZXR1cm4gdi5nZXQoYSxiKTtyZXR1cm4gYiBpbiBhP2EudmFsdWU6bnVsbH0sc2V0OmZ1bmN0aW9uKGEsYixjKXtpZih2JiZmLm5vZGVOYW1lKGEsImJ1dHRvbiIpKXJldHVybiB2LnNldChhLGIsYyk7YS52YWx1ZT1ifX19LHByb3BGaXg6e3RhYmluZGV4OiJ0YWJJbmRleCIscmVhZG9ubHk6InJlYWRPbmx5IiwiZm9yIjoiaHRtbEZvciIsImNsYXNzIjoiY2xhc3NOYW1lIixtYXhsZW5ndGg6Im1heExlbmd0aCIsY2VsbHNwYWNpbmc6ImNlbGxTcGFjaW5nIixjZWxscGFkZGluZzoiY2VsbFBhZGRpbmciLHJvd3NwYW46InJvd1NwYW4iLGNvbHNwYW46ImNvbFNwYW4iLHVzZW1hcDoidXNlTWFwIixmcmFtZWJvcmRlcjoiZnJhbWVCb3JkZXIiLGNvbnRlbnRlZGl0YWJsZToiY29udGVudEVkaXRhYmxlIn0scHJvcDpmdW5jdGlvbihhLGMsZCl7dmFyIGU9YS5ub2RlVHlwZTtpZighYXx8ZT09PTN8fGU9PT04fHxlPT09MilyZXR1cm4gYjt2YXIgZyxoLGk9ZSE9PTF8fCFmLmlzWE1MRG9jKGEpO2kmJihjPWYucHJvcEZpeFtjXXx8YyxoPWYucHJvcEhvb2tzW2NdKTtyZXR1cm4gZCE9PWI/aCYmInNldCJpbiBoJiYoZz1oLnNldChhLGQsYykpIT09Yj9nOmFbY109ZDpoJiYiZ2V0ImluIGgmJihnPWguZ2V0KGEsYykpIT09Yj9nOmFbY119LHByb3BIb29rczp7fX0pLHc9e2dldDpmdW5jdGlvbihhLGMpe3JldHVybiBmLnByb3AoYSxjKT9jLnRvTG93ZXJDYXNlKCk6Yn0sc2V0OmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtiPT09ITE/Zi5yZW1vdmVBdHRyKGEsYyk6KGQ9Zi5wcm9wRml4W2NdfHxjLGQgaW4gYSYmKGFbZF09ITApLGEuc2V0QXR0cmlidXRlKGMsYy50b0xvd2VyQ2FzZSgpKSk7cmV0dXJuIGN9fSxmLnN1cHBvcnQuZ2V0U2V0QXR0cmlidXRlfHwoZi5hdHRyRml4PWYucHJvcEZpeCx2PWYuYXR0ckhvb2tzLm5hbWU9Zi5hdHRySG9va3MudGl0bGU9Zi52YWxIb29rcy5idXR0b249e2dldDpmdW5jdGlvbihhLGMpe3ZhciBkO2Q9YS5nZXRBdHRyaWJ1dGVOb2RlKGMpO3JldHVybiBkJiZkLm5vZGVWYWx1ZSE9PSIiP2Qubm9kZVZhbHVlOmJ9LHNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRBdHRyaWJ1dGVOb2RlKGMpO2lmKGQpe2Qubm9kZVZhbHVlPWI7cmV0dXJuIGJ9fX0sZi5lYWNoKFsid2lkdGgiLCJoZWlnaHQiXSxmdW5jdGlvbihhLGIpe2YuYXR0ckhvb2tzW2JdPWYuZXh0ZW5kKGYuYXR0ckhvb2tzW2JdLHtzZXQ6ZnVuY3Rpb24oYSxjKXtpZihjPT09IiIpe2Euc2V0QXR0cmlidXRlKGIsImF1dG8iKTtyZXR1cm4gY319fSl9KSksZi5zdXBwb3J0LmhyZWZOb3JtYWxpemVkfHxmLmVhY2goWyJocmVmIiwic3JjIiwid2lkdGgiLCJoZWlnaHQiXSxmdW5jdGlvbihhLGMpe2YuYXR0ckhvb2tzW2NdPWYuZXh0ZW5kKGYuYXR0ckhvb2tzW2NdLHtnZXQ6ZnVuY3Rpb24oYSl7dmFyIGQ9YS5nZXRBdHRyaWJ1dGUoYywyKTtyZXR1cm4gZD09PW51bGw/YjpkfX0pfSksZi5zdXBwb3J0LnN0eWxlfHwoZi5hdHRySG9va3Muc3R5bGU9e2dldDpmdW5jdGlvbihhKXtyZXR1cm4gYS5zdHlsZS5jc3NUZXh0LnRvTG93ZXJDYXNlKCl8fGJ9LHNldDpmdW5jdGlvbihhLGIpe3JldHVybiBhLnN0eWxlLmNzc1RleHQ9IiIrYn19KSxmLnN1cHBvcnQub3B0U2VsZWN0ZWR8fChmLnByb3BIb29rcy5zZWxlY3RlZD1mLmV4dGVuZChmLnByb3BIb29rcy5zZWxlY3RlZCx7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEucGFyZW50Tm9kZTtiJiYoYi5zZWxlY3RlZEluZGV4LGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpfX0pKSxmLnN1cHBvcnQuY2hlY2tPbnx8Zi5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7Zi52YWxIb29rc1t0aGlzXT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgidmFsdWUiKT09PW51bGw/Im9uIjphLnZhbHVlfX19KSxmLmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXtmLnZhbEhvb2tzW3RoaXNdPWYuZXh0ZW5kKGYudmFsSG9va3NbdGhpc10se3NldDpmdW5jdGlvbihhLGIpe2lmKGYuaXNBcnJheShiKSlyZXR1cm4gYS5jaGVja2VkPWYuaW5BcnJheShmKGEpLnZhbCgpLGIpPj0wfX0pfSk7dmFyIHg9L1wuKC4qKSQvLHk9L14oPzp0ZXh0YXJlYXxpbnB1dHxzZWxlY3QpJC9pLHo9L1wuL2csQT0vIC9nLEI9L1teXHdccy58YF0vZyxDPWZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoQiwiXFwkJiIpfTtmLmV2ZW50PXthZGQ6ZnVuY3Rpb24oYSxjLGQsZSl7aWYoYS5ub2RlVHlwZSE9PTMmJmEubm9kZVR5cGUhPT04KXtpZihkPT09ITEpZD1EO2Vsc2UgaWYoIWQpcmV0dXJuO3ZhciBnLGg7ZC5oYW5kbGVyJiYoZz1kLGQ9Zy5oYW5kbGVyKSxkLmd1aWR8fChkLmd1aWQ9Zi5ndWlkKyspO3ZhciBpPWYuX2RhdGEoYSk7aWYoIWkpcmV0dXJuO3ZhciBqPWkuZXZlbnRzLGs9aS5oYW5kbGU7anx8KGkuZXZlbnRzPWo9e30pLGt8fChpLmhhbmRsZT1rPWZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgZiE9InVuZGVmaW5lZCImJighYXx8Zi5ldmVudC50cmlnZ2VyZWQhPT1hLnR5cGUpP2YuZXZlbnQuaGFuZGxlLmFwcGx5KGsuZWxlbSxhcmd1bWVudHMpOmJ9KSxrLmVsZW09YSxjPWMuc3BsaXQoIiAiKTt2YXIgbCxtPTAsbjt3aGlsZShsPWNbbSsrXSl7aD1nP2YuZXh0ZW5kKHt9LGcpOntoYW5kbGVyOmQsZGF0YTplfSxsLmluZGV4T2YoIi4iKT4tMT8obj1sLnNwbGl0KCIuIiksbD1uLnNoaWZ0KCksaC5uYW1lc3BhY2U9bi5zbGljZSgwKS5zb3J0KCkuam9pbigiLiIpKToobj1bXSxoLm5hbWVzcGFjZT0iIiksaC50eXBlPWwsaC5ndWlkfHwoaC5ndWlkPWQuZ3VpZCk7dmFyIG89altsXSxwPWYuZXZlbnQuc3BlY2lhbFtsXXx8e307aWYoIW8pe289altsXT1bXTtpZighcC5zZXR1cHx8cC5zZXR1cC5jYWxsKGEsZSxuLGspPT09ITEpYS5hZGRFdmVudExpc3RlbmVyP2EuYWRkRXZlbnRMaXN0ZW5lcihsLGssITEpOmEuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9uIitsLGspfXAuYWRkJiYocC5hZGQuY2FsbChhLGgpLGguaGFuZGxlci5ndWlkfHwoaC5oYW5kbGVyLmd1aWQ9ZC5ndWlkKSksby5wdXNoKGgpLGYuZXZlbnQuZ2xvYmFsW2xdPSEwfWE9bnVsbH19LGdsb2JhbDp7fSxyZW1vdmU6ZnVuY3Rpb24oYSxjLGQsZSl7aWYoYS5ub2RlVHlwZSE9PTMmJmEubm9kZVR5cGUhPT04KXtkPT09ITEmJihkPUQpO3ZhciBnLGgsaSxqLGs9MCxsLG0sbixvLHAscSxyLHM9Zi5oYXNEYXRhKGEpJiZmLl9kYXRhKGEpLHQ9cyYmcy5ldmVudHM7aWYoIXN8fCF0KXJldHVybjtjJiZjLnR5cGUmJihkPWMuaGFuZGxlcixjPWMudHlwZSk7aWYoIWN8fHR5cGVvZiBjPT0ic3RyaW5nIiYmYy5jaGFyQXQoMCk9PT0iLiIpe2M9Y3x8IiI7Zm9yKGggaW4gdClmLmV2ZW50LnJlbW92ZShhLGgrYyk7cmV0dXJufWM9Yy5zcGxpdCgiICIpO3doaWxlKGg9Y1trKytdKXtyPWgscT1udWxsLGw9aC5pbmRleE9mKCIuIik8MCxtPVtdLGx8fChtPWguc3BsaXQoIi4iKSxoPW0uc2hpZnQoKSxuPW5ldyBSZWdFeHAoIihefFxcLikiK2YubWFwKG0uc2xpY2UoMCkuc29ydCgpLEMpLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSsiKFxcLnwkKSIpKSxwPXRbaF07aWYoIXApY29udGludWU7aWYoIWQpe2ZvcihqPTA7ajxwLmxlbmd0aDtqKyspe3E9cFtqXTtpZihsfHxuLnRlc3QocS5uYW1lc3BhY2UpKWYuZXZlbnQucmVtb3ZlKGEscixxLmhhbmRsZXIsaikscC5zcGxpY2Uoai0tLDEpfWNvbnRpbnVlfW89Zi5ldmVudC5zcGVjaWFsW2hdfHx7fTtmb3Ioaj1lfHwwO2o8cC5sZW5ndGg7aisrKXtxPXBbal07aWYoZC5ndWlkPT09cS5ndWlkKXtpZihsfHxuLnRlc3QocS5uYW1lc3BhY2UpKWU9PW51bGwmJnAuc3BsaWNlKGotLSwxKSxvLnJlbW92ZSYmby5yZW1vdmUuY2FsbChhLHEpO2lmKGUhPW51bGwpYnJlYWt9fWlmKHAubGVuZ3RoPT09MHx8ZSE9bnVsbCYmcC5sZW5ndGg9PT0xKSghby50ZWFyZG93bnx8by50ZWFyZG93bi5jYWxsKGEsbSk9PT0hMSkmJmYucmVtb3ZlRXZlbnQoYSxoLHMuaGFuZGxlKSxnPW51bGwsZGVsZXRlIHRbaF19aWYoZi5pc0VtcHR5T2JqZWN0KHQpKXt2YXIgdT1zLmhhbmRsZTt1JiYodS5lbGVtPW51bGwpLGRlbGV0ZSBzLmV2ZW50cyxkZWxldGUgcy5oYW5kbGUsZi5pc0VtcHR5T2JqZWN0KHMpJiZmLnJlbW92ZURhdGEoYSxiLCEwKX19fSxjdXN0b21FdmVudDp7Z2V0RGF0YTohMCxzZXREYXRhOiEwLGNoYW5nZURhdGE6ITB9LHRyaWdnZXI6ZnVuY3Rpb24oYyxkLGUsZyl7dmFyIGg9Yy50eXBlfHxjLGk9W10sajtoLmluZGV4T2YoIiEiKT49MCYmKGg9aC5zbGljZSgwLC0xKSxqPSEwKSxoLmluZGV4T2YoIi4iKT49MCYmKGk9aC5zcGxpdCgiLiIpLGg9aS4Kc2hpZnQoKSxpLnNvcnQoKSk7aWYoISFlJiYhZi5ldmVudC5jdXN0b21FdmVudFtoXXx8ISFmLmV2ZW50Lmdsb2JhbFtoXSl7Yz10eXBlb2YgYz09Im9iamVjdCI/Y1tmLmV4cGFuZG9dP2M6bmV3IGYuRXZlbnQoaCxjKTpuZXcgZi5FdmVudChoKSxjLnR5cGU9aCxjLmV4Y2x1c2l2ZT1qLGMubmFtZXNwYWNlPWkuam9pbigiLiIpLGMubmFtZXNwYWNlX3JlPW5ldyBSZWdFeHAoIihefFxcLikiK2kuam9pbigiXFwuKD86LipcXC4pPyIpKyIoXFwufCQpIik7aWYoZ3x8IWUpYy5wcmV2ZW50RGVmYXVsdCgpLGMuc3RvcFByb3BhZ2F0aW9uKCk7aWYoIWUpe2YuZWFjaChmLmNhY2hlLGZ1bmN0aW9uKCl7dmFyIGE9Zi5leHBhbmRvLGI9dGhpc1thXTtiJiZiLmV2ZW50cyYmYi5ldmVudHNbaF0mJmYuZXZlbnQudHJpZ2dlcihjLGQsYi5oYW5kbGUuZWxlbSl9KTtyZXR1cm59aWYoZS5ub2RlVHlwZT09PTN8fGUubm9kZVR5cGU9PT04KXJldHVybjtjLnJlc3VsdD1iLGMudGFyZ2V0PWUsZD1kIT1udWxsP2YubWFrZUFycmF5KGQpOltdLGQudW5zaGlmdChjKTt2YXIgaz1lLGw9aC5pbmRleE9mKCI6Iik8MD8ib24iK2g6IiI7ZG97dmFyIG09Zi5fZGF0YShrLCJoYW5kbGUiKTtjLmN1cnJlbnRUYXJnZXQ9ayxtJiZtLmFwcGx5KGssZCksbCYmZi5hY2NlcHREYXRhKGspJiZrW2xdJiZrW2xdLmFwcGx5KGssZCk9PT0hMSYmKGMucmVzdWx0PSExLGMucHJldmVudERlZmF1bHQoKSksaz1rLnBhcmVudE5vZGV8fGsub3duZXJEb2N1bWVudHx8az09PWMudGFyZ2V0Lm93bmVyRG9jdW1lbnQmJmF9d2hpbGUoayYmIWMuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSk7aWYoIWMuaXNEZWZhdWx0UHJldmVudGVkKCkpe3ZhciBuLG89Zi5ldmVudC5zcGVjaWFsW2hdfHx7fTtpZigoIW8uX2RlZmF1bHR8fG8uX2RlZmF1bHQuY2FsbChlLm93bmVyRG9jdW1lbnQsYyk9PT0hMSkmJihoIT09ImNsaWNrInx8IWYubm9kZU5hbWUoZSwiYSIpKSYmZi5hY2NlcHREYXRhKGUpKXt0cnl7bCYmZVtoXSYmKG49ZVtsXSxuJiYoZVtsXT1udWxsKSxmLmV2ZW50LnRyaWdnZXJlZD1oLGVbaF0oKSl9Y2F0Y2gocCl7fW4mJihlW2xdPW4pLGYuZXZlbnQudHJpZ2dlcmVkPWJ9fXJldHVybiBjLnJlc3VsdH19LGhhbmRsZTpmdW5jdGlvbihjKXtjPWYuZXZlbnQuZml4KGN8fGEuZXZlbnQpO3ZhciBkPSgoZi5fZGF0YSh0aGlzLCJldmVudHMiKXx8e30pW2MudHlwZV18fFtdKS5zbGljZSgwKSxlPSFjLmV4Y2x1c2l2ZSYmIWMubmFtZXNwYWNlLGc9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApO2dbMF09YyxjLmN1cnJlbnRUYXJnZXQ9dGhpcztmb3IodmFyIGg9MCxpPWQubGVuZ3RoO2g8aTtoKyspe3ZhciBqPWRbaF07aWYoZXx8Yy5uYW1lc3BhY2VfcmUudGVzdChqLm5hbWVzcGFjZSkpe2MuaGFuZGxlcj1qLmhhbmRsZXIsYy5kYXRhPWouZGF0YSxjLmhhbmRsZU9iaj1qO3ZhciBrPWouaGFuZGxlci5hcHBseSh0aGlzLGcpO2shPT1iJiYoYy5yZXN1bHQ9ayxrPT09ITEmJihjLnByZXZlbnREZWZhdWx0KCksYy5zdG9wUHJvcGFnYXRpb24oKSkpO2lmKGMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSlicmVha319cmV0dXJuIGMucmVzdWx0fSxwcm9wczoiYWx0S2V5IGF0dHJDaGFuZ2UgYXR0ck5hbWUgYnViYmxlcyBidXR0b24gY2FuY2VsYWJsZSBjaGFyQ29kZSBjbGllbnRYIGNsaWVudFkgY3RybEtleSBjdXJyZW50VGFyZ2V0IGRhdGEgZGV0YWlsIGV2ZW50UGhhc2UgZnJvbUVsZW1lbnQgaGFuZGxlciBrZXlDb2RlIGxheWVyWCBsYXllclkgbWV0YUtleSBuZXdWYWx1ZSBvZmZzZXRYIG9mZnNldFkgcGFnZVggcGFnZVkgcHJldlZhbHVlIHJlbGF0ZWROb2RlIHJlbGF0ZWRUYXJnZXQgc2NyZWVuWCBzY3JlZW5ZIHNoaWZ0S2V5IHNyY0VsZW1lbnQgdGFyZ2V0IHRvRWxlbWVudCB2aWV3IHdoZWVsRGVsdGEgd2hpY2giLnNwbGl0KCIgIiksZml4OmZ1bmN0aW9uKGEpe2lmKGFbZi5leHBhbmRvXSlyZXR1cm4gYTt2YXIgZD1hO2E9Zi5FdmVudChkKTtmb3IodmFyIGU9dGhpcy5wcm9wcy5sZW5ndGgsZztlOylnPXRoaXMucHJvcHNbLS1lXSxhW2ddPWRbZ107YS50YXJnZXR8fChhLnRhcmdldD1hLnNyY0VsZW1lbnR8fGMpLGEudGFyZ2V0Lm5vZGVUeXBlPT09MyYmKGEudGFyZ2V0PWEudGFyZ2V0LnBhcmVudE5vZGUpLCFhLnJlbGF0ZWRUYXJnZXQmJmEuZnJvbUVsZW1lbnQmJihhLnJlbGF0ZWRUYXJnZXQ9YS5mcm9tRWxlbWVudD09PWEudGFyZ2V0P2EudG9FbGVtZW50OmEuZnJvbUVsZW1lbnQpO2lmKGEucGFnZVg9PW51bGwmJmEuY2xpZW50WCE9bnVsbCl7dmFyIGg9YS50YXJnZXQub3duZXJEb2N1bWVudHx8YyxpPWguZG9jdW1lbnRFbGVtZW50LGo9aC5ib2R5O2EucGFnZVg9YS5jbGllbnRYKyhpJiZpLnNjcm9sbExlZnR8fGomJmouc2Nyb2xsTGVmdHx8MCktKGkmJmkuY2xpZW50TGVmdHx8aiYmai5jbGllbnRMZWZ0fHwwKSxhLnBhZ2VZPWEuY2xpZW50WSsoaSYmaS5zY3JvbGxUb3B8fGomJmouc2Nyb2xsVG9wfHwwKS0oaSYmaS5jbGllbnRUb3B8fGomJmouY2xpZW50VG9wfHwwKX1hLndoaWNoPT1udWxsJiYoYS5jaGFyQ29kZSE9bnVsbHx8YS5rZXlDb2RlIT1udWxsKSYmKGEud2hpY2g9YS5jaGFyQ29kZSE9bnVsbD9hLmNoYXJDb2RlOmEua2V5Q29kZSksIWEubWV0YUtleSYmYS5jdHJsS2V5JiYoYS5tZXRhS2V5PWEuY3RybEtleSksIWEud2hpY2gmJmEuYnV0dG9uIT09YiYmKGEud2hpY2g9YS5idXR0b24mMT8xOmEuYnV0dG9uJjI/MzphLmJ1dHRvbiY0PzI6MCk7cmV0dXJuIGF9LGd1aWQ6MWU4LHByb3h5OmYucHJveHksc3BlY2lhbDp7cmVhZHk6e3NldHVwOmYuYmluZFJlYWR5LHRlYXJkb3duOmYubm9vcH0sbGl2ZTp7YWRkOmZ1bmN0aW9uKGEpe2YuZXZlbnQuYWRkKHRoaXMsTihhLm9yaWdUeXBlLGEuc2VsZWN0b3IpLGYuZXh0ZW5kKHt9LGEse2hhbmRsZXI6TSxndWlkOmEuaGFuZGxlci5ndWlkfSkpfSxyZW1vdmU6ZnVuY3Rpb24oYSl7Zi5ldmVudC5yZW1vdmUodGhpcyxOKGEub3JpZ1R5cGUsYS5zZWxlY3RvciksYSl9fSxiZWZvcmV1bmxvYWQ6e3NldHVwOmZ1bmN0aW9uKGEsYixjKXtmLmlzV2luZG93KHRoaXMpJiYodGhpcy5vbmJlZm9yZXVubG9hZD1jKX0sdGVhcmRvd246ZnVuY3Rpb24oYSxiKXt0aGlzLm9uYmVmb3JldW5sb2FkPT09YiYmKHRoaXMub25iZWZvcmV1bmxvYWQ9bnVsbCl9fX19LGYucmVtb3ZlRXZlbnQ9Yy5yZW1vdmVFdmVudExpc3RlbmVyP2Z1bmN0aW9uKGEsYixjKXthLnJlbW92ZUV2ZW50TGlzdGVuZXImJmEucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGMsITEpfTpmdW5jdGlvbihhLGIsYyl7YS5kZXRhY2hFdmVudCYmYS5kZXRhY2hFdmVudCgib24iK2IsYyl9LGYuRXZlbnQ9ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5wcmV2ZW50RGVmYXVsdClyZXR1cm4gbmV3IGYuRXZlbnQoYSxiKTthJiZhLnR5cGU/KHRoaXMub3JpZ2luYWxFdmVudD1hLHRoaXMudHlwZT1hLnR5cGUsdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9YS5kZWZhdWx0UHJldmVudGVkfHxhLnJldHVyblZhbHVlPT09ITF8fGEuZ2V0UHJldmVudERlZmF1bHQmJmEuZ2V0UHJldmVudERlZmF1bHQoKT9FOkQpOnRoaXMudHlwZT1hLGImJmYuZXh0ZW5kKHRoaXMsYiksdGhpcy50aW1lU3RhbXA9Zi5ub3coKSx0aGlzW2YuZXhwYW5kb109ITB9LGYuRXZlbnQucHJvdG90eXBlPXtwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPUU7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50OyFhfHwoYS5wcmV2ZW50RGVmYXVsdD9hLnByZXZlbnREZWZhdWx0KCk6YS5yZXR1cm5WYWx1ZT0hMSl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9RTt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7IWF8fChhLnN0b3BQcm9wYWdhdGlvbiYmYS5zdG9wUHJvcGFnYXRpb24oKSxhLmNhbmNlbEJ1YmJsZT0hMCl9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9RSx0aGlzLnN0b3BQcm9wYWdhdGlvbigpfSxpc0RlZmF1bHRQcmV2ZW50ZWQ6RCxpc1Byb3BhZ2F0aW9uU3RvcHBlZDpELGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOkR9O3ZhciBGPWZ1bmN0aW9uKGEpe3ZhciBiPWEucmVsYXRlZFRhcmdldCxjPSExLGQ9YS50eXBlO2EudHlwZT1hLmRhdGEsYiE9PXRoaXMmJihiJiYoYz1mLmNvbnRhaW5zKHRoaXMsYikpLGN8fChmLmV2ZW50LmhhbmRsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksYS50eXBlPWQpKX0sRz1mdW5jdGlvbihhKXthLnR5cGU9YS5kYXRhLGYuZXZlbnQuaGFuZGxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07Zi5lYWNoKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0In0sZnVuY3Rpb24oYSxiKXtmLmV2ZW50LnNwZWNpYWxbYV09e3NldHVwOmZ1bmN0aW9uKGMpe2YuZXZlbnQuYWRkKHRoaXMsYixjJiZjLnNlbGVjdG9yP0c6RixhKX0sdGVhcmRvd246ZnVuY3Rpb24oYSl7Zi5ldmVudC5yZW1vdmUodGhpcyxiLGEmJmEuc2VsZWN0b3I/RzpGKX19fSksZi5zdXBwb3J0LnN1Ym1pdEJ1YmJsZXN8fChmLmV2ZW50LnNwZWNpYWwuc3VibWl0PXtzZXR1cDpmdW5jdGlvbihhLGIpe2lmKCFmLm5vZGVOYW1lKHRoaXMsImZvcm0iKSlmLmV2ZW50LmFkZCh0aGlzLCJjbGljay5zcGVjaWFsU3VibWl0IixmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldCxjPWIudHlwZTsoYz09PSJzdWJtaXQifHxjPT09ImltYWdlIikmJmYoYikuY2xvc2VzdCgiZm9ybSIpLmxlbmd0aCYmSygic3VibWl0Iix0aGlzLGFyZ3VtZW50cyl9KSxmLmV2ZW50LmFkZCh0aGlzLCJrZXlwcmVzcy5zcGVjaWFsU3VibWl0IixmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldCxjPWIudHlwZTsoYz09PSJ0ZXh0Inx8Yz09PSJwYXNzd29yZCIpJiZmKGIpLmNsb3Nlc3QoImZvcm0iKS5sZW5ndGgmJmEua2V5Q29kZT09PTEzJiZLKCJzdWJtaXQiLHRoaXMsYXJndW1lbnRzKX0pO2Vsc2UgcmV0dXJuITF9LHRlYXJkb3duOmZ1bmN0aW9uKGEpe2YuZXZlbnQucmVtb3ZlKHRoaXMsIi5zcGVjaWFsU3VibWl0Iil9fSk7aWYoIWYuc3VwcG9ydC5jaGFuZ2VCdWJibGVzKXt2YXIgSCxJPWZ1bmN0aW9uKGEpe3ZhciBiPWEudHlwZSxjPWEudmFsdWU7Yj09PSJyYWRpbyJ8fGI9PT0iY2hlY2tib3giP2M9YS5jaGVja2VkOmI9PT0ic2VsZWN0LW11bHRpcGxlIj9jPWEuc2VsZWN0ZWRJbmRleD4tMT9mLm1hcChhLm9wdGlvbnMsZnVuY3Rpb24oYSl7cmV0dXJuIGEuc2VsZWN0ZWR9KS5qb2luKCItIik6IiI6Zi5ub2RlTmFtZShhLCJzZWxlY3QiKSYmKGM9YS5zZWxlY3RlZEluZGV4KTtyZXR1cm4gY30sSj1mdW5jdGlvbihjKXt2YXIgZD1jLnRhcmdldCxlLGc7aWYoISF5LnRlc3QoZC5ub2RlTmFtZSkmJiFkLnJlYWRPbmx5KXtlPWYuX2RhdGEoZCwiX2NoYW5nZV9kYXRhIiksZz1JKGQpLChjLnR5cGUhPT0iZm9jdXNvdXQifHxkLnR5cGUhPT0icmFkaW8iKSYmZi5fZGF0YShkLCJfY2hhbmdlX2RhdGEiLGcpO2lmKGU9PT1ifHxnPT09ZSlyZXR1cm47aWYoZSE9bnVsbHx8ZyljLnR5cGU9ImNoYW5nZSIsYy5saXZlRmlyZWQ9YixmLmV2ZW50LnRyaWdnZXIoYyxhcmd1bWVudHNbMV0sZCl9fTtmLmV2ZW50LnNwZWNpYWwuY2hhbmdlPXtmaWx0ZXJzOntmb2N1c291dDpKLGJlZm9yZWRlYWN0aXZhdGU6SixjbGljazpmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldCxjPWYubm9kZU5hbWUoYiwiaW5wdXQiKT9iLnR5cGU6IiI7KGM9PT0icmFkaW8ifHxjPT09ImNoZWNrYm94Inx8Zi5ub2RlTmFtZShiLCJzZWxlY3QiKSkmJkouY2FsbCh0aGlzLGEpfSxrZXlkb3duOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0LGM9Zi5ub2RlTmFtZShiLCJpbnB1dCIpP2IudHlwZToiIjsoYS5rZXlDb2RlPT09MTMmJiFmLm5vZGVOYW1lKGIsInRleHRhcmVhIil8fGEua2V5Q29kZT09PTMyJiYoYz09PSJjaGVja2JveCJ8fGM9PT0icmFkaW8iKXx8Yz09PSJzZWxlY3QtbXVsdGlwbGUiKSYmSi5jYWxsKHRoaXMsYSl9LGJlZm9yZWFjdGl2YXRlOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0O2YuX2RhdGEoYiwiX2NoYW5nZV9kYXRhIixJKGIpKX19LHNldHVwOmZ1bmN0aW9uKGEsYil7aWYodGhpcy50eXBlPT09ImZpbGUiKXJldHVybiExO2Zvcih2YXIgYyBpbiBIKWYuZXZlbnQuYWRkKHRoaXMsYysiLnNwZWNpYWxDaGFuZ2UiLEhbY10pO3JldHVybiB5LnRlc3QodGhpcy5ub2RlTmFtZSl9LHRlYXJkb3duOmZ1bmN0aW9uKGEpe2YuZXZlbnQucmVtb3ZlKHRoaXMsIi5zcGVjaWFsQ2hhbmdlIik7cmV0dXJuIHkudGVzdCh0aGlzLm5vZGVOYW1lKX19LEg9Zi5ldmVudC5zcGVjaWFsLmNoYW5nZS5maWx0ZXJzLEguZm9jdXM9SC5iZWZvcmVhY3RpdmF0ZX1mLnN1cHBvcnQuZm9jdXNpbkJ1YmJsZXN8fGYuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBlKGEpe3ZhciBjPWYuZXZlbnQuZml4KGEpO2MudHlwZT1iLGMub3JpZ2luYWxFdmVudD17fSxmLmV2ZW50LnRyaWdnZXIoYyxudWxsLGMudGFyZ2V0KSxjLmlzRGVmYXVsdFByZXZlbnRlZCgpJiZhLnByZXZlbnREZWZhdWx0KCl9dmFyIGQ9MDtmLmV2ZW50LnNwZWNpYWxbYl09e3NldHVwOmZ1bmN0aW9uKCl7ZCsrPT09MCYmYy5hZGRFdmVudExpc3RlbmVyKGEsZSwhMCl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7LS1kPT09MCYmYy5yZW1vdmVFdmVudExpc3RlbmVyKGEsZSwhMCl9fX0pLGYuZWFjaChbImJpbmQiLCJvbmUiXSxmdW5jdGlvbihhLGMpe2YuZm5bY109ZnVuY3Rpb24oYSxkLGUpe3ZhciBnO2lmKHR5cGVvZiBhPT0ib2JqZWN0Iil7Zm9yKHZhciBoIGluIGEpdGhpc1tjXShoLGQsYVtoXSxlKTtyZXR1cm4gdGhpc31pZihhcmd1bWVudHMubGVuZ3RoPT09Mnx8ZD09PSExKWU9ZCxkPWI7Yz09PSJvbmUiPyhnPWZ1bmN0aW9uKGEpe2YodGhpcykudW5iaW5kKGEsZyk7cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxnLmd1aWQ9ZS5ndWlkfHxmLmd1aWQrKyk6Zz1lO2lmKGE9PT0idW5sb2FkIiYmYyE9PSJvbmUiKXRoaXMub25lKGEsZCxlKTtlbHNlIGZvcih2YXIgaT0wLGo9dGhpcy5sZW5ndGg7aTxqO2krKylmLmV2ZW50LmFkZCh0aGlzW2ldLGEsZyxkKTtyZXR1cm4gdGhpc319KSxmLmZuLmV4dGVuZCh7dW5iaW5kOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGE9PSJvYmplY3QiJiYhYS5wcmV2ZW50RGVmYXVsdClmb3IodmFyIGMgaW4gYSl0aGlzLnVuYmluZChjLGFbY10pO2Vsc2UgZm9yKHZhciBkPTAsZT10aGlzLmxlbmd0aDtkPGU7ZCsrKWYuZXZlbnQucmVtb3ZlKHRoaXNbZF0sYSxiKTtyZXR1cm4gdGhpc30sZGVsZWdhdGU6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMubGl2ZShiLGMsZCxhKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PT0wP3RoaXMudW5iaW5kKCJsaXZlIik6dGhpcy5kaWUoYixudWxsLGMsYSl9LHRyaWdnZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5ldmVudC50cmlnZ2VyKGEsYix0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihhLGIpe2lmKHRoaXNbMF0pcmV0dXJuIGYuZXZlbnQudHJpZ2dlcihhLGIsdGhpc1swXSwhMCl9LHRvZ2dsZTpmdW5jdGlvbihhKXt2YXIgYj1hcmd1bWVudHMsYz1hLmd1aWR8fGYuZ3VpZCsrLGQ9MCxlPWZ1bmN0aW9uKGMpe3ZhciBlPShmLmRhdGEodGhpcywibGFzdFRvZ2dsZSIrYS5ndWlkKXx8MCklZDtmLmRhdGEodGhpcywibGFzdFRvZ2dsZSIrYS5ndWlkLGUrMSksYy5wcmV2ZW50RGVmYXVsdCgpO3JldHVybiBiW2VdLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8ITF9O2UuZ3VpZD1jO3doaWxlKGQ8Yi5sZW5ndGgpYltkKytdLmd1aWQ9YztyZXR1cm4gdGhpcy5jbGljayhlKX0saG92ZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGEpLm1vdXNlbGVhdmUoYnx8YSl9fSk7dmFyIEw9e2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCIsbW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9O2YuZWFjaChbImxpdmUiLCJkaWUiXSxmdW5jdGlvbihhLGMpe2YuZm5bY109ZnVuY3Rpb24oYSxkLGUsZyl7dmFyIGgsaT0wLGosayxsLG09Z3x8dGhpcy5zZWxlY3RvcixuPWc/dGhpczpmKHRoaXMuY29udGV4dCk7aWYodHlwZW9mIGE9PSJvYmplY3QiJiYhYS5wcmV2ZW50RGVmYXVsdCl7Zm9yKHZhciBvIGluIGEpbltjXShvLGQsYVtvXSxtKTtyZXR1cm4gdGhpc31pZihjPT09ImRpZSImJiFhJiZnJiZnLmNoYXJBdCgwKT09PSIuIil7bi51bmJpbmQoZyk7cmV0dXJuIHRoaXN9aWYoZD09PSExfHxmLmlzRnVuY3Rpb24oZCkpZT1kfHxELGQ9YjthPShhfHwiIikuc3BsaXQoIiAiKTt3aGlsZSgoaD1hW2krK10pIT1udWxsKXtqPXguZXhlYyhoKSxrPSIiLGomJihrPWpbMF0saD1oLnJlcGxhY2UoeCwiIikpO2lmKGg9PT0iaG92ZXIiKXthLnB1c2goIm1vdXNlZW50ZXIiK2ssIm1vdXNlbGVhdmUiK2spO2NvbnRpbnVlfWw9aCxMW2hdPyhhLnB1c2goTFtoXStrKSxoPWgrayk6aD0oTFtoXXx8aCkraztpZihjPT09ImxpdmUiKWZvcih2YXIgcD0wLHE9bi5sZW5ndGg7cDxxO3ArKylmLmV2ZW50LmFkZChuW3BdLCJsaXZlLiIrTihoLG0pLHtkYXRhOmQsc2VsZWN0b3I6bSxoYW5kbGVyOmUsb3JpZ1R5cGU6aCxvcmlnSGFuZGxlcjplLHByZVR5cGU6bH0pO2Vsc2Ugbi51bmJpbmQoImxpdmUuIitOKGgsbSksZSl9cmV0dXJuIHRoaXN9fSksZi5lYWNoKCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgbG9hZCByZXNpemUgc2Nyb2xsIHVubG9hZCBjbGljayBkYmxjbGljayBtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGVycm9yIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7Zi5mbltiXT1mdW5jdGlvbihhLGMpe2M9PW51bGwmJihjPWEsYT1udWxsKTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4wP3RoaXMuYmluZChiLGEsYyk6dGhpcy50cmlnZ2VyKGIpfSxmLmF0dHJGbiYmKGYuYXR0ckZuW2JdPSEwKX0pLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdShhLGIsYyxkLGUsZil7Zm9yKHZhciBnPTAsaD1kLmxlbmd0aDtnPGg7ZysrKXt2YXIgaT1kW2ddO2lmKGkpe3ZhciBqPSExO2k9aVthXTt3aGlsZShpKXtpZihpLnNpemNhY2hlPT09Yyl7aj1kW2kuc2l6c2V0XTticmVha31pZihpLm5vZGVUeXBlPT09MSl7Znx8KGkuc2l6Y2FjaGU9YyxpLnNpenNldD1nKTtpZih0eXBlb2YgYiE9InN0cmluZyIpe2lmKGk9PT1iKXtqPSEwO2JyZWFrfX1lbHNlIGlmKGsuZmlsdGVyKGIsW2ldKS5sZW5ndGg+MCl7aj1pO2JyZWFrfX1pPWlbYV19ZFtnXT1qfX19ZnVuY3Rpb24gdChhLGIsYyxkLGUsZil7Zm9yKHZhciBnPTAsaD1kLmxlbmd0aDtnPGg7ZysrKXt2YXIgaT1kW2ddO2lmKGkpe3ZhciBqPSExO2k9aVthXTt3aGlsZShpKXtpZihpLnNpemNhY2hlPT09Yyl7aj1kW2kuc2l6c2V0XTticmVha31pLm5vZGVUeXBlPT09MSYmIWYmJihpLnNpemNhY2hlPWMsaS5zaXpzZXQ9Zyk7aWYoaS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yil7aj1pO2JyZWFrfWk9aVthXX1kW2ddPWp9fX12YXIgYT0vKCg/OlwoKD86XChbXigpXStcKXxbXigpXSspK1wpfFxbKD86XFtbXlxbXF1dKlxdfFsnIl1bXiciXSpbJyJdfFteXFtcXSciXSspK1xdfFxcLnxbXiA+K34sKFxbXFxdKykrfFs+K35dKShccyosXHMqKT8oKD86LnxccnxcbikqKS9nLGQ9MCxlPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsZz0hMSxoPSEwLGk9L1xcL2csaj0vXFcvO1swLDBdLnNvcnQoZnVuY3Rpb24oKXtoPSExO3JldHVybiAwfSk7dmFyIGs9ZnVuY3Rpb24oYixkLGYsZyl7Zj1mfHxbXSxkPWR8fGM7dmFyIGg9ZDtpZihkLm5vZGVUeXBlIT09MSYmZC5ub2RlVHlwZSE9PTkpcmV0dXJuW107aWYoIWJ8fHR5cGVvZiBiIT0ic3RyaW5nIilyZXR1cm4gZjt2YXIgaSxqLG4sbyxxLHIscyx0LHU9ITAsdz1rLmlzWE1MKGQpLHg9W10seT1iO2Rve2EuZXhlYygiIiksaT1hLmV4ZWMoeSk7aWYoaSl7eT1pWzNdLHgucHVzaChpWzFdKTtpZihpWzJdKXtvPWlbM107YnJlYWt9fX13aGlsZShpKTtpZih4Lmxlbmd0aD4xJiZtLmV4ZWMoYikpaWYoeC5sZW5ndGg9PT0yJiZsLnJlbGF0aXZlW3hbMF1dKWo9dih4WzBdK3hbMV0sZCk7ZWxzZXtqPWwucmVsYXRpdmVbeFswXV0/W2RdOmsoeC5zaGlmdCgpLGQpO3doaWxlKHgubGVuZ3RoKWI9eC5zaGlmdCgpLGwucmVsYXRpdmVbYl0mJihiKz14LnNoaWZ0KCkpLGo9dihiLGopfWVsc2V7IWcmJngubGVuZ3RoPjEmJmQubm9kZVR5cGU9PT05JiYhdyYmbC5tYXRjaC5JRC50ZXN0KHhbMF0pJiYhbC5tYXRjaC5JRC50ZXN0KHhbeC5sZW5ndGgtMV0pJiYocT1rLmZpbmQoeC5zaGlmdCgpLGQsdyksZD1xLmV4cHI/ay5maWx0ZXIocS5leHByLHEuc2V0KVswXTpxLnNldFswXSk7aWYoZCl7cT1nP3tleHByOngucG9wKCksc2V0OnAoZyl9OmsuZmluZCh4LnBvcCgpLHgubGVuZ3RoPT09MSYmKHhbMF09PT0ifiJ8fHhbMF09PT0iKyIpJiZkLnBhcmVudE5vZGU/ZC5wYXJlbnROb2RlOmQsdyksaj1xLmV4cHI/ay5maWx0ZXIocS5leHByLHEuc2V0KTpxLnNldCx4Lmxlbmd0aD4wP249cChqKTp1PSExO3doaWxlKHgubGVuZ3RoKXI9eC5wb3AoKSxzPXIsbC5yZWxhdGl2ZVtyXT9zPXgucG9wKCk6cj0iIixzPT1udWxsJiYocz1kKSxsLnJlbGF0aXZlW3JdKG4scyx3KX1lbHNlIG49eD1bXX1ufHwobj1qKSxufHxrLmVycm9yKHJ8fGIpO2lmKGUuY2FsbChuKT09PSJbb2JqZWN0IEFycmF5XSIpaWYoIXUpZi5wdXNoLmFwcGx5KGYsbik7ZWxzZSBpZihkJiZkLm5vZGVUeXBlPT09MSlmb3IodD0wO25bdF0hPW51bGw7dCsrKW5bdF0mJihuW3RdPT09ITB8fG5bdF0ubm9kZVR5cGU9PT0xJiZrLmNvbnRhaW5zKGQsblt0XSkpJiZmLnB1c2goalt0XSk7ZWxzZSBmb3IodD0wO25bdF0hPW51bGw7dCsrKW5bdF0mJm5bdF0ubm9kZVR5cGU9PT0xJiZmLnB1c2goalt0XSk7ZWxzZSBwKG4sZik7byYmKGsobyxoLGYsZyksay51bmlxdWVTb3J0KGYpKTtyZXR1cm4gZn07ay51bmlxdWVTb3J0PWZ1bmN0aW9uKGEpe2lmKHIpe2c9aCxhLnNvcnQocik7aWYoZylmb3IodmFyIGI9MTtiPGEubGVuZ3RoO2IrKylhW2JdPT09YVtiLTFdJiZhLnNwbGljZShiLS0sMSl9cmV0dXJuIGF9LGsubWF0Y2hlcz1mdW5jdGlvbihhLGIpe3JldHVybiBrKGEsbnVsbCxudWxsLGIpfSxrLm1hdGNoZXNTZWxlY3Rvcj1mdW5jdGlvbihhLGIpe3JldHVybiBrKGIsbnVsbCxudWxsLFthXSkubGVuZ3RoPjB9LGsuZmluZD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ7aWYoIWEpcmV0dXJuW107Zm9yKHZhciBlPTAsZj1sLm9yZGVyLmxlbmd0aDtlPGY7ZSsrKXt2YXIgZyxoPWwub3JkZXJbZV07aWYoZz1sLmxlZnRNYXRjaFtoXS5leGVjKGEpKXt2YXIgaj1nWzFdO2cuc3BsaWNlKDEsMSk7aWYoai5zdWJzdHIoai5sZW5ndGgtMSkhPT0iXFwiKXtnWzFdPShnWzFdfHwiIikucmVwbGFjZShpLCIiKSxkPWwuZmluZFtoXShnLGIsYyk7aWYoZCE9bnVsbCl7YT1hLnJlcGxhY2UobC5tYXRjaFtoXSwiIik7YnJlYWt9fX19ZHx8KGQ9dHlwZW9mIGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiP2IuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTpbXSk7cmV0dXJue3NldDpkLGV4cHI6YX19LGsuZmlsdGVyPWZ1bmN0aW9uKGEsYyxkLGUpe3ZhciBmLGcsaD1hLGk9W10saj1jLG09YyYmY1swXSYmay5pc1hNTChjWzBdKTt3aGlsZShhJiZjLmxlbmd0aCl7Zm9yKHZhciBuIGluIGwuZmlsdGVyKWlmKChmPWwubGVmdE1hdGNoW25dLmV4ZWMoYSkpIT1udWxsJiZmWzJdKXt2YXIgbyxwLHE9bC5maWx0ZXJbbl0scj1mWzFdO2c9ITEsZi5zcGxpY2UoMSwxKTtpZihyLnN1YnN0cihyLmxlbmd0aC0xKT09PSJcXCIpY29udGludWU7aj09PWkmJihpPVtdKTtpZihsLnByZUZpbHRlcltuXSl7Zj1sLnByZUZpbHRlcltuXShmLGosZCxpLGUsbSk7aWYoIWYpZz1vPSEwO2Vsc2UgaWYoZj09PSEwKWNvbnRpbnVlfWlmKGYpZm9yKHZhciBzPTA7KHA9altzXSkhPW51bGw7cysrKWlmKHApe289cShwLGYscyxqKTt2YXIgdD1lXiEhbztkJiZvIT1udWxsP3Q/Zz0hMDpqW3NdPSExOnQmJihpLnB1c2gocCksZz0hMCl9aWYobyE9PWIpe2R8fChqPWkpLGE9YS5yZXBsYWNlKGwubWF0Y2hbbl0sIiIpO2lmKCFnKXJldHVybltdO2JyZWFrfX1pZihhPT09aClpZihnPT1udWxsKWsuZXJyb3IoYSk7ZWxzZSBicmVhaztoPWF9cmV0dXJuIGp9LGsuZXJyb3I9ZnVuY3Rpb24oYSl7dGhyb3ciU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIithfTt2YXIgbD1rLnNlbGVjdG9ycz17b3JkZXI6WyJJRCIsIk5BTUUiLCJUQUciXSxtYXRjaDp7SUQ6LyMoKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykvLENMQVNTOi9cLigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKS8sTkFNRTovXFtuYW1lPVsnIl0qKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspWyciXSpcXS8sQVRUUjovXFtccyooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKylccyooPzooXFM/PSlccyooPzooWyciXSkoLio/KVwzfCgjPyg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSopfCl8KVxzKlxdLyxUQUc6L14oKD86W1x3XHUwMGMwLVx1RkZGRlwqXC1dfFxcLikrKS8sQ0hJTEQ6Lzoob25seXxudGh8bGFzdHxmaXJzdCktY2hpbGQoPzpcKFxzKihldmVufG9kZHwoPzpbK1wtXT9cZCt8KD86WytcLV0/XGQqKT9uXHMqKD86WytcLV1ccypcZCspPykpXHMqXCkpPy8sUE9TOi86KG50aHxlcXxndHxsdHxmaXJzdHxsYXN0fGV2ZW58b2RkKSg/OlwoKFxkKilcKSk/KD89W15cLV18JCkvLFBTRVVETzovOigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKSg/OlwoKFsnIl0/KSgoPzpcKFteXCldK1wpfFteXChcKV0qKSspXDJcKSk/L30sbGVmdE1hdGNoOnt9LGF0dHJNYXA6eyJjbGFzcyI6ImNsYXNzTmFtZSIsImZvciI6Imh0bWxGb3IifSxhdHRySGFuZGxlOntocmVmOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSx0eXBlOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgidHlwZSIpfX0scmVsYXRpdmU6eyIrIjpmdW5jdGlvbihhLGIpe3ZhciBjPXR5cGVvZiBiPT0ic3RyaW5nIixkPWMmJiFqLnRlc3QoYiksZT1jJiYhZDtkJiYoYj1iLnRvTG93ZXJDYXNlKCkpO2Zvcih2YXIgZj0wLGc9YS5sZW5ndGgsaDtmPGc7ZisrKWlmKGg9YVtmXSl7d2hpbGUoKGg9aC5wcmV2aW91c1NpYmxpbmcpJiZoLm5vZGVUeXBlIT09MSk7YVtmXT1lfHxoJiZoLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iP2h8fCExOmg9PT1ifWUmJmsuZmlsdGVyKGIsYSwhMCl9LCI+IjpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9dHlwZW9mIGI9PSJzdHJpbmciLGU9MCxmPWEubGVuZ3RoO2lmKGQmJiFqLnRlc3QoYikpe2I9Yi50b0xvd2VyQ2FzZSgpO2Zvcig7ZTxmO2UrKyl7Yz1hW2VdO2lmKGMpe3ZhciBnPWMucGFyZW50Tm9kZTthW2VdPWcubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWI/ZzohMX19fWVsc2V7Zm9yKDtlPGY7ZSsrKWM9YVtlXSxjJiYoYVtlXT1kP2MucGFyZW50Tm9kZTpjLnBhcmVudE5vZGU9PT1iKTtkJiZrLmZpbHRlcihiLGEsITApfX0sIiI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBlLGY9ZCsrLGc9dTt0eXBlb2YgYj09InN0cmluZyImJiFqLnRlc3QoYikmJihiPWIudG9Mb3dlckNhc2UoKSxlPWIsZz10KSxnKCJwYXJlbnROb2RlIixiLGYsYSxlLGMpfSwifiI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBlLGY9ZCsrLGc9dTt0eXBlb2YgYj09InN0cmluZyImJiFqLnRlc3QoYikmJihiPWIudG9Mb3dlckNhc2UoKSxlPWIsZz10KSxnKCJwcmV2aW91c1NpYmxpbmciLGIsZixhLGUsYyl9fSxmaW5kOntJRDpmdW5jdGlvbihhLGIsYyl7aWYodHlwZW9mIGIuZ2V0RWxlbWVudEJ5SWQhPSJ1bmRlZmluZWQiJiYhYyl7dmFyIGQ9Yi5nZXRFbGVtZW50QnlJZChhWzFdKTtyZXR1cm4gZCYmZC5wYXJlbnROb2RlP1tkXTpbXX19LE5BTUU6ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYi5nZXRFbGVtZW50c0J5TmFtZSE9InVuZGVmaW5lZCIpe3ZhciBjPVtdLGQ9Yi5nZXRFbGVtZW50c0J5TmFtZShhWzFdKTtmb3IodmFyIGU9MCxmPWQubGVuZ3RoO2U8ZjtlKyspZFtlXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKT09PWFbMV0mJmMucHVzaChkW2VdKTtyZXR1cm4gYy5sZW5ndGg9PT0wP251bGw6Y319LFRBRzpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRzQnlUYWdOYW1lIT0idW5kZWZpbmVkIilyZXR1cm4gYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhWzFdKX19LHByZUZpbHRlcjp7Q0xBU1M6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2E9IiAiK2FbMV0ucmVwbGFjZShpLCIiKSsiICI7aWYoZilyZXR1cm4gYTtmb3IodmFyIGc9MCxoOyhoPWJbZ10pIT1udWxsO2crKyloJiYoZV4oaC5jbGFzc05hbWUmJigiICIraC5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKC9bXHRcblxyXS9nLCIgIikuaW5kZXhPZihhKT49MCk/Y3x8ZC5wdXNoKGgpOmMmJihiW2ddPSExKSk7cmV0dXJuITF9LElEOmZ1bmN0aW9uKGEpe3JldHVybiBhWzFdLnJlcGxhY2UoaSwiIil9LFRBRzpmdW5jdGlvbihhLGIpe3JldHVybiBhWzFdLnJlcGxhY2UoaSwiIikudG9Mb3dlckNhc2UoKX0sQ0hJTEQ6ZnVuY3Rpb24oYSl7aWYoYVsxXT09PSJudGgiKXthWzJdfHxrLmVycm9yKGFbMF0pLGFbMl09YVsyXS5yZXBsYWNlKC9eXCt8XHMqL2csIiIpO3ZhciBiPS8oLT8pKFxkKikoPzpuKFsrXC1dP1xkKikpPy8uZXhlYyhhWzJdPT09ImV2ZW4iJiYiMm4ifHxhWzJdPT09Im9kZCImJiIybisxInx8IS9cRC8udGVzdChhWzJdKSYmIjBuKyIrYVsyXXx8YVsyXSk7YVsyXT1iWzFdKyhiWzJdfHwxKS0wLGFbM109YlszXS0wfWVsc2UgYVsyXSYmay5lcnJvcihhWzBdKTthWzBdPWQrKztyZXR1cm4gYX0sQVRUUjpmdW5jdGlvbihhLGIsYyxkLGUsZil7dmFyIGc9YVsxXT1hWzFdLnJlcGxhY2UoaSwiIik7IWYmJmwuYXR0ck1hcFtnXSYmKGFbMV09bC5hdHRyTWFwW2ddKSxhWzRdPShhWzRdfHxhWzVdfHwiIikucmVwbGFjZShpLCIiKSxhWzJdPT09In49IiYmKGFbNF09IiAiK2FbNF0rIiAiKTtyZXR1cm4gYX0sUFNFVURPOmZ1bmN0aW9uKGIsYyxkLGUsZil7aWYoYlsxXT09PSJub3QiKWlmKChhLmV4ZWMoYlszXSl8fCIiKS5sZW5ndGg+MXx8L15cdy8udGVzdChiWzNdKSliWzNdPWsoYlszXSxudWxsLG51bGwsYyk7ZWxzZXt2YXIgZz1rLmZpbHRlcihiWzNdLGMsZCwhMF5mKTtkfHxlLnB1c2guYXBwbHkoZSxnKTtyZXR1cm4hMX1lbHNlIGlmKGwubWF0Y2guUE9TLnRlc3QoYlswXSl8fGwubWF0Y2guQ0hJTEQudGVzdChiWzBdKSlyZXR1cm4hMDtyZXR1cm4gYn0sUE9TOmZ1bmN0aW9uKGEpe2EudW5zaGlmdCghMCk7cmV0dXJuIGF9fSxmaWx0ZXJzOntlbmFibGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc2FibGVkPT09ITEmJmEudHlwZSE9PSJoaWRkZW4ifSxkaXNhYmxlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXNhYmxlZD09PSEwfSxjaGVja2VkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmNoZWNrZWQ9PT0hMH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oYSl7YS5wYXJlbnROb2RlJiZhLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDtyZXR1cm4gYS5zZWxlY3RlZD09PSEwfSxwYXJlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuISFhLmZpcnN0Q2hpbGR9LGVtcHR5OmZ1bmN0aW9uKGEpe3JldHVybiFhLmZpcnN0Q2hpbGR9LGhhczpmdW5jdGlvbihhLGIsYyl7cmV0dXJuISFrKGNbM10sYSkubGVuZ3RofSxoZWFkZXI6ZnVuY3Rpb24oYSl7cmV0dXJuL2hcZC9pLnRlc3QoYS5ub2RlTmFtZSl9LHRleHQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxjPWEudHlwZTtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmInRleHQiPT09YyYmKGI9PT1jfHxiPT09bnVsbCl9LHJhZGlvOmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYicmFkaW8iPT09YS50eXBlfSxjaGVja2JveDpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmImNoZWNrYm94Ij09PWEudHlwZX0sZmlsZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmImZpbGUiPT09YS50eXBlfSxwYXNzd29yZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmInBhc3N3b3JkIj09PWEudHlwZX0sc3VibWl0OmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oYj09PSJpbnB1dCJ8fGI9PT0iYnV0dG9uIikmJiJzdWJtaXQiPT09YS50eXBlfSxpbWFnZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmImltYWdlIj09PWEudHlwZX0scmVzZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybihiPT09ImlucHV0Inx8Yj09PSJidXR0b24iKSYmInJlc2V0Ij09PWEudHlwZX0sYnV0dG9uOmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gYj09PSJpbnB1dCImJiJidXR0b24iPT09YS50eXBlfHxiPT09ImJ1dHRvbiJ9LGlucHV0OmZ1bmN0aW9uKGEpe3JldHVybi9pbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uL2kudGVzdChhLm5vZGVOYW1lKX0sZm9jdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1hLm93bmVyRG9jdW1lbnQuYWN0aXZlRWxlbWVudH19LHNldEZpbHRlcnM6e2ZpcnN0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGI9PT0wfSxsYXN0OmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBiPT09ZC5sZW5ndGgtMX0sZXZlbjpmdW5jdGlvbihhLGIpe3JldHVybiBiJTI9PT0wfSxvZGQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYiUyPT09MX0sbHQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBiPGNbM10tMH0sZ3Q6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBiPmNbM10tMH0sbnRoOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gY1szXS0wPT09Yn0sZXE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjWzNdLTA9PT1ifX0sZmlsdGVyOntQU0VVRE86ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9YlsxXSxmPWwuZmlsdGVyc1tlXTtpZihmKXJldHVybiBmKGEsYyxiLGQpO2lmKGU9PT0iY29udGFpbnMiKXJldHVybihhLnRleHRDb250ZW50fHxhLmlubmVyVGV4dHx8ay5nZXRUZXh0KFthXSl8fCIiKS5pbmRleE9mKGJbM10pPj0wO2lmKGU9PT0ibm90Iil7dmFyIGc9YlszXTtmb3IodmFyIGg9MCxpPWcubGVuZ3RoO2g8aTtoKyspaWYoZ1toXT09PWEpcmV0dXJuITE7cmV0dXJuITB9ay5lcnJvcihlKX0sQ0hJTEQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz1iWzFdLGQ9YTtzd2l0Y2goYyl7Y2FzZSJvbmx5IjpjYXNlImZpcnN0Ijp3aGlsZShkPWQucHJldmlvdXNTaWJsaW5nKWlmKGQubm9kZVR5cGU9PT0xKXJldHVybiExO2lmKGM9PT0iZmlyc3QiKXJldHVybiEwO2Q9YTtjYXNlImxhc3QiOndoaWxlKGQ9ZC5uZXh0U2libGluZylpZihkLm5vZGVUeXBlPT09MSlyZXR1cm4hMTtyZXR1cm4hMDtjYXNlIm50aCI6dmFyIGU9YlsyXSxmPWJbM107aWYoZT09PTEmJmY9PT0wKXJldHVybiEwO3ZhciBnPWJbMF0saD1hLnBhcmVudE5vZGU7aWYoaCYmKGguc2l6Y2FjaGUhPT1nfHwhYS5ub2RlSW5kZXgpKXt2YXIgaT0wO2ZvcihkPWguZmlyc3RDaGlsZDtkO2Q9ZC5uZXh0U2libGluZylkLm5vZGVUeXBlPT09MSYmKGQubm9kZUluZGV4PSsraSk7aC5zaXpjYWNoZT1nfXZhciBqPWEubm9kZUluZGV4LWY7cmV0dXJuIGU9PT0wP2o9PT0wOmolZT09PTAmJmovZT49MH19LElEOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEubm9kZVR5cGU9PT0xJiZhLmdldEF0dHJpYnV0ZSgiaWQiKT09PWJ9LFRBRzpmdW5jdGlvbihhLGIpe3JldHVybiBiPT09IioiJiZhLm5vZGVUeXBlPT09MXx8YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yn0sQ0xBU1M6ZnVuY3Rpb24oYSxiKXtyZXR1cm4oIiAiKyhhLmNsYXNzTmFtZXx8YS5nZXRBdHRyaWJ1dGUoImNsYXNzIikpKyIgIikuaW5kZXhPZihiKT4tMX0sQVRUUjpmdW5jdGlvbihhLGIpe3ZhciBjPWJbMV0sZD1sLmF0dHJIYW5kbGVbY10/bC5hdHRySGFuZGxlW2NdKGEpOmFbY10hPW51bGw/YVtjXTphLmdldEF0dHJpYnV0ZShjKSxlPWQrIiIsZj1iWzJdLGc9Yls0XTtyZXR1cm4gZD09bnVsbD9mPT09IiE9IjpmPT09Ij0iP2U9PT1nOmY9PT0iKj0iP2UuaW5kZXhPZihnKT49MDpmPT09In49Ij8oIiAiK2UrIiAiKS5pbmRleE9mKGcpPj0wOmc/Zj09PSIhPSI/ZSE9PWc6Zj09PSJePSI/ZS5pbmRleE9mKGcpPT09MDpmPT09IiQ9Ij9lLnN1YnN0cihlLmxlbmd0aC1nLmxlbmd0aCk9PT1nOmY9PT0ifD0iP2U9PT1nfHxlLnN1YnN0cigwLGcubGVuZ3RoKzEpPT09ZysiLSI6ITE6ZSYmZCE9PSExfSxQT1M6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9YlsyXSxmPWwuc2V0RmlsdGVyc1tlXTtpZihmKXJldHVybiBmKGEsYyxiLGQpfX19LG09bC5tYXRjaC5QT1Msbj1mdW5jdGlvbihhLGIpe3JldHVybiJcXCIrKGItMCsxKX07Zm9yKHZhciBvIGluIGwubWF0Y2gpbC5tYXRjaFtvXT1uZXcgUmVnRXhwKGwubWF0Y2hbb10uc291cmNlKy8oPyFbXlxbXSpcXSkoPyFbXlwoXSpcKSkvLnNvdXJjZSksbC5sZWZ0TWF0Y2hbb109bmV3IFJlZ0V4cCgvKF4oPzoufFxyfFxuKSo/KS8uc291cmNlK2wubWF0Y2hbb10uc291cmNlLnJlcGxhY2UoL1xcKFxkKykvZyxuKSk7dmFyIHA9ZnVuY3Rpb24oYSxiKXthPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsMCk7aWYoYil7Yi5wdXNoLmFwcGx5KGIsYSk7cmV0dXJuIGJ9cmV0dXJuIGF9O3RyeXtBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChjLmRvY3VtZW50RWxlbWVudC5jaGlsZE5vZGVzLDApWzBdLm5vZGVUeXBlfWNhdGNoKHEpe3A9ZnVuY3Rpb24oYSxiKXt2YXIgYz0wLGQ9Ynx8W107aWYoZS5jYWxsKGEpPT09IltvYmplY3QgQXJyYXldIilBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShkLGEpO2Vsc2UgaWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilmb3IodmFyIGY9YS5sZW5ndGg7YzxmO2MrKylkLnB1c2goYVtjXSk7ZWxzZSBmb3IoO2FbY107YysrKWQucHVzaChhW2NdKTtyZXR1cm4gZH19dmFyIHIscztjLmRvY3VtZW50RWxlbWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj9yPWZ1bmN0aW9uKGEsYil7aWYoYT09PWIpe2c9ITA7cmV0dXJuIDB9aWYoIWEuY29tcGFyZURvY3VtZW50UG9zaXRpb258fCFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKXJldHVybiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uPy0xOjE7cmV0dXJuIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmND8tMToxfToocj1mdW5jdGlvbihhLGIpe2lmKGE9PT1iKXtnPSEwO3JldHVybiAwfWlmKGEuc291cmNlSW5kZXgmJmIuc291cmNlSW5kZXgpcmV0dXJuIGEuc291cmNlSW5kZXgtYi5zb3VyY2VJbmRleDt2YXIgYyxkLGU9W10sZj1bXSxoPWEucGFyZW50Tm9kZSxpPWIucGFyZW50Tm9kZSxqPWg7aWYoaD09PWkpcmV0dXJuIHMoYSxiKTtpZighaClyZXR1cm4tMTtpZighaSlyZXR1cm4gMTt3aGlsZShqKWUudW5zaGlmdChqKSxqPWoucGFyZW50Tm9kZTtqPWk7d2hpbGUoailmLnVuc2hpZnQoaiksaj1qLnBhcmVudE5vZGU7Yz1lLmxlbmd0aCxkPWYubGVuZ3RoO2Zvcih2YXIgaz0wO2s8YyYmazxkO2srKylpZihlW2tdIT09ZltrXSlyZXR1cm4gcyhlW2tdLGZba10pO3JldHVybiBrPT09Yz9zKGEsZltrXSwtMSk6cyhlW2tdLGIsMSl9LHM9ZnVuY3Rpb24oYSxiLGMpe2lmKGE9PT1iKXJldHVybiBjO3ZhciBkPWEubmV4dFNpYmxpbmc7d2hpbGUoZCl7aWYoZD09PWIpcmV0dXJuLTE7ZD1kLm5leHRTaWJsaW5nfXJldHVybiAxfSksay5nZXRUZXh0PWZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM7Zm9yKHZhciBkPTA7YVtkXTtkKyspYz1hW2RdLGMubm9kZVR5cGU9PT0zfHxjLm5vZGVUeXBlPT09ND9iKz1jLm5vZGVWYWx1ZTpjLm5vZGVUeXBlIT09OCYmKGIrPWsuZ2V0VGV4dChjLmNoaWxkTm9kZXMpKTtyZXR1cm4gYn0sZnVuY3Rpb24oKXt2YXIgYT1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQ9InNjcmlwdCIrKG5ldyBEYXRlKS5nZXRUaW1lKCksZT1jLmRvY3VtZW50RWxlbWVudDthLmlubmVySFRNTD0iPGEgbmFtZT0nIitkKyInLz4iLGUuaW5zZXJ0QmVmb3JlKGEsZS5maXJzdENoaWxkKSxjLmdldEVsZW1lbnRCeUlkKGQpJiYobC5maW5kLklEPWZ1bmN0aW9uKGEsYyxkKXtpZih0eXBlb2YgYy5nZXRFbGVtZW50QnlJZCE9InVuZGVmaW5lZCImJiFkKXt2YXIgZT1jLmdldEVsZW1lbnRCeUlkKGFbMV0pO3JldHVybiBlP2UuaWQ9PT1hWzFdfHx0eXBlb2YgZS5nZXRBdHRyaWJ1dGVOb2RlIT0idW5kZWZpbmVkIiYmZS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpLm5vZGVWYWx1ZT09PWFbMV0/W2VdOmI6W119fSxsLmZpbHRlci5JRD1mdW5jdGlvbihhLGIpe3ZhciBjPXR5cGVvZiBhLmdldEF0dHJpYnV0ZU5vZGUhPSJ1bmRlZmluZWQiJiZhLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7cmV0dXJuIGEubm9kZVR5cGU9PT0xJiZjJiZjLm5vZGVWYWx1ZT09PWJ9KSxlLnJlbW92ZUNoaWxkKGEpLGU9YT1udWxsfSgpLGZ1bmN0aW9uKCl7dmFyIGE9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKTthLmFwcGVuZENoaWxkKGMuY3JlYXRlQ29tbWVudCgiIikpLGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGg+MCYmKGwuZmluZC5UQUc9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGFbMV0pO2lmKGFbMV09PT0iKiIpe3ZhciBkPVtdO2Zvcih2YXIgZT0wO2NbZV07ZSsrKWNbZV0ubm9kZVR5cGU9PT0xJiZkLnB1c2goY1tlXSk7Yz1kfXJldHVybiBjfSksYS5pbm5lckhUTUw9IjxhIGhyZWY9JyMnPjwvYT4iLGEuZmlyc3RDaGlsZCYmdHlwZW9mIGEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUhPSJ1bmRlZmluZWQiJiZhLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIikhPT0iIyImJihsLmF0dHJIYW5kbGUuaHJlZj1mdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoImhyZWYiLDIpfSksYT1udWxsfSgpLGMucXVlcnlTZWxlY3RvckFsbCYmZnVuY3Rpb24oKXt2YXIgYT1rLGI9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPSJfX3NpenpsZV9fIjtiLmlubmVySFRNTD0iPHAgY2xhc3M9J1RFU1QnPjwvcD4iO2lmKCFiLnF1ZXJ5U2VsZWN0b3JBbGx8fGIucXVlcnlTZWxlY3RvckFsbCgiLlRFU1QiKS5sZW5ndGghPT0wKXtrPWZ1bmN0aW9uKGIsZSxmLGcpe2U9ZXx8YztpZighZyYmIWsuaXNYTUwoZSkpe3ZhciBoPS9eKFx3KyQpfF5cLihbXHdcLV0rJCl8XiMoW1x3XC1dKyQpLy5leGVjKGIpO2lmKGgmJihlLm5vZGVUeXBlPT09MXx8ZS5ub2RlVHlwZT09PTkpKXtpZihoWzFdKXJldHVybiBwKGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYiksZik7aWYoaFsyXSYmbC5maW5kLkNMQVNTJiZlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIHAoZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGhbMl0pLGYpfWlmKGUubm9kZVR5cGU9PT05KXtpZihiPT09ImJvZHkiJiZlLmJvZHkpcmV0dXJuIHAoW2UuYm9keV0sZik7aWYoaCYmaFszXSl7dmFyIGk9ZS5nZXRFbGVtZW50QnlJZChoWzNdKTtpZighaXx8IWkucGFyZW50Tm9kZSlyZXR1cm4gcChbXSxmKTtpZihpLmlkPT09aFszXSlyZXR1cm4gcChbaV0sZil9dHJ5e3JldHVybiBwKGUucXVlcnlTZWxlY3RvckFsbChiKSxmKX1jYXRjaChqKXt9fWVsc2UgaWYoZS5ub2RlVHlwZT09PTEmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSE9PSJvYmplY3QiKXt2YXIgbT1lLG49ZS5nZXRBdHRyaWJ1dGUoImlkIiksbz1ufHxkLHE9ZS5wYXJlbnROb2RlLHI9L15ccypbK35dLy50ZXN0KGIpO24/bz1vLnJlcGxhY2UoLycvZywiXFwkJiIpOmUuc2V0QXR0cmlidXRlKCJpZCIsbyksciYmcSYmKGU9ZS5wYXJlbnROb2RlKTt0cnl7aWYoIXJ8fHEpcmV0dXJuIHAoZS5xdWVyeVNlbGVjdG9yQWxsKCJbaWQ9JyIrbysiJ10gIitiKSxmKX1jYXRjaChzKXt9ZmluYWxseXtufHxtLnJlbW92ZUF0dHJpYnV0ZSgiaWQiKX19fXJldHVybiBhKGIsZSxmLGcpfTtmb3IodmFyIGUgaW4gYSlrW2VdPWFbZV07Yj1udWxsfX0oKSxmdW5jdGlvbigpe3ZhciBhPWMuZG9jdW1lbnRFbGVtZW50LGI9YS5tYXRjaGVzU2VsZWN0b3J8fGEubW96TWF0Y2hlc1NlbGVjdG9yfHxhLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8YS5tc01hdGNoZXNTZWxlY3RvcjtpZihiKXt2YXIgZD0hYi5jYWxsKGMuY3JlYXRlRWxlbWVudCgiZGl2IiksImRpdiIpLGU9ITE7dHJ5e2IuY2FsbChjLmRvY3VtZW50RWxlbWVudCwiW3Rlc3QhPScnXTpzaXp6bGUiKX1jYXRjaChmKXtlPSEwfWsubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGEsYyl7Yz1jLnJlcGxhY2UoL1w9XHMqKFteJyJcXV0qKVxzKlxdL2csIj0nJDEnXSIpO2lmKCFrLmlzWE1MKGEpKXRyeXtpZihlfHwhbC5tYXRjaC5QU0VVRE8udGVzdChjKSYmIS8hPS8udGVzdChjKSl7dmFyIGY9Yi5jYWxsKGEsYyk7aWYoZnx8IWR8fGEuZG9jdW1lbnQmJmEuZG9jdW1lbnQubm9kZVR5cGUhPT0xMSlyZXR1cm4gZn19Y2F0Y2goZyl7fXJldHVybiBrKGMsbnVsbCxudWxsLFthXSkubGVuZ3RoPjB9fX0oKSxmdW5jdGlvbigpe3ZhciBhPWMuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5pbm5lckhUTUw9IjxkaXYgY2xhc3M9J3Rlc3QgZSc+PC9kaXY+PGRpdiBjbGFzcz0ndGVzdCc+PC9kaXY+IjtpZighIWEuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmYS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoIT09MCl7YS5sYXN0Q2hpbGQuY2xhc3NOYW1lPSJlIjtpZihhLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGg9PT0xKXJldHVybjtsLm9yZGVyLnNwbGljZSgxLDAsIkNMQVNTIiksbC5maW5kLkNMQVNTPWZ1bmN0aW9uKGEsYixjKXtpZih0eXBlb2YgYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lIT0idW5kZWZpbmVkIiYmIWMpcmV0dXJuIGIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShhWzFdKX0sYT1udWxsfX0oKSxjLmRvY3VtZW50RWxlbWVudC5jb250YWlucz9rLmNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEhPT1iJiYoYS5jb250YWlucz9hLmNvbnRhaW5zKGIpOiEwKX06Yy5kb2N1bWVudEVsZW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24/ay5jb250YWlucz1mdW5jdGlvbihhLGIpe3JldHVybiEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpfTprLmNvbnRhaW5zPWZ1bmN0aW9uKCl7cmV0dXJuITF9LGsuaXNYTUw9ZnVuY3Rpb24oYSl7dmFyIGI9KGE/YS5vd25lckRvY3VtZW50fHxhOjApLmRvY3VtZW50RWxlbWVudDtyZXR1cm4gYj9iLm5vZGVOYW1lIT09IkhUTUwiOiExfTt2YXIgdj1mdW5jdGlvbihhLGIpe3ZhciBjLGQ9W10sZT0iIixmPWIubm9kZVR5cGU/W2JdOmI7d2hpbGUoYz1sLm1hdGNoLlBTRVVETy5leGVjKGEpKWUrPWNbMF0sYT1hLnJlcGxhY2UobC5tYXRjaC5QU0VVRE8sIiIpO2E9bC5yZWxhdGl2ZVthXT9hKyIqIjphO2Zvcih2YXIgZz0wLGg9Zi5sZW5ndGg7ZzxoO2crKylrKGEsZltnXSxkKTtyZXR1cm4gay5maWx0ZXIoZSxkKX07Zi5maW5kPWssZi5leHByPWsuc2VsZWN0b3JzLGYuZXhwclsiOiJdPWYuZXhwci5maWx0ZXJzLGYudW5pcXVlPWsudW5pcXVlU29ydCxmLnRleHQ9ay5nZXRUZXh0LGYuaXNYTUxEb2M9ay5pc1hNTCxmLmNvbnRhaW5zPWsuY29udGFpbnN9KCk7dmFyIE89L1VudGlsJC8sUD0vXig/OnBhcmVudHN8cHJldlVudGlsfHByZXZBbGwpLyxRPS8sLyxSPS9eLlteOiNcW1wuLF0qJC8sUz1BcnJheS5wcm90b3R5cGUuc2xpY2UsVD1mLmV4cHIubWF0Y2guUE9TLFU9e2NoaWxkcmVuOiEwLGNvbnRlbnRzOiEwLG5leHQ6ITAscHJldjohMH07Zi5mbi5leHRlbmQoe2ZpbmQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcyxjLGQ7aWYodHlwZW9mIGEhPSJzdHJpbmciKXJldHVybiBmKGEpLmZpbHRlcihmdW5jdGlvbigpe2ZvcihjPTAsZD1iLmxlbmd0aDtjPGQ7YysrKWlmKGYuY29udGFpbnMoYltjXSx0aGlzKSlyZXR1cm4hMH0pO3ZhciBlPXRoaXMucHVzaFN0YWNrKCIiLCJmaW5kIixhKSxnLGgsaTtmb3IoYz0wLGQ9dGhpcy5sZW5ndGg7YzxkO2MrKyl7Zz1lLmxlbmd0aCxmLmZpbmQoYSx0aGlzW2NdLGUpO2lmKGM+MClmb3IoaD1nO2g8ZS5sZW5ndGg7aCsrKWZvcihpPTA7aTxnO2krKylpZihlW2ldPT09ZVtoXSl7ZS5zcGxpY2UoaC0tLDEpO2JyZWFrfX1yZXR1cm4gZX0saGFzOmZ1bmN0aW9uKGEpe3ZhciBiPWYoYSk7cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKHZhciBhPTAsYz1iLmxlbmd0aDthPGM7YSsrKWlmKGYuY29udGFpbnModGhpcyxiW2FdKSlyZXR1cm4hMH0pfSxub3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFcodGhpcyxhLCExKSwibm90IixhKX0sZmlsdGVyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhXKHRoaXMsYSwhMCksImZpbHRlciIsYSl9LGlzOmZ1bmN0aW9uKGEpe3JldHVybiEhYSYmKHR5cGVvZiBhPT0ic3RyaW5nIj9mLmZpbHRlcihhLHRoaXMpLmxlbmd0aD4wOnRoaXMuZmlsdGVyKGEpLmxlbmd0aD4wKX0sY2xvc2VzdDpmdW5jdGlvbihhLGIpe3ZhciBjPVtdLGQsZSxnPXRoaXNbMF07aWYoZi5pc0FycmF5KGEpKXt2YXIgaCxpLGo9e30saz0xO2lmKGcmJmEubGVuZ3RoKXtmb3IoZD0wLGU9YS5sZW5ndGg7ZDxlO2QrKylpPWFbZF0saltpXXx8KGpbaV09VC50ZXN0KGkpP2YoaSxifHx0aGlzLmNvbnRleHQpOmkpO3doaWxlKGcmJmcub3duZXJEb2N1bWVudCYmZyE9PWIpe2ZvcihpIGluIGopaD1qW2ldLChoLmpxdWVyeT9oLmluZGV4KGcpPi0xOmYoZykuaXMoaCkpJiZjLnB1c2goe3NlbGVjdG9yOmksZWxlbTpnLGxldmVsOmt9KTtnPWcucGFyZW50Tm9kZSxrKyt9fXJldHVybiBjfXZhciBsPVQudGVzdChhKXx8dHlwZW9mIGEhPSJzdHJpbmciP2YoYSxifHx0aGlzLmNvbnRleHQpOjA7Zm9yKGQ9MCxlPXRoaXMubGVuZ3RoO2Q8ZTtkKyspe2c9dGhpc1tkXTt3aGlsZShnKXtpZihsP2wuaW5kZXgoZyk+LTE6Zi5maW5kLm1hdGNoZXNTZWxlY3RvcihnLGEpKXtjLnB1c2goZyk7YnJlYWt9Zz1nLnBhcmVudE5vZGU7aWYoIWd8fCFnLm93bmVyRG9jdW1lbnR8fGc9PT1ifHxnLm5vZGVUeXBlPT09MTEpYnJlYWt9fWM9Yy5sZW5ndGg+MT9mLnVuaXF1ZShjKTpjO3JldHVybiB0aGlzLnB1c2hTdGFjayhjLCJjbG9zZXN0IixhKX0saW5kZXg6ZnVuY3Rpb24oYSl7aWYoIWF8fHR5cGVvZiBhPT0ic3RyaW5nIilyZXR1cm4gZi5pbkFycmF5KHRoaXNbMF0sYT9mKGEpOnRoaXMucGFyZW50KCkuY2hpbGRyZW4oKSk7cmV0dXJuIGYuaW5BcnJheShhLmpxdWVyeT9hWzBdOmEsdGhpcyl9LGFkZDpmdW5jdGlvbihhLGIpe3ZhciBjPXR5cGVvZiBhPT0ic3RyaW5nIj9mKGEsYik6Zi5tYWtlQXJyYXkoYSYmYS5ub2RlVHlwZT9bYV06YSksZD1mLm1lcmdlKHRoaXMuZ2V0KCksYyk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFYoY1swXSl8fFYoZFswXSk/ZDpmLnVuaXF1ZShkKSl9LGFuZFNlbGY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hZGQodGhpcy5wcmV2T2JqZWN0KX19KSxmLmVhY2goe3BhcmVudDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7cmV0dXJuIGImJmIubm9kZVR5cGUhPT0xMT9iOm51bGx9LHBhcmVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGYuZGlyKGEsInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZi5kaXIoYSwicGFyZW50Tm9kZSIsYyl9LG5leHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGYubnRoKGEsMiwibmV4dFNpYmxpbmciKX0scHJldjpmdW5jdGlvbihhKXtyZXR1cm4gZi5udGgoYSwyLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbihhKXtyZXR1cm4gZi5kaXIoYSwibmV4dFNpYmxpbmciKX0scHJldkFsbDpmdW5jdGlvbihhKXtyZXR1cm4gZi5kaXIoYSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuZGlyKGEsIm5leHRTaWJsaW5nIixjKX0scHJldlVudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZi5kaXIoYSwicHJldmlvdXNTaWJsaW5nIixjKX0sc2libGluZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIGYuc2libGluZyhhLnBhcmVudE5vZGUuZmlyc3RDaGlsZCxhKX0sY2hpbGRyZW46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuc2libGluZyhhLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihhKXtyZXR1cm4gZi5ub2RlTmFtZShhLCJpZnJhbWUiKT9hLmNvbnRlbnREb2N1bWVudHx8YS5jb250ZW50V2luZG93LmRvY3VtZW50OmYubWFrZUFycmF5KGEuY2hpbGROb2Rlcyl9fSxmdW5jdGlvbihhLGIpe2YuZm5bYV09ZnVuY3Rpb24oYyxkKXt2YXIgZT1mLm1hcCh0aGlzLGIsYyksZz1TLmNhbGwoYXJndW1lbnRzKTtPLnRlc3QoYSl8fChkPWMpLGQmJnR5cGVvZiBkPT0ic3RyaW5nIiYmKGU9Zi5maWx0ZXIoZCxlKSksZT10aGlzLmxlbmd0aD4xJiYhVVthXT9mLnVuaXF1ZShlKTplLCh0aGlzLmxlbmd0aD4xfHxRLnRlc3QoZCkpJiZQLnRlc3QoYSkmJihlPWUucmV2ZXJzZSgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZSxhLGcuam9pbigiLCIpKX19KSxmLmV4dGVuZCh7ZmlsdGVyOmZ1bmN0aW9uKGEsYixjKXtjJiYoYT0iOm5vdCgiK2ErIikiKTtyZXR1cm4gYi5sZW5ndGg9PT0xP2YuZmluZC5tYXRjaGVzU2VsZWN0b3IoYlswXSxhKT9bYlswXV06W106Zi5maW5kLm1hdGNoZXMoYSxiKX0sZGlyOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZT1bXSxnPWFbY107d2hpbGUoZyYmZy5ub2RlVHlwZSE9PTkmJihkPT09Ynx8Zy5ub2RlVHlwZSE9PTF8fCFmKGcpLmlzKGQpKSlnLm5vZGVUeXBlPT09MSYmZS5wdXNoKGcpLGc9Z1tjXTtyZXR1cm4gZX0sbnRoOmZ1bmN0aW9uKGEsYixjLGQpe2I9Ynx8MTt2YXIgZT0wO2Zvcig7YTthPWFbY10paWYoYS5ub2RlVHlwZT09PTEmJisrZT09PWIpYnJlYWs7cmV0dXJuIGF9LHNpYmxpbmc6ZnVuY3Rpb24oYSxiKXt2YXIgYz1bXTtmb3IoO2E7YT1hLm5leHRTaWJsaW5nKWEubm9kZVR5cGU9PT0xJiZhIT09YiYmYy5wdXNoKGEpO3JldHVybiBjfX0pO3ZhciBYPS8galF1ZXJ5XGQrPSIoPzpcZCt8bnVsbCkiL2csWT0vXlxzKy8sWj0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXHc6XSspW14+XSopXC8+L2lnLCQ9LzwoW1x3Ol0rKS8sXz0vPHRib2R5L2ksYmE9Lzx8JiM/XHcrOy8sYmI9LzwoPzpzY3JpcHR8b2JqZWN0fGVtYmVkfG9wdGlvbnxzdHlsZSkvaSxiYz0vY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSxiZD0vXC8oamF2YXxlY21hKXNjcmlwdC9pLGJlPS9eXHMqPCEoPzpcW0NEQVRBXFt8XC1cLSkvLGJmPXtvcHRpb246WzEsIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSxsZWdlbmQ6WzEsIjxmaWVsZHNldD4iLCI8L2ZpZWxkc2V0PiJdLHRoZWFkOlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sdGQ6WzMsIjx0YWJsZT48dGJvZHk+PHRyPiIsIjwvdHI+PC90Ym9keT48L3RhYmxlPiJdLGNvbDpbMiwiPHRhYmxlPjx0Ym9keT48L3Rib2R5Pjxjb2xncm91cD4iLCI8L2NvbGdyb3VwPjwvdGFibGU+Il0sYXJlYTpbMSwiPG1hcD4iLCI8L21hcD4iXSxfZGVmYXVsdDpbMCwiIiwiIl19O2JmLm9wdGdyb3VwPWJmLm9wdGlvbixiZi50Ym9keT1iZi50Zm9vdD1iZi5jb2xncm91cD1iZi5jYXB0aW9uPWJmLnRoZWFkLGJmLnRoPWJmLnRkLGYuc3VwcG9ydC5odG1sU2VyaWFsaXplfHwoYmYuX2RlZmF1bHQ9WzEsImRpdjxkaXY+IiwiPC9kaXY+Il0pLGYuZm4uZXh0ZW5kKHt0ZXh0OmZ1bmN0aW9uKGEpe2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPWYodGhpcyk7Yy50ZXh0KGEuY2FsbCh0aGlzLGIsYy50ZXh0KCkpKX0pO2lmKHR5cGVvZiBhIT0ib2JqZWN0IiYmYSE9PWIpcmV0dXJuIHRoaXMuZW1wdHkoKS5hcHBlbmQoKHRoaXNbMF0mJnRoaXNbMF0ub3duZXJEb2N1bWVudHx8YykuY3JlYXRlVGV4dE5vZGUoYSkpO3JldHVybiBmLnRleHQodGhpcyl9LHdyYXBBbGw6ZnVuY3Rpb24oYSl7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Zih0aGlzKS53cmFwQWxsKGEuY2FsbCh0aGlzLGIpKX0pO2lmKHRoaXNbMF0pe3ZhciBiPWYoYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKTt0aGlzWzBdLnBhcmVudE5vZGUmJmIuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLGIubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpczt3aGlsZShhLmZpcnN0Q2hpbGQmJmEuZmlyc3RDaGlsZC5ub2RlVHlwZT09PTEpYT1hLmZpcnN0Q2hpbGQ7cmV0dXJuIGF9KS5hcHBlbmQodGhpcyl9cmV0dXJuIHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihhKXtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtmKHRoaXMpLndyYXBJbm5lcihhLmNhbGwodGhpcyxiKSl9KTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9Zih0aGlzKSxjPWIuY29udGVudHMoKTtjLmxlbmd0aD9jLndyYXBBbGwoYSk6Yi5hcHBlbmQoYSl9KX0sd3JhcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zih0aGlzKS53cmFwQWxsKGEpfSl9LHVud3JhcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhcmVudCgpLmVhY2goZnVuY3Rpb24oKXtmLm5vZGVOYW1lKHRoaXMsImJvZHkiKXx8Zih0aGlzKS5yZXBsYWNlV2l0aCh0aGlzLmNoaWxkTm9kZXMpfSkuZW5kKCl9LGFwcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywhMCxmdW5jdGlvbihhKXt0aGlzLm5vZGVUeXBlPT09MSYmdGhpcy5hcHBlbmRDaGlsZChhKX0pfSxwcmVwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCEwLGZ1bmN0aW9uKGEpe3RoaXMubm9kZVR5cGU9PT0xJiZ0aGlzLmluc2VydEJlZm9yZShhLHRoaXMuZmlyc3RDaGlsZCl9KX0sYmVmb3JlOmZ1bmN0aW9uKCl7aWYodGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlKXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywhMSxmdW5jdGlvbihhKXt0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcyl9KTtpZihhcmd1bWVudHMubGVuZ3RoKXt2YXIgYT1mKGFyZ3VtZW50c1swXSk7YS5wdXNoLmFwcGx5KGEsdGhpcy50b0FycmF5KCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhhLCJiZWZvcmUiLGFyZ3VtZW50cyl9fSxhZnRlcjpmdW5jdGlvbigpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITEsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLHRoaXMubmV4dFNpYmxpbmcpfSk7aWYoYXJndW1lbnRzLmxlbmd0aCl7dmFyIGE9dGhpcy5wdXNoU3RhY2sodGhpcywiYWZ0ZXIiLGFyZ3VtZW50cyk7YS5wdXNoLmFwcGx5KGEsZihhcmd1bWVudHNbMF0pLnRvQXJyYXkoKSk7cmV0dXJuIGF9fSxyZW1vdmU6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MCxkOyhkPXRoaXNbY10pIT1udWxsO2MrKylpZighYXx8Zi5maWx0ZXIoYSxbZF0pLmxlbmd0aCkhYiYmZC5ub2RlVHlwZT09PTEmJihmLmNsZWFuRGF0YShkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpLGYuY2xlYW5EYXRhKFtkXSkpLGQucGFyZW50Tm9kZSYmZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGQpO3JldHVybiB0aGlzfSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wLGI7KGI9dGhpc1thXSkhPW51bGw7YSsrKXtiLm5vZGVUeXBlPT09MSYmZi5jbGVhbkRhdGEoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpKTt3aGlsZShiLmZpcnN0Q2hpbGQpYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpfXJldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihhLGIpe2E9YT09bnVsbD8hMTphLGI9Yj09bnVsbD9hOmI7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIGYuY2xvbmUodGhpcyxhLGIpfSl9LGh0bWw6ZnVuY3Rpb24oYSl7aWYoYT09PWIpcmV0dXJuIHRoaXNbMF0mJnRoaXNbMF0ubm9kZVR5cGU9PT0xP3RoaXNbMF0uaW5uZXJIVE1MLnJlcGxhY2UoWCwiIik6bnVsbDtpZih0eXBlb2YgYT09InN0cmluZyImJiFiYi50ZXN0KGEpJiYoZi5zdXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNlfHwhWS50ZXN0KGEpKSYmIWJmWygkLmV4ZWMoYSl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCldKXthPWEucmVwbGFjZShaLCI8JDE+PC8kMj4iKTt0cnl7Zm9yKHZhciBjPTAsZD10aGlzLmxlbmd0aDtjPGQ7YysrKXRoaXNbY10ubm9kZVR5cGU9PT0xJiYoZi5jbGVhbkRhdGEodGhpc1tjXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpKSx0aGlzW2NdLmlubmVySFRNTD1hKX1jYXRjaChlKXt0aGlzLmVtcHR5KCkuYXBwZW5kKGEpfX1lbHNlIGYuaXNGdW5jdGlvbihhKT90aGlzLmVhY2goZnVuY3Rpb24oYil7dmFyIGM9Zih0aGlzKTtjLmh0bWwoYS5jYWxsKHRoaXMsYixjLmh0bWwoKSkpfSk6dGhpcy5lbXB0eSgpLmFwcGVuZChhKTtyZXR1cm4gdGhpc30scmVwbGFjZVdpdGg6ZnVuY3Rpb24oYSl7aWYodGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlKXtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXt2YXIgYz1mKHRoaXMpLGQ9Yy5odG1sKCk7Yy5yZXBsYWNlV2l0aChhLmNhbGwodGhpcyxiLGQpKX0pO3R5cGVvZiBhIT0ic3RyaW5nIiYmKGE9ZihhKS5kZXRhY2goKSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPXRoaXMubmV4dFNpYmxpbmcsYz10aGlzLnBhcmVudE5vZGU7Zih0aGlzKS5yZW1vdmUoKSxiP2YoYikuYmVmb3JlKGEpOmYoYykuYXBwZW5kKGEpfSl9cmV0dXJuIHRoaXMubGVuZ3RoP3RoaXMucHVzaFN0YWNrKGYoZi5pc0Z1bmN0aW9uKGEpP2EoKTphKSwicmVwbGFjZVdpdGgiLGEpOnRoaXN9LGRldGFjaDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5yZW1vdmUoYSwhMCl9LGRvbU1hbmlwOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZSxnLGgsaSxqPWFbMF0saz1bXTtpZighZi5zdXBwb3J0LmNoZWNrQ2xvbmUmJmFyZ3VtZW50cy5sZW5ndGg9PT0zJiZ0eXBlb2Ygaj09InN0cmluZyImJmJjLnRlc3QoaikpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YodGhpcykuZG9tTWFuaXAoYSxjLGQsITApfSk7aWYoZi5pc0Z1bmN0aW9uKGopKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZSl7dmFyIGc9Zih0aGlzKTthWzBdPWouY2FsbCh0aGlzLGUsYz9nLmh0bWwoKTpiKSxnLmRvbU1hbmlwKGEsYyxkKX0pO2lmKHRoaXNbMF0pe2k9aiYmai5wYXJlbnROb2RlLGYuc3VwcG9ydC5wYXJlbnROb2RlJiZpJiZpLm5vZGVUeXBlPT09MTEmJmkuY2hpbGROb2Rlcy5sZW5ndGg9PT10aGlzLmxlbmd0aD9lPXtmcmFnbWVudDppfTplPWYuYnVpbGRGcmFnbWVudChhLHRoaXMsayksaD1lLmZyYWdtZW50LGguY2hpbGROb2Rlcy5sZW5ndGg9PT0xP2c9aD1oLmZpcnN0Q2hpbGQ6Zz1oLmZpcnN0Q2hpbGQ7aWYoZyl7Yz1jJiZmLm5vZGVOYW1lKGcsInRyIik7Zm9yKHZhciBsPTAsbT10aGlzLmxlbmd0aCxuPW0tMTtsPG07bCsrKWQuY2FsbChjP2JnKHRoaXNbbF0sZyk6dGhpc1tsXSxlLmNhY2hlYWJsZXx8bT4xJiZsPG4/Zi5jbG9uZShoLCEwLCEwKTpoKX1rLmxlbmd0aCYmZi5lYWNoKGssYm0pfXJldHVybiB0aGlzfX0pLGYuYnVpbGRGcmFnbWVudD1mdW5jdGlvbihhLGIsZCl7dmFyIGUsZyxoLGk7YiYmYlswXSYmKGk9YlswXS5vd25lckRvY3VtZW50fHxiWzBdKSxpLmNyZWF0ZURvY3VtZW50RnJhZ21lbnR8fChpPWMpLGEubGVuZ3RoPT09MSYmdHlwZW9mIGFbMF09PSJzdHJpbmciJiZhWzBdLmxlbmd0aDw1MTImJmk9PT1jJiZhWzBdLmNoYXJBdCgwKT09PSI8IiYmIWJiLnRlc3QoYVswXSkmJihmLnN1cHBvcnQuY2hlY2tDbG9uZXx8IWJjLnRlc3QoYVswXSkpJiYoZz0hMCxoPWYuZnJhZ21lbnRzW2FbMF1dLGgmJmghPT0xJiYoZT1oKSksZXx8KGU9aS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksZi5jbGVhbihhLGksZSxkKSksZyYmKGYuZnJhZ21lbnRzW2FbMF1dPWg/ZToxKTtyZXR1cm57ZnJhZ21lbnQ6ZSxjYWNoZWFibGU6Z319LGYuZnJhZ21lbnRzPXt9LGYuZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGEsYil7Zi5mblthXT1mdW5jdGlvbihjKXt2YXIgZD1bXSxlPWYoYyksZz10aGlzLmxlbmd0aD09PTEmJnRoaXNbMF0ucGFyZW50Tm9kZTtpZihnJiZnLm5vZGVUeXBlPT09MTEmJmcuY2hpbGROb2Rlcy5sZW5ndGg9PT0xJiZlLmxlbmd0aD09PTEpe2VbYl0odGhpc1swXSk7cmV0dXJuIHRoaXN9Zm9yKHZhciBoPTAsaT1lLmxlbmd0aDtoPGk7aCsrKXt2YXIgaj0oaD4wP3RoaXMuY2xvbmUoITApOnRoaXMpLmdldCgpO2YoZVtoXSlbYl0oaiksZD1kLmNvbmNhdChqCil9cmV0dXJuIHRoaXMucHVzaFN0YWNrKGQsYSxlLnNlbGVjdG9yKX19KSxmLmV4dGVuZCh7Y2xvbmU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuY2xvbmVOb2RlKCEwKSxlLGcsaDtpZigoIWYuc3VwcG9ydC5ub0Nsb25lRXZlbnR8fCFmLnN1cHBvcnQubm9DbG9uZUNoZWNrZWQpJiYoYS5ub2RlVHlwZT09PTF8fGEubm9kZVR5cGU9PT0xMSkmJiFmLmlzWE1MRG9jKGEpKXtiaShhLGQpLGU9YmooYSksZz1iaihkKTtmb3IoaD0wO2VbaF07KytoKWJpKGVbaF0sZ1toXSl9aWYoYil7YmgoYSxkKTtpZihjKXtlPWJqKGEpLGc9YmooZCk7Zm9yKGg9MDtlW2hdOysraCliaChlW2hdLGdbaF0pfX1lPWc9bnVsbDtyZXR1cm4gZH0sY2xlYW46ZnVuY3Rpb24oYSxiLGQsZSl7dmFyIGc7Yj1ifHxjLHR5cGVvZiBiLmNyZWF0ZUVsZW1lbnQ9PSJ1bmRlZmluZWQiJiYoYj1iLm93bmVyRG9jdW1lbnR8fGJbMF0mJmJbMF0ub3duZXJEb2N1bWVudHx8Yyk7dmFyIGg9W10saTtmb3IodmFyIGo9MCxrOyhrPWFbal0pIT1udWxsO2orKyl7dHlwZW9mIGs9PSJudW1iZXIiJiYoays9IiIpO2lmKCFrKWNvbnRpbnVlO2lmKHR5cGVvZiBrPT0ic3RyaW5nIilpZighYmEudGVzdChrKSlrPWIuY3JlYXRlVGV4dE5vZGUoayk7ZWxzZXtrPWsucmVwbGFjZShaLCI8JDE+PC8kMj4iKTt2YXIgbD0oJC5leGVjKGspfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLG09YmZbbF18fGJmLl9kZWZhdWx0LG49bVswXSxvPWIuY3JlYXRlRWxlbWVudCgiZGl2Iik7by5pbm5lckhUTUw9bVsxXStrK21bMl07d2hpbGUobi0tKW89by5sYXN0Q2hpbGQ7aWYoIWYuc3VwcG9ydC50Ym9keSl7dmFyIHA9Xy50ZXN0KGspLHE9bD09PSJ0YWJsZSImJiFwP28uZmlyc3RDaGlsZCYmby5maXJzdENoaWxkLmNoaWxkTm9kZXM6bVsxXT09PSI8dGFibGU+IiYmIXA/by5jaGlsZE5vZGVzOltdO2ZvcihpPXEubGVuZ3RoLTE7aT49MDstLWkpZi5ub2RlTmFtZShxW2ldLCJ0Ym9keSIpJiYhcVtpXS5jaGlsZE5vZGVzLmxlbmd0aCYmcVtpXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHFbaV0pfSFmLnN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2UmJlkudGVzdChrKSYmby5pbnNlcnRCZWZvcmUoYi5jcmVhdGVUZXh0Tm9kZShZLmV4ZWMoaylbMF0pLG8uZmlyc3RDaGlsZCksaz1vLmNoaWxkTm9kZXN9dmFyIHI7aWYoIWYuc3VwcG9ydC5hcHBlbmRDaGVja2VkKWlmKGtbMF0mJnR5cGVvZiAocj1rLmxlbmd0aCk9PSJudW1iZXIiKWZvcihpPTA7aTxyO2krKylibChrW2ldKTtlbHNlIGJsKGspO2subm9kZVR5cGU/aC5wdXNoKGspOmg9Zi5tZXJnZShoLGspfWlmKGQpe2c9ZnVuY3Rpb24oYSl7cmV0dXJuIWEudHlwZXx8YmQudGVzdChhLnR5cGUpfTtmb3Ioaj0wO2hbal07aisrKWlmKGUmJmYubm9kZU5hbWUoaFtqXSwic2NyaXB0IikmJighaFtqXS50eXBlfHxoW2pdLnR5cGUudG9Mb3dlckNhc2UoKT09PSJ0ZXh0L2phdmFzY3JpcHQiKSllLnB1c2goaFtqXS5wYXJlbnROb2RlP2hbal0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChoW2pdKTpoW2pdKTtlbHNle2lmKGhbal0ubm9kZVR5cGU9PT0xKXt2YXIgcz1mLmdyZXAoaFtqXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0IiksZyk7aC5zcGxpY2UuYXBwbHkoaCxbaisxLDBdLmNvbmNhdChzKSl9ZC5hcHBlbmRDaGlsZChoW2pdKX19cmV0dXJuIGh9LGNsZWFuRGF0YTpmdW5jdGlvbihhKXt2YXIgYixjLGQ9Zi5jYWNoZSxlPWYuZXhwYW5kbyxnPWYuZXZlbnQuc3BlY2lhbCxoPWYuc3VwcG9ydC5kZWxldGVFeHBhbmRvO2Zvcih2YXIgaT0wLGo7KGo9YVtpXSkhPW51bGw7aSsrKXtpZihqLm5vZGVOYW1lJiZmLm5vRGF0YVtqLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKWNvbnRpbnVlO2M9altmLmV4cGFuZG9dO2lmKGMpe2I9ZFtjXSYmZFtjXVtlXTtpZihiJiZiLmV2ZW50cyl7Zm9yKHZhciBrIGluIGIuZXZlbnRzKWdba10/Zi5ldmVudC5yZW1vdmUoaixrKTpmLnJlbW92ZUV2ZW50KGosayxiLmhhbmRsZSk7Yi5oYW5kbGUmJihiLmhhbmRsZS5lbGVtPW51bGwpfWg/ZGVsZXRlIGpbZi5leHBhbmRvXTpqLnJlbW92ZUF0dHJpYnV0ZSYmai5yZW1vdmVBdHRyaWJ1dGUoZi5leHBhbmRvKSxkZWxldGUgZFtjXX19fX0pO3ZhciBibj0vYWxwaGFcKFteKV0qXCkvaSxibz0vb3BhY2l0eT0oW14pXSopLyxicD0vKFtBLVpdfF5tcykvZyxicT0vXi0/XGQrKD86cHgpPyQvaSxicj0vXi0/XGQvLGJzPS9eWytcLV09LyxidD0vW14rXC1cLlxkZV0rL2csYnU9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LGJ2PVsiTGVmdCIsIlJpZ2h0Il0sYnc9WyJUb3AiLCJCb3R0b20iXSxieCxieSxiejtmLmZuLmNzcz1mdW5jdGlvbihhLGMpe2lmKGFyZ3VtZW50cy5sZW5ndGg9PT0yJiZjPT09YilyZXR1cm4gdGhpcztyZXR1cm4gZi5hY2Nlc3ModGhpcyxhLGMsITAsZnVuY3Rpb24oYSxjLGQpe3JldHVybiBkIT09Yj9mLnN0eWxlKGEsYyxkKTpmLmNzcyhhLGMpfSl9LGYuZXh0ZW5kKHtjc3NIb29rczp7b3BhY2l0eTp7Z2V0OmZ1bmN0aW9uKGEsYil7aWYoYil7dmFyIGM9YngoYSwib3BhY2l0eSIsIm9wYWNpdHkiKTtyZXR1cm4gYz09PSIiPyIxIjpjfXJldHVybiBhLnN0eWxlLm9wYWNpdHl9fX0sY3NzTnVtYmVyOntmaWxsT3BhY2l0eTohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6Zi5zdXBwb3J0LmNzc0Zsb2F0PyJjc3NGbG9hdCI6InN0eWxlRmxvYXQifSxzdHlsZTpmdW5jdGlvbihhLGMsZCxlKXtpZighIWEmJmEubm9kZVR5cGUhPT0zJiZhLm5vZGVUeXBlIT09OCYmISFhLnN0eWxlKXt2YXIgZyxoLGk9Zi5jYW1lbENhc2UoYyksaj1hLnN0eWxlLGs9Zi5jc3NIb29rc1tpXTtjPWYuY3NzUHJvcHNbaV18fGk7aWYoZD09PWIpe2lmKGsmJiJnZXQiaW4gayYmKGc9ay5nZXQoYSwhMSxlKSkhPT1iKXJldHVybiBnO3JldHVybiBqW2NdfWg9dHlwZW9mIGQ7aWYoaD09PSJudW1iZXIiJiZpc05hTihkKXx8ZD09bnVsbClyZXR1cm47aD09PSJzdHJpbmciJiZicy50ZXN0KGQpJiYoZD0rZC5yZXBsYWNlKGJ0LCIiKStwYXJzZUZsb2F0KGYuY3NzKGEsYykpLGg9Im51bWJlciIpLGg9PT0ibnVtYmVyIiYmIWYuY3NzTnVtYmVyW2ldJiYoZCs9InB4Iik7aWYoIWt8fCEoInNldCJpbiBrKXx8KGQ9ay5zZXQoYSxkKSkhPT1iKXRyeXtqW2NdPWR9Y2F0Y2gobCl7fX19LGNzczpmdW5jdGlvbihhLGMsZCl7dmFyIGUsZztjPWYuY2FtZWxDYXNlKGMpLGc9Zi5jc3NIb29rc1tjXSxjPWYuY3NzUHJvcHNbY118fGMsYz09PSJjc3NGbG9hdCImJihjPSJmbG9hdCIpO2lmKGcmJiJnZXQiaW4gZyYmKGU9Zy5nZXQoYSwhMCxkKSkhPT1iKXJldHVybiBlO2lmKGJ4KXJldHVybiBieChhLGMpfSxzd2FwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD17fTtmb3IodmFyIGUgaW4gYilkW2VdPWEuc3R5bGVbZV0sYS5zdHlsZVtlXT1iW2VdO2MuY2FsbChhKTtmb3IoZSBpbiBiKWEuc3R5bGVbZV09ZFtlXX19KSxmLmN1ckNTUz1mLmNzcyxmLmVhY2goWyJoZWlnaHQiLCJ3aWR0aCJdLGZ1bmN0aW9uKGEsYil7Zi5jc3NIb29rc1tiXT17Z2V0OmZ1bmN0aW9uKGEsYyxkKXt2YXIgZTtpZihjKXtpZihhLm9mZnNldFdpZHRoIT09MClyZXR1cm4gYkEoYSxiLGQpO2Yuc3dhcChhLGJ1LGZ1bmN0aW9uKCl7ZT1iQShhLGIsZCl9KTtyZXR1cm4gZX19LHNldDpmdW5jdGlvbihhLGIpe2lmKCFicS50ZXN0KGIpKXJldHVybiBiO2I9cGFyc2VGbG9hdChiKTtpZihiPj0wKXJldHVybiBiKyJweCJ9fX0pLGYuc3VwcG9ydC5vcGFjaXR5fHwoZi5jc3NIb29rcy5vcGFjaXR5PXtnZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYm8udGVzdCgoYiYmYS5jdXJyZW50U3R5bGU/YS5jdXJyZW50U3R5bGUuZmlsdGVyOmEuc3R5bGUuZmlsdGVyKXx8IiIpP3BhcnNlRmxvYXQoUmVnRXhwLiQxKS8xMDArIiI6Yj8iMSI6IiJ9LHNldDpmdW5jdGlvbihhLGIpe3ZhciBjPWEuc3R5bGUsZD1hLmN1cnJlbnRTdHlsZTtjLnpvb209MTt2YXIgZT1mLmlzTmFOKGIpPyIiOiJhbHBoYShvcGFjaXR5PSIrYioxMDArIikiLGc9ZCYmZC5maWx0ZXJ8fGMuZmlsdGVyfHwiIjtjLmZpbHRlcj1ibi50ZXN0KGcpP2cucmVwbGFjZShibixlKTpnKyIgIitlfX0pLGYoZnVuY3Rpb24oKXtmLnN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodHx8KGYuY3NzSG9va3MubWFyZ2luUmlnaHQ9e2dldDpmdW5jdGlvbihhLGIpe3ZhciBjO2Yuc3dhcChhLHtkaXNwbGF5OiJpbmxpbmUtYmxvY2sifSxmdW5jdGlvbigpe2I/Yz1ieChhLCJtYXJnaW4tcmlnaHQiLCJtYXJnaW5SaWdodCIpOmM9YS5zdHlsZS5tYXJnaW5SaWdodH0pO3JldHVybiBjfX0pfSksYy5kZWZhdWx0VmlldyYmYy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlJiYoYnk9ZnVuY3Rpb24oYSxjKXt2YXIgZCxlLGc7Yz1jLnJlcGxhY2UoYnAsIi0kMSIpLnRvTG93ZXJDYXNlKCk7aWYoIShlPWEub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldykpcmV0dXJuIGI7aWYoZz1lLmdldENvbXB1dGVkU3R5bGUoYSxudWxsKSlkPWcuZ2V0UHJvcGVydHlWYWx1ZShjKSxkPT09IiImJiFmLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsYSkmJihkPWYuc3R5bGUoYSxjKSk7cmV0dXJuIGR9KSxjLmRvY3VtZW50RWxlbWVudC5jdXJyZW50U3R5bGUmJihiej1mdW5jdGlvbihhLGIpe3ZhciBjLGQ9YS5jdXJyZW50U3R5bGUmJmEuY3VycmVudFN0eWxlW2JdLGU9YS5ydW50aW1lU3R5bGUmJmEucnVudGltZVN0eWxlW2JdLGY9YS5zdHlsZTshYnEudGVzdChkKSYmYnIudGVzdChkKSYmKGM9Zi5sZWZ0LGUmJihhLnJ1bnRpbWVTdHlsZS5sZWZ0PWEuY3VycmVudFN0eWxlLmxlZnQpLGYubGVmdD1iPT09ImZvbnRTaXplIj8iMWVtIjpkfHwwLGQ9Zi5waXhlbExlZnQrInB4IixmLmxlZnQ9YyxlJiYoYS5ydW50aW1lU3R5bGUubGVmdD1lKSk7cmV0dXJuIGQ9PT0iIj8iYXV0byI6ZH0pLGJ4PWJ5fHxieixmLmV4cHImJmYuZXhwci5maWx0ZXJzJiYoZi5leHByLmZpbHRlcnMuaGlkZGVuPWZ1bmN0aW9uKGEpe3ZhciBiPWEub2Zmc2V0V2lkdGgsYz1hLm9mZnNldEhlaWdodDtyZXR1cm4gYj09PTAmJmM9PT0wfHwhZi5zdXBwb3J0LnJlbGlhYmxlSGlkZGVuT2Zmc2V0cyYmKGEuc3R5bGUuZGlzcGxheXx8Zi5jc3MoYSwiZGlzcGxheSIpKT09PSJub25lIn0sZi5leHByLmZpbHRlcnMudmlzaWJsZT1mdW5jdGlvbihhKXtyZXR1cm4hZi5leHByLmZpbHRlcnMuaGlkZGVuKGEpfSk7dmFyIGJCPS8lMjAvZyxiQz0vXFtcXSQvLGJEPS9ccj9cbi9nLGJFPS8jLiokLyxiRj0vXiguKj8pOlsgXHRdKihbXlxyXG5dKilccj8kL21nLGJHPS9eKD86Y29sb3J8ZGF0ZXxkYXRldGltZXxlbWFpbHxoaWRkZW58bW9udGh8bnVtYmVyfHBhc3N3b3JkfHJhbmdlfHNlYXJjaHx0ZWx8dGV4dHx0aW1lfHVybHx3ZWVrKSQvaSxiSD0vXig/OmFib3V0fGFwcHxhcHBcLXN0b3JhZ2V8LitcLWV4dGVuc2lvbnxmaWxlfHdpZGdldCk6JC8sYkk9L14oPzpHRVR8SEVBRCkkLyxiSj0vXlwvXC8vLGJLPS9cPy8sYkw9LzxzY3JpcHRcYltePF0qKD86KD8hPFwvc2NyaXB0Pik8W148XSopKjxcL3NjcmlwdD4vZ2ksYk09L14oPzpzZWxlY3R8dGV4dGFyZWEpL2ksYk49L1xzKy8sYk89LyhbPyZdKV89W14mXSovLGJQPS9eKFtcd1wrXC5cLV0rOikoPzpcL1wvKFteXC8/IzpdKikoPzo6KFxkKykpPyk/LyxiUT1mLmZuLmxvYWQsYlI9e30sYlM9e30sYlQsYlU7dHJ5e2JUPWUuaHJlZn1jYXRjaChiVil7YlQ9Yy5jcmVhdGVFbGVtZW50KCJhIiksYlQuaHJlZj0iIixiVD1iVC5ocmVmfWJVPWJQLmV4ZWMoYlQudG9Mb3dlckNhc2UoKSl8fFtdLGYuZm4uZXh0ZW5kKHtsb2FkOmZ1bmN0aW9uKGEsYyxkKXtpZih0eXBlb2YgYSE9InN0cmluZyImJmJRKXJldHVybiBiUS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYoIXRoaXMubGVuZ3RoKXJldHVybiB0aGlzO3ZhciBlPWEuaW5kZXhPZigiICIpO2lmKGU+PTApe3ZhciBnPWEuc2xpY2UoZSxhLmxlbmd0aCk7YT1hLnNsaWNlKDAsZSl9dmFyIGg9IkdFVCI7YyYmKGYuaXNGdW5jdGlvbihjKT8oZD1jLGM9Yik6dHlwZW9mIGM9PSJvYmplY3QiJiYoYz1mLnBhcmFtKGMsZi5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpLGg9IlBPU1QiKSk7dmFyIGk9dGhpcztmLmFqYXgoe3VybDphLHR5cGU6aCxkYXRhVHlwZToiaHRtbCIsZGF0YTpjLGNvbXBsZXRlOmZ1bmN0aW9uKGEsYixjKXtjPWEucmVzcG9uc2VUZXh0LGEuaXNSZXNvbHZlZCgpJiYoYS5kb25lKGZ1bmN0aW9uKGEpe2M9YX0pLGkuaHRtbChnP2YoIjxkaXY+IikuYXBwZW5kKGMucmVwbGFjZShiTCwiIikpLmZpbmQoZyk6YykpLGQmJmkuZWFjaChkLFtjLGIsYV0pfX0pO3JldHVybiB0aGlzfSxzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gZi5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnRzP2YubWFrZUFycmF5KHRoaXMuZWxlbWVudHMpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYW1lJiYhdGhpcy5kaXNhYmxlZCYmKHRoaXMuY2hlY2tlZHx8Yk0udGVzdCh0aGlzLm5vZGVOYW1lKXx8YkcudGVzdCh0aGlzLnR5cGUpKX0pLm1hcChmdW5jdGlvbihhLGIpe3ZhciBjPWYodGhpcykudmFsKCk7cmV0dXJuIGM9PW51bGw/bnVsbDpmLmlzQXJyYXkoYyk/Zi5tYXAoYyxmdW5jdGlvbihhLGMpe3JldHVybntuYW1lOmIubmFtZSx2YWx1ZTphLnJlcGxhY2UoYkQsIlxyXG4iKX19KTp7bmFtZTpiLm5hbWUsdmFsdWU6Yy5yZXBsYWNlKGJELCJcclxuIil9fSkuZ2V0KCl9fSksZi5lYWNoKCJhamF4U3RhcnQgYWpheFN0b3AgYWpheENvbXBsZXRlIGFqYXhFcnJvciBhamF4U3VjY2VzcyBhamF4U2VuZCIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe2YuZm5bYl09ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYmluZChiLGEpfX0pLGYuZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbihhLGMpe2ZbY109ZnVuY3Rpb24oYSxkLGUsZyl7Zi5pc0Z1bmN0aW9uKGQpJiYoZz1nfHxlLGU9ZCxkPWIpO3JldHVybiBmLmFqYXgoe3R5cGU6Yyx1cmw6YSxkYXRhOmQsc3VjY2VzczplLGRhdGFUeXBlOmd9KX19KSxmLmV4dGVuZCh7Z2V0U2NyaXB0OmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGYuZ2V0KGEsYixjLCJzY3JpcHQiKX0sZ2V0SlNPTjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuZ2V0KGEsYixjLCJqc29uIil9LGFqYXhTZXR1cDpmdW5jdGlvbihhLGIpe2I/Zi5leHRlbmQoITAsYSxmLmFqYXhTZXR0aW5ncyxiKTooYj1hLGE9Zi5leHRlbmQoITAsZi5hamF4U2V0dGluZ3MsYikpO2Zvcih2YXIgYyBpbntjb250ZXh0OjEsdXJsOjF9KWMgaW4gYj9hW2NdPWJbY106YyBpbiBmLmFqYXhTZXR0aW5ncyYmKGFbY109Zi5hamF4U2V0dGluZ3NbY10pO3JldHVybiBhfSxhamF4U2V0dGluZ3M6e3VybDpiVCxpc0xvY2FsOmJILnRlc3QoYlVbMV0pLGdsb2JhbDohMCx0eXBlOiJHRVQiLGNvbnRlbnRUeXBlOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLHByb2Nlc3NEYXRhOiEwLGFzeW5jOiEwLGFjY2VwdHM6e3htbDoiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsaHRtbDoidGV4dC9odG1sIix0ZXh0OiJ0ZXh0L3BsYWluIixqc29uOiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQiLCIqIjoiKi8qIn0sY29udGVudHM6e3htbDoveG1sLyxodG1sOi9odG1sLyxqc29uOi9qc29uL30scmVzcG9uc2VGaWVsZHM6e3htbDoicmVzcG9uc2VYTUwiLHRleHQ6InJlc3BvbnNlVGV4dCJ9LGNvbnZlcnRlcnM6eyIqIHRleHQiOmEuU3RyaW5nLCJ0ZXh0IGh0bWwiOiEwLCJ0ZXh0IGpzb24iOmYucGFyc2VKU09OLCJ0ZXh0IHhtbCI6Zi5wYXJzZVhNTH19LGFqYXhQcmVmaWx0ZXI6YlcoYlIpLGFqYXhUcmFuc3BvcnQ6YlcoYlMpLGFqYXg6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiB3KGEsYyxsLG0pe2lmKHMhPT0yKXtzPTIscSYmY2xlYXJUaW1lb3V0KHEpLHA9YixuPW18fCIiLHYucmVhZHlTdGF0ZT1hPzQ6MDt2YXIgbyxyLHUsdz1sP2JaKGQsdixsKTpiLHgseTtpZihhPj0yMDAmJmE8MzAwfHxhPT09MzA0KXtpZihkLmlmTW9kaWZpZWQpe2lmKHg9di5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpKWYubGFzdE1vZGlmaWVkW2tdPXg7aWYoeT12LmdldFJlc3BvbnNlSGVhZGVyKCJFdGFnIikpZi5ldGFnW2tdPXl9aWYoYT09PTMwNCljPSJub3Rtb2RpZmllZCIsbz0hMDtlbHNlIHRyeXtyPWIkKGQsdyksYz0ic3VjY2VzcyIsbz0hMH1jYXRjaCh6KXtjPSJwYXJzZXJlcnJvciIsdT16fX1lbHNle3U9YztpZighY3x8YSljPSJlcnJvciIsYTwwJiYoYT0wKX12LnN0YXR1cz1hLHYuc3RhdHVzVGV4dD1jLG8/aC5yZXNvbHZlV2l0aChlLFtyLGMsdl0pOmgucmVqZWN0V2l0aChlLFt2LGMsdV0pLHYuc3RhdHVzQ29kZShqKSxqPWIsdCYmZy50cmlnZ2VyKCJhamF4Iisobz8iU3VjY2VzcyI6IkVycm9yIiksW3YsZCxvP3I6dV0pLGkucmVzb2x2ZVdpdGgoZSxbdixjXSksdCYmKGcudHJpZ2dlcigiYWpheENvbXBsZXRlIixbdixkXSksLS1mLmFjdGl2ZXx8Zi5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpKX19dHlwZW9mIGE9PSJvYmplY3QiJiYoYz1hLGE9YiksYz1jfHx7fTt2YXIgZD1mLmFqYXhTZXR1cCh7fSxjKSxlPWQuY29udGV4dHx8ZCxnPWUhPT1kJiYoZS5ub2RlVHlwZXx8ZSBpbnN0YW5jZW9mIGYpP2YoZSk6Zi5ldmVudCxoPWYuRGVmZXJyZWQoKSxpPWYuX0RlZmVycmVkKCksaj1kLnN0YXR1c0NvZGV8fHt9LGssbD17fSxtPXt9LG4sbyxwLHEscixzPTAsdCx1LHY9e3JlYWR5U3RhdGU6MCxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGEsYil7aWYoIXMpe3ZhciBjPWEudG9Mb3dlckNhc2UoKTthPW1bY109bVtjXXx8YSxsW2FdPWJ9cmV0dXJuIHRoaXN9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiBzPT09Mj9uOm51bGx9LGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGEpe3ZhciBjO2lmKHM9PT0yKXtpZighbyl7bz17fTt3aGlsZShjPWJGLmV4ZWMobikpb1tjWzFdLnRvTG93ZXJDYXNlKCldPWNbMl19Yz1vW2EudG9Mb3dlckNhc2UoKV19cmV0dXJuIGM9PT1iP251bGw6Y30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihhKXtzfHwoZC5taW1lVHlwZT1hKTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24oYSl7YT1hfHwiYWJvcnQiLHAmJnAuYWJvcnQoYSksdygwLGEpO3JldHVybiB0aGlzfX07aC5wcm9taXNlKHYpLHYuc3VjY2Vzcz12LmRvbmUsdi5lcnJvcj12LmZhaWwsdi5jb21wbGV0ZT1pLmRvbmUsdi5zdGF0dXNDb2RlPWZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBiO2lmKHM8Milmb3IoYiBpbiBhKWpbYl09W2pbYl0sYVtiXV07ZWxzZSBiPWFbdi5zdGF0dXNdLHYudGhlbihiLGIpfXJldHVybiB0aGlzfSxkLnVybD0oKGF8fGQudXJsKSsiIikucmVwbGFjZShiRSwiIikucmVwbGFjZShiSixiVVsxXSsiLy8iKSxkLmRhdGFUeXBlcz1mLnRyaW0oZC5kYXRhVHlwZXx8IioiKS50b0xvd2VyQ2FzZSgpLnNwbGl0KGJOKSxkLmNyb3NzRG9tYWluPT1udWxsJiYocj1iUC5leGVjKGQudXJsLnRvTG93ZXJDYXNlKCkpLGQuY3Jvc3NEb21haW49ISghcnx8clsxXT09YlVbMV0mJnJbMl09PWJVWzJdJiYoclszXXx8KHJbMV09PT0iaHR0cDoiPzgwOjQ0MykpPT0oYlVbM118fChiVVsxXT09PSJodHRwOiI/ODA6NDQzKSkpKSxkLmRhdGEmJmQucHJvY2Vzc0RhdGEmJnR5cGVvZiBkLmRhdGEhPSJzdHJpbmciJiYoZC5kYXRhPWYucGFyYW0oZC5kYXRhLGQudHJhZGl0aW9uYWwpKSxiWChiUixkLGMsdik7aWYocz09PTIpcmV0dXJuITE7dD1kLmdsb2JhbCxkLnR5cGU9ZC50eXBlLnRvVXBwZXJDYXNlKCksZC5oYXNDb250ZW50PSFiSS50ZXN0KGQudHlwZSksdCYmZi5hY3RpdmUrKz09PTAmJmYuZXZlbnQudHJpZ2dlcigiYWpheFN0YXJ0Iik7aWYoIWQuaGFzQ29udGVudCl7ZC5kYXRhJiYoZC51cmwrPShiSy50ZXN0KGQudXJsKT8iJiI6Ij8iKStkLmRhdGEpLGs9ZC51cmw7aWYoZC5jYWNoZT09PSExKXt2YXIgeD1mLm5vdygpLHk9ZC51cmwucmVwbGFjZShiTywiJDFfPSIreCk7ZC51cmw9eSsoeT09PWQudXJsPyhiSy50ZXN0KGQudXJsKT8iJiI6Ij8iKSsiXz0iK3g6IiIpfX0oZC5kYXRhJiZkLmhhc0NvbnRlbnQmJmQuY29udGVudFR5cGUhPT0hMXx8Yy5jb250ZW50VHlwZSkmJnYuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixkLmNvbnRlbnRUeXBlKSxkLmlmTW9kaWZpZWQmJihrPWt8fGQudXJsLGYubGFzdE1vZGlmaWVkW2tdJiZ2LnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIixmLmxhc3RNb2RpZmllZFtrXSksZi5ldGFnW2tdJiZ2LnNldFJlcXVlc3RIZWFkZXIoIklmLU5vbmUtTWF0Y2giLGYuZXRhZ1trXSkpLHYuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IixkLmRhdGFUeXBlc1swXSYmZC5hY2NlcHRzW2QuZGF0YVR5cGVzWzBdXT9kLmFjY2VwdHNbZC5kYXRhVHlwZXNbMF1dKyhkLmRhdGFUeXBlc1swXSE9PSIqIj8iLCAqLyo7IHE9MC4wMSI6IiIpOmQuYWNjZXB0c1siKiJdKTtmb3IodSBpbiBkLmhlYWRlcnMpdi5zZXRSZXF1ZXN0SGVhZGVyKHUsZC5oZWFkZXJzW3VdKTtpZihkLmJlZm9yZVNlbmQmJihkLmJlZm9yZVNlbmQuY2FsbChlLHYsZCk9PT0hMXx8cz09PTIpKXt2LmFib3J0KCk7cmV0dXJuITF9Zm9yKHUgaW57c3VjY2VzczoxLGVycm9yOjEsY29tcGxldGU6MX0pdlt1XShkW3VdKTtwPWJYKGJTLGQsYyx2KTtpZighcCl3KC0xLCJObyBUcmFuc3BvcnQiKTtlbHNle3YucmVhZHlTdGF0ZT0xLHQmJmcudHJpZ2dlcigiYWpheFNlbmQiLFt2LGRdKSxkLmFzeW5jJiZkLnRpbWVvdXQ+MCYmKHE9c2V0VGltZW91dChmdW5jdGlvbigpe3YuYWJvcnQoInRpbWVvdXQiKX0sZC50aW1lb3V0KSk7dHJ5e3M9MSxwLnNlbmQobCx3KX1jYXRjaCh6KXtzdGF0dXM8Mj93KC0xLHopOmYuZXJyb3Ioeil9fXJldHVybiB2fSxwYXJhbTpmdW5jdGlvbihhLGMpe3ZhciBkPVtdLGU9ZnVuY3Rpb24oYSxiKXtiPWYuaXNGdW5jdGlvbihiKT9iKCk6YixkW2QubGVuZ3RoXT1lbmNvZGVVUklDb21wb25lbnQoYSkrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiKX07Yz09PWImJihjPWYuYWpheFNldHRpbmdzLnRyYWRpdGlvbmFsKTtpZihmLmlzQXJyYXkoYSl8fGEuanF1ZXJ5JiYhZi5pc1BsYWluT2JqZWN0KGEpKWYuZWFjaChhLGZ1bmN0aW9uKCl7ZSh0aGlzLm5hbWUsdGhpcy52YWx1ZSl9KTtlbHNlIGZvcih2YXIgZyBpbiBhKWJZKGcsYVtnXSxjLGUpO3JldHVybiBkLmpvaW4oIiYiKS5yZXBsYWNlKGJCLCIrIil9fSksZi5leHRlbmQoe2FjdGl2ZTowLGxhc3RNb2RpZmllZDp7fSxldGFnOnt9fSk7dmFyIGJfPWYubm93KCksY2E9LyhcPSlcPygmfCQpfFw/XD8vaTtmLmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7cmV0dXJuIGYuZXhwYW5kbysiXyIrYl8rK319KSxmLmFqYXhQcmVmaWx0ZXIoImpzb24ganNvbnAiLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZT1iLmNvbnRlbnRUeXBlPT09ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCImJnR5cGVvZiBiLmRhdGE9PSJzdHJpbmciO2lmKGIuZGF0YVR5cGVzWzBdPT09Impzb25wInx8Yi5qc29ucCE9PSExJiYoY2EudGVzdChiLnVybCl8fGUmJmNhLnRlc3QoYi5kYXRhKSkpe3ZhciBnLGg9Yi5qc29ucENhbGxiYWNrPWYuaXNGdW5jdGlvbihiLmpzb25wQ2FsbGJhY2spP2IuanNvbnBDYWxsYmFjaygpOmIuanNvbnBDYWxsYmFjayxpPWFbaF0saj1iLnVybCxrPWIuZGF0YSxsPSIkMSIraCsiJDIiO2IuanNvbnAhPT0hMSYmKGo9ai5yZXBsYWNlKGNhLGwpLGIudXJsPT09aiYmKGUmJihrPWsucmVwbGFjZShjYSxsKSksYi5kYXRhPT09ayYmKGorPSgvXD8vLnRlc3Qoaik/IiYiOiI/IikrYi5qc29ucCsiPSIraCkpKSxiLnVybD1qLGIuZGF0YT1rLGFbaF09ZnVuY3Rpb24oYSl7Zz1bYV19LGQuYWx3YXlzKGZ1bmN0aW9uKCl7YVtoXT1pLGcmJmYuaXNGdW5jdGlvbihpKSYmYVtoXShnWzBdKX0pLGIuY29udmVydGVyc1sic2NyaXB0IGpzb24iXT1mdW5jdGlvbigpe2d8fGYuZXJyb3IoaCsiIHdhcyBub3QgY2FsbGVkIik7cmV0dXJuIGdbMF19LGIuZGF0YVR5cGVzWzBdPSJqc29uIjtyZXR1cm4ic2NyaXB0In19KSxmLmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntzY3JpcHQ6L2phdmFzY3JpcHR8ZWNtYXNjcmlwdC99LGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oYSl7Zi5nbG9iYWxFdmFsKGEpO3JldHVybiBhfX19KSxmLmFqYXhQcmVmaWx0ZXIoInNjcmlwdCIsZnVuY3Rpb24oYSl7YS5jYWNoZT09PWImJihhLmNhY2hlPSExKSxhLmNyb3NzRG9tYWluJiYoYS50eXBlPSJHRVQiLGEuZ2xvYmFsPSExKX0pLGYuYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbihhKXtpZihhLmNyb3NzRG9tYWluKXt2YXIgZCxlPWMuaGVhZHx8Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdfHxjLmRvY3VtZW50RWxlbWVudDtyZXR1cm57c2VuZDpmdW5jdGlvbihmLGcpe2Q9Yy5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLmFzeW5jPSJhc3luYyIsYS5zY3JpcHRDaGFyc2V0JiYoZC5jaGFyc2V0PWEuc2NyaXB0Q2hhcnNldCksZC5zcmM9YS51cmwsZC5vbmxvYWQ9ZC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oYSxjKXtpZihjfHwhZC5yZWFkeVN0YXRlfHwvbG9hZGVkfGNvbXBsZXRlLy50ZXN0KGQucmVhZHlTdGF0ZSkpZC5vbmxvYWQ9ZC5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxlJiZkLnBhcmVudE5vZGUmJmUucmVtb3ZlQ2hpbGQoZCksZD1iLGN8fGcoMjAwLCJzdWNjZXNzIil9LGUuaW5zZXJ0QmVmb3JlKGQsZS5maXJzdENoaWxkKX0sYWJvcnQ6ZnVuY3Rpb24oKXtkJiZkLm9ubG9hZCgwLDEpfX19fSk7dmFyIGNiPWEuQWN0aXZlWE9iamVjdD9mdW5jdGlvbigpe2Zvcih2YXIgYSBpbiBjZCljZFthXSgwLDEpfTohMSxjYz0wLGNkO2YuYWpheFNldHRpbmdzLnhocj1hLkFjdGl2ZVhPYmplY3Q/ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5pc0xvY2FsJiZjZSgpfHxjZigpfTpjZSxmdW5jdGlvbihhKXtmLmV4dGVuZChmLnN1cHBvcnQse2FqYXg6ISFhLGNvcnM6ISFhJiYid2l0aENyZWRlbnRpYWxzImluIGF9KX0oZi5hamF4U2V0dGluZ3MueGhyKCkpLGYuc3VwcG9ydC5hamF4JiZmLmFqYXhUcmFuc3BvcnQoZnVuY3Rpb24oYyl7aWYoIWMuY3Jvc3NEb21haW58fGYuc3VwcG9ydC5jb3JzKXt2YXIgZDtyZXR1cm57c2VuZDpmdW5jdGlvbihlLGcpe3ZhciBoPWMueGhyKCksaSxqO2MudXNlcm5hbWU/aC5vcGVuKGMudHlwZSxjLnVybCxjLmFzeW5jLGMudXNlcm5hbWUsYy5wYXNzd29yZCk6aC5vcGVuKGMudHlwZSxjLnVybCxjLmFzeW5jKTtpZihjLnhockZpZWxkcylmb3IoaiBpbiBjLnhockZpZWxkcyloW2pdPWMueGhyRmllbGRzW2pdO2MubWltZVR5cGUmJmgub3ZlcnJpZGVNaW1lVHlwZSYmaC5vdmVycmlkZU1pbWVUeXBlKGMubWltZVR5cGUpLCFjLmNyb3NzRG9tYWluJiYhZVsiWC1SZXF1ZXN0ZWQtV2l0aCJdJiYoZVsiWC1SZXF1ZXN0ZWQtV2l0aCJdPSJYTUxIdHRwUmVxdWVzdCIpO3RyeXtmb3IoaiBpbiBlKWguc2V0UmVxdWVzdEhlYWRlcihqLGVbal0pfWNhdGNoKGspe31oLnNlbmQoYy5oYXNDb250ZW50JiZjLmRhdGF8fG51bGwpLGQ9ZnVuY3Rpb24oYSxlKXt2YXIgaixrLGwsbSxuO3RyeXtpZihkJiYoZXx8aC5yZWFkeVN0YXRlPT09NCkpe2Q9YixpJiYoaC5vbnJlYWR5c3RhdGVjaGFuZ2U9Zi5ub29wLGNiJiZkZWxldGUgY2RbaV0pO2lmKGUpaC5yZWFkeVN0YXRlIT09NCYmaC5hYm9ydCgpO2Vsc2V7aj1oLnN0YXR1cyxsPWguZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCksbT17fSxuPWgucmVzcG9uc2VYTUwsbiYmbi5kb2N1bWVudEVsZW1lbnQmJihtLnhtbD1uKSxtLnRleHQ9aC5yZXNwb25zZVRleHQ7dHJ5e2s9aC5zdGF0dXNUZXh0fWNhdGNoKG8pe2s9IiJ9IWomJmMuaXNMb2NhbCYmIWMuY3Jvc3NEb21haW4/aj1tLnRleHQ/MjAwOjQwNDpqPT09MTIyMyYmKGo9MjA0KX19fWNhdGNoKHApe2V8fGcoLTEscCl9bSYmZyhqLGssbSxsKX0sIWMuYXN5bmN8fGgucmVhZHlTdGF0ZT09PTQ/ZCgpOihpPSsrY2MsY2ImJihjZHx8KGNkPXt9LGYoYSkudW5sb2FkKGNiKSksY2RbaV09ZCksaC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZCl9LGFib3J0OmZ1bmN0aW9uKCl7ZCYmZCgwLDEpfX19fSk7dmFyIGNnPXt9LGNoLGNpLGNqPS9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyxjaz0vXihbK1wtXT0pPyhbXGQrLlwtXSspKFthLXolXSopJC9pLGNsLGNtPVtbImhlaWdodCIsIm1hcmdpblRvcCIsIm1hcmdpbkJvdHRvbSIsInBhZGRpbmdUb3AiLCJwYWRkaW5nQm90dG9tIl0sWyJ3aWR0aCIsIm1hcmdpbkxlZnQiLCJtYXJnaW5SaWdodCIsInBhZGRpbmdMZWZ0IiwicGFkZGluZ1JpZ2h0Il0sWyJvcGFjaXR5Il1dLGNuLGNvPWEud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lfHxhLm1velJlcXVlc3RBbmltYXRpb25GcmFtZXx8YS5vUmVxdWVzdEFuaW1hdGlvbkZyYW1lO2YuZm4uZXh0ZW5kKHtzaG93OmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlO2lmKGF8fGE9PT0wKXJldHVybiB0aGlzLmFuaW1hdGUoY3IoInNob3ciLDMpLGEsYixjKTtmb3IodmFyIGc9MCxoPXRoaXMubGVuZ3RoO2c8aDtnKyspZD10aGlzW2ddLGQuc3R5bGUmJihlPWQuc3R5bGUuZGlzcGxheSwhZi5fZGF0YShkLCJvbGRkaXNwbGF5IikmJmU9PT0ibm9uZSImJihlPWQuc3R5bGUuZGlzcGxheT0iIiksZT09PSIiJiZmLmNzcyhkLCJkaXNwbGF5Iik9PT0ibm9uZSImJmYuX2RhdGEoZCwib2xkZGlzcGxheSIsY3MoZC5ub2RlTmFtZSkpKTtmb3IoZz0wO2c8aDtnKyspe2Q9dGhpc1tnXTtpZihkLnN0eWxlKXtlPWQuc3R5bGUuZGlzcGxheTtpZihlPT09IiJ8fGU9PT0ibm9uZSIpZC5zdHlsZS5kaXNwbGF5PWYuX2RhdGEoZCwib2xkZGlzcGxheSIpfHwiIn19cmV0dXJuIHRoaXN9LGhpZGU6ZnVuY3Rpb24oYSxiLGMpe2lmKGF8fGE9PT0wKXJldHVybiB0aGlzLmFuaW1hdGUoY3IoImhpZGUiLDMpLGEsYixjKTtmb3IodmFyIGQ9MCxlPXRoaXMubGVuZ3RoO2Q8ZTtkKyspaWYodGhpc1tkXS5zdHlsZSl7dmFyIGc9Zi5jc3ModGhpc1tkXSwiZGlzcGxheSIpO2chPT0ibm9uZSImJiFmLl9kYXRhKHRoaXNbZF0sIm9sZGRpc3BsYXkiKSYmZi5fZGF0YSh0aGlzW2RdLCJvbGRkaXNwbGF5IixnKX1mb3IoZD0wO2Q8ZTtkKyspdGhpc1tkXS5zdHlsZSYmKHRoaXNbZF0uc3R5bGUuZGlzcGxheT0ibm9uZSIpO3JldHVybiB0aGlzfSxfdG9nZ2xlOmYuZm4udG9nZ2xlLHRvZ2dsZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9dHlwZW9mIGE9PSJib29sZWFuIjtmLmlzRnVuY3Rpb24oYSkmJmYuaXNGdW5jdGlvbihiKT90aGlzLl90b2dnbGUuYXBwbHkodGhpcyxhcmd1bWVudHMpOmE9PW51bGx8fGQ/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9ZD9hOmYodGhpcykuaXMoIjpoaWRkZW4iKTtmKHRoaXMpW2I/InNob3ciOiJoaWRlIl0oKX0pOnRoaXMuYW5pbWF0ZShjcigidG9nZ2xlIiwzKSxhLGIsYyk7cmV0dXJuIHRoaXN9LGZhZGVUbzpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5maWx0ZXIoIjpoaWRkZW4iKS5jc3MoIm9wYWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OmJ9LGEsYyxkKX0sYW5pbWF0ZTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1mLnNwZWVkKGIsYyxkKTtpZihmLmlzRW1wdHlPYmplY3QoYSkpcmV0dXJuIHRoaXMuZWFjaChlLmNvbXBsZXRlLFshMV0pO2E9Zi5leHRlbmQoe30sYSk7cmV0dXJuIHRoaXNbZS5xdWV1ZT09PSExPyJlYWNoIjoicXVldWUiXShmdW5jdGlvbigpe2UucXVldWU9PT0hMSYmZi5fbWFyayh0aGlzKTt2YXIgYj1mLmV4dGVuZCh7fSxlKSxjPXRoaXMubm9kZVR5cGU9PT0xLGQ9YyYmZih0aGlzKS5pcygiOmhpZGRlbiIpLGcsaCxpLGosayxsLG0sbixvO2IuYW5pbWF0ZWRQcm9wZXJ0aWVzPXt9O2ZvcihpIGluIGEpe2c9Zi5jYW1lbENhc2UoaSksaSE9PWcmJihhW2ddPWFbaV0sZGVsZXRlIGFbaV0pLGg9YVtnXSxmLmlzQXJyYXkoaCk/KGIuYW5pbWF0ZWRQcm9wZXJ0aWVzW2ddPWhbMV0saD1hW2ddPWhbMF0pOmIuYW5pbWF0ZWRQcm9wZXJ0aWVzW2ddPWIuc3BlY2lhbEVhc2luZyYmYi5zcGVjaWFsRWFzaW5nW2ddfHxiLmVhc2luZ3x8InN3aW5nIjtpZihoPT09ImhpZGUiJiZkfHxoPT09InNob3ciJiYhZClyZXR1cm4gYi5jb21wbGV0ZS5jYWxsKHRoaXMpO2MmJihnPT09ImhlaWdodCJ8fGc9PT0id2lkdGgiKSYmKGIub3ZlcmZsb3c9W3RoaXMuc3R5bGUub3ZlcmZsb3csdGhpcy5zdHlsZS5vdmVyZmxvd1gsdGhpcy5zdHlsZS5vdmVyZmxvd1ldLGYuY3NzKHRoaXMsImRpc3BsYXkiKT09PSJpbmxpbmUiJiZmLmNzcyh0aGlzLCJmbG9hdCIpPT09Im5vbmUiJiYoZi5zdXBwb3J0LmlubGluZUJsb2NrTmVlZHNMYXlvdXQ/KGo9Y3ModGhpcy5ub2RlTmFtZSksaj09PSJpbmxpbmUiP3RoaXMuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIjoodGhpcy5zdHlsZS5kaXNwbGF5PSJpbmxpbmUiLHRoaXMuc3R5bGUuem9vbT0xKSk6dGhpcy5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSl9Yi5vdmVyZmxvdyE9bnVsbCYmKHRoaXMuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIpO2ZvcihpIGluIGEpaz1uZXcgZi5meCh0aGlzLGIsaSksaD1hW2ldLGNqLnRlc3QoaCk/a1toPT09InRvZ2dsZSI/ZD8ic2hvdyI6ImhpZGUiOmhdKCk6KGw9Y2suZXhlYyhoKSxtPWsuY3VyKCksbD8obj1wYXJzZUZsb2F0KGxbMl0pLG89bFszXXx8KGYuY3NzTnVtYmVyW2ldPyIiOiJweCIpLG8hPT0icHgiJiYoZi5zdHlsZSh0aGlzLGksKG58fDEpK28pLG09KG58fDEpL2suY3VyKCkqbSxmLnN0eWxlKHRoaXMsaSxtK28pKSxsWzFdJiYobj0obFsxXT09PSItPSI/LTE6MSkqbittKSxrLmN1c3RvbShtLG4sbykpOmsuY3VzdG9tKG0saCwiIikpO3JldHVybiEwfSl9LHN0b3A6ZnVuY3Rpb24oYSxiKXthJiZ0aGlzLnF1ZXVlKFtdKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYT1mLnRpbWVycyxjPWEubGVuZ3RoO2J8fGYuX3VubWFyayghMCx0aGlzKTt3aGlsZShjLS0pYVtjXS5lbGVtPT09dGhpcyYmKGImJmFbY10oITApLGEuc3BsaWNlKGMsMSkpfSksYnx8dGhpcy5kZXF1ZXVlKCk7cmV0dXJuIHRoaXN9fSksZi5lYWNoKHtzbGlkZURvd246Y3IoInNob3ciLDEpLHNsaWRlVXA6Y3IoImhpZGUiLDEpLHNsaWRlVG9nZ2xlOmNyKCJ0b2dnbGUiLDEpLGZhZGVJbjp7b3BhY2l0eToic2hvdyJ9LGZhZGVPdXQ6e29wYWNpdHk6ImhpZGUifSxmYWRlVG9nZ2xlOntvcGFjaXR5OiJ0b2dnbGUifX0sZnVuY3Rpb24oYSxiKXtmLmZuW2FdPWZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gdGhpcy5hbmltYXRlKGIsYSxjLGQpfX0pLGYuZXh0ZW5kKHtzcGVlZDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSYmdHlwZW9mIGE9PSJvYmplY3QiP2YuZXh0ZW5kKHt9LGEpOntjb21wbGV0ZTpjfHwhYyYmYnx8Zi5pc0Z1bmN0aW9uKGEpJiZhLGR1cmF0aW9uOmEsZWFzaW5nOmMmJmJ8fGImJiFmLmlzRnVuY3Rpb24oYikmJmJ9O2QuZHVyYXRpb249Zi5meC5vZmY/MDp0eXBlb2YgZC5kdXJhdGlvbj09Im51bWJlciI/ZC5kdXJhdGlvbjpkLmR1cmF0aW9uIGluIGYuZnguc3BlZWRzP2YuZnguc3BlZWRzW2QuZHVyYXRpb25dOmYuZnguc3BlZWRzLl9kZWZhdWx0LGQub2xkPWQuY29tcGxldGUsZC5jb21wbGV0ZT1mdW5jdGlvbihhKXtmLmlzRnVuY3Rpb24oZC5vbGQpJiZkLm9sZC5jYWxsKHRoaXMpLGQucXVldWUhPT0hMT9mLmRlcXVldWUodGhpcyk6YSE9PSExJiZmLl91bm1hcmsodGhpcyl9O3JldHVybiBkfSxlYXNpbmc6e2xpbmVhcjpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gYytkKmF9LHN3aW5nOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybigtTWF0aC5jb3MoYSpNYXRoLlBJKS8yKy41KSpkK2N9fSx0aW1lcnM6W10sZng6ZnVuY3Rpb24oYSxiLGMpe3RoaXMub3B0aW9ucz1iLHRoaXMuZWxlbT1hLHRoaXMucHJvcD1jLGIub3JpZz1iLm9yaWd8fHt9fX0pLGYuZngucHJvdG90eXBlPXt1cGRhdGU6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMuc3RlcCYmdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCh0aGlzLmVsZW0sdGhpcy5ub3csdGhpcyksKGYuZnguc3RlcFt0aGlzLnByb3BdfHxmLmZ4LnN0ZXAuX2RlZmF1bHQpKHRoaXMpfSxjdXI6ZnVuY3Rpb24oKXtpZih0aGlzLmVsZW1bdGhpcy5wcm9wXSE9bnVsbCYmKCF0aGlzLmVsZW0uc3R5bGV8fHRoaXMuZWxlbS5zdHlsZVt0aGlzLnByb3BdPT1udWxsKSlyZXR1cm4gdGhpcy5lbGVtW3RoaXMucHJvcF07dmFyIGEsYj1mLmNzcyh0aGlzLmVsZW0sdGhpcy5wcm9wKTtyZXR1cm4gaXNOYU4oYT1wYXJzZUZsb2F0KGIpKT8hYnx8Yj09PSJhdXRvIj8wOmI6YX0sY3VzdG9tOmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBoKGEpe3JldHVybiBkLnN0ZXAoYSl9dmFyIGQ9dGhpcyxlPWYuZngsZzt0aGlzLnN0YXJ0VGltZT1jbnx8Y3AoKSx0aGlzLnN0YXJ0PWEsdGhpcy5lbmQ9Yix0aGlzLnVuaXQ9Y3x8dGhpcy51bml0fHwoZi5jc3NOdW1iZXJbdGhpcy5wcm9wXT8iIjoicHgiKSx0aGlzLm5vdz10aGlzLnN0YXJ0LHRoaXMucG9zPXRoaXMuc3RhdGU9MCxoLmVsZW09dGhpcy5lbGVtLGgoKSYmZi50aW1lcnMucHVzaChoKSYmIWNsJiYoY28/KGNsPSEwLGc9ZnVuY3Rpb24oKXtjbCYmKGNvKGcpLGUudGljaygpKX0sY28oZykpOmNsPXNldEludGVydmFsKGUudGljayxlLmludGVydmFsKSl9LHNob3c6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMub3JpZ1t0aGlzLnByb3BdPWYuc3R5bGUodGhpcy5lbGVtLHRoaXMucHJvcCksdGhpcy5vcHRpb25zLnNob3c9ITAsdGhpcy5jdXN0b20odGhpcy5wcm9wPT09IndpZHRoInx8dGhpcy5wcm9wPT09ImhlaWdodCI/MTowLHRoaXMuY3VyKCkpLGYodGhpcy5lbGVtKS5zaG93KCl9LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMub3JpZ1t0aGlzLnByb3BdPWYuc3R5bGUodGhpcy5lbGVtLHRoaXMucHJvcCksdGhpcy5vcHRpb25zLmhpZGU9ITAsdGhpcy5jdXN0b20odGhpcy5jdXIoKSwwKX0sc3RlcDpmdW5jdGlvbihhKXt2YXIgYj1jbnx8Y3AoKSxjPSEwLGQ9dGhpcy5lbGVtLGU9dGhpcy5vcHRpb25zLGcsaDtpZihhfHxiPj1lLmR1cmF0aW9uK3RoaXMuc3RhcnRUaW1lKXt0aGlzLm5vdz10aGlzLmVuZCx0aGlzLnBvcz10aGlzLnN0YXRlPTEsdGhpcy51cGRhdGUoKSxlLmFuaW1hdGVkUHJvcGVydGllc1t0aGlzLnByb3BdPSEwO2ZvcihnIGluIGUuYW5pbWF0ZWRQcm9wZXJ0aWVzKWUuYW5pbWF0ZWRQcm9wZXJ0aWVzW2ddIT09ITAmJihjPSExKTtpZihjKXtlLm92ZXJmbG93IT1udWxsJiYhZi5zdXBwb3J0LnNocmlua1dyYXBCbG9ja3MmJmYuZWFjaChbIiIsIlgiLCJZIl0sZnVuY3Rpb24oYSxiKXtkLnN0eWxlWyJvdmVyZmxvdyIrYl09ZS5vdmVyZmxvd1thXX0pLGUuaGlkZSYmZihkKS5oaWRlKCk7aWYoZS5oaWRlfHxlLnNob3cpZm9yKHZhciBpIGluIGUuYW5pbWF0ZWRQcm9wZXJ0aWVzKWYuc3R5bGUoZCxpLGUub3JpZ1tpXSk7ZS5jb21wbGV0ZS5jYWxsKGQpfXJldHVybiExfWUuZHVyYXRpb249PUluZmluaXR5P3RoaXMubm93PWI6KGg9Yi10aGlzLnN0YXJ0VGltZSx0aGlzLnN0YXRlPWgvZS5kdXJhdGlvbix0aGlzLnBvcz1mLmVhc2luZ1tlLmFuaW1hdGVkUHJvcGVydGllc1t0aGlzLnByb3BdXSh0aGlzLnN0YXRlLGgsMCwxLGUuZHVyYXRpb24pLHRoaXMubm93PXRoaXMuc3RhcnQrKHRoaXMuZW5kLXRoaXMuc3RhcnQpKnRoaXMucG9zKSx0aGlzLnVwZGF0ZSgpO3JldHVybiEwfX0sZi5leHRlbmQoZi5meCx7dGljazpmdW5jdGlvbigpe2Zvcih2YXIgYT1mLnRpbWVycyxiPTA7YjxhLmxlbmd0aDsrK2IpYVtiXSgpfHxhLnNwbGljZShiLS0sMSk7YS5sZW5ndGh8fGYuZnguc3RvcCgpfSxpbnRlcnZhbDoxMyxzdG9wOmZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbChjbCksY2w9bnVsbH0sc3BlZWRzOntzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LHN0ZXA6e29wYWNpdHk6ZnVuY3Rpb24oYSl7Zi5zdHlsZShhLmVsZW0sIm9wYWNpdHkiLGEubm93KX0sX2RlZmF1bHQ6ZnVuY3Rpb24oYSl7YS5lbGVtLnN0eWxlJiZhLmVsZW0uc3R5bGVbYS5wcm9wXSE9bnVsbD9hLmVsZW0uc3R5bGVbYS5wcm9wXT0oYS5wcm9wPT09IndpZHRoInx8YS5wcm9wPT09ImhlaWdodCI/TWF0aC5tYXgoMCxhLm5vdyk6YS5ub3cpK2EudW5pdDphLmVsZW1bYS5wcm9wXT1hLm5vd319fSksZi5leHByJiZmLmV4cHIuZmlsdGVycyYmKGYuZXhwci5maWx0ZXJzLmFuaW1hdGVkPWZ1bmN0aW9uKGEpe3JldHVybiBmLmdyZXAoZi50aW1lcnMsZnVuY3Rpb24oYil7cmV0dXJuIGE9PT1iLmVsZW19KS5sZW5ndGh9KTt2YXIgY3Q9L150KD86YWJsZXxkfGgpJC9pLGN1PS9eKD86Ym9keXxodG1sKSQvaTsiZ2V0Qm91bmRpbmdDbGllbnRSZWN0ImluIGMuZG9jdW1lbnRFbGVtZW50P2YuZm4ub2Zmc2V0PWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF0sYztpZihhKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Zi5vZmZzZXQuc2V0T2Zmc2V0KHRoaXMsYSxiKX0pO2lmKCFifHwhYi5vd25lckRvY3VtZW50KXJldHVybiBudWxsO2lmKGI9PT1iLm93bmVyRG9jdW1lbnQuYm9keSlyZXR1cm4gZi5vZmZzZXQuYm9keU9mZnNldChiKTt0cnl7Yz1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpfWNhdGNoKGQpe312YXIgZT1iLm93bmVyRG9jdW1lbnQsZz1lLmRvY3VtZW50RWxlbWVudDtpZighY3x8IWYuY29udGFpbnMoZyxiKSlyZXR1cm4gYz97dG9wOmMudG9wLGxlZnQ6Yy5sZWZ0fTp7dG9wOjAsbGVmdDowfTt2YXIgaD1lLmJvZHksaT1jdihlKSxqPWcuY2xpZW50VG9wfHxoLmNsaWVudFRvcHx8MCxrPWcuY2xpZW50TGVmdHx8aC5jbGllbnRMZWZ0fHwwLGw9aS5wYWdlWU9mZnNldHx8Zi5zdXBwb3J0LmJveE1vZGVsJiZnLnNjcm9sbFRvcHx8aC5zY3JvbGxUb3AsbT1pLnBhZ2VYT2Zmc2V0fHxmLnN1cHBvcnQuYm94TW9kZWwmJmcuc2Nyb2xsTGVmdHx8aC5zY3JvbGxMZWZ0LG49Yy50b3ArbC1qLG89Yy5sZWZ0K20taztyZXR1cm57dG9wOm4sbGVmdDpvfX06Zi5mbi5vZmZzZXQ9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpc1swXTtpZihhKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Zi5vZmZzZXQuc2V0T2Zmc2V0KHRoaXMsYSxiKX0pO2lmKCFifHwhYi5vd25lckRvY3VtZW50KXJldHVybiBudWxsO2lmKGI9PT1iLm93bmVyRG9jdW1lbnQuYm9keSlyZXR1cm4gZi5vZmZzZXQuYm9keU9mZnNldChiKTtmLm9mZnNldC5pbml0aWFsaXplKCk7dmFyIGMsZD1iLm9mZnNldFBhcmVudCxlPWIsZz1iLm93bmVyRG9jdW1lbnQsaD1nLmRvY3VtZW50RWxlbWVudCxpPWcuYm9keSxqPWcuZGVmYXVsdFZpZXcsaz1qP2ouZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmIuY3VycmVudFN0eWxlLGw9Yi5vZmZzZXRUb3AsbT1iLm9mZnNldExlZnQ7d2hpbGUoKGI9Yi5wYXJlbnROb2RlKSYmYiE9PWkmJmIhPT1oKXtpZihmLm9mZnNldC5zdXBwb3J0c0ZpeGVkUG9zaXRpb24mJmsucG9zaXRpb249PT0iZml4ZWQiKWJyZWFrO2M9aj9qLmdldENvbXB1dGVkU3R5bGUoYixudWxsKTpiLmN1cnJlbnRTdHlsZSxsLT1iLnNjcm9sbFRvcCxtLT1iLnNjcm9sbExlZnQsYj09PWQmJihsKz1iLm9mZnNldFRvcCxtKz1iLm9mZnNldExlZnQsZi5vZmZzZXQuZG9lc05vdEFkZEJvcmRlciYmKCFmLm9mZnNldC5kb2VzQWRkQm9yZGVyRm9yVGFibGVBbmRDZWxsc3x8IWN0LnRlc3QoYi5ub2RlTmFtZSkpJiYobCs9cGFyc2VGbG9hdChjLmJvcmRlclRvcFdpZHRoKXx8MCxtKz1wYXJzZUZsb2F0KGMuYm9yZGVyTGVmdFdpZHRoKXx8MCksZT1kLGQ9Yi5vZmZzZXRQYXJlbnQpLGYub2Zmc2V0LnN1YnRyYWN0c0JvcmRlckZvck92ZXJmbG93Tm90VmlzaWJsZSYmYy5vdmVyZmxvdyE9PSJ2aXNpYmxlIiYmKGwrPXBhcnNlRmxvYXQoYy5ib3JkZXJUb3BXaWR0aCl8fDAsbSs9cGFyc2VGbG9hdChjLmJvcmRlckxlZnRXaWR0aCl8fDApLGs9Y31pZihrLnBvc2l0aW9uPT09InJlbGF0aXZlInx8ay5wb3NpdGlvbj09PSJzdGF0aWMiKWwrPWkub2Zmc2V0VG9wLG0rPWkub2Zmc2V0TGVmdDtmLm9mZnNldC5zdXBwb3J0c0ZpeGVkUG9zaXRpb24mJmsucG9zaXRpb249PT0iZml4ZWQiJiYobCs9TWF0aC5tYXgoaC5zY3JvbGxUb3AsaS5zY3JvbGxUb3ApLG0rPU1hdGgubWF4KGguc2Nyb2xsTGVmdCxpLnNjcm9sbExlZnQpKTtyZXR1cm57dG9wOmwsbGVmdDptfX0sZi5vZmZzZXQ9e2luaXRpYWxpemU6ZnVuY3Rpb24oKXt2YXIgYT1jLmJvZHksYj1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQsZSxnLGgsaT1wYXJzZUZsb2F0KGYuY3NzKGEsIm1hcmdpblRvcCIpKXx8MCxqPSI8ZGl2IHN0eWxlPSdwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7bWFyZ2luOjA7Ym9yZGVyOjVweCBzb2xpZCAjMDAwO3BhZGRpbmc6MDt3aWR0aDoxcHg7aGVpZ2h0OjFweDsnPjxkaXY+PC9kaXY+PC9kaXY+PHRhYmxlIHN0eWxlPSdwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7bWFyZ2luOjA7Ym9yZGVyOjVweCBzb2xpZCAjMDAwO3BhZGRpbmc6MDt3aWR0aDoxcHg7aGVpZ2h0OjFweDsnIGNlbGxwYWRkaW5nPScwJyBjZWxsc3BhY2luZz0nMCc+PHRyPjx0ZD48L3RkPjwvdHI+PC90YWJsZT4iO2YuZXh0ZW5kKGIuc3R5bGUse3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOjAsbGVmdDowLG1hcmdpbjowLGJvcmRlcjowLHdpZHRoOiIxcHgiLGhlaWdodDoiMXB4Iix2aXNpYmlsaXR5OiJoaWRkZW4ifSksYi5pbm5lckhUTUw9aixhLmluc2VydEJlZm9yZShiLGEuZmlyc3RDaGlsZCksZD1iLmZpcnN0Q2hpbGQsZT1kLmZpcnN0Q2hpbGQsaD1kLm5leHRTaWJsaW5nLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZCx0aGlzLmRvZXNOb3RBZGRCb3JkZXI9ZS5vZmZzZXRUb3AhPT01LHRoaXMuZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHM9aC5vZmZzZXRUb3A9PT01LGUuc3R5bGUucG9zaXRpb249ImZpeGVkIixlLnN0eWxlLnRvcD0iMjBweCIsdGhpcy5zdXBwb3J0c0ZpeGVkUG9zaXRpb249ZS5vZmZzZXRUb3A9PT0yMHx8ZS5vZmZzZXRUb3A9PT0xNSxlLnN0eWxlLnBvc2l0aW9uPWUuc3R5bGUudG9wPSIiLGQuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIsZC5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLHRoaXMuc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlPWUub2Zmc2V0VG9wPT09LTUsdGhpcy5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldD1hLm9mZnNldFRvcCE9PWksYS5yZW1vdmVDaGlsZChiKSxmLm9mZnNldC5pbml0aWFsaXplPWYubm9vcH0sYm9keU9mZnNldDpmdW5jdGlvbihhKXt2YXIgYj1hLm9mZnNldFRvcCxjPWEub2Zmc2V0TGVmdDtmLm9mZnNldC5pbml0aWFsaXplKCksZi5vZmZzZXQuZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQmJihiKz1wYXJzZUZsb2F0KGYuY3NzKGEsIm1hcmdpblRvcCIpKXx8MCxjKz1wYXJzZUZsb2F0KGYuY3NzKGEsIm1hcmdpbkxlZnQiKSl8fDApO3JldHVybnt0b3A6YixsZWZ0OmN9fSxzZXRPZmZzZXQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWYuY3NzKGEsInBvc2l0aW9uIik7ZD09PSJzdGF0aWMiJiYoYS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKTt2YXIgZT1mKGEpLGc9ZS5vZmZzZXQoKSxoPWYuY3NzKGEsInRvcCIpLGk9Zi5jc3MoYSwibGVmdCIpLGo9KGQ9PT0iYWJzb2x1dGUifHxkPT09ImZpeGVkIikmJmYuaW5BcnJheSgiYXV0byIsW2gsaV0pPi0xLGs9e30sbD17fSxtLG47aj8obD1lLnBvc2l0aW9uKCksbT1sLnRvcCxuPWwubGVmdCk6KG09cGFyc2VGbG9hdChoKXx8MCxuPXBhcnNlRmxvYXQoaSl8fDApLGYuaXNGdW5jdGlvbihiKSYmKGI9Yi5jYWxsKGEsYyxnKSksYi50b3AhPW51bGwmJihrLnRvcD1iLnRvcC1nLnRvcCttKSxiLmxlZnQhPW51bGwmJihrLmxlZnQ9Yi5sZWZ0LWcubGVmdCtuKSwidXNpbmciaW4gYj9iLnVzaW5nLmNhbGwoYSxrKTplLmNzcyhrKX19LGYuZm4uZXh0ZW5kKHtwb3NpdGlvbjpmdW5jdGlvbigpe2lmKCF0aGlzWzBdKXJldHVybiBudWxsO3ZhciBhPXRoaXNbMF0sYj10aGlzLm9mZnNldFBhcmVudCgpLGM9dGhpcy5vZmZzZXQoKSxkPWN1LnRlc3QoYlswXS5ub2RlTmFtZSk/e3RvcDowLGxlZnQ6MH06Yi5vZmZzZXQoKTtjLnRvcC09cGFyc2VGbG9hdChmLmNzcyhhLCJtYXJnaW5Ub3AiKSl8fDAsYy5sZWZ0LT1wYXJzZUZsb2F0KGYuY3NzKGEsIm1hcmdpbkxlZnQiKSl8fDAsZC50b3ArPXBhcnNlRmxvYXQoZi5jc3MoYlswXSwiYm9yZGVyVG9wV2lkdGgiKSl8fDAsZC5sZWZ0Kz1wYXJzZUZsb2F0KGYuY3NzKGJbMF0sImJvcmRlckxlZnRXaWR0aCIpKXx8MDtyZXR1cm57dG9wOmMudG9wLWQudG9wLGxlZnQ6Yy5sZWZ0LWQubGVmdH19LG9mZnNldFBhcmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBhPXRoaXMub2Zmc2V0UGFyZW50fHxjLmJvZHk7d2hpbGUoYSYmIWN1LnRlc3QoYS5ub2RlTmFtZSkmJmYuY3NzKGEsInBvc2l0aW9uIik9PT0ic3RhdGljIilhPWEub2Zmc2V0UGFyZW50O3JldHVybiBhfSl9fSksZi5lYWNoKFsiTGVmdCIsIlRvcCJdLGZ1bmN0aW9uKGEsYyl7dmFyIGQ9InNjcm9sbCIrYztmLmZuW2RdPWZ1bmN0aW9uKGMpe3ZhciBlLGc7aWYoYz09PWIpe2U9dGhpc1swXTtpZighZSlyZXR1cm4gbnVsbDtnPWN2KGUpO3JldHVybiBnPyJwYWdlWE9mZnNldCJpbiBnP2dbYT8icGFnZVlPZmZzZXQiOiJwYWdlWE9mZnNldCJdOmYuc3VwcG9ydC5ib3hNb2RlbCYmZy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbZF18fGcuZG9jdW1lbnQuYm9keVtkXTplW2RdfXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtnPWN2KHRoaXMpLGc/Zy5zY3JvbGxUbyhhP2YoZykuc2Nyb2xsTGVmdCgpOmMsYT9jOmYoZykuc2Nyb2xsVG9wKCkpOnRoaXNbZF09Y30pfX0pLGYuZWFjaChbIkhlaWdodCIsIldpZHRoIl0sZnVuY3Rpb24oYSxjKXt2YXIgZD1jLnRvTG93ZXJDYXNlKCk7Zi5mblsiaW5uZXIiK2NdPWZ1bmN0aW9uKCl7dmFyIGE9dGhpc1swXTtyZXR1cm4gYSYmYS5zdHlsZT9wYXJzZUZsb2F0KGYuY3NzKGEsZCwicGFkZGluZyIpKTpudWxsfSxmLmZuWyJvdXRlciIrY109ZnVuY3Rpb24oYSl7dmFyIGI9dGhpc1swXTtyZXR1cm4gYiYmYi5zdHlsZT9wYXJzZUZsb2F0KGYuY3NzKGIsZCxhPyJtYXJnaW4iOiJib3JkZXIiKSk6bnVsbH0sZi5mbltkXT1mdW5jdGlvbihhKXt2YXIgZT10aGlzWzBdO2lmKCFlKXJldHVybiBhPT1udWxsP251bGw6dGhpcztpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXt2YXIgYz1mKHRoaXMpO2NbZF0oYS5jYWxsKHRoaXMsYixjW2RdKCkpKX0pO2lmKGYuaXNXaW5kb3coZSkpe3ZhciBnPWUuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiK2NdO3JldHVybiBlLmRvY3VtZW50LmNvbXBhdE1vZGU9PT0iQ1NTMUNvbXBhdCImJmd8fGUuZG9jdW1lbnQuYm9keVsiY2xpZW50IitjXXx8Z31pZihlLm5vZGVUeXBlPT09OSlyZXR1cm4gTWF0aC5tYXgoZS5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrY10sZS5ib2R5WyJzY3JvbGwiK2NdLGUuZG9jdW1lbnRFbGVtZW50WyJzY3JvbGwiK2NdLGUuYm9keVsib2Zmc2V0IitjXSxlLmRvY3VtZW50RWxlbWVudFsib2Zmc2V0IitjXSk7aWYoYT09PWIpe3ZhciBoPWYuY3NzKGUsZCksaT1wYXJzZUZsb2F0KGgpO3JldHVybiBmLmlzTmFOKGkpP2g6aX1yZXR1cm4gdGhpcy5jc3MoZCx0eXBlb2YgYT09InN0cmluZyI/YTphKyJweCIpfX0pLGEualF1ZXJ5PWEuJD1mfSkod2luZG93KTs=]]></data>
	</file>
	<file>
	  <filename>/script/plugins/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/script/plugins/galleria/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/script/plugins/galleria/galleria-1.2.6.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIEBwcmVzZXJ2ZSBHYWxsZXJpYSB2IDEuMi42IDIwMTEtMTItMTIKICogaHR0cDovL2dhbGxlcmlhLmFpbm8uc2UKICoKICogQ29weXJpZ2h0IChjKSAyMDExLCBBaW5vCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4KICovCgovKmdsb2JhbCBqUXVlcnksIG5hdmlnYXRvciwgR2FsbGVyaWE6dHJ1ZSwgSW1hZ2UgKi8KCihmdW5jdGlvbiggJCApIHsKCi8vIHNvbWUgcmVmZXJlbmNlcwp2YXIgdW5kZWYsCgl3aW5kb3cgPSB0aGlzLAoJZG9jICAgID0gd2luZG93LmRvY3VtZW50LAoJJGRvYyAgID0gJCggZG9jICksCgkkd2luICAgPSAkKCB3aW5kb3cgKSwKCi8vIGludGVybmFsIGNvbnN0YW50cwoJVkVSU0lPTiA9IDEuMjYsCglERUJVRyA9IHRydWUsCglUSU1FT1VUID0gMzAwMDAsCglEVU1NWSA9IGZhbHNlLAoJTkFWID0gbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLAoJSEFTSCA9IHdpbmRvdy5sb2NhdGlvbi5oYXNoLnJlcGxhY2UoLyNcLy8sICcnKSwKCUlFID0gKGZ1bmN0aW9uKCkgewoKCQl2YXIgdiA9IDMsCgkJCWRpdiA9IGRvYy5jcmVhdGVFbGVtZW50KCAnZGl2JyApLAoJCQlhbGwgPSBkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoICdpJyApOwoKCQlkbyB7CgkJCWRpdi5pbm5lckhUTUwgPSAnPCEtLVtpZiBndCBJRSAnICsgKCsrdikgKyAnXT48aT48L2k+PCFbZW5kaWZdLS0+JzsKCQl9IHdoaWxlICggYWxsWzBdICk7CgoJCXJldHVybiB2ID4gNCA/IHYgOiB1bmRlZjsKCgl9KCkgKSwKCURPTSA9IGZ1bmN0aW9uKCkgewoJCXJldHVybiB7CgkJCWh0bWw6ICBkb2MuZG9jdW1lbnRFbGVtZW50LAoJCQlib2R5OiAgZG9jLmJvZHksCgkJCWhlYWQ6ICBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXSwKCQkJdGl0bGU6IGRvYy50aXRsZQoJCX07Cgl9LAoKCS8vIGxpc3Qgb2YgR2FsbGVyaWEgZXZlbnRzCglfZXZlbnRsaXN0ID0gJ2RhdGEgcmVhZHkgdGh1bWJuYWlsIGxvYWRzdGFydCBsb2FkZmluaXNoIGltYWdlIHBsYXkgcGF1c2UgcHJvZ3Jlc3MgJyArCgkJCSAgJ2Z1bGxzY3JlZW5fZW50ZXIgZnVsbHNjcmVlbl9leGl0IGlkbGVfZW50ZXIgaWRsZV9leGl0IHJlc2NhbGUgJyArCgkJCSAgJ2xpZ2h0Ym94X29wZW4gbGlnaHRib3hfY2xvc2UgbGlnaHRib3hfaW1hZ2UnLAoKCV9ldmVudHMgPSAoZnVuY3Rpb24oKSB7CgoJCXZhciBldnMgPSBbXTsKCgkJJC5lYWNoKCBfZXZlbnRsaXN0LnNwbGl0KCcgJyksIGZ1bmN0aW9uKCBpLCBldiApIHsKCQkJZXZzLnB1c2goIGV2ICk7CgoJCQkvLyBsZWdhY3kgZXZlbnRzCgkJCWlmICggL18vLnRlc3QoIGV2ICkgKSB7CgkJCQlldnMucHVzaCggZXYucmVwbGFjZSggL18vZywgJycgKSApOwoJCQl9CgkJfSk7CgoJCXJldHVybiBldnM7CgoJfSgpKSwKCgkvLyBsZWdhY3kgb3B0aW9ucwoJLy8gYWxsb3dzIHRoZSBvbGQgbXlfc2V0dGluZyBzeW50YXggYW5kIGNvbnZlcnRzIGl0IHRvIGNhbWVsIGNhc2UKCglfbGVnYWN5T3B0aW9ucyA9IGZ1bmN0aW9uKCBvcHRpb25zICkgewoKCQl2YXIgbjsKCgkJaWYgKCB0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcgKSB7CgoJCQkvLyByZXR1cm4gd2hhdGV2ZXIgaXQgd2FzLi4uCgkJCXJldHVybiBvcHRpb25zOwoJCX0KCgkJJC5lYWNoKCBvcHRpb25zLCBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQkJaWYgKCAvXlthLXpdK18vLnRlc3QoIGtleSApICkgewoJCQkJbiA9ICcnOwoJCQkJJC5lYWNoKCBrZXkuc3BsaXQoJ18nKSwgZnVuY3Rpb24oIGksIGsgKSB7CgkJCQkJbiArPSBpID4gMCA/IGsuc3Vic3RyKCAwLCAxICkudG9VcHBlckNhc2UoKSArIGsuc3Vic3RyKCAxICkgOiBrOwoJCQkJfSk7CgkJCQlvcHRpb25zWyBuIF0gPSB2YWx1ZTsKCQkJCWRlbGV0ZSBvcHRpb25zWyBrZXkgXTsKCQkJfQoJCX0pOwoKCQlyZXR1cm4gb3B0aW9uczsKCX0sCgoJX3BhdGNoRXZlbnQgPSBmdW5jdGlvbiggdHlwZSApIHsKCgkJLy8gYWxsb3cgJ2ltYWdlJyBpbnN0ZWFkIG9mIEdhbGxlcmlhLklNQUdFCgkJaWYgKCAkLmluQXJyYXkoIHR5cGUsIF9ldmVudHMgKSA+IC0xICkgewoJCQlyZXR1cm4gR2FsbGVyaWFbIHR5cGUudG9VcHBlckNhc2UoKSBdOwoJCX0KCgkJcmV0dXJuIHR5cGU7Cgl9LAoKCS8vIHRoZSBpbnRlcm5hbCB0aW1lb3V0cyBvYmplY3QKCS8vIHByb3ZpZGVzIGhlbHBlciBtZXRob2RzIGZvciBjb250cm9sbGluZyB0aW1lb3V0cwoJX3RpbWVvdXRzID0gewoKCQl0cnVuazoge30sCgoJCWFkZDogZnVuY3Rpb24oIGlkLCBmbiwgZGVsYXksIGxvb3AgKSB7CgkJCWxvb3AgPSBsb29wIHx8IGZhbHNlOwoJCQl0aGlzLmNsZWFyKCBpZCApOwoJCQlpZiAoIGxvb3AgKSB7CgkJCQl2YXIgb2xkID0gZm47CgkJCQlmbiA9IGZ1bmN0aW9uKCkgewoJCQkJCW9sZCgpOwoJCQkJCV90aW1lb3V0cy5hZGQoIGlkLCBmbiwgZGVsYXkgKTsKCQkJCX07CgkJCX0KCQkJdGhpcy50cnVua1sgaWQgXSA9IHdpbmRvdy5zZXRUaW1lb3V0KCBmbiwgZGVsYXkgKTsKCQl9LAoKCQljbGVhcjogZnVuY3Rpb24oIGlkICkgewoKCQkJdmFyIGRlbCA9IGZ1bmN0aW9uKCBpICkgewoJCQkJd2luZG93LmNsZWFyVGltZW91dCggdGhpcy50cnVua1sgaSBdICk7CgkJCQlkZWxldGUgdGhpcy50cnVua1sgaSBdOwoJCQl9LCBpOwoKCQkJaWYgKCAhIWlkICYmIGlkIGluIHRoaXMudHJ1bmsgKSB7CgkJCQlkZWwuY2FsbCggX3RpbWVvdXRzLCBpZCApOwoKCQkJfSBlbHNlIGlmICggdHlwZW9mIGlkID09PSAndW5kZWZpbmVkJyApIHsKCQkJCWZvciAoIGkgaW4gdGhpcy50cnVuayApIHsKCQkJCQlpZiAoIHRoaXMudHJ1bmsuaGFzT3duUHJvcGVydHkoIGkgKSApIHsKCQkJCQkJZGVsLmNhbGwoIF90aW1lb3V0cywgaSApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCX0sCgoJLy8gdGhlIGludGVybmFsIGdhbGxlcnkgaG9sZGVyCglfZ2FsbGVyaWVzID0gW10sCgoJLy8gdGhlIGludGVybmFsIGluc3RhbmNlIGhvbGRlcgoJX2luc3RhbmNlcyA9IFtdLAoKCS8vIGZsYWcgZm9yIGVycm9ycwoJX2hhc0Vycm9yID0gZmFsc2UsCgoJLy8gY2FudmFzIGhvbGRlcgoJX2NhbnZhcyA9IGZhbHNlLAoKCS8vIGluc3RhbmNlIHBvb2wsIGhvbGRzIHRoZSBnYWxsZXJpZXMgdW50aWwgdGhlbWVMb2FkIGlzIHRyaWdnZXJlZAoJX3Bvb2wgPSBbXSwKCgkvLyB0aGVtZUxvYWQgdHJpZ2dlcgoJX3RoZW1lTG9hZCA9IGZ1bmN0aW9uKCB0aGVtZSApIHsKCQlHYWxsZXJpYS50aGVtZSA9IHRoZW1lOwoKCQkvLyBydW4gdGhlIGluc3RhbmNlcyB3ZSBoYXZlIGluIHRoZSBwb29sCgkJJC5lYWNoKCBfcG9vbCwgZnVuY3Rpb24oIGksIGluc3RhbmNlICkgewoJCQlpZiAoICFpbnN0YW5jZS5faW5pdGlhbGl6ZWQgKSB7CgkJCQlpbnN0YW5jZS5faW5pdC5jYWxsKCBpbnN0YW5jZSApOwoJCQl9CgkJfSk7Cgl9LAoKCS8vIHRoZSBVdGlscyBzaW5nbGV0b24KCVV0aWxzID0gKGZ1bmN0aW9uKCkgewoKCQlyZXR1cm4gewoKCQkJYXJyYXkgOiBmdW5jdGlvbiggb2JqICkgewoJCQkJcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG9iaiwgMCk7CgkJCX0sCgoJCQljcmVhdGUgOiBmdW5jdGlvbiggY2xhc3NOYW1lLCBub2RlTmFtZSApIHsKCQkJCW5vZGVOYW1lID0gbm9kZU5hbWUgfHwgJ2Rpdic7CgkJCQl2YXIgZWxlbSA9IGRvYy5jcmVhdGVFbGVtZW50KCBub2RlTmFtZSApOwoJCQkJZWxlbS5jbGFzc05hbWUgPSBjbGFzc05hbWU7CgkJCQlyZXR1cm4gZWxlbTsKCQkJfSwKCgkJCWdldFNjcmlwdFBhdGggOiBmdW5jdGlvbiggc3JjICkgewoKCQkJCS8vIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIHNjcmlwdCBpcyBhbHdheXMgdGhlIGxhc3QKCQkJCXNyYyA9IHNyYyB8fCAkKCdzY3JpcHQ6bGFzdCcpLmF0dHIoJ3NyYycpOwoJCQkJdmFyIHNsaWNlcyA9IHNyYy5zcGxpdCgnLycpOwoKCQkJCWlmIChzbGljZXMubGVuZ3RoID09IDEpIHsKCQkJCQlyZXR1cm4gJyc7CgkJCQl9CgoJCQkJc2xpY2VzLnBvcCgpOwoKCQkJCXJldHVybiBzbGljZXMuam9pbignLycpICsgJy8nOwoJCQl9LAoKCQkJLy8gQ1NTMyB0cmFuc2l0aW9ucywgYWRkZWQgaW4gMS4yLjQKCQkJYW5pbWF0ZSA6IChmdW5jdGlvbigpIHsKCgkJCQkvLyBkZXRlY3QgdHJhbnNpdGlvbgoJCQkJdmFyIHRyYW5zaXRpb24gPSAoZnVuY3Rpb24oIHN0eWxlICkgewoJCQkJCXZhciBwcm9wcyA9ICd0cmFuc2l0aW9uIFdlYmtpdFRyYW5zaXRpb24gTW96VHJhbnNpdGlvbiBPVHJhbnNpdGlvbicuc3BsaXQoJyAnKSwKCQkJCQkJaTsKCgkJCQkJLy8gZGlzYWJsZSBjc3MzIGFuaW1hdGlvbnMgaW4gb3BlcmEgdW50aWwgc3RhYmxlCgkJCQkJaWYgKCB3aW5kb3cub3BlcmEgKSB7CgkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQl9CgoJCQkJCWZvciAoIGkgPSAwOyBwcm9wc1tpXTsgaSsrICkgewoJCQkJCQlpZiAoIHR5cGVvZiBzdHlsZVsgcHJvcHNbIGkgXSBdICE9PSAndW5kZWZpbmVkJyApIHsKCQkJCQkJCXJldHVybiBwcm9wc1sgaSBdOwoJCQkJCQl9CgkJCQkJfQoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0oKCBkb2MuYm9keSB8fCBkb2MuZG9jdW1lbnRFbGVtZW50KS5zdHlsZSApKTsKCgkJCQkvLyBtYXAgdHJhbnNpdGlvbmVuZCBldmVudAoJCQkJdmFyIGVuZEV2ZW50ID0gewoJCQkJCU1velRyYW5zaXRpb246ICd0cmFuc2l0aW9uZW5kJywKCQkJCQlPVHJhbnNpdGlvbjogJ29UcmFuc2l0aW9uRW5kJywKCQkJCQlXZWJraXRUcmFuc2l0aW9uOiAnd2Via2l0VHJhbnNpdGlvbkVuZCcsCgkJCQkJdHJhbnNpdGlvbjogJ3RyYW5zaXRpb25lbmQnCgkJCQl9WyB0cmFuc2l0aW9uIF07CgoJCQkJLy8gbWFwIGJlemllciBlYXNpbmcgY29udmVyc2lvbnMKCQkJCXZhciBlYXNpbmdzID0gewoJCQkJCV9kZWZhdWx0OiBbMC4yNSwgMC4xLCAwLjI1LCAxXSwKCQkJCQlnYWxsZXJpYTogWzAuNjQ1LCAwLjA0NSwgMC4zNTUsIDFdLAoJCQkJCWdhbGxlcmlhSW46IFswLjU1LCAwLjA4NSwgMC42OCwgMC41M10sCgkJCQkJZ2FsbGVyaWFPdXQ6IFswLjI1LCAwLjQ2LCAwLjQ1LCAwLjk0XSwKCQkJCQllYXNlOiBbMC4yNSwgMCwgMC4yNSwgMV0sCgkJCQkJbGluZWFyOiBbMC4yNSwgMC4yNSwgMC43NSwgMC43NV0sCgkJCQkJJ2Vhc2UtaW4nOiBbMC40MiwgMCwgMSwgMV0sCgkJCQkJJ2Vhc2Utb3V0JzogWzAsIDAsIDAuNTgsIDFdLAoJCQkJCSdlYXNlLWluLW91dCc6IFswLjQyLCAwLCAwLjU4LCAxXQoJCQkJfTsKCgkJCQkvLyBmdW5jdGlvbiBmb3Igc2V0dGluZyB0cmFuc2l0aW9uIGNzcyBmb3IgYWxsIGJyb3dzZXJzCgkJCQl2YXIgc2V0U3R5bGUgPSBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIHN1ZmZpeCApIHsKCQkJCQl2YXIgY3NzID0ge307CgkJCQkJc3VmZml4ID0gc3VmZml4IHx8ICd0cmFuc2l0aW9uJzsKCQkJCQkkLmVhY2goICd3ZWJraXQgbW96IG1zIG8nLnNwbGl0KCcgJyksIGZ1bmN0aW9uKCkgewoJCQkJCQljc3NbICctJyArIHRoaXMgKyAnLScgKyBzdWZmaXggXSA9IHZhbHVlOwoJCQkJCX0pOwoJCQkJCWVsZW0uY3NzKCBjc3MgKTsKCQkJCX07CgoJCQkJLy8gY2xlYXIgc3R5bGVzCgkJCQl2YXIgY2xlYXJTdHlsZSA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJCXNldFN0eWxlKCBlbGVtLCAnbm9uZScsICd0cmFuc2l0aW9uJyApOwoJCQkJCWlmICggR2FsbGVyaWEuV0VCS0lUICYmIEdhbGxlcmlhLlRPVUNIICkgewoJCQkJCQlzZXRTdHlsZSggZWxlbSwgJ3RyYW5zbGF0ZTNkKDAsMCwwKScsICd0cmFuc2Zvcm0nICk7CgkJCQkJCWlmICggZWxlbS5kYXRhKCdyZXZlcnQnKSApIHsKCQkJCQkJCWVsZW0uY3NzKCBlbGVtLmRhdGEoJ3JldmVydCcpICk7CgkJCQkJCQllbGVtLmRhdGEoJ3JldmVydCcsIG51bGwpOwoJCQkJCQl9CgkJCQkJfQoJCQkJfTsKCgkJCQkvLyB2YXJpb3VzIHZhcmlhYmxlcwoJCQkJdmFyIGNoYW5nZSwgc3RyaW5ncywgZWFzaW5nLCBzeW50YXgsIHJldmVydCwgZm9ybSwgY3NzOwoKCQkJCS8vIHRoZSBhY3R1YWwgYW5pbWF0aW9uIG1ldGhvZAoJCQkJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtLCB0bywgb3B0aW9ucyApIHsKCgkJCQkJLy8gZXh0ZW5kIGRlZmF1bHRzCgkJCQkJb3B0aW9ucyA9ICQuZXh0ZW5kKHsKCQkJCQkJZHVyYXRpb246IDQwMCwKCQkJCQkJY29tcGxldGU6IGZ1bmN0aW9uKCl7fSwKCQkJCQkJc3RvcDogZmFsc2UKCQkJCQl9LCBvcHRpb25zKTsKCgkJCQkJLy8gY2FjaGUgalF1ZXJ5IGluc3RhbmNlCgkJCQkJZWxlbSA9ICQoIGVsZW0gKTsKCgkJCQkJaWYgKCAhb3B0aW9ucy5kdXJhdGlvbiApIHsKCQkJCQkJZWxlbS5jc3MoIHRvICk7CgkJCQkJCW9wdGlvbnMuY29tcGxldGUuY2FsbCggZWxlbVswXSApOwoJCQkJCQlyZXR1cm47CgkJCQkJfQoKCQkJCQkvLyBmYWxsYmFjayB0byBqUXVlcnkncyBhbmltYXRlIGlmIHRyYW5zaXRpb24gaXMgbm90IHN1cHBvcnRlZAoJCQkJCWlmICggIXRyYW5zaXRpb24gKSB7CgkJCQkJCWVsZW0uYW5pbWF0ZSh0bywgb3B0aW9ucyk7CgkJCQkJCXJldHVybjsKCQkJCQl9CgoJCQkJCS8vIHN0b3AKCQkJCQlpZiAoIG9wdGlvbnMuc3RvcCApIHsKCQkJCQkJLy8gY2xlYXIgdGhlIGFuaW1hdGlvbgoJCQkJCQllbGVtLnVuYmluZCggZW5kRXZlbnQgKTsKCQkJCQkJY2xlYXJTdHlsZSggZWxlbSApOwoJCQkJCX0KCgkJCQkJLy8gc2VlIGlmIHRoZXJlIGlzIGEgY2hhbmdlCgkJCQkJY2hhbmdlID0gZmFsc2U7CgkJCQkJJC5lYWNoKCB0bywgZnVuY3Rpb24oIGtleSwgdmFsICkgewoJCQkJCQljc3MgPSBlbGVtLmNzcygga2V5ICk7CgkJCQkJCWlmICggVXRpbHMucGFyc2VWYWx1ZSggY3NzICkgIT0gVXRpbHMucGFyc2VWYWx1ZSggdmFsICkgKSB7CgkJCQkJCQljaGFuZ2UgPSB0cnVlOwoJCQkJCQl9CgkJCQkJCS8vIGFsc28gYWRkIGNvbXB1dGVkIHN0eWxlcyBmb3IgRkYKCQkJCQkJZWxlbS5jc3MoIGtleSwgY3NzICk7CgkJCQkJfSk7CgkJCQkJaWYgKCAhY2hhbmdlICkgewoJCQkJCQl3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7CgkJCQkJCQlvcHRpb25zLmNvbXBsZXRlLmNhbGwoIGVsZW1bMF0gKTsKCQkJCQkJfSwgb3B0aW9ucy5kdXJhdGlvbiApOwoJCQkJCQlyZXR1cm47CgkJCQkJfQoKCQkJCQkvLyB0aGUgY3NzIHN0cmluZ3MgdG8gYmUgYXBwbGllZAoJCQkJCXN0cmluZ3MgPSBbXTsKCgkJCQkJLy8gdGhlIGVhc2luZyBiZXppZXIKCQkJCQllYXNpbmcgPSBvcHRpb25zLmVhc2luZyBpbiBlYXNpbmdzID8gZWFzaW5nc1sgb3B0aW9ucy5lYXNpbmcgXSA6IGVhc2luZ3MuX2RlZmF1bHQ7CgoJCQkJCS8vIHRoZSBzeW50YXgKCQkJCQlzeW50YXggPSAnICcgKyBvcHRpb25zLmR1cmF0aW9uICsgJ21zJyArICcgY3ViaWMtYmV6aWVyKCcgICsgZWFzaW5nLmpvaW4oJywnKSArICcpJzsKCgkJCQkJLy8gYWRkIGEgdGlueSB0aW1lb3V0IHNvIHRoYXQgdGhlIGJyb3dzZXJzIGNhdGNoZXMgYW55IGNzcyBjaGFuZ2VzIGJlZm9yZSBhbmltYXRpbmcKCQkJCQl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHsKCgkJCQkJCS8vIGF0dGFjaCB0aGUgZW5kIGV2ZW50CgkJCQkJCWVsZW0ub25lKGVuZEV2ZW50LCAoZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQkJCQlyZXR1cm4gZnVuY3Rpb24oKSB7CgkJCQkJCQkJLy8gY2xlYXIgdGhlIGFuaW1hdGlvbgoJCQkJCQkJCWNsZWFyU3R5bGUoZWxlbSk7CgoJCQkJCQkJCS8vIHJ1biB0aGUgY29tcGxldGUgbWV0aG9kCgkJCQkJCQkJb3B0aW9ucy5jb21wbGV0ZS5jYWxsKGVsZW1bMF0pOwoJCQkJCQkJfTsKCQkJCQkJfSggZWxlbSApKSk7CgoJCQkJCQkvLyBkbyB0aGUgd2Via2l0IHRyYW5zbGF0ZTNkIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2Ugb24gaU9TCgkJCQkJCWlmKCBHYWxsZXJpYS5XRUJLSVQgJiYgR2FsbGVyaWEuVE9VQ0ggKSB7CgoJCQkJCQkJcmV2ZXJ0ID0ge307CgkJCQkJCQlmb3JtID0gWzAsMCwwXTsKCgkJCQkJCQkkLmVhY2goIFsnbGVmdCcsICd0b3AnXSwgZnVuY3Rpb24oaSwgbSkgewoJCQkJCQkJCWlmICggbSBpbiB0byApIHsKCQkJCQkJCQkJZm9ybVsgaSBdID0gKCBVdGlscy5wYXJzZVZhbHVlKCB0b1sgbSBdICkgLSBVdGlscy5wYXJzZVZhbHVlKGVsZW0uY3NzKCBtICkpICkgKyAncHgnOwoJCQkJCQkJCQlyZXZlcnRbIG0gXSA9IHRvWyBtIF07CgkJCQkJCQkJCWRlbGV0ZSB0b1sgbSBdOwoJCQkJCQkJCX0KCQkJCQkJCX0pOwoKCQkJCQkJCWlmICggZm9ybVswXSB8fCBmb3JtWzFdKSB7CgoJCQkJCQkJCWVsZW0uZGF0YSgncmV2ZXJ0JywgcmV2ZXJ0KTsKCgkJCQkJCQkJc3RyaW5ncy5wdXNoKCctd2Via2l0LXRyYW5zZm9ybScgKyBzeW50YXgpOwoKCQkJCQkJCQkvLyAzZCBhbmltYXRlCgkJCQkJCQkJc2V0U3R5bGUoIGVsZW0sICd0cmFuc2xhdGUzZCgnICsgZm9ybS5qb2luKCcsJykgKyAnKScsICd0cmFuc2Zvcm0nKTsKCQkJCQkJCX0KCQkJCQkJfQoKCQkJCQkJLy8gcHVzaCB0aGUgYW5pbWF0aW9uIHByb3BzCgkJCQkJCSQuZWFjaCh0bywgZnVuY3Rpb24oIHAsIHZhbCApIHsKCQkJCQkJCXN0cmluZ3MucHVzaChwICsgc3ludGF4KTsKCQkJCQkJfSk7CgoJCQkJCQkvLyBzZXQgdGhlIGFuaW1hdGlvbiBzdHlsZXMKCQkJCQkJc2V0U3R5bGUoIGVsZW0sIHN0cmluZ3Muam9pbignLCcpICk7CgoJCQkJCQkvLyBhbmltYXRlCgkJCQkJCWVsZW0uY3NzKCB0byApOwoKCQkJCQl9LDEgKTsKCQkJCX07CgkJCX0oKSksCgoJCQlyZW1vdmVBbHBoYSA6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJaWYgKCBJRSA8IDkgJiYgZWxlbSApIHsKCgkJCQkJdmFyIHN0eWxlID0gZWxlbS5zdHlsZSwKCQkJCQkJY3VycmVudFN0eWxlID0gZWxlbS5jdXJyZW50U3R5bGUsCgkJCQkJCWZpbHRlciA9IGN1cnJlbnRTdHlsZSAmJiBjdXJyZW50U3R5bGUuZmlsdGVyIHx8IHN0eWxlLmZpbHRlciB8fCAiIjsKCgkJCQkJaWYgKCAvYWxwaGEvLnRlc3QoIGZpbHRlciApICkgewoJCQkJCQlzdHlsZS5maWx0ZXIgPSBmaWx0ZXIucmVwbGFjZSggL2FscGhhXChbXildKlwpL2ksICcnICk7CgkJCQkJfQoJCQkJfQoJCQl9LAoKCQkJZm9yY2VTdHlsZXMgOiBmdW5jdGlvbiggZWxlbSwgc3R5bGVzICkgewoJCQkJZWxlbSA9ICQoZWxlbSk7CgkJCQlpZiAoIGVsZW0uYXR0ciggJ3N0eWxlJyApICkgewoJCQkJCWVsZW0uZGF0YSggJ3N0eWxlcycsIGVsZW0uYXR0ciggJ3N0eWxlJyApICkucmVtb3ZlQXR0ciggJ3N0eWxlJyApOwoJCQkJfQoJCQkJZWxlbS5jc3MoIHN0eWxlcyApOwoJCQl9LAoKCQkJcmV2ZXJ0U3R5bGVzIDogZnVuY3Rpb24oKSB7CgkJCQkkLmVhY2goIFV0aWxzLmFycmF5KCBhcmd1bWVudHMgKSwgZnVuY3Rpb24oIGksIGVsZW0gKSB7CgoJCQkJCWVsZW0gPSAkKCBlbGVtICk7CgkJCQkJZWxlbS5yZW1vdmVBdHRyKCAnc3R5bGUnICk7CgoJCQkJCWVsZW0uYXR0cignc3R5bGUnLCcnKTsgLy8gImZpeGVzIiB3ZWJraXQgYnVnCgoJCQkJCWlmICggZWxlbS5kYXRhKCAnc3R5bGVzJyApICkgewoJCQkJCQllbGVtLmF0dHIoICdzdHlsZScsIGVsZW0uZGF0YSgnc3R5bGVzJykgKS5kYXRhKCAnc3R5bGVzJywgbnVsbCApOwoJCQkJCX0KCQkJCX0pOwoJCQl9LAoKCQkJbW92ZU91dCA6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJVXRpbHMuZm9yY2VTdHlsZXMoIGVsZW0sIHsKCQkJCQlwb3NpdGlvbjogJ2Fic29sdXRlJywKCQkJCQlsZWZ0OiAtMTAwMDAKCQkJCX0pOwoJCQl9LAoKCQkJbW92ZUluIDogZnVuY3Rpb24oKSB7CgkJCQlVdGlscy5yZXZlcnRTdHlsZXMuYXBwbHkoIFV0aWxzLCBVdGlscy5hcnJheSggYXJndW1lbnRzICkgKTsKCQkJfSwKCgkJCWVsZW0gOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJCWlmIChlbGVtIGluc3RhbmNlb2YgJCkgewoJCQkJCXJldHVybiB7CgkJCQkJCSQ6IGVsZW0sCgkJCQkJCWRvbTogZWxlbVswXQoJCQkJCX07CgkJCQl9IGVsc2UgewoJCQkJCXJldHVybiB7CgkJCQkJCSQ6ICQoZWxlbSksCgkJCQkJCWRvbTogZWxlbQoJCQkJCX07CgkJCQl9CgkJCX0sCgoJCQloaWRlIDogZnVuY3Rpb24oIGVsZW0sIHNwZWVkLCBjYWxsYmFjayApIHsKCgkJCQljYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCl7fTsKCgkJCQl2YXIgZWwgPSBVdGlscy5lbGVtKCBlbGVtICksCgkJCQkJJGVsZW0gPSBlbC4kOwoKCQkJCWVsZW0gPSBlbC5kb207CgoJCQkJLy8gc2F2ZSB0aGUgdmFsdWUgaWYgbm90IGV4aXN0CgkJCQlpZiAoISAkZWxlbS5kYXRhKCdvcGFjaXR5JykgKSB7CgkJCQkJJGVsZW0uZGF0YSgnb3BhY2l0eScsICRlbGVtLmNzcygnb3BhY2l0eScpICk7CgkJCQl9CgoJCQkJLy8gYWx3YXlzIGhpZGUKCQkJCXZhciBzdHlsZSA9IHsgb3BhY2l0eTogMCB9OwoKCQkJCWlmIChzcGVlZCkgewoKCQkJCQl2YXIgY29tcGxldGUgPSBJRSA8IDkgJiYgZWxlbSA/IGZ1bmN0aW9uKCkgewoJCQkJCQlVdGlscy5yZW1vdmVBbHBoYSggZWxlbSApOwoJCQkJCQllbGVtLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJzsKCQkJCQkJY2FsbGJhY2suY2FsbCggZWxlbSApOwoJCQkJCX0gOiBjYWxsYmFjazsKCgkJCQkJVXRpbHMuYW5pbWF0ZSggZWxlbSwgc3R5bGUsIHsKCQkJCQkJZHVyYXRpb246IHNwZWVkLAoJCQkJCQljb21wbGV0ZTogY29tcGxldGUsCgkJCQkJCXN0b3A6IHRydWUKCQkJCQl9KTsKCQkJCX0gZWxzZSB7CgkJCQkJaWYgKCBJRSA8IDkgJiYgZWxlbSApIHsKCQkJCQkJVXRpbHMucmVtb3ZlQWxwaGEoIGVsZW0gKTsKCQkJCQkJZWxlbS5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJGVsZW0uY3NzKCBzdHlsZSApOwoJCQkJCX0KCQkJCX0KCQkJfSwKCgkJCXNob3cgOiBmdW5jdGlvbiggZWxlbSwgc3BlZWQsIGNhbGxiYWNrICkgewoKCQkJCWNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKXt9OwoKCQkJCXZhciBlbCA9IFV0aWxzLmVsZW0oIGVsZW0gKSwKCQkJCQkkZWxlbSA9IGVsLiQ7CgoJCQkJZWxlbSA9IGVsLmRvbTsKCgkJCQkvLyBicmluZyBiYWNrIHNhdmVkIG9wYWNpdHkKCQkJCXZhciBzYXZlZCA9IHBhcnNlRmxvYXQoICRlbGVtLmRhdGEoJ29wYWNpdHknKSApIHx8IDEsCgkJCQkJc3R5bGUgPSB7IG9wYWNpdHk6IHNhdmVkIH07CgoJCQkJLy8gYW5pbWF0ZSBvciB0b2dnbGUKCQkJCWlmIChzcGVlZCkgewoKCQkJCQlpZiAoIElFIDwgOSApIHsKCQkJCQkJJGVsZW0uY3NzKCdvcGFjaXR5JywgMCk7CgkJCQkJCWVsZW0uc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJzsKCQkJCQl9CgoJCQkJCXZhciBjb21wbGV0ZSA9IElFIDwgOSAmJiBlbGVtID8gZnVuY3Rpb24oKSB7CgkJCQkJCWlmICggc3R5bGUub3BhY2l0eSA9PSAxICkgewoJCQkJCQkJVXRpbHMucmVtb3ZlQWxwaGEoIGVsZW0gKTsKCQkJCQkJfQoJCQkJCQljYWxsYmFjay5jYWxsKCBlbGVtICk7CgkJCQkJfSA6IGNhbGxiYWNrOwoKCQkJCQlVdGlscy5hbmltYXRlKCBlbGVtLCBzdHlsZSwgewoJCQkJCQlkdXJhdGlvbjogc3BlZWQsCgkJCQkJCWNvbXBsZXRlOiBjb21wbGV0ZSwKCQkJCQkJc3RvcDogdHJ1ZQoJCQkJCX0pOwoJCQkJfSBlbHNlIHsKCQkJCQlpZiAoIElFIDwgOSAmJiBzdHlsZS5vcGFjaXR5ID09IDEgJiYgZWxlbSApIHsKCQkJCQkJVXRpbHMucmVtb3ZlQWxwaGEoIGVsZW0gKTsKCQkJCQkJZWxlbS5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSRlbGVtLmNzcyggc3R5bGUgKTsKCQkJCQl9CgkJCQl9CgkJCX0sCgoKCQkJLy8gZW5oYW5jZWQgY2xpY2sgZm9yIG1vYmlsZSBkZXZpY2VzCgkJCS8vIHdlIGJpbmQgYSB0b3VjaGVuZCBhbmQgaGlqYWNrIGFueSBjbGljayBldmVudCBpbiB0aGUgYnViYmxlCgkJCS8vIHRoZW4gd2UgZXhlY3V0ZSB0aGUgY2xpY2sgZGlyZWN0bHkgYW5kIHNhdmUgaXQgaW4gYSBzZXBhcmF0ZSBkYXRhIG9iamVjdCBmb3IgbGF0ZXIKCQkJb3B0aW1pemVUb3VjaDogKGZ1bmN0aW9uKCkgewoKCQkJCXZhciBub2RlLAoJCQkJCWV2cywKCQkJCQlmYWtlcywKCQkJCQl0cmF2ZWwsCgkJCQkJZXZ0ID0ge30sCgkJCQkJaGFuZGxlciA9IGZ1bmN0aW9uKCBlICkgewoJCQkJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCQkJCWV2dCA9ICQuZXh0ZW5kKHt9LCBlLCB0cnVlKTsKCQkJCQl9LAoJCQkJCWF0dGFjaCA9IGZ1bmN0aW9uKCkgewoJCQkJCQl0aGlzLmV2dCA9IGV2dDsKCQkJCQl9LAoJCQkJCWZha2UgPSBmdW5jdGlvbigpIHsKCQkJCQkJdGhpcy5oYW5kbGVyLmNhbGwobm9kZSwgdGhpcy5ldnQpOwoJCQkJCX07CgoJCQkJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewoKCQkJCQkkKGVsZW0pLmJpbmQoJ3RvdWNoZW5kJywgZnVuY3Rpb24oIGUgKSB7CgoJCQkJCQlub2RlID0gZS50YXJnZXQ7CgkJCQkJCXRyYXZlbCA9IHRydWU7CgoJCQkJCQl3aGlsZSggbm9kZS5wYXJlbnROb2RlICYmIG5vZGUgIT0gZS5jdXJyZW50VGFyZ2V0ICYmIHRyYXZlbCApIHsKCgkJCQkJCQlldnMgPSAgICQobm9kZSkuZGF0YSgnZXZlbnRzJyk7CgkJCQkJCQlmYWtlcyA9ICQobm9kZSkuZGF0YSgnZmFrZXMnKTsKCgkJCQkJCQlpZiAoZXZzICYmICdjbGljaycgaW4gZXZzKSB7CgoJCQkJCQkJCXRyYXZlbCA9IGZhbHNlOwoJCQkJCQkJCWUucHJldmVudERlZmF1bHQoKTsKCgkJCQkJCQkJLy8gZmFrZSB0aGUgY2xpY2sgYW5kIHNhdmUgdGhlIGV2ZW50IG9iamVjdAoJCQkJCQkJCSQobm9kZSkuY2xpY2soaGFuZGxlcikuY2xpY2soKTsKCgkJCQkJCQkJLy8gcmVtb3ZlIHRoZSBmYWtlZCBjbGljawoJCQkJCQkJCWV2cy5jbGljay5wb3AoKTsKCgkJCQkJCQkJLy8gYXR0YWNoIHRoZSBmYWtlZCBldmVudAoJCQkJCQkJCSQuZWFjaCggZXZzLmNsaWNrLCBhdHRhY2gpOwoKCQkJCQkJCQkvLyBzYXZlIHRoZSBmYWtlZCBjbGlja3MgaW4gYSBuZXcgZGF0YSBvYmplY3QKCQkJCQkJCQkkKG5vZGUpLmRhdGEoJ2Zha2VzJywgZXZzLmNsaWNrKTsKCgkJCQkJCQkJLy8gcmVtb3ZlIGFsbCBjbGlja3MKCQkJCQkJCQlkZWxldGUgZXZzLmNsaWNrOwoKCQkJCQkJCX0gZWxzZSBpZiAoIGZha2VzICkgewoKCQkJCQkJCQl0cmF2ZWwgPSBmYWxzZTsKCQkJCQkJCQllLnByZXZlbnREZWZhdWx0KCk7CgoJCQkJCQkJCS8vIGZha2UgYWxsIGNsaWNrcwoJCQkJCQkJCSQuZWFjaCggZmFrZXMsIGZha2UgKTsKCQkJCQkJCX0KCgkJCQkJCQkvLyBidWJibGUKCQkJCQkJCW5vZGUgPSBub2RlLnBhcmVudE5vZGU7CgkJCQkJCX0KCQkJCQl9KTsKCQkJCX07CgkJCX0oKSksCgoJCQlhZGRUaW1lciA6IGZ1bmN0aW9uKCkgewoJCQkJX3RpbWVvdXRzLmFkZC5hcHBseSggX3RpbWVvdXRzLCBVdGlscy5hcnJheSggYXJndW1lbnRzICkgKTsKCQkJCXJldHVybiB0aGlzOwoJCQl9LAoKCQkJY2xlYXJUaW1lciA6IGZ1bmN0aW9uKCkgewoJCQkJX3RpbWVvdXRzLmNsZWFyLmFwcGx5KCBfdGltZW91dHMsIFV0aWxzLmFycmF5KCBhcmd1bWVudHMgKSApOwoJCQkJcmV0dXJuIHRoaXM7CgkJCX0sCgoJCQl3YWl0IDogZnVuY3Rpb24ob3B0aW9ucykgewoJCQkJb3B0aW9ucyA9ICQuZXh0ZW5kKHsKCQkJCQl1bnRpbCA6IGZ1bmN0aW9uKCkgeyByZXR1cm4gZmFsc2U7IH0sCgkJCQkJc3VjY2VzcyA6IGZ1bmN0aW9uKCkge30sCgkJCQkJZXJyb3IgOiBmdW5jdGlvbigpIHsgR2FsbGVyaWEucmFpc2UoJ0NvdWxkIG5vdCBjb21wbGV0ZSB3YWl0IGZ1bmN0aW9uLicpOyB9LAoJCQkJCXRpbWVvdXQ6IDMwMDAKCQkJCX0sIG9wdGlvbnMpOwoKCQkJCXZhciBzdGFydCA9IFV0aWxzLnRpbWVzdGFtcCgpLAoJCQkJCWVsYXBzZWQsCgkJCQkJbm93LAoJCQkJCWZuID0gZnVuY3Rpb24oKSB7CgkJCQkJCW5vdyA9IFV0aWxzLnRpbWVzdGFtcCgpOwoJCQkJCQllbGFwc2VkID0gbm93IC0gc3RhcnQ7CgkJCQkJCWlmICggb3B0aW9ucy51bnRpbCggZWxhcHNlZCApICkgewoJCQkJCQkJb3B0aW9ucy5zdWNjZXNzKCk7CgkJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJCX0KCgkJCQkJCWlmIChub3cgPj0gc3RhcnQgKyBvcHRpb25zLnRpbWVvdXQpIHsKCQkJCQkJCW9wdGlvbnMuZXJyb3IoKTsKCQkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQkJfQoJCQkJCQl3aW5kb3cuc2V0VGltZW91dChmbiwgMTApOwoJCQkJCX07CgoJCQkJd2luZG93LnNldFRpbWVvdXQoZm4sIDEwKTsKCQkJfSwKCgkJCXRvZ2dsZVF1YWxpdHkgOiBmdW5jdGlvbiggaW1nLCBmb3JjZSApIHsKCgkJCQlpZiAoICggSUUgIT09IDcgJiYgSUUgIT09IDggKSB8fCAhaW1nICkgewoJCQkJCXJldHVybjsKCQkJCX0KCgkJCQlpZiAoIHR5cGVvZiBmb3JjZSA9PT0gJ3VuZGVmaW5lZCcgKSB7CgkJCQkJZm9yY2UgPSBpbWcuc3R5bGUubXNJbnRlcnBvbGF0aW9uTW9kZSA9PT0gJ25lYXJlc3QtbmVpZ2hib3InOwoJCQkJfQoKCQkJCWltZy5zdHlsZS5tc0ludGVycG9sYXRpb25Nb2RlID0gZm9yY2UgPyAnYmljdWJpYycgOiAnbmVhcmVzdC1uZWlnaGJvcic7CgkJCX0sCgoJCQlpbnNlcnRTdHlsZVRhZyA6IGZ1bmN0aW9uKCBzdHlsZXMgKSB7CgkJCQl2YXIgc3R5bGUgPSBkb2MuY3JlYXRlRWxlbWVudCggJ3N0eWxlJyApOwoJCQkJRE9NKCkuaGVhZC5hcHBlbmRDaGlsZCggc3R5bGUgKTsKCgkJCQlpZiAoIHN0eWxlLnN0eWxlU2hlZXQgKSB7IC8vIElFCgkJCQkJc3R5bGUuc3R5bGVTaGVldC5jc3NUZXh0ID0gc3R5bGVzOwoJCQkJfSBlbHNlIHsKCQkJCQl2YXIgY3NzVGV4dCA9IGRvYy5jcmVhdGVUZXh0Tm9kZSggc3R5bGVzICk7CgkJCQkJc3R5bGUuYXBwZW5kQ2hpbGQoIGNzc1RleHQgKTsKCQkJCX0KCQkJfSwKCgkJCS8vIGEgbG9hZHNjcmlwdCBtZXRob2QgdGhhdCB3b3JrcyBmb3IgbG9jYWwgc2NyaXB0cwoJCQlsb2FkU2NyaXB0OiBmdW5jdGlvbiggdXJsLCBjYWxsYmFjayApIHsKCgkJCQl2YXIgZG9uZSA9IGZhbHNlLAoJCQkJCXNjcmlwdCA9ICQoJzxzY3InKydpcHQ+JykuYXR0cih7CgkJCQkJCXNyYzogdXJsLAoJCQkJCQlhc3luYzogdHJ1ZQoJCQkJCX0pLmdldCgwKTsKCgkJCSAgIC8vIEF0dGFjaCBoYW5kbGVycyBmb3IgYWxsIGJyb3dzZXJzCgkJCSAgIHNjcmlwdC5vbmxvYWQgPSBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7CgkJCQkgICBpZiAoICFkb25lICYmICghdGhpcy5yZWFkeVN0YXRlIHx8CgkJCQkJICAgdGhpcy5yZWFkeVN0YXRlID09PSAnbG9hZGVkJyB8fCB0aGlzLnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpICkgewoKCQkJCQkgICBkb25lID0gdHJ1ZTsKCgkJCQkJICAgLy8gSGFuZGxlIG1lbW9yeSBsZWFrIGluIElFCgkJCQkJICAgc2NyaXB0Lm9ubG9hZCA9IHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsOwoKCQkJCQkgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7CgkJCQkJCSAgIGNhbGxiYWNrLmNhbGwoIHRoaXMsIHRoaXMgKTsKCQkJCQkgICB9CgkJCQkgICB9CgkJCSAgIH07CgoJCQkgICBET00oKS5oZWFkLmFwcGVuZENoaWxkKCBzY3JpcHQgKTsKCQkJfSwKCgkJCS8vIHBhcnNlIGFueXRoaW5nIGludG8gYSBudW1iZXIKCQkJcGFyc2VWYWx1ZTogZnVuY3Rpb24oIHZhbCApIHsKCQkJCWlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykgewoJCQkJCXJldHVybiB2YWw7CgkJCQl9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7CgkJCQkJdmFyIGFyciA9IHZhbC5tYXRjaCgvXC0/XGR8XC4vZyk7CgkJCQkJcmV0dXJuIGFyciAmJiBhcnIuY29uc3RydWN0b3IgPT09IEFycmF5ID8gYXJyLmpvaW4oJycpKjEgOiAwOwoJCQkJfSBlbHNlIHsKCQkJCQlyZXR1cm4gMDsKCQkJCX0KCQkJfSwKCgkJCS8vIHRpbWVzdGFtcCBhYnN0cmFjdGlvbgoJCQl0aW1lc3RhbXA6IGZ1bmN0aW9uKCkgewoJCQkJcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpOwoJCQl9LAoKCQkJLy8gdGhpcyBpcyBwcmV0dHkgY3JhcCwgYnV0IHdvcmtzIGZvciBub3cKCQkJLy8gaXQgd2lsbCBhZGQgYSBjYWxsYmFjaywgYnV0IGl0IGNhbid0IGd1YXJhbnRlZSB0aGF0IHRoZSBzdHlsZXMgY2FuIGJlIGZldGNoZWQKCQkJLy8gdXNpbmcgZ2V0Q29tcHV0ZWRTdHlsZSBmdXJ0aGVyIGNoZWNraW5nIG5lZWRlZCwgcG9zc2libHkgYSBkdW1teSBlbGVtZW50CgkJCWxvYWRDU1MgOiBmdW5jdGlvbiggaHJlZiwgaWQsIGNhbGxiYWNrICkgewoKCQkJCXZhciBsaW5rLAoJCQkJCXJlYWR5ID0gZmFsc2UsCgkJCQkJbGVuZ3RoOwoKCQkJCS8vIGxvb2sgZm9yIG1hbnVhbCBjc3MKCQkJCSQoJ2xpbmtbcmVsPXN0eWxlc2hlZXRdJykuZWFjaChmdW5jdGlvbigpIHsKCQkJCQlpZiAoIG5ldyBSZWdFeHAoIGhyZWYgKS50ZXN0KCB0aGlzLmhyZWYgKSApIHsKCQkJCQkJbGluayA9IHRoaXM7CgkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQl9CgkJCQl9KTsKCgkJCQlpZiAoIHR5cGVvZiBpZCA9PT0gJ2Z1bmN0aW9uJyApIHsKCQkJCQljYWxsYmFjayA9IGlkOwoJCQkJCWlkID0gdW5kZWY7CgkJCQl9CgoJCQkJY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9OyAvLyBkaXJ0eQoKCQkJCS8vIGlmIGFscmVhZHkgcHJlc2VudCwgcmV0dXJuCgkJCQlpZiAoIGxpbmsgKSB7CgkJCQkJY2FsbGJhY2suY2FsbCggbGluaywgbGluayApOwoJCQkJCXJldHVybiBsaW5rOwoJCQkJfQoKCQkJCS8vIHNhdmUgdGhlIGxlbmd0aCBvZiBzdHlsZXNoZWV0cyB0byBjaGVjayBhZ2FpbnN0CgkJCQlsZW5ndGggPSBkb2Muc3R5bGVTaGVldHMubGVuZ3RoOwoKCQkJCS8vIGNoZWNrIGZvciBleGlzdGluZyBpZAoJCQkJaWYoICQoJyMnK2lkKS5sZW5ndGggKSB7CgkJCQkJJCgnIycraWQpLmF0dHIoJ2hyZWYnLCBocmVmKTsKCQkJCQlsZW5ndGgtLTsKCQkJCQlyZWFkeSA9IHRydWU7CgkJCQl9IGVsc2UgewoJCQkJCWxpbmsgPSAkKCAnPGxpbms+JyApLmF0dHIoewoJCQkJCQlyZWw6ICdzdHlsZXNoZWV0JywKCQkJCQkJaHJlZjogaHJlZiwKCQkJCQkJaWQ6IGlkCgkJCQkJfSkuZ2V0KDApOwoKCQkJCQl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHsKCQkJCQkJdmFyIHN0eWxlcyA9ICQoJ2xpbmtbcmVsPSJzdHlsZXNoZWV0Il0sIHN0eWxlJyk7CgkJCQkJCWlmICggc3R5bGVzLmxlbmd0aCApIHsKCQkJCQkJCXN0eWxlcy5nZXQoMCkucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGxpbmssIHN0eWxlc1swXSApOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJRE9NKCkuaGVhZC5hcHBlbmRDaGlsZCggbGluayApOwoJCQkJCQl9CgoJCQkJCQlpZiAoIElFICkgewoKCQkJCQkJCS8vIElFIGhhcyBhIGxpbWl0IG9mIDMxIHN0eWxlc2hlZXRzIGluIG9uZSBkb2N1bWVudAoJCQkJCQkJaWYoIGxlbmd0aCA+PSAzMSApIHsKCQkJCQkJCQlHYWxsZXJpYS5yYWlzZSggJ1lvdSBoYXZlIHJlYWNoZWQgdGhlIGJyb3dzZXIgc3R5bGVzaGVldCBsaW1pdCAoMzEpJywgdHJ1ZSApOwoJCQkJCQkJCXJldHVybjsKCQkJCQkJCX0KCgkJCQkJCQkvLyB0b2RvOiB0ZXN0IGlmIElFIHJlYWxseSBuZWVkcyB0aGUgcmVhZHlTdGF0ZQoJCQkJCQkJbGluay5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbihlKSB7CgkJCQkJCQkJaWYgKCAhcmVhZHkgJiYgKCF0aGlzLnJlYWR5U3RhdGUgfHwKCQkJCQkJCQkJdGhpcy5yZWFkeVN0YXRlID09PSAnbG9hZGVkJyB8fCB0aGlzLnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpICkgewoJCQkJCQkJCQlyZWFkeSA9IHRydWU7CgkJCQkJCQkJfQoJCQkJCQkJfTsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCS8vIGZpbmFsIHRlc3QgdmlhIGFqYXggaWYgbm90IGxvY2FsCgkJCQkJCQlpZiAoICEoIG5ldyBSZWdFeHAoJ2ZpbGU6Ly8nLCdpJykudGVzdCggaHJlZiApICkgKSB7CgkJCQkJCQkJJC5hamF4KHsKCQkJCQkJCQkJdXJsOiBocmVmLAoJCQkJCQkJCQlzdWNjZXNzOiBmdW5jdGlvbigpIHsKCQkJCQkJCQkJCXJlYWR5ID0gdHJ1ZTsKCQkJCQkJCQkJfSwKCQkJCQkJCQkJZXJyb3I6IGZ1bmN0aW9uKGUpIHsKCQkJCQkJCQkJCS8vIHBhc3MgaWYgb3JpZ2luIGlzIHJlamVjdGVkIGluIGNocm9tZSBmb3Igc29tZSByZWFzb24KCQkJCQkJCQkJCWlmKCBlLmlzUmVqZWN0ZWQoKSAmJiBHYWxsZXJpYS5XRUJLSVQgKSB7CgkJCQkJCQkJCQkJcmVhZHkgPSB0cnVlOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQl9CgkJCQkJCQkJfSk7CgkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCXJlYWR5ID0gdHJ1ZTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0sIDEwKTsKCQkJCX0KCgkJCQlpZiAoIHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJyApIHsKCgkJCQkJVXRpbHMud2FpdCh7CgkJCQkJCXVudGlsOiBmdW5jdGlvbigpIHsKCQkJCQkJCXJldHVybiByZWFkeSAmJiBkb2Muc3R5bGVTaGVldHMubGVuZ3RoID4gbGVuZ3RoOwoJCQkJCQl9LAoJCQkJCQlzdWNjZXNzOiBmdW5jdGlvbigpIHsKCQkJCQkJCXdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHsKCQkJCQkJCQljYWxsYmFjay5jYWxsKCBsaW5rLCBsaW5rICk7CgkJCQkJCQl9LCAxMDApOwoJCQkJCQl9LAoJCQkJCQllcnJvcjogZnVuY3Rpb24oKSB7CgkJCQkJCQlHYWxsZXJpYS5yYWlzZSggJ1RoZW1lIENTUyBjb3VsZCBub3QgbG9hZCcsIHRydWUgKTsKCQkJCQkJfSwKCQkJCQkJdGltZW91dDogMTAwMDAKCQkJCQl9KTsKCQkJCX0KCQkJCXJldHVybiBsaW5rOwoJCQl9CgkJfTsKCX0oKSksCgoJLy8gdGhlIHRyYW5zaXRpb25zIGhvbGRlcgoJX3RyYW5zaXRpb25zID0gKGZ1bmN0aW9uKCkgewoKCQl2YXIgX3NsaWRlID0gZnVuY3Rpb24ocGFyYW1zLCBjb21wbGV0ZSwgZmFkZSwgZG9vcikgewoKCQkJdmFyIGVhc2luZyA9IHRoaXMuZ2V0T3B0aW9ucygnZWFzaW5nJyksCgkJCQlkaXN0YW5jZSA9IHRoaXMuZ2V0U3RhZ2VXaWR0aCgpLAoJCQkJZnJvbSA9IHsgbGVmdDogZGlzdGFuY2UgKiAoIHBhcmFtcy5yZXdpbmQgPyAtMSA6IDEgKSB9LAoJCQkJdG8gPSB7IGxlZnQ6IDAgfTsKCgkJCWlmICggZmFkZSApIHsKCQkJCWZyb20ub3BhY2l0eSA9IDA7CgkJCQl0by5vcGFjaXR5ID0gMTsKCQkJfSBlbHNlIHsKCQkJCWZyb20ub3BhY2l0eSA9IDE7CgkJCX0KCgkJCSQocGFyYW1zLm5leHQpLmNzcyhmcm9tKTsKCgkJCVV0aWxzLmFuaW1hdGUocGFyYW1zLm5leHQsIHRvLCB7CgkJCQlkdXJhdGlvbjogcGFyYW1zLnNwZWVkLAoJCQkJY29tcGxldGU6IChmdW5jdGlvbiggZWxlbXMgKSB7CgkJCQkJcmV0dXJuIGZ1bmN0aW9uKCkgewoJCQkJCQljb21wbGV0ZSgpOwoJCQkJCQllbGVtcy5jc3MoewoJCQkJCQkJbGVmdDogMAoJCQkJCQl9KTsKCQkJCQl9OwoJCQkJfSggJCggcGFyYW1zLm5leHQgKS5hZGQoIHBhcmFtcy5wcmV2ICkgKSksCgkJCQlxdWV1ZTogZmFsc2UsCgkJCQllYXNpbmc6IGVhc2luZwoJCQl9KTsKCgkJCWlmIChkb29yKSB7CgkJCQlwYXJhbXMucmV3aW5kID0gIXBhcmFtcy5yZXdpbmQ7CgkJCX0KCgkJCWlmIChwYXJhbXMucHJldikgewoKCQkJCWZyb20gPSB7IGxlZnQ6IDAgfTsKCQkJCXRvID0geyBsZWZ0OiBkaXN0YW5jZSAqICggcGFyYW1zLnJld2luZCA/IDEgOiAtMSApIH07CgoJCQkJaWYgKCBmYWRlICkgewoJCQkJCWZyb20ub3BhY2l0eSA9IDE7CgkJCQkJdG8ub3BhY2l0eSA9IDA7CgkJCQl9CgoJCQkJJChwYXJhbXMucHJldikuY3NzKGZyb20pOwoJCQkJVXRpbHMuYW5pbWF0ZShwYXJhbXMucHJldiwgdG8sIHsKCQkJCQlkdXJhdGlvbjogcGFyYW1zLnNwZWVkLAoJCQkJCXF1ZXVlOiBmYWxzZSwKCQkJCQllYXNpbmc6IGVhc2luZywKCQkJCQljb21wbGV0ZTogZnVuY3Rpb24oKSB7CgkJCQkJCSQodGhpcykuY3NzKCdvcGFjaXR5JywgMCk7CgkJCQkJfQoJCQkJfSk7CgkJCX0KCQl9OwoKCQlyZXR1cm4gewoKCQkJZmFkZTogZnVuY3Rpb24ocGFyYW1zLCBjb21wbGV0ZSkgewoJCQkJJChwYXJhbXMubmV4dCkuY3NzKHsKCQkJCQlvcGFjaXR5OiAwLAoJCQkJCWxlZnQ6IDAKCQkJCX0pLnNob3coKTsKCQkJCVV0aWxzLmFuaW1hdGUocGFyYW1zLm5leHQsIHsKCQkJCQlvcGFjaXR5OiAxCgkJCQl9LHsKCQkJCQlkdXJhdGlvbjogcGFyYW1zLnNwZWVkLAoJCQkJCWNvbXBsZXRlOiBjb21wbGV0ZQoJCQkJfSk7CgkJCQlpZiAocGFyYW1zLnByZXYpIHsKCQkJCQkkKHBhcmFtcy5wcmV2KS5jc3MoJ29wYWNpdHknLDEpLnNob3coKTsKCQkJCQlVdGlscy5hbmltYXRlKHBhcmFtcy5wcmV2LCB7CgkJCQkJCW9wYWNpdHk6IDAKCQkJCQl9LHsKCQkJCQkJZHVyYXRpb246IHBhcmFtcy5zcGVlZAoJCQkJCX0pOwoJCQkJfQoJCQl9LAoKCQkJZmxhc2g6IGZ1bmN0aW9uKHBhcmFtcywgY29tcGxldGUpIHsKCQkJCSQocGFyYW1zLm5leHQpLmNzcyh7CgkJCQkJb3BhY2l0eTogMCwKCQkJCQlsZWZ0OiAwCgkJCQl9KTsKCQkJCWlmIChwYXJhbXMucHJldikgewoJCQkJCVV0aWxzLmFuaW1hdGUoIHBhcmFtcy5wcmV2LCB7CgkJCQkJCW9wYWNpdHk6IDAKCQkJCQl9LHsKCQkJCQkJZHVyYXRpb246IHBhcmFtcy5zcGVlZC8yLAoJCQkJCQljb21wbGV0ZTogZnVuY3Rpb24oKSB7CgkJCQkJCQlVdGlscy5hbmltYXRlKCBwYXJhbXMubmV4dCwgewoJCQkJCQkJCW9wYWNpdHk6MQoJCQkJCQkJfSx7CgkJCQkJCQkJZHVyYXRpb246IHBhcmFtcy5zcGVlZCwKCQkJCQkJCQljb21wbGV0ZTogY29tcGxldGUKCQkJCQkJCX0pOwoJCQkJCQl9CgkJCQkJfSk7CgkJCQl9IGVsc2UgewoJCQkJCVV0aWxzLmFuaW1hdGUoIHBhcmFtcy5uZXh0LCB7CgkJCQkJCW9wYWNpdHk6IDEKCQkJCQl9LHsKCQkJCQkJZHVyYXRpb246IHBhcmFtcy5zcGVlZCwKCQkJCQkJY29tcGxldGU6IGNvbXBsZXRlCgkJCQkJfSk7CgkJCQl9CgkJCX0sCgoJCQlwdWxzZTogZnVuY3Rpb24ocGFyYW1zLCBjb21wbGV0ZSkgewoJCQkJaWYgKHBhcmFtcy5wcmV2KSB7CgkJCQkJJChwYXJhbXMucHJldikuaGlkZSgpOwoJCQkJfQoJCQkJJChwYXJhbXMubmV4dCkuY3NzKHsKCQkJCQlvcGFjaXR5OiAwLAoJCQkJCWxlZnQ6IDAKCQkJCX0pLnNob3coKTsKCQkJCVV0aWxzLmFuaW1hdGUocGFyYW1zLm5leHQsIHsKCQkJCQlvcGFjaXR5OjEKCQkJCX0sewoJCQkJCWR1cmF0aW9uOiBwYXJhbXMuc3BlZWQsCgkJCQkJY29tcGxldGU6IGNvbXBsZXRlCgkJCQl9KTsKCQkJfSwKCgkJCXNsaWRlOiBmdW5jdGlvbihwYXJhbXMsIGNvbXBsZXRlKSB7CgkJCQlfc2xpZGUuYXBwbHkoIHRoaXMsIFV0aWxzLmFycmF5KCBhcmd1bWVudHMgKSApOwoJCQl9LAoKCQkJZmFkZXNsaWRlOiBmdW5jdGlvbihwYXJhbXMsIGNvbXBsZXRlKSB7CgkJCQlfc2xpZGUuYXBwbHkoIHRoaXMsIFV0aWxzLmFycmF5KCBhcmd1bWVudHMgKS5jb25jYXQoIFt0cnVlXSApICk7CgkJCX0sCgoJCQlkb29yc2xpZGU6IGZ1bmN0aW9uKHBhcmFtcywgY29tcGxldGUpIHsKCQkJCV9zbGlkZS5hcHBseSggdGhpcywgVXRpbHMuYXJyYXkoIGFyZ3VtZW50cyApLmNvbmNhdCggW2ZhbHNlLCB0cnVlXSApICk7CgkJCX0KCQl9OwoJfSgpKTsKCi8qKgoJVGhlIG1haW4gR2FsbGVyaWEgY2xhc3MKCglAY2xhc3MKCUBjb25zdHJ1Y3RvcgoKCUBleGFtcGxlIHZhciBnYWxsZXJ5ID0gbmV3IEdhbGxlcmlhKCk7CgoJQGF1dGhvciBodHRwOi8vYWluby5zZQoKCUByZXF1aXJlcyBqUXVlcnkKCiovCgpHYWxsZXJpYSA9IGZ1bmN0aW9uKCkgewoKCXZhciBzZWxmID0gdGhpczsKCgkvLyB0aGUgdGhlbWUgdXNlZAoJdGhpcy5fdGhlbWUgPSB1bmRlZjsKCgkvLyBpbnRlcm5hbCBvcHRpb25zCgl0aGlzLl9vcHRpb25zID0ge307CgoJLy8gZmxhZyBmb3IgY29udHJvbGxpbmcgcGxheS9wYXVzZQoJdGhpcy5fcGxheWluZyA9IGZhbHNlOwoKCS8vIGludGVybmFsIGludGVydmFsIGZvciBzbGlkZXNob3cKCXRoaXMuX3BsYXl0aW1lID0gNTAwMDsKCgkvLyBpbnRlcm5hbCB2YXJpYWJsZSBmb3IgdGhlIGN1cnJlbnRseSBhY3RpdmUgaW1hZ2UKCXRoaXMuX2FjdGl2ZSA9IG51bGw7CgoJLy8gdGhlIGludGVybmFsIHF1ZXVlLCBhcnJheWlmaWVkCgl0aGlzLl9xdWV1ZSA9IHsgbGVuZ3RoOiAwIH07CgoJLy8gdGhlIGludGVybmFsIGRhdGEgYXJyYXkKCXRoaXMuX2RhdGEgPSBbXTsKCgkvLyB0aGUgaW50ZXJuYWwgZG9tIGNvbGxlY3Rpb24KCXRoaXMuX2RvbSA9IHt9OwoKCS8vIHRoZSBpbnRlcm5hbCB0aHVtYm5haWxzIGFycmF5Cgl0aGlzLl90aHVtYm5haWxzID0gW107CgoJLy8gdGhlIGludGVybmFsIGxheWVycyBhcnJheQoJdGhpcy5fbGF5ZXJzID0gW107CgoJLy8gaW50ZXJuYWwgaW5pdCBmbGFnCgl0aGlzLl9pbml0aWFsaXplZCA9IGZhbHNlOwoKCS8vIGludGVybmFsIGZpcnN0cnVuIGZsYWcKCXRoaXMuX2ZpcnN0cnVuID0gZmFsc2U7CgoJLy8gZ2xvYmFsIHN0YWdld2lkdGgvaGVpZ2h0Cgl0aGlzLl9zdGFnZVdpZHRoID0gMDsKCXRoaXMuX3N0YWdlSGVpZ2h0ID0gMDsKCgkvLyB0YXJnZXQgaG9sZGVyCgl0aGlzLl90YXJnZXQgPSB1bmRlZjsKCgkvLyBpbnN0YW5jZSBpZAoJdGhpcy5faWQgPSBNYXRoLnJhbmRvbSgpOwoKCS8vIGFkZCBzb21lIGVsZW1lbnRzCgl2YXIgZGl2cyA9ICAnY29udGFpbmVyIHN0YWdlIGltYWdlcyBpbWFnZS1uYXYgaW1hZ2UtbmF2LWxlZnQgaW1hZ2UtbmF2LXJpZ2h0ICcgKwoJCQkJJ2luZm8gaW5mby10ZXh0IGluZm8tdGl0bGUgaW5mby1kZXNjcmlwdGlvbiAnICsKCQkJCSd0aHVtYm5haWxzIHRodW1ibmFpbHMtbGlzdCB0aHVtYm5haWxzLWNvbnRhaW5lciB0aHVtYi1uYXYtbGVmdCB0aHVtYi1uYXYtcmlnaHQgJyArCgkJCQknbG9hZGVyIGNvdW50ZXIgdG9vbHRpcCcsCgkJc3BhbnMgPSAnY3VycmVudCB0b3RhbCc7CgoJJC5lYWNoKCBkaXZzLnNwbGl0KCcgJyksIGZ1bmN0aW9uKCBpLCBlbGVtSWQgKSB7CgkJc2VsZi5fZG9tWyBlbGVtSWQgXSA9IFV0aWxzLmNyZWF0ZSggJ2dhbGxlcmlhLScgKyBlbGVtSWQgKTsKCX0pOwoKCSQuZWFjaCggc3BhbnMuc3BsaXQoJyAnKSwgZnVuY3Rpb24oIGksIGVsZW1JZCApIHsKCQlzZWxmLl9kb21bIGVsZW1JZCBdID0gVXRpbHMuY3JlYXRlKCAnZ2FsbGVyaWEtJyArIGVsZW1JZCwgJ3NwYW4nICk7Cgl9KTsKCgkvLyB0aGUgaW50ZXJuYWwga2V5Ym9hcmQgb2JqZWN0CgkvLyBrZWVwcyByZWZlcmVuY2Ugb2YgdGhlIGtleWJpbmRzIGFuZCBwcm92aWRlcyBoZWxwZXIgbWV0aG9kcyBmb3IgYmluZGluZyBrZXlzCgl2YXIga2V5Ym9hcmQgPSB0aGlzLl9rZXlib2FyZCA9IHsKCgkJa2V5cyA6IHsKCQkJJ1VQJzogMzgsCgkJCSdET1dOJzogNDAsCgkJCSdMRUZUJzogMzcsCgkJCSdSSUdIVCc6IDM5LAoJCQknUkVUVVJOJzogMTMsCgkJCSdFU0NBUEUnOiAyNywKCQkJJ0JBQ0tTUEFDRSc6IDgsCgkJCSdTUEFDRSc6IDMyCgkJfSwKCgkJbWFwIDoge30sCgoJCWJvdW5kOiBmYWxzZSwKCgkJcHJlc3M6IGZ1bmN0aW9uKGUpIHsKCQkJdmFyIGtleSA9IGUua2V5Q29kZSB8fCBlLndoaWNoOwoJCQlpZiAoIGtleSBpbiBrZXlib2FyZC5tYXAgJiYgdHlwZW9mIGtleWJvYXJkLm1hcFtrZXldID09PSAnZnVuY3Rpb24nICkgewoJCQkJa2V5Ym9hcmQubWFwW2tleV0uY2FsbChzZWxmLCBlKTsKCQkJfQoJCX0sCgoJCWF0dGFjaDogZnVuY3Rpb24obWFwKSB7CgoJCQl2YXIga2V5LCB1cDsKCgkJCWZvcigga2V5IGluIG1hcCApIHsKCQkJCWlmICggbWFwLmhhc093blByb3BlcnR5KCBrZXkgKSApIHsKCQkJCQl1cCA9IGtleS50b1VwcGVyQ2FzZSgpOwoJCQkJCWlmICggdXAgaW4ga2V5Ym9hcmQua2V5cyApIHsKCQkJCQkJa2V5Ym9hcmQubWFwWyBrZXlib2FyZC5rZXlzW3VwXSBdID0gbWFwW2tleV07CgkJCQkJfSBlbHNlIHsKCQkJCQkJa2V5Ym9hcmQubWFwWyB1cCBdID0gbWFwW2tleV07CgkJCQkJfQoJCQkJfQoJCQl9CgkJCWlmICggIWtleWJvYXJkLmJvdW5kICkgewoJCQkJa2V5Ym9hcmQuYm91bmQgPSB0cnVlOwoJCQkJJGRvYy5iaW5kKCdrZXlkb3duJywga2V5Ym9hcmQucHJlc3MpOwoJCQl9CgkJfSwKCgkJZGV0YWNoOiBmdW5jdGlvbigpIHsKCQkJa2V5Ym9hcmQuYm91bmQgPSBmYWxzZTsKCQkJa2V5Ym9hcmQubWFwID0ge307CgkJCSRkb2MudW5iaW5kKCdrZXlkb3duJywga2V5Ym9hcmQucHJlc3MpOwoJCX0KCX07CgoJLy8gaW50ZXJuYWwgY29udHJvbHMgZm9yIGtlZXBpbmcgdHJhY2sgb2YgYWN0aXZlIC8gaW5hY3RpdmUgaW1hZ2VzCgl2YXIgY29udHJvbHMgPSB0aGlzLl9jb250cm9scyA9IHsKCgkJMDogdW5kZWYsCgoJCTE6IHVuZGVmLAoKCQlhY3RpdmUgOiAwLAoKCQlzd2FwIDogZnVuY3Rpb24oKSB7CgkJCWNvbnRyb2xzLmFjdGl2ZSA9IGNvbnRyb2xzLmFjdGl2ZSA/IDAgOiAxOwoJCX0sCgoJCWdldEFjdGl2ZSA6IGZ1bmN0aW9uKCkgewoJCQlyZXR1cm4gY29udHJvbHNbIGNvbnRyb2xzLmFjdGl2ZSBdOwoJCX0sCgoJCWdldE5leHQgOiBmdW5jdGlvbigpIHsKCQkJcmV0dXJuIGNvbnRyb2xzWyAxIC0gY29udHJvbHMuYWN0aXZlIF07CgkJfQoJfTsKCgkvLyBpbnRlcm5hbCBjYXJvdXNlbCBvYmplY3QKCXZhciBjYXJvdXNlbCA9IHRoaXMuX2Nhcm91c2VsID0gewoKCQkvLyBzaG9ydGN1dHMKCQluZXh0OiBzZWxmLiQoJ3RodW1iLW5hdi1yaWdodCcpLAoJCXByZXY6IHNlbGYuJCgndGh1bWItbmF2LWxlZnQnKSwKCgkJLy8gY2FjaGUgdGhlIHdpZHRoCgkJd2lkdGg6IDAsCgoJCS8vIHRyYWNrIHRoZSBjdXJyZW50IHBvc2l0aW9uCgkJY3VycmVudDogMCwKCgkJLy8gY2FjaGUgbWF4IHZhbHVlCgkJbWF4OiAwLAoKCQkvLyBzYXZlIGFsbCBob29rcyBmb3IgZWFjaCB3aWR0aCBpbiBhbiBhcnJheQoJCWhvb2tzOiBbXSwKCgkJLy8gdXBkYXRlIHRoZSBjYXJvdXNlbAoJCS8vIHlvdSBjYW4gcnVuIHRoaXMgbWV0aG9kIGFueXRpbWUsIGYuZXggb24gd2luZG93LnJlc2l6ZQoJCXVwZGF0ZTogZnVuY3Rpb24oKSB7CgkJCXZhciB3ID0gMCwKCQkJCWggPSAwLAoJCQkJaG9va3MgPSBbMF07CgoJCQkkLmVhY2goIHNlbGYuX3RodW1ibmFpbHMsIGZ1bmN0aW9uKCBpLCB0aHVtYiApIHsKCQkJCWlmICggdGh1bWIucmVhZHkgKSB7CgkJCQkJdyArPSB0aHVtYi5vdXRlcldpZHRoIHx8ICQoIHRodW1iLmNvbnRhaW5lciApLm91dGVyV2lkdGgoIHRydWUgKTsKCQkJCQlob29rc1sgaSsxIF0gPSB3OwoJCQkJCWggPSBNYXRoLm1heCggaCwgdGh1bWIub3V0ZXJIZWlnaHQgfHwgJCggdGh1bWIuY29udGFpbmVyKS5vdXRlckhlaWdodCggdHJ1ZSApICk7CgkJCQl9CgkJCX0pOwoKCQkJc2VsZi4kKCAndGh1bWJuYWlscycgKS5jc3MoewoJCQkJd2lkdGg6IHcsCgkJCQloZWlnaHQ6IGgKCQkJfSk7CgoJCQljYXJvdXNlbC5tYXggPSB3OwoJCQljYXJvdXNlbC5ob29rcyA9IGhvb2tzOwoJCQljYXJvdXNlbC53aWR0aCA9IHNlbGYuJCggJ3RodW1ibmFpbHMtbGlzdCcgKS53aWR0aCgpOwoJCQljYXJvdXNlbC5zZXRDbGFzc2VzKCk7CgoJCQlzZWxmLiQoICd0aHVtYm5haWxzLWNvbnRhaW5lcicgKS50b2dnbGVDbGFzcyggJ2dhbGxlcmlhLWNhcm91c2VsJywgdyA+IGNhcm91c2VsLndpZHRoICk7CgoJCQkvLyBvbmUgZXh0cmEgY2FsY3VsYXRpb24KCQkJY2Fyb3VzZWwud2lkdGggPSBzZWxmLiQoICd0aHVtYm5haWxzLWxpc3QnICkud2lkdGgoKTsKCgkJCS8vIHRvZG86IGZpeCBzbyB0aGUgY2Fyb3VzZWwgbW92ZXMgdG8gdGhlIGxlZnQKCQl9LAoKCQliaW5kQ29udHJvbHM6IGZ1bmN0aW9uKCkgewoKCQkJdmFyIGk7CgoJCQljYXJvdXNlbC5uZXh0LmJpbmQoICdjbGljaycsIGZ1bmN0aW9uKGUpIHsKCQkJCWUucHJldmVudERlZmF1bHQoKTsKCgkJCQlpZiAoIHNlbGYuX29wdGlvbnMuY2Fyb3VzZWxTdGVwcyA9PT0gJ2F1dG8nICkgewoKCQkJCQlmb3IgKCBpID0gY2Fyb3VzZWwuY3VycmVudDsgaSA8IGNhcm91c2VsLmhvb2tzLmxlbmd0aDsgaSsrICkgewoJCQkJCQlpZiAoIGNhcm91c2VsLmhvb2tzW2ldIC0gY2Fyb3VzZWwuaG9va3NbIGNhcm91c2VsLmN1cnJlbnQgXSA+IGNhcm91c2VsLndpZHRoICkgewoJCQkJCQkJY2Fyb3VzZWwuc2V0KGkgLSAyKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJfQoKCQkJCX0gZWxzZSB7CgkJCQkJY2Fyb3VzZWwuc2V0KCBjYXJvdXNlbC5jdXJyZW50ICsgc2VsZi5fb3B0aW9ucy5jYXJvdXNlbFN0ZXBzKTsKCQkJCX0KCQkJfSk7CgoJCQljYXJvdXNlbC5wcmV2LmJpbmQoICdjbGljaycsIGZ1bmN0aW9uKGUpIHsKCQkJCWUucHJldmVudERlZmF1bHQoKTsKCgkJCQlpZiAoIHNlbGYuX29wdGlvbnMuY2Fyb3VzZWxTdGVwcyA9PT0gJ2F1dG8nICkgewoKCQkJCQlmb3IgKCBpID0gY2Fyb3VzZWwuY3VycmVudDsgaSA+PSAwOyBpLS0gKSB7CgkJCQkJCWlmICggY2Fyb3VzZWwuaG9va3NbIGNhcm91c2VsLmN1cnJlbnQgXSAtIGNhcm91c2VsLmhvb2tzW2ldID4gY2Fyb3VzZWwud2lkdGggKSB7CgkJCQkJCQljYXJvdXNlbC5zZXQoIGkgKyAyICk7CgkJCQkJCQlicmVhazsKCQkJCQkJfSBlbHNlIGlmICggaSA9PT0gMCApIHsKCQkJCQkJCWNhcm91c2VsLnNldCggMCApOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQl9CgkJCQl9IGVsc2UgewoJCQkJCWNhcm91c2VsLnNldCggY2Fyb3VzZWwuY3VycmVudCAtIHNlbGYuX29wdGlvbnMuY2Fyb3VzZWxTdGVwcyApOwoJCQkJfQoJCQl9KTsKCQl9LAoKCQkvLyBjYWxjdWxhdGUgYW5kIHNldCBwb3NpdGlvbnMKCQlzZXQ6IGZ1bmN0aW9uKCBpICkgewoJCQlpID0gTWF0aC5tYXgoIGksIDAgKTsKCQkJd2hpbGUgKCBjYXJvdXNlbC5ob29rc1tpIC0gMV0gKyBjYXJvdXNlbC53aWR0aCA+PSBjYXJvdXNlbC5tYXggJiYgaSA+PSAwICkgewoJCQkJaS0tOwoJCQl9CgkJCWNhcm91c2VsLmN1cnJlbnQgPSBpOwoJCQljYXJvdXNlbC5hbmltYXRlKCk7CgkJfSwKCgkJLy8gZ2V0IHRoZSBsYXN0IHBvc2l0aW9uCgkJZ2V0TGFzdDogZnVuY3Rpb24oaSkgewoJCQlyZXR1cm4gKCBpIHx8IGNhcm91c2VsLmN1cnJlbnQgKSAtIDE7CgkJfSwKCgkJLy8gZm9sbG93IHRoZSBhY3RpdmUgaW1hZ2UKCQlmb2xsb3c6IGZ1bmN0aW9uKGkpIHsKCgkJCS8vZG9uJ3QgZm9sbG93IGlmIHBvc2l0aW9uIGZpdHMKCQkJaWYgKCBpID09PSAwIHx8IGkgPT09IGNhcm91c2VsLmhvb2tzLmxlbmd0aCAtIDIgKSB7CgkJCQljYXJvdXNlbC5zZXQoIGkgKTsKCQkJCXJldHVybjsKCQkJfQoKCQkJLy8gY2FsY3VsYXRlIGxhc3QgcG9zaXRpb24KCQkJdmFyIGxhc3QgPSBjYXJvdXNlbC5jdXJyZW50OwoJCQl3aGlsZSggY2Fyb3VzZWwuaG9va3NbbGFzdF0gLSBjYXJvdXNlbC5ob29rc1sgY2Fyb3VzZWwuY3VycmVudCBdIDwKCQkJCSAgIGNhcm91c2VsLndpZHRoICYmIGxhc3QgPD0gY2Fyb3VzZWwuaG9va3MubGVuZ3RoICkgewoJCQkJbGFzdCArKzsKCQkJfQoKCQkJLy8gc2V0IHBvc2l0aW9uCgkJCWlmICggaSAtIDEgPCBjYXJvdXNlbC5jdXJyZW50ICkgewoJCQkJY2Fyb3VzZWwuc2V0KCBpIC0gMSApOwoJCQl9IGVsc2UgaWYgKCBpICsgMiA+IGxhc3QpIHsKCQkJCWNhcm91c2VsLnNldCggaSAtIGxhc3QgKyBjYXJvdXNlbC5jdXJyZW50ICsgMiApOwoJCQl9CgkJfSwKCgkJLy8gaGVscGVyIGZvciBzZXR0aW5nIGRpc2FibGVkIGNsYXNzZXMKCQlzZXRDbGFzc2VzOiBmdW5jdGlvbigpIHsKCQkJY2Fyb3VzZWwucHJldi50b2dnbGVDbGFzcyggJ2Rpc2FibGVkJywgIWNhcm91c2VsLmN1cnJlbnQgKTsKCQkJY2Fyb3VzZWwubmV4dC50b2dnbGVDbGFzcyggJ2Rpc2FibGVkJywgY2Fyb3VzZWwuaG9va3NbIGNhcm91c2VsLmN1cnJlbnQgXSArIGNhcm91c2VsLndpZHRoID49IGNhcm91c2VsLm1heCApOwoJCX0sCgoJCS8vIHRoZSBhbmltYXRpb24gbWV0aG9kCgkJYW5pbWF0ZTogZnVuY3Rpb24odG8pIHsKCQkJY2Fyb3VzZWwuc2V0Q2xhc3NlcygpOwoJCQl2YXIgbnVtID0gY2Fyb3VzZWwuaG9va3NbIGNhcm91c2VsLmN1cnJlbnQgXSAqIC0xOwoKCQkJaWYgKCBpc05hTiggbnVtICkgKSB7CgkJCQlyZXR1cm47CgkJCX0KCgkJCVV0aWxzLmFuaW1hdGUoc2VsZi5nZXQoICd0aHVtYm5haWxzJyApLCB7CgkJCQlsZWZ0OiBudW0KCQkJfSx7CgkJCQlkdXJhdGlvbjogc2VsZi5fb3B0aW9ucy5jYXJvdXNlbFNwZWVkLAoJCQkJZWFzaW5nOiBzZWxmLl9vcHRpb25zLmVhc2luZywKCQkJCXF1ZXVlOiBmYWxzZQoJCQl9KTsKCQl9Cgl9OwoKCS8vIHRvb2x0aXAgY29udHJvbAoJLy8gYWRkZWQgaW4gMS4yCgl2YXIgdG9vbHRpcCA9IHRoaXMuX3Rvb2x0aXAgPSB7CgoJCWluaXRpYWxpemVkIDogZmFsc2UsCgoJCW9wZW46IGZhbHNlLAoKCQlpbml0OiBmdW5jdGlvbigpIHsKCgkJCXRvb2x0aXAuaW5pdGlhbGl6ZWQgPSB0cnVlOwoKCQkJdmFyIGNzcyA9ICcuZ2FsbGVyaWEtdG9vbHRpcHtwYWRkaW5nOjNweCA4cHg7bWF4LXdpZHRoOjUwJTtiYWNrZ3JvdW5kOiNmZmU7Y29sb3I6IzAwMDt6LWluZGV4OjM7cG9zaXRpb246YWJzb2x1dGU7Zm9udC1zaXplOjExcHg7bGluZS1oZWlnaHQ6MS4zJyArCgkJCQkJICAnb3BhY2l0eTowO2JveC1zaGFkb3c6MCAwIDJweCByZ2JhKDAsMCwwLC40KTstbW96LWJveC1zaGFkb3c6MCAwIDJweCByZ2JhKDAsMCwwLC40KTstd2Via2l0LWJveC1zaGFkb3c6MCAwIDJweCByZ2JhKDAsMCwwLC40KTt9JzsKCgkJCVV0aWxzLmluc2VydFN0eWxlVGFnKGNzcyk7CgoJCQlzZWxmLiQoICd0b29sdGlwJyApLmNzcygnb3BhY2l0eScsIDAuOCk7CgkJCVV0aWxzLmhpZGUoIHNlbGYuZ2V0KCd0b29sdGlwJykgKTsKCgkJfSwKCgkJLy8gbW92ZSBoYW5kbGVyCgkJbW92ZTogZnVuY3Rpb24oIGUgKSB7CgkJCXZhciBtb3VzZVggPSBzZWxmLmdldE1vdXNlUG9zaXRpb24oZSkueCwKCQkJCW1vdXNlWSA9IHNlbGYuZ2V0TW91c2VQb3NpdGlvbihlKS55LAoJCQkJJGVsZW0gPSBzZWxmLiQoICd0b29sdGlwJyApLAoJCQkJeCA9IG1vdXNlWCwKCQkJCXkgPSBtb3VzZVksCgkJCQloZWlnaHQgPSAkZWxlbS5vdXRlckhlaWdodCggdHJ1ZSApICsgMSwKCQkJCXdpZHRoID0gJGVsZW0ub3V0ZXJXaWR0aCggdHJ1ZSApLAoJCQkJbGltaXRZID0gaGVpZ2h0ICsgMTU7CgoJCQl2YXIgbWF4WCA9IHNlbGYuJCggJ2NvbnRhaW5lcicpLndpZHRoKCkgLSB3aWR0aCAtIDIsCgkJCQltYXhZID0gc2VsZi4kKCAnY29udGFpbmVyJykuaGVpZ2h0KCkgLSBoZWlnaHQgLSAyOwoKCQkJaWYgKCAhaXNOYU4oeCkgJiYgIWlzTmFOKHkpICkgewoKCQkJCXggKz0gMTA7CgkJCQl5IC09IDMwOwoKCQkJCXggPSBNYXRoLm1heCggMCwgTWF0aC5taW4oIG1heFgsIHggKSApOwoJCQkJeSA9IE1hdGgubWF4KCAwLCBNYXRoLm1pbiggbWF4WSwgeSApICk7CgoJCQkJaWYoIG1vdXNlWSA8IGxpbWl0WSApIHsKCQkJCQl5ID0gbGltaXRZOwoJCQkJfQoKCQkJCSRlbGVtLmNzcyh7IGxlZnQ6IHgsIHRvcDogeSB9KTsKCQkJfQoJCX0sCgoJCS8vIGJpbmQgZWxlbWVudHMgdG8gdGhlIHRvb2x0aXAKCQkvLyB5b3UgY2FuIGJpbmQgbXVsdGlwbGUgZWxlbWVudElEcyB1c2luZyB7IGVsZW1JRCA6IGZ1bmN0aW9uIH0gb3IgeyBlbGVtSUQgOiBzdHJpbmcgfQoJCS8vIHlvdSBjYW4gYWxzbyBiaW5kIHNpbmdsZSBET00gZWxlbWVudHMgdXNpbmcgYmluZChlbGVtLCBzdHJpbmcpCgkJYmluZDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgewoKCQkJLy8gdG9kbzogcmV2aXNlIGlmIGFsdGVybmF0aXZlIHRvb2x0aXAgaXMgbmVlZGVkIGZvciBtb2JpbGUgZGV2aWNlcwoJCQlpZiAoR2FsbGVyaWEuVE9VQ0gpIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJaWYgKCEgdG9vbHRpcC5pbml0aWFsaXplZCApIHsKCQkJCXRvb2x0aXAuaW5pdCgpOwoJCQl9CgoJCQl2YXIgaG92ZXIgPSBmdW5jdGlvbiggZWxlbSwgdmFsdWUpIHsKCgkJCQl0b29sdGlwLmRlZmluZSggZWxlbSwgdmFsdWUgKTsKCgkJCQkkKCBlbGVtICkuaG92ZXIoZnVuY3Rpb24oKSB7CgoJCQkJCVV0aWxzLmNsZWFyVGltZXIoJ3N3aXRjaF90b29sdGlwJyk7CgkJCQkJc2VsZi4kKCdjb250YWluZXInKS51bmJpbmQoICdtb3VzZW1vdmUnLCB0b29sdGlwLm1vdmUgKS5iaW5kKCAnbW91c2Vtb3ZlJywgdG9vbHRpcC5tb3ZlICkudHJpZ2dlciggJ21vdXNlbW92ZScgKTsKCQkJCQl0b29sdGlwLnNob3coIGVsZW0gKTsKCgkJCQkJR2FsbGVyaWEudXRpbHMuYWRkVGltZXIoICd0b29sdGlwJywgZnVuY3Rpb24oKSB7CgkJCQkJCXNlbGYuJCggJ3Rvb2x0aXAnICkuc3RvcCgpLnNob3coKS5hbmltYXRlKHsKCQkJCQkJCW9wYWNpdHk6MQoJCQkJCQl9KTsKCQkJCQkJdG9vbHRpcC5vcGVuID0gdHJ1ZTsKCgkJCQkJfSwgdG9vbHRpcC5vcGVuID8gMCA6IDUwMCk7CgoJCQkJfSwgZnVuY3Rpb24oKSB7CgoJCQkJCXNlbGYuJCggJ2NvbnRhaW5lcicgKS51bmJpbmQoICdtb3VzZW1vdmUnLCB0b29sdGlwLm1vdmUgKTsKCQkJCQlVdGlscy5jbGVhclRpbWVyKCAndG9vbHRpcCcgKTsKCgkJCQkJc2VsZi4kKCAndG9vbHRpcCcgKS5zdG9wKCkuYW5pbWF0ZSh7CgkJCQkJCW9wYWNpdHk6IDAKCQkJCQl9LCAyMDAsIGZ1bmN0aW9uKCkgewoKCQkJCQkJc2VsZi4kKCAndG9vbHRpcCcgKS5oaWRlKCk7CgoJCQkJCQlVdGlscy5hZGRUaW1lcignc3dpdGNoX3Rvb2x0aXAnLCBmdW5jdGlvbigpIHsKCQkJCQkJCXRvb2x0aXAub3BlbiA9IGZhbHNlOwoJCQkJCQl9LCAxMDAwKTsKCQkJCQl9KTsKCQkJCX0pOwoJCQl9OwoKCQkJaWYgKCB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICkgewoJCQkJaG92ZXIoICggZWxlbSBpbiBzZWxmLl9kb20gPyBzZWxmLmdldCggZWxlbSApIDogZWxlbSApLCB2YWx1ZSApOwoJCQl9IGVsc2UgewoJCQkJLy8gYXN1bWUgZWxlbUlEIGhlcmUKCQkJCSQuZWFjaCggZWxlbSwgZnVuY3Rpb24oIGVsZW1JRCwgdmFsICkgewoJCQkJCWhvdmVyKCBzZWxmLmdldChlbGVtSUQpLCB2YWwgKTsKCQkJCX0pOwoJCQl9CgkJfSwKCgkJc2hvdzogZnVuY3Rpb24oIGVsZW0gKSB7CgoJCQllbGVtID0gJCggZWxlbSBpbiBzZWxmLl9kb20gPyBzZWxmLmdldChlbGVtKSA6IGVsZW0gKTsKCgkJCXZhciB0ZXh0ID0gZWxlbS5kYXRhKCAndHQnICksCgkJCQltb3VzZXVwID0gZnVuY3Rpb24oIGUgKSB7CgoJCQkJCS8vIGF0dGFjaCBhIHRpbnkgc2V0dGltZW91dCB0byBtYWtlIHN1cmUgdGhlIG5ldyB0b29sdGlwIGlzIGZpbGxlZAoJCQkJCXdpbmRvdy5zZXRUaW1lb3V0KCAoZnVuY3Rpb24oIGV2ICkgewoJCQkJCQlyZXR1cm4gZnVuY3Rpb24oKSB7CgkJCQkJCQl0b29sdGlwLm1vdmUoIGV2ICk7CgkJCQkJCX07CgkJCQkJfSggZSApKSwgMTApOwoKCQkJCQllbGVtLnVuYmluZCggJ21vdXNldXAnLCBtb3VzZXVwICk7CgoJCQkJfTsKCgkJCXRleHQgPSB0eXBlb2YgdGV4dCA9PT0gJ2Z1bmN0aW9uJyA/IHRleHQoKSA6IHRleHQ7CgoJCQlpZiAoICEgdGV4dCApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJc2VsZi4kKCAndG9vbHRpcCcgKS5odG1sKCB0ZXh0LnJlcGxhY2UoL1xzLywgJyZuYnNwOycpICk7CgoJCQkvLyB0cmlnZ2VyIG1vdXNlbW92ZSBvbiBtb3VzZXVwIGluIGNhc2Ugb2YgY2xpY2sKCQkJZWxlbS5iaW5kKCAnbW91c2V1cCcsIG1vdXNldXAgKTsKCQl9LAoKCQlkZWZpbmU6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKCgkJCS8vIHdlIHN0b3JlIGZ1bmN0aW9ucywgbm90IHN0cmluZ3MKCQkJaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJykgewoJCQkJdmFyIHMgPSB2YWx1ZTsKCQkJCXZhbHVlID0gZnVuY3Rpb24oKSB7CgkJCQkJcmV0dXJuIHM7CgkJCQl9OwoJCQl9CgoJCQllbGVtID0gJCggZWxlbSBpbiBzZWxmLl9kb20gPyBzZWxmLmdldChlbGVtKSA6IGVsZW0gKS5kYXRhKCd0dCcsIHZhbHVlKTsKCgkJCXRvb2x0aXAuc2hvdyggZWxlbSApOwoKCQl9Cgl9OwoKCS8vIGludGVybmFsIGZ1bGxzY3JlZW4gY29udHJvbAoJdmFyIGZ1bGxzY3JlZW4gPSB0aGlzLl9mdWxsc2NyZWVuID0gewoKCQlzY3JvbGxlZDogMCwKCgkJY3JvcDogdW5kZWYsCgoJCXRyYW5zaXRpb246IHVuZGVmLAoKCQlhY3RpdmU6IGZhbHNlLAoKCQlrZXltYXA6IHNlbGYuX2tleWJvYXJkLm1hcCwKCgkJZW50ZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CgoJCQlmdWxsc2NyZWVuLmFjdGl2ZSA9IHRydWU7CgoJCQkvLyBoaWRlIHRoZSBpbWFnZSB1bnRpbCByZXNjYWxlIGlzIGNvbXBsZXRlCgkJCVV0aWxzLmhpZGUoIHNlbGYuZ2V0QWN0aXZlSW1hZ2UoKSApOwoKCQkJc2VsZi4kKCAnY29udGFpbmVyJyApLmFkZENsYXNzKCAnZnVsbHNjcmVlbicgKTsKCgkJCWZ1bGxzY3JlZW4uc2Nyb2xsZWQgPSAkd2luLnNjcm9sbFRvcCgpOwoKCQkJLy8gYmVnaW4gc3R5bGVmb3JjZQoJCQlVdGlscy5mb3JjZVN0eWxlcyhzZWxmLmdldCgnY29udGFpbmVyJyksIHsKCQkJCXBvc2l0aW9uOiAnZml4ZWQnLAoJCQkJdG9wOiAwLAoJCQkJbGVmdDogMCwKCQkJCXdpZHRoOiAnMTAwJScsCgkJCQloZWlnaHQ6ICcxMDAlJywKCQkJCXpJbmRleDogMTAwMDAKCQkJfSk7CgoJCQl2YXIgaHRtbGJvZHkgPSB7CgkJCQkJaGVpZ2h0OiAnMTAwJScsCgkJCQkJb3ZlcmZsb3c6ICdoaWRkZW4nLAoJCQkJCW1hcmdpbjowLAoJCQkJCXBhZGRpbmc6MAoJCQkJfSwKCgkJCQlkYXRhID0gc2VsZi5nZXREYXRhKCksCgoJCQkJb3B0aW9ucyA9IHNlbGYuX29wdGlvbnM7CgoJCQlVdGlscy5mb3JjZVN0eWxlcyggRE9NKCkuaHRtbCwgaHRtbGJvZHkgKTsKCQkJVXRpbHMuZm9yY2VTdHlsZXMoIERPTSgpLmJvZHksIGh0bWxib2R5ICk7CgoJCQkvLyB0ZW1wb3JhcmlseSBhdHRhY2ggc29tZSBrZXlzCgkJCS8vIHNhdmUgdGhlIG9sZCBvbmVzIGZpcnN0IGluIGEgY2xvbmVkIG9iamVjdAoJCQlmdWxsc2NyZWVuLmtleW1hcCA9ICQuZXh0ZW5kKHt9LCBzZWxmLl9rZXlib2FyZC5tYXApOwoKCQkJc2VsZi5hdHRhY2hLZXlib2FyZCh7CgkJCQllc2NhcGU6IHNlbGYuZXhpdEZ1bGxzY3JlZW4sCgkJCQlyaWdodDogc2VsZi5uZXh0LAoJCQkJbGVmdDogc2VsZi5wcmV2CgkJCX0pOwoKCQkJLy8gdGVtcG9yYXJpbHkgc2F2ZSB0aGUgY3JvcAoJCQlmdWxsc2NyZWVuLmNyb3AgPSBvcHRpb25zLmltYWdlQ3JvcDsKCgkJCS8vIHNldCBmdWxsc2NyZWVuIG9wdGlvbnMKCQkJaWYgKCBvcHRpb25zLmZ1bGxzY3JlZW5Dcm9wICE9IHVuZGVmICkgewoJCQkJb3B0aW9ucy5pbWFnZUNyb3AgPSBvcHRpb25zLmZ1bGxzY3JlZW5Dcm9wOwoJCQl9CgoJCQkvLyBzd2FwIHRvIGJpZyBpbWFnZSBpZiBpdCdzIGRpZmZlcmVudCBmcm9tIHRoZSBkaXNwbGF5IGltYWdlCgkJCWlmICggZGF0YSAmJiBkYXRhLmJpZyAmJiBkYXRhLmltYWdlICE9PSBkYXRhLmJpZyApIHsKCQkJCXZhciBiaWcgICAgPSBuZXcgR2FsbGVyaWEuUGljdHVyZSgpLAoJCQkJCWNhY2hlZCA9IGJpZy5pc0NhY2hlZCggZGF0YS5iaWcgKSwKCQkJCQlpbmRleCAgPSBzZWxmLmdldEluZGV4KCksCgkJCQkJdGh1bWIgID0gc2VsZi5fdGh1bWJuYWlsc1sgaW5kZXggXTsKCgkJCQlzZWxmLnRyaWdnZXIoIHsKCQkJCQl0eXBlOiBHYWxsZXJpYS5MT0FEU1RBUlQsCgkJCQkJY2FjaGVkOiBjYWNoZWQsCgkJCQkJcmV3aW5kOiBmYWxzZSwKCQkJCQlpbmRleDogaW5kZXgsCgkJCQkJaW1hZ2VUYXJnZXQ6IHNlbGYuZ2V0QWN0aXZlSW1hZ2UoKSwKCQkJCQl0aHVtYlRhcmdldDogdGh1bWIKCQkJCX0pOwoKCQkJCWJpZy5sb2FkKCBkYXRhLmJpZywgZnVuY3Rpb24oIGJpZyApIHsKCQkJCQlzZWxmLl9zY2FsZUltYWdlKCBiaWcsIHsKCQkJCQkJY29tcGxldGU6IGZ1bmN0aW9uKCBiaWcgKSB7CgkJCQkJCQlzZWxmLnRyaWdnZXIoewoJCQkJCQkJCXR5cGU6IEdhbGxlcmlhLkxPQURGSU5JU0gsCgkJCQkJCQkJY2FjaGVkOiBjYWNoZWQsCgkJCQkJCQkJaW5kZXg6IGluZGV4LAoJCQkJCQkJCXJld2luZDogZmFsc2UsCgkJCQkJCQkJaW1hZ2VUYXJnZXQ6IGJpZy5pbWFnZSwKCQkJCQkJCQl0aHVtYlRhcmdldDogdGh1bWIKCQkJCQkJCX0pOwoJCQkJCQkJdmFyIGltYWdlID0gc2VsZi5fY29udHJvbHMuZ2V0QWN0aXZlKCkuaW1hZ2U7CgkJCQkJCQlpZiAoIGltYWdlICkgewoJCQkJCQkJCSQoIGltYWdlICkud2lkdGgoIGJpZy5pbWFnZS53aWR0aCApLmhlaWdodCggYmlnLmltYWdlLmhlaWdodCApCgkJCQkJCQkJCS5hdHRyKCAnc3R5bGUnLCAkKCBiaWcuaW1hZ2UgKS5hdHRyKCdzdHlsZScpICkKCQkJCQkJCQkJLmF0dHIoICdzcmMnLCBiaWcuaW1hZ2Uuc3JjICk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9KTsKCQkJCX0pOwoJCQl9CgoJCQkvLyBpbml0IHRoZSBmaXJzdCByZXNjYWxlIGFuZCBhdHRhY2ggY2FsbGJhY2tzCgkJCXNlbGYucmVzY2FsZShmdW5jdGlvbigpIHsKCgkJCQlVdGlscy5hZGRUaW1lcignZnVsbHNjcmVlbl9lbnRlcicsIGZ1bmN0aW9uKCkgewoJCQkJCS8vIHNob3cgdGhlIGltYWdlIGFmdGVyIDUwIG1zCgkJCQkJVXRpbHMuc2hvdyggc2VsZi5nZXRBY3RpdmVJbWFnZSgpICk7CgoJCQkJCWlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHsKCQkJCQkJY2FsbGJhY2suY2FsbCggc2VsZiApOwoJCQkJCX0KCgkJCQl9LCAxMDApOwoKCQkJCXNlbGYudHJpZ2dlciggR2FsbGVyaWEuRlVMTFNDUkVFTl9FTlRFUiApOwoJCQl9KTsKCgkJCS8vIGJpbmQgdGhlIHNjYWxpbmcgdG8gdGhlIHJlc2l6ZSBldmVudAoJCQkkd2luLnJlc2l6ZSggZnVuY3Rpb24oKSB7CgkJCQlmdWxsc2NyZWVuLnNjYWxlKCk7CgkJCX0gKTsKCQl9LAoKCQlzY2FsZSA6IGZ1bmN0aW9uKCkgewoJCQlzZWxmLnJlc2NhbGUoKTsKCQl9LAoKCQlleGl0OiBmdW5jdGlvbihjYWxsYmFjaykgewoKCQkJZnVsbHNjcmVlbi5hY3RpdmUgPSBmYWxzZTsKCgkJCVV0aWxzLmhpZGUoIHNlbGYuZ2V0QWN0aXZlSW1hZ2UoKSApOwoKCQkJc2VsZi4kKCdjb250YWluZXInKS5yZW1vdmVDbGFzcyggJ2Z1bGxzY3JlZW4nICk7CgoJCQkvLyByZXZlcnQgYWxsIHN0eWxlcwoJCQlVdGlscy5yZXZlcnRTdHlsZXMoIHNlbGYuZ2V0KCdjb250YWluZXInKSwgRE9NKCkuaHRtbCwgRE9NKCkuYm9keSApOwoKCQkJLy8gc2Nyb2xsIGJhY2sKCQkJd2luZG93LnNjcm9sbFRvKDAsIGZ1bGxzY3JlZW4uc2Nyb2xsZWQpOwoKCQkJLy8gZGV0YWNoIGFsbCBrZXlib2FyZCBldmVudHMgYW5kIGFwcGx5IHRoZSBvbGQga2V5bWFwCgkJCXNlbGYuZGV0YWNoS2V5Ym9hcmQoKTsKCQkJc2VsZi5hdHRhY2hLZXlib2FyZCggZnVsbHNjcmVlbi5rZXltYXAgKTsKCgkJCS8vIGJyaW5nIGJhY2sgY2FjaGVkIG9wdGlvbnMKCQkJc2VsZi5fb3B0aW9ucy5pbWFnZUNyb3AgPSBmdWxsc2NyZWVuLmNyb3A7CgkJCS8vc2VsZi5fb3B0aW9ucy50cmFuc2l0aW9uID0gZnVsbHNjcmVlbi50cmFuc2l0aW9uOwoKCQkJLy8gcmV0dXJuIHRvIG9yaWdpbmFsIGltYWdlCgkJCXZhciBiaWcgPSBzZWxmLmdldERhdGEoKS5iaWcsCgkJCQlpbWFnZSA9IHNlbGYuX2NvbnRyb2xzLmdldEFjdGl2ZSgpLmltYWdlOwoKCQkJaWYgKCBiaWcgJiYgYmlnID09IGltYWdlLnNyYyApIHsKCgkJCQl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbihzcmMpIHsKCQkJCQlyZXR1cm4gZnVuY3Rpb24oKSB7CgkJCQkJCWltYWdlLnNyYyA9IHNyYzsKCQkJCQl9OwoJCQkJfSggc2VsZi5nZXREYXRhKCkuaW1hZ2UgKSwgMSApOwoKCQkJfQoKCQkJc2VsZi5yZXNjYWxlKGZ1bmN0aW9uKCkgewoJCQkJVXRpbHMuYWRkVGltZXIoJ2Z1bGxzY3JlZW5fZXhpdCcsIGZ1bmN0aW9uKCkgewoKCQkJCQkvLyBzaG93IHRoZSBpbWFnZSBhZnRlciA1MCBtcwoJCQkJCVV0aWxzLnNob3coIHNlbGYuZ2V0QWN0aXZlSW1hZ2UoKSApOwoKCQkJCQlpZiAoIHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJyApIHsKCQkJCQkJY2FsbGJhY2suY2FsbCggc2VsZiApOwoJCQkJCX0KCgkJCQl9LCA1MCk7CgoJCQkJc2VsZi50cmlnZ2VyKCBHYWxsZXJpYS5GVUxMU0NSRUVOX0VYSVQgKTsKCQkJfSk7CgoKCQkJJHdpbi51bmJpbmQoJ3Jlc2l6ZScsIGZ1bGxzY3JlZW4uc2NhbGUpOwoJCX0KCX07CgoJLy8gdGhlIGludGVybmFsIGlkbGUgb2JqZWN0IGZvciBjb250cm9sbGluZyBpZGxlIHN0YXRlcwoJdmFyIGlkbGUgPSB0aGlzLl9pZGxlID0gewoKCQl0cnVuazogW10sCgoJCWJvdW5kOiBmYWxzZSwKCgkJYWRkOiBmdW5jdGlvbihlbGVtLCB0bykgewoJCQlpZiAoIWVsZW0pIHsKCQkJCXJldHVybjsKCQkJfQoJCQlpZiAoIWlkbGUuYm91bmQpIHsKCQkJCWlkbGUuYWRkRXZlbnQoKTsKCQkJfQoJCQllbGVtID0gJChlbGVtKTsKCgkJCXZhciBmcm9tID0ge30sCgkJCQlzdHlsZTsKCgkJCWZvciAoIHN0eWxlIGluIHRvICkgewoJCQkJaWYgKCB0by5oYXNPd25Qcm9wZXJ0eSggc3R5bGUgKSApIHsKCQkJCQlmcm9tWyBzdHlsZSBdID0gZWxlbS5jc3MoIHN0eWxlICk7CgkJCQl9CgkJCX0KCQkJZWxlbS5kYXRhKCdpZGxlJywgewoJCQkJZnJvbTogZnJvbSwKCQkJCXRvOiB0bywKCQkJCWNvbXBsZXRlOiB0cnVlLAoJCQkJYnVzeTogZmFsc2UKCQkJfSk7CgkJCWlkbGUuYWRkVGltZXIoKTsKCQkJaWRsZS50cnVuay5wdXNoKGVsZW0pOwoJCX0sCgoJCXJlbW92ZTogZnVuY3Rpb24oZWxlbSkgewoKCQkJZWxlbSA9IGpRdWVyeShlbGVtKTsKCgkJCSQuZWFjaChpZGxlLnRydW5rLCBmdW5jdGlvbihpLCBlbCkgewoJCQkJaWYgKCBlbC5sZW5ndGggJiYgIWVsLm5vdChlbGVtKS5sZW5ndGggKSB7CgkJCQkJc2VsZi5faWRsZS5zaG93KGVsZW0pOwoJCQkJCXNlbGYuX2lkbGUudHJ1bmsuc3BsaWNlKGksIDEpOwoJCQkJfQoJCQl9KTsKCgkJCWlmICghaWRsZS50cnVuay5sZW5ndGgpIHsKCQkJCWlkbGUucmVtb3ZlRXZlbnQoKTsKCQkJCVV0aWxzLmNsZWFyVGltZXIoJ2lkbGUnKTsKCQkJfQoJCX0sCgoJCWFkZEV2ZW50IDogZnVuY3Rpb24oKSB7CgkJCWlkbGUuYm91bmQgPSB0cnVlOwoJCQlzZWxmLiQoJ2NvbnRhaW5lcicpLmJpbmQoJ21vdXNlbW92ZSBjbGljaycsIGlkbGUuc2hvd0FsbCApOwoJCX0sCgoJCXJlbW92ZUV2ZW50IDogZnVuY3Rpb24oKSB7CgkJCWlkbGUuYm91bmQgPSBmYWxzZTsKCQkJc2VsZi4kKCdjb250YWluZXInKS51bmJpbmQoJ21vdXNlbW92ZSBjbGljaycsIGlkbGUuc2hvd0FsbCApOwoJCX0sCgoJCWFkZFRpbWVyIDogZnVuY3Rpb24oKSB7CgkJCVV0aWxzLmFkZFRpbWVyKCdpZGxlJywgZnVuY3Rpb24oKSB7CgkJCQlzZWxmLl9pZGxlLmhpZGUoKTsKCQkJfSwgc2VsZi5fb3B0aW9ucy5pZGxlVGltZSApOwoJCX0sCgoJCWhpZGUgOiBmdW5jdGlvbigpIHsKCgkJCWlmICggIXNlbGYuX29wdGlvbnMuaWRsZU1vZGUgKSB7CgkJCQlyZXR1cm47CgkJCX0KCgkJCXNlbGYudHJpZ2dlciggR2FsbGVyaWEuSURMRV9FTlRFUiApOwoKCQkJJC5lYWNoKCBpZGxlLnRydW5rLCBmdW5jdGlvbihpLCBlbGVtKSB7CgoJCQkJdmFyIGRhdGEgPSBlbGVtLmRhdGEoJ2lkbGUnKTsKCgkJCQlpZiAoISBkYXRhKSB7CgkJCQkJcmV0dXJuOwoJCQkJfQoKCQkJCWVsZW0uZGF0YSgnaWRsZScpLmNvbXBsZXRlID0gZmFsc2U7CgoJCQkJVXRpbHMuYW5pbWF0ZSggZWxlbSwgZGF0YS50bywgewoJCQkJCWR1cmF0aW9uOiBzZWxmLl9vcHRpb25zLmlkbGVTcGVlZAoJCQkJfSk7CgkJCX0pOwoJCX0sCgoJCXNob3dBbGwgOiBmdW5jdGlvbigpIHsKCgkJCVV0aWxzLmNsZWFyVGltZXIoJ2lkbGUnKTsKCgkJCSQuZWFjaChzZWxmLl9pZGxlLnRydW5rLCBmdW5jdGlvbiggaSwgZWxlbSApIHsKCQkJCXNlbGYuX2lkbGUuc2hvdyggZWxlbSApOwoJCQl9KTsKCQl9LAoKCQlzaG93OiBmdW5jdGlvbihlbGVtKSB7CgoJCQl2YXIgZGF0YSA9IGVsZW0uZGF0YSgnaWRsZScpOwoKCQkJaWYgKCFkYXRhLmJ1c3kgJiYgIWRhdGEuY29tcGxldGUpIHsKCgkJCQlkYXRhLmJ1c3kgPSB0cnVlOwoKCQkJCXNlbGYudHJpZ2dlciggR2FsbGVyaWEuSURMRV9FWElUICk7CgoJCQkJVXRpbHMuY2xlYXJUaW1lciggJ2lkbGUnICk7CgoJCQkJVXRpbHMuYW5pbWF0ZSggZWxlbSwgZGF0YS5mcm9tLCB7CgkJCQkJZHVyYXRpb246IHNlbGYuX29wdGlvbnMuaWRsZVNwZWVkLzIsCgkJCQkJY29tcGxldGU6IGZ1bmN0aW9uKCkgewoJCQkJCQkkKHRoaXMpLmRhdGEoJ2lkbGUnKS5idXN5ID0gZmFsc2U7CgkJCQkJCSQodGhpcykuZGF0YSgnaWRsZScpLmNvbXBsZXRlID0gdHJ1ZTsKCQkJCQl9CgkJCQl9KTsKCgkJCX0KCQkJaWRsZS5hZGRUaW1lcigpOwoJCX0KCX07CgoJLy8gaW50ZXJuYWwgbGlnaHRib3ggb2JqZWN0CgkvLyBjcmVhdGVzIGEgcHJlZGVzaWduZWQgbGlnaHRib3ggZm9yIHNpbXBsZSBwb3B1cHMgb2YgaW1hZ2VzIGluIGdhbGxlcmlhCgl2YXIgbGlnaHRib3ggPSB0aGlzLl9saWdodGJveCA9IHsKCgkJd2lkdGggOiAwLAoKCQloZWlnaHQgOiAwLAoKCQlpbml0aWFsaXplZCA6IGZhbHNlLAoKCQlhY3RpdmUgOiBudWxsLAoKCQlpbWFnZSA6IG51bGwsCgoJCWVsZW1zIDoge30sCgoJCWtleW1hcDogZmFsc2UsCgoJCWluaXQgOiBmdW5jdGlvbigpIHsKCgkJCS8vIHRyaWdnZXIgdGhlIGV2ZW50CgkJCXNlbGYudHJpZ2dlciggR2FsbGVyaWEuTElHSFRCT1hfT1BFTiApOwoKCQkJaWYgKCBsaWdodGJveC5pbml0aWFsaXplZCApIHsKCQkJCXJldHVybjsKCQkJfQoJCQlsaWdodGJveC5pbml0aWFsaXplZCA9IHRydWU7CgoJCQkvLyBjcmVhdGUgc29tZSBlbGVtZW50cyB0byB3b3JrIHdpdGgKCQkJdmFyIGVsZW1zID0gJ292ZXJsYXkgYm94IGNvbnRlbnQgc2hhZG93IHRpdGxlIGluZm8gY2xvc2UgcHJldmhvbGRlciBwcmV2IG5leHRob2xkZXIgbmV4dCBjb3VudGVyIGltYWdlJywKCQkJCWVsID0ge30sCgkJCQlvcCA9IHNlbGYuX29wdGlvbnMsCgkJCQljc3MgPSAnJywKCQkJCWFicyA9ICdwb3NpdGlvbjphYnNvbHV0ZTsnLAoJCQkJcHJlZml4ID0gJ2xpZ2h0Ym94LScsCgkJCQljc3NNYXAgPSB7CgkJCQkJb3ZlcmxheTogICAgJ3Bvc2l0aW9uOmZpeGVkO2Rpc3BsYXk6bm9uZTtvcGFjaXR5Oicrb3Aub3ZlcmxheU9wYWNpdHkrJztmaWx0ZXI6YWxwaGEob3BhY2l0eT0nKyhvcC5vdmVybGF5T3BhY2l0eSoxMDApKwoJCQkJCQkJCScpO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JhY2tncm91bmQ6JytvcC5vdmVybGF5QmFja2dyb3VuZCsnO3otaW5kZXg6OTk5OTAnLAoJCQkJCWJveDogICAgICAgICdwb3NpdGlvbjpmaXhlZDtkaXNwbGF5Om5vbmU7d2lkdGg6NDAwcHg7aGVpZ2h0OjQwMHB4O3RvcDo1MCU7bGVmdDo1MCU7bWFyZ2luLXRvcDotMjAwcHg7bWFyZ2luLWxlZnQ6LTIwMHB4O3otaW5kZXg6OTk5OTEnLAoJCQkJCXNoYWRvdzogICAgIGFicysnYmFja2dyb3VuZDojMDAwO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7JywKCQkJCQljb250ZW50OiAgICBhYnMrJ2JhY2tncm91bmQtY29sb3I6I2ZmZjt0b3A6MTBweDtsZWZ0OjEwcHg7cmlnaHQ6MTBweDtib3R0b206MTBweDtvdmVyZmxvdzpoaWRkZW4nLAoJCQkJCWluZm86ICAgICAgIGFicysnYm90dG9tOjEwcHg7bGVmdDoxMHB4O3JpZ2h0OjEwcHg7Y29sb3I6IzQ0NDtmb250OjExcHgvMTNweCBhcmlhbCxzYW5zLXNlcmlmO2hlaWdodDoxM3B4JywKCQkJCQljbG9zZTogICAgICBhYnMrJ3RvcDoxMHB4O3JpZ2h0OjEwcHg7aGVpZ2h0OjIwcHg7d2lkdGg6MjBweDtiYWNrZ3JvdW5kOiNmZmY7dGV4dC1hbGlnbjpjZW50ZXI7Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzQ0NDtmb250OjE2cHgvMjJweCBhcmlhbCxzYW5zLXNlcmlmO3otaW5kZXg6OTk5OTknLAoJCQkJCWltYWdlOiAgICAgIGFicysndG9wOjEwcHg7bGVmdDoxMHB4O3JpZ2h0OjEwcHg7Ym90dG9tOjMwcHg7b3ZlcmZsb3c6aGlkZGVuO2Rpc3BsYXk6YmxvY2s7JywKCQkJCQlwcmV2aG9sZGVyOiBhYnMrJ3dpZHRoOjUwJTt0b3A6MDtib3R0b206NDBweDtjdXJzb3I6cG9pbnRlcjsnLAoJCQkJCW5leHRob2xkZXI6IGFicysnd2lkdGg6NTAlO3RvcDowO2JvdHRvbTo0MHB4O3JpZ2h0Oi0xcHg7Y3Vyc29yOnBvaW50ZXI7JywKCQkJCQlwcmV2OiAgICAgICBhYnMrJ3RvcDo1MCU7bWFyZ2luLXRvcDotMjBweDtoZWlnaHQ6NDBweDt3aWR0aDozMHB4O2JhY2tncm91bmQ6I2ZmZjtsZWZ0OjIwcHg7ZGlzcGxheTpub25lO3RleHQtYWxpZ246Y2VudGVyO2NvbG9yOiMwMDA7Zm9udDpib2xkIDE2cHgvMzZweCBhcmlhbCxzYW5zLXNlcmlmJywKCQkJCQluZXh0OiAgICAgICBhYnMrJ3RvcDo1MCU7bWFyZ2luLXRvcDotMjBweDtoZWlnaHQ6NDBweDt3aWR0aDozMHB4O2JhY2tncm91bmQ6I2ZmZjtyaWdodDoyMHB4O2xlZnQ6YXV0bztkaXNwbGF5Om5vbmU7Zm9udDpib2xkIDE2cHgvMzZweCBhcmlhbCxzYW5zLXNlcmlmO3RleHQtYWxpZ246Y2VudGVyO2NvbG9yOiMwMDAnLAoJCQkJCXRpdGxlOiAgICAgICdmbG9hdDpsZWZ0JywKCQkJCQljb3VudGVyOiAgICAnZmxvYXQ6cmlnaHQ7bWFyZ2luLWxlZnQ6OHB4OycKCQkJCX0sCgkJCQlob3ZlciA9IGZ1bmN0aW9uKGVsZW0pIHsKCQkJCQlyZXR1cm4gZWxlbS5ob3ZlcigKCQkJCQkJZnVuY3Rpb24oKSB7ICQodGhpcykuY3NzKCAnY29sb3InLCAnI2JiYicgKTsgfSwKCQkJCQkJZnVuY3Rpb24oKSB7ICQodGhpcykuY3NzKCAnY29sb3InLCAnIzQ0NCcgKTsgfQoJCQkJCSk7CgkJCQl9LAoJCQkJYXBwZW5kcyA9IHt9OwoKCQkJLy8gSUU4IGZpeCBmb3IgSUUncyB0cmFuc3BhcmVudCBiYWNrZ3JvdW5kIGV2ZW50ICJmZWF0dXJlIgoJCQlpZiAoIElFID09PSA4ICkgewoJCQkJY3NzTWFwLm5leHRob2xkZXIgKz0gJ2JhY2tncm91bmQ6IzAwMDtmaWx0ZXI6YWxwaGEob3BhY2l0eT0wKTsnOwoJCQkJY3NzTWFwLnByZXZob2xkZXIgKz0gJ2JhY2tncm91bmQ6IzAwMDtmaWx0ZXI6YWxwaGEob3BhY2l0eT0wKTsnOwoJCQl9CgoJCQkvLyBjcmVhdGUgYW5kIGluc2VydCBDU1MKCQkJJC5lYWNoKGNzc01hcCwgZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CgkJCQljc3MgKz0gJy5nYWxsZXJpYS0nK3ByZWZpeCtrZXkrJ3snK3ZhbHVlKyd9JzsKCQkJfSk7CgoJCQlVdGlscy5pbnNlcnRTdHlsZVRhZyggY3NzICk7CgoJCQkvLyBjcmVhdGUgdGhlIGVsZW1lbnRzCgkJCSQuZWFjaChlbGVtcy5zcGxpdCgnICcpLCBmdW5jdGlvbiggaSwgZWxlbUlkICkgewoJCQkJc2VsZi5hZGRFbGVtZW50KCAnbGlnaHRib3gtJyArIGVsZW1JZCApOwoJCQkJZWxbIGVsZW1JZCBdID0gbGlnaHRib3guZWxlbXNbIGVsZW1JZCBdID0gc2VsZi5nZXQoICdsaWdodGJveC0nICsgZWxlbUlkICk7CgkJCX0pOwoKCQkJLy8gaW5pdGlhdGUgdGhlIGltYWdlCgkJCWxpZ2h0Ym94LmltYWdlID0gbmV3IEdhbGxlcmlhLlBpY3R1cmUoKTsKCgkJCS8vIGFwcGVuZCB0aGUgZWxlbWVudHMKCQkJJC5lYWNoKHsKCQkJCQlib3g6ICdzaGFkb3cgY29udGVudCBjbG9zZSBwcmV2aG9sZGVyIG5leHRob2xkZXInLAoJCQkJCWluZm86ICd0aXRsZSBjb3VudGVyJywKCQkJCQljb250ZW50OiAnaW5mbyBpbWFnZScsCgkJCQkJcHJldmhvbGRlcjogJ3ByZXYnLAoJCQkJCW5leHRob2xkZXI6ICduZXh0JwoJCQkJfSwgZnVuY3Rpb24oIGtleSwgdmFsICkgewoJCQkJCXZhciBhcnIgPSBbXTsKCQkJCQkkLmVhY2goIHZhbC5zcGxpdCgnICcpLCBmdW5jdGlvbiggaSwgcHJvcCApIHsKCQkJCQkJYXJyLnB1c2goIHByZWZpeCArIHByb3AgKTsKCQkJCQl9KTsKCQkJCQlhcHBlbmRzWyBwcmVmaXgra2V5IF0gPSBhcnI7CgkJCX0pOwoKCQkJc2VsZi5hcHBlbmQoIGFwcGVuZHMgKTsKCgkJCSQoIGVsLmltYWdlICkuYXBwZW5kKCBsaWdodGJveC5pbWFnZS5jb250YWluZXIgKTsKCgkJCSQoIERPTSgpLmJvZHkgKS5hcHBlbmQoIGVsLm92ZXJsYXksIGVsLmJveCApOwoKCQkJVXRpbHMub3B0aW1pemVUb3VjaCggZWwuYm94ICk7CgoJCQkvLyBhZGQgdGhlIHByZXYvbmV4dCBuYXYgYW5kIGJpbmQgc29tZSBjb250cm9scwoKCQkJaG92ZXIoICQoIGVsLmNsb3NlICkuYmluZCggJ2NsaWNrJywgbGlnaHRib3guaGlkZSApLmh0bWwoJyYjMjE1OycpICk7CgoJCQkkLmVhY2goIFsnUHJldicsJ05leHQnXSwgZnVuY3Rpb24oaSwgZGlyKSB7CgoJCQkJdmFyICRkID0gJCggZWxbIGRpci50b0xvd2VyQ2FzZSgpIF0gKS5odG1sKCAvdi8udGVzdCggZGlyICkgPyAnJiM4MjQ5OyZuYnNwOycgOiAnJm5ic3A7JiM4MjUwOycgKSwKCQkJCQkkZSA9ICQoIGVsWyBkaXIudG9Mb3dlckNhc2UoKSsnaG9sZGVyJ10gKTsKCgkJCQkkZS5iaW5kKCAnY2xpY2snLCBmdW5jdGlvbigpIHsKCQkJCQlsaWdodGJveFsgJ3Nob3cnICsgZGlyIF0oKTsKCQkJCX0pOwoKCQkJCS8vIElFNyBhbmQgdG91Y2ggZGV2aWNlcyB3aWxsIHNpbXBseSBzaG93IHRoZSBuYXYKCQkJCWlmICggSUUgPCA4IHx8IEdhbGxlcmlhLlRPVUNIICkgewoJCQkJCSRkLnNob3coKTsKCQkJCQlyZXR1cm47CgkJCQl9CgoJCQkJJGUuaG92ZXIoIGZ1bmN0aW9uKCkgewoJCQkJCSRkLnNob3coKTsKCQkJCX0sIGZ1bmN0aW9uKGUpIHsKCQkJCQkkZC5zdG9wKCkuZmFkZU91dCggMjAwICk7CgkJCQl9KTsKCgkJCX0pOwoJCQkkKCBlbC5vdmVybGF5ICkuYmluZCggJ2NsaWNrJywgbGlnaHRib3guaGlkZSApOwoKCQkJLy8gdGhlIGxpZ2h0Ym94IGFuaW1hdGlvbiBpcyBzbG93IG9uIGlwYWQKCQkJaWYgKCBHYWxsZXJpYS5JUEFEICkgewoJCQkJc2VsZi5fb3B0aW9ucy5saWdodGJveFRyYW5zaXRpb25TcGVlZCA9IDA7CgkJCX0KCgkJfSwKCgkJcmVzY2FsZTogZnVuY3Rpb24oZXZlbnQpIHsKCgkJCS8vIGNhbGN1bGF0ZQoJCQkgdmFyIHdpZHRoID0gTWF0aC5taW4oICR3aW4ud2lkdGgoKS00MCwgbGlnaHRib3gud2lkdGggKSwKCQkJCWhlaWdodCA9IE1hdGgubWluKCAkd2luLmhlaWdodCgpLTYwLCBsaWdodGJveC5oZWlnaHQgKSwKCQkJCXJhdGlvID0gTWF0aC5taW4oIHdpZHRoIC8gbGlnaHRib3gud2lkdGgsIGhlaWdodCAvIGxpZ2h0Ym94LmhlaWdodCApLAoJCQkJZGVzdFdpZHRoID0gTWF0aC5yb3VuZCggbGlnaHRib3gud2lkdGggKiByYXRpbyApICsgNDAsCgkJCQlkZXN0SGVpZ2h0ID0gTWF0aC5yb3VuZCggbGlnaHRib3guaGVpZ2h0ICogcmF0aW8gKSArIDYwLAoJCQkJdG8gPSB7CgkJCQkJd2lkdGg6IGRlc3RXaWR0aCwKCQkJCQloZWlnaHQ6IGRlc3RIZWlnaHQsCgkJCQkJJ21hcmdpbi10b3AnOiBNYXRoLmNlaWwoIGRlc3RIZWlnaHQgLyAyICkgKi0gMSwKCQkJCQknbWFyZ2luLWxlZnQnOiBNYXRoLmNlaWwoIGRlc3RXaWR0aCAvIDIgKSAqLSAxCgkJCQl9OwoKCQkJLy8gaWYgcmVzY2FsZSBldmVudCwgZG9uJ3QgYW5pbWF0ZQoJCQlpZiAoIGV2ZW50ICkgewoJCQkJJCggbGlnaHRib3guZWxlbXMuYm94ICkuY3NzKCB0byApOwoJCQl9IGVsc2UgewoJCQkJJCggbGlnaHRib3guZWxlbXMuYm94ICkuYW5pbWF0ZSggdG8sIHsKCQkJCQlkdXJhdGlvbjogc2VsZi5fb3B0aW9ucy5saWdodGJveFRyYW5zaXRpb25TcGVlZCwKCQkJCQllYXNpbmc6IHNlbGYuX29wdGlvbnMuZWFzaW5nLAoJCQkJCWNvbXBsZXRlOiBmdW5jdGlvbigpIHsKCQkJCQkJdmFyIGltYWdlID0gbGlnaHRib3guaW1hZ2UsCgkJCQkJCQlzcGVlZCA9IHNlbGYuX29wdGlvbnMubGlnaHRib3hGYWRlU3BlZWQ7CgoJCQkJCQlzZWxmLnRyaWdnZXIoewoJCQkJCQkJdHlwZTogR2FsbGVyaWEuTElHSFRCT1hfSU1BR0UsCgkJCQkJCQlpbWFnZVRhcmdldDogaW1hZ2UuaW1hZ2UKCQkJCQkJfSk7CgoJCQkJCQkkKCBpbWFnZS5jb250YWluZXIgKS5zaG93KCk7CgoJCQkJCQlVdGlscy5zaG93KCBpbWFnZS5pbWFnZSwgc3BlZWQgKTsKCQkJCQkJVXRpbHMuc2hvdyggbGlnaHRib3guZWxlbXMuaW5mbywgc3BlZWQgKTsKCQkJCQl9CgkJCQl9KTsKCQkJfQoJCX0sCgoJCWhpZGU6IGZ1bmN0aW9uKCkgewoKCQkJLy8gcmVtb3ZlIHRoZSBpbWFnZQoJCQlsaWdodGJveC5pbWFnZS5pbWFnZSA9IG51bGw7CgoJCQkkd2luLnVuYmluZCgncmVzaXplJywgbGlnaHRib3gucmVzY2FsZSk7CgoJCQkkKCBsaWdodGJveC5lbGVtcy5ib3ggKS5oaWRlKCk7CgoJCQlVdGlscy5oaWRlKCBsaWdodGJveC5lbGVtcy5pbmZvICk7CgoJCQlzZWxmLmRldGFjaEtleWJvYXJkKCk7CgkJCXNlbGYuYXR0YWNoS2V5Ym9hcmQoIGxpZ2h0Ym94LmtleW1hcCApOwoKCQkJbGlnaHRib3gua2V5bWFwID0gZmFsc2U7CgoJCQlVdGlscy5oaWRlKCBsaWdodGJveC5lbGVtcy5vdmVybGF5LCAyMDAsIGZ1bmN0aW9uKCkgewoJCQkJJCggdGhpcyApLmhpZGUoKS5jc3MoICdvcGFjaXR5Jywgc2VsZi5fb3B0aW9ucy5vdmVybGF5T3BhY2l0eSApOwoJCQkJc2VsZi50cmlnZ2VyKCBHYWxsZXJpYS5MSUdIVEJPWF9DTE9TRSApOwoJCQl9KTsKCQl9LAoKCQlzaG93TmV4dDogZnVuY3Rpb24oKSB7CgkJCWxpZ2h0Ym94LnNob3coIHNlbGYuZ2V0TmV4dCggbGlnaHRib3guYWN0aXZlICkgKTsKCQl9LAoKCQlzaG93UHJldjogZnVuY3Rpb24oKSB7CgkJCWxpZ2h0Ym94LnNob3coIHNlbGYuZ2V0UHJldiggbGlnaHRib3guYWN0aXZlICkgKTsKCQl9LAoKCQlzaG93OiBmdW5jdGlvbihpbmRleCkgewoKCQkJbGlnaHRib3guYWN0aXZlID0gaW5kZXggPSB0eXBlb2YgaW5kZXggPT09ICdudW1iZXInID8gaW5kZXggOiBzZWxmLmdldEluZGV4KCk7CgoJCQlpZiAoICFsaWdodGJveC5pbml0aWFsaXplZCApIHsKCQkJCWxpZ2h0Ym94LmluaXQoKTsKCQkJfQoKCQkJLy8gdGVtcG9yYXJpbHkgYXR0YWNoIHNvbWUga2V5cwoJCQkvLyBzYXZlIHRoZSBvbGQgb25lcyBmaXJzdCBpbiBhIGNsb25lZCBvYmplY3QKCQkJaWYgKCAhbGlnaHRib3gua2V5bWFwICkgewoKCQkJCWxpZ2h0Ym94LmtleW1hcCA9ICQuZXh0ZW5kKHt9LCBzZWxmLl9rZXlib2FyZC5tYXApOwoKCQkJCXNlbGYuYXR0YWNoS2V5Ym9hcmQoewoJCQkJCWVzY2FwZTogbGlnaHRib3guaGlkZSwKCQkJCQlyaWdodDogbGlnaHRib3guc2hvd05leHQsCgkJCQkJbGVmdDogbGlnaHRib3guc2hvd1ByZXYKCQkJCX0pOwoJCQl9CgoJCQkkd2luLnVuYmluZCgncmVzaXplJywgbGlnaHRib3gucmVzY2FsZSApOwoKCQkJdmFyIGRhdGEgPSBzZWxmLmdldERhdGEoaW5kZXgpLAoJCQkJdG90YWwgPSBzZWxmLmdldERhdGFMZW5ndGgoKSwKCQkJCW4gPSBzZWxmLmdldE5leHQoIGluZGV4ICksCgkJCQluZGF0YSwgcCwgaTsKCgkJCVV0aWxzLmhpZGUoIGxpZ2h0Ym94LmVsZW1zLmluZm8gKTsKCgkJCXRyeSB7CgkJCQlmb3IgKCBpID0gc2VsZi5fb3B0aW9ucy5wcmVsb2FkOyBpID4gMDsgaS0tICkgewoJCQkJCXAgPSBuZXcgR2FsbGVyaWEuUGljdHVyZSgpOwoJCQkJCW5kYXRhID0gc2VsZi5nZXREYXRhKCBuICk7CgkJCQkJcC5wcmVsb2FkKCAnYmlnJyBpbiBuZGF0YSA/IG5kYXRhLmJpZyA6IG5kYXRhLmltYWdlICk7CgkJCQkJbiA9IHNlbGYuZ2V0TmV4dCggbiApOwoJCQkJfQoJCQl9IGNhdGNoKGUpIHt9CgoJCQlsaWdodGJveC5pbWFnZS5sb2FkKCBkYXRhLmJpZyB8fCBkYXRhLmltYWdlLCBmdW5jdGlvbiggaW1hZ2UgKSB7CgoJCQkJbGlnaHRib3gud2lkdGggPSBpbWFnZS5vcmlnaW5hbC53aWR0aDsKCQkJCWxpZ2h0Ym94LmhlaWdodCA9IGltYWdlLm9yaWdpbmFsLmhlaWdodDsKCgkJCQkkKCBpbWFnZS5pbWFnZSApLmNzcyh7CgkJCQkJd2lkdGg6ICcxMDAuNSUnLAoJCQkJCWhlaWdodDogJzEwMC41JScsCgkJCQkJdG9wOiAwLAoJCQkJCXpJbmRleDogOTk5OTgKCQkJCX0pOwoKCQkJCVV0aWxzLmhpZGUoIGltYWdlLmltYWdlICk7CgoJCQkJbGlnaHRib3guZWxlbXMudGl0bGUuaW5uZXJIVE1MID0gZGF0YS50aXRsZSB8fCAnJzsKCQkJCWxpZ2h0Ym94LmVsZW1zLmNvdW50ZXIuaW5uZXJIVE1MID0gKGluZGV4ICsgMSkgKyAnIC8gJyArIHRvdGFsOwoJCQkJJHdpbi5yZXNpemUoIGxpZ2h0Ym94LnJlc2NhbGUgKTsKCQkJCWxpZ2h0Ym94LnJlc2NhbGUoKTsKCQkJfSk7CgoJCQkkKCBsaWdodGJveC5lbGVtcy5vdmVybGF5ICkuc2hvdygpOwoJCQkkKCBsaWdodGJveC5lbGVtcy5ib3ggKS5zaG93KCk7CgkJfQoJfTsKCglyZXR1cm4gdGhpczsKfTsKCi8vIGVuZCBHYWxsZXJpYSBjb25zdHJ1Y3RvcgoKR2FsbGVyaWEucHJvdG90eXBlID0gewoKCS8vIGJyaW5nIGJhY2sgdGhlIGNvbnN0cnVjdG9yIHJlZmVyZW5jZQoKCWNvbnN0cnVjdG9yOiBHYWxsZXJpYSwKCgkvKioKCQlVc2UgdGhpcyBmdW5jdGlvbiB0byBpbml0aWFsaXplIHRoZSBnYWxsZXJ5IGFuZCBzdGFydCBsb2FkaW5nLgoJCVNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlIHBlciBpbnN0YW5jZS4KCgkJQHBhcmFtIHtIVE1MRWxlbWVudH0gdGFyZ2V0IFRoZSB0YXJnZXQgZWxlbWVudAoJCUBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFRoZSBnYWxsZXJ5IG9wdGlvbnMKCgkJQHJldHVybnMgSW5zdGFuY2UKCSovCgoJaW5pdDogZnVuY3Rpb24oIHRhcmdldCwgb3B0aW9ucyApIHsKCgkJdmFyIHNlbGYgPSB0aGlzOwoKCQlvcHRpb25zID0gX2xlZ2FjeU9wdGlvbnMoIG9wdGlvbnMgKTsKCgkJLy8gc2F2ZSB0aGUgb3JpZ2luYWwgaW5ncmVkaWVudHMKCQl0aGlzLl9vcmlnaW5hbCA9IHsKCQkJdGFyZ2V0OiB0YXJnZXQsCgkJCW9wdGlvbnM6IG9wdGlvbnMsCgkJCWRhdGE6IG51bGwKCQl9OwoKCQkvLyBzYXZlIHRoZSB0YXJnZXQgaGVyZQoJCXRoaXMuX3RhcmdldCA9IHRoaXMuX2RvbS50YXJnZXQgPSB0YXJnZXQubm9kZU5hbWUgPyB0YXJnZXQgOiAkKCB0YXJnZXQgKS5nZXQoMCk7CgoJCS8vIHB1c2ggdGhlIGluc3RhbmNlCgkJX2luc3RhbmNlcy5wdXNoKCB0aGlzICk7CgoJCS8vIHJhaXNlIGVycm9yIGlmIG5vIHRhcmdldCBpcyBkZXRlY3RlZAoJCWlmICggIXRoaXMuX3RhcmdldCApIHsKCQkJIEdhbGxlcmlhLnJhaXNlKCdUYXJnZXQgbm90IGZvdW5kLicsIHRydWUpOwoJCQkgcmV0dXJuOwoJCX0KCgkJLy8gYXBwbHkgb3B0aW9ucwoJCXRoaXMuX29wdGlvbnMgPSB7CgkJCWF1dG9wbGF5OiBmYWxzZSwKCQkJY2Fyb3VzZWw6IHRydWUsCgkJCWNhcm91c2VsRm9sbG93OiB0cnVlLAoJCQljYXJvdXNlbFNwZWVkOiA0MDAsCgkJCWNhcm91c2VsU3RlcHM6ICdhdXRvJywKCQkJY2xpY2tuZXh0OiBmYWxzZSwKCQkJZGF0YUNvbmZpZyA6IGZ1bmN0aW9uKCBlbGVtICkgeyByZXR1cm4ge307IH0sCgkJCWRhdGFTZWxlY3RvcjogJ2ltZycsCgkJCWRhdGFTb3VyY2U6IHRoaXMuX3RhcmdldCwKCQkJZGVidWc6IHVuZGVmLAoJCQlkdW1teTogdW5kZWYsIC8vIDEuMi41CgkJCWVhc2luZzogJ2dhbGxlcmlhJywKCQkJZXh0ZW5kOiBmdW5jdGlvbihvcHRpb25zKSB7fSwKCQkJZnVsbHNjcmVlbkNyb3A6IHVuZGVmLCAvLyAxLjIuNQoJCQlmdWxsc2NyZWVuRG91YmxlVGFwOiB0cnVlLCAvLyAxLjIuNCB0b2dnbGVzIGZ1bGxzY3JlZW4gb24gZG91YmxlLXRhcCBmb3IgdG91Y2ggZGV2aWNlcwoJCQlmdWxsc2NyZWVuVHJhbnNpdGlvbjogdW5kZWYsIC8vIDEuMi42CgkJCWhlaWdodDogJ2F1dG8nLAoJCQlpZGxlTW9kZTogdHJ1ZSwgLy8gMS4yLjQgdG9nZ2xlcyBpZGxlTW9kZQoJCQlpZGxlVGltZTogMzAwMCwKCQkJaWRsZVNwZWVkOiAyMDAsCgkJCWltYWdlQ3JvcDogZmFsc2UsCgkJCWltYWdlTWFyZ2luOiAwLAoJCQlpbWFnZVBhbjogZmFsc2UsCgkJCWltYWdlUGFuU21vb3RobmVzczogMTIsCgkJCWltYWdlUG9zaXRpb246ICc1MCUnLAoJCQlpbWFnZVRpbWVvdXQ6IHVuZGVmLCAvLyAxLjIuNQoJCQlpbml0aWFsVHJhbnNpdGlvbjogdW5kZWYsIC8vIDEuMi40LCByZXBsYWNlcyB0cmFuc2l0aW9uSW5pdGlhbAoJCQlrZWVwU291cmNlOiBmYWxzZSwKCQkJbGF5ZXJGb2xsb3c6IHRydWUsIC8vIDEuMi41CgkJCWxpZ2h0Ym94OiBmYWxzZSwgLy8gMS4yLjMKCQkJbGlnaHRib3hGYWRlU3BlZWQ6IDIwMCwKCQkJbGlnaHRib3hUcmFuc2l0aW9uU3BlZWQ6IDIwMCwKCQkJbGlua1NvdXJjZUltYWdlczogdHJ1ZSwKCQkJbWF4U2NhbGVSYXRpbzogdW5kZWYsCgkJCW1pblNjYWxlUmF0aW86IHVuZGVmLAoJCQlvdmVybGF5T3BhY2l0eTogMC44NSwKCQkJb3ZlcmxheUJhY2tncm91bmQ6ICcjMGIwYjBiJywKCQkJcGF1c2VPbkludGVyYWN0aW9uOiB0cnVlLAoJCQlwb3B1cExpbmtzOiBmYWxzZSwKCQkJcHJlbG9hZDogMiwKCQkJcXVldWU6IHRydWUsCgkJCXNob3c6IDAsCgkJCXNob3dJbmZvOiB0cnVlLAoJCQlzaG93Q291bnRlcjogdHJ1ZSwKCQkJc2hvd0ltYWdlbmF2OiB0cnVlLAoJCQlzd2lwZTogdHJ1ZSwgLy8gMS4yLjQKCQkJdGh1bWJDcm9wOiB0cnVlLAoJCQl0aHVtYkV2ZW50VHlwZTogJ2NsaWNrJywKCQkJdGh1bWJGaXQ6IHRydWUsCgkJCXRodW1iTWFyZ2luOiAwLAoJCQl0aHVtYlF1YWxpdHk6ICdhdXRvJywKCQkJdGh1bWJuYWlsczogdHJ1ZSwKCQkJdG91Y2hUcmFuc2l0aW9uOiB1bmRlZiwgLy8gMS4yLjYKCQkJdHJhbnNpdGlvbjogJ2ZhZGUnLAoJCQl0cmFuc2l0aW9uSW5pdGlhbDogdW5kZWYsIC8vIGxlZ2FjeSwgZGVwcmVjYXRlIGluIDEuMy4gVXNlIGluaXRpYWxUcmFuc2l0aW9uIGluc3RlYWQuCgkJCXRyYW5zaXRpb25TcGVlZDogNDAwLAoJCQl1c2VDYW52YXM6IGZhbHNlLCAvLyAxLjIuNAoJCQl3aWR0aDogJ2F1dG8nCgkJfTsKCgkJLy8gbGVnYWN5IHN1cHBvcnQgZm9yIHRyYW5zaXRpb25Jbml0aWFsCgkJdGhpcy5fb3B0aW9ucy5pbml0aWFsVHJhbnNpdGlvbiA9IHRoaXMuX29wdGlvbnMuaW5pdGlhbFRyYW5zaXRpb24gfHwgdGhpcy5fb3B0aW9ucy50cmFuc2l0aW9uSW5pdGlhbDsKCgkJLy8gdHVybiBvZmYgZGVidWcKCQlpZiAoIG9wdGlvbnMgJiYgb3B0aW9ucy5kZWJ1ZyA9PT0gZmFsc2UgKSB7CgkJCURFQlVHID0gZmFsc2U7CgkJfQoKCQkvLyBzZXQgdGltZW91dAoJCWlmICggb3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5pbWFnZVRpbWVvdXQgPT09ICdudW1iZXInICkgewoJCQlUSU1FT1VUID0gb3B0aW9ucy5pbWFnZVRpbWVvdXQ7CgkJfQoKCQkvLyBzZXQgZHVtbXkKCQlpZiAoIG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMuZHVtbXkgPT09ICdzdHJpbmcnICkgewoJCQlEVU1NWSA9IG9wdGlvbnMuZHVtbXk7CgkJfQoKCQkvLyBoaWRlIGFsbCBjb250ZW50CgkJJCggdGhpcy5fdGFyZ2V0ICkuY2hpbGRyZW4oKS5oaWRlKCk7CgoJCS8vIG5vdyB3ZSBqdXN0IGhhdmUgdG8gd2FpdCBmb3IgdGhlIHRoZW1lLi4uCgkJaWYgKCB0eXBlb2YgR2FsbGVyaWEudGhlbWUgPT09ICdvYmplY3QnICkgewoJCQl0aGlzLl9pbml0KCk7CgkJfSBlbHNlIHsKCQkJLy8gcHVzaCB0aGUgaW5zdGFuY2UgaW50byB0aGUgcG9vbCBhbmQgcnVuIGl0IHdoZW4gdGhlIHRoZW1lIGlzIHJlYWR5CgkJCV9wb29sLnB1c2goIHRoaXMgKTsKCQl9CgoJCXJldHVybiB0aGlzOwoJfSwKCgkvLyB0aGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgb25jZSBwZXIgaW5zdGFuY2UKCS8vIGZvciBtYW5pcHVsYXRpb24gb2YgZGF0YSwgdXNlIHRoZSAubG9hZCBtZXRob2QKCglfaW5pdDogZnVuY3Rpb24oKSB7CgoJCXZhciBzZWxmID0gdGhpcywKCQkJb3B0aW9ucyA9IHRoaXMuX29wdGlvbnM7CgoJCWlmICggdGhpcy5faW5pdGlhbGl6ZWQgKSB7CgkJCUdhbGxlcmlhLnJhaXNlKCAnSW5pdCBmYWlsZWQ6IEdhbGxlcnkgaW5zdGFuY2UgYWxyZWFkeSBpbml0aWFsaXplZC4nICk7CgkJCXJldHVybiB0aGlzOwoJCX0KCgkJdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlOwoKCQlpZiAoICFHYWxsZXJpYS50aGVtZSApIHsKCQkJR2FsbGVyaWEucmFpc2UoICdJbml0IGZhaWxlZDogTm8gdGhlbWUgZm91bmQuJyApOwoJCQlyZXR1cm4gdGhpczsKCQl9CgoJCS8vIG1lcmdlIHRoZSB0aGVtZSAmIGNhbGxlciBvcHRpb25zCgkJJC5leHRlbmQoIHRydWUsIG9wdGlvbnMsIEdhbGxlcmlhLnRoZW1lLmRlZmF1bHRzLCB0aGlzLl9vcmlnaW5hbC5vcHRpb25zICk7CgoJCS8vIGNoZWNrIGZvciBjYW52YXMgc3VwcG9ydAoJCShmdW5jdGlvbiggY2FuICkgewoKCQkJaWYgKCAhKCAnZ2V0Q29udGV4dCcgaW4gY2FuICkgKSB7CgkJCQljYW4gPSBudWxsOwoJCQkJcmV0dXJuOwoJCQl9CgoJCQlfY2FudmFzID0gX2NhbnZhcyB8fCB7CgkJCQllbGVtOiBjYW4sCgkJCQljb250ZXh0OiBjYW4uZ2V0Q29udGV4dCggJzJkJyApLAoJCQkJY2FjaGU6IHt9LAoJCQkJbGVuZ3RoOiAwCgkJCX07CgoJCX0oIGRvYy5jcmVhdGVFbGVtZW50KCAnY2FudmFzJyApICkgKTsKCgkJLy8gYmluZCB0aGUgZ2FsbGVyeSB0byBydW4gd2hlbiBkYXRhIGlzIHJlYWR5CgkJdGhpcy5iaW5kKCBHYWxsZXJpYS5EQVRBLCBmdW5jdGlvbigpIHsKCgkJCS8vIFdhcm4gZm9yIHF1aXJrcyBtb2RlCgkJCWlmICggR2FsbGVyaWEuUVVJUksgKSB7CgkJCQlHYWxsZXJpYS5yYWlzZSgnWW91ciBwYWdlIGlzIGluIFF1aXJrcyBtb2RlLCBHYWxsZXJpYSBtYXkgbm90IHJlbmRlciBjb3JyZWN0bHkuIFBsZWFzZSB2YWxpZGF0ZSB5b3VyIEhUTUwuJyk7CgkJCX0KCgkJCS8vIHNhdmUgdGhlIG5ldyBkYXRhCgkJCXRoaXMuX29yaWdpbmFsLmRhdGEgPSB0aGlzLl9kYXRhOwoKCQkJLy8gbGV0cyBzaG93IHRoZSBjb3VudGVyIGhlcmUKCQkJdGhpcy5nZXQoJ3RvdGFsJykuaW5uZXJIVE1MID0gdGhpcy5nZXREYXRhTGVuZ3RoKCk7CgoJCQkvLyBjYWNoZSB0aGUgY29udGFpbmVyCgkJCXZhciAkY29udGFpbmVyID0gdGhpcy4kKCAnY29udGFpbmVyJyApOwoKCQkJLy8gdGhlIGdhbGxlcnkgaXMgcmVhZHksIGxldCdzIGp1c3Qgd2FpdCBmb3IgdGhlIGNzcwoJCQl2YXIgbnVtID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwIH07CgkJCXZhciB0ZXN0SGVpZ2h0ID0gZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gc2VsZi4kKCAnc3RhZ2UnICkuaGVpZ2h0KCk7CgkJCX07CgoJCQkvLyBjaGVjayBjb250YWluZXIgYW5kIHRodW1ibmFpbCBoZWlnaHQKCQkJVXRpbHMud2FpdCh7CgkJCQl1bnRpbDogZnVuY3Rpb24oKSB7CgoJCQkJCS8vIGtlZXAgdHJ5aW5nIHRvIGdldCB0aGUgdmFsdWUKCQkJCQkkLmVhY2goWyd3aWR0aCcsICdoZWlnaHQnXSwgZnVuY3Rpb24oIGksIG0gKSB7CgoJCQkJCQkvLyBmaXJzdCBjaGVjayBpZiBvcHRpb25zIGlzIHNldAoKCQkJCQkJaWYgKCBvcHRpb25zWyBtIF0gJiYgdHlwZW9mIG9wdGlvbnNbIG0gXSA9PT0gJ251bWJlcicgKSB7CgkJCQkJCQludW1bIG0gXSA9IG9wdGlvbnNbIG0gXTsKCQkJCQkJfSBlbHNlIHsKCgkJCQkJCQkvLyBlbHNlIGV4dHJhY3QgdGhlIG1lYXN1cmVzIGZyb20gZGlmZmVyZW50IHNvdXJjZXMgYW5kIGdyYWIgdGhlIGhpZ2hlc3QgdmFsdWUKCQkJCQkJCW51bVsgbSBdID0gTWF0aC5tYXgoCgkJCQkJCQkJVXRpbHMucGFyc2VWYWx1ZSggJGNvbnRhaW5lci5jc3MoIG0gKSApLCAgICAgICAgIC8vIDEuIHRoZSBjb250YWluZXIgY3NzCgkJCQkJCQkJVXRpbHMucGFyc2VWYWx1ZSggc2VsZi4kKCAndGFyZ2V0JyApLmNzcyggbSApICksIC8vIDIuIHRoZSB0YXJnZXQgY3NzCgkJCQkJCQkJJGNvbnRhaW5lclsgbSBdKCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMuIHRoZSBjb250YWluZXIgalF1ZXJ5IG1ldGhvZAoJCQkJCQkJCXNlbGYuJCggJ3RhcmdldCcgKVsgbSBdKCkgICAgICAgICAgICAgICAgICAgICAgICAvLyA0LiB0aGUgY29udGFpbmVyIGpRdWVyeSBtZXRob2QKCQkJCQkJCSk7CgkJCQkJCX0KCgkJCQkJCS8vIGFwcGx5IHRoZSBuZXcgbWVhc3VyZXMKCQkJCQkJJGNvbnRhaW5lclsgbSBdKCBudW1bIG0gXSApOwoKCQkJCQl9KTsKCgkJCQkJcmV0dXJuIHRlc3RIZWlnaHQoKSAmJiBudW0ud2lkdGggJiYgbnVtLmhlaWdodCA+IDEwOwoKCQkJCX0sCgkJCQlzdWNjZXNzOiBmdW5jdGlvbigpIHsKCgkJCQkJLy8gZm9yIHNvbWUgc3RyYW5nZSByZWFzb24sIHdlYmtpdCBuZWVkcyBhIHNpbmdsZSBzZXRUaW1lb3V0IHRvIHBsYXkgYmFsbAoJCQkJCWlmICggR2FsbGVyaWEuV0VCS0lUICkgewoJCQkJCQl3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7CgkJCQkJCQlzZWxmLl9ydW4oKTsKCQkJCQkJfSwgMSk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJc2VsZi5fcnVuKCk7CgkJCQkJfQoJCQkJfSwKCQkJCWVycm9yOiBmdW5jdGlvbigpIHsKCgkJCQkJLy8gSGVpZ2h0IHdhcyBwcm9iYWJseSBub3Qgc2V0LCByYWlzZSBoYXJkIGVycm9ycwoKCQkJCQlpZiAoIHRlc3RIZWlnaHQoKSApIHsKCQkJCQkJR2FsbGVyaWEucmFpc2UoJ0NvdWxkIG5vdCBleHRyYWN0IHN1ZmZpY2llbnQgd2lkdGgvaGVpZ2h0IG9mIHRoZSBnYWxsZXJ5IGNvbnRhaW5lci4gVHJhY2VkIG1lYXN1cmVzOiB3aWR0aDonICsgbnVtLndpZHRoICsgJ3B4LCBoZWlnaHQ6ICcgKyBudW0uaGVpZ2h0ICsgJ3B4LicsIHRydWUpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCUdhbGxlcmlhLnJhaXNlKCdDb3VsZCBub3QgZXh0cmFjdCBhIHN0YWdlIGhlaWdodCBmcm9tIHRoZSBDU1MuIFRyYWNlZCBoZWlnaHQ6ICcgKyB0ZXN0SGVpZ2h0KCkgKyAncHguJywgdHJ1ZSk7CgkJCQkJfQoJCQkJfSwKCQkJCXRpbWVvdXQ6IDEwMDAwCgkJCX0pOwoJCX0pOwoKCQkvLyBidWlsZCB0aGUgZ2FsbGVyeSBmcmFtZQoJCXRoaXMuYXBwZW5kKHsKCQkJJ2luZm8tdGV4dCcgOgoJCQkJWydpbmZvLXRpdGxlJywgJ2luZm8tZGVzY3JpcHRpb24nXSwKCQkJJ2luZm8nIDoKCQkJCVsnaW5mby10ZXh0J10sCgkJCSdpbWFnZS1uYXYnIDoKCQkJCVsnaW1hZ2UtbmF2LXJpZ2h0JywgJ2ltYWdlLW5hdi1sZWZ0J10sCgkJCSdzdGFnZScgOgoJCQkJWydpbWFnZXMnLCAnbG9hZGVyJywgJ2NvdW50ZXInLCAnaW1hZ2UtbmF2J10sCgkJCSd0aHVtYm5haWxzLWxpc3QnIDoKCQkJCVsndGh1bWJuYWlscyddLAoJCQkndGh1bWJuYWlscy1jb250YWluZXInIDoKCQkJCVsndGh1bWItbmF2LWxlZnQnLCAndGh1bWJuYWlscy1saXN0JywgJ3RodW1iLW5hdi1yaWdodCddLAoJCQknY29udGFpbmVyJyA6CgkJCQlbJ3N0YWdlJywgJ3RodW1ibmFpbHMtY29udGFpbmVyJywgJ2luZm8nLCAndG9vbHRpcCddCgkJfSk7CgoJCVV0aWxzLmhpZGUoIHRoaXMuJCggJ2NvdW50ZXInICkuYXBwZW5kKAoJCQl0aGlzLmdldCggJ2N1cnJlbnQnICksCgkJCWRvYy5jcmVhdGVUZXh0Tm9kZSgnIC8gJyksCgkJCXRoaXMuZ2V0KCAndG90YWwnICkKCQkpICk7CgoJCXRoaXMuc2V0Q291bnRlcignJiM4MjExOycpOwoKCQlVdGlscy5oaWRlKCBzZWxmLmdldCgndG9vbHRpcCcpICk7CgoJCS8vIGFkZCBhIG5vdG91Y2ggY2xhc3Mgb24gdGhlIGNvbnRhaW5lciB0byBwcmV2ZW50IHVud2FudGVkIDpob3ZlcnMgb24gdG91Y2ggZGV2aWNlcwoJCXRoaXMuJCggJ2NvbnRhaW5lcicgKS5hZGRDbGFzcyggR2FsbGVyaWEuVE9VQ0ggPyAndG91Y2gnIDogJ25vdG91Y2gnICk7CgoJCS8vIGFkZCBpbWFnZXMgdG8gdGhlIGNvbnRyb2xzCgkJJC5lYWNoKCBuZXcgQXJyYXkoMiksIGZ1bmN0aW9uKCBpICkgewoKCQkJLy8gY3JlYXRlIGEgbmV3IFBpY3R1cmUgaW5zdGFuY2UKCQkJdmFyIGltYWdlID0gbmV3IEdhbGxlcmlhLlBpY3R1cmUoKTsKCgkJCS8vIGFwcGx5IHNvbWUgc3R5bGVzLCBjcmVhdGUgJiBwcmVwZW5kIG92ZXJsYXkKCQkJJCggaW1hZ2UuY29udGFpbmVyICkuY3NzKHsKCQkJCXBvc2l0aW9uOiAnYWJzb2x1dGUnLAoJCQkJdG9wOiAwLAoJCQkJbGVmdDogMAoJCQl9KS5wcmVwZW5kKCBzZWxmLl9sYXllcnNbaV0gPSAkKCBVdGlscy5jcmVhdGUoJ2dhbGxlcmlhLWxheWVyJykgKS5jc3MoewoJCQkJcG9zaXRpb246ICdhYnNvbHV0ZScsCgkJCQl0b3A6MCwgbGVmdDowLCByaWdodDowLCBib3R0b206MCwKCQkJCXpJbmRleDoyCgkJCX0pWzBdICk7CgoJCQkvLyBhcHBlbmQgdGhlIGltYWdlCgkJCXNlbGYuJCggJ2ltYWdlcycgKS5hcHBlbmQoIGltYWdlLmNvbnRhaW5lciApOwoKCQkJLy8gcmVsb2FkIHRoZSBjb250cm9scwoJCQlzZWxmLl9jb250cm9sc1tpXSA9IGltYWdlOwoKCQl9KTsKCgkJLy8gc29tZSBmb3JjZWQgZ2VuZXJpYyBzdHlsaW5nCgkJdGhpcy4kKCAnaW1hZ2VzJyApLmNzcyh7CgkJCXBvc2l0aW9uOiAncmVsYXRpdmUnLAoJCQl0b3A6IDAsCgkJCWxlZnQ6IDAsCgkJCXdpZHRoOiAnMTAwJScsCgkJCWhlaWdodDogJzEwMCUnCgkJfSk7CgoJCXRoaXMuJCggJ3RodW1ibmFpbHMsIHRodW1ibmFpbHMtbGlzdCcgKS5jc3MoewoJCQlvdmVyZmxvdzogJ2hpZGRlbicsCgkJCXBvc2l0aW9uOiAncmVsYXRpdmUnCgkJfSk7CgoJCS8vIGJpbmQgaW1hZ2UgbmF2aWdhdGlvbiBhcnJvd3MKCQl0aGlzLiQoICdpbWFnZS1uYXYtcmlnaHQsIGltYWdlLW5hdi1sZWZ0JyApLmJpbmQoICdjbGljaycsIGZ1bmN0aW9uKGUpIHsKCgkJCS8vIHR1bmUgdGhlIGNsaWNrbmV4dCBvcHRpb24KCQkJaWYgKCBvcHRpb25zLmNsaWNrbmV4dCApIHsKCQkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7CgkJCX0KCgkJCS8vIHBhdXNlIGlmIG9wdGlvbnMgaXMgc2V0CgkJCWlmICggb3B0aW9ucy5wYXVzZU9uSW50ZXJhY3Rpb24gKSB7CgkJCQlzZWxmLnBhdXNlKCk7CgkJCX0KCgkJCS8vIG5hdmlnYXRlCgkJCXZhciBmbiA9IC9yaWdodC8udGVzdCggdGhpcy5jbGFzc05hbWUgKSA/ICduZXh0JyA6ICdwcmV2JzsKCQkJc2VsZlsgZm4gXSgpOwoKCQl9KTsKCgkJLy8gaGlkZSBjb250cm9scyBpZiBjaG9zZW4gdG8KCQkkLmVhY2goIFsnaW5mbycsJ2NvdW50ZXInLCdpbWFnZS1uYXYnXSwgZnVuY3Rpb24oIGksIGVsICkgewoJCQlpZiAoIG9wdGlvbnNbICdzaG93JyArIGVsLnN1YnN0cigwLDEpLnRvVXBwZXJDYXNlKCkgKyBlbC5zdWJzdHIoMSkucmVwbGFjZSgvLS8sJycpIF0gPT09IGZhbHNlICkgewoJCQkJVXRpbHMubW92ZU91dCggc2VsZi5nZXQoIGVsLnRvTG93ZXJDYXNlKCkgKSApOwoJCQl9CgkJfSk7CgoJCS8vIGxvYWQgdXAgdGFyZ2V0IGNvbnRlbnQKCQl0aGlzLmxvYWQoKTsKCgkJLy8gbm93IGl0J3MgdXN1YWxseSBzYWZlIHRvIHJlbW92ZSB0aGUgY29udGVudAoJCS8vIElFIHdpbGwgbmV2ZXIgc3RvcCBsb2FkaW5nIGlmIHdlIHJlbW92ZSBpdCwgc28gbGV0J3Mga2VlcCBpdCBoaWRkZW4gZm9yIElFIChpdCdzIHVzdWFsbHkgZmFzdCBlbm91Z2ggYW55d2F5KQoJCWlmICggIW9wdGlvbnMua2VlcFNvdXJjZSAmJiAhSUUgKSB7CgkJCXRoaXMuX3RhcmdldC5pbm5lckhUTUwgPSAnJzsKCQl9CgoJCS8vIHJlLWFwcGVuZCB0aGUgZXJyb3JzLCBpZiB0aGV5IGhhcHBlbmVkIGJlZm9yZSBjbGVhcmluZwoJCWlmICggdGhpcy5nZXQoICdlcnJvcnMnICkgKSB7CgkJCXRoaXMuYXBwZW5kQ2hpbGQoICd0YXJnZXQnLCAnZXJyb3JzJyApOwoJCX0KCgkJLy8gYXBwZW5kIHRoZSBnYWxsZXJ5IGZyYW1lCgkJdGhpcy5hcHBlbmRDaGlsZCggJ3RhcmdldCcsICdjb250YWluZXInICk7CgoJCS8vIHBhcnNlIHRoZSBjYXJvdXNlbCBvbiBlYWNoIHRodW1iIGxvYWQKCQlpZiAoIG9wdGlvbnMuY2Fyb3VzZWwgKSB7CgkJCXZhciBjb3VudCA9IDAsCgkJCQlzaG93ID0gb3B0aW9ucy5zaG93OwoJCQl0aGlzLmJpbmQoIEdhbGxlcmlhLlRIVU1CTkFJTCwgZnVuY3Rpb24oKSB7CgkJCQl0aGlzLnVwZGF0ZUNhcm91c2VsKCk7CgkJCQlpZiAoICsrY291bnQgPT0gdGhpcy5nZXREYXRhTGVuZ3RoKCkgJiYgdHlwZW9mIHNob3cgPT0gJ251bWJlcicgJiYgc2hvdyA+IDAgKSB7CgkJCQkJdGhpcy5fY2Fyb3VzZWwuZm9sbG93KCBzaG93ICk7CgkJCQl9CgkJCX0pOwoJCX0KCgkJLy8gYmluZCBzd2lwZSBnZXN0dXJlCgkJaWYgKCBvcHRpb25zLnN3aXBlICkgewoKCQkJKGZ1bmN0aW9uKCBpbWFnZXMgKSB7CgoJCQkJdmFyIHN3aXBlU3RhcnQgPSBbMCwwXSwKCQkJCQlzd2lwZVN0b3AgPSBbMCwwXSwKCQkJCQlsaW1pdFggPSAzMCwKCQkJCQlsaW1pdFkgPSAxMDAsCgkJCQkJbXVsdGkgPSBmYWxzZSwKCQkJCQl0aWQgPSAwLAoJCQkJCWRhdGEsCgkJCQkJZXYgPSB7CgkJCQkJCXN0YXJ0OiAndG91Y2hzdGFydCcsCgkJCQkJCW1vdmU6ICd0b3VjaG1vdmUnLAoJCQkJCQlzdG9wOiAndG91Y2hlbmQnCgkJCQkJfSwKCQkJCQlnZXREYXRhID0gZnVuY3Rpb24oZSkgewoJCQkJCQlyZXR1cm4gZS5vcmlnaW5hbEV2ZW50LnRvdWNoZXMgPyBlLm9yaWdpbmFsRXZlbnQudG91Y2hlc1swXSA6IGU7CgkJCQkJfSwKCQkJCQltb3ZlSGFuZGxlciA9IGZ1bmN0aW9uKCBlICkgewoKCQkJCQkJaWYgKCBlLm9yaWdpbmFsRXZlbnQudG91Y2hlcyAmJiBlLm9yaWdpbmFsRXZlbnQudG91Y2hlcy5sZW5ndGggPiAxICkgewoJCQkJCQkJcmV0dXJuOwoJCQkJCQl9CgoJCQkJCQlkYXRhID0gZ2V0RGF0YSggZSApOwoJCQkJCQlzd2lwZVN0b3AgPSBbIGRhdGEucGFnZVgsIGRhdGEucGFnZVkgXTsKCgkJCQkJCWlmICggIXN3aXBlU3RhcnRbMF0gKSB7CgkJCQkJCQlzd2lwZVN0YXJ0ID0gc3dpcGVTdG9wOwoJCQkJCQl9CgoJCQkJCQlpZiAoIE1hdGguYWJzKCBzd2lwZVN0YXJ0WzBdIC0gc3dpcGVTdG9wWzBdICkgPiAxMCApIHsKCQkJCQkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJCQkJfQoJCQkJCX0sCgkJCQkJdXBIYW5kbGVyID0gZnVuY3Rpb24oIGUgKSB7CgoJCQkJCQlpbWFnZXMudW5iaW5kKCBldi5tb3ZlLCBtb3ZlSGFuZGxlciApOwoKCQkJCQkJLy8gaWYgbXVsdGl0b3VjaCAocG9zc2libHkgem9vbWluZyksIGFib3J0CgkJCQkJCWlmICggKCBlLm9yaWdpbmFsRXZlbnQudG91Y2hlcyAmJiBlLm9yaWdpbmFsRXZlbnQudG91Y2hlcy5sZW5ndGggKSB8fCBtdWx0aSApIHsKCQkJCQkJCW11bHRpID0gIW11bHRpOwoJCQkJCQkJcmV0dXJuOwoJCQkJCQl9CgoJCQkJCQlpZiAoIFV0aWxzLnRpbWVzdGFtcCgpIC0gdGlkIDwgMTAwMCAmJgoJCQkJCQkJIE1hdGguYWJzKCBzd2lwZVN0YXJ0WzBdIC0gc3dpcGVTdG9wWzBdICkgPiBsaW1pdFggJiYKCQkJCQkJCSBNYXRoLmFicyggc3dpcGVTdGFydFsxXSAtIHN3aXBlU3RvcFsxXSApIDwgbGltaXRZICkgewoKCQkJCQkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJCQkJCXNlbGZbIHN3aXBlU3RhcnRbMF0gPiBzd2lwZVN0b3BbMF0gPyAnbmV4dCcgOiAncHJldicgXSgpOwoJCQkJCQl9CgoJCQkJCQlzd2lwZVN0YXJ0ID0gc3dpcGVTdG9wID0gWzAsMF07CgkJCQkJfTsKCgkJCQlpbWFnZXMuYmluZChldi5zdGFydCwgZnVuY3Rpb24oZSkgewoKCQkJCQlpZiAoIGUub3JpZ2luYWxFdmVudC50b3VjaGVzICYmIGUub3JpZ2luYWxFdmVudC50b3VjaGVzLmxlbmd0aCA+IDEgKSB7CgkJCQkJCXJldHVybjsKCQkJCQl9CgoJCQkJCWRhdGEgPSBnZXREYXRhKGUpOwoJCQkJCXRpZCA9IFV0aWxzLnRpbWVzdGFtcCgpOwoJCQkJCXN3aXBlU3RhcnQgPSBzd2lwZVN0b3AgPSBbIGRhdGEucGFnZVgsIGRhdGEucGFnZVkgXTsKCQkJCQlpbWFnZXMuYmluZChldi5tb3ZlLCBtb3ZlSGFuZGxlciApLm9uZShldi5zdG9wLCB1cEhhbmRsZXIpOwoKCQkJCX0pOwoKCQkJfSggc2VsZi4kKCAnaW1hZ2VzJyApICkpOwoKCQkJLy8gZG91YmxlLXRhcC9jbGljayBmdWxsc2NyZWVuIHRvZ2dsZQoKCQkJaWYgKCBvcHRpb25zLmZ1bGxzY3JlZW5Eb3VibGVUYXAgKSB7CgoJCQkJdGhpcy4kKCAnc3RhZ2UnICkuYmluZCggJ3RvdWNoc3RhcnQnLCAoZnVuY3Rpb24oKSB7CgkJCQkJdmFyIGxhc3QsIGN4LCBjeSwgbHgsIGx5LCBub3csCgkJCQkJCWdldERhdGEgPSBmdW5jdGlvbihlKSB7CgkJCQkJCQlyZXR1cm4gZS5vcmlnaW5hbEV2ZW50LnRvdWNoZXMgPyBlLm9yaWdpbmFsRXZlbnQudG91Y2hlc1swXSA6IGU7CgkJCQkJCX07CgkJCQkJcmV0dXJuIGZ1bmN0aW9uKGUpIHsKCQkJCQkJbm93ID0gR2FsbGVyaWEudXRpbHMudGltZXN0YW1wKCk7CgkJCQkJCWN4ID0gZ2V0RGF0YShlKS5wYWdlWDsKCQkJCQkJY3kgPSBnZXREYXRhKGUpLnBhZ2VZOwoJCQkJCQlpZiAoICggbm93IC0gbGFzdCA8IDUwMCApICYmICggY3ggLSBseCA8IDIwKSAmJiAoIGN5IC0gbHkgPCAyMCkgKSB7CgkJCQkJCQlzZWxmLnRvZ2dsZUZ1bGxzY3JlZW4oKTsKCQkJCQkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJCQkJCXNlbGYuJCggJ3N0YWdlJyApLnVuYmluZCggJ3RvdWNoZW5kJywgYXJndW1lbnRzLmNhbGxlZSApOwoJCQkJCQkJcmV0dXJuOwoJCQkJCQl9CgkJCQkJCWxhc3QgPSBub3c7CgkJCQkJCWx4ID0gY3g7CgkJCQkJCWx5ID0gY3k7CgkJCQkJfTsKCQkJCX0oKSkpOwoJCQl9CgoJCX0KCgkJLy8gb3B0aW1pemUgdG91Y2ggZm9yIGNvbnRhaW5lcgoJCVV0aWxzLm9wdGltaXplVG91Y2goIHRoaXMuZ2V0KCAnY29udGFpbmVyJyApICk7CgoJCXJldHVybiB0aGlzOwoJfSwKCgkvLyBDcmVhdGVzIHRoZSB0aHVtYm5haWxzIGFuZCBjYXJvdXNlbAoJLy8gY2FuIGJlIHVzZWQgYXQgYW55IHRpbWUsIGYuZXggd2hlbiB0aGUgZGF0YSBvYmplY3QgaXMgbWFuaXB1bGF0ZWQKCglfY3JlYXRlVGh1bWJuYWlscyA6IGZ1bmN0aW9uKCkgewoKCQl0aGlzLmdldCggJ3RvdGFsJyApLmlubmVySFRNTCA9IHRoaXMuZ2V0RGF0YUxlbmd0aCgpOwoKCQl2YXIgaSwKCQkJc3JjLAoJCQl0aHVtYiwKCQkJZGF0YSwKCgkJCSRjb250YWluZXIsCgoJCQlzZWxmID0gdGhpcywKCQkJbyA9IHRoaXMuX29wdGlvbnMsCgoJCQkvLyBnZXQgcHJldmlvdXNseSBhY3RpdmUgdGh1bWJuYWlsLCBpZiBleGlzdHMKCQkJYWN0aXZlID0gKGZ1bmN0aW9uKCkgewoJCQkJdmFyIGEgPSBzZWxmLiQoJ3RodW1ibmFpbHMnKS5maW5kKCcuYWN0aXZlJyk7CgkJCQlpZiAoICFhLmxlbmd0aCApIHsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCQlyZXR1cm4gYS5maW5kKCdpbWcnKS5hdHRyKCdzcmMnKTsKCQkJfSgpKSwKCgkJCS8vIGNhY2hlIHRoZSB0aHVtYm5haWwgb3B0aW9uCgkJCW9wdHZhbCA9IHR5cGVvZiBvLnRodW1ibmFpbHMgPT09ICdzdHJpbmcnID8gby50aHVtYm5haWxzLnRvTG93ZXJDYXNlKCkgOiBudWxsLAoKCQkJLy8gbW92ZSBzb21lIGRhdGEgaW50byB0aGUgaW5zdGFuY2UKCQkJLy8gZm9yIHNvbWUgcmVhc29uLCBqUXVlcnkgY2FudCBoYW5kbGUgY3NzKHByb3BlcnR5KSB3aGVuIHpvb21pbmcgaW4gRkYsIGJyZWFraW5nIHRoZSBnYWxsZXJ5CgkJCS8vIHNvIHdlIHJlc29ydCB0byBnZXRDb21wdXRlZFN0eWxlIGZvciBicm93c2VycyB3aG8gc3VwcG9ydCBpdAoJCQlnZXRTdHlsZSA9IGZ1bmN0aW9uKCBwcm9wICkgewoJCQkJcmV0dXJuIGRvYy5kZWZhdWx0VmlldyAmJiBkb2MuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSA/CgkJCQkJZG9jLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoIHRodW1iLmNvbnRhaW5lciwgbnVsbCApWyBwcm9wIF0gOgoJCQkJCSRjb250YWluZXIuY3NzKCBwcm9wICk7CgkJCX0sCgoJCQlmYWtlID0gZnVuY3Rpb24oaW1hZ2UsIGluZGV4LCBjb250YWluZXIpIHsKCQkJCXJldHVybiBmdW5jdGlvbigpIHsKCQkJCQkkKCBjb250YWluZXIgKS5hcHBlbmQoIGltYWdlICk7CgkJCQkJc2VsZi50cmlnZ2VyKHsKCQkJCQkJdHlwZTogR2FsbGVyaWEuVEhVTUJOQUlMLAoJCQkJCQl0aHVtYlRhcmdldDogaW1hZ2UsCgkJCQkJCWluZGV4OiBpbmRleAoJCQkJCX0pOwoJCQkJfTsKCQkJfSwKCgkJCW9uVGh1bWJFdmVudCA9IGZ1bmN0aW9uKCBlICkgewoKCQkJCS8vIHBhdXNlIGlmIG9wdGlvbiBpcyBzZXQKCQkJCWlmICggby5wYXVzZU9uSW50ZXJhY3Rpb24gKSB7CgkJCQkJc2VsZi5wYXVzZSgpOwoJCQkJfQoKCQkJCS8vIGV4dHJhY3QgdGhlIGluZGV4IGZyb20gdGhlIGRhdGEKCQkJCXZhciBpbmRleCA9ICQoIGUuY3VycmVudFRhcmdldCApLmRhdGEoICdpbmRleCcgKTsKCQkJCWlmICggc2VsZi5nZXRJbmRleCgpICE9PSBpbmRleCApIHsKCQkJCQlzZWxmLnNob3coIGluZGV4ICk7CgkJCQl9CgoJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCQl9LAoKCQkJb25UaHVtYkxvYWQgPSBmdW5jdGlvbiggdGh1bWIgKSB7CgoJCQkJLy8gc2NhbGUgd2hlbiByZWFkeQoJCQkJdGh1bWIuc2NhbGUoewoJCQkJCXdpZHRoOiAgICB0aHVtYi5kYXRhLndpZHRoLAoJCQkJCWhlaWdodDogICB0aHVtYi5kYXRhLmhlaWdodCwKCQkJCQljcm9wOiAgICAgby50aHVtYkNyb3AsCgkJCQkJbWFyZ2luOiAgIG8udGh1bWJNYXJnaW4sCgkJCQkJY2FudmFzOiAgIG8udXNlQ2FudmFzLAoJCQkJCWNvbXBsZXRlOiBmdW5jdGlvbiggdGh1bWIgKSB7CgoJCQkJCQkvLyBzaHJpbmsgdGh1bWJuYWlscyB0byBmaXQKCQkJCQkJdmFyIHRvcCA9IFsnbGVmdCcsICd0b3AnXSwKCQkJCQkJCWFyciA9IFsnV2lkdGgnLCAnSGVpZ2h0J10sCgkJCQkJCQltLAoJCQkJCQkJY3NzOwoKCQkJCQkJLy8gY2FsY3VsYXRlIHNocmlua2VkIHBvc2l0aW9ucwoJCQkJCQkkLmVhY2goYXJyLCBmdW5jdGlvbiggaSwgbWVhc3VyZSApIHsKCQkJCQkJCW0gPSBtZWFzdXJlLnRvTG93ZXJDYXNlKCk7CgkJCQkJCQlpZiAoIChvLnRodW1iQ3JvcCAhPT0gdHJ1ZSB8fCBvLnRodW1iQ3JvcCA9PT0gbSApICYmIG8udGh1bWJGaXQgKSB7CgkJCQkJCQkJY3NzID0ge307CgkJCQkJCQkJY3NzWyBtIF0gPSB0aHVtYlsgbSBdOwoJCQkJCQkJCSQoIHRodW1iLmNvbnRhaW5lciApLmNzcyggY3NzICk7CgkJCQkJCQkJY3NzID0ge307CgkJCQkJCQkJY3NzWyB0b3BbIGkgXSBdID0gMDsKCQkJCQkJCQkkKCB0aHVtYi5pbWFnZSApLmNzcyggY3NzICk7CgkJCQkJCQl9CgoJCQkJCQkJLy8gY2FjaGUgb3V0ZXIgbWVhc3VyZXMKCQkJCQkJCXRodW1iWyAnb3V0ZXInICsgbWVhc3VyZSBdID0gJCggdGh1bWIuY29udGFpbmVyIClbICdvdXRlcicgKyBtZWFzdXJlIF0oIHRydWUgKTsKCQkJCQkJfSk7CgoJCQkJCQkvLyBzZXQgaGlnaCBxdWFsaXR5IGlmIGRvd25zY2FsZSBpcyBtb2RlcmF0ZQoJCQkJCQlVdGlscy50b2dnbGVRdWFsaXR5KCB0aHVtYi5pbWFnZSwKCQkJCQkJCW8udGh1bWJRdWFsaXR5ID09PSB0cnVlIHx8CgkJCQkJCQkoIG8udGh1bWJRdWFsaXR5ID09PSAnYXV0bycgJiYgdGh1bWIub3JpZ2luYWwud2lkdGggPCB0aHVtYi53aWR0aCAqIDMgKQoJCQkJCQkpOwoKCQkJCQkJLy8gdHJpZ2dlciB0aGUgVEhVTUJOQUlMIGV2ZW50CgkJCQkJCXNlbGYudHJpZ2dlcih7CgkJCQkJCQl0eXBlOiBHYWxsZXJpYS5USFVNQk5BSUwsCgkJCQkJCQl0aHVtYlRhcmdldDogdGh1bWIuaW1hZ2UsCgkJCQkJCQlpbmRleDogdGh1bWIuZGF0YS5vcmRlcgoJCQkJCQl9KTsKCQkJCQl9CgkJCQl9KTsKCQkJfTsKCgkJdGhpcy5fdGh1bWJuYWlscyA9IFtdOwoKCQl0aGlzLiQoICd0aHVtYm5haWxzJyApLmVtcHR5KCk7CgoJCS8vIGxvb3AgdGhyb3VnaCBkYXRhIGFuZCBjcmVhdGUgdGh1bWJuYWlscwoJCWZvciggaSA9IDA7IHRoaXMuX2RhdGFbIGkgXTsgaSsrICkgewoKCQkJZGF0YSA9IHRoaXMuX2RhdGFbIGkgXTsKCgkJCWlmICggby50aHVtYm5haWxzID09PSB0cnVlICkgewoKCQkJCS8vIGFkZCBhIG5ldyBQaWN0dXJlIGluc3RhbmNlCgkJCQl0aHVtYiA9IG5ldyBHYWxsZXJpYS5QaWN0dXJlKGkpOwoKCQkJCS8vIGdldCBzb3VyY2UgZnJvbSB0aHVtYiBvciBpbWFnZQoJCQkJc3JjID0gZGF0YS50aHVtYiB8fCBkYXRhLmltYWdlOwoKCQkJCS8vIGFwcGVuZCB0aGUgdGh1bWJuYWlsCgkJCQl0aGlzLiQoICd0aHVtYm5haWxzJyApLmFwcGVuZCggdGh1bWIuY29udGFpbmVyICk7CgoJCQkJLy8gY2FjaGUgdGhlIGNvbnRhaW5lcgoJCQkJJGNvbnRhaW5lciA9ICQoIHRodW1iLmNvbnRhaW5lciApOwoKCQkJCXRodW1iLmRhdGEgPSB7CgkJCQkJd2lkdGggIDogVXRpbHMucGFyc2VWYWx1ZSggZ2V0U3R5bGUoICd3aWR0aCcgKSApLAoJCQkJCWhlaWdodCA6IFV0aWxzLnBhcnNlVmFsdWUoIGdldFN0eWxlKCAnaGVpZ2h0JyApICksCgkJCQkJb3JkZXIgIDogaQoJCQkJfTsKCgkJCQkvLyBncmFiICYgcmVzZXQgc2l6ZSBmb3Igc21vb3RoZXIgdGh1bWJuYWlsIGxvYWRzCgkJCQlpZiAoIG8udGh1bWJGaXQgJiYgby50aHVtYkNyb3AgIT09IHRydWUgKSB7CgkJCQkJJGNvbnRhaW5lci5jc3MoIHsgd2lkdGg6IDAsIGhlaWdodDogMCB9ICk7CgkJCQl9IGVsc2UgewoJCQkJCSRjb250YWluZXIuY3NzKCB7IHdpZHRoOiB0aHVtYi5kYXRhLndpZHRoLCBoZWlnaHQ6IHRodW1iLmRhdGEuaGVpZ2h0IH0gKTsKCQkJCX0KCgkJCQkvLyBsb2FkIHRoZSB0aHVtYm5haWwKCQkJCXRodW1iLmxvYWQoIHNyYywgb25UaHVtYkxvYWQgKTsKCgkJCQkvLyBwcmVsb2FkIGFsbCBpbWFnZXMgaGVyZQoJCQkJaWYgKCBvLnByZWxvYWQgPT09ICdhbGwnICkgewoJCQkJCXRodW1iLnByZWxvYWQoIGRhdGEuaW1hZ2UgKTsKCQkJCX0KCgkJCS8vIGNyZWF0ZSBlbXB0eSBzcGFucyBpZiB0aHVtYm5haWxzIGlzIHNldCB0byAnZW1wdHknCgkJCX0gZWxzZSBpZiAoIG9wdHZhbCA9PT0gJ2VtcHR5JyB8fCBvcHR2YWwgPT09ICdudW1iZXJzJyApIHsKCgkJCQl0aHVtYiA9IHsKCQkJCQljb250YWluZXI6ICBVdGlscy5jcmVhdGUoICdnYWxsZXJpYS1pbWFnZScgKSwKCQkJCQlpbWFnZTogVXRpbHMuY3JlYXRlKCAnaW1nJywgJ3NwYW4nICksCgkJCQkJcmVhZHk6IHRydWUKCQkJCX07CgoJCQkJLy8gY3JlYXRlIG51bWJlcmVkIHRodW1ibmFpbHMKCQkJCWlmICggb3B0dmFsID09PSAnbnVtYmVycycgKSB7CgkJCQkJJCggdGh1bWIuaW1hZ2UgKS50ZXh0KCBpICsgMSApOwoJCQkJfQoKCQkJCXRoaXMuJCggJ3RodW1ibmFpbHMnICkuYXBwZW5kKCB0aHVtYi5jb250YWluZXIgKTsKCgkJCQkvLyB3ZSBuZWVkIHRvICJmYWtlIiBhIGxvYWRpbmcgZGVsYXkgYmVmb3JlIHdlIGFwcGVuZCBhbmQgdHJpZ2dlcgoJCQkJLy8gNTArIHNob3VsZCBiZSBlbm91Z2gKCgkJCQl3aW5kb3cuc2V0VGltZW91dCggKCBmYWtlICkoIHRodW1iLmltYWdlLCBpLCB0aHVtYi5jb250YWluZXIgKSwgNTAgKyAoIGkqMjAgKSApOwoKCQkJLy8gY3JlYXRlIG51bGwgb2JqZWN0IHRvIHNpbGVudCBlcnJvcnMKCQkJfSBlbHNlIHsKCQkJCXRodW1iID0gewoJCQkJCWNvbnRhaW5lcjogbnVsbCwKCQkJCQlpbWFnZTogbnVsbAoJCQkJfTsKCQkJfQoKCQkJLy8gYWRkIGV2ZW50cyBmb3IgdGh1bWJuYWlscwoJCQkvLyB5b3UgY2FuIGNvbnRyb2wgdGhlIGV2ZW50IHR5cGUgdXNpbmcgdGh1bWJfZXZlbnRfdHlwZQoJCQkvLyB3ZSdsbCBhZGQgdGhlIHNhbWUgZXZlbnQgdG8gdGhlIHNvdXJjZSBpZiBpdCdzIGtlcHQKCgkJCSQoIHRodW1iLmNvbnRhaW5lciApLmFkZCggby5rZWVwU291cmNlICYmIG8ubGlua1NvdXJjZUltYWdlcyA/IGRhdGEub3JpZ2luYWwgOiBudWxsICkKCQkJCS5kYXRhKCdpbmRleCcsIGkpLmJpbmQoIG8udGh1bWJFdmVudFR5cGUsIG9uVGh1bWJFdmVudCApOwoKCQkJaWYgKGFjdGl2ZSA9PT0gc3JjKSB7CgkJCQkkKCB0aHVtYi5jb250YWluZXIgKS5hZGRDbGFzcyggJ2FjdGl2ZScgKTsKCQkJfQoKCQkJdGhpcy5fdGh1bWJuYWlscy5wdXNoKCB0aHVtYiApOwoJCX0KCX0sCgoJLy8gdGhlIGludGVybmFsIF9ydW4gbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgbG9hZGluZyBkYXRhIGludG8gZ2FsbGVyaWEKCS8vIG1ha2VzIHN1cmUgdGhlIGdhbGxlcnkgaGFzIHByb3BlciBtZWFzdXJlbWVudHMgYmVmb3JlIHBvc3RydW4gJiByZWFkeQoJX3J1biA6IGZ1bmN0aW9uKCkgewoKCQl2YXIgc2VsZiA9IHRoaXM7CgoJCXNlbGYuX2NyZWF0ZVRodW1ibmFpbHMoKTsKCgkJLy8gbWFrZSBzdXJlIHdlIGhhdmUgYSBzdGFnZUhlaWdodCAmJiBzdGFnZVdpZHRoCgoJCVV0aWxzLndhaXQoewoKCQkJdW50aWw6IGZ1bmN0aW9uKCkgewoKCQkJCS8vIE9wZXJhIGNyYXAKCQkJCWlmICggR2FsbGVyaWEuT1BFUkEgKSB7CgkJCQkJc2VsZi4kKCAnc3RhZ2UnICkuY3NzKCAnZGlzcGxheScsICdpbmxpbmUtYmxvY2snICk7CgkJCQl9CgoJCQkJc2VsZi5fc3RhZ2VXaWR0aCAgPSBzZWxmLiQoICdzdGFnZScgKS53aWR0aCgpOwoJCQkJc2VsZi5fc3RhZ2VIZWlnaHQgPSBzZWxmLiQoICdzdGFnZScgKS5oZWlnaHQoKTsKCgkJCQlyZXR1cm4oIHNlbGYuX3N0YWdlV2lkdGggJiYKCQkJCQkJc2VsZi5fc3RhZ2VIZWlnaHQgPiA1MCApOyAvLyB3aGF0IGlzIGFuIGFjY2VwdGFibGUgaGVpZ2h0PwoJCQl9LAoKCQkJc3VjY2VzczogZnVuY3Rpb24oKSB7CgoJCQkJLy8gc2F2ZSB0aGUgaW5zdGFuY2UKCQkJCV9nYWxsZXJpZXMucHVzaCggc2VsZiApOwoKCQkJCS8vIHBvc3RydW4gc29tZSBzdHVmZiBhZnRlciB0aGUgZ2FsbGVyeSBpcyByZWFkeQoKCQkJCS8vIHNob3cgY291bnRlcgoJCQkJVXRpbHMuc2hvdyggc2VsZi5nZXQoJ2NvdW50ZXInKSApOwoKCQkJCS8vIGJpbmQgY2Fyb3VzZWwgbmF2CgkJCQlpZiAoIHNlbGYuX29wdGlvbnMuY2Fyb3VzZWwgKSB7CgkJCQkJc2VsZi5fY2Fyb3VzZWwuYmluZENvbnRyb2xzKCk7CgkJCQl9CgoJCQkJLy8gc3RhcnQgYXV0b3BsYXkKCQkJCWlmICggc2VsZi5fb3B0aW9ucy5hdXRvcGxheSApIHsKCgkJCQkJc2VsZi5wYXVzZSgpOwoKCQkJCQlpZiAoIHR5cGVvZiBzZWxmLl9vcHRpb25zLmF1dG9wbGF5ID09PSAnbnVtYmVyJyApIHsKCQkJCQkJc2VsZi5fcGxheXRpbWUgPSBzZWxmLl9vcHRpb25zLmF1dG9wbGF5OwoJCQkJCX0KCgkJCQkJc2VsZi50cmlnZ2VyKCBHYWxsZXJpYS5QTEFZICk7CgkJCQkJc2VsZi5fcGxheWluZyA9IHRydWU7CgkJCQl9CgkJCQkvLyBpZiBzZWNvbmQgbG9hZCwganVzdCBkbyB0aGUgc2hvdyBhbmQgcmV0dXJuCgkJCQlpZiAoIHNlbGYuX2ZpcnN0cnVuICkgewoJCQkJCWlmICggdHlwZW9mIHNlbGYuX29wdGlvbnMuc2hvdyA9PT0gJ251bWJlcicgKSB7CgkJCQkJCXNlbGYuc2hvdyggc2VsZi5fb3B0aW9ucy5zaG93ICk7CgkJCQkJfQoJCQkJCXJldHVybjsKCQkJCX0KCgkJCQlzZWxmLl9maXJzdHJ1biA9IHRydWU7CgoJCQkJLy8gYmluZCBjbGlja25leHQKCQkJCWlmICggc2VsZi5fb3B0aW9ucy5jbGlja25leHQgJiYgIUdhbGxlcmlhLlRPVUNIICkgewoJCQkJCSQuZWFjaCggc2VsZi5fZGF0YSwgZnVuY3Rpb24oIGksIGRhdGEgKSB7CgkJCQkJCWRlbGV0ZSBkYXRhLmxpbms7CgkJCQkJfSk7CgkJCQkJc2VsZi4kKCAnc3RhZ2UnICkuY3NzKHsgY3Vyc29yIDogJ3BvaW50ZXInIH0pLmJpbmQoICdjbGljaycsIGZ1bmN0aW9uKGUpIHsKCQkJCQkJLy8gcGF1c2UgaWYgb3B0aW9ucyBpcyBzZXQKCQkJCQkJaWYgKCBzZWxmLl9vcHRpb25zLnBhdXNlT25JbnRlcmFjdGlvbiApIHsKCQkJCQkJCXNlbGYucGF1c2UoKTsKCQkJCQkJfQoJCQkJCQlzZWxmLm5leHQoKTsKCQkJCQl9KTsKCQkJCX0KCgkJCQkvLyBpbml0aWFsaXplIHRoZSBIaXN0b3J5IHBsdWdpbgoJCQkJaWYgKCBHYWxsZXJpYS5IaXN0b3J5ICkgewoKCQkJCQkvLyBiaW5kIHRoZSBzaG93IG1ldGhvZAoJCQkJCUdhbGxlcmlhLkhpc3RvcnkuY2hhbmdlKGZ1bmN0aW9uKCB2YWx1ZSApIHsKCgkJCQkJCS8vIGlmIElEIGlzIE5hTiwgdGhlIHVzZXIgcHJlc3NlZCBiYWNrIGZyb20gdGhlIGZpcnN0IGltYWdlCgkJCQkJCS8vIHJldHVybiB0byBwcmV2aW91cyBhZGRyZXNzCgkJCQkJCWlmICggaXNOYU4oIHZhbHVlICkgKSB7CgkJCQkJCQl3aW5kb3cuaGlzdG9yeS5nbygtMSk7CgoJCQkJCQkvLyBlbHNlIHNob3cgdGhlIGltYWdlCgkJCQkJCX0gZWxzZSB7CgkJCQkJCQlzZWxmLnNob3coIHZhbHVlLCB1bmRlZiwgdHJ1ZSApOwoJCQkJCQl9CgkJCQkJfSk7CgkJCQl9CgoJCQkJLy8gVHJpZ2dlciBHYWxsZXJpYS5yZWFkeQoJCQkJJC5lYWNoKCBHYWxsZXJpYS5yZWFkeS5jYWxsYmFja3MsIGZ1bmN0aW9uKCkgewoJCQkJCXRoaXMuY2FsbCggc2VsZiwgc2VsZi5fb3B0aW9ucyApOwoJCQkJfSk7CgoJCQkJc2VsZi50cmlnZ2VyKCBHYWxsZXJpYS5SRUFEWSApOwoKCQkJCS8vIGNhbGwgdGhlIHRoZW1lIGluaXQgbWV0aG9kCgkJCQlHYWxsZXJpYS50aGVtZS5pbml0LmNhbGwoIHNlbGYsIHNlbGYuX29wdGlvbnMgKTsKCgkJCQkvLyBjYWxsIHRoZSBleHRlbmQgb3B0aW9uCgkJCQlzZWxmLl9vcHRpb25zLmV4dGVuZC5jYWxsKCBzZWxmLCBzZWxmLl9vcHRpb25zICk7CgoJCQkJLy8gc2hvdyB0aGUgaW5pdGlhbCBpbWFnZQoJCQkJLy8gZmlyc3QgdGVzdCBmb3IgcGVybWFsaW5rcyBpbiBoaXN0b3J5CgkJCQlpZiAoIC9eWzAtOV17MSw0fSQvLnRlc3QoIEhBU0ggKSAmJiBHYWxsZXJpYS5IaXN0b3J5ICkgewoJCQkJCXNlbGYuc2hvdyggSEFTSCwgdW5kZWYsIHRydWUgKTsKCgkJCQl9IGVsc2UgaWYoIHNlbGYuX2RhdGFbIHNlbGYuX29wdGlvbnMuc2hvdyBdICkgewoJCQkJCXNlbGYuc2hvdyggc2VsZi5fb3B0aW9ucy5zaG93ICk7CgkJCQl9CgkJCX0sCgoJCQllcnJvcjogZnVuY3Rpb24oKSB7CgkJCQlHYWxsZXJpYS5yYWlzZSgnU3RhZ2Ugd2lkdGggb3IgaGVpZ2h0IGlzIHRvbyBzbWFsbCB0byBzaG93IHRoZSBnYWxsZXJ5LiBUcmFjZWQgbWVhc3VyZXM6IHdpZHRoOicgKyBzZWxmLl9zdGFnZVdpZHRoICsgJ3B4LCBoZWlnaHQ6ICcgKyBzZWxmLl9zdGFnZUhlaWdodCArICdweC4nLCB0cnVlKTsKCQkJfQoKCQl9KTsKCX0sCgoJLyoqCgkJTG9hZHMgZGF0YSBpbnRvIHRoZSBnYWxsZXJ5LgoJCVlvdSBjYW4gY2FsbCB0aGlzIG1ldGhvZCBvbiBhbiBleGlzdGluZyBnYWxsZXJ5IHRvIHJlbG9hZCB0aGUgZ2FsbGVyeSB3aXRoIG5ldyBkYXRhLgoKCQlAcGFyYW0ge0FycmF5fHN0cmluZ30gc291cmNlIE9wdGlvbmFsIEpTT04gYXJyYXkgb2YgZGF0YSBvciBzZWxlY3RvciBvZiB3aGVyZSB0byBmaW5kIGRhdGEgaW4gdGhlIGRvY3VtZW50LgoJCURlZmF1bHRzIHRvIHRoZSBHYWxsZXJpYSB0YXJnZXQgb3IgZGF0YVNvdXJjZSBvcHRpb24uCgoJCUBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciBPcHRpb25hbCBlbGVtZW50IHNlbGVjdG9yIG9mIHdoYXQgZWxlbWVudHMgdG8gcGFyc2UuCgkJRGVmYXVsdHMgdG8gJ2ltZycuCgoJCUBwYXJhbSB7RnVuY3Rpb259IFtjb25maWddIE9wdGlvbmFsIGZ1bmN0aW9uIHRvIG1vZGlmeSB0aGUgZGF0YSBleHRyYWN0aW9uIHByb2NlZWR1cmUgZnJvbSB0aGUgc2VsZWN0b3IuCgkJU2VlIHRoZSBkYXRhX2NvbmZpZyBvcHRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uCgoJCUByZXR1cm5zIEluc3RhbmNlCgkqLwoKCWxvYWQgOiBmdW5jdGlvbiggc291cmNlLCBzZWxlY3RvciwgY29uZmlnICkgewoKCQl2YXIgc2VsZiA9IHRoaXM7CgoJCS8vIGVtcHR5IHRoZSBkYXRhIGFycmF5CgkJdGhpcy5fZGF0YSA9IFtdOwoKCQkvLyBlbXB0eSB0aGUgdGh1bWJuYWlscwoJCXRoaXMuX3RodW1ibmFpbHMgPSBbXTsKCQl0aGlzLiQoJ3RodW1ibmFpbHMnKS5lbXB0eSgpOwoKCQkvLyBzaG9ydGVuIHRoZSBhcmd1bWVudHMKCQlpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gJ2Z1bmN0aW9uJyApIHsKCQkJY29uZmlnID0gc2VsZWN0b3I7CgkJCXNlbGVjdG9yID0gbnVsbDsKCQl9CgoJCS8vIHVzZSB0aGUgc291cmNlIHNldCBieSB0YXJnZXQKCQlzb3VyY2UgPSBzb3VyY2UgfHwgdGhpcy5fb3B0aW9ucy5kYXRhU291cmNlOwoKCQkvLyB1c2Ugc2VsZWN0b3Igc2V0IGJ5IG9wdGlvbgoJCXNlbGVjdG9yID0gc2VsZWN0b3IgfHwgdGhpcy5fb3B0aW9ucy5kYXRhU2VsZWN0b3I7CgoJCS8vIHVzZSB0aGUgZGF0YV9jb25maWcgc2V0IGJ5IG9wdGlvbgoJCWNvbmZpZyA9IGNvbmZpZyB8fCB0aGlzLl9vcHRpb25zLmRhdGFDb25maWc7CgoJCS8vIGlmIHNvdXJjZSBpcyBhIHRydWUgb2JqZWN0LCBtYWtlIGl0IGludG8gYW4gYXJyYXkKCQlpZiggL15mdW5jdGlvbiBPYmplY3QvLnRlc3QoIHNvdXJjZS5jb25zdHJ1Y3RvciApICkgewoJCQlzb3VyY2UgPSBbc291cmNlXTsKCQl9CgoJCS8vIGNoZWNrIGlmIHRoZSBkYXRhIGlzIGFuIGFycmF5IGFscmVhZHkKCQlpZiAoIHNvdXJjZS5jb25zdHJ1Y3RvciA9PT0gQXJyYXkgKSB7CgkJCWlmICggdGhpcy52YWxpZGF0ZSggc291cmNlICkgKSB7CgoJCQkJdGhpcy5fZGF0YSA9IHNvdXJjZTsKCQkJCXRoaXMuX3BhcnNlRGF0YSgpLnRyaWdnZXIoIEdhbGxlcmlhLkRBVEEgKTsKCgkJCX0gZWxzZSB7CgkJCQlHYWxsZXJpYS5yYWlzZSggJ0xvYWQgZmFpbGVkOiBKU09OIEFycmF5IG5vdCB2YWxpZC4nICk7CgkJCX0KCQkJcmV0dXJuIHRoaXM7CgkJfQoKCQkvLyBsb29wIHRocm91Z2ggaW1hZ2VzIGFuZCBzZXQgZGF0YQoJCSQoIHNvdXJjZSApLmZpbmQoIHNlbGVjdG9yICkuZWFjaCggZnVuY3Rpb24oIGksIGltZyApIHsKCQkJaW1nID0gJCggaW1nICk7CgkJCXZhciBkYXRhID0ge30sCgkJCQlwYXJlbnQgPSBpbWcucGFyZW50KCksCgkJCQlocmVmID0gcGFyZW50LmF0dHIoICdocmVmJyApLAoJCQkJcmVsICA9IHBhcmVudC5hdHRyKCAncmVsJyApOwoKCQkJaWYgKCBocmVmICkgewoJCQkJZGF0YS5pbWFnZSA9IGRhdGEuYmlnID0gaHJlZjsKCQkJfQoJCQlpZiAoIHJlbCApIHsKCQkJCWRhdGEuYmlnID0gcmVsOwoJCQl9CgoJCQkvLyBtaXggZGVmYXVsdCBleHRyYWN0aW9ucyB3aXRoIHRoZSBocmVmcyBhbmQgY29uZmlnCgkJCS8vIGFuZCBwdXNoIGl0IGludG8gdGhlIGRhdGEgYXJyYXkKCQkJc2VsZi5fZGF0YS5wdXNoKCAkLmV4dGVuZCh7CgoJCQkJdGl0bGU6ICAgICAgIGltZy5hdHRyKCd0aXRsZScpIHx8ICcnLAoJCQkJdGh1bWI6ICAgICAgIGltZy5hdHRyKCdzcmMnKSwKCQkJCWltYWdlOiAgICAgICBpbWcuYXR0cignc3JjJyksCgkJCQliaWc6ICAgICAgICAgaW1nLmF0dHIoJ3NyYycpLAoJCQkJZGVzY3JpcHRpb246IGltZy5hdHRyKCdhbHQnKSB8fCAnJywKCQkJCWxpbms6ICAgICAgICBpbWcuYXR0cignbG9uZ2Rlc2MnKSwKCQkJCW9yaWdpbmFsOiAgICBpbWcuZ2V0KDApIC8vIHNhdmVkIGFzIGEgcmVmZXJlbmNlCgoJCQl9LCBkYXRhLCBjb25maWcoIGltZyApICkgKTsKCgkJfSk7CgkJLy8gdHJpZ2dlciB0aGUgREFUQSBldmVudCBhbmQgcmV0dXJuCgkJaWYgKCB0aGlzLmdldERhdGFMZW5ndGgoKSApIHsKCQkJdGhpcy50cmlnZ2VyKCBHYWxsZXJpYS5EQVRBICk7CgkJfSBlbHNlIHsKCQkJR2FsbGVyaWEucmFpc2UoJ0xvYWQgZmFpbGVkOiBubyBkYXRhIGZvdW5kLicpOwoJCX0KCQlyZXR1cm4gdGhpczsKCgl9LAoKCS8vIG1ha2Ugc3VyZSB0aGUgZGF0YSB3b3JrcyBwcm9wZXJseQoJX3BhcnNlRGF0YSA6IGZ1bmN0aW9uKCkgewoKCQl2YXIgc2VsZiA9IHRoaXM7CgoJCSQuZWFjaCggdGhpcy5fZGF0YSwgZnVuY3Rpb24oIGksIGRhdGEgKSB7CgkJCS8vIGNvcHkgaW1hZ2UgYXMgdGh1bWIgaWYgbm8gdGh1bWIgZXhpc3RzCgkJCWlmICggJ3RodW1iJyBpbiBkYXRhID09PSBmYWxzZSApIHsKCQkJCXNlbGYuX2RhdGFbIGkgXS50aHVtYiA9IGRhdGEuaW1hZ2U7CgkJCX0KCQkJLy8gY29weSBpbWFnZSBhcyBiaWcgaW1hZ2UgaWYgbm8gYmlnZ2llIGV4aXN0cwoJCQlpZiAoICEnYmlnJyBpbiBkYXRhICkgewoJCQkJc2VsZi5fZGF0YVsgaSBdLmJpZyA9IGRhdGEuaW1hZ2U7CgkJCX0KCQl9KTsKCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCS8qKgoJCUFkZHMgYW5kL29yIHJlbW92ZXMgaW1hZ2VzIGZyb20gdGhlIGdhbGxlcnkKCQlXb3JrcyBqdXN0IGxpa2UgQXJyYXkuc3BsaWNlCgkJaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvc3BsaWNlCgoJCUBleGFtcGxlIHRoaXMuc3BsaWNlKCAyLCA0ICk7IC8vIHJlbW92ZXMgNCBpbWFnZXMgYWZ0ZXIgdGhlIHNlY29uZCBpbWFnZQoKCQlAcmV0dXJucyBJbnN0YW5jZQoJKi8KCglzcGxpY2U6IGZ1bmN0aW9uKCkgewoJCUFycmF5LnByb3RvdHlwZS5zcGxpY2UuYXBwbHkoIHRoaXMuX2RhdGEsIFV0aWxzLmFycmF5KCBhcmd1bWVudHMgKSApOwoJCXJldHVybiB0aGlzLl9wYXJzZURhdGEoKS5fY3JlYXRlVGh1bWJuYWlscygpOwoJfSwKCgkvKioKCQlBcHBlbmQgaW1hZ2VzIHRvIHRoZSBnYWxsZXJ5CgkJV29ya3MganVzdCBsaWtlIEFycmF5LnB1c2gKCQlodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9wdXNoCgoJCUBleGFtcGxlIHRoaXMucHVzaCh7IGltYWdlOiAnaW1hZ2UxLmpwZycgfSk7IC8vIGFwcGVuZHMgdGhlIGltYWdlIHRvIHRoZSBnYWxsZXJ5CgoJCUByZXR1cm5zIEluc3RhbmNlCgkqLwoKCXB1c2g6IGZ1bmN0aW9uKCkgewoJCUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KCB0aGlzLl9kYXRhLCBVdGlscy5hcnJheSggYXJndW1lbnRzICkgKTsKCQlyZXR1cm4gdGhpcy5fcGFyc2VEYXRhKCkuX2NyZWF0ZVRodW1ibmFpbHMoKTsKCX0sCgoJX2dldEFjdGl2ZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX2NvbnRyb2xzLmdldEFjdGl2ZSgpOwoJfSwKCgl2YWxpZGF0ZSA6IGZ1bmN0aW9uKCBkYXRhICkgewoJCS8vIHRvZG86IHZhbGlkYXRlIGEgY3VzdG9tIGRhdGEgYXJyYXkKCQlyZXR1cm4gdHJ1ZTsKCX0sCgoJLyoqCgkJQmluZCBhbnkgZXZlbnQgdG8gR2FsbGVyaWEKCgkJQHBhcmFtIHtzdHJpbmd9IHR5cGUgVGhlIEV2ZW50IHR5cGUgdG8gbGlzdGVuIGZvcgoJCUBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZAoKCQlAZXhhbXBsZSB0aGlzLmJpbmQoICdpbWFnZScsIGZ1bmN0aW9uKCkgeyBHYWxsZXJpYS5sb2coJ2ltYWdlIHNob3duJykgfSk7CgoJCUByZXR1cm5zIEluc3RhbmNlCgkqLwoKCWJpbmQgOiBmdW5jdGlvbih0eXBlLCBmbikgewoKCQkvLyBhbGxvdyAnaW1hZ2UnIGluc3RlYWQgb2YgR2FsbGVyaWEuSU1BR0UKCQl0eXBlID0gX3BhdGNoRXZlbnQoIHR5cGUgKTsKCgkJdGhpcy4kKCAnY29udGFpbmVyJyApLmJpbmQoIHR5cGUsIHRoaXMucHJveHkoZm4pICk7CgkJcmV0dXJuIHRoaXM7Cgl9LAoKCS8qKgoJCVVuYmluZCBhbnkgZXZlbnQgdG8gR2FsbGVyaWEKCgkJQHBhcmFtIHtzdHJpbmd9IHR5cGUgVGhlIEV2ZW50IHR5cGUgdG8gZm9yZ2V0CgoJCUByZXR1cm5zIEluc3RhbmNlCgkqLwoKCXVuYmluZCA6IGZ1bmN0aW9uKHR5cGUpIHsKCgkJdHlwZSA9IF9wYXRjaEV2ZW50KCB0eXBlICk7CgoJCXRoaXMuJCggJ2NvbnRhaW5lcicgKS51bmJpbmQoIHR5cGUgKTsKCQlyZXR1cm4gdGhpczsKCX0sCgoJLyoqCgkJTWFudWFsbHkgdHJpZ2dlciBhIEdhbGxlcmlhIGV2ZW50CgoJCUBwYXJhbSB7c3RyaW5nfSB0eXBlIFRoZSBFdmVudCB0byB0cmlnZ2VyCgoJCUByZXR1cm5zIEluc3RhbmNlCgkqLwoKCXRyaWdnZXIgOiBmdW5jdGlvbiggdHlwZSApIHsKCgkJdHlwZSA9IHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyA/CgkJCSQuZXh0ZW5kKCB0eXBlLCB7IHNjb3BlOiB0aGlzIH0gKSA6CgkJCXsgdHlwZTogX3BhdGNoRXZlbnQoIHR5cGUgKSwgc2NvcGU6IHRoaXMgfTsKCgkJdGhpcy4kKCAnY29udGFpbmVyJyApLnRyaWdnZXIoIHR5cGUgKTsKCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCS8qKgoJCUFzc2lnbiBhbiAiaWRsZSBzdGF0ZSIgdG8gYW55IGVsZW1lbnQuCgkJVGhlIGlkbGUgc3RhdGUgd2lsbCBiZSBhcHBsaWVkIGFmdGVyIGEgY2VydGFpbiBhbW91bnQgb2YgaWRsZSB0aW1lCgkJVXNlZnVsIHRvIGhpZGUgZi5leCBuYXZpZ2F0aW9uIHdoZW4gdGhlIGdhbGxlcnkgaXMgaW5hY3RpdmUKCgkJQHBhcmFtIHtIVE1MRWxlbWVudHxzdHJpbmd9IGVsZW0gVGhlIERvbSBub2RlIG9yIHNlbGVjdG9yIHRvIGFwcGx5IHRoZSBpZGxlIHN0YXRlIHRvCgkJQHBhcmFtIHtPYmplY3R9IHN0eWxlcyB0aGUgQ1NTIHN0eWxlcyB0byBhcHBseQoKCQlAZXhhbXBsZSBhZGRJZGxlU3RhdGUoIHRoaXMuZ2V0KCdpbWFnZS1uYXYnKSwgeyBvcGFjaXR5OiAwIH0pOwoJCUBleGFtcGxlIGFkZElkbGVTdGF0ZSggJy5nYWxsZXJpYS1pbWFnZS1uYXYnLCB7IHRvcDogLTIwMCB9KTsKCgkJQHJldHVybnMgSW5zdGFuY2UKCSovCgoJYWRkSWRsZVN0YXRlOiBmdW5jdGlvbiggZWxlbSwgc3R5bGVzICkgewoJCXRoaXMuX2lkbGUuYWRkLmFwcGx5KCB0aGlzLl9pZGxlLCBVdGlscy5hcnJheSggYXJndW1lbnRzICkgKTsKCQlyZXR1cm4gdGhpczsKCX0sCgoJLyoqCgkJUmVtb3ZlcyBhbnkgaWRsZSBzdGF0ZSBwcmV2aW91c2x5IHNldCB1c2luZyBhZGRJZGxlU3RhdGUoKQoKCQlAcGFyYW0ge0hUTUxFbGVtZW50fHN0cmluZ30gZWxlbSBUaGUgRG9tIG5vZGUgb3Igc2VsZWN0b3IgdG8gcmVtb3ZlIHRoZSBpZGxlIHN0YXRlIGZyb20uCgoJCUByZXR1cm5zIEluc3RhbmNlCgkqLwoKCXJlbW92ZUlkbGVTdGF0ZTogZnVuY3Rpb24oIGVsZW0gKSB7CgkJdGhpcy5faWRsZS5yZW1vdmUuYXBwbHkoIHRoaXMuX2lkbGUsIFV0aWxzLmFycmF5KCBhcmd1bWVudHMgKSApOwoJCXJldHVybiB0aGlzOwoJfSwKCgkvKioKCQlGb3JjZSBHYWxsZXJpYSB0byBlbnRlciBpZGxlIG1vZGUuCgoJCUByZXR1cm5zIEluc3RhbmNlCgkqLwoKCWVudGVySWRsZU1vZGU6IGZ1bmN0aW9uKCkgewoJCXRoaXMuX2lkbGUuaGlkZSgpOwoJCXJldHVybiB0aGlzOwoJfSwKCgkvKioKCQlGb3JjZSBHYWxsZXJpYSB0byBleGl0IGlkbGUgbW9kZS4KCgkJQHJldHVybnMgSW5zdGFuY2UKCSovCgoJZXhpdElkbGVNb2RlOiBmdW5jdGlvbigpIHsKCQl0aGlzLl9pZGxlLnNob3dBbGwoKTsKCQlyZXR1cm4gdGhpczsKCX0sCgoJLyoqCgkJRW50ZXIgRnVsbFNjcmVlbiBtb2RlCgoJCUBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIHRoZSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCB3aGVuIHRoZSBmdWxsc2NyZWVuIG1vZGUgaXMgZnVsbHkgYXBwbGllZC4KCgkJQHJldHVybnMgSW5zdGFuY2UKCSovCgoJZW50ZXJGdWxsc2NyZWVuOiBmdW5jdGlvbiggY2FsbGJhY2sgKSB7CgkJdGhpcy5fZnVsbHNjcmVlbi5lbnRlci5hcHBseSggdGhpcywgVXRpbHMuYXJyYXkoIGFyZ3VtZW50cyApICk7CgkJcmV0dXJuIHRoaXM7Cgl9LAoKCS8qKgoJCUV4aXRzIEZ1bGxTY3JlZW4gbW9kZQoKCQlAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayB0aGUgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgd2hlbiB0aGUgZnVsbHNjcmVlbiBtb2RlIGlzIGZ1bGx5IGFwcGxpZWQuCgoJCUByZXR1cm5zIEluc3RhbmNlCgkqLwoKCWV4aXRGdWxsc2NyZWVuOiBmdW5jdGlvbiggY2FsbGJhY2sgKSB7CgkJdGhpcy5fZnVsbHNjcmVlbi5leGl0LmFwcGx5KCB0aGlzLCBVdGlscy5hcnJheSggYXJndW1lbnRzICkgKTsKCQlyZXR1cm4gdGhpczsKCX0sCgoJLyoqCgkJVG9nZ2xlIEZ1bGxTY3JlZW4gbW9kZQoKCQlAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayB0aGUgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgd2hlbiB0aGUgZnVsbHNjcmVlbiBtb2RlIGlzIGZ1bGx5IGFwcGxpZWQgb3IgcmVtb3ZlZC4KCgkJQHJldHVybnMgSW5zdGFuY2UKCSovCgoJdG9nZ2xlRnVsbHNjcmVlbjogZnVuY3Rpb24oIGNhbGxiYWNrICkgewoJCXRoaXMuX2Z1bGxzY3JlZW5bIHRoaXMuaXNGdWxsc2NyZWVuKCkgPyAnZXhpdCcgOiAnZW50ZXInXS5hcHBseSggdGhpcywgVXRpbHMuYXJyYXkoIGFyZ3VtZW50cyApICk7CgkJcmV0dXJuIHRoaXM7Cgl9LAoKCS8qKgoJCUFkZHMgYSB0b29sdGlwIHRvIGFueSBlbGVtZW50LgoJCVlvdSBjYW4gYWxzbyBjYWxsIHRoaXMgbWV0aG9kIHdpdGggYW4gb2JqZWN0IGFzIGFyZ3VtZW50IHdpdGggZWxlbUlEOnZhbHVlIHBhaXJzIHRvIGFwcGx5IHRvb2x0aXBzIHRvIChzZWUgZXhhbXBsZXMpCgoJCUBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW0gVGhlIERPTSBOb2RlIHRvIGF0dGFjaCB0aGUgZXZlbnQgdG8KCQlAcGFyYW0ge3N0cmluZ3xGdW5jdGlvbn0gdmFsdWUgVGhlIHRvb2x0aXAgbWVzc2FnZS4gQ2FuIGFsc28gYmUgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBzdHJpbmcuCgoJCUBleGFtcGxlIHRoaXMuYmluZFRvb2x0aXAoIHRoaXMuZ2V0KCd0aHVtYm5haWxzJyksICdNeSB0aHVtYm5haWxzJyk7CgkJQGV4YW1wbGUgdGhpcy5iaW5kVG9vbHRpcCggdGhpcy5nZXQoJ3RodW1ibmFpbHMnKSwgZnVuY3Rpb24oKSB7IHJldHVybiAnTXkgdGh1bWJzJyB9KTsKCQlAZXhhbXBsZSB0aGlzLmJpbmRUb29sdGlwKCB7IGltYWdlX25hdjogJ05hdmlnYXRpb24nIH0pOwoKCQlAcmV0dXJucyBJbnN0YW5jZQoJKi8KCgliaW5kVG9vbHRpcDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgewoJCXRoaXMuX3Rvb2x0aXAuYmluZC5hcHBseSggdGhpcy5fdG9vbHRpcCwgVXRpbHMuYXJyYXkoYXJndW1lbnRzKSApOwoJCXJldHVybiB0aGlzOwoJfSwKCgkvKioKCQlOb3RlOiB0aGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBVc2UgcmVmcmVzaFRvb2x0aXAoKSBpbnN0ZWFkLgoKCQlSZWRlZmluZSBhIHRvb2x0aXAuCgkJVXNlIHRoaXMgaWYgeW91IHdhbnQgdG8gcmUtYXBwbHkgYSB0b29sdGlwIHZhbHVlIHRvIGFuIGFscmVhZHkgYm91bmQgdG9vbHRpcCBlbGVtZW50LgoKCQlAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtIFRoZSBET00gTm9kZSB0byBhdHRhY2ggdGhlIGV2ZW50IHRvCgkJQHBhcmFtIHtzdHJpbmd8RnVuY3Rpb259IHZhbHVlIFRoZSB0b29sdGlwIG1lc3NhZ2UuIENhbiBhbHNvIGJlIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgc3RyaW5nLgoKCQlAcmV0dXJucyBJbnN0YW5jZQoJKi8KCglkZWZpbmVUb29sdGlwOiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJdGhpcy5fdG9vbHRpcC5kZWZpbmUuYXBwbHkoIHRoaXMuX3Rvb2x0aXAsIFV0aWxzLmFycmF5KGFyZ3VtZW50cykgKTsKCQlyZXR1cm4gdGhpczsKCX0sCgoJLyoqCgkJUmVmcmVzaCBhIHRvb2x0aXAgdmFsdWUuCgkJVXNlIHRoaXMgaWYgeW91IHdhbnQgdG8gY2hhbmdlIHRoZSB0b29sdGlwIHZhbHVlIGF0IHJ1bnRpbWUsIGYuZXggaWYgeW91IGhhdmUgYSBwbGF5L3BhdXNlIHRvZ2dsZS4KCgkJQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbSBUaGUgRE9NIE5vZGUgdGhhdCBoYXMgYSB0b29sdGlwIHRoYXQgc2hvdWxkIGJlIHJlZnJlc2hlZAoKCQlAcmV0dXJucyBJbnN0YW5jZQoJKi8KCglyZWZyZXNoVG9vbHRpcDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJdGhpcy5fdG9vbHRpcC5zaG93LmFwcGx5KCB0aGlzLl90b29sdGlwLCBVdGlscy5hcnJheShhcmd1bWVudHMpICk7CgkJcmV0dXJuIHRoaXM7Cgl9LAoKCS8qKgoJCU9wZW4gYSBwcmUtZGVzaWduZWQgbGlnaHRib3ggd2l0aCB0aGUgY3VycmVudGx5IGFjdGl2ZSBpbWFnZS4KCQlZb3UgY2FuIGNvbnRyb2wgc29tZSB2aXN1YWxzIHVzaW5nIGdhbGxlcnkgb3B0aW9ucy4KCgkJQHJldHVybnMgSW5zdGFuY2UKCSovCgoJb3BlbkxpZ2h0Ym94OiBmdW5jdGlvbigpIHsKCQl0aGlzLl9saWdodGJveC5zaG93LmFwcGx5KCB0aGlzLl9saWdodGJveCwgVXRpbHMuYXJyYXkoIGFyZ3VtZW50cyApICk7CgkJcmV0dXJuIHRoaXM7Cgl9LAoKCS8qKgoJCUNsb3NlIHRoZSBsaWdodGJveC4KCgkJQHJldHVybnMgSW5zdGFuY2UKCSovCgoJY2xvc2VMaWdodGJveDogZnVuY3Rpb24oKSB7CgkJdGhpcy5fbGlnaHRib3guaGlkZS5hcHBseSggdGhpcy5fbGlnaHRib3gsIFV0aWxzLmFycmF5KCBhcmd1bWVudHMgKSApOwoJCXJldHVybiB0aGlzOwoJfSwKCgkvKioKCQlHZXQgdGhlIGN1cnJlbnRseSBhY3RpdmUgaW1hZ2UgZWxlbWVudC4KCgkJQHJldHVybnMge0hUTUxFbGVtZW50fSBUaGUgaW1hZ2UgZWxlbWVudAoJKi8KCglnZXRBY3RpdmVJbWFnZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX2dldEFjdGl2ZSgpLmltYWdlIHx8IHVuZGVmOwoJfSwKCgkvKioKCQlHZXQgdGhlIGN1cnJlbnRseSBhY3RpdmUgdGh1bWJuYWlsIGVsZW1lbnQuCgoJCUByZXR1cm5zIHtIVE1MRWxlbWVudH0gVGhlIHRodW1ibmFpbCBlbGVtZW50CgkqLwoKCWdldEFjdGl2ZVRodW1iOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5fdGh1bWJuYWlsc1sgdGhpcy5fYWN0aXZlIF0uaW1hZ2UgfHwgdW5kZWY7Cgl9LAoKCS8qKgoJCUdldCB0aGUgbW91c2UgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIGdhbGxlcnkgY29udGFpbmVyCgoJCUBwYXJhbSBlIFRoZSBtb3VzZSBldmVudAoKCQlAZXhhbXBsZQoKdmFyIGdhbGxlcnkgPSB0aGlzOwokKGRvY3VtZW50KS5tb3VzZW1vdmUoZnVuY3Rpb24oZSkgewoJY29uc29sZS5sb2coIGdhbGxlcnkuZ2V0TW91c2VQb3NpdGlvbihlKS54ICk7Cn0pOwoKCQlAcmV0dXJucyB7T2JqZWN0fSBPYmplY3Qgd2l0aCB4ICYgeSBvZiB0aGUgcmVsYXRpdmUgbW91c2UgcG9zdGlvbgoJKi8KCglnZXRNb3VzZVBvc2l0aW9uIDogZnVuY3Rpb24oZSkgewoJCXJldHVybiB7CgkJCXg6IGUucGFnZVggLSB0aGlzLiQoICdjb250YWluZXInICkub2Zmc2V0KCkubGVmdCwKCQkJeTogZS5wYWdlWSAtIHRoaXMuJCggJ2NvbnRhaW5lcicgKS5vZmZzZXQoKS50b3AKCQl9OwoJfSwKCgkvKioKCQlBZGRzIGEgcGFubmluZyBlZmZlY3QgdG8gdGhlIGltYWdlCgoJCUBwYXJhbSBpbWcgVGhlIG9wdGlvbmFsIGltYWdlIGVsZW1lbnQuIElmIG5vdCBzcGVjaWZpZWQgaXQgdGFrZXMgdGhlIGN1cnJlbnRseSBhY3RpdmUgaW1hZ2UKCgkJQHJldHVybnMgSW5zdGFuY2UKCSovCgoJYWRkUGFuIDogZnVuY3Rpb24oIGltZyApIHsKCgkJaWYgKCB0aGlzLl9vcHRpb25zLmltYWdlQ3JvcCA9PT0gZmFsc2UgKSB7CgkJCXJldHVybjsKCQl9CgoJCWltZyA9ICQoIGltZyB8fCB0aGlzLmdldEFjdGl2ZUltYWdlKCkgKTsKCgkJLy8gZGVmaW5lIHNvbWUgdmFyaWFibGVzIGFuZCBtZXRob2RzCgkJdmFyIHNlbGYgICA9IHRoaXMsCgkJCXggICAgICA9IGltZy53aWR0aCgpIC8gMiwKCQkJeSAgICAgID0gaW1nLmhlaWdodCgpIC8gMiwKCQkJZGVzdFggID0gcGFyc2VJbnQoIGltZy5jc3MoICdsZWZ0JyApLCAxMCApLAoJCQlkZXN0WSAgPSBwYXJzZUludCggaW1nLmNzcyggJ3RvcCcgKSwgMTAgKSwKCQkJY3VyWCAgID0gZGVzdFggfHwgMCwKCQkJY3VyWSAgID0gZGVzdFkgfHwgMCwKCQkJZGlzdFggID0gMCwKCQkJZGlzdFkgID0gMCwKCQkJYWN0aXZlID0gZmFsc2UsCgkJCXRzICAgICA9IFV0aWxzLnRpbWVzdGFtcCgpLAoJCQljYWNoZSAgPSAwLAoJCQltb3ZlICAgPSAwLAoKCQkJLy8gcG9zaXRpb25zIHRoZSBpbWFnZQoJCQlwb3NpdGlvbiA9IGZ1bmN0aW9uKCBkaXN0LCBjdXIsIHBvcyApIHsKCQkJCWlmICggZGlzdCA+IDAgKSB7CgkJCQkJbW92ZSA9IE1hdGgucm91bmQoIE1hdGgubWF4KCBkaXN0ICogLTEsIE1hdGgubWluKCAwLCBjdXIgKSApICk7CgkJCQkJaWYgKCBjYWNoZSAhPT0gbW92ZSApIHsKCgkJCQkJCWNhY2hlID0gbW92ZTsKCgkJCQkJCWlmICggSUUgPT09IDggKSB7IC8vIHNjcm9sbCBpcyBmYXN0ZXIgZm9yIElFCgkJCQkJCQlpbWcucGFyZW50KClbICdzY3JvbGwnICsgcG9zIF0oIG1vdmUgKiAtMSApOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJdmFyIGNzcyA9IHt9OwoJCQkJCQkJY3NzWyBwb3MudG9Mb3dlckNhc2UoKSBdID0gbW92ZTsKCQkJCQkJCWltZy5jc3MoY3NzKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfSwKCgkJCS8vIGNhbGN1bGF0ZXMgbW91c2UgcG9zaXRpb24gYWZ0ZXIgNTBtcwoJCQljYWxjdWxhdGUgPSBmdW5jdGlvbihlKSB7CgkJCQlpZiAoVXRpbHMudGltZXN0YW1wKCkgLSB0cyA8IDUwKSB7CgkJCQkJcmV0dXJuOwoJCQkJfQoJCQkJYWN0aXZlID0gdHJ1ZTsKCQkJCXggPSBzZWxmLmdldE1vdXNlUG9zaXRpb24oZSkueDsKCQkJCXkgPSBzZWxmLmdldE1vdXNlUG9zaXRpb24oZSkueTsKCQkJfSwKCgkJCS8vIHRoZSBtYWluIGxvb3AgdG8gY2hlY2sKCQkJbG9vcCA9IGZ1bmN0aW9uKGUpIHsKCgkJCQlpZiAoIWFjdGl2ZSkgewoJCQkJCXJldHVybjsKCQkJCX0KCgkJCQlkaXN0WCA9IGltZy53aWR0aCgpIC0gc2VsZi5fc3RhZ2VXaWR0aDsKCQkJCWRpc3RZID0gaW1nLmhlaWdodCgpIC0gc2VsZi5fc3RhZ2VIZWlnaHQ7CgkJCQlkZXN0WCA9IHggLyBzZWxmLl9zdGFnZVdpZHRoICogZGlzdFggKiAtMTsKCQkJCWRlc3RZID0geSAvIHNlbGYuX3N0YWdlSGVpZ2h0ICogZGlzdFkgKiAtMTsKCQkJCWN1clggKz0gKCBkZXN0WCAtIGN1clggKSAvIHNlbGYuX29wdGlvbnMuaW1hZ2VQYW5TbW9vdGhuZXNzOwoJCQkJY3VyWSArPSAoIGRlc3RZIC0gY3VyWSApIC8gc2VsZi5fb3B0aW9ucy5pbWFnZVBhblNtb290aG5lc3M7CgoJCQkJcG9zaXRpb24oIGRpc3RZLCBjdXJZLCAnVG9wJyApOwoJCQkJcG9zaXRpb24oIGRpc3RYLCBjdXJYLCAnTGVmdCcgKTsKCgkJCX07CgoJCS8vIHdlIG5lZWQgdG8gdXNlIHNjcm9sbCBpbiBJRTggdG8gc3BlZWQgdGhpbmdzIHVwCgkJaWYgKCBJRSA9PT0gOCApIHsKCgkJCWltZy5wYXJlbnQoKS5zY3JvbGxUb3AoIGN1clkgKiAtMSApLnNjcm9sbExlZnQoIGN1clggKiAtMSApOwoJCQlpbWcuY3NzKHsKCQkJCXRvcDogMCwKCQkJCWxlZnQ6IDAKCQkJfSk7CgoJCX0KCgkJLy8gdW5iaW5kIGFuZCBiaW5kIGV2ZW50CgkJdGhpcy4kKCAnc3RhZ2UnICkudW5iaW5kKCAnbW91c2Vtb3ZlJywgY2FsY3VsYXRlICkuYmluZCggJ21vdXNlbW92ZScsIGNhbGN1bGF0ZSApOwoKCQkvLyBsb29wIHRoZSBsb29wCgkJVXRpbHMuYWRkVGltZXIoJ3BhbicsIGxvb3AsIDUwLCB0cnVlKTsKCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCS8qKgoJCUJyaW5ncyB0aGUgc2NvcGUgaW50byBhbnkgY2FsbGJhY2sKCgkJQHBhcmFtIGZuIFRoZSBjYWxsYmFjayB0byBicmluZyB0aGUgc2NvcGUgaW50bwoJCUBwYXJhbSBzY29wZSBPcHRpb25hbCBzY29wZSB0byBicmluZwoKCQlAZXhhbXBsZSAkKCcjZnVsbHNjcmVlbicpLmNsaWNrKCB0aGlzLnByb3h5KGZ1bmN0aW9uKCkgeyB0aGlzLmVudGVyRnVsbHNjcmVlbigpOyB9KSApCgoJCUByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJuIHRoZSBjYWxsYmFjayB3aXRoIHRoZSBnYWxsZXJ5IHNjb3BlCgkqLwoKCXByb3h5IDogZnVuY3Rpb24oIGZuLCBzY29wZSApIHsKCQlpZiAoIHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJyApIHsKCQkJcmV0dXJuIGZ1bmN0aW9uKCkge307CgkJfQoJCXNjb3BlID0gc2NvcGUgfHwgdGhpczsKCQlyZXR1cm4gZnVuY3Rpb24oKSB7CgkJCXJldHVybiBmbi5hcHBseSggc2NvcGUsIFV0aWxzLmFycmF5KCBhcmd1bWVudHMgKSApOwoJCX07Cgl9LAoKCS8qKgoJCVJlbW92ZXMgdGhlIHBhbm5pbmcgZWZmZWN0IHNldCBieSBhZGRQYW4oKQoKCQlAcmV0dXJucyBJbnN0YW5jZQoJKi8KCglyZW1vdmVQYW46IGZ1bmN0aW9uKCkgewoKCQkvLyB0b2RvOiBkb3VibGVjaGVjayBJRTgKCgkJdGhpcy4kKCAnc3RhZ2UnICkudW5iaW5kKCAnbW91c2Vtb3ZlJyApOwoKCQlVdGlscy5jbGVhclRpbWVyKCAncGFuJyApOwoKCQlyZXR1cm4gdGhpczsKCX0sCgoJLyoqCgkJQWRkcyBhbiBlbGVtZW50IHRvIHRoZSBHYWxsZXJpYSBET00gYXJyYXkuCgkJV2hlbiB5b3UgYWRkIGFuIGVsZW1lbnQgaGVyZSwgeW91IGNhbiBhY2Nlc3MgaXQgdXNpbmcgZWxlbWVudCBJRCBpbiBtYW55IEFQSSBjYWxscwoKCQlAcGFyYW0ge3N0cmluZ30gaWQgVGhlIGVsZW1lbnQgSUQgeW91IHdpc2ggdG8gdXNlLiBZb3UgY2FuIGFkZCBtYW55IGVsZW1lbnRzIGJ5IGFkZGluZyBtb3JlIGFyZ3VtZW50cy4KCgkJQGV4YW1wbGUgYWRkRWxlbWVudCgnbXlidXR0b24nKTsKCQlAZXhhbXBsZSBhZGRFbGVtZW50KCdteWJ1dHRvbicsJ215bGluaycpOwoKCQlAcmV0dXJucyBJbnN0YW5jZQoJKi8KCglhZGRFbGVtZW50IDogZnVuY3Rpb24oIGlkICkgewoKCQl2YXIgZG9tID0gdGhpcy5fZG9tOwoKCQkkLmVhY2goIFV0aWxzLmFycmF5KGFyZ3VtZW50cyksIGZ1bmN0aW9uKCBpLCBibHVlcHJpbnQgKSB7CgkJICAgZG9tWyBibHVlcHJpbnQgXSA9IFV0aWxzLmNyZWF0ZSggJ2dhbGxlcmlhLScgKyBibHVlcHJpbnQgKTsKCQl9KTsKCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCS8qKgoJCUF0dGFjaCBrZXlib2FyZCBldmVudHMgdG8gR2FsbGVyaWEKCgkJQHBhcmFtIHtPYmplY3R9IG1hcCBUaGUgbWFwIG9iamVjdCBvZiBldmVudHMuCgkJUG9zc2libGUga2V5cyBhcmUgJ1VQJywgJ0RPV04nLCAnTEVGVCcsICdSSUdIVCcsICdSRVRVUk4nLCAnRVNDQVBFJywgJ0JBQ0tTUEFDRScsIGFuZCAnU1BBQ0UnLgoKCQlAZXhhbXBsZQoKdGhpcy5hdHRhY2hLZXlib2FyZCh7CglyaWdodDogdGhpcy5uZXh0LAoJbGVmdDogdGhpcy5wcmV2LAoJdXA6IGZ1bmN0aW9uKCkgewoJCWNvbnNvbGUubG9nKCAndXAga2V5IHByZXNzZWQnICkKCX0KfSk7CgoJCUByZXR1cm5zIEluc3RhbmNlCgkqLwoKCWF0dGFjaEtleWJvYXJkIDogZnVuY3Rpb24oIG1hcCApIHsKCQl0aGlzLl9rZXlib2FyZC5hdHRhY2guYXBwbHkoIHRoaXMuX2tleWJvYXJkLCBVdGlscy5hcnJheSggYXJndW1lbnRzICkgKTsKCQlyZXR1cm4gdGhpczsKCX0sCgoJLyoqCgkJRGV0YWNoIGFsbCBrZXlib2FyZCBldmVudHMgdG8gR2FsbGVyaWEKCgkJQHJldHVybnMgSW5zdGFuY2UKCSovCgoJZGV0YWNoS2V5Ym9hcmQgOiBmdW5jdGlvbigpIHsKCQl0aGlzLl9rZXlib2FyZC5kZXRhY2guYXBwbHkoIHRoaXMuX2tleWJvYXJkLCBVdGlscy5hcnJheSggYXJndW1lbnRzICkgKTsKCQlyZXR1cm4gdGhpczsKCX0sCgoJLyoqCgkJRmFzdCBoZWxwZXIgZm9yIGFwcGVuZGluZyBnYWxsZXJpYSBlbGVtZW50cyB0aGF0IHlvdSBhZGRlZCB1c2luZyBhZGRFbGVtZW50KCkKCgkJQHBhcmFtIHtzdHJpbmd9IHBhcmVudElEIFRoZSBwYXJlbnQgZWxlbWVudCBJRCB3aGVyZSB0aGUgZWxlbWVudCB3aWxsIGJlIGFwcGVuZGVkCgkJQHBhcmFtIHtzdHJpbmd9IGNoaWxkSUQgdGhlIGVsZW1lbnQgSUQgdGhhdCBzaG91bGQgYmUgYXBwZW5kZWQKCgkJQGV4YW1wbGUgdGhpcy5hZGRFbGVtZW50KCdteUVsZW1lbnQnKTsKCQl0aGlzLmFwcGVuZENoaWxkKCAnaW5mbycsICdteUVsZW1lbnQnICk7CgoJCUByZXR1cm5zIEluc3RhbmNlCgkqLwoKCWFwcGVuZENoaWxkIDogZnVuY3Rpb24oIHBhcmVudElELCBjaGlsZElEICkgewoJCXRoaXMuJCggcGFyZW50SUQgKS5hcHBlbmQoIHRoaXMuZ2V0KCBjaGlsZElEICkgfHwgY2hpbGRJRCApOwoJCXJldHVybiB0aGlzOwoJfSwKCgkvKioKCQlGYXN0IGhlbHBlciBmb3IgcHJlcGVuZGluZyBnYWxsZXJpYSBlbGVtZW50cyB0aGF0IHlvdSBhZGRlZCB1c2luZyBhZGRFbGVtZW50KCkKCgkJQHBhcmFtIHtzdHJpbmd9IHBhcmVudElEIFRoZSBwYXJlbnQgZWxlbWVudCBJRCB3aGVyZSB0aGUgZWxlbWVudCB3aWxsIGJlIHByZXBlbmRlZAoJCUBwYXJhbSB7c3RyaW5nfSBjaGlsZElEIHRoZSBlbGVtZW50IElEIHRoYXQgc2hvdWxkIGJlIHByZXBlbmRlZAoKCQlAZXhhbXBsZQoKdGhpcy5hZGRFbGVtZW50KCdteUVsZW1lbnQnKTsKdGhpcy5wcmVwZW5kQ2hpbGQoICdpbmZvJywgJ215RWxlbWVudCcgKTsKCgkJQHJldHVybnMgSW5zdGFuY2UKCSovCgoJcHJlcGVuZENoaWxkIDogZnVuY3Rpb24oIHBhcmVudElELCBjaGlsZElEICkgewoJCXRoaXMuJCggcGFyZW50SUQgKS5wcmVwZW5kKCB0aGlzLmdldCggY2hpbGRJRCApIHx8IGNoaWxkSUQgKTsKCQlyZXR1cm4gdGhpczsKCX0sCgoJLyoqCgkJUmVtb3ZlIGFuIGVsZW1lbnQgYnkgYmx1ZXByaW50CgoJCUBwYXJhbSB7c3RyaW5nfSBlbGVtSUQgVGhlIGVsZW1lbnQgdG8gYmUgcmVtb3ZlZC4KCQlZb3UgY2FuIHJlbW92ZSBtdWx0aXBsZSBlbGVtZW50cyBieSBhZGRpbmcgYXJndW1lbnRzLgoKCQlAcmV0dXJucyBJbnN0YW5jZQoJKi8KCglyZW1vdmUgOiBmdW5jdGlvbiggZWxlbUlEICkgewoJCXRoaXMuJCggVXRpbHMuYXJyYXkoIGFyZ3VtZW50cyApLmpvaW4oJywnKSApLnJlbW92ZSgpOwoJCXJldHVybiB0aGlzOwoJfSwKCgkvLyBhIGZhc3QgaGVscGVyIGZvciBidWlsZGluZyBkb20gc3RydWN0dXJlcwoJLy8gbGVhdmUgdGhpcyBvdXQgb2YgdGhlIEFQSSBmb3Igbm93CgoJYXBwZW5kIDogZnVuY3Rpb24oIGRhdGEgKSB7CgkJdmFyIGksIGo7CgkJZm9yKCBpIGluIGRhdGEgKSB7CgkJCWlmICggZGF0YS5oYXNPd25Qcm9wZXJ0eSggaSApICkgewoJCQkJaWYgKCBkYXRhW2ldLmNvbnN0cnVjdG9yID09PSBBcnJheSApIHsKCQkJCQlmb3IoIGogPSAwOyBkYXRhW2ldW2pdOyBqKysgKSB7CgkJCQkJCXRoaXMuYXBwZW5kQ2hpbGQoIGksIGRhdGFbaV1bal0gKTsKCQkJCQl9CgkJCQl9IGVsc2UgewoJCQkJCXRoaXMuYXBwZW5kQ2hpbGQoIGksIGRhdGFbaV0gKTsKCQkJCX0KCQkJfQoJCX0KCQlyZXR1cm4gdGhpczsKCX0sCgoJLy8gYW4gaW50ZXJuYWwgaGVscGVyIGZvciBzY2FsaW5nIGFjY29yZGluZyB0byBvcHRpb25zCglfc2NhbGVJbWFnZSA6IGZ1bmN0aW9uKCBpbWFnZSwgb3B0aW9ucyApIHsKCgkJaW1hZ2UgPSBpbWFnZSB8fCB0aGlzLl9jb250cm9scy5nZXRBY3RpdmUoKTsKCgkJLy8gamFucHViIChKSCkgZml4OgoJCS8vIGltYWdlIG1pZ2h0IGJlIHVuc2VsZWN0ZWQgeWV0CgkJLy8gZS5nLiB3aGVuIGV4dGVybmFsIGxvZ2ljcyByZXNjYWxlcyB0aGUgZ2FsbGVyeSBvbiB3aW5kb3cgcmVzaXplIGV2ZW50cwoJCWlmKCAhaW1hZ2UgKSB7CgkJCXJldHVybjsKCQl9CgoJCXZhciBzZWxmID0gdGhpcywKCgkJCWNvbXBsZXRlLAoKCQkJc2NhbGVMYXllciA9IGZ1bmN0aW9uKCBpbWcgKSB7CgkJCQkkKCBpbWcuY29udGFpbmVyICkuY2hpbGRyZW4oJzpmaXJzdCcpLmNzcyh7CgkJCQkJdG9wOiBNYXRoLm1heCgwLCBVdGlscy5wYXJzZVZhbHVlKCBpbWcuaW1hZ2Uuc3R5bGUudG9wICkpLAoJCQkJCWxlZnQ6IE1hdGgubWF4KDAsIFV0aWxzLnBhcnNlVmFsdWUoIGltZy5pbWFnZS5zdHlsZS5sZWZ0ICkpLAoJCQkJCXdpZHRoOiBVdGlscy5wYXJzZVZhbHVlKCBpbWcuaW1hZ2Uud2lkdGggKSwKCQkJCQloZWlnaHQ6IFV0aWxzLnBhcnNlVmFsdWUoIGltZy5pbWFnZS5oZWlnaHQgKQoJCQkJfSk7CgkJCX07CgoJCW9wdGlvbnMgPSAkLmV4dGVuZCh7CgkJCXdpZHRoOiAgICB0aGlzLl9zdGFnZVdpZHRoLAoJCQloZWlnaHQ6ICAgdGhpcy5fc3RhZ2VIZWlnaHQsCgkJCWNyb3A6ICAgICB0aGlzLl9vcHRpb25zLmltYWdlQ3JvcCwKCQkJbWF4OiAgICAgIHRoaXMuX29wdGlvbnMubWF4U2NhbGVSYXRpbywKCQkJbWluOiAgICAgIHRoaXMuX29wdGlvbnMubWluU2NhbGVSYXRpbywKCQkJbWFyZ2luOiAgIHRoaXMuX29wdGlvbnMuaW1hZ2VNYXJnaW4sCgkJCXBvc2l0aW9uOiB0aGlzLl9vcHRpb25zLmltYWdlUG9zaXRpb24KCQl9LCBvcHRpb25zICk7CgoJCWlmICggdGhpcy5fb3B0aW9ucy5sYXllckZvbGxvdyAmJiB0aGlzLl9vcHRpb25zLmltYWdlQ3JvcCAhPT0gdHJ1ZSApIHsKCgkJCWlmICggdHlwZW9mIG9wdGlvbnMuY29tcGxldGUgPT0gJ2Z1bmN0aW9uJyApIHsKCQkJCWNvbXBsZXRlID0gb3B0aW9ucy5jb21wbGV0ZTsKCQkJCW9wdGlvbnMuY29tcGxldGUgPSBmdW5jdGlvbigpIHsKCQkJCQljb21wbGV0ZS5jYWxsKCBpbWFnZSwgaW1hZ2UgKTsKCQkJCQlzY2FsZUxheWVyKCBpbWFnZSApOwoJCQkJfTsKCQkJfSBlbHNlIHsKCQkJCW9wdGlvbnMuY29tcGxldGUgPSBzY2FsZUxheWVyOwoJCQl9CgoJCX0gZWxzZSB7CgkJCSQoIGltYWdlLmNvbnRhaW5lciApLmNoaWxkcmVuKCc6Zmlyc3QnKS5jc3MoeyB0b3A6IDAsIGxlZnQ6IDAgfSk7CgkJfQoKCQlpbWFnZS5zY2FsZSggb3B0aW9ucyApOwoJCXJldHVybiB0aGlzOwoJfSwKCgkvKioKCQlVcGRhdGVzIHRoZSBjYXJvdXNlbCwKCQl1c2VmdWwgaWYgeW91IHJlc2l6ZSB0aGUgZ2FsbGVyeSBhbmQgd2FudCB0byByZS1jaGVjayBpZiB0aGUgY2Fyb3VzZWwgbmF2IGlzIG5lZWRlZC4KCgkJQHJldHVybnMgSW5zdGFuY2UKCSovCgoJdXBkYXRlQ2Fyb3VzZWwgOiBmdW5jdGlvbigpIHsKCQl0aGlzLl9jYXJvdXNlbC51cGRhdGUoKTsKCQlyZXR1cm4gdGhpczsKCX0sCgoJLyoqCgkJUmVzY2FsZXMgdGhlIGdhbGxlcnkKCgkJQHBhcmFtIHtudW1iZXJ9IHdpZHRoIFRoZSB0YXJnZXQgd2lkdGgKCQlAcGFyYW0ge251bWJlcn0gaGVpZ2h0IFRoZSB0YXJnZXQgaGVpZ2h0CgkJQHBhcmFtIHtGdW5jdGlvbn0gY29tcGxldGUgVGhlIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBzY2FsaW5nIGlzIGNvbXBsZXRlCgoJCUByZXR1cm5zIEluc3RhbmNlCgkqLwoKCXJlc2NhbGUgOiBmdW5jdGlvbiggd2lkdGgsIGhlaWdodCwgY29tcGxldGUgKSB7CgoJCXZhciBzZWxmID0gdGhpczsKCgkJLy8gYWxsb3cgcmVzY2FsZShmbikKCQlpZiAoIHR5cGVvZiB3aWR0aCA9PT0gJ2Z1bmN0aW9uJyApIHsKCQkJY29tcGxldGUgPSB3aWR0aDsKCQkJd2lkdGggPSB1bmRlZjsKCQl9CgoJCXZhciBzY2FsZSA9IGZ1bmN0aW9uKCkgewoKCQkJLy8gc2V0IHN0YWdld2lkdGgKCQkJc2VsZi5fc3RhZ2VXaWR0aCA9IHdpZHRoIHx8IHNlbGYuJCggJ3N0YWdlJyApLndpZHRoKCk7CgkJCXNlbGYuX3N0YWdlSGVpZ2h0ID0gaGVpZ2h0IHx8IHNlbGYuJCggJ3N0YWdlJyApLmhlaWdodCgpOwoKCQkJLy8gc2NhbGUgdGhlIGFjdGl2ZSBpbWFnZQoJCQlzZWxmLl9zY2FsZUltYWdlKCk7CgoJCQlpZiAoIHNlbGYuX29wdGlvbnMuY2Fyb3VzZWwgKSB7CgkJCQlzZWxmLnVwZGF0ZUNhcm91c2VsKCk7CgkJCX0KCgkJCXNlbGYudHJpZ2dlciggR2FsbGVyaWEuUkVTQ0FMRSApOwoKCQkJaWYgKCB0eXBlb2YgY29tcGxldGUgPT09ICdmdW5jdGlvbicgKSB7CgkJCQljb21wbGV0ZS5jYWxsKCBzZWxmICk7CgkJCX0KCQl9OwoKCQlpZiAoIEdhbGxlcmlhLldFQktJVCAmJiAhd2lkdGggJiYgIWhlaWdodCApIHsKCQkJVXRpbHMuYWRkVGltZXIoICdzY2FsZScsIHNjYWxlLCAxMCApOy8vIHdlYmtpdCBpcyB0b28gZmFzdAoJCX0gZWxzZSB7CgkJCXNjYWxlLmNhbGwoIHNlbGYgKTsKCQl9CgoJCXJldHVybiB0aGlzOwoJfSwKCgkvKioKCQlSZWZyZXNoZXMgdGhlIGdhbGxlcnkuCgkJVXNlZnVsIGlmIHlvdSBjaGFuZ2UgaW1hZ2Ugb3B0aW9ucyBhdCBydW50aW1lIGFuZCB3YW50IHRvIGFwcGx5IHRoZSBjaGFuZ2VzIHRvIHRoZSBhY3RpdmUgaW1hZ2UuCgoJCUByZXR1cm5zIEluc3RhbmNlCgkqLwoKCXJlZnJlc2hJbWFnZSA6IGZ1bmN0aW9uKCkgewoJCXRoaXMuX3NjYWxlSW1hZ2UoKTsKCQlpZiAoIHRoaXMuX29wdGlvbnMuaW1hZ2VQYW4gKSB7CgkJCXRoaXMuYWRkUGFuKCk7CgkJfQoJCXJldHVybiB0aGlzOwoJfSwKCgkvKioKCQlTaG93cyBhbiBpbWFnZSBieSBpbmRleAoKCQlAcGFyYW0ge251bWJlcnxib29sZWFufSBpbmRleCBUaGUgaW5kZXggdG8gc2hvdwoJCUBwYXJhbSB7Qm9vbGVhbn0gcmV3aW5kIEEgYm9vbGVhbiB0aGF0IHNob3VsZCBiZSB0cnVlIGlmIHlvdSB3YW50IHRoZSB0cmFuc2l0aW9uIHRvIGdvIGJhY2sKCgkJQHJldHVybnMgSW5zdGFuY2UKCSovCgoJc2hvdyA6IGZ1bmN0aW9uKCBpbmRleCwgcmV3aW5kLCBfaGlzdG9yeSApIHsKCgkJLy8gZG8gbm90aGluZyBpZiBpbmRleCBpcyBmYWxzZSBvciBxdWV1ZSBpcyBmYWxzZSBhbmQgdHJhbnNpdGlvbiBpcyBpbiBwcm9ncmVzcwoJCWlmICggaW5kZXggPT09IGZhbHNlIHx8ICggIXRoaXMuX29wdGlvbnMucXVldWUgJiYgdGhpcy5fcXVldWUuc3RhbGxlZCApICkgewoJCQlyZXR1cm47CgkJfQoKCQlpbmRleCA9IE1hdGgubWF4KCAwLCBNYXRoLm1pbiggcGFyc2VJbnQoIGluZGV4LCAxMCApLCB0aGlzLmdldERhdGFMZW5ndGgoKSAtIDEgKSApOwoKCQlyZXdpbmQgPSB0eXBlb2YgcmV3aW5kICE9PSAndW5kZWZpbmVkJyA/ICEhcmV3aW5kIDogaW5kZXggPCB0aGlzLmdldEluZGV4KCk7CgoJCV9oaXN0b3J5ID0gX2hpc3RvcnkgfHwgZmFsc2U7CgoJCS8vIGRvIHRoZSBoaXN0b3J5IHRoaW5nIGFuZCByZXR1cm4KCQlpZiAoICFfaGlzdG9yeSAmJiBHYWxsZXJpYS5IaXN0b3J5ICkgewoJCQlHYWxsZXJpYS5IaXN0b3J5LnNldCggaW5kZXgudG9TdHJpbmcoKSApOwoJCQlyZXR1cm47CgkJfQoKCQl0aGlzLl9hY3RpdmUgPSBpbmRleDsKCgkJQXJyYXkucHJvdG90eXBlLnB1c2guY2FsbCggdGhpcy5fcXVldWUsIHsKCQkJaW5kZXggOiBpbmRleCwKCQkJcmV3aW5kIDogcmV3aW5kCgkJfSk7CgkJaWYgKCAhdGhpcy5fcXVldWUuc3RhbGxlZCApIHsKCQkJdGhpcy5fc2hvdygpOwoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCS8vIHRoZSBpbnRlcm5hbCBfc2hvdyBtZXRob2QgZG9lcyB0aGUgYWN0dWFsIHNob3dpbmcKCV9zaG93IDogZnVuY3Rpb24oKSB7CgoJCS8vIHNob3J0Y3V0cwoJCXZhciBzZWxmID0gdGhpcywKCQkJcXVldWUgPSB0aGlzLl9xdWV1ZVsgMCBdLAoJCQlkYXRhID0gdGhpcy5nZXREYXRhKCBxdWV1ZS5pbmRleCApOwoKCQlpZiAoICFkYXRhICkgewoJCQlyZXR1cm47CgkJfQoKCQl2YXIgc3JjID0gdGhpcy5pc0Z1bGxzY3JlZW4oKSAmJiAnYmlnJyBpbiBkYXRhID8gZGF0YS5iaWcgOiBkYXRhLmltYWdlLCAvLyB1c2UgYmlnIGltYWdlIGlmIGZ1bGxzY3JlZW4gbW9kZQoJCQlhY3RpdmUgPSB0aGlzLl9jb250cm9scy5nZXRBY3RpdmUoKSwKCQkJbmV4dCA9IHRoaXMuX2NvbnRyb2xzLmdldE5leHQoKSwKCQkJY2FjaGVkID0gbmV4dC5pc0NhY2hlZCggc3JjICksCgkJCXRodW1iID0gdGhpcy5fdGh1bWJuYWlsc1sgcXVldWUuaW5kZXggXTsKCgkJLy8gdG8gYmUgZmlyZWQgd2hlbiBsb2FkaW5nICYgdHJhbnNpdGlvbiBpcyBjb21wbGV0ZToKCQl2YXIgY29tcGxldGUgPSAoZnVuY3Rpb24oIGRhdGEsIG5leHQsIGFjdGl2ZSwgcXVldWUsIHRodW1iICkgewoKCQkJcmV0dXJuIGZ1bmN0aW9uKCkgewoKCQkJCXZhciB3aW47CgoJCQkJLy8gcmVtb3ZlIHN0YWxsZWQKCQkJCXNlbGYuX3F1ZXVlLnN0YWxsZWQgPSBmYWxzZTsKCgkJCQkvLyBvcHRpbWl6ZSBxdWFsaXR5CgkJCQlVdGlscy50b2dnbGVRdWFsaXR5KCBuZXh0LmltYWdlLCBzZWxmLl9vcHRpb25zLmltYWdlUXVhbGl0eSApOwoKCQkJCS8vIHJlbW92ZSBvbGQgbGF5ZXIKCQkJCXNlbGYuX2xheWVyc1sgc2VsZi5fY29udHJvbHMuYWN0aXZlIF0uaW5uZXJIVE1MID0gJyc7CgoJCQkJLy8gc3dhcAoJCQkJJCggYWN0aXZlLmNvbnRhaW5lciApLmNzcyh7CgkJCQkJekluZGV4OiAwLAoJCQkJCW9wYWNpdHk6IDAKCQkJCX0pLnNob3coKTsKCgkJCQkkKCBuZXh0LmNvbnRhaW5lciApLmNzcyh7CgkJCQkJekluZGV4OiAxCgkJCQl9KS5zaG93KCk7CgoJCQkJc2VsZi5fY29udHJvbHMuc3dhcCgpOwoKCQkJCS8vIGFkZCBwYW4gYWNjb3JkaW5nIHRvIG9wdGlvbgoJCQkJaWYgKCBzZWxmLl9vcHRpb25zLmltYWdlUGFuICkgewoJCQkJCXNlbGYuYWRkUGFuKCBuZXh0LmltYWdlICk7CgkJCQl9CgoJCQkJLy8gbWFrZSB0aGUgaW1hZ2UgbGluayBvciBhZGQgbGlnaHRib3gKCQkJCS8vIGxpbmsgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGxpZ2h0Ym94IGlmIGJvdGggYXJlIGRldGVjdGVkCgkJCQlpZiAoIGRhdGEubGluayB8fCBzZWxmLl9vcHRpb25zLmxpZ2h0Ym94ICkgewoKCQkJCQkkKCBuZXh0LmltYWdlICkuY3NzKHsKCQkJCQkJY3Vyc29yOiAncG9pbnRlcicKCQkJCQl9KS5iaW5kKCAnbW91c2V1cCcsIGZ1bmN0aW9uKCkgewoKCQkJCQkJLy8gcG9wdXAgbGluawoJCQkJCQlpZiAoIGRhdGEubGluayApIHsKCQkJCQkJCWlmICggc2VsZi5fb3B0aW9ucy5wb3B1cExpbmtzICkgewoJCQkJCQkJCXdpbiA9IHdpbmRvdy5vcGVuKCBkYXRhLmxpbmssICdfYmxhbmsnICk7CgkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCXdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZGF0YS5saW5rOwoJCQkJCQkJfQoJCQkJCQkJcmV0dXJuOwoJCQkJCQl9CgoJCQkJCQlzZWxmLm9wZW5MaWdodGJveCgpOwoKCQkJCQl9KTsKCQkJCX0KCgkJCQkvLyByZW1vdmUgdGhlIHF1ZXVlZCBpbWFnZQoJCQkJQXJyYXkucHJvdG90eXBlLnNoaWZ0LmNhbGwoIHNlbGYuX3F1ZXVlICk7CgoJCQkJLy8gaWYgd2Ugc3RpbGwgaGF2ZSBpbWFnZXMgaW4gdGhlIHF1ZXVlLCBzaG93IGl0CgkJCQlpZiAoIHNlbGYuX3F1ZXVlLmxlbmd0aCApIHsKCQkJCQlzZWxmLl9zaG93KCk7CgkJCQl9CgoJCQkJLy8gY2hlY2sgaWYgd2UgYXJlIHBsYXlpbmcKCQkJCXNlbGYuX3BsYXlDaGVjaygpOwoKCQkJCS8vIHRyaWdnZXIgSU1BR0UgZXZlbnQKCQkJCXNlbGYudHJpZ2dlcih7CgkJCQkJdHlwZTogR2FsbGVyaWEuSU1BR0UsCgkJCQkJaW5kZXg6IHF1ZXVlLmluZGV4LAoJCQkJCWltYWdlVGFyZ2V0OiBuZXh0LmltYWdlLAoJCQkJCXRodW1iVGFyZ2V0OiB0aHVtYi5pbWFnZQoJCQkJfSk7CgkJCX07CgkJfSggZGF0YSwgbmV4dCwgYWN0aXZlLCBxdWV1ZSwgdGh1bWIgKSk7CgoJCS8vIGxldCB0aGUgY2Fyb3VzZWwgZm9sbG93CgkJaWYgKCB0aGlzLl9vcHRpb25zLmNhcm91c2VsICYmIHRoaXMuX29wdGlvbnMuY2Fyb3VzZWxGb2xsb3cgKSB7CgkJCXRoaXMuX2Nhcm91c2VsLmZvbGxvdyggcXVldWUuaW5kZXggKTsKCQl9CgoJCS8vIHByZWxvYWQgaW1hZ2VzCgkJaWYgKCB0aGlzLl9vcHRpb25zLnByZWxvYWQgKSB7CgoJCQl2YXIgcCwgaSwKCQkJCW4gPSB0aGlzLmdldE5leHQoKSwKCQkJCW5kYXRhOwoKCQkJdHJ5IHsKCQkJCWZvciAoIGkgPSB0aGlzLl9vcHRpb25zLnByZWxvYWQ7IGkgPiAwOyBpLS0gKSB7CgkJCQkJcCA9IG5ldyBHYWxsZXJpYS5QaWN0dXJlKCk7CgkJCQkJbmRhdGEgPSBzZWxmLmdldERhdGEoIG4gKTsKCQkJCQlwLnByZWxvYWQoIHRoaXMuaXNGdWxsc2NyZWVuKCkgJiYgJ2JpZycgaW4gbmRhdGEgPyBuZGF0YS5iaWcgOiBuZGF0YS5pbWFnZSApOwoJCQkJCW4gPSBzZWxmLmdldE5leHQoIG4gKTsKCQkJCX0KCQkJfSBjYXRjaChlKSB7fQoJCX0KCgkJLy8gc2hvdyB0aGUgbmV4dCBpbWFnZSwganVzdCBpbiBjYXNlCgkJVXRpbHMuc2hvdyggbmV4dC5jb250YWluZXIgKTsKCgkJLy8gYWRkIGFjdGl2ZSBjbGFzc2VzCgkJJCggc2VsZi5fdGh1bWJuYWlsc1sgcXVldWUuaW5kZXggXS5jb250YWluZXIgKQoJCQkuYWRkQ2xhc3MoICdhY3RpdmUnICkKCQkJLnNpYmxpbmdzKCAnLmFjdGl2ZScgKQoJCQkucmVtb3ZlQ2xhc3MoICdhY3RpdmUnICk7CgoJCS8vIHRyaWdnZXIgdGhlIExPQURTVEFSVCBldmVudAoJCXNlbGYudHJpZ2dlciggewoJCQl0eXBlOiBHYWxsZXJpYS5MT0FEU1RBUlQsCgkJCWNhY2hlZDogY2FjaGVkLAoJCQlpbmRleDogcXVldWUuaW5kZXgsCgkJCXJld2luZDogcXVldWUucmV3aW5kLAoJCQlpbWFnZVRhcmdldDogbmV4dC5pbWFnZSwKCQkJdGh1bWJUYXJnZXQ6IHRodW1iLmltYWdlCgkJfSk7CgoJCS8vIGJlZ2luIGxvYWRpbmcgdGhlIG5leHQgaW1hZ2UKCQluZXh0LmxvYWQoIHNyYywgZnVuY3Rpb24oIG5leHQgKSB7CgoJCQkvLyBhZGQgbGF5ZXIgSFRNTAoJCQl2YXIgbGF5ZXIgPSAkKCBzZWxmLl9sYXllcnNbIDEtc2VsZi5fY29udHJvbHMuYWN0aXZlIF0gKS5odG1sKCBkYXRhLmxheWVyIHx8ICcnICkuaGlkZSgpOwoKCQkJc2VsZi5fc2NhbGVJbWFnZSggbmV4dCwgewoKCQkJCWNvbXBsZXRlOiBmdW5jdGlvbiggbmV4dCApIHsKCgkJCQkJLy8gdG9nZ2xlIGxvdyBxdWFsaXR5IGZvciBJRQoJCQkJCWlmICggJ2ltYWdlJyBpbiBhY3RpdmUgKSB7CgkJCQkJCVV0aWxzLnRvZ2dsZVF1YWxpdHkoIGFjdGl2ZS5pbWFnZSwgZmFsc2UgKTsKCQkJCQl9CgkJCQkJVXRpbHMudG9nZ2xlUXVhbGl0eSggbmV4dC5pbWFnZSwgZmFsc2UgKTsKCgkJCQkJLy8gc3RhbGwgdGhlIHF1ZXVlCgkJCQkJc2VsZi5fcXVldWUuc3RhbGxlZCA9IHRydWU7CgoJCQkJCS8vIHJlbW92ZSB0aGUgaW1hZ2UgcGFubmluZywgaWYgYXBwbGllZAoJCQkJCS8vIFRPRE86IHJldGhpbmsgaWYgdGhpcyBpcyBuZWNlc3NhcnkKCQkJCQlzZWxmLnJlbW92ZVBhbigpOwoKCQkJCQkvLyBzZXQgdGhlIGNhcHRpb25zIGFuZCBjb3VudGVyCgkJCQkJc2VsZi5zZXRJbmZvKCBxdWV1ZS5pbmRleCApOwoJCQkJCXNlbGYuc2V0Q291bnRlciggcXVldWUuaW5kZXggKTsKCgkJCQkJLy8gc2hvdyB0aGUgbGF5ZXIgbm93CgkJCQkJaWYgKCBkYXRhLmxheWVyICkgewoJCQkJCQlsYXllci5zaG93KCk7CgkJCQkJCS8vIGluaGVyaXQgY2xpY2sgZXZlbnRzIHNldCBvbiBpbWFnZSBvciBzdGFnZQoJCQkJCQlpZiAoIGRhdGEubGluayB8fCBzZWxmLl9vcHRpb25zLmNsaWNrbmV4dCApIHsKCQkJCQkJCWxheWVyLmNzcyggJ2N1cnNvcicsICdwb2ludGVyJyApLm9uZSggJ2NsaWNrJywgZnVuY3Rpb24oKSB7CgkJCQkJCQkJaWYgKCBkYXRhLmxpbmsgKSB7CgkJCQkJCQkJCSQoIG5leHQuaW1hZ2UgKS50cmlnZ2VyKCAnbW91c2V1cCcgKTsKCQkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCQlzZWxmLiQoICdzdGFnZScgKS50cmlnZ2VyKCAnY2xpY2snICk7CgkJCQkJCQkJfQoJCQkJCQkJfSk7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCS8vIHRyaWdnZXIgdGhlIExPQURGSU5JU0ggZXZlbnQKCQkJCQlzZWxmLnRyaWdnZXIoewoJCQkJCQl0eXBlOiBHYWxsZXJpYS5MT0FERklOSVNILAoJCQkJCQljYWNoZWQ6IGNhY2hlZCwKCQkJCQkJaW5kZXg6IHF1ZXVlLmluZGV4LAoJCQkJCQlyZXdpbmQ6IHF1ZXVlLnJld2luZCwKCQkJCQkJaW1hZ2VUYXJnZXQ6IG5leHQuaW1hZ2UsCgkJCQkJCXRodW1iVGFyZ2V0OiBzZWxmLl90aHVtYm5haWxzWyBxdWV1ZS5pbmRleCBdLmltYWdlCgkJCQkJfSk7CgoJCQkJCXZhciB0cmFuc2l0aW9uID0gc2VsZi5fb3B0aW9ucy50cmFuc2l0aW9uOwoKCQkJCQkvLyBjYW4gSmF2YVNjcmlwdCBsb29wIHRocm91Z2ggb2JqZWN0cyBpbiBvcmRlcj8geWVzLgoJCQkJCSQuZWFjaCh7CgkJCQkJCWluaXRpYWw6IGFjdGl2ZS5pbWFnZSA9PT0gbnVsbCwKCQkJCQkJdG91Y2g6IEdhbGxlcmlhLlRPVUNILAoJCQkJCQlmdWxsc2NyZWVuOiBzZWxmLmlzRnVsbHNjcmVlbigpCgkJCQkJfSwgZnVuY3Rpb24oIHR5cGUsIGFyZyApIHsKCQkJCQkJaWYgKCBhcmcgJiYgc2VsZi5fb3B0aW9uc1sgdHlwZSArICdUcmFuc2l0aW9uJyBdICE9PSB1bmRlZiApIHsKCQkJCQkJCXRyYW5zaXRpb24gPSBzZWxmLl9vcHRpb25zWyB0eXBlICsgJ1RyYW5zaXRpb24nIF07CgkJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJCX0KCQkJCQl9KTsKCgkJCQkJLy8gdmFsaWRhdGUgdGhlIHRyYW5zaXRpb24KCQkJCQlpZiAoIHRyYW5zaXRpb24gaW4gX3RyYW5zaXRpb25zID09PSBmYWxzZSApIHsKCQkJCQkJY29tcGxldGUoKTsKCQkJCQl9IGVsc2UgewoJCQkJCQl2YXIgcGFyYW1zID0gewoJCQkJCQkJcHJldjogYWN0aXZlLmNvbnRhaW5lciwKCQkJCQkJCW5leHQ6IG5leHQuY29udGFpbmVyLAoJCQkJCQkJcmV3aW5kOiBxdWV1ZS5yZXdpbmQsCgkJCQkJCQlzcGVlZDogc2VsZi5fb3B0aW9ucy50cmFuc2l0aW9uU3BlZWQgfHwgNDAwCgkJCQkJCX07CgoJCQkJCQkvLyBjYWxsIHRoZSB0cmFuc2l0aW9uIGZ1bmN0aW9uIGFuZCBzZW5kIHNvbWUgc3R1ZmYKCQkJCQkJX3RyYW5zaXRpb25zWyB0cmFuc2l0aW9uIF0uY2FsbChzZWxmLCBwYXJhbXMsIGNvbXBsZXRlICk7CgoJCQkJCX0KCQkJCX0KCQkJfSk7CgkJfSk7Cgl9LAoKCS8qKgoJCUdldHMgdGhlIG5leHQgaW5kZXgKCgkJQHBhcmFtIHtudW1iZXJ9IGJhc2UgT3B0aW9uYWwgc3RhcnRpbmcgcG9pbnQKCgkJQHJldHVybnMge251bWJlcn0gdGhlIG5leHQgaW5kZXgsIG9yIHRoZSBmaXJzdCBpZiB5b3UgYXJlIGF0IHRoZSBmaXJzdCAobG9vcGluZykKCSovCgoJZ2V0TmV4dCA6IGZ1bmN0aW9uKCBiYXNlICkgewoJCWJhc2UgPSB0eXBlb2YgYmFzZSA9PT0gJ251bWJlcicgPyBiYXNlIDogdGhpcy5nZXRJbmRleCgpOwoJCXJldHVybiBiYXNlID09PSB0aGlzLmdldERhdGFMZW5ndGgoKSAtIDEgPyAwIDogYmFzZSArIDE7Cgl9LAoKCS8qKgoJCUdldHMgdGhlIHByZXZpb3VzIGluZGV4CgoJCUBwYXJhbSB7bnVtYmVyfSBiYXNlIE9wdGlvbmFsIHN0YXJ0aW5nIHBvaW50CgoJCUByZXR1cm5zIHtudW1iZXJ9IHRoZSBwcmV2aW91cyBpbmRleCwgb3IgdGhlIGxhc3QgaWYgeW91IGFyZSBhdCB0aGUgZmlyc3QgKGxvb3BpbmcpCgkqLwoKCWdldFByZXYgOiBmdW5jdGlvbiggYmFzZSApIHsKCQliYXNlID0gdHlwZW9mIGJhc2UgPT09ICdudW1iZXInID8gYmFzZSA6IHRoaXMuZ2V0SW5kZXgoKTsKCQlyZXR1cm4gYmFzZSA9PT0gMCA/IHRoaXMuZ2V0RGF0YUxlbmd0aCgpIC0gMSA6IGJhc2UgLSAxOwoJfSwKCgkvKioKCQlTaG93cyB0aGUgbmV4dCBpbWFnZSBpbiBsaW5lCgoJCUByZXR1cm5zIEluc3RhbmNlCgkqLwoKCW5leHQgOiBmdW5jdGlvbigpIHsKCQlpZiAoIHRoaXMuZ2V0RGF0YUxlbmd0aCgpID4gMSApIHsKCQkJdGhpcy5zaG93KCB0aGlzLmdldE5leHQoKSwgZmFsc2UgKTsKCQl9CgkJcmV0dXJuIHRoaXM7Cgl9LAoKCS8qKgoJCVNob3dzIHRoZSBwcmV2aW91cyBpbWFnZSBpbiBsaW5lCgoJCUByZXR1cm5zIEluc3RhbmNlCgkqLwoKCXByZXYgOiBmdW5jdGlvbigpIHsKCQlpZiAoIHRoaXMuZ2V0RGF0YUxlbmd0aCgpID4gMSApIHsKCQkJdGhpcy5zaG93KCB0aGlzLmdldFByZXYoKSwgdHJ1ZSApOwoJCX0KCQlyZXR1cm4gdGhpczsKCX0sCgoJLyoqCgkJUmV0cmlldmUgYSBET00gZWxlbWVudCBieSBlbGVtZW50IElECgoJCUBwYXJhbSB7c3RyaW5nfSBlbGVtSWQgVGhlIGRlbGVtZW50IElEIHRvIGZldGNoCgoJCUByZXR1cm5zIHtIVE1MRWxlbWVudH0gVGhlIGVsZW1lbnRzIERPTSBub2RlIG9yIG51bGwgaWYgbm90IGZvdW5kLgoJKi8KCglnZXQgOiBmdW5jdGlvbiggZWxlbUlkICkgewoJCXJldHVybiBlbGVtSWQgaW4gdGhpcy5fZG9tID8gdGhpcy5fZG9tWyBlbGVtSWQgXSA6IG51bGw7Cgl9LAoKCS8qKgoJCVJldHJpZXZlIGEgZGF0YSBvYmplY3QKCgkJQHBhcmFtIHtudW1iZXJ9IGluZGV4IFRoZSBkYXRhIGluZGV4IHRvIHJldHJpZXZlLgoJCUlmIG5vIGluZGV4IHNwZWNpZmllZCBpdCB3aWxsIHRha2UgdGhlIGN1cnJlbnRseSBhY3RpdmUgaW1hZ2UKCgkJQHJldHVybnMge09iamVjdH0gVGhlIGRhdGEgb2JqZWN0CgkqLwoKCWdldERhdGEgOiBmdW5jdGlvbiggaW5kZXggKSB7CgkJcmV0dXJuIGluZGV4IGluIHRoaXMuX2RhdGEgPwoJCQl0aGlzLl9kYXRhWyBpbmRleCBdIDogdGhpcy5fZGF0YVsgdGhpcy5fYWN0aXZlIF07Cgl9LAoKCS8qKgoJCVJldHJpZXZlIHRoZSBudW1iZXIgb2YgZGF0YSBpdGVtcwoKCQlAcmV0dXJucyB7bnVtYmVyfSBUaGUgZGF0YSBsZW5ndGgKCSovCglnZXREYXRhTGVuZ3RoIDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX2RhdGEubGVuZ3RoOwoJfSwKCgkvKioKCQlSZXRyaWV2ZSB0aGUgY3VycmVudGx5IGFjdGl2ZSBpbmRleAoKCQlAcmV0dXJucyB7bnVtYmVyfGJvb2xlYW59IFRoZSBhY3RpdmUgaW5kZXggb3IgZmFsc2UgaWYgbm9uZSBmb3VuZAoJKi8KCglnZXRJbmRleCA6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0eXBlb2YgdGhpcy5fYWN0aXZlID09PSAnbnVtYmVyJyA/IHRoaXMuX2FjdGl2ZSA6IGZhbHNlOwoJfSwKCgkvKioKCQlSZXRyaWV2ZSB0aGUgc3RhZ2UgaGVpZ2h0CgoJCUByZXR1cm5zIHtudW1iZXJ9IFRoZSBzdGFnZSBoZWlnaHQKCSovCgoJZ2V0U3RhZ2VIZWlnaHQgOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5fc3RhZ2VIZWlnaHQ7Cgl9LAoKCS8qKgoJCVJldHJpZXZlIHRoZSBzdGFnZSB3aWR0aAoKCQlAcmV0dXJucyB7bnVtYmVyfSBUaGUgc3RhZ2Ugd2lkdGgKCSovCgoJZ2V0U3RhZ2VXaWR0aCA6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLl9zdGFnZVdpZHRoOwoJfSwKCgkvKioKCQlSZXRyaWV2ZSB0aGUgb3B0aW9uCgoJCUBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIG9wdGlvbiBrZXkgdG8gcmV0cmlldmUuIElmIG5vIGtleSBzcGVjaWZpZWQgaXQgd2lsbCByZXR1cm4gYWxsIG9wdGlvbnMgaW4gYW4gb2JqZWN0LgoKCQlAcmV0dXJucyBvcHRpb24gb3Igb3B0aW9ucwoJKi8KCglnZXRPcHRpb25zIDogZnVuY3Rpb24oIGtleSApIHsKCQlyZXR1cm4gdHlwZW9mIGtleSA9PT0gJ3VuZGVmaW5lZCcgPyB0aGlzLl9vcHRpb25zIDogdGhpcy5fb3B0aW9uc1sga2V5IF07Cgl9LAoKCS8qKgoJCVNldCBvcHRpb25zIHRvIHRoZSBpbnN0YW5jZS4KCQlZb3UgY2FuIHNldCBvcHRpb25zIHVzaW5nIGEga2V5ICYgdmFsdWUgYXJndW1lbnQgb3IgYSBzaW5nbGUgb2JqZWN0IGFyZ3VtZW50IChzZWUgZXhhbXBsZXMpCgoJCUBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIG9wdGlvbiBrZXkKCQlAcGFyYW0ge3N0cmluZ30gdmFsdWUgdGhlIHRoZSBvcHRpb25zIHZhbHVlCgoJCUBleGFtcGxlIHNldE9wdGlvbnMoICdhdXRvcGxheScsIHRydWUgKQoJCUBleGFtcGxlIHNldE9wdGlvbnMoeyBhdXRvcGxheTogdHJ1ZSB9KTsKCgkJQHJldHVybnMgSW5zdGFuY2UKCSovCgoJc2V0T3B0aW9ucyA6IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkgewoJCWlmICggdHlwZW9mIGtleSA9PT0gJ29iamVjdCcgKSB7CgkJCSQuZXh0ZW5kKCB0aGlzLl9vcHRpb25zLCBrZXkgKTsKCQl9IGVsc2UgewoJCQl0aGlzLl9vcHRpb25zWyBrZXkgXSA9IHZhbHVlOwoJCX0KCQlyZXR1cm4gdGhpczsKCX0sCgoJLyoqCgkJU3RhcnRzIHBsYXlpbmcgdGhlIHNsaWRlc2hvdwoKCQlAcGFyYW0ge251bWJlcn0gZGVsYXkgU2V0cyB0aGUgc2xpZGVzaG93IGludGVydmFsIGluIG1pbGxpc2Vjb25kcy4KCQlJZiB5b3Ugc2V0IGl0IG9uY2UsIHlvdSBjYW4ganVzdCBjYWxsIHBsYXkoKSBhbmQgZ2V0IHRoZSBzYW1lIGludGVydmFsIHRoZSBuZXh0IHRpbWUuCgoJCUByZXR1cm5zIEluc3RhbmNlCgkqLwoKCXBsYXkgOiBmdW5jdGlvbiggZGVsYXkgKSB7CgoJCXRoaXMuX3BsYXlpbmcgPSB0cnVlOwoKCQl0aGlzLl9wbGF5dGltZSA9IGRlbGF5IHx8IHRoaXMuX3BsYXl0aW1lOwoKCQl0aGlzLl9wbGF5Q2hlY2soKTsKCgkJdGhpcy50cmlnZ2VyKCBHYWxsZXJpYS5QTEFZICk7CgoJCXJldHVybiB0aGlzOwoJfSwKCgkvKioKCQlTdG9wcyB0aGUgc2xpZGVzaG93IGlmIGN1cnJlbnRseSBwbGF5aW5nCgoJCUByZXR1cm5zIEluc3RhbmNlCgkqLwoKCXBhdXNlIDogZnVuY3Rpb24oKSB7CgoJCXRoaXMuX3BsYXlpbmcgPSBmYWxzZTsKCgkJdGhpcy50cmlnZ2VyKCBHYWxsZXJpYS5QQVVTRSApOwoKCQlyZXR1cm4gdGhpczsKCX0sCgoJLyoqCgkJVG9nZ2xlIGJldHdlZW4gcGxheSBhbmQgcGF1c2UgZXZlbnRzLgoKCQlAcGFyYW0ge251bWJlcn0gZGVsYXkgU2V0cyB0aGUgc2xpZGVzaG93IGludGVydmFsIGluIG1pbGxpc2Vjb25kcy4KCgkJQHJldHVybnMgSW5zdGFuY2UKCSovCgoJcGxheVRvZ2dsZSA6IGZ1bmN0aW9uKCBkZWxheSApIHsKCQlyZXR1cm4gKCB0aGlzLl9wbGF5aW5nICkgPyB0aGlzLnBhdXNlKCkgOiB0aGlzLnBsYXkoIGRlbGF5ICk7Cgl9LAoKCS8qKgoJCUNoZWNrcyBpZiB0aGUgZ2FsbGVyeSBpcyBjdXJyZW50bHkgcGxheWluZwoKCQlAcmV0dXJucyB7Qm9vbGVhbn0KCSovCgoJaXNQbGF5aW5nIDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX3BsYXlpbmc7Cgl9LAoKCS8qKgoJCUNoZWNrcyBpZiB0aGUgZ2FsbGVyeSBpcyBjdXJyZW50bHkgaW4gZnVsbHNjcmVlbiBtb2RlCgoJCUByZXR1cm5zIHtCb29sZWFufQoJKi8KCglpc0Z1bGxzY3JlZW4gOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5fZnVsbHNjcmVlbi5hY3RpdmU7Cgl9LAoKCV9wbGF5Q2hlY2sgOiBmdW5jdGlvbigpIHsKCQl2YXIgc2VsZiA9IHRoaXMsCgkJCXBsYXllZCA9IDAsCgkJCWludGVydmFsID0gMjAsCgkJCW5vdyA9IFV0aWxzLnRpbWVzdGFtcCgpLAoJCQl0aW1lcl9pZCA9ICdwbGF5JyArIHRoaXMuX2lkOwoKCQlpZiAoIHRoaXMuX3BsYXlpbmcgKSB7CgoJCQlVdGlscy5jbGVhclRpbWVyKCB0aW1lcl9pZCApOwoKCQkJdmFyIGZuID0gZnVuY3Rpb24oKSB7CgoJCQkJcGxheWVkID0gVXRpbHMudGltZXN0YW1wKCkgLSBub3c7CgkJCQlpZiAoIHBsYXllZCA+PSBzZWxmLl9wbGF5dGltZSAmJiBzZWxmLl9wbGF5aW5nICkgewoJCQkJCVV0aWxzLmNsZWFyVGltZXIoIHRpbWVyX2lkICk7CgkJCQkJc2VsZi5uZXh0KCk7CgkJCQkJcmV0dXJuOwoJCQkJfQoJCQkJaWYgKCBzZWxmLl9wbGF5aW5nICkgewoKCQkJCQkvLyB0cmlnZ2VyIHRoZSBQUk9HUkVTUyBldmVudAoJCQkJCXNlbGYudHJpZ2dlcih7CgkJCQkJCXR5cGU6ICAgICAgICAgR2FsbGVyaWEuUFJPR1JFU1MsCgkJCQkJCXBlcmNlbnQ6ICAgICAgTWF0aC5jZWlsKCBwbGF5ZWQgLyBzZWxmLl9wbGF5dGltZSAqIDEwMCApLAoJCQkJCQlzZWNvbmRzOiAgICAgIE1hdGguZmxvb3IoIHBsYXllZCAvIDEwMDAgKSwKCQkJCQkJbWlsbGlzZWNvbmRzOiBwbGF5ZWQKCQkJCQl9KTsKCgkJCQkJVXRpbHMuYWRkVGltZXIoIHRpbWVyX2lkLCBmbiwgaW50ZXJ2YWwgKTsKCQkJCX0KCQkJfTsKCQkJVXRpbHMuYWRkVGltZXIoIHRpbWVyX2lkLCBmbiwgaW50ZXJ2YWwgKTsKCQl9Cgl9LAoKCS8qKgoJCU1vZGlmeSB0aGUgc2xpZGVzaG93IGRlbGF5CgoJCUBwYXJhbSB7bnVtYmVyfSBkZWxheSB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIHNsaWRlcywKCgkJQHJldHVybnMgSW5zdGFuY2UKCSovCgoJc2V0UGxheXRpbWU6IGZ1bmN0aW9uKCBkZWxheSApIHsKCQl0aGlzLl9wbGF5dGltZSA9IGRlbGF5OwoJCXJldHVybiB0aGlzOwoJfSwKCglzZXRJbmRleDogZnVuY3Rpb24oIHZhbCApIHsKCQl0aGlzLl9hY3RpdmUgPSB2YWw7CgkJcmV0dXJuIHRoaXM7Cgl9LAoKCS8qKgoJCU1hbnVhbGx5IG1vZGlmeSB0aGUgY291bnRlcgoKCQlAcGFyYW0ge251bWJlcn0gaW5kZXggT3B0aW9uYWwgZGF0YSBpbmRleCB0byBmZWN0Y2gsCgkJaWYgbm8gaW5kZXggZm91bmQgaXQgYXNzdW1lcyB0aGUgY3VycmVudGx5IGFjdGl2ZSBpbmRleAoKCQlAcmV0dXJucyBJbnN0YW5jZQoJKi8KCglzZXRDb3VudGVyOiBmdW5jdGlvbiggaW5kZXggKSB7CgoJCWlmICggdHlwZW9mIGluZGV4ID09PSAnbnVtYmVyJyApIHsKCQkJaW5kZXgrKzsKCQl9IGVsc2UgaWYgKCB0eXBlb2YgaW5kZXggPT09ICd1bmRlZmluZWQnICkgewoJCQlpbmRleCA9IHRoaXMuZ2V0SW5kZXgoKSsxOwoJCX0KCgkJdGhpcy5nZXQoICdjdXJyZW50JyApLmlubmVySFRNTCA9IGluZGV4OwoKCQlpZiAoIElFICkgeyAvLyB3ZWlyZCBJRSBidWcKCgkJCXZhciBjb3VudCA9IHRoaXMuJCggJ2NvdW50ZXInICksCgkJCQlvcGFjaXR5ID0gY291bnQuY3NzKCAnb3BhY2l0eScgKTsKCgkJCWlmICggcGFyc2VJbnQoIG9wYWNpdHksIDEwICkgPT09IDEpIHsKCQkJCVV0aWxzLnJlbW92ZUFscGhhKCBjb3VudFswXSApOwoJCQl9IGVsc2UgewoJCQkJdGhpcy4kKCAnY291bnRlcicgKS5jc3MoICdvcGFjaXR5Jywgb3BhY2l0eSApOwoJCQl9CgoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCS8qKgoJCU1hbnVhbGx5IHNldCBjYXB0aW9ucwoKCQlAcGFyYW0ge251bWJlcn0gaW5kZXggT3B0aW9uYWwgZGF0YSBpbmRleCB0byBmZWN0Y2ggYW5kIGFwcGx5IGFzIGNhcHRpb24sCgkJaWYgbm8gaW5kZXggZm91bmQgaXQgYXNzdW1lcyB0aGUgY3VycmVudGx5IGFjdGl2ZSBpbmRleAoKCQlAcmV0dXJucyBJbnN0YW5jZQoJKi8KCglzZXRJbmZvIDogZnVuY3Rpb24oIGluZGV4ICkgewoKCQl2YXIgc2VsZiA9IHRoaXMsCgkJCWRhdGEgPSB0aGlzLmdldERhdGEoIGluZGV4ICk7CgoJCSQuZWFjaCggWyd0aXRsZScsJ2Rlc2NyaXB0aW9uJ10sIGZ1bmN0aW9uKCBpLCB0eXBlICkgewoKCQkJdmFyIGVsZW0gPSBzZWxmLiQoICdpbmZvLScgKyB0eXBlICk7CgoJCQlpZiAoICEhZGF0YVt0eXBlXSApIHsKCQkJCWVsZW1bIGRhdGFbIHR5cGUgXS5sZW5ndGggPyAnc2hvdycgOiAnaGlkZScgXSgpLmh0bWwoIGRhdGFbIHR5cGUgXSApOwoJCQl9IGVsc2UgewoJCQkgICBlbGVtLmVtcHR5KCkuaGlkZSgpOwoJCQl9CgkJfSk7CgoJCXJldHVybiB0aGlzOwoJfSwKCgkvKioKCQlDaGVja3MgaWYgdGhlIGRhdGEgY29udGFpbnMgYW55IGNhcHRpb25zCgoJCUBwYXJhbSB7bnVtYmVyfSBpbmRleCBPcHRpb25hbCBkYXRhIGluZGV4IHRvIGZlY3RjaCwKCQlpZiBubyBpbmRleCBmb3VuZCBpdCBhc3N1bWVzIHRoZSBjdXJyZW50bHkgYWN0aXZlIGluZGV4LgoKCQlAcmV0dXJucyB7Ym9vbGVhbn0KCSovCgoJaGFzSW5mbyA6IGZ1bmN0aW9uKCBpbmRleCApIHsKCgkJdmFyIGNoZWNrID0gJ3RpdGxlIGRlc2NyaXB0aW9uJy5zcGxpdCgnICcpLAoJCQlpOwoKCQlmb3IgKCBpID0gMDsgY2hlY2tbaV07IGkrKyApIHsKCQkJaWYgKCAhIXRoaXMuZ2V0RGF0YSggaW5kZXggKVsgY2hlY2tbaV0gXSApIHsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJfQoJCXJldHVybiBmYWxzZTsKCgl9LAoKCWpRdWVyeSA6IGZ1bmN0aW9uKCBzdHIgKSB7CgoJCXZhciBzZWxmID0gdGhpcywKCQkJcmV0ID0gW107CgoJCSQuZWFjaCggc3RyLnNwbGl0KCcsJyksIGZ1bmN0aW9uKCBpLCBlbGVtSWQgKSB7CgkJCWVsZW1JZCA9ICQudHJpbSggZWxlbUlkICk7CgoJCQlpZiAoIHNlbGYuZ2V0KCBlbGVtSWQgKSApIHsKCQkJCXJldC5wdXNoKCBlbGVtSWQgKTsKCQkJfQoJCX0pOwoKCQl2YXIgalEgPSAkKCBzZWxmLmdldCggcmV0LnNoaWZ0KCkgKSApOwoKCQkkLmVhY2goIHJldCwgZnVuY3Rpb24oIGksIGVsZW1JZCApIHsKCQkJalEgPSBqUS5hZGQoIHNlbGYuZ2V0KCBlbGVtSWQgKSApOwoJCX0pOwoKCQlyZXR1cm4galE7CgoJfSwKCgkvKioKCQlDb252ZXJ0cyBlbGVtZW50IElEcyBpbnRvIGEgalF1ZXJ5IGNvbGxlY3Rpb24KCQlZb3UgY2FuIGNhbGwgZm9yIG11bHRpcGxlIElEcyBzZXBhcmF0ZWQgd2l0aCBjb21tYXMuCgoJCUBwYXJhbSB7c3RyaW5nfSBzdHIgT25lIG9yIG1vcmUgZWxlbWVudCBJRHMgKGNvbW1hLXNlcGFyYXRlZCkKCgkJQHJldHVybnMgalF1ZXJ5CgoJCUBleGFtcGxlIHRoaXMuJCgnaW5mbyxjb250YWluZXInKS5oaWRlKCk7CgkqLwoKCSQgOiBmdW5jdGlvbiggc3RyICkgewoJCXJldHVybiB0aGlzLmpRdWVyeS5hcHBseSggdGhpcywgVXRpbHMuYXJyYXkoIGFyZ3VtZW50cyApICk7Cgl9Cgp9OwoKLy8gRW5kIG9mIEdhbGxlcmlhIHByb3RvdHlwZQoKLy8gQWRkIGV2ZW50cyBhcyBzdGF0aWMgdmFyaWFibGVzCiQuZWFjaCggX2V2ZW50cywgZnVuY3Rpb24oIGksIGV2ICkgewoKCS8vIGxlZ2FjeSBldmVudHMKCXZhciB0eXBlID0gL18vLnRlc3QoIGV2ICkgPyBldi5yZXBsYWNlKCAvXy9nLCAnJyApIDogZXY7CgoJR2FsbGVyaWFbIGV2LnRvVXBwZXJDYXNlKCkgXSA9ICdnYWxsZXJpYS4nK3R5cGU7Cgp9ICk7CgokLmV4dGVuZCggR2FsbGVyaWEsIHsKCgkvLyBCcm93c2VyIGhlbHBlcnMKCUlFOTogICAgIElFID09PSA5LAoJSUU4OiAgICAgSUUgPT09IDgsCglJRTc6ICAgICBJRSA9PT0gNywKCUlFNjogICAgIElFID09PSA2LAoJSUU6ICAgICAgSUUsCglXRUJLSVQ6ICAvd2Via2l0Ly50ZXN0KCBOQVYgKSwKCVNBRkFSSTogIC9zYWZhcmkvLnRlc3QoIE5BViApLAoJQ0hST01FOiAgL2Nocm9tZS8udGVzdCggTkFWICksCglRVUlSSzogICAoIElFICYmIGRvYy5jb21wYXRNb2RlICYmIGRvYy5jb21wYXRNb2RlID09PSAiQmFja0NvbXBhdCIgKSwKCU1BQzogICAgIC9tYWMvLnRlc3QoIG5hdmlnYXRvci5wbGF0Zm9ybS50b0xvd2VyQ2FzZSgpICksCglPUEVSQTogICAhIXdpbmRvdy5vcGVyYSwKCUlQSE9ORTogIC9pcGhvbmUvLnRlc3QoIE5BViApLAoJSVBBRDogICAgL2lwYWQvLnRlc3QoIE5BViApLAoJQU5EUk9JRDogL2FuZHJvaWQvLnRlc3QoIE5BViApLAoJVE9VQ0g6ICAgKCdvbnRvdWNoc3RhcnQnIGluIGRvYykKCn0pOwoKLy8gR2FsbGVyaWEgc3RhdGljIG1ldGhvZHMKCi8qKgoJQWRkcyBhIHRoZW1lIHRoYXQgeW91IGNhbiB1c2UgZm9yIHlvdXIgR2FsbGVyeQoKCUBwYXJhbSB7T2JqZWN0fSB0aGVtZSBPYmplY3QgdGhhdCBzaG91bGQgY29udGFpbiBhbGwgeW91ciB0aGVtZSBzZXR0aW5ncy4KCTx1bD4KCQk8bGk+bmFtZSAtIG5hbWUgb2YgdGhlIHRoZW1lPC9saT4KCQk8bGk+YXV0aG9yIC0gbmFtZSBvZiB0aGUgYXV0aG9yPC9saT4KCQk8bGk+Y3NzIC0gY3NzIGZpbGUgbmFtZSAobm90IHBhdGgpPC9saT4KCQk8bGk+ZGVmYXVsdHMgLSBkZWZhdWx0IG9wdGlvbnMgdG8gYXBwbHksIGluY2x1ZGluZyB0aGVtZS1zcGVjaWZpYyBvcHRpb25zPC9saT4KCQk8bGk+aW5pdCAtIHRoZSBpbml0IGZ1bmN0aW9uPC9saT4KCTwvdWw+CgoJQHJldHVybnMge09iamVjdH0gdGhlbWUKKi8KCkdhbGxlcmlhLmFkZFRoZW1lID0gZnVuY3Rpb24oIHRoZW1lICkgewoKCS8vIG1ha2Ugc3VyZSB3ZSBoYXZlIGEgbmFtZQoJaWYgKCAhdGhlbWUubmFtZSApIHsKCQlHYWxsZXJpYS5yYWlzZSgnTm8gdGhlbWUgbmFtZSBzcGVjaWZpZWQnKTsKCX0KCglpZiAoIHR5cGVvZiB0aGVtZS5kZWZhdWx0cyAhPT0gJ29iamVjdCcgKSB7CgkJdGhlbWUuZGVmYXVsdHMgPSB7fTsKCX0gZWxzZSB7CgkJdGhlbWUuZGVmYXVsdHMgPSBfbGVnYWN5T3B0aW9ucyggdGhlbWUuZGVmYXVsdHMgKTsKCX0KCgl2YXIgY3NzID0gZmFsc2UsCgkJcmVnOwoKCWlmICggdHlwZW9mIHRoZW1lLmNzcyA9PT0gJ3N0cmluZycgKSB7CgoJCS8vIGxvb2sgZm9yIG1hbnVhbGx5IGFkZGVkIENTUwoJCSQoJ2xpbmsnKS5lYWNoKGZ1bmN0aW9uKCBpLCBsaW5rICkgewoJCQlyZWcgPSBuZXcgUmVnRXhwKCB0aGVtZS5jc3MgKTsKCQkJaWYgKCByZWcudGVzdCggbGluay5ocmVmICkgKSB7CgoJCQkJLy8gd2UgZm91bmQgdGhlIGNzcwoJCQkJY3NzID0gdHJ1ZTsKCgkJCQkvLyB0aGUgdGhlbWVsb2FkIHRyaWdnZXIKCQkJCV90aGVtZUxvYWQoIHRoZW1lICk7CgoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJfSk7CgoJCS8vIGVsc2UgbG9vayBmb3IgdGhlIGFic29sdXRlIHBhdGggYW5kIGxvYWQgdGhlIENTUyBkeW5hbWljCgkJaWYgKCAhY3NzICkgewoKCQkJJCgnc2NyaXB0JykuZWFjaChmdW5jdGlvbiggaSwgc2NyaXB0ICkgewoKCQkJCS8vIGxvb2sgZm9yIHRoZSB0aGVtZSBzY3JpcHQKCQkJCXJlZyA9IG5ldyBSZWdFeHAoICdnYWxsZXJpYVxcLicgKyB0aGVtZS5uYW1lLnRvTG93ZXJDYXNlKCkgKyAnXFwuJyApOwoJCQkJaWYoIHJlZy50ZXN0KCBzY3JpcHQuc3JjICkpIHsKCgkJCQkJLy8gd2UgaGF2ZSBhIG1hdGNoCgkJCQkJY3NzID0gc2NyaXB0LnNyYy5yZXBsYWNlKC9bXlwvXSokLywgJycpICsgdGhlbWUuY3NzOwoKCQkJCQlVdGlscy5hZGRUaW1lciggImNzcyIsIGZ1bmN0aW9uKCkgewoJCQkJCQlVdGlscy5sb2FkQ1NTKCBjc3MsICdnYWxsZXJpYS10aGVtZScsIGZ1bmN0aW9uKCkgewoKCQkJCQkJCS8vIHRoZSB0aGVtZWxvYWQgdHJpZ2dlcgoJCQkJCQkJX3RoZW1lTG9hZCggdGhlbWUgKTsKCgkJCQkJCX0pOwoJCQkJCX0sIDEpOwoKCQkJCX0KCQkJfSk7CgkJfQoKCQlpZiAoICFjc3MgKSB7CgkJCUdhbGxlcmlhLnJhaXNlKCdObyB0aGVtZSBDU1MgbG9hZGVkJyk7CgkJfQoJfSBlbHNlIHsKCgkJLy8gcGFzcwoJCV90aGVtZUxvYWQoIHRoZW1lICk7Cgl9CglyZXR1cm4gdGhlbWU7Cn07CgovKioKCWxvYWRUaGVtZSBsb2FkcyBhIHRoZW1lIGpzIGZpbGUgYW5kIGF0dGFjaGVzIGEgbG9hZCBldmVudCB0byBHYWxsZXJpYQoKCUBwYXJhbSB7c3RyaW5nfSBzcmMgVGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIHRoZW1lIHNvdXJjZSBmaWxlCgoJQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBPcHRpb25hbCBvcHRpb25zIHlvdSB3YW50IHRvIGFwcGx5CiovCgpHYWxsZXJpYS5sb2FkVGhlbWUgPSBmdW5jdGlvbiggc3JjLCBvcHRpb25zICkgewoKCXZhciBsb2FkZWQgPSBmYWxzZSwKCQlsZW5ndGggPSBfZ2FsbGVyaWVzLmxlbmd0aCwKCQllcnIgPSB3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7CgkJCUdhbGxlcmlhLnJhaXNlKCAiVGhlbWUgYXQgIiArIHNyYyArICIgY291bGQgbm90IGxvYWQsIGNoZWNrIHRoZW1lIHBhdGguIiwgdHJ1ZSApOwoJCX0sIDUwMDAgKTsKCgkvLyBmaXJzdCBjbGVhciB0aGUgY3VycmVudCB0aGVtZSwgaWYgZXhpc3RzCglHYWxsZXJpYS50aGVtZSA9IHVuZGVmOwoKCS8vIGxvYWQgdGhlIHRoZW1lCglVdGlscy5sb2FkU2NyaXB0KCBzcmMsIGZ1bmN0aW9uKCkgewoKCQl3aW5kb3cuY2xlYXJUaW1lb3V0KCBlcnIgKTsKCgkJLy8gY2hlY2sgZm9yIGV4aXN0aW5nIGdhbGxlcmllcyBhbmQgcmVsb2FkIHRoZW0gd2l0aCB0aGUgbmV3IHRoZW1lCgkJaWYgKCBsZW5ndGggKSB7CgoJCQkvLyB0ZW1wb3Jhcnkgc2F2ZSB0aGUgbmV3IGdhbGxlcmllcwoJCQl2YXIgcmVmcmVzaGVkID0gW107CgoJCQkvLyByZWZyZXNoIGFsbCBpbnN0YW5jZXMKCQkJLy8gd2hlbiBhZGRpbmcgYSBuZXcgdGhlbWUgdG8gYW4gZXhpc3RpbmcgZ2FsbGVyeSwgYWxsIG9wdGlvbnMgd2lsbCBiZSByZXNldHRlZCBidXQgdGhlIGRhdGEgd2lsbCBiZSBrZXB0CgkJCS8vIHlvdSBjYW4gYXBwbHkgbmV3IG9wdGlvbnMgYXMgYSBzZWNvbmQgYXJndW1lbnQKCQkJJC5lYWNoKCBHYWxsZXJpYS5nZXQoKSwgZnVuY3Rpb24oaSwgaW5zdGFuY2UpIHsKCgkJCQkvLyBtaXggdGhlIG9sZCBkYXRhIGFuZCBvcHRpb25zIGludG8gdGhlIG5ldyBpbnN0YW5jZQoJCQkJdmFyIG9wID0gJC5leHRlbmQoIGluc3RhbmNlLl9vcmlnaW5hbC5vcHRpb25zLCB7CgkJCQkJZGF0YV9zb3VyY2U6IGluc3RhbmNlLl9kYXRhCgkJCQl9LCBvcHRpb25zKTsKCgkJCQkvLyByZW1vdmUgdGhlIG9sZCBjb250YWluZXIKCQkJCWluc3RhbmNlLiQoJ2NvbnRhaW5lcicpLnJlbW92ZSgpOwoKCQkJCS8vIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZQoJCQkJdmFyIGcgPSBuZXcgR2FsbGVyaWEoKTsKCgkJCQkvLyBtb3ZlIHRoZSBpZAoJCQkJZy5faWQgPSBpbnN0YW5jZS5faWQ7CgoJCQkJLy8gaW5pdGlhbGl6ZSB0aGUgbmV3IGluc3RhbmNlCgkJCQlnLmluaXQoIGluc3RhbmNlLl9vcmlnaW5hbC50YXJnZXQsIG9wICk7CgoJCQkJLy8gcHVzaCB0aGUgbmV3IGluc3RhbmNlCgkJCQlyZWZyZXNoZWQucHVzaCggZyApOwoJCQl9KTsKCgkJCS8vIG5vdyBvdmVyd3JpdGUgdGhlIG9sZCBob2xkZXIgd2l0aCB0aGUgbmV3IGluc3RhbmNlcwoJCQlfZ2FsbGVyaWVzID0gcmVmcmVzaGVkOwoJCX0KCgl9KTsKfTsKCi8qKgoJUmV0cmlldmVzIGEgR2FsbGVyaWEgaW5zdGFuY2UuCgoJQHBhcmFtIHtudW1iZXJ9IFtpbmRleF0gT3B0aW9uYWwgaW5kZXggdG8gcmV0cmlldmUuCglJZiBubyBpbmRleCBpcyBzdXBwbGllZCwgdGhlIG1ldGhvZCB3aWxsIHJldHVybiBhbGwgaW5zdGFuY2VzIGluIGFuIGFycmF5LgoKCUByZXR1cm5zIEluc3RhbmNlIG9yIEFycmF5IG9mIGluc3RhbmNlcwoqLwoKR2FsbGVyaWEuZ2V0ID0gZnVuY3Rpb24oIGluZGV4ICkgewoJaWYgKCAhIV9pbnN0YW5jZXNbIGluZGV4IF0gKSB7CgkJcmV0dXJuIF9pbnN0YW5jZXNbIGluZGV4IF07Cgl9IGVsc2UgaWYgKCB0eXBlb2YgaW5kZXggIT09ICdudW1iZXInICkgewoJCXJldHVybiBfaW5zdGFuY2VzOwoJfSBlbHNlIHsKCQlHYWxsZXJpYS5yYWlzZSgnR2FsbGVyeSBpbmRleCAnICsgaW5kZXggKyAnIG5vdCBmb3VuZCcpOwoJfQp9OwoKLyoqCglDcmVhdGVzIGEgdHJhbnNpdGlvbiB0byBiZSB1c2VkIGluIHlvdXIgZ2FsbGVyeQoKCUBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSB0cmFuc2l0aW9uIHRoYXQgeW91IHdpbGwgdXNlIGFzIGFuIG9wdGlvbgoKCUBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBpbiB0aGUgdHJhbnNpdGlvbi4KCVRoZSBmdW5jdGlvbiBjb250YWlucyB0d28gYXJndW1lbnRzLCBwYXJhbXMgYW5kIGNvbXBsZXRlLgoJVXNlIHRoZSBwYXJhbXMgT2JqZWN0IHRvIGludGVncmF0ZSB0aGUgdHJhbnNpdGlvbiwgYW5kIHRoZW4gY2FsbCBjb21wbGV0ZSB3aGVuIHlvdSBhcmUgZG9uZS4KCiovCgpHYWxsZXJpYS5hZGRUcmFuc2l0aW9uID0gZnVuY3Rpb24oIG5hbWUsIGZuICkgewoJX3RyYW5zaXRpb25zW25hbWVdID0gZm47Cn07CgovKioKCVRoZSBHYWxsZXJpYSB1dGlsaXRlcwoqLwoKR2FsbGVyaWEudXRpbHMgPSBVdGlsczsKCi8qKgoJQSBoZWxwZXIgbWV0b2QgZm9yIGNyb3NzLWJyb3dzZXIgbG9nZ2luZy4KCUl0IHVzZXMgdGhlIGNvbnNvbGUgbG9nIGlmIGF2YWlsYWJsZSBvdGhlcndpc2UgaXQgZmFsbHMgYmFjayB0byBhbGVydAoKCUBleGFtcGxlIEdhbGxlcmlhLmxvZygiaGVsbG8iLCBkb2N1bWVudC5ib2R5LCBbMSwyLDNdKTsKKi8KCkdhbGxlcmlhLmxvZyA9IChmdW5jdGlvbigpIHsKCWlmKCAnY29uc29sZScgaW4gd2luZG93ICYmICdsb2cnIGluIHdpbmRvdy5jb25zb2xlICkgewoJCXJldHVybiB3aW5kb3cuY29uc29sZS5sb2c7Cgl9IGVsc2UgewoJCXJldHVybiBmdW5jdGlvbigpIHsKCQkJd2luZG93LmFsZXJ0KCBVdGlscy5hcnJheSggYXJndW1lbnRzICkuam9pbignLCAnKSApOwoJCX07Cgl9Cn0oKSk7CgovKioKCUEgcmVhZHkgbWV0aG9kIGZvciBhZGRpbmcgY2FsbGJhY2tzIHdoZW4gYSBnYWxsZXJ5IGlzIHJlYWR5CglFYWNoIG1ldGhvZCBpcyBjYWxsIGJlZm9yZSB0aGUgZXh0ZW5kIG9wdGlvbiBmb3IgZXZlcnkgaW5zdGFuY2UKCglAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdG8gY2FsbAoqLwoKR2FsbGVyaWEucmVhZHkgPSBmdW5jdGlvbiggZm4gKSB7CgkkLmVhY2goIF9nYWxsZXJpZXMsIGZ1bmN0aW9uKCBpLCBnYWxsZXJ5ICkgewoJCWZuLmNhbGwoIGdhbGxlcnksIGdhbGxlcnkuX29wdGlvbnMgKTsKCX0pOwoJR2FsbGVyaWEucmVhZHkuY2FsbGJhY2tzLnB1c2goIGZuICk7Cn07CgpHYWxsZXJpYS5yZWFkeS5jYWxsYmFja3MgPSBbXTsKCi8qKgoJTWV0aG9kIGZvciByYWlzaW5nIGVycm9ycwoKCUBwYXJhbSB7c3RyaW5nfSBtc2cgVGhlIG1lc3NhZ2UgdG8gdGhyb3cKCglAcGFyYW0ge2Jvb2xlYW59IFtmYXRhbF0gU2V0IHRoaXMgdG8gdHJ1ZSB0byBvdmVycmlkZSBkZWJ1ZyBzZXR0aW5ncyBhbmQgZGlzcGxheSBhIGZhdGFsIGVycm9yCiovCgpHYWxsZXJpYS5yYWlzZSA9IGZ1bmN0aW9uKCBtc2csIGZhdGFsICkgewoKCXZhciB0eXBlID0gZmF0YWwgPyAnRmF0YWwgZXJyb3InIDogJ0Vycm9yJywKCgkJc2VsZiA9IHRoaXMsCgoJCWVjaG8gPSBmdW5jdGlvbiggbXNnICkgewoKCQkJdmFyIGh0bWwgPSAnPGRpdiBzdHlsZT0icGFkZGluZzo0cHg7bWFyZ2luOjAgMCAycHg7YmFja2dyb3VuZDojJyArCgkJCQkoIGZhdGFsID8gJzgxMScgOiAnMjIyJyApICsgJyI7PicgKwoJCQkJKCBmYXRhbCA/ICc8c3Ryb25nPicgKyB0eXBlICsgJzogPC9zdHJvbmc+JyA6ICcnICkgKwoJCQkJbXNnICsgJzwvZGl2Pic7CgoJCQkkLmVhY2goIF9pbnN0YW5jZXMsIGZ1bmN0aW9uKCkgewoKCQkJCXZhciBjb250ID0gdGhpcy4kKCAnZXJyb3JzJyApLAoJCQkJCXRhcmdldCA9IHRoaXMuJCggJ3RhcmdldCcgKTsKCgkJCQlpZiAoICFjb250Lmxlbmd0aCApIHsKCgkJCQkJdGFyZ2V0LmNzcyggJ3Bvc2l0aW9uJywgJ3JlbGF0aXZlJyApOwoKCQkJCQljb250ID0gdGhpcy5hZGRFbGVtZW50KCAnZXJyb3JzJyApLmFwcGVuZENoaWxkKCAndGFyZ2V0JywgJ2Vycm9ycycgKS4kKCAnZXJyb3JzJyApLmNzcyh7CgkJCQkJCWNvbG9yOiAnI2ZmZicsCgkJCQkJCXBvc2l0aW9uOiAnYWJzb2x1dGUnLAoJCQkJCQl0b3A6IDAsCgkJCQkJCWxlZnQ6IDAsCgkJCQkJCXpJbmRleDogMTAwMDAwCgkJCQkJfSk7CgkJCQl9CgoJCQkJY29udC5hcHBlbmQoIGh0bWwgKTsKCgkJCX0pOwoJCX07CgoJLy8gaWYgZGVidWcgaXMgb24sIGRpc3BsYXkgZXJyb3JzIGFuZCB0aHJvdyBleGNlcHRpb24gaWYgZmF0YWwKCWlmICggREVCVUcgKSB7CgkJZWNobyggbXNnICk7CgkJaWYgKCBmYXRhbCApIHsKCQkJdGhyb3cgbmV3IEVycm9yKHR5cGUgKyAnOiAnICsgbXNnKTsKCQl9CgoJLy8gZWxzZSBqdXN0IGVjaG8gYSBzaWxlbnQgZ2VuZXJpYyBlcnJvciBpZiBmYXRhbAoJfSBlbHNlIGlmICggZmF0YWwgKSB7CgkJaWYgKCBfaGFzRXJyb3IgKSB7CgkJCXJldHVybjsKCQl9CgkJX2hhc0Vycm9yID0gdHJ1ZTsKCQlmYXRhbCA9IGZhbHNlOwoJCWVjaG8oICdJbWFnZSBnYWxsZXJ5IGNvdWxkIG5vdCBsb2FkLicgKTsKCX0KfTsKCi8vIEFkZCB0aGUgdmVyc2lvbgpHYWxsZXJpYS52ZXJzaW9uID0gVkVSU0lPTjsKCi8qKgoJQSBtZXRob2QgZm9yIGNoZWNraW5nIHdoYXQgdmVyc2lvbiBvZiBHYWxsZXJpYSB0aGUgdXNlciBoYXMgaW5zdGFsbGVkIGFuZCB0aHJvd3MgYSByZWFkYWJsZSBlcnJvciBpZiB0aGUgdXNlciBuZWVkcyB0byB1cGdyYWRlLgoJVXNlZnVsIHdoZW4gYnVpbGRpbmcgcGx1Z2lucyB0aGF0IHJlcXVpcmVzIGEgY2VydGFpbiB2ZXJzaW9uIHRvIGZ1bmN0aW9uLgoKCUBwYXJhbSB7bnVtYmVyfSB2ZXJzaW9uIFRoZSBtaW5pbXVtIHZlcnNpb24gcmVxdWlyZWQKCglAcGFyYW0ge3N0cmluZ30gW21zZ10gT3B0aW9uYWwgbWVzc2FnZSB0byBkaXNwbGF5LiBJZiBub3Qgc3BlY2lmaWVkLCBHYWxsZXJpYSB3aWxsIHRocm93IGEgZ2VuZXJpYyBlcnJvci4KKi8KCkdhbGxlcmlhLnJlcXVpcmVzID0gZnVuY3Rpb24oIHZlcnNpb24sIG1zZyApIHsKCW1zZyA9IG1zZyB8fCAnWW91IG5lZWQgdG8gdXBncmFkZSBHYWxsZXJpYSB0byB2ZXJzaW9uICcgKyB2ZXJzaW9uICsgJyB0byB1c2Ugb25lIG9yIG1vcmUgY29tcG9uZW50cy4nOwoJaWYgKCBHYWxsZXJpYS52ZXJzaW9uIDwgdmVyc2lvbiApIHsKCQlHYWxsZXJpYS5yYWlzZShtc2csIHRydWUpOwoJfQp9OwoKLyoqCglBZGRzIHByZWxvYWQsIGNhY2hlLCBzY2FsZSBhbmQgY3JvcCBmdW5jdGlvbmFsaXR5CgoJQGNvbnN0cnVjdG9yCgoJQHJlcXVpcmVzIGpRdWVyeQoKCUBwYXJhbSB7bnVtYmVyfSBbaWRdIE9wdGlvbmFsIGlkIHRvIGtlZXAgdHJhY2sgb2YgaW5zdGFuY2VzCiovCgpHYWxsZXJpYS5QaWN0dXJlID0gZnVuY3Rpb24oIGlkICkgewoKCS8vIHNhdmUgdGhlIGlkCgl0aGlzLmlkID0gaWQgfHwgbnVsbDsKCgkvLyB0aGUgaW1hZ2Ugc2hvdWxkIGJlIG51bGwgdW50aWwgbG9hZGVkCgl0aGlzLmltYWdlID0gbnVsbDsKCgkvLyBDcmVhdGUgYSBuZXcgY29udGFpbmVyCgl0aGlzLmNvbnRhaW5lciA9IFV0aWxzLmNyZWF0ZSgnZ2FsbGVyaWEtaW1hZ2UnKTsKCgkvLyBhZGQgY29udGFpbmVyIHN0eWxlcwoJJCggdGhpcy5jb250YWluZXIgKS5jc3MoewoJCW92ZXJmbG93OiAnaGlkZGVuJywKCQlwb3NpdGlvbjogJ3JlbGF0aXZlJyAvLyBmb3IgSUUgU3RhbmRhcmRzIG1vZGUKCX0pOwoKCS8vIHNhdmVzIHRoZSBvcmlnaW5hbCBtZWFzdXJlbWVudHMKCXRoaXMub3JpZ2luYWwgPSB7CgkJd2lkdGg6IDAsCgkJaGVpZ2h0OiAwCgl9OwoKCS8vIGZsYWcgd2hlbiB0aGUgaW1hZ2UgaXMgcmVhZHkKCXRoaXMucmVhZHkgPSBmYWxzZTsKCgkvLyBwbGFjZWhvbGRlciBmb3IgdGhlIHRpbWVvdXQKCXRoaXMudGlkID0gbnVsbDsKCn07CgpHYWxsZXJpYS5QaWN0dXJlLnByb3RvdHlwZSA9IHsKCgkvLyB0aGUgaW5oZXJpdGVkIGNhY2hlIG9iamVjdAoJY2FjaGU6IHt9LAoKCS8vIHNob3cgdGhlIGltYWdlIG9uIHN0YWdlCglzaG93OiBmdW5jdGlvbigpIHsKCQlVdGlscy5zaG93KCB0aGlzLmltYWdlICk7Cgl9LAoKCS8vIGhpZGUgdGhlIGltYWdlCgloaWRlOiBmdW5jdGlvbigpIHsKCQlVdGlscy5tb3ZlT3V0KCB0aGlzLmltYWdlICk7Cgl9LAoKCWNsZWFyOiBmdW5jdGlvbigpIHsKCQl0aGlzLmltYWdlID0gbnVsbDsKCX0sCgoJLyoqCgkJQ2hlY2tzIGlmIGFuIGltYWdlIGlzIGluIGNhY2hlCgoJCUBwYXJhbSB7c3RyaW5nfSBzcmMgVGhlIGltYWdlIHNvdXJjZSBwYXRoLCBleCAnL3BhdGgvdG8vaW1nLmpwZycKCgkJQHJldHVybnMge2Jvb2xlYW59CgkqLwoKCWlzQ2FjaGVkOiBmdW5jdGlvbiggc3JjICkgewoJCXJldHVybiAhIXRoaXMuY2FjaGVbc3JjXTsKCX0sCgoJLyoqCgkJUHJlbG9hZHMgYW4gaW1hZ2UgaW50byB0aGUgY2FjaGUKCgkJQHBhcmFtIHtzdHJpbmd9IHNyYyBUaGUgaW1hZ2Ugc291cmNlIHBhdGgsIGV4ICcvcGF0aC90by9pbWcuanBnJwoKCQlAcmV0dXJucyBHYWxsZXJpYS5QaWN0dXJlCgkqLwoKCXByZWxvYWQ6IGZ1bmN0aW9uKCBzcmMgKSB7CgkJJCggbmV3IEltYWdlKCkgKS5sb2FkKChmdW5jdGlvbihzcmMsIGNhY2hlKSB7CgkJCXJldHVybiBmdW5jdGlvbigpIHsKCQkJCWNhY2hlWyBzcmMgXSA9IHNyYzsKCQkJfTsKCQl9KCBzcmMsIHRoaXMuY2FjaGUgKSkpLmF0dHIoICdzcmMnLCBzcmMgKTsKCX0sCgoJLyoqCgkJTG9hZHMgYW4gaW1hZ2UgYW5kIGNhbGwgdGhlIGNhbGxiYWNrIHdoZW4gcmVhZHkuCgkJV2lsbCBhbHNvIGFkZCB0aGUgaW1hZ2UgdG8gY2FjaGUuCgoJCUBwYXJhbSB7c3RyaW5nfSBzcmMgVGhlIGltYWdlIHNvdXJjZSBwYXRoLCBleCAnL3BhdGgvdG8vaW1nLmpwZycKCQlAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgd2hlbiB0aGUgaW1hZ2UgaXMgbG9hZGVkICYgc2NhbGVkCgoJCUByZXR1cm5zIFRoZSBpbWFnZSBjb250YWluZXIgKGpRdWVyeSBvYmplY3QpCgkqLwoKCWxvYWQ6IGZ1bmN0aW9uKHNyYywgY2FsbGJhY2spIHsKCgkJLy8gc2V0IGEgbG9hZCB0aW1lb3V0IGZvciBkZWJ1Z2dpbmcKCQl0aGlzLnRpZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCAoZnVuY3Rpb24oc3JjKSB7CgkJCXJldHVybiBmdW5jdGlvbigpIHsKCQkJCUdhbGxlcmlhLnJhaXNlKCdJbWFnZSBub3QgbG9hZGVkIGluICcgKyBNYXRoLnJvdW5kKCBUSU1FT1VULzEwMDAgKSArICcgc2Vjb25kczogJysgc3JjKTsKCQkJfTsKCQl9KCBzcmMgKSksIFRJTUVPVVQgKTsKCgkJdGhpcy5pbWFnZSA9IG5ldyBJbWFnZSgpOwoKCQl2YXIgaSA9IDAsCgkJCXJlbG9hZCA9IGZhbHNlLAoKCQkJLy8gc29tZSBqcXVlcnkgY2FjaGUKCQkJJGNvbnRhaW5lciA9ICQoIHRoaXMuY29udGFpbmVyICksCgkJCSRpbWFnZSA9ICQoIHRoaXMuaW1hZ2UgKSwKCgkJCS8vIHRoZSBvbmxvYWQgbWV0aG9kCgkJCW9ubG9hZCA9IChmdW5jdGlvbiggc2VsZiwgY2FsbGJhY2ssIHNyYyApIHsKCgkJCQlyZXR1cm4gZnVuY3Rpb24oKSB7CgoJCQkJCXZhciBjb21wbGV0ZSA9IGZ1bmN0aW9uKCkgewoKCQkJCQkJJCggdGhpcyApLnVuYmluZCggJ2xvYWQnICk7CgoJCQkJCQkvLyBzYXZlIHRoZSBvcmlnaW5hbCBzaXplCgkJCQkJCXNlbGYub3JpZ2luYWwgPSB7CgkJCQkJCQloZWlnaHQ6IHRoaXMuaGVpZ2h0LAoJCQkJCQkJd2lkdGg6IHRoaXMud2lkdGgKCQkJCQkJfTsKCgkJCQkJCXNlbGYuY2FjaGVbIHNyYyBdID0gc3JjOyAvLyB3aWxsIG92ZXJyaWRlIG9sZCBjYWNoZQoKCQkJCQkJLy8gY2xlYXIgdGhlIGRlYnVnIHRpbWVvdXQKCQkJCQkJd2luZG93LmNsZWFyVGltZW91dCggc2VsZi50aWQgKTsKCgkJCQkJCWlmICh0eXBlb2YgY2FsbGJhY2sgPT0gJ2Z1bmN0aW9uJyApIHsKCQkJCQkJCXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoJCQkJCQkJCWNhbGxiYWNrLmNhbGwoIHNlbGYsIHNlbGYgKTsKCQkJCQkJCX0sMSk7CgkJCQkJCX0KCQkJCQl9OwoKCQkJCQkvLyBEZWxheSB0aGUgY2FsbGJhY2sgdG8gImZpeCIgdGhlIEFkYmxvY2sgQnVnCgkJCQkJLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2FkYmxvY2tmb3JjaHJvbWUvaXNzdWVzL2RldGFpbD9pZD0zNzAxCgkJCQkJaWYgKCAoICF0aGlzLndpZHRoIHx8ICF0aGlzLmhlaWdodCApICkgewoJCQkJCQl3aW5kb3cuc2V0VGltZW91dCggKGZ1bmN0aW9uKCBpbWcgKSB7CgkJCQkJCQlyZXR1cm4gZnVuY3Rpb24oKSB7CgkJCQkJCQkJaWYgKCBpbWcud2lkdGggJiYgaW1nLmhlaWdodCApIHsKCQkJCQkJCQkJY29tcGxldGUuY2FsbCggaW1nICk7CgkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkJR2FsbGVyaWEucmFpc2UoJ0NvdWxkIG5vdCBleHRyYWN0IHdpZHRoL2hlaWdodCBmcm9tIGltYWdlOiAnICsgaW1nLnNyYyArCgkJCQkJCQkJCQknLiBUcmFjZWQgbWVhc3VyZXM6IHdpZHRoOicgKyBpbWcud2lkdGggKyAncHgsIGhlaWdodDogJyArIGltZy5oZWlnaHQgKyAncHguJyk7CgkJCQkJCQkJfQoJCQkJCQkJfTsKCQkJCQkJfSggdGhpcyApKSwgMik7CgkJCQkJfSBlbHNlIHsKCQkJCQkJY29tcGxldGUuY2FsbCggdGhpcyApOwoJCQkJCX0KCQkJCX07CgkJCX0oIHRoaXMsIGNhbGxiYWNrLCBzcmMgKSk7CgoJCS8vIHJlbW92ZSBhbnkgcHJldmlvdXMgaW1hZ2VzCgkJJGNvbnRhaW5lci5maW5kKCAnaW1nJyApLnJlbW92ZSgpOwoKCQkvLyBhcHBlbmQgdGhlIGltYWdlCgkJJGltYWdlLmNzcyggJ2Rpc3BsYXknLCAnYmxvY2snKS5hcHBlbmRUbyggdGhpcy5jb250YWluZXIgKTsKCgkJLy8gaGlkZSBpdCBmb3Igbm93CgkJVXRpbHMuaGlkZSggdGhpcy5pbWFnZSApOwoKCQlpZiAoIHRoaXMuY2FjaGVbIHNyYyBdICkgewoKCQkJLy8gcXVpY2sgbG9hZCBvbiBjYWNoZQoJCQkkKCB0aGlzLmltYWdlICkubG9hZCggb25sb2FkICkuYXR0ciggJ3NyYycsIHNyYyApOwoKCQkJcmV0dXJuIHRoaXMuY29udGFpbmVyOwoJCX0KCgkJLy8gYmVnaW4gbG9hZCBhbmQgaW5zZXJ0IGluIGNhY2hlIHdoZW4gZG9uZQoJCSQoIHRoaXMuaW1hZ2UgKS5sb2FkKCBvbmxvYWQgKS5lcnJvciggZnVuY3Rpb24oKSB7CgkJCWlmICggIXJlbG9hZCApIHsKCQkJCXJlbG9hZCA9IHRydWU7CgkJCQkvLyByZWxvYWQgdGhlIGltYWdlIHdpdGggYSB0aW1lc3RhbXAKCQkJCXdpbmRvdy5zZXRUaW1lb3V0KChmdW5jdGlvbihpbWFnZSwgc3JjKSB7CgkJCQkJcmV0dXJuIGZ1bmN0aW9uKCkgewoJCQkJCQlpbWFnZS5hdHRyKCdzcmMnLCBzcmMgKyAnPycgKyBVdGlscy50aW1lc3RhbXAoKSApOwoJCQkJCX07CgkJCQl9KCAkKHRoaXMpLCBzcmMgKSksIDUwKTsKCQkJfSBlbHNlIHsKCQkJCS8vIGFwcGx5IHRoZSBkdW1teSBpbWFnZSBpZiBpdCBleGlzdHMKCQkJCWlmICggRFVNTVkgKSB7CgkJCQkJJCggdGhpcyApLmF0dHIoICdzcmMnLCBEVU1NWSApOwoJCQkJfSBlbHNlIHsKCQkJCQlHYWxsZXJpYS5yYWlzZSgnSW1hZ2Ugbm90IGZvdW5kOiAnICsgc3JjKTsKCQkJCX0KCQkJfQoJCX0pLmF0dHIoICdzcmMnLCBzcmMgKTsKCgkJLy8gcmV0dXJuIHRoZSBjb250YWluZXIKCQlyZXR1cm4gdGhpcy5jb250YWluZXI7Cgl9LAoKCS8qKgoJCVNjYWxlcyBhbmQgY3JvcHMgdGhlIGltYWdlCgoJCUBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFRoZSBtZXRob2QgdGFrZXMgYW4gb2JqZWN0IHdpdGggYSBudW1iZXIgb2Ygb3B0aW9uczoKCgkJPHVsPgoJCQk8bGk+d2lkdGggLSB3aWR0aCBvZiB0aGUgY29udGFpbmVyPC9saT4KCQkJPGxpPmhlaWdodCAtIGhlaWdodCBvZiB0aGUgY29udGFpbmVyPC9saT4KCQkJPGxpPm1pbiAtIG1pbmltdW0gc2NhbGUgcmF0aW88L2xpPgoJCQk8bGk+bWF4IC0gbWF4aW11bSBzY2FsZSByYXRpbzwvbGk+CgkJCTxsaT5tYXJnaW4gLSBkaXN0YW5jZSBpbiBwaXhlbHMgZnJvbSB0aGUgaW1hZ2UgYm9yZGVyIHRvIHRoZSBjb250YWluZXI8L2xpPgoJCQk8bGk+Y29tcGxldGUgLSBhIGNhbGxiYWNrIHRoYXQgZmlyZXMgd2hlbiBzY2FsaW5nIGlzIGNvbXBsZXRlPC9saT4KCQkJPGxpPnBvc2l0aW9uIC0gcG9zaXRpb25zIHRoZSBpbWFnZSwgd29ya3MgbGlrZSB0aGUgY3NzIGJhY2tncm91bmQtaW1hZ2UgcHJvcGVydHkuPC9saT4KCQkJPGxpPmNyb3AgLSBkZWZpbmVzIGhvdyB0byBjcm9wLiBDYW4gYmUgdHJ1ZSwgZmFsc2UsICd3aWR0aCcgb3IgJ2hlaWdodCc8L2xpPgoJCQk8bGk+Y2FudmFzIC0gc2V0IHRvIHRydWUgdG8gdHJ5IGEgY2FudmFzLWJhc2VkIHJlc2NhbGU8L2xpPgoJCTwvdWw+CgoJCUByZXR1cm5zIFRoZSBpbWFnZSBjb250YWluZXIgb2JqZWN0IChqUXVlcnkpCgkqLwoKCXNjYWxlOiBmdW5jdGlvbiggb3B0aW9ucyApIHsKCgkJLy8gZXh0ZW5kIHNvbWUgZGVmYXVsdHMKCQlvcHRpb25zID0gJC5leHRlbmQoewoJCQl3aWR0aDogMCwKCQkJaGVpZ2h0OiAwLAoJCQltaW46IHVuZGVmLAoJCQltYXg6IHVuZGVmLAoJCQltYXJnaW46IDAsCgkJCWNvbXBsZXRlOiBmdW5jdGlvbigpIHt9LAoJCQlwb3NpdGlvbjogJ2NlbnRlcicsCgkJCWNyb3A6IGZhbHNlLAoJCQljYW52YXM6IGZhbHNlCgkJfSwgb3B0aW9ucyk7CgoJCS8vIHJldHVybiB0aGUgZWxlbWVudCBpZiBubyBpbWFnZSBmb3VuZAoJCWlmICghdGhpcy5pbWFnZSkgewoJCQlyZXR1cm4gdGhpcy5jb250YWluZXI7CgkJfQoKCQkvLyBzdG9yZSBsb2NhbGUgdmFyaWFibGVzCgkJdmFyIHdpZHRoLAoJCQloZWlnaHQsCgkJCXNlbGYgPSB0aGlzLAoJCQkkY29udGFpbmVyID0gJCggc2VsZi5jb250YWluZXIgKSwKCQkJZGF0YTsKCgkJLy8gd2FpdCBmb3IgdGhlIHdpZHRoL2hlaWdodAoJCVV0aWxzLndhaXQoewoJCQl1bnRpbDogZnVuY3Rpb24oKSB7CgkJCQl3aWR0aCAgPSBvcHRpb25zLndpZHRoIHx8CgkJCQkJCSAkY29udGFpbmVyLndpZHRoKCkgfHwKCQkJCQkJIFV0aWxzLnBhcnNlVmFsdWUoICRjb250YWluZXIuY3NzKCd3aWR0aCcpICk7CgoJCQkJaGVpZ2h0ID0gb3B0aW9ucy5oZWlnaHQgfHwKCQkJCQkJICRjb250YWluZXIuaGVpZ2h0KCkgfHwKCQkJCQkJIFV0aWxzLnBhcnNlVmFsdWUoICRjb250YWluZXIuY3NzKCdoZWlnaHQnKSApOwoKCQkJCXJldHVybiB3aWR0aCAmJiBoZWlnaHQ7CgkJCX0sCgkJCXN1Y2Nlc3M6IGZ1bmN0aW9uKCkgewoJCQkJLy8gY2FsY3VsYXRlIHNvbWUgY3JvcHBpbmcKCQkJCXZhciBuZXdXaWR0aCA9ICggd2lkdGggLSBvcHRpb25zLm1hcmdpbiAqIDIgKSAvIHNlbGYub3JpZ2luYWwud2lkdGgsCgkJCQkJbmV3SGVpZ2h0ID0gKCBoZWlnaHQgLSBvcHRpb25zLm1hcmdpbiAqIDIgKSAvIHNlbGYub3JpZ2luYWwuaGVpZ2h0LAoJCQkJCWNyb3BNYXAgPSB7CgkJCQkJCSd0cnVlJyAgOiBNYXRoLm1heCggbmV3V2lkdGgsIG5ld0hlaWdodCApLAoJCQkJCQknd2lkdGgnIDogbmV3V2lkdGgsCgkJCQkJCSdoZWlnaHQnOiBuZXdIZWlnaHQsCgkJCQkJCSdmYWxzZScgOiBNYXRoLm1pbiggbmV3V2lkdGgsIG5ld0hlaWdodCApCgkJCQkJfSwKCQkJCQlyYXRpbyA9IGNyb3BNYXBbIG9wdGlvbnMuY3JvcC50b1N0cmluZygpIF0sCgkJCQkJY2FudmFzS2V5ID0gJyc7CgoJCQkJLy8gYWxsb3cgbWF4X3NjYWxlX3JhdGlvCgkJCQlpZiAoIG9wdGlvbnMubWF4ICkgewoJCQkJCXJhdGlvID0gTWF0aC5taW4oIG9wdGlvbnMubWF4LCByYXRpbyApOwoJCQkJfQoKCQkJCS8vIGFsbG93IG1pbl9zY2FsZV9yYXRpbwoJCQkJaWYgKCBvcHRpb25zLm1pbiApIHsKCQkJCQlyYXRpbyA9IE1hdGgubWF4KCBvcHRpb25zLm1pbiwgcmF0aW8gKTsKCQkJCX0KCgkJCQkkLmVhY2goIFsnd2lkdGgnLCdoZWlnaHQnXSwgZnVuY3Rpb24oIGksIG0gKSB7CgkJCQkJJCggc2VsZi5pbWFnZSApWyBtIF0oIHNlbGZbIG0gXSA9IHNlbGYuaW1hZ2VbIG0gXSA9IE1hdGgucm91bmQoIHNlbGYub3JpZ2luYWxbIG0gXSAqIHJhdGlvICkgKTsKCQkJCX0pOwoKCQkJCSQoIHNlbGYuY29udGFpbmVyICkud2lkdGgoIHdpZHRoICkuaGVpZ2h0KCBoZWlnaHQgKTsKCgkJCQlpZiAoIG9wdGlvbnMuY2FudmFzICYmIF9jYW52YXMgKSB7CgoJCQkJCV9jYW52YXMuZWxlbS53aWR0aCA9IHNlbGYud2lkdGg7CgkJCQkJX2NhbnZhcy5lbGVtLmhlaWdodCA9IHNlbGYuaGVpZ2h0OwoKCQkJCQljYW52YXNLZXkgPSBzZWxmLmltYWdlLnNyYyArICc6JyArIHNlbGYud2lkdGggKyAneCcgKyBzZWxmLmhlaWdodDsKCgkJCQkJc2VsZi5pbWFnZS5zcmMgPSBfY2FudmFzLmNhY2hlWyBjYW52YXNLZXkgXSB8fCAoZnVuY3Rpb24oIGtleSApIHsKCgkJCQkJCV9jYW52YXMuY29udGV4dC5kcmF3SW1hZ2Uoc2VsZi5pbWFnZSwgMCwgMCwgc2VsZi5vcmlnaW5hbC53aWR0aCpyYXRpbywgc2VsZi5vcmlnaW5hbC5oZWlnaHQqcmF0aW8pOwoKCQkJCQkJdHJ5IHsKCgkJCQkJCQlkYXRhID0gX2NhbnZhcy5lbGVtLnRvRGF0YVVSTCgpOwoJCQkJCQkJX2NhbnZhcy5sZW5ndGggKz0gZGF0YS5sZW5ndGg7CgkJCQkJCQlfY2FudmFzLmNhY2hlWyBrZXkgXSA9IGRhdGE7CgkJCQkJCQlyZXR1cm4gZGF0YTsKCgkJCQkJCX0gY2F0Y2goIGUgKSB7CgkJCQkJCQlyZXR1cm4gc2VsZi5pbWFnZS5zcmM7CgkJCQkJCX0KCgkJCQkJfSggY2FudmFzS2V5ICkgKTsKCgkJCQl9CgoJCQkJLy8gY2FsY3VsYXRlIGltYWdlX3Bvc2l0aW9uCgkJCQl2YXIgcG9zID0ge30sCgkJCQkJbWl4ID0ge30sCgkJCQkJZ2V0UG9zaXRpb24gPSBmdW5jdGlvbih2YWx1ZSwgbWVhc3VyZSwgbWFyZ2luKSB7CgkJCQkJCXZhciByZXN1bHQgPSAwOwoJCQkJCQlpZiAoL1wlLy50ZXN0KHZhbHVlKSkgewoJCQkJCQkJdmFyIGZsdCA9IHBhcnNlSW50KCB2YWx1ZSwgMTAgKSAvIDEwMCwKCQkJCQkJCQltID0gc2VsZi5pbWFnZVsgbWVhc3VyZSBdIHx8ICQoIHNlbGYuaW1hZ2UgKVsgbWVhc3VyZSBdKCk7CgoJCQkJCQkJcmVzdWx0ID0gTWF0aC5jZWlsKCBtICogLTEgKiBmbHQgKyBtYXJnaW4gKiBmbHQgKTsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCXJlc3VsdCA9IFV0aWxzLnBhcnNlVmFsdWUoIHZhbHVlICk7CgkJCQkJCX0KCQkJCQkJcmV0dXJuIHJlc3VsdDsKCQkJCQl9LAoJCQkJCXBvc2l0aW9uTWFwID0gewoJCQkJCQkndG9wJzogeyB0b3A6IDAgfSwKCQkJCQkJJ2xlZnQnOiB7IGxlZnQ6IDAgfSwKCQkJCQkJJ3JpZ2h0JzogeyBsZWZ0OiAnMTAwJScgfSwKCQkJCQkJJ2JvdHRvbSc6IHsgdG9wOiAnMTAwJScgfQoJCQkJCX07CgoJCQkJJC5lYWNoKCBvcHRpb25zLnBvc2l0aW9uLnRvTG93ZXJDYXNlKCkuc3BsaXQoJyAnKSwgZnVuY3Rpb24oIGksIHZhbHVlICkgewoJCQkJCWlmICggdmFsdWUgPT09ICdjZW50ZXInICkgewoJCQkJCQl2YWx1ZSA9ICc1MCUnOwoJCQkJCX0KCQkJCQlwb3NbaSA/ICd0b3AnIDogJ2xlZnQnXSA9IHZhbHVlOwoJCQkJfSk7CgoJCQkJJC5lYWNoKCBwb3MsIGZ1bmN0aW9uKCBpLCB2YWx1ZSApIHsKCQkJCQlpZiAoIHBvc2l0aW9uTWFwLmhhc093blByb3BlcnR5KCB2YWx1ZSApICkgewoJCQkJCQkkLmV4dGVuZCggbWl4LCBwb3NpdGlvbk1hcFsgdmFsdWUgXSApOwoJCQkJCX0KCQkJCX0pOwoKCQkJCXBvcyA9IHBvcy50b3AgPyAkLmV4dGVuZCggcG9zLCBtaXggKSA6IG1peDsKCgkJCQlwb3MgPSAkLmV4dGVuZCh7CgkJCQkJdG9wOiAnNTAlJywKCQkJCQlsZWZ0OiAnNTAlJwoJCQkJfSwgcG9zKTsKCgkJCQkvLyBhcHBseSBwb3NpdGlvbgoJCQkJJCggc2VsZi5pbWFnZSApLmNzcyh7CgkJCQkJcG9zaXRpb24gOiAnYWJzb2x1dGUnLAoJCQkJCXRvcCA6ICBnZXRQb3NpdGlvbihwb3MudG9wLCAnaGVpZ2h0JywgaGVpZ2h0KSwKCQkJCQlsZWZ0IDogZ2V0UG9zaXRpb24ocG9zLmxlZnQsICd3aWR0aCcsIHdpZHRoKQoJCQkJfSk7CgoJCQkJLy8gc2hvdyB0aGUgaW1hZ2UKCQkJCXNlbGYuc2hvdygpOwoKCQkJCS8vIGZsYWcgcmVhZHkgYW5kIGNhbGwgdGhlIGNhbGxiYWNrCgkJCQlzZWxmLnJlYWR5ID0gdHJ1ZTsKCQkJCW9wdGlvbnMuY29tcGxldGUuY2FsbCggc2VsZiwgc2VsZiApOwoKCQkJfSwKCQkJZXJyb3I6IGZ1bmN0aW9uKCkgewoJCQkJR2FsbGVyaWEucmFpc2UoJ0NvdWxkIG5vdCBzY2FsZSBpbWFnZTogJytzZWxmLmltYWdlLnNyYyk7CgkJCX0sCgkJCXRpbWVvdXQ6IDEwMDAKCQl9KTsKCQlyZXR1cm4gdGhpczsKCX0KfTsKCi8vIG91ciBvd24gZWFzaW5ncwokLmV4dGVuZCggJC5lYXNpbmcsIHsKCglnYWxsZXJpYTogZnVuY3Rpb24gKF8sIHQsIGIsIGMsIGQpIHsKCQlpZiAoKHQvPWQvMikgPCAxKSB7CgkJCXJldHVybiBjLzIqdCp0KnQgKyBiOwoJCX0KCQlyZXR1cm4gYy8yKigodC09MikqdCp0ICsgMikgKyBiOwoJfSwKCglnYWxsZXJpYUluOiBmdW5jdGlvbiAoXywgdCwgYiwgYywgZCkgewoJCXJldHVybiBjKih0Lz1kKSp0ICsgYjsKCX0sCgoJZ2FsbGVyaWFPdXQ6IGZ1bmN0aW9uIChfLCB0LCBiLCBjLCBkKSB7CgkJcmV0dXJuIC1jICoodC89ZCkqKHQtMikgKyBiOwoJfQoKfSk7CgovLyB0aGUgcGx1Z2luIGluaXRpYWxpemVyCiQuZm4uZ2FsbGVyaWEgPSBmdW5jdGlvbiggb3B0aW9ucyApIHsKCglyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCSQoIHRoaXMgKS5kYXRhKCAnZ2FsbGVyaWEnLCBuZXcgR2FsbGVyaWEoKS5pbml0KCB0aGlzLCBvcHRpb25zICkgKTsKCX0pOwoKfTsKCi8vIHBoZXcKCn0oIGpRdWVyeSApICk7Cg==]]></data>
	</file>
	<file>
	  <filename>/script/plugins/galleria/galleria-1.2.6.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKIEdhbGxlcmlhIHYgMS4yLjYgMjAxMS0xMi0xMgogaHR0cDovL2dhbGxlcmlhLmFpbm8uc2UKCiBDb3B5cmlnaHQgKGMpIDIwMTEsIEFpbm8KIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4KKi8KKGZ1bmN0aW9uKGUpe3ZhciBrPXRoaXMsbT1rLmRvY3VtZW50LEc9ZShtKSx1PWUoayksSD0hMCxBPTNFNCxCPSExLHg9bmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLEk9ay5sb2NhdGlvbi5oYXNoLnJlcGxhY2UoLyNcLy8sIiIpLHE9ZnVuY3Rpb24oKXt2YXIgYT0zLGI9bS5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImkiKTtkbyBiLmlubmVySFRNTD0iPFwhLS1baWYgZ3QgSUUgIisgKythKyJdPjxpPjwvaT48IVtlbmRpZl0tLVw+Ijt3aGlsZShkWzBdKTtyZXR1cm4gYT40P2E6dm9pZCAwfSgpLHY9ZnVuY3Rpb24oKXtyZXR1cm57aHRtbDptLmRvY3VtZW50RWxlbWVudCxib2R5Om0uYm9keSxoZWFkOm0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXSx0aXRsZTptLnRpdGxlfX0sSj1mdW5jdGlvbigpe3ZhciBhPVtdO2UuZWFjaCgiZGF0YSByZWFkeSB0aHVtYm5haWwgbG9hZHN0YXJ0IGxvYWRmaW5pc2ggaW1hZ2UgcGxheSBwYXVzZSBwcm9ncmVzcyBmdWxsc2NyZWVuX2VudGVyIGZ1bGxzY3JlZW5fZXhpdCBpZGxlX2VudGVyIGlkbGVfZXhpdCByZXNjYWxlIGxpZ2h0Ym94X29wZW4gbGlnaHRib3hfY2xvc2UgbGlnaHRib3hfaW1hZ2UiLnNwbGl0KCIgIiksCmZ1bmN0aW9uKGIsZCl7YS5wdXNoKGQpOy9fLy50ZXN0KGQpJiZhLnB1c2goZC5yZXBsYWNlKC9fL2csIiIpKX0pO3JldHVybiBhfSgpLEs9ZnVuY3Rpb24oYSl7dmFyIGI7aWYodHlwZW9mIGEhPT0ib2JqZWN0IilyZXR1cm4gYTtlLmVhY2goYSxmdW5jdGlvbihkLGMpey9eW2Etel0rXy8udGVzdChkKSYmKGI9IiIsZS5lYWNoKGQuc3BsaXQoIl8iKSxmdW5jdGlvbihhLGMpe2IrPWE+MD9jLnN1YnN0cigwLDEpLnRvVXBwZXJDYXNlKCkrYy5zdWJzdHIoMSk6Y30pLGFbYl09YyxkZWxldGUgYVtkXSl9KTtyZXR1cm4gYX0sQz1mdW5jdGlvbihhKXtyZXR1cm4gZS5pbkFycmF5KGEsSik+LTE/R2FsbGVyaWFbYS50b1VwcGVyQ2FzZSgpXTphfSx3PXt0cnVuazp7fSxhZGQ6ZnVuY3Rpb24oYSxiLGQsYyl7Yz1jfHwhMTt0aGlzLmNsZWFyKGEpO2lmKGMpdmFyIGU9YixiPWZ1bmN0aW9uKCl7ZSgpO3cuYWRkKGEsYixkKX07dGhpcy50cnVua1thXT1rLnNldFRpbWVvdXQoYixkKX0sY2xlYXI6ZnVuY3Rpb24oYSl7dmFyIGI9CmZ1bmN0aW9uKGEpe2suY2xlYXJUaW1lb3V0KHRoaXMudHJ1bmtbYV0pO2RlbGV0ZSB0aGlzLnRydW5rW2FdfSxkO2lmKGEmJmEgaW4gdGhpcy50cnVuayliLmNhbGwodyxhKTtlbHNlIGlmKHR5cGVvZiBhPT09InVuZGVmaW5lZCIpZm9yKGQgaW4gdGhpcy50cnVuayl0aGlzLnRydW5rLmhhc093blByb3BlcnR5KGQpJiZiLmNhbGwodyxkKX19LHo9W10seT1bXSxMPSExLHQ9ITEsTT1bXSxEPWZ1bmN0aW9uKGEpe0dhbGxlcmlhLnRoZW1lPWE7ZS5lYWNoKE0sZnVuY3Rpb24oYSxkKXtkLl9pbml0aWFsaXplZHx8ZC5faW5pdC5jYWxsKGQpfSl9LGY9ZnVuY3Rpb24oKXtyZXR1cm57YXJyYXk6ZnVuY3Rpb24oYSl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsMCl9LGNyZWF0ZTpmdW5jdGlvbihhLGIpe3ZhciBkPW0uY3JlYXRlRWxlbWVudChifHwiZGl2Iik7ZC5jbGFzc05hbWU9YTtyZXR1cm4gZH0sZ2V0U2NyaXB0UGF0aDpmdW5jdGlvbihhKXthPWF8fGUoInNjcmlwdDpsYXN0IikuYXR0cigic3JjIik7CmE9YS5zcGxpdCgiLyIpO2lmKGEubGVuZ3RoPT0xKXJldHVybiIiO2EucG9wKCk7cmV0dXJuIGEuam9pbigiLyIpKyIvIn0sYW5pbWF0ZTpmdW5jdGlvbigpe3ZhciBhPWZ1bmN0aW9uKGEpe3ZhciBiPSJ0cmFuc2l0aW9uIFdlYmtpdFRyYW5zaXRpb24gTW96VHJhbnNpdGlvbiBPVHJhbnNpdGlvbiIuc3BsaXQoIiAiKSxjO2lmKGsub3BlcmEpcmV0dXJuITE7Zm9yKGM9MDtiW2NdO2MrKylpZih0eXBlb2YgYVtiW2NdXSE9PSJ1bmRlZmluZWQiKXJldHVybiBiW2NdO3JldHVybiExfSgobS5ib2R5fHxtLmRvY3VtZW50RWxlbWVudCkuc3R5bGUpLGI9e01velRyYW5zaXRpb246InRyYW5zaXRpb25lbmQiLE9UcmFuc2l0aW9uOiJvVHJhbnNpdGlvbkVuZCIsV2Via2l0VHJhbnNpdGlvbjoid2Via2l0VHJhbnNpdGlvbkVuZCIsdHJhbnNpdGlvbjoidHJhbnNpdGlvbmVuZCJ9W2FdLGQ9e19kZWZhdWx0OlswLjI1LDAuMSwwLjI1LDFdLGdhbGxlcmlhOlswLjY0NSwwLjA0NSwwLjM1NSwxXSwKZ2FsbGVyaWFJbjpbMC41NSwwLjA4NSwwLjY4LDAuNTNdLGdhbGxlcmlhT3V0OlswLjI1LDAuNDYsMC40NSwwLjk0XSxlYXNlOlswLjI1LDAsMC4yNSwxXSxsaW5lYXI6WzAuMjUsMC4yNSwwLjc1LDAuNzVdLCJlYXNlLWluIjpbMC40MiwwLDEsMV0sImVhc2Utb3V0IjpbMCwwLDAuNTgsMV0sImVhc2UtaW4tb3V0IjpbMC40MiwwLDAuNTgsMV19LGM9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXt9LGM9Y3x8InRyYW5zaXRpb24iO2UuZWFjaCgid2Via2l0IG1veiBtcyBvIi5zcGxpdCgiICIpLGZ1bmN0aW9uKCl7ZFsiLSIrdGhpcysiLSIrY109Yn0pO2EuY3NzKGQpfSxoPWZ1bmN0aW9uKGEpe2MoYSwibm9uZSIsInRyYW5zaXRpb24iKTtHYWxsZXJpYS5XRUJLSVQmJkdhbGxlcmlhLlRPVUNIJiYoYyhhLCJ0cmFuc2xhdGUzZCgwLDAsMCkiLCJ0cmFuc2Zvcm0iKSxhLmRhdGEoInJldmVydCIpJiYoYS5jc3MoYS5kYXRhKCJyZXZlcnQiKSksYS5kYXRhKCJyZXZlcnQiLG51bGwpKSl9LGosCmksZyxsLHAsbixFO3JldHVybiBmdW5jdGlvbihvLHMscil7cj1lLmV4dGVuZCh7ZHVyYXRpb246NDAwLGNvbXBsZXRlOmZ1bmN0aW9uKCl7fSxzdG9wOiExfSxyKTtvPWUobyk7ci5kdXJhdGlvbj9hPyhyLnN0b3AmJihvLnVuYmluZChiKSxoKG8pKSxqPSExLGUuZWFjaChzLGZ1bmN0aW9uKGEsYil7RT1vLmNzcyhhKTtmLnBhcnNlVmFsdWUoRSkhPWYucGFyc2VWYWx1ZShiKSYmKGo9ITApO28uY3NzKGEsRSl9KSxqPyhpPVtdLGc9ci5lYXNpbmcgaW4gZD9kW3IuZWFzaW5nXTpkLl9kZWZhdWx0LGw9IiAiK3IuZHVyYXRpb24rIm1zIGN1YmljLWJlemllcigiK2cuam9pbigiLCIpKyIpIixrLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtvLm9uZShiLGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbigpe2goYSk7ci5jb21wbGV0ZS5jYWxsKGFbMF0pfX0obykpO2lmKEdhbGxlcmlhLldFQktJVCYmR2FsbGVyaWEuVE9VQ0gmJihwPXt9LG49WzAsMCwwXSxlLmVhY2goWyJsZWZ0IiwidG9wIl0sCmZ1bmN0aW9uKGEsYil7YiBpbiBzJiYoblthXT1mLnBhcnNlVmFsdWUoc1tiXSktZi5wYXJzZVZhbHVlKG8uY3NzKGIpKSsicHgiLHBbYl09c1tiXSxkZWxldGUgc1tiXSl9KSxuWzBdfHxuWzFdKSlvLmRhdGEoInJldmVydCIscCksaS5wdXNoKCItd2Via2l0LXRyYW5zZm9ybSIrbCksYyhvLCJ0cmFuc2xhdGUzZCgiK24uam9pbigiLCIpKyIpIiwidHJhbnNmb3JtIik7ZS5lYWNoKHMsZnVuY3Rpb24oYSl7aS5wdXNoKGErbCl9KTtjKG8saS5qb2luKCIsIikpO28uY3NzKHMpfSwxKSk6ay5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5jb21wbGV0ZS5jYWxsKG9bMF0pfSxyLmR1cmF0aW9uKSk6by5hbmltYXRlKHMscik6KG8uY3NzKHMpLHIuY29tcGxldGUuY2FsbChvWzBdKSl9fSgpLHJlbW92ZUFscGhhOmZ1bmN0aW9uKGEpe2lmKHE8OSYmYSl7dmFyIGI9YS5zdHlsZSxhPShhPWEuY3VycmVudFN0eWxlKSYmYS5maWx0ZXJ8fGIuZmlsdGVyfHwiIjtpZigvYWxwaGEvLnRlc3QoYSkpYi5maWx0ZXI9CmEucmVwbGFjZSgvYWxwaGFcKFteKV0qXCkvaSwiIil9fSxmb3JjZVN0eWxlczpmdW5jdGlvbihhLGIpe2E9ZShhKTthLmF0dHIoInN0eWxlIikmJmEuZGF0YSgic3R5bGVzIixhLmF0dHIoInN0eWxlIikpLnJlbW92ZUF0dHIoInN0eWxlIik7YS5jc3MoYil9LHJldmVydFN0eWxlczpmdW5jdGlvbigpe2UuZWFjaChmLmFycmF5KGFyZ3VtZW50cyksZnVuY3Rpb24oYSxiKXtiPWUoYik7Yi5yZW1vdmVBdHRyKCJzdHlsZSIpO2IuYXR0cigic3R5bGUiLCIiKTtiLmRhdGEoInN0eWxlcyIpJiZiLmF0dHIoInN0eWxlIixiLmRhdGEoInN0eWxlcyIpKS5kYXRhKCJzdHlsZXMiLG51bGwpfSl9LG1vdmVPdXQ6ZnVuY3Rpb24oYSl7Zi5mb3JjZVN0eWxlcyhhLHtwb3NpdGlvbjoiYWJzb2x1dGUiLGxlZnQ6LTFFNH0pfSxtb3ZlSW46ZnVuY3Rpb24oKXtmLnJldmVydFN0eWxlcy5hcHBseShmLGYuYXJyYXkoYXJndW1lbnRzKSl9LGVsZW06ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZgplP3skOmEsZG9tOmFbMF19OnskOmUoYSksZG9tOmF9fSxoaWRlOmZ1bmN0aW9uKGEsYixkKXt2YXIgZD1kfHxmdW5jdGlvbigpe30sYz1mLmVsZW0oYSksZT1jLiQsYT1jLmRvbTtlLmRhdGEoIm9wYWNpdHkiKXx8ZS5kYXRhKCJvcGFjaXR5IixlLmNzcygib3BhY2l0eSIpKTtjPXtvcGFjaXR5OjB9O2I/Zi5hbmltYXRlKGEsYyx7ZHVyYXRpb246Yixjb21wbGV0ZTpxPDkmJmE/ZnVuY3Rpb24oKXtmLnJlbW92ZUFscGhhKGEpO2Euc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIjtkLmNhbGwoYSl9OmQsc3RvcDohMH0pOnE8OSYmYT8oZi5yZW1vdmVBbHBoYShhKSxhLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIpOmUuY3NzKGMpfSxzaG93OmZ1bmN0aW9uKGEsYixkKXt2YXIgZD1kfHxmdW5jdGlvbigpe30sYz1mLmVsZW0oYSksZT1jLiQsYT1jLmRvbSxqPXtvcGFjaXR5OnBhcnNlRmxvYXQoZS5kYXRhKCJvcGFjaXR5IikpfHwxfTtpZihiKXtpZihxPDkpZS5jc3MoIm9wYWNpdHkiLDApLAphLnN0eWxlLnZpc2liaWxpdHk9InZpc2libGUiO2YuYW5pbWF0ZShhLGose2R1cmF0aW9uOmIsY29tcGxldGU6cTw5JiZhP2Z1bmN0aW9uKCl7ai5vcGFjaXR5PT0xJiZmLnJlbW92ZUFscGhhKGEpO2QuY2FsbChhKX06ZCxzdG9wOiEwfSl9ZWxzZSBxPDkmJmoub3BhY2l0eT09MSYmYT8oZi5yZW1vdmVBbHBoYShhKSxhLnN0eWxlLnZpc2liaWxpdHk9InZpc2libGUiKTplLmNzcyhqKX0sb3B0aW1pemVUb3VjaDpmdW5jdGlvbigpe3ZhciBhLGIsZCxjLGY9e30saj1mdW5jdGlvbihhKXthLnByZXZlbnREZWZhdWx0KCk7Zj1lLmV4dGVuZCh7fSxhLCEwKX0saT1mdW5jdGlvbigpe3RoaXMuZXZ0PWZ9LGc9ZnVuY3Rpb24oKXt0aGlzLmhhbmRsZXIuY2FsbChhLHRoaXMuZXZ0KX07cmV0dXJuIGZ1bmN0aW9uKGwpe2UobCkuYmluZCgidG91Y2hlbmQiLGZ1bmN0aW9uKGwpe2E9bC50YXJnZXQ7Zm9yKGM9ITA7YS5wYXJlbnROb2RlJiZhIT1sLmN1cnJlbnRUYXJnZXQmJmM7KWI9ZShhKS5kYXRhKCJldmVudHMiKSwKZD1lKGEpLmRhdGEoImZha2VzIiksYiYmImNsaWNrImluIGI/KGM9ITEsbC5wcmV2ZW50RGVmYXVsdCgpLGUoYSkuY2xpY2soaikuY2xpY2soKSxiLmNsaWNrLnBvcCgpLGUuZWFjaChiLmNsaWNrLGkpLGUoYSkuZGF0YSgiZmFrZXMiLGIuY2xpY2spLGRlbGV0ZSBiLmNsaWNrKTpkJiYoYz0hMSxsLnByZXZlbnREZWZhdWx0KCksZS5lYWNoKGQsZykpLGE9YS5wYXJlbnROb2RlfSl9fSgpLGFkZFRpbWVyOmZ1bmN0aW9uKCl7dy5hZGQuYXBwbHkodyxmLmFycmF5KGFyZ3VtZW50cykpO3JldHVybiB0aGlzfSxjbGVhclRpbWVyOmZ1bmN0aW9uKCl7dy5jbGVhci5hcHBseSh3LGYuYXJyYXkoYXJndW1lbnRzKSk7cmV0dXJuIHRoaXN9LHdhaXQ6ZnVuY3Rpb24oYSl7dmFyIGE9ZS5leHRlbmQoe3VudGlsOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHN1Y2Nlc3M6ZnVuY3Rpb24oKXt9LGVycm9yOmZ1bmN0aW9uKCl7R2FsbGVyaWEucmFpc2UoIkNvdWxkIG5vdCBjb21wbGV0ZSB3YWl0IGZ1bmN0aW9uLiIpfSwKdGltZW91dDozRTN9LGEpLGI9Zi50aW1lc3RhbXAoKSxkLGMsaD1mdW5jdGlvbigpe2M9Zi50aW1lc3RhbXAoKTtkPWMtYjtpZihhLnVudGlsKGQpKXJldHVybiBhLnN1Y2Nlc3MoKSwhMTtpZihjPj1iK2EudGltZW91dClyZXR1cm4gYS5lcnJvcigpLCExO2suc2V0VGltZW91dChoLDEwKX07ay5zZXRUaW1lb3V0KGgsMTApfSx0b2dnbGVRdWFsaXR5OmZ1bmN0aW9uKGEsYil7aWYoIShxIT09NyYmcSE9PTgpJiZhKXR5cGVvZiBiPT09InVuZGVmaW5lZCImJihiPWEuc3R5bGUubXNJbnRlcnBvbGF0aW9uTW9kZT09PSJuZWFyZXN0LW5laWdoYm9yIiksYS5zdHlsZS5tc0ludGVycG9sYXRpb25Nb2RlPWI/ImJpY3ViaWMiOiJuZWFyZXN0LW5laWdoYm9yIn0saW5zZXJ0U3R5bGVUYWc6ZnVuY3Rpb24oYSl7dmFyIGI9bS5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO3YoKS5oZWFkLmFwcGVuZENoaWxkKGIpO2Iuc3R5bGVTaGVldD9iLnN0eWxlU2hlZXQuY3NzVGV4dD1hOihhPW0uY3JlYXRlVGV4dE5vZGUoYSksCmIuYXBwZW5kQ2hpbGQoYSkpfSxsb2FkU2NyaXB0OmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITEsYz1lKCI8c2NyaXB0PiIpLmF0dHIoe3NyYzphLGFzeW5jOiEwfSkuZ2V0KDApO2Mub25sb2FkPWMub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7aWYoIWQmJighdGhpcy5yZWFkeVN0YXRlfHx0aGlzLnJlYWR5U3RhdGU9PT0ibG9hZGVkInx8dGhpcy5yZWFkeVN0YXRlPT09ImNvbXBsZXRlIikpZD0hMCxjLm9ubG9hZD1jLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLHR5cGVvZiBiPT09ImZ1bmN0aW9uIiYmYi5jYWxsKHRoaXMsdGhpcyl9O3YoKS5oZWFkLmFwcGVuZENoaWxkKGMpfSxwYXJzZVZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgYT09PSJudW1iZXIiP2E6dHlwZW9mIGE9PT0ic3RyaW5nIj8oYT1hLm1hdGNoKC9cLT9cZHxcLi9nKSkmJmEuY29uc3RydWN0b3I9PT1BcnJheT9hLmpvaW4oIiIpKjE6MDowfSx0aW1lc3RhbXA6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX0sCmxvYWRDU1M6ZnVuY3Rpb24oYSxiLGQpe3ZhciBjLGg9ITEsajtlKCJsaW5rW3JlbD1zdHlsZXNoZWV0XSIpLmVhY2goZnVuY3Rpb24oKXtpZihSZWdFeHAoYSkudGVzdCh0aGlzLmhyZWYpKXJldHVybiBjPXRoaXMsITF9KTt0eXBlb2YgYj09PSJmdW5jdGlvbiImJihkPWIsYj12b2lkIDApO2Q9ZHx8ZnVuY3Rpb24oKXt9O2lmKGMpcmV0dXJuIGQuY2FsbChjLGMpLGM7aj1tLnN0eWxlU2hlZXRzLmxlbmd0aDtlKCIjIitiKS5sZW5ndGg/KGUoIiMiK2IpLmF0dHIoImhyZWYiLGEpLGotLSxoPSEwKTooYz1lKCI8bGluaz4iKS5hdHRyKHtyZWw6InN0eWxlc2hlZXQiLGhyZWY6YSxpZDpifSkuZ2V0KDApLGsuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBiPWUoJ2xpbmtbcmVsPSJzdHlsZXNoZWV0Il0sIHN0eWxlJyk7Yi5sZW5ndGg/Yi5nZXQoMCkucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYyxiWzBdKTp2KCkuaGVhZC5hcHBlbmRDaGlsZChjKTtxP2o+PTMxP0dhbGxlcmlhLnJhaXNlKCJZb3UgaGF2ZSByZWFjaGVkIHRoZSBicm93c2VyIHN0eWxlc2hlZXQgbGltaXQgKDMxKSIsCiEwKTpjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2lmKCFoJiYoIXRoaXMucmVhZHlTdGF0ZXx8dGhpcy5yZWFkeVN0YXRlPT09ImxvYWRlZCJ8fHRoaXMucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSIpKWg9ITB9Oi9maWxlOlwvXC8vaS50ZXN0KGEpP2g9ITA6ZS5hamF4KHt1cmw6YSxzdWNjZXNzOmZ1bmN0aW9uKCl7aD0hMH0sZXJyb3I6ZnVuY3Rpb24oYSl7YS5pc1JlamVjdGVkKCkmJkdhbGxlcmlhLldFQktJVCYmKGg9ITApfX0pfSwxMCkpO3R5cGVvZiBkPT09ImZ1bmN0aW9uIiYmZi53YWl0KHt1bnRpbDpmdW5jdGlvbigpe3JldHVybiBoJiZtLnN0eWxlU2hlZXRzLmxlbmd0aD5qfSxzdWNjZXNzOmZ1bmN0aW9uKCl7ay5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZC5jYWxsKGMsYyl9LDEwMCl9LGVycm9yOmZ1bmN0aW9uKCl7R2FsbGVyaWEucmFpc2UoIlRoZW1lIENTUyBjb3VsZCBub3QgbG9hZCIsITApfSx0aW1lb3V0OjFFNH0pO3JldHVybiBjfX19KCksRj1mdW5jdGlvbigpe3ZhciBhPQpmdW5jdGlvbihhLGQsYyxoKXt2YXIgaj10aGlzLmdldE9wdGlvbnMoImVhc2luZyIpLGk9dGhpcy5nZXRTdGFnZVdpZHRoKCksZz17bGVmdDppKihhLnJld2luZD8tMToxKX0sbD17bGVmdDowfTtjPyhnLm9wYWNpdHk9MCxsLm9wYWNpdHk9MSk6Zy5vcGFjaXR5PTE7ZShhLm5leHQpLmNzcyhnKTtmLmFuaW1hdGUoYS5uZXh0LGwse2R1cmF0aW9uOmEuc3BlZWQsY29tcGxldGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKCl7ZCgpO2EuY3NzKHtsZWZ0OjB9KX19KGUoYS5uZXh0KS5hZGQoYS5wcmV2KSkscXVldWU6ITEsZWFzaW5nOmp9KTtpZihoKWEucmV3aW5kPSFhLnJld2luZDtpZihhLnByZXYpe2c9e2xlZnQ6MH07bD17bGVmdDppKihhLnJld2luZD8xOi0xKX07aWYoYylnLm9wYWNpdHk9MSxsLm9wYWNpdHk9MDtlKGEucHJldikuY3NzKGcpO2YuYW5pbWF0ZShhLnByZXYsbCx7ZHVyYXRpb246YS5zcGVlZCxxdWV1ZTohMSxlYXNpbmc6aixjb21wbGV0ZTpmdW5jdGlvbigpe2UodGhpcykuY3NzKCJvcGFjaXR5IiwKMCl9fSl9fTtyZXR1cm57ZmFkZTpmdW5jdGlvbihhLGQpe2UoYS5uZXh0KS5jc3Moe29wYWNpdHk6MCxsZWZ0OjB9KS5zaG93KCk7Zi5hbmltYXRlKGEubmV4dCx7b3BhY2l0eToxfSx7ZHVyYXRpb246YS5zcGVlZCxjb21wbGV0ZTpkfSk7YS5wcmV2JiYoZShhLnByZXYpLmNzcygib3BhY2l0eSIsMSkuc2hvdygpLGYuYW5pbWF0ZShhLnByZXYse29wYWNpdHk6MH0se2R1cmF0aW9uOmEuc3BlZWR9KSl9LGZsYXNoOmZ1bmN0aW9uKGEsZCl7ZShhLm5leHQpLmNzcyh7b3BhY2l0eTowLGxlZnQ6MH0pO2EucHJldj9mLmFuaW1hdGUoYS5wcmV2LHtvcGFjaXR5OjB9LHtkdXJhdGlvbjphLnNwZWVkLzIsY29tcGxldGU6ZnVuY3Rpb24oKXtmLmFuaW1hdGUoYS5uZXh0LHtvcGFjaXR5OjF9LHtkdXJhdGlvbjphLnNwZWVkLGNvbXBsZXRlOmR9KX19KTpmLmFuaW1hdGUoYS5uZXh0LHtvcGFjaXR5OjF9LHtkdXJhdGlvbjphLnNwZWVkLGNvbXBsZXRlOmR9KX0scHVsc2U6ZnVuY3Rpb24oYSxkKXthLnByZXYmJgplKGEucHJldikuaGlkZSgpO2UoYS5uZXh0KS5jc3Moe29wYWNpdHk6MCxsZWZ0OjB9KS5zaG93KCk7Zi5hbmltYXRlKGEubmV4dCx7b3BhY2l0eToxfSx7ZHVyYXRpb246YS5zcGVlZCxjb21wbGV0ZTpkfSl9LHNsaWRlOmZ1bmN0aW9uKGIsZCl7YS5hcHBseSh0aGlzLGYuYXJyYXkoYXJndW1lbnRzKSl9LGZhZGVzbGlkZTpmdW5jdGlvbihiLGQpe2EuYXBwbHkodGhpcyxmLmFycmF5KGFyZ3VtZW50cykuY29uY2F0KFshMF0pKX0sZG9vcnNsaWRlOmZ1bmN0aW9uKGIsZCl7YS5hcHBseSh0aGlzLGYuYXJyYXkoYXJndW1lbnRzKS5jb25jYXQoWyExLCEwXSkpfX19KCk7R2FsbGVyaWE9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3RoaXMuX3RoZW1lPXZvaWQgMDt0aGlzLl9vcHRpb25zPXt9O3RoaXMuX3BsYXlpbmc9ITE7dGhpcy5fcGxheXRpbWU9NUUzO3RoaXMuX2FjdGl2ZT1udWxsO3RoaXMuX3F1ZXVlPXtsZW5ndGg6MH07dGhpcy5fZGF0YT1bXTt0aGlzLl9kb209e307dGhpcy5fdGh1bWJuYWlscz0KW107dGhpcy5fbGF5ZXJzPVtdO3RoaXMuX2ZpcnN0cnVuPXRoaXMuX2luaXRpYWxpemVkPSExO3RoaXMuX3N0YWdlSGVpZ2h0PXRoaXMuX3N0YWdlV2lkdGg9MDt0aGlzLl90YXJnZXQ9dm9pZCAwO3RoaXMuX2lkPU1hdGgucmFuZG9tKCk7ZS5lYWNoKCJjb250YWluZXIgc3RhZ2UgaW1hZ2VzIGltYWdlLW5hdiBpbWFnZS1uYXYtbGVmdCBpbWFnZS1uYXYtcmlnaHQgaW5mbyBpbmZvLXRleHQgaW5mby10aXRsZSBpbmZvLWRlc2NyaXB0aW9uIHRodW1ibmFpbHMgdGh1bWJuYWlscy1saXN0IHRodW1ibmFpbHMtY29udGFpbmVyIHRodW1iLW5hdi1sZWZ0IHRodW1iLW5hdi1yaWdodCBsb2FkZXIgY291bnRlciB0b29sdGlwIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGIsYyl7YS5fZG9tW2NdPWYuY3JlYXRlKCJnYWxsZXJpYS0iK2MpfSk7ZS5lYWNoKCJjdXJyZW50IHRvdGFsIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGIsYyl7YS5fZG9tW2NdPWYuY3JlYXRlKCJnYWxsZXJpYS0iK2MsInNwYW4iKX0pOwp2YXIgYj10aGlzLl9rZXlib2FyZD17a2V5czp7VVA6MzgsRE9XTjo0MCxMRUZUOjM3LFJJR0hUOjM5LFJFVFVSTjoxMyxFU0NBUEU6MjcsQkFDS1NQQUNFOjgsU1BBQ0U6MzJ9LG1hcDp7fSxib3VuZDohMSxwcmVzczpmdW5jdGlvbihjKXt2YXIgZD1jLmtleUNvZGV8fGMud2hpY2g7ZCBpbiBiLm1hcCYmdHlwZW9mIGIubWFwW2RdPT09ImZ1bmN0aW9uIiYmYi5tYXBbZF0uY2FsbChhLGMpfSxhdHRhY2g6ZnVuY3Rpb24oYSl7dmFyIGMsZDtmb3IoYyBpbiBhKWEuaGFzT3duUHJvcGVydHkoYykmJihkPWMudG9VcHBlckNhc2UoKSxkIGluIGIua2V5cz9iLm1hcFtiLmtleXNbZF1dPWFbY106Yi5tYXBbZF09YVtjXSk7aWYoIWIuYm91bmQpYi5ib3VuZD0hMCxHLmJpbmQoImtleWRvd24iLGIucHJlc3MpfSxkZXRhY2g6ZnVuY3Rpb24oKXtiLmJvdW5kPSExO2IubWFwPXt9O0cudW5iaW5kKCJrZXlkb3duIixiLnByZXNzKX19LGQ9dGhpcy5fY29udHJvbHM9ezA6dm9pZCAwLDE6dm9pZCAwLAphY3RpdmU6MCxzd2FwOmZ1bmN0aW9uKCl7ZC5hY3RpdmU9ZC5hY3RpdmU/MDoxfSxnZXRBY3RpdmU6ZnVuY3Rpb24oKXtyZXR1cm4gZFtkLmFjdGl2ZV19LGdldE5leHQ6ZnVuY3Rpb24oKXtyZXR1cm4gZFsxLWQuYWN0aXZlXX19LGM9dGhpcy5fY2Fyb3VzZWw9e25leHQ6YS4kKCJ0aHVtYi1uYXYtcmlnaHQiKSxwcmV2OmEuJCgidGh1bWItbmF2LWxlZnQiKSx3aWR0aDowLGN1cnJlbnQ6MCxtYXg6MCxob29rczpbXSx1cGRhdGU6ZnVuY3Rpb24oKXt2YXIgYj0wLGQ9MCxmPVswXTtlLmVhY2goYS5fdGh1bWJuYWlscyxmdW5jdGlvbihhLGMpe2MucmVhZHkmJihiKz1jLm91dGVyV2lkdGh8fGUoYy5jb250YWluZXIpLm91dGVyV2lkdGgoITApLGZbYSsxXT1iLGQ9TWF0aC5tYXgoZCxjLm91dGVySGVpZ2h0fHxlKGMuY29udGFpbmVyKS5vdXRlckhlaWdodCghMCkpKX0pO2EuJCgidGh1bWJuYWlscyIpLmNzcyh7d2lkdGg6YixoZWlnaHQ6ZH0pO2MubWF4PWI7Yy5ob29rcz1mO2Mud2lkdGg9CmEuJCgidGh1bWJuYWlscy1saXN0Iikud2lkdGgoKTtjLnNldENsYXNzZXMoKTthLiQoInRodW1ibmFpbHMtY29udGFpbmVyIikudG9nZ2xlQ2xhc3MoImdhbGxlcmlhLWNhcm91c2VsIixiPmMud2lkdGgpO2Mud2lkdGg9YS4kKCJ0aHVtYm5haWxzLWxpc3QiKS53aWR0aCgpfSxiaW5kQ29udHJvbHM6ZnVuY3Rpb24oKXt2YXIgYjtjLm5leHQuYmluZCgiY2xpY2siLGZ1bmN0aW9uKGQpe2QucHJldmVudERlZmF1bHQoKTtpZihhLl9vcHRpb25zLmNhcm91c2VsU3RlcHM9PT0iYXV0byIpZm9yKGI9Yy5jdXJyZW50O2I8Yy5ob29rcy5sZW5ndGg7YisrKXtpZihjLmhvb2tzW2JdLWMuaG9va3NbYy5jdXJyZW50XT5jLndpZHRoKXtjLnNldChiLTIpO2JyZWFrfX1lbHNlIGMuc2V0KGMuY3VycmVudCthLl9vcHRpb25zLmNhcm91c2VsU3RlcHMpfSk7Yy5wcmV2LmJpbmQoImNsaWNrIixmdW5jdGlvbihkKXtkLnByZXZlbnREZWZhdWx0KCk7aWYoYS5fb3B0aW9ucy5jYXJvdXNlbFN0ZXBzPT09CiJhdXRvIilmb3IoYj1jLmN1cnJlbnQ7Yj49MDtiLS0paWYoYy5ob29rc1tjLmN1cnJlbnRdLWMuaG9va3NbYl0+Yy53aWR0aCl7Yy5zZXQoYisyKTticmVha31lbHNle2lmKGI9PT0wKXtjLnNldCgwKTticmVha319ZWxzZSBjLnNldChjLmN1cnJlbnQtYS5fb3B0aW9ucy5jYXJvdXNlbFN0ZXBzKX0pfSxzZXQ6ZnVuY3Rpb24oYSl7Zm9yKGE9TWF0aC5tYXgoYSwwKTtjLmhvb2tzW2EtMV0rYy53aWR0aD49Yy5tYXgmJmE+PTA7KWEtLTtjLmN1cnJlbnQ9YTtjLmFuaW1hdGUoKX0sZ2V0TGFzdDpmdW5jdGlvbihhKXtyZXR1cm4oYXx8Yy5jdXJyZW50KS0xfSxmb2xsb3c6ZnVuY3Rpb24oYSl7aWYoYT09PTB8fGE9PT1jLmhvb2tzLmxlbmd0aC0yKWMuc2V0KGEpO2Vsc2V7Zm9yKHZhciBiPWMuY3VycmVudDtjLmhvb2tzW2JdLWMuaG9va3NbYy5jdXJyZW50XTxjLndpZHRoJiZiPD1jLmhvb2tzLmxlbmd0aDspYisrO2EtMTxjLmN1cnJlbnQ/Yy5zZXQoYS0xKTphKzI+YiYmYy5zZXQoYS0KYitjLmN1cnJlbnQrMil9fSxzZXRDbGFzc2VzOmZ1bmN0aW9uKCl7Yy5wcmV2LnRvZ2dsZUNsYXNzKCJkaXNhYmxlZCIsIWMuY3VycmVudCk7Yy5uZXh0LnRvZ2dsZUNsYXNzKCJkaXNhYmxlZCIsYy5ob29rc1tjLmN1cnJlbnRdK2Mud2lkdGg+PWMubWF4KX0sYW5pbWF0ZTpmdW5jdGlvbigpe2Muc2V0Q2xhc3NlcygpO3ZhciBiPWMuaG9va3NbYy5jdXJyZW50XSotMTtpc05hTihiKXx8Zi5hbmltYXRlKGEuZ2V0KCJ0aHVtYm5haWxzIikse2xlZnQ6Yn0se2R1cmF0aW9uOmEuX29wdGlvbnMuY2Fyb3VzZWxTcGVlZCxlYXNpbmc6YS5fb3B0aW9ucy5lYXNpbmcscXVldWU6ITF9KX19LGg9dGhpcy5fdG9vbHRpcD17aW5pdGlhbGl6ZWQ6ITEsb3BlbjohMSxpbml0OmZ1bmN0aW9uKCl7aC5pbml0aWFsaXplZD0hMDtmLmluc2VydFN0eWxlVGFnKCIuZ2FsbGVyaWEtdG9vbHRpcHtwYWRkaW5nOjNweCA4cHg7bWF4LXdpZHRoOjUwJTtiYWNrZ3JvdW5kOiNmZmU7Y29sb3I6IzAwMDt6LWluZGV4OjM7cG9zaXRpb246YWJzb2x1dGU7Zm9udC1zaXplOjExcHg7bGluZS1oZWlnaHQ6MS4zb3BhY2l0eTowO2JveC1zaGFkb3c6MCAwIDJweCByZ2JhKDAsMCwwLC40KTstbW96LWJveC1zaGFkb3c6MCAwIDJweCByZ2JhKDAsMCwwLC40KTstd2Via2l0LWJveC1zaGFkb3c6MCAwIDJweCByZ2JhKDAsMCwwLC40KTt9Iik7CmEuJCgidG9vbHRpcCIpLmNzcygib3BhY2l0eSIsMC44KTtmLmhpZGUoYS5nZXQoInRvb2x0aXAiKSl9LG1vdmU6ZnVuY3Rpb24oYil7dmFyIGM9YS5nZXRNb3VzZVBvc2l0aW9uKGIpLngsYj1hLmdldE1vdXNlUG9zaXRpb24oYikueSxkPWEuJCgidG9vbHRpcCIpLGU9YixmPWQub3V0ZXJIZWlnaHQoITApKzEsaD1kLm91dGVyV2lkdGgoITApLGo9ZisxNSxoPWEuJCgiY29udGFpbmVyIikud2lkdGgoKS1oLTIsZj1hLiQoImNvbnRhaW5lciIpLmhlaWdodCgpLWYtMjshaXNOYU4oYykmJiFpc05hTihlKSYmKGMrPTEwLGUtPTMwLGM9TWF0aC5tYXgoMCxNYXRoLm1pbihoLGMpKSxlPU1hdGgubWF4KDAsTWF0aC5taW4oZixlKSksYjxqJiYoZT1qKSxkLmNzcyh7bGVmdDpjLHRvcDplfSkpfSxiaW5kOmZ1bmN0aW9uKGIsYyl7aWYoIUdhbGxlcmlhLlRPVUNIKXtoLmluaXRpYWxpemVkfHxoLmluaXQoKTt2YXIgZD1mdW5jdGlvbihiLGMpe2guZGVmaW5lKGIsYyk7ZShiKS5ob3ZlcihmdW5jdGlvbigpe2YuY2xlYXJUaW1lcigic3dpdGNoX3Rvb2x0aXAiKTsKYS4kKCJjb250YWluZXIiKS51bmJpbmQoIm1vdXNlbW92ZSIsaC5tb3ZlKS5iaW5kKCJtb3VzZW1vdmUiLGgubW92ZSkudHJpZ2dlcigibW91c2Vtb3ZlIik7aC5zaG93KGIpO0dhbGxlcmlhLnV0aWxzLmFkZFRpbWVyKCJ0b29sdGlwIixmdW5jdGlvbigpe2EuJCgidG9vbHRpcCIpLnN0b3AoKS5zaG93KCkuYW5pbWF0ZSh7b3BhY2l0eToxfSk7aC5vcGVuPSEwfSxoLm9wZW4/MDo1MDApfSxmdW5jdGlvbigpe2EuJCgiY29udGFpbmVyIikudW5iaW5kKCJtb3VzZW1vdmUiLGgubW92ZSk7Zi5jbGVhclRpbWVyKCJ0b29sdGlwIik7YS4kKCJ0b29sdGlwIikuc3RvcCgpLmFuaW1hdGUoe29wYWNpdHk6MH0sMjAwLGZ1bmN0aW9uKCl7YS4kKCJ0b29sdGlwIikuaGlkZSgpO2YuYWRkVGltZXIoInN3aXRjaF90b29sdGlwIixmdW5jdGlvbigpe2gub3Blbj0hMX0sMUUzKX0pfSl9O3R5cGVvZiBjPT09InN0cmluZyI/ZChiIGluIGEuX2RvbT9hLmdldChiKTpiLGMpOmUuZWFjaChiLGZ1bmN0aW9uKGIsCmMpe2QoYS5nZXQoYiksYyl9KX19LHNob3c6ZnVuY3Rpb24oYil7dmFyIGI9ZShiIGluIGEuX2RvbT9hLmdldChiKTpiKSxjPWIuZGF0YSgidHQiKSxkPWZ1bmN0aW9uKGEpe2suc2V0VGltZW91dChmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oKXtoLm1vdmUoYSl9fShhKSwxMCk7Yi51bmJpbmQoIm1vdXNldXAiLGQpfTtpZihjPXR5cGVvZiBjPT09ImZ1bmN0aW9uIj9jKCk6YylhLiQoInRvb2x0aXAiKS5odG1sKGMucmVwbGFjZSgvXHMvLCImbmJzcDsiKSksYi5iaW5kKCJtb3VzZXVwIixkKX0sZGVmaW5lOmZ1bmN0aW9uKGIsYyl7aWYodHlwZW9mIGMhPT0iZnVuY3Rpb24iKXZhciBkPWMsYz1mdW5jdGlvbigpe3JldHVybiBkfTtiPWUoYiBpbiBhLl9kb20/YS5nZXQoYik6YikuZGF0YSgidHQiLGMpO2guc2hvdyhiKX19LGo9dGhpcy5fZnVsbHNjcmVlbj17c2Nyb2xsZWQ6MCxjcm9wOnZvaWQgMCx0cmFuc2l0aW9uOnZvaWQgMCxhY3RpdmU6ITEsa2V5bWFwOmEuX2tleWJvYXJkLm1hcCwKZW50ZXI6ZnVuY3Rpb24oYil7ai5hY3RpdmU9ITA7Zi5oaWRlKGEuZ2V0QWN0aXZlSW1hZ2UoKSk7YS4kKCJjb250YWluZXIiKS5hZGRDbGFzcygiZnVsbHNjcmVlbiIpO2ouc2Nyb2xsZWQ9dS5zY3JvbGxUb3AoKTtmLmZvcmNlU3R5bGVzKGEuZ2V0KCJjb250YWluZXIiKSx7cG9zaXRpb246ImZpeGVkIix0b3A6MCxsZWZ0OjAsd2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIsekluZGV4OjFFNH0pO3ZhciBjPXtoZWlnaHQ6IjEwMCUiLG92ZXJmbG93OiJoaWRkZW4iLG1hcmdpbjowLHBhZGRpbmc6MH0sZD1hLmdldERhdGEoKSxoPWEuX29wdGlvbnM7Zi5mb3JjZVN0eWxlcyh2KCkuaHRtbCxjKTtmLmZvcmNlU3R5bGVzKHYoKS5ib2R5LGMpO2oua2V5bWFwPWUuZXh0ZW5kKHt9LGEuX2tleWJvYXJkLm1hcCk7YS5hdHRhY2hLZXlib2FyZCh7ZXNjYXBlOmEuZXhpdEZ1bGxzY3JlZW4scmlnaHQ6YS5uZXh0LGxlZnQ6YS5wcmV2fSk7ai5jcm9wPWguaW1hZ2VDcm9wO2lmKGguZnVsbHNjcmVlbkNyb3AhPQp2b2lkIDApaC5pbWFnZUNyb3A9aC5mdWxsc2NyZWVuQ3JvcDtpZihkJiZkLmJpZyYmZC5pbWFnZSE9PWQuYmlnKXt2YXIgYz1uZXcgR2FsbGVyaWEuUGljdHVyZSxpPWMuaXNDYWNoZWQoZC5iaWcpLGc9YS5nZXRJbmRleCgpLHI9YS5fdGh1bWJuYWlsc1tnXTthLnRyaWdnZXIoe3R5cGU6R2FsbGVyaWEuTE9BRFNUQVJULGNhY2hlZDppLHJld2luZDohMSxpbmRleDpnLGltYWdlVGFyZ2V0OmEuZ2V0QWN0aXZlSW1hZ2UoKSx0aHVtYlRhcmdldDpyfSk7Yy5sb2FkKGQuYmlnLGZ1bmN0aW9uKGIpe2EuX3NjYWxlSW1hZ2UoYix7Y29tcGxldGU6ZnVuY3Rpb24oYil7YS50cmlnZ2VyKHt0eXBlOkdhbGxlcmlhLkxPQURGSU5JU0gsY2FjaGVkOmksaW5kZXg6ZyxyZXdpbmQ6ITEsaW1hZ2VUYXJnZXQ6Yi5pbWFnZSx0aHVtYlRhcmdldDpyfSk7dmFyIGM9YS5fY29udHJvbHMuZ2V0QWN0aXZlKCkuaW1hZ2U7YyYmZShjKS53aWR0aChiLmltYWdlLndpZHRoKS5oZWlnaHQoYi5pbWFnZS5oZWlnaHQpLmF0dHIoInN0eWxlIiwKZShiLmltYWdlKS5hdHRyKCJzdHlsZSIpKS5hdHRyKCJzcmMiLGIuaW1hZ2Uuc3JjKX19KX0pfWEucmVzY2FsZShmdW5jdGlvbigpe2YuYWRkVGltZXIoImZ1bGxzY3JlZW5fZW50ZXIiLGZ1bmN0aW9uKCl7Zi5zaG93KGEuZ2V0QWN0aXZlSW1hZ2UoKSk7dHlwZW9mIGI9PT0iZnVuY3Rpb24iJiZiLmNhbGwoYSl9LDEwMCk7YS50cmlnZ2VyKEdhbGxlcmlhLkZVTExTQ1JFRU5fRU5URVIpfSk7dS5yZXNpemUoZnVuY3Rpb24oKXtqLnNjYWxlKCl9KX0sc2NhbGU6ZnVuY3Rpb24oKXthLnJlc2NhbGUoKX0sZXhpdDpmdW5jdGlvbihiKXtqLmFjdGl2ZT0hMTtmLmhpZGUoYS5nZXRBY3RpdmVJbWFnZSgpKTthLiQoImNvbnRhaW5lciIpLnJlbW92ZUNsYXNzKCJmdWxsc2NyZWVuIik7Zi5yZXZlcnRTdHlsZXMoYS5nZXQoImNvbnRhaW5lciIpLHYoKS5odG1sLHYoKS5ib2R5KTtrLnNjcm9sbFRvKDAsai5zY3JvbGxlZCk7YS5kZXRhY2hLZXlib2FyZCgpO2EuYXR0YWNoS2V5Ym9hcmQoai5rZXltYXApOwphLl9vcHRpb25zLmltYWdlQ3JvcD1qLmNyb3A7dmFyIGM9YS5nZXREYXRhKCkuYmlnLGQ9YS5fY29udHJvbHMuZ2V0QWN0aXZlKCkuaW1hZ2U7YyYmYz09ZC5zcmMmJmsuc2V0VGltZW91dChmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oKXtkLnNyYz1hfX0oYS5nZXREYXRhKCkuaW1hZ2UpLDEpO2EucmVzY2FsZShmdW5jdGlvbigpe2YuYWRkVGltZXIoImZ1bGxzY3JlZW5fZXhpdCIsZnVuY3Rpb24oKXtmLnNob3coYS5nZXRBY3RpdmVJbWFnZSgpKTt0eXBlb2YgYj09PSJmdW5jdGlvbiImJmIuY2FsbChhKX0sNTApO2EudHJpZ2dlcihHYWxsZXJpYS5GVUxMU0NSRUVOX0VYSVQpfSk7dS51bmJpbmQoInJlc2l6ZSIsai5zY2FsZSl9fSxpPXRoaXMuX2lkbGU9e3RydW5rOltdLGJvdW5kOiExLGFkZDpmdW5jdGlvbihhLGIpe2lmKGEpe2kuYm91bmR8fGkuYWRkRXZlbnQoKTt2YXIgYT1lKGEpLGM9e30sZDtmb3IoZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJihjW2RdPWEuY3NzKGQpKTsKYS5kYXRhKCJpZGxlIix7ZnJvbTpjLHRvOmIsY29tcGxldGU6ITAsYnVzeTohMX0pO2kuYWRkVGltZXIoKTtpLnRydW5rLnB1c2goYSl9fSxyZW1vdmU6ZnVuY3Rpb24oYil7Yj1qUXVlcnkoYik7ZS5lYWNoKGkudHJ1bmssZnVuY3Rpb24oYyxkKXtkLmxlbmd0aCYmIWQubm90KGIpLmxlbmd0aCYmKGEuX2lkbGUuc2hvdyhiKSxhLl9pZGxlLnRydW5rLnNwbGljZShjLDEpKX0pO2kudHJ1bmsubGVuZ3RofHwoaS5yZW1vdmVFdmVudCgpLGYuY2xlYXJUaW1lcigiaWRsZSIpKX0sYWRkRXZlbnQ6ZnVuY3Rpb24oKXtpLmJvdW5kPSEwO2EuJCgiY29udGFpbmVyIikuYmluZCgibW91c2Vtb3ZlIGNsaWNrIixpLnNob3dBbGwpfSxyZW1vdmVFdmVudDpmdW5jdGlvbigpe2kuYm91bmQ9ITE7YS4kKCJjb250YWluZXIiKS51bmJpbmQoIm1vdXNlbW92ZSBjbGljayIsaS5zaG93QWxsKX0sYWRkVGltZXI6ZnVuY3Rpb24oKXtmLmFkZFRpbWVyKCJpZGxlIixmdW5jdGlvbigpe2EuX2lkbGUuaGlkZSgpfSwKYS5fb3B0aW9ucy5pZGxlVGltZSl9LGhpZGU6ZnVuY3Rpb24oKXthLl9vcHRpb25zLmlkbGVNb2RlJiYoYS50cmlnZ2VyKEdhbGxlcmlhLklETEVfRU5URVIpLGUuZWFjaChpLnRydW5rLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9Yy5kYXRhKCJpZGxlIik7aWYoZCljLmRhdGEoImlkbGUiKS5jb21wbGV0ZT0hMSxmLmFuaW1hdGUoYyxkLnRvLHtkdXJhdGlvbjphLl9vcHRpb25zLmlkbGVTcGVlZH0pfSkpfSxzaG93QWxsOmZ1bmN0aW9uKCl7Zi5jbGVhclRpbWVyKCJpZGxlIik7ZS5lYWNoKGEuX2lkbGUudHJ1bmssZnVuY3Rpb24oYixjKXthLl9pZGxlLnNob3coYyl9KX0sc2hvdzpmdW5jdGlvbihiKXt2YXIgYz1iLmRhdGEoImlkbGUiKTtpZighYy5idXN5JiYhYy5jb21wbGV0ZSljLmJ1c3k9ITAsYS50cmlnZ2VyKEdhbGxlcmlhLklETEVfRVhJVCksZi5jbGVhclRpbWVyKCJpZGxlIiksZi5hbmltYXRlKGIsYy5mcm9tLHtkdXJhdGlvbjphLl9vcHRpb25zLmlkbGVTcGVlZC8yLGNvbXBsZXRlOmZ1bmN0aW9uKCl7ZSh0aGlzKS5kYXRhKCJpZGxlIikuYnVzeT0KITE7ZSh0aGlzKS5kYXRhKCJpZGxlIikuY29tcGxldGU9ITB9fSk7aS5hZGRUaW1lcigpfX0sZz10aGlzLl9saWdodGJveD17d2lkdGg6MCxoZWlnaHQ6MCxpbml0aWFsaXplZDohMSxhY3RpdmU6bnVsbCxpbWFnZTpudWxsLGVsZW1zOnt9LGtleW1hcDohMSxpbml0OmZ1bmN0aW9uKCl7YS50cmlnZ2VyKEdhbGxlcmlhLkxJR0hUQk9YX09QRU4pO2lmKCFnLmluaXRpYWxpemVkKXtnLmluaXRpYWxpemVkPSEwO3ZhciBiPXt9LGM9YS5fb3B0aW9ucyxkPSIiLGM9e292ZXJsYXk6InBvc2l0aW9uOmZpeGVkO2Rpc3BsYXk6bm9uZTtvcGFjaXR5OiIrYy5vdmVybGF5T3BhY2l0eSsiO2ZpbHRlcjphbHBoYShvcGFjaXR5PSIrYy5vdmVybGF5T3BhY2l0eSoxMDArIik7dG9wOjA7bGVmdDowO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7YmFja2dyb3VuZDoiK2Mub3ZlcmxheUJhY2tncm91bmQrIjt6LWluZGV4Ojk5OTkwIixib3g6InBvc2l0aW9uOmZpeGVkO2Rpc3BsYXk6bm9uZTt3aWR0aDo0MDBweDtoZWlnaHQ6NDAwcHg7dG9wOjUwJTtsZWZ0OjUwJTttYXJnaW4tdG9wOi0yMDBweDttYXJnaW4tbGVmdDotMjAwcHg7ei1pbmRleDo5OTk5MSIsCnNoYWRvdzoicG9zaXRpb246YWJzb2x1dGU7YmFja2dyb3VuZDojMDAwO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7Iixjb250ZW50OiJwb3NpdGlvbjphYnNvbHV0ZTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7dG9wOjEwcHg7bGVmdDoxMHB4O3JpZ2h0OjEwcHg7Ym90dG9tOjEwcHg7b3ZlcmZsb3c6aGlkZGVuIixpbmZvOiJwb3NpdGlvbjphYnNvbHV0ZTtib3R0b206MTBweDtsZWZ0OjEwcHg7cmlnaHQ6MTBweDtjb2xvcjojNDQ0O2ZvbnQ6MTFweC8xM3B4IGFyaWFsLHNhbnMtc2VyaWY7aGVpZ2h0OjEzcHgiLGNsb3NlOiJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTBweDtyaWdodDoxMHB4O2hlaWdodDoyMHB4O3dpZHRoOjIwcHg7YmFja2dyb3VuZDojZmZmO3RleHQtYWxpZ246Y2VudGVyO2N1cnNvcjpwb2ludGVyO2NvbG9yOiM0NDQ7Zm9udDoxNnB4LzIycHggYXJpYWwsc2Fucy1zZXJpZjt6LWluZGV4Ojk5OTk5IixpbWFnZToicG9zaXRpb246YWJzb2x1dGU7dG9wOjEwcHg7bGVmdDoxMHB4O3JpZ2h0OjEwcHg7Ym90dG9tOjMwcHg7b3ZlcmZsb3c6aGlkZGVuO2Rpc3BsYXk6YmxvY2s7IiwKcHJldmhvbGRlcjoicG9zaXRpb246YWJzb2x1dGU7d2lkdGg6NTAlO3RvcDowO2JvdHRvbTo0MHB4O2N1cnNvcjpwb2ludGVyOyIsbmV4dGhvbGRlcjoicG9zaXRpb246YWJzb2x1dGU7d2lkdGg6NTAlO3RvcDowO2JvdHRvbTo0MHB4O3JpZ2h0Oi0xcHg7Y3Vyc29yOnBvaW50ZXI7IixwcmV2OiJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTAlO21hcmdpbi10b3A6LTIwcHg7aGVpZ2h0OjQwcHg7d2lkdGg6MzBweDtiYWNrZ3JvdW5kOiNmZmY7bGVmdDoyMHB4O2Rpc3BsYXk6bm9uZTt0ZXh0LWFsaWduOmNlbnRlcjtjb2xvcjojMDAwO2ZvbnQ6Ym9sZCAxNnB4LzM2cHggYXJpYWwsc2Fucy1zZXJpZiIsbmV4dDoicG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTttYXJnaW4tdG9wOi0yMHB4O2hlaWdodDo0MHB4O3dpZHRoOjMwcHg7YmFja2dyb3VuZDojZmZmO3JpZ2h0OjIwcHg7bGVmdDphdXRvO2Rpc3BsYXk6bm9uZTtmb250OmJvbGQgMTZweC8zNnB4IGFyaWFsLHNhbnMtc2VyaWY7dGV4dC1hbGlnbjpjZW50ZXI7Y29sb3I6IzAwMCIsCnRpdGxlOiJmbG9hdDpsZWZ0Iixjb3VudGVyOiJmbG9hdDpyaWdodDttYXJnaW4tbGVmdDo4cHg7In0saD17fTtxPT09OCYmKGMubmV4dGhvbGRlcis9ImJhY2tncm91bmQ6IzAwMDtmaWx0ZXI6YWxwaGEob3BhY2l0eT0wKTsiLGMucHJldmhvbGRlcis9ImJhY2tncm91bmQ6IzAwMDtmaWx0ZXI6YWxwaGEob3BhY2l0eT0wKTsiKTtlLmVhY2goYyxmdW5jdGlvbihhLGIpe2QrPSIuZ2FsbGVyaWEtbGlnaHRib3gtIithKyJ7IitiKyJ9In0pO2YuaW5zZXJ0U3R5bGVUYWcoZCk7ZS5lYWNoKCJvdmVybGF5IGJveCBjb250ZW50IHNoYWRvdyB0aXRsZSBpbmZvIGNsb3NlIHByZXZob2xkZXIgcHJldiBuZXh0aG9sZGVyIG5leHQgY291bnRlciBpbWFnZSIuc3BsaXQoIiAiKSxmdW5jdGlvbihjLGQpe2EuYWRkRWxlbWVudCgibGlnaHRib3gtIitkKTtiW2RdPWcuZWxlbXNbZF09YS5nZXQoImxpZ2h0Ym94LSIrZCl9KTtnLmltYWdlPW5ldyBHYWxsZXJpYS5QaWN0dXJlO2UuZWFjaCh7Ym94OiJzaGFkb3cgY29udGVudCBjbG9zZSBwcmV2aG9sZGVyIG5leHRob2xkZXIiLAppbmZvOiJ0aXRsZSBjb3VudGVyIixjb250ZW50OiJpbmZvIGltYWdlIixwcmV2aG9sZGVyOiJwcmV2IixuZXh0aG9sZGVyOiJuZXh0In0sZnVuY3Rpb24oYSxiKXt2YXIgYz1bXTtlLmVhY2goYi5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7Yy5wdXNoKCJsaWdodGJveC0iK2IpfSk7aFsibGlnaHRib3gtIithXT1jfSk7YS5hcHBlbmQoaCk7ZShiLmltYWdlKS5hcHBlbmQoZy5pbWFnZS5jb250YWluZXIpO2UodigpLmJvZHkpLmFwcGVuZChiLm92ZXJsYXksYi5ib3gpO2Yub3B0aW1pemVUb3VjaChiLmJveCk7KGZ1bmN0aW9uKGEpe3JldHVybiBhLmhvdmVyKGZ1bmN0aW9uKCl7ZSh0aGlzKS5jc3MoImNvbG9yIiwiI2JiYiIpfSxmdW5jdGlvbigpe2UodGhpcykuY3NzKCJjb2xvciIsIiM0NDQiKX0pfSkoZShiLmNsb3NlKS5iaW5kKCJjbGljayIsZy5oaWRlKS5odG1sKCImIzIxNTsiKSk7ZS5lYWNoKFsiUHJldiIsIk5leHQiXSxmdW5jdGlvbihhLGMpe3ZhciBkPWUoYltjLnRvTG93ZXJDYXNlKCldKS5odG1sKC92Ly50ZXN0KGMpPwoiJiM4MjQ5OyZuYnNwOyI6IiZuYnNwOyYjODI1MDsiKSxmPWUoYltjLnRvTG93ZXJDYXNlKCkrImhvbGRlciJdKTtmLmJpbmQoImNsaWNrIixmdW5jdGlvbigpe2dbInNob3ciK2NdKCl9KTtxPDh8fEdhbGxlcmlhLlRPVUNIP2Quc2hvdygpOmYuaG92ZXIoZnVuY3Rpb24oKXtkLnNob3coKX0sZnVuY3Rpb24oKXtkLnN0b3AoKS5mYWRlT3V0KDIwMCl9KX0pO2UoYi5vdmVybGF5KS5iaW5kKCJjbGljayIsZy5oaWRlKTtpZihHYWxsZXJpYS5JUEFEKWEuX29wdGlvbnMubGlnaHRib3hUcmFuc2l0aW9uU3BlZWQ9MH19LHJlc2NhbGU6ZnVuY3Rpb24oYil7dmFyIGM9TWF0aC5taW4odS53aWR0aCgpLTQwLGcud2lkdGgpLGQ9TWF0aC5taW4odS5oZWlnaHQoKS02MCxnLmhlaWdodCksZD1NYXRoLm1pbihjL2cud2lkdGgsZC9nLmhlaWdodCksYz1NYXRoLnJvdW5kKGcud2lkdGgqZCkrNDAsZD1NYXRoLnJvdW5kKGcuaGVpZ2h0KmQpKzYwLGM9e3dpZHRoOmMsaGVpZ2h0OmQsIm1hcmdpbi10b3AiOk1hdGguY2VpbChkLwoyKSotMSwibWFyZ2luLWxlZnQiOk1hdGguY2VpbChjLzIpKi0xfTtiP2UoZy5lbGVtcy5ib3gpLmNzcyhjKTplKGcuZWxlbXMuYm94KS5hbmltYXRlKGMse2R1cmF0aW9uOmEuX29wdGlvbnMubGlnaHRib3hUcmFuc2l0aW9uU3BlZWQsZWFzaW5nOmEuX29wdGlvbnMuZWFzaW5nLGNvbXBsZXRlOmZ1bmN0aW9uKCl7dmFyIGI9Zy5pbWFnZSxjPWEuX29wdGlvbnMubGlnaHRib3hGYWRlU3BlZWQ7YS50cmlnZ2VyKHt0eXBlOkdhbGxlcmlhLkxJR0hUQk9YX0lNQUdFLGltYWdlVGFyZ2V0OmIuaW1hZ2V9KTtlKGIuY29udGFpbmVyKS5zaG93KCk7Zi5zaG93KGIuaW1hZ2UsYyk7Zi5zaG93KGcuZWxlbXMuaW5mbyxjKX19KX0saGlkZTpmdW5jdGlvbigpe2cuaW1hZ2UuaW1hZ2U9bnVsbDt1LnVuYmluZCgicmVzaXplIixnLnJlc2NhbGUpO2UoZy5lbGVtcy5ib3gpLmhpZGUoKTtmLmhpZGUoZy5lbGVtcy5pbmZvKTthLmRldGFjaEtleWJvYXJkKCk7YS5hdHRhY2hLZXlib2FyZChnLmtleW1hcCk7Cmcua2V5bWFwPSExO2YuaGlkZShnLmVsZW1zLm92ZXJsYXksMjAwLGZ1bmN0aW9uKCl7ZSh0aGlzKS5oaWRlKCkuY3NzKCJvcGFjaXR5IixhLl9vcHRpb25zLm92ZXJsYXlPcGFjaXR5KTthLnRyaWdnZXIoR2FsbGVyaWEuTElHSFRCT1hfQ0xPU0UpfSl9LHNob3dOZXh0OmZ1bmN0aW9uKCl7Zy5zaG93KGEuZ2V0TmV4dChnLmFjdGl2ZSkpfSxzaG93UHJldjpmdW5jdGlvbigpe2cuc2hvdyhhLmdldFByZXYoZy5hY3RpdmUpKX0sc2hvdzpmdW5jdGlvbihiKXtnLmFjdGl2ZT1iPXR5cGVvZiBiPT09Im51bWJlciI/YjphLmdldEluZGV4KCk7Zy5pbml0aWFsaXplZHx8Zy5pbml0KCk7aWYoIWcua2V5bWFwKWcua2V5bWFwPWUuZXh0ZW5kKHt9LGEuX2tleWJvYXJkLm1hcCksYS5hdHRhY2hLZXlib2FyZCh7ZXNjYXBlOmcuaGlkZSxyaWdodDpnLnNob3dOZXh0LGxlZnQ6Zy5zaG93UHJldn0pO3UudW5iaW5kKCJyZXNpemUiLGcucmVzY2FsZSk7dmFyIGM9YS5nZXREYXRhKGIpLGQ9YS5nZXREYXRhTGVuZ3RoKCksCmg9YS5nZXROZXh0KGIpLGosaSxyO2YuaGlkZShnLmVsZW1zLmluZm8pO3RyeXtmb3Iocj1hLl9vcHRpb25zLnByZWxvYWQ7cj4wO3ItLSlpPW5ldyBHYWxsZXJpYS5QaWN0dXJlLGo9YS5nZXREYXRhKGgpLGkucHJlbG9hZCgiYmlnImluIGo/ai5iaWc6ai5pbWFnZSksaD1hLmdldE5leHQoaCl9Y2F0Y2goayl7fWcuaW1hZ2UubG9hZChjLmJpZ3x8Yy5pbWFnZSxmdW5jdGlvbihhKXtnLndpZHRoPWEub3JpZ2luYWwud2lkdGg7Zy5oZWlnaHQ9YS5vcmlnaW5hbC5oZWlnaHQ7ZShhLmltYWdlKS5jc3Moe3dpZHRoOiIxMDAuNSUiLGhlaWdodDoiMTAwLjUlIix0b3A6MCx6SW5kZXg6OTk5OTh9KTtmLmhpZGUoYS5pbWFnZSk7Zy5lbGVtcy50aXRsZS5pbm5lckhUTUw9Yy50aXRsZXx8IiI7Zy5lbGVtcy5jb3VudGVyLmlubmVySFRNTD1iKzErIiAvICIrZDt1LnJlc2l6ZShnLnJlc2NhbGUpO2cucmVzY2FsZSgpfSk7ZShnLmVsZW1zLm92ZXJsYXkpLnNob3coKTtlKGcuZWxlbXMuYm94KS5zaG93KCl9fTsKcmV0dXJuIHRoaXN9O0dhbGxlcmlhLnByb3RvdHlwZT17Y29uc3RydWN0b3I6R2FsbGVyaWEsaW5pdDpmdW5jdGlvbihhLGIpe2I9SyhiKTt0aGlzLl9vcmlnaW5hbD17dGFyZ2V0OmEsb3B0aW9uczpiLGRhdGE6bnVsbH07dGhpcy5fdGFyZ2V0PXRoaXMuX2RvbS50YXJnZXQ9YS5ub2RlTmFtZT9hOmUoYSkuZ2V0KDApO3kucHVzaCh0aGlzKTtpZih0aGlzLl90YXJnZXQpe3RoaXMuX29wdGlvbnM9e2F1dG9wbGF5OiExLGNhcm91c2VsOiEwLGNhcm91c2VsRm9sbG93OiEwLGNhcm91c2VsU3BlZWQ6NDAwLGNhcm91c2VsU3RlcHM6ImF1dG8iLGNsaWNrbmV4dDohMSxkYXRhQ29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue319LGRhdGFTZWxlY3RvcjoiaW1nIixkYXRhU291cmNlOnRoaXMuX3RhcmdldCxkZWJ1Zzp2b2lkIDAsZHVtbXk6dm9pZCAwLGVhc2luZzoiZ2FsbGVyaWEiLGV4dGVuZDpmdW5jdGlvbigpe30sZnVsbHNjcmVlbkNyb3A6dm9pZCAwLGZ1bGxzY3JlZW5Eb3VibGVUYXA6ITAsCmZ1bGxzY3JlZW5UcmFuc2l0aW9uOnZvaWQgMCxoZWlnaHQ6ImF1dG8iLGlkbGVNb2RlOiEwLGlkbGVUaW1lOjNFMyxpZGxlU3BlZWQ6MjAwLGltYWdlQ3JvcDohMSxpbWFnZU1hcmdpbjowLGltYWdlUGFuOiExLGltYWdlUGFuU21vb3RobmVzczoxMixpbWFnZVBvc2l0aW9uOiI1MCUiLGltYWdlVGltZW91dDp2b2lkIDAsaW5pdGlhbFRyYW5zaXRpb246dm9pZCAwLGtlZXBTb3VyY2U6ITEsbGF5ZXJGb2xsb3c6ITAsbGlnaHRib3g6ITEsbGlnaHRib3hGYWRlU3BlZWQ6MjAwLGxpZ2h0Ym94VHJhbnNpdGlvblNwZWVkOjIwMCxsaW5rU291cmNlSW1hZ2VzOiEwLG1heFNjYWxlUmF0aW86dm9pZCAwLG1pblNjYWxlUmF0aW86dm9pZCAwLG92ZXJsYXlPcGFjaXR5OjAuODUsb3ZlcmxheUJhY2tncm91bmQ6IiMwYjBiMGIiLHBhdXNlT25JbnRlcmFjdGlvbjohMCxwb3B1cExpbmtzOiExLHByZWxvYWQ6MixxdWV1ZTohMCxzaG93OjAsc2hvd0luZm86ITAsc2hvd0NvdW50ZXI6ITAsc2hvd0ltYWdlbmF2OiEwLApzd2lwZTohMCx0aHVtYkNyb3A6ITAsdGh1bWJFdmVudFR5cGU6ImNsaWNrIix0aHVtYkZpdDohMCx0aHVtYk1hcmdpbjowLHRodW1iUXVhbGl0eToiYXV0byIsdGh1bWJuYWlsczohMCx0b3VjaFRyYW5zaXRpb246dm9pZCAwLHRyYW5zaXRpb246ImZhZGUiLHRyYW5zaXRpb25Jbml0aWFsOnZvaWQgMCx0cmFuc2l0aW9uU3BlZWQ6NDAwLHVzZUNhbnZhczohMSx3aWR0aDoiYXV0byJ9O3RoaXMuX29wdGlvbnMuaW5pdGlhbFRyYW5zaXRpb249dGhpcy5fb3B0aW9ucy5pbml0aWFsVHJhbnNpdGlvbnx8dGhpcy5fb3B0aW9ucy50cmFuc2l0aW9uSW5pdGlhbDtiJiZiLmRlYnVnPT09ITEmJihIPSExKTtpZihiJiZ0eXBlb2YgYi5pbWFnZVRpbWVvdXQ9PT0ibnVtYmVyIilBPWIuaW1hZ2VUaW1lb3V0O2lmKGImJnR5cGVvZiBiLmR1bW15PT09InN0cmluZyIpQj1iLmR1bW15O2UodGhpcy5fdGFyZ2V0KS5jaGlsZHJlbigpLmhpZGUoKTt0eXBlb2YgR2FsbGVyaWEudGhlbWU9PT0ib2JqZWN0Ij8KdGhpcy5faW5pdCgpOk0ucHVzaCh0aGlzKTtyZXR1cm4gdGhpc31lbHNlIEdhbGxlcmlhLnJhaXNlKCJUYXJnZXQgbm90IGZvdW5kLiIsITApfSxfaW5pdDpmdW5jdGlvbigpe3ZhciBhPXRoaXMsYj10aGlzLl9vcHRpb25zO2lmKHRoaXMuX2luaXRpYWxpemVkKXJldHVybiBHYWxsZXJpYS5yYWlzZSgiSW5pdCBmYWlsZWQ6IEdhbGxlcnkgaW5zdGFuY2UgYWxyZWFkeSBpbml0aWFsaXplZC4iKSx0aGlzO3RoaXMuX2luaXRpYWxpemVkPSEwO2lmKCFHYWxsZXJpYS50aGVtZSlyZXR1cm4gR2FsbGVyaWEucmFpc2UoIkluaXQgZmFpbGVkOiBObyB0aGVtZSBmb3VuZC4iKSx0aGlzO2UuZXh0ZW5kKCEwLGIsR2FsbGVyaWEudGhlbWUuZGVmYXVsdHMsdGhpcy5fb3JpZ2luYWwub3B0aW9ucyk7KGZ1bmN0aW9uKGEpeyJnZXRDb250ZXh0ImluIGEmJih0PXR8fHtlbGVtOmEsY29udGV4dDphLmdldENvbnRleHQoIjJkIiksY2FjaGU6e30sbGVuZ3RoOjB9KX0pKG0uY3JlYXRlRWxlbWVudCgiY2FudmFzIikpOwp0aGlzLmJpbmQoR2FsbGVyaWEuREFUQSxmdW5jdGlvbigpe0dhbGxlcmlhLlFVSVJLJiZHYWxsZXJpYS5yYWlzZSgiWW91ciBwYWdlIGlzIGluIFF1aXJrcyBtb2RlLCBHYWxsZXJpYSBtYXkgbm90IHJlbmRlciBjb3JyZWN0bHkuIFBsZWFzZSB2YWxpZGF0ZSB5b3VyIEhUTUwuIik7dGhpcy5fb3JpZ2luYWwuZGF0YT10aGlzLl9kYXRhO3RoaXMuZ2V0KCJ0b3RhbCIpLmlubmVySFRNTD10aGlzLmdldERhdGFMZW5ndGgoKTt2YXIgYz10aGlzLiQoImNvbnRhaW5lciIpLGQ9e3dpZHRoOjAsaGVpZ2h0OjB9LGk9ZnVuY3Rpb24oKXtyZXR1cm4gYS4kKCJzdGFnZSIpLmhlaWdodCgpfTtmLndhaXQoe3VudGlsOmZ1bmN0aW9uKCl7ZS5lYWNoKFsid2lkdGgiLCJoZWlnaHQiXSxmdW5jdGlvbihlLGkpe2RbaV09YltpXSYmdHlwZW9mIGJbaV09PT0ibnVtYmVyIj9iW2ldOk1hdGgubWF4KGYucGFyc2VWYWx1ZShjLmNzcyhpKSksZi5wYXJzZVZhbHVlKGEuJCgidGFyZ2V0IikuY3NzKGkpKSwKY1tpXSgpLGEuJCgidGFyZ2V0IilbaV0oKSk7Y1tpXShkW2ldKX0pO3JldHVybiBpKCkmJmQud2lkdGgmJmQuaGVpZ2h0PjEwfSxzdWNjZXNzOmZ1bmN0aW9uKCl7R2FsbGVyaWEuV0VCS0lUP2suc2V0VGltZW91dChmdW5jdGlvbigpe2EuX3J1bigpfSwxKTphLl9ydW4oKX0sZXJyb3I6ZnVuY3Rpb24oKXtpKCk/R2FsbGVyaWEucmFpc2UoIkNvdWxkIG5vdCBleHRyYWN0IHN1ZmZpY2llbnQgd2lkdGgvaGVpZ2h0IG9mIHRoZSBnYWxsZXJ5IGNvbnRhaW5lci4gVHJhY2VkIG1lYXN1cmVzOiB3aWR0aDoiK2Qud2lkdGgrInB4LCBoZWlnaHQ6ICIrZC5oZWlnaHQrInB4LiIsITApOkdhbGxlcmlhLnJhaXNlKCJDb3VsZCBub3QgZXh0cmFjdCBhIHN0YWdlIGhlaWdodCBmcm9tIHRoZSBDU1MuIFRyYWNlZCBoZWlnaHQ6ICIraSgpKyJweC4iLCEwKX0sdGltZW91dDoxRTR9KX0pO3RoaXMuYXBwZW5kKHsiaW5mby10ZXh0IjpbImluZm8tdGl0bGUiLCJpbmZvLWRlc2NyaXB0aW9uIl0saW5mbzpbImluZm8tdGV4dCJdLAoiaW1hZ2UtbmF2IjpbImltYWdlLW5hdi1yaWdodCIsImltYWdlLW5hdi1sZWZ0Il0sc3RhZ2U6WyJpbWFnZXMiLCJsb2FkZXIiLCJjb3VudGVyIiwiaW1hZ2UtbmF2Il0sInRodW1ibmFpbHMtbGlzdCI6WyJ0aHVtYm5haWxzIl0sInRodW1ibmFpbHMtY29udGFpbmVyIjpbInRodW1iLW5hdi1sZWZ0IiwidGh1bWJuYWlscy1saXN0IiwidGh1bWItbmF2LXJpZ2h0Il0sY29udGFpbmVyOlsic3RhZ2UiLCJ0aHVtYm5haWxzLWNvbnRhaW5lciIsImluZm8iLCJ0b29sdGlwIl19KTtmLmhpZGUodGhpcy4kKCJjb3VudGVyIikuYXBwZW5kKHRoaXMuZ2V0KCJjdXJyZW50IiksbS5jcmVhdGVUZXh0Tm9kZSgiIC8gIiksdGhpcy5nZXQoInRvdGFsIikpKTt0aGlzLnNldENvdW50ZXIoIiYjODIxMTsiKTtmLmhpZGUoYS5nZXQoInRvb2x0aXAiKSk7dGhpcy4kKCJjb250YWluZXIiKS5hZGRDbGFzcyhHYWxsZXJpYS5UT1VDSD8idG91Y2giOiJub3RvdWNoIik7ZS5lYWNoKEFycmF5KDIpLGZ1bmN0aW9uKGIpe3ZhciBjPQpuZXcgR2FsbGVyaWEuUGljdHVyZTtlKGMuY29udGFpbmVyKS5jc3Moe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOjAsbGVmdDowfSkucHJlcGVuZChhLl9sYXllcnNbYl09ZShmLmNyZWF0ZSgiZ2FsbGVyaWEtbGF5ZXIiKSkuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDowLGxlZnQ6MCxyaWdodDowLGJvdHRvbTowLHpJbmRleDoyfSlbMF0pO2EuJCgiaW1hZ2VzIikuYXBwZW5kKGMuY29udGFpbmVyKTthLl9jb250cm9sc1tiXT1jfSk7dGhpcy4kKCJpbWFnZXMiKS5jc3Moe3Bvc2l0aW9uOiJyZWxhdGl2ZSIsdG9wOjAsbGVmdDowLHdpZHRoOiIxMDAlIixoZWlnaHQ6IjEwMCUifSk7dGhpcy4kKCJ0aHVtYm5haWxzLCB0aHVtYm5haWxzLWxpc3QiKS5jc3Moe292ZXJmbG93OiJoaWRkZW4iLHBvc2l0aW9uOiJyZWxhdGl2ZSJ9KTt0aGlzLiQoImltYWdlLW5hdi1yaWdodCwgaW1hZ2UtbmF2LWxlZnQiKS5iaW5kKCJjbGljayIsZnVuY3Rpb24oYyl7Yi5jbGlja25leHQmJmMuc3RvcFByb3BhZ2F0aW9uKCk7CmIucGF1c2VPbkludGVyYWN0aW9uJiZhLnBhdXNlKCk7Yz0vcmlnaHQvLnRlc3QodGhpcy5jbGFzc05hbWUpPyJuZXh0IjoicHJldiI7YVtjXSgpfSk7ZS5lYWNoKFsiaW5mbyIsImNvdW50ZXIiLCJpbWFnZS1uYXYiXSxmdW5jdGlvbihjLGQpe2JbInNob3ciK2Quc3Vic3RyKDAsMSkudG9VcHBlckNhc2UoKStkLnN1YnN0cigxKS5yZXBsYWNlKC8tLywiIildPT09ITEmJmYubW92ZU91dChhLmdldChkLnRvTG93ZXJDYXNlKCkpKX0pO3RoaXMubG9hZCgpO2lmKCFiLmtlZXBTb3VyY2UmJiFxKXRoaXMuX3RhcmdldC5pbm5lckhUTUw9IiI7dGhpcy5nZXQoImVycm9ycyIpJiZ0aGlzLmFwcGVuZENoaWxkKCJ0YXJnZXQiLCJlcnJvcnMiKTt0aGlzLmFwcGVuZENoaWxkKCJ0YXJnZXQiLCJjb250YWluZXIiKTtpZihiLmNhcm91c2VsKXt2YXIgZD0wLGM9Yi5zaG93O3RoaXMuYmluZChHYWxsZXJpYS5USFVNQk5BSUwsZnVuY3Rpb24oKXt0aGlzLnVwZGF0ZUNhcm91c2VsKCk7KytkPT10aGlzLmdldERhdGFMZW5ndGgoKSYmCnR5cGVvZiBjPT0ibnVtYmVyIiYmYz4wJiZ0aGlzLl9jYXJvdXNlbC5mb2xsb3coYyl9KX1iLnN3aXBlJiYoZnVuY3Rpb24oYil7dmFyIGM9WzAsMF0sZD1bMCwwXSxlPSExLGw9MCxwLG49e3N0YXJ0OiJ0b3VjaHN0YXJ0Iixtb3ZlOiJ0b3VjaG1vdmUiLHN0b3A6InRvdWNoZW5kIn0saz1mdW5jdGlvbihhKXthLm9yaWdpbmFsRXZlbnQudG91Y2hlcyYmYS5vcmlnaW5hbEV2ZW50LnRvdWNoZXMubGVuZ3RoPjF8fChwPWEub3JpZ2luYWxFdmVudC50b3VjaGVzP2Eub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdOmEsZD1bcC5wYWdlWCxwLnBhZ2VZXSxjWzBdfHwoYz1kKSxNYXRoLmFicyhjWzBdLWRbMF0pPjEwJiZhLnByZXZlbnREZWZhdWx0KCkpfSxvPWZ1bmN0aW9uKHMpe2IudW5iaW5kKG4ubW92ZSxrKTtzLm9yaWdpbmFsRXZlbnQudG91Y2hlcyYmcy5vcmlnaW5hbEV2ZW50LnRvdWNoZXMubGVuZ3RofHxlP2U9IWU6KGYudGltZXN0YW1wKCktbDwxRTMmJk1hdGguYWJzKGNbMF0tZFswXSk+CjMwJiZNYXRoLmFicyhjWzFdLWRbMV0pPDEwMCYmKHMucHJldmVudERlZmF1bHQoKSxhW2NbMF0+ZFswXT8ibmV4dCI6InByZXYiXSgpKSxjPWQ9WzAsMF0pfTtiLmJpbmQobi5zdGFydCxmdW5jdGlvbihhKXthLm9yaWdpbmFsRXZlbnQudG91Y2hlcyYmYS5vcmlnaW5hbEV2ZW50LnRvdWNoZXMubGVuZ3RoPjF8fChwPWEub3JpZ2luYWxFdmVudC50b3VjaGVzP2Eub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdOmEsbD1mLnRpbWVzdGFtcCgpLGM9ZD1bcC5wYWdlWCxwLnBhZ2VZXSxiLmJpbmQobi5tb3ZlLGspLm9uZShuLnN0b3AsbykpfSl9KGEuJCgiaW1hZ2VzIikpLGIuZnVsbHNjcmVlbkRvdWJsZVRhcCYmdGhpcy4kKCJzdGFnZSIpLmJpbmQoInRvdWNoc3RhcnQiLGZ1bmN0aW9uKCl7dmFyIGIsYyxkLGUsZixwO3JldHVybiBmdW5jdGlvbihuKXtwPUdhbGxlcmlhLnV0aWxzLnRpbWVzdGFtcCgpO2M9KG4ub3JpZ2luYWxFdmVudC50b3VjaGVzP24ub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdOgpuKS5wYWdlWDtkPShuLm9yaWdpbmFsRXZlbnQudG91Y2hlcz9uLm9yaWdpbmFsRXZlbnQudG91Y2hlc1swXTpuKS5wYWdlWTtwLWI8NTAwJiZjLWU8MjAmJmQtZjwyMD8oYS50b2dnbGVGdWxsc2NyZWVuKCksbi5wcmV2ZW50RGVmYXVsdCgpLGEuJCgic3RhZ2UiKS51bmJpbmQoInRvdWNoZW5kIixhcmd1bWVudHMuY2FsbGVlKSk6KGI9cCxlPWMsZj1kKX19KCkpKTtmLm9wdGltaXplVG91Y2godGhpcy5nZXQoImNvbnRhaW5lciIpKTtyZXR1cm4gdGhpc30sX2NyZWF0ZVRodW1ibmFpbHM6ZnVuY3Rpb24oKXt0aGlzLmdldCgidG90YWwiKS5pbm5lckhUTUw9dGhpcy5nZXREYXRhTGVuZ3RoKCk7dmFyIGEsYixkLGMsaCxqPXRoaXMsaT10aGlzLl9vcHRpb25zLGc9ZnVuY3Rpb24oKXt2YXIgYT1qLiQoInRodW1ibmFpbHMiKS5maW5kKCIuYWN0aXZlIik7cmV0dXJuIWEubGVuZ3RoPyExOmEuZmluZCgiaW1nIikuYXR0cigic3JjIil9KCksbD10eXBlb2YgaS50aHVtYm5haWxzPT09InN0cmluZyI/CmkudGh1bWJuYWlscy50b0xvd2VyQ2FzZSgpOm51bGwscD1mdW5jdGlvbihhKXtyZXR1cm4gbS5kZWZhdWx0VmlldyYmbS5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlP20uZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShkLmNvbnRhaW5lcixudWxsKVthXTpoLmNzcyhhKX0sbj1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGZ1bmN0aW9uKCl7ZShjKS5hcHBlbmQoYSk7ai50cmlnZ2VyKHt0eXBlOkdhbGxlcmlhLlRIVU1CTkFJTCx0aHVtYlRhcmdldDphLGluZGV4OmJ9KX19LHE9ZnVuY3Rpb24oYSl7aS5wYXVzZU9uSW50ZXJhY3Rpb24mJmoucGF1c2UoKTt2YXIgYj1lKGEuY3VycmVudFRhcmdldCkuZGF0YSgiaW5kZXgiKTtqLmdldEluZGV4KCkhPT1iJiZqLnNob3coYik7YS5wcmV2ZW50RGVmYXVsdCgpfSxvPWZ1bmN0aW9uKGEpe2Euc2NhbGUoe3dpZHRoOmEuZGF0YS53aWR0aCxoZWlnaHQ6YS5kYXRhLmhlaWdodCxjcm9wOmkudGh1bWJDcm9wLG1hcmdpbjppLnRodW1iTWFyZ2luLApjYW52YXM6aS51c2VDYW52YXMsY29tcGxldGU6ZnVuY3Rpb24oYSl7dmFyIGI9WyJsZWZ0IiwidG9wIl0sYyxkO2UuZWFjaChbIldpZHRoIiwiSGVpZ2h0Il0sZnVuY3Rpb24oZixoKXtjPWgudG9Mb3dlckNhc2UoKTtpZigoaS50aHVtYkNyb3AhPT0hMHx8aS50aHVtYkNyb3A9PT1jKSYmaS50aHVtYkZpdClkPXt9LGRbY109YVtjXSxlKGEuY29udGFpbmVyKS5jc3MoZCksZD17fSxkW2JbZl1dPTAsZShhLmltYWdlKS5jc3MoZCk7YVsib3V0ZXIiK2hdPWUoYS5jb250YWluZXIpWyJvdXRlciIraF0oITApfSk7Zi50b2dnbGVRdWFsaXR5KGEuaW1hZ2UsaS50aHVtYlF1YWxpdHk9PT0hMHx8aS50aHVtYlF1YWxpdHk9PT0iYXV0byImJmEub3JpZ2luYWwud2lkdGg8YS53aWR0aCozKTtqLnRyaWdnZXIoe3R5cGU6R2FsbGVyaWEuVEhVTUJOQUlMLHRodW1iVGFyZ2V0OmEuaW1hZ2UsaW5kZXg6YS5kYXRhLm9yZGVyfSl9fSl9O3RoaXMuX3RodW1ibmFpbHM9W107dGhpcy4kKCJ0aHVtYm5haWxzIikuZW1wdHkoKTsKZm9yKGE9MDt0aGlzLl9kYXRhW2FdO2ErKyljPXRoaXMuX2RhdGFbYV0saS50aHVtYm5haWxzPT09ITA/KGQ9bmV3IEdhbGxlcmlhLlBpY3R1cmUoYSksYj1jLnRodW1ifHxjLmltYWdlLHRoaXMuJCgidGh1bWJuYWlscyIpLmFwcGVuZChkLmNvbnRhaW5lciksaD1lKGQuY29udGFpbmVyKSxkLmRhdGE9e3dpZHRoOmYucGFyc2VWYWx1ZShwKCJ3aWR0aCIpKSxoZWlnaHQ6Zi5wYXJzZVZhbHVlKHAoImhlaWdodCIpKSxvcmRlcjphfSxpLnRodW1iRml0JiZpLnRodW1iQ3JvcCE9PSEwP2guY3NzKHt3aWR0aDowLGhlaWdodDowfSk6aC5jc3Moe3dpZHRoOmQuZGF0YS53aWR0aCxoZWlnaHQ6ZC5kYXRhLmhlaWdodH0pLGQubG9hZChiLG8pLGkucHJlbG9hZD09PSJhbGwiJiZkLnByZWxvYWQoYy5pbWFnZSkpOmw9PT0iZW1wdHkifHxsPT09Im51bWJlcnMiPyhkPXtjb250YWluZXI6Zi5jcmVhdGUoImdhbGxlcmlhLWltYWdlIiksaW1hZ2U6Zi5jcmVhdGUoImltZyIsInNwYW4iKSxyZWFkeTohMH0sCmw9PT0ibnVtYmVycyImJmUoZC5pbWFnZSkudGV4dChhKzEpLHRoaXMuJCgidGh1bWJuYWlscyIpLmFwcGVuZChkLmNvbnRhaW5lciksay5zZXRUaW1lb3V0KG4oZC5pbWFnZSxhLGQuY29udGFpbmVyKSw1MCthKjIwKSk6ZD17Y29udGFpbmVyOm51bGwsaW1hZ2U6bnVsbH0sZShkLmNvbnRhaW5lcikuYWRkKGkua2VlcFNvdXJjZSYmaS5saW5rU291cmNlSW1hZ2VzP2Mub3JpZ2luYWw6bnVsbCkuZGF0YSgiaW5kZXgiLGEpLmJpbmQoaS50aHVtYkV2ZW50VHlwZSxxKSxnPT09YiYmZShkLmNvbnRhaW5lcikuYWRkQ2xhc3MoImFjdGl2ZSIpLHRoaXMuX3RodW1ibmFpbHMucHVzaChkKX0sX3J1bjpmdW5jdGlvbigpe3ZhciBhPXRoaXM7YS5fY3JlYXRlVGh1bWJuYWlscygpO2Yud2FpdCh7dW50aWw6ZnVuY3Rpb24oKXtHYWxsZXJpYS5PUEVSQSYmYS4kKCJzdGFnZSIpLmNzcygiZGlzcGxheSIsImlubGluZS1ibG9jayIpO2EuX3N0YWdlV2lkdGg9YS4kKCJzdGFnZSIpLndpZHRoKCk7YS5fc3RhZ2VIZWlnaHQ9CmEuJCgic3RhZ2UiKS5oZWlnaHQoKTtyZXR1cm4gYS5fc3RhZ2VXaWR0aCYmYS5fc3RhZ2VIZWlnaHQ+NTB9LHN1Y2Nlc3M6ZnVuY3Rpb24oKXt6LnB1c2goYSk7Zi5zaG93KGEuZ2V0KCJjb3VudGVyIikpO2EuX29wdGlvbnMuY2Fyb3VzZWwmJmEuX2Nhcm91c2VsLmJpbmRDb250cm9scygpO2lmKGEuX29wdGlvbnMuYXV0b3BsYXkpe2EucGF1c2UoKTtpZih0eXBlb2YgYS5fb3B0aW9ucy5hdXRvcGxheT09PSJudW1iZXIiKWEuX3BsYXl0aW1lPWEuX29wdGlvbnMuYXV0b3BsYXk7YS50cmlnZ2VyKEdhbGxlcmlhLlBMQVkpO2EuX3BsYXlpbmc9ITB9YS5fZmlyc3RydW4/dHlwZW9mIGEuX29wdGlvbnMuc2hvdz09PSJudW1iZXIiJiZhLnNob3coYS5fb3B0aW9ucy5zaG93KTooYS5fZmlyc3RydW49ITAsYS5fb3B0aW9ucy5jbGlja25leHQmJiFHYWxsZXJpYS5UT1VDSCYmKGUuZWFjaChhLl9kYXRhLGZ1bmN0aW9uKGEsZCl7ZGVsZXRlIGQubGlua30pLGEuJCgic3RhZ2UiKS5jc3Moe2N1cnNvcjoicG9pbnRlciJ9KS5iaW5kKCJjbGljayIsCmZ1bmN0aW9uKCl7YS5fb3B0aW9ucy5wYXVzZU9uSW50ZXJhY3Rpb24mJmEucGF1c2UoKTthLm5leHQoKX0pKSxHYWxsZXJpYS5IaXN0b3J5JiZHYWxsZXJpYS5IaXN0b3J5LmNoYW5nZShmdW5jdGlvbihiKXtpc05hTihiKT9rLmhpc3RvcnkuZ28oLTEpOmEuc2hvdyhiLHZvaWQgMCwhMCl9KSxlLmVhY2goR2FsbGVyaWEucmVhZHkuY2FsbGJhY2tzLGZ1bmN0aW9uKCl7dGhpcy5jYWxsKGEsYS5fb3B0aW9ucyl9KSxhLnRyaWdnZXIoR2FsbGVyaWEuUkVBRFkpLEdhbGxlcmlhLnRoZW1lLmluaXQuY2FsbChhLGEuX29wdGlvbnMpLGEuX29wdGlvbnMuZXh0ZW5kLmNhbGwoYSxhLl9vcHRpb25zKSwvXlswLTldezEsNH0kLy50ZXN0KEkpJiZHYWxsZXJpYS5IaXN0b3J5P2Euc2hvdyhJLHZvaWQgMCwhMCk6YS5fZGF0YVthLl9vcHRpb25zLnNob3ddJiZhLnNob3coYS5fb3B0aW9ucy5zaG93KSl9LGVycm9yOmZ1bmN0aW9uKCl7R2FsbGVyaWEucmFpc2UoIlN0YWdlIHdpZHRoIG9yIGhlaWdodCBpcyB0b28gc21hbGwgdG8gc2hvdyB0aGUgZ2FsbGVyeS4gVHJhY2VkIG1lYXN1cmVzOiB3aWR0aDoiKwphLl9zdGFnZVdpZHRoKyJweCwgaGVpZ2h0OiAiK2EuX3N0YWdlSGVpZ2h0KyJweC4iLCEwKX19KX0sbG9hZDpmdW5jdGlvbihhLGIsZCl7dmFyIGM9dGhpczt0aGlzLl9kYXRhPVtdO3RoaXMuX3RodW1ibmFpbHM9W107dGhpcy4kKCJ0aHVtYm5haWxzIikuZW1wdHkoKTt0eXBlb2YgYj09PSJmdW5jdGlvbiImJihkPWIsYj1udWxsKTthPWF8fHRoaXMuX29wdGlvbnMuZGF0YVNvdXJjZTtiPWJ8fHRoaXMuX29wdGlvbnMuZGF0YVNlbGVjdG9yO2Q9ZHx8dGhpcy5fb3B0aW9ucy5kYXRhQ29uZmlnOy9eZnVuY3Rpb24gT2JqZWN0Ly50ZXN0KGEuY29uc3RydWN0b3IpJiYoYT1bYV0pO2lmKGEuY29uc3RydWN0b3I9PT1BcnJheSlyZXR1cm4gdGhpcy52YWxpZGF0ZShhKT8odGhpcy5fZGF0YT1hLHRoaXMuX3BhcnNlRGF0YSgpLnRyaWdnZXIoR2FsbGVyaWEuREFUQSkpOkdhbGxlcmlhLnJhaXNlKCJMb2FkIGZhaWxlZDogSlNPTiBBcnJheSBub3QgdmFsaWQuIiksdGhpcztlKGEpLmZpbmQoYikuZWFjaChmdW5jdGlvbihhLApiKXt2YXIgYj1lKGIpLGY9e30sZz1iLnBhcmVudCgpLGw9Zy5hdHRyKCJocmVmIiksZz1nLmF0dHIoInJlbCIpO2lmKGwpZi5pbWFnZT1mLmJpZz1sO2lmKGcpZi5iaWc9ZztjLl9kYXRhLnB1c2goZS5leHRlbmQoe3RpdGxlOmIuYXR0cigidGl0bGUiKXx8IiIsdGh1bWI6Yi5hdHRyKCJzcmMiKSxpbWFnZTpiLmF0dHIoInNyYyIpLGJpZzpiLmF0dHIoInNyYyIpLGRlc2NyaXB0aW9uOmIuYXR0cigiYWx0Iil8fCIiLGxpbms6Yi5hdHRyKCJsb25nZGVzYyIpLG9yaWdpbmFsOmIuZ2V0KDApfSxmLGQoYikpKX0pO3RoaXMuZ2V0RGF0YUxlbmd0aCgpP3RoaXMudHJpZ2dlcihHYWxsZXJpYS5EQVRBKTpHYWxsZXJpYS5yYWlzZSgiTG9hZCBmYWlsZWQ6IG5vIGRhdGEgZm91bmQuIik7cmV0dXJuIHRoaXN9LF9wYXJzZURhdGE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzO2UuZWFjaCh0aGlzLl9kYXRhLGZ1bmN0aW9uKGIsZCl7aWYoInRodW1iImluIGQ9PT0hMSlhLl9kYXRhW2JdLnRodW1iPWQuaW1hZ2U7CmlmKCExIGluIGQpYS5fZGF0YVtiXS5iaWc9ZC5pbWFnZX0pO3JldHVybiB0aGlzfSxzcGxpY2U6ZnVuY3Rpb24oKXtBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KHRoaXMuX2RhdGEsZi5hcnJheShhcmd1bWVudHMpKTtyZXR1cm4gdGhpcy5fcGFyc2VEYXRhKCkuX2NyZWF0ZVRodW1ibmFpbHMoKX0scHVzaDpmdW5jdGlvbigpe0FycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHRoaXMuX2RhdGEsZi5hcnJheShhcmd1bWVudHMpKTtyZXR1cm4gdGhpcy5fcGFyc2VEYXRhKCkuX2NyZWF0ZVRodW1ibmFpbHMoKX0sX2dldEFjdGl2ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb250cm9scy5nZXRBY3RpdmUoKX0sdmFsaWRhdGU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sYmluZDpmdW5jdGlvbihhLGIpe2E9QyhhKTt0aGlzLiQoImNvbnRhaW5lciIpLmJpbmQoYSx0aGlzLnByb3h5KGIpKTtyZXR1cm4gdGhpc30sdW5iaW5kOmZ1bmN0aW9uKGEpe2E9QyhhKTt0aGlzLiQoImNvbnRhaW5lciIpLnVuYmluZChhKTsKcmV0dXJuIHRoaXN9LHRyaWdnZXI6ZnVuY3Rpb24oYSl7YT10eXBlb2YgYT09PSJvYmplY3QiP2UuZXh0ZW5kKGEse3Njb3BlOnRoaXN9KTp7dHlwZTpDKGEpLHNjb3BlOnRoaXN9O3RoaXMuJCgiY29udGFpbmVyIikudHJpZ2dlcihhKTtyZXR1cm4gdGhpc30sYWRkSWRsZVN0YXRlOmZ1bmN0aW9uKGEsYil7dGhpcy5faWRsZS5hZGQuYXBwbHkodGhpcy5faWRsZSxmLmFycmF5KGFyZ3VtZW50cykpO3JldHVybiB0aGlzfSxyZW1vdmVJZGxlU3RhdGU6ZnVuY3Rpb24oYSl7dGhpcy5faWRsZS5yZW1vdmUuYXBwbHkodGhpcy5faWRsZSxmLmFycmF5KGFyZ3VtZW50cykpO3JldHVybiB0aGlzfSxlbnRlcklkbGVNb2RlOmZ1bmN0aW9uKCl7dGhpcy5faWRsZS5oaWRlKCk7cmV0dXJuIHRoaXN9LGV4aXRJZGxlTW9kZTpmdW5jdGlvbigpe3RoaXMuX2lkbGUuc2hvd0FsbCgpO3JldHVybiB0aGlzfSxlbnRlckZ1bGxzY3JlZW46ZnVuY3Rpb24oYSl7dGhpcy5fZnVsbHNjcmVlbi5lbnRlci5hcHBseSh0aGlzLApmLmFycmF5KGFyZ3VtZW50cykpO3JldHVybiB0aGlzfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbihhKXt0aGlzLl9mdWxsc2NyZWVuLmV4aXQuYXBwbHkodGhpcyxmLmFycmF5KGFyZ3VtZW50cykpO3JldHVybiB0aGlzfSx0b2dnbGVGdWxsc2NyZWVuOmZ1bmN0aW9uKGEpe3RoaXMuX2Z1bGxzY3JlZW5bdGhpcy5pc0Z1bGxzY3JlZW4oKT8iZXhpdCI6ImVudGVyIl0uYXBwbHkodGhpcyxmLmFycmF5KGFyZ3VtZW50cykpO3JldHVybiB0aGlzfSxiaW5kVG9vbHRpcDpmdW5jdGlvbihhLGIpe3RoaXMuX3Rvb2x0aXAuYmluZC5hcHBseSh0aGlzLl90b29sdGlwLGYuYXJyYXkoYXJndW1lbnRzKSk7cmV0dXJuIHRoaXN9LGRlZmluZVRvb2x0aXA6ZnVuY3Rpb24oYSxiKXt0aGlzLl90b29sdGlwLmRlZmluZS5hcHBseSh0aGlzLl90b29sdGlwLGYuYXJyYXkoYXJndW1lbnRzKSk7cmV0dXJuIHRoaXN9LHJlZnJlc2hUb29sdGlwOmZ1bmN0aW9uKGEpe3RoaXMuX3Rvb2x0aXAuc2hvdy5hcHBseSh0aGlzLl90b29sdGlwLApmLmFycmF5KGFyZ3VtZW50cykpO3JldHVybiB0aGlzfSxvcGVuTGlnaHRib3g6ZnVuY3Rpb24oKXt0aGlzLl9saWdodGJveC5zaG93LmFwcGx5KHRoaXMuX2xpZ2h0Ym94LGYuYXJyYXkoYXJndW1lbnRzKSk7cmV0dXJuIHRoaXN9LGNsb3NlTGlnaHRib3g6ZnVuY3Rpb24oKXt0aGlzLl9saWdodGJveC5oaWRlLmFwcGx5KHRoaXMuX2xpZ2h0Ym94LGYuYXJyYXkoYXJndW1lbnRzKSk7cmV0dXJuIHRoaXN9LGdldEFjdGl2ZUltYWdlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldEFjdGl2ZSgpLmltYWdlfHx2b2lkIDB9LGdldEFjdGl2ZVRodW1iOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RodW1ibmFpbHNbdGhpcy5fYWN0aXZlXS5pbWFnZXx8dm9pZCAwfSxnZXRNb3VzZVBvc2l0aW9uOmZ1bmN0aW9uKGEpe3JldHVybnt4OmEucGFnZVgtdGhpcy4kKCJjb250YWluZXIiKS5vZmZzZXQoKS5sZWZ0LHk6YS5wYWdlWS10aGlzLiQoImNvbnRhaW5lciIpLm9mZnNldCgpLnRvcH19LGFkZFBhbjpmdW5jdGlvbihhKXtpZih0aGlzLl9vcHRpb25zLmltYWdlQ3JvcCE9PQohMSl7dmFyIGE9ZShhfHx0aGlzLmdldEFjdGl2ZUltYWdlKCkpLGI9dGhpcyxkPWEud2lkdGgoKS8yLGM9YS5oZWlnaHQoKS8yLGg9cGFyc2VJbnQoYS5jc3MoImxlZnQiKSwxMCksaj1wYXJzZUludChhLmNzcygidG9wIiksMTApLGk9aHx8MCxnPWp8fDAsbD0wLHA9MCxuPSExLGs9Zi50aW1lc3RhbXAoKSxvPTAscz0wLHI9ZnVuY3Rpb24oYixjLGQpe2lmKGI+MCYmKHM9TWF0aC5yb3VuZChNYXRoLm1heChiKi0xLE1hdGgubWluKDAsYykpKSxvIT09cykpaWYobz1zLHE9PT04KWEucGFyZW50KClbInNjcm9sbCIrZF0ocyotMSk7ZWxzZSBiPXt9LGJbZC50b0xvd2VyQ2FzZSgpXT1zLGEuY3NzKGIpfSxtPWZ1bmN0aW9uKGEpe2lmKCEoZi50aW1lc3RhbXAoKS1rPDUwKSluPSEwLGQ9Yi5nZXRNb3VzZVBvc2l0aW9uKGEpLngsYz1iLmdldE1vdXNlUG9zaXRpb24oYSkueX07cT09PTgmJihhLnBhcmVudCgpLnNjcm9sbFRvcChnKi0xKS5zY3JvbGxMZWZ0KGkqLTEpLGEuY3NzKHt0b3A6MCwKbGVmdDowfSkpO3RoaXMuJCgic3RhZ2UiKS51bmJpbmQoIm1vdXNlbW92ZSIsbSkuYmluZCgibW91c2Vtb3ZlIixtKTtmLmFkZFRpbWVyKCJwYW4iLGZ1bmN0aW9uKCl7biYmKGw9YS53aWR0aCgpLWIuX3N0YWdlV2lkdGgscD1hLmhlaWdodCgpLWIuX3N0YWdlSGVpZ2h0LGg9ZC9iLl9zdGFnZVdpZHRoKmwqLTEsaj1jL2IuX3N0YWdlSGVpZ2h0KnAqLTEsaSs9KGgtaSkvYi5fb3B0aW9ucy5pbWFnZVBhblNtb290aG5lc3MsZys9KGotZykvYi5fb3B0aW9ucy5pbWFnZVBhblNtb290aG5lc3MscihwLGcsIlRvcCIpLHIobCxpLCJMZWZ0IikpfSw1MCwhMCk7cmV0dXJuIHRoaXN9fSxwcm94eTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhIT09ImZ1bmN0aW9uIilyZXR1cm4gZnVuY3Rpb24oKXt9O2I9Ynx8dGhpcztyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gYS5hcHBseShiLGYuYXJyYXkoYXJndW1lbnRzKSl9fSxyZW1vdmVQYW46ZnVuY3Rpb24oKXt0aGlzLiQoInN0YWdlIikudW5iaW5kKCJtb3VzZW1vdmUiKTsKZi5jbGVhclRpbWVyKCJwYW4iKTtyZXR1cm4gdGhpc30sYWRkRWxlbWVudDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLl9kb207ZS5lYWNoKGYuYXJyYXkoYXJndW1lbnRzKSxmdW5jdGlvbihhLGMpe2JbY109Zi5jcmVhdGUoImdhbGxlcmlhLSIrYyl9KTtyZXR1cm4gdGhpc30sYXR0YWNoS2V5Ym9hcmQ6ZnVuY3Rpb24oYSl7dGhpcy5fa2V5Ym9hcmQuYXR0YWNoLmFwcGx5KHRoaXMuX2tleWJvYXJkLGYuYXJyYXkoYXJndW1lbnRzKSk7cmV0dXJuIHRoaXN9LGRldGFjaEtleWJvYXJkOmZ1bmN0aW9uKCl7dGhpcy5fa2V5Ym9hcmQuZGV0YWNoLmFwcGx5KHRoaXMuX2tleWJvYXJkLGYuYXJyYXkoYXJndW1lbnRzKSk7cmV0dXJuIHRoaXN9LGFwcGVuZENoaWxkOmZ1bmN0aW9uKGEsYil7dGhpcy4kKGEpLmFwcGVuZCh0aGlzLmdldChiKXx8Yik7cmV0dXJuIHRoaXN9LHByZXBlbmRDaGlsZDpmdW5jdGlvbihhLGIpe3RoaXMuJChhKS5wcmVwZW5kKHRoaXMuZ2V0KGIpfHxiKTtyZXR1cm4gdGhpc30sCnJlbW92ZTpmdW5jdGlvbihhKXt0aGlzLiQoZi5hcnJheShhcmd1bWVudHMpLmpvaW4oIiwiKSkucmVtb3ZlKCk7cmV0dXJuIHRoaXN9LGFwcGVuZDpmdW5jdGlvbihhKXt2YXIgYixkO2ZvcihiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSlpZihhW2JdLmNvbnN0cnVjdG9yPT09QXJyYXkpZm9yKGQ9MDthW2JdW2RdO2QrKyl0aGlzLmFwcGVuZENoaWxkKGIsYVtiXVtkXSk7ZWxzZSB0aGlzLmFwcGVuZENoaWxkKGIsYVtiXSk7cmV0dXJuIHRoaXN9LF9zY2FsZUltYWdlOmZ1bmN0aW9uKGEsYil7aWYoYT1hfHx0aGlzLl9jb250cm9scy5nZXRBY3RpdmUoKSl7dmFyIGQsYz1mdW5jdGlvbihhKXtlKGEuY29udGFpbmVyKS5jaGlsZHJlbigiOmZpcnN0IikuY3NzKHt0b3A6TWF0aC5tYXgoMCxmLnBhcnNlVmFsdWUoYS5pbWFnZS5zdHlsZS50b3ApKSxsZWZ0Ok1hdGgubWF4KDAsZi5wYXJzZVZhbHVlKGEuaW1hZ2Uuc3R5bGUubGVmdCkpLHdpZHRoOmYucGFyc2VWYWx1ZShhLmltYWdlLndpZHRoKSwKaGVpZ2h0OmYucGFyc2VWYWx1ZShhLmltYWdlLmhlaWdodCl9KX0sYj1lLmV4dGVuZCh7d2lkdGg6dGhpcy5fc3RhZ2VXaWR0aCxoZWlnaHQ6dGhpcy5fc3RhZ2VIZWlnaHQsY3JvcDp0aGlzLl9vcHRpb25zLmltYWdlQ3JvcCxtYXg6dGhpcy5fb3B0aW9ucy5tYXhTY2FsZVJhdGlvLG1pbjp0aGlzLl9vcHRpb25zLm1pblNjYWxlUmF0aW8sbWFyZ2luOnRoaXMuX29wdGlvbnMuaW1hZ2VNYXJnaW4scG9zaXRpb246dGhpcy5fb3B0aW9ucy5pbWFnZVBvc2l0aW9ufSxiKTt0aGlzLl9vcHRpb25zLmxheWVyRm9sbG93JiZ0aGlzLl9vcHRpb25zLmltYWdlQ3JvcCE9PSEwP3R5cGVvZiBiLmNvbXBsZXRlPT0iZnVuY3Rpb24iPyhkPWIuY29tcGxldGUsYi5jb21wbGV0ZT1mdW5jdGlvbigpe2QuY2FsbChhLGEpO2MoYSl9KTpiLmNvbXBsZXRlPWM6ZShhLmNvbnRhaW5lcikuY2hpbGRyZW4oIjpmaXJzdCIpLmNzcyh7dG9wOjAsbGVmdDowfSk7YS5zY2FsZShiKTtyZXR1cm4gdGhpc319LHVwZGF0ZUNhcm91c2VsOmZ1bmN0aW9uKCl7dGhpcy5fY2Fyb3VzZWwudXBkYXRlKCk7CnJldHVybiB0aGlzfSxyZXNjYWxlOmZ1bmN0aW9uKGEsYixkKXt2YXIgYz10aGlzO3R5cGVvZiBhPT09ImZ1bmN0aW9uIiYmKGQ9YSxhPXZvaWQgMCk7dmFyIGU9ZnVuY3Rpb24oKXtjLl9zdGFnZVdpZHRoPWF8fGMuJCgic3RhZ2UiKS53aWR0aCgpO2MuX3N0YWdlSGVpZ2h0PWJ8fGMuJCgic3RhZ2UiKS5oZWlnaHQoKTtjLl9zY2FsZUltYWdlKCk7Yy5fb3B0aW9ucy5jYXJvdXNlbCYmYy51cGRhdGVDYXJvdXNlbCgpO2MudHJpZ2dlcihHYWxsZXJpYS5SRVNDQUxFKTt0eXBlb2YgZD09PSJmdW5jdGlvbiImJmQuY2FsbChjKX07R2FsbGVyaWEuV0VCS0lUJiYhYSYmIWI/Zi5hZGRUaW1lcigic2NhbGUiLGUsMTApOmUuY2FsbChjKTtyZXR1cm4gdGhpc30scmVmcmVzaEltYWdlOmZ1bmN0aW9uKCl7dGhpcy5fc2NhbGVJbWFnZSgpO3RoaXMuX29wdGlvbnMuaW1hZ2VQYW4mJnRoaXMuYWRkUGFuKCk7cmV0dXJuIHRoaXN9LHNob3c6ZnVuY3Rpb24oYSxiLGQpe2lmKCEoYT09PSExfHwhdGhpcy5fb3B0aW9ucy5xdWV1ZSYmCnRoaXMuX3F1ZXVlLnN0YWxsZWQpKWlmKGE9TWF0aC5tYXgoMCxNYXRoLm1pbihwYXJzZUludChhLDEwKSx0aGlzLmdldERhdGFMZW5ndGgoKS0xKSksYj10eXBlb2YgYiE9PSJ1bmRlZmluZWQiPyEhYjphPHRoaXMuZ2V0SW5kZXgoKSwhZCYmR2FsbGVyaWEuSGlzdG9yeSlHYWxsZXJpYS5IaXN0b3J5LnNldChhLnRvU3RyaW5nKCkpO2Vsc2UgcmV0dXJuIHRoaXMuX2FjdGl2ZT1hLEFycmF5LnByb3RvdHlwZS5wdXNoLmNhbGwodGhpcy5fcXVldWUse2luZGV4OmEscmV3aW5kOmJ9KSx0aGlzLl9xdWV1ZS5zdGFsbGVkfHx0aGlzLl9zaG93KCksdGhpc30sX3Nob3c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGI9dGhpcy5fcXVldWVbMF0sZD10aGlzLmdldERhdGEoYi5pbmRleCk7aWYoZCl7dmFyIGM9dGhpcy5pc0Z1bGxzY3JlZW4oKSYmImJpZyJpbiBkP2QuYmlnOmQuaW1hZ2UsaD10aGlzLl9jb250cm9scy5nZXRBY3RpdmUoKSxqPXRoaXMuX2NvbnRyb2xzLmdldE5leHQoKSxpPWouaXNDYWNoZWQoYyksCmc9dGhpcy5fdGh1bWJuYWlsc1tiLmluZGV4XSxsPWZ1bmN0aW9uKGIsYyxkLGksaCl7cmV0dXJuIGZ1bmN0aW9uKCl7YS5fcXVldWUuc3RhbGxlZD0hMTtmLnRvZ2dsZVF1YWxpdHkoYy5pbWFnZSxhLl9vcHRpb25zLmltYWdlUXVhbGl0eSk7YS5fbGF5ZXJzW2EuX2NvbnRyb2xzLmFjdGl2ZV0uaW5uZXJIVE1MPSIiO2UoZC5jb250YWluZXIpLmNzcyh7ekluZGV4OjAsb3BhY2l0eTowfSkuc2hvdygpO2UoYy5jb250YWluZXIpLmNzcyh7ekluZGV4OjF9KS5zaG93KCk7YS5fY29udHJvbHMuc3dhcCgpO2EuX29wdGlvbnMuaW1hZ2VQYW4mJmEuYWRkUGFuKGMuaW1hZ2UpOyhiLmxpbmt8fGEuX29wdGlvbnMubGlnaHRib3gpJiZlKGMuaW1hZ2UpLmNzcyh7Y3Vyc29yOiJwb2ludGVyIn0pLmJpbmQoIm1vdXNldXAiLGZ1bmN0aW9uKCl7Yi5saW5rP2EuX29wdGlvbnMucG9wdXBMaW5rcz9rLm9wZW4oYi5saW5rLCJfYmxhbmsiKTprLmxvY2F0aW9uLmhyZWY9Yi5saW5rOmEub3BlbkxpZ2h0Ym94KCl9KTsKQXJyYXkucHJvdG90eXBlLnNoaWZ0LmNhbGwoYS5fcXVldWUpO2EuX3F1ZXVlLmxlbmd0aCYmYS5fc2hvdygpO2EuX3BsYXlDaGVjaygpO2EudHJpZ2dlcih7dHlwZTpHYWxsZXJpYS5JTUFHRSxpbmRleDppLmluZGV4LGltYWdlVGFyZ2V0OmMuaW1hZ2UsdGh1bWJUYXJnZXQ6aC5pbWFnZX0pfX0oZCxqLGgsYixnKTt0aGlzLl9vcHRpb25zLmNhcm91c2VsJiZ0aGlzLl9vcHRpb25zLmNhcm91c2VsRm9sbG93JiZ0aGlzLl9jYXJvdXNlbC5mb2xsb3coYi5pbmRleCk7aWYodGhpcy5fb3B0aW9ucy5wcmVsb2FkKXt2YXIgcCxuLG09dGhpcy5nZXROZXh0KCksbzt0cnl7Zm9yKG49dGhpcy5fb3B0aW9ucy5wcmVsb2FkO24+MDtuLS0pcD1uZXcgR2FsbGVyaWEuUGljdHVyZSxvPWEuZ2V0RGF0YShtKSxwLnByZWxvYWQodGhpcy5pc0Z1bGxzY3JlZW4oKSYmImJpZyJpbiBvP28uYmlnOm8uaW1hZ2UpLG09YS5nZXROZXh0KG0pfWNhdGNoKHMpe319Zi5zaG93KGouY29udGFpbmVyKTtlKGEuX3RodW1ibmFpbHNbYi5pbmRleF0uY29udGFpbmVyKS5hZGRDbGFzcygiYWN0aXZlIikuc2libGluZ3MoIi5hY3RpdmUiKS5yZW1vdmVDbGFzcygiYWN0aXZlIik7CmEudHJpZ2dlcih7dHlwZTpHYWxsZXJpYS5MT0FEU1RBUlQsY2FjaGVkOmksaW5kZXg6Yi5pbmRleCxyZXdpbmQ6Yi5yZXdpbmQsaW1hZ2VUYXJnZXQ6ai5pbWFnZSx0aHVtYlRhcmdldDpnLmltYWdlfSk7ai5sb2FkKGMsZnVuY3Rpb24oYyl7dmFyIGc9ZShhLl9sYXllcnNbMS1hLl9jb250cm9scy5hY3RpdmVdKS5odG1sKGQubGF5ZXJ8fCIiKS5oaWRlKCk7YS5fc2NhbGVJbWFnZShjLHtjb21wbGV0ZTpmdW5jdGlvbihjKXsiaW1hZ2UiaW4gaCYmZi50b2dnbGVRdWFsaXR5KGguaW1hZ2UsITEpO2YudG9nZ2xlUXVhbGl0eShjLmltYWdlLCExKTthLl9xdWV1ZS5zdGFsbGVkPSEwO2EucmVtb3ZlUGFuKCk7YS5zZXRJbmZvKGIuaW5kZXgpO2Euc2V0Q291bnRlcihiLmluZGV4KTtpZihkLmxheWVyJiYoZy5zaG93KCksZC5saW5rfHxhLl9vcHRpb25zLmNsaWNrbmV4dCkpZy5jc3MoImN1cnNvciIsInBvaW50ZXIiKS5vbmUoImNsaWNrIixmdW5jdGlvbigpe2QubGluaz9lKGMuaW1hZ2UpLnRyaWdnZXIoIm1vdXNldXAiKToKYS4kKCJzdGFnZSIpLnRyaWdnZXIoImNsaWNrIil9KTthLnRyaWdnZXIoe3R5cGU6R2FsbGVyaWEuTE9BREZJTklTSCxjYWNoZWQ6aSxpbmRleDpiLmluZGV4LHJld2luZDpiLnJld2luZCxpbWFnZVRhcmdldDpjLmltYWdlLHRodW1iVGFyZ2V0OmEuX3RodW1ibmFpbHNbYi5pbmRleF0uaW1hZ2V9KTt2YXIgaj1hLl9vcHRpb25zLnRyYW5zaXRpb247ZS5lYWNoKHtpbml0aWFsOmguaW1hZ2U9PT1udWxsLHRvdWNoOkdhbGxlcmlhLlRPVUNILGZ1bGxzY3JlZW46YS5pc0Z1bGxzY3JlZW4oKX0sZnVuY3Rpb24oYixjKXtpZihjJiZhLl9vcHRpb25zW2IrIlRyYW5zaXRpb24iXSE9PXZvaWQgMClyZXR1cm4gaj1hLl9vcHRpb25zW2IrIlRyYW5zaXRpb24iXSwhMX0pO2ogaW4gRj09PSExP2woKTpGW2pdLmNhbGwoYSx7cHJldjpoLmNvbnRhaW5lcixuZXh0OmMuY29udGFpbmVyLHJld2luZDpiLnJld2luZCxzcGVlZDphLl9vcHRpb25zLnRyYW5zaXRpb25TcGVlZHx8NDAwfSxsKX19KX0pfX0sCmdldE5leHQ6ZnVuY3Rpb24oYSl7YT10eXBlb2YgYT09PSJudW1iZXIiP2E6dGhpcy5nZXRJbmRleCgpO3JldHVybiBhPT09dGhpcy5nZXREYXRhTGVuZ3RoKCktMT8wOmErMX0sZ2V0UHJldjpmdW5jdGlvbihhKXthPXR5cGVvZiBhPT09Im51bWJlciI/YTp0aGlzLmdldEluZGV4KCk7cmV0dXJuIGE9PT0wP3RoaXMuZ2V0RGF0YUxlbmd0aCgpLTE6YS0xfSxuZXh0OmZ1bmN0aW9uKCl7dGhpcy5nZXREYXRhTGVuZ3RoKCk+MSYmdGhpcy5zaG93KHRoaXMuZ2V0TmV4dCgpLCExKTtyZXR1cm4gdGhpc30scHJldjpmdW5jdGlvbigpe3RoaXMuZ2V0RGF0YUxlbmd0aCgpPjEmJnRoaXMuc2hvdyh0aGlzLmdldFByZXYoKSwhMCk7cmV0dXJuIHRoaXN9LGdldDpmdW5jdGlvbihhKXtyZXR1cm4gYSBpbiB0aGlzLl9kb20/dGhpcy5fZG9tW2FdOm51bGx9LGdldERhdGE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gdGhpcy5fZGF0YT90aGlzLl9kYXRhW2FdOnRoaXMuX2RhdGFbdGhpcy5fYWN0aXZlXX0sCmdldERhdGFMZW5ndGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGF0YS5sZW5ndGh9LGdldEluZGV4OmZ1bmN0aW9uKCl7cmV0dXJuIHR5cGVvZiB0aGlzLl9hY3RpdmU9PT0ibnVtYmVyIj90aGlzLl9hY3RpdmU6ITF9LGdldFN0YWdlSGVpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3N0YWdlSGVpZ2h0fSxnZXRTdGFnZVdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3N0YWdlV2lkdGh9LGdldE9wdGlvbnM6ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhPT09InVuZGVmaW5lZCI/dGhpcy5fb3B0aW9uczp0aGlzLl9vcHRpb25zW2FdfSxzZXRPcHRpb25zOmZ1bmN0aW9uKGEsYil7dHlwZW9mIGE9PT0ib2JqZWN0Ij9lLmV4dGVuZCh0aGlzLl9vcHRpb25zLGEpOnRoaXMuX29wdGlvbnNbYV09YjtyZXR1cm4gdGhpc30scGxheTpmdW5jdGlvbihhKXt0aGlzLl9wbGF5aW5nPSEwO3RoaXMuX3BsYXl0aW1lPWF8fHRoaXMuX3BsYXl0aW1lO3RoaXMuX3BsYXlDaGVjaygpOwp0aGlzLnRyaWdnZXIoR2FsbGVyaWEuUExBWSk7cmV0dXJuIHRoaXN9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5fcGxheWluZz0hMTt0aGlzLnRyaWdnZXIoR2FsbGVyaWEuUEFVU0UpO3JldHVybiB0aGlzfSxwbGF5VG9nZ2xlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9wbGF5aW5nP3RoaXMucGF1c2UoKTp0aGlzLnBsYXkoYSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wbGF5aW5nfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZnVsbHNjcmVlbi5hY3RpdmV9LF9wbGF5Q2hlY2s6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGI9MCxkPWYudGltZXN0YW1wKCksYz0icGxheSIrdGhpcy5faWQ7aWYodGhpcy5fcGxheWluZyl7Zi5jbGVhclRpbWVyKGMpO3ZhciBlPWZ1bmN0aW9uKCl7Yj1mLnRpbWVzdGFtcCgpLWQ7Yj49YS5fcGxheXRpbWUmJmEuX3BsYXlpbmc/KGYuY2xlYXJUaW1lcihjKSxhLm5leHQoKSk6YS5fcGxheWluZyYmKGEudHJpZ2dlcih7dHlwZTpHYWxsZXJpYS5QUk9HUkVTUywKcGVyY2VudDpNYXRoLmNlaWwoYi9hLl9wbGF5dGltZSoxMDApLHNlY29uZHM6TWF0aC5mbG9vcihiLzFFMyksbWlsbGlzZWNvbmRzOmJ9KSxmLmFkZFRpbWVyKGMsZSwyMCkpfTtmLmFkZFRpbWVyKGMsZSwyMCl9fSxzZXRQbGF5dGltZTpmdW5jdGlvbihhKXt0aGlzLl9wbGF5dGltZT1hO3JldHVybiB0aGlzfSxzZXRJbmRleDpmdW5jdGlvbihhKXt0aGlzLl9hY3RpdmU9YTtyZXR1cm4gdGhpc30sc2V0Q291bnRlcjpmdW5jdGlvbihhKXt0eXBlb2YgYT09PSJudW1iZXIiP2ErKzp0eXBlb2YgYT09PSJ1bmRlZmluZWQiJiYoYT10aGlzLmdldEluZGV4KCkrMSk7dGhpcy5nZXQoImN1cnJlbnQiKS5pbm5lckhUTUw9YTtpZihxKXt2YXIgYT10aGlzLiQoImNvdW50ZXIiKSxiPWEuY3NzKCJvcGFjaXR5Iik7cGFyc2VJbnQoYiwxMCk9PT0xP2YucmVtb3ZlQWxwaGEoYVswXSk6dGhpcy4kKCJjb3VudGVyIikuY3NzKCJvcGFjaXR5IixiKX1yZXR1cm4gdGhpc30sc2V0SW5mbzpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcyxkPXRoaXMuZ2V0RGF0YShhKTtlLmVhY2goWyJ0aXRsZSIsImRlc2NyaXB0aW9uIl0sZnVuY3Rpb24oYSxlKXt2YXIgZj1iLiQoImluZm8tIitlKTtkW2VdP2ZbZFtlXS5sZW5ndGg/InNob3ciOiJoaWRlIl0oKS5odG1sKGRbZV0pOmYuZW1wdHkoKS5oaWRlKCl9KTtyZXR1cm4gdGhpc30saGFzSW5mbzpmdW5jdGlvbihhKXt2YXIgYj0idGl0bGUgZGVzY3JpcHRpb24iLnNwbGl0KCIgIiksZDtmb3IoZD0wO2JbZF07ZCsrKWlmKHRoaXMuZ2V0RGF0YShhKVtiW2RdXSlyZXR1cm4hMDtyZXR1cm4hMX0salF1ZXJ5OmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsZD1bXTtlLmVhY2goYS5zcGxpdCgiLCIpLGZ1bmN0aW9uKGEsYyl7Yz1lLnRyaW0oYyk7Yi5nZXQoYykmJmQucHVzaChjKX0pO3ZhciBjPWUoYi5nZXQoZC5zaGlmdCgpKSk7ZS5lYWNoKGQsZnVuY3Rpb24oYSxkKXtjPWMuYWRkKGIuZ2V0KGQpKX0pO3JldHVybiBjfSwkOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmpRdWVyeS5hcHBseSh0aGlzLApmLmFycmF5KGFyZ3VtZW50cykpfX07ZS5lYWNoKEosZnVuY3Rpb24oYSxiKXt2YXIgZD0vXy8udGVzdChiKT9iLnJlcGxhY2UoL18vZywiIik6YjtHYWxsZXJpYVtiLnRvVXBwZXJDYXNlKCldPSJnYWxsZXJpYS4iK2R9KTtlLmV4dGVuZChHYWxsZXJpYSx7SUU5OnE9PT05LElFODpxPT09OCxJRTc6cT09PTcsSUU2OnE9PT02LElFOnEsV0VCS0lUOi93ZWJraXQvLnRlc3QoeCksU0FGQVJJOi9zYWZhcmkvLnRlc3QoeCksQ0hST01FOi9jaHJvbWUvLnRlc3QoeCksUVVJUks6cSYmbS5jb21wYXRNb2RlJiZtLmNvbXBhdE1vZGU9PT0iQmFja0NvbXBhdCIsTUFDOi9tYWMvLnRlc3QobmF2aWdhdG9yLnBsYXRmb3JtLnRvTG93ZXJDYXNlKCkpLE9QRVJBOiEhay5vcGVyYSxJUEhPTkU6L2lwaG9uZS8udGVzdCh4KSxJUEFEOi9pcGFkLy50ZXN0KHgpLEFORFJPSUQ6L2FuZHJvaWQvLnRlc3QoeCksVE9VQ0g6Im9udG91Y2hzdGFydCJpbiBtfSk7R2FsbGVyaWEuYWRkVGhlbWU9ZnVuY3Rpb24oYSl7YS5uYW1lfHwKR2FsbGVyaWEucmFpc2UoIk5vIHRoZW1lIG5hbWUgc3BlY2lmaWVkIik7YS5kZWZhdWx0cz10eXBlb2YgYS5kZWZhdWx0cyE9PSJvYmplY3QiP3t9OksoYS5kZWZhdWx0cyk7dmFyIGI9ITEsZDt0eXBlb2YgYS5jc3M9PT0ic3RyaW5nIj8oZSgibGluayIpLmVhY2goZnVuY3Rpb24oYyxlKXtkPVJlZ0V4cChhLmNzcyk7aWYoZC50ZXN0KGUuaHJlZikpcmV0dXJuIGI9ITAsRChhKSwhMX0pLGJ8fGUoInNjcmlwdCIpLmVhY2goZnVuY3Rpb24oYyxlKXtkPVJlZ0V4cCgiZ2FsbGVyaWFcXC4iK2EubmFtZS50b0xvd2VyQ2FzZSgpKyJcXC4iKTtkLnRlc3QoZS5zcmMpJiYoYj1lLnNyYy5yZXBsYWNlKC9bXlwvXSokLywiIikrYS5jc3MsZi5hZGRUaW1lcigiY3NzIixmdW5jdGlvbigpe2YubG9hZENTUyhiLCJnYWxsZXJpYS10aGVtZSIsZnVuY3Rpb24oKXtEKGEpfSl9LDEpKX0pLGJ8fEdhbGxlcmlhLnJhaXNlKCJObyB0aGVtZSBDU1MgbG9hZGVkIikpOkQoYSk7cmV0dXJuIGF9O0dhbGxlcmlhLmxvYWRUaGVtZT0KZnVuY3Rpb24oYSxiKXt2YXIgZD16Lmxlbmd0aCxjPWsuc2V0VGltZW91dChmdW5jdGlvbigpe0dhbGxlcmlhLnJhaXNlKCJUaGVtZSBhdCAiK2ErIiBjb3VsZCBub3QgbG9hZCwgY2hlY2sgdGhlbWUgcGF0aC4iLCEwKX0sNUUzKTtHYWxsZXJpYS50aGVtZT12b2lkIDA7Zi5sb2FkU2NyaXB0KGEsZnVuY3Rpb24oKXtrLmNsZWFyVGltZW91dChjKTtpZihkKXt2YXIgYT1bXTtlLmVhY2goR2FsbGVyaWEuZ2V0KCksZnVuY3Rpb24oYyxkKXt2YXIgZj1lLmV4dGVuZChkLl9vcmlnaW5hbC5vcHRpb25zLHtkYXRhX3NvdXJjZTpkLl9kYXRhfSxiKTtkLiQoImNvbnRhaW5lciIpLnJlbW92ZSgpO3ZhciBsPW5ldyBHYWxsZXJpYTtsLl9pZD1kLl9pZDtsLmluaXQoZC5fb3JpZ2luYWwudGFyZ2V0LGYpO2EucHVzaChsKX0pO3o9YX19KX07R2FsbGVyaWEuZ2V0PWZ1bmN0aW9uKGEpe2lmKHlbYV0pcmV0dXJuIHlbYV07ZWxzZSBpZih0eXBlb2YgYSE9PSJudW1iZXIiKXJldHVybiB5O2Vsc2UgR2FsbGVyaWEucmFpc2UoIkdhbGxlcnkgaW5kZXggIisKYSsiIG5vdCBmb3VuZCIpfTtHYWxsZXJpYS5hZGRUcmFuc2l0aW9uPWZ1bmN0aW9uKGEsYil7RlthXT1ifTtHYWxsZXJpYS51dGlscz1mO0dhbGxlcmlhLmxvZz1mdW5jdGlvbigpe3JldHVybiJjb25zb2xlImluIGsmJiJsb2ciaW4gay5jb25zb2xlP2suY29uc29sZS5sb2c6ZnVuY3Rpb24oKXtrLmFsZXJ0KGYuYXJyYXkoYXJndW1lbnRzKS5qb2luKCIsICIpKX19KCk7R2FsbGVyaWEucmVhZHk9ZnVuY3Rpb24oYSl7ZS5lYWNoKHosZnVuY3Rpb24oYixkKXthLmNhbGwoZCxkLl9vcHRpb25zKX0pO0dhbGxlcmlhLnJlYWR5LmNhbGxiYWNrcy5wdXNoKGEpfTtHYWxsZXJpYS5yZWFkeS5jYWxsYmFja3M9W107R2FsbGVyaWEucmFpc2U9ZnVuY3Rpb24oYSxiKXt2YXIgZD1iPyJGYXRhbCBlcnJvciI6IkVycm9yIixjPWZ1bmN0aW9uKGEpe3ZhciBjPSc8ZGl2IHN0eWxlPSJwYWRkaW5nOjRweDttYXJnaW46MCAwIDJweDtiYWNrZ3JvdW5kOiMnKyhiPyI4MTEiOiIyMjIiKSsnIjs+JysoYj8KIjxzdHJvbmc+IitkKyI6IDwvc3Ryb25nPiI6IiIpK2ErIjwvZGl2PiI7ZS5lYWNoKHksZnVuY3Rpb24oKXt2YXIgYT10aGlzLiQoImVycm9ycyIpLGI9dGhpcy4kKCJ0YXJnZXQiKTthLmxlbmd0aHx8KGIuY3NzKCJwb3NpdGlvbiIsInJlbGF0aXZlIiksYT10aGlzLmFkZEVsZW1lbnQoImVycm9ycyIpLmFwcGVuZENoaWxkKCJ0YXJnZXQiLCJlcnJvcnMiKS4kKCJlcnJvcnMiKS5jc3Moe2NvbG9yOiIjZmZmIixwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDowLGxlZnQ6MCx6SW5kZXg6MUU1fSkpO2EuYXBwZW5kKGMpfSl9O2lmKEgpe2lmKGMoYSksYil0aHJvdyBFcnJvcihkKyI6ICIrYSk7fWVsc2UgYiYmIUwmJihMPSEwLGI9ITEsYygiSW1hZ2UgZ2FsbGVyeSBjb3VsZCBub3QgbG9hZC4iKSl9O0dhbGxlcmlhLnZlcnNpb249MS4yNjtHYWxsZXJpYS5yZXF1aXJlcz1mdW5jdGlvbihhLGIpe0dhbGxlcmlhLnZlcnNpb248YSYmR2FsbGVyaWEucmFpc2UoYnx8IllvdSBuZWVkIHRvIHVwZ3JhZGUgR2FsbGVyaWEgdG8gdmVyc2lvbiAiKwphKyIgdG8gdXNlIG9uZSBvciBtb3JlIGNvbXBvbmVudHMuIiwhMCl9O0dhbGxlcmlhLlBpY3R1cmU9ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfHxudWxsO3RoaXMuaW1hZ2U9bnVsbDt0aGlzLmNvbnRhaW5lcj1mLmNyZWF0ZSgiZ2FsbGVyaWEtaW1hZ2UiKTtlKHRoaXMuY29udGFpbmVyKS5jc3Moe292ZXJmbG93OiJoaWRkZW4iLHBvc2l0aW9uOiJyZWxhdGl2ZSJ9KTt0aGlzLm9yaWdpbmFsPXt3aWR0aDowLGhlaWdodDowfTt0aGlzLnJlYWR5PSExO3RoaXMudGlkPW51bGx9O0dhbGxlcmlhLlBpY3R1cmUucHJvdG90eXBlPXtjYWNoZTp7fSxzaG93OmZ1bmN0aW9uKCl7Zi5zaG93KHRoaXMuaW1hZ2UpfSxoaWRlOmZ1bmN0aW9uKCl7Zi5tb3ZlT3V0KHRoaXMuaW1hZ2UpfSxjbGVhcjpmdW5jdGlvbigpe3RoaXMuaW1hZ2U9bnVsbH0saXNDYWNoZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuISF0aGlzLmNhY2hlW2FdfSxwcmVsb2FkOmZ1bmN0aW9uKGEpe2UobmV3IEltYWdlKS5sb2FkKGZ1bmN0aW9uKGEsCmQpe3JldHVybiBmdW5jdGlvbigpe2RbYV09YX19KGEsdGhpcy5jYWNoZSkpLmF0dHIoInNyYyIsYSl9LGxvYWQ6ZnVuY3Rpb24oYSxiKXt0aGlzLnRpZD1rLnNldFRpbWVvdXQoZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKCl7R2FsbGVyaWEucmFpc2UoIkltYWdlIG5vdCBsb2FkZWQgaW4gIitNYXRoLnJvdW5kKEEvMUUzKSsiIHNlY29uZHM6ICIrYSl9fShhKSxBKTt0aGlzLmltYWdlPW5ldyBJbWFnZTt2YXIgZD0hMSxjPWUodGhpcy5jb250YWluZXIpLGg9ZSh0aGlzLmltYWdlKSxqPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZD1mdW5jdGlvbigpe2UodGhpcykudW5iaW5kKCJsb2FkIik7YS5vcmlnaW5hbD17aGVpZ2h0OnRoaXMuaGVpZ2h0LHdpZHRoOnRoaXMud2lkdGh9O2EuY2FjaGVbY109YztrLmNsZWFyVGltZW91dChhLnRpZCk7dHlwZW9mIGI9PSJmdW5jdGlvbiImJmsuc2V0VGltZW91dChmdW5jdGlvbigpe2IuY2FsbChhLGEpfSwxKX07IXRoaXMud2lkdGh8fAohdGhpcy5oZWlnaHQ/ay5zZXRUaW1lb3V0KGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbigpe2Eud2lkdGgmJmEuaGVpZ2h0P2QuY2FsbChhKTpHYWxsZXJpYS5yYWlzZSgiQ291bGQgbm90IGV4dHJhY3Qgd2lkdGgvaGVpZ2h0IGZyb20gaW1hZ2U6ICIrYS5zcmMrIi4gVHJhY2VkIG1lYXN1cmVzOiB3aWR0aDoiK2Eud2lkdGgrInB4LCBoZWlnaHQ6ICIrYS5oZWlnaHQrInB4LiIpfX0odGhpcyksMik6ZC5jYWxsKHRoaXMpfX0odGhpcyxiLGEpO2MuZmluZCgiaW1nIikucmVtb3ZlKCk7aC5jc3MoImRpc3BsYXkiLCJibG9jayIpLmFwcGVuZFRvKHRoaXMuY29udGFpbmVyKTtmLmhpZGUodGhpcy5pbWFnZSk7aWYodGhpcy5jYWNoZVthXSlyZXR1cm4gZSh0aGlzLmltYWdlKS5sb2FkKGopLmF0dHIoInNyYyIsYSksdGhpcy5jb250YWluZXI7ZSh0aGlzLmltYWdlKS5sb2FkKGopLmVycm9yKGZ1bmN0aW9uKCl7ZD9CP2UodGhpcykuYXR0cigic3JjIixCKTpHYWxsZXJpYS5yYWlzZSgiSW1hZ2Ugbm90IGZvdW5kOiAiKwphKTooZD0hMCxrLnNldFRpbWVvdXQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXthLmF0dHIoInNyYyIsYisiPyIrZi50aW1lc3RhbXAoKSl9fShlKHRoaXMpLGEpLDUwKSl9KS5hdHRyKCJzcmMiLGEpO3JldHVybiB0aGlzLmNvbnRhaW5lcn0sc2NhbGU6ZnVuY3Rpb24oYSl7YT1lLmV4dGVuZCh7d2lkdGg6MCxoZWlnaHQ6MCxtaW46dm9pZCAwLG1heDp2b2lkIDAsbWFyZ2luOjAsY29tcGxldGU6ZnVuY3Rpb24oKXt9LHBvc2l0aW9uOiJjZW50ZXIiLGNyb3A6ITEsY2FudmFzOiExfSxhKTtpZighdGhpcy5pbWFnZSlyZXR1cm4gdGhpcy5jb250YWluZXI7dmFyIGIsZCxjPXRoaXMsaD1lKGMuY29udGFpbmVyKSxqO2Yud2FpdCh7dW50aWw6ZnVuY3Rpb24oKXtiPWEud2lkdGh8fGgud2lkdGgoKXx8Zi5wYXJzZVZhbHVlKGguY3NzKCJ3aWR0aCIpKTtkPWEuaGVpZ2h0fHxoLmhlaWdodCgpfHxmLnBhcnNlVmFsdWUoaC5jc3MoImhlaWdodCIpKTtyZXR1cm4gYiYmZH0sc3VjY2VzczpmdW5jdGlvbigpe3ZhciBpPQooYi1hLm1hcmdpbioyKS9jLm9yaWdpbmFsLndpZHRoLGc9KGQtYS5tYXJnaW4qMikvYy5vcmlnaW5hbC5oZWlnaHQsaD17InRydWUiOk1hdGgubWF4KGksZyksd2lkdGg6aSxoZWlnaHQ6ZywiZmFsc2UiOk1hdGgubWluKGksZyl9W2EuY3JvcC50b1N0cmluZygpXSxpPSIiO2EubWF4JiYoaD1NYXRoLm1pbihhLm1heCxoKSk7YS5taW4mJihoPU1hdGgubWF4KGEubWluLGgpKTtlLmVhY2goWyJ3aWR0aCIsImhlaWdodCJdLGZ1bmN0aW9uKGEsYil7ZShjLmltYWdlKVtiXShjW2JdPWMuaW1hZ2VbYl09TWF0aC5yb3VuZChjLm9yaWdpbmFsW2JdKmgpKX0pO2UoYy5jb250YWluZXIpLndpZHRoKGIpLmhlaWdodChkKTtpZihhLmNhbnZhcyYmdCl0LmVsZW0ud2lkdGg9Yy53aWR0aCx0LmVsZW0uaGVpZ2h0PWMuaGVpZ2h0LGk9Yy5pbWFnZS5zcmMrIjoiK2Mud2lkdGgrIngiK2MuaGVpZ2h0LGMuaW1hZ2Uuc3JjPXQuY2FjaGVbaV18fGZ1bmN0aW9uKGEpe3QuY29udGV4dC5kcmF3SW1hZ2UoYy5pbWFnZSwKMCwwLGMub3JpZ2luYWwud2lkdGgqaCxjLm9yaWdpbmFsLmhlaWdodCpoKTt0cnl7cmV0dXJuIGo9dC5lbGVtLnRvRGF0YVVSTCgpLHQubGVuZ3RoKz1qLmxlbmd0aCx0LmNhY2hlW2FdPWp9Y2F0Y2goYil7cmV0dXJuIGMuaW1hZ2Uuc3JjfX0oaSk7dmFyIGs9e30sbj17fSxpPWZ1bmN0aW9uKGEsYixkKXt2YXIgaD0wOy9cJS8udGVzdChhKT8oYT1wYXJzZUludChhLDEwKS8xMDAsYj1jLmltYWdlW2JdfHxlKGMuaW1hZ2UpW2JdKCksaD1NYXRoLmNlaWwoYiotMSphK2QqYSkpOmg9Zi5wYXJzZVZhbHVlKGEpO3JldHVybiBofSxtPXt0b3A6e3RvcDowfSxsZWZ0OntsZWZ0OjB9LHJpZ2h0OntsZWZ0OiIxMDAlIn0sYm90dG9tOnt0b3A6IjEwMCUifX07ZS5lYWNoKGEucG9zaXRpb24udG9Mb3dlckNhc2UoKS5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7Yj09PSJjZW50ZXIiJiYoYj0iNTAlIik7a1thPyJ0b3AiOiJsZWZ0Il09Yn0pO2UuZWFjaChrLGZ1bmN0aW9uKGEsYil7bS5oYXNPd25Qcm9wZXJ0eShiKSYmCmUuZXh0ZW5kKG4sbVtiXSl9KTtrPWsudG9wP2UuZXh0ZW5kKGssbik6bjtrPWUuZXh0ZW5kKHt0b3A6IjUwJSIsbGVmdDoiNTAlIn0sayk7ZShjLmltYWdlKS5jc3Moe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOmkoay50b3AsImhlaWdodCIsZCksbGVmdDppKGsubGVmdCwid2lkdGgiLGIpfSk7Yy5zaG93KCk7Yy5yZWFkeT0hMDthLmNvbXBsZXRlLmNhbGwoYyxjKX0sZXJyb3I6ZnVuY3Rpb24oKXtHYWxsZXJpYS5yYWlzZSgiQ291bGQgbm90IHNjYWxlIGltYWdlOiAiK2MuaW1hZ2Uuc3JjKX0sdGltZW91dDoxRTN9KTtyZXR1cm4gdGhpc319O2UuZXh0ZW5kKGUuZWFzaW5nLHtnYWxsZXJpYTpmdW5jdGlvbihhLGIsZCxjLGUpe3JldHVybihiLz1lLzIpPDE/Yy8yKmIqYipiK2Q6Yy8yKigoYi09MikqYipiKzIpK2R9LGdhbGxlcmlhSW46ZnVuY3Rpb24oYSxiLGQsYyxlKXtyZXR1cm4gYyooYi89ZSkqYitkfSxnYWxsZXJpYU91dDpmdW5jdGlvbihhLGIsZCxjLGUpe3JldHVybi1jKgooYi89ZSkqKGItMikrZH19KTtlLmZuLmdhbGxlcmlhPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtlKHRoaXMpLmRhdGEoImdhbGxlcmlhIiwobmV3IEdhbGxlcmlhKS5pbml0KHRoaXMsYSkpfSl9fSkoalF1ZXJ5KTsK]]></data>
	</file>
	<file>
	  <filename>/script/plugins/galleria/LICENSE</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[VGhlIE1JVCBMaWNlbnNlCgpDb3B5cmlnaHQgKGMpIDIwMTEgQWlubyBodHRwOi8vYWluby5zZQoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgphbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOClRIRSBTT0ZUV0FSRS4=]]></data>
	</file>
	<file>
	  <filename>/script/plugins/galleria/plugins/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/script/plugins/galleria/plugins/flickr/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/script/plugins/galleria/plugins/flickr/flickr-demo.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KICAgIDxoZWFkPgogICAgICAgIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICAgICAgICA8dGl0bGU+R2FsbGVyaWEgRmxpY2tyIFBsdWdpbjwvdGl0bGU+CiAgICAgICAgPHN0eWxlPgoKICAgICAgICAgICAgLyogRGVtbyBzdHlsZXMgKi8KICAgICAgICAgICAgaHRtbCxib2R5e2JhY2tncm91bmQ6IzIyMjttYXJnaW46MDt9CiAgICAgICAgICAgIGJvZHl7Ym9yZGVyLXRvcDo0cHggc29saWQgIzAwMDt9CiAgICAgICAgICAgIC5jb250ZW50e2NvbG9yOiM3Nzc7Zm9udDoxMnB4LzEuNCAiaGVsdmV0aWNhIG5ldWUiLGFyaWFsLHNhbnMtc2VyaWY7d2lkdGg6NjIwcHg7bWFyZ2luOjIwcHggYXV0bzt9CiAgICAgICAgICAgIGgxe2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0Om5vcm1hbDtjb2xvcjojZGRkO21hcmdpbjowO30KICAgICAgICAgICAgcHttYXJnaW46MCAwIDIwcHh9CiAgICAgICAgICAgIGEge2NvbG9yOiMyMkJDQjk7dGV4dC1kZWNvcmF0aW9uOm5vbmU7fQogICAgICAgICAgICAuY3JlZHttYXJnaW4tdG9wOjIwcHg7Zm9udC1zaXplOjExcHg7fQoKICAgICAgICAgICAgLyogVGhpcyBydWxlIGlzIHJlYWQgYnkgR2FsbGVyaWEgdG8gZGVmaW5lIHRoZSBnYWxsZXJ5IGhlaWdodDogKi8KICAgICAgICAgICAgI2dhbGxlcmlhe2hlaWdodDozMjBweDt9CgogICAgICAgIDwvc3R5bGU+CgogICAgICAgIDwhLS0gbG9hZCBqUXVlcnkgLS0+CiAgICAgICAgPHNjcmlwdCBzcmM9Imh0dHA6Ly9hamF4Lmdvb2dsZWFwaXMuY29tL2FqYXgvbGlicy9qcXVlcnkvMS9qcXVlcnkubWluLmpzIj48L3NjcmlwdD4KCiAgICAgICAgPCEtLSBsb2FkIEdhbGxlcmlhIC0tPgogICAgICAgIDxzY3JpcHQgc3JjPSIuLi8uLi9nYWxsZXJpYS0xLjIuNi5taW4uanMiPjwvc2NyaXB0PgoKICAgICAgICA8IS0tIGxvYWQgZmxpY2tyIHBsdWdpbiAtLT4KICAgICAgICA8c2NyaXB0IHNyYz0iZ2FsbGVyaWEuZmxpY2tyLm1pbi5qcyI+PC9zY3JpcHQ+CgogICAgPC9oZWFkPgo8Ym9keT4KICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgogICAgICAgIDxoMT5HYWxsZXJpYSBGbGlja3IgUGx1Z2luIERlbW88L2gxPgogICAgICAgIDxwPkRlbW9uc3RyYXRpbmcgYSBiYXNpYyBnYWxsZXJ5IGV4YW1wbGUgd2l0aCBhIEZsaWNrciBzZWFyY2guPC9wPgoKICAgICAgICA8IS0tIEFkZGluZyBnYWxsZXJ5IGltYWdlcy4gVGhpcyBpcyBqdXN0IGEgY29udGFpbmVyIGZvciB0aGUgZHluYW1pYyBmbGlja3IgaW1hZ2VzIC0tPgoKICAgICAgICA8ZGl2IGlkPSJnYWxsZXJpYSI+PC9kaXY+CgogICAgICAgIDxwIGNsYXNzPSJjcmVkIj5NYWRlIGJ5IDxhIGhyZWY9Imh0dHA6Ly9nYWxsZXJpYS5haW5vLnNlIj5HYWxsZXJpYTwvYT4uPC9wPgogICAgPC9kaXY+CiAgICA8c2NyaXB0PgoKICAgIC8vIExvYWQgdGhlIGNsYXNzaWMgdGhlbWUKICAgIEdhbGxlcmlhLmxvYWRUaGVtZSgnLi4vLi4vdGhlbWVzL2NsYXNzaWMvZ2FsbGVyaWEuY2xhc3NpYy5taW4uanMnKTsKCiAgICAvLyBJbml0aWFsaXplIEdhbGxlcmlhCiAgICAkKCcjZ2FsbGVyaWEnKS5nYWxsZXJpYSh7CiAgICAgICAgZmxpY2tyOiAnc2VhcmNoOmNpdHlzY2FwZScsCiAgICAgICAgZmxpY2tyT3B0aW9uczogewogICAgICAgICAgICBzb3J0OiAnaW50ZXJlc3RpbmduZXNzLWRlc2MnCiAgICAgICAgfQogICAgfSk7CgogICAgPC9zY3JpcHQ+CiAgICA8L2JvZHk+CjwvaHRtbD4=]]></data>
	</file>
	<file>
	  <filename>/script/plugins/galleria/plugins/flickr/flickr-loader.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhGAAMANUvALcAX3AAOh0AD7AAWwArYeoAeQALGQBEmABHngBbygAWMTkAHrAfn09EwbccnXA4tUhHw48rqxVb1eoIi+ILjsYWmDlNyB1Y0uoEgQ9b0qILbbcDZhAraUJHwAlbz3AGSAhHonAzq7ADYx0mZeoGhpwLah0/m2MLTIMrpB08lglEnLcamP8AhABj3AAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAAAvACwAAAAAGAAMAAAGSUCXcCgUBACFAiAgIDqfiwFrSh0snliBlModNLHEAHfMCoCJADIXcB4W1NRCW/iGs+TztJ09F9vNc1pwXnNCUWRWhUNGSEpMYEEAIfkECQAALwAsAAAAABgADAAABlpAl3DoMhBMoRUJswkIiFCi4mBhsK7YwSIKNRwuVqx48OQKCa2HeM0KmIWIloMtBrxdidaEji3c83t8LH5vcXOCdm9oaoJub15gfGR3LlNVbFqUQkZISkxOXEEAIfkECQAALwAsAAAAABgADAAABmRAl1BoICASCcToAygUAAHBcCpUHFrYloXB6noHCyrxmr1wveiBlErIYh/oOCsgRrhbDjkaIE7cJ3peBX1/gV2DVHZueYZ8bHdwhnRUBmRYZoFqYi5WbltyYJtERkhKTE5Qa0NBACH5BAkAAC8ALAAAAAAYAAwAAAZtQJfQQEAkEgiCQSgIAAoFQEAgrCoOraz2oFgMWODwYFE1YLXolCjMZg2oLgJ6/mi3A0LEHO2wswFCCXtaE35hBYGDWYWGLIgueop9jYBxii11jXguZopqhm9WZ2hcXnZjVUNFR0lLLk1PUVNVQQAh+QQJCgAvACwAAAAAGAAMAAAGcUCXy0BAJBIIgkEoFAQAhQIgIGAqDq2s9qAQLgassHiwGGK16INBABa7BwICet4iBNx4VgBBRyMAeW4ACX1aCQWBYgWEhS2HiWEFfI1/kCwAco12lgEGZ3RqbIlwLlegXS5feWRMREZISkwuTlBSVEJBACH5BAkAAC8ALAAAAAAYAAwAAAZtQJfQQEAkEgiCQSgIAAoFQEAgrCoOraz2oFgMWODwYFE1YLVoVSnMZg2oLgJ63oq02QEhgo6G3MMAQgl8WhJ/YAWChFmGh4kue4t+h4Fxi3WHLHkuZoRqh29WZ2hcXndjVUNFR0lLLk1PUVNVQQAh+QQJAAAvACwAAAAAGAAMAAAGZECXUGggIBIJBOcEKBQAAcFwKlQcWthso8LqsgYLKvGaLTco3q+USii7W5E0KyBGvMsQOUCcuGclcgV8fliAaYJUdoR5aXtshHBydFQGZG9naQNrVFaXXF5gYkNFR0lLTU9RVEEAIfkECQAALwAsAAAAABgADAAABlpAl3DoMhBAnkwHpQkIiFCi4tCqWhuVwSIKNVCt4AZl8OQKCeB0K8IKmIUINRjCArxdCblVwirc83otfH5vcYF0dm9ogWxub156YmR3LlNqWFqUQkZISkxOXEEAIfkECQAALwAsAAAAABgADAAABklAl3AoNBAQiQSCYCA6n4pDa0o9KJ5Yg5TKPTSxRAJ33CKAiQgyF3EeJtTURFv4hrfk87SdPRfbzXNacF5zQlFkVoVDRkhKTGBBACH5BAkAAC8ALAAAAAAYAAwAAAZaQJdw6BIENKhOxgMiGIhQ4mJQabSu2IMiChUMKFas+PDkCgOsiHjdIpiFABaELUa8XQWWhI5N3PN7fC1+b3FzgnZvaGqCbm9eYHxkdy5TVWxalEJGSEpMTlxBACH5BAkAAC8ALAAAAAAYAAwAAAZkQJdQKAgACgXAiYNIJBAEw3AqXAxYWFal0ep6Dwoq8ZqlcL3og5QayGIj6HiLIAa4WRA5GiEu3CV6Xgl9f4Fdg1R2bnmGfGx3cIZ0VAJkWGaBamIuVm5bcmCbREZISkxOUGtDQQAh+QQJAAAvACwAAAAAGAAMAAAGbUCXUBAAFAqAgEBoICASCQTBIKwuBqysdrBQHFrg8EFRFWC16JIqzG4dqK4Aeh5ptwlCwBwNsbMRQgV7WhJ+YQmBg1mFhi2ILnqKfY2AcYosdY14LmaKaoZvVmdoXF52Y1VDRUdJSy5NT1FTVUEAIfkECQoALwAsAAAAABgADAAABnFAl0sQABQKgIBAKDQQEIkEgmBgLgasrHawECoOrbD4oBhiteiBwAAWuw+GAHrOChDc+BYBQEcDEHluCAV9WgUJgWIJhIUsh4lhCXyNf5AtCHKNdpYEAmd0amyJcC5XoF0uX3lkTERGSEpMLk5QUlRCQQAh+QQJAAAvACwAAAAAGAAMAAAGbUCXUBAAFAqAgEBoICASCQTBIKwuBqysdrBQHFrg8EFRFWC1aFEqzG4dqK4Aes56tNkEIYCOdtzDCEIFfFoTf2AJgoRZhoeJLnuLfoeBcYt1hy15LmaEaodvVmdoXF53Y1VDRUdJSy5NT1FTVUEAIfkECQAALwAsAAAAABgADAAABmRAl1AoCAAKBcBnhEgkEATDcCpcDFjYLMPS6rYOCirxmi0zLt6vlBoou1mPdIsgBrzLDjlCXLhnJ3IJfH5YgGmCVHaEeWl7bIRwcnRUAmRvZ2kHa1RWl1xeYGJDRUdJS01PUVRBACH5BAkAAC8ALAAAAAAYAAwAAAZaQJdw6BIENhjSKmQiGIhQ4mLAqloZloMiChVQrWDG5fDkCgPgNOvRIpiFADXY0UK8XQW5ddJK3PN6LHx+b3GBdHZvaIFsbm9eemJkdy5TalhalEJGSEpMTlxBADs=]]></data>
	</file>
	<file>
	  <filename>/script/plugins/galleria/plugins/flickr/galleria.flickr.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIEBwcmVzZXJ2ZSBHYWxsZXJpYSBGbGlja3IgUGx1Z2luIDIwMTEtMDgtMDEKICogaHR0cDovL2dhbGxlcmlhLmFpbm8uc2UKICoKICogQ29weXJpZ2h0IDIwMTEsIEFpbm8KICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLgogKi8KCi8qZ2xvYmFsIGpRdWVyeSwgR2FsbGVyaWEsIHdpbmRvdyAqLwoKR2FsbGVyaWEucmVxdWlyZXMoMS4yNSwgJ1RoZSBGbGlja3IgUGx1Z2luIHJlcXVpcmVzIEdhbGxlcmlhIHZlcnNpb24gMS4yLjUgb3IgbGF0ZXIuJyk7CgooZnVuY3Rpb24oJCkgewoKLy8gVGhlIHNjcmlwdCBwYXRoCnZhciBQQVRIID0gR2FsbGVyaWEudXRpbHMuZ2V0U2NyaXB0UGF0aCgpOwoKLyoqCgogICAgQGNsYXNzCiAgICBAY29uc3RydWN0b3IKCiAgICBAZXhhbXBsZSB2YXIgZmxpY2tyID0gbmV3IEdhbGxlcmlhLkZsaWNrcigpOwoKICAgIEBhdXRob3IgaHR0cDovL2Fpbm8uc2UKCiAgICBAcmVxdWlyZXMgalF1ZXJ5CiAgICBAcmVxdWlyZXMgR2FsbGVyaWEKCiAgICBAcGFyYW0ge1N0cmluZ30gW2FwaV9rZXldIEZsaWNrciBBUEkga2V5IHRvIGJlIHVzZWQsIGRlZmF1bHRzIHRvIHRoZSBHYWxsZXJpYSBrZXkKCiAgICBAcmV0dXJucyBJbnN0YW5jZQoqLwoKR2FsbGVyaWEuRmxpY2tyID0gZnVuY3Rpb24oIGFwaV9rZXkgKSB7CgogICAgdGhpcy5hcGlfa2V5ID0gYXBpX2tleSB8fCAnMmEyY2UwNmMxNTc4MGViZWIwYjcwNjY1MGZjODkwYjInOwoKICAgIHRoaXMub3B0aW9ucyA9IHsKICAgICAgICBtYXg6IDMwLCAgICAgICAgICAgICAgICAgICAgICAgLy8gcGhvdG9zIHRvIHJldHVybgogICAgICAgIGltYWdlU2l6ZTogJ21lZGl1bScsICAgICAgICAgICAvLyBwaG90byBzaXplICggdGh1bWIsc21hbGwsbWVkaXVtLGJpZyxvcmlnaW5hbCApCiAgICAgICAgdGh1bWJTaXplOiAndGh1bWInLCAgICAgICAgICAgIC8vIHRodW1ibmFpbCBzaXplICggdGh1bWIsc21hbGwsbWVkaXVtLGJpZyxvcmlnaW5hbCApCiAgICAgICAgc29ydDogJ2ludGVyZXN0aW5nbmVzcy1kZXNjJywgIC8vIHNvcnQgb3B0aW9uICggZGF0ZS1wb3N0ZWQtYXNjLCBkYXRlLXBvc3RlZC1kZXNjLCBkYXRlLXRha2VuLWFzYywgZGF0ZS10YWtlbi1kZXNjLCBpbnRlcmVzdGluZ25lc3MtZGVzYywgaW50ZXJlc3RpbmduZXNzLWFzYywgcmVsZXZhbmNlICkKICAgICAgICBkZXNjcmlwdGlvbjogZmFsc2UsICAgICAgICAgICAgLy8gc2V0IHRoaXMgdG8gdHJ1ZSB0byBnZXQgZGVzY3JpcHRpb24gYXMgY2FwdGlvbgogICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbigpe30sICAgICAgICAvLyBjYWxsYmFjayB0byBiZSBjYWxsZWQgaW5zaWRlIHRoZSBHYWxsZXJpYS5wcm90b3R5cGUubG9hZAogICAgICAgIGJhY2tsaW5rOiBmYWxzZSAgICAgICAgICAgICAgICAvLyBzZXQgdGhpcyB0byB0cnVlIGlmIHlvdSB3YW50IHRvIHBhc3MgYSBsaW5rIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGltYWdlCiAgICB9Owp9OwoKR2FsbGVyaWEuRmxpY2tyLnByb3RvdHlwZSA9IHsKCiAgICAvLyBicmluZyBiYWNrIHRoZSBjb25zdHJ1Y3RvciByZWZlcmVuY2UKCiAgICBjb25zdHJ1Y3RvcjogR2FsbGVyaWEuRmxpY2tyLAoKICAgIC8qKgogICAgICAgIFNlYXJjaCBmb3IgYW55dGhpbmcgYXQgRmxpY2tyCgogICAgICAgIEBwYXJhbSB7U3RyaW5nfSBwaHJhc2UgVGhlIHN0cmluZyB0byBzZWFyY2ggZm9yCiAgICAgICAgQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSBUaGUgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGRhdGEgaXMgcmVhZHkKCiAgICAgICAgQHJldHVybnMgSW5zdGFuY2UKICAgICovCgogICAgc2VhcmNoOiBmdW5jdGlvbiggcGhyYXNlLCBjYWxsYmFjayApIHsKICAgICAgICByZXR1cm4gdGhpcy5fZmluZCh7CiAgICAgICAgICAgIHRleHQ6IHBocmFzZQogICAgICAgIH0sIGNhbGxiYWNrICk7CiAgICB9LAoKICAgIC8qKgogICAgICAgIFNlYXJjaCBmb3IgYW55dGhpbmcgYXQgRmxpY2tyIGJ5IHRhZwoKICAgICAgICBAcGFyYW0ge1N0cmluZ30gdGFnIFRoZSB0YWcocykgdG8gc2VhcmNoIGZvcgogICAgICAgIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFja10gVGhlIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBkYXRhIGlzIHJlYWR5CgogICAgICAgIEByZXR1cm5zIEluc3RhbmNlCiAgICAqLwoKICAgIHRhZ3M6IGZ1bmN0aW9uKCB0YWcsIGNhbGxiYWNrICkgewogICAgICAgIHJldHVybiB0aGlzLl9maW5kKHsKICAgICAgICAgICAgdGFnczogdGFnCiAgICAgICAgfSwgY2FsbGJhY2spOwogICAgfSwKCiAgICAvKioKICAgICAgICBHZXQgYSB1c2VyJ3MgcHVibGljIHBob3RvcwoKICAgICAgICBAcGFyYW0ge1N0cmluZ30gdXNlcm5hbWUgVGhlIHVzZXJuYW1lIGFzIHNob3duIGluIHRoZSBVUkwgdG8gZmV0Y2gKICAgICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2tdIFRoZSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZGF0YSBpcyByZWFkeQoKICAgICAgICBAcmV0dXJucyBJbnN0YW5jZQogICAgKi8KCiAgICB1c2VyOiBmdW5jdGlvbiggdXNlcm5hbWUsIGNhbGxiYWNrICkgewogICAgICAgIHJldHVybiB0aGlzLl9jYWxsKHsKICAgICAgICAgICAgbWV0aG9kOiAnZmxpY2tyLnVybHMubG9va3VwVXNlcicsCiAgICAgICAgICAgIHVybDogJ2ZsaWNrci5jb20vcGhvdG9zLycgKyB1c2VybmFtZQogICAgICAgIH0sIGZ1bmN0aW9uKCBkYXRhICkgewogICAgICAgICAgICB0aGlzLl9maW5kKHsKICAgICAgICAgICAgICAgIHVzZXJfaWQ6IGRhdGEudXNlci5pZCwKICAgICAgICAgICAgICAgIG1ldGhvZDogJ2ZsaWNrci5wZW9wbGUuZ2V0UHVibGljUGhvdG9zJwogICAgICAgICAgICB9LCBjYWxsYmFjayk7CiAgICAgICAgfSk7CiAgICB9LAoKICAgIC8qKgogICAgICAgIEdldCBwaG90b3MgZnJvbSBhIHBob3Rvc2V0IGJ5IElECgogICAgICAgIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gcGhvdG9zZXRfaWQgVGhlIHBob3Rvc2V0IGlkIHRvIGZldGNoCiAgICAgICAgQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSBUaGUgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGRhdGEgaXMgcmVhZHkKCiAgICAgICAgQHJldHVybnMgSW5zdGFuY2UKICAgICovCgogICAgc2V0OiBmdW5jdGlvbiggcGhvdG9zZXRfaWQsIGNhbGxiYWNrICkgewogICAgICAgIHJldHVybiB0aGlzLl9maW5kKHsKICAgICAgICAgICAgcGhvdG9zZXRfaWQ6IHBob3Rvc2V0X2lkLAogICAgICAgICAgICBtZXRob2Q6ICdmbGlja3IucGhvdG9zZXRzLmdldFBob3RvcycKICAgICAgICB9LCBjYWxsYmFjayk7CiAgICB9LAoKICAgIC8qKgogICAgICAgIEdldCBwaG90b3MgZnJvbSBhIGdhbGxlcnkgYnkgSUQKCiAgICAgICAgQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSBnYWxsZXJ5X2lkIFRoZSBnYWxsZXJ5IGlkIHRvIGZldGNoCiAgICAgICAgQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSBUaGUgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGRhdGEgaXMgcmVhZHkKCiAgICAgICAgQHJldHVybnMgSW5zdGFuY2UKICAgICovCgogICAgZ2FsbGVyeTogZnVuY3Rpb24oIGdhbGxlcnlfaWQsIGNhbGxiYWNrICkgewogICAgICAgIHJldHVybiB0aGlzLl9maW5kKHsKICAgICAgICAgICAgZ2FsbGVyeV9pZDogZ2FsbGVyeV9pZCwKICAgICAgICAgICAgbWV0aG9kOiAnZmxpY2tyLmdhbGxlcmllcy5nZXRQaG90b3MnCiAgICAgICAgfSwgY2FsbGJhY2spOwogICAgfSwKCiAgICAvKioKICAgICAgICBTZWFyY2ggZ3JvdXBzIGFuZCBmZXRjaCBwaG90b3MgZnJvbSB0aGUgZmlyc3QgZ3JvdXAgZm91bmQKICAgICAgICBVc2VmdWwgaWYgeW91IGtub3cgdGhlIGV4YWN0IG5hbWUgb2YgYSBncm91cCBhbmQgd2FudCB0byBzaG93IHRoZSBncm91cHMgcGhvdG9zLgoKICAgICAgICBAcGFyYW0ge1N0cmluZ30gZ3JvdXAgVGhlIGdyb3VwIG5hbWUgdG8gc2VhcmNoIGZvcgogICAgICAgIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFja10gVGhlIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBkYXRhIGlzIHJlYWR5CgogICAgICAgIEByZXR1cm5zIEluc3RhbmNlCiAgICAqLwoKICAgIGdyb3Vwc2VhcmNoOiBmdW5jdGlvbiggZ3JvdXAsIGNhbGxiYWNrICkgewogICAgICAgIHJldHVybiB0aGlzLl9jYWxsKHsKICAgICAgICAgICAgdGV4dDogZ3JvdXAsCiAgICAgICAgICAgIG1ldGhvZDogJ2ZsaWNrci5ncm91cHMuc2VhcmNoJwogICAgICAgIH0sIGZ1bmN0aW9uKCBkYXRhICkgewogICAgICAgICAgICB0aGlzLmdyb3VwKCBkYXRhLmdyb3Vwcy5ncm91cFswXS5uc2lkLCBjYWxsYmFjayApOwogICAgICAgIH0pOwogICAgfSwKCiAgICAvKioKICAgICAgICBHZXQgcGhvdG9zIGZyb20gYSBncm91cCBieSBJRAoKICAgICAgICBAcGFyYW0ge1N0cmluZ30gZ3JvdXBfaWQgVGhlIGdyb3VwIGlkIHRvIGZldGNoCiAgICAgICAgQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSBUaGUgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGRhdGEgaXMgcmVhZHkKCiAgICAgICAgQHJldHVybnMgSW5zdGFuY2UKICAgICovCgogICAgZ3JvdXA6IGZ1bmN0aW9uICggZ3JvdXBfaWQsIGNhbGxiYWNrICkgewogICAgICAgIHJldHVybiB0aGlzLl9maW5kKHsKICAgICAgICAgICAgZ3JvdXBfaWQ6IGdyb3VwX2lkLAogICAgICAgICAgICBtZXRob2Q6ICdmbGlja3IuZ3JvdXBzLnBvb2xzLmdldFBob3RvcycKICAgICAgICB9LCBjYWxsYmFjayApOwogICAgfSwKCiAgICAvKioKICAgICAgICBTZXQgZmxpY2tyIG9wdGlvbnMKCiAgICAgICAgQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgVGhlIG9wdGlvbnMgb2JqZWN0IHRvIGJsZW5kCgogICAgICAgIEByZXR1cm5zIEluc3RhbmNlCiAgICAqLwoKICAgIHNldE9wdGlvbnM6IGZ1bmN0aW9uKCBvcHRpb25zICkgewogICAgICAgICQuZXh0ZW5kKHRoaXMub3B0aW9ucywgb3B0aW9ucyk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAoKCiAgICAvLyBjYWxsIEZsaWNrciBhbmQgcmFpc2UgZXJyb3JzCgogICAgX2NhbGw6IGZ1bmN0aW9uKCBwYXJhbXMsIGNhbGxiYWNrICkgewoKICAgICAgICB2YXIgdXJsID0gJ2h0dHA6Ly9hcGkuZmxpY2tyLmNvbS9zZXJ2aWNlcy9yZXN0Lz8nOwoKICAgICAgICB2YXIgc2NvcGUgPSB0aGlzOwoKICAgICAgICBwYXJhbXMgPSAkLmV4dGVuZCh7CiAgICAgICAgICAgIGZvcm1hdCA6ICdqc29uJywKICAgICAgICAgICAganNvbmNhbGxiYWNrIDogJz8nLAogICAgICAgICAgICBhcGlfa2V5OiB0aGlzLmFwaV9rZXkKICAgICAgICB9LCBwYXJhbXMgKTsKCiAgICAgICAgJC5lYWNoKHBhcmFtcywgZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CiAgICAgICAgICAgIHVybCArPSAnJicgKyBrZXkgKyAnPScgKyB2YWx1ZTsKICAgICAgICB9KTsKCiAgICAgICAgJC5nZXRKU09OKHVybCwgZnVuY3Rpb24oZGF0YSkgewogICAgICAgICAgICBpZiAoIGRhdGEuc3RhdCA9PT0gJ29rJyApIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwoc2NvcGUsIGRhdGEpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgR2FsbGVyaWEucmFpc2UoIGRhdGEuY29kZS50b1N0cmluZygpICsgJyAnICsgZGF0YS5zdGF0ICsgJzogJyArIGRhdGEubWVzc2FnZSwgdHJ1ZSApOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHNjb3BlOwogICAgfSwKCgogICAgLy8gImhpZGRlbiIgd2F5IG9mIGdldHRpbmcgYSBiaWcgaW1hZ2UgKH4xMDI0KSBmcm9tIGZsaWNrcgoKICAgIF9nZXRCaWc6IGZ1bmN0aW9uKCBwaG90byApIHsKCiAgICAgICAgaWYgKCBwaG90by51cmxfbCApIHsKICAgICAgICAgICAgcmV0dXJuIHBob3RvLnVybF9sOwogICAgICAgIH0gZWxzZSBpZiAoIHBhcnNlSW50KCBwaG90by53aWR0aF9vLCAxMCApID4gMTI4MCApIHsKCiAgICAgICAgICAgIHJldHVybiAnaHR0cDovL2Zhcm0nK3Bob3RvLmZhcm0gKyAnLnN0YXRpYy5mbGlja3IuY29tLycrcGhvdG8uc2VydmVyICsKICAgICAgICAgICAgICAgICcvJyArIHBob3RvLmlkICsgJ18nICsgcGhvdG8uc2VjcmV0ICsgJ19iLmpwZyc7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcGhvdG8udXJsX28gfHwgcGhvdG8udXJsX3ogfHwgcGhvdG8udXJsX207CgogICAgfSwKCgogICAgLy8gZ2V0IGltYWdlIHNpemUgYnkgb3B0aW9uIG5hbWUKCiAgICBfZ2V0U2l6ZTogZnVuY3Rpb24oIHBob3RvLCBzaXplICkgewoKICAgICAgICB2YXIgaW1nOwoKICAgICAgICBzd2l0Y2goc2l6ZSkgewoKICAgICAgICAgICAgY2FzZSAndGh1bWInOgogICAgICAgICAgICAgICAgaW1nID0gcGhvdG8udXJsX3Q7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgJ3NtYWxsJzoKICAgICAgICAgICAgICAgIGltZyA9IHBob3RvLnVybF9zOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICdiaWcnOgogICAgICAgICAgICAgICAgaW1nID0gdGhpcy5fZ2V0QmlnKCBwaG90byApOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICdvcmlnaW5hbCc6CiAgICAgICAgICAgICAgICBpbWcgPSBwaG90by51cmxfbyA/IHBob3RvLnVybF9vIDogdGhpcy5fZ2V0QmlnKCBwaG90byApOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgaW1nID0gcGhvdG8udXJsX3ogfHwgcGhvdG8udXJsX207CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGltZzsKICAgIH0sCgoKICAgIC8vIGFzayBmbGlja3IgZm9yIHBob3RvcywgcGFyc2UgdGhlIHJlc3VsdCBhbmQgY2FsbCB0aGUgY2FsbGJhY2sgd2l0aCB0aGUgZ2FsbGVyaWEtcmVhZHkgZGF0YSBhcnJheQoKICAgIF9maW5kOiBmdW5jdGlvbiggcGFyYW1zLCBjYWxsYmFjayApIHsKCiAgICAgICAgcGFyYW1zID0gJC5leHRlbmQoewogICAgICAgICAgICBtZXRob2Q6ICdmbGlja3IucGhvdG9zLnNlYXJjaCcsCiAgICAgICAgICAgIGV4dHJhczogJ3VybF90LHVybF9tLHVybF9vLHVybF9zLHVybF9sLHVybF96LGRlc2NyaXB0aW9uJywKICAgICAgICAgICAgc29ydDogdGhpcy5vcHRpb25zLnNvcnQKICAgICAgICB9LCBwYXJhbXMgKTsKCiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGwoIHBhcmFtcywgZnVuY3Rpb24oZGF0YSkgewoKICAgICAgICAgICAgdmFyIGdhbGxlcnkgPSBbXSwKICAgICAgICAgICAgICAgIHBob3RvcyA9IGRhdGEucGhvdG9zID8gZGF0YS5waG90b3MucGhvdG8gOiBkYXRhLnBob3Rvc2V0LnBob3RvLAogICAgICAgICAgICAgICAgbGVuID0gTWF0aC5taW4oIHRoaXMub3B0aW9ucy5tYXgsIHBob3Rvcy5sZW5ndGggKSwKICAgICAgICAgICAgICAgIHBob3RvLAogICAgICAgICAgICAgICAgaTsKCiAgICAgICAgICAgIGZvciAoIGk9MDsgaTxsZW47IGkrKyApIHsKCiAgICAgICAgICAgICAgICBwaG90byA9IHBob3Rvc1tpXTsKCiAgICAgICAgICAgICAgICBnYWxsZXJ5LnB1c2goewogICAgICAgICAgICAgICAgICAgIHRodW1iOiB0aGlzLl9nZXRTaXplKCBwaG90bywgdGhpcy5vcHRpb25zLnRodW1iU2l6ZSApLAogICAgICAgICAgICAgICAgICAgIGltYWdlOiB0aGlzLl9nZXRTaXplKCBwaG90bywgdGhpcy5vcHRpb25zLmltYWdlU2l6ZSApLAogICAgICAgICAgICAgICAgICAgIGJpZzogdGhpcy5fZ2V0QmlnKCBwaG90byApLAogICAgICAgICAgICAgICAgICAgIHRpdGxlOiBwaG90b3NbaV0udGl0bGUsCiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHRoaXMub3B0aW9ucy5kZXNjcmlwdGlvbiAmJiBwaG90b3NbaV0uZGVzY3JpcHRpb24gPyBwaG90b3NbaV0uZGVzY3JpcHRpb24uX2NvbnRlbnQgOiAnJywKICAgICAgICAgICAgICAgICAgICBsaW5rOiB0aGlzLm9wdGlvbnMuYmFja2xpbmsgPyAnaHR0cDovL2ZsaWNrci5jb20vcGhvdG9zLycgKyBwaG90by5vd25lciArICcvJyArIHBob3RvLmlkIDogJycKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwoIHRoaXMsIGdhbGxlcnkgKTsKICAgICAgICB9KTsKICAgIH0KfTsKCgovKioKICAgIEdhbGxlcmlhIG1vZGlmaWNhdGlvbnMKICAgIFdlIGZha2UtZXh0ZW5kIHRoZSBsb2FkIHByb3RvdHlwZSB0byBtYWtlIEZsaWNrciBpbnRlZ3JhdGlvbiBhcyBzaW1wbGUgYXMgcG9zc2libGUKKi8KCgovLyBzYXZlIHRoZSBvbGQgcHJvdG90eXBlIGluIGEgbG9jYWwgdmFyaWFibGUKCnZhciBsb2FkID0gR2FsbGVyaWEucHJvdG90eXBlLmxvYWQ7CgoKLy8gZmFrZS1leHRlbmQgdGhlIGxvYWQgcHJvdG90eXBlIHVzaW5nIHRoZSBmbGlja3IgZGF0YQoKR2FsbGVyaWEucHJvdG90eXBlLmxvYWQgPSBmdW5jdGlvbigpIHsKCiAgICAvLyBwYXNzIGlmIG5vIGRhdGEgaXMgcHJvdmlkZWQgb3IgZmxpY2tyIG9wdGlvbiBub3QgZm91bmQKICAgIGlmICggYXJndW1lbnRzLmxlbmd0aCB8fCB0eXBlb2YgdGhpcy5fb3B0aW9ucy5mbGlja3IgIT09ICdzdHJpbmcnICkgewogICAgICAgIGxvYWQuYXBwbHkoIHRoaXMsIEdhbGxlcmlhLnV0aWxzLmFycmF5KCBhcmd1bWVudHMgKSApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBkZWZpbmUgc29tZSBsb2NhbCB2YXJzCiAgICB2YXIgc2VsZiA9IHRoaXMsCiAgICAgICAgYXJncyA9IEdhbGxlcmlhLnV0aWxzLmFycmF5KCBhcmd1bWVudHMgKSwKICAgICAgICBmbGlja3IgPSB0aGlzLl9vcHRpb25zLmZsaWNrci5zcGxpdCgnOicpLAogICAgICAgIGYsCiAgICAgICAgb3B0cyA9ICQuZXh0ZW5kKHt9LCBzZWxmLl9vcHRpb25zLmZsaWNrck9wdGlvbnMpLAogICAgICAgIGxvYWRlciA9IHR5cGVvZiBvcHRzLmxvYWRlciAhPT0gJ3VuZGVmaW5lZCcgPwogICAgICAgICAgICBvcHRzLmxvYWRlciA6ICQoJzxkaXY+JykuY3NzKHsKICAgICAgICAgICAgICAgIHdpZHRoOiA0OCwKICAgICAgICAgICAgICAgIGhlaWdodDogNDgsCiAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLjcsCiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOicjMDAwIHVybCgnK1BBVEgrJ2xvYWRlci5naWYpIG5vLXJlcGVhdCA1MCUgNTAlJwogICAgICAgICAgICB9KTsKCiAgICBpZiAoIGZsaWNrci5sZW5ndGggKSB7CgogICAgICAgIC8vIHZhbGlkYXRlIHRoZSBtZXRob2QKICAgICAgICBpZiAoIHR5cGVvZiBHYWxsZXJpYS5GbGlja3IucHJvdG90eXBlWyBmbGlja3JbMF0gXSAhPT0gJ2Z1bmN0aW9uJyApIHsKICAgICAgICAgICAgR2FsbGVyaWEucmFpc2UoIGZsaWNrclswXSArICcgbWV0aG9kIG5vdCBmb3VuZCBpbiBGbGlja3IgcGx1Z2luJyApOwogICAgICAgICAgICByZXR1cm4gbG9hZC5hcHBseSggdGhpcywgYXJncyApOwogICAgICAgIH0KCiAgICAgICAgLy8gdmFsaWRhdGUgdGhlIGFyZ3VtZW50CiAgICAgICAgaWYgKCAhZmxpY2tyWzFdICkgewogICAgICAgICAgICBHYWxsZXJpYS5yYWlzZSggJ05vIGZsaWNrciBhcmd1bWVudCBmb3VuZCcgKTsKICAgICAgICAgICAgcmV0dXJuIGxvYWQuYXBwbHkoIHRoaXMsIGFyZ3MgKTsKICAgICAgICB9CgogICAgICAgIC8vIGFwcGx5IHRoZSBwcmVsb2FkZXIKICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgc2VsZi4kKCAndGFyZ2V0JyApLmFwcGVuZCggbG9hZGVyICk7CiAgICAgICAgfSwxMDApOwoKICAgICAgICAvLyBjcmVhdGUgdGhlIGluc3RhbmNlCiAgICAgICAgZiA9IG5ldyBHYWxsZXJpYS5GbGlja3IoKTsKCiAgICAgICAgLy8gYXBwbHkgRmxpY2tyIG9wdGlvbnMKICAgICAgICBpZiAoIHR5cGVvZiBzZWxmLl9vcHRpb25zLmZsaWNrck9wdGlvbnMgPT09ICdvYmplY3QnICkgewogICAgICAgICAgICBmLnNldE9wdGlvbnMoIHNlbGYuX29wdGlvbnMuZmxpY2tyT3B0aW9ucyApOwogICAgICAgIH0KCiAgICAgICAgLy8gY2FsbCB0aGUgZmxpY2tyIG1ldGhvZCBhbmQgdHJpZ2dlciB0aGUgREFUQSBldmVudAogICAgICAgIGZbIGZsaWNrclswXSBdKCBmbGlja3JbMV0sIGZ1bmN0aW9uKCBkYXRhICkgewoKICAgICAgICAgICAgc2VsZi5fZGF0YSA9IGRhdGE7CiAgICAgICAgICAgIGxvYWRlci5yZW1vdmUoKTsKICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCBHYWxsZXJpYS5EQVRBICk7CiAgICAgICAgICAgIGYub3B0aW9ucy5jb21wbGV0ZS5jYWxsKGYsIGRhdGEpOwoKICAgICAgICB9KTsKICAgIH0gZWxzZSB7CgogICAgICAgIC8vIGlmIGZsaWNrciBhcnJheSBub3QgZm91bmQsIHBhc3MKICAgICAgICBsb2FkLmFwcGx5KCB0aGlzLCBhcmdzICk7CiAgICB9Cn07Cgp9KCBqUXVlcnkgKSApOw==]]></data>
	</file>
	<file>
	  <filename>/script/plugins/galleria/plugins/flickr/galleria.flickr.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKIEdhbGxlcmlhIEZsaWNrciBQbHVnaW4gMjAxMS0wOC0wMQogaHR0cDovL2dhbGxlcmlhLmFpbm8uc2UKCiBDb3B5cmlnaHQgMjAxMSwgQWlubwogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLgoqLwpHYWxsZXJpYS5yZXF1aXJlcygxLjI1LCJUaGUgRmxpY2tyIFBsdWdpbiByZXF1aXJlcyBHYWxsZXJpYSB2ZXJzaW9uIDEuMi41IG9yIGxhdGVyLiIpOwooZnVuY3Rpb24oZSl7dmFyIGo9R2FsbGVyaWEudXRpbHMuZ2V0U2NyaXB0UGF0aCgpO0dhbGxlcmlhLkZsaWNrcj1mdW5jdGlvbihhKXt0aGlzLmFwaV9rZXk9YXx8IjJhMmNlMDZjMTU3ODBlYmViMGI3MDY2NTBmYzg5MGIyIjt0aGlzLm9wdGlvbnM9e21heDozMCxpbWFnZVNpemU6Im1lZGl1bSIsdGh1bWJTaXplOiJ0aHVtYiIsc29ydDoiaW50ZXJlc3RpbmduZXNzLWRlc2MiLGRlc2NyaXB0aW9uOiExLGNvbXBsZXRlOmZ1bmN0aW9uKCl7fSxiYWNrbGluazohMX19O0dhbGxlcmlhLkZsaWNrci5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkdhbGxlcmlhLkZsaWNrcixzZWFyY2g6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5fZmluZCh7dGV4dDphfSxiKX0sdGFnczpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLl9maW5kKHt0YWdzOmF9LGIpfSx1c2VyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuX2NhbGwoe21ldGhvZDoiZmxpY2tyLnVybHMubG9va3VwVXNlciIsdXJsOiJmbGlja3IuY29tL3Bob3Rvcy8iKwphfSxmdW5jdGlvbihhKXt0aGlzLl9maW5kKHt1c2VyX2lkOmEudXNlci5pZCxtZXRob2Q6ImZsaWNrci5wZW9wbGUuZ2V0UHVibGljUGhvdG9zIn0sYil9KX0sc2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuX2ZpbmQoe3Bob3Rvc2V0X2lkOmEsbWV0aG9kOiJmbGlja3IucGhvdG9zZXRzLmdldFBob3RvcyJ9LGIpfSxnYWxsZXJ5OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuX2ZpbmQoe2dhbGxlcnlfaWQ6YSxtZXRob2Q6ImZsaWNrci5nYWxsZXJpZXMuZ2V0UGhvdG9zIn0sYil9LGdyb3Vwc2VhcmNoOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuX2NhbGwoe3RleHQ6YSxtZXRob2Q6ImZsaWNrci5ncm91cHMuc2VhcmNoIn0sZnVuY3Rpb24oYSl7dGhpcy5ncm91cChhLmdyb3Vwcy5ncm91cFswXS5uc2lkLGIpfSl9LGdyb3VwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuX2ZpbmQoe2dyb3VwX2lkOmEsbWV0aG9kOiJmbGlja3IuZ3JvdXBzLnBvb2xzLmdldFBob3RvcyJ9LApiKX0sc2V0T3B0aW9uczpmdW5jdGlvbihhKXtlLmV4dGVuZCh0aGlzLm9wdGlvbnMsYSk7cmV0dXJuIHRoaXN9LF9jYWxsOmZ1bmN0aW9uKGEsYil7dmFyIGM9Imh0dHA6Ly9hcGkuZmxpY2tyLmNvbS9zZXJ2aWNlcy9yZXN0Lz8iLGQ9dGhpcyxhPWUuZXh0ZW5kKHtmb3JtYXQ6Impzb24iLGpzb25jYWxsYmFjazoiPyIsYXBpX2tleTp0aGlzLmFwaV9rZXl9LGEpO2UuZWFjaChhLGZ1bmN0aW9uKGEsYil7Yys9IiYiK2ErIj0iK2J9KTtlLmdldEpTT04oYyxmdW5jdGlvbihhKXthLnN0YXQ9PT0ib2siP2IuY2FsbChkLGEpOkdhbGxlcmlhLnJhaXNlKGEuY29kZS50b1N0cmluZygpKyIgIithLnN0YXQrIjogIithLm1lc3NhZ2UsITApfSk7cmV0dXJuIGR9LF9nZXRCaWc6ZnVuY3Rpb24oYSl7aWYoYS51cmxfbClyZXR1cm4gYS51cmxfbDtlbHNlIGlmKHBhcnNlSW50KGEud2lkdGhfbywxMCk+MTI4MClyZXR1cm4iaHR0cDovL2Zhcm0iK2EuZmFybSsiLnN0YXRpYy5mbGlja3IuY29tLyIrCmEuc2VydmVyKyIvIithLmlkKyJfIithLnNlY3JldCsiX2IuanBnIjtyZXR1cm4gYS51cmxfb3x8YS51cmxfenx8YS51cmxfbX0sX2dldFNpemU6ZnVuY3Rpb24oYSxiKXt2YXIgYztzd2l0Y2goYil7Y2FzZSAidGh1bWIiOmM9YS51cmxfdDticmVhaztjYXNlICJzbWFsbCI6Yz1hLnVybF9zO2JyZWFrO2Nhc2UgImJpZyI6Yz10aGlzLl9nZXRCaWcoYSk7YnJlYWs7Y2FzZSAib3JpZ2luYWwiOmM9YS51cmxfbz9hLnVybF9vOnRoaXMuX2dldEJpZyhhKTticmVhaztkZWZhdWx0OmM9YS51cmxfenx8YS51cmxfbX1yZXR1cm4gY30sX2ZpbmQ6ZnVuY3Rpb24oYSxiKXthPWUuZXh0ZW5kKHttZXRob2Q6ImZsaWNrci5waG90b3Muc2VhcmNoIixleHRyYXM6InVybF90LHVybF9tLHVybF9vLHVybF9zLHVybF9sLHVybF96LGRlc2NyaXB0aW9uIixzb3J0OnRoaXMub3B0aW9ucy5zb3J0fSxhKTtyZXR1cm4gdGhpcy5fY2FsbChhLGZ1bmN0aW9uKGEpe3ZhciBkPVtdLGE9YS5waG90b3M/YS5waG90b3MucGhvdG86CmEucGhvdG9zZXQucGhvdG8sZT1NYXRoLm1pbih0aGlzLm9wdGlvbnMubWF4LGEubGVuZ3RoKSxmLGc7Zm9yKGc9MDtnPGU7ZysrKWY9YVtnXSxkLnB1c2goe3RodW1iOnRoaXMuX2dldFNpemUoZix0aGlzLm9wdGlvbnMudGh1bWJTaXplKSxpbWFnZTp0aGlzLl9nZXRTaXplKGYsdGhpcy5vcHRpb25zLmltYWdlU2l6ZSksYmlnOnRoaXMuX2dldEJpZyhmKSx0aXRsZTphW2ddLnRpdGxlLGRlc2NyaXB0aW9uOnRoaXMub3B0aW9ucy5kZXNjcmlwdGlvbiYmYVtnXS5kZXNjcmlwdGlvbj9hW2ddLmRlc2NyaXB0aW9uLl9jb250ZW50OiIiLGxpbms6dGhpcy5vcHRpb25zLmJhY2tsaW5rPyJodHRwOi8vZmxpY2tyLmNvbS9waG90b3MvIitmLm93bmVyKyIvIitmLmlkOiIifSk7Yi5jYWxsKHRoaXMsZCl9KX19O3ZhciBoPUdhbGxlcmlhLnByb3RvdHlwZS5sb2FkO0dhbGxlcmlhLnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzLmxlbmd0aHx8dHlwZW9mIHRoaXMuX29wdGlvbnMuZmxpY2tyIT09CiJzdHJpbmciKWguYXBwbHkodGhpcyxHYWxsZXJpYS51dGlscy5hcnJheShhcmd1bWVudHMpKTtlbHNle3ZhciBhPXRoaXMsYj1HYWxsZXJpYS51dGlscy5hcnJheShhcmd1bWVudHMpLGM9dGhpcy5fb3B0aW9ucy5mbGlja3Iuc3BsaXQoIjoiKSxkLGk9ZS5leHRlbmQoe30sYS5fb3B0aW9ucy5mbGlja3JPcHRpb25zKSxmPXR5cGVvZiBpLmxvYWRlciE9PSJ1bmRlZmluZWQiP2kubG9hZGVyOmUoIjxkaXY+IikuY3NzKHt3aWR0aDo0OCxoZWlnaHQ6NDgsb3BhY2l0eTowLjcsYmFja2dyb3VuZDoiIzAwMCB1cmwoIitqKyJsb2FkZXIuZ2lmKSBuby1yZXBlYXQgNTAlIDUwJSJ9KTtpZihjLmxlbmd0aCl7aWYodHlwZW9mIEdhbGxlcmlhLkZsaWNrci5wcm90b3R5cGVbY1swXV0hPT0iZnVuY3Rpb24iKXJldHVybiBHYWxsZXJpYS5yYWlzZShjWzBdKyIgbWV0aG9kIG5vdCBmb3VuZCBpbiBGbGlja3IgcGx1Z2luIiksaC5hcHBseSh0aGlzLGIpO2lmKCFjWzFdKXJldHVybiBHYWxsZXJpYS5yYWlzZSgiTm8gZmxpY2tyIGFyZ3VtZW50IGZvdW5kIiksCmguYXBwbHkodGhpcyxiKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2EuJCgidGFyZ2V0IikuYXBwZW5kKGYpfSwxMDApO2Q9bmV3IEdhbGxlcmlhLkZsaWNrcjt0eXBlb2YgYS5fb3B0aW9ucy5mbGlja3JPcHRpb25zPT09Im9iamVjdCImJmQuc2V0T3B0aW9ucyhhLl9vcHRpb25zLmZsaWNrck9wdGlvbnMpO2RbY1swXV0oY1sxXSxmdW5jdGlvbihiKXthLl9kYXRhPWI7Zi5yZW1vdmUoKTthLnRyaWdnZXIoR2FsbGVyaWEuREFUQSk7ZC5vcHRpb25zLmNvbXBsZXRlLmNhbGwoZCxiKX0pfWVsc2UgaC5hcHBseSh0aGlzLGIpfX19KShqUXVlcnkpOwo=]]></data>
	</file>
	<file>
	  <filename>/script/plugins/galleria/plugins/flickr/loader.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEAAQAPQAAAAAAP///w4ODnR0dB4eHri4uISEhP///6amptra2lJSUkBAQOrq6mJiYvr6+sjIyJaWlgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH+GkNyZWF0ZWQgd2l0aCBhamF4bG9hZC5pbmZvACH5BAAKAAAAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAEAAQAAAFdyAgAgIJIeWoAkRCCMdBkKtIHIngyMKsErPBYbADpkSCwhDmQCBethRB6Vj4kFCkQPG4IlWDgrNRIwnO4UKBXDufzQvDMaoSDBgFb886MiQadgNABAokfCwzBA8LCg0Egl8jAggGAA1kBIA1BAYzlyILczULC2UhACH5BAAKAAEALAAAAAAQABAAAAV2ICACAmlAZTmOREEIyUEQjLKKxPHADhEvqxlgcGgkGI1DYSVAIAWMx+lwSKkICJ0QsHi9RgKBwnVTiRQQgwF4I4UFDQQEwi6/3YSGWRRmjhEETAJfIgMFCnAKM0KDV4EEEAQLiF18TAYNXDaSe3x6mjidN1s3IQAh+QQACgACACwAAAAAEAAQAAAFeCAgAgLZDGU5jgRECEUiCI+yioSDwDJyLKsXoHFQxBSHAoAAFBhqtMJg8DgQBgfrEsJAEAg4YhZIEiwgKtHiMBgtpg3wbUZXGO7kOb1MUKRFMysCChAoggJCIg0GC2aNe4gqQldfL4l/Ag1AXySJgn5LcoE3QXI3IQAh+QQACgADACwAAAAAEAAQAAAFdiAgAgLZNGU5joQhCEjxIssqEo8bC9BRjy9Ag7GILQ4QEoE0gBAEBcOpcBA0DoxSK/e8LRIHn+i1cK0IyKdg0VAoljYIg+GgnRrwVS/8IAkICyosBIQpBAMoKy9dImxPhS+GKkFrkX+TigtLlIyKXUF+NjagNiEAIfkEAAoABAAsAAAAABAAEAAABWwgIAICaRhlOY4EIgjH8R7LKhKHGwsMvb4AAy3WODBIBBKCsYA9TjuhDNDKEVSERezQEL0WrhXucRUQGuik7bFlngzqVW9LMl9XWvLdjFaJtDFqZ1cEZUB0dUgvL3dgP4WJZn4jkomWNpSTIyEAIfkEAAoABQAsAAAAABAAEAAABX4gIAICuSxlOY6CIgiD8RrEKgqGOwxwUrMlAoSwIzAGpJpgoSDAGifDY5kopBYDlEpAQBwevxfBtRIUGi8xwWkDNBCIwmC9Vq0aiQQDQuK+VgQPDXV9hCJjBwcFYU5pLwwHXQcMKSmNLQcIAExlbH8JBwttaX0ABAcNbWVbKyEAIfkEAAoABgAsAAAAABAAEAAABXkgIAICSRBlOY7CIghN8zbEKsKoIjdFzZaEgUBHKChMJtRwcWpAWoWnifm6ESAMhO8lQK0EEAV3rFopIBCEcGwDKAqPh4HUrY4ICHH1dSoTFgcHUiZjBhAJB2AHDykpKAwHAwdzf19KkASIPl9cDgcnDkdtNwiMJCshACH5BAAKAAcALAAAAAAQABAAAAV3ICACAkkQZTmOAiosiyAoxCq+KPxCNVsSMRgBsiClWrLTSWFoIQZHl6pleBh6suxKMIhlvzbAwkBWfFWrBQTxNLq2RG2yhSUkDs2b63AYDAoJXAcFRwADeAkJDX0AQCsEfAQMDAIPBz0rCgcxky0JRWE1AmwpKyEAIfkEAAoACAAsAAAAABAAEAAABXkgIAICKZzkqJ4nQZxLqZKv4NqNLKK2/Q4Ek4lFXChsg5ypJjs1II3gEDUSRInEGYAw6B6zM4JhrDAtEosVkLUtHA7RHaHAGJQEjsODcEg0FBAFVgkQJQ1pAwcDDw8KcFtSInwJAowCCA6RIwqZAgkPNgVpWndjdyohACH5BAAKAAkALAAAAAAQABAAAAV5ICACAimc5KieLEuUKvm2xAKLqDCfC2GaO9eL0LABWTiBYmA06W6kHgvCqEJiAIJiu3gcvgUsscHUERm+kaCxyxa+zRPk0SgJEgfIvbAdIAQLCAYlCj4DBw0IBQsMCjIqBAcPAooCBg9pKgsJLwUFOhCZKyQDA3YqIQAh+QQACgAKACwAAAAAEAAQAAAFdSAgAgIpnOSonmxbqiThCrJKEHFbo8JxDDOZYFFb+A41E4H4OhkOipXwBElYITDAckFEOBgMQ3arkMkUBdxIUGZpEb7kaQBRlASPg0FQQHAbEEMGDSVEAA1QBhAED1E0NgwFAooCDWljaQIQCE5qMHcNhCkjIQAh+QQACgALACwAAAAAEAAQAAAFeSAgAgIpnOSoLgxxvqgKLEcCC65KEAByKK8cSpA4DAiHQ/DkKhGKh4ZCtCyZGo6F6iYYPAqFgYy02xkSaLEMV34tELyRYNEsCQyHlvWkGCzsPgMCEAY7Cg04Uk48LAsDhRA8MVQPEF0GAgqYYwSRlycNcWskCkApIyEAOwAAAAAAAAAAAA==]]></data>
	</file>
	<file>
	  <filename>/script/plugins/galleria/plugins/history/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/script/plugins/galleria/plugins/history/galleria.history.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIEBwcmVzZXJ2ZSBHYWxsZXJpYSBIaXN0b3J5IFBsdWdpbiAyMDExLTA4LTAxCiAqIGh0dHA6Ly9nYWxsZXJpYS5haW5vLnNlCiAqCiAqIENvcHlyaWdodCAyMDExLCBBaW5vCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4KICoKICovCgovKmdsb2JhbCBqUXVlcnksIEdhbGxlcmlhLCB3aW5kb3cgKi8KCkdhbGxlcmlhLnJlcXVpcmVzKDEuMjUsICdUaGUgSGlzdG9yeSBQbHVnaW4gcmVxdWlyZXMgR2FsbGVyaWEgdmVyc2lvbiAxLjIuNSBvciBsYXRlci4nKTsKCihmdW5jdGlvbiggJCwgd2luZG93ICkgewoKICAgIEdhbGxlcmlhLkhpc3RvcnkgPSAoZnVuY3Rpb24oKSB7CgogICAgICAgIHZhciBvbmxvYWRzID0gW10sCgogICAgICAgICAgICBpbml0ID0gZmFsc2UsCgogICAgICAgICAgICBsb2MgPSB3aW5kb3cubG9jYXRpb24sCgogICAgICAgICAgICBkb2MgPSB3aW5kb3cuZG9jdW1lbnQsCgogICAgICAgICAgICBpZSA9IEdhbGxlcmlhLklFLAoKICAgICAgICAgICAgc3VwcG9ydCA9ICdvbmhhc2hjaGFuZ2UnIGluIHdpbmRvdyAmJiAoIGRvYy5tb2RlID09PSB1bmRlZmluZWQgfHwgZG9jLm1vZGUgPiA3ICksCgogICAgICAgICAgICBpZnJhbWUsCgogICAgICAgICAgICBnZXQgPSBmdW5jdGlvbiggd2lubG9jICkgewogICAgICAgICAgICAgICAgaWYoIGlmcmFtZSAmJiAhc3VwcG9ydCAmJiBHYWxsZXJpYS5JRSApIHsKICAgICAgICAgICAgICAgICAgICB3aW5sb2MgPSB3aW5sb2MgfHwgaWZyYW1lLmxvY2F0aW9uOwogICAgICAgICAgICAgICAgfSAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgd2lubG9jID0gbG9jOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KCB3aW5sb2MuaGFzaC5zdWJzdHIoMiksIDEwICk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBzYXZlZCA9IGdldCggbG9jICksCgogICAgICAgICAgICBjYWxsYmFja3MgPSBbXSwKCiAgICAgICAgICAgIG9uY2hhbmdlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAkLmVhY2goIGNhbGxiYWNrcywgZnVuY3Rpb24oIGksIGZuICkgewogICAgICAgICAgICAgICAgICAgIGZuLmNhbGwoIHdpbmRvdywgZ2V0KCkgKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgcmVhZHkgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICQuZWFjaCggb25sb2FkcywgZnVuY3Rpb24oaSwgZm4pIHsKICAgICAgICAgICAgICAgICAgICBmbigpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgaW5pdCA9IHRydWU7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBzZXRIYXNoID0gZnVuY3Rpb24oIHZhbCApIHsKICAgICAgICAgICAgICAgIHJldHVybiAnLycgKyB2YWw7CiAgICAgICAgICAgIH07CgogICAgICAgIC8vIGFsd2F5cyByZW1vdmUgc3VwcG9ydCBpZiBJRSA8IDgKICAgICAgICBpZiAoIHN1cHBvcnQgJiYgaWUgPCA4ICkgewogICAgICAgICAgICBzdXBwb3J0ID0gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBpZiAoICFzdXBwb3J0ICkgewoKICAgICAgICAgICAgJChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgICAgICB2YXIgaW50ZXJ2YWwgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIHZhciBoYXNoID0gZ2V0KCk7CgogICAgICAgICAgICAgICAgICAgIGlmICggIWlzTmFOKCBoYXNoICkgJiYgaGFzaCAhPSBzYXZlZCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWQgPSBoYXNoOwogICAgICAgICAgICAgICAgICAgICAgICBsb2MuaGFzaCA9IHNldEhhc2goIGhhc2ggKTsKICAgICAgICAgICAgICAgICAgICAgICAgb25jaGFuZ2UoKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSwgNTApOwoKICAgICAgICAgICAgICAgIGlmICggaWUgKSB7CgogICAgICAgICAgICAgICAgICAgICQoJzxpZnJhbWUgdGFiaW5kZXg9Ii0xIiB0aXRsZT0iZW1wdHkiPicpLmhpZGUoKS5hdHRyKCAnc3JjJywgJ2Fib3V0OmJsYW5rJyApLm9uZSgnbG9hZCcsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWZyYW1lID0gdGhpcy5jb250ZW50V2luZG93OwoKICAgICAgICAgICAgICAgICAgICAgICAgcmVhZHkoKTsKCiAgICAgICAgICAgICAgICAgICAgfSkuaW5zZXJ0QWZ0ZXIoZG9jLmJvZHkpOwoKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmVhZHkoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVhZHkoKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB7CgogICAgICAgICAgICBjaGFuZ2U6IGZ1bmN0aW9uKCBmbiApIHsKCiAgICAgICAgICAgICAgICBjYWxsYmFja3MucHVzaCggZm4gKTsKCiAgICAgICAgICAgICAgICBpZiggc3VwcG9ydCApIHsKICAgICAgICAgICAgICAgICAgICB3aW5kb3cub25oYXNoY2hhbmdlID0gb25jaGFuZ2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKCB2YWwgKSB7CgogICAgICAgICAgICAgICAgaWYgKCBpc05hTiggdmFsICkgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggIXN1cHBvcnQgJiYgaWUgKSB7CgogICAgICAgICAgICAgICAgICAgIHRoaXMucmVhZHkoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaWRvYyA9IGlmcmFtZS5kb2N1bWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgaWRvYy5vcGVuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlkb2MuY2xvc2UoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZS5sb2NhdGlvbi5oYXNoID0gc2V0SGFzaCggdmFsICk7CgogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGxvYy5oYXNoID0gc2V0SGFzaCggdmFsICk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICByZWFkeTogZnVuY3Rpb24oZm4pIHsKICAgICAgICAgICAgICAgIGlmICghaW5pdCkgewogICAgICAgICAgICAgICAgICAgIG9ubG9hZHMucHVzaChmbik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGZuKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfSgpKTsKCn0oIGpRdWVyeSwgdGhpcyApKTsKCg==]]></data>
	</file>
	<file>
	  <filename>/script/plugins/galleria/plugins/history/galleria.history.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKIEdhbGxlcmlhIEhpc3RvcnkgUGx1Z2luIDIwMTEtMDgtMDEKIGh0dHA6Ly9nYWxsZXJpYS5haW5vLnNlCgogQ29weXJpZ2h0IDIwMTEsIEFpbm8KIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4KCiovCkdhbGxlcmlhLnJlcXVpcmVzKDEuMjUsIlRoZSBIaXN0b3J5IFBsdWdpbiByZXF1aXJlcyBHYWxsZXJpYSB2ZXJzaW9uIDEuMi41IG9yIGxhdGVyLiIpOwooZnVuY3Rpb24oZSxjKXtHYWxsZXJpYS5IaXN0b3J5PWZ1bmN0aW9uKCl7dmFyIGs9W10sbD0hMSxmPWMubG9jYXRpb24sZz1jLmRvY3VtZW50LGg9R2FsbGVyaWEuSUUsYj0ib25oYXNoY2hhbmdlImluIGMmJihnLm1vZGU9PT12b2lkIDB8fGcubW9kZT43KSxkLGk9ZnVuY3Rpb24oYSl7YT1kJiYhYiYmR2FsbGVyaWEuSUU/YXx8ZC5sb2NhdGlvbjpmO3JldHVybiBwYXJzZUludChhLmhhc2guc3Vic3RyKDIpLDEwKX0sbT1pKGYpLG49W10sbz1mdW5jdGlvbigpe2UuZWFjaChuLGZ1bmN0aW9uKGEsYil7Yi5jYWxsKGMsaSgpKX0pfSxqPWZ1bmN0aW9uKCl7ZS5lYWNoKGssZnVuY3Rpb24oYSxiKXtiKCl9KTtsPSEwfTtiJiZoPDgmJihiPSExKTtiP2ooKTplKGZ1bmN0aW9uKCl7Yy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBhPWkoKTtpZighaXNOYU4oYSkmJmEhPW0pbT1hLGYuaGFzaD0iLyIrYSxvKCl9LDUwKTtoP2UoJzxpZnJhbWUgdGFiaW5kZXg9Ii0xIiB0aXRsZT0iZW1wdHkiPicpLmhpZGUoKS5hdHRyKCJzcmMiLAoiYWJvdXQ6YmxhbmsiKS5vbmUoImxvYWQiLGZ1bmN0aW9uKCl7ZD10aGlzLmNvbnRlbnRXaW5kb3c7aigpfSkuaW5zZXJ0QWZ0ZXIoZy5ib2R5KTpqKCl9KTtyZXR1cm57Y2hhbmdlOmZ1bmN0aW9uKGEpe24ucHVzaChhKTtpZihiKWMub25oYXNoY2hhbmdlPW99LHNldDpmdW5jdGlvbihhKXtpZighaXNOYU4oYSkpIWImJmgmJnRoaXMucmVhZHkoZnVuY3Rpb24oKXt2YXIgYj1kLmRvY3VtZW50O2Iub3BlbigpO2IuY2xvc2UoKTtkLmxvY2F0aW9uLmhhc2g9Ii8iK2F9KSxmLmhhc2g9Ii8iK2F9LHJlYWR5OmZ1bmN0aW9uKGEpe2w/YSgpOmsucHVzaChhKX19fSgpfSkoalF1ZXJ5LHRoaXMpOwo=]]></data>
	</file>
	<file>
	  <filename>/script/plugins/galleria/plugins/history/history-demo.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KICAgIDxoZWFkPgogICAgICAgIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICAgICAgICA8dGl0bGU+R2FsbGVyaWEgSGlzdG9yeSBQbHVnaW48L3RpdGxlPgogICAgICAgIDxzdHlsZT4KCiAgICAgICAgICAgIC8qIERlbW8gc3R5bGVzICovCiAgICAgICAgICAgIGh0bWwsYm9keXtiYWNrZ3JvdW5kOiMyMjI7bWFyZ2luOjA7fQogICAgICAgICAgICBib2R5e2JvcmRlci10b3A6NHB4IHNvbGlkICMwMDA7fQogICAgICAgICAgICAuY29udGVudHtjb2xvcjojNzc3O2ZvbnQ6MTJweC8xLjQgImhlbHZldGljYSBuZXVlIixhcmlhbCxzYW5zLXNlcmlmO3dpZHRoOjYyMHB4O21hcmdpbjoyMHB4IGF1dG87fQogICAgICAgICAgICBoMXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDpub3JtYWw7Y29sb3I6I2RkZDttYXJnaW46MDt9CiAgICAgICAgICAgIHB7bWFyZ2luOjAgMCAyMHB4fQogICAgICAgICAgICBhIHtjb2xvcjojMjJCQ0I5O3RleHQtZGVjb3JhdGlvbjpub25lO30KICAgICAgICAgICAgLmNyZWR7bWFyZ2luLXRvcDoyMHB4O2ZvbnQtc2l6ZToxMXB4O30KCiAgICAgICAgICAgIC8qIFRoaXMgcnVsZSBpcyByZWFkIGJ5IEdhbGxlcmlhIHRvIGRlZmluZSB0aGUgZ2FsbGVyeSBoZWlnaHQ6ICovCiAgICAgICAgICAgICNnYWxsZXJpYXtoZWlnaHQ6MzIwcHh9CgogICAgICAgIDwvc3R5bGU+CgogICAgICAgIDwhLS0gbG9hZCBqUXVlcnkgLS0+CiAgICAgICAgPHNjcmlwdCBzcmM9Imh0dHA6Ly9hamF4Lmdvb2dsZWFwaXMuY29tL2FqYXgvbGlicy9qcXVlcnkvMS9qcXVlcnkubWluLmpzIj48L3NjcmlwdD4KCiAgICAgICAgPCEtLSBsb2FkIEdhbGxlcmlhIC0tPgogICAgICAgIDxzY3JpcHQgc3JjPSIuLi8uLi9nYWxsZXJpYS0xLjIuNi5taW4uanMiPjwvc2NyaXB0PgoKICAgICAgICA8IS0tIGxvYWQgdGhlIEhpc3RvcnkgcGx1Z2luLCBubyBuZWVkIGZvciBmdXJ0aGVyIHNjcmlwdGluZyAtLT4KICAgICAgICA8c2NyaXB0IHNyYz0iZ2FsbGVyaWEuaGlzdG9yeS5taW4uanMiPjwvc2NyaXB0PgoKICAgIDwvaGVhZD4KPGJvZHk+CiAgICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4KICAgICAgICA8aDE+R2FsbGVyaWEgSGlzdG9yeSBQbHVnaW48L2gxPgogICAgICAgIDxwPkRlbW9uc3RyYXRpbmcgYSBiYXNpYyBoaXN0b3J5IGV4YW1wbGUuIFN1cHBvcnRzIG1vc3QgYnJvd3NlcnMsIGluY2x1ZGluZyBGRiAzLjArIGFuZCBJRSA3KzwvcD4KCiAgICAgICAgPCEtLSBBZGRpbmcgZ2FsbGVyeSBpbWFnZXMuIFdlIHVzZSByZXNpemVkIHRodW1ibmFpbHMgaGVyZSBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlLCBidXQgaXTigJlzIG5vdCBuZWNlc3NhcnkgLS0+CgogICAgICAgIDxkaXYgaWQ9ImdhbGxlcmlhIj4KICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zL3RodW1iLzMvMzQvTG9jb21vdGl2ZXMtUm91bmRob3VzZTIuanBnLzgwMHB4LUxvY29tb3RpdmVzLVJvdW5kaG91c2UyLmpwZyI+CiAgICAgICAgICAgIAk8aW1nIHRpdGxlPSJMb2NvbW90aXZlcyBSb3VuZGhvdXNlIgogICAgICAgICAgICAJICAgICBhbHQ9IlN0ZWFtIGxvY29tb3RpdmVzIG9mIHRoZSBDaGljYWdvICZhbXA7IE5vcnRoIFdlc3Rlcm4gUmFpbHdheS4iCiAgICAgICAgICAgIAkgICAgIHNyYz0iaHR0cDovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zL3RodW1iLzMvMzQvTG9jb21vdGl2ZXMtUm91bmRob3VzZTIuanBnLzEwMHB4LUxvY29tb3RpdmVzLVJvdW5kaG91c2UyLmpwZyI+CiAgICAgICAgCTwvYT4KICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zL3RodW1iLzMvMzYvSWNlYmVyZ3NfaW5fdGhlX0hpZ2hfQXJjdGljXy1fMjAwNTA5MDcuanBnLzEwMDBweC1JY2ViZXJnc19pbl90aGVfSGlnaF9BcmN0aWNfLV8yMDA1MDkwNy5qcGciPgogICAgICAgICAgICAgICAgPGltZyB0aXRsZT0iSWNlYmVyZ3MgaW4gdGhlIEhpZ2ggQXJjdGljIgogICAgICAgICAgICAgICAgICAgICBhbHQ9IuKAnVRoZSBkZWJyaXMgbG9hZGluZyBpc24ndCBwYXJ0aWN1bGFybHkgZXh0ZW5zaXZlLCBidXQgdGhlIGNvbG9yIGlzIHVzdWFsLuKAnSIKICAgICAgICAgICAgICAgICAgICAgc3JjPSJodHRwOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvdGh1bWIvMy8zNi9JY2ViZXJnc19pbl90aGVfSGlnaF9BcmN0aWNfLV8yMDA1MDkwNy5qcGcvMTAwcHgtSWNlYmVyZ3NfaW5fdGhlX0hpZ2hfQXJjdGljXy1fMjAwNTA5MDcuanBnIj4KICAgICAgICAgICAgPC9hPgogICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvdGh1bWIvZi9mZS9BcmElQzMlQjFhLl9BX0VzdHJhZGElMkNfR2FsaXphLl8wMi5qcGcvMTAwMHB4LUFyYSVDMyVCMWEuX0FfRXN0cmFkYSUyQ19HYWxpemEuXzAyLmpwZyI+CiAgICAgICAgICAgICAgICA8aW1nIHRpdGxlPSJBcmHDsWEiCiAgICAgICAgICAgICAgICAgICAgIGFsdD0iWHlzdGljdXMgY3Jpc3RhdHVzLCBBIEVzdHJhZGEsIEdhbGljaWEsIFNwYWluIgogICAgICAgICAgICAgICAgICAgICBzcmM9Imh0dHA6Ly91cGxvYWQud2lraW1lZGlhLm9yZy93aWtpcGVkaWEvY29tbW9ucy90aHVtYi9mL2ZlL0FyYSVDMyVCMWEuX0FfRXN0cmFkYSUyQ19HYWxpemEuXzAyLmpwZy8xMDBweC1BcmElQzMlQjFhLl9BX0VzdHJhZGElMkNfR2FsaXphLl8wMi5qcGciPgogICAgICAgICAgICA8L2E+CiAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly91cGxvYWQud2lraW1lZGlhLm9yZy93aWtpcGVkaWEvY29tbW9ucy90aHVtYi8yLzJkLzkxMDRfLV9NaWxhbm9fLV9NdXNlb19zdG9yaWFfbmF0dXJhbGVfLV9GbHVvcml0ZV8tX0ZvdG9fR2lvdmFubmlfRGFsbCUyN09ydG9fMjItQXByLTIwMDcuanBnLzEwMDBweC05MTA0Xy1fTWlsYW5vXy1fTXVzZW9fc3RvcmlhX25hdHVyYWxlXy1fRmx1b3JpdGVfLV9Gb3RvX0dpb3Zhbm5pX0RhbGwlMjdPcnRvXzIyLUFwci0yMDA3LmpwZyI+CiAgICAgICAgICAgICAgICA8aW1nIHRpdGxlPSJNdXNlbyBzdG9yaWEgbmF0dXJhbGUiCiAgICAgICAgICAgICAgICAgICAgIHNyYz0iaHR0cDovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zL3RodW1iLzIvMmQvOTEwNF8tX01pbGFub18tX011c2VvX3N0b3JpYV9uYXR1cmFsZV8tX0ZsdW9yaXRlXy1fRm90b19HaW92YW5uaV9EYWxsJTI3T3J0b18yMi1BcHItMjAwNy5qcGcvMTAwcHgtOTEwNF8tX01pbGFub18tX011c2VvX3N0b3JpYV9uYXR1cmFsZV8tX0ZsdW9yaXRlXy1fRm90b19HaW92YW5uaV9EYWxsJTI3T3J0b18yMi1BcHItMjAwNy5qcGciPgogICAgICAgICAgICA8L2E+CiAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly91cGxvYWQud2lraW1lZGlhLm9yZy93aWtpcGVkaWEvY29tbW9ucy90aHVtYi8xLzE1L0dyaiVDMyVCM3RhZ2olQzMlQTFfY2F2ZXNfaW5fc3VtbWVyXzIwMDlfJTI4MiUyOS5qcGcvMTAwMHB4LUdyaiVDMyVCM3RhZ2olQzMlQTFfY2F2ZXNfaW5fc3VtbWVyXzIwMDlfJTI4MiUyOS5qcGciPgogICAgICAgICAgICAgICAgPGltZyB0aXRsZT0iR3Jqw7N0YWdqw6EgY2F2ZXMgaW4gc3VtbWVyIDIwMDkiCiAgICAgICAgICAgICAgICAgICAgIHNyYz0iaHR0cDovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zL3RodW1iLzEvMTUvR3JqJUMzJUIzdGFnaiVDMyVBMV9jYXZlc19pbl9zdW1tZXJfMjAwOV8lMjgyJTI5LmpwZy8xMDBweC1HcmolQzMlQjN0YWdqJUMzJUExX2NhdmVzX2luX3N1bW1lcl8yMDA5XyUyODIlMjkuanBnIj4KICAgICAgICAgICAgPC9hPgogICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvdGh1bWIvOS85MC8yMDA5MTEyOF9Mb3V0cmFfVGhlcm1lc19YYW50aGlfVGhyYWNlX0dyZWVjZV8yLmpwZy8xMDAwcHgtMjAwOTExMjhfTG91dHJhX1RoZXJtZXNfWGFudGhpX1RocmFjZV9HcmVlY2VfMi5qcGciPgogICAgICAgICAgICAgICAgPGltZyB0aXRsZT0iVGhlcm1lcyIKICAgICAgICAgICAgICAgICAgICAgYWx0PSJYYW50aGkgaG90LXNwYSBzcHJpbmdzLCBYYW50aGkgUHJlZmVjdHVyZSwgR3JlZWNlIgogICAgICAgICAgICAgICAgICAgICBzcmM9Imh0dHA6Ly91cGxvYWQud2lraW1lZGlhLm9yZy93aWtpcGVkaWEvY29tbW9ucy90aHVtYi85LzkwLzIwMDkxMTI4X0xvdXRyYV9UaGVybWVzX1hhbnRoaV9UaHJhY2VfR3JlZWNlXzIuanBnLzEwMHB4LTIwMDkxMTI4X0xvdXRyYV9UaGVybWVzX1hhbnRoaV9UaHJhY2VfR3JlZWNlXzIuanBnIj4KICAgICAgICAgICAgPC9hPgogICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvdGh1bWIvNS81OC9Qb2xpc2hfQXJteV9LbyVDNSU4Mm9icnplZ18wNzcuSlBHLzEwMjRweC1Qb2xpc2hfQXJteV9LbyVDNSU4Mm9icnplZ18wNzcuSlBHIj4KICAgICAgICAgICAgICAgIDxpbWcgdGl0bGU9IlBvbGlzaCBBcm15IEtvxYJvYnJ6ZWciCiAgICAgICAgICAgICAgICAgICAgIGFsdD0iQSBkaXNwbGF5IG9mIHRoZSBQb2xpc2ggQXJteS4gQm90aCB0aGUgc29sZGllciwgYW5kIHRoZSB2ZWhpY2xlIGJlbG9uZyB0byB0aGUgN3RoIFBvbWVyYW5pYW4gQ29hc3RhbCBEZWZlbmNlIEJyaWdhZGUsIGEgcGFydCBvZiB0aGUgU3pjemVjaW4tYmFzZWQgMTJ0aCBNZWNoYW5pemVkIERpdmlzaW9uIOKAnUJvbGVzxYJhdyBLcnp5d291c3R54oCdIgogICAgICAgICAgICAgICAgICAgICBzcmM9Imh0dHA6Ly91cGxvYWQud2lraW1lZGlhLm9yZy93aWtpcGVkaWEvY29tbW9ucy90aHVtYi81LzU4L1BvbGlzaF9Bcm15X0tvJUM1JTgyb2JyemVnXzA3Ny5KUEcvMTAwcHgtUG9saXNoX0FybXlfS28lQzUlODJvYnJ6ZWdfMDc3LkpQRyI+CiAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zL3RodW1iLzIvMmQvMjAxMDAyMTNfWmxhdG9ncmFkX0J1bGdhcmlhXzMuanBnLzEwMjRweC0yMDEwMDIxM19abGF0b2dyYWRfQnVsZ2FyaWFfMy5qcGciPgogICAgICAgICAgICAgICAgPGltZyB0aXRsZT0iWmxhdG9ncmFkIEJ1bGdhcmlhIgogICAgICAgICAgICAgICAgICAgICBzcmM9Imh0dHA6Ly91cGxvYWQud2lraW1lZGlhLm9yZy93aWtpcGVkaWEvY29tbW9ucy90aHVtYi8yLzJkLzIwMTAwMjEzX1psYXRvZ3JhZF9CdWxnYXJpYV8zLmpwZy8xMDBweC0yMDEwMDIxM19abGF0b2dyYWRfQnVsZ2FyaWFfMy5qcGciPgogICAgICAgICAgICA8L2E+CiAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly91cGxvYWQud2lraW1lZGlhLm9yZy93aWtpcGVkaWEvY29tbW9ucy90aHVtYi9iL2I1L0ZFTUFfLV81Mzk5Xy1fUGhvdG9ncmFwaF9ieV9BbmRyZWFfQm9vaGVyX3Rha2VuX29uXzA5LTI4LTIwMDFfaW5fTmV3X1lvcmsuanBnLzEwMjRweC1GRU1BXy1fNTM5OV8tX1Bob3RvZ3JhcGhfYnlfQW5kcmVhX0Jvb2hlcl90YWtlbl9vbl8wOS0yOC0yMDAxX2luX05ld19Zb3JrLmpwZyI+CiAgICAgICAgICAgICAgICA8aW1nIHRpdGxlPSIwOS0yOC0yMDAxIGluIE5ldyBZb3JrIENpdHkiCiAgICAgICAgICAgICAgICAgICAgIGFsdD0iTmV3IFlvcmssIE5ZLCBTZXB0ZW1iZXIgMjgsIDIwMDEgLS0gRGVicmlzIG9uIHN1cnJvdW5kaW5nIHJvb2ZzIGF0IHRoZSBzaXRlIG9mIHRoZSBXb3JsZCBUcmFkZSBDZW50ZXIuIFBob3RvIGJ5IEFuZHJlYSBCb29oZXIvIEZFTUEgTmV3cyBQaG90byIKICAgICAgICAgICAgICAgICAgICAgc3JjPSJodHRwOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvdGh1bWIvYi9iNS9GRU1BXy1fNTM5OV8tX1Bob3RvZ3JhcGhfYnlfQW5kcmVhX0Jvb2hlcl90YWtlbl9vbl8wOS0yOC0yMDAxX2luX05ld19Zb3JrLmpwZy8xMDBweC1GRU1BXy1fNTM5OV8tX1Bob3RvZ3JhcGhfYnlfQW5kcmVhX0Jvb2hlcl90YWtlbl9vbl8wOS0yOC0yMDAxX2luX05ld19Zb3JrLmpwZyI+CiAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zL3RodW1iL2UvZTYvQW50ZW5uYWUlMkNfSHViYmxlX2ltYWdlcy5qcGcvMTAyNHB4LUFudGVubmFlJTJDX0h1YmJsZV9pbWFnZXMuanBnIj4KICAgICAgICAgICAgICAgIDxpbWcgc3JjPSJodHRwOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvdGh1bWIvZS9lNi9BbnRlbm5hZSUyQ19IdWJibGVfaW1hZ2VzLmpwZy8xMDBweC1BbnRlbm5hZSUyQ19IdWJibGVfaW1hZ2VzLmpwZyI+CiAgICAgICAgICAgIDwvYT4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPHAgY2xhc3M9ImNyZWQiPk1hZGUgYnkgPGEgaHJlZj0iaHR0cDovL2dhbGxlcmlhLmFpbm8uc2UiPkdhbGxlcmlhPC9hPi48L3A+CiAgICA8L2Rpdj4KCiAgICA8c2NyaXB0PgoKICAgIC8vIExvYWQgdGhlIGNsYXNzaWMgdGhlbWUKCUdhbGxlcmlhLmxvYWRUaGVtZSgnLi4vLi4vdGhlbWVzL2NsYXNzaWMvZ2FsbGVyaWEuY2xhc3NpYy5taW4uanMnKTsKCgkvLyBJbml0aWFsaXplIEdhbGxlcmlhCgkkKCcjZ2FsbGVyaWEnKS5nYWxsZXJpYSgpOwoKICAgIDwvc2NyaXB0PgogICAgPC9ib2R5Pgo8L2h0bWw+]]></data>
	</file>
	<file>
	  <filename>/script/plugins/galleria/plugins/picasa/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/script/plugins/galleria/plugins/picasa/galleria.picasa.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIEBwcmVzZXJ2ZSBHYWxsZXJpYSBQaWNhc2EgUGx1Z2luIDIwMTEtMDgtMDEKICogaHR0cDovL2dhbGxlcmlhLmFpbm8uc2UKICoKICogQ29weXJpZ2h0IDIwMTEsIEFpbm8KICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLgogKi8KCi8qZ2xvYmFsIGpRdWVyeSwgR2FsbGVyaWEsIHdpbmRvdyAqLwoKR2FsbGVyaWEucmVxdWlyZXMoMS4yNSwgJ1RoZSBQaWNhc2EgUGx1Z2luIHJlcXVpcmVzIEdhbGxlcmlhIHZlcnNpb24gMS4yLjUgb3IgbGF0ZXIuJyk7CgooZnVuY3Rpb24oJCkgewoKLy8gVGhlIHNjcmlwdCBwYXRoCnZhciBQQVRIID0gR2FsbGVyaWEudXRpbHMuZ2V0U2NyaXB0UGF0aCgpOwoKLyoqCgogICAgQGNsYXNzCiAgICBAY29uc3RydWN0b3IKCiAgICBAZXhhbXBsZSB2YXIgcGljYXNhID0gbmV3IEdhbGxlcmlhLlBpY2FzYSgpOwoKICAgIEBhdXRob3IgaHR0cDovL2Fpbm8uc2UKCiAgICBAcmVxdWlyZXMgalF1ZXJ5CiAgICBAcmVxdWlyZXMgR2FsbGVyaWEKCiAgICBAcmV0dXJucyBJbnN0YW5jZQoqLwoKR2FsbGVyaWEuUGljYXNhID0gZnVuY3Rpb24oKSB7CgogICAgdGhpcy5vcHRpb25zID0gewogICAgICAgIG1heDogMzAsICAgICAgICAgICAgICAgICAgICAgICAvLyBwaG90b3MgdG8gcmV0dXJuCiAgICAgICAgaW1hZ2VTaXplOiAnbWVkaXVtJywgICAgICAgICAgIC8vIHBob3RvIHNpemUgKCB0aHVtYixzbWFsbCxtZWRpdW0sYmlnLG9yaWdpbmFsICkgb3IgYSBudW1iZXIKICAgICAgICB0aHVtYlNpemU6ICd0aHVtYicsICAgICAgICAgICAgLy8gdGh1bWJuYWlsIHNpemUgKCB0aHVtYixzbWFsbCxtZWRpdW0sYmlnLG9yaWdpbmFsICkgb3IgYSBudW1iZXIKICAgICAgICBkZXNjcmlwdGlvbjogZmFsc2UsICAgICAgICAgICAgLy8gc2V0IHRoaXMgdG8gdHJ1ZSB0byBnZXQgZGVzY3JpcHRpb24gYXMgY2FwdGlvbgogICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbigpe30gICAgICAgICAvLyBjYWxsYmFjayB0byBiZSBjYWxsZWQgaW5zaWRlIHRoZSBHYWxsZXJpYS5wcm90b3R5cGUubG9hZAogICAgfTsKCn07CgpHYWxsZXJpYS5QaWNhc2EucHJvdG90eXBlID0gewoKICAgIC8vIGJyaW5nIGJhY2sgdGhlIGNvbnN0cnVjdG9yIHJlZmVyZW5jZQoKICAgIGNvbnN0cnVjdG9yOiBHYWxsZXJpYS5QaWNhc2EsCgogICAgLyoqCiAgICAgICAgU2VhcmNoIGZvciBhbnl0aGluZyBhdCBQaWNhc2EKCiAgICAgICAgQHBhcmFtIHtTdHJpbmd9IHBocmFzZSBUaGUgc3RyaW5nIHRvIHNlYXJjaCBmb3IKICAgICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2tdIFRoZSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZGF0YSBpcyByZWFkeQoKICAgICAgICBAcmV0dXJucyBJbnN0YW5jZQogICAgKi8KCiAgICBzZWFyY2g6IGZ1bmN0aW9uKCBwaHJhc2UsIGNhbGxiYWNrICkgewogICAgICAgIHJldHVybiB0aGlzLl9jYWxsKCAnc2VhcmNoJywgJ2FsbCcsIHsKICAgICAgICAgICAgcTogcGhyYXNlCiAgICAgICAgfSwgY2FsbGJhY2sgKTsKICAgIH0sCgogICAgLyoqCiAgICAgICAgR2V0IGEgdXNlcidzIHB1YmxpYyBwaG90b3MKCiAgICAgICAgQHBhcmFtIHtTdHJpbmd9IHVzZXJuYW1lIFRoZSB1c2VybmFtZSB0byBmZXRjaCBwaG90b3MgZnJvbQogICAgICAgIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFja10gVGhlIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBkYXRhIGlzIHJlYWR5CgogICAgICAgIEByZXR1cm5zIEluc3RhbmNlCiAgICAqLwoKICAgIHVzZXI6IGZ1bmN0aW9uKCB1c2VybmFtZSwgY2FsbGJhY2sgKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGwoICd1c2VyJywgJ3VzZXIvJyArIHVzZXJuYW1lLCBjYWxsYmFjayApOwogICAgfSwKCiAgICAvKioKICAgICAgICBHZXQgcGhvdG9zIGZyb20gYW4gYWxidW0KCiAgICAgICAgQHBhcmFtIHtTdHJpbmd9IHVzZXJuYW1lIFRoZSB1c2VybmFtZSB0aGF0IG93bnMgdGhlIGFsYnVtCiAgICAgICAgQHBhcmFtIHtTdHJpbmd9IGFsYnVtIFRoZSBhbGJ1bSBJRAogICAgICAgIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFja10gVGhlIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBkYXRhIGlzIHJlYWR5CgogICAgICAgIEByZXR1cm5zIEluc3RhbmNlCiAgICAqLwoKICAgIHVzZXJhbGJ1bTogZnVuY3Rpb24oIHVzZXJuYW1lLCBhbGJ1bSwgY2FsbGJhY2sgKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGwoICd1c2VyYWxidW0nLCAndXNlci8nICsgdXNlcm5hbWUgKyAnL2FsYnVtLycgKyBhbGJ1bSwgY2FsbGJhY2sgKTsKICAgIH0sCgogICAgLyoqCiAgICAgICAgU2V0IHBpY2FzYSBvcHRpb25zCgogICAgICAgIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFRoZSBvcHRpb25zIG9iamVjdCB0byBibGVuZAoKICAgICAgICBAcmV0dXJucyBJbnN0YW5jZQogICAgKi8KCiAgICBzZXRPcHRpb25zOiBmdW5jdGlvbiggb3B0aW9ucyApIHsKICAgICAgICAkLmV4dGVuZCh0aGlzLm9wdGlvbnMsIG9wdGlvbnMpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfSwKCgogICAgLy8gY2FsbCBQaWNhc2EKCiAgICBfY2FsbDogZnVuY3Rpb24oIHR5cGUsIHVybCwgcGFyYW1zLCBjYWxsYmFjayApIHsKCiAgICAgICAgdXJsID0gJ2h0dHBzOi8vcGljYXNhd2ViLmdvb2dsZS5jb20vZGF0YS9mZWVkL2FwaS8nICsgdXJsICsgJz8nOwoKICAgICAgICBpZiAodHlwZW9mIHBhcmFtcyA9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIGNhbGxiYWNrID0gcGFyYW1zOwogICAgICAgICAgICBwYXJhbXMgPSB7fTsKICAgICAgICB9CgogICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgcGFyYW1zID0gJC5leHRlbmQoewogICAgICAgICAgICAna2luZCc6ICdwaG90bycsCiAgICAgICAgICAgICdhY2Nlc3MnOiAncHVibGljJywKICAgICAgICAgICAgJ21heC1yZXN1bHRzJzogdGhpcy5vcHRpb25zLm1heCwKICAgICAgICAgICAgJ3RodW1ic2l6ZSc6IHRoaXMuX2dldFNpemVzKCkuam9pbignLCcpLAogICAgICAgICAgICAnYWx0JzogJ2pzb24taW4tc2NyaXB0JywKICAgICAgICAgICAgJ2NhbGxiYWNrJzogJz8nCiAgICAgICAgfSwgcGFyYW1zICk7CgogICAgICAgICQuZWFjaChwYXJhbXMsIGZ1bmN0aW9uKCBrZXksIHZhbHVlICkgewogICAgICAgICAgICB1cmwgKz0gJyYnICsga2V5ICsgJz0nICsgdmFsdWU7CiAgICAgICAgfSk7CgogICAgICAgIC8vIHNpbmNlIFBpY2FzYSB0aHJvd3MgNDA0IHdoZW4gdGhlIGNhbGwgaXMgbWFsZm9ybWVkLCB3ZSBtdXN0IHNldCBhIHRpbWVvdXQgaGVyZToKCiAgICAgICAgdmFyIGRhdGEgPSBmYWxzZTsKCiAgICAgICAgR2FsbGVyaWEudXRpbHMud2FpdCh7CiAgICAgICAgICAgIHVudGlsOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgICAgICB9LAogICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHNlbGYuX3BhcnNlLmNhbGwoIHNlbGYsIGRhdGEuZmVlZC5lbnRyeSwgY2FsbGJhY2sgKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIG1zZyA9ICcnOwogICAgICAgICAgICAgICAgaWYgKCB0eXBlID09ICd1c2VyJyApIHsKICAgICAgICAgICAgICAgICAgICBtc2cgPSAndXNlciBub3QgZm91bmQuJzsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIHR5cGUgPT0gJ3VzZXJhbGJ1bScgKSB7CiAgICAgICAgICAgICAgICAgICAgbXNnID0gJ2FsYnVtIG9yIHVzZXIgbm90IGZvdW5kLic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBHYWxsZXJpYS5yYWlzZSgnUGljYXNhIHJlcXVlc3QgZmFpbGVkJyArIChtc2cgPyAnOiAnICsgbXNnIDogJy4nKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHRpbWVvdXQ6IDUwMDAKICAgICAgICB9KTsKCiAgICAgICAgJC5nZXRKU09OKCB1cmwsIGZ1bmN0aW9uKCByZXN1bHQgKSB7CiAgICAgICAgICAgIGRhdGEgPSByZXN1bHQ7CiAgICAgICAgfSk7CgogICAgICAgIHJldHVybiBzZWxmOwogICAgfSwKCgogICAgLy8gcGFyc2UgaW1hZ2Ugc2l6ZXMgYW5kIHJldHVybiBhbiBhcnJheSBvZiB0aHJlZQoKICAgIF9nZXRTaXplczogZnVuY3Rpb24oKSB7CgogICAgICAgIHZhciBzZWxmID0gdGhpcywKICAgICAgICAgICAgbm9ybSA9IHsKICAgICAgICAgICAgICAgIHNtYWxsOiAnNzJjJywKICAgICAgICAgICAgICAgIHRodW1iOiAnMTA0dScsCiAgICAgICAgICAgICAgICBtZWRpdW06ICc2NDB1JywKICAgICAgICAgICAgICAgIGJpZzogJzEwMjR1JywKICAgICAgICAgICAgICAgIG9yaWdpbmFsOiAnMTYwMHUnCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG9wID0gc2VsZi5vcHRpb25zLAogICAgICAgICAgICB0ID0ge30sCiAgICAgICAgICAgIG4sCiAgICAgICAgICAgIHN6ID0gWzMyLDQ4LDY0LDcyLDk0LDEwNCwxMTAsMTI4LDE0NCwxNTAsMTYwLDIwMCwyMjAsMjg4LDMyMCw0MDAsNTEyLDU3Niw2NDAsNzIwLDgwMCw5MTIsMTAyNCwxMTUyLDEyODAsMTQ0MCwxNjAwXTsKCiAgICAgICAgJChbJ3RodW1iU2l6ZScsICdpbWFnZVNpemUnXSkuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgaWYoIG9wW3RoaXNdIGluIG5vcm0gKSB7CiAgICAgICAgICAgICAgICB0W3RoaXNdID0gbm9ybVsgb3BbdGhpc10gXTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG4gPSBHYWxsZXJpYS51dGlscy5wYXJzZVZhbHVlKCBvcFt0aGlzXSApOwogICAgICAgICAgICAgICAgaWYgKG4gPiAxNjAwKSB7CiAgICAgICAgICAgICAgICAgICAgbiA9IDE2MDA7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICQuZWFjaCggc3osIGZ1bmN0aW9uKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBuIDwgdGhpcyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBzeltpLTFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0W3RoaXNdID0gbjsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICByZXR1cm4gWyB0LnRodW1iU2l6ZSwgdC5pbWFnZVNpemUsICcxMjgwdSddOwoKICAgIH0sCgoKICAgIC8vIHBhcnNlIHRoZSByZXN1bHQgYW5kIGNhbGwgdGhlIGNhbGxiYWNrIHdpdGggdGhlIGdhbGxlcmlhLXJlYWR5IGRhdGEgYXJyYXkKCiAgICBfcGFyc2U6IGZ1bmN0aW9uKCBkYXRhLCBjYWxsYmFjayApIHsKCiAgICAgICAgdmFyIHNlbGYgPSB0aGlzLAogICAgICAgICAgICBnYWxsZXJ5ID0gW10sCiAgICAgICAgICAgIGltZzsKCiAgICAgICAgJC5lYWNoKCBkYXRhLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIGltZyA9IHRoaXMubWVkaWEkZ3JvdXAubWVkaWEkdGh1bWJuYWlsOwoKICAgICAgICAgICAgZ2FsbGVyeS5wdXNoKHsKICAgICAgICAgICAgICAgIHRodW1iOiBpbWdbMF0udXJsLAogICAgICAgICAgICAgICAgaW1hZ2U6IGltZ1sxXS51cmwsCiAgICAgICAgICAgICAgICBiaWc6IGltZ1syXS51cmwsCiAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy50aXRsZS4kdCwKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBzZWxmLm9wdGlvbnMuZGVzY3JpcHRpb24gPyB0aGlzLnN1bW1hcnkuJHQgOiAnJwogICAgICAgICAgICB9KTsKICAgICAgICB9KTsKCiAgICAgICAgY2FsbGJhY2suY2FsbCggdGhpcywgZ2FsbGVyeSApOwogICAgfQp9OwoKCi8qKgogICAgR2FsbGVyaWEgbW9kaWZpY2F0aW9ucwogICAgV2UgZmFrZS1leHRlbmQgdGhlIGxvYWQgcHJvdG90eXBlIHRvIG1ha2UgUGljYXNhIGludGVncmF0aW9uIGFzIHNpbXBsZSBhcyBwb3NzaWJsZQoqLwoKCi8vIHNhdmUgdGhlIG9sZCBwcm90b3R5cGUgaW4gYSBsb2NhbCB2YXJpYWJsZQoKdmFyIGxvYWQgPSBHYWxsZXJpYS5wcm90b3R5cGUubG9hZDsKCgovLyBmYWtlLWV4dGVuZCB0aGUgbG9hZCBwcm90b3R5cGUgdXNpbmcgdGhlIHBpY2FzYSBkYXRhCgpHYWxsZXJpYS5wcm90b3R5cGUubG9hZCA9IGZ1bmN0aW9uKCkgewoKICAgIC8vIHBhc3MgaWYgbm8gZGF0YSBpcyBwcm92aWRlZCBvciBwaWNhc2Egb3B0aW9uIG5vdCBmb3VuZAogICAgaWYgKCBhcmd1bWVudHMubGVuZ3RoIHx8IHR5cGVvZiB0aGlzLl9vcHRpb25zLnBpY2FzYSAhPT0gJ3N0cmluZycgKSB7CiAgICAgICAgbG9hZC5hcHBseSggdGhpcywgR2FsbGVyaWEudXRpbHMuYXJyYXkoIGFyZ3VtZW50cyApICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vIGRlZmluZSBzb21lIGxvY2FsIHZhcnMKICAgIHZhciBzZWxmID0gdGhpcywKICAgICAgICBhcmdzID0gR2FsbGVyaWEudXRpbHMuYXJyYXkoIGFyZ3VtZW50cyApLAogICAgICAgIHBpY2FzYSA9IHRoaXMuX29wdGlvbnMucGljYXNhLnNwbGl0KCc6JyksCiAgICAgICAgcCwKICAgICAgICBvcHRzID0gJC5leHRlbmQoe30sIHNlbGYuX29wdGlvbnMucGljYXNhT3B0aW9ucyksCiAgICAgICAgbG9hZGVyID0gdHlwZW9mIG9wdHMubG9hZGVyICE9PSAndW5kZWZpbmVkJyA/CiAgICAgICAgICAgIG9wdHMubG9hZGVyIDogJCgnPGRpdj4nKS5jc3MoewogICAgICAgICAgICAgICAgd2lkdGg6IDQ4LAogICAgICAgICAgICAgICAgaGVpZ2h0OiA0OCwKICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAuNywKICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6JyMwMDAgdXJsKCcrUEFUSCsnbG9hZGVyLmdpZikgbm8tcmVwZWF0IDUwJSA1MCUnCiAgICAgICAgICAgIH0pOwoKICAgIGlmICggcGljYXNhLmxlbmd0aCApIHsKCiAgICAgICAgLy8gdmFsaWRhdGUgdGhlIG1ldGhvZAogICAgICAgIGlmICggdHlwZW9mIEdhbGxlcmlhLlBpY2FzYS5wcm90b3R5cGVbIHBpY2FzYVswXSBdICE9PSAnZnVuY3Rpb24nICkgewogICAgICAgICAgICBHYWxsZXJpYS5yYWlzZSggcGljYXNhWzBdICsgJyBtZXRob2Qgbm90IGZvdW5kIGluIFBpY2FzYSBwbHVnaW4nICk7CiAgICAgICAgICAgIHJldHVybiBsb2FkLmFwcGx5KCB0aGlzLCBhcmdzICk7CiAgICAgICAgfQoKICAgICAgICAvLyB2YWxpZGF0ZSB0aGUgYXJndW1lbnQKICAgICAgICBpZiAoICFwaWNhc2FbMV0gKSB7CiAgICAgICAgICAgIEdhbGxlcmlhLnJhaXNlKCAnTm8gcGljYXNhIGFyZ3VtZW50IGZvdW5kJyApOwogICAgICAgICAgICByZXR1cm4gbG9hZC5hcHBseSggdGhpcywgYXJncyApOwogICAgICAgIH0KCiAgICAgICAgLy8gYXBwbHkgdGhlIHByZWxvYWRlcgogICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICBzZWxmLiQoICd0YXJnZXQnICkuYXBwZW5kKCBsb2FkZXIgKTsKICAgICAgICB9LDEwMCk7CgogICAgICAgIC8vIGNyZWF0ZSB0aGUgaW5zdGFuY2UKICAgICAgICBwID0gbmV3IEdhbGxlcmlhLlBpY2FzYSgpOwoKICAgICAgICAvLyBhcHBseSBGbGlja3Igb3B0aW9ucwogICAgICAgIGlmICggdHlwZW9mIHNlbGYuX29wdGlvbnMucGljYXNhT3B0aW9ucyA9PT0gJ29iamVjdCcgKSB7CiAgICAgICAgICAgIHAuc2V0T3B0aW9ucyggc2VsZi5fb3B0aW9ucy5waWNhc2FPcHRpb25zICk7CiAgICAgICAgfQoKICAgICAgICAvLyBjYWxsIHRoZSBwaWNhc2EgbWV0aG9kIGFuZCB0cmlnZ2VyIHRoZSBEQVRBIGV2ZW50CiAgICAgICAgdmFyIGFyZyA9IFtdOwogICAgICAgIGlmICggcGljYXNhWzBdID09ICd1c2VyYWxidW0nICkgewogICAgICAgICAgICBhcmcgPSBwaWNhc2FbMV0uc3BsaXQoJy8nKTsKICAgICAgICAgICAgaWYgKGFyZy5sZW5ndGggIT0gMikgewogICAgICAgICAgICAgICAgR2FsbGVyaWEucmFpc2UoICdQaWNhc2EgdXNlcmFsYnVtIG5vdCBjb3JyZWN0bHkgZm9ybWF0dGVkIChzaG91bGQgYmUgW3VzZXJdL1thbGJ1bV0pJyk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhcmcucHVzaCggcGljYXNhWzFdICk7CiAgICAgICAgfQoKICAgICAgICBhcmcucHVzaChmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgICAgIHNlbGYuX2RhdGEgPSBkYXRhOwogICAgICAgICAgICBsb2FkZXIucmVtb3ZlKCk7CiAgICAgICAgICAgIHNlbGYudHJpZ2dlciggR2FsbGVyaWEuREFUQSApOwogICAgICAgICAgICBwLm9wdGlvbnMuY29tcGxldGUuY2FsbChwLCBkYXRhKTsKICAgICAgICB9KTsKCiAgICAgICAgcFsgcGljYXNhWzBdIF0uYXBwbHkoIHAsIGFyZyApOwoKICAgIH0gZWxzZSB7CgogICAgICAgIC8vIGlmIGZsaWNrciBhcnJheSBub3QgZm91bmQsIHBhc3MKICAgICAgICBsb2FkLmFwcGx5KCB0aGlzLCBhcmdzICk7CiAgICB9Cn07Cgp9KCBqUXVlcnkgKSApOw==]]></data>
	</file>
	<file>
	  <filename>/script/plugins/galleria/plugins/picasa/galleria.picasa.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKIEdhbGxlcmlhIFBpY2FzYSBQbHVnaW4gMjAxMS0wOC0wMQogaHR0cDovL2dhbGxlcmlhLmFpbm8uc2UKCiBDb3B5cmlnaHQgMjAxMSwgQWlubwogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLgoqLwpHYWxsZXJpYS5yZXF1aXJlcygxLjI1LCJUaGUgUGljYXNhIFBsdWdpbiByZXF1aXJlcyBHYWxsZXJpYSB2ZXJzaW9uIDEuMi41IG9yIGxhdGVyLiIpOwooZnVuY3Rpb24oZil7dmFyIGk9R2FsbGVyaWEudXRpbHMuZ2V0U2NyaXB0UGF0aCgpO0dhbGxlcmlhLlBpY2FzYT1mdW5jdGlvbigpe3RoaXMub3B0aW9ucz17bWF4OjMwLGltYWdlU2l6ZToibWVkaXVtIix0aHVtYlNpemU6InRodW1iIixkZXNjcmlwdGlvbjohMSxjb21wbGV0ZTpmdW5jdGlvbigpe319fTtHYWxsZXJpYS5QaWNhc2EucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpHYWxsZXJpYS5QaWNhc2Esc2VhcmNoOmZ1bmN0aW9uKGMsYSl7cmV0dXJuIHRoaXMuX2NhbGwoInNlYXJjaCIsImFsbCIse3E6Y30sYSl9LHVzZXI6ZnVuY3Rpb24oYyxhKXtyZXR1cm4gdGhpcy5fY2FsbCgidXNlciIsInVzZXIvIitjLGEpfSx1c2VyYWxidW06ZnVuY3Rpb24oYyxhLGIpe3JldHVybiB0aGlzLl9jYWxsKCJ1c2VyYWxidW0iLCJ1c2VyLyIrYysiL2FsYnVtLyIrYSxiKX0sc2V0T3B0aW9uczpmdW5jdGlvbihjKXtmLmV4dGVuZCh0aGlzLm9wdGlvbnMsYyk7cmV0dXJuIHRoaXN9LF9jYWxsOmZ1bmN0aW9uKGMsCmEsYixkKXthPSJodHRwczovL3BpY2FzYXdlYi5nb29nbGUuY29tL2RhdGEvZmVlZC9hcGkvIithKyI/Ijt0eXBlb2YgYj09ImZ1bmN0aW9uIiYmKGQ9YixiPXt9KTt2YXIgZT10aGlzLGI9Zi5leHRlbmQoe2tpbmQ6InBob3RvIixhY2Nlc3M6InB1YmxpYyIsIm1heC1yZXN1bHRzIjp0aGlzLm9wdGlvbnMubWF4LHRodW1ic2l6ZTp0aGlzLl9nZXRTaXplcygpLmpvaW4oIiwiKSxhbHQ6Impzb24taW4tc2NyaXB0IixjYWxsYmFjazoiPyJ9LGIpO2YuZWFjaChiLGZ1bmN0aW9uKGIsYyl7YSs9IiYiK2IrIj0iK2N9KTt2YXIgZz0hMTtHYWxsZXJpYS51dGlscy53YWl0KHt1bnRpbDpmdW5jdGlvbigpe3JldHVybiBnfSxzdWNjZXNzOmZ1bmN0aW9uKCl7ZS5fcGFyc2UuY2FsbChlLGcuZmVlZC5lbnRyeSxkKX0sZXJyb3I6ZnVuY3Rpb24oKXt2YXIgYT0iIjtjPT0idXNlciI/YT0idXNlciBub3QgZm91bmQuIjpjPT0idXNlcmFsYnVtIiYmKGE9ImFsYnVtIG9yIHVzZXIgbm90IGZvdW5kLiIpOwpHYWxsZXJpYS5yYWlzZSgiUGljYXNhIHJlcXVlc3QgZmFpbGVkIisoYT8iOiAiK2E6Ii4iKSl9LHRpbWVvdXQ6NUUzfSk7Zi5nZXRKU09OKGEsZnVuY3Rpb24oYSl7Zz1hfSk7cmV0dXJuIGV9LF9nZXRTaXplczpmdW5jdGlvbigpe3ZhciBjPXtzbWFsbDoiNzJjIix0aHVtYjoiMTA0dSIsbWVkaXVtOiI2NDB1IixiaWc6IjEwMjR1IixvcmlnaW5hbDoiMTYwMHUifSxhPXRoaXMub3B0aW9ucyxiPXt9LGQsZT1bMzIsNDgsNjQsNzIsOTQsMTA0LDExMCwxMjgsMTQ0LDE1MCwxNjAsMjAwLDIyMCwyODgsMzIwLDQwMCw1MTIsNTc2LDY0MCw3MjAsODAwLDkxMiwxMDI0LDExNTIsMTI4MCwxNDQwLDE2MDBdO2YoWyJ0aHVtYlNpemUiLCJpbWFnZVNpemUiXSkuZWFjaChmdW5jdGlvbigpe2FbdGhpc11pbiBjP2JbdGhpc109Y1thW3RoaXNdXTooZD1HYWxsZXJpYS51dGlscy5wYXJzZVZhbHVlKGFbdGhpc10pLGQ+MTYwMD9kPTE2MDA6Zi5lYWNoKGUsZnVuY3Rpb24oYSl7aWYoZDx0aGlzKXJldHVybiBkPQplW2EtMV0sITF9KSxiW3RoaXNdPWQpfSk7cmV0dXJuW2IudGh1bWJTaXplLGIuaW1hZ2VTaXplLCIxMjgwdSJdfSxfcGFyc2U6ZnVuY3Rpb24oYyxhKXt2YXIgYj10aGlzLGQ9W10sZTtmLmVhY2goYyxmdW5jdGlvbigpe2U9dGhpcy5tZWRpYSRncm91cC5tZWRpYSR0aHVtYm5haWw7ZC5wdXNoKHt0aHVtYjplWzBdLnVybCxpbWFnZTplWzFdLnVybCxiaWc6ZVsyXS51cmwsdGl0bGU6dGhpcy50aXRsZS4kdCxkZXNjcmlwdGlvbjpiLm9wdGlvbnMuZGVzY3JpcHRpb24/dGhpcy5zdW1tYXJ5LiR0OiIifSl9KTthLmNhbGwodGhpcyxkKX19O3ZhciBoPUdhbGxlcmlhLnByb3RvdHlwZS5sb2FkO0dhbGxlcmlhLnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzLmxlbmd0aHx8dHlwZW9mIHRoaXMuX29wdGlvbnMucGljYXNhIT09InN0cmluZyIpaC5hcHBseSh0aGlzLEdhbGxlcmlhLnV0aWxzLmFycmF5KGFyZ3VtZW50cykpO2Vsc2V7dmFyIGM9dGhpcyxhPUdhbGxlcmlhLnV0aWxzLmFycmF5KGFyZ3VtZW50cyksCmI9dGhpcy5fb3B0aW9ucy5waWNhc2Euc3BsaXQoIjoiKSxkLGU9Zi5leHRlbmQoe30sYy5fb3B0aW9ucy5waWNhc2FPcHRpb25zKSxnPXR5cGVvZiBlLmxvYWRlciE9PSJ1bmRlZmluZWQiP2UubG9hZGVyOmYoIjxkaXY+IikuY3NzKHt3aWR0aDo0OCxoZWlnaHQ6NDgsb3BhY2l0eTowLjcsYmFja2dyb3VuZDoiIzAwMCB1cmwoIitpKyJsb2FkZXIuZ2lmKSBuby1yZXBlYXQgNTAlIDUwJSJ9KTtpZihiLmxlbmd0aCl7aWYodHlwZW9mIEdhbGxlcmlhLlBpY2FzYS5wcm90b3R5cGVbYlswXV0hPT0iZnVuY3Rpb24iKXJldHVybiBHYWxsZXJpYS5yYWlzZShiWzBdKyIgbWV0aG9kIG5vdCBmb3VuZCBpbiBQaWNhc2EgcGx1Z2luIiksaC5hcHBseSh0aGlzLGEpO2lmKCFiWzFdKXJldHVybiBHYWxsZXJpYS5yYWlzZSgiTm8gcGljYXNhIGFyZ3VtZW50IGZvdW5kIiksaC5hcHBseSh0aGlzLGEpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yy4kKCJ0YXJnZXQiKS5hcHBlbmQoZyl9LAoxMDApO2Q9bmV3IEdhbGxlcmlhLlBpY2FzYTt0eXBlb2YgYy5fb3B0aW9ucy5waWNhc2FPcHRpb25zPT09Im9iamVjdCImJmQuc2V0T3B0aW9ucyhjLl9vcHRpb25zLnBpY2FzYU9wdGlvbnMpO2E9W107aWYoYlswXT09InVzZXJhbGJ1bSIpe2lmKGE9YlsxXS5zcGxpdCgiLyIpLGEubGVuZ3RoIT0yKXtHYWxsZXJpYS5yYWlzZSgiUGljYXNhIHVzZXJhbGJ1bSBub3QgY29ycmVjdGx5IGZvcm1hdHRlZCAoc2hvdWxkIGJlIFt1c2VyXS9bYWxidW1dKSIpO3JldHVybn19ZWxzZSBhLnB1c2goYlsxXSk7YS5wdXNoKGZ1bmN0aW9uKGEpe2MuX2RhdGE9YTtnLnJlbW92ZSgpO2MudHJpZ2dlcihHYWxsZXJpYS5EQVRBKTtkLm9wdGlvbnMuY29tcGxldGUuY2FsbChkLGEpfSk7ZFtiWzBdXS5hcHBseShkLGEpfWVsc2UgaC5hcHBseSh0aGlzLGEpfX19KShqUXVlcnkpOwo=]]></data>
	</file>
	<file>
	  <filename>/script/plugins/galleria/plugins/picasa/loader.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEAAQAPQAAAAAAP///w4ODnR0dB4eHri4uISEhP///6amptra2lJSUkBAQOrq6mJiYvr6+sjIyJaWlgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH+GkNyZWF0ZWQgd2l0aCBhamF4bG9hZC5pbmZvACH5BAAKAAAAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAEAAQAAAFdyAgAgIJIeWoAkRCCMdBkKtIHIngyMKsErPBYbADpkSCwhDmQCBethRB6Vj4kFCkQPG4IlWDgrNRIwnO4UKBXDufzQvDMaoSDBgFb886MiQadgNABAokfCwzBA8LCg0Egl8jAggGAA1kBIA1BAYzlyILczULC2UhACH5BAAKAAEALAAAAAAQABAAAAV2ICACAmlAZTmOREEIyUEQjLKKxPHADhEvqxlgcGgkGI1DYSVAIAWMx+lwSKkICJ0QsHi9RgKBwnVTiRQQgwF4I4UFDQQEwi6/3YSGWRRmjhEETAJfIgMFCnAKM0KDV4EEEAQLiF18TAYNXDaSe3x6mjidN1s3IQAh+QQACgACACwAAAAAEAAQAAAFeCAgAgLZDGU5jgRECEUiCI+yioSDwDJyLKsXoHFQxBSHAoAAFBhqtMJg8DgQBgfrEsJAEAg4YhZIEiwgKtHiMBgtpg3wbUZXGO7kOb1MUKRFMysCChAoggJCIg0GC2aNe4gqQldfL4l/Ag1AXySJgn5LcoE3QXI3IQAh+QQACgADACwAAAAAEAAQAAAFdiAgAgLZNGU5joQhCEjxIssqEo8bC9BRjy9Ag7GILQ4QEoE0gBAEBcOpcBA0DoxSK/e8LRIHn+i1cK0IyKdg0VAoljYIg+GgnRrwVS/8IAkICyosBIQpBAMoKy9dImxPhS+GKkFrkX+TigtLlIyKXUF+NjagNiEAIfkEAAoABAAsAAAAABAAEAAABWwgIAICaRhlOY4EIgjH8R7LKhKHGwsMvb4AAy3WODBIBBKCsYA9TjuhDNDKEVSERezQEL0WrhXucRUQGuik7bFlngzqVW9LMl9XWvLdjFaJtDFqZ1cEZUB0dUgvL3dgP4WJZn4jkomWNpSTIyEAIfkEAAoABQAsAAAAABAAEAAABX4gIAICuSxlOY6CIgiD8RrEKgqGOwxwUrMlAoSwIzAGpJpgoSDAGifDY5kopBYDlEpAQBwevxfBtRIUGi8xwWkDNBCIwmC9Vq0aiQQDQuK+VgQPDXV9hCJjBwcFYU5pLwwHXQcMKSmNLQcIAExlbH8JBwttaX0ABAcNbWVbKyEAIfkEAAoABgAsAAAAABAAEAAABXkgIAICSRBlOY7CIghN8zbEKsKoIjdFzZaEgUBHKChMJtRwcWpAWoWnifm6ESAMhO8lQK0EEAV3rFopIBCEcGwDKAqPh4HUrY4ICHH1dSoTFgcHUiZjBhAJB2AHDykpKAwHAwdzf19KkASIPl9cDgcnDkdtNwiMJCshACH5BAAKAAcALAAAAAAQABAAAAV3ICACAkkQZTmOAiosiyAoxCq+KPxCNVsSMRgBsiClWrLTSWFoIQZHl6pleBh6suxKMIhlvzbAwkBWfFWrBQTxNLq2RG2yhSUkDs2b63AYDAoJXAcFRwADeAkJDX0AQCsEfAQMDAIPBz0rCgcxky0JRWE1AmwpKyEAIfkEAAoACAAsAAAAABAAEAAABXkgIAICKZzkqJ4nQZxLqZKv4NqNLKK2/Q4Ek4lFXChsg5ypJjs1II3gEDUSRInEGYAw6B6zM4JhrDAtEosVkLUtHA7RHaHAGJQEjsODcEg0FBAFVgkQJQ1pAwcDDw8KcFtSInwJAowCCA6RIwqZAgkPNgVpWndjdyohACH5BAAKAAkALAAAAAAQABAAAAV5ICACAimc5KieLEuUKvm2xAKLqDCfC2GaO9eL0LABWTiBYmA06W6kHgvCqEJiAIJiu3gcvgUsscHUERm+kaCxyxa+zRPk0SgJEgfIvbAdIAQLCAYlCj4DBw0IBQsMCjIqBAcPAooCBg9pKgsJLwUFOhCZKyQDA3YqIQAh+QQACgAKACwAAAAAEAAQAAAFdSAgAgIpnOSonmxbqiThCrJKEHFbo8JxDDOZYFFb+A41E4H4OhkOipXwBElYITDAckFEOBgMQ3arkMkUBdxIUGZpEb7kaQBRlASPg0FQQHAbEEMGDSVEAA1QBhAED1E0NgwFAooCDWljaQIQCE5qMHcNhCkjIQAh+QQACgALACwAAAAAEAAQAAAFeSAgAgIpnOSoLgxxvqgKLEcCC65KEAByKK8cSpA4DAiHQ/DkKhGKh4ZCtCyZGo6F6iYYPAqFgYy02xkSaLEMV34tELyRYNEsCQyHlvWkGCzsPgMCEAY7Cg04Uk48LAsDhRA8MVQPEF0GAgqYYwSRlycNcWskCkApIyEAOwAAAAAAAAAAAA==]]></data>
	</file>
	<file>
	  <filename>/script/plugins/galleria/plugins/picasa/picasa-demo.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KICAgIDxoZWFkPgogICAgICAgIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICAgICAgICA8dGl0bGU+R2FsbGVyaWEgRmxpY2tyIFBsdWdpbjwvdGl0bGU+CiAgICAgICAgPHN0eWxlPgoKICAgICAgICAgICAgLyogRGVtbyBzdHlsZXMgKi8KICAgICAgICAgICAgaHRtbCxib2R5e2JhY2tncm91bmQ6IzIyMjttYXJnaW46MDt9CiAgICAgICAgICAgIGJvZHl7Ym9yZGVyLXRvcDo0cHggc29saWQgIzAwMDt9CiAgICAgICAgICAgIC5jb250ZW50e2NvbG9yOiM3Nzc7Zm9udDoxMnB4LzEuNCAiaGVsdmV0aWNhIG5ldWUiLGFyaWFsLHNhbnMtc2VyaWY7d2lkdGg6NjIwcHg7bWFyZ2luOjIwcHggYXV0bzt9CiAgICAgICAgICAgIGgxe2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0Om5vcm1hbDtjb2xvcjojZGRkO21hcmdpbjowO30KICAgICAgICAgICAgcHttYXJnaW46MCAwIDIwcHh9CiAgICAgICAgICAgIGEge2NvbG9yOiMyMkJDQjk7dGV4dC1kZWNvcmF0aW9uOm5vbmU7fQogICAgICAgICAgICAuY3JlZHttYXJnaW4tdG9wOjIwcHg7Zm9udC1zaXplOjExcHg7fQoKICAgICAgICAgICAgLyogVGhpcyBydWxlIGlzIHJlYWQgYnkgR2FsbGVyaWEgdG8gZGVmaW5lIHRoZSBnYWxsZXJ5IGhlaWdodDogKi8KICAgICAgICAgICAgI2dhbGxlcmlhe2hlaWdodDozMjBweDt9CgogICAgICAgIDwvc3R5bGU+CgogICAgICAgIDwhLS0gbG9hZCBqUXVlcnkgLS0+CiAgICAgICAgPHNjcmlwdCBzcmM9Imh0dHA6Ly9hamF4Lmdvb2dsZWFwaXMuY29tL2FqYXgvbGlicy9qcXVlcnkvMS9qcXVlcnkubWluLmpzIj48L3NjcmlwdD4KCiAgICAgICAgPCEtLSBsb2FkIEdhbGxlcmlhIC0tPgogICAgICAgIDxzY3JpcHQgc3JjPSIuLi8uLi9nYWxsZXJpYS0xLjIuNi5taW4uanMiPjwvc2NyaXB0PgoKICAgICAgICA8IS0tIGxvYWQgcGljYXNhIHBsdWdpbiAtLT4KICAgICAgICA8c2NyaXB0IHNyYz0iZ2FsbGVyaWEucGljYXNhLm1pbi5qcyI+PC9zY3JpcHQ+CgogICAgPC9oZWFkPgo8Ym9keT4KICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgogICAgICAgIDxoMT5HYWxsZXJpYSBQaWNhc2EgUGx1Z2luIERlbW88L2gxPgogICAgICAgIDxwPkRlbW9uc3RyYXRpbmcgYSBiYXNpYyBnYWxsZXJ5IGV4YW1wbGUgd2l0aCBwaG90b3MgZnJvbSBhIFBpY2FzYSBhbGJ1bS48L3A+CgogICAgICAgIDwhLS0gQWRkaW5nIGdhbGxlcnkgaW1hZ2VzLiBUaGlzIGlzIGp1c3QgYSBjb250YWluZXIgZm9yIHRoZSBkeW5hbWljIHBpY2FzYSBpbWFnZXMgLS0+CgogICAgICAgIDxkaXYgaWQ9ImdhbGxlcmlhIj48L2Rpdj4KCiAgICAgICAgPHAgY2xhc3M9ImNyZWQiPk1hZGUgYnkgPGEgaHJlZj0iaHR0cDovL2dhbGxlcmlhLmFpbm8uc2UiPkdhbGxlcmlhPC9hPi48L3A+CiAgICA8L2Rpdj4KICAgIDxzY3JpcHQ+CgogICAgLy8gTG9hZCB0aGUgY2xhc3NpYyB0aGVtZQogICAgR2FsbGVyaWEubG9hZFRoZW1lKCcuLi8uLi90aGVtZXMvY2xhc3NpYy9nYWxsZXJpYS5jbGFzc2ljLm1pbi5qcycpOwoKICAgICQoJyNnYWxsZXJpYScpLmdhbGxlcmlhKHsKICAgICAgICAvLyBUaGUgdXNlciAmIGFsYnVtLiBUaGlzIGV4YW1wbGUgZmV0Y2hlcyB0aGUgYWxidW0gIkRlbW8iIGZyb20gdGhlIHVzZXIgImdhbGxlcmlhanMiCiAgICAgICAgcGljYXNhOiAndXNlcmFsYnVtOmdhbGxlcmlhanMvRGVtbycKICAgIH0pOwoKICAgIDwvc2NyaXB0PgogICAgPC9ib2R5Pgo8L2h0bWw+]]></data>
	</file>
	<file>
	  <filename>/script/plugins/galleria/themes/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/script/plugins/galleria/themes/classic/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/script/plugins/galleria/themes/classic/classic-demo.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KICAgIDxoZWFkPgogICAgICAgIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICAgICAgICA8dGl0bGU+R2FsbGVyaWEgQ2xhc3NpYyBUaGVtZTwvdGl0bGU+CiAgICAgICAgPHN0eWxlPgoKICAgICAgICAgICAgLyogRGVtbyBzdHlsZXMgKi8KICAgICAgICAgICAgaHRtbCxib2R5e2JhY2tncm91bmQ6IzIyMjttYXJnaW46MDt9CiAgICAgICAgICAgIGJvZHl7Ym9yZGVyLXRvcDo0cHggc29saWQgIzAwMDt9CiAgICAgICAgICAgIC5jb250ZW50e2NvbG9yOiM3Nzc7Zm9udDoxMnB4LzEuNCAiaGVsdmV0aWNhIG5ldWUiLGFyaWFsLHNhbnMtc2VyaWY7d2lkdGg6NjIwcHg7bWFyZ2luOjIwcHggYXV0bzt9CiAgICAgICAgICAgIGgxe2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0Om5vcm1hbDtjb2xvcjojZGRkO21hcmdpbjowO30KICAgICAgICAgICAgcHttYXJnaW46MCAwIDIwcHh9CiAgICAgICAgICAgIGEge2NvbG9yOiMyMkJDQjk7dGV4dC1kZWNvcmF0aW9uOm5vbmU7fQogICAgICAgICAgICAuY3JlZHttYXJnaW4tdG9wOjIwcHg7Zm9udC1zaXplOjExcHg7fQoKICAgICAgICAgICAgLyogVGhpcyBydWxlIGlzIHJlYWQgYnkgR2FsbGVyaWEgdG8gZGVmaW5lIHRoZSBnYWxsZXJ5IGhlaWdodDogKi8KICAgICAgICAgICAgI2dhbGxlcmlhe2hlaWdodDozMjBweH0KCiAgICAgICAgPC9zdHlsZT4KCiAgICAgICAgPCEtLSBsb2FkIGpRdWVyeSAtLT4KICAgICAgICA8c2NyaXB0IHNyYz0iaHR0cDovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xL2pxdWVyeS5taW4uanMiPjwvc2NyaXB0PgoKICAgICAgICA8IS0tIGxvYWQgR2FsbGVyaWEgLS0+CiAgICAgICAgPHNjcmlwdCBzcmM9Ii4uLy4uL2dhbGxlcmlhLTEuMi42Lm1pbi5qcyI+PC9zY3JpcHQ+CgogICAgPC9oZWFkPgo8Ym9keT4KICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgogICAgICAgIDxoMT5HYWxsZXJpYSBDbGFzc2ljIFRoZW1lPC9oMT4KICAgICAgICA8cD5EZW1vbnN0cmF0aW5nIGEgYmFzaWMgZ2FsbGVyeSBleGFtcGxlLjwvcD4KCiAgICAgICAgPCEtLSBBZGRpbmcgZ2FsbGVyeSBpbWFnZXMuIFdlIHVzZSByZXNpemVkIHRodW1ibmFpbHMgaGVyZSBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlLCBidXQgaXTigJlzIG5vdCBuZWNlc3NhcnkgLS0+CgogICAgICAgIDxkaXYgaWQ9ImdhbGxlcmlhIj4KICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zL3RodW1iLzMvMzQvTG9jb21vdGl2ZXMtUm91bmRob3VzZTIuanBnLzgwMHB4LUxvY29tb3RpdmVzLVJvdW5kaG91c2UyLmpwZyI+CiAgICAgICAgICAgIAk8aW1nIHRpdGxlPSJMb2NvbW90aXZlcyBSb3VuZGhvdXNlIgogICAgICAgICAgICAJICAgICBhbHQ9IlN0ZWFtIGxvY29tb3RpdmVzIG9mIHRoZSBDaGljYWdvICZhbXA7IE5vcnRoIFdlc3Rlcm4gUmFpbHdheS4iCiAgICAgICAgICAgIAkgICAgIHNyYz0iaHR0cDovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zL3RodW1iLzMvMzQvTG9jb21vdGl2ZXMtUm91bmRob3VzZTIuanBnLzEwMHB4LUxvY29tb3RpdmVzLVJvdW5kaG91c2UyLmpwZyI+CiAgICAgICAgCTwvYT4KICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zL3RodW1iLzMvMzYvSWNlYmVyZ3NfaW5fdGhlX0hpZ2hfQXJjdGljXy1fMjAwNTA5MDcuanBnLzEwMDBweC1JY2ViZXJnc19pbl90aGVfSGlnaF9BcmN0aWNfLV8yMDA1MDkwNy5qcGciPgogICAgICAgICAgICAgICAgPGltZyB0aXRsZT0iSWNlYmVyZ3MgaW4gdGhlIEhpZ2ggQXJjdGljIgogICAgICAgICAgICAgICAgICAgICBhbHQ9IuKAnVRoZSBkZWJyaXMgbG9hZGluZyBpc24ndCBwYXJ0aWN1bGFybHkgZXh0ZW5zaXZlLCBidXQgdGhlIGNvbG9yIGlzIHVzdWFsLuKAnSIKICAgICAgICAgICAgICAgICAgICAgc3JjPSJodHRwOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvdGh1bWIvMy8zNi9JY2ViZXJnc19pbl90aGVfSGlnaF9BcmN0aWNfLV8yMDA1MDkwNy5qcGcvMTAwcHgtSWNlYmVyZ3NfaW5fdGhlX0hpZ2hfQXJjdGljXy1fMjAwNTA5MDcuanBnIj4KICAgICAgICAgICAgPC9hPgogICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvdGh1bWIvZi9mZS9BcmElQzMlQjFhLl9BX0VzdHJhZGElMkNfR2FsaXphLl8wMi5qcGcvMTAwMHB4LUFyYSVDMyVCMWEuX0FfRXN0cmFkYSUyQ19HYWxpemEuXzAyLmpwZyI+CiAgICAgICAgICAgICAgICA8aW1nIHRpdGxlPSJBcmHDsWEiCiAgICAgICAgICAgICAgICAgICAgIGFsdD0iWHlzdGljdXMgY3Jpc3RhdHVzLCBBIEVzdHJhZGEsIEdhbGljaWEsIFNwYWluIgogICAgICAgICAgICAgICAgICAgICBzcmM9Imh0dHA6Ly91cGxvYWQud2lraW1lZGlhLm9yZy93aWtpcGVkaWEvY29tbW9ucy90aHVtYi9mL2ZlL0FyYSVDMyVCMWEuX0FfRXN0cmFkYSUyQ19HYWxpemEuXzAyLmpwZy8xMDBweC1BcmElQzMlQjFhLl9BX0VzdHJhZGElMkNfR2FsaXphLl8wMi5qcGciPgogICAgICAgICAgICA8L2E+CiAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly91cGxvYWQud2lraW1lZGlhLm9yZy93aWtpcGVkaWEvY29tbW9ucy90aHVtYi8yLzJkLzkxMDRfLV9NaWxhbm9fLV9NdXNlb19zdG9yaWFfbmF0dXJhbGVfLV9GbHVvcml0ZV8tX0ZvdG9fR2lvdmFubmlfRGFsbCUyN09ydG9fMjItQXByLTIwMDcuanBnLzEwMDBweC05MTA0Xy1fTWlsYW5vXy1fTXVzZW9fc3RvcmlhX25hdHVyYWxlXy1fRmx1b3JpdGVfLV9Gb3RvX0dpb3Zhbm5pX0RhbGwlMjdPcnRvXzIyLUFwci0yMDA3LmpwZyI+CiAgICAgICAgICAgICAgICA8aW1nIHRpdGxlPSJNdXNlbyBzdG9yaWEgbmF0dXJhbGUiCiAgICAgICAgICAgICAgICAgICAgIHNyYz0iaHR0cDovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zL3RodW1iLzIvMmQvOTEwNF8tX01pbGFub18tX011c2VvX3N0b3JpYV9uYXR1cmFsZV8tX0ZsdW9yaXRlXy1fRm90b19HaW92YW5uaV9EYWxsJTI3T3J0b18yMi1BcHItMjAwNy5qcGcvMTAwcHgtOTEwNF8tX01pbGFub18tX011c2VvX3N0b3JpYV9uYXR1cmFsZV8tX0ZsdW9yaXRlXy1fRm90b19HaW92YW5uaV9EYWxsJTI3T3J0b18yMi1BcHItMjAwNy5qcGciPgogICAgICAgICAgICA8L2E+CiAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly91cGxvYWQud2lraW1lZGlhLm9yZy93aWtpcGVkaWEvY29tbW9ucy90aHVtYi8xLzE1L0dyaiVDMyVCM3RhZ2olQzMlQTFfY2F2ZXNfaW5fc3VtbWVyXzIwMDlfJTI4MiUyOS5qcGcvMTAwMHB4LUdyaiVDMyVCM3RhZ2olQzMlQTFfY2F2ZXNfaW5fc3VtbWVyXzIwMDlfJTI4MiUyOS5qcGciPgogICAgICAgICAgICAgICAgPGltZyB0aXRsZT0iR3Jqw7N0YWdqw6EgY2F2ZXMgaW4gc3VtbWVyIDIwMDkiCiAgICAgICAgICAgICAgICAgICAgIHNyYz0iaHR0cDovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zL3RodW1iLzEvMTUvR3JqJUMzJUIzdGFnaiVDMyVBMV9jYXZlc19pbl9zdW1tZXJfMjAwOV8lMjgyJTI5LmpwZy8xMDBweC1HcmolQzMlQjN0YWdqJUMzJUExX2NhdmVzX2luX3N1bW1lcl8yMDA5XyUyODIlMjkuanBnIj4KICAgICAgICAgICAgPC9hPgogICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvdGh1bWIvOS85MC8yMDA5MTEyOF9Mb3V0cmFfVGhlcm1lc19YYW50aGlfVGhyYWNlX0dyZWVjZV8yLmpwZy8xMDAwcHgtMjAwOTExMjhfTG91dHJhX1RoZXJtZXNfWGFudGhpX1RocmFjZV9HcmVlY2VfMi5qcGciPgogICAgICAgICAgICAgICAgPGltZyB0aXRsZT0iVGhlcm1lcyIKICAgICAgICAgICAgICAgICAgICAgYWx0PSJYYW50aGkgaG90LXNwYSBzcHJpbmdzLCBYYW50aGkgUHJlZmVjdHVyZSwgR3JlZWNlIgogICAgICAgICAgICAgICAgICAgICBzcmM9Imh0dHA6Ly91cGxvYWQud2lraW1lZGlhLm9yZy93aWtpcGVkaWEvY29tbW9ucy90aHVtYi85LzkwLzIwMDkxMTI4X0xvdXRyYV9UaGVybWVzX1hhbnRoaV9UaHJhY2VfR3JlZWNlXzIuanBnLzEwMHB4LTIwMDkxMTI4X0xvdXRyYV9UaGVybWVzX1hhbnRoaV9UaHJhY2VfR3JlZWNlXzIuanBnIj4KICAgICAgICAgICAgPC9hPgogICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvdGh1bWIvNS81OC9Qb2xpc2hfQXJteV9LbyVDNSU4Mm9icnplZ18wNzcuSlBHLzEwMjRweC1Qb2xpc2hfQXJteV9LbyVDNSU4Mm9icnplZ18wNzcuSlBHIj4KICAgICAgICAgICAgICAgIDxpbWcgdGl0bGU9IlBvbGlzaCBBcm15IEtvxYJvYnJ6ZWciCiAgICAgICAgICAgICAgICAgICAgIGFsdD0iQSBkaXNwbGF5IG9mIHRoZSBQb2xpc2ggQXJteS4gQm90aCB0aGUgc29sZGllciwgYW5kIHRoZSB2ZWhpY2xlIGJlbG9uZyB0byB0aGUgN3RoIFBvbWVyYW5pYW4gQ29hc3RhbCBEZWZlbmNlIEJyaWdhZGUsIGEgcGFydCBvZiB0aGUgU3pjemVjaW4tYmFzZWQgMTJ0aCBNZWNoYW5pemVkIERpdmlzaW9uIOKAnUJvbGVzxYJhdyBLcnp5d291c3R54oCdIgogICAgICAgICAgICAgICAgICAgICBzcmM9Imh0dHA6Ly91cGxvYWQud2lraW1lZGlhLm9yZy93aWtpcGVkaWEvY29tbW9ucy90aHVtYi81LzU4L1BvbGlzaF9Bcm15X0tvJUM1JTgyb2JyemVnXzA3Ny5KUEcvMTAwcHgtUG9saXNoX0FybXlfS28lQzUlODJvYnJ6ZWdfMDc3LkpQRyI+CiAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zL3RodW1iLzIvMmQvMjAxMDAyMTNfWmxhdG9ncmFkX0J1bGdhcmlhXzMuanBnLzEwMjRweC0yMDEwMDIxM19abGF0b2dyYWRfQnVsZ2FyaWFfMy5qcGciPgogICAgICAgICAgICAgICAgPGltZyB0aXRsZT0iWmxhdG9ncmFkIEJ1bGdhcmlhIgogICAgICAgICAgICAgICAgICAgICBzcmM9Imh0dHA6Ly91cGxvYWQud2lraW1lZGlhLm9yZy93aWtpcGVkaWEvY29tbW9ucy90aHVtYi8yLzJkLzIwMTAwMjEzX1psYXRvZ3JhZF9CdWxnYXJpYV8zLmpwZy8xMDBweC0yMDEwMDIxM19abGF0b2dyYWRfQnVsZ2FyaWFfMy5qcGciPgogICAgICAgICAgICA8L2E+CiAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly91cGxvYWQud2lraW1lZGlhLm9yZy93aWtpcGVkaWEvY29tbW9ucy90aHVtYi9iL2I1L0ZFTUFfLV81Mzk5Xy1fUGhvdG9ncmFwaF9ieV9BbmRyZWFfQm9vaGVyX3Rha2VuX29uXzA5LTI4LTIwMDFfaW5fTmV3X1lvcmsuanBnLzEwMjRweC1GRU1BXy1fNTM5OV8tX1Bob3RvZ3JhcGhfYnlfQW5kcmVhX0Jvb2hlcl90YWtlbl9vbl8wOS0yOC0yMDAxX2luX05ld19Zb3JrLmpwZyI+CiAgICAgICAgICAgICAgICA8aW1nIHRpdGxlPSIwOS0yOC0yMDAxIGluIE5ldyBZb3JrIENpdHkiCiAgICAgICAgICAgICAgICAgICAgIGFsdD0iTmV3IFlvcmssIE5ZLCBTZXB0ZW1iZXIgMjgsIDIwMDEgLS0gRGVicmlzIG9uIHN1cnJvdW5kaW5nIHJvb2ZzIGF0IHRoZSBzaXRlIG9mIHRoZSBXb3JsZCBUcmFkZSBDZW50ZXIuIFBob3RvIGJ5IEFuZHJlYSBCb29oZXIvIEZFTUEgTmV3cyBQaG90byIKICAgICAgICAgICAgICAgICAgICAgc3JjPSJodHRwOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvdGh1bWIvYi9iNS9GRU1BXy1fNTM5OV8tX1Bob3RvZ3JhcGhfYnlfQW5kcmVhX0Jvb2hlcl90YWtlbl9vbl8wOS0yOC0yMDAxX2luX05ld19Zb3JrLmpwZy8xMDBweC1GRU1BXy1fNTM5OV8tX1Bob3RvZ3JhcGhfYnlfQW5kcmVhX0Jvb2hlcl90YWtlbl9vbl8wOS0yOC0yMDAxX2luX05ld19Zb3JrLmpwZyI+CiAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zL3RodW1iL2UvZTYvQW50ZW5uYWUlMkNfSHViYmxlX2ltYWdlcy5qcGcvMTAyNHB4LUFudGVubmFlJTJDX0h1YmJsZV9pbWFnZXMuanBnIj4KICAgICAgICAgICAgICAgIDxpbWcgc3JjPSJodHRwOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvdGh1bWIvZS9lNi9BbnRlbm5hZSUyQ19IdWJibGVfaW1hZ2VzLmpwZy8xMDBweC1BbnRlbm5hZSUyQ19IdWJibGVfaW1hZ2VzLmpwZyI+CiAgICAgICAgICAgIDwvYT4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPHAgY2xhc3M9ImNyZWQiPk1hZGUgYnkgPGEgaHJlZj0iaHR0cDovL2dhbGxlcmlhLmFpbm8uc2UiPkdhbGxlcmlhPC9hPi48L3A+CiAgICA8L2Rpdj4KCiAgICA8c2NyaXB0PgoKICAgIC8vIExvYWQgdGhlIGNsYXNzaWMgdGhlbWUKCUdhbGxlcmlhLmxvYWRUaGVtZSgnZ2FsbGVyaWEuY2xhc3NpYy5taW4uanMnKTsKCgkvLyBJbml0aWFsaXplIEdhbGxlcmlhCgkkKCcjZ2FsbGVyaWEnKS5nYWxsZXJpYSgpOwoKICAgIDwvc2NyaXB0PgogICAgPC9ib2R5Pgo8L2h0bWw+]]></data>
	</file>
	<file>
	  <filename>/script/plugins/galleria/themes/classic/classic-loader.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEAAQAPQAAAAAAP///w4ODnR0dB4eHri4uISEhP///6amptra2lJSUkBAQOrq6mJiYvr6+sjIyJaWlgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH+GkNyZWF0ZWQgd2l0aCBhamF4bG9hZC5pbmZvACH5BAAKAAAAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAEAAQAAAFdyAgAgIJIeWoAkRCCMdBkKtIHIngyMKsErPBYbADpkSCwhDmQCBethRB6Vj4kFCkQPG4IlWDgrNRIwnO4UKBXDufzQvDMaoSDBgFb886MiQadgNABAokfCwzBA8LCg0Egl8jAggGAA1kBIA1BAYzlyILczULC2UhACH5BAAKAAEALAAAAAAQABAAAAV2ICACAmlAZTmOREEIyUEQjLKKxPHADhEvqxlgcGgkGI1DYSVAIAWMx+lwSKkICJ0QsHi9RgKBwnVTiRQQgwF4I4UFDQQEwi6/3YSGWRRmjhEETAJfIgMFCnAKM0KDV4EEEAQLiF18TAYNXDaSe3x6mjidN1s3IQAh+QQACgACACwAAAAAEAAQAAAFeCAgAgLZDGU5jgRECEUiCI+yioSDwDJyLKsXoHFQxBSHAoAAFBhqtMJg8DgQBgfrEsJAEAg4YhZIEiwgKtHiMBgtpg3wbUZXGO7kOb1MUKRFMysCChAoggJCIg0GC2aNe4gqQldfL4l/Ag1AXySJgn5LcoE3QXI3IQAh+QQACgADACwAAAAAEAAQAAAFdiAgAgLZNGU5joQhCEjxIssqEo8bC9BRjy9Ag7GILQ4QEoE0gBAEBcOpcBA0DoxSK/e8LRIHn+i1cK0IyKdg0VAoljYIg+GgnRrwVS/8IAkICyosBIQpBAMoKy9dImxPhS+GKkFrkX+TigtLlIyKXUF+NjagNiEAIfkEAAoABAAsAAAAABAAEAAABWwgIAICaRhlOY4EIgjH8R7LKhKHGwsMvb4AAy3WODBIBBKCsYA9TjuhDNDKEVSERezQEL0WrhXucRUQGuik7bFlngzqVW9LMl9XWvLdjFaJtDFqZ1cEZUB0dUgvL3dgP4WJZn4jkomWNpSTIyEAIfkEAAoABQAsAAAAABAAEAAABX4gIAICuSxlOY6CIgiD8RrEKgqGOwxwUrMlAoSwIzAGpJpgoSDAGifDY5kopBYDlEpAQBwevxfBtRIUGi8xwWkDNBCIwmC9Vq0aiQQDQuK+VgQPDXV9hCJjBwcFYU5pLwwHXQcMKSmNLQcIAExlbH8JBwttaX0ABAcNbWVbKyEAIfkEAAoABgAsAAAAABAAEAAABXkgIAICSRBlOY7CIghN8zbEKsKoIjdFzZaEgUBHKChMJtRwcWpAWoWnifm6ESAMhO8lQK0EEAV3rFopIBCEcGwDKAqPh4HUrY4ICHH1dSoTFgcHUiZjBhAJB2AHDykpKAwHAwdzf19KkASIPl9cDgcnDkdtNwiMJCshACH5BAAKAAcALAAAAAAQABAAAAV3ICACAkkQZTmOAiosiyAoxCq+KPxCNVsSMRgBsiClWrLTSWFoIQZHl6pleBh6suxKMIhlvzbAwkBWfFWrBQTxNLq2RG2yhSUkDs2b63AYDAoJXAcFRwADeAkJDX0AQCsEfAQMDAIPBz0rCgcxky0JRWE1AmwpKyEAIfkEAAoACAAsAAAAABAAEAAABXkgIAICKZzkqJ4nQZxLqZKv4NqNLKK2/Q4Ek4lFXChsg5ypJjs1II3gEDUSRInEGYAw6B6zM4JhrDAtEosVkLUtHA7RHaHAGJQEjsODcEg0FBAFVgkQJQ1pAwcDDw8KcFtSInwJAowCCA6RIwqZAgkPNgVpWndjdyohACH5BAAKAAkALAAAAAAQABAAAAV5ICACAimc5KieLEuUKvm2xAKLqDCfC2GaO9eL0LABWTiBYmA06W6kHgvCqEJiAIJiu3gcvgUsscHUERm+kaCxyxa+zRPk0SgJEgfIvbAdIAQLCAYlCj4DBw0IBQsMCjIqBAcPAooCBg9pKgsJLwUFOhCZKyQDA3YqIQAh+QQACgAKACwAAAAAEAAQAAAFdSAgAgIpnOSonmxbqiThCrJKEHFbo8JxDDOZYFFb+A41E4H4OhkOipXwBElYITDAckFEOBgMQ3arkMkUBdxIUGZpEb7kaQBRlASPg0FQQHAbEEMGDSVEAA1QBhAED1E0NgwFAooCDWljaQIQCE5qMHcNhCkjIQAh+QQACgALACwAAAAAEAAQAAAFeSAgAgIpnOSoLgxxvqgKLEcCC65KEAByKK8cSpA4DAiHQ/DkKhGKh4ZCtCyZGo6F6iYYPAqFgYy02xkSaLEMV34tELyRYNEsCQyHlvWkGCzsPgMCEAY7Cg04Uk48LAsDhRA8MVQPEF0GAgqYYwSRlycNcWskCkApIyEAOwAAAAAAAAAAAA==]]></data>
	</file>
	<file>
	  <filename>/script/plugins/galleria/themes/classic/classic-map.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAA/gAAAAfCAYAAABTcmYwAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9wDAxA1G8hPC+AAAAPjSURBVHja7d0xa11lHMfx35PB6YoxUHBsp9ouCgVdA4UiRKxLUew7cGn2gFLE2foKsqpUjEVRCqHpGKhQl6KLuggFQQJm6tC/Q07gEK9JTOLtzbmfz9Rm/JE+Od+ek3NbVeUoWmujqtoOwAQ5ewAAYLy5I15gv5TkQWvtAxMCE4z7m0k2uzMIAAA4TuB3F9brSc4nea+1NjIjMIG4HyV5J8nFJOsiHwAAjhH4vbi/mORRkkWPygKT0J01i0l+FvkAAHCMwB8T95er6rEJgQlG/uMu8h+JfAAAOELgi3tgyiL/ssgHAID/GPjiHhD5AAAw/dp+H5PXWjuTZEPcA1N5gI1/L8gflgEAYBbNiXvgtBpzJ3+jO7sAAEDgi3tA5APwrLTWlltrb1sC4Ahn6N5H9MfEvUdegdNwQehxfTj430lVVbOEvaZ488Uk95LE9ofaazTuI6v/7evA8M2Je2AIxnyEnjv5sCdWrWC3U+BhkrUkt0xx4PfmzSSbe18y21p7LckvrbW3rAQzeDbs3sEX98BALnicZbBPpLorajcG8b05SvIgyfn0fp22i/u7SV5IcruqrlkLZstc74LYo63AqdedXYtxJx/+EanYcco3Xm6t3WutfWKNA3/Wbe/5WbfeWrvSi/s7Sa5bCmbwLE1yJslmknPiHhjQhWL/Tv6vSV53tiFK3Ym239RuvZpkPsnuy/XOVdVvljlwt/77Z55m5+bdnSTXquqJhWA2A/9hkleS/JnkZRfAwMAi/6ckC0l+rKpXrYJAFaj2m7qd57NzN3o+yWqSrap60TKH3u9Kku+6uP8ryYWq+t0yMJvmknyUnf/xW0iyYhJgQFa6s+1pd9bBTBGj9jwlu25V1VqSq92X1qxy6Li/lOSLXtw/n+SuX02DGQ78qvoyyVKSJ0lutNa8tRQYwkXPrSQ3urNtqTvrQJRix+m1+3j+fVMcOu53f+f+qyQX4v0zIPC7H1rfZ+d/TUU+MLS4v9qdcSBOsd/0ntuLvb9utNY+tMq+e42y81j+QpLbSd7tHstf7EX+Z5aCGQ18kQ+IexCp2O0Z2ur9eTXJ1ybZ9/tyO8n7ST5Pcn33hXq9T5K5n2TZUjCD18JVtffi+I3uUH0uyadV5XAAxD0A//cZfjbJ2arasAbACQW+yAfEPQAAnD5z477ocX1A3AMAwAACX+QD4h4AAAYS+CIfEPcAADCQwBf5gLgHAICBBL7IB8Q9AAAMJPBFPiDuAQBgyq+Vx31M3gEX1/2P0Huzqr41IzChuF9K8o24BwCAEwj8XuRfqqqPTQhMOPJXkvwg7gEA4AQCHwAAAJgufwPT3gV0VEj7PQAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/script/plugins/galleria/themes/classic/galleria.classic.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogR2FsbGVyaWEgQ2xhc3NpYyBUaGVtZQogKiBDb3B5cmlnaHQgKGMpIDIwMTAsIEFpbm8KICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLgogKi8KIAouZ2FsbGVyaWEtY29udGFpbmVyIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKfQouZ2FsbGVyaWEtY29udGFpbmVyIGltZyB7CiAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgIC1vLXVzZXItc2VsZWN0OiBub25lOwp9Ci5nYWxsZXJpYS1zdGFnZSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDEwcHg7CiAgICBib3R0b206IDYwcHg7CiAgICBsZWZ0OiAxMHB4OwogICAgcmlnaHQ6IDEwcHg7CiAgICBvdmVyZmxvdzpoaWRkZW47Cn0KLmdhbGxlcmlhLXRodW1ibmFpbHMtY29udGFpbmVyIHsKICAgIGhlaWdodDogNTBweDsKICAgIGJvdHRvbTogMDsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDEwcHg7CiAgICByaWdodDogMTBweDsKICAgIHotaW5kZXg6IDI7Cn0KLmdhbGxlcmlhLWNhcm91c2VsIC5nYWxsZXJpYS10aHVtYm5haWxzLWxpc3QgewogICAgbWFyZ2luLWxlZnQ6IDMwcHg7CiAgICBtYXJnaW4tcmlnaHQ6IDMwcHg7Cn0KLmdhbGxlcmlhLXRodW1ibmFpbHMgLmdhbGxlcmlhLWltYWdlIHsKICAgIGhlaWdodDogNDBweDsKICAgIHdpZHRoOiA2MHB4OwogICAgYmFja2dyb3VuZDogI0ZGRjsKICAgIG1hcmdpbjogMCA1cHggMCAwOwogICAgYm9yZGVyOiAxcHggc29saWQgIzAwMDsKICAgIGZsb2F0OiBsZWZ0OwogICAgY3Vyc29yOiBwb2ludGVyOwp9Ci5nYWxsZXJpYS1jb3VudGVyIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGJvdHRvbTogMTBweDsKICAgIGxlZnQ6IDEwcHg7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIGNvbG9yOiAjZmZmOwogICAgZm9udDogbm9ybWFsIDExcHgvMSBhcmlhbCxzYW5zLXNlcmlmOwogICAgei1pbmRleDogMTsKfQouZ2FsbGVyaWEtbG9hZGVyIHsKICAgIGJhY2tncm91bmQ6ICNGRkY7CiAgICB3aWR0aDogMjBweDsKICAgIGhlaWdodDogMjBweDsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMTBweDsKICAgIHJpZ2h0OiAxMHB4OwogICAgei1pbmRleDogMjsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBiYWNrZ3JvdW5kOiB1cmwoY2xhc3NpYy1sb2FkZXIuZ2lmKSBuby1yZXBlYXQgMnB4IDJweDsKfQouZ2FsbGVyaWEtaW5mbyB7CiAgICB3aWR0aDogNTAlOwogICAgdG9wOiAxNXB4OwogICAgbGVmdDogMTVweDsKICAgIHotaW5kZXg6IDI7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7Cn0KLmdhbGxlcmlhLWluZm8tdGV4dCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGOwogICAgcGFkZGluZzogMTJweDsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICAvKiBJRTcgKi8gem9vbToxOwp9Ci5nYWxsZXJpYS1pbmZvLXRpdGxlIHsKCWZvbnQ6IGJvbGQgMTJweC8xLjEgYXJpYWwsc2Fucy1zZXJpZjsKCW1hcmdpbjogMDsKCWNvbG9yOiAjMDAwOwoJbWFyZ2luLWJvdHRvbTogN3B4Owp9Ci5nYWxsZXJpYS1pbmZvLWRlc2NyaXB0aW9uIHsKCWZvbnQ6IGl0YWxpYyAxMnB4LzEuNCBnZW9yZ2lhLHNlcmlmOwoJbWFyZ2luOiAwOwoJY29sb3I6ICM1NTU1NTU7Cn0KLmdhbGxlcmlhLWluZm8tY2xvc2UgewogICAgd2lkdGg6IDlweDsKICAgIGhlaWdodDogOXB4OwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiA1cHg7CiAgICByaWdodDogNXB4OwogICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTc1M3B4IC0xMXB4OwogICAgb3BhY2l0eTogLjU7CiAgICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9NTApOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZGlzcGxheTogbm9uZTsKfQoubm90b3VjaCAuZ2FsbGVyaWEtaW5mby1jbG9zZTpob3ZlcnsKICAgIG9wYWNpdHk6MTsKICAgIGZpbHRlcjogYWxwaGEob3BhY2l0eT0xMDApOwp9Ci50b3VjaCAuZ2FsbGVyaWEtaW5mby1jbG9zZTphY3RpdmV7CiAgICBvcGFjaXR5OjE7CiAgICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9MTAwKTsKfQouZ2FsbGVyaWEtaW5mby1saW5rIHsKICAgIGJhY2tncm91bmQtcG9zaXRpb246IC02NjlweCAtNXB4OwogICAgb3BhY2l0eTogLjc7CiAgICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9NzApOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgd2lkdGg6IDIwcHg7CiAgICBoZWlnaHQ6IDIwcHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGOwp9Ci5ub3RvdWNoIC5nYWxsZXJpYS1pbmZvLWxpbms6aG92ZXIgewogICAgb3BhY2l0eTogMTsKICAgIGZpbHRlcjogYWxwaGEob3BhY2l0eT0xMDApOwp9Ci50b3VjaCAuZ2FsbGVyaWEtaW5mby1saW5rOmFjdGl2ZSB7CiAgICBvcGFjaXR5OiAxOwogICAgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTEwMCk7Cn0KLmdhbGxlcmlhLWltYWdlLW5hdiB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDUwJTsKICAgIG1hcmdpbi10b3A6IC02MnB4OwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDYycHg7CiAgICBsZWZ0OiAwOwp9Ci5nYWxsZXJpYS1pbWFnZS1uYXYtbGVmdCwKLmdhbGxlcmlhLWltYWdlLW5hdi1yaWdodCB7CiAgICBvcGFjaXR5OiAuMzsKICAgIGZpbHRlcjogYWxwaGEob3BhY2l0eT0zMCk7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB3aWR0aDogNjJweDsKICAgIGhlaWdodDogMTI0cHg7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAxMHB4OwogICAgei1pbmRleDogMjsKICAgIGJhY2tncm91bmQtcG9zaXRpb246IDAgNDZweDsKfQouZ2FsbGVyaWEtaW1hZ2UtbmF2LXJpZ2h0IHsKICAgIGxlZnQ6IGF1dG87CiAgICByaWdodDogMTBweDsKICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0yNTRweCA0NnB4OwogICAgei1pbmRleDogMjsKfQoubm90b3VjaCAuZ2FsbGVyaWEtaW1hZ2UtbmF2LWxlZnQ6aG92ZXIsCi5ub3RvdWNoIC5nYWxsZXJpYS1pbWFnZS1uYXYtcmlnaHQ6aG92ZXIgewogICAgb3BhY2l0eTogMTsKICAgIGZpbHRlcjogYWxwaGEob3BhY2l0eT0xMDApOwp9Ci50b3VjaCAuZ2FsbGVyaWEtaW1hZ2UtbmF2LWxlZnQ6YWN0aXZlLAoudG91Y2ggLmdhbGxlcmlhLWltYWdlLW5hdi1yaWdodDphY3RpdmUgewogICAgb3BhY2l0eTogMTsKICAgIGZpbHRlcjogYWxwaGEob3BhY2l0eT0xMDApOwp9Ci5nYWxsZXJpYS10aHVtYi1uYXYtbGVmdCwKLmdhbGxlcmlhLXRodW1iLW5hdi1yaWdodCB7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBkaXNwbGF5OiBub25lOwogICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ5NXB4IDVweDsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDA7CiAgICB0b3A6IDA7CiAgICBoZWlnaHQ6IDQwcHg7CiAgICB3aWR0aDogMjNweDsKICAgIHotaW5kZXg6IDM7CiAgICBvcGFjaXR5OiAuODsKICAgIGZpbHRlcjogYWxwaGEob3BhY2l0eT04MCk7Cn0KLmdhbGxlcmlhLXRodW1iLW5hdi1yaWdodCB7CiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNTc4cHggNXB4OwogICAgYm9yZGVyLXJpZ2h0OiBub25lOwogICAgcmlnaHQ6IDA7CiAgICBsZWZ0OiBhdXRvOwp9Ci5nYWxsZXJpYS10aHVtYm5haWxzLWNvbnRhaW5lciAuZGlzYWJsZWQgewogICAgb3BhY2l0eTogLjI7CiAgICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9MjApOwogICAgY3Vyc29yOiBkZWZhdWx0Owp9Ci5ub3RvdWNoIC5nYWxsZXJpYS10aHVtYi1uYXYtbGVmdDpob3ZlciwKLm5vdG91Y2ggLmdhbGxlcmlhLXRodW1iLW5hdi1yaWdodDpob3ZlciB7CiAgICBvcGFjaXR5OiAxOwogICAgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTEwMCk7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTExOwp9Ci50b3VjaCAuZ2FsbGVyaWEtdGh1bWItbmF2LWxlZnQ6YWN0aXZlLAoudG91Y2ggLmdhbGxlcmlhLXRodW1iLW5hdi1yaWdodDphY3RpdmUgewogICAgb3BhY2l0eTogMTsKICAgIGZpbHRlcjogYWxwaGEob3BhY2l0eT0xMDApOwogICAgYmFja2dyb3VuZC1jb2xvcjogIzExMTsKfQoubm90b3VjaCAuZ2FsbGVyaWEtdGh1bWJuYWlscy1jb250YWluZXIgLmRpc2FibGVkOmhvdmVyIHsKICAgIG9wYWNpdHk6IC4yOwogICAgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTIwKTsKICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50Owp9CgouZ2FsbGVyaWEtY2Fyb3VzZWwgLmdhbGxlcmlhLXRodW1iLW5hdi1sZWZ0LAouZ2FsbGVyaWEtY2Fyb3VzZWwgLmdhbGxlcmlhLXRodW1iLW5hdi1yaWdodCB7CiAgICBkaXNwbGF5OiBibG9jazsKfQouZ2FsbGVyaWEtdGh1bWItbmF2LWxlZnQsCi5nYWxsZXJpYS10aHVtYi1uYXYtcmlnaHQsCi5nYWxsZXJpYS1pbmZvLWxpbmssCi5nYWxsZXJpYS1pbmZvLWNsb3NlLAouZ2FsbGVyaWEtaW1hZ2UtbmF2LWxlZnQsCi5nYWxsZXJpYS1pbWFnZS1uYXYtcmlnaHQgewogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGNsYXNzaWMtbWFwLnBuZyk7CiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0Owp9Cg==]]></data>
	</file>
	<file>
	  <filename>/script/plugins/galleria/themes/classic/galleria.classic.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIEBwcmVzZXJ2ZSBHYWxsZXJpYSBDbGFzc2ljIFRoZW1lIDIwMTEtMDgtMDEKICogaHR0cDovL2dhbGxlcmlhLmFpbm8uc2UKICoKICogQ29weXJpZ2h0IChjKSAyMDExLCBBaW5vCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4KICovCgovKmdsb2JhbCBqUXVlcnksIEdhbGxlcmlhICovCgpHYWxsZXJpYS5yZXF1aXJlcygxLjI1LCAnVGhpcyB2ZXJzaW9uIG9mIENsYXNzaWMgdGhlbWUgcmVxdWlyZXMgR2FsbGVyaWEgMS4yLjUgb3IgbGF0ZXInKTsKCihmdW5jdGlvbigkKSB7CgpHYWxsZXJpYS5hZGRUaGVtZSh7CiAgICBuYW1lOiAnY2xhc3NpYycsCiAgICBhdXRob3I6ICdHYWxsZXJpYScsCiAgICBjc3M6ICdnYWxsZXJpYS5jbGFzc2ljLmNzcycsCiAgICBkZWZhdWx0czogewogICAgICAgIHRyYW5zaXRpb246ICdzbGlkZScsCiAgICAgICAgdGh1bWJDcm9wOiAgJ2hlaWdodCcsCgogICAgICAgIC8vIHNldCB0aGlzIHRvIGZhbHNlIGlmIHlvdSB3YW50IHRvIHNob3cgdGhlIGNhcHRpb24gYWxsIHRoZSB0aW1lOgogICAgICAgIF90b2dnbGVJbmZvOiB0cnVlCiAgICB9LAogICAgaW5pdDogZnVuY3Rpb24ob3B0aW9ucykgewoKICAgICAgICAvLyBhZGQgc29tZSBlbGVtZW50cwogICAgICAgIHRoaXMuYWRkRWxlbWVudCgnaW5mby1saW5rJywnaW5mby1jbG9zZScpOwogICAgICAgIHRoaXMuYXBwZW5kKHsKICAgICAgICAgICAgJ2luZm8nIDogWydpbmZvLWxpbmsnLCdpbmZvLWNsb3NlJ10KICAgICAgICB9KTsKCiAgICAgICAgLy8gY2FjaGUgc29tZSBzdHVmZgogICAgICAgIHZhciBpbmZvID0gdGhpcy4kKCdpbmZvLWxpbmssaW5mby1jbG9zZSxpbmZvLXRleHQnKSwKICAgICAgICAgICAgdG91Y2ggPSBHYWxsZXJpYS5UT1VDSCwKICAgICAgICAgICAgY2xpY2sgPSB0b3VjaCA/ICd0b3VjaHN0YXJ0JyA6ICdjbGljayc7CgogICAgICAgIC8vIHNob3cgbG9hZGVyICYgY291bnRlciB3aXRoIG9wYWNpdHkKICAgICAgICB0aGlzLiQoJ2xvYWRlcixjb3VudGVyJykuc2hvdygpLmNzcygnb3BhY2l0eScsIDAuNCk7CgogICAgICAgIC8vIHNvbWUgc3R1ZmYgZm9yIG5vbi10b3VjaCBicm93c2VycwogICAgICAgIGlmICghIHRvdWNoICkgewogICAgICAgICAgICB0aGlzLmFkZElkbGVTdGF0ZSggdGhpcy5nZXQoJ2ltYWdlLW5hdi1sZWZ0JyksIHsgbGVmdDotNTAgfSk7CiAgICAgICAgICAgIHRoaXMuYWRkSWRsZVN0YXRlKCB0aGlzLmdldCgnaW1hZ2UtbmF2LXJpZ2h0JyksIHsgcmlnaHQ6LTUwIH0pOwogICAgICAgICAgICB0aGlzLmFkZElkbGVTdGF0ZSggdGhpcy5nZXQoJ2NvdW50ZXInKSwgeyBvcGFjaXR5OjAgfSk7CiAgICAgICAgfQoKICAgICAgICAvLyB0b2dnbGUgaW5mbwogICAgICAgIGlmICggb3B0aW9ucy5fdG9nZ2xlSW5mbyA9PT0gdHJ1ZSApIHsKICAgICAgICAgICAgaW5mby5iaW5kKCBjbGljaywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBpbmZvLnRvZ2dsZSgpOwogICAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpbmZvLnNob3coKTsKICAgICAgICAgICAgdGhpcy4kKCdpbmZvLWxpbmssIGluZm8tY2xvc2UnKS5oaWRlKCk7CiAgICAgICAgfQoKICAgICAgICAvLyBiaW5kIHNvbWUgc3R1ZmYKICAgICAgICB0aGlzLmJpbmQoJ3RodW1ibmFpbCcsIGZ1bmN0aW9uKGUpIHsKCiAgICAgICAgICAgIGlmICghIHRvdWNoICkgewogICAgICAgICAgICAgICAgLy8gZmFkZSB0aHVtYm5haWxzCiAgICAgICAgICAgICAgICAkKGUudGh1bWJUYXJnZXQpLmNzcygnb3BhY2l0eScsIDAuNikucGFyZW50KCkuaG92ZXIoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5ub3QoJy5hY3RpdmUnKS5jaGlsZHJlbigpLnN0b3AoKS5mYWRlVG8oMTAwLCAxKTsKICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICQodGhpcykubm90KCcuYWN0aXZlJykuY2hpbGRyZW4oKS5zdG9wKCkuZmFkZVRvKDQwMCwgMC42KTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGlmICggZS5pbmRleCA9PT0gdGhpcy5nZXRJbmRleCgpICkgewogICAgICAgICAgICAgICAgICAgICQoZS50aHVtYlRhcmdldCkuY3NzKCdvcGFjaXR5JywxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICQoZS50aHVtYlRhcmdldCkuY3NzKCdvcGFjaXR5JywgdGhpcy5nZXRJbmRleCgpID8gMSA6IDAuNik7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgdGhpcy5iaW5kKCdsb2Fkc3RhcnQnLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIGlmICghZS5jYWNoZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuJCgnbG9hZGVyJykuc2hvdygpLmZhZGVUbygyMDAsIDAuNCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuJCgnaW5mbycpLnRvZ2dsZSggdGhpcy5oYXNJbmZvKCkgKTsKCiAgICAgICAgICAgICQoZS50aHVtYlRhcmdldCkuY3NzKCdvcGFjaXR5JywxKS5wYXJlbnQoKS5zaWJsaW5ncygpLmNoaWxkcmVuKCkuY3NzKCdvcGFjaXR5JywgMC42KTsKICAgICAgICB9KTsKCiAgICAgICAgdGhpcy5iaW5kKCdsb2FkZmluaXNoJywgZnVuY3Rpb24oZSkgewogICAgICAgICAgICB0aGlzLiQoJ2xvYWRlcicpLmZhZGVPdXQoMjAwKTsKICAgICAgICB9KTsKICAgIH0KfSk7Cgp9KGpRdWVyeSkpOwo=]]></data>
	</file>
	<file>
	  <filename>/script/plugins/galleria/themes/classic/galleria.classic.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKIEdhbGxlcmlhIENsYXNzaWMgVGhlbWUgMjAxMS0wOC0wMQogaHR0cDovL2dhbGxlcmlhLmFpbm8uc2UKCiBDb3B5cmlnaHQgKGMpIDIwMTEsIEFpbm8KIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4KKi8KR2FsbGVyaWEucmVxdWlyZXMoMS4yNSwiVGhpcyB2ZXJzaW9uIG9mIENsYXNzaWMgdGhlbWUgcmVxdWlyZXMgR2FsbGVyaWEgMS4yLjUgb3IgbGF0ZXIiKTsKKGZ1bmN0aW9uKGIpe0dhbGxlcmlhLmFkZFRoZW1lKHtuYW1lOiJjbGFzc2ljIixhdXRob3I6IkdhbGxlcmlhIixjc3M6ImdhbGxlcmlhLmNsYXNzaWMuY3NzIixkZWZhdWx0czp7dHJhbnNpdGlvbjoic2xpZGUiLHRodW1iQ3JvcDoiaGVpZ2h0IixfdG9nZ2xlSW5mbzohMH0saW5pdDpmdW5jdGlvbihlKXt0aGlzLmFkZEVsZW1lbnQoImluZm8tbGluayIsImluZm8tY2xvc2UiKTt0aGlzLmFwcGVuZCh7aW5mbzpbImluZm8tbGluayIsImluZm8tY2xvc2UiXX0pO3ZhciBjPXRoaXMuJCgiaW5mby1saW5rLGluZm8tY2xvc2UsaW5mby10ZXh0IiksZD1HYWxsZXJpYS5UT1VDSCxmPWQ/InRvdWNoc3RhcnQiOiJjbGljayI7dGhpcy4kKCJsb2FkZXIsY291bnRlciIpLnNob3coKS5jc3MoIm9wYWNpdHkiLDAuNCk7ZHx8KHRoaXMuYWRkSWRsZVN0YXRlKHRoaXMuZ2V0KCJpbWFnZS1uYXYtbGVmdCIpLHtsZWZ0Oi01MH0pLHRoaXMuYWRkSWRsZVN0YXRlKHRoaXMuZ2V0KCJpbWFnZS1uYXYtcmlnaHQiKSwKe3JpZ2h0Oi01MH0pLHRoaXMuYWRkSWRsZVN0YXRlKHRoaXMuZ2V0KCJjb3VudGVyIikse29wYWNpdHk6MH0pKTtlLl90b2dnbGVJbmZvPT09ITA/Yy5iaW5kKGYsZnVuY3Rpb24oKXtjLnRvZ2dsZSgpfSk6KGMuc2hvdygpLHRoaXMuJCgiaW5mby1saW5rLCBpbmZvLWNsb3NlIikuaGlkZSgpKTt0aGlzLmJpbmQoInRodW1ibmFpbCIsZnVuY3Rpb24oYSl7ZD9iKGEudGh1bWJUYXJnZXQpLmNzcygib3BhY2l0eSIsdGhpcy5nZXRJbmRleCgpPzE6MC42KTooYihhLnRodW1iVGFyZ2V0KS5jc3MoIm9wYWNpdHkiLDAuNikucGFyZW50KCkuaG92ZXIoZnVuY3Rpb24oKXtiKHRoaXMpLm5vdCgiLmFjdGl2ZSIpLmNoaWxkcmVuKCkuc3RvcCgpLmZhZGVUbygxMDAsMSl9LGZ1bmN0aW9uKCl7Yih0aGlzKS5ub3QoIi5hY3RpdmUiKS5jaGlsZHJlbigpLnN0b3AoKS5mYWRlVG8oNDAwLDAuNil9KSxhLmluZGV4PT09dGhpcy5nZXRJbmRleCgpJiZiKGEudGh1bWJUYXJnZXQpLmNzcygib3BhY2l0eSIsCjEpKX0pO3RoaXMuYmluZCgibG9hZHN0YXJ0IixmdW5jdGlvbihhKXthLmNhY2hlZHx8dGhpcy4kKCJsb2FkZXIiKS5zaG93KCkuZmFkZVRvKDIwMCwwLjQpO3RoaXMuJCgiaW5mbyIpLnRvZ2dsZSh0aGlzLmhhc0luZm8oKSk7YihhLnRodW1iVGFyZ2V0KS5jc3MoIm9wYWNpdHkiLDEpLnBhcmVudCgpLnNpYmxpbmdzKCkuY2hpbGRyZW4oKS5jc3MoIm9wYWNpdHkiLDAuNil9KTt0aGlzLmJpbmQoImxvYWRmaW5pc2giLGZ1bmN0aW9uKCl7dGhpcy4kKCJsb2FkZXIiKS5mYWRlT3V0KDIwMCl9KX19KX0pKGpRdWVyeSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/adminprefs.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyRzdGFydGZvcm19CjxmaWVsZHNldD4KPGxlZ2VuZD57JHRpdGxlX2dhbGxlcnkzX3NldHRpbmdzfTwvbGVnZW5kPgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPnskdGl0bGVfZ2FsbGVyeV91cmx9OjwvcD4KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X2dhbGxlcnlfdXJsfTwvcD4KCTwvZGl2PgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPnskdGl0bGVfZ2FsbGVyeV9yZXN0X2FwaV9rZXl9OjwvcD4KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X2dhbGxlcnlfcmVzdF9hcGlfa2V5fTwvcD4KCTwvZGl2PgoJPGhyLz4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHRpdGxlX2RlZmF1bHRfaXRlbWlkfTo8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9kZWZhdWx0X2l0ZW1pZH08L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHRpdGxlX3Nob3dfYWxidW1fdGl0bGV9OjwvcD4KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X3Nob3dfYWxidW1fdGl0bGV9PC9wPgoJPC9kaXY+Cgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJCTxwIGNsYXNzPSJwYWdldGV4dCI+eyR0aXRsZV91c2VfZ2FsbGVyaWF9OjwvcD4KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X3VzZV9nYWxsZXJpYX08L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4mbmJzcDs8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRzdWJtaXR9PC9wPgoJPC9kaXY+CjwvZmllbGRzZXQ+CnskZW5kZm9ybX0K]]></data>
	</file>
	<file>
	  <filename>/templates/displayAlbum.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[e2lmICR1c2VHYWxsZXJpYX0KCXtnbG9iYWxfY29udGVudCBuYW1lPSdHYWxsZXJ5MyBnYWxsZXJpYSd9CnsvaWZ9CjwhLS0gR2FsbGVyeSAzIHNlY3Rpb24gLS0+CjxkaXYgaWQ9ImdhbGxlcnkzIj4KCXtpZiAkc2hvd0FsYnVtVGl0bGV9PGgyPnskcGFyZW50LnRpdGxlfTwvaDI+ey9pZn0KCTwhLS0gc2hvdyBhbGJ1bXMgLS0+Cgl7aWYgJGFsYnVtc3xAY291bnR9Cgk8ZGl2IGNsYXNzPSJhbGJ1bXMiPgoJe3NlY3Rpb24gbmFtZT1pdGVtIGxvb3A9JGFsYnVtc30KCQl7aWYgJGFsYnVtc1tpdGVtXS50eXBlID09ICdhbGJ1bSd9CgkJPGRpdiBjbGFzcz0iYWxidW0iPgoJCQk8aDM+eyRhbGJ1bXNbaXRlbV0udGl0bGV9PC9oMz4KCQkJPGEgY2xhc3M9ImFsYnVtVXJsIiBocmVmPSJ7JGFsYnVtc1tpdGVtXS5fbGlua3VybH0iPgoJCQkJPGltZyByZWw9InskYWxidW1zW2l0ZW1dLm5hbWV9IiB0aXRsZT0ieyRhbGJ1bXNbaXRlbV0uZGVzY3JpcHRpb259IiBhbHQ9InskYWxidW1zW2l0ZW1dLmRlc2NyaXB0aW9ufSIgc3JjPSJ7JGFsYnVtc1tpdGVtXS50aHVtYl91cmxfcHVibGljfSIvPgoJCQk8L2E+CgkJPC9kaXY+CgkJey9pZn0KCXsvc2VjdGlvbn0KCTwvZGl2PgoJey9pZn0KCgl7aWYgJHBob3Rvc3xAY291bnR9Cgk8ZGl2IGNsYXNzPSJwaG90b3MiPgoJe3NlY3Rpb24gbmFtZT1pdGVtIGxvb3A9JHBob3Rvc30KCQl7aWYgJHBob3Rvc1tpdGVtXS50eXBlID09ICdwaG90byd9CgkJPGEgY2xhc3M9ImltZ1VybCIgaHJlZj0ieyRwaG90b3NbaXRlbV0uZmlsZV91cmxfcHVibGljfSI+CgkJCTxpbWcgcmVsPSJ7JHBob3Rvc1tpdGVtXS5yZXNpemVfdXJsX3B1YmxpY30iIG5hbWU9InskcGhvdG9zW2l0ZW1dLm5hbWV9IiB0aXRsZT0ieyRwaG90b3NbaXRlbV0uZGVzY3JpcHRpb259IiBhbHQ9InskcGhvdG9zW2l0ZW1dLmRlc2NyaXB0aW9ufSIgc3JjPSJ7JHBob3Rvc1tpdGVtXS50aHVtYl91cmxfcHVibGljfSIvPgoJCTwvYT4KCQl7L2lmfQoJey9zZWN0aW9ufQoJPC9kaXY+Cgl7L2lmfQo8L2Rpdj4KPCEtLSBpdGVtIGV4YW1wbGU6IC0tPgo8IS0tCkFycmF5CigKICAgIFswXSA9PiBBcnJheQogICAgICAgICgKICAgICAgICAgICAgW2lkXSA9PiAxNTcxNQogICAgICAgICAgICBbY2FwdHVyZWRdID0+IDEyNDI0MTI1ODMKICAgICAgICAgICAgW2NyZWF0ZWRdID0+IDEzMzAxMjM2NTEKICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXSA9PgogICAgICAgICAgICBbaGVpZ2h0XSA9PiAyNDAwCiAgICAgICAgICAgIFtsZXZlbF0gPT4gNAogICAgICAgICAgICBbbWltZV90eXBlXSA9PiBpbWFnZS9qcGVnCiAgICAgICAgICAgIFtuYW1lXSA9PiBQS0ZfMjcwOC5qcGcKICAgICAgICAgICAgW293bmVyX2lkXSA9PiAxMQogICAgICAgICAgICBbcmFuZF9rZXldID0+IDAuODQzNTk3MDAwMAogICAgICAgICAgICBbcmVzaXplX2hlaWdodF0gPT4gNjQwCiAgICAgICAgICAgIFtyZXNpemVfd2lkdGhdID0+IDQyNQogICAgICAgICAgICBbc2x1Z10gPT4gUEtGXzI3MDgKICAgICAgICAgICAgW3NvcnRfY29sdW1uXSA9PiBjcmVhdGVkCiAgICAgICAgICAgIFtzb3J0X29yZGVyXSA9PiBBU0MKICAgICAgICAgICAgW3RodW1iX2hlaWdodF0gPT4gMjAwCiAgICAgICAgICAgIFt0aHVtYl93aWR0aF0gPT4gMTMzCiAgICAgICAgICAgIFt0aXRsZV0gPT4gUEtGXzI3MDguanBnCiAgICAgICAgICAgIFt0eXBlXSA9PiBwaG90bwogICAgICAgICAgICBbdXBkYXRlZF0gPT4gMTMzMDEyMzY1NAogICAgICAgICAgICBbdmlld19jb3VudF0gPT4gMTAKICAgICAgICAgICAgW3dpZHRoXSA9PiAxNTk0CiAgICAgICAgICAgIFt2aWV3XzFdID0+IDEKICAgICAgICAgICAgW3ZpZXdfMl0gPT4gMQogICAgICAgICAgICBbdmlld18zXSA9PiAxCiAgICAgICAgICAgIFt2aWV3XzRdID0+IDEKICAgICAgICAgICAgW3BhcmVudF0gPT4gaHR0cDovL2dhbGxlcnkub3dsLWljdC5ubC9yZXN0L2l0ZW0vMTA2OTQKICAgICAgICAgICAgW3dlYl91cmxdID0+IGh0dHA6Ly9nYWxsZXJ5Lm93bC1pY3QubmwvbGlla2UvZm90b3Nlc3NpZS9QS0ZfMjcwOAogICAgICAgICAgICBbZmlsZV91cmxdID0+IGh0dHA6Ly9nYWxsZXJ5Lm93bC1pY3QubmwvcmVzdC9kYXRhLzE1NzE1P3NpemU9ZnVsbAogICAgICAgICAgICBbZmlsZV9zaXplXSA9PiA0Njc2MjcKICAgICAgICAgICAgW2ZpbGVfdXJsX3B1YmxpY10gPT4gaHR0cDovL2dhbGxlcnkub3dsLWljdC5ubC92YXIvYWxidW1zL2xpZWtlL2ZvdG9zZXNzaWUvUEtGXzI3MDguanBnP209MTMzMDEyMzY1MQogICAgICAgICAgICBbcmVzaXplX3VybF0gPT4gaHR0cDovL2dhbGxlcnkub3dsLWljdC5ubC9yZXN0L2RhdGEvMTU3MTU/c2l6ZT1yZXNpemUKICAgICAgICAgICAgW3Jlc2l6ZV9zaXplXSA9PiA0OTI5MAogICAgICAgICAgICBbcmVzaXplX3VybF9wdWJsaWNdID0+IGh0dHA6Ly9nYWxsZXJ5Lm93bC1pY3QubmwvdmFyL3Jlc2l6ZXMvbGlla2UvZm90b3Nlc3NpZS9QS0ZfMjcwOC5qcGc/bT0xMzMwMTIzNjUzCiAgICAgICAgICAgIFt0aHVtYl91cmxdID0+IGh0dHA6Ly9nYWxsZXJ5Lm93bC1pY3QubmwvcmVzdC9kYXRhLzE1NzE1P3NpemU9dGh1bWIKICAgICAgICAgICAgW3RodW1iX3NpemVdID0+IDI2MzI0CiAgICAgICAgICAgIFt0aHVtYl91cmxfcHVibGljXSA9PiBodHRwOi8vZ2FsbGVyeS5vd2wtaWN0Lm5sL3Zhci90aHVtYnMvbGlla2UvZm90b3Nlc3NpZS9QS0ZfMjcwOC5qcGc/bT0xMzMwMTIzNjUyCiAgICAgICAgICAgIFtjYW5fZWRpdF0gPT4gMQogICAgICAgICAgICBbbWVtYmVyc10gPT4KICAgICAgICApCiAgICBbMV0gPT4gQXJyYXkKICAgICAgICAoCiAgICAgICAgICAgIFtpZF0gPT4gMTU3MTYKICAgICAgICAgICAgW2NhcHR1cmVkXSA9PiAxMjQyNDE1NDIwCiAgICAgICAgICAgIFtjcmVhdGVkXSA9PiAxMzMwMTIzNjU1CiAgICAgICAgICAgIFtkZXNjcmlwdGlvbl0gPT4KICAgICAgICAgICAgW2hlaWdodF0gPT4gMTU5NAogICAgICAgICAgICBbbGV2ZWxdID0+IDQKICAgICAgICAgICAgW21pbWVfdHlwZV0gPT4gaW1hZ2UvanBlZwogICAgICAgICAgICBbbmFtZV0gPT4gUEtGXzI3MTguanBnCiAgICAgICAgICAgIFtvd25lcl9pZF0gPT4gMTEKICAgICAgICAgICAgW3JhbmRfa2V5XSA9PiAwLjM5ODUwMTAwMDAKICAgICAgICAgICAgW3Jlc2l6ZV9oZWlnaHRdID0+IDQyNQogICAgICAgICAgICBbcmVzaXplX3dpZHRoXSA9PiA2NDAKICAgICAgICAgICAgW3NsdWddID0+IFBLRl8yNzE4CiAgICAgICAgICAgIFtzb3J0X2NvbHVtbl0gPT4gY3JlYXRlZAogICAgICAgICAgICBbc29ydF9vcmRlcl0gPT4gQVNDCiAgICAgICAgICAgIFt0aHVtYl9oZWlnaHRdID0+IDEzMwogICAgICAgICAgICBbdGh1bWJfd2lkdGhdID0+IDIwMAogICAgICAgICAgICBbdGl0bGVdID0+IFBLRl8yNzE4LmpwZwogICAgICAgICAgICBbdHlwZV0gPT4gcGhvdG8KICAgICAgICAgICAgW3VwZGF0ZWRdID0+IDEzMzAxMjM2NTcKICAgICAgICAgICAgW3ZpZXdfY291bnRdID0+IDQKICAgICAgICAgICAgW3dpZHRoXSA9PiAyNDAwCiAgICAgICAgICAgIFt2aWV3XzFdID0+IDEKICAgICAgICAgICAgW3ZpZXdfMl0gPT4gMQogICAgICAgICAgICBbdmlld18zXSA9PiAxCiAgICAgICAgICAgIFt2aWV3XzRdID0+IDEKICAgICAgICAgICAgW3BhcmVudF0gPT4gaHR0cDovL2dhbGxlcnkub3dsLWljdC5ubC9yZXN0L2l0ZW0vMTA2OTQKICAgICAgICAgICAgW3dlYl91cmxdID0+IGh0dHA6Ly9nYWxsZXJ5Lm93bC1pY3QubmwvbGlla2UvZm90b3Nlc3NpZS9QS0ZfMjcxOAogICAgICAgICAgICBbZmlsZV91cmxdID0+IGh0dHA6Ly9nYWxsZXJ5Lm93bC1pY3QubmwvcmVzdC9kYXRhLzE1NzE2P3NpemU9ZnVsbAogICAgICAgICAgICBbZmlsZV9zaXplXSA9PiA1MDg4NTkKICAgICAgICAgICAgW2ZpbGVfdXJsX3B1YmxpY10gPT4gaHR0cDovL2dhbGxlcnkub3dsLWljdC5ubC92YXIvYWxidW1zL2xpZWtlL2ZvdG9zZXNzaWUvUEtGXzI3MTguanBnP209MTMzMDEyMzY1NQogICAgICAgICAgICBbcmVzaXplX3VybF0gPT4gaHR0cDovL2dhbGxlcnkub3dsLWljdC5ubC9yZXN0L2RhdGEvMTU3MTY/c2l6ZT1yZXNpemUKICAgICAgICAgICAgW3Jlc2l6ZV9zaXplXSA9PiAzOTgyNQogICAgICAgICAgICBbcmVzaXplX3VybF9wdWJsaWNdID0+IGh0dHA6Ly9nYWxsZXJ5Lm93bC1pY3QubmwvdmFyL3Jlc2l6ZXMvbGlla2UvZm90b3Nlc3NpZS9QS0ZfMjcxOC5qcGc/bT0xMzMwMTIzNjU2CiAgICAgICAgICAgIFt0aHVtYl91cmxdID0+IGh0dHA6Ly9nYWxsZXJ5Lm93bC1pY3QubmwvcmVzdC9kYXRhLzE1NzE2P3NpemU9dGh1bWIKICAgICAgICAgICAgW3RodW1iX3NpemVdID0+IDIzMzYzCiAgICAgICAgICAgIFt0aHVtYl91cmxfcHVibGljXSA9PiBodHRwOi8vZ2FsbGVyeS5vd2wtaWN0Lm5sL3Zhci90aHVtYnMvbGlla2UvZm90b3Nlc3NpZS9QS0ZfMjcxOC5qcGc/bT0xMzMwMTIzNjU2CiAgICAgICAgICAgIFtjYW5fZWRpdF0gPT4gMQogICAgICAgICAgICBbbWVtYmVyc10gPT4KICAgICAgICApCiAtLT4KPCEtLSBFbmQgb2YgR2FsbGVyeSAzIHNlY3Rpb24gLS0+Cg==]]></data>
	</file>
	<file>
	  <filename>/templates/galleria-include.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ie3Jvb3RfdXJsfS9tb2R1bGVzL0dhbGxlcnkzL3NjcmlwdC9qcXVlcnktMS42LjIubWluLmpzIj48L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ie3Jvb3RfdXJsfS9tb2R1bGVzL0dhbGxlcnkzL3NjcmlwdC9wbHVnaW5zL2dhbGxlcmlhL2dhbGxlcmlhLTEuMi42Lm1pbi5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLyA8IVtDREFUQVsKe2xpdGVyYWx9CiQoZnVuY3Rpb24oKSB7CgkvLyBMb2FkIHRoZSBjbGFzc2ljIHRoZW1lCglHYWxsZXJpYS5sb2FkVGhlbWUoJ21vZHVsZXMvR2FsbGVyeTMvc2NyaXB0L3BsdWdpbnMvZ2FsbGVyaWEvdGhlbWVzL2NsYXNzaWMvZ2FsbGVyaWEuY2xhc3NpYy5taW4uanMnKTsKCgkvLyBJbml0aWFsaXplIEdhbGxlcmlhCgkkKCcjZ2FsbGVyeTMgLnBob3RvcycpLmdhbGxlcmlhKCB7CgkJJ2RlYnVnJzogZmFsc2UsCgkJJ2xpZ2h0Ym94JzogdHJ1ZSwKCQknZGF0YUNvbmZpZyc6IGZ1bmN0aW9uKGltZykgewoJCQlyZXR1cm4gewoJCQkJJ3RpdGxlJzogaW1nLmF0dHIoJ25hbWUnKSwKCQkJCSdkZXNjcmlwdGlvbic6ICc8cHJlPicraW1nLmF0dHIoJ2FsdCcpKyc8L3ByZT4nLAoJCQkJJ2ltYWdlJzogaW1nLmF0dHIoJ3JlbCcpLAoJCQkJJ2JpZyc6IGltZy5wYXJlbnQoJ2EnKS5hdHRyKCdocmVmJyksCgkJCX07CgkJfQoJfSk7Cn0pOwp7L2xpdGVyYWx9Ci8vIF1dPjwvc2NyaXB0Pgo8c3R5bGU+CntsaXRlcmFsfQojZ2FsbGVyeTMgLnBob3RvcyB7CgloZWlnaHQ6IDUwMHB4Owp9CiNnYWxsZXJ5MyAucGhvdG9zIGltZyB7CgltYXgtaGVpZ2h0OiBub25lOwoJbWF4LXdpZHRoOiBub25lOwp9CnsvbGl0ZXJhbH0KPC9zdHlsZT4K]]></data>
	</file>
</module>
