<?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>ScriptDeploy</name>
	<version>0.2</version>
  <mincmsversion>1.6.6</mincmsversion>
	<help>PGxpbmsgbWVkaWE9InNjcmVlbiIgaHJlZj0iLi4vbW9kdWxlcy9TY3JpcHREZXBsb3kvQ1NTL01hc3RlckNTUy5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiLz48ZGl2IGNsYXNzPSJTaW1XcmFwIj48YiBjbGFzcz0icmJvdHRvbSI+PGIgY2xhc3M9InIxIj48L2I+IDxiIGNsYXNzPSJyMiI+PC9iPjxiIGNsYXNzPSJyMyI+PC9iPiA8YiBjbGFzcz0icjQiPjwvYj48L2I+DQoNCjxkaXYgY2xhc3M9IlNpbWNvbiI+IDxoMyBjbGFzcz0iQmFja0xpbmsiPjxhIG9uY2xpY2s9ImphdmFzY3JpcHQ6d2luZG93Lmhpc3RvcnkuZ28oLTEpIiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub2ZvbGxvdyI+Jmx0OyZsdDsgQmFjazwvYT48L2gzPg0KPGgxPldoYXQgRG9lcyBUaGlzIERvPy0tLSB0aGlzIG5lZWRzIHVwZGF0aW5nPC9oMT4NCjxoMj5Xcml0ZSBtYW5hZ2UgYW5kIGRlcGxveSBKUyBhbmQgQ1NTPC9oMj4NCjxhIGlkPSJTY3JpcHREZXBsb3kiPjwvYT4NCjxwPlNjcmlwdERlcGxveSBtb2R1bGUgdGhhdCBjYW4gY29tYmluZSBtdWx0aXBsZSBDU1Mgb3IgSmF2YXNjcmlwdCBmaWxlcywgY29tcHJlc3MgdGhlaXIgY29udGVudHMgKGkuZS4gcmVtb3ZhbCBvZiB1bm5lY2Vzc2FyeSB3aGl0ZXNwYWNlL2NvbW1lbnRzKSwgYW5kIHNlcnZlIHRoZSByZXN1bHRzIHdpdGggSFRUUCBlbmNvZGluZyAoZ3ppcC9kZWZsYXRlKSBhbmQgaGVhZGVycyB0aGF0IGFsbG93IG9wdGltYWwgY2xpZW50LXNpZGUgY2FjaGluZy4gVGhpcyBoZWxwcyB5b3UgZm9sbG93IHNldmVyYWwgb2YgWWFob28hJ3MgPGEgaHJlZj0iaHR0cDovL2RldmVsb3Blci55YWhvby5jb20vcGVyZm9ybWFuY2UvaW5kZXguaHRtbCNydWxlcyIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9mb2xsb3ciPlJ1bGVzIGZvciBIaWdoIFBlcmZvcm1hbmNlIFdlYiBTaXRlczwvYT4uIChTZWUgJnF1b3Q7UHJvYmxlbSBEb21haW4mcXVvdDsgYmVsb3cgZm9yIG1vcmUgaW5mby4pIDwvcD4NCjxoMz5UaGUgU2hvcnQgb2YgaXQ8L2gzPg0KPHA+V2lydGUgeW91ciBzY3JpcHRzLCBzZXQgdGhlIG9yZGVyIGFuZCBTY3JpcHREZXBsb3kgd2lsbCBkbyB0aGUgcmVzdCE8L3A+DQo8dGFibGU+DQogIDx0Ym9keT4NCiAgICA8dHI+DQogICAgICA8dGQgc3R5bGU9IkJPUkRFUi1SSUdIVDogI2FhYSAxcHggc29saWQ7IFBBRERJTkctUklHSFQ6IDVweDsgQk9SREVSLVRPUDogI2FhYSAxcHggc29saWQ7IFBBRERJTkctTEVGVDogNXB4OyBQQURESU5HLUJPVFRPTTogNXB4OyBCT1JERVItTEVGVDogI2FhYSAxcHggc29saWQ7IFBBRERJTkctVE9QOiA1cHg7IEJPUkRFUi1CT1RUT006ICNhYWEgMXB4IHNvbGlkIj48c3Ryb25nPkJlZm9yZTwvc3Ryb25nPjwvdGQ+DQogICAgICA8dGQgc3R5bGU9IkJPUkRFUi1SSUdIVDogI2FhYSAxcHggc29saWQ7IFBBRERJTkctUklHSFQ6IDVweDsgQk9SREVSLVRPUDogI2FhYSAxcHggc29saWQ7IFBBRERJTkctTEVGVDogNXB4OyBQQURESU5HLUJPVFRPTTogNXB4OyBCT1JERVItTEVGVDogI2FhYSAxcHggc29saWQ7IFBBRERJTkctVE9QOiA1cHg7IEJPUkRFUi1CT1RUT006ICNhYWEgMXB4IHNvbGlkIj48aW1nIHNyYz0iaHR0cDovL21yY2xheS5vcmcvd3AtY29udGVudC91cGxvYWRzLzIwMDgvMDkvZmlkZGxlcl9iZWZvcmUucG5nIiBhbHQ9ImFmdGVyIiAvPjwvdGQ+DQogICAgPC90cj4NCiAgICA8dHI+DQogICAgICA8dGQgc3R5bGU9IkJPUkRFUi1SSUdIVDogI2FhYSAxcHggc29saWQ7IFBBRERJTkctUklHSFQ6IDVweDsgQk9SREVSLVRPUDogI2FhYSAxcHggc29saWQ7IFBBRERJTkctTEVGVDogNXB4OyBQQURESU5HLUJPVFRPTTogNXB4OyBCT1JERVItTEVGVDogI2FhYSAxcHggc29saWQ7IFBBRERJTkctVE9QOiA1cHg7IEJPUkRFUi1CT1RUT006ICNhYWEgMXB4IHNvbGlkIj48c3Ryb25nPkFmdGVyPC9zdHJvbmc+PC90ZD4NCiAgICAgIDx0ZCBzdHlsZT0iQk9SREVSLVJJR0hUOiAjYWFhIDFweCBzb2xpZDsgUEFERElORy1SSUdIVDogNXB4OyBCT1JERVItVE9QOiAjYWFhIDFweCBzb2xpZDsgUEFERElORy1MRUZUOiA1cHg7IFBBRERJTkctQk9UVE9NOiA1cHg7IEJPUkRFUi1MRUZUOiAjYWFhIDFweCBzb2xpZDsgUEFERElORy1UT1A6IDVweDsgQk9SREVSLUJPVFRPTTogI2FhYSAxcHggc29saWQiPjxpbWcgc3JjPSJodHRwOi8vbXJjbGF5Lm9yZy93cC1jb250ZW50L3VwbG9hZHMvMjAwOC8wOS9maWRkbGVyX2FmdGVyLnBuZyIgYWx0PSJiZWZvcmUiIC8+PC90ZD4NCiAgICA8L3RyPg0KICA8L3Rib2R5Pg0KPC90YWJsZT4NCg0KDQoNCjxoMj48YSBpZD0iRmVhdHVyZXMiPjwvYT5GZWF0dXJlczwvaDI+DQo8dWw+DQogIDxsaT5Db21iaW5lcyBhbmQgbWluaWZpZXMgbXVsdGlwbGUgQ1NTIG9yIEphdmFTY3JpcHQgZmlsZXMgaW50byBhIHNpbmdsZSAgIGRvd25sb2FkIDwvbGk+DQogIDxsaT5Vc2VzIGFuIDxhIGhyZWY9Imh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9taW5pZnkvc291cmNlL2Jyb3dzZS90cnVuay9taW4vbGliL0pTTWluLnBocCIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9mb2xsb3ciPmVuaGFuY2VkIHBvcnQ8L2E+IG9mIERvdWdsYXMgQ3JvY2tmb3JkJ3MgPGEgaHJlZj0iaHR0cDovL3d3dy5jcm9ja2ZvcmQuY29tL2phdmFzY3JpcHQvanNtaW4uaHRtbCIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9mb2xsb3ciPkpTTWluICAgbGlicmFyeTwvYT4gYW5kIGN1c3RvbSBjbGFzc2VzIHRvIG1pbmlmeSA8YSBocmVmPSJodHRwOi8vY29kZS5nb29nbGUuY29tL3AvbWluaWZ5L3NvdXJjZS9icm93c2UvdHJ1bmsvbWluL2xpYi9NaW5pZnkvQ1NTLnBocCIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9mb2xsb3ciPkNTUzwvYT4gYW5kIDxhIGhyZWY9Imh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9taW5pZnkvc291cmNlL2Jyb3dzZS90cnVuay9taW4vbGliL01pbmlmeS9IVE1MLnBocCIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9mb2xsb3ciPkhUTUw8L2E+PC9saT4NCiAgPGxpPkNhY2hlcyBzZXJ2ZXItc2lkZSB0byBhdm9pZCBkb2luZyB1bm5lY2Vzc2FyeSB3b3JrIDwvbGk+DQogIDxsaT5SZXNwb25kcyB3aXRoIGFuIEhUVFAgMzA0IChOb3QgTW9kaWZpZWQpIHJlc3BvbnNlIHdoZW4gdGhlIGJyb3dzZXIgaGFzIGFuICAgdXAtdG8tZGF0ZSBjYWNoZSBjb3B5ICoqIDwvbGk+DQogIDxsaT5Nb3N0IG1vZHVsZXMgYXJlIGxhenktbG9hZGVkIGFzIG5lZWRlZCAoMzA0IHJlc3BvbnNlcyB1c2UgbWluaW1hbCBjb2RlKSAgKiogPC9saT4NCiAgPGxpPkF1dG9tYXRpY2FsbHkgcmV3cml0ZXMgcmVsYXRpdmUgVVJJcyBpbiBjb21iaW5lZCBDU1MgZmlsZXMgdG8gcG9pbnQgdG8gdmFsaWQgbG9jYXRpb25zIDwvbGk+DQogIDxsaT5XaXRoIGNhY2hpbmcgZW5hYmxlZCwgU2NyaXB0RGVwbG95IGlzIGNhcGFibGUgb2YgaGFuZGxpbmcgaHVuZHJlZHMgb2YgcmVxdWVzdHMgcGVyIHNlY29uZCBvbiBhIG1vZGVyYXRlbHkgcG93ZXJmdWwgc2VydmVyLiA8L2xpPg0KICA8bGk+Q29udGVudC1FbmNvZGluZzogZ3ppcCwgYmFzZWQgb24gcmVxdWVzdCBoZWFkZXJzLiBDYWNoaW5nIGFsbG93cyBpdCBzbyBzZXJ2ZSBnemlwcGVkIGZpbGVzIGZhc3RlciB0aGFuIEFwYWNoZSdzIG1vZF9kZWZsYXRlIG9wdGlvbiEgPC9saT4NCjwvdWw+DQo8aDM+PGVtPjxzdHJvbmc+KiogTm90ZTo8L3N0cm9uZz4gSXQgaXMgYmVzdCB0byB1c2UgYSAuaHRhY2Nlc3Mgc2NyaXB0IHRvIHNldCB0aGUgYWdlIHRpbWVzLiBTY3JpcHREZXBsb3kgaXMgZGVzaWduZWQgZm9yIGVmZmljaWVuY3ksIGJ1dCBmb3IgdmVyeSBoaWdoIHRyYWZmaWMgc2l0ZXMsIFNjcmlwdERlcGxveSBtYXkgc2VydmUgZmlsZXMgc2xvd2VyIHRoYW4geW91ciBIVFRQZCBkdWUgdG8gdGhlIENHSSBvdmVyaGVhZCBvZiBQSFAuICBUbyBvdmVyIGNvbWUgdGhpcyBKdXN0IGNoZWNrICJ1c2UgLmh0YWNjZXNzIGluIG9wdGlvbnMiPC9lbT48L2gzPg0KPGgyPjxhIG5hbWU9IlJlcXVpcmVtZW50cyI+PC9hPlJlcXVpcmVtZW50czwvaDI+DQo8dWw+DQogIDxsaT5UaGUgY29tbW9ubHkgaW5zdGFsbGVkIDxhIGhyZWY9Imh0dHA6Ly91czMucGhwLm5ldC9tYW51YWwvZW4vemxpYi5pbnN0YWxsYXRpb24ucGhwIiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub2ZvbGxvdyI+emxpYiAgIGV4dGVuc2lvbjwvYT4gaXMgcmVjb21tZW5kZWQgZm9yIEhUVFAgZW5jb2RpbmcgZnVuY3Rpb25hbGl0eS4gPC9saT4NCjwvdWw+DQo8YnIvPjxici8+DQo8aDE+SG93IERvIEkgVXNlIEl0PC9oMT4NCg0KDQo8aDM+R2V0IGEgc2luZ2xlIHNjcmlwdDwvaDM+DQp1c2UgPHNwYW4gY2xhc3M9ImNvZGVISUdITElHSFQiPntjbXNfbW9kdWxlIG1vZHVsZT1TY3JpcHREZXBsb3kgc2NyaXB0SUQ9IjEifSA8L3NwYW4+IDxici8+PGJyLz4NCjxoMz5HZXQgYSBzY3JpcHQgZ3JvdXA8L2gzPg0KdXNlIDxzcGFuIGNsYXNzPSJjb2RlSElHSExJR0hUIj57Y21zX21vZHVsZSBtb2R1bGU9U2NyaXB0RGVwbG95IGdyb3VwSUQ9IjEifSA8L3NwYW4+IDxici8+PGJyLz4NCjxoMj5BbGwgb3V0cHV0IGlzIGluIHRoZSBYSFRNTCBmb3JtYXQsIHlvdSBzaG91bGQgd29yayBpbiB0aGF0LjwvaDI+DQoNCjxici8+PGJyLz4NCjxoND5QYXJhbXM8L2g0Pg0KPHVsPg0KPGxpPjxzdHJvbmc+c2NyaXB0SUQ9IiIgPC9zdHJvbmc+PGVtPihSZXF1aXJlZC9vcHRpb25hbCk8L2VtPiA8YnIvPnwgc2V0IHRoZSBJRCBSZXF1aXJlZCBvbmx5IGlmIGdyb3VwSUQgbm90IGNhbGxlZDxici8+PC9saT4NCjxsaT48c3Ryb25nPmdyb3VwSUQ9IiIgPC9zdHJvbmc+PGVtPihSZXF1aXJlZC9vcHRpb25hbCk8L2VtPiA8YnIvPnwgc2V0IHRoZSBJRCBSZXF1aXJlZCBvbmx5IGlmIHNjcmlwdElEIG5vdCBjYWxsZWQ8YnIvPjwvbGk+DQo8IS0tPGxpPjxzdHJvbmc+U2FuZEJveD10cnVlIDwvc3Ryb25nPjxlbT4ob3B0aW9uYWwpPC9lbT4gPGJyLz58IGZhbHNlPGJyLz48L2xpPg0KDQo8bGk+PHN0cm9uZz5SVU5hY3Rpb249IiIgPC9zdHJvbmc+PGVtPihvcHRpb25hbCk8L2VtPiA8YnIvPnwgVURUPGJyLz58IFVSTCA8ZW0+KC4uL3BsdWdpbnMvZnVuY3Rpb24uZmlsZW5hbWUucGhwKTwvZW0+PGJyLz58ICpNb3JlIGNvbWluZyBTb29uKjxici8+PC9saT4NCjxsaT48c3Ryb25nPkxhbmc9IiIgPC9zdHJvbmc+PGVtPihvcHRpb25hbCk8L2VtPiA8YnIvPnwgVXNlIENvdW50cnkgQ29kZXMgVG8gZHluYW1pY2x5IHNldCB0aGUgbGFuZ3VhZ2Ugb2YgdGhlIFBheVBhbCBwYWdlPGJyLz48L2xpPi0tPg0KDQo8L3VsPg0KPGJyLz4NCg0KPGJyLz48YnIvPg0KPGgyPjxhIGlkPSJQcm9ibGVtX0RvbWFpbiI+PC9hPlByb2JsZW0gRG9tYWluPC9oMj4NCjxwPlBhZ2VzIHRoYXQgcmVmZXIgdG8gbXVsdGlwbGUgQ1NTIG9yIEphdmFTY3JpcHQgZmlsZXMgb2Z0ZW4gc3VmZmVyIGZyb20gc2xvd2VyICAgcGFnZSBsb2FkcywgZHVlIHRvIHRoZSBicm93c2VyIHJlcXVlc3RpbmcgZWFjaCBmaWxlIGluZGl2aWR1YWxseS4gTWFueSBicm93c2VycyAgIGFsc28gYXJlIGxpbWl0ZWQgdG8gYSBmZXcgc2ltdWx0YW5lb3VzIHJlcXVlc3RzIHBlciBkb21haW4uIFRoZSB3YWl0IGZvciBhICAgc2VyaWVzIG9mIHJlcXVlc3RzIGFuZCB0aGUgdHJhbnNmZXIgb2YgdW5vcHRpbWl6ZWQgZmlsZXMgY2FuIGRyYW1hdGljYWxseSByZWR1Y2UgICB0aGUgY2xpZW50LXNpZGUgcGVyZm9ybWFuY2Ugb2YgeW91ciBzaXRlLiA8L3A+DQo8cD5IZXJlIGFyZSBhIGhhbmRmdWwgb2YgWWFob28hJ3MgYmVzdCBwcmFjdGljZXMgdGhhdCBhcmUgYWRkcmVzc2VkIGJ5IHRoZSB1c2Ugb2YgU2NyaXB0RGVwbG95LiA8L3A+DQo8dWw+DQogIDxsaT48YSBocmVmPSJodHRwOi8vZGV2ZWxvcGVyLnlhaG9vLmNvbS9wZXJmb3JtYW5jZS9ydWxlcy5odG1sI251bV9odHRwIiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub2ZvbGxvdyI+TWFrZSBGZXdlciBIVFRQIFJlcXVlc3RzPC9hPjwvbGk+DQogIDxsaT48YSBocmVmPSJodHRwOi8vZGV2ZWxvcGVyLnlhaG9vLmNvbS9wZXJmb3JtYW5jZS9ydWxlcy5odG1sI2V4cGlyZXMiIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vZm9sbG93Ij5BZGQgYW4gRXhwaXJlcyBvciBhIENhY2hlLUNvbnRyb2wgSGVhZGVyPC9hPjwvbGk+DQogIDxsaT48YSBocmVmPSJodHRwOi8vZGV2ZWxvcGVyLnlhaG9vLmNvbS9wZXJmb3JtYW5jZS9ydWxlcy5odG1sI2d6aXAiIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vZm9sbG93Ij5HemlwIENvbXBvbmVudHM8L2E+PC9saT4NCiAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9kZXZlbG9wZXIueWFob28uY29tL3BlcmZvcm1hbmNlL3J1bGVzLmh0bWwjbWluaWZ5IiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub2ZvbGxvdyI+TWluaWZ5IEphdmFTY3JpcHQgYW5kIENTUzwvYT48L2xpPg0KICA8bGk+PGEgaHJlZj0iaHR0cDovL2RldmVsb3Blci55YWhvby5jb20vcGVyZm9ybWFuY2UvcnVsZXMuaHRtbCNldGFncyIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9mb2xsb3ciPkNvbmZpZ3VyZSBFVGFnczwvYT48L2xpPg0KICA8bGk+PGEgaHJlZj0iaHR0cDovL2RldmVsb3Blci55YWhvby5jb20vcGVyZm9ybWFuY2UvcnVsZXMuaHRtbCN1bmRlcjI1IiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub2ZvbGxvdyI+S2VlcCBDb21wb25lbnRzIHVuZGVyIDI1SzwvYT48L2xpPg0KPC91bD4NCjxoMz48YSBuYW1lPSJBY2tub3dsZWRnbWVudHMiPjwvYT5BY2tub3dsZWRnbWVudHM8L2gzPg0KPHA+TWluaWZ5IHdhcyBpbnNwaXJlZCBieSA8YSBocmVmPSJodHRwOi8vY29kZS5nb29nbGUuY29tL3AvanNjc3Njb21wLyIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9mb2xsb3ciPmpzY3NzY29tcDwvYT4gYnkgTWF4aW0gTWFydHlueXVrIGFuZCBieSB0aGUgYXJ0aWNsZSAnPGEgaHJlZj0iaHR0cDovL3d3dy5odW5sb2NrLmNvbS9ibG9ncy9TdXBlcmNoYXJnZWRfSmF2YXNjcmlwdCIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9mb2xsb3ciPlN1cGVyY2hhcmdlZCBKYXZhU2NyaXB0PC9hPicgYnkgUGF0cmljayBIdW5sb2NrLiA8L3A+DQo8cD5UaGUgPGEgaHJlZj0iaHR0cDovL3d3dy5jcm9ja2ZvcmQuY29tL2phdmFzY3JpcHQvanNtaW4uaHRtbCIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9mb2xsb3ciPkpTTWluIGxpYnJhcnk8L2E+IHVzZWQgZm9yIEphdmFTY3JpcHQgbWluaWZpY2F0aW9uIHdhcyBvcmlnaW5hbGx5ICAgd3JpdHRlbiBieSBEb3VnbGFzIENyb2NrZm9yZCBhbmQgd2FzIDxhIGhyZWY9Imh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9qc21pbi1waHAiIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vZm9sbG93Ij5wb3J0ZWQgdG8gUEhQPC9hPiBieSBSeWFuICAgR3JvdmUgc3BlY2lmaWNhbGx5IGZvciB1c2UgaW4gTWluaWZ5LiA8L3A+DQoNCg0KPGgzPlN1cHBvcnQ8L2gzPg0KPGg0PlNjcmVlbmNhc3RzIGZvciBleHRyYSBoZWxwIHdpbGwgZmFsbG93LS0tIG9uIHRoZSBUT0RPPC9oND4NCjxwPlRoaXMgbW9kdWxlIGRvZXMgbm90IGluY2x1ZGUgY29tbWVyY2lhbCBzdXBwb3J0LiBIb3dldmVyLCB0aGVyZSBhcmUgYSBudW1iZXIgb2YgcmVzb3VyY2VzIGF2YWlsYWJsZSB0byBoZWxwIHlvdSB3aXRoIGl0OjwvcD4NCjx1bD4NCjxsaT5Gb3IgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMgbW9kdWxlIG9yIHRvIGZpbGUgYSBidWcgcmVwb3J0IHZpc2l0IDxhIGhyZWY9Imh0dHA6Ly9kZXYuY21zbWFkZXNpbXBsZS5vcmcvcHJvamVjdHMvcHBibSI+dGhlIENNUyBGb3JnZTwvYT4uPC9saT4NCjxsaT5BZGRpdGlvbmFsIGRpc2N1c3Npb24gb2YgdGhpcyBtb2R1bGUgbWF5IGFsc28gYmUgZm91bmQgaW4gdGhlIDxhIGhyZWY9Imh0dHA6Ly9mb3J1bS5jbXNtYWRlc2ltcGxlLm9yZyI+Q01TIE1hZGUgU2ltcGxlIEZvcnVtczwvYT4uPC9saT4NCjwvdWw+DQoNCjxoMz5Db3B5cmlnaHQgYW5kIExpY2Vuc2U8L2gzPg0KPHA+Q29weXJpZ2h0ICZjb3B5OyAyMDA5LCBqZXJlbXlCYXNzICZsdDs8YSBocmVmPSJodHRwOi8vY29yYmVuc3Byb2R1Y3RzLmNvbSI+Y29yYmVuc3Byb2R1Y3RzLmNvbTwvYT4mZ3Q7IEFsbCBSaWdodHMgQXJlIFJlc2VydmVkLjwvcD4NCjxzdHJvbmc+U3VwcG9ydCBtb3JlIG1vZHMgbGlrZSB0aGlzOjwvc3Ryb25nPjxmb3JtIGFjdGlvbj0iaHR0cHM6Ly93d3cucGF5cGFsLmNvbS9jZ2ktYmluL3dlYnNjciIgbWV0aG9kPSJwb3N0Ij4NCjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNtZCIgdmFsdWU9Il9zLXhjbGljayI+DQo8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJob3N0ZWRfYnV0dG9uX2lkIiB2YWx1ZT0iODgxNzY3NSI+DQo8aW5wdXQgdHlwZT0iaW1hZ2UiIHNyYz0iaHR0cHM6Ly93d3cucGF5cGFsLmNvbS9lbl9VUy9pL2J0bi9idG5fZG9uYXRlX0xHLmdpZiIgYm9yZGVyPSIwIiBuYW1lPSJzdWJtaXQiIGFsdD0iUGF5UGFsIC0gVGhlIHNhZmVyLCBlYXNpZXIgd2F5IHRvIHBheSBvbmxpbmUhIj4NCjxpbWcgYWx0PSIiIGJvcmRlcj0iMCIgc3JjPSJodHRwczovL3d3dy5wYXlwYWwuY29tL2VuX1VTL2kvc2NyL3BpeGVsLmdpZiIgd2lkdGg9IjEiIGhlaWdodD0iMSI+DQo8L2Zvcm0+PGJyLz4NCjxwPlRoaXMgbW9kdWxlIGhhcyBiZWVuIHJlbGVhc2VkIHVuZGVyIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwiPkdOVSBQdWJsaWMgTGljZW5zZTwvYT4uIFlvdSBtdXN0IGFncmVlIHRvIHRoaXMgbGljZW5zZSBiZWZvcmUgdXNpbmcgdGhlIG1vZHVsZS48L3A+DQo8L2RpdiA+PGIgY2xhc3M9InJib3R0b20iPjxiIGNsYXNzPSJyNCI+PC9iPjxiIGNsYXNzPSJyMyI+PC9iPiA8YiBjbGFzcz0icjIiPjwvYj4gPGIgY2xhc3M9InIxIj48L2I+PC9iPg0KDQo8L2Rpdj4NCjxoMz5QYXJhbWV0ZXJzPC9oMz48dWw+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gbGFuZz0iZW5fVVMiIC0gUGFyYW1ldGVyIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGF0IGxhbmd1YWdlIHRvIHVzZSBmb3IgZGlzcGxheSBvbiB0aGUgZnJvbnRlbmQuIE5vdCBhbGwgbW9kdWxlcyBzdXBwb3J0IG9yIG5lZWQgdGhpcy48L2xpPjwvdWw+</help>
	<about>PGJyIC8+QXV0aG9yOiBqZXJlbXlCYXNzICZsdDtqZXJlbXliYXNzQGNhYmxlb25lLm5ldCZndDs8YnIgLz48YnIgLz5WZXJzaW9uOiAwLjI8YnIgLz48YnIgLz5DaGFuZ2UgSGlzdG9yeTo8YnIgLz4NCjx1bD4NCg0KICA8bGk+VmVyc2lvbiAwLjEgQmV0YSByZWxlYXNlLjwvbGk+DQo8L3VsPjxiciAvPg==</about>
	<description>ScriptDeploy is a PayPal button manager. It handles the buttons internal to the site also lifts the 100 button cap of PayPal hosted buttons. Secure using time based sha1 encryption; Tie to most mods; Fire UTD's or plug-ins. Simple, flexible.</description>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/action.default.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogU2NyaXB0RGVwbG95IC0gTWluaWZ5IGFuZCBkZXBsb3ltZW50IG9mIEpTIENTUyBhbmQgSFRNTCANCiMgTW9kIGRlc2lnbmVkIGJ5IGplcmVteUJhc3MgKGplcmVteUJhc3NAY2FibGVvbmUubmV0KQ0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykNCiMgVGhpcyBwcm9qZWN0J3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcNCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL1NjcmlwdERlcGxveS8NCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5DQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yDQojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQojDQojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBDQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQppZiAoIWlzc2V0KCRnQ21zKSkgZXhpdDsNCiAvLyR0aGlzLT5BZGRFdmVudEZvcm0oJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQpOw0KLy9pZigkdGhpcy0+Q2hlY2tCT09LSUVVc2VyKCkpew0KDQoJZ2xvYmFsICRnQ21zOw0KCSRjb25maWcgPSYgJGdDbXMtPkdldENvbmZpZygpOyANCglpZihpc3NldCgkcGFyYW1zWydzY3JpcHRJRCddKSl7DQoJCSRJRD0kcGFyYW1zWydzY3JpcHRJRCddOw0KCQkkdHlwZT0ic2NyaXB0SUQiOw0KCX1lbHNlaWYoaXNzZXQoJHBhcmFtc1snZ3JvdXBJRCddKSl7DQoJCSRJRD0kcGFyYW1zWydncm91cElEJ107CQ0KCQkkdHlwZT0iZ3JvdXBJRCI7DQoJfQ0KCQ0KCSRTdWJkaXI9JHR5cGUuJy0nLiRJRDsNCgkkZmlsZWJhc2VuYW1lPSRJRDsNCg0KCSRyb290VXJsID0gaXNzZXQoJHBhcmFtc1sncm9vdFVybCddKSA/ICRwYXJhbXNbJ3Jvb3RVcmwnXSA6ICRjb25maWdbJ3VwbG9hZHNfdXJsJ107DQoJJFVSTD0gaXNzZXQoJHBhcmFtc1snVVJMJ10pID8gJHBhcmFtc1snVVJMJ106MDsNCgkkU3R5cGU9IGlzc2V0KCRwYXJhbXNbJ1N0eXBlJ10pID8gJHBhcmFtc1snU3R5cGUnXTonJzsNCgkNCgkkbm9PdXRQdXQgPSBpc3NldCgkcGFyYW1zWydub091dFB1dCddKSA/ICRwYXJhbXNbJ25vT3V0UHV0J106ZmFsc2U7DQoNCgkkZmlsZW5hbWU9JGNvbmZpZ1sndXBsb2Fkc19wYXRoJ10uIi9saWIvU0QtdGVtcC8iLiRTdWJkaXIuIi8iLiRmaWxlYmFzZW5hbWUuIi4iLiRTdHlwZTsJDQoJJGZpbGVMSU5LPSRyb290VXJsLiIvbGliL1NELXRlbXAvIi4kU3ViZGlyLiIvIi4kZmlsZWJhc2VuYW1lLiIuIi4kU3R5cGU7DQoNCglpZihmaWxlX2V4aXN0cygkZmlsZW5hbWUpKXsNCgkJaWYoJGRlYnVnSVQ9PXRydWUpew0KCQkJCXVubGluayAoJGZpbGVuYW1lKTsNCgkJfQ0KCX0NCg0KCWlmKCFmaWxlX2V4aXN0cygkZmlsZW5hbWUpKXsNCgkJcmVxdWlyZSAnanNtaW4ucGhwJzsNCgkJJGRhdGE9JHRoaXMtPmZpbGVzdGltZSgkSUQsJHR5cGUpOw0KCQkkZXZlbnQ9Jyc7DQoJCSRldmVudD1KU01pbjo6bWluaWZ5KCRkYXRhWzBdKTsNCgkJaWYoIWZpbGVfZXhpc3RzKCRjb25maWdbJ3VwbG9hZHNfcGF0aCddLiIvbGliL1NELXRlbXAvIi4kU3ViZGlyKSl7DQoJCQlta2RpcigkY29uZmlnWyd1cGxvYWRzX3BhdGgnXS4iL2xpYi9TRC10ZW1wLyIuJFN1YmRpciwgMDc3NywgdHJ1ZSk7DQoJCX0NCgkJJG91ckZpbGVOYW1lID0gJGZpbGVuYW1lOw0KCQkkb3VyRmlsZUhhbmRsZSA9IGZvcGVuKCRvdXJGaWxlTmFtZSwgJ3cnKSBvciBkaWUoImNhbid0IG9wZW4gZmlsZSIpOw0KCQlmY2xvc2UoJG91ckZpbGVIYW5kbGUpOw0KCQ0KCQkvLyBHRVQgTEVOR1RILCBBTkQgU1RPUkUgREFUQSBUTyBPVVIgU0VSVkVSIChPUiBEQVRBIEJBU0UpDQoJCSRsZW4gPSBzdHJsZW4oJGV2ZW50KTsNCgkJJGNoayA9IGZpbGVfcHV0X2NvbnRlbnRzKCRmaWxlbmFtZSwgJGV2ZW50KTsNCgkJDQoJCS8vIFRFU1QgRk9SIFNVQ0NFU1NGVUwgU1RPUkFHRQ0KCQlpZiAoJGxlbiE9JGNoaykgZGllKCJMRU5HVEggTUlTTUFUQ0giKTsNCgl9DQoJaWYoJG5vT3V0UHV0PT1mYWxzZSl7DQoJCSRhc3NpZ24gPSBpc3NldCgkcGFyYW1zWydhc3NpZ24nXSkgPyAkcGFyYW1zWydhc3NpZ24nXTonJzsNCgkJJGNhY2hlQnVzdGVyPSBpc3NldCgkcGFyYW1zWydjYWNoZUJ1c3RlciddKSA/ICRwYXJhbXNbJ2NhY2hlQnVzdGVyJ106JHRoaXMtPkdldFByZWZlcmVuY2UoJ2NhY2hlQnVzdGVyJyxmYWxzZSk7DQoJCSRmc2l6ZSA9IGlzc2V0KCRwYXJhbXNbJ2ZzaXplJ10pID8gJHBhcmFtc1snZnNpemUnXTpmYWxzZTsNCgkJaWYoJGNhY2hlQnVzdGVyPT10cnVlKXsNCgkJCSRmaWxlTElOSz0kZmlsZUxJTksuIj8iLmZpbGVtdGltZSgkZmlsZW5hbWUpOw0KCQl9DQoJCSRUYWc9Jyc7DQoJCQ0KCQlpZigkU3R5cGU9PSdKUycpew0KCQkJJFRhZz0iPHNjcmlwdCB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCIgc3JjPVwiJGZpbGVMSU5LXCI+PC9zY3JpcHQ+IjsNCgkJfWVsc2VpZigkU3R5cGU9PSdDU1MnKXsNCgkJCSRUYWc9IjxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiB0eXBlPVwidGV4dC9jc3NcIiBocmVmPVwiJGZpbGVMSU5LXCIgLz4iOw0KCQl9DQoJCQ0KCQkNCgkJDQoJCWlmKCRVUkw9PWZhbHNlKXsNCgkJCWlmKCRhc3NpZ24hPScnKXsNCgkJCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJGFzc2lnbiwkVGFnKTsNCgkJCX1lbHNlew0KCQkJCWVjaG8gJFRhZzsNCgkJCX0NCgkJfWVsc2V7DQoJCQlpZigkYXNzaWduIT0nJyl7DQoJCQkJCSR0aGlzLT5zbWFydHktPmFzc2lnbigkYXNzaWduLCRmaWxlTElOSyk7CQkJDQoJCQl9ZWxzZXsNCgkJCQlpZigkZnNpemU9PXRydWUpew0KCQkJCQllY2hvICR0aGlzLT5TaXplSXRVcChmaWxlc2l6ZSgkZmlsZW5hbWUpKTsNCgkJCQl9ZWxzZXsNCgkJCQkJZWNobyAkZmlsZUxJTks7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfQ0KPz4NCg==]]></data>
	</file>
	<file>
	  <filename>/action.defaultadmin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogU2NyaXB0RGVwbG95IC0gTWluaWZ5IGFuZCBkZXBsb3ltZW50IG9mIEpTIENTUyBhbmQgSFRNTCANCiMgTW9kIGRlc2lnbmVkIGJ5IGplcmVteUJhc3MgKGplcmVteUJhc3NAY2FibGVvbmUubmV0KQ0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykNCiMgVGhpcyBwcm9qZWN0J3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcNCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL1NjcmlwdERlcGxveS8NCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5DQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yDQojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQojDQojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBDQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQppZiAoIWlzc2V0KCRnQ21zKSkgZXhpdDsNCg0KIw0KI1RoZSB0YWIgaGVhZGVycw0KIw0KZWNobyAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KLy88IVtDREFUQVsNCmxvYWQgPSBmdW5jdGlvbigpIHsNCiAgICBsb2FkLmdldFNjcmlwdCgiaHR0cDovL2FqYXgubWljcm9zb2Z0LmNvbS9hamF4L2pRdWVyeS9qcXVlcnktMS4zLjIubWluLmpzIik7DQogICAgLy8gZG8gc3R1ZmYgd2hlbiBqUXVlcnkgZmluaXNoZXMgbG9hZGluZy4NCiAgICBsb2FkLnRyeVJlYWR5KDApOw0KfQ0KbG9hZC5nZXRTY3JpcHQgPSBmdW5jdGlvbihmaWxlbmFtZSkgew0KICAgIHZhciBmaWxlcmVmID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0IikNCiAgICBmaWxlcmVmLnNldEF0dHJpYnV0ZSgidHlwZSIsInRleHQvamF2YXNjcmlwdCIpDQogICAgZmlsZXJlZi5zZXRBdHRyaWJ1dGUoInNyYyIsIGZpbGVuYW1lKQ0KICAgIGlmICh0eXBlb2YgZmlsZXJlZiE9InVuZGVmaW5lZCIpDQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0uYXBwZW5kQ2hpbGQoZmlsZXJlZikNCn0NCmxvYWQudHJ5UmVhZHkgPSBmdW5jdGlvbih0aW1lX2VsYXBzZWQpIHsNCiAgICAvKiBDb250aW51YWxseSBwb2xscyBmb3IgalF1ZXJ5IGxpYnJhcnkuICovDQogICAgaWYgKHR5cGVvZiAkID09ICJ1bmRlZmluZWQiKSB7DQogICAgICAgIGlmICh0aW1lX2VsYXBzZWQgPD0gNTAwMCkgew0KICAgICAgICAgICAgc2V0VGltZW91dCgibG9hZC50cnlSZWFkeSgiICsgKHRpbWVfZWxhcHNlZCArIDIwMCkgKyAiKSIsIDIwMCk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBhbGVydCgiVGltZWQgb3V0IHdoaWxlIGxvYWRpbmcgalF1ZXJ5LiIpDQogICAgICAgIH0NCiAgICB9DQp9DQppZiAodHlwZW9mKHdpbmRvdy5qUXVlcnkpPT0idW5kZWZpbmVkIil7DQoJCWxvYWQoKTsgICANCn0NCg0KCS8vXV0+DQoNCjwvc2NyaXB0Pg0KDQo8bGluayBtZWRpYT0ic2NyZWVuIiBocmVmPSIuLi9tb2R1bGVzL1BheVBhbEJ1dHRvbk1ha2VyL0NTUy9NYXN0ZXJDU1MuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cDovL2Nkbi5qcXVlcnl0b29scy5vcmcvMS4xLjIvdGlueS9qcXVlcnkudG9vbHMubWluLmpzIj48L3NjcmlwdD4NCjxzY3JpcHQgc3JjPSJodHRwOi8vYWpheC5taWNyb3NvZnQuY29tL2FqYXgvanF1ZXJ5LnZhbGlkYXRlLzEuNi9qcXVlcnkudmFsaWRhdGUubWluLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0Pg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vbW9kdWxlcy9QYXlQYWxCdXR0b25NYWtlci9pbmNsdWRlcy9NRV8xLjAwLjAwLmpzIj48L3NjcmlwdD4NCg0KDQo8ZGl2IGlkPSJkZW1vdGlwIj4mbmJzcDs8L2Rpdj4NCg0KJzsNCg0KDQoNCmlmIChGQUxTRSA9PSBlbXB0eSgkcGFyYW1zWydhY3RpdmVfdGFiJ10pKXsNCgkkdGFiID0gJHBhcmFtc1snYWN0aXZlX3RhYiddOw0KfSBlbHNlIHsNCgkkdGFiID0gJyc7DQp9DQokdGFiSXM9MDsNCmlmICgkdGFiPT0ic2NyaXB0X3RlbXBsYXRlIil7JHRhYklzPTA7fQ0KaWYgKCR0YWI9PSJtYW51YWxhc3NpZ25tZW50Iil7JHRhYklzPTE7fQ0KaWYgKCR0YWI9PSJvcHRpb25zIil7JHRhYklzPTI7fQ0KZWNobyAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCl7JCgidWwudGFiZXJzIikudGFicygiZGl2LlRhYnBhbmVzID4gZGl2LnBhbmUiLCB7ZWZmZWN0OiAiZmFkZSIsIGZhZGVPdXRTcGVlZDogMjAwLCBpbml0aWFsSW5kZXg6Jy4kdGFiSXMuJywgb25DbGljazpmdW5jdGlvbihldmVudCwgdGFiSW5kZXgpIHtpZiAoJCgiLnBhZ2VtZXNzYWdlIikubGVuZ3RoID4gMCl7JCgiLnBhZ2VtZXNzYWdlIikuY2xvc2VzdCgiLnBhZ2VtY29udGFpbmVyIikuZmFkZU91dCgyMDAwLGZ1bmN0aW9uKCl7JCgiLnBhZ2VtZXNzYWdlIikuY2xvc2VzdCgiLnBhZ2VtY29udGFpbmVyIikucmVtb3ZlKCk7fSk7fX19KTsgfSk7PC9zY3JpcHQ+JzsNCiANCmlmIChGQUxTRSA9PSBlbXB0eSgkcGFyYW1zWydhY3RpdmVfdGFiJ10pICYmIEZBTFNFID09IGVtcHR5KCRwYXJhbXNbJ3RhYl9tZXNzYWdlJ10pKSB7DQoJJG1lc3NhZ2UgPSAkdGhpcy0+U2hvd01lc3NhZ2UoJHRoaXMtPkxhbmcoJHBhcmFtc1sndGFiX21lc3NhZ2UnXSkpOw0KfSBlbHNlIHsNCgkkbWVzc2FnZSA9ICcnOw0KfQ0KZWNobyAkbWVzc2FnZTsNCmlmICgkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgQ2FsZW5kYXInKSl7DQplY2hvJw0KPHVsIGNsYXNzPSJ0YWJlcnMiPg0KCTxsaT48YSBocmVmPSIjc2NyaXB0X3RlbXBsYXRlIj4nLiR0aGlzLT5MYW5nKCdTY3JpcHRfbGlzdCcpLic8L2E+PC9saT4NCgk8bGk+PGEgaHJlZj0iI21hbnVhbGFzc2lnbm1lbnQiPicuJHRoaXMtPkxhbmcoJ21hbnVhbGFzc2lnbm1lbnQnKS4nPC9hPjwvbGk+DQoJPGxpPjxhIGhyZWY9IiNvcHRpb25zIj4nLiR0aGlzLT5MYW5nKCdBQ1RvcHRpb25zJykuJzwvYT48L2xpPg0KPC91bD4gDQonOw0KfQ0KICANCmlmICgkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgQ2FsZW5kYXInKSkNCiAgew0KZWNobyAnPGRpdiBjbGFzcz0iVGFicGFuZXMiIGlkPSJQUEJNIj4NCjxkaXYgY2xhc3M9InBhbmUiPic7DQogICAgICBlY2hvICc8aDM+Jy4kdGhpcy0+TGFuZygndGl0bGVfU2NyaXB0cycpLic8L2gzPic7DQogICAgICAkdGhpcy0+X0FkbWluQ3JlYXRlVGVtcGxhdGVMaXN0KCRpZCwkcmV0dXJuaWQsDQoJCQkJICAgICAgJ2VtYWlsJywNCgkJCQkgICAgICAnZGVmYXVsdF9zY3JpcHRfdGVtcGxhdGVfY29udGVudHMnLA0KCQkJCSAgICAgICdzY3JpcHRfdGVtcGxhdGUnLA0KCQkJCSAgICAgICdjdXJyZW50X3NjcmlwdF90ZW1wbGF0ZScsDQoJCQkJICAgICAgJHRoaXMtPkxhbmcoJ3RpdGxlX3NjcmlwdF90ZW1wbGF0ZScpKTsNCmVjaG8gJzwvZGl2Pg0KPGRpdiBjbGFzcz0icGFuZSI+JzsNCiAgICAgIGVjaG8gJzxoMz4nLiR0aGlzLT5MYW5nKCd0aXRsZV9Hcm91cHMnKS4nPC9oMz4nOw0KICAgICAgJHRoaXMtPl9BZG1pbkNyZWF0ZUFzc2lnbm1lbnRMaXN0KCRpZCwkcmV0dXJuaWQsDQoJCQkJICAgICAgJ2VtYWlsJywNCgkJCQkgICAgICAnZGVmYXVsdF9zY3JpcHRfdGVtcGxhdGVfY29udGVudHMnLA0KCQkJCSAgICAgICdtYW51YWxhc3NpZ25tZW50JywNCgkJCQkgICAgICAnY3VycmVudF9zY3JpcHRfdGVtcGxhdGUnLA0KCQkJCSAgICAgICR0aGlzLT5MYW5nKCd0aXRsZV9zY3JpcHRfdGVtcGxhdGUnKSk7DQplY2hvICc8L2Rpdj4NCjxkaXYgY2xhc3M9InBhbmUiPic7DQogICAgaW5jbHVkZShkaXJuYW1lKF9fRklMRV9fKS4nLy9mdW5jdGlvbi5hZG1pbl9BQ1RvcHRpb25zdGFiLnBocCcpOw0KCSAgZWNobyAnPC9kaXY+DQoJPC9kaXY+JzsNCn0NCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KIyB2aW06dHM9NCBzdz00IG5vZXQNCj8+DQo=]]></data>
	</file>
	<file>
	  <filename>/action.deleteassignment.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogU2NyaXB0RGVwbG95IC0gTWluaWZ5IGFuZCBkZXBsb3ltZW50IG9mIEpTIENTUyBhbmQgSFRNTCANCiMgTW9kIGRlc2lnbmVkIGJ5IGplcmVteUJhc3MgKGplcmVteUJhc3NAY2FibGVvbmUubmV0KQ0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykNCiMgVGhpcyBwcm9qZWN0J3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcNCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL0NhcnMvDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQ0KIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQ0KIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcg0KIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KIw0KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQ0KIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQ0KIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQppZighJHRoaXMtPkNoZWNrUGVybWlzc2lvbignTW9kaWZ5IFRlbXBsYXRlcycpKXsNCiAgICAvLyB0b2RvLCBwZXJtaXNzaW9ucyBtZXNzYWdlIGhlcmUNCiAgICByZXR1cm47DQogIH0NCmdsb2JhbCAkZ0NtczsNCg0KICANCiRHcm91cHRTZXQ9JHBhcmFtc1snR3JvdXB0U2V0J107DQoNCgkJJGRiID0gJiRnQ21zLT5kYjsNCgkgIAkkcXVlcnkgPSAiREVMRVRFIHNkRywgZ2EgRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX3NjcmlwdGRlcGxveV9ncm91cCBBUyBzZEcgIg0KCQkJCQkuIklOTkVSIGpvaW4gICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfc2NyaXB0ZGVwbG95X2dyb3VwYXNzaWdubWVudCBBUyBnYSBPTiBnYS5Hcm91cHRTZXRJRCA9IHNkRy5JRCAiDQoJCQkJCS4iV0hFUkUgc2RHLklEID0gJyIuJEdyb3VwdFNldC4iJyI7DQoJCSRyZXN1bHQgPSAkZGItPkV4ZWN1dGUoJHF1ZXJ5KTsNCgkJDQoJCSRxdWVyeSA9ICJERUxFVEUgc2RHIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9zY3JpcHRkZXBsb3lfZ3JvdXAgQVMgc2RHICINCgkJCQkJLiJXSEVSRSBzZEcuSUQgPSAnIi4kR3JvdXB0U2V0LiInIjsNCgkJJHJlc3VsdCA9ICRkYi0+RXhlY3V0ZSgkcXVlcnkpOw0KCQkNCgkJaWYoISRyZXN1bHQpew0KCQkJZWNobyAnRXJyb3I6ICcubXlzcWxfZXJyb3IoKTsNCgkJCSRwYXJhbXNbJ21lc3NhZ2UnXSA9IG15c3FsX2Vycm9yKCk7DQoJCQkkdGhpcy0+RmlyZURlYnVnKCdlcnJvciBteXNxbF9lcnJvcigpJyxteXNxbF9lcnJvcigpKTsvLzw8PDwtLS0tLS1GaXJlIFBIUCBtZXNzYWdlDQoJCX1lbHNlew0KLy8gJHRoaXMtPkZpcmVEZWJ1Zygic2FpZCBpdCdzIGRvbmUgdGhlcmUiLCdlcnJvcicpOy8vPDw8PC0tLS0tLUZpcmUgUEhQIG1lc3NhZ2UNCgkJCSRwYXJhbXNbJ21lc3NhZ2UnXSA9IG15c3FsX2Vycm9yKCk7DQoJCQkkdGhpcy0+RmlyZURlYnVnKCdlcnJvcicsJEdyb3VwdFNldCk7Ly88PDw8LS0tLS0tRmlyZSBQSFAgbWVzc2FnZQ0KCQl9DQoJCQ0KCQkNCgkJJHRoaXMtPkZpcmVEZWJ1ZygnZXJyb3InLCRHcm91cHRTZXQpOy8vPDw8PC0tLS0tLUZpcmUgUEhQIG1lc3NhZ2UNCgkJLy8kdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCRpZCwgJ3VwbG9hZGZvcm1fdGVtcGxhdGUnKTsNCgkJJHBhcmFtcyA9IGFycmF5KCd0YWJfbWVzc2FnZSc9PiAnQnRuREVMRVRFRCcsICdhY3RpdmVfdGFiJyA9PiAnbWFudWFsYXNzaWdubWVudCcpOw0KCQkkdGhpcy0+UmVkaXJlY3QoJGlkLCAnZGVmYXVsdGFkbWluJywgJycsICRwYXJhbXMpOw0KPz4=]]></data>
	</file>
	<file>
	  <filename>/action.deletetemplate.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogU2NyaXB0RGVwbG95IC0gTWluaWZ5IGFuZCBkZXBsb3ltZW50IG9mIEpTIENTUyBhbmQgSFRNTCANCiMgTW9kIGRlc2lnbmVkIGJ5IGplcmVteUJhc3MgKGplcmVteUJhc3NAY2FibGVvbmUubmV0KQ0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykNCiMgVGhpcyBwcm9qZWN0J3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcNCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL0NhcnMvDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQ0KIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQ0KIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcg0KIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KIw0KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQ0KIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQ0KIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQppZighJHRoaXMtPkNoZWNrUGVybWlzc2lvbignTW9kaWZ5IFRlbXBsYXRlcycpKXsNCiAgICAvLyB0b2RvLCBwZXJtaXNzaW9ucyBtZXNzYWdlIGhlcmUNCiAgICByZXR1cm47DQogIH0NCmdsb2JhbCAkZ0NtczsNCiANCiRTY3JpcHRJRD0kcGFyYW1zWydTY3JpcHRJRCddOw0KDQoJCSRkYiA9ICYkZ0Ntcy0+ZGI7DQoJICAJJHF1ZXJ5ID0gIkRFTEVURSBzbiwgc28sIHNwIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9zY3JpcHRkZXBsb3lfc2NyaXB0bmFtZXMgQVMgc24gIg0KCQkJCQkuIklOTkVSIGpvaW4gICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfc2NyaXB0ZGVwbG95X3NjcmlwdG9wdGlvbnMgQVMgc28gT04gc24uSUQgPSBzby5JRCAiDQoJCQkJCS4iSU5ORVIgam9pbiAgIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9zY3JpcHRkZXBsb3lfc2NyaXB0cGFydHMgQVMgc3AgT04gc24uSUQgPSBzcC5JRCAiDQoJCQkJCS4iV0hFUkUgc24uSUQgPSAnIi4kU2NyaXB0SUQuIiciOw0KCQkkcmVzdWx0ID0gJGRiLT5FeGVjdXRlKCRxdWVyeSk7DQoJCWlmKCEkcmVzdWx0KXsNCgkJCWVjaG8gJ0Vycm9yOiAnLm15c3FsX2Vycm9yKCk7DQoJCQkkcGFyYW1zWydtZXNzYWdlJ10gPSBteXNxbF9lcnJvcigpOw0KCQkJJHRoaXMtPkZpcmVEZWJ1ZygnZXJyb3IgbXlzcWxfZXJyb3IoKScsbXlzcWxfZXJyb3IoKSk7Ly88PDw8LS0tLS0tRmlyZSBQSFAgbWVzc2FnZQ0KCQl9ZWxzZXsNCi8vICR0aGlzLT5GaXJlRGVidWcoInNhaWQgaXQncyBkb25lIHRoZXJlIiwnZXJyb3InKTsvLzw8PDwtLS0tLS1GaXJlIFBIUCBtZXNzYWdlDQoJCQkkcGFyYW1zWydtZXNzYWdlJ10gPSBteXNxbF9lcnJvcigpOw0KCQkJJHRoaXMtPkZpcmVEZWJ1ZygnZXJyb3InLCRTY3JpcHRTZXQpOy8vPDw8PC0tLS0tLUZpcmUgUEhQIG1lc3NhZ2UNCgkJfQ0KCQkNCgkJDQoJCSR0aGlzLT5GaXJlRGVidWcoJ2Vycm9yJywkU2NyaXB0U2V0KTsvLzw8PDwtLS0tLS1GaXJlIFBIUCBtZXNzYWdlDQoJCS8vJHRoaXMtPm15UmVkaXJlY3RUb1RhYigkaWQsICd1cGxvYWRmb3JtX3RlbXBsYXRlJyk7DQoJCSRwYXJhbXMgPSBhcnJheSgndGFiX21lc3NhZ2UnPT4gJ0J0bkRFTEVURUQnLCAnYWN0aXZlX3RhYicgPT4gJ3NjcmlwdF90ZW1wbGF0ZScpOw0KCQkkdGhpcy0+UmVkaXJlY3QoJGlkLCAnZGVmYXVsdGFkbWluJywgJycsICRwYXJhbXMpOw0KPz4=]]></data>
	</file>
	<file>
	  <filename>/action.editassignment.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogU2NyaXB0RGVwbG95IC0gTWluaWZ5IGFuZCBkZXBsb3ltZW50IG9mIEpTIENTUyBhbmQgSFRNTCANCiMgTW9kIGRlc2lnbmVkIGJ5IGplcmVteUJhc3MgKGplcmVteUJhc3NAY2FibGVvbmUubmV0KQ0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykNCiMgVGhpcyBwcm9qZWN0J3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcNCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL0NhcnMvDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQ0KIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQ0KIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcg0KIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KIw0KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQ0KIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQ0KIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQoJaWYoISRnQ21zKSBleGl0KCk7DQoJDQoJDQoJaWYoISR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01vZGlmeSBUZW1wbGF0ZXMnKSl7DQoJCS8vIHRvZG8sIHBlcm1pc3Npb25zIG1lc3NhZ2UgaGVyZQ0KCQlyZXR1cm47DQoJfQ0KDQoNCgkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoJCS8qLS0tLVN0YXJ0LS0tLS0tLS0tLS0tLS0tLS0qLw0KCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCgkvLyBoYW5kbGUgZXJyb3JzLg0KCWlmKGlzc2V0KCRwYXJhbXNbJ2Vycm9ycyddKSl7DQoJCWVjaG8gJHRoaXMtPlNob3dFcnJvcnMoJHBhcmFtc1snZXJyb3JzJ10pOw0KCX0NCgkkYWN0aXZlX3RhYj0ibWFudWFsYXNzaWdubWVudCI7DQoJJHBhcmFtc1snb3JpZ2FjdGlvbiddID0gJHBhcmFtc1snYWN0aW9uJ107DQoJJGNvbnRlbnRzID0gIiI7DQogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdmb3Jtc3RhcnQnLA0KCQkJICAgICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQgKCRpZCwgJ3NhdmVfbWFudWFsYXNzaWdubWVudCcsJHJldHVybmlkLCdwb3N0JywnJywNCgkJCQkJCSAgICBmYWxzZSwgJycsICRwYXJhbXMpKTsNCglpZigkcGFyYW1zWydtb2RlJ109PSdhZGQnKXsNCgkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdmb3Jtc3RhcnQnLA0KCQkJCQkkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0ICgkaWQsICdzYXZlX21hbnVhbGFzc2lnbm1lbnQnLCRyZXR1cm5pZCwncG9zdCcsJycsZmFsc2UsICcnLCAkcGFyYW1zKSk7DQoJCSR0aGlzLT5zbWFydHktPmFzc2lnbigndGVtcGxhdGVuYW1lJywNCgkJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoICRpZCwgJ3RlbXBsYXRlJywgIiIsIDQwICkpOw0KCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2hpZGRlbicsDQoJCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRIaWRkZW4oJGlkLCAnbW9kZScsICRwYXJhbXNbJ21vZGUnXSApDQoJCQkJICApOw0KCQlpZihpc3NldCgkcGFyYW1zWydkZWZhdWx0dGVtcGxhdGVwcmVmJ10pJiYkcGFyYW1zWydkZWZhdWx0dGVtcGxhdGVwcmVmJ10hPScnKXsNCgkJCSRjb250ZW50cyA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCRwYXJhbXNbJ2RlZmF1bHR0ZW1wbGF0ZXByZWYnXSk7DQoJCX0NCgkJDQoJCSR0aGlzLT5zbWFydHktPmFzc2lnbignc3VibWl0JywkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ3N1Ym1pdGJ1dHRvbicsDQoJCQkJCQkJICR0aGlzLT5MYW5nICgnc3VibWl0JykpKTsJDQoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdhZGQnLCcnKTsNCgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2RvbmUnLCcnKTsNCgl9ZWxzZXsNCgkNCgkJJHRoaXMtPkZpcmVEZWJ1ZygnbWVzc2FnZScsJ0dyb3VwdFNldCAnLiRwYXJhbXNbJ0dyb3VwdFNldCddKTsvLzw8PDwtLS0tLS1GaXJlIFBIUCBtZXNzYWdlDQoJCQ0KCQlpZihpc3NldCgkcGFyYW1zWydHcm91cHRTZXQnXSkpew0KCQlleHRyYWN0KCR0aGlzLT5UaWVBU2NyaXB0KCdzZWxlY3RHcm91cCcsJHBhcmFtc1snR3JvdXB0U2V0J10pKTsNCgkJfQ0KCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ0dyb3VwdFNldCcsDQoJCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCAkaWQsICdHcm91cHRTZXQnLCAkR3JvdXB0U2V0LCA0MCwgMjU1ICkpOw0KCSAgICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ0dyb3VwdFR5cGUnLA0KCQkJICR0aGlzLT5DcmVhdGVJbnB1dFJhZGlvR3JvdXAgKCRpZCwgJ0dyb3VwdFR5cGUnLCBhcnJheSgnSlMnPT4nSlMnLCdDU1MnPT4nQ1NTJyksICRHcm91cHRUeXBlLCcgZGlzYWJsZWQ9ImRpc2FibGVkIicsJycpKTsgDQoNCg0KLy8JCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLy8JCS8qLS0tbWFrZS1zY3JpcHQtY2hlY2tsaXN0LS0qLw0KLy8JCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KCSRhbGxQcm9maWxlcyA9ICR0aGlzLT5UaWVBU2NyaXB0KCdzZWxlY3RMaXN0Jyk7DQoJJFNjcmlwdFBpY2tlckFycmF5PWFycmF5KCk7DQoJJHJvd2FycmF5ID0gYXJyYXkoKTsNCgkkdENvdW50PTA7DQoJZm9yZWFjaCgkYWxsUHJvZmlsZXMgYXMgJGtleSA9PiAkb25lUHJvZmlsZSApew0KCQkkU2NyaXB0U2V0PSAkb25lUHJvZmlsZVsnU2NyaXB0U2V0J107DQoJCSRzY3JpcHRUeXBlPSAkb25lUHJvZmlsZVsnc2NyaXB0VHlwZSddOw0KCQlpZigkc2NyaXB0VHlwZT09JEdyb3VwdFR5cGUpew0KCQkJJHRDb3VudD0kdENvdW50KzE7DQoJCQkJJHJvdyA9IG5ldyBTdGRDbGFzcygpOw0KCQkJCSRyb3ctPlNjcmlwdG5hbWVMYWJsZSA9ICRTY3JpcHRTZXQ7DQoJCQkJJHRoaXMtPkZpcmVEZWJ1ZygnbWVzc2FnZScsJ2ZvciBTY3JpcHRJRCAnLiRrZXkuJyBHcm91cHRTZXQ6ICcuJHBhcmFtc1snR3JvdXB0U2V0J10pOy8vPDw8PC0tLS0tLUZpcmUgUEhQIG1lc3NhZ2UNCgkJCQkkcm93LT5TY3JpcHRuYW1lID0gJHRoaXMtPkNyZWF0ZUlucHV0Q2hlY2tib3ggKCRpZCwgJ1NjcmlwdFBpY2tlcltdJywgJGtleSwgJHRoaXMtPlRpZUFTY3JpcHQoJ0NoZWNrU2NyaXB0Jywka2V5LCRwYXJhbXNbJ0dyb3VwdFNldCddKSk7DQoJCQkJYXJyYXlfcHVzaCAoJHJvd2FycmF5LCAkcm93KTsNCgkJfQ0KCX0NCglpZigkdENvdW50PT0wKXsNCgkJJHJvdyA9IG5ldyBTdGRDbGFzcygpOw0KCQkkcm93LT5TY3JpcHRuYW1lTGFibGUgPSAkdGhpcy0+TGFuZyAoJ25vbmVJblR5cGUnKTsNCgkJJHJvdy0+U2NyaXB0bmFtZSA9ICcnOw0KCQlhcnJheV9wdXNoICgkcm93YXJyYXksICRyb3cpOw0KCX0NCgkNCgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1NjcmlwdFBpY2tlcicsICRyb3dhcnJheSk7DQoJCQkkYWxsZGJQcm9maWxlcyA9ICR0aGlzLT5UaWVBU2NyaXB0KCdzZWxlY3RHcm91cHNMaXN0aW5ncycsJHBhcmFtc1snR3JvdXB0U2V0J10pOw0KCQkJJHJvd2FycmF5ID0gYXJyYXkoKTsNCgkJCSRyb3djbGFzcyA9ICdyb3cxJzsNCgkJCSRHcm91cHRTaXplPTA7DQoJCQlmb3JlYWNoKCRhbGxkYlByb2ZpbGVzIGFzICRrZXkgPT4gJG9uZWRiUHJvZmlsZSApew0KCQkJCSRTY3JpcHRJRD0gJGtleTsNCgkJCQkkU2NyaXB0U2V0PSAkb25lZGJQcm9maWxlWydTY3JpcHRTZXQnXTsNCgkJCQkkc2NyaXB0U2l6ZT0gJG9uZWRiUHJvZmlsZVsnc2NyaXB0U2l6ZSddOw0KCQkJCSR0aGlzLT5GaXJlRGVidWcoJ21lc3NhZ2UnLCdTY3JpcHRJRCAnLiRTY3JpcHRJRCk7Ly88PDw8LS0tLS0tRmlyZSBQSFAgbWVzc2FnZQ0KCQkJCSR0aGlzLT5GaXJlRGVidWcoJ21lc3NhZ2UnLCdTY3JpcHRTZXQgJy4kU2NyaXB0U2V0KTsvLzw8PDwtLS0tLS1GaXJlIFBIUCBtZXNzYWdlDQoJCQkJJHRoaXMtPkZpcmVEZWJ1ZygnbWVzc2FnZScsJ3NjcmlwdFNpemUgJy4kc2NyaXB0U2l6ZSk7Ly88PDw8LS0tLS0tRmlyZSBQSFAgbWVzc2FnZQ0KCQkJCQ0KCQkJCSRHcm91cHRTaXplKz0kc2NyaXB0U2l6ZTsNCgkJCQ0KCQkJCSRyb3cgPSBuZXcgU3RkQ2xhc3MoKTsNCg0KCQkJCSRyb3ctPm5hbWUgPSAkdGhpcy0+Q3JlYXRlTGluayggJGlkLCAnZWRpdHRlbXBsYXRlJywgJHJldHVybmlkLA0KCQkJCQkJCQkkU2NyaXB0SUQsIGFycmF5KCdTY3JpcHRTZXQnID0+ICRTY3JpcHRJRCwNCgkJCQkJCQkJCQknYWN0aXZlX3RhYicgPT4gJGFjdGl2ZV90YWIsDQoJCQkJCQkJCQkJJ21vZGUnPT4nZWRpdCcpKTsNCgkJCQkkcm93LT5kZWZhdWx0ID0gJHRoaXMtPkNyZWF0ZUxpbmsoICRpZCwgJ2VkaXR0ZW1wbGF0ZScsICRyZXR1cm5pZCwNCgkJCQkJCQkJJFNjcmlwdFNldCwgYXJyYXkoJ1NjcmlwdFNldCcgPT4gJFNjcmlwdElELA0KCQkJCQkJCQkJCSdhY3RpdmVfdGFiJyA9PiAkYWN0aXZlX3RhYiwNCgkJCQkJCQkJCQknbW9kZSc9PidlZGl0JykpOw0KCQkJCSRyb3ctPnJvd2NsYXNzID0gJHJvd2NsYXNzOw0KCQkJCSRyb3ctPnNjcmlwdFNpemUgPSAkdGhpcy0+U2l6ZUl0VXAoJHNjcmlwdFNpemUpOw0KCQkJCSRyb3ctPm9yZGVyVXBsaW5rID0gJHRoaXMtPkNyZWF0ZUxpbmsoICRpZCwgJ29yZGVyVXB0ZW1wbGF0ZScsICRyZXR1cm5pZCwNCgkJCQkJCQkJCSRnQ21zLT52YXJpYWJsZXNbJ2FkbWludGhlbWUnXS0+DQoJCQkJCQkJCQlEaXNwbGF5SW1hZ2UgKCdpY29ucy9zeXN0ZW0vYXJyb3ctdS5naWYnLA0KCQkJCQkJCQkJCSAgJHRoaXMtPkxhbmcgKCdlZGl0JyksICcnLCAnJywgJ3N5c3RlbWljb24nKSwNCgkJCQkJCQkJCWFycmF5ICgnU2NyaXB0U2V0JyA9PiAka2V5LA0KCQkJCQkJCQkJICAgJ2FjdGl2ZV90YWInID0+ICRhY3RpdmVfdGFiLA0KCQkJCQkJCQkJICAgJ21vZGUnPT4nZWRpdCcpKTsNCgkJCQkkcm93LT5vcmRlckRvd25saW5rID0gJHRoaXMtPkNyZWF0ZUxpbmsoICRpZCwgJ29yZGVyRG93bnRlbXBsYXRlJywgJHJldHVybmlkLA0KCQkJCQkJCQkJJGdDbXMtPnZhcmlhYmxlc1snYWRtaW50aGVtZSddLT4NCgkJCQkJCQkJCURpc3BsYXlJbWFnZSAoJ2ljb25zL3N5c3RlbS9hcnJvdy1kLmdpZicsDQoJCQkJCQkJCQkJICAkdGhpcy0+TGFuZyAoJ2VkaXQnKSwgJycsICcnLCAnc3lzdGVtaWNvbicpLA0KCQkJCQkJCQkJYXJyYXkgKCdTY3JpcHRTZXQnID0+ICRrZXksDQoJCQkJCQkJCQkgICAnYWN0aXZlX3RhYicgPT4gJGFjdGl2ZV90YWIsDQoJCQkJCQkJCQkgICAnbW9kZSc9PidlZGl0JykpOw0KCQkJCQ0KCQkJCSRyb3ctPmVkaXRsaW5rID0gJHRoaXMtPkNyZWF0ZUxpbmsoICRpZCwgJ2VkaXR0ZW1wbGF0ZScsICRyZXR1cm5pZCwNCgkJCQkJCQkJCSRnQ21zLT52YXJpYWJsZXNbJ2FkbWludGhlbWUnXS0+DQoJCQkJCQkJCQlEaXNwbGF5SW1hZ2UgKCdpY29ucy9zeXN0ZW0vZWRpdC5naWYnLA0KCQkJCQkJCQkJCSAgJHRoaXMtPkxhbmcgKCdlZGl0JyksICcnLCAnJywgJ3N5c3RlbWljb24nKSwNCgkJCQkJCQkJCWFycmF5ICgnU2NyaXB0U2V0JyA9PiAka2V5LA0KCQkJCQkJCQkJICAgJ2FjdGl2ZV90YWInID0+ICRhY3RpdmVfdGFiLA0KCQkJCQkJCQkJICAgJ21vZGUnPT4nZWRpdCcpKTsNCgkJCQkNCgkJCQkNCgkJCQkkcm93LT5kZWxldGVsaW5rID0gJHRoaXMtPkNyZWF0ZUxpbmsoICRpZCwgJ2RlbGV0ZXRlbXBsYXRlJywgJHJldHVybmlkLA0KCQkJCQkJCQkgICRnQ21zLT52YXJpYWJsZXNbJ2FkbWludGhlbWUnXS0+DQoJCQkJCQkJCSAgRGlzcGxheUltYWdlICgnaWNvbnMvc3lzdGVtL2RlbGV0ZS5naWYnLA0KCQkJCQkJCQkJCSR0aGlzLT5MYW5nICgnZGVsZXRlJyksICcnLCAnJywgJ3N5c3RlbWljb24nKSwNCgkJCQkJCQkJICBhcnJheSAoJ1NjcmlwdFNldCcgPT4gJGtleSksDQoJCQkJCQkJCSAgJHRoaXMtPkxhbmcgKCdhcmV5b3VzdXJlJykpOw0KCQkJCQ0KCQkJCQ0KCQkJCWFycmF5X3B1c2ggKCRyb3dhcnJheSwgJHJvdyk7DQoJCQkJKCRyb3djbGFzcyA9PSAicm93MSIgPyAkcm93Y2xhc3MgPSAicm93MiIgOiAkcm93Y2xhc3MgPSAicm93MSIpOw0KCQkJfQ0KDQoJCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ0dyb3VwdFNpemUnLCAkdGhpcy0+U2l6ZUl0VXAoJEdyb3VwdFNpemUpKTsNCgkJCSR0aGlzLT5zbWFydHktPmFzc2lnbignR3JvdXB0U2l6ZV9sYWJlbCcsICR0aGlzLT5MYW5nKCdHcm91cHRTaXplX2xhYmVsJykpOw0KCQkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdTY3JpcHRMaXN0JywgJHJvd2FycmF5ICk7DQoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdhZGQnLCR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnc3VibWl0YnV0dG9uJywNCgkJCQkJCQkJICR0aGlzLT5MYW5nICgnYWRkJykpKTsNCgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2RvbmUnLCR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnZG9uZScsIA0KCQkJCQkJCQkgJHRoaXMtPkxhbmcgKCdkb25lJykpKTsNCgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N1Ym1pdCcsJycpOwkNCgkNCgkNCgl9DQoNCgkvLyR0aGlzLT5zbWFydHktPmFzc2lnbigndGl0bGUnLGNtc19odG1sX2VudGl0eV9kZWNvZGUoJHBhcmFtc1sndGl0bGUnXSkpOw0KCWlmKCRwYXJhbXNbJ21vZGUnXT09J2FkZCcpew0KCSAgDQoJCSR0aGlzLT5zbWFydHktPmFzc2lnbignR3JvdXB0U2V0JywNCgkJCQkkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCAkaWQsICdHcm91cHRTZXQnLCAiIiwgNDAsIDI1NSwgJycgKSk7DQogICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdHcm91cHRUeXBlJywNCgkJCSAkdGhpcy0+Q3JlYXRlSW5wdXRSYWRpb0dyb3VwICgkaWQsICdHcm91cHRUeXBlJywgYXJyYXkoJ0pTJz0+J0pTJywnQ1NTJz0+J0NTUycpLCAnJywnJywnJm5ic3A7Jm5ic3A7Jm5ic3A7JykpOyAJDQoJCSR0aGlzLT5zbWFydHktPmFzc2lnbignU2NyaXB0UGlja2VyJywnJyk7ICAJDQoJCSR0aGlzLT5zbWFydHktPmFzc2lnbignaGlkZGVuTW9kZScsDQoJCQkJJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuKCRpZCwgJ21vZGUnLCAkcGFyYW1zWydtb2RlJ10gKSk7IA0KCQkNCgl9DQoJaWYoaXNzZXQoJHBhcmFtc1snR3JvdXB0U2V0J10pKXskR0lEPSRwYXJhbXNbJ0dyb3VwdFNldCddO31lbHNleyRHSUQ9J1gnO30NCgkkdGhpcy0+RmlyZURlYnVnKCdtZXNzYWdlJywkcGFyYW1zWydtb2RlJ10pOy8vPDw8PC0tLS0tLUZpcmUgUEhQIG1lc3NhZ2UNCgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2hpZGRlbk1vZGUnLA0KCQkJJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuKCRpZCwgJ21vZGUnLCAkcGFyYW1zWydtb2RlJ10gKQ0KCQkJLiR0aGlzLT5DcmVhdGVJbnB1dEhpZGRlbigkaWQsICdncm91cCcsICRHSUQgKQ0KCQkJKTsgDQoJDQoJDQoNCgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3R5cGVfbGFiZWwnLCAkdGhpcy0+TGFuZygndHlwZV9sYWJlbCcpKTsNCgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ05hbWVfbGFiZWwnLCAkdGhpcy0+TGFuZygnU2NyaXB0U2V0X2xhYmVsJykpOw0KCSR0aGlzLT5zbWFydHktPmFzc2lnbignbmFtZXByb21wdF9sYWJlbCcsICR0aGlzLT5MYW5nKCdwcm9tcHRfbmFtZScpKTsNCgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1NjcmlwdE5hbWVfbGFiZWwnLCAkdGhpcy0+TGFuZygnU2NyaXB0TmFtZV9sYWJlbCcpKTsNCgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1NpbmdsZUNvZGVfbGFiZWwnLCAkdGhpcy0+TGFuZygnU2luZ2xlQ29kZV9sYWJlbCcpKTsvLyR0aGlzLT5MYW5nKCdwcm9tcHRfZGVmYXVsdCcpDQoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdmb3JtX2NhbmNlbCcsICc8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iJy4kdGhpcy0+TGFuZygnZm9ybV9jYW5jZWwnKS4nIiBvbmNsaWNrPSJqYXZhc2NyaXB0OndpbmRvdy5oaXN0b3J5LmdvKC0xKSIgLz4nKTsJICANCgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdF90ZW1wbGF0ZW5hbWUnLCR0aGlzLT5MYW5nKCdwcm9tcHRfdGVtcGxhdGVuYW1lJykpOw0KCSR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X3RlbXBsYXRlJywkdGhpcy0+TGFuZygncHJvbXB0X3RlbXBsYXRlJykpOw0KCSR0aGlzLT5zbWFydHktPmFzc2lnbigndGVtcGxhdGUnLA0KCQkJCSAgJHRoaXMtPkNyZWF0ZVN5bnRheEFyZWEgKCRpZCwgJGNvbnRlbnRzLCAndGVtcGxhdGVjb250ZW50JykpOw0KCQ0KDQoNCg0KCSR0aGlzLT5zbWFydHktPmFzc2lnbignY2FuY2VsJywkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ2NhbmNlbCcsIA0KCQkJCQkJCQkgJHRoaXMtPkxhbmcgKCdjYW5jZWwnKSkpOw0KCSR0aGlzLT5zbWFydHktPmFzc2lnbignZm9ybWVuZCcsJHRoaXMtPkNyZWF0ZUZvcm1FbmQoKSk7DQoJDQoJDQoJDQoJZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdlZGl0QXNzaWdubWVudC50cGwnKTsNCg0KPz4=]]></data>
	</file>
	<file>
	  <filename>/action.edittemplate.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogU2NyaXB0RGVwbG95IC0gTWluaWZ5IGFuZCBkZXBsb3ltZW50IG9mIEpTIENTUyBhbmQgSFRNTCANCiMgTW9kIGRlc2lnbmVkIGJ5IGplcmVteUJhc3MgKGplcmVteUJhc3NAY2FibGVvbmUubmV0KQ0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykNCiMgVGhpcyBwcm9qZWN0J3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcNCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL0NhcnMvDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQ0KIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQ0KIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcg0KIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KIw0KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQ0KIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQ0KIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQppZighJGdDbXMpIGV4aXQoKTsNCg0KDQppZighJHRoaXMtPkNoZWNrUGVybWlzc2lvbignTW9kaWZ5IFRlbXBsYXRlcycpKXsNCiAgICAvLyB0b2RvLCBwZXJtaXNzaW9ucyBtZXNzYWdlIGhlcmUNCiAgICByZXR1cm47DQp9DQoNCg0KJE1vZGlmZWREYXRlQXJyYXk9YXJyYXkoDQoJCSdCdXkgTm93Jz0+J194Y2xpY2snLA0KCQknRG9uYXRlJz0+J19kb25hdGlvbnMnLA0KCQknU3Vic2NyaWJlJz0+J194Y2xpY2stc3Vic2NyaXB0aW9ucycsDQoJCSdCdXkgR2lmdCBDZXJ0aWZpY2F0ZSc9Pidfb2UtZ2lmdC1jZXJ0aWZpY2F0ZScNCik7DQoNCi8vIGhhbmRsZSBlcnJvcnMuDQppZihpc3NldCgkcGFyYW1zWydlcnJvcnMnXSkpew0KICAgIGVjaG8gJHRoaXMtPlNob3dFcnJvcnMoJHBhcmFtc1snZXJyb3JzJ10pOw0KfQ0KDQokcGFyYW1zWydvcmlnYWN0aW9uJ10gPSAkcGFyYW1zWydhY3Rpb24nXTsNCiRjb250ZW50cyA9ICIiOw0KICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignZm9ybXN0YXJ0JywNCgkJCSAgICAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0ICgkaWQsICdzYXZlX1NjcmlwdF9TZXR1cCcsJHJldHVybmlkLCdwb3N0JywnJywNCgkJCQkJCSAgICBmYWxzZSwgJycsICRwYXJhbXMpKTsNCmlmKCRwYXJhbXNbJ21vZGUnXT09J2FkZCcpew0KICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignZm9ybXN0YXJ0JywNCgkJCSAgICAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0ICgkaWQsICdzYXZlX1NjcmlwdF9TZXR1cCcsJHJldHVybmlkLCdwb3N0JywnJyxmYWxzZSwgJycsICRwYXJhbXMpKTsNCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RlbXBsYXRlbmFtZScsDQoJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoICRpZCwgJ3RlbXBsYXRlJywgIiIsIDQwICkpOw0KICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaGlkZGVuJywNCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuKCRpZCwgJ21vZGUnLCAkcGFyYW1zWydtb2RlJ10gKSk7DQogICAgaWYoIGlzc2V0KCRwYXJhbXNbJ2RlZmF1bHR0ZW1wbGF0ZXByZWYnXSkgJiYgJHBhcmFtc1snZGVmYXVsdHRlbXBsYXRlcHJlZiddICE9ICcnICl7DQoJCSRjb250ZW50cyA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCRwYXJhbXNbJ2RlZmF1bHR0ZW1wbGF0ZXByZWYnXSk7DQogICAgIH0NCiAgfWVsc2V7DQoNCglleHRyYWN0KCR0aGlzLT5UaWVBU2NyaXB0KCdzZWxlY3QnLCRwYXJhbXNbJ1NjcmlwdFNldCddKSk7DQoNCi8vCSR0aGlzLT5GaXJlRGVidWcoJ21lc3NhZ2UnLCckTWluaWZ5IDogJy4kTWluaWZ5KTsvLzw8PDwtLS0tLS1GaXJlIFBIUCBtZXNzYWdlCQ0KLy8JJHRoaXMtPkZpcmVEZWJ1ZygnbWVzc2FnZScsJyRNaW5pZnkgOiAnLiRNaW5pZnkpOy8vPDw8PC0tLS0tLUZpcmUgUEhQIG1lc3NhZ2UJDQovLwkkdGhpcy0+RmlyZURlYnVnKCdtZXNzYWdlJywnJG1heEFnZSA6ICcuJG1heEFnZSk7Ly88PDw8LS0tLS0tRmlyZSBQSFAgbWVzc2FnZQkNCi8vCSR0aGlzLT5GaXJlRGVidWcoJ21lc3NhZ2UnLCckQ3JlYXRpb25EYXRlIDogJy4kQ3JlYXRpb25EYXRlKTsvLzw8PDwtLS0tLS1GaXJlIFBIUCBtZXNzYWdlCQ0KLy8JJHRoaXMtPkZpcmVEZWJ1ZygnbWVzc2FnZScsJyRNb2RpZmVkRGF0ZSA6ICcuJE1vZGlmZWREYXRlKTsvLzw8PDwtLS0tLS1GaXJlIFBIUCBtZXNzYWdlCQ0KLy8JJHRoaXMtPkZpcmVEZWJ1ZygnbWVzc2FnZScsJyRwYXRoT3B0aW9uIDogJy4kcGF0aE9wdGlvbik7Ly88PDw8LS0tLS0tRmlyZSBQSFAgbWVzc2FnZQkNCi8vCSR0aGlzLT5GaXJlRGVidWcoJ21lc3NhZ2UnLCckU2NyaXB0U2V0IDogJy4kU2NyaXB0U2V0KTsvLzw8PDwtLS0tLS1GaXJlIFBIUCBtZXNzYWdlCQ0KLy8JJHRoaXMtPkZpcmVEZWJ1ZygnbWVzc2FnZScsJyRTY3JpcHRJRCA6ICcuJFNjcmlwdElEKTsvLzw8PDwtLS0tLS1GaXJlIFBIUCBtZXNzYWdlCQ0KLy8JJHRoaXMtPkZpcmVEZWJ1ZygnbWVzc2FnZScsJyRTY3JpcHRJRCA6ICcuJFNjcmlwdElzKTsvLzw8PDwtLS0tLS1GaXJlIFBIUCBtZXNzYWdlCQ0KDQoNCgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1NjcmlwdFNldF9pbnB1dCcsDQoJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoICRpZCwgJ1NjcmlwdFNldF9pbnB1dCcsICRTY3JpcHRTZXQsIDQwLCAyNTUgKSk7DQogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdNaW5pZnlfaW5wdXQnLA0KCQkJICR0aGlzLT5DcmVhdGVJbnB1dFJhZGlvR3JvdXAgKCRpZCwgJ01pbmlmeV9pbnB1dCcsIGFycmF5KCdObyc9PicwJywnWWVzJz0+JzEnKSwgJE1pbmlmeSwnJywnJm5ic3A7Jm5ic3A7Jm5ic3A7JykpOyANCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ21heEFnZV9pbnB1dCcsDQoJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoICRpZCwgJ21heEFnZV9pbnB1dCcsICRtYXhBZ2UsIDQwICkpOyAJCQ0KICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncGF0aE9wdGlvbl9pbnB1dCcsDQoJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoICRpZCwgJ3BhdGhPcHRpb25faW5wdXQnLCAkcGF0aE9wdGlvbiwgNDAgKSk7ICANCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1NjcmlwdElzX2lucHV0JywgJHRoaXMtPkNyZWF0ZVRleHRBcmVhKDAsJGlkLCAkU2NyaXB0SXMsICdTY3JpcHRJc19pbnB1dCcsICAnJykpOw0KICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignc2NyaXB0VHlwZV9pbnB1dCcsDQoJCQkgJHRoaXMtPkNyZWF0ZUlucHV0UmFkaW9Hcm91cCAoJGlkLCAnc2NyaXB0VHlwZV9pbnB1dCcsIGFycmF5KCdKUyc9PidKUycsJ0NTUyc9PidDU1MnKSwgJHNjcmlwdFR5cGUsJycsJyZuYnNwOyZuYnNwOyZuYnNwOycpKTsgCQ0KCQkNCg0KICAgfQ0KDQovLyR0aGlzLT5zbWFydHktPmFzc2lnbigndGl0bGUnLGNtc19odG1sX2VudGl0eV9kZWNvZGUoJHBhcmFtc1sndGl0bGUnXSkpOw0KaWYoICRwYXJhbXNbJ21vZGUnXSA9PSAnYWRkJyApew0KICANCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1NjcmlwdFNldF9pbnB1dCcsDQoJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoICRpZCwgJ1NjcmlwdFNldF9pbnB1dCcsICIiLCA0MCwgMjU1LCAnJyApKTsNCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ01pbmlmeV9pbnB1dCcsDQoJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFJhZGlvR3JvdXAgKCRpZCwgJ01pbmlmeV9pbnB1dCcsIGFycmF5KCdObyc9PicwJywnWWVzJz0+JzEnKSwgJzAnLCcnLCcmbmJzcDsmbmJzcDsmbmJzcDsnKSk7IA0KICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignbWF4QWdlX2lucHV0JywNCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCggJGlkLCAnbWF4QWdlX2lucHV0JywgIiIsIDQwICkpOyAJCQ0KCSR0aGlzLT5zbWFydHktPmFzc2lnbigncGF0aE9wdGlvbl9pbnB1dCcsDQoJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoICRpZCwgJ3BhdGhPcHRpb25faW5wdXQnLCAiIiwgNDAgKSk7ICANCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1NjcmlwdElzX2lucHV0JywgJHRoaXMtPkNyZWF0ZVRleHRBcmVhICgwLCAkaWQsICcnLCAnU2NyaXB0SXNfaW5wdXQnLCAnJywnJywnJywnJywnODAnLCcyMCcpKTsgDQogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzY3JpcHRUeXBlX2lucHV0JywNCgkJCSAkdGhpcy0+Q3JlYXRlSW5wdXRSYWRpb0dyb3VwICgkaWQsICdzY3JpcHRUeXBlX2lucHV0JywgYXJyYXkoJ0pTJz0+J0pTJywnQ1NTJz0+J0NTUycpLCAnSlMnLCcnLCcmbmJzcDsmbmJzcDsmbmJzcDsnKSk7IAkJDQogIA0KCQkgICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2hpZGRlbk1vZGUnLA0KCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRIaWRkZW4oJGlkLCAnbW9kZScsICRwYXJhbXNbJ21vZGUnXSApKTsgIA0KDQp9DQoNCiR0aGlzLT5GaXJlRGVidWcoJ21lc3NhZ2UnLCRwYXJhbXNbJ21vZGUnXSk7Ly88PDw8LS0tLS0tRmlyZSBQSFAgbWVzc2FnZQ0KCSAgCSAgCQkgICR0aGlzLT5zbWFydHktPmFzc2lnbignaGlkZGVuTW9kZScsDQoJCQkkdGhpcy0+Q3JlYXRlSW5wdXRIaWRkZW4oJGlkLCAnbW9kZScsICRwYXJhbXNbJ21vZGUnXSApDQoJCQkvLy4kdGhpcy0+Q3JlYXRlSW5wdXRIaWRkZW4oJGlkLCAnd2FzJywgJHBhcmFtc1snVklOViddICkNCgkJCSk7DQoJCQ0KJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzbWFydHlIb3dfbGFiZWwnLCAkdGhpcy0+TGFuZygnc21hcnR5SG93JykpOyANCgkNCiR0aGlzLT5zbWFydHktPmFzc2lnbignc2NyaXB0VHlwZV9sYWJlbCcsICR0aGlzLT5MYW5nKCdzY3JpcHRUeXBlX2xhYmVsJykpOyANCiR0aGlzLT5zbWFydHktPmFzc2lnbignU2NyaXB0U2V0X2xhYmVsJywgJHRoaXMtPkxhbmcoJ1NjcmlwdFNldF9sYWJlbCcpKTsgDQokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ01pbmlmeV9sYWJlbCcsICR0aGlzLT5MYW5nKCdNaW5pZnlfbGFiZWwnKSk7IA0KJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdtYXhBZ2VfbGFiZWwnLCAkdGhpcy0+TGFuZygnbWF4QWdlX2xhYmVsJykpOwkJCSAgDQokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3BhdGhPcHRpb25fbGFiZWwnLCAkdGhpcy0+TGFuZygncGF0aE9wdGlvbl9sYWJlbCcpKTsgDQokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ1NjcmlwdElzX2xhYmVsJywgJHRoaXMtPkxhbmcoJ1NjcmlwdElzX2xhYmVsJykpOw0KDQokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2Zvcm1fY2FuY2VsJywgJzxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSInLiR0aGlzLT5MYW5nKCdmb3JtX2NhbmNlbCcpLiciIG9uY2xpY2s9ImphdmFzY3JpcHQ6d2luZG93Lmhpc3RvcnkuZ28oLTEpIiAvPicpOwkgIA0KJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfdGVtcGxhdGVuYW1lJywkdGhpcy0+TGFuZygncHJvbXB0X3RlbXBsYXRlbmFtZScpKTsNCiR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X3RlbXBsYXRlJywkdGhpcy0+TGFuZygncHJvbXB0X3RlbXBsYXRlJykpOw0KJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0ZW1wbGF0ZScsDQoJCSAgICAgICR0aGlzLT5DcmVhdGVTeW50YXhBcmVhICgkaWQsICRjb250ZW50cywgJ3RlbXBsYXRlY29udGVudCcpKTsNCiR0aGlzLT5zbWFydHktPmFzc2lnbignc3VibWl0JywkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ3N1Ym1pdGJ1dHRvbicsDQoJCQkJCQkJICR0aGlzLT5MYW5nICgnc3VibWl0JykpKTsNCiR0aGlzLT5zbWFydHktPmFzc2lnbignY2FuY2VsJywkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ2NhbmNlbCcsIA0KCQkJCQkJCSAkdGhpcy0+TGFuZyAoJ2NhbmNlbCcpKSk7DQokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2Zvcm1lbmQnLCR0aGlzLT5DcmVhdGVGb3JtRW5kKCkpOw0KDQoNCg0KZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdlZGl0dGVtcGxhdGUudHBsJyk7DQoNCj8+]]></data>
	</file>
	<file>
	  <filename>/action.filehandle.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KPGhlYWQ+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4NCjx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+DQo8L2hlYWQ+DQoNCjxib2R5Pg0KPC9ib2R5Pg0KPC9odG1sPg0K]]></data>
	</file>
	<file>
	  <filename>/action.save_ACTptions.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogU2NyaXB0RGVwbG95IC0gTWluaWZ5IGFuZCBkZXBsb3ltZW50IG9mIEpTIENTUyBhbmQgSFRNTCANCiMgTW9kIGRlc2lnbmVkIGJ5IGplcmVteUJhc3MgKGplcmVteUJhc3NAY2FibGVvbmUubmV0KQ0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykNCiMgVGhpcyBwcm9qZWN0J3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcNCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL1NjcmlwdERlcGxveS8NCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5DQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yDQojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQojDQojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBDQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmlmICghaXNzZXQoJGdDbXMpKSBleGl0Ow0KCWdsb2JhbCAkZ0NtczsNCgkkY29uZmlnID0mICRnQ21zLT5HZXRDb25maWcoKTsgDQoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ3NtYXJ0eU9uJywgJHBhcmFtc1snc21hcnR5T24nXSk7DQoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ2RlYnVnSVQnLCAkcGFyYW1zWydkZWJ1Z0lUJ10pOw0KCSRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdwcmVmc3VwZGF0ZWQnKTsNCglpZigkcGFyYW1zWydjbGVhcmNhY2hlJ109PTEpew0KCQkkZGlycGF0aD0kY29uZmlnWyd1cGxvYWRzX3BhdGgnXS4iL2xpYi9TRC10ZW1wLyI7DQoJDQoJCSRkZWxldGVkID0gJHRoaXMtPnJlY3Vyc2l2ZV9ybWRpcigkZGlycGF0aCk7DQoJCQ0KCQlpZigkZGVsZXRlZCl7DQoJCQkvLyR0aGlzLT5MYW5nKCdwcmVmc3VwZGF0ZWQnKTsNCgkJCSRjbGVhck0gPSAiPGgyPkNsZWFyZWQgJGRpcnBhdGg8L2gyPiI7DQoJCX1lbHNlew0KCQkJLy8kdGhpcy0+TGFuZygncHJlZnN1cGRhdGVkJyk7DQoJCQkkY2xlYXJNID0gIjxoMj5Tb3JyeTogJGRpcnBhdGg8YnIvPjxmb250IGNvbG9yPVwicmVkXCI+PHN0cm9uZz5ET0VTIE5PVCB5ZXQgZXhpc3QgcnVuIHRoZSBwbHVnLWluIG9uIGFuIGltYWdlIGZpcnN0Ljwvc3Ryb25nPjwvZm9udD48YnIvPjwvaDI+IjsNCgkJfQ0KCX0NCglmb3JlYWNoKCRwYXJhbXMgYXMgJGtleSA9PiAkcGFyYW1zSXRlbSl7DQoJCSR0aGlzLT5GaXJlRGVidWcoJ2Vycm9yJywicGFyYW1zICIuJGtleS4iIDogIi4kcGFyYW1zSXRlbSk7Ly88PDw8LS0tLS0tRmlyZSBQSFAgbWVzc2FnZQkNCgl9DQoJJHBhcmFtcyA9IGFycmF5KCd0YWJfbWVzc2FnZSc9PiAnb3B0aW9uc3VwZGF0ZWQnLCAnYWN0aXZlX3RhYicgPT4gJ29wdGlvbnMnLCAnY2xlYXInID0+ICRjbGVhck0pOw0KCSR0aGlzLT5SZWRpcmVjdCgkaWQsICdkZWZhdWx0YWRtaW4nLCAnJywgJHBhcmFtcyk7DQo/Pg0K]]></data>
	</file>
	<file>
	  <filename>/action.save_manualassignment.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogU2NyaXB0RGVwbG95IC0gTWluaWZ5IGFuZCBkZXBsb3ltZW50IG9mIEpTIENTUyBhbmQgSFRNTCANCiMgTW9kIGRlc2lnbmVkIGJ5IGplcmVteUJhc3MgKGplcmVteUJhc3NAY2FibGVvbmUubmV0KQ0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykNCiMgVGhpcyBwcm9qZWN0J3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcNCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL0NhcnMvDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQ0KIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQ0KIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcg0KIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KIw0KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQ0KIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQ0KIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQppZiAoIWlzc2V0KCRnQ21zKSkgZXhpdDsNCmdsb2JhbCAkZ0NtczsNCg0KaWYoaXNzZXQoJHBhcmFtc1snY2FuY2VsJ10pKXsNCgkkcGFyYW1zID0gYXJyYXkoJ3RhYl9tZXNzYWdlJz0+ICdDYW5jZWxlZCcsICdhY3RpdmVfdGFiJyA9PiAnbWFudWFsYXNzaWdubWVudCcpOw0KCSR0aGlzLT5SZWRpcmVjdCgkaWQsICdkZWZhdWx0YWRtaW4nLCAnJywgJHBhcmFtcyk7DQp9DQoNCiRkYiA9JiAkdGhpcy0+R2V0RGIoKTsNCgkNCmZvcmVhY2goJHBhcmFtcyBhcyAka2V5ID0+ICRwYXJhbXNJdGVtKXsNCgkkdGhpcy0+RmlyZURlYnVnKCdlcnJvcicsInBhcmFtcyAiLiRrZXkuIiA6ICIuJHBhcmFtc0l0ZW0pOy8vPDw8PC0tLS0tLUZpcmUgUEhQIG1lc3NhZ2UJDQp9DQoJDQoJDQovLyRzY3JpcHRTaXplPW1iX3N0cmxlbigkX1BPU1RbJ20xX1NjcmlwdElzX2lucHV0J10sICc4Yml0Jyk7DQokc2NyaXB0U2l6ZT1zdHJsZW4odXRmOF9kZWNvZGUoJHBhcmFtc1snU2NyaXB0SXNfaW5wdXQnXSkpOw0KJEdyb3VwTmFtZT0kcGFyYW1zWydHcm91cHRTZXQnXTsNCiRHcm91cElEPSRwYXJhbXNbJ2dyb3VwJ107DQokU2NyaXB0SUQ9JHBhcmFtc1snU2NyaXB0UGlja2VyJ107DQokR3JvdXB0VHlwZT0kcGFyYW1zWydHcm91cHRUeXBlJ107DQoNCiR0aGlzLT5GaXJlRGVidWcoJ21lc3NhZ2UnLCckR3JvdXBJRCA6ICcuJEdyb3VwSUQpOy8vPDw8PC0tLS0tLUZpcmUgUEhQIG1lc3NhZ2UJDQokdGhpcy0+RmlyZURlYnVnKCdtZXNzYWdlJywnJFNjcmlwdElEIDogJy4kU2NyaXB0SUQpOy8vPDw8PC0tLS0tLUZpcmUgUEhQIG1lc3NhZ2UJDQokdGhpcy0+RmlyZURlYnVnKCdtZXNzYWdlJywnJEdyb3VwdFR5cGUgOiAnLiRHcm91cHRUeXBlKTsvLzw8PDwtLS0tLS1GaXJlIFBIUCBtZXNzYWdlCQ0KJHRoaXMtPkZpcmVEZWJ1ZygnbWVzc2FnZScsJyRHcm91cE5hbWUgOiAnLiRHcm91cE5hbWUpOy8vPDw8PC0tLS0tLUZpcmUgUEhQIG1lc3NhZ2UNCiR0aGlzLT5GaXJlRGVidWcoJ21lc3NhZ2UnLCckc2NyaXB0U2l6ZSA6ICcuJHNjcmlwdFNpemUpOy8vPDw8PC0tLS0tLUZpcmUgUEhQIG1lc3NhZ2UNCg0KCQlpZigkcGFyYW1zWydtb2RlJ109PSdhZGQnKXsNCg0KDQoJCQkJJHF1ZXJ5ID0gIklOU0VSVCBJTlRPICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfc2NyaXB0ZGVwbG95X2dyb3VwIFNFVCBHcm91cHRTZXQ9JyIuJEdyb3VwTmFtZS4iJywgR3JvdXB0VHlwZT0nIi4kR3JvdXB0VHlwZS4iJyI7DQoJCQkJJHJlc3VsdCA9ICYkZGItPkV4ZWN1dGUoJHF1ZXJ5KTsNCgkJCQlpZighJHJlc3VsdCl7DQoJCQkJICAvL2VjaG8gJ0Vycm9yOiAnLm15c3FsX2Vycm9yKCk7DQoJCQkJICAkcGFyYW1zWydtZXNzYWdlJ10gPSBteXNxbF9lcnJvcigpOw0KCQkJCX1lbHNlew0KCQkJCSAgICRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdwcmVmc3VwZGF0ZWQnKTsNCgkJCQl9DQoJCQkJDQoJfWVsc2UgaWYoJHBhcmFtc1snbW9kZSddPT0nZWRpdCcpew0KCQkNCgkJJHF1ZXJ5ID0gIkRFTEVURSBzbiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfc2NyaXB0ZGVwbG95X2dyb3VwYXNzaWdubWVudCBBUyBzbiAiDQoJCQkJCS4iV0hFUkUgc24uR3JvdXB0U2V0SUQgPSAnIi4kR3JvdXBJRC4iJyI7DQoJCSRyZXN1bHQgPSAkZGItPkV4ZWN1dGUoJHF1ZXJ5KTsNCgkJDQoJCQ0KCQkJCSR0aGlzLT5GaXJlRGVidWcoJ2Vycm9yJywkcGFyYW1zWydtZXNzYWdlJ10pOy8vPDw8PC0tLS0tLUZpcmUgUEhQIG1lc3NhZ2UJDQoJCQkJIGZvcmVhY2goJFNjcmlwdElEIGFzICRrZXkgPT4gJFNBcnJheUl0ZW0pew0KCQkJCSRxdWVyeSA9ICJJTlNFUlQgSU5UTyAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX3NjcmlwdGRlcGxveV9ncm91cGFzc2lnbm1lbnQgIg0KCQkJCS4iKEdyb3VwdFNldElELCBTY3JpcHRJRCkgIg0KCQkJCS4iVkFMVUVTICggJyIuJEdyb3VwSUQuIicsJyIuJFNBcnJheUl0ZW0uIicpIjsNCgkJCQkkcmVzdWx0ID0gJiRkYi0+RXhlY3V0ZSgkcXVlcnkpOw0KCQkJCWlmKCEkcmVzdWx0KXsNCgkJCQkgIC8vZWNobyAnRXJyb3I6ICcubXlzcWxfZXJyb3IoKTsNCgkJCQkgICRwYXJhbXNbJ21lc3NhZ2UnXSA9IG15c3FsX2Vycm9yKCk7DQoJCQkJfWVsc2V7DQoJCQkJICAgJHBhcmFtc1snbWVzc2FnZSddID0gJHRoaXMtPkxhbmcoJ3ByZWZzdXBkYXRlZCcpOw0KCQkJCX0NCgkJCQkkdGhpcy0+RmlyZURlYnVnKCdlcnJvcicsIi5Hcm91cE5hbWUuLi4uc2NyaXB0SUQuICIuJEdyb3VwTmFtZS4iLCIuJHNjcmlwdElELiIiKTsvLzw8PDwtLS0tLS1GaXJlIFBIUCBtZXNzYWdlCQkJDQoJCQkJfQ0KCQkJCQ0KCQkJCQ0KCQkJJHRoaXMtPkZpcmVEZWJ1ZygnbWVzc2FnZScsJ2VjaG86LS0tLS0tLS0tLS0tLS0tJy4kc3J0KTsvLzw8PDwtLS0tLS1GaXJlIFBIUCBtZXNzYWdlDQoJCX1lbHNlIGlmKCRwYXJhbXNbJ21vZGUnXT09J2FkZFNjcmlwdCcpewkNCgkJCSANCgkJCSRxdWVyeSA9ICJVUERBVEUgIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9zY3JpcHRkZXBsb3lfZ3JvdXAgQVMgc2RHICINCgkJCQkJLiJJTk5FUiBqb2luICAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX3NjcmlwdGRlcGxveV9zY3JpcHRvcHRpb25zIHNvIE9OIHNuLklEID0gc28uSUQgIg0KCQkJCQkuIklOTkVSIGpvaW4gICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfc2NyaXB0ZGVwbG95X3NjcmlwdHBhcnRzIHNwIE9OIHNuLklEID0gc3AuSUQgIg0KCQkJCQkuIlNFVCBzby5NaW5pZnk9JyIuJE1pbmlmeQ0KCQkJCQkuIicsIHNuLlNjcmlwdFNldD0nIi4kc2NyaXB0TmFtZQ0KCQkJCQkuIicsIHNvLm1heEFnZT0nIi4kbWF4QWdlDQoJCQkJCS4iJywgc28ucGF0aE9wdGlvbj0nIi4kcGF0aE9wdGlvbg0KCQkJCQkuIicsIHNvLnNjcmlwdFR5cGU9JyIuJHNjcmlwdFR5cGUNCgkJCQkJLiInLCBzcC5TY3JpcHRJcz0nIi4kU2NyaXB0SXMNCgkJCQkJLiInLCBzby5zY3JpcHRTaXplPSciLiRzY3JpcHRTaXplDQoJCQkJCS4iJyBXSEVSRSBzbi5JRCA9ICciLiRTY3JpcHRJRC4iJyI7DQoNCgkJCQkJCQkJCQkJJHJlc3VsdCA9ICYkZGItPkV4ZWN1dGUoJHF1ZXJ5KTsNCgkJCQkJCQlpZighJHJlc3VsdCl7DQoJCQkJCQkJICAvL2VjaG8gJ0Vycm9yOiAnLm15c3FsX2Vycm9yKCk7DQoJCQkJCQkJICAkcGFyYW1zWydtZXNzYWdlJ10gPSBteXNxbF9lcnJvcigpOw0KCQkJCQkJCSAgJHRoaXMtPkZpcmVEZWJ1ZygnZXJyb3InLG15c3FsX2Vycm9yKCkpOy8vPDw8PC0tLS0tLUZpcmUgUEhQIG1lc3NhZ2UNCgkJCQkJCQl9ZWxzZXsNCgkJCQkJCQkgICAkcGFyYW1zWydtZXNzYWdlJ10gPSAkdGhpcy0+TGFuZygncHJlZnN1cGRhdGVkJyk7DQoJCQkJCQkJfQ0KCQkJCQkJCSR0aGlzLT5GaXJlRGVidWcoJ2Vycm9yJywkcGFyYW1zWydtb2RlJ10pOy8vPDw8PC0tLS0tLUZpcmUgUEhQIG1lc3NhZ2UNCgkJCX0NCg0KaWYoJHBhcmFtc1snbW9kZSddPT0nYWRkJyl7DQoJJHBhcmFtcyA9IGFycmF5KCd0YWJfbWVzc2FnZSc9PiAnQnRuQURERUQnLCAnYWN0aXZlX3RhYicgPT4gJ21hbnVhbGFzc2lnbm1lbnQnKTsNCn1lbHNlew0KCSRwYXJhbXMgPSBhcnJheSgndGFiX21lc3NhZ2UnPT4gJ0J0bkVESVRFRCcsICdhY3RpdmVfdGFiJyA9PiAnbWFudWFsYXNzaWdubWVudCcpOw0KfQ0KDQoNCiR0aGlzLT5SZWRpcmVjdCgkaWQsICdkZWZhdWx0YWRtaW4nLCAnJywgJHBhcmFtcyk7DQo/Pg0K]]></data>
	</file>
	<file>
	  <filename>/action.save_Script_Setup.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogU2NyaXB0RGVwbG95IC0gTWluaWZ5IGFuZCBkZXBsb3ltZW50IG9mIEpTIENTUyBhbmQgSFRNTCANCiMgTW9kIGRlc2lnbmVkIGJ5IGplcmVteUJhc3MgKGplcmVteUJhc3NAY2FibGVvbmUubmV0KQ0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykNCiMgVGhpcyBwcm9qZWN0J3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcNCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL0NhcnMvDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQ0KIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQ0KIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcg0KIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KIw0KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQ0KIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQ0KIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQppZiAoIWlzc2V0KCRnQ21zKSkgZXhpdDsNCmdsb2JhbCAkZ0NtczsNCg0KDQppZihpc3NldCgkcGFyYW1zWydjYW5jZWwnXSkpew0KCSRwYXJhbXMgPSBhcnJheSgndGFiX21lc3NhZ2UnPT4gJ0NhbmNlbGVkJywgJ2FjdGl2ZV90YWInID0+ICdzY3JpcHRfdGVtcGxhdGUnKTsNCgkkdGhpcy0+UmVkaXJlY3QoJGlkLCAnZGVmYXVsdGFkbWluJywgJycsICRwYXJhbXMpOw0KfQ0KDQokZGIgPSYgJHRoaXMtPkdldERiKCk7DQoNCgkNCgkNCi8vLy8NCi8vIENyZWF0IGJ0biB0YWJsZQ0KLy8vLw0KDQoJJE1pbmlmeT0kcGFyYW1zWydNaW5pZnlfaW5wdXQnXTsNCgkkbWF4QWdlPSRwYXJhbXNbJ21heEFnZV9pbnB1dCddOw0KCSRwYXRoT3B0aW9uPSRwYXJhbXNbJ3BhdGhPcHRpb25faW5wdXQnXTsNCgkkc2NyaXB0VHlwZT0kcGFyYW1zWydzY3JpcHRUeXBlX2lucHV0J107DQoJJHNjcmlwdE5hbWU9JHBhcmFtc1snU2NyaXB0U2V0X2lucHV0J107CQ0KCSRTY3JpcHRJcz1teXNxbF9yZWFsX2VzY2FwZV9zdHJpbmcoJHBhcmFtc1snU2NyaXB0SXNfaW5wdXQnXSk7CQ0KCSRTY3JpcHRJRD0kcGFyYW1zWydTY3JpcHRTZXQnXTsNCgkvLyRzY3JpcHRTaXplPW1iX3N0cmxlbigkX1BPU1RbJ20xX1NjcmlwdElzX2lucHV0J10sICc4Yml0Jyk7DQoJJHNjcmlwdFNpemU9c3RybGVuKHV0ZjhfZGVjb2RlKCRwYXJhbXNbJ1NjcmlwdElzX2lucHV0J10pKTsNCgkNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKi0tLS0tLS0tLS1ERUJVRy0tLS0tLS0tLS0tKi8NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwkJDQoJJHRoaXMtPkZpcmVEZWJ1ZygnbWVzc2FnZScsJyRTY3JpcHRJRCA6ICcuJFNjcmlwdElEKTsvLzw8PDwtLS0tLS1GaXJlIFBIUCBtZXNzYWdlCQ0KCSR0aGlzLT5GaXJlRGVidWcoJ21lc3NhZ2UnLCckTWluaWZ5IDogJy4kTWluaWZ5KTsvLzw8PDwtLS0tLS1GaXJlIFBIUCBtZXNzYWdlCQ0KCSR0aGlzLT5GaXJlRGVidWcoJ21lc3NhZ2UnLCckbWF4QWdlIDogJy4kbWF4QWdlKTsvLzw8PDwtLS0tLS1GaXJlIFBIUCBtZXNzYWdlCQ0KCSR0aGlzLT5GaXJlRGVidWcoJ21lc3NhZ2UnLCckcGF0aE9wdGlvbiA6ICcuJHBhdGhPcHRpb24pOy8vPDw8PC0tLS0tLUZpcmUgUEhQIG1lc3NhZ2UJDQoJJHRoaXMtPkZpcmVEZWJ1ZygnbWVzc2FnZScsJyRzY3JpcHRUeXBlIDogJy4kc2NyaXB0VHlwZSk7Ly88PDw8LS0tLS0tRmlyZSBQSFAgbWVzc2FnZQkNCgkkdGhpcy0+RmlyZURlYnVnKCdtZXNzYWdlJywnJFNjcmlwdElzIDogJy4kU2NyaXB0SXMpOy8vPDw8PC0tLS0tLUZpcmUgUEhQIG1lc3NhZ2UJDQoJJHRoaXMtPkZpcmVEZWJ1ZygnbWVzc2FnZScsJ20xX21vZGUgOiAnLiRwYXJhbXNbJ20xX21vZGUnXSk7Ly88PDw8LS0tLS0tRmlyZSBQSFAgbWVzc2FnZQ0KCQ0KDQoNCg0KDQoJCWlmKCRwYXJhbXNbJ21vZGUnXT09J2FkZCcpew0KDQoJCQkJJHF1ZXJ5ID0gIklOU0VSVCBJTlRPICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfU2NyaXB0RGVwbG95X3NjcmlwdE5hbWVzIFNFVCBTY3JpcHRTZXQ9JyIuJHNjcmlwdE5hbWUuIiciOw0KCQkJCSRyZXN1bHQgPSAmJGRiLT5FeGVjdXRlKCRxdWVyeSk7DQoJCQkJaWYoISRyZXN1bHQpew0KCQkJCSAgLy9lY2hvICdFcnJvcjogJy5teXNxbF9lcnJvcigpOw0KCQkJCSAgJHBhcmFtc1snbWVzc2FnZSddID0gbXlzcWxfZXJyb3IoKTsNCgkJCQl9DQoJCQkJCQkJCQkJDQoJCQkJJHF1ZXJ5ID0gIklOU0VSVCBJTlRPICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfU2NyaXB0RGVwbG95X3NjcmlwdE9wdGlvbnMgIg0KCQkJCS4iKElELCBNaW5pZnksIG1heEFnZSwgIHBhdGhPcHRpb24sIHNjcmlwdFR5cGUsIHNjcmlwdFNpemUpICINCgkJCQkuIlZBTFVFUyAoIExBU1RfSU5TRVJUX0lEKCksJyIuJE1pbmlmeQ0KCQkJCQkJCQkJCSAgLiInLCciLiRtYXhBZ2UNCgkJCQkJCQkJCQkgIC4iJywnIi4kcGF0aE9wdGlvbg0KCQkJCQkJCQkJCSAgLiInLCciLiRzY3JpcHRUeXBlDQoJCQkJCQkJCQkJICAuIicsJyIuJHNjcmlwdFNpemUuIicpIjsNCgkJCQkkcmVzdWx0ID0gJiRkYi0+RXhlY3V0ZSgkcXVlcnkpOw0KCQkJCWlmKCEkcmVzdWx0KXsNCgkJCQkgIC8vZWNobyAnRXJyb3I6ICcubXlzcWxfZXJyb3IoKTsNCgkJCQkgICRwYXJhbXNbJ21lc3NhZ2UnXSA9IG15c3FsX2Vycm9yKCk7DQoJCQkJfQ0KCQkJCSRxdWVyeSA9ICJJTlNFUlQgSU5UTyAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX3NjcmlwdGRlcGxveV9zY3JpcHRwYXJ0cyAiDQoJCQkJLiIoSUQsIFNjcmlwdElzKSAiDQoJCQkJLiJWQUxVRVMgKCBMQVNUX0lOU0VSVF9JRCgpLCciLiRTY3JpcHRJcy4iJykiOw0KCQkJCSRyZXN1bHQgPSAmJGRiLT5FeGVjdXRlKCRxdWVyeSk7DQoJCQkJaWYoISRyZXN1bHQpew0KCQkJCSAgLy9lY2hvICdFcnJvcjogJy5teXNxbF9lcnJvcigpOw0KCQkJCSAgJHBhcmFtc1snbWVzc2FnZSddID0gbXlzcWxfZXJyb3IoKTsNCgkJCQl9ZWxzZXsNCgkJCQkgICAkcGFyYW1zWydtZXNzYWdlJ10gPSAkdGhpcy0+TGFuZygncHJlZnN1cGRhdGVkJyk7DQoJCQkJfQkJCQkNCgkJCQkNCgkJCQkNCgkJCQkNCgkJCQ0KCQl9ZWxzZSBpZigkcGFyYW1zWydtb2RlJ109PSdlZGl0Jyl7ICANCgkJCSRxdWVyeSA9ICJVUERBVEUgIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9zY3JpcHRkZXBsb3lfc2NyaXB0bmFtZXMgc24gIg0KCQkJCQkuIklOTkVSIGpvaW4gICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfc2NyaXB0ZGVwbG95X3NjcmlwdG9wdGlvbnMgc28gT04gc24uSUQgPSBzby5JRCAiDQoJCQkJCS4iSU5ORVIgam9pbiAgIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9zY3JpcHRkZXBsb3lfc2NyaXB0cGFydHMgc3AgT04gc24uSUQgPSBzcC5JRCAiDQoJCQkJCS4iU0VUIHNvLk1pbmlmeT0nIi4kTWluaWZ5DQoJCQkJCS4iJywgc24uU2NyaXB0U2V0PSciLiRzY3JpcHROYW1lDQoJCQkJCS4iJywgc28ubWF4QWdlPSciLiRtYXhBZ2UNCgkJCQkJLiInLCBzby5wYXRoT3B0aW9uPSciLiRwYXRoT3B0aW9uDQoJCQkJCS4iJywgc28uc2NyaXB0VHlwZT0nIi4kc2NyaXB0VHlwZQ0KCQkJCQkuIicsIHNwLlNjcmlwdElzPSciLiRTY3JpcHRJcw0KCQkJCQkuIicsIHNvLnNjcmlwdFNpemU9JyIuJHNjcmlwdFNpemUNCgkJCQkJLiInIFdIRVJFIHNuLklEID0gJyIuJFNjcmlwdElELiInIjsNCg0KCQkJCQkJCQkJCQkkcmVzdWx0ID0gJiRkYi0+RXhlY3V0ZSgkcXVlcnkpOw0KCQkJCQkJCWlmKCEkcmVzdWx0KXsNCgkJCQkJCQkgIC8vZWNobyAnRXJyb3I6ICcubXlzcWxfZXJyb3IoKTsNCgkJCQkJCQkgICRwYXJhbXNbJ21lc3NhZ2UnXSA9IG15c3FsX2Vycm9yKCk7DQoJCQkJCQkJICAkdGhpcy0+RmlyZURlYnVnKCdlcnJvcicsbXlzcWxfZXJyb3IoKSk7Ly88PDw8LS0tLS0tRmlyZSBQSFAgbWVzc2FnZQ0KCQkJCQkJCX1lbHNlew0KCQkJCQkJCSAgICRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdwcmVmc3VwZGF0ZWQnKTsNCgkJCQkJCQl9DQoJCQkJCQkJJHRoaXMtPkZpcmVEZWJ1ZygnZXJyb3InLCRwYXJhbXNbJ21vZGUnXSk7Ly88PDw8LS0tLS0tRmlyZSBQSFAgbWVzc2FnZQ0KCQkJfQ0KCQkNCg0KDQoJaWYoJHBhcmFtc1snbW9kZSddPT0nYWRkJyl7DQoJCSRwYXJhbXMgPSBhcnJheSgndGFiX21lc3NhZ2UnPT4gJ0J0bkFEREVEJywgJ2FjdGl2ZV90YWInID0+ICdzY3JpcHRfdGVtcGxhdGUnKTsNCgl9ZWxzZXsNCgkJJHBhcmFtcyA9IGFycmF5KCd0YWJfbWVzc2FnZSc9PiAnQnRuRURJVEVEJywgJ2FjdGl2ZV90YWInID0+ICdzY3JpcHRfdGVtcGxhdGUnKTsNCgl9DQoNCg0KLy8kcGFyYW1zWydzcnQnXSA9ICRzcnQ7DQogICAgLy8gdG8gY2FsbCBhbm90aGVyIG1ldGhvZCBvZiB0aGUgbW9kdWxlLCB5b3UgaGF2ZSB0byBiZSBjYXJlZnVsIG5vdyB0aGF0DQogICAgLy8gbWV0aG9kcyBjYW4gYmUgc3BsaXQgaW50byBvdGhlciBmaWxlcy4gSGVyZSdzIHRoZSBwcmVmZXJlZCBhcHByb2FjaDoNCiR0aGlzLT5SZWRpcmVjdCgkaWQsICdkZWZhdWx0YWRtaW4nLCAnJywgJHBhcmFtcyk7DQo/Pg0K]]></data>
	</file>
	<file>
	  <filename>/CSS/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/CSS/farbtastic.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBGYXJidGFzdGljIENvbG9yIFBpY2tlciAxLjINCiAqIMKpIDIwMDggU3RldmVuIFdpdHRlbnMNCiAqDQogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQ0KICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yDQogKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KICoNCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQogKg0KICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0ENCiAqLw0KLmZhcmJ0YXN0aWMgew0KICBwb3NpdGlvbjogcmVsYXRpdmU7DQp9DQouZmFyYnRhc3RpYyAqIHsNCiAgcG9zaXRpb246IGFic29sdXRlOw0KICBjdXJzb3I6IGNyb3NzaGFpcjsNCn0NCi5mYXJidGFzdGljLCAuZmFyYnRhc3RpYyAud2hlZWwgew0KICB3aWR0aDogMTk1cHg7DQogIGhlaWdodDogMTk1cHg7DQp9DQouZmFyYnRhc3RpYyAuY29sb3IsIC5mYXJidGFzdGljIC5vdmVybGF5IHsNCiAgdG9wOiA0N3B4Ow0KICBsZWZ0OiA0N3B4Ow0KICB3aWR0aDogMTAxcHg7DQogIGhlaWdodDogMTAxcHg7DQp9DQouZmFyYnRhc3RpYyAud2hlZWwgew0KICBiYWNrZ3JvdW5kOiB1cmwoLi4vaW1hZ2VzL3doZWVsLnBuZykgbm8tcmVwZWF0Ow0KICB3aWR0aDogMTk1cHg7DQogIGhlaWdodDogMTk1cHg7DQp9DQouZmFyYnRhc3RpYyAub3ZlcmxheSB7DQogIGJhY2tncm91bmQ6IHVybCguLi9pbWFnZXMvbWFzay5wbmcpIG5vLXJlcGVhdDsNCn0NCi5mYXJidGFzdGljIC5tYXJrZXIgew0KICB3aWR0aDogMTdweDsNCiAgaGVpZ2h0OiAxN3B4Ow0KICBtYXJnaW46IC04cHggMCAwIC04cHg7DQogIG92ZXJmbG93OiBoaWRkZW47IA0KICBiYWNrZ3JvdW5kOiB1cmwoLi4vaW1hZ2VzL21hcmtlci5wbmcpIG5vLXJlcGVhdDsNCn0NCg0K]]></data>
	</file>
	<file>
	  <filename>/CSS/MasterCSS.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[QGNoYXJzZXQgInV0Zi04IjsNCi8qIENTUyBEb2N1bWVudCAqLw0KLkJhY2tMaW5re2N1cnNvcjpwb2ludGVyO2Zsb2F0OnJpZ2h0O30NCiBiLnJib3R0b20gew0KZGlzcGxheTpibG9jazsNCn0NCiBiLnJib3R0b20gKiB7DQpiYWNrZ3JvdW5kOiNBOEI3QzYgbm9uZSByZXBlYXQgc2Nyb2xsIDAgMDsNCmRpc3BsYXk6YmxvY2s7DQpoZWlnaHQ6MXB4Ow0Kb3ZlcmZsb3c6aGlkZGVuOw0KfQ0KIGIucjEgew0KYmFja2dyb3VuZDojMDAwMDAwIG5vbmUgcmVwZWF0IHNjcm9sbCAwIDA7DQptYXJnaW46MCA1cHg7DQp9DQogYi5yMiB7DQptYXJnaW46MCAzcHg7DQp9DQogYi5yMyB7DQptYXJnaW46MCAycHg7DQp9DQogYi5yNCB7DQpoZWlnaHQ6MnB4Ow0KbWFyZ2luOjAgMXB4Ow0KfQ0KLlNpbWNvbnsNCglwYWRkaW5nOiAxMHB4Ow0KCWJvcmRlci1yaWdodDogMnB4IHNvbGlkICMwMDA7DQoJYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjMDAwOw0KCWJvcmRlci10b3Atc3R5bGU6IG5vbmU7DQoJYm9yZGVyLWJvdHRvbS1zdHlsZTogbm9uZTsNCgliYWNrZ3JvdW5kLWNvbG9yOiNBOEI3QzY7DQp9DQouU2ltV3JhcHtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50OyB9DQouY29kZUhJR0hMSUdIVHtjb2xvcjojMzU0ZDU4OyBmb250LXNpemU6MTRweDsgZm9udC13ZWlnaHQ6NjAwOyBsaW5lLWhlaWdodDoxNXB4O30NCmRpdi5wYWdlY29udGFpbmVyIC5wYWdlaGVhZGVyIHtjb2xvcjojMzU0ZDU4OyBmb250LXNpemU6MjRweDsgZm9udC13ZWlnaHQ6NjAwOyBsaW5lLWhlaWdodDoxNXB4O30NCg0KZGl2LnBhZ2Vjb250YWluZXIgLnBhZ2VoZWFkZXIgc3Bhbi5oZWxwdGV4dHsNCglmb250LXNpemU6MTJweDsgDQoJZm9udC13ZWlnaHQ6bm9ybWFsOw0KCW1hcmdpbi10b3A6LTRweDsNCglwYWRkaW5nOjJweDsNCglwb3NpdGlvbjphYnNvbHV0ZTsNCglyaWdodDozNXB4Ow0KCXotaW5kZXg6MTA7DQp9DQpocnsNCglkaXNwbGF5OmJsb2NrOw0KCX0NCnRleHRhcmVhew0KCXdpZHRoOjI1MHB4Ow0KCWhlaWdodDo3NXB4Ow0KfQ0KLmV4dGVuZEhBTkRMRSAqIHsNCglkaXNwbGF5OmlubGluZTsNCgltYXJnaW46MWVtIDAgMC4yZW0gMjAlOw0KCWN1cnNvcjpwb2ludGVyOw0KfQ0KDQouTmV4dGVuZCB7DQoJbWFyZ2luOjFlbSAwIDAuMmVtIDIwJTsNCglwb3NpdGlvbjogcmVsYXRpdmU7DQp9DQouTmV4dGVuZCB7DQoJZGlzcGxheTpub25lOw0KfQ0KDQouVHJhbnNsYXRlQ29uIHsNCgliYWNrZ3JvdW5kLWNvbG9yOiNGRkZGRkY7DQoJYm9yZGVyOjJweCBzb2xpZCAjMDAwMDAwOw0KCXBvc2l0aW9uOmFic29sdXRlOw0KCXdpZHRoOjE5NXB4Ow0KCXotaW5kZXg6NzAwOw0KfQ0KLmNvbnRyeUNvZGVzew0KCXdpZHRoOjM1MHB4Ow0KCWhlaWdodDoxNTBweDsNCglvdmVyZmxvdzpzY3JvbGw7DQoJYm9yZGVyOiBtZWRpdW0gaW5zZXQgIzMzMzsNCgliYWNrZ3JvdW5kLWNvbG9yOiNDQ0M7DQoJcGFkZGluZzoxMHB4Ow0KCWxpbmUtaGVpZ2h0OjIwcHg7DQp9DQoNCg==]]></data>
	</file>
	<file>
	  <filename>/function.admin_ACToptionstab.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogUGF5UGFsQnV0dG9uTWFrZXIgLSBQYXlQYWwgQnV0dG9uIENyZWF0b3IgYW5kIE1hbmFnZXIgDQojIE1vZCBkZXNpZ25lZCBieSBqZXJlbXlCYXNzIChqZXJlbXlCYXNzQGNhYmxlb25lLm5ldCkNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIENNUyAtIENNUyBNYWRlIFNpbXBsZSBpcyAoYykgMjAwNSBieSBUZWQgS3VscCAod2lzaHlAY21zbWFkZXNpbXBsZS5vcmcpDQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnDQojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9QYXlQYWxCdXR0b25NYWtlci8NCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5DQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yDQojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQojDQojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBDQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQppZiggIWlzc2V0KCRnQ21zKSApIGV4aXQ7DQoNCglnbG9iYWwgJGdDbXM7DQoJJGNvbmZpZyA9JiAkZ0Ntcy0+R2V0Q29uZmlnKCk7IA0KCSR1cmxleHQ9Q01TX1NFQ1VSRV9QQVJBTV9OQU1FLic9Jy4kX1NFU1NJT05bQ01TX1VTRVJfS0VZXTsNCgkkaW1nSGVscEY9JzxpbWcgc3JjPSIuLi9hZG1pbi90aGVtZXMvTkNsZWFuR3JleS9pbWFnZXMvaWNvbnMvc3lzdGVtL2luZm8tZXh0ZXJuYWwuZ2lmIiBhbHQ9IicuJHVybGV4dC4nIiBjbGFzcz0ic3lzdGVtaWNvbiIgdGl0bGU9IiIgcmVsPSInOw0KCSRpbWdIZWxwQj0nIi8+JzsNCgkkY2xlYXIgPSBpc3NldCgkcGFyYW1zWydjbGVhciddKSA/ICRwYXJhbXNbJ2NsZWFyJ10gOiAiIjsNCg0KICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignbW9kX3ByZWZzX3RpdGxlJywgJHRoaXMtPkxhbmcoJ21vZF9wcmVmc190aXRsZScpKTsNCiAgICANCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2Zvcm1fc3RhcnQnLCAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0KCRpZCwgJ3NhdmVfQUNUcHRpb25zJywgJHJldHVybmlkLCAncG9zdCcsICdtdWx0aXBhcnQvZm9ybS1kYXRhJykpOw0KICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignZm9ybV9lbmQnLCAkdGhpcy0+Q3JlYXRlRm9ybUVuZCgpKTsNCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2Zvcm1fc3VibWl0JywgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0KCRpZCwgJ2Zvcm1fc3VibWl0JywgJHRoaXMtPkxhbmcoJ2Zvcm1fc3VibWl0JykpKTsNCgkNCgkNCgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3NtYXJ0eU9uX2xhYmVsJywgJHRoaXMtPkxhbmcoJ3NtYXJ0eU9uX2xhYmVsJykuJGltZ0hlbHBGLiJzbWFydHlPbiIuJGltZ0hlbHBCKTsNCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3NtYXJ0eU9uX2lucHV0JywgJHRoaXMtPkNyZWF0ZUlucHV0UmFkaW9Hcm91cCAoJGlkLCAnc21hcnR5T24nLCBhcnJheSgnTm8nPT4nMCcsJ1llcyc9PicxJyksICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdzbWFydHlPbicsJzAnKSwnJywnJm5ic3A7Jm5ic3A7Jm5ic3A7JykpOw0KCQ0KCSR0aGlzLT5zbWFydHktPmFzc2lnbignZGVidWdUJywgJHRoaXMtPkxhbmcoJ2RlYnVnVCcpKTsNCgkkZmlyZXBocG1vZHVsZT0kdGhpcy0+R2V0TW9kdWxlSW5zdGFuY2UoJ0ZpcmVQSFBEZWJ1ZycpOw0KCSAgaWYgKCRmaXJlcGhwbW9kdWxlKXsNCgkJJGRlYnVnSVRfbGFiZWw9JHRoaXMtPkxhbmcoJ2RlYnVnSVRfbGFiZWwnKTsNCgkJJGRpc2FibGU9Jyc7DQoJICB9ZWxzZXsNCgkJICAkZGVidWdJVF9sYWJlbD0gJHRoaXMtPkxhbmcoJ2RlYnVnSVRfbGFiZWwnKS4kdGhpcy0+TGFuZygnZGVidWdJVG5vdGVfbGFiZWwnKTsNCgkJICAkZGlzYWJsZT0nZGlzYWJsZWQ9ImRpc2FibGVkIic7DQoJICB9DQoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdkZWJ1Z0lUX2xhYmVsJywgJGRlYnVnSVRfbGFiZWwpOwkNCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2RlYnVnSVRfaW5wdXQnLCAkdGhpcy0+Q3JlYXRlSW5wdXRSYWRpb0dyb3VwICgkaWQsICdkZWJ1Z0lUJywgYXJyYXkoJ05vJz0+JzAnLCdZZXMnPT4nMScpLCAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnZGVidWdJVCcpLCcnLiRkaXNhYmxlLicnLCcmbmJzcDsmbmJzcDsmbmJzcDsnKSk7DQoNCgkkdGhpcy0+RmlyZURlYnVnKCdlcnJvcicsIkdldFByZWZlcmVuY2UgZGVidWdJVCIuJHRoaXMtPkdldFByZWZlcmVuY2UoJ2RlYnVnSVQnKSk7Ly88PDw8LS0tLS0tRmlyZSBQSFAgbWVzc2FnZQkNCgkNCgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2NsZWFyZWRfbGFiZWwnLCAkY2xlYXIpOw0KCSR0aGlzLT5zbWFydHktPmFzc2lnbignQ2xlYXJfaW5wdXQnLCAkdGhpcy0+Q3JlYXRlSW5wdXRSYWRpb0dyb3VwICgkaWQsICdjbGVhcmNhY2hlJywgYXJyYXkoJ05vJz0+JzAnLCdZZXMnPT4nMScpLCAnMCcsJycsJyZuYnNwOyZuYnNwOyZuYnNwOycpKTsNCgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ0NsZWFyX2xhYmVsJywgIkNsZWFuIHRoZSB0ZW1wPyA8c3BhbiBzdHlsZT1cImNvbG9yOiMwMDY2Q0M7IGZvbnQtd2VpZ2h0OjkwMDtcIj5Zb3VyIGNhY2hlIHBhdGggaXM6ICIuJGNvbmZpZ1sndXBsb2Fkc19wYXRoJ10uIi9saWIvU0QtdGVtcC88L3NwYW4+Iik7CQ0KDQoNCgkNCiAgICAvLyB5b3UnbGwgb2Z0ZW4gd2FudCB0byBkbyB0aGluZ3MgbGlrZSB0aGlzIHRvIHByb3ZpZGUgZmVlZGJhY2s6DQogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdtZXNzYWdlJywgKGlzc2V0KCRwYXJhbXNbJ21lc3NhZ2UnXSk/JHBhcmFtc1snbWVzc2FnZSddOicnKSk7CQ0KCQ0KICAgIGVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnYWRtaW5fb3B0aW9ucy50cGwnKTsNCg0KDQoJLy9lY2hvJzxmb3JtIGFjdGlvbj0iIiBtZXRob2Q9InBvc3QiPg0KLy88aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjbGVhcmNhY2hlIiB2YWx1ZT0iMSI+PGlucHV0IG5hbWU9IiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iQ2xlYXIgdGhlIGNhY2hlIiAvPg0KLy88L2Zvcm0+JzsNCg0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/images/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/images/CSS.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAACMAAAAjCAMAAAApB0NrAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAMxQTFRFAh1U////AAAAlpaWPDw8iZavmZmZmqW7Z3eYNUp2zMzM7vD0EyxfJDtrY2NjeIaku7u73eHozNLdq7TGMzMzRVmCb29v7u7uhYWF3d3dAwMDd3d3vMPRw8PDEhIS1dXVZmZmsbGxDg4ODw8P0tLSdHR0MDAwVmiNV1dXHx8fNjY2ISEhiIiIqqqq5OTkS0tLn5+fQkJCdXV14eHhXV1dRUVFkJCQERERVFRUUlJSREREVVVV8/PzJCQkQUFB9vb2h4eHIiIifn5+////k+830wAAAER0Uk5T/////////////////////////////////////////////////////////////////////////////////////////wBx0o8SAAABYElEQVR42uyTx3aEMAxFJcDGYHpnaqbXTHrv4f//KbIh2WaTk9V4oSOka0n2w9D8vuDI/B8zsQzDsMhY8yLTnnU+PpsZMx1SzNXNh4mInIzZC1yyEfJlryqx1KExNM/bKg4BQNgAtjlwAFgOgpu2B15KoRMOzXqReNAtO+4cwe3vEDHDO+nDD0MFPaQ9wqV6K7Rb5r3PVDbEmFBbqBpxibxWGxm289yfrhQjN4uEsaTtIGTFhfaYG6wbuIhy9YHG6CnqZ13KSwLpaM+Rmwlc7kNdZxmkOYuXPNU5xw1cpo8S7guYPA50eYzVqelC3FSNIiOsS6bpDN5e2oF0C0nRAap+Mgc/Rr9lmtvXrjWlK9Z5YTslrTQoSIs1tVaUSEy6B5/ul3oSI2hQPzVHB6VpMe27SrBsOzWxJp3QnD5EWsB6MZq3ug+V2qR1M7SMHeltWMNPS/8Iu+vD8V38BfMlwAD5ztPrjJkwRwAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/images/JS.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAACMAAAAjCAMAAAApB0NrAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAMBQTFRFFDZD////AAAA8vLy4OTmwMnNw8PDNDQ0kaGnoaGhRUVFrq6uU2x1sbzA0tLSIyMjLCwsFBQUOzs7Q15pgpSbJENQ7/LysrKyfX19eHh4oa+0M1FckJCQZWVlYnmCf39/6+vriYmJeXl50NfZ2travr6+coaO3t7ezMzMREREzs7Obm5uTExMJCQk7+/vGxsbBAQE/Pz8WVlZKioqqqqq5ubmq6urVlZWSEhIvLy8VVVVnZ2duLi4GRkZp6en////o9aB+gAAAEB0Uk5T////////////////////////////////////////////////////////////////////////////////////AMJ7sUQAAAF6SURBVHjajJTpdoIwFIQZRZYqKiDQolbcq9aqtfvG+79Vs5AQEUvnT8I930nOnTBXS6ul/ZepS2VVvhMFwthmTcqcPKfLMS3sV6xs2pSxuwakjJE7+d7QwkPEykbXJoypIESjUXLybbipVq8BmlQL74BzS3aBFdOCjk77jAFamqJyZqFVMiFb+yF6lxmHrb64kzGsr4Y8GTHf3U45zRnqj8I44khCid6Jz1cKk6AvL17owsO0qTJ2fhCRBXjnTCcpQPyuU6abQF+o/tw/FRn+wHpPMD0MhkVmJt4yo3zcbYsM3zYk1MfSLWcCB/C5S3h5K2dyxdiMKxgfh+OaMJ+v0pKwwPghaYv48+gZsLIaMmZq0RdpxcBPrZ1qc0/59ZD3znQY1OYkF9c38hRqBvfQsJcsJMdhOy0w1FSeqg+XhW3Nc6owAX0ckc48tCoTNPDlluZdMIEVYrZrljKsL65oN74wN6g/LN/eNro4W/jc2K+iyvnzx4z6FWAANMNfWXjad6UAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/images/marker.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAAK3RFWHRDcmVhdGlvbiBUaW1lAHZyIDE0IGp1bCAyMDA2IDEzOjMxOjIzICswMTAwHvJDZwAAAAd0SU1FB9YHDgsgJYiZ4bUAAAAJcEhZcwAALiIAAC4iAari3ZIAAAAEZ0FNQQAAsY8L/GEFAAAB5ElEQVR42q2Tz0sqURTH72Qq4mASSAoSIfSDdCEI8qJFLXSjLYSQNoGLINrI8/0ZD9q0KnDlKkIMebmP9xZRCEEiLQLBiMiNJDYq/Zg573vpCkM6CdGBD3Pn3OvXe77nDGPfENKwJBHx/CxYAtNAAVfgXJKk7khVCCyCP6ALVKAJXkEdbINxw5tgM4HHPphSFEUql8usXq8zWZZZKBRiPp+PH3sBx2Br4FbiBg+aplGxWKRgMPiMH1+YTKZDq9V64na7G+l0mprNJo7RG/g94IEoQSsUCuRyue6QToIJYAJWMA/Bo2QySZ1Ohws9gZBeZI570Gq1yO/395BKGJg+ZbFYznK5HAmf9vQiKW5iqVQim832Fyn5E+83Y7EYieAdY2Nig7dRqtVqrNfr3YiWGsVltVrtr2f0IrwEZrfbGeqWhQ9GMeFwOPprRS9SAWo4HGZOp/MH1l4DAS6+HolE+u9Xek9kcK+qKqVSKUL/s0hPDhFY83g8j5VKhcQg7nxs80/w0mg0KB6Pa2az+RTpDbDA3sd/lwvk8/l+Z7iS/FHEAor8H9rtNmWzWYpGo+T1eikQCFAmkyFxAy7AJ255aMHYcIID8d1oNBi8hGuwwkYFDq0CPlG3YsTb4B/4BRwjBb4S/wGzT16tu5THiAAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/images/mask.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[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]]></data>
	</file>
	<file>
	  <filename>/images/Min.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAACMAAAAjCAMAAAApB0NrAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAHVQTFRFUwUb////AAAAPDw8gUhYupuku7u7lpaWmGl20bzCJCQk9vb2urq6XhYqRERE0tLSmZmZISEhXV1d3d3dS0tL7u7uaiY5xqyzQkJCZmZmdHR0jFhn6N7hhYWFDw8PUlJSiIiI9O7wo3qFr4qVfn5+8/Pz////aavRqwAAACd0Uk5T//////////////////////////////////////////////////8Ag1aX2QAAAJZJREFUeNrs0ckWgyAMBdAgIqilzrXzpOX/P7EP3RLbDyCLsLnnhZOQ+10UTTTRuEomKDn7p2k/IVMWWqD0I0Pvzm3I7PY5oVSWoh+6ZsOkV+JNWSDhQmQIQSo8yx1hRmTYCeZUs+ZlEaRYs8wShij3Rkv2z2YkK/ynRcKbwb43zLLD+jY811VK9hayv/frSaq/bvoVYACrs5+trtdIMwAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/images/ppbmDonate.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[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]]></data>
	</file>
	<file>
	  <filename>/images/scriptType.psd</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[OEJQUwABAAAAAAAAAAQAAAAjAAAAIwAIAAMAAAAAAABerDhCSU0EJQAAAAAAEAAAAAAAAAAAAAAAAAAAAAA4QklNBCQAAAAAPbo8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA0LjIuMi1jMDYzIDUzLjM1MjYyNCwgMjAwOC8wNy8zMC0xODoxMjoxOCAgICAgICAgIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ1M0IFdpbmRvd3M8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMDktMDktMTJUMTQ6NTM6MTktMDc6MDA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAwOS0wOS0xMlQyMzoyMzoyMS0wNzowMDwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6TWV0YWRhdGFEYXRlPjIwMDktMDktMTJUMjM6MjM6MjEtMDc6MDA8L3htcDpNZXRhZGF0YURhdGU+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPgogICAgICAgICA8ZGM6Zm9ybWF0PmFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5waG90b3Nob3A8L2RjOmZvcm1hdD4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyI+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyI+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6MkIwMDE2MTBFNzlGREUxMTg2OTZGMzE2NjVCMUJEODM8L3htcE1NOkluc3RhbmNlSUQ+CiAgICAgICAgIDx4bXBNTTpEb2N1bWVudElEPnhtcC5kaWQ6MkEwMDE2MTBFNzlGREUxMTg2OTZGMzE2NjVCMUJEODM8L3htcE1NOkRvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+eG1wLmRpZDoyQTAwMTYxMEU3OUZERTExODY5NkYzMTY2NUIxQkQ4MzwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNyZWF0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDoyQTAwMTYxMEU3OUZERTExODY5NkYzMTY2NUIxQkQ4Mzwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAwOS0wOS0xMlQxNDo1NjowMi0wNzowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENTNCBXaW5kb3dzPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDoyQjAwMTYxMEU3OUZERTExODY5NkYzMTY2NUIxQkQ4Mzwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAwOS0wOS0xMlQyMzoyMzoyMS0wNzowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENTNCBXaW5kb3dzPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICAgICA8c3RFdnQ6Y2hhbmdlZD4vPC9zdEV2dDpjaGFuZ2VkPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgPC9yZGY6U2VxPgogICAgICAgICA8L3htcE1NOkhpc3Rvcnk+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyMDAwMC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+NzIwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8dGlmZjpOYXRpdmVEaWdlc3Q+MjU2LDI1NywyNTgsMjU5LDI2MiwyNzQsMjc3LDI4NCw1MzAsNTMxLDI4MiwyODMsMjk2LDMwMSwzMTgsMzE5LDUyOSw1MzIsMzA2LDI3MCwyNzEsMjcyLDMwNSwzMTUsMzM0MzI7QzE2RjUwRjFBNDdCMjJBNUM1RTMzQURDNkNBQjBDMTE8L3RpZmY6TmF0aXZlRGlnZXN0PgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+MzU8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+MzU8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6TmF0aXZlRGlnZXN0PjM2ODY0LDQwOTYwLDQwOTYxLDM3MTIxLDM3MTIyLDQwOTYyLDQwOTYzLDM3NTEwLDQwOTY0LDM2ODY3LDM2ODY4LDMzNDM0LDMzNDM3LDM0ODUwLDM0ODUyLDM0ODU1LDM0ODU2LDM3Mzc3LDM3Mzc4LDM3Mzc5LDM3MzgwLDM3MzgxLDM3MzgyLDM3MzgzLDM3Mzg0LDM3Mzg1LDM3Mzg2LDM3Mzk2LDQxNDgzLDQxNDg0LDQxNDg2LDQxNDg3LDQxNDg4LDQxNDkyLDQxNDkzLDQxNDk1LDQxNzI4LDQxNzI5LDQxNzMwLDQxOTg1LDQxOTg2LDQxOTg3LDQxOTg4LDQxOTg5LDQxOTkwLDQxOTkxLDQxOTkyLDQxOTkzLDQxOTk0LDQxOTk1LDQxOTk2LDQyMDE2LDAsMiw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwyMCwyMiwyMywyNCwyNSwyNiwyNywyOCwzMDtCNDFCRUMwMEREQTYzRkExODg0MzYwNjUwMzREREQzMTwvZXhpZjpOYXRpdmVEaWdlc3Q+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8+OEJJTQPtAAAAAAAQAEgAAAABAAEASAAAAAEAAThCSU0EJgAAAAAADgAAAAAAAAAAAAA/gAAAOEJJTQPuAAAAAAANDFRyYW5zcGFyZW5jeQA4QklNBBUAAAAAAB4AAAANAFQAcgBhAG4AcwBwAGEAcgBlAG4AYwB5AAA4QklNA+8AAAAAAA4AAP//AAAAAAAAAGQBADhCSU0ENQAAAAAAEQAAAAEAAP//AAAAAAAAAGQBADhCSU0EHQAAAAAABAAAAAA4QklNBA0AAAAAAAQAAAB4OEJJTQQZAAAAAAAEAAAAHjhCSU0D8wAAAAAACQAAAAAAAAAAAQA4QklNJxAAAAAAAAoAAQAAAAAAAAACOEJJTQP1AAAAAABIAC9mZgABAGxmZgAGAAAAAAABAC9mZgABAKGZmgAGAAAAAAABADIAAAABAFoAAAAGAAAAAAABADUAAAABAC0AAAAGAAAAAAABOEJJTQP4AAAAAABwAAD/////////////////////////////A+gAAAAA/////////////////////////////wPoAAAAAP////////////////////////////8D6AAAAAD/////////////////////////////A+gAADhCSU0EAAAAAAAAAgADOEJJTQQCAAAAAAAIAAAAAAAAAAA4QklNBDAAAAAAAAQBAQEBOEJJTQQtAAAAAAACAAA4QklNBAgAAAAAABAAAAABAAACQAAAAkAAAAAAOEJJTQQeAAAAAAAEAAAAADhCSU0EGgAAAAAC9gAAAAgAAAAQAAAAAQAAAAAAAG51bGwAAAADAAAACGJhc2VOYW1lVEVYVAAAAAUAVQBzAGUAcgAAAAAABmJvdW5kc09iamMAAAABAAAAAAAAUmN0MQAAAAQAAAAAVG9wIGxvbmcAAAAAAAAAAExlZnRsb25nAAAAAAAAAABCdG9tbG9uZwAAACMAAAAAUmdodGxvbmcAAAAjAAAABnNsaWNlc1ZsTHMAAAABT2JqYwAAAAEAAAAAAAVzbGljZQAAABIAAAAHc2xpY2VJRGxvbmcAAAAAAAAAB2dyb3VwSURsb25nAAAAAAAAAAZvcmlnaW5lbnVtAAAADEVTbGljZU9yaWdpbgAAAA1hdXRvR2VuZXJhdGVkAAAAAFR5cGVlbnVtAAAACkVTbGljZVR5cGUAAAAASW1nIAAAAAZib3VuZHNPYmpjAAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcAAAAjAAAAAFJnaHRsb25nAAAAIwAAAAN1cmxURVhUAAAAAQAAAAAAAG51bGxURVhUAAAAAQAAAAAAAE1zZ2VURVhUAAAAAQAAAAAABmFsdFRhZ1RFWFQAAAABAAAAAAAOY2VsbFRleHRJc0hUTUxib29sAQAAAAhjZWxsVGV4dFRFWFQAAAABAAAAAAAJaG9yekFsaWduZW51bQAAAA9FU2xpY2VIb3J6QWxpZ24AAAAHZGVmYXVsdAAAAAl2ZXJ0QWxpZ25lbnVtAAAAD0VTbGljZVZlcnRBbGlnbgAAAAdkZWZhdWx0AAAAC2Jn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OjA5OjEyIDIzOjIzOjIxAAAAAAOgAQADAAAAAQABAACgAgAEAAAAAQAAACOgAwAEAAAAAQAAACMAAAAAAAAABgEDAAMAAAABAAYAAAEaAAUAAAABAAABHgEbAAUAAAABAAABJgEoAAMAAAABAAIAAAIBAAQAAAABAAABLgICAAQAAAABAAAAAAAAAAAAAABIAAAAAQAAAEgAAAABOEJJTQ+gAAAAAAhMbW9wdAAAAAMAAAABAAAAAAAAAAcAAAACAQAAAAAAAAAAAAAAAAABAAAAAAAAAAABAAAAZAAAAAAAAAAAAAAAAAAAAAIAAAAA/////wAAAAAE/////wAAAAD/////AAAAAP////8AAAAA/////wAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAA8oAAAAQAAAAAQAAAAAADlRhcmdldFNldHRpbmdzAAAAEgAAAABDbHJUT2JqYwAAAAEAAAAAAApDb2xvclRhYmxlAAAAAgAAAABDbHJzVmxMcwAAAAAAAAAHaXNFeGFjdGJvb2wAAAAAAE10dENPYmpjAAAAAQAAAAAACk5hdGl2ZVF1YWQAAAADAAAAAEJsICBsb25nAAAA/wAAAABHcm4gbG9uZwAAAP8AAAAAUmQgIGxvbmcAAAD/AAAAAFRybnNib29sAQAAAAphdXRvUmVkdWNlYm9vbAAAAAARY29sb3JUYWJsZUNvbnRyb2xPYmpjAAAAAQAAAAAAEUNvbG9yVGFibGVDb250cm9sAAAAAgAAAAxsb2NrZWRDb2xvcnNWbExzAAAAAAAAAAxzaGlmdEVudHJpZXNWbExzAAAAAAAAAA9kaXRoZXJBbGdvcml0aG1lbnVtAAAAD0RpdGhlckFsZ29yaXRobQAAAABEZnNuAAAADWRpdGhlclBlcmNlbnRsb25nAAAAZAAAAApmaWxlRm9ybWF0ZW51bQAAAApGaWxlRm9ybWF0AAAABFBORzgAAAAKaW50ZXJsYWNlZGJvb2wAAAAADG5vTWF0dGVDb2xvcmJvb2wAAAAACW51bUNvbG9yc2xvbmcAAAEAAAAAEnJlZHVjdGlvbkFsZ29yaXRobWVudW0AAAASUmVkdWN0aW9uQWxnb3JpdGhtAAAAAFBlcmMAAAAVcm9sbG92ZXJNYXN0ZXJQYWxldHRlYm9vbAAAAAAbdHJhbnNwYXJlbmN5RGl0aGVyQWxnb3JpdGhtZW51bQAAAA9EaXRoZXJBbGdvcml0aG0AAAAATm9uZQAAABh0cmFuc3BhcmVuY3lEaXRoZXJBbW91bnRsb25nAAAAZAAAAA93ZWJTaGlmdFBlcmNlbnRsb25nAAAAAAAAAAt6b25lZERpdGhlck9iamMAAAABAAAAAAAJWm9uZWRJbmZvAAAABAAAAAljaGFubmVsSURsb25n/////wAAAA1lbXBoYXNpemVUZXh0Ym9vbAAAAAAQZW1waGFzaXplVmVjdG9yc2Jvb2wAAAAABWZsb29ybG9uZwAAAAAAAAAUem9uZWRIaXN0b2dyYW1XZWlnaHRPYmpjAAAAAQAAAAAACVpvbmVkSW5mbwAAAAQAAAAJY2hhbm5lbElEbG9uZ/////8AAAANZW1waGFzaXplVGV4dGJvb2wAAAAAEGVtcGhhc2l6ZVZlY3RvcnNib29sAAAAAAVmbG9vcmxvbmcAAAAAOEJJTQ+hAAAAAAAtbXNldAAAABAAAAABAAAAAAAEbnVsbAAAAAEAAAAHVmVyc2lvbmxvbmcAAAAAADhCSU0PogAAAAAACG1zNHcAAAADOEJJTQ+jAAAAAAD4bWFuaUlSRlIAAADsOEJJTUFuRHMAAADMAAAAEAAAAAEAAAAAAABudWxsAAAAAwAAAABBRlN0bG9uZwAAAAAAAAAARnJJblZsTHMAAAABT2JqYwAAAAEAAAAAAABudWxsAAAAAQAAAABGcklEbG9uZ2xZsuoAAAAARlN0c1ZsTHMAAAABT2JqYwAAAAEAAAAAAABudWxsAAAABAAAAABGc0lEbG9uZwAAAAAAAAAAQUZybWxvbmcAAAAAAAAAAEZzRnJWbExzAAAAAWxvbmdsWbLqAAAAAExDbnRsb25nAAAAAAAAOEJJTVJvbGwAAAAIAAAAAAAAAAA4QklND6QAAAAAABxtZnJpAAAAAgAAABAAAAABAAAAAAAAAAEAAAAAAAKSJAAAiWj//AAAAAAAAAAAAAAAIwAAACMAAwAA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CgkJCQkJCS9Xb3JkU3BhY2luZyBbIC44IDEuMCAxLjMzIF0KCQkJCQkJL0xldHRlclNwYWNpbmcgWyAwLjAgMC4wIDAuMCBdCgkJCQkJCS9HbHlwaFNwYWNpbmcgWyAxLjAgMS4wIDEuMCBdCgkJCQkJCS9BdXRvTGVhZGluZyAxLjIKCQkJCQkJL0xlYWRpbmdUeXBlIDAKCQkJCQkJL0hhbmdpbmcgZmFsc2UKCQkJCQkJL0J1cmFzYWdhcmkgZmFsc2UKCQkJCQkJL0tpbnNva3VPcmRlciAwCgkJCQkJCS9FdmVyeUxpbmVDb21wb3NlciBmYWxzZQoJCQkJCT4+CgkJCQk+PgoJCQkJL0FkanVzdG1lbnRzCgkJCQk8PAoJCQkJCS9BeGlzIFsgMS4wIDAuMCAxLjAgXQoJCQkJCS9YWSBbIDAuMCAwLjAgXQoJCQkJPj4KCQkJPj4KCQkJXQoJCQkvUnVuTGVuZ3RoQXJyYXkgWyAzIF0KCQkJL0lzSm9pbmFibGUgMQoJCT4+CgkJL1N0eWxlUnVuCgkJPDwKCQkJL0RlZmF1bHRSdW5EYXRhCgkJCTw8CgkJCQkvU3R5bGVTaGVldAoJCQkJPDwKCQkJCQkvU3R5bGVTaGVldERhdGEKCQkJCQk8PAoJCQkJCT4+CgkJCQk+PgoJCQk+PgoJCQkvUnVuQXJyYXkgWwoJCQk8PAoJCQkJL1N0eWxlU2hlZXQKCQkJCTw8CgkJCQkJL1N0eWxlU2hlZXREYXRhCgkJCQkJPDwKCQkJCQkJL0ZvbnQgMAoJCQkJCQkvRm9udFNpemUgNzIuMAoJCQkJCQkvRmF1eEJvbGQgZmFsc2UKCQkJCQkJL0ZhdXhJdGFsaWMgZmFsc2UKCQkJCQkJL0F1dG9MZWFkaW5nIHRydWUKCQkJCQkJL0xlYWRpbmcgLjAxCgkJCQkJCS9Ib3Jpem9udGFsU2NhbGUgMS4wCgkJCQkJCS9WZXJ0aWNhbFNjYWxlIDEuMAoJCQkJCQkvVHJhY2tpbmcgMAoJCQkJCQkvQXV0b0tlcm5pbmcgdHJ1ZQoJCQkJCQkvS2VybmluZyAwCgkJCQkJCS9CYXNlbGluZVNoaWZ0IDAuMAoJCQkJCQkvRm9udENhcHMgMAoJCQkJCQkvRm9udEJhc2VsaW5lIDAKCQkJCQkJL1VuZGVybGluZSBmYWxzZQoJCQkJCQkvU3RyaWtldGhyb3VnaCBmYWxzZQoJCQkJCQkvTGlnYXR1cmVzIHRydWUKCQkJCQkJL0RMaWdhdHVyZXMgZmFsc2UKCQkJCQkJL0Jhc2VsaW5lRGlyZWN0aW9uIDEKCQkJCQkJL1RzdW1lIDAuMAoJCQkJCQkvU3R5bGVSdW5BbGlnbm1lbnQgMgoJCQkJCQkvTGFuZ3VhZ2UgMAoJCQkJCQkvTm9CcmVhayBmYWxzZQoJCQkJCQkvRmlsbENvbG9yCgkJCQkJCTw8CgkJCQkJCQkvVHlwZSAxCgkJCQkJCQkvVmFsdWVzIFsgMS4wIC4wNzgzMSAuMjEyODUgLjI2Mjc1IF0KCQkJCQkJPj4KCQkJCQkJL1N0cm9rZUNvbG9yCgkJCQkJCTw8CgkJCQkJCQkvVHlwZSAxCgkJCQkJCQkvVmFsdWVzIFsgMS4wIDEuMCAxLjAgMS4wIF0KCQkJCQkJPj4KCQkJCQkJL0ZpbGxGbGFnIHRydWUKCQkJCQkJL1N0cm9rZUZsYWcgZmFsc2UKCQkJCQkJL0ZpbGxGaXJzdCBmYWxzZQoJCQkJCQkvWVVuZGVybGluZSAxCgkJCQkJCS9PdXRsaW5lV2lkdGggMS4wCgkJCQkJCS9DaGFyYWN0ZXJEaXJlY3Rpb24gMAoJCQkJCQkvSGluZGlOdW1iZXJzIGZhbHNlCgkJCQkJCS9LYXNoaWRhIDEKCQkJCQkJL0RpYWNyaXRpY1BvcyAyCgkJCQkJPj4KCQkJCT4+CgkJCT4+CgkJCV0KCQkJL1J1bkxlbmd0aEFycmF5IFsgMyBdCgkJCS9Jc0pvaW5hYmxlIDIKCQk+PgoJCS9HcmlkSW5mbwoJCTw8CgkJCS9HcmlkSXNPbiBmYWxzZQoJCQkvU2hvd0dyaWQgZmFsc2UKCQkJL0dyaWRTaXplIDE4LjAKCQkJL0dyaWRMZWFkaW5nIDIyLjAKCQkJL0dyaWRDb2xvcgoJCQk8PAoJCQkJL1R5cGUgMQoJCQkJL1ZhbHVlcyBbIDAuMCAwLjAgMC4wIDEuMCBdCgkJCT4+CgkJCS9HcmlkTGVhZGluZ0ZpbGxDb2xvcgoJCQk8PAoJCQkJL1R5cGUgMQoJCQkJL1ZhbHVlcyBbIDAuMCAwLjAgMC4wIDEuMCBdCgkJCT4+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cnVlCgkJCQkvSHlwaGVuYXRlZFdvcmRTaXplIDYKCQkJCS9QcmVIeXBoZW4gMgoJCQkJL1Bvc3RIeXBoZW4gMgoJCQkJL0NvbnNlY3V0aXZlSHlwaGVucyA4CgkJCQkvWm9uZSAzNi4wCgkJCQkvV29yZFNwYWNpbmcgWyAuOCAxLjAgMS4zMyBdCgkJCQkvTGV0dGVyU3BhY2luZyBbIDAuMCAwLjAgMC4wIF0KCQkJCS9HbHlwaFNwYWNpbmcgWyAxLjAgMS4wIDEuMCBdCgkJCQkvQXV0b0xlYWRpbmcgMS4yCgkJCQkvTGVhZGluZ1R5cGUgMAoJCQkJL0hhbmdpbmcgZmFsc2UKCQkJCS9CdXJhc2FnYXJpIGZhbHNlCgkJCQkvS2luc29rdU9yZGVyIDAKCQkJCS9FdmVyeUxpbmVDb21wb3NlciBmYWxzZQoJCQk+PgoJCT4+CgkJXQoJCS9TdHlsZVNoZWV0U2V0IFsKCQk8PAoJCQkvTmFtZSAo/v8ATgBvAHIAbQBhAGwAIABSAEcAQikKCQkJL1N0eWxlU2hlZXREYXRhCgkJCTw8CgkJCQkvRm9udCAxCgkJCQkvRm9udFNpemUgMTIuMAoJCQkJL0ZhdXhCb2xkIGZhbHNlCgkJCQkvRmF1eEl0YWxpYyBmYWxzZQoJCQkJL0F1dG9MZWFkaW5nIHRydWUKCQkJCS9MZWFkaW5nIDAuMAoJCQkJL0hvcml6b250YWxTY2FsZSAxLjAKCQkJCS9WZXJ0aWNhbFNjYWxlIDEuMAoJCQkJL1RyYWNraW5nIDAKCQkJCS9BdXRvS2VybmluZyB0cnVlCgkJCQkvS2VybmluZyAwCgkJCQkvQmFzZWxpbmVTaGlmdCAwLjAKCQkJCS9Gb250Q2FwcyAwCgkJCQkvRm9udEJhc2VsaW5lIDAKCQkJCS9VbmRlcmxpbmUgZmFsc2UKCQkJCS9TdHJpa2V0aHJvdWdoIGZhbHNlCgkJCQkvTGlnYXR1cmVzIHRydWUKCQkJCS9ETGlnYXR1cmVzIGZhbHNlCgkJCQkvQmFzZWxpbmVEaXJlY3Rpb24gMgoJCQkJL1RzdW1lIDAuMAoJCQkJL1N0eWxlUnVuQWxpZ25tZW50IDIKCQkJCS9MYW5ndWFnZSAwCgkJCQkvTm9CcmVhayBmYWxzZQoJCQkJ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CQkJL0RlZmF1bHRTdHlsZVNoZWV0IDAKCQkJL1Byb3BlcnRpZXMKCQkJPDwKCQkJCS9KdXN0aWZpY2F0aW9uIDAKCQkJCS9GaXJzdExpbmVJbmRlbnQgMC4wCgkJCQkvU3RhcnRJbmRlbnQgMC4wCgkJCQkvRW5kSW5kZW50IDAuMAoJCQkJL1NwYWNlQmVmb3JlIDAuMAoJCQkJL1NwYWNlQWZ0ZXIgMC4wCgkJCQkvQXV0b0h5cGhlbmF0ZSB0cnVlCgkJCQkvSHlwaGVuYXRlZFdvcmRTaXplIDYKCQkJCS9QcmVIeXBoZW4gMgoJCQkJL1Bvc3RIeXBoZW4gMgoJCQkJL0NvbnNlY3V0aXZlSHlwaGVucyA4CgkJCQkvWm9uZSAzNi4wCgkJCQkvV29yZFNwYWNpbmcgWyAuOCAxLjAgMS4zMyBdCgkJCQkvTGV0dGVyU3BhY2luZyBbIDAuMCAwLjAgMC4wIF0KCQkJCS9HbHlwaFNwYWNpbmcgWyAxLjAgMS4wIDEuMCBdCgkJCQkvQXV0b0xlYWRpbmcgMS4yCgkJCQkvTGVhZGluZ1R5cGUgMAoJCQkJL0hhbmdpbmcgZmFsc2UKCQkJCS9CdXJhc2FnYXJpIGZhbHNlCgkJCQkvS2luc29rdU9yZGVyIDAKCQkJCS9FdmVyeUxpbmVDb21wb3NlciBmYWxzZQoJCQk+PgoJCT4+CgkJXQoJCS9TdHlsZVNoZWV0U2V0IFsKCQk8PAoJCQkvTmFtZSAo/v8ATgBvAHIAbQBhAGwAIABSAEcAQikKCQkJL1N0eWxlU2hlZXREYXRhCgkJCTw8CgkJCQkvRm9udCAxCgkJCQkvRm9udFNpemUgMTIuMAoJCQkJL0ZhdXhCb2xkIGZhbHNlCgkJCQkvRmF1eEl0YWxpYyBmYWxzZQoJCQkJL0F1dG9MZWFkaW5nIHRydWUKCQkJCS9MZWFkaW5nIDAuMAoJCQkJL0hvcml6b250YWxTY2FsZSAxLjAKCQkJCS9WZXJ0aWNhbFNjYWxlIDEuMAoJCQkJL1RyYWNraW5nIDAKCQkJCS9BdXRvS2VybmluZyB0cnVlCgkJCQkvS2VybmluZyAwCgkJCQkvQmFzZWxpbmVTaGlmdCAwLjAKCQkJCS9Gb250Q2FwcyAwCgkJCQkvRm9udEJhc2VsaW5lIDAK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ZW50IDAuMAoJCQkJCQkvU3BhY2VCZWZvcmUgMC4wCgkJCQkJCS9TcGFjZUFmdGVyIDAuMAoJCQkJCQkvQXV0b0h5cGhlbmF0ZSB0cnVlCgkJCQkJCS9IeXBoZW5hdGVkV29yZFNpemUgNgoJCQkJCQkvUHJlSHlwaGVuIDIKCQkJCQkJL1Bvc3RIeXBoZW4gMgoJCQkJCQkvQ29uc2VjdXRpdmVIeXBoZW5zIDgKCQkJCQkJL1pvbmUgMzYuMAoJCQkJCQkvV29yZFNwYWNpbmcgWyAuOCAxLjAgMS4zMyBdCgkJCQkJCS9MZXR0ZXJTcGFjaW5nIFsgMC4wIDAuMCAwLjAgXQoJCQkJCQkvR2x5cGhTcGFjaW5nIFsgMS4wIDEuMCAxLjAgXQoJCQkJCQkvQXV0b0xlYWRpbmcgMS4yCgkJCQkJCS9MZWFkaW5nVHlwZSAwCgkJCQkJCS9IYW5naW5nIGZhbHNlCgkJCQkJCS9CdXJhc2FnYXJpIGZhbHNlCgkJCQkJCS9LaW5zb2t1T3JkZXIgMAoJCQkJCQkvRXZlcnlMaW5lQ29tcG9zZXIgZmFsc2UKCQkJCQk+PgoJCQkJPj4KCQkJCS9BZGp1c3RtZW50cwoJCQkJPDwKCQkJCQkvQXhpcyBbIDEuMCAwLjAgMS4wIF0KCQkJCQkvWFkgWyAwLjAgMC4wIF0KCQkJCT4+CgkJCT4+CgkJCV0KCQkJL1J1bkxlbmd0aEFycmF5IFsgNCBdCgkJCS9Jc0pvaW5hYmxlIDEKCQk+PgoJCS9TdHlsZVJ1bgoJCTw8CgkJCS9EZWZhdWx0UnVuRGF0YQoJCQk8PAoJCQkJL1N0eWxlU2hlZXQKCQkJCTw8CgkJCQkJL1N0eWxlU2hlZXREYXRhCgkJCQkJPDwKCQkJCQk+PgoJCQkJPj4KCQkJPj4KCQkJL1J1bkFycmF5IFsKCQkJPDwKCQkJCS9TdHlsZVNoZWV0CgkJCQk8PAoJCQkJCS9TdHlsZVNoZWV0RGF0YQoJCQkJCTw8CgkJCQkJCS9Gb250IDAKCQkJCQkJL0ZvbnRTaXplIDcyLjAKCQkJCQkJL0ZhdXhCb2xkIGZhbHNlCgkJCQkJCS9GYXV4SXRhbGljIGZhbHNlCgkJCQkJCS9BdXRvTGVhZGluZyB0cnVlCgkJCQkJCS9MZWFkaW5nIC4wMQoJCQkJCQkvSG9yaXpvbnRhbFNjYWxlIDEuMAoJCQkJCQkvVmVydGljYWxTY2FsZSAxLjAKCQkJCQkJL1RyYWNraW5nIDAKCQkJCQkJL0F1dG9LZXJuaW5nIHRydWUKCQkJCQkJL0tlcm5pbmcgMAoJCQkJCQkvQmFzZWxpbmVTaGlmdCAwLjAKCQkJCQkJL0ZvbnRDYXBzIDAKCQkJCQkJL0ZvbnRCYXNlbGluZSAwCgkJCQkJCS9VbmRlcmxpbmUgZmFsc2UKCQkJCQkJL1N0cmlrZXRocm91Z2ggZmFsc2UKCQkJCQkJL0xpZ2F0dXJlcyB0cnVlCgkJCQkJCS9ETGlnYXR1cmVzIGZhbHNlCgkJCQkJCS9CYXNlbGluZURpcmVjdGlvbiAxCgkJCQkJCS9Uc3VtZSAwLjAKCQkJCQkJL1N0eWxlUnVuQWxpZ25tZW50IDIKCQkJCQkJL0xhbmd1YWdlIDAKCQkJCQkJL05vQnJlYWsgZmFsc2UKCQkJCQkJL0ZpbGxDb2xvcgoJCQkJCQk8PAoJCQkJCQkJL1R5cGUgMQoJCQkJCQkJL1ZhbHVlcyBbIDEuMCAuMDA2MzggLjExMTUxIC4zMjU0OSBdCgkJCQkJCT4+CgkJCQkJCS9TdHJva2VDb2xvcgoJCQkJCQk8PAoJCQkJCQkJL1R5cGUgMQoJCQkJCQkJL1ZhbHVlcyBbIDEuMCAxLjAgMS4wIDEuMCBdCgkJCQkJCT4+CgkJCQkJCS9GaWxsRmxhZyB0cnVlCgkJCQkJCS9TdHJva2VGbGFnIGZhbHNlCgkJCQkJCS9GaWxsRmlyc3QgZmFsc2UKCQkJCQkJL1lVbmRlcmxpbmUgMQoJCQkJCQkvT3V0bGluZVdpZHRoIDEuMAoJCQkJCQkvQ2hhcmFjdGVyRGlyZWN0aW9uIDAKCQkJCQkJL0hpbmRpTnVtYmVycyBmYWxzZQoJCQkJCQkvS2FzaGlkYSAxCgkJCQkJCS9EaWFjcml0aWNQb3MgMgoJCQkJCT4+CgkJCQk+PgoJCQk+PgoJCQldCgkJCS9SdW5MZW5ndGhBcnJheSBbIDQgXQoJCQkvSXNKb2luYWJsZSAyCgkJPj4KCQkvR3JpZEluZm8KCQk8PAoJCQkvR3JpZElzT24gZmFsc2UKCQkJL1Nob3dHcmlkIGZhbHNl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CS9EZWZhdWx0U3R5bGVTaGVldCAwCgkJCS9Qcm9wZXJ0aWVzCgkJCTw8CgkJCQkvSnVzdGlmaWNhdGlvbiAwCgkJCQkvRmlyc3RMaW5lSW5kZW50IDAuMAoJCQkJL1N0YXJ0SW5kZW50IDAuMAoJCQkJL0VuZEluZGVudCAwLjAKCQkJCS9TcGFjZUJlZm9yZSAwLjAKCQkJCS9TcGFjZUFmdGVyIDAuMAoJCQkJL0F1dG9IeXBoZW5hdGUgdHJ1ZQoJCQkJL0h5cGhlbmF0ZWRXb3JkU2l6ZSA2CgkJCQkvUHJlSHlwaGVuIDIKCQkJCS9Qb3N0SHlwaGVuIDIKCQkJCS9Db25zZWN1dGl2ZUh5cGhlbnMgOAoJCQkJL1pvbmUgMzYuMAoJCQkJL1dvcmRTcGFjaW5nIFsgLjggMS4wIDEuMzMgXQoJCQkJL0xldHRlclNwYWNpbmcgWyAwLjAgMC4wIDAuMCBdCgkJCQkvR2x5cGhTcGFjaW5nIFsgMS4wIDEuMCAxLjAgXQoJCQkJL0F1dG9MZWFkaW5nIDEuMgoJCQkJL0xlYWRpbmdUeXBlIDAKCQkJCS9IYW5naW5nIGZhbHNlCgkJCQkvQnVyYXNhZ2FyaSBmYWxzZQoJCQkJL0tpbnNva3VPcmRlciAwCgkJCQkvRXZlcnlMaW5lQ29tcG9zZXIgZmFsc2UKCQkJPj4KCQk+PgoJCV0KCQkvU3R5bGVTaGVldFNldCBbCgkJPDwKCQkJL05hbWUgKP7/AE4AbwByAG0AYQBsACAAUgBHAEIpCgkJCS9TdHlsZVNoZWV0RGF0YQoJCQk8PAoJCQkJL0ZvbnQgMQoJCQkJL0ZvbnRTaXplIDEyLjAKCQkJCS9GYXV4Qm9sZCBmYWxzZQoJCQkJL0ZhdXhJdGFsaWMgZmFsc2UKCQkJCS9BdXRvTGVhZGluZyB0cnVlCgkJCQkvTGVhZGluZyAwLjAKCQkJCS9Ib3Jpem9udGFsU2NhbGUgMS4wCgkJCQkvVmVydGljYWxTY2FsZSAxLjAKCQkJCS9UcmFja2luZyAwCgkJCQkvQXV0b0tlcm5pbmcgdHJ1ZQoJCQkJL0tlcm5pbmcgMAoJCQkJL0Jhc2VsaW5lU2hpZnQgMC4wCgkJCQkvRm9udENhcHMgMAoJCQkJL0ZvbnRCYXNlbGluZSAwCgkJCQkvVW5kZXJsaW5lIGZhbHNlCgkJCQkvU3RyaWtldGhyb3VnaCBmYWxzZQoJCQkJL0xpZ2F0dXJlcyB0cnVlCgkJCQkvRExpZ2F0dXJlcyBmYWxzZQoJCQkJL0Jhc2VsaW5lRGlyZWN0aW9uIDIKCQkJCS9Uc3VtZSAwLjAKCQkJCS9TdHlsZVJ1bkFsaWdubWVudCAyCgkJCQkvTGFuZ3VhZ2UgMAoJCQkJL05vQnJlYWsgZmFsc2UKCQkJCS9GaWxsQ29sb3IKCQkJCTw8CgkJCQkJL1R5cGUgMQoJCQkJCS9WYWx1ZXMgWyAxLjAgMC4wIDAuMCAwLjAgXQoJCQkJPj4KCQkJCS9TdHJva2VDb2xvcgoJCQkJPDwKCQkJCQkvVHlwZSAxCgkJCQkJL1ZhbHVlcyBbIDEuMCAwLjAgMC4wIDAuMCBdCgkJCQk+PgoJCQkJL0ZpbGxGbGFnIHRydWUKCQkJCS9TdHJva2VGbGFnIGZhbHNlCgkJCQkvRmlsbEZpcnN0IHRydWUKCQkJCS9ZVW5kZXJsaW5lIDEKCQkJCS9PdXRsaW5lV2lkdGggMS4wCgkJCQkvQ2hhcmFjdGVyRGlyZWN0aW9uIDAKCQkJCS9IaW5kaU51bWJlcnMgZmFsc2UKCQkJCS9LYXNoaWRhIDEKCQkJCS9EaWFjcml0aWNQb3MgMgoJCQk+PgoJCT4+CgkJXQoJCS9Gb250U2V0IFsKCQk8PAoJCQkvTmFtZSAo/v8AUgBvAGMAawB3AGUAbABsAC0ARQB4AHQAcgBhAEIAbwBsAGQpCgkJCS9TY3JpcHQgMAoJCQkvRm9udFR5cGUgMQoJCQkvU3ludGhldGljIDAKCQk+PgoJCTw8CgkJCS9OYW1lICj+/wBNAHkAcgBpAGEAZABQAHIAbwAtAFIAZQBnAHUAbABhAHIpCgkJCS9TY3JpcHQgMAoJCQkvRm9udFR5cGUgMAoJCQkvU3ludGhldGljIDAKCQk+PgoJCTw8CgkJCS9OYW1lICj+/wBBAGQAbwBiAGUASQBuAHYAaQBzAEYAbwBuAHQpCgkJCS9TY3JpcHQgMAoJCQkvRm9udFR5cGUgMAoJCQkvU3ludGhldGljIDAKCQk+PgoJCV0KCQkvU3VwZXJzY3JpcHRTaXplIC41ODMKCQkvU3VwZXJzY3JpcHRQb3NpdGlvbiAuMzMzCgkJL1N1YnNjcmlwdFNpemUgLjU4MwoJCS9TdWJzY3JpcHRQb3NpdGlvbiAuMzMzCgkJL1NtYWxsQ2FwU2l6ZSAuNwoJPj4KCS9Eb2N1bWVudFJlc291cmNlcwoJPDwKCQkvS2luc29rdVNldCBbCgkJPDwKCQkJL05hbWUgKP7/AFAAaABvAHQAbwBzAGgAbwBwAEsAaQBuAHMAbwBrAHUASABhAHIAZCkKCQkJL05vU3RhcnQgKP7/MAEwAv8M/w4w+/8a/xv/H/8BMPwgFSAZIB3/CTAV/z3/XTAJMAswDTAPMBEw/TD+MJ0wnjAFMEEwQzBFMEcwSTBjMIMwhTCHMI4woTCjMKUwpzCpMMMw4zDlMOcw7jD1MPYwmzCcAD8AIQBcKQBdAH0ALAAuADoAOyEDIQkAov8FIDApCgkJCS9Ob0VuZCAo/v8gGCAc/wgwFP87/1swCDAKMAwwDjAQAFwoAFsAe//l/wQAo/8gAKcwEv8DKQoJCQkvS2VlcCAo/v8gFSAlKQoJCQkvSGFuZ2luZyAo/v8wATACAC4ALCkKCQk+PgoJCTw8CgkJCS9OYW1lICj+/wBQAGgAbwB0AG8AcwBoAG8AcABLAGkAbgBzAG8AawB1AFMAbwBmAHQpCgkJCS9Ob1N0YXJ0ICj+/zABMAL/DP8OMPv/Gv8b/x//ASAZIB3/CTAV/z3/XTAJMAswDTAPMBEw/TD+MJ0wnjAFKQoJCQkvTm9FbmQgKP7/IBggHP8IMBT/O/9bMAgwCjAMMA4wECkKCQkJL0tlZXAgKP7/IBUgJSkKCQkJL0hhbmdpbmcgKP7/MAEwAgAuACwpCgkJPj4KCQldCgkJL01vamlLdW1pU2V0IFsKCQk8PAoJCQkvSW50ZXJuYWxOYW1lICj+/wBQAGgAbwB0AG8AcwBoAG8AcAA2AE0AbwBqAGkASwB1AG0AaQBTAGUAdAAxKQoJCT4+CgkJPDwKCQkJL0ludGVybmFsTmFtZSAo/v8AUABoAG8AdABvAHMAaABvAHAANgBNAG8AagBpAEsAdQBtAGkAUwBlAHQAMikKCQk+PgoJCTw8CgkJCS9JbnRlcm5hbE5hbWUgKP7/AFAAaABvAHQAbwBzAGgAbwBwADYATQBvAGoAaQBLAHUAbQBpAFMAZQB0ADMpCgkJPj4KCQk8PAoJCQkvSW50ZXJuYWxOYW1lICj+/wBQAGgAbwB0AG8AcwBoAG8AcAA2AE0AbwBqAGkASwB1AG0AaQBTAGUAdAA0KQoJCT4+CgkJXQoJCS9UaGVOb3JtYWxTdHlsZVNoZWV0IDAKCQkvVGhlTm9ybWFsUGFyYWdyYXBoU2hlZXQgMAoJCS9QYXJhZ3JhcGhTaGVldFNldCBbCgkJPDwKCQkJL05hbWUgKP7/AE4AbwByAG0AYQBsACAAUgBHAEIpCgkJCS9EZWZhdWx0U3R5bGVTaGVldCAwCgkJCS9Qcm9wZXJ0aWVzCgkJCTw8CgkJCQkvSnVzdGlmaWNhdGlvbiAwCgkJCQkvRmlyc3RMaW5lSW5kZW50IDAuMAoJCQkJL1N0YXJ0SW5kZW50IDAuMAoJCQkJL0VuZEluZGVudCAwLjAKCQkJCS9TcGFjZUJlZm9yZSAwLjAKCQkJCS9TcGFjZUFmdGVyIDAuMAoJCQkJL0F1dG9IeXBoZW5hdGUgdHJ1ZQoJCQkJL0h5cGhlbmF0ZWRXb3JkU2l6ZSA2CgkJCQkvUHJlSHlwaGVuIDIKCQkJCS9Qb3N0SHlwaGVuIDIKCQkJCS9Db25zZWN1dGl2ZUh5cGhlbnMgOAoJCQkJL1pvbmUgMzYuMAoJCQkJL1dvcmRTcGFjaW5nIFsgLjggMS4wIDEuMzMgXQoJCQkJL0xldHRlclNwYWNpbmcgWyAwLjAgMC4wIDAuMCBdCgkJCQkvR2x5cGhTcGFjaW5nIFsgMS4wIDEuMCAxLjAgXQoJCQkJL0F1dG9MZWFkaW5nIDEuMgoJCQkJL0xlYWRpbmdUeXBlIDAKCQkJCS9IYW5naW5nIGZhbHNlCgkJCQkvQnVyYXNhZ2FyaSBmYWxzZQoJCQkJL0tpbnNva3VPcmRlciAwCgkJCQkvRXZlcnlMaW5lQ29tcG9zZXIgZmFsc2UKCQkJPj4KCQk+PgoJCV0KCQkvU3R5bGVTaGVldFNldCBbCgkJPDwKCQkJL05hbWUgKP7/AE4AbwByAG0AYQBsACAAUgBHAEIpCgkJCS9TdHlsZVNoZWV0RGF0YQoJCQk8PAoJCQkJL0ZvbnQgMQoJCQkJL0ZvbnRTaXplIDEyLjAKCQkJCS9GYXV4Qm9sZCBmYWxzZQoJCQkJL0ZhdXhJdGFsaWMgZmFsc2UKCQkJCS9BdXRvTGVhZGluZyB0cnVlCgkJCQkvTGVhZGluZyAwLjAKCQkJCS9Ib3Jpem9udGFsU2NhbGUgMS4wCgkJCQkvVmVydGljYWxTY2FsZSAxLjAKCQkJCS9UcmFja2luZyAwCgkJCQkvQXV0b0tlcm5pbmcgdHJ1ZQoJCQkJL0tlcm5pbmcgMAoJCQkJL0Jhc2VsaW5lU2hpZnQgMC4wCgkJCQkvRm9udENhcHMgMAoJCQkJL0ZvbnRCYXNlbGluZSAwCgkJCQkvVW5kZXJsaW5lIGZhbHNlCgkJCQkvU3RyaWtldGhyb3VnaCBmYWxzZQoJCQkJL0xpZ2F0dXJlcyB0cnVlCgkJCQkvRExpZ2F0dXJlcyBmYWxzZQoJCQkJL0Jhc2VsaW5lRGlyZWN0aW9uIDIKCQkJCS9Uc3VtZSAwLjAKCQkJCS9TdHlsZVJ1bkFsaWdubWVudCAyCgkJCQkvTGFuZ3VhZ2UgMAoJCQkJL05vQnJlYWsgZmFsc2UKCQkJCS9GaWxsQ29sb3IKCQkJCTw8CgkJCQkJL1R5cGUgMQoJCQkJCS9WYWx1ZXMgWyAxLjAgMC4wIDAuMCAwLjAgXQoJCQkJPj4KCQkJCS9TdHJva2VDb2xvcgoJCQkJPDwKCQkJCQkvVHlwZSAxCgkJCQkJL1ZhbHVlcyBbIDEuMCAwLjAgMC4wIDAuMCBdCgkJCQk+PgoJCQkJL0ZpbGxGbGFnIHRydWUKCQkJCS9TdHJva2VGbGFnIGZhbHNlCgkJCQkvRmlsbEZpcnN0IHRydWUKCQkJCS9ZVW5kZXJsaW5lIDEKCQkJCS9PdXRsaW5lV2lkdGggMS4wCgkJCQkvQ2hhcmFjdGVyRGlyZWN0aW9uIDAKCQkJCS9IaW5kaU51bWJlcnMgZmFsc2UKCQkJCS9LYXNoaWRhIDEKCQkJCS9EaWFjcml0aWNQb3MgMgoJCQk+PgoJCT4+CgkJXQoJCS9Gb250U2V0IFsKCQk8PAoJCQkvTmFtZSAo/v8AUgBvAGMAawB3AGUAbABsAC0ARQB4AHQAcgBhAEIAbwBsAGQpCgkJCS9TY3JpcHQgMAoJCQkvRm9udFR5cGUgMQoJCQkvU3ludGhldGljIDAKCQk+PgoJCTw8CgkJCS9OYW1lICj+/wBNAHkAcgBpAGEAZABQAHIAbwAtAFIAZQBnAHUAbABhAHIpCgkJCS9TY3JpcHQgMAoJCQkvRm9udFR5cGUgMAoJCQkvU3ludGhldGljIDAKCQk+PgoJCTw8CgkJCS9OYW1lICj+/wBBAGQAbwBiAGUASQBuAHYAaQBzAEYAbwBuAHQpCgkJCS9TY3JpcHQgMAoJCQkvRm9udFR5cGUgMAoJCQkvU3ludGhldGljIDAKCQk+PgoJCV0KCQkvU3VwZXJzY3JpcHRTaXplIC41ODMKCQkvU3VwZXJzY3JpcHRQb3NpdGlvbiAuMzMzCgkJL1N1YnNjcmlwdFNpemUgLjU4MwoJCS9TdWJzY3JpcHRQb3NpdGlvbiAuMzMzCgkJL1NtYWxsQ2FwU2l6ZSAuNwoJPj4KPj4AAQAAABAAAAABAAAAAAAEd2FycAAAAAUAAAAJd2FycFN0eWxlZW51bQAAAAl3YXJwU3R5bGUAAAAId2FycE5vbmUAAAAJd2FycFZhbHVlZG91YgAAAAAAAAAAAAAAD3dhcnBQZXJzcGVjdGl2ZWRvdWIAAAAAAAAAAAAAABR3YXJwUGVyc3BlY3RpdmVPdGhlcmRvdWIAAAAAAAAAAAAAAAp3YXJwUm90YXRlZW51bQAAAABPcm50AAAAAEhyem4AAAAAAAAAAAAAAAAAAAAAADhCSU1sdW5pAAAADAAAAAMAQwBTAFMAADhCSU1sbnNyAAAABHJlbmQ4QklNbHlpZAAAAAQAAAADOEJJTWNsYmwAAAAEAQAAADhCSU1pbmZ4AAAABAAAAAA4QklNa25rbwAAAAQAAAAAOEJJTWxzcGYAAAAEAAAAADhCSU1sY2xyAAAACAAAAAAAAAAAOEJJTXNobWQAAABIAAAAAThCSU1jdXN0AAAAAAAAADQAAAAQAAAAAQAAAAAACG1ldGFkYXRhAAAAAQAAAAlsYXllclRpbWVkb3ViQdKrBi+5cC0AOEJJTWZ4cnAAAAAQP4eFalQG2wBAM2LszAW0IAAAABgAAAAUAAAAIAAAACAABP//AAAAYgAAAAAAIgABAAAAIgACAAAAIjhCSU1ub3Jt/wAoAAAAKqwAAAAAAAAAKAAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8BTQAAOEJJTWxmeDIAAAN8AAAAAAAAABAAAAABAAAAAAAAbnVsbAAAAAQAAAAAU2NsIFVudEYjUHJjQFkAAAAAAAAAAAAObWFzdGVyRlhTd2l0Y2hib29sAQAAAABEclNoT2JqYwAAAAEAAAAAAABEclNoAAAADQAAAABlbmFiYm9vbAEAAAAATWQgIGVudW0AAAAAQmxuTQAAAABNbHRwAAAAAENsciBPYmpjAAAAAQAAAAAAAFJHQkMAAAADAAAAAFJkICBkb3ViAAAAAAAAAAAAAAAAR3JuIGRvdWIAAAAAAAAAAAAAAABCbCAgZG91YgAAAAAAAAAAAAAAAE9wY3RVbnRGI1ByY0BZAAAAAAAAAAAAAHVnbGdib29sAQAAAABsYWdsVW50RiNBbmdAXgAAAAAAAAAAAABEc3RuVW50RiNQeGwAAAAAAAAAAAAAAABDa210VW50RiNQeGxAWQAAAAAAAAAAAABibHVyVW50RiNQeGxAAAAAAAAAAAAAAABOb3NlVW50RiNQcmMAAAAAAAAAAAAAAABBbnRBYm9vbAAAAAAAVHJuU09iamMAAAABAAAAAAAAU2hwQwAAAAIAAAAATm0gIFRFWFQAAAAHAEwAaQBuAGUAYQByAAAAAAAAQ3J2IFZsTHMAAAACT2JqYwAAAAEAAAAAAABDclB0AAAAAgAAAABIcnpuZG91YgAAAAAAAAAAAAAAAFZydGNkb3ViAAAAAAAAAABPYmpjAAAAAQAAAAAAAENyUHQAAAACAAAAAEhyem5kb3ViQG/gAAAAAAAAAAAAVnJ0Y2RvdWJAb+AAAAAAAAAAAA1sYXllckNvbmNlYWxzYm9vbAEAAAAARnJGWE9iamMAAAABAAAAAAAARnJGWAAAAAcAAAAAZW5hYmJvb2wBAAAAAFN0eWxlbnVtAAAAAEZTdGwAAAAAT3V0RgAAAABQbnRUZW51bQAAAABGckZsAAAAAFNDbHIAAAAATWQgIGVudW0AAAAAQmxuTQAAAABOcm1sAAAAAE9wY3RVbnRGI1ByY0BZAAAAAAAAAAAAAFN6ICBVbnRGI1B4bD/wAAAAAAAAAAAAAENsciBPYmpjAAAAAQAAAAAAAFJHQkMAAAADAAAAAFJkICBkb3ViQG/gAAAAAAAAAAAAR3JuIGRvdWJAb+AAAAAAAAAAAABCbCAgZG91YkBv4AAAAAAAADhCSU1sckZYAAABjAAAAAc4QklNY21uUwAAAAcAAAAAAQAAOEJJTWRzZHcAAAAzAAAAAgACAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAOEJJTW11bCABAf8AAAAAAAAAAAAAOEJJTWlzZHcAAAAzAAAAAgAFAAAAAAAAAHgAAAAFAAAAAAAAAAAAAAAAOEJJTW11bCAAAb8AAAAAAAAAAAAAOEJJTW9nbHcAAAAqAAAAAgAFAAAAAAAAAAD/////vr0AADhCSU1zY3JuAL8AAP////++vQAAOEJJTWlnbHcAAAArAAAAAgAFAAAAAAAAAAD/////vr0AADhCSU1zY3JuAL8BAAD/////vr0AADhCSU1iZXZsAAAATgAAAAIAeAAAAAUAAAAFAAA4QklNc2NybjhCSU1tdWwgAAD///////8AAAAAAAAAAAAAAAACv78AAQAAAP///////wAAAAAAAAAAAAAAADhCSU1zb2ZpAAAAIgAAAAI4QklNbm9ybQAA//8AAAAAAAD/AAAA//8AAAAAAAAAADhCSU1UeVNoAAAkVAABP8P1XL4rj5kAAAAAAAAAAAAAAAAAAAAAP8P1XL4rj5lANCaN6bwOvkBAFHXVNG2aADIAAAAQAAAAAQAAAAAAAFR4THIAAAAGAAAAAFR4dCBURVhUAAAAAgBNAAAAAAAMdGV4dEdyaWRkaW5nZW51bQAAAAx0ZXh0R3JpZGRpbmcAAAAATm9uZQAAAABPcm50ZW51bQAAAABPcm50AAAAAEhyem4AAAAAQW50QWVudW0AAAAAQW5udAAAAA5hbnRpQWxpYXNTaGFycAAAAAlUZXh0SW5kZXhsb25nAAAAAgAAAApFbmdpbmVEYXRhdGR0YQAAIowKCjw8CgkvRW5naW5lRGljdAoJPDwKCQkvRWRpdG9yCgkJPDwKCQkJL1RleHQgKP7/AE0ADSkKCQk+PgoJCS9QYXJhZ3JhcGhSdW4KCQk8PAoJCQkvRGVmYXVsdFJ1bkRhdGEKCQkJPDwKCQkJCS9QYXJhZ3JhcGhTaGVldAoJCQkJPDwKCQkJCQkvRGVmYXVsdFN0eWxlU2hlZXQgMAoJCQkJCS9Qcm9wZXJ0aWVzCgkJCQkJPDwKCQkJCQk+PgoJCQkJPj4KCQkJCS9BZGp1c3RtZW50cwoJCQkJPDwKCQkJCQkvQXhpcyBbIDEuMCAwLjAgMS4wIF0KCQkJCQkvWFkgWyAwLjAgMC4wIF0KCQkJCT4+CgkJCT4+CgkJCS9SdW5BcnJheSBbCgkJCTw8CgkJCQkvUGFyYWdyYXBoU2hlZXQKCQkJCTw8CgkJCQkJL0RlZmF1bHRTdHlsZVNoZWV0IDAKCQkJCQkvUHJvcGVydGllcwoJCQkJCTw8CgkJCQkJCS9KdXN0aWZpY2F0aW9uIDAKCQkJCQkJL0ZpcnN0TGluZUluZGVudCAwLjAKCQkJCQkJL1N0YXJ0SW5kZW50IDAuMAoJCQkJCQkvRW5kSW5kZW50IDAuMAoJCQkJCQkvU3BhY2VCZWZvcmUgMC4wCgkJCQkJCS9TcGFjZUFmdGVyIDAuMAoJCQkJCQkvQXV0b0h5cGhlbmF0ZSB0cnVlCgkJCQkJCS9IeXBoZW5hdGVkV29yZFNpemUgNgoJCQkJCQkvUHJlSHlwaGVuIDIKCQkJCQkJL1Bvc3RIeXBoZW4gMgoJCQkJCQkvQ29uc2VjdXRpdmVIeXBoZW5zIDgKCQkJCQkJL1pvbmUgMzYuMAoJCQkJCQkvV29yZFNwYWNpbmcgWyAuOCAxLjAgMS4zMyBdCgkJCQkJCS9MZXR0ZXJTcGFjaW5nIFsgMC4wIDAuMCAwLjAgXQoJCQkJCQkvR2x5cGhTcGFjaW5nIFsgMS4wIDEuMCAxLjAgXQoJCQkJCQkvQXV0b0xlYWRpbmcgMS4yCgkJCQkJCS9MZWFkaW5nVHlwZSAwCgkJCQkJCS9IYW5naW5nIGZhbHNlCgkJCQkJCS9CdXJhc2FnYXJpIGZhbHNlCgkJCQkJCS9LaW5zb2t1T3JkZXIgMAoJCQkJCQkvRXZlcnlMaW5lQ29tcG9zZXIgZmFsc2UKCQkJCQk+PgoJCQkJPj4KCQkJCS9BZGp1c3RtZW50cwoJCQkJPDwKCQkJCQkvQXhpcyBbIDEuMCAwLjAgMS4wIF0KCQkJCQkvWFkgWyAwLjAgMC4wIF0KCQkJCT4+CgkJCT4+CgkJCV0KCQkJL1J1bkxlbmd0aEFycmF5IFsgMiBdCgkJCS9Jc0pvaW5hYmxlIDEKCQk+PgoJCS9TdHlsZVJ1bgoJCTw8CgkJCS9EZWZhdWx0UnVuRGF0YQoJCQk8PAoJCQkJL1N0eWxlU2hlZXQKCQkJCTw8CgkJCQkJL1N0eWxlU2hlZXREYXRhCgkJCQkJPDwKCQkJCQk+PgoJCQkJPj4KCQkJPj4KCQkJL1J1bkFycmF5IFsKCQkJPDwKCQkJCS9TdHlsZVNoZWV0CgkJCQk8PAoJCQkJCS9TdHlsZVNoZWV0RGF0YQoJCQkJCTw8CgkJCQkJCS9Gb250IDAKCQkJCQkJL0ZvbnRTaXplIDcyLjAKCQkJCQkJL0ZhdXhCb2xkIGZhbHNlCgkJCQkJCS9GYXV4SXRhbGljIGZhbHNlCgkJCQkJCS9BdXRvTGVhZGluZyB0cnVlCgkJCQkJCS9MZWFkaW5nIC4wMQoJCQkJCQkvSG9yaXpvbnRhbFNjYWxlIDEuMAoJCQkJCQkvVmVydGljYWxTY2FsZSAxLjAKCQkJCQkJL1RyYWNraW5nIDAKCQkJCQkJL0F1dG9LZXJuaW5nIHRydWUKCQkJCQkJL0tlcm5pbmcgMAoJCQkJCQkvQmFzZWxpbmVTaGlmdCAwLjAKCQkJCQkJL0ZvbnRDYXBzIDAKCQkJCQkJL0ZvbnRCYXNlbGluZSAwCgkJCQkJCS9VbmRlcmxpbmUgZmFsc2UKCQkJCQkJL1N0cmlrZXRocm91Z2ggZmFsc2UKCQkJCQkJL0xpZ2F0dXJlcyB0cnVlCgkJCQkJCS9ETGlnYXR1cmVzIGZhbHNlCgkJCQkJCS9CYXNlbGluZURpcmVjdGlvbiAxCgkJCQkJCS9Uc3VtZSAwLjAKCQkJCQkJL1N0eWxlUnVuQWxpZ25tZW50IDIKCQkJCQkJL0xhbmd1YWdlIDAKCQkJCQkJL05vQnJlYWsgZmFsc2UKCQkJCQkJL0ZpbGxDb2xvcgoJCQkJCQk8PAoJCQkJCQkJL1R5cGUgMQoJCQkJCQkJL1ZhbHVlcyBbIDEuMCAuMzI1NDcgLjAyMDQyIC4xMDY1OCBdCgkJCQkJCT4+CgkJCQkJCS9TdHJva2VDb2xvcgoJCQkJCQk8PAoJCQkJCQkJL1R5cGUgMQoJCQkJCQkJL1ZhbHVlcyBbIDEuMCAxLjAgMS4wIDEuMCBdCgkJCQkJCT4+CgkJCQkJCS9GaWxsRmxhZyB0cnVlCgkJCQkJCS9TdHJva2VGbGFnIGZhbHNlCgkJCQkJCS9GaWxsRmlyc3QgZmFsc2UKCQkJCQkJL1lVbmRlcmxpbmUgMQoJCQkJCQkvT3V0bGluZVdpZHRoIDEuMAoJCQkJCQkvQ2hhcmFjdGVyRGlyZWN0aW9uIDAKCQkJCQkJL0hpbmRpTnVtYmVycyBmYWxzZQoJCQkJCQkvS2FzaGlkYSAxCgkJCQkJCS9EaWFjcml0aWNQb3MgMgoJCQkJCT4+CgkJCQk+PgoJCQk+PgoJCQldCgkJCS9SdW5MZW5ndGhBcnJheSBbIDIgXQoJCQkvSXNKb2luYWJsZSAyCgkJPj4KCQkvR3JpZEluZm8KCQk8PAoJCQkvR3JpZElzT24gZmFsc2UKCQkJL1Nob3dHcmlkIGZhbHNlCgkJCS9HcmlkU2l6ZSAxOC4wCgkJCS9HcmlkTGVhZGluZyAyMi4wCgkJCS9HcmlkQ29sb3IKCQkJPDwKCQkJCS9UeXBlIDEKCQkJCS9WYWx1ZXMgWyAwLjAgMC4wIDAuMCAxLjAgXQoJCQk+PgoJCQkvR3JpZExlYWRpbmdGaWxsQ29sb3IKCQkJPDwKCQkJCS9UeXBlIDEKCQkJCS9WYWx1ZXMgWyAwLjAgMC4wIDAuMCAxLjAgXQoJCQk+PgoJCQkvQWxpZ25MaW5lSGVpZ2h0VG9HcmlkRmxhZ3MgZmFsc2UKCQk+PgoJCS9BbnRpQWxpYXMgNAoJCS9Vc2VGcmFjdGlvbmFsR2x5cGhXaWR0aHMgdHJ1ZQoJCS9SZW5kZXJlZAoJCTw8CgkJCS9WZXJzaW9uIDEKCQkJL1NoYXBlcwoJCQk8PAoJCQkJL1dyaXRpbmdEaXJlY3Rpb24gMAoJCQkJL0NoaWxkcmVuIFsKCQkJCTw8CgkJCQkJL1NoYXBlVHlwZSAwCgkJCQkJL1Byb2Nlc3Npb24gMAoJCQkJCS9MaW5lcwoJCQkJCTw8CgkJCQkJCS9Xcml0aW5nRGlyZWN0aW9uIDAKCQkJCQkJL0NoaWxkcmVuIFsgXQoJCQkJCT4+CgkJCQkJL0Nvb2tpZQoJCQkJCTw8CgkJCQkJCS9QaG90b3Nob3AKCQkJCQkJPDwKCQkJCQkJCS9TaGFwZVR5cGUgMAoJCQkJCQkJL1BvaW50QmFzZSBbIDAuMCAwLjAgXQoJCQkJCQkJL0Jhc2UKCQkJCQkJCTw8CgkJCQkJCQkJL1NoYXBlVHlwZSAwCgkJCQkJCQkJL1RyYW5zZm9ybVBvaW50MCBbIDEuMCAwLjAgXQoJCQkJCQkJCS9UcmFuc2Zvcm1Qb2ludDEgWyAwLjAgMS4wIF0KCQkJCQkJCQkvVHJh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ZmFsc2UKCQkJPj4KCQk+PgoJCV0KCQkvU3R5bGVTaGVldFNldCBbCgkJPDwKCQkJL05hbWUgKP7/AE4AbwByAG0AYQBsACAAUgBHAEIpCgkJCS9TdHlsZVNoZWV0RGF0YQoJCQk8PAoJCQkJL0ZvbnQgMQoJCQkJL0ZvbnRTaXplIDEyLjAKCQkJCS9GYXV4Qm9sZCBmYWxzZQoJCQkJL0ZhdXhJdGFsaWMgZmFsc2UKCQkJCS9BdXRvTGVhZGluZyB0cnVlCgkJCQkvTGVhZGluZyAwLjAKCQkJCS9Ib3Jpem9udGFsU2NhbGUgMS4wCgkJCQkvVmVydGljYWxTY2FsZSAxLjAKCQkJCS9UcmFja2luZyAwCgkJCQkvQXV0b0tlcm5pbmcgdHJ1ZQoJCQkJL0tlcm5pbmcgMAoJCQkJL0Jhc2VsaW5lU2hpZnQgMC4wCgkJCQkvRm9udENhcHMgMAoJCQkJL0ZvbnRCYXNlbGluZSAwCgkJCQkvVW5kZXJsaW5lIGZhbHNlCgkJCQkvU3RyaWtldGhyb3VnaCBmYWxzZQoJCQkJL0xpZ2F0dXJlcyB0cnVlCgkJCQkvRExpZ2F0dXJlcyBmYWxzZQoJCQkJL0Jhc2VsaW5lRGlyZWN0aW9uIDIKCQkJCS9Uc3VtZSAwLjAKCQkJCS9TdHlsZVJ1bkFsaWdubWVudCAyCgkJCQkvTGFuZ3VhZ2UgMAoJCQkJL05vQnJlYWsgZmFsc2UKCQkJCS9GaWxsQ29sb3IKCQkJCTw8CgkJCQkJL1R5cGUgMQoJCQkJCS9WYWx1ZXMgWyAxLjAgMC4wIDAuMCAwLjAgXQoJCQkJPj4KCQkJCS9TdHJva2VDb2xvcgoJCQkJPDwKCQkJCQkvVHlwZSAxCgkJCQkJL1ZhbHVlcyBbIDEuMCAwLjAgMC4wIDAuMCBdCgkJCQk+PgoJCQkJL0ZpbGxGbGFnIHRydWUKCQkJCS9TdHJva2VGbGFnIGZhbHNlCgkJCQkvRmlsbEZpcnN0IHRydWUKCQkJCS9ZVW5kZXJsaW5lIDEKCQkJCS9PdXRsaW5lV2lkdGggMS4wCgkJCQkvQ2hhcmFjdGVyRGlyZWN0aW9uIDAKCQkJCS9IaW5kaU51bWJlcnMgZmFsc2UKCQkJCS9LYXNoaWRhIDEKCQkJCS9EaWFjcml0aWNQb3Mg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IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAuMjUgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gXSA+PiA8PCAvSW5kZXggMiAvRWxlbWVudHMgWyA8PCAvUCBbIDIgMSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDIgMiBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMiAzIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMiA0IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMiA1IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyAyIDcgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDIgOCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDIgOSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDIgMTAgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAyIDExIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAyIDEyIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMiAxMyBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDIgMTQgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAyIDE1IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMiAxNiBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDIgMTcgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIC41IC41IC41IF0gPj4gPj4gPj4gXSA+PiA8PCAvSW5kZXggMyAvRWxlbWVudHMgWyA8PCAvUCBbIDMgMSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDMgMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDMgNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgMyA3IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyAzIDggXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAzIDkgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAzIDEwIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMyAxMiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDMgMTMgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAzIDE0IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMyAxNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjEyNSAuMjUgLjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgMyAxNiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjEyNSAuMjUgLjUgXSAvUCA0ID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDQgL0VsZW1lbnRzIFsgPDwgL1AgWyA0IDEgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyA0IDUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDQgNyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgNCAxNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjEyNSAuMjUgLjI1IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDQgMTYgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIC4xMjUgLjI1IC4yNSBdIC9QIDQgPj4gPj4gPj4gXSA+PiA8PCAvSW5kZXggNSAvRWxlbWVudHMgWyA8PCAvUCBbIDUgMSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNSAyIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAuMjUgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDMgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDUgNCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNSA1IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNSA2IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAuMjUgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDcgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIC4yNSAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDUgOCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNSA5IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDEwIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDExIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDEyIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDEzIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDE0IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDE1IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDE2IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDE3IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAuMjUgLjI1IC4yNSBdID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDYgL0VsZW1lbnRzIFsgPDwgL1AgWyA2IDEgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyA2IDMgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdID4+ID4+ID4+IDw8IC9QIFsgNiA0IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSA+PiA+PiA+PiA8PCAvUCBbIDYgNSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC43NSAuNzUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNiA3IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA2IDggXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdID4+ID4+ID4+IDw8IC9QIFsgNiA5IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSA+PiA+PiA+PiA8PCAvUCBbIDYgMTAgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdID4+ID4+ID4+IDw8IC9QIFsgNiAxMSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gPj4gPj4gPj4gPDwgL1AgWyA2IDEyIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSA+PiA+PiA+PiA8PCAvUCBbIDYgMTMgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdID4+ID4+ID4+IDw8IC9QIFsgNiAxNCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gPj4gPj4gPj4gPDwgL1AgWyA2IDE1IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgNiAxNiBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDYgMTcgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIC41IC41IC41IF0gPj4gPj4gPj4gXSA+PiA8PCAvSW5kZXggNyAvRWxlbWVudHMgWyA8PCAvUCBbIDcgMSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDcgMyBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDcgNCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDcgNSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNyA3IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA3IDggXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA3IDkgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA3IDEwIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgNyAxMiBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDcgMTMgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA3IDE0IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgNyAxNSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDcgMTYgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA3IDE3IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAuNSAuNSAuNSBdID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDggL0VsZW1lbnRzIFsgPDwgL1AgWyA4IDEgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyA4IDMgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyA4IDUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDggNyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgOCA4IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgOCA5IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgOCAxMCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDggMTIgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyA4IDEzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgOCAxNCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDggMTUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgOCAxNiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDQgPj4gPj4gPj4gXSA+PiA8PCAvSW5kZXggOSAvRWxlbWVudHMgWyA8PCAvUCBbIDkgMSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDkgMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDkgNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgOSA3IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA5IDggXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyA5IDkgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyA5IDEwIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgOSAxMiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDkgMTMgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyA5IDE0IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgOSAxNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyA5IDE2IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgNCA+PiA+PiA+PiBdID4+IDw8IC9JbmRleCAxMCAvRWxlbWVudHMgWyA8PCAvUCBbIDEwIDEgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAxMCAzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTAgNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgMTAgNyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgMTAgOCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEwIDkgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMCAxMCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEwIDEyIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTAgMTMgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMCAxNCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEwIDE1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDEwIDE2IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgNCA+PiA+PiA+PiBdID4+IDw8IC9JbmRleCAxMSAvRWxlbWVudHMgWyA8PCAvUCBbIDExIDUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDExIDcgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDExIDE1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyAxMSAxNiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCA0ID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDEyIC9FbGVtZW50cyBbIDw8IC9QIFsgMTIgMSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDEyIDMgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMiA1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyAxMiA3IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyAxMiA4IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTIgOSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEyIDEwIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTIgMTIgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMiAxMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEyIDE0IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTIgMTUgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIC4xMjUgLjI1IC41IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDEyIDE2IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAuMTI1IC4yNSAuNSBdIC9QIDQgPj4gPj4gPj4gXSA+PiA8PCAvSW5kZXggMTMgL0VsZW1lbnRzIFsgPDwgL1AgWyAxMyAxIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMTMgMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEzIDUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDEzIDcgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDEzIDggXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMyA5IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTMgMTAgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMyAxMiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEzIDEzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTMgMTQgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMyAxNSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyAxMyAxNiBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDQgPj4gPj4gPj4gXSA+PiA8PCAvSW5kZXggMTQgL0VsZW1lbnRzIFsgPDwgL1AgWyAxNCAxIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMTQgMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDE0IDUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDE0IDcgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDE0IDggXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxNCA5IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTQgMTAgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxNCAxMiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDE0IDEzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTQgMTQgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxNCAxNSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgLjEyNSAuMjUgLjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgMTQgMTYgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIC4xMjUgLjI1IC41IF0gL1AgNCA+PiA+PiA+PiBdID4+IDw8IC9JbmRleCAxNSAvRWxlbWVudHMgWyA8PCAvUCBbIDE1IDEgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAxNSAzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAuMTI1IC4yNSAuMjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgMTUgNCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjEyNSAuMjUgLjI1IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDE1IDUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDE1IDcgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDE1IDggXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgMTUgOSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyAxNSAxMCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAuNSBdID4+ID4+ID4+IDw8IC9QIFsgMTUgMTIgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIC4xMjUgLjI1IC41IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDE1IDE0IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAuMTI1IC4yNSAuNSBdIC9QIDQgPj4gPj4gPj4gXSA+PiA8PCAvSW5kZXggMTYgL0VsZW1lbnRzIFsgPDwgL1AgWyAxNiAxIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMTYgMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjEyNSAuMjUgLjI1IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDE2IDQgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIC4xMjUgLjI1IC4yNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyAxNiA1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyAxNiA3IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyAxNiA4IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAg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IFsgMiAyIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAyIDMgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAyIDQgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAyIDUgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDIgNyBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgMiA4IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMiA5IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMiAxMCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDIgMTEgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDIgMTIgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAyIDEzIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMiAxNCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDIgMTUgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAyIDE2IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMiAxNyBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gPj4gPj4gPj4gXSA+PiA8PCAvSW5kZXggMyAvRWxlbWVudHMgWyA8PCAvUCBbIDMgMSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDMgMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDMgNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgMyA3IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyAzIDggXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAzIDkgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAzIDEwIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMyAxMiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDMgMTMgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAzIDE0IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMyAxNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjEyNSAuMjUgLjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgMyAxNiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjEyNSAuMjUgLjUgXSAvUCA0ID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDQgL0VsZW1lbnRzIFsgPDwgL1AgWyA0IDEgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyA0IDUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDQgNyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgNCAxNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjEyNSAuMjUgLjI1IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDQgMTYgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIC4xMjUgLjI1IC4yNSBdIC9QIDQgPj4gPj4gPj4gXSA+PiA8PCAvSW5kZXggNSAvRWxlbWVudHMgWyA8PCAvUCBbIDUgMSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNSAyIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAuMjUgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDMgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDUgNCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNSA1IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNSA2IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAuMjUgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDcgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIC4yNSAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDUgOCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNSA5IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDEwIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDExIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDEyIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDEzIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDE0IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDE1IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDE2IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gXSA+PiA8PCAvSW5kZXggNiAvRWxlbWVudHMgWyA8PCAvUCBbIDYgMSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDYgMyBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gPj4gPj4gPj4gPDwgL1AgWyA2IDQgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdID4+ID4+ID4+IDw8IC9QIFsgNiA1IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjc1IC43NSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA2IDcgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDYgOCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gPj4gPj4gPj4gPDwgL1AgWyA2IDkgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdID4+ID4+ID4+IDw8IC9QIFsgNiAxMCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gPj4gPj4gPj4gPDwgL1AgWyA2IDExIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSA+PiA+PiA+PiA8PCAvUCBbIDYgMTIgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdID4+ID4+ID4+IDw8IC9QIFsgNiAxMyBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gPj4gPj4gPj4gPDwgL1AgWyA2IDE0IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSA+PiA+PiA+PiA8PCAvUCBbIDYgMTUgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyA2IDE2IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgNiAxNyBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gPj4gPj4gPj4gXSA+PiA8PCAvSW5kZXggNyAvRWxlbWVudHMgWyA8PCAvUCBbIDcgMSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDcgMyBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDcgNCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDcgNSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNyA3IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA3IDggXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA3IDkgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA3IDEwIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgNyAxMiBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDcgMTMgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA3IDE0IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgNyAxNSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDcgMTYgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA3IDE3IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSA+PiA+PiA+PiBdID4+IDw8IC9JbmRleCA4IC9FbGVtZW50cyBbIDw8IC9QIFsgOCAxIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgOCAzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgOCA1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA4IDcgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDggOCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDggOSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDggMTAgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyA4IDEyIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgOCAxMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDggMTQgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyA4IDE1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDggMTYgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCA0ID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDkgL0VsZW1lbnRzIFsgPDwgL1AgWyA5IDEgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyA5IDMgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyA5IDUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDkgNyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgOSA4IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgOSA5IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgOSAxMCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDkgMTIgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyA5IDEzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgOSAxNCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDkgMTUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgOSAxNiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDQgPj4gPj4gPj4gXSA+PiA8PCAvSW5kZXggMTAgL0VsZW1lbnRzIFsgPDwgL1AgWyAxMCAxIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMTAgMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEwIDUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDEwIDcgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDEwIDggXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMCA5IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTAgMTAgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMCAxMiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEwIDEzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTAgMTQgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMCAxNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyAxMCAxNiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDQgPj4gPj4gPj4gXSA+PiA8PCAvSW5kZXggMTEgL0VsZW1lbnRzIFsgPDwgL1AgWyAxMSA1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyAxMSA3IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyAxMSAxNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgMTEgMTYgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgNCA+PiA+PiA+PiBdID4+IDw8IC9JbmRleCAxMiAvRWxlbWVudHMgWyA8PCAvUCBbIDEyIDEgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAxMiAzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTIgNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgMTIgNyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgMTIgOCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEyIDkgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMiAxMCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEyIDEyIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTIgMTMgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMiAxNCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEyIDE1IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAuMTI1IC4yNSAuNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyAxMiAxNiBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgLjEyNSAuMjUgLjUgXSAvUCA0ID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDEzIC9FbGVtZW50cyBbIDw8IC9QIFsgMTMgMSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDEzIDMgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMyA1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyAxMyA3IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyAxMyA4IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTMgOSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEzIDEwIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTMgMTIgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMyAxMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEzIDE0IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTMgMTUgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgMTMgMTYgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCA0ID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDE0IC9FbGVtZW50cyBbIDw8IC9QIFsgMTQgMSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDE0IDMgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxNCA1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyAxNCA3IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyAxNCA4IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTQgOSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDE0IDEwIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTQgMTIgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxNCAxMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDE0IDE0IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTQgMTUgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIC4xMjUgLjI1IC41IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDE0IDE2IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAuMTI1IC4yNSAuNSBdIC9QIDQgPj4gPj4gPj4gXSA+PiA8PCAvSW5kZXggMTUgL0VsZW1lbnRzIFsgPDwgL1AgWyAxNSAxIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMTUgMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjEyNSAuMjUgLjI1IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDE1IDQgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIC4xMjUgLjI1IC4yNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyAxNSA1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyAxNSA3IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyAxNSA4IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDE1IDkgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgMTUgMTAgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgLjUgXSA+PiA+PiA+PiA8PCAvUCBbIDE1IDEyIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAuMTI1IC4yNSAuNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyAxNSAxNCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjEyNSAuMjUgLjUgXSAvUCA0ID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDE2IC9FbGVtZW50cyBbIDw8IC9QIFsgMTYgMSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDE2IDMgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIC4xMjUgLjI1IC4yNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyAxNiA0IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAuMTI1IC4yNSAuMjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgMTYgNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgMTYgNyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgMTYgOCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyAxNiA5IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDE2IDEwIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIC41IF0gPj4gPj4gPj4gPDwgL1AgWyAxNiAxMiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjEyNSAuMjUgLjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgMTYgMTQgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIC4xMjUgLjI1IC41IF0gL1AgNCA+PiA+PiA+PiBdID4+IF0gPj4gPj4gL1ByZWRlZmluZWRUYWcgNCA+PiA+PiA+PiA8PCAvUmVzb3VyY2UgPDwgL05hbWUgKP7/AFAAaABvAHQAbwBzAGgAbwBwADYATQBvAGoAaQBLAHUAbQBpAFMAZQB0ADIpIC9NZW1iZXJzIDw8IC9Db2RlVG9DbGFzcyAwIC9BdXRvVHN1bWUgPDwgL1RzdW1lTWFwcGluZ3MgWyA8PCAvQmVmb3JlIC0uNSAvQ29kZSAo/v//CCkgPj4gPDwgL0JlZm9yZSAtLjUgL0NvZGUgKP7//zspID4+IDw8IC9CZWZvcmUgLS41IC9Db2RlICj+//9bKSA+PiA8PCAvQmVmb3JlIC0uNSAvQ29kZSAo/v8gGCkgPj4gPDwgL0JlZm9yZSAtLjUgL0NvZGUgKP7/IBwpID4+IDw8IC9CZWZvcmUgLS41IC9Db2RlICj+/zAIKSA+PiA8PCAvQmVmb3JlIC0uNSAvQ29kZSAo/v8wCikgPj4gPDwgL0JlZm9yZSAtLjUgL0NvZGUgKP7/MAwpID4+IDw8IC9CZWZvcmUgLS41IC9Db2RlICj+/zAOKSA+PiA8PCAvQmVmb3JlIC0uNSAvQ29kZSAo/v8wECkgPj4gPDwgL0JlZm9yZSAtLjUgL0NvZGUgKP7/MBQpID4+IDw8IC9BZnRlciAtLjUgL0NvZGUgKP7//wkpID4+IDw8IC9BZnRlciAtLjUgL0NvZGUgKP7//z0pID4+IDw8IC9BZnRlciAtLjUgL0NvZGUgKP7//10pID4+IDw8IC9BZnRlciAtLjUgL0NvZGUgKP7/IBkpID4+IDw8IC9BZnRlciAtLjUgL0NvZGUgKP7/IB0pID4+IDw8IC9BZnRlciAtLjUgL0NvZGUgKP7/MAkpID4+IDw8IC9BZnRlciAtLjUgL0NvZGUgKP7/MAspID4+IDw8IC9BZnRlciAtLjUgL0NvZGUgKP7/MA0pID4+IDw8IC9BZnRlciAtLjUgL0NvZGUgKP7/MA8pID4+IDw8IC9BZnRlciAtLjUgL0NvZGUgKP7/MBEpID4+IDw8IC9BZnRlciAtLjUgL0NvZGUgKP7/MBUpID4+IDw8IC9BZnRlciAtLjUgL0NvZGUgKP7//w4pID4+IDw8IC9BZnRlciAtLjUgL0NvZGUgKP7/MAIpID4+IDw8IC9BZnRlciAtLjUgL0NvZGUgKP7//wwpID4+IDw8IC9BZnRlciAtLjUgL0NvZGUgKP7/MAEpID4+IDw8IC9CZWZvcmUgLS4yNSAvQWZ0ZXIgLS4yNSAvQ29kZSAo/v//GikgPj4gPDwgL0JlZm9yZSAtLjI1IC9BZnRlciAtLjI1IC9Db2RlICj+//8bKSA+PiA8PCAvQmVmb3JlIC0uMjUgL0FmdGVyIC0uMjUgL0NvZGUgKP7/MPspID4+IDw8IC9CZWZvcmUgLS4yNSAvQWZ0ZXIgLS4yNSAvQ29kZSAo/v8gECkgPj4gXSA+PiAvVGFibGUgPDwgL0RhdGFBcnJheSA8PCAvU3BhcnNlQXJyYXkgWyA8PCAvSW5kZXggMSAvRWxlbWVudHMgWyA8PCAvUCBbIDEgNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjI1IC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDIgL0VsZW1lbnRzIFsgPDwgL1AgWyAyIDEgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAyIDIgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDIgMyBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDIgNCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDIgNSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgMiA3IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyAyIDggXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAyIDkgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAyIDEwIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMiAxMSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMiAxMiBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDIgMTMgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAyIDE0IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMiAxNSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDIgMTYgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gXSA+PiA8PCAvSW5kZXggMyAvRWxlbWVudHMgWyA8PCAvUCBbIDMgMSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDMgMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDMgNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgMyA3IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyAzIDggXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAzIDkgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAzIDEwIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMyAxMiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDMgMTMgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAzIDE0IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMyAxNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjEyNSAuMjUgLjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgMyAxNiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjEyNSAuMjUgLjUgXSAvUCA0ID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDQgL0VsZW1lbnRzIFsgPDwgL1AgWyA0IDEgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyA0IDUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDQgNyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgNCAxNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjEyNSAuMjUgLjI1IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDQgMTYgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIC4xMjUgLjI1IC4yNSBdIC9QIDQgPj4gPj4gPj4gXSA+PiA8PCAvSW5kZXggNSAvRWxlbWVudHMgWyA8PCAvUCBbIDUgMSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNSAyIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAuMjUgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDMgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDUgNCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNSA1IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNSA2IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAuMjUgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDcgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIC4yNSAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDUgOCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNSA5IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDEwIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDExIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDEyIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDEzIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDE0IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDE1IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDE2IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gXSA+PiA8PCAvSW5kZXggNiAvRWxlbWVudHMgWyA8PCAvUCBbIDYgMSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDYgMyBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gPj4gPj4gPj4gPDwgL1AgWyA2IDQgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdID4+ID4+ID4+IDw8IC9QIFsgNiA1IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjc1IC43NSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA2IDcgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDYgOCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gPj4gPj4gPj4gPDwgL1AgWyA2IDkgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdID4+ID4+ID4+IDw8IC9QIFsgNiAxMCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gPj4gPj4gPj4gPDwgL1AgWyA2IDExIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSA+PiA+PiA+PiA8PCAvUCBbIDYgMTIgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdID4+ID4+ID4+IDw8IC9QIFsgNiAxMyBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gPj4gPj4gPj4gPDwgL1AgWyA2IDE0IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSA+PiA+PiA+PiA8PCAvUCBbIDYgMTUgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyA2IDE2IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCA0ID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDcgL0VsZW1lbnRzIFsgPDwgL1AgWyA3IDEgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA3IDMgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA3IDQgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA3IDUgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDcgNyBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgNyA4IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgNyA5IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgNyAxMCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDcgMTIgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA3IDEzIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgNyAxNCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDcgMTUgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA3IDE2IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAyID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDggL0VsZW1lbnRzIFsgPDwgL1AgWyA4IDEgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyA4IDMgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyA4IDUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDggNyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgOCA4IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgOCA5IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgOCAxMCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDggMTIgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyA4IDEzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgOCAxNCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDggMTUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgOCAxNiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDQgPj4gPj4gPj4gXSA+PiA8PCAvSW5kZXggOSAvRWxlbWVudHMgWyA8PCAvUCBbIDkgMSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDkgMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDkgNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgOSA3IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA5IDggXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyA5IDkgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyA5IDEwIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgOSAxMiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDkgMTMgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyA5IDE0IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgOSAxNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyA5IDE2IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgNCA+PiA+PiA+PiBdID4+IDw8IC9JbmRleCAxMCAvRWxlbWVudHMgWyA8PCAvUCBbIDEwIDEgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAxMCAzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTAgNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgMTAgNyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgMTAgOCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEwIDkgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMCAxMCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEwIDEyIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTAgMTMgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMCAxNCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEwIDE1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDEwIDE2IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgNCA+PiA+PiA+PiBdID4+IDw8IC9JbmRleCAxMSAvRWxlbWVudHMgWyA8PCAvUCBbIDExIDUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDExIDcgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDExIDE1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyAxMSAxNiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCA0ID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDEyIC9FbGVtZW50cyBbIDw8IC9QIFsgMTIgMSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDEyIDMgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMiA1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyAxMiA3IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyAxMiA4IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTIgOSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEyIDEwIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTIgMTIgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMiAxMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEyIDE0IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTIgMTUgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIC4xMjUgLjI1IC41IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDEyIDE2IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAuMTI1IC4yNSAuNSBdIC9QIDQgPj4gPj4gPj4gXSA+PiA8PCAvSW5kZXggMTMgL0VsZW1lbnRzIFsgPDwgL1AgWyAxMyAxIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMTMgMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEzIDUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDEzIDcgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDEzIDggXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMyA5IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTMgMTAgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMyAxMiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEzIDEzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTMgMTQgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMyAxNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyAxMyAxNiBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDQgPj4gPj4gPj4gXSA+PiA8PCAvSW5kZXggMTQgL0VsZW1lbnRzIFsgPDwgL1AgWyAxNCAxIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMTQgMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDE0IDUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDE0IDcgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDE0IDggXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxNCA5IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTQgMTAgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxNCAxMiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDE0IDEzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTQgMTQgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxNCAxNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjEyNSAuMjUgLjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgMTQgMTYgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIC4xMjUgLjI1IC41IF0gL1AgNCA+PiA+PiA+PiBdID4+IDw8IC9JbmRleCAxNSAvRWxlbWVudHMgWyA8PCAvUCBbIDE1IDEgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAxNSAzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAuMTI1IC4yNSAuMjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgMTUgNCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjEyNSAuMjUgLjI1IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDE1IDUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDE1IDcgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDE1IDggXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgMTUgOSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyAxNSAxMCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAuNSBdID4+ID4+ID4+IDw8IC9QIFsgMTUgMTIgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIC4xMjUgLjI1IC41IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDE1IDE0IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAuMTI1IC4yNSAuNSBdIC9QIDQgPj4gPj4gPj4gXSA+PiA8PCAvSW5kZXggMTYgL0VsZW1lbnRzIFsgPDwgL1AgWyAxNiAxIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMTYgMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjEyNSAuMjUgLjI1IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDE2IDQgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIC4xMjUgLjI1IC4yNSBdIC9QIDQgPj4gPj4gPj4gPDwg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XSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDIgMyBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAyIDQgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMiA1IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyAyIDcgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDIgOCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMiA5IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDIgMTAgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMiAxMSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMiAxMiBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAyIDEzIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDIgMTQgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMiAxNSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAyIDE2IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgMyA+PiA+PiA+PiBdID4+IDw8IC9JbmRleCAzIC9FbGVtZW50cyBbIDw8IC9QIFsgMyAxIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDMgMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDMgNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgMyA3IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyAzIDggXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAzIDkgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAzIDEwIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMyAxMiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDMgMTMgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAzIDE0IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMyAxNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjEyNSAuMjUgLjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgMyAxNiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjEyNSAuMjUgLjUgXSAvUCA0ID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDQgL0VsZW1lbnRzIFsgPDwgL1AgWyA0IDEgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgNCA1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA0IDcgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDQgMTUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIC4xMjUgLjI1IC4yNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyA0IDE2IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAuMTI1IC4yNSAuMjUgXSAvUCA0ID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDUgL0VsZW1lbnRzIFsgPDwgL1AgWyA1IDEgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDUgMiBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgLjI1IC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNSAzIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDQgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDUgNSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDUgNiBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgLjI1IC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNSA3IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAuMjUgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDggXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDUgOSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNSAxMCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNSAxMSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNSAxMiBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNSAxMyBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNSAxNCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNSAxNSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNSAxNiBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDYgL0VsZW1lbnRzIFsgPDwgL1AgWyA2IDEgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgNiAzIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgMC4wIC41IF0gPj4gPj4gPj4gPDwgL1AgWyA2IDQgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgLjUgXSA+PiA+PiA+PiA8PCAvUCBbIDYgNSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNiA3IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA2IDggXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgLjUgXSA+PiA+PiA+PiA8PCAvUCBbIDYgOSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAuNSBdID4+ID4+ID4+IDw8IC9QIFsgNiAxMCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAuNSBdID4+ID4+ID4+IDw8IC9QIFsgNiAxMSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAuNSBdID4+ID4+ID4+IDw8IC9QIFsgNiAxMiBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAuNSBdID4+ID4+ID4+IDw8IC9QIFsgNiAxMyBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAuNSBdID4+ID4+ID4+IDw8IC9QIFsgNiAxNCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAuNSBdID4+ID4+ID4+IDw8IC9QIFsgNiAxNSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyA2IDE2IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgNCA+PiA+PiA+PiBdID4+IDw8IC9JbmRleCA3IC9FbGVtZW50cyBbIDw8IC9QIFsgNyAxIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDcgMyBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA3IDQgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgNyA1IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA3IDcgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDcgOCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA3IDkgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgNyAxMCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA3IDEyIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDcgMTMgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgNyAxNCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA3IDE1IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDcgMTYgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCAyID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDggL0VsZW1lbnRzIFsgPDwgL1AgWyA4IDEgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgOCAzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgOCA1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA4IDcgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDggOCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDggOSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDggMTAgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyA4IDEyIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgOCAxMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDggMTQgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyA4IDE1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDggMTYgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCA0ID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDkgL0VsZW1lbnRzIFsgPDwgL1AgWyA5IDEgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgOSAzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgOSA1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA5IDcgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDkgOCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDkgOSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDkgMTAgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyA5IDEyIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgOSAxMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDkgMTQgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyA5IDE1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDkgMTYgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCA0ID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDEwIC9FbGVtZW50cyBbIDw8IC9QIFsgMTAgMSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAxMCAzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTAgNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgMTAgNyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgMTAgOCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEwIDkgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMCAxMCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEwIDEyIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTAgMTMgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMCAxNCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEwIDE1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDEwIDE2IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgNCA+PiA+PiA+PiBdID4+IDw8IC9JbmRleCAxMSAvRWxlbWVudHMgWyA8PCAvUCBbIDExIDUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDExIDcgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDExIDE1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyAxMSAxNiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCA0ID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDEyIC9FbGVtZW50cyBbIDw8IC9QIFsgMTIgMSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAxMiAzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTIgNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgMTIgNyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgMTIgOCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEyIDkgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMiAxMCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEyIDEyIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTIgMTMgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMiAxNCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEyIDE1IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAuMTI1IC4yNSAuNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyAxMiAxNiBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgLjEyNSAuMjUgLjUgXSAvUCA0ID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDEzIC9FbGVtZW50cyBbIDw8IC9QIFsgMTMgMSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAxMyAzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTMgNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgMTMgNyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgMTMgOCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEzIDkgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMyAxMCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEzIDEyIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTMgMTMgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMyAxNCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEzIDE1IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDEzIDE2IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgNCA+PiA+PiA+PiBdID4+IDw8IC9JbmRleCAxNCAvRWxlbWVudHMgWyA8PCAvUCBbIDE0IDEgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMTQgMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDE0IDUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDE0IDcgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDE0IDggXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxNCA5IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTQgMTAgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxNCAxMiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDE0IDEzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTQgMTQgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxNCAxNSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgLjEyNSAuMjUgLjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgMTQgMTYgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIC4xMjUgLjI1IC41IF0gL1AgNCA+PiA+PiA+PiBdID4+IDw8IC9JbmRleCAxNSAvRWxlbWVudHMgWyA8PCAvUCBbIDE1IDEgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMTUgMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjEyNSAuMjUgLjI1IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDE1IDQgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIC4xMjUgLjI1IC4yNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyAxNSA1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyAxNSA3IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyAxNSA4IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDE1IDkgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgMTUgMTAgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgLjUgXSA+PiA+PiA+PiA8PCAvUCBbIDE1IDEyIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAuMTI1IC4yNSAuNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyAxNSAxNCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjEyNSAuMjUgLjUgXSAvUCA0ID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDE2IC9FbGVtZW50cyBbIDw8IC9QIFsgMTYgMSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAxNiAzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAuMTI1IC4yNSAuMjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgMTYgNCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjEyNSAuMjUgLjI1IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDE2IDUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDE2IDcgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDE2IDggXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgMTYgOSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyAxNiAxMCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAuNSBdID4+ID4+ID4+IDw8IC9QIFsgMTYgMTIgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIC4xMjUgLjI1IC41IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDE2IDE0IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAuMTI1IC4yNSAuNSBdIC9QIDQgPj4gPj4gPj4gXSA+PiBdID4+ID4+IC9QcmVkZWZpbmVkVGFnIDEgPj4gPj4gPj4gPDwgL1Jlc291cmNlIDw8IC9OYW1lICj+/wBZAGEAawB1AG0AbwBuAG8ASABhAG4AawBhAGsAdSkgL01lbWJlcnMgPDwgL0NvZGVUb0NsYXNzIDAgL0F1dG9Uc3VtZSA8PCAvVHN1bWVNYXBwaW5ncyBbIDw8IC9CZWZvcmUgLS41IC9Db2RlICj+//8IKSA+PiA8PCAvQmVmb3JlIC0uNSAvQ29kZSAo/v//OykgPj4gPDwgL0JlZm9yZSAtLjUgL0NvZGUgKP7//1spID4+IDw8IC9CZWZvcmUgLS41IC9Db2RlICj+/yAYKSA+PiA8PCAvQmVmb3JlIC0uNSAvQ29kZSAo/v8gHCkgPj4gPDwgL0JlZm9yZSAtLjUgL0NvZGUgKP7/MAgpID4+IDw8IC9CZWZvcmUgLS41IC9Db2RlICj+/zAKKSA+PiA8PCAvQmVmb3JlIC0uNSAvQ29kZSAo/v8wDCkgPj4gPDwgL0JlZm9yZSAtLjUgL0NvZGUgKP7/MA4pID4+IDw8IC9CZWZvcmUgLS41IC9Db2RlICj+/zAQKSA+PiA8PCAvQmVmb3JlIC0uNSAvQ29kZSAo/v8wFCkgPj4gPDwgL0FmdGVyIC0uNSAvQ29kZSAo/v//CSkgPj4gPDwgL0FmdGVyIC0uNSAvQ29kZSAo/v//PSkgPj4gPDwgL0FmdGVyIC0uNSAvQ29kZSAo/v//XSkgPj4gPDwgL0FmdGVyIC0uNSAvQ29kZSAo/v8gGSkgPj4gPDwgL0FmdGVyIC0uNSAvQ29kZSAo/v8gHSkgPj4gPDwgL0FmdGVyIC0uNSAvQ29kZSAo/v8wCSkgPj4gPDwgL0FmdGVyIC0uNSAvQ29kZSAo/v8wCykgPj4gPDwgL0FmdGVyIC0uNSAvQ29kZSAo/v8wDSkgPj4gPDwgL0FmdGVyIC0uNSAvQ29kZSAo/v8wDykgPj4gPDwgL0FmdGVyIC0uNSAvQ29kZSAo/v8wESkgPj4gPDwgL0FmdGVyIC0uNSAvQ29kZSAo/v8wFSkgPj4gPDwgL0FmdGVyIC0uNSAvQ29kZSAo/v//DikgPj4gPDwgL0FmdGVyIC0uNSAvQ29kZSAo/v8wAikgPj4gPDwgL0FmdGVyIC0uNSAvQ29kZSAo/v//DCkgPj4gPDwgL0FmdGVyIC0uNSAvQ29kZSAo/v8wASkgPj4gPDwgL0JlZm9yZSAtLjI1IC9BZnRlciAtLjI1IC9Db2RlICj+//8aKSA+PiA8PCAvQmVmb3JlIC0uMjUgL0FmdGVyIC0uMjUgL0NvZGUgKP7//xspID4+IDw8IC9CZWZvcmUgLS4yNSAvQWZ0ZXIgLS4yNSAvQ29kZSAo/v8w+ykgPj4gPDwgL0JlZm9yZSAtLjI1IC9BZnRlciAtLjI1IC9Db2RlICj+/yAQKSA+PiBdID4+IC9UYWJsZSA8PCAvRGF0YUFycmF5IDw8IC9TcGFyc2VBcnJheSBbIDw8IC9JbmRleCAxIC9FbGVtZW50cyBbIDw8IC9QIFsgMSA1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAuMjUgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gXSA+PiA8PCAvSW5kZXggMiAvRWxlbWVudHMgWyA8PCAvUCBbIDIgMSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAyIDIgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDIgMyBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAyIDQgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMiA1IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyAyIDcgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDIgOCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMiA5IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDIgMTAgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMiAxMSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMiAxMiBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAyIDEzIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDIgMTQgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMiAxNSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAyIDE2IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgMyA+PiA+PiA+PiBdID4+IDw8IC9JbmRleCAzIC9FbGVtZW50cyBbIDw8IC9QIFsgMyAxIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDMgMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDMgNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgMyA3IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyAzIDggXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAzIDkgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAzIDEwIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMyAxMiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDMgMTMgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAzIDE0IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMyAxNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjEyNSAuMjUgLjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgMyAxNiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjEyNSAuMjUgLjUgXSAvUCA0ID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDQgL0VsZW1lbnRzIFsgPDwgL1AgWyA0IDEgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgNCA1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA0IDcgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDQgMTUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIC4xMjUgLjI1IC4yNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyA0IDE2IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAuMTI1IC4yNSAuMjUgXSAvUCA0ID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDUgL0VsZW1lbnRzIFsgPDwgL1AgWyA1IDEgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDUgMiBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgLjI1IC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNSAzIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDQgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDUgNSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDUgNiBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgLjI1IC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNSA3IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAuMjUgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDggXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDUgOSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNSAxMCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNSAxMSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNSAxMiBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNSAxMyBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNSAxNCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNSAxNSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNSAxNiBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDYgL0VsZW1lbnRzIFsgPDwgL1AgWyA2IDEgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgNiAzIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgMC4wIC41IF0gPj4gPj4gPj4gPDwgL1AgWyA2IDQgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgLjUgXSA+PiA+PiA+PiA8PCAvUCBbIDYgNSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNiA3IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA2IDggXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgLjUgXSA+PiA+PiA+PiA8PCAvUCBbIDYgOSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAuNSBdID4+ID4+ID4+IDw8IC9QIFsgNiAxMCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAuNSBdID4+ID4+ID4+IDw8IC9QIFsgNiAxMSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAuNSBdID4+ID4+ID4+IDw8IC9QIFsgNiAxMiBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAuNSBdID4+ID4+ID4+IDw8IC9QIFsgNiAxMyBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAuNSBdID4+ID4+ID4+IDw8IC9QIFsgNiAxNCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAuNSBdID4+ID4+ID4+IDw8IC9QIFsgNiAxNSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyA2IDE2IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgNCA+PiA+PiA+PiBdID4+IDw8IC9JbmRleCA3IC9FbGVtZW50cyBbIDw8IC9QIFsgNyAxIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDcgMyBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA3IDQgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgNyA1IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA3IDcgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDcgOCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA3IDkgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgNyAxMCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA3IDEyIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDcgMTMgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgNyAxNCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA3IDE1IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDcgMTYgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCAyID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDggL0VsZW1lbnRzIFsgPDwgL1AgWyA4IDEgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgOCAzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgOCA1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA4IDcgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDggOCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDggOSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDggMTAgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyA4IDEyIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgOCAxMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDggMTQgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyA4IDE1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDggMTYgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCA0ID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDkgL0VsZW1lbnRzIFsgPDwgL1AgWyA5IDEgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgOSAzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgOSA1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA5IDcgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDkgOCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDkgOSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDkgMTAgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyA5IDEyIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgOSAxMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDkgMTQgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyA5IDE1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDkgMTYgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCA0ID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDEwIC9FbGVtZW50cyBbIDw8IC9QIFsgMTAgMSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAxMCAzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTAgNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgMTAgNyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgMTAgOCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEwIDkgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMCAxMCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEwIDEyIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTAgMTMgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMCAxNCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEwIDE1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDEwIDE2IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgNCA+PiA+PiA+PiBdID4+IDw8IC9JbmRleCAxMSAvRWxlbWVudHMgWyA8PCAvUCBbIDExIDUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDExIDcgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDExIDE1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyAxMSAxNiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCA0ID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDEyIC9FbGVtZW50cyBbIDw8IC9QIFsgMTIgMSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAxMiAzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTIgNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgMTIgNyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgMTIgOCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEyIDkgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMiAxMCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEyIDEyIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTIgMTMgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMiAxNCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEyIDE1IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAuMTI1IC4yNSAuNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyAxMiAxNiBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgLjEyNSAuMjUgLjUgXSAvUCA0ID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDEzIC9FbGVtZW50cyBbIDw8IC9QIFsgMTMgMSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAxMyAzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTMgNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgMTMgNyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgMTMgOCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEzIDkgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMyAxMCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEzIDEyIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTMgMTMgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMyAxNCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEzIDE1IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDEzIDE2IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgNCA+PiA+PiA+PiBdID4+IDw8IC9JbmRleCAxNCAvRWxlbWVudHMgWyA8PCAvUCBbIDE0IDEgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMTQgMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDE0IDUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDE0IDcgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDE0IDggXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxNCA5IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTQgMTAgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxNCAxMiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDE0IDEzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTQgMTQgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxNCAxNSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgLjEyNSAuMjUgLjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgMTQgMTYgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIC4xMjUgLjI1IC41IF0gL1AgNCA+PiA+PiA+PiBdID4+IDw8IC9JbmRleCAxNSAvRWxlbWVudHMgWyA8PCAvUCBbIDE1IDEgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMTUgMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjEyNSAuMjUgLjI1IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDE1IDQgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIC4xMjUgLjI1IC4yNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyAxNSA1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyAxNSA3IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyAxNSA4IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDE1IDkgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgMTUgMTAgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgLjUgXSA+PiA+PiA+PiA8PCAvUCBbIDE1IDEyIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAuMTI1IC4yNSAuNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyAxNSAxNCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjEyNSAuMjUgLjUgXSAvUCA0ID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDE2IC9FbGVtZW50cyBbIDw8IC9QIFsgMTYgMSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAxNiAzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAuMTI1IC4yNSAuMjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgMTYgNCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjEyNSAuMjUgLjI1IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDE2IDUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDE2IDcgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDE2IDggXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgMTYgOSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyAxNiAxMCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAuNSBdID4+ID4+ID4+IDw8IC9QIFsgMTYgMTIgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIC4xMjUgLjI1IC41IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDE2IDE0IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAuMTI1IC4yNSAuNSBdIC9QIDQgPj4gPj4gPj4gXSA+PiBdID4+ID4+IC9QcmVkZWZpbmVkVGFnIDEgPj4gPj4gPj4gPDwgL1Jlc291cmNlIDw8IC9OYW1lICj+/wBHAHkAbwBtAGEAdABzAHUAWQBhAGsAdQBtAG8AbgBvAEgAYQBuAGsAYQBrAHUpIC9NZW1iZXJzIDw8IC9Db2RlVG9DbGFzcyAwIC9BdXRvVHN1bWUgPDwgL1RzdW1lTWFwcGluZ3MgWyA8PCAvQmVmb3JlIC0uNSAvQ29kZSAo/v//CCkgPj4gPDwgL0JlZm9yZSAtLjUgL0NvZGUgKP7//zspID4+IDw8IC9CZWZvcmUgLS41IC9Db2RlICj+//9bKSA+PiA8PCAvQmVmb3JlIC0uNSAvQ29kZSAo/v8gGCkgPj4gPDwgL0JlZm9yZSAtLjUgL0NvZGUgKP7/IBwpID4+IDw8IC9CZWZvcmUgLS41IC9Db2RlICj+/zAIKSA+PiA8PCAvQmVmb3JlIC0uNSAvQ29kZSAo/v8wCikgPj4gPDwgL0JlZm9yZSAtLjUgL0NvZGUgKP7/MAwpID4+IDw8IC9CZWZvcmUgLS41IC9Db2RlICj+/zAOKSA+PiA8PCAvQmVmb3JlIC0uNSAvQ29kZSAo/v8wECkgPj4gPDwgL0JlZm9yZSAtLjUgL0NvZGUgKP7/MBQpID4+IDw8IC9BZnRlciAtLjUgL0NvZGUgKP7//wkpID4+IDw8IC9BZnRlciAtLjUgL0NvZGUgKP7//z0pID4+IDw8IC9BZnRlciAtLjUgL0NvZGUgKP7//10pID4+IDw8IC9BZnRlciAtLjUgL0NvZGUgKP7/IBkpID4+IDw8IC9BZnRlciAtLjUgL0NvZGUgKP7/IB0pID4+IDw8IC9BZnRlciAtLjUgL0NvZGUgKP7/MAkpID4+IDw8IC9BZnRlciAtLjUgL0NvZGUgKP7/MAspID4+IDw8IC9BZnRlciAtLjUgL0NvZGUgKP7/MA0pID4+IDw8IC9BZnRlciAtLjUgL0NvZGUgKP7/MA8pID4+IDw8IC9BZnRlciAtLjUgL0NvZGUgKP7/MBEpID4+IDw8IC9BZnRlciAtLjUgL0NvZGUgKP7/MBUpID4+IDw8IC9BZnRlciAtLjUgL0NvZGUgKP7//w4pID4+IDw8IC9BZnRlciAtLjUgL0NvZGUgKP7/MAIpID4+IDw8IC9BZnRlciAtLjUgL0NvZGUgKP7//wwpID4+IDw8IC9BZnRlciAtLjUgL0NvZGUgKP7/MAEpID4+IDw8IC9CZWZvcmUgLS4yNSAvQWZ0ZXIgLS4yNSAvQ29kZSAo/v//GikgPj4gPDwgL0JlZm9yZSAtLjI1IC9BZnRlciAtLjI1IC9Db2RlICj+//8bKSA+PiA8PCAvQmVmb3JlIC0uMjUgL0FmdGVyIC0uMjUgL0NvZGUgKP7/MPspID4+IDw8IC9CZWZvcmUgLS4yNSAvQWZ0ZXIgLS4yNSAvQ29kZSAo/v8gECkgPj4gXSA+PiAvVGFibGUgPDwgL0RhdGFBcnJheSA8PCAvU3BhcnNlQXJyYXkgWyA8PCAvSW5kZXggMSAvRWxlbWVudHMgWyA8PCAvUCBbIDEgNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjI1IC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDIgL0VsZW1lbnRzIFsgPDwgL1AgWyAyIDEgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAyIDIgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDIgMyBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDIgNCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDIgNSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgMiA3IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyAyIDggXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAyIDkgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAyIDEwIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMiAxMSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMiAxMiBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDIgMTMgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAyIDE0IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMiAxNSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDIgMTYgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gXSA+PiA8PCAvSW5kZXggMyAvRWxlbWVudHMgWyA8PCAvUCBbIDMgMSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDMgMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDMgNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgMyA3IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyAzIDggXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAzIDkgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAzIDEwIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMyAxMiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDMgMTMgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAzIDE0IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMyAxNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjEyNSAuMjUgLjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgMyAxNiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjEyNSAuMjUgLjUgXSAvUCA0ID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDQgL0VsZW1lbnRzIFsgPDwgL1AgWyA0IDEgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyA0IDUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDQgNyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgNCAxNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjEyNSAuMjUgLjI1IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDQgMTYgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIC4xMjUgLjI1IC4yNSBdIC9QIDQgPj4gPj4gPj4gXSA+PiA8PCAvSW5kZXggNSAvRWxlbWVudHMgWyA8PCAvUCBbIDUgMSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNSAyIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAuMjUgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDMgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDUgNCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNSA1IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNSA2IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAuMjUgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDcgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIC4yNSAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDUgOCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNSA5IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDEwIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDExIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDEyIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDEzIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDE0IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDE1IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDE2IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gXSA+PiA8PCAvSW5kZXggNiAvRWxlbWVudHMgWyA8PCAvUCBbIDYgMSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDYgMyBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gPj4gPj4gPj4gPDwgL1AgWyA2IDQgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdID4+ID4+ID4+IDw8IC9QIFsgNiA1IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjc1IC43NSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA2IDcgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDYgOCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gPj4gPj4gPj4gPDwgL1AgWyA2IDkgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdID4+ID4+ID4+IDw8IC9QIFsgNiAxMCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gPj4gPj4gPj4gPDwgL1AgWyA2IDExIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSA+PiA+PiA+PiA8PCAvUCBbIDYgMTIgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdID4+ID4+ID4+IDw8IC9QIFsgNiAxMyBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gPj4gPj4gPj4gPDwgL1AgWyA2IDE0IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSA+PiA+PiA+PiA8PCAvUCBbIDYgMTUgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyA2IDE2IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCA0ID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDcgL0VsZW1lbnRzIFsgPDwgL1AgWyA3IDEgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA3IDMgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA3IDQgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA3IDUgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDcgNyBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgNyA4IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgNyA5IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgNyAxMCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDcgMTIgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA3IDEzIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgNyAxNCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDcgMTUgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA3IDE2IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAyID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDggL0VsZW1lbnRzIFsgPDwgL1AgWyA4IDEgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyA4IDMgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyA4IDUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDggNyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgOCA4IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgOCA5IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgOCAxMCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDggMTIgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyA4IDEzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgOCAxNCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDggMTUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgOCAxNiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDQgPj4gPj4gPj4gXSA+PiA8PCAvSW5kZXggOSAvRWxlbWVudHMgWyA8PCAvUCBbIDkgMSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDkgMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDkgNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgOSA3IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA5IDggXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyA5IDkgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyA5IDEwIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgOSAxMiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDkgMTMgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyA5IDE0IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgOSAxNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyA5IDE2IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgNCA+PiA+PiA+PiBdID4+IDw8IC9JbmRleCAxMCAvRWxlbWVudHMgWyA8PCAvUCBbIDEwIDEgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAxMCAzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTAgNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgMTAgNyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgMTAgOCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEwIDkgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMCAxMCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEwIDEyIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTAgMTMgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMCAxNCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEwIDE1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDEwIDE2IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgNCA+PiA+PiA+PiBdID4+IDw8IC9JbmRleCAxMSAvRWxlbWVudHMgWyA8PCAvUCBbIDExIDUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDExIDcgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDExIDE1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyAxMSAxNiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCA0ID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDEyIC9FbGVtZW50cyBbIDw8IC9QIFsgMTIgMSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDEyIDMgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMiA1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyAxMiA3IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyAxMiA4IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTIgOSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEyIDEwIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTIgMTIgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMiAxMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEyIDE0IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTIgMTUgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIC4xMjUgLjI1IC41IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDEyIDE2IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAuMTI1IC4yNSAuNSBdIC9QIDQgPj4gPj4gPj4gXSA+PiA8PCAvSW5kZXggMTMgL0VsZW1lbnRzIFsgPDwgL1AgWyAxMyAxIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMTMgMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEzIDUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDEzIDcgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDEzIDggXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMyA5IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTMgMTAgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMyAxMiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEzIDEzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTMgMTQgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMyAxNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyAxMyAxNiBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDQgPj4gPj4gPj4gXSA+PiA8PCAvSW5kZXggMTQgL0VsZW1lbnRzIFsgPDwgL1AgWyAxNCAxIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMTQgMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDE0IDUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDE0IDcgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDE0IDggXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxNCA5IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTQgMTAgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxNCAxMiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDE0IDEzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTQgMTQgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxNCAxNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjEyNSAuMjUgLjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgMTQgMTYgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIC4xMjUgLjI1IC41IF0gL1AgNCA+PiA+PiA+PiBdID4+IDw8IC9JbmRleCAxNSAvRWxlbWVudHMgWyA8PCAvUCBbIDE1IDEgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAxNSAzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAuMTI1IC4yNSAuMjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgMTUgNCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjEyNSAuMjUgLjI1IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDE1IDUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDE1IDcgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDE1IDggXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgMTUgOSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyAxNSAxMCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAuNSBdID4+ID4+ID4+IDw8IC9QIFsgMTUgMTIgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIC4xMjUgLjI1IC41IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDE1IDE0IF0gL0RhdGEg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IC0uMjUgL0FmdGVyIC0uMjUgL0NvZGUgKP7/IBApID4+IF0gPj4gL1RhYmxlIDw8IC9EYXRhQXJyYXkgPDwgL1NwYXJzZUFycmF5IFsgPDwgL0luZGV4IDEgL0VsZW1lbnRzIFsgPDwgL1AgWyAxIDUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIC4yNSAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiBdID4+IDw8IC9JbmRleCAyIC9FbGVtZW50cyBbIDw8IC9QIFsgMiAxIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMiAyIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAyIDMgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAyIDQgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAyIDUgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDIgNyBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgMiA4IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMiA5IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMiAxMCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDIgMTEgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDIgMTIgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAyIDEzIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMiAxNCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDIgMTUgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAyIDE2IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMiAxNyBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gPj4gPj4gPj4gXSA+PiA8PCAvSW5kZXggMyAvRWxlbWVudHMgWyA8PCAvUCBbIDMgMSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDMgMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDMgNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgMyA3IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyAzIDggXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAzIDkgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAzIDEwIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMyAxMiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDMgMTMgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAzIDE0IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMyAxNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjEyNSAuMjUgLjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgMyAxNiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjEyNSAuMjUgLjUgXSAvUCA0ID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDQgL0VsZW1lbnRzIFsgPDwgL1AgWyA0IDEgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyA0IDUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDQgNyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgNCAxNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjEyNSAuMjUgLjI1IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDQgMTYgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIC4xMjUgLjI1IC4yNSBdIC9QIDQgPj4gPj4gPj4gXSA+PiA8PCAvSW5kZXggNSAvRWxlbWVudHMgWyA8PCAvUCBbIDUgMSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNSAyIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAuMjUgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDMgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDUgNCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNSA1IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNSA2IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAuMjUgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDcgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIC4yNSAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDUgOCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNSA5IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDEwIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDExIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDEyIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDEzIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDE0IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDE1IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDE2IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gXSA+PiA8PCAvSW5kZXggNiAvRWxlbWVudHMgWyA8PCAvUCBbIDYgMSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDYgMyBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gPj4gPj4gPj4gPDwgL1AgWyA2IDQgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdID4+ID4+ID4+IDw8IC9QIFsgNiA1IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjc1IC43NSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA2IDcgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDYgOCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gPj4gPj4gPj4gPDwgL1AgWyA2IDkgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdID4+ID4+ID4+IDw8IC9QIFsgNiAxMCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gPj4gPj4gPj4gPDwgL1AgWyA2IDExIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSA+PiA+PiA+PiA8PCAvUCBbIDYgMTIgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdID4+ID4+ID4+IDw8IC9QIFsgNiAxMyBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gPj4gPj4gPj4gPDwgL1AgWyA2IDE0IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSA+PiA+PiA+PiA8PCAvUCBbIDYgMTUgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyA2IDE2IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgNiAxNyBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gPj4gPj4gPj4gXSA+PiA8PCAvSW5kZXggNyAvRWxlbWVudHMgWyA8PCAvUCBbIDcgMSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDcgMyBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDcgNCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDcgNSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNyA3IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA3IDggXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA3IDkgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA3IDEwIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgNyAxMiBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDcgMTMgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA3IDE0IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgNyAxNSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDcgMTYgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA3IDE3IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSA+PiA+PiA+PiBdID4+IDw8IC9JbmRleCA4IC9FbGVtZW50cyBbIDw8IC9QIFsgOCAxIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgOCAzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgOCA1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA4IDcgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDggOCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDggOSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDggMTAgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyA4IDEyIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgOCAxMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDggMTQgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyA4IDE1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDggMTYgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCA0ID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDkgL0VsZW1lbnRzIFsgPDwgL1AgWyA5IDEgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyA5IDMgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyA5IDUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDkgNyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgOSA4IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgOSA5IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgOSAxMCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDkgMTIgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyA5IDEzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgOSAxNCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDkgMTUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgOSAxNiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDQgPj4gPj4gPj4gXSA+PiA8PCAvSW5kZXggMTAgL0VsZW1lbnRzIFsgPDwgL1AgWyAxMCAxIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMTAgMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEwIDUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDEwIDcgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDEwIDggXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMCA5IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTAgMTAgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMCAxMiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEwIDEzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTAgMTQgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMCAxNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyAxMCAxNiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDQgPj4gPj4gPj4gXSA+PiA8PCAvSW5kZXggMTEgL0VsZW1lbnRzIFsgPDwgL1AgWyAxMSA1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyAxMSA3IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyAxMSAxNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgMTEgMTYgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgNCA+PiA+PiA+PiBdID4+IDw8IC9JbmRleCAxMiAvRWxlbWVudHMgWyA8PCAvUCBbIDEyIDEgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAxMiAzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTIgNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgMTIgNyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgMTIgOCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEyIDkgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMiAxMCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEyIDEyIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTIgMTMgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMiAxNCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEyIDE1IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAuMTI1IC4yNSAuNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyAxMiAxNiBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgLjEyNSAuMjUgLjUgXSAvUCA0ID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDEzIC9FbGVtZW50cyBbIDw8IC9QIFsgMTMgMSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDEzIDMgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMyA1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyAxMyA3IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyAxMyA4IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTMgOSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEzIDEwIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTMgMTIgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMyAxMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEzIDE0IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTMgMTUgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgMTMgMTYgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCA0ID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDE0IC9FbGVtZW50cyBbIDw8IC9QIFsgMTQgMSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDE0IDMgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxNCA1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyAxNCA3IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyAxNCA4IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTQgOSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDE0IDEwIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTQgMTIgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxNCAxMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDE0IDE0IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTQgMTUgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIC4xMjUgLjI1IC41IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDE0IDE2IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAuMTI1IC4yNSAuNSBdIC9QIDQgPj4gPj4gPj4gXSA+PiA8PCAvSW5kZXggMTUgL0VsZW1lbnRzIFsgPDwgL1AgWyAxNSAxIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMTUgMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjEyNSAuMjUgLjI1IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDE1IDQgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIC4xMjUgLjI1IC4yNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyAxNSA1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyAxNSA3IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyAxNSA4IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDE1IDkgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgMTUgMTAgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgLjUgXSA+PiA+PiA+PiA8PCAvUCBbIDE1IDEyIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAuMTI1IC4yNSAuNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyAxNSAxNCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjEyNSAuMjUgLjUgXSAvUCA0ID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDE2IC9FbGVtZW50cyBbIDw8IC9QIFsgMTYgMSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDE2IDMgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIC4xMjUgLjI1IC4yNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyAxNiA0IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAuMTI1IC4yNSAuMjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgMTYgNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgMTYgNyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgMTYgOCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyAxNiA5IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDE2IDEwIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIC41IF0gPj4gPj4gPj4gPDwgL1AgWyAxNiAxMiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjEyNSAuMjUgLjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgMTYgMTQgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIC4xMjUgLjI1IC41IF0gL1AgNCA+PiA+PiA+PiBdID4+IF0gPj4gPj4gL1ByZWRlZmluZWRUYWcgNCA+PiA+PiA+PiA8PCAvUmVzb3VyY2UgPDwgL05hbWUgKP7/AFkAYQBrAHUAbQBvAG4AbwBaAGUAbgBrAGEAawB1KSAvTWVtYmVycyA8PCAvQ29kZVRvQ2xhc3MgMCAvQXV0b1RzdW1lIDw8IC9Uc3VtZU1hcHBpbmdzIFsgPDwgL0JlZm9yZSAtLjUgL0NvZGUgKP7//wgpID4+IDw8IC9CZWZvcmUgLS41IC9Db2RlICj+//87KSA+PiA8PCAvQmVmb3JlIC0uNSAvQ29kZSAo/v//WykgPj4gPDwgL0JlZm9yZSAtLjUgL0NvZGUgKP7/IBgpID4+IDw8IC9CZWZvcmUgLS41IC9Db2RlICj+/yAcKSA+PiA8PCAvQmVmb3JlIC0uNSAvQ29kZSAo/v8wCCkgPj4gPDwgL0JlZm9yZSAtLjUgL0NvZGUgKP7/MAopID4+IDw8IC9CZWZvcmUgLS41IC9Db2RlICj+/zAMKSA+PiA8PCAvQmVmb3JlIC0uNSAvQ29kZSAo/v8wDikgPj4gPDwgL0JlZm9yZSAtLjUgL0NvZGUgKP7/MBApID4+IDw8IC9CZWZvcmUgLS41IC9Db2RlICj+/zAUKSA+PiA8PCAvQWZ0ZXIgLS41IC9Db2RlICj+//8JKSA+PiA8PCAvQWZ0ZXIgLS41IC9Db2RlICj+//89KSA+PiA8PCAvQWZ0ZXIgLS41IC9Db2RlICj+//9dKSA+PiA8PCAvQWZ0ZXIgLS41IC9Db2RlICj+/yAZKSA+PiA8PCAvQWZ0ZXIgLS41IC9Db2RlICj+/yAdKSA+PiA8PCAvQWZ0ZXIgLS41IC9Db2RlICj+/zAJKSA+PiA8PCAvQWZ0ZXIgLS41IC9Db2RlICj+/zALKSA+PiA8PCAvQWZ0ZXIgLS41IC9Db2RlICj+/zANKSA+PiA8PCAvQWZ0ZXIgLS41IC9Db2RlICj+/zAPKSA+PiA8PCAvQWZ0ZXIgLS41IC9Db2RlICj+/zARKSA+PiA8PCAvQWZ0ZXIgLS41IC9Db2RlICj+/zAVKSA+PiA8PCAvQWZ0ZXIgLS41IC9Db2RlICj+//8OKSA+PiA8PCAvQWZ0ZXIgLS41IC9Db2RlICj+/zACKSA+PiA8PCAvQWZ0ZXIgLS41IC9Db2RlICj+//8MKSA+PiA8PCAvQWZ0ZXIgLS41IC9Db2RlICj+/zABKSA+PiA8PCAvQmVmb3JlIC0uMjUgL0FmdGVyIC0uMjUgL0NvZGUgKP7//xopID4+IDw8IC9CZWZvcmUgLS4yNSAvQWZ0ZXIgLS4yNSAvQ29kZSAo/v//GykgPj4gPDwgL0JlZm9yZSAtLjI1IC9BZnRlciAtLjI1IC9Db2RlICj+/zD7KSA+PiA8PCAvQmVmb3JlIC0uMjUgL0FmdGVyIC0uMjUgL0NvZGUgKP7/IBApID4+IF0gPj4gL1RhYmxlIDw8IC9EYXRhQXJyYXkgPDwgL1NwYXJzZUFycmF5IFsgPDwgL0luZGV4IDEgL0VsZW1lbnRzIFsgPDwgL1AgWyAxIDUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIC4yNSAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiBdID4+IDw8IC9JbmRleCAyIC9FbGVtZW50cyBbIDw8IC9QIFsgMiAxIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMiAyIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAyIDMgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAyIDQgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAyIDUgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDIgNyBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgMiA4IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMiA5IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMiAxMCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDIgMTEgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDIgMTIgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAyIDEzIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMiAxNCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDIgMTUgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAyIDE2IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMiAxNyBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgLjUgLjUgLjUgXSA+PiA+PiA+PiBdID4+IDw8IC9JbmRleCAzIC9FbGVtZW50cyBbIDw8IC9QIFsgMyAxIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMyAzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMyA1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyAzIDcgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDMgOCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDMgOSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDMgMTAgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAzIDEyIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMyAxMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDMgMTQgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAzIDE1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAuMTI1IC4yNSAuNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyAzIDE2IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAuMTI1IC4yNSAuNSBdIC9QIDQgPj4gPj4gPj4gXSA+PiA8PCAvSW5kZXggNCAvRWxlbWVudHMgWyA8PCAvUCBbIDQgMSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDQgNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNCA3IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA0IDE1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAuMTI1IC4yNSAuMjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgNCAxNiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjEyNSAuMjUgLjI1IF0gL1AgNCA+PiA+PiA+PiBdID4+IDw8IC9JbmRleCA1IC9FbGVtZW50cyBbIDw8IC9QIFsgNSAxIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDIgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIC4yNSAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDUgMyBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNSA0IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDUgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDYgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIC4yNSAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDUgNyBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgLjI1IC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgNSA4IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA1IDkgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDUgMTAgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDUgMTEgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDUgMTIgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDUgMTMgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDUgMTQgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDUgMTUgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDUgMTYgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDUgMTcgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIC4yNSAuMjUgLjI1IF0gPj4gPj4gPj4gXSA+PiA8PCAvSW5kZXggNiAvRWxlbWVudHMgWyA8PCAvUCBbIDYgMSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDYgMyBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gPj4gPj4gPj4gPDwgL1AgWyA2IDQgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdID4+ID4+ID4+IDw8IC9QIFsgNiA1IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjc1IC43NSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA2IDcgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDYgOCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gPj4gPj4gPj4gPDwgL1AgWyA2IDkgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdID4+ID4+ID4+IDw8IC9QIFsgNiAxMCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gPj4gPj4gPj4gPDwgL1AgWyA2IDExIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSA+PiA+PiA+PiA8PCAvUCBbIDYgMTIgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdID4+ID4+ID4+IDw8IC9QIFsgNiAxMyBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gPj4gPj4gPj4gPDwgL1AgWyA2IDE0IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSA+PiA+PiA+PiA8PCAvUCBbIDYgMTUgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyA2IDE2IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgNiAxNyBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgLjUgLjUgLjUgXSA+PiA+PiA+PiBdID4+IDw8IC9JbmRleCA3IC9FbGVtZW50cyBbIDw8IC9QIFsgNyAxIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgNyAzIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgNyA0IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgNyA1IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA3IDcgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDcgOCBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDcgOSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDcgMTAgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA3IDEyIF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgNyAxMyBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDcgMTQgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA3IDE1IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgNyAxNiBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDcgMTcgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIC41IC41IC41IF0gPj4gPj4gPj4gXSA+PiA8PCAvSW5kZXggOCAvRWxlbWVudHMgWyA8PCAvUCBbIDggMSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDggMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDggNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgOCA3IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyA4IDggXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyA4IDkgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyA4IDEwIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgOCAxMiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDggMTMgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyA4IDE0IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgOCAxNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyA4IDE2IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgNCA+PiA+PiA+PiBdID4+IDw8IC9JbmRleCA5IC9FbGVtZW50cyBbIDw8IC9QIFsgOSAxIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgOSAzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgOSA1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyA5IDcgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDkgOCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDkgOSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDkgMTAgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyA5IDEyIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgOSAxMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDkgMTQgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyA5IDE1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDkgMTYgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCA0ID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDEwIC9FbGVtZW50cyBbIDw8IC9QIFsgMTAgMSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDEwIDMgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMCA1IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjI1IC4yNSBdIC9QIDEgPj4gPj4gPj4gPDwgL1AgWyAxMCA3IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDIgPj4gPj4gPj4gPDwgL1AgWyAxMCA4IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTAgOSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEwIDEwIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTAgMTIgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMCAxMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEwIDE0IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTAgMTUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgMTAgMTYgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCA0ID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDExIC9FbGVtZW50cyBbIDw8IC9QIFsgMTEgNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgMTEgNyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgMTEgMTUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDExIDE2IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDAuMCBdIC9QIDQgPj4gPj4gPj4gXSA+PiA8PCAvSW5kZXggMTIgL0VsZW1lbnRzIFsgPDwgL1AgWyAxMiAxIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgLjUgLjUgXSAvUCAzID4+ID4+ID4+IDw8IC9QIFsgMTIgMyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEyIDUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDEyIDcgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDEyIDggXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMiA5IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTIgMTAgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMiAxMiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEyIDEzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTIgMTQgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMiAxNSBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgLjEyNSAuMjUgLjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgMTIgMTYgXSAvRGF0YSA8PCAvQiA8PCAvUiBbIC4xMjUgLjI1IC41IF0gL1AgNCA+PiA+PiA+PiBdID4+IDw8IC9JbmRleCAxMyAvRWxlbWVudHMgWyA8PCAvUCBbIDEzIDEgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAxMyAzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTMgNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgMTMgNyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgMTMgOCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEzIDkgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMyAxMCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEzIDEyIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTMgMTMgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxMyAxNCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDEzIDE1IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDEzIDE2IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgNCA+PiA+PiA+PiBdID4+IDw8IC9JbmRleCAxNCAvRWxlbWVudHMgWyA8PCAvUCBbIDE0IDEgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAxNCAzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTQgNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgMTQgNyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgMTQgOCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDE0IDkgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxNCAxMCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDE0IDEyIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIDEuMCBdID4+ID4+ID4+IDw8IC9QIFsgMTQgMTMgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMS4wIF0gPj4gPj4gPj4gPDwgL1AgWyAxNCAxNCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAxLjAgXSA+PiA+PiA+PiA8PCAvUCBbIDE0IDE1IF0gL0RhdGEgPDwgL0IgPDwgL1IgWyAuMTI1IC4yNSAuNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyAxNCAxNiBdIC9EYXRhIDw8IC9CIDw8IC9SIFsgLjEyNSAuMjUgLjUgXSAvUCA0ID4+ID4+ID4+IF0gPj4gPDwgL0luZGV4IDE1IC9FbGVtZW50cyBbIDw8IC9QIFsgMTUgMSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC41IC41IF0gL1AgMyA+PiA+PiA+PiA8PCAvUCBbIDE1IDMgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIC4xMjUgLjI1IC4yNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyAxNSA0IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAuMTI1IC4yNSAuMjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgMTUgNSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIC4yNSAuMjUgXSAvUCAxID4+ID4+ID4+IDw8IC9QIFsgMTUgNyBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAwLjAgXSAvUCAyID4+ID4+ID4+IDw8IC9QIFsgMTUgOCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyAxNSA5IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIC41IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDE1IDEwIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAwLjAgMC4wIC41IF0gPj4gPj4gPj4gPDwgL1AgWyAxNSAxMiBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjEyNSAuMjUgLjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgMTUgMTQgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIC4xMjUgLjI1IC41IF0gL1AgNCA+PiA+PiA+PiBdID4+IDw8IC9JbmRleCAxNiAvRWxlbWVudHMgWyA8PCAvUCBbIDE2IDEgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuNSAuNSBdIC9QIDMgPj4gPj4gPj4gPDwgL1AgWyAxNiAzIF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAuMTI1IC4yNSAuMjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgMTYgNCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgLjEyNSAuMjUgLjI1IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDE2IDUgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAuMjUgLjI1IF0gL1AgMSA+PiA+PiA+PiA8PCAvUCBbIDE2IDcgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgMC4wIF0gL1AgMiA+PiA+PiA+PiA8PCAvUCBbIDE2IDggXSAvRGF0YSA8PCAvQSA8PCAvUiBbIDAuMCAwLjAgLjUgXSAvUCA0ID4+ID4+ID4+IDw8IC9QIFsgMTYgOSBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAuNSBdIC9QIDQgPj4gPj4gPj4gPDwgL1AgWyAxNiAxMCBdIC9EYXRhIDw8IC9BIDw8IC9SIFsgMC4wIDAuMCAuNSBdID4+ID4+ID4+IDw8IC9QIFsgMTYgMTIgXSAvRGF0YSA8PCAvQSA8PCAvUiBbIC4xMjUgLjI1IC41IF0gL1AgNCA+PiA+PiA+PiA8PCAvUCBbIDE2IDE0IF0gL0RhdGEgPDwgL0EgPDwgL1IgWyAuMTI1IC4yNSAuNSBdIC9QIDQgPj4gPj4gPj4g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ACAAUgBHAEIpIC9GZWF0dXJlcyA8PCAvRm9udCAxIC9Gb250U2l6ZSAxMi4wIC9GYXV4Qm9sZCBmYWxzZSAvRmF1eEl0YWxpYyBmYWxzZSAvQXV0b0xlYWRpbmcgdHJ1ZSAvTGVhZGluZyAwLjAgL0hvcml6b250YWxTY2FsZSAxLjAgL1ZlcnRpY2FsU2NhbGUgMS4wIC9UcmFja2luZyAwIC9CYXNlbGluZVNoaWZ0IDAuMCAvQ2hhcmFjdGVyUm90YXRpb24gMC4wIC9BdXRvS2VybiAxIC9Gb250Q2FwcyAwIC9Gb250QmFzZWxpbmUgMCAvRm9udE9UUG9zaXRpb24gMCAvU3RyaWtldGhyb3VnaFBvc2l0aW9uIDAgL1VuZGVybGluZVBvc2l0aW9uIDAgL1VuZGVybGluZU9mZnNldCAwLjAgL0xpZ2F0dXJlcyB0cnVlIC9EaXNjcmV0aW9uYXJ5TGlnYXR1cmVzIGZhbHNlIC9Db250ZXh0dWFsTGlnYXR1cmVzIGZhbHNlIC9BbHRlcm5hdGVMaWdhdHVyZXMgZmFsc2UgL09sZFN0eWxlIGZhbHNlIC9GcmFjdGlvbnMgZmFsc2UgL09yZGluYWxzIGZhbHNlIC9Td2FzaCBmYWxzZSAvVGl0bGluZyBmYWxzZSAvQ29ubmVjdGlvbkZvcm1zIGZhbHNlIC9TdHlsaXN0aWNBbHRlcm5hdGVzIGZhbHNlIC9Pcm5hbWVudHMgZmFsc2UgL0ZpZ3VyZVN0eWxlIDAgL1Byb3BvcnRpb25hbE1ldHJpY3MgZmFsc2UgL0thbmEgZmFsc2UgL0l0YWxpY3MgZmFsc2UgL1J1YnkgZmFsc2UgL0Jhc2VsaW5lRGlyZWN0aW9uIDIgL1RzdW1lIDAuMCAvU3R5bGVSdW5BbGlnbm1lbnQgMiAvTGFuZ3VhZ2UgMCAvSmFwYW5lc2VBbHRlcm5hdGVGZWF0dXJlIDAgL0VuYWJsZVdhcmlDaHUgZmFsc2UgL1dhcmlDaHVMaW5lQ291bnQgMiAvV2FyaUNodUxpbmVHYXAgMCAvV2FyaUNodVN1YkxpbmVBbW91bnQgPDwgL1dhcmlDaHVTdWJMaW5lU2NhbGUgLjUgPj4gL1dhcmlDaHVXaWRvd0Ftb3VudCAyIC9XYXJpQ2h1T3JwaGFuQW1vdW50IDIgL1dhcmlDaHVKdXN0aWZpY2F0aW9uIDcgL1RDWVVwRG93bkFkanVzdG1lbnQgMCAvVENZTGVmdFJpZ2h0QWRqdXN0bWVudCAwIC9MZWZ0QWtpIC0xLjAgL1JpZ2h0QWtpIC0xLjAgL0ppRG9yaSAwIC9Ob0JyZWFrIGZhbHNlIC9GaWxsQ29sb3IgPDwgL1N0cmVhbVRhZyAvU2ltcGxlUGFpbnQgL0NvbG9yIDw8IC9UeXBlIDEgL1ZhbHVlcyBbIDEuMCAwLjAgMC4wIDAuMCBdID4+ID4+IC9TdHJva2VDb2xvciA8PCAvU3RyZWFtVGFnIC9TaW1wbGVQYWludCAvQ29sb3IgPDwgL1R5cGUgMSAvVmFsdWVzIFsgMS4wIDAuMCAwLjAgMC4wIF0gPj4gPj4gL0JsZW5kIDw8IC9TdHJlYW1UYWcgL1NpbXBsZUJsZW5kZXIgPj4gL0ZpbGxGbGFnIHRydWUgL1N0cm9rZUZsYWcgZmFsc2UgL0ZpbGxGaXJzdCB0cnVlIC9GaWxsT3ZlclByaW50IGZhbHNlIC9TdHJva2VPdmVyUHJpbnQgZmFsc2UgL0xpbmVDYXAgMCAvTGluZUpvaW4gMCAvTGluZVdpZHRoIDEuMCAvTWl0ZXJMaW1pdCA0LjAgL0xpbmVEYXNoT2Zmc2V0IDAuMCAvTGluZURhc2hBcnJheSBbIF0gL1R5cGUxRW5jb2RpbmdOYW1lcyBbIF0gL0thc2hpZGFzIDAgL0Rpck92ZXJyaWRlIDAgL0RpZ2l0U2V0IDAgL0RpYWNWUG9zIDQgL0RpYWNYT2Zmc2V0IDAuMCAvRGlhY1lPZmZzZXQgMC4wIC9PdmVybGFwU3dhc2ggZmFsc2UgL0p1c3RpZmljYXRpb25BbHRlcm5hdGVzIGZhbHNlIC9TdHJldGNoZWRBbHRlcm5hdGVzIGZhbHNlIC9GaWxsVmlzaWJsZUZsYWcgdHJ1ZSAvU3Ryb2tlVmlzaWJsZUZsYWcgdHJ1ZSA+PiA+PiA+PiBdIC9EaXNwbGF5TGlzdCBbIDw8IC9SZXNvdXJjZSAwID4+IF0gPj4gL1BhcmFncmFwaFNoZWV0U2V0IDw8IC9SZXNvdXJjZXMgWyA8PCAvUmVzb3VyY2UgPDwgL05hbWUgKP7/AE4AbwByAG0AYQBsACAAUgBHAEIpIC9GZWF0dXJlcyA8PCAvSnVzdGlmaWNhdGlvbiAwIC9GaXJzdExpbmVJbmRlbnQgMC4wIC9TdGFydEluZGVudCAwLjAgL0VuZEluZGVudCAwLjAgL1NwYWNlQmVmb3JlIDAuMCAvU3BhY2VBZnRlciAwLjAgL0Ryb3BDYXBzIDEgL0F1dG9MZWFkaW5nIDEuMiAvTGVhZGluZ1R5cGUgMCAvQXV0b0h5cGhlbmF0ZSB0cnVlIC9IeXBoZW5hdGVkV29yZFNpemUgNiAvUHJlSHlwaGVuIDIgL1Bvc3RIeXBoZW4gMiAvQ29uc2VjdXRpdmVIeXBoZW5zIDAgL1pvbmUgMzYuMCAvSHlwaGVuYXRlQ2FwaXRhbGl6ZWQgdHJ1ZSAvSHlwaGVuYXRpb25QcmVmZXJlbmNlIC41IC9Xb3JkU3BhY2luZyBbIC44IDEuMCAxLjMzIF0gL0xldHRlclNwYWNpbmcgWyAwLjAgMC4wIDAuMCBdIC9HbHlwaFNwYWNpbmcgWyAxLjAgMS4wIDEuMCBdIC9TaW5nbGVXb3JkSnVzdGlmaWNhdGlvbiA2IC9IYW5naW5nIGZhbHNlIC9BdXRvVENZIDAgL0tlZXBUb2dldGhlciB0cnVlIC9CdXJhc2FnYXJpVHlwZSAwIC9LaW5zb2t1T3JkZXIgMCAvS2luc29rdSAvbmlsIC9LdXJpa2Flc2hpTW9qaVNob3JpIGZhbHNlIC9Nb2ppS3VtaVRhYmxlIC9uaWwgL0V2ZXJ5TGluZUNvbXBvc2VyIGZhbHNlIC9UYWJTdG9wcyA8PCA+PiAvRGVmYXVsdFRhYldpZHRoIDM2LjAgL0RlZmF1bHRTdHlsZSA8PCA+PiAvUGFyYWdyYXBoRGlyZWN0aW9uIDAgL0p1c3RpZmljYXRpb25NZXRob2QgMCAvQ29tcG9zZXJFbmdpbmUgMCA+PiA+PiA+PiBdIC9EaXNwbGF5TGlzdCBbIDw8IC9SZXNvdXJjZSAwID4+IF0gPj4gL1RleHRGcmFtZVNldCA8PCAvUmVzb3VyY2VzIFsgPDwgL1Jlc291cmNlIDw8IC9CZXppZXIgPDwgL1BvaW50cyBbIDAuMCAwLjAgMC4wIDAuMCAwLjAgMC4wIDAuMCAwLjAgXSA+PiAvRGF0YSA8PCAvVHlwZSAwIC9MaW5lT3JpZW50YXRpb24gMCAvVGV4dE9uUGF0aFRSYW5nZSBbIC0xLjAgLTEuMCBdIC9Sb3dHdXR0ZXIgMC4wIC9Db2x1bW5HdXR0ZXIgMC4wIC9GaXJzdEJhc2VsaW5lQWxpZ25tZW50IDw8IC9GbGFnIDEgL01pbiAwLjAgPj4gL1BhdGhEYXRhIDw8IC9TcGFjaW5nIC0xID4+ID4+ID4+ID4+IDw8IC9SZXNvdXJjZSA8PCAvQmV6aWVyIDw8IC9Qb2ludHMgWyAwLjAgMC4wIDAuMCAwLjAgMC4wIDAuMCAwLjAgMC4wIF0gPj4gL0RhdGEgPDwgL1R5cGUgMCAvTGluZU9yaWVudGF0aW9uIDAgL1RleHRPblBhdGhUUmFuZ2UgWyAtMS4wIC0xLjAgXSAvUm93R3V0dGVyIDAuMCAvQ29sdW1uR3V0dGVyIDAuMCAvRmlyc3RCYXNlbGluZUFsaWdubWVudCA8PCAvRmxhZyAxIC9NaW4gMC4wID4+IC9QYXRoRGF0YSA8PCAvU3BhY2luZyAtMSA+PiA+PiA+PiA+PiA8PCAvUmVzb3VyY2UgPDwgL0JlemllciA8PCAvUG9pbnRzIFsgMC4wIDAuMCAwLjAgMC4wIDAuMCAwLjAgMC4wIDAuMCBdID4+IC9EYXRhIDw8IC9UeXBlIDAgL0xpbmVPcmllbnRhdGlvbiAwIC9UZXh0T25QYXRoVFJhbmdlIFsgLTEuMCAtMS4wIF0gL1Jvd0d1dHRlciAwLjAgL0NvbHVtbkd1dHRlciAwLjAgL0ZpcnN0QmFzZWxpbmVBbGlnbm1lbnQgPDwgL0ZsYWcgMSAvTWluIDAuMCA+PiAvUGF0aERhdGEgPDwgL1NwYWNpbmcgLTEgPj4gPj4gPj4gPj4gXSA+PiA+PiAvRG9jdW1lbnRPYmplY3RzIDw8IC9Eb2N1bWVudFNldHRpbmdzIDw8IC9IaWRkZW5HbHlwaEZvbnQgPDwgL0FsdGVybmF0ZUdseXBoRm9udCAyIC9XaGl0ZXNwYWNlQ2hhcmFjdGVyTWFwcGluZyBbIDw8IC9XaGl0ZXNwYWNlQ2hhcmFjdGVyICj+/wAgKSAvQWx0ZXJuYXRlQ2hhcmFjdGVyICj+/wAxKSA+PiA8PCAvV2hpdGVzcGFjZUNoYXJhY3RlciAo/v8ADSkgL0FsdGVybmF0ZUNoYXJhY3RlciAo/v8ANikgPj4gPDwgL1doaXRlc3BhY2VDaGFyYWN0ZXIgKP7/AAkpIC9BbHRlcm5hdGVDaGFyYWN0ZXIgKP7/ADApID4+IDw8IC9XaGl0ZXNwYWNlQ2hhcmFjdGVyICj+/yBcKSkgL0FsdGVybmF0ZUNoYXJhY3RlciAo/v8ANSkgPj4gPDwgL1doaXRlc3BhY2VDaGFyYWN0ZXIgKP7/AAMpIC9BbHRlcm5hdGVDaGFyYWN0ZXIgKP7/ADUpID4+IDw8IC9XaGl0ZXNwYWNlQ2hhcmFjdGVyICj+/zAAKSAvQWx0ZXJuYXRlQ2hhcmFjdGVyICj+/wAxKSA+PiA8PCAvV2hpdGVzcGFjZUNoYXJhY3RlciAo/v8ArSkgL0FsdGVybmF0ZUNoYXJhY3RlciAo/v8AMykgPj4gXSA+PiAvTm9ybWFsU3R5bGVTaGVldCAwIC9Ob3JtYWxQYXJhZ3JhcGhTaGVldCAwIC9TdXBlcnNjcmlwdFNpemUgLjU4MyAvU3VwZXJzY3JpcHRQb3NpdGlvbiAuMzMzIC9TdWJzY3JpcHRTaXplIC41ODMgL1N1YnNjcmlwdFBvc2l0aW9uIC4zMzMgL1NtYWxsQ2FwU2l6ZSAuNyAvVXNlU21hcnRRdW90ZXMgdHJ1ZSAvU21hcnRRdW90ZVNldHMgWyA8PCAvTGFuZ3VhZ2UgMCAvT3BlbkRvdWJsZVF1b3RlICj+/yAcKSAvQ2xvc2VEb3VibGVRdW90ZSAo/v8gHSkgL09wZW5TaW5nbGVRdW90ZSAo/v8gGCkgL0Nsb3NlU2luZ2xlUXVvdGUgKP7/IBkpID4+IDw8IC9MYW5ndWFnZSAxIC9PcGVuRG91YmxlUXVvdGUgKP7/IB0pIC9DbG9zZURvdWJsZVF1b3RlICj+/yAdKSAvT3BlblNpbmdsZVF1b3RlICj+/yAZKSAvQ2xvc2VTaW5nbGVRdW90ZSAo/v8gGSkgPj4gPDwgL0xhbmd1YWdlIDIgL09wZW5Eb3VibGVRdW90ZSAo/v8AqykgL0Nsb3NlRG91YmxlUXVvdGUgKP7/ALspIC9PcGVuU2luZ2xlUXVvdGUgKP7/IBgpIC9DbG9zZVNpbmdsZVF1b3RlICj+/yAZKSA+PiA8PCAvTGFuZ3VhZ2UgMyAvT3BlbkRvdWJsZVF1b3RlICj+/wCrKSAvQ2xvc2VEb3VibGVRdW90ZSAo/v8AuykgL09wZW5TaW5nbGVRdW90ZSAo/v8gGCkgL0Nsb3NlU2luZ2xlUXVvdGUgKP7/IBkpID4+IDw8IC9MYW5ndWFnZSA0IC9PcGVuRG91YmxlUXVvdGUgKP7/IB4pIC9DbG9zZURvdWJsZVF1b3RlICj+/yAcKSAvT3BlblNpbmdsZVF1b3RlICj+/yAaKSAvQ2xvc2VTaW5nbGVRdW90ZSAo/v8gGCkgPj4gPDwgL0xhbmd1YWdlIDUgL09wZW5Eb3VibGVRdW90ZSAo/v8gHikgL0Nsb3NlRG91YmxlUXVvdGUgKP7/IBwpIC9PcGVuU2luZ2xlUXVvdGUgKP7/IBopIC9DbG9zZVNpbmdsZVF1b3RlICj+/yAYKSA+PiA8PCAvTGFuZ3VhZ2UgNiAvT3BlbkRvdWJsZVF1b3RlICj+/wCrKSAvQ2xvc2VEb3VibGVRdW90ZSAo/v8AuykgL09wZW5TaW5nbGVRdW90ZSAo/v8gOSkgL0Nsb3NlU2luZ2xlUXVvdGUgKP7/IDopID4+IDw8IC9MYW5ndWFnZSA3IC9PcGVuRG91YmxlUXVvdGUgKP7/IBwpIC9DbG9zZURvdWJsZVF1b3RlICj+/yAdKSAvT3BlblNpbmdsZVF1b3RlICj+/yAYKSAvQ2xvc2VTaW5nbGVRdW90ZSAo/v8gGSkgPj4gPDwgL0xhbmd1YWdlIDggL09wZW5Eb3VibGVRdW90ZSAo/v8AqykgL0Nsb3NlRG91YmxlUXVvdGUgKP7/ALspIC9PcGVuU2luZ2xlUXVvdGUgKP7/IBgpIC9DbG9zZVNpbmdsZVF1b3RlICj+/yAZKSA+PiA8PCAvTGFuZ3VhZ2UgOSAvT3BlbkRvdWJsZVF1b3RlICj+/wCrKSAvQ2xvc2VEb3VibGVRdW90ZSAo/v8AuykgL09wZW5TaW5nbGVRdW90ZSAo/v8gGCkgL0Nsb3NlU2luZ2xlUXVvdGUgKP7/IBkpID4+IDw8IC9MYW5ndWFnZSAxMCAvT3BlbkRvdWJsZVF1b3RlICj+/yAcKSAvQ2xvc2VEb3VibGVRdW90ZSAo/v8gHSkgL09wZW5TaW5nbGVRdW90ZSAo/v8gGCkgL0Nsb3NlU2luZ2xlUXVvdGUgKP7/IBkpID4+IDw8IC9MYW5ndWFnZSAxMSAvT3BlbkRvdWJsZVF1b3RlICj+/yAcKSAvQ2xvc2VEb3VibGVRdW90ZSAo/v8gHSkgL09wZW5TaW5nbGVRdW90ZSAo/v8gGCkgL0Nsb3NlU2luZ2xlUXVvdGUgKP7/IBkpID4+IDw8IC9MYW5ndWFnZSAxMiAvT3BlbkRvdWJsZVF1b3RlICj+/yAcKSAvQ2xvc2VEb3VibGVRdW90ZSAo/v8gHSkgL09wZW5TaW5nbGVRdW90ZSAo/v8gGCkgL0Nsb3NlU2luZ2xlUXVvdGUgKP7/IBkpID4+IDw8IC9MYW5ndWFnZSAxMyAvT3BlbkRvdWJsZVF1b3RlICj+/yAdKSAvQ2xvc2VEb3VibGVRdW90ZSAo/v8gHSkgL09wZW5TaW5nbGVRdW90ZSAo/v8gGSkgL0Nsb3NlU2luZ2xlUXVvdGUgKP7/IBkpID4+IDw8IC9MYW5ndWFnZSAxNCAvT3BlbkRvdWJsZVF1b3RlICj+/yAcKSAvQ2xvc2VEb3VibGVRdW90ZSAo/v8gHSkgL09wZW5TaW5nbGVRdW90ZSAo/v8gGCkgL0Nsb3NlU2luZ2xlUXVvdGUgKP7/IBkpID4+IDw8IC9MYW5ndWFnZSAxNSAvT3BlbkRvdWJsZVF1b3RlICj+/yAcKSAvQ2xvc2VEb3VibGVRdW90ZSAo/v8gHSkgL09wZW5TaW5nbGVRdW90ZSAo/v8gGCkgL0Nsb3NlU2luZ2xlUXVvdGUgKP7/IBkpID4+IDw8IC9MYW5ndWFnZSAxNiAvT3BlbkRvdWJsZVF1b3RlICj+/yAdKSAvQ2xvc2VEb3VibGVRdW90ZSAo/v8gHSkgL09wZW5TaW5nbGVRdW90ZSAo/v8gGSkgL0Nsb3NlU2luZ2xlUXVvdGUgKP7/IBkpID4+IDw8IC9MYW5ndWFnZSAxNyAvT3BlbkRvdWJsZVF1b3RlICj+/yAcKSAvQ2xvc2VEb3VibGVRdW90ZSAo/v8gHSkgL09wZW5TaW5nbGVRdW90ZSAo/v8gGCkgL0Nsb3NlU2luZ2xlUXVvdGUgKP7/IBkpID4+IDw8IC9MYW5ndWFnZSAxOCAvT3BlbkRvdWJsZVF1b3RlICj+/wCrKSAvQ2xvc2VEb3VibGVRdW90ZSAo/v8AuykgL09wZW5TaW5nbGVRdW90ZSAo/v8gGCkgL0Nsb3NlU2luZ2xlUXVvdGUgKP7/IBkpID4+IDw8IC9MYW5ndWFnZSAxOSAvT3BlbkRvdWJsZVF1b3RlICj+/wCrKSAvQ2xvc2VEb3VibGVRdW90ZSAo/v8AuykgL09wZW5TaW5nbGVRdW90ZSAo/v8gGCkgL0Nsb3NlU2luZ2xlUXVvdGUgKP7/IBkpID4+IDw8IC9MYW5ndWFnZSAyMCAvT3BlbkRvdWJsZVF1b3RlICj+/yAeKSAvQ2xvc2VEb3VibGVRdW90ZSAo/v8gHCkgL09wZW5TaW5nbGVRdW90ZSAo/v8gGikgL0Nsb3NlU2luZ2xlUXVvdGUgKP7/IBgpID4+IDw8IC9MYW5ndWFnZSAyMSAvT3BlbkRvdWJsZVF1b3RlICj+/yAeKSAvQ2xvc2VEb3VibGVRdW90ZSAo/v8gHCkgL09wZW5TaW5nbGVRdW90ZSAo/v8gGikgL0Nsb3NlU2luZ2xlUXVvdGUgKP7/IBgpID4+IDw8IC9MYW5ndWFnZSAyMiAvT3BlbkRvdWJsZVF1b3RlICj+/yAeKSAvQ2xvc2VEb3VibGVRdW90ZSAo/v8gHCkgL09wZW5TaW5nbGVRdW90ZSAo/v8gGikgL0Nsb3NlU2luZ2xlUXVvdGUgKP7/IBgpID4+IDw8IC9MYW5ndWFnZSAyMyAvT3BlbkRvdWJsZVF1b3RlICj+/yAeKSAvQ2xvc2VEb3VibGVRdW90ZSAo/v8gHSkgL09wZW5TaW5nbGVRdW90ZSAo/v8gGCkgL0Nsb3NlU2luZ2xlUXVvdGUgKP7/IBkpID4+IDw8IC9MYW5ndWFnZSAyNCAvT3BlbkRvdWJsZVF1b3RlICj+/yAeKSAvQ2xvc2VEb3VibGVRdW90ZSAo/v8gHSkgL09wZW5TaW5nbGVRdW90ZSAo/v8gGikgL0Nsb3NlU2luZ2xlUXVvdGUgKP7/IBkpID4+IDw8IC9MYW5ndWFnZSAyNSAvT3BlbkRvdWJsZVF1b3RlICj+/wCrKSAvQ2xvc2VEb3VibGVRdW90ZSAo/v8AuykgL09wZW5TaW5nbGVRdW90ZSAo/v8gOSkgL0Nsb3NlU2luZ2xlUXVvdGUgKP7/IDopID4+IDw8IC9MYW5ndWFnZSAyNiAvT3BlbkRvdWJsZVF1b3RlICj+/yAcKSAvQ2xvc2VEb3VibGVRdW90ZSAo/v8gHSkgL09wZW5TaW5nbGVRdW90ZSAo/v8gGCkgL0Nsb3NlU2luZ2xlUXVvdGUgKP7/IBkpID4+IDw8IC9MYW5ndWFnZSAyNyAvT3BlbkRvdWJsZVF1b3RlICj+/yAcKSAvQ2xvc2VEb3VibGVRdW90ZSAo/v8gHSkgL09wZW5TaW5nbGVRdW90ZSAo/v8gGCkgL0Nsb3NlU2luZ2xlUXVvdGUgKP7/IBkpID4+IDw8IC9MYW5ndWFnZSAyOCAvT3BlbkRvdWJsZVF1b3RlICj+/yAeKSAvQ2xvc2VEb3VibGVRdW90ZSAo/v8gHSkgL09wZW5TaW5nbGVRdW90ZSAo/v8gGSkgL0Nsb3NlU2luZ2xlUXVvdGUgKP7/IBkpID4+IDw8IC9MYW5ndWFnZSAyOSAvT3BlbkRvdWJsZVF1b3RlICj+/zAdKSAvQ2xvc2VEb3VibGVRdW90ZSAo/v8wHikgPj4gPDwgL0xhbmd1YWdlIDMwIC9PcGVuRG91YmxlUXVvdGUgKP7/MAwpIC9DbG9zZURvdWJsZVF1b3RlICj+/zANKSA+PiA8PCAvTGFuZ3VhZ2UgMzEgL09wZW5Eb3VibGVRdW90ZSAo/v8gHikgL0Nsb3NlRG91YmxlUXVvdGUgKP7/IBwpIC9PcGVuU2luZ2xlUXVvdGUgKP7/IBgpIC9DbG9zZVNpbmdsZVF1b3RlICj+/yAZKSA+PiA8PCAvTGFuZ3VhZ2UgMzIgL09wZW5Eb3VibGVRdW90ZSAo/v8gHCkgL0Nsb3NlRG91YmxlUXVvdGUgKP7/IB0pIC9PcGVuU2luZ2xlUXVvdGUgKP7/IBgpIC9DbG9zZVNpbmdsZVF1b3RlICj+/yAZKSA+PiA8PCAvTGFuZ3VhZ2UgMzMgL09wZW5Eb3VibGVRdW90ZSAo/v8gHikgL0Nsb3NlRG91YmxlUXVvdGUgKP7/IBwpIC9PcGVuU2luZ2xlUXVvdGUgKP7/IBopIC9DbG9zZVNpbmdsZVF1b3RlICj+/yAYKSA+PiA8PCAvTGFuZ3VhZ2UgMzQgL09wZW5Eb3VibGVRdW90ZSAo/v8AqykgL0Nsb3NlRG91YmxlUXVvdGUgKP7/ALspIC9PcGVuU2luZ2xlUXVvdGUgKP7/IBgpIC9DbG9zZVNpbmdsZVF1b3RlICj+/yAZKSA+PiA8PCAvTGFuZ3VhZ2UgMzUgL09wZW5Eb3VibGVRdW90ZSAo/v8gHCkgL0Nsb3NlRG91YmxlUXVvdGUgKP7/IB0pIC9PcGVuU2luZ2xlUXVvdGUgKP7/IBgpIC9DbG9zZVNpbmdsZVF1b3RlICj+/yAZKSA+PiA8PCAvTGFuZ3VhZ2UgMzYgL09wZW5Eb3VibGVRdW90ZSAo/v8gHikgL0Nsb3NlRG91YmxlUXVvdGUgKP7/IBwpIC9PcGVuU2luZ2xlUXVvdGUgKP7/IBopIC9DbG9zZVNpbmdsZVF1b3RlICj+/yAYKSA+PiA8PCAvTGFuZ3VhZ2UgMzcgL09wZW5Eb3VibGVRdW90ZSAo/v8AqykgL0Nsb3NlRG91YmxlUXVvdGUgKP7/ALspIC9PcGVuU2luZ2xlUXVvdGUgKP7/IBgpIC9DbG9zZVNpbmdsZVF1b3RlICj+/yAZKSA+PiA8PCAvTGFuZ3VhZ2UgMzggL09wZW5Eb3VibGVRdW90ZSAo/v8gHikgL0Nsb3NlRG91YmxlUXVvdGUgKP7/IBwpIC9PcGVuU2luZ2xlUXVvdGUgKP7/IBopIC9DbG9zZVNpbmdsZVF1b3RlICj+/yAYKSA+PiA8PCAvTGFuZ3VhZ2UgMzkgL09wZW5Eb3VibGVRdW90ZSAo/v8AqykgL0Nsb3NlRG91YmxlUXVvdGUgKP7/ALspIC9PcGVuU2luZ2xlUXVvdGUgKP7/ADwpIC9DbG9zZVNpbmdsZVF1b3RlICj+/wA+KSA+PiA8PCAvTGFuZ3VhZ2UgNDAgL09wZW5Eb3VibGVRdW90ZSAo/v8gHikgL0Nsb3NlRG91YmxlUXVvdGUgKP7/IBwpIC9PcGVuU2luZ2xlUXVvdGUgKP7/IBopIC9DbG9zZVNpbmdsZVF1b3RlICj+/yAYKSA+PiA8PCAvTGFuZ3VhZ2UgNDEgL09wZW5Eb3VibGVRdW90ZSAo/v8AqykgL0Nsb3NlRG91YmxlUXVvdGUgKP7/ALspIC9PcGVuU2luZ2xlUXVvdGUgKP7/ADwpIC9DbG9zZVNpbmdsZVF1b3RlICj+/wA+KSA+PiA8PCAvTGFuZ3VhZ2UgNDIgL09wZW5Eb3VibGVRdW90ZSAo/v8gHikgL0Nsb3NlRG91YmxlUXVvdGUgKP7/IBwpIC9PcGVuU2luZ2xlUXVvdGUgKP7/IBopIC9DbG9zZVNpbmdsZVF1b3RlICj+/yAYKSA+PiA8PCAvTGFuZ3VhZ2UgNDMgL09wZW5Eb3VibGVRdW90ZSAo/v8gHCkgL0Nsb3NlRG91YmxlUXVvdGUgKP7/IB0pIC9PcGVuU2luZ2xlUXVvdGUgKP7/IBgpIC9DbG9zZVNpbmdsZVF1b3RlICj+/yAZKSA+PiA8PCAvTGFuZ3VhZ2UgNDQgL09wZW5Eb3VibGVRdW90ZSAo/v8AqykgL0Nsb3NlRG91YmxlUXVvdGUgKP7/ALspIC9PcGVuU2luZ2xlUXVvdGUgKP7/IDkpIC9DbG9zZVNpbmdsZVF1b3RlICj+/yA6KSA+PiA8PCAvTGFuZ3VhZ2UgNDUgL09wZW5Eb3VibGVRdW90ZSAo/v8gHCkgL0Nsb3NlRG91YmxlUXVvdGUgKP7/IB0pIC9PcGVuU2luZ2xlUXVvdGUgKP7/IBgpIC9DbG9zZVNpbmdsZVF1b3RlICj+/yAZKSA+PiBdID4+IC9UZXh0T2JqZWN0cyBbIDw8IC9Nb2RlbCA8PCAvVGV4dCAo/v8AQwBTAFMADSkgL1BhcmFncmFwaFJ1biA8PCAvUnVuQXJyYXkgWyA8PCAvUnVuRGF0YSA8PCAvUGFyYWdyYXBoU2hlZXQgPDwgL05hbWUgKP7/KSAvRmVhdHVyZXMgPDwgL0p1c3RpZmljYXRpb24gMCAvRmlyc3RMaW5lSW5kZW50IDAuMCAvU3RhcnRJbmRlbnQgMC4wIC9FbmRJbmRlbnQgMC4wIC9TcGFjZUJlZm9yZSAwLjAgL1NwYWNlQWZ0ZXIgMC4wIC9Ecm9wQ2FwcyAxIC9BdXRvTGVhZGluZyAxLjIgL0xlYWRpbmdUeXBlIDAgL0F1dG9IeXBoZW5hdGUgdHJ1ZSAvSHlwaGVuYXRlZFdvcmRTaXplIDYgL1ByZUh5cGhlbiAyIC9Qb3N0SHlwaGVuIDIgL0NvbnNlY3V0aXZlSHlwaGVucyAwIC9ab25lIDM2LjAgL0h5cGhlbmF0ZUNhcGl0YWxpemVkIHRydWUgL0h5cGhlbmF0aW9uUHJlZmVyZW5jZSAuNSAvV29yZFNwYWNpbmcgWyAuOCAxLjAgMS4zMyBdIC9MZXR0ZXJTcGFjaW5nIFsgMC4wIDAuMCAwLjAgXSAvR2x5cGhTcGFjaW5nIFsgMS4wIDEuMCAxLjAgXSAvU2luZ2xlV29yZEp1c3RpZmljYXRpb24gNiAvSGFuZ2luZyBmYWxzZSAvQXV0b1RDWSAxIC9LZWVwVG9nZXRoZXIgdHJ1ZSAvQnVyYXNhZ2FyaVR5cGUgMCAvS2luc29rdU9yZGVyIDAgL0tpbnNva3UgL25pbCAvS3VyaWthZXNoaU1vamlTaG9yaSBmYWxzZSAvTW9qaUt1bWlUYWJsZSAvbmlsIC9FdmVyeUxpbmVDb21wb3NlciBmYWxzZSAvVGFiU3RvcHMgPDwgPj4gL0RlZmF1bHRUYWJXaWR0aCAzNi4wIC9EZWZhdWx0U3R5bGUgPDwgL0ZvbnQgMSAvRm9udFNpemUgMTIuMCAvRmF1eEJvbGQgZmFsc2UgL0ZhdXhJdGFsaWMgZmFsc2UgL0F1dG9MZWFkaW5nIHRydWUgL0xlYWRpbmcgMC4wIC9Ib3Jpem9udGFsU2NhbGUgMS4wIC9WZXJ0aWNhbFNjYWxlIDEuMCAvVHJhY2tpbmcgMCAvQmFzZWxpbmVTaGlmdCAwLjAgL0NoYXJhY3RlclJvdGF0aW9uIDAuMCAvQXV0b0tlcm4gMSAvRm9udENhcHMgMCAvRm9udEJhc2VsaW5lIDAgL0ZvbnRPVFBvc2l0aW9uIDAgL1N0cmlrZXRocm91Z2hQb3NpdGlvbiAwIC9VbmRlcmxpbmVQb3NpdGlvbiAwIC9VbmRlcmxpbmVPZmZzZXQgMC4wIC9MaWdhdHVyZXMgdHJ1ZSAvRGlzY3JldGlvbmFyeUxpZ2F0dXJlcyBmYWxzZSAvQ29udGV4dHVhbExpZ2F0dXJlcyBmYWxzZSAvQWx0ZXJuYXRlTGlnYXR1cmVzIGZhbHNlIC9PbGRTdHlsZSBmYWxzZSAvRnJhY3Rpb25zIGZhbHNlIC9PcmRpbmFscyBmYWxzZSAvU3dhc2ggZmFsc2UgL1RpdGxpbmcgZmFsc2UgL0Nvbm5lY3Rpb25Gb3JtcyBmYWxzZSAvU3R5bGlzdGljQWx0ZXJuYXRlcyBmYWxzZSAvT3JuYW1lbnRzIGZhbHNlIC9GaWd1cmVTdHlsZSAwIC9Qcm9wb3J0aW9uYWxNZXRyaWNzIGZhbHNlIC9LYW5hIGZhbHNlIC9JdGFsaWNzIGZhbHNlIC9SdWJ5IGZhbHNlIC9CYXNlbGluZURpcmVjdGlvbiAyIC9Uc3VtZSAwLjAgL1N0eWxlUnVuQWxpZ25tZW50IDIgL0xhbmd1YWdlIDAgL0phcGFuZXNlQWx0ZXJuYXRlRmVhdHVyZSAwIC9FbmFibGVXYXJpQ2h1IGZhbHNlIC9XYXJpQ2h1TGluZUNvdW50IDIgL1dhcmlDaHVMaW5lR2FwIDAgL1dhcmlDaHVTdWJMaW5lQW1vdW50IDw8IC9XYXJpQ2h1U3ViTGluZVNjYWxlIC41ID4+IC9XYXJpQ2h1V2lkb3dBbW91bnQgMiAvV2FyaUNodU9ycGhhbkFtb3VudCAyIC9XYXJpQ2h1SnVzdGlmaWNhdGlvbiA3IC9UQ1lVcERvd25BZGp1c3RtZW50IDAgL1RDWUxlZnRSaWdodEFkanVzdG1lbnQgMCAvTGVmdEFraSAtMS4wIC9SaWdodEFraSAtMS4wIC9KaURvcmkgMCAvTm9CcmVhayBmYWxzZSAvRmlsbENvbG9yIDw8IC9TdHJlYW1UYWcgL1NpbXBsZVBhaW50IC9Db2xvciA8PCAvVHlwZSAxIC9WYWx1ZXMgWyAxLjAgMC4wIDAuMCAwLjAgXSA+PiA+PiAvU3Ryb2tlQ29sb3IgPDwgL1N0cmVhbVRhZyAvU2ltcGxlUGFpbnQgL0NvbG9yIDw8IC9UeXBlIDEgL1ZhbHVlcyBbIDEuMCAwLjAgMC4wIDAuMCBdID4+ID4+IC9CbGVuZCA8PCAvU3RyZWFtVGFnIC9TaW1wbGVCbGVuZGVyID4+IC9GaWxsRmxhZyB0cnVlIC9TdHJva2VGbGFnIGZhbHNlIC9GaWxsRmlyc3QgdHJ1ZSAvRmlsbE92ZXJQcmludCBmYWxzZSAvU3Ryb2tlT3ZlclByaW50IGZhbHNlIC9MaW5lQ2FwIDAgL0xpbmVKb2luIDAgL0xpbmVXaWR0aCAxLjAgL01pdGVyTGltaXQgNC4wIC9MaW5lRGFzaE9mZnNldCAwLjAgL0xpbmVEYXNoQXJyYXkgWyBdIC9UeXBlMUVuY29kaW5nTmFtZXMgWyBdIC9LYXNoaWRhcyAwIC9EaXJPdmVycmlkZSAwIC9EaWdpdFNldCAwIC9EaWFjVlBvcyA0IC9EaWFjWE9mZnNldCAwLjAgL0RpYWNZT2Zmc2V0IDAuMCAvT3ZlcmxhcFN3YXNoIGZhbHNlIC9KdXN0aWZpY2F0aW9uQWx0ZXJuYXRlcyBmYWxzZSAvU3RyZXRjaGVkQWx0ZXJuYXRlcyBmYWxzZSAvRmlsbFZpc2libGVGbGFnIHRydWUgL1N0cm9rZVZpc2libGVGbGFnIHRydWUgPj4gL1BhcmFncmFwaERpcmVjdGlvbiAwIC9KdXN0aWZpY2F0aW9uTWV0aG9kIDAgL0NvbXBvc2VyRW5naW5lIDAgPj4gL1BhcmVudCAwID4+ID4+IC9MZW5ndGggNCA+PiBdID4+IC9TdHlsZVJ1biA8PCAvUnVuQXJyYXkgWyA8PCAvUnVuRGF0YSA8PCAvU3R5bGVTaGVldCA8PCAvTmFtZSAo/v8pIC9QYXJlbnQgMCAvRmVhdHVyZXMgPDwgL0ZvbnQgMCAvRm9udFNpemUgNzIuMCAvRmF1eEJvbGQgZmFsc2UgL0ZhdXhJdGFsaWMgZmFsc2UgL0F1dG9MZWFkaW5nIHRydWUgL0xlYWRpbmcgLjAxIC9Ib3Jpem9udGFsU2NhbGUgMS4wIC9WZXJ0aWNhbFNjYWxlIDEuMCAvVHJhY2tpbmcgMCAvQmFzZWxpbmVTaGlmdCAwLjAgL0NoYXJhY3RlclJvdGF0aW9uIDAuMCAvQXV0b0tlcm4gMSAvRm9udENhcHMgMCAvRm9udEJhc2VsaW5lIDAgL0ZvbnRPVFBvc2l0aW9uIDAgL1N0cmlrZXRocm91Z2hQb3NpdGlvbiAwIC9VbmRlcmxpbmVQb3NpdGlvbiAwIC9VbmRlcmxpbmVPZmZzZXQgMC4wIC9MaWdhdHVyZXMgdHJ1ZSAvRGlzY3JldGlvbmFyeUxpZ2F0dXJlcyBmYWxzZSAvQ29udGV4dHVhbExpZ2F0dXJlcyB0cnVlIC9BbHRlcm5hdGVMaWdhdHVyZXMgZmFsc2UgL09sZFN0eWxlIGZhbHNlIC9GcmFjdGlvbnMgZmFsc2UgL09yZGluYWxzIGZhbHNlIC9Td2FzaCBmYWxzZSAvVGl0bGluZyBmYWxzZSAvQ29ubmVjdGlvbkZvcm1zIHRydWUgL1N0eWxpc3RpY0FsdGVybmF0ZXMgZmFsc2UgL09ybmFtZW50cyBmYWxzZSAvRmlndXJlU3R5bGUgMCAvUHJvcG9ydGlvbmFsTWV0cmljcyBmYWxzZSAvS2FuYSBmYWxzZSAvSXRhbGljcyBmYWxzZSAvUnVieSBmYWxzZSAvQmFzZWxpbmVEaXJlY3Rpb24gMSAvVHN1bWUgMC4wIC9TdHlsZVJ1bkFsaWdubWVudCAyIC9MYW5ndWFnZSAwIC9KYXBhbmVzZUFsdGVybmF0ZUZlYXR1cmUgMCAvRW5hYmxlV2FyaUNodSBmYWxzZSAvV2FyaUNodUxpbmVDb3VudCAyIC9XYXJpQ2h1TGluZUdhcCAwIC9XYXJpQ2h1U3ViTGluZUFtb3VudCA8PCAvV2FyaUNodVN1YkxpbmVTY2FsZSAuNSA+PiAvV2FyaUNodVdpZG93QW1vdW50IDIgL1dhcmlDaHVPcnBoYW5BbW91bnQgMiAvV2FyaUNodUp1c3RpZmljYXRpb24gNyAvVENZVXBEb3duQWRqdXN0bWVudCAwIC9UQ1lMZWZ0UmlnaHRBZGp1c3RtZW50IDAgL0xlZnRBa2kgLTEuMCAvUmlnaHRBa2kgLTEuMCAvSmlEb3JpIDAgL05vQnJlYWsgZmFsc2UgL0ZpbGxDb2xvciA8PCAvU3RyZWFtVGFnIC9TaW1wbGVQYWludCAvQ29sb3IgPDwgL1R5cGUgMSAvVmFsdWVzIFsgMS4wIC4wMDYzOCAuMTExNTEgLjMyNTQ5IF0gPj4gPj4gL1N0cm9rZUNvbG9yIDw8IC9TdHJlYW1UYWcgL1NpbXBsZVBhaW50IC9Db2xvciA8PCAvVHlwZSAxIC9WYWx1ZXMgWyAxLjAgMS4wIDEuMCAxLjAgXSA+PiA+PiAvQmxlbmQgPDwgL1N0cmVhbVRhZyAvU2ltcGxlQmxlbmRlciA+PiAvRmlsbEZsYWcgdHJ1ZSAvU3Ryb2tlRmxhZyBmYWxzZSAvRmlsbEZpcnN0IGZhbHNlIC9GaWxsT3ZlclByaW50IGZhbHNlIC9TdHJva2VPdmVyUHJpbnQgZmFsc2UgL0xpbmVDYXAgMCAvTGluZUpvaW4gMCAvTGluZVdpZHRoIDEuMCAvTWl0ZXJMaW1pdCA0LjAgL0xpbmVEYXNoT2Zmc2V0IDAuMCAvTGluZURhc2hBcnJheSBbIF0gL1R5cGUxRW5jb2RpbmdOYW1lcyBbIF0gL0thc2hpZGFzIDAgL0Rpck92ZXJyaWRlIDAgL0RpZ2l0U2V0IDAgL0RpYWNWUG9zIDQgL0RpYWNYT2Zmc2V0IDAuMCAvRGlhY1lPZmZzZXQgMC4wIC9PdmVybGFwU3dhc2ggZmFsc2UgL0p1c3RpZmljYXRpb25BbHRlcm5hdGVzIGZhbHNlIC9TdHJldGNoZWRBbHRlcm5hdGVzIGZhbHNlIC9GaWxsVmlzaWJsZUZsYWcgdHJ1ZSAvU3Ryb2tlVmlzaWJsZUZsYWcgdHJ1ZSA+PiA+PiA+PiAvTGVuZ3RoIDQgPj4gXSA+PiAvS2VyblJ1biA8PCAvUnVuQXJyYXkgWyA8PCAvUnVuRGF0YSA8PCA+PiAvTGVuZ3RoIDQgPj4gXSA+PiAvQWx0ZXJuYXRlR2x5cGhSdW4gPDwgL1J1bkFycmF5IFsgPDwgL1J1bkRhdGEgPDwgPj4gL0xlbmd0aCA0ID4+IF0gPj4gL1N0b3J5U2hlZXQgPDwgL0FudGlBbGlhcyA0IC9Vc2VGcmFjdGlvbmFsR2x5cGhXaWR0aHMgdHJ1ZSA+PiA+PiAvVmlldyA8PCAvRnJhbWVzIFsgPDwgL1Jlc291cmNlIDEgPj4gXSAvUmVuZGVyZWREYXRhIDw8IC9SdW5BcnJheSBbIDw8IC9SdW5EYXRhIDw8IC9MaW5lQ291bnQgMSA+PiAvTGVuZ3RoIDQgPj4gXSA+PiAvU3RyaWtlcyBbIDw8IC9TdHJlYW1UYWcgL1BhdGhTZWxlY3RHcm91cENoYXJhY3RlciAvVHJhbnNmb3JtIDw8IC9PcmlnaW4gWyAwLjAgMC4wIF0gPj4gL0JvdW5kcyBbIDAuMCAwLjAgMC4wIDAuMCBdIC9DaGlsZFByb2Nlc3Npb24gMCAvQ2hpbGRyZW4gWyA8PCAvU3RyZWFtVGFnIC9GcmFtZVN0cmlrZSAvRnJhbWUgMSAvVHJhbnNmb3JtIDw8IC9PcmlnaW4gWyAwLjAgMC4wIF0gPj4gL0JvdW5kcyBbIDAuMCAwLjAgMC4wIDAuMCBdIC9DaGlsZFByb2Nlc3Npb24gMiAvQ2hpbGRyZW4gWyA8PCAvU3RyZWFtVGFnIC9Sb3dDb2xTdHJpa2UgL1Jvd0NvbEluZGV4IDAgL1RyYW5zZm9ybSA8PCAvT3JpZ2luIFsgMC4wIDAuMCBdID4+IC9Cb3VuZHMgWyAwLjAgMC4wIDAuMCAwLjAgXSAvQ2hpbGRQcm9jZXNzaW9uIDEgL0NoaWxkcmVuIFsgPDwgL1N0cmVhbVRhZyAvUm93Q29sU3RyaWtlIC9Sb3dDb2xJbmRleCAwIC9UcmFuc2Zvcm0gPDwgL09yaWdpbiBbIDAuMCAwLjAgXSA+PiAvQm91bmRzIFsgMC4wIDAuMCAwLjAgMC4wIF0gL0NoaWxkUHJvY2Vzc2lvbiAyIC9DaGlsZHJlbiBbIDw8IC9TdHJlYW1UYWcgL0xpbmVTdHJpa2UgL0Jhc2VsaW5lIDAuMCAvTGVhZGluZyA4Ni40IC9FTUhlaWdodCA3Mi4wIC9ESGVpZ2h0IDQ4Ljg4Njk2IC9TZWxlY3Rpb25Bc2NlbnQgLTYwLjQ0MzQ4IC9TZWxlY3Rpb25EZXNjZW50IDE5LjQ0MTQxIC9UcmFuc2Zvcm0gPDwgL09yaWdpbiBbIDAuMCAwLjAgXSA+PiAvQm91bmRzIFsgMC4wIC02MC40NDM0OCAwLjAgMTkuNDQxNDEgXSAvQ2hpbGRQcm9jZXNzaW9uIDEgL0NoaWxkcmVuIFsgPDwgL1N0cmVhbVRhZyAvU2VnbWVudCAvTWFwcGluZyA8PCAvQ2hhcmFjdGVyQ291bnQgNCAvR2x5cGhDb3VudCAwIC9XUlZhbGlkIGZhbHNlID4+IC9GaXJzdENoYXJhY3RlckluZGV4SW5TZWdtZW50IDAgL1RyYW5zZm9ybSA8PCAvT3JpZ2luIFsgMC4wIDAuMCBdID4+IC9Cb3VuZHMgWyAwLjAgMC4wIDAuMCAwLjAgXSAvQ2hpbGRQcm9jZXNzaW9uIDEgL0NoaWxkcmVuIFsgPDwgL1N0cmVhbVRhZyAvR2x5cGhTdHJpa2UgL1RyYW5zZm9ybSA8PCAvT3JpZ2luIFsgMC4wIDAuMCBdID4+IC9Cb3VuZHMgWyAwLjAgLTYwLjQ0MzQ4IDE0Ny43MjY1NiAxOS40NDE0MSBdIC9HbHlwaHMgWyAzOCA1NCA1NCAzIF0gL0dseXBoQWRqdXN0bWVudHMgPDwgL0RhdGEgWyA8PCA+PiBdIC9SdW5MZW5ndGhzIFsgNCBdID4+IC9WaXN1YWxCb3VuZHMgWyAwLjAgLTYwLjQ0MzQ4IDE0Ny43MjY1NiAxOS40NDE0MSBdIC9SZW5kZXJlZEJvdW5kcyBbIDAuMCAtNjAuNDQzNDggMTQ3LjcyNjU2IDE5LjQ0MTQxIF0gL0ludmFsaWRhdGlvbiBbIDAuMCAtNjAuNDQzNDggMTgyLjI4NjI1IDE5LjQ0MTQxIF0gL1NoYWRvd1N0eWxlc1J1biA8PCAvRGF0YSBbIDw8IC9JbmRleCAwIC9Gb250IDAgL1NjYWxlIFsgMS4wIDEuMCBdIC9PcmllbnRhdGlvbiAwIC9CYXNlbGluZURpcmVjdGlvbiAyIC9CYXNlbGluZVNoaWZ0IDAuMCAvS2VyblR5cGUgMSAvRW1iZWRkaW5nTGV2ZWwgMCAvQ29tcGxlbWVudGFyeUZvbnRJbmRleCAwID4+IF0gL1J1bkxlbmd0aHMgWyA0IF0gPj4gL0VuZHNJbkNSIHRydWUgL1NlbGVjdGlvbkFzY2VudCAtNjAuNDQzNDggL1NlbGVjdGlvbkRlc2NlbnQgMTkuNDQxNDEgL01haW5EaXIgMCA+PiBdID4+IF0gPj4gXSA+PiBdID4+IF0gPj4gXSA+PiBdID4+IC9PcHRpY2FsQWxpZ25tZW50IGZhbHNlID4+IDw8IC9Nb2RlbCA8PCAvVGV4dCAo/v8ASgBTAA0pIC9QYXJhZ3JhcGhSdW4gPDwgL1J1bkFycmF5IFsgPDwgL1J1bkRhdGEgPDwgL1BhcmFncmFwaFNoZWV0IDw8IC9OYW1lICj+/ykgL0ZlYXR1cmVzIDw8IC9KdXN0aWZpY2F0aW9uIDAgL0ZpcnN0TGluZUluZGVudCAwLjAgL1N0YXJ0SW5kZW50IDAuMCAvRW5kSW5kZW50IDAuMCAvU3BhY2VCZWZvcmUgMC4wIC9TcGFjZUFmdGVyIDAuMCAvRHJvcENhcHMgMSAvQXV0b0xlYWRpbmcgMS4yIC9MZWFkaW5nVHlwZSAwIC9BdXRvSHlwaGVuYXRlIHRydWUgL0h5cGhlbmF0ZWRXb3JkU2l6ZSA2IC9QcmVIeXBoZW4gMiAvUG9zdEh5cGhlbiAyIC9Db25zZWN1dGl2ZUh5cGhlbnMgMCAvWm9uZSAzNi4wIC9IeXBoZW5hdGVDYXBpdGFsaXplZCB0cnVlIC9IeXBoZW5hdGlvblByZWZlcmVuY2UgLjUgL1dvcmRTcGFjaW5nIFsgLjggMS4wIDEuMzMgXSAvTGV0dGVyU3BhY2luZyBbIDAuMCAwLjAgMC4wIF0gL0dseXBoU3BhY2luZyBbIDEuMCAxLjAgMS4wIF0gL1NpbmdsZVdvcmRKdXN0aWZpY2F0aW9uIDYgL0hhbmdpbmcgZmFsc2UgL0F1dG9UQ1kgMSAvS2VlcFRvZ2V0aGVyIHRydWUgL0J1cmFzYWdhcmlUeXBlIDAgL0tpbnNva3VPcmRlciAwIC9LaW5zb2t1IC9uaWwgL0t1cmlrYWVzaGlNb2ppU2hvcmkgZmFsc2UgL01vamlLdW1pVGFibGUgL25pbCAvRXZlcnlMaW5lQ29tcG9zZXIgZmFsc2UgL1RhYlN0b3BzIDw8ID4+IC9EZWZhdWx0VGFiV2lkdGggMzYuMCAvRGVmYXVsdFN0eWxlIDw8IC9Gb250IDEgL0ZvbnRTaXplIDEyLjAgL0ZhdXhCb2xkIGZhbHNlIC9GYXV4SXRhbGljIGZhbHNlIC9BdXRvTGVhZGluZyB0cnVlIC9MZWFkaW5nIDAuMCAvSG9yaXpvbnRhbFNjYWxlIDEuMCAvVmVydGljYWxTY2FsZSAxLjAgL1RyYWNraW5nIDAgL0Jhc2VsaW5lU2hpZnQgMC4wIC9DaGFyYWN0ZXJSb3RhdGlvbiAwLjAgL0F1dG9LZXJuIDEgL0ZvbnRDYXBzIDAgL0ZvbnRCYXNlbGluZSAwIC9Gb250T1RQb3NpdGlvbiAwIC9TdHJpa2V0aHJvdWdoUG9zaXRpb24gMCAvVW5kZXJsaW5lUG9zaXRpb24gMCAvVW5kZXJsaW5lT2Zmc2V0IDAuMCAvTGlnYXR1cmVzIHRydWUgL0Rpc2NyZXRpb25hcnlMaWdhdHVyZXMgZmFsc2UgL0NvbnRleHR1YWxMaWdhdHVyZXMgZmFsc2UgL0FsdGVybmF0ZUxpZ2F0dXJlcyBmYWxzZSAvT2xkU3R5bGUgZmFsc2UgL0ZyYWN0aW9ucyBmYWxzZSAvT3JkaW5hbHMgZmFsc2UgL1N3YXNoIGZhbHNlIC9UaXRsaW5nIGZhbHNlIC9Db25uZWN0aW9uRm9ybXMgZmFsc2UgL1N0eWxpc3RpY0FsdGVybmF0ZXMgZmFsc2UgL09ybmFtZW50cyBmYWxzZSAvRmlndXJlU3R5bGUgMCAvUHJvcG9ydGlvbmFsTWV0cmljcyBmYWxzZSAvS2FuYSBmYWxzZSAvSXRhbGljcyBmYWxzZSAvUnVieSBmYWxzZSAvQmFzZWxpbmVEaXJlY3Rpb24gMiAvVHN1bWUgMC4wIC9TdHlsZVJ1bkFsaWdubWVudCAyIC9MYW5ndWFnZSAwIC9KYXBhbmVzZUFsdGVybmF0ZUZlYXR1cmUgMCAvRW5hYmxlV2FyaUNodSBmYWxzZSAvV2FyaUNodUxpbmVDb3VudCAyIC9XYXJpQ2h1TGluZUdhcCAwIC9XYXJpQ2h1U3ViTGluZUFtb3VudCA8PCAvV2FyaUNodVN1YkxpbmVTY2FsZSAuNSA+PiAvV2FyaUNodVdpZG93QW1vdW50IDIgL1dhcmlDaHVPcnBoYW5BbW91bnQgMiAvV2FyaUNodUp1c3RpZmljYXRpb24gNyAvVENZVXBEb3duQWRqdXN0bWVudCAwIC9UQ1lMZWZ0UmlnaHRBZGp1c3RtZW50IDAgL0xlZnRBa2kgLTEuMCAvUmlnaHRBa2kgLTEuMCAvSmlEb3JpIDAgL05vQnJlYWsgZmFsc2UgL0ZpbGxDb2xvciA8PCAvU3RyZWFtVGFnIC9TaW1wbGVQYWludCAvQ29sb3IgPDwgL1R5cGUgMSAvVmFsdWVzIFsgMS4wIDAuMCAwLjAgMC4wIF0gPj4gPj4gL1N0cm9rZUNvbG9yIDw8IC9TdHJlYW1UYWcgL1NpbXBsZVBhaW50IC9Db2xvciA8PCAvVHlwZSAxIC9WYWx1ZXMgWyAxLjAgMC4wIDAuMCAwLjAgXSA+PiA+PiAvQmxlbmQgPDwgL1N0cmVhbVRhZyAvU2ltcGxlQmxlbmRlciA+PiAvRmlsbEZsYWcgdHJ1ZSAvU3Ryb2tlRmxhZyBmYWxzZSAvRmlsbEZpcnN0IHRydWUgL0ZpbGxPdmVyUHJpbnQgZmFsc2UgL1N0cm9rZU92ZXJQcmludCBmYWxzZSAvTGluZUNhcCAwIC9MaW5lSm9pbiAwIC9MaW5lV2lkdGggMS4wIC9NaXRlckxpbWl0IDQuMCAvTGluZURhc2hPZmZzZXQgMC4wIC9MaW5lRGFzaEFycmF5IFsgXSAvVHlwZTFFbmNvZGluZ05hbWVzIFsgXSAvS2FzaGlkYXMgMCAvRGlyT3ZlcnJpZGUgMCAvRGlnaXRTZXQgMCAvRGlhY1ZQb3MgNCAvRGlhY1hPZmZzZXQgMC4wIC9EaWFjWU9mZnNldCAwLjAgL092ZXJsYXBTd2FzaCBmYWxzZSAvSnVzdGlmaWNhdGlvbkFsdGVybmF0ZXMgZmFsc2UgL1N0cmV0Y2hlZEFsdGVybmF0ZXMgZmFsc2UgL0ZpbGxWaXNpYmxlRmxhZyB0cnVlIC9TdHJva2VWaXNpYmxlRmxhZyB0cnVlID4+IC9QYXJhZ3JhcGhEaXJlY3Rpb24gMCAvSnVzdGlmaWNhdGlvbk1ldGhvZCAwIC9Db21wb3NlckVuZ2luZSAwID4+IC9QYXJlbnQgMCA+PiA+PiAvTGVuZ3RoIDMgPj4gXSA+PiAvU3R5bGVSdW4gPDwgL1J1bkFycmF5IFsgPDwgL1J1bkRhdGEgPDwgL1N0eWxlU2hlZXQgPDwgL05hbWUgKP7/KSAvUGFyZW50IDAgL0ZlYXR1cmVzIDw8IC9Gb250IDAgL0ZvbnRTaXplIDcyLjAgL0ZhdXhCb2xkIGZhbHNlIC9GYXV4SXRhbGljIGZhbHNlIC9BdXRvTGVhZGluZyB0cnVlIC9MZWFkaW5nIC4wMSAvSG9yaXpvbnRhbFNjYWxlIDEuMCAvVmVydGljYWxTY2FsZSAxLjAgL1RyYWNraW5nIDAgL0Jhc2VsaW5lU2hpZnQgMC4wIC9DaGFyYWN0ZXJSb3RhdGlvbiAwLjAgL0F1dG9LZXJuIDEgL0ZvbnRDYXBzIDAgL0ZvbnRCYXNlbGluZSAwIC9Gb250T1RQb3NpdGlvbiAwIC9TdHJpa2V0aHJvdWdoUG9zaXRpb24gMCAvVW5kZXJsaW5lUG9zaXRpb24gMCAvVW5kZXJsaW5lT2Zmc2V0IDAuMCAvTGlnYXR1cmVzIHRydWUgL0Rpc2NyZXRpb25hcnlMaWdhdHVyZXMgZmFsc2UgL0NvbnRleHR1YWxMaWdhdHVyZXMgdHJ1ZSAvQWx0ZXJuYXRlTGlnYXR1cmVzIGZhbHNlIC9PbGRTdHlsZSBmYWxzZSAvRnJhY3Rpb25zIGZhbHNlIC9PcmRpbmFscyBmYWxzZSAvU3dhc2ggZmFsc2UgL1RpdGxpbmcgZmFsc2UgL0Nvbm5lY3Rpb25Gb3JtcyB0cnVlIC9TdHlsaXN0aWNBbHRlcm5hdGVzIGZhbHNlIC9Pcm5hbWVudHMgZmFsc2UgL0ZpZ3VyZVN0eWxlIDAgL1Byb3BvcnRpb25hbE1ldHJpY3MgZmFsc2UgL0thbmEgZmFsc2UgL0l0YWxpY3MgZmFsc2UgL1J1YnkgZmFsc2UgL0Jhc2VsaW5lRGlyZWN0aW9uIDEgL1RzdW1lIDAuMCAvU3R5bGVSdW5BbGlnbm1lbnQgMiAvTGFuZ3VhZ2UgMCAvSmFwYW5lc2VBbHRlcm5hdGVGZWF0dXJlIDAgL0VuYWJsZVdhcmlDaHUgZmFsc2UgL1dhcmlDaHVMaW5lQ291bnQgMiAvV2FyaUNodUxpbmVHYXAgMCAvV2FyaUNodVN1YkxpbmVBbW91bnQgPDwgL1dhcmlDaHVTdWJMaW5lU2NhbGUgLjUgPj4gL1dhcmlDaHVXaWRvd0Ftb3VudCAyIC9XYXJpQ2h1T3JwaGFuQW1vdW50IDIgL1dhcmlDaHVKdXN0aWZpY2F0aW9uIDcgL1RDWVVwRG93bkFkanVzdG1lbnQgMCAvVENZTGVmdFJpZ2h0QWRqdXN0bWVudCAwIC9MZWZ0QWtpIC0xLjAgL1JpZ2h0QWtpIC0xLjAgL0ppRG9yaSAwIC9Ob0JyZWFrIGZhbHNlIC9GaWxsQ29sb3IgPDwgL1N0cmVhbVRhZyAvU2ltcGxlUGFpbnQgL0NvbG9yIDw8IC9UeXBlIDEgL1ZhbHVlcyBbIDEuMCAuMDc4MzEgLjIxMjg1IC4yNjI3NSBdID4+ID4+IC9TdHJva2VDb2xvciA8PCAvU3RyZWFtVGFnIC9TaW1wbGVQYWludCAvQ29sb3IgPDwgL1R5cGUgMSAvVmFsdWVzIFsgMS4wIDEuMCAxLjAgMS4wIF0gPj4gPj4gL0JsZW5kIDw8IC9TdHJlYW1UYWcgL1NpbXBsZUJsZW5kZXIgPj4gL0ZpbGxGbGFnIHRydWUgL1N0cm9rZUZsYWcgZmFsc2UgL0ZpbGxGaXJzdCBmYWxzZSAvRmlsbE92ZXJQcmludCBmYWxzZSAvU3Ryb2tlT3ZlclByaW50IGZhbHNlIC9MaW5lQ2FwIDAgL0xpbmVKb2luIDAgL0xpbmVXaWR0aCAxLjAgL01pdGVyTGltaXQgNC4wIC9MaW5lRGFzaE9mZnNldCAwLjAgL0xpbmVEYXNoQXJyYXkgWyBdIC9UeXBlMUVuY29kaW5nTmFtZXMgWyBdIC9LYXNoaWRhcyAwIC9EaXJPdmVycmlkZSAwIC9EaWdpdFNldCAwIC9EaWFjVlBvcyA0IC9EaWFjWE9mZnNldCAwLjAgL0RpYWNZT2Zmc2V0IDAuMCAvT3ZlcmxhcFN3YXNoIGZhbHNlIC9KdXN0aWZpY2F0aW9uQWx0ZXJuYXRlcyBmYWxzZSAvU3RyZXRjaGVkQWx0ZXJuYXRlcyBmYWxzZSAvRmlsbFZpc2libGVGbGFnIHRydWUgL1N0cm9rZVZpc2libGVGbGFnIHRydWUgPj4gPj4gPj4gL0xlbmd0aCAzID4+IF0gPj4gL0tlcm5SdW4gPDwgL1J1bkFycmF5IFsgPDwgL1J1bkRhdGEgPDwgPj4gL0xlbmd0aCAzID4+IF0gPj4gL0FsdGVybmF0ZUdseXBoUnVuIDw8IC9SdW5BcnJheSBbIDw8IC9SdW5EYXRhIDw8ID4+IC9MZW5ndGggMyA+PiBdID4+IC9TdG9yeVNoZWV0IDw8IC9BbnRpQWxpYXMgNCAvVXNlRnJhY3Rpb25hbEdseXBoV2lkdGhzIHRydWUgPj4gPj4gL1ZpZXcgPDwgL0ZyYW1lcyBbIDw8IC9SZXNvdXJjZSAwID4+IF0gL1JlbmRlcmVkRGF0YSA8PCAvUnVuQXJyYXkgWyA8PCAvUnVuRGF0YSA8PCAvTGluZUNvdW50IDEgPj4gL0xlbmd0aCAzID4+IF0gPj4gL1N0cmlrZXMgWyA8PCAvU3RyZWFtVGFnIC9QYXRoU2VsZWN0R3JvdXBDaGFyYWN0ZXIgL1RyYW5zZm9ybSA8PCAvT3JpZ2luIFsgMC4wIDAuMCBdID4+IC9Cb3VuZHMgWyAwLjAgMC4wIDAuMCAwLjAgXSAvQ2hpbGRQcm9jZXNzaW9uIDAgL0NoaWxkcmVuIFsgPDwgL1N0cmVhbVRhZyAvRnJhbWVTdHJpa2UgL0ZyYW1lIDAgL1RyYW5zZm9ybSA8PCAvT3JpZ2luIFsgMC4wIDAuMCBdID4+IC9Cb3VuZHMgWyAwLjAgMC4wIDAuMCAwLjAgXSAvQ2hpbGRQcm9jZXNzaW9uIDIgL0NoaWxkcmVuIFsgPDwgL1N0cmVhbVRhZyAvUm93Q29sU3RyaWtlIC9Sb3dDb2xJbmRleCAwIC9UcmFuc2Zvcm0gPDwgL09yaWdpbiBbIDAuMCAwLjAgXSA+PiAvQm91bmRzIFsgMC4wIDAuMCAwLjAgMC4wIF0gL0NoaWxkUHJvY2Vzc2lvbiAxIC9DaGlsZHJlbiBbIDw8IC9TdHJlYW1UYWcgL1Jvd0NvbFN0cmlrZSAvUm93Q29sSW5kZXggMCAvVHJhbnNmb3JtIDw8IC9PcmlnaW4gWyAwLjAgMC4wIF0gPj4gL0JvdW5kcyBbIDAuMCAwLjAgMC4wIDAuMCBdIC9DaGlsZFByb2Nlc3Npb24gMiAvQ2hpbGRyZW4gWyA8PCAvU3RyZWFtVGFnIC9MaW5lU3RyaWtlIC9CYXNlbGluZSAwLjAgL0xlYWRpbmcgODYuNCAvRU1IZWlnaHQgNzIuMCAvREhlaWdodCA0OC44ODY5NiAvU2VsZWN0aW9uQXNjZW50IC02MC40NDM0OCAvU2VsZWN0aW9uRGVzY2VudCAxOS40NDE0MSAvVHJhbnNmb3JtIDw8IC9PcmlnaW4gWyAwLjAgMC4wIF0gPj4gL0JvdW5kcyBbIDAuMCAtNjAuNDQzNDggMC4wIDE5LjQ0MTQxIF0gL0NoaWxkUHJvY2Vzc2lvbiAxIC9DaGlsZHJlbiBbIDw8IC9TdHJlYW1UYWcgL1NlZ21lbnQgL01hcHBpbmcgPDwgL0NoYXJhY3RlckNvdW50IDMgL0dseXBoQ291bnQgMCAvV1JWYWxpZCBmYWxzZSA+PiAvRmlyc3RDaGFyYWN0ZXJJbmRleEluU2VnbWVudCAwIC9UcmFuc2Zvcm0gPDwgL09yaWdpbiBbIDAuMCAwLjAgXSA+PiAvQm91bmRzIFsgMC4wIDAuMCAwLjAgMC4wIF0gL0NoaWxkUHJvY2Vzc2lvbiAxIC9DaGlsZHJlbiBbIDw8IC9TdHJlYW1UYWcgL0dseXBoU3RyaWtlIC9UcmFuc2Zvcm0gPDwgL09yaWdpbiBbIDAuMCAwLjAgXSA+PiAvQm91bmRzIFsgMC4wIC02MC40NDM0OCA3Ny4yNzM0NCAxOS40NDE0MSBdIC9HbHlwaHMgWyA0NSA1NCAzIF0gL0dseXBoQWRqdXN0bWVudHMgPDwgL0RhdGEgWyA8PCA+PiBdIC9SdW5MZW5ndGhzIFsgMyBdID4+IC9WaXN1YWxCb3VuZHMgWyAwLjAgLTYwLjQ0MzQ4IDc3LjI3MzQ0IDE5LjQ0MTQxIF0gL1JlbmRlcmVkQm91bmRzIFsgMC4wIC02MC40NDM0OCA3Ny4yNzM0NCAxOS40NDE0MSBdIC9JbnZhbGlkYXRpb24gWyAwLjAgLTYwLjQ0MzQ4IDExMS44MzMxMyAxOS40NDE0MSBdIC9TaGFkb3dTdHlsZXNSdW4gPDwgL0RhdGEgWyA8PCAvSW5kZXggMCAvRm9udCAwIC9TY2FsZSBbIDEuMCAxLjAgXSAvT3JpZW50YXRpb24gMCAvQmFzZWxpbmVEaXJlY3Rpb24gMiAvQmFzZWxpbmVTaGlmdCAwLjAgL0tlcm5UeXBlIDEgL0VtYmVkZGluZ0xldmVsIDAgL0NvbXBsZW1lbnRhcnlGb250SW5kZXggMCA+PiBdIC9SdW5MZW5ndGhzIFsgMyBdID4+IC9FbmRzSW5DUiB0cnVlIC9TZWxlY3Rpb25Bc2NlbnQgLTYwLjQ0MzQ4IC9TZWxlY3Rpb25EZXNjZW50IDE5LjQ0MTQxIC9NYWluRGlyIDAgPj4gXSA+PiBdID4+IF0gPj4gXSA+PiBdID4+IF0gPj4gXSA+PiAvT3B0aWNhbEFsaWdubWVudCBmYWxzZSA+PiA8PCAvTW9kZWwgPDwgL1RleHQgKP7/AE0ADSkgL1BhcmFncmFwaFJ1biA8PCAvUnVuQXJyYXkgWyA8PCAvUnVuRGF0YSA8PCAvUGFyYWdyYXBoU2hlZXQgPDwgL05hbWUgKP7/KSAvRmVhdHVyZXMgPDwgL0p1c3RpZmljYXRpb24gMCAvRmlyc3RMaW5lSW5kZW50IDAuMCAvU3RhcnRJbmRlbnQgMC4wIC9FbmRJbmRlbnQgMC4wIC9TcGFjZUJlZm9yZSAwLjAgL1NwYWNlQWZ0ZXIgMC4wIC9Ecm9wQ2FwcyAxIC9BdXRvTGVhZGluZyAxLjIgL0xlYWRpbmdUeXBlIDAgL0F1dG9IeXBoZW5hdGUgdHJ1ZSAvSHlwaGVuYXRlZFdvcmRTaXplIDYgL1ByZUh5cGhlbiAyIC9Qb3N0SHlwaGVuIDIgL0NvbnNlY3V0aXZlSHlwaGVucyAwIC9ab25lIDM2LjAgL0h5cGhlbmF0ZUNhcGl0YWxpemVkIHRydWUgL0h5cGhlbmF0aW9uUHJlZmVyZW5jZSAuNSAvV29yZFNwYWNpbmcgWyAuOCAxLjAgMS4zMyBdIC9MZXR0ZXJTcGFjaW5nIFsgMC4wIDAuMCAwLjAgXSAvR2x5cGhTcGFjaW5nIFsgMS4wIDEuMCAxLjAgXSAvU2luZ2xlV29yZEp1c3RpZmljYXRpb24gNiAvSGFuZ2luZyBmYWxzZSAvQXV0b1RDWSAxIC9LZWVwVG9nZXRoZXIgdHJ1ZSAvQnVyYXNhZ2FyaVR5cGUgMCAvS2luc29rdU9yZGVyIDAgL0tpbnNva3UgL25pbCAvS3VyaWthZXNoaU1vamlTaG9yaSBmYWxzZSAvTW9qaUt1bWlUYWJsZSAvbmlsIC9FdmVyeUxpbmVDb21wb3NlciBmYWxzZSAvVGFiU3RvcHMgPDwgPj4gL0RlZmF1bHRUYWJXaWR0aCAzNi4wIC9EZWZhdWx0U3R5bGUgPDwgL0ZvbnQgMSAvRm9udFNpemUgMTIuMCAvRmF1eEJvbGQgZmFsc2UgL0ZhdXhJdGFsaWMgZmFsc2UgL0F1dG9MZWFkaW5nIHRydWUgL0xlYWRpbmcgMC4wIC9Ib3Jpem9udGFsU2NhbGUgMS4wIC9WZXJ0aWNhbFNjYWxlIDEuMCAvVHJhY2tpbmcgMCAvQmFzZWxpbmVTaGlmdCAwLjAgL0NoYXJhY3RlclJvdGF0aW9uIDAuMCAvQXV0b0tlcm4gMSAvRm9udENhcHMgMCAvRm9udEJhc2VsaW5lIDAgL0ZvbnRPVFBvc2l0aW9uIDAgL1N0cmlrZXRocm91Z2hQb3NpdGlvbiAwIC9VbmRlcmxpbmVQb3NpdGlvbiAwIC9VbmRlcmxpbmVPZmZzZXQgMC4wIC9MaWdhdHVyZXMgdHJ1ZSAvRGlzY3JldGlvbmFyeUxpZ2F0dXJlcyBmYWxzZSAvQ29udGV4dHVhbExpZ2F0dXJlcyBmYWxzZSAvQWx0ZXJuYXRlTGlnYXR1cmVzIGZhbHNlIC9PbGRTdHlsZSBmYWxzZSAvRnJhY3Rpb25zIGZhbHNlIC9PcmRpbmFscyBmYWxzZSAvU3dhc2ggZmFsc2UgL1RpdGxpbmcgZmFsc2UgL0Nvbm5lY3Rpb25Gb3JtcyBmYWxzZSAvU3R5bGlzdGljQWx0ZXJuYXRlcyBmYWxzZSAvT3JuYW1lbnRzIGZhbHNlIC9GaWd1cmVTdHlsZSAwIC9Qcm9wb3J0aW9uYWxNZXRyaWNzIGZhbHNlIC9LYW5hIGZhbHNlIC9JdGFsaWNzIGZhbHNlIC9SdWJ5IGZhbHNlIC9CYXNlbGluZURpcmVjdGlvbiAyIC9Uc3VtZSAwLjAgL1N0eWxlUnVuQWxpZ25tZW50IDIgL0xhbmd1YWdlIDAgL0phcGFuZXNlQWx0ZXJuYXRlRmVhdHVyZSAwIC9FbmFibGVXYXJpQ2h1IGZhbHNlIC9XYXJpQ2h1TGluZUNvdW50IDIgL1dhcmlDaHVMaW5lR2FwIDAgL1dhcmlDaHVTdWJMaW5lQW1vdW50IDw8IC9XYXJpQ2h1U3ViTGluZVNjYWxlIC41ID4+IC9XYXJpQ2h1V2lkb3dBbW91bnQgMiAvV2FyaUNodU9ycGhhbkFtb3VudCAyIC9XYXJpQ2h1SnVzdGlmaWNhdGlvbiA3IC9UQ1lVcERvd25BZGp1c3RtZW50IDAgL1RDWUxlZnRSaWdodEFkanVzdG1lbnQgMCAvTGVmdEFraSAtMS4wIC9SaWdodEFraSAtMS4wIC9KaURvcmkgMCAvTm9CcmVhayBmYWxzZSAvRmlsbENvbG9yIDw8IC9TdHJlYW1UYWcgL1NpbXBsZVBhaW50IC9Db2xvciA8PCAvVHlwZSAxIC9WYWx1ZXMgWyAxLjAgMC4wIDAuMCAwLjAgXSA+PiA+PiAvU3Ryb2tlQ29sb3IgPDwgL1N0cmVhbVRhZyAvU2ltcGxlUGFpbnQgL0NvbG9yIDw8IC9UeXBlIDEgL1ZhbHVlcyBbIDEuMCAwLjAgMC4wIDAuMCBdID4+ID4+IC9CbGVuZCA8PCAvU3RyZWFtVGFnIC9TaW1wbGVCbGVuZGVyID4+IC9GaWxsRmxhZyB0cnVlIC9TdHJva2VGbGFnIGZhbHNlIC9GaWxsRmlyc3QgdHJ1ZSAvRmlsbE92ZXJQcmludCBmYWxzZSAvU3Ryb2tlT3ZlclByaW50IGZhbHNlIC9MaW5lQ2FwIDAgL0xpbmVKb2luIDAgL0xpbmVXaWR0aCAxLjAgL01pdGVyTGltaXQgNC4wIC9MaW5lRGFzaE9mZnNldCAwLjAgL0xpbmVEYXNoQXJyYXkgWyBdIC9UeXBlMUVuY29kaW5nTmFtZXMgWyBdIC9LYXNoaWRhcyAwIC9EaXJPdmVycmlkZSAwIC9EaWdpdFNldCAwIC9EaWFjVlBvcyA0IC9EaWFjWE9mZnNldCAwLjAgL0RpYWNZT2Zmc2V0IDAuMCAvT3ZlcmxhcFN3YXNoIGZhbHNlIC9KdXN0aWZpY2F0aW9uQWx0ZXJuYXRlcyBmYWxzZSAvU3RyZXRjaGVkQWx0ZXJuYXRlcyBmYWxzZSAvRmlsbFZpc2libGVGbGFnIHRydWUgL1N0cm9rZVZpc2libGVGbGFnIHRydWUgPj4gL1BhcmFncmFwaERpcmVjdGlvbiAwIC9KdXN0aWZpY2F0aW9uTWV0aG9kIDAgL0NvbXBvc2VyRW5naW5lIDAgPj4gL1BhcmVudCAwID4+ID4+IC9MZW5ndGggMiA+PiBdID4+IC9TdHlsZVJ1biA8PCAvUnVuQXJyYXkgWyA8PCAvUnVuRGF0YSA8PCAvU3R5bGVTaGVldCA8PCAvTmFtZSAo/v8pIC9QYXJlbnQgMCAvRmVhdHVyZXMgPDwgL0ZvbnQgMCAvRm9udFNpemUgNzIuMCAvRmF1eEJvbGQgZmFsc2UgL0ZhdXhJdGFsaWMgZmFsc2UgL0F1dG9MZWFkaW5nIHRydWUgL0xlYWRpbmcgLjAxIC9Ib3Jpem9udGFsU2NhbGUgMS4wIC9WZXJ0aWNhbFNjYWxlIDEuMCAvVHJhY2tpbmcgMCAvQmFzZWxpbmVTaGlmdCAwLjAgL0NoYXJhY3RlclJvdGF0aW9uIDAuMCAvQXV0b0tlcm4gMSAvRm9udENhcHMgMCAvRm9udEJhc2VsaW5lIDAgL0ZvbnRPVFBvc2l0aW9uIDAgL1N0cmlrZXRocm91Z2hQb3NpdGlvbiAwIC9VbmRlcmxpbmVQb3NpdGlvbiAwIC9VbmRlcmxpbmVPZmZzZXQgMC4wIC9MaWdhdHVyZXMgdHJ1ZSAvRGlzY3JldGlvbmFyeUxpZ2F0dXJlcyBmYWxzZSAvQ29udGV4dHVhbExpZ2F0dXJlcyB0cnVlIC9BbHRlcm5hdGVMaWdhdHVyZXMgZmFsc2UgL09sZFN0eWxlIGZhbHNlIC9GcmFjdGlvbnMgZmFsc2UgL09yZGluYWxzIGZhbHNlIC9Td2FzaCBmYWxzZSAvVGl0bGluZyBmYWxzZSAvQ29ubmVjdGlvbkZvcm1zIHRydWUgL1N0eWxpc3RpY0FsdGVybmF0ZXMgZmFsc2UgL09ybmFtZW50cyBmYWxzZSAvRmlndXJlU3R5bGUgMCAvUHJvcG9ydGlvbmFsTWV0cmljcyBmYWxzZSAvS2FuYSBmYWxzZSAvSXRhbGljcyBmYWxzZSAvUnVieSBmYWxzZSAvQmFzZWxpbmVEaXJlY3Rpb24gMSAvVHN1bWUgMC4wIC9TdHlsZVJ1bkFsaWdubWVudCAyIC9MYW5ndWFnZSAwIC9KYXBhbmVzZUFsdGVybmF0ZUZlYXR1cmUgMCAvRW5hYmxlV2FyaUNodSBmYWxzZSAvV2FyaUNodUxpbmVDb3VudCAyIC9XYXJpQ2h1TGluZUdhcCAwIC9XYXJpQ2h1U3ViTGluZUFtb3VudCA8PCAvV2FyaUNodVN1YkxpbmVTY2FsZSAuNSA+PiAvV2FyaUNodVdpZG93QW1vdW50IDIgL1dhcmlDaHVPcnBoYW5BbW91bnQgMiAvV2FyaUNodUp1c3RpZmljYXRpb24gNyAvVENZVXBEb3duQWRqdXN0bWVudCAwIC9UQ1lMZWZ0UmlnaHRBZGp1c3RtZW50IDAgL0xlZnRBa2kgLTEuMCAvUmlnaHRBa2kgLTEuMCAvSmlEb3JpIDAgL05vQnJlYWsgZmFsc2UgL0ZpbGxDb2xvciA8PCAvU3RyZWFtVGFnIC9TaW1wbGVQYWludCAvQ29sb3IgPDwgL1R5cGUgMSAvVmFsdWVzIFsgMS4wIC4zMjU0NyAuMDIwNDIgLjEwNjU4IF0gPj4gPj4gL1N0cm9rZUNvbG9yIDw8IC9TdHJlYW1UYWcgL1NpbXBsZVBhaW50IC9Db2xvciA8PCAvVHlwZSAxIC9WYWx1ZXMgWyAxLjAgMS4wIDEuMCAxLjAgXSA+PiA+PiAvQmxlbmQgPDwgL1N0cmVhbVRhZyAvU2ltcGxlQmxlbmRlciA+PiAvRmlsbEZsYWcgdHJ1ZSAvU3Ryb2tlRmxhZyBmYWxzZSAvRmlsbEZpcnN0IGZhbHNlIC9GaWxsT3ZlclByaW50IGZhbHNlIC9TdHJva2VPdmVyUHJpbnQgZmFsc2UgL0xpbmVDYXAgMCAvTGluZUpvaW4gMCAvTGluZVdpZHRoIDEuMCAvTWl0ZXJMaW1pdCA0LjAgL0xpbmVEYXNoT2Zmc2V0IDAuMCAvTGluZURhc2hBcnJheSBbIF0gL1R5cGUxRW5jb2RpbmdOYW1lcyBbIF0gL0thc2hpZGFzIDAgL0Rpck92ZXJyaWRlIDAgL0RpZ2l0U2V0IDAgL0RpYWNWUG9zIDQgL0RpYWNYT2Zmc2V0IDAuMCAvRGlhY1lPZmZzZXQgMC4wIC9PdmVybGFwU3dhc2ggZmFsc2UgL0p1c3RpZmljYXRpb25BbHRlcm5hdGVzIGZhbHNlIC9TdHJldGNoZWRBbHRlcm5hdGVzIGZhbHNlIC9GaWxsVmlzaWJsZUZsYWcgdHJ1ZSAvU3Ryb2tlVmlzaWJsZUZsYWcgdHJ1ZSA+PiA+PiA+PiAvTGVuZ3RoIDIgPj4gXSA+PiAvS2VyblJ1biA8PCAvUnVuQXJyYXkgWyA8PCAvUnVuRGF0YSA8PCA+PiAvTGVuZ3RoIDIgPj4gXSA+PiAvQWx0ZXJuYXRlR2x5cGhSdW4gPDwgL1J1bkFycmF5IFsgPDwgL1J1bkRhdGEgPDwgPj4gL0xlbmd0aCAyID4+IF0gPj4gL1N0b3J5U2hlZXQgPDwgL0FudGlBbGlhcyA0IC9Vc2VGcmFjdGlvbmFsR2x5cGhXaWR0aHMgdHJ1ZSA+PiA+PiAvVmlldyA8PCAvRnJhbWVzIFsgPDwgL1Jlc291cmNlIDIgPj4gXSAvUmVuZGVyZWREYXRhIDw8IC9SdW5BcnJheSBbIDw8IC9SdW5EYXRhIDw8IC9MaW5lQ291bnQgMSA+PiAvTGVuZ3RoIDIgPj4gXSA+PiAvU3RyaWtlcyBbIDw8IC9TdHJlYW1UYWcgL1BhdGhTZWxlY3RHcm91cENoYXJhY3RlciAvVHJhbnNmb3JtIDw8IC9PcmlnaW4gWyAwLjAgMC4wIF0gPj4gL0JvdW5kcyBbIDAuMCAwLjAgMC4wIDAuMCBdIC9DaGlsZFByb2Nlc3Npb24gMCAvQ2hpbGRyZW4gWyA8PCAvU3RyZWFtVGFnIC9GcmFtZVN0cmlrZSAvRnJhbWUgMiAvVHJhbnNmb3JtIDw8IC9PcmlnaW4gWyAwLjAgMC4wIF0gPj4gL0JvdW5kcyBbIDAuMCAwLjAgMC4wIDAuMCBdIC9DaGlsZFByb2Nlc3Npb24gMiAvQ2hpbGRyZW4gWyA8PCAvU3RyZWFtVGFnIC9Sb3dDb2xTdHJpa2UgL1Jvd0NvbEluZGV4IDAgL1RyYW5zZm9ybSA8PCAvT3JpZ2luIFsgMC4wIDAuMCBdID4+IC9Cb3VuZHMgWyAwLjAgMC4wIDAuMCAwLjAgXSAvQ2hpbGRQcm9jZXNzaW9uIDEgL0NoaWxkcmVuIFsgPDwgL1N0cmVhbVRhZyAvUm93Q29sU3RyaWtlIC9Sb3dDb2xJbmRleCAwIC9UcmFuc2Zvcm0gPDwgL09yaWdpbiBbIDAuMCAwLjAgXSA+PiAvQm91bmRzIFsgMC4wIDAuMCAwLjAgMC4wIF0gL0NoaWxkUHJvY2Vzc2lvbiAyIC9DaGlsZHJlbiBbIDw8IC9TdHJlYW1UYWcgL0xpbmVTdHJpa2UgL0Jhc2VsaW5lIDAuMCAvTGVhZGluZyA4Ni40IC9FTUhlaWdodCA3Mi4wIC9ESGVpZ2h0IDQ4Ljg4Njk2IC9TZWxlY3Rpb25Bc2NlbnQgLTYwLjQ0MzQ4IC9TZWxlY3Rpb25EZXNjZW50IDE5LjQ0MTQxIC9UcmFuc2Zvcm0gPDwgL09yaWdpbiBbIDAuMCAwLjAgXSA+PiAvQm91bmRzIFsgMC4wIC02MC40NDM0OCAwLjAgMTkuNDQxNDEgXSAvQ2hpbGRQcm9jZXNzaW9uIDEgL0NoaWxkcmVuIFsgPDwgL1N0cmVhbVRhZyAvU2VnbWVudCAvTWFwcGluZyA8PCAvQ2hhcmFjdGVyQ291bnQgMiAvR2x5cGhDb3VudCAwIC9XUlZhbGlkIGZhbHNlID4+IC9GaXJzdENoYXJhY3RlckluZGV4SW5TZWdtZW50IDAgL1RyYW5zZm9ybSA8PCAvT3JpZ2luIFsgMC4wIDAuMCBdID4+IC9Cb3VuZHMgWyAwLjAgMC4wIDAuMCAwLjAgXSAvQ2hpbGRQcm9jZXNzaW9uIDEgL0NoaWxkcmVuIFsgPDwgL1N0cmVhbVRhZyAvR2x5cGhTdHJpa2UgL1RyYW5zZm9ybSA8PCAvT3JpZ2luIFsgMC4wIDAuMCBdID4+IC9Cb3VuZHMgWyAwLjAgLTYwLjQ0MzQ4IDc5LjQ4ODI4IDE5LjQ0MTQxIF0gL0dseXBocyBbIDQ4IDMgXSAvR2x5cGhBZGp1c3RtZW50cyA8PCAvRGF0YSBbIDw8ID4+IF0gL1J1bkxlbmd0aHMgWyAyIF0gPj4gL1Zpc3VhbEJvdW5kcyBbIDAuMCAtNjAuNDQzNDggNzkuNDg4MjggMTkuNDQxNDEgXSAvUmVuZGVyZWRCb3VuZHMgWyAwLjAgLTYwLjQ0MzQ4IDc5LjQ4ODI4IDE5LjQ0MTQxIF0gL0ludmFsaWRhdGlvbiBbIDAuMCAtNjAuNDQzNDggMTE0LjA0Nzk3IDE5LjQ0MTQxIF0gL1NoYWRvd1N0eWxlc1J1biA8PCAvRGF0YSBbIDw8IC9JbmRleCAwIC9Gb250IDAgL1NjYWxlIFsgMS4wIDEuMCBdIC9PcmllbnRhdGlvbiAwIC9CYXNlbGluZURpcmVjdGlvbiAyIC9CYXNlbGluZVNoaWZ0IDAuMCAvS2VyblR5cGUgMSAvRW1iZWRkaW5nTGV2ZWwgMCAvQ29tcGxlbWVudGFyeUZvbnRJbmRleCAwID4+IF0gL1J1bkxlbmd0aHMgWyAyIF0gPj4gL0VuZHNJbkNSIHRydWUgL1NlbGVjdGlvbkFzY2VudCAtNjAuNDQzNDggL1NlbGVjdGlvbkRlc2NlbnQgMTkuNDQxNDEgL01haW5EaXIgMCA+PiBdID4+IF0gPj4gXSA+PiBdID4+IF0gPj4gXSA+PiBdID4+IC9PcHRpY2FsQWxpZ25tZW50IGZhbHNlID4+IF0gL09yaWdpbmFsTm9ybWFsU3R5bGVGZWF0dXJlcyA8PCAvRm9udCAxIC9Gb250U2l6ZSAxMi4wIC9GYXV4Qm9sZCBmYWxzZSAvRmF1eEl0YWxpYyBmYWxzZSAvQXV0b0xlYWRpbmcgdHJ1ZSAvTGVhZGluZyAwLjAgL0hvcml6b250YWxTY2FsZSAxLjAgL1ZlcnRpY2FsU2NhbGUgMS4wIC9UcmFja2luZyAwIC9CYXNlbGluZVNoaWZ0IDAuMCAvQ2hhcmFjdGVyUm90YXRpb24gMC4wIC9BdXRvS2VybiAxIC9Gb250Q2FwcyAwIC9Gb250QmFzZWxpbmUgMCAvRm9udE9UUG9zaXRpb24gMCAvU3RyaWtldGhyb3VnaFBvc2l0aW9uIDAgL1VuZGVybGluZVBvc2l0aW9uIDAgL1VuZGVybGluZU9mZnNldCAwLjAgL0xpZ2F0dXJlcyB0cnVlIC9EaXNjcmV0aW9uYXJ5TGlnYXR1cmVzIGZhbHNlIC9Db250ZXh0dWFsTGlnYXR1cmVzIGZhbHNlIC9BbHRlcm5hdGVMaWdhdHVyZXMgZmFsc2UgL09sZFN0eWxlIGZhbHNlIC9GcmFjdGlvbnMgZmFsc2UgL09yZGluYWxzIGZhbHNlIC9Td2FzaCBmYWxzZSAvVGl0bGluZyBmYWxzZSAvQ29ubmVjdGlvbkZvcm1zIGZhbHNlIC9TdHlsaXN0aWNBbHRlcm5hdGVzIGZhbHNlIC9Pcm5hbWVudHMgZmFsc2UgL0ZpZ3VyZVN0eWxlIDAgL1Byb3BvcnRpb25hbE1ldHJpY3MgZmFsc2UgL0thbmEgZmFsc2UgL0l0YWxpY3MgZmFsc2UgL1J1YnkgZmFsc2UgL0Jhc2VsaW5lRGlyZWN0aW9uIDIgL1RzdW1lIDAuMCAvU3R5bGVSdW5BbGlnbm1lbnQgMiAvTGFuZ3VhZ2UgMCAvSmFwYW5lc2VBbHRlcm5hdGVGZWF0dXJlIDAgL0VuYWJsZVdhcmlDaHUgZmFsc2UgL1dhcmlDaHVMaW5lQ291bnQgMiAvV2FyaUNodUxpbmVHYXAgMCAvV2FyaUNodVN1YkxpbmVBbW91bnQgPDwgL1dhcmlDaHVTdWJMaW5lU2NhbGUgLjUgPj4gL1dhcmlDaHVXaWRvd0Ftb3VudCAyIC9XYXJpQ2h1T3JwaGFuQW1vdW50IDIgL1dhcmlDaHVKdXN0aWZpY2F0aW9uIDcgL1RDWVVwRG93bkFkanVzdG1lbnQgMCAvVENZTGVmdFJpZ2h0QWRqdXN0bWVudCAwIC9MZWZ0QWtpIC0xLjAgL1JpZ2h0QWtpIC0xLjAgL0ppRG9yaSAwIC9Ob0JyZWFrIGZhbHNlIC9GaWxsQ29sb3IgPDwgL1N0cmVhbVRhZyAvU2ltcGxlUGFpbnQgL0NvbG9yIDw8IC9UeXBlIDEgL1ZhbHVlcyBbIDEuMCAwLjAgMC4wIDAuMCBdID4+ID4+IC9TdHJva2VDb2xvciA8PCAvU3RyZWFtVGFnIC9TaW1wbGVQYWludCAvQ29sb3IgPDwgL1R5cGUgMSAvVmFsdWVzIFsgMS4wIDAuMCAwLjAgMC4wIF0gPj4gPj4gL0JsZW5kIDw8IC9TdHJlYW1UYWcgL1NpbXBsZUJsZW5kZXIgPj4gL0ZpbGxGbGFnIHRydWUgL1N0cm9rZUZsYWcgZmFsc2UgL0ZpbGxGaXJzdCB0cnVlIC9GaWxsT3ZlclByaW50IGZhbHNlIC9TdHJva2VPdmVyUHJpbnQgZmFsc2UgL0xpbmVDYXAgMCAvTGluZUpvaW4gMCAvTGluZVdpZHRoIDEuMCAvTWl0ZXJMaW1pdCA0LjAgL0xpbmVEYXNoT2Zmc2V0IDAuMCAvTGluZURhc2hBcnJheSBbIF0gL1R5cGUxRW5jb2RpbmdOYW1lcyBbIF0gL0thc2hpZGFzIDAgL0Rpck92ZXJyaWRlIDAgL0RpZ2l0U2V0IDAgL0RpYWNWUG9zIDQgL0RpYWNYT2Zmc2V0IDAuMCAvRGlhY1lPZmZzZXQgMC4wIC9PdmVybGFwU3dhc2ggZmFsc2UgL0p1c3RpZmljYXRpb25BbHRlcm5hdGVzIGZhbHNlIC9TdHJldGNoZWRBbHRlcm5hdGVzIGZhbHNlIC9GaWxsVmlzaWJsZUZsYWcgdHJ1ZSAvU3Ryb2tlVmlzaWJsZUZsYWcgdHJ1ZSA+PiAvT3JpZ2luYWxOb3JtYWxQYXJhZ3JhcGhGZWF0dXJlcyA8PCAvSnVzdGlmaWNhdGlvbiAwIC9GaXJzdExpbmVJbmRlbnQgMC4wIC9TdGFydEluZGVudCAwLjAgL0VuZEluZGVudCAwLjAgL1NwYWNlQmVmb3JlIDAuMCAvU3BhY2VBZnRlciAwLjAgL0Ryb3BDYXBzIDEgL0F1dG9MZWFkaW5nIDEuMiAvTGVhZGluZ1R5cGUgMCAvQXV0b0h5cGhlbmF0ZSB0cnVlIC9IeXBoZW5hdGVkV29yZFNpemUgNiAvUHJlSHlwaGVuIDIgL1Bvc3RIeXBoZW4gMiAvQ29uc2VjdXRpdmVIeXBoZW5zIDAgL1pvbmUgMzYuMCAvSHlwaGVuYXRlQ2FwaXRhbGl6ZWQgdHJ1ZSAvSHlwaGVuYXRpb25QcmVmZXJlbmNlIC41IC9Xb3JkU3BhY2luZyBbIC44IDEuMCAxLjMzIF0gL0xldHRlclNwYWNpbmcgWyAwLjAgMC4wIDAuMCBdIC9HbHlwaFNwYWNpbmcgWyAxLjAgMS4wIDEuMCBdIC9TaW5nbGVXb3JkSnVzdGlmaWNhdGlvbiA2IC9IYW5naW5nIGZhbHNlIC9BdXRvVENZIDAgL0tlZXBUb2dldGhlciB0cnVlIC9CdXJhc2FnYXJpVHlwZSAwIC9LaW5zb2t1T3JkZXIgMCAvS2luc29rdSAvbmlsIC9LdXJpa2Flc2hpTW9qaVNob3JpIGZhbHNlIC9Nb2ppS3VtaVRhYmxlIC9uaWwgL0V2ZXJ5TGluZUNvbXBvc2VyIGZhbHNlIC9UYWJTdG9wcyA8PCA+PiAvRGVmYXVsdFRhYldpZHRoIDM2LjAgL0RlZmF1bHRTdHlsZSA8PCA+PiAvUGFyYWdyYXBoRGlyZWN0aW9uIDAgL0p1c3RpZmljYXRpb25NZXRob2QgMCAvQ29tcG9zZXJFbmdpbmUgMCA+PiA+PgA4QklNRk1zawAAAAwAAP//AAAAAAAAADIAAQACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABIAEwATABIAFAATABMAFAATABMAEwASAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgASABMAEwASABQAEwATABQAEwATABMAEgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAEgATABMAEgAUABMAEwAUABMAEwATABIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABIACgAJAAkACgAJAAkACgAIAAgACgASAALe/97/3v/e/97/3v/e/97/3v/e/97/3v/e/97/3v/e/97/3v/e/97/3v/e/+7/AdI8/QACPH48/gADIV3z/+//AvYklv3/ApZSu/7/A910Xf/v/wK6RNH9UwK6u4H+UwNq3SH/7/8CukTR/VMBgej9UwNq3SH/7/8Q9iS7gVOMU1OYU4FTU7p0Xf/u/wRCu4FTxv5TB16vU1O6Zpn/7v8PQruBU/ReU1OYulNTumaZ/+//EPYku4FT/5hTU9G6U1O6ljz/7/8JukTRU1OYxlNe//1TAv8A/+//CbpE0VNTmO5eo//9UwL/AP/v/wn2JJb//5mF7oiW/f8Cljz/7v8I0jwAADxLD0s8/QACPNL/3v/e/97/3v/e/97/3v/e/97/3v/e/97/3v/e/97/3v/e/97/3v/e/97/3v/e/+7/AdI8/QACPH48/gADIV3z/+//AvYklv3/ApZSu/7/A910Xf/v/wK6RLz9BQKbu0j+BQMm3SH/7/8CukS8/QUBSN79BQMm3SH/7/8Q9iS7SAVYBQVpBUgFBZt0Xf/u/wRCu0gFrP4FBxaKBQWbZpn/7v8PQrtIBe4WBQVpmwUFm2aZ/+//EPYku0gF/2kFBbybBQWbljz/7/8JukS8BQVprAUW//0FAv8A/+//CbpEvAUFae4Wev/9BQL/AP/v/wn2JJb//5mF7oiW/f8Cljz/7v8I0jwAADxLD0s8/QACPNL/3v/e/97/3v/e/97/3v/e/97/3v/e/97/3v/e/97/3v/e/97/3v/e/97/3v/e/+7/AdI8/QACPH48/gADIV3z/+//AvYklv3/ApZSu/7/A910Xf/v/wK6RML9GwKku1j+GwM53SH/7/8CukTC/RsBWOH9GwM53SH/7/8Q9iS7WBtnGxt2G1gbG6R0Xf/u/wRCu1gbs/4bByqVGxukZpn/7v8PQrtYG/AqGxt2pBsbpGaZ/+//EPYku1gb/3YbG8KkGxukljz/7/8JukTCGxt2sxsq//0bAv8A/+//CbpEwhsbdu4qhf/9GwL/AP/v/wn2JJb//5mF7oiW/f8Cljz/7v8I0jwAADxLD0s8/QACPNL/3v/eAN4A3gDeAN4A3gDeAN4A3gDeAN4A3gDeAN4A3gDeAN4A3gDeAN4A3gDeAO4AAS3D/f8Cw4HD/v8D3qIMAO8AAQnb9P8BogDvAABF8/8B3gDvAABF8/8B3gDvAAEJ2/T/AaIA7gAAvfT/AWYA7gAAvfT/AWYA7wABCdv0/wHDAO8AAEXy/wAA7wAARfL/AADvAAEJ2/T/AcMA7gAILcP//8O08LTD/f8Cwy0A3gA=]]></data>
	</file>
	<file>
	  <filename>/images/support.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAJYAAAAyCAMAAACJUtIoAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAwBQTFRFLi0oBgUB9fX1ra2s1NTUW1lVqainZWRhPj04vr29mZmYJCIdeXh2oKCeOzk0rKyr6+rqp6akEA8JTk1IoqKhX11ZNTQuQD45REI99vb2dHRxQ0E8DQwFt7e2HRwYIB4ZKCYgHhwWycnIGRgUFhUOLiwmMC8pBAQB8PDwT05MIiEen56cERAMMTAqioqILCokp6emYF5aGBcQsbGuIiAaNDMtODYyQkA7FBINHBoUSEdCiYmHDg0HYWBc1NTTEhAJGhgSx8bGnZya0dDPYmFdMjEub29sxMTDCgkEvLy7MTAuCwoFamllFhQQlZSSHBsXODc0cHBtMC8tPDs3q6uoCwkCKigihoWCCAcDgYB+JiQeKSglfHx6Xl1byMjHJCQggH98V1ZTJyYjjYyKY2JeR0VARUM+NzYzQUA8jo6NwsLANTQxgYB9KyoneXd0pKOgNDMwBAMBOTcyFBQQYWBeKSciBwYBMjIvfHp3VVVSUlFONjUvMDAs4uLiCAgBJiUhKykjCQgBJiYhCQcBCAYBCggBCAcBWVdTVlVQXFpWU1JNfXt4TUxHtra1mZiXbWxq09PTFBILPDo1+/v7+fn5+vr6mJiXxcXEmZiWfHt57Ozs+Pj4/Pz8R0ZBDAoDbGxqZGNf/f39e3t5SklEUE9KMzIs7+/v7e3tTEtGUVBNNjUyPjw3XVtX8vLyVVRPT09MWFZSe3p5FBMQiomIS0pFUlFMV1VRMzMwNzYwxcTESUhD8/PzuLi3UVBLVFNO7u7uFxYRcXFvenp4urm5urq5FxYSqamoU1JPh4eFdnZ0RENAfXx5nJuaY2Ngg4J/RkZDf316VFNQlpaUb25qW1tYgoGAsK+tc3JwXV1bYF9b1NPTfn15u7u6nZ2cxsbFqqmnkZGPkI+OxsXFiIeD3d3cx8fGMjErmZmWbWxobm1rdHNvf358hIOBpqWiJyUibGtoKCckubm4vLu6RERAtLOxgoF+k5KR6enpq6uq2NfWWVhVWVhWt7a0SUhFSUlG////pufWsQAAAQB0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AFP3ByUAAAwTSURBVHja7Jl5XFTXFcfnoSIRQuyggmEEcZDnAkgICEOHQBJIcaaTSSQ2RKRGDEtCSIGGMQme4mQegxoHEFCqsoOAuGCIEZcYidEkxuyLjU33VrqkbdKm6WLXc+5982YB0qyfT//o78PnzV3Oeff7zj333jeD6t//k1L9H+tzYN1wx02vvPLRR/fff/d7r7327rsXLlx47MvQQw8FBDzwwLW/eebNX339zlsXfDzWQd83p0+f3tnZmZGaet3s2bMPHNjyZWjatGlXamsPbz60tXdbT1uIX2BVcWz/5Fj3vd85nWFlpF5CqgN0gytX8A5fvA4fPrr56a29QUdSCpOyKxJVm2J8J8HqmpXR2UlQ92RgqA5sYU90+OjRo5u/BB069PTWJ5HqREESBitq2fyEiIDWCbFuvZRxT6cCdaUWcdCXKSh0cHCwOHQwO2XrF6AnUadO9QZtG+hpY1RjC5EqfnvqRFhTZl+XmpGB0zd79pZptRTiU729QUzFfi8BQNyDcFXRwMDAts+hnuAeuTRwpOdEW0FI0n6iqvRHKvWqO8dj/W3agdnXXbpEgcJkpACTZ8+JEykpIdkLgOuqDYUfFrS1pXxWfXjbvdkFKSltpIKCwtAkv8aKOTFOqpqalnFYj9VuOUBZPq2WFkjQQE9KW0FhYUhIaGhoWR1c9WJp6V2IpWrM9gtOCv2sKlsPRcHBwcVJqOBgv+zGiqq9LK/it+trUMHeWAsOHa6lRYeBOhWEq5YeJdhv//7s7MbG3AXw96iylaXPwIrc0vz8fNVtUXiNCmTXsoX5+aWZgY0bP8DPRNa0vJG0nMqqqsbGRPKJUmElagRgJF8VGBjY2IiXimMItXDTaqLSEJXV9icvrJ9vPbSZcnwrWx2FScH7GwMrKo4dq0JV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]]></data>
	</file>
	<file>
	  <filename>/images/Thumbs.db</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAEAAAAgAAAAEAAAD+////AAAAAAAAAAD////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/////v////7///8EAAAABQAAAAYAAAAHAAAACAAAAAkAAAD+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1IAbwBvAHQAIABFAG4AdAByAHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAUA//////////8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECQrlolEsoBAwAAAEAMAAAAAAAAMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAgH/////AgAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkQsAAAAAAABDAGEAdABhAGwAbwBnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAACAP///////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8AAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAASAAAAEwAAABQAAAAVAAAAFgAAABcAAAAYAAAAGQAAABoAAAAbAAAAHAAAAB0AAAAeAAAAHwAAACAAAAAhAAAAIgAAACMAAAAkAAAAJQAAACYAAAAnAAAAKAAAACkAAAAqAAAAKwAAACwAAAAtAAAALgAAAP7///8wAAAA/v////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8MAAAAAQAAAIULAAD/2P/gABBKRklGAAEBAQBgAGAAAP/bAEMAAwICAwICAwMDAwQDAwQFCAUFBAQFCgcHBggMCgwMCwoLCw0OEhANDhEOCwsQFhARExQVFRUMDxcYFhQYEhQVFP/bAEMBAwQEBQQFCQUFCRQNCw0UFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFP/AABEIAGAAYAMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/AP0f8c+PLfQ99jDqNrp04wJ9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]]></data>
	</file>
	<file>
	  <filename>/images/wheel.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAMMAAADDCAYAAAA/f6WqAAAAB3RJTUUH1gcOCDIojJpTggAALYlJREFUeNrtnXmYHUW58H9V1WdmMtlDQtijSSDKorLovRAWAwqyiBJugoCK6CfqRdSLityLkIsiF9SIyqIsRhZBlu+TK0JEQBBFUEAEZQ9LgkCABBPIJJnMdFd9f5wzM2d6qrqr+/SZmUy6nqef06e6z9Ld76/epd6qgrKUpSxlKUtZylKWspSlLGVxF1HeguKLAQmTp0JlOuitQU+BaHJ105NBj4JoDEQKolYwoxAmQtKBxKBYi6ITxWokK1GsQPI6ilcQLEWxjBfpFGDKu13CMBwEXsA2bTB+BzA7Qbgz6B0hmgl6GugxEAG6tkX0va/fr70XBhQgqb72bLb3kgjFy0ieQ/EUiscQPErAo/yNlaL6pWUpYWia8Cv4l21BzwYzG6K9IHo7mBarcPcTfG0BwROGNED67xsUy5E8gOSPBNyD5mH+VGqREoaGhX+/KSD3h+j9EL231uILt+AnaYACYcgCiKADxZ+R3IHgNlp4jFvpKuEoYUgBYL8A2mYB80AfDGZXiCp+gu8CwXY8AYaigHABInkJyW+R3Mga7uBu1pZglDDUAJinIJoOZh5ER0L0LjDSLsjaQ9BThN5VlwZDEUD0hwIkK1DcguQ61vN7cTPrShg2Sef3Q+Nh1GGgPwF6X9CV/K2/zghCThgaAUWmOuXLEPwcxZW8wBJxN2EJw4g3g6btCOLTEM0DPdXd6usMTnAW08hxrB4Gl3AH/YR3YF3Pq+08l3YIYucJulH8HskiWrlJXERHCcOIguC4NmjbB6KTQB8EumWgIOuMwp0Vjoww2IAIKN6UkgM0RP37JUguJeBKfshrI923ECMbghPaITgMzMmg31ONBLkEX3uaP41C4DgnDkMQa8HjMKiCwZBOvwIUKxFcTsAFLOQfI7UfQ4xMCL48GsLDgK+A3qNP2NNMH90kCNLMJgcMPj6ELxg2gQ88YOj/ugrJIgQX0MYL4syRBYUYWRCc1AptBwFngN7dHQnKA4GPo5xUlwJLEgxZBD5wCH1WcylZW6xCcAkB3xdn8koJw7CCYIGEaCcwZ4I+HLRyh0V9Wn2dQ6C1p4lUAAxJgGQxpdIiTK7XvnOXYvgGa7heLGTtxi5HcuMH4VtTQJ4N8o8gjwChqozXb5KBdSQcc21g/245NO2K628Iy99JuwwRuwyfWyh4CwGL2IxbzDnsba5HlTAMkUlk+NZc0PeA+BrIsenSkf50/QBwSdww1Pu+ly499utva/9z9kNwGy/wPfNttihhGDQIEIZzt4dtLgd5PcgdskGQZ8Mi/Hm+owmCPRSbDRbJKARfoMI95gfMNwtoK2Form/QBucdD8EfQH4EpHILv3S85tEOvsJdMBhZv6Z5gu7WEvE2SDEDyTVswU/NhWxbwtAUEH6wDUy+FOSlIKfadLW/VpANCn+jrX9B5lWjFl6WWyQTXgfWKeAjVLjL/ITDzAKCEoZCIJinDD/+AAR3gvgoSJluFskM2sH2HUU1szmBSPu478/JDIKfdgvTbqe0tkkzENzAWznHXMTEEoaGQLi4HQ78Ksj/C2p71x3P1pTZzofGfQhvqTZAN9AJrK1tbwJravvrgK5azNX9dUWYSdIRQUozh4SHU913bhuSLzOGX5irmDXc4w3DFISfbgFiIURHV9MojKW/QJPcsZanL8GzX8C5hRFE6yFcD3otRMsgeh7ClyH8J4SrIHoD9Bro6qyez3qgQkArCoVkDAHjUYwnYBIBUwiYRsAMFJuhaEPRTkCFAJHYv5Clv6K+r0KSrWNOpuz3ZMbC51DcJuZbYC9hsIFwza6gL4NoN7fw+/QupwHQQCdZddMQroNoNURPQPgg6Ceg+3nQS+GZ5YJiH7qZzngqbIdkOhVmongHinejmErAWAIquTvusiT3JeUyJQPSAfw3a7hQHE9nCYM7WiRh54MgvAz0VunCn0cz5Emr6N0MhJ0QrYDoftB3QfgIrH9M8MjqIbtv+xHQxUwUO6PYE8X+KKahGEeAStQasgEgkjTDQK1QX6cRXIThdHEEq0sYBoDwYAWWfRKib4MZlw5AxEDTqdG0bBcA0TqIXoDoFtC/gbV/EdyzatiamPsRUOHtVJhNhblI3oViEgHKy4RKy4LtEe7AA4Iks0lwM4bPig/yUglDLwg3tYM+tbZV0k2jpHyjJCiSxigPgKATwuerAES3QHS/4OaNblikAcFcZqI4AMlcAnZHMYGgFgBNM5V8/Qfbe5noP/TUP4Tgo+JAntjkYTDcNQY6zgZ9YnXscSMQZMlGtYKgQa+E6G4Ir4aOOwU3rWGEFAOSY9iJVo5EMg/FTBQtmf0IHxCUFwg9GmIJAUeJ9/LXTRYGw+3jofs8MJ/oP/CmZzMeplIaCF7aIaqZQdfChqsEVz3BCC/mWMYxhkNRnIDi3QS0o2qRKVfqt8wAhy8Q9ZEmwTHsx31DNaJODB0It04C9SPQ8/3MoiwOs7dmiEA/B9Fl0HWV4JLlbGLFzKOFrZiD4osE7ItktNOx9knz9neibdtyJB9nL347FECIoQHh9vGgLqmCYAoEwXuEmga9DKJFsP4ywUWvsIkXcwIVJvF+JCfXIlLtmUFQHjCkA/EaAUeKPbhnxMNg+NM46Dof9Mft5lBen8ErgmQgehX05dB5keB7/6As/Z/PSbQynkNp4atIdkfV9Vv4hliTzKN0cwkEL6GYL3bj3hELg+E3o2H098CcMBAA4wGAacA8CteCvhHEtwVn/L0U+5Rn9TXGM4GPIjkZyVt7e7obgcEHhD4gliGZK97JQyMOhmo/QvhNMKf0OcvGA4asKRgDHGZd7RXWC6Dzl4Izw1LUMzy3bzMDxQICjkTRnjjnUp6+BjsIPftP08LBYhbPjRgYqj3LH/wcmO+DDuwANAKDE4Q3wFwF684RfP2lUrRzPr+LqbCBuSjOQPE2VK2PwqdHOq926APiHhRzxQ6s2OhhqE7l+JcPgrgazJhk08jk1AoDHGYN0eNVLfT6bwRnlusVFPEsz2crWvgGAcegGOXVz5A9olSVStUPiJ8zhk+LLZs76cAgwPD4bhAthmiqn5/gA0RSx1vYCdENoE8TnFg6yM3QEq18FMkCJNv19k34RpOy+A19GsIgOJdlnC7mNG8OWNFcEJ6dCht+DXpXf7PIBwhnROk10N+AsZcK5neVotvEZ3s576CFHxKwNxLlBUNWEPqbSxsQfIptuUaI5vRBiOaB8GA7jF0E+qg+4faFISsQkQH9GIRfEHzirlJUBwmIq5lMC2ehOA5FW2KOUh4QBg4tXYnkELEVDzTjemRzQDASJn4J5Dz7lamMdyHxPA3yTlAfLkEY3CKOZSUv80UkZyB5I5ew26fHt4OkmIzgJ+bV5kxH06Rhny8cAPK06nhlm1clPO6KV1MSgrwO5NGCo58txXMIgPgiG/grCxGchOTV1MemUh6zcoLQE87dBcV3jaFl2JtJhqVbgrwLzCy3aZSlw81pGnXXcopOEczvKMVyGJhNt3EIkh+j2DZRoPOYSf3NpYiAzzCORUXmMMliQTAVqJwLalZygFmQX59KQG4AdR50fbkEYRhpiQNZjORjSJ5FYgqNLPUXJYXgf1jDTsPYTHrtGFBHu+cOSRsB4nVX1oH4FnScLpi/vhTBYQbE/tyN4WgUj6NiQLh6q33Npv7t6RQCLjCG0cPOTDL8cxroe6tjl02CWZQUUTIpppHeANHZIM4WzCnTKoazyXQ/uyK4DslMJKKBHuiBnXD9X79Che8VEW4VxYBgAlh9OZhj7RAYTxCiBP8h6gJzLrx8Vk8fgjGm7FkeIgXgPCBE7zHzAO8h4OcopjtGuKXHVUTKvmAVitlCND5stCAY3vww6BuAYKDwpznNPs6zCUFfDOu+IpjTO72IMaZrOFz/EP32UH7eCwYA8zD7U+FqJFvk6ltwOdK1VyPACBZLmCsEG4ZUGAxvbAbqPjDb24U/i3awwRLpaup15/GCvfuNRzbGrB3EaxcFnCMG+f8U9d+8/3scBgDzGEehuATFuLpVRf1iKo75XI3oe9WgNRzfKrhyyGAwGAFd3wR9mlsT2LSEC4q4mRSZ6voL+kjBbgOyFo0xqxoQNNEEYRVDCEqzrj9TnRUGEDzDSQjO7ddT7asZ7NogLllLu+A940T+7NYGYejcEeR91XmOkkwjHy1h1Q7PAIcKdnza+vvGrMhwTWIQIRGD9Ps+5zb7+0TMTJL2Z0XAUhYScGJvLpMtUzVhlu8ebaCFs4n9zhj4Wl5nWuQHwQTA9aCPSIYgyTxKNJlWgT5G8LZbnf/BmJcyPsyGH3ZOYRMb0ffn+S6RBgOAWck4urgBwfv7RZg8zCPTZxINkKq6/Y4QZk8S/G1QYejGHCzhJoEJql+SVytY07i7QP8nzDgvqYfRGLM06cEU8XBzfGeW80WD/6VZv5P7s0kwAJgXmEkri1Fs7wVB7dvi2iDBAP/VJDhCiOxz3IqcWqHSBXdK2Lsn3bz6ZYb8TrSp9xOuh67jBDskRgeMMUsyCE8RIOQVHFHQ8WYJtiiqLg0GAPMah1LhWiRjXH5CzEFOBaFOokIFcyaJ7LNr5IKhE3OogZskyP5T9Zve1+waofczS2D9+wQzXki9qcY8nvGBNyqAIid8RQleoYLr8epzLDsMBsEazkVwci21YgAIBn8QLFAsngqHZ9UOIo9WWAt3ippWsK9lUa8pMmmItaCPFWzxS6//YswjOYRBDJJgFfm5Is91fdanEUl69YYBwKxiAi3cgmLPHv/B5SBnAaFWFxrYf2vBH7LIdua1tt6EA4G96gEwdSBU90Vd0pOqQVF/po69CqqhYnE5XPirTK5L9pasaIHJKrB5fyuPgMbPNY738f363zEpdfWf92+FJ7LarOVkJL9GMdFYTKKsENTVBxr+0xj+KAS6KZrBYNQquF3AHJ8lhWXMfErWCtHTEOwnGOM9u50x5r6M2iDPa14zwxe0PN8lMv5n399Nq3Mdr3egMy2MbgxnaTjVgGoEBEtdGMLsGYL7m6IZVsBeAvZ1aYX6OtnvmKgBIeu0RD+tsAHU1wXtWad57M7Q0mcRwqyCluXz3oLlccz3901KnU+jaSz31hQQmfyuhkM07OobezR+YATAfxjDMb79Dt4wLMBIAyebatcIWACoh8JlOonavug7y4BcDC035orwNi6kaQLrC1bS7+eBQWT8ftt7E9tPOm6DxniYTA0VIVjdaTjDwPUaRukcELhMJgMffgpmAU8WaiYtx+xk4CEBLVmWDXavvdnrZP8T5P4C8UhmZ96YW5uh6nEvKisyAiRShDftu/N+n0i5bt/PCs//Vu9Aq+zPEdUB1xo4Uldbx8TwqQcEvceBC94mOKlQzRDCcS4Q4k2MTNAUfa8CAVohFuUBIaYZsgp9ViH0FTAfOLK+9xXGrIIsPZzjNIe5kKxfIYjWGM6MYH8NkzxCp17mUm37yNOG03YQvFkIDC9h2rvhWN81to0HJLXXVzfADxq4j905W/9mtqJ5W9ws/62+Tub8j9oRZRIpPoMrgtQQGGMFj64wXGPgRBPTDnm0Qt02eT0cAVyR9h+8YsKdVQdnqyyrISettRlVNY0O4ZLRiBcbhCFtCxPeh3Vbt2PftnUn1MUuc0Bd5FnnM0OCsfVaWupMhjrXhuUVhzOdq2j4voaVPstP+ixNWXdxn1xg0mU9lWaDEc/AzQIOyboAfXK4lZcE7DYW8Vrem2eM+VmDtrpPnSiotZc5fzvtPJnhs83aeq8tj8/QzwoxLNTwHz3awaYRyKYZalY+79xN8HhDZtKTsKWAA7LecekwnUxfJ+MVExsAoVa6ChTWLALo+9n649rzvKy32uQUXhP7vUb6pgrzH9bDjyvwSQMTsoRUiYFC/+OBgY8AZzRkJkUwV0OrzzKBOkF9xepWGbikgHvXnWNLM3fClM/4mlKhxUxy1UU5N98pyxOTwVLMpbgJFD9WqKk0U7Akgv8XgklamNhncYLYNv96g8qtGQxGPArzohzOsnBrBiPguimIZQXAEGYMS+Zp/X1b86Tv0I46mxbQHorWdcttXUDxvlBivyFjTrUcaMoPiDzFHehCx5ILuEDDRzSMzuEwD6C49vkdtoJdgQdzwfAIvEXAnjQgMZantl7CTwu6b90Z4+CNCr/M4A+k1aWZTtKjnZEOgdcOv0J71NmAMI4IeVNMpbfAI0/CHzUcaHJA4NgEcFRuGCI4TEDFN/aX9LTqDNS/bE1h63R1eQiqLxTS47hO+WzSucIhpGk2vchwjsvfMAxMLtYJmiEOhImBEBd+U6R2EALzqOEKA3M0VBqBIGbXfcgYTnGlZyTAYISBg4yj6ZUWMGwSEXtaoYFFAqEL1AxZW+8iIi8yQ4svE0wXFxw6BRjpMImwdO2kQU0KEMLiI8TrmjHlzk0hvGxgWh4AtCUWbGDGHbA98HQmGB6EURHs49IEJqWu3siseyKvATcWeMO6M9jwPnUyIxB4tPARfhkrLnPIODSCsfgCBnvOpIx1ssXNJCyaAIcTLYrWBLays6DjL4ZrIjiVujBr1s6Q2DGp4f2ZYeiCvYBxcS3gep8ERt3+r3dAvFHgPQubHGOXnsddLbm27MuYA+0j+PH38dBo/HbLmBYwlscU1xRxhU6d7yoHwzyymOk3aviSgVG+ppAjtFoPyYHAhZlgiOB9OLSASdEIWJ4w0CXgfwu+X12DJPhJpk7asA6RAIF2QCUTQLAlBUsGZs9Lh2kUb8fiZpELgDgEJmYuFQ7GUnhoK3gW2NnDH3Bpg/j+fosNrYdYZt8LXP5CBPvkyTwz7qZ6JVD0yjrdBdr5WTSCfbRr8nHtcaxeqHVCJ5kruiMtoU8bFDJmHtnqfGWsaZphviD6g+EXGnbq6ZHGw0ewmUx1x8dreBfwZy8YfgPtGnbzScK33X2Hl7p4d8TaYQCDSGjls9S5nF9bK+8KXwrHvq7TDjZzxWYyxf2GtDoXEMbS2rvqbB1yhZYQfmXgq9TGOvjAQLp22NsbBgF7aGhzAeBrMtVHkTTc0YTGo5viHN1GWn7XexcIwmLX21p9bdEA2qEdbEJvYvuqTm6wdNTVD04nBqgLCNFkLfFwBK8Ab9X+plCaQz0bWBj/IVc6xt6+XeEJ3d/1+QbrgN81CQafbFVbmoUt/SIpJSNL+kVaykZStmpIcpqGLRlYk57x6lp02zXs2KfjtynaoL7MEYQh3OFzM9Lq627WXrYs1sChmt5ta/mT6lL8i0dnI14dIs2Q1fzx0R6S9AF9OsEk0rFzjeO4TQu4Wn1jCY/aepJtDaC0aAzfKGbTp/XX8DsDx9fGNXs50ZCYXLX5DJgGPJ8CgxEadrGZRXFV4vIbLHD8sUn3qSgYpKf5IzPAIRMAS1q+Ly26Y1KO9dQpiwAnJWbGv98XjKZrhxDuN9XIYeDjJJMCRrWTm11SYVgMY7urOUkDhD5tigTHFBKhhD81EYYsznCaRiAmnHgKc2Spiwusy4GWFqfZJuz1Ah73H+LPXaaYwRY3sZ+fEAfL1gs9KCAAHA7P/gKWAzOSWn0PjVD/fhfgpkQYumFHXXcT07SCSIFBQOf6hOSogmDI6+SKlNbbt+X3eXUtyJTU0tvMJOlwklXsNa01t2mGJCjSvqdpUAiBud5wXxyGJMHXjj9WV79zqs/QBbu4Jh8yDhhSzKkXDod/DLKZJGksWlSE8MsEPyIu7PHlOXQCLEmmT1aNYNMOtkiWtsDBYJpLEdwr4JiehjpN8E1CzLd2MekwGNhe4zcHYhIMddri73X9JUMBQ5L5k0X4XX6AzZySHr6By0ewQSBJnxVFZdQEceWuU4AwGeSt8GLgqbAaYWvJoQUG/LkQZi4wyDPrpp8MLM7KdNdIDiyhA+k4Vvu8MSSPOx0EMylJ+NPMpEY1RBoItgVeXVDUH7OdB96ZzE67P2lGwqwTBBStGZ6Oqs/bG4YUWtu2hq2AF50waJhuPIWfBGh07zX4zWaWs3Q5hNRX+Mkh8FkiQ2mtv80kskWNkjrS6h+FItuQTNss0EkAJGmKppaPwUs/gVVQXQTdVz3phJsgYXoiDBFMT1oYIGl+QYs5FZpY+KoJmsFX+H3Mn0Yd4qSl+RTJS3271rGJawRXNoJ0+JQueUlacUg6zCWRYno1rwhMZFgCbJOh9U/09HUVht9bYfgpZoKGcSIh3ECC1rDMQBUKeKGJtygkexKdzOEwZzWFbFBoS51J0BhJGkHG4LBFler3SXhUrnTzeJdRnghV0Z1vzxmYYzyFPUkl1gh/i9OB7obNlaNHsSeYnhGGtR9vTs9zWj9DHi2RxfxpxDeIw5CkGWy+gcrQ+vtGkbAIvw8Ag6ohwioM/Xq9jR0aLxvRwBQnDBo2czUhUcpdtMFgmhdSTfIZfNIlmgmDzFCXpBHix5VFOxiHlqjvc3A5uq7Hlzbm2qSEe5vZ8r0o+oIJia2+cUel6vc3S4Jhiklu6Z130mZKGXi9yTB0F+An5DGRfPyEtDqfTVn6FOJ1PmaRSdEMPhDYhH9Qi4FV2gMGl3awhNDcmiGEKfEBtFlAIBaSYOhgyGMa5QmRpqxl3/BmUuqUBYI0c8k42jkXCPFxGTLFRGvmw14t6uTcpAh82p/SSTAIGOPzJcLjeA2mfzbfjMzkM8iMmsKnTnn6DMpyXFmO+8IQd55VgqaoN5mIWb1xS9g2e0fS4J9BC7GGsEp6wpCmHWplTJJmaBd+Qu7llQ0CDF0ZQqZJHWl5o0eupDtf/yAeMq2HQqXAYNMIqgEHuh4KYemDiHcADnrnWxesrtRk3PeHUhr3dicMUW0xEtedynqlBlYPIzMpr/BnjRjZWvk0bRDV7RuH8yxjEOAAIwkSm0kU1WkL11iMLDO0NLO8GTb4OzEbstUJgwEV75ExBf3wRghDI0BozwhRvIdZxLSFzVwyjqhSHJKefeVW3APg0HVQRHV19Vt8xr1B8xnWgWmluNFEJnZv4tGksUX2kWhYOwxgaDSvKClalOQfiDqhttW5IDEOAJKiS1giTGmCqiymURIIrmGgg1baYW036AK/MtFnKKwIiv3X1t8Q1WkqjTHC0cq6Jgo3jtbYNnAm3hoL0meOiMcZXIm9NoESObp00pa50ikhU+FpGhEDgsEGImrid8d9ho4Cv1tSS6rayMugjPMti5eZNNrkG6vhKmuSzKRQDAXuZSmLR+kEERT0XcISfY3D0FWUM1w7f0L5CMtSYBnXXR3Mn1lVO2zPDUkwrDN+Qp56Tm2bVD6/shQYLZkga2aSaACCumPrUn2GRoCIeYQlDGUprIQwUYIUHoIO9lXfY7La4YQhhBW+wWPjAYOwZMGWpSwNRDImRHUwJAFhG3IQ1xgGVjhhMLAi/gU6Iwyx8aglDGUprGiYSCyaJNyC7mM2rUjyGV7Pkh/uMcRu2/IRlqWo0gXbKA8YpKf/EB9iIGM+w2tR3fq78Vlssy5MHMLoT2Gmlo+xLAVphukhiLwLZlvqVjhh+AFitYY3fRahTlsgvbYFErYrH2NZCnKgp4f5hH7Ae1PdX5qoUSJ4rj4RxWf6b9vc6rX9IIS3lo+xLAV4z6Jngrs0INJAqJua/jmnz0DfCbu6/ACT7DDH/QcFvK18kmVptHwAtg5hou/M8Lb38c465QNDmmOcYWo/AexYPsqyNFoE7BBCRVqE3DXLQdLMkEDnLHg5EYYIluTQAE5IDOwCRjRxvtWybBJWErM0BMYTBkHyFKkCnqmfZ9XlM/zdZmuZDL5DbNvusDLEWpbGI0l7hSDzLGOlLT5DCI/Gf8M28fDjom4kU5oWSBsIq6EtgD1o7sx6ZRnhznMEe9q0QNos8HFtIfrkcgAMAzTD1bBGw1JfLZAUau2JKEXwr+UTLUvesi/MDGHLyDOSpD00h4G/p2oGEEZj/m5is3H7agTHvIezy0dalrwlgncLaPFYO3CABnDUmdACg3T8+AO2tVKT1lpN6X/Yef+yJ7os+WF4r65aGF5ZETZZjdW9djss84KhG+7J28XtOK9dwHvLx1qWHP5CEMH7fHqeM6QN3YsYmINqhWEtPKih00VXGomWLdDwvvLJliVr2RXeFcEWEf5awOXL1smndSlmKwy3w7oIHtIeP5ghxHrIOzCjy8dbliwlhA9G0JY3Mc8GRwj3eMNQdaL5g2/Sk6c3P3k0zCkfb1kymEhKw9zIkqmqM8hkTDu88Qo8nAEGCOGOPFohwZxq0fDh8gmXxbfsALtpmOHrC6TJaO393c+I/hMBpMKwEu4Na+ncOoXKDI7LwbtjxpePuSw+RcMRcRMpTdZ0SuPcDbe5fs8Jw19gvYY/pNlfaZGlWBRg8xCOKB9zWdLKFMOYCI6JEgbzJDXEDi2hu+D2zDCAMBH8JgsAOj36FETwKTCyfNxlSSqtcHgEW2VxmD3k89m/1RJRM8IAGm7W0K09QlgZPP3dZsFu5eMuS4LjLDQcF0El7xBPW8Mcwi8R7klfEmH4AywN4b5GQqqWPzVKw/HlEy+L00SCd4YwO0tOXJK5VNuMgeuSfjfFXBFGww05+hSSHBsRwVFvwUwrH3tZbCWEz2to90nP9oGkduzpR+GvDcAAG+AXEWxw+QRpuUsOWidqOKF87GWJl7GG7Q0cmda3kLUhDuF6RPKM9qkw/BWWR/Bbn8hRBnNKRnDcVMzm5eMvS393gc9GMD7J1HbJXEJiXmjg2rTf9ojqCKPhp0k/6mO3Weq2BP69fPxl6Y0gGWaE8DENIq1T1wWItoNy7zPwZAEwwKuwOISXfbSDT1Jf7ZjUcMIkzDalGJSl5it8ScPkLAN1fML7ISyyZanmgmE5Yp2Gq3WCNvDJUbJc2FQNXyzFoCwYdtaxTra0ccyefWAr18KNPn9B+v9XroigK01FaT8I6n2HT7Zj3llKwyYNggKxwMDEPONmUhroa/8peLNQGJ6AJzQsTnJefHunLZGlBWCCUio21aIOBnUoKEHNntGe1oUmscOtsxsu9P0XGdIihI5gYQRRXtPIEXUSGg5RZc7SpqoVJkDlG6BG1a8KbGpQRBmgsIDxv6/DU02AAZ6D+wz83icnJCkcZoGj1cBZYLYopWNTK2O/AuodVQjiW34oNITdcF5S+kVDMICIumGhri547kWo9gREw0wEXy+T+DYlrTD2X0D9OyhVD8DANePFgImw00x0Dbe/CQ9m+TuZBe8luE3DvQlEeneU9E4PLgCFRPEJWvhgKSWbAgjjJ0Dr90BN6A9B0tYfioSGOOyC//EJpzYEA4juLjgnimmHtE4Q2zFDrCFQjEbxHdpMuabDyPYTBIz6L1D/Ul2izaUVlONV9E536rBEbuuEe7P+rVwmyco67ZBmFrmAQFiuu7rNpMK3wbSWUjNSy9aHgPpcn3kkGQiESgGiCoVF3sKoqhWiQYEBRHcEZ2sIPXNDel+NsFxb/2sXKI5gIp+vnV2WEaUVtpkJwXmgxgzUADIHEH1Q1GRscQj35flruZ3VVXB7BL/yBaFXG7iut399CwGnMYWDSukZSSDMHAejLoRg5sBWUGY0ldQALWGgw8DpebRCQzCACDV8vX4NOBcIA7SBdJpI9dtEAs5nK7NDKUUjwk8IIPgmyAP6/ATpEGwfEGzniB9hmUN1EGCADngihPNdDnSvg5x0HQp3IxEwg4DL2MJMKaVpY3eYdzkR1Akglbt1lwnvU02lpWC+k6VfoVAYQJgNcF4ES5wmkXQArxLuRX//YTaj+RGzzNhSqjbWsut8kN8A1ebWCK79JEHq/R4NagGi/1K2gwwDgHhdwyk9znSiNvABYOB9kUg+BJzDNNNWCtbGphXesz+o70MwLtlOTmo1U0Ott0LndQ1LckFXHACXIzi2F2TXqxwQCPAAH5B0ITmXiLN4XHSVUrYxgPCv7wHxc9DTk3NLezbj2K9/b2L7ehVEsxEdTzT6dwtKfRAhcBqSl1Odf5ViMrn8CEULklNo49Qyw3VjAGHfXaHyM1Bvdbf8MqN2sGkJvgUdTxYixYXegIo5DsllCIIBrb5oSCvUb+tQnMMazi01xHAF4YB3g74czNtBC/dQMJOiHVzaovf1blhxKIK1ww8GTIVWfoLiY06hrzebVAoc7kDDBiQ/IOK/+ZNYX0rfcALhA/uB/gmY6RAJP/PIx1SKgxCtAPZHvPpoUX+9+B7edrMlkruQzLICIHNuAzVlN4pL0XyNu0VHKYXDAYRDDwF+DHpbv6kj8voMOoLoM7B8USOh1Cb5DHVlnViO5CQk65w97Ao/MzKpj0JSQXICLVzCB8p+iKGFAImZ+zGoLAK1rZ8vkGYPi6Rj18Lyq4oEoTmaoXp3JJM4Fck3kUjvaJJKMKHc7zWKu9B8hlvFs6VkDrpZ1ArjvwD6NIjGJw/Vr2/lXT6DTvIRAP13iA5ELHul6EtpYiKcaWdzfoLkI4l+gfBsQJL7JgySxwj4Ar8Qd5USOlggHD0Z1FkQHgemLXlmrSjFUfYymVZCeAji+QeacTnNzQrd3ExF8WsUu2aKIPmAYDefXkPyDeBSbigjTc0F4VPvgOiHoPeGSPkBkAWIATBsAP0peOqaos2jwYEBYEuzGwGLUUzNBYMrf8vdMdmJ4gYqnMbl4h+l1BYNwQkV4KNgFkC0XTV0GnkKvy8QA+oMROfCE6cjCJt1ac0fb7ycvwInIOjI5E8lgZD8mTYkx2JYzPHm4HJMdZEgnLgVVH4E6kKQ06rZp42qea8OqGuhclYzQRgczdDjUM/gc0i+j6x1yCkPLZElodFuOr1BwFUYzuFi8VIpzY1ogzFzITod9NtBS/c8FT7h1DTtUP8+ugfMXMTDK5p9mYM4ksxUmMU3UZyCROTqgfaBYWDqh0bxBJIFPMIvuVuEpXRneWxfmQFqAegjIWpPXrfJd1pqb4f5adAHIx58bjAudXCHVU41o5nMQhSfyeQ7pCU7puVBVffXIrkRwXf4rvhbKeVpEHxtPLR+FPTJEL21rzc5bUFknxU80mDQgFkGG+Yi/vLQYF3y4I8xnmnGMZrzkXy8KTAkgaEwKF5FcgVwId8qHeyBEPygFToOheiroHcHXUmd8N1r33iYT72pFi9CdBTivnsH89KHZsD97mY8cAmS+Q050T6v9jEjmoBlKBbRymWcIl4pIbi4Ah3vh+hkiPasmkQ+k/7oHBoicXsNuo9E/PGewb4FQzf7xI5mEmP4ESoBCIV/eobKAEPfFqF4DsllGH7G18TLmx4EC1pg8hzQXwS9L0Sjk9dj8lkZPC8I0XKIPga/u7NZfQnDE4YeDdHK91Ac3+tUZ8tPyqYVJBBYz4kI+AeKa5FcyYniiZEPwcXjQR4K0Qmg96g5xyLdJEozl9I63FwdbdEyMMcgbrt3qG7J0M9LtJ8Zg+FsJCfWhnjm8x3ShtbWw+AaVBSgkbyO4ncEXI3mTv6PWDOCtICE7XcCcySE80HPgKjFb7W+PP5CUii1X27SEgiPQtz616G8PcNjkq7dTTvjORXJqSgqDadlpDvS/evsgHQS8DyKW2jhFlq5n8PFuo0PAAT8aiZ0HwDhXAh3Bz0BIpm+IJSPv5AlH8m6PQTRsYibnxzqWzV8Zqzb3VSYxCeRfJuAcdbsVd/UjCwgpG8GxToULxBwCxVuw/Agh4lVwxeAuwII3w7de4M+AqJ3gZ4EofJbB8d3xbQsZpJthFt0M2z4LOKWYdEhOsymbzSSgzkIyWUotvLWCD490kEKIGlb0AtGJ4oVVHgAyV0EPIzgcfYZQjjMXQGMnQnrdwG9J0RzQE+DaFwVgKzLimfRCLk62zToi8B8HXHDG8NF+obnXKaHm10RXIZit960DZXDf0gPsbocahsItjpd0xpvEPAEAQ8geBLJc7SzlO1ZjhBRsYL/7HhgO+icDnp7CN8B+t0Qbg7hWIgq/QU1xHsxYnyXFvTRDM76DogWwMsXIe7uHE5iN3wn9j3EbMEoFqI4ul+kKW9vdJpjbRN86YAhSAQmQtFJhXW1Xu9lKJ6nhZeR/JOAVSjeoMIaJJ0ERFRYD90VoLWaDt01ttqqMx7CSRBOgXAaRDMg2gx0G4TtNcEX/YU6JB8MWcOoefoVomXQ/Tnovg1xQzTcRG54z3J9mGlnNCchOR3F6NwzEPoAoRJ8i8BTawQJwFToW5kpIKyFc6PauRFSi5pTK6A7AK2qYEQJQu1zLKtfkBY9ytvrHP2u6h9c/dRwFbfhnd58s1iH5rso/g3BEufEAj4Tl9XXxetdm8859ZuruRH93guggqANwWgEo4FxwFhgNNAOoqWGTsIX2Y75bDLjcdeNTdvvPb8TxELonDucQRj+MADcICJ+Jm5Fsz+CnyHQqc8r6bnLjLLhC4DrOwtX2PEfLwqSLDcnDYLeumdBzoOnTkVcs2q4i9rGM/DlavEihk8j+TSCV1PHhAjPBi1N0PPIkI+si0aAiJ+T96JkxgtMaoX6HYuqM1hEcxAX3oy4e6NIm9+4RoFdITq5lJ8C+yC4FkHopamFBxBpWiSTICfIrMj6wSwfEgVtPjfK2co8A+IYWH084kcbVVbwRjgkUhguFktQfALDUcDTTm2Q10zOoiFkgq8hizCZ6h+Va8ur2ijoJklArgfxQzD7IBZej7iic2OTrI13fPD5YgMXiF8QsTdwLoI1drO1yT7C8G44CtYYTrV7N5gD4ZmTEd/daNPhN/7B8ueLFYzmv4DZtZFsUaYGrSi/YVgIfpKN53uhMov2WArmk9BxKOJb9wzHvoOR08+QtZxkWpnAgQScgWSP1MxWnzEPPkl+efKeBnwuS85QWkeZz3FXz7JXZ9oqiC6B6DzEaa+OFPEZmUvLftmMZhKHIvkqkj1S0zTyJPVlzW+SRcGgyZdg10iaRVQHgV4E0fnQ8Q/EmXokic3IXmd5gWlnFIdR4WQk70HV0jp8YZAFgWFLEvSGIQ0Cn9Zfe9QlQrASwsthwwUjEYJNA4Y+KNqYyD4oTkJyUG0VIP90jaxp4ElawAmUT1pEoxAknWeFYQmYS2HdlfDF1xDCjGQx2TRg6IMiYHN2pMKngXkETE1cilfGWnJJtoFCSblNMg0G3YAfkPZdtvN684i6Qd9dNYc6foX4/Caz9sWmBUNvMYLzGM84DiPgEyj27R1h55vlakv/lp5aIBWGNBB8tUgmv2AZRD8HcSU8uQRx5iY32domCkNdud4oupmOZB6KI1G8C4nM5UNk9SlkVhiS6vOkYEcrILoFzHVQ+T3i8HWbsiiUMNSXu0zASmZR4d+QHFwbXFTJPAVNnjqpG2z5faZ7jAD9IoR3grkR1t4B89aOdF+ghKFhS8pIbmIKo9gfwfuRzEExDYXIPGCoKTB4j0/ugOjPYG6H7ttg1WMwv3so5iUqYRhJ5tQUtqXCbCSzUeyF5O0oWgoBIhEG7esgG9DLQd8P0b1g7oHoYdizs2z9SxiaqTkES2llFbNQ7ETAzkh2RDKzpkHGZAJEag8N0HssAv0yRM+Bfgq6HwPzKISPwo0rR2o/QAnDxmpiLWMqMJ1WtgamoJiMYjKSyQSMQjIGhULQhqINpaPqYHltIFoLUSdEq6sdXtEK0K9D9AqYpRAtQ2xXrn9dlrKUpSxlKUtZylKWwSj/HyHl/ePsagXCAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/includes/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/includes/farbtastic.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBGYXJidGFzdGljIENvbG9yIFBpY2tlciAxLjINCiAqIMKpIDIwMDggU3RldmVuIFdpdHRlbnMNCiAqDQogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQ0KICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yDQogKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KICoNCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQogKg0KICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0ENCiAqLw0KDQpqUXVlcnkuZm4uZmFyYnRhc3RpYyA9IGZ1bmN0aW9uIChjYWxsYmFjayl7DQogICQuZmFyYnRhc3RpYyh0aGlzLCBjYWxsYmFjayk7DQogIHJldHVybiB0aGlzOw0KfTsNCg0KalF1ZXJ5LmZhcmJ0YXN0aWMgPSBmdW5jdGlvbiAoY29udGFpbmVyLCBjYWxsYmFjayl7DQogIHZhciBjb250YWluZXIgPSAkKGNvbnRhaW5lcikuZ2V0KDApOw0KICByZXR1cm4gY29udGFpbmVyLmZhcmJ0YXN0aWMgfHwgKGNvbnRhaW5lci5mYXJidGFzdGljID0gbmV3IGpRdWVyeS5fZmFyYnRhc3RpYyhjb250YWluZXIsIGNhbGxiYWNrKSk7DQp9DQoNCmpRdWVyeS5fZmFyYnRhc3RpYyA9IGZ1bmN0aW9uIChjb250YWluZXIsIGNhbGxiYWNrKXsNCiAgLy8gU3RvcmUgZmFyYnRhc3RpYyBvYmplY3QNCiAgdmFyIGZiID0gdGhpczsNCg0KICAvLyBJbnNlcnQgbWFya3VwDQogICQoY29udGFpbmVyKS5odG1sKCc8ZGl2IGNsYXNzPSJmYXJidGFzdGljIj48ZGl2IGNsYXNzPSJjb2xvciI+PC9kaXY+PGRpdiBjbGFzcz0id2hlZWwiPjwvZGl2PjxkaXYgY2xhc3M9Im92ZXJsYXkiPjwvZGl2PjxkaXYgY2xhc3M9ImgtbWFya2VyIG1hcmtlciI+PC9kaXY+PGRpdiBjbGFzcz0ic2wtbWFya2VyIG1hcmtlciI+PC9kaXY+PC9kaXY+Jyk7DQogIHZhciBlID0gJCgnLmZhcmJ0YXN0aWMnLCBjb250YWluZXIpOw0KICBmYi53aGVlbCA9ICQoJy53aGVlbCcsIGNvbnRhaW5lcikuZ2V0KDApOw0KICAvLyBEaW1lbnNpb25zDQogIGZiLnJhZGl1cyA9IDg0Ow0KICBmYi5zcXVhcmUgPSAxMDA7DQogIGZiLndpZHRoID0gMTk0Ow0KDQogIC8vIEZpeCBiYWNrZ3JvdW5kIFBOR3MgaW4gSUU2DQogIGlmIChuYXZpZ2F0b3IuYXBwVmVyc2lvbi5tYXRjaCgvTVNJRSBbMC02XVwuLykpew0KICAgICQoJyonLCBlKS5lYWNoKGZ1bmN0aW9uICgpew0KICAgICAgaWYgKHRoaXMuY3VycmVudFN0eWxlLmJhY2tncm91bmRJbWFnZSAhPSAnbm9uZScpew0KICAgICAgICB2YXIgaW1hZ2UgPSB0aGlzLmN1cnJlbnRTdHlsZS5iYWNrZ3JvdW5kSW1hZ2U7DQogICAgICAgIGltYWdlID0gdGhpcy5jdXJyZW50U3R5bGUuYmFja2dyb3VuZEltYWdlLnN1YnN0cmluZyg1LCBpbWFnZS5sZW5ndGggLSAyKTsNCiAgICAgICAgJCh0aGlzKS5jc3Moew0KICAgICAgICAgICdiYWNrZ3JvdW5kSW1hZ2UnOiAnbm9uZScsDQogICAgICAgICAgJ2ZpbHRlcic6ICJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQWxwaGFJbWFnZUxvYWRlcihlbmFibGVkPXRydWUsIHNpemluZ01ldGhvZD1jcm9wLCBzcmM9JyIgKyBpbWFnZSArICInKSINCiAgICAgICAgfSk7DQogICAgICB9DQogICAgfSk7DQogIH0NCg0KICAvKioNCiAgICogTGluayB0byB0aGUgZ2l2ZW4gZWxlbWVudChzKSBvciBjYWxsYmFjay4NCiAgICovDQogIGZiLmxpbmtUbyA9IGZ1bmN0aW9uIChjYWxsYmFjayl7DQogICAgLy8gVW5iaW5kIHByZXZpb3VzIG5vZGVzDQogICAgaWYgKHR5cGVvZiBmYi5jYWxsYmFjayA9PSAnb2JqZWN0Jyl7DQogICAgICAkKGZiLmNhbGxiYWNrKS51bmJpbmQoJ2tleXVwJywgZmIudXBkYXRlVmFsdWUpOw0KICAgIH0NCg0KICAgIC8vIFJlc2V0IGNvbG9yDQogICAgZmIuY29sb3IgPSBudWxsOw0KDQogICAgLy8gQmluZCBjYWxsYmFjayBvciBlbGVtZW50cw0KICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT0gJ2Z1bmN0aW9uJyl7DQogICAgICBmYi5jYWxsYmFjayA9IGNhbGxiYWNrOw0KICAgIH0NCiAgICBlbHNlIGlmICh0eXBlb2YgY2FsbGJhY2sgPT0gJ29iamVjdCcgfHwgdHlwZW9mIGNhbGxiYWNrID09ICdzdHJpbmcnKXsNCiAgICAgIGZiLmNhbGxiYWNrID0gJChjYWxsYmFjayk7DQogICAgICBmYi5jYWxsYmFjay5iaW5kKCdrZXl1cCcsIGZiLnVwZGF0ZVZhbHVlKTsNCiAgICAgIGlmIChmYi5jYWxsYmFjay5nZXQoMCkudmFsdWUpew0KICAgICAgICBmYi5zZXRDb2xvcihmYi5jYWxsYmFjay5nZXQoMCkudmFsdWUpOw0KICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gdGhpczsNCiAgfQ0KICBmYi51cGRhdGVWYWx1ZSA9IGZ1bmN0aW9uIChldmVudCl7DQogICAgaWYgKHRoaXMudmFsdWUgJiYgdGhpcy52YWx1ZSAhPSBmYi5jb2xvcil7DQogICAgICBmYi5zZXRDb2xvcih0aGlzLnZhbHVlKTsNCiAgICB9DQogIH0NCg0KICAvKioNCiAgICogQ2hhbmdlIGNvbG9yIHdpdGggSFRNTCBzeW50YXggIzEyMzQ1Ng0KICAgKi8NCiAgZmIuc2V0Q29sb3IgPSBmdW5jdGlvbiAoY29sb3Ipew0KICAgIHZhciB1bnBhY2sgPSBmYi51bnBhY2soY29sb3IpOw0KICAgIGlmIChmYi5jb2xvciAhPSBjb2xvciAmJiB1bnBhY2spew0KICAgICAgZmIuY29sb3IgPSBjb2xvcjsNCiAgICAgIGZiLnJnYiA9IHVucGFjazsNCiAgICAgIGZiLmhzbCA9IGZiLlJHQlRvSFNMKGZiLnJnYik7DQogICAgICBmYi51cGRhdGVEaXNwbGF5KCk7DQogICAgfQ0KICAgIHJldHVybiB0aGlzOw0KICB9DQoNCiAgLyoqDQogICAqIENoYW5nZSBjb2xvciB3aXRoIEhTTCB0cmlwbGV0IFswLi4xLCAwLi4xLCAwLi4xXQ0KICAgKi8NCiAgZmIuc2V0SFNMID0gZnVuY3Rpb24gKGhzbCl7DQogICAgZmIuaHNsID0gaHNsOw0KICAgIGZiLnJnYiA9IGZiLkhTTFRvUkdCKGhzbCk7DQogICAgZmIuY29sb3IgPSBmYi5wYWNrKGZiLnJnYik7DQogICAgZmIudXBkYXRlRGlzcGxheSgpOw0KICAgIHJldHVybiB0aGlzOw0KICB9DQoNCiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCg0KICAvKioNCiAgICogUmV0cmlldmUgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBnaXZlbiBldmVudCByZWxhdGl2ZSB0byB0aGUgY2VudGVyDQogICAqIG9mIHRoZSB3aWRnZXQuDQogICAqLw0KICBmYi53aWRnZXRDb29yZHMgPSBmdW5jdGlvbiAoZXZlbnQpew0KICAgIHZhciB4LCB5Ow0KICAgIHZhciBlbCA9IGV2ZW50LnRhcmdldCB8fCBldmVudC5zcmNFbGVtZW50Ow0KICAgIHZhciByZWZlcmVuY2UgPSBmYi53aGVlbDsNCg0KICAgIGlmICh0eXBlb2YgZXZlbnQub2Zmc2V0WCAhPSAndW5kZWZpbmVkJyl7DQogICAgICAvLyBVc2Ugb2Zmc2V0IGNvb3JkaW5hdGVzIGFuZCBmaW5kIGNvbW1vbiBvZmZzZXRQYXJlbnQNCiAgICAgIHZhciBwb3MgPSB7IHg6IGV2ZW50Lm9mZnNldFgsIHk6IGV2ZW50Lm9mZnNldFkgfTsNCg0KICAgICAgLy8gU2VuZCB0aGUgY29vcmRpbmF0ZXMgdXB3YXJkcyB0aHJvdWdoIHRoZSBvZmZzZXRQYXJlbnQgY2hhaW4uDQogICAgICB2YXIgZSA9IGVsOw0KICAgICAgd2hpbGUgKGUpew0KICAgICAgICBlLm1vdXNlWCA9IHBvcy54Ow0KICAgICAgICBlLm1vdXNlWSA9IHBvcy55Ow0KICAgICAgICBwb3MueCArPSBlLm9mZnNldExlZnQ7DQogICAgICAgIHBvcy55ICs9IGUub2Zmc2V0VG9wOw0KICAgICAgICBlID0gZS5vZmZzZXRQYXJlbnQ7DQogICAgICB9DQoNCiAgICAgIC8vIExvb2sgZm9yIHRoZSBjb29yZGluYXRlcyBzdGFydGluZyBmcm9tIHRoZSB3aGVlbCB3aWRnZXQuDQogICAgICB2YXIgZSA9IHJlZmVyZW5jZTsNCiAgICAgIHZhciBvZmZzZXQgPSB7IHg6IDAsIHk6IDAgfQ0KICAgICAgd2hpbGUgKGUpew0KICAgICAgICBpZiAodHlwZW9mIGUubW91c2VYICE9ICd1bmRlZmluZWQnKXsNCiAgICAgICAgICB4ID0gZS5tb3VzZVggLSBvZmZzZXQueDsNCiAgICAgICAgICB5ID0gZS5tb3VzZVkgLSBvZmZzZXQueTsNCiAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgICAgICBvZmZzZXQueCArPSBlLm9mZnNldExlZnQ7DQogICAgICAgIG9mZnNldC55ICs9IGUub2Zmc2V0VG9wOw0KICAgICAgICBlID0gZS5vZmZzZXRQYXJlbnQ7DQogICAgICB9DQoNCiAgICAgIC8vIFJlc2V0IHN0b3JlZCBjb29yZGluYXRlcw0KICAgICAgZSA9IGVsOw0KICAgICAgd2hpbGUgKGUpew0KICAgICAgICBlLm1vdXNlWCA9IHVuZGVmaW5lZDsNCiAgICAgICAgZS5tb3VzZVkgPSB1bmRlZmluZWQ7DQogICAgICAgIGUgPSBlLm9mZnNldFBhcmVudDsNCiAgICAgIH0NCiAgICB9DQogICAgZWxzZSB7DQogICAgICAvLyBVc2UgYWJzb2x1dGUgY29vcmRpbmF0ZXMNCiAgICAgIHZhciBwb3MgPSBmYi5hYnNvbHV0ZVBvc2l0aW9uKHJlZmVyZW5jZSk7DQogICAgICB4ID0gKGV2ZW50LnBhZ2VYIHx8IDAqKGV2ZW50LmNsaWVudFggKyAkKCdodG1sJykuZ2V0KDApLnNjcm9sbExlZnQpKSAtIHBvcy54Ow0KICAgICAgeSA9IChldmVudC5wYWdlWSB8fCAwKihldmVudC5jbGllbnRZICsgJCgnaHRtbCcpLmdldCgwKS5zY3JvbGxUb3ApKSAtIHBvcy55Ow0KICAgIH0NCiAgICAvLyBTdWJ0cmFjdCBkaXN0YW5jZSB0byBtaWRkbGUNCiAgICByZXR1cm4geyB4OiB4IC0gZmIud2lkdGggLyAyLCB5OiB5IC0gZmIud2lkdGggLyAyIH07DQogIH0NCg0KICAvKioNCiAgICogTW91c2Vkb3duIGhhbmRsZXINCiAgICovDQogIGZiLm1vdXNlZG93biA9IGZ1bmN0aW9uIChldmVudCl7DQogICAgLy8gQ2FwdHVyZSBtb3VzZQ0KICAgIGlmICghZG9jdW1lbnQuZHJhZ2dpbmcpew0KICAgICAgJChkb2N1bWVudCkuYmluZCgnbW91c2Vtb3ZlJywgZmIubW91c2Vtb3ZlKS5iaW5kKCdtb3VzZXVwJywgZmIubW91c2V1cCk7DQogICAgICBkb2N1bWVudC5kcmFnZ2luZyA9IHRydWU7DQogICAgfQ0KDQogICAgLy8gQ2hlY2sgd2hpY2ggYXJlYSBpcyBiZWluZyBkcmFnZ2VkDQogICAgdmFyIHBvcyA9IGZiLndpZGdldENvb3JkcyhldmVudCk7DQogICAgZmIuY2lyY2xlRHJhZyA9IE1hdGgubWF4KE1hdGguYWJzKHBvcy54KSwgTWF0aC5hYnMocG9zLnkpKSAqIDIgPiBmYi5zcXVhcmU7DQoNCiAgICAvLyBQcm9jZXNzDQogICAgZmIubW91c2Vtb3ZlKGV2ZW50KTsNCiAgICByZXR1cm4gZmFsc2U7DQogIH0NCg0KICAvKioNCiAgICogTW91c2Vtb3ZlIGhhbmRsZXINCiAgICovDQogIGZiLm1vdXNlbW92ZSA9IGZ1bmN0aW9uIChldmVudCl7DQogICAgLy8gR2V0IGNvb3JkaW5hdGVzIHJlbGF0aXZlIHRvIGNvbG9yIHBpY2tlciBjZW50ZXINCiAgICB2YXIgcG9zID0gZmIud2lkZ2V0Q29vcmRzKGV2ZW50KTsNCg0KICAgIC8vIFNldCBuZXcgSFNMIHBhcmFtZXRlcnMNCiAgICBpZiAoZmIuY2lyY2xlRHJhZyl7DQogICAgICB2YXIgaHVlID0gTWF0aC5hdGFuMihwb3MueCwgLXBvcy55KSAvIDYuMjg7DQogICAgICBpZiAoaHVlIDwgMCkgaHVlICs9IDE7DQogICAgICBmYi5zZXRIU0woW2h1ZSwgZmIuaHNsWzFdLCBmYi5oc2xbMl1dKTsNCiAgICB9DQogICAgZWxzZSB7DQogICAgICB2YXIgc2F0ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgLShwb3MueCAvIGZiLnNxdWFyZSkgKyAuNSkpOw0KICAgICAgdmFyIGx1bSA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIC0ocG9zLnkgLyBmYi5zcXVhcmUpICsgLjUpKTsNCiAgICAgIGZiLnNldEhTTChbZmIuaHNsWzBdLCBzYXQsIGx1bV0pOw0KICAgIH0NCiAgICByZXR1cm4gZmFsc2U7DQogIH0NCg0KICAvKioNCiAgICogTW91c2V1cCBoYW5kbGVyDQogICAqLw0KICBmYi5tb3VzZXVwID0gZnVuY3Rpb24gKCl7DQogICAgLy8gVW5jYXB0dXJlIG1vdXNlDQogICAgJChkb2N1bWVudCkudW5iaW5kKCdtb3VzZW1vdmUnLCBmYi5tb3VzZW1vdmUpOw0KICAgICQoZG9jdW1lbnQpLnVuYmluZCgnbW91c2V1cCcsIGZiLm1vdXNldXApOw0KICAgIGRvY3VtZW50LmRyYWdnaW5nID0gZmFsc2U7DQogIH0NCg0KICAvKioNCiAgICogVXBkYXRlIHRoZSBtYXJrZXJzIGFuZCBzdHlsZXMNCiAgICovDQogIGZiLnVwZGF0ZURpc3BsYXkgPSBmdW5jdGlvbiAoKXsNCiAgICAvLyBNYXJrZXJzDQogICAgdmFyIGFuZ2xlID0gZmIuaHNsWzBdICogNi4yODsNCiAgICAkKCcuaC1tYXJrZXInLCBlKS5jc3Moew0KICAgICAgbGVmdDogTWF0aC5yb3VuZChNYXRoLnNpbihhbmdsZSkgKiBmYi5yYWRpdXMgKyBmYi53aWR0aCAvIDIpICsgJ3B4JywNCiAgICAgIHRvcDogTWF0aC5yb3VuZCgtTWF0aC5jb3MoYW5nbGUpICogZmIucmFkaXVzICsgZmIud2lkdGggLyAyKSArICdweCcNCiAgICB9KTsNCg0KICAgICQoJy5zbC1tYXJrZXInLCBlKS5jc3Moew0KICAgICAgbGVmdDogTWF0aC5yb3VuZChmYi5zcXVhcmUgKiAoLjUgLSBmYi5oc2xbMV0pICsgZmIud2lkdGggLyAyKSArICdweCcsDQogICAgICB0b3A6IE1hdGgucm91bmQoZmIuc3F1YXJlICogKC41IC0gZmIuaHNsWzJdKSArIGZiLndpZHRoIC8gMikgKyAncHgnDQogICAgfSk7DQoNCiAgICAvLyBTYXR1cmF0aW9uL0x1bWluYW5jZSBncmFkaWVudA0KICAgICQoJy5jb2xvcicsIGUpLmNzcygnYmFja2dyb3VuZENvbG9yJywgZmIucGFjayhmYi5IU0xUb1JHQihbZmIuaHNsWzBdLCAxLCAwLjVdKSkpOw0KDQogICAgLy8gTGlua2VkIGVsZW1lbnRzIG9yIGNhbGxiYWNrDQogICAgaWYgKHR5cGVvZiBmYi5jYWxsYmFjayA9PSAnb2JqZWN0Jyl7DQogICAgICAvLyBTZXQgYmFja2dyb3VuZC9mb3JlZ3JvdW5kIGNvbG9yDQogICAgICAkKGZiLmNhbGxiYWNrKS5jc3Moew0KICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGZiLmNvbG9yLA0KICAgICAgICBjb2xvcjogZmIuaHNsWzJdID4gMC41ID8gJyMwMDAnIDogJyNmZmYnDQogICAgICB9KTsNCg0KICAgICAgLy8gQ2hhbmdlIGxpbmtlZCB2YWx1ZQ0KICAgICAgJChmYi5jYWxsYmFjaykuZWFjaChmdW5jdGlvbigpew0KICAgICAgICBpZiAodGhpcy52YWx1ZSAmJiB0aGlzLnZhbHVlICE9IGZiLmNvbG9yKXsNCiAgICAgICAgICB0aGlzLnZhbHVlID0gZmIuY29sb3I7DQogICAgICAgIH0NCiAgICAgIH0pOw0KICAgIH0NCiAgICBlbHNlIGlmICh0eXBlb2YgZmIuY2FsbGJhY2sgPT0gJ2Z1bmN0aW9uJyl7DQogICAgICBmYi5jYWxsYmFjay5jYWxsKGZiLCBmYi5jb2xvcik7DQogICAgfQ0KICB9DQoNCiAgLyoqDQogICAqIEdldCBhYnNvbHV0ZSBwb3NpdGlvbiBvZiBlbGVtZW50DQogICAqLw0KICBmYi5hYnNvbHV0ZVBvc2l0aW9uID0gZnVuY3Rpb24gKGVsKXsNCiAgICB2YXIgciA9IHsgeDogZWwub2Zmc2V0TGVmdCwgeTogZWwub2Zmc2V0VG9wIH07DQogICAgLy8gUmVzb2x2ZSByZWxhdGl2ZSB0byBvZmZzZXRQYXJlbnQNCiAgICBpZiAoZWwub2Zmc2V0UGFyZW50KXsNCiAgICAgIHZhciB0bXAgPSBmYi5hYnNvbHV0ZVBvc2l0aW9uKGVsLm9mZnNldFBhcmVudCk7DQogICAgICByLnggKz0gdG1wLng7DQogICAgICByLnkgKz0gdG1wLnk7DQogICAgfQ0KICAgIHJldHVybiByOw0KICB9Ow0KDQogIC8qIFZhcmlvdXMgY29sb3IgdXRpbGl0eSBmdW5jdGlvbnMgKi8NCiAgZmIucGFjayA9IGZ1bmN0aW9uIChyZ2Ipew0KICAgIHZhciByID0gTWF0aC5yb3VuZChyZ2JbMF0gKiAyNTUpOw0KICAgIHZhciBnID0gTWF0aC5yb3VuZChyZ2JbMV0gKiAyNTUpOw0KICAgIHZhciBiID0gTWF0aC5yb3VuZChyZ2JbMl0gKiAyNTUpOw0KICAgIHJldHVybiAnIycgKyAociA8IDE2ID8gJzAnIDogJycpICsgci50b1N0cmluZygxNikgKw0KICAgICAgICAgICAoZyA8IDE2ID8gJzAnIDogJycpICsgZy50b1N0cmluZygxNikgKw0KICAgICAgICAgICAoYiA8IDE2ID8gJzAnIDogJycpICsgYi50b1N0cmluZygxNik7DQogIH0NCg0KICBmYi51bnBhY2sgPSBmdW5jdGlvbiAoY29sb3Ipew0KICAgIGlmIChjb2xvci5sZW5ndGggPT0gNyl7DQogICAgICByZXR1cm4gW3BhcnNlSW50KCcweCcgKyBjb2xvci5zdWJzdHJpbmcoMSwgMykpIC8gMjU1LA0KICAgICAgICBwYXJzZUludCgnMHgnICsgY29sb3Iuc3Vic3RyaW5nKDMsIDUpKSAvIDI1NSwNCiAgICAgICAgcGFyc2VJbnQoJzB4JyArIGNvbG9yLnN1YnN0cmluZyg1LCA3KSkgLyAyNTVdOw0KICAgIH0NCiAgICBlbHNlIGlmIChjb2xvci5sZW5ndGggPT0gNCl7DQogICAgICByZXR1cm4gW3BhcnNlSW50KCcweCcgKyBjb2xvci5zdWJzdHJpbmcoMSwgMikpIC8gMTUsDQogICAgICAgIHBhcnNlSW50KCcweCcgKyBjb2xvci5zdWJzdHJpbmcoMiwgMykpIC8gMTUsDQogICAgICAgIHBhcnNlSW50KCcweCcgKyBjb2xvci5zdWJzdHJpbmcoMywgNCkpIC8gMTVdOw0KICAgIH0NCiAgfQ0KDQogIGZiLkhTTFRvUkdCID0gZnVuY3Rpb24gKGhzbCl7DQogICAgdmFyIG0xLCBtMiwgciwgZywgYjsNCiAgICB2YXIgaCA9IGhzbFswXSwgcyA9IGhzbFsxXSwgbCA9IGhzbFsyXTsNCiAgICBtMiA9IChsIDw9IDAuNSkgPyBsICogKHMgKyAxKSA6IGwgKyBzIC0gbCpzOw0KICAgIG0xID0gbCAqIDIgLSBtMjsNCiAgICByZXR1cm4gW3RoaXMuaHVlVG9SR0IobTEsIG0yLCBoKzAuMzMzMzMpLA0KICAgICAgICB0aGlzLmh1ZVRvUkdCKG0xLCBtMiwgaCksDQogICAgICAgIHRoaXMuaHVlVG9SR0IobTEsIG0yLCBoLTAuMzMzMzMpXTsNCiAgfQ0KDQogIGZiLmh1ZVRvUkdCID0gZnVuY3Rpb24gKG0xLCBtMiwgaCl7DQogICAgaCA9IChoIDwgMCkgPyBoICsgMSA6ICgoaCA+IDEpID8gaCAtIDEgOiBoKTsNCiAgICBpZiAoaCAqIDYgPCAxKSByZXR1cm4gbTEgKyAobTIgLSBtMSkgKiBoICogNjsNCiAgICBpZiAoaCAqIDIgPCAxKSByZXR1cm4gbTI7DQogICAgaWYgKGggKiAzIDwgMikgcmV0dXJuIG0xICsgKG0yIC0gbTEpICogKDAuNjY2NjYgLSBoKSAqIDY7DQogICAgcmV0dXJuIG0xOw0KICB9DQoNCiAgZmIuUkdCVG9IU0wgPSBmdW5jdGlvbiAocmdiKXsNCiAgICB2YXIgbWluLCBtYXgsIGRlbHRhLCBoLCBzLCBsOw0KICAgIHZhciByID0gcmdiWzBdLCBnID0gcmdiWzFdLCBiID0gcmdiWzJdOw0KICAgIG1pbiA9IE1hdGgubWluKHIsIE1hdGgubWluKGcsIGIpKTsNCiAgICBtYXggPSBNYXRoLm1heChyLCBNYXRoLm1heChnLCBiKSk7DQogICAgZGVsdGEgPSBtYXggLSBtaW47DQogICAgbCA9IChtaW4gKyBtYXgpIC8gMjsNCiAgICBzID0gMDsNCiAgICBpZiAobCA+IDAgJiYgbCA8IDEpew0KICAgICAgcyA9IGRlbHRhIC8gKGwgPCAwLjUgPyAoMiAqIGwpIDogKDIgLSAyICogbCkpOw0KICAgIH0NCiAgICBoID0gMDsNCiAgICBpZiAoZGVsdGEgPiAwKXsNCiAgICAgIGlmIChtYXggPT0gciAmJiBtYXggIT0gZykgaCArPSAoZyAtIGIpIC8gZGVsdGE7DQogICAgICBpZiAobWF4ID09IGcgJiYgbWF4ICE9IGIpIGggKz0gKDIgKyAoYiAtIHIpIC8gZGVsdGEpOw0KICAgICAgaWYgKG1heCA9PSBiICYmIG1heCAhPSByKSBoICs9ICg0ICsgKHIgLSBnKSAvIGRlbHRhKTsNCiAgICAgIGggLz0gNjsNCiAgICB9DQogICAgcmV0dXJuIFtoLCBzLCBsXTsNCiAgfQ0KDQogIC8vIEluc3RhbGwgbW91c2Vkb3duIGhhbmRsZXIgKHRoZSBvdGhlcnMgYXJlIHNldCBvbiB0aGUgZG9jdW1lbnQgb24tZGVtYW5kKQ0KICAkKCcqJywgZSkubW91c2Vkb3duKGZiLm1vdXNlZG93bik7DQoNCiAgICAvLyBJbml0IGNvbG9yDQogIGZiLnNldENvbG9yKCcjMDAwMDAwJyk7DQoNCiAgLy8gU2V0IGxpbmtlZCBlbGVtZW50cy9jYWxsYmFjaw0KICBpZiAoY2FsbGJhY2spew0KICAgIGZiLmxpbmtUbyhjYWxsYmFjayk7DQogIH0NCn0=]]></data>
	</file>
	<file>
	  <filename>/includes/ME_1.00.00.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gSmF2YVNjcmlwdCBEb2N1bWVudA0KDQoNCg0KJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKXsNCgkkKCIudGhlY29udGFjdEZvcm0iKS52YWxpZGF0ZSh7fSk7DQoJJCgiI20xX21vZHVsZWZvcm1fMiIpLnZhbGlkYXRlKHsNCgkgIHJ1bGVzOiB7DQoJCVZJTjoge3JlcXVpcmVkOnRydWUsdmluVVM6dHJ1ZX0NCgkgIH0NCgl9KTsNCiQoJyNjb2xvcnBpY2tlcicpLmZhcmJ0YXN0aWMoImlucHV0W25hbWUqPSdjcHBfaGVhZGVyYmFja19jb2xvciddIik7DQoJJCgiLmV4dGVuZEhBTkRMRSIpLmNsaWNrKGZ1bmN0aW9uKCl7DQoJCWlmKCQodGhpcykubmV4dCgpLmhhc0NsYXNzKCJOZXh0ZW5kIikpew0KCQkJJCh0aGlzKS5maW5kKCJzcGFuIikudGV4dCgiWy1dIik7DQoJCQkkKHRoaXMpLm5leHQoKS5yZW1vdmVDbGFzcygiTmV4dGVuZCIpOw0KCQkJJCgnLmNvbG9ycGlja2VyJykuc2xpZGVEb3duKCJmYXN0Iik7DQoJCQkkKHRoaXMpLm5leHQoKS5hZGRDbGFzcygiZXh0ZW5kIik7DQoJCQkkKCIuVHJhbnNsYWV0Q29uIikuc2hvdygpOw0KCQl9ZWxzZXsNCgkJCSQodGhpcykuZmluZCgic3BhbiIpLnRleHQoIlsrXSIpOwkNCgkJCSQoJy5jb2xvcnBpY2tlcicpLnNsaWRlVXAoImZhc3QiKTsNCgkJCSQodGhpcykubmV4dCgpLmFkZENsYXNzKCJOZXh0ZW5kIik7DQoJCQkkKHRoaXMpLm5leHQoKS5yZW1vdmVDbGFzcygiZXh0ZW5kIik7DQoJCQkkKCIuVHJhbnNsYWV0Q29uIikuaGlkZSgpOw0KCQl9DQoJfSk7DQogDQoNCn0pOwkNCg0KDQoNCg==]]></data>
	</file>
	<file>
	  <filename>/includes/MS_1.00.00.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoNCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjEuMy4yDQogKiBodHRwOi8vanF1ZXJ5LmNvbS8NCiAqDQogKiBDb3B5cmlnaHQgKGMpIDIwMDkgSm9obiBSZXNpZw0KICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCBHUEwgbGljZW5zZXMuDQogKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL0xpY2Vuc2UNCiAqDQogKiBEYXRlOiAyMDA5LTAyLTE5IDE3OjM0OjIxIC0wNTAwIChUaHUsIDE5IEZlYiAyMDA5KQ0KICogUmV2aXNpb246IDYyNDYNCiAqLw0KKGZ1bmN0aW9uKCl7dmFyIGw9dGhpcyxnLHk9bC5qUXVlcnkscD1sLiQsbz1sLmpRdWVyeT1sLiQ9ZnVuY3Rpb24oRSxGKXtyZXR1cm4gbmV3IG8uZm4uaW5pdChFLEYpfSxEPS9eW148XSooPCgufFxzKSs+KVtePl0qJHxeIyhbXHctXSspJC8sZj0vXi5bXjojXFtcLixdKiQvO28uZm49by5wcm90b3R5cGU9e2luaXQ6ZnVuY3Rpb24oRSxIKXtFPUV8fGRvY3VtZW50O2lmKEUubm9kZVR5cGUpe3RoaXNbMF09RTt0aGlzLmxlbmd0aD0xO3RoaXMuY29udGV4dD1FO3JldHVybiB0aGlzfWlmKHR5cGVvZiBFPT09InN0cmluZyIpe3ZhciBHPUQuZXhlYyhFKTtpZihHJiYoR1sxXXx8IUgpKXtpZihHWzFdKXtFPW8uY2xlYW4oW0dbMV1dLEgpfWVsc2V7dmFyIEk9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoR1szXSk7aWYoSSYmSS5pZCE9R1szXSl7cmV0dXJuIG8oKS5maW5kKEUpfXZhciBGPW8oSXx8W10pO0YuY29udGV4dD1kb2N1bWVudDtGLnNlbGVjdG9yPUU7cmV0dXJuIEZ9fWVsc2V7cmV0dXJuIG8oSCkuZmluZChFKX19ZWxzZXtpZihvLmlzRnVuY3Rpb24oRSkpe3JldHVybiBvKGRvY3VtZW50KS5yZWFkeShFKX19aWYoRS5zZWxlY3RvciYmRS5jb250ZXh0KXt0aGlzLnNlbGVjdG9yPUUuc2VsZWN0b3I7dGhpcy5jb250ZXh0PUUuY29udGV4dH1yZXR1cm4gdGhpcy5zZXRBcnJheShvLmlzQXJyYXkoRSk/RTpvLm1ha2VBcnJheShFKSl9LHNlbGVjdG9yOiIiLGpxdWVyeToiMS4zLjIiLHNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGh9LGdldDpmdW5jdGlvbihFKXtyZXR1cm4gRT09PWc/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcyk6dGhpc1tFXX0scHVzaFN0YWNrOmZ1bmN0aW9uKEYsSCxFKXt2YXIgRz1vKEYpO0cucHJldk9iamVjdD10aGlzO0cuY29udGV4dD10aGlzLmNvbnRleHQ7aWYoSD09PSJmaW5kIil7Ry5zZWxlY3Rvcj10aGlzLnNlbGVjdG9yKyh0aGlzLnNlbGVjdG9yPyIgIjoiIikrRX1lbHNle2lmKEgpe0cuc2VsZWN0b3I9dGhpcy5zZWxlY3RvcisiLiIrSCsiKCIrRSsiKSJ9fXJldHVybiBHfSxzZXRBcnJheTpmdW5jdGlvbihFKXt0aGlzLmxlbmd0aD0wO0FycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHRoaXMsRSk7cmV0dXJuIHRoaXN9LGVhY2g6ZnVuY3Rpb24oRixFKXtyZXR1cm4gby5lYWNoKHRoaXMsRixFKX0saW5kZXg6ZnVuY3Rpb24oRSl7cmV0dXJuIG8uaW5BcnJheShFJiZFLmpxdWVyeT9FWzBdOkUsdGhpcyl9LGF0dHI6ZnVuY3Rpb24oRixILEcpe3ZhciBFPUY7aWYodHlwZW9mIEY9PT0ic3RyaW5nIil7aWYoSD09PWcpe3JldHVybiB0aGlzWzBdJiZvW0d8fCJhdHRyIl0odGhpc1swXSxGKX1lbHNle0U9e307RVtGXT1IfX1yZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKEkpe2ZvcihGIGluIEUpe28uYXR0cihHP3RoaXMuc3R5bGU6dGhpcyxGLG8ucHJvcCh0aGlzLEVbRl0sRyxJLEYpKX19KX0sY3NzOmZ1bmN0aW9uKEUsRil7aWYoKEU9PSJ3aWR0aCJ8fEU9PSJoZWlnaHQiKSYmcGFyc2VGbG9hdChGKTwwKXtGPWd9cmV0dXJuIHRoaXMuYXR0cihFLEYsImN1ckNTUyIpfSx0ZXh0OmZ1bmN0aW9uKEYpe2lmKHR5cGVvZiBGIT09Im9iamVjdCImJkYhPW51bGwpe3JldHVybiB0aGlzLmVtcHR5KCkuYXBwZW5kKCh0aGlzWzBdJiZ0aGlzWzBdLm93bmVyRG9jdW1lbnR8fGRvY3VtZW50KS5jcmVhdGVUZXh0Tm9kZShGKSl9dmFyIEU9IiI7by5lYWNoKEZ8fHRoaXMsZnVuY3Rpb24oKXtvLmVhY2godGhpcy5jaGlsZE5vZGVzLGZ1bmN0aW9uKCl7aWYodGhpcy5ub2RlVHlwZSE9OCl7RSs9dGhpcy5ub2RlVHlwZSE9MT90aGlzLm5vZGVWYWx1ZTpvLmZuLnRleHQoW3RoaXNdKX19KX0pO3JldHVybiBFfSx3cmFwQWxsOmZ1bmN0aW9uKEUpe2lmKHRoaXNbMF0pe3ZhciBGPW8oRSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmNsb25lKCk7aWYodGhpc1swXS5wYXJlbnROb2RlKXtGLmluc2VydEJlZm9yZSh0aGlzWzBdKX1GLm1hcChmdW5jdGlvbigpe3ZhciBHPXRoaXM7d2hpbGUoRy5maXJzdENoaWxkKXtHPUcuZmlyc3RDaGlsZH1yZXR1cm4gR30pLmFwcGVuZCh0aGlzKX1yZXR1cm4gdGhpc30sd3JhcElubmVyOmZ1bmN0aW9uKEUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtvKHRoaXMpLmNvbnRlbnRzKCkud3JhcEFsbChFKX0pfSx3cmFwOmZ1bmN0aW9uKEUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtvKHRoaXMpLndyYXBBbGwoRSl9KX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLHRydWUsZnVuY3Rpb24oRSl7aWYodGhpcy5ub2RlVHlwZT09MSl7dGhpcy5hcHBlbmRDaGlsZChFKX19KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyx0cnVlLGZ1bmN0aW9uKEUpe2lmKHRoaXMubm9kZVR5cGU9PTEpe3RoaXMuaW5zZXJ0QmVmb3JlKEUsdGhpcy5maXJzdENoaWxkKX19KX0sYmVmb3JlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZhbHNlLGZ1bmN0aW9uKEUpe3RoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoRSx0aGlzKX0pfSxhZnRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmYWxzZSxmdW5jdGlvbihFKXt0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKEUsdGhpcy5uZXh0U2libGluZyl9KX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8byhbXSl9LHB1c2g6W10ucHVzaCxzb3J0OltdLnNvcnQsc3BsaWNlOltdLnNwbGljZSxmaW5kOmZ1bmN0aW9uKEUpe2lmKHRoaXMubGVuZ3RoPT09MSl7dmFyIEY9dGhpcy5wdXNoU3RhY2soW10sImZpbmQiLEUpO0YubGVuZ3RoPTA7by5maW5kKEUsdGhpc1swXSxGKTtyZXR1cm4gRn1lbHNle3JldHVybiB0aGlzLnB1c2hTdGFjayhvLnVuaXF1ZShvLm1hcCh0aGlzLGZ1bmN0aW9uKEcpe3JldHVybiBvLmZpbmQoRSxHKX0pKSwiZmluZCIsRSl9fSxjbG9uZTpmdW5jdGlvbihHKXt2YXIgRT10aGlzLm1hcChmdW5jdGlvbigpe2lmKCFvLnN1cHBvcnQubm9DbG9uZUV2ZW50JiYhby5pc1hNTERvYyh0aGlzKSl7dmFyIEk9dGhpcy5vdXRlckhUTUw7aWYoIUkpe3ZhciBKPXRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtKLmFwcGVuZENoaWxkKHRoaXMuY2xvbmVOb2RlKHRydWUpKTtJPUouaW5uZXJIVE1MfXJldHVybiBvLmNsZWFuKFtJLnJlcGxhY2UoLyBqUXVlcnlcZCs9Iig/OlxkK3xudWxsKSIvZywiIikucmVwbGFjZSgvXlxzKi8sIiIpXSlbMF19ZWxzZXtyZXR1cm4gdGhpcy5jbG9uZU5vZGUodHJ1ZSl9fSk7aWYoRz09PXRydWUpe3ZhciBIPXRoaXMuZmluZCgiKiIpLmFuZFNlbGYoKSxGPTA7RS5maW5kKCIqIikuYW5kU2VsZigpLmVhY2goZnVuY3Rpb24oKXtpZih0aGlzLm5vZGVOYW1lIT09SFtGXS5ub2RlTmFtZSl7cmV0dXJufXZhciBJPW8uZGF0YShIW0ZdLCJldmVudHMiKTtmb3IodmFyIEsgaW4gSSl7Zm9yKHZhciBKIGluIElbS10pe28uZXZlbnQuYWRkKHRoaXMsSyxJW0tdW0pdLElbS11bSl0uZGF0YSl9fUYrK30pfXJldHVybiBFfSxmaWx0ZXI6ZnVuY3Rpb24oRSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKG8uaXNGdW5jdGlvbihFKSYmby5ncmVwKHRoaXMsZnVuY3Rpb24oRyxGKXtyZXR1cm4gRS5jYWxsKEcsRil9KXx8by5tdWx0aUZpbHRlcihFLG8uZ3JlcCh0aGlzLGZ1bmN0aW9uKEYpe3JldHVybiBGLm5vZGVUeXBlPT09MX0pKSwiZmlsdGVyIixFKX0sY2xvc2VzdDpmdW5jdGlvbihFKXt2YXIgRz1vLmV4cHIubWF0Y2guUE9TLnRlc3QoRSk/byhFKTpudWxsLEY9MDtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgSD10aGlzO3doaWxlKEgmJkgub3duZXJEb2N1bWVudCl7aWYoRz9HLmluZGV4KEgpPi0xOm8oSCkuaXMoRSkpe28uZGF0YShILCJjbG9zZXN0IixGKTtyZXR1cm4gSH1IPUgucGFyZW50Tm9kZTtGKyt9fSl9LG5vdDpmdW5jdGlvbihFKXtpZih0eXBlb2YgRT09PSJzdHJpbmciKXtpZihmLnRlc3QoRSkpe3JldHVybiB0aGlzLnB1c2hTdGFjayhvLm11bHRpRmlsdGVyKEUsdGhpcyx0cnVlKSwibm90IixFKX1lbHNle0U9by5tdWx0aUZpbHRlcihFLHRoaXMpfX12YXIgRj1FLmxlbmd0aCYmRVtFLmxlbmd0aC0xXSE9PWcmJiFFLm5vZGVUeXBlO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiBGP28uaW5BcnJheSh0aGlzLEUpPDA6dGhpcyE9RX0pfSxhZGQ6ZnVuY3Rpb24oRSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKG8udW5pcXVlKG8ubWVyZ2UodGhpcy5nZXQoKSx0eXBlb2YgRT09PSJzdHJpbmciP28oRSk6by5tYWtlQXJyYXkoRSkpKSl9LGlzOmZ1bmN0aW9uKEUpe3JldHVybiAhIUUmJm8ubXVsdGlGaWx0ZXIoRSx0aGlzKS5sZW5ndGg+MH0saGFzQ2xhc3M6ZnVuY3Rpb24oRSl7cmV0dXJuICEhRSYmdGhpcy5pcygiLiIrRSl9LHZhbDpmdW5jdGlvbihLKXtpZihLPT09Zyl7dmFyIEU9dGhpc1swXTtpZihFKXtpZihvLm5vZGVOYW1lKEUsIm9wdGlvbiIpKXtyZXR1cm4oRS5hdHRyaWJ1dGVzLnZhbHVlfHx7fSkuc3BlY2lmaWVkP0UudmFsdWU6RS50ZXh0fWlmKG8ubm9kZU5hbWUoRSwic2VsZWN0Iikpe3ZhciBJPUUuc2VsZWN0ZWRJbmRleCxMPVtdLE09RS5vcHRpb25zLEg9RS50eXBlPT0ic2VsZWN0LW9uZSI7aWYoSTwwKXtyZXR1cm4gbnVsbH1mb3IodmFyIEY9SD9JOjAsSj1IP0krMTpNLmxlbmd0aDtGPEo7RisrKXt2YXIgRz1NW0ZdO2lmKEcuc2VsZWN0ZWQpe0s9byhHKS52YWwoKTtpZihIKXtyZXR1cm4gS31MLnB1c2goSyl9fXJldHVybiBMfXJldHVybihFLnZhbHVlfHwiIikucmVwbGFjZSgvXHIvZywiIil9cmV0dXJuIGd9aWYodHlwZW9mIEs9PT0ibnVtYmVyIil7Sys9IiJ9cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2lmKHRoaXMubm9kZVR5cGUhPTEpe3JldHVybn1pZihvLmlzQXJyYXkoSykmJi9yYWRpb3xjaGVja2JveC8udGVzdCh0aGlzLnR5cGUpKXt0aGlzLmNoZWNrZWQ9KG8uaW5BcnJheSh0aGlzLnZhbHVlLEspPj0wfHxvLmluQXJyYXkodGhpcy5uYW1lLEspPj0wKX1lbHNle2lmKG8ubm9kZU5hbWUodGhpcywic2VsZWN0Iikpe3ZhciBOPW8ubWFrZUFycmF5KEspO28oIm9wdGlvbiIsdGhpcykuZWFjaChmdW5jdGlvbigpe3RoaXMuc2VsZWN0ZWQ9KG8uaW5BcnJheSh0aGlzLnZhbHVlLE4pPj0wfHxvLmluQXJyYXkodGhpcy50ZXh0LE4pPj0wKX0pO2lmKCFOLmxlbmd0aCl7dGhpcy5zZWxlY3RlZEluZGV4PS0xfX1lbHNle3RoaXMudmFsdWU9S319fSl9LGh0bWw6ZnVuY3Rpb24oRSl7cmV0dXJuIEU9PT1nPyh0aGlzWzBdP3RoaXNbMF0uaW5uZXJIVE1MLnJlcGxhY2UoLyBqUXVlcnlcZCs9Iig/OlxkK3xudWxsKSIvZywiIik6bnVsbCk6dGhpcy5lbXB0eSgpLmFwcGVuZChFKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24oRSl7cmV0dXJuIHRoaXMuYWZ0ZXIoRSkucmVtb3ZlKCl9LGVxOmZ1bmN0aW9uKEUpe3JldHVybiB0aGlzLnNsaWNlKEUsK0UrMSl9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKEFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksInNsaWNlIixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLmpvaW4oIiwiKSl9LG1hcDpmdW5jdGlvbihFKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soby5tYXAodGhpcyxmdW5jdGlvbihHLEYpe3JldHVybiBFLmNhbGwoRyxGLEcpfSkpfSxhbmRTZWxmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWRkKHRoaXMucHJldk9iamVjdCl9LGRvbU1hbmlwOmZ1bmN0aW9uKEosTSxMKXtpZih0aGlzWzBdKXt2YXIgST0odGhpc1swXS5vd25lckRvY3VtZW50fHx0aGlzWzBdKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksRj1vLmNsZWFuKEosKHRoaXNbMF0ub3duZXJEb2N1bWVudHx8dGhpc1swXSksSSksSD1JLmZpcnN0Q2hpbGQ7aWYoSCl7Zm9yKHZhciBHPTAsRT10aGlzLmxlbmd0aDtHPEU7RysrKXtMLmNhbGwoSyh0aGlzW0ddLEgpLHRoaXMubGVuZ3RoPjF8fEc+MD9JLmNsb25lTm9kZSh0cnVlKTpJKX19aWYoRil7by5lYWNoKEYseil9fXJldHVybiB0aGlzO2Z1bmN0aW9uIEsoTixPKXtyZXR1cm4gTSYmby5ub2RlTmFtZShOLCJ0YWJsZSIpJiZvLm5vZGVOYW1lKE8sInRyIik/KE4uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IilbMF18fE4uYXBwZW5kQ2hpbGQoTi5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRib2R5IikpKTpOfX19O28uZm4uaW5pdC5wcm90b3R5cGU9by5mbjtmdW5jdGlvbiB6KEUsRil7aWYoRi5zcmMpe28uYWpheCh7dXJsOkYuc3JjLGFzeW5jOmZhbHNlLGRhdGFUeXBlOiJzY3JpcHQifSl9ZWxzZXtvLmdsb2JhbEV2YWwoRi50ZXh0fHxGLnRleHRDb250ZW50fHxGLmlubmVySFRNTHx8IiIpfWlmKEYucGFyZW50Tm9kZSl7Ri5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKEYpfX1mdW5jdGlvbiBlKCl7cmV0dXJuICtuZXcgRGF0ZX1vLmV4dGVuZD1vLmZuLmV4dGVuZD1mdW5jdGlvbigpe3ZhciBKPWFyZ3VtZW50c1swXXx8e30sSD0xLEk9YXJndW1lbnRzLmxlbmd0aCxFPWZhbHNlLEc7aWYodHlwZW9mIEo9PT0iYm9vbGVhbiIpe0U9SjtKPWFyZ3VtZW50c1sxXXx8e307SD0yfWlmKHR5cGVvZiBKIT09Im9iamVjdCImJiFvLmlzRnVuY3Rpb24oSikpe0o9e319aWYoST09SCl7Sj10aGlzOy0tSH1mb3IoO0g8STtIKyspe2lmKChHPWFyZ3VtZW50c1tIXSkhPW51bGwpe2Zvcih2YXIgRiBpbiBHKXt2YXIgSz1KW0ZdLEw9R1tGXTtpZihKPT09TCl7Y29udGludWV9aWYoRSYmTCYmdHlwZW9mIEw9PT0ib2JqZWN0IiYmIUwubm9kZVR5cGUpe0pbRl09by5leHRlbmQoRSxLfHwoTC5sZW5ndGghPW51bGw/W106e30pLEwpfWVsc2V7aWYoTCE9PWcpe0pbRl09TH19fX19cmV0dXJuIEp9O3ZhciBiPS96LT9pbmRleHxmb250LT93ZWlnaHR8b3BhY2l0eXx6b29tfGxpbmUtP2hlaWdodC9pLHE9ZG9jdW1lbnQuZGVmYXVsdFZpZXd8fHt9LHM9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztvLmV4dGVuZCh7bm9Db25mbGljdDpmdW5jdGlvbihFKXtsLiQ9cDtpZihFKXtsLmpRdWVyeT15fXJldHVybiBvfSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKEUpe3JldHVybiBzLmNhbGwoRSk9PT0iW29iamVjdCBGdW5jdGlvbl0ifSxpc0FycmF5OmZ1bmN0aW9uKEUpe3JldHVybiBzLmNhbGwoRSk9PT0iW29iamVjdCBBcnJheV0ifSxpc1hNTERvYzpmdW5jdGlvbihFKXtyZXR1cm4gRS5ub2RlVHlwZT09PTkmJkUuZG9jdW1lbnRFbGVtZW50Lm5vZGVOYW1lIT09IkhUTUwifHwhIUUub3duZXJEb2N1bWVudCYmby5pc1hNTERvYyhFLm93bmVyRG9jdW1lbnQpfSxnbG9iYWxFdmFsOmZ1bmN0aW9uKEcpe2lmKEcmJi9cUy8udGVzdChHKSl7dmFyIEY9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXXx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7RS50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2lmKG8uc3VwcG9ydC5zY3JpcHRFdmFsKXtFLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKEcpKX1lbHNle0UudGV4dD1HfUYuaW5zZXJ0QmVmb3JlKEUsRi5maXJzdENoaWxkKTtGLnJlbW92ZUNoaWxkKEUpfX0sbm9kZU5hbWU6ZnVuY3Rpb24oRixFKXtyZXR1cm4gRi5ub2RlTmFtZSYmRi5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpPT1FLnRvVXBwZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oRyxLLEYpe3ZhciBFLEg9MCxJPUcubGVuZ3RoO2lmKEYpe2lmKEk9PT1nKXtmb3IoRSBpbiBHKXtpZihLLmFwcGx5KEdbRV0sRik9PT1mYWxzZSl7YnJlYWt9fX1lbHNle2Zvcig7SDxJOyl7aWYoSy5hcHBseShHW0grK10sRik9PT1mYWxzZSl7YnJlYWt9fX19ZWxzZXtpZihJPT09Zyl7Zm9yKEUgaW4gRyl7aWYoSy5jYWxsKEdbRV0sRSxHW0VdKT09PWZhbHNlKXticmVha319fWVsc2V7Zm9yKHZhciBKPUdbMF07SDxJJiZLLmNhbGwoSixILEopIT09ZmFsc2U7Sj1HWysrSF0pe319fXJldHVybiBHfSxwcm9wOmZ1bmN0aW9uKEgsSSxHLEYsRSl7aWYoby5pc0Z1bmN0aW9uKEkpKXtJPUkuY2FsbChILEYpfXJldHVybiB0eXBlb2YgST09PSJudW1iZXIiJiZHPT0iY3VyQ1NTIiYmIWIudGVzdChFKT9JKyJweCI6SX0sY2xhc3NOYW1lOnthZGQ6ZnVuY3Rpb24oRSxGKXtvLmVhY2goKEZ8fCIiKS5zcGxpdCgvXHMrLyksZnVuY3Rpb24oRyxIKXtpZihFLm5vZGVUeXBlPT0xJiYhby5jbGFzc05hbWUuaGFzKEUuY2xhc3NOYW1lLEgpKXtFLmNsYXNzTmFtZSs9KEUuY2xhc3NOYW1lPyIgIjoiIikrSH19KX0scmVtb3ZlOmZ1bmN0aW9uKEUsRil7aWYoRS5ub2RlVHlwZT09MSl7RS5jbGFzc05hbWU9RiE9PWc/by5ncmVwKEUuY2xhc3NOYW1lLnNwbGl0KC9ccysvKSxmdW5jdGlvbihHKXtyZXR1cm4gIW8uY2xhc3NOYW1lLmhhcyhGLEcpfSkuam9pbigiICIpOiIifX0saGFzOmZ1bmN0aW9uKEYsRSl7cmV0dXJuIEYmJm8uaW5BcnJheShFLChGLmNsYXNzTmFtZXx8RikudG9TdHJpbmcoKS5zcGxpdCgvXHMrLykpPi0xfX0sc3dhcDpmdW5jdGlvbihILEcsSSl7dmFyIEU9e307Zm9yKHZhciBGIGluIEcpe0VbRl09SC5zdHlsZVtGXTtILnN0eWxlW0ZdPUdbRl19SS5jYWxsKEgpO2Zvcih2YXIgRiBpbiBHKXtILnN0eWxlW0ZdPUVbRl19fSxjc3M6ZnVuY3Rpb24oSCxGLEosRSl7aWYoRj09IndpZHRoInx8Rj09ImhlaWdodCIpe3ZhciBMLEc9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LEs9Rj09IndpZHRoIj9bIkxlZnQiLCJSaWdodCJdOlsiVG9wIiwiQm90dG9tIl07ZnVuY3Rpb24gSSgpe0w9Rj09IndpZHRoIj9ILm9mZnNldFdpZHRoOkgub2Zmc2V0SGVpZ2h0O2lmKEU9PT0iYm9yZGVyIil7cmV0dXJufW8uZWFjaChLLGZ1bmN0aW9uKCl7aWYoIUUpe0wtPXBhcnNlRmxvYXQoby5jdXJDU1MoSCwicGFkZGluZyIrdGhpcyx0cnVlKSl8fDB9aWYoRT09PSJtYXJnaW4iKXtMKz1wYXJzZUZsb2F0KG8uY3VyQ1NTKEgsIm1hcmdpbiIrdGhpcyx0cnVlKSl8fDB9ZWxzZXtMLT1wYXJzZUZsb2F0KG8uY3VyQ1NTKEgsImJvcmRlciIrdGhpcysiV2lkdGgiLHRydWUpKXx8MH19KX1pZihILm9mZnNldFdpZHRoIT09MCl7SSgpfWVsc2V7by5zd2FwKEgsRyxJKX1yZXR1cm4gTWF0aC5tYXgoMCxNYXRoLnJvdW5kKEwpKX1yZXR1cm4gby5jdXJDU1MoSCxGLEopfSxjdXJDU1M6ZnVuY3Rpb24oSSxGLEcpe3ZhciBMLEU9SS5zdHlsZTtpZihGPT0ib3BhY2l0eSImJiFvLnN1cHBvcnQub3BhY2l0eSl7TD1vLmF0dHIoRSwib3BhY2l0eSIpO3JldHVybiBMPT0iIj8iMSI6TH1pZihGLm1hdGNoKC9mbG9hdC9pKSl7Rj13fWlmKCFHJiZFJiZFW0ZdKXtMPUVbRl19ZWxzZXtpZihxLmdldENvbXB1dGVkU3R5bGUpe2lmKEYubWF0Y2goL2Zsb2F0L2kpKXtGPSJmbG9hdCJ9Rj1GLnJlcGxhY2UoLyhbQS1aXSkvZywiLSQxIikudG9Mb3dlckNhc2UoKTt2YXIgTT1xLmdldENvbXB1dGVkU3R5bGUoSSxudWxsKTtpZihNKXtMPU0uZ2V0UHJvcGVydHlWYWx1ZShGKX1pZihGPT0ib3BhY2l0eSImJkw9PSIiKXtMPSIxIn19ZWxzZXtpZihJLmN1cnJlbnRTdHlsZSl7dmFyIEo9Ri5yZXBsYWNlKC9cLShcdykvZyxmdW5jdGlvbihOLE8pe3JldHVybiBPLnRvVXBwZXJDYXNlKCl9KTtMPUkuY3VycmVudFN0eWxlW0ZdfHxJLmN1cnJlbnRTdHlsZVtKXTtpZighL15cZCsocHgpPyQvaS50ZXN0KEwpJiYvXlxkLy50ZXN0KEwpKXt2YXIgSD1FLmxlZnQsSz1JLnJ1bnRpbWVTdHlsZS5sZWZ0O0kucnVudGltZVN0eWxlLmxlZnQ9SS5jdXJyZW50U3R5bGUubGVmdDtFLmxlZnQ9THx8MDtMPUUucGl4ZWxMZWZ0KyJweCI7RS5sZWZ0PUg7SS5ydW50aW1lU3R5bGUubGVmdD1LfX19fXJldHVybiBMfSxjbGVhbjpmdW5jdGlvbihGLEssSSl7Sz1LfHxkb2N1bWVudDtpZih0eXBlb2YgSy5jcmVhdGVFbGVtZW50PT09InVuZGVmaW5lZCIpe0s9Sy5vd25lckRvY3VtZW50fHxLWzBdJiZLWzBdLm93bmVyRG9jdW1lbnR8fGRvY3VtZW50fWlmKCFJJiZGLmxlbmd0aD09PTEmJnR5cGVvZiBGWzBdPT09InN0cmluZyIpe3ZhciBIPS9ePChcdyspXHMqXC8/PiQvLmV4ZWMoRlswXSk7aWYoSCl7cmV0dXJuW0suY3JlYXRlRWxlbWVudChIWzFdKV19fXZhciBHPVtdLEU9W10sTD1LLmNyZWF0ZUVsZW1lbnQoImRpdiIpO28uZWFjaChGLGZ1bmN0aW9uKFAsUyl7aWYodHlwZW9mIFM9PT0ibnVtYmVyIil7Uys9IiJ9aWYoIVMpe3JldHVybn1pZih0eXBlb2YgUz09PSJzdHJpbmciKXtTPVMucmVwbGFjZSgvKDwoXHcrKVtePl0qPylcLz4vZyxmdW5jdGlvbihVLFYsVCl7cmV0dXJuIFQubWF0Y2goL14oYWJicnxicnxjb2x8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbXxocnxhcmVhfGVtYmVkKSQvaSk/VTpWKyI+PC8iK1QrIj4ifSk7dmFyIE89Uy5yZXBsYWNlKC9eXHMrLywiIikuc3Vic3RyaW5nKDAsMTApLnRvTG93ZXJDYXNlKCk7dmFyIFE9IU8uaW5kZXhPZigiPG9wdCIpJiZbMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsIjwvc2VsZWN0PiJdfHwhTy5pbmRleE9mKCI8bGVnIikmJlsxLCI8ZmllbGRzZXQ+IiwiPC9maWVsZHNldD4iXXx8Ty5tYXRjaCgvXjwodGhlYWR8dGJvZHl8dGZvb3R8Y29sZ3xjYXApLykmJlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXXx8IU8uaW5kZXhPZigiPHRyIikmJlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXXx8KCFPLmluZGV4T2YoIjx0ZCIpfHwhTy5pbmRleE9mKCI8dGgiKSkmJlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXXx8IU8uaW5kZXhPZigiPGNvbCIpJiZbMiwiPHRhYmxlPjx0Ym9keT48L3Rib2R5Pjxjb2xncm91cD4iLCI8L2NvbGdyb3VwPjwvdGFibGU+Il18fCFvLnN1cHBvcnQuaHRtbFNlcmlhbGl6ZSYmWzEsImRpdjxkaXY+IiwiPC9kaXY+Il18fFswLCIiLCIiXTtMLmlubmVySFRNTD1RWzFdK1MrUVsyXTt3aGlsZShRWzBdLS0pe0w9TC5sYXN0Q2hpbGR9aWYoIW8uc3VwcG9ydC50Ym9keSl7dmFyIFI9Lzx0Ym9keS9pLnRlc3QoUyksTj0hTy5pbmRleE9mKCI8dGFibGUiKSYmIVI/TC5maXJzdENoaWxkJiZMLmZpcnN0Q2hpbGQuY2hpbGROb2RlczpRWzFdPT0iPHRhYmxlPiImJiFSP0wuY2hpbGROb2RlczpbXTtmb3IodmFyIE09Ti5sZW5ndGgtMTtNPj0wOy0tTSl7aWYoby5ub2RlTmFtZShOW01dLCJ0Ym9keSIpJiYhTltNXS5jaGlsZE5vZGVzLmxlbmd0aCl7TltNXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKE5bTV0pfX19aWYoIW8uc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSYmL15ccy8udGVzdChTKSl7TC5pbnNlcnRCZWZvcmUoSy5jcmVhdGVUZXh0Tm9kZShTLm1hdGNoKC9eXHMqLylbMF0pLEwuZmlyc3RDaGlsZCl9Uz1vLm1ha2VBcnJheShMLmNoaWxkTm9kZXMpfWlmKFMubm9kZVR5cGUpe0cucHVzaChTKX1lbHNle0c9by5tZXJnZShHLFMpfX0pO2lmKEkpe2Zvcih2YXIgSj0wO0dbSl07SisrKXtpZihvLm5vZGVOYW1lKEdbSl0sInNjcmlwdCIpJiYoIUdbSl0udHlwZXx8R1tKXS50eXBlLnRvTG93ZXJDYXNlKCk9PT0idGV4dC9qYXZhc2NyaXB0Iikpe0UucHVzaChHW0pdLnBhcmVudE5vZGU/R1tKXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKEdbSl0pOkdbSl0pfWVsc2V7aWYoR1tKXS5ub2RlVHlwZT09PTEpe0cuc3BsaWNlLmFwcGx5KEcsW0orMSwwXS5jb25jYXQoby5tYWtlQXJyYXkoR1tKXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0IikpKSl9SS5hcHBlbmRDaGlsZChHW0pdKX19cmV0dXJuIEV9cmV0dXJuIEd9LGF0dHI6ZnVuY3Rpb24oSixHLEspe2lmKCFKfHxKLm5vZGVUeXBlPT0zfHxKLm5vZGVUeXBlPT04KXtyZXR1cm4gZ312YXIgSD0hby5pc1hNTERvYyhKKSxMPUshPT1nO0c9SCYmby5wcm9wc1tHXXx8RztpZihKLnRhZ05hbWUpe3ZhciBGPS9ocmVmfHNyY3xzdHlsZS8udGVzdChHKTtpZihHPT0ic2VsZWN0ZWQiJiZKLnBhcmVudE5vZGUpe0oucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4fWlmKEcgaW4gSiYmSCYmIUYpe2lmKEwpe2lmKEc9PSJ0eXBlIiYmby5ub2RlTmFtZShKLCJpbnB1dCIpJiZKLnBhcmVudE5vZGUpe3Rocm93InR5cGUgcHJvcGVydHkgY2FuJ3QgYmUgY2hhbmdlZCJ9SltHXT1LfWlmKG8ubm9kZU5hbWUoSiwiZm9ybSIpJiZKLmdldEF0dHJpYnV0ZU5vZGUoRykpe3JldHVybiBKLmdldEF0dHJpYnV0ZU5vZGUoRykubm9kZVZhbHVlfWlmKEc9PSJ0YWJJbmRleCIpe3ZhciBJPUouZ2V0QXR0cmlidXRlTm9kZSgidGFiSW5kZXgiKTtyZXR1cm4gSSYmSS5zcGVjaWZpZWQ/SS52YWx1ZTpKLm5vZGVOYW1lLm1hdGNoKC8oYnV0dG9ufGlucHV0fG9iamVjdHxzZWxlY3R8dGV4dGFyZWEpL2kpPzA6Si5ub2RlTmFtZS5tYXRjaCgvXihhfGFyZWEpJC9pKSYmSi5ocmVmPzA6Z31yZXR1cm4gSltHXX1pZighby5zdXBwb3J0LnN0eWxlJiZIJiZHPT0ic3R5bGUiKXtyZXR1cm4gby5hdHRyKEouc3R5bGUsImNzc1RleHQiLEspfWlmKEwpe0ouc2V0QXR0cmlidXRlKEcsIiIrSyl9dmFyIEU9IW8uc3VwcG9ydC5ocmVmTm9ybWFsaXplZCYmSCYmRj9KLmdldEF0dHJpYnV0ZShHLDIpOkouZ2V0QXR0cmlidXRlKEcpO3JldHVybiBFPT09bnVsbD9nOkV9aWYoIW8uc3VwcG9ydC5vcGFjaXR5JiZHPT0ib3BhY2l0eSIpe2lmKEwpe0ouem9vbT0xO0ouZmlsdGVyPShKLmZpbHRlcnx8IiIpLnJlcGxhY2UoL2FscGhhXChbXildKlwpLywiIikrKHBhcnNlSW50KEspKyIiPT0iTmFOIj8iIjoiYWxwaGEob3BhY2l0eT0iK0sqMTAwKyIpIil9cmV0dXJuIEouZmlsdGVyJiZKLmZpbHRlci5pbmRleE9mKCJvcGFjaXR5PSIpPj0wPyhwYXJzZUZsb2F0KEouZmlsdGVyLm1hdGNoKC9vcGFjaXR5PShbXildKikvKVsxXSkvMTAwKSsiIjoiIn1HPUcucmVwbGFjZSgvLShbYS16XSkvaWcsZnVuY3Rpb24oTSxOKXtyZXR1cm4gTi50b1VwcGVyQ2FzZSgpfSk7aWYoTCl7SltHXT1LfXJldHVybiBKW0ddfSx0cmltOmZ1bmN0aW9uKEUpe3JldHVybihFfHwiIikucmVwbGFjZSgvXlxzK3xccyskL2csIiIpfSxtYWtlQXJyYXk6ZnVuY3Rpb24oRyl7dmFyIEU9W107aWYoRyE9bnVsbCl7dmFyIEY9Ry5sZW5ndGg7aWYoRj09bnVsbHx8dHlwZW9mIEc9PT0ic3RyaW5nInx8by5pc0Z1bmN0aW9uKEcpfHxHLnNldEludGVydmFsKXtFWzBdPUd9ZWxzZXt3aGlsZShGKXtFWy0tRl09R1tGXX19fXJldHVybiBFfSxpbkFycmF5OmZ1bmN0aW9uKEcsSCl7Zm9yKHZhciBFPTAsRj1ILmxlbmd0aDtFPEY7RSsrKXtpZihIW0VdPT09Ryl7cmV0dXJuIEV9fXJldHVybiAtMX0sbWVyZ2U6ZnVuY3Rpb24oSCxFKXt2YXIgRj0wLEcsST1ILmxlbmd0aDtpZighby5zdXBwb3J0LmdldEFsbCl7d2hpbGUoKEc9RVtGKytdKSE9bnVsbCl7aWYoRy5ub2RlVHlwZSE9OCl7SFtJKytdPUd9fX1lbHNle3doaWxlKChHPUVbRisrXSkhPW51bGwpe0hbSSsrXT1HfX1yZXR1cm4gSH0sdW5pcXVlOmZ1bmN0aW9uKEspe3ZhciBGPVtdLEU9e307dHJ5e2Zvcih2YXIgRz0wLEg9Sy5sZW5ndGg7RzxIO0crKyl7dmFyIEo9by5kYXRhKEtbR10pO2lmKCFFW0pdKXtFW0pdPXRydWU7Ri5wdXNoKEtbR10pfX19Y2F0Y2goSSl7Rj1LfXJldHVybiBGfSxncmVwOmZ1bmN0aW9uKEYsSixFKXt2YXIgRz1bXTtmb3IodmFyIEg9MCxJPUYubGVuZ3RoO0g8STtIKyspe2lmKCFFIT0hSihGW0hdLEgpKXtHLnB1c2goRltIXSl9fXJldHVybiBHfSxtYXA6ZnVuY3Rpb24oRSxKKXt2YXIgRj1bXTtmb3IodmFyIEc9MCxIPUUubGVuZ3RoO0c8SDtHKyspe3ZhciBJPUooRVtHXSxHKTtpZihJIT1udWxsKXtGW0YubGVuZ3RoXT1JfX1yZXR1cm4gRi5jb25jYXQuYXBwbHkoW10sRil9fSk7dmFyIEM9bmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpO28uYnJvd3Nlcj17dmVyc2lvbjooQy5tYXRjaCgvLisoPzpydnxpdHxyYXxpZSlbXC86IF0oW1xkLl0rKS8pfHxbMCwiMCJdKVsxXSxzYWZhcmk6L3dlYmtpdC8udGVzdChDKSxvcGVyYTovb3BlcmEvLnRlc3QoQyksbXNpZTovbXNpZS8udGVzdChDKSYmIS9vcGVyYS8udGVzdChDKSxtb3ppbGxhOi9tb3ppbGxhLy50ZXN0KEMpJiYhLyhjb21wYXRpYmxlfHdlYmtpdCkvLnRlc3QoQyl9O28uZWFjaCh7cGFyZW50OmZ1bmN0aW9uKEUpe3JldHVybiBFLnBhcmVudE5vZGV9LHBhcmVudHM6ZnVuY3Rpb24oRSl7cmV0dXJuIG8uZGlyKEUsInBhcmVudE5vZGUiKX0sbmV4dDpmdW5jdGlvbihFKXtyZXR1cm4gby5udGgoRSwyLCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKEUpe3JldHVybiBvLm50aChFLDIsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKEUpe3JldHVybiBvLmRpcihFLCJuZXh0U2libGluZyIpfSxwcmV2QWxsOmZ1bmN0aW9uKEUpe3JldHVybiBvLmRpcihFLCJwcmV2aW91c1NpYmxpbmciKX0sc2libGluZ3M6ZnVuY3Rpb24oRSl7cmV0dXJuIG8uc2libGluZyhFLnBhcmVudE5vZGUuZmlyc3RDaGlsZCxFKX0sY2hpbGRyZW46ZnVuY3Rpb24oRSl7cmV0dXJuIG8uc2libGluZyhFLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihFKXtyZXR1cm4gby5ub2RlTmFtZShFLCJpZnJhbWUiKT9FLmNvbnRlbnREb2N1bWVudHx8RS5jb250ZW50V2luZG93LmRvY3VtZW50Om8ubWFrZUFycmF5KEUuY2hpbGROb2Rlcyl9fSxmdW5jdGlvbihFLEYpe28uZm5bRV09ZnVuY3Rpb24oRyl7dmFyIEg9by5tYXAodGhpcyxGKTtpZihHJiZ0eXBlb2YgRz09InN0cmluZyIpe0g9by5tdWx0aUZpbHRlcihHLEgpfXJldHVybiB0aGlzLnB1c2hTdGFjayhvLnVuaXF1ZShIKSxFLEcpfX0pO28uZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKEUsRil7by5mbltFXT1mdW5jdGlvbihHKXt2YXIgSj1bXSxMPW8oRyk7Zm9yKHZhciBLPTAsSD1MLmxlbmd0aDtLPEg7SysrKXt2YXIgST0oSz4wP3RoaXMuY2xvbmUodHJ1ZSk6dGhpcykuZ2V0KCk7by5mbltGXS5hcHBseShvKExbS10pLEkpO0o9Si5jb25jYXQoSSl9cmV0dXJuIHRoaXMucHVzaFN0YWNrKEosRSxHKX19KTtvLmVhY2goe3JlbW92ZUF0dHI6ZnVuY3Rpb24oRSl7by5hdHRyKHRoaXMsRSwiIik7aWYodGhpcy5ub2RlVHlwZT09MSl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUoRSl9fSxhZGRDbGFzczpmdW5jdGlvbihFKXtvLmNsYXNzTmFtZS5hZGQodGhpcyxFKX0scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oRSl7by5jbGFzc05hbWUucmVtb3ZlKHRoaXMsRSl9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKEYsRSl7aWYodHlwZW9mIEUhPT0iYm9vbGVhbiIpe0U9IW8uY2xhc3NOYW1lLmhhcyh0aGlzLEYpfW8uY2xhc3NOYW1lW0U/ImFkZCI6InJlbW92ZSJdKHRoaXMsRil9LHJlbW92ZTpmdW5jdGlvbihFKXtpZighRXx8by5maWx0ZXIoRSxbdGhpc10pLmxlbmd0aCl7bygiKiIsdGhpcykuYWRkKFt0aGlzXSkuZWFjaChmdW5jdGlvbigpe28uZXZlbnQucmVtb3ZlKHRoaXMpO28ucmVtb3ZlRGF0YSh0aGlzKX0pO2lmKHRoaXMucGFyZW50Tm9kZSl7dGhpcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMpfX19LGVtcHR5OmZ1bmN0aW9uKCl7byh0aGlzKS5jaGlsZHJlbigpLnJlbW92ZSgpO3doaWxlKHRoaXMuZmlyc3RDaGlsZCl7dGhpcy5yZW1vdmVDaGlsZCh0aGlzLmZpcnN0Q2hpbGQpfX19LGZ1bmN0aW9uKEUsRil7by5mbltFXT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2goRixhcmd1bWVudHMpfX0pO2Z1bmN0aW9uIGooRSxGKXtyZXR1cm4gRVswXSYmcGFyc2VJbnQoby5jdXJDU1MoRVswXSxGLHRydWUpLDEwKXx8MH12YXIgaD0ialF1ZXJ5IitlKCksdj0wLEE9e307by5leHRlbmQoe2NhY2hlOnt9LGRhdGE6ZnVuY3Rpb24oRixFLEcpe0Y9Rj09bD9BOkY7dmFyIEg9RltoXTtpZighSCl7SD1GW2hdPSsrdn1pZihFJiYhby5jYWNoZVtIXSl7by5jYWNoZVtIXT17fX1pZihHIT09Zyl7by5jYWNoZVtIXVtFXT1HfXJldHVybiBFP28uY2FjaGVbSF1bRV06SH0scmVtb3ZlRGF0YTpmdW5jdGlvbihGLEUpe0Y9Rj09bD9BOkY7dmFyIEg9RltoXTtpZihFKXtpZihvLmNhY2hlW0hdKXtkZWxldGUgby5jYWNoZVtIXVtFXTtFPSIiO2ZvcihFIGluIG8uY2FjaGVbSF0pe2JyZWFrfWlmKCFFKXtvLnJlbW92ZURhdGEoRil9fX1lbHNle3RyeXtkZWxldGUgRltoXX1jYXRjaChHKXtpZihGLnJlbW92ZUF0dHJpYnV0ZSl7Ri5yZW1vdmVBdHRyaWJ1dGUoaCl9fWRlbGV0ZSBvLmNhY2hlW0hdfX0scXVldWU6ZnVuY3Rpb24oRixFLEgpe2lmKEYpe0U9KEV8fCJmeCIpKyJxdWV1ZSI7dmFyIEc9by5kYXRhKEYsRSk7aWYoIUd8fG8uaXNBcnJheShIKSl7Rz1vLmRhdGEoRixFLG8ubWFrZUFycmF5KEgpKX1lbHNle2lmKEgpe0cucHVzaChIKX19fXJldHVybiBHfSxkZXF1ZXVlOmZ1bmN0aW9uKEgsRyl7dmFyIEU9by5xdWV1ZShILEcpLEY9RS5zaGlmdCgpO2lmKCFHfHxHPT09ImZ4Iil7Rj1FWzBdfWlmKEYhPT1nKXtGLmNhbGwoSCl9fX0pO28uZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKEUsRyl7dmFyIEg9RS5zcGxpdCgiLiIpO0hbMV09SFsxXT8iLiIrSFsxXToiIjtpZihHPT09Zyl7dmFyIEY9dGhpcy50cmlnZ2VySGFuZGxlcigiZ2V0RGF0YSIrSFsxXSsiISIsW0hbMF1dKTtpZihGPT09ZyYmdGhpcy5sZW5ndGgpe0Y9by5kYXRhKHRoaXNbMF0sRSl9cmV0dXJuIEY9PT1nJiZIWzFdP3RoaXMuZGF0YShIWzBdKTpGfWVsc2V7cmV0dXJuIHRoaXMudHJpZ2dlcigic2V0RGF0YSIrSFsxXSsiISIsW0hbMF0sR10pLmVhY2goZnVuY3Rpb24oKXtvLmRhdGEodGhpcyxFLEcpfSl9fSxyZW1vdmVEYXRhOmZ1bmN0aW9uKEUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtvLnJlbW92ZURhdGEodGhpcyxFKX0pfSxxdWV1ZTpmdW5jdGlvbihFLEYpe2lmKHR5cGVvZiBFIT09InN0cmluZyIpe0Y9RTtFPSJmeCJ9aWYoRj09PWcpe3JldHVybiBvLnF1ZXVlKHRoaXNbMF0sRSl9cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBHPW8ucXVldWUodGhpcyxFLEYpO2lmKEU9PSJmeCImJkcubGVuZ3RoPT0xKXtHWzBdLmNhbGwodGhpcyl9fSl9LGRlcXVldWU6ZnVuY3Rpb24oRSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe28uZGVxdWV1ZSh0aGlzLEUpfSl9fSk7DQovKg0KICogU2l6emxlIENTUyBTZWxlY3RvciBFbmdpbmUgLSB2MC45LjMNCiAqICBDb3B5cmlnaHQgMjAwOSwgVGhlIERvam8gRm91bmRhdGlvbg0KICogIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQsIEJTRCwgYW5kIEdQTCBMaWNlbnNlcy4NCiAqICBNb3JlIGluZm9ybWF0aW9uOiBodHRwOi8vc2l6emxlanMuY29tLw0KICovDQooZnVuY3Rpb24oKXt2YXIgUj0vKCg/OlwoKD86XChbXigpXStcKXxbXigpXSspK1wpfFxbKD86XFtbXltcXV0qXF18WyciXVteJyJdKlsnIl18W15bXF0nIl0rKStcXXxcXC58W14gPit+LChcW1xcXSspK3xbPit+XSkoXHMqLFxzKik/L2csTD0wLEg9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzt2YXIgRj1mdW5jdGlvbihZLFUsYWIsYWMpe2FiPWFifHxbXTtVPVV8fGRvY3VtZW50O2lmKFUubm9kZVR5cGUhPT0xJiZVLm5vZGVUeXBlIT09OSl7cmV0dXJuW119aWYoIVl8fHR5cGVvZiBZIT09InN0cmluZyIpe3JldHVybiBhYn12YXIgWj1bXSxXLGFmLGFpLFQsYWQsVixYPXRydWU7Ui5sYXN0SW5kZXg9MDt3aGlsZSgoVz1SLmV4ZWMoWSkpIT09bnVsbCl7Wi5wdXNoKFdbMV0pO2lmKFdbMl0pe1Y9UmVnRXhwLnJpZ2h0Q29udGV4dDticmVha319aWYoWi5sZW5ndGg+MSYmTS5leGVjKFkpKXtpZihaLmxlbmd0aD09PTImJkkucmVsYXRpdmVbWlswXV0pe2FmPUooWlswXStaWzFdLFUpfWVsc2V7YWY9SS5yZWxhdGl2ZVtaWzBdXT9bVV06RihaLnNoaWZ0KCksVSk7d2hpbGUoWi5sZW5ndGgpe1k9Wi5zaGlmdCgpO2lmKEkucmVsYXRpdmVbWV0pe1krPVouc2hpZnQoKX1hZj1KKFksYWYpfX19ZWxzZXt2YXIgYWU9YWM/e2V4cHI6Wi5wb3AoKSxzZXQ6RShhYyl9OkYuZmluZChaLnBvcCgpLFoubGVuZ3RoPT09MSYmVS5wYXJlbnROb2RlP1UucGFyZW50Tm9kZTpVLFEoVSkpO2FmPUYuZmlsdGVyKGFlLmV4cHIsYWUuc2V0KTtpZihaLmxlbmd0aD4wKXthaT1FKGFmKX1lbHNle1g9ZmFsc2V9d2hpbGUoWi5sZW5ndGgpe3ZhciBhaD1aLnBvcCgpLGFnPWFoO2lmKCFJLnJlbGF0aXZlW2FoXSl7YWg9IiJ9ZWxzZXthZz1aLnBvcCgpfWlmKGFnPT1udWxsKXthZz1VfUkucmVsYXRpdmVbYWhdKGFpLGFnLFEoVSkpfX1pZighYWkpe2FpPWFmfWlmKCFhaSl7dGhyb3ciU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIisoYWh8fFkpfWlmKEguY2FsbChhaSk9PT0iW29iamVjdCBBcnJheV0iKXtpZighWCl7YWIucHVzaC5hcHBseShhYixhaSl9ZWxzZXtpZihVLm5vZGVUeXBlPT09MSl7Zm9yKHZhciBhYT0wO2FpW2FhXSE9bnVsbDthYSsrKXtpZihhaVthYV0mJihhaVthYV09PT10cnVlfHxhaVthYV0ubm9kZVR5cGU9PT0xJiZLKFUsYWlbYWFdKSkpe2FiLnB1c2goYWZbYWFdKX19fWVsc2V7Zm9yKHZhciBhYT0wO2FpW2FhXSE9bnVsbDthYSsrKXtpZihhaVthYV0mJmFpW2FhXS5ub2RlVHlwZT09PTEpe2FiLnB1c2goYWZbYWFdKX19fX19ZWxzZXtFKGFpLGFiKX1pZihWKXtGKFYsVSxhYixhYyk7aWYoRyl7aGFzRHVwbGljYXRlPWZhbHNlO2FiLnNvcnQoRyk7aWYoaGFzRHVwbGljYXRlKXtmb3IodmFyIGFhPTE7YWE8YWIubGVuZ3RoO2FhKyspe2lmKGFiW2FhXT09PWFiW2FhLTFdKXthYi5zcGxpY2UoYWEtLSwxKX19fX19cmV0dXJuIGFifTtGLm1hdGNoZXM9ZnVuY3Rpb24oVCxVKXtyZXR1cm4gRihULG51bGwsbnVsbCxVKX07Ri5maW5kPWZ1bmN0aW9uKGFhLFQsYWIpe3ZhciBaLFg7aWYoIWFhKXtyZXR1cm5bXX1mb3IodmFyIFc9MCxWPUkub3JkZXIubGVuZ3RoO1c8VjtXKyspe3ZhciBZPUkub3JkZXJbV10sWDtpZigoWD1JLm1hdGNoW1ldLmV4ZWMoYWEpKSl7dmFyIFU9UmVnRXhwLmxlZnRDb250ZXh0O2lmKFUuc3Vic3RyKFUubGVuZ3RoLTEpIT09IlxcIil7WFsxXT0oWFsxXXx8IiIpLnJlcGxhY2UoL1xcL2csIiIpO1o9SS5maW5kW1ldKFgsVCxhYik7aWYoWiE9bnVsbCl7YWE9YWEucmVwbGFjZShJLm1hdGNoW1ldLCIiKTticmVha319fX1pZighWil7Wj1ULmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIil9cmV0dXJue3NldDpaLGV4cHI6YWF9fTtGLmZpbHRlcj1mdW5jdGlvbihhZCxhYyxhZyxXKXt2YXIgVj1hZCxhaT1bXSxhYT1hYyxZLFQsWj1hYyYmYWNbMF0mJlEoYWNbMF0pO3doaWxlKGFkJiZhYy5sZW5ndGgpe2Zvcih2YXIgYWIgaW4gSS5maWx0ZXIpe2lmKChZPUkubWF0Y2hbYWJdLmV4ZWMoYWQpKSE9bnVsbCl7dmFyIFU9SS5maWx0ZXJbYWJdLGFoLGFmO1Q9ZmFsc2U7aWYoYWE9PWFpKXthaT1bXX1pZihJLnByZUZpbHRlclthYl0pe1k9SS5wcmVGaWx0ZXJbYWJdKFksYWEsYWcsYWksVyxaKTtpZighWSl7VD1haD10cnVlfWVsc2V7aWYoWT09PXRydWUpe2NvbnRpbnVlfX19aWYoWSl7Zm9yKHZhciBYPTA7KGFmPWFhW1hdKSE9bnVsbDtYKyspe2lmKGFmKXthaD1VKGFmLFksWCxhYSk7dmFyIGFlPVdeISFhaDtpZihhZyYmYWghPW51bGwpe2lmKGFlKXtUPXRydWV9ZWxzZXthYVtYXT1mYWxzZX19ZWxzZXtpZihhZSl7YWkucHVzaChhZik7VD10cnVlfX19fX1pZihhaCE9PWcpe2lmKCFhZyl7YWE9YWl9YWQ9YWQucmVwbGFjZShJLm1hdGNoW2FiXSwiIik7aWYoIVQpe3JldHVybltdfWJyZWFrfX19aWYoYWQ9PVYpe2lmKFQ9PW51bGwpe3Rocm93IlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrYWR9ZWxzZXticmVha319Vj1hZH1yZXR1cm4gYWF9O3ZhciBJPUYuc2VsZWN0b3JzPXtvcmRlcjpbIklEIiwiTkFNRSIsIlRBRyJdLG1hdGNoOntJRDovIygoPzpbXHdcdTAwYzAtXHVGRkZGXy1dfFxcLikrKS8sQ0xBU1M6L1wuKCg/Oltcd1x1MDBjMC1cdUZGRkZfLV18XFwuKSspLyxOQU1FOi9cW25hbWU9WyciXSooKD86W1x3XHUwMGMwLVx1RkZGRl8tXXxcXC4pKylbJyJdKlxdLyxBVFRSOi9cW1xzKigoPzpbXHdcdTAwYzAtXHVGRkZGXy1dfFxcLikrKVxzKig/OihcUz89KVxzKihbJyJdKikoLio/KVwzfClccypcXS8sVEFHOi9eKCg/Oltcd1x1MDBjMC1cdUZGRkZcKl8tXXxcXC4pKykvLENISUxEOi86KG9ubHl8bnRofGxhc3R8Zmlyc3QpLWNoaWxkKD86XCgoZXZlbnxvZGR8W1xkbistXSopXCkpPy8sUE9TOi86KG50aHxlcXxndHxsdHxmaXJzdHxsYXN0fGV2ZW58b2RkKSg/OlwoKFxkKilcKSk/KD89W14tXXwkKS8sUFNFVURPOi86KCg/Oltcd1x1MDBjMC1cdUZGRkZfLV18XFwuKSspKD86XCgoWyciXSopKCg/OlwoW15cKV0rXCl8W15cMlwoXCldKikrKVwyXCkpPy99LGF0dHJNYXA6eyJjbGFzcyI6ImNsYXNzTmFtZSIsImZvciI6Imh0bWxGb3IifSxhdHRySGFuZGxlOntocmVmOmZ1bmN0aW9uKFQpe3JldHVybiBULmdldEF0dHJpYnV0ZSgiaHJlZiIpfX0scmVsYXRpdmU6eyIrIjpmdW5jdGlvbihhYSxULFope3ZhciBYPXR5cGVvZiBUPT09InN0cmluZyIsYWI9WCYmIS9cVy8udGVzdChUKSxZPVgmJiFhYjtpZihhYiYmIVope1Q9VC50b1VwcGVyQ2FzZSgpfWZvcih2YXIgVz0wLFY9YWEubGVuZ3RoLFU7VzxWO1crKyl7aWYoKFU9YWFbV10pKXt3aGlsZSgoVT1VLnByZXZpb3VzU2libGluZykmJlUubm9kZVR5cGUhPT0xKXt9YWFbV109WXx8VSYmVS5ub2RlTmFtZT09PVQ/VXx8ZmFsc2U6VT09PVR9fWlmKFkpe0YuZmlsdGVyKFQsYWEsdHJ1ZSl9fSwiPiI6ZnVuY3Rpb24oWixVLGFhKXt2YXIgWD10eXBlb2YgVT09PSJzdHJpbmciO2lmKFgmJiEvXFcvLnRlc3QoVSkpe1U9YWE/VTpVLnRvVXBwZXJDYXNlKCk7Zm9yKHZhciBWPTAsVD1aLmxlbmd0aDtWPFQ7VisrKXt2YXIgWT1aW1ZdO2lmKFkpe3ZhciBXPVkucGFyZW50Tm9kZTtaW1ZdPVcubm9kZU5hbWU9PT1VP1c6ZmFsc2V9fX1lbHNle2Zvcih2YXIgVj0wLFQ9Wi5sZW5ndGg7VjxUO1YrKyl7dmFyIFk9WltWXTtpZihZKXtaW1ZdPVg/WS5wYXJlbnROb2RlOlkucGFyZW50Tm9kZT09PVV9fWlmKFgpe0YuZmlsdGVyKFUsWix0cnVlKX19fSwiIjpmdW5jdGlvbihXLFUsWSl7dmFyIFY9TCsrLFQ9UztpZighVS5tYXRjaCgvXFcvKSl7dmFyIFg9VT1ZP1U6VS50b1VwcGVyQ2FzZSgpO1Q9UH1UKCJwYXJlbnROb2RlIixVLFYsVyxYLFkpfSwifiI6ZnVuY3Rpb24oVyxVLFkpe3ZhciBWPUwrKyxUPVM7aWYodHlwZW9mIFU9PT0ic3RyaW5nIiYmIVUubWF0Y2goL1xXLykpe3ZhciBYPVU9WT9VOlUudG9VcHBlckNhc2UoKTtUPVB9VCgicHJldmlvdXNTaWJsaW5nIixVLFYsVyxYLFkpfX0sZmluZDp7SUQ6ZnVuY3Rpb24oVSxWLFcpe2lmKHR5cGVvZiBWLmdldEVsZW1lbnRCeUlkIT09InVuZGVmaW5lZCImJiFXKXt2YXIgVD1WLmdldEVsZW1lbnRCeUlkKFVbMV0pO3JldHVybiBUP1tUXTpbXX19LE5BTUU6ZnVuY3Rpb24oVixZLFope2lmKHR5cGVvZiBZLmdldEVsZW1lbnRzQnlOYW1lIT09InVuZGVmaW5lZCIpe3ZhciBVPVtdLFg9WS5nZXRFbGVtZW50c0J5TmFtZShWWzFdKTtmb3IodmFyIFc9MCxUPVgubGVuZ3RoO1c8VDtXKyspe2lmKFhbV10uZ2V0QXR0cmlidXRlKCJuYW1lIik9PT1WWzFdKXtVLnB1c2goWFtXXSl9fXJldHVybiBVLmxlbmd0aD09PTA/bnVsbDpVfX0sVEFHOmZ1bmN0aW9uKFQsVSl7cmV0dXJuIFUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoVFsxXSl9fSxwcmVGaWx0ZXI6e0NMQVNTOmZ1bmN0aW9uKFcsVSxWLFQsWixhYSl7Vz0iICIrV1sxXS5yZXBsYWNlKC9cXC9nLCIiKSsiICI7aWYoYWEpe3JldHVybiBXfWZvcih2YXIgWD0wLFk7KFk9VVtYXSkhPW51bGw7WCsrKXtpZihZKXtpZihaXihZLmNsYXNzTmFtZSYmKCIgIitZLmNsYXNzTmFtZSsiICIpLmluZGV4T2YoVyk+PTApKXtpZighVil7VC5wdXNoKFkpfX1lbHNle2lmKFYpe1VbWF09ZmFsc2V9fX19cmV0dXJuIGZhbHNlfSxJRDpmdW5jdGlvbihUKXtyZXR1cm4gVFsxXS5yZXBsYWNlKC9cXC9nLCIiKX0sVEFHOmZ1bmN0aW9uKFUsVCl7Zm9yKHZhciBWPTA7VFtWXT09PWZhbHNlO1YrKyl7fXJldHVybiBUW1ZdJiZRKFRbVl0pP1VbMV06VVsxXS50b1VwcGVyQ2FzZSgpfSxDSElMRDpmdW5jdGlvbihUKXtpZihUWzFdPT0ibnRoIil7dmFyIFU9LygtPykoXGQqKW4oKD86XCt8LSk/XGQqKS8uZXhlYyhUWzJdPT0iZXZlbiImJiIybiJ8fFRbMl09PSJvZGQiJiYiMm4rMSJ8fCEvXEQvLnRlc3QoVFsyXSkmJiIwbisiK1RbMl18fFRbMl0pO1RbMl09KFVbMV0rKFVbMl18fDEpKS0wO1RbM109VVszXS0wfVRbMF09TCsrO3JldHVybiBUfSxBVFRSOmZ1bmN0aW9uKFgsVSxWLFQsWSxaKXt2YXIgVz1YWzFdLnJlcGxhY2UoL1xcL2csIiIpO2lmKCFaJiZJLmF0dHJNYXBbV10pe1hbMV09SS5hdHRyTWFwW1ddfWlmKFhbMl09PT0ifj0iKXtYWzRdPSIgIitYWzRdKyIgIn1yZXR1cm4gWH0sUFNFVURPOmZ1bmN0aW9uKFgsVSxWLFQsWSl7aWYoWFsxXT09PSJub3QiKXtpZihYWzNdLm1hdGNoKFIpLmxlbmd0aD4xfHwvXlx3Ly50ZXN0KFhbM10pKXtYWzNdPUYoWFszXSxudWxsLG51bGwsVSl9ZWxzZXt2YXIgVz1GLmZpbHRlcihYWzNdLFUsVix0cnVlXlkpO2lmKCFWKXtULnB1c2guYXBwbHkoVCxXKX1yZXR1cm4gZmFsc2V9fWVsc2V7aWYoSS5tYXRjaC5QT1MudGVzdChYWzBdKXx8SS5tYXRjaC5DSElMRC50ZXN0KFhbMF0pKXtyZXR1cm4gdHJ1ZX19cmV0dXJuIFh9LFBPUzpmdW5jdGlvbihUKXtULnVuc2hpZnQodHJ1ZSk7cmV0dXJuIFR9fSxmaWx0ZXJzOntlbmFibGVkOmZ1bmN0aW9uKFQpe3JldHVybiBULmRpc2FibGVkPT09ZmFsc2UmJlQudHlwZSE9PSJoaWRkZW4ifSxkaXNhYmxlZDpmdW5jdGlvbihUKXtyZXR1cm4gVC5kaXNhYmxlZD09PXRydWV9LGNoZWNrZWQ6ZnVuY3Rpb24oVCl7cmV0dXJuIFQuY2hlY2tlZD09PXRydWV9LHNlbGVjdGVkOmZ1bmN0aW9uKFQpe1QucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4O3JldHVybiBULnNlbGVjdGVkPT09dHJ1ZX0scGFyZW50OmZ1bmN0aW9uKFQpe3JldHVybiAhIVQuZmlyc3RDaGlsZH0sZW1wdHk6ZnVuY3Rpb24oVCl7cmV0dXJuICFULmZpcnN0Q2hpbGR9LGhhczpmdW5jdGlvbihWLFUsVCl7cmV0dXJuICEhRihUWzNdLFYpLmxlbmd0aH0saGVhZGVyOmZ1bmN0aW9uKFQpe3JldHVybi9oXGQvaS50ZXN0KFQubm9kZU5hbWUpfSx0ZXh0OmZ1bmN0aW9uKFQpe3JldHVybiJ0ZXh0Ij09PVQudHlwZX0scmFkaW86ZnVuY3Rpb24oVCl7cmV0dXJuInJhZGlvIj09PVQudHlwZX0sY2hlY2tib3g6ZnVuY3Rpb24oVCl7cmV0dXJuImNoZWNrYm94Ij09PVQudHlwZX0sZmlsZTpmdW5jdGlvbihUKXtyZXR1cm4iZmlsZSI9PT1ULnR5cGV9LHBhc3N3b3JkOmZ1bmN0aW9uKFQpe3JldHVybiJwYXNzd29yZCI9PT1ULnR5cGV9LHN1Ym1pdDpmdW5jdGlvbihUKXtyZXR1cm4ic3VibWl0Ij09PVQudHlwZX0saW1hZ2U6ZnVuY3Rpb24oVCl7cmV0dXJuImltYWdlIj09PVQudHlwZX0scmVzZXQ6ZnVuY3Rpb24oVCl7cmV0dXJuInJlc2V0Ij09PVQudHlwZX0sYnV0dG9uOmZ1bmN0aW9uKFQpe3JldHVybiJidXR0b24iPT09VC50eXBlfHxULm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk9PT0iQlVUVE9OIn0saW5wdXQ6ZnVuY3Rpb24oVCl7cmV0dXJuL2lucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24vaS50ZXN0KFQubm9kZU5hbWUpfX0sc2V0RmlsdGVyczp7Zmlyc3Q6ZnVuY3Rpb24oVSxUKXtyZXR1cm4gVD09PTB9LGxhc3Q6ZnVuY3Rpb24oVixVLFQsVyl7cmV0dXJuIFU9PT1XLmxlbmd0aC0xfSxldmVuOmZ1bmN0aW9uKFUsVCl7cmV0dXJuIFQlMj09PTB9LG9kZDpmdW5jdGlvbihVLFQpe3JldHVybiBUJTI9PT0xfSxsdDpmdW5jdGlvbihWLFUsVCl7cmV0dXJuIFU8VFszXS0wfSxndDpmdW5jdGlvbihWLFUsVCl7cmV0dXJuIFU+VFszXS0wfSxudGg6ZnVuY3Rpb24oVixVLFQpe3JldHVybiBUWzNdLTA9PVV9LGVxOmZ1bmN0aW9uKFYsVSxUKXtyZXR1cm4gVFszXS0wPT1VfX0sZmlsdGVyOntQU0VVRE86ZnVuY3Rpb24oWixWLFcsYWEpe3ZhciBVPVZbMV0sWD1JLmZpbHRlcnNbVV07aWYoWCl7cmV0dXJuIFgoWixXLFYsYWEpfWVsc2V7aWYoVT09PSJjb250YWlucyIpe3JldHVybihaLnRleHRDb250ZW50fHxaLmlubmVyVGV4dHx8IiIpLmluZGV4T2YoVlszXSk+PTB9ZWxzZXtpZihVPT09Im5vdCIpe3ZhciBZPVZbM107Zm9yKHZhciBXPTAsVD1ZLmxlbmd0aDtXPFQ7VysrKXtpZihZW1ddPT09Wil7cmV0dXJuIGZhbHNlfX1yZXR1cm4gdHJ1ZX19fX0sQ0hJTEQ6ZnVuY3Rpb24oVCxXKXt2YXIgWj1XWzFdLFU9VDtzd2l0Y2goWil7Y2FzZSJvbmx5IjpjYXNlImZpcnN0Ijp3aGlsZShVPVUucHJldmlvdXNTaWJsaW5nKXtpZihVLm5vZGVUeXBlPT09MSl7cmV0dXJuIGZhbHNlfX1pZihaPT0iZmlyc3QiKXtyZXR1cm4gdHJ1ZX1VPVQ7Y2FzZSJsYXN0Ijp3aGlsZShVPVUubmV4dFNpYmxpbmcpe2lmKFUubm9kZVR5cGU9PT0xKXtyZXR1cm4gZmFsc2V9fXJldHVybiB0cnVlO2Nhc2UibnRoIjp2YXIgVj1XWzJdLGFjPVdbM107aWYoVj09MSYmYWM9PTApe3JldHVybiB0cnVlfXZhciBZPVdbMF0sYWI9VC5wYXJlbnROb2RlO2lmKGFiJiYoYWIuc2l6Y2FjaGUhPT1ZfHwhVC5ub2RlSW5kZXgpKXt2YXIgWD0wO2ZvcihVPWFiLmZpcnN0Q2hpbGQ7VTtVPVUubmV4dFNpYmxpbmcpe2lmKFUubm9kZVR5cGU9PT0xKXtVLm5vZGVJbmRleD0rK1h9fWFiLnNpemNhY2hlPVl9dmFyIGFhPVQubm9kZUluZGV4LWFjO2lmKFY9PTApe3JldHVybiBhYT09MH1lbHNle3JldHVybihhYSVWPT0wJiZhYS9WPj0wKX19fSxJRDpmdW5jdGlvbihVLFQpe3JldHVybiBVLm5vZGVUeXBlPT09MSYmVS5nZXRBdHRyaWJ1dGUoImlkIik9PT1UfSxUQUc6ZnVuY3Rpb24oVSxUKXtyZXR1cm4oVD09PSIqIiYmVS5ub2RlVHlwZT09PTEpfHxVLm5vZGVOYW1lPT09VH0sQ0xBU1M6ZnVuY3Rpb24oVSxUKXtyZXR1cm4oIiAiKyhVLmNsYXNzTmFtZXx8VS5nZXRBdHRyaWJ1dGUoImNsYXNzIikpKyIgIikuaW5kZXhPZihUKT4tMX0sQVRUUjpmdW5jdGlvbihZLFcpe3ZhciBWPVdbMV0sVD1JLmF0dHJIYW5kbGVbVl0/SS5hdHRySGFuZGxlW1ZdKFkpOllbVl0hPW51bGw/WVtWXTpZLmdldEF0dHJpYnV0ZShWKSxaPVQrIiIsWD1XWzJdLFU9V1s0XTtyZXR1cm4gVD09bnVsbD9YPT09IiE9IjpYPT09Ij0iP1o9PT1VOlg9PT0iKj0iP1ouaW5kZXhPZihVKT49MDpYPT09In49Ij8oIiAiK1orIiAiKS5pbmRleE9mKFUpPj0wOiFVP1omJlQhPT1mYWxzZTpYPT09IiE9Ij9aIT1VOlg9PT0iXj0iP1ouaW5kZXhPZihVKT09PTA6WD09PSIkPSI/Wi5zdWJzdHIoWi5sZW5ndGgtVS5sZW5ndGgpPT09VTpYPT09Inw9Ij9aPT09VXx8Wi5zdWJzdHIoMCxVLmxlbmd0aCsxKT09PVUrIi0iOmZhbHNlfSxQT1M6ZnVuY3Rpb24oWCxVLFYsWSl7dmFyIFQ9VVsyXSxXPUkuc2V0RmlsdGVyc1tUXTtpZihXKXtyZXR1cm4gVyhYLFYsVSxZKX19fX07dmFyIE09SS5tYXRjaC5QT1M7Zm9yKHZhciBPIGluIEkubWF0Y2gpe0kubWF0Y2hbT109UmVnRXhwKEkubWF0Y2hbT10uc291cmNlKy8oPyFbXlxbXSpcXSkoPyFbXlwoXSpcKSkvLnNvdXJjZSl9dmFyIEU9ZnVuY3Rpb24oVSxUKXtVPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKFUpO2lmKFQpe1QucHVzaC5hcHBseShULFUpO3JldHVybiBUfXJldHVybiBVfTt0cnl7QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMpfWNhdGNoKE4pe0U9ZnVuY3Rpb24oWCxXKXt2YXIgVT1XfHxbXTtpZihILmNhbGwoWCk9PT0iW29iamVjdCBBcnJheV0iKXtBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShVLFgpfWVsc2V7aWYodHlwZW9mIFgubGVuZ3RoPT09Im51bWJlciIpe2Zvcih2YXIgVj0wLFQ9WC5sZW5ndGg7VjxUO1YrKyl7VS5wdXNoKFhbVl0pfX1lbHNle2Zvcih2YXIgVj0wO1hbVl07VisrKXtVLnB1c2goWFtWXSl9fX1yZXR1cm4gVX19dmFyIEc7aWYoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKXtHPWZ1bmN0aW9uKFUsVCl7dmFyIFY9VS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihUKSY0Py0xOlU9PT1UPzA6MTtpZihWPT09MCl7aGFzRHVwbGljYXRlPXRydWV9cmV0dXJuIFZ9fWVsc2V7aWYoInNvdXJjZUluZGV4IiBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpe0c9ZnVuY3Rpb24oVSxUKXt2YXIgVj1VLnNvdXJjZUluZGV4LVQuc291cmNlSW5kZXg7aWYoVj09PTApe2hhc0R1cGxpY2F0ZT10cnVlfXJldHVybiBWfX1lbHNle2lmKGRvY3VtZW50LmNyZWF0ZVJhbmdlKXtHPWZ1bmN0aW9uKFcsVSl7dmFyIFY9Vy5vd25lckRvY3VtZW50LmNyZWF0ZVJhbmdlKCksVD1VLm93bmVyRG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtWLnNlbGVjdE5vZGUoVyk7Vi5jb2xsYXBzZSh0cnVlKTtULnNlbGVjdE5vZGUoVSk7VC5jb2xsYXBzZSh0cnVlKTt2YXIgWD1WLmNvbXBhcmVCb3VuZGFyeVBvaW50cyhSYW5nZS5TVEFSVF9UT19FTkQsVCk7aWYoWD09PTApe2hhc0R1cGxpY2F0ZT10cnVlfXJldHVybiBYfX19fShmdW5jdGlvbigpe3ZhciBVPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImZvcm0iKSxWPSJzY3JpcHQiKyhuZXcgRGF0ZSkuZ2V0VGltZSgpO1UuaW5uZXJIVE1MPSI8aW5wdXQgbmFtZT0nIitWKyInLz4iO3ZhciBUPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtULmluc2VydEJlZm9yZShVLFQuZmlyc3RDaGlsZCk7aWYoISFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChWKSl7SS5maW5kLklEPWZ1bmN0aW9uKFgsWSxaKXtpZih0eXBlb2YgWS5nZXRFbGVtZW50QnlJZCE9PSJ1bmRlZmluZWQiJiYhWil7dmFyIFc9WS5nZXRFbGVtZW50QnlJZChYWzFdKTtyZXR1cm4gVz9XLmlkPT09WFsxXXx8dHlwZW9mIFcuZ2V0QXR0cmlidXRlTm9kZSE9PSJ1bmRlZmluZWQiJiZXLmdldEF0dHJpYnV0ZU5vZGUoImlkIikubm9kZVZhbHVlPT09WFsxXT9bV106ZzpbXX19O0kuZmlsdGVyLklEPWZ1bmN0aW9uKFksVyl7dmFyIFg9dHlwZW9mIFkuZ2V0QXR0cmlidXRlTm9kZSE9PSJ1bmRlZmluZWQiJiZZLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7cmV0dXJuIFkubm9kZVR5cGU9PT0xJiZYJiZYLm5vZGVWYWx1ZT09PVd9fVQucmVtb3ZlQ2hpbGQoVSl9KSgpOyhmdW5jdGlvbigpe3ZhciBUPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO1QuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlQ29tbWVudCgiIikpO2lmKFQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGg+MCl7SS5maW5kLlRBRz1mdW5jdGlvbihVLFkpe3ZhciBYPVkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoVVsxXSk7aWYoVVsxXT09PSIqIil7dmFyIFc9W107Zm9yKHZhciBWPTA7WFtWXTtWKyspe2lmKFhbVl0ubm9kZVR5cGU9PT0xKXtXLnB1c2goWFtWXSl9fVg9V31yZXR1cm4gWH19VC5pbm5lckhUTUw9IjxhIGhyZWY9JyMnPjwvYT4iO2lmKFQuZmlyc3RDaGlsZCYmdHlwZW9mIFQuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUhPT0idW5kZWZpbmVkIiYmVC5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpIT09IiMiKXtJLmF0dHJIYW5kbGUuaHJlZj1mdW5jdGlvbihVKXtyZXR1cm4gVS5nZXRBdHRyaWJ1dGUoImhyZWYiLDIpfX19KSgpO2lmKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwpeyhmdW5jdGlvbigpe3ZhciBUPUYsVT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtVLmlubmVySFRNTD0iPHAgY2xhc3M9J1RFU1QnPjwvcD4iO2lmKFUucXVlcnlTZWxlY3RvckFsbCYmVS5xdWVyeVNlbGVjdG9yQWxsKCIuVEVTVCIpLmxlbmd0aD09PTApe3JldHVybn1GPWZ1bmN0aW9uKFksWCxWLFcpe1g9WHx8ZG9jdW1lbnQ7aWYoIVcmJlgubm9kZVR5cGU9PT05JiYhUShYKSl7dHJ5e3JldHVybiBFKFgucXVlcnlTZWxlY3RvckFsbChZKSxWKX1jYXRjaChaKXt9fXJldHVybiBUKFksWCxWLFcpfTtGLmZpbmQ9VC5maW5kO0YuZmlsdGVyPVQuZmlsdGVyO0Yuc2VsZWN0b3JzPVQuc2VsZWN0b3JzO0YubWF0Y2hlcz1ULm1hdGNoZXN9KSgpfWlmKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXsoZnVuY3Rpb24oKXt2YXIgVD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtULmlubmVySFRNTD0iPGRpdiBjbGFzcz0ndGVzdCBlJz48L2Rpdj48ZGl2IGNsYXNzPSd0ZXN0Jz48L2Rpdj4iO2lmKFQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aD09PTApe3JldHVybn1ULmxhc3RDaGlsZC5jbGFzc05hbWU9ImUiO2lmKFQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aD09PTEpe3JldHVybn1JLm9yZGVyLnNwbGljZSgxLDAsIkNMQVNTIik7SS5maW5kLkNMQVNTPWZ1bmN0aW9uKFUsVixXKXtpZih0eXBlb2YgVi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lIT09InVuZGVmaW5lZCImJiFXKXtyZXR1cm4gVi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFVbMV0pfX19KSgpfWZ1bmN0aW9uIFAoVSxaLFksYWQsYWEsYWMpe3ZhciBhYj1VPT0icHJldmlvdXNTaWJsaW5nIiYmIWFjO2Zvcih2YXIgVz0wLFY9YWQubGVuZ3RoO1c8VjtXKyspe3ZhciBUPWFkW1ddO2lmKFQpe2lmKGFiJiZULm5vZGVUeXBlPT09MSl7VC5zaXpjYWNoZT1ZO1Quc2l6c2V0PVd9VD1UW1VdO3ZhciBYPWZhbHNlO3doaWxlKFQpe2lmKFQuc2l6Y2FjaGU9PT1ZKXtYPWFkW1Quc2l6c2V0XTticmVha31pZihULm5vZGVUeXBlPT09MSYmIWFjKXtULnNpemNhY2hlPVk7VC5zaXpzZXQ9V31pZihULm5vZGVOYW1lPT09Wil7WD1UO2JyZWFrfVQ9VFtVXX1hZFtXXT1YfX19ZnVuY3Rpb24gUyhVLFosWSxhZCxhYSxhYyl7dmFyIGFiPVU9PSJwcmV2aW91c1NpYmxpbmciJiYhYWM7Zm9yKHZhciBXPTAsVj1hZC5sZW5ndGg7VzxWO1crKyl7dmFyIFQ9YWRbV107aWYoVCl7aWYoYWImJlQubm9kZVR5cGU9PT0xKXtULnNpemNhY2hlPVk7VC5zaXpzZXQ9V31UPVRbVV07dmFyIFg9ZmFsc2U7d2hpbGUoVCl7aWYoVC5zaXpjYWNoZT09PVkpe1g9YWRbVC5zaXpzZXRdO2JyZWFrfWlmKFQubm9kZVR5cGU9PT0xKXtpZighYWMpe1Quc2l6Y2FjaGU9WTtULnNpenNldD1XfWlmKHR5cGVvZiBaIT09InN0cmluZyIpe2lmKFQ9PT1aKXtYPXRydWU7YnJlYWt9fWVsc2V7aWYoRi5maWx0ZXIoWixbVF0pLmxlbmd0aD4wKXtYPVQ7YnJlYWt9fX1UPVRbVV19YWRbV109WH19fXZhciBLPWRvY3VtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP2Z1bmN0aW9uKFUsVCl7cmV0dXJuIFUuY29tcGFyZURvY3VtZW50UG9zaXRpb24oVCkmMTZ9OmZ1bmN0aW9uKFUsVCl7cmV0dXJuIFUhPT1UJiYoVS5jb250YWlucz9VLmNvbnRhaW5zKFQpOnRydWUpfTt2YXIgUT1mdW5jdGlvbihUKXtyZXR1cm4gVC5ub2RlVHlwZT09PTkmJlQuZG9jdW1lbnRFbGVtZW50Lm5vZGVOYW1lIT09IkhUTUwifHwhIVQub3duZXJEb2N1bWVudCYmUShULm93bmVyRG9jdW1lbnQpfTt2YXIgSj1mdW5jdGlvbihULGFhKXt2YXIgVz1bXSxYPSIiLFksVj1hYS5ub2RlVHlwZT9bYWFdOmFhO3doaWxlKChZPUkubWF0Y2guUFNFVURPLmV4ZWMoVCkpKXtYKz1ZWzBdO1Q9VC5yZXBsYWNlKEkubWF0Y2guUFNFVURPLCIiKX1UPUkucmVsYXRpdmVbVF0/VCsiKiI6VDtmb3IodmFyIFo9MCxVPVYubGVuZ3RoO1o8VTtaKyspe0YoVCxWW1pdLFcpfXJldHVybiBGLmZpbHRlcihYLFcpfTtvLmZpbmQ9RjtvLmZpbHRlcj1GLmZpbHRlcjtvLmV4cHI9Ri5zZWxlY3RvcnM7by5leHByWyI6Il09by5leHByLmZpbHRlcnM7Ri5zZWxlY3RvcnMuZmlsdGVycy5oaWRkZW49ZnVuY3Rpb24oVCl7cmV0dXJuIFQub2Zmc2V0V2lkdGg9PT0wfHxULm9mZnNldEhlaWdodD09PTB9O0Yuc2VsZWN0b3JzLmZpbHRlcnMudmlzaWJsZT1mdW5jdGlvbihUKXtyZXR1cm4gVC5vZmZzZXRXaWR0aD4wfHxULm9mZnNldEhlaWdodD4wfTtGLnNlbGVjdG9ycy5maWx0ZXJzLmFuaW1hdGVkPWZ1bmN0aW9uKFQpe3JldHVybiBvLmdyZXAoby50aW1lcnMsZnVuY3Rpb24oVSl7cmV0dXJuIFQ9PT1VLmVsZW19KS5sZW5ndGh9O28ubXVsdGlGaWx0ZXI9ZnVuY3Rpb24oVixULFUpe2lmKFUpe1Y9Ijpub3QoIitWKyIpIn1yZXR1cm4gRi5tYXRjaGVzKFYsVCl9O28uZGlyPWZ1bmN0aW9uKFYsVSl7dmFyIFQ9W10sVz1WW1VdO3doaWxlKFcmJlchPWRvY3VtZW50KXtpZihXLm5vZGVUeXBlPT0xKXtULnB1c2goVyl9Vz1XW1VdfXJldHVybiBUfTtvLm50aD1mdW5jdGlvbihYLFQsVixXKXtUPVR8fDE7dmFyIFU9MDtmb3IoO1g7WD1YW1ZdKXtpZihYLm5vZGVUeXBlPT0xJiYrK1U9PVQpe2JyZWFrfX1yZXR1cm4gWH07by5zaWJsaW5nPWZ1bmN0aW9uKFYsVSl7dmFyIFQ9W107Zm9yKDtWO1Y9Vi5uZXh0U2libGluZyl7aWYoVi5ub2RlVHlwZT09MSYmViE9VSl7VC5wdXNoKFYpfX1yZXR1cm4gVH07cmV0dXJuO2wuU2l6emxlPUZ9KSgpO28uZXZlbnQ9e2FkZDpmdW5jdGlvbihJLEYsSCxLKXtpZihJLm5vZGVUeXBlPT0zfHxJLm5vZGVUeXBlPT04KXtyZXR1cm59aWYoSS5zZXRJbnRlcnZhbCYmSSE9bCl7ST1sfWlmKCFILmd1aWQpe0guZ3VpZD10aGlzLmd1aWQrK31pZihLIT09Zyl7dmFyIEc9SDtIPXRoaXMucHJveHkoRyk7SC5kYXRhPUt9dmFyIEU9by5kYXRhKEksImV2ZW50cyIpfHxvLmRhdGEoSSwiZXZlbnRzIix7fSksSj1vLmRhdGEoSSwiaGFuZGxlIil8fG8uZGF0YShJLCJoYW5kbGUiLGZ1bmN0aW9uKCl7cmV0dXJuIHR5cGVvZiBvIT09InVuZGVmaW5lZCImJiFvLmV2ZW50LnRyaWdnZXJlZD9vLmV2ZW50LmhhbmRsZS5hcHBseShhcmd1bWVudHMuY2FsbGVlLmVsZW0sYXJndW1lbnRzKTpnfSk7Si5lbGVtPUk7by5lYWNoKEYuc3BsaXQoL1xzKy8pLGZ1bmN0aW9uKE0sTil7dmFyIE89Ti5zcGxpdCgiLiIpO049Ty5zaGlmdCgpO0gudHlwZT1PLnNsaWNlKCkuc29ydCgpLmpvaW4oIi4iKTt2YXIgTD1FW05dO2lmKG8uZXZlbnQuc3BlY2lhbEFsbFtOXSl7by5ldmVudC5zcGVjaWFsQWxsW05dLnNldHVwLmNhbGwoSSxLLE8pfWlmKCFMKXtMPUVbTl09e307aWYoIW8uZXZlbnQuc3BlY2lhbFtOXXx8by5ldmVudC5zcGVjaWFsW05dLnNldHVwLmNhbGwoSSxLLE8pPT09ZmFsc2Upe2lmKEkuYWRkRXZlbnRMaXN0ZW5lcil7SS5hZGRFdmVudExpc3RlbmVyKE4sSixmYWxzZSl9ZWxzZXtpZihJLmF0dGFjaEV2ZW50KXtJLmF0dGFjaEV2ZW50KCJvbiIrTixKKX19fX1MW0guZ3VpZF09SDtvLmV2ZW50Lmdsb2JhbFtOXT10cnVlfSk7ST1udWxsfSxndWlkOjEsZ2xvYmFsOnt9LHJlbW92ZTpmdW5jdGlvbihLLEgsSil7aWYoSy5ub2RlVHlwZT09M3x8Sy5ub2RlVHlwZT09OCl7cmV0dXJufXZhciBHPW8uZGF0YShLLCJldmVudHMiKSxGLEU7aWYoRyl7aWYoSD09PWd8fCh0eXBlb2YgSD09PSJzdHJpbmciJiZILmNoYXJBdCgwKT09Ii4iKSl7Zm9yKHZhciBJIGluIEcpe3RoaXMucmVtb3ZlKEssSSsoSHx8IiIpKX19ZWxzZXtpZihILnR5cGUpe0o9SC5oYW5kbGVyO0g9SC50eXBlfW8uZWFjaChILnNwbGl0KC9ccysvKSxmdW5jdGlvbihNLE8pe3ZhciBRPU8uc3BsaXQoIi4iKTtPPVEuc2hpZnQoKTt2YXIgTj1SZWdFeHAoIihefFxcLikiK1Euc2xpY2UoKS5zb3J0KCkuam9pbigiLipcXC4iKSsiKFxcLnwkKSIpO2lmKEdbT10pe2lmKEope2RlbGV0ZSBHW09dW0ouZ3VpZF19ZWxzZXtmb3IodmFyIFAgaW4gR1tPXSl7aWYoTi50ZXN0KEdbT11bUF0udHlwZSkpe2RlbGV0ZSBHW09dW1BdfX19aWYoby5ldmVudC5zcGVjaWFsQWxsW09dKXtvLmV2ZW50LnNwZWNpYWxBbGxbT10udGVhcmRvd24uY2FsbChLLFEpfWZvcihGIGluIEdbT10pe2JyZWFrfWlmKCFGKXtpZighby5ldmVudC5zcGVjaWFsW09dfHxvLmV2ZW50LnNwZWNpYWxbT10udGVhcmRvd24uY2FsbChLLFEpPT09ZmFsc2Upe2lmKEsucmVtb3ZlRXZlbnRMaXN0ZW5lcil7Sy5yZW1vdmVFdmVudExpc3RlbmVyKE8sby5kYXRhKEssImhhbmRsZSIpLGZhbHNlKX1lbHNle2lmKEsuZGV0YWNoRXZlbnQpe0suZGV0YWNoRXZlbnQoIm9uIitPLG8uZGF0YShLLCJoYW5kbGUiKSl9fX1GPW51bGw7ZGVsZXRlIEdbT119fX0pfWZvcihGIGluIEcpe2JyZWFrfWlmKCFGKXt2YXIgTD1vLmRhdGEoSywiaGFuZGxlIik7aWYoTCl7TC5lbGVtPW51bGx9by5yZW1vdmVEYXRhKEssImV2ZW50cyIpO28ucmVtb3ZlRGF0YShLLCJoYW5kbGUiKX19fSx0cmlnZ2VyOmZ1bmN0aW9uKEksSyxILEUpe3ZhciBHPUkudHlwZXx8STtpZighRSl7ST10eXBlb2YgST09PSJvYmplY3QiP0lbaF0/STpvLmV4dGVuZChvLkV2ZW50KEcpLEkpOm8uRXZlbnQoRyk7aWYoRy5pbmRleE9mKCIhIik+PTApe0kudHlwZT1HPUcuc2xpY2UoMCwtMSk7SS5leGNsdXNpdmU9dHJ1ZX1pZighSCl7SS5zdG9wUHJvcGFnYXRpb24oKTtpZih0aGlzLmdsb2JhbFtHXSl7by5lYWNoKG8uY2FjaGUsZnVuY3Rpb24oKXtpZih0aGlzLmV2ZW50cyYmdGhpcy5ldmVudHNbR10pe28uZXZlbnQudHJpZ2dlcihJLEssdGhpcy5oYW5kbGUuZWxlbSl9fSl9fWlmKCFIfHxILm5vZGVUeXBlPT0zfHxILm5vZGVUeXBlPT04KXtyZXR1cm4gZ31JLnJlc3VsdD1nO0kudGFyZ2V0PUg7Sz1vLm1ha2VBcnJheShLKTtLLnVuc2hpZnQoSSl9SS5jdXJyZW50VGFyZ2V0PUg7dmFyIEo9by5kYXRhKEgsImhhbmRsZSIpO2lmKEope0ouYXBwbHkoSCxLKX1pZigoIUhbR118fChvLm5vZGVOYW1lKEgsImEiKSYmRz09ImNsaWNrIikpJiZIWyJvbiIrR10mJkhbIm9uIitHXS5hcHBseShILEspPT09ZmFsc2Upe0kucmVzdWx0PWZhbHNlfWlmKCFFJiZIW0ddJiYhSS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmIShvLm5vZGVOYW1lKEgsImEiKSYmRz09ImNsaWNrIikpe3RoaXMudHJpZ2dlcmVkPXRydWU7dHJ5e0hbR10oKX1jYXRjaChMKXt9fXRoaXMudHJpZ2dlcmVkPWZhbHNlO2lmKCFJLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpe3ZhciBGPUgucGFyZW50Tm9kZXx8SC5vd25lckRvY3VtZW50O2lmKEYpe28uZXZlbnQudHJpZ2dlcihJLEssRix0cnVlKX19fSxoYW5kbGU6ZnVuY3Rpb24oSyl7dmFyIEosRTtLPWFyZ3VtZW50c1swXT1vLmV2ZW50LmZpeChLfHxsLmV2ZW50KTtLLmN1cnJlbnRUYXJnZXQ9dGhpczt2YXIgTD1LLnR5cGUuc3BsaXQoIi4iKTtLLnR5cGU9TC5zaGlmdCgpO0o9IUwubGVuZ3RoJiYhSy5leGNsdXNpdmU7dmFyIEk9UmVnRXhwKCIoXnxcXC4pIitMLnNsaWNlKCkuc29ydCgpLmpvaW4oIi4qXFwuIikrIihcXC58JCkiKTtFPShvLmRhdGEodGhpcywiZXZlbnRzIil8fHt9KVtLLnR5cGVdO2Zvcih2YXIgRyBpbiBFKXt2YXIgSD1FW0ddO2lmKEp8fEkudGVzdChILnR5cGUpKXtLLmhhbmRsZXI9SDtLLmRhdGE9SC5kYXRhO3ZhciBGPUguYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKEYhPT1nKXtLLnJlc3VsdD1GO2lmKEY9PT1mYWxzZSl7Sy5wcmV2ZW50RGVmYXVsdCgpO0suc3RvcFByb3BhZ2F0aW9uKCl9fWlmKEsuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSl7YnJlYWt9fX19LHByb3BzOiJhbHRLZXkgYXR0ckNoYW5nZSBhdHRyTmFtZSBidWJibGVzIGJ1dHRvbiBjYW5jZWxhYmxlIGNoYXJDb2RlIGNsaWVudFggY2xpZW50WSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZGF0YSBkZXRhaWwgZXZlbnRQaGFzZSBmcm9tRWxlbWVudCBoYW5kbGVyIGtleUNvZGUgbWV0YUtleSBuZXdWYWx1ZSBvcmlnaW5hbFRhcmdldCBwYWdlWCBwYWdlWSBwcmV2VmFsdWUgcmVsYXRlZE5vZGUgcmVsYXRlZFRhcmdldCBzY3JlZW5YIHNjcmVlblkgc2hpZnRLZXkgc3JjRWxlbWVudCB0YXJnZXQgdG9FbGVtZW50IHZpZXcgd2hlZWxEZWx0YSB3aGljaCIuc3BsaXQoIiAiKSxmaXg6ZnVuY3Rpb24oSCl7aWYoSFtoXSl7cmV0dXJuIEh9dmFyIEY9SDtIPW8uRXZlbnQoRik7Zm9yKHZhciBHPXRoaXMucHJvcHMubGVuZ3RoLEo7Rzspe0o9dGhpcy5wcm9wc1stLUddO0hbSl09RltKXX1pZighSC50YXJnZXQpe0gudGFyZ2V0PUguc3JjRWxlbWVudHx8ZG9jdW1lbnR9aWYoSC50YXJnZXQubm9kZVR5cGU9PTMpe0gudGFyZ2V0PUgudGFyZ2V0LnBhcmVudE5vZGV9aWYoIUgucmVsYXRlZFRhcmdldCYmSC5mcm9tRWxlbWVudCl7SC5yZWxhdGVkVGFyZ2V0PUguZnJvbUVsZW1lbnQ9PUgudGFyZ2V0P0gudG9FbGVtZW50OkguZnJvbUVsZW1lbnR9aWYoSC5wYWdlWD09bnVsbCYmSC5jbGllbnRYIT1udWxsKXt2YXIgST1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsRT1kb2N1bWVudC5ib2R5O0gucGFnZVg9SC5jbGllbnRYKyhJJiZJLnNjcm9sbExlZnR8fEUmJkUuc2Nyb2xsTGVmdHx8MCktKEkuY2xpZW50TGVmdHx8MCk7SC5wYWdlWT1ILmNsaWVudFkrKEkmJkkuc2Nyb2xsVG9wfHxFJiZFLnNjcm9sbFRvcHx8MCktKEkuY2xpZW50VG9wfHwwKX1pZighSC53aGljaCYmKChILmNoYXJDb2RlfHxILmNoYXJDb2RlPT09MCk/SC5jaGFyQ29kZTpILmtleUNvZGUpKXtILndoaWNoPUguY2hhckNvZGV8fEgua2V5Q29kZX1pZighSC5tZXRhS2V5JiZILmN0cmxLZXkpe0gubWV0YUtleT1ILmN0cmxLZXl9aWYoIUgud2hpY2gmJkguYnV0dG9uKXtILndoaWNoPShILmJ1dHRvbiYxPzE6KEguYnV0dG9uJjI/MzooSC5idXR0b24mND8yOjApKSl9cmV0dXJuIEh9LHByb3h5OmZ1bmN0aW9uKEYsRSl7RT1FfHxmdW5jdGlvbigpe3JldHVybiBGLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07RS5ndWlkPUYuZ3VpZD1GLmd1aWR8fEUuZ3VpZHx8dGhpcy5ndWlkKys7cmV0dXJuIEV9LHNwZWNpYWw6e3JlYWR5OntzZXR1cDpCLHRlYXJkb3duOmZ1bmN0aW9uKCl7fX19LHNwZWNpYWxBbGw6e2xpdmU6e3NldHVwOmZ1bmN0aW9uKEUsRil7by5ldmVudC5hZGQodGhpcyxGWzBdLGMpfSx0ZWFyZG93bjpmdW5jdGlvbihHKXtpZihHLmxlbmd0aCl7dmFyIEU9MCxGPVJlZ0V4cCgiKF58XFwuKSIrR1swXSsiKFxcLnwkKSIpO28uZWFjaCgoby5kYXRhKHRoaXMsImV2ZW50cyIpLmxpdmV8fHt9KSxmdW5jdGlvbigpe2lmKEYudGVzdCh0aGlzLnR5cGUpKXtFKyt9fSk7aWYoRTwxKXtvLmV2ZW50LnJlbW92ZSh0aGlzLEdbMF0sYyl9fX19fX07by5FdmVudD1mdW5jdGlvbihFKXtpZighdGhpcy5wcmV2ZW50RGVmYXVsdCl7cmV0dXJuIG5ldyBvLkV2ZW50KEUpfWlmKEUmJkUudHlwZSl7dGhpcy5vcmlnaW5hbEV2ZW50PUU7dGhpcy50eXBlPUUudHlwZX1lbHNle3RoaXMudHlwZT1FfXRoaXMudGltZVN0YW1wPWUoKTt0aGlzW2hdPXRydWV9O2Z1bmN0aW9uIGsoKXtyZXR1cm4gZmFsc2V9ZnVuY3Rpb24gdSgpe3JldHVybiB0cnVlfW8uRXZlbnQucHJvdG90eXBlPXtwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPXU7dmFyIEU9dGhpcy5vcmlnaW5hbEV2ZW50O2lmKCFFKXtyZXR1cm59aWYoRS5wcmV2ZW50RGVmYXVsdCl7RS5wcmV2ZW50RGVmYXVsdCgpfUUucmV0dXJuVmFsdWU9ZmFsc2V9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9dTt2YXIgRT10aGlzLm9yaWdpbmFsRXZlbnQ7aWYoIUUpe3JldHVybn1pZihFLnN0b3BQcm9wYWdhdGlvbil7RS5zdG9wUHJvcGFnYXRpb24oKX1FLmNhbmNlbEJ1YmJsZT10cnVlfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPXU7dGhpcy5zdG9wUHJvcGFnYXRpb24oKX0saXNEZWZhdWx0UHJldmVudGVkOmssaXNQcm9wYWdhdGlvblN0b3BwZWQ6ayxpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDprfTt2YXIgYT1mdW5jdGlvbihGKXt2YXIgRT1GLnJlbGF0ZWRUYXJnZXQ7d2hpbGUoRSYmRSE9dGhpcyl7dHJ5e0U9RS5wYXJlbnROb2RlfWNhdGNoKEcpe0U9dGhpc319aWYoRSE9dGhpcyl7Ri50eXBlPUYuZGF0YTtvLmV2ZW50LmhhbmRsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fTtvLmVhY2goe21vdXNlb3ZlcjoibW91c2VlbnRlciIsbW91c2VvdXQ6Im1vdXNlbGVhdmUifSxmdW5jdGlvbihGLEUpe28uZXZlbnQuc3BlY2lhbFtFXT17c2V0dXA6ZnVuY3Rpb24oKXtvLmV2ZW50LmFkZCh0aGlzLEYsYSxFKX0sdGVhcmRvd246ZnVuY3Rpb24oKXtvLmV2ZW50LnJlbW92ZSh0aGlzLEYsYSl9fX0pO28uZm4uZXh0ZW5kKHtiaW5kOmZ1bmN0aW9uKEYsRyxFKXtyZXR1cm4gRj09InVubG9hZCI/dGhpcy5vbmUoRixHLEUpOnRoaXMuZWFjaChmdW5jdGlvbigpe28uZXZlbnQuYWRkKHRoaXMsRixFfHxHLEUmJkcpfSl9LG9uZTpmdW5jdGlvbihHLEgsRil7dmFyIEU9by5ldmVudC5wcm94eShGfHxILGZ1bmN0aW9uKEkpe28odGhpcykudW5iaW5kKEksRSk7cmV0dXJuKEZ8fEgpLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtvLmV2ZW50LmFkZCh0aGlzLEcsRSxGJiZIKX0pfSx1bmJpbmQ6ZnVuY3Rpb24oRixFKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7by5ldmVudC5yZW1vdmUodGhpcyxGLEUpfSl9LHRyaWdnZXI6ZnVuY3Rpb24oRSxGKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7by5ldmVudC50cmlnZ2VyKEUsRix0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihFLEcpe2lmKHRoaXNbMF0pe3ZhciBGPW8uRXZlbnQoRSk7Ri5wcmV2ZW50RGVmYXVsdCgpO0Yuc3RvcFByb3BhZ2F0aW9uKCk7by5ldmVudC50cmlnZ2VyKEYsRyx0aGlzWzBdKTtyZXR1cm4gRi5yZXN1bHR9fSx0b2dnbGU6ZnVuY3Rpb24oRyl7dmFyIEU9YXJndW1lbnRzLEY9MTt3aGlsZShGPEUubGVuZ3RoKXtvLmV2ZW50LnByb3h5KEcsRVtGKytdKX1yZXR1cm4gdGhpcy5jbGljayhvLmV2ZW50LnByb3h5KEcsZnVuY3Rpb24oSCl7dGhpcy5sYXN0VG9nZ2xlPSh0aGlzLmxhc3RUb2dnbGV8fDApJUY7SC5wcmV2ZW50RGVmYXVsdCgpO3JldHVybiBFW3RoaXMubGFzdFRvZ2dsZSsrXS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fGZhbHNlfSkpfSxob3ZlcjpmdW5jdGlvbihFLEYpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoRSkubW91c2VsZWF2ZShGKX0scmVhZHk6ZnVuY3Rpb24oRSl7QigpO2lmKG8uaXNSZWFkeSl7RS5jYWxsKGRvY3VtZW50LG8pfWVsc2V7by5yZWFkeUxpc3QucHVzaChFKX1yZXR1cm4gdGhpc30sbGl2ZTpmdW5jdGlvbihHLEYpe3ZhciBFPW8uZXZlbnQucHJveHkoRik7RS5ndWlkKz10aGlzLnNlbGVjdG9yK0c7byhkb2N1bWVudCkuYmluZChpKEcsdGhpcy5zZWxlY3RvciksdGhpcy5zZWxlY3RvcixFKTtyZXR1cm4gdGhpc30sZGllOmZ1bmN0aW9uKEYsRSl7byhkb2N1bWVudCkudW5iaW5kKGkoRix0aGlzLnNlbGVjdG9yKSxFP3tndWlkOkUuZ3VpZCt0aGlzLnNlbGVjdG9yK0Z9Om51bGwpO3JldHVybiB0aGlzfX0pO2Z1bmN0aW9uIGMoSCl7dmFyIEU9UmVnRXhwKCIoXnxcXC4pIitILnR5cGUrIihcXC58JCkiKSxHPXRydWUsRj1bXTtvLmVhY2goby5kYXRhKHRoaXMsImV2ZW50cyIpLmxpdmV8fFtdLGZ1bmN0aW9uKEksSil7aWYoRS50ZXN0KEoudHlwZSkpe3ZhciBLPW8oSC50YXJnZXQpLmNsb3Nlc3QoSi5kYXRhKVswXTtpZihLKXtGLnB1c2goe2VsZW06SyxmbjpKfSl9fX0pO0Yuc29ydChmdW5jdGlvbihKLEkpe3JldHVybiBvLmRhdGEoSi5lbGVtLCJjbG9zZXN0Iiktby5kYXRhKEkuZWxlbSwiY2xvc2VzdCIpfSk7by5lYWNoKEYsZnVuY3Rpb24oKXtpZih0aGlzLmZuLmNhbGwodGhpcy5lbGVtLEgsdGhpcy5mbi5kYXRhKT09PWZhbHNlKXtyZXR1cm4oRz1mYWxzZSl9fSk7cmV0dXJuIEd9ZnVuY3Rpb24gaShGLEUpe3JldHVyblsibGl2ZSIsRixFLnJlcGxhY2UoL1wuL2csImAiKS5yZXBsYWNlKC8gL2csInwiKV0uam9pbigiLiIpfW8uZXh0ZW5kKHtpc1JlYWR5OmZhbHNlLHJlYWR5TGlzdDpbXSxyZWFkeTpmdW5jdGlvbigpe2lmKCFvLmlzUmVhZHkpe28uaXNSZWFkeT10cnVlO2lmKG8ucmVhZHlMaXN0KXtvLmVhY2goby5yZWFkeUxpc3QsZnVuY3Rpb24oKXt0aGlzLmNhbGwoZG9jdW1lbnQsbyl9KTtvLnJlYWR5TGlzdD1udWxsfW8oZG9jdW1lbnQpLnRyaWdnZXJIYW5kbGVyKCJyZWFkeSIpfX19KTt2YXIgeD1mYWxzZTtmdW5jdGlvbiBCKCl7aWYoeCl7cmV0dXJufXg9dHJ1ZTtpZihkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKXtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixmdW5jdGlvbigpe2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLGFyZ3VtZW50cy5jYWxsZWUsZmFsc2UpO28ucmVhZHkoKX0sZmFsc2UpfWVsc2V7aWYoZG9jdW1lbnQuYXR0YWNoRXZlbnQpe2RvY3VtZW50LmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLGZ1bmN0aW9uKCl7aWYoZG9jdW1lbnQucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSIpe2RvY3VtZW50LmRldGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLGFyZ3VtZW50cy5jYWxsZWUpO28ucmVhZHkoKX19KTtpZihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwmJmw9PWwudG9wKXsoZnVuY3Rpb24oKXtpZihvLmlzUmVhZHkpe3JldHVybn10cnl7ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsKCJsZWZ0Iil9Y2F0Y2goRSl7c2V0VGltZW91dChhcmd1bWVudHMuY2FsbGVlLDApO3JldHVybn1vLnJlYWR5KCl9KSgpfX19by5ldmVudC5hZGQobCwibG9hZCIsby5yZWFkeSl9by5lYWNoKCgiYmx1cixmb2N1cyxsb2FkLHJlc2l6ZSxzY3JvbGwsdW5sb2FkLGNsaWNrLGRibGNsaWNrLG1vdXNlZG93bixtb3VzZXVwLG1vdXNlbW92ZSxtb3VzZW92ZXIsbW91c2VvdXQsbW91c2VlbnRlcixtb3VzZWxlYXZlLGNoYW5nZSxzZWxlY3Qsc3VibWl0LGtleWRvd24sa2V5cHJlc3Msa2V5dXAsZXJyb3IiKS5zcGxpdCgiLCIpLGZ1bmN0aW9uKEYsRSl7by5mbltFXT1mdW5jdGlvbihHKXtyZXR1cm4gRz90aGlzLmJpbmQoRSxHKTp0aGlzLnRyaWdnZXIoRSl9fSk7byhsKS5iaW5kKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7Zm9yKHZhciBFIGluIG8uY2FjaGUpe2lmKEUhPTEmJm8uY2FjaGVbRV0uaGFuZGxlKXtvLmV2ZW50LnJlbW92ZShvLmNhY2hlW0VdLmhhbmRsZS5lbGVtKX19fSk7KGZ1bmN0aW9uKCl7by5zdXBwb3J0PXt9O3ZhciBGPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxHPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLEs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksSj0ic2NyaXB0IisobmV3IERhdGUpLmdldFRpbWUoKTtLLnN0eWxlLmRpc3BsYXk9Im5vbmUiO0suaW5uZXJIVE1MPScgICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0iL2EiIHN0eWxlPSJjb2xvcjpyZWQ7ZmxvYXQ6bGVmdDtvcGFjaXR5Oi41OyI+YTwvYT48c2VsZWN0PjxvcHRpb24+dGV4dDwvb3B0aW9uPjwvc2VsZWN0PjxvYmplY3Q+PHBhcmFtLz48L29iamVjdD4nO3ZhciBIPUsuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSxFPUsuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXTtpZighSHx8IUgubGVuZ3RofHwhRSl7cmV0dXJufW8uc3VwcG9ydD17bGVhZGluZ1doaXRlc3BhY2U6Sy5maXJzdENoaWxkLm5vZGVUeXBlPT0zLHRib2R5OiFLLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpLmxlbmd0aCxvYmplY3RBbGw6ISFLLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aCxodG1sU2VyaWFsaXplOiEhSy5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCxzdHlsZTovcmVkLy50ZXN0KEUuZ2V0QXR0cmlidXRlKCJzdHlsZSIpKSxocmVmTm9ybWFsaXplZDpFLmdldEF0dHJpYnV0ZSgiaHJlZiIpPT09Ii9hIixvcGFjaXR5OkUuc3R5bGUub3BhY2l0eT09PSIwLjUiLGNzc0Zsb2F0OiEhRS5zdHlsZS5jc3NGbG9hdCxzY3JpcHRFdmFsOmZhbHNlLG5vQ2xvbmVFdmVudDp0cnVlLGJveE1vZGVsOm51bGx9O0cudHlwZT0idGV4dC9qYXZhc2NyaXB0Ijt0cnl7Ry5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgid2luZG93LiIrSisiPTE7IikpfWNhdGNoKEkpe31GLmluc2VydEJlZm9yZShHLEYuZmlyc3RDaGlsZCk7aWYobFtKXSl7by5zdXBwb3J0LnNjcmlwdEV2YWw9dHJ1ZTtkZWxldGUgbFtKXX1GLnJlbW92ZUNoaWxkKEcpO2lmKEsuYXR0YWNoRXZlbnQmJksuZmlyZUV2ZW50KXtLLmF0dGFjaEV2ZW50KCJvbmNsaWNrIixmdW5jdGlvbigpe28uc3VwcG9ydC5ub0Nsb25lRXZlbnQ9ZmFsc2U7Sy5kZXRhY2hFdmVudCgib25jbGljayIsYXJndW1lbnRzLmNhbGxlZSl9KTtLLmNsb25lTm9kZSh0cnVlKS5maXJlRXZlbnQoIm9uY2xpY2siKX1vKGZ1bmN0aW9uKCl7dmFyIEw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7TC5zdHlsZS53aWR0aD1MLnN0eWxlLnBhZGRpbmdMZWZ0PSIxcHgiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoTCk7by5ib3hNb2RlbD1vLnN1cHBvcnQuYm94TW9kZWw9TC5vZmZzZXRXaWR0aD09PTI7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChMKS5zdHlsZS5kaXNwbGF5PSJub25lIn0pfSkoKTt2YXIgdz1vLnN1cHBvcnQuY3NzRmxvYXQ/ImNzc0Zsb2F0Ijoic3R5bGVGbG9hdCI7by5wcm9wcz17ImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSIsImZsb2F0Ijp3LGNzc0Zsb2F0Oncsc3R5bGVGbG9hdDp3LHJlYWRvbmx5OiJyZWFkT25seSIsbWF4bGVuZ3RoOiJtYXhMZW5ndGgiLGNlbGxzcGFjaW5nOiJjZWxsU3BhY2luZyIscm93c3Bhbjoicm93U3BhbiIsdGFiaW5kZXg6InRhYkluZGV4In07by5mbi5leHRlbmQoe19sb2FkOm8uZm4ubG9hZCxsb2FkOmZ1bmN0aW9uKEcsSixLKXtpZih0eXBlb2YgRyE9PSJzdHJpbmciKXtyZXR1cm4gdGhpcy5fbG9hZChHKX12YXIgST1HLmluZGV4T2YoIiAiKTtpZihJPj0wKXt2YXIgRT1HLnNsaWNlKEksRy5sZW5ndGgpO0c9Ry5zbGljZSgwLEkpfXZhciBIPSJHRVQiO2lmKEope2lmKG8uaXNGdW5jdGlvbihKKSl7Sz1KO0o9bnVsbH1lbHNle2lmKHR5cGVvZiBKPT09Im9iamVjdCIpe0o9by5wYXJhbShKKTtIPSJQT1NUIn19fXZhciBGPXRoaXM7by5hamF4KHt1cmw6Ryx0eXBlOkgsZGF0YVR5cGU6Imh0bWwiLGRhdGE6Sixjb21wbGV0ZTpmdW5jdGlvbihNLEwpe2lmKEw9PSJzdWNjZXNzInx8TD09Im5vdG1vZGlmaWVkIil7Ri5odG1sKEU/bygiPGRpdi8+IikuYXBwZW5kKE0ucmVzcG9uc2VUZXh0LnJlcGxhY2UoLzxzY3JpcHQoLnxccykqP1wvc2NyaXB0Pi9nLCIiKSkuZmluZChFKTpNLnJlc3BvbnNlVGV4dCl9aWYoSyl7Ri5lYWNoKEssW00ucmVzcG9uc2VUZXh0LEwsTV0pfX19KTtyZXR1cm4gdGhpc30sc2VyaWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIG8ucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50cz9vLm1ha2VBcnJheSh0aGlzLmVsZW1lbnRzKTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmFtZSYmIXRoaXMuZGlzYWJsZWQmJih0aGlzLmNoZWNrZWR8fC9zZWxlY3R8dGV4dGFyZWEvaS50ZXN0KHRoaXMubm9kZU5hbWUpfHwvdGV4dHxoaWRkZW58cGFzc3dvcmR8c2VhcmNoL2kudGVzdCh0aGlzLnR5cGUpKX0pLm1hcChmdW5jdGlvbihFLEYpe3ZhciBHPW8odGhpcykudmFsKCk7cmV0dXJuIEc9PW51bGw/bnVsbDpvLmlzQXJyYXkoRyk/by5tYXAoRyxmdW5jdGlvbihJLEgpe3JldHVybntuYW1lOkYubmFtZSx2YWx1ZTpJfX0pOntuYW1lOkYubmFtZSx2YWx1ZTpHfX0pLmdldCgpfX0pO28uZWFjaCgiYWpheFN0YXJ0LGFqYXhTdG9wLGFqYXhDb21wbGV0ZSxhamF4RXJyb3IsYWpheFN1Y2Nlc3MsYWpheFNlbmQiLnNwbGl0KCIsIiksZnVuY3Rpb24oRSxGKXtvLmZuW0ZdPWZ1bmN0aW9uKEcpe3JldHVybiB0aGlzLmJpbmQoRixHKX19KTt2YXIgcj1lKCk7by5leHRlbmQoe2dldDpmdW5jdGlvbihFLEcsSCxGKXtpZihvLmlzRnVuY3Rpb24oRykpe0g9RztHPW51bGx9cmV0dXJuIG8uYWpheCh7dHlwZToiR0VUIix1cmw6RSxkYXRhOkcsc3VjY2VzczpILGRhdGFUeXBlOkZ9KX0sZ2V0U2NyaXB0OmZ1bmN0aW9uKEUsRil7cmV0dXJuIG8uZ2V0KEUsbnVsbCxGLCJzY3JpcHQiKX0sZ2V0SlNPTjpmdW5jdGlvbihFLEYsRyl7cmV0dXJuIG8uZ2V0KEUsRixHLCJqc29uIil9LHBvc3Q6ZnVuY3Rpb24oRSxHLEgsRil7aWYoby5pc0Z1bmN0aW9uKEcpKXtIPUc7Rz17fX1yZXR1cm4gby5hamF4KHt0eXBlOiJQT1NUIix1cmw6RSxkYXRhOkcsc3VjY2VzczpILGRhdGFUeXBlOkZ9KX0sYWpheFNldHVwOmZ1bmN0aW9uKEUpe28uZXh0ZW5kKG8uYWpheFNldHRpbmdzLEUpfSxhamF4U2V0dGluZ3M6e3VybDpsb2NhdGlvbi5ocmVmLGdsb2JhbDp0cnVlLHR5cGU6IkdFVCIsY29udGVudFR5cGU6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIscHJvY2Vzc0RhdGE6dHJ1ZSxhc3luYzp0cnVlLHhocjpmdW5jdGlvbigpe3JldHVybiBsLkFjdGl2ZVhPYmplY3Q/bmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIik6bmV3IFhNTEh0dHBSZXF1ZXN0KCl9LGFjY2VwdHM6e3htbDoiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsaHRtbDoidGV4dC9odG1sIixzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0Iix0ZXh0OiJ0ZXh0L3BsYWluIixfZGVmYXVsdDoiKi8qIn19LGxhc3RNb2RpZmllZDp7fSxhamF4OmZ1bmN0aW9uKE0pe009by5leHRlbmQodHJ1ZSxNLG8uZXh0ZW5kKHRydWUse30sby5hamF4U2V0dGluZ3MsTSkpO3ZhciBXLEY9Lz1cPygmfCQpL2csUixWLEc9TS50eXBlLnRvVXBwZXJDYXNlKCk7aWYoTS5kYXRhJiZNLnByb2Nlc3NEYXRhJiZ0eXBlb2YgTS5kYXRhIT09InN0cmluZyIpe00uZGF0YT1vLnBhcmFtKE0uZGF0YSl9aWYoTS5kYXRhVHlwZT09Impzb25wIil7aWYoRz09IkdFVCIpe2lmKCFNLnVybC5tYXRjaChGKSl7TS51cmwrPShNLnVybC5tYXRjaCgvXD8vKT8iJiI6Ij8iKSsoTS5qc29ucHx8ImNhbGxiYWNrIikrIj0/In19ZWxzZXtpZighTS5kYXRhfHwhTS5kYXRhLm1hdGNoKEYpKXtNLmRhdGE9KE0uZGF0YT9NLmRhdGErIiYiOiIiKSsoTS5qc29ucHx8ImNhbGxiYWNrIikrIj0/In19TS5kYXRhVHlwZT0ianNvbiJ9aWYoTS5kYXRhVHlwZT09Impzb24iJiYoTS5kYXRhJiZNLmRhdGEubWF0Y2goRil8fE0udXJsLm1hdGNoKEYpKSl7Vz0ianNvbnAiK3IrKztpZihNLmRhdGEpe00uZGF0YT0oTS5kYXRhKyIiKS5yZXBsYWNlKEYsIj0iK1crIiQxIil9TS51cmw9TS51cmwucmVwbGFjZShGLCI9IitXKyIkMSIpO00uZGF0YVR5cGU9InNjcmlwdCI7bFtXXT1mdW5jdGlvbihYKXtWPVg7SSgpO0woKTtsW1ddPWc7dHJ5e2RlbGV0ZSBsW1ddfWNhdGNoKFkpe31pZihIKXtILnJlbW92ZUNoaWxkKFQpfX19aWYoTS5kYXRhVHlwZT09InNjcmlwdCImJk0uY2FjaGU9PW51bGwpe00uY2FjaGU9ZmFsc2V9aWYoTS5jYWNoZT09PWZhbHNlJiZHPT0iR0VUIil7dmFyIEU9ZSgpO3ZhciBVPU0udXJsLnJlcGxhY2UoLyhcP3wmKV89Lio/KCZ8JCkvLCIkMV89IitFKyIkMiIpO00udXJsPVUrKChVPT1NLnVybCk/KE0udXJsLm1hdGNoKC9cPy8pPyImIjoiPyIpKyJfPSIrRToiIil9aWYoTS5kYXRhJiZHPT0iR0VUIil7TS51cmwrPShNLnVybC5tYXRjaCgvXD8vKT8iJiI6Ij8iKStNLmRhdGE7TS5kYXRhPW51bGx9aWYoTS5nbG9iYWwmJiFvLmFjdGl2ZSsrKXtvLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpfXZhciBRPS9eKFx3KzopP1wvXC8oW15cLz8jXSspLy5leGVjKE0udXJsKTtpZihNLmRhdGFUeXBlPT0ic2NyaXB0IiYmRz09IkdFVCImJlEmJihRWzFdJiZRWzFdIT1sb2NhdGlvbi5wcm90b2NvbHx8UVsyXSE9bG9jYXRpb24uaG9zdCkpe3ZhciBIPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF07dmFyIFQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7VC5zcmM9TS51cmw7aWYoTS5zY3JpcHRDaGFyc2V0KXtULmNoYXJzZXQ9TS5zY3JpcHRDaGFyc2V0fWlmKCFXKXt2YXIgTz1mYWxzZTtULm9ubG9hZD1ULm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2lmKCFPJiYoIXRoaXMucmVhZHlTdGF0ZXx8dGhpcy5yZWFkeVN0YXRlPT0ibG9hZGVkInx8dGhpcy5yZWFkeVN0YXRlPT0iY29tcGxldGUiKSl7Tz10cnVlO0koKTtMKCk7VC5vbmxvYWQ9VC5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbDtILnJlbW92ZUNoaWxkKFQpfX19SC5hcHBlbmRDaGlsZChUKTtyZXR1cm4gZ312YXIgSz1mYWxzZTt2YXIgSj1NLnhocigpO2lmKE0udXNlcm5hbWUpe0oub3BlbihHLE0udXJsLE0uYXN5bmMsTS51c2VybmFtZSxNLnBhc3N3b3JkKX1lbHNle0oub3BlbihHLE0udXJsLE0uYXN5bmMpfXRyeXtpZihNLmRhdGEpe0ouc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixNLmNvbnRlbnRUeXBlKX1pZihNLmlmTW9kaWZpZWQpe0ouc2V0UmVxdWVzdEhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLG8ubGFzdE1vZGlmaWVkW00udXJsXXx8IlRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDAgR01UIil9Si5zZXRSZXF1ZXN0SGVhZGVyKCJYLVJlcXVlc3RlZC1XaXRoIiwiWE1MSHR0cFJlcXVlc3QiKTtKLnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsTS5kYXRhVHlwZSYmTS5hY2NlcHRzW00uZGF0YVR5cGVdP00uYWNjZXB0c1tNLmRhdGFUeXBlXSsiLCAqLyoiOk0uYWNjZXB0cy5fZGVmYXVsdCl9Y2F0Y2goUyl7fWlmKE0uYmVmb3JlU2VuZCYmTS5iZWZvcmVTZW5kKEosTSk9PT1mYWxzZSl7aWYoTS5nbG9iYWwmJiEtLW8uYWN0aXZlKXtvLmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIil9Si5hYm9ydCgpO3JldHVybiBmYWxzZX1pZihNLmdsb2JhbCl7by5ldmVudC50cmlnZ2VyKCJhamF4U2VuZCIsW0osTV0pfXZhciBOPWZ1bmN0aW9uKFgpe2lmKEoucmVhZHlTdGF0ZT09MCl7aWYoUCl7Y2xlYXJJbnRlcnZhbChQKTtQPW51bGw7aWYoTS5nbG9iYWwmJiEtLW8uYWN0aXZlKXtvLmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIil9fX1lbHNle2lmKCFLJiZKJiYoSi5yZWFkeVN0YXRlPT00fHxYPT0idGltZW91dCIpKXtLPXRydWU7aWYoUCl7Y2xlYXJJbnRlcnZhbChQKTtQPW51bGx9Uj1YPT0idGltZW91dCI/InRpbWVvdXQiOiFvLmh0dHBTdWNjZXNzKEopPyJlcnJvciI6TS5pZk1vZGlmaWVkJiZvLmh0dHBOb3RNb2RpZmllZChKLE0udXJsKT8ibm90bW9kaWZpZWQiOiJzdWNjZXNzIjtpZihSPT0ic3VjY2VzcyIpe3RyeXtWPW8uaHR0cERhdGEoSixNLmRhdGFUeXBlLE0pfWNhdGNoKFope1I9InBhcnNlcmVycm9yIn19aWYoUj09InN1Y2Nlc3MiKXt2YXIgWTt0cnl7WT1KLmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIil9Y2F0Y2goWil7fWlmKE0uaWZNb2RpZmllZCYmWSl7by5sYXN0TW9kaWZpZWRbTS51cmxdPVl9aWYoIVcpe0koKX19ZWxzZXtvLmhhbmRsZUVycm9yKE0sSixSKX1MKCk7aWYoWCl7Si5hYm9ydCgpfWlmKE0uYXN5bmMpe0o9bnVsbH19fX07aWYoTS5hc3luYyl7dmFyIFA9c2V0SW50ZXJ2YWwoTiwxMyk7aWYoTS50aW1lb3V0PjApe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtpZihKJiYhSyl7TigidGltZW91dCIpfX0sTS50aW1lb3V0KX19dHJ5e0ouc2VuZChNLmRhdGEpfWNhdGNoKFMpe28uaGFuZGxlRXJyb3IoTSxKLG51bGwsUyl9aWYoIU0uYXN5bmMpe04oKX1mdW5jdGlvbiBJKCl7aWYoTS5zdWNjZXNzKXtNLnN1Y2Nlc3MoVixSKX1pZihNLmdsb2JhbCl7by5ldmVudC50cmlnZ2VyKCJhamF4U3VjY2VzcyIsW0osTV0pfX1mdW5jdGlvbiBMKCl7aWYoTS5jb21wbGV0ZSl7TS5jb21wbGV0ZShKLFIpfWlmKE0uZ2xvYmFsKXtvLmV2ZW50LnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW0osTV0pfWlmKE0uZ2xvYmFsJiYhLS1vLmFjdGl2ZSl7by5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpfX1yZXR1cm4gSn0saGFuZGxlRXJyb3I6ZnVuY3Rpb24oRixILEUsRyl7aWYoRi5lcnJvcil7Ri5lcnJvcihILEUsRyl9aWYoRi5nbG9iYWwpe28uZXZlbnQudHJpZ2dlcigiYWpheEVycm9yIixbSCxGLEddKX19LGFjdGl2ZTowLGh0dHBTdWNjZXNzOmZ1bmN0aW9uKEYpe3RyeXtyZXR1cm4gIUYuc3RhdHVzJiZsb2NhdGlvbi5wcm90b2NvbD09ImZpbGU6Inx8KEYuc3RhdHVzPj0yMDAmJkYuc3RhdHVzPDMwMCl8fEYuc3RhdHVzPT0zMDR8fEYuc3RhdHVzPT0xMjIzfWNhdGNoKEUpe31yZXR1cm4gZmFsc2V9LGh0dHBOb3RNb2RpZmllZDpmdW5jdGlvbihHLEUpe3RyeXt2YXIgSD1HLmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIik7cmV0dXJuIEcuc3RhdHVzPT0zMDR8fEg9PW8ubGFzdE1vZGlmaWVkW0VdfWNhdGNoKEYpe31yZXR1cm4gZmFsc2V9LGh0dHBEYXRhOmZ1bmN0aW9uKEosSCxHKXt2YXIgRj1KLmdldFJlc3BvbnNlSGVhZGVyKCJjb250ZW50LXR5cGUiKSxFPUg9PSJ4bWwifHwhSCYmRiYmRi5pbmRleE9mKCJ4bWwiKT49MCxJPUU/Si5yZXNwb25zZVhNTDpKLnJlc3BvbnNlVGV4dDtpZihFJiZJLmRvY3VtZW50RWxlbWVudC50YWdOYW1lPT0icGFyc2VyZXJyb3IiKXt0aHJvdyJwYXJzZXJlcnJvciJ9aWYoRyYmRy5kYXRhRmlsdGVyKXtJPUcuZGF0YUZpbHRlcihJLEgpfWlmKHR5cGVvZiBJPT09InN0cmluZyIpe2lmKEg9PSJzY3JpcHQiKXtvLmdsb2JhbEV2YWwoSSl9aWYoSD09Impzb24iKXtJPWxbImV2YWwiXSgiKCIrSSsiKSIpfX1yZXR1cm4gSX0scGFyYW06ZnVuY3Rpb24oRSl7dmFyIEc9W107ZnVuY3Rpb24gSChJLEope0dbRy5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudChJKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KEopfWlmKG8uaXNBcnJheShFKXx8RS5qcXVlcnkpe28uZWFjaChFLGZ1bmN0aW9uKCl7SCh0aGlzLm5hbWUsdGhpcy52YWx1ZSl9KX1lbHNle2Zvcih2YXIgRiBpbiBFKXtpZihvLmlzQXJyYXkoRVtGXSkpe28uZWFjaChFW0ZdLGZ1bmN0aW9uKCl7SChGLHRoaXMpfSl9ZWxzZXtIKEYsby5pc0Z1bmN0aW9uKEVbRl0pP0VbRl0oKTpFW0ZdKX19fXJldHVybiBHLmpvaW4oIiYiKS5yZXBsYWNlKC8lMjAvZywiKyIpfX0pO3ZhciBtPXt9LG4sZD1bWyJoZWlnaHQiLCJtYXJnaW5Ub3AiLCJtYXJnaW5Cb3R0b20iLCJwYWRkaW5nVG9wIiwicGFkZGluZ0JvdHRvbSJdLFsid2lkdGgiLCJtYXJnaW5MZWZ0IiwibWFyZ2luUmlnaHQiLCJwYWRkaW5nTGVmdCIsInBhZGRpbmdSaWdodCJdLFsib3BhY2l0eSJdXTtmdW5jdGlvbiB0KEYsRSl7dmFyIEc9e307by5lYWNoKGQuY29uY2F0LmFwcGx5KFtdLGQuc2xpY2UoMCxFKSksZnVuY3Rpb24oKXtHW3RoaXNdPUZ9KTtyZXR1cm4gR31vLmZuLmV4dGVuZCh7c2hvdzpmdW5jdGlvbihKLEwpe2lmKEope3JldHVybiB0aGlzLmFuaW1hdGUodCgic2hvdyIsMyksSixMKX1lbHNle2Zvcih2YXIgSD0wLEY9dGhpcy5sZW5ndGg7SDxGO0grKyl7dmFyIEU9by5kYXRhKHRoaXNbSF0sIm9sZGRpc3BsYXkiKTt0aGlzW0hdLnN0eWxlLmRpc3BsYXk9RXx8IiI7aWYoby5jc3ModGhpc1tIXSwiZGlzcGxheSIpPT09Im5vbmUiKXt2YXIgRz10aGlzW0hdLnRhZ05hbWUsSztpZihtW0ddKXtLPW1bR119ZWxzZXt2YXIgST1vKCI8IitHKyIgLz4iKS5hcHBlbmRUbygiYm9keSIpO0s9SS5jc3MoImRpc3BsYXkiKTtpZihLPT09Im5vbmUiKXtLPSJibG9jayJ9SS5yZW1vdmUoKTttW0ddPUt9by5kYXRhKHRoaXNbSF0sIm9sZGRpc3BsYXkiLEspfX1mb3IodmFyIEg9MCxGPXRoaXMubGVuZ3RoO0g8RjtIKyspe3RoaXNbSF0uc3R5bGUuZGlzcGxheT1vLmRhdGEodGhpc1tIXSwib2xkZGlzcGxheSIpfHwiIn1yZXR1cm4gdGhpc319LGhpZGU6ZnVuY3Rpb24oSCxJKXtpZihIKXtyZXR1cm4gdGhpcy5hbmltYXRlKHQoImhpZGUiLDMpLEgsSSl9ZWxzZXtmb3IodmFyIEc9MCxGPXRoaXMubGVuZ3RoO0c8RjtHKyspe3ZhciBFPW8uZGF0YSh0aGlzW0ddLCJvbGRkaXNwbGF5Iik7aWYoIUUmJkUhPT0ibm9uZSIpe28uZGF0YSh0aGlzW0ddLCJvbGRkaXNwbGF5IixvLmNzcyh0aGlzW0ddLCJkaXNwbGF5IikpfX1mb3IodmFyIEc9MCxGPXRoaXMubGVuZ3RoO0c8RjtHKyspe3RoaXNbR10uc3R5bGUuZGlzcGxheT0ibm9uZSJ9cmV0dXJuIHRoaXN9fSxfdG9nZ2xlOm8uZm4udG9nZ2xlLHRvZ2dsZTpmdW5jdGlvbihHLEYpe3ZhciBFPXR5cGVvZiBHPT09ImJvb2xlYW4iO3JldHVybiBvLmlzRnVuY3Rpb24oRykmJm8uaXNGdW5jdGlvbihGKT90aGlzLl90b2dnbGUuYXBwbHkodGhpcyxhcmd1bWVudHMpOkc9PW51bGx8fEU/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIEg9RT9HOm8odGhpcykuaXMoIjpoaWRkZW4iKTtvKHRoaXMpW0g/InNob3ciOiJoaWRlIl0oKX0pOnRoaXMuYW5pbWF0ZSh0KCJ0b2dnbGUiLDMpLEcsRil9LGZhZGVUbzpmdW5jdGlvbihFLEcsRil7cmV0dXJuIHRoaXMuYW5pbWF0ZSh7b3BhY2l0eTpHfSxFLEYpfSxhbmltYXRlOmZ1bmN0aW9uKEksRixILEcpe3ZhciBFPW8uc3BlZWQoRixILEcpO3JldHVybiB0aGlzW0UucXVldWU9PT1mYWxzZT8iZWFjaCI6InF1ZXVlIl0oZnVuY3Rpb24oKXt2YXIgSz1vLmV4dGVuZCh7fSxFKSxNLEw9dGhpcy5ub2RlVHlwZT09MSYmbyh0aGlzKS5pcygiOmhpZGRlbiIpLEo9dGhpcztmb3IoTSBpbiBJKXtpZihJW01dPT0iaGlkZSImJkx8fElbTV09PSJzaG93IiYmIUwpe3JldHVybiBLLmNvbXBsZXRlLmNhbGwodGhpcyl9aWYoKE09PSJoZWlnaHQifHxNPT0id2lkdGgiKSYmdGhpcy5zdHlsZSl7Sy5kaXNwbGF5PW8uY3NzKHRoaXMsImRpc3BsYXkiKTtLLm92ZXJmbG93PXRoaXMuc3R5bGUub3ZlcmZsb3d9fWlmKEsub3ZlcmZsb3chPW51bGwpe3RoaXMuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiJ9Sy5jdXJBbmltPW8uZXh0ZW5kKHt9LEkpO28uZWFjaChJLGZ1bmN0aW9uKE8sUyl7dmFyIFI9bmV3IG8uZngoSixLLE8pO2lmKC90b2dnbGV8c2hvd3xoaWRlLy50ZXN0KFMpKXtSW1M9PSJ0b2dnbGUiP0w/InNob3ciOiJoaWRlIjpTXShJKX1lbHNle3ZhciBRPVMudG9TdHJpbmcoKS5tYXRjaCgvXihbKy1dPSk/KFtcZCstLl0rKSguKikkLyksVD1SLmN1cih0cnVlKXx8MDtpZihRKXt2YXIgTj1wYXJzZUZsb2F0KFFbMl0pLFA9UVszXXx8InB4IjtpZihQIT0icHgiKXtKLnN0eWxlW09dPShOfHwxKStQO1Q9KChOfHwxKS9SLmN1cih0cnVlKSkqVDtKLnN0eWxlW09dPVQrUH1pZihRWzFdKXtOPSgoUVsxXT09Ii09Ij8tMToxKSpOKStUfVIuY3VzdG9tKFQsTixQKX1lbHNle1IuY3VzdG9tKFQsUywiIil9fX0pO3JldHVybiB0cnVlfSl9LHN0b3A6ZnVuY3Rpb24oRixFKXt2YXIgRz1vLnRpbWVycztpZihGKXt0aGlzLnF1ZXVlKFtdKX10aGlzLmVhY2goZnVuY3Rpb24oKXtmb3IodmFyIEg9Ry5sZW5ndGgtMTtIPj0wO0gtLSl7aWYoR1tIXS5lbGVtPT10aGlzKXtpZihFKXtHW0hdKHRydWUpfUcuc3BsaWNlKEgsMSl9fX0pO2lmKCFFKXt0aGlzLmRlcXVldWUoKX1yZXR1cm4gdGhpc319KTtvLmVhY2goe3NsaWRlRG93bjp0KCJzaG93IiwxKSxzbGlkZVVwOnQoImhpZGUiLDEpLHNsaWRlVG9nZ2xlOnQoInRvZ2dsZSIsMSksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9fSxmdW5jdGlvbihFLEYpe28uZm5bRV09ZnVuY3Rpb24oRyxIKXtyZXR1cm4gdGhpcy5hbmltYXRlKEYsRyxIKX19KTtvLmV4dGVuZCh7c3BlZWQ6ZnVuY3Rpb24oRyxILEYpe3ZhciBFPXR5cGVvZiBHPT09Im9iamVjdCI/Rzp7Y29tcGxldGU6Rnx8IUYmJkh8fG8uaXNGdW5jdGlvbihHKSYmRyxkdXJhdGlvbjpHLGVhc2luZzpGJiZIfHxIJiYhby5pc0Z1bmN0aW9uKEgpJiZIfTtFLmR1cmF0aW9uPW8uZngub2ZmPzA6dHlwZW9mIEUuZHVyYXRpb249PT0ibnVtYmVyIj9FLmR1cmF0aW9uOm8uZnguc3BlZWRzW0UuZHVyYXRpb25dfHxvLmZ4LnNwZWVkcy5fZGVmYXVsdDtFLm9sZD1FLmNvbXBsZXRlO0UuY29tcGxldGU9ZnVuY3Rpb24oKXtpZihFLnF1ZXVlIT09ZmFsc2Upe28odGhpcykuZGVxdWV1ZSgpfWlmKG8uaXNGdW5jdGlvbihFLm9sZCkpe0Uub2xkLmNhbGwodGhpcyl9fTtyZXR1cm4gRX0sZWFzaW5nOntsaW5lYXI6ZnVuY3Rpb24oRyxILEUsRil7cmV0dXJuIEUrRipHfSxzd2luZzpmdW5jdGlvbihHLEgsRSxGKXtyZXR1cm4oKC1NYXRoLmNvcyhHKk1hdGguUEkpLzIpKzAuNSkqRitFfX0sdGltZXJzOltdLGZ4OmZ1bmN0aW9uKEYsRSxHKXt0aGlzLm9wdGlvbnM9RTt0aGlzLmVsZW09Rjt0aGlzLnByb3A9RztpZighRS5vcmlnKXtFLm9yaWc9e319fX0pO28uZngucHJvdG90eXBlPXt1cGRhdGU6ZnVuY3Rpb24oKXtpZih0aGlzLm9wdGlvbnMuc3RlcCl7dGhpcy5vcHRpb25zLnN0ZXAuY2FsbCh0aGlzLmVsZW0sdGhpcy5ub3csdGhpcyl9KG8uZnguc3RlcFt0aGlzLnByb3BdfHxvLmZ4LnN0ZXAuX2RlZmF1bHQpKHRoaXMpO2lmKCh0aGlzLnByb3A9PSJoZWlnaHQifHx0aGlzLnByb3A9PSJ3aWR0aCIpJiZ0aGlzLmVsZW0uc3R5bGUpe3RoaXMuZWxlbS5zdHlsZS5kaXNwbGF5PSJibG9jayJ9fSxjdXI6ZnVuY3Rpb24oRil7aWYodGhpcy5lbGVtW3RoaXMucHJvcF0hPW51bGwmJighdGhpcy5lbGVtLnN0eWxlfHx0aGlzLmVsZW0uc3R5bGVbdGhpcy5wcm9wXT09bnVsbCkpe3JldHVybiB0aGlzLmVsZW1bdGhpcy5wcm9wXX12YXIgRT1wYXJzZUZsb2F0KG8uY3NzKHRoaXMuZWxlbSx0aGlzLnByb3AsRikpO3JldHVybiBFJiZFPi0xMDAwMD9FOnBhcnNlRmxvYXQoby5jdXJDU1ModGhpcy5lbGVtLHRoaXMucHJvcCkpfHwwfSxjdXN0b206ZnVuY3Rpb24oSSxILEcpe3RoaXMuc3RhcnRUaW1lPWUoKTt0aGlzLnN0YXJ0PUk7dGhpcy5lbmQ9SDt0aGlzLnVuaXQ9R3x8dGhpcy51bml0fHwicHgiO3RoaXMubm93PXRoaXMuc3RhcnQ7dGhpcy5wb3M9dGhpcy5zdGF0ZT0wO3ZhciBFPXRoaXM7ZnVuY3Rpb24gRihKKXtyZXR1cm4gRS5zdGVwKEopfUYuZWxlbT10aGlzLmVsZW07aWYoRigpJiZvLnRpbWVycy5wdXNoKEYpJiYhbil7bj1zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBLPW8udGltZXJzO2Zvcih2YXIgSj0wO0o8Sy5sZW5ndGg7SisrKXtpZighS1tKXSgpKXtLLnNwbGljZShKLS0sMSl9fWlmKCFLLmxlbmd0aCl7Y2xlYXJJbnRlcnZhbChuKTtuPWd9fSwxMyl9fSxzaG93OmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLm9yaWdbdGhpcy5wcm9wXT1vLmF0dHIodGhpcy5lbGVtLnN0eWxlLHRoaXMucHJvcCk7dGhpcy5vcHRpb25zLnNob3c9dHJ1ZTt0aGlzLmN1c3RvbSh0aGlzLnByb3A9PSJ3aWR0aCJ8fHRoaXMucHJvcD09ImhlaWdodCI/MTowLHRoaXMuY3VyKCkpO28odGhpcy5lbGVtKS5zaG93KCl9LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMub3JpZ1t0aGlzLnByb3BdPW8uYXR0cih0aGlzLmVsZW0uc3R5bGUsdGhpcy5wcm9wKTt0aGlzLm9wdGlvbnMuaGlkZT10cnVlO3RoaXMuY3VzdG9tKHRoaXMuY3VyKCksMCl9LHN0ZXA6ZnVuY3Rpb24oSCl7dmFyIEc9ZSgpO2lmKEh8fEc+PXRoaXMub3B0aW9ucy5kdXJhdGlvbit0aGlzLnN0YXJ0VGltZSl7dGhpcy5ub3c9dGhpcy5lbmQ7dGhpcy5wb3M9dGhpcy5zdGF0ZT0xO3RoaXMudXBkYXRlKCk7dGhpcy5vcHRpb25zLmN1ckFuaW1bdGhpcy5wcm9wXT10cnVlO3ZhciBFPXRydWU7Zm9yKHZhciBGIGluIHRoaXMub3B0aW9ucy5jdXJBbmltKXtpZih0aGlzLm9wdGlvbnMuY3VyQW5pbVtGXSE9PXRydWUpe0U9ZmFsc2V9fWlmKEUpe2lmKHRoaXMub3B0aW9ucy5kaXNwbGF5IT1udWxsKXt0aGlzLmVsZW0uc3R5bGUub3ZlcmZsb3c9dGhpcy5vcHRpb25zLm92ZXJmbG93O3RoaXMuZWxlbS5zdHlsZS5kaXNwbGF5PXRoaXMub3B0aW9ucy5kaXNwbGF5O2lmKG8uY3NzKHRoaXMuZWxlbSwiZGlzcGxheSIpPT0ibm9uZSIpe3RoaXMuZWxlbS5zdHlsZS5kaXNwbGF5PSJibG9jayJ9fWlmKHRoaXMub3B0aW9ucy5oaWRlKXtvKHRoaXMuZWxlbSkuaGlkZSgpfWlmKHRoaXMub3B0aW9ucy5oaWRlfHx0aGlzLm9wdGlvbnMuc2hvdyl7Zm9yKHZhciBJIGluIHRoaXMub3B0aW9ucy5jdXJBbmltKXtvLmF0dHIodGhpcy5lbGVtLnN0eWxlLEksdGhpcy5vcHRpb25zLm9yaWdbSV0pfX10aGlzLm9wdGlvbnMuY29tcGxldGUuY2FsbCh0aGlzLmVsZW0pfXJldHVybiBmYWxzZX1lbHNle3ZhciBKPUctdGhpcy5zdGFydFRpbWU7dGhpcy5zdGF0ZT1KL3RoaXMub3B0aW9ucy5kdXJhdGlvbjt0aGlzLnBvcz1vLmVhc2luZ1t0aGlzLm9wdGlvbnMuZWFzaW5nfHwoby5lYXNpbmcuc3dpbmc/InN3aW5nIjoibGluZWFyIildKHRoaXMuc3RhdGUsSiwwLDEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKTt0aGlzLm5vdz10aGlzLnN0YXJ0KygodGhpcy5lbmQtdGhpcy5zdGFydCkqdGhpcy5wb3MpO3RoaXMudXBkYXRlKCl9cmV0dXJuIHRydWV9fTtvLmV4dGVuZChvLmZ4LHtzcGVlZHM6e3Nsb3c6NjAwLGZhc3Q6MjAwLF9kZWZhdWx0OjQwMH0sc3RlcDp7b3BhY2l0eTpmdW5jdGlvbihFKXtvLmF0dHIoRS5lbGVtLnN0eWxlLCJvcGFjaXR5IixFLm5vdyl9LF9kZWZhdWx0OmZ1bmN0aW9uKEUpe2lmKEUuZWxlbS5zdHlsZSYmRS5lbGVtLnN0eWxlW0UucHJvcF0hPW51bGwpe0UuZWxlbS5zdHlsZVtFLnByb3BdPUUubm93K0UudW5pdH1lbHNle0UuZWxlbVtFLnByb3BdPUUubm93fX19fSk7aWYoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCl7by5mbi5vZmZzZXQ9ZnVuY3Rpb24oKXtpZighdGhpc1swXSl7cmV0dXJue3RvcDowLGxlZnQ6MH19aWYodGhpc1swXT09PXRoaXNbMF0ub3duZXJEb2N1bWVudC5ib2R5KXtyZXR1cm4gby5vZmZzZXQuYm9keU9mZnNldCh0aGlzWzBdKX12YXIgRz10aGlzWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLEo9dGhpc1swXS5vd25lckRvY3VtZW50LEY9Si5ib2R5LEU9Si5kb2N1bWVudEVsZW1lbnQsTD1FLmNsaWVudFRvcHx8Ri5jbGllbnRUb3B8fDAsSz1FLmNsaWVudExlZnR8fEYuY2xpZW50TGVmdHx8MCxJPUcudG9wKyhzZWxmLnBhZ2VZT2Zmc2V0fHxvLmJveE1vZGVsJiZFLnNjcm9sbFRvcHx8Ri5zY3JvbGxUb3ApLUwsSD1HLmxlZnQrKHNlbGYucGFnZVhPZmZzZXR8fG8uYm94TW9kZWwmJkUuc2Nyb2xsTGVmdHx8Ri5zY3JvbGxMZWZ0KS1LO3JldHVybnt0b3A6SSxsZWZ0Okh9fX1lbHNle28uZm4ub2Zmc2V0PWZ1bmN0aW9uKCl7aWYoIXRoaXNbMF0pe3JldHVybnt0b3A6MCxsZWZ0OjB9fWlmKHRoaXNbMF09PT10aGlzWzBdLm93bmVyRG9jdW1lbnQuYm9keSl7cmV0dXJuIG8ub2Zmc2V0LmJvZHlPZmZzZXQodGhpc1swXSl9by5vZmZzZXQuaW5pdGlhbGl6ZWR8fG8ub2Zmc2V0LmluaXRpYWxpemUoKTt2YXIgSj10aGlzWzBdLEc9Si5vZmZzZXRQYXJlbnQsRj1KLE89Si5vd25lckRvY3VtZW50LE0sSD1PLmRvY3VtZW50RWxlbWVudCxLPU8uYm9keSxMPU8uZGVmYXVsdFZpZXcsRT1MLmdldENvbXB1dGVkU3R5bGUoSixudWxsKSxOPUoub2Zmc2V0VG9wLEk9Si5vZmZzZXRMZWZ0O3doaWxlKChKPUoucGFyZW50Tm9kZSkmJkohPT1LJiZKIT09SCl7TT1MLmdldENvbXB1dGVkU3R5bGUoSixudWxsKTtOLT1KLnNjcm9sbFRvcCxJLT1KLnNjcm9sbExlZnQ7aWYoSj09PUcpe04rPUoub2Zmc2V0VG9wLEkrPUoub2Zmc2V0TGVmdDtpZihvLm9mZnNldC5kb2VzTm90QWRkQm9yZGVyJiYhKG8ub2Zmc2V0LmRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzJiYvXnQoYWJsZXxkfGgpJC9pLnRlc3QoSi50YWdOYW1lKSkpe04rPXBhcnNlSW50KE0uYm9yZGVyVG9wV2lkdGgsMTApfHwwLEkrPXBhcnNlSW50KE0uYm9yZGVyTGVmdFdpZHRoLDEwKXx8MH1GPUcsRz1KLm9mZnNldFBhcmVudH1pZihvLm9mZnNldC5zdWJ0cmFjdHNCb3JkZXJGb3JPdmVyZmxvd05vdFZpc2libGUmJk0ub3ZlcmZsb3chPT0idmlzaWJsZSIpe04rPXBhcnNlSW50KE0uYm9yZGVyVG9wV2lkdGgsMTApfHwwLEkrPXBhcnNlSW50KE0uYm9yZGVyTGVmdFdpZHRoLDEwKXx8MH1FPU19aWYoRS5wb3NpdGlvbj09PSJyZWxhdGl2ZSJ8fEUucG9zaXRpb249PT0ic3RhdGljIil7Tis9Sy5vZmZzZXRUb3AsSSs9Sy5vZmZzZXRMZWZ0fWlmKEUucG9zaXRpb249PT0iZml4ZWQiKXtOKz1NYXRoLm1heChILnNjcm9sbFRvcCxLLnNjcm9sbFRvcCksSSs9TWF0aC5tYXgoSC5zY3JvbGxMZWZ0LEsuc2Nyb2xsTGVmdCl9cmV0dXJue3RvcDpOLGxlZnQ6SX19fW8ub2Zmc2V0PXtpbml0aWFsaXplOmZ1bmN0aW9uKCl7aWYodGhpcy5pbml0aWFsaXplZCl7cmV0dXJufXZhciBMPWRvY3VtZW50LmJvZHksRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxILEcsTixJLE0sRSxKPUwuc3R5bGUubWFyZ2luVG9wLEs9JzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDttYXJnaW46MDtib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowO3dpZHRoOjFweDtoZWlnaHQ6MXB4OyI+PGRpdj48L2Rpdj48L2Rpdj48dGFibGUgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDttYXJnaW46MDtib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowO3dpZHRoOjFweDtoZWlnaHQ6MXB4OyIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj48dHI+PHRkPjwvdGQ+PC90cj48L3RhYmxlPic7TT17cG9zaXRpb246ImFic29sdXRlIix0b3A6MCxsZWZ0OjAsbWFyZ2luOjAsYm9yZGVyOjAsd2lkdGg6IjFweCIsaGVpZ2h0OiIxcHgiLHZpc2liaWxpdHk6ImhpZGRlbiJ9O2ZvcihFIGluIE0pe0Yuc3R5bGVbRV09TVtFXX1GLmlubmVySFRNTD1LO0wuaW5zZXJ0QmVmb3JlKEYsTC5maXJzdENoaWxkKTtIPUYuZmlyc3RDaGlsZCxHPUguZmlyc3RDaGlsZCxJPUgubmV4dFNpYmxpbmcuZmlyc3RDaGlsZC5maXJzdENoaWxkO3RoaXMuZG9lc05vdEFkZEJvcmRlcj0oRy5vZmZzZXRUb3AhPT01KTt0aGlzLmRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzPShJLm9mZnNldFRvcD09PTUpO0guc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIsSC5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiO3RoaXMuc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlPShHLm9mZnNldFRvcD09PS01KTtMLnN0eWxlLm1hcmdpblRvcD0iMXB4Ijt0aGlzLmRvZXNOb3RJbmNsdWRlTWFyZ2luSW5Cb2R5T2Zmc2V0PShMLm9mZnNldFRvcD09PTApO0wuc3R5bGUubWFyZ2luVG9wPUo7TC5yZW1vdmVDaGlsZChGKTt0aGlzLmluaXRpYWxpemVkPXRydWV9LGJvZHlPZmZzZXQ6ZnVuY3Rpb24oRSl7by5vZmZzZXQuaW5pdGlhbGl6ZWR8fG8ub2Zmc2V0LmluaXRpYWxpemUoKTt2YXIgRz1FLm9mZnNldFRvcCxGPUUub2Zmc2V0TGVmdDtpZihvLm9mZnNldC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldCl7Rys9cGFyc2VJbnQoby5jdXJDU1MoRSwibWFyZ2luVG9wIix0cnVlKSwxMCl8fDAsRis9cGFyc2VJbnQoby5jdXJDU1MoRSwibWFyZ2luTGVmdCIsdHJ1ZSksMTApfHwwfXJldHVybnt0b3A6RyxsZWZ0OkZ9fX07by5mbi5leHRlbmQoe3Bvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIEk9MCxIPTAsRjtpZih0aGlzWzBdKXt2YXIgRz10aGlzLm9mZnNldFBhcmVudCgpLEo9dGhpcy5vZmZzZXQoKSxFPS9eYm9keXxodG1sJC9pLnRlc3QoR1swXS50YWdOYW1lKT97dG9wOjAsbGVmdDowfTpHLm9mZnNldCgpO0oudG9wLT1qKHRoaXMsIm1hcmdpblRvcCIpO0oubGVmdC09aih0aGlzLCJtYXJnaW5MZWZ0Iik7RS50b3ArPWooRywiYm9yZGVyVG9wV2lkdGgiKTtFLmxlZnQrPWooRywiYm9yZGVyTGVmdFdpZHRoIik7Rj17dG9wOkoudG9wLUUudG9wLGxlZnQ6Si5sZWZ0LUUubGVmdH19cmV0dXJuIEZ9LG9mZnNldFBhcmVudDpmdW5jdGlvbigpe3ZhciBFPXRoaXNbMF0ub2Zmc2V0UGFyZW50fHxkb2N1bWVudC5ib2R5O3doaWxlKEUmJighL15ib2R5fGh0bWwkL2kudGVzdChFLnRhZ05hbWUpJiZvLmNzcyhFLCJwb3NpdGlvbiIpPT0ic3RhdGljIikpe0U9RS5vZmZzZXRQYXJlbnR9cmV0dXJuIG8oRSl9fSk7by5lYWNoKFsiTGVmdCIsIlRvcCJdLGZ1bmN0aW9uKEYsRSl7dmFyIEc9InNjcm9sbCIrRTtvLmZuW0ddPWZ1bmN0aW9uKEgpe2lmKCF0aGlzWzBdKXtyZXR1cm4gbnVsbH1yZXR1cm4gSCE9PWc/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dGhpcz09bHx8dGhpcz09ZG9jdW1lbnQ/bC5zY3JvbGxUbyghRj9IOm8obCkuc2Nyb2xsTGVmdCgpLEY/SDpvKGwpLnNjcm9sbFRvcCgpKTp0aGlzW0ddPUh9KTp0aGlzWzBdPT1sfHx0aGlzWzBdPT1kb2N1bWVudD9zZWxmW0Y/InBhZ2VZT2Zmc2V0IjoicGFnZVhPZmZzZXQiXXx8by5ib3hNb2RlbCYmZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50W0ddfHxkb2N1bWVudC5ib2R5W0ddOnRoaXNbMF1bR119fSk7by5lYWNoKFsiSGVpZ2h0IiwiV2lkdGgiXSxmdW5jdGlvbihJLEcpe3ZhciBFPUk/IkxlZnQiOiJUb3AiLEg9ST8iUmlnaHQiOiJCb3R0b20iLEY9Ry50b0xvd2VyQ2FzZSgpO28uZm5bImlubmVyIitHXT1mdW5jdGlvbigpe3JldHVybiB0aGlzWzBdP28uY3NzKHRoaXNbMF0sRixmYWxzZSwicGFkZGluZyIpOm51bGx9O28uZm5bIm91dGVyIitHXT1mdW5jdGlvbihLKXtyZXR1cm4gdGhpc1swXT9vLmNzcyh0aGlzWzBdLEYsZmFsc2UsSz8ibWFyZ2luIjoiYm9yZGVyIik6bnVsbH07dmFyIEo9Ry50b0xvd2VyQ2FzZSgpO28uZm5bSl09ZnVuY3Rpb24oSyl7cmV0dXJuIHRoaXNbMF09PWw/ZG9jdW1lbnQuY29tcGF0TW9kZT09IkNTUzFDb21wYXQiJiZkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrR118fGRvY3VtZW50LmJvZHlbImNsaWVudCIrR106dGhpc1swXT09ZG9jdW1lbnQ/TWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiK0ddLGRvY3VtZW50LmJvZHlbInNjcm9sbCIrR10sZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJzY3JvbGwiK0ddLGRvY3VtZW50LmJvZHlbIm9mZnNldCIrR10sZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJvZmZzZXQiK0ddKTpLPT09Zz8odGhpcy5sZW5ndGg/by5jc3ModGhpc1swXSxKKTpudWxsKTp0aGlzLmNzcyhKLHR5cGVvZiBLPT09InN0cmluZyI/SzpLKyJweCIpfX0pfSkoKTsNCg0KLyoNCiAqIGpRdWVyeSB2YWxpZGF0aW9uIHBsdWctaW4gMS41LjENCiAqDQogKiBodHRwOi8vYmFzc2lzdGFuY2UuZGUvanF1ZXJ5LXBsdWdpbnMvanF1ZXJ5LXBsdWdpbi12YWxpZGF0aW9uLw0KICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9QbHVnaW5zL1ZhbGlkYXRpb24NCiAqDQogKiBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDA4IEr2cm4gWmFlZmZlcmVyDQogKg0KICogJElkOiBqcXVlcnkudmFsaWRhdGUuanMgNjA5NiAyMDA5LTAxLTEyIDE0OjEyOjA0WiBqb2Vybi56YWVmZmVyZXIgJA0KICoNCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgR1BMIGxpY2Vuc2VzOg0KICogICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocA0KICogICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWwNCiAqLw0KKGZ1bmN0aW9uKCQpeyQuZXh0ZW5kKCQuZm4se3ZhbGlkYXRlOmZ1bmN0aW9uKG9wdGlvbnMpe2lmKCF0aGlzLmxlbmd0aCl7b3B0aW9ucyYmb3B0aW9ucy5kZWJ1ZyYmd2luZG93LmNvbnNvbGUmJmNvbnNvbGUud2Fybigibm90aGluZyBzZWxlY3RlZCwgY2FuJ3QgdmFsaWRhdGUsIHJldHVybmluZyBub3RoaW5nIik7cmV0dXJuO312YXIgdmFsaWRhdG9yPSQuZGF0YSh0aGlzWzBdLCd2YWxpZGF0b3InKTtpZih2YWxpZGF0b3Ipe3JldHVybiB2YWxpZGF0b3I7fXZhbGlkYXRvcj1uZXcgJC52YWxpZGF0b3Iob3B0aW9ucyx0aGlzWzBdKTskLmRhdGEodGhpc1swXSwndmFsaWRhdG9yJyx2YWxpZGF0b3IpO2lmKHZhbGlkYXRvci5zZXR0aW5ncy5vbnN1Ym1pdCl7dGhpcy5maW5kKCJpbnB1dCwgYnV0dG9uIikuZmlsdGVyKCIuY2FuY2VsIikuY2xpY2soZnVuY3Rpb24oKXt2YWxpZGF0b3IuY2FuY2VsU3VibWl0PXRydWU7fSk7dGhpcy5zdWJtaXQoZnVuY3Rpb24oZXZlbnQpe2lmKHZhbGlkYXRvci5zZXR0aW5ncy5kZWJ1ZylldmVudC5wcmV2ZW50RGVmYXVsdCgpO2Z1bmN0aW9uIGhhbmRsZSgpe2lmKHZhbGlkYXRvci5zZXR0aW5ncy5zdWJtaXRIYW5kbGVyKXt2YWxpZGF0b3Iuc2V0dGluZ3Muc3VibWl0SGFuZGxlci5jYWxsKHZhbGlkYXRvcix2YWxpZGF0b3IuY3VycmVudEZvcm0pO3JldHVybiBmYWxzZTt9cmV0dXJuIHRydWU7fWlmKHZhbGlkYXRvci5jYW5jZWxTdWJtaXQpe3ZhbGlkYXRvci5jYW5jZWxTdWJtaXQ9ZmFsc2U7cmV0dXJuIGhhbmRsZSgpO31pZih2YWxpZGF0b3IuZm9ybSgpKXtpZih2YWxpZGF0b3IucGVuZGluZ1JlcXVlc3Qpe3ZhbGlkYXRvci5mb3JtU3VibWl0dGVkPXRydWU7cmV0dXJuIGZhbHNlO31yZXR1cm4gaGFuZGxlKCk7fWVsc2V7dmFsaWRhdG9yLmZvY3VzSW52YWxpZCgpO3JldHVybiBmYWxzZTt9fSk7fXJldHVybiB2YWxpZGF0b3I7fSx2YWxpZDpmdW5jdGlvbigpe2lmKCQodGhpc1swXSkuaXMoJ2Zvcm0nKSl7cmV0dXJuIHRoaXMudmFsaWRhdGUoKS5mb3JtKCk7fWVsc2V7dmFyIHZhbGlkPWZhbHNlO3ZhciB2YWxpZGF0b3I9JCh0aGlzWzBdLmZvcm0pLnZhbGlkYXRlKCk7dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFsaWR8PXZhbGlkYXRvci5lbGVtZW50KHRoaXMpO30pO3JldHVybiB2YWxpZDt9fSxyZW1vdmVBdHRyczpmdW5jdGlvbihhdHRyaWJ1dGVzKXt2YXIgcmVzdWx0PXt9LCRlbGVtZW50PXRoaXM7JC5lYWNoKGF0dHJpYnV0ZXMuc3BsaXQoL1xzLyksZnVuY3Rpb24oaW5kZXgsdmFsdWUpe3Jlc3VsdFt2YWx1ZV09JGVsZW1lbnQuYXR0cih2YWx1ZSk7JGVsZW1lbnQucmVtb3ZlQXR0cih2YWx1ZSk7fSk7cmV0dXJuIHJlc3VsdDt9LHJ1bGVzOmZ1bmN0aW9uKGNvbW1hbmQsYXJndW1lbnQpe3ZhciBlbGVtZW50PXRoaXNbMF07aWYoY29tbWFuZCl7dmFyIHNldHRpbmdzPSQuZGF0YShlbGVtZW50LmZvcm0sJ3ZhbGlkYXRvcicpLnNldHRpbmdzO3ZhciBzdGF0aWNSdWxlcz1zZXR0aW5ncy5ydWxlczt2YXIgZXhpc3RpbmdSdWxlcz0kLnZhbGlkYXRvci5zdGF0aWNSdWxlcyhlbGVtZW50KTtzd2l0Y2goY29tbWFuZCl7Y2FzZSJhZGQiOiQuZXh0ZW5kKGV4aXN0aW5nUnVsZXMsJC52YWxpZGF0b3Iubm9ybWFsaXplUnVsZShhcmd1bWVudCkpO3N0YXRpY1J1bGVzW2VsZW1lbnQubmFtZV09ZXhpc3RpbmdSdWxlcztpZihhcmd1bWVudC5tZXNzYWdlcylzZXR0aW5ncy5tZXNzYWdlc1tlbGVtZW50Lm5hbWVdPSQuZXh0ZW5kKHNldHRpbmdzLm1lc3NhZ2VzW2VsZW1lbnQubmFtZV0sYXJndW1lbnQubWVzc2FnZXMpO2JyZWFrO2Nhc2UicmVtb3ZlIjppZighYXJndW1lbnQpe2RlbGV0ZSBzdGF0aWNSdWxlc1tlbGVtZW50Lm5hbWVdO3JldHVybiBleGlzdGluZ1J1bGVzO312YXIgZmlsdGVyZWQ9e307JC5lYWNoKGFyZ3VtZW50LnNwbGl0KC9ccy8pLGZ1bmN0aW9uKGluZGV4LG1ldGhvZCl7ZmlsdGVyZWRbbWV0aG9kXT1leGlzdGluZ1J1bGVzW21ldGhvZF07ZGVsZXRlIGV4aXN0aW5nUnVsZXNbbWV0aG9kXTt9KTtyZXR1cm4gZmlsdGVyZWQ7fX12YXIgZGF0YT0kLnZhbGlkYXRvci5ub3JtYWxpemVSdWxlcygkLmV4dGVuZCh7fSwkLnZhbGlkYXRvci5tZXRhZGF0YVJ1bGVzKGVsZW1lbnQpLCQudmFsaWRhdG9yLmNsYXNzUnVsZXMoZWxlbWVudCksJC52YWxpZGF0b3IuYXR0cmlidXRlUnVsZXMoZWxlbWVudCksJC52YWxpZGF0b3Iuc3RhdGljUnVsZXMoZWxlbWVudCkpLGVsZW1lbnQpO2lmKGRhdGEucmVxdWlyZWQpe3ZhciBwYXJhbT1kYXRhLnJlcXVpcmVkO2RlbGV0ZSBkYXRhLnJlcXVpcmVkO2RhdGE9JC5leHRlbmQoe3JlcXVpcmVkOnBhcmFtfSxkYXRhKTt9cmV0dXJuIGRhdGE7fX0pOyQuZXh0ZW5kKCQuZXhwclsiOiJdLHtibGFuazpmdW5jdGlvbihhKXtyZXR1cm4hJC50cmltKGEudmFsdWUpO30sZmlsbGVkOmZ1bmN0aW9uKGEpe3JldHVybiEhJC50cmltKGEudmFsdWUpO30sdW5jaGVja2VkOmZ1bmN0aW9uKGEpe3JldHVybiFhLmNoZWNrZWQ7fX0pOyQuZm9ybWF0PWZ1bmN0aW9uKHNvdXJjZSxwYXJhbXMpe2lmKGFyZ3VtZW50cy5sZW5ndGg9PTEpcmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGFyZ3M9JC5tYWtlQXJyYXkoYXJndW1lbnRzKTthcmdzLnVuc2hpZnQoc291cmNlKTtyZXR1cm4gJC5mb3JtYXQuYXBwbHkodGhpcyxhcmdzKTt9O2lmKGFyZ3VtZW50cy5sZW5ndGg+MiYmcGFyYW1zLmNvbnN0cnVjdG9yIT1BcnJheSl7cGFyYW1zPSQubWFrZUFycmF5KGFyZ3VtZW50cykuc2xpY2UoMSk7fWlmKHBhcmFtcy5jb25zdHJ1Y3RvciE9QXJyYXkpe3BhcmFtcz1bcGFyYW1zXTt9JC5lYWNoKHBhcmFtcyxmdW5jdGlvbihpLG4pe3NvdXJjZT1zb3VyY2UucmVwbGFjZShuZXcgUmVnRXhwKCJcXHsiK2krIlxcfSIsImciKSxuKTt9KTtyZXR1cm4gc291cmNlO307JC52YWxpZGF0b3I9ZnVuY3Rpb24ob3B0aW9ucyxmb3JtKXt0aGlzLnNldHRpbmdzPSQuZXh0ZW5kKHt9LCQudmFsaWRhdG9yLmRlZmF1bHRzLG9wdGlvbnMpO3RoaXMuY3VycmVudEZvcm09Zm9ybTt0aGlzLmluaXQoKTt9OyQuZXh0ZW5kKCQudmFsaWRhdG9yLHtkZWZhdWx0czp7bWVzc2FnZXM6e30sZ3JvdXBzOnt9LHJ1bGVzOnt9LGVycm9yQ2xhc3M6ImVycm9yIixlcnJvckVsZW1lbnQ6ImxhYmVsIixmb2N1c0ludmFsaWQ6dHJ1ZSxlcnJvckNvbnRhaW5lcjokKFtdKSxlcnJvckxhYmVsQ29udGFpbmVyOiQoW10pLG9uc3VibWl0OnRydWUsaWdub3JlOltdLGlnbm9yZVRpdGxlOmZhbHNlLG9uZm9jdXNpbjpmdW5jdGlvbihlbGVtZW50KXt0aGlzLmxhc3RBY3RpdmU9ZWxlbWVudDtpZih0aGlzLnNldHRpbmdzLmZvY3VzQ2xlYW51cCYmIXRoaXMuYmxvY2tGb2N1c0NsZWFudXApe3RoaXMuc2V0dGluZ3MudW5oaWdobGlnaHQmJnRoaXMuc2V0dGluZ3MudW5oaWdobGlnaHQuY2FsbCh0aGlzLGVsZW1lbnQsdGhpcy5zZXR0aW5ncy5lcnJvckNsYXNzKTt0aGlzLmVycm9yc0ZvcihlbGVtZW50KS5oaWRlKCk7fX0sb25mb2N1c291dDpmdW5jdGlvbihlbGVtZW50KXtpZighdGhpcy5jaGVja2FibGUoZWxlbWVudCkmJihlbGVtZW50Lm5hbWUgaW4gdGhpcy5zdWJtaXR0ZWR8fCF0aGlzLm9wdGlvbmFsKGVsZW1lbnQpKSl7dGhpcy5lbGVtZW50KGVsZW1lbnQpO319LG9ua2V5dXA6ZnVuY3Rpb24oZWxlbWVudCl7aWYoZWxlbWVudC5uYW1lIGluIHRoaXMuc3VibWl0dGVkfHxlbGVtZW50PT10aGlzLmxhc3RFbGVtZW50KXt0aGlzLmVsZW1lbnQoZWxlbWVudCk7fX0sb25jbGljazpmdW5jdGlvbihlbGVtZW50KXtpZihlbGVtZW50Lm5hbWUgaW4gdGhpcy5zdWJtaXR0ZWQpdGhpcy5lbGVtZW50KGVsZW1lbnQpO30saGlnaGxpZ2h0OmZ1bmN0aW9uKGVsZW1lbnQsZXJyb3JDbGFzcyl7JChlbGVtZW50KS5hZGRDbGFzcyhlcnJvckNsYXNzKTt9LHVuaGlnaGxpZ2h0OmZ1bmN0aW9uKGVsZW1lbnQsZXJyb3JDbGFzcyl7JChlbGVtZW50KS5yZW1vdmVDbGFzcyhlcnJvckNsYXNzKTt9fSxzZXREZWZhdWx0czpmdW5jdGlvbihzZXR0aW5ncyl7JC5leHRlbmQoJC52YWxpZGF0b3IuZGVmYXVsdHMsc2V0dGluZ3MpO30sbWVzc2FnZXM6e3JlcXVpcmVkOiJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIscmVtb3RlOiJQbGVhc2UgZml4IHRoaXMgZmllbGQuIixlbWFpbDoiUGxlYXNlIGVudGVyIGEgdmFsaWQgZW1haWwgYWRkcmVzcy4iLHVybDoiUGxlYXNlIGVudGVyIGEgdmFsaWQgVVJMLiIsZGF0ZToiUGxlYXNlIGVudGVyIGEgdmFsaWQgZGF0ZS4iLGRhdGVJU086IlBsZWFzZSBlbnRlciBhIHZhbGlkIGRhdGUgKElTTykuIixkYXRlREU6IkJpdHRlIGdlYmVuIFNpZSBlaW4gZ/xsdGlnZXMgRGF0dW0gZWluLiIsbnVtYmVyOiJQbGVhc2UgZW50ZXIgYSB2YWxpZCBudW1iZXIuIixudW1iZXJERToiQml0dGUgZ2ViZW4gU2llIGVpbmUgTnVtbWVyIGVpbi4iLGRpZ2l0czoiUGxlYXNlIGVudGVyIG9ubHkgZGlnaXRzIixjcmVkaXRjYXJkOiJQbGVhc2UgZW50ZXIgYSB2YWxpZCBjcmVkaXQgY2FyZCBudW1iZXIuIixlcXVhbFRvOiJQbGVhc2UgZW50ZXIgdGhlIHNhbWUgdmFsdWUgYWdhaW4uIixhY2NlcHQ6IlBsZWFzZSBlbnRlciBhIHZhbHVlIHdpdGggYSB2YWxpZCBleHRlbnNpb24uIixtYXhsZW5ndGg6JC5mb3JtYXQoIlBsZWFzZSBlbnRlciBubyBtb3JlIHRoYW4gezB9IGNoYXJhY3RlcnMuIiksbWlubGVuZ3RoOiQuZm9ybWF0KCJQbGVhc2UgZW50ZXIgYXQgbGVhc3QgezB9IGNoYXJhY3RlcnMuIikscmFuZ2VsZW5ndGg6JC5mb3JtYXQoIlBsZWFzZSBlbnRlciBhIHZhbHVlIGJldHdlZW4gezB9IGFuZCB7MX0gY2hhcmFjdGVycyBsb25nLiIpLHJhbmdlOiQuZm9ybWF0KCJQbGVhc2UgZW50ZXIgYSB2YWx1ZSBiZXR3ZWVuIHswfSBhbmQgezF9LiIpLG1heDokLmZvcm1hdCgiUGxlYXNlIGVudGVyIGEgdmFsdWUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHswfS4iKSxtaW46JC5mb3JtYXQoIlBsZWFzZSBlbnRlciBhIHZhbHVlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB7MH0uIil9LGF1dG9DcmVhdGVSYW5nZXM6ZmFsc2UscHJvdG90eXBlOntpbml0OmZ1bmN0aW9uKCl7dGhpcy5sYWJlbENvbnRhaW5lcj0kKHRoaXMuc2V0dGluZ3MuZXJyb3JMYWJlbENvbnRhaW5lcik7dGhpcy5lcnJvckNvbnRleHQ9dGhpcy5sYWJlbENvbnRhaW5lci5sZW5ndGgmJnRoaXMubGFiZWxDb250YWluZXJ8fCQodGhpcy5jdXJyZW50Rm9ybSk7dGhpcy5jb250YWluZXJzPSQodGhpcy5zZXR0aW5ncy5lcnJvckNvbnRhaW5lcikuYWRkKHRoaXMuc2V0dGluZ3MuZXJyb3JMYWJlbENvbnRhaW5lcik7dGhpcy5zdWJtaXR0ZWQ9e307dGhpcy52YWx1ZUNhY2hlPXt9O3RoaXMucGVuZGluZ1JlcXVlc3Q9MDt0aGlzLnBlbmRpbmc9e307dGhpcy5pbnZhbGlkPXt9O3RoaXMucmVzZXQoKTt2YXIgZ3JvdXBzPSh0aGlzLmdyb3Vwcz17fSk7JC5lYWNoKHRoaXMuc2V0dGluZ3MuZ3JvdXBzLGZ1bmN0aW9uKGtleSx2YWx1ZSl7JC5lYWNoKHZhbHVlLnNwbGl0KC9ccy8pLGZ1bmN0aW9uKGluZGV4LG5hbWUpe2dyb3Vwc1tuYW1lXT1rZXk7fSk7fSk7dmFyIHJ1bGVzPXRoaXMuc2V0dGluZ3MucnVsZXM7JC5lYWNoKHJ1bGVzLGZ1bmN0aW9uKGtleSx2YWx1ZSl7cnVsZXNba2V5XT0kLnZhbGlkYXRvci5ub3JtYWxpemVSdWxlKHZhbHVlKTt9KTtmdW5jdGlvbiBkZWxlZ2F0ZShldmVudCl7dmFyIHZhbGlkYXRvcj0kLmRhdGEodGhpc1swXS5mb3JtLCJ2YWxpZGF0b3IiKTt2YWxpZGF0b3Iuc2V0dGluZ3NbIm9uIitldmVudC50eXBlXSYmdmFsaWRhdG9yLnNldHRpbmdzWyJvbiIrZXZlbnQudHlwZV0uY2FsbCh2YWxpZGF0b3IsdGhpc1swXSk7fSQodGhpcy5jdXJyZW50Rm9ybSkuZGVsZWdhdGUoImZvY3VzaW4gZm9jdXNvdXQga2V5dXAiLCI6dGV4dCwgOnBhc3N3b3JkLCA6ZmlsZSwgc2VsZWN0LCB0ZXh0YXJlYSIsZGVsZWdhdGUpLmRlbGVnYXRlKCJjbGljayIsIjpyYWRpbywgOmNoZWNrYm94IixkZWxlZ2F0ZSk7aWYodGhpcy5zZXR0aW5ncy5pbnZhbGlkSGFuZGxlcikkKHRoaXMuY3VycmVudEZvcm0pLmJpbmQoImludmFsaWQtZm9ybS52YWxpZGF0ZSIsdGhpcy5zZXR0aW5ncy5pbnZhbGlkSGFuZGxlcik7fSxmb3JtOmZ1bmN0aW9uKCl7dGhpcy5jaGVja0Zvcm0oKTskLmV4dGVuZCh0aGlzLnN1Ym1pdHRlZCx0aGlzLmVycm9yTWFwKTt0aGlzLmludmFsaWQ9JC5leHRlbmQoe30sdGhpcy5lcnJvck1hcCk7aWYoIXRoaXMudmFsaWQoKSkkKHRoaXMuY3VycmVudEZvcm0pLnRyaWdnZXJIYW5kbGVyKCJpbnZhbGlkLWZvcm0iLFt0aGlzXSk7dGhpcy5zaG93RXJyb3JzKCk7cmV0dXJuIHRoaXMudmFsaWQoKTt9LGNoZWNrRm9ybTpmdW5jdGlvbigpe3RoaXMucHJlcGFyZUZvcm0oKTtmb3IodmFyIGk9MCxlbGVtZW50cz0odGhpcy5jdXJyZW50RWxlbWVudHM9dGhpcy5lbGVtZW50cygpKTtlbGVtZW50c1tpXTtpKyspe3RoaXMuY2hlY2soZWxlbWVudHNbaV0pO31yZXR1cm4gdGhpcy52YWxpZCgpO30sZWxlbWVudDpmdW5jdGlvbihlbGVtZW50KXtlbGVtZW50PXRoaXMuY2xlYW4oZWxlbWVudCk7dGhpcy5sYXN0RWxlbWVudD1lbGVtZW50O3RoaXMucHJlcGFyZUVsZW1lbnQoZWxlbWVudCk7dGhpcy5jdXJyZW50RWxlbWVudHM9JChlbGVtZW50KTt2YXIgcmVzdWx0PXRoaXMuY2hlY2soZWxlbWVudCk7aWYocmVzdWx0KXtkZWxldGUgdGhpcy5pbnZhbGlkW2VsZW1lbnQubmFtZV07fWVsc2V7dGhpcy5pbnZhbGlkW2VsZW1lbnQubmFtZV09dHJ1ZTt9aWYoIXRoaXMubnVtYmVyT2ZJbnZhbGlkcygpKXt0aGlzLnRvSGlkZT10aGlzLnRvSGlkZS5hZGQodGhpcy5jb250YWluZXJzKTt9dGhpcy5zaG93RXJyb3JzKCk7cmV0dXJuIHJlc3VsdDt9LHNob3dFcnJvcnM6ZnVuY3Rpb24oZXJyb3JzKXtpZihlcnJvcnMpeyQuZXh0ZW5kKHRoaXMuZXJyb3JNYXAsZXJyb3JzKTt0aGlzLmVycm9yTGlzdD1bXTtmb3IodmFyIG5hbWUgaW4gZXJyb3JzKXt0aGlzLmVycm9yTGlzdC5wdXNoKHttZXNzYWdlOmVycm9yc1tuYW1lXSxlbGVtZW50OnRoaXMuZmluZEJ5TmFtZShuYW1lKVswXX0pO310aGlzLnN1Y2Nlc3NMaXN0PSQuZ3JlcCh0aGlzLnN1Y2Nlc3NMaXN0LGZ1bmN0aW9uKGVsZW1lbnQpe3JldHVybiEoZWxlbWVudC5uYW1lIGluIGVycm9ycyk7fSk7fXRoaXMuc2V0dGluZ3Muc2hvd0Vycm9ycz90aGlzLnNldHRpbmdzLnNob3dFcnJvcnMuY2FsbCh0aGlzLHRoaXMuZXJyb3JNYXAsdGhpcy5lcnJvckxpc3QpOnRoaXMuZGVmYXVsdFNob3dFcnJvcnMoKTt9LHJlc2V0Rm9ybTpmdW5jdGlvbigpe2lmKCQuZm4ucmVzZXRGb3JtKSQodGhpcy5jdXJyZW50Rm9ybSkucmVzZXRGb3JtKCk7dGhpcy5zdWJtaXR0ZWQ9e307dGhpcy5wcmVwYXJlRm9ybSgpO3RoaXMuaGlkZUVycm9ycygpO3RoaXMuZWxlbWVudHMoKS5yZW1vdmVDbGFzcyh0aGlzLnNldHRpbmdzLmVycm9yQ2xhc3MpO30sbnVtYmVyT2ZJbnZhbGlkczpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9iamVjdExlbmd0aCh0aGlzLmludmFsaWQpO30sb2JqZWN0TGVuZ3RoOmZ1bmN0aW9uKG9iail7dmFyIGNvdW50PTA7Zm9yKHZhciBpIGluIG9iailjb3VudCsrO3JldHVybiBjb3VudDt9LGhpZGVFcnJvcnM6ZnVuY3Rpb24oKXt0aGlzLmFkZFdyYXBwZXIodGhpcy50b0hpZGUpLmhpZGUoKTt9LHZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2l6ZSgpPT0wO30sc2l6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yTGlzdC5sZW5ndGg7fSxmb2N1c0ludmFsaWQ6ZnVuY3Rpb24oKXtpZih0aGlzLnNldHRpbmdzLmZvY3VzSW52YWxpZCl7dHJ5eyQodGhpcy5maW5kTGFzdEFjdGl2ZSgpfHx0aGlzLmVycm9yTGlzdC5sZW5ndGgmJnRoaXMuZXJyb3JMaXN0WzBdLmVsZW1lbnR8fFtdKS5maWx0ZXIoIjp2aXNpYmxlIikuZm9jdXMoKTt9Y2F0Y2goZSl7fX19LGZpbmRMYXN0QWN0aXZlOmZ1bmN0aW9uKCl7dmFyIGxhc3RBY3RpdmU9dGhpcy5sYXN0QWN0aXZlO3JldHVybiBsYXN0QWN0aXZlJiYkLmdyZXAodGhpcy5lcnJvckxpc3QsZnVuY3Rpb24obil7cmV0dXJuIG4uZWxlbWVudC5uYW1lPT1sYXN0QWN0aXZlLm5hbWU7fSkubGVuZ3RoPT0xJiZsYXN0QWN0aXZlO30sZWxlbWVudHM6ZnVuY3Rpb24oKXt2YXIgdmFsaWRhdG9yPXRoaXMscnVsZXNDYWNoZT17fTtyZXR1cm4gJChbXSkuYWRkKHRoaXMuY3VycmVudEZvcm0uZWxlbWVudHMpLmZpbHRlcigiOmlucHV0Iikubm90KCI6c3VibWl0LCA6cmVzZXQsIDppbWFnZSwgW2Rpc2FibGVkXSIpLm5vdCh0aGlzLnNldHRpbmdzLmlnbm9yZSkuZmlsdGVyKGZ1bmN0aW9uKCl7IXRoaXMubmFtZSYmdmFsaWRhdG9yLnNldHRpbmdzLmRlYnVnJiZ3aW5kb3cuY29uc29sZSYmY29uc29sZS5lcnJvcigiJW8gaGFzIG5vIG5hbWUgYXNzaWduZWQiLHRoaXMpO2lmKHRoaXMubmFtZSBpbiBydWxlc0NhY2hlfHwhdmFsaWRhdG9yLm9iamVjdExlbmd0aCgkKHRoaXMpLnJ1bGVzKCkpKXJldHVybiBmYWxzZTtydWxlc0NhY2hlW3RoaXMubmFtZV09dHJ1ZTtyZXR1cm4gdHJ1ZTt9KTt9LGNsZWFuOmZ1bmN0aW9uKHNlbGVjdG9yKXtyZXR1cm4gJChzZWxlY3RvcilbMF07fSxlcnJvcnM6ZnVuY3Rpb24oKXtyZXR1cm4gJCh0aGlzLnNldHRpbmdzLmVycm9yRWxlbWVudCsiLiIrdGhpcy5zZXR0aW5ncy5lcnJvckNsYXNzLHRoaXMuZXJyb3JDb250ZXh0KTt9LHJlc2V0OmZ1bmN0aW9uKCl7dGhpcy5zdWNjZXNzTGlzdD1bXTt0aGlzLmVycm9yTGlzdD1bXTt0aGlzLmVycm9yTWFwPXt9O3RoaXMudG9TaG93PSQoW10pO3RoaXMudG9IaWRlPSQoW10pO3RoaXMuZm9ybVN1Ym1pdHRlZD1mYWxzZTt0aGlzLmN1cnJlbnRFbGVtZW50cz0kKFtdKTt9LHByZXBhcmVGb3JtOmZ1bmN0aW9uKCl7dGhpcy5yZXNldCgpO3RoaXMudG9IaWRlPXRoaXMuZXJyb3JzKCkuYWRkKHRoaXMuY29udGFpbmVycyk7fSxwcmVwYXJlRWxlbWVudDpmdW5jdGlvbihlbGVtZW50KXt0aGlzLnJlc2V0KCk7dGhpcy50b0hpZGU9dGhpcy5lcnJvcnNGb3IoZWxlbWVudCk7fSxjaGVjazpmdW5jdGlvbihlbGVtZW50KXtlbGVtZW50PXRoaXMuY2xlYW4oZWxlbWVudCk7aWYodGhpcy5jaGVja2FibGUoZWxlbWVudCkpe2VsZW1lbnQ9dGhpcy5maW5kQnlOYW1lKGVsZW1lbnQubmFtZSlbMF07fXZhciBydWxlcz0kKGVsZW1lbnQpLnJ1bGVzKCk7dmFyIGRlcGVuZGVuY3lNaXNtYXRjaD1mYWxzZTtmb3IobWV0aG9kIGluIHJ1bGVzKXt2YXIgcnVsZT17bWV0aG9kOm1ldGhvZCxwYXJhbWV0ZXJzOnJ1bGVzW21ldGhvZF19O3RyeXt2YXIgcmVzdWx0PSQudmFsaWRhdG9yLm1ldGhvZHNbbWV0aG9kXS5jYWxsKHRoaXMsZWxlbWVudC52YWx1ZSxlbGVtZW50LHJ1bGUucGFyYW1ldGVycyk7aWYocmVzdWx0PT0iZGVwZW5kZW5jeS1taXNtYXRjaCIpe2RlcGVuZGVuY3lNaXNtYXRjaD10cnVlO2NvbnRpbnVlO31kZXBlbmRlbmN5TWlzbWF0Y2g9ZmFsc2U7aWYocmVzdWx0PT0icGVuZGluZyIpe3RoaXMudG9IaWRlPXRoaXMudG9IaWRlLm5vdCh0aGlzLmVycm9yc0ZvcihlbGVtZW50KSk7cmV0dXJuO31pZighcmVzdWx0KXt0aGlzLmZvcm1hdEFuZEFkZChlbGVtZW50LHJ1bGUpO3JldHVybiBmYWxzZTt9fWNhdGNoKGUpe3RoaXMuc2V0dGluZ3MuZGVidWcmJndpbmRvdy5jb25zb2xlJiZjb25zb2xlLmxvZygiZXhjZXB0aW9uIG9jY3VyZWQgd2hlbiBjaGVja2luZyBlbGVtZW50ICIrZWxlbWVudC5pZA0KKyIsIGNoZWNrIHRoZSAnIitydWxlLm1ldGhvZCsiJyBtZXRob2QiKTt0aHJvdyBlO319aWYoZGVwZW5kZW5jeU1pc21hdGNoKXJldHVybjtpZih0aGlzLm9iamVjdExlbmd0aChydWxlcykpdGhpcy5zdWNjZXNzTGlzdC5wdXNoKGVsZW1lbnQpO3JldHVybiB0cnVlO30sY3VzdG9tTWV0YU1lc3NhZ2U6ZnVuY3Rpb24oZWxlbWVudCxtZXRob2Qpe2lmKCEkLm1ldGFkYXRhKXJldHVybjt2YXIgbWV0YT10aGlzLnNldHRpbmdzLm1ldGE/JChlbGVtZW50KS5tZXRhZGF0YSgpW3RoaXMuc2V0dGluZ3MubWV0YV06JChlbGVtZW50KS5tZXRhZGF0YSgpO3JldHVybiBtZXRhJiZtZXRhLm1lc3NhZ2VzJiZtZXRhLm1lc3NhZ2VzW21ldGhvZF07fSxjdXN0b21NZXNzYWdlOmZ1bmN0aW9uKG5hbWUsbWV0aG9kKXt2YXIgbT10aGlzLnNldHRpbmdzLm1lc3NhZ2VzW25hbWVdO3JldHVybiBtJiYobS5jb25zdHJ1Y3Rvcj09U3RyaW5nP206bVttZXRob2RdKTt9LGZpbmREZWZpbmVkOmZ1bmN0aW9uKCl7Zm9yKHZhciBpPTA7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7aWYoYXJndW1lbnRzW2ldIT09dW5kZWZpbmVkKXJldHVybiBhcmd1bWVudHNbaV07fXJldHVybiB1bmRlZmluZWQ7fSxkZWZhdWx0TWVzc2FnZTpmdW5jdGlvbihlbGVtZW50LG1ldGhvZCl7cmV0dXJuIHRoaXMuZmluZERlZmluZWQodGhpcy5jdXN0b21NZXNzYWdlKGVsZW1lbnQubmFtZSxtZXRob2QpLHRoaXMuY3VzdG9tTWV0YU1lc3NhZ2UoZWxlbWVudCxtZXRob2QpLCF0aGlzLnNldHRpbmdzLmlnbm9yZVRpdGxlJiZlbGVtZW50LnRpdGxlfHx1bmRlZmluZWQsJC52YWxpZGF0b3IubWVzc2FnZXNbbWV0aG9kXSwiPHN0cm9uZz5XYXJuaW5nOiBObyBtZXNzYWdlIGRlZmluZWQgZm9yICIrZWxlbWVudC5uYW1lKyI8L3N0cm9uZz4iKTt9LGZvcm1hdEFuZEFkZDpmdW5jdGlvbihlbGVtZW50LHJ1bGUpe3ZhciBtZXNzYWdlPXRoaXMuZGVmYXVsdE1lc3NhZ2UoZWxlbWVudCxydWxlLm1ldGhvZCk7aWYodHlwZW9mIG1lc3NhZ2U9PSJmdW5jdGlvbiIpbWVzc2FnZT1tZXNzYWdlLmNhbGwodGhpcyxydWxlLnBhcmFtZXRlcnMsZWxlbWVudCk7dGhpcy5lcnJvckxpc3QucHVzaCh7bWVzc2FnZTptZXNzYWdlLGVsZW1lbnQ6ZWxlbWVudH0pO3RoaXMuZXJyb3JNYXBbZWxlbWVudC5uYW1lXT1tZXNzYWdlO3RoaXMuc3VibWl0dGVkW2VsZW1lbnQubmFtZV09bWVzc2FnZTt9LGFkZFdyYXBwZXI6ZnVuY3Rpb24odG9Ub2dnbGUpe2lmKHRoaXMuc2V0dGluZ3Mud3JhcHBlcil0b1RvZ2dsZT10b1RvZ2dsZS5hZGQodG9Ub2dnbGUucGFyZW50cyh0aGlzLnNldHRpbmdzLndyYXBwZXIpKTtyZXR1cm4gdG9Ub2dnbGU7fSxkZWZhdWx0U2hvd0Vycm9yczpmdW5jdGlvbigpe2Zvcih2YXIgaT0wO3RoaXMuZXJyb3JMaXN0W2ldO2krKyl7dmFyIGVycm9yPXRoaXMuZXJyb3JMaXN0W2ldO3RoaXMuc2V0dGluZ3MuaGlnaGxpZ2h0JiZ0aGlzLnNldHRpbmdzLmhpZ2hsaWdodC5jYWxsKHRoaXMsZXJyb3IuZWxlbWVudCx0aGlzLnNldHRpbmdzLmVycm9yQ2xhc3MpO3RoaXMuc2hvd0xhYmVsKGVycm9yLmVsZW1lbnQsZXJyb3IubWVzc2FnZSk7fWlmKHRoaXMuZXJyb3JMaXN0Lmxlbmd0aCl7dGhpcy50b1Nob3c9dGhpcy50b1Nob3cuYWRkKHRoaXMuY29udGFpbmVycyk7fWlmKHRoaXMuc2V0dGluZ3Muc3VjY2Vzcyl7Zm9yKHZhciBpPTA7dGhpcy5zdWNjZXNzTGlzdFtpXTtpKyspe3RoaXMuc2hvd0xhYmVsKHRoaXMuc3VjY2Vzc0xpc3RbaV0pO319aWYodGhpcy5zZXR0aW5ncy51bmhpZ2hsaWdodCl7Zm9yKHZhciBpPTAsZWxlbWVudHM9dGhpcy52YWxpZEVsZW1lbnRzKCk7ZWxlbWVudHNbaV07aSsrKXt0aGlzLnNldHRpbmdzLnVuaGlnaGxpZ2h0LmNhbGwodGhpcyxlbGVtZW50c1tpXSx0aGlzLnNldHRpbmdzLmVycm9yQ2xhc3MpO319dGhpcy50b0hpZGU9dGhpcy50b0hpZGUubm90KHRoaXMudG9TaG93KTt0aGlzLmhpZGVFcnJvcnMoKTt0aGlzLmFkZFdyYXBwZXIodGhpcy50b1Nob3cpLnNob3coKTt9LHZhbGlkRWxlbWVudHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdXJyZW50RWxlbWVudHMubm90KHRoaXMuaW52YWxpZEVsZW1lbnRzKCkpO30saW52YWxpZEVsZW1lbnRzOmZ1bmN0aW9uKCl7cmV0dXJuICQodGhpcy5lcnJvckxpc3QpLm1hcChmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnQ7fSk7fSxzaG93TGFiZWw6ZnVuY3Rpb24oZWxlbWVudCxtZXNzYWdlKXt2YXIgbGFiZWw9dGhpcy5lcnJvcnNGb3IoZWxlbWVudCk7aWYobGFiZWwubGVuZ3RoKXtsYWJlbC5yZW1vdmVDbGFzcygpLmFkZENsYXNzKHRoaXMuc2V0dGluZ3MuZXJyb3JDbGFzcyk7bGFiZWwuYXR0cigiZ2VuZXJhdGVkIikmJmxhYmVsLmh0bWwobWVzc2FnZSk7fWVsc2V7bGFiZWw9JCgiPCIrdGhpcy5zZXR0aW5ncy5lcnJvckVsZW1lbnQrIi8+IikuYXR0cih7ImZvciI6dGhpcy5pZE9yTmFtZShlbGVtZW50KSxnZW5lcmF0ZWQ6dHJ1ZX0pLmFkZENsYXNzKHRoaXMuc2V0dGluZ3MuZXJyb3JDbGFzcykuaHRtbChtZXNzYWdlfHwiIik7aWYodGhpcy5zZXR0aW5ncy53cmFwcGVyKXtsYWJlbD1sYWJlbC5oaWRlKCkuc2hvdygpLndyYXAoIjwiK3RoaXMuc2V0dGluZ3Mud3JhcHBlcisiLz4iKS5wYXJlbnQoKTt9aWYoIXRoaXMubGFiZWxDb250YWluZXIuYXBwZW5kKGxhYmVsKS5sZW5ndGgpdGhpcy5zZXR0aW5ncy5lcnJvclBsYWNlbWVudD90aGlzLnNldHRpbmdzLmVycm9yUGxhY2VtZW50KGxhYmVsLCQoZWxlbWVudCkpOmxhYmVsLmluc2VydEFmdGVyKGVsZW1lbnQpO31pZighbWVzc2FnZSYmdGhpcy5zZXR0aW5ncy5zdWNjZXNzKXtsYWJlbC50ZXh0KCIiKTt0eXBlb2YgdGhpcy5zZXR0aW5ncy5zdWNjZXNzPT0ic3RyaW5nIj9sYWJlbC5hZGRDbGFzcyh0aGlzLnNldHRpbmdzLnN1Y2Nlc3MpOnRoaXMuc2V0dGluZ3Muc3VjY2VzcyhsYWJlbCk7fXRoaXMudG9TaG93PXRoaXMudG9TaG93LmFkZChsYWJlbCk7fSxlcnJvcnNGb3I6ZnVuY3Rpb24oZWxlbWVudCl7cmV0dXJuIHRoaXMuZXJyb3JzKCkuZmlsdGVyKCJbZm9yPSciK3RoaXMuaWRPck5hbWUoZWxlbWVudCkrIiddIik7fSxpZE9yTmFtZTpmdW5jdGlvbihlbGVtZW50KXtyZXR1cm4gdGhpcy5ncm91cHNbZWxlbWVudC5uYW1lXXx8KHRoaXMuY2hlY2thYmxlKGVsZW1lbnQpP2VsZW1lbnQubmFtZTplbGVtZW50LmlkfHxlbGVtZW50Lm5hbWUpO30sY2hlY2thYmxlOmZ1bmN0aW9uKGVsZW1lbnQpe3JldHVybi9yYWRpb3xjaGVja2JveC9pLnRlc3QoZWxlbWVudC50eXBlKTt9LGZpbmRCeU5hbWU6ZnVuY3Rpb24obmFtZSl7dmFyIGZvcm09dGhpcy5jdXJyZW50Rm9ybTtyZXR1cm4gJChkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZShuYW1lKSkubWFwKGZ1bmN0aW9uKGluZGV4LGVsZW1lbnQpe3JldHVybiBlbGVtZW50LmZvcm09PWZvcm0mJmVsZW1lbnQubmFtZT09bmFtZSYmZWxlbWVudHx8bnVsbDt9KTt9LGdldExlbmd0aDpmdW5jdGlvbih2YWx1ZSxlbGVtZW50KXtzd2l0Y2goZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXtjYXNlJ3NlbGVjdCc6cmV0dXJuICQoIm9wdGlvbjpzZWxlY3RlZCIsZWxlbWVudCkubGVuZ3RoO2Nhc2UnaW5wdXQnOmlmKHRoaXMuY2hlY2thYmxlKGVsZW1lbnQpKXJldHVybiB0aGlzLmZpbmRCeU5hbWUoZWxlbWVudC5uYW1lKS5maWx0ZXIoJzpjaGVja2VkJykubGVuZ3RoO31yZXR1cm4gdmFsdWUubGVuZ3RoO30sZGVwZW5kOmZ1bmN0aW9uKHBhcmFtLGVsZW1lbnQpe3JldHVybiB0aGlzLmRlcGVuZFR5cGVzW3R5cGVvZiBwYXJhbV0/dGhpcy5kZXBlbmRUeXBlc1t0eXBlb2YgcGFyYW1dKHBhcmFtLGVsZW1lbnQpOnRydWU7fSxkZXBlbmRUeXBlczp7ImJvb2xlYW4iOmZ1bmN0aW9uKHBhcmFtLGVsZW1lbnQpe3JldHVybiBwYXJhbTt9LCJzdHJpbmciOmZ1bmN0aW9uKHBhcmFtLGVsZW1lbnQpe3JldHVybiEhJChwYXJhbSxlbGVtZW50LmZvcm0pLmxlbmd0aDt9LCJmdW5jdGlvbiI6ZnVuY3Rpb24ocGFyYW0sZWxlbWVudCl7cmV0dXJuIHBhcmFtKGVsZW1lbnQpO319LG9wdGlvbmFsOmZ1bmN0aW9uKGVsZW1lbnQpe3JldHVybiEkLnZhbGlkYXRvci5tZXRob2RzLnJlcXVpcmVkLmNhbGwodGhpcywkLnRyaW0oZWxlbWVudC52YWx1ZSksZWxlbWVudCkmJiJkZXBlbmRlbmN5LW1pc21hdGNoIjt9LHN0YXJ0UmVxdWVzdDpmdW5jdGlvbihlbGVtZW50KXtpZighdGhpcy5wZW5kaW5nW2VsZW1lbnQubmFtZV0pe3RoaXMucGVuZGluZ1JlcXVlc3QrKzt0aGlzLnBlbmRpbmdbZWxlbWVudC5uYW1lXT10cnVlO319LHN0b3BSZXF1ZXN0OmZ1bmN0aW9uKGVsZW1lbnQsdmFsaWQpe3RoaXMucGVuZGluZ1JlcXVlc3QtLTtpZih0aGlzLnBlbmRpbmdSZXF1ZXN0PDApdGhpcy5wZW5kaW5nUmVxdWVzdD0wO2RlbGV0ZSB0aGlzLnBlbmRpbmdbZWxlbWVudC5uYW1lXTtpZih2YWxpZCYmdGhpcy5wZW5kaW5nUmVxdWVzdD09MCYmdGhpcy5mb3JtU3VibWl0dGVkJiZ0aGlzLmZvcm0oKSl7JCh0aGlzLmN1cnJlbnRGb3JtKS5zdWJtaXQoKTt9ZWxzZSBpZighdmFsaWQmJnRoaXMucGVuZGluZ1JlcXVlc3Q9PTAmJnRoaXMuZm9ybVN1Ym1pdHRlZCl7JCh0aGlzLmN1cnJlbnRGb3JtKS50cmlnZ2VySGFuZGxlcigiaW52YWxpZC1mb3JtIixbdGhpc10pO319LHByZXZpb3VzVmFsdWU6ZnVuY3Rpb24oZWxlbWVudCl7cmV0dXJuICQuZGF0YShlbGVtZW50LCJwcmV2aW91c1ZhbHVlIil8fCQuZGF0YShlbGVtZW50LCJwcmV2aW91c1ZhbHVlIixwcmV2aW91cz17b2xkOm51bGwsdmFsaWQ6dHJ1ZSxtZXNzYWdlOnRoaXMuZGVmYXVsdE1lc3NhZ2UoZWxlbWVudCwicmVtb3RlIil9KTt9fSxjbGFzc1J1bGVTZXR0aW5nczp7cmVxdWlyZWQ6e3JlcXVpcmVkOnRydWV9LGVtYWlsOntlbWFpbDp0cnVlfSx1cmw6e3VybDp0cnVlfSxkYXRlOntkYXRlOnRydWV9LGRhdGVJU086e2RhdGVJU086dHJ1ZX0sZGF0ZURFOntkYXRlREU6dHJ1ZX0sbnVtYmVyOntudW1iZXI6dHJ1ZX0sbnVtYmVyREU6e251bWJlckRFOnRydWV9LGRpZ2l0czp7ZGlnaXRzOnRydWV9LGNyZWRpdGNhcmQ6e2NyZWRpdGNhcmQ6dHJ1ZX19LGFkZENsYXNzUnVsZXM6ZnVuY3Rpb24oY2xhc3NOYW1lLHJ1bGVzKXtjbGFzc05hbWUuY29uc3RydWN0b3I9PVN0cmluZz90aGlzLmNsYXNzUnVsZVNldHRpbmdzW2NsYXNzTmFtZV09cnVsZXM6JC5leHRlbmQodGhpcy5jbGFzc1J1bGVTZXR0aW5ncyxjbGFzc05hbWUpO30sY2xhc3NSdWxlczpmdW5jdGlvbihlbGVtZW50KXt2YXIgcnVsZXM9e307dmFyIGNsYXNzZXM9JChlbGVtZW50KS5hdHRyKCdjbGFzcycpO2NsYXNzZXMmJiQuZWFjaChjbGFzc2VzLnNwbGl0KCcgJyksZnVuY3Rpb24oKXtpZih0aGlzIGluICQudmFsaWRhdG9yLmNsYXNzUnVsZVNldHRpbmdzKXskLmV4dGVuZChydWxlcywkLnZhbGlkYXRvci5jbGFzc1J1bGVTZXR0aW5nc1t0aGlzXSk7fX0pO3JldHVybiBydWxlczt9LGF0dHJpYnV0ZVJ1bGVzOmZ1bmN0aW9uKGVsZW1lbnQpe3ZhciBydWxlcz17fTt2YXIgJGVsZW1lbnQ9JChlbGVtZW50KTtmb3IobWV0aG9kIGluICQudmFsaWRhdG9yLm1ldGhvZHMpe3ZhciB2YWx1ZT0kZWxlbWVudC5hdHRyKG1ldGhvZCk7aWYodmFsdWUpe3J1bGVzW21ldGhvZF09dmFsdWU7fX1pZihydWxlcy5tYXhsZW5ndGgmJi8tMXwyMTQ3NDgzNjQ3fDUyNDI4OC8udGVzdChydWxlcy5tYXhsZW5ndGgpKXtkZWxldGUgcnVsZXMubWF4bGVuZ3RoO31yZXR1cm4gcnVsZXM7fSxtZXRhZGF0YVJ1bGVzOmZ1bmN0aW9uKGVsZW1lbnQpe2lmKCEkLm1ldGFkYXRhKXJldHVybnt9O3ZhciBtZXRhPSQuZGF0YShlbGVtZW50LmZvcm0sJ3ZhbGlkYXRvcicpLnNldHRpbmdzLm1ldGE7cmV0dXJuIG1ldGE/JChlbGVtZW50KS5tZXRhZGF0YSgpW21ldGFdOiQoZWxlbWVudCkubWV0YWRhdGEoKTt9LHN0YXRpY1J1bGVzOmZ1bmN0aW9uKGVsZW1lbnQpe3ZhciBydWxlcz17fTt2YXIgdmFsaWRhdG9yPSQuZGF0YShlbGVtZW50LmZvcm0sJ3ZhbGlkYXRvcicpO2lmKHZhbGlkYXRvci5zZXR0aW5ncy5ydWxlcyl7cnVsZXM9JC52YWxpZGF0b3Iubm9ybWFsaXplUnVsZSh2YWxpZGF0b3Iuc2V0dGluZ3MucnVsZXNbZWxlbWVudC5uYW1lXSl8fHt9O31yZXR1cm4gcnVsZXM7fSxub3JtYWxpemVSdWxlczpmdW5jdGlvbihydWxlcyxlbGVtZW50KXskLmVhY2gocnVsZXMsZnVuY3Rpb24ocHJvcCx2YWwpe2lmKHZhbD09PWZhbHNlKXtkZWxldGUgcnVsZXNbcHJvcF07cmV0dXJuO31pZih2YWwucGFyYW18fHZhbC5kZXBlbmRzKXt2YXIga2VlcFJ1bGU9dHJ1ZTtzd2l0Y2godHlwZW9mIHZhbC5kZXBlbmRzKXtjYXNlInN0cmluZyI6a2VlcFJ1bGU9ISEkKHZhbC5kZXBlbmRzLGVsZW1lbnQuZm9ybSkubGVuZ3RoO2JyZWFrO2Nhc2UiZnVuY3Rpb24iOmtlZXBSdWxlPXZhbC5kZXBlbmRzLmNhbGwoZWxlbWVudCxlbGVtZW50KTticmVhazt9aWYoa2VlcFJ1bGUpe3J1bGVzW3Byb3BdPXZhbC5wYXJhbSE9PXVuZGVmaW5lZD92YWwucGFyYW06dHJ1ZTt9ZWxzZXtkZWxldGUgcnVsZXNbcHJvcF07fX19KTskLmVhY2gocnVsZXMsZnVuY3Rpb24ocnVsZSxwYXJhbWV0ZXIpe3J1bGVzW3J1bGVdPSQuaXNGdW5jdGlvbihwYXJhbWV0ZXIpP3BhcmFtZXRlcihlbGVtZW50KTpwYXJhbWV0ZXI7fSk7JC5lYWNoKFsnbWlubGVuZ3RoJywnbWF4bGVuZ3RoJywnbWluJywnbWF4J10sZnVuY3Rpb24oKXtpZihydWxlc1t0aGlzXSl7cnVsZXNbdGhpc109TnVtYmVyKHJ1bGVzW3RoaXNdKTt9fSk7JC5lYWNoKFsncmFuZ2VsZW5ndGgnLCdyYW5nZSddLGZ1bmN0aW9uKCl7aWYocnVsZXNbdGhpc10pe3J1bGVzW3RoaXNdPVtOdW1iZXIocnVsZXNbdGhpc11bMF0pLE51bWJlcihydWxlc1t0aGlzXVsxXSldO319KTtpZigkLnZhbGlkYXRvci5hdXRvQ3JlYXRlUmFuZ2VzKXtpZihydWxlcy5taW4mJnJ1bGVzLm1heCl7cnVsZXMucmFuZ2U9W3J1bGVzLm1pbixydWxlcy5tYXhdO2RlbGV0ZSBydWxlcy5taW47ZGVsZXRlIHJ1bGVzLm1heDt9aWYocnVsZXMubWlubGVuZ3RoJiZydWxlcy5tYXhsZW5ndGgpe3J1bGVzLnJhbmdlbGVuZ3RoPVtydWxlcy5taW5sZW5ndGgscnVsZXMubWF4bGVuZ3RoXTtkZWxldGUgcnVsZXMubWlubGVuZ3RoO2RlbGV0ZSBydWxlcy5tYXhsZW5ndGg7fX1pZihydWxlcy5tZXNzYWdlcyl7ZGVsZXRlIHJ1bGVzLm1lc3NhZ2VzfXJldHVybiBydWxlczt9LG5vcm1hbGl6ZVJ1bGU6ZnVuY3Rpb24oZGF0YSl7aWYodHlwZW9mIGRhdGE9PSJzdHJpbmciKXt2YXIgdHJhbnNmb3JtZWQ9e307JC5lYWNoKGRhdGEuc3BsaXQoL1xzLyksZnVuY3Rpb24oKXt0cmFuc2Zvcm1lZFt0aGlzXT10cnVlO30pO2RhdGE9dHJhbnNmb3JtZWQ7fXJldHVybiBkYXRhO30sYWRkTWV0aG9kOmZ1bmN0aW9uKG5hbWUsbWV0aG9kLG1lc3NhZ2UpeyQudmFsaWRhdG9yLm1ldGhvZHNbbmFtZV09bWV0aG9kOyQudmFsaWRhdG9yLm1lc3NhZ2VzW25hbWVdPW1lc3NhZ2U7aWYobWV0aG9kLmxlbmd0aDwzKXskLnZhbGlkYXRvci5hZGRDbGFzc1J1bGVzKG5hbWUsJC52YWxpZGF0b3Iubm9ybWFsaXplUnVsZShuYW1lKSk7fX0sbWV0aG9kczp7cmVxdWlyZWQ6ZnVuY3Rpb24odmFsdWUsZWxlbWVudCxwYXJhbSl7aWYoIXRoaXMuZGVwZW5kKHBhcmFtLGVsZW1lbnQpKXJldHVybiJkZXBlbmRlbmN5LW1pc21hdGNoIjtzd2l0Y2goZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXtjYXNlJ3NlbGVjdCc6dmFyIG9wdGlvbnM9JCgib3B0aW9uOnNlbGVjdGVkIixlbGVtZW50KTtyZXR1cm4gb3B0aW9ucy5sZW5ndGg+MCYmKGVsZW1lbnQudHlwZT09InNlbGVjdC1tdWx0aXBsZSJ8fCgkLmJyb3dzZXIubXNpZSYmIShvcHRpb25zWzBdLmF0dHJpYnV0ZXNbJ3ZhbHVlJ10uc3BlY2lmaWVkKT9vcHRpb25zWzBdLnRleHQ6b3B0aW9uc1swXS52YWx1ZSkubGVuZ3RoPjApO2Nhc2UnaW5wdXQnOmlmKHRoaXMuY2hlY2thYmxlKGVsZW1lbnQpKXJldHVybiB0aGlzLmdldExlbmd0aCh2YWx1ZSxlbGVtZW50KT4wO2RlZmF1bHQ6cmV0dXJuICQudHJpbSh2YWx1ZSkubGVuZ3RoPjA7fX0scmVtb3RlOmZ1bmN0aW9uKHZhbHVlLGVsZW1lbnQscGFyYW0pe2lmKHRoaXMub3B0aW9uYWwoZWxlbWVudCkpcmV0dXJuImRlcGVuZGVuY3ktbWlzbWF0Y2giO3ZhciBwcmV2aW91cz10aGlzLnByZXZpb3VzVmFsdWUoZWxlbWVudCk7aWYoIXRoaXMuc2V0dGluZ3MubWVzc2FnZXNbZWxlbWVudC5uYW1lXSl0aGlzLnNldHRpbmdzLm1lc3NhZ2VzW2VsZW1lbnQubmFtZV09e307dGhpcy5zZXR0aW5ncy5tZXNzYWdlc1tlbGVtZW50Lm5hbWVdLnJlbW90ZT10eXBlb2YgcHJldmlvdXMubWVzc2FnZT09ImZ1bmN0aW9uIj9wcmV2aW91cy5tZXNzYWdlKHZhbHVlKTpwcmV2aW91cy5tZXNzYWdlO3BhcmFtPXR5cGVvZiBwYXJhbT09InN0cmluZyImJnt1cmw6cGFyYW19fHxwYXJhbTtpZihwcmV2aW91cy5vbGQhPT12YWx1ZSl7cHJldmlvdXMub2xkPXZhbHVlO3ZhciB2YWxpZGF0b3I9dGhpczt0aGlzLnN0YXJ0UmVxdWVzdChlbGVtZW50KTt2YXIgZGF0YT17fTtkYXRhW2VsZW1lbnQubmFtZV09dmFsdWU7JC5hamF4KCQuZXh0ZW5kKHRydWUse3VybDpwYXJhbSxtb2RlOiJhYm9ydCIscG9ydDoidmFsaWRhdGUiK2VsZW1lbnQubmFtZSxkYXRhVHlwZToianNvbiIsZGF0YTpkYXRhLHN1Y2Nlc3M6ZnVuY3Rpb24ocmVzcG9uc2Upe2lmKHJlc3BvbnNlKXt2YXIgc3VibWl0dGVkPXZhbGlkYXRvci5mb3JtU3VibWl0dGVkO3ZhbGlkYXRvci5wcmVwYXJlRWxlbWVudChlbGVtZW50KTt2YWxpZGF0b3IuZm9ybVN1Ym1pdHRlZD1zdWJtaXR0ZWQ7dmFsaWRhdG9yLnN1Y2Nlc3NMaXN0LnB1c2goZWxlbWVudCk7dmFsaWRhdG9yLnNob3dFcnJvcnMoKTt9ZWxzZXt2YXIgZXJyb3JzPXt9O2Vycm9yc1tlbGVtZW50Lm5hbWVdPXJlc3BvbnNlfHx2YWxpZGF0b3IuZGVmYXVsdE1lc3NhZ2UoZWxlbWVudCwicmVtb3RlIik7dmFsaWRhdG9yLnNob3dFcnJvcnMoZXJyb3JzKTt9cHJldmlvdXMudmFsaWQ9cmVzcG9uc2U7dmFsaWRhdG9yLnN0b3BSZXF1ZXN0KGVsZW1lbnQscmVzcG9uc2UpO319LHBhcmFtKSk7cmV0dXJuInBlbmRpbmciO31lbHNlIGlmKHRoaXMucGVuZGluZ1tlbGVtZW50Lm5hbWVdKXtyZXR1cm4icGVuZGluZyI7fXJldHVybiBwcmV2aW91cy52YWxpZDt9LG1pbmxlbmd0aDpmdW5jdGlvbih2YWx1ZSxlbGVtZW50LHBhcmFtKXtyZXR1cm4gdGhpcy5vcHRpb25hbChlbGVtZW50KXx8dGhpcy5nZXRMZW5ndGgoJC50cmltKHZhbHVlKSxlbGVtZW50KT49cGFyYW07fSxtYXhsZW5ndGg6ZnVuY3Rpb24odmFsdWUsZWxlbWVudCxwYXJhbSl7cmV0dXJuIHRoaXMub3B0aW9uYWwoZWxlbWVudCl8fHRoaXMuZ2V0TGVuZ3RoKCQudHJpbSh2YWx1ZSksZWxlbWVudCk8PXBhcmFtO30scmFuZ2VsZW5ndGg6ZnVuY3Rpb24odmFsdWUsZWxlbWVudCxwYXJhbSl7dmFyIGxlbmd0aD10aGlzLmdldExlbmd0aCgkLnRyaW0odmFsdWUpLGVsZW1lbnQpO3JldHVybiB0aGlzLm9wdGlvbmFsKGVsZW1lbnQpfHwobGVuZ3RoPj1wYXJhbVswXSYmbGVuZ3RoPD1wYXJhbVsxXSk7fSxtaW46ZnVuY3Rpb24odmFsdWUsZWxlbWVudCxwYXJhbSl7cmV0dXJuIHRoaXMub3B0aW9uYWwoZWxlbWVudCl8fHZhbHVlPj1wYXJhbTt9LG1heDpmdW5jdGlvbih2YWx1ZSxlbGVtZW50LHBhcmFtKXtyZXR1cm4gdGhpcy5vcHRpb25hbChlbGVtZW50KXx8dmFsdWU8PXBhcmFtO30scmFuZ2U6ZnVuY3Rpb24odmFsdWUsZWxlbWVudCxwYXJhbSl7cmV0dXJuIHRoaXMub3B0aW9uYWwoZWxlbWVudCl8fCh2YWx1ZT49cGFyYW1bMF0mJnZhbHVlPD1wYXJhbVsxXSk7fSxlbWFpbDpmdW5jdGlvbih2YWx1ZSxlbGVtZW50KXtyZXR1cm4gdGhpcy5vcHRpb25hbChlbGVtZW50KXx8L14oKChbYS16XXxcZHxbISNcJCUmJ1wqXCtcLVwvPVw/XF5fYHtcfH1+XXxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSkrKFwuKFthLXpdfFxkfFshI1wkJSYnXCpcK1wtXC89XD9cXl9ge1x8fX5dfFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKSspKil8KChceDIyKSgoKChceDIwfFx4MDkpKihceDBkXHgwYSkpPyhceDIwfFx4MDkpKyk/KChbXHgwMS1ceDA4XHgwYlx4MGNceDBlLVx4MWZceDdmXXxceDIxfFtceDIzLVx4NWJdfFtceDVkLVx4N2VdfFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKXwoXFwoW1x4MDEtXHgwOVx4MGJceDBjXHgwZC1ceDdmXXxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSkpKSkqKCgoXHgyMHxceDA5KSooXHgwZFx4MGEpKT8oXHgyMHxceDA5KSspPyhceDIyKSkpQCgoKFthLXpdfFxkfFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKXwoKFthLXpdfFxkfFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKShbYS16XXxcZHwtfFwufF98fnxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSkqKFthLXpdfFxkfFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKSkpXC4pKygoW2Etel18W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pfCgoW2Etel18W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pKFthLXpdfFxkfC18XC58X3x+fFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKSooW2Etel18W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pKSlcLj8kL2kudGVzdCh2YWx1ZSk7fSx1cmw6ZnVuY3Rpb24odmFsdWUsZWxlbWVudCl7cmV0dXJuIHRoaXMub3B0aW9uYWwoZWxlbWVudCl8fC9eKGh0dHBzP3xmdHApOlwvXC8oKCgoW2Etel18XGR8LXxcLnxffH58W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pfCglW1xkYS1mXXsyfSl8WyFcJCYnXChcKVwqXCssOz1dfDopKkApPygoKFxkfFsxLTldXGR8MVxkXGR8MlswLTRdXGR8MjVbMC01XSlcLihcZHxbMS05XVxkfDFcZFxkfDJbMC00XVxkfDI1WzAtNV0pXC4oXGR8WzEtOV1cZHwxXGRcZHwyWzAtNF1cZHwyNVswLTVdKVwuKFxkfFsxLTldXGR8MVxkXGR8MlswLTRdXGR8MjVbMC01XSkpfCgoKFthLXpdfFxkfFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKXwoKFthLXpdfFxkfFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKShbYS16XXxcZHwtfFwufF98fnxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSkqKFthLXpdfFxkfFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKSkpXC4pKygoW2Etel18W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pfCgoW2Etel18W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pKFthLXpdfFxkfC18XC58X3x+fFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKSooW2Etel18W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pKSlcLj8pKDpcZCopPykoXC8oKChbYS16XXxcZHwtfFwufF98fnxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSl8KCVbXGRhLWZdezJ9KXxbIVwkJidcKFwpXCpcKyw7PV18OnxAKSsoXC8oKFthLXpdfFxkfC18XC58X3x+fFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKXwoJVtcZGEtZl17Mn0pfFshXCQmJ1woXClcKlwrLDs9XXw6fEApKikqKT8pPyhcPygoKFthLXpdfFxkfC18XC58X3x+fFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKXwoJVtcZGEtZl17Mn0pfFshXCQmJ1woXClcKlwrLDs9XXw6fEApfFtcdUUwMDAtXHVGOEZGXXxcL3xcPykqKT8oXCMoKChbYS16XXxcZHwtfFwufF98fnxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSl8KCVbXGRhLWZdezJ9KXxbIVwkJidcKFwpXCpcKyw7PV18OnxAKXxcL3xcPykqKT8kL2kudGVzdCh2YWx1ZSk7fSxkYXRlOmZ1bmN0aW9uKHZhbHVlLGVsZW1lbnQpe3JldHVybiB0aGlzLm9wdGlvbmFsKGVsZW1lbnQpfHwhL0ludmFsaWR8TmFOLy50ZXN0KG5ldyBEYXRlKHZhbHVlKSk7fSxkYXRlSVNPOmZ1bmN0aW9uKHZhbHVlLGVsZW1lbnQpe3JldHVybiB0aGlzLm9wdGlvbmFsKGVsZW1lbnQpfHwvXlxkezR9W1wvLV1cZHsxLDJ9W1wvLV1cZHsxLDJ9JC8udGVzdCh2YWx1ZSk7fSxkYXRlREU6ZnVuY3Rpb24odmFsdWUsZWxlbWVudCl7cmV0dXJuIHRoaXMub3B0aW9uYWwoZWxlbWVudCl8fC9eXGRcZD9cLlxkXGQ/XC5cZFxkXGQ/XGQ/JC8udGVzdCh2YWx1ZSk7fSxudW1iZXI6ZnVuY3Rpb24odmFsdWUsZWxlbWVudCl7cmV0dXJuIHRoaXMub3B0aW9uYWwoZWxlbWVudCl8fC9eLT8oPzpcZCt8XGR7MSwzfSg/OixcZHszfSkrKSg/OlwuXGQrKT8kLy50ZXN0KHZhbHVlKTt9LG51bWJlckRFOmZ1bmN0aW9uKHZhbHVlLGVsZW1lbnQpe3JldHVybiB0aGlzLm9wdGlvbmFsKGVsZW1lbnQpfHwvXi0/KD86XGQrfFxkezEsM30oPzpcLlxkezN9KSspKD86LFxkKyk/JC8udGVzdCh2YWx1ZSk7fSxkaWdpdHM6ZnVuY3Rpb24odmFsdWUsZWxlbWVudCl7cmV0dXJuIHRoaXMub3B0aW9uYWwoZWxlbWVudCl8fC9eXGQrJC8udGVzdCh2YWx1ZSk7fSxjcmVkaXRjYXJkOmZ1bmN0aW9uKHZhbHVlLGVsZW1lbnQpe2lmKHRoaXMub3B0aW9uYWwoZWxlbWVudCkpcmV0dXJuImRlcGVuZGVuY3ktbWlzbWF0Y2giO2lmKC9bXjAtOS1dKy8udGVzdCh2YWx1ZSkpcmV0dXJuIGZhbHNlO3ZhciBuQ2hlY2s9MCxuRGlnaXQ9MCxiRXZlbj1mYWxzZTt2YWx1ZT12YWx1ZS5yZXBsYWNlKC9cRC9nLCIiKTtmb3Iobj12YWx1ZS5sZW5ndGgtMTtuPj0wO24tLSl7dmFyIGNEaWdpdD12YWx1ZS5jaGFyQXQobik7dmFyIG5EaWdpdD1wYXJzZUludChjRGlnaXQsMTApO2lmKGJFdmVuKXtpZigobkRpZ2l0Kj0yKT45KW5EaWdpdC09OTt9bkNoZWNrKz1uRGlnaXQ7YkV2ZW49IWJFdmVuO31yZXR1cm4obkNoZWNrJTEwKT09MDt9LGFjY2VwdDpmdW5jdGlvbih2YWx1ZSxlbGVtZW50LHBhcmFtKXtwYXJhbT10eXBlb2YgcGFyYW09PSJzdHJpbmciP3BhcmFtOiJwbmd8anBlP2d8Z2lmIjtyZXR1cm4gdGhpcy5vcHRpb25hbChlbGVtZW50KXx8dmFsdWUubWF0Y2gobmV3IFJlZ0V4cCgiLigiK3BhcmFtKyIpJCIsImkiKSk7fSxlcXVhbFRvOmZ1bmN0aW9uKHZhbHVlLGVsZW1lbnQscGFyYW0pe3JldHVybiB2YWx1ZT09JChwYXJhbSkudmFsKCk7fX19KTt9KShqUXVlcnkpOzsoZnVuY3Rpb24oJCl7dmFyIGFqYXg9JC5hamF4O3ZhciBwZW5kaW5nUmVxdWVzdHM9e307JC5hamF4PWZ1bmN0aW9uKHNldHRpbmdzKXtzZXR0aW5ncz0kLmV4dGVuZChzZXR0aW5ncywkLmV4dGVuZCh7fSwkLmFqYXhTZXR0aW5ncyxzZXR0aW5ncykpO3ZhciBwb3J0PXNldHRpbmdzLnBvcnQ7aWYoc2V0dGluZ3MubW9kZT09ImFib3J0Iil7aWYocGVuZGluZ1JlcXVlc3RzW3BvcnRdKXtwZW5kaW5nUmVxdWVzdHNbcG9ydF0uYWJvcnQoKTt9cmV0dXJuKHBlbmRpbmdSZXF1ZXN0c1twb3J0XT1hamF4LmFwcGx5KHRoaXMsYXJndW1lbnRzKSk7fXJldHVybiBhamF4LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9O30pKGpRdWVyeSk7OyhmdW5jdGlvbigkKXskLmVhY2goe2ZvY3VzOidmb2N1c2luJyxibHVyOidmb2N1c291dCd9LGZ1bmN0aW9uKG9yaWdpbmFsLGZpeCl7JC5ldmVudC5zcGVjaWFsW2ZpeF09e3NldHVwOmZ1bmN0aW9uKCl7aWYoJC5icm93c2VyLm1zaWUpcmV0dXJuIGZhbHNlO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcihvcmlnaW5hbCwkLmV2ZW50LnNwZWNpYWxbZml4XS5oYW5kbGVyLHRydWUpO30sdGVhcmRvd246ZnVuY3Rpb24oKXtpZigkLmJyb3dzZXIubXNpZSlyZXR1cm4gZmFsc2U7dGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG9yaWdpbmFsLCQuZXZlbnQuc3BlY2lhbFtmaXhdLmhhbmRsZXIsdHJ1ZSk7fSxoYW5kbGVyOmZ1bmN0aW9uKGUpe2FyZ3VtZW50c1swXT0kLmV2ZW50LmZpeChlKTthcmd1bWVudHNbMF0udHlwZT1maXg7cmV0dXJuICQuZXZlbnQuaGFuZGxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9fTt9KTskLmV4dGVuZCgkLmZuLHtkZWxlZ2F0ZTpmdW5jdGlvbih0eXBlLGRlbGVnYXRlLGhhbmRsZXIpe3JldHVybiB0aGlzLmJpbmQodHlwZSxmdW5jdGlvbihldmVudCl7dmFyIHRhcmdldD0kKGV2ZW50LnRhcmdldCk7aWYodGFyZ2V0LmlzKGRlbGVnYXRlKSl7cmV0dXJuIGhhbmRsZXIuYXBwbHkodGFyZ2V0LGFyZ3VtZW50cyk7fX0pO30sdHJpZ2dlckV2ZW50OmZ1bmN0aW9uKHR5cGUsdGFyZ2V0KXtyZXR1cm4gdGhpcy50cmlnZ2VySGFuZGxlcih0eXBlLFskLmV2ZW50LmZpeCh7dHlwZTp0eXBlLHRhcmdldDp0YXJnZXR9KV0pO319KX0pKGpRdWVyeSk7DQooZnVuY3Rpb24oKXt2YXIgJCQ7JCQ9alF1ZXJ5LmZuLmZsYXNoPWZ1bmN0aW9uKGh0bWxPcHRpb25zLHBsdWdpbk9wdGlvbnMscmVwbGFjZSx1cGRhdGUpe3ZhciBibG9jaz1yZXBsYWNlfHwkJC5yZXBsYWNlO3BsdWdpbk9wdGlvbnM9JCQuY29weSgkJC5wbHVnaW5PcHRpb25zLHBsdWdpbk9wdGlvbnMpO2lmKCEkJC5oYXNGbGFzaChwbHVnaW5PcHRpb25zLnZlcnNpb24pKXtpZihwbHVnaW5PcHRpb25zLmV4cHJlc3NJbnN0YWxsJiYkJC5oYXNGbGFzaCg2LDAsNjUpKXt2YXIgZXhwcmVzc0luc3RhbGxPcHRpb25zPXtmbGFzaHZhcnM6e01NcmVkaXJlY3RVUkw6bG9jYXRpb24sTU1wbGF5ZXJUeXBlOidQbHVnSW4nLE1NZG9jdGl0bGU6alF1ZXJ5KCd0aXRsZScpLnRleHQoKX19O31lbHNlIGlmKHBsdWdpbk9wdGlvbnMudXBkYXRlKXtibG9jaz11cGRhdGV8fCQkLnVwZGF0ZTt9ZWxzZXtyZXR1cm4gdGhpczt9fQ0KaHRtbE9wdGlvbnM9JCQuY29weSgkJC5odG1sT3B0aW9ucyxleHByZXNzSW5zdGFsbE9wdGlvbnMsaHRtbE9wdGlvbnMpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtibG9jay5jYWxsKHRoaXMsJCQuY29weShodG1sT3B0aW9ucykpO30pO307JCQuY29weT1mdW5jdGlvbigpe3ZhciBvcHRpb25zPXt9LGZsYXNodmFycz17fTtmb3IodmFyIGk9MDtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXt2YXIgYXJnPWFyZ3VtZW50c1tpXTtpZihhcmc9PXVuZGVmaW5lZCljb250aW51ZTtqUXVlcnkuZXh0ZW5kKG9wdGlvbnMsYXJnKTtpZihhcmcuZmxhc2h2YXJzPT11bmRlZmluZWQpY29udGludWU7alF1ZXJ5LmV4dGVuZChmbGFzaHZhcnMsYXJnLmZsYXNodmFycyk7fQ0Kb3B0aW9ucy5mbGFzaHZhcnM9Zmxhc2h2YXJzO3JldHVybiBvcHRpb25zO307JCQuaGFzRmxhc2g9ZnVuY3Rpb24oKXtpZigvaGFzRmxhc2hcPXRydWUvLnRlc3QobG9jYXRpb24pKXJldHVybiB0cnVlO2lmKC9oYXNGbGFzaFw9ZmFsc2UvLnRlc3QobG9jYXRpb24pKXJldHVybiBmYWxzZTt2YXIgcHY9JCQuaGFzRmxhc2gucGxheWVyVmVyc2lvbigpLm1hdGNoKC9cZCsvZyk7dmFyIHJ2PVN0cmluZyhbYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl1dKS5tYXRjaCgvXGQrL2cpfHxTdHJpbmcoJCQucGx1Z2luT3B0aW9ucy52ZXJzaW9uKS5tYXRjaCgvXGQrL2cpO2Zvcih2YXIgaT0wO2k8MztpKyspe3B2W2ldPXBhcnNlSW50KHB2W2ldfHwwKTtydltpXT1wYXJzZUludChydltpXXx8MCk7aWYocHZbaV08cnZbaV0pcmV0dXJuIGZhbHNlO2lmKHB2W2ldPnJ2W2ldKXJldHVybiB0cnVlO30NCnJldHVybiB0cnVlO307JCQuaGFzRmxhc2gucGxheWVyVmVyc2lvbj1mdW5jdGlvbigpe3RyeXt0cnl7dmFyIGF4bz1uZXcgQWN0aXZlWE9iamVjdCgnU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2guNicpO3RyeXtheG8uQWxsb3dTY3JpcHRBY2Nlc3M9J2Fsd2F5cyc7fQ0KY2F0Y2goZSl7cmV0dXJuJzYsMCwwJzt9fWNhdGNoKGUpe30NCnJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2gnKS5HZXRWYXJpYWJsZSgnJHZlcnNpb24nKS5yZXBsYWNlKC9cRCsvZywnLCcpLm1hdGNoKC9eLD8oLispLD8kLylbMV07fWNhdGNoKGUpe3RyeXtpZihuYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdLmVuYWJsZWRQbHVnaW4pe3JldHVybihuYXZpZ2F0b3IucGx1Z2luc1siU2hvY2t3YXZlIEZsYXNoIDIuMCJdfHxuYXZpZ2F0b3IucGx1Z2luc1siU2hvY2t3YXZlIEZsYXNoIl0pLmRlc2NyaXB0aW9uLnJlcGxhY2UoL1xEKy9nLCIsIikubWF0Y2goL14sPyguKyksPyQvKVsxXTt9fWNhdGNoKGUpe319DQpyZXR1cm4nMCwwLDAnO307JCQuaHRtbE9wdGlvbnM9e2hlaWdodDoyNDAsZmxhc2h2YXJzOnt9LHBsdWdpbnNwYWdlOidodHRwOi8vd3d3LmFkb2JlLmNvbS9nby9nZXRmbGFzaHBsYXllcicsc3JjOicjJyx0eXBlOidhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCcsd2lkdGg6MzIwfTskJC5wbHVnaW5PcHRpb25zPXtleHByZXNzSW5zdGFsbDpmYWxzZSx1cGRhdGU6dHJ1ZSx2ZXJzaW9uOic2LjAuNjUnfTskJC5yZXBsYWNlPWZ1bmN0aW9uKGh0bWxPcHRpb25zKXt0aGlzLmlubmVySFRNTD0nPGRpdiBjbGFzcz0iYWx0Ij4nK3RoaXMuaW5uZXJIVE1MKyc8L2Rpdj4nO2pRdWVyeSh0aGlzKS5hZGRDbGFzcygnZmxhc2gtcmVwbGFjZWQnKS5wcmVwZW5kKCQkLnRyYW5zZm9ybShodG1sT3B0aW9ucykpO307JCQudXBkYXRlPWZ1bmN0aW9uKGh0bWxPcHRpb25zKXt2YXIgdXJsPVN0cmluZyhsb2NhdGlvbikuc3BsaXQoJz8nKTt1cmwuc3BsaWNlKDEsMCwnP2hhc0ZsYXNoPXRydWUmJyk7dXJsPXVybC5qb2luKCcnKTt2YXIgbXNnPSc8cD5UaGlzIGNvbnRlbnQgcmVxdWlyZXMgdGhlIEZsYXNoIFBsYXllci4gPGEgaHJlZj0iaHR0cDovL3d3dy5hZG9iZS5jb20vZ28vZ2V0Zmxhc2hwbGF5ZXIiPkRvd25sb2FkIEZsYXNoIFBsYXllcjwvYT4uIEFscmVhZHkgaGF2ZSBGbGFzaCBQbGF5ZXI/IDxhIGhyZWY9IicrdXJsKyciPkNsaWNrIGhlcmUuPC9hPjwvcD4nO3RoaXMuaW5uZXJIVE1MPSc8c3BhbiBjbGFzcz0iYWx0Ij4nK3RoaXMuaW5uZXJIVE1MKyc8L3NwYW4+JztqUXVlcnkodGhpcykuYWRkQ2xhc3MoJ2ZsYXNoLXVwZGF0ZScpLnByZXBlbmQobXNnKTt9O2Z1bmN0aW9uIHRvQXR0cmlidXRlU3RyaW5nKCl7dmFyIHM9Jyc7Zm9yKHZhciBrZXkgaW4gdGhpcykNCmlmKHR5cGVvZiB0aGlzW2tleV0hPSdmdW5jdGlvbicpcys9a2V5Kyc9IicrdGhpc1trZXldKyciICc7cmV0dXJuIHM7fTtmdW5jdGlvbiB0b0ZsYXNodmFyc1N0cmluZygpe3ZhciBzPScnO2Zvcih2YXIga2V5IGluIHRoaXMpDQppZih0eXBlb2YgdGhpc1trZXldIT0nZnVuY3Rpb24nKXMrPWtleSsnPScrZW5jb2RlVVJJQ29tcG9uZW50KHRoaXNba2V5XSkrJyYnO3JldHVybiBzLnJlcGxhY2UoLyYkLywnJyk7fTskJC50cmFuc2Zvcm09ZnVuY3Rpb24oaHRtbE9wdGlvbnMpe2h0bWxPcHRpb25zLnRvU3RyaW5nPXRvQXR0cmlidXRlU3RyaW5nO2lmKGh0bWxPcHRpb25zLmZsYXNodmFycylodG1sT3B0aW9ucy5mbGFzaHZhcnMudG9TdHJpbmc9dG9GbGFzaHZhcnNTdHJpbmc7cmV0dXJuJzxlbWJlZCAnK1N0cmluZyhodG1sT3B0aW9ucykrJy8+Jzt9O2lmKHdpbmRvdy5hdHRhY2hFdmVudCl7d2luZG93LmF0dGFjaEV2ZW50KCJvbmJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXtfX2ZsYXNoX3VubG9hZEhhbmRsZXI9ZnVuY3Rpb24oKXt9O19fZmxhc2hfc2F2ZWRVbmxvYWRIYW5kbGVyPWZ1bmN0aW9uKCl7fTt9KTt9fSkoKTsoZnVuY3Rpb24oJCl7JC5mbi5saWdodEJveD1mdW5jdGlvbihzZXR0aW5ncyl7c2V0dGluZ3M9alF1ZXJ5LmV4dGVuZCh7b3ZlcmxheUJnQ29sb3I6JyMwMDAnLG92ZXJsYXlPcGFjaXR5OjAuOCxmaXhlZE5hdmlnYXRpb246ZmFsc2UsaW1hZ2VMb2FkaW5nOidTY3JpcHRzL2xpZ2h0Ym94L2ltYWdlcy9saWdodGJveC1pY28tbG9hZGluZy5naWYnLGltYWdlQnRuUHJldjonU2NyaXB0cy9saWdodGJveC9pbWFnZXMvbGlnaHRib3gtYnRuLXByZXYuZ2lmJyxpbWFnZUJ0bk5leHQ6J1NjcmlwdHMvbGlnaHRib3gvaW1hZ2VzL2xpZ2h0Ym94LWJ0bi1uZXh0LmdpZicsaW1hZ2VCdG5DbG9zZTonU2NyaXB0cy9saWdodGJveC9pbWFnZXMvbGlnaHRib3gtYnRuLWNsb3NlLmdpZicsaW1hZ2VCbGFuazonU2NyaXB0cy9saWdodGJveC9pbWFnZXMvbGlnaHRib3gtYmxhbmsuZ2lmJyxjb250YWluZXJCb3JkZXJTaXplOjEwLGNvbnRhaW5lclJlc2l6ZVNwZWVkOjQwMCx0eHRJbWFnZTonSW1hZ2UnLHR4dE9mOidvZicsa2V5VG9DbG9zZTonYycsa2V5VG9QcmV2OidwJyxrZXlUb05leHQ6J24nLGltYWdlQXJyYXk6W10sYWN0aXZlSW1hZ2U6MH0sc2V0dGluZ3MpO3ZhciBqUXVlcnlNYXRjaGVkT2JqPXRoaXM7ZnVuY3Rpb24gX2luaXRpYWxpemUoKXtfc3RhcnQodGhpcyxqUXVlcnlNYXRjaGVkT2JqKTtyZXR1cm4gZmFsc2U7fQ0KZnVuY3Rpb24gX3N0YXJ0KG9iakNsaWNrZWQsalF1ZXJ5TWF0Y2hlZE9iail7JCgnLm1lYXN1cmVkTEFZT1VULCBlbWJlZCwgb2JqZWN0LCBzZWxlY3QnKS5jc3Moeyd2aXNpYmlsaXR5JzonaGlkZGVuJ30pO19zZXRfaW50ZXJmYWNlKCk7c2V0dGluZ3MuaW1hZ2VBcnJheS5sZW5ndGg9MDtzZXR0aW5ncy5hY3RpdmVJbWFnZT0wO2lmKGpRdWVyeU1hdGNoZWRPYmoubGVuZ3RoPT0xKXtzZXR0aW5ncy5pbWFnZUFycmF5LnB1c2gobmV3IEFycmF5KG9iakNsaWNrZWQuZ2V0QXR0cmlidXRlKCdocmVmJyksb2JqQ2xpY2tlZC5nZXRBdHRyaWJ1dGUoJ3RpdGxlJykpKTt9ZWxzZXtmb3IodmFyIGk9MDtpPGpRdWVyeU1hdGNoZWRPYmoubGVuZ3RoO2krKyl7c2V0dGluZ3MuaW1hZ2VBcnJheS5wdXNoKG5ldyBBcnJheShqUXVlcnlNYXRjaGVkT2JqW2ldLmdldEF0dHJpYnV0ZSgnaHJlZicpLGpRdWVyeU1hdGNoZWRPYmpbaV0uZ2V0QXR0cmlidXRlKCd0aXRsZScpKSk7fX0NCndoaWxlKHNldHRpbmdzLmltYWdlQXJyYXlbc2V0dGluZ3MuYWN0aXZlSW1hZ2VdWzBdIT1vYmpDbGlja2VkLmdldEF0dHJpYnV0ZSgnaHJlZicpKXtzZXR0aW5ncy5hY3RpdmVJbWFnZSsrO30NCl9zZXRfaW1hZ2VfdG9fdmlldygpO30NCmZ1bmN0aW9uIF9zZXRfaW50ZXJmYWNlKCl7JCgnYm9keScpLmFwcGVuZCgnPGRpdiBpZD0ianF1ZXJ5LW92ZXJsYXkiPjwvZGl2PjxkaXYgaWQ9ImpxdWVyeS1saWdodGJveCI+PGRpdiBpZD0ibGlnaHRib3gtY29udGFpbmVyLWltYWdlLWJveCI+PGRpdiBpZD0ibGlnaHRib3gtY29udGFpbmVyLWltYWdlIj48aW1nIGlkPSJsaWdodGJveC1pbWFnZSI+PGRpdiBzdHlsZT0iIiBpZD0ibGlnaHRib3gtbmF2Ij48YSAgaWQ9ImxpZ2h0Ym94LW5hdi1idG5QcmV2Ij48L2E+PGEgIGlkPSJsaWdodGJveC1uYXYtYnRuTmV4dCI+PC9hPjwvZGl2PjxkaXYgaWQ9ImxpZ2h0Ym94LWxvYWRpbmciPjxhICBpZD0ibGlnaHRib3gtbG9hZGluZy1saW5rIj48aW1nIHNyYz0iJytzZXR0aW5ncy5pbWFnZUxvYWRpbmcrJyI+PC9hPjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgaWQ9ImxpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1kYXRhLWJveCI+PGRpdiBpZD0ibGlnaHRib3gtY29udGFpbmVyLWltYWdlLWRhdGEiPjxkaXYgaWQ9ImxpZ2h0Ym94LWltYWdlLWRldGFpbHMiPjxzcGFuIGlkPSJsaWdodGJveC1pbWFnZS1kZXRhaWxzLWNhcHRpb24iPjwvc3Bhbj48c3BhbiBpZD0ibGlnaHRib3gtaW1hZ2UtZGV0YWlscy1jdXJyZW50TnVtYmVyIj48L3NwYW4+PC9kaXY+PGRpdiBpZD0ibGlnaHRib3gtc2VjTmF2Ij48YSAgaWQ9ImxpZ2h0Ym94LXNlY05hdi1idG5DbG9zZSI+PGltZyBzcmM9Iicrc2V0dGluZ3MuaW1hZ2VCdG5DbG9zZSsnIj48L2E+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+Jyk7dmFyIGFyclBhZ2VTaXplcz1fX19nZXRQYWdlU2l6ZSgpOyQoJyNqcXVlcnktb3ZlcmxheScpLmNzcyh7YmFja2dyb3VuZENvbG9yOnNldHRpbmdzLm92ZXJsYXlCZ0NvbG9yLG9wYWNpdHk6c2V0dGluZ3Mub3ZlcmxheU9wYWNpdHksd2lkdGg6YXJyUGFnZVNpemVzWzBdLGhlaWdodDphcnJQYWdlU2l6ZXNbMV19KS5mYWRlSW4oKTt2YXIgYXJyUGFnZVNjcm9sbD1fX19nZXRQYWdlU2Nyb2xsKCk7JCgnI2pxdWVyeS1saWdodGJveCcpLmNzcyh7dG9wOmFyclBhZ2VTY3JvbGxbMV0rKGFyclBhZ2VTaXplc1szXS8xMCksbGVmdDphcnJQYWdlU2Nyb2xsWzBdfSkuc2hvdygpOyQoJyNqcXVlcnktb3ZlcmxheSwjanF1ZXJ5LWxpZ2h0Ym94JykuY2xpY2soZnVuY3Rpb24oKXtfZmluaXNoKCk7fSk7JCgnI2xpZ2h0Ym94LWxvYWRpbmctbGluaywjbGlnaHRib3gtc2VjTmF2LWJ0bkNsb3NlJykuY2xpY2soZnVuY3Rpb24oKXtfZmluaXNoKCk7cmV0dXJuIGZhbHNlO30pOyQod2luZG93KS5yZXNpemUoZnVuY3Rpb24oKXt2YXIgYXJyUGFnZVNpemVzPV9fX2dldFBhZ2VTaXplKCk7JCgnI2pxdWVyeS1vdmVybGF5JykuY3NzKHt3aWR0aDphcnJQYWdlU2l6ZXNbMF0saGVpZ2h0OmFyclBhZ2VTaXplc1sxXX0pO3ZhciBhcnJQYWdlU2Nyb2xsPV9fX2dldFBhZ2VTY3JvbGwoKTskKCcjanF1ZXJ5LWxpZ2h0Ym94JykuY3NzKHt0b3A6YXJyUGFnZVNjcm9sbFsxXSsoYXJyUGFnZVNpemVzWzNdLzEwKSxsZWZ0OmFyclBhZ2VTY3JvbGxbMF19KTt9KTt9DQpmdW5jdGlvbiBfc2V0X2ltYWdlX3RvX3ZpZXcoKXskKCcjbGlnaHRib3gtbG9hZGluZycpLnNob3coKTtpZihzZXR0aW5ncy5maXhlZE5hdmlnYXRpb24peyQoJyNsaWdodGJveC1pbWFnZSwjbGlnaHRib3gtY29udGFpbmVyLWltYWdlLWRhdGEtYm94LCNsaWdodGJveC1pbWFnZS1kZXRhaWxzLWN1cnJlbnROdW1iZXInKS5oaWRlKCk7fWVsc2V7JCgnI2xpZ2h0Ym94LWltYWdlLCNsaWdodGJveC1uYXYsI2xpZ2h0Ym94LW5hdi1idG5QcmV2LCNsaWdodGJveC1uYXYtYnRuTmV4dCwjbGlnaHRib3gtY29udGFpbmVyLWltYWdlLWRhdGEtYm94LCNsaWdodGJveC1pbWFnZS1kZXRhaWxzLWN1cnJlbnROdW1iZXInKS5oaWRlKCk7fQ0KdmFyIG9iakltYWdlUHJlbG9hZGVyPW5ldyBJbWFnZSgpO29iakltYWdlUHJlbG9hZGVyLm9ubG9hZD1mdW5jdGlvbigpeyQoJyNsaWdodGJveC1pbWFnZScpLmF0dHIoJ3NyYycsc2V0dGluZ3MuaW1hZ2VBcnJheVtzZXR0aW5ncy5hY3RpdmVJbWFnZV1bMF0pO19yZXNpemVfY29udGFpbmVyX2ltYWdlX2JveChvYmpJbWFnZVByZWxvYWRlci53aWR0aCxvYmpJbWFnZVByZWxvYWRlci5oZWlnaHQpO29iakltYWdlUHJlbG9hZGVyLm9ubG9hZD1mdW5jdGlvbigpe307fTtvYmpJbWFnZVByZWxvYWRlci5zcmM9c2V0dGluZ3MuaW1hZ2VBcnJheVtzZXR0aW5ncy5hY3RpdmVJbWFnZV1bMF07fTtmdW5jdGlvbiBfcmVzaXplX2NvbnRhaW5lcl9pbWFnZV9ib3goaW50SW1hZ2VXaWR0aCxpbnRJbWFnZUhlaWdodCl7dmFyIGludEN1cnJlbnRXaWR0aD0kKCcjbGlnaHRib3gtY29udGFpbmVyLWltYWdlLWJveCcpLndpZHRoKCk7dmFyIGludEN1cnJlbnRIZWlnaHQ9JCgnI2xpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1ib3gnKS5oZWlnaHQoKTt2YXIgaW50V2lkdGg9KGludEltYWdlV2lkdGgrKHNldHRpbmdzLmNvbnRhaW5lckJvcmRlclNpemUqMikpO3ZhciBpbnRIZWlnaHQ9KGludEltYWdlSGVpZ2h0KyhzZXR0aW5ncy5jb250YWluZXJCb3JkZXJTaXplKjIpKTt2YXIgaW50RGlmZlc9aW50Q3VycmVudFdpZHRoLWludFdpZHRoO3ZhciBpbnREaWZmSD1pbnRDdXJyZW50SGVpZ2h0LWludEhlaWdodDskKCcjbGlnaHRib3gtY29udGFpbmVyLWltYWdlLWJveCcpLmFuaW1hdGUoe3dpZHRoOmludFdpZHRoLGhlaWdodDppbnRIZWlnaHR9LHNldHRpbmdzLmNvbnRhaW5lclJlc2l6ZVNwZWVkLGZ1bmN0aW9uKCl7X3Nob3dfaW1hZ2UoKTt9KTtpZigoaW50RGlmZlc9PTApJiYoaW50RGlmZkg9PTApKXtpZigkLmJyb3dzZXIubXNpZSl7X19fcGF1c2UoMjUwKTt9ZWxzZXtfX19wYXVzZSgxMDApO319DQokKCcjbGlnaHRib3gtY29udGFpbmVyLWltYWdlLWRhdGEtYm94JykuY3NzKHt3aWR0aDppbnRJbWFnZVdpZHRofSk7JCgnI2xpZ2h0Ym94LW5hdi1idG5QcmV2LCNsaWdodGJveC1uYXYtYnRuTmV4dCcpLmNzcyh7aGVpZ2h0OmludEltYWdlSGVpZ2h0KyhzZXR0aW5ncy5jb250YWluZXJCb3JkZXJTaXplKjIpfSk7fTtmdW5jdGlvbiBfc2hvd19pbWFnZSgpeyQoJyNsaWdodGJveC1sb2FkaW5nJykuaGlkZSgpOyQoJyNsaWdodGJveC1pbWFnZScpLmZhZGVJbihmdW5jdGlvbigpe19zaG93X2ltYWdlX2RhdGEoKTtfc2V0X25hdmlnYXRpb24oKTt9KTtfcHJlbG9hZF9uZWlnaGJvcl9pbWFnZXMoKTt9O2Z1bmN0aW9uIF9zaG93X2ltYWdlX2RhdGEoKXskKCcjbGlnaHRib3gtY29udGFpbmVyLWltYWdlLWRhdGEtYm94Jykuc2xpZGVEb3duKCdmYXN0Jyk7JCgnI2xpZ2h0Ym94LWltYWdlLWRldGFpbHMtY2FwdGlvbicpLmhpZGUoKTtpZihzZXR0aW5ncy5pbWFnZUFycmF5W3NldHRpbmdzLmFjdGl2ZUltYWdlXVsxXSl7JCgnI2xpZ2h0Ym94LWltYWdlLWRldGFpbHMtY2FwdGlvbicpLmh0bWwoc2V0dGluZ3MuaW1hZ2VBcnJheVtzZXR0aW5ncy5hY3RpdmVJbWFnZV1bMV0pLnNob3coKTt9DQppZihzZXR0aW5ncy5pbWFnZUFycmF5Lmxlbmd0aD4xKXskKCcjbGlnaHRib3gtaW1hZ2UtZGV0YWlscy1jdXJyZW50TnVtYmVyJykuaHRtbChzZXR0aW5ncy50eHRJbWFnZSsnICcrKHNldHRpbmdzLmFjdGl2ZUltYWdlKzEpKycgJytzZXR0aW5ncy50eHRPZisnICcrc2V0dGluZ3MuaW1hZ2VBcnJheS5sZW5ndGgpLnNob3coKTt9fQ0KZnVuY3Rpb24gX3NldF9uYXZpZ2F0aW9uKCl7JCgnI2xpZ2h0Ym94LW5hdicpLnNob3coKTskKCcjbGlnaHRib3gtbmF2LWJ0blByZXYsI2xpZ2h0Ym94LW5hdi1idG5OZXh0JykuY3NzKHsnYmFja2dyb3VuZCc6J3RyYW5zcGFyZW50IHVybCgnK3NldHRpbmdzLmltYWdlQmxhbmsrJykgbm8tcmVwZWF0J30pO2lmKHNldHRpbmdzLmFjdGl2ZUltYWdlIT0wKXtpZihzZXR0aW5ncy5maXhlZE5hdmlnYXRpb24peyQoJyNsaWdodGJveC1uYXYtYnRuUHJldicpLmNzcyh7J2JhY2tncm91bmQnOid1cmwoJytzZXR0aW5ncy5pbWFnZUJ0blByZXYrJykgbGVmdCAxNSUgbm8tcmVwZWF0J30pLnVuYmluZCgpLmJpbmQoJ2NsaWNrJyxmdW5jdGlvbigpe3NldHRpbmdzLmFjdGl2ZUltYWdlPXNldHRpbmdzLmFjdGl2ZUltYWdlLTE7X3NldF9pbWFnZV90b192aWV3KCk7cmV0dXJuIGZhbHNlO30pO31lbHNleyQoJyNsaWdodGJveC1uYXYtYnRuUHJldicpLnVuYmluZCgpLmhvdmVyKGZ1bmN0aW9uKCl7JCh0aGlzKS5jc3MoeydiYWNrZ3JvdW5kJzondXJsKCcrc2V0dGluZ3MuaW1hZ2VCdG5QcmV2KycpIGxlZnQgMTUlIG5vLXJlcGVhdCd9KTt9LGZ1bmN0aW9uKCl7JCh0aGlzKS5jc3MoeydiYWNrZ3JvdW5kJzondHJhbnNwYXJlbnQgdXJsKCcrc2V0dGluZ3MuaW1hZ2VCbGFuaysnKSBuby1yZXBlYXQnfSk7fSkuc2hvdygpLmJpbmQoJ2NsaWNrJyxmdW5jdGlvbigpe3NldHRpbmdzLmFjdGl2ZUltYWdlPXNldHRpbmdzLmFjdGl2ZUltYWdlLTE7X3NldF9pbWFnZV90b192aWV3KCk7cmV0dXJuIGZhbHNlO30pO319DQppZihzZXR0aW5ncy5hY3RpdmVJbWFnZSE9KHNldHRpbmdzLmltYWdlQXJyYXkubGVuZ3RoLTEpKXtpZihzZXR0aW5ncy5maXhlZE5hdmlnYXRpb24peyQoJyNsaWdodGJveC1uYXYtYnRuTmV4dCcpLmNzcyh7J2JhY2tncm91bmQnOid1cmwoJytzZXR0aW5ncy5pbWFnZUJ0bk5leHQrJykgcmlnaHQgMTUlIG5vLXJlcGVhdCd9KS51bmJpbmQoKS5iaW5kKCdjbGljaycsZnVuY3Rpb24oKXtzZXR0aW5ncy5hY3RpdmVJbWFnZT1zZXR0aW5ncy5hY3RpdmVJbWFnZSsxO19zZXRfaW1hZ2VfdG9fdmlldygpO3JldHVybiBmYWxzZTt9KTt9ZWxzZXskKCcjbGlnaHRib3gtbmF2LWJ0bk5leHQnKS51bmJpbmQoKS5ob3ZlcihmdW5jdGlvbigpeyQodGhpcykuY3NzKHsnYmFja2dyb3VuZCc6J3VybCgnK3NldHRpbmdzLmltYWdlQnRuTmV4dCsnKSByaWdodCAxNSUgbm8tcmVwZWF0J30pO30sZnVuY3Rpb24oKXskKHRoaXMpLmNzcyh7J2JhY2tncm91bmQnOid0cmFuc3BhcmVudCB1cmwoJytzZXR0aW5ncy5pbWFnZUJsYW5rKycpIG5vLXJlcGVhdCd9KTt9KS5zaG93KCkuYmluZCgnY2xpY2snLGZ1bmN0aW9uKCl7c2V0dGluZ3MuYWN0aXZlSW1hZ2U9c2V0dGluZ3MuYWN0aXZlSW1hZ2UrMTtfc2V0X2ltYWdlX3RvX3ZpZXcoKTtyZXR1cm4gZmFsc2U7fSk7fX0NCl9lbmFibGVfa2V5Ym9hcmRfbmF2aWdhdGlvbigpO30NCmZ1bmN0aW9uIF9lbmFibGVfa2V5Ym9hcmRfbmF2aWdhdGlvbigpeyQoZG9jdW1lbnQpLmtleWRvd24oZnVuY3Rpb24ob2JqRXZlbnQpe19rZXlib2FyZF9hY3Rpb24ob2JqRXZlbnQpO30pO30NCmZ1bmN0aW9uIF9kaXNhYmxlX2tleWJvYXJkX25hdmlnYXRpb24oKXskKGRvY3VtZW50KS51bmJpbmQoKTt9DQpmdW5jdGlvbiBfa2V5Ym9hcmRfYWN0aW9uKG9iakV2ZW50KXtpZihvYmpFdmVudD09bnVsbCl7a2V5Y29kZT1ldmVudC5rZXlDb2RlO2VzY2FwZUtleT0yNzt9ZWxzZXtrZXljb2RlPW9iakV2ZW50LmtleUNvZGU7ZXNjYXBlS2V5PW9iakV2ZW50LkRPTV9WS19FU0NBUEU7fQ0Ka2V5PVN0cmluZy5mcm9tQ2hhckNvZGUoa2V5Y29kZSkudG9Mb3dlckNhc2UoKTtpZigoa2V5PT1zZXR0aW5ncy5rZXlUb0Nsb3NlKXx8KGtleT09J3gnKXx8KGtleWNvZGU9PWVzY2FwZUtleSkpe19maW5pc2goKTt9DQppZigoa2V5PT1zZXR0aW5ncy5rZXlUb1ByZXYpfHwoa2V5Y29kZT09MzcpKXtpZihzZXR0aW5ncy5hY3RpdmVJbWFnZSE9MCl7c2V0dGluZ3MuYWN0aXZlSW1hZ2U9c2V0dGluZ3MuYWN0aXZlSW1hZ2UtMTtfc2V0X2ltYWdlX3RvX3ZpZXcoKTtfZGlzYWJsZV9rZXlib2FyZF9uYXZpZ2F0aW9uKCk7fX0NCmlmKChrZXk9PXNldHRpbmdzLmtleVRvTmV4dCl8fChrZXljb2RlPT0zOSkpe2lmKHNldHRpbmdzLmFjdGl2ZUltYWdlIT0oc2V0dGluZ3MuaW1hZ2VBcnJheS5sZW5ndGgtMSkpe3NldHRpbmdzLmFjdGl2ZUltYWdlPXNldHRpbmdzLmFjdGl2ZUltYWdlKzE7X3NldF9pbWFnZV90b192aWV3KCk7X2Rpc2FibGVfa2V5Ym9hcmRfbmF2aWdhdGlvbigpO319fQ0KZnVuY3Rpb24gX3ByZWxvYWRfbmVpZ2hib3JfaW1hZ2VzKCl7aWYoKHNldHRpbmdzLmltYWdlQXJyYXkubGVuZ3RoLTEpPnNldHRpbmdzLmFjdGl2ZUltYWdlKXtvYmpOZXh0PW5ldyBJbWFnZSgpO29iak5leHQuc3JjPXNldHRpbmdzLmltYWdlQXJyYXlbc2V0dGluZ3MuYWN0aXZlSW1hZ2UrMV1bMF07fQ0KaWYoc2V0dGluZ3MuYWN0aXZlSW1hZ2U+MCl7b2JqUHJldj1uZXcgSW1hZ2UoKTtvYmpQcmV2LnNyYz1zZXR0aW5ncy5pbWFnZUFycmF5W3NldHRpbmdzLmFjdGl2ZUltYWdlLTFdWzBdO319DQpmdW5jdGlvbiBfZmluaXNoKCl7JCgnI2pxdWVyeS1saWdodGJveCcpLnJlbW92ZSgpOyQoJyNqcXVlcnktb3ZlcmxheScpLmZhZGVPdXQoZnVuY3Rpb24oKXskKCcjanF1ZXJ5LW92ZXJsYXknKS5yZW1vdmUoKTt9KTskKCcubWVhc3VyZWRMQVlPVVQsIGVtYmVkLCBvYmplY3QsIHNlbGVjdCcpLmNzcyh7J3Zpc2liaWxpdHknOid2aXNpYmxlJ30pO30NCmZ1bmN0aW9uIF9fX2dldFBhZ2VTaXplKCl7dmFyIHhTY3JvbGwseVNjcm9sbDtpZih3aW5kb3cuaW5uZXJIZWlnaHQmJndpbmRvdy5zY3JvbGxNYXhZKXt4U2Nyb2xsPXdpbmRvdy5pbm5lcldpZHRoK3dpbmRvdy5zY3JvbGxNYXhYO3lTY3JvbGw9d2luZG93LmlubmVySGVpZ2h0K3dpbmRvdy5zY3JvbGxNYXhZO31lbHNlIGlmKGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0PmRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0KXt4U2Nyb2xsPWRvY3VtZW50LmJvZHkuc2Nyb2xsV2lkdGg7eVNjcm9sbD1kb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodDt9ZWxzZXt4U2Nyb2xsPWRvY3VtZW50LmJvZHkub2Zmc2V0V2lkdGg7eVNjcm9sbD1kb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodDt9DQp2YXIgd2luZG93V2lkdGgsd2luZG93SGVpZ2h0O2lmKHNlbGYuaW5uZXJIZWlnaHQpe2lmKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCl7d2luZG93V2lkdGg9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO31lbHNle3dpbmRvd1dpZHRoPXNlbGYuaW5uZXJXaWR0aDt9DQp3aW5kb3dIZWlnaHQ9c2VsZi5pbm5lckhlaWdodDt9ZWxzZSBpZihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQmJmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpe3dpbmRvd1dpZHRoPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDt3aW5kb3dIZWlnaHQ9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDt9ZWxzZSBpZihkb2N1bWVudC5ib2R5KXt3aW5kb3dXaWR0aD1kb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoO3dpbmRvd0hlaWdodD1kb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodDt9DQppZih5U2Nyb2xsPHdpbmRvd0hlaWdodCl7cGFnZUhlaWdodD13aW5kb3dIZWlnaHQ7fWVsc2V7cGFnZUhlaWdodD15U2Nyb2xsO30NCmlmKHhTY3JvbGw8d2luZG93V2lkdGgpe3BhZ2VXaWR0aD14U2Nyb2xsO31lbHNle3BhZ2VXaWR0aD13aW5kb3dXaWR0aDt9DQphcnJheVBhZ2VTaXplPW5ldyBBcnJheShwYWdlV2lkdGgscGFnZUhlaWdodCx3aW5kb3dXaWR0aCx3aW5kb3dIZWlnaHQpO3JldHVybiBhcnJheVBhZ2VTaXplO307ZnVuY3Rpb24gX19fZ2V0UGFnZVNjcm9sbCgpe3ZhciB4U2Nyb2xsLHlTY3JvbGw7aWYoc2VsZi5wYWdlWU9mZnNldCl7eVNjcm9sbD1zZWxmLnBhZ2VZT2Zmc2V0O3hTY3JvbGw9c2VsZi5wYWdlWE9mZnNldDt9ZWxzZSBpZihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQmJmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3Ape3lTY3JvbGw9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcDt4U2Nyb2xsPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0O31lbHNlIGlmKGRvY3VtZW50LmJvZHkpe3lTY3JvbGw9ZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7eFNjcm9sbD1kb2N1bWVudC5ib2R5LnNjcm9sbExlZnQ7fQ0KYXJyYXlQYWdlU2Nyb2xsPW5ldyBBcnJheSh4U2Nyb2xsLHlTY3JvbGwpO3JldHVybiBhcnJheVBhZ2VTY3JvbGw7fTtmdW5jdGlvbiBfX19wYXVzZShtcyl7dmFyIGRhdGU9bmV3IERhdGUoKTtjdXJEYXRlPW51bGw7ZG97dmFyIGN1ckRhdGU9bmV3IERhdGUoKTt9DQp3aGlsZShjdXJEYXRlLWRhdGU8bXMpO307cmV0dXJuIHRoaXMudW5iaW5kKCdjbGljaycpLmNsaWNrKF9pbml0aWFsaXplKTt9O30pKGpRdWVyeSk7DQpqUXVlcnkudmFsaWRhdG9yLmFkZE1ldGhvZCggICAgICAgICAidmluVVMiLCAgICAgICAgIGZ1bmN0aW9uKHYpeyAgICAgICAgICAgICAgICAgaWYgKHYubGVuZ3RoICE9IDE3KSAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgICB2YXIgaSwgbiwgZCwgZiwgY2QsIGNkdjsgICAgICAgICAgICAgICAgIHZhciBMTCAgICA9IFsiQSIsIkIiLCJDIiwiRCIsIkUiLCJGIiwiRyIsIkgiLCJKIiwiSyIsIkwiLCJNIiwiTiIsIlAiLCJSIiwiUyIsIlQiLCJVIiwiViIsIlciLCJYIiwiWSIsIloiXTsgICAgICAgICAgICAgICAgIHZhciBWTCAgICA9IFsxLDIsMyw0LDUsNiw3LDgsMSwyLDMsNCw1LDcsOSwyLDMsNCw1LDYsNyw4LDldOyAgICAgICAgICAgICAgICAgdmFyIEZMICAgID0gWzgsNyw2LDUsNCwzLDIsMTAsMCw5LDgsNyw2LDUsNCwzLDJdOyAgICAgICAgICAgICAgICAgdmFyIHJzICAgID0gMDsgICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IDE3OyBpKyspeyAgICAgICAgICAgICAgICAgICAgIGYgPSBGTFtpXTsgICAgICAgICAgICAgICAgICAgICBkID0gdi5zbGljZShpLGkrMSk7ICAgICAgICAgICAgICAgICAgICAgaWYoaSA9PSA4KXsgICAgICAgICAgICAgICAgICAgICAgICAgY2R2ID0gZDsgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgaWYoIWlzTmFOKGQpKXsgICAgICAgICAgICAgICAgICAgICAgICAgZCAqPSBmOyAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICBlbHNleyAgICAgICAgICAgICAgICAgICAgICAgICBmb3IobiA9IDA7IG4gPCBMTC5sZW5ndGg7IG4rKyl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkLnRvVXBwZXJDYXNlKCkgPT09IExMW25dKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gVkxbbl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCAqPSBmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlzTmFOKGNkdikgJiYgbiA9PSA4KXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2R2ID0gTExbbl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgIHJzICs9IGQ7ICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICBjZCA9IHJzICUgMTE7ICAgICAgICAgICAgICAgICBpZihjZCA9PSAxMCl7Y2QgPSAiWCI7fSAgICAgICAgICAgICAgICAgaWYoY2QgPT0gY2R2KXtyZXR1cm4gdHJ1ZTt9ICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgIH0sICAgICAgICAgIlRoZSBzcGVjaWZpZWQgdmVoaWNsZSBpZGVudGlmaWNhdGlvbiBudW1iZXIgKFZJTikgaXMgaW52YWxpZC4iICk7IA0KDQoNCg0K]]></data>
	</file>
	<file>
	  <filename>/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[]]></data>
	</file>
	<file>
	  <filename>/index.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogRnJvbnQgY29udHJvbGxlciBmb3IgZGVmYXVsdCBNaW5pZnkgaW1wbGVtZW50YXRpb24NCiAqIA0KICogRE8gTk9UIEVESVQhIENvbmZpZ3VyZSB0aGlzIHV0aWxpdHkgdmlhIGNvbmZpZy5waHAgYW5kIGdyb3Vwc0NvbmZpZy5waHANCiAqIA0KICogQHBhY2thZ2UgTWluaWZ5DQogKi8NCg0KZGVmaW5lKCdNSU5JRllfTUlOX0RJUicsIGRpcm5hbWUoX19GSUxFX18pKTsNCg0KLy8gbG9hZCBjb25maWcNCnJlcXVpcmUgTUlOSUZZX01JTl9ESVIgLiAnL2NvbmZpZy5waHAnOw0KDQovLyBzZXR1cCBpbmNsdWRlIHBhdGgNCnNldF9pbmNsdWRlX3BhdGgoJG1pbl9saWJQYXRoIC4gUEFUSF9TRVBBUkFUT1IgLiBnZXRfaW5jbHVkZV9wYXRoKCkpOw0KDQpyZXF1aXJlICdNaW5pZnkucGhwJzsNCg0KTWluaWZ5OjokdXBsb2FkZXJIb3Vyc0JlaGluZCA9ICRtaW5fdXBsb2FkZXJIb3Vyc0JlaGluZDsNCk1pbmlmeTo6c2V0Q2FjaGUoDQogICAgaXNzZXQoJG1pbl9jYWNoZVBhdGgpID8gJG1pbl9jYWNoZVBhdGggOiAnJw0KICAgICwkbWluX2NhY2hlRmlsZUxvY2tpbmcNCik7DQoNCmlmICgkbWluX2RvY3VtZW50Um9vdCl7DQogICAgJF9TRVJWRVJbJ0RPQ1VNRU5UX1JPT1QnXSA9ICRtaW5fZG9jdW1lbnRSb290Ow0KfSBlbHNlaWYgKDAgPT09IHN0cmlwb3MoUEhQX09TLCAnd2luJykpew0KICAgIE1pbmlmeTo6c2V0RG9jUm9vdCgpOyAvLyBJSVMgbWF5IG5lZWQgaGVscA0KfQ0KDQokbWluX3NlcnZlT3B0aW9uc1snbWluaWZpZXJPcHRpb25zJ11bJ3RleHQvY3NzJ11bJ3N5bWxpbmtzJ10gPSAkbWluX3N5bWxpbmtzOw0KDQppZiAoJG1pbl9hbGxvd0RlYnVnRmxhZyAmJiBpc3NldCgkX0dFVFsnZGVidWcnXSkpew0KICAgICRtaW5fc2VydmVPcHRpb25zWydkZWJ1ZyddID0gdHJ1ZTsNCn0NCg0KaWYgKCRtaW5fZXJyb3JMb2dnZXIpew0KICAgIHJlcXVpcmVfb25jZSAnTWluaWZ5L0xvZ2dlci5waHAnOw0KICAgIGlmICh0cnVlID09PSAkbWluX2Vycm9yTG9nZ2VyKXsNCiAgICAgICAgcmVxdWlyZV9vbmNlICdGaXJlUEhQLnBocCc7DQogICAgICAgIE1pbmlmeV9Mb2dnZXI6OnNldExvZ2dlcihGaXJlUEhQOjpnZXRJbnN0YW5jZSh0cnVlKSk7DQogICAgfSBlbHNlIHsNCiAgICAgICAgTWluaWZ5X0xvZ2dlcjo6c2V0TG9nZ2VyKCRtaW5fZXJyb3JMb2dnZXIpOw0KICAgIH0NCn0NCg0KLy8gY2hlY2sgZm9yIFVSSSB2ZXJzaW9uaW5nDQppZiAocHJlZ19tYXRjaCgnLyZcXGQvJywgJF9TRVJWRVJbJ1FVRVJZX1NUUklORyddKSl7DQogICAgJG1pbl9zZXJ2ZU9wdGlvbnNbJ21heEFnZSddID0gMzE1MzYwMDA7DQp9DQppZiAoaXNzZXQoJF9HRVRbJ2cnXSkpew0KICAgIC8vIHdlbGwgbmVlZCBncm91cHMgY29uZmlnDQogICAgJG1pbl9zZXJ2ZU9wdGlvbnNbJ21pbkFwcCddWydncm91cHMnXSA9IChyZXF1aXJlIE1JTklGWV9NSU5fRElSIC4gJy9ncm91cHNDb25maWcucGhwJyk7DQp9DQppZiAoaXNzZXQoJF9HRVRbJ2YnXSkgfHwgaXNzZXQoJF9HRVRbJ2cnXSkpew0KICAgIC8vIHNlcnZlISAgIA0KICAgIE1pbmlmeTo6c2VydmUoJ01pbkFwcCcsICRtaW5fc2VydmVPcHRpb25zKTsNCiAgICAgICAgDQp9IGVsc2VpZiAoJG1pbl9lbmFibGVCdWlsZGVyKXsNCiAgICBoZWFkZXIoJ0xvY2F0aW9uOiBidWlsZGVyLycpOw0KICAgIGV4aXQoKTsNCn0gZWxzZSB7DQogICAgaGVhZGVyKCJMb2NhdGlvbjogLyIpOw0KICAgIGV4aXQoKTsNCn0NCg==]]></data>
	</file>
	<file>
	  <filename>/jsmin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICoganNtaW4ucGhwIC0gUEhQIGltcGxlbWVudGF0aW9uIG9mIERvdWdsYXMgQ3JvY2tmb3JkJ3MgSlNNaW4uDQogKg0KICogVGhpcyBpcyBwcmV0dHkgbXVjaCBhIGRpcmVjdCBwb3J0IG9mIGpzbWluLmMgdG8gUEhQIHdpdGgganVzdCBhIGZldw0KICogUEhQLXNwZWNpZmljIHBlcmZvcm1hbmNlIHR3ZWFrcy4gQWxzbywgd2hlcmVhcyBqc21pbi5jIHJlYWRzIGZyb20gc3RkaW4gYW5kDQogKiBvdXRwdXRzIHRvIHN0ZG91dCwgdGhpcyBsaWJyYXJ5IGFjY2VwdHMgYSBzdHJpbmcgYXMgaW5wdXQgYW5kIHJldHVybnMgYW5vdGhlcg0KICogc3RyaW5nIGFzIG91dHB1dC4NCiAqDQogKiBQSFAgNSBvciBoaWdoZXIgaXMgcmVxdWlyZWQuDQogKg0KICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCB0byB1c2UgdGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IHVuZGVyIHRoZQ0KICogc2FtZSB0ZXJtcyBhcyBqc21pbi5jLCB3aGljaCBoYXMgdGhlIGZvbGxvd2luZyBsaWNlbnNlOg0KICoNCiAqIC0tDQogKiBDb3B5cmlnaHQgKGMpIDIwMDIgRG91Z2xhcyBDcm9ja2ZvcmQgICh3d3cuY3JvY2tmb3JkLmNvbSkNCiAqDQogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mDQogKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbg0KICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bw0KICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMNCiAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbw0KICogc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KICoNCiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbA0KICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4NCiAqDQogKiBUaGUgU29mdHdhcmUgc2hhbGwgYmUgdXNlZCBmb3IgR29vZCwgbm90IEV2aWwuDQogKg0KICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1INCiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLA0KICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFDQogKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSDQogKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLA0KICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUNCiAqIFNPRlRXQVJFLg0KICogLS0NCiAqDQogKiBAcGFja2FnZSBKU01pbg0KICogQGF1dGhvciBSeWFuIEdyb3ZlIDxyeWFuQHdvbmtvLmNvbT4NCiAqIEBjb3B5cmlnaHQgMjAwMiBEb3VnbGFzIENyb2NrZm9yZCA8ZG91Z2xhc0Bjcm9ja2ZvcmQuY29tPiAoanNtaW4uYykNCiAqIEBjb3B5cmlnaHQgMjAwOCBSeWFuIEdyb3ZlIDxyeWFuQHdvbmtvLmNvbT4gKFBIUCBwb3J0KQ0KICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocCBNSVQgTGljZW5zZQ0KICogQHZlcnNpb24gMS4xLjEgKDIwMDgtMDMtMDIpDQogKiBAbGluayBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvanNtaW4tcGhwLw0KICovDQoNCmNsYXNzIEpTTWluIHsNCiAgY29uc3QgT1JEX0xGICAgID0gMTA7DQogIGNvbnN0IE9SRF9TUEFDRSA9IDMyOw0KDQogIHByb3RlY3RlZCAkYSAgICAgICAgICAgPSAnJzsNCiAgcHJvdGVjdGVkICRiICAgICAgICAgICA9ICcnOw0KICBwcm90ZWN0ZWQgJGlucHV0ICAgICAgID0gJyc7DQogIHByb3RlY3RlZCAkaW5wdXRJbmRleCAgPSAwOw0KICBwcm90ZWN0ZWQgJGlucHV0TGVuZ3RoID0gMDsNCiAgcHJvdGVjdGVkICRsb29rQWhlYWQgICA9IG51bGw7DQogIHByb3RlY3RlZCAkb3V0cHV0ICAgICAgPSAnJzsNCg0KICAvLyAtLSBQdWJsaWMgU3RhdGljIE1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1pbmlmeSgkanMpIHsNCiAgICAkanNtaW4gPSBuZXcgSlNNaW4oJGpzKTsNCiAgICByZXR1cm4gJGpzbWluLT5taW4oKTsNCiAgfQ0KDQogIC8vIC0tIFB1YmxpYyBJbnN0YW5jZSBNZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaW5wdXQpIHsNCiAgICAkdGhpcy0+aW5wdXQgICAgICAgPSBzdHJfcmVwbGFjZSgiXHJcbiIsICJcbiIsICRpbnB1dCk7DQogICAgJHRoaXMtPmlucHV0TGVuZ3RoID0gc3RybGVuKCR0aGlzLT5pbnB1dCk7DQogIH0NCg0KICAvLyAtLSBQcm90ZWN0ZWQgSW5zdGFuY2UgTWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICBwcm90ZWN0ZWQgZnVuY3Rpb24gYWN0aW9uKCRkKSB7DQogICAgc3dpdGNoKCRkKSB7DQogICAgICBjYXNlIDE6DQogICAgICAgICR0aGlzLT5vdXRwdXQgLj0gJHRoaXMtPmE7DQoNCiAgICAgIGNhc2UgMjoNCiAgICAgICAgJHRoaXMtPmEgPSAkdGhpcy0+YjsNCg0KICAgICAgICBpZiAoJHRoaXMtPmEgPT09ICInIiB8fCAkdGhpcy0+YSA9PT0gJyInKSB7DQogICAgICAgICAgZm9yICg7Oykgew0KICAgICAgICAgICAgJHRoaXMtPm91dHB1dCAuPSAkdGhpcy0+YTsNCiAgICAgICAgICAgICR0aGlzLT5hICAgICAgID0gJHRoaXMtPmdldCgpOw0KDQogICAgICAgICAgICBpZiAoJHRoaXMtPmEgPT09ICR0aGlzLT5iKSB7DQogICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAob3JkKCR0aGlzLT5hKSA8PSBzZWxmOjpPUkRfTEYpIHsNCiAgICAgICAgICAgICAgdGhyb3cgbmV3IEpTTWluRXhjZXB0aW9uKCdVbnRlcm1pbmF0ZWQgc3RyaW5nIGxpdGVyYWwuJyk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmICgkdGhpcy0+YSA9PT0gJ1xcJykgew0KICAgICAgICAgICAgICAkdGhpcy0+b3V0cHV0IC49ICR0aGlzLT5hOw0KICAgICAgICAgICAgICAkdGhpcy0+YSAgICAgICA9ICR0aGlzLT5nZXQoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgY2FzZSAzOg0KICAgICAgICAkdGhpcy0+YiA9ICR0aGlzLT5uZXh0KCk7DQoNCiAgICAgICAgaWYgKCR0aGlzLT5iID09PSAnLycgJiYgKA0KICAgICAgICAgICAgJHRoaXMtPmEgPT09ICcoJyB8fCAkdGhpcy0+YSA9PT0gJywnIHx8ICR0aGlzLT5hID09PSAnPScgfHwNCiAgICAgICAgICAgICR0aGlzLT5hID09PSAnOicgfHwgJHRoaXMtPmEgPT09ICdbJyB8fCAkdGhpcy0+YSA9PT0gJyEnIHx8DQogICAgICAgICAgICAkdGhpcy0+YSA9PT0gJyYnIHx8ICR0aGlzLT5hID09PSAnfCcgfHwgJHRoaXMtPmEgPT09ICc/JykpIHsNCg0KICAgICAgICAgICR0aGlzLT5vdXRwdXQgLj0gJHRoaXMtPmEgLiAkdGhpcy0+YjsNCg0KICAgICAgICAgIGZvciAoOzspIHsNCiAgICAgICAgICAgICR0aGlzLT5hID0gJHRoaXMtPmdldCgpOw0KDQogICAgICAgICAgICBpZiAoJHRoaXMtPmEgPT09ICcvJykgew0KICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0gZWxzZWlmICgkdGhpcy0+YSA9PT0gJ1xcJykgew0KICAgICAgICAgICAgICAkdGhpcy0+b3V0cHV0IC49ICR0aGlzLT5hOw0KICAgICAgICAgICAgICAkdGhpcy0+YSAgICAgICA9ICR0aGlzLT5nZXQoKTsNCiAgICAgICAgICAgIH0gZWxzZWlmIChvcmQoJHRoaXMtPmEpIDw9IHNlbGY6Ok9SRF9MRikgew0KICAgICAgICAgICAgICB0aHJvdyBuZXcgSlNNaW5FeGNlcHRpb24oJ1VudGVybWluYXRlZCByZWd1bGFyIGV4cHJlc3Npb24gJy4NCiAgICAgICAgICAgICAgICAgICdsaXRlcmFsLicpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAkdGhpcy0+b3V0cHV0IC49ICR0aGlzLT5hOw0KICAgICAgICAgIH0NCg0KICAgICAgICAgICR0aGlzLT5iID0gJHRoaXMtPm5leHQoKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIHByb3RlY3RlZCBmdW5jdGlvbiBnZXQoKSB7DQogICAgJGMgPSAkdGhpcy0+bG9va0FoZWFkOw0KICAgICR0aGlzLT5sb29rQWhlYWQgPSBudWxsOw0KDQogICAgaWYgKCRjID09PSBudWxsKSB7DQogICAgICBpZiAoJHRoaXMtPmlucHV0SW5kZXggPCAkdGhpcy0+aW5wdXRMZW5ndGgpIHsNCiAgICAgICAgJGMgPSBzdWJzdHIoJHRoaXMtPmlucHV0LCAkdGhpcy0+aW5wdXRJbmRleCwgMSk7DQogICAgICAgICR0aGlzLT5pbnB1dEluZGV4ICs9IDE7DQogICAgICB9IGVsc2Ugew0KICAgICAgICAkYyA9IG51bGw7DQogICAgICB9DQogICAgfQ0KDQogICAgaWYgKCRjID09PSAiXHIiKSB7DQogICAgICByZXR1cm4gIlxuIjsNCiAgICB9DQoNCiAgICBpZiAoJGMgPT09IG51bGwgfHwgJGMgPT09ICJcbiIgfHwgb3JkKCRjKSA+PSBzZWxmOjpPUkRfU1BBQ0UpIHsNCiAgICAgIHJldHVybiAkYzsNCiAgICB9DQoNCiAgICByZXR1cm4gJyAnOw0KICB9DQoNCiAgcHJvdGVjdGVkIGZ1bmN0aW9uIGlzQWxwaGFOdW0oJGMpIHsNCiAgICByZXR1cm4gb3JkKCRjKSA+IDEyNiB8fCAkYyA9PT0gJ1xcJyB8fCBwcmVnX21hdGNoKCcvXltcd1wkXSQvJywgJGMpID09PSAxOw0KICB9DQoNCiAgcHJvdGVjdGVkIGZ1bmN0aW9uIG1pbigpIHsNCiAgICAkdGhpcy0+YSA9ICJcbiI7DQogICAgJHRoaXMtPmFjdGlvbigzKTsNCg0KICAgIHdoaWxlICgkdGhpcy0+YSAhPT0gbnVsbCkgew0KICAgICAgc3dpdGNoICgkdGhpcy0+YSkgew0KICAgICAgICBjYXNlICcgJzoNCiAgICAgICAgICBpZiAoJHRoaXMtPmlzQWxwaGFOdW0oJHRoaXMtPmIpKSB7DQogICAgICAgICAgICAkdGhpcy0+YWN0aW9uKDEpOw0KICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkdGhpcy0+YWN0aW9uKDIpOw0KICAgICAgICAgIH0NCiAgICAgICAgICBicmVhazsNCg0KICAgICAgICBjYXNlICJcbiI6DQogICAgICAgICAgc3dpdGNoICgkdGhpcy0+Yikgew0KICAgICAgICAgICAgY2FzZSAneyc6DQogICAgICAgICAgICBjYXNlICdbJzoNCiAgICAgICAgICAgIGNhc2UgJygnOg0KICAgICAgICAgICAgY2FzZSAnKyc6DQogICAgICAgICAgICBjYXNlICctJzoNCiAgICAgICAgICAgICAgJHRoaXMtPmFjdGlvbigxKTsNCiAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgIGNhc2UgJyAnOg0KICAgICAgICAgICAgICAkdGhpcy0+YWN0aW9uKDMpOw0KICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgaWYgKCR0aGlzLT5pc0FscGhhTnVtKCR0aGlzLT5iKSkgew0KICAgICAgICAgICAgICAgICR0aGlzLT5hY3Rpb24oMSk7DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgJHRoaXMtPmFjdGlvbigyKTsNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgICBicmVhazsNCg0KICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgIHN3aXRjaCAoJHRoaXMtPmIpIHsNCiAgICAgICAgICAgIGNhc2UgJyAnOg0KICAgICAgICAgICAgICBpZiAoJHRoaXMtPmlzQWxwaGFOdW0oJHRoaXMtPmEpKSB7DQogICAgICAgICAgICAgICAgJHRoaXMtPmFjdGlvbigxKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICR0aGlzLT5hY3Rpb24oMyk7DQogICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICBjYXNlICJcbiI6DQogICAgICAgICAgICAgIHN3aXRjaCAoJHRoaXMtPmEpIHsNCiAgICAgICAgICAgICAgICBjYXNlICd9JzoNCiAgICAgICAgICAgICAgICBjYXNlICddJzoNCiAgICAgICAgICAgICAgICBjYXNlICcpJzoNCiAgICAgICAgICAgICAgICBjYXNlICcrJzoNCiAgICAgICAgICAgICAgICBjYXNlICctJzoNCiAgICAgICAgICAgICAgICBjYXNlICciJzoNCiAgICAgICAgICAgICAgICBjYXNlICInIjoNCiAgICAgICAgICAgICAgICAgICR0aGlzLT5hY3Rpb24oMSk7DQogICAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmlzQWxwaGFOdW0oJHRoaXMtPmEpKSB7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5hY3Rpb24oMSk7DQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmFjdGlvbigzKTsNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgJHRoaXMtPmFjdGlvbigxKTsNCiAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCg0KICAgIHJldHVybiAkdGhpcy0+b3V0cHV0Ow0KICB9DQoNCiAgcHJvdGVjdGVkIGZ1bmN0aW9uIG5leHQoKSB7DQogICAgJGMgPSAkdGhpcy0+Z2V0KCk7DQoNCiAgICBpZiAoJGMgPT09ICcvJykgew0KICAgICAgc3dpdGNoKCR0aGlzLT5wZWVrKCkpIHsNCiAgICAgICAgY2FzZSAnLyc6DQogICAgICAgICAgZm9yICg7Oykgew0KICAgICAgICAgICAgJGMgPSAkdGhpcy0+Z2V0KCk7DQoNCiAgICAgICAgICAgIGlmIChvcmQoJGMpIDw9IHNlbGY6Ok9SRF9MRikgew0KICAgICAgICAgICAgICByZXR1cm4gJGM7DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KDQogICAgICAgIGNhc2UgJyonOg0KICAgICAgICAgICR0aGlzLT5nZXQoKTsNCg0KICAgICAgICAgIGZvciAoOzspIHsNCiAgICAgICAgICAgIHN3aXRjaCgkdGhpcy0+Z2V0KCkpIHsNCiAgICAgICAgICAgICAgY2FzZSAnKic6DQogICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5wZWVrKCkgPT09ICcvJykgew0KICAgICAgICAgICAgICAgICAgJHRoaXMtPmdldCgpOw0KICAgICAgICAgICAgICAgICAgcmV0dXJuICcgJzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgICAgY2FzZSBudWxsOg0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBKU01pbkV4Y2VwdGlvbignVW50ZXJtaW5hdGVkIGNvbW1lbnQuJyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KDQogICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgcmV0dXJuICRjOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIHJldHVybiAkYzsNCiAgfQ0KDQogIHByb3RlY3RlZCBmdW5jdGlvbiBwZWVrKCkgew0KICAgICR0aGlzLT5sb29rQWhlYWQgPSAkdGhpcy0+Z2V0KCk7DQogICAgcmV0dXJuICR0aGlzLT5sb29rQWhlYWQ7DQogIH0NCn0NCg0KLy8gLS0gRXhjZXB0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCmNsYXNzIEpTTWluRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHt9DQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCg0KDQokbGFuZ1snZnJpZW5kbHluYW1lJ10gPSAnU2NyaXB0IERlcGxveSc7DQokbGFuZ1sncG9zdGluc3RhbGwnXSA9ICdUaGUgZmlyc3Qgc3RvcCB5b3VcJ2xsIHdhbnQgdG8gbWFrZSBpcyB0aGUgaGVscCc7DQokbGFuZ1sncG9zdHVuaW5zdGFsbCddID0gJ1BsZWFzZSBmZWVsIGZyZWUgdG8gbGV0IHVzIGtub3cgaWYgdGhlcmUgaXMgYSB3YXkgdG8gbWFrZSBTY3JpcHREZXBsb3kgYmV0dGVyLCA8YSBocmVmPSJodHRwOi8vaGVscC5jb3JiZW5zcHJvZHVjdHMuY29tL21ha2UtY29udGFjdC5odG1sIj5Db250YWN0IHVzIHdlXCdlciBoYXBweSB0byBoZWFyIGZyb20geW91LjwvYT4nOw0KJGxhbmdbJ3JlYWxseV91bmluc3RhbGwnXSA9ICdVbmluc3RhbGxpbmcgdGhpcyBtb2R1bGUgd2lsbCBub3QgYWZmZWN0IGFueSBldmVudCBkYXRhIGFuZCBhbGwgYm9va3MgdG8gZGF0ZSB3aWxsIHN0aWxsIGJlIHRoZXJlLiBEbyB5b3Ugd2lzaCB0byBjb250aW51ZT8nOw0KJGxhbmdbJ3VuaW5zdGFsbGVkJ10gPSAnTW9kdWxlIFVuaW5zdGFsbGVkLic7DQokbGFuZ1snaW5zdGFsbGVkJ10gPSAnTW9kdWxlIHZlcnNpb24gJXMgaW5zdGFsbGVkLic7DQokbGFuZ1sndXBncmFkZWQnXSA9ICdNb2R1bGUgdXBncmFkZWQgdG8gdmVyc2lvbiAlcy4nOw0KDQovLy9BZG1pbg0KJGxhbmdbJ0FDVG9wdGlvbnMnXSA9ICdBY2NvdW50IE9wdGlvbnMnOw0KJGxhbmdbJ21hbnVhbGFzc2lnbm1lbnQnXSA9ICdBc3NpZ25tZW50JzsNCg0KJGxhbmdbJ1NjcmlwdF9saXN0J10gPSAnU2NyaXB0cyc7DQokbGFuZ1snQXNzX2hlYWRlciddID0gJ1VuaWZpZWQgU2NyaXB0cyc7DQokbGFuZ1snU2FtcGxlVGFnJ10gPSAnU2FtcGxlIFRhZyc7DQoNCiRsYW5nWydwcm9tcHRfbmV3U2NyaXB0J10gPSAnQWRkIE5ldyBTY3JpcHQnOw0KJGxhbmdbJ3Byb21wdF9uZXdTY3JpcHRBc3MnXSA9ICdBZGQgTmV3IFNjcmlwdCBBc3NpZ25tZW50JzsNCiRsYW5nWyd0aXRsZV9Hcm91cHMnXSA9ICdHcm91cCBvZiBTY3JpcHRzIExpc3QnOw0KJGxhbmdbJ3RpdGxlX1NjcmlwdHMnXSA9ICdTaW5nbGUgU2NyaXB0cyBMaXN0JzsNCiRsYW5nWydhcmV5b3VzdXJlJ10gPSAnSW1wb3J0YW50OlxuXG5JZiB0aGlzIGlzIGRlbGV0ZWQgYWxsIGluZm9ybWF0aW9uIHdpbGwgYmUgbG9zdCFcblxuSWYgeW91IGhhdmUgdGhpcyBzY3JpcHQgaW4gYSBncm91cCB5b3Ugd2lsbCBicmVhayB0aGUgdGllIGFuZCB3aWxsIG5lZWQgdG8gZWRpdCB0aGUgZ3JvdXAuXG5JdCBpcyBiZXN0IHRvIHN0YXJ0IHRoZSBkZWxldGlvbiBwcm9jZXNzIGZyb20gdGhlIEFzc2lnbm1lbnQgYXJlYS4nOw0KDQoNCiRsYW5nWydzbWFydHlIb3cnXSA9ICd0aGUgc21hcnR5IHdvcmtzIGxpa2UgdGhpcy4uLiBXaGVyZSB5b3VcJ2QgaGF2ZSB7JHNtYXJ0eS5ub3d9IHlvdSBkbyA6Ojokc21hcnR5Lm5vdzo6OiAgLiAgTm93IHlvdSBjYW4gZG8gc21hcnR5IHN0dWZmJzsNCg0KDQovLy9tZXNzYWdlcw0KDQokbGFuZ1snQ2FuY2VsZWQnXSA9ICdZb3UgQ2FuY2VsZWQgb3V0IG9mIHRoZSBvcGVyYXRpb24uICBBbnkgV29yayB5b3UgbWF5IGhhdmUgZW50ZXJlZCBoYXMgYmVlbiBsb3N0Lic7DQoNCiRsYW5nWydCdG5BRERFRCddID0gJ1lvdSBKdXN0IEFkZGVkIGEgbmV3IFNjcmlwdCc7DQokbGFuZ1snQnRuRURJVEVEJ10gPSAnWW91IEp1c3QgRWRpdGVkIGFuIGV4aXN0aW5nIFNjcmlwdCc7DQokbGFuZ1snQnRuREVMRVRFRCddID0gJ1lvdSBKdXN0IERlbGV0ZWQgYW4gZXhpc3RpbmcgU2NyaXB0JzsNCiRsYW5nWyd0eXBlX2xhYmVsJ10gPSAnVHlwZSc7DQoNCiRsYW5nWydlbXRweUdyb3VwJ10gPSAiWW91J2xsIG5lZWQgdG8gYWRkIGEgc2NyaXB0IHRvIHRoZSBncm91cCBiZWZvcmUgY2FsbGluZyBpdCI7DQoNCi8vQWNjb3VudCBvcHRpb25zDQokbGFuZ1snU2NyaXB0U2V0X2xhYmVsJ10gPSAnU2NyaXB0IElEJzsNCiRsYW5nWydzY3JpcHRUeXBlX2xhYmVsJ10gPSAnU2NyaXB0IFR5cGUnOw0KJGxhbmdbJ1NjcmlwdE5hbWVfbGFiZWwnXSA9ICdTY3JpcHQgTmFtZSc7DQokbGFuZ1snU2luZ2xlQ29kZV9sYWJlbCddID0gJ0RlZmF1bHQgU2luZ2xlIFNjcmlwdCBDYWxsJzsNCiRsYW5nWydHcm91cHRTaXplX2xhYmVsJ10gPSAnVG90YWwnOw0KDQoNCg0KDQokbGFuZ1snTWluaWZ5X2xhYmVsJ10gPSAnTWluaWZ5JzsNCiRsYW5nWydtYXhBZ2VfbGFiZWwnXSA9ICdtYXhBZ2UnOw0KJGxhbmdbJ0NyZWF0aW9uRGF0ZV9sYWJlbCddID0gJ0NyZWF0aW9uIERhdGUnOw0KJGxhbmdbJ01vZGlmZWREYXRlX2xhYmVsJ10gPSAnTW9kaWZpZWQgRGF0ZSc7DQokbGFuZ1sncGF0aE9wdGlvbl9sYWJlbCddID0gJ1VzZSBhIHBhdGgnOw0KJGxhbmdbJ1NjcmlwdElzX2xhYmVsJ10gPSAnVXNlIHRoaXMgc2NyaXB0IDxlbT4oTm90ZTogSWYgYSBwYXRoIGlzIHNldCwgaXQgd2lsbCBvdmVyIHJpZGUgdGhpcyk8L2VtPic7DQokbGFuZ1snZGVidWdJVF9sYWJlbCddID0gJ2RlYnVnSVQnOw0KJGxhbmdbJ2RlYnVnSVRub3RlX2xhYmVsJ10gPSAnPGVtPihNdXN0IGhhdmUgRmlyZXBocCBtb2QpPC9lbT4nOw0KJGxhbmdbJ2RlYnVnVCddID0gJ0RlYnVnaW5nIE9wdGlvbnMnOw0KDQoNCiRsYW5nWydub25lSW5UeXBlJ10gPSAnPGgxPllvdSBtdXN0IGZpcnN0IGFkZCA8YnIvPmEgc2NyaXB0IGluIHRoaXMgdHlwZTwvaDE+JzsNCg0KDQokbGFuZ1snc21hcnR5T25fbGFiZWwnXSA9ICc8c3Ryb25nPlByb2Nlc3MgU21hcnR5PC9zdHJvbmc+PGJyLz4gZGF0YSBpbiBidXR0b24gZmllbGRzJzsNCiRsYW5nWydzbWFydHlPbiddID0gJzxoMT5Qcm9jZXNzIFNtYXJ0eSBkYXRhPC9oMT4NCjxoMz5XaXRoIHRoaXMgdHVybmVkIG9uIHlvdSBjYW4gc2V0IHRoZSBidXR0b24gZmllbGRzIHdpdGggdGhlIHZhbHVlcyBwYXNzZWQgYnkgb3RoZXIgbW9kdWxlcyBzdWNoIGFzIFByb2R1Y3RzIG9yIENhdGFsb2dlcjwvaDM+JzsNCg0KLy8vQWN0aW9ucw0KJGxhbmdbJ2VkaXQnXSA9ICdFZGl0JzsNCiRsYW5nWydkZWxldGUnXSA9ICdEZWxldGUnOw0KLy9BbGVydHMgYW5kIE1lc3NhZ2VzDQokbGFuZ1snQ2xlYXJJbWcnXSA9ICdEZWxldGUgQ3VycmVudCBJbWFnZSc7DQoNCg0KJGxhbmdbJ2NhbmNlbCddID0gJ0NhbmNlbCc7DQokbGFuZ1snZm9ybV9jYW5jZWwnXSA9ICdDYW5jZWwnOw0KDQokbGFuZ1snZG9uZSddID0gJ0RvbmUnOw0KJGxhbmdbJ2FkZCddID0gJ0FkZCc7DQokbGFuZ1snc3VibWl0J10gPSAnU3VibWl0JzsNCiRsYW5nWydmb3JtX3N1Ym1pdCddID0gJ1NhdmUgUHJlZmVyZW5jZXMnOw0KDQokbGFuZ1snbW9kX3ByZWZzX3RpdGxlJ10gPSAnTW9kdWxlIFByZWZlcmVuY2VzJzsNCiRsYW5nWydwcmVmc3VwZGF0ZWQnXSA9ICdNb2R1bGUgcHJlZmVyZW5jZXMgdXBkYXRlZC4nOw0KJGxhbmdbJ29wdGlvbnN1cGRhdGVkJ10gPSAnb3B0aW9ucyB1cGRhdGVkJzsNCg0KDQoNCg0KDQokbGFuZ1snbW9kZGVzY3JpcHRpb24nXSA9ICdTY3JpcHREZXBsb3kgaXMgYSBQYXlQYWwgYnV0dG9uIG1hbmFnZXIuIEl0IGhhbmRsZXMgdGhlIGJ1dHRvbnMgaW50ZXJuYWwgdG8gdGhlIHNpdGUgYWxzbyBsaWZ0cyB0aGUgMTAwIGJ1dHRvbiBjYXAgb2YgUGF5UGFsIGhvc3RlZCBidXR0b25zLiBTZWN1cmUgdXNpbmcgdGltZSBiYXNlZCBzaGExIGVuY3J5cHRpb247IFRpZSB0byBtb3N0IG1vZHM7IEZpcmUgVVREXCdzIG9yIHBsdWctaW5zLiBTaW1wbGUsIGZsZXhpYmxlLic7DQokbGFuZ1snd2VsY29tZV90ZXh0J10gPSAnPHA+SGVsbG8hPC9wPic7DQokbGFuZ1snY2hhbmdlbG9nJ10gPSAnDQo8dWw+DQoNCiAgPGxpPlZlcnNpb24gMC4xIEJldGEgcmVsZWFzZS48L2xpPg0KPC91bD4nOw0KJGxhbmdbJ2hlbHAnXSA9ICc8bGluayBtZWRpYT0ic2NyZWVuIiBocmVmPSIuLi9tb2R1bGVzL1NjcmlwdERlcGxveS9DU1MvTWFzdGVyQ1NTLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIvPjxkaXYgY2xhc3M9IlNpbVdyYXAiPjxiIGNsYXNzPSJyYm90dG9tIj48YiBjbGFzcz0icjEiPjwvYj4gPGIgY2xhc3M9InIyIj48L2I+PGIgY2xhc3M9InIzIj48L2I+IDxiIGNsYXNzPSJyNCI+PC9iPjwvYj4NCg0KPGRpdiBjbGFzcz0iU2ltY29uIj4gPGgzIGNsYXNzPSJCYWNrTGluayI+PGEgb25jbGljaz0iamF2YXNjcmlwdDp3aW5kb3cuaGlzdG9yeS5nbygtMSkiIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vZm9sbG93Ij4mbHQ7Jmx0OyBCYWNrPC9hPjwvaDM+DQo8aDE+V2hhdCBEb2VzIFRoaXMgRG8/LS0tIHRoaXMgbmVlZHMgdXBkYXRpbmc8L2gxPg0KPGgyPldyaXRlIG1hbmFnZSBhbmQgZGVwbG95IEpTIGFuZCBDU1M8L2gyPg0KPGEgaWQ9IlNjcmlwdERlcGxveSI+PC9hPg0KPHA+U2NyaXB0RGVwbG95IG1vZHVsZSB0aGF0IGNhbiBjb21iaW5lIG11bHRpcGxlIENTUyBvciBKYXZhc2NyaXB0IGZpbGVzLCBjb21wcmVzcyB0aGVpciBjb250ZW50cyAoaS5lLiByZW1vdmFsIG9mIHVubmVjZXNzYXJ5IHdoaXRlc3BhY2UvY29tbWVudHMpLCBhbmQgc2VydmUgdGhlIHJlc3VsdHMgd2l0aCBIVFRQIGVuY29kaW5nIChnemlwL2RlZmxhdGUpIGFuZCBoZWFkZXJzIHRoYXQgYWxsb3cgb3B0aW1hbCBjbGllbnQtc2lkZSBjYWNoaW5nLiBUaGlzIGhlbHBzIHlvdSBmb2xsb3cgc2V2ZXJhbCBvZiBZYWhvbyFcJ3MgPGEgaHJlZj0iaHR0cDovL2RldmVsb3Blci55YWhvby5jb20vcGVyZm9ybWFuY2UvaW5kZXguaHRtbCNydWxlcyIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9mb2xsb3ciPlJ1bGVzIGZvciBIaWdoIFBlcmZvcm1hbmNlIFdlYiBTaXRlczwvYT4uIChTZWUgJnF1b3Q7UHJvYmxlbSBEb21haW4mcXVvdDsgYmVsb3cgZm9yIG1vcmUgaW5mby4pIDwvcD4NCjxoMz5UaGUgU2hvcnQgb2YgaXQ8L2gzPg0KPHA+V2lydGUgeW91ciBzY3JpcHRzLCBzZXQgdGhlIG9yZGVyIGFuZCBTY3JpcHREZXBsb3kgd2lsbCBkbyB0aGUgcmVzdCE8L3A+DQo8dGFibGU+DQogIDx0Ym9keT4NCiAgICA8dHI+DQogICAgICA8dGQgc3R5bGU9IkJPUkRFUi1SSUdIVDogI2FhYSAxcHggc29saWQ7IFBBRERJTkctUklHSFQ6IDVweDsgQk9SREVSLVRPUDogI2FhYSAxcHggc29saWQ7IFBBRERJTkctTEVGVDogNXB4OyBQQURESU5HLUJPVFRPTTogNXB4OyBCT1JERVItTEVGVDogI2FhYSAxcHggc29saWQ7IFBBRERJTkctVE9QOiA1cHg7IEJPUkRFUi1CT1RUT006ICNhYWEgMXB4IHNvbGlkIj48c3Ryb25nPkJlZm9yZTwvc3Ryb25nPjwvdGQ+DQogICAgICA8dGQgc3R5bGU9IkJPUkRFUi1SSUdIVDogI2FhYSAxcHggc29saWQ7IFBBRERJTkctUklHSFQ6IDVweDsgQk9SREVSLVRPUDogI2FhYSAxcHggc29saWQ7IFBBRERJTkctTEVGVDogNXB4OyBQQURESU5HLUJPVFRPTTogNXB4OyBCT1JERVItTEVGVDogI2FhYSAxcHggc29saWQ7IFBBRERJTkctVE9QOiA1cHg7IEJPUkRFUi1CT1RUT006ICNhYWEgMXB4IHNvbGlkIj48aW1nIHNyYz0iaHR0cDovL21yY2xheS5vcmcvd3AtY29udGVudC91cGxvYWRzLzIwMDgvMDkvZmlkZGxlcl9iZWZvcmUucG5nIiBhbHQ9ImFmdGVyIiAvPjwvdGQ+DQogICAgPC90cj4NCiAgICA8dHI+DQogICAgICA8dGQgc3R5bGU9IkJPUkRFUi1SSUdIVDogI2FhYSAxcHggc29saWQ7IFBBRERJTkctUklHSFQ6IDVweDsgQk9SREVSLVRPUDogI2FhYSAxcHggc29saWQ7IFBBRERJTkctTEVGVDogNXB4OyBQQURESU5HLUJPVFRPTTogNXB4OyBCT1JERVItTEVGVDogI2FhYSAxcHggc29saWQ7IFBBRERJTkctVE9QOiA1cHg7IEJPUkRFUi1CT1RUT006ICNhYWEgMXB4IHNvbGlkIj48c3Ryb25nPkFmdGVyPC9zdHJvbmc+PC90ZD4NCiAgICAgIDx0ZCBzdHlsZT0iQk9SREVSLVJJR0hUOiAjYWFhIDFweCBzb2xpZDsgUEFERElORy1SSUdIVDogNXB4OyBCT1JERVItVE9QOiAjYWFhIDFweCBzb2xpZDsgUEFERElORy1MRUZUOiA1cHg7IFBBRERJTkctQk9UVE9NOiA1cHg7IEJPUkRFUi1MRUZUOiAjYWFhIDFweCBzb2xpZDsgUEFERElORy1UT1A6IDVweDsgQk9SREVSLUJPVFRPTTogI2FhYSAxcHggc29saWQiPjxpbWcgc3JjPSJodHRwOi8vbXJjbGF5Lm9yZy93cC1jb250ZW50L3VwbG9hZHMvMjAwOC8wOS9maWRkbGVyX2FmdGVyLnBuZyIgYWx0PSJiZWZvcmUiIC8+PC90ZD4NCiAgICA8L3RyPg0KICA8L3Rib2R5Pg0KPC90YWJsZT4NCg0KDQoNCjxoMj48YSBpZD0iRmVhdHVyZXMiPjwvYT5GZWF0dXJlczwvaDI+DQo8dWw+DQogIDxsaT5Db21iaW5lcyBhbmQgbWluaWZpZXMgbXVsdGlwbGUgQ1NTIG9yIEphdmFTY3JpcHQgZmlsZXMgaW50byBhIHNpbmdsZSAgIGRvd25sb2FkIDwvbGk+DQogIDxsaT5Vc2VzIGFuIDxhIGhyZWY9Imh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9taW5pZnkvc291cmNlL2Jyb3dzZS90cnVuay9taW4vbGliL0pTTWluLnBocCIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9mb2xsb3ciPmVuaGFuY2VkIHBvcnQ8L2E+IG9mIERvdWdsYXMgQ3JvY2tmb3JkXCdzIDxhIGhyZWY9Imh0dHA6Ly93d3cuY3JvY2tmb3JkLmNvbS9qYXZhc2NyaXB0L2pzbWluLmh0bWwiIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vZm9sbG93Ij5KU01pbiAgIGxpYnJhcnk8L2E+IGFuZCBjdXN0b20gY2xhc3NlcyB0byBtaW5pZnkgPGEgaHJlZj0iaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL21pbmlmeS9zb3VyY2UvYnJvd3NlL3RydW5rL21pbi9saWIvTWluaWZ5L0NTUy5waHAiIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vZm9sbG93Ij5DU1M8L2E+IGFuZCA8YSBocmVmPSJodHRwOi8vY29kZS5nb29nbGUuY29tL3AvbWluaWZ5L3NvdXJjZS9icm93c2UvdHJ1bmsvbWluL2xpYi9NaW5pZnkvSFRNTC5waHAiIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vZm9sbG93Ij5IVE1MPC9hPjwvbGk+DQogIDxsaT5DYWNoZXMgc2VydmVyLXNpZGUgdG8gYXZvaWQgZG9pbmcgdW5uZWNlc3Nhcnkgd29yayA8L2xpPg0KICA8bGk+UmVzcG9uZHMgd2l0aCBhbiBIVFRQIDMwNCAoTm90IE1vZGlmaWVkKSByZXNwb25zZSB3aGVuIHRoZSBicm93c2VyIGhhcyBhbiAgIHVwLXRvLWRhdGUgY2FjaGUgY29weSAqKiA8L2xpPg0KICA8bGk+TW9zdCBtb2R1bGVzIGFyZSBsYXp5LWxvYWRlZCBhcyBuZWVkZWQgKDMwNCByZXNwb25zZXMgdXNlIG1pbmltYWwgY29kZSkgICoqIDwvbGk+DQogIDxsaT5BdXRvbWF0aWNhbGx5IHJld3JpdGVzIHJlbGF0aXZlIFVSSXMgaW4gY29tYmluZWQgQ1NTIGZpbGVzIHRvIHBvaW50IHRvIHZhbGlkIGxvY2F0aW9ucyA8L2xpPg0KICA8bGk+V2l0aCBjYWNoaW5nIGVuYWJsZWQsIFNjcmlwdERlcGxveSBpcyBjYXBhYmxlIG9mIGhhbmRsaW5nIGh1bmRyZWRzIG9mIHJlcXVlc3RzIHBlciBzZWNvbmQgb24gYSBtb2RlcmF0ZWx5IHBvd2VyZnVsIHNlcnZlci4gPC9saT4NCiAgPGxpPkNvbnRlbnQtRW5jb2Rpbmc6IGd6aXAsIGJhc2VkIG9uIHJlcXVlc3QgaGVhZGVycy4gQ2FjaGluZyBhbGxvd3MgaXQgc28gc2VydmUgZ3ppcHBlZCBmaWxlcyBmYXN0ZXIgdGhhbiBBcGFjaGVcJ3MgbW9kX2RlZmxhdGUgb3B0aW9uISA8L2xpPg0KPC91bD4NCjxoMz48ZW0+PHN0cm9uZz4qKiBOb3RlOjwvc3Ryb25nPiBJdCBpcyBiZXN0IHRvIHVzZSBhIC5odGFjY2VzcyBzY3JpcHQgdG8gc2V0IHRoZSBhZ2UgdGltZXMuIFNjcmlwdERlcGxveSBpcyBkZXNpZ25lZCBmb3IgZWZmaWNpZW5jeSwgYnV0IGZvciB2ZXJ5IGhpZ2ggdHJhZmZpYyBzaXRlcywgU2NyaXB0RGVwbG95IG1heSBzZXJ2ZSBmaWxlcyBzbG93ZXIgdGhhbiB5b3VyIEhUVFBkIGR1ZSB0byB0aGUgQ0dJIG92ZXJoZWFkIG9mIFBIUC4gIFRvIG92ZXIgY29tZSB0aGlzIEp1c3QgY2hlY2sgInVzZSAuaHRhY2Nlc3MgaW4gb3B0aW9ucyI8L2VtPjwvaDM+DQo8aDI+PGEgbmFtZT0iUmVxdWlyZW1lbnRzIj48L2E+UmVxdWlyZW1lbnRzPC9oMj4NCjx1bD4NCiAgPGxpPlRoZSBjb21tb25seSBpbnN0YWxsZWQgPGEgaHJlZj0iaHR0cDovL3VzMy5waHAubmV0L21hbnVhbC9lbi96bGliLmluc3RhbGxhdGlvbi5waHAiIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vZm9sbG93Ij56bGliICAgZXh0ZW5zaW9uPC9hPiBpcyByZWNvbW1lbmRlZCBmb3IgSFRUUCBlbmNvZGluZyBmdW5jdGlvbmFsaXR5LiA8L2xpPg0KPC91bD4NCjxici8+PGJyLz4NCjxoMT5Ib3cgRG8gSSBVc2UgSXQ8L2gxPg0KDQoNCjxoMz5HZXQgYSBzaW5nbGUgc2NyaXB0PC9oMz4NCnVzZSA8c3BhbiBjbGFzcz0iY29kZUhJR0hMSUdIVCI+e2Ntc19tb2R1bGUgbW9kdWxlPVNjcmlwdERlcGxveSBzY3JpcHRJRD0iMSJ9IDwvc3Bhbj4gPGJyLz48YnIvPg0KPGgzPkdldCBhIHNjcmlwdCBncm91cDwvaDM+DQp1c2UgPHNwYW4gY2xhc3M9ImNvZGVISUdITElHSFQiPntjbXNfbW9kdWxlIG1vZHVsZT1TY3JpcHREZXBsb3kgZ3JvdXBJRD0iMSJ9IDwvc3Bhbj4gPGJyLz48YnIvPg0KPGgyPkFsbCBvdXRwdXQgaXMgaW4gdGhlIFhIVE1MIGZvcm1hdCwgeW91IHNob3VsZCB3b3JrIGluIHRoYXQuPC9oMj4NCg0KPGJyLz48YnIvPg0KPGg0PlBhcmFtczwvaDQ+DQo8dWw+DQo8bGk+PHN0cm9uZz5zY3JpcHRJRD0iIiA8L3N0cm9uZz48ZW0+KFJlcXVpcmVkL29wdGlvbmFsKTwvZW0+IDxici8+fCBzZXQgdGhlIElEIFJlcXVpcmVkIG9ubHkgaWYgZ3JvdXBJRCBub3QgY2FsbGVkPGJyLz48L2xpPg0KPGxpPjxzdHJvbmc+Z3JvdXBJRD0iIiA8L3N0cm9uZz48ZW0+KFJlcXVpcmVkL29wdGlvbmFsKTwvZW0+IDxici8+fCBzZXQgdGhlIElEIFJlcXVpcmVkIG9ubHkgaWYgc2NyaXB0SUQgbm90IGNhbGxlZDxici8+PC9saT4NCjwhLS08bGk+PHN0cm9uZz5TYW5kQm94PXRydWUgPC9zdHJvbmc+PGVtPihvcHRpb25hbCk8L2VtPiA8YnIvPnwgZmFsc2U8YnIvPjwvbGk+DQoNCjxsaT48c3Ryb25nPlJVTmFjdGlvbj0iIiA8L3N0cm9uZz48ZW0+KG9wdGlvbmFsKTwvZW0+IDxici8+fCBVRFQ8YnIvPnwgVVJMIDxlbT4oLi4vcGx1Z2lucy9mdW5jdGlvbi5maWxlbmFtZS5waHApPC9lbT48YnIvPnwgKk1vcmUgY29taW5nIFNvb24qPGJyLz48L2xpPg0KPGxpPjxzdHJvbmc+TGFuZz0iIiA8L3N0cm9uZz48ZW0+KG9wdGlvbmFsKTwvZW0+IDxici8+fCBVc2UgQ291bnRyeSBDb2RlcyBUbyBkeW5hbWljbHkgc2V0IHRoZSBsYW5ndWFnZSBvZiB0aGUgUGF5UGFsIHBhZ2U8YnIvPjwvbGk+LS0+DQoNCjwvdWw+DQo8YnIvPg0KDQo8YnIvPjxici8+DQo8aDI+PGEgaWQ9IlByb2JsZW1fRG9tYWluIj48L2E+UHJvYmxlbSBEb21haW48L2gyPg0KPHA+UGFnZXMgdGhhdCByZWZlciB0byBtdWx0aXBsZSBDU1Mgb3IgSmF2YVNjcmlwdCBmaWxlcyBvZnRlbiBzdWZmZXIgZnJvbSBzbG93ZXIgICBwYWdlIGxvYWRzLCBkdWUgdG8gdGhlIGJyb3dzZXIgcmVxdWVzdGluZyBlYWNoIGZpbGUgaW5kaXZpZHVhbGx5LiBNYW55IGJyb3dzZXJzICAgYWxzbyBhcmUgbGltaXRlZCB0byBhIGZldyBzaW11bHRhbmVvdXMgcmVxdWVzdHMgcGVyIGRvbWFpbi4gVGhlIHdhaXQgZm9yIGEgICBzZXJpZXMgb2YgcmVxdWVzdHMgYW5kIHRoZSB0cmFuc2ZlciBvZiB1bm9wdGltaXplZCBmaWxlcyBjYW4gZHJhbWF0aWNhbGx5IHJlZHVjZSAgIHRoZSBjbGllbnQtc2lkZSBwZXJmb3JtYW5jZSBvZiB5b3VyIHNpdGUuIDwvcD4NCjxwPkhlcmUgYXJlIGEgaGFuZGZ1bCBvZiBZYWhvbyFcJ3MgYmVzdCBwcmFjdGljZXMgdGhhdCBhcmUgYWRkcmVzc2VkIGJ5IHRoZSB1c2Ugb2YgU2NyaXB0RGVwbG95LiA8L3A+DQo8dWw+DQogIDxsaT48YSBocmVmPSJodHRwOi8vZGV2ZWxvcGVyLnlhaG9vLmNvbS9wZXJmb3JtYW5jZS9ydWxlcy5odG1sI251bV9odHRwIiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub2ZvbGxvdyI+TWFrZSBGZXdlciBIVFRQIFJlcXVlc3RzPC9hPjwvbGk+DQogIDxsaT48YSBocmVmPSJodHRwOi8vZGV2ZWxvcGVyLnlhaG9vLmNvbS9wZXJmb3JtYW5jZS9ydWxlcy5odG1sI2V4cGlyZXMiIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vZm9sbG93Ij5BZGQgYW4gRXhwaXJlcyBvciBhIENhY2hlLUNvbnRyb2wgSGVhZGVyPC9hPjwvbGk+DQogIDxsaT48YSBocmVmPSJodHRwOi8vZGV2ZWxvcGVyLnlhaG9vLmNvbS9wZXJmb3JtYW5jZS9ydWxlcy5odG1sI2d6aXAiIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vZm9sbG93Ij5HemlwIENvbXBvbmVudHM8L2E+PC9saT4NCiAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9kZXZlbG9wZXIueWFob28uY29tL3BlcmZvcm1hbmNlL3J1bGVzLmh0bWwjbWluaWZ5IiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub2ZvbGxvdyI+TWluaWZ5IEphdmFTY3JpcHQgYW5kIENTUzwvYT48L2xpPg0KICA8bGk+PGEgaHJlZj0iaHR0cDovL2RldmVsb3Blci55YWhvby5jb20vcGVyZm9ybWFuY2UvcnVsZXMuaHRtbCNldGFncyIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9mb2xsb3ciPkNvbmZpZ3VyZSBFVGFnczwvYT48L2xpPg0KICA8bGk+PGEgaHJlZj0iaHR0cDovL2RldmVsb3Blci55YWhvby5jb20vcGVyZm9ybWFuY2UvcnVsZXMuaHRtbCN1bmRlcjI1IiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub2ZvbGxvdyI+S2VlcCBDb21wb25lbnRzIHVuZGVyIDI1SzwvYT48L2xpPg0KPC91bD4NCjxoMz48YSBuYW1lPSJBY2tub3dsZWRnbWVudHMiPjwvYT5BY2tub3dsZWRnbWVudHM8L2gzPg0KPHA+TWluaWZ5IHdhcyBpbnNwaXJlZCBieSA8YSBocmVmPSJodHRwOi8vY29kZS5nb29nbGUuY29tL3AvanNjc3Njb21wLyIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9mb2xsb3ciPmpzY3NzY29tcDwvYT4gYnkgTWF4aW0gTWFydHlueXVrIGFuZCBieSB0aGUgYXJ0aWNsZSBcJzxhIGhyZWY9Imh0dHA6Ly93d3cuaHVubG9jay5jb20vYmxvZ3MvU3VwZXJjaGFyZ2VkX0phdmFzY3JpcHQiIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vZm9sbG93Ij5TdXBlcmNoYXJnZWQgSmF2YVNjcmlwdDwvYT5cJyBieSBQYXRyaWNrIEh1bmxvY2suIDwvcD4NCjxwPlRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmNyb2NrZm9yZC5jb20vamF2YXNjcmlwdC9qc21pbi5odG1sIiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub2ZvbGxvdyI+SlNNaW4gbGlicmFyeTwvYT4gdXNlZCBmb3IgSmF2YVNjcmlwdCBtaW5pZmljYXRpb24gd2FzIG9yaWdpbmFsbHkgICB3cml0dGVuIGJ5IERvdWdsYXMgQ3JvY2tmb3JkIGFuZCB3YXMgPGEgaHJlZj0iaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2pzbWluLXBocCIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9mb2xsb3ciPnBvcnRlZCB0byBQSFA8L2E+IGJ5IFJ5YW4gICBHcm92ZSBzcGVjaWZpY2FsbHkgZm9yIHVzZSBpbiBNaW5pZnkuIDwvcD4NCg0KDQo8aDM+U3VwcG9ydDwvaDM+DQo8aDQ+U2NyZWVuY2FzdHMgZm9yIGV4dHJhIGhlbHAgd2lsbCBmYWxsb3ctLS0gb24gdGhlIFRPRE88L2g0Pg0KPHA+VGhpcyBtb2R1bGUgZG9lcyBub3QgaW5jbHVkZSBjb21tZXJjaWFsIHN1cHBvcnQuIEhvd2V2ZXIsIHRoZXJlIGFyZSBhIG51bWJlciBvZiByZXNvdXJjZXMgYXZhaWxhYmxlIHRvIGhlbHAgeW91IHdpdGggaXQ6PC9wPg0KPHVsPg0KPGxpPkZvciB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBtb2R1bGUgb3IgdG8gZmlsZSBhIGJ1ZyByZXBvcnQgdmlzaXQgPGEgaHJlZj0iaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9wcGJtIj50aGUgQ01TIEZvcmdlPC9hPi48L2xpPg0KPGxpPkFkZGl0aW9uYWwgZGlzY3Vzc2lvbiBvZiB0aGlzIG1vZHVsZSBtYXkgYWxzbyBiZSBmb3VuZCBpbiB0aGUgPGEgaHJlZj0iaHR0cDovL2ZvcnVtLmNtc21hZGVzaW1wbGUub3JnIj5DTVMgTWFkZSBTaW1wbGUgRm9ydW1zPC9hPi48L2xpPg0KPC91bD4NCg0KPGgzPkNvcHlyaWdodCBhbmQgTGljZW5zZTwvaDM+DQo8cD5Db3B5cmlnaHQgJmNvcHk7IDIwMDksIGplcmVteUJhc3MgJmx0OzxhIGhyZWY9Imh0dHA6Ly9jb3JiZW5zcHJvZHVjdHMuY29tIj5jb3JiZW5zcHJvZHVjdHMuY29tPC9hPiZndDsgQWxsIFJpZ2h0cyBBcmUgUmVzZXJ2ZWQuPC9wPg0KPHN0cm9uZz5TdXBwb3J0IG1vcmUgbW9kcyBsaWtlIHRoaXM6PC9zdHJvbmc+PGZvcm0gYWN0aW9uPSJodHRwczovL3d3dy5wYXlwYWwuY29tL2NnaS1iaW4vd2Vic2NyIiBtZXRob2Q9InBvc3QiPg0KPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iY21kIiB2YWx1ZT0iX3MteGNsaWNrIj4NCjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Imhvc3RlZF9idXR0b25faWQiIHZhbHVlPSI4ODE3Njc1Ij4NCjxpbnB1dCB0eXBlPSJpbWFnZSIgc3JjPSJodHRwczovL3d3dy5wYXlwYWwuY29tL2VuX1VTL2kvYnRuL2J0bl9kb25hdGVfTEcuZ2lmIiBib3JkZXI9IjAiIG5hbWU9InN1Ym1pdCIgYWx0PSJQYXlQYWwgLSBUaGUgc2FmZXIsIGVhc2llciB3YXkgdG8gcGF5IG9ubGluZSEiPg0KPGltZyBhbHQ9IiIgYm9yZGVyPSIwIiBzcmM9Imh0dHBzOi8vd3d3LnBheXBhbC5jb20vZW5fVVMvaS9zY3IvcGl4ZWwuZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIj4NCjwvZm9ybT48YnIvPg0KPHA+VGhpcyBtb2R1bGUgaGFzIGJlZW4gcmVsZWFzZWQgdW5kZXIgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTCI+R05VIFB1YmxpYyBMaWNlbnNlPC9hPi4gWW91IG11c3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlIGJlZm9yZSB1c2luZyB0aGUgbW9kdWxlLjwvcD4NCjwvZGl2ID48YiBjbGFzcz0icmJvdHRvbSI+PGIgY2xhc3M9InI0Ij48L2I+PGIgY2xhc3M9InIzIj48L2I+IDxiIGNsYXNzPSJyMiI+PC9iPiA8YiBjbGFzcz0icjEiPjwvYj48L2I+DQoNCjwvZGl2Pg0KJzsNCj8+DQo=]]></data>
	</file>
	<file>
	  <filename>/lang/_notes/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/method.install.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogU2NyaXB0RGVwbG95IC0gTWluaWZ5IGFuZCBkZXBsb3ltZW50IG9mIEpTIENTUyBhbmQgSFRNTCANCiMgTW9kIGRlc2lnbmVkIGJ5IGplcmVteUJhc3MgKGplcmVteUJhc3NAY2FibGVvbmUubmV0KQ0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykNCiMgVGhpcyBwcm9qZWN0J3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcNCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL1NjcmlwdERlcGxveS8NCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5DQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yDQojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQojDQojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBDQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmlmICghaXNzZXQoJGdDbXMpKSBleGl0Ow0KDQoJLy8kZGIgPSYgJGdDbXMtPkdldERiKCk7DQovLwkNCg0KDQoJLy8gbXlzcWwtc3BlY2lmaWMsIGJ1dCBpZ25vcmVkIGJ5IG90aGVyIGRhdGFiYXNlDQoJJHRhYm9wdGFycmF5ID0gYXJyYXkoJ215c3FsJyA9PiAnVFlQRT1NeUlTQU0nKTsNCg0KCSRkaWN0ID0gTmV3RGF0YURpY3Rpb25hcnkoJGRiKTsNCgkNCi8vLy8NCi8vIENyZWF0IGJ0biB0YWJsZQ0KLy8vLw0KCS8vIHRhYmxlIHNjaGVtYSBkZXNjcmlwdGlvbg0KCSRmbGRzID0gIg0KCQlJRCBJIEtFWSBBVVRPLA0KCQlTY3JpcHRTZXQgQygyNTUpDQoJCSI7DQoNCg0KCS8vIGNyZWF0ZSBpdC4gVGhpcyBzaG91bGQgZG8gZXJyb3IgY2hlY2tpbmcsIGJ1dCBJJ20gYSBsYXp5IHNvZC4NCgkkc3FsYXJyYXkgPSAkZGljdC0+Q3JlYXRlVGFibGVTUUwoY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfc2NyaXB0ZGVwbG95X3NjcmlwdG5hbWVzIiwNCgkJCSRmbGRzLCAkdGFib3B0YXJyYXkpOw0KCSRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsNCgkNCgkNCi8vLy8NCi8vIENyZWF0IGJ0biB0YWJsZQ0KLy8vLw0KCSRmbGRzID0gIg0KCQlJRCBJIEtFWSwNCgkJVGVtcGxhdGVJRCBJLA0KCQlNaW5pZnkgSSwNCgkJbWF4QWdlIEksDQoJCXBhdGhPcHRpb24gQygyNTUpLA0KCQlzY3JpcHRUeXBlIEMoMyksDQoJCXNjcmlwdFNpemUgSQ0KCQkiOw0KDQoJLy8gY3JlYXRlIGl0LiBUaGlzIHNob3VsZCBkbyBlcnJvciBjaGVja2luZywgYnV0IEknbSBhIGxhenkgc29kLg0KCSRzcWxhcnJheSA9ICRkaWN0LT5DcmVhdGVUYWJsZVNRTChjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9zY3JpcHRkZXBsb3lfc2NyaXB0b3B0aW9ucyIsDQoJCQkkZmxkcywgJHRhYm9wdGFycmF5KTsNCgkkZGljdC0+RXhlY3V0ZVNRTEFycmF5KCRzcWxhcnJheSk7DQoJDQoJDQoJDQovLy8vDQovLyBDcmVhdCBidG4gdGFibGUNCi8vLy8NCgkkZmxkcyA9ICINCgkJSUQgSSwNCgkJU2NyaXB0SXMgWDINCgkJIjsNCg0KCS8vIGNyZWF0ZSBpdC4gVGhpcyBzaG91bGQgZG8gZXJyb3IgY2hlY2tpbmcsIGJ1dCBJJ20gYSBsYXp5IHNvZC4NCgkkc3FsYXJyYXkgPSAkZGljdC0+Q3JlYXRlVGFibGVTUUwoY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfc2NyaXB0ZGVwbG95X3NjcmlwdHBhcnRzIiwNCgkJCSRmbGRzLCAkdGFib3B0YXJyYXkpOw0KCSRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsNCgkNCi8vLy8NCi8vIENyZWF0IGJ0biB0YWJsZQ0KLy8vLw0KCSRmbGRzID0gIg0KCQlJRCBJIEtFWSBBVVRPLA0KCQlHcm91cHRTZXQgQygyNTUpLA0KCQlHcm91cHRUeXBlIEMoMykNCgkJIjsNCg0KCS8vIGNyZWF0ZSBpdC4gVGhpcyBzaG91bGQgZG8gZXJyb3IgY2hlY2tpbmcsIGJ1dCBJJ20gYSBsYXp5IHNvZC4NCgkkc3FsYXJyYXkgPSAkZGljdC0+Q3JlYXRlVGFibGVTUUwoY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfc2NyaXB0ZGVwbG95X2dyb3VwIiwNCgkJCSRmbGRzLCAkdGFib3B0YXJyYXkpOw0KCSRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsNCi8vLy8NCi8vIENyZWF0IGJ0biB0YWJsZQ0KLy8vLw0KCSRmbGRzID0gIg0KCQlHcm91cHRTZXRJRCBJLA0KCQlTY3JpcHRJRCBJDQoJCSI7DQoNCgkvLyBjcmVhdGUgaXQuIFRoaXMgc2hvdWxkIGRvIGVycm9yIGNoZWNraW5nLCBidXQgSSdtIGEgbGF6eSBzb2QuDQoJJHNxbGFycmF5ID0gJGRpY3QtPkNyZWF0ZVRhYmxlU1FMKGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX3NjcmlwdGRlcGxveV9ncm91cGFzc2lnbm1lbnQiLA0KCQkJJGZsZHMsICR0YWJvcHRhcnJheSk7DQoJJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSgkc3FsYXJyYXkpOw0KDQoNCg0KJHRoaXMtPlNldFByZWZlcmVuY2UoJ2RlYnVnSVQnLCAnMCcpOw0KDQovL2luY2x1ZGUoZGlybmFtZShfX0ZJTEVfXykuJy9hY3Rpb24ubWF0Y2hGRVVuQ0FMLnBocCcpOwkNCgkvLyBwdXQgbWVudGlvbiBpbnRvIHRoZSBhZG1pbiBsb2cNCgkkdGhpcy0+QXVkaXQoIDAsICR0aGlzLT5MYW5nKCdmcmllbmRseW5hbWUnKSwgJHRoaXMtPkxhbmcoJ2luc3RhbGxlZCcsJHRoaXMtPkdldFZlcnNpb24oKSkpOw0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/method.uninstall.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogU2NyaXB0RGVwbG95IC0gTWluaWZ5IGFuZCBkZXBsb3ltZW50IG9mIEpTIENTUyBhbmQgSFRNTCANCiMgTW9kIGRlc2lnbmVkIGJ5IGplcmVteUJhc3MgKGplcmVteUJhc3NAY2FibGVvbmUubmV0KQ0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykNCiMgVGhpcyBwcm9qZWN0J3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcNCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL1NjcmlwdERlcGxveS8NCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5DQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yDQojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQojDQojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBDQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCi8qDQogICAgRm9yIHNlcGFyYXRlZCBtZXRob2RzLCB5b3UnbGwgYWx3YXlzIHdhbnQgdG8gc3RhcnQgd2l0aCB0aGUgZm9sbG93aW5nDQogICAgbGluZSB3aGljaCBjaGVjayB0byBtYWtlIHN1cmUgdGhhdCBtZXRob2Qgd2FzIGNhbGxlZCBmcm9tIHRoZSBtb2R1bGUNCiAgICBBUEksIGFuZCB0aGF0IGV2ZXJ5dGhpbmcncyBzYWZlIHRvIGNvbnRpbnVlOg0KKi8gDQppZiAoIWlzc2V0KCRnQ21zKSkgZXhpdDsNCg0KCSRkYiA9JiAkZ0Ntcy0+R2V0RGIoKTsNCi8vCQ0KCS8vIHJlbW92ZSB0aGUgZGF0YWJhc2UgdGFibGUNCgkkZGljdCA9IE5ld0RhdGFEaWN0aW9uYXJ5KCAkZGIgKTsNCgkkc3FsYXJyYXkgPSAkZGljdC0+RHJvcFRhYmxlU1FMKCBjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9TY3JpcHREZXBsb3lfc2NyaXB0TmFtZXMiICk7DQoJJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSgkc3FsYXJyYXkpOw0KCQ0KCSRzcWxhcnJheSA9ICRkaWN0LT5Ecm9wVGFibGVTUUwoIGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX1NjcmlwdERlcGxveV9zY3JpcHRPcHRpb25zIiApOw0KCSRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsNCgkNCgkkc3FsYXJyYXkgPSAkZGljdC0+RHJvcFRhYmxlU1FMKCBjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9TY3JpcHREZXBsb3lfc2NyaXB0UGFydHMiICk7DQoJJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSgkc3FsYXJyYXkpOw0KCQ0KCSRzcWxhcnJheSA9ICRkaWN0LT5Ecm9wVGFibGVTUUwoIGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX1NjcmlwdERlcGxveV9Hcm91cCIgKTsNCgkkZGljdC0+RXhlY3V0ZVNRTEFycmF5KCRzcWxhcnJheSk7CQ0KCQ0KCSRzcWxhcnJheSA9ICRkaWN0LT5Ecm9wVGFibGVTUUwoIGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX1NjcmlwdERlcGxveV9Hcm91cEFzc2lnbk1lbnQiICk7DQoJJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSgkc3FsYXJyYXkpOwkNCgkNCgkNCgkvLyByZW1vdmUgdGhlIHNlcXVlbmNlDQoJLy8gJGRiLT5Ecm9wU2VxdWVuY2UoIGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX3JhdGVfdGhpc19zZXEiICk7DQovLwkNCi8vCQ0KLy8JDQovLwkvLyByZW1vdmUgdGhlIHByZWZlcmVuY2VzDQovLwkkdGhpcy0+UmVtb3ZlUHJlZmVyZW5jZSgiYm9va2llIik7DQoNCiR0aGlzLT5SZW1vdmVQcmVmZXJlbmNlKCk7DQovLwkNCi8vCS8vIFJlbW92ZSBhbGwgZXZlbnQgaGFuZGxlcnMNCi8vCSR0aGlzLT5SZW1vdmVFdmVudEhhbmRsZXIoJ0Zyb250RW5kVXNlcnMnLCdPbkNyZWF0ZVVzZXInKTsNCi8vCSR0aGlzLT5SZW1vdmVFdmVudEhhbmRsZXIoJ0Zyb250RW5kVXNlcnMnLCdPbkRlbGV0ZVVzZXInKTsNCi8vCSR0aGlzLT5SZW1vdmVFdmVudEhhbmRsZXIoJ0Zyb250RW5kVXNlcnMnLCdPblVwZGF0ZVVzZXInKTsNCi8vCSR0aGlzLT5SZW1vdmVFdmVudEhhbmRsZXIoJ0Zyb250RW5kVXNlcnMnLCdPbkV4cGlyZVVzZXInKTsNCi8vCSR0aGlzLT5SZW1vdmVFdmVudEhhbmRsZXIoJ0Zyb250RW5kVXNlcnMnLCdPbkxvZ2luJyk7DQovLwkkdGhpcy0+UmVtb3ZlRXZlbnRIYW5kbGVyKCdGcm9udEVuZFVzZXJzJywnT25Mb2dvdXQnKTsNCi8vCQ0KCS8vIHB1dCBtZW50aW9uIGludG8gdGhlIGFkbWluIGxvZw0KCSR0aGlzLT5BdWRpdCggMCwgJHRoaXMtPkxhbmcoJ2ZyaWVuZGx5bmFtZScpLCAkdGhpcy0+TGFuZygndW5pbnN0YWxsZWQnKSk7DQoNCj8+]]></data>
	</file>
	<file>
	  <filename>/method.upgrade.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogU2NyaXB0RGVwbG95IC0gTWluaWZ5IGFuZCBkZXBsb3ltZW50IG9mIEpTIENTUyBhbmQgSFRNTCANCiMgTW9kIGRlc2lnbmVkIGJ5IGplcmVteUJhc3MgKGplcmVteUJhc3NAY2FibGVvbmUubmV0KQ0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykNCiMgVGhpcyBwcm9qZWN0J3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcNCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL1NjcmlwdERlcGxveS8NCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5DQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yDQojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQojDQojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBDQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCi8qDQogICAgRm9yIHNlcGFyYXRlZCBtZXRob2RzLCB5b3UnbGwgYWx3YXlzIHdhbnQgdG8gc3RhcnQgd2l0aCB0aGUgZm9sbG93aW5nDQogICAgbGluZSB3aGljaCBjaGVjayB0byBtYWtlIHN1cmUgdGhhdCBtZXRob2Qgd2FzIGNhbGxlZCBmcm9tIHRoZSBtb2R1bGUNCiAgICBBUEksIGFuZCB0aGF0IGV2ZXJ5dGhpbmcncyBzYWZlIHRvIGNvbnRpbnVlOg0KKi8gDQppZiAoIWlzc2V0KCRnQ21zKSkgZXhpdDsNCg0KDQovKiBBZnRlciB0aGlzLCB0aGUgY29kZSBpcyBpZGVudGljYWwgdG8gdGhlIGNvZGUgdGhhdCB3b3VsZCBvdGhlcndpc2UgYmUNCiAgICB3cmFwcGVkIGluIHRoZSBVcGdyYWRlKCkgbWV0aG9kIGluIHRoZSBtb2R1bGUgYm9keS4NCiovDQoNCgkJJGN1cnJlbnRfdmVyc2lvbiA9ICRvbGR2ZXJzaW9uOw0KCQlzd2l0Y2goJGN1cnJlbnRfdmVyc2lvbil7DQoJCQljYXNlICIwLjEiOg0KCQkJICAgICBicmVhazsNCgkJfQ0KCQkNCgkJLy8gcHV0IG1lbnRpb24gaW50byB0aGUgYWRtaW4gbG9nDQoJCSR0aGlzLT5BdWRpdCggMCwgJHRoaXMtPkxhbmcoJ2ZyaWVuZGx5bmFtZScpLCAkdGhpcy0+TGFuZygndXBncmFkZWQnLCR0aGlzLT5HZXRWZXJzaW9uKCkpKTsNCg0KPz4=]]></data>
	</file>
	<file>
	  <filename>/ScriptDeploy.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE1vZHVsZTogU2NyaXB0RGVwbG95IC0gTWluaWZ5IGFuZCBkZXBsb3ltZW50IG9mIEpTIENTUyBhbmQgSFRNTA0KIyBNb2QgZGVzaWduZWQgYnkgamVyZW15QmFzcyAoamVyZW15QmFzc0BjYWJsZW9uZS5uZXQpDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDUgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQ0KIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZw0KIyBUaGUgbW9kdWxlJ3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly9kZXYuY21zbWFkZXNpbXBsZS5vcmcvcHJvamVjdHMvTWluaWZ5Lw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkNCiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0ENCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTA0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KDQpjbGFzcyBTY3JpcHREZXBsb3kgZXh0ZW5kcyBDTVNNb2R1bGUNCnsNCg0KCWZ1bmN0aW9uIEdldE5hbWUoKXsNCgkJcmV0dXJuIGdldF9jbGFzcygkdGhpcyk7DQoJfQ0KCQ0KCWZ1bmN0aW9uIEdldEZyaWVuZGx5TmFtZSgpew0KCQlyZXR1cm4gJHRoaXMtPkxhbmcoJ2ZyaWVuZGx5bmFtZScpOw0KCX0NCgkNCglmdW5jdGlvbiBHZXRWZXJzaW9uKCl7DQoJCXJldHVybiAnMC4yJzsNCgl9DQoJDQoJZnVuY3Rpb24gR2V0SGVscCgpew0KCQlyZXR1cm4gJHRoaXMtPkxhbmcoJ2hlbHAnKTsNCgl9DQoJDQoJZnVuY3Rpb24gR2V0QXV0aG9yKCl7DQoJCXJldHVybiAnamVyZW15QmFzcyc7DQoJfQ0KCQ0KCWZ1bmN0aW9uIEdldEF1dGhvckVtYWlsKCl7DQoJCXJldHVybiAnamVyZW15YmFzc0BjYWJsZW9uZS5uZXQnOw0KCX0NCgkNCglmdW5jdGlvbiBHZXRDaGFuZ2VMb2coKXsNCgkJcmV0dXJuICR0aGlzLT5MYW5nKCdjaGFuZ2Vsb2cnKTsNCgl9DQoJDQoJZnVuY3Rpb24gSXNQbHVnaW5Nb2R1bGUoKXsNCgkJcmV0dXJuIHRydWU7DQoJfQ0KCQ0KCWZ1bmN0aW9uIEhhc0FkbWluKCl7DQoJCXJldHVybiB0cnVlOw0KCX0NCgkNCglmdW5jdGlvbiBHZXRBZG1pblNlY3Rpb24oKXsNCgkJcmV0dXJuICdleHRlbnNpb25zJzsNCgl9DQoJDQoJZnVuY3Rpb24gR2V0QWRtaW5EZXNjcmlwdGlvbigpew0KCQlyZXR1cm4gJHRoaXMtPkxhbmcoJ21vZGRlc2NyaXB0aW9uJyk7DQoJfQ0KCQ0KCWZ1bmN0aW9uIFZpc2libGVUb0FkbWluVXNlcigpew0KCQlyZXR1cm4gJHRoaXMtPkNoZWNrUGVybWlzc2lvbignTW9kaWZ5IENhbGVuZGFyJyk7DQoJfQ0KCQ0KCWZ1bmN0aW9uIEdldERlcGVuZGVuY2llcygpew0KCQlyZXR1cm4gYXJyYXkoKTsNCgl9DQoJDQoJZnVuY3Rpb24gTWluaW11bUNNU1ZlcnNpb24oKXsNCgkJcmV0dXJuICIxLjYuNiI7DQoJfQ0KCQ0KCWZ1bmN0aW9uIEluc3RhbGxQb3N0TWVzc2FnZSgpew0KCQlyZXR1cm4gJHRoaXMtPkxhbmcoJ3Bvc3RpbnN0YWxsJyk7DQoJfQ0KCQ0KCWZ1bmN0aW9uIFVuaW5zdGFsbFBvc3RNZXNzYWdlKCl7DQoJCXJldHVybiAkdGhpcy0+TGFuZygncG9zdHVuaW5zdGFsbCcpOw0KCX0NCg0KCWZ1bmN0aW9uIFVuaW5zdGFsbFByZU1lc3NhZ2UoKXsNCgkJcmV0dXJuIGZhbHNlOy8vJHRoaXMtPkxhbmcoJ3JlYWxseV91bmluc3RhbGwnKTsNCgl9DQoJZnVuY3Rpb24gRmlyZURlYnVnKCRjb21tYW5kLCRtZXNzYWdlLCR2YXJpYWJsZXM9YXJyYXkoKSl7DQoJIGlmKCR0aGlzLT5HZXRQcmVmZXJlbmNlKCdkZWJ1Z0lUJyk9PTEpeyAkZmlyZXBocG1vZHVsZT0kdGhpcy0+R2V0TW9kdWxlSW5zdGFuY2UoJ0ZpcmVQSFBEZWJ1ZycpOw0KCSAgaWYgKCRmaXJlcGhwbW9kdWxlKXsNCgkJLy9Nb2R1bGUgZm91bmQNCgkJJGZpcmVwaHBtb2R1bGUtPlNldE1vZHVsZU5hbWUoJHRoaXMtPkdldE5hbWUoKSk7DQoJCSRmaXJlcGhwbW9kdWxlLT5Db21tYW5kKCRjb21tYW5kLCAkbWVzc2FnZSwgJHZhcmlhYmxlcyk7DQoJICB9IC8vZWxzZSBNb2R1bGUgbm90IGZvdW5kDQoJIH0NCgl9Ly8kdGhpcy0+RmlyZURlYnVnKCdtZXNzYWdlJywkayk7Ly88PDw8LS0tLS0tRmlyZSBQSFAgbWVzc2FnZQ0KCWZ1bmN0aW9uIHJlY3Vyc2l2ZV9ybWRpcigkZGlyKQ0KCSB7DQoJCS8vIGFsbCBzdWJkaXJlY3RvcmllcyBhbmQgY29udGVudHM6DQoJCWlmKGlzX2RpcigkZGlyKSl7DQoJCQkkZGlyX2hhbmRsZT1vcGVuZGlyKCRkaXIpOw0KCQl9ZWxzZXsNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCQl3aGlsZSgkZmlsZT1yZWFkZGlyKCRkaXJfaGFuZGxlKSkNCgkJew0KCQlpZigkZmlsZSE9Ii4iICYmICRmaWxlIT0iLi4iKQ0KCQl7DQoJCWlmKCFpc19kaXIoJGRpci4iLyIuJGZpbGUpKXVubGluayAoJGRpci4iLyIuJGZpbGUpOw0KCQllbHNlICR0aGlzLT5yZWN1cnNpdmVfcm1kaXIoJGRpci4iLyIuJGZpbGUpOw0KCQl9DQoJCX0NCgkJY2xvc2VkaXIoJGRpcl9oYW5kbGUpOw0KCQlybWRpcigkZGlyKTsNCgkJcmV0dXJuIHRydWU7DQoJfQ0KDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKi0tLS1Eby1maW5hbC1vdXRwdXQtc3RlcHMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCglmdW5jdGlvbiBmaWxlc3RpbWUoJElELCR0eXBlKXsNCgkJZ2xvYmFsICRnQ21zOw0KCQkkY29uZmlnID0mICRnQ21zLT5HZXRDb25maWcoKTsgDQoJCSRjb2RlVG9GaWxlPScnOw0KCQkkc21hcnR5T249JHRoaXMtPkdldFByZWZlcmVuY2UoJ3NtYXJ0eU9uJywnMCcpOw0KCQlpZigkdHlwZT09InNjcmlwdElEIil7DQoJCQlleHRyYWN0KCR0aGlzLT5UaWVBU2NyaXB0KCdzZWxlY3QnLCRJRCkpOw0KCQkJaWYoJFNjcmlwdElzIT0nJyl7DQoJCQkJJGNvZGVUb0ZpbGU9JFNjcmlwdElzOw0KCQkJfQ0KCQkJaWYoJHBhdGhPcHRpb24hPScnKXsNCgkJCQkkY29kZVRvRmlsZT1maWxlX2dldF9jb250ZW50cygkcGF0aE9wdGlvbik7DQoJCQl9DQoJCX1lbHNlaWYoJHR5cGU9PSJncm91cElEIil7DQoJCQkkR3JvdXBBcnJheT0kdGhpcy0+VGllQVNjcmlwdCgnc2VsZWN0R3JvdXBJdGVtcycsJElEKTsNCgkJCWZvcmVhY2goJEdyb3VwQXJyYXkgYXMgJGtleSA9PiAkSUQpew0KCQkJCWV4dHJhY3QoJHRoaXMtPlRpZUFTY3JpcHQoJ3NlbGVjdCcsJElEKSk7DQoJCQkJaWYoJFNjcmlwdElzIT0nJyl7DQoJCQkJCSRjb2RlVG9GaWxlLj0nDQoJCQkJCScuJFNjcmlwdElzOw0KCQkJCX0NCgkJCQlpZigkcGF0aE9wdGlvbiE9Jycpew0KCQkJCQkkY29kZVRvRmlsZS49Jw0KCQkJCQknLmZpbGVfZ2V0X2NvbnRlbnRzKCRwYXRoT3B0aW9uKTsNCgkJCQl9DQoJCQl9DQoJCX0NCgkJaWYoJHNjcmlwdFR5cGUhPScnKXsNCgkJCSR0eXBlPSRzY3JpcHRUeXBlOw0KCQl9DQoJCWlmKCRzbWFydHlPbj09MSl7DQoJCQkkc3RyaW5nID0gJGNvZGVUb0ZpbGU7IA0KCQkJJHBhdHRlcm4gPSAnL1x7Lyc7IA0KCQkJJHJlcGxhY2VtZW50ID0gJ15eXic7IA0KCQkJJHN0cmluZyA9IHByZWdfcmVwbGFjZSgkcGF0dGVybiwgJHJlcGxhY2VtZW50LCAkc3RyaW5nKTsgDQoJCQkkcGF0dGVybiA9ICcvXH0vJzsgDQoJCQkkcmVwbGFjZW1lbnQgPSAnKioqJzsgDQoJCQkkc3RyaW5nID0gcHJlZ19yZXBsYWNlKCRwYXR0ZXJuLCAkcmVwbGFjZW1lbnQsICRzdHJpbmcpOyANCgkJCSRwYXR0ZXJuID0gJy86OjooWy4kX2EtejAtOVxzLV0qKTo6Oi8nOyANCgkJCSRyZXBsYWNlbWVudCA9ICd7JDF9JzsgDQoJCQkkc3RyaW5nID0gcHJlZ19yZXBsYWNlKCRwYXR0ZXJuLCAkcmVwbGFjZW1lbnQsICRzdHJpbmcpOw0KCQkJJHN0cmluZz0kdGhpcy0+UHJvY2Vzc1RlbXBsYXRlRnJvbURhdGEoJHN0cmluZyk7IA0KCQkJJHBhdHRlcm4gPSAnL1xeXF5cXi8nOyANCgkJCSRyZXBsYWNlbWVudCA9ICd7JzsgDQoJCQkkc3RyaW5nID0gcHJlZ19yZXBsYWNlKCRwYXR0ZXJuLCAkcmVwbGFjZW1lbnQsICRzdHJpbmcpOyANCgkJCSRwYXR0ZXJuID0gJy9cKlwqXCovJzsgDQoJCQkkcmVwbGFjZW1lbnQgPSAnfSc7IA0KCQkJJHN0cmluZyA9IHByZWdfcmVwbGFjZSgkcGF0dGVybiwgJHJlcGxhY2VtZW50LCAkc3RyaW5nKTsgDQoJCQkkY29kZVRvRmlsZT0kc3RyaW5nOyANCgkJfQ0KCQkkb3VwdXQgPSBhcnJheSgkY29kZVRvRmlsZSwkdHlwZSk7DQoJCXJldHVybiAkb3VwdXQ7DQoJfQ0KDQovKioNCiogRGlzcGxheSBhIHNpbXBsZSBtZXNzYWdlDQoqLw0KCWZ1bmN0aW9uIERpc3BsYXlNZXNzYWdlKCRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCwgJHRpdGxlLCAkbWVzc2FnZSl7DQoJCSR0aGlzLT5zbWFydHktPmFzc2lnbigndGl0bGUnLCAkdGl0bGUpOw0KCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ21lc3NhZ2UnLCAkbWVzc2FnZSk7DQoJCWVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnbWVzc2FnZS50cGwnKTsNCgl9DQogIA0KLyoqDQoqIENoZWNrIGlmIGN1cnJlbnQgdXNlciBpcyBhbGxvd2VkIHRvIHBvc3QNCiovDQoJZnVuY3Rpb24gUmVhbFVSTCgpew0KCQlnbG9iYWwgJGdDbXM7DQoJCSR1cmxCQVNFID0gImh0dHA6Ly8iLiRfU0VSVkVSWydIVFRQX0hPU1QnXS4kX1NFUlZFUlsnU0NSSVBUX05BTUUnXTsNCgkJaWYgKCFlbXB0eSgkX1NFUlZFUlsiUVVFUllfU1RSSU5HIl0pKQ0KCQkkdXJsQkFTRSAuPSAiPyIuJF9TRVJWRVJbJ1FVRVJZX1NUUklORyddOw0KCQlpZiAoaXNzZXQoJGdDbXMtPmNvbmZpZ1snYXNzdW1lX21vZF9yZXdyaXRlJ10pICYmICgkZ0Ntcy0+Y29uZmlnWydhc3N1bWVfbW9kX3Jld3JpdGUnXT09dHJ1ZSkgfHwgKGlzc2V0KCRnQ21zLT5jb25maWdbJ3VybF9yZXdyaXRpbmcnXSkmJiAkZ0Ntcy0+Y29uZmlnWyd1cmxfcmV3cml0aW5nJ109PSdtb2RfcmV3cml0ZScpKXsNCgkJCSR1cmxzID0gc3RyX3JlcGxhY2UoImluZGV4LnBocD9wYWdlPSIsICIiLCAkdXJsQkFTRSk7DQoJCQkkdXJscyA9IHN0cl9yZXBsYWNlKCJpbmRleC5waHAiLCAiIiwgJHVybHMpOw0KCQl9ZWxzZXsNCgkJCSR1cmxzID0gJHVybEJBU0U7DQoJCX0NCgkJcmV0dXJuICR1cmxzOw0KCX0NCg0KCWZ1bmN0aW9uIFJlZGlyZWN0VVJMKCRzZWN1cmVSZWRpcmVjdCl7DQoJCWdsb2JhbCAkZ0NtczsNCgkJJFJlZGlyZWN0VVJMPSR0aGlzLT5HZXRQcmVmZXJlbmNlKCdSZWRpcmVjdFVSTCcsJycpOw0KCQlpZigkUmVkaXJlY3RVUkwhPScnKXsNCgkJCWlmIChpc3NldCgkZ0Ntcy0+Y29uZmlnWydhc3N1bWVfbW9kX3Jld3JpdGUnXSkgJiYgKCRnQ21zLT5jb25maWdbJ2Fzc3VtZV9tb2RfcmV3cml0ZSddPT10cnVlKSB8fCAoaXNzZXQoJGdDbXMtPmNvbmZpZ1sndXJsX3Jld3JpdGluZyddKSYmICRnQ21zLT5jb25maWdbJ3VybF9yZXdyaXRpbmcnXT09J21vZF9yZXdyaXRlJykpew0KCQkJCSR1cmxzID0gJFJlZGlyZWN0VVJMOw0KCQkJCSR1cmxzIC49Ij8iLiRzZWN1cmVSZWRpcmVjdDsNCgkJCX1lbHNlew0KCQkJCSR1cmxzID0gJFJlZGlyZWN0VVJMOw0KCQkJCSR1cmxzIC49IiYiLiRzZWN1cmVSZWRpcmVjdDsNCgkJCX0NCgkJfWVsc2V7DQoJCQkkdXJsQkFTRSA9ICJodHRwOi8vIi4kX1NFUlZFUlsnSFRUUF9IT1NUJ10uJF9TRVJWRVJbJ1NDUklQVF9OQU1FJ107DQoJCQlpZiAoIWVtcHR5KCRfU0VSVkVSWyJRVUVSWV9TVFJJTkciXSkpDQoJCQkkdXJsQkFTRSAuPSAiPyIuJF9TRVJWRVJbJ1FVRVJZX1NUUklORyddOw0KCQkJaWYgKGlzc2V0KCRnQ21zLT5jb25maWdbJ2Fzc3VtZV9tb2RfcmV3cml0ZSddKSAmJiAoJGdDbXMtPmNvbmZpZ1snYXNzdW1lX21vZF9yZXdyaXRlJ109PXRydWUpIHx8IChpc3NldCgkZ0Ntcy0+Y29uZmlnWyd1cmxfcmV3cml0aW5nJ10pJiYgJGdDbXMtPmNvbmZpZ1sndXJsX3Jld3JpdGluZyddPT0nbW9kX3Jld3JpdGUnKSl7DQoJCQkJJHVybHMgPSBzdHJfcmVwbGFjZSgiaW5kZXgucGhwP3BhZ2U9IiwgIiIsICR1cmxCQVNFKTsNCgkJCQkkdXJscyA9IHN0cl9yZXBsYWNlKCJpbmRleC5waHAiLCAiIiwgJHVybHMpOw0KCQkJCSR1cmxzIC49Ij8iLiRzZWN1cmVSZWRpcmVjdDsNCgkJCX1lbHNlew0KCQkJCSR1cmxzID0gJHVybEJBU0U7DQoJCQkJJHVybHMgLj0iJiIuJHNlY3VyZVJlZGlyZWN0Ow0KCQkJfQ0KCQl9DQoJCXJldHVybiAkdXJsczsNCgl9DQoNCglmdW5jdGlvbiBteVJlZGlyZWN0VG9UYWIoICRpZCwgJHRhYiwgJHBhcmFtcyA9ICcnICl7DQoJCSRwYXJtcyA9IGFycmF5KCk7DQoJCWlmKGlzX2FycmF5KCRwYXJhbXMpKXsNCgkJCSRwYXJtcyA9ICRwYXJhbXM7DQoJCX0NCgkJJHBhcm1zID0gYXJyYXkoJ2FjdGl2ZV90YWInID0+ICR0YWIgKTsNCgkJJHRoaXMtPm15UmVkaXJlY3QoICRpZCwgJ2RlZmF1bHRhZG1pbicsICRwYXJtcyApOw0KCX0NCg0KCWZ1bmN0aW9uIG15UmVkaXJlY3QoICRpZCwgJGFjdGlvbiwgJHBhcmFtcyA9ICcnICl7DQoJCXVuc2V0KCAkcGFyYW1zWydhY3Rpb24nXSApOw0KCQkkdGhpcy0+UmVkaXJlY3QoICRpZCwgJGFjdGlvbiwgJycsICRwYXJhbXMgKTsNCgl9DQoJDQoJDQoJDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyotLS0tTWFrZWluZy1hbGwtdGhlLVNlbGVjdGlvbnMtLURCLWNhbGxzLS0tLS0tLS0tLS0tKi8NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCQkNCglmdW5jdGlvbiBUaWVBU2NyaXB0KCRhY3Rpb249J3NlbGVjdCcsJHNjcmlwdElEPScnLCRHcm91cHRTZXRJRD0nJyl7DQoJCSRkYiA9JiAkdGhpcy0+R2V0RGIoKTsNCgkJJHJldHJlc3VsdCA9IGFycmF5KCk7DQoJCSRyZXN1bHRzID0gYXJyYXkoKTsNCgkJJHRoaXMtPkZpcmVEZWJ1ZygnbWVzc2FnZScsJGFjdGlvbik7Ly88PDw8LS0tLS0tRmlyZSBQSFAgbWVzc2FnZQ0KCQkkdGhpcy0+RmlyZURlYnVnKCdtZXNzYWdlJywkc2NyaXB0SUQpOy8vPDw8PC0tLS0tLUZpcmUgUEhQIG1lc3NhZ2UNCgkJJHRoaXMtPkZpcmVEZWJ1ZygnbWVzc2FnZScsJEdyb3VwdFNldElEKTsvLzw8PDwtLS0tLS1GaXJlIFBIUCBtZXNzYWdlDQoJCSRyPScnOw0KCQkNCgkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoJCS8qLS0tLS0tUHVsbC1BLVNjcmlwdC0tLS0tLS0qLw0KCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCgkJaWYoJGFjdGlvbj09J3NlbGVjdCcpew0KCQkJDQoJCQkkZGIgPSYgJHRoaXMtPkdldERiKCk7DQoJCQkkcmV0cmVzdWx0ID0gYXJyYXkoKTsNCgkJCSRyZXN1bHRzID0gYXJyYXkoKTsJDQoJCQkNCgkJCSRxdWVyeSA9ICdTRUxFQ1QgKiBGUk9NICcuY21zX2RiX3ByZWZpeCgpLidtb2R1bGVfc2NyaXB0ZGVwbG95X3NjcmlwdG5hbWVzIEFTIHNuICcNCgkJCQkuJ0xFRlQgSk9JTiAnLmNtc19kYl9wcmVmaXgoKS4nbW9kdWxlX3NjcmlwdGRlcGxveV9zY3JpcHRvcHRpb25zIEFTIHNvIE9OIHNuLklEID0gc28uSUQgJw0KCQkJCS4nTEVGVCBKT0lOICcuY21zX2RiX3ByZWZpeCgpLidtb2R1bGVfc2NyaXB0ZGVwbG95X3NjcmlwdHBhcnRzIEFTIHNwIE9OIHNuLklEID0gc3AuSUQgJw0KCQkJCS4nV0hFUkUgc24uSUQgPSAnLiRzY3JpcHRJRC4nJzsNCgkJCQkNCgkJCSRyZXN1bHQgPSAmJGRiLT5FeGVjdXRlKCRxdWVyeSk7DQoJCQ0KCQkJd2hpbGUgKCRyZXN1bHQgJiYgISRyZXN1bHQtPkVPRil7DQoJCQkJJGRhS2V5PSRyZXN1bHQtPmZpZWxkc1snSUQnXTsNCgkJCQkkcmVzdWx0c1snU2NyaXB0SUQnXT0gJHJlc3VsdC0+ZmllbGRzWydJRCddOw0KCQkJCSRyZXN1bHRzWydTY3JpcHRTZXQnXT0gJHJlc3VsdC0+ZmllbGRzWydTY3JpcHRTZXQnXTsNCgkJCQkkcmVzdWx0c1snTWluaWZ5J109ICRyZXN1bHQtPmZpZWxkc1snTWluaWZ5J107DQoJCQkJJHJlc3VsdHNbJ21heEFnZSddPSAkcmVzdWx0LT5maWVsZHNbJ21heEFnZSddOw0KCQkJCSRyZXN1bHRzWydwYXRoT3B0aW9uJ109ICRyZXN1bHQtPmZpZWxkc1sncGF0aE9wdGlvbiddOw0KCQkJCSRyZXN1bHRzWydTY3JpcHRJcyddPSAkcmVzdWx0LT5maWVsZHNbJ1NjcmlwdElzJ107DQoJCQkJJHJlc3VsdHNbJ3NjcmlwdFR5cGUnXT0gJHJlc3VsdC0+ZmllbGRzWydzY3JpcHRUeXBlJ107DQoJCQkJJHJlc3VsdHNbJ3NjcmlwdFNpemUnXT0gJHJlc3VsdC0+ZmllbGRzWydzY3JpcHRTaXplJ107DQoJCQkJJHJldHJlc3VsdFskZGFLZXldID0gJHJlc3VsdHM7DQoJCQkJJHJlc3VsdC0+TW92ZU5leHQoKTsNCgkJCX0NCgkJCSR0aGlzLT5GaXJlRGVidWcoJ21lc3NhZ2UnLCdSZXN1bHRzICcuJHJldHJlc3VsdFskc2NyaXB0SURdKTsvLzw8PDwtLS0tLS1GaXJlIFBIUCBtZXNzYWdlDQoJCQlyZXR1cm4gJHJldHJlc3VsdFskc2NyaXB0SURdOwkJDQoJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KCQkvKi0tUHVsbC1BLUxpc3QtT2YtU2NyaXB0cy0tKi8NCgkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoJCX1lbHNlaWYoJGFjdGlvbj09J3NlbGVjdExpc3QnKXsNCgkJCSR0aGlzLT5GaXJlRGVidWcoJ21lc3NhZ2UnLCdHb3QgaGVyZScpOy8vPDw8PC0tLS0tLUZpcmUgUEhQIG1lc3NhZ2UNCgkJCSRkYiA9JiAkdGhpcy0+R2V0RGIoKTsNCgkJDQoJCQkkcmV0cmVzdWx0ID0gYXJyYXkoKTsNCgkJCSRyZXN1bHRzID0gYXJyYXkoKTsJDQoJCQ0KCQkJJHF1ZXJ5ID0gJ1NFTEVDVCAqIEZST00gJy5jbXNfZGJfcHJlZml4KCkuJ21vZHVsZV9zY3JpcHRkZXBsb3lfc2NyaXB0bmFtZXMgQVMgc24gJw0KCQkJLidMRUZUIEpPSU4gJy5jbXNfZGJfcHJlZml4KCkuJ21vZHVsZV9zY3JpcHRkZXBsb3lfc2NyaXB0b3B0aW9ucyBBUyBzbyBPTiBzbi5JRCA9IHNvLklEJzsNCgkJCSRyZXN1bHQgPSAmJGRiLT5FeGVjdXRlKCRxdWVyeSk7DQoJCQ0KCQkJd2hpbGUgKCRyZXN1bHQgJiYgISRyZXN1bHQtPkVPRil7DQoJCQkJJGRhS2V5PSRyZXN1bHQtPmZpZWxkc1snSUQnXTsNCgkJCQkkcmVzdWx0c1snU2NyaXB0U2V0J109ICRyZXN1bHQtPmZpZWxkc1snU2NyaXB0U2V0J107DQoJCQkJJHJlc3VsdHNbJ01pbmlmeSddPSAkcmVzdWx0LT5maWVsZHNbJ01pbmlmeSddOw0KCQkJCSRyZXN1bHRzWydtYXhBZ2UnXT0gJHJlc3VsdC0+ZmllbGRzWydtYXhBZ2UnXTsNCgkJCQkkcmVzdWx0c1sncGF0aE9wdGlvbiddPSAkcmVzdWx0LT5maWVsZHNbJ3BhdGhPcHRpb24nXTsNCgkJCQkkcmVzdWx0c1snc2NyaXB0VHlwZSddPSAkcmVzdWx0LT5maWVsZHNbJ3NjcmlwdFR5cGUnXTsNCgkJCQkkcmVzdWx0c1snc2NyaXB0U2l6ZSddPSAkcmVzdWx0LT5maWVsZHNbJ3NjcmlwdFNpemUnXTsNCgkJCQkkcmV0cmVzdWx0WyRkYUtleV0gPSAkcmVzdWx0czsNCgkJCQkkcmVzdWx0LT5Nb3ZlTmV4dCgpOw0KCQkJfQ0KCQkJcmV0dXJuICRyZXRyZXN1bHQ7DQoJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KCQkvKi0tUHVsbC1BLUxpc3QtT2YtR3JvdXBzLS0tKi8NCgkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoJCX1lbHNlaWYoJGFjdGlvbj09J3NlbGVjdEdyb3VwTGlzdCcpew0KCQkJDQoJCQkkZGIgPSYgJHRoaXMtPkdldERiKCk7DQoJCQ0KCQkJJHJldHJlc3VsdCA9IGFycmF5KCk7DQoJCQkkcmVzdWx0cyA9IGFycmF5KCk7CQ0KDQoJCQkkcXVlcnkgPSAnU0VMRUNUICogRlJPTSAnLmNtc19kYl9wcmVmaXgoKS4nbW9kdWxlX1NjcmlwdERlcGxveV9Hcm91cCBBUyBzZEcgJw0KCQkJCS4nTEVGVCBKT0lOICcuY21zX2RiX3ByZWZpeCgpLidtb2R1bGVfU2NyaXB0RGVwbG95X0dyb3VwQXNzaWduTWVudCBBUyBzZEdtIE9OIHNkRy5JRCA9IHNkR20uR3JvdXB0U2V0SUQnOw0KCQkJJHJlc3VsdCA9ICYkZGItPkV4ZWN1dGUoJHF1ZXJ5KTsNCg0KCQkJd2hpbGUgKCRyZXN1bHQgJiYgISRyZXN1bHQtPkVPRil7DQoJCQkJJGRhS2V5PSRyZXN1bHQtPmZpZWxkc1snSUQnXTsNCgkJCQkkcmVzdWx0c1snR3JvdXB0U2V0J109ICRyZXN1bHQtPmZpZWxkc1snR3JvdXB0U2V0J107DQoJCQkJJHJlc3VsdHNbJ0dyb3VwdFR5cGUnXT0gJHJlc3VsdC0+ZmllbGRzWydHcm91cHRUeXBlJ107DQoJCQkJDQoJCQkJaWYoaXNzZXQoJHJlc3VsdC0+ZmllbGRzWydTY3JpcHRJRCddKSl7DQoJCQkJCSRyZXN1bHRzWydTY3JpcHRJRCddPSAnJzsNCgkJCQl9ZWxzZXsNCgkJCQkJJHJlc3VsdHNbJ1NjcmlwdElEJ109ICcnOw0KCQkJCX0NCgkJCQkkdGhpcy0+RmlyZURlYnVnKCdtZXNzYWdlJyxjb3VudCgkcmVzdWx0LT5maWVsZHNbJ1NjcmlwdElEJ10pKTsvLzw8PDwtLS0tLS1GaXJlIFBIUCBtZXNzYWdlDQoJCQkJJHJldHJlc3VsdFskZGFLZXldID0gJHJlc3VsdHM7DQoJCQkJJHJlc3VsdC0+TW92ZU5leHQoKTsNCgkJCX0NCgkJCXJldHVybiAkcmV0cmVzdWx0Ow0KCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCgkJLyotLS0tUHVsbC1BLUdyb3Vwcy1MaXN0LS0tLSovDQoJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KCQl9ZWxzZWlmKCRhY3Rpb249PSdzZWxlY3RHcm91cHNMaXN0aW5ncycpew0KCQkJJHRoaXMtPkZpcmVEZWJ1ZygnbWVzc2FnZScsJ0dvdCBoZXJlJyk7Ly88PDw8LS0tLS0tRmlyZSBQSFAgbWVzc2FnZQ0KCQkJJGRiID0mICR0aGlzLT5HZXREYigpOw0KCQkNCgkJCSRyZXRyZXN1bHQgPSBhcnJheSgpOw0KCQkJJHJlc3VsdHMgPSBhcnJheSgpOwkNCg0KCQkJJHF1ZXJ5ID0gJ1NFTEVDVCBTY3JpcHRTZXQsc2NyaXB0U2l6ZSxTY3JpcHRJRCBGUk9NICcuY21zX2RiX3ByZWZpeCgpLidtb2R1bGVfU2NyaXB0RGVwbG95X0dyb3VwIEFTIHNkRyAnDQoJCQkJLidMRUZUIEpPSU4gJy5jbXNfZGJfcHJlZml4KCkuJ21vZHVsZV9TY3JpcHREZXBsb3lfR3JvdXBBc3NpZ25NZW50IEFTIHNkR20gT04gc2RHLklEID0gc2RHbS5Hcm91cHRTZXRJRCAnDQoJCQkJLidMRUZUIEpPSU4gJy5jbXNfZGJfcHJlZml4KCkuJ21vZHVsZV9zY3JpcHRkZXBsb3lfc2NyaXB0b3B0aW9ucyBBUyBzbyBPTiBzby5JRCA9IHNkR20uU2NyaXB0SUQgJw0KCQkJCS4nTEVGVCBKT0lOICcuY21zX2RiX3ByZWZpeCgpLidtb2R1bGVfc2NyaXB0ZGVwbG95X3NjcmlwdG5hbWVzIEFTIHNuIE9OIHNvLklEID0gc24uSUQgJw0KCQkJCS4nV0hFUkUgc2RHLklEID0gJy4kc2NyaXB0SUQuJyc7DQoJCQkkcmVzdWx0ID0gJiRkYi0+RXhlY3V0ZSgkcXVlcnkpOw0KCQkNCgkJCXdoaWxlICgkcmVzdWx0ICYmICEkcmVzdWx0LT5FT0Ypew0KCQkJCSRkYUtleT0kcmVzdWx0LT5maWVsZHNbJ1NjcmlwdElEJ107DQoJCQkJJHJlc3VsdHNbJ1NjcmlwdFNldCddPSAkcmVzdWx0LT5maWVsZHNbJ1NjcmlwdFNldCddOw0KCQkJCSRyZXN1bHRzWydzY3JpcHRTaXplJ109ICRyZXN1bHQtPmZpZWxkc1snc2NyaXB0U2l6ZSddOw0KCQkJCSRyZXRyZXN1bHRbJGRhS2V5XSA9ICRyZXN1bHRzOw0KCQkJCSRyZXN1bHQtPk1vdmVOZXh0KCk7DQoJCQl9DQoJCQlyZXR1cm4gJHJldHJlc3VsdDsNCgkJCQ0KCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCgkJLyotLS0tUHVsbC1BLUdyb3Vwcy1MaXN0LS0tLSovDQoJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KCQl9ZWxzZWlmKCRhY3Rpb249PSdzZWxlY3RHcm91cCcpew0KCQkJJHRoaXMtPkZpcmVEZWJ1ZygnbWVzc2FnZScsJ0dvdCBoZXJlJyk7Ly88PDw8LS0tLS0tRmlyZSBQSFAgbWVzc2FnZQ0KCQkJJGRiID0mICR0aGlzLT5HZXREYigpOw0KCQkNCgkJCSRyZXRyZXN1bHQgPSBhcnJheSgpOw0KCQkJJHJlc3VsdHMgPSBhcnJheSgpOwkNCg0KCQkJJHF1ZXJ5ID0gJ1NFTEVDVCAqIEZST00gJy5jbXNfZGJfcHJlZml4KCkuJ21vZHVsZV9TY3JpcHREZXBsb3lfR3JvdXAgQVMgc2RHICcNCgkJCQkuJ1dIRVJFIHNkRy5JRCA9ICcuJHNjcmlwdElELicnOw0KCQkJJHJlc3VsdCA9ICYkZGItPkV4ZWN1dGUoJHF1ZXJ5KTsNCgkJDQoJCQl3aGlsZSAoJHJlc3VsdCAmJiAhJHJlc3VsdC0+RU9GKXsNCgkJCQkkZGFLZXk9JHJlc3VsdC0+ZmllbGRzWydJRCddOw0KCQkJCSRyZXN1bHRzWydHcm91cHRTZXQnXT0gJHJlc3VsdC0+ZmllbGRzWydHcm91cHRTZXQnXTsNCgkJCQkkcmVzdWx0c1snR3JvdXB0VHlwZSddPSAkcmVzdWx0LT5maWVsZHNbJ0dyb3VwdFR5cGUnXTsNCgkJCQkNCgkJCQkNCgkJCQkkcmV0cmVzdWx0WyRkYUtleV0gPSAkcmVzdWx0czsNCgkJCQkkcmVzdWx0LT5Nb3ZlTmV4dCgpOw0KCQkJfQ0KCQkJcmV0dXJuICRyZXRyZXN1bHRbJHNjcmlwdElEXTsJDQoJCQkNCgkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoJCS8qLS0tLVB1bGwtQS1Hcm91cHMtTGlzdC0jLS0qLw0KCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCgkJfWVsc2VpZigkYWN0aW9uPT0nc2VsZWN0R3JvdXBJdGVtcycpew0KCQkJJHRoaXMtPkZpcmVEZWJ1ZygnbWVzc2FnZScsJ0dvdCBoZXJlJyk7Ly88PDw8LS0tLS0tRmlyZSBQSFAgbWVzc2FnZQ0KCQkJJGRiID0mICR0aGlzLT5HZXREYigpOw0KCQkNCgkJCSRyZXRyZXN1bHQgPSBhcnJheSgpOw0KCQkJJHJlc3VsdHMgPSBhcnJheSgpOwkNCg0KCQkJJHF1ZXJ5ID0gJ1NFTEVDVCBTY3JpcHRJRCBGUk9NICcuY21zX2RiX3ByZWZpeCgpLidtb2R1bGVfc2NyaXB0ZGVwbG95X2dyb3VwYXNzaWdubWVudCBBUyBzZEdtICcNCgkJCQkuJ1dIRVJFIHNkR20uR3JvdXB0U2V0SUQgPSAnLiRzY3JpcHRJRC4nJzsNCgkJCSRyZXN1bHQgPSAmJGRiLT5FeGVjdXRlKCRxdWVyeSk7DQoJCQl3aGlsZSAoJHJlc3VsdCAmJiAhJHJlc3VsdC0+RU9GKXsNCgkJCQlhcnJheV9wdXNoKCRyZXN1bHRzLCAkcmVzdWx0LT5maWVsZHNbJ1NjcmlwdElEJ10pOw0KCQkJCSRyZXN1bHQtPk1vdmVOZXh0KCk7DQoJCQl9DQoJCQlyZXR1cm4gJHJlc3VsdHM7CQ0KCQkJDQoNCgkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoJCS8qLS0tLUNoZWNrLUZvci1BLVNjcmlwdC0tLS0qLw0KCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCgkJfWVsc2VpZigkYWN0aW9uPT0nc2VsZWN0R3JvdXBTTlVNJyl7DQoJCQkkdGhpcy0+RmlyZURlYnVnKCdtZXNzYWdlJywnR290IGhlcmUnKTsvLzw8PDwtLS0tLS1GaXJlIFBIUCBtZXNzYWdlDQoJCQkkZGIgPSYgJHRoaXMtPkdldERiKCk7DQoJCQ0KCQkJJHJldHJlc3VsdCA9IGFycmF5KCk7DQoJCQkkcmVzdWx0cyA9IGFycmF5KCk7CQ0KDQoJCQkkcXVlcnkgPSAnU0VMRUNUIFNjcmlwdElEIEZST00gJy5jbXNfZGJfcHJlZml4KCkuJ21vZHVsZV9zY3JpcHRkZXBsb3lfZ3JvdXBhc3NpZ25tZW50IEFTIHNkR20gJw0KCQkJCS4nV0hFUkUgc2RHbS5Hcm91cHRTZXRJRCA9ICcuJHNjcmlwdElELicnOw0KCQkJJHJlc3VsdCA9ICYkZGItPkV4ZWN1dGUoJHF1ZXJ5KTsNCgkJCSRzY2lwdG51bWJlcj0wOw0KCQkJd2hpbGUgKCRyZXN1bHQgJiYgISRyZXN1bHQtPkVPRil7DQoJCQkJJHNjaXB0bnVtYmVyPSRzY2lwdG51bWJlcisxOw0KCQkJCSRyZXN1bHQtPk1vdmVOZXh0KCk7DQoJCQl9DQoJCQlyZXR1cm4gJHNjaXB0bnVtYmVyOwkNCgkJCQ0KDQoJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KCQkvKi0tLS1DaGVjay1Gb3ItQS1TY3JpcHQtLS0tKi8NCgkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoJCX1lbHNlaWYoJGFjdGlvbj09J0NoZWNrU2NyaXB0Jyl7DQoJCQkkcXVlcnkgPSAnU0VMRUNUICogRlJPTSAnLmNtc19kYl9wcmVmaXgoKS4nbW9kdWxlX1NjcmlwdERlcGxveV9Hcm91cEFzc2lnbk1lbnQgJw0KCQkJCS4nV0hFUkUgU2NyaXB0SUQ9Jy4kc2NyaXB0SUQuJyBBTkQgR3JvdXB0U2V0SUQ9Jy4kR3JvdXB0U2V0SUQuJyc7DQoJCQkkcmVzdWx0ID0gJiRkYi0+RXhlY3V0ZSgkcXVlcnkpOw0KCQkJCWlmKCRyZXN1bHQgJiYgISRyZXN1bHQtPkVPRil7JHI9JHNjcmlwdElEO31lbHNleyRyPScnO30NCgkJCQkkdGhpcy0+RmlyZURlYnVnKCdtZXNzYWdlJywnZm9yIFNjcmlwdElEICcuJHNjcmlwdElELicgaGFzOiAnLiRyKTsvLzw8PDwtLS0tLS1GaXJlIFBIUCBtZXNzYWdlDQoJCQlyZXR1cm4gJHI7DQoJCX0JCQkNCgl9DQoJDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyotLS0tR2V0LXRoZS1zZXQtb2YtdGhlLWZpbGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCQ0KCWZ1bmN0aW9uIFNpemVJdFVwKCRzaXplKXsNCgkgaWYoJHNpemUgPCAxMDI0KXsNCgkJICAkc2l6ZTI9IiRzaXplIGJ5dGVzIjsNCiAgICAgIH0NCiAgICAgIGlmKCRzaXplID4gMTAyNCAmJiAkc2l6ZSA8IDEwNDg1NzYpew0KCQkgICRzaXplMT0gbnVtYmVyX2Zvcm1hdCgkc2l6ZS8xMDI0LDIpOw0KCQkgICRzaXplMj0iJHNpemUxIEtiIjsNCiAgICAgIH0NCiAgICAgIGlmKCRzaXplID4gMTA0ODU3Nil7DQoJCSAgJHNpemUxPSBudW1iZXJfZm9ybWF0KCRzaXplLzEwNDg1NzYsMik7DQoJCSAgJHNpemUyPSIkc2l6ZTEgTWIiOw0KICAgICAgfQkNCgkgIHJldHVybiAkc2l6ZTI7DQoJfQ0KDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKi0tLS1TY3JpcHQtTGlzdC1TZXQtdXAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KCQ0KCWZ1bmN0aW9uIF9BZG1pbkNyZWF0ZVRlbXBsYXRlTGlzdCggJGlkLCAkcmV0dXJuaWQsICRwcmVmaXgsICRkZWZhdWx0dGVtcGxhdGVwcmVmLCANCgkJCQkJCSAkYWN0aXZlX3RhYiwgJGRlZmF1bHRwcmVmbmFtZSwNCgkJCQkJCSAkdGl0bGUpew0KCQkvLyB3ZSdyZSBnb25uYSBhbGxvdyBtdWx0aXBsZSB0ZW1wbGF0ZXMgaGVyZQ0KCQkvLyBidXQgd2UncmUgZ29ubmEgcHJlZml4IHRoZW0gYWxsIHdpdGggc29tZXRoaW5nDQoJCWdsb2JhbCAkZ0NtczsNCgkJDQoJCSRmYWxzZWltYWdlMSA9ICRnQ21zLT52YXJpYWJsZXNbJ2FkbWludGhlbWUnXS0+RGlzcGxheUltYWdlKCdpY29ucy9zeXN0ZW0vZmFsc2UuZ2lmJywnbWFrZSBkZWZhdWx0JywnJywnJywnc3lzdGVtaWNvbicpOw0KCQkkdHJ1ZWltYWdlMSA9ICRnQ21zLT52YXJpYWJsZXNbJ2FkbWludGhlbWUnXS0+RGlzcGxheUltYWdlKCdpY29ucy9zeXN0ZW0vdHJ1ZS5naWYnLCdkZWZhdWx0JywnJywnJywnc3lzdGVtaWNvbicpOw0KCQkkYWxsZGJQcm9maWxlcyA9ICR0aGlzLT5UaWVBU2NyaXB0KCdzZWxlY3RMaXN0Jyk7DQoJCSRyb3dhcnJheSA9IGFycmF5KCk7DQoJCSRyb3djbGFzcyA9ICdyb3cxJzsNCgkJDQoNCgkJDQoJCWZvcmVhY2goJGFsbGRiUHJvZmlsZXMgYXMgJGtleSA9PiAkb25lZGJQcm9maWxlICl7DQoJCQkkU2NyaXB0U2V0PSAkb25lZGJQcm9maWxlWydTY3JpcHRTZXQnXTsNCgkJCSRNaW5pZnk9ICRvbmVkYlByb2ZpbGVbJ01pbmlmeSddOw0KCQkJJG1heEFnZT0gJG9uZWRiUHJvZmlsZVsnbWF4QWdlJ107DQoJCQkkcGF0aE9wdGlvbj0gJG9uZWRiUHJvZmlsZVsncGF0aE9wdGlvbiddOw0KCQkJJHNjcmlwdFR5cGU9ICRvbmVkYlByb2ZpbGVbJ3NjcmlwdFR5cGUnXTsNCgkJCSRzY3JpcHRTaXplPSAkb25lZGJQcm9maWxlWydzY3JpcHRTaXplJ107CQ0KCQkgDQoJCQkkcm93ID0gbmV3IFN0ZENsYXNzKCk7DQoJCQkNCgkJCQ0KCQkJDQoJCQkNCgkJCSRyb3ctPm5hbWUgPSAkdGhpcy0+Q3JlYXRlTGluayggJGlkLCAnZWRpdHRlbXBsYXRlJywgJHJldHVybmlkLA0KCQkJCQkJCSRrZXksIGFycmF5KCdTY3JpcHRTZXQnID0+ICRrZXksDQoJCQkJCQkJCQknYWN0aXZlX3RhYicgPT4gJGFjdGl2ZV90YWIsDQoJCQkJCQkJCQknbW9kZSc9PidlZGl0JykpOw0KCQkJJHJvdy0+ZGVmYXVsdCA9ICR0aGlzLT5DcmVhdGVMaW5rKCAkaWQsICdlZGl0dGVtcGxhdGUnLCAkcmV0dXJuaWQsDQoJCQkJCQkJJFNjcmlwdFNldCwgYXJyYXkoJ1NjcmlwdFNldCcgPT4gJGtleSwNCgkJCQkJCQkJCSdhY3RpdmVfdGFiJyA9PiAkYWN0aXZlX3RhYiwNCgkJCQkJCQkJCSdtb2RlJz0+J2VkaXQnKSk7DQoJCQkvLyRyb3ctPnR5cGVJY29uID0nPGltZyBzcmM9Ii4uL21vZHVsZXMvU2NyaXB0RGVwbG95L2ltYWdlcy8nLiRzY3JpcHRUeXBlLicucG5nIiB3aWR0aD0iMzUiIGhlaWdodD0iMzUiIC8+JzsNCgkJCWlmKCRNaW5pZnk9PTEpew0KCQkJCSRtaW5pbWc9JzxpbWcgc3JjPSIuLi9tb2R1bGVzL1NjcmlwdERlcGxveS9pbWFnZXMvTWluLnBuZyIgd2lkdGg9IjM1IiBoZWlnaHQ9IjM1IiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7IHotaW5kZXg6OTk7dG9wOjBweDsiLz4nOw0KCQkJfWVsc2V7DQoJCQkJJG1pbmltZz0nJzsNCgkJCX0NCgkJCSRyb3ctPnR5cGVJY29uID0nPGRpdiBzdHlsZT0iIHBvc2l0aW9uOnJlbGF0aXZlOyBoZWlnaHQ6MzVweDsiPicuJG1pbmltZy4nPGltZyBzcmM9Ii4uL21vZHVsZXMvU2NyaXB0RGVwbG95L2ltYWdlcy8nLiRzY3JpcHRUeXBlLicucG5nIiB3aWR0aD0iMzUiIGhlaWdodD0iMzUiIHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTsgei1pbmRleDo5OyB0b3A6MHB4OyIvPjwvZGl2Pic7DQoJCQkkcm93LT5CdG4gPSAka2V5Ow0KCQkJJHJvdy0+cm93Y2xhc3MgPSAkcm93Y2xhc3M7DQoJCQkkcm93LT5lZGl0bGluayA9ICR0aGlzLT5DcmVhdGVMaW5rKCAkaWQsICdlZGl0dGVtcGxhdGUnLCAkcmV0dXJuaWQsDQoJCQkJCQkJCSRnQ21zLT52YXJpYWJsZXNbJ2FkbWludGhlbWUnXS0+DQoJCQkJCQkJCURpc3BsYXlJbWFnZSAoJ2ljb25zL3N5c3RlbS9lZGl0LmdpZicsDQoJCQkJCQkJCQkgICR0aGlzLT5MYW5nICgnZWRpdCcpLCAnJywgJycsICdzeXN0ZW1pY29uJyksDQoJCQkJCQkJCWFycmF5ICgnU2NyaXB0U2V0JyA9PiAka2V5LA0KCQkJCQkJCQkgICAnYWN0aXZlX3RhYicgPT4gJGFjdGl2ZV90YWIsDQoJCQkJCQkJCSAgICdtb2RlJz0+J2VkaXQnKSk7DQoJCQkkcm93LT50eXBlID0gJHNjcmlwdFR5cGU7DQoJCQkkcm93LT5zY3JpcHRTaXplID0gJHRoaXMtPlNpemVJdFVwKCRzY3JpcHRTaXplKTsNCgkJCSRyb3ctPmRlbGV0ZWxpbmsgPSAkdGhpcy0+Q3JlYXRlTGluayggJGlkLCAnZGVsZXRldGVtcGxhdGUnLCAkcmV0dXJuaWQsDQoJCQkJCQkJICAkZ0Ntcy0+dmFyaWFibGVzWydhZG1pbnRoZW1lJ10tPg0KCQkJCQkJCSAgRGlzcGxheUltYWdlICgnaWNvbnMvc3lzdGVtL2RlbGV0ZS5naWYnLA0KCQkJCQkJCQkJJHRoaXMtPkxhbmcgKCdkZWxldGUnKSwgJycsICcnLCAnc3lzdGVtaWNvbicpLA0KCQkJCQkJCSAgYXJyYXkgKCdTY3JpcHRJRCcgPT4gJGtleSksDQoJCQkJCQkJICAkdGhpcy0+TGFuZyAoJ2FyZXlvdXN1cmUnKSk7DQoJCQkNCgkJCQ0KCQkJYXJyYXlfcHVzaCAoJHJvd2FycmF5LCAkcm93KTsNCgkJCSgkcm93Y2xhc3MgPT0gInJvdzEiID8gJHJvd2NsYXNzID0gInJvdzIiIDogJHJvd2NsYXNzID0gInJvdzEiKTsNCgkJfQ0KCQkNCgkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpdGVtcycsICRyb3dhcnJheSApOw0KCQkNCgkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0eXBlX2xhYmVsJywgJHRoaXMtPkxhbmcoJ3R5cGVfbGFiZWwnKSk7DQoJCSR0aGlzLT5zbWFydHktPmFzc2lnbignTmFtZV9sYWJlbCcsICR0aGlzLT5MYW5nKCdTY3JpcHRTZXRfbGFiZWwnKSk7DQoJCSR0aGlzLT5zbWFydHktPmFzc2lnbignbmFtZXByb21wdF9sYWJlbCcsICR0aGlzLT5MYW5nKCdwcm9tcHRfbmFtZScpKTsNCgkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdTY3JpcHROYW1lX2xhYmVsJywgJHRoaXMtPkxhbmcoJ1NjcmlwdE5hbWVfbGFiZWwnKSk7DQoJCSR0aGlzLT5zbWFydHktPmFzc2lnbignU2luZ2xlQ29kZV9sYWJlbCcsICR0aGlzLT5MYW5nKCdTaW5nbGVDb2RlX2xhYmVsJykpOy8vJHRoaXMtPkxhbmcoJ3Byb21wdF9kZWZhdWx0JykNCgkJDQoJCSANCgkJDQoJCSR0aGlzLT5zbWFydHktPmFzc2lnbignbmV3dGVtcGxhdGVsaW5rJywNCgkJCQkgICR0aGlzLT5DcmVhdGVMaW5rKCAkaWQsICdlZGl0dGVtcGxhdGUnLCAkcmV0dXJuaWQsDQoJCQkJCQkJICR0aGlzLT5MYW5nKCdwcm9tcHRfbmV3U2NyaXB0JyksDQoJCQkJCQkJIGFycmF5KCdwcmVmaXgnID0+ICRwcmVmaXgsDQoJCQkJCQkJICAgJ2FjdGl2ZV90YWInID0+ICRhY3RpdmVfdGFiLA0KCQkJCQkJCSAgICd0aXRsZSc9PiR0aXRsZSwNCgkJCQkJCQkgICAnbW9kZScgPT4gJ2FkZCcsDQoJCQkJCQkJICAgJ2RlZmF1bHR0ZW1wbGF0ZXByZWYnID0+ICRkZWZhdWx0dGVtcGxhdGVwcmVmDQoJCQkJCQkJICAgKSkpOw0KCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJHRoaXMtPkNyZWF0ZUZvcm1FbmQoKSk7DQoJCWVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnZWRpdHRlbXBsYXRlcy50cGwnKTsNCgl9DQoJDQoJDQoJDQoJDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyotLS0tR3JvdXAtTGlzdC1TZXQtdXAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCglmdW5jdGlvbiBfQWRtaW5DcmVhdGVBc3NpZ25tZW50TGlzdCggJGlkLCAkcmV0dXJuaWQsICRwcmVmaXgsICRkZWZhdWx0dGVtcGxhdGVwcmVmLCANCgkJCQkJCSAkYWN0aXZlX3RhYiwgJGRlZmF1bHRwcmVmbmFtZSwNCgkJCQkJCSAkdGl0bGUpew0KCQkvLyB3ZSdyZSBnb25uYSBhbGxvdyBtdWx0aXBsZSB0ZW1wbGF0ZXMgaGVyZQ0KCQkvLyBidXQgd2UncmUgZ29ubmEgcHJlZml4IHRoZW0gYWxsIHdpdGggc29tZXRoaW5nDQoJCWdsb2JhbCAkZ0NtczsNCgkJDQoJCSRmYWxzZWltYWdlMSA9ICRnQ21zLT52YXJpYWJsZXNbJ2FkbWludGhlbWUnXS0+RGlzcGxheUltYWdlKCdpY29ucy9zeXN0ZW0vZmFsc2UuZ2lmJywnbWFrZSBkZWZhdWx0JywnJywnJywnc3lzdGVtaWNvbicpOw0KCQkkdHJ1ZWltYWdlMSA9ICRnQ21zLT52YXJpYWJsZXNbJ2FkbWludGhlbWUnXS0+RGlzcGxheUltYWdlKCdpY29ucy9zeXN0ZW0vdHJ1ZS5naWYnLCdkZWZhdWx0JywnJywnJywnc3lzdGVtaWNvbicpOw0KCQkkYWxsZGJQcm9maWxlcyA9ICR0aGlzLT5UaWVBU2NyaXB0KCdzZWxlY3RHcm91cExpc3QnKTsNCgkJJHJvd2FycmF5ID0gYXJyYXkoKTsNCgkJJHJvd2NsYXNzID0gJ3JvdzEnOw0KCQkNCg0KDQoJCWZvcmVhY2goJGFsbGRiUHJvZmlsZXMgYXMgJGtleSA9PiAkb25lZGJQcm9maWxlICl7DQoJCQkkR3JvdXB0U2V0PSAkb25lZGJQcm9maWxlWydHcm91cHRTZXQnXTsNCgkJCSRTY3JpcHROdW09ICR0aGlzLT5UaWVBU2NyaXB0KCdzZWxlY3RHcm91cFNOVU0nLCRrZXkpOw0KCQkJJEdyb3VwdFR5cGU9ICRvbmVkYlByb2ZpbGVbJ0dyb3VwdFR5cGUnXTsNCgkJCQ0KDQoJCQkJJHRoaXMtPkZpcmVEZWJ1ZygnZXJyb3InLCRrZXkpOy8vPDw8PC0tLS0tLUZpcmUgUEhQIG1lc3NhZ2UNCgkJCSRyb3cgPSBuZXcgU3RkQ2xhc3MoKTsNCgkJCSRyb3ctPm5hbWUgPSAkdGhpcy0+Q3JlYXRlTGluayggJGlkLCAnZWRpdGFzc2lnbm1lbnQnLCAkcmV0dXJuaWQsDQoJCQkJCQkJJGtleSwgYXJyYXkoJ0dyb3VwdFNldCcgPT4gJGtleSwNCgkJCQkJCQkJCSdhY3RpdmVfdGFiJyA9PiAkYWN0aXZlX3RhYiwNCgkJCQkJCQkJCSdtb2RlJz0+J2VkaXQnKSk7DQoJCQkNCgkJCWlmKGlzc2V0KCRTY3JpcHROdW0pJiYkU2NyaXB0TnVtIT0wKXsNCgkJCQkkcm93LT5TYW1wbGU9JzxoMz57Y21zX21vZHVsZSBtb2R1bGU9U2NyaXB0RGVwbG95IGdyb3VwSUQ9IicuJGtleS4nIiBTdHlwZT0iJy4kR3JvdXB0VHlwZS4nIn08L2gzPic7DQoJCQl9ZWxzZXsNCgkJCQkkcm93LT5TYW1wbGU9JzxoNT4nLiR0aGlzLT5MYW5nICgnZW10cHlHcm91cCcpLic8L2g1Pic7DQoJCQl9DQoJCQkNCgkJCSRyb3ctPmRlZmF1bHQgPSAkdGhpcy0+Q3JlYXRlTGluayggJGlkLCAnZWRpdGFzc2lnbm1lbnQnLCAkcmV0dXJuaWQsDQoJCQkJCQkJJEdyb3VwdFNldCwgYXJyYXkoJ0dyb3VwdFNldCcgPT4gJGtleSwNCgkJCQkJCQkJCSdhY3RpdmVfdGFiJyA9PiAkYWN0aXZlX3RhYiwNCgkJCQkJCQkJCSdtb2RlJz0+J2VkaXQnKSk7DQoJCQkkcm93LT5CdG4gPSAka2V5Ow0KCQkJJHJvdy0+TnVtYmVyT2YgPSAkU2NyaXB0TnVtOw0KCQkJJHJvdy0+cm93Y2xhc3MgPSAkcm93Y2xhc3M7DQoJCQkkcm93LT50eXBlSWNvbiA9JzxkaXYgc3R5bGU9IiBwb3NpdGlvbjpyZWxhdGl2ZTsgaGVpZ2h0OjM1cHg7Ij48aW1nIHNyYz0iLi4vbW9kdWxlcy9TY3JpcHREZXBsb3kvaW1hZ2VzLycuJEdyb3VwdFR5cGUuJy5wbmciIHdpZHRoPSIzNSIgaGVpZ2h0PSIzNSIgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlOyB6LWluZGV4Ojk7IHRvcDowcHg7Ii8+PC9kaXY+JzsNCgkJCSRyb3ctPmVkaXRsaW5rID0gJHRoaXMtPkNyZWF0ZUxpbmsoICRpZCwgJ2VkaXRhc3NpZ25tZW50JywgJHJldHVybmlkLA0KCQkJCQkJCQkkZ0Ntcy0+dmFyaWFibGVzWydhZG1pbnRoZW1lJ10tPg0KCQkJCQkJCQlEaXNwbGF5SW1hZ2UgKCdpY29ucy9zeXN0ZW0vZWRpdC5naWYnLA0KCQkJCQkJCQkJICAkdGhpcy0+TGFuZyAoJ2VkaXQnKSwgJycsICcnLCAnc3lzdGVtaWNvbicpLA0KCQkJCQkJCQlhcnJheSAoJ0dyb3VwdFNldCcgPT4gJGtleSwNCgkJCQkJCQkJICAgJ2FjdGl2ZV90YWInID0+ICRhY3RpdmVfdGFiLA0KCQkJCQkJCQkgICAnbW9kZSc9PidlZGl0JykpOw0KCQkJDQoJCQkNCgkJCSRyb3ctPmRlbGV0ZWxpbmsgPSAkdGhpcy0+Q3JlYXRlTGluayggJGlkLCAnZGVsZXRlYXNzaWdubWVudCcsICRyZXR1cm5pZCwNCgkJCQkJCQkgICRnQ21zLT52YXJpYWJsZXNbJ2FkbWludGhlbWUnXS0+DQoJCQkJCQkJICBEaXNwbGF5SW1hZ2UgKCdpY29ucy9zeXN0ZW0vZGVsZXRlLmdpZicsDQoJCQkJCQkJCQkkdGhpcy0+TGFuZyAoJ2RlbGV0ZScpLCAnJywgJycsICdzeXN0ZW1pY29uJyksDQoJCQkJCQkJICBhcnJheSAoJ0dyb3VwdFNldCcgPT4gJGtleSksDQoJCQkJCQkJICAkdGhpcy0+TGFuZyAoJ2FyZXlvdXN1cmUnKSk7DQoJCQkNCgkJCQ0KCQkJYXJyYXlfcHVzaCAoJHJvd2FycmF5LCAkcm93KTsNCgkJCSgkcm93Y2xhc3MgPT0gInJvdzEiID8gJHJvd2NsYXNzID0gInJvdzIiIDogJHJvd2NsYXNzID0gInJvdzEiKTsNCgkJfQ0KCQkNCgkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdBc3NfaXRlbXMnLCAkcm93YXJyYXkgKTsNCgkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdBc3NfaGVhZGVyJywgJHRoaXMtPkxhbmcoJ0Fzc19oZWFkZXInKSk7DQoJCSR0aGlzLT5zbWFydHktPmFzc2lnbignU2FtcGxlQ29kZScsICR0aGlzLT5MYW5nKCdTYW1wbGVUYWcnKSk7Ly8kdGhpcy0+TGFuZygncHJvbXB0X2RlZmF1bHQnKQ0KCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ25ld1NjcmlwdEFzc2xpbmsnLA0KCQkJCSAgJHRoaXMtPkNyZWF0ZUxpbmsoICRpZCwgJ2VkaXRhc3NpZ25tZW50JywgJHJldHVybmlkLA0KCQkJCQkJCSAkdGhpcy0+TGFuZygncHJvbXB0X25ld1NjcmlwdEFzcycpLA0KCQkJCQkJCSBhcnJheSgncHJlZml4JyA9PiAkcHJlZml4LA0KCQkJCQkJCSAgICdhY3RpdmVfdGFiJyA9PiAkYWN0aXZlX3RhYiwNCgkJCQkJCQkgICAndGl0bGUnPT4kdGl0bGUsDQoJCQkJCQkJICAgJ21vZGUnID0+ICdhZGQnLA0KCQkJCQkJCSAgICdkZWZhdWx0dGVtcGxhdGVwcmVmJyA9PiAkZGVmYXVsdHRlbXBsYXRlcHJlZg0KCQkJCQkJCSAgICkpKTsNCgkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCR0aGlzLT5DcmVhdGVGb3JtRW5kKCkpOw0KCQllY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ2VkaXRBc3NpZ25tZW50cy50cGwnKTsNCgl9DQoJDQoJZnVuY3Rpb24gcG9zdF9pdCgkZGF0YXN0cmVhbSwgJHVybCl7IA0KCQkkdXJsID0gcHJlZ19yZXBsYWNlKCJAXmh0dHA6Ly9AaSIsICIiLCAkdXJsKTsgDQoJCSRob3N0ID0gc3Vic3RyKCR1cmwsIDAsIHN0cnBvcygkdXJsLCAiLyIpKTsgDQoJCSR1cmkgPSBzdHJzdHIoJHVybCwgIi8iKTsNCgkJJHJlcWJvZHkgPSAiIjsgDQoJCWZvcmVhY2goJGRhdGFzdHJlYW0gYXMgJGtleT0+JHZhbCl7IA0KCQkJaWYgKCEoJHJlcWJvZHk9PScnKSkgJHJlcWJvZHkuPSAiJiI7IA0KCQkJJHJlcWJvZHkuPSAka2V5LiI9Ii51cmxlbmNvZGUoJHZhbCk7IA0KCQl9DQoJCWhlYWRlcigiTG9jYXRpb246IGh0dHA6Ly8kaG9zdCR1cmk/JHJlcWJvZHkiKTsgZGllOw0KCQlyZXR1cm4gJHJlc3VsdDsgDQoJfQ0KfQ0KPz4NCg==]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/admin_email.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGgzPnskbW9kX3ByZWZzX3RpdGxlfTwvaDM+DQoNCntpZiAkbWVzc2FnZSE9Jyd9PHA+eyRtZXNzYWdlfTwvcD57L2lmfQ0KeyRmb3JtX3N0YXJ0fQ0KDQoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JGFsbG93X2d1ZXN0X2xhYmVsfTo8L3A+DQoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskYWxsb3dfZ3Vlc3RfaW5wdXR9PC9wPg0KCTwvZGl2Pg0KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQoJCTxwIGNsYXNzPSJwYWdldGV4dCI+eyRncm91cF9sYWJlbH06PC9wPg0KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij57JGdyb3VwX2lucHV0fTwvcD4NCgk8L2Rpdj4NCgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPg0KCQk8cCBjbGFzcz0icGFnZXRleHQiPnskd3lzaXd5Z19sYWJlbH06PC9wPg0KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij57JHd5c2l3eWdfaW5wdXR9PC9wPg0KCTwvZGl2Pg0KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQoJCTxwIGNsYXNzPSJwYWdldGV4dCI+Jm5ic3A7PC9wPg0KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij57JGZvcm1fc3VibWl0fTwvcD4NCgk8L2Rpdj4NCnskZm9ybV9lbmR9DQo=]]></data>
	</file>
	<file>
	  <filename>/templates/admin_manualassignment.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGgzPnskbW9kX3ByZWZzX3RpdGxlfTwvaDM+DQo8aHIvPg0KDQp7aWYgJG1lc3NhZ2UhPScnfTxwPnskbWVzc2FnZX08L3A+ey9pZn0NCnskZm9ybV9zdGFydH0NCg0KIA0KICAgICA8aDE+R2VuZXJhbCBCdXR0b24gT3B0aW9uPC9oMT4NCiAgICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPg0KICAgICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRSZWRpcmVjdFVSTF9sYWJlbH06PC9wPg0KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij57JFJlZGlyZWN0VVJMX2lucHV0fTwvcD48YnIvPg0KICAgICAgICAgICAgICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JGNhbmNlbF9yZXR1cm5fbGFiZWx9OjwvcD4NCgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRjYW5jZWxfcmV0dXJuX2lucHV0fTwvcD4NCiAgICAgICAgDQogICAgICAgIA0KICAgICAgICA8YnIvPg0KICAgICAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskbm9fc2hpcHBpbmdfbGFiZWx9OjwvcD4NCgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRub19zaGlwcGluZ19pbnB1dH08L3A+DQogICAgICAgIDxici8+DQogICAgICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRub3RpZnlfdXJsX2xhYmVsfTo8L3A+DQoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskbm90aWZ5X3VybF9pbnB1dH08L3A+DQogICAgICAgIDxici8+DQoJPC9kaXY+ICAgDQogICA8aHIvPiAgIA0KICAgIA0KICAgIA0KICAgIA0KDQoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4mbmJzcDs8L3A+DQoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskZm9ybV9zdWJtaXR9PC9wPg0KCTwvZGl2Pg0KDQogICAgIAkNCnskZm9ybV9lbmR9DQo=]]></data>
	</file>
	<file>
	  <filename>/templates/admin_options.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[DQo8aDM+eyRtb2RfcHJlZnNfdGl0bGV9PC9oMz4NCjxoci8+DQoNCntpZiAkbWVzc2FnZSE9Jyd9PHA+eyRtZXNzYWdlfTwvcD57L2lmfQ0KeyRmb3JtX3N0YXJ0fQ0KPGgxPnNtYXJ0eU9uPC9oMT4NCiAgICAgICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHNtYXJ0eU9uX2xhYmVsfTo8L3A+DQoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskc21hcnR5T25faW5wdXR9PC9wPg0KICAgICAgICA8YnIvPg0KICAgIDxoMT57JGRlYnVnVH08L2gxPg0KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQogICAgICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRkZWJ1Z0lUX2xhYmVsfTo8L3A+DQogICAgICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskZGVidWdJVF9pbnB1dH08L3A+PGJyLz48YnIvPg0KCTwvZGl2Pg0KICAgIDxoci8+DQoNCjxwIGNsYXNzPSJwYWdlaW5wdXQiPnskQ2xlYXJfaW5wdXR9OnskQ2xlYXJfbGFiZWx9eyRjbGVhcmVkX2xhYmVsfTwvcD4NCgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPg0KCQk8cCBjbGFzcz0icGFnZXRleHQiPiZuYnNwOzwvcD4NCgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRmb3JtX3N1Ym1pdH08L3A+DQoJPC9kaXY+DQoNCiAgICAgCQ0KeyRmb3JtX2VuZH0NCg==]]></data>
	</file>
	<file>
	  <filename>/templates/editAssignment.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCjxoMz57JHRpdGxlfTwvaDM+DQo8L2Rpdj4NCnskZm9ybXN0YXJ0fXskaGlkZGVufXskaGlkZGVuTW9kZX0NCjxoMSBjbGFzcz0iaW5pU2l6ZSIgc3R5bGU9ImZsb2F0OnJpZ2h0OyI+eyRHcm91cHRTaXplX2xhYmVsfTogPHNwYW4+eyRHcm91cHRTaXplfTwvc3Bhbj48L2gxPg0KPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCiAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij5Hcm91cHRTZXQ6PC9wPg0KICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JEdyb3VwdFNldH08L3A+DQogICA8cCBjbGFzcz0icGFnZXRleHQiPkdyb3VwdFR5cGU6PC9wPg0KICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JEdyb3VwdFR5cGV9PC9wPg0KICANCiAgDQoge2lmICgkU2NyaXB0UGlja2VyIT0nJyl9IDxwIGNsYXNzPSJwYWdldGV4dCI+U2NyaXB0UGlja2VyOjwvcD4NCiAgPGRpdiBzdHlsZT0iIHdpZHRoOjI1MHB4OyBoZWlnaHQ6MTUwcHg7IG92ZXJmbG93OmF1dG87IG1hcmdpbjoxZW0gMCAwLjJlbSAyMCU7IGJhY2tncm91bmQtY29sb3I6Izk5OTsgYm9yZGVyOmdyb292ZSAycHggIzAwOTsiPg0KPGRpdiBzdHlsZT0iaGVpZ3RoOjE1MHB4O3dpZHRoOjUwMHB4OyI+e2ZvcmVhY2ggZnJvbT0kU2NyaXB0UGlja2VyIGl0ZW09ZW50cnl9DQogICB7JGVudHJ5LT5TY3JpcHRuYW1lfTxsYWJlbD57JGVudHJ5LT5TY3JpcHRuYW1lTGFibGV9PC9sYWJlbD4mbmJzcDsmbmJzcDsNCnsvZm9yZWFjaH08L2Rpdj4NCiAgPC9kaXY+ey9pZn0NCjwvZGl2Pg0KPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCiAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij4mbmJzcDs8L3A+DQogIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskZG9uZX17JGFkZH17JHN1Ym1pdH17JGNhbmNlbH08L3A+DQo8L2Rpdj4NCnskZm9ybWVuZH0NCntpZiAoKCRTY3JpcHRMaXN0IT0nJykmJihjb3VudCgkU2NyaXB0TGlzdCkhPTAmJmNvdW50KCRTY3JpcHRMaXN0KSE9bnVsbCkpfTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyIgc3R5bGU9IntpZiAhaXNzZXQoJFNjcmlwdExpc3QpfWRpc3BsYXk6bm9uZTt7L2lmfSI+DQo8dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJwYWdldGFibGUiID4NCiAgPHRoZWFkPg0KICAgIDx0cj4NCiAgICAgIDx0aCA+eyROYW1lX2xhYmVsfTwvdGg+DQogICAgICA8dGg+eyRTY3JpcHROYW1lX2xhYmVsfTwvdGg+DQogICAgICA8dGggY2xhc3M9InBhZ2VpY29uIj4mbmJzcDs8L3RoPg0KICAgICAgPHRoIGNsYXNzPSJwYWdlaWNvbiI+Jm5ic3A7PC90aD4NCiAgICAgIDx0aCBjbGFzcz0icGFnZWljb24iPiZuYnNwOzwvdGg+DQogICAgPC90cj4NCiAgPC90aGVhZD4NCiB7Zm9yZWFjaCBmcm9tPSRTY3JpcHRMaXN0IGl0ZW09ZW50cnl9DQogICA8dHIgY2xhc3M9InskZW50cnktPnJvd2NsYXNzfSI+DQogICAgIDx0ZD48aDI+eyRlbnRyeS0+bmFtZX08L2gyPjwvdGQ+DQogICAgIDx0ZD48aDIgc3R5bGU9ImRpc3BsYXk6aW5saW5lOyI+eyRlbnRyeS0+ZGVmYXVsdH0gQDwvaDI+PGgyIGNsYXNzPSJjb3VudFNpemUiIHN0eWxlPSJkaXNwbGF5OmlubGluZTsiPnskZW50cnktPnNjcmlwdFNpemV9PC9oMj48L3RkPg0KICAgICA8dGQ+eyRlbnRyeS0+b3JkZXJVcGxpbmt9PC90ZD4NCiAgICAgPHRkPnskZW50cnktPm9yZGVyRG93bmxpbmt9PC90ZD4NCiAgICAgPHRkPnskZW50cnktPmVkaXRsaW5rfTwvdGQ+DQogICA8L3RyPg0Key9mb3JlYWNofQ0KPC90YWJsZT57L2lmfQ0KPC9kaXY+DQoNCg0KDQo=]]></data>
	</file>
	<file>
	  <filename>/templates/editAssignments.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCjx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2xhc3M9InBhZ2V0YWJsZSI+DQogIDx0aGVhZD4NCiAgICA8dHI+DQogICAgPHRoID57JHR5cGVfbGFiZWx9PC90aD4NCiAgICAgIDx0aCA+eyRBc3NfaGVhZGVyfTwvdGg+DQogICAgICA8dGg+eyRTYW1wbGVDb2RlfTwvdGg+DQoNCiAgICAgIDx0aCBjbGFzcz0icGFnZWljb24iPiZuYnNwOzwvdGg+DQogICAgICA8dGggY2xhc3M9InBhZ2VpY29uIj4mbmJzcDs8L3RoPg0KICAgIDwvdHI+DQogIDwvdGhlYWQ+DQp7Zm9yZWFjaCBmcm9tPSRBc3NfaXRlbXMgaXRlbT1lbnRyeX0NCiAgIDx0ciBjbGFzcz0ieyRlbnRyeS0+cm93Y2xhc3N9Ij4NCiAgDQogICAgPHRkPnskZW50cnktPnR5cGVJY29ufTwvdGQ+DQoNCiAgICAgPHRkPjxoMiBzdHlsZT0iZGlzcGxheTppbmxpbmU7Ij57JGVudHJ5LT5OdW1iZXJPZn0gaW4gIDwvaDI+PGgxIHN0eWxlPSJkaXNwbGF5OmlubGluZTsiPnskZW50cnktPmRlZmF1bHR9PC9oMT48aDQgc3R5bGU9ImRpc3BsYXk6aW5saW5lOyI+QHtjbXNfbW9kdWxlIG1vZHVsZT1TY3JpcHREZXBsb3kgZ3JvdXBJRD0iMSIgVVJMPXRydWUgZnNpemU9dHJ1ZSB9PC9oND48aDYgc3R5bGU9ImRpc3BsYXk6aW5saW5lOyI+KG1pbmlmaWVkKTwvaDY+PC90ZD4NCiAgICAgPHRkPnskZW50cnktPlNhbXBsZX08L3RkPg0KICAgICA8dGQ+eyRlbnRyeS0+ZWRpdGxpbmt9PC90ZD4NCiAgICAgPHRkPnskZW50cnktPmRlbGV0ZWxpbmt9PC90ZD4NCiAgIDwvdHI+DQp7L2ZvcmVhY2h9DQo8L3RhYmxlPg0KPC9kaXY+DQo8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPg0KICA8cCBjbGFzcz0icGFnZW9wdGlvbnMiPnskbmV3U2NyaXB0QXNzbGlua308L3A+DQo8L2Rpdj4NCg==]]></data>
	</file>
	<file>
	  <filename>/templates/edittemplate.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCjxoMz57JHRpdGxlfTwvaDM+DQo8L2Rpdj4NCnskZm9ybXN0YXJ0fXskaGlkZGVufQ0KPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCiAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij4mbmJzcDs8L3A+DQogIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskc3VibWl0fXskY2FuY2VsfTwvcD4NCjwvZGl2Pg0KDQoNCjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQogIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRTY3JpcHRTZXRfbGFiZWx9OjwvcD4NCiAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRTY3JpcHRTZXRfaW5wdXR9PC9wPg0KPC9kaXY+DQoNCg0KPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCiAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHNjcmlwdFR5cGVfbGFiZWx9OjwvcD4NCiAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRzY3JpcHRUeXBlX2lucHV0fTwvcD4NCjwvZGl2Pg0KDQo8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPg0KICA8cCBjbGFzcz0icGFnZXRleHQiPnskTWluaWZ5X2xhYmVsfTo8L3A+DQogIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskTWluaWZ5X2lucHV0fTwvcD4NCjwvZGl2Pg0KDQoNCjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQogIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRtYXhBZ2VfbGFiZWx9OjwvcD4NCiAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRtYXhBZ2VfaW5wdXR9PC9wPg0KPC9kaXY+DQoNCjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQogIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwYXRoT3B0aW9uX2xhYmVsfTo8L3A+DQogIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskcGF0aE9wdGlvbl9pbnB1dH08L3A+DQo8L2Rpdj4NCjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQogIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRTY3JpcHRJc19sYWJlbH08YnIvPjxlbT57JHNtYXJ0eUhvd19sYWJlbH08L2VtPjo8L3A+DQogIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskU2NyaXB0SXNfaW5wdXR9PC9wPg0KPC9kaXY+DQoNCg0KDQoNCjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQogIDxwIGNsYXNzPSJwYWdldGV4dCI+Jm5ic3A7PC9wPg0KICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JHN1Ym1pdH17JGNhbmNlbH08L3A+DQo8L2Rpdj4NCnskZm9ybWVuZH0NCg0K]]></data>
	</file>
	<file>
	  <filename>/templates/edittemplates.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCjx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2xhc3M9InBhZ2V0YWJsZSI+DQogIDx0aGVhZD4NCiAgICA8dHI+DQogICAgDQogICAgIDx0aCA+eyR0eXBlX2xhYmVsfTwvdGg+DQogICAgICA8dGggPnskTmFtZV9sYWJlbH08L3RoPg0KICAgICAgPHRoPnskU2NyaXB0TmFtZV9sYWJlbH08L3RoPg0KICAgICAgPHRoPnskU2luZ2xlQ29kZV9sYWJlbH08L3RoPg0KICAgICAgPHRoIGNsYXNzPSJwYWdlaWNvbiI+Jm5ic3A7PC90aD4NCiAgICAgIDx0aCBjbGFzcz0icGFnZWljb24iPiZuYnNwOzwvdGg+DQogICAgPC90cj4NCiAgPC90aGVhZD4NCntmb3JlYWNoIGZyb209JGl0ZW1zIGl0ZW09ZW50cnl9DQogICA8dHIgY2xhc3M9InskZW50cnktPnJvd2NsYXNzfSI+DQogICAgIDx0ZD57JGVudHJ5LT50eXBlSWNvbn08L3RkPg0KICAgICA8dGQ+PGgyPnskZW50cnktPm5hbWV9PC9oMj48L3RkPg0KICAgICA8dGQ+PGgxIHN0eWxlPSJkaXNwbGF5OmlubGluZTsiPnskZW50cnktPmRlZmF1bHR9PC9oMT4gPGgyIHN0eWxlPSJkaXNwbGF5OmlubGluZTsiPkAgeyRlbnRyeS0+c2NyaXB0U2l6ZX08L2gyPjwvdGQ+DQogICAgIDx0ZD48aDM+e2xkZWxpbX1jbXNfbW9kdWxlIG1vZHVsZT1TY3JpcHREZXBsb3kgc2NyaXB0SUQ9InskZW50cnktPkJ0bn0iIFN0eXBlPSJ7JGVudHJ5LT50eXBlfSJ7cmRlbGltfTwvaDM+PC90ZD4NCiAgICAgPHRkPnskZW50cnktPmVkaXRsaW5rfTwvdGQ+DQogICAgIDx0ZD57JGVudHJ5LT5kZWxldGVsaW5rfTwvdGQ+DQogICA8L3RyPg0Key9mb3JlYWNofQ0KPC90YWJsZT4NCjwvZGl2Pg0KPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCiAgPHAgY2xhc3M9InBhZ2VvcHRpb25zIj57JG5ld3RlbXBsYXRlbGlua308L3A+DQo8L2Rpdj4NCg==]]></data>
	</file>
	<file>
	  <filename>/templates/Email_Userform_form.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyRmb3JtX3N0YXJ0T0ZGfQ0KeyRmb3JtX2hpZGRlbk9GRn0NCnskZm9ybV9zdWJtaXRPRkZ9DQp7JGZvcm1fZW5kT0ZGfQ0KDQo=]]></data>
	</file>
	<file>
	  <filename>/templates/message.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGgzPnskdGl0bGV9PC9oMz4KPHA+eyRtZXNzYWdlfTwvcD4=]]></data>
	</file>
	<file>
	  <filename>/templates/orig_email_template.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBFTUFJTC0tPg==]]></data>
	</file>
	<file>
	  <filename>/templates/sample.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[e2Ntc19tb2R1bGUgbW9kdWxlPVNjcmlwdERlcGxveSBNb2RlPSJkZWZhdWx0IiBCdG49Ik1vZHVsZURvbmF0ZSJ9]]></data>
	</file>
	<file>
	  <filename>/test/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/test/ext-all-debug.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoNCiAqIEV4dCBKUyBMaWJyYXJ5IDEuMS4xDQogKiBDb3B5cmlnaHQoYykgMjAwNi0yMDA3LCBFeHQgSlMsIExMQy4NCiAqIGxpY2Vuc2luZ0BleHRqcy5jb20NCiAqIA0KICogaHR0cDovL3d3dy5leHRqcy5jb20vbGljZW5zZQ0KICovDQoNCg0KRXh0LkRvbUhlbHBlciA9IGZ1bmN0aW9uKCl7DQogICAgdmFyIHRlbXBUYWJsZUVsID0gbnVsbDsNCiAgICB2YXIgZW1wdHlUYWdzID0gL14oPzpicnxmcmFtZXxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHJhbmdlfHNwYWNlcnx3YnJ8YXJlYXxwYXJhbXxjb2wpJC9pOw0KICAgIHZhciB0YWJsZVJlID0gL150YWJsZXx0Ym9keXx0cnx0ZCQvaTsNCiAgICANCiAgICAKICAgIA0KICAgIHZhciBjcmVhdGVIdG1sID0gZnVuY3Rpb24obyl7DQogICAgICAgIGlmKHR5cGVvZiBvID09ICdzdHJpbmcnKXsNCiAgICAgICAgICAgIHJldHVybiBvOw0KICAgICAgICB9DQogICAgICAgIHZhciBiID0gIiI7DQogICAgICAgIGlmKCFvLnRhZyl7DQogICAgICAgICAgICBvLnRhZyA9ICJkaXYiOw0KICAgICAgICB9DQogICAgICAgIGIgKz0gIjwiICsgby50YWc7DQogICAgICAgIGZvcih2YXIgYXR0ciBpbiBvKXsNCiAgICAgICAgICAgIGlmKGF0dHIgPT0gInRhZyIgfHwgYXR0ciA9PSAiY2hpbGRyZW4iIHx8IGF0dHIgPT0gImNuIiB8fCBhdHRyID09ICJodG1sIiB8fCB0eXBlb2Ygb1thdHRyXSA9PSAiZnVuY3Rpb24iKSBjb250aW51ZTsNCiAgICAgICAgICAgIGlmKGF0dHIgPT0gInN0eWxlIil7DQogICAgICAgICAgICAgICAgdmFyIHMgPSBvWyJzdHlsZSJdOw0KICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBzID09ICJmdW5jdGlvbiIpew0KICAgICAgICAgICAgICAgICAgICBzID0gcy5jYWxsKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBzID09ICJzdHJpbmciKXsNCiAgICAgICAgICAgICAgICAgICAgYiArPSAnIHN0eWxlPSInICsgcyArICciJzsNCiAgICAgICAgICAgICAgICB9ZWxzZSBpZih0eXBlb2YgcyA9PSAib2JqZWN0Iil7DQogICAgICAgICAgICAgICAgICAgIGIgKz0gJyBzdHlsZT0iJzsNCiAgICAgICAgICAgICAgICAgICAgZm9yKHZhciBrZXkgaW4gcyl7DQogICAgICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2Ygc1trZXldICE9ICJmdW5jdGlvbiIpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgKz0ga2V5ICsgIjoiICsgc1trZXldICsgIjsiOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGIgKz0gJyInOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgIGlmKGF0dHIgPT0gImNscyIpew0KICAgICAgICAgICAgICAgICAgICBiICs9ICcgY2xhc3M9IicgKyBvWyJjbHMiXSArICciJzsNCiAgICAgICAgICAgICAgICB9ZWxzZSBpZihhdHRyID09ICJodG1sRm9yIil7DQogICAgICAgICAgICAgICAgICAgIGIgKz0gJyBmb3I9IicgKyBvWyJodG1sRm9yIl0gKyAnIic7DQogICAgICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgICAgIGIgKz0gIiAiICsgYXR0ciArICc9IicgKyBvW2F0dHJdICsgJyInOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZihlbXB0eVRhZ3MudGVzdChvLnRhZykpew0KICAgICAgICAgICAgYiArPSAiLz4iOw0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIGIgKz0gIj4iOw0KICAgICAgICAgICAgdmFyIGNuID0gby5jaGlsZHJlbiB8fCBvLmNuOw0KICAgICAgICAgICAgaWYoY24pew0KICAgICAgICAgICAgICAgIGlmKGNuIGluc3RhbmNlb2YgQXJyYXkpew0KICAgICAgICAgICAgICAgICAgICBmb3IodmFyIGkgPSAwLCBsZW4gPSBjbi5sZW5ndGg7IGkgPCBsZW47IGkrKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgYiArPSBjcmVhdGVIdG1sKGNuW2ldLCBiKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgICAgICBiICs9IGNyZWF0ZUh0bWwoY24sIGIpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKG8uaHRtbCl7DQogICAgICAgICAgICAgICAgYiArPSBvLmh0bWw7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBiICs9ICI8LyIgKyBvLnRhZyArICI+IjsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gYjsNCiAgICB9Ow0KDQogICAgCiAgICANCiAgICB2YXIgY3JlYXRlRG9tID0gZnVuY3Rpb24obywgcGFyZW50Tm9kZSl7DQogICAgICAgIHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoby50YWd8fCdkaXYnKTsNCiAgICAgICAgdmFyIHVzZVNldCA9IGVsLnNldEF0dHJpYnV0ZSA/IHRydWUgOiBmYWxzZTsgCiAgICAgICAgZm9yKHZhciBhdHRyIGluIG8pew0KICAgICAgICAgICAgaWYoYXR0ciA9PSAidGFnIiB8fCBhdHRyID09ICJjaGlsZHJlbiIgfHwgYXR0ciA9PSAiY24iIHx8IGF0dHIgPT0gImh0bWwiIHx8IGF0dHIgPT0gInN0eWxlIiB8fCB0eXBlb2Ygb1thdHRyXSA9PSAiZnVuY3Rpb24iKSBjb250aW51ZTsNCiAgICAgICAgICAgIGlmKGF0dHI9PSJjbHMiKXsNCiAgICAgICAgICAgICAgICBlbC5jbGFzc05hbWUgPSBvWyJjbHMiXTsNCiAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgIGlmKHVzZVNldCkgZWwuc2V0QXR0cmlidXRlKGF0dHIsIG9bYXR0cl0pOw0KICAgICAgICAgICAgICAgIGVsc2UgZWxbYXR0cl0gPSBvW2F0dHJdOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIEV4dC5Eb21IZWxwZXIuYXBwbHlTdHlsZXMoZWwsIG8uc3R5bGUpOw0KICAgICAgICB2YXIgY24gPSBvLmNoaWxkcmVuIHx8IG8uY247DQogICAgICAgIGlmKGNuKXsNCiAgICAgICAgICAgIGlmKGNuIGluc3RhbmNlb2YgQXJyYXkpew0KICAgICAgICAgICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IGNuLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgIGNyZWF0ZURvbShjbltpXSwgZWwpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgIGNyZWF0ZURvbShjbiwgZWwpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmKG8uaHRtbCl7DQogICAgICAgICAgICBlbC5pbm5lckhUTUwgPSBvLmh0bWw7DQogICAgICAgIH0NCiAgICAgICAgaWYocGFyZW50Tm9kZSl7DQogICAgICAgICAgIHBhcmVudE5vZGUuYXBwZW5kQ2hpbGQoZWwpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBlbDsNCiAgICB9Ow0KDQogICAgdmFyIGllVGFibGUgPSBmdW5jdGlvbihkZXB0aCwgcywgaCwgZSl7DQogICAgICAgIHRlbXBUYWJsZUVsLmlubmVySFRNTCA9IFtzLCBoLCBlXS5qb2luKCcnKTsNCiAgICAgICAgdmFyIGkgPSAtMSwgZWwgPSB0ZW1wVGFibGVFbDsNCiAgICAgICAgd2hpbGUoKytpIDwgZGVwdGgpew0KICAgICAgICAgICAgZWwgPSBlbC5maXJzdENoaWxkOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBlbDsNCiAgICB9Ow0KDQogICAgCiAgICB2YXIgdHMgPSAnPHRhYmxlPicsDQogICAgICAgIHRlID0gJzwvdGFibGU+JywNCiAgICAgICAgdGJzID0gdHMrJzx0Ym9keT4nLA0KICAgICAgICB0YmUgPSAnPC90Ym9keT4nK3RlLA0KICAgICAgICB0cnMgPSB0YnMgKyAnPHRyPicsDQogICAgICAgIHRyZSA9ICc8L3RyPicrdGJlOw0KDQogICAgDQogICAgdmFyIGluc2VydEludG9UYWJsZSA9IGZ1bmN0aW9uKHRhZywgd2hlcmUsIGVsLCBodG1sKXsNCiAgICAgICAgaWYoIXRlbXBUYWJsZUVsKXsNCiAgICAgICAgICAgIHRlbXBUYWJsZUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7DQogICAgICAgIH0NCiAgICAgICAgdmFyIG5vZGU7DQogICAgICAgIHZhciBiZWZvcmUgPSBudWxsOw0KICAgICAgICBpZih0YWcgPT0gJ3RkJyl7DQogICAgICAgICAgICBpZih3aGVyZSA9PSAnYWZ0ZXJiZWdpbicgfHwgd2hlcmUgPT0gJ2JlZm9yZWVuZCcpeyAKICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKHdoZXJlID09ICdiZWZvcmViZWdpbicpew0KICAgICAgICAgICAgICAgIGJlZm9yZSA9IGVsOw0KICAgICAgICAgICAgICAgIGVsID0gZWwucGFyZW50Tm9kZTsNCiAgICAgICAgICAgIH0gZWxzZXsNCiAgICAgICAgICAgICAgICBiZWZvcmUgPSBlbC5uZXh0U2libGluZzsNCiAgICAgICAgICAgICAgICBlbCA9IGVsLnBhcmVudE5vZGU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBub2RlID0gaWVUYWJsZSg0LCB0cnMsIGh0bWwsIHRyZSk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSBpZih0YWcgPT0gJ3RyJyl7DQogICAgICAgICAgICBpZih3aGVyZSA9PSAnYmVmb3JlYmVnaW4nKXsNCiAgICAgICAgICAgICAgICBiZWZvcmUgPSBlbDsNCiAgICAgICAgICAgICAgICBlbCA9IGVsLnBhcmVudE5vZGU7DQogICAgICAgICAgICAgICAgbm9kZSA9IGllVGFibGUoMywgdGJzLCBodG1sLCB0YmUpOw0KICAgICAgICAgICAgfSBlbHNlIGlmKHdoZXJlID09ICdhZnRlcmVuZCcpew0KICAgICAgICAgICAgICAgIGJlZm9yZSA9IGVsLm5leHRTaWJsaW5nOw0KICAgICAgICAgICAgICAgIGVsID0gZWwucGFyZW50Tm9kZTsNCiAgICAgICAgICAgICAgICBub2RlID0gaWVUYWJsZSgzLCB0YnMsIGh0bWwsIHRiZSk7DQogICAgICAgICAgICB9IGVsc2V7IAogICAgICAgICAgICAgICAgaWYod2hlcmUgPT0gJ2FmdGVyYmVnaW4nKXsNCiAgICAgICAgICAgICAgICAgICAgYmVmb3JlID0gZWwuZmlyc3RDaGlsZDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgbm9kZSA9IGllVGFibGUoNCwgdHJzLCBodG1sLCB0cmUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYodGFnID09ICd0Ym9keScpew0KICAgICAgICAgICAgaWYod2hlcmUgPT0gJ2JlZm9yZWJlZ2luJyl7DQogICAgICAgICAgICAgICAgYmVmb3JlID0gZWw7DQogICAgICAgICAgICAgICAgZWwgPSBlbC5wYXJlbnROb2RlOw0KICAgICAgICAgICAgICAgIG5vZGUgPSBpZVRhYmxlKDIsIHRzLCBodG1sLCB0ZSk7DQogICAgICAgICAgICB9IGVsc2UgaWYod2hlcmUgPT0gJ2FmdGVyZW5kJyl7DQogICAgICAgICAgICAgICAgYmVmb3JlID0gZWwubmV4dFNpYmxpbmc7DQogICAgICAgICAgICAgICAgZWwgPSBlbC5wYXJlbnROb2RlOw0KICAgICAgICAgICAgICAgIG5vZGUgPSBpZVRhYmxlKDIsIHRzLCBodG1sLCB0ZSk7DQogICAgICAgICAgICB9IGVsc2V7DQogICAgICAgICAgICAgICAgaWYod2hlcmUgPT0gJ2FmdGVyYmVnaW4nKXsNCiAgICAgICAgICAgICAgICAgICAgYmVmb3JlID0gZWwuZmlyc3RDaGlsZDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgbm9kZSA9IGllVGFibGUoMywgdGJzLCBodG1sLCB0YmUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2V7IAogICAgICAgICAgICBpZih3aGVyZSA9PSAnYmVmb3JlYmVnaW4nIHx8IHdoZXJlID09ICdhZnRlcmVuZCcpeyAKICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKHdoZXJlID09ICdhZnRlcmJlZ2luJyl7DQogICAgICAgICAgICAgICAgYmVmb3JlID0gZWwuZmlyc3RDaGlsZDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIG5vZGUgPSBpZVRhYmxlKDIsIHRzLCBodG1sLCB0ZSk7DQogICAgICAgIH0NCiAgICAgICAgZWwuaW5zZXJ0QmVmb3JlKG5vZGUsIGJlZm9yZSk7DQogICAgICAgIHJldHVybiBub2RlOw0KICAgIH07DQoNCiAgICByZXR1cm4gew0KICAgIA0KICAgIHVzZURvbSA6IGZhbHNlLA0KDQogICAgDQogICAgbWFya3VwIDogZnVuY3Rpb24obyl7DQogICAgICAgIHJldHVybiBjcmVhdGVIdG1sKG8pOw0KICAgIH0sDQoNCiAgICANCiAgICBhcHBseVN0eWxlcyA6IGZ1bmN0aW9uKGVsLCBzdHlsZXMpew0KICAgICAgICBpZihzdHlsZXMpew0KICAgICAgICAgICBlbCA9IEV4dC5mbHkoZWwpOw0KICAgICAgICAgICBpZih0eXBlb2Ygc3R5bGVzID09ICJzdHJpbmciKXsNCiAgICAgICAgICAgICAgIHZhciByZSA9IC9ccz8oW2EtelwtXSopXDpccz8oW147XSopOz8vZ2k7DQogICAgICAgICAgICAgICB2YXIgbWF0Y2hlczsNCiAgICAgICAgICAgICAgIHdoaWxlICgobWF0Y2hlcyA9IHJlLmV4ZWMoc3R5bGVzKSkgIT0gbnVsbCl7DQogICAgICAgICAgICAgICAgICAgZWwuc2V0U3R5bGUobWF0Y2hlc1sxXSwgbWF0Y2hlc1syXSk7DQogICAgICAgICAgICAgICB9DQogICAgICAgICAgIH1lbHNlIGlmICh0eXBlb2Ygc3R5bGVzID09ICJvYmplY3QiKXsNCiAgICAgICAgICAgICAgIGZvciAodmFyIHN0eWxlIGluIHN0eWxlcyl7DQogICAgICAgICAgICAgICAgICBlbC5zZXRTdHlsZShzdHlsZSwgc3R5bGVzW3N0eWxlXSk7DQogICAgICAgICAgICAgICB9DQogICAgICAgICAgIH1lbHNlIGlmICh0eXBlb2Ygc3R5bGVzID09ICJmdW5jdGlvbiIpew0KICAgICAgICAgICAgICAgIEV4dC5Eb21IZWxwZXIuYXBwbHlTdHlsZXMoZWwsIHN0eWxlcy5jYWxsKCkpOw0KICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgDQogICAgaW5zZXJ0SHRtbCA6IGZ1bmN0aW9uKHdoZXJlLCBlbCwgaHRtbCl7DQogICAgICAgIHdoZXJlID0gd2hlcmUudG9Mb3dlckNhc2UoKTsNCiAgICAgICAgaWYoZWwuaW5zZXJ0QWRqYWNlbnRIVE1MKXsNCiAgICAgICAgICAgIGlmKHRhYmxlUmUudGVzdChlbC50YWdOYW1lKSl7DQogICAgICAgICAgICAgICAgdmFyIHJzOw0KICAgICAgICAgICAgICAgIGlmKHJzID0gaW5zZXJ0SW50b1RhYmxlKGVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKSwgd2hlcmUsIGVsLCBodG1sKSl7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiByczsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBzd2l0Y2god2hlcmUpew0KICAgICAgICAgICAgICAgIGNhc2UgImJlZm9yZWJlZ2luIjoNCiAgICAgICAgICAgICAgICAgICAgZWwuaW5zZXJ0QWRqYWNlbnRIVE1MKCdCZWZvcmVCZWdpbicsIGh0bWwpOw0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWwucHJldmlvdXNTaWJsaW5nOw0KICAgICAgICAgICAgICAgIGNhc2UgImFmdGVyYmVnaW4iOg0KICAgICAgICAgICAgICAgICAgICBlbC5pbnNlcnRBZGphY2VudEhUTUwoJ0FmdGVyQmVnaW4nLCBodG1sKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsLmZpcnN0Q2hpbGQ7DQogICAgICAgICAgICAgICAgY2FzZSAiYmVmb3JlZW5kIjoNCiAgICAgICAgICAgICAgICAgICAgZWwuaW5zZXJ0QWRqYWNlbnRIVE1MKCdCZWZvcmVFbmQnLCBodG1sKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsLmxhc3RDaGlsZDsNCiAgICAgICAgICAgICAgICBjYXNlICJhZnRlcmVuZCI6DQogICAgICAgICAgICAgICAgICAgIGVsLmluc2VydEFkamFjZW50SFRNTCgnQWZ0ZXJFbmQnLCBodG1sKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsLm5leHRTaWJsaW5nOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhyb3cgJ0lsbGVnYWwgaW5zZXJ0aW9uIHBvaW50IC0+ICInICsgd2hlcmUgKyAnIic7DQogICAgICAgIH0NCiAgICAgICAgdmFyIHJhbmdlID0gZWwub3duZXJEb2N1bWVudC5jcmVhdGVSYW5nZSgpOw0KICAgICAgICB2YXIgZnJhZzsNCiAgICAgICAgc3dpdGNoKHdoZXJlKXsNCiAgICAgICAgICAgICBjYXNlICJiZWZvcmViZWdpbiI6DQogICAgICAgICAgICAgICAgcmFuZ2Uuc2V0U3RhcnRCZWZvcmUoZWwpOw0KICAgICAgICAgICAgICAgIGZyYWcgPSByYW5nZS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoaHRtbCk7DQogICAgICAgICAgICAgICAgZWwucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZnJhZywgZWwpOw0KICAgICAgICAgICAgICAgIHJldHVybiBlbC5wcmV2aW91c1NpYmxpbmc7DQogICAgICAgICAgICAgY2FzZSAiYWZ0ZXJiZWdpbiI6DQogICAgICAgICAgICAgICAgaWYoZWwuZmlyc3RDaGlsZCl7DQogICAgICAgICAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0QmVmb3JlKGVsLmZpcnN0Q2hpbGQpOw0KICAgICAgICAgICAgICAgICAgICBmcmFnID0gcmFuZ2UuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KGh0bWwpOw0KICAgICAgICAgICAgICAgICAgICBlbC5pbnNlcnRCZWZvcmUoZnJhZywgZWwuZmlyc3RDaGlsZCk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlbC5maXJzdENoaWxkOw0KICAgICAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgICAgICBlbC5pbm5lckhUTUwgPSBodG1sOw0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWwuZmlyc3RDaGlsZDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICBjYXNlICJiZWZvcmVlbmQiOg0KICAgICAgICAgICAgICAgIGlmKGVsLmxhc3RDaGlsZCl7DQogICAgICAgICAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0QWZ0ZXIoZWwubGFzdENoaWxkKTsNCiAgICAgICAgICAgICAgICAgICAgZnJhZyA9IHJhbmdlLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChodG1sKTsNCiAgICAgICAgICAgICAgICAgICAgZWwuYXBwZW5kQ2hpbGQoZnJhZyk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlbC5sYXN0Q2hpbGQ7DQogICAgICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgICAgIGVsLmlubmVySFRNTCA9IGh0bWw7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlbC5sYXN0Q2hpbGQ7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2FzZSAiYWZ0ZXJlbmQiOg0KICAgICAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0QWZ0ZXIoZWwpOw0KICAgICAgICAgICAgICAgIGZyYWcgPSByYW5nZS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoaHRtbCk7DQogICAgICAgICAgICAgICAgZWwucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZnJhZywgZWwubmV4dFNpYmxpbmcpOw0KICAgICAgICAgICAgICAgIHJldHVybiBlbC5uZXh0U2libGluZzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRocm93ICdJbGxlZ2FsIGluc2VydGlvbiBwb2ludCAtPiAiJyArIHdoZXJlICsgJyInOw0KICAgIH0sDQoNCiAgICANCiAgICBpbnNlcnRCZWZvcmUgOiBmdW5jdGlvbihlbCwgbywgcmV0dXJuRWxlbWVudCl7DQogICAgICAgIHJldHVybiB0aGlzLmRvSW5zZXJ0KGVsLCBvLCByZXR1cm5FbGVtZW50LCAiYmVmb3JlQmVnaW4iKTsNCiAgICB9LA0KDQogICAgDQogICAgaW5zZXJ0QWZ0ZXIgOiBmdW5jdGlvbihlbCwgbywgcmV0dXJuRWxlbWVudCl7DQogICAgICAgIHJldHVybiB0aGlzLmRvSW5zZXJ0KGVsLCBvLCByZXR1cm5FbGVtZW50LCAiYWZ0ZXJFbmQiLCAibmV4dFNpYmxpbmciKTsNCiAgICB9LA0KDQogICAgDQogICAgaW5zZXJ0Rmlyc3QgOiBmdW5jdGlvbihlbCwgbywgcmV0dXJuRWxlbWVudCl7DQogICAgICAgIHJldHVybiB0aGlzLmRvSW5zZXJ0KGVsLCBvLCByZXR1cm5FbGVtZW50LCAiYWZ0ZXJCZWdpbiIpOw0KICAgIH0sDQoNCiAgICAKICAgIGRvSW5zZXJ0IDogZnVuY3Rpb24oZWwsIG8sIHJldHVybkVsZW1lbnQsIHBvcywgc2libGluZyl7DQogICAgICAgIGVsID0gRXh0LmdldERvbShlbCk7DQogICAgICAgIHZhciBuZXdOb2RlOw0KICAgICAgICBpZih0aGlzLnVzZURvbSl7DQogICAgICAgICAgICBuZXdOb2RlID0gY3JlYXRlRG9tKG8sIG51bGwpOw0KICAgICAgICAgICAgZWwucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobmV3Tm9kZSwgc2libGluZyA/IGVsW3NpYmxpbmddIDogZWwpOw0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIHZhciBodG1sID0gY3JlYXRlSHRtbChvKTsNCiAgICAgICAgICAgIG5ld05vZGUgPSB0aGlzLmluc2VydEh0bWwocG9zLCBlbCwgaHRtbCk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHJldHVybkVsZW1lbnQgPyBFeHQuZ2V0KG5ld05vZGUsIHRydWUpIDogbmV3Tm9kZTsNCiAgICB9LA0KDQogICAgDQogICAgYXBwZW5kIDogZnVuY3Rpb24oZWwsIG8sIHJldHVybkVsZW1lbnQpew0KICAgICAgICBlbCA9IEV4dC5nZXREb20oZWwpOw0KICAgICAgICB2YXIgbmV3Tm9kZTsNCiAgICAgICAgaWYodGhpcy51c2VEb20pew0KICAgICAgICAgICAgbmV3Tm9kZSA9IGNyZWF0ZURvbShvLCBudWxsKTsNCiAgICAgICAgICAgIGVsLmFwcGVuZENoaWxkKG5ld05vZGUpOw0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIHZhciBodG1sID0gY3JlYXRlSHRtbChvKTsNCiAgICAgICAgICAgIG5ld05vZGUgPSB0aGlzLmluc2VydEh0bWwoImJlZm9yZUVuZCIsIGVsLCBodG1sKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gcmV0dXJuRWxlbWVudCA/IEV4dC5nZXQobmV3Tm9kZSwgdHJ1ZSkgOiBuZXdOb2RlOw0KICAgIH0sDQoNCiAgICANCiAgICBvdmVyd3JpdGUgOiBmdW5jdGlvbihlbCwgbywgcmV0dXJuRWxlbWVudCl7DQogICAgICAgIGVsID0gRXh0LmdldERvbShlbCk7DQogICAgICAgIGVsLmlubmVySFRNTCA9IGNyZWF0ZUh0bWwobyk7DQogICAgICAgIHJldHVybiByZXR1cm5FbGVtZW50ID8gRXh0LmdldChlbC5maXJzdENoaWxkLCB0cnVlKSA6IGVsLmZpcnN0Q2hpbGQ7DQogICAgfSwNCg0KICAgIA0KICAgIGNyZWF0ZVRlbXBsYXRlIDogZnVuY3Rpb24obyl7DQogICAgICAgIHZhciBodG1sID0gY3JlYXRlSHRtbChvKTsNCiAgICAgICAgcmV0dXJuIG5ldyBFeHQuVGVtcGxhdGUoaHRtbCk7DQogICAgfQ0KICAgIH07DQp9KCk7DQoKDQpFeHQuVGVtcGxhdGUgPSBmdW5jdGlvbihodG1sKXsNCiAgICBpZihodG1sIGluc3RhbmNlb2YgQXJyYXkpew0KICAgICAgICBodG1sID0gaHRtbC5qb2luKCIiKTsNCiAgICB9ZWxzZSBpZihhcmd1bWVudHMubGVuZ3RoID4gMSl7DQogICAgICAgIGh0bWwgPSBBcnJheS5wcm90b3R5cGUuam9pbi5jYWxsKGFyZ3VtZW50cywgIiIpOw0KICAgIH0NCiAgICANCiAgICB0aGlzLmh0bWwgPSBodG1sOw0KICAgIA0KfTsNCkV4dC5UZW1wbGF0ZS5wcm90b3R5cGUgPSB7DQogICAgDQogICAgYXBwbHlUZW1wbGF0ZSA6IGZ1bmN0aW9uKHZhbHVlcyl7DQogICAgICAgIGlmKHRoaXMuY29tcGlsZWQpew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGlsZWQodmFsdWVzKTsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgdXNlRiA9IHRoaXMuZGlzYWJsZUZvcm1hdHMgIT09IHRydWU7DQogICAgICAgIHZhciBmbSA9IEV4dC51dGlsLkZvcm1hdCwgdHBsID0gdGhpczsNCiAgICAgICAgdmFyIGZuID0gZnVuY3Rpb24obSwgbmFtZSwgZm9ybWF0LCBhcmdzKXsNCiAgICAgICAgICAgIGlmKGZvcm1hdCAmJiB1c2VGKXsNCiAgICAgICAgICAgICAgICBpZihmb3JtYXQuc3Vic3RyKDAsIDUpID09ICJ0aGlzLiIpew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHBsLmNhbGwoZm9ybWF0LnN1YnN0cig1KSwgdmFsdWVzW25hbWVdLCB2YWx1ZXMpOw0KICAgICAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgICAgICBpZihhcmdzKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZSA9IC9eXHMqWyciXSguKilbIiddXHMqJC87DQogICAgICAgICAgICAgICAgICAgICAgICBhcmdzID0gYXJncy5zcGxpdCgnLCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gYXJncy5sZW5ndGg7IGkgPCBsZW47IGkrKyl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1tpXSA9IGFyZ3NbaV0ucmVwbGFjZShyZSwgIiQxIik7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBhcmdzID0gW3ZhbHVlc1tuYW1lXV0uY29uY2F0KGFyZ3MpOw0KICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBbdmFsdWVzW25hbWVdXTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm1bZm9ybWF0XS5hcHBseShmbSwgYXJncyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlc1tuYW1lXSAhPT0gdW5kZWZpbmVkID8gdmFsdWVzW25hbWVdIDogIiI7DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgICAgIHJldHVybiB0aGlzLmh0bWwucmVwbGFjZSh0aGlzLnJlLCBmbik7DQogICAgfSwNCiAgICANCiAgICANCiAgICBzZXQgOiBmdW5jdGlvbihodG1sLCBjb21waWxlKXsNCiAgICAgICAgdGhpcy5odG1sID0gaHRtbDsNCiAgICAgICAgdGhpcy5jb21waWxlZCA9IG51bGw7DQogICAgICAgIGlmKGNvbXBpbGUpew0KICAgICAgICAgICAgdGhpcy5jb21waWxlKCk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSwNCiAgICANCiAgICANCiAgICBkaXNhYmxlRm9ybWF0cyA6IGZhbHNlLA0KICAgIA0KICAgIA0KICAgIHJlIDogL1x7KFtcdy1dKykoPzpcOihbXHdcLl0qKSg/OlwoKC4qPyk/XCkpPyk/XH0vZywNCiAgICANCiAgICANCiAgICBjb21waWxlIDogZnVuY3Rpb24oKXsNCiAgICAgICAgdmFyIGZtID0gRXh0LnV0aWwuRm9ybWF0Ow0KICAgICAgICB2YXIgdXNlRiA9IHRoaXMuZGlzYWJsZUZvcm1hdHMgIT09IHRydWU7DQogICAgICAgIHZhciBzZXAgPSBFeHQuaXNHZWNrbyA/ICIrIiA6ICIsIjsNCiAgICAgICAgdmFyIGZuID0gZnVuY3Rpb24obSwgbmFtZSwgZm9ybWF0LCBhcmdzKXsNCiAgICAgICAgICAgIGlmKGZvcm1hdCAmJiB1c2VGKXsNCiAgICAgICAgICAgICAgICBhcmdzID0gYXJncyA/ICcsJyArIGFyZ3MgOiAiIjsNCiAgICAgICAgICAgICAgICBpZihmb3JtYXQuc3Vic3RyKDAsIDUpICE9ICJ0aGlzLiIpew0KICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAiZm0uIiArIGZvcm1hdCArICcoJzsNCiAgICAgICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gJ3RoaXMuY2FsbCgiJysgZm9ybWF0LnN1YnN0cig1KSArICciLCAnOw0KICAgICAgICAgICAgICAgICAgICBhcmdzID0gIiwgdmFsdWVzIjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICBhcmdzPSAnJzsgZm9ybWF0ID0gIih2YWx1ZXNbJyIgKyBuYW1lICsgIiddID09IHVuZGVmaW5lZCA/ICcnIDogIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiAiJyIrIHNlcCArIGZvcm1hdCArICJ2YWx1ZXNbJyIgKyBuYW1lICsgIiddIiArIGFyZ3MgKyAiKSIrc2VwKyInIjsNCiAgICAgICAgfTsNCiAgICAgICAgdmFyIGJvZHk7DQogICAgICAgIAogICAgICAgIGlmKEV4dC5pc0dlY2tvKXsNCiAgICAgICAgICAgIGJvZHkgPSAidGhpcy5jb21waWxlZCA9IGZ1bmN0aW9uKHZhbHVlcyl7IHJldHVybiAnIiArDQogICAgICAgICAgICAgICAgICAgdGhpcy5odG1sLnJlcGxhY2UoL1xcL2csICdcXFxcJykucmVwbGFjZSgvKFxyXG58XG4pL2csICdcXG4nKS5yZXBsYWNlKC8nL2csICJcXCciKS5yZXBsYWNlKHRoaXMucmUsIGZuKSArDQogICAgICAgICAgICAgICAgICAgICInO307IjsNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICBib2R5ID0gWyJ0aGlzLmNvbXBpbGVkID0gZnVuY3Rpb24odmFsdWVzKXsgcmV0dXJuIFsnIl07DQogICAgICAgICAgICBib2R5LnB1c2godGhpcy5odG1sLnJlcGxhY2UoL1xcL2csICdcXFxcJykucmVwbGFjZSgvKFxyXG58XG4pL2csICdcXG4nKS5yZXBsYWNlKC8nL2csICJcXCciKS5yZXBsYWNlKHRoaXMucmUsIGZuKSk7DQogICAgICAgICAgICBib2R5LnB1c2goIiddLmpvaW4oJycpO307Iik7DQogICAgICAgICAgICBib2R5ID0gYm9keS5qb2luKCcnKTsNCiAgICAgICAgfQ0KICAgICAgICBldmFsKGJvZHkpOw0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9LA0KICAgIA0KICAgIAogICAgY2FsbCA6IGZ1bmN0aW9uKGZuTmFtZSwgdmFsdWUsIGFsbFZhbHVlcyl7DQogICAgICAgIHJldHVybiB0aGlzW2ZuTmFtZV0odmFsdWUsIGFsbFZhbHVlcyk7DQogICAgfSwNCiAgICANCiAgICANCiAgICBpbnNlcnRGaXJzdDogZnVuY3Rpb24oZWwsIHZhbHVlcywgcmV0dXJuRWxlbWVudCl7DQogICAgICAgIHJldHVybiB0aGlzLmRvSW5zZXJ0KCdhZnRlckJlZ2luJywgZWwsIHZhbHVlcywgcmV0dXJuRWxlbWVudCk7DQogICAgfSwNCg0KICAgIA0KICAgIGluc2VydEJlZm9yZTogZnVuY3Rpb24oZWwsIHZhbHVlcywgcmV0dXJuRWxlbWVudCl7DQogICAgICAgIHJldHVybiB0aGlzLmRvSW5zZXJ0KCdiZWZvcmVCZWdpbicsIGVsLCB2YWx1ZXMsIHJldHVybkVsZW1lbnQpOw0KICAgIH0sDQoNCiAgICANCiAgICBpbnNlcnRBZnRlciA6IGZ1bmN0aW9uKGVsLCB2YWx1ZXMsIHJldHVybkVsZW1lbnQpew0KICAgICAgICByZXR1cm4gdGhpcy5kb0luc2VydCgnYWZ0ZXJFbmQnLCBlbCwgdmFsdWVzLCByZXR1cm5FbGVtZW50KTsNCiAgICB9LA0KICAgIA0KICAgIA0KICAgIGFwcGVuZCA6IGZ1bmN0aW9uKGVsLCB2YWx1ZXMsIHJldHVybkVsZW1lbnQpew0KICAgICAgICByZXR1cm4gdGhpcy5kb0luc2VydCgnYmVmb3JlRW5kJywgZWwsIHZhbHVlcywgcmV0dXJuRWxlbWVudCk7DQogICAgfSwNCg0KICAgIGRvSW5zZXJ0IDogZnVuY3Rpb24od2hlcmUsIGVsLCB2YWx1ZXMsIHJldHVybkVsKXsNCiAgICAgICAgZWwgPSBFeHQuZ2V0RG9tKGVsKTsNCiAgICAgICAgdmFyIG5ld05vZGUgPSBFeHQuRG9tSGVscGVyLmluc2VydEh0bWwod2hlcmUsIGVsLCB0aGlzLmFwcGx5VGVtcGxhdGUodmFsdWVzKSk7DQogICAgICAgIHJldHVybiByZXR1cm5FbCA/IEV4dC5nZXQobmV3Tm9kZSwgdHJ1ZSkgOiBuZXdOb2RlOw0KICAgIH0sDQoNCiAgICANCiAgICBvdmVyd3JpdGUgOiBmdW5jdGlvbihlbCwgdmFsdWVzLCByZXR1cm5FbGVtZW50KXsNCiAgICAgICAgZWwgPSBFeHQuZ2V0RG9tKGVsKTsNCiAgICAgICAgZWwuaW5uZXJIVE1MID0gdGhpcy5hcHBseVRlbXBsYXRlKHZhbHVlcyk7DQogICAgICAgIHJldHVybiByZXR1cm5FbGVtZW50ID8gRXh0LmdldChlbC5maXJzdENoaWxkLCB0cnVlKSA6IGVsLmZpcnN0Q2hpbGQ7DQogICAgfQ0KfTsNCg0KRXh0LlRlbXBsYXRlLnByb3RvdHlwZS5hcHBseSA9IEV4dC5UZW1wbGF0ZS5wcm90b3R5cGUuYXBwbHlUZW1wbGF0ZTsNCg0KCkV4dC5Eb21IZWxwZXIuVGVtcGxhdGUgPSBFeHQuVGVtcGxhdGU7DQoNCg0KRXh0LlRlbXBsYXRlLmZyb20gPSBmdW5jdGlvbihlbCl7DQogICAgZWwgPSBFeHQuZ2V0RG9tKGVsKTsNCiAgICByZXR1cm4gbmV3IEV4dC5UZW1wbGF0ZShlbC52YWx1ZSB8fCBlbC5pbm5lckhUTUwpOw0KfTsKDQoNCkV4dC5Eb21RdWVyeSA9IGZ1bmN0aW9uKCl7DQogICAgdmFyIGNhY2hlID0ge30sIHNpbXBsZUNhY2hlID0ge30sIHZhbHVlQ2FjaGUgPSB7fTsNCiAgICB2YXIgbm9uU3BhY2UgPSAvXFMvOw0KICAgIHZhciB0cmltUmUgPSAvXlxzK3xccyskL2c7DQogICAgdmFyIHRwbFJlID0gL1x7KFxkKylcfS9nOw0KICAgIHZhciBtb2RlUmUgPSAvXihccz9bXC8+K35dXHM/fFxzfCQpLzsNCiAgICB2YXIgdGFnVG9rZW5SZSA9IC9eKCMpPyhbXHctXCpdKykvOw0KICAgIHZhciBudGhSZSA9IC8oXGQqKW5cKz8oXGQqKS8sIG50aFJlMiA9IC9cRC87DQoNCiAgICBmdW5jdGlvbiBjaGlsZChwLCBpbmRleCl7DQogICAgICAgIHZhciBpID0gMDsNCiAgICAgICAgdmFyIG4gPSBwLmZpcnN0Q2hpbGQ7DQogICAgICAgIHdoaWxlKG4pew0KICAgICAgICAgICAgaWYobi5ub2RlVHlwZSA9PSAxKXsNCiAgICAgICAgICAgICAgIGlmKCsraSA9PSBpbmRleCl7DQogICAgICAgICAgICAgICAgICAgcmV0dXJuIG47DQogICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBuID0gbi5uZXh0U2libGluZzsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICB9Ow0KDQogICAgZnVuY3Rpb24gbmV4dChuKXsNCiAgICAgICAgd2hpbGUoKG4gPSBuLm5leHRTaWJsaW5nKSAmJiBuLm5vZGVUeXBlICE9IDEpOw0KICAgICAgICByZXR1cm4gbjsNCiAgICB9Ow0KDQogICAgZnVuY3Rpb24gcHJldihuKXsNCiAgICAgICAgd2hpbGUoKG4gPSBuLnByZXZpb3VzU2libGluZykgJiYgbi5ub2RlVHlwZSAhPSAxKTsNCiAgICAgICAgcmV0dXJuIG47DQogICAgfTsNCg0KICAgIGZ1bmN0aW9uIGNoaWxkcmVuKGQpew0KICAgICAgICB2YXIgbiA9IGQuZmlyc3RDaGlsZCwgbmkgPSAtMTsNCiAJICAgIHdoaWxlKG4pew0KIAkgICAgICAgIHZhciBueCA9IG4ubmV4dFNpYmxpbmc7DQogCSAgICAgICAgaWYobi5ub2RlVHlwZSA9PSAzICYmICFub25TcGFjZS50ZXN0KG4ubm9kZVZhbHVlKSl7DQogCSAgICAgICAgICAgIGQucmVtb3ZlQ2hpbGQobik7DQogCSAgICAgICAgfWVsc2V7DQogCSAgICAgICAgICAgIG4ubm9kZUluZGV4ID0gKytuaTsNCiAJICAgICAgICB9DQogCSAgICAgICAgbiA9IG54Ow0KIAkgICAgfQ0KIAkgICAgcmV0dXJuIHRoaXM7DQogCX07DQoNCiAgICBmdW5jdGlvbiBieUNsYXNzTmFtZShjLCBhLCB2KXsNCiAgICAgICAgaWYoIXYpew0KICAgICAgICAgICAgcmV0dXJuIGM7DQogICAgICAgIH0NCiAgICAgICAgdmFyIHIgPSBbXSwgcmkgPSAtMSwgY247DQogICAgICAgIGZvcih2YXIgaSA9IDAsIGNpOyBjaSA9IGNbaV07IGkrKyl7DQogICAgICAgICAgICBpZigoJyAnK2NpLmNsYXNzTmFtZSsnICcpLmluZGV4T2YodikgIT0gLTEpew0KICAgICAgICAgICAgICAgIHJbKytyaV0gPSBjaTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gcjsNCiAgICB9Ow0KDQogICAgZnVuY3Rpb24gYXR0clZhbHVlKG4sIGF0dHIpew0KICAgICAgICBpZighbi50YWdOYW1lICYmIHR5cGVvZiBuLmxlbmd0aCAhPSAidW5kZWZpbmVkIil7DQogICAgICAgICAgICBuID0gblswXTsNCiAgICAgICAgfQ0KICAgICAgICBpZighbil7DQogICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgfQ0KICAgICAgICBpZihhdHRyID09ICJmb3IiKXsNCiAgICAgICAgICAgIHJldHVybiBuLmh0bWxGb3I7DQogICAgICAgIH0NCiAgICAgICAgaWYoYXR0ciA9PSAiY2xhc3MiIHx8IGF0dHIgPT0gImNsYXNzTmFtZSIpew0KICAgICAgICAgICAgcmV0dXJuIG4uY2xhc3NOYW1lOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBuLmdldEF0dHJpYnV0ZShhdHRyKSB8fCBuW2F0dHJdOw0KDQogICAgfTsNCg0KICAgIGZ1bmN0aW9uIGdldE5vZGVzKG5zLCBtb2RlLCB0YWdOYW1lKXsNCiAgICAgICAgdmFyIHJlc3VsdCA9IFtdLCByaSA9IC0xLCBjczsNCiAgICAgICAgaWYoIW5zKXsNCiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgICAgIH0NCiAgICAgICAgdGFnTmFtZSA9IHRhZ05hbWUgfHwgIioiOw0KICAgICAgICBpZih0eXBlb2YgbnMuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT0gInVuZGVmaW5lZCIpew0KICAgICAgICAgICAgbnMgPSBbbnNdOw0KICAgICAgICB9DQogICAgICAgIGlmKCFtb2RlKXsNCiAgICAgICAgICAgIGZvcih2YXIgaSA9IDAsIG5pOyBuaSA9IG5zW2ldOyBpKyspew0KICAgICAgICAgICAgICAgIGNzID0gbmkuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSk7DQogICAgICAgICAgICAgICAgZm9yKHZhciBqID0gMCwgY2k7IGNpID0gY3Nbal07IGorKyl7DQogICAgICAgICAgICAgICAgICAgIHJlc3VsdFsrK3JpXSA9IGNpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfWVsc2UgaWYobW9kZSA9PSAiLyIgfHwgbW9kZSA9PSAiPiIpew0KICAgICAgICAgICAgdmFyIHV0YWcgPSB0YWdOYW1lLnRvVXBwZXJDYXNlKCk7DQogICAgICAgICAgICBmb3IodmFyIGkgPSAwLCBuaSwgY247IG5pID0gbnNbaV07IGkrKyl7DQogICAgICAgICAgICAgICAgY24gPSBuaS5jaGlsZHJlbiB8fCBuaS5jaGlsZE5vZGVzOw0KICAgICAgICAgICAgICAgIGZvcih2YXIgaiA9IDAsIGNqOyBjaiA9IGNuW2pdOyBqKyspew0KICAgICAgICAgICAgICAgICAgICBpZihjai5ub2RlTmFtZSA9PSB1dGFnIHx8IGNqLm5vZGVOYW1lID09IHRhZ05hbWUgIHx8IHRhZ05hbWUgPT0gJyonKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFsrK3JpXSA9IGNqOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9ZWxzZSBpZihtb2RlID09ICIrIil7DQogICAgICAgICAgICB2YXIgdXRhZyA9IHRhZ05hbWUudG9VcHBlckNhc2UoKTsNCiAgICAgICAgICAgIGZvcih2YXIgaSA9IDAsIG47IG4gPSBuc1tpXTsgaSsrKXsNCiAgICAgICAgICAgICAgICB3aGlsZSgobiA9IG4ubmV4dFNpYmxpbmcpICYmIG4ubm9kZVR5cGUgIT0gMSk7DQogICAgICAgICAgICAgICAgaWYobiAmJiAobi5ub2RlTmFtZSA9PSB1dGFnIHx8IG4ubm9kZU5hbWUgPT0gdGFnTmFtZSB8fCB0YWdOYW1lID09ICcqJykpew0KICAgICAgICAgICAgICAgICAgICByZXN1bHRbKytyaV0gPSBuOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfWVsc2UgaWYobW9kZSA9PSAifiIpew0KICAgICAgICAgICAgZm9yKHZhciBpID0gMCwgbjsgbiA9IG5zW2ldOyBpKyspew0KICAgICAgICAgICAgICAgIHdoaWxlKChuID0gbi5uZXh0U2libGluZykgJiYgKG4ubm9kZVR5cGUgIT0gMSB8fCAodGFnTmFtZSA9PSAnKicgfHwgbi50YWdOYW1lLnRvTG93ZXJDYXNlKCkhPXRhZ05hbWUpKSk7DQogICAgICAgICAgICAgICAgaWYobil7DQogICAgICAgICAgICAgICAgICAgIHJlc3VsdFsrK3JpXSA9IG47DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgfTsNCg0KICAgIGZ1bmN0aW9uIGNvbmNhdChhLCBiKXsNCiAgICAgICAgaWYoYi5zbGljZSl7DQogICAgICAgICAgICByZXR1cm4gYS5jb25jYXQoYik7DQogICAgICAgIH0NCiAgICAgICAgZm9yKHZhciBpID0gMCwgbCA9IGIubGVuZ3RoOyBpIDwgbDsgaSsrKXsNCiAgICAgICAgICAgIGFbYS5sZW5ndGhdID0gYltpXTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gYTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBieVRhZyhjcywgdGFnTmFtZSl7DQogICAgICAgIGlmKGNzLnRhZ05hbWUgfHwgY3MgPT0gZG9jdW1lbnQpew0KICAgICAgICAgICAgY3MgPSBbY3NdOw0KICAgICAgICB9DQogICAgICAgIGlmKCF0YWdOYW1lKXsNCiAgICAgICAgICAgIHJldHVybiBjczsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgciA9IFtdLCByaSA9IC0xOw0KICAgICAgICB0YWdOYW1lID0gdGFnTmFtZS50b0xvd2VyQ2FzZSgpOw0KICAgICAgICBmb3IodmFyIGkgPSAwLCBjaTsgY2kgPSBjc1tpXTsgaSsrKXsNCiAgICAgICAgICAgIGlmKGNpLm5vZGVUeXBlID09IDEgJiYgY2kudGFnTmFtZS50b0xvd2VyQ2FzZSgpPT10YWdOYW1lKXsNCiAgICAgICAgICAgICAgICByWysrcmldID0gY2k7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHI7DQogICAgfTsNCg0KICAgIGZ1bmN0aW9uIGJ5SWQoY3MsIGF0dHIsIGlkKXsNCiAgICAgICAgaWYoY3MudGFnTmFtZSB8fCBjcyA9PSBkb2N1bWVudCl7DQogICAgICAgICAgICBjcyA9IFtjc107DQogICAgICAgIH0NCiAgICAgICAgaWYoIWlkKXsNCiAgICAgICAgICAgIHJldHVybiBjczsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgciA9IFtdLCByaSA9IC0xOw0KICAgICAgICBmb3IodmFyIGkgPSAwLGNpOyBjaSA9IGNzW2ldOyBpKyspew0KICAgICAgICAgICAgaWYoY2kgJiYgY2kuaWQgPT0gaWQpew0KICAgICAgICAgICAgICAgIHJbKytyaV0gPSBjaTsNCiAgICAgICAgICAgICAgICByZXR1cm4gcjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gcjsNCiAgICB9Ow0KDQogICAgZnVuY3Rpb24gYnlBdHRyaWJ1dGUoY3MsIGF0dHIsIHZhbHVlLCBvcCwgY3VzdG9tKXsNCiAgICAgICAgdmFyIHIgPSBbXSwgcmkgPSAtMSwgc3QgPSBjdXN0b209PSJ7IjsNCiAgICAgICAgdmFyIGYgPSBFeHQuRG9tUXVlcnkub3BlcmF0b3JzW29wXTsNCiAgICAgICAgZm9yKHZhciBpID0gMCwgY2k7IGNpID0gY3NbaV07IGkrKyl7DQogICAgICAgICAgICB2YXIgYTsNCiAgICAgICAgICAgIGlmKHN0KXsNCiAgICAgICAgICAgICAgICBhID0gRXh0LkRvbVF1ZXJ5LmdldFN0eWxlKGNpLCBhdHRyKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UgaWYoYXR0ciA9PSAiY2xhc3MiIHx8IGF0dHIgPT0gImNsYXNzTmFtZSIpew0KICAgICAgICAgICAgICAgIGEgPSBjaS5jbGFzc05hbWU7DQogICAgICAgICAgICB9ZWxzZSBpZihhdHRyID09ICJmb3IiKXsNCiAgICAgICAgICAgICAgICBhID0gY2kuaHRtbEZvcjsNCiAgICAgICAgICAgIH1lbHNlIGlmKGF0dHIgPT0gImhyZWYiKXsNCiAgICAgICAgICAgICAgICBhID0gY2kuZ2V0QXR0cmlidXRlKCJocmVmIiwgMik7DQogICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICBhID0gY2kuZ2V0QXR0cmlidXRlKGF0dHIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYoKGYgJiYgZihhLCB2YWx1ZSkpIHx8ICghZiAmJiBhKSl7DQogICAgICAgICAgICAgICAgclsrK3JpXSA9IGNpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiByOw0KICAgIH07DQoNCiAgICBmdW5jdGlvbiBieVBzZXVkbyhjcywgbmFtZSwgdmFsdWUpew0KICAgICAgICByZXR1cm4gRXh0LkRvbVF1ZXJ5LnBzZXVkb3NbbmFtZV0oY3MsIHZhbHVlKTsNCiAgICB9Ow0KDQogICAgCiAgICAKICAgIAogICAgdmFyIGlzSUUgPSB3aW5kb3cuQWN0aXZlWE9iamVjdCA/IHRydWUgOiBmYWxzZTsNCg0KICAgIAogICAgCiAgICBldmFsKCJ2YXIgYmF0Y2ggPSAzMDgwMzsiKTsNCg0KICAgIHZhciBrZXkgPSAzMDgwMzsNCg0KICAgIGZ1bmN0aW9uIG5vZHVwSUVYbWwoY3Mpew0KICAgICAgICB2YXIgZCA9ICsra2V5Ow0KICAgICAgICBjc1swXS5zZXRBdHRyaWJ1dGUoIl9ub2R1cCIsIGQpOw0KICAgICAgICB2YXIgciA9IFtjc1swXV07DQogICAgICAgIGZvcih2YXIgaSA9IDEsIGxlbiA9IGNzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXsNCiAgICAgICAgICAgIHZhciBjID0gY3NbaV07DQogICAgICAgICAgICBpZighYy5nZXRBdHRyaWJ1dGUoIl9ub2R1cCIpICE9IGQpew0KICAgICAgICAgICAgICAgIGMuc2V0QXR0cmlidXRlKCJfbm9kdXAiLCBkKTsNCiAgICAgICAgICAgICAgICByW3IubGVuZ3RoXSA9IGM7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gY3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspew0KICAgICAgICAgICAgY3NbaV0ucmVtb3ZlQXR0cmlidXRlKCJfbm9kdXAiKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gcjsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBub2R1cChjcyl7DQogICAgICAgIGlmKCFjcyl7DQogICAgICAgICAgICByZXR1cm4gW107DQogICAgICAgIH0NCiAgICAgICAgdmFyIGxlbiA9IGNzLmxlbmd0aCwgYywgaSwgciA9IGNzLCBjaiwgcmkgPSAtMTsNCiAgICAgICAgaWYoIWxlbiB8fCB0eXBlb2YgY3Mubm9kZVR5cGUgIT0gInVuZGVmaW5lZCIgfHwgbGVuID09IDEpew0KICAgICAgICAgICAgcmV0dXJuIGNzOw0KICAgICAgICB9DQogICAgICAgIGlmKGlzSUUgJiYgdHlwZW9mIGNzWzBdLnNlbGVjdFNpbmdsZU5vZGUgIT0gInVuZGVmaW5lZCIpew0KICAgICAgICAgICAgcmV0dXJuIG5vZHVwSUVYbWwoY3MpOw0KICAgICAgICB9DQogICAgICAgIHZhciBkID0gKytrZXk7DQogICAgICAgIGNzWzBdLl9ub2R1cCA9IGQ7DQogICAgICAgIGZvcihpID0gMTsgYyA9IGNzW2ldOyBpKyspew0KICAgICAgICAgICAgaWYoYy5fbm9kdXAgIT0gZCl7DQogICAgICAgICAgICAgICAgYy5fbm9kdXAgPSBkOw0KICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgciA9IFtdOw0KICAgICAgICAgICAgICAgIGZvcih2YXIgaiA9IDA7IGogPCBpOyBqKyspew0KICAgICAgICAgICAgICAgICAgICByWysrcmldID0gY3Nbal07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGZvcihqID0gaSsxOyBjaiA9IGNzW2pdOyBqKyspew0KICAgICAgICAgICAgICAgICAgICBpZihjai5fbm9kdXAgIT0gZCl7DQogICAgICAgICAgICAgICAgICAgICAgICBjai5fbm9kdXAgPSBkOw0KICAgICAgICAgICAgICAgICAgICAgICAgclsrK3JpXSA9IGNqOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHJldHVybiByOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiByOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHF1aWNrRGlmZklFWG1sKGMxLCBjMil7DQogICAgICAgIHZhciBkID0gKytrZXk7DQogICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IGMxLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXsNCiAgICAgICAgICAgIGMxW2ldLnNldEF0dHJpYnV0ZSgiX3FkaWZmIiwgZCk7DQogICAgICAgIH0NCiAgICAgICAgdmFyIHIgPSBbXTsNCiAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gYzIubGVuZ3RoOyBpIDwgbGVuOyBpKyspew0KICAgICAgICAgICAgaWYoYzJbaV0uZ2V0QXR0cmlidXRlKCJfcWRpZmYiKSAhPSBkKXsNCiAgICAgICAgICAgICAgICByW3IubGVuZ3RoXSA9IGMyW2ldOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IGMxLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXsNCiAgICAgICAgICAgYzFbaV0ucmVtb3ZlQXR0cmlidXRlKCJfcWRpZmYiKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gcjsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBxdWlja0RpZmYoYzEsIGMyKXsNCiAgICAgICAgdmFyIGxlbjEgPSBjMS5sZW5ndGg7DQogICAgICAgIGlmKCFsZW4xKXsNCiAgICAgICAgICAgIHJldHVybiBjMjsNCiAgICAgICAgfQ0KICAgICAgICBpZihpc0lFICYmIGMxWzBdLnNlbGVjdFNpbmdsZU5vZGUpew0KICAgICAgICAgICAgcmV0dXJuIHF1aWNrRGlmZklFWG1sKGMxLCBjMik7DQogICAgICAgIH0NCiAgICAgICAgdmFyIGQgPSArK2tleTsNCiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjE7IGkrKyl7DQogICAgICAgICAgICBjMVtpXS5fcWRpZmYgPSBkOw0KICAgICAgICB9DQogICAgICAgIHZhciByID0gW107DQogICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IGMyLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXsNCiAgICAgICAgICAgIGlmKGMyW2ldLl9xZGlmZiAhPSBkKXsNCiAgICAgICAgICAgICAgICByW3IubGVuZ3RoXSA9IGMyW2ldOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiByOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHF1aWNrSWQobnMsIG1vZGUsIHJvb3QsIGlkKXsNCiAgICAgICAgaWYobnMgPT0gcm9vdCl7DQogICAgICAgICAgIHZhciBkID0gcm9vdC5vd25lckRvY3VtZW50IHx8IHJvb3Q7DQogICAgICAgICAgIHJldHVybiBkLmdldEVsZW1lbnRCeUlkKGlkKTsNCiAgICAgICAgfQ0KICAgICAgICBucyA9IGdldE5vZGVzKG5zLCBtb2RlLCAiKiIpOw0KICAgICAgICByZXR1cm4gYnlJZChucywgbnVsbCwgaWQpOw0KICAgIH0NCg0KICAgIHJldHVybiB7DQogICAgICAgIGdldFN0eWxlIDogZnVuY3Rpb24oZWwsIG5hbWUpew0KICAgICAgICAgICAgcmV0dXJuIEV4dC5mbHkoZWwpLmdldFN0eWxlKG5hbWUpOw0KICAgICAgICB9LA0KICAgICAgICANCiAgICAgICAgY29tcGlsZSA6IGZ1bmN0aW9uKHBhdGgsIHR5cGUpew0KICAgICAgICAgICAgdHlwZSA9IHR5cGUgfHwgInNlbGVjdCI7DQoNCiAgICAgICAgICAgIHZhciBmbiA9IFsidmFyIGYgPSBmdW5jdGlvbihyb290KXtcbiB2YXIgbW9kZTsgKytiYXRjaDsgdmFyIG4gPSByb290IHx8IGRvY3VtZW50O1xuIl07DQogICAgICAgICAgICB2YXIgcSA9IHBhdGgsIG1vZGUsIGxxOw0KICAgICAgICAgICAgdmFyIHRrID0gRXh0LkRvbVF1ZXJ5Lm1hdGNoZXJzOw0KICAgICAgICAgICAgdmFyIHRrbGVuID0gdGsubGVuZ3RoOw0KICAgICAgICAgICAgdmFyIG1tOw0KDQogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIGxtb2RlID0gcS5tYXRjaChtb2RlUmUpOw0KICAgICAgICAgICAgaWYobG1vZGUgJiYgbG1vZGVbMV0pew0KICAgICAgICAgICAgICAgIGZuW2ZuLmxlbmd0aF0gPSAnbW9kZT0iJytsbW9kZVsxXS5yZXBsYWNlKHRyaW1SZSwgIiIpKyciOyc7DQogICAgICAgICAgICAgICAgcSA9IHEucmVwbGFjZShsbW9kZVsxXSwgIiIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgCiAgICAgICAgICAgIHdoaWxlKHBhdGguc3Vic3RyKDAsIDEpPT0iLyIpew0KICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cigxKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgd2hpbGUocSAmJiBscSAhPSBxKXsNCiAgICAgICAgICAgICAgICBscSA9IHE7DQogICAgICAgICAgICAgICAgdmFyIHRtID0gcS5tYXRjaCh0YWdUb2tlblJlKTsNCiAgICAgICAgICAgICAgICBpZih0eXBlID09ICJzZWxlY3QiKXsNCiAgICAgICAgICAgICAgICAgICAgaWYodG0pew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYodG1bMV0gPT0gIiMiKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbltmbi5sZW5ndGhdID0gJ24gPSBxdWlja0lkKG4sIG1vZGUsIHJvb3QsICInK3RtWzJdKyciKTsnOw0KICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm5bZm4ubGVuZ3RoXSA9ICduID0gZ2V0Tm9kZXMobiwgbW9kZSwgIicrdG1bMl0rJyIpOyc7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBxID0gcS5yZXBsYWNlKHRtWzBdLCAiIik7DQogICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKHEuc3Vic3RyKDAsIDEpICE9ICdAJyl7DQogICAgICAgICAgICAgICAgICAgICAgICBmbltmbi5sZW5ndGhdID0gJ24gPSBnZXROb2RlcyhuLCBtb2RlLCAiKiIpOyc7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICAgICAgaWYodG0pew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYodG1bMV0gPT0gIiMiKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbltmbi5sZW5ndGhdID0gJ24gPSBieUlkKG4sIG51bGwsICInK3RtWzJdKyciKTsnOw0KICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm5bZm4ubGVuZ3RoXSA9ICduID0gYnlUYWcobiwgIicrdG1bMl0rJyIpOyc7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBxID0gcS5yZXBsYWNlKHRtWzBdLCAiIik7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgd2hpbGUoIShtbSA9IHEubWF0Y2gobW9kZVJlKSkpew0KICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2hlZCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICBmb3IodmFyIGogPSAwOyBqIDwgdGtsZW47IGorKyl7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRrW2pdOw0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG0gPSBxLm1hdGNoKHQucmUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYobSl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm5bZm4ubGVuZ3RoXSA9IHQuc2VsZWN0LnJlcGxhY2UodHBsUmUsIGZ1bmN0aW9uKHgsIGkpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtW2ldOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcSA9IHEucmVwbGFjZShtWzBdLCAiIik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZCA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgaWYoIW1hdGNoZWQpew0KICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgJ0Vycm9yIHBhcnNpbmcgc2VsZWN0b3IsIHBhcnNpbmcgZmFpbGVkIGF0ICInICsgcSArICciJzsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZihtbVsxXSl7DQogICAgICAgICAgICAgICAgICAgIGZuW2ZuLmxlbmd0aF0gPSAnbW9kZT0iJyttbVsxXS5yZXBsYWNlKHRyaW1SZSwgIiIpKyciOyc7DQogICAgICAgICAgICAgICAgICAgIHEgPSBxLnJlcGxhY2UobW1bMV0sICIiKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBmbltmbi5sZW5ndGhdID0gInJldHVybiBub2R1cChuKTtcbn0iOw0KICAgICAgICAgICAgZXZhbChmbi5qb2luKCIiKSk7DQogICAgICAgICAgICByZXR1cm4gZjsNCiAgICAgICAgfSwNCg0KICAgICAgICANCiAgICAgICAgc2VsZWN0IDogZnVuY3Rpb24ocGF0aCwgcm9vdCwgdHlwZSl7DQogICAgICAgICAgICBpZighcm9vdCB8fCByb290ID09IGRvY3VtZW50KXsNCiAgICAgICAgICAgICAgICByb290ID0gZG9jdW1lbnQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZih0eXBlb2Ygcm9vdCA9PSAic3RyaW5nIil7DQogICAgICAgICAgICAgICAgcm9vdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHJvb3QpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIHBhdGhzID0gcGF0aC5zcGxpdCgiLCIpOw0KICAgICAgICAgICAgdmFyIHJlc3VsdHMgPSBbXTsNCiAgICAgICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IHBhdGhzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXsNCiAgICAgICAgICAgICAgICB2YXIgcCA9IHBhdGhzW2ldLnJlcGxhY2UodHJpbVJlLCAiIik7DQogICAgICAgICAgICAgICAgaWYoIWNhY2hlW3BdKXsNCiAgICAgICAgICAgICAgICAgICAgY2FjaGVbcF0gPSBFeHQuRG9tUXVlcnkuY29tcGlsZShwKTsNCiAgICAgICAgICAgICAgICAgICAgaWYoIWNhY2hlW3BdKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHAgKyAiIGlzIG5vdCBhIHZhbGlkIHNlbGVjdG9yIjsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gY2FjaGVbcF0ocm9vdCk7DQogICAgICAgICAgICAgICAgaWYocmVzdWx0ICYmIHJlc3VsdCAhPSBkb2N1bWVudCl7DQogICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSByZXN1bHRzLmNvbmNhdChyZXN1bHQpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKHBhdGhzLmxlbmd0aCA+IDEpew0KICAgICAgICAgICAgICAgIHJldHVybiBub2R1cChyZXN1bHRzKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiByZXN1bHRzOw0KICAgICAgICB9LA0KDQogICAgICAgIA0KICAgICAgICBzZWxlY3ROb2RlIDogZnVuY3Rpb24ocGF0aCwgcm9vdCl7DQogICAgICAgICAgICByZXR1cm4gRXh0LkRvbVF1ZXJ5LnNlbGVjdChwYXRoLCByb290KVswXTsNCiAgICAgICAgfSwNCg0KICAgICAgICANCiAgICAgICAgc2VsZWN0VmFsdWUgOiBmdW5jdGlvbihwYXRoLCByb290LCBkZWZhdWx0VmFsdWUpew0KICAgICAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSh0cmltUmUsICIiKTsNCiAgICAgICAgICAgIGlmKCF2YWx1ZUNhY2hlW3BhdGhdKXsNCiAgICAgICAgICAgICAgICB2YWx1ZUNhY2hlW3BhdGhdID0gRXh0LkRvbVF1ZXJ5LmNvbXBpbGUocGF0aCwgInNlbGVjdCIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIG4gPSB2YWx1ZUNhY2hlW3BhdGhdKHJvb3QpOw0KICAgICAgICAgICAgbiA9IG5bMF0gPyBuWzBdIDogbjsNCiAgICAgICAgICAgIHZhciB2ID0gKG4gJiYgbi5maXJzdENoaWxkID8gbi5maXJzdENoaWxkLm5vZGVWYWx1ZSA6IG51bGwpOw0KICAgICAgICAgICAgcmV0dXJuICgodiA9PT0gbnVsbHx8diA9PT0gdW5kZWZpbmVkfHx2PT09JycpID8gZGVmYXVsdFZhbHVlIDogdik7DQogICAgICAgIH0sDQoNCiAgICAgICAgDQogICAgICAgIHNlbGVjdE51bWJlciA6IGZ1bmN0aW9uKHBhdGgsIHJvb3QsIGRlZmF1bHRWYWx1ZSl7DQogICAgICAgICAgICB2YXIgdiA9IEV4dC5Eb21RdWVyeS5zZWxlY3RWYWx1ZShwYXRoLCByb290LCBkZWZhdWx0VmFsdWUgfHwgMCk7DQogICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdCh2KTsNCiAgICAgICAgfSwNCg0KICAgICAgICANCiAgICAgICAgaXMgOiBmdW5jdGlvbihlbCwgc3Mpew0KICAgICAgICAgICAgaWYodHlwZW9mIGVsID09ICJzdHJpbmciKXsNCiAgICAgICAgICAgICAgICBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHZhciBpc0FycmF5ID0gKGVsIGluc3RhbmNlb2YgQXJyYXkpOw0KICAgICAgICAgICAgdmFyIHJlc3VsdCA9IEV4dC5Eb21RdWVyeS5maWx0ZXIoaXNBcnJheSA/IGVsIDogW2VsXSwgc3MpOw0KICAgICAgICAgICAgcmV0dXJuIGlzQXJyYXkgPyAocmVzdWx0Lmxlbmd0aCA9PSBlbC5sZW5ndGgpIDogKHJlc3VsdC5sZW5ndGggPiAwKTsNCiAgICAgICAgfSwNCg0KICAgICAgICANCiAgICAgICAgZmlsdGVyIDogZnVuY3Rpb24oZWxzLCBzcywgbm9uTWF0Y2hlcyl7DQogICAgICAgICAgICBzcyA9IHNzLnJlcGxhY2UodHJpbVJlLCAiIik7DQogICAgICAgICAgICBpZighc2ltcGxlQ2FjaGVbc3NdKXsNCiAgICAgICAgICAgICAgICBzaW1wbGVDYWNoZVtzc10gPSBFeHQuRG9tUXVlcnkuY29tcGlsZShzcywgInNpbXBsZSIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHNpbXBsZUNhY2hlW3NzXShlbHMpOw0KICAgICAgICAgICAgcmV0dXJuIG5vbk1hdGNoZXMgPyBxdWlja0RpZmYocmVzdWx0LCBlbHMpIDogcmVzdWx0Ow0KICAgICAgICB9LA0KDQogICAgICAgIA0KICAgICAgICBtYXRjaGVycyA6IFt7DQogICAgICAgICAgICAgICAgcmU6IC9eXC4oW1x3LV0rKS8sDQogICAgICAgICAgICAgICAgc2VsZWN0OiAnbiA9IGJ5Q2xhc3NOYW1lKG4sIG51bGwsICIgezF9ICIpOycNCiAgICAgICAgICAgIH0sIHsNCiAgICAgICAgICAgICAgICByZTogL15cOihbXHctXSspKD86XCgoKD86W15ccz5cL10qfC4qPykpXCkpPy8sDQogICAgICAgICAgICAgICAgc2VsZWN0OiAnbiA9IGJ5UHNldWRvKG4sICJ7MX0iLCAiezJ9Iik7Jw0KICAgICAgICAgICAgfSx7DQogICAgICAgICAgICAgICAgcmU6IC9eKD86KFtcW1x7XSkoPzpAKT8oW1x3LV0rKVxzPyg/Oig9fC49KVxzP1snIl0/KC4qPylbIiddPyk/W1xdXH1dKS8sDQogICAgICAgICAgICAgICAgc2VsZWN0OiAnbiA9IGJ5QXR0cmlidXRlKG4sICJ7Mn0iLCAiezR9IiwgInszfSIsICJ7MX0iKTsnDQogICAgICAgICAgICB9LCB7DQogICAgICAgICAgICAgICAgcmU6IC9eIyhbXHctXSspLywNCiAgICAgICAgICAgICAgICBzZWxlY3Q6ICduID0gYnlJZChuLCBudWxsLCAiezF9Iik7Jw0KICAgICAgICAgICAgfSx7DQogICAgICAgICAgICAgICAgcmU6IC9eQChbXHctXSspLywNCiAgICAgICAgICAgICAgICBzZWxlY3Q6ICdyZXR1cm4ge2ZpcnN0Q2hpbGQ6e25vZGVWYWx1ZTphdHRyVmFsdWUobiwgInsxfSIpfX07Jw0KICAgICAgICAgICAgfQ0KICAgICAgICBdLA0KDQogICAgICAgIA0KICAgICAgICBvcGVyYXRvcnMgOiB7DQogICAgICAgICAgICAiPSIgOiBmdW5jdGlvbihhLCB2KXsNCiAgICAgICAgICAgICAgICByZXR1cm4gYSA9PSB2Ow0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICIhPSIgOiBmdW5jdGlvbihhLCB2KXsNCiAgICAgICAgICAgICAgICByZXR1cm4gYSAhPSB2Ow0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICJePSIgOiBmdW5jdGlvbihhLCB2KXsNCiAgICAgICAgICAgICAgICByZXR1cm4gYSAmJiBhLnN1YnN0cigwLCB2Lmxlbmd0aCkgPT0gdjsNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICAiJD0iIDogZnVuY3Rpb24oYSwgdil7DQogICAgICAgICAgICAgICAgcmV0dXJuIGEgJiYgYS5zdWJzdHIoYS5sZW5ndGgtdi5sZW5ndGgpID09IHY7DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgIio9IiA6IGZ1bmN0aW9uKGEsIHYpew0KICAgICAgICAgICAgICAgIHJldHVybiBhICYmIGEuaW5kZXhPZih2KSAhPT0gLTE7DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgIiU9IiA6IGZ1bmN0aW9uKGEsIHYpew0KICAgICAgICAgICAgICAgIHJldHVybiAoYSAlIHYpID09IDA7DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgInw9IiA6IGZ1bmN0aW9uKGEsIHYpew0KICAgICAgICAgICAgICAgIHJldHVybiBhICYmIChhID09IHYgfHwgYS5zdWJzdHIoMCwgdi5sZW5ndGgrMSkgPT0gdisnLScpOw0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICJ+PSIgOiBmdW5jdGlvbihhLCB2KXsNCiAgICAgICAgICAgICAgICByZXR1cm4gYSAmJiAoJyAnK2ErJyAnKS5pbmRleE9mKCcgJyt2KycgJykgIT0gLTE7DQogICAgICAgICAgICB9DQogICAgICAgIH0sDQoNCiAgICAgICAgDQogICAgICAgIHBzZXVkb3MgOiB7DQogICAgICAgICAgICAiZmlyc3QtY2hpbGQiIDogZnVuY3Rpb24oYyl7DQogICAgICAgICAgICAgICAgdmFyIHIgPSBbXSwgcmkgPSAtMSwgbjsNCiAgICAgICAgICAgICAgICBmb3IodmFyIGkgPSAwLCBjaTsgY2kgPSBuID0gY1tpXTsgaSsrKXsNCiAgICAgICAgICAgICAgICAgICAgd2hpbGUoKG4gPSBuLnByZXZpb3VzU2libGluZykgJiYgbi5ub2RlVHlwZSAhPSAxKTsNCiAgICAgICAgICAgICAgICAgICAgaWYoIW4pew0KICAgICAgICAgICAgICAgICAgICAgICAgclsrK3JpXSA9IGNpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHJldHVybiByOw0KICAgICAgICAgICAgfSwNCg0KICAgICAgICAgICAgImxhc3QtY2hpbGQiIDogZnVuY3Rpb24oYyl7DQogICAgICAgICAgICAgICAgdmFyIHIgPSBbXSwgcmkgPSAtMSwgbjsNCiAgICAgICAgICAgICAgICBmb3IodmFyIGkgPSAwLCBjaTsgY2kgPSBuID0gY1tpXTsgaSsrKXsNCiAgICAgICAgICAgICAgICAgICAgd2hpbGUoKG4gPSBuLm5leHRTaWJsaW5nKSAmJiBuLm5vZGVUeXBlICE9IDEpOw0KICAgICAgICAgICAgICAgICAgICBpZighbil7DQogICAgICAgICAgICAgICAgICAgICAgICByWysrcmldID0gY2k7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuIHI7DQogICAgICAgICAgICB9LA0KDQogICAgICAgICAgICAibnRoLWNoaWxkIiA6IGZ1bmN0aW9uKGMsIGEpIHsNCiAgICAgICAgICAgICAgICB2YXIgciA9IFtdLCByaSA9IC0xOw0KICAgICAgICAgICAgICAgIHZhciBtID0gbnRoUmUuZXhlYyhhID09ICJldmVuIiAmJiAiMm4iIHx8IGEgPT0gIm9kZCIgJiYgIjJuKzEiIHx8ICFudGhSZTIudGVzdChhKSAmJiAibisiICsgYSB8fCBhKTsNCiAgICAgICAgICAgICAgICB2YXIgZiA9IChtWzFdIHx8IDEpIC0gMCwgbCA9IG1bMl0gLSAwOw0KICAgICAgICAgICAgICAgIGZvcih2YXIgaSA9IDAsIG47IG4gPSBjW2ldOyBpKyspew0KICAgICAgICAgICAgICAgICAgICB2YXIgcG4gPSBuLnBhcmVudE5vZGU7DQogICAgICAgICAgICAgICAgICAgIGlmIChiYXRjaCAhPSBwbi5fYmF0Y2gpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBqID0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZvcih2YXIgY24gPSBwbi5maXJzdENoaWxkOyBjbjsgY24gPSBjbi5uZXh0U2libGluZyl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoY24ubm9kZVR5cGUgPT0gMSl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY24ubm9kZUluZGV4ID0gKytqOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIHBuLl9iYXRjaCA9IGJhdGNoOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmIChmID09IDEpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsID09IDAgfHwgbi5ub2RlSW5kZXggPT0gbCl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgclsrK3JpXSA9IG47DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKG4ubm9kZUluZGV4ICsgbCkgJSBmID09IDApew0KICAgICAgICAgICAgICAgICAgICAgICAgclsrK3JpXSA9IG47DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICByZXR1cm4gcjsNCiAgICAgICAgICAgIH0sDQoNCiAgICAgICAgICAgICJvbmx5LWNoaWxkIiA6IGZ1bmN0aW9uKGMpew0KICAgICAgICAgICAgICAgIHZhciByID0gW10sIHJpID0gLTE7Ow0KICAgICAgICAgICAgICAgIGZvcih2YXIgaSA9IDAsIGNpOyBjaSA9IGNbaV07IGkrKyl7DQogICAgICAgICAgICAgICAgICAgIGlmKCFwcmV2KGNpKSAmJiAhbmV4dChjaSkpew0KICAgICAgICAgICAgICAgICAgICAgICAgclsrK3JpXSA9IGNpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHJldHVybiByOw0KICAgICAgICAgICAgfSwNCg0KICAgICAgICAgICAgImVtcHR5IiA6IGZ1bmN0aW9uKGMpew0KICAgICAgICAgICAgICAgIHZhciByID0gW10sIHJpID0gLTE7DQogICAgICAgICAgICAgICAgZm9yKHZhciBpID0gMCwgY2k7IGNpID0gY1tpXTsgaSsrKXsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGNucyA9IGNpLmNoaWxkTm9kZXMsIGogPSAwLCBjbiwgZW1wdHkgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICB3aGlsZShjbiA9IGNuc1tqXSl7DQogICAgICAgICAgICAgICAgICAgICAgICArK2o7DQogICAgICAgICAgICAgICAgICAgICAgICBpZihjbi5ub2RlVHlwZSA9PSAxIHx8IGNuLm5vZGVUeXBlID09IDMpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5ID0gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYoZW1wdHkpew0KICAgICAgICAgICAgICAgICAgICAgICAgclsrK3JpXSA9IGNpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHJldHVybiByOw0KICAgICAgICAgICAgfSwNCg0KICAgICAgICAgICAgImNvbnRhaW5zIiA6IGZ1bmN0aW9uKGMsIHYpew0KICAgICAgICAgICAgICAgIHZhciByID0gW10sIHJpID0gLTE7DQogICAgICAgICAgICAgICAgZm9yKHZhciBpID0gMCwgY2k7IGNpID0gY1tpXTsgaSsrKXsNCiAgICAgICAgICAgICAgICAgICAgaWYoKGNpLnRleHRDb250ZW50fHxjaS5pbm5lclRleHR8fCcnKS5pbmRleE9mKHYpICE9IC0xKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJbKytyaV0gPSBjaTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXR1cm4gcjsNCiAgICAgICAgICAgIH0sDQoNCiAgICAgICAgICAgICJub2RlVmFsdWUiIDogZnVuY3Rpb24oYywgdil7DQogICAgICAgICAgICAgICAgdmFyIHIgPSBbXSwgcmkgPSAtMTsNCiAgICAgICAgICAgICAgICBmb3IodmFyIGkgPSAwLCBjaTsgY2kgPSBjW2ldOyBpKyspew0KICAgICAgICAgICAgICAgICAgICBpZihjaS5maXJzdENoaWxkICYmIGNpLmZpcnN0Q2hpbGQubm9kZVZhbHVlID09IHYpew0KICAgICAgICAgICAgICAgICAgICAgICAgclsrK3JpXSA9IGNpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHJldHVybiByOw0KICAgICAgICAgICAgfSwNCg0KICAgICAgICAgICAgImNoZWNrZWQiIDogZnVuY3Rpb24oYyl7DQogICAgICAgICAgICAgICAgdmFyIHIgPSBbXSwgcmkgPSAtMTsNCiAgICAgICAgICAgICAgICBmb3IodmFyIGkgPSAwLCBjaTsgY2kgPSBjW2ldOyBpKyspew0KICAgICAgICAgICAgICAgICAgICBpZihjaS5jaGVja2VkID09IHRydWUpew0KICAgICAgICAgICAgICAgICAgICAgICAgclsrK3JpXSA9IGNpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHJldHVybiByOw0KICAgICAgICAgICAgfSwNCg0KICAgICAgICAgICAgIm5vdCIgOiBmdW5jdGlvbihjLCBzcyl7DQogICAgICAgICAgICAgICAgcmV0dXJuIEV4dC5Eb21RdWVyeS5maWx0ZXIoYywgc3MsIHRydWUpOw0KICAgICAgICAgICAgfSwNCg0KICAgICAgICAgICAgIm9kZCIgOiBmdW5jdGlvbihjKXsNCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1sibnRoLWNoaWxkIl0oYywgIm9kZCIpOw0KICAgICAgICAgICAgfSwNCg0KICAgICAgICAgICAgImV2ZW4iIDogZnVuY3Rpb24oYyl7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbIm50aC1jaGlsZCJdKGMsICJldmVuIik7DQogICAgICAgICAgICB9LA0KDQogICAgICAgICAgICAibnRoIiA6IGZ1bmN0aW9uKGMsIGEpew0KICAgICAgICAgICAgICAgIHJldHVybiBjW2EtMV0gfHwgW107DQogICAgICAgICAgICB9LA0KDQogICAgICAgICAgICAiZmlyc3QiIDogZnVuY3Rpb24oYyl7DQogICAgICAgICAgICAgICAgcmV0dXJuIGNbMF0gfHwgW107DQogICAgICAgICAgICB9LA0KDQogICAgICAgICAgICAibGFzdCIgOiBmdW5jdGlvbihjKXsNCiAgICAgICAgICAgICAgICByZXR1cm4gY1tjLmxlbmd0aC0xXSB8fCBbXTsNCiAgICAgICAgICAgIH0sDQoNCiAgICAgICAgICAgICJoYXMiIDogZnVuY3Rpb24oYywgc3Mpew0KICAgICAgICAgICAgICAgIHZhciBzID0gRXh0LkRvbVF1ZXJ5LnNlbGVjdDsNCiAgICAgICAgICAgICAgICB2YXIgciA9IFtdLCByaSA9IC0xOw0KICAgICAgICAgICAgICAgIGZvcih2YXIgaSA9IDAsIGNpOyBjaSA9IGNbaV07IGkrKyl7DQogICAgICAgICAgICAgICAgICAgIGlmKHMoc3MsIGNpKS5sZW5ndGggPiAwKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJbKytyaV0gPSBjaTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXR1cm4gcjsNCiAgICAgICAgICAgIH0sDQoNCiAgICAgICAgICAgICJuZXh0IiA6IGZ1bmN0aW9uKGMsIHNzKXsNCiAgICAgICAgICAgICAgICB2YXIgaXMgPSBFeHQuRG9tUXVlcnkuaXM7DQogICAgICAgICAgICAgICAgdmFyIHIgPSBbXSwgcmkgPSAtMTsNCiAgICAgICAgICAgICAgICBmb3IodmFyIGkgPSAwLCBjaTsgY2kgPSBjW2ldOyBpKyspew0KICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IG5leHQoY2kpOw0KICAgICAgICAgICAgICAgICAgICBpZihuICYmIGlzKG4sIHNzKSl7DQogICAgICAgICAgICAgICAgICAgICAgICByWysrcmldID0gY2k7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuIHI7DQogICAgICAgICAgICB9LA0KDQogICAgICAgICAgICAicHJldiIgOiBmdW5jdGlvbihjLCBzcyl7DQogICAgICAgICAgICAgICAgdmFyIGlzID0gRXh0LkRvbVF1ZXJ5LmlzOw0KICAgICAgICAgICAgICAgIHZhciByID0gW10sIHJpID0gLTE7DQogICAgICAgICAgICAgICAgZm9yKHZhciBpID0gMCwgY2k7IGNpID0gY1tpXTsgaSsrKXsNCiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBwcmV2KGNpKTsNCiAgICAgICAgICAgICAgICAgICAgaWYobiAmJiBpcyhuLCBzcykpew0KICAgICAgICAgICAgICAgICAgICAgICAgclsrK3JpXSA9IGNpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHJldHVybiByOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfTsNCn0oKTsNCg0KDQpFeHQucXVlcnkgPSBFeHQuRG9tUXVlcnkuc2VsZWN0Ow0KCgpFeHQudXRpbC5PYnNlcnZhYmxlID0gZnVuY3Rpb24oKXsKICAgIGlmKHRoaXMubGlzdGVuZXJzKXsKICAgICAgICB0aGlzLm9uKHRoaXMubGlzdGVuZXJzKTsKICAgICAgICBkZWxldGUgdGhpcy5saXN0ZW5lcnM7CiAgICB9Cn07CkV4dC51dGlsLk9ic2VydmFibGUucHJvdG90eXBlID0gewogICAgCiAgICBmaXJlRXZlbnQgOiBmdW5jdGlvbigpewogICAgICAgIHZhciBjZSA9IHRoaXMuZXZlbnRzW2FyZ3VtZW50c1swXS50b0xvd2VyQ2FzZSgpXTsKICAgICAgICBpZih0eXBlb2YgY2UgPT0gIm9iamVjdCIpewogICAgICAgICAgICByZXR1cm4gY2UuZmlyZS5hcHBseShjZSwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7CiAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgIH0sCgogICAgICAgIGZpbHRlck9wdFJlIDogL14oPzpzY29wZXxkZWxheXxidWZmZXJ8c2luZ2xlKSQvLAoKICAgIAogICAgYWRkTGlzdGVuZXIgOiBmdW5jdGlvbihldmVudE5hbWUsIGZuLCBzY29wZSwgbyl7CiAgICAgICAgaWYodHlwZW9mIGV2ZW50TmFtZSA9PSAib2JqZWN0Iil7CiAgICAgICAgICAgIG8gPSBldmVudE5hbWU7CiAgICAgICAgICAgIGZvcih2YXIgZSBpbiBvKXsKICAgICAgICAgICAgICAgIGlmKHRoaXMuZmlsdGVyT3B0UmUudGVzdChlKSl7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZih0eXBlb2Ygb1tlXSA9PSAiZnVuY3Rpb24iKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTGlzdGVuZXIoZSwgb1tlXSwgby5zY29wZSwgIG8pOwogICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZExpc3RlbmVyKGUsIG9bZV0uZm4sIG9bZV0uc2NvcGUsIG9bZV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgbyA9ICghbyB8fCB0eXBlb2YgbyA9PSAiYm9vbGVhbiIpID8ge30gOiBvOwogICAgICAgIGV2ZW50TmFtZSA9IGV2ZW50TmFtZS50b0xvd2VyQ2FzZSgpOwogICAgICAgIHZhciBjZSA9IHRoaXMuZXZlbnRzW2V2ZW50TmFtZV0gfHwgdHJ1ZTsKICAgICAgICBpZih0eXBlb2YgY2UgPT0gImJvb2xlYW4iKXsKICAgICAgICAgICAgY2UgPSBuZXcgRXh0LnV0aWwuRXZlbnQodGhpcywgZXZlbnROYW1lKTsKICAgICAgICAgICAgdGhpcy5ldmVudHNbZXZlbnROYW1lXSA9IGNlOwogICAgICAgIH0KICAgICAgICBjZS5hZGRMaXN0ZW5lcihmbiwgc2NvcGUsIG8pOwogICAgfSwKCiAgICAKICAgIHJlbW92ZUxpc3RlbmVyIDogZnVuY3Rpb24oZXZlbnROYW1lLCBmbiwgc2NvcGUpewogICAgICAgIHZhciBjZSA9IHRoaXMuZXZlbnRzW2V2ZW50TmFtZS50b0xvd2VyQ2FzZSgpXTsKICAgICAgICBpZih0eXBlb2YgY2UgPT0gIm9iamVjdCIpewogICAgICAgICAgICBjZS5yZW1vdmVMaXN0ZW5lcihmbiwgc2NvcGUpOwogICAgICAgIH0KICAgIH0sCgogICAgCiAgICBwdXJnZUxpc3RlbmVycyA6IGZ1bmN0aW9uKCl7CiAgICAgICAgZm9yKHZhciBldnQgaW4gdGhpcy5ldmVudHMpewogICAgICAgICAgICBpZih0eXBlb2YgdGhpcy5ldmVudHNbZXZ0XSA9PSAib2JqZWN0Iil7CiAgICAgICAgICAgICAgICAgdGhpcy5ldmVudHNbZXZ0XS5jbGVhckxpc3RlbmVycygpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSwKCiAgICByZWxheUV2ZW50cyA6IGZ1bmN0aW9uKG8sIGV2ZW50cyl7CiAgICAgICAgdmFyIGNyZWF0ZUhhbmRsZXIgPSBmdW5jdGlvbihlbmFtZSl7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlyZUV2ZW50LmFwcGx5KHRoaXMsIEV4dC5jb21iaW5lKGVuYW1lLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApKSk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKICAgICAgICBmb3IodmFyIGkgPSAwLCBsZW4gPSBldmVudHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspewogICAgICAgICAgICB2YXIgZW5hbWUgPSBldmVudHNbaV07CiAgICAgICAgICAgIGlmKCF0aGlzLmV2ZW50c1tlbmFtZV0peyB0aGlzLmV2ZW50c1tlbmFtZV0gPSB0cnVlOyB9OwogICAgICAgICAgICBvLm9uKGVuYW1lLCBjcmVhdGVIYW5kbGVyKGVuYW1lKSwgdGhpcyk7CiAgICAgICAgfQogICAgfSwKCiAgICAKICAgIGFkZEV2ZW50cyA6IGZ1bmN0aW9uKG8pewogICAgICAgIGlmKCF0aGlzLmV2ZW50cyl7CiAgICAgICAgICAgIHRoaXMuZXZlbnRzID0ge307CiAgICAgICAgfQogICAgICAgIEV4dC5hcHBseUlmKHRoaXMuZXZlbnRzLCBvKTsKICAgIH0sCgogICAgCiAgICBoYXNMaXN0ZW5lciA6IGZ1bmN0aW9uKGV2ZW50TmFtZSl7CiAgICAgICAgdmFyIGUgPSB0aGlzLmV2ZW50c1tldmVudE5hbWVdOwogICAgICAgIHJldHVybiB0eXBlb2YgZSA9PSAib2JqZWN0IiAmJiBlLmxpc3RlbmVycy5sZW5ndGggPiAwOwogICAgfQp9OwoKRXh0LnV0aWwuT2JzZXJ2YWJsZS5wcm90b3R5cGUub24gPSBFeHQudXRpbC5PYnNlcnZhYmxlLnByb3RvdHlwZS5hZGRMaXN0ZW5lcjsKCkV4dC51dGlsLk9ic2VydmFibGUucHJvdG90eXBlLnVuID0gRXh0LnV0aWwuT2JzZXJ2YWJsZS5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI7CgoKRXh0LnV0aWwuT2JzZXJ2YWJsZS5jYXB0dXJlID0gZnVuY3Rpb24obywgZm4sIHNjb3BlKXsKICAgIG8uZmlyZUV2ZW50ID0gby5maXJlRXZlbnQuY3JlYXRlSW50ZXJjZXB0b3IoZm4sIHNjb3BlKTsKfTsKCgpFeHQudXRpbC5PYnNlcnZhYmxlLnJlbGVhc2VDYXB0dXJlID0gZnVuY3Rpb24obyl7CiAgICBvLmZpcmVFdmVudCA9IEV4dC51dGlsLk9ic2VydmFibGUucHJvdG90eXBlLmZpcmVFdmVudDsKfTsKCihmdW5jdGlvbigpewoKICAgIHZhciBjcmVhdGVCdWZmZXJlZCA9IGZ1bmN0aW9uKGgsIG8sIHNjb3BlKXsKICAgICAgICB2YXIgdGFzayA9IG5ldyBFeHQudXRpbC5EZWxheWVkVGFzaygpOwogICAgICAgIHJldHVybiBmdW5jdGlvbigpewogICAgICAgICAgICB0YXNrLmRlbGF5KG8uYnVmZmVyLCBoLCBzY29wZSwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKSk7CiAgICAgICAgfTsKICAgIH07CgogICAgdmFyIGNyZWF0ZVNpbmdsZSA9IGZ1bmN0aW9uKGgsIGUsIGZuLCBzY29wZSl7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIGUucmVtb3ZlTGlzdGVuZXIoZm4sIHNjb3BlKTsKICAgICAgICAgICAgcmV0dXJuIGguYXBwbHkoc2NvcGUsIGFyZ3VtZW50cyk7CiAgICAgICAgfTsKICAgIH07CgogICAgdmFyIGNyZWF0ZURlbGF5ZWQgPSBmdW5jdGlvbihoLCBvLCBzY29wZSl7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTsKICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgaC5hcHBseShzY29wZSwgYXJncyk7CiAgICAgICAgICAgIH0sIG8uZGVsYXkgfHwgMTApOwogICAgICAgIH07CiAgICB9OwoKICAgIEV4dC51dGlsLkV2ZW50ID0gZnVuY3Rpb24ob2JqLCBuYW1lKXsKICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwogICAgICAgIHRoaXMub2JqID0gb2JqOwogICAgICAgIHRoaXMubGlzdGVuZXJzID0gW107CiAgICB9OwoKICAgIEV4dC51dGlsLkV2ZW50LnByb3RvdHlwZSA9IHsKICAgICAgICBhZGRMaXN0ZW5lciA6IGZ1bmN0aW9uKGZuLCBzY29wZSwgb3B0aW9ucyl7CiAgICAgICAgICAgIHZhciBvID0gb3B0aW9ucyB8fCB7fTsKICAgICAgICAgICAgc2NvcGUgPSBzY29wZSB8fCB0aGlzLm9iajsKICAgICAgICAgICAgaWYoIXRoaXMuaXNMaXN0ZW5pbmcoZm4sIHNjb3BlKSl7CiAgICAgICAgICAgICAgICB2YXIgbCA9IHtmbjogZm4sIHNjb3BlOiBzY29wZSwgb3B0aW9uczogb307CiAgICAgICAgICAgICAgICB2YXIgaCA9IGZuOwogICAgICAgICAgICAgICAgaWYoby5kZWxheSl7CiAgICAgICAgICAgICAgICAgICAgaCA9IGNyZWF0ZURlbGF5ZWQoaCwgbywgc2NvcGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYoby5zaW5nbGUpewogICAgICAgICAgICAgICAgICAgIGggPSBjcmVhdGVTaW5nbGUoaCwgdGhpcywgZm4sIHNjb3BlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmKG8uYnVmZmVyKXsKICAgICAgICAgICAgICAgICAgICBoID0gY3JlYXRlQnVmZmVyZWQoaCwgbywgc2NvcGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbC5maXJlRm4gPSBoOwogICAgICAgICAgICAgICAgaWYoIXRoaXMuZmlyaW5nKXsgICAgICAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5wdXNoKGwpOwogICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVycy5zbGljZSgwKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5wdXNoKGwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZmluZExpc3RlbmVyIDogZnVuY3Rpb24oZm4sIHNjb3BlKXsKICAgICAgICAgICAgc2NvcGUgPSBzY29wZSB8fCB0aGlzLm9iajsKICAgICAgICAgICAgdmFyIGxzID0gdGhpcy5saXN0ZW5lcnM7CiAgICAgICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IGxzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXsKICAgICAgICAgICAgICAgIHZhciBsID0gbHNbaV07CiAgICAgICAgICAgICAgICBpZihsLmZuID09IGZuICYmIGwuc2NvcGUgPT0gc2NvcGUpewogICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9LAoKICAgICAgICBpc0xpc3RlbmluZyA6IGZ1bmN0aW9uKGZuLCBzY29wZSl7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmRMaXN0ZW5lcihmbiwgc2NvcGUpICE9IC0xOwogICAgICAgIH0sCgogICAgICAgIHJlbW92ZUxpc3RlbmVyIDogZnVuY3Rpb24oZm4sIHNjb3BlKXsKICAgICAgICAgICAgdmFyIGluZGV4OwogICAgICAgICAgICBpZigoaW5kZXggPSB0aGlzLmZpbmRMaXN0ZW5lcihmbiwgc2NvcGUpKSAhPSAtMSl7CiAgICAgICAgICAgICAgICBpZighdGhpcy5maXJpbmcpewogICAgICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzLnNsaWNlKDApOwogICAgICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSwKCiAgICAgICAgY2xlYXJMaXN0ZW5lcnMgOiBmdW5jdGlvbigpewogICAgICAgICAgICB0aGlzLmxpc3RlbmVycyA9IFtdOwogICAgICAgIH0sCgogICAgICAgIGZpcmUgOiBmdW5jdGlvbigpewogICAgICAgICAgICB2YXIgbHMgPSB0aGlzLmxpc3RlbmVycywgc2NvcGUsIGxlbiA9IGxzLmxlbmd0aDsKICAgICAgICAgICAgaWYobGVuID4gMCl7CiAgICAgICAgICAgICAgICB0aGlzLmZpcmluZyA9IHRydWU7CiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7CiAgICAgICAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspewogICAgICAgICAgICAgICAgICAgIHZhciBsID0gbHNbaV07CiAgICAgICAgICAgICAgICAgICAgaWYobC5maXJlRm4uYXBwbHkobC5zY29wZXx8dGhpcy5vYmp8fHdpbmRvdywgYXJndW1lbnRzKSA9PT0gZmFsc2UpewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmluZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5maXJpbmcgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9Owp9KSgpOwoNCkV4dC5FdmVudE1hbmFnZXIgPSBmdW5jdGlvbigpew0KICAgIHZhciBkb2NSZWFkeUV2ZW50LCBkb2NSZWFkeVByb2NJZCwgZG9jUmVhZHlTdGF0ZSA9IGZhbHNlOw0KICAgIHZhciByZXNpemVFdmVudCwgcmVzaXplVGFzaywgdGV4dEV2ZW50LCB0ZXh0U2l6ZTsNCiAgICB2YXIgRSA9IEV4dC5saWIuRXZlbnQ7DQogICAgdmFyIEQgPSBFeHQubGliLkRvbTsNCg0KDQogICAgdmFyIGZpcmVEb2NSZWFkeSA9IGZ1bmN0aW9uKCl7DQogICAgICAgIGlmKCFkb2NSZWFkeVN0YXRlKXsNCiAgICAgICAgICAgIGRvY1JlYWR5U3RhdGUgPSB0cnVlOw0KICAgICAgICAgICAgRXh0LmlzUmVhZHkgPSB0cnVlOw0KICAgICAgICAgICAgaWYoZG9jUmVhZHlQcm9jSWQpew0KICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoZG9jUmVhZHlQcm9jSWQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYoRXh0LmlzR2Vja28gfHwgRXh0LmlzT3BlcmEpIHsNCiAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZmlyZURvY1JlYWR5LCBmYWxzZSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZihFeHQuaXNJRSl7DQogICAgICAgICAgICAgICAgdmFyIGRlZmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImllLWRlZmVycmVkLWxvYWRlciIpOw0KICAgICAgICAgICAgICAgIGlmKGRlZmVyKXsNCiAgICAgICAgICAgICAgICAgICAgZGVmZXIub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDsNCiAgICAgICAgICAgICAgICAgICAgZGVmZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkZWZlcik7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYoZG9jUmVhZHlFdmVudCl7DQogICAgICAgICAgICAgICAgZG9jUmVhZHlFdmVudC5maXJlKCk7DQogICAgICAgICAgICAgICAgZG9jUmVhZHlFdmVudC5jbGVhckxpc3RlbmVycygpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfTsNCiAgICANCiAgICB2YXIgaW5pdERvY1JlYWR5ID0gZnVuY3Rpb24oKXsNCiAgICAgICAgZG9jUmVhZHlFdmVudCA9IG5ldyBFeHQudXRpbC5FdmVudCgpOw0KICAgICAgICBpZihFeHQuaXNHZWNrbyB8fCBFeHQuaXNPcGVyYSkgew0KICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZpcmVEb2NSZWFkeSwgZmFsc2UpOw0KICAgICAgICB9ZWxzZSBpZihFeHQuaXNJRSl7DQogICAgICAgICAgICBkb2N1bWVudC53cml0ZSgiPHMiKydjcmlwdCBpZD0iaWUtZGVmZXJyZWQtbG9hZGVyIiBkZWZlcj0iZGVmZXIiIHNyYz0iLycrJy86Ij48L3MnKyJjcmlwdD4iKTsNCiAgICAgICAgICAgIHZhciBkZWZlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJpZS1kZWZlcnJlZC1sb2FkZXIiKTsNCiAgICAgICAgICAgIGRlZmVyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICAgaWYodGhpcy5yZWFkeVN0YXRlID09ICJjb21wbGV0ZSIpew0KICAgICAgICAgICAgICAgICAgICBmaXJlRG9jUmVhZHkoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9Ow0KICAgICAgICB9ZWxzZSBpZihFeHQuaXNTYWZhcmkpeyANCiAgICAgICAgICAgIGRvY1JlYWR5UHJvY0lkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICAgICB2YXIgcnMgPSBkb2N1bWVudC5yZWFkeVN0YXRlOw0KICAgICAgICAgICAgICAgIGlmKHJzID09ICJjb21wbGV0ZSIpIHsNCiAgICAgICAgICAgICAgICAgICAgZmlyZURvY1JlYWR5KCk7ICAgICANCiAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSwgMTApOw0KICAgICAgICB9DQogICAgICAgIAogICAgICAgIEUub24od2luZG93LCAibG9hZCIsIGZpcmVEb2NSZWFkeSk7DQogICAgfTsNCg0KICAgIHZhciBjcmVhdGVCdWZmZXJlZCA9IGZ1bmN0aW9uKGgsIG8pew0KICAgICAgICB2YXIgdGFzayA9IG5ldyBFeHQudXRpbC5EZWxheWVkVGFzayhoKTsNCiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGUpew0KICAgICAgICAgICAgCiAgICAgICAgICAgIGUgPSBuZXcgRXh0LkV2ZW50T2JqZWN0SW1wbChlKTsNCiAgICAgICAgICAgIHRhc2suZGVsYXkoby5idWZmZXIsIGgsIG51bGwsIFtlXSk7DQogICAgICAgIH07DQogICAgfTsNCg0KICAgIHZhciBjcmVhdGVTaW5nbGUgPSBmdW5jdGlvbihoLCBlbCwgZW5hbWUsIGZuKXsNCiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGUpew0KICAgICAgICAgICAgRXh0LkV2ZW50TWFuYWdlci5yZW1vdmVMaXN0ZW5lcihlbCwgZW5hbWUsIGZuKTsNCiAgICAgICAgICAgIGgoZSk7DQogICAgICAgIH07DQogICAgfTsNCg0KICAgIHZhciBjcmVhdGVEZWxheWVkID0gZnVuY3Rpb24oaCwgbyl7DQogICAgICAgIHJldHVybiBmdW5jdGlvbihlKXsNCiAgICAgICAgICAgIAogICAgICAgICAgICBlID0gbmV3IEV4dC5FdmVudE9iamVjdEltcGwoZSk7DQogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICAgaChlKTsNCiAgICAgICAgICAgIH0sIG8uZGVsYXkgfHwgMTApOw0KICAgICAgICB9Ow0KICAgIH07DQoNCiAgICB2YXIgbGlzdGVuID0gZnVuY3Rpb24oZWxlbWVudCwgZW5hbWUsIG9wdCwgZm4sIHNjb3BlKXsNCiAgICAgICAgdmFyIG8gPSAoIW9wdCB8fCB0eXBlb2Ygb3B0ID09ICJib29sZWFuIikgPyB7fSA6IG9wdDsNCiAgICAgICAgZm4gPSBmbiB8fCBvLmZuOyBzY29wZSA9IHNjb3BlIHx8IG8uc2NvcGU7DQogICAgICAgIHZhciBlbCA9IEV4dC5nZXREb20oZWxlbWVudCk7DQogICAgICAgIGlmKCFlbCl7DQogICAgICAgICAgICB0aHJvdyAiRXJyb3IgbGlzdGVuaW5nIGZvciBcIiIgKyBlbmFtZSArICdcIi4gRWxlbWVudCAiJyArIGVsZW1lbnQgKyAnIiBkb2VzblwndCBleGlzdC4nOw0KICAgICAgICB9DQogICAgICAgIHZhciBoID0gZnVuY3Rpb24oZSl7DQogICAgICAgICAgICBlID0gRXh0LkV2ZW50T2JqZWN0LnNldEV2ZW50KGUpOw0KICAgICAgICAgICAgdmFyIHQ7DQogICAgICAgICAgICBpZihvLmRlbGVnYXRlKXsNCiAgICAgICAgICAgICAgICB0ID0gZS5nZXRUYXJnZXQoby5kZWxlZ2F0ZSwgZWwpOw0KICAgICAgICAgICAgICAgIGlmKCF0KXsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgIHQgPSBlLnRhcmdldDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKG8uc3RvcEV2ZW50ID09PSB0cnVlKXsNCiAgICAgICAgICAgICAgICBlLnN0b3BFdmVudCgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYoby5wcmV2ZW50RGVmYXVsdCA9PT0gdHJ1ZSl7DQogICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZihvLnN0b3BQcm9wYWdhdGlvbiA9PT0gdHJ1ZSl7DQogICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYoby5ub3JtYWxpemVkID09PSBmYWxzZSl7DQogICAgICAgICAgICAgICAgZSA9IGUuYnJvd3NlckV2ZW50Ow0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBmbi5jYWxsKHNjb3BlIHx8IGVsLCBlLCB0LCBvKTsNCiAgICAgICAgfTsNCiAgICAgICAgaWYoby5kZWxheSl7DQogICAgICAgICAgICBoID0gY3JlYXRlRGVsYXllZChoLCBvKTsNCiAgICAgICAgfQ0KICAgICAgICBpZihvLnNpbmdsZSl7DQogICAgICAgICAgICBoID0gY3JlYXRlU2luZ2xlKGgsIGVsLCBlbmFtZSwgZm4pOw0KICAgICAgICB9DQogICAgICAgIGlmKG8uYnVmZmVyKXsNCiAgICAgICAgICAgIGggPSBjcmVhdGVCdWZmZXJlZChoLCBvKTsNCiAgICAgICAgfQ0KICAgICAgICBmbi5faGFuZGxlcnMgPSBmbi5faGFuZGxlcnMgfHwgW107DQogICAgICAgIGZuLl9oYW5kbGVycy5wdXNoKFtFeHQuaWQoZWwpLCBlbmFtZSwgaF0pOw0KDQogICAgICAgIEUub24oZWwsIGVuYW1lLCBoKTsNCiAgICAgICAgaWYoZW5hbWUgPT0gIm1vdXNld2hlZWwiICYmIGVsLmFkZEV2ZW50TGlzdGVuZXIpeyAKICAgICAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcigiRE9NTW91c2VTY3JvbGwiLCBoLCBmYWxzZSk7DQogICAgICAgICAgICBFLm9uKHdpbmRvdywgJ3VubG9hZCcsIGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NTW91c2VTY3JvbGwiLCBoLCBmYWxzZSk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgICAgICBpZihlbmFtZSA9PSAibW91c2Vkb3duIiAmJiBlbCA9PSBkb2N1bWVudCl7IAogICAgICAgICAgICBFeHQuRXZlbnRNYW5hZ2VyLnN0b3BwZWRNb3VzZURvd25FdmVudC5hZGRMaXN0ZW5lcihoKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gaDsNCiAgICB9Ow0KDQogICAgdmFyIHN0b3BMaXN0ZW5pbmcgPSBmdW5jdGlvbihlbCwgZW5hbWUsIGZuKXsNCiAgICAgICAgdmFyIGlkID0gRXh0LmlkKGVsKSwgaGRzID0gZm4uX2hhbmRsZXJzLCBoZCA9IGZuOw0KICAgICAgICBpZihoZHMpew0KICAgICAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gaGRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXsNCiAgICAgICAgICAgICAgICB2YXIgaCA9IGhkc1tpXTsNCiAgICAgICAgICAgICAgICBpZihoWzBdID09IGlkICYmIGhbMV0gPT0gZW5hbWUpew0KICAgICAgICAgICAgICAgICAgICBoZCA9IGhbMl07DQogICAgICAgICAgICAgICAgICAgIGhkcy5zcGxpY2UoaSwgMSk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBFLnVuKGVsLCBlbmFtZSwgaGQpOw0KICAgICAgICBlbCA9IEV4dC5nZXREb20oZWwpOw0KICAgICAgICBpZihlbmFtZSA9PSAibW91c2V3aGVlbCIgJiYgZWwuYWRkRXZlbnRMaXN0ZW5lcil7DQogICAgICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Nb3VzZVNjcm9sbCIsIGhkLCBmYWxzZSk7DQogICAgICAgIH0NCiAgICAgICAgaWYoZW5hbWUgPT0gIm1vdXNlZG93biIgJiYgZWwgPT0gZG9jdW1lbnQpeyAKICAgICAgICAgICAgRXh0LkV2ZW50TWFuYWdlci5zdG9wcGVkTW91c2VEb3duRXZlbnQucmVtb3ZlTGlzdGVuZXIoaGQpOw0KICAgICAgICB9DQogICAgfTsNCg0KICAgIHZhciBwcm9wUmUgPSAvXig/OnNjb3BlfGRlbGF5fGJ1ZmZlcnxzaW5nbGV8c3RvcEV2ZW50fHByZXZlbnREZWZhdWx0fHN0b3BQcm9wYWdhdGlvbnxub3JtYWxpemVkfGFyZ3N8ZGVsZWdhdGUpJC87DQogICAgdmFyIHB1YiA9IHsNCiAgICAgICAgDQogICAgICAgIA0KICAgICAgICB3cmFwIDogZnVuY3Rpb24oZm4sIHNjb3BlLCBvdmVycmlkZSl7DQogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZSl7DQogICAgICAgICAgICAgICAgRXh0LkV2ZW50T2JqZWN0LnNldEV2ZW50KGUpOw0KICAgICAgICAgICAgICAgIGZuLmNhbGwob3ZlcnJpZGUgPyBzY29wZSB8fCB3aW5kb3cgOiB3aW5kb3csIEV4dC5FdmVudE9iamVjdCwgc2NvcGUpOw0KICAgICAgICAgICAgfTsNCiAgICAgICAgfSwNCiAgICAgICAgDQogICAgICAgIA0KICAgICAgICBhZGRMaXN0ZW5lciA6IGZ1bmN0aW9uKGVsZW1lbnQsIGV2ZW50TmFtZSwgZm4sIHNjb3BlLCBvcHRpb25zKXsNCiAgICAgICAgICAgIGlmKHR5cGVvZiBldmVudE5hbWUgPT0gIm9iamVjdCIpew0KICAgICAgICAgICAgICAgIHZhciBvID0gZXZlbnROYW1lOw0KICAgICAgICAgICAgICAgIGZvcih2YXIgZSBpbiBvKXsNCiAgICAgICAgICAgICAgICAgICAgaWYocHJvcFJlLnRlc3QoZSkpew0KICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mIG9bZV0gPT0gImZ1bmN0aW9uIil7DQogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuKGVsZW1lbnQsIGUsIG8sIG9bZV0sIG8uc2NvcGUpOw0KICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW4oZWxlbWVudCwgZSwgb1tlXSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIGxpc3RlbihlbGVtZW50LCBldmVudE5hbWUsIG9wdGlvbnMsIGZuLCBzY29wZSk7DQogICAgICAgIH0sDQogICAgICAgIA0KICAgICAgICANCiAgICAgICAgcmVtb3ZlTGlzdGVuZXIgOiBmdW5jdGlvbihlbGVtZW50LCBldmVudE5hbWUsIGZuKXsNCiAgICAgICAgICAgIHJldHVybiBzdG9wTGlzdGVuaW5nKGVsZW1lbnQsIGV2ZW50TmFtZSwgZm4pOw0KICAgICAgICB9LA0KICAgICAgICANCiAgICAgICAgDQogICAgICAgIG9uRG9jdW1lbnRSZWFkeSA6IGZ1bmN0aW9uKGZuLCBzY29wZSwgb3B0aW9ucyl7DQogICAgICAgICAgICBpZihkb2NSZWFkeVN0YXRlKXsgCiAgICAgICAgICAgICAgICBkb2NSZWFkeUV2ZW50LmFkZExpc3RlbmVyKGZuLCBzY29wZSwgb3B0aW9ucyk7DQogICAgICAgICAgICAgICAgZG9jUmVhZHlFdmVudC5maXJlKCk7DQogICAgICAgICAgICAgICAgZG9jUmVhZHlFdmVudC5jbGVhckxpc3RlbmVycygpOw0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKCFkb2NSZWFkeUV2ZW50KXsNCiAgICAgICAgICAgICAgICBpbml0RG9jUmVhZHkoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGRvY1JlYWR5RXZlbnQuYWRkTGlzdGVuZXIoZm4sIHNjb3BlLCBvcHRpb25zKTsNCiAgICAgICAgfSwNCiAgICAgICAgDQogICAgICAgIA0KICAgICAgICBvbldpbmRvd1Jlc2l6ZSA6IGZ1bmN0aW9uKGZuLCBzY29wZSwgb3B0aW9ucyl7DQogICAgICAgICAgICBpZighcmVzaXplRXZlbnQpew0KICAgICAgICAgICAgICAgIHJlc2l6ZUV2ZW50ID0gbmV3IEV4dC51dGlsLkV2ZW50KCk7DQogICAgICAgICAgICAgICAgcmVzaXplVGFzayA9IG5ldyBFeHQudXRpbC5EZWxheWVkVGFzayhmdW5jdGlvbigpew0KICAgICAgICAgICAgICAgICAgICByZXNpemVFdmVudC5maXJlKEQuZ2V0Vmlld1dpZHRoKCksIEQuZ2V0Vmlld0hlaWdodCgpKTsNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICBFLm9uKHdpbmRvdywgInJlc2l6ZSIsIGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICAgICAgIGlmKEV4dC5pc0lFKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc2l6ZVRhc2suZGVsYXkoNTApOw0KICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc2l6ZUV2ZW50LmZpcmUoRC5nZXRWaWV3V2lkdGgoKSwgRC5nZXRWaWV3SGVpZ2h0KCkpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXNpemVFdmVudC5hZGRMaXN0ZW5lcihmbiwgc2NvcGUsIG9wdGlvbnMpOw0KICAgICAgICB9LA0KDQogICAgICAgIA0KICAgICAgICBvblRleHRSZXNpemUgOiBmdW5jdGlvbihmbiwgc2NvcGUsIG9wdGlvbnMpew0KICAgICAgICAgICAgaWYoIXRleHRFdmVudCl7DQogICAgICAgICAgICAgICAgdGV4dEV2ZW50ID0gbmV3IEV4dC51dGlsLkV2ZW50KCk7DQogICAgICAgICAgICAgICAgdmFyIHRleHRFbCA9IG5ldyBFeHQuRWxlbWVudChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSk7DQogICAgICAgICAgICAgICAgdGV4dEVsLmRvbS5jbGFzc05hbWUgPSAneC10ZXh0LXJlc2l6ZSc7DQogICAgICAgICAgICAgICAgdGV4dEVsLmRvbS5pbm5lckhUTUwgPSAnWCc7DQogICAgICAgICAgICAgICAgdGV4dEVsLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpOw0KICAgICAgICAgICAgICAgIHRleHRTaXplID0gdGV4dEVsLmRvbS5vZmZzZXRIZWlnaHQ7DQogICAgICAgICAgICAgICAgc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICAgICAgICAgaWYodGV4dEVsLmRvbS5vZmZzZXRIZWlnaHQgIT0gdGV4dFNpemUpew0KICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEV2ZW50LmZpcmUodGV4dFNpemUsIHRleHRTaXplID0gdGV4dEVsLmRvbS5vZmZzZXRIZWlnaHQpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSwgdGhpcy50ZXh0UmVzaXplSW50ZXJ2YWwpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGV4dEV2ZW50LmFkZExpc3RlbmVyKGZuLCBzY29wZSwgb3B0aW9ucyk7DQogICAgICAgIH0sDQoNCiAgICAgICAgDQogICAgICAgIHJlbW92ZVJlc2l6ZUxpc3RlbmVyIDogZnVuY3Rpb24oZm4sIHNjb3BlKXsNCiAgICAgICAgICAgIGlmKHJlc2l6ZUV2ZW50KXsNCiAgICAgICAgICAgICAgICByZXNpemVFdmVudC5yZW1vdmVMaXN0ZW5lcihmbiwgc2NvcGUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KDQogICAgICAgIAogICAgICAgIGZpcmVSZXNpemUgOiBmdW5jdGlvbigpew0KICAgICAgICAgICAgaWYocmVzaXplRXZlbnQpew0KICAgICAgICAgICAgICAgIHJlc2l6ZUV2ZW50LmZpcmUoRC5nZXRWaWV3V2lkdGgoKSwgRC5nZXRWaWV3SGVpZ2h0KCkpOw0KICAgICAgICAgICAgfSAgIA0KICAgICAgICB9LA0KICAgICAgICANCiAgICAgICAgaWVEZWZlclNyYyA6IGZhbHNlLA0KICAgICAgICANCiAgICAgICAgdGV4dFJlc2l6ZUludGVydmFsIDogNTANCiAgICB9Ow0KICAgICANCiAgICBwdWIub24gPSBwdWIuYWRkTGlzdGVuZXI7DQogICAgcHViLnVuID0gcHViLnJlbW92ZUxpc3RlbmVyOw0KDQogICAgcHViLnN0b3BwZWRNb3VzZURvd25FdmVudCA9IG5ldyBFeHQudXRpbC5FdmVudCgpOw0KICAgIHJldHVybiBwdWI7DQp9KCk7DQoNCkV4dC5vblJlYWR5ID0gRXh0LkV2ZW50TWFuYWdlci5vbkRvY3VtZW50UmVhZHk7DQoNCkV4dC5vblJlYWR5KGZ1bmN0aW9uKCl7DQogICAgdmFyIGJkID0gRXh0LmdldChkb2N1bWVudC5ib2R5KTsNCiAgICBpZighYmQpeyByZXR1cm47IH0NCg0KICAgIHZhciBjbHMgPSBbDQogICAgICAgICAgICBFeHQuaXNJRSA/ICJleHQtaWUiDQogICAgICAgICAgICA6IEV4dC5pc0dlY2tvID8gImV4dC1nZWNrbyINCiAgICAgICAgICAgIDogRXh0LmlzT3BlcmEgPyAiZXh0LW9wZXJhIg0KICAgICAgICAgICAgOiBFeHQuaXNTYWZhcmkgPyAiZXh0LXNhZmFyaSIgOiAiIl07DQoNCiAgICBpZihFeHQuaXNNYWMpew0KICAgICAgICBjbHMucHVzaCgiZXh0LW1hYyIpOw0KICAgIH0NCiAgICBpZihFeHQuaXNMaW51eCl7DQogICAgICAgIGNscy5wdXNoKCJleHQtbGludXgiKTsNCiAgICB9DQogICAgaWYoRXh0LmlzQm9yZGVyQm94KXsNCiAgICAgICAgY2xzLnB1c2goJ2V4dC1ib3JkZXItYm94Jyk7DQogICAgfQ0KICAgIGlmKEV4dC5pc1N0cmljdCl7IAogICAgICAgIHZhciBwID0gYmQuZG9tLnBhcmVudE5vZGU7DQogICAgICAgIGlmKHApew0KICAgICAgICAgICAgcC5jbGFzc05hbWUgKz0gJyBleHQtc3RyaWN0JzsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBiZC5hZGRDbGFzcyhjbHMuam9pbignICcpKTsNCn0pOw0KDQoNCkV4dC5FdmVudE9iamVjdCA9IGZ1bmN0aW9uKCl7DQogICAgDQogICAgdmFyIEUgPSBFeHQubGliLkV2ZW50Ow0KICAgIA0KICAgIAogICAgdmFyIHNhZmFyaUtleXMgPSB7DQogICAgICAgIDYzMjM0IDogMzcsIAogICAgICAgIDYzMjM1IDogMzksIAogICAgICAgIDYzMjMyIDogMzgsIAogICAgICAgIDYzMjMzIDogNDAsIAogICAgICAgIDYzMjc2IDogMzMsIAogICAgICAgIDYzMjc3IDogMzQsIAogICAgICAgIDYzMjcyIDogNDYsIAogICAgICAgIDYzMjczIDogMzYsIAogICAgICAgIDYzMjc1IDogMzUgIAogICAgfTsNCg0KICAgIAogICAgdmFyIGJ0bk1hcCA9IEV4dC5pc0lFID8gezE6MCw0OjEsMjoyfSA6DQogICAgICAgICAgICAgICAgKEV4dC5pc1NhZmFyaSA/IHsxOjAsMjoxLDM6Mn0gOiB7MDowLDE6MSwyOjJ9KTsNCg0KICAgIEV4dC5FdmVudE9iamVjdEltcGwgPSBmdW5jdGlvbihlKXsNCiAgICAgICAgaWYoZSl7DQogICAgICAgICAgICB0aGlzLnNldEV2ZW50KGUuYnJvd3NlckV2ZW50IHx8IGUpOw0KICAgICAgICB9DQogICAgfTsNCiAgICBFeHQuRXZlbnRPYmplY3RJbXBsLnByb3RvdHlwZSA9IHsNCiAgICAgICAgDQogICAgICAgIGJyb3dzZXJFdmVudCA6IG51bGwsDQogICAgICAgIA0KICAgICAgICBidXR0b24gOiAtMSwNCiAgICAgICAgDQogICAgICAgIHNoaWZ0S2V5IDogZmFsc2UsDQogICAgICAgIA0KICAgICAgICBjdHJsS2V5IDogZmFsc2UsDQogICAgICAgIA0KICAgICAgICBhbHRLZXkgOiBmYWxzZSwNCg0KICAgICAgICANCiAgICAgICAgQkFDS1NQQUNFIDogOCwNCiAgICAgICAgDQogICAgICAgIFRBQiA6IDksDQogICAgICAgIA0KICAgICAgICBSRVRVUk4gOiAxMywNCiAgICAgICAgDQogICAgICAgIEVOVEVSIDogMTMsDQogICAgICAgIA0KICAgICAgICBTSElGVCA6IDE2LA0KICAgICAgICANCiAgICAgICAgQ09OVFJPTCA6IDE3LA0KICAgICAgICANCiAgICAgICAgRVNDIDogMjcsDQogICAgICAgIA0KICAgICAgICBTUEFDRSA6IDMyLA0KICAgICAgICANCiAgICAgICAgUEFHRVVQIDogMzMsDQogICAgICAgIA0KICAgICAgICBQQUdFRE9XTiA6IDM0LA0KICAgICAgICANCiAgICAgICAgRU5EIDogMzUsDQogICAgICAgIA0KICAgICAgICBIT01FIDogMzYsDQogICAgICAgIA0KICAgICAgICBMRUZUIDogMzcsDQogICAgICAgIA0KICAgICAgICBVUCA6IDM4LA0KICAgICAgICANCiAgICAgICAgUklHSFQgOiAzOSwNCiAgICAgICAgDQogICAgICAgIERPV04gOiA0MCwNCiAgICAgICAgDQogICAgICAgIERFTEVURSA6IDQ2LA0KICAgICAgICANCiAgICAgICAgRjUgOiAxMTYsDQoNCiAgICAgICAgICAgDQogICAgICAgIHNldEV2ZW50IDogZnVuY3Rpb24oZSl7DQogICAgICAgICAgICBpZihlID09IHRoaXMgfHwgKGUgJiYgZS5icm93c2VyRXZlbnQpKXsgCiAgICAgICAgICAgICAgICByZXR1cm4gZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMuYnJvd3NlckV2ZW50ID0gZTsNCiAgICAgICAgICAgIGlmKGUpew0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdGhpcy5idXR0b24gPSBlLmJ1dHRvbiA/IGJ0bk1hcFtlLmJ1dHRvbl0gOiAoZS53aGljaCA/IGUud2hpY2gtMSA6IC0xKTsNCiAgICAgICAgICAgICAgICBpZihlLnR5cGUgPT0gJ2NsaWNrJyAmJiB0aGlzLmJ1dHRvbiA9PSAtMSl7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuYnV0dG9uID0gMDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdGhpcy50eXBlID0gZS50eXBlOw0KICAgICAgICAgICAgICAgIHRoaXMuc2hpZnRLZXkgPSBlLnNoaWZ0S2V5Ow0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdGhpcy5jdHJsS2V5ID0gZS5jdHJsS2V5IHx8IGUubWV0YUtleTsNCiAgICAgICAgICAgICAgICB0aGlzLmFsdEtleSA9IGUuYWx0S2V5Ow0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdGhpcy5rZXlDb2RlID0gZS5rZXlDb2RlOw0KICAgICAgICAgICAgICAgIHRoaXMuY2hhckNvZGUgPSBlLmNoYXJDb2RlOw0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdGhpcy50YXJnZXQgPSBFLmdldFRhcmdldChlKTsNCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHRoaXMueHkgPSBFLmdldFhZKGUpOw0KICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgdGhpcy5idXR0b24gPSAtMTsNCiAgICAgICAgICAgICAgICB0aGlzLnNoaWZ0S2V5ID0gZmFsc2U7DQogICAgICAgICAgICAgICAgdGhpcy5jdHJsS2V5ID0gZmFsc2U7DQogICAgICAgICAgICAgICAgdGhpcy5hbHRLZXkgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICB0aGlzLmtleUNvZGUgPSAwOw0KICAgICAgICAgICAgICAgIHRoaXMuY2hhckNvZGUgPTA7DQogICAgICAgICAgICAgICAgdGhpcy50YXJnZXQgPSBudWxsOw0KICAgICAgICAgICAgICAgIHRoaXMueHkgPSBbMCwgMF07DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gdGhpczsNCiAgICAgICAgfSwNCg0KICAgICAgICANCiAgICAgICAgc3RvcEV2ZW50IDogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgIGlmKHRoaXMuYnJvd3NlckV2ZW50KXsNCiAgICAgICAgICAgICAgICBpZih0aGlzLmJyb3dzZXJFdmVudC50eXBlID09ICdtb3VzZWRvd24nKXsNCiAgICAgICAgICAgICAgICAgICAgRXh0LkV2ZW50TWFuYWdlci5zdG9wcGVkTW91c2VEb3duRXZlbnQuZmlyZSh0aGlzKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgRS5zdG9wRXZlbnQodGhpcy5icm93c2VyRXZlbnQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KDQogICAgICAgIA0KICAgICAgICBwcmV2ZW50RGVmYXVsdCA6IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICBpZih0aGlzLmJyb3dzZXJFdmVudCl7DQogICAgICAgICAgICAgICAgRS5wcmV2ZW50RGVmYXVsdCh0aGlzLmJyb3dzZXJFdmVudCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0sDQoNCiAgICAgICAgDQogICAgICAgIGlzTmF2S2V5UHJlc3MgOiBmdW5jdGlvbigpew0KICAgICAgICAgICAgdmFyIGsgPSB0aGlzLmtleUNvZGU7DQogICAgICAgICAgICBrID0gRXh0LmlzU2FmYXJpID8gKHNhZmFyaUtleXNba10gfHwgaykgOiBrOw0KICAgICAgICAgICAgcmV0dXJuIChrID49IDMzICYmIGsgPD0gNDApIHx8IGsgPT0gdGhpcy5SRVRVUk4gfHwgayA9PSB0aGlzLlRBQiB8fCBrID09IHRoaXMuRVNDOw0KICAgICAgICB9LA0KDQogICAgICAgIGlzU3BlY2lhbEtleSA6IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICB2YXIgayA9IHRoaXMua2V5Q29kZTsNCiAgICAgICAgICAgIHJldHVybiAodGhpcy50eXBlID09ICdrZXlwcmVzcycgJiYgdGhpcy5jdHJsS2V5KSB8fCBrID09IDkgfHwgayA9PSAxMyAgfHwgayA9PSA0MCB8fCBrID09IDI3IHx8DQogICAgICAgICAgICAoayA9PSAxNikgfHwgKGsgPT0gMTcpIHx8DQogICAgICAgICAgICAoayA+PSAxOCAmJiBrIDw9IDIwKSB8fA0KICAgICAgICAgICAgKGsgPj0gMzMgJiYgayA8PSAzNSkgfHwNCiAgICAgICAgICAgIChrID49IDM2ICYmIGsgPD0gMzkpIHx8DQogICAgICAgICAgICAoayA+PSA0NCAmJiBrIDw9IDQ1KTsNCiAgICAgICAgfSwNCiAgICAgICAgDQogICAgICAgIHN0b3BQcm9wYWdhdGlvbiA6IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICBpZih0aGlzLmJyb3dzZXJFdmVudCl7DQogICAgICAgICAgICAgICAgaWYodGhpcy50eXBlID09ICdtb3VzZWRvd24nKXsNCiAgICAgICAgICAgICAgICAgICAgRXh0LkV2ZW50TWFuYWdlci5zdG9wcGVkTW91c2VEb3duRXZlbnQuZmlyZSh0aGlzKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgRS5zdG9wUHJvcGFnYXRpb24odGhpcy5icm93c2VyRXZlbnQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KDQogICAgICAgIA0KICAgICAgICBnZXRDaGFyQ29kZSA6IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5jaGFyQ29kZSB8fCB0aGlzLmtleUNvZGU7DQogICAgICAgIH0sDQoNCiAgICAgICAgDQogICAgICAgIGdldEtleSA6IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICB2YXIgayA9IHRoaXMua2V5Q29kZSB8fCB0aGlzLmNoYXJDb2RlOw0KICAgICAgICAgICAgcmV0dXJuIEV4dC5pc1NhZmFyaSA/IChzYWZhcmlLZXlzW2tdIHx8IGspIDogazsNCiAgICAgICAgfSwNCg0KICAgICAgICANCiAgICAgICAgZ2V0UGFnZVggOiBmdW5jdGlvbigpew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMueHlbMF07DQogICAgICAgIH0sDQoNCiAgICAgICAgDQogICAgICAgIGdldFBhZ2VZIDogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLnh5WzFdOw0KICAgICAgICB9LA0KDQogICAgICAgIA0KICAgICAgICBnZXRUaW1lIDogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgIGlmKHRoaXMuYnJvd3NlckV2ZW50KXsNCiAgICAgICAgICAgICAgICByZXR1cm4gRS5nZXRUaW1lKHRoaXMuYnJvd3NlckV2ZW50KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICB9LA0KDQogICAgICAgIA0KICAgICAgICBnZXRYWSA6IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICByZXR1cm4gdGhpcy54eTsNCiAgICAgICAgfSwNCg0KICAgICAgICANCiAgICAgICAgZ2V0VGFyZ2V0IDogZnVuY3Rpb24oc2VsZWN0b3IsIG1heERlcHRoLCByZXR1cm5FbCl7DQogICAgICAgICAgICByZXR1cm4gc2VsZWN0b3IgPyBFeHQuZmx5KHRoaXMudGFyZ2V0KS5maW5kUGFyZW50KHNlbGVjdG9yLCBtYXhEZXB0aCwgcmV0dXJuRWwpIDogdGhpcy50YXJnZXQ7DQogICAgICAgIH0sDQogICAgICAgIA0KICAgICAgICBnZXRSZWxhdGVkVGFyZ2V0IDogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgIGlmKHRoaXMuYnJvd3NlckV2ZW50KXsNCiAgICAgICAgICAgICAgICByZXR1cm4gRS5nZXRSZWxhdGVkVGFyZ2V0KHRoaXMuYnJvd3NlckV2ZW50KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICB9LA0KDQogICAgICAgIA0KICAgICAgICBnZXRXaGVlbERlbHRhIDogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgIHZhciBlID0gdGhpcy5icm93c2VyRXZlbnQ7DQogICAgICAgICAgICB2YXIgZGVsdGEgPSAwOw0KICAgICAgICAgICAgaWYoZS53aGVlbERlbHRhKXsgDQogICAgICAgICAgICAgICAgZGVsdGEgPSBlLndoZWVsRGVsdGEvMTIwOw0KICAgICAgICAgICAgfWVsc2UgaWYoZS5kZXRhaWwpeyANCiAgICAgICAgICAgICAgICBkZWx0YSA9IC1lLmRldGFpbC8zOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIGRlbHRhOw0KICAgICAgICB9LA0KDQogICAgICAgIA0KICAgICAgICBoYXNNb2RpZmllciA6IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICByZXR1cm4gISEoKHRoaXMuY3RybEtleSB8fCB0aGlzLmFsdEtleSkgfHwgdGhpcy5zaGlmdEtleSk7DQogICAgICAgIH0sDQoNCiAgICAgICAgDQogICAgICAgIHdpdGhpbiA6IGZ1bmN0aW9uKGVsLCByZWxhdGVkKXsNCiAgICAgICAgICAgIHZhciB0ID0gdGhpc1tyZWxhdGVkID8gImdldFJlbGF0ZWRUYXJnZXQiIDogImdldFRhcmdldCJdKCk7DQogICAgICAgICAgICByZXR1cm4gdCAmJiBFeHQuZmx5KGVsKS5jb250YWlucyh0KTsNCiAgICAgICAgfSwNCg0KICAgICAgICBnZXRQb2ludCA6IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICByZXR1cm4gbmV3IEV4dC5saWIuUG9pbnQodGhpcy54eVswXSwgdGhpcy54eVsxXSk7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgcmV0dXJuIG5ldyBFeHQuRXZlbnRPYmplY3RJbXBsKCk7DQp9KCk7DQogICAgICAgICAgICANCiAgICAKDQooZnVuY3Rpb24oKXsNCnZhciBEID0gRXh0LmxpYi5Eb207DQp2YXIgRSA9IEV4dC5saWIuRXZlbnQ7DQp2YXIgQSA9IEV4dC5saWIuQW5pbTsNCg0KCnZhciBwcm9wQ2FjaGUgPSB7fTsNCnZhciBjYW1lbFJlID0gLygtW2Etel0pL2dpOw0KdmFyIGNhbWVsRm4gPSBmdW5jdGlvbihtLCBhKXsgcmV0dXJuIGEuY2hhckF0KDEpLnRvVXBwZXJDYXNlKCk7IH07DQp2YXIgdmlldyA9IGRvY3VtZW50LmRlZmF1bHRWaWV3Ow0KDQpFeHQuRWxlbWVudCA9IGZ1bmN0aW9uKGVsZW1lbnQsIGZvcmNlTmV3KXsNCiAgICB2YXIgZG9tID0gdHlwZW9mIGVsZW1lbnQgPT0gInN0cmluZyIgPw0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudCkgOiBlbGVtZW50Ow0KICAgIGlmKCFkb20peyAKICAgICAgICByZXR1cm4gbnVsbDsNCiAgICB9DQogICAgdmFyIGlkID0gZG9tLmlkOw0KICAgIGlmKGZvcmNlTmV3ICE9PSB0cnVlICYmIGlkICYmIEV4dC5FbGVtZW50LmNhY2hlW2lkXSl7IAogICAgICAgIHJldHVybiBFeHQuRWxlbWVudC5jYWNoZVtpZF07DQogICAgfQ0KDQogICAgDQogICAgdGhpcy5kb20gPSBkb207DQoNCiAgICANCiAgICB0aGlzLmlkID0gaWQgfHwgRXh0LmlkKGRvbSk7DQp9Ow0KDQp2YXIgRWwgPSBFeHQuRWxlbWVudDsNCg0KRWwucHJvdG90eXBlID0gew0KICAgIA0KICAgIG9yaWdpbmFsRGlzcGxheSA6ICIiLA0KDQogICAgdmlzaWJpbGl0eU1vZGUgOiAxLA0KICAgIA0KICAgIGRlZmF1bHRVbml0IDogInB4IiwNCiAgICANCiAgICBzZXRWaXNpYmlsaXR5TW9kZSA6IGZ1bmN0aW9uKHZpc01vZGUpew0KICAgICAgICB0aGlzLnZpc2liaWxpdHlNb2RlID0gdmlzTW9kZTsNCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSwNCiAgICANCiAgICBlbmFibGVEaXNwbGF5TW9kZSA6IGZ1bmN0aW9uKGRpc3BsYXkpew0KICAgICAgICB0aGlzLnNldFZpc2liaWxpdHlNb2RlKEVsLkRJU1BMQVkpOw0KICAgICAgICBpZih0eXBlb2YgZGlzcGxheSAhPSAidW5kZWZpbmVkIikgdGhpcy5vcmlnaW5hbERpc3BsYXkgPSBkaXNwbGF5Ow0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9LA0KDQogICAgDQogICAgZmluZFBhcmVudCA6IGZ1bmN0aW9uKHNpbXBsZVNlbGVjdG9yLCBtYXhEZXB0aCwgcmV0dXJuRWwpew0KICAgICAgICB2YXIgcCA9IHRoaXMuZG9tLCBiID0gZG9jdW1lbnQuYm9keSwgZGVwdGggPSAwLCBkcSA9IEV4dC5Eb21RdWVyeSwgc3RvcEVsOw0KICAgICAgICBtYXhEZXB0aCA9IG1heERlcHRoIHx8IDUwOw0KICAgICAgICBpZih0eXBlb2YgbWF4RGVwdGggIT0gIm51bWJlciIpew0KICAgICAgICAgICAgc3RvcEVsID0gRXh0LmdldERvbShtYXhEZXB0aCk7DQogICAgICAgICAgICBtYXhEZXB0aCA9IDEwOw0KICAgICAgICB9DQogICAgICAgIHdoaWxlKHAgJiYgcC5ub2RlVHlwZSA9PSAxICYmIGRlcHRoIDwgbWF4RGVwdGggJiYgcCAhPSBiICYmIHAgIT0gc3RvcEVsKXsNCiAgICAgICAgICAgIGlmKGRxLmlzKHAsIHNpbXBsZVNlbGVjdG9yKSl7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJldHVybkVsID8gRXh0LmdldChwKSA6IHA7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBkZXB0aCsrOw0KICAgICAgICAgICAgcCA9IHAucGFyZW50Tm9kZTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICB9LA0KDQoNCiAgICANCiAgICBmaW5kUGFyZW50Tm9kZSA6IGZ1bmN0aW9uKHNpbXBsZVNlbGVjdG9yLCBtYXhEZXB0aCwgcmV0dXJuRWwpew0KICAgICAgICB2YXIgcCA9IEV4dC5mbHkodGhpcy5kb20ucGFyZW50Tm9kZSwgJ19pbnRlcm5hbCcpOw0KICAgICAgICByZXR1cm4gcCA/IHAuZmluZFBhcmVudChzaW1wbGVTZWxlY3RvciwgbWF4RGVwdGgsIHJldHVybkVsKSA6IG51bGw7DQogICAgfSwNCg0KICAgIA0KICAgIHVwIDogZnVuY3Rpb24oc2ltcGxlU2VsZWN0b3IsIG1heERlcHRoKXsNCiAgICAgICAgcmV0dXJuIHRoaXMuZmluZFBhcmVudE5vZGUoc2ltcGxlU2VsZWN0b3IsIG1heERlcHRoLCB0cnVlKTsNCiAgICB9LA0KDQoNCg0KICAgIA0KICAgIGlzIDogZnVuY3Rpb24oc2ltcGxlU2VsZWN0b3Ipew0KICAgICAgICByZXR1cm4gRXh0LkRvbVF1ZXJ5LmlzKHRoaXMuZG9tLCBzaW1wbGVTZWxlY3Rvcik7DQogICAgfSwNCg0KICAgIA0KICAgIGFuaW1hdGUgOiBmdW5jdGlvbihhcmdzLCBkdXJhdGlvbiwgb25Db21wbGV0ZSwgZWFzaW5nLCBhbmltVHlwZSl7DQogICAgICAgIHRoaXMuYW5pbShhcmdzLCB7ZHVyYXRpb246IGR1cmF0aW9uLCBjYWxsYmFjazogb25Db21wbGV0ZSwgZWFzaW5nOiBlYXNpbmd9LCBhbmltVHlwZSk7DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0sDQoNCiAgICANCiAgICBhbmltIDogZnVuY3Rpb24oYXJncywgb3B0LCBhbmltVHlwZSwgZGVmYXVsdER1ciwgZGVmYXVsdEVhc2UsIGNiKXsNCiAgICAgICAgYW5pbVR5cGUgPSBhbmltVHlwZSB8fCAncnVuJzsNCiAgICAgICAgb3B0ID0gb3B0IHx8IHt9Ow0KICAgICAgICB2YXIgYW5pbSA9IEV4dC5saWIuQW5pbVthbmltVHlwZV0oDQogICAgICAgICAgICB0aGlzLmRvbSwgYXJncywNCiAgICAgICAgICAgIChvcHQuZHVyYXRpb24gfHwgZGVmYXVsdER1cikgfHwgLjM1LA0KICAgICAgICAgICAgKG9wdC5lYXNpbmcgfHwgZGVmYXVsdEVhc2UpIHx8ICdlYXNlT3V0JywNCiAgICAgICAgICAgIGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICAgRXh0LmNhbGxiYWNrKGNiLCB0aGlzKTsNCiAgICAgICAgICAgICAgICBFeHQuY2FsbGJhY2sob3B0LmNhbGxiYWNrLCBvcHQuc2NvcGUgfHwgdGhpcywgW3RoaXMsIG9wdF0pOw0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHRoaXMNCiAgICAgICAgKTsNCiAgICAgICAgb3B0LmFuaW0gPSBhbmltOw0KICAgICAgICByZXR1cm4gYW5pbTsNCiAgICB9LA0KDQogICAgCiAgICBwcmVhbmltIDogZnVuY3Rpb24oYSwgaSl7DQogICAgICAgIHJldHVybiAhYVtpXSA/IGZhbHNlIDogKHR5cGVvZiBhW2ldID09ICJvYmplY3QiID8gYVtpXToge2R1cmF0aW9uOiBhW2krMV0sIGNhbGxiYWNrOiBhW2krMl0sIGVhc2luZzogYVtpKzNdfSk7DQogICAgfSwNCg0KICAgIA0KICAgIGNsZWFuIDogZnVuY3Rpb24oZm9yY2VSZWNsZWFuKXsNCiAgICAgICAgaWYodGhpcy5pc0NsZWFuZWQgJiYgZm9yY2VSZWNsZWFuICE9PSB0cnVlKXsNCiAgICAgICAgICAgIHJldHVybiB0aGlzOw0KICAgICAgICB9DQogICAgICAgIHZhciBucyA9IC9cUy87DQogICAgICAgIHZhciBkID0gdGhpcy5kb20sIG4gPSBkLmZpcnN0Q2hpbGQsIG5pID0gLTE7DQogCSAgICB3aGlsZShuKXsNCiAJICAgICAgICB2YXIgbnggPSBuLm5leHRTaWJsaW5nOw0KIAkgICAgICAgIGlmKG4ubm9kZVR5cGUgPT0gMyAmJiAhbnMudGVzdChuLm5vZGVWYWx1ZSkpew0KIAkgICAgICAgICAgICBkLnJlbW92ZUNoaWxkKG4pOw0KIAkgICAgICAgIH1lbHNlew0KIAkgICAgICAgICAgICBuLm5vZGVJbmRleCA9ICsrbmk7DQogCSAgICAgICAgfQ0KIAkgICAgICAgIG4gPSBueDsNCiAJICAgIH0NCiAJICAgIHRoaXMuaXNDbGVhbmVkID0gdHJ1ZTsNCiAJICAgIHJldHVybiB0aGlzOw0KIAl9LA0KDQogICAgCiAgICBjYWxjT2Zmc2V0c1RvIDogZnVuY3Rpb24oZWwpew0KICAgICAgICBlbCA9IEV4dC5nZXQoZWwpOw0KICAgICAgICB2YXIgZCA9IGVsLmRvbTsNCiAgICAgICAgdmFyIHJlc3RvcmVQb3MgPSBmYWxzZTsNCiAgICAgICAgaWYoZWwuZ2V0U3R5bGUoJ3Bvc2l0aW9uJykgPT0gJ3N0YXRpYycpew0KICAgICAgICAgICAgZWwucG9zaXRpb24oJ3JlbGF0aXZlJyk7DQogICAgICAgICAgICByZXN0b3JlUG9zID0gdHJ1ZTsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgeCA9IDAsIHkgPTA7DQogICAgICAgIHZhciBvcCA9IHRoaXMuZG9tOw0KICAgICAgICB3aGlsZShvcCAmJiBvcCAhPSBkICYmIG9wLnRhZ05hbWUgIT0gJ0hUTUwnKXsNCiAgICAgICAgICAgIHgrPSBvcC5vZmZzZXRMZWZ0Ow0KICAgICAgICAgICAgeSs9IG9wLm9mZnNldFRvcDsNCiAgICAgICAgICAgIG9wID0gb3Aub2Zmc2V0UGFyZW50Ow0KICAgICAgICB9DQogICAgICAgIGlmKHJlc3RvcmVQb3Mpew0KICAgICAgICAgICAgZWwucG9zaXRpb24oJ3N0YXRpYycpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBbeCwgeV07DQogICAgfSwNCg0KICAgIA0KICAgIHNjcm9sbEludG9WaWV3IDogZnVuY3Rpb24oY29udGFpbmVyLCBoc2Nyb2xsKXsNCiAgICAgICAgdmFyIGMgPSBFeHQuZ2V0RG9tKGNvbnRhaW5lcikgfHwgZG9jdW1lbnQuYm9keTsNCiAgICAgICAgdmFyIGVsID0gdGhpcy5kb207DQoNCiAgICAgICAgdmFyIG8gPSB0aGlzLmNhbGNPZmZzZXRzVG8oYyksDQogICAgICAgICAgICBsID0gb1swXSwNCiAgICAgICAgICAgIHQgPSBvWzFdLA0KICAgICAgICAgICAgYiA9IHQrZWwub2Zmc2V0SGVpZ2h0LA0KICAgICAgICAgICAgciA9IGwrZWwub2Zmc2V0V2lkdGg7DQoNCiAgICAgICAgdmFyIGNoID0gYy5jbGllbnRIZWlnaHQ7DQogICAgICAgIHZhciBjdCA9IHBhcnNlSW50KGMuc2Nyb2xsVG9wLCAxMCk7DQogICAgICAgIHZhciBjbCA9IHBhcnNlSW50KGMuc2Nyb2xsTGVmdCwgMTApOw0KICAgICAgICB2YXIgY2IgPSBjdCArIGNoOw0KICAgICAgICB2YXIgY3IgPSBjbCArIGMuY2xpZW50V2lkdGg7DQoNCiAgICAgICAgaWYodCA8IGN0KXsNCiAgICAgICAgCWMuc2Nyb2xsVG9wID0gdDsNCiAgICAgICAgfWVsc2UgaWYoYiA+IGNiKXsNCiAgICAgICAgICAgIGMuc2Nyb2xsVG9wID0gYi1jaDsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmKGhzY3JvbGwgIT09IGZhbHNlKXsNCiAgICAgICAgICAgIGlmKGwgPCBjbCl7DQogICAgICAgICAgICAgICAgYy5zY3JvbGxMZWZ0ID0gbDsNCiAgICAgICAgICAgIH1lbHNlIGlmKHIgPiBjcil7DQogICAgICAgICAgICAgICAgYy5zY3JvbGxMZWZ0ID0gci1jLmNsaWVudFdpZHRoOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0sDQoNCiAgICAKICAgIHNjcm9sbENoaWxkSW50b1ZpZXcgOiBmdW5jdGlvbihjaGlsZCwgaHNjcm9sbCl7DQogICAgICAgIEV4dC5mbHkoY2hpbGQsICdfc2Nyb2xsQ2hpbGRJbnRvVmlldycpLnNjcm9sbEludG9WaWV3KHRoaXMsIGhzY3JvbGwpOw0KICAgIH0sDQoNCiAgICANCiAgICBhdXRvSGVpZ2h0IDogZnVuY3Rpb24oYW5pbWF0ZSwgZHVyYXRpb24sIG9uQ29tcGxldGUsIGVhc2luZyl7DQogICAgICAgIHZhciBvbGRIZWlnaHQgPSB0aGlzLmdldEhlaWdodCgpOw0KICAgICAgICB0aGlzLmNsaXAoKTsNCiAgICAgICAgdGhpcy5zZXRIZWlnaHQoMSk7IAogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsNCiAgICAgICAgICAgIHZhciBoZWlnaHQgPSBwYXJzZUludCh0aGlzLmRvbS5zY3JvbGxIZWlnaHQsIDEwKTsgCiAgICAgICAgICAgIGlmKCFhbmltYXRlKXsNCiAgICAgICAgICAgICAgICB0aGlzLnNldEhlaWdodChoZWlnaHQpOw0KICAgICAgICAgICAgICAgIHRoaXMudW5jbGlwKCk7DQogICAgICAgICAgICAgICAgaWYodHlwZW9mIG9uQ29tcGxldGUgPT0gImZ1bmN0aW9uIil7DQogICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICB0aGlzLnNldEhlaWdodChvbGRIZWlnaHQpOyAKICAgICAgICAgICAgICAgIHRoaXMuc2V0SGVpZ2h0KGhlaWdodCwgYW5pbWF0ZSwgZHVyYXRpb24sIGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICAgICAgIHRoaXMudW5jbGlwKCk7DQogICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBvbkNvbXBsZXRlID09ICJmdW5jdGlvbiIpIG9uQ29tcGxldGUoKTsNCiAgICAgICAgICAgICAgICB9LmNyZWF0ZURlbGVnYXRlKHRoaXMpLCBlYXNpbmcpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9LmNyZWF0ZURlbGVnYXRlKHRoaXMpLCAwKTsNCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSwNCg0KICAgIA0KICAgIGNvbnRhaW5zIDogZnVuY3Rpb24oZWwpew0KICAgICAgICBpZighZWwpe3JldHVybiBmYWxzZTt9DQogICAgICAgIHJldHVybiBELmlzQW5jZXN0b3IodGhpcy5kb20sIGVsLmRvbSA/IGVsLmRvbSA6IGVsKTsNCiAgICB9LA0KDQogICAgDQogICAgaXNWaXNpYmxlIDogZnVuY3Rpb24oZGVlcCkgew0KICAgICAgICB2YXIgdmlzID0gISh0aGlzLmdldFN0eWxlKCJ2aXNpYmlsaXR5IikgPT0gImhpZGRlbiIgfHwgdGhpcy5nZXRTdHlsZSgiZGlzcGxheSIpID09ICJub25lIik7DQogICAgICAgIGlmKGRlZXAgIT09IHRydWUgfHwgIXZpcyl7DQogICAgICAgICAgICByZXR1cm4gdmlzOw0KICAgICAgICB9DQogICAgICAgIHZhciBwID0gdGhpcy5kb20ucGFyZW50Tm9kZTsNCiAgICAgICAgd2hpbGUocCAmJiBwLnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPSAiYm9keSIpew0KICAgICAgICAgICAgaWYoIUV4dC5mbHkocCwgJ19pc1Zpc2libGUnKS5pc1Zpc2libGUoKSl7DQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcCA9IHAucGFyZW50Tm9kZTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9LA0KDQogICAgDQogICAgc2VsZWN0IDogZnVuY3Rpb24oc2VsZWN0b3IsIHVuaXF1ZSl7DQogICAgICAgIHJldHVybiBFbC5zZWxlY3Qoc2VsZWN0b3IsIHVuaXF1ZSwgdGhpcy5kb20pOw0KICAgIH0sDQoNCiAgICANCiAgICBxdWVyeSA6IGZ1bmN0aW9uKHNlbGVjdG9yLCB1bmlxdWUpew0KICAgICAgICByZXR1cm4gRXh0LkRvbVF1ZXJ5LnNlbGVjdChzZWxlY3RvciwgdGhpcy5kb20pOw0KICAgIH0sDQoNCiAgICANCiAgICBjaGlsZCA6IGZ1bmN0aW9uKHNlbGVjdG9yLCByZXR1cm5Eb20pew0KICAgICAgICB2YXIgbiA9IEV4dC5Eb21RdWVyeS5zZWxlY3ROb2RlKHNlbGVjdG9yLCB0aGlzLmRvbSk7DQogICAgICAgIHJldHVybiByZXR1cm5Eb20gPyBuIDogRXh0LmdldChuKTsNCiAgICB9LA0KDQogICAgDQogICAgZG93biA6IGZ1bmN0aW9uKHNlbGVjdG9yLCByZXR1cm5Eb20pew0KICAgICAgICB2YXIgbiA9IEV4dC5Eb21RdWVyeS5zZWxlY3ROb2RlKCIgPiAiICsgc2VsZWN0b3IsIHRoaXMuZG9tKTsNCiAgICAgICAgcmV0dXJuIHJldHVybkRvbSA/IG4gOiBFeHQuZ2V0KG4pOw0KICAgIH0sDQoNCiAgICANCiAgICBpbml0REQgOiBmdW5jdGlvbihncm91cCwgY29uZmlnLCBvdmVycmlkZXMpew0KICAgICAgICB2YXIgZGQgPSBuZXcgRXh0LmRkLkREKEV4dC5pZCh0aGlzLmRvbSksIGdyb3VwLCBjb25maWcpOw0KICAgICAgICByZXR1cm4gRXh0LmFwcGx5KGRkLCBvdmVycmlkZXMpOw0KICAgIH0sDQoNCiAgICANCiAgICBpbml0RERQcm94eSA6IGZ1bmN0aW9uKGdyb3VwLCBjb25maWcsIG92ZXJyaWRlcyl7DQogICAgICAgIHZhciBkZCA9IG5ldyBFeHQuZGQuRERQcm94eShFeHQuaWQodGhpcy5kb20pLCBncm91cCwgY29uZmlnKTsNCiAgICAgICAgcmV0dXJuIEV4dC5hcHBseShkZCwgb3ZlcnJpZGVzKTsNCiAgICB9LA0KDQogICAgDQogICAgaW5pdEREVGFyZ2V0IDogZnVuY3Rpb24oZ3JvdXAsIGNvbmZpZywgb3ZlcnJpZGVzKXsNCiAgICAgICAgdmFyIGRkID0gbmV3IEV4dC5kZC5ERFRhcmdldChFeHQuaWQodGhpcy5kb20pLCBncm91cCwgY29uZmlnKTsNCiAgICAgICAgcmV0dXJuIEV4dC5hcHBseShkZCwgb3ZlcnJpZGVzKTsNCiAgICB9LA0KDQogICAgDQogICAgIHNldFZpc2libGUgOiBmdW5jdGlvbih2aXNpYmxlLCBhbmltYXRlKXsNCiAgICAgICAgaWYoIWFuaW1hdGUgfHwgIUEpew0KICAgICAgICAgICAgaWYodGhpcy52aXNpYmlsaXR5TW9kZSA9PSBFbC5ESVNQTEFZKXsNCiAgICAgICAgICAgICAgICB0aGlzLnNldERpc3BsYXllZCh2aXNpYmxlKTsNCiAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgIHRoaXMuZml4RGlzcGxheSgpOw0KICAgICAgICAgICAgICAgIHRoaXMuZG9tLnN0eWxlLnZpc2liaWxpdHkgPSB2aXNpYmxlID8gInZpc2libGUiIDogImhpZGRlbiI7DQogICAgICAgICAgICB9DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBkb20gPSB0aGlzLmRvbTsNCiAgICAgICAgICAgIHZhciB2aXNNb2RlID0gdGhpcy52aXNpYmlsaXR5TW9kZTsNCiAgICAgICAgICAgIGlmKHZpc2libGUpew0KICAgICAgICAgICAgICAgIHRoaXMuc2V0T3BhY2l0eSguMDEpOw0KICAgICAgICAgICAgICAgIHRoaXMuc2V0VmlzaWJsZSh0cnVlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMuYW5pbSh7b3BhY2l0eTogeyB0bzogKHZpc2libGU/MTowKSB9fSwNCiAgICAgICAgICAgICAgICAgIHRoaXMucHJlYW5pbShhcmd1bWVudHMsIDEpLA0KICAgICAgICAgICAgICAgICAgbnVsbCwgLjM1LCAnZWFzZUluJywgZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICAgICAgICAgIGlmKCF2aXNpYmxlKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICBpZih2aXNNb2RlID09IEVsLkRJU1BMQVkpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb20uc3R5bGUuZGlzcGxheSA9ICJub25lIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tLnN0eWxlLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgRXh0LmdldChkb20pLnNldE9wYWNpdHkoMSk7DQogICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0sDQoNCiAgICANCiAgICBpc0Rpc3BsYXllZCA6IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gdGhpcy5nZXRTdHlsZSgiZGlzcGxheSIpICE9ICJub25lIjsNCiAgICB9LA0KDQogICAgDQogICAgdG9nZ2xlIDogZnVuY3Rpb24oYW5pbWF0ZSl7DQogICAgICAgIHRoaXMuc2V0VmlzaWJsZSghdGhpcy5pc1Zpc2libGUoKSwgdGhpcy5wcmVhbmltKGFyZ3VtZW50cywgMCkpOw0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9LA0KDQogICAgDQogICAgc2V0RGlzcGxheWVkIDogZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgaWYodHlwZW9mIHZhbHVlID09ICJib29sZWFuIil7DQogICAgICAgICAgIHZhbHVlID0gdmFsdWUgPyB0aGlzLm9yaWdpbmFsRGlzcGxheSA6ICJub25lIjsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLnNldFN0eWxlKCJkaXNwbGF5IiwgdmFsdWUpOw0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9LA0KDQogICAgDQogICAgZm9jdXMgOiBmdW5jdGlvbigpIHsNCiAgICAgICAgdHJ5ew0KICAgICAgICAgICAgdGhpcy5kb20uZm9jdXMoKTsNCiAgICAgICAgfWNhdGNoKGUpe30NCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSwNCg0KICAgIA0KICAgIGJsdXIgOiBmdW5jdGlvbigpIHsNCiAgICAgICAgdHJ5ew0KICAgICAgICAgICAgdGhpcy5kb20uYmx1cigpOw0KICAgICAgICB9Y2F0Y2goZSl7fQ0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9LA0KDQogICAgDQogICAgYWRkQ2xhc3MgOiBmdW5jdGlvbihjbGFzc05hbWUpew0KICAgICAgICBpZihjbGFzc05hbWUgaW5zdGFuY2VvZiBBcnJheSl7DQogICAgICAgICAgICBmb3IodmFyIGkgPSAwLCBsZW4gPSBjbGFzc05hbWUubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsNCiAgICAgICAgICAgIAl0aGlzLmFkZENsYXNzKGNsYXNzTmFtZVtpXSk7DQogICAgICAgICAgICB9DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgaWYoY2xhc3NOYW1lICYmICF0aGlzLmhhc0NsYXNzKGNsYXNzTmFtZSkpew0KICAgICAgICAgICAgICAgIHRoaXMuZG9tLmNsYXNzTmFtZSA9IHRoaXMuZG9tLmNsYXNzTmFtZSArICIgIiArIGNsYXNzTmFtZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9LA0KDQogICAgDQogICAgcmFkaW9DbGFzcyA6IGZ1bmN0aW9uKGNsYXNzTmFtZSl7DQogICAgICAgIHZhciBzaWJsaW5ncyA9IHRoaXMuZG9tLnBhcmVudE5vZGUuY2hpbGROb2RlczsNCiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHNpYmxpbmdzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgIAl2YXIgcyA9IHNpYmxpbmdzW2ldOw0KICAgICAgICAJaWYocy5ub2RlVHlwZSA9PSAxKXsNCiAgICAgICAgCSAgICBFeHQuZ2V0KHMpLnJlbW92ZUNsYXNzKGNsYXNzTmFtZSk7DQogICAgICAgIAl9DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5hZGRDbGFzcyhjbGFzc05hbWUpOw0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9LA0KDQogICAgDQogICAgcmVtb3ZlQ2xhc3MgOiBmdW5jdGlvbihjbGFzc05hbWUpew0KICAgICAgICBpZighY2xhc3NOYW1lIHx8ICF0aGlzLmRvbS5jbGFzc05hbWUpew0KICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgICAgIH0NCiAgICAgICAgaWYoY2xhc3NOYW1lIGluc3RhbmNlb2YgQXJyYXkpew0KICAgICAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gY2xhc3NOYW1lLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7DQogICAgICAgICAgICAJdGhpcy5yZW1vdmVDbGFzcyhjbGFzc05hbWVbaV0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIGlmKHRoaXMuaGFzQ2xhc3MoY2xhc3NOYW1lKSl7DQogICAgICAgICAgICAgICAgdmFyIHJlID0gdGhpcy5jbGFzc1JlQ2FjaGVbY2xhc3NOYW1lXTsNCiAgICAgICAgICAgICAgICBpZiAoIXJlKSB7DQogICAgICAgICAgICAgICAgICAgcmUgPSBuZXcgUmVnRXhwKCcoPzpefFxccyspJyArIGNsYXNzTmFtZSArICcoPzpcXHMrfCQpJywgImciKTsNCiAgICAgICAgICAgICAgICAgICB0aGlzLmNsYXNzUmVDYWNoZVtjbGFzc05hbWVdID0gcmU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHRoaXMuZG9tLmNsYXNzTmFtZSA9DQogICAgICAgICAgICAgICAgICAgIHRoaXMuZG9tLmNsYXNzTmFtZS5yZXBsYWNlKHJlLCAiICIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0sDQoNCiAgICAKICAgIGNsYXNzUmVDYWNoZToge30sDQoNCiAgICANCiAgICB0b2dnbGVDbGFzcyA6IGZ1bmN0aW9uKGNsYXNzTmFtZSl7DQogICAgICAgIGlmKHRoaXMuaGFzQ2xhc3MoY2xhc3NOYW1lKSl7DQogICAgICAgICAgICB0aGlzLnJlbW92ZUNsYXNzKGNsYXNzTmFtZSk7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgdGhpcy5hZGRDbGFzcyhjbGFzc05hbWUpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0sDQoNCiAgICANCiAgICBoYXNDbGFzcyA6IGZ1bmN0aW9uKGNsYXNzTmFtZSl7DQogICAgICAgIHJldHVybiBjbGFzc05hbWUgJiYgKCcgJyt0aGlzLmRvbS5jbGFzc05hbWUrJyAnKS5pbmRleE9mKCcgJytjbGFzc05hbWUrJyAnKSAhPSAtMTsNCiAgICB9LA0KDQogICAgDQogICAgcmVwbGFjZUNsYXNzIDogZnVuY3Rpb24ob2xkQ2xhc3NOYW1lLCBuZXdDbGFzc05hbWUpew0KICAgICAgICB0aGlzLnJlbW92ZUNsYXNzKG9sZENsYXNzTmFtZSk7DQogICAgICAgIHRoaXMuYWRkQ2xhc3MobmV3Q2xhc3NOYW1lKTsNCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSwNCg0KICAgIA0KICAgIGdldFN0eWxlcyA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHZhciBhID0gYXJndW1lbnRzLCBsZW4gPSBhLmxlbmd0aCwgciA9IHt9Ow0KICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspew0KICAgICAgICAgICAgclthW2ldXSA9IHRoaXMuZ2V0U3R5bGUoYVtpXSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHI7DQogICAgfSwNCg0KICAgIA0KICAgIGdldFN0eWxlIDogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIHZpZXcgJiYgdmlldy5nZXRDb21wdXRlZFN0eWxlID8NCiAgICAgICAgICAgIGZ1bmN0aW9uKHByb3Apew0KICAgICAgICAgICAgICAgIHZhciBlbCA9IHRoaXMuZG9tLCB2LCBjcywgY2FtZWw7DQogICAgICAgICAgICAgICAgaWYocHJvcCA9PSAnZmxvYXQnKXsNCiAgICAgICAgICAgICAgICAgICAgcHJvcCA9ICJjc3NGbG9hdCI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmKHYgPSBlbC5zdHlsZVtwcm9wXSl7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB2Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZihjcyA9IHZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbCwgIiIpKXsNCiAgICAgICAgICAgICAgICAgICAgaWYoIShjYW1lbCA9IHByb3BDYWNoZVtwcm9wXSkpew0KICAgICAgICAgICAgICAgICAgICAgICAgY2FtZWwgPSBwcm9wQ2FjaGVbcHJvcF0gPSBwcm9wLnJlcGxhY2UoY2FtZWxSZSwgY2FtZWxGbik7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNzW2NhbWVsXTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgICAgICB9IDoNCiAgICAgICAgICAgIGZ1bmN0aW9uKHByb3Apew0KICAgICAgICAgICAgICAgIHZhciBlbCA9IHRoaXMuZG9tLCB2LCBjcywgY2FtZWw7DQogICAgICAgICAgICAgICAgaWYocHJvcCA9PSAnb3BhY2l0eScpew0KICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YgZWwuc3R5bGUuZmlsdGVyID09ICdzdHJpbmcnKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtID0gZWwuc3R5bGUuZmlsdGVyLm1hdGNoKC9hbHBoYVwob3BhY2l0eT0oLiopXCkvaSk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZihtKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZnYgPSBwYXJzZUZsb2F0KG1bMV0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFpc05hTihmdikpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnYgPyBmdiAvIDEwMCA6IDA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAxOw0KICAgICAgICAgICAgICAgIH1lbHNlIGlmKHByb3AgPT0gJ2Zsb2F0Jyl7DQogICAgICAgICAgICAgICAgICAgIHByb3AgPSAic3R5bGVGbG9hdCI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmKCEoY2FtZWwgPSBwcm9wQ2FjaGVbcHJvcF0pKXsNCiAgICAgICAgICAgICAgICAgICAgY2FtZWwgPSBwcm9wQ2FjaGVbcHJvcF0gPSBwcm9wLnJlcGxhY2UoY2FtZWxSZSwgY2FtZWxGbik7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmKHYgPSBlbC5zdHlsZVtjYW1lbF0pew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYoY3MgPSBlbC5jdXJyZW50U3R5bGUpew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3NbY2FtZWxdOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgIH07DQogICAgfSgpLA0KDQogICAgDQogICAgc2V0U3R5bGUgOiBmdW5jdGlvbihwcm9wLCB2YWx1ZSl7DQogICAgICAgIGlmKHR5cGVvZiBwcm9wID09ICJzdHJpbmciKXsNCiAgICAgICAgICAgIHZhciBjYW1lbDsNCiAgICAgICAgICAgIGlmKCEoY2FtZWwgPSBwcm9wQ2FjaGVbcHJvcF0pKXsNCiAgICAgICAgICAgICAgICBjYW1lbCA9IHByb3BDYWNoZVtwcm9wXSA9IHByb3AucmVwbGFjZShjYW1lbFJlLCBjYW1lbEZuKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKGNhbWVsID09ICdvcGFjaXR5Jykgew0KICAgICAgICAgICAgICAgIHRoaXMuc2V0T3BhY2l0eSh2YWx1ZSk7DQogICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICB0aGlzLmRvbS5zdHlsZVtjYW1lbF0gPSB2YWx1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICBmb3IodmFyIHN0eWxlIGluIHByb3Apew0KICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBwcm9wW3N0eWxlXSAhPSAiZnVuY3Rpb24iKXsNCiAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0eWxlKHN0eWxlLCBwcm9wW3N0eWxlXSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0sDQoNCiAgICANCiAgICBhcHBseVN0eWxlcyA6IGZ1bmN0aW9uKHN0eWxlKXsNCiAgICAgICAgRXh0LkRvbUhlbHBlci5hcHBseVN0eWxlcyh0aGlzLmRvbSwgc3R5bGUpOw0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9LA0KDQogICAgDQogICAgZ2V0WCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiBELmdldFgodGhpcy5kb20pOw0KICAgIH0sDQoNCiAgICANCiAgICBnZXRZIDogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIEQuZ2V0WSh0aGlzLmRvbSk7DQogICAgfSwNCg0KICAgIA0KICAgIGdldFhZIDogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIEQuZ2V0WFkodGhpcy5kb20pOw0KICAgIH0sDQoNCiAgICANCiAgICBzZXRYIDogZnVuY3Rpb24oeCwgYW5pbWF0ZSl7DQogICAgICAgIGlmKCFhbmltYXRlIHx8ICFBKXsNCiAgICAgICAgICAgIEQuc2V0WCh0aGlzLmRvbSwgeCk7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgdGhpcy5zZXRYWShbeCwgdGhpcy5nZXRZKCldLCB0aGlzLnByZWFuaW0oYXJndW1lbnRzLCAxKSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSwNCg0KICAgIA0KICAgIHNldFkgOiBmdW5jdGlvbih5LCBhbmltYXRlKXsNCiAgICAgICAgaWYoIWFuaW1hdGUgfHwgIUEpew0KICAgICAgICAgICAgRC5zZXRZKHRoaXMuZG9tLCB5KTsNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICB0aGlzLnNldFhZKFt0aGlzLmdldFgoKSwgeV0sIHRoaXMucHJlYW5pbShhcmd1bWVudHMsIDEpKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9LA0KDQogICAgDQogICAgc2V0TGVmdCA6IGZ1bmN0aW9uKGxlZnQpew0KICAgICAgICB0aGlzLnNldFN0eWxlKCJsZWZ0IiwgdGhpcy5hZGRVbml0cyhsZWZ0KSk7DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0sDQoNCiAgICANCiAgICBzZXRUb3AgOiBmdW5jdGlvbih0b3Apew0KICAgICAgICB0aGlzLnNldFN0eWxlKCJ0b3AiLCB0aGlzLmFkZFVuaXRzKHRvcCkpOw0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9LA0KDQogICAgDQogICAgc2V0UmlnaHQgOiBmdW5jdGlvbihyaWdodCl7DQogICAgICAgIHRoaXMuc2V0U3R5bGUoInJpZ2h0IiwgdGhpcy5hZGRVbml0cyhyaWdodCkpOw0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9LA0KDQogICAgDQogICAgc2V0Qm90dG9tIDogZnVuY3Rpb24oYm90dG9tKXsNCiAgICAgICAgdGhpcy5zZXRTdHlsZSgiYm90dG9tIiwgdGhpcy5hZGRVbml0cyhib3R0b20pKTsNCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSwNCg0KICAgIA0KICAgIHNldFhZIDogZnVuY3Rpb24ocG9zLCBhbmltYXRlKXsNCiAgICAgICAgaWYoIWFuaW1hdGUgfHwgIUEpew0KICAgICAgICAgICAgRC5zZXRYWSh0aGlzLmRvbSwgcG9zKTsNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICB0aGlzLmFuaW0oe3BvaW50czoge3RvOiBwb3N9fSwgdGhpcy5wcmVhbmltKGFyZ3VtZW50cywgMSksICdtb3Rpb24nKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9LA0KDQogICAgDQogICAgc2V0TG9jYXRpb24gOiBmdW5jdGlvbih4LCB5LCBhbmltYXRlKXsNCiAgICAgICAgdGhpcy5zZXRYWShbeCwgeV0sIHRoaXMucHJlYW5pbShhcmd1bWVudHMsIDIpKTsNCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSwNCg0KICAgIA0KICAgIG1vdmVUbyA6IGZ1bmN0aW9uKHgsIHksIGFuaW1hdGUpew0KICAgICAgICB0aGlzLnNldFhZKFt4LCB5XSwgdGhpcy5wcmVhbmltKGFyZ3VtZW50cywgMikpOw0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9LA0KDQogICAgDQogICAgZ2V0UmVnaW9uIDogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIEQuZ2V0UmVnaW9uKHRoaXMuZG9tKTsNCiAgICB9LA0KDQogICAgDQogICAgZ2V0SGVpZ2h0IDogZnVuY3Rpb24oY29udGVudEhlaWdodCl7DQogICAgICAgIHZhciBoID0gdGhpcy5kb20ub2Zmc2V0SGVpZ2h0IHx8IDA7DQogICAgICAgIHJldHVybiBjb250ZW50SGVpZ2h0ICE9PSB0cnVlID8gaCA6IGgtdGhpcy5nZXRCb3JkZXJXaWR0aCgidGIiKS10aGlzLmdldFBhZGRpbmcoInRiIik7DQogICAgfSwNCg0KICAgIA0KICAgIGdldFdpZHRoIDogZnVuY3Rpb24oY29udGVudFdpZHRoKXsNCiAgICAgICAgdmFyIHcgPSB0aGlzLmRvbS5vZmZzZXRXaWR0aCB8fCAwOw0KICAgICAgICByZXR1cm4gY29udGVudFdpZHRoICE9PSB0cnVlID8gdyA6IHctdGhpcy5nZXRCb3JkZXJXaWR0aCgibHIiKS10aGlzLmdldFBhZGRpbmcoImxyIik7DQogICAgfSwNCg0KICAgIA0KICAgIGdldENvbXB1dGVkSGVpZ2h0IDogZnVuY3Rpb24oKXsNCiAgICAgICAgdmFyIGggPSBNYXRoLm1heCh0aGlzLmRvbS5vZmZzZXRIZWlnaHQsIHRoaXMuZG9tLmNsaWVudEhlaWdodCk7DQogICAgICAgIGlmKCFoKXsNCiAgICAgICAgICAgIGggPSBwYXJzZUludCh0aGlzLmdldFN0eWxlKCdoZWlnaHQnKSwgMTApIHx8IDA7DQogICAgICAgICAgICBpZighdGhpcy5pc0JvcmRlckJveCgpKXsNCiAgICAgICAgICAgICAgICBoICs9IHRoaXMuZ2V0RnJhbWVXaWR0aCgndGInKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gaDsNCiAgICB9LA0KDQogICAgDQogICAgZ2V0Q29tcHV0ZWRXaWR0aCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHZhciB3ID0gTWF0aC5tYXgodGhpcy5kb20ub2Zmc2V0V2lkdGgsIHRoaXMuZG9tLmNsaWVudFdpZHRoKTsNCiAgICAgICAgaWYoIXcpew0KICAgICAgICAgICAgdyA9IHBhcnNlSW50KHRoaXMuZ2V0U3R5bGUoJ3dpZHRoJyksIDEwKSB8fCAwOw0KICAgICAgICAgICAgaWYoIXRoaXMuaXNCb3JkZXJCb3goKSl7DQogICAgICAgICAgICAgICAgdyArPSB0aGlzLmdldEZyYW1lV2lkdGgoJ2xyJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHc7DQogICAgfSwNCg0KICAgIA0KICAgIGdldFNpemUgOiBmdW5jdGlvbihjb250ZW50U2l6ZSl7DQogICAgICAgIHJldHVybiB7d2lkdGg6IHRoaXMuZ2V0V2lkdGgoY29udGVudFNpemUpLCBoZWlnaHQ6IHRoaXMuZ2V0SGVpZ2h0KGNvbnRlbnRTaXplKX07DQogICAgfSwNCg0KICAgIA0KICAgIGdldFZpZXdTaXplIDogZnVuY3Rpb24oKXsNCiAgICAgICAgdmFyIGQgPSB0aGlzLmRvbSwgZG9jID0gZG9jdW1lbnQsIGF3ID0gMCwgYWggPSAwOw0KICAgICAgICBpZihkID09IGRvYyB8fCBkID09IGRvYy5ib2R5KXsNCiAgICAgICAgICAgIHJldHVybiB7d2lkdGggOiBELmdldFZpZXdXaWR0aCgpLCBoZWlnaHQ6IEQuZ2V0Vmlld0hlaWdodCgpfTsNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgIHdpZHRoIDogZC5jbGllbnRXaWR0aCwNCiAgICAgICAgICAgICAgICBoZWlnaHQ6IGQuY2xpZW50SGVpZ2h0DQogICAgICAgICAgICB9Ow0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIGdldFZhbHVlIDogZnVuY3Rpb24oYXNOdW1iZXIpew0KICAgICAgICByZXR1cm4gYXNOdW1iZXIgPyBwYXJzZUludCh0aGlzLmRvbS52YWx1ZSwgMTApIDogdGhpcy5kb20udmFsdWU7DQogICAgfSwNCg0KICAgIAogICAgYWRqdXN0V2lkdGggOiBmdW5jdGlvbih3aWR0aCl7DQogICAgICAgIGlmKHR5cGVvZiB3aWR0aCA9PSAibnVtYmVyIil7DQogICAgICAgICAgICBpZih0aGlzLmF1dG9Cb3hBZGp1c3QgJiYgIXRoaXMuaXNCb3JkZXJCb3goKSl7DQogICAgICAgICAgICAgICB3aWR0aCAtPSAodGhpcy5nZXRCb3JkZXJXaWR0aCgibHIiKSArIHRoaXMuZ2V0UGFkZGluZygibHIiKSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZih3aWR0aCA8IDApew0KICAgICAgICAgICAgICAgIHdpZHRoID0gMDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gd2lkdGg7DQogICAgfSwNCg0KICAgIAogICAgYWRqdXN0SGVpZ2h0IDogZnVuY3Rpb24oaGVpZ2h0KXsNCiAgICAgICAgaWYodHlwZW9mIGhlaWdodCA9PSAibnVtYmVyIil7DQogICAgICAgICAgIGlmKHRoaXMuYXV0b0JveEFkanVzdCAmJiAhdGhpcy5pc0JvcmRlckJveCgpKXsNCiAgICAgICAgICAgICAgIGhlaWdodCAtPSAodGhpcy5nZXRCb3JkZXJXaWR0aCgidGIiKSArIHRoaXMuZ2V0UGFkZGluZygidGIiKSk7DQogICAgICAgICAgIH0NCiAgICAgICAgICAgaWYoaGVpZ2h0IDwgMCl7DQogICAgICAgICAgICAgICBoZWlnaHQgPSAwOw0KICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGhlaWdodDsNCiAgICB9LA0KDQogICAgDQogICAgc2V0V2lkdGggOiBmdW5jdGlvbih3aWR0aCwgYW5pbWF0ZSl7DQogICAgICAgIHdpZHRoID0gdGhpcy5hZGp1c3RXaWR0aCh3aWR0aCk7DQogICAgICAgIGlmKCFhbmltYXRlIHx8ICFBKXsNCiAgICAgICAgICAgIHRoaXMuZG9tLnN0eWxlLndpZHRoID0gdGhpcy5hZGRVbml0cyh3aWR0aCk7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgdGhpcy5hbmltKHt3aWR0aDoge3RvOiB3aWR0aH19LCB0aGlzLnByZWFuaW0oYXJndW1lbnRzLCAxKSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSwNCg0KICAgIA0KICAgICBzZXRIZWlnaHQgOiBmdW5jdGlvbihoZWlnaHQsIGFuaW1hdGUpew0KICAgICAgICBoZWlnaHQgPSB0aGlzLmFkanVzdEhlaWdodChoZWlnaHQpOw0KICAgICAgICBpZighYW5pbWF0ZSB8fCAhQSl7DQogICAgICAgICAgICB0aGlzLmRvbS5zdHlsZS5oZWlnaHQgPSB0aGlzLmFkZFVuaXRzKGhlaWdodCk7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgdGhpcy5hbmltKHtoZWlnaHQ6IHt0bzogaGVpZ2h0fX0sIHRoaXMucHJlYW5pbShhcmd1bWVudHMsIDEpKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9LA0KDQogICAgDQogICAgIHNldFNpemUgOiBmdW5jdGlvbih3aWR0aCwgaGVpZ2h0LCBhbmltYXRlKXsNCiAgICAgICAgaWYodHlwZW9mIHdpZHRoID09ICJvYmplY3QiKXsgCiAgICAgICAgICAgIGhlaWdodCA9IHdpZHRoLmhlaWdodDsgd2lkdGggPSB3aWR0aC53aWR0aDsNCiAgICAgICAgfQ0KICAgICAgICB3aWR0aCA9IHRoaXMuYWRqdXN0V2lkdGgod2lkdGgpOyBoZWlnaHQgPSB0aGlzLmFkanVzdEhlaWdodChoZWlnaHQpOw0KICAgICAgICBpZighYW5pbWF0ZSB8fCAhQSl7DQogICAgICAgICAgICB0aGlzLmRvbS5zdHlsZS53aWR0aCA9IHRoaXMuYWRkVW5pdHMod2lkdGgpOw0KICAgICAgICAgICAgdGhpcy5kb20uc3R5bGUuaGVpZ2h0ID0gdGhpcy5hZGRVbml0cyhoZWlnaHQpOw0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIHRoaXMuYW5pbSh7d2lkdGg6IHt0bzogd2lkdGh9LCBoZWlnaHQ6IHt0bzogaGVpZ2h0fX0sIHRoaXMucHJlYW5pbShhcmd1bWVudHMsIDIpKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9LA0KDQogICAgDQogICAgc2V0Qm91bmRzIDogZnVuY3Rpb24oeCwgeSwgd2lkdGgsIGhlaWdodCwgYW5pbWF0ZSl7DQogICAgICAgIGlmKCFhbmltYXRlIHx8ICFBKXsNCiAgICAgICAgICAgIHRoaXMuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTsNCiAgICAgICAgICAgIHRoaXMuc2V0TG9jYXRpb24oeCwgeSk7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgd2lkdGggPSB0aGlzLmFkanVzdFdpZHRoKHdpZHRoKTsgaGVpZ2h0ID0gdGhpcy5hZGp1c3RIZWlnaHQoaGVpZ2h0KTsNCiAgICAgICAgICAgIHRoaXMuYW5pbSh7cG9pbnRzOiB7dG86IFt4LCB5XX0sIHdpZHRoOiB7dG86IHdpZHRofSwgaGVpZ2h0OiB7dG86IGhlaWdodH19LA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByZWFuaW0oYXJndW1lbnRzLCA0KSwgJ21vdGlvbicpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0sDQoNCiAgICANCiAgICBzZXRSZWdpb24gOiBmdW5jdGlvbihyZWdpb24sIGFuaW1hdGUpew0KICAgICAgICB0aGlzLnNldEJvdW5kcyhyZWdpb24ubGVmdCwgcmVnaW9uLnRvcCwgcmVnaW9uLnJpZ2h0LXJlZ2lvbi5sZWZ0LCByZWdpb24uYm90dG9tLXJlZ2lvbi50b3AsIHRoaXMucHJlYW5pbShhcmd1bWVudHMsIDEpKTsNCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSwNCg0KICAgIA0KICAgIGFkZExpc3RlbmVyIDogZnVuY3Rpb24oZXZlbnROYW1lLCBmbiwgc2NvcGUsIG9wdGlvbnMpew0KICAgICAgICBFeHQuRXZlbnRNYW5hZ2VyLm9uKHRoaXMuZG9tLCAgZXZlbnROYW1lLCBmbiwgc2NvcGUgfHwgdGhpcywgb3B0aW9ucyk7DQogICAgfSwNCg0KICAgIA0KICAgIHJlbW92ZUxpc3RlbmVyIDogZnVuY3Rpb24oZXZlbnROYW1lLCBmbil7DQogICAgICAgIEV4dC5FdmVudE1hbmFnZXIucmVtb3ZlTGlzdGVuZXIodGhpcy5kb20sICBldmVudE5hbWUsIGZuKTsNCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSwNCg0KICAgIA0KICAgIHJlbW92ZUFsbExpc3RlbmVycyA6IGZ1bmN0aW9uKCl7DQogICAgICAgIEUucHVyZ2VFbGVtZW50KHRoaXMuZG9tKTsNCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSwNCg0KICAgIHJlbGF5RXZlbnQgOiBmdW5jdGlvbihldmVudE5hbWUsIG9ic2VydmFibGUpew0KICAgICAgICB0aGlzLm9uKGV2ZW50TmFtZSwgZnVuY3Rpb24oZSl7DQogICAgICAgICAgICBvYnNlcnZhYmxlLmZpcmVFdmVudChldmVudE5hbWUsIGUpOw0KICAgICAgICB9KTsNCiAgICB9LA0KDQogICAgDQogICAgIHNldE9wYWNpdHkgOiBmdW5jdGlvbihvcGFjaXR5LCBhbmltYXRlKXsNCiAgICAgICAgaWYoIWFuaW1hdGUgfHwgIUEpew0KICAgICAgICAgICAgdmFyIHMgPSB0aGlzLmRvbS5zdHlsZTsNCiAgICAgICAgICAgIGlmKEV4dC5pc0lFKXsNCiAgICAgICAgICAgICAgICBzLnpvb20gPSAxOw0KICAgICAgICAgICAgICAgIHMuZmlsdGVyID0gKHMuZmlsdGVyIHx8ICcnKS5yZXBsYWNlKC9hbHBoYVwoW15cKV0qXCkvZ2ksIiIpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcGFjaXR5ID09IDEgPyAiIiA6ICJhbHBoYShvcGFjaXR5PSIgKyBvcGFjaXR5ICogMTAwICsgIikiKTsNCiAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgIHMub3BhY2l0eSA9IG9wYWNpdHk7DQogICAgICAgICAgICB9DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgdGhpcy5hbmltKHtvcGFjaXR5OiB7dG86IG9wYWNpdHl9fSwgdGhpcy5wcmVhbmltKGFyZ3VtZW50cywgMSksIG51bGwsIC4zNSwgJ2Vhc2VJbicpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0sDQoNCiAgICANCiAgICBnZXRMZWZ0IDogZnVuY3Rpb24obG9jYWwpew0KICAgICAgICBpZighbG9jYWwpew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0WCgpOw0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIHJldHVybiBwYXJzZUludCh0aGlzLmdldFN0eWxlKCJsZWZ0IiksIDEwKSB8fCAwOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIGdldFJpZ2h0IDogZnVuY3Rpb24obG9jYWwpew0KICAgICAgICBpZighbG9jYWwpew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0WCgpICsgdGhpcy5nZXRXaWR0aCgpOw0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIHJldHVybiAodGhpcy5nZXRMZWZ0KHRydWUpICsgdGhpcy5nZXRXaWR0aCgpKSB8fCAwOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIGdldFRvcCA6IGZ1bmN0aW9uKGxvY2FsKSB7DQogICAgICAgIGlmKCFsb2NhbCl7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRZKCk7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHRoaXMuZ2V0U3R5bGUoInRvcCIpLCAxMCkgfHwgMDsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICANCiAgICBnZXRCb3R0b20gOiBmdW5jdGlvbihsb2NhbCl7DQogICAgICAgIGlmKCFsb2NhbCl7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRZKCkgKyB0aGlzLmdldEhlaWdodCgpOw0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIHJldHVybiAodGhpcy5nZXRUb3AodHJ1ZSkgKyB0aGlzLmdldEhlaWdodCgpKSB8fCAwOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIHBvc2l0aW9uIDogZnVuY3Rpb24ocG9zLCB6SW5kZXgsIHgsIHkpew0KICAgICAgICBpZighcG9zKXsNCiAgICAgICAgICAgaWYodGhpcy5nZXRTdHlsZSgncG9zaXRpb24nKSA9PSAnc3RhdGljJyl7DQogICAgICAgICAgICAgICB0aGlzLnNldFN0eWxlKCdwb3NpdGlvbicsICdyZWxhdGl2ZScpOw0KICAgICAgICAgICB9DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgdGhpcy5zZXRTdHlsZSgicG9zaXRpb24iLCBwb3MpOw0KICAgICAgICB9DQogICAgICAgIGlmKHpJbmRleCl7DQogICAgICAgICAgICB0aGlzLnNldFN0eWxlKCJ6LWluZGV4IiwgekluZGV4KTsNCiAgICAgICAgfQ0KICAgICAgICBpZih4ICE9PSB1bmRlZmluZWQgJiYgeSAhPT0gdW5kZWZpbmVkKXsNCiAgICAgICAgICAgIHRoaXMuc2V0WFkoW3gsIHldKTsNCiAgICAgICAgfWVsc2UgaWYoeCAhPT0gdW5kZWZpbmVkKXsNCiAgICAgICAgICAgIHRoaXMuc2V0WCh4KTsNCiAgICAgICAgfWVsc2UgaWYoeSAhPT0gdW5kZWZpbmVkKXsNCiAgICAgICAgICAgIHRoaXMuc2V0WSh5KTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICANCiAgICBjbGVhclBvc2l0aW9uaW5nIDogZnVuY3Rpb24odmFsdWUpew0KICAgICAgICB2YWx1ZSA9IHZhbHVlIHx8Jyc7DQogICAgICAgIHRoaXMuc2V0U3R5bGUoew0KICAgICAgICAgICAgImxlZnQiOiB2YWx1ZSwNCiAgICAgICAgICAgICJyaWdodCI6IHZhbHVlLA0KICAgICAgICAgICAgInRvcCI6IHZhbHVlLA0KICAgICAgICAgICAgImJvdHRvbSI6IHZhbHVlLA0KICAgICAgICAgICAgInotaW5kZXgiOiAiIiwNCiAgICAgICAgICAgICJwb3NpdGlvbiIgOiAic3RhdGljIg0KICAgICAgICB9KTsNCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSwNCg0KICAgIA0KICAgIGdldFBvc2l0aW9uaW5nIDogZnVuY3Rpb24oKXsNCiAgICAgICAgdmFyIGwgPSB0aGlzLmdldFN0eWxlKCJsZWZ0Iik7DQogICAgICAgIHZhciB0ID0gdGhpcy5nZXRTdHlsZSgidG9wIik7DQogICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAicG9zaXRpb24iIDogdGhpcy5nZXRTdHlsZSgicG9zaXRpb24iKSwNCiAgICAgICAgICAgICJsZWZ0IiA6IGwsDQogICAgICAgICAgICAicmlnaHQiIDogbCA/ICIiIDogdGhpcy5nZXRTdHlsZSgicmlnaHQiKSwNCiAgICAgICAgICAgICJ0b3AiIDogdCwNCiAgICAgICAgICAgICJib3R0b20iIDogdCA/ICIiIDogdGhpcy5nZXRTdHlsZSgiYm90dG9tIiksDQogICAgICAgICAgICAiei1pbmRleCIgOiB0aGlzLmdldFN0eWxlKCJ6LWluZGV4IikNCiAgICAgICAgfTsNCiAgICB9LA0KDQogICAgDQogICAgZ2V0Qm9yZGVyV2lkdGggOiBmdW5jdGlvbihzaWRlKXsNCiAgICAgICAgcmV0dXJuIHRoaXMuYWRkU3R5bGVzKHNpZGUsIEVsLmJvcmRlcnMpOw0KICAgIH0sDQoNCiAgICANCiAgICBnZXRQYWRkaW5nIDogZnVuY3Rpb24oc2lkZSl7DQogICAgICAgIHJldHVybiB0aGlzLmFkZFN0eWxlcyhzaWRlLCBFbC5wYWRkaW5ncyk7DQogICAgfSwNCg0KICAgIA0KICAgIHNldFBvc2l0aW9uaW5nIDogZnVuY3Rpb24ocGMpew0KICAgICAgICB0aGlzLmFwcGx5U3R5bGVzKHBjKTsNCiAgICAgICAgaWYocGMucmlnaHQgPT0gImF1dG8iKXsNCiAgICAgICAgICAgIHRoaXMuZG9tLnN0eWxlLnJpZ2h0ID0gIiI7DQogICAgICAgIH0NCiAgICAgICAgaWYocGMuYm90dG9tID09ICJhdXRvIil7DQogICAgICAgICAgICB0aGlzLmRvbS5zdHlsZS5ib3R0b20gPSAiIjsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9LA0KDQogICAgCiAgICBmaXhEaXNwbGF5IDogZnVuY3Rpb24oKXsNCiAgICAgICAgaWYodGhpcy5nZXRTdHlsZSgiZGlzcGxheSIpID09ICJub25lIil7DQogICAgICAgICAgICB0aGlzLnNldFN0eWxlKCJ2aXNpYmlsaXR5IiwgImhpZGRlbiIpOw0KICAgICAgICAgICAgdGhpcy5zZXRTdHlsZSgiZGlzcGxheSIsIHRoaXMub3JpZ2luYWxEaXNwbGF5KTsgCiAgICAgICAgICAgIGlmKHRoaXMuZ2V0U3R5bGUoImRpc3BsYXkiKSA9PSAibm9uZSIpeyAKICAgICAgICAgICAgICAgIHRoaXMuc2V0U3R5bGUoImRpc3BsYXkiLCAiYmxvY2siKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICANCiAgICAgc2V0TGVmdFRvcCA6IGZ1bmN0aW9uKGxlZnQsIHRvcCl7DQogICAgICAgIHRoaXMuZG9tLnN0eWxlLmxlZnQgPSB0aGlzLmFkZFVuaXRzKGxlZnQpOw0KICAgICAgICB0aGlzLmRvbS5zdHlsZS50b3AgPSB0aGlzLmFkZFVuaXRzKHRvcCk7DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0sDQoNCiAgICANCiAgICAgbW92ZSA6IGZ1bmN0aW9uKGRpcmVjdGlvbiwgZGlzdGFuY2UsIGFuaW1hdGUpew0KICAgICAgICB2YXIgeHkgPSB0aGlzLmdldFhZKCk7DQogICAgICAgIGRpcmVjdGlvbiA9IGRpcmVjdGlvbi50b0xvd2VyQ2FzZSgpOw0KICAgICAgICBzd2l0Y2goZGlyZWN0aW9uKXsNCiAgICAgICAgICAgIGNhc2UgImwiOg0KICAgICAgICAgICAgY2FzZSAibGVmdCI6DQogICAgICAgICAgICAgICAgdGhpcy5tb3ZlVG8oeHlbMF0tZGlzdGFuY2UsIHh5WzFdLCB0aGlzLnByZWFuaW0oYXJndW1lbnRzLCAyKSk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgIGNhc2UgInIiOg0KICAgICAgICAgICBjYXNlICJyaWdodCI6DQogICAgICAgICAgICAgICAgdGhpcy5tb3ZlVG8oeHlbMF0rZGlzdGFuY2UsIHh5WzFdLCB0aGlzLnByZWFuaW0oYXJndW1lbnRzLCAyKSk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgIGNhc2UgInQiOg0KICAgICAgICAgICBjYXNlICJ0b3AiOg0KICAgICAgICAgICBjYXNlICJ1cCI6DQogICAgICAgICAgICAgICAgdGhpcy5tb3ZlVG8oeHlbMF0sIHh5WzFdLWRpc3RhbmNlLCB0aGlzLnByZWFuaW0oYXJndW1lbnRzLCAyKSk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgIGNhc2UgImIiOg0KICAgICAgICAgICBjYXNlICJib3R0b20iOg0KICAgICAgICAgICBjYXNlICJkb3duIjoNCiAgICAgICAgICAgICAgICB0aGlzLm1vdmVUbyh4eVswXSwgeHlbMV0rZGlzdGFuY2UsIHRoaXMucHJlYW5pbShhcmd1bWVudHMsIDIpKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9LA0KDQogICAgDQogICAgY2xpcCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIGlmKCF0aGlzLmlzQ2xpcHBlZCl7DQogICAgICAgICAgIHRoaXMuaXNDbGlwcGVkID0gdHJ1ZTsNCiAgICAgICAgICAgdGhpcy5vcmlnaW5hbENsaXAgPSB7DQogICAgICAgICAgICAgICAibyI6IHRoaXMuZ2V0U3R5bGUoIm92ZXJmbG93IiksDQogICAgICAgICAgICAgICAieCI6IHRoaXMuZ2V0U3R5bGUoIm92ZXJmbG93LXgiKSwNCiAgICAgICAgICAgICAgICJ5IjogdGhpcy5nZXRTdHlsZSgib3ZlcmZsb3cteSIpDQogICAgICAgICAgIH07DQogICAgICAgICAgIHRoaXMuc2V0U3R5bGUoIm92ZXJmbG93IiwgImhpZGRlbiIpOw0KICAgICAgICAgICB0aGlzLnNldFN0eWxlKCJvdmVyZmxvdy14IiwgImhpZGRlbiIpOw0KICAgICAgICAgICB0aGlzLnNldFN0eWxlKCJvdmVyZmxvdy15IiwgImhpZGRlbiIpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0sDQoNCiAgICANCiAgICB1bmNsaXAgOiBmdW5jdGlvbigpew0KICAgICAgICBpZih0aGlzLmlzQ2xpcHBlZCl7DQogICAgICAgICAgICB0aGlzLmlzQ2xpcHBlZCA9IGZhbHNlOw0KICAgICAgICAgICAgdmFyIG8gPSB0aGlzLm9yaWdpbmFsQ2xpcDsNCiAgICAgICAgICAgIGlmKG8ubyl7dGhpcy5zZXRTdHlsZSgib3ZlcmZsb3ciLCBvLm8pO30NCiAgICAgICAgICAgIGlmKG8ueCl7dGhpcy5zZXRTdHlsZSgib3ZlcmZsb3cteCIsIG8ueCk7fQ0KICAgICAgICAgICAgaWYoby55KXt0aGlzLnNldFN0eWxlKCJvdmVyZmxvdy15Iiwgby55KTt9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSwNCg0KDQogICAgDQogICAgZ2V0QW5jaG9yWFkgOiBmdW5jdGlvbihhbmNob3IsIGxvY2FsLCBzKXsNCiAgICAgICAgCiAgICAgICAgCg0KICAgICAgICB2YXIgdywgaCwgdnAgPSBmYWxzZTsNCiAgICAgICAgaWYoIXMpew0KICAgICAgICAgICAgdmFyIGQgPSB0aGlzLmRvbTsNCiAgICAgICAgICAgIGlmKGQgPT0gZG9jdW1lbnQuYm9keSB8fCBkID09IGRvY3VtZW50KXsNCiAgICAgICAgICAgICAgICB2cCA9IHRydWU7DQogICAgICAgICAgICAgICAgdyA9IEQuZ2V0Vmlld1dpZHRoKCk7IGggPSBELmdldFZpZXdIZWlnaHQoKTsNCiAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgIHcgPSB0aGlzLmdldFdpZHRoKCk7IGggPSB0aGlzLmdldEhlaWdodCgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIHcgPSBzLndpZHRoOyAgaCA9IHMuaGVpZ2h0Ow0KICAgICAgICB9DQogICAgICAgIHZhciB4ID0gMCwgeSA9IDAsIHIgPSBNYXRoLnJvdW5kOw0KICAgICAgICBzd2l0Y2goKGFuY2hvciB8fCAidGwiKS50b0xvd2VyQ2FzZSgpKXsNCiAgICAgICAgICAgIGNhc2UgImMiOg0KICAgICAgICAgICAgICAgIHggPSByKHcqLjUpOw0KICAgICAgICAgICAgICAgIHkgPSByKGgqLjUpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBjYXNlICJ0IjoNCiAgICAgICAgICAgICAgICB4ID0gcih3Ki41KTsNCiAgICAgICAgICAgICAgICB5ID0gMDsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAibCI6DQogICAgICAgICAgICAgICAgeCA9IDA7DQogICAgICAgICAgICAgICAgeSA9IHIoaCouNSk7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGNhc2UgInIiOg0KICAgICAgICAgICAgICAgIHggPSB3Ow0KICAgICAgICAgICAgICAgIHkgPSByKGgqLjUpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBjYXNlICJiIjoNCiAgICAgICAgICAgICAgICB4ID0gcih3Ki41KTsNCiAgICAgICAgICAgICAgICB5ID0gaDsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAidGwiOg0KICAgICAgICAgICAgICAgIHggPSAwOw0KICAgICAgICAgICAgICAgIHkgPSAwOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBjYXNlICJibCI6DQogICAgICAgICAgICAgICAgeCA9IDA7DQogICAgICAgICAgICAgICAgeSA9IGg7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGNhc2UgImJyIjoNCiAgICAgICAgICAgICAgICB4ID0gdzsNCiAgICAgICAgICAgICAgICB5ID0gaDsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAidHIiOg0KICAgICAgICAgICAgICAgIHggPSB3Ow0KICAgICAgICAgICAgICAgIHkgPSAwOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICAgICAgaWYobG9jYWwgPT09IHRydWUpew0KICAgICAgICAgICAgcmV0dXJuIFt4LCB5XTsNCiAgICAgICAgfQ0KICAgICAgICBpZih2cCl7DQogICAgICAgICAgICB2YXIgc2MgPSB0aGlzLmdldFNjcm9sbCgpOw0KICAgICAgICAgICAgcmV0dXJuIFt4ICsgc2MubGVmdCwgeSArIHNjLnRvcF07DQogICAgICAgIH0NCiAgICAgICAgCiAgICAgICAgdmFyIG8gPSB0aGlzLmdldFhZKCk7DQogICAgICAgIHJldHVybiBbeCtvWzBdLCB5K29bMV1dOw0KICAgIH0sDQoNCiAgICANCiAgICBnZXRBbGlnblRvWFkgOiBmdW5jdGlvbihlbCwgcCwgbyl7DQogICAgICAgIGVsID0gRXh0LmdldChlbCk7DQogICAgICAgIHZhciBkID0gdGhpcy5kb207DQogICAgICAgIGlmKCFlbC5kb20pew0KICAgICAgICAgICAgdGhyb3cgIkVsZW1lbnQuYWxpZ25UbyB3aXRoIGFuIGVsZW1lbnQgdGhhdCBkb2Vzbid0IGV4aXN0IjsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgYyA9IGZhbHNlOyAKICAgICAgICB2YXIgcDEgPSAiIiwgcDIgPSAiIjsNCiAgICAgICAgbyA9IG8gfHwgWzAsMF07DQoNCiAgICAgICAgaWYoIXApew0KICAgICAgICAgICAgcCA9ICJ0bC1ibCI7DQogICAgICAgIH1lbHNlIGlmKHAgPT0gIj8iKXsNCiAgICAgICAgICAgIHAgPSAidGwtYmw/IjsNCiAgICAgICAgfWVsc2UgaWYocC5pbmRleE9mKCItIikgPT0gLTEpew0KICAgICAgICAgICAgcCA9ICJ0bC0iICsgcDsNCiAgICAgICAgfQ0KICAgICAgICBwID0gcC50b0xvd2VyQ2FzZSgpOw0KICAgICAgICB2YXIgbSA9IHAubWF0Y2goL14oW2Etel0rKS0oW2Etel0rKShcPyk/JC8pOw0KICAgICAgICBpZighbSl7DQogICAgICAgICAgIHRocm93ICJFbGVtZW50LmFsaWduVG8gd2l0aCBhbiBpbnZhbGlkIGFsaWdubWVudCAiICsgcDsNCiAgICAgICAgfQ0KICAgICAgICBwMSA9IG1bMV07IHAyID0gbVsyXTsgYyA9ICEhbVszXTsNCg0KICAgICAgICAKICAgICAgICAKICAgICAgICB2YXIgYTEgPSB0aGlzLmdldEFuY2hvclhZKHAxLCB0cnVlKTsNCiAgICAgICAgdmFyIGEyID0gZWwuZ2V0QW5jaG9yWFkocDIsIGZhbHNlKTsNCiAgICAgICAgdmFyIHggPSBhMlswXSAtIGExWzBdICsgb1swXTsNCiAgICAgICAgdmFyIHkgPSBhMlsxXSAtIGExWzFdICsgb1sxXTsNCiAgICAgICAgaWYoYyl7DQogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHcgPSB0aGlzLmdldFdpZHRoKCksIGggPSB0aGlzLmdldEhlaWdodCgpLCByID0gZWwuZ2V0UmVnaW9uKCk7DQogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIGR3ID0gRC5nZXRWaWV3V2lkdGgoKS01LCBkaCA9IEQuZ2V0Vmlld0hlaWdodCgpLTU7DQoNCiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwMXkgPSBwMS5jaGFyQXQoMCksIHAxeCA9IHAxLmNoYXJBdChwMS5sZW5ndGgtMSk7DQogICAgICAgICAgIHZhciBwMnkgPSBwMi5jaGFyQXQoMCksIHAyeCA9IHAyLmNoYXJBdChwMi5sZW5ndGgtMSk7DQogICAgICAgICAgIHZhciBzd2FwWSA9ICgocDF5PT0idCIgJiYgcDJ5PT0iYiIpIHx8IChwMXk9PSJiIiAmJiBwMnk9PSJ0IikpOw0KICAgICAgICAgICB2YXIgc3dhcFggPSAoKHAxeD09InIiICYmIHAyeD09ImwiKSB8fCAocDF4PT0ibCIgJiYgcDJ4PT0iciIpKTsNCg0KICAgICAgICAgICB2YXIgZG9jID0gZG9jdW1lbnQ7DQogICAgICAgICAgIHZhciBzY3JvbGxYID0gKGRvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCB8fCBkb2MuYm9keS5zY3JvbGxMZWZ0IHx8IDApKzU7DQogICAgICAgICAgIHZhciBzY3JvbGxZID0gKGRvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wIHx8IGRvYy5ib2R5LnNjcm9sbFRvcCB8fCAwKSs1Ow0KDQogICAgICAgICAgIGlmKCh4K3cpID4gZHcgKyBzY3JvbGxYKXsNCiAgICAgICAgICAgICAgICB4ID0gc3dhcFggPyByLmxlZnQtdyA6IGR3K3Njcm9sbFgtdzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgaWYoeCA8IHNjcm9sbFgpew0KICAgICAgICAgICAgICAgeCA9IHN3YXBYID8gci5yaWdodCA6IHNjcm9sbFg7DQogICAgICAgICAgIH0NCiAgICAgICAgICAgaWYoKHkraCkgPiBkaCArIHNjcm9sbFkpew0KICAgICAgICAgICAgICAgIHkgPSBzd2FwWSA/IHIudG9wLWggOiBkaCtzY3JvbGxZLWg7DQogICAgICAgICAgICB9DQogICAgICAgICAgIGlmICh5IDwgc2Nyb2xsWSl7DQogICAgICAgICAgICAgICB5ID0gc3dhcFkgPyByLmJvdHRvbSA6IHNjcm9sbFk7DQogICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gW3gseV07DQogICAgfSwNCg0KICAgIAogICAgZ2V0Q29uc3RyYWluVG9YWSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHZhciBvcyA9IHt0b3A6MCwgbGVmdDowLCBib3R0b206MCwgcmlnaHQ6IDB9Ow0KDQogICAgICAgIHJldHVybiBmdW5jdGlvbihlbCwgbG9jYWwsIG9mZnNldHMsIHByb3Bvc2VkWFkpew0KICAgICAgICAgICAgZWwgPSBFeHQuZ2V0KGVsKTsNCiAgICAgICAgICAgIG9mZnNldHMgPSBvZmZzZXRzID8gRXh0LmFwcGx5SWYob2Zmc2V0cywgb3MpIDogb3M7DQoNCiAgICAgICAgICAgIHZhciB2dywgdmgsIHZ4ID0gMCwgdnkgPSAwOw0KICAgICAgICAgICAgaWYoZWwuZG9tID09IGRvY3VtZW50LmJvZHkgfHwgZWwuZG9tID09IGRvY3VtZW50KXsNCiAgICAgICAgICAgICAgICB2dyA9IEV4dC5saWIuRG9tLmdldFZpZXdXaWR0aCgpOw0KICAgICAgICAgICAgICAgIHZoID0gRXh0LmxpYi5Eb20uZ2V0Vmlld0hlaWdodCgpOw0KICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgdncgPSBlbC5kb20uY2xpZW50V2lkdGg7DQogICAgICAgICAgICAgICAgdmggPSBlbC5kb20uY2xpZW50SGVpZ2h0Ow0KICAgICAgICAgICAgICAgIGlmKCFsb2NhbCl7DQogICAgICAgICAgICAgICAgICAgIHZhciB2eHkgPSBlbC5nZXRYWSgpOw0KICAgICAgICAgICAgICAgICAgICB2eCA9IHZ4eVswXTsNCiAgICAgICAgICAgICAgICAgICAgdnkgPSB2eHlbMV07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2YXIgcyA9IGVsLmdldFNjcm9sbCgpOw0KDQogICAgICAgICAgICB2eCArPSBvZmZzZXRzLmxlZnQgKyBzLmxlZnQ7DQogICAgICAgICAgICB2eSArPSBvZmZzZXRzLnRvcCArIHMudG9wOw0KDQogICAgICAgICAgICB2dyAtPSBvZmZzZXRzLnJpZ2h0Ow0KICAgICAgICAgICAgdmggLT0gb2Zmc2V0cy5ib3R0b207DQoNCiAgICAgICAgICAgIHZhciB2ciA9IHZ4K3Z3Ow0KICAgICAgICAgICAgdmFyIHZiID0gdnkrdmg7DQoNCiAgICAgICAgICAgIHZhciB4eSA9IHByb3Bvc2VkWFkgfHwgKCFsb2NhbCA/IHRoaXMuZ2V0WFkoKSA6IFt0aGlzLmdldExlZnQodHJ1ZSksIHRoaXMuZ2V0VG9wKHRydWUpXSk7DQogICAgICAgICAgICB2YXIgeCA9IHh5WzBdLCB5ID0geHlbMV07DQogICAgICAgICAgICB2YXIgdyA9IHRoaXMuZG9tLm9mZnNldFdpZHRoLCBoID0gdGhpcy5kb20ub2Zmc2V0SGVpZ2h0Ow0KDQogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIG1vdmVkID0gZmFsc2U7DQoNCiAgICAgICAgICAgIAogICAgICAgICAgICBpZigoeCArIHcpID4gdnIpew0KICAgICAgICAgICAgICAgIHggPSB2ciAtIHc7DQogICAgICAgICAgICAgICAgbW92ZWQgPSB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYoKHkgKyBoKSA+IHZiKXsNCiAgICAgICAgICAgICAgICB5ID0gdmIgLSBoOw0KICAgICAgICAgICAgICAgIG1vdmVkID0gdHJ1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIAogICAgICAgICAgICBpZih4IDwgdngpew0KICAgICAgICAgICAgICAgIHggPSB2eDsNCiAgICAgICAgICAgICAgICBtb3ZlZCA9IHRydWU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZih5IDwgdnkpew0KICAgICAgICAgICAgICAgIHkgPSB2eTsNCiAgICAgICAgICAgICAgICBtb3ZlZCA9IHRydWU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gbW92ZWQgPyBbeCwgeV0gOiBmYWxzZTsNCiAgICAgICAgfTsNCiAgICB9KCksDQoNCiAgICAKICAgIGFkanVzdEZvckNvbnN0cmFpbnRzIDogZnVuY3Rpb24oeHksIHBhcmVudCwgb2Zmc2V0cyl7DQogICAgICAgIHJldHVybiB0aGlzLmdldENvbnN0cmFpblRvWFkocGFyZW50IHx8IGRvY3VtZW50LCBmYWxzZSwgb2Zmc2V0cywgeHkpIHx8ICB4eTsNCiAgICB9LA0KDQogICAgDQogICAgYWxpZ25UbyA6IGZ1bmN0aW9uKGVsZW1lbnQsIHBvc2l0aW9uLCBvZmZzZXRzLCBhbmltYXRlKXsNCiAgICAgICAgdmFyIHh5ID0gdGhpcy5nZXRBbGlnblRvWFkoZWxlbWVudCwgcG9zaXRpb24sIG9mZnNldHMpOw0KICAgICAgICB0aGlzLnNldFhZKHh5LCB0aGlzLnByZWFuaW0oYXJndW1lbnRzLCAzKSk7DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0sDQoNCiAgICANCiAgICBhbmNob3JUbyA6IGZ1bmN0aW9uKGVsLCBhbGlnbm1lbnQsIG9mZnNldHMsIGFuaW1hdGUsIG1vbml0b3JTY3JvbGwsIGNhbGxiYWNrKXsNCiAgICAgICAgdmFyIGFjdGlvbiA9IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICB0aGlzLmFsaWduVG8oZWwsIGFsaWdubWVudCwgb2Zmc2V0cywgYW5pbWF0ZSk7DQogICAgICAgICAgICBFeHQuY2FsbGJhY2soY2FsbGJhY2ssIHRoaXMpOw0KICAgICAgICB9Ow0KICAgICAgICBFeHQuRXZlbnRNYW5hZ2VyLm9uV2luZG93UmVzaXplKGFjdGlvbiwgdGhpcyk7DQogICAgICAgIHZhciB0bSA9IHR5cGVvZiBtb25pdG9yU2Nyb2xsOw0KICAgICAgICBpZih0bSAhPSAndW5kZWZpbmVkJyl7DQogICAgICAgICAgICBFeHQuRXZlbnRNYW5hZ2VyLm9uKHdpbmRvdywgJ3Njcm9sbCcsIGFjdGlvbiwgdGhpcywNCiAgICAgICAgICAgICAgICB7YnVmZmVyOiB0bSA9PSAnbnVtYmVyJyA/IG1vbml0b3JTY3JvbGwgOiA1MH0pOw0KICAgICAgICB9DQogICAgICAgIGFjdGlvbi5jYWxsKHRoaXMpOyAKICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9LA0KICAgIA0KICAgIGNsZWFyT3BhY2l0eSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIGlmICh3aW5kb3cuQWN0aXZlWE9iamVjdCkgew0KICAgICAgICAgICAgaWYodHlwZW9mIHRoaXMuZG9tLnN0eWxlLmZpbHRlciA9PSAnc3RyaW5nJyAmJiAoL2FscGhhL2kpLnRlc3QodGhpcy5kb20uc3R5bGUuZmlsdGVyKSl7DQogICAgICAgICAgICAgICAgdGhpcy5kb20uc3R5bGUuZmlsdGVyID0gIiI7DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB0aGlzLmRvbS5zdHlsZS5vcGFjaXR5ID0gIiI7DQogICAgICAgICAgICB0aGlzLmRvbS5zdHlsZVsiLW1vei1vcGFjaXR5Il0gPSAiIjsNCiAgICAgICAgICAgIHRoaXMuZG9tLnN0eWxlWyIta2h0bWwtb3BhY2l0eSJdID0gIiI7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSwNCg0KICAgIA0KICAgIGhpZGUgOiBmdW5jdGlvbihhbmltYXRlKXsNCiAgICAgICAgdGhpcy5zZXRWaXNpYmxlKGZhbHNlLCB0aGlzLnByZWFuaW0oYXJndW1lbnRzLCAwKSk7DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0sDQoNCiAgICANCiAgICBzaG93IDogZnVuY3Rpb24oYW5pbWF0ZSl7DQogICAgICAgIHRoaXMuc2V0VmlzaWJsZSh0cnVlLCB0aGlzLnByZWFuaW0oYXJndW1lbnRzLCAwKSk7DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0sDQoNCiAgICANCiAgICBhZGRVbml0cyA6IGZ1bmN0aW9uKHNpemUpew0KICAgICAgICByZXR1cm4gRXh0LkVsZW1lbnQuYWRkVW5pdHMoc2l6ZSwgdGhpcy5kZWZhdWx0VW5pdCk7DQogICAgfSwNCg0KICAgIA0KICAgIGJlZ2luTWVhc3VyZSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHZhciBlbCA9IHRoaXMuZG9tOw0KICAgICAgICBpZihlbC5vZmZzZXRXaWR0aCB8fCBlbC5vZmZzZXRIZWlnaHQpew0KICAgICAgICAgICAgcmV0dXJuIHRoaXM7IAogICAgICAgIH0NCiAgICAgICAgdmFyIGNoYW5nZWQgPSBbXTsNCiAgICAgICAgdmFyIHAgPSB0aGlzLmRvbSwgYiA9IGRvY3VtZW50LmJvZHk7IAogICAgICAgIHdoaWxlKCghZWwub2Zmc2V0V2lkdGggJiYgIWVsLm9mZnNldEhlaWdodCkgJiYgcCAmJiBwLnRhZ05hbWUgJiYgcCAhPSBiKXsNCiAgICAgICAgICAgIHZhciBwZSA9IEV4dC5nZXQocCk7DQogICAgICAgICAgICBpZihwZS5nZXRTdHlsZSgnZGlzcGxheScpID09ICdub25lJyl7DQogICAgICAgICAgICAgICAgY2hhbmdlZC5wdXNoKHtlbDogcCwgdmlzaWJpbGl0eTogcGUuZ2V0U3R5bGUoInZpc2liaWxpdHkiKX0pOw0KICAgICAgICAgICAgICAgIHAuc3R5bGUudmlzaWJpbGl0eSA9ICJoaWRkZW4iOw0KICAgICAgICAgICAgICAgIHAuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBwID0gcC5wYXJlbnROb2RlOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuX21lYXN1cmVDaGFuZ2VkID0gY2hhbmdlZDsNCiAgICAgICAgcmV0dXJuIHRoaXM7DQoNCiAgICB9LA0KDQogICAgDQogICAgZW5kTWVhc3VyZSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHZhciBjaGFuZ2VkID0gdGhpcy5fbWVhc3VyZUNoYW5nZWQ7DQogICAgICAgIGlmKGNoYW5nZWQpew0KICAgICAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gY2hhbmdlZC5sZW5ndGg7IGkgPCBsZW47IGkrKykgew0KICAgICAgICAgICAgCXZhciByID0gY2hhbmdlZFtpXTsNCiAgICAgICAgICAgIAlyLmVsLnN0eWxlLnZpc2liaWxpdHkgPSByLnZpc2liaWxpdHk7DQogICAgICAgICAgICAgICAgci5lbC5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5fbWVhc3VyZUNoYW5nZWQgPSBudWxsOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0sDQoNCiAgICANCiAgICB1cGRhdGUgOiBmdW5jdGlvbihodG1sLCBsb2FkU2NyaXB0cywgY2FsbGJhY2spew0KICAgICAgICBpZih0eXBlb2YgaHRtbCA9PSAidW5kZWZpbmVkIil7DQogICAgICAgICAgICBodG1sID0gIiI7DQogICAgICAgIH0NCiAgICAgICAgaWYobG9hZFNjcmlwdHMgIT09IHRydWUpew0KICAgICAgICAgICAgdGhpcy5kb20uaW5uZXJIVE1MID0gaHRtbDsNCiAgICAgICAgICAgIGlmKHR5cGVvZiBjYWxsYmFjayA9PSAiZnVuY3Rpb24iKXsNCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgICAgIH0NCiAgICAgICAgdmFyIGlkID0gRXh0LmlkKCk7DQogICAgICAgIHZhciBkb20gPSB0aGlzLmRvbTsNCg0KICAgICAgICBodG1sICs9ICc8c3BhbiBpZD0iJyArIGlkICsgJyI+PC9zcGFuPic7DQoNCiAgICAgICAgRS5vbkF2YWlsYWJsZShpZCwgZnVuY3Rpb24oKXsNCiAgICAgICAgICAgIHZhciBoZCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF07DQogICAgICAgICAgICB2YXIgcmUgPSAvKD86PHNjcmlwdChbXj5dKik/PikoKFxufFxyfC4pKj8pKD86PFwvc2NyaXB0PikvaWc7DQogICAgICAgICAgICB2YXIgc3JjUmUgPSAvXHNzcmM9KFtcJ1wiXSkoLio/KVwxL2k7DQogICAgICAgICAgICB2YXIgdHlwZVJlID0gL1xzdHlwZT0oW1wnXCJdKSguKj8pXDEvaTsNCg0KICAgICAgICAgICAgdmFyIG1hdGNoOw0KICAgICAgICAgICAgd2hpbGUobWF0Y2ggPSByZS5leGVjKGh0bWwpKXsNCiAgICAgICAgICAgICAgICB2YXIgYXR0cnMgPSBtYXRjaFsxXTsNCiAgICAgICAgICAgICAgICB2YXIgc3JjTWF0Y2ggPSBhdHRycyA/IGF0dHJzLm1hdGNoKHNyY1JlKSA6IGZhbHNlOw0KICAgICAgICAgICAgICAgIGlmKHNyY01hdGNoICYmIHNyY01hdGNoWzJdKXsNCiAgICAgICAgICAgICAgICAgICB2YXIgcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOw0KICAgICAgICAgICAgICAgICAgIHMuc3JjID0gc3JjTWF0Y2hbMl07DQogICAgICAgICAgICAgICAgICAgdmFyIHR5cGVNYXRjaCA9IGF0dHJzLm1hdGNoKHR5cGVSZSk7DQogICAgICAgICAgICAgICAgICAgaWYodHlwZU1hdGNoICYmIHR5cGVNYXRjaFsyXSl7DQogICAgICAgICAgICAgICAgICAgICAgIHMudHlwZSA9IHR5cGVNYXRjaFsyXTsNCiAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgaGQuYXBwZW5kQ2hpbGQocyk7DQogICAgICAgICAgICAgICAgfWVsc2UgaWYobWF0Y2hbMl0gJiYgbWF0Y2hbMl0ubGVuZ3RoID4gMCl7DQogICAgICAgICAgICAgICAgICAgIGlmKHdpbmRvdy5leGVjU2NyaXB0KSB7DQogICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5leGVjU2NyaXB0KG1hdGNoWzJdKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmV2YWwobWF0Y2hbMl0pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOw0KICAgICAgICAgICAgaWYoZWwpe2VsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWwpO30NCiAgICAgICAgICAgIGlmKHR5cGVvZiBjYWxsYmFjayA9PSAiZnVuY3Rpb24iKXsNCiAgICAgICAgICAgICAgICBjYWxsYmFjaygpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICAgICAgZG9tLmlubmVySFRNTCA9IGh0bWwucmVwbGFjZSgvKD86PHNjcmlwdC4qPz4pKChcbnxccnwuKSo/KSg/OjxcL3NjcmlwdD4pL2lnLCAiIik7DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0sDQoNCiAgICANCiAgICBsb2FkIDogZnVuY3Rpb24oKXsNCiAgICAgICAgdmFyIHVtID0gdGhpcy5nZXRVcGRhdGVNYW5hZ2VyKCk7DQogICAgICAgIHVtLnVwZGF0ZS5hcHBseSh1bSwgYXJndW1lbnRzKTsNCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSwNCg0KICAgIA0KICAgIGdldFVwZGF0ZU1hbmFnZXIgOiBmdW5jdGlvbigpew0KICAgICAgICBpZighdGhpcy51cGRhdGVNYW5hZ2VyKXsNCiAgICAgICAgICAgIHRoaXMudXBkYXRlTWFuYWdlciA9IG5ldyBFeHQuVXBkYXRlTWFuYWdlcih0aGlzKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVNYW5hZ2VyOw0KICAgIH0sDQoNCiAgICANCiAgICB1bnNlbGVjdGFibGUgOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLmRvbS51bnNlbGVjdGFibGUgPSAib24iOw0KICAgICAgICB0aGlzLnN3YWxsb3dFdmVudCgic2VsZWN0c3RhcnQiLCB0cnVlKTsNCiAgICAgICAgdGhpcy5hcHBseVN0eWxlcygiLW1vei11c2VyLXNlbGVjdDpub25lOy1raHRtbC11c2VyLXNlbGVjdDpub25lOyIpOw0KICAgICAgICB0aGlzLmFkZENsYXNzKCJ4LXVuc2VsZWN0YWJsZSIpOw0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9LA0KDQogICAgDQogICAgZ2V0Q2VudGVyWFkgOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gdGhpcy5nZXRBbGlnblRvWFkoZG9jdW1lbnQsICdjLWMnKTsNCiAgICB9LA0KDQogICAgDQogICAgY2VudGVyIDogZnVuY3Rpb24oY2VudGVySW4pew0KICAgICAgICB0aGlzLmFsaWduVG8oY2VudGVySW4gfHwgZG9jdW1lbnQsICdjLWMnKTsNCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSwNCg0KICAgIA0KICAgIGlzQm9yZGVyQm94IDogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIG5vQm94QWRqdXN0W3RoaXMuZG9tLnRhZ05hbWUudG9Mb3dlckNhc2UoKV0gfHwgRXh0LmlzQm9yZGVyQm94Ow0KICAgIH0sDQoNCiAgICANCiAgICBnZXRCb3ggOiBmdW5jdGlvbihjb250ZW50Qm94LCBsb2NhbCl7DQogICAgICAgIHZhciB4eTsNCiAgICAgICAgaWYoIWxvY2FsKXsNCiAgICAgICAgICAgIHh5ID0gdGhpcy5nZXRYWSgpOw0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIHZhciBsZWZ0ID0gcGFyc2VJbnQodGhpcy5nZXRTdHlsZSgibGVmdCIpLCAxMCkgfHwgMDsNCiAgICAgICAgICAgIHZhciB0b3AgPSBwYXJzZUludCh0aGlzLmdldFN0eWxlKCJ0b3AiKSwgMTApIHx8IDA7DQogICAgICAgICAgICB4eSA9IFtsZWZ0LCB0b3BdOw0KICAgICAgICB9DQogICAgICAgIHZhciBlbCA9IHRoaXMuZG9tLCB3ID0gZWwub2Zmc2V0V2lkdGgsIGggPSBlbC5vZmZzZXRIZWlnaHQsIGJ4Ow0KICAgICAgICBpZighY29udGVudEJveCl7DQogICAgICAgICAgICBieCA9IHt4OiB4eVswXSwgeTogeHlbMV0sIDA6IHh5WzBdLCAxOiB4eVsxXSwgd2lkdGg6IHcsIGhlaWdodDogaH07DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgdmFyIGwgPSB0aGlzLmdldEJvcmRlcldpZHRoKCJsIikrdGhpcy5nZXRQYWRkaW5nKCJsIik7DQogICAgICAgICAgICB2YXIgciA9IHRoaXMuZ2V0Qm9yZGVyV2lkdGgoInIiKSt0aGlzLmdldFBhZGRpbmcoInIiKTsNCiAgICAgICAgICAgIHZhciB0ID0gdGhpcy5nZXRCb3JkZXJXaWR0aCgidCIpK3RoaXMuZ2V0UGFkZGluZygidCIpOw0KICAgICAgICAgICAgdmFyIGIgPSB0aGlzLmdldEJvcmRlcldpZHRoKCJiIikrdGhpcy5nZXRQYWRkaW5nKCJiIik7DQogICAgICAgICAgICBieCA9IHt4OiB4eVswXStsLCB5OiB4eVsxXSt0LCAwOiB4eVswXStsLCAxOiB4eVsxXSt0LCB3aWR0aDogdy0obCtyKSwgaGVpZ2h0OiBoLSh0K2IpfTsNCiAgICAgICAgfQ0KICAgICAgICBieC5yaWdodCA9IGJ4LnggKyBieC53aWR0aDsNCiAgICAgICAgYnguYm90dG9tID0gYngueSArIGJ4LmhlaWdodDsNCiAgICAgICAgcmV0dXJuIGJ4Ow0KICAgIH0sDQoNCiAgICANCiAgICBnZXRGcmFtZVdpZHRoIDogZnVuY3Rpb24oc2lkZXMsIG9ubHlDb250ZW50Qm94KXsNCiAgICAgICAgcmV0dXJuIG9ubHlDb250ZW50Qm94ICYmIEV4dC5pc0JvcmRlckJveCA/IDAgOiAodGhpcy5nZXRQYWRkaW5nKHNpZGVzKSArIHRoaXMuZ2V0Qm9yZGVyV2lkdGgoc2lkZXMpKTsNCiAgICB9LA0KDQogICAgDQogICAgc2V0Qm94IDogZnVuY3Rpb24oYm94LCBhZGp1c3QsIGFuaW1hdGUpew0KICAgICAgICB2YXIgdyA9IGJveC53aWR0aCwgaCA9IGJveC5oZWlnaHQ7DQogICAgICAgIGlmKChhZGp1c3QgJiYgIXRoaXMuYXV0b0JveEFkanVzdCkgJiYgIXRoaXMuaXNCb3JkZXJCb3goKSl7DQogICAgICAgICAgIHcgLT0gKHRoaXMuZ2V0Qm9yZGVyV2lkdGgoImxyIikgKyB0aGlzLmdldFBhZGRpbmcoImxyIikpOw0KICAgICAgICAgICBoIC09ICh0aGlzLmdldEJvcmRlcldpZHRoKCJ0YiIpICsgdGhpcy5nZXRQYWRkaW5nKCJ0YiIpKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLnNldEJvdW5kcyhib3gueCwgYm94LnksIHcsIGgsIHRoaXMucHJlYW5pbShhcmd1bWVudHMsIDIpKTsNCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSwNCg0KICAgIA0KICAgICByZXBhaW50IDogZnVuY3Rpb24oKXsNCiAgICAgICAgdmFyIGRvbSA9IHRoaXMuZG9tOw0KICAgICAgICB0aGlzLmFkZENsYXNzKCJ4LXJlcGFpbnQiKTsNCiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpew0KICAgICAgICAgICAgRXh0LmdldChkb20pLnJlbW92ZUNsYXNzKCJ4LXJlcGFpbnQiKTsNCiAgICAgICAgfSwgMSk7DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0sDQoNCiAgICANCiAgICBnZXRNYXJnaW5zIDogZnVuY3Rpb24oc2lkZSl7DQogICAgICAgIGlmKCFzaWRlKXsNCiAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgICAgdG9wOiBwYXJzZUludCh0aGlzLmdldFN0eWxlKCJtYXJnaW4tdG9wIiksIDEwKSB8fCAwLA0KICAgICAgICAgICAgICAgIGxlZnQ6IHBhcnNlSW50KHRoaXMuZ2V0U3R5bGUoIm1hcmdpbi1sZWZ0IiksIDEwKSB8fCAwLA0KICAgICAgICAgICAgICAgIGJvdHRvbTogcGFyc2VJbnQodGhpcy5nZXRTdHlsZSgibWFyZ2luLWJvdHRvbSIpLCAxMCkgfHwgMCwNCiAgICAgICAgICAgICAgICByaWdodDogcGFyc2VJbnQodGhpcy5nZXRTdHlsZSgibWFyZ2luLXJpZ2h0IiksIDEwKSB8fCAwDQogICAgICAgICAgICB9Ow0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLmFkZFN0eWxlcyhzaWRlLCBFbC5tYXJnaW5zKTsNCiAgICAgICAgIH0NCiAgICB9LA0KDQogICAgCiAgICBhZGRTdHlsZXMgOiBmdW5jdGlvbihzaWRlcywgc3R5bGVzKXsNCiAgICAgICAgdmFyIHZhbCA9IDAsIHYsIHc7DQogICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IHNpZGVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXsNCiAgICAgICAgICAgIHYgPSB0aGlzLmdldFN0eWxlKHN0eWxlc1tzaWRlcy5jaGFyQXQoaSldKTsNCiAgICAgICAgICAgIGlmKHYpew0KICAgICAgICAgICAgICAgICB3ID0gcGFyc2VJbnQodiwgMTApOw0KICAgICAgICAgICAgICAgICBpZih3KXsgdmFsICs9IHc7IH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdmFsOw0KICAgIH0sDQoNCiAgICANCiAgICBjcmVhdGVQcm94eSA6IGZ1bmN0aW9uKGNvbmZpZywgcmVuZGVyVG8sIG1hdGNoQm94KXsNCiAgICAgICAgaWYocmVuZGVyVG8pew0KICAgICAgICAgICAgcmVuZGVyVG8gPSBFeHQuZ2V0RG9tKHJlbmRlclRvKTsNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICByZW5kZXJUbyA9IGRvY3VtZW50LmJvZHk7DQogICAgICAgIH0NCiAgICAgICAgY29uZmlnID0gdHlwZW9mIGNvbmZpZyA9PSAib2JqZWN0IiA/DQogICAgICAgICAgICBjb25maWcgOiB7dGFnIDogImRpdiIsIGNsczogY29uZmlnfTsNCiAgICAgICAgdmFyIHByb3h5ID0gRXh0LkRvbUhlbHBlci5hcHBlbmQocmVuZGVyVG8sIGNvbmZpZywgdHJ1ZSk7DQogICAgICAgIGlmKG1hdGNoQm94KXsNCiAgICAgICAgICAgcHJveHkuc2V0Qm94KHRoaXMuZ2V0Qm94KCkpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBwcm94eTsNCiAgICB9LA0KDQogICAgDQogICAgbWFzayA6IGZ1bmN0aW9uKG1zZywgbXNnQ2xzKXsNCiAgICAgICAgaWYodGhpcy5nZXRTdHlsZSgicG9zaXRpb24iKSA9PSAic3RhdGljIil7DQogICAgICAgICAgICB0aGlzLnNldFN0eWxlKCJwb3NpdGlvbiIsICJyZWxhdGl2ZSIpOw0KICAgICAgICB9DQogICAgICAgIGlmKCF0aGlzLl9tYXNrKXsNCiAgICAgICAgICAgIHRoaXMuX21hc2sgPSBFeHQuRG9tSGVscGVyLmFwcGVuZCh0aGlzLmRvbSwge2NsczoiZXh0LWVsLW1hc2sifSwgdHJ1ZSk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5hZGRDbGFzcygieC1tYXNrZWQiKTsNCiAgICAgICAgdGhpcy5fbWFzay5zZXREaXNwbGF5ZWQodHJ1ZSk7DQogICAgICAgIGlmKHR5cGVvZiBtc2cgPT0gJ3N0cmluZycpew0KICAgICAgICAgICAgaWYoIXRoaXMuX21hc2tNc2cpew0KICAgICAgICAgICAgICAgIHRoaXMuX21hc2tNc2cgPSBFeHQuRG9tSGVscGVyLmFwcGVuZCh0aGlzLmRvbSwge2NsczoiZXh0LWVsLW1hc2stbXNnIiwgY246e3RhZzonZGl2J319LCB0cnVlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHZhciBtbSA9IHRoaXMuX21hc2tNc2c7DQogICAgICAgICAgICBtbS5kb20uY2xhc3NOYW1lID0gbXNnQ2xzID8gImV4dC1lbC1tYXNrLW1zZyAiICsgbXNnQ2xzIDogImV4dC1lbC1tYXNrLW1zZyI7DQogICAgICAgICAgICBtbS5kb20uZmlyc3RDaGlsZC5pbm5lckhUTUwgPSBtc2c7DQogICAgICAgICAgICBtbS5zZXREaXNwbGF5ZWQodHJ1ZSk7DQogICAgICAgICAgICBtbS5jZW50ZXIodGhpcyk7DQogICAgICAgIH0NCiAgICAgICAgaWYoRXh0LmlzSUUgJiYgIShFeHQuaXNJRTcgJiYgRXh0LmlzU3RyaWN0KSAmJiB0aGlzLmdldFN0eWxlKCdoZWlnaHQnKSA9PSAnYXV0bycpeyAKICAgICAgICAgICAgdGhpcy5fbWFzay5zZXRIZWlnaHQodGhpcy5nZXRIZWlnaHQoKSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHRoaXMuX21hc2s7DQogICAgfSwNCg0KICAgIA0KICAgIHVubWFzayA6IGZ1bmN0aW9uKHJlbW92ZUVsKXsNCiAgICAgICAgaWYodGhpcy5fbWFzayl7DQogICAgICAgICAgICBpZihyZW1vdmVFbCA9PT0gdHJ1ZSl7DQogICAgICAgICAgICAgICAgdGhpcy5fbWFzay5yZW1vdmUoKTsNCiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fbWFzazsNCiAgICAgICAgICAgICAgICBpZih0aGlzLl9tYXNrTXNnKXsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza01zZy5yZW1vdmUoKTsNCiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX21hc2tNc2c7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgdGhpcy5fbWFzay5zZXREaXNwbGF5ZWQoZmFsc2UpOw0KICAgICAgICAgICAgICAgIGlmKHRoaXMuX21hc2tNc2cpew0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrTXNnLnNldERpc3BsYXllZChmYWxzZSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHRoaXMucmVtb3ZlQ2xhc3MoIngtbWFza2VkIik7DQogICAgfSwNCg0KICAgIA0KICAgIGlzTWFza2VkIDogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIHRoaXMuX21hc2sgJiYgdGhpcy5fbWFzay5pc1Zpc2libGUoKTsNCiAgICB9LA0KDQogICAgDQogICAgY3JlYXRlU2hpbSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpOw0KICAgICAgICBlbC5mcmFtZUJvcmRlciA9ICdubyc7DQogICAgICAgIGVsLmNsYXNzTmFtZSA9ICdleHQtc2hpbSc7DQogICAgICAgIGlmKEV4dC5pc0lFICYmIEV4dC5pc1NlY3VyZSl7DQogICAgICAgICAgICBlbC5zcmMgPSBFeHQuU1NMX1NFQ1VSRV9VUkw7DQogICAgICAgIH0NCiAgICAgICAgdmFyIHNoaW0gPSBFeHQuZ2V0KHRoaXMuZG9tLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGVsLCB0aGlzLmRvbSkpOw0KICAgICAgICBzaGltLmF1dG9Cb3hBZGp1c3QgPSBmYWxzZTsNCiAgICAgICAgcmV0dXJuIHNoaW07DQogICAgfSwNCg0KICAgIA0KICAgIHJlbW92ZSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIGlmKHRoaXMuZG9tLnBhcmVudE5vZGUpew0KICAgICAgICAgICAgdGhpcy5kb20ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmRvbSk7DQogICAgICAgIH0NCiAgICAgICAgZGVsZXRlIEVsLmNhY2hlW3RoaXMuZG9tLmlkXTsNCiAgICB9LA0KDQogICAgDQogICAgYWRkQ2xhc3NPbk92ZXIgOiBmdW5jdGlvbihjbGFzc05hbWUsIHByZXZlbnRGbGlja2VyKXsNCiAgICAgICAgdGhpcy5vbigibW91c2VvdmVyIiwgZnVuY3Rpb24oKXsNCiAgICAgICAgICAgIEV4dC5mbHkodGhpcywgJ19pbnRlcm5hbCcpLmFkZENsYXNzKGNsYXNzTmFtZSk7DQogICAgICAgIH0sIHRoaXMuZG9tKTsNCiAgICAgICAgdmFyIHJlbW92ZUZuID0gZnVuY3Rpb24oZSl7DQogICAgICAgICAgICBpZihwcmV2ZW50RmxpY2tlciAhPT0gdHJ1ZSB8fCAhZS53aXRoaW4odGhpcywgdHJ1ZSkpew0KICAgICAgICAgICAgICAgIEV4dC5mbHkodGhpcywgJ19pbnRlcm5hbCcpLnJlbW92ZUNsYXNzKGNsYXNzTmFtZSk7DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgICAgIHRoaXMub24oIm1vdXNlb3V0IiwgcmVtb3ZlRm4sIHRoaXMuZG9tKTsNCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSwNCg0KICAgIA0KICAgIGFkZENsYXNzT25Gb2N1cyA6IGZ1bmN0aW9uKGNsYXNzTmFtZSl7DQogICAgICAgIHRoaXMub24oImZvY3VzIiwgZnVuY3Rpb24oKXsNCiAgICAgICAgICAgIEV4dC5mbHkodGhpcywgJ19pbnRlcm5hbCcpLmFkZENsYXNzKGNsYXNzTmFtZSk7DQogICAgICAgIH0sIHRoaXMuZG9tKTsNCiAgICAgICAgdGhpcy5vbigiYmx1ciIsIGZ1bmN0aW9uKCl7DQogICAgICAgICAgICBFeHQuZmx5KHRoaXMsICdfaW50ZXJuYWwnKS5yZW1vdmVDbGFzcyhjbGFzc05hbWUpOw0KICAgICAgICB9LCB0aGlzLmRvbSk7DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0sDQogICAgDQogICAgYWRkQ2xhc3NPbkNsaWNrIDogZnVuY3Rpb24oY2xhc3NOYW1lKXsNCiAgICAgICAgdmFyIGRvbSA9IHRoaXMuZG9tOw0KICAgICAgICB0aGlzLm9uKCJtb3VzZWRvd24iLCBmdW5jdGlvbigpew0KICAgICAgICAgICAgRXh0LmZseShkb20sICdfaW50ZXJuYWwnKS5hZGRDbGFzcyhjbGFzc05hbWUpOw0KICAgICAgICAgICAgdmFyIGQgPSBFeHQuZ2V0KGRvY3VtZW50KTsNCiAgICAgICAgICAgIHZhciBmbiA9IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICAgRXh0LmZseShkb20sICdfaW50ZXJuYWwnKS5yZW1vdmVDbGFzcyhjbGFzc05hbWUpOw0KICAgICAgICAgICAgICAgIGQucmVtb3ZlTGlzdGVuZXIoIm1vdXNldXAiLCBmbik7DQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgZC5vbigibW91c2V1cCIsIGZuKTsNCiAgICAgICAgfSk7DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0sDQoNCiAgICANCiAgICBzd2FsbG93RXZlbnQgOiBmdW5jdGlvbihldmVudE5hbWUsIHByZXZlbnREZWZhdWx0KXsNCiAgICAgICAgdmFyIGZuID0gZnVuY3Rpb24oZSl7DQogICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOw0KICAgICAgICAgICAgaWYocHJldmVudERlZmF1bHQpew0KICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfTsNCiAgICAgICAgaWYoZXZlbnROYW1lIGluc3RhbmNlb2YgQXJyYXkpew0KICAgICAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gZXZlbnROYW1lLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXsNCiAgICAgICAgICAgICAgICAgdGhpcy5vbihldmVudE5hbWVbaV0sIGZuKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiB0aGlzOw0KICAgICAgICB9DQogICAgICAgIHRoaXMub24oZXZlbnROYW1lLCBmbik7DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0sDQoNCiAgICANCiAgZml0VG9QYXJlbnREZWxlZ2F0ZSA6IEV4dC5lbXB0eUZuLCAKDQogICAgDQogICAgZml0VG9QYXJlbnQgOiBmdW5jdGlvbihtb25pdG9yUmVzaXplLCB0YXJnZXRQYXJlbnQpIHsNCiAgICAgIEV4dC5FdmVudE1hbmFnZXIucmVtb3ZlUmVzaXplTGlzdGVuZXIodGhpcy5maXRUb1BhcmVudERlbGVnYXRlKTsgCiAgICAgIHRoaXMuZml0VG9QYXJlbnREZWxlZ2F0ZSA9IEV4dC5lbXB0eUZuOyAKICAgICAgaWYgKG1vbml0b3JSZXNpemUgPT09IHRydWUgJiYgIXRoaXMuZG9tLnBhcmVudE5vZGUpIHsgCiAgICAgICAgcmV0dXJuOw0KICAgICAgfQ0KICAgICAgdmFyIHAgPSBFeHQuZ2V0KHRhcmdldFBhcmVudCB8fCB0aGlzLmRvbS5wYXJlbnROb2RlKTsNCiAgICAgIHRoaXMuc2V0U2l6ZShwLmdldENvbXB1dGVkV2lkdGgoKSAtIHAuZ2V0RnJhbWVXaWR0aCgnbHInKSwgcC5nZXRDb21wdXRlZEhlaWdodCgpIC0gcC5nZXRGcmFtZVdpZHRoKCd0YicpKTsNCiAgICAgIGlmIChtb25pdG9yUmVzaXplID09PSB0cnVlKSB7DQogICAgICAgIHRoaXMuZml0VG9QYXJlbnREZWxlZ2F0ZSA9IHRoaXMuZml0VG9QYXJlbnQuY3JlYXRlRGVsZWdhdGUodGhpcywgW3RydWUsIHRhcmdldFBhcmVudF0pOw0KICAgICAgICBFeHQuRXZlbnRNYW5hZ2VyLm9uV2luZG93UmVzaXplKHRoaXMuZml0VG9QYXJlbnREZWxlZ2F0ZSk7DQogICAgICB9DQogICAgICByZXR1cm4gdGhpczsNCiAgICB9LA0KDQogICAgDQogICAgZ2V0TmV4dFNpYmxpbmcgOiBmdW5jdGlvbigpew0KICAgICAgICB2YXIgbiA9IHRoaXMuZG9tLm5leHRTaWJsaW5nOw0KICAgICAgICB3aGlsZShuICYmIG4ubm9kZVR5cGUgIT0gMSl7DQogICAgICAgICAgICBuID0gbi5uZXh0U2libGluZzsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gbjsNCiAgICB9LA0KDQogICAgDQogICAgZ2V0UHJldlNpYmxpbmcgOiBmdW5jdGlvbigpew0KICAgICAgICB2YXIgbiA9IHRoaXMuZG9tLnByZXZpb3VzU2libGluZzsNCiAgICAgICAgd2hpbGUobiAmJiBuLm5vZGVUeXBlICE9IDEpew0KICAgICAgICAgICAgbiA9IG4ucHJldmlvdXNTaWJsaW5nOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBuOw0KICAgIH0sDQoNCg0KICAgIA0KICAgIGFwcGVuZENoaWxkOiBmdW5jdGlvbihlbCl7DQogICAgICAgIGVsID0gRXh0LmdldChlbCk7DQogICAgICAgIGVsLmFwcGVuZFRvKHRoaXMpOw0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9LA0KDQogICAgDQogICAgY3JlYXRlQ2hpbGQ6IGZ1bmN0aW9uKGNvbmZpZywgaW5zZXJ0QmVmb3JlLCByZXR1cm5Eb20pew0KICAgICAgICBjb25maWcgPSBjb25maWcgfHwge3RhZzonZGl2J307DQogICAgICAgIGlmKGluc2VydEJlZm9yZSl7DQogICAgICAgICAgICByZXR1cm4gRXh0LkRvbUhlbHBlci5pbnNlcnRCZWZvcmUoaW5zZXJ0QmVmb3JlLCBjb25maWcsIHJldHVybkRvbSAhPT0gdHJ1ZSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIEV4dC5Eb21IZWxwZXJbIXRoaXMuZG9tLmZpcnN0Q2hpbGQgPyAnb3ZlcndyaXRlJyA6ICdhcHBlbmQnXSh0aGlzLmRvbSwgY29uZmlnLCAgcmV0dXJuRG9tICE9PSB0cnVlKTsNCiAgICB9LA0KDQogICAgDQogICAgYXBwZW5kVG86IGZ1bmN0aW9uKGVsKXsNCiAgICAgICAgZWwgPSBFeHQuZ2V0RG9tKGVsKTsNCiAgICAgICAgZWwuYXBwZW5kQ2hpbGQodGhpcy5kb20pOw0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9LA0KDQogICAgDQogICAgaW5zZXJ0QmVmb3JlOiBmdW5jdGlvbihlbCl7DQogICAgICAgIGVsID0gRXh0LmdldERvbShlbCk7DQogICAgICAgIGVsLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMuZG9tLCBlbCk7DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0sDQoNCiAgICANCiAgICBpbnNlcnRBZnRlcjogZnVuY3Rpb24oZWwpew0KICAgICAgICBlbCA9IEV4dC5nZXREb20oZWwpOw0KICAgICAgICBlbC5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLmRvbSwgZWwubmV4dFNpYmxpbmcpOw0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9LA0KDQogICAgDQogICAgaW5zZXJ0Rmlyc3Q6IGZ1bmN0aW9uKGVsLCByZXR1cm5Eb20pew0KICAgICAgICBlbCA9IGVsIHx8IHt9Ow0KICAgICAgICBpZih0eXBlb2YgZWwgPT0gJ29iamVjdCcgJiYgIWVsLm5vZGVUeXBlKXsgCiAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUNoaWxkKGVsLCB0aGlzLmRvbS5maXJzdENoaWxkLCByZXR1cm5Eb20pOw0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIGVsID0gRXh0LmdldERvbShlbCk7DQogICAgICAgICAgICB0aGlzLmRvbS5pbnNlcnRCZWZvcmUoZWwsIHRoaXMuZG9tLmZpcnN0Q2hpbGQpOw0KICAgICAgICAgICAgcmV0dXJuICFyZXR1cm5Eb20gPyBFeHQuZ2V0KGVsKSA6IGVsOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIGluc2VydFNpYmxpbmc6IGZ1bmN0aW9uKGVsLCB3aGVyZSwgcmV0dXJuRG9tKXsNCiAgICAgICAgd2hlcmUgPSB3aGVyZSA/IHdoZXJlLnRvTG93ZXJDYXNlKCkgOiAnYmVmb3JlJzsNCiAgICAgICAgZWwgPSBlbCB8fCB7fTsNCiAgICAgICAgdmFyIHJ0LCByZWZOb2RlID0gd2hlcmUgPT0gJ2JlZm9yZScgPyB0aGlzLmRvbSA6IHRoaXMuZG9tLm5leHRTaWJsaW5nOw0KDQogICAgICAgIGlmKHR5cGVvZiBlbCA9PSAnb2JqZWN0JyAmJiAhZWwubm9kZVR5cGUpeyAKICAgICAgICAgICAgaWYod2hlcmUgPT0gJ2FmdGVyJyAmJiAhdGhpcy5kb20ubmV4dFNpYmxpbmcpew0KICAgICAgICAgICAgICAgIHJ0ID0gRXh0LkRvbUhlbHBlci5hcHBlbmQodGhpcy5kb20ucGFyZW50Tm9kZSwgZWwsICFyZXR1cm5Eb20pOw0KICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgcnQgPSBFeHQuRG9tSGVscGVyW3doZXJlID09ICdhZnRlcicgPyAnaW5zZXJ0QWZ0ZXInIDogJ2luc2VydEJlZm9yZSddKHRoaXMuZG9tLCBlbCwgIXJldHVybkRvbSk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICBydCA9IHRoaXMuZG9tLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKEV4dC5nZXREb20oZWwpLA0KICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgPT0gJ2JlZm9yZScgPyB0aGlzLmRvbSA6IHRoaXMuZG9tLm5leHRTaWJsaW5nKTsNCiAgICAgICAgICAgIGlmKCFyZXR1cm5Eb20pew0KICAgICAgICAgICAgICAgIHJ0ID0gRXh0LmdldChydCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHJ0Ow0KICAgIH0sDQoNCiAgICANCiAgICB3cmFwOiBmdW5jdGlvbihjb25maWcsIHJldHVybkRvbSl7DQogICAgICAgIGlmKCFjb25maWcpew0KICAgICAgICAgICAgY29uZmlnID0ge3RhZzogImRpdiJ9Ow0KICAgICAgICB9DQogICAgICAgIHZhciBuZXdFbCA9IEV4dC5Eb21IZWxwZXIuaW5zZXJ0QmVmb3JlKHRoaXMuZG9tLCBjb25maWcsICFyZXR1cm5Eb20pOw0KICAgICAgICBuZXdFbC5kb20gPyBuZXdFbC5kb20uYXBwZW5kQ2hpbGQodGhpcy5kb20pIDogbmV3RWwuYXBwZW5kQ2hpbGQodGhpcy5kb20pOw0KICAgICAgICByZXR1cm4gbmV3RWw7DQogICAgfSwNCg0KICAgIA0KICAgIHJlcGxhY2U6IGZ1bmN0aW9uKGVsKXsNCiAgICAgICAgZWwgPSBFeHQuZ2V0KGVsKTsNCiAgICAgICAgdGhpcy5pbnNlcnRCZWZvcmUoZWwpOw0KICAgICAgICBlbC5yZW1vdmUoKTsNCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSwNCg0KICAgIA0KICAgIGluc2VydEh0bWwgOiBmdW5jdGlvbih3aGVyZSwgaHRtbCwgcmV0dXJuRWwpew0KICAgICAgICB2YXIgZWwgPSBFeHQuRG9tSGVscGVyLmluc2VydEh0bWwod2hlcmUsIHRoaXMuZG9tLCBodG1sKTsNCiAgICAgICAgcmV0dXJuIHJldHVybkVsID8gRXh0LmdldChlbCkgOiBlbDsNCiAgICB9LA0KDQogICAgDQogICAgc2V0IDogZnVuY3Rpb24obywgdXNlU2V0KXsNCiAgICAgICAgdmFyIGVsID0gdGhpcy5kb207DQogICAgICAgIHVzZVNldCA9IHR5cGVvZiB1c2VTZXQgPT0gJ3VuZGVmaW5lZCcgPyAoZWwuc2V0QXR0cmlidXRlID8gdHJ1ZSA6IGZhbHNlKSA6IHVzZVNldDsNCiAgICAgICAgZm9yKHZhciBhdHRyIGluIG8pew0KICAgICAgICAgICAgaWYoYXR0ciA9PSAic3R5bGUiIHx8IHR5cGVvZiBvW2F0dHJdID09ICJmdW5jdGlvbiIpIGNvbnRpbnVlOw0KICAgICAgICAgICAgaWYoYXR0cj09ImNscyIpew0KICAgICAgICAgICAgICAgIGVsLmNsYXNzTmFtZSA9IG9bImNscyJdOw0KICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgaWYodXNlU2V0KSBlbC5zZXRBdHRyaWJ1dGUoYXR0ciwgb1thdHRyXSk7DQogICAgICAgICAgICAgICAgZWxzZSBlbFthdHRyXSA9IG9bYXR0cl07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgaWYoby5zdHlsZSl7DQogICAgICAgICAgICBFeHQuRG9tSGVscGVyLmFwcGx5U3R5bGVzKGVsLCBvLnN0eWxlKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9LA0KDQogICAgDQogICAgYWRkS2V5TGlzdGVuZXIgOiBmdW5jdGlvbihrZXksIGZuLCBzY29wZSl7DQogICAgICAgIHZhciBjb25maWc7DQogICAgICAgIGlmKHR5cGVvZiBrZXkgIT0gIm9iamVjdCIgfHwga2V5IGluc3RhbmNlb2YgQXJyYXkpew0KICAgICAgICAgICAgY29uZmlnID0gew0KICAgICAgICAgICAgICAgIGtleToga2V5LA0KICAgICAgICAgICAgICAgIGZuOiBmbiwNCiAgICAgICAgICAgICAgICBzY29wZTogc2NvcGUNCiAgICAgICAgICAgIH07DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgY29uZmlnID0gew0KICAgICAgICAgICAgICAgIGtleSA6IGtleS5rZXksDQogICAgICAgICAgICAgICAgc2hpZnQgOiBrZXkuc2hpZnQsDQogICAgICAgICAgICAgICAgY3RybCA6IGtleS5jdHJsLA0KICAgICAgICAgICAgICAgIGFsdCA6IGtleS5hbHQsDQogICAgICAgICAgICAgICAgZm46IGZuLA0KICAgICAgICAgICAgICAgIHNjb3BlOiBzY29wZQ0KICAgICAgICAgICAgfTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gbmV3IEV4dC5LZXlNYXAodGhpcywgY29uZmlnKTsNCiAgICB9LA0KDQogICAgDQogICAgYWRkS2V5TWFwIDogZnVuY3Rpb24oY29uZmlnKXsNCiAgICAgICAgcmV0dXJuIG5ldyBFeHQuS2V5TWFwKHRoaXMsIGNvbmZpZyk7DQogICAgfSwNCg0KICAgIA0KICAgICBpc1Njcm9sbGFibGUgOiBmdW5jdGlvbigpew0KICAgICAgICB2YXIgZG9tID0gdGhpcy5kb207DQogICAgICAgIHJldHVybiBkb20uc2Nyb2xsSGVpZ2h0ID4gZG9tLmNsaWVudEhlaWdodCB8fCBkb20uc2Nyb2xsV2lkdGggPiBkb20uY2xpZW50V2lkdGg7DQogICAgfSwNCg0KICAgIA0KDQogICAgc2Nyb2xsVG8gOiBmdW5jdGlvbihzaWRlLCB2YWx1ZSwgYW5pbWF0ZSl7DQogICAgICAgIHZhciBwcm9wID0gc2lkZS50b0xvd2VyQ2FzZSgpID09ICJsZWZ0IiA/ICJzY3JvbGxMZWZ0IiA6ICJzY3JvbGxUb3AiOw0KICAgICAgICBpZighYW5pbWF0ZSB8fCAhQSl7DQogICAgICAgICAgICB0aGlzLmRvbVtwcm9wXSA9IHZhbHVlOw0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIHZhciB0byA9IHByb3AgPT0gInNjcm9sbExlZnQiID8gW3ZhbHVlLCB0aGlzLmRvbS5zY3JvbGxUb3BdIDogW3RoaXMuZG9tLnNjcm9sbExlZnQsIHZhbHVlXTsNCiAgICAgICAgICAgIHRoaXMuYW5pbSh7c2Nyb2xsOiB7InRvIjogdG99fSwgdGhpcy5wcmVhbmltKGFyZ3VtZW50cywgMiksICdzY3JvbGwnKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9LA0KDQogICAgDQogICAgIHNjcm9sbCA6IGZ1bmN0aW9uKGRpcmVjdGlvbiwgZGlzdGFuY2UsIGFuaW1hdGUpew0KICAgICAgICAgaWYoIXRoaXMuaXNTY3JvbGxhYmxlKCkpew0KICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgIH0NCiAgICAgICAgIHZhciBlbCA9IHRoaXMuZG9tOw0KICAgICAgICAgdmFyIGwgPSBlbC5zY3JvbGxMZWZ0LCB0ID0gZWwuc2Nyb2xsVG9wOw0KICAgICAgICAgdmFyIHcgPSBlbC5zY3JvbGxXaWR0aCwgaCA9IGVsLnNjcm9sbEhlaWdodDsNCiAgICAgICAgIHZhciBjdyA9IGVsLmNsaWVudFdpZHRoLCBjaCA9IGVsLmNsaWVudEhlaWdodDsNCiAgICAgICAgIGRpcmVjdGlvbiA9IGRpcmVjdGlvbi50b0xvd2VyQ2FzZSgpOw0KICAgICAgICAgdmFyIHNjcm9sbGVkID0gZmFsc2U7DQogICAgICAgICB2YXIgYSA9IHRoaXMucHJlYW5pbShhcmd1bWVudHMsIDIpOw0KICAgICAgICAgc3dpdGNoKGRpcmVjdGlvbil7DQogICAgICAgICAgICAgY2FzZSAibCI6DQogICAgICAgICAgICAgY2FzZSAibGVmdCI6DQogICAgICAgICAgICAgICAgIGlmKHcgLSBsID4gY3cpew0KICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSBNYXRoLm1pbihsICsgZGlzdGFuY2UsIHctY3cpOw0KICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUbygibGVmdCIsIHYsIGEpOw0KICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsZWQgPSB0cnVlOw0KICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAiciI6DQogICAgICAgICAgICBjYXNlICJyaWdodCI6DQogICAgICAgICAgICAgICAgIGlmKGwgPiAwKXsNCiAgICAgICAgICAgICAgICAgICAgIHZhciB2ID0gTWF0aC5tYXgobCAtIGRpc3RhbmNlLCAwKTsNCiAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG8oImxlZnQiLCB2LCBhKTsNCiAgICAgICAgICAgICAgICAgICAgIHNjcm9sbGVkID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGNhc2UgInQiOg0KICAgICAgICAgICAgY2FzZSAidG9wIjoNCiAgICAgICAgICAgIGNhc2UgInVwIjoNCiAgICAgICAgICAgICAgICAgaWYodCA+IDApew0KICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSBNYXRoLm1heCh0IC0gZGlzdGFuY2UsIDApOw0KICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUbygidG9wIiwgdiwgYSk7DQogICAgICAgICAgICAgICAgICAgICBzY3JvbGxlZCA9IHRydWU7DQogICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBjYXNlICJiIjoNCiAgICAgICAgICAgIGNhc2UgImJvdHRvbSI6DQogICAgICAgICAgICBjYXNlICJkb3duIjoNCiAgICAgICAgICAgICAgICAgaWYoaCAtIHQgPiBjaCl7DQogICAgICAgICAgICAgICAgICAgICB2YXIgdiA9IE1hdGgubWluKHQgKyBkaXN0YW5jZSwgaC1jaCk7DQogICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvKCJ0b3AiLCB2LCBhKTsNCiAgICAgICAgICAgICAgICAgICAgIHNjcm9sbGVkID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgIH0NCiAgICAgICAgIHJldHVybiBzY3JvbGxlZDsNCiAgICB9LA0KDQogICAgDQogICAgdHJhbnNsYXRlUG9pbnRzIDogZnVuY3Rpb24oeCwgeSl7DQogICAgICAgIGlmKHR5cGVvZiB4ID09ICdvYmplY3QnIHx8IHggaW5zdGFuY2VvZiBBcnJheSl7DQogICAgICAgICAgICB5ID0geFsxXTsgeCA9IHhbMF07DQogICAgICAgIH0NCiAgICAgICAgdmFyIHAgPSB0aGlzLmdldFN0eWxlKCdwb3NpdGlvbicpOw0KICAgICAgICB2YXIgbyA9IHRoaXMuZ2V0WFkoKTsNCg0KICAgICAgICB2YXIgbCA9IHBhcnNlSW50KHRoaXMuZ2V0U3R5bGUoJ2xlZnQnKSwgMTApOw0KICAgICAgICB2YXIgdCA9IHBhcnNlSW50KHRoaXMuZ2V0U3R5bGUoJ3RvcCcpLCAxMCk7DQoNCiAgICAgICAgaWYoaXNOYU4obCkpew0KICAgICAgICAgICAgbCA9IChwID09ICJyZWxhdGl2ZSIpID8gMCA6IHRoaXMuZG9tLm9mZnNldExlZnQ7DQogICAgICAgIH0NCiAgICAgICAgaWYoaXNOYU4odCkpew0KICAgICAgICAgICAgdCA9IChwID09ICJyZWxhdGl2ZSIpID8gMCA6IHRoaXMuZG9tLm9mZnNldFRvcDsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiB7bGVmdDogKHggLSBvWzBdICsgbCksIHRvcDogKHkgLSBvWzFdICsgdCl9Ow0KICAgIH0sDQoNCiAgICANCiAgICBnZXRTY3JvbGwgOiBmdW5jdGlvbigpew0KICAgICAgICB2YXIgZCA9IHRoaXMuZG9tLCBkb2MgPSBkb2N1bWVudDsNCiAgICAgICAgaWYoZCA9PSBkb2MgfHwgZCA9PSBkb2MuYm9keSl7DQogICAgICAgICAgICB2YXIgbCA9IHdpbmRvdy5wYWdlWE9mZnNldCB8fCBkb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQgfHwgZG9jLmJvZHkuc2Nyb2xsTGVmdCB8fCAwOw0KICAgICAgICAgICAgdmFyIHQgPSB3aW5kb3cucGFnZVlPZmZzZXQgfHwgZG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgfHwgZG9jLmJvZHkuc2Nyb2xsVG9wIHx8IDA7DQogICAgICAgICAgICByZXR1cm4ge2xlZnQ6IGwsIHRvcDogdH07DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgcmV0dXJuIHtsZWZ0OiBkLnNjcm9sbExlZnQsIHRvcDogZC5zY3JvbGxUb3B9Ow0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIGdldENvbG9yIDogZnVuY3Rpb24oYXR0ciwgZGVmYXVsdFZhbHVlLCBwcmVmaXgpew0KICAgICAgICB2YXIgdiA9IHRoaXMuZ2V0U3R5bGUoYXR0cik7DQogICAgICAgIGlmKCF2IHx8IHYgPT0gInRyYW5zcGFyZW50IiB8fCB2ID09ICJpbmhlcml0Iikgew0KICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgY29sb3IgPSB0eXBlb2YgcHJlZml4ID09ICJ1bmRlZmluZWQiID8gIiMiIDogcHJlZml4Ow0KICAgICAgICBpZih2LnN1YnN0cigwLCA0KSA9PSAicmdiKCIpew0KICAgICAgICAgICAgdmFyIHJ2cyA9IHYuc2xpY2UoNCwgdi5sZW5ndGggLTEpLnNwbGl0KCIsIik7DQogICAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgMzsgaSsrKXsNCiAgICAgICAgICAgICAgICB2YXIgaCA9IHBhcnNlSW50KHJ2c1tpXSkudG9TdHJpbmcoMTYpOw0KICAgICAgICAgICAgICAgIGlmKGggPCAxNil7DQogICAgICAgICAgICAgICAgICAgIGggPSAiMCIgKyBoOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBjb2xvciArPSBoOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgaWYodi5zdWJzdHIoMCwgMSkgPT0gIiMiKXsNCiAgICAgICAgICAgICAgICBpZih2Lmxlbmd0aCA9PSA0KSB7DQogICAgICAgICAgICAgICAgICAgIGZvcih2YXIgaSA9IDE7IGkgPCA0OyBpKyspew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSB2LmNoYXJBdChpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yICs9ICBjICsgYzsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH1lbHNlIGlmKHYubGVuZ3RoID09IDcpew0KICAgICAgICAgICAgICAgICAgICBjb2xvciArPSB2LnN1YnN0cigxKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuKGNvbG9yLmxlbmd0aCA+IDUgPyBjb2xvci50b0xvd2VyQ2FzZSgpIDogZGVmYXVsdFZhbHVlKTsNCiAgICB9LA0KDQogICAgDQogICAgYm94V3JhcCA6IGZ1bmN0aW9uKGNscyl7DQogICAgICAgIGNscyA9IGNscyB8fCAneC1ib3gnOw0KICAgICAgICB2YXIgZWwgPSBFeHQuZ2V0KHRoaXMuaW5zZXJ0SHRtbCgnYmVmb3JlQmVnaW4nLCBTdHJpbmcuZm9ybWF0KCc8ZGl2IGNsYXNzPSJ7MH0iPicrRWwuYm94TWFya3VwKyc8L2Rpdj4nLCBjbHMpKSk7DQogICAgICAgIGVsLmNoaWxkKCcuJytjbHMrJy1tYycpLmRvbS5hcHBlbmRDaGlsZCh0aGlzLmRvbSk7DQogICAgICAgIHJldHVybiBlbDsNCiAgICB9LA0KDQogICAgDQogICAgZ2V0QXR0cmlidXRlTlMgOiBFeHQuaXNJRSA/IGZ1bmN0aW9uKG5zLCBuYW1lKXsNCiAgICAgICAgdmFyIGQgPSB0aGlzLmRvbTsNCiAgICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgZFtucysiOiIrbmFtZV07DQogICAgICAgIGlmKHR5cGUgIT0gJ3VuZGVmaW5lZCcgJiYgdHlwZSAhPSAndW5rbm93bicpew0KICAgICAgICAgICAgcmV0dXJuIGRbbnMrIjoiK25hbWVdOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBkW25hbWVdOw0KICAgIH0gOiBmdW5jdGlvbihucywgbmFtZSl7DQogICAgICAgIHZhciBkID0gdGhpcy5kb207DQogICAgICAgIHJldHVybiBkLmdldEF0dHJpYnV0ZU5TKG5zLCBuYW1lKSB8fCBkLmdldEF0dHJpYnV0ZShucysiOiIrbmFtZSkgfHwgZC5nZXRBdHRyaWJ1dGUobmFtZSkgfHwgZFtuYW1lXTsNCiAgICB9DQp9Ow0KDQp2YXIgZXAgPSBFbC5wcm90b3R5cGU7DQoNCg0KZXAub24gPSBlcC5hZGRMaXN0ZW5lcjsNCiAgICAKZXAubW9uID0gZXAuYWRkTGlzdGVuZXI7DQoNCg0KZXAudW4gPSBlcC5yZW1vdmVMaXN0ZW5lcjsNCg0KDQplcC5hdXRvQm94QWRqdXN0ID0gdHJ1ZTsNCg0KCkVsLnVuaXRQYXR0ZXJuID0gL1xkKyhweHxlbXwlfGVufGV4fHB0fGlufGNtfG1tfHBjKSQvaTsNCg0KCkVsLmFkZFVuaXRzID0gZnVuY3Rpb24odiwgZGVmYXVsdFVuaXQpew0KICAgIGlmKHYgPT09ICIiIHx8IHYgPT0gImF1dG8iKXsNCiAgICAgICAgcmV0dXJuIHY7DQogICAgfQ0KICAgIGlmKHYgPT09IHVuZGVmaW5lZCl7DQogICAgICAgIHJldHVybiAnJzsNCiAgICB9DQogICAgaWYodHlwZW9mIHYgPT0gIm51bWJlciIgfHwgIUVsLnVuaXRQYXR0ZXJuLnRlc3Qodikpew0KICAgICAgICByZXR1cm4gdiArIChkZWZhdWx0VW5pdCB8fCAncHgnKTsNCiAgICB9DQogICAgcmV0dXJuIHY7DQp9Ow0KDQoKRWwuYm94TWFya3VwID0gJzxkaXYgY2xhc3M9InswfS10bCI+PGRpdiBjbGFzcz0iezB9LXRyIj48ZGl2IGNsYXNzPSJ7MH0tdGMiPjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9InswfS1tbCI+PGRpdiBjbGFzcz0iezB9LW1yIj48ZGl2IGNsYXNzPSJ7MH0tbWMiPjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9InswfS1ibCI+PGRpdiBjbGFzcz0iezB9LWJyIj48ZGl2IGNsYXNzPSJ7MH0tYmMiPjwvZGl2PjwvZGl2PjwvZGl2Pic7DQoNCkVsLlZJU0lCSUxJVFkgPSAxOw0KDQpFbC5ESVNQTEFZID0gMjsNCg0KRWwuYm9yZGVycyA9IHtsOiAiYm9yZGVyLWxlZnQtd2lkdGgiLCByOiAiYm9yZGVyLXJpZ2h0LXdpZHRoIiwgdDogImJvcmRlci10b3Atd2lkdGgiLCBiOiAiYm9yZGVyLWJvdHRvbS13aWR0aCJ9Ow0KRWwucGFkZGluZ3MgPSB7bDogInBhZGRpbmctbGVmdCIsIHI6ICJwYWRkaW5nLXJpZ2h0IiwgdDogInBhZGRpbmctdG9wIiwgYjogInBhZGRpbmctYm90dG9tIn07DQpFbC5tYXJnaW5zID0ge2w6ICJtYXJnaW4tbGVmdCIsIHI6ICJtYXJnaW4tcmlnaHQiLCB0OiAibWFyZ2luLXRvcCIsIGI6ICJtYXJnaW4tYm90dG9tIn07DQoNCg0KDQoNCkVsLmNhY2hlID0ge307DQoNCnZhciBkb2NFbDsNCg0KDQpFbC5nZXQgPSBmdW5jdGlvbihlbCl7DQogICAgdmFyIGV4LCBlbG0sIGlkOw0KICAgIGlmKCFlbCl7IHJldHVybiBudWxsOyB9DQogICAgaWYodHlwZW9mIGVsID09ICJzdHJpbmciKXsgCiAgICAgICAgaWYoIShlbG0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbCkpKXsNCiAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICB9DQogICAgICAgIGlmKGV4ID0gRWwuY2FjaGVbZWxdKXsNCiAgICAgICAgICAgIGV4LmRvbSA9IGVsbTsNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICBleCA9IEVsLmNhY2hlW2VsXSA9IG5ldyBFbChlbG0pOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBleDsNCiAgICB9ZWxzZSBpZihlbC50YWdOYW1lKXsgCiAgICAgICAgaWYoIShpZCA9IGVsLmlkKSl7DQogICAgICAgICAgICBpZCA9IEV4dC5pZChlbCk7DQogICAgICAgIH0NCiAgICAgICAgaWYoZXggPSBFbC5jYWNoZVtpZF0pew0KICAgICAgICAgICAgZXguZG9tID0gZWw7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgZXggPSBFbC5jYWNoZVtpZF0gPSBuZXcgRWwoZWwpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBleDsNCiAgICB9ZWxzZSBpZihlbCBpbnN0YW5jZW9mIEVsKXsNCiAgICAgICAgaWYoZWwgIT0gZG9jRWwpew0KICAgICAgICAgICAgZWwuZG9tID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpIHx8IGVsLmRvbTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgRWwuY2FjaGVbZWwuaWRdID0gZWw7IAogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGVsOw0KICAgIH1lbHNlIGlmKGVsLmlzQ29tcG9zaXRlKXsNCiAgICAgICAgcmV0dXJuIGVsOw0KICAgIH1lbHNlIGlmKGVsIGluc3RhbmNlb2YgQXJyYXkpew0KICAgICAgICByZXR1cm4gRWwuc2VsZWN0KGVsKTsNCiAgICB9ZWxzZSBpZihlbCA9PSBkb2N1bWVudCl7DQogICAgICAgIAogICAgICAgIGlmKCFkb2NFbCl7DQogICAgICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uKCl7fTsNCiAgICAgICAgICAgIGYucHJvdG90eXBlID0gRWwucHJvdG90eXBlOw0KICAgICAgICAgICAgZG9jRWwgPSBuZXcgZigpOw0KICAgICAgICAgICAgZG9jRWwuZG9tID0gZG9jdW1lbnQ7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGRvY0VsOw0KICAgIH0NCiAgICByZXR1cm4gbnVsbDsNCn07DQoNCgpFbC51bmNhY2hlID0gZnVuY3Rpb24oZWwpew0KICAgIGZvcih2YXIgaSA9IDAsIGEgPSBhcmd1bWVudHMsIGxlbiA9IGEubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsNCiAgICAgICAgaWYoYVtpXSl7DQogICAgICAgICAgICBkZWxldGUgRWwuY2FjaGVbYVtpXS5pZCB8fCBhW2ldXTsNCiAgICAgICAgfQ0KICAgIH0NCn07DQoNCgoKCkVsLmdhcmJhZ2VDb2xsZWN0ID0gZnVuY3Rpb24oKXsNCiAgICBpZighRXh0LmVuYWJsZUdhcmJhZ2VDb2xsZWN0b3Ipew0KICAgICAgICBjbGVhckludGVydmFsKEVsLmNvbGxlY3RvclRocmVhZCk7DQogICAgICAgIHJldHVybjsNCiAgICB9DQogICAgZm9yKHZhciBlaWQgaW4gRWwuY2FjaGUpew0KICAgICAgICB2YXIgZWwgPSBFbC5jYWNoZVtlaWRdLCBkID0gZWwuZG9tOw0KICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICBpZighZCB8fCAhZC5wYXJlbnROb2RlIHx8ICghZC5vZmZzZXRQYXJlbnQgJiYgIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVpZCkpKXsNCiAgICAgICAgICAgIGRlbGV0ZSBFbC5jYWNoZVtlaWRdOw0KICAgICAgICAgICAgaWYoZCAmJiBFeHQuZW5hYmxlTGlzdGVuZXJDb2xsZWN0aW9uKXsNCiAgICAgICAgICAgICAgICBFLnB1cmdlRWxlbWVudChkKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0NCkVsLmNvbGxlY3RvclRocmVhZElkID0gc2V0SW50ZXJ2YWwoRWwuZ2FyYmFnZUNvbGxlY3QsIDMwMDAwKTsNCg0KDQoKRWwuRmx5d2VpZ2h0ID0gZnVuY3Rpb24oZG9tKXsNCiAgICB0aGlzLmRvbSA9IGRvbTsNCn07DQpFbC5GbHl3ZWlnaHQucHJvdG90eXBlID0gRWwucHJvdG90eXBlOw0KDQpFbC5fZmx5d2VpZ2h0cyA9IHt9Ow0KDQpFbC5mbHkgPSBmdW5jdGlvbihlbCwgbmFtZWQpew0KICAgIG5hbWVkID0gbmFtZWQgfHwgJ19nbG9iYWwnOw0KICAgIGVsID0gRXh0LmdldERvbShlbCk7DQogICAgaWYoIWVsKXsNCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfQ0KICAgIGlmKCFFbC5fZmx5d2VpZ2h0c1tuYW1lZF0pew0KICAgICAgICBFbC5fZmx5d2VpZ2h0c1tuYW1lZF0gPSBuZXcgRWwuRmx5d2VpZ2h0KCk7DQogICAgfQ0KICAgIEVsLl9mbHl3ZWlnaHRzW25hbWVkXS5kb20gPSBlbDsNCiAgICByZXR1cm4gRWwuX2ZseXdlaWdodHNbbmFtZWRdOw0KfTsNCg0KDQpFeHQuZ2V0ID0gRWwuZ2V0Ow0KDQpFeHQuZmx5ID0gRWwuZmx5Ow0KDQoKdmFyIG5vQm94QWRqdXN0ID0gRXh0LmlzU3RyaWN0ID8gew0KICAgIHNlbGVjdDoxDQp9IDogew0KICAgIGlucHV0OjEsIHNlbGVjdDoxLCB0ZXh0YXJlYToxDQp9Ow0KaWYoRXh0LmlzSUUgfHwgRXh0LmlzR2Vja28pew0KICAgIG5vQm94QWRqdXN0WydidXR0b24nXSA9IDE7DQp9DQoNCg0KRXh0LkV2ZW50TWFuYWdlci5vbih3aW5kb3csICd1bmxvYWQnLCBmdW5jdGlvbigpew0KICAgIGRlbGV0ZSBFbC5jYWNoZTsNCiAgICBkZWxldGUgRWwuX2ZseXdlaWdodHM7DQp9KTsNCn0pKCk7CgpFeHQuZW5hYmxlRnggPSB0cnVlOwoKCkV4dC5GeCA9IHsKCQogICAgc2xpZGVJbiA6IGZ1bmN0aW9uKGFuY2hvciwgbyl7CiAgICAgICAgdmFyIGVsID0gdGhpcy5nZXRGeEVsKCk7CiAgICAgICAgbyA9IG8gfHwge307CgogICAgICAgIGVsLnF1ZXVlRngobywgZnVuY3Rpb24oKXsKCiAgICAgICAgICAgIGFuY2hvciA9IGFuY2hvciB8fCAidCI7CgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpeERpc3BsYXkoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gdGhpcy5nZXRGeFJlc3RvcmUoKTsKICAgICAgICAgICAgdmFyIGIgPSB0aGlzLmdldEJveCgpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFNpemUoYik7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgd3JhcCA9IHRoaXMuZnhXcmFwKHIucG9zLCBvLCAiaGlkZGVuIik7CgogICAgICAgICAgICB2YXIgc3QgPSB0aGlzLmRvbS5zdHlsZTsKICAgICAgICAgICAgc3QudmlzaWJpbGl0eSA9ICJ2aXNpYmxlIjsKICAgICAgICAgICAgc3QucG9zaXRpb24gPSAiYWJzb2x1dGUiOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFmdGVyID0gZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIGVsLmZ4VW53cmFwKHdyYXAsIHIucG9zLCBvKTsKICAgICAgICAgICAgICAgIHN0LndpZHRoID0gci53aWR0aDsKICAgICAgICAgICAgICAgIHN0LmhlaWdodCA9IHIuaGVpZ2h0OwogICAgICAgICAgICAgICAgZWwuYWZ0ZXJGeChvKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEsIHB0ID0ge3RvOiBbYi54LCBiLnldfSwgYncgPSB7dG86IGIud2lkdGh9LCBiaCA9IHt0bzogYi5oZWlnaHR9OwoKICAgICAgICAgICAgc3dpdGNoKGFuY2hvci50b0xvd2VyQ2FzZSgpKXsKICAgICAgICAgICAgICAgIGNhc2UgInQiOgogICAgICAgICAgICAgICAgICAgIHdyYXAuc2V0U2l6ZShiLndpZHRoLCAwKTsKICAgICAgICAgICAgICAgICAgICBzdC5sZWZ0ID0gc3QuYm90dG9tID0gIjAiOwogICAgICAgICAgICAgICAgICAgIGEgPSB7aGVpZ2h0OiBiaH07CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgImwiOgogICAgICAgICAgICAgICAgICAgIHdyYXAuc2V0U2l6ZSgwLCBiLmhlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgc3QucmlnaHQgPSBzdC50b3AgPSAiMCI7CiAgICAgICAgICAgICAgICAgICAgYSA9IHt3aWR0aDogYnd9OwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJyIjoKICAgICAgICAgICAgICAgICAgICB3cmFwLnNldFNpemUoMCwgYi5oZWlnaHQpOwogICAgICAgICAgICAgICAgICAgIHdyYXAuc2V0WChiLnJpZ2h0KTsKICAgICAgICAgICAgICAgICAgICBzdC5sZWZ0ID0gc3QudG9wID0gIjAiOwogICAgICAgICAgICAgICAgICAgIGEgPSB7d2lkdGg6IGJ3LCBwb2ludHM6IHB0fTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAiYiI6CiAgICAgICAgICAgICAgICAgICAgd3JhcC5zZXRTaXplKGIud2lkdGgsIDApOwogICAgICAgICAgICAgICAgICAgIHdyYXAuc2V0WShiLmJvdHRvbSk7CiAgICAgICAgICAgICAgICAgICAgc3QubGVmdCA9IHN0LnRvcCA9ICIwIjsKICAgICAgICAgICAgICAgICAgICBhID0ge2hlaWdodDogYmgsIHBvaW50czogcHR9OwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJ0bCI6CiAgICAgICAgICAgICAgICAgICAgd3JhcC5zZXRTaXplKDAsIDApOwogICAgICAgICAgICAgICAgICAgIHN0LnJpZ2h0ID0gc3QuYm90dG9tID0gIjAiOwogICAgICAgICAgICAgICAgICAgIGEgPSB7d2lkdGg6IGJ3LCBoZWlnaHQ6IGJofTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAiYmwiOgogICAgICAgICAgICAgICAgICAgIHdyYXAuc2V0U2l6ZSgwLCAwKTsKICAgICAgICAgICAgICAgICAgICB3cmFwLnNldFkoYi55K2IuaGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICBzdC5yaWdodCA9IHN0LnRvcCA9ICIwIjsKICAgICAgICAgICAgICAgICAgICBhID0ge3dpZHRoOiBidywgaGVpZ2h0OiBiaCwgcG9pbnRzOiBwdH07CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgImJyIjoKICAgICAgICAgICAgICAgICAgICB3cmFwLnNldFNpemUoMCwgMCk7CiAgICAgICAgICAgICAgICAgICAgd3JhcC5zZXRYWShbYi5yaWdodCwgYi5ib3R0b21dKTsKICAgICAgICAgICAgICAgICAgICBzdC5sZWZ0ID0gc3QudG9wID0gIjAiOwogICAgICAgICAgICAgICAgICAgIGEgPSB7d2lkdGg6IGJ3LCBoZWlnaHQ6IGJoLCBwb2ludHM6IHB0fTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAidHIiOgogICAgICAgICAgICAgICAgICAgIHdyYXAuc2V0U2l6ZSgwLCAwKTsKICAgICAgICAgICAgICAgICAgICB3cmFwLnNldFgoYi54K2Iud2lkdGgpOwogICAgICAgICAgICAgICAgICAgIHN0LmxlZnQgPSBzdC5ib3R0b20gPSAiMCI7CiAgICAgICAgICAgICAgICAgICAgYSA9IHt3aWR0aDogYncsIGhlaWdodDogYmgsIHBvaW50czogcHR9OwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5kb20uc3R5bGUudmlzaWJpbGl0eSA9ICJ2aXNpYmxlIjsKICAgICAgICAgICAgd3JhcC5zaG93KCk7CgogICAgICAgICAgICBhcmd1bWVudHMuY2FsbGVlLmFuaW0gPSB3cmFwLmZ4YW5pbShhLAogICAgICAgICAgICAgICAgbywKICAgICAgICAgICAgICAgICdtb3Rpb24nLAogICAgICAgICAgICAgICAgLjUsCiAgICAgICAgICAgICAgICAnZWFzZU91dCcsIGFmdGVyKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0sCiAgICAKCQogICAgc2xpZGVPdXQgOiBmdW5jdGlvbihhbmNob3IsIG8pewogICAgICAgIHZhciBlbCA9IHRoaXMuZ2V0RnhFbCgpOwogICAgICAgIG8gPSBvIHx8IHt9OwoKICAgICAgICBlbC5xdWV1ZUZ4KG8sIGZ1bmN0aW9uKCl7CgogICAgICAgICAgICBhbmNob3IgPSBhbmNob3IgfHwgInQiOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB0aGlzLmdldEZ4UmVzdG9yZSgpOwogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIGIgPSB0aGlzLmdldEJveCgpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFNpemUoYik7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgd3JhcCA9IHRoaXMuZnhXcmFwKHIucG9zLCBvLCAidmlzaWJsZSIpOwoKICAgICAgICAgICAgdmFyIHN0ID0gdGhpcy5kb20uc3R5bGU7CiAgICAgICAgICAgIHN0LnZpc2liaWxpdHkgPSAidmlzaWJsZSI7CiAgICAgICAgICAgIHN0LnBvc2l0aW9uID0gImFic29sdXRlIjsKCiAgICAgICAgICAgIHdyYXAuc2V0U2l6ZShiKTsKCiAgICAgICAgICAgIHZhciBhZnRlciA9IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICBpZihvLnVzZURpc3BsYXkpewogICAgICAgICAgICAgICAgICAgIGVsLnNldERpc3BsYXllZChmYWxzZSk7CiAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICBlbC5oaWRlKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZWwuZnhVbndyYXAod3JhcCwgci5wb3MsIG8pOwoKICAgICAgICAgICAgICAgIHN0LndpZHRoID0gci53aWR0aDsKICAgICAgICAgICAgICAgIHN0LmhlaWdodCA9IHIuaGVpZ2h0OwoKICAgICAgICAgICAgICAgIGVsLmFmdGVyRngobyk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgYSwgemVybyA9IHt0bzogMH07CiAgICAgICAgICAgIHN3aXRjaChhbmNob3IudG9Mb3dlckNhc2UoKSl7CiAgICAgICAgICAgICAgICBjYXNlICJ0IjoKICAgICAgICAgICAgICAgICAgICBzdC5sZWZ0ID0gc3QuYm90dG9tID0gIjAiOwogICAgICAgICAgICAgICAgICAgIGEgPSB7aGVpZ2h0OiB6ZXJvfTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAibCI6CiAgICAgICAgICAgICAgICAgICAgc3QucmlnaHQgPSBzdC50b3AgPSAiMCI7CiAgICAgICAgICAgICAgICAgICAgYSA9IHt3aWR0aDogemVyb307CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgInIiOgogICAgICAgICAgICAgICAgICAgIHN0LmxlZnQgPSBzdC50b3AgPSAiMCI7CiAgICAgICAgICAgICAgICAgICAgYSA9IHt3aWR0aDogemVybywgcG9pbnRzOiB7dG86W2IucmlnaHQsIGIueV19fTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAiYiI6CiAgICAgICAgICAgICAgICAgICAgc3QubGVmdCA9IHN0LnRvcCA9ICIwIjsKICAgICAgICAgICAgICAgICAgICBhID0ge2hlaWdodDogemVybywgcG9pbnRzOiB7dG86W2IueCwgYi5ib3R0b21dfX07CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgInRsIjoKICAgICAgICAgICAgICAgICAgICBzdC5yaWdodCA9IHN0LmJvdHRvbSA9ICIwIjsKICAgICAgICAgICAgICAgICAgICBhID0ge3dpZHRoOiB6ZXJvLCBoZWlnaHQ6IHplcm99OwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJibCI6CiAgICAgICAgICAgICAgICAgICAgc3QucmlnaHQgPSBzdC50b3AgPSAiMCI7CiAgICAgICAgICAgICAgICAgICAgYSA9IHt3aWR0aDogemVybywgaGVpZ2h0OiB6ZXJvLCBwb2ludHM6IHt0bzpbYi54LCBiLmJvdHRvbV19fTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAiYnIiOgogICAgICAgICAgICAgICAgICAgIHN0LmxlZnQgPSBzdC50b3AgPSAiMCI7CiAgICAgICAgICAgICAgICAgICAgYSA9IHt3aWR0aDogemVybywgaGVpZ2h0OiB6ZXJvLCBwb2ludHM6IHt0bzpbYi54K2Iud2lkdGgsIGIuYm90dG9tXX19OwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJ0ciI6CiAgICAgICAgICAgICAgICAgICAgc3QubGVmdCA9IHN0LmJvdHRvbSA9ICIwIjsKICAgICAgICAgICAgICAgICAgICBhID0ge3dpZHRoOiB6ZXJvLCBoZWlnaHQ6IHplcm8sIHBvaW50czoge3RvOltiLnJpZ2h0LCBiLnldfX07CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYXJndW1lbnRzLmNhbGxlZS5hbmltID0gd3JhcC5meGFuaW0oYSwKICAgICAgICAgICAgICAgIG8sCiAgICAgICAgICAgICAgICAnbW90aW9uJywKICAgICAgICAgICAgICAgIC41LAogICAgICAgICAgICAgICAgImVhc2VPdXQiLCBhZnRlcik7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAoKCQogICAgcHVmZiA6IGZ1bmN0aW9uKG8pewogICAgICAgIHZhciBlbCA9IHRoaXMuZ2V0RnhFbCgpOwogICAgICAgIG8gPSBvIHx8IHt9OwoKICAgICAgICBlbC5xdWV1ZUZ4KG8sIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIHRoaXMuY2xlYXJPcGFjaXR5KCk7CiAgICAgICAgICAgIHRoaXMuc2hvdygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB0aGlzLmdldEZ4UmVzdG9yZSgpOwogICAgICAgICAgICB2YXIgc3QgPSB0aGlzLmRvbS5zdHlsZTsKCiAgICAgICAgICAgIHZhciBhZnRlciA9IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICBpZihvLnVzZURpc3BsYXkpewogICAgICAgICAgICAgICAgICAgIGVsLnNldERpc3BsYXllZChmYWxzZSk7CiAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICBlbC5oaWRlKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZWwuY2xlYXJPcGFjaXR5KCk7CgogICAgICAgICAgICAgICAgZWwuc2V0UG9zaXRpb25pbmcoci5wb3MpOwogICAgICAgICAgICAgICAgc3Qud2lkdGggPSByLndpZHRoOwogICAgICAgICAgICAgICAgc3QuaGVpZ2h0ID0gci5oZWlnaHQ7CiAgICAgICAgICAgICAgICBzdC5mb250U2l6ZSA9ICcnOwogICAgICAgICAgICAgICAgZWwuYWZ0ZXJGeChvKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciB3aWR0aCA9IHRoaXMuZ2V0V2lkdGgoKTsKICAgICAgICAgICAgdmFyIGhlaWdodCA9IHRoaXMuZ2V0SGVpZ2h0KCk7CgogICAgICAgICAgICBhcmd1bWVudHMuY2FsbGVlLmFuaW0gPSB0aGlzLmZ4YW5pbSh7CiAgICAgICAgICAgICAgICAgICAgd2lkdGggOiB7dG86IHRoaXMuYWRqdXN0V2lkdGgod2lkdGggKiAyKX0sCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0IDoge3RvOiB0aGlzLmFkanVzdEhlaWdodChoZWlnaHQgKiAyKX0sCiAgICAgICAgICAgICAgICAgICAgcG9pbnRzIDoge2J5OiBbLSh3aWR0aCAqIC41KSwgLShoZWlnaHQgKiAuNSldfSwKICAgICAgICAgICAgICAgICAgICBvcGFjaXR5IDoge3RvOiAwfSwKICAgICAgICAgICAgICAgICAgICBmb250U2l6ZToge3RvOjIwMCwgdW5pdDogIiUifQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIG8sCiAgICAgICAgICAgICAgICAnbW90aW9uJywKICAgICAgICAgICAgICAgIC41LAogICAgICAgICAgICAgICAgImVhc2VPdXQiLCBhZnRlcik7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAoKCQogICAgc3dpdGNoT2ZmIDogZnVuY3Rpb24obyl7CiAgICAgICAgdmFyIGVsID0gdGhpcy5nZXRGeEVsKCk7CiAgICAgICAgbyA9IG8gfHwge307CgogICAgICAgIGVsLnF1ZXVlRngobywgZnVuY3Rpb24oKXsKICAgICAgICAgICAgdGhpcy5jbGVhck9wYWNpdHkoKTsKICAgICAgICAgICAgdGhpcy5jbGlwKCk7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHRoaXMuZ2V0RnhSZXN0b3JlKCk7CiAgICAgICAgICAgIHZhciBzdCA9IHRoaXMuZG9tLnN0eWxlOwoKICAgICAgICAgICAgdmFyIGFmdGVyID0gZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIGlmKG8udXNlRGlzcGxheSl7CiAgICAgICAgICAgICAgICAgICAgZWwuc2V0RGlzcGxheWVkKGZhbHNlKTsKICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgIGVsLmhpZGUoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBlbC5jbGVhck9wYWNpdHkoKTsKICAgICAgICAgICAgICAgIGVsLnNldFBvc2l0aW9uaW5nKHIucG9zKTsKICAgICAgICAgICAgICAgIHN0LndpZHRoID0gci53aWR0aDsKICAgICAgICAgICAgICAgIHN0LmhlaWdodCA9IHIuaGVpZ2h0OwoKICAgICAgICAgICAgICAgIGVsLmFmdGVyRngobyk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB0aGlzLmZ4YW5pbSh7b3BhY2l0eTp7dG86MC4zfX0sIG51bGwsIG51bGwsIC4xLCBudWxsLCBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgdGhpcy5jbGVhck9wYWNpdHkoKTsKICAgICAgICAgICAgICAgIChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgIHRoaXMuZnhhbmltKHsKICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0Ont0bzoxfSwKICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzOntieTpbMCwgdGhpcy5nZXRIZWlnaHQoKSAqIC41XX0KICAgICAgICAgICAgICAgICAgICB9LCBvLCAnbW90aW9uJywgMC4zLCAnZWFzZUluJywgYWZ0ZXIpOwogICAgICAgICAgICAgICAgfSkuZGVmZXIoMTAwLCB0aGlzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAoKICAgIAkKICAgIGhpZ2hsaWdodCA6IGZ1bmN0aW9uKGNvbG9yLCBvKXsKICAgICAgICB2YXIgZWwgPSB0aGlzLmdldEZ4RWwoKTsKICAgICAgICBvID0gbyB8fCB7fTsKCiAgICAgICAgZWwucXVldWVGeChvLCBmdW5jdGlvbigpewogICAgICAgICAgICBjb2xvciA9IGNvbG9yIHx8ICJmZmZmOWMiOwogICAgICAgICAgICBhdHRyID0gby5hdHRyIHx8ICJiYWNrZ3JvdW5kQ29sb3IiOwoKICAgICAgICAgICAgdGhpcy5jbGVhck9wYWNpdHkoKTsKICAgICAgICAgICAgdGhpcy5zaG93KCk7CgogICAgICAgICAgICB2YXIgb3JpZ0NvbG9yID0gdGhpcy5nZXRDb2xvcihhdHRyKTsKICAgICAgICAgICAgdmFyIHJlc3RvcmVDb2xvciA9IHRoaXMuZG9tLnN0eWxlW2F0dHJdOwogICAgICAgICAgICBlbmRDb2xvciA9IChvLmVuZENvbG9yIHx8IG9yaWdDb2xvcikgfHwgImZmZmZmZiI7CgogICAgICAgICAgICB2YXIgYWZ0ZXIgPSBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgZWwuZG9tLnN0eWxlW2F0dHJdID0gcmVzdG9yZUNvbG9yOwogICAgICAgICAgICAgICAgZWwuYWZ0ZXJGeChvKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBhID0ge307CiAgICAgICAgICAgIGFbYXR0cl0gPSB7ZnJvbTogY29sb3IsIHRvOiBlbmRDb2xvcn07CiAgICAgICAgICAgIGFyZ3VtZW50cy5jYWxsZWUuYW5pbSA9IHRoaXMuZnhhbmltKGEsCiAgICAgICAgICAgICAgICBvLAogICAgICAgICAgICAgICAgJ2NvbG9yJywKICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAnZWFzZUluJywgYWZ0ZXIpOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfSwKCiAgIAogICAgZnJhbWUgOiBmdW5jdGlvbihjb2xvciwgY291bnQsIG8pewogICAgICAgIHZhciBlbCA9IHRoaXMuZ2V0RnhFbCgpOwogICAgICAgIG8gPSBvIHx8IHt9OwoKICAgICAgICBlbC5xdWV1ZUZ4KG8sIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIGNvbG9yID0gY29sb3IgfHwgIiNDM0RBRjkiOwogICAgICAgICAgICBpZihjb2xvci5sZW5ndGggPT0gNil7CiAgICAgICAgICAgICAgICBjb2xvciA9ICIjIiArIGNvbG9yOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvdW50ID0gY291bnQgfHwgMTsKICAgICAgICAgICAgZHVyYXRpb24gPSBvLmR1cmF0aW9uIHx8IDE7CiAgICAgICAgICAgIHRoaXMuc2hvdygpOwoKICAgICAgICAgICAgdmFyIGIgPSB0aGlzLmdldEJveCgpOwogICAgICAgICAgICB2YXIgYW5pbUZuID0gZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIHZhciBwcm94eSA9IHRoaXMuY3JlYXRlUHJveHkoewoKICAgICAgICAgICAgICAgICAgICAgc3R5bGU6ewogICAgICAgICAgICAgICAgICAgICAgICB2aXNiaWxpdHk6ImhpZGRlbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiJhYnNvbHV0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ6LWluZGV4IjoiMzUwMDAiLCAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6IjBweCBzb2xpZCAiICsgY29sb3IKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHZhciBzY2FsZSA9IEV4dC5pc0JvcmRlckJveCA/IDIgOiAxOwogICAgICAgICAgICAgICAgcHJveHkuYW5pbWF0ZSh7CiAgICAgICAgICAgICAgICAgICAgdG9wOntmcm9tOmIueSwgdG86Yi55IC0gMjB9LAogICAgICAgICAgICAgICAgICAgIGxlZnQ6e2Zyb206Yi54LCB0bzpiLnggLSAyMH0sCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyV2lkdGg6e2Zyb206MCwgdG86MTB9LAogICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6e2Zyb206MSwgdG86MH0sCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0Ontmcm9tOmIuaGVpZ2h0LCB0bzooYi5oZWlnaHQgKyAoMjAqc2NhbGUpKX0sCiAgICAgICAgICAgICAgICAgICAgd2lkdGg6e2Zyb206Yi53aWR0aCwgdG86KGIud2lkdGggKyAoMjAqc2NhbGUpKX0KICAgICAgICAgICAgICAgIH0sIGR1cmF0aW9uLCBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgIHByb3h5LnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBpZigtLWNvdW50ID4gMCl7CiAgICAgICAgICAgICAgICAgICAgIGFuaW1Gbi5kZWZlcigoZHVyYXRpb24vMikqMTAwMCwgdGhpcyk7CiAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICBlbC5hZnRlckZ4KG8pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBhbmltRm4uY2FsbCh0aGlzKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0sCgogICAKICAgIHBhdXNlIDogZnVuY3Rpb24oc2Vjb25kcyl7CiAgICAgICAgdmFyIGVsID0gdGhpcy5nZXRGeEVsKCk7CiAgICAgICAgdmFyIG8gPSB7fTsKCiAgICAgICAgZWwucXVldWVGeChvLCBmdW5jdGlvbigpewogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICBlbC5hZnRlckZ4KG8pOwogICAgICAgICAgICB9LCBzZWNvbmRzICogMTAwMCk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAoKICAgCiAgICBmYWRlSW4gOiBmdW5jdGlvbihvKXsKICAgICAgICB2YXIgZWwgPSB0aGlzLmdldEZ4RWwoKTsKICAgICAgICBvID0gbyB8fCB7fTsKICAgICAgICBlbC5xdWV1ZUZ4KG8sIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIHRoaXMuc2V0T3BhY2l0eSgwKTsKICAgICAgICAgICAgdGhpcy5maXhEaXNwbGF5KCk7CiAgICAgICAgICAgIHRoaXMuZG9tLnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7CiAgICAgICAgICAgIHZhciB0byA9IG8uZW5kT3BhY2l0eSB8fCAxOwogICAgICAgICAgICBhcmd1bWVudHMuY2FsbGVlLmFuaW0gPSB0aGlzLmZ4YW5pbSh7b3BhY2l0eTp7dG86dG99fSwKICAgICAgICAgICAgICAgIG8sIG51bGwsIC41LCAiZWFzZU91dCIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICBpZih0byA9PSAxKXsKICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFyT3BhY2l0eSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWwuYWZ0ZXJGeChvKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAoKICAgCiAgICBmYWRlT3V0IDogZnVuY3Rpb24obyl7CiAgICAgICAgdmFyIGVsID0gdGhpcy5nZXRGeEVsKCk7CiAgICAgICAgbyA9IG8gfHwge307CiAgICAgICAgZWwucXVldWVGeChvLCBmdW5jdGlvbigpewogICAgICAgICAgICBhcmd1bWVudHMuY2FsbGVlLmFuaW0gPSB0aGlzLmZ4YW5pbSh7b3BhY2l0eTp7dG86by5lbmRPcGFjaXR5IHx8IDB9fSwKICAgICAgICAgICAgICAgIG8sIG51bGwsIC41LCAiZWFzZU91dCIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICBpZih0aGlzLnZpc2liaWxpdHlNb2RlID09IEV4dC5FbGVtZW50LkRJU1BMQVkgfHwgby51c2VEaXNwbGF5KXsKICAgICAgICAgICAgICAgICAgICAgdGhpcy5kb20uc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgICB0aGlzLmRvbS5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyT3BhY2l0eSgpOwogICAgICAgICAgICAgICAgZWwuYWZ0ZXJGeChvKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAoKICAgCiAgICBzY2FsZSA6IGZ1bmN0aW9uKHcsIGgsIG8pewogICAgICAgIHRoaXMuc2hpZnQoRXh0LmFwcGx5KHt9LCBvLCB7CiAgICAgICAgICAgIHdpZHRoOiB3LAogICAgICAgICAgICBoZWlnaHQ6IGgKICAgICAgICB9KSk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAoKICAgCiAgICBzaGlmdCA6IGZ1bmN0aW9uKG8pewogICAgICAgIHZhciBlbCA9IHRoaXMuZ2V0RnhFbCgpOwogICAgICAgIG8gPSBvIHx8IHt9OwogICAgICAgIGVsLnF1ZXVlRngobywgZnVuY3Rpb24oKXsKICAgICAgICAgICAgdmFyIGEgPSB7fSwgdyA9IG8ud2lkdGgsIGggPSBvLmhlaWdodCwgeCA9IG8ueCwgeSA9IG8ueSwgIG9wID0gby5vcGFjaXR5OwogICAgICAgICAgICBpZih3ICE9PSB1bmRlZmluZWQpewogICAgICAgICAgICAgICAgYS53aWR0aCA9IHt0bzogdGhpcy5hZGp1c3RXaWR0aCh3KX07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoaCAhPT0gdW5kZWZpbmVkKXsKICAgICAgICAgICAgICAgIGEuaGVpZ2h0ID0ge3RvOiB0aGlzLmFkanVzdEhlaWdodChoKX07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoeCAhPT0gdW5kZWZpbmVkIHx8IHkgIT09IHVuZGVmaW5lZCl7CiAgICAgICAgICAgICAgICBhLnBvaW50cyA9IHt0bzogWwogICAgICAgICAgICAgICAgICAgIHggIT09IHVuZGVmaW5lZCA/IHggOiB0aGlzLmdldFgoKSwKICAgICAgICAgICAgICAgICAgICB5ICE9PSB1bmRlZmluZWQgPyB5IDogdGhpcy5nZXRZKCkKICAgICAgICAgICAgICAgIF19OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKG9wICE9PSB1bmRlZmluZWQpewogICAgICAgICAgICAgICAgYS5vcGFjaXR5ID0ge3RvOiBvcH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoby54eSAhPT0gdW5kZWZpbmVkKXsKICAgICAgICAgICAgICAgIGEucG9pbnRzID0ge3RvOiBvLnh5fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhcmd1bWVudHMuY2FsbGVlLmFuaW0gPSB0aGlzLmZ4YW5pbShhLAogICAgICAgICAgICAgICAgbywgJ21vdGlvbicsIC4zNSwgImVhc2VPdXQiLCBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgZWwuYWZ0ZXJGeChvKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAoKCQogICAgZ2hvc3QgOiBmdW5jdGlvbihhbmNob3IsIG8pewogICAgICAgIHZhciBlbCA9IHRoaXMuZ2V0RnhFbCgpOwogICAgICAgIG8gPSBvIHx8IHt9OwoKICAgICAgICBlbC5xdWV1ZUZ4KG8sIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIGFuY2hvciA9IGFuY2hvciB8fCAiYiI7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHRoaXMuZ2V0RnhSZXN0b3JlKCk7CiAgICAgICAgICAgIHZhciB3ID0gdGhpcy5nZXRXaWR0aCgpLAogICAgICAgICAgICAgICAgaCA9IHRoaXMuZ2V0SGVpZ2h0KCk7CgogICAgICAgICAgICB2YXIgc3QgPSB0aGlzLmRvbS5zdHlsZTsKCiAgICAgICAgICAgIHZhciBhZnRlciA9IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICBpZihvLnVzZURpc3BsYXkpewogICAgICAgICAgICAgICAgICAgIGVsLnNldERpc3BsYXllZChmYWxzZSk7CiAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICBlbC5oaWRlKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZWwuY2xlYXJPcGFjaXR5KCk7CiAgICAgICAgICAgICAgICBlbC5zZXRQb3NpdGlvbmluZyhyLnBvcyk7CiAgICAgICAgICAgICAgICBzdC53aWR0aCA9IHIud2lkdGg7CiAgICAgICAgICAgICAgICBzdC5oZWlnaHQgPSByLmhlaWdodDsKCiAgICAgICAgICAgICAgICBlbC5hZnRlckZ4KG8pOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGEgPSB7b3BhY2l0eToge3RvOiAwfSwgcG9pbnRzOiB7fX0sIHB0ID0gYS5wb2ludHM7CiAgICAgICAgICAgIHN3aXRjaChhbmNob3IudG9Mb3dlckNhc2UoKSl7CiAgICAgICAgICAgICAgICBjYXNlICJ0IjoKICAgICAgICAgICAgICAgICAgICBwdC5ieSA9IFswLCAtaF07CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgImwiOgogICAgICAgICAgICAgICAgICAgIHB0LmJ5ID0gWy13LCAwXTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAiciI6CiAgICAgICAgICAgICAgICAgICAgcHQuYnkgPSBbdywgMF07CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgImIiOgogICAgICAgICAgICAgICAgICAgIHB0LmJ5ID0gWzAsIGhdOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJ0bCI6CiAgICAgICAgICAgICAgICAgICAgcHQuYnkgPSBbLXcsIC1oXTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAiYmwiOgogICAgICAgICAgICAgICAgICAgIHB0LmJ5ID0gWy13LCBoXTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAiYnIiOgogICAgICAgICAgICAgICAgICAgIHB0LmJ5ID0gW3csIGhdOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJ0ciI6CiAgICAgICAgICAgICAgICAgICAgcHQuYnkgPSBbdywgLWhdOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGFyZ3VtZW50cy5jYWxsZWUuYW5pbSA9IHRoaXMuZnhhbmltKGEsCiAgICAgICAgICAgICAgICBvLAogICAgICAgICAgICAgICAgJ21vdGlvbicsCiAgICAgICAgICAgICAgICAuNSwKICAgICAgICAgICAgICAgICJlYXNlT3V0IiwgYWZ0ZXIpOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfSwKCgkKICAgIHN5bmNGeCA6IGZ1bmN0aW9uKCl7CiAgICAgICAgdGhpcy5meERlZmF1bHRzID0gRXh0LmFwcGx5KHRoaXMuZnhEZWZhdWx0cyB8fCB7fSwgewogICAgICAgICAgICBibG9jayA6IGZhbHNlLAogICAgICAgICAgICBjb25jdXJyZW50IDogdHJ1ZSwKICAgICAgICAgICAgc3RvcEZ4IDogZmFsc2UKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0sCgoJCiAgICBzZXF1ZW5jZUZ4IDogZnVuY3Rpb24oKXsKICAgICAgICB0aGlzLmZ4RGVmYXVsdHMgPSBFeHQuYXBwbHkodGhpcy5meERlZmF1bHRzIHx8IHt9LCB7CiAgICAgICAgICAgIGJsb2NrIDogZmFsc2UsCiAgICAgICAgICAgIGNvbmN1cnJlbnQgOiBmYWxzZSwKICAgICAgICAgICAgc3RvcEZ4IDogZmFsc2UKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0sCgoJCiAgICBuZXh0RnggOiBmdW5jdGlvbigpewogICAgICAgIHZhciBlZiA9IHRoaXMuZnhRdWV1ZVswXTsKICAgICAgICBpZihlZil7CiAgICAgICAgICAgIGVmLmNhbGwodGhpcyk7CiAgICAgICAgfQogICAgfSwKCgkKICAgIGhhc0FjdGl2ZUZ4IDogZnVuY3Rpb24oKXsKICAgICAgICByZXR1cm4gdGhpcy5meFF1ZXVlICYmIHRoaXMuZnhRdWV1ZVswXTsKICAgIH0sCgoJCiAgICBzdG9wRnggOiBmdW5jdGlvbigpewogICAgICAgIGlmKHRoaXMuaGFzQWN0aXZlRngoKSl7CiAgICAgICAgICAgIHZhciBjdXIgPSB0aGlzLmZ4UXVldWVbMF07CiAgICAgICAgICAgIGlmKGN1ciAmJiBjdXIuYW5pbSAmJiBjdXIuYW5pbS5pc0FuaW1hdGVkKCkpewogICAgICAgICAgICAgICAgdGhpcy5meFF1ZXVlID0gW2N1cl07ICAgICAgICAgICAgICAgICBjdXIuYW5pbS5zdG9wKHRydWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzOwogICAgfSwKCgkKICAgIGJlZm9yZUZ4IDogZnVuY3Rpb24obyl7CiAgICAgICAgaWYodGhpcy5oYXNBY3RpdmVGeCgpICYmICFvLmNvbmN1cnJlbnQpewogICAgICAgICAgIGlmKG8uc3RvcEZ4KXsKICAgICAgICAgICAgICAgdGhpcy5zdG9wRngoKTsKICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgfQogICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9LAoKCQogICAgaGFzRnhCbG9jayA6IGZ1bmN0aW9uKCl7CiAgICAgICAgdmFyIHEgPSB0aGlzLmZ4UXVldWU7CiAgICAgICAgcmV0dXJuIHEgJiYgcVswXSAmJiBxWzBdLmJsb2NrOwogICAgfSwKCgkKICAgIHF1ZXVlRnggOiBmdW5jdGlvbihvLCBmbil7CiAgICAgICAgaWYoIXRoaXMuZnhRdWV1ZSl7CiAgICAgICAgICAgIHRoaXMuZnhRdWV1ZSA9IFtdOwogICAgICAgIH0KICAgICAgICBpZighdGhpcy5oYXNGeEJsb2NrKCkpewogICAgICAgICAgICBFeHQuYXBwbHlJZihvLCB0aGlzLmZ4RGVmYXVsdHMpOwogICAgICAgICAgICBpZighby5jb25jdXJyZW50KXsKICAgICAgICAgICAgICAgIHZhciBydW4gPSB0aGlzLmJlZm9yZUZ4KG8pOwogICAgICAgICAgICAgICAgZm4uYmxvY2sgPSBvLmJsb2NrOwogICAgICAgICAgICAgICAgdGhpcy5meFF1ZXVlLnB1c2goZm4pOwogICAgICAgICAgICAgICAgaWYocnVuKXsKICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRGeCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgIGZuLmNhbGwodGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAoKCQogICAgZnhXcmFwIDogZnVuY3Rpb24ocG9zLCBvLCB2aXMpewogICAgICAgIHZhciB3cmFwOwogICAgICAgIGlmKCFvLndyYXAgfHwgISh3cmFwID0gRXh0LmdldChvLndyYXApKSl7CiAgICAgICAgICAgIHZhciB3cmFwWFk7CiAgICAgICAgICAgIGlmKG8uZml4UG9zaXRpb24pewogICAgICAgICAgICAgICAgd3JhcFhZID0gdGhpcy5nZXRYWSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgICAgICAgZGl2LnN0eWxlLnZpc2liaWxpdHkgPSB2aXM7CiAgICAgICAgICAgIHdyYXAgPSBFeHQuZ2V0KHRoaXMuZG9tLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgdGhpcy5kb20pKTsKICAgICAgICAgICAgd3JhcC5zZXRQb3NpdGlvbmluZyhwb3MpOwogICAgICAgICAgICBpZih3cmFwLmdldFN0eWxlKCJwb3NpdGlvbiIpID09ICJzdGF0aWMiKXsKICAgICAgICAgICAgICAgIHdyYXAucG9zaXRpb24oInJlbGF0aXZlIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5jbGVhclBvc2l0aW9uaW5nKCdhdXRvJyk7CiAgICAgICAgICAgIHdyYXAuY2xpcCgpOwogICAgICAgICAgICB3cmFwLmRvbS5hcHBlbmRDaGlsZCh0aGlzLmRvbSk7CiAgICAgICAgICAgIGlmKHdyYXBYWSl7CiAgICAgICAgICAgICAgICB3cmFwLnNldFhZKHdyYXBYWSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHdyYXA7CiAgICB9LAoKCQogICAgZnhVbndyYXAgOiBmdW5jdGlvbih3cmFwLCBwb3MsIG8pewogICAgICAgIHRoaXMuY2xlYXJQb3NpdGlvbmluZygpOwogICAgICAgIHRoaXMuc2V0UG9zaXRpb25pbmcocG9zKTsKICAgICAgICBpZighby53cmFwKXsKICAgICAgICAgICAgd3JhcC5kb20ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5kb20sIHdyYXAuZG9tKTsKICAgICAgICAgICAgd3JhcC5yZW1vdmUoKTsKICAgICAgICB9CiAgICB9LAoKCQogICAgZ2V0RnhSZXN0b3JlIDogZnVuY3Rpb24oKXsKICAgICAgICB2YXIgc3QgPSB0aGlzLmRvbS5zdHlsZTsKICAgICAgICByZXR1cm4ge3BvczogdGhpcy5nZXRQb3NpdGlvbmluZygpLCB3aWR0aDogc3Qud2lkdGgsIGhlaWdodCA6IHN0LmhlaWdodH07CiAgICB9LAoKCQogICAgYWZ0ZXJGeCA6IGZ1bmN0aW9uKG8pewogICAgICAgIGlmKG8uYWZ0ZXJTdHlsZSl7CiAgICAgICAgICAgIHRoaXMuYXBwbHlTdHlsZXMoby5hZnRlclN0eWxlKTsKICAgICAgICB9CiAgICAgICAgaWYoby5hZnRlckNscyl7CiAgICAgICAgICAgIHRoaXMuYWRkQ2xhc3Moby5hZnRlckNscyk7CiAgICAgICAgfQogICAgICAgIGlmKG8ucmVtb3ZlID09PSB0cnVlKXsKICAgICAgICAgICAgdGhpcy5yZW1vdmUoKTsKICAgICAgICB9CiAgICAgICAgRXh0LmNhbGxiYWNrKG8uY2FsbGJhY2ssIG8uc2NvcGUsIFt0aGlzXSk7CiAgICAgICAgaWYoIW8uY29uY3VycmVudCl7CiAgICAgICAgICAgIHRoaXMuZnhRdWV1ZS5zaGlmdCgpOwogICAgICAgICAgICB0aGlzLm5leHRGeCgpOwogICAgICAgIH0KICAgIH0sCgoJCiAgICBnZXRGeEVsIDogZnVuY3Rpb24oKXsgICAgICAgICByZXR1cm4gRXh0LmdldCh0aGlzLmRvbSk7CiAgICB9LAoKCQogICAgZnhhbmltIDogZnVuY3Rpb24oYXJncywgb3B0LCBhbmltVHlwZSwgZGVmYXVsdER1ciwgZGVmYXVsdEVhc2UsIGNiKXsKICAgICAgICBhbmltVHlwZSA9IGFuaW1UeXBlIHx8ICdydW4nOwogICAgICAgIG9wdCA9IG9wdCB8fCB7fTsKICAgICAgICB2YXIgYW5pbSA9IEV4dC5saWIuQW5pbVthbmltVHlwZV0oCiAgICAgICAgICAgIHRoaXMuZG9tLCBhcmdzLAogICAgICAgICAgICAob3B0LmR1cmF0aW9uIHx8IGRlZmF1bHREdXIpIHx8IC4zNSwKICAgICAgICAgICAgKG9wdC5lYXNpbmcgfHwgZGVmYXVsdEVhc2UpIHx8ICdlYXNlT3V0JywKICAgICAgICAgICAgZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIEV4dC5jYWxsYmFjayhjYiwgdGhpcyk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHRoaXMKICAgICAgICApOwogICAgICAgIG9wdC5hbmltID0gYW5pbTsKICAgICAgICByZXR1cm4gYW5pbTsKICAgIH0KfTsKCkV4dC5GeC5yZXNpemUgPSBFeHQuRnguc2NhbGU7CgpFeHQuYXBwbHkoRXh0LkVsZW1lbnQucHJvdG90eXBlLCBFeHQuRngpOwoKDQpFeHQuQ29tcG9zaXRlRWxlbWVudCA9IGZ1bmN0aW9uKGVscyl7DQogICAgdGhpcy5lbGVtZW50cyA9IFtdOw0KICAgIHRoaXMuYWRkRWxlbWVudHMoZWxzKTsNCn07DQpFeHQuQ29tcG9zaXRlRWxlbWVudC5wcm90b3R5cGUgPSB7DQogICAgaXNDb21wb3NpdGU6IHRydWUsDQogICAgYWRkRWxlbWVudHMgOiBmdW5jdGlvbihlbHMpew0KICAgICAgICBpZighZWxzKSByZXR1cm4gdGhpczsNCiAgICAgICAgaWYodHlwZW9mIGVscyA9PSAic3RyaW5nIil7DQogICAgICAgICAgICBlbHMgPSBFeHQuRWxlbWVudC5zZWxlY3RvckZ1bmN0aW9uKGVscyk7DQogICAgICAgIH0NCiAgICAgICAgdmFyIHllbHMgPSB0aGlzLmVsZW1lbnRzOw0KICAgICAgICB2YXIgaW5kZXggPSB5ZWxzLmxlbmd0aC0xOw0KICAgICAgICBmb3IodmFyIGkgPSAwLCBsZW4gPSBlbHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsNCiAgICAgICAgCXllbHNbKytpbmRleF0gPSBFeHQuZ2V0KGVsc1tpXSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSwNCg0KICAgIA0KICAgIGZpbGwgOiBmdW5jdGlvbihlbHMpew0KICAgICAgICB0aGlzLmVsZW1lbnRzID0gW107DQogICAgICAgIHRoaXMuYWRkKGVscyk7DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0sDQoNCiAgICANCiAgICBmaWx0ZXIgOiBmdW5jdGlvbihzZWxlY3Rvcil7DQogICAgICAgIHZhciBlbHMgPSBbXTsNCiAgICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKGVsKXsNCiAgICAgICAgICAgIGlmKGVsLmlzKHNlbGVjdG9yKSl7DQogICAgICAgICAgICAgICAgZWxzW2Vscy5sZW5ndGhdID0gZWwuZG9tOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICAgICAgdGhpcy5maWxsKGVscyk7DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0sDQoNCiAgICBpbnZva2UgOiBmdW5jdGlvbihmbiwgYXJncyl7DQogICAgICAgIHZhciBlbHMgPSB0aGlzLmVsZW1lbnRzOw0KICAgICAgICBmb3IodmFyIGkgPSAwLCBsZW4gPSBlbHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsNCiAgICAgICAgCUV4dC5FbGVtZW50LnByb3RvdHlwZVtmbl0uYXBwbHkoZWxzW2ldLCBhcmdzKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9LA0KICAgIA0KICAgIGFkZCA6IGZ1bmN0aW9uKGVscyl7DQogICAgICAgIGlmKHR5cGVvZiBlbHMgPT0gInN0cmluZyIpew0KICAgICAgICAgICAgdGhpcy5hZGRFbGVtZW50cyhFeHQuRWxlbWVudC5zZWxlY3RvckZ1bmN0aW9uKGVscykpOw0KICAgICAgICB9ZWxzZSBpZihlbHMubGVuZ3RoICE9PSB1bmRlZmluZWQpew0KICAgICAgICAgICAgdGhpcy5hZGRFbGVtZW50cyhlbHMpOw0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIHRoaXMuYWRkRWxlbWVudHMoW2Vsc10pOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0sDQogICAgDQogICAgZWFjaCA6IGZ1bmN0aW9uKGZuLCBzY29wZSl7DQogICAgICAgIHZhciBlbHMgPSB0aGlzLmVsZW1lbnRzOw0KICAgICAgICBmb3IodmFyIGkgPSAwLCBsZW4gPSBlbHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspew0KICAgICAgICAgICAgaWYoZm4uY2FsbChzY29wZSB8fCBlbHNbaV0sIGVsc1tpXSwgdGhpcywgaSkgPT09IGZhbHNlKSB7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSwNCg0KICAgIA0KICAgIGl0ZW0gOiBmdW5jdGlvbihpbmRleCl7DQogICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRzW2luZGV4XSB8fCBudWxsOw0KICAgIH0sDQoNCiAgICANCiAgICBmaXJzdCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLml0ZW0oMCk7DQogICAgfSwNCg0KICAgIA0KICAgIGxhc3QgOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gdGhpcy5pdGVtKHRoaXMuZWxlbWVudHMubGVuZ3RoLTEpOw0KICAgIH0sDQoNCiAgICANCiAgICBnZXRDb3VudCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRzLmxlbmd0aDsNCiAgICB9LA0KDQogICAgDQogICAgY29udGFpbnMgOiBmdW5jdGlvbihlbCl7DQogICAgICAgIHJldHVybiB0aGlzLmluZGV4T2YoZWwpICE9PSAtMTsNCiAgICB9LA0KDQogICAgDQogICAgaW5kZXhPZiA6IGZ1bmN0aW9uKGVsKXsNCiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudHMuaW5kZXhPZihFeHQuZ2V0KGVsKSk7DQogICAgfSwNCg0KDQogICAgDQogICAgcmVtb3ZlRWxlbWVudCA6IGZ1bmN0aW9uKGVsLCByZW1vdmVEb20pew0KICAgICAgICBpZihlbCBpbnN0YW5jZW9mIEFycmF5KXsNCiAgICAgICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IGVsLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXsNCiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUVsZW1lbnQoZWxbaV0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgICAgIH0NCiAgICAgICAgdmFyIGluZGV4ID0gdHlwZW9mIGVsID09ICdudW1iZXInID8gZWwgOiB0aGlzLmluZGV4T2YoZWwpOw0KICAgICAgICBpZihpbmRleCAhPT0gLTEpew0KICAgICAgICAgICAgaWYocmVtb3ZlRG9tKXsNCiAgICAgICAgICAgICAgICB2YXIgZCA9IHRoaXMuZWxlbWVudHNbaW5kZXhdOw0KICAgICAgICAgICAgICAgIGlmKGQuZG9tKXsNCiAgICAgICAgICAgICAgICAgICAgZC5yZW1vdmUoKTsNCiAgICAgICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICAgICAgZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGQpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMuZWxlbWVudHMuc3BsaWNlKGluZGV4LCAxKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9LA0KDQogICAgDQogICAgcmVwbGFjZUVsZW1lbnQgOiBmdW5jdGlvbihlbCwgcmVwbGFjZW1lbnQsIGRvbVJlcGxhY2Upew0KICAgICAgICB2YXIgaW5kZXggPSB0eXBlb2YgZWwgPT0gJ251bWJlcicgPyBlbCA6IHRoaXMuaW5kZXhPZihlbCk7DQogICAgICAgIGlmKGluZGV4ICE9PSAtMSl7DQogICAgICAgICAgICBpZihkb21SZXBsYWNlKXsNCiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnRzW2luZGV4XS5yZXBsYWNlV2l0aChyZXBsYWNlbWVudCk7DQogICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnRzLnNwbGljZShpbmRleCwgMSwgRXh0LmdldChyZXBsYWNlbWVudCkpDQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSwNCg0KICAgIA0KICAgIGNsZWFyIDogZnVuY3Rpb24oKXsNCiAgICAgICAgdGhpcy5lbGVtZW50cyA9IFtdOw0KICAgIH0NCn07DQooZnVuY3Rpb24oKXsNCkV4dC5Db21wb3NpdGVFbGVtZW50LmNyZWF0ZUNhbGwgPSBmdW5jdGlvbihwcm90bywgZm5OYW1lKXsNCiAgICBpZighcHJvdG9bZm5OYW1lXSl7DQogICAgICAgIHByb3RvW2ZuTmFtZV0gPSBmdW5jdGlvbigpew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW52b2tlKGZuTmFtZSwgYXJndW1lbnRzKTsNCiAgICAgICAgfTsNCiAgICB9DQp9Ow0KZm9yKHZhciBmbk5hbWUgaW4gRXh0LkVsZW1lbnQucHJvdG90eXBlKXsNCiAgICBpZih0eXBlb2YgRXh0LkVsZW1lbnQucHJvdG90eXBlW2ZuTmFtZV0gPT0gImZ1bmN0aW9uIil7DQogICAgICAgIEV4dC5Db21wb3NpdGVFbGVtZW50LmNyZWF0ZUNhbGwoRXh0LkNvbXBvc2l0ZUVsZW1lbnQucHJvdG90eXBlLCBmbk5hbWUpOw0KICAgIH0NCn07DQp9KSgpOw0KDQoNCkV4dC5Db21wb3NpdGVFbGVtZW50TGl0ZSA9IGZ1bmN0aW9uKGVscyl7DQogICAgRXh0LkNvbXBvc2l0ZUVsZW1lbnRMaXRlLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBlbHMpOw0KICAgIHRoaXMuZWwgPSBuZXcgRXh0LkVsZW1lbnQuRmx5d2VpZ2h0KCk7DQp9Ow0KRXh0LmV4dGVuZChFeHQuQ29tcG9zaXRlRWxlbWVudExpdGUsIEV4dC5Db21wb3NpdGVFbGVtZW50LCB7DQogICAgYWRkRWxlbWVudHMgOiBmdW5jdGlvbihlbHMpew0KICAgICAgICBpZihlbHMpew0KICAgICAgICAgICAgaWYoZWxzIGluc3RhbmNlb2YgQXJyYXkpew0KICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudHMgPSB0aGlzLmVsZW1lbnRzLmNvbmNhdChlbHMpOw0KICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgdmFyIHllbHMgPSB0aGlzLmVsZW1lbnRzOw0KICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHllbHMubGVuZ3RoLTE7DQogICAgICAgICAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gZWxzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgIHllbHNbKytpbmRleF0gPSBlbHNbaV07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0sDQogICAgaW52b2tlIDogZnVuY3Rpb24oZm4sIGFyZ3Mpew0KICAgICAgICB2YXIgZWxzID0gdGhpcy5lbGVtZW50czsNCiAgICAgICAgdmFyIGVsID0gdGhpcy5lbDsNCiAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gZWxzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7DQogICAgICAgICAgICBlbC5kb20gPSBlbHNbaV07DQogICAgICAgIAlFeHQuRWxlbWVudC5wcm90b3R5cGVbZm5dLmFwcGx5KGVsLCBhcmdzKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9LA0KICAgIA0KICAgIGl0ZW0gOiBmdW5jdGlvbihpbmRleCl7DQogICAgICAgIGlmKCF0aGlzLmVsZW1lbnRzW2luZGV4XSl7DQogICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmVsLmRvbSA9IHRoaXMuZWxlbWVudHNbaW5kZXhdOw0KICAgICAgICByZXR1cm4gdGhpcy5lbDsNCiAgICB9LA0KDQogICAgCiAgICBhZGRMaXN0ZW5lciA6IGZ1bmN0aW9uKGV2ZW50TmFtZSwgaGFuZGxlciwgc2NvcGUsIG9wdCl7DQogICAgICAgIHZhciBlbHMgPSB0aGlzLmVsZW1lbnRzOw0KICAgICAgICBmb3IodmFyIGkgPSAwLCBsZW4gPSBlbHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsNCiAgICAgICAgICAgIEV4dC5FdmVudE1hbmFnZXIub24oZWxzW2ldLCBldmVudE5hbWUsIGhhbmRsZXIsIHNjb3BlIHx8IGVsc1tpXSwgb3B0KTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9LA0KDQogICAgDQogICAgZWFjaCA6IGZ1bmN0aW9uKGZuLCBzY29wZSl7DQogICAgICAgIHZhciBlbHMgPSB0aGlzLmVsZW1lbnRzOw0KICAgICAgICB2YXIgZWwgPSB0aGlzLmVsOw0KICAgICAgICBmb3IodmFyIGkgPSAwLCBsZW4gPSBlbHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspew0KICAgICAgICAgICAgZWwuZG9tID0gZWxzW2ldOw0KICAgICAgICAJaWYoZm4uY2FsbChzY29wZSB8fCBlbCwgZWwsIHRoaXMsIGkpID09PSBmYWxzZSl7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSwNCg0KICAgIGluZGV4T2YgOiBmdW5jdGlvbihlbCl7DQogICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRzLmluZGV4T2YoRXh0LmdldERvbShlbCkpOw0KICAgIH0sDQoNCiAgICByZXBsYWNlRWxlbWVudCA6IGZ1bmN0aW9uKGVsLCByZXBsYWNlbWVudCwgZG9tUmVwbGFjZSl7DQogICAgICAgIHZhciBpbmRleCA9IHR5cGVvZiBlbCA9PSAnbnVtYmVyJyA/IGVsIDogdGhpcy5pbmRleE9mKGVsKTsNCiAgICAgICAgaWYoaW5kZXggIT09IC0xKXsNCiAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gRXh0LmdldERvbShyZXBsYWNlbWVudCk7DQogICAgICAgICAgICBpZihkb21SZXBsYWNlKXsNCiAgICAgICAgICAgICAgICB2YXIgZCA9IHRoaXMuZWxlbWVudHNbaW5kZXhdOw0KICAgICAgICAgICAgICAgIGQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocmVwbGFjZW1lbnQsIGQpOw0KICAgICAgICAgICAgICAgIGQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMuZWxlbWVudHMuc3BsaWNlKGluZGV4LCAxLCByZXBsYWNlbWVudCk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfQ0KfSk7DQpFeHQuQ29tcG9zaXRlRWxlbWVudExpdGUucHJvdG90eXBlLm9uID0gRXh0LkNvbXBvc2l0ZUVsZW1lbnRMaXRlLnByb3RvdHlwZS5hZGRMaXN0ZW5lcjsNCmlmKEV4dC5Eb21RdWVyeSl7DQogICAgRXh0LkVsZW1lbnQuc2VsZWN0b3JGdW5jdGlvbiA9IEV4dC5Eb21RdWVyeS5zZWxlY3Q7DQp9DQoNCkV4dC5FbGVtZW50LnNlbGVjdCA9IGZ1bmN0aW9uKHNlbGVjdG9yLCB1bmlxdWUsIHJvb3Qpew0KICAgIHZhciBlbHM7DQogICAgaWYodHlwZW9mIHNlbGVjdG9yID09ICJzdHJpbmciKXsNCiAgICAgICAgZWxzID0gRXh0LkVsZW1lbnQuc2VsZWN0b3JGdW5jdGlvbihzZWxlY3Rvciwgcm9vdCk7DQogICAgfWVsc2UgaWYoc2VsZWN0b3IubGVuZ3RoICE9PSB1bmRlZmluZWQpew0KICAgICAgICBlbHMgPSBzZWxlY3RvcjsNCiAgICB9ZWxzZXsNCiAgICAgICAgdGhyb3cgIkludmFsaWQgc2VsZWN0b3IiOw0KICAgIH0NCiAgICBpZih1bmlxdWUgPT09IHRydWUpew0KICAgICAgICByZXR1cm4gbmV3IEV4dC5Db21wb3NpdGVFbGVtZW50KGVscyk7DQogICAgfWVsc2V7DQogICAgICAgIHJldHVybiBuZXcgRXh0LkNvbXBvc2l0ZUVsZW1lbnRMaXRlKGVscyk7DQogICAgfQ0KfTsNCg0KRXh0LnNlbGVjdCA9IEV4dC5FbGVtZW50LnNlbGVjdDsKDQpFeHQuZGF0YS5Db25uZWN0aW9uID0gZnVuY3Rpb24oY29uZmlnKXsNCiAgICBFeHQuYXBwbHkodGhpcywgY29uZmlnKTsNCiAgICB0aGlzLmFkZEV2ZW50cyh7DQogICAgICAgIA0KICAgICAgICAiYmVmb3JlcmVxdWVzdCIgOiB0cnVlLA0KICAgICAgICANCiAgICAgICAgInJlcXVlc3Rjb21wbGV0ZSIgOiB0cnVlLA0KICAgICAgICANCiAgICAgICAgInJlcXVlc3RleGNlcHRpb24iIDogdHJ1ZQ0KICAgIH0pOw0KICAgIEV4dC5kYXRhLkNvbm5lY3Rpb24uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpOw0KfTsNCg0KRXh0LmV4dGVuZChFeHQuZGF0YS5Db25uZWN0aW9uLCBFeHQudXRpbC5PYnNlcnZhYmxlLCB7DQogICAgDQogICAgDQogICAgDQogICAgDQogICAgDQogICAgdGltZW91dCA6IDMwMDAwLA0KICAgIA0KICAgIGF1dG9BYm9ydDpmYWxzZSwNCg0KICAgIA0KICAgIGRpc2FibGVDYWNoaW5nOiB0cnVlLA0KDQogICAgDQogICAgcmVxdWVzdCA6IGZ1bmN0aW9uKG8pew0KICAgICAgICBpZih0aGlzLmZpcmVFdmVudCgiYmVmb3JlcmVxdWVzdCIsIHRoaXMsIG8pICE9PSBmYWxzZSl7DQogICAgICAgICAgICB2YXIgcCA9IG8ucGFyYW1zOw0KDQogICAgICAgICAgICBpZih0eXBlb2YgcCA9PSAiZnVuY3Rpb24iKXsNCiAgICAgICAgICAgICAgICBwID0gcC5jYWxsKG8uc2NvcGV8fHdpbmRvdywgbyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZih0eXBlb2YgcCA9PSAib2JqZWN0Iil7DQogICAgICAgICAgICAgICAgcCA9IEV4dC51cmxFbmNvZGUoby5wYXJhbXMpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYodGhpcy5leHRyYVBhcmFtcyl7DQogICAgICAgICAgICAgICAgdmFyIGV4dHJhcyA9IEV4dC51cmxFbmNvZGUodGhpcy5leHRyYVBhcmFtcyk7DQogICAgICAgICAgICAgICAgcCA9IHAgPyAocCArICcmJyArIGV4dHJhcykgOiBleHRyYXM7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHZhciB1cmwgPSBvLnVybCB8fCB0aGlzLnVybDsNCiAgICAgICAgICAgIGlmKHR5cGVvZiB1cmwgPT0gJ2Z1bmN0aW9uJyl7DQogICAgICAgICAgICAgICAgdXJsID0gdXJsLmNhbGwoby5zY29wZXx8d2luZG93LCBvKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYoby5mb3JtKXsNCiAgICAgICAgICAgICAgICB2YXIgZm9ybSA9IEV4dC5nZXREb20oby5mb3JtKTsNCiAgICAgICAgICAgICAgICB1cmwgPSB1cmwgfHwgZm9ybS5hY3Rpb247DQoNCiAgICAgICAgICAgICAgICB2YXIgZW5jdHlwZSA9IGZvcm0uZ2V0QXR0cmlidXRlKCJlbmN0eXBlIik7DQogICAgICAgICAgICAgICAgaWYoby5pc1VwbG9hZCB8fCAoZW5jdHlwZSAmJiBlbmN0eXBlLnRvTG93ZXJDYXNlKCkgPT0gJ211bHRpcGFydC9mb3JtLWRhdGEnKSl7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRvRm9ybVVwbG9hZChvLCBwLCB1cmwpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB2YXIgZiA9IEV4dC5saWIuQWpheC5zZXJpYWxpemVGb3JtKGZvcm0pOw0KICAgICAgICAgICAgICAgIHAgPSBwID8gKHAgKyAnJicgKyBmKSA6IGY7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHZhciBocyA9IG8uaGVhZGVyczsNCiAgICAgICAgICAgIGlmKHRoaXMuZGVmYXVsdEhlYWRlcnMpew0KICAgICAgICAgICAgICAgIGhzID0gRXh0LmFwcGx5KGhzIHx8IHt9LCB0aGlzLmRlZmF1bHRIZWFkZXJzKTsNCiAgICAgICAgICAgICAgICBpZighby5oZWFkZXJzKXsNCiAgICAgICAgICAgICAgICAgICAgby5oZWFkZXJzID0gaHM7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2YXIgY2IgPSB7DQogICAgICAgICAgICAgICAgc3VjY2VzczogdGhpcy5oYW5kbGVSZXNwb25zZSwNCiAgICAgICAgICAgICAgICBmYWlsdXJlOiB0aGlzLmhhbmRsZUZhaWx1cmUsDQogICAgICAgICAgICAgICAgc2NvcGU6IHRoaXMsDQogICAgICAgICAgICAgICAgYXJndW1lbnQ6IHtvcHRpb25zOiBvfSwNCiAgICAgICAgICAgICAgICB0aW1lb3V0IDogdGhpcy50aW1lb3V0DQogICAgICAgICAgICB9Ow0KDQogICAgICAgICAgICB2YXIgbWV0aG9kID0gby5tZXRob2R8fHRoaXMubWV0aG9kfHwocCA/ICJQT1NUIiA6ICJHRVQiKTsNCg0KICAgICAgICAgICAgaWYobWV0aG9kID09ICdHRVQnICYmICh0aGlzLmRpc2FibGVDYWNoaW5nICYmIG8uZGlzYWJsZUNhY2hpbmcgIT09IGZhbHNlKSB8fCBvLmRpc2FibGVDYWNoaW5nID09PSB0cnVlKXsNCiAgICAgICAgICAgICAgICB1cmwgKz0gKHVybC5pbmRleE9mKCc/JykgIT0gLTEgPyAnJicgOiAnPycpICsgJ19kYz0nICsgKG5ldyBEYXRlKCkuZ2V0VGltZSgpKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYodHlwZW9mIG8uYXV0b0Fib3J0ID09ICdib29sZWFuJyl7IAogICAgICAgICAgICAgICAgaWYoby5hdXRvQWJvcnQpew0KICAgICAgICAgICAgICAgICAgICB0aGlzLmFib3J0KCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfWVsc2UgaWYodGhpcy5hdXRvQWJvcnQgIT09IGZhbHNlKXsNCiAgICAgICAgICAgICAgICB0aGlzLmFib3J0KCk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmKChtZXRob2QgPT0gJ0dFVCcgJiYgcCkgfHwgby54bWxEYXRhKXsNCiAgICAgICAgICAgICAgICB1cmwgKz0gKHVybC5pbmRleE9mKCc/JykgIT0gLTEgPyAnJicgOiAnPycpICsgcDsNCiAgICAgICAgICAgICAgICBwID0gJyc7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLnRyYW5zSWQgPSBFeHQubGliLkFqYXgucmVxdWVzdChtZXRob2QsIHVybCwgY2IsIHAsIG8pOw0KICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNJZDsNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICBFeHQuY2FsbGJhY2soby5jYWxsYmFjaywgby5zY29wZSwgW28sIG51bGwsIG51bGxdKTsNCiAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIGlzTG9hZGluZyA6IGZ1bmN0aW9uKHRyYW5zSWQpew0KICAgICAgICBpZih0cmFuc0lkKXsNCiAgICAgICAgICAgIHJldHVybiBFeHQubGliLkFqYXguaXNDYWxsSW5Qcm9ncmVzcyh0cmFuc0lkKTsNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc0lkID8gdHJ1ZSA6IGZhbHNlOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIGFib3J0IDogZnVuY3Rpb24odHJhbnNJZCl7DQogICAgICAgIGlmKHRyYW5zSWQgfHwgdGhpcy5pc0xvYWRpbmcoKSl7DQogICAgICAgICAgICBFeHQubGliLkFqYXguYWJvcnQodHJhbnNJZCB8fCB0aGlzLnRyYW5zSWQpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIAogICAgaGFuZGxlUmVzcG9uc2UgOiBmdW5jdGlvbihyZXNwb25zZSl7DQogICAgICAgIHRoaXMudHJhbnNJZCA9IGZhbHNlOw0KICAgICAgICB2YXIgb3B0aW9ucyA9IHJlc3BvbnNlLmFyZ3VtZW50Lm9wdGlvbnM7DQogICAgICAgIHJlc3BvbnNlLmFyZ3VtZW50ID0gb3B0aW9ucyA/IG9wdGlvbnMuYXJndW1lbnQgOiBudWxsOw0KICAgICAgICB0aGlzLmZpcmVFdmVudCgicmVxdWVzdGNvbXBsZXRlIiwgdGhpcywgcmVzcG9uc2UsIG9wdGlvbnMpOw0KICAgICAgICBFeHQuY2FsbGJhY2sob3B0aW9ucy5zdWNjZXNzLCBvcHRpb25zLnNjb3BlLCBbcmVzcG9uc2UsIG9wdGlvbnNdKTsNCiAgICAgICAgRXh0LmNhbGxiYWNrKG9wdGlvbnMuY2FsbGJhY2ssIG9wdGlvbnMuc2NvcGUsIFtvcHRpb25zLCB0cnVlLCByZXNwb25zZV0pOw0KICAgIH0sDQoNCiAgICAKICAgIGhhbmRsZUZhaWx1cmUgOiBmdW5jdGlvbihyZXNwb25zZSwgZSl7DQogICAgICAgIHRoaXMudHJhbnNJZCA9IGZhbHNlOw0KICAgICAgICB2YXIgb3B0aW9ucyA9IHJlc3BvbnNlLmFyZ3VtZW50Lm9wdGlvbnM7DQogICAgICAgIHJlc3BvbnNlLmFyZ3VtZW50ID0gb3B0aW9ucyA/IG9wdGlvbnMuYXJndW1lbnQgOiBudWxsOw0KICAgICAgICB0aGlzLmZpcmVFdmVudCgicmVxdWVzdGV4Y2VwdGlvbiIsIHRoaXMsIHJlc3BvbnNlLCBvcHRpb25zLCBlKTsNCiAgICAgICAgRXh0LmNhbGxiYWNrKG9wdGlvbnMuZmFpbHVyZSwgb3B0aW9ucy5zY29wZSwgW3Jlc3BvbnNlLCBvcHRpb25zXSk7DQogICAgICAgIEV4dC5jYWxsYmFjayhvcHRpb25zLmNhbGxiYWNrLCBvcHRpb25zLnNjb3BlLCBbb3B0aW9ucywgZmFsc2UsIHJlc3BvbnNlXSk7DQogICAgfSwNCg0KICAgIAogICAgZG9Gb3JtVXBsb2FkIDogZnVuY3Rpb24obywgcHMsIHVybCl7DQogICAgICAgIHZhciBpZCA9IEV4dC5pZCgpOw0KICAgICAgICB2YXIgZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTsNCiAgICAgICAgZnJhbWUuaWQgPSBpZDsNCiAgICAgICAgZnJhbWUubmFtZSA9IGlkOw0KICAgICAgICBmcmFtZS5jbGFzc05hbWUgPSAneC1oaWRkZW4nOw0KICAgICAgICBpZihFeHQuaXNJRSl7DQogICAgICAgICAgICBmcmFtZS5zcmMgPSBFeHQuU1NMX1NFQ1VSRV9VUkw7DQogICAgICAgIH0NCiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmcmFtZSk7DQoNCiAgICAgICAgaWYoRXh0LmlzSUUpew0KICAgICAgICAgICBkb2N1bWVudC5mcmFtZXNbaWRdLm5hbWUgPSBpZDsNCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBmb3JtID0gRXh0LmdldERvbShvLmZvcm0pOw0KICAgICAgICBmb3JtLnRhcmdldCA9IGlkOw0KICAgICAgICBmb3JtLm1ldGhvZCA9ICdQT1NUJzsNCiAgICAgICAgZm9ybS5lbmN0eXBlID0gZm9ybS5lbmNvZGluZyA9ICdtdWx0aXBhcnQvZm9ybS1kYXRhJzsNCiAgICAgICAgaWYodXJsKXsNCiAgICAgICAgICAgIGZvcm0uYWN0aW9uID0gdXJsOw0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIGhpZGRlbnMsIGhkOw0KICAgICAgICBpZihwcyl7IAogICAgICAgICAgICBoaWRkZW5zID0gW107DQogICAgICAgICAgICBwcyA9IEV4dC51cmxEZWNvZGUocHMsIGZhbHNlKTsNCiAgICAgICAgICAgIGZvcih2YXIgayBpbiBwcyl7DQogICAgICAgICAgICAgICAgaWYocHMuaGFzT3duUHJvcGVydHkoaykpew0KICAgICAgICAgICAgICAgICAgICBoZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7DQogICAgICAgICAgICAgICAgICAgIGhkLnR5cGUgPSAnaGlkZGVuJzsNCiAgICAgICAgICAgICAgICAgICAgaGQubmFtZSA9IGs7DQogICAgICAgICAgICAgICAgICAgIGhkLnZhbHVlID0gcHNba107DQogICAgICAgICAgICAgICAgICAgIGZvcm0uYXBwZW5kQ2hpbGQoaGQpOw0KICAgICAgICAgICAgICAgICAgICBoaWRkZW5zLnB1c2goaGQpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGZ1bmN0aW9uIGNiKCl7DQogICAgICAgICAgICB2YXIgciA9IHsgIAogICAgICAgICAgICAgICAgcmVzcG9uc2VUZXh0IDogJycsDQogICAgICAgICAgICAgICAgcmVzcG9uc2VYTUwgOiBudWxsDQogICAgICAgICAgICB9Ow0KDQogICAgICAgICAgICByLmFyZ3VtZW50ID0gbyA/IG8uYXJndW1lbnQgOiBudWxsOw0KDQogICAgICAgICAgICB0cnkgeyAKICAgICAgICAgICAgICAgIHZhciBkb2M7DQogICAgICAgICAgICAgICAgaWYoRXh0LmlzSUUpew0KICAgICAgICAgICAgICAgICAgICBkb2MgPSBmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50Ow0KICAgICAgICAgICAgICAgIH1lbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgZG9jID0gKGZyYW1lLmNvbnRlbnREb2N1bWVudCB8fCB3aW5kb3cuZnJhbWVzW2lkXS5kb2N1bWVudCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmKGRvYyAmJiBkb2MuYm9keSl7DQogICAgICAgICAgICAgICAgICAgIHIucmVzcG9uc2VUZXh0ID0gZG9jLmJvZHkuaW5uZXJIVE1MOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZihkb2MgJiYgZG9jLlhNTERvY3VtZW50KXsNCiAgICAgICAgICAgICAgICAgICAgci5yZXNwb25zZVhNTCA9IGRvYy5YTUxEb2N1bWVudDsNCiAgICAgICAgICAgICAgICB9ZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHIucmVzcG9uc2VYTUwgPSBkb2M7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2F0Y2goZSkgew0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIEV4dC5FdmVudE1hbmFnZXIucmVtb3ZlTGlzdGVuZXIoZnJhbWUsICdsb2FkJywgY2IsIHRoaXMpOw0KDQogICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgicmVxdWVzdGNvbXBsZXRlIiwgdGhpcywgciwgbyk7DQogICAgICAgICAgICBFeHQuY2FsbGJhY2soby5zdWNjZXNzLCBvLnNjb3BlLCBbciwgb10pOw0KICAgICAgICAgICAgRXh0LmNhbGxiYWNrKG8uY2FsbGJhY2ssIG8uc2NvcGUsIFtvLCB0cnVlLCByXSk7DQoNCiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGZyYW1lKTt9LCAxMDApOw0KICAgICAgICB9DQoNCiAgICAgICAgRXh0LkV2ZW50TWFuYWdlci5vbihmcmFtZSwgJ2xvYWQnLCBjYiwgdGhpcyk7DQogICAgICAgIGZvcm0uc3VibWl0KCk7DQoNCiAgICAgICAgaWYoaGlkZGVucyl7IAogICAgICAgICAgICBmb3IodmFyIGkgPSAwLCBsZW4gPSBoaWRkZW5zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXsNCiAgICAgICAgICAgICAgICBmb3JtLnJlbW92ZUNoaWxkKGhpZGRlbnNbaV0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KfSk7DQoNCg0KRXh0LkFqYXggPSBuZXcgRXh0LmRhdGEuQ29ubmVjdGlvbih7DQogICAgCiAgIA0KICAgIA0KICAgIA0KICAgIA0KICAgIA0KICAgIA0KDQogICAgDQoNCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCg0KICAgIA0KICAgIGF1dG9BYm9ydCA6IGZhbHNlLA0KDQogICAgDQogICAgc2VyaWFsaXplRm9ybSA6IGZ1bmN0aW9uKGZvcm0pew0KICAgICAgICByZXR1cm4gRXh0LmxpYi5BamF4LnNlcmlhbGl6ZUZvcm0oZm9ybSk7DQogICAgfQ0KfSk7Cg0KRXh0LlVwZGF0ZU1hbmFnZXIgPSBmdW5jdGlvbihlbCwgZm9yY2VOZXcpew0KICAgIGVsID0gRXh0LmdldChlbCk7DQogICAgaWYoIWZvcmNlTmV3ICYmIGVsLnVwZGF0ZU1hbmFnZXIpew0KICAgICAgICByZXR1cm4gZWwudXBkYXRlTWFuYWdlcjsNCiAgICB9DQogICAgDQogICAgdGhpcy5lbCA9IGVsOw0KICAgIA0KICAgIHRoaXMuZGVmYXVsdFVybCA9IG51bGw7DQoNCiAgICB0aGlzLmFkZEV2ZW50cyh7DQogICAgICAgIA0KICAgICAgICAiYmVmb3JldXBkYXRlIjogdHJ1ZSwNCiAgICAgICAgDQogICAgICAgICJ1cGRhdGUiOiB0cnVlLA0KICAgICAgICANCiAgICAgICAgImZhaWx1cmUiOiB0cnVlDQogICAgfSk7DQogICAgdmFyIGQgPSBFeHQuVXBkYXRlTWFuYWdlci5kZWZhdWx0czsNCiAgICANCiAgICB0aGlzLnNzbEJsYW5rVXJsID0gZC5zc2xCbGFua1VybDsNCiAgICANCiAgICB0aGlzLmRpc2FibGVDYWNoaW5nID0gZC5kaXNhYmxlQ2FjaGluZzsNCiAgICANCiAgICB0aGlzLmluZGljYXRvclRleHQgPSBkLmluZGljYXRvclRleHQ7DQogICAgDQogICAgdGhpcy5zaG93TG9hZEluZGljYXRvciA9IGQuc2hvd0xvYWRJbmRpY2F0b3I7DQogICAgDQogICAgdGhpcy50aW1lb3V0ID0gZC50aW1lb3V0Ow0KDQogICAgDQogICAgdGhpcy5sb2FkU2NyaXB0cyA9IGQubG9hZFNjcmlwdHM7DQoNCiAgICANCiAgICB0aGlzLnRyYW5zYWN0aW9uID0gbnVsbDsNCg0KICAgIA0KICAgIHRoaXMuYXV0b1JlZnJlc2hQcm9jSWQgPSBudWxsOw0KICAgIA0KICAgIHRoaXMucmVmcmVzaERlbGVnYXRlID0gdGhpcy5yZWZyZXNoLmNyZWF0ZURlbGVnYXRlKHRoaXMpOw0KICAgIA0KICAgIHRoaXMudXBkYXRlRGVsZWdhdGUgPSB0aGlzLnVwZGF0ZS5jcmVhdGVEZWxlZ2F0ZSh0aGlzKTsNCiAgICANCiAgICB0aGlzLmZvcm1VcGRhdGVEZWxlZ2F0ZSA9IHRoaXMuZm9ybVVwZGF0ZS5jcmVhdGVEZWxlZ2F0ZSh0aGlzKTsNCiAgICANCiAgICB0aGlzLnN1Y2Nlc3NEZWxlZ2F0ZSA9IHRoaXMucHJvY2Vzc1N1Y2Nlc3MuY3JlYXRlRGVsZWdhdGUodGhpcyk7DQogICAgDQogICAgdGhpcy5mYWlsdXJlRGVsZWdhdGUgPSB0aGlzLnByb2Nlc3NGYWlsdXJlLmNyZWF0ZURlbGVnYXRlKHRoaXMpOw0KDQogICAgaWYoIXRoaXMucmVuZGVyZXIpew0KICAgICANCiAgICB0aGlzLnJlbmRlcmVyID0gbmV3IEV4dC5VcGRhdGVNYW5hZ2VyLkJhc2ljUmVuZGVyZXIoKTsNCiAgICB9DQogICAgDQogICAgRXh0LlVwZGF0ZU1hbmFnZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpOw0KfTsNCg0KRXh0LmV4dGVuZChFeHQuVXBkYXRlTWFuYWdlciwgRXh0LnV0aWwuT2JzZXJ2YWJsZSwgew0KICAgIA0KICAgIGdldEVsIDogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIHRoaXMuZWw7DQogICAgfSwNCiAgICANCiAgICB1cGRhdGUgOiBmdW5jdGlvbih1cmwsIHBhcmFtcywgY2FsbGJhY2ssIGRpc2NhcmRVcmwpew0KICAgICAgICBpZih0aGlzLmZpcmVFdmVudCgiYmVmb3JldXBkYXRlIiwgdGhpcy5lbCwgdXJsLCBwYXJhbXMpICE9PSBmYWxzZSl7DQogICAgICAgICAgICB2YXIgbWV0aG9kID0gdGhpcy5tZXRob2QsIGNmZzsNCiAgICAgICAgICAgIGlmKHR5cGVvZiB1cmwgPT0gIm9iamVjdCIpeyAKICAgICAgICAgICAgICAgIGNmZyA9IHVybDsNCiAgICAgICAgICAgICAgICB1cmwgPSBjZmcudXJsOw0KICAgICAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcyB8fCBjZmcucGFyYW1zOw0KICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgY2ZnLmNhbGxiYWNrOw0KICAgICAgICAgICAgICAgIGRpc2NhcmRVcmwgPSBkaXNjYXJkVXJsIHx8IGNmZy5kaXNjYXJkVXJsOw0KICAgICAgICAgICAgICAgIGlmKGNhbGxiYWNrICYmIGNmZy5zY29wZSl7DQogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2suY3JlYXRlRGVsZWdhdGUoY2ZnLnNjb3BlKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYodHlwZW9mIGNmZy5tZXRob2QgIT0gInVuZGVmaW5lZCIpe21ldGhvZCA9IGNmZy5tZXRob2Q7fTsNCiAgICAgICAgICAgICAgICBpZih0eXBlb2YgY2ZnLm5vY2FjaGUgIT0gInVuZGVmaW5lZCIpe3RoaXMuZGlzYWJsZUNhY2hpbmcgPSBjZmcubm9jYWNoZTt9Ow0KICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBjZmcudGV4dCAhPSAidW5kZWZpbmVkIil7dGhpcy5pbmRpY2F0b3JUZXh0ID0gJzxkaXYgY2xhc3M9ImxvYWRpbmctaW5kaWNhdG9yIj4nK2NmZy50ZXh0KyI8L2Rpdj4iO307DQogICAgICAgICAgICAgICAgaWYodHlwZW9mIGNmZy5zY3JpcHRzICE9ICJ1bmRlZmluZWQiKXt0aGlzLmxvYWRTY3JpcHRzID0gY2ZnLnNjcmlwdHM7fTsNCiAgICAgICAgICAgICAgICBpZih0eXBlb2YgY2ZnLnRpbWVvdXQgIT0gInVuZGVmaW5lZCIpe3RoaXMudGltZW91dCA9IGNmZy50aW1lb3V0O307DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLnNob3dMb2FkaW5nKCk7DQogICAgICAgICAgICBpZighZGlzY2FyZFVybCl7DQogICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0VXJsID0gdXJsOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYodHlwZW9mIHVybCA9PSAiZnVuY3Rpb24iKXsNCiAgICAgICAgICAgICAgICB1cmwgPSB1cmwuY2FsbCh0aGlzKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgbWV0aG9kID0gbWV0aG9kIHx8IChwYXJhbXMgPyAiUE9TVCIgOiAiR0VUIik7DQogICAgICAgICAgICBpZihtZXRob2QgPT0gIkdFVCIpew0KICAgICAgICAgICAgICAgIHVybCA9IHRoaXMucHJlcGFyZVVybCh1cmwpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2YXIgbyA9IEV4dC5hcHBseShjZmcgfHx7fSwgew0KICAgICAgICAgICAgICAgIHVybCA6IHVybCwNCiAgICAgICAgICAgICAgICBwYXJhbXM6IHBhcmFtcywNCiAgICAgICAgICAgICAgICBzdWNjZXNzOiB0aGlzLnN1Y2Nlc3NEZWxlZ2F0ZSwNCiAgICAgICAgICAgICAgICBmYWlsdXJlOiB0aGlzLmZhaWx1cmVEZWxlZ2F0ZSwNCiAgICAgICAgICAgICAgICBjYWxsYmFjazogdW5kZWZpbmVkLA0KICAgICAgICAgICAgICAgIHRpbWVvdXQ6ICh0aGlzLnRpbWVvdXQqMTAwMCksDQogICAgICAgICAgICAgICAgYXJndW1lbnQ6IHsidXJsIjogdXJsLCAiZm9ybSI6IG51bGwsICJjYWxsYmFjayI6IGNhbGxiYWNrLCAicGFyYW1zIjogcGFyYW1zfQ0KICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb24gPSBFeHQuQWpheC5yZXF1ZXN0KG8pOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIGZvcm1VcGRhdGUgOiBmdW5jdGlvbihmb3JtLCB1cmwsIHJlc2V0LCBjYWxsYmFjayl7DQogICAgICAgIGlmKHRoaXMuZmlyZUV2ZW50KCJiZWZvcmV1cGRhdGUiLCB0aGlzLmVsLCBmb3JtLCB1cmwpICE9PSBmYWxzZSl7DQogICAgICAgICAgICBpZih0eXBlb2YgdXJsID09ICJmdW5jdGlvbiIpew0KICAgICAgICAgICAgICAgIHVybCA9IHVybC5jYWxsKHRoaXMpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZm9ybSA9IEV4dC5nZXREb20oZm9ybSkNCiAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb24gPSBFeHQuQWpheC5yZXF1ZXN0KHsNCiAgICAgICAgICAgICAgICBmb3JtOiBmb3JtLA0KICAgICAgICAgICAgICAgIHVybDp1cmwsDQogICAgICAgICAgICAgICAgc3VjY2VzczogdGhpcy5zdWNjZXNzRGVsZWdhdGUsDQogICAgICAgICAgICAgICAgZmFpbHVyZTogdGhpcy5mYWlsdXJlRGVsZWdhdGUsDQogICAgICAgICAgICAgICAgdGltZW91dDogKHRoaXMudGltZW91dCoxMDAwKSwNCiAgICAgICAgICAgICAgICBhcmd1bWVudDogeyJ1cmwiOiB1cmwsICJmb3JtIjogZm9ybSwgImNhbGxiYWNrIjogY2FsbGJhY2ssICJyZXNldCI6IHJlc2V0fQ0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB0aGlzLnNob3dMb2FkaW5nLmRlZmVyKDEsIHRoaXMpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIHJlZnJlc2ggOiBmdW5jdGlvbihjYWxsYmFjayl7DQogICAgICAgIGlmKHRoaXMuZGVmYXVsdFVybCA9PSBudWxsKXsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLnVwZGF0ZSh0aGlzLmRlZmF1bHRVcmwsIG51bGwsIGNhbGxiYWNrLCB0cnVlKTsNCiAgICB9LA0KDQogICAgDQogICAgc3RhcnRBdXRvUmVmcmVzaCA6IGZ1bmN0aW9uKGludGVydmFsLCB1cmwsIHBhcmFtcywgY2FsbGJhY2ssIHJlZnJlc2hOb3cpew0KICAgICAgICBpZihyZWZyZXNoTm93KXsNCiAgICAgICAgICAgIHRoaXMudXBkYXRlKHVybCB8fCB0aGlzLmRlZmF1bHRVcmwsIHBhcmFtcywgY2FsbGJhY2ssIHRydWUpOw0KICAgICAgICB9DQogICAgICAgIGlmKHRoaXMuYXV0b1JlZnJlc2hQcm9jSWQpew0KICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmF1dG9SZWZyZXNoUHJvY0lkKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmF1dG9SZWZyZXNoUHJvY0lkID0gc2V0SW50ZXJ2YWwodGhpcy51cGRhdGUuY3JlYXRlRGVsZWdhdGUodGhpcywgW3VybCB8fCB0aGlzLmRlZmF1bHRVcmwsIHBhcmFtcywgY2FsbGJhY2ssIHRydWVdKSwgaW50ZXJ2YWwqMTAwMCk7DQogICAgfSwNCg0KICAgIA0KICAgICBzdG9wQXV0b1JlZnJlc2ggOiBmdW5jdGlvbigpew0KICAgICAgICBpZih0aGlzLmF1dG9SZWZyZXNoUHJvY0lkKXsNCiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5hdXRvUmVmcmVzaFByb2NJZCk7DQogICAgICAgICAgICBkZWxldGUgdGhpcy5hdXRvUmVmcmVzaFByb2NJZDsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICBpc0F1dG9SZWZyZXNoaW5nIDogZnVuY3Rpb24oKXsNCiAgICAgICByZXR1cm4gdGhpcy5hdXRvUmVmcmVzaFByb2NJZCA/IHRydWUgOiBmYWxzZTsNCiAgICB9LA0KICAgIA0KICAgIHNob3dMb2FkaW5nIDogZnVuY3Rpb24oKXsNCiAgICAgICAgaWYodGhpcy5zaG93TG9hZEluZGljYXRvcil7DQogICAgICAgICAgICB0aGlzLmVsLnVwZGF0ZSh0aGlzLmluZGljYXRvclRleHQpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIHByZXBhcmVVcmwgOiBmdW5jdGlvbih1cmwpew0KICAgICAgICBpZih0aGlzLmRpc2FibGVDYWNoaW5nKXsNCiAgICAgICAgICAgIHZhciBhcHBlbmQgPSAiX2RjPSIgKyAobmV3IERhdGUoKS5nZXRUaW1lKCkpOw0KICAgICAgICAgICAgaWYodXJsLmluZGV4T2YoIj8iKSAhPT0gLTEpew0KICAgICAgICAgICAgICAgIHVybCArPSAiJiIgKyBhcHBlbmQ7DQogICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICB1cmwgKz0gIj8iICsgYXBwZW5kOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiB1cmw7DQogICAgfSwNCg0KICAgIA0KICAgIHByb2Nlc3NTdWNjZXNzIDogZnVuY3Rpb24ocmVzcG9uc2Upew0KICAgICAgICB0aGlzLnRyYW5zYWN0aW9uID0gbnVsbDsNCiAgICAgICAgaWYocmVzcG9uc2UuYXJndW1lbnQuZm9ybSAmJiByZXNwb25zZS5hcmd1bWVudC5yZXNldCl7DQogICAgICAgICAgICB0cnl7IAogICAgICAgICAgICAgICAgcmVzcG9uc2UuYXJndW1lbnQuZm9ybS5yZXNldCgpOw0KICAgICAgICAgICAgfWNhdGNoKGUpe30NCiAgICAgICAgfQ0KICAgICAgICBpZih0aGlzLmxvYWRTY3JpcHRzKXsNCiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVuZGVyKHRoaXMuZWwsIHJlc3BvbnNlLCB0aGlzLA0KICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ29tcGxldGUuY3JlYXRlRGVsZWdhdGUodGhpcywgW3Jlc3BvbnNlXSkpOw0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVuZGVyKHRoaXMuZWwsIHJlc3BvbnNlLCB0aGlzKTsNCiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29tcGxldGUocmVzcG9uc2UpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIHVwZGF0ZUNvbXBsZXRlIDogZnVuY3Rpb24ocmVzcG9uc2Upew0KICAgICAgICB0aGlzLmZpcmVFdmVudCgidXBkYXRlIiwgdGhpcy5lbCwgcmVzcG9uc2UpOw0KICAgICAgICBpZih0eXBlb2YgcmVzcG9uc2UuYXJndW1lbnQuY2FsbGJhY2sgPT0gImZ1bmN0aW9uIil7DQogICAgICAgICAgICByZXNwb25zZS5hcmd1bWVudC5jYWxsYmFjayh0aGlzLmVsLCB0cnVlLCByZXNwb25zZSk7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgDQogICAgcHJvY2Vzc0ZhaWx1cmUgOiBmdW5jdGlvbihyZXNwb25zZSl7DQogICAgICAgIHRoaXMudHJhbnNhY3Rpb24gPSBudWxsOw0KICAgICAgICB0aGlzLmZpcmVFdmVudCgiZmFpbHVyZSIsIHRoaXMuZWwsIHJlc3BvbnNlKTsNCiAgICAgICAgaWYodHlwZW9mIHJlc3BvbnNlLmFyZ3VtZW50LmNhbGxiYWNrID09ICJmdW5jdGlvbiIpew0KICAgICAgICAgICAgcmVzcG9uc2UuYXJndW1lbnQuY2FsbGJhY2sodGhpcy5lbCwgZmFsc2UsIHJlc3BvbnNlKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICANCiAgICBzZXRSZW5kZXJlciA6IGZ1bmN0aW9uKHJlbmRlcmVyKXsNCiAgICAgICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyOw0KICAgIH0sDQoNCiAgICBnZXRSZW5kZXJlciA6IGZ1bmN0aW9uKCl7DQogICAgICAgcmV0dXJuIHRoaXMucmVuZGVyZXI7DQogICAgfSwNCg0KICAgIA0KICAgIHNldERlZmF1bHRVcmwgOiBmdW5jdGlvbihkZWZhdWx0VXJsKXsNCiAgICAgICAgdGhpcy5kZWZhdWx0VXJsID0gZGVmYXVsdFVybDsNCiAgICB9LA0KDQogICAgDQogICAgYWJvcnQgOiBmdW5jdGlvbigpew0KICAgICAgICBpZih0aGlzLnRyYW5zYWN0aW9uKXsNCiAgICAgICAgICAgIEV4dC5BamF4LmFib3J0KHRoaXMudHJhbnNhY3Rpb24pOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIGlzVXBkYXRpbmcgOiBmdW5jdGlvbigpew0KICAgICAgICBpZih0aGlzLnRyYW5zYWN0aW9uKXsNCiAgICAgICAgICAgIHJldHVybiBFeHQuQWpheC5pc0xvYWRpbmcodGhpcy50cmFuc2FjdGlvbik7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH0NCn0pOw0KDQoNCiAgIEV4dC5VcGRhdGVNYW5hZ2VyLmRlZmF1bHRzID0gew0KICAgICAgIA0KICAgICAgICAgdGltZW91dCA6IDMwLA0KDQogICAgICAgICANCiAgICAgICAgbG9hZFNjcmlwdHMgOiBmYWxzZSwNCg0KICAgICAgICANCiAgICAgICAgc3NsQmxhbmtVcmwgOiAoRXh0LlNTTF9TRUNVUkVfVVJMIHx8ICJqYXZhc2NyaXB0OmZhbHNlIiksDQogICAgICAgIA0KICAgICAgICBkaXNhYmxlQ2FjaGluZyA6IGZhbHNlLA0KICAgICAgICANCiAgICAgICAgc2hvd0xvYWRJbmRpY2F0b3IgOiB0cnVlLA0KICAgICAgICANCiAgICAgICAgaW5kaWNhdG9yVGV4dCA6ICc8ZGl2IGNsYXNzPSJsb2FkaW5nLWluZGljYXRvciI+TG9hZGluZy4uLjwvZGl2PicNCiAgIH07DQoNCg0KRXh0LlVwZGF0ZU1hbmFnZXIudXBkYXRlRWxlbWVudCA9IGZ1bmN0aW9uKGVsLCB1cmwsIHBhcmFtcywgb3B0aW9ucyl7DQogICAgdmFyIHVtID0gRXh0LmdldChlbCwgdHJ1ZSkuZ2V0VXBkYXRlTWFuYWdlcigpOw0KICAgIEV4dC5hcHBseSh1bSwgb3B0aW9ucyk7DQogICAgdW0udXBkYXRlKHVybCwgcGFyYW1zLCBvcHRpb25zID8gb3B0aW9ucy5jYWxsYmFjayA6IG51bGwpOw0KfTsNCgpFeHQuVXBkYXRlTWFuYWdlci51cGRhdGUgPSBFeHQuVXBkYXRlTWFuYWdlci51cGRhdGVFbGVtZW50Ow0KDQpFeHQuVXBkYXRlTWFuYWdlci5CYXNpY1JlbmRlcmVyID0gZnVuY3Rpb24oKXt9Ow0KDQpFeHQuVXBkYXRlTWFuYWdlci5CYXNpY1JlbmRlcmVyLnByb3RvdHlwZSA9IHsNCiAgICANCiAgICAgcmVuZGVyIDogZnVuY3Rpb24oZWwsIHJlc3BvbnNlLCB1cGRhdGVNYW5hZ2VyLCBjYWxsYmFjayl7DQogICAgICAgIGVsLnVwZGF0ZShyZXNwb25zZS5yZXNwb25zZVRleHQsIHVwZGF0ZU1hbmFnZXIubG9hZFNjcmlwdHMsIGNhbGxiYWNrKTsNCiAgICB9DQp9Ow0KCg0KDQoNCg0KCkRhdGUucGFyc2VGdW5jdGlvbnMgPSB7Y291bnQ6MH07DQoKRGF0ZS5wYXJzZVJlZ2V4ZXMgPSBbXTsNCgpEYXRlLmZvcm1hdEZ1bmN0aW9ucyA9IHtjb3VudDowfTsNCg0KCkRhdGUucHJvdG90eXBlLmRhdGVGb3JtYXQgPSBmdW5jdGlvbihmb3JtYXQpIHsNCiAgICBpZiAoRGF0ZS5mb3JtYXRGdW5jdGlvbnNbZm9ybWF0XSA9PSBudWxsKSB7DQogICAgICAgIERhdGUuY3JlYXRlTmV3Rm9ybWF0KGZvcm1hdCk7DQogICAgfQ0KICAgIHZhciBmdW5jID0gRGF0ZS5mb3JtYXRGdW5jdGlvbnNbZm9ybWF0XTsNCiAgICByZXR1cm4gdGhpc1tmdW5jXSgpOw0KfTsNCg0KDQoNCkRhdGUucHJvdG90eXBlLmZvcm1hdCA9IERhdGUucHJvdG90eXBlLmRhdGVGb3JtYXQ7DQoNCgpEYXRlLmNyZWF0ZU5ld0Zvcm1hdCA9IGZ1bmN0aW9uKGZvcm1hdCkgew0KICAgIHZhciBmdW5jTmFtZSA9ICJmb3JtYXQiICsgRGF0ZS5mb3JtYXRGdW5jdGlvbnMuY291bnQrKzsNCiAgICBEYXRlLmZvcm1hdEZ1bmN0aW9uc1tmb3JtYXRdID0gZnVuY05hbWU7DQogICAgdmFyIGNvZGUgPSAiRGF0ZS5wcm90b3R5cGUuIiArIGZ1bmNOYW1lICsgIiA9IGZ1bmN0aW9uKCl7cmV0dXJuICI7DQogICAgdmFyIHNwZWNpYWwgPSBmYWxzZTsNCiAgICB2YXIgY2ggPSAnJzsNCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZvcm1hdC5sZW5ndGg7ICsraSkgew0KICAgICAgICBjaCA9IGZvcm1hdC5jaGFyQXQoaSk7DQogICAgICAgIGlmICghc3BlY2lhbCAmJiBjaCA9PSAiXFwiKSB7DQogICAgICAgICAgICBzcGVjaWFsID0gdHJ1ZTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmIChzcGVjaWFsKSB7DQogICAgICAgICAgICBzcGVjaWFsID0gZmFsc2U7DQogICAgICAgICAgICBjb2RlICs9ICInIiArIFN0cmluZy5lc2NhcGUoY2gpICsgIicgKyAiOw0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgY29kZSArPSBEYXRlLmdldEZvcm1hdENvZGUoY2gpOw0KICAgICAgICB9DQogICAgfQ0KICAgIGV2YWwoY29kZS5zdWJzdHJpbmcoMCwgY29kZS5sZW5ndGggLSAzKSArICI7fSIpOw0KfTsNCg0KCkRhdGUuZ2V0Rm9ybWF0Q29kZSA9IGZ1bmN0aW9uKGNoYXJhY3Rlcikgew0KICAgIHN3aXRjaCAoY2hhcmFjdGVyKSB7DQogICAgY2FzZSAiZCI6DQogICAgICAgIHJldHVybiAiU3RyaW5nLmxlZnRQYWQodGhpcy5nZXREYXRlKCksIDIsICcwJykgKyAiOw0KICAgIGNhc2UgIkQiOg0KICAgICAgICByZXR1cm4gIkRhdGUuZGF5TmFtZXNbdGhpcy5nZXREYXkoKV0uc3Vic3RyaW5nKDAsIDMpICsgIjsNCiAgICBjYXNlICJqIjoNCiAgICAgICAgcmV0dXJuICJ0aGlzLmdldERhdGUoKSArICI7DQogICAgY2FzZSAibCI6DQogICAgICAgIHJldHVybiAiRGF0ZS5kYXlOYW1lc1t0aGlzLmdldERheSgpXSArICI7DQogICAgY2FzZSAiUyI6DQogICAgICAgIHJldHVybiAidGhpcy5nZXRTdWZmaXgoKSArICI7DQogICAgY2FzZSAidyI6DQogICAgICAgIHJldHVybiAidGhpcy5nZXREYXkoKSArICI7DQogICAgY2FzZSAieiI6DQogICAgICAgIHJldHVybiAidGhpcy5nZXREYXlPZlllYXIoKSArICI7DQogICAgY2FzZSAiVyI6DQogICAgICAgIHJldHVybiAidGhpcy5nZXRXZWVrT2ZZZWFyKCkgKyAiOw0KICAgIGNhc2UgIkYiOg0KICAgICAgICByZXR1cm4gIkRhdGUubW9udGhOYW1lc1t0aGlzLmdldE1vbnRoKCldICsgIjsNCiAgICBjYXNlICJtIjoNCiAgICAgICAgcmV0dXJuICJTdHJpbmcubGVmdFBhZCh0aGlzLmdldE1vbnRoKCkgKyAxLCAyLCAnMCcpICsgIjsNCiAgICBjYXNlICJNIjoNCiAgICAgICAgcmV0dXJuICJEYXRlLm1vbnRoTmFtZXNbdGhpcy5nZXRNb250aCgpXS5zdWJzdHJpbmcoMCwgMykgKyAiOw0KICAgIGNhc2UgIm4iOg0KICAgICAgICByZXR1cm4gIih0aGlzLmdldE1vbnRoKCkgKyAxKSArICI7DQogICAgY2FzZSAidCI6DQogICAgICAgIHJldHVybiAidGhpcy5nZXREYXlzSW5Nb250aCgpICsgIjsNCiAgICBjYXNlICJMIjoNCiAgICAgICAgcmV0dXJuICIodGhpcy5pc0xlYXBZZWFyKCkgPyAxIDogMCkgKyAiOw0KICAgIGNhc2UgIlkiOg0KICAgICAgICByZXR1cm4gInRoaXMuZ2V0RnVsbFllYXIoKSArICI7DQogICAgY2FzZSAieSI6DQogICAgICAgIHJldHVybiAiKCcnICsgdGhpcy5nZXRGdWxsWWVhcigpKS5zdWJzdHJpbmcoMiwgNCkgKyAiOw0KICAgIGNhc2UgImEiOg0KICAgICAgICByZXR1cm4gIih0aGlzLmdldEhvdXJzKCkgPCAxMiA/ICdhbScgOiAncG0nKSArICI7DQogICAgY2FzZSAiQSI6DQogICAgICAgIHJldHVybiAiKHRoaXMuZ2V0SG91cnMoKSA8IDEyID8gJ0FNJyA6ICdQTScpICsgIjsNCiAgICBjYXNlICJnIjoNCiAgICAgICAgcmV0dXJuICIoKHRoaXMuZ2V0SG91cnMoKSAlIDEyKSA/IHRoaXMuZ2V0SG91cnMoKSAlIDEyIDogMTIpICsgIjsNCiAgICBjYXNlICJHIjoNCiAgICAgICAgcmV0dXJuICJ0aGlzLmdldEhvdXJzKCkgKyAiOw0KICAgIGNhc2UgImgiOg0KICAgICAgICByZXR1cm4gIlN0cmluZy5sZWZ0UGFkKCh0aGlzLmdldEhvdXJzKCkgJSAxMikgPyB0aGlzLmdldEhvdXJzKCkgJSAxMiA6IDEyLCAyLCAnMCcpICsgIjsNCiAgICBjYXNlICJIIjoNCiAgICAgICAgcmV0dXJuICJTdHJpbmcubGVmdFBhZCh0aGlzLmdldEhvdXJzKCksIDIsICcwJykgKyAiOw0KICAgIGNhc2UgImkiOg0KICAgICAgICByZXR1cm4gIlN0cmluZy5sZWZ0UGFkKHRoaXMuZ2V0TWludXRlcygpLCAyLCAnMCcpICsgIjsNCiAgICBjYXNlICJzIjoNCiAgICAgICAgcmV0dXJuICJTdHJpbmcubGVmdFBhZCh0aGlzLmdldFNlY29uZHMoKSwgMiwgJzAnKSArICI7DQogICAgY2FzZSAiTyI6DQogICAgICAgIHJldHVybiAidGhpcy5nZXRHTVRPZmZzZXQoKSArICI7DQogICAgY2FzZSAiVCI6DQogICAgICAgIHJldHVybiAidGhpcy5nZXRUaW1lem9uZSgpICsgIjsNCiAgICBjYXNlICJaIjoNCiAgICAgICAgcmV0dXJuICIodGhpcy5nZXRUaW1lem9uZU9mZnNldCgpICogLTYwKSArICI7DQogICAgZGVmYXVsdDoNCiAgICAgICAgcmV0dXJuICInIiArIFN0cmluZy5lc2NhcGUoY2hhcmFjdGVyKSArICInICsgIjsNCiAgICB9DQp9Ow0KDQoNCkRhdGUucGFyc2VEYXRlID0gZnVuY3Rpb24oaW5wdXQsIGZvcm1hdCkgew0KICAgIGlmIChEYXRlLnBhcnNlRnVuY3Rpb25zW2Zvcm1hdF0gPT0gbnVsbCkgew0KICAgICAgICBEYXRlLmNyZWF0ZVBhcnNlcihmb3JtYXQpOw0KICAgIH0NCiAgICB2YXIgZnVuYyA9IERhdGUucGFyc2VGdW5jdGlvbnNbZm9ybWF0XTsNCiAgICByZXR1cm4gRGF0ZVtmdW5jXShpbnB1dCk7DQp9Ow0KDQoKRGF0ZS5jcmVhdGVQYXJzZXIgPSBmdW5jdGlvbihmb3JtYXQpIHsNCiAgICB2YXIgZnVuY05hbWUgPSAicGFyc2UiICsgRGF0ZS5wYXJzZUZ1bmN0aW9ucy5jb3VudCsrOw0KICAgIHZhciByZWdleE51bSA9IERhdGUucGFyc2VSZWdleGVzLmxlbmd0aDsNCiAgICB2YXIgY3VycmVudEdyb3VwID0gMTsNCiAgICBEYXRlLnBhcnNlRnVuY3Rpb25zW2Zvcm1hdF0gPSBmdW5jTmFtZTsNCg0KICAgIHZhciBjb2RlID0gIkRhdGUuIiArIGZ1bmNOYW1lICsgIiA9IGZ1bmN0aW9uKGlucHV0KXtcbiINCiAgICAgICAgKyAidmFyIHkgPSAtMSwgbSA9IC0xLCBkID0gLTEsIGggPSAtMSwgaSA9IC0xLCBzID0gLTEsIG8sIHosIHY7XG4iDQogICAgICAgICsgInZhciBkID0gbmV3IERhdGUoKTtcbiINCiAgICAgICAgKyAieSA9IGQuZ2V0RnVsbFllYXIoKTtcbiINCiAgICAgICAgKyAibSA9IGQuZ2V0TW9udGgoKTtcbiINCiAgICAgICAgKyAiZCA9IGQuZ2V0RGF0ZSgpO1xuIg0KICAgICAgICArICJ2YXIgcmVzdWx0cyA9IGlucHV0Lm1hdGNoKERhdGUucGFyc2VSZWdleGVzWyIgKyByZWdleE51bSArICJdKTtcbiINCiAgICAgICAgKyAiaWYgKHJlc3VsdHMgJiYgcmVzdWx0cy5sZW5ndGggPiAwKSB7IjsNCiAgICB2YXIgcmVnZXggPSAiIjsNCg0KICAgIHZhciBzcGVjaWFsID0gZmFsc2U7DQogICAgdmFyIGNoID0gJyc7DQogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmb3JtYXQubGVuZ3RoOyArK2kpIHsNCiAgICAgICAgY2ggPSBmb3JtYXQuY2hhckF0KGkpOw0KICAgICAgICBpZiAoIXNwZWNpYWwgJiYgY2ggPT0gIlxcIikgew0KICAgICAgICAgICAgc3BlY2lhbCA9IHRydWU7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSBpZiAoc3BlY2lhbCkgew0KICAgICAgICAgICAgc3BlY2lhbCA9IGZhbHNlOw0KICAgICAgICAgICAgcmVnZXggKz0gU3RyaW5nLmVzY2FwZShjaCk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICB2YXIgb2JqID0gRGF0ZS5mb3JtYXRDb2RlVG9SZWdleChjaCwgY3VycmVudEdyb3VwKTsNCiAgICAgICAgICAgIGN1cnJlbnRHcm91cCArPSBvYmouZzsNCiAgICAgICAgICAgIHJlZ2V4ICs9IG9iai5zOw0KICAgICAgICAgICAgaWYgKG9iai5nICYmIG9iai5jKSB7DQogICAgICAgICAgICAgICAgY29kZSArPSBvYmouYzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGNvZGUgKz0gImlmICh5ID49IDAgJiYgbSA+PSAwICYmIGQgPiAwICYmIGggPj0gMCAmJiBpID49IDAgJiYgcyA+PSAwKVxuIg0KICAgICAgICArICJ7diA9IG5ldyBEYXRlKHksIG0sIGQsIGgsIGksIHMpO31cbiINCiAgICAgICAgKyAiZWxzZSBpZiAoeSA+PSAwICYmIG0gPj0gMCAmJiBkID4gMCAmJiBoID49IDAgJiYgaSA+PSAwKVxuIg0KICAgICAgICArICJ7diA9IG5ldyBEYXRlKHksIG0sIGQsIGgsIGkpO31cbiINCiAgICAgICAgKyAiZWxzZSBpZiAoeSA+PSAwICYmIG0gPj0gMCAmJiBkID4gMCAmJiBoID49IDApXG4iDQogICAgICAgICsgInt2ID0gbmV3IERhdGUoeSwgbSwgZCwgaCk7fVxuIg0KICAgICAgICArICJlbHNlIGlmICh5ID49IDAgJiYgbSA+PSAwICYmIGQgPiAwKVxuIg0KICAgICAgICArICJ7diA9IG5ldyBEYXRlKHksIG0sIGQpO31cbiINCiAgICAgICAgKyAiZWxzZSBpZiAoeSA+PSAwICYmIG0gPj0gMClcbiINCiAgICAgICAgKyAie3YgPSBuZXcgRGF0ZSh5LCBtKTt9XG4iDQogICAgICAgICsgImVsc2UgaWYgKHkgPj0gMClcbiINCiAgICAgICAgKyAie3YgPSBuZXcgRGF0ZSh5KTt9XG4iDQogICAgICAgICsgIn1yZXR1cm4gKHYgJiYgKHogfHwgbykpP1xuIiAKICAgICAgICArICIgICAgKCh6KT8gdi5hZGQoRGF0ZS5TRUNPTkQsICh2LmdldFRpbWV6b25lT2Zmc2V0KCkgKiA2MCkgKyAoeioxKSkgOlxuIiAKICAgICAgICArICIgICAgICAgIHYuYWRkKERhdGUuSE9VUiwgKHYuZ2V0R01UT2Zmc2V0KCkgLyAxMDApICsgKG8gLyAtMTAwKSkpIDogdlxuIiAKICAgICAgICArICI7fSI7DQoNCiAgICBEYXRlLnBhcnNlUmVnZXhlc1tyZWdleE51bV0gPSBuZXcgUmVnRXhwKCJeIiArIHJlZ2V4ICsgIiQiKTsNCiAgICBldmFsKGNvZGUpOw0KfTsNCg0KCkRhdGUuZm9ybWF0Q29kZVRvUmVnZXggPSBmdW5jdGlvbihjaGFyYWN0ZXIsIGN1cnJlbnRHcm91cCkgew0KICAgIHN3aXRjaCAoY2hhcmFjdGVyKSB7DQogICAgY2FzZSAiRCI6DQogICAgICAgIHJldHVybiB7ZzowLA0KICAgICAgICBjOm51bGwsDQogICAgICAgIHM6Iig/OlN1bnxNb258VHVlfFdlZHxUaHV8RnJpfFNhdCkifTsNCiAgICBjYXNlICJqIjoNCiAgICAgICAgcmV0dXJuIHtnOjEsDQogICAgICAgICAgICBjOiJkID0gcGFyc2VJbnQocmVzdWx0c1siICsgY3VycmVudEdyb3VwICsgIl0sIDEwKTtcbiIsDQogICAgICAgICAgICBzOiIoXFxkezEsMn0pIn07IAogICAgY2FzZSAiZCI6DQogICAgICAgIHJldHVybiB7ZzoxLA0KICAgICAgICAgICAgYzoiZCA9IHBhcnNlSW50KHJlc3VsdHNbIiArIGN1cnJlbnRHcm91cCArICJdLCAxMCk7XG4iLA0KICAgICAgICAgICAgczoiKFxcZHsyfSkifTsgCiAgICBjYXNlICJsIjoNCiAgICAgICAgcmV0dXJuIHtnOjAsDQogICAgICAgICAgICBjOm51bGwsDQogICAgICAgICAgICBzOiIoPzoiICsgRGF0ZS5kYXlOYW1lcy5qb2luKCJ8IikgKyAiKSJ9Ow0KICAgIGNhc2UgIlMiOg0KICAgICAgICByZXR1cm4ge2c6MCwNCiAgICAgICAgICAgIGM6bnVsbCwNCiAgICAgICAgICAgIHM6Iig/OnN0fG5kfHJkfHRoKSJ9Ow0KICAgIGNhc2UgInciOg0KICAgICAgICByZXR1cm4ge2c6MCwNCiAgICAgICAgICAgIGM6bnVsbCwNCiAgICAgICAgICAgIHM6IlxcZCJ9Ow0KICAgIGNhc2UgInoiOg0KICAgICAgICByZXR1cm4ge2c6MCwNCiAgICAgICAgICAgIGM6bnVsbCwNCiAgICAgICAgICAgIHM6Iig/OlxcZHsxLDN9KSJ9Ow0KICAgIGNhc2UgIlciOg0KICAgICAgICByZXR1cm4ge2c6MCwNCiAgICAgICAgICAgIGM6bnVsbCwNCiAgICAgICAgICAgIHM6Iig/OlxcZHsyfSkifTsNCiAgICBjYXNlICJGIjoNCiAgICAgICAgcmV0dXJuIHtnOjEsDQogICAgICAgICAgICBjOiJtID0gcGFyc2VJbnQoRGF0ZS5tb250aE51bWJlcnNbcmVzdWx0c1siICsgY3VycmVudEdyb3VwICsgIl0uc3Vic3RyaW5nKDAsIDMpXSwgMTApO1xuIiwNCiAgICAgICAgICAgIHM6IigiICsgRGF0ZS5tb250aE5hbWVzLmpvaW4oInwiKSArICIpIn07DQogICAgY2FzZSAiTSI6DQogICAgICAgIHJldHVybiB7ZzoxLA0KICAgICAgICAgICAgYzoibSA9IHBhcnNlSW50KERhdGUubW9udGhOdW1iZXJzW3Jlc3VsdHNbIiArIGN1cnJlbnRHcm91cCArICJdXSwgMTApO1xuIiwNCiAgICAgICAgICAgIHM6IihKYW58RmVifE1hcnxBcHJ8TWF5fEp1bnxKdWx8QXVnfFNlcHxPY3R8Tm92fERlYykifTsNCiAgICBjYXNlICJuIjoNCiAgICAgICAgcmV0dXJuIHtnOjEsDQogICAgICAgICAgICBjOiJtID0gcGFyc2VJbnQocmVzdWx0c1siICsgY3VycmVudEdyb3VwICsgIl0sIDEwKSAtIDE7XG4iLA0KICAgICAgICAgICAgczoiKFxcZHsxLDJ9KSJ9OyAKICAgIGNhc2UgIm0iOg0KICAgICAgICByZXR1cm4ge2c6MSwNCiAgICAgICAgICAgIGM6Im0gPSBwYXJzZUludChyZXN1bHRzWyIgKyBjdXJyZW50R3JvdXAgKyAiXSwgMTApIC0gMTtcbiIsDQogICAgICAgICAgICBzOiIoXFxkezJ9KSJ9OyAKICAgIGNhc2UgInQiOg0KICAgICAgICByZXR1cm4ge2c6MCwNCiAgICAgICAgICAgIGM6bnVsbCwNCiAgICAgICAgICAgIHM6IlxcZHsxLDJ9In07DQogICAgY2FzZSAiTCI6DQogICAgICAgIHJldHVybiB7ZzowLA0KICAgICAgICAgICAgYzpudWxsLA0KICAgICAgICAgICAgczoiKD86MXwwKSJ9Ow0KICAgIGNhc2UgIlkiOg0KICAgICAgICByZXR1cm4ge2c6MSwNCiAgICAgICAgICAgIGM6InkgPSBwYXJzZUludChyZXN1bHRzWyIgKyBjdXJyZW50R3JvdXAgKyAiXSwgMTApO1xuIiwNCiAgICAgICAgICAgIHM6IihcXGR7NH0pIn07DQogICAgY2FzZSAieSI6DQogICAgICAgIHJldHVybiB7ZzoxLA0KICAgICAgICAgICAgYzoidmFyIHR5ID0gcGFyc2VJbnQocmVzdWx0c1siICsgY3VycmVudEdyb3VwICsgIl0sIDEwKTtcbiINCiAgICAgICAgICAgICAgICArICJ5ID0gdHkgPiBEYXRlLnkya1llYXIgPyAxOTAwICsgdHkgOiAyMDAwICsgdHk7XG4iLA0KICAgICAgICAgICAgczoiKFxcZHsxLDJ9KSJ9Ow0KICAgIGNhc2UgImEiOg0KICAgICAgICByZXR1cm4ge2c6MSwNCiAgICAgICAgICAgIGM6ImlmIChyZXN1bHRzWyIgKyBjdXJyZW50R3JvdXAgKyAiXSA9PSAnYW0nKSB7XG4iDQogICAgICAgICAgICAgICAgKyAiaWYgKGggPT0gMTIpIHsgaCA9IDA7IH1cbiINCiAgICAgICAgICAgICAgICArICJ9IGVsc2UgeyBpZiAoaCA8IDEyKSB7IGggKz0gMTI7IH19IiwNCiAgICAgICAgICAgIHM6IihhbXxwbSkifTsNCiAgICBjYXNlICJBIjoNCiAgICAgICAgcmV0dXJuIHtnOjEsDQogICAgICAgICAgICBjOiJpZiAocmVzdWx0c1siICsgY3VycmVudEdyb3VwICsgIl0gPT0gJ0FNJykge1xuIg0KICAgICAgICAgICAgICAgICsgImlmIChoID09IDEyKSB7IGggPSAwOyB9XG4iDQogICAgICAgICAgICAgICAgKyAifSBlbHNlIHsgaWYgKGggPCAxMikgeyBoICs9IDEyOyB9fSIsDQogICAgICAgICAgICBzOiIoQU18UE0pIn07DQogICAgY2FzZSAiZyI6DQogICAgY2FzZSAiRyI6DQogICAgICAgIHJldHVybiB7ZzoxLA0KICAgICAgICAgICAgYzoiaCA9IHBhcnNlSW50KHJlc3VsdHNbIiArIGN1cnJlbnRHcm91cCArICJdLCAxMCk7XG4iLA0KICAgICAgICAgICAgczoiKFxcZHsxLDJ9KSJ9OyAKICAgIGNhc2UgImgiOg0KICAgIGNhc2UgIkgiOg0KICAgICAgICByZXR1cm4ge2c6MSwNCiAgICAgICAgICAgIGM6ImggPSBwYXJzZUludChyZXN1bHRzWyIgKyBjdXJyZW50R3JvdXAgKyAiXSwgMTApO1xuIiwNCiAgICAgICAgICAgIHM6IihcXGR7Mn0pIn07IAogICAgY2FzZSAiaSI6DQogICAgICAgIHJldHVybiB7ZzoxLA0KICAgICAgICAgICAgYzoiaSA9IHBhcnNlSW50KHJlc3VsdHNbIiArIGN1cnJlbnRHcm91cCArICJdLCAxMCk7XG4iLA0KICAgICAgICAgICAgczoiKFxcZHsyfSkifTsNCiAgICBjYXNlICJzIjoNCiAgICAgICAgcmV0dXJuIHtnOjEsDQogICAgICAgICAgICBjOiJzID0gcGFyc2VJbnQocmVzdWx0c1siICsgY3VycmVudEdyb3VwICsgIl0sIDEwKTtcbiIsDQogICAgICAgICAgICBzOiIoXFxkezJ9KSJ9Ow0KICAgIGNhc2UgIk8iOg0KICAgICAgICByZXR1cm4ge2c6MSwNCiAgICAgICAgICAgIGM6Ww0KICAgICAgICAgICAgICAgICJvID0gcmVzdWx0c1siLCBjdXJyZW50R3JvdXAsICJdO1xuIiwNCiAgICAgICAgICAgICAgICAidmFyIHNuID0gby5zdWJzdHJpbmcoMCwxKTtcbiIsIAogICAgICAgICAgICAgICAgInZhciBociA9IG8uc3Vic3RyaW5nKDEsMykqMSArIE1hdGguZmxvb3Ioby5zdWJzdHJpbmcoMyw1KSAvIDYwKTtcbiIsIAogICAgICAgICAgICAgICAgInZhciBtbiA9IG8uc3Vic3RyaW5nKDMsNSkgJSA2MDtcbiIsIAogICAgICAgICAgICAgICAgIm8gPSAoKC0xMiA8PSAoaHIqNjAgKyBtbikvNjApICYmICgoaHIqNjAgKyBtbikvNjAgPD0gMTQpKT9cbiIsIAogICAgICAgICAgICAgICAgIiAgICAoc24gKyBTdHJpbmcubGVmdFBhZChociwgMiwgMCkgKyBTdHJpbmcubGVmdFBhZChtbiwgMiwgMCkpIDogbnVsbDtcbiINCiAgICAgICAgICAgIF0uam9pbigiIiksDQogICAgICAgICAgICBzOiIoWytcLV1cXGR7NH0pIn07DQogICAgY2FzZSAiVCI6DQogICAgICAgIHJldHVybiB7ZzowLA0KICAgICAgICAgICAgYzpudWxsLA0KICAgICAgICAgICAgczoiW0EtWl17MSw0fSJ9OyAKICAgIGNhc2UgIloiOg0KICAgICAgICByZXR1cm4ge2c6MSwNCiAgICAgICAgICAgIGM6InogPSByZXN1bHRzWyIgKyBjdXJyZW50R3JvdXAgKyAiXTtcbiIgCiAgICAgICAgICAgICAgICAgICsgInogPSAoLTQzMjAwIDw9IHoqMSAmJiB6KjEgPD0gNTA0MDApPyB6IDogbnVsbDtcbiIsDQogICAgICAgICAgICBzOiIoWytcLV0/XFxkezEsNX0pIn07IAogICAgZGVmYXVsdDoNCiAgICAgICAgcmV0dXJuIHtnOjAsDQogICAgICAgICAgICBjOm51bGwsDQogICAgICAgICAgICBzOlN0cmluZy5lc2NhcGUoY2hhcmFjdGVyKX07DQogICAgfQ0KfTsNCg0KDQpEYXRlLnByb3RvdHlwZS5nZXRUaW1lem9uZSA9IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB0aGlzLnRvU3RyaW5nKCkucmVwbGFjZSgvXi4qPyAoW0EtWl17MSw0fSlbXC0rXVswLTldezR9IC4qJC8sICIkMSIpOw0KfTsNCg0KDQpEYXRlLnByb3RvdHlwZS5nZXRHTVRPZmZzZXQgPSBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gKHRoaXMuZ2V0VGltZXpvbmVPZmZzZXQoKSA+IDAgPyAiLSIgOiAiKyIpDQogICAgICAgICsgU3RyaW5nLmxlZnRQYWQoTWF0aC5hYnMoTWF0aC5mbG9vcih0aGlzLmdldFRpbWV6b25lT2Zmc2V0KCkgLyA2MCkpLCAyLCAiMCIpDQogICAgICAgICsgU3RyaW5nLmxlZnRQYWQodGhpcy5nZXRUaW1lem9uZU9mZnNldCgpICUgNjAsIDIsICIwIik7DQp9Ow0KDQoNCkRhdGUucHJvdG90eXBlLmdldERheU9mWWVhciA9IGZ1bmN0aW9uKCkgew0KICAgIHZhciBudW0gPSAwOw0KICAgIERhdGUuZGF5c0luTW9udGhbMV0gPSB0aGlzLmlzTGVhcFllYXIoKSA/IDI5IDogMjg7DQogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmdldE1vbnRoKCk7ICsraSkgew0KICAgICAgICBudW0gKz0gRGF0ZS5kYXlzSW5Nb250aFtpXTsNCiAgICB9DQogICAgcmV0dXJuIG51bSArIHRoaXMuZ2V0RGF0ZSgpIC0gMTsNCn07DQoNCg0KRGF0ZS5wcm90b3R5cGUuZ2V0V2Vla09mWWVhciA9IGZ1bmN0aW9uKCkgew0KICAgIAogICAgdmFyIG5vdyA9IHRoaXMuZ2V0RGF5T2ZZZWFyKCkgKyAoNCAtIHRoaXMuZ2V0RGF5KCkpOw0KICAgIAogICAgdmFyIGphbjEgPSBuZXcgRGF0ZSh0aGlzLmdldEZ1bGxZZWFyKCksIDAsIDEpOw0KICAgIHZhciB0aGVuID0gKDcgLSBqYW4xLmdldERheSgpICsgNCk7DQogICAgcmV0dXJuIFN0cmluZy5sZWZ0UGFkKCgobm93IC0gdGhlbikgLyA3KSArIDEsIDIsICIwIik7DQp9Ow0KDQoNCkRhdGUucHJvdG90eXBlLmlzTGVhcFllYXIgPSBmdW5jdGlvbigpIHsNCiAgICB2YXIgeWVhciA9IHRoaXMuZ2V0RnVsbFllYXIoKTsNCiAgICByZXR1cm4gKCh5ZWFyICYgMykgPT0gMCAmJiAoeWVhciAlIDEwMCB8fCAoeWVhciAlIDQwMCA9PSAwICYmIHllYXIpKSk7DQp9Ow0KDQoNCkRhdGUucHJvdG90eXBlLmdldEZpcnN0RGF5T2ZNb250aCA9IGZ1bmN0aW9uKCkgew0KICAgIHZhciBkYXkgPSAodGhpcy5nZXREYXkoKSAtICh0aGlzLmdldERhdGUoKSAtIDEpKSAlIDc7DQogICAgcmV0dXJuIChkYXkgPCAwKSA/IChkYXkgKyA3KSA6IGRheTsNCn07DQoNCg0KRGF0ZS5wcm90b3R5cGUuZ2V0TGFzdERheU9mTW9udGggPSBmdW5jdGlvbigpIHsNCiAgICB2YXIgZGF5ID0gKHRoaXMuZ2V0RGF5KCkgKyAoRGF0ZS5kYXlzSW5Nb250aFt0aGlzLmdldE1vbnRoKCldIC0gdGhpcy5nZXREYXRlKCkpKSAlIDc7DQogICAgcmV0dXJuIChkYXkgPCAwKSA/IChkYXkgKyA3KSA6IGRheTsNCn07DQoNCg0KDQpEYXRlLnByb3RvdHlwZS5nZXRGaXJzdERhdGVPZk1vbnRoID0gZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIG5ldyBEYXRlKHRoaXMuZ2V0RnVsbFllYXIoKSwgdGhpcy5nZXRNb250aCgpLCAxKTsNCn07DQoNCg0KRGF0ZS5wcm90b3R5cGUuZ2V0TGFzdERhdGVPZk1vbnRoID0gZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIG5ldyBEYXRlKHRoaXMuZ2V0RnVsbFllYXIoKSwgdGhpcy5nZXRNb250aCgpLCB0aGlzLmdldERheXNJbk1vbnRoKCkpOw0KfTsNCg0KRGF0ZS5wcm90b3R5cGUuZ2V0RGF5c0luTW9udGggPSBmdW5jdGlvbigpIHsNCiAgICBEYXRlLmRheXNJbk1vbnRoWzFdID0gdGhpcy5pc0xlYXBZZWFyKCkgPyAyOSA6IDI4Ow0KICAgIHJldHVybiBEYXRlLmRheXNJbk1vbnRoW3RoaXMuZ2V0TW9udGgoKV07DQp9Ow0KDQoNCkRhdGUucHJvdG90eXBlLmdldFN1ZmZpeCA9IGZ1bmN0aW9uKCkgew0KICAgIHN3aXRjaCAodGhpcy5nZXREYXRlKCkpIHsNCiAgICAgICAgY2FzZSAxOg0KICAgICAgICBjYXNlIDIxOg0KICAgICAgICBjYXNlIDMxOg0KICAgICAgICAgICAgcmV0dXJuICJzdCI7DQogICAgICAgIGNhc2UgMjoNCiAgICAgICAgY2FzZSAyMjoNCiAgICAgICAgICAgIHJldHVybiAibmQiOw0KICAgICAgICBjYXNlIDM6DQogICAgICAgIGNhc2UgMjM6DQogICAgICAgICAgICByZXR1cm4gInJkIjsNCiAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgIHJldHVybiAidGgiOw0KICAgIH0NCn07DQoNCgpEYXRlLmRheXNJbk1vbnRoID0gWzMxLDI4LDMxLDMwLDMxLDMwLDMxLDMxLDMwLDMxLDMwLDMxXTsNCg0KDQpEYXRlLm1vbnRoTmFtZXMgPQ0KICAgWyJKYW51YXJ5IiwNCiAgICAiRmVicnVhcnkiLA0KICAgICJNYXJjaCIsDQogICAgIkFwcmlsIiwNCiAgICAiTWF5IiwNCiAgICAiSnVuZSIsDQogICAgIkp1bHkiLA0KICAgICJBdWd1c3QiLA0KICAgICJTZXB0ZW1iZXIiLA0KICAgICJPY3RvYmVyIiwNCiAgICAiTm92ZW1iZXIiLA0KICAgICJEZWNlbWJlciJdOw0KDQoNCkRhdGUuZGF5TmFtZXMgPQ0KICAgWyJTdW5kYXkiLA0KICAgICJNb25kYXkiLA0KICAgICJUdWVzZGF5IiwNCiAgICAiV2VkbmVzZGF5IiwNCiAgICAiVGh1cnNkYXkiLA0KICAgICJGcmlkYXkiLA0KICAgICJTYXR1cmRheSJdOw0KDQoKRGF0ZS55MmtZZWFyID0gNTA7DQoKRGF0ZS5tb250aE51bWJlcnMgPSB7DQogICAgSmFuOjAsDQogICAgRmViOjEsDQogICAgTWFyOjIsDQogICAgQXByOjMsDQogICAgTWF5OjQsDQogICAgSnVuOjUsDQogICAgSnVsOjYsDQogICAgQXVnOjcsDQogICAgU2VwOjgsDQogICAgT2N0OjksDQogICAgTm92OjEwLA0KICAgIERlYzoxMX07DQoNCg0KRGF0ZS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHsNCglyZXR1cm4gbmV3IERhdGUodGhpcy5nZXRUaW1lKCkpOw0KfTsNCg0KDQpEYXRlLnByb3RvdHlwZS5jbGVhclRpbWUgPSBmdW5jdGlvbihjbG9uZSl7DQogICAgaWYoY2xvbmUpew0KICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmNsZWFyVGltZSgpOw0KICAgIH0NCiAgICB0aGlzLnNldEhvdXJzKDApOw0KICAgIHRoaXMuc2V0TWludXRlcygwKTsNCiAgICB0aGlzLnNldFNlY29uZHMoMCk7DQogICAgdGhpcy5zZXRNaWxsaXNlY29uZHMoMCk7DQogICAgcmV0dXJuIHRoaXM7DQp9Ow0KDQoKCmlmKEV4dC5pc1NhZmFyaSl7DQogICAgRGF0ZS5icm9rZW5TZXRNb250aCA9IERhdGUucHJvdG90eXBlLnNldE1vbnRoOw0KCURhdGUucHJvdG90eXBlLnNldE1vbnRoID0gZnVuY3Rpb24obnVtKXsNCgkJaWYobnVtIDw9IC0xKXsNCgkJCXZhciBuID0gTWF0aC5jZWlsKC1udW0pOw0KCQkJdmFyIGJhY2tfeWVhciA9IE1hdGguY2VpbChuLzEyKTsNCgkJCXZhciBtb250aCA9IChuICUgMTIpID8gMTIgLSBuICUgMTIgOiAwIDsNCgkJCXRoaXMuc2V0RnVsbFllYXIodGhpcy5nZXRGdWxsWWVhcigpIC0gYmFja195ZWFyKTsNCgkJCXJldHVybiBEYXRlLmJyb2tlblNldE1vbnRoLmNhbGwodGhpcywgbW9udGgpOw0KCQl9IGVsc2Ugew0KCQkJcmV0dXJuIERhdGUuYnJva2VuU2V0TW9udGguYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCgkJfQ0KCX07DQp9DQoNCg0KRGF0ZS5NSUxMSSA9ICJtcyI7DQoNCkRhdGUuU0VDT05EID0gInMiOw0KDQpEYXRlLk1JTlVURSA9ICJtaSI7DQoNCkRhdGUuSE9VUiA9ICJoIjsNCg0KRGF0ZS5EQVkgPSAiZCI7DQoNCkRhdGUuTU9OVEggPSAibW8iOw0KDQpEYXRlLllFQVIgPSAieSI7DQoNCg0KRGF0ZS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24oaW50ZXJ2YWwsIHZhbHVlKXsNCiAgdmFyIGQgPSB0aGlzLmNsb25lKCk7DQogIGlmICghaW50ZXJ2YWwgfHwgdmFsdWUgPT09IDApIHJldHVybiBkOw0KICBzd2l0Y2goaW50ZXJ2YWwudG9Mb3dlckNhc2UoKSl7DQogICAgY2FzZSBEYXRlLk1JTExJOg0KICAgICAgZC5zZXRNaWxsaXNlY29uZHModGhpcy5nZXRNaWxsaXNlY29uZHMoKSArIHZhbHVlKTsNCiAgICAgIGJyZWFrOw0KICAgIGNhc2UgRGF0ZS5TRUNPTkQ6DQogICAgICBkLnNldFNlY29uZHModGhpcy5nZXRTZWNvbmRzKCkgKyB2YWx1ZSk7DQogICAgICBicmVhazsNCiAgICBjYXNlIERhdGUuTUlOVVRFOg0KICAgICAgZC5zZXRNaW51dGVzKHRoaXMuZ2V0TWludXRlcygpICsgdmFsdWUpOw0KICAgICAgYnJlYWs7DQogICAgY2FzZSBEYXRlLkhPVVI6DQogICAgICBkLnNldEhvdXJzKHRoaXMuZ2V0SG91cnMoKSArIHZhbHVlKTsNCiAgICAgIGJyZWFrOw0KICAgIGNhc2UgRGF0ZS5EQVk6DQogICAgICBkLnNldERhdGUodGhpcy5nZXREYXRlKCkgKyB2YWx1ZSk7DQogICAgICBicmVhazsNCiAgICBjYXNlIERhdGUuTU9OVEg6DQogICAgICB2YXIgZGF5ID0gdGhpcy5nZXREYXRlKCk7DQogICAgICBpZihkYXkgPiAyOCl7DQogICAgICAgICAgZGF5ID0gTWF0aC5taW4oZGF5LCB0aGlzLmdldEZpcnN0RGF0ZU9mTW9udGgoKS5hZGQoJ21vJywgdmFsdWUpLmdldExhc3REYXRlT2ZNb250aCgpLmdldERhdGUoKSk7DQogICAgICB9DQogICAgICBkLnNldERhdGUoZGF5KTsNCiAgICAgIGQuc2V0TW9udGgodGhpcy5nZXRNb250aCgpICsgdmFsdWUpOw0KICAgICAgYnJlYWs7DQogICAgY2FzZSBEYXRlLllFQVI6DQogICAgICBkLnNldEZ1bGxZZWFyKHRoaXMuZ2V0RnVsbFllYXIoKSArIHZhbHVlKTsNCiAgICAgIGJyZWFrOw0KICB9DQogIHJldHVybiBkOw0KfTsKCkV4dC51dGlsLkRlbGF5ZWRUYXNrID0gZnVuY3Rpb24oZm4sIHNjb3BlLCBhcmdzKXsKICAgIHZhciBpZCA9IG51bGwsIGQsIHQ7CgogICAgdmFyIGNhbGwgPSBmdW5jdGlvbigpewogICAgICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKICAgICAgICBpZihub3cgLSB0ID49IGQpewogICAgICAgICAgICBjbGVhckludGVydmFsKGlkKTsKICAgICAgICAgICAgaWQgPSBudWxsOwogICAgICAgICAgICBmbi5hcHBseShzY29wZSwgYXJncyB8fCBbXSk7CiAgICAgICAgfQogICAgfTsKICAgIAogICAgdGhpcy5kZWxheSA9IGZ1bmN0aW9uKGRlbGF5LCBuZXdGbiwgbmV3U2NvcGUsIG5ld0FyZ3MpewogICAgICAgIGlmKGlkICYmIGRlbGF5ICE9IGQpewogICAgICAgICAgICB0aGlzLmNhbmNlbCgpOwogICAgICAgIH0KICAgICAgICBkID0gZGVsYXk7CiAgICAgICAgdCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwogICAgICAgIGZuID0gbmV3Rm4gfHwgZm47CiAgICAgICAgc2NvcGUgPSBuZXdTY29wZSB8fCBzY29wZTsKICAgICAgICBhcmdzID0gbmV3QXJncyB8fCBhcmdzOwogICAgICAgIGlmKCFpZCl7CiAgICAgICAgICAgIGlkID0gc2V0SW50ZXJ2YWwoY2FsbCwgZCk7CiAgICAgICAgfQogICAgfTsKCiAgICAKICAgIHRoaXMuY2FuY2VsID0gZnVuY3Rpb24oKXsKICAgICAgICBpZihpZCl7CiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaWQpOwogICAgICAgICAgICBpZCA9IG51bGw7CiAgICAgICAgfQogICAgfTsKfTsKRXh0LnV0aWwuVGFza1J1bm5lciA9IGZ1bmN0aW9uKGludGVydmFsKXsKICAgIGludGVydmFsID0gaW50ZXJ2YWwgfHwgMTA7CiAgICB2YXIgdGFza3MgPSBbXSwgcmVtb3ZlUXVldWUgPSBbXTsKICAgIHZhciBpZCA9IDA7CiAgICB2YXIgcnVubmluZyA9IGZhbHNlOwoKICAgIHZhciBzdG9wVGhyZWFkID0gZnVuY3Rpb24oKXsKICAgICAgICBydW5uaW5nID0gZmFsc2U7CiAgICAgICAgY2xlYXJJbnRlcnZhbChpZCk7CiAgICAgICAgaWQgPSAwOwogICAgfTsKCiAgICB2YXIgc3RhcnRUaHJlYWQgPSBmdW5jdGlvbigpewogICAgICAgIGlmKCFydW5uaW5nKXsKICAgICAgICAgICAgcnVubmluZyA9IHRydWU7CiAgICAgICAgICAgIGlkID0gc2V0SW50ZXJ2YWwocnVuVGFza3MsIGludGVydmFsKTsKICAgICAgICB9CiAgICB9OwoKICAgIHZhciByZW1vdmVUYXNrID0gZnVuY3Rpb24odGFzayl7CiAgICAgICAgcmVtb3ZlUXVldWUucHVzaCh0YXNrKTsKICAgICAgICBpZih0YXNrLm9uU3RvcCl7CiAgICAgICAgICAgIHRhc2sub25TdG9wKCk7CiAgICAgICAgfQogICAgfTsKCiAgICB2YXIgcnVuVGFza3MgPSBmdW5jdGlvbigpewogICAgICAgIGlmKHJlbW92ZVF1ZXVlLmxlbmd0aCA+IDApewogICAgICAgICAgICBmb3IodmFyIGkgPSAwLCBsZW4gPSByZW1vdmVRdWV1ZS5sZW5ndGg7IGkgPCBsZW47IGkrKyl7CiAgICAgICAgICAgICAgICB0YXNrcy5yZW1vdmUocmVtb3ZlUXVldWVbaV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlbW92ZVF1ZXVlID0gW107CiAgICAgICAgICAgIGlmKHRhc2tzLmxlbmd0aCA8IDEpewogICAgICAgICAgICAgICAgc3RvcFRocmVhZCgpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKICAgICAgICBmb3IodmFyIGkgPSAwLCBsZW4gPSB0YXNrcy5sZW5ndGg7IGkgPCBsZW47ICsraSl7CiAgICAgICAgICAgIHZhciB0ID0gdGFza3NbaV07CiAgICAgICAgICAgIHZhciBpdGltZSA9IG5vdyAtIHQudGFza1J1blRpbWU7CiAgICAgICAgICAgIGlmKHQuaW50ZXJ2YWwgPD0gaXRpbWUpewogICAgICAgICAgICAgICAgdmFyIHJ0ID0gdC5ydW4uYXBwbHkodC5zY29wZSB8fCB0LCB0LmFyZ3MgfHwgWysrdC50YXNrUnVuQ291bnRdKTsKICAgICAgICAgICAgICAgIHQudGFza1J1blRpbWUgPSBub3c7CiAgICAgICAgICAgICAgICBpZihydCA9PT0gZmFsc2UgfHwgdC50YXNrUnVuQ291bnQgPT09IHQucmVwZWF0KXsKICAgICAgICAgICAgICAgICAgICByZW1vdmVUYXNrKHQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZih0LmR1cmF0aW9uICYmIHQuZHVyYXRpb24gPD0gKG5vdyAtIHQudGFza1N0YXJ0VGltZSkpewogICAgICAgICAgICAgICAgcmVtb3ZlVGFzayh0KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CgogICAgCiAgICB0aGlzLnN0YXJ0ID0gZnVuY3Rpb24odGFzayl7CiAgICAgICAgdGFza3MucHVzaCh0YXNrKTsKICAgICAgICB0YXNrLnRhc2tTdGFydFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKICAgICAgICB0YXNrLnRhc2tSdW5UaW1lID0gMDsKICAgICAgICB0YXNrLnRhc2tSdW5Db3VudCA9IDA7CiAgICAgICAgc3RhcnRUaHJlYWQoKTsKICAgICAgICByZXR1cm4gdGFzazsKICAgIH07CgogICAgdGhpcy5zdG9wID0gZnVuY3Rpb24odGFzayl7CiAgICAgICAgcmVtb3ZlVGFzayh0YXNrKTsKICAgICAgICByZXR1cm4gdGFzazsKICAgIH07CgogICAgdGhpcy5zdG9wQWxsID0gZnVuY3Rpb24oKXsKICAgICAgICBzdG9wVGhyZWFkKCk7CiAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gdGFza3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspewogICAgICAgICAgICBpZih0YXNrc1tpXS5vblN0b3ApewogICAgICAgICAgICAgICAgdGFza3NbaV0ub25TdG9wKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGFza3MgPSBbXTsKICAgICAgICByZW1vdmVRdWV1ZSA9IFtdOwogICAgfTsKfTsKCkV4dC5UYXNrTWdyID0gbmV3IEV4dC51dGlsLlRhc2tSdW5uZXIoKTsKDQpFeHQudXRpbC5NaXhlZENvbGxlY3Rpb24gPSBmdW5jdGlvbihhbGxvd0Z1bmN0aW9ucywga2V5Rm4pew0KICAgIHRoaXMuaXRlbXMgPSBbXTsNCiAgICB0aGlzLm1hcCA9IHt9Ow0KICAgIHRoaXMua2V5cyA9IFtdOw0KICAgIHRoaXMubGVuZ3RoID0gMDsNCiAgICB0aGlzLmFkZEV2ZW50cyh7DQogICAgICAgIA0KICAgICAgICAiY2xlYXIiIDogdHJ1ZSwNCiAgICAgICAgDQogICAgICAgICJhZGQiIDogdHJ1ZSwNCiAgICAgICAgDQogICAgICAgICJyZXBsYWNlIiA6IHRydWUsDQogICAgICAgIA0KICAgICAgICAicmVtb3ZlIiA6IHRydWUsDQogICAgICAgICJzb3J0IiA6IHRydWUNCiAgICB9KTsNCiAgICB0aGlzLmFsbG93RnVuY3Rpb25zID0gYWxsb3dGdW5jdGlvbnMgPT09IHRydWU7DQogICAgaWYoa2V5Rm4pew0KICAgICAgICB0aGlzLmdldEtleSA9IGtleUZuOw0KICAgIH0NCiAgICBFeHQudXRpbC5NaXhlZENvbGxlY3Rpb24uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpOw0KfTsNCg0KRXh0LmV4dGVuZChFeHQudXRpbC5NaXhlZENvbGxlY3Rpb24sIEV4dC51dGlsLk9ic2VydmFibGUsIHsNCiAgICBhbGxvd0Z1bmN0aW9ucyA6IGZhbHNlLA0KICAgIA0KDQogICAgYWRkIDogZnVuY3Rpb24oa2V5LCBvKXsNCiAgICAgICAgaWYoYXJndW1lbnRzLmxlbmd0aCA9PSAxKXsNCiAgICAgICAgICAgIG8gPSBhcmd1bWVudHNbMF07DQogICAgICAgICAgICBrZXkgPSB0aGlzLmdldEtleShvKTsNCiAgICAgICAgfQ0KICAgICAgICBpZih0eXBlb2Yga2V5ID09ICJ1bmRlZmluZWQiIHx8IGtleSA9PT0gbnVsbCl7DQogICAgICAgICAgICB0aGlzLmxlbmd0aCsrOw0KICAgICAgICAgICAgdGhpcy5pdGVtcy5wdXNoKG8pOw0KICAgICAgICAgICAgdGhpcy5rZXlzLnB1c2gobnVsbCk7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgdmFyIG9sZCA9IHRoaXMubWFwW2tleV07DQogICAgICAgICAgICBpZihvbGQpew0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcGxhY2Uoa2V5LCBvKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMubGVuZ3RoKys7DQogICAgICAgICAgICB0aGlzLml0ZW1zLnB1c2gobyk7DQogICAgICAgICAgICB0aGlzLm1hcFtrZXldID0gbzsNCiAgICAgICAgICAgIHRoaXMua2V5cy5wdXNoKGtleSk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5maXJlRXZlbnQoImFkZCIsIHRoaXMubGVuZ3RoLTEsIG8sIGtleSk7DQogICAgICAgIHJldHVybiBvOw0KICAgIH0sDQogICANCg0KICAgIGdldEtleSA6IGZ1bmN0aW9uKG8pew0KICAgICAgICAgcmV0dXJuIG8uaWQ7IA0KICAgIH0sDQogICANCg0KICAgIHJlcGxhY2UgOiBmdW5jdGlvbihrZXksIG8pew0KICAgICAgICBpZihhcmd1bWVudHMubGVuZ3RoID09IDEpew0KICAgICAgICAgICAgbyA9IGFyZ3VtZW50c1swXTsNCiAgICAgICAgICAgIGtleSA9IHRoaXMuZ2V0S2V5KG8pOw0KICAgICAgICB9DQogICAgICAgIHZhciBvbGQgPSB0aGlzLml0ZW0oa2V5KTsNCiAgICAgICAgaWYodHlwZW9mIGtleSA9PSAidW5kZWZpbmVkIiB8fCBrZXkgPT09IG51bGwgfHwgdHlwZW9mIG9sZCA9PSAidW5kZWZpbmVkIil7DQogICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWRkKGtleSwgbyk7DQogICAgICAgIH0NCiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5pbmRleE9mS2V5KGtleSk7DQogICAgICAgIHRoaXMuaXRlbXNbaW5kZXhdID0gbzsNCiAgICAgICAgdGhpcy5tYXBba2V5XSA9IG87DQogICAgICAgIHRoaXMuZmlyZUV2ZW50KCJyZXBsYWNlIiwga2V5LCBvbGQsIG8pOw0KICAgICAgICByZXR1cm4gbzsNCiAgICB9LA0KICAgDQoNCiAgICBhZGRBbGwgOiBmdW5jdGlvbihvYmpzKXsNCiAgICAgICAgaWYoYXJndW1lbnRzLmxlbmd0aCA+IDEgfHwgb2JqcyBpbnN0YW5jZW9mIEFycmF5KXsNCiAgICAgICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHMgOiBvYmpzOw0KICAgICAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gYXJncy5sZW5ndGg7IGkgPCBsZW47IGkrKyl7DQogICAgICAgICAgICAgICAgdGhpcy5hZGQoYXJnc1tpXSk7DQogICAgICAgICAgICB9DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgZm9yKHZhciBrZXkgaW4gb2Jqcyl7DQogICAgICAgICAgICAgICAgaWYodGhpcy5hbGxvd0Z1bmN0aW9ucyB8fCB0eXBlb2Ygb2Jqc1trZXldICE9ICJmdW5jdGlvbiIpew0KICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZChrZXksIG9ianNba2V5XSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSwNCiAgIA0KDQogICAgZWFjaCA6IGZ1bmN0aW9uKGZuLCBzY29wZSl7DQogICAgICAgIHZhciBpdGVtcyA9IFtdLmNvbmNhdCh0aGlzLml0ZW1zKTsgCiAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gaXRlbXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspew0KICAgICAgICAgICAgaWYoZm4uY2FsbChzY29wZSB8fCBpdGVtc1tpXSwgaXRlbXNbaV0sIGksIGxlbikgPT09IGZhbHNlKXsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0sDQogICANCg0KICAgIGVhY2hLZXkgOiBmdW5jdGlvbihmbiwgc2NvcGUpew0KICAgICAgICBmb3IodmFyIGkgPSAwLCBsZW4gPSB0aGlzLmtleXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspew0KICAgICAgICAgICAgZm4uY2FsbChzY29wZSB8fCB3aW5kb3csIHRoaXMua2V5c1tpXSwgdGhpcy5pdGVtc1tpXSwgaSwgbGVuKTsNCiAgICAgICAgfQ0KICAgIH0sDQogICANCg0KICAgIGZpbmQgOiBmdW5jdGlvbihmbiwgc2NvcGUpew0KICAgICAgICBmb3IodmFyIGkgPSAwLCBsZW4gPSB0aGlzLml0ZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXsNCiAgICAgICAgICAgIGlmKGZuLmNhbGwoc2NvcGUgfHwgd2luZG93LCB0aGlzLml0ZW1zW2ldLCB0aGlzLmtleXNbaV0pKXsNCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pdGVtc1tpXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICB9LA0KICAgDQoNCiAgICBpbnNlcnQgOiBmdW5jdGlvbihpbmRleCwga2V5LCBvKXsNCiAgICAgICAgaWYoYXJndW1lbnRzLmxlbmd0aCA9PSAyKXsNCiAgICAgICAgICAgIG8gPSBhcmd1bWVudHNbMV07DQogICAgICAgICAgICBrZXkgPSB0aGlzLmdldEtleShvKTsNCiAgICAgICAgfQ0KICAgICAgICBpZihpbmRleCA+PSB0aGlzLmxlbmd0aCl7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5hZGQoa2V5LCBvKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmxlbmd0aCsrOw0KICAgICAgICB0aGlzLml0ZW1zLnNwbGljZShpbmRleCwgMCwgbyk7DQogICAgICAgIGlmKHR5cGVvZiBrZXkgIT0gInVuZGVmaW5lZCIgJiYga2V5ICE9IG51bGwpew0KICAgICAgICAgICAgdGhpcy5tYXBba2V5XSA9IG87DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5rZXlzLnNwbGljZShpbmRleCwgMCwga2V5KTsNCiAgICAgICAgdGhpcy5maXJlRXZlbnQoImFkZCIsIGluZGV4LCBvLCBrZXkpOw0KICAgICAgICByZXR1cm4gbzsNCiAgICB9LA0KICAgDQoNCiAgICByZW1vdmUgOiBmdW5jdGlvbihvKXsNCiAgICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlQXQodGhpcy5pbmRleE9mKG8pKTsNCiAgICB9LA0KICAgDQoNCiAgICByZW1vdmVBdCA6IGZ1bmN0aW9uKGluZGV4KXsNCiAgICAgICAgaWYoaW5kZXggPCB0aGlzLmxlbmd0aCAmJiBpbmRleCA+PSAwKXsNCiAgICAgICAgICAgIHRoaXMubGVuZ3RoLS07DQogICAgICAgICAgICB2YXIgbyA9IHRoaXMuaXRlbXNbaW5kZXhdOw0KICAgICAgICAgICAgdGhpcy5pdGVtcy5zcGxpY2UoaW5kZXgsIDEpOw0KICAgICAgICAgICAgdmFyIGtleSA9IHRoaXMua2V5c1tpbmRleF07DQogICAgICAgICAgICBpZih0eXBlb2Yga2V5ICE9ICJ1bmRlZmluZWQiKXsNCiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5tYXBba2V5XTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMua2V5cy5zcGxpY2UoaW5kZXgsIDEpOw0KICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoInJlbW92ZSIsIG8sIGtleSk7DQogICAgICAgIH0NCiAgICB9LA0KICAgDQoNCiAgICByZW1vdmVLZXkgOiBmdW5jdGlvbihrZXkpew0KICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmVBdCh0aGlzLmluZGV4T2ZLZXkoa2V5KSk7DQogICAgfSwNCiAgIA0KDQogICAgZ2V0Q291bnQgOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGg7IA0KICAgIH0sDQogICANCg0KICAgIGluZGV4T2YgOiBmdW5jdGlvbihvKXsNCiAgICAgICAgaWYoIXRoaXMuaXRlbXMuaW5kZXhPZil7DQogICAgICAgICAgICBmb3IodmFyIGkgPSAwLCBsZW4gPSB0aGlzLml0ZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXsNCiAgICAgICAgICAgICAgICBpZih0aGlzLml0ZW1zW2ldID09IG8pIHJldHVybiBpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIC0xOw0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLml0ZW1zLmluZGV4T2Yobyk7DQogICAgICAgIH0NCiAgICB9LA0KICAgDQoNCiAgICBpbmRleE9mS2V5IDogZnVuY3Rpb24oa2V5KXsNCiAgICAgICAgaWYoIXRoaXMua2V5cy5pbmRleE9mKXsNCiAgICAgICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IHRoaXMua2V5cy5sZW5ndGg7IGkgPCBsZW47IGkrKyl7DQogICAgICAgICAgICAgICAgaWYodGhpcy5rZXlzW2ldID09IGtleSkgcmV0dXJuIGk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gLTE7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMua2V5cy5pbmRleE9mKGtleSk7DQogICAgICAgIH0NCiAgICB9LA0KICAgDQoNCiAgICBpdGVtIDogZnVuY3Rpb24oa2V5KXsNCiAgICAgICAgdmFyIGl0ZW0gPSB0eXBlb2YgdGhpcy5tYXBba2V5XSAhPSAidW5kZWZpbmVkIiA/IHRoaXMubWFwW2tleV0gOiB0aGlzLml0ZW1zW2tleV07DQogICAgICAgIHJldHVybiB0eXBlb2YgaXRlbSAhPSAnZnVuY3Rpb24nIHx8IHRoaXMuYWxsb3dGdW5jdGlvbnMgPyBpdGVtIDogbnVsbDsgCiAgICB9LA0KICAgIA0KDQogICAgaXRlbUF0IDogZnVuY3Rpb24oaW5kZXgpew0KICAgICAgICByZXR1cm4gdGhpcy5pdGVtc1tpbmRleF07DQogICAgfSwNCiAgICANCg0KICAgIGtleSA6IGZ1bmN0aW9uKGtleSl7DQogICAgICAgIHJldHVybiB0aGlzLm1hcFtrZXldOw0KICAgIH0sDQogICANCg0KICAgIGNvbnRhaW5zIDogZnVuY3Rpb24obyl7DQogICAgICAgIHJldHVybiB0aGlzLmluZGV4T2YobykgIT0gLTE7DQogICAgfSwNCiAgIA0KDQogICAgY29udGFpbnNLZXkgOiBmdW5jdGlvbihrZXkpew0KICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMubWFwW2tleV0gIT0gInVuZGVmaW5lZCI7DQogICAgfSwNCiAgIA0KDQogICAgY2xlYXIgOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLmxlbmd0aCA9IDA7DQogICAgICAgIHRoaXMuaXRlbXMgPSBbXTsNCiAgICAgICAgdGhpcy5rZXlzID0gW107DQogICAgICAgIHRoaXMubWFwID0ge307DQogICAgICAgIHRoaXMuZmlyZUV2ZW50KCJjbGVhciIpOw0KICAgIH0sDQogICANCg0KICAgIGZpcnN0IDogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbXNbMF07IA0KICAgIH0sDQogICANCg0KICAgIGxhc3QgOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gdGhpcy5pdGVtc1t0aGlzLmxlbmd0aC0xXTsgICANCiAgICB9LA0KICAgIA0KICAgIF9zb3J0IDogZnVuY3Rpb24ocHJvcGVydHksIGRpciwgZm4pew0KICAgICAgICB2YXIgZHNjID0gU3RyaW5nKGRpcikudG9VcHBlckNhc2UoKSA9PSAiREVTQyIgPyAtMSA6IDE7DQogICAgICAgIGZuID0gZm4gfHwgZnVuY3Rpb24oYSwgYil7DQogICAgICAgICAgICByZXR1cm4gYS1iOw0KICAgICAgICB9Ow0KICAgICAgICB2YXIgYyA9IFtdLCBrID0gdGhpcy5rZXlzLCBpdGVtcyA9IHRoaXMuaXRlbXM7DQogICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IGl0ZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXsNCiAgICAgICAgICAgIGNbYy5sZW5ndGhdID0ge2tleToga1tpXSwgdmFsdWU6IGl0ZW1zW2ldLCBpbmRleDogaX07DQogICAgICAgIH0NCiAgICAgICAgYy5zb3J0KGZ1bmN0aW9uKGEsIGIpew0KICAgICAgICAgICAgdmFyIHYgPSBmbihhW3Byb3BlcnR5XSwgYltwcm9wZXJ0eV0pICogZHNjOw0KICAgICAgICAgICAgaWYodiA9PSAwKXsNCiAgICAgICAgICAgICAgICB2ID0gKGEuaW5kZXggPCBiLmluZGV4ID8gLTEgOiAxKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiB2Ow0KICAgICAgICB9KTsNCiAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gYy5sZW5ndGg7IGkgPCBsZW47IGkrKyl7DQogICAgICAgICAgICBpdGVtc1tpXSA9IGNbaV0udmFsdWU7DQogICAgICAgICAgICBrW2ldID0gY1tpXS5rZXk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5maXJlRXZlbnQoInNvcnQiLCB0aGlzKTsNCiAgICB9LA0KICAgIA0KICAgIA0KICAgIHNvcnQgOiBmdW5jdGlvbihkaXIsIGZuKXsNCiAgICAgICAgdGhpcy5fc29ydCgidmFsdWUiLCBkaXIsIGZuKTsNCiAgICB9LA0KICAgIA0KICAgIA0KICAgIGtleVNvcnQgOiBmdW5jdGlvbihkaXIsIGZuKXsNCiAgICAgICAgdGhpcy5fc29ydCgia2V5IiwgZGlyLCBmbiB8fCBmdW5jdGlvbihhLCBiKXsNCiAgICAgICAgICAgIHJldHVybiBTdHJpbmcoYSkudG9VcHBlckNhc2UoKS1TdHJpbmcoYikudG9VcHBlckNhc2UoKTsNCiAgICAgICAgfSk7DQogICAgfSwNCiAgICANCiAgICANCiAgICBnZXRSYW5nZSA6IGZ1bmN0aW9uKHN0YXJ0LCBlbmQpew0KICAgICAgICB2YXIgaXRlbXMgPSB0aGlzLml0ZW1zOw0KICAgICAgICBpZihpdGVtcy5sZW5ndGggPCAxKXsNCiAgICAgICAgICAgIHJldHVybiBbXTsNCiAgICAgICAgfQ0KICAgICAgICBzdGFydCA9IHN0YXJ0IHx8IDA7DQogICAgICAgIGVuZCA9IE1hdGgubWluKHR5cGVvZiBlbmQgPT0gInVuZGVmaW5lZCIgPyB0aGlzLmxlbmd0aC0xIDogZW5kLCB0aGlzLmxlbmd0aC0xKTsNCiAgICAgICAgdmFyIHIgPSBbXTsNCiAgICAgICAgaWYoc3RhcnQgPD0gZW5kKXsNCiAgICAgICAgICAgIGZvcih2YXIgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSB7DQogICAgICAgIAkgICAgcltyLmxlbmd0aF0gPSBpdGVtc1tpXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICBmb3IodmFyIGkgPSBzdGFydDsgaSA+PSBlbmQ7IGktLSkgew0KICAgICAgICAJICAgIHJbci5sZW5ndGhdID0gaXRlbXNbaV07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHI7DQogICAgfSwNCiAgICAgICAgDQogICAgDQogICAgZmlsdGVyIDogZnVuY3Rpb24ocHJvcGVydHksIHZhbHVlKXsNCiAgICAgICAgaWYoIXZhbHVlLmV4ZWMpeyAKICAgICAgICAgICAgdmFsdWUgPSBTdHJpbmcodmFsdWUpOw0KICAgICAgICAgICAgaWYodmFsdWUubGVuZ3RoID09IDApew0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNsb25lKCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YWx1ZSA9IG5ldyBSZWdFeHAoIl4iICsgRXh0LmVzY2FwZVJlKHZhbHVlKSwgImkiKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJCeShmdW5jdGlvbihvKXsNCiAgICAgICAgICAgIHJldHVybiBvICYmIHZhbHVlLnRlc3Qob1twcm9wZXJ0eV0pOw0KICAgICAgICB9KTsNCgl9LA0KICAgIA0KICAgIA0KICAgIGZpbHRlckJ5IDogZnVuY3Rpb24oZm4sIHNjb3BlKXsNCiAgICAgICAgdmFyIHIgPSBuZXcgRXh0LnV0aWwuTWl4ZWRDb2xsZWN0aW9uKCk7DQogICAgICAgIHIuZ2V0S2V5ID0gdGhpcy5nZXRLZXk7DQogICAgICAgIHZhciBrID0gdGhpcy5rZXlzLCBpdCA9IHRoaXMuaXRlbXM7DQogICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IGl0Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKXsNCiAgICAgICAgICAgIGlmKGZuLmNhbGwoc2NvcGV8fHRoaXMsIGl0W2ldLCBrW2ldKSl7DQoJCQkJci5hZGQoa1tpXSwgaXRbaV0pOw0KCQkJfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiByOw0KICAgIH0sDQogICAgDQogICAgDQogICAgY2xvbmUgOiBmdW5jdGlvbigpew0KICAgICAgICB2YXIgciA9IG5ldyBFeHQudXRpbC5NaXhlZENvbGxlY3Rpb24oKTsNCiAgICAgICAgdmFyIGsgPSB0aGlzLmtleXMsIGl0ID0gdGhpcy5pdGVtczsNCiAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gaXQubGVuZ3RoOyBpIDwgbGVuOyBpKyspew0KICAgICAgICAgICAgci5hZGQoa1tpXSwgaXRbaV0pOw0KICAgICAgICB9DQogICAgICAgIHIuZ2V0S2V5ID0gdGhpcy5nZXRLZXk7DQogICAgICAgIHJldHVybiByOw0KICAgIH0NCn0pOw0KDQpFeHQudXRpbC5NaXhlZENvbGxlY3Rpb24ucHJvdG90eXBlLmdldCA9IEV4dC51dGlsLk1peGVkQ29sbGVjdGlvbi5wcm90b3R5cGUuaXRlbTsKDQpFeHQudXRpbC5KU09OID0gbmV3IChmdW5jdGlvbigpew0KICAgIHZhciB1c2VIYXNPd24gPSB7fS5oYXNPd25Qcm9wZXJ0eSA/IHRydWUgOiBmYWxzZTsNCiAgICANCiAgICAKICAgIAogICAgDQogICAgdmFyIHBhZCA9IGZ1bmN0aW9uKG4pIHsNCiAgICAgICAgcmV0dXJuIG4gPCAxMCA/ICIwIiArIG4gOiBuOw0KICAgIH07DQogICAgDQogICAgdmFyIG0gPSB7DQogICAgICAgICJcYiI6ICdcXGInLA0KICAgICAgICAiXHQiOiAnXFx0JywNCiAgICAgICAgIlxuIjogJ1xcbicsDQogICAgICAgICJcZiI6ICdcXGYnLA0KICAgICAgICAiXHIiOiAnXFxyJywNCiAgICAgICAgJyInIDogJ1xcIicsDQogICAgICAgICJcXCI6ICdcXFxcJw0KICAgIH07DQoNCiAgICB2YXIgZW5jb2RlU3RyaW5nID0gZnVuY3Rpb24ocyl7DQogICAgICAgIGlmICgvWyJcXFx4MDAtXHgxZl0vLnRlc3QocykpIHsNCiAgICAgICAgICAgIHJldHVybiAnIicgKyBzLnJlcGxhY2UoLyhbXHgwMC1ceDFmXFwiXSkvZywgZnVuY3Rpb24oYSwgYikgew0KICAgICAgICAgICAgICAgIHZhciBjID0gbVtiXTsNCiAgICAgICAgICAgICAgICBpZihjKXsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGMgPSBiLmNoYXJDb2RlQXQoKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gIlxcdTAwIiArDQogICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoYyAvIDE2KS50b1N0cmluZygxNikgKw0KICAgICAgICAgICAgICAgICAgICAoYyAlIDE2KS50b1N0cmluZygxNik7DQogICAgICAgICAgICB9KSArICciJzsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gJyInICsgcyArICciJzsNCiAgICB9Ow0KICAgIA0KICAgIHZhciBlbmNvZGVBcnJheSA9IGZ1bmN0aW9uKG8pew0KICAgICAgICB2YXIgYSA9IFsiWyJdLCBiLCBpLCBsID0gby5sZW5ndGgsIHY7DQogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSArPSAxKSB7DQogICAgICAgICAgICAgICAgdiA9IG9baV07DQogICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlb2Ygdikgew0KICAgICAgICAgICAgICAgICAgICBjYXNlICJ1bmRlZmluZWQiOg0KICAgICAgICAgICAgICAgICAgICBjYXNlICJmdW5jdGlvbiI6DQogICAgICAgICAgICAgICAgICAgIGNhc2UgInVua25vd24iOg0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYikgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEucHVzaCgnLCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgYS5wdXNoKHYgPT09IG51bGwgPyAibnVsbCIgOiBFeHQudXRpbC5KU09OLmVuY29kZSh2KSk7DQogICAgICAgICAgICAgICAgICAgICAgICBiID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBhLnB1c2goIl0iKTsNCiAgICAgICAgICAgIHJldHVybiBhLmpvaW4oIiIpOw0KICAgIH07DQogICAgDQogICAgdmFyIGVuY29kZURhdGUgPSBmdW5jdGlvbihvKXsNCiAgICAgICAgcmV0dXJuICciJyArIG8uZ2V0RnVsbFllYXIoKSArICItIiArDQogICAgICAgICAgICAgICAgcGFkKG8uZ2V0TW9udGgoKSArIDEpICsgIi0iICsNCiAgICAgICAgICAgICAgICBwYWQoby5nZXREYXRlKCkpICsgIlQiICsNCiAgICAgICAgICAgICAgICBwYWQoby5nZXRIb3VycygpKSArICI6IiArDQogICAgICAgICAgICAgICAgcGFkKG8uZ2V0TWludXRlcygpKSArICI6IiArDQogICAgICAgICAgICAgICAgcGFkKG8uZ2V0U2Vjb25kcygpKSArICciJzsNCiAgICB9Ow0KICAgIA0KICAgIA0KICAgIHRoaXMuZW5jb2RlID0gZnVuY3Rpb24obyl7DQogICAgICAgIGlmKHR5cGVvZiBvID09ICJ1bmRlZmluZWQiIHx8IG8gPT09IG51bGwpew0KICAgICAgICAgICAgcmV0dXJuICJudWxsIjsNCiAgICAgICAgfWVsc2UgaWYobyBpbnN0YW5jZW9mIEFycmF5KXsNCiAgICAgICAgICAgIHJldHVybiBlbmNvZGVBcnJheShvKTsNCiAgICAgICAgfWVsc2UgaWYobyBpbnN0YW5jZW9mIERhdGUpew0KICAgICAgICAgICAgcmV0dXJuIGVuY29kZURhdGUobyk7DQogICAgICAgIH1lbHNlIGlmKHR5cGVvZiBvID09ICJzdHJpbmciKXsNCiAgICAgICAgICAgIHJldHVybiBlbmNvZGVTdHJpbmcobyk7DQogICAgICAgIH1lbHNlIGlmKHR5cGVvZiBvID09ICJudW1iZXIiKXsNCiAgICAgICAgICAgIHJldHVybiBpc0Zpbml0ZShvKSA/IFN0cmluZyhvKSA6ICJudWxsIjsNCiAgICAgICAgfWVsc2UgaWYodHlwZW9mIG8gPT0gImJvb2xlYW4iKXsNCiAgICAgICAgICAgIHJldHVybiBTdHJpbmcobyk7DQogICAgICAgIH1lbHNlIHsNCiAgICAgICAgICAgIHZhciBhID0gWyJ7Il0sIGIsIGksIHY7DQogICAgICAgICAgICBmb3IgKGkgaW4gbykgew0KICAgICAgICAgICAgICAgIGlmKCF1c2VIYXNPd24gfHwgby5oYXNPd25Qcm9wZXJ0eShpKSkgew0KICAgICAgICAgICAgICAgICAgICB2ID0gb1tpXTsNCiAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlb2Ygdikgew0KICAgICAgICAgICAgICAgICAgICBjYXNlICJ1bmRlZmluZWQiOg0KICAgICAgICAgICAgICAgICAgICBjYXNlICJmdW5jdGlvbiI6DQogICAgICAgICAgICAgICAgICAgIGNhc2UgInVua25vd24iOg0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgICAgICBpZihiKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnB1c2goJywnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGEucHVzaCh0aGlzLmVuY29kZShpKSwgIjoiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID09PSBudWxsID8gIm51bGwiIDogdGhpcy5lbmNvZGUodikpOw0KICAgICAgICAgICAgICAgICAgICAgICAgYiA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBhLnB1c2goIn0iKTsNCiAgICAgICAgICAgIHJldHVybiBhLmpvaW4oIiIpOw0KICAgICAgICB9DQogICAgfTsNCiAgICANCiAgICANCiAgICB0aGlzLmRlY29kZSA9IGZ1bmN0aW9uKGpzb24pew0KICAgICAgICByZXR1cm4gZXZhbCgiKCIgKyBqc29uICsgJyknKTsNCiAgICB9Ow0KfSkoKTsNCg0KRXh0LmVuY29kZSA9IEV4dC51dGlsLkpTT04uZW5jb2RlOw0KDQpFeHQuZGVjb2RlID0gRXh0LnV0aWwuSlNPTi5kZWNvZGU7DQoKDQpFeHQudXRpbC5Gb3JtYXQgPSBmdW5jdGlvbigpew0KICAgIHZhciB0cmltUmUgPSAvXlxzK3xccyskL2c7DQogICAgcmV0dXJuIHsNCiAgICAgICAgDQogICAgICAgIGVsbGlwc2lzIDogZnVuY3Rpb24odmFsdWUsIGxlbil7DQogICAgICAgICAgICBpZih2YWx1ZSAmJiB2YWx1ZS5sZW5ndGggPiBsZW4pew0KICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5zdWJzdHIoMCwgbGVuLTMpKyIuLi4iOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KICAgICAgICB9LA0KDQogICAgICAgIA0KICAgICAgICB1bmRlZiA6IGZ1bmN0aW9uKHZhbHVlKXsNCiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgIT0gInVuZGVmaW5lZCIgPyB2YWx1ZSA6ICIiOw0KICAgICAgICB9LA0KDQogICAgICAgIA0KICAgICAgICBodG1sRW5jb2RlIDogZnVuY3Rpb24odmFsdWUpew0KICAgICAgICAgICAgcmV0dXJuICF2YWx1ZSA/IHZhbHVlIDogU3RyaW5nKHZhbHVlKS5yZXBsYWNlKC8mL2csICImYW1wOyIpLnJlcGxhY2UoLz4vZywgIiZndDsiKS5yZXBsYWNlKC88L2csICImbHQ7IikucmVwbGFjZSgvIi9nLCAiJnF1b3Q7Iik7DQogICAgICAgIH0sDQoNCiAgICAgICAgDQogICAgICAgIGh0bWxEZWNvZGUgOiBmdW5jdGlvbih2YWx1ZSl7DQogICAgICAgICAgICByZXR1cm4gIXZhbHVlID8gdmFsdWUgOiBTdHJpbmcodmFsdWUpLnJlcGxhY2UoLyZhbXA7L2csICImIikucmVwbGFjZSgvJmd0Oy9nLCAiPiIpLnJlcGxhY2UoLyZsdDsvZywgIjwiKS5yZXBsYWNlKC8mcXVvdDsvZywgJyInKTsNCiAgICAgICAgfSwNCg0KICAgICAgICANCiAgICAgICAgdHJpbSA6IGZ1bmN0aW9uKHZhbHVlKXsNCiAgICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpLnJlcGxhY2UodHJpbVJlLCAiIik7DQogICAgICAgIH0sDQoNCiAgICAgICAgDQogICAgICAgIHN1YnN0ciA6IGZ1bmN0aW9uKHZhbHVlLCBzdGFydCwgbGVuZ3RoKXsNCiAgICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpLnN1YnN0cihzdGFydCwgbGVuZ3RoKTsNCiAgICAgICAgfSwNCg0KICAgICAgICANCiAgICAgICAgbG93ZXJjYXNlIDogZnVuY3Rpb24odmFsdWUpew0KICAgICAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSkudG9Mb3dlckNhc2UoKTsNCiAgICAgICAgfSwNCg0KICAgICAgICANCiAgICAgICAgdXBwZXJjYXNlIDogZnVuY3Rpb24odmFsdWUpew0KICAgICAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSkudG9VcHBlckNhc2UoKTsNCiAgICAgICAgfSwNCg0KICAgICAgICANCiAgICAgICAgY2FwaXRhbGl6ZSA6IGZ1bmN0aW9uKHZhbHVlKXsNCiAgICAgICAgICAgIHJldHVybiAhdmFsdWUgPyB2YWx1ZSA6IHZhbHVlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdmFsdWUuc3Vic3RyKDEpLnRvTG93ZXJDYXNlKCk7DQogICAgICAgIH0sDQoNCiAgICAgICAgCiAgICAgICAgY2FsbCA6IGZ1bmN0aW9uKHZhbHVlLCBmbil7DQogICAgICAgICAgICBpZihhcmd1bWVudHMubGVuZ3RoID4gMil7DQogICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpOw0KICAgICAgICAgICAgICAgIGFyZ3MudW5zaGlmdCh2YWx1ZSk7DQogICAgICAgICAgICAgICAgcmV0dXJuIGV2YWwoZm4pLmFwcGx5KHdpbmRvdywgYXJncyk7DQogICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICByZXR1cm4gZXZhbChmbikuY2FsbCh3aW5kb3csIHZhbHVlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCg0KICAgICAgICANCiAgICAgICAgdXNNb25leSA6IGZ1bmN0aW9uKHYpew0KICAgICAgICAgICAgdiA9IChNYXRoLnJvdW5kKCh2LTApKjEwMCkpLzEwMDsNCiAgICAgICAgICAgIHYgPSAodiA9PSBNYXRoLmZsb29yKHYpKSA/IHYgKyAiLjAwIiA6ICgodioxMCA9PSBNYXRoLmZsb29yKHYqMTApKSA/IHYgKyAiMCIgOiB2KTsNCiAgICAgICAgICAgIHYgPSBTdHJpbmcodik7DQogICAgICAgICAgICB2YXIgcHMgPSB2LnNwbGl0KCcuJyk7DQogICAgICAgICAgICB2YXIgd2hvbGUgPSBwc1swXTsNCiAgICAgICAgICAgIHZhciBzdWIgPSBwc1sxXSA/ICcuJysgcHNbMV0gOiAnLjAwJzsNCiAgICAgICAgICAgIHZhciByID0gLyhcZCspKFxkezN9KS87DQogICAgICAgICAgICB3aGlsZSAoci50ZXN0KHdob2xlKSkgew0KICAgICAgICAgICAgICAgIHdob2xlID0gd2hvbGUucmVwbGFjZShyLCAnJDEnICsgJywnICsgJyQyJyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gIiQiICsgd2hvbGUgKyBzdWIgOw0KICAgICAgICB9LA0KDQogICAgICAgIA0KICAgICAgICBkYXRlIDogZnVuY3Rpb24odiwgZm9ybWF0KXsNCiAgICAgICAgICAgIGlmKCF2KXsNCiAgICAgICAgICAgICAgICByZXR1cm4gIiI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZighKHYgaW5zdGFuY2VvZiBEYXRlKSl7DQogICAgICAgICAgICAgICAgdiA9IG5ldyBEYXRlKERhdGUucGFyc2UodikpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHYuZGF0ZUZvcm1hdChmb3JtYXQgfHwgIm0vZC9ZIik7DQogICAgICAgIH0sDQoNCiAgICAgICAgDQogICAgICAgIGRhdGVSZW5kZXJlciA6IGZ1bmN0aW9uKGZvcm1hdCl7DQogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odil7DQogICAgICAgICAgICAgICAgcmV0dXJuIEV4dC51dGlsLkZvcm1hdC5kYXRlKHYsIGZvcm1hdCk7ICANCiAgICAgICAgICAgIH07DQogICAgICAgIH0sDQoNCiAgICAgICAgCiAgICAgICAgc3RyaXBUYWdzUkUgOiAvPFwvP1tePl0rPi9naSwNCiAgICAgICAgDQogICAgICAgIA0KICAgICAgICBzdHJpcFRhZ3MgOiBmdW5jdGlvbih2KXsNCiAgICAgICAgICAgIHJldHVybiAhdiA/IHYgOiBTdHJpbmcodikucmVwbGFjZSh0aGlzLnN0cmlwVGFnc1JFLCAiIik7DQogICAgICAgIH0NCiAgICB9Ow0KfSgpOwoNCkV4dC5NYXN0ZXJUZW1wbGF0ZSA9IGZ1bmN0aW9uKCl7DQogICAgRXh0Lk1hc3RlclRlbXBsYXRlLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCiAgICB0aGlzLm9yaWdpbmFsSHRtbCA9IHRoaXMuaHRtbDsNCiAgICB2YXIgc3QgPSB7fTsNCiAgICB2YXIgbSwgcmUgPSB0aGlzLnN1YlRlbXBsYXRlUmU7DQogICAgcmUubGFzdEluZGV4ID0gMDsNCiAgICB2YXIgc3ViSW5kZXggPSAwOw0KICAgIHdoaWxlKG0gPSByZS5leGVjKHRoaXMuaHRtbCkpew0KICAgICAgICB2YXIgbmFtZSA9IG1bMV0sIGNvbnRlbnQgPSBtWzJdOw0KICAgICAgICBzdFtzdWJJbmRleF0gPSB7DQogICAgICAgICAgICBuYW1lOiBuYW1lLA0KICAgICAgICAgICAgaW5kZXg6IHN1YkluZGV4LA0KICAgICAgICAgICAgYnVmZmVyOiBbXSwNCiAgICAgICAgICAgIHRwbCA6IG5ldyBFeHQuVGVtcGxhdGUoY29udGVudCkNCiAgICAgICAgfTsNCiAgICAgICAgaWYobmFtZSl7DQogICAgICAgICAgICBzdFtuYW1lXSA9IHN0W3N1YkluZGV4XTsNCiAgICAgICAgfQ0KICAgICAgICBzdFtzdWJJbmRleF0udHBsLmNvbXBpbGUoKTsNCiAgICAgICAgc3Rbc3ViSW5kZXhdLnRwbC5jYWxsID0gdGhpcy5jYWxsLmNyZWF0ZURlbGVnYXRlKHRoaXMpOw0KICAgICAgICBzdWJJbmRleCsrOw0KICAgIH0NCiAgICB0aGlzLnN1YkNvdW50ID0gc3ViSW5kZXg7DQogICAgdGhpcy5zdWJzID0gc3Q7DQp9Ow0KRXh0LmV4dGVuZChFeHQuTWFzdGVyVGVtcGxhdGUsIEV4dC5UZW1wbGF0ZSwgew0KICAgIA0KICAgIHN1YlRlbXBsYXRlUmUgOiAvPHRwbCg/OlxzbmFtZT0iKFtcdy1dKykiKT8+KCg/Oi58XG4pKj8pPFwvdHBsPi9naSwNCg0KICAgIA0KICAgICBhZGQgOiBmdW5jdGlvbihuYW1lLCB2YWx1ZXMpew0KICAgICAgICBpZihhcmd1bWVudHMubGVuZ3RoID09IDEpew0KICAgICAgICAgICAgdmFsdWVzID0gYXJndW1lbnRzWzBdOw0KICAgICAgICAgICAgbmFtZSA9IDA7DQogICAgICAgIH0NCiAgICAgICAgdmFyIHMgPSB0aGlzLnN1YnNbbmFtZV07DQogICAgICAgIHMuYnVmZmVyW3MuYnVmZmVyLmxlbmd0aF0gPSBzLnRwbC5hcHBseSh2YWx1ZXMpOw0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9LA0KDQogICAgDQogICAgZmlsbCA6IGZ1bmN0aW9uKG5hbWUsIHZhbHVlcywgcmVzZXQpew0KICAgICAgICB2YXIgYSA9IGFyZ3VtZW50czsNCiAgICAgICAgaWYoYS5sZW5ndGggPT0gMSB8fCAoYS5sZW5ndGggPT0gMiAmJiB0eXBlb2YgYVsxXSA9PSAiYm9vbGVhbiIpKXsNCiAgICAgICAgICAgIHZhbHVlcyA9IGFbMF07DQogICAgICAgICAgICBuYW1lID0gMDsNCiAgICAgICAgICAgIHJlc2V0ID0gYVsxXTsNCiAgICAgICAgfQ0KICAgICAgICBpZihyZXNldCl7DQogICAgICAgICAgICB0aGlzLnJlc2V0KCk7DQogICAgICAgIH0NCiAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gdmFsdWVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXsNCiAgICAgICAgICAgIHRoaXMuYWRkKG5hbWUsIHZhbHVlc1tpXSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSwNCg0KICAgIA0KICAgICByZXNldCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHZhciBzID0gdGhpcy5zdWJzOw0KICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5zdWJDb3VudDsgaSsrKXsNCiAgICAgICAgICAgIHNbaV0uYnVmZmVyID0gW107DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSwNCg0KICAgIGFwcGx5VGVtcGxhdGUgOiBmdW5jdGlvbih2YWx1ZXMpew0KICAgICAgICB2YXIgcyA9IHRoaXMuc3ViczsNCiAgICAgICAgdmFyIHJlcGxhY2VJbmRleCA9IC0xOw0KICAgICAgICB0aGlzLmh0bWwgPSB0aGlzLm9yaWdpbmFsSHRtbC5yZXBsYWNlKHRoaXMuc3ViVGVtcGxhdGVSZSwgZnVuY3Rpb24obSwgbmFtZSl7DQogICAgICAgICAgICByZXR1cm4gc1srK3JlcGxhY2VJbmRleF0uYnVmZmVyLmpvaW4oIiIpOw0KICAgICAgICB9KTsNCiAgICAgICAgcmV0dXJuIEV4dC5NYXN0ZXJUZW1wbGF0ZS5zdXBlcmNsYXNzLmFwcGx5VGVtcGxhdGUuY2FsbCh0aGlzLCB2YWx1ZXMpOw0KICAgIH0sDQoNCiAgICBhcHBseSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLmFwcGx5VGVtcGxhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCiAgICB9LA0KDQogICAgY29tcGlsZSA6IGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXM7fQ0KfSk7DQoNCg0KRXh0Lk1hc3RlclRlbXBsYXRlLnByb3RvdHlwZS5hZGRBbGwgPSBFeHQuTWFzdGVyVGVtcGxhdGUucHJvdG90eXBlLmZpbGw7DQogDQpFeHQuTWFzdGVyVGVtcGxhdGUuZnJvbSA9IGZ1bmN0aW9uKGVsLCBjb25maWcpew0KICAgIGVsID0gRXh0LmdldERvbShlbCk7DQogICAgcmV0dXJuIG5ldyBFeHQuTWFzdGVyVGVtcGxhdGUoZWwudmFsdWUgfHwgZWwuaW5uZXJIVE1MLCBjb25maWcgfHwgJycpOw0KfTsKRXh0LlhUZW1wbGF0ZSA9IGZ1bmN0aW9uKCl7DQogICAgRXh0LlhUZW1wbGF0ZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7DQogICAgdmFyIHMgPSB0aGlzLmh0bWw7DQoNCiAgICBzID0gWyc8dHBsPicsIHMsICc8L3RwbD4nXS5qb2luKCcnKTsNCg0KICAgIHZhciByZSA9IC88dHBsXGJbXj5dKj4oKD86KD89KFtePF0rKSlcMnw8KD8hdHBsXGJbXj5dKj4pKSo/KTxcL3RwbD4vOw0KDQogICAgdmFyIG5hbWVSZSA9IC9ePHRwbFxiW14+XSo/Zm9yPSIoLio/KSIvOw0KICAgIHZhciBpZlJlID0gL148dHBsXGJbXj5dKj9pZj0iKC4qPykiLzsNCiAgICB2YXIgZXhlY1JlID0gL148dHBsXGJbXj5dKj9leGVjPSIoLio/KSIvOw0KICAgIHZhciBtLCBpZCA9IDA7DQogICAgdmFyIHRwbHMgPSBbXTsNCg0KICAgIHdoaWxlKG0gPSBzLm1hdGNoKHJlKSl7DQogICAgICAgdmFyIG0yID0gbVswXS5tYXRjaChuYW1lUmUpOw0KICAgICAgIHZhciBtMyA9IG1bMF0ubWF0Y2goaWZSZSk7DQogICAgICAgdmFyIG00ID0gbVswXS5tYXRjaChleGVjUmUpOw0KICAgICAgIHZhciBleHAgPSBudWxsLCBmbiA9IG51bGwsIGV4ZWMgPSBudWxsOw0KICAgICAgIHZhciBuYW1lID0gbTIgJiYgbTJbMV0gPyBtMlsxXSA6ICcnOw0KICAgICAgIGlmKG0zKXsNCiAgICAgICAgICAgZXhwID0gbTMgJiYgbTNbMV0gPyBtM1sxXSA6IG51bGw7DQogICAgICAgICAgIGlmKGV4cCl7DQogICAgICAgICAgICAgICBmbiA9IG5ldyBGdW5jdGlvbigndmFsdWVzJywgJ3BhcmVudCcsICd3aXRoKHZhbHVlcyl7IHJldHVybiAnKyhFeHQudXRpbC5Gb3JtYXQuaHRtbERlY29kZShleHApKSsnOyB9Jyk7DQogICAgICAgICAgIH0NCiAgICAgICB9DQogICAgICAgaWYobTQpew0KICAgICAgICAgICBleHAgPSBtNCAmJiBtNFsxXSA/IG00WzFdIDogbnVsbDsNCiAgICAgICAgICAgaWYoZXhwKXsNCiAgICAgICAgICAgICAgIGV4ZWMgPSBuZXcgRnVuY3Rpb24oJ3ZhbHVlcycsICdwYXJlbnQnLCAnd2l0aCh2YWx1ZXMpeyAnKyhFeHQudXRpbC5Gb3JtYXQuaHRtbERlY29kZShleHApKSsnOyB9Jyk7DQogICAgICAgICAgIH0NCiAgICAgICB9DQogICAgICAgaWYobmFtZSl7DQogICAgICAgICAgIHN3aXRjaChuYW1lKXsNCiAgICAgICAgICAgICAgIGNhc2UgJy4nOiBuYW1lID0gbmV3IEZ1bmN0aW9uKCd2YWx1ZXMnLCAncGFyZW50JywgJ3dpdGgodmFsdWVzKXsgcmV0dXJuIHZhbHVlczsgfScpOyBicmVhazsNCiAgICAgICAgICAgICAgIGNhc2UgJy4uJzogbmFtZSA9IG5ldyBGdW5jdGlvbigndmFsdWVzJywgJ3BhcmVudCcsICd3aXRoKHZhbHVlcyl7IHJldHVybiBwYXJlbnQ7IH0nKTsgYnJlYWs7DQogICAgICAgICAgICAgICBkZWZhdWx0OiBuYW1lID0gbmV3IEZ1bmN0aW9uKCd2YWx1ZXMnLCAncGFyZW50JywgJ3dpdGgodmFsdWVzKXsgcmV0dXJuICcrbmFtZSsnOyB9Jyk7DQogICAgICAgICAgIH0NCiAgICAgICB9DQogICAgICAgdHBscy5wdXNoKHsNCiAgICAgICAgICAgIGlkOiBpZCwNCiAgICAgICAgICAgIHRhcmdldDogbmFtZSwNCiAgICAgICAgICAgIGV4ZWM6IGV4ZWMsDQogICAgICAgICAgICB0ZXN0OiBmbiwNCiAgICAgICAgICAgIGJvZHk6IG1bMV18fCcnDQogICAgICAgIH0pOw0KICAgICAgIHMgPSBzLnJlcGxhY2UobVswXSwgJ3t4dHBsJysgaWQgKyAnfScpOw0KICAgICAgICsraWQ7DQogICAgfQ0KICAgIGZvcih2YXIgaSA9IHRwbHMubGVuZ3RoLTE7IGkgPj0gMDsgLS1pKXsNCiAgICAgICAgdGhpcy5jb21waWxlVHBsKHRwbHNbaV0pOw0KICAgIH0NCiAgICB0aGlzLm1hc3RlciA9IHRwbHNbdHBscy5sZW5ndGgtMV07DQogICAgdGhpcy50cGxzID0gdHBsczsNCn07DQpFeHQuZXh0ZW5kKEV4dC5YVGVtcGxhdGUsIEV4dC5UZW1wbGF0ZSwgew0KDQogICAgcmUgOiAvXHsoW1x3LVwuXSspKD86XDooW1x3XC5dKikoPzpcKCguKj8pP1wpKT8pP1x9L2csDQoNCiAgICBhcHBseVN1YlRlbXBsYXRlIDogZnVuY3Rpb24oaWQsIHZhbHVlcywgcGFyZW50KXsNCiAgICAgICAgdmFyIHQgPSB0aGlzLnRwbHNbaWRdOw0KICAgICAgICBpZih0LnRlc3QgJiYgIXQudGVzdC5jYWxsKHRoaXMsIHZhbHVlcywgcGFyZW50KSl7DQogICAgICAgICAgICByZXR1cm4gJyc7DQogICAgICAgIH0NCiAgICAgICAgaWYodC5leGVjICYmIHQuZXhlYy5jYWxsKHRoaXMsIHZhbHVlcywgcGFyZW50KSl7DQogICAgICAgICAgICByZXR1cm4gJyc7DQogICAgICAgIH0NCiAgICAgICAgdmFyIHZzID0gdC50YXJnZXQgPyB0LnRhcmdldC5jYWxsKHRoaXMsIHZhbHVlcywgcGFyZW50KSA6IHZhbHVlczsNCiAgICAgICAgcGFyZW50ID0gdC50YXJnZXQgPyB2YWx1ZXMgOiBwYXJlbnQ7DQogICAgICAgIGlmKHQudGFyZ2V0ICYmIHZzIGluc3RhbmNlb2YgQXJyYXkpew0KICAgICAgICAgICAgdmFyIGJ1ZiA9IFtdOw0KICAgICAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gdnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspew0KICAgICAgICAgICAgICAgIGJ1ZltidWYubGVuZ3RoXSA9IHQuY29tcGlsZWQuY2FsbCh0aGlzLCB2c1tpXSwgcGFyZW50KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBidWYuam9pbignJyk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHQuY29tcGlsZWQuY2FsbCh0aGlzLCB2cywgcGFyZW50KTsNCiAgICB9LA0KDQogICAgY29tcGlsZVRwbCA6IGZ1bmN0aW9uKHRwbCl7DQogICAgICAgIHZhciBmbSA9IEV4dC51dGlsLkZvcm1hdDsNCiAgICAgICAgdmFyIHVzZUYgPSB0aGlzLmRpc2FibGVGb3JtYXRzICE9PSB0cnVlOw0KICAgICAgICB2YXIgc2VwID0gRXh0LmlzR2Vja28gPyAiKyIgOiAiLCI7DQogICAgICAgIHZhciBmbiA9IGZ1bmN0aW9uKG0sIG5hbWUsIGZvcm1hdCwgYXJncyl7DQogICAgICAgICAgICBpZihuYW1lLnN1YnN0cigwLCA0KSA9PSAneHRwbCcpew0KICAgICAgICAgICAgICAgIHJldHVybiAiJyIrIHNlcCArJ3RoaXMuYXBwbHlTdWJUZW1wbGF0ZSgnK25hbWUuc3Vic3RyKDQpKycsIHZhbHVlcywgcGFyZW50KScrc2VwKyInIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHZhciB2Ow0KICAgICAgICAgICAgaWYobmFtZS5pbmRleE9mKCcuJykgIT0gLTEpew0KICAgICAgICAgICAgICAgIHYgPSBuYW1lOw0KICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgdiA9ICJ2YWx1ZXNbJyIgKyBuYW1lICsgIiddIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKGZvcm1hdCAmJiB1c2VGKXsNCiAgICAgICAgICAgICAgICBhcmdzID0gYXJncyA/ICcsJyArIGFyZ3MgOiAiIjsNCiAgICAgICAgICAgICAgICBpZihmb3JtYXQuc3Vic3RyKDAsIDUpICE9ICJ0aGlzLiIpew0KICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAiZm0uIiArIGZvcm1hdCArICcoJzsNCiAgICAgICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gJ3RoaXMuY2FsbCgiJysgZm9ybWF0LnN1YnN0cig1KSArICciLCAnOw0KICAgICAgICAgICAgICAgICAgICBhcmdzID0gIiwgdmFsdWVzIjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICBhcmdzPSAnJzsgZm9ybWF0ID0gIigiK3YrIiA9PT0gdW5kZWZpbmVkID8gJycgOiAiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuICInIisgc2VwICsgZm9ybWF0ICsgdiArIGFyZ3MgKyAiKSIrc2VwKyInIjsNCiAgICAgICAgfTsNCiAgICAgICAgdmFyIGJvZHk7DQogICAgICAgIAogICAgICAgIGlmKEV4dC5pc0dlY2tvKXsNCiAgICAgICAgICAgIGJvZHkgPSAidHBsLmNvbXBpbGVkID0gZnVuY3Rpb24odmFsdWVzLCBwYXJlbnQpeyByZXR1cm4gJyIgKw0KICAgICAgICAgICAgICAgICAgIHRwbC5ib2R5LnJlcGxhY2UoLyhcclxufFxuKS9nLCAnXFxuJykucmVwbGFjZSgvJy9nLCAiXFwnIikucmVwbGFjZSh0aGlzLnJlLCBmbikgKw0KICAgICAgICAgICAgICAgICAgICAiJzt9OyI7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgYm9keSA9IFsidHBsLmNvbXBpbGVkID0gZnVuY3Rpb24odmFsdWVzLCBwYXJlbnQpeyByZXR1cm4gWyciXTsNCiAgICAgICAgICAgIGJvZHkucHVzaCh0cGwuYm9keS5yZXBsYWNlKC8oXHJcbnxcbikvZywgJ1xcbicpLnJlcGxhY2UoLycvZywgIlxcJyIpLnJlcGxhY2UodGhpcy5yZSwgZm4pKTsNCiAgICAgICAgICAgIGJvZHkucHVzaCgiJ10uam9pbignJyk7fTsiKTsNCiAgICAgICAgICAgIGJvZHkgPSBib2R5LmpvaW4oJycpOw0KICAgICAgICB9DQogICAgICAgIGV2YWwoYm9keSk7DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0sDQoNCiAgICBhcHBseVRlbXBsYXRlIDogZnVuY3Rpb24odmFsdWVzKXsNCiAgICAgICAgcmV0dXJuIHRoaXMubWFzdGVyLmNvbXBpbGVkLmNhbGwodGhpcywgdmFsdWVzLCB7fSk7DQogICAgICAgIHZhciBzID0gdGhpcy5zdWJzOw0KICAgIH0sDQoNCiAgICBhcHBseSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLmFwcGx5VGVtcGxhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCiAgICB9LA0KDQogICAgY29tcGlsZSA6IGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXM7fQ0KfSk7DQoNCkV4dC5YVGVtcGxhdGUuZnJvbSA9IGZ1bmN0aW9uKGVsKXsNCiAgICBlbCA9IEV4dC5nZXREb20oZWwpOw0KICAgIHJldHVybiBuZXcgRXh0LlhUZW1wbGF0ZShlbC52YWx1ZSB8fCBlbC5pbm5lckhUTUwpOw0KfTsKDQpFeHQudXRpbC5DU1MgPSBmdW5jdGlvbigpew0KCXZhciBydWxlcyA9IG51bGw7DQogICAJdmFyIGRvYyA9IGRvY3VtZW50Ow0KDQogICAgdmFyIGNhbWVsUmUgPSAvKC1bYS16XSkvZ2k7DQogICAgdmFyIGNhbWVsRm4gPSBmdW5jdGlvbihtLCBhKXsgcmV0dXJuIGEuY2hhckF0KDEpLnRvVXBwZXJDYXNlKCk7IH07DQoNCiAgIHJldHVybiB7DQogICANCiAgIGNyZWF0ZVN0eWxlU2hlZXQgOiBmdW5jdGlvbihjc3NUZXh0LCBpZCl7DQogICAgICAgdmFyIHNzOw0KICAgICAgIHZhciBoZWFkID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF07DQogICAgICAgdmFyIHJ1bGVzID0gZG9jLmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7DQogICAgICAgcnVsZXMuc2V0QXR0cmlidXRlKCJ0eXBlIiwgInRleHQvY3NzIik7DQogICAgICAgaWYoaWQpew0KICAgICAgICAgICBydWxlcy5zZXRBdHRyaWJ1dGUoImlkIiwgaWQpOw0KICAgICAgIH0NCiAgICAgICBpZihFeHQuaXNJRSl7DQogICAgICAgICAgIGhlYWQuYXBwZW5kQ2hpbGQocnVsZXMpOw0KICAgICAgICAgICBzcyA9IHJ1bGVzLnN0eWxlU2hlZXQ7DQogICAgICAgICAgIHNzLmNzc1RleHQgPSBjc3NUZXh0Ow0KICAgICAgIH1lbHNlew0KICAgICAgICAgICB0cnl7DQogICAgICAgICAgICAgICAgcnVsZXMuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKGNzc1RleHQpKTsNCiAgICAgICAgICAgfWNhdGNoKGUpew0KICAgICAgICAgICAgICAgcnVsZXMuY3NzVGV4dCA9IGNzc1RleHQ7IA0KICAgICAgICAgICB9DQogICAgICAgICAgIGhlYWQuYXBwZW5kQ2hpbGQocnVsZXMpOw0KICAgICAgICAgICBzcyA9IHJ1bGVzLnN0eWxlU2hlZXQgPyBydWxlcy5zdHlsZVNoZWV0IDogKHJ1bGVzLnNoZWV0IHx8IGRvYy5zdHlsZVNoZWV0c1tkb2Muc3R5bGVTaGVldHMubGVuZ3RoLTFdKTsNCiAgICAgICB9DQogICAgICAgdGhpcy5jYWNoZVN0eWxlU2hlZXQoc3MpOw0KICAgICAgIHJldHVybiBzczsNCiAgIH0sDQoNCiAgIA0KICAgcmVtb3ZlU3R5bGVTaGVldCA6IGZ1bmN0aW9uKGlkKXsNCiAgICAgICB2YXIgZXhpc3RpbmcgPSBkb2MuZ2V0RWxlbWVudEJ5SWQoaWQpOw0KICAgICAgIGlmKGV4aXN0aW5nKXsNCiAgICAgICAgICAgZXhpc3RpbmcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChleGlzdGluZyk7DQogICAgICAgfQ0KICAgfSwNCg0KICAgDQogICBzd2FwU3R5bGVTaGVldCA6IGZ1bmN0aW9uKGlkLCB1cmwpew0KICAgICAgIHRoaXMucmVtb3ZlU3R5bGVTaGVldChpZCk7DQogICAgICAgdmFyIHNzID0gZG9jLmNyZWF0ZUVsZW1lbnQoImxpbmsiKTsNCiAgICAgICBzcy5zZXRBdHRyaWJ1dGUoInJlbCIsICJzdHlsZXNoZWV0Iik7DQogICAgICAgc3Muc2V0QXR0cmlidXRlKCJ0eXBlIiwgInRleHQvY3NzIik7DQogICAgICAgc3Muc2V0QXR0cmlidXRlKCJpZCIsIGlkKTsNCiAgICAgICBzcy5zZXRBdHRyaWJ1dGUoImhyZWYiLCB1cmwpOw0KICAgICAgIGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdLmFwcGVuZENoaWxkKHNzKTsNCiAgIH0sDQogICANCiAgIA0KICAgcmVmcmVzaENhY2hlIDogZnVuY3Rpb24oKXsNCiAgICAgICByZXR1cm4gdGhpcy5nZXRSdWxlcyh0cnVlKTsNCiAgIH0sDQoNCiAgIAogICBjYWNoZVN0eWxlU2hlZXQgOiBmdW5jdGlvbihzcyl7DQogICAgICAgaWYoIXJ1bGVzKXsNCiAgICAgICAgICAgcnVsZXMgPSB7fTsNCiAgICAgICB9DQogICAgICAgdHJ5ewogICAgICAgICAgIHZhciBzc1J1bGVzID0gc3MuY3NzUnVsZXMgfHwgc3MucnVsZXM7DQogICAgICAgICAgIGZvcih2YXIgaiA9IHNzUnVsZXMubGVuZ3RoLTE7IGogPj0gMDsgLS1qKXsNCiAgICAgICAgICAgICAgIHJ1bGVzW3NzUnVsZXNbal0uc2VsZWN0b3JUZXh0XSA9IHNzUnVsZXNbal07DQogICAgICAgICAgIH0NCiAgICAgICB9Y2F0Y2goZSl7fQ0KICAgfSwNCiAgIA0KICAgDQogICBnZXRSdWxlcyA6IGZ1bmN0aW9uKHJlZnJlc2hDYWNoZSl7DQogICAJCWlmKHJ1bGVzID09IG51bGwgfHwgcmVmcmVzaENhY2hlKXsNCiAgIAkJCXJ1bGVzID0ge307DQogICAJCQl2YXIgZHMgPSBkb2Muc3R5bGVTaGVldHM7DQogICAJCQlmb3IodmFyIGkgPTAsIGxlbiA9IGRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXsNCiAgIAkJCSAgICB0cnl7DQogICAgCQkgICAgICAgIHRoaXMuY2FjaGVTdHlsZVNoZWV0KGRzW2ldKTsNCiAgICAJCSAgICB9Y2F0Y2goZSl7fSANCgkgICAgICAgIH0NCiAgIAkJfQ0KICAgCQlyZXR1cm4gcnVsZXM7DQogICAJfSwNCiAgIAkNCiAgIAkNCiAgIGdldFJ1bGUgOiBmdW5jdGlvbihzZWxlY3RvciwgcmVmcmVzaENhY2hlKXsNCiAgIAkJdmFyIHJzID0gdGhpcy5nZXRSdWxlcyhyZWZyZXNoQ2FjaGUpOw0KICAgCQlpZighKHNlbGVjdG9yIGluc3RhbmNlb2YgQXJyYXkpKXsNCiAgIAkJICAgIHJldHVybiByc1tzZWxlY3Rvcl07DQogICAJCX0NCiAgIAkJZm9yKHZhciBpID0gMDsgaSA8IHNlbGVjdG9yLmxlbmd0aDsgaSsrKXsNCgkJCWlmKHJzW3NlbGVjdG9yW2ldXSl7DQoJCQkJcmV0dXJuIHJzW3NlbGVjdG9yW2ldXTsNCgkJCX0NCgkJfQ0KCQlyZXR1cm4gbnVsbDsNCiAgIAl9LA0KICAgCQ0KICAgCQ0KICAgCQ0KICAgdXBkYXRlUnVsZSA6IGZ1bmN0aW9uKHNlbGVjdG9yLCBwcm9wZXJ0eSwgdmFsdWUpew0KICAgCQlpZighKHNlbGVjdG9yIGluc3RhbmNlb2YgQXJyYXkpKXsNCiAgIAkJCXZhciBydWxlID0gdGhpcy5nZXRSdWxlKHNlbGVjdG9yKTsNCiAgIAkJCWlmKHJ1bGUpew0KICAgCQkJCXJ1bGUuc3R5bGVbcHJvcGVydHkucmVwbGFjZShjYW1lbFJlLCBjYW1lbEZuKV0gPSB2YWx1ZTsNCiAgIAkJCQlyZXR1cm4gdHJ1ZTsNCiAgIAkJCX0NCiAgIAkJfWVsc2V7DQogICAJCQlmb3IodmFyIGkgPSAwOyBpIDwgc2VsZWN0b3IubGVuZ3RoOyBpKyspew0KICAgCQkJCWlmKHRoaXMudXBkYXRlUnVsZShzZWxlY3RvcltpXSwgcHJvcGVydHksIHZhbHVlKSl7DQogICAJCQkJCXJldHVybiB0cnVlOw0KICAgCQkJCX0NCiAgIAkJCX0NCiAgIAkJfQ0KICAgCQlyZXR1cm4gZmFsc2U7DQogICAJfQ0KICAgfTsJDQp9KCk7CgpFeHQudXRpbC5DbGlja1JlcGVhdGVyID0gZnVuY3Rpb24oZWwsIGNvbmZpZykKewogICAgdGhpcy5lbCA9IEV4dC5nZXQoZWwpOwogICAgdGhpcy5lbC51bnNlbGVjdGFibGUoKTsKCiAgICBFeHQuYXBwbHkodGhpcywgY29uZmlnKTsKCiAgICB0aGlzLmFkZEV2ZW50cyh7CiAgICAKICAgICAgICAibW91c2Vkb3duIiA6IHRydWUsCiAgICAKICAgICAgICAiY2xpY2siIDogdHJ1ZSwKICAgIAogICAgICAgICJtb3VzZXVwIiA6IHRydWUKICAgIH0pOwoKICAgIHRoaXMuZWwub24oIm1vdXNlZG93biIsIHRoaXMuaGFuZGxlTW91c2VEb3duLCB0aGlzKTsKICAgIGlmKHRoaXMucHJldmVudERlZmF1bHQgfHwgdGhpcy5zdG9wRGVmYXVsdCl7CiAgICAgICAgdGhpcy5lbC5vbigiY2xpY2siLCBmdW5jdGlvbihlKXsKICAgICAgICAgICAgaWYodGhpcy5wcmV2ZW50RGVmYXVsdCl7CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYodGhpcy5zdG9wRGVmYXVsdCl7CiAgICAgICAgICAgICAgICBlLnN0b3BFdmVudCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwgdGhpcyk7CiAgICB9CgogICAgICAgIGlmKHRoaXMuaGFuZGxlcil7CiAgICAgICAgdGhpcy5vbigiY2xpY2siLCB0aGlzLmhhbmRsZXIsICB0aGlzLnNjb3BlIHx8IHRoaXMpOwogICAgfQoKICAgIEV4dC51dGlsLkNsaWNrUmVwZWF0ZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpOwp9OwoKRXh0LmV4dGVuZChFeHQudXRpbC5DbGlja1JlcGVhdGVyLCBFeHQudXRpbC5PYnNlcnZhYmxlLCB7CiAgICBpbnRlcnZhbCA6IDIwLAogICAgZGVsYXk6IDI1MCwKICAgIHByZXZlbnREZWZhdWx0IDogdHJ1ZSwKICAgIHN0b3BEZWZhdWx0IDogZmFsc2UsCiAgICB0aW1lciA6IDAsCgogICAgICAgIGhhbmRsZU1vdXNlRG93biA6IGZ1bmN0aW9uKCl7CiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpOwogICAgICAgIHRoaXMuZWwuYmx1cigpOwogICAgICAgIGlmKHRoaXMucHJlc3NDbGFzcyl7CiAgICAgICAgICAgIHRoaXMuZWwuYWRkQ2xhc3ModGhpcy5wcmVzc0NsYXNzKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5tb3VzZWRvd25UaW1lID0gbmV3IERhdGUoKTsKCiAgICAgICAgRXh0LmdldChkb2N1bWVudCkub24oIm1vdXNldXAiLCB0aGlzLmhhbmRsZU1vdXNlVXAsIHRoaXMpOwogICAgICAgIHRoaXMuZWwub24oIm1vdXNlb3V0IiwgdGhpcy5oYW5kbGVNb3VzZU91dCwgdGhpcyk7CgogICAgICAgIHRoaXMuZmlyZUV2ZW50KCJtb3VzZWRvd24iLCB0aGlzKTsKICAgICAgICB0aGlzLmZpcmVFdmVudCgiY2xpY2siLCB0aGlzKTsKICAgICAgICAKICAgICAgICB0aGlzLnRpbWVyID0gdGhpcy5jbGljay5kZWZlcih0aGlzLmRlbGF5IHx8IHRoaXMuaW50ZXJ2YWwsIHRoaXMpOwogICAgfSwKCiAgICAgICAgY2xpY2sgOiBmdW5jdGlvbigpewogICAgICAgIHRoaXMuZmlyZUV2ZW50KCJjbGljayIsIHRoaXMpOwogICAgICAgIHRoaXMudGltZXIgPSB0aGlzLmNsaWNrLmRlZmVyKHRoaXMuZ2V0SW50ZXJ2YWwoKSwgdGhpcyk7CiAgICB9LAoKICAgICAgICBnZXRJbnRlcnZhbDogZnVuY3Rpb24oKXsKICAgICAgICBpZighdGhpcy5hY2NlbGVyYXRlKXsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJ2YWw7CiAgICAgICAgfQogICAgICAgIHZhciBwcmVzc1RpbWUgPSB0aGlzLm1vdXNlZG93blRpbWUuZ2V0RWxhcHNlZCgpOwogICAgICAgIGlmKHByZXNzVGltZSA8IDUwMCl7CiAgICAgICAgICAgIHJldHVybiA0MDA7CiAgICAgICAgfWVsc2UgaWYocHJlc3NUaW1lIDwgMTcwMCl7CiAgICAgICAgICAgIHJldHVybiAzMjA7CiAgICAgICAgfWVsc2UgaWYocHJlc3NUaW1lIDwgMjYwMCl7CiAgICAgICAgICAgIHJldHVybiAyNTA7CiAgICAgICAgfWVsc2UgaWYocHJlc3NUaW1lIDwgMzUwMCl7CiAgICAgICAgICAgIHJldHVybiAxODA7CiAgICAgICAgfWVsc2UgaWYocHJlc3NUaW1lIDwgNDQwMCl7CiAgICAgICAgICAgIHJldHVybiAxNDA7CiAgICAgICAgfWVsc2UgaWYocHJlc3NUaW1lIDwgNTMwMCl7CiAgICAgICAgICAgIHJldHVybiA4MDsKICAgICAgICB9ZWxzZSBpZihwcmVzc1RpbWUgPCA2MjAwKXsKICAgICAgICAgICAgcmV0dXJuIDUwOwogICAgICAgIH1lbHNlewogICAgICAgICAgICByZXR1cm4gMTA7CiAgICAgICAgfQogICAgfSwKCiAgICAgICAgaGFuZGxlTW91c2VPdXQgOiBmdW5jdGlvbigpewogICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKTsKICAgICAgICBpZih0aGlzLnByZXNzQ2xhc3MpewogICAgICAgICAgICB0aGlzLmVsLnJlbW92ZUNsYXNzKHRoaXMucHJlc3NDbGFzcyk7CiAgICAgICAgfQogICAgICAgIHRoaXMuZWwub24oIm1vdXNlb3ZlciIsIHRoaXMuaGFuZGxlTW91c2VSZXR1cm4sIHRoaXMpOwogICAgfSwKCiAgICAgICAgaGFuZGxlTW91c2VSZXR1cm4gOiBmdW5jdGlvbigpewogICAgICAgIHRoaXMuZWwudW4oIm1vdXNlb3ZlciIsIHRoaXMuaGFuZGxlTW91c2VSZXR1cm4pOwogICAgICAgIGlmKHRoaXMucHJlc3NDbGFzcyl7CiAgICAgICAgICAgIHRoaXMuZWwuYWRkQ2xhc3ModGhpcy5wcmVzc0NsYXNzKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5jbGljaygpOwogICAgfSwKCiAgICAgICAgaGFuZGxlTW91c2VVcCA6IGZ1bmN0aW9uKCl7CiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpOwogICAgICAgIHRoaXMuZWwudW4oIm1vdXNlb3ZlciIsIHRoaXMuaGFuZGxlTW91c2VSZXR1cm4pOwogICAgICAgIHRoaXMuZWwudW4oIm1vdXNlb3V0IiwgdGhpcy5oYW5kbGVNb3VzZU91dCk7CiAgICAgICAgRXh0LmdldChkb2N1bWVudCkudW4oIm1vdXNldXAiLCB0aGlzLmhhbmRsZU1vdXNlVXApOwogICAgICAgIHRoaXMuZWwucmVtb3ZlQ2xhc3ModGhpcy5wcmVzc0NsYXNzKTsKICAgICAgICB0aGlzLmZpcmVFdmVudCgibW91c2V1cCIsIHRoaXMpOwogICAgfQp9KTsKCkV4dC5LZXlOYXYgPSBmdW5jdGlvbihlbCwgY29uZmlnKXsKICAgIHRoaXMuZWwgPSBFeHQuZ2V0KGVsKTsKICAgIEV4dC5hcHBseSh0aGlzLCBjb25maWcpOwogICAgaWYoIXRoaXMuZGlzYWJsZWQpewogICAgICAgIHRoaXMuZGlzYWJsZWQgPSB0cnVlOwogICAgICAgIHRoaXMuZW5hYmxlKCk7CiAgICB9Cn07CgpFeHQuS2V5TmF2LnByb3RvdHlwZSA9IHsKICAgIAogICAgZGlzYWJsZWQgOiBmYWxzZSwKICAgIAogICAgZGVmYXVsdEV2ZW50QWN0aW9uOiAic3RvcEV2ZW50IiwKICAgIAogICAgZm9yY2VLZXlEb3duIDogZmFsc2UsCgogICAgICAgIHByZXBhcmVFdmVudCA6IGZ1bmN0aW9uKGUpewogICAgICAgIHZhciBrID0gZS5nZXRLZXkoKTsKICAgICAgICB2YXIgaCA9IHRoaXMua2V5VG9IYW5kbGVyW2tdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKEV4dC5pc1NhZmFyaSAmJiBoICYmIGsgPj0gMzcgJiYgayA8PSA0MCl7CiAgICAgICAgICAgIGUuc3RvcEV2ZW50KCk7CiAgICAgICAgfQogICAgfSwKCiAgICAgICAgcmVsYXkgOiBmdW5jdGlvbihlKXsKICAgICAgICB2YXIgayA9IGUuZ2V0S2V5KCk7CiAgICAgICAgdmFyIGggPSB0aGlzLmtleVRvSGFuZGxlcltrXTsKICAgICAgICBpZihoICYmIHRoaXNbaF0pewogICAgICAgICAgICBpZih0aGlzLmRvUmVsYXkoZSwgdGhpc1toXSwgaCkgIT09IHRydWUpewogICAgICAgICAgICAgICAgZVt0aGlzLmRlZmF1bHRFdmVudEFjdGlvbl0oKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0sCgogICAgICAgIGRvUmVsYXkgOiBmdW5jdGlvbihlLCBoLCBobmFtZSl7CiAgICAgICAgcmV0dXJuIGguY2FsbCh0aGlzLnNjb3BlIHx8IHRoaXMsIGUpOwogICAgfSwKCiAgICAgICAgZW50ZXIgOiBmYWxzZSwKICAgIGxlZnQgOiBmYWxzZSwKICAgIHJpZ2h0IDogZmFsc2UsCiAgICB1cCA6IGZhbHNlLAogICAgZG93biA6IGZhbHNlLAogICAgdGFiIDogZmFsc2UsCiAgICBlc2MgOiBmYWxzZSwKICAgIHBhZ2VVcCA6IGZhbHNlLAogICAgcGFnZURvd24gOiBmYWxzZSwKICAgIGRlbCA6IGZhbHNlLAogICAgaG9tZSA6IGZhbHNlLAogICAgZW5kIDogZmFsc2UsCgogICAgICAgIGtleVRvSGFuZGxlciA6IHsKICAgICAgICAzNyA6ICJsZWZ0IiwKICAgICAgICAzOSA6ICJyaWdodCIsCiAgICAgICAgMzggOiAidXAiLAogICAgICAgIDQwIDogImRvd24iLAogICAgICAgIDMzIDogInBhZ2VVcCIsCiAgICAgICAgMzQgOiAicGFnZURvd24iLAogICAgICAgIDQ2IDogImRlbCIsCiAgICAgICAgMzYgOiAiaG9tZSIsCiAgICAgICAgMzUgOiAiZW5kIiwKICAgICAgICAxMyA6ICJlbnRlciIsCiAgICAgICAgMjcgOiAiZXNjIiwKICAgICAgICA5ICA6ICJ0YWIiCiAgICB9LAoKCQoJZW5hYmxlOiBmdW5jdGlvbigpewoJCWlmKHRoaXMuZGlzYWJsZWQpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmZvcmNlS2V5RG93biB8fCBFeHQuaXNJRSB8fCBFeHQuaXNBaXIpewogICAgICAgICAgICAgICAgdGhpcy5lbC5vbigia2V5ZG93biIsIHRoaXMucmVsYXksICB0aGlzKTsKICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICB0aGlzLmVsLm9uKCJrZXlkb3duIiwgdGhpcy5wcmVwYXJlRXZlbnQsICB0aGlzKTsKICAgICAgICAgICAgICAgIHRoaXMuZWwub24oImtleXByZXNzIiwgdGhpcy5yZWxheSwgIHRoaXMpOwogICAgICAgICAgICB9CgkJICAgIHRoaXMuZGlzYWJsZWQgPSBmYWxzZTsKCQl9Cgl9LAoKCQoJZGlzYWJsZTogZnVuY3Rpb24oKXsKCQlpZighdGhpcy5kaXNhYmxlZCl7CgkJICAgIGlmKHRoaXMuZm9yY2VLZXlEb3duIHx8IEV4dC5pc0lFIHx8IEV4dC5pc0Fpcil7CiAgICAgICAgICAgICAgICB0aGlzLmVsLnVuKCJrZXlkb3duIiwgdGhpcy5yZWxheSk7CiAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgdGhpcy5lbC51bigia2V5ZG93biIsIHRoaXMucHJlcGFyZUV2ZW50KTsKICAgICAgICAgICAgICAgIHRoaXMuZWwudW4oImtleXByZXNzIiwgdGhpcy5yZWxheSk7CiAgICAgICAgICAgIH0KCQkgICAgdGhpcy5kaXNhYmxlZCA9IHRydWU7CgkJfQoJfQp9OwoNCkV4dC5LZXlNYXAgPSBmdW5jdGlvbihlbCwgY29uZmlnLCBldmVudE5hbWUpew0KICAgIHRoaXMuZWwgID0gRXh0LmdldChlbCk7DQogICAgdGhpcy5ldmVudE5hbWUgPSBldmVudE5hbWUgfHwgImtleWRvd24iOw0KICAgIHRoaXMuYmluZGluZ3MgPSBbXTsNCiAgICBpZihjb25maWcpew0KICAgICAgICB0aGlzLmFkZEJpbmRpbmcoY29uZmlnKTsNCiAgICB9DQogICAgdGhpcy5lbmFibGUoKTsNCn07DQoNCkV4dC5LZXlNYXAucHJvdG90eXBlID0gew0KICAgIA0KICAgIHN0b3BFdmVudCA6IGZhbHNlLA0KDQogICAgDQoJYWRkQmluZGluZyA6IGZ1bmN0aW9uKGNvbmZpZyl7DQogICAgICAgIGlmKGNvbmZpZyBpbnN0YW5jZW9mIEFycmF5KXsNCiAgICAgICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IGNvbmZpZy5sZW5ndGg7IGkgPCBsZW47IGkrKyl7DQogICAgICAgICAgICAgICAgdGhpcy5hZGRCaW5kaW5nKGNvbmZpZ1tpXSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICAgICAgdmFyIGtleUNvZGUgPSBjb25maWcua2V5LA0KICAgICAgICAgICAgc2hpZnQgPSBjb25maWcuc2hpZnQsIA0KICAgICAgICAgICAgY3RybCA9IGNvbmZpZy5jdHJsLCANCiAgICAgICAgICAgIGFsdCA9IGNvbmZpZy5hbHQsDQogICAgICAgICAgICBmbiA9IGNvbmZpZy5mbiwNCiAgICAgICAgICAgIHNjb3BlID0gY29uZmlnLnNjb3BlOw0KICAgICAgICBpZih0eXBlb2Yga2V5Q29kZSA9PSAic3RyaW5nIil7DQogICAgICAgICAgICB2YXIga3MgPSBbXTsNCiAgICAgICAgICAgIHZhciBrZXlTdHJpbmcgPSBrZXlDb2RlLnRvVXBwZXJDYXNlKCk7DQogICAgICAgICAgICBmb3IodmFyIGogPSAwLCBsZW4gPSBrZXlTdHJpbmcubGVuZ3RoOyBqIDwgbGVuOyBqKyspew0KICAgICAgICAgICAgICAgIGtzLnB1c2goa2V5U3RyaW5nLmNoYXJDb2RlQXQoaikpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAga2V5Q29kZSA9IGtzOw0KICAgICAgICB9DQogICAgICAgIHZhciBrZXlBcnJheSA9IGtleUNvZGUgaW5zdGFuY2VvZiBBcnJheTsNCiAgICAgICAgdmFyIGhhbmRsZXIgPSBmdW5jdGlvbihlKXsNCiAgICAgICAgICAgIGlmKCghc2hpZnQgfHwgZS5zaGlmdEtleSkgJiYgKCFjdHJsIHx8IGUuY3RybEtleSkgJiYgICghYWx0IHx8IGUuYWx0S2V5KSl7DQogICAgICAgICAgICAgICAgdmFyIGsgPSBlLmdldEtleSgpOw0KICAgICAgICAgICAgICAgIGlmKGtleUFycmF5KXsNCiAgICAgICAgICAgICAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0ga2V5Q29kZS5sZW5ndGg7IGkgPCBsZW47IGkrKyl7DQogICAgICAgICAgICAgICAgICAgICAgICBpZihrZXlDb2RlW2ldID09IGspew0KICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLnN0b3BFdmVudCl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BFdmVudCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgIGZuLmNhbGwoc2NvcGUgfHwgd2luZG93LCBrLCBlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgICAgIGlmKGsgPT0ga2V5Q29kZSl7DQogICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLnN0b3BFdmVudCl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BFdmVudCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZm4uY2FsbChzY29wZSB8fCB3aW5kb3csIGssIGUpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9Ow0KICAgICAgICB0aGlzLmJpbmRpbmdzLnB1c2goaGFuZGxlcik7ICANCgl9LA0KDQogICAgDQogICAgb24gOiBmdW5jdGlvbihrZXksIGZuLCBzY29wZSl7DQogICAgICAgIHZhciBrZXlDb2RlLCBzaGlmdCwgY3RybCwgYWx0Ow0KICAgICAgICBpZih0eXBlb2Yga2V5ID09ICJvYmplY3QiICYmICEoa2V5IGluc3RhbmNlb2YgQXJyYXkpKXsNCiAgICAgICAgICAgIGtleUNvZGUgPSBrZXkua2V5Ow0KICAgICAgICAgICAgc2hpZnQgPSBrZXkuc2hpZnQ7DQogICAgICAgICAgICBjdHJsID0ga2V5LmN0cmw7DQogICAgICAgICAgICBhbHQgPSBrZXkuYWx0Ow0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIGtleUNvZGUgPSBrZXk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5hZGRCaW5kaW5nKHsNCiAgICAgICAgICAgIGtleToga2V5Q29kZSwNCiAgICAgICAgICAgIHNoaWZ0OiBzaGlmdCwNCiAgICAgICAgICAgIGN0cmw6IGN0cmwsDQogICAgICAgICAgICBhbHQ6IGFsdCwNCiAgICAgICAgICAgIGZuOiBmbiwNCiAgICAgICAgICAgIHNjb3BlOiBzY29wZQ0KICAgICAgICB9KQ0KICAgIH0sDQoNCiAgICAKICAgIGhhbmRsZUtleURvd24gOiBmdW5jdGlvbihlKXsNCgkgICAgaWYodGhpcy5lbmFibGVkKXsgCiAgICAJICAgIHZhciBiID0gdGhpcy5iaW5kaW5nczsNCiAgICAJICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IGIubGVuZ3RoOyBpIDwgbGVuOyBpKyspew0KICAgIAkgICAgICAgIGJbaV0uY2FsbCh0aGlzLCBlKTsNCiAgICAJICAgIH0NCgkgICAgfQ0KCX0sDQoJDQoJDQoJaXNFbmFibGVkIDogZnVuY3Rpb24oKXsNCgkgICAgcmV0dXJuIHRoaXMuZW5hYmxlZDsgIA0KCX0sDQoJDQoJDQoJZW5hYmxlOiBmdW5jdGlvbigpew0KCQlpZighdGhpcy5lbmFibGVkKXsNCgkJICAgIHRoaXMuZWwub24odGhpcy5ldmVudE5hbWUsIHRoaXMuaGFuZGxlS2V5RG93biwgdGhpcyk7DQoJCSAgICB0aGlzLmVuYWJsZWQgPSB0cnVlOw0KCQl9DQoJfSwNCg0KCQ0KCWRpc2FibGU6IGZ1bmN0aW9uKCl7DQoJCWlmKHRoaXMuZW5hYmxlZCl7DQoJCSAgICB0aGlzLmVsLnJlbW92ZUxpc3RlbmVyKHRoaXMuZXZlbnROYW1lLCB0aGlzLmhhbmRsZUtleURvd24sIHRoaXMpOw0KCQkgICAgdGhpcy5lbmFibGVkID0gZmFsc2U7DQoJCX0NCgl9DQp9OwoKRXh0LnV0aWwuVGV4dE1ldHJpY3MgPSBmdW5jdGlvbigpewogICAgdmFyIHNoYXJlZDsKICAgIHJldHVybiB7CiAgICAgICAgCiAgICAgICAgbWVhc3VyZSA6IGZ1bmN0aW9uKGVsLCB0ZXh0LCBmaXhlZFdpZHRoKXsKICAgICAgICAgICAgaWYoIXNoYXJlZCl7CiAgICAgICAgICAgICAgICBzaGFyZWQgPSBFeHQudXRpbC5UZXh0TWV0cmljcy5JbnN0YW5jZShlbCwgZml4ZWRXaWR0aCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2hhcmVkLmJpbmQoZWwpOwogICAgICAgICAgICBzaGFyZWQuc2V0Rml4ZWRXaWR0aChmaXhlZFdpZHRoIHx8ICdhdXRvJyk7CiAgICAgICAgICAgIHJldHVybiBzaGFyZWQuZ2V0U2l6ZSh0ZXh0KTsKICAgICAgICB9LAoKICAgICAgICAKICAgICAgICBjcmVhdGVJbnN0YW5jZSA6IGZ1bmN0aW9uKGVsLCBmaXhlZFdpZHRoKXsKICAgICAgICAgICAgcmV0dXJuIEV4dC51dGlsLlRleHRNZXRyaWNzLkluc3RhbmNlKGVsLCBmaXhlZFdpZHRoKTsKICAgICAgICB9CiAgICB9Owp9KCk7CgpFeHQudXRpbC5UZXh0TWV0cmljcy5JbnN0YW5jZSA9IGZ1bmN0aW9uKGJpbmRUbywgZml4ZWRXaWR0aCl7CiAgICB2YXIgbWwgPSBuZXcgRXh0LkVsZW1lbnQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpOwogICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChtbC5kb20pOwogICAgbWwucG9zaXRpb24oJ2Fic29sdXRlJyk7CiAgICBtbC5zZXRMZWZ0VG9wKC0xMDAwLCAtMTAwMCk7CiAgICBtbC5oaWRlKCk7CgogICAgaWYoZml4ZWRXaWR0aCl7CiAgICAgICAgbWwuc2V0V2lkdGgoZml4ZWRXaWR0aCk7CiAgICB9CgogICAgdmFyIGluc3RhbmNlID0gewogICAgICAgIAogICAgICAgIGdldFNpemUgOiBmdW5jdGlvbih0ZXh0KXsKICAgICAgICAgICAgbWwudXBkYXRlKHRleHQpOwogICAgICAgICAgICB2YXIgcyA9IG1sLmdldFNpemUoKTsKICAgICAgICAgICAgbWwudXBkYXRlKCcnKTsKICAgICAgICAgICAgcmV0dXJuIHM7CiAgICAgICAgfSwKCiAgICAgICAgCiAgICAgICAgYmluZCA6IGZ1bmN0aW9uKGVsKXsKICAgICAgICAgICAgbWwuc2V0U3R5bGUoCiAgICAgICAgICAgICAgICBFeHQuZmx5KGVsKS5nZXRTdHlsZXMoJ2ZvbnQtc2l6ZScsJ2ZvbnQtc3R5bGUnLCAnZm9udC13ZWlnaHQnLCAnZm9udC1mYW1pbHknLCdsaW5lLWhlaWdodCcpCiAgICAgICAgICAgICk7CiAgICAgICAgfSwKCiAgICAgICAgCiAgICAgICAgc2V0Rml4ZWRXaWR0aCA6IGZ1bmN0aW9uKHdpZHRoKXsKICAgICAgICAgICAgbWwuc2V0V2lkdGgod2lkdGgpOwogICAgICAgIH0sCgogICAgICAgIAogICAgICAgIGdldFdpZHRoIDogZnVuY3Rpb24odGV4dCl7CiAgICAgICAgICAgIG1sLmRvbS5zdHlsZS53aWR0aCA9ICdhdXRvJzsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2l6ZSh0ZXh0KS53aWR0aDsKICAgICAgICB9LAoKICAgICAgICAKICAgICAgICBnZXRIZWlnaHQgOiBmdW5jdGlvbih0ZXh0KXsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2l6ZSh0ZXh0KS5oZWlnaHQ7CiAgICAgICAgfQogICAgfTsKCiAgICBpbnN0YW5jZS5iaW5kKGJpbmRUbyk7CgogICAgcmV0dXJuIGluc3RhbmNlOwp9OwoKRXh0LkVsZW1lbnQubWVhc3VyZVRleHQgPSBFeHQudXRpbC5UZXh0TWV0cmljcy5tZWFzdXJlOwoNCkV4dC5zdGF0ZS5Qcm92aWRlciA9IGZ1bmN0aW9uKCl7DQogICAgDQogICAgdGhpcy5hZGRFdmVudHMoew0KICAgICAgICAic3RhdGVjaGFuZ2UiOiB0cnVlDQogICAgfSk7DQogICAgdGhpcy5zdGF0ZSA9IHt9Ow0KICAgIEV4dC5zdGF0ZS5Qcm92aWRlci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7DQp9Ow0KRXh0LmV4dGVuZChFeHQuc3RhdGUuUHJvdmlkZXIsIEV4dC51dGlsLk9ic2VydmFibGUsIHsNCiAgICANCiAgICBnZXQgOiBmdW5jdGlvbihuYW1lLCBkZWZhdWx0VmFsdWUpew0KICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMuc3RhdGVbbmFtZV0gPT0gInVuZGVmaW5lZCIgPw0KICAgICAgICAgICAgZGVmYXVsdFZhbHVlIDogdGhpcy5zdGF0ZVtuYW1lXTsNCiAgICB9LA0KICAgIA0KICAgIA0KICAgIGNsZWFyIDogZnVuY3Rpb24obmFtZSl7DQogICAgICAgIGRlbGV0ZSB0aGlzLnN0YXRlW25hbWVdOw0KICAgICAgICB0aGlzLmZpcmVFdmVudCgic3RhdGVjaGFuZ2UiLCB0aGlzLCBuYW1lLCBudWxsKTsNCiAgICB9LA0KICAgIA0KICAgIA0KICAgIHNldCA6IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKXsNCiAgICAgICAgdGhpcy5zdGF0ZVtuYW1lXSA9IHZhbHVlOw0KICAgICAgICB0aGlzLmZpcmVFdmVudCgic3RhdGVjaGFuZ2UiLCB0aGlzLCBuYW1lLCB2YWx1ZSk7DQogICAgfSwNCiAgICANCiAgICANCiAgICBkZWNvZGVWYWx1ZSA6IGZ1bmN0aW9uKGNvb2tpZSl7DQogICAgICAgIHZhciByZSA9IC9eKGF8bnxkfGJ8c3xvKVw6KC4qKSQvOw0KICAgICAgICB2YXIgbWF0Y2hlcyA9IHJlLmV4ZWModW5lc2NhcGUoY29va2llKSk7DQogICAgICAgIGlmKCFtYXRjaGVzIHx8ICFtYXRjaGVzWzFdKSByZXR1cm47IAogICAgICAgIHZhciB0eXBlID0gbWF0Y2hlc1sxXTsNCiAgICAgICAgdmFyIHYgPSBtYXRjaGVzWzJdOw0KICAgICAgICBzd2l0Y2godHlwZSl7DQogICAgICAgICAgICBjYXNlICJuIjoNCiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdCh2KTsNCiAgICAgICAgICAgIGNhc2UgImQiOg0KICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShEYXRlLnBhcnNlKHYpKTsNCiAgICAgICAgICAgIGNhc2UgImIiOg0KICAgICAgICAgICAgICAgIHJldHVybiAodiA9PSAiMSIpOw0KICAgICAgICAgICAgY2FzZSAiYSI6DQogICAgICAgICAgICAgICAgdmFyIGFsbCA9IFtdOw0KICAgICAgICAgICAgICAgIHZhciB2YWx1ZXMgPSB2LnNwbGl0KCJeIik7DQogICAgICAgICAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gdmFsdWVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXsNCiAgICAgICAgICAgICAgICAgICAgYWxsLnB1c2godGhpcy5kZWNvZGVWYWx1ZSh2YWx1ZXNbaV0pKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuIGFsbDsNCiAgICAgICAgICAgY2FzZSAibyI6DQogICAgICAgICAgICAgICAgdmFyIGFsbCA9IHt9Ow0KICAgICAgICAgICAgICAgIHZhciB2YWx1ZXMgPSB2LnNwbGl0KCJeIik7DQogICAgICAgICAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gdmFsdWVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGt2ID0gdmFsdWVzW2ldLnNwbGl0KCI9Iik7DQogICAgICAgICAgICAgICAgICAgIGFsbFtrdlswXV0gPSB0aGlzLmRlY29kZVZhbHVlKGt2WzFdKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuIGFsbDsNCiAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICByZXR1cm4gdjsNCiAgICAgICAgfQ0KICAgIH0sDQogICAgDQogICAgDQogICAgZW5jb2RlVmFsdWUgOiBmdW5jdGlvbih2KXsNCiAgICAgICAgdmFyIGVuYzsNCiAgICAgICAgaWYodHlwZW9mIHYgPT0gIm51bWJlciIpew0KICAgICAgICAgICAgZW5jID0gIm46IiArIHY7DQogICAgICAgIH1lbHNlIGlmKHR5cGVvZiB2ID09ICJib29sZWFuIil7DQogICAgICAgICAgICBlbmMgPSAiYjoiICsgKHYgPyAiMSIgOiAiMCIpOw0KICAgICAgICB9ZWxzZSBpZih2IGluc3RhbmNlb2YgRGF0ZSl7DQogICAgICAgICAgICBlbmMgPSAiZDoiICsgdi50b0dNVFN0cmluZygpOw0KICAgICAgICB9ZWxzZSBpZih2IGluc3RhbmNlb2YgQXJyYXkpew0KICAgICAgICAgICAgdmFyIGZsYXQgPSAiIjsNCiAgICAgICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IHYubGVuZ3RoOyBpIDwgbGVuOyBpKyspew0KICAgICAgICAgICAgICAgIGZsYXQgKz0gdGhpcy5lbmNvZGVWYWx1ZSh2W2ldKTsNCiAgICAgICAgICAgICAgICBpZihpICE9IGxlbi0xKSBmbGF0ICs9ICJeIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVuYyA9ICJhOiIgKyBmbGF0Ow0KICAgICAgICB9ZWxzZSBpZih0eXBlb2YgdiA9PSAib2JqZWN0Iil7DQogICAgICAgICAgICB2YXIgZmxhdCA9ICIiOw0KICAgICAgICAgICAgZm9yKHZhciBrZXkgaW4gdil7DQogICAgICAgICAgICAgICAgaWYodHlwZW9mIHZba2V5XSAhPSAiZnVuY3Rpb24iKXsNCiAgICAgICAgICAgICAgICAgICAgZmxhdCArPSBrZXkgKyAiPSIgKyB0aGlzLmVuY29kZVZhbHVlKHZba2V5XSkgKyAiXiI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZW5jID0gIm86IiArIGZsYXQuc3Vic3RyaW5nKDAsIGZsYXQubGVuZ3RoLTEpOw0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIGVuYyA9ICJzOiIgKyB2Ow0KICAgICAgICB9DQogICAgICAgIHJldHVybiBlc2NhcGUoZW5jKTsgICAgICAgIA0KICAgIH0NCn0pOw0KDQoNCkV4dC5zdGF0ZS5NYW5hZ2VyID0gZnVuY3Rpb24oKXsNCiAgICB2YXIgcHJvdmlkZXIgPSBuZXcgRXh0LnN0YXRlLlByb3ZpZGVyKCk7DQogICAgDQogICAgcmV0dXJuIHsNCiAgICAgICAgDQogICAgICAgIHNldFByb3ZpZGVyIDogZnVuY3Rpb24oc3RhdGVQcm92aWRlcil7DQogICAgICAgICAgICBwcm92aWRlciA9IHN0YXRlUHJvdmlkZXI7DQogICAgICAgIH0sDQogICAgICAgIA0KICAgICAgICANCiAgICAgICAgZ2V0IDogZnVuY3Rpb24oa2V5LCBkZWZhdWx0VmFsdWUpew0KICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyLmdldChrZXksIGRlZmF1bHRWYWx1ZSk7DQogICAgICAgIH0sDQogICAgICAgIA0KICAgICAgICANCiAgICAgICAgIHNldCA6IGZ1bmN0aW9uKGtleSwgdmFsdWUpew0KICAgICAgICAgICAgcHJvdmlkZXIuc2V0KGtleSwgdmFsdWUpOw0KICAgICAgICB9LA0KICAgICAgICANCiAgICAgICAgDQogICAgICAgIGNsZWFyIDogZnVuY3Rpb24oa2V5KXsNCiAgICAgICAgICAgIHByb3ZpZGVyLmNsZWFyKGtleSk7DQogICAgICAgIH0sDQogICAgICAgIA0KICAgICAgICANCiAgICAgICAgZ2V0UHJvdmlkZXIgOiBmdW5jdGlvbigpew0KICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyOw0KICAgICAgICB9DQogICAgfTsNCn0oKTsNCg0KDQpFeHQuc3RhdGUuQ29va2llUHJvdmlkZXIgPSBmdW5jdGlvbihjb25maWcpew0KICAgIEV4dC5zdGF0ZS5Db29raWVQcm92aWRlci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7DQogICAgdGhpcy5wYXRoID0gIi8iOw0KICAgIHRoaXMuZXhwaXJlcyA9IG5ldyBEYXRlKG5ldyBEYXRlKCkuZ2V0VGltZSgpKygxMDAwKjYwKjYwKjI0KjcpKTsgCiAgICB0aGlzLmRvbWFpbiA9IG51bGw7DQogICAgdGhpcy5zZWN1cmUgPSBmYWxzZTsNCiAgICBFeHQuYXBwbHkodGhpcywgY29uZmlnKTsNCiAgICB0aGlzLnN0YXRlID0gdGhpcy5yZWFkQ29va2llcygpOw0KfTsNCg0KRXh0LmV4dGVuZChFeHQuc3RhdGUuQ29va2llUHJvdmlkZXIsIEV4dC5zdGF0ZS5Qcm92aWRlciwgew0KICAgIAogICAgc2V0IDogZnVuY3Rpb24obmFtZSwgdmFsdWUpew0KICAgICAgICBpZih0eXBlb2YgdmFsdWUgPT0gInVuZGVmaW5lZCIgfHwgdmFsdWUgPT09IG51bGwpew0KICAgICAgICAgICAgdGhpcy5jbGVhcihuYW1lKTsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLnNldENvb2tpZShuYW1lLCB2YWx1ZSk7DQogICAgICAgIEV4dC5zdGF0ZS5Db29raWVQcm92aWRlci5zdXBlcmNsYXNzLnNldC5jYWxsKHRoaXMsIG5hbWUsIHZhbHVlKTsNCiAgICB9LA0KDQogICAgCiAgICBjbGVhciA6IGZ1bmN0aW9uKG5hbWUpew0KICAgICAgICB0aGlzLmNsZWFyQ29va2llKG5hbWUpOw0KICAgICAgICBFeHQuc3RhdGUuQ29va2llUHJvdmlkZXIuc3VwZXJjbGFzcy5jbGVhci5jYWxsKHRoaXMsIG5hbWUpOw0KICAgIH0sDQoNCiAgICAKICAgIHJlYWRDb29raWVzIDogZnVuY3Rpb24oKXsNCiAgICAgICAgdmFyIGNvb2tpZXMgPSB7fTsNCiAgICAgICAgdmFyIGMgPSBkb2N1bWVudC5jb29raWUgKyAiOyI7DQogICAgICAgIHZhciByZSA9IC9ccz8oLio/KT0oLio/KTsvZzsNCiAgICAJdmFyIG1hdGNoZXM7DQogICAgCXdoaWxlKChtYXRjaGVzID0gcmUuZXhlYyhjKSkgIT0gbnVsbCl7DQogICAgICAgICAgICB2YXIgbmFtZSA9IG1hdGNoZXNbMV07DQogICAgICAgICAgICB2YXIgdmFsdWUgPSBtYXRjaGVzWzJdOw0KICAgICAgICAgICAgaWYobmFtZSAmJiBuYW1lLnN1YnN0cmluZygwLDMpID09ICJ5cy0iKXsNCiAgICAgICAgICAgICAgICBjb29raWVzW25hbWUuc3Vic3RyKDMpXSA9IHRoaXMuZGVjb2RlVmFsdWUodmFsdWUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiBjb29raWVzOw0KICAgIH0sDQoNCiAgICAKICAgIHNldENvb2tpZSA6IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKXsNCiAgICAgICAgZG9jdW1lbnQuY29va2llID0gInlzLSIrIG5hbWUgKyAiPSIgKyB0aGlzLmVuY29kZVZhbHVlKHZhbHVlKSArDQogICAgICAgICAgICgodGhpcy5leHBpcmVzID09IG51bGwpID8gIiIgOiAoIjsgZXhwaXJlcz0iICsgdGhpcy5leHBpcmVzLnRvR01UU3RyaW5nKCkpKSArDQogICAgICAgICAgICgodGhpcy5wYXRoID09IG51bGwpID8gIiIgOiAoIjsgcGF0aD0iICsgdGhpcy5wYXRoKSkgKw0KICAgICAgICAgICAoKHRoaXMuZG9tYWluID09IG51bGwpID8gIiIgOiAoIjsgZG9tYWluPSIgKyB0aGlzLmRvbWFpbikpICsNCiAgICAgICAgICAgKCh0aGlzLnNlY3VyZSA9PSB0cnVlKSA/ICI7IHNlY3VyZSIgOiAiIik7DQogICAgfSwNCg0KICAgIAogICAgY2xlYXJDb29raWUgOiBmdW5jdGlvbihuYW1lKXsNCiAgICAgICAgZG9jdW1lbnQuY29va2llID0gInlzLSIgKyBuYW1lICsgIj1udWxsOyBleHBpcmVzPVRodSwgMDEtSmFuLTcwIDAwOjAwOjAxIEdNVCIgKw0KICAgICAgICAgICAoKHRoaXMucGF0aCA9PSBudWxsKSA/ICIiIDogKCI7IHBhdGg9IiArIHRoaXMucGF0aCkpICsNCiAgICAgICAgICAgKCh0aGlzLmRvbWFpbiA9PSBudWxsKSA/ICIiIDogKCI7IGRvbWFpbj0iICsgdGhpcy5kb21haW4pKSArDQogICAgICAgICAgICgodGhpcy5zZWN1cmUgPT0gdHJ1ZSkgPyAiOyBzZWN1cmUiIDogIiIpOw0KICAgIH0NCn0pOw0KCg0KDQooZnVuY3Rpb24oKSB7DQoNCnZhciBFdmVudD1FeHQuRXZlbnRNYW5hZ2VyOw0KdmFyIERvbT1FeHQubGliLkRvbTsNCg0KDQpFeHQuZGQuRHJhZ0Ryb3AgPSBmdW5jdGlvbihpZCwgc0dyb3VwLCBjb25maWcpIHsNCiAgICBpZiAoaWQpIHsNCiAgICAgICAgdGhpcy5pbml0KGlkLCBzR3JvdXAsIGNvbmZpZyk7DQogICAgfQ0KfTsNCg0KRXh0LmRkLkRyYWdEcm9wLnByb3RvdHlwZSA9IHsNCg0KICAgIA0KICAgIGlkOiBudWxsLA0KDQogICAgDQogICAgY29uZmlnOiBudWxsLA0KDQogICAgDQogICAgZHJhZ0VsSWQ6IG51bGwsDQoNCiAgICANCiAgICBoYW5kbGVFbElkOiBudWxsLA0KDQogICAgDQogICAgaW52YWxpZEhhbmRsZVR5cGVzOiBudWxsLA0KDQogICAgDQogICAgaW52YWxpZEhhbmRsZUlkczogbnVsbCwNCg0KICAgIA0KICAgIGludmFsaWRIYW5kbGVDbGFzc2VzOiBudWxsLA0KDQogICAgDQogICAgc3RhcnRQYWdlWDogMCwNCg0KICAgIA0KICAgIHN0YXJ0UGFnZVk6IDAsDQoNCiAgICANCiAgICBncm91cHM6IG51bGwsDQoNCiAgICANCiAgICBsb2NrZWQ6IGZhbHNlLA0KDQogICAgDQogICAgbG9jazogZnVuY3Rpb24oKSB7IHRoaXMubG9ja2VkID0gdHJ1ZTsgfSwNCg0KICAgIA0KICAgIHVubG9jazogZnVuY3Rpb24oKSB7IHRoaXMubG9ja2VkID0gZmFsc2U7IH0sDQoNCiAgICANCiAgICBpc1RhcmdldDogdHJ1ZSwNCg0KICAgIA0KICAgIHBhZGRpbmc6IG51bGwsDQoNCiAgICANCiAgICBfZG9tUmVmOiBudWxsLA0KDQogICAgDQogICAgX195Z0RyYWdEcm9wOiB0cnVlLA0KDQogICAgDQogICAgY29uc3RyYWluWDogZmFsc2UsDQoNCiAgICANCiAgICBjb25zdHJhaW5ZOiBmYWxzZSwNCg0KICAgIA0KICAgIG1pblg6IDAsDQoNCiAgICANCiAgICBtYXhYOiAwLA0KDQogICAgDQogICAgbWluWTogMCwNCg0KICAgIA0KICAgIG1heFk6IDAsDQoNCiAgICANCiAgICBtYWludGFpbk9mZnNldDogZmFsc2UsDQoNCiAgICANCiAgICB4VGlja3M6IG51bGwsDQoNCiAgICANCiAgICB5VGlja3M6IG51bGwsDQoNCiAgICANCiAgICBwcmltYXJ5QnV0dG9uT25seTogdHJ1ZSwNCg0KICAgIA0KICAgIGF2YWlsYWJsZTogZmFsc2UsDQoNCiAgICANCiAgICBoYXNPdXRlckhhbmRsZXM6IGZhbHNlLA0KDQogICAgDQogICAgYjRTdGFydERyYWc6IGZ1bmN0aW9uKHgsIHkpIHsgfSwNCg0KICAgIA0KICAgIHN0YXJ0RHJhZzogZnVuY3Rpb24oeCwgeSkgeyAgfSwNCg0KICAgIA0KICAgIGI0RHJhZzogZnVuY3Rpb24oZSkgeyB9LA0KDQogICAgDQogICAgb25EcmFnOiBmdW5jdGlvbihlKSB7ICB9LA0KDQogICAgDQogICAgb25EcmFnRW50ZXI6IGZ1bmN0aW9uKGUsIGlkKSB7ICB9LA0KDQogICAgDQogICAgYjREcmFnT3ZlcjogZnVuY3Rpb24oZSkgeyB9LA0KDQogICAgDQogICAgb25EcmFnT3ZlcjogZnVuY3Rpb24oZSwgaWQpIHsgIH0sDQoNCiAgICANCiAgICBiNERyYWdPdXQ6IGZ1bmN0aW9uKGUpIHsgfSwNCg0KICAgIA0KICAgIG9uRHJhZ091dDogZnVuY3Rpb24oZSwgaWQpIHsgIH0sDQoNCiAgICANCiAgICBiNERyYWdEcm9wOiBmdW5jdGlvbihlKSB7IH0sDQoNCiAgICANCiAgICBvbkRyYWdEcm9wOiBmdW5jdGlvbihlLCBpZCkgeyAgfSwNCg0KICAgIA0KICAgIG9uSW52YWxpZERyb3A6IGZ1bmN0aW9uKGUpIHsgIH0sDQoNCiAgICANCiAgICBiNEVuZERyYWc6IGZ1bmN0aW9uKGUpIHsgfSwNCg0KICAgIA0KICAgIGVuZERyYWc6IGZ1bmN0aW9uKGUpIHsgIH0sDQoNCiAgICANCiAgICBiNE1vdXNlRG93bjogZnVuY3Rpb24oZSkgeyAgfSwNCg0KICAgIA0KICAgIG9uTW91c2VEb3duOiBmdW5jdGlvbihlKSB7ICB9LA0KDQogICAgDQogICAgb25Nb3VzZVVwOiBmdW5jdGlvbihlKSB7ICB9LA0KDQogICAgDQogICAgb25BdmFpbGFibGU6IGZ1bmN0aW9uICgpIHsNCiAgICB9LA0KDQogICAgDQogICAgZGVmYXVsdFBhZGRpbmcgOiB7bGVmdDowLCByaWdodDowLCB0b3A6MCwgYm90dG9tOjB9LA0KDQogICAgDQogICAgY29uc3RyYWluVG8gOiBmdW5jdGlvbihjb25zdHJhaW5UbywgcGFkLCBpbkNvbnRlbnQpew0KICAgICAgICBpZih0eXBlb2YgcGFkID09ICJudW1iZXIiKXsNCiAgICAgICAgICAgIHBhZCA9IHtsZWZ0OiBwYWQsIHJpZ2h0OnBhZCwgdG9wOnBhZCwgYm90dG9tOnBhZH07DQogICAgICAgIH0NCiAgICAgICAgcGFkID0gcGFkIHx8IHRoaXMuZGVmYXVsdFBhZGRpbmc7DQogICAgICAgIHZhciBiID0gRXh0LmdldCh0aGlzLmdldEVsKCkpLmdldEJveCgpOw0KICAgICAgICB2YXIgY2UgPSBFeHQuZ2V0KGNvbnN0cmFpblRvKTsNCiAgICAgICAgdmFyIHMgPSBjZS5nZXRTY3JvbGwoKTsNCiAgICAgICAgdmFyIGMsIGNkID0gY2UuZG9tOw0KICAgICAgICBpZihjZCA9PSBkb2N1bWVudC5ib2R5KXsNCiAgICAgICAgICAgIGMgPSB7IHg6IHMubGVmdCwgeTogcy50b3AsIHdpZHRoOiBFeHQubGliLkRvbS5nZXRWaWV3V2lkdGgoKSwgaGVpZ2h0OiBFeHQubGliLkRvbS5nZXRWaWV3SGVpZ2h0KCl9Ow0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIHh5ID0gY2UuZ2V0WFkoKTsNCiAgICAgICAgICAgIGMgPSB7eCA6IHh5WzBdK3MubGVmdCwgeTogeHlbMV0rcy50b3AsIHdpZHRoOiBjZC5jbGllbnRXaWR0aCwgaGVpZ2h0OiBjZC5jbGllbnRIZWlnaHR9Ow0KICAgICAgICB9DQoNCg0KICAgICAgICB2YXIgdG9wU3BhY2UgPSBiLnkgLSBjLnk7DQogICAgICAgIHZhciBsZWZ0U3BhY2UgPSBiLnggLSBjLng7DQoNCiAgICAgICAgdGhpcy5yZXNldENvbnN0cmFpbnRzKCk7DQogICAgICAgIHRoaXMuc2V0WENvbnN0cmFpbnQobGVmdFNwYWNlIC0gKHBhZC5sZWZ0fHwwKSwgCiAgICAgICAgICAgICAgICBjLndpZHRoIC0gbGVmdFNwYWNlIC0gYi53aWR0aCAtIChwYWQucmlnaHR8fDApIAogICAgICAgICk7DQogICAgICAgIHRoaXMuc2V0WUNvbnN0cmFpbnQodG9wU3BhY2UgLSAocGFkLnRvcHx8MCksIAogICAgICAgICAgICAgICAgYy5oZWlnaHQgLSB0b3BTcGFjZSAtIGIuaGVpZ2h0IC0gKHBhZC5ib3R0b218fDApIAogICAgICAgICk7DQogICAgfSwNCg0KICAgIA0KICAgIGdldEVsOiBmdW5jdGlvbigpIHsNCiAgICAgICAgaWYgKCF0aGlzLl9kb21SZWYpIHsNCiAgICAgICAgICAgIHRoaXMuX2RvbVJlZiA9IEV4dC5nZXREb20odGhpcy5pZCk7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gdGhpcy5fZG9tUmVmOw0KICAgIH0sDQoNCiAgICANCiAgICBnZXREcmFnRWw6IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gRXh0LmdldERvbSh0aGlzLmRyYWdFbElkKTsNCiAgICB9LA0KDQogICAgDQogICAgaW5pdDogZnVuY3Rpb24oaWQsIHNHcm91cCwgY29uZmlnKSB7DQogICAgICAgIHRoaXMuaW5pdFRhcmdldChpZCwgc0dyb3VwLCBjb25maWcpOw0KICAgICAgICBFdmVudC5vbih0aGlzLmlkLCAibW91c2Vkb3duIiwgdGhpcy5oYW5kbGVNb3VzZURvd24sIHRoaXMpOw0KICAgICAgICAKICAgIH0sDQoNCiAgICANCiAgICBpbml0VGFyZ2V0OiBmdW5jdGlvbihpZCwgc0dyb3VwLCBjb25maWcpIHsNCg0KICAgICAgICAKICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZyB8fCB7fTsNCg0KICAgICAgICAKICAgICAgICB0aGlzLkRETSA9IEV4dC5kZC5ERE07DQogICAgICAgIAogICAgICAgIHRoaXMuZ3JvdXBzID0ge307DQoNCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgaWYgKHR5cGVvZiBpZCAhPT0gInN0cmluZyIpIHsNCiAgICAgICAgICAgIGlkID0gRXh0LmlkKGlkKTsNCiAgICAgICAgfQ0KDQogICAgICAgIAogICAgICAgIHRoaXMuaWQgPSBpZDsNCg0KICAgICAgICAKICAgICAgICB0aGlzLmFkZFRvR3JvdXAoKHNHcm91cCkgPyBzR3JvdXAgOiAiZGVmYXVsdCIpOw0KDQogICAgICAgIAogICAgICAgIAogICAgICAgIHRoaXMuaGFuZGxlRWxJZCA9IGlkOw0KDQogICAgICAgIAogICAgICAgIHRoaXMuc2V0RHJhZ0VsSWQoaWQpOw0KDQogICAgICAgIAogICAgICAgIHRoaXMuaW52YWxpZEhhbmRsZVR5cGVzID0geyBBOiAiQSIgfTsNCiAgICAgICAgdGhpcy5pbnZhbGlkSGFuZGxlSWRzID0ge307DQogICAgICAgIHRoaXMuaW52YWxpZEhhbmRsZUNsYXNzZXMgPSBbXTsNCg0KICAgICAgICB0aGlzLmFwcGx5Q29uZmlnKCk7DQoNCiAgICAgICAgdGhpcy5oYW5kbGVPbkF2YWlsYWJsZSgpOw0KICAgIH0sDQoNCiAgICANCiAgICBhcHBseUNvbmZpZzogZnVuY3Rpb24oKSB7DQoNCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgdGhpcy5wYWRkaW5nICAgICAgICAgICA9IHRoaXMuY29uZmlnLnBhZGRpbmcgfHwgWzAsIDAsIDAsIDBdOw0KICAgICAgICB0aGlzLmlzVGFyZ2V0ICAgICAgICAgID0gKHRoaXMuY29uZmlnLmlzVGFyZ2V0ICE9PSBmYWxzZSk7DQogICAgICAgIHRoaXMubWFpbnRhaW5PZmZzZXQgICAgPSAodGhpcy5jb25maWcubWFpbnRhaW5PZmZzZXQpOw0KICAgICAgICB0aGlzLnByaW1hcnlCdXR0b25Pbmx5ID0gKHRoaXMuY29uZmlnLnByaW1hcnlCdXR0b25Pbmx5ICE9PSBmYWxzZSk7DQoNCiAgICB9LA0KDQogICAgDQogICAgaGFuZGxlT25BdmFpbGFibGU6IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLmF2YWlsYWJsZSA9IHRydWU7DQogICAgICAgIHRoaXMucmVzZXRDb25zdHJhaW50cygpOw0KICAgICAgICB0aGlzLm9uQXZhaWxhYmxlKCk7DQogICAgfSwNCg0KICAgICANCiAgICBzZXRQYWRkaW5nOiBmdW5jdGlvbihpVG9wLCBpUmlnaHQsIGlCb3QsIGlMZWZ0KSB7DQogICAgICAgIAogICAgICAgIGlmICghaVJpZ2h0ICYmIDAgIT09IGlSaWdodCkgew0KICAgICAgICAgICAgdGhpcy5wYWRkaW5nID0gW2lUb3AsIGlUb3AsIGlUb3AsIGlUb3BdOw0KICAgICAgICB9IGVsc2UgaWYgKCFpQm90ICYmIDAgIT09IGlCb3QpIHsNCiAgICAgICAgICAgIHRoaXMucGFkZGluZyA9IFtpVG9wLCBpUmlnaHQsIGlUb3AsIGlSaWdodF07DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB0aGlzLnBhZGRpbmcgPSBbaVRvcCwgaVJpZ2h0LCBpQm90LCBpTGVmdF07DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgDQogICAgc2V0SW5pdFBvc2l0aW9uOiBmdW5jdGlvbihkaWZmWCwgZGlmZlkpIHsNCiAgICAgICAgdmFyIGVsID0gdGhpcy5nZXRFbCgpOw0KDQogICAgICAgIGlmICghdGhpcy5ERE0udmVyaWZ5RWwoZWwpKSB7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgZHggPSBkaWZmWCB8fCAwOw0KICAgICAgICB2YXIgZHkgPSBkaWZmWSB8fCAwOw0KDQogICAgICAgIHZhciBwID0gRG9tLmdldFhZKCBlbCApOw0KDQogICAgICAgIHRoaXMuaW5pdFBhZ2VYID0gcFswXSAtIGR4Ow0KICAgICAgICB0aGlzLmluaXRQYWdlWSA9IHBbMV0gLSBkeTsNCg0KICAgICAgICB0aGlzLmxhc3RQYWdlWCA9IHBbMF07DQogICAgICAgIHRoaXMubGFzdFBhZ2VZID0gcFsxXTsNCg0KDQogICAgICAgIHRoaXMuc2V0U3RhcnRQb3NpdGlvbihwKTsNCiAgICB9LA0KDQogICAgDQogICAgc2V0U3RhcnRQb3NpdGlvbjogZnVuY3Rpb24ocG9zKSB7DQogICAgICAgIHZhciBwID0gcG9zIHx8IERvbS5nZXRYWSggdGhpcy5nZXRFbCgpICk7DQogICAgICAgIHRoaXMuZGVsdGFTZXRYWSA9IG51bGw7DQoNCiAgICAgICAgdGhpcy5zdGFydFBhZ2VYID0gcFswXTsNCiAgICAgICAgdGhpcy5zdGFydFBhZ2VZID0gcFsxXTsNCiAgICB9LA0KDQogICAgDQogICAgYWRkVG9Hcm91cDogZnVuY3Rpb24oc0dyb3VwKSB7DQogICAgICAgIHRoaXMuZ3JvdXBzW3NHcm91cF0gPSB0cnVlOw0KICAgICAgICB0aGlzLkRETS5yZWdEcmFnRHJvcCh0aGlzLCBzR3JvdXApOw0KICAgIH0sDQoNCiAgICANCiAgICByZW1vdmVGcm9tR3JvdXA6IGZ1bmN0aW9uKHNHcm91cCkgew0KICAgICAgICBpZiAodGhpcy5ncm91cHNbc0dyb3VwXSkgew0KICAgICAgICAgICAgZGVsZXRlIHRoaXMuZ3JvdXBzW3NHcm91cF07DQogICAgICAgIH0NCg0KICAgICAgICB0aGlzLkRETS5yZW1vdmVEREZyb21Hcm91cCh0aGlzLCBzR3JvdXApOw0KICAgIH0sDQoNCiAgICANCiAgICBzZXREcmFnRWxJZDogZnVuY3Rpb24oaWQpIHsNCiAgICAgICAgdGhpcy5kcmFnRWxJZCA9IGlkOw0KICAgIH0sDQoNCiAgICANCiAgICBzZXRIYW5kbGVFbElkOiBmdW5jdGlvbihpZCkgew0KICAgICAgICBpZiAodHlwZW9mIGlkICE9PSAic3RyaW5nIikgew0KICAgICAgICAgICAgaWQgPSBFeHQuaWQoaWQpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuaGFuZGxlRWxJZCA9IGlkOw0KICAgICAgICB0aGlzLkRETS5yZWdIYW5kbGUodGhpcy5pZCwgaWQpOw0KICAgIH0sDQoNCiAgICANCiAgICBzZXRPdXRlckhhbmRsZUVsSWQ6IGZ1bmN0aW9uKGlkKSB7DQogICAgICAgIGlmICh0eXBlb2YgaWQgIT09ICJzdHJpbmciKSB7DQogICAgICAgICAgICBpZCA9IEV4dC5pZChpZCk7DQogICAgICAgIH0NCiAgICAgICAgRXZlbnQub24oaWQsICJtb3VzZWRvd24iLA0KICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlTW91c2VEb3duLCB0aGlzKTsNCiAgICAgICAgdGhpcy5zZXRIYW5kbGVFbElkKGlkKTsNCg0KICAgICAgICB0aGlzLmhhc091dGVySGFuZGxlcyA9IHRydWU7DQogICAgfSwNCg0KICAgIA0KICAgIHVucmVnOiBmdW5jdGlvbigpIHsNCiAgICAgICAgRXZlbnQudW4odGhpcy5pZCwgIm1vdXNlZG93biIsDQogICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVNb3VzZURvd24pOw0KICAgICAgICB0aGlzLl9kb21SZWYgPSBudWxsOw0KICAgICAgICB0aGlzLkRETS5fcmVtb3ZlKHRoaXMpOw0KICAgIH0sDQoNCiAgICBkZXN0cm95IDogZnVuY3Rpb24oKXsNCiAgICAgICAgdGhpcy51bnJlZygpOw0KICAgIH0sDQoNCiAgICANCiAgICBpc0xvY2tlZDogZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiAodGhpcy5ERE0uaXNMb2NrZWQoKSB8fCB0aGlzLmxvY2tlZCk7DQogICAgfSwNCg0KICAgIA0KICAgIGhhbmRsZU1vdXNlRG93bjogZnVuY3Rpb24oZSwgb0REKXsNCiAgICAgICAgaWYgKHRoaXMucHJpbWFyeUJ1dHRvbk9ubHkgJiYgZS5idXR0b24gIT0gMCkgew0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHRoaXMuaXNMb2NrZWQoKSkgew0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQoNCiAgICAgICAgdGhpcy5ERE0ucmVmcmVzaENhY2hlKHRoaXMuZ3JvdXBzKTsNCg0KICAgICAgICB2YXIgcHQgPSBuZXcgRXh0LmxpYi5Qb2ludChFeHQubGliLkV2ZW50LmdldFBhZ2VYKGUpLCBFeHQubGliLkV2ZW50LmdldFBhZ2VZKGUpKTsNCiAgICAgICAgaWYgKCF0aGlzLmhhc091dGVySGFuZGxlcyAmJiAhdGhpcy5ERE0uaXNPdmVyVGFyZ2V0KHB0LCB0aGlzKSApICB7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBpZiAodGhpcy5jbGlja1ZhbGlkYXRvcihlKSkgew0KDQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXJ0UG9zaXRpb24oKTsNCg0KDQogICAgICAgICAgICAgICAgdGhpcy5iNE1vdXNlRG93bihlKTsNCiAgICAgICAgICAgICAgICB0aGlzLm9uTW91c2VEb3duKGUpOw0KDQogICAgICAgICAgICAgICAgdGhpcy5ERE0uaGFuZGxlTW91c2VEb3duKGUsIHRoaXMpOw0KDQogICAgICAgICAgICAgICAgdGhpcy5ERE0uc3RvcEV2ZW50KGUpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCg0KDQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgY2xpY2tWYWxpZGF0b3I6IGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgdmFyIHRhcmdldCA9IGUuZ2V0VGFyZ2V0KCk7DQogICAgICAgIHJldHVybiAoIHRoaXMuaXNWYWxpZEhhbmRsZUNoaWxkKHRhcmdldCkgJiYNCiAgICAgICAgICAgICAgICAgICAgKHRoaXMuaWQgPT0gdGhpcy5oYW5kbGVFbElkIHx8DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkRETS5oYW5kbGVXYXNDbGlja2VkKHRhcmdldCwgdGhpcy5pZCkpICk7DQogICAgfSwNCg0KICAgIA0KICAgIGFkZEludmFsaWRIYW5kbGVUeXBlOiBmdW5jdGlvbih0YWdOYW1lKSB7DQogICAgICAgIHZhciB0eXBlID0gdGFnTmFtZS50b1VwcGVyQ2FzZSgpOw0KICAgICAgICB0aGlzLmludmFsaWRIYW5kbGVUeXBlc1t0eXBlXSA9IHR5cGU7DQogICAgfSwNCg0KICAgIA0KICAgIGFkZEludmFsaWRIYW5kbGVJZDogZnVuY3Rpb24oaWQpIHsNCiAgICAgICAgaWYgKHR5cGVvZiBpZCAhPT0gInN0cmluZyIpIHsNCiAgICAgICAgICAgIGlkID0gRXh0LmlkKGlkKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmludmFsaWRIYW5kbGVJZHNbaWRdID0gaWQ7DQogICAgfSwNCg0KICAgIA0KICAgIGFkZEludmFsaWRIYW5kbGVDbGFzczogZnVuY3Rpb24oY3NzQ2xhc3MpIHsNCiAgICAgICAgdGhpcy5pbnZhbGlkSGFuZGxlQ2xhc3Nlcy5wdXNoKGNzc0NsYXNzKTsNCiAgICB9LA0KDQogICAgDQogICAgcmVtb3ZlSW52YWxpZEhhbmRsZVR5cGU6IGZ1bmN0aW9uKHRhZ05hbWUpIHsNCiAgICAgICAgdmFyIHR5cGUgPSB0YWdOYW1lLnRvVXBwZXJDYXNlKCk7DQogICAgICAgIAogICAgICAgIGRlbGV0ZSB0aGlzLmludmFsaWRIYW5kbGVUeXBlc1t0eXBlXTsNCiAgICB9LA0KDQogICAgDQogICAgcmVtb3ZlSW52YWxpZEhhbmRsZUlkOiBmdW5jdGlvbihpZCkgew0KICAgICAgICBpZiAodHlwZW9mIGlkICE9PSAic3RyaW5nIikgew0KICAgICAgICAgICAgaWQgPSBFeHQuaWQoaWQpOw0KICAgICAgICB9DQogICAgICAgIGRlbGV0ZSB0aGlzLmludmFsaWRIYW5kbGVJZHNbaWRdOw0KICAgIH0sDQoNCiAgICANCiAgICByZW1vdmVJbnZhbGlkSGFuZGxlQ2xhc3M6IGZ1bmN0aW9uKGNzc0NsYXNzKSB7DQogICAgICAgIGZvciAodmFyIGk9MCwgbGVuPXRoaXMuaW52YWxpZEhhbmRsZUNsYXNzZXMubGVuZ3RoOyBpPGxlbjsgKytpKSB7DQogICAgICAgICAgICBpZiAodGhpcy5pbnZhbGlkSGFuZGxlQ2xhc3Nlc1tpXSA9PSBjc3NDbGFzcykgew0KICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmludmFsaWRIYW5kbGVDbGFzc2VzW2ldOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIGlzVmFsaWRIYW5kbGVDaGlsZDogZnVuY3Rpb24obm9kZSkgew0KDQogICAgICAgIHZhciB2YWxpZCA9IHRydWU7DQogICAgICAgIAogICAgICAgIHZhciBub2RlTmFtZTsNCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgIG5vZGVOYW1lID0gbm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpOw0KICAgICAgICB9IGNhdGNoKGUpIHsNCiAgICAgICAgICAgIG5vZGVOYW1lID0gbm9kZS5ub2RlTmFtZTsNCiAgICAgICAgfQ0KICAgICAgICB2YWxpZCA9IHZhbGlkICYmICF0aGlzLmludmFsaWRIYW5kbGVUeXBlc1tub2RlTmFtZV07DQogICAgICAgIHZhbGlkID0gdmFsaWQgJiYgIXRoaXMuaW52YWxpZEhhbmRsZUlkc1tub2RlLmlkXTsNCg0KICAgICAgICBmb3IgKHZhciBpPTAsIGxlbj10aGlzLmludmFsaWRIYW5kbGVDbGFzc2VzLmxlbmd0aDsgdmFsaWQgJiYgaTxsZW47ICsraSkgew0KICAgICAgICAgICAgdmFsaWQgPSAhRG9tLmhhc0NsYXNzKG5vZGUsIHRoaXMuaW52YWxpZEhhbmRsZUNsYXNzZXNbaV0pOw0KICAgICAgICB9DQoNCg0KICAgICAgICByZXR1cm4gdmFsaWQ7DQoNCiAgICB9LA0KDQogICAgDQogICAgc2V0WFRpY2tzOiBmdW5jdGlvbihpU3RhcnRYLCBpVGlja1NpemUpIHsNCiAgICAgICAgdGhpcy54VGlja3MgPSBbXTsNCiAgICAgICAgdGhpcy54VGlja1NpemUgPSBpVGlja1NpemU7DQoNCiAgICAgICAgdmFyIHRpY2tNYXAgPSB7fTsNCg0KICAgICAgICBmb3IgKHZhciBpID0gdGhpcy5pbml0UGFnZVg7IGkgPj0gdGhpcy5taW5YOyBpID0gaSAtIGlUaWNrU2l6ZSkgew0KICAgICAgICAgICAgaWYgKCF0aWNrTWFwW2ldKSB7DQogICAgICAgICAgICAgICAgdGhpcy54VGlja3NbdGhpcy54VGlja3MubGVuZ3RoXSA9IGk7DQogICAgICAgICAgICAgICAgdGlja01hcFtpXSA9IHRydWU7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBmb3IgKGkgPSB0aGlzLmluaXRQYWdlWDsgaSA8PSB0aGlzLm1heFg7IGkgPSBpICsgaVRpY2tTaXplKSB7DQogICAgICAgICAgICBpZiAoIXRpY2tNYXBbaV0pIHsNCiAgICAgICAgICAgICAgICB0aGlzLnhUaWNrc1t0aGlzLnhUaWNrcy5sZW5ndGhdID0gaTsNCiAgICAgICAgICAgICAgICB0aWNrTWFwW2ldID0gdHJ1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHRoaXMueFRpY2tzLnNvcnQodGhpcy5ERE0ubnVtZXJpY1NvcnQpIDsNCiAgICB9LA0KDQogICAgDQogICAgc2V0WVRpY2tzOiBmdW5jdGlvbihpU3RhcnRZLCBpVGlja1NpemUpIHsNCiAgICAgICAgdGhpcy55VGlja3MgPSBbXTsNCiAgICAgICAgdGhpcy55VGlja1NpemUgPSBpVGlja1NpemU7DQoNCiAgICAgICAgdmFyIHRpY2tNYXAgPSB7fTsNCg0KICAgICAgICBmb3IgKHZhciBpID0gdGhpcy5pbml0UGFnZVk7IGkgPj0gdGhpcy5taW5ZOyBpID0gaSAtIGlUaWNrU2l6ZSkgew0KICAgICAgICAgICAgaWYgKCF0aWNrTWFwW2ldKSB7DQogICAgICAgICAgICAgICAgdGhpcy55VGlja3NbdGhpcy55VGlja3MubGVuZ3RoXSA9IGk7DQogICAgICAgICAgICAgICAgdGlja01hcFtpXSA9IHRydWU7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBmb3IgKGkgPSB0aGlzLmluaXRQYWdlWTsgaSA8PSB0aGlzLm1heFk7IGkgPSBpICsgaVRpY2tTaXplKSB7DQogICAgICAgICAgICBpZiAoIXRpY2tNYXBbaV0pIHsNCiAgICAgICAgICAgICAgICB0aGlzLnlUaWNrc1t0aGlzLnlUaWNrcy5sZW5ndGhdID0gaTsNCiAgICAgICAgICAgICAgICB0aWNrTWFwW2ldID0gdHJ1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHRoaXMueVRpY2tzLnNvcnQodGhpcy5ERE0ubnVtZXJpY1NvcnQpIDsNCiAgICB9LA0KDQogICAgDQogICAgc2V0WENvbnN0cmFpbnQ6IGZ1bmN0aW9uKGlMZWZ0LCBpUmlnaHQsIGlUaWNrU2l6ZSkgew0KICAgICAgICB0aGlzLmxlZnRDb25zdHJhaW50ID0gaUxlZnQ7DQogICAgICAgIHRoaXMucmlnaHRDb25zdHJhaW50ID0gaVJpZ2h0Ow0KDQogICAgICAgIHRoaXMubWluWCA9IHRoaXMuaW5pdFBhZ2VYIC0gaUxlZnQ7DQogICAgICAgIHRoaXMubWF4WCA9IHRoaXMuaW5pdFBhZ2VYICsgaVJpZ2h0Ow0KICAgICAgICBpZiAoaVRpY2tTaXplKSB7IHRoaXMuc2V0WFRpY2tzKHRoaXMuaW5pdFBhZ2VYLCBpVGlja1NpemUpOyB9DQoNCiAgICAgICAgdGhpcy5jb25zdHJhaW5YID0gdHJ1ZTsNCiAgICB9LA0KDQogICAgDQogICAgY2xlYXJDb25zdHJhaW50czogZnVuY3Rpb24oKSB7DQogICAgICAgIHRoaXMuY29uc3RyYWluWCA9IGZhbHNlOw0KICAgICAgICB0aGlzLmNvbnN0cmFpblkgPSBmYWxzZTsNCiAgICAgICAgdGhpcy5jbGVhclRpY2tzKCk7DQogICAgfSwNCg0KICAgIA0KICAgIGNsZWFyVGlja3M6IGZ1bmN0aW9uKCkgew0KICAgICAgICB0aGlzLnhUaWNrcyA9IG51bGw7DQogICAgICAgIHRoaXMueVRpY2tzID0gbnVsbDsNCiAgICAgICAgdGhpcy54VGlja1NpemUgPSAwOw0KICAgICAgICB0aGlzLnlUaWNrU2l6ZSA9IDA7DQogICAgfSwNCg0KICAgIA0KICAgIHNldFlDb25zdHJhaW50OiBmdW5jdGlvbihpVXAsIGlEb3duLCBpVGlja1NpemUpIHsNCiAgICAgICAgdGhpcy50b3BDb25zdHJhaW50ID0gaVVwOw0KICAgICAgICB0aGlzLmJvdHRvbUNvbnN0cmFpbnQgPSBpRG93bjsNCg0KICAgICAgICB0aGlzLm1pblkgPSB0aGlzLmluaXRQYWdlWSAtIGlVcDsNCiAgICAgICAgdGhpcy5tYXhZID0gdGhpcy5pbml0UGFnZVkgKyBpRG93bjsNCiAgICAgICAgaWYgKGlUaWNrU2l6ZSkgeyB0aGlzLnNldFlUaWNrcyh0aGlzLmluaXRQYWdlWSwgaVRpY2tTaXplKTsgfQ0KDQogICAgICAgIHRoaXMuY29uc3RyYWluWSA9IHRydWU7DQoNCiAgICB9LA0KDQogICAgDQogICAgcmVzZXRDb25zdHJhaW50czogZnVuY3Rpb24oKSB7DQoNCg0KICAgICAgICAKICAgICAgICBpZiAodGhpcy5pbml0UGFnZVggfHwgdGhpcy5pbml0UGFnZVggPT09IDApIHsNCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgZHggPSAodGhpcy5tYWludGFpbk9mZnNldCkgPyB0aGlzLmxhc3RQYWdlWCAtIHRoaXMuaW5pdFBhZ2VYIDogMDsNCiAgICAgICAgICAgIHZhciBkeSA9ICh0aGlzLm1haW50YWluT2Zmc2V0KSA/IHRoaXMubGFzdFBhZ2VZIC0gdGhpcy5pbml0UGFnZVkgOiAwOw0KDQogICAgICAgICAgICB0aGlzLnNldEluaXRQb3NpdGlvbihkeCwgZHkpOw0KDQogICAgICAgIAogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB0aGlzLnNldEluaXRQb3NpdGlvbigpOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHRoaXMuY29uc3RyYWluWCkgew0KICAgICAgICAgICAgdGhpcy5zZXRYQ29uc3RyYWludCggdGhpcy5sZWZ0Q29uc3RyYWludCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmlnaHRDb25zdHJhaW50LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy54VGlja1NpemUgICAgICAgICk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAodGhpcy5jb25zdHJhaW5ZKSB7DQogICAgICAgICAgICB0aGlzLnNldFlDb25zdHJhaW50KCB0aGlzLnRvcENvbnN0cmFpbnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJvdHRvbUNvbnN0cmFpbnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnlUaWNrU2l6ZSAgICAgICAgICk7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgDQogICAgZ2V0VGljazogZnVuY3Rpb24odmFsLCB0aWNrQXJyYXkpIHsNCg0KICAgICAgICBpZiAoIXRpY2tBcnJheSkgew0KICAgICAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gdmFsOw0KICAgICAgICB9IGVsc2UgaWYgKHRpY2tBcnJheVswXSA+PSB2YWwpIHsNCiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuIHRpY2tBcnJheVswXTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGZvciAodmFyIGk9MCwgbGVuPXRpY2tBcnJheS5sZW5ndGg7IGk8bGVuOyArK2kpIHsNCiAgICAgICAgICAgICAgICB2YXIgbmV4dCA9IGkgKyAxOw0KICAgICAgICAgICAgICAgIGlmICh0aWNrQXJyYXlbbmV4dF0gJiYgdGlja0FycmF5W25leHRdID49IHZhbCkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgZGlmZjEgPSB2YWwgLSB0aWNrQXJyYXlbaV07DQogICAgICAgICAgICAgICAgICAgIHZhciBkaWZmMiA9IHRpY2tBcnJheVtuZXh0XSAtIHZhbDsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkaWZmMiA+IGRpZmYxKSA/IHRpY2tBcnJheVtpXSA6IHRpY2tBcnJheVtuZXh0XTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuIHRpY2tBcnJheVt0aWNrQXJyYXkubGVuZ3RoIC0gMV07DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgDQogICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gKCJEcmFnRHJvcCAiICsgdGhpcy5pZCk7DQogICAgfQ0KDQp9Ow0KDQp9KSgpOw0KDQoNCgoKaWYgKCFFeHQuZGQuRHJhZ0Ryb3BNZ3IpIHsNCg0KDQpFeHQuZGQuRHJhZ0Ryb3BNZ3IgPSBmdW5jdGlvbigpIHsNCg0KICAgIHZhciBFdmVudCA9IEV4dC5FdmVudE1hbmFnZXI7DQoNCiAgICByZXR1cm4gew0KDQogICAgICAgIA0KICAgICAgICBpZHM6IHt9LA0KDQogICAgICAgIA0KICAgICAgICBoYW5kbGVJZHM6IHt9LA0KDQogICAgICAgIA0KICAgICAgICBkcmFnQ3VycmVudDogbnVsbCwNCg0KICAgICAgICANCiAgICAgICAgZHJhZ092ZXJzOiB7fSwNCg0KICAgICAgICANCiAgICAgICAgZGVsdGFYOiAwLA0KDQogICAgICAgIA0KICAgICAgICBkZWx0YVk6IDAsDQoNCiAgICAgICAgDQogICAgICAgIHByZXZlbnREZWZhdWx0OiB0cnVlLA0KDQogICAgICAgIA0KICAgICAgICBzdG9wUHJvcGFnYXRpb246IHRydWUsDQoNCiAgICAgICAgDQogICAgICAgIGluaXRhbGl6ZWQ6IGZhbHNlLA0KDQogICAgICAgIA0KICAgICAgICBsb2NrZWQ6IGZhbHNlLA0KDQogICAgICAgIA0KICAgICAgICBpbml0OiBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlOw0KICAgICAgICB9LA0KDQogICAgICAgIA0KICAgICAgICBQT0lOVDogMCwNCg0KICAgICAgICANCiAgICAgICAgSU5URVJTRUNUOiAxLA0KDQogICAgICAgIA0KICAgICAgICBtb2RlOiAwLA0KDQogICAgICAgIA0KICAgICAgICBfZXhlY09uQWxsOiBmdW5jdGlvbihzTWV0aG9kLCBhcmdzKSB7DQogICAgICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMuaWRzKSB7DQogICAgICAgICAgICAgICAgZm9yICh2YXIgaiBpbiB0aGlzLmlkc1tpXSkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgb0REID0gdGhpcy5pZHNbaV1bal07DQogICAgICAgICAgICAgICAgICAgIGlmICghIHRoaXMuaXNUeXBlT2ZERChvREQpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBvRERbc01ldGhvZF0uYXBwbHkob0RELCBhcmdzKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0sDQoNCiAgICAgICAgDQogICAgICAgIF9vbkxvYWQ6IGZ1bmN0aW9uKCkgew0KDQogICAgICAgICAgICB0aGlzLmluaXQoKTsNCg0KDQogICAgICAgICAgICBFdmVudC5vbihkb2N1bWVudCwgIm1vdXNldXAiLCAgIHRoaXMuaGFuZGxlTW91c2VVcCwgdGhpcywgdHJ1ZSk7DQogICAgICAgICAgICBFdmVudC5vbihkb2N1bWVudCwgIm1vdXNlbW92ZSIsIHRoaXMuaGFuZGxlTW91c2VNb3ZlLCB0aGlzLCB0cnVlKTsNCiAgICAgICAgICAgIEV2ZW50Lm9uKHdpbmRvdywgICAidW5sb2FkIiwgICAgdGhpcy5fb25VbmxvYWQsIHRoaXMsIHRydWUpOw0KICAgICAgICAgICAgRXZlbnQub24od2luZG93LCAgICJyZXNpemUiLCAgICB0aGlzLl9vblJlc2l6ZSwgdGhpcywgdHJ1ZSk7DQogICAgICAgICAgICAKDQogICAgICAgIH0sDQoNCiAgICAgICAgDQogICAgICAgIF9vblJlc2l6ZTogZnVuY3Rpb24oZSkgew0KICAgICAgICAgICAgdGhpcy5fZXhlY09uQWxsKCJyZXNldENvbnN0cmFpbnRzIiwgW10pOw0KICAgICAgICB9LA0KDQogICAgICAgIA0KICAgICAgICBsb2NrOiBmdW5jdGlvbigpIHsgdGhpcy5sb2NrZWQgPSB0cnVlOyB9LA0KDQogICAgICAgIA0KICAgICAgICB1bmxvY2s6IGZ1bmN0aW9uKCkgeyB0aGlzLmxvY2tlZCA9IGZhbHNlOyB9LA0KDQogICAgICAgIA0KICAgICAgICBpc0xvY2tlZDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLmxvY2tlZDsgfSwNCg0KICAgICAgICANCiAgICAgICAgbG9jYXRpb25DYWNoZToge30sDQoNCiAgICAgICAgDQogICAgICAgIHVzZUNhY2hlOiB0cnVlLA0KDQogICAgICAgIA0KICAgICAgICBjbGlja1BpeGVsVGhyZXNoOiAzLA0KDQogICAgICAgIA0KICAgICAgICBjbGlja1RpbWVUaHJlc2g6IDM1MCwNCg0KICAgICAgICANCiAgICAgICAgZHJhZ1RocmVzaE1ldDogZmFsc2UsDQoNCiAgICAgICAgDQogICAgICAgIGNsaWNrVGltZW91dDogbnVsbCwNCg0KICAgICAgICANCiAgICAgICAgc3RhcnRYOiAwLA0KDQogICAgICAgIA0KICAgICAgICBzdGFydFk6IDAsDQoNCiAgICAgICAgDQogICAgICAgIHJlZ0RyYWdEcm9wOiBmdW5jdGlvbihvREQsIHNHcm91cCkgew0KICAgICAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxpemVkKSB7IHRoaXMuaW5pdCgpOyB9DQoNCiAgICAgICAgICAgIGlmICghdGhpcy5pZHNbc0dyb3VwXSkgew0KICAgICAgICAgICAgICAgIHRoaXMuaWRzW3NHcm91cF0gPSB7fTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMuaWRzW3NHcm91cF1bb0RELmlkXSA9IG9ERDsNCiAgICAgICAgfSwNCg0KICAgICAgICANCiAgICAgICAgcmVtb3ZlRERGcm9tR3JvdXA6IGZ1bmN0aW9uKG9ERCwgc0dyb3VwKSB7DQogICAgICAgICAgICBpZiAoIXRoaXMuaWRzW3NHcm91cF0pIHsNCiAgICAgICAgICAgICAgICB0aGlzLmlkc1tzR3JvdXBdID0ge307DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHZhciBvYmogPSB0aGlzLmlkc1tzR3JvdXBdOw0KICAgICAgICAgICAgaWYgKG9iaiAmJiBvYmpbb0RELmlkXSkgew0KICAgICAgICAgICAgICAgIGRlbGV0ZSBvYmpbb0RELmlkXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCg0KICAgICAgICANCiAgICAgICAgX3JlbW92ZTogZnVuY3Rpb24ob0REKSB7DQogICAgICAgICAgICBmb3IgKHZhciBnIGluIG9ERC5ncm91cHMpIHsNCiAgICAgICAgICAgICAgICBpZiAoZyAmJiB0aGlzLmlkc1tnXVtvREQuaWRdKSB7DQogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmlkc1tnXVtvREQuaWRdOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmhhbmRsZUlkc1tvREQuaWRdOw0KICAgICAgICB9LA0KDQogICAgICAgIA0KICAgICAgICByZWdIYW5kbGU6IGZ1bmN0aW9uKHNERElkLCBzSGFuZGxlSWQpIHsNCiAgICAgICAgICAgIGlmICghdGhpcy5oYW5kbGVJZHNbc0RESWRdKSB7DQogICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVJZHNbc0RESWRdID0ge307DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLmhhbmRsZUlkc1tzRERJZF1bc0hhbmRsZUlkXSA9IHNIYW5kbGVJZDsNCiAgICAgICAgfSwNCg0KICAgICAgICANCiAgICAgICAgaXNEcmFnRHJvcDogZnVuY3Rpb24oaWQpIHsNCiAgICAgICAgICAgIHJldHVybiAoIHRoaXMuZ2V0RERCeUlkKGlkKSApID8gdHJ1ZSA6IGZhbHNlOw0KICAgICAgICB9LA0KDQogICAgICAgIA0KICAgICAgICBnZXRSZWxhdGVkOiBmdW5jdGlvbihwX29ERCwgYlRhcmdldHNPbmx5KSB7DQogICAgICAgICAgICB2YXIgb0REcyA9IFtdOw0KICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBwX29ERC5ncm91cHMpIHsNCiAgICAgICAgICAgICAgICBmb3IgKGogaW4gdGhpcy5pZHNbaV0pIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGRkID0gdGhpcy5pZHNbaV1bal07DQogICAgICAgICAgICAgICAgICAgIGlmICghIHRoaXMuaXNUeXBlT2ZERChkZCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmICghYlRhcmdldHNPbmx5IHx8IGRkLmlzVGFyZ2V0KSB7DQogICAgICAgICAgICAgICAgICAgICAgICBvRERzW29ERHMubGVuZ3RoXSA9IGRkOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICByZXR1cm4gb0REczsNCiAgICAgICAgfSwNCg0KICAgICAgICANCiAgICAgICAgaXNMZWdhbFRhcmdldDogZnVuY3Rpb24gKG9ERCwgb1RhcmdldEREKSB7DQogICAgICAgICAgICB2YXIgdGFyZ2V0cyA9IHRoaXMuZ2V0UmVsYXRlZChvREQsIHRydWUpOw0KICAgICAgICAgICAgZm9yICh2YXIgaT0wLCBsZW49dGFyZ2V0cy5sZW5ndGg7aTxsZW47KytpKSB7DQogICAgICAgICAgICAgICAgaWYgKHRhcmdldHNbaV0uaWQgPT0gb1RhcmdldERELmlkKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9LA0KDQogICAgICAgIA0KICAgICAgICBpc1R5cGVPZkREOiBmdW5jdGlvbiAob0REKSB7DQogICAgICAgICAgICByZXR1cm4gKG9ERCAmJiBvREQuX195Z0RyYWdEcm9wKTsNCiAgICAgICAgfSwNCg0KICAgICAgICANCiAgICAgICAgaXNIYW5kbGU6IGZ1bmN0aW9uKHNERElkLCBzSGFuZGxlSWQpIHsNCiAgICAgICAgICAgIHJldHVybiAoIHRoaXMuaGFuZGxlSWRzW3NERElkXSAmJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlSWRzW3NERElkXVtzSGFuZGxlSWRdICk7DQogICAgICAgIH0sDQoNCiAgICAgICAgDQogICAgICAgIGdldEREQnlJZDogZnVuY3Rpb24oaWQpIHsNCiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gdGhpcy5pZHMpIHsNCiAgICAgICAgICAgICAgICBpZiAodGhpcy5pZHNbaV1baWRdKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlkc1tpXVtpZF07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgIH0sDQoNCiAgICAgICAgDQogICAgICAgIGhhbmRsZU1vdXNlRG93bjogZnVuY3Rpb24oZSwgb0REKSB7DQogICAgICAgICAgICBpZihFeHQuUXVpY2tUaXBzKXsNCiAgICAgICAgICAgICAgICBFeHQuUXVpY2tUaXBzLmRpc2FibGUoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMuY3VycmVudFRhcmdldCA9IGUuZ2V0VGFyZ2V0KCk7DQoNCiAgICAgICAgICAgIHRoaXMuZHJhZ0N1cnJlbnQgPSBvREQ7DQoNCiAgICAgICAgICAgIHZhciBlbCA9IG9ERC5nZXRFbCgpOw0KDQogICAgICAgICAgICAKICAgICAgICAgICAgdGhpcy5zdGFydFggPSBlLmdldFBhZ2VYKCk7DQogICAgICAgICAgICB0aGlzLnN0YXJ0WSA9IGUuZ2V0UGFnZVkoKTsNCg0KICAgICAgICAgICAgdGhpcy5kZWx0YVggPSB0aGlzLnN0YXJ0WCAtIGVsLm9mZnNldExlZnQ7DQogICAgICAgICAgICB0aGlzLmRlbHRhWSA9IHRoaXMuc3RhcnRZIC0gZWwub2Zmc2V0VG9wOw0KDQogICAgICAgICAgICB0aGlzLmRyYWdUaHJlc2hNZXQgPSBmYWxzZTsNCg0KICAgICAgICAgICAgdGhpcy5jbGlja1RpbWVvdXQgPSBzZXRUaW1lb3V0KA0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBERE0gPSBFeHQuZGQuRERNOw0KICAgICAgICAgICAgICAgICAgICAgICAgRERNLnN0YXJ0RHJhZyhERE0uc3RhcnRYLCBERE0uc3RhcnRZKTsNCiAgICAgICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGlja1RpbWVUaHJlc2ggKTsNCiAgICAgICAgfSwNCg0KICAgICAgICANCiAgICAgICAgc3RhcnREcmFnOiBmdW5jdGlvbih4LCB5KSB7DQogICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5jbGlja1RpbWVvdXQpOw0KICAgICAgICAgICAgaWYgKHRoaXMuZHJhZ0N1cnJlbnQpIHsNCiAgICAgICAgICAgICAgICB0aGlzLmRyYWdDdXJyZW50LmI0U3RhcnREcmFnKHgsIHkpOw0KICAgICAgICAgICAgICAgIHRoaXMuZHJhZ0N1cnJlbnQuc3RhcnREcmFnKHgsIHkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5kcmFnVGhyZXNoTWV0ID0gdHJ1ZTsNCiAgICAgICAgfSwNCg0KICAgICAgICANCiAgICAgICAgaGFuZGxlTW91c2VVcDogZnVuY3Rpb24oZSkgew0KDQogICAgICAgICAgICBpZihFeHQuUXVpY2tUaXBzKXsNCiAgICAgICAgICAgICAgICBFeHQuUXVpY2tUaXBzLmVuYWJsZSgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKCEgdGhpcy5kcmFnQ3VycmVudCkgew0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuY2xpY2tUaW1lb3V0KTsNCg0KICAgICAgICAgICAgaWYgKHRoaXMuZHJhZ1RocmVzaE1ldCkgew0KICAgICAgICAgICAgICAgIHRoaXMuZmlyZUV2ZW50cyhlLCB0cnVlKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHRoaXMuc3RvcERyYWcoZSk7DQoNCiAgICAgICAgICAgIHRoaXMuc3RvcEV2ZW50KGUpOw0KICAgICAgICB9LA0KDQogICAgICAgIA0KICAgICAgICBzdG9wRXZlbnQ6IGZ1bmN0aW9uKGUpew0KICAgICAgICAgICAgaWYodGhpcy5zdG9wUHJvcGFnYXRpb24pIHsNCiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAodGhpcy5wcmV2ZW50RGVmYXVsdCkgew0KICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCg0KICAgICAgICANCiAgICAgICAgc3RvcERyYWc6IGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAodGhpcy5kcmFnQ3VycmVudCkgew0KICAgICAgICAgICAgICAgIGlmICh0aGlzLmRyYWdUaHJlc2hNZXQpIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnQ3VycmVudC5iNEVuZERyYWcoZSk7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhZ0N1cnJlbnQuZW5kRHJhZyhlKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICB0aGlzLmRyYWdDdXJyZW50Lm9uTW91c2VVcChlKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdGhpcy5kcmFnQ3VycmVudCA9IG51bGw7DQogICAgICAgICAgICB0aGlzLmRyYWdPdmVycyA9IHt9Ow0KICAgICAgICB9LA0KDQogICAgICAgIA0KICAgICAgICBoYW5kbGVNb3VzZU1vdmU6IGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgICAgIGlmICghIHRoaXMuZHJhZ0N1cnJlbnQpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgCg0KICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChFeHQuaXNJRSAmJiAoZS5idXR0b24gIT09IDAgJiYgZS5idXR0b24gIT09IDEgJiYgZS5idXR0b24gIT09IDIpKSB7DQogICAgICAgICAgICAgICAgdGhpcy5zdG9wRXZlbnQoZSk7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlTW91c2VVcChlKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKCF0aGlzLmRyYWdUaHJlc2hNZXQpIHsNCiAgICAgICAgICAgICAgICB2YXIgZGlmZlggPSBNYXRoLmFicyh0aGlzLnN0YXJ0WCAtIGUuZ2V0UGFnZVgoKSk7DQogICAgICAgICAgICAgICAgdmFyIGRpZmZZID0gTWF0aC5hYnModGhpcy5zdGFydFkgLSBlLmdldFBhZ2VZKCkpOw0KICAgICAgICAgICAgICAgIGlmIChkaWZmWCA+IHRoaXMuY2xpY2tQaXhlbFRocmVzaCB8fA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZZID4gdGhpcy5jbGlja1BpeGVsVGhyZXNoKSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnREcmFnKHRoaXMuc3RhcnRYLCB0aGlzLnN0YXJ0WSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAodGhpcy5kcmFnVGhyZXNoTWV0KSB7DQogICAgICAgICAgICAgICAgdGhpcy5kcmFnQ3VycmVudC5iNERyYWcoZSk7DQogICAgICAgICAgICAgICAgdGhpcy5kcmFnQ3VycmVudC5vbkRyYWcoZSk7DQogICAgICAgICAgICAgICAgaWYoIXRoaXMuZHJhZ0N1cnJlbnQubW92ZU9ubHkpew0KICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmVFdmVudHMoZSwgZmFsc2UpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdGhpcy5zdG9wRXZlbnQoZSk7DQoNCiAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICB9LA0KDQogICAgICAgIA0KICAgICAgICBmaXJlRXZlbnRzOiBmdW5jdGlvbihlLCBpc0Ryb3ApIHsNCiAgICAgICAgICAgIHZhciBkYyA9IHRoaXMuZHJhZ0N1cnJlbnQ7DQoNCiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKCFkYyB8fCBkYy5pc0xvY2tlZCgpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2YXIgcHQgPSBlLmdldFBvaW50KCk7DQoNCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgb2xkT3ZlcnMgPSBbXTsNCg0KICAgICAgICAgICAgdmFyIG91dEV2dHMgICA9IFtdOw0KICAgICAgICAgICAgdmFyIG92ZXJFdnRzICA9IFtdOw0KICAgICAgICAgICAgdmFyIGRyb3BFdnRzICA9IFtdOw0KICAgICAgICAgICAgdmFyIGVudGVyRXZ0cyA9IFtdOw0KDQogICAgICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gdGhpcy5kcmFnT3ZlcnMpIHsNCg0KICAgICAgICAgICAgICAgIHZhciBkZG8gPSB0aGlzLmRyYWdPdmVyc1tpXTsNCg0KICAgICAgICAgICAgICAgIGlmICghIHRoaXMuaXNUeXBlT2ZERChkZG8pKSB7DQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlmICghIHRoaXMuaXNPdmVyVGFyZ2V0KHB0LCBkZG8sIHRoaXMubW9kZSkpIHsNCiAgICAgICAgICAgICAgICAgICAgb3V0RXZ0cy5wdXNoKCBkZG8gKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBvbGRPdmVyc1tpXSA9IHRydWU7DQogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuZHJhZ092ZXJzW2ldOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBmb3IgKHZhciBzR3JvdXAgaW4gZGMuZ3JvdXBzKSB7DQoNCiAgICAgICAgICAgICAgICBpZiAoInN0cmluZyIgIT0gdHlwZW9mIHNHcm91cCkgew0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBmb3IgKGkgaW4gdGhpcy5pZHNbc0dyb3VwXSkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgb0REID0gdGhpcy5pZHNbc0dyb3VwXVtpXTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCEgdGhpcy5pc1R5cGVPZkREKG9ERCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgaWYgKG9ERC5pc1RhcmdldCAmJiAhb0RELmlzTG9ja2VkKCkgJiYgb0REICE9IGRjKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc092ZXJUYXJnZXQocHQsIG9ERCwgdGhpcy5tb2RlKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRHJvcCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm9wRXZ0cy5wdXNoKCBvREQgKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvbGRPdmVyc1tvREQuaWRdKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRlckV2dHMucHVzaCggb0REICk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyRXZ0cy5wdXNoKCBvREQgKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhZ092ZXJzW29ERC5pZF0gPSBvREQ7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAodGhpcy5tb2RlKSB7DQogICAgICAgICAgICAgICAgaWYgKG91dEV2dHMubGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgICAgIGRjLmI0RHJhZ091dChlLCBvdXRFdnRzKTsNCiAgICAgICAgICAgICAgICAgICAgZGMub25EcmFnT3V0KGUsIG91dEV2dHMpOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlmIChlbnRlckV2dHMubGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgICAgIGRjLm9uRHJhZ0VudGVyKGUsIGVudGVyRXZ0cyk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgaWYgKG92ZXJFdnRzLmxlbmd0aCkgew0KICAgICAgICAgICAgICAgICAgICBkYy5iNERyYWdPdmVyKGUsIG92ZXJFdnRzKTsNCiAgICAgICAgICAgICAgICAgICAgZGMub25EcmFnT3ZlcihlLCBvdmVyRXZ0cyk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgaWYgKGRyb3BFdnRzLmxlbmd0aCkgew0KICAgICAgICAgICAgICAgICAgICBkYy5iNERyYWdEcm9wKGUsIGRyb3BFdnRzKTsNCiAgICAgICAgICAgICAgICAgICAgZGMub25EcmFnRHJvcChlLCBkcm9wRXZ0cyk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGxlbiA9IDA7DQogICAgICAgICAgICAgICAgZm9yIChpPTAsIGxlbj1vdXRFdnRzLmxlbmd0aDsgaTxsZW47ICsraSkgew0KICAgICAgICAgICAgICAgICAgICBkYy5iNERyYWdPdXQoZSwgb3V0RXZ0c1tpXS5pZCk7DQogICAgICAgICAgICAgICAgICAgIGRjLm9uRHJhZ091dChlLCBvdXRFdnRzW2ldLmlkKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGZvciAoaT0wLGxlbj1lbnRlckV2dHMubGVuZ3RoOyBpPGxlbjsgKytpKSB7DQogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIGRjLm9uRHJhZ0VudGVyKGUsIGVudGVyRXZ0c1tpXS5pZCk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBmb3IgKGk9MCxsZW49b3ZlckV2dHMubGVuZ3RoOyBpPGxlbjsgKytpKSB7DQogICAgICAgICAgICAgICAgICAgIGRjLmI0RHJhZ092ZXIoZSwgb3ZlckV2dHNbaV0uaWQpOw0KICAgICAgICAgICAgICAgICAgICBkYy5vbkRyYWdPdmVyKGUsIG92ZXJFdnRzW2ldLmlkKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGZvciAoaT0wLCBsZW49ZHJvcEV2dHMubGVuZ3RoOyBpPGxlbjsgKytpKSB7DQogICAgICAgICAgICAgICAgICAgIGRjLmI0RHJhZ0Ryb3AoZSwgZHJvcEV2dHNbaV0uaWQpOw0KICAgICAgICAgICAgICAgICAgICBkYy5vbkRyYWdEcm9wKGUsIGRyb3BFdnRzW2ldLmlkKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChpc0Ryb3AgJiYgIWRyb3BFdnRzLmxlbmd0aCkgew0KICAgICAgICAgICAgICAgIGRjLm9uSW52YWxpZERyb3AoZSk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgfSwNCg0KICAgICAgICANCiAgICAgICAgZ2V0QmVzdE1hdGNoOiBmdW5jdGlvbihkZHMpIHsNCiAgICAgICAgICAgIHZhciB3aW5uZXIgPSBudWxsOw0KICAgICAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIAoNCiAgICAgICAgICAgIHZhciBsZW4gPSBkZHMubGVuZ3RoOw0KDQogICAgICAgICAgICBpZiAobGVuID09IDEpIHsNCiAgICAgICAgICAgICAgICB3aW5uZXIgPSBkZHNbMF07DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPGxlbjsgKytpKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBkZCA9IGRkc1tpXTsNCiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgaWYgKGRkLmN1cnNvcklzT3Zlcikgew0KICAgICAgICAgICAgICAgICAgICAgICAgd2lubmVyID0gZGQ7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghd2lubmVyIHx8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lubmVyLm92ZXJsYXAuZ2V0QXJlYSgpIDwgZGQub3ZlcmxhcC5nZXRBcmVhKCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5uZXIgPSBkZDsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgcmV0dXJuIHdpbm5lcjsNCiAgICAgICAgfSwNCg0KICAgICAgICANCiAgICAgICAgcmVmcmVzaENhY2hlOiBmdW5jdGlvbihncm91cHMpIHsNCiAgICAgICAgICAgIGZvciAodmFyIHNHcm91cCBpbiBncm91cHMpIHsNCiAgICAgICAgICAgICAgICBpZiAoInN0cmluZyIgIT0gdHlwZW9mIHNHcm91cCkgew0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiB0aGlzLmlkc1tzR3JvdXBdKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBvREQgPSB0aGlzLmlkc1tzR3JvdXBdW2ldOw0KDQogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVHlwZU9mREQob0REKSkgew0KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvYyA9IHRoaXMuZ2V0TG9jYXRpb24ob0REKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2MpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2F0aW9uQ2FjaGVbb0RELmlkXSA9IGxvYzsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMubG9jYXRpb25DYWNoZVtvREQuaWRdOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KDQogICAgICAgIA0KICAgICAgICB2ZXJpZnlFbDogZnVuY3Rpb24oZWwpIHsNCiAgICAgICAgICAgIGlmIChlbCkgew0KICAgICAgICAgICAgICAgIHZhciBwYXJlbnQ7DQogICAgICAgICAgICAgICAgaWYoRXh0LmlzSUUpew0KICAgICAgICAgICAgICAgICAgICB0cnl7DQogICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBlbC5vZmZzZXRQYXJlbnQ7DQogICAgICAgICAgICAgICAgICAgIH1jYXRjaChlKXt9DQogICAgICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IGVsLm9mZnNldFBhcmVudDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKHBhcmVudCkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfSwNCg0KICAgICAgICANCiAgICAgICAgZ2V0TG9jYXRpb246IGZ1bmN0aW9uKG9ERCkgew0KICAgICAgICAgICAgaWYgKCEgdGhpcy5pc1R5cGVPZkREKG9ERCkpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdmFyIGVsID0gb0RELmdldEVsKCksIHBvcywgeDEsIHgyLCB5MSwgeTIsIHQsIHIsIGIsIGw7DQoNCiAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgcG9zPSBFeHQubGliLkRvbS5nZXRYWShlbCk7DQogICAgICAgICAgICB9IGNhdGNoIChlKSB7IH0NCg0KICAgICAgICAgICAgaWYgKCFwb3MpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgeDEgPSBwb3NbMF07DQogICAgICAgICAgICB4MiA9IHgxICsgZWwub2Zmc2V0V2lkdGg7DQogICAgICAgICAgICB5MSA9IHBvc1sxXTsNCiAgICAgICAgICAgIHkyID0geTEgKyBlbC5vZmZzZXRIZWlnaHQ7DQoNCiAgICAgICAgICAgIHQgPSB5MSAtIG9ERC5wYWRkaW5nWzBdOw0KICAgICAgICAgICAgciA9IHgyICsgb0RELnBhZGRpbmdbMV07DQogICAgICAgICAgICBiID0geTIgKyBvREQucGFkZGluZ1syXTsNCiAgICAgICAgICAgIGwgPSB4MSAtIG9ERC5wYWRkaW5nWzNdOw0KDQogICAgICAgICAgICByZXR1cm4gbmV3IEV4dC5saWIuUmVnaW9uKCB0LCByLCBiLCBsICk7DQogICAgICAgIH0sDQoNCiAgICAgICAgDQogICAgICAgIGlzT3ZlclRhcmdldDogZnVuY3Rpb24ocHQsIG9UYXJnZXQsIGludGVyc2VjdCkgew0KICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBsb2MgPSB0aGlzLmxvY2F0aW9uQ2FjaGVbb1RhcmdldC5pZF07DQogICAgICAgICAgICBpZiAoIWxvYyB8fCAhdGhpcy51c2VDYWNoZSkgew0KICAgICAgICAgICAgICAgIGxvYyA9IHRoaXMuZ2V0TG9jYXRpb24ob1RhcmdldCk7DQogICAgICAgICAgICAgICAgdGhpcy5sb2NhdGlvbkNhY2hlW29UYXJnZXQuaWRdID0gbG9jOw0KDQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmICghbG9jKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBvVGFyZ2V0LmN1cnNvcklzT3ZlciA9IGxvYy5jb250YWlucyggcHQgKTsNCg0KICAgICAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgZGMgPSB0aGlzLmRyYWdDdXJyZW50Ow0KICAgICAgICAgICAgaWYgKCFkYyB8fCAhZGMuZ2V0VGFyZ2V0Q29vcmQgfHwNCiAgICAgICAgICAgICAgICAgICAgKCFpbnRlcnNlY3QgJiYgIWRjLmNvbnN0cmFpblggJiYgIWRjLmNvbnN0cmFpblkpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIG9UYXJnZXQuY3Vyc29ySXNPdmVyOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBvVGFyZ2V0Lm92ZXJsYXAgPSBudWxsOw0KDQogICAgICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBvcyA9IGRjLmdldFRhcmdldENvb3JkKHB0LngsIHB0LnkpOw0KDQogICAgICAgICAgICB2YXIgZWwgPSBkYy5nZXREcmFnRWwoKTsNCiAgICAgICAgICAgIHZhciBjdXJSZWdpb24gPSBuZXcgRXh0LmxpYi5SZWdpb24oIHBvcy55LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zLnggKyBlbC5vZmZzZXRXaWR0aCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcy55ICsgZWwub2Zmc2V0SGVpZ2h0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zLnggKTsNCg0KICAgICAgICAgICAgdmFyIG92ZXJsYXAgPSBjdXJSZWdpb24uaW50ZXJzZWN0KGxvYyk7DQoNCiAgICAgICAgICAgIGlmIChvdmVybGFwKSB7DQogICAgICAgICAgICAgICAgb1RhcmdldC5vdmVybGFwID0gb3ZlcmxhcDsNCiAgICAgICAgICAgICAgICByZXR1cm4gKGludGVyc2VjdCkgPyB0cnVlIDogb1RhcmdldC5jdXJzb3JJc092ZXI7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCg0KICAgICAgICANCiAgICAgICAgX29uVW5sb2FkOiBmdW5jdGlvbihlLCBtZSkgew0KICAgICAgICAgICAgRXh0LmRkLkRyYWdEcm9wTWdyLnVucmVnQWxsKCk7DQogICAgICAgIH0sDQoNCiAgICAgICAgDQogICAgICAgIHVucmVnQWxsOiBmdW5jdGlvbigpIHsNCg0KICAgICAgICAgICAgaWYgKHRoaXMuZHJhZ0N1cnJlbnQpIHsNCiAgICAgICAgICAgICAgICB0aGlzLnN0b3BEcmFnKCk7DQogICAgICAgICAgICAgICAgdGhpcy5kcmFnQ3VycmVudCA9IG51bGw7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHRoaXMuX2V4ZWNPbkFsbCgidW5yZWciLCBbXSk7DQoNCiAgICAgICAgICAgIGZvciAoaSBpbiB0aGlzLmVsZW1lbnRDYWNoZSkgew0KICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmVsZW1lbnRDYWNoZVtpXTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdGhpcy5lbGVtZW50Q2FjaGUgPSB7fTsNCiAgICAgICAgICAgIHRoaXMuaWRzID0ge307DQogICAgICAgIH0sDQoNCiAgICAgICAgDQogICAgICAgIGVsZW1lbnRDYWNoZToge30sDQoNCiAgICAgICAgDQogICAgICAgIGdldEVsV3JhcHBlcjogZnVuY3Rpb24oaWQpIHsNCiAgICAgICAgICAgIHZhciBvV3JhcHBlciA9IHRoaXMuZWxlbWVudENhY2hlW2lkXTsNCiAgICAgICAgICAgIGlmICghb1dyYXBwZXIgfHwgIW9XcmFwcGVyLmVsKSB7DQogICAgICAgICAgICAgICAgb1dyYXBwZXIgPSB0aGlzLmVsZW1lbnRDYWNoZVtpZF0gPQ0KICAgICAgICAgICAgICAgICAgICBuZXcgdGhpcy5FbGVtZW50V3JhcHBlcihFeHQuZ2V0RG9tKGlkKSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gb1dyYXBwZXI7DQogICAgICAgIH0sDQoNCiAgICAgICAgDQogICAgICAgIGdldEVsZW1lbnQ6IGZ1bmN0aW9uKGlkKSB7DQogICAgICAgICAgICByZXR1cm4gRXh0LmdldERvbShpZCk7DQogICAgICAgIH0sDQoNCiAgICAgICAgDQogICAgICAgIGdldENzczogZnVuY3Rpb24oaWQpIHsNCiAgICAgICAgICAgIHZhciBlbCA9IEV4dC5nZXREb20oaWQpOw0KICAgICAgICAgICAgcmV0dXJuIChlbCkgPyBlbC5zdHlsZSA6IG51bGw7DQogICAgICAgIH0sDQoNCiAgICAgICAgDQogICAgICAgIEVsZW1lbnRXcmFwcGVyOiBmdW5jdGlvbihlbCkgew0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHRoaXMuZWwgPSBlbCB8fCBudWxsOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLmVsICYmIGVsLmlkOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHRoaXMuY3NzID0gdGhpcy5lbCAmJiBlbC5zdHlsZTsNCiAgICAgICAgICAgIH0sDQoNCiAgICAgICAgDQogICAgICAgIGdldFBvc1g6IGZ1bmN0aW9uKGVsKSB7DQogICAgICAgICAgICByZXR1cm4gRXh0LmxpYi5Eb20uZ2V0WChlbCk7DQogICAgICAgIH0sDQoNCiAgICAgICAgDQogICAgICAgIGdldFBvc1k6IGZ1bmN0aW9uKGVsKSB7DQogICAgICAgICAgICByZXR1cm4gRXh0LmxpYi5Eb20uZ2V0WShlbCk7DQogICAgICAgIH0sDQoNCiAgICAgICAgDQogICAgICAgIHN3YXBOb2RlOiBmdW5jdGlvbihuMSwgbjIpIHsNCiAgICAgICAgICAgIGlmIChuMS5zd2FwTm9kZSkgew0KICAgICAgICAgICAgICAgIG4xLnN3YXBOb2RlKG4yKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgdmFyIHAgPSBuMi5wYXJlbnROb2RlOw0KICAgICAgICAgICAgICAgIHZhciBzID0gbjIubmV4dFNpYmxpbmc7DQoNCiAgICAgICAgICAgICAgICBpZiAocyA9PSBuMSkgew0KICAgICAgICAgICAgICAgICAgICBwLmluc2VydEJlZm9yZShuMSwgbjIpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobjIgPT0gbjEubmV4dFNpYmxpbmcpIHsNCiAgICAgICAgICAgICAgICAgICAgcC5pbnNlcnRCZWZvcmUobjIsIG4xKTsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBuMS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChuMiwgbjEpOw0KICAgICAgICAgICAgICAgICAgICBwLmluc2VydEJlZm9yZShuMSwgcyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KDQogICAgICAgIA0KICAgICAgICBnZXRTY3JvbGw6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHZhciB0LCBsLCBkZGU9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBkYj1kb2N1bWVudC5ib2R5Ow0KICAgICAgICAgICAgaWYgKGRkZSAmJiAoZGRlLnNjcm9sbFRvcCB8fCBkZGUuc2Nyb2xsTGVmdCkpIHsNCiAgICAgICAgICAgICAgICB0ID0gZGRlLnNjcm9sbFRvcDsNCiAgICAgICAgICAgICAgICBsID0gZGRlLnNjcm9sbExlZnQ7DQogICAgICAgICAgICB9IGVsc2UgaWYgKGRiKSB7DQogICAgICAgICAgICAgICAgdCA9IGRiLnNjcm9sbFRvcDsNCiAgICAgICAgICAgICAgICBsID0gZGIuc2Nyb2xsTGVmdDsNCiAgICAgICAgICAgIH0gZWxzZSB7DQoNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiB7IHRvcDogdCwgbGVmdDogbCB9Ow0KICAgICAgICB9LA0KDQogICAgICAgIA0KICAgICAgICBnZXRTdHlsZTogZnVuY3Rpb24oZWwsIHN0eWxlUHJvcCkgew0KICAgICAgICAgICAgcmV0dXJuIEV4dC5mbHkoZWwpLmdldFN0eWxlKHN0eWxlUHJvcCk7DQogICAgICAgIH0sDQoNCiAgICAgICAgDQogICAgICAgIGdldFNjcm9sbFRvcDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5nZXRTY3JvbGwoKS50b3A7IH0sDQoNCiAgICAgICAgDQogICAgICAgIGdldFNjcm9sbExlZnQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuZ2V0U2Nyb2xsKCkubGVmdDsgfSwNCg0KICAgICAgICANCiAgICAgICAgbW92ZVRvRWw6IGZ1bmN0aW9uIChtb3ZlRWwsIHRhcmdldEVsKSB7DQogICAgICAgICAgICB2YXIgYUNvb3JkID0gRXh0LmxpYi5Eb20uZ2V0WFkodGFyZ2V0RWwpOw0KICAgICAgICAgICAgRXh0LmxpYi5Eb20uc2V0WFkobW92ZUVsLCBhQ29vcmQpOw0KICAgICAgICB9LA0KDQogICAgICAgIA0KICAgICAgICBudW1lcmljU29ydDogZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gKGEgLSBiKTsgfSwNCg0KICAgICAgICANCiAgICAgICAgX3RpbWVvdXRDb3VudDogMCwNCg0KICAgICAgICANCiAgICAgICAgX2FkZExpc3RlbmVyczogZnVuY3Rpb24oKSB7DQogICAgICAgICAgICB2YXIgRERNID0gRXh0LmRkLkRETTsNCiAgICAgICAgICAgIGlmICggRXh0LmxpYi5FdmVudCAmJiBkb2N1bWVudCApIHsNCiAgICAgICAgICAgICAgICBERE0uX29uTG9hZCgpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBpZiAoRERNLl90aW1lb3V0Q291bnQgPiAyMDAwKSB7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChERE0uX2FkZExpc3RlbmVycywgMTApOw0KICAgICAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQgJiYgZG9jdW1lbnQuYm9keSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgRERNLl90aW1lb3V0Q291bnQgKz0gMTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCg0KICAgICAgICANCiAgICAgICAgaGFuZGxlV2FzQ2xpY2tlZDogZnVuY3Rpb24obm9kZSwgaWQpIHsNCiAgICAgICAgICAgIGlmICh0aGlzLmlzSGFuZGxlKGlkLCBub2RlLmlkKSkgew0KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBwID0gbm9kZS5wYXJlbnROb2RlOw0KDQogICAgICAgICAgICAgICAgd2hpbGUgKHApIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNIYW5kbGUoaWQsIHAuaWQpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBwLnBhcmVudE5vZGU7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfQ0KDQogICAgfTsNCg0KfSgpOw0KDQoKRXh0LmRkLkRETSA9IEV4dC5kZC5EcmFnRHJvcE1ncjsNCkV4dC5kZC5ERE0uX2FkZExpc3RlbmVycygpOw0KDQp9DQoNCg0KRXh0LmRkLkREID0gZnVuY3Rpb24oaWQsIHNHcm91cCwgY29uZmlnKSB7DQogICAgaWYgKGlkKSB7DQogICAgICAgIHRoaXMuaW5pdChpZCwgc0dyb3VwLCBjb25maWcpOw0KICAgIH0NCn07DQoNCkV4dC5leHRlbmQoRXh0LmRkLkRELCBFeHQuZGQuRHJhZ0Ryb3AsIHsNCg0KICAgIA0KICAgIHNjcm9sbDogdHJ1ZSwNCg0KICAgIA0KICAgIGF1dG9PZmZzZXQ6IGZ1bmN0aW9uKGlQYWdlWCwgaVBhZ2VZKSB7DQogICAgICAgIHZhciB4ID0gaVBhZ2VYIC0gdGhpcy5zdGFydFBhZ2VYOw0KICAgICAgICB2YXIgeSA9IGlQYWdlWSAtIHRoaXMuc3RhcnRQYWdlWTsNCiAgICAgICAgdGhpcy5zZXREZWx0YSh4LCB5KTsNCiAgICB9LA0KDQogICAgDQogICAgc2V0RGVsdGE6IGZ1bmN0aW9uKGlEZWx0YVgsIGlEZWx0YVkpIHsNCiAgICAgICAgdGhpcy5kZWx0YVggPSBpRGVsdGFYOw0KICAgICAgICB0aGlzLmRlbHRhWSA9IGlEZWx0YVk7DQogICAgfSwNCg0KICAgIA0KICAgIHNldERyYWdFbFBvczogZnVuY3Rpb24oaVBhZ2VYLCBpUGFnZVkpIHsNCiAgICAgICAgCiAgICAgICAgCg0KICAgICAgICB2YXIgZWwgPSB0aGlzLmdldERyYWdFbCgpOw0KICAgICAgICB0aGlzLmFsaWduRWxXaXRoTW91c2UoZWwsIGlQYWdlWCwgaVBhZ2VZKTsNCiAgICB9LA0KDQogICAgDQogICAgYWxpZ25FbFdpdGhNb3VzZTogZnVuY3Rpb24oZWwsIGlQYWdlWCwgaVBhZ2VZKSB7DQogICAgICAgIHZhciBvQ29vcmQgPSB0aGlzLmdldFRhcmdldENvb3JkKGlQYWdlWCwgaVBhZ2VZKTsNCiAgICAgICAgdmFyIGZseSA9IGVsLmRvbSA/IGVsIDogRXh0LmZseShlbCk7DQogICAgICAgIGlmICghdGhpcy5kZWx0YVNldFhZKSB7DQogICAgICAgICAgICB2YXIgYUNvb3JkID0gW29Db29yZC54LCBvQ29vcmQueV07DQogICAgICAgICAgICBmbHkuc2V0WFkoYUNvb3JkKTsNCiAgICAgICAgICAgIHZhciBuZXdMZWZ0ID0gZmx5LmdldExlZnQodHJ1ZSk7DQogICAgICAgICAgICB2YXIgbmV3VG9wICA9IGZseS5nZXRUb3AodHJ1ZSk7DQogICAgICAgICAgICB0aGlzLmRlbHRhU2V0WFkgPSBbIG5ld0xlZnQgLSBvQ29vcmQueCwgbmV3VG9wIC0gb0Nvb3JkLnkgXTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGZseS5zZXRMZWZ0VG9wKG9Db29yZC54ICsgdGhpcy5kZWx0YVNldFhZWzBdLCBvQ29vcmQueSArIHRoaXMuZGVsdGFTZXRYWVsxXSk7DQogICAgICAgIH0NCg0KICAgICAgICB0aGlzLmNhY2hlUG9zaXRpb24ob0Nvb3JkLngsIG9Db29yZC55KTsNCiAgICAgICAgdGhpcy5hdXRvU2Nyb2xsKG9Db29yZC54LCBvQ29vcmQueSwgZWwub2Zmc2V0SGVpZ2h0LCBlbC5vZmZzZXRXaWR0aCk7DQogICAgICAgIHJldHVybiBvQ29vcmQ7DQogICAgfSwNCg0KICAgIA0KICAgIGNhY2hlUG9zaXRpb246IGZ1bmN0aW9uKGlQYWdlWCwgaVBhZ2VZKSB7DQogICAgICAgIGlmIChpUGFnZVgpIHsNCiAgICAgICAgICAgIHRoaXMubGFzdFBhZ2VYID0gaVBhZ2VYOw0KICAgICAgICAgICAgdGhpcy5sYXN0UGFnZVkgPSBpUGFnZVk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB2YXIgYUNvb3JkID0gRXh0LmxpYi5Eb20uZ2V0WFkodGhpcy5nZXRFbCgpKTsNCiAgICAgICAgICAgIHRoaXMubGFzdFBhZ2VYID0gYUNvb3JkWzBdOw0KICAgICAgICAgICAgdGhpcy5sYXN0UGFnZVkgPSBhQ29vcmRbMV07DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgDQogICAgYXV0b1Njcm9sbDogZnVuY3Rpb24oeCwgeSwgaCwgdykgew0KDQogICAgICAgIGlmICh0aGlzLnNjcm9sbCkgew0KICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBjbGllbnRIID0gRXh0LmxpYi5Eb20uZ2V0Vmlld1dpZHRoKCk7DQoNCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgY2xpZW50VyA9IEV4dC5saWIuRG9tLmdldFZpZXdIZWlnaHQoKTsNCg0KICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBzdCA9IHRoaXMuRERNLmdldFNjcm9sbFRvcCgpOw0KDQogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHNsID0gdGhpcy5ERE0uZ2V0U2Nyb2xsTGVmdCgpOw0KDQogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIGJvdCA9IGggKyB5Ow0KDQogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHJpZ2h0ID0gdyArIHg7DQoNCiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciB0b0JvdCA9IChjbGllbnRIICsgc3QgLSB5IC0gdGhpcy5kZWx0YVkpOw0KDQogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHRvUmlnaHQgPSAoY2xpZW50VyArIHNsIC0geCAtIHRoaXMuZGVsdGFYKTsNCg0KDQogICAgICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciB0aHJlc2ggPSA0MDsNCg0KICAgICAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHNjckFtdCA9IChkb2N1bWVudC5hbGwpID8gODAgOiAzMDsNCg0KICAgICAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoIGJvdCA+IGNsaWVudEggJiYgdG9Cb3QgPCB0aHJlc2ggKSB7DQogICAgICAgICAgICAgICAgd2luZG93LnNjcm9sbFRvKHNsLCBzdCArIHNjckFtdCk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKCB5IDwgc3QgJiYgc3QgPiAwICYmIHkgLSBzdCA8IHRocmVzaCApIHsNCiAgICAgICAgICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oc2wsIHN0IC0gc2NyQW10KTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoIHJpZ2h0ID4gY2xpZW50VyAmJiB0b1JpZ2h0IDwgdGhyZXNoICkgew0KICAgICAgICAgICAgICAgIHdpbmRvdy5zY3JvbGxUbyhzbCArIHNjckFtdCwgc3QpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICggeCA8IHNsICYmIHNsID4gMCAmJiB4IC0gc2wgPCB0aHJlc2ggKSB7DQogICAgICAgICAgICAgICAgd2luZG93LnNjcm9sbFRvKHNsIC0gc2NyQW10LCBzdCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgDQogICAgZ2V0VGFyZ2V0Q29vcmQ6IGZ1bmN0aW9uKGlQYWdlWCwgaVBhZ2VZKSB7DQoNCg0KICAgICAgICB2YXIgeCA9IGlQYWdlWCAtIHRoaXMuZGVsdGFYOw0KICAgICAgICB2YXIgeSA9IGlQYWdlWSAtIHRoaXMuZGVsdGFZOw0KDQogICAgICAgIGlmICh0aGlzLmNvbnN0cmFpblgpIHsNCiAgICAgICAgICAgIGlmICh4IDwgdGhpcy5taW5YKSB7IHggPSB0aGlzLm1pblg7IH0NCiAgICAgICAgICAgIGlmICh4ID4gdGhpcy5tYXhYKSB7IHggPSB0aGlzLm1heFg7IH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmICh0aGlzLmNvbnN0cmFpblkpIHsNCiAgICAgICAgICAgIGlmICh5IDwgdGhpcy5taW5ZKSB7IHkgPSB0aGlzLm1pblk7IH0NCiAgICAgICAgICAgIGlmICh5ID4gdGhpcy5tYXhZKSB7IHkgPSB0aGlzLm1heFk7IH0NCiAgICAgICAgfQ0KDQogICAgICAgIHggPSB0aGlzLmdldFRpY2soeCwgdGhpcy54VGlja3MpOw0KICAgICAgICB5ID0gdGhpcy5nZXRUaWNrKHksIHRoaXMueVRpY2tzKTsNCg0KDQogICAgICAgIHJldHVybiB7eDp4LCB5Onl9Ow0KICAgIH0sDQoNCiAgICANCiAgICBhcHBseUNvbmZpZzogZnVuY3Rpb24oKSB7DQogICAgICAgIEV4dC5kZC5ERC5zdXBlcmNsYXNzLmFwcGx5Q29uZmlnLmNhbGwodGhpcyk7DQogICAgICAgIHRoaXMuc2Nyb2xsID0gKHRoaXMuY29uZmlnLnNjcm9sbCAhPT0gZmFsc2UpOw0KICAgIH0sDQoNCiAgICANCiAgICBiNE1vdXNlRG93bjogZnVuY3Rpb24oZSkgew0KICAgICAgICAKICAgICAgICB0aGlzLmF1dG9PZmZzZXQoZS5nZXRQYWdlWCgpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0UGFnZVkoKSk7DQogICAgfSwNCg0KICAgIA0KICAgIGI0RHJhZzogZnVuY3Rpb24oZSkgew0KICAgICAgICB0aGlzLnNldERyYWdFbFBvcyhlLmdldFBhZ2VYKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRQYWdlWSgpKTsNCiAgICB9LA0KDQogICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gKCJERCAiICsgdGhpcy5pZCk7DQogICAgfQ0KDQogICAgCiAgICAKICAgIAogICAgDQoNCn0pOw0KDQpFeHQuZGQuRERQcm94eSA9IGZ1bmN0aW9uKGlkLCBzR3JvdXAsIGNvbmZpZykgew0KICAgIGlmIChpZCkgew0KICAgICAgICB0aGlzLmluaXQoaWQsIHNHcm91cCwgY29uZmlnKTsNCiAgICAgICAgdGhpcy5pbml0RnJhbWUoKTsNCiAgICB9DQp9Ow0KDQoNCkV4dC5kZC5ERFByb3h5LmRyYWdFbElkID0gInlnZGRmZGl2IjsNCg0KRXh0LmV4dGVuZChFeHQuZGQuRERQcm94eSwgRXh0LmRkLkRELCB7DQoNCiAgICANCiAgICByZXNpemVGcmFtZTogdHJ1ZSwNCg0KICAgIA0KICAgIGNlbnRlckZyYW1lOiBmYWxzZSwNCg0KICAgIA0KICAgIGNyZWF0ZUZyYW1lOiBmdW5jdGlvbigpIHsNCiAgICAgICAgdmFyIHNlbGYgPSB0aGlzOw0KICAgICAgICB2YXIgYm9keSA9IGRvY3VtZW50LmJvZHk7DQoNCiAgICAgICAgaWYgKCFib2R5IHx8ICFib2R5LmZpcnN0Q2hpbGQpIHsNCiAgICAgICAgICAgIHNldFRpbWVvdXQoIGZ1bmN0aW9uKCkgeyBzZWxmLmNyZWF0ZUZyYW1lKCk7IH0sIDUwICk7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgZGl2ID0gdGhpcy5nZXREcmFnRWwoKTsNCg0KICAgICAgICBpZiAoIWRpdikgew0KICAgICAgICAgICAgZGl2ICAgID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQogICAgICAgICAgICBkaXYuaWQgPSB0aGlzLmRyYWdFbElkOw0KICAgICAgICAgICAgdmFyIHMgID0gZGl2LnN0eWxlOw0KDQogICAgICAgICAgICBzLnBvc2l0aW9uICAgPSAiYWJzb2x1dGUiOw0KICAgICAgICAgICAgcy52aXNpYmlsaXR5ID0gImhpZGRlbiI7DQogICAgICAgICAgICBzLmN1cnNvciAgICAgPSAibW92ZSI7DQogICAgICAgICAgICBzLmJvcmRlciAgICAgPSAiMnB4IHNvbGlkICNhYWEiOw0KICAgICAgICAgICAgcy56SW5kZXggICAgID0gOTk5Ow0KDQogICAgICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICBib2R5Lmluc2VydEJlZm9yZShkaXYsIGJvZHkuZmlyc3RDaGlsZCk7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgDQogICAgaW5pdEZyYW1lOiBmdW5jdGlvbigpIHsNCiAgICAgICAgdGhpcy5jcmVhdGVGcmFtZSgpOw0KICAgIH0sDQoNCiAgICBhcHBseUNvbmZpZzogZnVuY3Rpb24oKSB7DQogICAgICAgIEV4dC5kZC5ERFByb3h5LnN1cGVyY2xhc3MuYXBwbHlDb25maWcuY2FsbCh0aGlzKTsNCg0KICAgICAgICB0aGlzLnJlc2l6ZUZyYW1lID0gKHRoaXMuY29uZmlnLnJlc2l6ZUZyYW1lICE9PSBmYWxzZSk7DQogICAgICAgIHRoaXMuY2VudGVyRnJhbWUgPSAodGhpcy5jb25maWcuY2VudGVyRnJhbWUpOw0KICAgICAgICB0aGlzLnNldERyYWdFbElkKHRoaXMuY29uZmlnLmRyYWdFbElkIHx8IEV4dC5kZC5ERFByb3h5LmRyYWdFbElkKTsNCiAgICB9LA0KDQogICAgDQogICAgc2hvd0ZyYW1lOiBmdW5jdGlvbihpUGFnZVgsIGlQYWdlWSkgew0KICAgICAgICB2YXIgZWwgPSB0aGlzLmdldEVsKCk7DQogICAgICAgIHZhciBkcmFnRWwgPSB0aGlzLmdldERyYWdFbCgpOw0KICAgICAgICB2YXIgcyA9IGRyYWdFbC5zdHlsZTsNCg0KICAgICAgICB0aGlzLl9yZXNpemVQcm94eSgpOw0KDQogICAgICAgIGlmICh0aGlzLmNlbnRlckZyYW1lKSB7DQogICAgICAgICAgICB0aGlzLnNldERlbHRhKCBNYXRoLnJvdW5kKHBhcnNlSW50KHMud2lkdGgsICAxMCkvMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKHBhcnNlSW50KHMuaGVpZ2h0LCAxMCkvMikgKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHRoaXMuc2V0RHJhZ0VsUG9zKGlQYWdlWCwgaVBhZ2VZKTsNCg0KICAgICAgICBFeHQuZmx5KGRyYWdFbCkuc2hvdygpOw0KICAgIH0sDQoNCiAgICANCiAgICBfcmVzaXplUHJveHk6IGZ1bmN0aW9uKCkgew0KICAgICAgICBpZiAodGhpcy5yZXNpemVGcmFtZSkgew0KICAgICAgICAgICAgdmFyIGVsID0gdGhpcy5nZXRFbCgpOw0KICAgICAgICAgICAgRXh0LmZseSh0aGlzLmdldERyYWdFbCgpKS5zZXRTaXplKGVsLm9mZnNldFdpZHRoLCBlbC5vZmZzZXRIZWlnaHQpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIAogICAgYjRNb3VzZURvd246IGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgdmFyIHggPSBlLmdldFBhZ2VYKCk7DQogICAgICAgIHZhciB5ID0gZS5nZXRQYWdlWSgpOw0KICAgICAgICB0aGlzLmF1dG9PZmZzZXQoeCwgeSk7DQogICAgICAgIHRoaXMuc2V0RHJhZ0VsUG9zKHgsIHkpOw0KICAgIH0sDQoNCiAgICAKICAgIGI0U3RhcnREcmFnOiBmdW5jdGlvbih4LCB5KSB7DQogICAgICAgIAogICAgICAgIHRoaXMuc2hvd0ZyYW1lKHgsIHkpOw0KICAgIH0sDQoNCiAgICAKICAgIGI0RW5kRHJhZzogZnVuY3Rpb24oZSkgew0KICAgICAgICBFeHQuZmx5KHRoaXMuZ2V0RHJhZ0VsKCkpLmhpZGUoKTsNCiAgICB9LA0KDQogICAgCiAgICAKICAgIAogICAgZW5kRHJhZzogZnVuY3Rpb24oZSkgew0KDQogICAgICAgIHZhciBsZWwgPSB0aGlzLmdldEVsKCk7DQogICAgICAgIHZhciBkZWwgPSB0aGlzLmdldERyYWdFbCgpOw0KDQogICAgICAgIAogICAgICAgIGRlbC5zdHlsZS52aXNpYmlsaXR5ID0gIiI7DQoNCiAgICAgICAgdGhpcy5iZWZvcmVNb3ZlKCk7DQogICAgICAgIAogICAgICAgIAogICAgICAgIGxlbC5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7DQogICAgICAgIEV4dC5kZC5ERE0ubW92ZVRvRWwobGVsLCBkZWwpOw0KICAgICAgICBkZWwuc3R5bGUudmlzaWJpbGl0eSA9ICJoaWRkZW4iOw0KICAgICAgICBsZWwuc3R5bGUudmlzaWJpbGl0eSA9ICIiOw0KDQogICAgICAgIHRoaXMuYWZ0ZXJEcmFnKCk7DQogICAgfSwNCg0KICAgIGJlZm9yZU1vdmUgOiBmdW5jdGlvbigpew0KDQogICAgfSwNCg0KICAgIGFmdGVyRHJhZyA6IGZ1bmN0aW9uKCl7DQoNCiAgICB9LA0KDQogICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgew0KICAgICAgICByZXR1cm4gKCJERFByb3h5ICIgKyB0aGlzLmlkKTsNCiAgICB9DQoNCn0pOw0KDQpFeHQuZGQuRERUYXJnZXQgPSBmdW5jdGlvbihpZCwgc0dyb3VwLCBjb25maWcpIHsNCiAgICBpZiAoaWQpIHsNCiAgICAgICAgdGhpcy5pbml0VGFyZ2V0KGlkLCBzR3JvdXAsIGNvbmZpZyk7DQogICAgfQ0KfTsNCg0KCkV4dC5leHRlbmQoRXh0LmRkLkREVGFyZ2V0LCBFeHQuZGQuRHJhZ0Ryb3AsIHsNCiAgICB0b1N0cmluZzogZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiAoIkREVGFyZ2V0ICIgKyB0aGlzLmlkKTsNCiAgICB9DQp9KTsNCgoNCkV4dC5kZC5TY3JvbGxNYW5hZ2VyID0gZnVuY3Rpb24oKXsNCiAgICB2YXIgZGRtID0gRXh0LmRkLkRyYWdEcm9wTWdyOw0KICAgIHZhciBlbHMgPSB7fTsNCiAgICB2YXIgZHJhZ0VsID0gbnVsbDsNCiAgICB2YXIgcHJvYyA9IHt9Ow0KICAgIA0KICAgIHZhciBvblN0b3AgPSBmdW5jdGlvbihlKXsNCiAgICAgICAgZHJhZ0VsID0gbnVsbDsNCiAgICAgICAgY2xlYXJQcm9jKCk7DQogICAgfTsNCiAgICANCiAgICB2YXIgdHJpZ2dlclJlZnJlc2ggPSBmdW5jdGlvbigpew0KICAgICAgICBpZihkZG0uZHJhZ0N1cnJlbnQpew0KICAgICAgICAgICAgIGRkbS5yZWZyZXNoQ2FjaGUoZGRtLmRyYWdDdXJyZW50Lmdyb3Vwcyk7DQogICAgICAgIH0NCiAgICB9Ow0KICAgIA0KICAgIHZhciBkb1Njcm9sbCA9IGZ1bmN0aW9uKCl7DQogICAgICAgIGlmKGRkbS5kcmFnQ3VycmVudCl7DQogICAgICAgICAgICB2YXIgZGRzID0gRXh0LmRkLlNjcm9sbE1hbmFnZXI7DQogICAgICAgICAgICBpZighZGRzLmFuaW1hdGUpew0KICAgICAgICAgICAgICAgIGlmKHByb2MuZWwuc2Nyb2xsKHByb2MuZGlyLCBkZHMuaW5jcmVtZW50KSl7DQogICAgICAgICAgICAgICAgICAgIHRyaWdnZXJSZWZyZXNoKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgcHJvYy5lbC5zY3JvbGwocHJvYy5kaXIsIGRkcy5pbmNyZW1lbnQsIHRydWUsIGRkcy5hbmltRHVyYXRpb24sIHRyaWdnZXJSZWZyZXNoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH07DQogICAgDQogICAgdmFyIGNsZWFyUHJvYyA9IGZ1bmN0aW9uKCl7DQogICAgICAgIGlmKHByb2MuaWQpew0KICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChwcm9jLmlkKTsNCiAgICAgICAgfQ0KICAgICAgICBwcm9jLmlkID0gMDsNCiAgICAgICAgcHJvYy5lbCA9IG51bGw7DQogICAgICAgIHByb2MuZGlyID0gIiI7DQogICAgfTsNCiAgICANCiAgICB2YXIgc3RhcnRQcm9jID0gZnVuY3Rpb24oZWwsIGRpcil7DQogICAgICAgIGNsZWFyUHJvYygpOw0KICAgICAgICBwcm9jLmVsID0gZWw7DQogICAgICAgIHByb2MuZGlyID0gZGlyOw0KICAgICAgICBwcm9jLmlkID0gc2V0SW50ZXJ2YWwoZG9TY3JvbGwsIEV4dC5kZC5TY3JvbGxNYW5hZ2VyLmZyZXF1ZW5jeSk7DQogICAgfTsNCiAgICANCiAgICB2YXIgb25GaXJlID0gZnVuY3Rpb24oZSwgaXNEcm9wKXsNCiAgICAgICAgaWYoaXNEcm9wIHx8ICFkZG0uZHJhZ0N1cnJlbnQpeyByZXR1cm47IH0NCiAgICAgICAgdmFyIGRkcyA9IEV4dC5kZC5TY3JvbGxNYW5hZ2VyOw0KICAgICAgICBpZighZHJhZ0VsIHx8IGRyYWdFbCAhPSBkZG0uZHJhZ0N1cnJlbnQpew0KICAgICAgICAgICAgZHJhZ0VsID0gZGRtLmRyYWdDdXJyZW50Ow0KICAgICAgICAgICAgCiAgICAgICAgICAgIGRkcy5yZWZyZXNoQ2FjaGUoKTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgdmFyIHh5ID0gRXh0LmxpYi5FdmVudC5nZXRYWShlKTsNCiAgICAgICAgdmFyIHB0ID0gbmV3IEV4dC5saWIuUG9pbnQoeHlbMF0sIHh5WzFdKTsNCiAgICAgICAgZm9yKHZhciBpZCBpbiBlbHMpew0KICAgICAgICAgICAgdmFyIGVsID0gZWxzW2lkXSwgciA9IGVsLl9yZWdpb247DQogICAgICAgICAgICBpZihyICYmIHIuY29udGFpbnMocHQpICYmIGVsLmlzU2Nyb2xsYWJsZSgpKXsNCiAgICAgICAgICAgICAgICBpZihyLmJvdHRvbSAtIHB0LnkgPD0gZGRzLnRocmVzaCl7DQogICAgICAgICAgICAgICAgICAgIGlmKHByb2MuZWwgIT0gZWwpew0KICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQcm9jKGVsLCAiZG93biIpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICB9ZWxzZSBpZihyLnJpZ2h0IC0gcHQueCA8PSBkZHMudGhyZXNoKXsNCiAgICAgICAgICAgICAgICAgICAgaWYocHJvYy5lbCAhPSBlbCl7DQogICAgICAgICAgICAgICAgICAgICAgICBzdGFydFByb2MoZWwsICJsZWZ0Iik7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgIH1lbHNlIGlmKHB0LnkgLSByLnRvcCA8PSBkZHMudGhyZXNoKXsNCiAgICAgICAgICAgICAgICAgICAgaWYocHJvYy5lbCAhPSBlbCl7DQogICAgICAgICAgICAgICAgICAgICAgICBzdGFydFByb2MoZWwsICJ1cCIpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICB9ZWxzZSBpZihwdC54IC0gci5sZWZ0IDw9IGRkcy50aHJlc2gpew0KICAgICAgICAgICAgICAgICAgICBpZihwcm9jLmVsICE9IGVsKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UHJvYyhlbCwgInJpZ2h0Iik7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBjbGVhclByb2MoKTsNCiAgICB9Ow0KICAgIA0KICAgIGRkbS5maXJlRXZlbnRzID0gZGRtLmZpcmVFdmVudHMuY3JlYXRlU2VxdWVuY2Uob25GaXJlLCBkZG0pOw0KICAgIGRkbS5zdG9wRHJhZyA9IGRkbS5zdG9wRHJhZy5jcmVhdGVTZXF1ZW5jZShvblN0b3AsIGRkbSk7DQogICAgDQogICAgcmV0dXJuIHsNCiAgICAgICAgDQogICAgICAgIHJlZ2lzdGVyIDogZnVuY3Rpb24oZWwpew0KICAgICAgICAgICAgaWYoZWwgaW5zdGFuY2VvZiBBcnJheSl7DQogICAgICAgICAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gZWwubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsNCiAgICAgICAgICAgICAgICAJdGhpcy5yZWdpc3RlcihlbFtpXSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgZWwgPSBFeHQuZ2V0KGVsKTsNCiAgICAgICAgICAgICAgICBlbHNbZWwuaWRdID0gZWw7DQogICAgICAgICAgICB9DQogICAgICAgIH0sDQogICAgICAgIA0KICAgICAgICANCiAgICAgICAgdW5yZWdpc3RlciA6IGZ1bmN0aW9uKGVsKXsNCiAgICAgICAgICAgIGlmKGVsIGluc3RhbmNlb2YgQXJyYXkpew0KICAgICAgICAgICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IGVsLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7DQogICAgICAgICAgICAgICAgCXRoaXMudW5yZWdpc3RlcihlbFtpXSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgZWwgPSBFeHQuZ2V0KGVsKTsNCiAgICAgICAgICAgICAgICBkZWxldGUgZWxzW2VsLmlkXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCiAgICAgICAgDQogICAgICAgIA0KICAgICAgICB0aHJlc2ggOiAyNSwNCiAgICAgICAgDQogICAgICAgIA0KICAgICAgICBpbmNyZW1lbnQgOiAxMDAsDQogICAgICAgIA0KICAgICAgICANCiAgICAgICAgZnJlcXVlbmN5IDogNTAwLA0KICAgICAgICANCiAgICAgICAgDQogICAgICAgIGFuaW1hdGU6IHRydWUsDQogICAgICAgIA0KICAgICAgICANCiAgICAgICAgYW5pbUR1cmF0aW9uOiAuNCwNCiAgICAgICAgDQogICAgICAgIA0KICAgICAgICByZWZyZXNoQ2FjaGUgOiBmdW5jdGlvbigpew0KICAgICAgICAgICAgZm9yKHZhciBpZCBpbiBlbHMpew0KICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBlbHNbaWRdID09ICdvYmplY3QnKXsgCiAgICAgICAgICAgICAgICAgICAgZWxzW2lkXS5fcmVnaW9uID0gZWxzW2lkXS5nZXRSZWdpb24oKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9Ow0KfSgpOwoNCkV4dC5kZC5SZWdpc3RyeSA9IGZ1bmN0aW9uKCl7DQogICAgdmFyIGVsZW1lbnRzID0ge307IA0KICAgIHZhciBoYW5kbGVzID0ge307IA0KICAgIHZhciBhdXRvSWRTZWVkID0gMDsNCg0KICAgIHZhciBnZXRJZCA9IGZ1bmN0aW9uKGVsLCBhdXRvZ2VuKXsNCiAgICAgICAgaWYodHlwZW9mIGVsID09ICJzdHJpbmciKXsNCiAgICAgICAgICAgIHJldHVybiBlbDsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgaWQgPSBlbC5pZDsNCiAgICAgICAgaWYoIWlkICYmIGF1dG9nZW4gIT09IGZhbHNlKXsNCiAgICAgICAgICAgIGlkID0gImV4dGRkLSIgKyAoKythdXRvSWRTZWVkKTsNCiAgICAgICAgICAgIGVsLmlkID0gaWQ7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGlkOw0KICAgIH07DQogICAgDQogICAgcmV0dXJuIHsNCiAgICANCiAgICAgICAgcmVnaXN0ZXIgOiBmdW5jdGlvbihlbCwgZGF0YSl7DQogICAgICAgICAgICBkYXRhID0gZGF0YSB8fCB7fTsNCiAgICAgICAgICAgIGlmKHR5cGVvZiBlbCA9PSAic3RyaW5nIil7DQogICAgICAgICAgICAgICAgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBkYXRhLmRkZWwgPSBlbDsNCiAgICAgICAgICAgIGVsZW1lbnRzW2dldElkKGVsKV0gPSBkYXRhOw0KICAgICAgICAgICAgaWYoZGF0YS5pc0hhbmRsZSAhPT0gZmFsc2Upew0KICAgICAgICAgICAgICAgIGhhbmRsZXNbZGF0YS5kZGVsLmlkXSA9IGRhdGE7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZihkYXRhLmhhbmRsZXMpew0KICAgICAgICAgICAgICAgIHZhciBocyA9IGRhdGEuaGFuZGxlczsNCiAgICAgICAgICAgICAgICBmb3IodmFyIGkgPSAwLCBsZW4gPSBocy5sZW5ndGg7IGkgPCBsZW47IGkrKyl7DQogICAgICAgICAgICAgICAgCWhhbmRsZXNbZ2V0SWQoaHNbaV0pXSA9IGRhdGE7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KDQogICAgDQogICAgICAgIHVucmVnaXN0ZXIgOiBmdW5jdGlvbihlbCl7DQogICAgICAgICAgICB2YXIgaWQgPSBnZXRJZChlbCwgZmFsc2UpOw0KICAgICAgICAgICAgdmFyIGRhdGEgPSBlbGVtZW50c1tpZF07DQogICAgICAgICAgICBpZihkYXRhKXsNCiAgICAgICAgICAgICAgICBkZWxldGUgZWxlbWVudHNbaWRdOw0KICAgICAgICAgICAgICAgIGlmKGRhdGEuaGFuZGxlcyl7DQogICAgICAgICAgICAgICAgICAgIHZhciBocyA9IGRhdGEuaGFuZGxlczsNCiAgICAgICAgICAgICAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gaHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspew0KICAgICAgICAgICAgICAgICAgICAJZGVsZXRlIGhhbmRsZXNbZ2V0SWQoaHNbaV0sIGZhbHNlKV07DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0sDQoNCiAgICANCiAgICAgICAgZ2V0SGFuZGxlIDogZnVuY3Rpb24oaWQpew0KICAgICAgICAgICAgaWYodHlwZW9mIGlkICE9ICJzdHJpbmciKXsgCiAgICAgICAgICAgICAgICBpZCA9IGlkLmlkOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXNbaWRdOw0KICAgICAgICB9LA0KDQogICAgDQogICAgICAgIGdldEhhbmRsZUZyb21FdmVudCA6IGZ1bmN0aW9uKGUpew0KICAgICAgICAgICAgdmFyIHQgPSBFeHQubGliLkV2ZW50LmdldFRhcmdldChlKTsNCiAgICAgICAgICAgIHJldHVybiB0ID8gaGFuZGxlc1t0LmlkXSA6IG51bGw7DQogICAgICAgIH0sDQoNCiAgICANCiAgICAgICAgZ2V0VGFyZ2V0IDogZnVuY3Rpb24oaWQpew0KICAgICAgICAgICAgaWYodHlwZW9mIGlkICE9ICJzdHJpbmciKXsgCiAgICAgICAgICAgICAgICBpZCA9IGlkLmlkOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRzW2lkXTsNCiAgICAgICAgfSwNCg0KICAgIA0KICAgICAgICBnZXRUYXJnZXRGcm9tRXZlbnQgOiBmdW5jdGlvbihlKXsNCiAgICAgICAgICAgIHZhciB0ID0gRXh0LmxpYi5FdmVudC5nZXRUYXJnZXQoZSk7DQogICAgICAgICAgICByZXR1cm4gdCA/IGVsZW1lbnRzW3QuaWRdIHx8IGhhbmRsZXNbdC5pZF0gOiBudWxsOw0KICAgICAgICB9DQogICAgfTsNCn0oKTsKDQpFeHQuZGQuU3RhdHVzUHJveHkgPSBmdW5jdGlvbihjb25maWcpew0KICAgIEV4dC5hcHBseSh0aGlzLCBjb25maWcpOw0KICAgIHRoaXMuaWQgPSB0aGlzLmlkIHx8IEV4dC5pZCgpOw0KICAgIHRoaXMuZWwgPSBuZXcgRXh0LkxheWVyKHsNCiAgICAgICAgZGg6IHsNCiAgICAgICAgICAgIGlkOiB0aGlzLmlkLCB0YWc6ICJkaXYiLCBjbHM6ICJ4LWRkLWRyYWctcHJveHkgIit0aGlzLmRyb3BOb3RBbGxvd2VkLCBjaGlsZHJlbjogWw0KICAgICAgICAgICAgICAgIHt0YWc6ICJkaXYiLCBjbHM6ICJ4LWRkLWRyb3AtaWNvbiJ9LA0KICAgICAgICAgICAgICAgIHt0YWc6ICJkaXYiLCBjbHM6ICJ4LWRkLWRyYWctZ2hvc3QifQ0KICAgICAgICAgICAgXQ0KICAgICAgICB9LCANCiAgICAgICAgc2hhZG93OiAhY29uZmlnIHx8IGNvbmZpZy5zaGFkb3cgIT09IGZhbHNlDQogICAgfSk7DQogICAgdGhpcy5naG9zdCA9IEV4dC5nZXQodGhpcy5lbC5kb20uY2hpbGROb2Rlc1sxXSk7DQogICAgdGhpcy5kcm9wU3RhdHVzID0gdGhpcy5kcm9wTm90QWxsb3dlZDsNCn07DQoNCkV4dC5kZC5TdGF0dXNQcm94eS5wcm90b3R5cGUgPSB7DQogICAgDQogICAgZHJvcEFsbG93ZWQgOiAieC1kZC1kcm9wLW9rIiwNCiAgICANCiAgICBkcm9wTm90QWxsb3dlZCA6ICJ4LWRkLWRyb3Atbm9kcm9wIiwNCg0KICAgIA0KICAgIHNldFN0YXR1cyA6IGZ1bmN0aW9uKGNzc0NsYXNzKXsNCiAgICAgICAgY3NzQ2xhc3MgPSBjc3NDbGFzcyB8fCB0aGlzLmRyb3BOb3RBbGxvd2VkOw0KICAgICAgICBpZih0aGlzLmRyb3BTdGF0dXMgIT0gY3NzQ2xhc3Mpew0KICAgICAgICAgICAgdGhpcy5lbC5yZXBsYWNlQ2xhc3ModGhpcy5kcm9wU3RhdHVzLCBjc3NDbGFzcyk7DQogICAgICAgICAgICB0aGlzLmRyb3BTdGF0dXMgPSBjc3NDbGFzczsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICANCiAgICByZXNldCA6IGZ1bmN0aW9uKGNsZWFyR2hvc3Qpew0KICAgICAgICB0aGlzLmVsLmRvbS5jbGFzc05hbWUgPSAieC1kZC1kcmFnLXByb3h5ICIgKyB0aGlzLmRyb3BOb3RBbGxvd2VkOw0KICAgICAgICB0aGlzLmRyb3BTdGF0dXMgPSB0aGlzLmRyb3BOb3RBbGxvd2VkOw0KICAgICAgICBpZihjbGVhckdob3N0KXsNCiAgICAgICAgICAgIHRoaXMuZ2hvc3QudXBkYXRlKCIiKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICANCiAgICB1cGRhdGUgOiBmdW5jdGlvbihodG1sKXsNCiAgICAgICAgaWYodHlwZW9mIGh0bWwgPT0gInN0cmluZyIpew0KICAgICAgICAgICAgdGhpcy5naG9zdC51cGRhdGUoaHRtbCk7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgdGhpcy5naG9zdC51cGRhdGUoIiIpOw0KICAgICAgICAgICAgaHRtbC5zdHlsZS5tYXJnaW4gPSAiMCI7DQogICAgICAgICAgICB0aGlzLmdob3N0LmRvbS5hcHBlbmRDaGlsZChodG1sKTsNCiAgICAgICAgfSAgICAgICAgDQogICAgfSwNCg0KICAgIA0KICAgIGdldEVsIDogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIHRoaXMuZWw7DQogICAgfSwNCg0KICAgIA0KICAgIGdldEdob3N0IDogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIHRoaXMuZ2hvc3Q7DQogICAgfSwNCg0KICAgIA0KICAgIGhpZGUgOiBmdW5jdGlvbihjbGVhcil7DQogICAgICAgIHRoaXMuZWwuaGlkZSgpOw0KICAgICAgICBpZihjbGVhcil7DQogICAgICAgICAgICB0aGlzLnJlc2V0KHRydWUpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIHN0b3AgOiBmdW5jdGlvbigpew0KICAgICAgICBpZih0aGlzLmFuaW0gJiYgdGhpcy5hbmltLmlzQW5pbWF0ZWQgJiYgdGhpcy5hbmltLmlzQW5pbWF0ZWQoKSl7DQogICAgICAgICAgICB0aGlzLmFuaW0uc3RvcCgpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIHNob3cgOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLmVsLnNob3coKTsNCiAgICB9LA0KDQogICAgDQogICAgc3luYyA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHRoaXMuZWwuc3luYygpOw0KICAgIH0sDQoNCiAgICANCiAgICByZXBhaXIgOiBmdW5jdGlvbih4eSwgY2FsbGJhY2ssIHNjb3BlKXsNCiAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrOw0KICAgICAgICB0aGlzLnNjb3BlID0gc2NvcGU7DQogICAgICAgIGlmKHh5ICYmIHRoaXMuYW5pbVJlcGFpciAhPT0gZmFsc2Upew0KICAgICAgICAgICAgdGhpcy5lbC5hZGRDbGFzcygieC1kZC1kcmFnLXJlcGFpciIpOw0KICAgICAgICAgICAgdGhpcy5lbC5oaWRlVW5kZXJzKHRydWUpOw0KICAgICAgICAgICAgdGhpcy5hbmltID0gdGhpcy5lbC5zaGlmdCh7DQogICAgICAgICAgICAgICAgZHVyYXRpb246IHRoaXMucmVwYWlyRHVyYXRpb24gfHwgLjUsDQogICAgICAgICAgICAgICAgZWFzaW5nOiAnZWFzZU91dCcsDQogICAgICAgICAgICAgICAgeHk6IHh5LA0KICAgICAgICAgICAgICAgIHN0b3BGeDogdHJ1ZSwNCiAgICAgICAgICAgICAgICBjYWxsYmFjazogdGhpcy5hZnRlclJlcGFpciwNCiAgICAgICAgICAgICAgICBzY29wZTogdGhpcw0KICAgICAgICAgICAgfSk7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgdGhpcy5hZnRlclJlcGFpcigpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIAogICAgYWZ0ZXJSZXBhaXIgOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLmhpZGUodHJ1ZSk7DQogICAgICAgIGlmKHR5cGVvZiB0aGlzLmNhbGxiYWNrID09ICJmdW5jdGlvbiIpew0KICAgICAgICAgICAgdGhpcy5jYWxsYmFjay5jYWxsKHRoaXMuc2NvcGUgfHwgdGhpcyk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5jYWxsYmFjayA9IG51bGw7DQogICAgICAgIHRoaXMuc2NvcGUgPSBudWxsOw0KICAgIH0NCn07Cg0KRXh0LmRkLkRyYWdTb3VyY2UgPSBmdW5jdGlvbihlbCwgY29uZmlnKXsNCiAgICB0aGlzLmVsID0gRXh0LmdldChlbCk7DQogICAgdGhpcy5kcmFnRGF0YSA9IHt9Ow0KICAgIA0KICAgIEV4dC5hcHBseSh0aGlzLCBjb25maWcpOw0KICAgIA0KICAgIGlmKCF0aGlzLnByb3h5KXsNCiAgICAgICAgdGhpcy5wcm94eSA9IG5ldyBFeHQuZGQuU3RhdHVzUHJveHkoKTsNCiAgICB9DQoNCiAgICBFeHQuZGQuRHJhZ1NvdXJjZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgdGhpcy5lbC5kb20sIHRoaXMuZGRHcm91cCB8fCB0aGlzLmdyb3VwLA0KICAgICAgICAgIHtkcmFnRWxJZCA6IHRoaXMucHJveHkuaWQsIHJlc2l6ZUZyYW1lOiBmYWxzZSwgaXNUYXJnZXQ6IGZhbHNlLCBzY3JvbGw6IHRoaXMuc2Nyb2xsID09PSB0cnVlfSk7DQogICAgDQogICAgdGhpcy5kcmFnZ2luZyA9IGZhbHNlOw0KfTsNCg0KRXh0LmV4dGVuZChFeHQuZGQuRHJhZ1NvdXJjZSwgRXh0LmRkLkREUHJveHksIHsNCiAgICANCiAgICBkcm9wQWxsb3dlZCA6ICJ4LWRkLWRyb3Atb2siLA0KICAgIA0KICAgIGRyb3BOb3RBbGxvd2VkIDogIngtZGQtZHJvcC1ub2Ryb3AiLA0KDQogICAgDQogICAgZ2V0RHJhZ0RhdGEgOiBmdW5jdGlvbihlKXsNCiAgICAgICAgcmV0dXJuIHRoaXMuZHJhZ0RhdGE7DQogICAgfSwNCg0KICAgIAogICAgb25EcmFnRW50ZXIgOiBmdW5jdGlvbihlLCBpZCl7DQogICAgICAgIHZhciB0YXJnZXQgPSBFeHQuZGQuRHJhZ0Ryb3BNZ3IuZ2V0RERCeUlkKGlkKTsNCiAgICAgICAgdGhpcy5jYWNoZWRUYXJnZXQgPSB0YXJnZXQ7DQogICAgICAgIGlmKHRoaXMuYmVmb3JlRHJhZ0VudGVyKHRhcmdldCwgZSwgaWQpICE9PSBmYWxzZSl7DQogICAgICAgICAgICBpZih0YXJnZXQuaXNOb3RpZnlUYXJnZXQpew0KICAgICAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0YXJnZXQubm90aWZ5RW50ZXIodGhpcywgZSwgdGhpcy5kcmFnRGF0YSk7DQogICAgICAgICAgICAgICAgdGhpcy5wcm94eS5zZXRTdGF0dXMoc3RhdHVzKTsNCiAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgIHRoaXMucHJveHkuc2V0U3RhdHVzKHRoaXMuZHJvcEFsbG93ZWQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBpZih0aGlzLmFmdGVyRHJhZ0VudGVyKXsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB0aGlzLmFmdGVyRHJhZ0VudGVyKHRhcmdldCwgZSwgaWQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIGJlZm9yZURyYWdFbnRlciA6IGZ1bmN0aW9uKHRhcmdldCwgZSwgaWQpew0KICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9LA0KDQogICAgCiAgICBhbGlnbkVsV2l0aE1vdXNlOiBmdW5jdGlvbigpIHsNCiAgICAgICAgRXh0LmRkLkRyYWdTb3VyY2Uuc3VwZXJjbGFzcy5hbGlnbkVsV2l0aE1vdXNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7DQogICAgICAgIHRoaXMucHJveHkuc3luYygpOw0KICAgIH0sDQoNCiAgICAKICAgIG9uRHJhZ092ZXIgOiBmdW5jdGlvbihlLCBpZCl7DQogICAgICAgIHZhciB0YXJnZXQgPSB0aGlzLmNhY2hlZFRhcmdldCB8fCBFeHQuZGQuRHJhZ0Ryb3BNZ3IuZ2V0RERCeUlkKGlkKTsNCiAgICAgICAgaWYodGhpcy5iZWZvcmVEcmFnT3Zlcih0YXJnZXQsIGUsIGlkKSAhPT0gZmFsc2Upew0KICAgICAgICAgICAgaWYodGFyZ2V0LmlzTm90aWZ5VGFyZ2V0KXsNCiAgICAgICAgICAgICAgICB2YXIgc3RhdHVzID0gdGFyZ2V0Lm5vdGlmeU92ZXIodGhpcywgZSwgdGhpcy5kcmFnRGF0YSk7DQogICAgICAgICAgICAgICAgdGhpcy5wcm94eS5zZXRTdGF0dXMoc3RhdHVzKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYodGhpcy5hZnRlckRyYWdPdmVyKXsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB0aGlzLmFmdGVyRHJhZ092ZXIodGFyZ2V0LCBlLCBpZCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgDQogICAgYmVmb3JlRHJhZ092ZXIgOiBmdW5jdGlvbih0YXJnZXQsIGUsIGlkKXsNCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgfSwNCg0KICAgIAogICAgb25EcmFnT3V0IDogZnVuY3Rpb24oZSwgaWQpew0KICAgICAgICB2YXIgdGFyZ2V0ID0gdGhpcy5jYWNoZWRUYXJnZXQgfHwgRXh0LmRkLkRyYWdEcm9wTWdyLmdldEREQnlJZChpZCk7DQogICAgICAgIGlmKHRoaXMuYmVmb3JlRHJhZ091dCh0YXJnZXQsIGUsIGlkKSAhPT0gZmFsc2Upew0KICAgICAgICAgICAgaWYodGFyZ2V0LmlzTm90aWZ5VGFyZ2V0KXsNCiAgICAgICAgICAgICAgICB0YXJnZXQubm90aWZ5T3V0KHRoaXMsIGUsIHRoaXMuZHJhZ0RhdGEpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5wcm94eS5yZXNldCgpOw0KICAgICAgICAgICAgaWYodGhpcy5hZnRlckRyYWdPdXQpew0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHRoaXMuYWZ0ZXJEcmFnT3V0KHRhcmdldCwgZSwgaWQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHRoaXMuY2FjaGVkVGFyZ2V0ID0gbnVsbDsNCiAgICB9LA0KDQogICAgDQogICAgYmVmb3JlRHJhZ091dCA6IGZ1bmN0aW9uKHRhcmdldCwgZSwgaWQpew0KICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9LA0KICAgIA0KICAgIAogICAgb25EcmFnRHJvcCA6IGZ1bmN0aW9uKGUsIGlkKXsNCiAgICAgICAgdmFyIHRhcmdldCA9IHRoaXMuY2FjaGVkVGFyZ2V0IHx8IEV4dC5kZC5EcmFnRHJvcE1nci5nZXREREJ5SWQoaWQpOw0KICAgICAgICBpZih0aGlzLmJlZm9yZURyYWdEcm9wKHRhcmdldCwgZSwgaWQpICE9PSBmYWxzZSl7DQogICAgICAgICAgICBpZih0YXJnZXQuaXNOb3RpZnlUYXJnZXQpew0KICAgICAgICAgICAgICAgIGlmKHRhcmdldC5ub3RpZnlEcm9wKHRoaXMsIGUsIHRoaXMuZHJhZ0RhdGEpKXsgCiAgICAgICAgICAgICAgICAgICAgdGhpcy5vblZhbGlkRHJvcCh0YXJnZXQsIGUsIGlkKTsNCiAgICAgICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkludmFsaWREcm9wKHRhcmdldCwgZSwgaWQpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgIHRoaXMub25WYWxpZERyb3AodGFyZ2V0LCBlLCBpZCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICANCiAgICAgICAgICAgIGlmKHRoaXMuYWZ0ZXJEcmFnRHJvcCl7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdGhpcy5hZnRlckRyYWdEcm9wKHRhcmdldCwgZSwgaWQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGRlbGV0ZSB0aGlzLmNhY2hlZFRhcmdldDsNCiAgICB9LA0KDQogICAgDQogICAgYmVmb3JlRHJhZ0Ryb3AgOiBmdW5jdGlvbih0YXJnZXQsIGUsIGlkKXsNCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgfSwNCg0KICAgIAogICAgb25WYWxpZERyb3AgOiBmdW5jdGlvbih0YXJnZXQsIGUsIGlkKXsNCiAgICAgICAgdGhpcy5oaWRlUHJveHkoKTsNCiAgICAgICAgaWYodGhpcy5hZnRlclZhbGlkRHJvcCl7DQogICAgICAgICAgICANCiAgICAgICAgICAgIHRoaXMuYWZ0ZXJWYWxpZERyb3AodGFyZ2V0LCBlLCBpZCk7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgCiAgICBnZXRSZXBhaXJYWSA6IGZ1bmN0aW9uKGUsIGRhdGEpew0KICAgICAgICByZXR1cm4gdGhpcy5lbC5nZXRYWSgpOyAgDQogICAgfSwNCg0KICAgIAogICAgb25JbnZhbGlkRHJvcCA6IGZ1bmN0aW9uKHRhcmdldCwgZSwgaWQpew0KICAgICAgICB0aGlzLmJlZm9yZUludmFsaWREcm9wKHRhcmdldCwgZSwgaWQpOw0KICAgICAgICBpZih0aGlzLmNhY2hlZFRhcmdldCl7DQogICAgICAgICAgICBpZih0aGlzLmNhY2hlZFRhcmdldC5pc05vdGlmeVRhcmdldCl7DQogICAgICAgICAgICAgICAgdGhpcy5jYWNoZWRUYXJnZXQubm90aWZ5T3V0KHRoaXMsIGUsIHRoaXMuZHJhZ0RhdGEpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5jYWNoZVRhcmdldCA9IG51bGw7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5wcm94eS5yZXBhaXIodGhpcy5nZXRSZXBhaXJYWShlLCB0aGlzLmRyYWdEYXRhKSwgdGhpcy5hZnRlclJlcGFpciwgdGhpcyk7DQoNCiAgICAgICAgaWYodGhpcy5hZnRlckludmFsaWREcm9wKXsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgdGhpcy5hZnRlckludmFsaWREcm9wKGUsIGlkKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICAKICAgIGFmdGVyUmVwYWlyIDogZnVuY3Rpb24oKXsNCiAgICAgICAgaWYoRXh0LmVuYWJsZUZ4KXsNCiAgICAgICAgICAgIHRoaXMuZWwuaGlnaGxpZ2h0KHRoaXMuaGxDb2xvciB8fCAiYzNkYWY5Iik7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5kcmFnZ2luZyA9IGZhbHNlOw0KICAgIH0sDQoNCiAgICANCiAgICBiZWZvcmVJbnZhbGlkRHJvcCA6IGZ1bmN0aW9uKHRhcmdldCwgZSwgaWQpew0KICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9LA0KDQogICAgCiAgICBoYW5kbGVNb3VzZURvd24gOiBmdW5jdGlvbihlKXsNCiAgICAgICAgaWYodGhpcy5kcmFnZ2luZykgew0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQogICAgICAgIHZhciBkYXRhID0gdGhpcy5nZXREcmFnRGF0YShlKTsNCiAgICAgICAgaWYoZGF0YSAmJiB0aGlzLm9uQmVmb3JlRHJhZyhkYXRhLCBlKSAhPT0gZmFsc2Upew0KICAgICAgICAgICAgdGhpcy5kcmFnRGF0YSA9IGRhdGE7DQogICAgICAgICAgICB0aGlzLnByb3h5LnN0b3AoKTsNCiAgICAgICAgICAgIEV4dC5kZC5EcmFnU291cmNlLnN1cGVyY2xhc3MuaGFuZGxlTW91c2VEb3duLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7DQogICAgICAgIH0gDQogICAgfSwNCg0KICAgIA0KICAgIG9uQmVmb3JlRHJhZyA6IGZ1bmN0aW9uKGRhdGEsIGUpew0KICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9LA0KDQogICAgDQogICAgb25TdGFydERyYWcgOiBFeHQuZW1wdHlGbiwNCg0KICAgIAogICAgc3RhcnREcmFnIDogZnVuY3Rpb24oeCwgeSl7DQogICAgICAgIHRoaXMucHJveHkucmVzZXQoKTsNCiAgICAgICAgdGhpcy5kcmFnZ2luZyA9IHRydWU7DQogICAgICAgIHRoaXMucHJveHkudXBkYXRlKCIiKTsNCiAgICAgICAgdGhpcy5vbkluaXREcmFnKHgsIHkpOw0KICAgICAgICB0aGlzLnByb3h5LnNob3coKTsNCiAgICB9LA0KDQogICAgCiAgICBvbkluaXREcmFnIDogZnVuY3Rpb24oeCwgeSl7DQogICAgICAgIHZhciBjbG9uZSA9IHRoaXMuZWwuZG9tLmNsb25lTm9kZSh0cnVlKTsNCiAgICAgICAgY2xvbmUuaWQgPSBFeHQuaWQoKTsgCiAgICAgICAgdGhpcy5wcm94eS51cGRhdGUoY2xvbmUpOw0KICAgICAgICB0aGlzLm9uU3RhcnREcmFnKHgsIHkpOw0KICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9LA0KDQogICAgDQogICAgZ2V0UHJveHkgOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gdGhpcy5wcm94eTsgIA0KICAgIH0sDQoNCiAgICANCiAgICBoaWRlUHJveHkgOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLnByb3h5LmhpZGUoKTsgIA0KICAgICAgICB0aGlzLnByb3h5LnJlc2V0KHRydWUpOw0KICAgICAgICB0aGlzLmRyYWdnaW5nID0gZmFsc2U7DQogICAgfSwNCg0KICAgIAogICAgdHJpZ2dlckNhY2hlUmVmcmVzaCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIEV4dC5kZC5ERE0ucmVmcmVzaENhY2hlKHRoaXMuZ3JvdXBzKTsNCiAgICB9LA0KDQogICAgCiAgICBiNEVuZERyYWc6IGZ1bmN0aW9uKGUpIHsNCiAgICB9LA0KDQogICAgCiAgICBlbmREcmFnIDogZnVuY3Rpb24oZSl7DQogICAgICAgIHRoaXMub25FbmREcmFnKHRoaXMuZHJhZ0RhdGEsIGUpOw0KICAgIH0sDQoNCiAgICAKICAgIG9uRW5kRHJhZyA6IGZ1bmN0aW9uKGRhdGEsIGUpew0KICAgIH0sDQogICAgDQogICAgCiAgICBhdXRvT2Zmc2V0IDogZnVuY3Rpb24oeCwgeSkgew0KICAgICAgICB0aGlzLnNldERlbHRhKC0xMiwgLTIwKTsNCiAgICB9ICAgIA0KfSk7Cg0KRXh0LmRkLkRyb3BUYXJnZXQgPSBmdW5jdGlvbihlbCwgY29uZmlnKXsNCiAgICB0aGlzLmVsID0gRXh0LmdldChlbCk7DQogICAgDQogICAgRXh0LmFwcGx5KHRoaXMsIGNvbmZpZyk7DQogICAgDQogICAgaWYodGhpcy5jb250YWluZXJTY3JvbGwpew0KICAgICAgICBFeHQuZGQuU2Nyb2xsTWFuYWdlci5yZWdpc3Rlcih0aGlzLmVsKTsNCiAgICB9DQogICAgDQogICAgRXh0LmRkLkRyb3BUYXJnZXQuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHRoaXMuZWwuZG9tLCB0aGlzLmRkR3JvdXAgfHwgdGhpcy5ncm91cCwgDQogICAgICAgICAge2lzVGFyZ2V0OiB0cnVlfSk7DQoNCn07DQoNCkV4dC5leHRlbmQoRXh0LmRkLkRyb3BUYXJnZXQsIEV4dC5kZC5ERFRhcmdldCwgew0KICAgIA0KICAgIA0KICAgIGRyb3BBbGxvd2VkIDogIngtZGQtZHJvcC1vayIsDQogICAgDQogICAgZHJvcE5vdEFsbG93ZWQgOiAieC1kZC1kcm9wLW5vZHJvcCIsDQoNCiAgICAKICAgIGlzVGFyZ2V0IDogdHJ1ZSwNCg0KICAgIAogICAgaXNOb3RpZnlUYXJnZXQgOiB0cnVlLA0KDQogICAgDQogICAgbm90aWZ5RW50ZXIgOiBmdW5jdGlvbihkZCwgZSwgZGF0YSl7DQogICAgICAgIGlmKHRoaXMub3ZlckNsYXNzKXsNCiAgICAgICAgICAgIHRoaXMuZWwuYWRkQ2xhc3ModGhpcy5vdmVyQ2xhc3MpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0aGlzLmRyb3BBbGxvd2VkOw0KICAgIH0sDQoNCiAgICANCiAgICBub3RpZnlPdmVyIDogZnVuY3Rpb24oZGQsIGUsIGRhdGEpew0KICAgICAgICByZXR1cm4gdGhpcy5kcm9wQWxsb3dlZDsNCiAgICB9LA0KDQogICAgDQogICAgbm90aWZ5T3V0IDogZnVuY3Rpb24oZGQsIGUsIGRhdGEpew0KICAgICAgICBpZih0aGlzLm92ZXJDbGFzcyl7DQogICAgICAgICAgICB0aGlzLmVsLnJlbW92ZUNsYXNzKHRoaXMub3ZlckNsYXNzKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICANCiAgICBub3RpZnlEcm9wIDogZnVuY3Rpb24oZGQsIGUsIGRhdGEpew0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfQ0KfSk7Cg0KRXh0LmRkLkRyYWdab25lID0gZnVuY3Rpb24oZWwsIGNvbmZpZyl7DQogICAgRXh0LmRkLkRyYWdab25lLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBlbCwgY29uZmlnKTsNCiAgICBpZih0aGlzLmNvbnRhaW5lclNjcm9sbCl7DQogICAgICAgIEV4dC5kZC5TY3JvbGxNYW5hZ2VyLnJlZ2lzdGVyKHRoaXMuZWwpOw0KICAgIH0NCn07DQoNCkV4dC5leHRlbmQoRXh0LmRkLkRyYWdab25lLCBFeHQuZGQuRHJhZ1NvdXJjZSwgew0KICAgIA0KICAgIA0KDQogICAgDQogICAgZ2V0RHJhZ0RhdGEgOiBmdW5jdGlvbihlKXsNCiAgICAgICAgcmV0dXJuIEV4dC5kZC5SZWdpc3RyeS5nZXRIYW5kbGVGcm9tRXZlbnQoZSk7DQogICAgfSwNCiAgICANCiAgICANCiAgICBvbkluaXREcmFnIDogZnVuY3Rpb24oeCwgeSl7DQogICAgICAgIHRoaXMucHJveHkudXBkYXRlKHRoaXMuZHJhZ0RhdGEuZGRlbC5jbG9uZU5vZGUodHJ1ZSkpOw0KICAgICAgICB0aGlzLm9uU3RhcnREcmFnKHgsIHkpOw0KICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9LA0KICAgIA0KICAgIA0KICAgIGFmdGVyUmVwYWlyIDogZnVuY3Rpb24oKXsNCiAgICAgICAgaWYoRXh0LmVuYWJsZUZ4KXsNCiAgICAgICAgICAgIEV4dC5FbGVtZW50LmZseSh0aGlzLmRyYWdEYXRhLmRkZWwpLmhpZ2hsaWdodCh0aGlzLmhsQ29sb3IgfHwgImMzZGFmOSIpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTsNCiAgICB9LA0KDQogICAgDQogICAgZ2V0UmVwYWlyWFkgOiBmdW5jdGlvbihlKXsNCiAgICAgICAgcmV0dXJuIEV4dC5FbGVtZW50LmZseSh0aGlzLmRyYWdEYXRhLmRkZWwpLmdldFhZKCk7ICANCiAgICB9DQp9KTsKDQpFeHQuZGQuRHJvcFpvbmUgPSBmdW5jdGlvbihlbCwgY29uZmlnKXsNCiAgICBFeHQuZGQuRHJvcFpvbmUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIGVsLCBjb25maWcpOw0KfTsNCg0KRXh0LmV4dGVuZChFeHQuZGQuRHJvcFpvbmUsIEV4dC5kZC5Ecm9wVGFyZ2V0LCB7DQogICAgDQogICAgZ2V0VGFyZ2V0RnJvbUV2ZW50IDogZnVuY3Rpb24oZSl7DQogICAgICAgIHJldHVybiBFeHQuZGQuUmVnaXN0cnkuZ2V0VGFyZ2V0RnJvbUV2ZW50KGUpOw0KICAgIH0sDQoNCiAgICANCiAgICBvbk5vZGVFbnRlciA6IGZ1bmN0aW9uKG4sIGRkLCBlLCBkYXRhKXsNCiAgICAgICAgDQogICAgfSwNCg0KICAgIA0KICAgIG9uTm9kZU92ZXIgOiBmdW5jdGlvbihuLCBkZCwgZSwgZGF0YSl7DQogICAgICAgIHJldHVybiB0aGlzLmRyb3BBbGxvd2VkOw0KICAgIH0sDQoNCiAgICANCiAgICBvbk5vZGVPdXQgOiBmdW5jdGlvbihuLCBkZCwgZSwgZGF0YSl7DQogICAgICAgIA0KICAgIH0sDQoNCiAgICANCiAgICBvbk5vZGVEcm9wIDogZnVuY3Rpb24obiwgZGQsIGUsIGRhdGEpew0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfSwNCg0KICAgIA0KICAgIG9uQ29udGFpbmVyT3ZlciA6IGZ1bmN0aW9uKGRkLCBlLCBkYXRhKXsNCiAgICAgICAgcmV0dXJuIHRoaXMuZHJvcE5vdEFsbG93ZWQ7DQogICAgfSwNCg0KICAgIA0KICAgIG9uQ29udGFpbmVyRHJvcCA6IGZ1bmN0aW9uKGRkLCBlLCBkYXRhKXsNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH0sDQoNCiAgICANCiAgICBub3RpZnlFbnRlciA6IGZ1bmN0aW9uKGRkLCBlLCBkYXRhKXsNCiAgICAgICAgcmV0dXJuIHRoaXMuZHJvcE5vdEFsbG93ZWQ7DQogICAgfSwNCg0KICAgIA0KICAgIG5vdGlmeU92ZXIgOiBmdW5jdGlvbihkZCwgZSwgZGF0YSl7DQogICAgICAgIHZhciBuID0gdGhpcy5nZXRUYXJnZXRGcm9tRXZlbnQoZSk7DQogICAgICAgIGlmKCFuKXsgCiAgICAgICAgICAgIGlmKHRoaXMubGFzdE92ZXJOb2RlKXsNCiAgICAgICAgICAgICAgICB0aGlzLm9uTm9kZU91dCh0aGlzLmxhc3RPdmVyTm9kZSwgZGQsIGUsIGRhdGEpOw0KICAgICAgICAgICAgICAgIHRoaXMubGFzdE92ZXJOb2RlID0gbnVsbDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiB0aGlzLm9uQ29udGFpbmVyT3ZlcihkZCwgZSwgZGF0YSk7DQogICAgICAgIH0NCiAgICAgICAgaWYodGhpcy5sYXN0T3Zlck5vZGUgIT0gbil7DQogICAgICAgICAgICBpZih0aGlzLmxhc3RPdmVyTm9kZSl7DQogICAgICAgICAgICAgICAgdGhpcy5vbk5vZGVPdXQodGhpcy5sYXN0T3Zlck5vZGUsIGRkLCBlLCBkYXRhKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMub25Ob2RlRW50ZXIobiwgZGQsIGUsIGRhdGEpOw0KICAgICAgICAgICAgdGhpcy5sYXN0T3Zlck5vZGUgPSBuOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0aGlzLm9uTm9kZU92ZXIobiwgZGQsIGUsIGRhdGEpOw0KICAgIH0sDQoNCiAgICANCiAgICBub3RpZnlPdXQgOiBmdW5jdGlvbihkZCwgZSwgZGF0YSl7DQogICAgICAgIGlmKHRoaXMubGFzdE92ZXJOb2RlKXsNCiAgICAgICAgICAgIHRoaXMub25Ob2RlT3V0KHRoaXMubGFzdE92ZXJOb2RlLCBkZCwgZSwgZGF0YSk7DQogICAgICAgICAgICB0aGlzLmxhc3RPdmVyTm9kZSA9IG51bGw7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgDQogICAgbm90aWZ5RHJvcCA6IGZ1bmN0aW9uKGRkLCBlLCBkYXRhKXsNCiAgICAgICAgaWYodGhpcy5sYXN0T3Zlck5vZGUpew0KICAgICAgICAgICAgdGhpcy5vbk5vZGVPdXQodGhpcy5sYXN0T3Zlck5vZGUsIGRkLCBlLCBkYXRhKTsNCiAgICAgICAgICAgIHRoaXMubGFzdE92ZXJOb2RlID0gbnVsbDsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgbiA9IHRoaXMuZ2V0VGFyZ2V0RnJvbUV2ZW50KGUpOw0KICAgICAgICByZXR1cm4gbiA/DQogICAgICAgICAgICB0aGlzLm9uTm9kZURyb3AobiwgZGQsIGUsIGRhdGEpIDoNCiAgICAgICAgICAgIHRoaXMub25Db250YWluZXJEcm9wKGRkLCBlLCBkYXRhKTsNCiAgICB9LA0KDQogICAgCiAgICB0cmlnZ2VyQ2FjaGVSZWZyZXNoIDogZnVuY3Rpb24oKXsNCiAgICAgICAgRXh0LmRkLkRETS5yZWZyZXNoQ2FjaGUodGhpcy5ncm91cHMpOw0KICAgIH0gIA0KfSk7Cg0KDQpFeHQuZGF0YS5Tb3J0VHlwZXMgPSB7DQogICAgDQogICAgbm9uZSA6IGZ1bmN0aW9uKHMpew0KICAgICAgICByZXR1cm4gczsNCiAgICB9LA0KICAgIA0KICAgIA0KICAgIHN0cmlwVGFnc1JFIDogLzxcLz9bXj5dKz4vZ2ksDQogICAgDQogICAgDQogICAgYXNUZXh0IDogZnVuY3Rpb24ocyl7DQogICAgICAgIHJldHVybiBTdHJpbmcocykucmVwbGFjZSh0aGlzLnN0cmlwVGFnc1JFLCAiIik7DQogICAgfSwNCiAgICANCiAgICANCiAgICBhc1VDVGV4dCA6IGZ1bmN0aW9uKHMpew0KICAgICAgICByZXR1cm4gU3RyaW5nKHMpLnRvVXBwZXJDYXNlKCkucmVwbGFjZSh0aGlzLnN0cmlwVGFnc1JFLCAiIik7DQogICAgfSwNCiAgICANCiAgICANCiAgICBhc1VDU3RyaW5nIDogZnVuY3Rpb24ocykgew0KICAgIAlyZXR1cm4gU3RyaW5nKHMpLnRvVXBwZXJDYXNlKCk7DQogICAgfSwNCiAgICANCiAgICANCiAgICBhc0RhdGUgOiBmdW5jdGlvbihzKSB7DQogICAgICAgIGlmKCFzKXsNCiAgICAgICAgICAgIHJldHVybiAwOw0KICAgICAgICB9DQogICAgICAgIGlmKHMgaW5zdGFuY2VvZiBEYXRlKXsNCiAgICAgICAgICAgIHJldHVybiBzLmdldFRpbWUoKTsNCiAgICAgICAgfQ0KICAgIAlyZXR1cm4gRGF0ZS5wYXJzZShTdHJpbmcocykpOw0KICAgIH0sDQogICAgDQogICAgDQogICAgYXNGbG9hdCA6IGZ1bmN0aW9uKHMpIHsNCiAgICAJdmFyIHZhbCA9IHBhcnNlRmxvYXQoU3RyaW5nKHMpLnJlcGxhY2UoLywvZywgIiIpKTsNCiAgICAgICAgaWYoaXNOYU4odmFsKSkgdmFsID0gMDsNCiAgICAJcmV0dXJuIHZhbDsNCiAgICB9LA0KICAgIA0KICAgIA0KICAgIGFzSW50IDogZnVuY3Rpb24ocykgew0KICAgICAgICB2YXIgdmFsID0gcGFyc2VJbnQoU3RyaW5nKHMpLnJlcGxhY2UoLywvZywgIiIpKTsNCiAgICAgICAgaWYoaXNOYU4odmFsKSkgdmFsID0gMDsNCiAgICAJcmV0dXJuIHZhbDsNCiAgICB9DQp9OwoNCkV4dC5kYXRhLlJlY29yZCA9IGZ1bmN0aW9uKGRhdGEsIGlkKXsNCiAgICB0aGlzLmlkID0gKGlkIHx8IGlkID09PSAwKSA/IGlkIDogKytFeHQuZGF0YS5SZWNvcmQuQVVUT19JRDsNCiAgICB0aGlzLmRhdGEgPSBkYXRhOw0KfTsNCg0KDQpFeHQuZGF0YS5SZWNvcmQuY3JlYXRlID0gZnVuY3Rpb24obyl7DQogICAgdmFyIGYgPSBmdW5jdGlvbigpew0KICAgICAgICBmLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCiAgICB9Ow0KICAgIEV4dC5leHRlbmQoZiwgRXh0LmRhdGEuUmVjb3JkKTsNCiAgICB2YXIgcCA9IGYucHJvdG90eXBlOw0KICAgIHAuZmllbGRzID0gbmV3IEV4dC51dGlsLk1peGVkQ29sbGVjdGlvbihmYWxzZSwgZnVuY3Rpb24oZmllbGQpew0KICAgICAgICByZXR1cm4gZmllbGQubmFtZTsNCiAgICB9KTsNCiAgICBmb3IodmFyIGkgPSAwLCBsZW4gPSBvLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXsNCiAgICAgICAgcC5maWVsZHMuYWRkKG5ldyBFeHQuZGF0YS5GaWVsZChvW2ldKSk7DQogICAgfQ0KICAgIGYuZ2V0RmllbGQgPSBmdW5jdGlvbihuYW1lKXsNCiAgICAgICAgcmV0dXJuIHAuZmllbGRzLmdldChuYW1lKTsgIA0KICAgIH07DQogICAgcmV0dXJuIGY7DQp9Ow0KDQpFeHQuZGF0YS5SZWNvcmQuQVVUT19JRCA9IDEwMDA7DQpFeHQuZGF0YS5SZWNvcmQuRURJVCA9ICdlZGl0JzsNCkV4dC5kYXRhLlJlY29yZC5SRUpFQ1QgPSAncmVqZWN0JzsNCkV4dC5kYXRhLlJlY29yZC5DT01NSVQgPSAnY29tbWl0JzsNCg0KRXh0LmRhdGEuUmVjb3JkLnByb3RvdHlwZSA9IHsNCiAgICANCiAgICBkaXJ0eSA6IGZhbHNlLA0KICAgIGVkaXRpbmcgOiBmYWxzZSwNCiAgICBlcnJvcjogbnVsbCwNCiAgICBtb2RpZmllZDogbnVsbCwNCg0KICAgIAogICAgam9pbiA6IGZ1bmN0aW9uKHN0b3JlKXsNCiAgICAgICAgdGhpcy5zdG9yZSA9IHN0b3JlOw0KICAgIH0sDQoNCiAgICANCiAgICBzZXQgOiBmdW5jdGlvbihuYW1lLCB2YWx1ZSl7DQogICAgICAgIGlmKHRoaXMuZGF0YVtuYW1lXSA9PSB2YWx1ZSl7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7DQogICAgICAgIGlmKCF0aGlzLm1vZGlmaWVkKXsNCiAgICAgICAgICAgIHRoaXMubW9kaWZpZWQgPSB7fTsNCiAgICAgICAgfQ0KICAgICAgICBpZih0eXBlb2YgdGhpcy5tb2RpZmllZFtuYW1lXSA9PSAndW5kZWZpbmVkJyl7DQogICAgICAgICAgICB0aGlzLm1vZGlmaWVkW25hbWVdID0gdGhpcy5kYXRhW25hbWVdOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuZGF0YVtuYW1lXSA9IHZhbHVlOw0KICAgICAgICBpZighdGhpcy5lZGl0aW5nKXsNCiAgICAgICAgICAgIHRoaXMuc3RvcmUuYWZ0ZXJFZGl0KHRoaXMpOw0KICAgICAgICB9ICAgICAgIA0KICAgIH0sDQoNCiAgICANCiAgICBnZXQgOiBmdW5jdGlvbihuYW1lKXsNCiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVtuYW1lXTsgDQogICAgfSwNCg0KICAgIAogICAgYmVnaW5FZGl0IDogZnVuY3Rpb24oKXsNCiAgICAgICAgdGhpcy5lZGl0aW5nID0gdHJ1ZTsNCiAgICAgICAgdGhpcy5tb2RpZmllZCA9IHt9OyANCiAgICB9LA0KDQogICAgCiAgICBjYW5jZWxFZGl0IDogZnVuY3Rpb24oKXsNCiAgICAgICAgdGhpcy5lZGl0aW5nID0gZmFsc2U7DQogICAgICAgIGRlbGV0ZSB0aGlzLm1vZGlmaWVkOw0KICAgIH0sDQoNCiAgICAKICAgIGVuZEVkaXQgOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLmVkaXRpbmcgPSBmYWxzZTsNCiAgICAgICAgaWYodGhpcy5kaXJ0eSAmJiB0aGlzLnN0b3JlKXsNCiAgICAgICAgICAgIHRoaXMuc3RvcmUuYWZ0ZXJFZGl0KHRoaXMpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIHJlamVjdCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHZhciBtID0gdGhpcy5tb2RpZmllZDsNCiAgICAgICAgZm9yKHZhciBuIGluIG0pew0KICAgICAgICAgICAgaWYodHlwZW9mIG1bbl0gIT0gImZ1bmN0aW9uIil7DQogICAgICAgICAgICAgICAgdGhpcy5kYXRhW25dID0gbVtuXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7DQogICAgICAgIGRlbGV0ZSB0aGlzLm1vZGlmaWVkOw0KICAgICAgICB0aGlzLmVkaXRpbmcgPSBmYWxzZTsNCiAgICAgICAgaWYodGhpcy5zdG9yZSl7DQogICAgICAgICAgICB0aGlzLnN0b3JlLmFmdGVyUmVqZWN0KHRoaXMpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIGNvbW1pdCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTsNCiAgICAgICAgZGVsZXRlIHRoaXMubW9kaWZpZWQ7DQogICAgICAgIHRoaXMuZWRpdGluZyA9IGZhbHNlOw0KICAgICAgICBpZih0aGlzLnN0b3JlKXsNCiAgICAgICAgICAgIHRoaXMuc3RvcmUuYWZ0ZXJDb21taXQodGhpcyk7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgCiAgICBoYXNFcnJvciA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLmVycm9yICE9IG51bGw7DQogICAgfSwNCg0KICAgIAogICAgY2xlYXJFcnJvciA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHRoaXMuZXJyb3IgPSBudWxsOw0KICAgIH0sDQoNCiAgICANCiAgICBjb3B5IDogZnVuY3Rpb24obmV3SWQpIHsNCiAgICAgICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKEV4dC5hcHBseSh7fSwgdGhpcy5kYXRhKSwgbmV3SWQgfHwgdGhpcy5pZCk7DQogICAgfQ0KfTsKDQpFeHQuZGF0YS5TdG9yZSA9IGZ1bmN0aW9uKGNvbmZpZyl7DQogICAgdGhpcy5kYXRhID0gbmV3IEV4dC51dGlsLk1peGVkQ29sbGVjdGlvbihmYWxzZSk7DQogICAgdGhpcy5kYXRhLmdldEtleSA9IGZ1bmN0aW9uKG8pew0KICAgICAgICByZXR1cm4gby5pZDsNCiAgICB9Ow0KICAgIHRoaXMuYmFzZVBhcmFtcyA9IHt9Ow0KICAgIAogICAgdGhpcy5wYXJhbU5hbWVzID0gew0KICAgICAgICAic3RhcnQiIDogInN0YXJ0IiwNCiAgICAgICAgImxpbWl0IiA6ICJsaW1pdCIsDQogICAgICAgICJzb3J0IiA6ICJzb3J0IiwNCiAgICAgICAgImRpciIgOiAiZGlyIg0KICAgIH07DQoNCiAgICBpZihjb25maWcgJiYgY29uZmlnLmRhdGEpew0KICAgICAgICB0aGlzLmlubGluZURhdGEgPSBjb25maWcuZGF0YTsNCiAgICAgICAgZGVsZXRlIGNvbmZpZy5kYXRhOw0KICAgIH0NCg0KICAgIEV4dC5hcHBseSh0aGlzLCBjb25maWcpOw0KDQogICAgaWYodGhpcy5yZWFkZXIpeyAKICAgICAgICBpZighdGhpcy5yZWNvcmRUeXBlKXsNCiAgICAgICAgICAgIHRoaXMucmVjb3JkVHlwZSA9IHRoaXMucmVhZGVyLnJlY29yZFR5cGU7DQogICAgICAgIH0NCiAgICAgICAgaWYodGhpcy5yZWFkZXIub25NZXRhQ2hhbmdlKXsNCiAgICAgICAgICAgIHRoaXMucmVhZGVyLm9uTWV0YUNoYW5nZSA9IHRoaXMub25NZXRhQ2hhbmdlLmNyZWF0ZURlbGVnYXRlKHRoaXMpOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgaWYodGhpcy5yZWNvcmRUeXBlKXsNCiAgICAgICAgdGhpcy5maWVsZHMgPSB0aGlzLnJlY29yZFR5cGUucHJvdG90eXBlLmZpZWxkczsNCiAgICB9DQogICAgdGhpcy5tb2RpZmllZCA9IFtdOw0KDQogICAgdGhpcy5hZGRFdmVudHMoew0KICAgICAgICANCiAgICAgICAgZGF0YWNoYW5nZWQgOiB0cnVlLA0KICAgICAgICANCiAgICAgICAgbWV0YWNoYW5nZSA6IHRydWUsDQogICAgICAgIA0KICAgICAgICBhZGQgOiB0cnVlLA0KICAgICAgICANCiAgICAgICAgcmVtb3ZlIDogdHJ1ZSwNCiAgICAgICAgDQogICAgICAgIHVwZGF0ZSA6IHRydWUsDQogICAgICAgIA0KICAgICAgICBjbGVhciA6IHRydWUsDQogICAgICAgIA0KICAgICAgICBiZWZvcmVsb2FkIDogdHJ1ZSwNCiAgICAgICAgDQogICAgICAgIGxvYWQgOiB0cnVlLA0KICAgICAgICANCiAgICAgICAgbG9hZGV4Y2VwdGlvbiA6IHRydWUNCiAgICB9KTsNCg0KICAgIGlmKHRoaXMucHJveHkpew0KICAgICAgICB0aGlzLnJlbGF5RXZlbnRzKHRoaXMucHJveHksICBbImxvYWRleGNlcHRpb24iXSk7DQogICAgfQ0KICAgIHRoaXMuc29ydFRvZ2dsZSA9IHt9Ow0KDQogICAgRXh0LmRhdGEuU3RvcmUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpOw0KDQogICAgaWYodGhpcy5pbmxpbmVEYXRhKXsNCiAgICAgICAgdGhpcy5sb2FkRGF0YSh0aGlzLmlubGluZURhdGEpOw0KICAgICAgICBkZWxldGUgdGhpcy5pbmxpbmVEYXRhOw0KICAgIH0NCn07DQpFeHQuZXh0ZW5kKEV4dC5kYXRhLlN0b3JlLCBFeHQudXRpbC5PYnNlcnZhYmxlLCB7DQogICAgDQogICAgDQogICAgDQogICAgDQogICAgDQogICAgDQogICAgcmVtb3RlU29ydCA6IGZhbHNlLA0KDQogICAgDQogICAgcHJ1bmVNb2RpZmllZFJlY29yZHMgOiBmYWxzZSwNCg0KICAgIAogICAgbGFzdE9wdGlvbnMgOiBudWxsLA0KDQogICAgDQogICAgYWRkIDogZnVuY3Rpb24ocmVjb3Jkcyl7DQogICAgICAgIHJlY29yZHMgPSBbXS5jb25jYXQocmVjb3Jkcyk7DQogICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IHJlY29yZHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspew0KICAgICAgICAgICAgcmVjb3Jkc1tpXS5qb2luKHRoaXMpOw0KICAgICAgICB9DQogICAgICAgIHZhciBpbmRleCA9IHRoaXMuZGF0YS5sZW5ndGg7DQogICAgICAgIHRoaXMuZGF0YS5hZGRBbGwocmVjb3Jkcyk7DQogICAgICAgIHRoaXMuZmlyZUV2ZW50KCJhZGQiLCB0aGlzLCByZWNvcmRzLCBpbmRleCk7DQogICAgfSwNCg0KICAgIA0KICAgIHJlbW92ZSA6IGZ1bmN0aW9uKHJlY29yZCl7DQogICAgICAgIHZhciBpbmRleCA9IHRoaXMuZGF0YS5pbmRleE9mKHJlY29yZCk7DQogICAgICAgIHRoaXMuZGF0YS5yZW1vdmVBdChpbmRleCk7DQogICAgICAgIGlmKHRoaXMucHJ1bmVNb2RpZmllZFJlY29yZHMpew0KICAgICAgICAgICAgdGhpcy5tb2RpZmllZC5yZW1vdmUocmVjb3JkKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmZpcmVFdmVudCgicmVtb3ZlIiwgdGhpcywgcmVjb3JkLCBpbmRleCk7DQogICAgfSwNCg0KICAgIA0KICAgIHJlbW92ZUFsbCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHRoaXMuZGF0YS5jbGVhcigpOw0KICAgICAgICBpZih0aGlzLnBydW5lTW9kaWZpZWRSZWNvcmRzKXsNCiAgICAgICAgICAgIHRoaXMubW9kaWZpZWQgPSBbXTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmZpcmVFdmVudCgiY2xlYXIiLCB0aGlzKTsNCiAgICB9LA0KDQogICAgDQogICAgaW5zZXJ0IDogZnVuY3Rpb24oaW5kZXgsIHJlY29yZHMpew0KICAgICAgICByZWNvcmRzID0gW10uY29uY2F0KHJlY29yZHMpOw0KICAgICAgICBmb3IodmFyIGkgPSAwLCBsZW4gPSByZWNvcmRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXsNCiAgICAgICAgICAgIHRoaXMuZGF0YS5pbnNlcnQoaW5kZXgsIHJlY29yZHNbaV0pOw0KICAgICAgICAgICAgcmVjb3Jkc1tpXS5qb2luKHRoaXMpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuZmlyZUV2ZW50KCJhZGQiLCB0aGlzLCByZWNvcmRzLCBpbmRleCk7DQogICAgfSwNCg0KICAgIA0KICAgIGluZGV4T2YgOiBmdW5jdGlvbihyZWNvcmQpew0KICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmluZGV4T2YocmVjb3JkKTsNCiAgICB9LA0KDQogICAgDQogICAgaW5kZXhPZklkIDogZnVuY3Rpb24oaWQpew0KICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmluZGV4T2ZLZXkoaWQpOw0KICAgIH0sDQoNCiAgICANCiAgICBnZXRCeUlkIDogZnVuY3Rpb24oaWQpew0KICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmtleShpZCk7DQogICAgfSwNCg0KICAgIA0KICAgIGdldEF0IDogZnVuY3Rpb24oaW5kZXgpew0KICAgICAgICByZXR1cm4gdGhpcy5kYXRhLml0ZW1BdChpbmRleCk7DQogICAgfSwNCg0KICAgIA0KICAgIGdldFJhbmdlIDogZnVuY3Rpb24oc3RhcnQsIGVuZCl7DQogICAgICAgIHJldHVybiB0aGlzLmRhdGEuZ2V0UmFuZ2Uoc3RhcnQsIGVuZCk7DQogICAgfSwNCg0KICAgIAogICAgc3RvcmVPcHRpb25zIDogZnVuY3Rpb24obyl7DQogICAgICAgIG8gPSBFeHQuYXBwbHkoe30sIG8pOw0KICAgICAgICBkZWxldGUgby5jYWxsYmFjazsNCiAgICAgICAgZGVsZXRlIG8uc2NvcGU7DQogICAgICAgIHRoaXMubGFzdE9wdGlvbnMgPSBvOw0KICAgIH0sDQoNCiAgICANCiAgICBsb2FkIDogZnVuY3Rpb24ob3B0aW9ucyl7DQogICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9Ow0KICAgICAgICBpZih0aGlzLmZpcmVFdmVudCgiYmVmb3JlbG9hZCIsIHRoaXMsIG9wdGlvbnMpICE9PSBmYWxzZSl7DQogICAgICAgICAgICB0aGlzLnN0b3JlT3B0aW9ucyhvcHRpb25zKTsNCiAgICAgICAgICAgIHZhciBwID0gRXh0LmFwcGx5KG9wdGlvbnMucGFyYW1zIHx8IHt9LCB0aGlzLmJhc2VQYXJhbXMpOw0KICAgICAgICAgICAgaWYodGhpcy5zb3J0SW5mbyAmJiB0aGlzLnJlbW90ZVNvcnQpew0KICAgICAgICAgICAgICAgIHZhciBwbiA9IHRoaXMucGFyYW1OYW1lczsNCiAgICAgICAgICAgICAgICBwW3BuWyJzb3J0Il1dID0gdGhpcy5zb3J0SW5mby5maWVsZDsNCiAgICAgICAgICAgICAgICBwW3BuWyJkaXIiXV0gPSB0aGlzLnNvcnRJbmZvLmRpcmVjdGlvbjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMucHJveHkubG9hZChwLCB0aGlzLnJlYWRlciwgdGhpcy5sb2FkUmVjb3JkcywgdGhpcywgb3B0aW9ucyk7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgDQogICAgcmVsb2FkIDogZnVuY3Rpb24ob3B0aW9ucyl7DQogICAgICAgIHRoaXMubG9hZChFeHQuYXBwbHlJZihvcHRpb25zfHx7fSwgdGhpcy5sYXN0T3B0aW9ucykpOw0KICAgIH0sDQoNCiAgICAKICAgIAogICAgbG9hZFJlY29yZHMgOiBmdW5jdGlvbihvLCBvcHRpb25zLCBzdWNjZXNzKXsNCiAgICAgICAgaWYoIW8gfHwgc3VjY2VzcyA9PT0gZmFsc2Upew0KICAgICAgICAgICAgaWYoc3VjY2VzcyAhPT0gZmFsc2Upew0KICAgICAgICAgICAgICAgIHRoaXMuZmlyZUV2ZW50KCJsb2FkIiwgdGhpcywgW10sIG9wdGlvbnMpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYob3B0aW9ucy5jYWxsYmFjayl7DQogICAgICAgICAgICAgICAgb3B0aW9ucy5jYWxsYmFjay5jYWxsKG9wdGlvbnMuc2NvcGUgfHwgdGhpcywgW10sIG9wdGlvbnMsIGZhbHNlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgciA9IG8ucmVjb3JkcywgdCA9IG8udG90YWxSZWNvcmRzIHx8IHIubGVuZ3RoOw0KICAgICAgICBpZighb3B0aW9ucyB8fCBvcHRpb25zLmFkZCAhPT0gdHJ1ZSl7DQogICAgICAgICAgICBpZih0aGlzLnBydW5lTW9kaWZpZWRSZWNvcmRzKXsNCiAgICAgICAgICAgICAgICB0aGlzLm1vZGlmaWVkID0gW107DQogICAgICAgICAgICB9DQogICAgICAgICAgICBmb3IodmFyIGkgPSAwLCBsZW4gPSByLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXsNCiAgICAgICAgICAgICAgICByW2ldLmpvaW4odGhpcyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZih0aGlzLnNuYXBzaG90KXsNCiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLnNuYXBzaG90Ow0KICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNuYXBzaG90Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5kYXRhLmNsZWFyKCk7DQogICAgICAgICAgICB0aGlzLmRhdGEuYWRkQWxsKHIpOw0KICAgICAgICAgICAgdGhpcy50b3RhbExlbmd0aCA9IHQ7DQogICAgICAgICAgICB0aGlzLmFwcGx5U29ydCgpOw0KICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoImRhdGFjaGFuZ2VkIiwgdGhpcyk7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgdGhpcy50b3RhbExlbmd0aCA9IE1hdGgubWF4KHQsIHRoaXMuZGF0YS5sZW5ndGgrci5sZW5ndGgpOw0KICAgICAgICAgICAgdGhpcy5hZGQocik7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5maXJlRXZlbnQoImxvYWQiLCB0aGlzLCByLCBvcHRpb25zKTsNCiAgICAgICAgaWYob3B0aW9ucy5jYWxsYmFjayl7DQogICAgICAgICAgICBvcHRpb25zLmNhbGxiYWNrLmNhbGwob3B0aW9ucy5zY29wZSB8fCB0aGlzLCByLCBvcHRpb25zLCB0cnVlKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICANCiAgICBsb2FkRGF0YSA6IGZ1bmN0aW9uKG8sIGFwcGVuZCl7DQogICAgICAgIHZhciByID0gdGhpcy5yZWFkZXIucmVhZFJlY29yZHMobyk7DQogICAgICAgIHRoaXMubG9hZFJlY29yZHMociwge2FkZDogYXBwZW5kfSwgdHJ1ZSk7DQogICAgfSwNCg0KICAgIA0KICAgIGdldENvdW50IDogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5sZW5ndGggfHwgMDsNCiAgICB9LA0KDQogICAgDQogICAgZ2V0VG90YWxDb3VudCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLnRvdGFsTGVuZ3RoIHx8IDA7DQogICAgfSwNCg0KICAgIA0KICAgIGdldFNvcnRTdGF0ZSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLnNvcnRJbmZvOw0KICAgIH0sDQoNCiAgICAKICAgIGFwcGx5U29ydCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIGlmKHRoaXMuc29ydEluZm8gJiYgIXRoaXMucmVtb3RlU29ydCl7DQogICAgICAgICAgICB2YXIgcyA9IHRoaXMuc29ydEluZm8sIGYgPSBzLmZpZWxkOw0KICAgICAgICAgICAgdmFyIHN0ID0gdGhpcy5maWVsZHMuZ2V0KGYpLnNvcnRUeXBlOw0KICAgICAgICAgICAgdmFyIGZuID0gZnVuY3Rpb24ocjEsIHIyKXsNCiAgICAgICAgICAgICAgICB2YXIgdjEgPSBzdChyMS5kYXRhW2ZdKSwgdjIgPSBzdChyMi5kYXRhW2ZdKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gdjEgPiB2MiA/IDEgOiAodjEgPCB2MiA/IC0xIDogMCk7DQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgdGhpcy5kYXRhLnNvcnQocy5kaXJlY3Rpb24sIGZuKTsNCiAgICAgICAgICAgIGlmKHRoaXMuc25hcHNob3QgJiYgdGhpcy5zbmFwc2hvdCAhPSB0aGlzLmRhdGEpew0KICAgICAgICAgICAgICAgIHRoaXMuc25hcHNob3Quc29ydChzLmRpcmVjdGlvbiwgZm4pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIHNldERlZmF1bHRTb3J0IDogZnVuY3Rpb24oZmllbGQsIGRpcil7DQogICAgICAgIHRoaXMuc29ydEluZm8gPSB7ZmllbGQ6IGZpZWxkLCBkaXJlY3Rpb246IGRpciA/IGRpci50b1VwcGVyQ2FzZSgpIDogIkFTQyJ9Ow0KICAgIH0sDQoNCiAgICANCiAgICBzb3J0IDogZnVuY3Rpb24oZmllbGROYW1lLCBkaXIpew0KICAgICAgICB2YXIgZiA9IHRoaXMuZmllbGRzLmdldChmaWVsZE5hbWUpOw0KICAgICAgICBpZighZGlyKXsNCiAgICAgICAgICAgIGlmKHRoaXMuc29ydEluZm8gJiYgdGhpcy5zb3J0SW5mby5maWVsZCA9PSBmLm5hbWUpeyAKICAgICAgICAgICAgICAgIGRpciA9ICh0aGlzLnNvcnRUb2dnbGVbZi5uYW1lXSB8fCAiQVNDIikudG9nZ2xlKCJBU0MiLCAiREVTQyIpOw0KICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgZGlyID0gZi5zb3J0RGlyOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHRoaXMuc29ydFRvZ2dsZVtmLm5hbWVdID0gZGlyOw0KICAgICAgICB0aGlzLnNvcnRJbmZvID0ge2ZpZWxkOiBmLm5hbWUsIGRpcmVjdGlvbjogZGlyfTsNCiAgICAgICAgaWYoIXRoaXMucmVtb3RlU29ydCl7DQogICAgICAgICAgICB0aGlzLmFwcGx5U29ydCgpOw0KICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoImRhdGFjaGFuZ2VkIiwgdGhpcyk7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgdGhpcy5sb2FkKHRoaXMubGFzdE9wdGlvbnMpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIGVhY2ggOiBmdW5jdGlvbihmbiwgc2NvcGUpew0KICAgICAgICB0aGlzLmRhdGEuZWFjaChmbiwgc2NvcGUpOw0KICAgIH0sDQoNCiAgICANCiAgICBnZXRNb2RpZmllZFJlY29yZHMgOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gdGhpcy5tb2RpZmllZDsNCiAgICB9LA0KDQogICAgCiAgICBjcmVhdGVGaWx0ZXJGbiA6IGZ1bmN0aW9uKHByb3BlcnR5LCB2YWx1ZSwgYW55TWF0Y2gpew0KICAgICAgICBpZighdmFsdWUuZXhlYyl7IAogICAgICAgICAgICB2YWx1ZSA9IFN0cmluZyh2YWx1ZSk7DQogICAgICAgICAgICBpZih2YWx1ZS5sZW5ndGggPT0gMCl7DQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFsdWUgPSBuZXcgUmVnRXhwKChhbnlNYXRjaCA9PT0gdHJ1ZSA/ICcnIDogJ14nKSArIEV4dC5lc2NhcGVSZSh2YWx1ZSksICJpIik7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHIpew0KICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRlc3Qoci5kYXRhW3Byb3BlcnR5XSk7DQogICAgICAgIH07DQogICAgfSwNCg0KICAgIA0KICAgIHN1bSA6IGZ1bmN0aW9uKHByb3BlcnR5LCBzdGFydCwgZW5kKXsNCiAgICAgICAgdmFyIHJzID0gdGhpcy5kYXRhLml0ZW1zLCB2ID0gMDsNCiAgICAgICAgc3RhcnQgPSBzdGFydCB8fCAwOw0KICAgICAgICBlbmQgPSAoZW5kIHx8IGVuZCA9PT0gMCkgPyBlbmQgOiBycy5sZW5ndGgtMTsNCg0KICAgICAgICBmb3IodmFyIGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKyl7DQogICAgICAgICAgICB2ICs9IChyc1tpXS5kYXRhW3Byb3BlcnR5XSB8fCAwKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdjsNCiAgICB9LA0KDQogICAgDQogICAgZmlsdGVyIDogZnVuY3Rpb24ocHJvcGVydHksIHZhbHVlLCBhbnlNYXRjaCl7DQogICAgICAgIHZhciBmbiA9IHRoaXMuY3JlYXRlRmlsdGVyRm4ocHJvcGVydHksIHZhbHVlLCBhbnlNYXRjaCk7DQogICAgICAgIHJldHVybiBmbiA/IHRoaXMuZmlsdGVyQnkoZm4pIDogdGhpcy5jbGVhckZpbHRlcigpOw0KICAgIH0sDQoNCiAgICANCiAgICBmaWx0ZXJCeSA6IGZ1bmN0aW9uKGZuLCBzY29wZSl7DQogICAgICAgIHRoaXMuc25hcHNob3QgPSB0aGlzLnNuYXBzaG90IHx8IHRoaXMuZGF0YTsNCiAgICAgICAgdGhpcy5kYXRhID0gdGhpcy5xdWVyeUJ5KGZuLCBzY29wZXx8dGhpcyk7DQogICAgICAgIHRoaXMuZmlyZUV2ZW50KCJkYXRhY2hhbmdlZCIsIHRoaXMpOw0KICAgIH0sDQoNCiAgICANCiAgICBxdWVyeSA6IGZ1bmN0aW9uKHByb3BlcnR5LCB2YWx1ZSwgYW55TWF0Y2gpew0KICAgICAgICB2YXIgZm4gPSB0aGlzLmNyZWF0ZUZpbHRlckZuKHByb3BlcnR5LCB2YWx1ZSwgYW55TWF0Y2gpOw0KICAgICAgICByZXR1cm4gZm4gPyB0aGlzLnF1ZXJ5QnkoZm4pIDogdGhpcy5kYXRhLmNsb25lKCk7DQogICAgfSwNCg0KICAgIA0KICAgIHF1ZXJ5QnkgOiBmdW5jdGlvbihmbiwgc2NvcGUpew0KICAgICAgICB2YXIgZGF0YSA9IHRoaXMuc25hcHNob3QgfHwgdGhpcy5kYXRhOw0KICAgICAgICByZXR1cm4gZGF0YS5maWx0ZXJCeShmbiwgc2NvcGV8fHRoaXMpOw0KICAgIH0sDQoNCiAgICANCiAgICBjb2xsZWN0IDogZnVuY3Rpb24oZGF0YUluZGV4LCBhbGxvd051bGwsIGJ5cGFzc0ZpbHRlcil7DQogICAgICAgIHZhciBkID0gKGJ5cGFzc0ZpbHRlciA9PT0gdHJ1ZSAmJiB0aGlzLnNuYXBzaG90KSA/DQogICAgICAgICAgICAgICAgdGhpcy5zbmFwc2hvdC5pdGVtcyA6IHRoaXMuZGF0YS5pdGVtczsNCiAgICAgICAgdmFyIHYsIHN2LCByID0gW10sIGwgPSB7fTsNCiAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gZC5sZW5ndGg7IGkgPCBsZW47IGkrKyl7DQogICAgICAgICAgICB2ID0gZFtpXS5kYXRhW2RhdGFJbmRleF07DQogICAgICAgICAgICBzdiA9IFN0cmluZyh2KTsNCiAgICAgICAgICAgIGlmKChhbGxvd051bGwgfHwgIUV4dC5pc0VtcHR5KHYpKSAmJiAhbFtzdl0pew0KICAgICAgICAgICAgICAgIGxbc3ZdID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICByW3IubGVuZ3RoXSA9IHY7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHI7DQogICAgfSwNCg0KICAgIA0KICAgIGNsZWFyRmlsdGVyIDogZnVuY3Rpb24oc3VwcHJlc3NFdmVudCl7DQogICAgICAgIGlmKHRoaXMuc25hcHNob3QgJiYgdGhpcy5zbmFwc2hvdCAhPSB0aGlzLmRhdGEpew0KICAgICAgICAgICAgdGhpcy5kYXRhID0gdGhpcy5zbmFwc2hvdDsNCiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNuYXBzaG90Ow0KICAgICAgICAgICAgaWYoc3VwcHJlc3NFdmVudCAhPT0gdHJ1ZSl7DQogICAgICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoImRhdGFjaGFuZ2VkIiwgdGhpcyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgCiAgICBhZnRlckVkaXQgOiBmdW5jdGlvbihyZWNvcmQpew0KICAgICAgICBpZih0aGlzLm1vZGlmaWVkLmluZGV4T2YocmVjb3JkKSA9PSAtMSl7DQogICAgICAgICAgICB0aGlzLm1vZGlmaWVkLnB1c2gocmVjb3JkKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmZpcmVFdmVudCgidXBkYXRlIiwgdGhpcywgcmVjb3JkLCBFeHQuZGF0YS5SZWNvcmQuRURJVCk7DQogICAgfSwNCg0KICAgIAogICAgYWZ0ZXJSZWplY3QgOiBmdW5jdGlvbihyZWNvcmQpew0KICAgICAgICB0aGlzLm1vZGlmaWVkLnJlbW92ZShyZWNvcmQpOw0KICAgICAgICB0aGlzLmZpcmVFdmVudCgidXBkYXRlIiwgdGhpcywgcmVjb3JkLCBFeHQuZGF0YS5SZWNvcmQuUkVKRUNUKTsNCiAgICB9LA0KDQogICAgCiAgICBhZnRlckNvbW1pdCA6IGZ1bmN0aW9uKHJlY29yZCl7DQogICAgICAgIHRoaXMubW9kaWZpZWQucmVtb3ZlKHJlY29yZCk7DQogICAgICAgIHRoaXMuZmlyZUV2ZW50KCJ1cGRhdGUiLCB0aGlzLCByZWNvcmQsIEV4dC5kYXRhLlJlY29yZC5DT01NSVQpOw0KICAgIH0sDQoNCiAgICANCiAgICBjb21taXRDaGFuZ2VzIDogZnVuY3Rpb24oKXsNCiAgICAgICAgdmFyIG0gPSB0aGlzLm1vZGlmaWVkLnNsaWNlKDApOw0KICAgICAgICB0aGlzLm1vZGlmaWVkID0gW107DQogICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IG0ubGVuZ3RoOyBpIDwgbGVuOyBpKyspew0KICAgICAgICAgICAgbVtpXS5jb21taXQoKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICANCiAgICByZWplY3RDaGFuZ2VzIDogZnVuY3Rpb24oKXsNCiAgICAgICAgdmFyIG0gPSB0aGlzLm1vZGlmaWVkLnNsaWNlKDApOw0KICAgICAgICB0aGlzLm1vZGlmaWVkID0gW107DQogICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IG0ubGVuZ3RoOyBpIDwgbGVuOyBpKyspew0KICAgICAgICAgICAgbVtpXS5yZWplY3QoKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICBvbk1ldGFDaGFuZ2UgOiBmdW5jdGlvbihtZXRhLCBydHlwZSwgbyl7DQogICAgICAgIHRoaXMucmVjb3JkVHlwZSA9IHJ0eXBlOw0KICAgICAgICB0aGlzLmZpZWxkcyA9IHJ0eXBlLnByb3RvdHlwZS5maWVsZHM7DQogICAgICAgIGRlbGV0ZSB0aGlzLnNuYXBzaG90Ow0KICAgICAgICB0aGlzLnNvcnRJbmZvID0gbWV0YS5zb3J0SW5mbzsNCiAgICAgICAgdGhpcy5tb2RpZmllZCA9IFtdOw0KICAgICAgICB0aGlzLmZpcmVFdmVudCgnbWV0YWNoYW5nZScsIHRoaXMsIHRoaXMucmVhZGVyLm1ldGEpOw0KICAgIH0NCn0pOwoKRXh0LmRhdGEuU2ltcGxlU3RvcmUgPSBmdW5jdGlvbihjb25maWcpewogICAgRXh0LmRhdGEuU2ltcGxlU3RvcmUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHsKICAgICAgICByZWFkZXI6IG5ldyBFeHQuZGF0YS5BcnJheVJlYWRlcih7CiAgICAgICAgICAgICAgICBpZDogY29uZmlnLmlkCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4dC5kYXRhLlJlY29yZC5jcmVhdGUoY29uZmlnLmZpZWxkcykKICAgICAgICApLAogICAgICAgIHByb3h5IDogbmV3IEV4dC5kYXRhLk1lbW9yeVByb3h5KGNvbmZpZy5kYXRhKQogICAgfSk7CiAgICB0aGlzLmxvYWQoKTsKfTsKRXh0LmV4dGVuZChFeHQuZGF0YS5TaW1wbGVTdG9yZSwgRXh0LmRhdGEuU3RvcmUpOwoNCkV4dC5kYXRhLkpzb25TdG9yZSA9IGZ1bmN0aW9uKGMpew0KICAgIEV4dC5kYXRhLkpzb25TdG9yZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgRXh0LmFwcGx5KGMsIHsNCiAgICAgICAgcHJveHk6ICFjLmRhdGEgPyBuZXcgRXh0LmRhdGEuSHR0cFByb3h5KHt1cmw6IGMudXJsfSkgOiB1bmRlZmluZWQsDQogICAgICAgIHJlYWRlcjogbmV3IEV4dC5kYXRhLkpzb25SZWFkZXIoYywgYy5maWVsZHMpDQogICAgfSkpOw0KfTsNCkV4dC5leHRlbmQoRXh0LmRhdGEuSnNvblN0b3JlLCBFeHQuZGF0YS5TdG9yZSk7CkV4dC5kYXRhLkZpZWxkID0gZnVuY3Rpb24oY29uZmlnKXsNCiAgICBpZih0eXBlb2YgY29uZmlnID09ICJzdHJpbmciKXsNCiAgICAgICAgY29uZmlnID0ge25hbWU6IGNvbmZpZ307DQogICAgfQ0KICAgIEV4dC5hcHBseSh0aGlzLCBjb25maWcpOw0KICAgIA0KICAgIGlmKCF0aGlzLnR5cGUpew0KICAgICAgICB0aGlzLnR5cGUgPSAiYXV0byI7DQogICAgfQ0KICAgIA0KICAgIHZhciBzdCA9IEV4dC5kYXRhLlNvcnRUeXBlczsNCiAgICAKICAgIGlmKHR5cGVvZiB0aGlzLnNvcnRUeXBlID09ICJzdHJpbmciKXsNCiAgICAgICAgdGhpcy5zb3J0VHlwZSA9IHN0W3RoaXMuc29ydFR5cGVdOw0KICAgIH0NCiAgICANCiAgICAKICAgIGlmKCF0aGlzLnNvcnRUeXBlKXsNCiAgICAgICAgc3dpdGNoKHRoaXMudHlwZSl7DQogICAgICAgICAgICBjYXNlICJzdHJpbmciOg0KICAgICAgICAgICAgICAgIHRoaXMuc29ydFR5cGUgPSBzdC5hc1VDU3RyaW5nOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAiZGF0ZSI6DQogICAgICAgICAgICAgICAgdGhpcy5zb3J0VHlwZSA9IHN0LmFzRGF0ZTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgdGhpcy5zb3J0VHlwZSA9IHN0Lm5vbmU7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAKICAgIHZhciBzdHJpcFJlID0gL1tcJCwlXS9nOw0KDQogICAgCiAgICAKICAgIGlmKCF0aGlzLmNvbnZlcnQpew0KICAgICAgICB2YXIgY3YsIGRhdGVGb3JtYXQgPSB0aGlzLmRhdGVGb3JtYXQ7DQogICAgICAgIHN3aXRjaCh0aGlzLnR5cGUpew0KICAgICAgICAgICAgY2FzZSAiIjoNCiAgICAgICAgICAgIGNhc2UgImF1dG8iOg0KICAgICAgICAgICAgY2FzZSB1bmRlZmluZWQ6DQogICAgICAgICAgICAgICAgY3YgPSBmdW5jdGlvbih2KXsgcmV0dXJuIHY7IH07DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBjYXNlICJzdHJpbmciOg0KICAgICAgICAgICAgICAgIGN2ID0gZnVuY3Rpb24odil7IHJldHVybiAodiA9PT0gdW5kZWZpbmVkIHx8IHYgPT09IG51bGwpID8gJycgOiBTdHJpbmcodik7IH07DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBjYXNlICJpbnQiOg0KICAgICAgICAgICAgICAgIGN2ID0gZnVuY3Rpb24odil7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB2ICE9PSB1bmRlZmluZWQgJiYgdiAhPT0gbnVsbCAmJiB2ICE9PSAnJyA/DQogICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUludChTdHJpbmcodikucmVwbGFjZShzdHJpcFJlLCAiIiksIDEwKSA6ICcnOw0KICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAiZmxvYXQiOg0KICAgICAgICAgICAgICAgIGN2ID0gZnVuY3Rpb24odil7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB2ICE9PSB1bmRlZmluZWQgJiYgdiAhPT0gbnVsbCAmJiB2ICE9PSAnJyA/DQogICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUZsb2F0KFN0cmluZyh2KS5yZXBsYWNlKHN0cmlwUmUsICIiKSwgMTApIDogJyc7IA0KICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAiYm9vbCI6DQogICAgICAgICAgICBjYXNlICJib29sZWFuIjoNCiAgICAgICAgICAgICAgICBjdiA9IGZ1bmN0aW9uKHYpeyByZXR1cm4gdiA9PT0gdHJ1ZSB8fCB2ID09PSAidHJ1ZSIgfHwgdiA9PSAxOyB9Ow0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAiZGF0ZSI6DQogICAgICAgICAgICAgICAgY3YgPSBmdW5jdGlvbih2KXsNCiAgICAgICAgICAgICAgICAgICAgaWYoIXYpew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmKHYgaW5zdGFuY2VvZiBEYXRlKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2Ow0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmKGRhdGVGb3JtYXQpew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGF0ZUZvcm1hdCA9PSAidGltZXN0YW1wIil7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHYqMTAwMCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGF0ZS5wYXJzZURhdGUodiwgZGF0ZUZvcm1hdCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnNlZCA9IERhdGUucGFyc2Uodik7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZWQgPyBuZXcgRGF0ZShwYXJzZWQpIDogbnVsbDsNCiAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgDQogICAgICAgIH0NCiAgICAgICAgdGhpcy5jb252ZXJ0ID0gY3Y7DQogICAgfQ0KfTsNCg0KRXh0LmRhdGEuRmllbGQucHJvdG90eXBlID0gew0KICAgIGRhdGVGb3JtYXQ6IG51bGwsDQogICAgZGVmYXVsdFZhbHVlOiAiIiwNCiAgICBtYXBwaW5nOiBudWxsLA0KICAgIHNvcnRUeXBlIDogbnVsbCwNCiAgICBzb3J0RGlyIDogIkFTQyINCn07CgoKRXh0LmRhdGEuRGF0YVJlYWRlciA9IGZ1bmN0aW9uKG1ldGEsIHJlY29yZFR5cGUpew0KICAgIHRoaXMubWV0YSA9IG1ldGE7DQogICAgdGhpcy5yZWNvcmRUeXBlID0gcmVjb3JkVHlwZSBpbnN0YW5jZW9mIEFycmF5ID8gDQogICAgICAgIEV4dC5kYXRhLlJlY29yZC5jcmVhdGUocmVjb3JkVHlwZSkgOiByZWNvcmRUeXBlOw0KfTsNCg0KRXh0LmRhdGEuRGF0YVJlYWRlci5wcm90b3R5cGUgPSB7DQogICAgDQp9OwoNCkV4dC5kYXRhLkRhdGFQcm94eSA9IGZ1bmN0aW9uKCl7DQogICAgdGhpcy5hZGRFdmVudHMoew0KICAgICAgICANCiAgICAgICAgYmVmb3JlbG9hZCA6IHRydWUsDQogICAgICAgIA0KICAgICAgICBsb2FkIDogdHJ1ZSwNCiAgICAgICAgDQogICAgICAgIGxvYWRleGNlcHRpb24gOiB0cnVlDQogICAgfSk7DQogICAgRXh0LmRhdGEuRGF0YVByb3h5LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTsNCn07DQoNCkV4dC5leHRlbmQoRXh0LmRhdGEuRGF0YVByb3h5LCBFeHQudXRpbC5PYnNlcnZhYmxlKTsKDQpFeHQuZGF0YS5NZW1vcnlQcm94eSA9IGZ1bmN0aW9uKGRhdGEpew0KICAgIEV4dC5kYXRhLk1lbW9yeVByb3h5LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTsNCiAgICB0aGlzLmRhdGEgPSBkYXRhOw0KfTsNCg0KRXh0LmV4dGVuZChFeHQuZGF0YS5NZW1vcnlQcm94eSwgRXh0LmRhdGEuRGF0YVByb3h5LCB7DQogICAgDQogICAgbG9hZCA6IGZ1bmN0aW9uKHBhcmFtcywgcmVhZGVyLCBjYWxsYmFjaywgc2NvcGUsIGFyZyl7DQogICAgICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTsNCiAgICAgICAgdmFyIHJlc3VsdDsNCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgIHJlc3VsdCA9IHJlYWRlci5yZWFkUmVjb3Jkcyh0aGlzLmRhdGEpOw0KICAgICAgICB9Y2F0Y2goZSl7DQogICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgibG9hZGV4Y2VwdGlvbiIsIHRoaXMsIGFyZywgbnVsbCwgZSk7DQogICAgICAgICAgICBjYWxsYmFjay5jYWxsKHNjb3BlLCBudWxsLCBhcmcsIGZhbHNlKTsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KICAgICAgICBjYWxsYmFjay5jYWxsKHNjb3BlLCByZXN1bHQsIGFyZywgdHJ1ZSk7DQogICAgfSwNCiAgICANCiAgICAKICAgIHVwZGF0ZSA6IGZ1bmN0aW9uKHBhcmFtcywgcmVjb3Jkcyl7DQogICAgICAgIA0KICAgIH0NCn0pOwoNCkV4dC5kYXRhLkh0dHBQcm94eSA9IGZ1bmN0aW9uKGNvbm4pew0KICAgIEV4dC5kYXRhLkh0dHBQcm94eS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7DQogICAgCiAgICB0aGlzLmNvbm4gPSBjb25uOw0KICAgIHRoaXMudXNlQWpheCA9ICFjb25uIHx8ICFjb25uLmV2ZW50czsNCn07DQoNCkV4dC5leHRlbmQoRXh0LmRhdGEuSHR0cFByb3h5LCBFeHQuZGF0YS5EYXRhUHJveHksIHsNCiAgICANCiAgICBnZXRDb25uZWN0aW9uIDogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIHRoaXMudXNlQWpheCA/IEV4dC5BamF4IDogdGhpcy5jb25uOw0KICAgIH0sDQoNCiAgICANCiAgICBsb2FkIDogZnVuY3Rpb24ocGFyYW1zLCByZWFkZXIsIGNhbGxiYWNrLCBzY29wZSwgYXJnKXsNCiAgICAgICAgaWYodGhpcy5maXJlRXZlbnQoImJlZm9yZWxvYWQiLCB0aGlzLCBwYXJhbXMpICE9PSBmYWxzZSl7DQogICAgICAgICAgICB2YXIgIG8gPSB7DQogICAgICAgICAgICAgICAgcGFyYW1zIDogcGFyYW1zIHx8IHt9LA0KICAgICAgICAgICAgICAgIHJlcXVlc3Q6IHsNCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgOiBjYWxsYmFjaywNCiAgICAgICAgICAgICAgICAgICAgc2NvcGUgOiBzY29wZSwNCiAgICAgICAgICAgICAgICAgICAgYXJnIDogYXJnDQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICByZWFkZXI6IHJlYWRlciwNCiAgICAgICAgICAgICAgICBjYWxsYmFjayA6IHRoaXMubG9hZFJlc3BvbnNlLA0KICAgICAgICAgICAgICAgIHNjb3BlOiB0aGlzDQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgaWYodGhpcy51c2VBamF4KXsNCiAgICAgICAgICAgICAgICBFeHQuYXBwbHlJZihvLCB0aGlzLmNvbm4pOw0KICAgICAgICAgICAgICAgIGlmKHRoaXMuYWN0aXZlUmVxdWVzdCl7DQogICAgICAgICAgICAgICAgICAgIEV4dC5BamF4LmFib3J0KHRoaXMuYWN0aXZlUmVxdWVzdCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlUmVxdWVzdCA9IEV4dC5BamF4LnJlcXVlc3Qobyk7DQogICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICB0aGlzLmNvbm4ucmVxdWVzdChvKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICBjYWxsYmFjay5jYWxsKHNjb3BlfHx0aGlzLCBudWxsLCBhcmcsIGZhbHNlKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICAKICAgIGxvYWRSZXNwb25zZSA6IGZ1bmN0aW9uKG8sIHN1Y2Nlc3MsIHJlc3BvbnNlKXsNCiAgICAgICAgZGVsZXRlIHRoaXMuYWN0aXZlUmVxdWVzdDsNCiAgICAgICAgaWYoIXN1Y2Nlc3Mpew0KICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoImxvYWRleGNlcHRpb24iLCB0aGlzLCBvLCByZXNwb25zZSk7DQogICAgICAgICAgICBvLnJlcXVlc3QuY2FsbGJhY2suY2FsbChvLnJlcXVlc3Quc2NvcGUsIG51bGwsIG8ucmVxdWVzdC5hcmcsIGZhbHNlKTsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgcmVzdWx0Ow0KICAgICAgICB0cnkgew0KICAgICAgICAgICAgcmVzdWx0ID0gby5yZWFkZXIucmVhZChyZXNwb25zZSk7DQogICAgICAgIH1jYXRjaChlKXsNCiAgICAgICAgICAgIHRoaXMuZmlyZUV2ZW50KCJsb2FkZXhjZXB0aW9uIiwgdGhpcywgbywgcmVzcG9uc2UsIGUpOw0KICAgICAgICAgICAgby5yZXF1ZXN0LmNhbGxiYWNrLmNhbGwoby5yZXF1ZXN0LnNjb3BlLCBudWxsLCBvLnJlcXVlc3QuYXJnLCBmYWxzZSk7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5maXJlRXZlbnQoImxvYWQiLCB0aGlzLCBvLCBvLnJlcXVlc3QuYXJnKTsNCiAgICAgICAgby5yZXF1ZXN0LmNhbGxiYWNrLmNhbGwoby5yZXF1ZXN0LnNjb3BlLCByZXN1bHQsIG8ucmVxdWVzdC5hcmcsIHRydWUpOw0KICAgIH0sDQoNCiAgICAKICAgIHVwZGF0ZSA6IGZ1bmN0aW9uKGRhdGFTZXQpew0KDQogICAgfSwNCg0KICAgIAogICAgdXBkYXRlUmVzcG9uc2UgOiBmdW5jdGlvbihkYXRhU2V0KXsNCg0KICAgIH0NCn0pOwoNCkV4dC5kYXRhLlNjcmlwdFRhZ1Byb3h5ID0gZnVuY3Rpb24oY29uZmlnKXsNCiAgICBFeHQuZGF0YS5TY3JpcHRUYWdQcm94eS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7DQogICAgRXh0LmFwcGx5KHRoaXMsIGNvbmZpZyk7DQogICAgdGhpcy5oZWFkID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXTsNCn07DQoNCkV4dC5kYXRhLlNjcmlwdFRhZ1Byb3h5LlRSQU5TX0lEID0gMTAwMDsNCg0KRXh0LmV4dGVuZChFeHQuZGF0YS5TY3JpcHRUYWdQcm94eSwgRXh0LmRhdGEuRGF0YVByb3h5LCB7DQogICAgDQogICAgDQogICAgdGltZW91dCA6IDMwMDAwLA0KICAgIA0KICAgIGNhbGxiYWNrUGFyYW0gOiAiY2FsbGJhY2siLA0KICAgIA0KICAgIG5vY2FjaGUgOiB0cnVlLA0KDQogICAgDQogICAgbG9hZCA6IGZ1bmN0aW9uKHBhcmFtcywgcmVhZGVyLCBjYWxsYmFjaywgc2NvcGUsIGFyZyl7DQogICAgICAgIGlmKHRoaXMuZmlyZUV2ZW50KCJiZWZvcmVsb2FkIiwgdGhpcywgcGFyYW1zKSAhPT0gZmFsc2Upew0KDQogICAgICAgICAgICB2YXIgcCA9IEV4dC51cmxFbmNvZGUoRXh0LmFwcGx5KHBhcmFtcywgdGhpcy5leHRyYVBhcmFtcykpOw0KDQogICAgICAgICAgICB2YXIgdXJsID0gdGhpcy51cmw7DQogICAgICAgICAgICB1cmwgKz0gKHVybC5pbmRleE9mKCI/IikgIT0gLTEgPyAiJiIgOiAiPyIpICsgcDsNCiAgICAgICAgICAgIGlmKHRoaXMubm9jYWNoZSl7DQogICAgICAgICAgICAgICAgdXJsICs9ICImX2RjPSIgKyAobmV3IERhdGUoKS5nZXRUaW1lKCkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIHRyYW5zSWQgPSArK0V4dC5kYXRhLlNjcmlwdFRhZ1Byb3h5LlRSQU5TX0lEOw0KICAgICAgICAgICAgdmFyIHRyYW5zID0gew0KICAgICAgICAgICAgICAgIGlkIDogdHJhbnNJZCwNCiAgICAgICAgICAgICAgICBjYiA6ICJzdGNDYWxsYmFjayIrdHJhbnNJZCwNCiAgICAgICAgICAgICAgICBzY3JpcHRJZCA6ICJzdGNTY3JpcHQiK3RyYW5zSWQsDQogICAgICAgICAgICAgICAgcGFyYW1zIDogcGFyYW1zLA0KICAgICAgICAgICAgICAgIGFyZyA6IGFyZywNCiAgICAgICAgICAgICAgICB1cmwgOiB1cmwsDQogICAgICAgICAgICAgICAgY2FsbGJhY2sgOiBjYWxsYmFjaywNCiAgICAgICAgICAgICAgICBzY29wZSA6IHNjb3BlLA0KICAgICAgICAgICAgICAgIHJlYWRlciA6IHJlYWRlcg0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIHZhciBjb25uID0gdGhpczsNCg0KICAgICAgICAgICAgd2luZG93W3RyYW5zLmNiXSA9IGZ1bmN0aW9uKG8pew0KICAgICAgICAgICAgICAgIGNvbm4uaGFuZGxlUmVzcG9uc2UobywgdHJhbnMpOw0KICAgICAgICAgICAgfTsNCg0KICAgICAgICAgICAgdXJsICs9IFN0cmluZy5mb3JtYXQoIiZ7MH09ezF9IiwgdGhpcy5jYWxsYmFja1BhcmFtLCB0cmFucy5jYik7DQoNCiAgICAgICAgICAgIGlmKHRoaXMuYXV0b0Fib3J0ICE9PSBmYWxzZSl7DQogICAgICAgICAgICAgICAgdGhpcy5hYm9ydCgpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB0cmFucy50aW1lb3V0SWQgPSB0aGlzLmhhbmRsZUZhaWx1cmUuZGVmZXIodGhpcy50aW1lb3V0LCB0aGlzLCBbdHJhbnNdKTsNCg0KICAgICAgICAgICAgdmFyIHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOw0KICAgICAgICAgICAgc2NyaXB0LnNldEF0dHJpYnV0ZSgic3JjIiwgdXJsKTsNCiAgICAgICAgICAgIHNjcmlwdC5zZXRBdHRyaWJ1dGUoInR5cGUiLCAidGV4dC9qYXZhc2NyaXB0Iik7DQogICAgICAgICAgICBzY3JpcHQuc2V0QXR0cmlidXRlKCJpZCIsIHRyYW5zLnNjcmlwdElkKTsNCiAgICAgICAgICAgIHRoaXMuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpOw0KDQogICAgICAgICAgICB0aGlzLnRyYW5zID0gdHJhbnM7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgY2FsbGJhY2suY2FsbChzY29wZXx8dGhpcywgbnVsbCwgYXJnLCBmYWxzZSk7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgCiAgICBpc0xvYWRpbmcgOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gdGhpcy50cmFucyA/IHRydWUgOiBmYWxzZTsNCiAgICB9LA0KDQogICAgDQogICAgYWJvcnQgOiBmdW5jdGlvbigpew0KICAgICAgICBpZih0aGlzLmlzTG9hZGluZygpKXsNCiAgICAgICAgICAgIHRoaXMuZGVzdHJveVRyYW5zKHRoaXMudHJhbnMpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIAogICAgZGVzdHJveVRyYW5zIDogZnVuY3Rpb24odHJhbnMsIGlzTG9hZGVkKXsNCiAgICAgICAgdGhpcy5oZWFkLnJlbW92ZUNoaWxkKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRyYW5zLnNjcmlwdElkKSk7DQogICAgICAgIGNsZWFyVGltZW91dCh0cmFucy50aW1lb3V0SWQpOw0KICAgICAgICBpZihpc0xvYWRlZCl7DQogICAgICAgICAgICB3aW5kb3dbdHJhbnMuY2JdID0gdW5kZWZpbmVkOw0KICAgICAgICAgICAgdHJ5ew0KICAgICAgICAgICAgICAgIGRlbGV0ZSB3aW5kb3dbdHJhbnMuY2JdOw0KICAgICAgICAgICAgfWNhdGNoKGUpe30NCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAKICAgICAgICAgICAgd2luZG93W3RyYW5zLmNiXSA9IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICAgd2luZG93W3RyYW5zLmNiXSA9IHVuZGVmaW5lZDsNCiAgICAgICAgICAgICAgICB0cnl7DQogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB3aW5kb3dbdHJhbnMuY2JdOw0KICAgICAgICAgICAgICAgIH1jYXRjaChlKXt9DQogICAgICAgICAgICB9Ow0KICAgICAgICB9DQogICAgfSwNCg0KICAgIAogICAgaGFuZGxlUmVzcG9uc2UgOiBmdW5jdGlvbihvLCB0cmFucyl7DQogICAgICAgIHRoaXMudHJhbnMgPSBmYWxzZTsNCiAgICAgICAgdGhpcy5kZXN0cm95VHJhbnModHJhbnMsIHRydWUpOw0KICAgICAgICB2YXIgcmVzdWx0Ow0KICAgICAgICB0cnkgew0KICAgICAgICAgICAgcmVzdWx0ID0gdHJhbnMucmVhZGVyLnJlYWRSZWNvcmRzKG8pOw0KICAgICAgICB9Y2F0Y2goZSl7DQogICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgibG9hZGV4Y2VwdGlvbiIsIHRoaXMsIG8sIHRyYW5zLmFyZywgZSk7DQogICAgICAgICAgICB0cmFucy5jYWxsYmFjay5jYWxsKHRyYW5zLnNjb3BlfHx3aW5kb3csIG51bGwsIHRyYW5zLmFyZywgZmFsc2UpOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuZmlyZUV2ZW50KCJsb2FkIiwgdGhpcywgbywgdHJhbnMuYXJnKTsNCiAgICAgICAgdHJhbnMuY2FsbGJhY2suY2FsbCh0cmFucy5zY29wZXx8d2luZG93LCByZXN1bHQsIHRyYW5zLmFyZywgdHJ1ZSk7DQogICAgfSwNCg0KICAgIAogICAgaGFuZGxlRmFpbHVyZSA6IGZ1bmN0aW9uKHRyYW5zKXsNCiAgICAgICAgdGhpcy50cmFucyA9IGZhbHNlOw0KICAgICAgICB0aGlzLmRlc3Ryb3lUcmFucyh0cmFucywgZmFsc2UpOw0KICAgICAgICB0aGlzLmZpcmVFdmVudCgibG9hZGV4Y2VwdGlvbiIsIHRoaXMsIG51bGwsIHRyYW5zLmFyZyk7DQogICAgICAgIHRyYW5zLmNhbGxiYWNrLmNhbGwodHJhbnMuc2NvcGV8fHdpbmRvdywgbnVsbCwgdHJhbnMuYXJnLCBmYWxzZSk7DQogICAgfQ0KfSk7Cg0KRXh0LmRhdGEuSnNvblJlYWRlciA9IGZ1bmN0aW9uKG1ldGEsIHJlY29yZFR5cGUpew0KICAgIG1ldGEgPSBtZXRhIHx8IHt9Ow0KICAgIEV4dC5kYXRhLkpzb25SZWFkZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIG1ldGEsIHJlY29yZFR5cGV8fG1ldGEuZmllbGRzKTsNCn07DQpFeHQuZXh0ZW5kKEV4dC5kYXRhLkpzb25SZWFkZXIsIEV4dC5kYXRhLkRhdGFSZWFkZXIsIHsNCiAgICANCiAgICByZWFkIDogZnVuY3Rpb24ocmVzcG9uc2Upew0KICAgICAgICB2YXIganNvbiA9IHJlc3BvbnNlLnJlc3BvbnNlVGV4dDsNCiAgICAgICAgdmFyIG8gPSBldmFsKCIoIitqc29uKyIpIik7DQogICAgICAgIGlmKCFvKSB7DQogICAgICAgICAgICB0aHJvdyB7bWVzc2FnZTogIkpzb25SZWFkZXIucmVhZDogSnNvbiBvYmplY3Qgbm90IGZvdW5kIn07DQogICAgICAgIH0NCiAgICAgICAgaWYoby5tZXRhRGF0YSl7DQogICAgICAgICAgICBkZWxldGUgdGhpcy5lZjsNCiAgICAgICAgICAgIHRoaXMubWV0YSA9IG8ubWV0YURhdGE7DQogICAgICAgICAgICB0aGlzLnJlY29yZFR5cGUgPSBFeHQuZGF0YS5SZWNvcmQuY3JlYXRlKG8ubWV0YURhdGEuZmllbGRzKTsNCiAgICAgICAgICAgIHRoaXMub25NZXRhQ2hhbmdlKHRoaXMubWV0YSwgdGhpcy5yZWNvcmRUeXBlLCBvKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdGhpcy5yZWFkUmVjb3JkcyhvKTsNCiAgICB9LA0KDQogICAgCiAgICBvbk1ldGFDaGFuZ2UgOiBmdW5jdGlvbihtZXRhLCByZWNvcmRUeXBlLCBvKXsNCg0KICAgIH0sDQoNCiAgICANCiAgICBzaW1wbGVBY2Nlc3M6IGZ1bmN0aW9uKG9iaiwgc3Vic2MpIHsNCiAgICAJcmV0dXJuIG9ialtzdWJzY107DQogICAgfSwNCg0KCQ0KICAgIGdldEpzb25BY2Nlc3NvcjogZnVuY3Rpb24oKXsNCiAgICAgICAgdmFyIHJlID0gL1tcW1wuXS87DQogICAgICAgIHJldHVybiBmdW5jdGlvbihleHByKSB7DQogICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgIHJldHVybihyZS50ZXN0KGV4cHIpKQ0KICAgICAgICAgICAgICAgICAgICA/IG5ldyBGdW5jdGlvbigib2JqIiwgInJldHVybiBvYmouIiArIGV4cHIpDQogICAgICAgICAgICAgICAgICAgIDogZnVuY3Rpb24ob2JqKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmpbZXhwcl07DQogICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICB9IGNhdGNoKGUpe30NCiAgICAgICAgICAgIHJldHVybiBFeHQuZW1wdHlGbjsNCiAgICAgICAgfTsNCiAgICB9KCksDQoNCiAgICANCiAgICByZWFkUmVjb3JkcyA6IGZ1bmN0aW9uKG8pew0KICAgICAgICANCiAgICAgICAgdGhpcy5qc29uRGF0YSA9IG87DQogICAgICAgIHZhciBzID0gdGhpcy5tZXRhLCBSZWNvcmQgPSB0aGlzLnJlY29yZFR5cGUsDQogICAgICAgICAgICBmID0gUmVjb3JkLnByb3RvdHlwZS5maWVsZHMsIGZpID0gZi5pdGVtcywgZmwgPSBmLmxlbmd0aDsNCg0KCiAgICAgICAgaWYgKCF0aGlzLmVmKSB7DQogICAgICAgICAgICBpZihzLnRvdGFsUHJvcGVydHkpIHsNCgkgICAgICAgICAgICB0aGlzLmdldFRvdGFsID0gdGhpcy5nZXRKc29uQWNjZXNzb3Iocy50b3RhbFByb3BlcnR5KTsNCgkgICAgICAgIH0NCgkgICAgICAgIGlmKHMuc3VjY2Vzc1Byb3BlcnR5KSB7DQoJICAgICAgICAgICAgdGhpcy5nZXRTdWNjZXNzID0gdGhpcy5nZXRKc29uQWNjZXNzb3Iocy5zdWNjZXNzUHJvcGVydHkpOw0KCSAgICAgICAgfQ0KCSAgICAgICAgdGhpcy5nZXRSb290ID0gcy5yb290ID8gdGhpcy5nZXRKc29uQWNjZXNzb3Iocy5yb290KSA6IGZ1bmN0aW9uKHApe3JldHVybiBwO307DQoJICAgICAgICBpZiAocy5pZCkgew0KCSAgICAgICAgCXZhciBnID0gdGhpcy5nZXRKc29uQWNjZXNzb3Iocy5pZCk7DQoJICAgICAgICAJdGhpcy5nZXRJZCA9IGZ1bmN0aW9uKHJlYykgew0KCSAgICAgICAgCQl2YXIgciA9IGcocmVjKTsNCgkJICAgICAgICAJcmV0dXJuIChyID09PSB1bmRlZmluZWQgfHwgciA9PT0gIiIpID8gbnVsbCA6IHI7DQoJICAgICAgICAJfTsNCgkgICAgICAgIH0gZWxzZSB7DQoJICAgICAgICAJdGhpcy5nZXRJZCA9IGZ1bmN0aW9uKCl7cmV0dXJuIG51bGw7fTsNCgkgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMuZWYgPSBbXTsNCiAgICAgICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBmbDsgaSsrKXsNCiAgICAgICAgICAgICAgICBmID0gZmlbaV07DQogICAgICAgICAgICAgICAgdmFyIG1hcCA9IChmLm1hcHBpbmcgIT09IHVuZGVmaW5lZCAmJiBmLm1hcHBpbmcgIT09IG51bGwpID8gZi5tYXBwaW5nIDogZi5uYW1lOw0KICAgICAgICAgICAgICAgIHRoaXMuZWZbaV0gPSB0aGlzLmdldEpzb25BY2Nlc3NvcihtYXApOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAJdmFyIHJvb3QgPSB0aGlzLmdldFJvb3QobyksIGMgPSByb290Lmxlbmd0aCwgdG90YWxSZWNvcmRzID0gYywgc3VjY2VzcyA9IHRydWU7DQogICAgCWlmKHMudG90YWxQcm9wZXJ0eSl7DQogICAgICAgICAgICB2YXIgdiA9IHBhcnNlSW50KHRoaXMuZ2V0VG90YWwobyksIDEwKTsNCiAgICAgICAgICAgIGlmKCFpc05hTih2KSl7DQogICAgICAgICAgICAgICAgdG90YWxSZWNvcmRzID0gdjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZihzLnN1Y2Nlc3NQcm9wZXJ0eSl7DQogICAgICAgICAgICB2YXIgdiA9IHRoaXMuZ2V0U3VjY2VzcyhvKTsNCiAgICAgICAgICAgIGlmKHYgPT09IGZhbHNlIHx8IHYgPT09ICdmYWxzZScpew0KICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICB2YXIgcmVjb3JkcyA9IFtdOw0KCSAgICBmb3IodmFyIGkgPSAwOyBpIDwgYzsgaSsrKXsNCgkJICAgIHZhciBuID0gcm9vdFtpXTsNCgkgICAgICAgIHZhciB2YWx1ZXMgPSB7fTsNCgkgICAgICAgIHZhciBpZCA9IHRoaXMuZ2V0SWQobik7DQoJICAgICAgICBmb3IodmFyIGogPSAwOyBqIDwgZmw7IGorKyl7DQoJICAgICAgICAgICAgZiA9IGZpW2pdOw0KICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5lZltqXShuKTsNCiAgICAgICAgICAgICAgICB2YWx1ZXNbZi5uYW1lXSA9IGYuY29udmVydCgodiAhPT0gdW5kZWZpbmVkKSA/IHYgOiBmLmRlZmF1bHRWYWx1ZSk7DQoJICAgICAgICB9DQoJICAgICAgICB2YXIgcmVjb3JkID0gbmV3IFJlY29yZCh2YWx1ZXMsIGlkKTsNCgkgICAgICAgIHJlY29yZC5qc29uID0gbjsNCgkgICAgICAgIHJlY29yZHNbaV0gPSByZWNvcmQ7DQoJICAgIH0NCgkgICAgcmV0dXJuIHsNCgkgICAgICAgIHN1Y2Nlc3MgOiBzdWNjZXNzLA0KCSAgICAgICAgcmVjb3JkcyA6IHJlY29yZHMsDQoJICAgICAgICB0b3RhbFJlY29yZHMgOiB0b3RhbFJlY29yZHMNCgkgICAgfTsNCiAgICB9DQp9KTsKCQ0KRXh0LmRhdGEuWG1sUmVhZGVyID0gZnVuY3Rpb24obWV0YSwgcmVjb3JkVHlwZSl7DQogICAgbWV0YSA9IG1ldGEgfHwge307DQogICAgRXh0LmRhdGEuWG1sUmVhZGVyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBtZXRhLCByZWNvcmRUeXBlfHxtZXRhLmZpZWxkcyk7DQp9Ow0KRXh0LmV4dGVuZChFeHQuZGF0YS5YbWxSZWFkZXIsIEV4dC5kYXRhLkRhdGFSZWFkZXIsIHsNCiAgICANCiAgICByZWFkIDogZnVuY3Rpb24ocmVzcG9uc2Upew0KICAgICAgICB2YXIgZG9jID0gcmVzcG9uc2UucmVzcG9uc2VYTUw7DQogICAgICAgIGlmKCFkb2MpIHsNCiAgICAgICAgICAgIHRocm93IHttZXNzYWdlOiAiWG1sUmVhZGVyLnJlYWQ6IFhNTCBEb2N1bWVudCBub3QgYXZhaWxhYmxlIn07DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHRoaXMucmVhZFJlY29yZHMoZG9jKTsNCiAgICB9LA0KDQogICAgDQogICAgcmVhZFJlY29yZHMgOiBmdW5jdGlvbihkb2Mpew0KICAgICAgICANCiAgICAgICAgdGhpcy54bWxEYXRhID0gZG9jOw0KICAgICAgICB2YXIgcm9vdCA9IGRvYy5kb2N1bWVudEVsZW1lbnQgfHwgZG9jOw0KICAgIAl2YXIgcSA9IEV4dC5Eb21RdWVyeTsNCiAgICAJdmFyIHJlY29yZFR5cGUgPSB0aGlzLnJlY29yZFR5cGUsIGZpZWxkcyA9IHJlY29yZFR5cGUucHJvdG90eXBlLmZpZWxkczsNCiAgICAJdmFyIHNpZCA9IHRoaXMubWV0YS5pZDsNCiAgICAJdmFyIHRvdGFsUmVjb3JkcyA9IDAsIHN1Y2Nlc3MgPSB0cnVlOw0KICAgIAlpZih0aGlzLm1ldGEudG90YWxSZWNvcmRzKXsNCiAgICAJICAgIHRvdGFsUmVjb3JkcyA9IHEuc2VsZWN0TnVtYmVyKHRoaXMubWV0YS50b3RhbFJlY29yZHMsIHJvb3QsIDApOw0KICAgIAl9DQogICAgICAgIA0KICAgICAgICBpZih0aGlzLm1ldGEuc3VjY2Vzcyl7DQogICAgICAgICAgICB2YXIgc3YgPSBxLnNlbGVjdFZhbHVlKHRoaXMubWV0YS5zdWNjZXNzLCByb290LCB0cnVlKTsNCiAgICAgICAgICAgIHN1Y2Nlc3MgPSBzdiAhPT0gZmFsc2UgJiYgc3YgIT09ICdmYWxzZSc7DQogICAgCX0NCiAgICAJdmFyIHJlY29yZHMgPSBbXTsNCiAgICAJdmFyIG5zID0gcS5zZWxlY3QodGhpcy5tZXRhLnJlY29yZCwgcm9vdCk7DQogICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IG5zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7DQoJICAgICAgICB2YXIgbiA9IG5zW2ldOw0KCSAgICAgICAgdmFyIHZhbHVlcyA9IHt9Ow0KCSAgICAgICAgdmFyIGlkID0gc2lkID8gcS5zZWxlY3RWYWx1ZShzaWQsIG4pIDogdW5kZWZpbmVkOw0KCSAgICAgICAgZm9yKHZhciBqID0gMCwgamxlbiA9IGZpZWxkcy5sZW5ndGg7IGogPCBqbGVuOyBqKyspew0KCSAgICAgICAgICAgIHZhciBmID0gZmllbGRzLml0ZW1zW2pdOw0KICAgICAgICAgICAgICAgIHZhciB2ID0gcS5zZWxlY3RWYWx1ZShmLm1hcHBpbmcgfHwgZi5uYW1lLCBuLCBmLmRlZmF1bHRWYWx1ZSk7DQoJICAgICAgICAgICAgdiA9IGYuY29udmVydCh2KTsNCgkgICAgICAgICAgICB2YWx1ZXNbZi5uYW1lXSA9IHY7DQoJICAgICAgICB9DQoJICAgICAgICB2YXIgcmVjb3JkID0gbmV3IHJlY29yZFR5cGUodmFsdWVzLCBpZCk7DQoJICAgICAgICByZWNvcmQubm9kZSA9IG47DQoJICAgICAgICByZWNvcmRzW3JlY29yZHMubGVuZ3RoXSA9IHJlY29yZDsNCgkgICAgfQ0KDQoJICAgIHJldHVybiB7DQoJICAgICAgICBzdWNjZXNzIDogc3VjY2VzcywNCgkgICAgICAgIHJlY29yZHMgOiByZWNvcmRzLA0KCSAgICAgICAgdG90YWxSZWNvcmRzIDogdG90YWxSZWNvcmRzIHx8IHJlY29yZHMubGVuZ3RoDQoJICAgIH07DQogICAgfQ0KfSk7Cg0KRXh0LmRhdGEuQXJyYXlSZWFkZXIgPSBmdW5jdGlvbihtZXRhLCByZWNvcmRUeXBlKXsNCiAgICBFeHQuZGF0YS5BcnJheVJlYWRlci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgbWV0YSwgcmVjb3JkVHlwZSk7DQp9Ow0KDQpFeHQuZXh0ZW5kKEV4dC5kYXRhLkFycmF5UmVhZGVyLCBFeHQuZGF0YS5Kc29uUmVhZGVyLCB7DQogICAgDQogICAgcmVhZFJlY29yZHMgOiBmdW5jdGlvbihvKXsNCiAgICAgICAgdmFyIHNpZCA9IHRoaXMubWV0YSA/IHRoaXMubWV0YS5pZCA6IG51bGw7DQogICAgCXZhciByZWNvcmRUeXBlID0gdGhpcy5yZWNvcmRUeXBlLCBmaWVsZHMgPSByZWNvcmRUeXBlLnByb3RvdHlwZS5maWVsZHM7DQogICAgCXZhciByZWNvcmRzID0gW107DQogICAgCXZhciByb290ID0gbzsNCgkgICAgZm9yKHZhciBpID0gMDsgaSA8IHJvb3QubGVuZ3RoOyBpKyspew0KCQkgICAgdmFyIG4gPSByb290W2ldOw0KCSAgICAgICAgdmFyIHZhbHVlcyA9IHt9Ow0KCSAgICAgICAgdmFyIGlkID0gKChzaWQgfHwgc2lkID09PSAwKSAmJiBuW3NpZF0gIT09IHVuZGVmaW5lZCAmJiBuW3NpZF0gIT09ICIiID8gbltzaWRdIDogbnVsbCk7DQoJICAgICAgICBmb3IodmFyIGogPSAwLCBqbGVuID0gZmllbGRzLmxlbmd0aDsgaiA8IGpsZW47IGorKyl7DQogICAgICAgICAgICAgICAgdmFyIGYgPSBmaWVsZHMuaXRlbXNbal07DQogICAgICAgICAgICAgICAgdmFyIGsgPSBmLm1hcHBpbmcgIT09IHVuZGVmaW5lZCAmJiBmLm1hcHBpbmcgIT09IG51bGwgPyBmLm1hcHBpbmcgOiBqOw0KICAgICAgICAgICAgICAgIHZhciB2ID0gbltrXSAhPT0gdW5kZWZpbmVkID8gbltrXSA6IGYuZGVmYXVsdFZhbHVlOw0KICAgICAgICAgICAgICAgIHYgPSBmLmNvbnZlcnQodik7DQogICAgICAgICAgICAgICAgdmFsdWVzW2YubmFtZV0gPSB2Ow0KICAgICAgICAgICAgfQ0KCSAgICAgICAgdmFyIHJlY29yZCA9IG5ldyByZWNvcmRUeXBlKHZhbHVlcywgaWQpOw0KCSAgICAgICAgcmVjb3JkLmpzb24gPSBuOw0KCSAgICAgICAgcmVjb3Jkc1tyZWNvcmRzLmxlbmd0aF0gPSByZWNvcmQ7DQoJICAgIH0NCgkgICAgcmV0dXJuIHsNCgkgICAgICAgIHJlY29yZHMgOiByZWNvcmRzLA0KCSAgICAgICAgdG90YWxSZWNvcmRzIDogcmVjb3Jkcy5sZW5ndGgNCgkgICAgfTsNCiAgICB9DQp9KTsKDQpFeHQuZGF0YS5UcmVlID0gZnVuY3Rpb24ocm9vdCl7DQogICB0aGlzLm5vZGVIYXNoID0ge307DQogICANCiAgIHRoaXMucm9vdCA9IG51bGw7DQogICBpZihyb290KXsNCiAgICAgICB0aGlzLnNldFJvb3ROb2RlKHJvb3QpOw0KICAgfQ0KICAgdGhpcy5hZGRFdmVudHMoew0KICAgICAgIA0KICAgICAgICJhcHBlbmQiIDogdHJ1ZSwNCiAgICAgICANCiAgICAgICAicmVtb3ZlIiA6IHRydWUsDQogICAgICAgDQogICAgICAgIm1vdmUiIDogdHJ1ZSwNCiAgICAgICANCiAgICAgICAiaW5zZXJ0IiA6IHRydWUsDQogICAgICAgDQogICAgICAgImJlZm9yZWFwcGVuZCIgOiB0cnVlLA0KICAgICAgIA0KICAgICAgICJiZWZvcmVyZW1vdmUiIDogdHJ1ZSwNCiAgICAgICANCiAgICAgICAiYmVmb3JlbW92ZSIgOiB0cnVlLA0KICAgICAgIA0KICAgICAgICJiZWZvcmVpbnNlcnQiIDogdHJ1ZQ0KICAgfSk7DQoNCiAgICBFeHQuZGF0YS5UcmVlLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTsNCn07DQoNCkV4dC5leHRlbmQoRXh0LmRhdGEuVHJlZSwgRXh0LnV0aWwuT2JzZXJ2YWJsZSwgew0KICAgIHBhdGhTZXBhcmF0b3I6ICIvIiwNCg0KICAgIHByb3h5Tm9kZUV2ZW50IDogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIHRoaXMuZmlyZUV2ZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7DQogICAgfSwNCg0KICAgIA0KICAgIGdldFJvb3ROb2RlIDogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIHRoaXMucm9vdDsNCiAgICB9LA0KDQogICAgDQogICAgc2V0Um9vdE5vZGUgOiBmdW5jdGlvbihub2RlKXsNCiAgICAgICAgdGhpcy5yb290ID0gbm9kZTsNCiAgICAgICAgbm9kZS5vd25lclRyZWUgPSB0aGlzOw0KICAgICAgICBub2RlLmlzUm9vdCA9IHRydWU7DQogICAgICAgIHRoaXMucmVnaXN0ZXJOb2RlKG5vZGUpOw0KICAgICAgICByZXR1cm4gbm9kZTsNCiAgICB9LA0KDQogICAgDQogICAgZ2V0Tm9kZUJ5SWQgOiBmdW5jdGlvbihpZCl7DQogICAgICAgIHJldHVybiB0aGlzLm5vZGVIYXNoW2lkXTsNCiAgICB9LA0KDQogICAgcmVnaXN0ZXJOb2RlIDogZnVuY3Rpb24obm9kZSl7DQogICAgICAgIHRoaXMubm9kZUhhc2hbbm9kZS5pZF0gPSBub2RlOw0KICAgIH0sDQoNCiAgICB1bnJlZ2lzdGVyTm9kZSA6IGZ1bmN0aW9uKG5vZGUpew0KICAgICAgICBkZWxldGUgdGhpcy5ub2RlSGFzaFtub2RlLmlkXTsNCiAgICB9LA0KDQogICAgdG9TdHJpbmcgOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gIltUcmVlIisodGhpcy5pZD8iICIrdGhpcy5pZDoiIikrIl0iOw0KICAgIH0NCn0pOw0KDQoNCkV4dC5kYXRhLk5vZGUgPSBmdW5jdGlvbihhdHRyaWJ1dGVzKXsNCiAgICANCiAgICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzIHx8IHt9Ow0KICAgIHRoaXMubGVhZiA9IHRoaXMuYXR0cmlidXRlcy5sZWFmOw0KICAgIA0KICAgIHRoaXMuaWQgPSB0aGlzLmF0dHJpYnV0ZXMuaWQ7DQogICAgaWYoIXRoaXMuaWQpew0KICAgICAgICB0aGlzLmlkID0gRXh0LmlkKG51bGwsICJ5bm9kZS0iKTsNCiAgICAgICAgdGhpcy5hdHRyaWJ1dGVzLmlkID0gdGhpcy5pZDsNCiAgICB9DQogICAgDQogICAgdGhpcy5jaGlsZE5vZGVzID0gW107DQogICAgaWYoIXRoaXMuY2hpbGROb2Rlcy5pbmRleE9mKXsgCiAgICAgICAgdGhpcy5jaGlsZE5vZGVzLmluZGV4T2YgPSBmdW5jdGlvbihvKXsNCiAgICAgICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IHRoaXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspew0KICAgICAgICAgICAgICAgIGlmKHRoaXNbaV0gPT0gbykgcmV0dXJuIGk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gLTE7DQogICAgICAgIH07DQogICAgfQ0KICAgIA0KICAgIHRoaXMucGFyZW50Tm9kZSA9IG51bGw7DQogICAgDQogICAgdGhpcy5maXJzdENoaWxkID0gbnVsbDsNCiAgICANCiAgICB0aGlzLmxhc3RDaGlsZCA9IG51bGw7DQogICAgDQogICAgdGhpcy5wcmV2aW91c1NpYmxpbmcgPSBudWxsOw0KICAgIA0KICAgIHRoaXMubmV4dFNpYmxpbmcgPSBudWxsOw0KDQogICAgdGhpcy5hZGRFdmVudHMoew0KICAgICAgIA0KICAgICAgICJhcHBlbmQiIDogdHJ1ZSwNCiAgICAgICANCiAgICAgICAicmVtb3ZlIiA6IHRydWUsDQogICAgICAgDQogICAgICAgIm1vdmUiIDogdHJ1ZSwNCiAgICAgICANCiAgICAgICAiaW5zZXJ0IiA6IHRydWUsDQogICAgICAgDQogICAgICAgImJlZm9yZWFwcGVuZCIgOiB0cnVlLA0KICAgICAgIA0KICAgICAgICJiZWZvcmVyZW1vdmUiIDogdHJ1ZSwNCiAgICAgICANCiAgICAgICAiYmVmb3JlbW92ZSIgOiB0cnVlLA0KICAgICAgIA0KICAgICAgICJiZWZvcmVpbnNlcnQiIDogdHJ1ZQ0KICAgfSk7DQogICAgdGhpcy5saXN0ZW5lcnMgPSB0aGlzLmF0dHJpYnV0ZXMubGlzdGVuZXJzOw0KICAgIEV4dC5kYXRhLk5vZGUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpOw0KfTsNCg0KRXh0LmV4dGVuZChFeHQuZGF0YS5Ob2RlLCBFeHQudXRpbC5PYnNlcnZhYmxlLCB7DQogICAgZmlyZUV2ZW50IDogZnVuY3Rpb24oZXZ0TmFtZSl7DQogICAgICAgIAogICAgICAgIGlmKEV4dC5kYXRhLk5vZGUuc3VwZXJjbGFzcy5maXJlRXZlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSA9PT0gZmFsc2Upew0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9DQogICAgICAgIAogICAgICAgIHZhciBvdCA9IHRoaXMuZ2V0T3duZXJUcmVlKCk7DQogICAgICAgIGlmKG90KXsNCiAgICAgICAgICAgIGlmKG90LnByb3h5Tm9kZUV2ZW50LmFwcGx5KG90LCBhcmd1bWVudHMpID09PSBmYWxzZSl7DQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0cnVlOw0KICAgIH0sDQoNCiAgICANCiAgICBpc0xlYWYgOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gdGhpcy5sZWFmID09PSB0cnVlOw0KICAgIH0sDQoNCiAgICAKICAgIHNldEZpcnN0Q2hpbGQgOiBmdW5jdGlvbihub2RlKXsNCiAgICAgICAgdGhpcy5maXJzdENoaWxkID0gbm9kZTsNCiAgICB9LA0KDQogICAgCiAgICBzZXRMYXN0Q2hpbGQgOiBmdW5jdGlvbihub2RlKXsNCiAgICAgICAgdGhpcy5sYXN0Q2hpbGQgPSBub2RlOw0KICAgIH0sDQoNCg0KICAgIA0KICAgIGlzTGFzdCA6IGZ1bmN0aW9uKCl7DQogICAgICAgcmV0dXJuICghdGhpcy5wYXJlbnROb2RlID8gdHJ1ZSA6IHRoaXMucGFyZW50Tm9kZS5sYXN0Q2hpbGQgPT0gdGhpcyk7DQogICAgfSwNCg0KICAgIA0KICAgIGlzRmlyc3QgOiBmdW5jdGlvbigpew0KICAgICAgIHJldHVybiAoIXRoaXMucGFyZW50Tm9kZSA/IHRydWUgOiB0aGlzLnBhcmVudE5vZGUuZmlyc3RDaGlsZCA9PSB0aGlzKTsNCiAgICB9LA0KDQogICAgaGFzQ2hpbGROb2RlcyA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiAhdGhpcy5pc0xlYWYoKSAmJiB0aGlzLmNoaWxkTm9kZXMubGVuZ3RoID4gMDsNCiAgICB9LA0KDQogICAgDQogICAgYXBwZW5kQ2hpbGQgOiBmdW5jdGlvbihub2RlKXsNCiAgICAgICAgdmFyIG11bHRpID0gZmFsc2U7DQogICAgICAgIGlmKG5vZGUgaW5zdGFuY2VvZiBBcnJheSl7DQogICAgICAgICAgICBtdWx0aSA9IG5vZGU7DQogICAgICAgIH1lbHNlIGlmKGFyZ3VtZW50cy5sZW5ndGggPiAxKXsNCiAgICAgICAgICAgIG11bHRpID0gYXJndW1lbnRzOw0KICAgICAgICB9DQogICAgICAgIAogICAgICAgIGlmKG11bHRpKXsNCiAgICAgICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IG11bHRpLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7DQogICAgICAgICAgICAJdGhpcy5hcHBlbmRDaGlsZChtdWx0aVtpXSk7DQogICAgICAgICAgICB9DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgaWYodGhpcy5maXJlRXZlbnQoImJlZm9yZWFwcGVuZCIsIHRoaXMub3duZXJUcmVlLCB0aGlzLCBub2RlKSA9PT0gZmFsc2Upew0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuY2hpbGROb2Rlcy5sZW5ndGg7DQogICAgICAgICAgICB2YXIgb2xkUGFyZW50ID0gbm9kZS5wYXJlbnROb2RlOw0KICAgICAgICAgICAgCiAgICAgICAgICAgIGlmKG9sZFBhcmVudCl7DQogICAgICAgICAgICAgICAgaWYobm9kZS5maXJlRXZlbnQoImJlZm9yZW1vdmUiLCBub2RlLmdldE93bmVyVHJlZSgpLCBub2RlLCBvbGRQYXJlbnQsIHRoaXMsIGluZGV4KSA9PT0gZmFsc2Upew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIG9sZFBhcmVudC5yZW1vdmVDaGlsZChub2RlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGluZGV4ID0gdGhpcy5jaGlsZE5vZGVzLmxlbmd0aDsNCiAgICAgICAgICAgIGlmKGluZGV4ID09IDApew0KICAgICAgICAgICAgICAgIHRoaXMuc2V0Rmlyc3RDaGlsZChub2RlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMuY2hpbGROb2Rlcy5wdXNoKG5vZGUpOw0KICAgICAgICAgICAgbm9kZS5wYXJlbnROb2RlID0gdGhpczsNCiAgICAgICAgICAgIHZhciBwcyA9IHRoaXMuY2hpbGROb2Rlc1tpbmRleC0xXTsNCiAgICAgICAgICAgIGlmKHBzKXsNCiAgICAgICAgICAgICAgICBub2RlLnByZXZpb3VzU2libGluZyA9IHBzOw0KICAgICAgICAgICAgICAgIHBzLm5leHRTaWJsaW5nID0gbm9kZTsNCiAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgIG5vZGUucHJldmlvdXNTaWJsaW5nID0gbnVsbDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIG5vZGUubmV4dFNpYmxpbmcgPSBudWxsOw0KICAgICAgICAgICAgdGhpcy5zZXRMYXN0Q2hpbGQobm9kZSk7DQogICAgICAgICAgICBub2RlLnNldE93bmVyVHJlZSh0aGlzLmdldE93bmVyVHJlZSgpKTsNCiAgICAgICAgICAgIHRoaXMuZmlyZUV2ZW50KCJhcHBlbmQiLCB0aGlzLm93bmVyVHJlZSwgdGhpcywgbm9kZSwgaW5kZXgpOw0KICAgICAgICAgICAgaWYob2xkUGFyZW50KXsNCiAgICAgICAgICAgICAgICBub2RlLmZpcmVFdmVudCgibW92ZSIsIHRoaXMub3duZXJUcmVlLCBub2RlLCBvbGRQYXJlbnQsIHRoaXMsIGluZGV4KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBub2RlOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIHJlbW92ZUNoaWxkIDogZnVuY3Rpb24obm9kZSl7DQogICAgICAgIHZhciBpbmRleCA9IHRoaXMuY2hpbGROb2Rlcy5pbmRleE9mKG5vZGUpOw0KICAgICAgICBpZihpbmRleCA9PSAtMSl7DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCiAgICAgICAgaWYodGhpcy5maXJlRXZlbnQoImJlZm9yZXJlbW92ZSIsIHRoaXMub3duZXJUcmVlLCB0aGlzLCBub2RlKSA9PT0gZmFsc2Upew0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9DQoNCiAgICAgICAgCiAgICAgICAgdGhpcy5jaGlsZE5vZGVzLnNwbGljZShpbmRleCwgMSk7DQoNCiAgICAgICAgCiAgICAgICAgaWYobm9kZS5wcmV2aW91c1NpYmxpbmcpew0KICAgICAgICAgICAgbm9kZS5wcmV2aW91c1NpYmxpbmcubmV4dFNpYmxpbmcgPSBub2RlLm5leHRTaWJsaW5nOw0KICAgICAgICB9DQogICAgICAgIGlmKG5vZGUubmV4dFNpYmxpbmcpew0KICAgICAgICAgICAgbm9kZS5uZXh0U2libGluZy5wcmV2aW91c1NpYmxpbmcgPSBub2RlLnByZXZpb3VzU2libGluZzsNCiAgICAgICAgfQ0KDQogICAgICAgIAogICAgICAgIGlmKHRoaXMuZmlyc3RDaGlsZCA9PSBub2RlKXsNCiAgICAgICAgICAgIHRoaXMuc2V0Rmlyc3RDaGlsZChub2RlLm5leHRTaWJsaW5nKTsNCiAgICAgICAgfQ0KICAgICAgICBpZih0aGlzLmxhc3RDaGlsZCA9PSBub2RlKXsNCiAgICAgICAgICAgIHRoaXMuc2V0TGFzdENoaWxkKG5vZGUucHJldmlvdXNTaWJsaW5nKTsNCiAgICAgICAgfQ0KDQogICAgICAgIG5vZGUuc2V0T3duZXJUcmVlKG51bGwpOw0KICAgICAgICAKICAgICAgICBub2RlLnBhcmVudE5vZGUgPSBudWxsOw0KICAgICAgICBub2RlLnByZXZpb3VzU2libGluZyA9IG51bGw7DQogICAgICAgIG5vZGUubmV4dFNpYmxpbmcgPSBudWxsOw0KICAgICAgICB0aGlzLmZpcmVFdmVudCgicmVtb3ZlIiwgdGhpcy5vd25lclRyZWUsIHRoaXMsIG5vZGUpOw0KICAgICAgICByZXR1cm4gbm9kZTsNCiAgICB9LA0KDQogICAgDQogICAgaW5zZXJ0QmVmb3JlIDogZnVuY3Rpb24obm9kZSwgcmVmTm9kZSl7DQogICAgICAgIGlmKCFyZWZOb2RlKXsgCiAgICAgICAgICAgIHJldHVybiB0aGlzLmFwcGVuZENoaWxkKG5vZGUpOw0KICAgICAgICB9DQogICAgICAgIAogICAgICAgIGlmKG5vZGUgPT0gcmVmTm9kZSl7DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCg0KICAgICAgICBpZih0aGlzLmZpcmVFdmVudCgiYmVmb3JlaW5zZXJ0IiwgdGhpcy5vd25lclRyZWUsIHRoaXMsIG5vZGUsIHJlZk5vZGUpID09PSBmYWxzZSl7DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5jaGlsZE5vZGVzLmluZGV4T2YocmVmTm9kZSk7DQogICAgICAgIHZhciBvbGRQYXJlbnQgPSBub2RlLnBhcmVudE5vZGU7DQogICAgICAgIHZhciByZWZJbmRleCA9IGluZGV4Ow0KDQogICAgICAgIAogICAgICAgIGlmKG9sZFBhcmVudCA9PSB0aGlzICYmIHRoaXMuY2hpbGROb2Rlcy5pbmRleE9mKG5vZGUpIDwgaW5kZXgpew0KICAgICAgICAgICAgcmVmSW5kZXgtLTsNCiAgICAgICAgfQ0KDQogICAgICAgIAogICAgICAgIGlmKG9sZFBhcmVudCl7DQogICAgICAgICAgICBpZihub2RlLmZpcmVFdmVudCgiYmVmb3JlbW92ZSIsIG5vZGUuZ2V0T3duZXJUcmVlKCksIG5vZGUsIG9sZFBhcmVudCwgdGhpcywgaW5kZXgsIHJlZk5vZGUpID09PSBmYWxzZSl7DQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgb2xkUGFyZW50LnJlbW92ZUNoaWxkKG5vZGUpOw0KICAgICAgICB9DQogICAgICAgIGlmKHJlZkluZGV4ID09IDApew0KICAgICAgICAgICAgdGhpcy5zZXRGaXJzdENoaWxkKG5vZGUpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuY2hpbGROb2Rlcy5zcGxpY2UocmVmSW5kZXgsIDAsIG5vZGUpOw0KICAgICAgICBub2RlLnBhcmVudE5vZGUgPSB0aGlzOw0KICAgICAgICB2YXIgcHMgPSB0aGlzLmNoaWxkTm9kZXNbcmVmSW5kZXgtMV07DQogICAgICAgIGlmKHBzKXsNCiAgICAgICAgICAgIG5vZGUucHJldmlvdXNTaWJsaW5nID0gcHM7DQogICAgICAgICAgICBwcy5uZXh0U2libGluZyA9IG5vZGU7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgbm9kZS5wcmV2aW91c1NpYmxpbmcgPSBudWxsOw0KICAgICAgICB9DQogICAgICAgIG5vZGUubmV4dFNpYmxpbmcgPSByZWZOb2RlOw0KICAgICAgICByZWZOb2RlLnByZXZpb3VzU2libGluZyA9IG5vZGU7DQogICAgICAgIG5vZGUuc2V0T3duZXJUcmVlKHRoaXMuZ2V0T3duZXJUcmVlKCkpOw0KICAgICAgICB0aGlzLmZpcmVFdmVudCgiaW5zZXJ0IiwgdGhpcy5vd25lclRyZWUsIHRoaXMsIG5vZGUsIHJlZk5vZGUpOw0KICAgICAgICBpZihvbGRQYXJlbnQpew0KICAgICAgICAgICAgbm9kZS5maXJlRXZlbnQoIm1vdmUiLCB0aGlzLm93bmVyVHJlZSwgbm9kZSwgb2xkUGFyZW50LCB0aGlzLCByZWZJbmRleCwgcmVmTm9kZSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG5vZGU7DQogICAgfSwNCg0KICAgIA0KICAgIGl0ZW0gOiBmdW5jdGlvbihpbmRleCl7DQogICAgICAgIHJldHVybiB0aGlzLmNoaWxkTm9kZXNbaW5kZXhdOw0KICAgIH0sDQoNCiAgICANCiAgICByZXBsYWNlQ2hpbGQgOiBmdW5jdGlvbihuZXdDaGlsZCwgb2xkQ2hpbGQpew0KICAgICAgICB0aGlzLmluc2VydEJlZm9yZShuZXdDaGlsZCwgb2xkQ2hpbGQpOw0KICAgICAgICB0aGlzLnJlbW92ZUNoaWxkKG9sZENoaWxkKTsNCiAgICAgICAgcmV0dXJuIG9sZENoaWxkOw0KICAgIH0sDQoNCiAgICANCiAgICBpbmRleE9mIDogZnVuY3Rpb24oY2hpbGQpew0KICAgICAgICByZXR1cm4gdGhpcy5jaGlsZE5vZGVzLmluZGV4T2YoY2hpbGQpOw0KICAgIH0sDQoNCiAgICANCiAgICBnZXRPd25lclRyZWUgOiBmdW5jdGlvbigpew0KICAgICAgICAKICAgICAgICBpZighdGhpcy5vd25lclRyZWUpew0KICAgICAgICAgICAgdmFyIHAgPSB0aGlzOw0KICAgICAgICAgICAgd2hpbGUocCl7DQogICAgICAgICAgICAgICAgaWYocC5vd25lclRyZWUpew0KICAgICAgICAgICAgICAgICAgICB0aGlzLm93bmVyVHJlZSA9IHAub3duZXJUcmVlOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcCA9IHAucGFyZW50Tm9kZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdGhpcy5vd25lclRyZWU7DQogICAgfSwNCg0KICAgIA0KICAgIGdldERlcHRoIDogZnVuY3Rpb24oKXsNCiAgICAgICAgdmFyIGRlcHRoID0gMDsNCiAgICAgICAgdmFyIHAgPSB0aGlzOw0KICAgICAgICB3aGlsZShwLnBhcmVudE5vZGUpew0KICAgICAgICAgICAgKytkZXB0aDsNCiAgICAgICAgICAgIHAgPSBwLnBhcmVudE5vZGU7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGRlcHRoOw0KICAgIH0sDQoNCiAgICAKICAgIHNldE93bmVyVHJlZSA6IGZ1bmN0aW9uKHRyZWUpew0KICAgICAgICAKICAgICAgICBpZih0cmVlICE9IHRoaXMub3duZXJUcmVlKXsNCiAgICAgICAgICAgIGlmKHRoaXMub3duZXJUcmVlKXsNCiAgICAgICAgICAgICAgICB0aGlzLm93bmVyVHJlZS51bnJlZ2lzdGVyTm9kZSh0aGlzKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMub3duZXJUcmVlID0gdHJlZTsNCiAgICAgICAgICAgIHZhciBjcyA9IHRoaXMuY2hpbGROb2RlczsNCiAgICAgICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IGNzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7DQogICAgICAgICAgICAJY3NbaV0uc2V0T3duZXJUcmVlKHRyZWUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYodHJlZSl7DQogICAgICAgICAgICAgICAgdHJlZS5yZWdpc3Rlck5vZGUodGhpcyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgDQogICAgZ2V0UGF0aCA6IGZ1bmN0aW9uKGF0dHIpew0KICAgICAgICBhdHRyID0gYXR0ciB8fCAiaWQiOw0KICAgICAgICB2YXIgcCA9IHRoaXMucGFyZW50Tm9kZTsNCiAgICAgICAgdmFyIGIgPSBbdGhpcy5hdHRyaWJ1dGVzW2F0dHJdXTsNCiAgICAgICAgd2hpbGUocCl7DQogICAgICAgICAgICBiLnVuc2hpZnQocC5hdHRyaWJ1dGVzW2F0dHJdKTsNCiAgICAgICAgICAgIHAgPSBwLnBhcmVudE5vZGU7DQogICAgICAgIH0NCiAgICAgICAgdmFyIHNlcCA9IHRoaXMuZ2V0T3duZXJUcmVlKCkucGF0aFNlcGFyYXRvcjsNCiAgICAgICAgcmV0dXJuIHNlcCArIGIuam9pbihzZXApOw0KICAgIH0sDQoNCiAgICANCiAgICBidWJibGUgOiBmdW5jdGlvbihmbiwgc2NvcGUsIGFyZ3Mpew0KICAgICAgICB2YXIgcCA9IHRoaXM7DQogICAgICAgIHdoaWxlKHApew0KICAgICAgICAgICAgaWYoZm4uY2FsbChzY29wZSB8fCBwLCBhcmdzIHx8IHApID09PSBmYWxzZSl7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBwID0gcC5wYXJlbnROb2RlOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIGNhc2NhZGUgOiBmdW5jdGlvbihmbiwgc2NvcGUsIGFyZ3Mpew0KICAgICAgICBpZihmbi5jYWxsKHNjb3BlIHx8IHRoaXMsIGFyZ3MgfHwgdGhpcykgIT09IGZhbHNlKXsNCiAgICAgICAgICAgIHZhciBjcyA9IHRoaXMuY2hpbGROb2RlczsNCiAgICAgICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IGNzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7DQogICAgICAgICAgICAJY3NbaV0uY2FzY2FkZShmbiwgc2NvcGUsIGFyZ3MpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIGVhY2hDaGlsZCA6IGZ1bmN0aW9uKGZuLCBzY29wZSwgYXJncyl7DQogICAgICAgIHZhciBjcyA9IHRoaXMuY2hpbGROb2RlczsNCiAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gY3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsNCiAgICAgICAgCWlmKGZuLmNhbGwoc2NvcGUgfHwgdGhpcywgYXJncyB8fCBjc1tpXSkgPT09IGZhbHNlKXsNCiAgICAgICAgCSAgICBicmVhazsNCiAgICAgICAgCX0NCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICANCiAgICBmaW5kQ2hpbGQgOiBmdW5jdGlvbihhdHRyaWJ1dGUsIHZhbHVlKXsNCiAgICAgICAgdmFyIGNzID0gdGhpcy5jaGlsZE5vZGVzOw0KICAgICAgICBmb3IodmFyIGkgPSAwLCBsZW4gPSBjcy5sZW5ndGg7IGkgPCBsZW47IGkrKykgew0KICAgICAgICAJaWYoY3NbaV0uYXR0cmlidXRlc1thdHRyaWJ1dGVdID09IHZhbHVlKXsNCiAgICAgICAgCSAgICByZXR1cm4gY3NbaV07DQogICAgICAgIAl9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfSwNCg0KICAgIA0KICAgIGZpbmRDaGlsZEJ5IDogZnVuY3Rpb24oZm4sIHNjb3BlKXsNCiAgICAgICAgdmFyIGNzID0gdGhpcy5jaGlsZE5vZGVzOw0KICAgICAgICBmb3IodmFyIGkgPSAwLCBsZW4gPSBjcy5sZW5ndGg7IGkgPCBsZW47IGkrKykgew0KICAgICAgICAJaWYoZm4uY2FsbChzY29wZXx8Y3NbaV0sIGNzW2ldKSA9PT0gdHJ1ZSl7DQogICAgICAgIAkgICAgcmV0dXJuIGNzW2ldOw0KICAgICAgICAJfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiBudWxsOw0KICAgIH0sDQoNCiAgICANCiAgICBzb3J0IDogZnVuY3Rpb24oZm4sIHNjb3BlKXsNCiAgICAgICAgdmFyIGNzID0gdGhpcy5jaGlsZE5vZGVzOw0KICAgICAgICB2YXIgbGVuID0gY3MubGVuZ3RoOw0KICAgICAgICBpZihsZW4gPiAwKXsNCiAgICAgICAgICAgIHZhciBzb3J0Rm4gPSBzY29wZSA/IGZ1bmN0aW9uKCl7Zm4uYXBwbHkoc2NvcGUsIGFyZ3VtZW50cyk7fSA6IGZuOw0KICAgICAgICAgICAgY3Muc29ydChzb3J0Rm4pOw0KICAgICAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKXsNCiAgICAgICAgICAgICAgICB2YXIgbiA9IGNzW2ldOw0KICAgICAgICAgICAgICAgIG4ucHJldmlvdXNTaWJsaW5nID0gY3NbaS0xXTsNCiAgICAgICAgICAgICAgICBuLm5leHRTaWJsaW5nID0gY3NbaSsxXTsNCiAgICAgICAgICAgICAgICBpZihpID09IDApew0KICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEZpcnN0Q2hpbGQobik7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmKGkgPT0gbGVuLTEpew0KICAgICAgICAgICAgICAgICAgICB0aGlzLnNldExhc3RDaGlsZChuKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgDQogICAgY29udGFpbnMgOiBmdW5jdGlvbihub2RlKXsNCiAgICAgICAgcmV0dXJuIG5vZGUuaXNBbmNlc3Rvcih0aGlzKTsNCiAgICB9LA0KDQogICAgDQogICAgaXNBbmNlc3RvciA6IGZ1bmN0aW9uKG5vZGUpew0KICAgICAgICB2YXIgcCA9IHRoaXMucGFyZW50Tm9kZTsNCiAgICAgICAgd2hpbGUocCl7DQogICAgICAgICAgICBpZihwID09IG5vZGUpew0KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcCA9IHAucGFyZW50Tm9kZTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfSwNCg0KICAgIHRvU3RyaW5nIDogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuICJbTm9kZSIrKHRoaXMuaWQ/IiAiK3RoaXMuaWQ6IiIpKyJdIjsNCiAgICB9DQp9KTsKCkV4dC5Db21wb25lbnRNZ3IgPSBmdW5jdGlvbigpewogICAgdmFyIGFsbCA9IG5ldyBFeHQudXRpbC5NaXhlZENvbGxlY3Rpb24oKTsKCiAgICByZXR1cm4gewogICAgICAgIAogICAgICAgIHJlZ2lzdGVyIDogZnVuY3Rpb24oYyl7CiAgICAgICAgICAgIGFsbC5hZGQoYyk7CiAgICAgICAgfSwKCiAgICAgICAgCiAgICAgICAgdW5yZWdpc3RlciA6IGZ1bmN0aW9uKGMpewogICAgICAgICAgICBhbGwucmVtb3ZlKGMpOwogICAgICAgIH0sCgogICAgICAgIAogICAgICAgIGdldCA6IGZ1bmN0aW9uKGlkKXsKICAgICAgICAgICAgcmV0dXJuIGFsbC5nZXQoaWQpOwogICAgICAgIH0sCgogICAgICAgIAogICAgICAgIG9uQXZhaWxhYmxlIDogZnVuY3Rpb24oaWQsIGZuLCBzY29wZSl7CiAgICAgICAgICAgIGFsbC5vbigiYWRkIiwgZnVuY3Rpb24oaW5kZXgsIG8pewogICAgICAgICAgICAgICAgaWYoby5pZCA9PSBpZCl7CiAgICAgICAgICAgICAgICAgICAgZm4uY2FsbChzY29wZSB8fCBvLCBvKTsKICAgICAgICAgICAgICAgICAgICBhbGwudW4oImFkZCIsIGZuLCBzY29wZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH07Cn0oKTsKCgpFeHQuQ29tcG9uZW50ID0gZnVuY3Rpb24oY29uZmlnKXsKICAgIGNvbmZpZyA9IGNvbmZpZyB8fCB7fTsKICAgIGlmKGNvbmZpZy50YWdOYW1lIHx8IGNvbmZpZy5kb20gfHwgdHlwZW9mIGNvbmZpZyA9PSAic3RyaW5nIil7ICAgICAgICAgY29uZmlnID0ge2VsOiBjb25maWcsIGlkOiBjb25maWcuaWQgfHwgY29uZmlnfTsKICAgIH0KICAgIHRoaXMuaW5pdGlhbENvbmZpZyA9IGNvbmZpZzsKCiAgICBFeHQuYXBwbHkodGhpcywgY29uZmlnKTsKICAgIHRoaXMuYWRkRXZlbnRzKHsKICAgICAgICAKICAgICAgICBkaXNhYmxlIDogdHJ1ZSwKICAgICAgICAKICAgICAgICBlbmFibGUgOiB0cnVlLAogICAgICAgIAogICAgICAgIGJlZm9yZXNob3cgOiB0cnVlLAogICAgICAgIAogICAgICAgIHNob3cgOiB0cnVlLAogICAgICAgIAogICAgICAgIGJlZm9yZWhpZGUgOiB0cnVlLAogICAgICAgIAogICAgICAgIGhpZGUgOiB0cnVlLAogICAgICAgIAogICAgICAgIGJlZm9yZXJlbmRlciA6IHRydWUsCiAgICAgICAgCiAgICAgICAgcmVuZGVyIDogdHJ1ZSwKICAgICAgICAKICAgICAgICBiZWZvcmVkZXN0cm95IDogdHJ1ZSwKICAgICAgICAKICAgICAgICBkZXN0cm95IDogdHJ1ZQogICAgfSk7CiAgICBpZighdGhpcy5pZCl7CiAgICAgICAgdGhpcy5pZCA9ICJleHQtY29tcC0iICsgKCsrRXh0LkNvbXBvbmVudC5BVVRPX0lEKTsKICAgIH0KICAgIEV4dC5Db21wb25lbnRNZ3IucmVnaXN0ZXIodGhpcyk7CiAgICBFeHQuQ29tcG9uZW50LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTsKICAgIHRoaXMuaW5pdENvbXBvbmVudCgpOwogICAgaWYodGhpcy5yZW5kZXJUbyl7ICAgICAgICAgdGhpcy5yZW5kZXIodGhpcy5yZW5kZXJUbyk7CiAgICAgICAgZGVsZXRlIHRoaXMucmVuZGVyVG87CiAgICB9Cn07CgpFeHQuQ29tcG9uZW50LkFVVE9fSUQgPSAxMDAwOwoKRXh0LmV4dGVuZChFeHQuQ29tcG9uZW50LCBFeHQudXRpbC5PYnNlcnZhYmxlLCB7CiAgICAKICAgIGhpZGRlbiA6IGZhbHNlLAogICAgCiAgICBkaXNhYmxlZCA6IGZhbHNlLAogICAgCiAgICByZW5kZXJlZCA6IGZhbHNlLAogICAgCiAgICAKICAgIGRpc2FibGVkQ2xhc3MgOiAieC1pdGVtLWRpc2FibGVkIiwKCQogICAgYWxsb3dEb21Nb3ZlIDogdHJ1ZSwKICAgIAogICAgaGlkZU1vZGU6ICdkaXNwbGF5JywKCiAgICAgICAgY3R5cGUgOiAiRXh0LkNvbXBvbmVudCIsCgogICAgICAgIGFjdGlvbk1vZGUgOiAiZWwiLAoKICAgICAgICBnZXRBY3Rpb25FbCA6IGZ1bmN0aW9uKCl7CiAgICAgICAgcmV0dXJuIHRoaXNbdGhpcy5hY3Rpb25Nb2RlXTsKICAgIH0sCgogICAgaW5pdENvbXBvbmVudCA6IEV4dC5lbXB0eUZuLAogICAgCiAgICByZW5kZXIgOiBmdW5jdGlvbihjb250YWluZXIsIHBvc2l0aW9uKXsKICAgICAgICBpZighdGhpcy5yZW5kZXJlZCAmJiB0aGlzLmZpcmVFdmVudCgiYmVmb3JlcmVuZGVyIiwgdGhpcykgIT09IGZhbHNlKXsKICAgICAgICAgICAgaWYoIWNvbnRhaW5lciAmJiB0aGlzLmVsKXsKICAgICAgICAgICAgICAgIHRoaXMuZWwgPSBFeHQuZ2V0KHRoaXMuZWwpOwogICAgICAgICAgICAgICAgY29udGFpbmVyID0gdGhpcy5lbC5kb20ucGFyZW50Tm9kZTsKICAgICAgICAgICAgICAgIHRoaXMuYWxsb3dEb21Nb3ZlID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5jb250YWluZXIgPSBFeHQuZ2V0KGNvbnRhaW5lcik7CiAgICAgICAgICAgIHRoaXMucmVuZGVyZWQgPSB0cnVlOwogICAgICAgICAgICBpZihwb3NpdGlvbiAhPT0gdW5kZWZpbmVkKXsKICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBwb3NpdGlvbiA9PSAnbnVtYmVyJyl7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSB0aGlzLmNvbnRhaW5lci5kb20uY2hpbGROb2Rlc1twb3NpdGlvbl07CiAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IEV4dC5nZXREb20ocG9zaXRpb24pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMub25SZW5kZXIodGhpcy5jb250YWluZXIsIHBvc2l0aW9uIHx8IG51bGwpOwogICAgICAgICAgICBpZih0aGlzLmNscyl7CiAgICAgICAgICAgICAgICB0aGlzLmVsLmFkZENsYXNzKHRoaXMuY2xzKTsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNsczsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZih0aGlzLnN0eWxlKXsKICAgICAgICAgICAgICAgIHRoaXMuZWwuYXBwbHlTdHlsZXModGhpcy5zdHlsZSk7CiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zdHlsZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgicmVuZGVyIiwgdGhpcyk7CiAgICAgICAgICAgIHRoaXMuYWZ0ZXJSZW5kZXIodGhpcy5jb250YWluZXIpOwogICAgICAgICAgICBpZih0aGlzLmhpZGRlbil7CiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZih0aGlzLmRpc2FibGVkKXsKICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzOwogICAgfSwKCiAgICAgICAgICAgIG9uUmVuZGVyIDogZnVuY3Rpb24oY3QsIHBvc2l0aW9uKXsKICAgICAgICBpZih0aGlzLmVsKXsKICAgICAgICAgICAgdGhpcy5lbCA9IEV4dC5nZXQodGhpcy5lbCk7CiAgICAgICAgICAgIGlmKHRoaXMuYWxsb3dEb21Nb3ZlICE9PSBmYWxzZSl7CiAgICAgICAgICAgICAgICBjdC5kb20uaW5zZXJ0QmVmb3JlKHRoaXMuZWwuZG9tLCBwb3NpdGlvbik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9LAoKICAgICAgICBnZXRBdXRvQ3JlYXRlIDogZnVuY3Rpb24oKXsKICAgICAgICB2YXIgY2ZnID0gdHlwZW9mIHRoaXMuYXV0b0NyZWF0ZSA9PSAib2JqZWN0IiA/CiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dG9DcmVhdGUgOiBFeHQuYXBwbHkoe30sIHRoaXMuZGVmYXVsdEF1dG9DcmVhdGUpOwogICAgICAgIGlmKHRoaXMuaWQgJiYgIWNmZy5pZCl7CiAgICAgICAgICAgIGNmZy5pZCA9IHRoaXMuaWQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjZmc7CiAgICB9LAoKICAgICAgICBhZnRlclJlbmRlciA6IEV4dC5lbXB0eUZuLAoKICAgIAogICAgZGVzdHJveSA6IGZ1bmN0aW9uKCl7CiAgICAgICAgaWYodGhpcy5maXJlRXZlbnQoImJlZm9yZWRlc3Ryb3kiLCB0aGlzKSAhPT0gZmFsc2UpewogICAgICAgICAgICB0aGlzLnB1cmdlTGlzdGVuZXJzKCk7CiAgICAgICAgICAgIHRoaXMuYmVmb3JlRGVzdHJveSgpOwogICAgICAgICAgICBpZih0aGlzLnJlbmRlcmVkKXsKICAgICAgICAgICAgICAgIHRoaXMuZWwucmVtb3ZlQWxsTGlzdGVuZXJzKCk7CiAgICAgICAgICAgICAgICB0aGlzLmVsLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgaWYodGhpcy5hY3Rpb25Nb2RlID09ICJjb250YWluZXIiKXsKICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLm9uRGVzdHJveSgpOwogICAgICAgICAgICBFeHQuQ29tcG9uZW50TWdyLnVucmVnaXN0ZXIodGhpcyk7CiAgICAgICAgICAgIHRoaXMuZmlyZUV2ZW50KCJkZXN0cm95IiwgdGhpcyk7CiAgICAgICAgfQogICAgfSwKCgkgICAgYmVmb3JlRGVzdHJveSA6IGZ1bmN0aW9uKCl7CgogICAgfSwKCgkJb25EZXN0cm95IDogZnVuY3Rpb24oKXsKCiAgICB9LAoKICAgIAogICAgZ2V0RWwgOiBmdW5jdGlvbigpewogICAgICAgIHJldHVybiB0aGlzLmVsOwogICAgfSwKCiAgICAKICAgIGdldElkIDogZnVuY3Rpb24oKXsKICAgICAgICByZXR1cm4gdGhpcy5pZDsKICAgIH0sCgogICAgCiAgICBmb2N1cyA6IGZ1bmN0aW9uKHNlbGVjdFRleHQpewogICAgICAgIGlmKHRoaXMucmVuZGVyZWQpewogICAgICAgICAgICB0aGlzLmVsLmZvY3VzKCk7CiAgICAgICAgICAgIGlmKHNlbGVjdFRleHQgPT09IHRydWUpewogICAgICAgICAgICAgICAgdGhpcy5lbC5kb20uc2VsZWN0KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAoKICAgICAgICBibHVyIDogZnVuY3Rpb24oKXsKICAgICAgICBpZih0aGlzLnJlbmRlcmVkKXsKICAgICAgICAgICAgdGhpcy5lbC5ibHVyKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzOwogICAgfSwKCiAgICAKICAgIGRpc2FibGUgOiBmdW5jdGlvbigpewogICAgICAgIGlmKHRoaXMucmVuZGVyZWQpewogICAgICAgICAgICB0aGlzLm9uRGlzYWJsZSgpOwogICAgICAgIH0KICAgICAgICB0aGlzLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICB0aGlzLmZpcmVFdmVudCgiZGlzYWJsZSIsIHRoaXMpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfSwKCgkgICAgb25EaXNhYmxlIDogZnVuY3Rpb24oKXsKICAgICAgICB0aGlzLmdldEFjdGlvbkVsKCkuYWRkQ2xhc3ModGhpcy5kaXNhYmxlZENsYXNzKTsKICAgICAgICB0aGlzLmVsLmRvbS5kaXNhYmxlZCA9IHRydWU7CiAgICB9LAoKICAgIAogICAgZW5hYmxlIDogZnVuY3Rpb24oKXsKICAgICAgICBpZih0aGlzLnJlbmRlcmVkKXsKICAgICAgICAgICAgdGhpcy5vbkVuYWJsZSgpOwogICAgICAgIH0KICAgICAgICB0aGlzLmRpc2FibGVkID0gZmFsc2U7CiAgICAgICAgdGhpcy5maXJlRXZlbnQoImVuYWJsZSIsIHRoaXMpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfSwKCgkgICAgb25FbmFibGUgOiBmdW5jdGlvbigpewogICAgICAgIHRoaXMuZ2V0QWN0aW9uRWwoKS5yZW1vdmVDbGFzcyh0aGlzLmRpc2FibGVkQ2xhc3MpOwogICAgICAgIHRoaXMuZWwuZG9tLmRpc2FibGVkID0gZmFsc2U7CiAgICB9LAoKICAgIAogICAgc2V0RGlzYWJsZWQgOiBmdW5jdGlvbihkaXNhYmxlZCl7CiAgICAgICAgdGhpc1tkaXNhYmxlZCA/ICJkaXNhYmxlIiA6ICJlbmFibGUiXSgpOwogICAgfSwKCiAgICAKICAgIHNob3c6IGZ1bmN0aW9uKCl7CiAgICAgICAgaWYodGhpcy5maXJlRXZlbnQoImJlZm9yZXNob3ciLCB0aGlzKSAhPT0gZmFsc2UpewogICAgICAgICAgICB0aGlzLmhpZGRlbiA9IGZhbHNlOwogICAgICAgICAgICBpZih0aGlzLnJlbmRlcmVkKXsKICAgICAgICAgICAgICAgIHRoaXMub25TaG93KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoInNob3ciLCB0aGlzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAoKICAgICAgICBvblNob3cgOiBmdW5jdGlvbigpewogICAgICAgIHZhciBhZSA9IHRoaXMuZ2V0QWN0aW9uRWwoKTsKICAgICAgICBpZih0aGlzLmhpZGVNb2RlID09ICd2aXNpYmlsaXR5Jyl7CiAgICAgICAgICAgIGFlLmRvbS5zdHlsZS52aXNpYmlsaXR5ID0gInZpc2libGUiOwogICAgICAgIH1lbHNlIGlmKHRoaXMuaGlkZU1vZGUgPT0gJ29mZnNldHMnKXsKICAgICAgICAgICAgYWUucmVtb3ZlQ2xhc3MoJ3gtaGlkZGVuJyk7CiAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIGFlLmRvbS5zdHlsZS5kaXNwbGF5ID0gIiI7CiAgICAgICAgfQogICAgfSwKCiAgICAKICAgIGhpZGU6IGZ1bmN0aW9uKCl7CiAgICAgICAgaWYodGhpcy5maXJlRXZlbnQoImJlZm9yZWhpZGUiLCB0aGlzKSAhPT0gZmFsc2UpewogICAgICAgICAgICB0aGlzLmhpZGRlbiA9IHRydWU7CiAgICAgICAgICAgIGlmKHRoaXMucmVuZGVyZWQpewogICAgICAgICAgICAgICAgdGhpcy5vbkhpZGUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgiaGlkZSIsIHRoaXMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpczsKICAgIH0sCgogICAgICAgIG9uSGlkZSA6IGZ1bmN0aW9uKCl7CiAgICAgICAgdmFyIGFlID0gdGhpcy5nZXRBY3Rpb25FbCgpOwogICAgICAgIGlmKHRoaXMuaGlkZU1vZGUgPT0gJ3Zpc2liaWxpdHknKXsKICAgICAgICAgICAgYWUuZG9tLnN0eWxlLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsKICAgICAgICB9ZWxzZSBpZih0aGlzLmhpZGVNb2RlID09ICdvZmZzZXRzJyl7CiAgICAgICAgICAgIGFlLmFkZENsYXNzKCd4LWhpZGRlbicpOwogICAgICAgIH1lbHNlewogICAgICAgICAgICBhZS5kb20uc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgICAgICB9CiAgICB9LAoKICAgIAogICAgc2V0VmlzaWJsZTogZnVuY3Rpb24odmlzaWJsZSl7CiAgICAgICAgaWYodmlzaWJsZSkgewogICAgICAgICAgICB0aGlzLnNob3coKTsKICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgdGhpcy5oaWRlKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzOwogICAgfSwKCiAgICAKICAgIGlzVmlzaWJsZSA6IGZ1bmN0aW9uKCl7CiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWN0aW9uRWwoKS5pc1Zpc2libGUoKTsKICAgIH0sCgogICAgY2xvbmVDb25maWcgOiBmdW5jdGlvbihvdmVycmlkZXMpewogICAgICAgIG92ZXJyaWRlcyA9IG92ZXJyaWRlcyB8fCB7fTsKICAgICAgICB2YXIgaWQgPSBvdmVycmlkZXMuaWQgfHwgRXh0LmlkKCk7CiAgICAgICAgdmFyIGNmZyA9IEV4dC5hcHBseUlmKG92ZXJyaWRlcywgdGhpcy5pbml0aWFsQ29uZmlnKTsKICAgICAgICBjZmcuaWQgPSBpZDsgICAgICAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoY2ZnKTsKICAgIH0KfSk7Cg0KKGZ1bmN0aW9uKCl7IA0KRXh0LkxheWVyID0gZnVuY3Rpb24oY29uZmlnLCBleGlzdGluZ0VsKXsNCiAgICBjb25maWcgPSBjb25maWcgfHwge307DQogICAgdmFyIGRoID0gRXh0LkRvbUhlbHBlcjsNCiAgICB2YXIgY3AgPSBjb25maWcucGFyZW50RWwsIHBlbCA9IGNwID8gRXh0LmdldERvbShjcCkgOiBkb2N1bWVudC5ib2R5Ow0KICAgIGlmKGV4aXN0aW5nRWwpew0KICAgICAgICB0aGlzLmRvbSA9IEV4dC5nZXREb20oZXhpc3RpbmdFbCk7DQogICAgfQ0KICAgIGlmKCF0aGlzLmRvbSl7DQogICAgICAgIHZhciBvID0gY29uZmlnLmRoIHx8IHt0YWc6ICJkaXYiLCBjbHM6ICJ4LWxheWVyIn07DQogICAgICAgIHRoaXMuZG9tID0gZGguYXBwZW5kKHBlbCwgbyk7DQogICAgfQ0KICAgIGlmKGNvbmZpZy5jbHMpew0KICAgICAgICB0aGlzLmFkZENsYXNzKGNvbmZpZy5jbHMpOw0KICAgIH0NCiAgICB0aGlzLmNvbnN0cmFpbiA9IGNvbmZpZy5jb25zdHJhaW4gIT09IGZhbHNlOw0KICAgIHRoaXMudmlzaWJpbGl0eU1vZGUgPSBFeHQuRWxlbWVudC5WSVNJQklMSVRZOw0KICAgIGlmKGNvbmZpZy5pZCl7DQogICAgICAgIHRoaXMuaWQgPSB0aGlzLmRvbS5pZCA9IGNvbmZpZy5pZDsNCiAgICB9ZWxzZXsNCiAgICAgICAgdGhpcy5pZCA9IEV4dC5pZCh0aGlzLmRvbSk7DQogICAgfQ0KICAgIHRoaXMuemluZGV4ID0gY29uZmlnLnppbmRleCB8fCB0aGlzLmdldFpJbmRleCgpOw0KICAgIHRoaXMucG9zaXRpb24oImFic29sdXRlIiwgdGhpcy56aW5kZXgpOw0KICAgIGlmKGNvbmZpZy5zaGFkb3cpew0KICAgICAgICB0aGlzLnNoYWRvd09mZnNldCA9IGNvbmZpZy5zaGFkb3dPZmZzZXQgfHwgNDsNCiAgICAgICAgdGhpcy5zaGFkb3cgPSBuZXcgRXh0LlNoYWRvdyh7DQogICAgICAgICAgICBvZmZzZXQgOiB0aGlzLnNoYWRvd09mZnNldCwNCiAgICAgICAgICAgIG1vZGUgOiBjb25maWcuc2hhZG93DQogICAgICAgIH0pOw0KICAgIH1lbHNlew0KICAgICAgICB0aGlzLnNoYWRvd09mZnNldCA9IDA7DQogICAgfQ0KICAgIHRoaXMudXNlU2hpbSA9IGNvbmZpZy5zaGltICE9PSBmYWxzZSAmJiBFeHQudXNlU2hpbXM7DQogICAgdGhpcy51c2VEaXNwbGF5ID0gY29uZmlnLnVzZURpc3BsYXk7DQogICAgdGhpcy5oaWRlKCk7DQp9Ow0KDQp2YXIgc3VwciA9IEV4dC5FbGVtZW50LnByb3RvdHlwZTsNCg0KCnZhciBzaGltcyA9IFtdOw0KDQpFeHQuZXh0ZW5kKEV4dC5MYXllciwgRXh0LkVsZW1lbnQsIHsNCg0KICAgIGdldFpJbmRleCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLnppbmRleCB8fCBwYXJzZUludCh0aGlzLmdldFN0eWxlKCJ6LWluZGV4IiksIDEwKSB8fCAxMTAwMDsNCiAgICB9LA0KDQogICAgZ2V0U2hpbSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIGlmKCF0aGlzLnVzZVNoaW0pew0KICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgIH0NCiAgICAgICAgaWYodGhpcy5zaGltKXsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLnNoaW07DQogICAgICAgIH0NCiAgICAgICAgdmFyIHNoaW0gPSBzaGltcy5zaGlmdCgpOw0KICAgICAgICBpZighc2hpbSl7DQogICAgICAgICAgICBzaGltID0gdGhpcy5jcmVhdGVTaGltKCk7DQogICAgICAgICAgICBzaGltLmVuYWJsZURpc3BsYXlNb2RlKCdibG9jaycpOw0KICAgICAgICAgICAgc2hpbS5kb20uc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCiAgICAgICAgICAgIHNoaW0uZG9tLnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7DQogICAgICAgIH0NCiAgICAgICAgdmFyIHBuID0gdGhpcy5kb20ucGFyZW50Tm9kZTsNCiAgICAgICAgaWYoc2hpbS5kb20ucGFyZW50Tm9kZSAhPSBwbil7DQogICAgICAgICAgICBwbi5pbnNlcnRCZWZvcmUoc2hpbS5kb20sIHRoaXMuZG9tKTsNCiAgICAgICAgfQ0KICAgICAgICBzaGltLnNldFN0eWxlKCd6LWluZGV4JywgdGhpcy5nZXRaSW5kZXgoKS0yKTsNCiAgICAgICAgdGhpcy5zaGltID0gc2hpbTsNCiAgICAgICAgcmV0dXJuIHNoaW07DQogICAgfSwNCg0KICAgIGhpZGVTaGltIDogZnVuY3Rpb24oKXsNCiAgICAgICAgaWYodGhpcy5zaGltKXsNCiAgICAgICAgICAgIHRoaXMuc2hpbS5zZXREaXNwbGF5ZWQoZmFsc2UpOw0KICAgICAgICAgICAgc2hpbXMucHVzaCh0aGlzLnNoaW0pOw0KICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2hpbTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICBkaXNhYmxlU2hhZG93IDogZnVuY3Rpb24oKXsNCiAgICAgICAgaWYodGhpcy5zaGFkb3cpew0KICAgICAgICAgICAgdGhpcy5zaGFkb3dEaXNhYmxlZCA9IHRydWU7DQogICAgICAgICAgICB0aGlzLnNoYWRvdy5oaWRlKCk7DQogICAgICAgICAgICB0aGlzLmxhc3RTaGFkb3dPZmZzZXQgPSB0aGlzLnNoYWRvd09mZnNldDsNCiAgICAgICAgICAgIHRoaXMuc2hhZG93T2Zmc2V0ID0gMDsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICBlbmFibGVTaGFkb3cgOiBmdW5jdGlvbihzaG93KXsNCiAgICAgICAgaWYodGhpcy5zaGFkb3cpew0KICAgICAgICAgICAgdGhpcy5zaGFkb3dEaXNhYmxlZCA9IGZhbHNlOw0KICAgICAgICAgICAgdGhpcy5zaGFkb3dPZmZzZXQgPSB0aGlzLmxhc3RTaGFkb3dPZmZzZXQ7DQogICAgICAgICAgICBkZWxldGUgdGhpcy5sYXN0U2hhZG93T2Zmc2V0Ow0KICAgICAgICAgICAgaWYoc2hvdyl7DQogICAgICAgICAgICAgICAgdGhpcy5zeW5jKHRydWUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSwNCg0KICAgIAogICAgCiAgICAKICAgIHN5bmMgOiBmdW5jdGlvbihkb1Nob3cpew0KICAgICAgICB2YXIgc3cgPSB0aGlzLnNoYWRvdzsNCiAgICAgICAgaWYoIXRoaXMudXBkYXRpbmcgJiYgdGhpcy5pc1Zpc2libGUoKSAmJiAoc3cgfHwgdGhpcy51c2VTaGltKSl7DQogICAgICAgICAgICB2YXIgc2ggPSB0aGlzLmdldFNoaW0oKTsNCg0KICAgICAgICAgICAgdmFyIHcgPSB0aGlzLmdldFdpZHRoKCksDQogICAgICAgICAgICAgICAgaCA9IHRoaXMuZ2V0SGVpZ2h0KCk7DQoNCiAgICAgICAgICAgIHZhciBsID0gdGhpcy5nZXRMZWZ0KHRydWUpLA0KICAgICAgICAgICAgICAgIHQgPSB0aGlzLmdldFRvcCh0cnVlKTsNCg0KICAgICAgICAgICAgaWYoc3cgJiYgIXRoaXMuc2hhZG93RGlzYWJsZWQpew0KICAgICAgICAgICAgICAgIGlmKGRvU2hvdyAmJiAhc3cuaXNWaXNpYmxlKCkpew0KICAgICAgICAgICAgICAgICAgICBzdy5zaG93KHRoaXMpOw0KICAgICAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgICAgICBzdy5yZWFsaWduKGwsIHQsIHcsIGgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZihzaCl7DQogICAgICAgICAgICAgICAgICAgIGlmKGRvU2hvdyl7DQogICAgICAgICAgICAgICAgICAgICAgIHNoLnNob3coKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHN3LmFkanVzdHMsIHMgPSBzaC5kb20uc3R5bGU7DQogICAgICAgICAgICAgICAgICAgIHMubGVmdCA9IChNYXRoLm1pbihsLCBsK2EubCkpKyJweCI7DQogICAgICAgICAgICAgICAgICAgIHMudG9wID0gKE1hdGgubWluKHQsIHQrYS50KSkrInB4IjsNCiAgICAgICAgICAgICAgICAgICAgcy53aWR0aCA9ICh3K2EudykrInB4IjsNCiAgICAgICAgICAgICAgICAgICAgcy5oZWlnaHQgPSAoaCthLmgpKyJweCI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfWVsc2UgaWYoc2gpew0KICAgICAgICAgICAgICAgIGlmKGRvU2hvdyl7DQogICAgICAgICAgICAgICAgICAgc2guc2hvdygpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBzaC5zZXRTaXplKHcsIGgpOw0KICAgICAgICAgICAgICAgIHNoLnNldExlZnRUb3AobCwgdCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICANCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICAKICAgIGRlc3Ryb3kgOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLmhpZGVTaGltKCk7DQogICAgICAgIGlmKHRoaXMuc2hhZG93KXsNCiAgICAgICAgICAgIHRoaXMuc2hhZG93LmhpZGUoKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygpOw0KICAgICAgICB2YXIgcG4gPSB0aGlzLmRvbS5wYXJlbnROb2RlOw0KICAgICAgICBpZihwbil7DQogICAgICAgICAgICBwbi5yZW1vdmVDaGlsZCh0aGlzLmRvbSk7DQogICAgICAgIH0NCiAgICAgICAgRXh0LkVsZW1lbnQudW5jYWNoZSh0aGlzLmlkKTsNCiAgICB9LA0KDQogICAgcmVtb3ZlIDogZnVuY3Rpb24oKXsNCiAgICAgICAgdGhpcy5kZXN0cm95KCk7DQogICAgfSwNCg0KICAgIAogICAgYmVnaW5VcGRhdGUgOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLnVwZGF0aW5nID0gdHJ1ZTsNCiAgICB9LA0KDQogICAgCiAgICBlbmRVcGRhdGUgOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLnVwZGF0aW5nID0gZmFsc2U7DQogICAgICAgIHRoaXMuc3luYyh0cnVlKTsNCiAgICB9LA0KDQogICAgCiAgICBoaWRlVW5kZXJzIDogZnVuY3Rpb24obmVnT2Zmc2V0KXsNCiAgICAgICAgaWYodGhpcy5zaGFkb3cpew0KICAgICAgICAgICAgdGhpcy5zaGFkb3cuaGlkZSgpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuaGlkZVNoaW0oKTsNCiAgICB9LA0KDQogICAgCiAgICBjb25zdHJhaW5YWSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIGlmKHRoaXMuY29uc3RyYWluKXsNCiAgICAgICAgICAgIHZhciB2dyA9IEV4dC5saWIuRG9tLmdldFZpZXdXaWR0aCgpLA0KICAgICAgICAgICAgICAgIHZoID0gRXh0LmxpYi5Eb20uZ2V0Vmlld0hlaWdodCgpOw0KICAgICAgICAgICAgdmFyIHMgPSBFeHQuZ2V0KGRvY3VtZW50KS5nZXRTY3JvbGwoKTsNCg0KICAgICAgICAgICAgdmFyIHh5ID0gdGhpcy5nZXRYWSgpOw0KICAgICAgICAgICAgdmFyIHggPSB4eVswXSwgeSA9IHh5WzFdOyAgIA0KICAgICAgICAgICAgdmFyIHcgPSB0aGlzLmRvbS5vZmZzZXRXaWR0aCt0aGlzLnNoYWRvd09mZnNldCwgaCA9IHRoaXMuZG9tLm9mZnNldEhlaWdodCt0aGlzLnNoYWRvd09mZnNldDsNCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgbW92ZWQgPSBmYWxzZTsNCiAgICAgICAgICAgIAogICAgICAgICAgICBpZigoeCArIHcpID4gdncrcy5sZWZ0KXsNCiAgICAgICAgICAgICAgICB4ID0gdncgLSB3IC0gdGhpcy5zaGFkb3dPZmZzZXQ7DQogICAgICAgICAgICAgICAgbW92ZWQgPSB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYoKHkgKyBoKSA+IHZoK3MudG9wKXsNCiAgICAgICAgICAgICAgICB5ID0gdmggLSBoIC0gdGhpcy5zaGFkb3dPZmZzZXQ7DQogICAgICAgICAgICAgICAgbW92ZWQgPSB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgCiAgICAgICAgICAgIGlmKHggPCBzLmxlZnQpew0KICAgICAgICAgICAgICAgIHggPSBzLmxlZnQ7DQogICAgICAgICAgICAgICAgbW92ZWQgPSB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYoeSA8IHMudG9wKXsNCiAgICAgICAgICAgICAgICB5ID0gcy50b3A7DQogICAgICAgICAgICAgICAgbW92ZWQgPSB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYobW92ZWQpew0KICAgICAgICAgICAgICAgIGlmKHRoaXMuYXZvaWRZKXsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGF5ID0gdGhpcy5hdm9pZFk7DQogICAgICAgICAgICAgICAgICAgIGlmKHkgPD0gYXkgJiYgKHkraCkgPj0gYXkpew0KICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGF5LWgtNTsgICANCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB4eSA9IFt4LCB5XTsNCiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlWFkoeHkpOw0KICAgICAgICAgICAgICAgIHN1cHIuc2V0WFkuY2FsbCh0aGlzLCB4eSk7DQogICAgICAgICAgICAgICAgdGhpcy5zeW5jKCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgaXNWaXNpYmxlIDogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIHRoaXMudmlzaWJsZTsgICAgDQogICAgfSwNCg0KICAgIAogICAgc2hvd0FjdGlvbiA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHRoaXMudmlzaWJsZSA9IHRydWU7IAogICAgICAgIGlmKHRoaXMudXNlRGlzcGxheSA9PT0gdHJ1ZSl7DQogICAgICAgICAgICB0aGlzLnNldERpc3BsYXllZCgiIik7DQogICAgICAgIH1lbHNlIGlmKHRoaXMubGFzdFhZKXsNCiAgICAgICAgICAgIHN1cHIuc2V0WFkuY2FsbCh0aGlzLCB0aGlzLmxhc3RYWSk7DQogICAgICAgIH1lbHNlIGlmKHRoaXMubGFzdExUKXsNCiAgICAgICAgICAgIHN1cHIuc2V0TGVmdFRvcC5jYWxsKHRoaXMsIHRoaXMubGFzdExUWzBdLCB0aGlzLmxhc3RMVFsxXSk7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgCiAgICBoaWRlQWN0aW9uIDogZnVuY3Rpb24oKXsNCiAgICAgICAgdGhpcy52aXNpYmxlID0gZmFsc2U7DQogICAgICAgIGlmKHRoaXMudXNlRGlzcGxheSA9PT0gdHJ1ZSl7DQogICAgICAgICAgICB0aGlzLnNldERpc3BsYXllZChmYWxzZSk7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgdGhpcy5zZXRMZWZ0VG9wKC0xMDAwMCwtMTAwMDApOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIAogICAgc2V0VmlzaWJsZSA6IGZ1bmN0aW9uKHYsIGEsIGQsIGMsIGUpew0KICAgICAgICBpZih2KXsNCiAgICAgICAgICAgIHRoaXMuc2hvd0FjdGlvbigpOw0KICAgICAgICB9DQogICAgICAgIGlmKGEgJiYgdil7DQogICAgICAgICAgICB2YXIgY2IgPSBmdW5jdGlvbigpew0KICAgICAgICAgICAgICAgIHRoaXMuc3luYyh0cnVlKTsNCiAgICAgICAgICAgICAgICBpZihjKXsNCiAgICAgICAgICAgICAgICAgICAgYygpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0uY3JlYXRlRGVsZWdhdGUodGhpcyk7DQogICAgICAgICAgICBzdXByLnNldFZpc2libGUuY2FsbCh0aGlzLCB0cnVlLCB0cnVlLCBkLCBjYiwgZSk7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgaWYoIXYpew0KICAgICAgICAgICAgICAgIHRoaXMuaGlkZVVuZGVycyh0cnVlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHZhciBjYiA9IGM7DQogICAgICAgICAgICBpZihhKXsNCiAgICAgICAgICAgICAgICBjYiA9IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuaGlkZUFjdGlvbigpOw0KICAgICAgICAgICAgICAgICAgICBpZihjKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIGMoKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0uY3JlYXRlRGVsZWdhdGUodGhpcyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBzdXByLnNldFZpc2libGUuY2FsbCh0aGlzLCB2LCBhLCBkLCBjYiwgZSk7DQogICAgICAgICAgICBpZih2KXsNCiAgICAgICAgICAgICAgICB0aGlzLnN5bmModHJ1ZSk7DQogICAgICAgICAgICB9ZWxzZSBpZighYSl7DQogICAgICAgICAgICAgICAgdGhpcy5oaWRlQWN0aW9uKCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgc3RvcmVYWSA6IGZ1bmN0aW9uKHh5KXsNCiAgICAgICAgZGVsZXRlIHRoaXMubGFzdExUOw0KICAgICAgICB0aGlzLmxhc3RYWSA9IHh5Ow0KICAgIH0sDQoNCiAgICBzdG9yZUxlZnRUb3AgOiBmdW5jdGlvbihsZWZ0LCB0b3Apew0KICAgICAgICBkZWxldGUgdGhpcy5sYXN0WFk7DQogICAgICAgIHRoaXMubGFzdExUID0gW2xlZnQsIHRvcF07DQogICAgfSwNCg0KICAgIAogICAgYmVmb3JlRnggOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLmJlZm9yZUFjdGlvbigpOw0KICAgICAgICByZXR1cm4gRXh0LkxheWVyLnN1cGVyY2xhc3MuYmVmb3JlRnguYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCiAgICB9LA0KDQogICAgCiAgICBhZnRlckZ4IDogZnVuY3Rpb24oKXsNCiAgICAgICAgRXh0LkxheWVyLnN1cGVyY2xhc3MuYWZ0ZXJGeC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOw0KICAgICAgICB0aGlzLnN5bmModGhpcy5pc1Zpc2libGUoKSk7DQogICAgfSwNCg0KICAgIAogICAgYmVmb3JlQWN0aW9uIDogZnVuY3Rpb24oKXsNCiAgICAgICAgaWYoIXRoaXMudXBkYXRpbmcgJiYgdGhpcy5zaGFkb3cpew0KICAgICAgICAgICAgdGhpcy5zaGFkb3cuaGlkZSgpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIAogICAgc2V0TGVmdCA6IGZ1bmN0aW9uKGxlZnQpew0KICAgICAgICB0aGlzLnN0b3JlTGVmdFRvcChsZWZ0LCB0aGlzLmdldFRvcCh0cnVlKSk7DQogICAgICAgIHN1cHIuc2V0TGVmdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOw0KICAgICAgICB0aGlzLnN5bmMoKTsNCiAgICB9LA0KDQogICAgc2V0VG9wIDogZnVuY3Rpb24odG9wKXsNCiAgICAgICAgdGhpcy5zdG9yZUxlZnRUb3AodGhpcy5nZXRMZWZ0KHRydWUpLCB0b3ApOw0KICAgICAgICBzdXByLnNldFRvcC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOw0KICAgICAgICB0aGlzLnN5bmMoKTsNCiAgICB9LA0KDQogICAgc2V0TGVmdFRvcCA6IGZ1bmN0aW9uKGxlZnQsIHRvcCl7DQogICAgICAgIHRoaXMuc3RvcmVMZWZ0VG9wKGxlZnQsIHRvcCk7DQogICAgICAgIHN1cHIuc2V0TGVmdFRvcC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOw0KICAgICAgICB0aGlzLnN5bmMoKTsNCiAgICB9LA0KDQogICAgc2V0WFkgOiBmdW5jdGlvbih4eSwgYSwgZCwgYywgZSl7DQogICAgICAgIHRoaXMuZml4RGlzcGxheSgpOw0KICAgICAgICB0aGlzLmJlZm9yZUFjdGlvbigpOw0KICAgICAgICB0aGlzLnN0b3JlWFkoeHkpOw0KICAgICAgICB2YXIgY2IgPSB0aGlzLmNyZWF0ZUNCKGMpOw0KICAgICAgICBzdXByLnNldFhZLmNhbGwodGhpcywgeHksIGEsIGQsIGNiLCBlKTsNCiAgICAgICAgaWYoIWEpew0KICAgICAgICAgICAgY2IoKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICAKICAgIGNyZWF0ZUNCIDogZnVuY3Rpb24oYyl7DQogICAgICAgIHZhciBlbCA9IHRoaXM7DQogICAgICAgIHJldHVybiBmdW5jdGlvbigpew0KICAgICAgICAgICAgZWwuY29uc3RyYWluWFkoKTsNCiAgICAgICAgICAgIGVsLnN5bmModHJ1ZSk7DQogICAgICAgICAgICBpZihjKXsNCiAgICAgICAgICAgICAgICBjKCk7DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgfSwNCg0KICAgIAogICAgc2V0WCA6IGZ1bmN0aW9uKHgsIGEsIGQsIGMsIGUpew0KICAgICAgICB0aGlzLnNldFhZKFt4LCB0aGlzLmdldFkoKV0sIGEsIGQsIGMsIGUpOw0KICAgIH0sDQoNCiAgICAKICAgIHNldFkgOiBmdW5jdGlvbih5LCBhLCBkLCBjLCBlKXsNCiAgICAgICAgdGhpcy5zZXRYWShbdGhpcy5nZXRYKCksIHldLCBhLCBkLCBjLCBlKTsNCiAgICB9LA0KDQogICAgCiAgICBzZXRTaXplIDogZnVuY3Rpb24odywgaCwgYSwgZCwgYywgZSl7DQogICAgICAgIHRoaXMuYmVmb3JlQWN0aW9uKCk7DQogICAgICAgIHZhciBjYiA9IHRoaXMuY3JlYXRlQ0IoYyk7DQogICAgICAgIHN1cHIuc2V0U2l6ZS5jYWxsKHRoaXMsIHcsIGgsIGEsIGQsIGNiLCBlKTsNCiAgICAgICAgaWYoIWEpew0KICAgICAgICAgICAgY2IoKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICAKICAgIHNldFdpZHRoIDogZnVuY3Rpb24odywgYSwgZCwgYywgZSl7DQogICAgICAgIHRoaXMuYmVmb3JlQWN0aW9uKCk7DQogICAgICAgIHZhciBjYiA9IHRoaXMuY3JlYXRlQ0IoYyk7DQogICAgICAgIHN1cHIuc2V0V2lkdGguY2FsbCh0aGlzLCB3LCBhLCBkLCBjYiwgZSk7DQogICAgICAgIGlmKCFhKXsNCiAgICAgICAgICAgIGNiKCk7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgCiAgICBzZXRIZWlnaHQgOiBmdW5jdGlvbihoLCBhLCBkLCBjLCBlKXsNCiAgICAgICAgdGhpcy5iZWZvcmVBY3Rpb24oKTsNCiAgICAgICAgdmFyIGNiID0gdGhpcy5jcmVhdGVDQihjKTsNCiAgICAgICAgc3Vwci5zZXRIZWlnaHQuY2FsbCh0aGlzLCBoLCBhLCBkLCBjYiwgZSk7DQogICAgICAgIGlmKCFhKXsNCiAgICAgICAgICAgIGNiKCk7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgCiAgICBzZXRCb3VuZHMgOiBmdW5jdGlvbih4LCB5LCB3LCBoLCBhLCBkLCBjLCBlKXsNCiAgICAgICAgdGhpcy5iZWZvcmVBY3Rpb24oKTsNCiAgICAgICAgdmFyIGNiID0gdGhpcy5jcmVhdGVDQihjKTsNCiAgICAgICAgaWYoIWEpew0KICAgICAgICAgICAgdGhpcy5zdG9yZVhZKFt4LCB5XSk7DQogICAgICAgICAgICBzdXByLnNldFhZLmNhbGwodGhpcywgW3gsIHldKTsNCiAgICAgICAgICAgIHN1cHIuc2V0U2l6ZS5jYWxsKHRoaXMsIHcsIGgsIGEsIGQsIGNiLCBlKTsNCiAgICAgICAgICAgIGNiKCk7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgc3Vwci5zZXRCb3VuZHMuY2FsbCh0aGlzLCB4LCB5LCB3LCBoLCBhLCBkLCBjYiwgZSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSwNCiAgICANCiAgICANCiAgICBzZXRaSW5kZXggOiBmdW5jdGlvbih6aW5kZXgpew0KICAgICAgICB0aGlzLnppbmRleCA9IHppbmRleDsNCiAgICAgICAgdGhpcy5zZXRTdHlsZSgiei1pbmRleCIsIHppbmRleCArIDIpOw0KICAgICAgICBpZih0aGlzLnNoYWRvdyl7DQogICAgICAgICAgICB0aGlzLnNoYWRvdy5zZXRaSW5kZXgoemluZGV4ICsgMSk7DQogICAgICAgIH0NCiAgICAgICAgaWYodGhpcy5zaGltKXsNCiAgICAgICAgICAgIHRoaXMuc2hpbS5zZXRTdHlsZSgiei1pbmRleCIsIHppbmRleCk7DQogICAgICAgIH0NCiAgICB9DQp9KTsNCn0pKCk7CgpFeHQuU2hhZG93ID0gZnVuY3Rpb24oY29uZmlnKXsKICAgIEV4dC5hcHBseSh0aGlzLCBjb25maWcpOwogICAgaWYodHlwZW9mIHRoaXMubW9kZSAhPSAic3RyaW5nIil7CiAgICAgICAgdGhpcy5tb2RlID0gdGhpcy5kZWZhdWx0TW9kZTsKICAgIH0KICAgIHZhciBvID0gdGhpcy5vZmZzZXQsIGEgPSB7aDogMH07CiAgICB2YXIgcmFkID0gTWF0aC5mbG9vcih0aGlzLm9mZnNldC8yKTsKICAgIHN3aXRjaCh0aGlzLm1vZGUudG9Mb3dlckNhc2UoKSl7ICAgICAgICAgY2FzZSAiZHJvcCI6CiAgICAgICAgICAgIGEudyA9IDA7CiAgICAgICAgICAgIGEubCA9IGEudCA9IG87CiAgICAgICAgICAgIGEudCAtPSAxOwogICAgICAgICAgICBpZihFeHQuaXNJRSl7CiAgICAgICAgICAgICAgICBhLmwgLT0gdGhpcy5vZmZzZXQgKyByYWQ7CiAgICAgICAgICAgICAgICBhLnQgLT0gdGhpcy5vZmZzZXQgKyByYWQ7CiAgICAgICAgICAgICAgICBhLncgLT0gcmFkOwogICAgICAgICAgICAgICAgYS5oIC09IHJhZDsKICAgICAgICAgICAgICAgIGEudCArPSAxOwogICAgICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAic2lkZXMiOgogICAgICAgICAgICBhLncgPSAobyoyKTsKICAgICAgICAgICAgYS5sID0gLW87CiAgICAgICAgICAgIGEudCA9IG8tMTsKICAgICAgICAgICAgaWYoRXh0LmlzSUUpewogICAgICAgICAgICAgICAgYS5sIC09ICh0aGlzLm9mZnNldCAtIHJhZCk7CiAgICAgICAgICAgICAgICBhLnQgLT0gdGhpcy5vZmZzZXQgKyByYWQ7CiAgICAgICAgICAgICAgICBhLmwgKz0gMTsKICAgICAgICAgICAgICAgIGEudyAtPSAodGhpcy5vZmZzZXQgLSByYWQpKjI7CiAgICAgICAgICAgICAgICBhLncgLT0gcmFkICsgMTsKICAgICAgICAgICAgICAgIGEuaCAtPSAxOwogICAgICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiZnJhbWUiOgogICAgICAgICAgICBhLncgPSBhLmggPSAobyoyKTsKICAgICAgICAgICAgYS5sID0gYS50ID0gLW87CiAgICAgICAgICAgIGEudCArPSAxOwogICAgICAgICAgICBhLmggLT0gMjsKICAgICAgICAgICAgaWYoRXh0LmlzSUUpewogICAgICAgICAgICAgICAgYS5sIC09ICh0aGlzLm9mZnNldCAtIHJhZCk7CiAgICAgICAgICAgICAgICBhLnQgLT0gKHRoaXMub2Zmc2V0IC0gcmFkKTsKICAgICAgICAgICAgICAgIGEubCArPSAxOwogICAgICAgICAgICAgICAgYS53IC09ICh0aGlzLm9mZnNldCArIHJhZCArIDEpOwogICAgICAgICAgICAgICAgYS5oIC09ICh0aGlzLm9mZnNldCArIHJhZCk7CiAgICAgICAgICAgICAgICBhLmggKz0gMTsKICAgICAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgfTsKCiAgICB0aGlzLmFkanVzdHMgPSBhOwp9OwoKRXh0LlNoYWRvdy5wcm90b3R5cGUgPSB7CiAgICAKICAgIAogICAgb2Zmc2V0OiA0LAoKICAgICAgICBkZWZhdWx0TW9kZTogImRyb3AiLAoKICAgIAogICAgc2hvdyA6IGZ1bmN0aW9uKHRhcmdldCl7CiAgICAgICAgdGFyZ2V0ID0gRXh0LmdldCh0YXJnZXQpOwogICAgICAgIGlmKCF0aGlzLmVsKXsKICAgICAgICAgICAgdGhpcy5lbCA9IEV4dC5TaGFkb3cuUG9vbC5wdWxsKCk7CiAgICAgICAgICAgIGlmKHRoaXMuZWwuZG9tLm5leHRTaWJsaW5nICE9IHRhcmdldC5kb20pewogICAgICAgICAgICAgICAgdGhpcy5lbC5pbnNlcnRCZWZvcmUodGFyZ2V0KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLmVsLnNldFN0eWxlKCJ6LWluZGV4IiwgdGhpcy56SW5kZXggfHwgcGFyc2VJbnQodGFyZ2V0LmdldFN0eWxlKCJ6LWluZGV4IiksIDEwKS0xKTsKICAgICAgICBpZihFeHQuaXNJRSl7CiAgICAgICAgICAgIHRoaXMuZWwuZG9tLnN0eWxlLmZpbHRlcj0icHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmFscGhhKG9wYWNpdHk9NTApIHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5CbHVyKHBpeGVscmFkaXVzPSIrKHRoaXMub2Zmc2V0KSsiKSI7CiAgICAgICAgfQogICAgICAgIHRoaXMucmVhbGlnbigKICAgICAgICAgICAgdGFyZ2V0LmdldExlZnQodHJ1ZSksCiAgICAgICAgICAgIHRhcmdldC5nZXRUb3AodHJ1ZSksCiAgICAgICAgICAgIHRhcmdldC5nZXRXaWR0aCgpLAogICAgICAgICAgICB0YXJnZXQuZ2V0SGVpZ2h0KCkKICAgICAgICApOwogICAgICAgIHRoaXMuZWwuZG9tLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOwogICAgfSwKCiAgICAKICAgIGlzVmlzaWJsZSA6IGZ1bmN0aW9uKCl7CiAgICAgICAgcmV0dXJuIHRoaXMuZWwgPyB0cnVlIDogZmFsc2U7ICAKICAgIH0sCgogICAgCiAgICByZWFsaWduIDogZnVuY3Rpb24obCwgdCwgdywgaCl7CiAgICAgICAgaWYoIXRoaXMuZWwpewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHZhciBhID0gdGhpcy5hZGp1c3RzLCBkID0gdGhpcy5lbC5kb20sIHMgPSBkLnN0eWxlOwogICAgICAgIHZhciBpZWEgPSAwOwogICAgICAgIHMubGVmdCA9IChsK2EubCkrInB4IjsKICAgICAgICBzLnRvcCA9ICh0K2EudCkrInB4IjsKICAgICAgICB2YXIgc3cgPSAodythLncpLCBzaCA9IChoK2EuaCksIHN3cyA9IHN3ICsicHgiLCBzaHMgPSBzaCArICJweCI7CiAgICAgICAgaWYocy53aWR0aCAhPSBzd3MgfHwgcy5oZWlnaHQgIT0gc2hzKXsKICAgICAgICAgICAgcy53aWR0aCA9IHN3czsKICAgICAgICAgICAgcy5oZWlnaHQgPSBzaHM7CiAgICAgICAgICAgIGlmKCFFeHQuaXNJRSl7CiAgICAgICAgICAgICAgICB2YXIgY24gPSBkLmNoaWxkTm9kZXM7CiAgICAgICAgICAgICAgICB2YXIgc3d3ID0gTWF0aC5tYXgoMCwgKHN3LTEyKSkrInB4IjsKICAgICAgICAgICAgICAgIGNuWzBdLmNoaWxkTm9kZXNbMV0uc3R5bGUud2lkdGggPSBzd3c7CiAgICAgICAgICAgICAgICBjblsxXS5jaGlsZE5vZGVzWzFdLnN0eWxlLndpZHRoID0gc3d3OwogICAgICAgICAgICAgICAgY25bMl0uY2hpbGROb2Rlc1sxXS5zdHlsZS53aWR0aCA9IHN3dzsKICAgICAgICAgICAgICAgIGNuWzFdLnN0eWxlLmhlaWdodCA9IE1hdGgubWF4KDAsIChzaC0xMikpKyJweCI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9LAoKICAgIAogICAgaGlkZSA6IGZ1bmN0aW9uKCl7CiAgICAgICAgaWYodGhpcy5lbCl7CiAgICAgICAgICAgIHRoaXMuZWwuZG9tLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICAgICAgICAgIEV4dC5TaGFkb3cuUG9vbC5wdXNoKHRoaXMuZWwpOwogICAgICAgICAgICBkZWxldGUgdGhpcy5lbDsKICAgICAgICB9CiAgICB9LAoKICAgIAogICAgc2V0WkluZGV4IDogZnVuY3Rpb24oeil7CiAgICAgICAgdGhpcy56SW5kZXggPSB6OwogICAgICAgIGlmKHRoaXMuZWwpewogICAgICAgICAgICB0aGlzLmVsLnNldFN0eWxlKCJ6LWluZGV4Iiwgeik7CiAgICAgICAgfQogICAgfQp9OwoKRXh0LlNoYWRvdy5Qb29sID0gZnVuY3Rpb24oKXsKICAgIHZhciBwID0gW107CiAgICB2YXIgbWFya3VwID0gRXh0LmlzSUUgPwogICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJ4LWllLXNoYWRvdyI+PC9kaXY+JyA6CiAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9Ingtc2hhZG93Ij48ZGl2IGNsYXNzPSJ4c3QiPjxkaXYgY2xhc3M9InhzdGwiPjwvZGl2PjxkaXYgY2xhc3M9InhzdGMiPjwvZGl2PjxkaXYgY2xhc3M9InhzdHIiPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9InhzYyI+PGRpdiBjbGFzcz0ieHNtbCI+PC9kaXY+PGRpdiBjbGFzcz0ieHNtYyI+PC9kaXY+PGRpdiBjbGFzcz0ieHNtciI+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0ieHNiIj48ZGl2IGNsYXNzPSJ4c2JsIj48L2Rpdj48ZGl2IGNsYXNzPSJ4c2JjIj48L2Rpdj48ZGl2IGNsYXNzPSJ4c2JyIj48L2Rpdj48L2Rpdj48L2Rpdj4nOwogICAgcmV0dXJuIHsKICAgICAgICBwdWxsIDogZnVuY3Rpb24oKXsKICAgICAgICAgICAgdmFyIHNoID0gcC5zaGlmdCgpOwogICAgICAgICAgICBpZighc2gpewogICAgICAgICAgICAgICAgc2ggPSBFeHQuZ2V0KEV4dC5Eb21IZWxwZXIuaW5zZXJ0SHRtbCgiYmVmb3JlQmVnaW4iLCBkb2N1bWVudC5ib2R5LmZpcnN0Q2hpbGQsIG1hcmt1cCkpOwogICAgICAgICAgICAgICAgc2guYXV0b0JveEFkanVzdCA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzaDsKICAgICAgICB9LAoKICAgICAgICBwdXNoIDogZnVuY3Rpb24oc2gpewogICAgICAgICAgICBwLnB1c2goc2gpOwogICAgICAgIH0KICAgIH07Cn0oKTsKCkV4dC5Cb3hDb21wb25lbnQgPSBmdW5jdGlvbihjb25maWcpewogICAgRXh0LkJveENvbXBvbmVudC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgY29uZmlnKTsKICAgIHRoaXMuYWRkRXZlbnRzKHsKICAgICAgICAKICAgICAgICByZXNpemUgOiB0cnVlLAogICAgICAgIAogICAgICAgIG1vdmUgOiB0cnVlCiAgICB9KTsKfTsKCkV4dC5leHRlbmQoRXh0LkJveENvbXBvbmVudCwgRXh0LkNvbXBvbmVudCwgewogICAgICAgIGJveFJlYWR5IDogZmFsc2UsCiAgICAgICAgZGVmZXJIZWlnaHQ6IGZhbHNlLAoKICAgIAogICAgc2V0U2l6ZSA6IGZ1bmN0aW9uKHcsIGgpewogICAgICAgICAgICAgICAgaWYodHlwZW9mIHcgPT0gJ29iamVjdCcpewogICAgICAgICAgICBoID0gdy5oZWlnaHQ7CiAgICAgICAgICAgIHcgPSB3LndpZHRoOwogICAgICAgIH0KICAgICAgICAgICAgICAgIGlmKCF0aGlzLmJveFJlYWR5KXsKICAgICAgICAgICAgdGhpcy53aWR0aCA9IHc7CiAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gaDsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmKHRoaXMubGFzdFNpemUgJiYgdGhpcy5sYXN0U2l6ZS53aWR0aCA9PSB3ICYmIHRoaXMubGFzdFNpemUuaGVpZ2h0ID09IGgpewogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9CiAgICAgICAgdGhpcy5sYXN0U2l6ZSA9IHt3aWR0aDogdywgaGVpZ2h0OiBofTsKCiAgICAgICAgdmFyIGFkaiA9IHRoaXMuYWRqdXN0U2l6ZSh3LCBoKTsKICAgICAgICB2YXIgYXcgPSBhZGoud2lkdGgsIGFoID0gYWRqLmhlaWdodDsKICAgICAgICBpZihhdyAhPT0gdW5kZWZpbmVkIHx8IGFoICE9PSB1bmRlZmluZWQpeyAgICAgICAgICAgICB2YXIgcnogPSB0aGlzLmdldFJlc2l6ZUVsKCk7CiAgICAgICAgICAgIGlmKCF0aGlzLmRlZmVySGVpZ2h0ICYmIGF3ICE9PSB1bmRlZmluZWQgJiYgYWggIT09IHVuZGVmaW5lZCl7CiAgICAgICAgICAgICAgICByei5zZXRTaXplKGF3LCBhaCk7CiAgICAgICAgICAgIH1lbHNlIGlmKCF0aGlzLmRlZmVySGVpZ2h0ICYmIGFoICE9PSB1bmRlZmluZWQpewogICAgICAgICAgICAgICAgcnouc2V0SGVpZ2h0KGFoKTsKICAgICAgICAgICAgfWVsc2UgaWYoYXcgIT09IHVuZGVmaW5lZCl7CiAgICAgICAgICAgICAgICByei5zZXRXaWR0aChhdyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5vblJlc2l6ZShhdywgYWgsIHcsIGgpOwogICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgncmVzaXplJywgdGhpcywgYXcsIGFoLCB3LCBoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAoKICAgIAogICAgZ2V0U2l6ZSA6IGZ1bmN0aW9uKCl7CiAgICAgICAgcmV0dXJuIHRoaXMuZWwuZ2V0U2l6ZSgpOwogICAgfSwKCiAgICAKICAgIGdldFBvc2l0aW9uIDogZnVuY3Rpb24obG9jYWwpewogICAgICAgIGlmKGxvY2FsID09PSB0cnVlKXsKICAgICAgICAgICAgcmV0dXJuIFt0aGlzLmVsLmdldExlZnQodHJ1ZSksIHRoaXMuZWwuZ2V0VG9wKHRydWUpXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMueHkgfHwgdGhpcy5lbC5nZXRYWSgpOwogICAgfSwKCiAgICAKICAgIGdldEJveCA6IGZ1bmN0aW9uKGxvY2FsKXsKICAgICAgICB2YXIgcyA9IHRoaXMuZWwuZ2V0U2l6ZSgpOwogICAgICAgIGlmKGxvY2FsKXsKICAgICAgICAgICAgcy54ID0gdGhpcy5lbC5nZXRMZWZ0KHRydWUpOwogICAgICAgICAgICBzLnkgPSB0aGlzLmVsLmdldFRvcCh0cnVlKTsKICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgdmFyIHh5ID0gdGhpcy54eSB8fCB0aGlzLmVsLmdldFhZKCk7CiAgICAgICAgICAgIHMueCA9IHh5WzBdOwogICAgICAgICAgICBzLnkgPSB4eVsxXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHM7CiAgICB9LAoKICAgIAogICAgdXBkYXRlQm94IDogZnVuY3Rpb24oYm94KXsKICAgICAgICB0aGlzLnNldFNpemUoYm94LndpZHRoLCBib3guaGVpZ2h0KTsKICAgICAgICB0aGlzLnNldFBhZ2VQb3NpdGlvbihib3gueCwgYm94LnkpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfSwKCiAgICAgICAgZ2V0UmVzaXplRWwgOiBmdW5jdGlvbigpewogICAgICAgIHJldHVybiB0aGlzLnJlc2l6ZUVsIHx8IHRoaXMuZWw7CiAgICB9LAoKICAgICAgICBnZXRQb3NpdGlvbkVsIDogZnVuY3Rpb24oKXsKICAgICAgICByZXR1cm4gdGhpcy5wb3NpdGlvbkVsIHx8IHRoaXMuZWw7CiAgICB9LAoKICAgIAogICAgc2V0UG9zaXRpb24gOiBmdW5jdGlvbih4LCB5KXsKICAgICAgICB0aGlzLnggPSB4OwogICAgICAgIHRoaXMueSA9IHk7CiAgICAgICAgaWYoIXRoaXMuYm94UmVhZHkpewogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9CiAgICAgICAgdmFyIGFkaiA9IHRoaXMuYWRqdXN0UG9zaXRpb24oeCwgeSk7CiAgICAgICAgdmFyIGF4ID0gYWRqLngsIGF5ID0gYWRqLnk7CgogICAgICAgIHZhciBlbCA9IHRoaXMuZ2V0UG9zaXRpb25FbCgpOwogICAgICAgIGlmKGF4ICE9PSB1bmRlZmluZWQgfHwgYXkgIT09IHVuZGVmaW5lZCl7CiAgICAgICAgICAgIGlmKGF4ICE9PSB1bmRlZmluZWQgJiYgYXkgIT09IHVuZGVmaW5lZCl7CiAgICAgICAgICAgICAgICBlbC5zZXRMZWZ0VG9wKGF4LCBheSk7CiAgICAgICAgICAgIH1lbHNlIGlmKGF4ICE9PSB1bmRlZmluZWQpewogICAgICAgICAgICAgICAgZWwuc2V0TGVmdChheCk7CiAgICAgICAgICAgIH1lbHNlIGlmKGF5ICE9PSB1bmRlZmluZWQpewogICAgICAgICAgICAgICAgZWwuc2V0VG9wKGF5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLm9uUG9zaXRpb24oYXgsIGF5KTsKICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoJ21vdmUnLCB0aGlzLCBheCwgYXkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpczsKICAgIH0sCgogICAgCiAgICBzZXRQYWdlUG9zaXRpb24gOiBmdW5jdGlvbih4LCB5KXsKICAgICAgICB0aGlzLnBhZ2VYID0geDsKICAgICAgICB0aGlzLnBhZ2VZID0geTsKICAgICAgICBpZighdGhpcy5ib3hSZWFkeSl7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYoeCA9PT0gdW5kZWZpbmVkIHx8IHkgPT09IHVuZGVmaW5lZCl7ICAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdmFyIHAgPSB0aGlzLmVsLnRyYW5zbGF0ZVBvaW50cyh4LCB5KTsKICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHAubGVmdCwgcC50b3ApOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfSwKCiAgICAgICAgb25SZW5kZXIgOiBmdW5jdGlvbihjdCwgcG9zaXRpb24pewogICAgICAgIEV4dC5Cb3hDb21wb25lbnQuc3VwZXJjbGFzcy5vblJlbmRlci5jYWxsKHRoaXMsIGN0LCBwb3NpdGlvbik7CiAgICAgICAgaWYodGhpcy5yZXNpemVFbCl7CiAgICAgICAgICAgIHRoaXMucmVzaXplRWwgPSBFeHQuZ2V0KHRoaXMucmVzaXplRWwpOwogICAgICAgIH0KICAgICAgICBpZih0aGlzLnBvc2l0aW9uRWwpewogICAgICAgICAgICB0aGlzLnBvc2l0aW9uRWwgPSBFeHQuZ2V0KHRoaXMucG9zaXRpb25FbCk7CiAgICAgICAgfQogICAgfSwKCiAgICAgICAgYWZ0ZXJSZW5kZXIgOiBmdW5jdGlvbigpewogICAgICAgIEV4dC5Cb3hDb21wb25lbnQuc3VwZXJjbGFzcy5hZnRlclJlbmRlci5jYWxsKHRoaXMpOwogICAgICAgIHRoaXMuYm94UmVhZHkgPSB0cnVlOwogICAgICAgIHRoaXMuc2V0U2l6ZSh0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7CiAgICAgICAgaWYodGhpcy54IHx8IHRoaXMueSl7CiAgICAgICAgICAgIHRoaXMuc2V0UG9zaXRpb24odGhpcy54LCB0aGlzLnkpOwogICAgICAgIH0KICAgICAgICBpZih0aGlzLnBhZ2VYIHx8IHRoaXMucGFnZVkpewogICAgICAgICAgICB0aGlzLnNldFBhZ2VQb3NpdGlvbih0aGlzLnBhZ2VYLCB0aGlzLnBhZ2VZKTsKICAgICAgICB9CiAgICB9LAoKICAgIAogICAgc3luY1NpemUgOiBmdW5jdGlvbigpewogICAgICAgIGRlbGV0ZSB0aGlzLmxhc3RTaXplOwogICAgICAgIHRoaXMuc2V0U2l6ZSh0aGlzLmVsLmdldFdpZHRoKCksIHRoaXMuZWwuZ2V0SGVpZ2h0KCkpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfSwKCiAgICAKICAgIG9uUmVzaXplIDogZnVuY3Rpb24oYWRqV2lkdGgsIGFkakhlaWdodCwgcmF3V2lkdGgsIHJhd0hlaWdodCl7CgogICAgfSwKCiAgICAKICAgIG9uUG9zaXRpb24gOiBmdW5jdGlvbih4LCB5KXsKCiAgICB9LAoKICAgICAgICBhZGp1c3RTaXplIDogZnVuY3Rpb24odywgaCl7CiAgICAgICAgaWYodGhpcy5hdXRvV2lkdGgpewogICAgICAgICAgICB3ID0gJ2F1dG8nOwogICAgICAgIH0KICAgICAgICBpZih0aGlzLmF1dG9IZWlnaHQpewogICAgICAgICAgICBoID0gJ2F1dG8nOwogICAgICAgIH0KICAgICAgICByZXR1cm4ge3dpZHRoIDogdywgaGVpZ2h0OiBofTsKICAgIH0sCgogICAgICAgIGFkanVzdFBvc2l0aW9uIDogZnVuY3Rpb24oeCwgeSl7CiAgICAgICAgcmV0dXJuIHt4IDogeCwgeTogeX07CiAgICB9Cn0pOwoNCkV4dC5TcGxpdEJhciA9IGZ1bmN0aW9uKGRyYWdFbGVtZW50LCByZXNpemluZ0VsZW1lbnQsIG9yaWVudGF0aW9uLCBwbGFjZW1lbnQsIGV4aXN0aW5nUHJveHkpew0KICAgIA0KICAgIA0KICAgIHRoaXMuZWwgPSBFeHQuZ2V0KGRyYWdFbGVtZW50LCB0cnVlKTsNCiAgICB0aGlzLmVsLmRvbS51bnNlbGVjdGFibGUgPSAib24iOw0KICAgIA0KICAgIHRoaXMucmVzaXppbmdFbCA9IEV4dC5nZXQocmVzaXppbmdFbGVtZW50LCB0cnVlKTsNCg0KICAgIA0KICAgIHRoaXMub3JpZW50YXRpb24gPSBvcmllbnRhdGlvbiB8fCBFeHQuU3BsaXRCYXIuSE9SSVpPTlRBTDsNCiAgICANCiAgICANCiAgICB0aGlzLm1pblNpemUgPSAwOw0KICAgIA0KICAgIA0KICAgIHRoaXMubWF4U2l6ZSA9IDIwMDA7DQogICAgDQogICAgDQogICAgdGhpcy5hbmltYXRlID0gZmFsc2U7DQogICAgDQogICAgDQogICAgdGhpcy51c2VTaGltID0gZmFsc2U7DQogICAgDQogICAgDQogICAgdGhpcy5zaGltID0gbnVsbDsNCiAgICANCiAgICBpZighZXhpc3RpbmdQcm94eSl7DQogICAgICAgIA0KICAgICAgICB0aGlzLnByb3h5ID0gRXh0LlNwbGl0QmFyLmNyZWF0ZVByb3h5KHRoaXMub3JpZW50YXRpb24pOw0KICAgIH1lbHNlew0KICAgICAgICB0aGlzLnByb3h5ID0gRXh0LmdldChleGlzdGluZ1Byb3h5KS5kb207DQogICAgfQ0KICAgIA0KICAgIHRoaXMuZGQgPSBuZXcgRXh0LmRkLkREUHJveHkodGhpcy5lbC5kb20uaWQsICJYU3BsaXRCYXJzIiwge2RyYWdFbElkIDogdGhpcy5wcm94eS5pZH0pOw0KICAgIA0KICAgIA0KICAgIHRoaXMuZGQuYjRTdGFydERyYWcgPSB0aGlzLm9uU3RhcnRQcm94eURyYWcuY3JlYXRlRGVsZWdhdGUodGhpcyk7DQogICAgDQogICAgDQogICAgdGhpcy5kZC5lbmREcmFnID0gdGhpcy5vbkVuZFByb3h5RHJhZy5jcmVhdGVEZWxlZ2F0ZSh0aGlzKTsNCiAgICANCiAgICANCiAgICB0aGlzLmRyYWdTcGVjcyA9IHt9Ow0KICAgIA0KICAgIA0KICAgIHRoaXMuYWRhcHRlciA9IG5ldyBFeHQuU3BsaXRCYXIuQmFzaWNMYXlvdXRBZGFwdGVyKCk7DQogICAgdGhpcy5hZGFwdGVyLmluaXQodGhpcyk7DQogICAgDQogICAgaWYodGhpcy5vcmllbnRhdGlvbiA9PSBFeHQuU3BsaXRCYXIuSE9SSVpPTlRBTCl7DQogICAgICAgIA0KICAgICAgICB0aGlzLnBsYWNlbWVudCA9IHBsYWNlbWVudCB8fCAodGhpcy5lbC5nZXRYKCkgPiB0aGlzLnJlc2l6aW5nRWwuZ2V0WCgpID8gRXh0LlNwbGl0QmFyLkxFRlQgOiBFeHQuU3BsaXRCYXIuUklHSFQpOw0KICAgICAgICB0aGlzLmVsLmFkZENsYXNzKCJ4LXNwbGl0YmFyLWgiKTsNCiAgICB9ZWxzZXsNCiAgICAgICAgDQogICAgICAgIHRoaXMucGxhY2VtZW50ID0gcGxhY2VtZW50IHx8ICh0aGlzLmVsLmdldFkoKSA+IHRoaXMucmVzaXppbmdFbC5nZXRZKCkgPyBFeHQuU3BsaXRCYXIuVE9QIDogRXh0LlNwbGl0QmFyLkJPVFRPTSk7DQogICAgICAgIHRoaXMuZWwuYWRkQ2xhc3MoIngtc3BsaXRiYXItdiIpOw0KICAgIH0NCiAgICANCiAgICB0aGlzLmFkZEV2ZW50cyh7DQogICAgICAgIA0KICAgICAgICAicmVzaXplIiA6IHRydWUsDQogICAgICAgIA0KICAgICAgICAibW92ZWQiIDogdHJ1ZSwNCiAgICAgICAgDQogICAgICAgICJiZWZvcmVyZXNpemUiIDogdHJ1ZSwNCg0KICAgICAgICAiYmVmb3JlYXBwbHkiIDogdHJ1ZQ0KICAgIH0pOw0KDQogICAgRXh0LlNwbGl0QmFyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTsNCn07DQoNCkV4dC5leHRlbmQoRXh0LlNwbGl0QmFyLCBFeHQudXRpbC5PYnNlcnZhYmxlLCB7DQogICAgb25TdGFydFByb3h5RHJhZyA6IGZ1bmN0aW9uKHgsIHkpew0KICAgICAgICB0aGlzLmZpcmVFdmVudCgiYmVmb3JlcmVzaXplIiwgdGhpcyk7DQogICAgICAgIGlmKCF0aGlzLm92ZXJsYXkpew0KICAgICAgICAgICAgdmFyIG8gPSBFeHQuRG9tSGVscGVyLmluc2VydEZpcnN0KGRvY3VtZW50LmJvZHksICB7Y2xzOiAieC1kcmFnLW92ZXJsYXkiLCBodG1sOiAiJiMxNjA7In0sIHRydWUpOw0KICAgICAgICAgICAgby51bnNlbGVjdGFibGUoKTsNCiAgICAgICAgICAgIG8uZW5hYmxlRGlzcGxheU1vZGUoImJsb2NrIik7DQogICAgICAgICAgICAKICAgICAgICAgICAgRXh0LlNwbGl0QmFyLnByb3RvdHlwZS5vdmVybGF5ID0gbzsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLm92ZXJsYXkuc2V0U2l6ZShFeHQubGliLkRvbS5nZXRWaWV3V2lkdGgodHJ1ZSksIEV4dC5saWIuRG9tLmdldFZpZXdIZWlnaHQodHJ1ZSkpOw0KICAgICAgICB0aGlzLm92ZXJsYXkuc2hvdygpOw0KICAgICAgICBFeHQuZ2V0KHRoaXMucHJveHkpLnNldERpc3BsYXllZCgiYmxvY2siKTsNCiAgICAgICAgdmFyIHNpemUgPSB0aGlzLmFkYXB0ZXIuZ2V0RWxlbWVudFNpemUodGhpcyk7DQogICAgICAgIHRoaXMuYWN0aXZlTWluU2l6ZSA9IHRoaXMuZ2V0TWluaW11bVNpemUoKTs7DQogICAgICAgIHRoaXMuYWN0aXZlTWF4U2l6ZSA9IHRoaXMuZ2V0TWF4aW11bVNpemUoKTs7DQogICAgICAgIHZhciBjMSA9IHNpemUgLSB0aGlzLmFjdGl2ZU1pblNpemU7DQogICAgICAgIHZhciBjMiA9IE1hdGgubWF4KHRoaXMuYWN0aXZlTWF4U2l6ZSAtIHNpemUsIDApOw0KICAgICAgICBpZih0aGlzLm9yaWVudGF0aW9uID09IEV4dC5TcGxpdEJhci5IT1JJWk9OVEFMKXsNCiAgICAgICAgICAgIHRoaXMuZGQucmVzZXRDb25zdHJhaW50cygpOw0KICAgICAgICAgICAgdGhpcy5kZC5zZXRYQ29uc3RyYWludCgNCiAgICAgICAgICAgICAgICB0aGlzLnBsYWNlbWVudCA9PSBFeHQuU3BsaXRCYXIuTEVGVCA/IGMxIDogYzIsIA0KICAgICAgICAgICAgICAgIHRoaXMucGxhY2VtZW50ID09IEV4dC5TcGxpdEJhci5MRUZUID8gYzIgOiBjMQ0KICAgICAgICAgICAgKTsNCiAgICAgICAgICAgIHRoaXMuZGQuc2V0WUNvbnN0cmFpbnQoMCwgMCk7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgdGhpcy5kZC5yZXNldENvbnN0cmFpbnRzKCk7DQogICAgICAgICAgICB0aGlzLmRkLnNldFhDb25zdHJhaW50KDAsIDApOw0KICAgICAgICAgICAgdGhpcy5kZC5zZXRZQ29uc3RyYWludCgNCiAgICAgICAgICAgICAgICB0aGlzLnBsYWNlbWVudCA9PSBFeHQuU3BsaXRCYXIuVE9QID8gYzEgOiBjMiwgDQogICAgICAgICAgICAgICAgdGhpcy5wbGFjZW1lbnQgPT0gRXh0LlNwbGl0QmFyLlRPUCA/IGMyIDogYzENCiAgICAgICAgICAgICk7DQogICAgICAgICB9DQogICAgICAgIHRoaXMuZHJhZ1NwZWNzLnN0YXJ0U2l6ZSA9IHNpemU7DQogICAgICAgIHRoaXMuZHJhZ1NwZWNzLnN0YXJ0UG9pbnQgPSBbeCwgeV07DQogICAgICAgIEV4dC5kZC5ERFByb3h5LnByb3RvdHlwZS5iNFN0YXJ0RHJhZy5jYWxsKHRoaXMuZGQsIHgsIHkpOw0KICAgIH0sDQogICAgDQogICAgDQogICAgb25FbmRQcm94eURyYWcgOiBmdW5jdGlvbihlKXsNCiAgICAgICAgRXh0LmdldCh0aGlzLnByb3h5KS5zZXREaXNwbGF5ZWQoZmFsc2UpOw0KICAgICAgICB2YXIgZW5kUG9pbnQgPSBFeHQubGliLkV2ZW50LmdldFhZKGUpOw0KICAgICAgICBpZih0aGlzLm92ZXJsYXkpew0KICAgICAgICAgICAgdGhpcy5vdmVybGF5LmhpZGUoKTsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgbmV3U2l6ZTsNCiAgICAgICAgaWYodGhpcy5vcmllbnRhdGlvbiA9PSBFeHQuU3BsaXRCYXIuSE9SSVpPTlRBTCl7DQogICAgICAgICAgICBuZXdTaXplID0gdGhpcy5kcmFnU3BlY3Muc3RhcnRTaXplICsgDQogICAgICAgICAgICAgICAgKHRoaXMucGxhY2VtZW50ID09IEV4dC5TcGxpdEJhci5MRUZUID8NCiAgICAgICAgICAgICAgICAgICAgZW5kUG9pbnRbMF0gLSB0aGlzLmRyYWdTcGVjcy5zdGFydFBvaW50WzBdIDoNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnU3BlY3Muc3RhcnRQb2ludFswXSAtIGVuZFBvaW50WzBdDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICBuZXdTaXplID0gdGhpcy5kcmFnU3BlY3Muc3RhcnRTaXplICsgDQogICAgICAgICAgICAgICAgKHRoaXMucGxhY2VtZW50ID09IEV4dC5TcGxpdEJhci5UT1AgPw0KICAgICAgICAgICAgICAgICAgICBlbmRQb2ludFsxXSAtIHRoaXMuZHJhZ1NwZWNzLnN0YXJ0UG9pbnRbMV0gOg0KICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYWdTcGVjcy5zdGFydFBvaW50WzFdIC0gZW5kUG9pbnRbMV0NCiAgICAgICAgICAgICAgICApOw0KICAgICAgICB9DQogICAgICAgIG5ld1NpemUgPSBNYXRoLm1pbihNYXRoLm1heChuZXdTaXplLCB0aGlzLmFjdGl2ZU1pblNpemUpLCB0aGlzLmFjdGl2ZU1heFNpemUpOw0KICAgICAgICBpZihuZXdTaXplICE9IHRoaXMuZHJhZ1NwZWNzLnN0YXJ0U2l6ZSl7DQogICAgICAgICAgICBpZih0aGlzLmZpcmVFdmVudCgnYmVmb3JlYXBwbHknLCB0aGlzLCBuZXdTaXplKSAhPT0gZmFsc2Upew0KICAgICAgICAgICAgICAgIHRoaXMuYWRhcHRlci5zZXRFbGVtZW50U2l6ZSh0aGlzLCBuZXdTaXplKTsNCiAgICAgICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgibW92ZWQiLCB0aGlzLCBuZXdTaXplKTsNCiAgICAgICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgicmVzaXplIiwgdGhpcywgbmV3U2l6ZSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9LA0KICAgIA0KICAgIA0KICAgIGdldEFkYXB0ZXIgOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gdGhpcy5hZGFwdGVyOw0KICAgIH0sDQogICAgDQogICAgDQogICAgc2V0QWRhcHRlciA6IGZ1bmN0aW9uKGFkYXB0ZXIpew0KICAgICAgICB0aGlzLmFkYXB0ZXIgPSBhZGFwdGVyOw0KICAgICAgICB0aGlzLmFkYXB0ZXIuaW5pdCh0aGlzKTsNCiAgICB9LA0KICAgIA0KICAgIA0KICAgIGdldE1pbmltdW1TaXplIDogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIHRoaXMubWluU2l6ZTsNCiAgICB9LA0KICAgIA0KICAgIA0KICAgIHNldE1pbmltdW1TaXplIDogZnVuY3Rpb24obWluU2l6ZSl7DQogICAgICAgIHRoaXMubWluU2l6ZSA9IG1pblNpemU7DQogICAgfSwNCiAgICANCiAgICANCiAgICBnZXRNYXhpbXVtU2l6ZSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLm1heFNpemU7DQogICAgfSwNCiAgICANCiAgICANCiAgICBzZXRNYXhpbXVtU2l6ZSA6IGZ1bmN0aW9uKG1heFNpemUpew0KICAgICAgICB0aGlzLm1heFNpemUgPSBtYXhTaXplOw0KICAgIH0sDQogICAgDQogICAgDQogICAgc2V0Q3VycmVudFNpemUgOiBmdW5jdGlvbihzaXplKXsNCiAgICAgICAgdmFyIG9sZEFuaW1hdGUgPSB0aGlzLmFuaW1hdGU7DQogICAgICAgIHRoaXMuYW5pbWF0ZSA9IGZhbHNlOw0KICAgICAgICB0aGlzLmFkYXB0ZXIuc2V0RWxlbWVudFNpemUodGhpcywgc2l6ZSk7DQogICAgICAgIHRoaXMuYW5pbWF0ZSA9IG9sZEFuaW1hdGU7DQogICAgfSwNCiAgICANCiAgICANCiAgICBkZXN0cm95IDogZnVuY3Rpb24ocmVtb3ZlRWwpew0KICAgICAgICBpZih0aGlzLnNoaW0pew0KICAgICAgICAgICAgdGhpcy5zaGltLnJlbW92ZSgpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuZGQudW5yZWcoKTsNCiAgICAgICAgdGhpcy5wcm94eS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMucHJveHkpOw0KICAgICAgICBpZihyZW1vdmVFbCl7DQogICAgICAgICAgICB0aGlzLmVsLnJlbW92ZSgpOw0KICAgICAgICB9DQogICAgfQ0KfSk7DQoNCg0KRXh0LlNwbGl0QmFyLmNyZWF0ZVByb3h5ID0gZnVuY3Rpb24oZGlyKXsNCiAgICB2YXIgcHJveHkgPSBuZXcgRXh0LkVsZW1lbnQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpOw0KICAgIHByb3h5LnVuc2VsZWN0YWJsZSgpOw0KICAgIHZhciBjbHMgPSAneC1zcGxpdGJhci1wcm94eSc7DQogICAgcHJveHkuYWRkQ2xhc3MoY2xzICsgJyAnICsgKGRpciA9PSBFeHQuU3BsaXRCYXIuSE9SSVpPTlRBTCA/IGNscyArJy1oJyA6IGNscyArICctdicpKTsNCiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHByb3h5LmRvbSk7DQogICAgcmV0dXJuIHByb3h5LmRvbTsNCn07DQoNCg0KRXh0LlNwbGl0QmFyLkJhc2ljTGF5b3V0QWRhcHRlciA9IGZ1bmN0aW9uKCl7DQp9Ow0KDQpFeHQuU3BsaXRCYXIuQmFzaWNMYXlvdXRBZGFwdGVyLnByb3RvdHlwZSA9IHsNCiAgICAKICAgIGluaXQgOiBmdW5jdGlvbihzKXsNCiAgICANCiAgICB9LA0KICAgIA0KICAgICBnZXRFbGVtZW50U2l6ZSA6IGZ1bmN0aW9uKHMpew0KICAgICAgICBpZihzLm9yaWVudGF0aW9uID09IEV4dC5TcGxpdEJhci5IT1JJWk9OVEFMKXsNCiAgICAgICAgICAgIHJldHVybiBzLnJlc2l6aW5nRWwuZ2V0V2lkdGgoKTsNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICByZXR1cm4gcy5yZXNpemluZ0VsLmdldEhlaWdodCgpOw0KICAgICAgICB9DQogICAgfSwNCiAgICANCiAgICANCiAgICBzZXRFbGVtZW50U2l6ZSA6IGZ1bmN0aW9uKHMsIG5ld1NpemUsIG9uQ29tcGxldGUpew0KICAgICAgICBpZihzLm9yaWVudGF0aW9uID09IEV4dC5TcGxpdEJhci5IT1JJWk9OVEFMKXsNCiAgICAgICAgICAgIGlmKCFzLmFuaW1hdGUpew0KICAgICAgICAgICAgICAgIHMucmVzaXppbmdFbC5zZXRXaWR0aChuZXdTaXplKTsNCiAgICAgICAgICAgICAgICBpZihvbkNvbXBsZXRlKXsNCiAgICAgICAgICAgICAgICAgICAgb25Db21wbGV0ZShzLCBuZXdTaXplKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICBzLnJlc2l6aW5nRWwuc2V0V2lkdGgobmV3U2l6ZSwgdHJ1ZSwgLjEsIG9uQ29tcGxldGUsICdlYXNlT3V0Jyk7DQogICAgICAgICAgICB9DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgDQogICAgICAgICAgICBpZighcy5hbmltYXRlKXsNCiAgICAgICAgICAgICAgICBzLnJlc2l6aW5nRWwuc2V0SGVpZ2h0KG5ld1NpemUpOw0KICAgICAgICAgICAgICAgIGlmKG9uQ29tcGxldGUpew0KICAgICAgICAgICAgICAgICAgICBvbkNvbXBsZXRlKHMsIG5ld1NpemUpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgIHMucmVzaXppbmdFbC5zZXRIZWlnaHQobmV3U2l6ZSwgdHJ1ZSwgLjEsIG9uQ29tcGxldGUsICdlYXNlT3V0Jyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9Ow0KDQoNCkV4dC5TcGxpdEJhci5BYnNvbHV0ZUxheW91dEFkYXB0ZXIgPSBmdW5jdGlvbihjb250YWluZXIpew0KICAgIHRoaXMuYmFzaWMgPSBuZXcgRXh0LlNwbGl0QmFyLkJhc2ljTGF5b3V0QWRhcHRlcigpOw0KICAgIHRoaXMuY29udGFpbmVyID0gRXh0LmdldChjb250YWluZXIpOw0KfTsNCg0KRXh0LlNwbGl0QmFyLkFic29sdXRlTGF5b3V0QWRhcHRlci5wcm90b3R5cGUgPSB7DQogICAgaW5pdCA6IGZ1bmN0aW9uKHMpew0KICAgICAgICB0aGlzLmJhc2ljLmluaXQocyk7DQogICAgfSwNCiAgICANCiAgICBnZXRFbGVtZW50U2l6ZSA6IGZ1bmN0aW9uKHMpew0KICAgICAgICByZXR1cm4gdGhpcy5iYXNpYy5nZXRFbGVtZW50U2l6ZShzKTsNCiAgICB9LA0KICAgIA0KICAgIHNldEVsZW1lbnRTaXplIDogZnVuY3Rpb24ocywgbmV3U2l6ZSwgb25Db21wbGV0ZSl7DQogICAgICAgIHRoaXMuYmFzaWMuc2V0RWxlbWVudFNpemUocywgbmV3U2l6ZSwgdGhpcy5tb3ZlU3BsaXR0ZXIuY3JlYXRlRGVsZWdhdGUodGhpcywgW3NdKSk7DQogICAgfSwNCiAgICANCiAgICBtb3ZlU3BsaXR0ZXIgOiBmdW5jdGlvbihzKXsNCiAgICAgICAgdmFyIHllcyA9IEV4dC5TcGxpdEJhcjsNCiAgICAgICAgc3dpdGNoKHMucGxhY2VtZW50KXsNCiAgICAgICAgICAgIGNhc2UgeWVzLkxFRlQ6DQogICAgICAgICAgICAgICAgcy5lbC5zZXRYKHMucmVzaXppbmdFbC5nZXRSaWdodCgpKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGNhc2UgeWVzLlJJR0hUOg0KICAgICAgICAgICAgICAgIHMuZWwuc2V0U3R5bGUoInJpZ2h0IiwgKHRoaXMuY29udGFpbmVyLmdldFdpZHRoKCkgLSBzLnJlc2l6aW5nRWwuZ2V0TGVmdCgpKSArICJweCIpOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSB5ZXMuVE9QOg0KICAgICAgICAgICAgICAgIHMuZWwuc2V0WShzLnJlc2l6aW5nRWwuZ2V0Qm90dG9tKCkpOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSB5ZXMuQk9UVE9NOg0KICAgICAgICAgICAgICAgIHMuZWwuc2V0WShzLnJlc2l6aW5nRWwuZ2V0VG9wKCkgLSBzLmVsLmdldEhlaWdodCgpKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgIH0NCn07DQoNCg0KRXh0LlNwbGl0QmFyLlZFUlRJQ0FMID0gMTsNCg0KDQpFeHQuU3BsaXRCYXIuSE9SSVpPTlRBTCA9IDI7DQoNCg0KRXh0LlNwbGl0QmFyLkxFRlQgPSAxOw0KDQoNCkV4dC5TcGxpdEJhci5SSUdIVCA9IDI7DQoNCg0KRXh0LlNwbGl0QmFyLlRPUCA9IDM7DQoNCg0KRXh0LlNwbGl0QmFyLkJPVFRPTSA9IDQ7DQoKDQpFeHQuVmlldyA9IGZ1bmN0aW9uKGNvbnRhaW5lciwgdHBsLCBjb25maWcpew0KICAgIHRoaXMuZWwgPSBFeHQuZ2V0KGNvbnRhaW5lcik7DQogICAgaWYodHlwZW9mIHRwbCA9PSAic3RyaW5nIil7DQogICAgICAgIHRwbCA9IG5ldyBFeHQuVGVtcGxhdGUodHBsKTsNCiAgICB9DQogICAgdHBsLmNvbXBpbGUoKTsNCiAgICANCiAgICB0aGlzLnRwbCA9IHRwbDsNCg0KICAgIEV4dC5hcHBseSh0aGlzLCBjb25maWcpOw0KDQogICAgDQogICAgdGhpcy5hZGRFdmVudHMoew0KICAgIA0KICAgICAgICAiYmVmb3JlY2xpY2siIDogdHJ1ZSwNCiAgICANCiAgICAgICAgImNsaWNrIiA6IHRydWUsDQogICAgDQogICAgICAgICJkYmxjbGljayIgOiB0cnVlLA0KICAgIA0KICAgICAgICAiY29udGV4dG1lbnUiIDogdHJ1ZSwNCiAgICANCiAgICAgICAgInNlbGVjdGlvbmNoYW5nZSIgOiB0cnVlLA0KDQogICAgDQogICAgICAgICJiZWZvcmVzZWxlY3QiIDogdHJ1ZQ0KICAgIH0pOw0KDQogICAgdGhpcy5lbC5vbih7DQogICAgICAgICJjbGljayI6IHRoaXMub25DbGljaywNCiAgICAgICAgImRibGNsaWNrIjogdGhpcy5vbkRibENsaWNrLA0KICAgICAgICAiY29udGV4dG1lbnUiOiB0aGlzLm9uQ29udGV4dE1lbnUsDQogICAgICAgIHNjb3BlOnRoaXMNCiAgICB9KTsNCg0KICAgIHRoaXMuc2VsZWN0aW9ucyA9IFtdOw0KICAgIHRoaXMubm9kZXMgPSBbXTsNCiAgICB0aGlzLmNtcCA9IG5ldyBFeHQuQ29tcG9zaXRlRWxlbWVudExpdGUoW10pOw0KICAgIGlmKHRoaXMuc3RvcmUpew0KICAgICAgICB0aGlzLnNldFN0b3JlKHRoaXMuc3RvcmUsIHRydWUpOw0KICAgIH0NCiAgICBFeHQuVmlldy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7DQp9Ow0KDQpFeHQuZXh0ZW5kKEV4dC5WaWV3LCBFeHQudXRpbC5PYnNlcnZhYmxlLCB7DQogICAgDQogICAgc2VsZWN0ZWRDbGFzcyA6ICJ4LXZpZXctc2VsZWN0ZWQiLA0KICAgIA0KICAgIGVtcHR5VGV4dCA6ICIiLA0KICAgIA0KICAgIGdldEVsIDogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIHRoaXMuZWw7DQogICAgfSwNCg0KICAgIA0KICAgIHJlZnJlc2ggOiBmdW5jdGlvbigpew0KICAgICAgICB2YXIgdCA9IHRoaXMudHBsOw0KICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9ucygpOw0KICAgICAgICB0aGlzLmVsLnVwZGF0ZSgiIik7DQogICAgICAgIHZhciBodG1sID0gW107DQogICAgICAgIHZhciByZWNvcmRzID0gdGhpcy5zdG9yZS5nZXRSYW5nZSgpOw0KICAgICAgICBpZihyZWNvcmRzLmxlbmd0aCA8IDEpew0KICAgICAgICAgICAgdGhpcy5lbC51cGRhdGUodGhpcy5lbXB0eVRleHQpOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQogICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IHJlY29yZHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspew0KICAgICAgICAgICAgdmFyIGRhdGEgPSB0aGlzLnByZXBhcmVEYXRhKHJlY29yZHNbaV0uZGF0YSwgaSwgcmVjb3Jkc1tpXSk7DQogICAgICAgICAgICBodG1sW2h0bWwubGVuZ3RoXSA9IHQuYXBwbHkoZGF0YSk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5lbC51cGRhdGUoaHRtbC5qb2luKCIiKSk7DQogICAgICAgIHRoaXMubm9kZXMgPSB0aGlzLmVsLmRvbS5jaGlsZE5vZGVzOw0KICAgICAgICB0aGlzLnVwZGF0ZUluZGV4ZXMoMCk7DQogICAgfSwNCg0KICAgIA0KICAgIHByZXBhcmVEYXRhIDogZnVuY3Rpb24oZGF0YSl7DQogICAgICAgIHJldHVybiBkYXRhOw0KICAgIH0sDQoNCiAgICBvblVwZGF0ZSA6IGZ1bmN0aW9uKGRzLCByZWNvcmQpew0KICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9ucygpOw0KICAgICAgICB2YXIgaW5kZXggPSB0aGlzLnN0b3JlLmluZGV4T2YocmVjb3JkKTsNCiAgICAgICAgdmFyIG4gPSB0aGlzLm5vZGVzW2luZGV4XTsNCiAgICAgICAgdGhpcy50cGwuaW5zZXJ0QmVmb3JlKG4sIHRoaXMucHJlcGFyZURhdGEocmVjb3JkLmRhdGEpKTsNCiAgICAgICAgbi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG4pOw0KICAgICAgICB0aGlzLnVwZGF0ZUluZGV4ZXMoaW5kZXgsIGluZGV4KTsNCiAgICB9LA0KDQogICAgb25BZGQgOiBmdW5jdGlvbihkcywgcmVjb3JkcywgaW5kZXgpew0KICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9ucygpOw0KICAgICAgICBpZih0aGlzLm5vZGVzLmxlbmd0aCA9PSAwKXsNCiAgICAgICAgICAgIHRoaXMucmVmcmVzaCgpOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQogICAgICAgIHZhciBuID0gdGhpcy5ub2Rlc1tpbmRleF07DQogICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IHJlY29yZHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspew0KICAgICAgICAgICAgdmFyIGQgPSB0aGlzLnByZXBhcmVEYXRhKHJlY29yZHNbaV0uZGF0YSk7DQogICAgICAgICAgICBpZihuKXsNCiAgICAgICAgICAgICAgICB0aGlzLnRwbC5pbnNlcnRCZWZvcmUobiwgZCk7DQogICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICB0aGlzLnRwbC5hcHBlbmQodGhpcy5lbCwgZCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgdGhpcy51cGRhdGVJbmRleGVzKGluZGV4KTsNCiAgICB9LA0KDQogICAgb25SZW1vdmUgOiBmdW5jdGlvbihkcywgcmVjb3JkLCBpbmRleCl7DQogICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb25zKCk7DQogICAgICAgIHRoaXMuZWwuZG9tLnJlbW92ZUNoaWxkKHRoaXMubm9kZXNbaW5kZXhdKTsNCiAgICAgICAgdGhpcy51cGRhdGVJbmRleGVzKGluZGV4KTsNCiAgICB9LA0KDQogICAgDQogICAgcmVmcmVzaE5vZGUgOiBmdW5jdGlvbihpbmRleCl7DQogICAgICAgIHRoaXMub25VcGRhdGUodGhpcy5zdG9yZSwgdGhpcy5zdG9yZS5nZXRBdChpbmRleCkpOw0KICAgIH0sDQoNCiAgICB1cGRhdGVJbmRleGVzIDogZnVuY3Rpb24oc3RhcnRJbmRleCwgZW5kSW5kZXgpew0KICAgICAgICB2YXIgbnMgPSB0aGlzLm5vZGVzOw0KICAgICAgICBzdGFydEluZGV4ID0gc3RhcnRJbmRleCB8fCAwOw0KICAgICAgICBlbmRJbmRleCA9IGVuZEluZGV4IHx8IG5zLmxlbmd0aCAtIDE7DQogICAgICAgIGZvcih2YXIgaSA9IHN0YXJ0SW5kZXg7IGkgPD0gZW5kSW5kZXg7IGkrKyl7DQogICAgICAgICAgICBuc1tpXS5ub2RlSW5kZXggPSBpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIHNldFN0b3JlIDogZnVuY3Rpb24oc3RvcmUsIGluaXRpYWwpew0KICAgICAgICBpZighaW5pdGlhbCAmJiB0aGlzLnN0b3JlKXsNCiAgICAgICAgICAgIHRoaXMuc3RvcmUudW4oImRhdGFjaGFuZ2VkIiwgdGhpcy5yZWZyZXNoKTsNCiAgICAgICAgICAgIHRoaXMuc3RvcmUudW4oImFkZCIsIHRoaXMub25BZGQpOw0KICAgICAgICAgICAgdGhpcy5zdG9yZS51bigicmVtb3ZlIiwgdGhpcy5vblJlbW92ZSk7DQogICAgICAgICAgICB0aGlzLnN0b3JlLnVuKCJ1cGRhdGUiLCB0aGlzLm9uVXBkYXRlKTsNCiAgICAgICAgICAgIHRoaXMuc3RvcmUudW4oImNsZWFyIiwgdGhpcy5yZWZyZXNoKTsNCiAgICAgICAgfQ0KICAgICAgICBpZihzdG9yZSl7DQogICAgICAgICAgICBzdG9yZS5vbigiZGF0YWNoYW5nZWQiLCB0aGlzLnJlZnJlc2gsIHRoaXMpOw0KICAgICAgICAgICAgc3RvcmUub24oImFkZCIsIHRoaXMub25BZGQsIHRoaXMpOw0KICAgICAgICAgICAgc3RvcmUub24oInJlbW92ZSIsIHRoaXMub25SZW1vdmUsIHRoaXMpOw0KICAgICAgICAgICAgc3RvcmUub24oInVwZGF0ZSIsIHRoaXMub25VcGRhdGUsIHRoaXMpOw0KICAgICAgICAgICAgc3RvcmUub24oImNsZWFyIiwgdGhpcy5yZWZyZXNoLCB0aGlzKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLnN0b3JlID0gc3RvcmU7DQogICAgICAgIGlmKHN0b3JlKXsNCiAgICAgICAgICAgIHRoaXMucmVmcmVzaCgpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIGZpbmRJdGVtRnJvbUNoaWxkIDogZnVuY3Rpb24obm9kZSl7DQogICAgICAgIHZhciBlbCA9IHRoaXMuZWwuZG9tOw0KICAgICAgICBpZighbm9kZSB8fCBub2RlLnBhcmVudE5vZGUgPT0gZWwpew0KCQkgICAgcmV0dXJuIG5vZGU7DQoJICAgIH0NCgkgICAgdmFyIHAgPSBub2RlLnBhcmVudE5vZGU7DQoJICAgIHdoaWxlKHAgJiYgcCAhPSBlbCl7DQogICAgICAgICAgICBpZihwLnBhcmVudE5vZGUgPT0gZWwpew0KICAgICAgICAgICAgCXJldHVybiBwOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcCA9IHAucGFyZW50Tm9kZTsNCiAgICAgICAgfQ0KCSAgICByZXR1cm4gbnVsbDsNCiAgICB9LA0KDQogICAgDQogICAgb25DbGljayA6IGZ1bmN0aW9uKGUpew0KICAgICAgICB2YXIgaXRlbSA9IHRoaXMuZmluZEl0ZW1Gcm9tQ2hpbGQoZS5nZXRUYXJnZXQoKSk7DQogICAgICAgIGlmKGl0ZW0pew0KICAgICAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5pbmRleE9mKGl0ZW0pOw0KICAgICAgICAgICAgaWYodGhpcy5vbkl0ZW1DbGljayhpdGVtLCBpbmRleCwgZSkgIT09IGZhbHNlKXsNCiAgICAgICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgiY2xpY2siLCB0aGlzLCBpbmRleCwgaXRlbSwgZSk7DQogICAgICAgICAgICB9DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbnMoKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICANCiAgICBvbkNvbnRleHRNZW51IDogZnVuY3Rpb24oZSl7DQogICAgICAgIHZhciBpdGVtID0gdGhpcy5maW5kSXRlbUZyb21DaGlsZChlLmdldFRhcmdldCgpKTsNCiAgICAgICAgaWYoaXRlbSl7DQogICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgiY29udGV4dG1lbnUiLCB0aGlzLCB0aGlzLmluZGV4T2YoaXRlbSksIGl0ZW0sIGUpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIG9uRGJsQ2xpY2sgOiBmdW5jdGlvbihlKXsNCiAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLmZpbmRJdGVtRnJvbUNoaWxkKGUuZ2V0VGFyZ2V0KCkpOw0KICAgICAgICBpZihpdGVtKXsNCiAgICAgICAgICAgIHRoaXMuZmlyZUV2ZW50KCJkYmxjbGljayIsIHRoaXMsIHRoaXMuaW5kZXhPZihpdGVtKSwgaXRlbSwgZSk7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgb25JdGVtQ2xpY2sgOiBmdW5jdGlvbihpdGVtLCBpbmRleCwgZSl7DQogICAgICAgIGlmKHRoaXMuZmlyZUV2ZW50KCJiZWZvcmVjbGljayIsIHRoaXMsIGluZGV4LCBpdGVtLCBlKSA9PT0gZmFsc2Upew0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9DQogICAgICAgIGlmKHRoaXMubXVsdGlTZWxlY3QgfHwgdGhpcy5zaW5nbGVTZWxlY3Qpew0KICAgICAgICAgICAgaWYodGhpcy5tdWx0aVNlbGVjdCAmJiBlLnNoaWZ0S2V5ICYmIHRoaXMubGFzdFNlbGVjdGlvbil7DQogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3QodGhpcy5nZXROb2Rlcyh0aGlzLmluZGV4T2YodGhpcy5sYXN0U2VsZWN0aW9uKSwgaW5kZXgpLCBmYWxzZSk7DQogICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdChpdGVtLCB0aGlzLm11bHRpU2VsZWN0ICYmIGUuY3RybEtleSk7DQogICAgICAgICAgICAgICAgdGhpcy5sYXN0U2VsZWN0aW9uID0gaXRlbTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9LA0KDQogICAgDQogICAgZ2V0U2VsZWN0aW9uQ291bnQgOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25zLmxlbmd0aDsNCiAgICB9LA0KDQogICAgDQogICAgZ2V0U2VsZWN0ZWROb2RlcyA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbnM7DQogICAgfSwNCg0KICAgIA0KICAgIGdldFNlbGVjdGVkSW5kZXhlcyA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHZhciBpbmRleGVzID0gW10sIHMgPSB0aGlzLnNlbGVjdGlvbnM7DQogICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspew0KICAgICAgICAgICAgaW5kZXhlcy5wdXNoKHNbaV0ubm9kZUluZGV4KTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gaW5kZXhlczsNCiAgICB9LA0KDQogICAgDQogICAgY2xlYXJTZWxlY3Rpb25zIDogZnVuY3Rpb24oc3VwcHJlc3NFdmVudCl7DQogICAgICAgIGlmKHRoaXMubm9kZXMgJiYgKHRoaXMubXVsdGlTZWxlY3QgfHwgdGhpcy5zaW5nbGVTZWxlY3QpICYmIHRoaXMuc2VsZWN0aW9ucy5sZW5ndGggPiAwKXsNCiAgICAgICAgICAgIHRoaXMuY21wLmVsZW1lbnRzID0gdGhpcy5zZWxlY3Rpb25zOw0KICAgICAgICAgICAgdGhpcy5jbXAucmVtb3ZlQ2xhc3ModGhpcy5zZWxlY3RlZENsYXNzKTsNCiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9ucyA9IFtdOw0KICAgICAgICAgICAgaWYoIXN1cHByZXNzRXZlbnQpew0KICAgICAgICAgICAgICAgIHRoaXMuZmlyZUV2ZW50KCJzZWxlY3Rpb25jaGFuZ2UiLCB0aGlzLCB0aGlzLnNlbGVjdGlvbnMpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIGlzU2VsZWN0ZWQgOiBmdW5jdGlvbihub2RlKXsNCiAgICAgICAgdmFyIHMgPSB0aGlzLnNlbGVjdGlvbnM7DQogICAgICAgIGlmKHMubGVuZ3RoIDwgMSl7DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCiAgICAgICAgbm9kZSA9IHRoaXMuZ2V0Tm9kZShub2RlKTsNCiAgICAgICAgcmV0dXJuIHMuaW5kZXhPZihub2RlKSAhPT0gLTE7DQogICAgfSwNCg0KICAgIA0KICAgIHNlbGVjdCA6IGZ1bmN0aW9uKG5vZGVJbmZvLCBrZWVwRXhpc3RpbmcsIHN1cHByZXNzRXZlbnQpew0KICAgICAgICBpZihub2RlSW5mbyBpbnN0YW5jZW9mIEFycmF5KXsNCiAgICAgICAgICAgIGlmKCFrZWVwRXhpc3Rpbmcpew0KICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb25zKHRydWUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gbm9kZUluZm8ubGVuZ3RoOyBpIDwgbGVuOyBpKyspew0KICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0KG5vZGVJbmZvW2ldLCB0cnVlLCB0cnVlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlew0KICAgICAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmdldE5vZGUobm9kZUluZm8pOw0KICAgICAgICAgICAgaWYobm9kZSAmJiAhdGhpcy5pc1NlbGVjdGVkKG5vZGUpKXsNCiAgICAgICAgICAgICAgICBpZigha2VlcEV4aXN0aW5nKXsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbnModHJ1ZSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmKHRoaXMuZmlyZUV2ZW50KCJiZWZvcmVzZWxlY3QiLCB0aGlzLCBub2RlLCB0aGlzLnNlbGVjdGlvbnMpICE9PSBmYWxzZSl7DQogICAgICAgICAgICAgICAgICAgIEV4dC5mbHkobm9kZSkuYWRkQ2xhc3ModGhpcy5zZWxlY3RlZENsYXNzKTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25zLnB1c2gobm9kZSk7DQogICAgICAgICAgICAgICAgICAgIGlmKCFzdXBwcmVzc0V2ZW50KXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZUV2ZW50KCJzZWxlY3Rpb25jaGFuZ2UiLCB0aGlzLCB0aGlzLnNlbGVjdGlvbnMpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIGdldE5vZGUgOiBmdW5jdGlvbihub2RlSW5mbyl7DQogICAgICAgIGlmKHR5cGVvZiBub2RlSW5mbyA9PSAic3RyaW5nIil7DQogICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobm9kZUluZm8pOw0KICAgICAgICB9ZWxzZSBpZih0eXBlb2Ygbm9kZUluZm8gPT0gIm51bWJlciIpew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9kZXNbbm9kZUluZm9dOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBub2RlSW5mbzsNCiAgICB9LA0KDQogICAgDQogICAgZ2V0Tm9kZXMgOiBmdW5jdGlvbihzdGFydCwgZW5kKXsNCiAgICAgICAgdmFyIG5zID0gdGhpcy5ub2RlczsNCiAgICAgICAgc3RhcnQgPSBzdGFydCB8fCAwOw0KICAgICAgICBlbmQgPSB0eXBlb2YgZW5kID09ICJ1bmRlZmluZWQiID8gbnMubGVuZ3RoIC0gMSA6IGVuZDsNCiAgICAgICAgdmFyIG5vZGVzID0gW107DQogICAgICAgIGlmKHN0YXJ0IDw9IGVuZCl7DQogICAgICAgICAgICBmb3IodmFyIGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKyl7DQogICAgICAgICAgICAgICAgbm9kZXMucHVzaChuc1tpXSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZXsNCiAgICAgICAgICAgIGZvcih2YXIgaSA9IHN0YXJ0OyBpID49IGVuZDsgaS0tKXsNCiAgICAgICAgICAgICAgICBub2Rlcy5wdXNoKG5zW2ldKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gbm9kZXM7DQogICAgfSwNCg0KICAgIA0KICAgIGluZGV4T2YgOiBmdW5jdGlvbihub2RlKXsNCiAgICAgICAgbm9kZSA9IHRoaXMuZ2V0Tm9kZShub2RlKTsNCiAgICAgICAgaWYodHlwZW9mIG5vZGUubm9kZUluZGV4ID09ICJudW1iZXIiKXsNCiAgICAgICAgICAgIHJldHVybiBub2RlLm5vZGVJbmRleDsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgbnMgPSB0aGlzLm5vZGVzOw0KICAgICAgICBmb3IodmFyIGkgPSAwLCBsZW4gPSBucy5sZW5ndGg7IGkgPCBsZW47IGkrKyl7DQogICAgICAgICAgICBpZihuc1tpXSA9PSBub2RlKXsNCiAgICAgICAgICAgICAgICByZXR1cm4gaTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gLTE7DQogICAgfQ0KfSk7DQoKDQpFeHQuSnNvblZpZXcgPSBmdW5jdGlvbihjb250YWluZXIsIHRwbCwgY29uZmlnKXsNCiAgICBFeHQuSnNvblZpZXcuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIGNvbnRhaW5lciwgdHBsLCBjb25maWcpOw0KDQogICAgdmFyIHVtID0gdGhpcy5lbC5nZXRVcGRhdGVNYW5hZ2VyKCk7DQogICAgdW0uc2V0UmVuZGVyZXIodGhpcyk7DQogICAgdW0ub24oInVwZGF0ZSIsIHRoaXMub25Mb2FkLCB0aGlzKTsNCiAgICB1bS5vbigiZmFpbHVyZSIsIHRoaXMub25Mb2FkRXhjZXB0aW9uLCB0aGlzKTsNCg0KICAgIA0KICAgIA0KICAgIA0KICAgIHRoaXMuYWRkRXZlbnRzKHsNCiAgICAgICAgJ2JlZm9yZXJlbmRlcicgOiB0cnVlLA0KICAgICAgICAnbG9hZCcgOiB0cnVlLA0KICAgICAgICAnbG9hZGV4Y2VwdGlvbicgOiB0cnVlDQogICAgfSk7DQp9Ow0KRXh0LmV4dGVuZChFeHQuSnNvblZpZXcsIEV4dC5WaWV3LCB7DQogICAgDQogICAganNvblJvb3QgOiAiIiwNCg0KICAgIA0KICAgIHJlZnJlc2ggOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9ucygpOw0KICAgICAgICB0aGlzLmVsLnVwZGF0ZSgiIik7DQogICAgICAgIHZhciBodG1sID0gW107DQogICAgICAgIHZhciBvID0gdGhpcy5qc29uRGF0YTsNCiAgICAgICAgaWYobyAmJiBvLmxlbmd0aCA+IDApew0KICAgICAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gby5sZW5ndGg7IGkgPCBsZW47IGkrKyl7DQogICAgICAgICAgICAgICAgdmFyIGRhdGEgPSB0aGlzLnByZXBhcmVEYXRhKG9baV0sIGksIG8pOw0KICAgICAgICAgICAgICAgIGh0bWxbaHRtbC5sZW5ndGhdID0gdGhpcy50cGwuYXBwbHkoZGF0YSk7DQogICAgICAgICAgICB9DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgaHRtbC5wdXNoKHRoaXMuZW1wdHlUZXh0KTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmVsLnVwZGF0ZShodG1sLmpvaW4oIiIpKTsNCiAgICAgICAgdGhpcy5ub2RlcyA9IHRoaXMuZWwuZG9tLmNoaWxkTm9kZXM7DQogICAgICAgIHRoaXMudXBkYXRlSW5kZXhlcygwKTsNCiAgICB9LA0KDQogICAgDQogICAgbG9hZCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHZhciB1bSA9IHRoaXMuZWwuZ2V0VXBkYXRlTWFuYWdlcigpOw0KICAgICAgICB1bS51cGRhdGUuYXBwbHkodW0sIGFyZ3VtZW50cyk7DQogICAgfSwNCg0KICAgIHJlbmRlciA6IGZ1bmN0aW9uKGVsLCByZXNwb25zZSl7DQogICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb25zKCk7DQogICAgICAgIHRoaXMuZWwudXBkYXRlKCIiKTsNCiAgICAgICAgdmFyIG87DQogICAgICAgIHRyeXsNCiAgICAgICAgICAgIG8gPSBFeHQudXRpbC5KU09OLmRlY29kZShyZXNwb25zZS5yZXNwb25zZVRleHQpOw0KICAgICAgICAgICAgaWYodGhpcy5qc29uUm9vdCl7DQogICAgICAgICAgICAgICAgbyA9IGV2YWwoIm8uIiArIHRoaXMuanNvblJvb3QpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGNhdGNoKGUpew0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICB0aGlzLmpzb25EYXRhID0gbzsNCiAgICAgICAgdGhpcy5iZWZvcmVSZW5kZXIoKTsNCiAgICAgICAgdGhpcy5yZWZyZXNoKCk7DQogICAgfSwNCg0KDQogICAgZ2V0Q291bnQgOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gdGhpcy5qc29uRGF0YSA/IHRoaXMuanNvbkRhdGEubGVuZ3RoIDogMDsNCiAgICB9LA0KDQoNCiAgICBnZXROb2RlRGF0YSA6IGZ1bmN0aW9uKG5vZGUpew0KICAgICAgICBpZihub2RlIGluc3RhbmNlb2YgQXJyYXkpew0KICAgICAgICAgICAgdmFyIGRhdGEgPSBbXTsNCiAgICAgICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IG5vZGUubGVuZ3RoOyBpIDwgbGVuOyBpKyspew0KICAgICAgICAgICAgICAgIGRhdGEucHVzaCh0aGlzLmdldE5vZGVEYXRhKG5vZGVbaV0pKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBkYXRhOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0aGlzLmpzb25EYXRhW3RoaXMuaW5kZXhPZihub2RlKV0gfHwgbnVsbDsNCiAgICB9LA0KDQogICAgYmVmb3JlUmVuZGVyIDogZnVuY3Rpb24oKXsNCiAgICAgICAgdGhpcy5zbmFwc2hvdCA9IHRoaXMuanNvbkRhdGE7DQogICAgICAgIGlmKHRoaXMuc29ydEluZm8pew0KICAgICAgICAgICAgdGhpcy5zb3J0LmFwcGx5KHRoaXMsIHRoaXMuc29ydEluZm8pOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuZmlyZUV2ZW50KCJiZWZvcmVyZW5kZXIiLCB0aGlzLCB0aGlzLmpzb25EYXRhKTsNCiAgICB9LA0KDQogICAgb25Mb2FkIDogZnVuY3Rpb24oZWwsIG8pew0KICAgICAgICB0aGlzLmZpcmVFdmVudCgibG9hZCIsIHRoaXMsIHRoaXMuanNvbkRhdGEsIG8pOw0KICAgIH0sDQoNCiAgICBvbkxvYWRFeGNlcHRpb24gOiBmdW5jdGlvbihlbCwgbyl7DQogICAgICAgIHRoaXMuZmlyZUV2ZW50KCJsb2FkZXhjZXB0aW9uIiwgdGhpcywgbyk7DQogICAgfSwNCg0KDQogICAgZmlsdGVyIDogZnVuY3Rpb24ocHJvcGVydHksIHZhbHVlKXsNCiAgICAgICAgaWYodGhpcy5qc29uRGF0YSl7DQogICAgICAgICAgICB2YXIgZGF0YSA9IFtdOw0KICAgICAgICAgICAgdmFyIHNzID0gdGhpcy5zbmFwc2hvdDsNCiAgICAgICAgICAgIGlmKHR5cGVvZiB2YWx1ZSA9PSAic3RyaW5nIil7DQogICAgICAgICAgICAgICAgdmFyIHZsZW4gPSB2YWx1ZS5sZW5ndGg7DQogICAgICAgICAgICAgICAgaWYodmxlbiA9PSAwKXsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhckZpbHRlcigpOw0KICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTsNCiAgICAgICAgICAgICAgICBmb3IodmFyIGkgPSAwLCBsZW4gPSBzcy5sZW5ndGg7IGkgPCBsZW47IGkrKyl7DQogICAgICAgICAgICAgICAgICAgIHZhciBvID0gc3NbaV07DQogICAgICAgICAgICAgICAgICAgIGlmKG9bcHJvcGVydHldLnN1YnN0cigwLCB2bGVuKS50b0xvd2VyQ2FzZSgpID09IHZhbHVlKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucHVzaChvKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSBpZih2YWx1ZS5leGVjKXsgCiAgICAgICAgICAgICAgICBmb3IodmFyIGkgPSAwLCBsZW4gPSBzcy5sZW5ndGg7IGkgPCBsZW47IGkrKyl7DQogICAgICAgICAgICAgICAgICAgIHZhciBvID0gc3NbaV07DQogICAgICAgICAgICAgICAgICAgIGlmKHZhbHVlLnRlc3Qob1twcm9wZXJ0eV0pKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucHVzaChvKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZXsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLmpzb25EYXRhID0gZGF0YTsNCiAgICAgICAgICAgIHRoaXMucmVmcmVzaCgpOw0KICAgICAgICB9DQogICAgfSwNCg0KDQogICAgZmlsdGVyQnkgOiBmdW5jdGlvbihmbiwgc2NvcGUpew0KICAgICAgICBpZih0aGlzLmpzb25EYXRhKXsNCiAgICAgICAgICAgIHZhciBkYXRhID0gW107DQogICAgICAgICAgICB2YXIgc3MgPSB0aGlzLnNuYXBzaG90Ow0KICAgICAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gc3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspew0KICAgICAgICAgICAgICAgIHZhciBvID0gc3NbaV07DQogICAgICAgICAgICAgICAgaWYoZm4uY2FsbChzY29wZSB8fCB0aGlzLCBvKSl7DQogICAgICAgICAgICAgICAgICAgIGRhdGEucHVzaChvKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLmpzb25EYXRhID0gZGF0YTsNCiAgICAgICAgICAgIHRoaXMucmVmcmVzaCgpOw0KICAgICAgICB9DQogICAgfSwNCg0KDQogICAgY2xlYXJGaWx0ZXIgOiBmdW5jdGlvbigpew0KICAgICAgICBpZih0aGlzLnNuYXBzaG90ICYmIHRoaXMuanNvbkRhdGEgIT0gdGhpcy5zbmFwc2hvdCl7DQogICAgICAgICAgICB0aGlzLmpzb25EYXRhID0gdGhpcy5zbmFwc2hvdDsNCiAgICAgICAgICAgIHRoaXMucmVmcmVzaCgpOw0KICAgICAgICB9DQogICAgfSwNCg0KDQoNCiAgICBzb3J0IDogZnVuY3Rpb24ocHJvcGVydHksIGRpciwgc29ydFR5cGUpew0KICAgICAgICB0aGlzLnNvcnRJbmZvID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTsNCiAgICAgICAgaWYodGhpcy5qc29uRGF0YSl7DQogICAgICAgICAgICB2YXIgcCA9IHByb3BlcnR5Ow0KICAgICAgICAgICAgdmFyIGRzYyA9IGRpciAmJiBkaXIudG9Mb3dlckNhc2UoKSA9PSAiZGVzYyI7DQogICAgICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uKG8xLCBvMil7DQogICAgICAgICAgICAgICAgdmFyIHYxID0gc29ydFR5cGUgPyBzb3J0VHlwZShvMVtwXSkgOiBvMVtwXTsNCiAgICAgICAgICAgICAgICB2YXIgdjIgPSBzb3J0VHlwZSA/IHNvcnRUeXBlKG8yW3BdKSA6IG8yW3BdOw0KICAgICAgICAgICAgICAgIDsNCiAgICAgICAgICAgICAgICBpZih2MSA8IHYyKXsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRzYyA/ICsxIDogLTE7DQogICAgICAgICAgICAgICAgfSBlbHNlIGlmKHYxID4gdjIpew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZHNjID8gLTEgOiArMTsNCiAgICAgICAgICAgICAgICB9IGVsc2V7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH07DQogICAgICAgICAgICB0aGlzLmpzb25EYXRhLnNvcnQoZik7DQogICAgICAgICAgICB0aGlzLnJlZnJlc2goKTsNCiAgICAgICAgICAgIGlmKHRoaXMuanNvbkRhdGEgIT0gdGhpcy5zbmFwc2hvdCl7DQogICAgICAgICAgICAgICAgdGhpcy5zbmFwc2hvdC5zb3J0KGYpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KfSk7CgpFeHQuQ29sb3JQYWxldHRlID0gZnVuY3Rpb24oY29uZmlnKXsKICAgIEV4dC5Db2xvclBhbGV0dGUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIGNvbmZpZyk7CiAgICB0aGlzLmFkZEV2ZW50cyh7CiAgICAgICAgCiAgICAgICAgc2VsZWN0OiB0cnVlCiAgICB9KTsKCiAgICBpZih0aGlzLmhhbmRsZXIpewogICAgICAgIHRoaXMub24oInNlbGVjdCIsIHRoaXMuaGFuZGxlciwgdGhpcy5zY29wZSwgdHJ1ZSk7CiAgICB9Cn07CkV4dC5leHRlbmQoRXh0LkNvbG9yUGFsZXR0ZSwgRXh0LkNvbXBvbmVudCwgewogICAgCiAgICBpdGVtQ2xzIDogIngtY29sb3ItcGFsZXR0ZSIsCiAgICAKICAgIHZhbHVlIDogbnVsbCwKICAgIGNsaWNrRXZlbnQ6J2NsaWNrJywKICAgICAgICBjdHlwZTogIkV4dC5Db2xvclBhbGV0dGUiLAoKICAgIAogICAgYWxsb3dSZXNlbGVjdCA6IGZhbHNlLAoKICAgIAogICAgY29sb3JzIDogWwogICAgICAgICIwMDAwMDAiLCAiOTkzMzAwIiwgIjMzMzMwMCIsICIwMDMzMDAiLCAiMDAzMzY2IiwgIjAwMDA4MCIsICIzMzMzOTkiLCAiMzMzMzMzIiwKICAgICAgICAiODAwMDAwIiwgIkZGNjYwMCIsICI4MDgwMDAiLCAiMDA4MDAwIiwgIjAwODA4MCIsICIwMDAwRkYiLCAiNjY2Njk5IiwgIjgwODA4MCIsCiAgICAgICAgIkZGMDAwMCIsICJGRjk5MDAiLCAiOTlDQzAwIiwgIjMzOTk2NiIsICIzM0NDQ0MiLCAiMzM2NkZGIiwgIjgwMDA4MCIsICI5Njk2OTYiLAogICAgICAgICJGRjAwRkYiLCAiRkZDQzAwIiwgIkZGRkYwMCIsICIwMEZGMDAiLCAiMDBGRkZGIiwgIjAwQ0NGRiIsICI5OTMzNjYiLCAiQzBDMEMwIiwKICAgICAgICAiRkY5OUNDIiwgIkZGQ0M5OSIsICJGRkZGOTkiLCAiQ0NGRkNDIiwgIkNDRkZGRiIsICI5OUNDRkYiLCAiQ0M5OUZGIiwgIkZGRkZGRiIKICAgIF0sCgogICAgICAgIG9uUmVuZGVyIDogZnVuY3Rpb24oY29udGFpbmVyLCBwb3NpdGlvbil7CiAgICAgICAgdmFyIHQgPSBuZXcgRXh0Lk1hc3RlclRlbXBsYXRlKAogICAgICAgICAgICAnPHRwbD48YSBocmVmPSIjIiBjbGFzcz0iY29sb3ItezB9IiBoaWRlZm9jdXM9Im9uIj48ZW0+PHNwYW4gc3R5bGU9ImJhY2tncm91bmQ6I3swfSIgdW5zZWxlY3RhYmxlPSJvbiI+JiMxNjA7PC9zcGFuPjwvZW0+PC9hPjwvdHBsPicKICAgICAgICApOwogICAgICAgIHZhciBjID0gdGhpcy5jb2xvcnM7CiAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gYy5sZW5ndGg7IGkgPCBsZW47IGkrKyl7CiAgICAgICAgICAgIHQuYWRkKFtjW2ldXSk7CiAgICAgICAgfQogICAgICAgIHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICAgIGVsLmNsYXNzTmFtZSA9IHRoaXMuaXRlbUNsczsKICAgICAgICB0Lm92ZXJ3cml0ZShlbCk7CiAgICAgICAgY29udGFpbmVyLmRvbS5pbnNlcnRCZWZvcmUoZWwsIHBvc2l0aW9uKTsKICAgICAgICB0aGlzLmVsID0gRXh0LmdldChlbCk7CiAgICAgICAgdGhpcy5lbC5vbih0aGlzLmNsaWNrRXZlbnQsIHRoaXMuaGFuZGxlQ2xpY2ssICB0aGlzLCB7ZGVsZWdhdGU6ICJhIn0pOwogICAgICAgIGlmKHRoaXMuY2xpY2tFdmVudCAhPSAnY2xpY2snKXsKICAgICAgICAgICAgdGhpcy5lbC5vbignY2xpY2snLCBFeHQuZW1wdHlGbiwgIHRoaXMsIHtkZWxlZ2F0ZTogImEiLCBwcmV2ZW50RGVmYXVsdDp0cnVlfSk7CiAgICAgICAgfQogICAgfSwKCiAgICAgICAgYWZ0ZXJSZW5kZXIgOiBmdW5jdGlvbigpewogICAgICAgIEV4dC5Db2xvclBhbGV0dGUuc3VwZXJjbGFzcy5hZnRlclJlbmRlci5jYWxsKHRoaXMpOwogICAgICAgIGlmKHRoaXMudmFsdWUpewogICAgICAgICAgICB2YXIgcyA9IHRoaXMudmFsdWU7CiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBudWxsOwogICAgICAgICAgICB0aGlzLnNlbGVjdChzKTsKICAgICAgICB9CiAgICB9LAoKICAgICAgICBoYW5kbGVDbGljayA6IGZ1bmN0aW9uKGUsIHQpewogICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICBpZighdGhpcy5kaXNhYmxlZCl7CiAgICAgICAgICAgIHZhciBjID0gdC5jbGFzc05hbWUubWF0Y2goLyg/Ol58XHMpY29sb3ItKC57Nn0pKD86XHN8JCkvKVsxXTsKICAgICAgICAgICAgdGhpcy5zZWxlY3QoYy50b1VwcGVyQ2FzZSgpKTsKICAgICAgICB9CiAgICB9LAoKICAgIAogICAgc2VsZWN0IDogZnVuY3Rpb24oY29sb3IpewogICAgICAgIGNvbG9yID0gY29sb3IucmVwbGFjZSgiIyIsICIiKTsKICAgICAgICBpZihjb2xvciAhPSB0aGlzLnZhbHVlIHx8IHRoaXMuYWxsb3dSZXNlbGVjdCl7CiAgICAgICAgICAgIHZhciBlbCA9IHRoaXMuZWw7CiAgICAgICAgICAgIGlmKHRoaXMudmFsdWUpewogICAgICAgICAgICAgICAgZWwuY2hpbGQoImEuY29sb3ItIit0aGlzLnZhbHVlKS5yZW1vdmVDbGFzcygieC1jb2xvci1wYWxldHRlLXNlbCIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsLmNoaWxkKCJhLmNvbG9yLSIrY29sb3IpLmFkZENsYXNzKCJ4LWNvbG9yLXBhbGV0dGUtc2VsIik7CiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBjb2xvcjsKICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoInNlbGVjdCIsIHRoaXMsIGNvbG9yKTsKICAgICAgICB9CiAgICB9Cn0pOwoNCkV4dC5EYXRlUGlja2VyID0gZnVuY3Rpb24oY29uZmlnKXsNCiAgICBFeHQuRGF0ZVBpY2tlci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgY29uZmlnKTsNCg0KICAgIHRoaXMudmFsdWUgPSBjb25maWcgJiYgY29uZmlnLnZhbHVlID8NCiAgICAgICAgICAgICAgICAgY29uZmlnLnZhbHVlLmNsZWFyVGltZSgpIDogbmV3IERhdGUoKS5jbGVhclRpbWUoKTsNCg0KICAgIHRoaXMuYWRkRXZlbnRzKHsNCiAgICAgICAgDQogICAgICAgIHNlbGVjdDogdHJ1ZQ0KICAgIH0pOw0KDQogICAgaWYodGhpcy5oYW5kbGVyKXsNCiAgICAgICAgdGhpcy5vbigic2VsZWN0IiwgdGhpcy5oYW5kbGVyLCAgdGhpcy5zY29wZSB8fCB0aGlzKTsNCiAgICB9DQogICAgCiAgICBpZighdGhpcy5kaXNhYmxlZERhdGVzUkUgJiYgdGhpcy5kaXNhYmxlZERhdGVzKXsNCiAgICAgICAgdmFyIGRkID0gdGhpcy5kaXNhYmxlZERhdGVzOw0KICAgICAgICB2YXIgcmUgPSAiKD86IjsNCiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGRkLmxlbmd0aDsgaSsrKXsNCiAgICAgICAgICAgIHJlICs9IGRkW2ldOw0KICAgICAgICAgICAgaWYoaSAhPSBkZC5sZW5ndGgtMSkgcmUgKz0gInwiOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuZGlzYWJsZWREYXRlc1JFID0gbmV3IFJlZ0V4cChyZSArICIpIik7DQogICAgfQ0KfTsNCg0KRXh0LmV4dGVuZChFeHQuRGF0ZVBpY2tlciwgRXh0LkNvbXBvbmVudCwgew0KICAgIA0KICAgIHRvZGF5VGV4dCA6ICJUb2RheSIsDQogICAgDQogICAgb2tUZXh0IDogIiYjMTYwO09LJiMxNjA7IiwgCiAgICANCiAgICBjYW5jZWxUZXh0IDogIkNhbmNlbCIsDQogICAgDQogICAgdG9kYXlUaXAgOiAiezB9IChTcGFjZWJhcikiLA0KICAgIA0KICAgIG1pbkRhdGUgOiBudWxsLA0KICAgIA0KICAgIG1heERhdGUgOiBudWxsLA0KICAgIA0KICAgIG1pblRleHQgOiAiVGhpcyBkYXRlIGlzIGJlZm9yZSB0aGUgbWluaW11bSBkYXRlIiwNCiAgICANCiAgICBtYXhUZXh0IDogIlRoaXMgZGF0ZSBpcyBhZnRlciB0aGUgbWF4aW11bSBkYXRlIiwNCiAgICANCiAgICBmb3JtYXQgOiAibS9kL3kiLA0KICAgIA0KICAgIGRpc2FibGVkRGF5cyA6IG51bGwsDQogICAgDQogICAgZGlzYWJsZWREYXlzVGV4dCA6ICIiLA0KICAgIA0KICAgIGRpc2FibGVkRGF0ZXNSRSA6IG51bGwsDQogICAgDQogICAgZGlzYWJsZWREYXRlc1RleHQgOiAiIiwNCiAgICANCiAgICBjb25zdHJhaW5Ub1ZpZXdwb3J0IDogdHJ1ZSwNCiAgICANCiAgICBtb250aE5hbWVzIDogRGF0ZS5tb250aE5hbWVzLA0KICAgIA0KICAgIGRheU5hbWVzIDogRGF0ZS5kYXlOYW1lcywNCiAgICANCiAgICBuZXh0VGV4dDogJ05leHQgTW9udGggKENvbnRyb2wrUmlnaHQpJywNCiAgICANCiAgICBwcmV2VGV4dDogJ1ByZXZpb3VzIE1vbnRoIChDb250cm9sK0xlZnQpJywNCiAgICANCiAgICBtb250aFllYXJUZXh0OiAnQ2hvb3NlIGEgbW9udGggKENvbnRyb2wrVXAvRG93biB0byBtb3ZlIHllYXJzKScsDQogICAgDQogICAgc3RhcnREYXkgOiAwLA0KDQogICAgDQogICAgc2V0VmFsdWUgOiBmdW5jdGlvbih2YWx1ZSl7DQogICAgICAgIHZhciBvbGQgPSB0aGlzLnZhbHVlOw0KICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWUuY2xlYXJUaW1lKHRydWUpOw0KICAgICAgICBpZih0aGlzLmVsKXsNCiAgICAgICAgICAgIHRoaXMudXBkYXRlKHRoaXMudmFsdWUpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIGdldFZhbHVlIDogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7DQogICAgfSwNCg0KICAgIAogICAgZm9jdXMgOiBmdW5jdGlvbigpew0KICAgICAgICBpZih0aGlzLmVsKXsNCiAgICAgICAgICAgIHRoaXMudXBkYXRlKHRoaXMuYWN0aXZlRGF0ZSk7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgCiAgICBvblJlbmRlciA6IGZ1bmN0aW9uKGNvbnRhaW5lciwgcG9zaXRpb24pew0KICAgICAgICB2YXIgbSA9IFsNCiAgICAgICAgICAgICAnPHRhYmxlIGNlbGxzcGFjaW5nPSIwIj4nLA0KICAgICAgICAgICAgICAgICc8dHI+PHRkIGNsYXNzPSJ4LWRhdGUtbGVmdCI+PGEgaHJlZj0iIyIgdGl0bGU9IicsIHRoaXMucHJldlRleHQgLCciPiYjMTYwOzwvYT48L3RkPjx0ZCBjbGFzcz0ieC1kYXRlLW1pZGRsZSIgYWxpZ249ImNlbnRlciI+PC90ZD48dGQgY2xhc3M9IngtZGF0ZS1yaWdodCI+PGEgaHJlZj0iIyIgdGl0bGU9IicsIHRoaXMubmV4dFRleHQgLCciPiYjMTYwOzwvYT48L3RkPjwvdHI+JywNCiAgICAgICAgICAgICAgICAnPHRyPjx0ZCBjb2xzcGFuPSIzIj48dGFibGUgY2xhc3M9IngtZGF0ZS1pbm5lciIgY2VsbHNwYWNpbmc9IjAiPjx0aGVhZD48dHI+J107DQogICAgICAgIHZhciBkbiA9IHRoaXMuZGF5TmFtZXM7DQogICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCA3OyBpKyspew0KICAgICAgICAgICAgdmFyIGQgPSB0aGlzLnN0YXJ0RGF5K2k7DQogICAgICAgICAgICBpZihkID4gNil7DQogICAgICAgICAgICAgICAgZCA9IGQtNzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIG0ucHVzaCgiPHRoPjxzcGFuPiIsIGRuW2RdLnN1YnN0cigwLDEpLCAiPC9zcGFuPjwvdGg+Iik7DQogICAgICAgIH0NCiAgICAgICAgbVttLmxlbmd0aF0gPSAiPC90cj48L3RoZWFkPjx0Ym9keT48dHI+IjsNCiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IDQyOyBpKyspIHsNCiAgICAgICAgICAgIGlmKGkgJSA3ID09IDAgJiYgaSAhPSAwKXsNCiAgICAgICAgICAgICAgICBtW20ubGVuZ3RoXSA9ICI8L3RyPjx0cj4iOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgbVttLmxlbmd0aF0gPSAnPHRkPjxhIGhyZWY9IiMiIGhpZGVmb2N1cz0ib24iIGNsYXNzPSJ4LWRhdGUtZGF0ZSIgdGFiSW5kZXg9IjEiPjxlbT48c3Bhbj48L3NwYW4+PC9lbT48L2E+PC90ZD4nOw0KICAgICAgICB9DQogICAgICAgIG1bbS5sZW5ndGhdID0gJzwvdHI+PC90Ym9keT48L3RhYmxlPjwvdGQ+PC90cj48dHI+PHRkIGNvbHNwYW49IjMiIGNsYXNzPSJ4LWRhdGUtYm90dG9tIiBhbGlnbj0iY2VudGVyIj48L3RkPjwvdHI+PC90YWJsZT48ZGl2IGNsYXNzPSJ4LWRhdGUtbXAiPjwvZGl2Pic7DQoNCiAgICAgICAgdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQogICAgICAgIGVsLmNsYXNzTmFtZSA9ICJ4LWRhdGUtcGlja2VyIjsNCiAgICAgICAgZWwuaW5uZXJIVE1MID0gbS5qb2luKCIiKTsNCg0KICAgICAgICBjb250YWluZXIuZG9tLmluc2VydEJlZm9yZShlbCwgcG9zaXRpb24pOw0KDQogICAgICAgIHRoaXMuZWwgPSBFeHQuZ2V0KGVsKTsNCiAgICAgICAgdGhpcy5ldmVudEVsID0gRXh0LmdldChlbC5maXJzdENoaWxkKTsNCg0KICAgICAgICBuZXcgRXh0LnV0aWwuQ2xpY2tSZXBlYXRlcih0aGlzLmVsLmNoaWxkKCJ0ZC54LWRhdGUtbGVmdCBhIiksIHsNCiAgICAgICAgICAgIGhhbmRsZXI6IHRoaXMuc2hvd1ByZXZNb250aCwNCiAgICAgICAgICAgIHNjb3BlOiB0aGlzLA0KICAgICAgICAgICAgcHJldmVudERlZmF1bHQ6dHJ1ZSwNCiAgICAgICAgICAgIHN0b3BEZWZhdWx0OnRydWUNCiAgICAgICAgfSk7DQoNCiAgICAgICAgbmV3IEV4dC51dGlsLkNsaWNrUmVwZWF0ZXIodGhpcy5lbC5jaGlsZCgidGQueC1kYXRlLXJpZ2h0IGEiKSwgew0KICAgICAgICAgICAgaGFuZGxlcjogdGhpcy5zaG93TmV4dE1vbnRoLA0KICAgICAgICAgICAgc2NvcGU6IHRoaXMsDQogICAgICAgICAgICBwcmV2ZW50RGVmYXVsdDp0cnVlLA0KICAgICAgICAgICAgc3RvcERlZmF1bHQ6dHJ1ZQ0KICAgICAgICB9KTsNCg0KICAgICAgICB0aGlzLmV2ZW50RWwub24oIm1vdXNld2hlZWwiLCB0aGlzLmhhbmRsZU1vdXNlV2hlZWwsICB0aGlzKTsNCg0KICAgICAgICB0aGlzLm1vbnRoUGlja2VyID0gdGhpcy5lbC5kb3duKCdkaXYueC1kYXRlLW1wJyk7DQogICAgICAgIHRoaXMubW9udGhQaWNrZXIuZW5hYmxlRGlzcGxheU1vZGUoJ2Jsb2NrJyk7DQogICAgICAgIA0KICAgICAgICB2YXIga24gPSBuZXcgRXh0LktleU5hdih0aGlzLmV2ZW50RWwsIHsNCiAgICAgICAgICAgICJsZWZ0IiA6IGZ1bmN0aW9uKGUpew0KICAgICAgICAgICAgICAgIGUuY3RybEtleSA/DQogICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd1ByZXZNb250aCgpIDoNCiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGUodGhpcy5hY3RpdmVEYXRlLmFkZCgiZCIsIC0xKSk7DQogICAgICAgICAgICB9LA0KDQogICAgICAgICAgICAicmlnaHQiIDogZnVuY3Rpb24oZSl7DQogICAgICAgICAgICAgICAgZS5jdHJsS2V5ID8NCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93TmV4dE1vbnRoKCkgOg0KICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZSh0aGlzLmFjdGl2ZURhdGUuYWRkKCJkIiwgMSkpOw0KICAgICAgICAgICAgfSwNCg0KICAgICAgICAgICAgInVwIiA6IGZ1bmN0aW9uKGUpew0KICAgICAgICAgICAgICAgIGUuY3RybEtleSA/DQogICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd05leHRZZWFyKCkgOg0KICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZSh0aGlzLmFjdGl2ZURhdGUuYWRkKCJkIiwgLTcpKTsNCiAgICAgICAgICAgIH0sDQoNCiAgICAgICAgICAgICJkb3duIiA6IGZ1bmN0aW9uKGUpew0KICAgICAgICAgICAgICAgIGUuY3RybEtleSA/DQogICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd1ByZXZZZWFyKCkgOg0KICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZSh0aGlzLmFjdGl2ZURhdGUuYWRkKCJkIiwgNykpOw0KICAgICAgICAgICAgfSwNCg0KICAgICAgICAgICAgInBhZ2VVcCIgOiBmdW5jdGlvbihlKXsNCiAgICAgICAgICAgICAgICB0aGlzLnNob3dOZXh0TW9udGgoKTsNCiAgICAgICAgICAgIH0sDQoNCiAgICAgICAgICAgICJwYWdlRG93biIgOiBmdW5jdGlvbihlKXsNCiAgICAgICAgICAgICAgICB0aGlzLnNob3dQcmV2TW9udGgoKTsNCiAgICAgICAgICAgIH0sDQoNCiAgICAgICAgICAgICJlbnRlciIgOiBmdW5jdGlvbihlKXsNCiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOw0KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgfSwNCg0KICAgICAgICAgICAgc2NvcGUgOiB0aGlzDQogICAgICAgIH0pOw0KDQogICAgICAgIHRoaXMuZXZlbnRFbC5vbigiY2xpY2siLCB0aGlzLmhhbmRsZURhdGVDbGljaywgIHRoaXMsIHtkZWxlZ2F0ZTogImEueC1kYXRlLWRhdGUifSk7DQoNCiAgICAgICAgdGhpcy5ldmVudEVsLmFkZEtleUxpc3RlbmVyKEV4dC5FdmVudE9iamVjdC5TUEFDRSwgdGhpcy5zZWxlY3RUb2RheSwgIHRoaXMpOw0KDQogICAgICAgIHRoaXMuZWwudW5zZWxlY3RhYmxlKCk7DQogICAgICAgIA0KICAgICAgICB0aGlzLmNlbGxzID0gdGhpcy5lbC5zZWxlY3QoInRhYmxlLngtZGF0ZS1pbm5lciB0Ym9keSB0ZCIpOw0KICAgICAgICB0aGlzLnRleHROb2RlcyA9IHRoaXMuZWwucXVlcnkoInRhYmxlLngtZGF0ZS1pbm5lciB0Ym9keSBzcGFuIik7DQoNCiAgICAgICAgdGhpcy5tYnRuID0gbmV3IEV4dC5CdXR0b24odGhpcy5lbC5jaGlsZCgidGQueC1kYXRlLW1pZGRsZSIsIHRydWUpLCB7DQogICAgICAgICAgICB0ZXh0OiAiJiMxNjA7IiwNCiAgICAgICAgICAgIHRvb2x0aXA6IHRoaXMubW9udGhZZWFyVGV4dA0KICAgICAgICB9KTsNCg0KICAgICAgICB0aGlzLm1idG4ub24oJ2NsaWNrJywgdGhpcy5zaG93TW9udGhQaWNrZXIsIHRoaXMpOw0KICAgICAgICB0aGlzLm1idG4uZWwuY2hpbGQodGhpcy5tYnRuLm1lbnVDbGFzc1RhcmdldCkuYWRkQ2xhc3MoIngtYnRuLXdpdGgtbWVudSIpOw0KDQoNCiAgICAgICAgdmFyIHRvZGF5ID0gKG5ldyBEYXRlKCkpLmRhdGVGb3JtYXQodGhpcy5mb3JtYXQpOw0KICAgICAgICB2YXIgdG9kYXlCdG4gPSBuZXcgRXh0LkJ1dHRvbih0aGlzLmVsLmNoaWxkKCJ0ZC54LWRhdGUtYm90dG9tIiwgdHJ1ZSksIHsNCiAgICAgICAgICAgIHRleHQ6IFN0cmluZy5mb3JtYXQodGhpcy50b2RheVRleHQsIHRvZGF5KSwNCiAgICAgICAgICAgIHRvb2x0aXA6IFN0cmluZy5mb3JtYXQodGhpcy50b2RheVRpcCwgdG9kYXkpLA0KICAgICAgICAgICAgaGFuZGxlcjogdGhpcy5zZWxlY3RUb2RheSwNCiAgICAgICAgICAgIHNjb3BlOiB0aGlzDQogICAgICAgIH0pOw0KICAgICAgICANCiAgICAgICAgaWYoRXh0LmlzSUUpew0KICAgICAgICAgICAgdGhpcy5lbC5yZXBhaW50KCk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy51cGRhdGUodGhpcy52YWx1ZSk7DQogICAgfSwNCg0KICAgIGNyZWF0ZU1vbnRoUGlja2VyIDogZnVuY3Rpb24oKXsNCiAgICAgICAgaWYoIXRoaXMubW9udGhQaWNrZXIuZG9tLmZpcnN0Q2hpbGQpew0KICAgICAgICAgICAgdmFyIGJ1ZiA9IFsnPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiPiddOw0KICAgICAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IDY7IGkrKyl7DQogICAgICAgICAgICAgICAgYnVmLnB1c2goDQogICAgICAgICAgICAgICAgICAgICc8dHI+PHRkIGNsYXNzPSJ4LWRhdGUtbXAtbW9udGgiPjxhIGhyZWY9IiMiPicsIHRoaXMubW9udGhOYW1lc1tpXS5zdWJzdHIoMCwgMyksICc8L2E+PC90ZD4nLA0KICAgICAgICAgICAgICAgICAgICAnPHRkIGNsYXNzPSJ4LWRhdGUtbXAtbW9udGggeC1kYXRlLW1wLXNlcCI+PGEgaHJlZj0iIyI+JywgdGhpcy5tb250aE5hbWVzW2krNl0uc3Vic3RyKDAsIDMpLCAnPC9hPjwvdGQ+JywNCiAgICAgICAgICAgICAgICAgICAgaSA9PSAwID8NCiAgICAgICAgICAgICAgICAgICAgJzx0ZCBjbGFzcz0ieC1kYXRlLW1wLXlidG4iIGFsaWduPSJjZW50ZXIiPjxhIGNsYXNzPSJ4LWRhdGUtbXAtcHJldiI+PC9hPjwvdGQ+PHRkIGNsYXNzPSJ4LWRhdGUtbXAteWJ0biIgYWxpZ249ImNlbnRlciI+PGEgY2xhc3M9IngtZGF0ZS1tcC1uZXh0Ij48L2E+PC90ZD48L3RyPicgOg0KICAgICAgICAgICAgICAgICAgICAnPHRkIGNsYXNzPSJ4LWRhdGUtbXAteWVhciI+PGEgaHJlZj0iIyI+PC9hPjwvdGQ+PHRkIGNsYXNzPSJ4LWRhdGUtbXAteWVhciI+PGEgaHJlZj0iIyI+PC9hPjwvdGQ+PC90cj4nDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGJ1Zi5wdXNoKA0KICAgICAgICAgICAgICAgICc8dHIgY2xhc3M9IngtZGF0ZS1tcC1idG5zIj48dGQgY29sc3Bhbj0iNCI+PGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJ4LWRhdGUtbXAtb2siPicsDQogICAgICAgICAgICAgICAgICAgIHRoaXMub2tUZXh0LA0KICAgICAgICAgICAgICAgICAgICAnPC9idXR0b24+PGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJ4LWRhdGUtbXAtY2FuY2VsIj4nLA0KICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbFRleHQsDQogICAgICAgICAgICAgICAgICAgICc8L2J1dHRvbj48L3RkPjwvdHI+JywNCiAgICAgICAgICAgICAgICAnPC90YWJsZT4nDQogICAgICAgICAgICApOw0KICAgICAgICAgICAgdGhpcy5tb250aFBpY2tlci51cGRhdGUoYnVmLmpvaW4oJycpKTsNCiAgICAgICAgICAgIHRoaXMubW9udGhQaWNrZXIub24oJ2NsaWNrJywgdGhpcy5vbk1vbnRoQ2xpY2ssIHRoaXMpOw0KICAgICAgICAgICAgdGhpcy5tb250aFBpY2tlci5vbignZGJsY2xpY2snLCB0aGlzLm9uTW9udGhEYmxDbGljaywgdGhpcyk7DQoNCiAgICAgICAgICAgIHRoaXMubXBNb250aHMgPSB0aGlzLm1vbnRoUGlja2VyLnNlbGVjdCgndGQueC1kYXRlLW1wLW1vbnRoJyk7DQogICAgICAgICAgICB0aGlzLm1wWWVhcnMgPSB0aGlzLm1vbnRoUGlja2VyLnNlbGVjdCgndGQueC1kYXRlLW1wLXllYXInKTsNCg0KICAgICAgICAgICAgdGhpcy5tcE1vbnRocy5lYWNoKGZ1bmN0aW9uKG0sIGEsIGkpew0KICAgICAgICAgICAgICAgIGkgKz0gMTsNCiAgICAgICAgICAgICAgICBpZigoaSUyKSA9PSAwKXsNCiAgICAgICAgICAgICAgICAgICAgbS5kb20ueG1vbnRoID0gNSArIE1hdGgucm91bmQoaSAqIC41KTsNCiAgICAgICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICAgICAgbS5kb20ueG1vbnRoID0gTWF0aC5yb3VuZCgoaS0xKSAqIC41KTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICBzaG93TW9udGhQaWNrZXIgOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLmNyZWF0ZU1vbnRoUGlja2VyKCk7DQogICAgICAgIHZhciBzaXplID0gdGhpcy5lbC5nZXRTaXplKCk7DQogICAgICAgIHRoaXMubW9udGhQaWNrZXIuc2V0U2l6ZShzaXplKTsNCiAgICAgICAgdGhpcy5tb250aFBpY2tlci5jaGlsZCgndGFibGUnKS5zZXRTaXplKHNpemUpOw0KDQogICAgICAgIHRoaXMubXBTZWxNb250aCA9ICh0aGlzLmFjdGl2ZURhdGUgfHwgdGhpcy52YWx1ZSkuZ2V0TW9udGgoKTsNCiAgICAgICAgdGhpcy51cGRhdGVNUE1vbnRoKHRoaXMubXBTZWxNb250aCk7DQogICAgICAgIHRoaXMubXBTZWxZZWFyID0gKHRoaXMuYWN0aXZlRGF0ZSB8fCB0aGlzLnZhbHVlKS5nZXRGdWxsWWVhcigpOw0KICAgICAgICB0aGlzLnVwZGF0ZU1QWWVhcih0aGlzLm1wU2VsWWVhcik7DQoNCiAgICAgICAgdGhpcy5tb250aFBpY2tlci5zbGlkZUluKCd0Jywge2R1cmF0aW9uOi4yfSk7DQogICAgfSwNCg0KICAgIHVwZGF0ZU1QWWVhciA6IGZ1bmN0aW9uKHkpew0KICAgICAgICB0aGlzLm1weWVhciA9IHk7DQogICAgICAgIHZhciB5cyA9IHRoaXMubXBZZWFycy5lbGVtZW50czsNCiAgICAgICAgZm9yKHZhciBpID0gMTsgaSA8PSAxMDsgaSsrKXsNCiAgICAgICAgICAgIHZhciB0ZCA9IHlzW2ktMV0sIHkyOw0KICAgICAgICAgICAgaWYoKGklMikgPT0gMCl7DQogICAgICAgICAgICAgICAgeTIgPSB5ICsgTWF0aC5yb3VuZChpICogLjUpOw0KICAgICAgICAgICAgICAgIHRkLmZpcnN0Q2hpbGQuaW5uZXJIVE1MID0geTI7DQogICAgICAgICAgICAgICAgdGQueHllYXIgPSB5MjsNCiAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgIHkyID0geSAtICg1LU1hdGgucm91bmQoaSAqIC41KSk7DQogICAgICAgICAgICAgICAgdGQuZmlyc3RDaGlsZC5pbm5lckhUTUwgPSB5MjsNCiAgICAgICAgICAgICAgICB0ZC54eWVhciA9IHkyOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5tcFllYXJzLml0ZW0oaS0xKVt5MiA9PSB0aGlzLm1wU2VsWWVhciA/ICdhZGRDbGFzcycgOiAncmVtb3ZlQ2xhc3MnXSgneC1kYXRlLW1wLXNlbCcpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIHVwZGF0ZU1QTW9udGggOiBmdW5jdGlvbihzbSl7DQogICAgICAgIHRoaXMubXBNb250aHMuZWFjaChmdW5jdGlvbihtLCBhLCBpKXsNCiAgICAgICAgICAgIG1bbS5kb20ueG1vbnRoID09IHNtID8gJ2FkZENsYXNzJyA6ICdyZW1vdmVDbGFzcyddKCd4LWRhdGUtbXAtc2VsJyk7DQogICAgICAgIH0pOw0KICAgIH0sDQoNCiAgICBzZWxlY3RNUE1vbnRoOiBmdW5jdGlvbihtKXsNCiAgICAgICAgDQogICAgfSwNCg0KICAgIG9uTW9udGhDbGljayA6IGZ1bmN0aW9uKGUsIHQpew0KICAgICAgICBlLnN0b3BFdmVudCgpOw0KICAgICAgICB2YXIgZWwgPSBuZXcgRXh0LkVsZW1lbnQodCksIHBuOw0KICAgICAgICBpZihlbC5pcygnYnV0dG9uLngtZGF0ZS1tcC1jYW5jZWwnKSl7DQogICAgICAgICAgICB0aGlzLmhpZGVNb250aFBpY2tlcigpOw0KICAgICAgICB9DQogICAgICAgIGVsc2UgaWYoZWwuaXMoJ2J1dHRvbi54LWRhdGUtbXAtb2snKSl7DQogICAgICAgICAgICB0aGlzLnVwZGF0ZShuZXcgRGF0ZSh0aGlzLm1wU2VsWWVhciwgdGhpcy5tcFNlbE1vbnRoLCAodGhpcy5hY3RpdmVEYXRlIHx8IHRoaXMudmFsdWUpLmdldERhdGUoKSkpOw0KICAgICAgICAgICAgdGhpcy5oaWRlTW9udGhQaWNrZXIoKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmKHBuID0gZWwudXAoJ3RkLngtZGF0ZS1tcC1tb250aCcsIDIpKXsNCiAgICAgICAgICAgIHRoaXMubXBNb250aHMucmVtb3ZlQ2xhc3MoJ3gtZGF0ZS1tcC1zZWwnKTsNCiAgICAgICAgICAgIHBuLmFkZENsYXNzKCd4LWRhdGUtbXAtc2VsJyk7DQogICAgICAgICAgICB0aGlzLm1wU2VsTW9udGggPSBwbi5kb20ueG1vbnRoOw0KICAgICAgICB9DQogICAgICAgIGVsc2UgaWYocG4gPSBlbC51cCgndGQueC1kYXRlLW1wLXllYXInLCAyKSl7DQogICAgICAgICAgICB0aGlzLm1wWWVhcnMucmVtb3ZlQ2xhc3MoJ3gtZGF0ZS1tcC1zZWwnKTsNCiAgICAgICAgICAgIHBuLmFkZENsYXNzKCd4LWRhdGUtbXAtc2VsJyk7DQogICAgICAgICAgICB0aGlzLm1wU2VsWWVhciA9IHBuLmRvbS54eWVhcjsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmKGVsLmlzKCdhLngtZGF0ZS1tcC1wcmV2Jykpew0KICAgICAgICAgICAgdGhpcy51cGRhdGVNUFllYXIodGhpcy5tcHllYXItMTApOw0KICAgICAgICB9DQogICAgICAgIGVsc2UgaWYoZWwuaXMoJ2EueC1kYXRlLW1wLW5leHQnKSl7DQogICAgICAgICAgICB0aGlzLnVwZGF0ZU1QWWVhcih0aGlzLm1weWVhcisxMCk7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgb25Nb250aERibENsaWNrIDogZnVuY3Rpb24oZSwgdCl7DQogICAgICAgIGUuc3RvcEV2ZW50KCk7DQogICAgICAgIHZhciBlbCA9IG5ldyBFeHQuRWxlbWVudCh0KSwgcG47DQogICAgICAgIGlmKHBuID0gZWwudXAoJ3RkLngtZGF0ZS1tcC1tb250aCcsIDIpKXsNCiAgICAgICAgICAgIHRoaXMudXBkYXRlKG5ldyBEYXRlKHRoaXMubXBTZWxZZWFyLCBwbi5kb20ueG1vbnRoLCAodGhpcy5hY3RpdmVEYXRlIHx8IHRoaXMudmFsdWUpLmdldERhdGUoKSkpOw0KICAgICAgICAgICAgdGhpcy5oaWRlTW9udGhQaWNrZXIoKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmKHBuID0gZWwudXAoJ3RkLngtZGF0ZS1tcC15ZWFyJywgMikpew0KICAgICAgICAgICAgdGhpcy51cGRhdGUobmV3IERhdGUocG4uZG9tLnh5ZWFyLCB0aGlzLm1wU2VsTW9udGgsICh0aGlzLmFjdGl2ZURhdGUgfHwgdGhpcy52YWx1ZSkuZ2V0RGF0ZSgpKSk7DQogICAgICAgICAgICB0aGlzLmhpZGVNb250aFBpY2tlcigpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIGhpZGVNb250aFBpY2tlciA6IGZ1bmN0aW9uKGRpc2FibGVBbmltKXsNCiAgICAgICAgaWYodGhpcy5tb250aFBpY2tlcil7DQogICAgICAgICAgICBpZihkaXNhYmxlQW5pbSA9PT0gdHJ1ZSl7DQogICAgICAgICAgICAgICAgdGhpcy5tb250aFBpY2tlci5oaWRlKCk7DQogICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICB0aGlzLm1vbnRoUGlja2VyLnNsaWRlT3V0KCd0Jywge2R1cmF0aW9uOi4yfSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgCiAgICBzaG93UHJldk1vbnRoIDogZnVuY3Rpb24oZSl7DQogICAgICAgIHRoaXMudXBkYXRlKHRoaXMuYWN0aXZlRGF0ZS5hZGQoIm1vIiwgLTEpKTsNCiAgICB9LA0KDQogICAgCiAgICBzaG93TmV4dE1vbnRoIDogZnVuY3Rpb24oZSl7DQogICAgICAgIHRoaXMudXBkYXRlKHRoaXMuYWN0aXZlRGF0ZS5hZGQoIm1vIiwgMSkpOw0KICAgIH0sDQoNCiAgICAKICAgIHNob3dQcmV2WWVhciA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHRoaXMudXBkYXRlKHRoaXMuYWN0aXZlRGF0ZS5hZGQoInkiLCAtMSkpOw0KICAgIH0sDQoNCiAgICAKICAgIHNob3dOZXh0WWVhciA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHRoaXMudXBkYXRlKHRoaXMuYWN0aXZlRGF0ZS5hZGQoInkiLCAxKSk7DQogICAgfSwNCg0KICAgIAogICAgaGFuZGxlTW91c2VXaGVlbCA6IGZ1bmN0aW9uKGUpew0KICAgICAgICB2YXIgZGVsdGEgPSBlLmdldFdoZWVsRGVsdGEoKTsNCiAgICAgICAgaWYoZGVsdGEgPiAwKXsNCiAgICAgICAgICAgIHRoaXMuc2hvd1ByZXZNb250aCgpOw0KICAgICAgICAgICAgZS5zdG9wRXZlbnQoKTsNCiAgICAgICAgfSBlbHNlIGlmKGRlbHRhIDwgMCl7DQogICAgICAgICAgICB0aGlzLnNob3dOZXh0TW9udGgoKTsNCiAgICAgICAgICAgIGUuc3RvcEV2ZW50KCk7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgCiAgICBoYW5kbGVEYXRlQ2xpY2sgOiBmdW5jdGlvbihlLCB0KXsNCiAgICAgICAgZS5zdG9wRXZlbnQoKTsNCiAgICAgICAgaWYodC5kYXRlVmFsdWUgJiYgIUV4dC5mbHkodC5wYXJlbnROb2RlKS5oYXNDbGFzcygieC1kYXRlLWRpc2FibGVkIikpew0KICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShuZXcgRGF0ZSh0LmRhdGVWYWx1ZSkpOw0KICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoInNlbGVjdCIsIHRoaXMsIHRoaXMudmFsdWUpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIAogICAgc2VsZWN0VG9kYXkgOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLnNldFZhbHVlKG5ldyBEYXRlKCkuY2xlYXJUaW1lKCkpOw0KICAgICAgICB0aGlzLmZpcmVFdmVudCgic2VsZWN0IiwgdGhpcywgdGhpcy52YWx1ZSk7DQogICAgfSwNCg0KICAgIAogICAgdXBkYXRlIDogZnVuY3Rpb24oZGF0ZSl7DQogICAgICAgIHZhciB2ZCA9IHRoaXMuYWN0aXZlRGF0ZTsNCiAgICAgICAgdGhpcy5hY3RpdmVEYXRlID0gZGF0ZTsNCiAgICAgICAgaWYodmQgJiYgdGhpcy5lbCl7DQogICAgICAgICAgICB2YXIgdCA9IGRhdGUuZ2V0VGltZSgpOw0KICAgICAgICAgICAgaWYodmQuZ2V0TW9udGgoKSA9PSBkYXRlLmdldE1vbnRoKCkgJiYgdmQuZ2V0RnVsbFllYXIoKSA9PSBkYXRlLmdldEZ1bGxZZWFyKCkpew0KICAgICAgICAgICAgICAgIHRoaXMuY2VsbHMucmVtb3ZlQ2xhc3MoIngtZGF0ZS1zZWxlY3RlZCIpOw0KICAgICAgICAgICAgICAgIHRoaXMuY2VsbHMuZWFjaChmdW5jdGlvbihjKXsNCiAgICAgICAgICAgICAgICAgICBpZihjLmRvbS5maXJzdENoaWxkLmRhdGVWYWx1ZSA9PSB0KXsNCiAgICAgICAgICAgICAgICAgICAgICAgYy5hZGRDbGFzcygieC1kYXRlLXNlbGVjdGVkIik7DQogICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnl7Yy5kb20uZmlyc3RDaGlsZC5mb2N1cygpO31jYXRjaChlKXt9DQogICAgICAgICAgICAgICAgICAgICAgIH0sIDUwKTsNCiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgdmFyIGRheXMgPSBkYXRlLmdldERheXNJbk1vbnRoKCk7DQogICAgICAgIHZhciBmaXJzdE9mTW9udGggPSBkYXRlLmdldEZpcnN0RGF0ZU9mTW9udGgoKTsNCiAgICAgICAgdmFyIHN0YXJ0aW5nUG9zID0gZmlyc3RPZk1vbnRoLmdldERheSgpLXRoaXMuc3RhcnREYXk7DQoNCiAgICAgICAgaWYoc3RhcnRpbmdQb3MgPD0gdGhpcy5zdGFydERheSl7DQogICAgICAgICAgICBzdGFydGluZ1BvcyArPSA3Ow0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIHBtID0gZGF0ZS5hZGQoIm1vIiwgLTEpOw0KICAgICAgICB2YXIgcHJldlN0YXJ0ID0gcG0uZ2V0RGF5c0luTW9udGgoKS1zdGFydGluZ1BvczsNCg0KICAgICAgICB2YXIgY2VsbHMgPSB0aGlzLmNlbGxzLmVsZW1lbnRzOw0KICAgICAgICB2YXIgdGV4dEVscyA9IHRoaXMudGV4dE5vZGVzOw0KICAgICAgICBkYXlzICs9IHN0YXJ0aW5nUG9zOw0KDQogICAgICAgIAogICAgICAgIHZhciBkYXkgPSA4NjQwMDAwMDsNCiAgICAgICAgdmFyIGQgPSAobmV3IERhdGUocG0uZ2V0RnVsbFllYXIoKSwgcG0uZ2V0TW9udGgoKSwgcHJldlN0YXJ0KSkuY2xlYXJUaW1lKCk7DQogICAgICAgIHZhciB0b2RheSA9IG5ldyBEYXRlKCkuY2xlYXJUaW1lKCkuZ2V0VGltZSgpOw0KICAgICAgICB2YXIgc2VsID0gZGF0ZS5jbGVhclRpbWUoKS5nZXRUaW1lKCk7DQogICAgICAgIHZhciBtaW4gPSB0aGlzLm1pbkRhdGUgPyB0aGlzLm1pbkRhdGUuY2xlYXJUaW1lKCkgOiBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7DQogICAgICAgIHZhciBtYXggPSB0aGlzLm1heERhdGUgPyB0aGlzLm1heERhdGUuY2xlYXJUaW1lKCkgOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7DQogICAgICAgIHZhciBkZE1hdGNoID0gdGhpcy5kaXNhYmxlZERhdGVzUkU7DQogICAgICAgIHZhciBkZFRleHQgPSB0aGlzLmRpc2FibGVkRGF0ZXNUZXh0Ow0KICAgICAgICB2YXIgZGRheXMgPSB0aGlzLmRpc2FibGVkRGF5cyA/IHRoaXMuZGlzYWJsZWREYXlzLmpvaW4oIiIpIDogZmFsc2U7DQogICAgICAgIHZhciBkZGF5c1RleHQgPSB0aGlzLmRpc2FibGVkRGF5c1RleHQ7DQogICAgICAgIHZhciBmb3JtYXQgPSB0aGlzLmZvcm1hdDsNCg0KICAgICAgICB2YXIgc2V0Q2VsbENsYXNzID0gZnVuY3Rpb24oY2FsLCBjZWxsKXsNCiAgICAgICAgICAgIGNlbGwudGl0bGUgPSAiIjsNCiAgICAgICAgICAgIHZhciB0ID0gZC5nZXRUaW1lKCk7DQogICAgICAgICAgICBjZWxsLmZpcnN0Q2hpbGQuZGF0ZVZhbHVlID0gdDsNCiAgICAgICAgICAgIGlmKHQgPT0gdG9kYXkpew0KICAgICAgICAgICAgICAgIGNlbGwuY2xhc3NOYW1lICs9ICIgeC1kYXRlLXRvZGF5IjsNCiAgICAgICAgICAgICAgICBjZWxsLnRpdGxlID0gY2FsLnRvZGF5VGV4dDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKHQgPT0gc2VsKXsNCiAgICAgICAgICAgICAgICBjZWxsLmNsYXNzTmFtZSArPSAiIHgtZGF0ZS1zZWxlY3RlZCI7DQogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpew0KICAgICAgICAgICAgICAgICAgICB0cnl7Y2VsbC5maXJzdENoaWxkLmZvY3VzKCk7fWNhdGNoKGUpe30NCiAgICAgICAgICAgICAgICB9LCA1MCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAKICAgICAgICAgICAgaWYodCA8IG1pbikgew0KICAgICAgICAgICAgICAgIGNlbGwuY2xhc3NOYW1lID0gIiB4LWRhdGUtZGlzYWJsZWQiOw0KICAgICAgICAgICAgICAgIGNlbGwudGl0bGUgPSBjYWwubWluVGV4dDsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZih0ID4gbWF4KSB7DQogICAgICAgICAgICAgICAgY2VsbC5jbGFzc05hbWUgPSAiIHgtZGF0ZS1kaXNhYmxlZCI7DQogICAgICAgICAgICAgICAgY2VsbC50aXRsZSA9IGNhbC5tYXhUZXh0Ow0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKGRkYXlzKXsNCiAgICAgICAgICAgICAgICBpZihkZGF5cy5pbmRleE9mKGQuZ2V0RGF5KCkpICE9IC0xKXsNCiAgICAgICAgICAgICAgICAgICAgY2VsbC50aXRsZSA9IGRkYXlzVGV4dDsNCiAgICAgICAgICAgICAgICAgICAgY2VsbC5jbGFzc05hbWUgPSAiIHgtZGF0ZS1kaXNhYmxlZCI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYoZGRNYXRjaCAmJiBmb3JtYXQpew0KICAgICAgICAgICAgICAgIHZhciBmdmFsdWUgPSBkLmRhdGVGb3JtYXQoZm9ybWF0KTsNCiAgICAgICAgICAgICAgICBpZihkZE1hdGNoLnRlc3QoZnZhbHVlKSl7DQogICAgICAgICAgICAgICAgICAgIGNlbGwudGl0bGUgPSBkZFRleHQucmVwbGFjZSgiJTAiLCBmdmFsdWUpOw0KICAgICAgICAgICAgICAgICAgICBjZWxsLmNsYXNzTmFtZSA9ICIgeC1kYXRlLWRpc2FibGVkIjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH07DQoNCiAgICAgICAgdmFyIGkgPSAwOw0KICAgICAgICBmb3IoOyBpIDwgc3RhcnRpbmdQb3M7IGkrKykgew0KICAgICAgICAgICAgdGV4dEVsc1tpXS5pbm5lckhUTUwgPSAoKytwcmV2U3RhcnQpOw0KICAgICAgICAgICAgZC5zZXREYXRlKGQuZ2V0RGF0ZSgpKzEpOw0KICAgICAgICAgICAgY2VsbHNbaV0uY2xhc3NOYW1lID0gIngtZGF0ZS1wcmV2ZGF5IjsNCiAgICAgICAgICAgIHNldENlbGxDbGFzcyh0aGlzLCBjZWxsc1tpXSk7DQogICAgICAgIH0NCiAgICAgICAgZm9yKDsgaSA8IGRheXM7IGkrKyl7DQogICAgICAgICAgICBpbnREYXkgPSBpIC0gc3RhcnRpbmdQb3MgKyAxOw0KICAgICAgICAgICAgdGV4dEVsc1tpXS5pbm5lckhUTUwgPSAoaW50RGF5KTsNCiAgICAgICAgICAgIGQuc2V0RGF0ZShkLmdldERhdGUoKSsxKTsNCiAgICAgICAgICAgIGNlbGxzW2ldLmNsYXNzTmFtZSA9ICJ4LWRhdGUtYWN0aXZlIjsNCiAgICAgICAgICAgIHNldENlbGxDbGFzcyh0aGlzLCBjZWxsc1tpXSk7DQogICAgICAgIH0NCiAgICAgICAgdmFyIGV4dHJhRGF5cyA9IDA7DQogICAgICAgIGZvcig7IGkgPCA0MjsgaSsrKSB7DQogICAgICAgICAgICAgdGV4dEVsc1tpXS5pbm5lckhUTUwgPSAoKytleHRyYURheXMpOw0KICAgICAgICAgICAgIGQuc2V0RGF0ZShkLmdldERhdGUoKSsxKTsNCiAgICAgICAgICAgICBjZWxsc1tpXS5jbGFzc05hbWUgPSAieC1kYXRlLW5leHRkYXkiOw0KICAgICAgICAgICAgIHNldENlbGxDbGFzcyh0aGlzLCBjZWxsc1tpXSk7DQogICAgICAgIH0NCg0KICAgICAgICB0aGlzLm1idG4uc2V0VGV4dCh0aGlzLm1vbnRoTmFtZXNbZGF0ZS5nZXRNb250aCgpXSArICIgIiArIGRhdGUuZ2V0RnVsbFllYXIoKSk7DQoNCiAgICAgICAgaWYoIXRoaXMuaW50ZXJuYWxSZW5kZXIpew0KICAgICAgICAgICAgdmFyIG1haW4gPSB0aGlzLmVsLmRvbS5maXJzdENoaWxkOw0KICAgICAgICAgICAgdmFyIHcgPSBtYWluLm9mZnNldFdpZHRoOw0KICAgICAgICAgICAgdGhpcy5lbC5zZXRXaWR0aCh3ICsgdGhpcy5lbC5nZXRCb3JkZXJXaWR0aCgibHIiKSk7DQogICAgICAgICAgICBFeHQuZmx5KG1haW4pLnNldFdpZHRoKHcpOw0KICAgICAgICAgICAgdGhpcy5pbnRlcm5hbFJlbmRlciA9IHRydWU7DQogICAgICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICBpZihFeHQuaXNPcGVyYSAmJiAhdGhpcy5zZWNvbmRQYXNzKXsNCiAgICAgICAgICAgICAgICBtYWluLnJvd3NbMF0uY2VsbHNbMV0uc3R5bGUud2lkdGggPSAodyAtIChtYWluLnJvd3NbMF0uY2VsbHNbMF0ub2Zmc2V0V2lkdGgrbWFpbi5yb3dzWzBdLmNlbGxzWzJdLm9mZnNldFdpZHRoKSkgKyAicHgiOw0KICAgICAgICAgICAgICAgIHRoaXMuc2Vjb25kUGFzcyA9IHRydWU7DQogICAgICAgICAgICAgICAgdGhpcy51cGRhdGUuZGVmZXIoMTAsIHRoaXMsIFtkYXRlXSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9KTsKDQpFeHQuVGFiUGFuZWwgPSBmdW5jdGlvbihjb250YWluZXIsIGNvbmZpZyl7DQogICAgDQogICAgdGhpcy5lbCA9IEV4dC5nZXQoY29udGFpbmVyLCB0cnVlKTsNCiAgICBpZihjb25maWcpew0KICAgICAgICBpZih0eXBlb2YgY29uZmlnID09ICJib29sZWFuIil7DQogICAgICAgICAgICB0aGlzLnRhYlBvc2l0aW9uID0gY29uZmlnID8gImJvdHRvbSIgOiAidG9wIjsNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICBFeHQuYXBwbHkodGhpcywgY29uZmlnKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBpZih0aGlzLnRhYlBvc2l0aW9uID09ICJib3R0b20iKXsNCiAgICAgICAgdGhpcy5ib2R5RWwgPSBFeHQuZ2V0KHRoaXMuY3JlYXRlQm9keSh0aGlzLmVsLmRvbSkpOw0KICAgICAgICB0aGlzLmVsLmFkZENsYXNzKCJ4LXRhYnMtYm90dG9tIik7DQogICAgfQ0KICAgIHRoaXMuc3RyaXBXcmFwID0gRXh0LmdldCh0aGlzLmNyZWF0ZVN0cmlwKHRoaXMuZWwuZG9tKSwgdHJ1ZSk7DQogICAgdGhpcy5zdHJpcEVsID0gRXh0LmdldCh0aGlzLmNyZWF0ZVN0cmlwTGlzdCh0aGlzLnN0cmlwV3JhcC5kb20pLCB0cnVlKTsNCiAgICB0aGlzLnN0cmlwQm9keSA9IEV4dC5nZXQodGhpcy5zdHJpcFdyYXAuZG9tLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZCwgdHJ1ZSk7DQogICAgaWYoRXh0LmlzSUUpew0KICAgICAgICBFeHQuZmx5KHRoaXMuc3RyaXBXcmFwLmRvbS5maXJzdENoaWxkKS5zZXRTdHlsZSgib3ZlcmZsb3cteCIsICJoaWRkZW4iKTsNCiAgICB9DQogICAgaWYodGhpcy50YWJQb3NpdGlvbiAhPSAiYm90dG9tIil7DQogICAgDQogICAgICB0aGlzLmJvZHlFbCA9IEV4dC5nZXQodGhpcy5jcmVhdGVCb2R5KHRoaXMuZWwuZG9tKSk7DQogICAgICB0aGlzLmVsLmFkZENsYXNzKCJ4LXRhYnMtdG9wIik7DQogICAgfQ0KICAgIHRoaXMuaXRlbXMgPSBbXTsNCg0KICAgIHRoaXMuYm9keUVsLnNldFN0eWxlKCJwb3NpdGlvbiIsICJyZWxhdGl2ZSIpOw0KDQogICAgdGhpcy5hY3RpdmUgPSBudWxsOw0KICAgIHRoaXMuYWN0aXZhdGVEZWxlZ2F0ZSA9IHRoaXMuYWN0aXZhdGUuY3JlYXRlRGVsZWdhdGUodGhpcyk7DQoNCiAgICB0aGlzLmFkZEV2ZW50cyh7DQogICAgICAgIA0KICAgICAgICAidGFiY2hhbmdlIjogdHJ1ZSwNCiAgICAgICAgDQogICAgICAgICJiZWZvcmV0YWJjaGFuZ2UiIDogdHJ1ZQ0KICAgIH0pOw0KDQogICAgRXh0LkV2ZW50TWFuYWdlci5vbldpbmRvd1Jlc2l6ZSh0aGlzLm9uUmVzaXplLCB0aGlzKTsNCiAgICB0aGlzLmNwYWQgPSB0aGlzLmVsLmdldFBhZGRpbmcoImxyIik7DQogICAgdGhpcy5oaWRkZW5Db3VudCA9IDA7DQoNCiAgICBFeHQuVGFiUGFuZWwuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpOw0KfTsNCg0KRXh0LmV4dGVuZChFeHQuVGFiUGFuZWwsIEV4dC51dGlsLk9ic2VydmFibGUsIHsNCgkNCiAgICB0YWJQb3NpdGlvbiA6ICJ0b3AiLA0KCQ0KICAgIGN1cnJlbnRUYWJXaWR0aCA6IDAsDQoJDQogICAgbWluVGFiV2lkdGggOiA0MCwNCgkNCiAgICBtYXhUYWJXaWR0aCA6IDI1MCwNCgkNCiAgICBwcmVmZXJyZWRUYWJXaWR0aCA6IDE3NSwNCgkNCiAgICByZXNpemVUYWJzIDogZmFsc2UsDQoJDQogICAgbW9uaXRvclJlc2l6ZSA6IHRydWUsDQoNCiAgICANCiAgICBhZGRUYWIgOiBmdW5jdGlvbihpZCwgdGV4dCwgY29udGVudCwgY2xvc2FibGUpew0KICAgICAgICB2YXIgaXRlbSA9IG5ldyBFeHQuVGFiUGFuZWxJdGVtKHRoaXMsIGlkLCB0ZXh0LCBjbG9zYWJsZSk7DQogICAgICAgIHRoaXMuYWRkVGFiSXRlbShpdGVtKTsNCiAgICAgICAgaWYoY29udGVudCl7DQogICAgICAgICAgICBpdGVtLnNldENvbnRlbnQoY29udGVudCk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGl0ZW07DQogICAgfSwNCg0KICAgIA0KICAgIGdldFRhYiA6IGZ1bmN0aW9uKGlkKXsNCiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbXNbaWRdOw0KICAgIH0sDQoNCiAgICANCiAgICBoaWRlVGFiIDogZnVuY3Rpb24oaWQpew0KICAgICAgICB2YXIgdCA9IHRoaXMuaXRlbXNbaWRdOw0KICAgICAgICBpZighdC5pc0hpZGRlbigpKXsNCiAgICAgICAgICAgdC5zZXRIaWRkZW4odHJ1ZSk7DQogICAgICAgICAgIHRoaXMuaGlkZGVuQ291bnQrKzsNCiAgICAgICAgICAgdGhpcy5hdXRvU2l6ZVRhYnMoKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICANCiAgICB1bmhpZGVUYWIgOiBmdW5jdGlvbihpZCl7DQogICAgICAgIHZhciB0ID0gdGhpcy5pdGVtc1tpZF07DQogICAgICAgIGlmKHQuaXNIaWRkZW4oKSl7DQogICAgICAgICAgIHQuc2V0SGlkZGVuKGZhbHNlKTsNCiAgICAgICAgICAgdGhpcy5oaWRkZW5Db3VudC0tOw0KICAgICAgICAgICB0aGlzLmF1dG9TaXplVGFicygpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIGFkZFRhYkl0ZW0gOiBmdW5jdGlvbihpdGVtKXsNCiAgICAgICAgdGhpcy5pdGVtc1tpdGVtLmlkXSA9IGl0ZW07DQogICAgICAgIHRoaXMuaXRlbXMucHVzaChpdGVtKTsNCiAgICAgICAgaWYodGhpcy5yZXNpemVUYWJzKXsNCiAgICAgICAgICAgaXRlbS5zZXRXaWR0aCh0aGlzLmN1cnJlbnRUYWJXaWR0aCB8fCB0aGlzLnByZWZlcnJlZFRhYldpZHRoKTsNCiAgICAgICAgICAgdGhpcy5hdXRvU2l6ZVRhYnMoKTsNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICBpdGVtLmF1dG9TaXplKCk7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgDQogICAgcmVtb3ZlVGFiIDogZnVuY3Rpb24oaWQpew0KICAgICAgICB2YXIgaXRlbXMgPSB0aGlzLml0ZW1zOw0KICAgICAgICB2YXIgdGFiID0gaXRlbXNbaWRdOw0KICAgICAgICBpZighdGFiKSByZXR1cm47DQogICAgICAgIHZhciBpbmRleCA9IGl0ZW1zLmluZGV4T2YodGFiKTsNCiAgICAgICAgaWYodGhpcy5hY3RpdmUgPT0gdGFiICYmIGl0ZW1zLmxlbmd0aCA+IDEpew0KICAgICAgICAgICAgdmFyIG5ld1RhYiA9IHRoaXMuZ2V0TmV4dEF2YWlsYWJsZShpbmRleCk7DQogICAgICAgICAgICBpZihuZXdUYWIpbmV3VGFiLmFjdGl2YXRlKCk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5zdHJpcEVsLmRvbS5yZW1vdmVDaGlsZCh0YWIucG5vZGUuZG9tKTsNCiAgICAgICAgaWYodGFiLmJvZHlFbC5kb20ucGFyZW50Tm9kZSA9PSB0aGlzLmJvZHlFbC5kb20peyAKICAgICAgICAgICAgdGhpcy5ib2R5RWwuZG9tLnJlbW92ZUNoaWxkKHRhYi5ib2R5RWwuZG9tKTsNCiAgICAgICAgfQ0KICAgICAgICBpdGVtcy5zcGxpY2UoaW5kZXgsIDEpOw0KICAgICAgICBkZWxldGUgdGhpcy5pdGVtc1t0YWIuaWRdOw0KICAgICAgICB0YWIuZmlyZUV2ZW50KCJjbG9zZSIsIHRhYik7DQogICAgICAgIHRhYi5wdXJnZUxpc3RlbmVycygpOw0KICAgICAgICB0aGlzLmF1dG9TaXplVGFicygpOw0KICAgIH0sDQoNCiAgICBnZXROZXh0QXZhaWxhYmxlIDogZnVuY3Rpb24oc3RhcnQpew0KICAgICAgICB2YXIgaXRlbXMgPSB0aGlzLml0ZW1zOw0KICAgICAgICB2YXIgaW5kZXggPSBzdGFydDsNCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgd2hpbGUoaW5kZXggPCBpdGVtcy5sZW5ndGgpew0KICAgICAgICAgICAgdmFyIGl0ZW0gPSBpdGVtc1srK2luZGV4XTsNCiAgICAgICAgICAgIGlmKGl0ZW0gJiYgIWl0ZW0uaXNIaWRkZW4oKSl7DQogICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgCiAgICAgICAgaW5kZXggPSBzdGFydDsNCiAgICAgICAgd2hpbGUoaW5kZXggPj0gMCl7DQogICAgICAgICAgICB2YXIgaXRlbSA9IGl0ZW1zWy0taW5kZXhdOw0KICAgICAgICAgICAgaWYoaXRlbSAmJiAhaXRlbS5pc0hpZGRlbigpKXsNCiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICB9LA0KDQogICAgDQogICAgZGlzYWJsZVRhYiA6IGZ1bmN0aW9uKGlkKXsNCiAgICAgICAgdmFyIHRhYiA9IHRoaXMuaXRlbXNbaWRdOw0KICAgICAgICBpZih0YWIgJiYgdGhpcy5hY3RpdmUgIT0gdGFiKXsNCiAgICAgICAgICAgIHRhYi5kaXNhYmxlKCk7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgDQogICAgZW5hYmxlVGFiIDogZnVuY3Rpb24oaWQpew0KICAgICAgICB2YXIgdGFiID0gdGhpcy5pdGVtc1tpZF07DQogICAgICAgIHRhYi5lbmFibGUoKTsNCiAgICB9LA0KDQogICAgDQogICAgYWN0aXZhdGUgOiBmdW5jdGlvbihpZCl7DQogICAgICAgIHZhciB0YWIgPSB0aGlzLml0ZW1zW2lkXTsNCiAgICAgICAgaWYoIXRhYil7DQogICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgfQ0KICAgICAgICBpZih0YWIgPT0gdGhpcy5hY3RpdmUgfHwgdGFiLmRpc2FibGVkKXsNCiAgICAgICAgICAgIHJldHVybiB0YWI7DQogICAgICAgIH0NCiAgICAgICAgdmFyIGUgPSB7fTsNCiAgICAgICAgdGhpcy5maXJlRXZlbnQoImJlZm9yZXRhYmNoYW5nZSIsIHRoaXMsIGUsIHRhYik7DQogICAgICAgIGlmKGUuY2FuY2VsICE9PSB0cnVlICYmICF0YWIuZGlzYWJsZWQpew0KICAgICAgICAgICAgaWYodGhpcy5hY3RpdmUpew0KICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlLmhpZGUoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMuYWN0aXZlID0gdGhpcy5pdGVtc1tpZF07DQogICAgICAgICAgICB0aGlzLmFjdGl2ZS5zaG93KCk7DQogICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgidGFiY2hhbmdlIiwgdGhpcywgdGhpcy5hY3RpdmUpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0YWI7DQogICAgfSwNCg0KICAgIA0KICAgIGdldEFjdGl2ZVRhYiA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZTsNCiAgICB9LA0KDQogICAgDQogICAgc3luY0hlaWdodCA6IGZ1bmN0aW9uKHRhcmdldEhlaWdodCl7DQogICAgICAgIHZhciBoZWlnaHQgPSAodGFyZ2V0SGVpZ2h0IHx8IHRoaXMuZWwuZ2V0SGVpZ2h0KCkpLXRoaXMuZWwuZ2V0Qm9yZGVyV2lkdGgoInRiIiktdGhpcy5lbC5nZXRQYWRkaW5nKCJ0YiIpOw0KICAgICAgICB2YXIgYm0gPSB0aGlzLmJvZHlFbC5nZXRNYXJnaW5zKCk7DQogICAgICAgIHZhciBuZXdIZWlnaHQgPSBoZWlnaHQtKHRoaXMuc3RyaXBXcmFwLmdldEhlaWdodCgpfHwwKS0oYm0udG9wK2JtLmJvdHRvbSk7DQogICAgICAgIHRoaXMuYm9keUVsLnNldEhlaWdodChuZXdIZWlnaHQpOw0KICAgICAgICByZXR1cm4gbmV3SGVpZ2h0Ow0KICAgIH0sDQoNCiAgICBvblJlc2l6ZSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIGlmKHRoaXMubW9uaXRvclJlc2l6ZSl7DQogICAgICAgICAgICB0aGlzLmF1dG9TaXplVGFicygpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIGJlZ2luVXBkYXRlIDogZnVuY3Rpb24oKXsNCiAgICAgICAgdGhpcy51cGRhdGluZyA9IHRydWU7DQogICAgfSwNCg0KICAgIA0KICAgIGVuZFVwZGF0ZSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHRoaXMudXBkYXRpbmcgPSBmYWxzZTsNCiAgICAgICAgdGhpcy5hdXRvU2l6ZVRhYnMoKTsNCiAgICB9LA0KDQogICAgDQogICAgYXV0b1NpemVUYWJzIDogZnVuY3Rpb24oKXsNCiAgICAgICAgdmFyIGNvdW50ID0gdGhpcy5pdGVtcy5sZW5ndGg7DQogICAgICAgIHZhciB2Y291bnQgPSBjb3VudCAtIHRoaXMuaGlkZGVuQ291bnQ7DQogICAgICAgIGlmKCF0aGlzLnJlc2l6ZVRhYnMgfHwgY291bnQgPCAxIHx8IHZjb3VudCA8IDEgfHwgdGhpcy51cGRhdGluZykgcmV0dXJuOw0KICAgICAgICB2YXIgdyA9IE1hdGgubWF4KHRoaXMuZWwuZ2V0V2lkdGgoKSAtIHRoaXMuY3BhZCwgMTApOw0KICAgICAgICB2YXIgYXZhaWxXaWR0aCA9IE1hdGguZmxvb3IodyAvIHZjb3VudCk7DQogICAgICAgIHZhciBiID0gdGhpcy5zdHJpcEJvZHk7DQogICAgICAgIGlmKGIuZ2V0V2lkdGgoKSA+IHcpew0KICAgICAgICAgICAgdmFyIHRhYnMgPSB0aGlzLml0ZW1zOw0KICAgICAgICAgICAgdGhpcy5zZXRUYWJXaWR0aChNYXRoLm1heChhdmFpbFdpZHRoLCB0aGlzLm1pblRhYldpZHRoKS0yKTsNCiAgICAgICAgICAgIGlmKGF2YWlsV2lkdGggPCB0aGlzLm1pblRhYldpZHRoKXsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIH0NCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICBpZih0aGlzLmN1cnJlbnRUYWJXaWR0aCA8IHRoaXMucHJlZmVycmVkVGFiV2lkdGgpew0KICAgICAgICAgICAgICAgIHRoaXMuc2V0VGFiV2lkdGgoTWF0aC5taW4oYXZhaWxXaWR0aCwgdGhpcy5wcmVmZXJyZWRUYWJXaWR0aCktMik7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgDQogICAgIGdldENvdW50IDogZnVuY3Rpb24oKXsNCiAgICAgICAgIHJldHVybiB0aGlzLml0ZW1zLmxlbmd0aDsNCiAgICAgfSwNCg0KICAgIA0KICAgIHNldFRhYldpZHRoIDogZnVuY3Rpb24od2lkdGgpew0KICAgICAgICB0aGlzLmN1cnJlbnRUYWJXaWR0aCA9IHdpZHRoOw0KICAgICAgICBmb3IodmFyIGkgPSAwLCBsZW4gPSB0aGlzLml0ZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7DQogICAgICAgIAlpZighdGhpcy5pdGVtc1tpXS5pc0hpZGRlbigpKXRoaXMuaXRlbXNbaV0uc2V0V2lkdGgod2lkdGgpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIGRlc3Ryb3kgOiBmdW5jdGlvbihyZW1vdmVFbCl7DQogICAgICAgIEV4dC5FdmVudE1hbmFnZXIucmVtb3ZlUmVzaXplTGlzdGVuZXIodGhpcy5vblJlc2l6ZSwgdGhpcyk7DQogICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IHRoaXMuaXRlbXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspew0KICAgICAgICAgICAgdGhpcy5pdGVtc1tpXS5wdXJnZUxpc3RlbmVycygpOw0KICAgICAgICB9DQogICAgICAgIGlmKHJlbW92ZUVsID09PSB0cnVlKXsNCiAgICAgICAgICAgIHRoaXMuZWwudXBkYXRlKCIiKTsNCiAgICAgICAgICAgIHRoaXMuZWwucmVtb3ZlKCk7DQogICAgICAgIH0NCiAgICB9DQp9KTsNCg0KDQpFeHQuVGFiUGFuZWxJdGVtID0gZnVuY3Rpb24odGFiUGFuZWwsIGlkLCB0ZXh0LCBjbG9zYWJsZSl7DQogICAgDQogICAgdGhpcy50YWJQYW5lbCA9IHRhYlBhbmVsOw0KICAgIA0KICAgIHRoaXMuaWQgPSBpZDsNCiAgICANCiAgICB0aGlzLmRpc2FibGVkID0gZmFsc2U7DQogICAgDQogICAgdGhpcy50ZXh0ID0gdGV4dDsNCiAgICANCiAgICB0aGlzLmxvYWRlZCA9IGZhbHNlOw0KICAgIHRoaXMuY2xvc2FibGUgPSBjbG9zYWJsZTsNCg0KICAgIA0KICAgIHRoaXMuYm9keUVsID0gRXh0LmdldCh0YWJQYW5lbC5jcmVhdGVJdGVtQm9keSh0YWJQYW5lbC5ib2R5RWwuZG9tLCBpZCkpOw0KICAgIHRoaXMuYm9keUVsLnNldFZpc2liaWxpdHlNb2RlKEV4dC5FbGVtZW50LlZJU0lCSUxJVFkpOw0KICAgIHRoaXMuYm9keUVsLnNldFN0eWxlKCJkaXNwbGF5IiwgImJsb2NrIik7DQogICAgdGhpcy5ib2R5RWwuc2V0U3R5bGUoInpvb20iLCAiMSIpOw0KICAgIHRoaXMuaGlkZUFjdGlvbigpOw0KDQogICAgdmFyIGVscyA9IHRhYlBhbmVsLmNyZWF0ZVN0cmlwRWxlbWVudHModGFiUGFuZWwuc3RyaXBFbC5kb20sIHRleHQsIGNsb3NhYmxlKTsNCiAgICANCiAgICB0aGlzLmVsID0gRXh0LmdldChlbHMuZWwsIHRydWUpOw0KICAgIHRoaXMuaW5uZXIgPSBFeHQuZ2V0KGVscy5pbm5lciwgdHJ1ZSk7DQogICAgdGhpcy50ZXh0RWwgPSBFeHQuZ2V0KHRoaXMuZWwuZG9tLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZC5maXJzdENoaWxkLCB0cnVlKTsNCiAgICB0aGlzLnBub2RlID0gRXh0LmdldChlbHMuZWwucGFyZW50Tm9kZSwgdHJ1ZSk7DQogICAgdGhpcy5lbC5vbigibW91c2Vkb3duIiwgdGhpcy5vblRhYk1vdXNlRG93biwgdGhpcyk7DQogICAgdGhpcy5lbC5vbigiY2xpY2siLCB0aGlzLm9uVGFiQ2xpY2ssIHRoaXMpOw0KICAgIA0KICAgIGlmKGNsb3NhYmxlKXsNCiAgICAgICAgdmFyIGMgPSBFeHQuZ2V0KGVscy5jbG9zZSwgdHJ1ZSk7DQogICAgICAgIGMuZG9tLnRpdGxlID0gdGhpcy5jbG9zZVRleHQ7DQogICAgICAgIGMuYWRkQ2xhc3NPbk92ZXIoImNsb3NlLW92ZXIiKTsNCiAgICAgICAgYy5vbigiY2xpY2siLCB0aGlzLmNsb3NlQ2xpY2ssIHRoaXMpOw0KICAgICB9DQoNCiAgICB0aGlzLmFkZEV2ZW50cyh7DQogICAgICAgICANCiAgICAgICAgImFjdGl2YXRlIjogdHJ1ZSwNCiAgICAgICAgDQogICAgICAgICJiZWZvcmVjbG9zZSI6IHRydWUsDQogICAgICAgIA0KICAgICAgICAgImNsb3NlIjogdHJ1ZSwNCiAgICAgICAgDQogICAgICAgICAiZGVhY3RpdmF0ZSIgOiB0cnVlDQogICAgfSk7DQogICAgdGhpcy5oaWRkZW4gPSBmYWxzZTsNCg0KICAgIEV4dC5UYWJQYW5lbEl0ZW0uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpOw0KfTsNCg0KRXh0LmV4dGVuZChFeHQuVGFiUGFuZWxJdGVtLCBFeHQudXRpbC5PYnNlcnZhYmxlLCB7DQogICAgcHVyZ2VMaXN0ZW5lcnMgOiBmdW5jdGlvbigpew0KICAgICAgIEV4dC51dGlsLk9ic2VydmFibGUucHJvdG90eXBlLnB1cmdlTGlzdGVuZXJzLmNhbGwodGhpcyk7DQogICAgICAgdGhpcy5lbC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTsNCiAgICB9LA0KICAgIA0KICAgIHNob3cgOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLnBub2RlLmFkZENsYXNzKCJvbiIpOw0KICAgICAgICB0aGlzLnNob3dBY3Rpb24oKTsNCiAgICAgICAgaWYoRXh0LmlzT3BlcmEpew0KICAgICAgICAgICAgdGhpcy50YWJQYW5lbC5zdHJpcFdyYXAucmVwYWludCgpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuZmlyZUV2ZW50KCJhY3RpdmF0ZSIsIHRoaXMudGFiUGFuZWwsIHRoaXMpOw0KICAgIH0sDQoNCiAgICANCiAgICBpc0FjdGl2ZSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLnRhYlBhbmVsLmdldEFjdGl2ZVRhYigpID09IHRoaXM7DQogICAgfSwNCg0KICAgIA0KICAgIGhpZGUgOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLnBub2RlLnJlbW92ZUNsYXNzKCJvbiIpOw0KICAgICAgICB0aGlzLmhpZGVBY3Rpb24oKTsNCiAgICAgICAgdGhpcy5maXJlRXZlbnQoImRlYWN0aXZhdGUiLCB0aGlzLnRhYlBhbmVsLCB0aGlzKTsNCiAgICB9LA0KDQogICAgaGlkZUFjdGlvbiA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHRoaXMuYm9keUVsLmhpZGUoKTsNCiAgICAgICAgdGhpcy5ib2R5RWwuc2V0U3R5bGUoInBvc2l0aW9uIiwgImFic29sdXRlIik7DQogICAgICAgIHRoaXMuYm9keUVsLnNldExlZnQoIi0yMDAwMHB4Iik7DQogICAgICAgIHRoaXMuYm9keUVsLnNldFRvcCgiLTIwMDAwcHgiKTsNCiAgICB9LA0KDQogICAgc2hvd0FjdGlvbiA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHRoaXMuYm9keUVsLnNldFN0eWxlKCJwb3NpdGlvbiIsICJyZWxhdGl2ZSIpOw0KICAgICAgICB0aGlzLmJvZHlFbC5zZXRUb3AoIiIpOw0KICAgICAgICB0aGlzLmJvZHlFbC5zZXRMZWZ0KCIiKTsNCiAgICAgICAgdGhpcy5ib2R5RWwuc2hvdygpOw0KICAgIH0sDQoNCiAgICANCiAgICBzZXRUb29sdGlwIDogZnVuY3Rpb24odGV4dCl7DQogICAgICAgIGlmKEV4dC5RdWlja1RpcHMgJiYgRXh0LlF1aWNrVGlwcy5pc0VuYWJsZWQoKSl7DQogICAgICAgICAgICB0aGlzLnRleHRFbC5kb20ucXRpcCA9IHRleHQ7DQogICAgICAgICAgICB0aGlzLnRleHRFbC5kb20ucmVtb3ZlQXR0cmlidXRlKCd0aXRsZScpOw0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIHRoaXMudGV4dEVsLmRvbS50aXRsZSA9IHRleHQ7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgb25UYWJDbGljayA6IGZ1bmN0aW9uKGUpew0KICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7DQogICAgICAgIHRoaXMudGFiUGFuZWwuYWN0aXZhdGUodGhpcy5pZCk7DQogICAgfSwNCg0KICAgIG9uVGFiTW91c2VEb3duIDogZnVuY3Rpb24oZSl7DQogICAgICAgIGUucHJldmVudERlZmF1bHQoKTsNCiAgICAgICAgdGhpcy50YWJQYW5lbC5hY3RpdmF0ZSh0aGlzLmlkKTsNCiAgICB9LA0KDQogICAgZ2V0V2lkdGggOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gdGhpcy5pbm5lci5nZXRXaWR0aCgpOw0KICAgIH0sDQoNCiAgICBzZXRXaWR0aCA6IGZ1bmN0aW9uKHdpZHRoKXsNCiAgICAgICAgdmFyIGl3aWR0aCA9IHdpZHRoIC0gdGhpcy5wbm9kZS5nZXRQYWRkaW5nKCJsciIpOw0KICAgICAgICB0aGlzLmlubmVyLnNldFdpZHRoKGl3aWR0aCk7DQogICAgICAgIHRoaXMudGV4dEVsLnNldFdpZHRoKGl3aWR0aC10aGlzLmlubmVyLmdldFBhZGRpbmcoImxyIikpOw0KICAgICAgICB0aGlzLnBub2RlLnNldFdpZHRoKHdpZHRoKTsNCiAgICB9LA0KDQogICAgDQogICAgc2V0SGlkZGVuIDogZnVuY3Rpb24oaGlkZGVuKXsNCiAgICAgICAgdGhpcy5oaWRkZW4gPSBoaWRkZW47DQogICAgICAgIHRoaXMucG5vZGUuc2V0U3R5bGUoImRpc3BsYXkiLCBoaWRkZW4gPyAibm9uZSIgOiAiIik7DQogICAgfSwNCg0KICAgIA0KICAgIGlzSGlkZGVuIDogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIHRoaXMuaGlkZGVuOw0KICAgIH0sDQoNCiAgICANCiAgICBnZXRUZXh0IDogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIHRoaXMudGV4dDsNCiAgICB9LA0KDQogICAgYXV0b1NpemUgOiBmdW5jdGlvbigpew0KICAgICAgICAKICAgICAgICB0aGlzLnRleHRFbC5zZXRXaWR0aCgxKTsNCiAgICAgICAgdGhpcy5zZXRXaWR0aCh0aGlzLnRleHRFbC5kb20uc2Nyb2xsV2lkdGgrdGhpcy5wbm9kZS5nZXRQYWRkaW5nKCJsciIpK3RoaXMuaW5uZXIuZ2V0UGFkZGluZygibHIiKSk7DQogICAgICAgIAogICAgfSwNCg0KICAgIA0KICAgIHNldFRleHQgOiBmdW5jdGlvbih0ZXh0KXsNCiAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDsNCiAgICAgICAgdGhpcy50ZXh0RWwudXBkYXRlKHRleHQpOw0KICAgICAgICB0aGlzLnNldFRvb2x0aXAodGV4dCk7DQogICAgICAgIGlmKCF0aGlzLnRhYlBhbmVsLnJlc2l6ZVRhYnMpew0KICAgICAgICAgICAgdGhpcy5hdXRvU2l6ZSgpOw0KICAgICAgICB9DQogICAgfSwNCiAgICANCiAgICBhY3RpdmF0ZSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHRoaXMudGFiUGFuZWwuYWN0aXZhdGUodGhpcy5pZCk7DQogICAgfSwNCg0KICAgIA0KICAgIGRpc2FibGUgOiBmdW5jdGlvbigpew0KICAgICAgICBpZih0aGlzLnRhYlBhbmVsLmFjdGl2ZSAhPSB0aGlzKXsNCiAgICAgICAgICAgIHRoaXMuZGlzYWJsZWQgPSB0cnVlOw0KICAgICAgICAgICAgdGhpcy5wbm9kZS5hZGRDbGFzcygiZGlzYWJsZWQiKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICANCiAgICBlbmFibGUgOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLmRpc2FibGVkID0gZmFsc2U7DQogICAgICAgIHRoaXMucG5vZGUucmVtb3ZlQ2xhc3MoImRpc2FibGVkIik7DQogICAgfSwNCg0KICAgIA0KICAgIHNldENvbnRlbnQgOiBmdW5jdGlvbihjb250ZW50LCBsb2FkU2NyaXB0cyl7DQogICAgICAgIHRoaXMuYm9keUVsLnVwZGF0ZShjb250ZW50LCBsb2FkU2NyaXB0cyk7DQogICAgfSwNCg0KICAgIA0KICAgIGdldFVwZGF0ZU1hbmFnZXIgOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gdGhpcy5ib2R5RWwuZ2V0VXBkYXRlTWFuYWdlcigpOw0KICAgIH0sDQoNCiAgICANCiAgICBzZXRVcmwgOiBmdW5jdGlvbih1cmwsIHBhcmFtcywgbG9hZE9uY2Upew0KICAgICAgICBpZih0aGlzLnJlZnJlc2hEZWxlZ2F0ZSl7DQogICAgICAgICAgICB0aGlzLnVuKCdhY3RpdmF0ZScsIHRoaXMucmVmcmVzaERlbGVnYXRlKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLnJlZnJlc2hEZWxlZ2F0ZSA9IHRoaXMuX2hhbmRsZVJlZnJlc2guY3JlYXRlRGVsZWdhdGUodGhpcywgW3VybCwgcGFyYW1zLCBsb2FkT25jZV0pOw0KICAgICAgICB0aGlzLm9uKCJhY3RpdmF0ZSIsIHRoaXMucmVmcmVzaERlbGVnYXRlKTsNCiAgICAgICAgcmV0dXJuIHRoaXMuYm9keUVsLmdldFVwZGF0ZU1hbmFnZXIoKTsNCiAgICB9LA0KDQogICAgDQogICAgX2hhbmRsZVJlZnJlc2ggOiBmdW5jdGlvbih1cmwsIHBhcmFtcywgbG9hZE9uY2Upew0KICAgICAgICBpZighbG9hZE9uY2UgfHwgIXRoaXMubG9hZGVkKXsNCiAgICAgICAgICAgIHZhciB1cGRhdGVyID0gdGhpcy5ib2R5RWwuZ2V0VXBkYXRlTWFuYWdlcigpOw0KICAgICAgICAgICAgdXBkYXRlci51cGRhdGUodXJsLCBwYXJhbXMsIHRoaXMuX3NldExvYWRlZC5jcmVhdGVEZWxlZ2F0ZSh0aGlzKSk7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgDQogICAgcmVmcmVzaCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIGlmKHRoaXMucmVmcmVzaERlbGVnYXRlKXsNCiAgICAgICAgICAgdGhpcy5sb2FkZWQgPSBmYWxzZTsNCiAgICAgICAgICAgdGhpcy5yZWZyZXNoRGVsZWdhdGUoKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICANCiAgICBfc2V0TG9hZGVkIDogZnVuY3Rpb24oKXsNCiAgICAgICAgdGhpcy5sb2FkZWQgPSB0cnVlOw0KICAgIH0sDQoNCiAgICANCiAgICBjbG9zZUNsaWNrIDogZnVuY3Rpb24oZSl7DQogICAgICAgIHZhciBvID0ge307DQogICAgICAgIGUuc3RvcEV2ZW50KCk7DQogICAgICAgIHRoaXMuZmlyZUV2ZW50KCJiZWZvcmVjbG9zZSIsIHRoaXMsIG8pOw0KICAgICAgICBpZihvLmNhbmNlbCAhPT0gdHJ1ZSl7DQogICAgICAgICAgICB0aGlzLnRhYlBhbmVsLnJlbW92ZVRhYih0aGlzLmlkKTsNCiAgICAgICAgfQ0KICAgIH0sDQogICAgDQogICAgY2xvc2VUZXh0IDogIkNsb3NlIHRoaXMgdGFiIg0KfSk7DQoNCg0KRXh0LlRhYlBhbmVsLnByb3RvdHlwZS5jcmVhdGVTdHJpcCA9IGZ1bmN0aW9uKGNvbnRhaW5lcil7DQogICAgdmFyIHN0cmlwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQogICAgc3RyaXAuY2xhc3NOYW1lID0gIngtdGFicy13cmFwIjsNCiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoc3RyaXApOw0KICAgIHJldHVybiBzdHJpcDsNCn07DQoNCkV4dC5UYWJQYW5lbC5wcm90b3R5cGUuY3JlYXRlU3RyaXBMaXN0ID0gZnVuY3Rpb24oc3RyaXApew0KICAgIAogICAgc3RyaXAuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9IngtdGFicy1zdHJpcC13cmFwIj48dGFibGUgY2xhc3M9IngtdGFicy1zdHJpcCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBib3JkZXI9IjAiPjx0Ym9keT48dHI+PC90cj48L3Rib2R5PjwvdGFibGU+PC9kaXY+JzsNCiAgICByZXR1cm4gc3RyaXAuZmlyc3RDaGlsZC5maXJzdENoaWxkLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZDsNCn07DQoNCkV4dC5UYWJQYW5lbC5wcm90b3R5cGUuY3JlYXRlQm9keSA9IGZ1bmN0aW9uKGNvbnRhaW5lcil7DQogICAgdmFyIGJvZHkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCiAgICBFeHQuaWQoYm9keSwgInRhYi1ib2R5Iik7DQogICAgRXh0LmZseShib2R5KS5hZGRDbGFzcygieC10YWJzLWJvZHkiKTsNCiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoYm9keSk7DQogICAgcmV0dXJuIGJvZHk7DQp9Ow0KDQpFeHQuVGFiUGFuZWwucHJvdG90eXBlLmNyZWF0ZUl0ZW1Cb2R5ID0gZnVuY3Rpb24oYm9keUVsLCBpZCl7DQogICAgdmFyIGJvZHkgPSBFeHQuZ2V0RG9tKGlkKTsNCiAgICBpZighYm9keSl7DQogICAgICAgIGJvZHkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCiAgICAgICAgYm9keS5pZCA9IGlkOw0KICAgIH0NCiAgICBFeHQuZmx5KGJvZHkpLmFkZENsYXNzKCJ4LXRhYnMtaXRlbS1ib2R5Iik7DQogICAgYm9keUVsLmluc2VydEJlZm9yZShib2R5LCBib2R5RWwuZmlyc3RDaGlsZCk7DQogICAgcmV0dXJuIGJvZHk7DQp9Ow0KDQpFeHQuVGFiUGFuZWwucHJvdG90eXBlLmNyZWF0ZVN0cmlwRWxlbWVudHMgPSBmdW5jdGlvbihzdHJpcEVsLCB0ZXh0LCBjbG9zYWJsZSl7DQogICAgdmFyIHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsNCiAgICBzdHJpcEVsLmFwcGVuZENoaWxkKHRkKTsNCiAgICBpZihjbG9zYWJsZSl7DQogICAgICAgIHRkLmNsYXNzTmFtZSA9ICJ4LXRhYnMtY2xvc2FibGUiOw0KICAgICAgICBpZighdGhpcy5jbG9zZVRwbCl7DQogICAgICAgICAgICB0aGlzLmNsb3NlVHBsID0gbmV3IEV4dC5UZW1wbGF0ZSgNCiAgICAgICAgICAgICAgICc8YSBocmVmPSIjIiBjbGFzcz0ieC10YWJzLXJpZ2h0Ij48c3BhbiBjbGFzcz0ieC10YWJzLWxlZnQiPjxlbSBjbGFzcz0ieC10YWJzLWlubmVyIj4nICsNCiAgICAgICAgICAgICAgICc8c3BhbiB1bnNlbGVjdGFibGU9Im9uIicgKyAodGhpcy5kaXNhYmxlVG9vbHRpcHMgPyAnJyA6ICcgdGl0bGU9Int0ZXh0fSInKSArJyBjbGFzcz0ieC10YWJzLXRleHQiPnt0ZXh0fTwvc3Bhbj4nICsNCiAgICAgICAgICAgICAgICc8ZGl2IHVuc2VsZWN0YWJsZT0ib24iIGNsYXNzPSJjbG9zZS1pY29uIj4mIzE2MDs8L2Rpdj48L2VtPjwvc3Bhbj48L2E+Jw0KICAgICAgICAgICAgKTsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgZWwgPSB0aGlzLmNsb3NlVHBsLm92ZXJ3cml0ZSh0ZCwgeyJ0ZXh0IjogdGV4dH0pOw0KICAgICAgICB2YXIgY2xvc2UgPSBlbC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2IilbMF07DQogICAgICAgIHZhciBpbm5lciA9IGVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbSIpWzBdOw0KICAgICAgICByZXR1cm4geyJlbCI6IGVsLCAiY2xvc2UiOiBjbG9zZSwgImlubmVyIjogaW5uZXJ9Ow0KICAgIH0gZWxzZSB7DQogICAgICAgIGlmKCF0aGlzLnRhYlRwbCl7DQogICAgICAgICAgICB0aGlzLnRhYlRwbCA9IG5ldyBFeHQuVGVtcGxhdGUoDQogICAgICAgICAgICAgICAnPGEgaHJlZj0iIyIgY2xhc3M9IngtdGFicy1yaWdodCI+PHNwYW4gY2xhc3M9IngtdGFicy1sZWZ0Ij48ZW0gY2xhc3M9IngtdGFicy1pbm5lciI+JyArDQogICAgICAgICAgICAgICAnPHNwYW4gdW5zZWxlY3RhYmxlPSJvbiInICsgKHRoaXMuZGlzYWJsZVRvb2x0aXBzID8gJycgOiAnIHRpdGxlPSJ7dGV4dH0iJykgKycgY2xhc3M9IngtdGFicy10ZXh0Ij57dGV4dH08L3NwYW4+PC9lbT48L3NwYW4+PC9hPicNCiAgICAgICAgICAgICk7DQogICAgICAgIH0NCiAgICAgICAgdmFyIGVsID0gdGhpcy50YWJUcGwub3ZlcndyaXRlKHRkLCB7InRleHQiOiB0ZXh0fSk7DQogICAgICAgIHZhciBpbm5lciA9IGVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbSIpWzBdOw0KICAgICAgICByZXR1cm4geyJlbCI6IGVsLCAiaW5uZXIiOiBpbm5lcn07DQogICAgfQ0KfTsKDQpFeHQuQnV0dG9uID0gZnVuY3Rpb24ocmVuZGVyVG8sIGNvbmZpZyl7DQogICAgRXh0LmFwcGx5KHRoaXMsIGNvbmZpZyk7DQogICAgdGhpcy5hZGRFdmVudHMoew0KICAgICAgICANCgkgICAgImNsaWNrIiA6IHRydWUsDQogICAgICAgIA0KCSAgICAidG9nZ2xlIiA6IHRydWUsDQogICAgICAgIA0KICAgICAgICAnbW91c2VvdmVyJyA6IHRydWUsDQogICAgICAgIA0KICAgICAgICAnbW91c2VvdXQnOiB0cnVlDQogICAgfSk7DQogICAgaWYodGhpcy5tZW51KXsNCiAgICAgICAgdGhpcy5tZW51ID0gRXh0Lm1lbnUuTWVudU1nci5nZXQodGhpcy5tZW51KTsNCiAgICB9DQogICAgaWYocmVuZGVyVG8pew0KICAgICAgICB0aGlzLnJlbmRlcihyZW5kZXJUbyk7DQogICAgfQ0KICAgIEV4dC5CdXR0b24uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpOw0KfTsNCg0KRXh0LmV4dGVuZChFeHQuQnV0dG9uLCBFeHQudXRpbC5PYnNlcnZhYmxlLCB7DQogICAgDQogICAgaGlkZGVuIDogZmFsc2UsDQogICAgDQogICAgZGlzYWJsZWQgOiBmYWxzZSwNCiAgICANCiAgICBwcmVzc2VkIDogZmFsc2UsDQoNCiAgICANCiAgICB0YWJJbmRleCA6IHVuZGVmaW5lZCwNCg0KICAgIA0KICAgIGVuYWJsZVRvZ2dsZTogZmFsc2UsDQogICAgDQogICAgbWVudSA6IHVuZGVmaW5lZCwNCiAgICANCiAgICBtZW51QWxpZ24gOiAidGwtYmw/IiwNCg0KICAgIA0KICAgIGljb25DbHMgOiB1bmRlZmluZWQsDQogICAgDQogICAgdHlwZSA6ICdidXR0b24nLA0KDQogICAgCiAgICBtZW51Q2xhc3NUYXJnZXQ6ICd0cicsDQoNCiAgICANCiAgICBjbGlja0V2ZW50IDogJ2NsaWNrJywNCg0KICAgIA0KICAgIGhhbmRsZU1vdXNlRXZlbnRzIDogdHJ1ZSwNCg0KICAgIA0KICAgIHRvb2x0aXBUeXBlIDogJ3F0aXAnLA0KDQogICAgDQogICAgDQogICAgDQoNCiAgICAKICAgIHJlbmRlciA6IGZ1bmN0aW9uKHJlbmRlclRvKXsNCiAgICAgICAgdmFyIGJ0bjsNCiAgICAgICAgaWYodGhpcy5oaWRlUGFyZW50KXsNCiAgICAgICAgICAgIHRoaXMucGFyZW50RWwgPSBFeHQuZ2V0KHJlbmRlclRvKTsNCiAgICAgICAgfQ0KICAgICAgICBpZighdGhpcy5kaGNvbmZpZyl7DQogICAgICAgICAgICBpZighdGhpcy50ZW1wbGF0ZSl7DQogICAgICAgICAgICAgICAgaWYoIUV4dC5CdXR0b24uYnV0dG9uVGVtcGxhdGUpew0KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBFeHQuQnV0dG9uLmJ1dHRvblRlbXBsYXRlID0gbmV3IEV4dC5UZW1wbGF0ZSgNCiAgICAgICAgICAgICAgICAgICAgICAgICc8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJ4LWJ0bi13cmFwIj48dGJvZHk+PHRyPicsDQogICAgICAgICAgICAgICAgICAgICAgICAnPHRkIGNsYXNzPSJ4LWJ0bi1sZWZ0Ij48aT4mIzE2MDs8L2k+PC90ZD48dGQgY2xhc3M9IngtYnRuLWNlbnRlciI+PGVtIHVuc2VsZWN0YWJsZT0ib24iPjxidXR0b24gY2xhc3M9IngtYnRuLXRleHQiIHR5cGU9InsxfSI+ezB9PC9idXR0b24+PC9lbT48L3RkPjx0ZCBjbGFzcz0ieC1idG4tcmlnaHQiPjxpPiYjMTYwOzwvaT48L3RkPicsDQogICAgICAgICAgICAgICAgICAgICAgICAiPC90cj48L3Rib2R5PjwvdGFibGU+Iik7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGUgPSBFeHQuQnV0dG9uLmJ1dHRvblRlbXBsYXRlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgYnRuID0gdGhpcy50ZW1wbGF0ZS5hcHBlbmQocmVuZGVyVG8sIFt0aGlzLnRleHQgfHwgJyYjMTYwOycsIHRoaXMudHlwZV0sIHRydWUpOw0KICAgICAgICAgICAgdmFyIGJ0bkVsID0gYnRuLmNoaWxkKCJidXR0b246Zmlyc3QiKTsNCiAgICAgICAgICAgIGJ0bkVsLm9uKCdmb2N1cycsIHRoaXMub25Gb2N1cywgdGhpcyk7DQogICAgICAgICAgICBidG5FbC5vbignYmx1cicsIHRoaXMub25CbHVyLCB0aGlzKTsNCiAgICAgICAgICAgIGlmKHRoaXMuY2xzKXsNCiAgICAgICAgICAgICAgICBidG4uYWRkQ2xhc3ModGhpcy5jbHMpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYodGhpcy5pY29uKXsNCiAgICAgICAgICAgICAgICBidG5FbC5zZXRTdHlsZSgnYmFja2dyb3VuZC1pbWFnZScsICd1cmwoJyArdGhpcy5pY29uICsnKScpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYodGhpcy5pY29uQ2xzKXsNCiAgICAgICAgICAgICAgICBidG5FbC5hZGRDbGFzcyh0aGlzLmljb25DbHMpOw0KICAgICAgICAgICAgICAgIGlmKCF0aGlzLmNscyl7DQogICAgICAgICAgICAgICAgICAgIGJ0bi5hZGRDbGFzcyh0aGlzLnRleHQgPyAneC1idG4tdGV4dC1pY29uJyA6ICd4LWJ0bi1pY29uJyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYodGhpcy50YWJJbmRleCAhPT0gdW5kZWZpbmVkKXsNCiAgICAgICAgICAgICAgICBidG5FbC5kb20udGFiSW5kZXggPSB0aGlzLnRhYkluZGV4Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYodGhpcy50b29sdGlwKXsNCiAgICAgICAgICAgICAgICBpZih0eXBlb2YgdGhpcy50b29sdGlwID09ICdvYmplY3QnKXsNCiAgICAgICAgICAgICAgICAgICAgRXh0LlF1aWNrVGlwcy50aXBzKEV4dC5hcHBseSh7DQogICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogYnRuRWwuaWQNCiAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy50b29sdGlwKSk7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgYnRuRWwuZG9tW3RoaXMudG9vbHRpcFR5cGVdID0gdGhpcy50b29sdGlwOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICBidG4gPSBFeHQuRG9tSGVscGVyLmFwcGVuZChFeHQuZ2V0KHJlbmRlclRvKS5kb20sIHRoaXMuZGhjb25maWcsIHRydWUpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuZWwgPSBidG47DQogICAgICAgIGlmKHRoaXMuaWQpew0KICAgICAgICAgICAgdGhpcy5lbC5kb20uaWQgPSB0aGlzLmVsLmlkID0gdGhpcy5pZDsNCiAgICAgICAgfQ0KICAgICAgICBpZih0aGlzLm1lbnUpew0KICAgICAgICAgICAgdGhpcy5lbC5jaGlsZCh0aGlzLm1lbnVDbGFzc1RhcmdldCkuYWRkQ2xhc3MoIngtYnRuLXdpdGgtbWVudSIpOw0KICAgICAgICAgICAgdGhpcy5tZW51Lm9uKCJzaG93IiwgdGhpcy5vbk1lbnVTaG93LCB0aGlzKTsNCiAgICAgICAgICAgIHRoaXMubWVudS5vbigiaGlkZSIsIHRoaXMub25NZW51SGlkZSwgdGhpcyk7DQogICAgICAgIH0NCiAgICAgICAgYnRuLmFkZENsYXNzKCJ4LWJ0biIpOw0KICAgICAgICBpZihFeHQuaXNJRSAmJiAhRXh0LmlzSUU3KXsNCiAgICAgICAgICAgIHRoaXMuYXV0b1dpZHRoLmRlZmVyKDEsIHRoaXMpOw0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIHRoaXMuYXV0b1dpZHRoKCk7DQogICAgICAgIH0NCiAgICAgICAgaWYodGhpcy5oYW5kbGVNb3VzZUV2ZW50cyl7DQogICAgICAgICAgICBidG4ub24oIm1vdXNlb3ZlciIsIHRoaXMub25Nb3VzZU92ZXIsIHRoaXMpOw0KICAgICAgICAgICAgYnRuLm9uKCJtb3VzZW91dCIsIHRoaXMub25Nb3VzZU91dCwgdGhpcyk7DQogICAgICAgICAgICBidG4ub24oIm1vdXNlZG93biIsIHRoaXMub25Nb3VzZURvd24sIHRoaXMpOw0KICAgICAgICB9DQogICAgICAgIGJ0bi5vbih0aGlzLmNsaWNrRXZlbnQsIHRoaXMub25DbGljaywgdGhpcyk7DQogICAgICAgIAogICAgICAgIGlmKHRoaXMuaGlkZGVuKXsNCiAgICAgICAgICAgIHRoaXMuaGlkZSgpOw0KICAgICAgICB9DQogICAgICAgIGlmKHRoaXMuZGlzYWJsZWQpew0KICAgICAgICAgICAgdGhpcy5kaXNhYmxlKCk7DQogICAgICAgIH0NCiAgICAgICAgRXh0LkJ1dHRvblRvZ2dsZU1nci5yZWdpc3Rlcih0aGlzKTsNCiAgICAgICAgaWYodGhpcy5wcmVzc2VkKXsNCiAgICAgICAgICAgIHRoaXMuZWwuYWRkQ2xhc3MoIngtYnRuLXByZXNzZWQiKTsNCiAgICAgICAgfQ0KICAgICAgICBpZih0aGlzLnJlcGVhdCl7DQogICAgICAgICAgICB2YXIgcmVwZWF0ZXIgPSBuZXcgRXh0LnV0aWwuQ2xpY2tSZXBlYXRlcihidG4sDQogICAgICAgICAgICAgICAgdHlwZW9mIHRoaXMucmVwZWF0ID09ICJvYmplY3QiID8gdGhpcy5yZXBlYXQgOiB7fQ0KICAgICAgICAgICAgKTsNCiAgICAgICAgICAgIHJlcGVhdGVyLm9uKCJjbGljayIsIHRoaXMub25DbGljaywgIHRoaXMpOw0KICAgICAgICB9DQogICAgfSwNCiAgICANCiAgICBnZXRFbCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLmVsOyAgDQogICAgfSwNCiAgICANCiAgICANCiAgICBkZXN0cm95IDogZnVuY3Rpb24oKXsNCiAgICAgICAgRXh0LkJ1dHRvblRvZ2dsZU1nci51bnJlZ2lzdGVyKHRoaXMpOw0KICAgICAgICB0aGlzLmVsLnJlbW92ZUFsbExpc3RlbmVycygpOw0KICAgICAgICB0aGlzLnB1cmdlTGlzdGVuZXJzKCk7DQogICAgICAgIHRoaXMuZWwucmVtb3ZlKCk7DQogICAgfSwNCg0KICAgIAogICAgYXV0b1dpZHRoIDogZnVuY3Rpb24oKXsNCiAgICAgICAgaWYodGhpcy5lbCl7DQogICAgICAgICAgICB0aGlzLmVsLnNldFdpZHRoKCJhdXRvIik7DQogICAgICAgICAgICBpZihFeHQuaXNJRTcgJiYgRXh0LmlzU3RyaWN0KXsNCiAgICAgICAgICAgICAgICB2YXIgaWIgPSB0aGlzLmVsLmNoaWxkKCdidXR0b24nKTsNCiAgICAgICAgICAgICAgICBpZihpYiAmJiBpYi5nZXRXaWR0aCgpID4gMjApew0KICAgICAgICAgICAgICAgICAgICBpYi5jbGlwKCk7DQogICAgICAgICAgICAgICAgICAgIGliLnNldFdpZHRoKEV4dC51dGlsLlRleHRNZXRyaWNzLm1lYXN1cmUoaWIsIHRoaXMudGV4dCkud2lkdGgraWIuZ2V0RnJhbWVXaWR0aCgnbHInKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYodGhpcy5taW5XaWR0aCl7DQogICAgICAgICAgICAgICAgaWYodGhpcy5oaWRkZW4pew0KICAgICAgICAgICAgICAgICAgICB0aGlzLmVsLmJlZ2luTWVhc3VyZSgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZih0aGlzLmVsLmdldFdpZHRoKCkgPCB0aGlzLm1pbldpZHRoKXsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbC5zZXRXaWR0aCh0aGlzLm1pbldpZHRoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYodGhpcy5oaWRkZW4pew0KICAgICAgICAgICAgICAgICAgICB0aGlzLmVsLmVuZE1lYXN1cmUoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgDQogICAgc2V0SGFuZGxlciA6IGZ1bmN0aW9uKGhhbmRsZXIsIHNjb3BlKXsNCiAgICAgICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjsNCiAgICAgICAgdGhpcy5zY29wZSA9IHNjb3BlOyAgDQogICAgfSwNCiAgICANCiAgICANCiAgICBzZXRUZXh0IDogZnVuY3Rpb24odGV4dCl7DQogICAgICAgIHRoaXMudGV4dCA9IHRleHQ7DQogICAgICAgIGlmKHRoaXMuZWwpew0KICAgICAgICAgICAgdGhpcy5lbC5jaGlsZCgidGQueC1idG4tY2VudGVyIGJ1dHRvbi54LWJ0bi10ZXh0IikudXBkYXRlKHRleHQpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuYXV0b1dpZHRoKCk7DQogICAgfSwNCiAgICANCiAgICANCiAgICBnZXRUZXh0IDogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIHRoaXMudGV4dDsgIA0KICAgIH0sDQogICAgDQogICAgDQogICAgc2hvdzogZnVuY3Rpb24oKXsNCiAgICAgICAgdGhpcy5oaWRkZW4gPSBmYWxzZTsNCiAgICAgICAgaWYodGhpcy5lbCl7DQogICAgICAgICAgICB0aGlzW3RoaXMuaGlkZVBhcmVudD8gJ3BhcmVudEVsJyA6ICdlbCddLnNldFN0eWxlKCJkaXNwbGF5IiwgIiIpOw0KICAgICAgICB9DQogICAgfSwNCiAgICANCiAgICANCiAgICBoaWRlOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLmhpZGRlbiA9IHRydWU7DQogICAgICAgIGlmKHRoaXMuZWwpew0KICAgICAgICAgICAgdGhpc1t0aGlzLmhpZGVQYXJlbnQ/ICdwYXJlbnRFbCcgOiAnZWwnXS5zZXRTdHlsZSgiZGlzcGxheSIsICJub25lIik7DQogICAgICAgIH0NCiAgICB9LA0KICAgIA0KICAgIA0KICAgIHNldFZpc2libGU6IGZ1bmN0aW9uKHZpc2libGUpew0KICAgICAgICBpZih2aXNpYmxlKSB7DQogICAgICAgICAgICB0aGlzLnNob3coKTsNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICB0aGlzLmhpZGUoKTsNCiAgICAgICAgfQ0KICAgIH0sDQogICAgDQogICAgDQogICAgdG9nZ2xlIDogZnVuY3Rpb24oc3RhdGUpew0KICAgICAgICBzdGF0ZSA9IHN0YXRlID09PSB1bmRlZmluZWQgPyAhdGhpcy5wcmVzc2VkIDogc3RhdGU7DQogICAgICAgIGlmKHN0YXRlICE9IHRoaXMucHJlc3NlZCl7DQogICAgICAgICAgICBpZihzdGF0ZSl7DQogICAgICAgICAgICAgICAgdGhpcy5lbC5hZGRDbGFzcygieC1idG4tcHJlc3NlZCIpOw0KICAgICAgICAgICAgICAgIHRoaXMucHJlc3NlZCA9IHRydWU7DQogICAgICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoInRvZ2dsZSIsIHRoaXMsIHRydWUpOw0KICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgdGhpcy5lbC5yZW1vdmVDbGFzcygieC1idG4tcHJlc3NlZCIpOw0KICAgICAgICAgICAgICAgIHRoaXMucHJlc3NlZCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIHRoaXMuZmlyZUV2ZW50KCJ0b2dnbGUiLCB0aGlzLCBmYWxzZSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZih0aGlzLnRvZ2dsZUhhbmRsZXIpew0KICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlSGFuZGxlci5jYWxsKHRoaXMuc2NvcGUgfHwgdGhpcywgdGhpcywgc3RhdGUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSwNCiAgICANCiAgICANCiAgICBmb2N1cyA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHRoaXMuZWwuY2hpbGQoJ2J1dHRvbjpmaXJzdCcpLmZvY3VzKCk7DQogICAgfSwNCiAgICANCiAgICANCiAgICBkaXNhYmxlIDogZnVuY3Rpb24oKXsNCiAgICAgICAgaWYodGhpcy5lbCl7DQogICAgICAgICAgICB0aGlzLmVsLmFkZENsYXNzKCJ4LWJ0bi1kaXNhYmxlZCIpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuZGlzYWJsZWQgPSB0cnVlOw0KICAgIH0sDQogICAgDQogICAgDQogICAgZW5hYmxlIDogZnVuY3Rpb24oKXsNCiAgICAgICAgaWYodGhpcy5lbCl7DQogICAgICAgICAgICB0aGlzLmVsLnJlbW92ZUNsYXNzKCJ4LWJ0bi1kaXNhYmxlZCIpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuZGlzYWJsZWQgPSBmYWxzZTsNCiAgICB9LA0KDQogICAgDQogICAgc2V0RGlzYWJsZWQgOiBmdW5jdGlvbih2KXsNCiAgICAgICAgdGhpc1t2ICE9PSB0cnVlID8gImVuYWJsZSIgOiAiZGlzYWJsZSJdKCk7DQogICAgfSwNCg0KICAgIAogICAgb25DbGljayA6IGZ1bmN0aW9uKGUpew0KICAgICAgICBpZihlKXsNCiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsNCiAgICAgICAgfQ0KICAgICAgICBpZihlLmJ1dHRvbiAhPSAwKXsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KICAgICAgICBpZighdGhpcy5kaXNhYmxlZCl7DQogICAgICAgICAgICBpZih0aGlzLmVuYWJsZVRvZ2dsZSl7DQogICAgICAgICAgICAgICAgdGhpcy50b2dnbGUoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKHRoaXMubWVudSAmJiAhdGhpcy5tZW51LmlzVmlzaWJsZSgpKXsNCiAgICAgICAgICAgICAgICB0aGlzLm1lbnUuc2hvdyh0aGlzLmVsLCB0aGlzLm1lbnVBbGlnbik7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgiY2xpY2siLCB0aGlzLCBlKTsNCiAgICAgICAgICAgIGlmKHRoaXMuaGFuZGxlcil7DQogICAgICAgICAgICAgICAgdGhpcy5lbC5yZW1vdmVDbGFzcygieC1idG4tb3ZlciIpOw0KICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlci5jYWxsKHRoaXMuc2NvcGUgfHwgdGhpcywgdGhpcywgZSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9LA0KICAgIAogICAgb25Nb3VzZU92ZXIgOiBmdW5jdGlvbihlKXsNCiAgICAgICAgaWYoIXRoaXMuZGlzYWJsZWQpew0KICAgICAgICAgICAgdGhpcy5lbC5hZGRDbGFzcygieC1idG4tb3ZlciIpOw0KICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoJ21vdXNlb3ZlcicsIHRoaXMsIGUpOw0KICAgICAgICB9DQogICAgfSwNCiAgICAKICAgIG9uTW91c2VPdXQgOiBmdW5jdGlvbihlKXsNCiAgICAgICAgaWYoIWUud2l0aGluKHRoaXMuZWwsICB0cnVlKSl7DQogICAgICAgICAgICB0aGlzLmVsLnJlbW92ZUNsYXNzKCJ4LWJ0bi1vdmVyIik7DQogICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgnbW91c2VvdXQnLCB0aGlzLCBlKTsNCiAgICAgICAgfQ0KICAgIH0sDQogICAgCiAgICBvbkZvY3VzIDogZnVuY3Rpb24oZSl7DQogICAgICAgIGlmKCF0aGlzLmRpc2FibGVkKXsNCiAgICAgICAgICAgIHRoaXMuZWwuYWRkQ2xhc3MoIngtYnRuLWZvY3VzIik7DQogICAgICAgIH0NCiAgICB9LA0KICAgIAogICAgb25CbHVyIDogZnVuY3Rpb24oZSl7DQogICAgICAgIHRoaXMuZWwucmVtb3ZlQ2xhc3MoIngtYnRuLWZvY3VzIik7DQogICAgfSwNCiAgICAKICAgIG9uTW91c2VEb3duIDogZnVuY3Rpb24oZSl7DQogICAgICAgIGlmKCF0aGlzLmRpc2FibGVkICYmIGUuYnV0dG9uID09IDApew0KICAgICAgICAgICAgdGhpcy5lbC5hZGRDbGFzcygieC1idG4tY2xpY2siKTsNCiAgICAgICAgICAgIEV4dC5nZXQoZG9jdW1lbnQpLm9uKCdtb3VzZXVwJywgdGhpcy5vbk1vdXNlVXAsIHRoaXMpOw0KICAgICAgICB9DQogICAgfSwNCiAgICAKICAgIG9uTW91c2VVcCA6IGZ1bmN0aW9uKGUpew0KICAgICAgICBpZihlLmJ1dHRvbiA9PSAwKXsNCiAgICAgICAgICAgIHRoaXMuZWwucmVtb3ZlQ2xhc3MoIngtYnRuLWNsaWNrIik7DQogICAgICAgICAgICBFeHQuZ2V0KGRvY3VtZW50KS51bignbW91c2V1cCcsIHRoaXMub25Nb3VzZVVwLCB0aGlzKTsNCiAgICAgICAgfQ0KICAgIH0sDQogICAgCiAgICBvbk1lbnVTaG93IDogZnVuY3Rpb24oZSl7DQogICAgICAgIHRoaXMuZWwuYWRkQ2xhc3MoIngtYnRuLW1lbnUtYWN0aXZlIik7DQogICAgfSwNCiAgICAKICAgIG9uTWVudUhpZGUgOiBmdW5jdGlvbihlKXsNCiAgICAgICAgdGhpcy5lbC5yZW1vdmVDbGFzcygieC1idG4tbWVudS1hY3RpdmUiKTsNCiAgICB9ICAgDQp9KTsNCg0KCkV4dC5CdXR0b25Ub2dnbGVNZ3IgPSBmdW5jdGlvbigpew0KICAgdmFyIGdyb3VwcyA9IHt9Ow0KICAgDQogICBmdW5jdGlvbiB0b2dnbGVHcm91cChidG4sIHN0YXRlKXsNCiAgICAgICBpZihzdGF0ZSl7DQogICAgICAgICAgIHZhciBnID0gZ3JvdXBzW2J0bi50b2dnbGVHcm91cF07DQogICAgICAgICAgIGZvcih2YXIgaSA9IDAsIGwgPSBnLmxlbmd0aDsgaSA8IGw7IGkrKyl7DQogICAgICAgICAgICAgICBpZihnW2ldICE9IGJ0bil7DQogICAgICAgICAgICAgICAgICAgZ1tpXS50b2dnbGUoZmFsc2UpOw0KICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICB9DQogICAgICAgfQ0KICAgfQ0KICAgDQogICByZXR1cm4gew0KICAgICAgIHJlZ2lzdGVyIDogZnVuY3Rpb24oYnRuKXsNCiAgICAgICAgICAgaWYoIWJ0bi50b2dnbGVHcm91cCl7DQogICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgIH0NCiAgICAgICAgICAgdmFyIGcgPSBncm91cHNbYnRuLnRvZ2dsZUdyb3VwXTsNCiAgICAgICAgICAgaWYoIWcpew0KICAgICAgICAgICAgICAgZyA9IGdyb3Vwc1tidG4udG9nZ2xlR3JvdXBdID0gW107DQogICAgICAgICAgIH0NCiAgICAgICAgICAgZy5wdXNoKGJ0bik7DQogICAgICAgICAgIGJ0bi5vbigidG9nZ2xlIiwgdG9nZ2xlR3JvdXApOw0KICAgICAgIH0sDQogICAgICAgDQogICAgICAgdW5yZWdpc3RlciA6IGZ1bmN0aW9uKGJ0bil7DQogICAgICAgICAgIGlmKCFidG4udG9nZ2xlR3JvdXApew0KICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICB9DQogICAgICAgICAgIHZhciBnID0gZ3JvdXBzW2J0bi50b2dnbGVHcm91cF07DQogICAgICAgICAgIGlmKGcpew0KICAgICAgICAgICAgICAgZy5yZW1vdmUoYnRuKTsNCiAgICAgICAgICAgICAgIGJ0bi51bigidG9nZ2xlIiwgdG9nZ2xlR3JvdXApOw0KICAgICAgICAgICB9DQogICAgICAgfQ0KICAgfTsNCn0oKTsKDQpFeHQuU3BsaXRCdXR0b24gPSBmdW5jdGlvbihyZW5kZXJUbywgY29uZmlnKXsNCiAgICBFeHQuU3BsaXRCdXR0b24uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHJlbmRlclRvLCBjb25maWcpOw0KICAgIA0KICAgIHRoaXMuYWRkRXZlbnRzKHsiYXJyb3djbGljayI6dHJ1ZX0pOw0KfTsNCg0KRXh0LmV4dGVuZChFeHQuU3BsaXRCdXR0b24sIEV4dC5CdXR0b24sIHsNCiAgICByZW5kZXIgOiBmdW5jdGlvbihyZW5kZXJUbyl7DQogICAgICAgIAogICAgICAgIHZhciB0cGwgPSBuZXcgRXh0LlRlbXBsYXRlKA0KICAgICAgICAgICAgJzx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2xhc3M9IngtYnRuLW1lbnUtd3JhcCB4LWJ0biI+PHRyPjx0ZD4nLA0KICAgICAgICAgICAgJzx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2xhc3M9IngtYnRuLXdyYXAgeC1idG4tbWVudS10ZXh0LXdyYXAiPjx0Ym9keT4nLA0KICAgICAgICAgICAgJzx0cj48dGQgY2xhc3M9IngtYnRuLWxlZnQiPjxpPiYjMTYwOzwvaT48L3RkPjx0ZCBjbGFzcz0ieC1idG4tY2VudGVyIj48YnV0dG9uIGNsYXNzPSJ4LWJ0bi10ZXh0IiB0eXBlPSJ7MX0iPnswfTwvYnV0dG9uPjwvdGQ+PC90cj4nLA0KICAgICAgICAgICAgIjwvdGJvZHk+PC90YWJsZT48L3RkPjx0ZD4iLA0KICAgICAgICAgICAgJzx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2xhc3M9IngtYnRuLXdyYXAgeC1idG4tbWVudS1hcnJvdy13cmFwIj48dGJvZHk+JywNCiAgICAgICAgICAgICc8dHI+PHRkIGNsYXNzPSJ4LWJ0bi1jZW50ZXIiPjxidXR0b24gY2xhc3M9IngtYnRuLW1lbnUtYXJyb3ctZWwiIHR5cGU9ImJ1dHRvbiI+JiMxNjA7PC9idXR0b24+PC90ZD48dGQgY2xhc3M9IngtYnRuLXJpZ2h0Ij48aT4mIzE2MDs8L2k+PC90ZD48L3RyPicsDQogICAgICAgICAgICAiPC90Ym9keT48L3RhYmxlPjwvdGQ+PC90cj48L3RhYmxlPiINCiAgICAgICAgKTsNCiAgICAgICAgdmFyIGJ0biA9IHRwbC5hcHBlbmQocmVuZGVyVG8sIFt0aGlzLnRleHQsIHRoaXMudHlwZV0sIHRydWUpOw0KICAgICAgICB2YXIgYnRuRWwgPSBidG4uY2hpbGQoImJ1dHRvbiIpOw0KICAgICAgICBpZih0aGlzLmNscyl7DQogICAgICAgICAgICBidG4uYWRkQ2xhc3ModGhpcy5jbHMpOw0KICAgICAgICB9DQogICAgICAgIGlmKHRoaXMuaWNvbil7DQogICAgICAgICAgICBidG5FbC5zZXRTdHlsZSgnYmFja2dyb3VuZC1pbWFnZScsICd1cmwoJyArdGhpcy5pY29uICsnKScpOw0KICAgICAgICB9DQogICAgICAgIGlmKHRoaXMuaWNvbkNscyl7DQogICAgICAgICAgICBidG5FbC5hZGRDbGFzcyh0aGlzLmljb25DbHMpOw0KICAgICAgICAgICAgaWYoIXRoaXMuY2xzKXsNCiAgICAgICAgICAgICAgICBidG4uYWRkQ2xhc3ModGhpcy50ZXh0ID8gJ3gtYnRuLXRleHQtaWNvbicgOiAneC1idG4taWNvbicpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHRoaXMuZWwgPSBidG47DQogICAgICAgIGlmKHRoaXMuaGFuZGxlTW91c2VFdmVudHMpew0KICAgICAgICAgICAgYnRuLm9uKCJtb3VzZW92ZXIiLCB0aGlzLm9uTW91c2VPdmVyLCB0aGlzKTsNCiAgICAgICAgICAgIGJ0bi5vbigibW91c2VvdXQiLCB0aGlzLm9uTW91c2VPdXQsIHRoaXMpOw0KICAgICAgICAgICAgYnRuLm9uKCJtb3VzZWRvd24iLCB0aGlzLm9uTW91c2VEb3duLCB0aGlzKTsNCiAgICAgICAgICAgIGJ0bi5vbigibW91c2V1cCIsIHRoaXMub25Nb3VzZVVwLCB0aGlzKTsNCiAgICAgICAgfQ0KICAgICAgICBidG4ub24odGhpcy5jbGlja0V2ZW50LCB0aGlzLm9uQ2xpY2ssIHRoaXMpOw0KICAgICAgICBpZih0aGlzLnRvb2x0aXApew0KICAgICAgICAgICAgaWYodHlwZW9mIHRoaXMudG9vbHRpcCA9PSAnb2JqZWN0Jyl7DQogICAgICAgICAgICAgICAgRXh0LlF1aWNrVGlwcy50aXBzKEV4dC5hcHBseSh7DQogICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBidG5FbC5pZA0KICAgICAgICAgICAgICAgIH0sIHRoaXMudG9vbHRpcCkpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBidG5FbC5kb21bdGhpcy50b29sdGlwVHlwZV0gPSB0aGlzLnRvb2x0aXA7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgaWYodGhpcy5hcnJvd1Rvb2x0aXApew0KICAgICAgICAgICAgYnRuLmNoaWxkKCJidXR0b246bnRoKDIpIikuZG9tW3RoaXMudG9vbHRpcFR5cGVdID0gdGhpcy5hcnJvd1Rvb2x0aXA7DQogICAgICAgIH0NCiAgICAgICAgaWYodGhpcy5oaWRkZW4pew0KICAgICAgICAgICAgdGhpcy5oaWRlKCk7DQogICAgICAgIH0NCiAgICAgICAgaWYodGhpcy5kaXNhYmxlZCl7DQogICAgICAgICAgICB0aGlzLmRpc2FibGUoKTsNCiAgICAgICAgfQ0KICAgICAgICBpZih0aGlzLnByZXNzZWQpew0KICAgICAgICAgICAgdGhpcy5lbC5hZGRDbGFzcygieC1idG4tcHJlc3NlZCIpOw0KICAgICAgICB9DQogICAgICAgIGlmKEV4dC5pc0lFICYmICFFeHQuaXNJRTcpew0KICAgICAgICAgICAgdGhpcy5hdXRvV2lkdGguZGVmZXIoMSwgdGhpcyk7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgdGhpcy5hdXRvV2lkdGgoKTsNCiAgICAgICAgfQ0KICAgICAgICBpZih0aGlzLm1lbnUpew0KICAgICAgICAgICAgdGhpcy5tZW51Lm9uKCJzaG93IiwgdGhpcy5vbk1lbnVTaG93LCB0aGlzKTsNCiAgICAgICAgICAgIHRoaXMubWVudS5vbigiaGlkZSIsIHRoaXMub25NZW51SGlkZSwgdGhpcyk7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgCiAgICBhdXRvV2lkdGggOiBmdW5jdGlvbigpew0KICAgICAgICBpZih0aGlzLmVsKXsNCiAgICAgICAgICAgIHZhciB0YmwgPSB0aGlzLmVsLmNoaWxkKCJ0YWJsZTpmaXJzdCIpOw0KICAgICAgICAgICAgdmFyIHRibDIgPSB0aGlzLmVsLmNoaWxkKCJ0YWJsZTpsYXN0Iik7DQogICAgICAgICAgICB0aGlzLmVsLnNldFdpZHRoKCJhdXRvIik7DQogICAgICAgICAgICB0Ymwuc2V0V2lkdGgoImF1dG8iKTsNCiAgICAgICAgICAgIGlmKEV4dC5pc0lFNyAmJiBFeHQuaXNTdHJpY3Qpew0KICAgICAgICAgICAgICAgIHZhciBpYiA9IHRoaXMuZWwuY2hpbGQoJ2J1dHRvbjpmaXJzdCcpOw0KICAgICAgICAgICAgICAgIGlmKGliICYmIGliLmdldFdpZHRoKCkgPiAyMCl7DQogICAgICAgICAgICAgICAgICAgIGliLmNsaXAoKTsNCiAgICAgICAgICAgICAgICAgICAgaWIuc2V0V2lkdGgoRXh0LnV0aWwuVGV4dE1ldHJpY3MubWVhc3VyZShpYiwgdGhpcy50ZXh0KS53aWR0aCtpYi5nZXRGcmFtZVdpZHRoKCdscicpKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZih0aGlzLm1pbldpZHRoKXsNCiAgICAgICAgICAgICAgICBpZih0aGlzLmhpZGRlbil7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuZWwuYmVnaW5NZWFzdXJlKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmKCh0YmwuZ2V0V2lkdGgoKSt0YmwyLmdldFdpZHRoKCkpIDwgdGhpcy5taW5XaWR0aCl7DQogICAgICAgICAgICAgICAgICAgIHRibC5zZXRXaWR0aCh0aGlzLm1pbldpZHRoLXRibDIuZ2V0V2lkdGgoKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmKHRoaXMuaGlkZGVuKXsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbC5lbmRNZWFzdXJlKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5lbC5zZXRXaWR0aCh0YmwuZ2V0V2lkdGgoKSt0YmwyLmdldFdpZHRoKCkpOw0KICAgICAgICB9IA0KICAgIH0sDQogICAgDQogICAgc2V0SGFuZGxlciA6IGZ1bmN0aW9uKGhhbmRsZXIsIHNjb3BlKXsNCiAgICAgICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjsNCiAgICAgICAgdGhpcy5zY29wZSA9IHNjb3BlOyAgDQogICAgfSwNCiAgICANCiAgICANCiAgICBzZXRBcnJvd0hhbmRsZXIgOiBmdW5jdGlvbihoYW5kbGVyLCBzY29wZSl7DQogICAgICAgIHRoaXMuYXJyb3dIYW5kbGVyID0gaGFuZGxlcjsNCiAgICAgICAgdGhpcy5zY29wZSA9IHNjb3BlOyAgDQogICAgfSwNCiAgICANCiAgICANCiAgICBmb2N1cyA6IGZ1bmN0aW9uKCl7DQogICAgICAgIGlmKHRoaXMuZWwpew0KICAgICAgICAgICAgdGhpcy5lbC5jaGlsZCgiYnV0dG9uOmZpcnN0IikuZm9jdXMoKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICAKICAgIG9uQ2xpY2sgOiBmdW5jdGlvbihlKXsNCiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOw0KICAgICAgICBpZighdGhpcy5kaXNhYmxlZCl7DQogICAgICAgICAgICBpZihlLmdldFRhcmdldCgiLngtYnRuLW1lbnUtYXJyb3ctd3JhcCIpKXsNCiAgICAgICAgICAgICAgICBpZih0aGlzLm1lbnUgJiYgIXRoaXMubWVudS5pc1Zpc2libGUoKSl7DQogICAgICAgICAgICAgICAgICAgIHRoaXMubWVudS5zaG93KHRoaXMuZWwsIHRoaXMubWVudUFsaWduKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoImFycm93Y2xpY2siLCB0aGlzLCBlKTsNCiAgICAgICAgICAgICAgICBpZih0aGlzLmFycm93SGFuZGxlcil7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuYXJyb3dIYW5kbGVyLmNhbGwodGhpcy5zY29wZSB8fCB0aGlzLCB0aGlzLCBlKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgiY2xpY2siLCB0aGlzLCBlKTsNCiAgICAgICAgICAgICAgICBpZih0aGlzLmhhbmRsZXIpew0KICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZXIuY2FsbCh0aGlzLnNjb3BlIHx8IHRoaXMsIHRoaXMsIGUpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0sDQogICAgCiAgICBvbk1vdXNlRG93biA6IGZ1bmN0aW9uKGUpew0KICAgICAgICBpZighdGhpcy5kaXNhYmxlZCl7DQogICAgICAgICAgICBFeHQuZmx5KGUuZ2V0VGFyZ2V0KCJ0YWJsZSIpKS5hZGRDbGFzcygieC1idG4tY2xpY2siKTsNCiAgICAgICAgfQ0KICAgIH0sDQogICAgCiAgICBvbk1vdXNlVXAgOiBmdW5jdGlvbihlKXsNCiAgICAgICAgRXh0LmZseShlLmdldFRhcmdldCgidGFibGUiKSkucmVtb3ZlQ2xhc3MoIngtYnRuLWNsaWNrIik7DQogICAgfSAgIA0KfSk7DQoNCgpFeHQuTWVudUJ1dHRvbiA9IEV4dC5TcGxpdEJ1dHRvbjsKIA0KRXh0LlRvb2xiYXIgPSBmdW5jdGlvbihjb250YWluZXIsIGJ1dHRvbnMsIGNvbmZpZyl7DQogICAgaWYoY29udGFpbmVyIGluc3RhbmNlb2YgQXJyYXkpeyAKICAgICAgICBidXR0b25zID0gY29udGFpbmVyOw0KICAgICAgICBjb25maWcgPSBidXR0b25zOw0KICAgICAgICBjb250YWluZXIgPSBudWxsOw0KICAgIH0NCiAgICBFeHQuYXBwbHkodGhpcywgY29uZmlnKTsNCiAgICB0aGlzLmJ1dHRvbnMgPSBidXR0b25zOw0KICAgIGlmKGNvbnRhaW5lcil7DQogICAgICAgIHRoaXMucmVuZGVyKGNvbnRhaW5lcik7DQogICAgfQ0KfTsNCg0KRXh0LlRvb2xiYXIucHJvdG90eXBlID0gew0KICAgIAogICAgcmVuZGVyIDogZnVuY3Rpb24oY3Qpew0KICAgICAgICB0aGlzLmVsID0gRXh0LmdldChjdCk7DQogICAgICAgIGlmKHRoaXMuY2xzKXsNCiAgICAgICAgICAgIHRoaXMuZWwuYWRkQ2xhc3ModGhpcy5jbHMpOw0KICAgICAgICB9DQogICAgICAgIAogICAgICAgIHRoaXMuZWwudXBkYXRlKCc8ZGl2IGNsYXNzPSJ4LXRvb2xiYXIgeC1zbWFsbC1lZGl0b3IiPjx0YWJsZSBjZWxsc3BhY2luZz0iMCI+PHRyPjwvdHI+PC90YWJsZT48L2Rpdj4nKTsNCiAgICAgICAgdGhpcy50ciA9IHRoaXMuZWwuY2hpbGQoInRyIiwgdHJ1ZSk7DQogICAgICAgIHZhciBhdXRvSWQgPSAwOw0KICAgICAgICB0aGlzLml0ZW1zID0gbmV3IEV4dC51dGlsLk1peGVkQ29sbGVjdGlvbihmYWxzZSwgZnVuY3Rpb24obyl7DQogICAgICAgICAgICByZXR1cm4gby5pZCB8fCAoIml0ZW0iICsgKCsrYXV0b0lkKSk7DQogICAgICAgIH0pOw0KICAgICAgICBpZih0aGlzLmJ1dHRvbnMpew0KICAgICAgICAgICAgdGhpcy5hZGQuYXBwbHkodGhpcywgdGhpcy5idXR0b25zKTsNCiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmJ1dHRvbnM7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgDQogICAgYWRkIDogZnVuY3Rpb24oKXsNCiAgICAgICAgdmFyIGEgPSBhcmd1bWVudHMsIGwgPSBhLmxlbmd0aDsNCiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGw7IGkrKyl7DQogICAgICAgICAgICB2YXIgZWwgPSBhW2ldOw0KICAgICAgICAgICAgaWYoZWwuYXBwbHlUbyl7IAogICAgICAgICAgICAgICAgdGhpcy5hZGRGaWVsZChlbCk7DQogICAgICAgICAgICB9ZWxzZSBpZihlbC5yZW5kZXIpeyAKICAgICAgICAgICAgICAgIHRoaXMuYWRkSXRlbShlbCk7DQogICAgICAgICAgICB9ZWxzZSBpZih0eXBlb2YgZWwgPT0gInN0cmluZyIpeyAKICAgICAgICAgICAgICAgIGlmKGVsID09ICJzZXBhcmF0b3IiIHx8IGVsID09ICItIil7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkU2VwYXJhdG9yKCk7DQogICAgICAgICAgICAgICAgfWVsc2UgaWYoZWwgPT0gIiAiKXsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRTcGFjZXIoKTsNCiAgICAgICAgICAgICAgICB9ZWxzZSBpZihlbCA9PSAiLT4iKXsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRGaWxsKCk7DQogICAgICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkVGV4dChlbCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfWVsc2UgaWYoZWwudGFnTmFtZSl7IAogICAgICAgICAgICAgICAgdGhpcy5hZGRFbGVtZW50KGVsKTsNCiAgICAgICAgICAgIH1lbHNlIGlmKHR5cGVvZiBlbCA9PSAib2JqZWN0Iil7IAogICAgICAgICAgICAgICAgdGhpcy5hZGRCdXR0b24oZWwpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSwNCiAgICANCiAgICANCiAgICBnZXRFbCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLmVsOyAgDQogICAgfSwNCiAgICANCiAgICANCiAgICBhZGRTZXBhcmF0b3IgOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gdGhpcy5hZGRJdGVtKG5ldyBFeHQuVG9vbGJhci5TZXBhcmF0b3IoKSk7DQogICAgfSwNCg0KICAgIA0KICAgIGFkZFNwYWNlciA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLmFkZEl0ZW0obmV3IEV4dC5Ub29sYmFyLlNwYWNlcigpKTsNCiAgICB9LA0KDQogICAgDQogICAgYWRkRmlsbCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLmFkZEl0ZW0obmV3IEV4dC5Ub29sYmFyLkZpbGwoKSk7DQogICAgfSwNCg0KICAgIA0KICAgIGFkZEVsZW1lbnQgOiBmdW5jdGlvbihlbCl7DQogICAgICAgIHJldHVybiB0aGlzLmFkZEl0ZW0obmV3IEV4dC5Ub29sYmFyLkl0ZW0oZWwpKTsNCiAgICB9LA0KICAgIA0KICAgIA0KICAgIGFkZEl0ZW0gOiBmdW5jdGlvbihpdGVtKXsNCiAgICAgICAgdmFyIHRkID0gdGhpcy5uZXh0QmxvY2soKTsNCiAgICAgICAgaXRlbS5yZW5kZXIodGQpOw0KICAgICAgICB0aGlzLml0ZW1zLmFkZChpdGVtKTsNCiAgICAgICAgcmV0dXJuIGl0ZW07DQogICAgfSwNCiAgICANCiAgICANCiAgICBhZGRCdXR0b24gOiBmdW5jdGlvbihjb25maWcpew0KICAgICAgICBpZihjb25maWcgaW5zdGFuY2VvZiBBcnJheSl7DQogICAgICAgICAgICB2YXIgYnV0dG9ucyA9IFtdOw0KICAgICAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gY29uZmlnLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7DQogICAgICAgICAgICAgICAgYnV0dG9ucy5wdXNoKHRoaXMuYWRkQnV0dG9uKGNvbmZpZ1tpXSkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIGJ1dHRvbnM7DQogICAgICAgIH0NCiAgICAgICAgdmFyIGIgPSBjb25maWc7DQogICAgICAgIGlmKCEoY29uZmlnIGluc3RhbmNlb2YgRXh0LlRvb2xiYXIuQnV0dG9uKSl7DQogICAgICAgICAgICBiID0gY29uZmlnLnNwbGl0ID8NCiAgICAgICAgICAgICAgICBuZXcgRXh0LlRvb2xiYXIuU3BsaXRCdXR0b24oY29uZmlnKSA6DQogICAgICAgICAgICAgICAgbmV3IEV4dC5Ub29sYmFyLkJ1dHRvbihjb25maWcpOw0KICAgICAgICB9DQogICAgICAgIHZhciB0ZCA9IHRoaXMubmV4dEJsb2NrKCk7DQogICAgICAgIGIucmVuZGVyKHRkKTsNCiAgICAgICAgdGhpcy5pdGVtcy5hZGQoYik7DQogICAgICAgIHJldHVybiBiOw0KICAgIH0sDQogICAgDQogICAgDQogICAgYWRkVGV4dCA6IGZ1bmN0aW9uKHRleHQpew0KICAgICAgICByZXR1cm4gdGhpcy5hZGRJdGVtKG5ldyBFeHQuVG9vbGJhci5UZXh0SXRlbSh0ZXh0KSk7DQogICAgfSwNCiAgICANCiAgICANCiAgICBpbnNlcnRCdXR0b24gOiBmdW5jdGlvbihpbmRleCwgaXRlbSl7DQogICAgICAgIGlmKGl0ZW0gaW5zdGFuY2VvZiBBcnJheSl7DQogICAgICAgICAgICB2YXIgYnV0dG9ucyA9IFtdOw0KICAgICAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gaXRlbS5sZW5ndGg7IGkgPCBsZW47IGkrKykgew0KICAgICAgICAgICAgICAgYnV0dG9ucy5wdXNoKHRoaXMuaW5zZXJ0QnV0dG9uKGluZGV4ICsgaSwgaXRlbVtpXSkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIGJ1dHRvbnM7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCEoaXRlbSBpbnN0YW5jZW9mIEV4dC5Ub29sYmFyLkJ1dHRvbikpew0KICAgICAgICAgICBpdGVtID0gbmV3IEV4dC5Ub29sYmFyLkJ1dHRvbihpdGVtKTsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOw0KICAgICAgICB0aGlzLnRyLmluc2VydEJlZm9yZSh0ZCwgdGhpcy50ci5jaGlsZE5vZGVzW2luZGV4XSk7DQogICAgICAgIGl0ZW0ucmVuZGVyKHRkKTsNCiAgICAgICAgdGhpcy5pdGVtcy5pbnNlcnQoaW5kZXgsIGl0ZW0pOw0KICAgICAgICByZXR1cm4gaXRlbTsNCiAgICB9LA0KICAgIA0KICAgIA0KICAgIGFkZERvbSA6IGZ1bmN0aW9uKGNvbmZpZywgcmV0dXJuRWwpew0KICAgICAgICB2YXIgdGQgPSB0aGlzLm5leHRCbG9jaygpOw0KICAgICAgICBFeHQuRG9tSGVscGVyLm92ZXJ3cml0ZSh0ZCwgY29uZmlnKTsNCiAgICAgICAgdmFyIHRpID0gbmV3IEV4dC5Ub29sYmFyLkl0ZW0odGQuZmlyc3RDaGlsZCk7DQogICAgICAgIHRpLnJlbmRlcih0ZCk7DQogICAgICAgIHRoaXMuaXRlbXMuYWRkKHRpKTsNCiAgICAgICAgcmV0dXJuIHRpOw0KICAgIH0sDQoNCiAgICANCiAgICBhZGRGaWVsZCA6IGZ1bmN0aW9uKGZpZWxkKXsNCiAgICAgICAgdmFyIHRkID0gdGhpcy5uZXh0QmxvY2soKTsNCiAgICAgICAgZmllbGQucmVuZGVyKHRkKTsNCiAgICAgICAgdmFyIHRpID0gbmV3IEV4dC5Ub29sYmFyLkl0ZW0odGQuZmlyc3RDaGlsZCk7DQogICAgICAgIHRpLnJlbmRlcih0ZCk7DQogICAgICAgIHRoaXMuaXRlbXMuYWRkKHRpKTsNCiAgICAgICAgcmV0dXJuIHRpOw0KICAgIH0sDQoNCiAgICAKICAgIG5leHRCbG9jayA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHZhciB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7DQogICAgICAgIHRoaXMudHIuYXBwZW5kQ2hpbGQodGQpOw0KICAgICAgICByZXR1cm4gdGQ7DQogICAgfSwNCg0KICAgIAogICAgZGVzdHJveSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIGlmKHRoaXMuaXRlbXMpeyAKICAgICAgICAgICAgRXh0LmRlc3Ryb3kuYXBwbHkoRXh0LCB0aGlzLml0ZW1zLml0ZW1zKTsNCiAgICAgICAgfQ0KICAgICAgICBFeHQuRWxlbWVudC51bmNhY2hlKHRoaXMuZWwsIHRoaXMudHIpOw0KICAgIH0NCn07DQoNCg0KRXh0LlRvb2xiYXIuSXRlbSA9IGZ1bmN0aW9uKGVsKXsNCiAgICB0aGlzLmVsID0gRXh0LmdldERvbShlbCk7DQogICAgdGhpcy5pZCA9IEV4dC5pZCh0aGlzLmVsKTsNCiAgICB0aGlzLmhpZGRlbiA9IGZhbHNlOw0KfTsNCg0KRXh0LlRvb2xiYXIuSXRlbS5wcm90b3R5cGUgPSB7DQogICAgDQogICAgDQogICAgZ2V0RWwgOiBmdW5jdGlvbigpew0KICAgICAgIHJldHVybiB0aGlzLmVsOyAgDQogICAgfSwNCg0KICAgIAogICAgcmVuZGVyIDogZnVuY3Rpb24odGQpew0KICAgICAgICB0aGlzLnRkID0gdGQ7DQogICAgICAgIHRkLmFwcGVuZENoaWxkKHRoaXMuZWwpOw0KICAgIH0sDQogICAgDQogICAgDQogICAgZGVzdHJveSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHRoaXMudGQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnRkKTsNCiAgICB9LA0KICAgIA0KICAgIA0KICAgIHNob3c6IGZ1bmN0aW9uKCl7DQogICAgICAgIHRoaXMuaGlkZGVuID0gZmFsc2U7DQogICAgICAgIHRoaXMudGQuc3R5bGUuZGlzcGxheSA9ICIiOw0KICAgIH0sDQogICAgDQogICAgDQogICAgaGlkZTogZnVuY3Rpb24oKXsNCiAgICAgICAgdGhpcy5oaWRkZW4gPSB0cnVlOw0KICAgICAgICB0aGlzLnRkLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7DQogICAgfSwNCiAgICANCiAgICANCiAgICBzZXRWaXNpYmxlOiBmdW5jdGlvbih2aXNpYmxlKXsNCiAgICAgICAgaWYodmlzaWJsZSkgew0KICAgICAgICAgICAgdGhpcy5zaG93KCk7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgdGhpcy5oaWRlKCk7DQogICAgICAgIH0NCiAgICB9LA0KICAgIA0KICAgIA0KICAgIGZvY3VzIDogZnVuY3Rpb24oKXsNCiAgICAgICAgRXh0LmZseSh0aGlzLmVsKS5mb2N1cygpOw0KICAgIH0sDQogICAgDQogICAgDQogICAgZGlzYWJsZSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIEV4dC5mbHkodGhpcy50ZCkuYWRkQ2xhc3MoIngtaXRlbS1kaXNhYmxlZCIpOw0KICAgICAgICB0aGlzLmRpc2FibGVkID0gdHJ1ZTsNCiAgICAgICAgdGhpcy5lbC5kaXNhYmxlZCA9IHRydWU7DQogICAgfSwNCiAgICANCiAgICANCiAgICBlbmFibGUgOiBmdW5jdGlvbigpew0KICAgICAgICBFeHQuZmx5KHRoaXMudGQpLnJlbW92ZUNsYXNzKCJ4LWl0ZW0tZGlzYWJsZWQiKTsNCiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGZhbHNlOw0KICAgICAgICB0aGlzLmVsLmRpc2FibGVkID0gZmFsc2U7DQogICAgfQ0KfTsNCg0KDQoNCkV4dC5Ub29sYmFyLlNlcGFyYXRvciA9IGZ1bmN0aW9uKCl7DQogICAgdmFyIHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7DQogICAgcy5jbGFzc05hbWUgPSAieXRiLXNlcCI7DQogICAgRXh0LlRvb2xiYXIuU2VwYXJhdG9yLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBzKTsNCn07DQpFeHQuZXh0ZW5kKEV4dC5Ub29sYmFyLlNlcGFyYXRvciwgRXh0LlRvb2xiYXIuSXRlbSwgew0KICAgIGVuYWJsZTpFeHQuZW1wdHlGbiwNCiAgICBkaXNhYmxlOkV4dC5lbXB0eUZuLA0KICAgIGZvY3VzOkV4dC5lbXB0eUZuDQp9KTsNCg0KDQpFeHQuVG9vbGJhci5TcGFjZXIgPSBmdW5jdGlvbigpew0KICAgIHZhciBzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQogICAgcy5jbGFzc05hbWUgPSAieXRiLXNwYWNlciI7DQogICAgRXh0LlRvb2xiYXIuU3BhY2VyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBzKTsNCn07DQpFeHQuZXh0ZW5kKEV4dC5Ub29sYmFyLlNwYWNlciwgRXh0LlRvb2xiYXIuSXRlbSwgew0KICAgIGVuYWJsZTpFeHQuZW1wdHlGbiwNCiAgICBkaXNhYmxlOkV4dC5lbXB0eUZuLA0KICAgIGZvY3VzOkV4dC5lbXB0eUZuDQp9KTsNCg0KDQpFeHQuVG9vbGJhci5GaWxsID0gRXh0LmV4dGVuZChFeHQuVG9vbGJhci5TcGFjZXIsIHsNCiAgICAKICAgIHJlbmRlciA6IGZ1bmN0aW9uKHRkKXsNCiAgICAgICAgdGQuc3R5bGUud2lkdGggPSAnMTAwJSc7DQogICAgICAgIEV4dC5Ub29sYmFyLkZpbGwuc3VwZXJjbGFzcy5yZW5kZXIuY2FsbCh0aGlzLCB0ZCk7DQogICAgfQ0KfSk7DQoNCg0KRXh0LlRvb2xiYXIuVGV4dEl0ZW0gPSBmdW5jdGlvbih0ZXh0KXsNCiAgICB2YXIgcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTsNCiAgICBzLmNsYXNzTmFtZSA9ICJ5dGItdGV4dCI7DQogICAgcy5pbm5lckhUTUwgPSB0ZXh0Ow0KICAgIEV4dC5Ub29sYmFyLlRleHRJdGVtLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBzKTsNCn07DQpFeHQuZXh0ZW5kKEV4dC5Ub29sYmFyLlRleHRJdGVtLCBFeHQuVG9vbGJhci5JdGVtLCB7DQogICAgZW5hYmxlOkV4dC5lbXB0eUZuLA0KICAgIGRpc2FibGU6RXh0LmVtcHR5Rm4sDQogICAgZm9jdXM6RXh0LmVtcHR5Rm4NCn0pOw0KDQoNCkV4dC5Ub29sYmFyLkJ1dHRvbiA9IGZ1bmN0aW9uKGNvbmZpZyl7DQogICAgRXh0LlRvb2xiYXIuQnV0dG9uLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBudWxsLCBjb25maWcpOw0KfTsNCkV4dC5leHRlbmQoRXh0LlRvb2xiYXIuQnV0dG9uLCBFeHQuQnV0dG9uLCB7DQogICAgcmVuZGVyIDogZnVuY3Rpb24odGQpew0KICAgICAgICB0aGlzLnRkID0gdGQ7DQogICAgICAgIEV4dC5Ub29sYmFyLkJ1dHRvbi5zdXBlcmNsYXNzLnJlbmRlci5jYWxsKHRoaXMsIHRkKTsNCiAgICB9LA0KICAgIA0KICAgIA0KICAgIGRlc3Ryb3kgOiBmdW5jdGlvbigpew0KICAgICAgICBFeHQuVG9vbGJhci5CdXR0b24uc3VwZXJjbGFzcy5kZXN0cm95LmNhbGwodGhpcyk7DQogICAgICAgIHRoaXMudGQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnRkKTsNCiAgICB9LA0KICAgIA0KICAgIA0KICAgIHNob3c6IGZ1bmN0aW9uKCl7DQogICAgICAgIHRoaXMuaGlkZGVuID0gZmFsc2U7DQogICAgICAgIHRoaXMudGQuc3R5bGUuZGlzcGxheSA9ICIiOw0KICAgIH0sDQogICAgDQogICAgDQogICAgaGlkZTogZnVuY3Rpb24oKXsNCiAgICAgICAgdGhpcy5oaWRkZW4gPSB0cnVlOw0KICAgICAgICB0aGlzLnRkLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7DQogICAgfSwNCg0KICAgIA0KICAgIGRpc2FibGUgOiBmdW5jdGlvbigpew0KICAgICAgICBFeHQuZmx5KHRoaXMudGQpLmFkZENsYXNzKCJ4LWl0ZW0tZGlzYWJsZWQiKTsNCiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IHRydWU7DQogICAgfSwNCg0KICAgIA0KICAgIGVuYWJsZSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIEV4dC5mbHkodGhpcy50ZCkucmVtb3ZlQ2xhc3MoIngtaXRlbS1kaXNhYmxlZCIpOw0KICAgICAgICB0aGlzLmRpc2FibGVkID0gZmFsc2U7DQogICAgfQ0KfSk7DQoKRXh0LlRvb2xiYXJCdXR0b24gPSBFeHQuVG9vbGJhci5CdXR0b247DQoNCg0KRXh0LlRvb2xiYXIuU3BsaXRCdXR0b24gPSBmdW5jdGlvbihjb25maWcpew0KICAgIEV4dC5Ub29sYmFyLlNwbGl0QnV0dG9uLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBudWxsLCBjb25maWcpOw0KfTsNCkV4dC5leHRlbmQoRXh0LlRvb2xiYXIuU3BsaXRCdXR0b24sIEV4dC5TcGxpdEJ1dHRvbiwgew0KICAgIHJlbmRlciA6IGZ1bmN0aW9uKHRkKXsNCiAgICAgICAgdGhpcy50ZCA9IHRkOw0KICAgICAgICBFeHQuVG9vbGJhci5TcGxpdEJ1dHRvbi5zdXBlcmNsYXNzLnJlbmRlci5jYWxsKHRoaXMsIHRkKTsNCiAgICB9LA0KICAgIA0KICAgIA0KICAgIGRlc3Ryb3kgOiBmdW5jdGlvbigpew0KICAgICAgICBFeHQuVG9vbGJhci5TcGxpdEJ1dHRvbi5zdXBlcmNsYXNzLmRlc3Ryb3kuY2FsbCh0aGlzKTsNCiAgICAgICAgdGhpcy50ZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMudGQpOw0KICAgIH0sDQogICAgDQogICAgDQogICAgc2hvdzogZnVuY3Rpb24oKXsNCiAgICAgICAgdGhpcy5oaWRkZW4gPSBmYWxzZTsNCiAgICAgICAgdGhpcy50ZC5zdHlsZS5kaXNwbGF5ID0gIiI7DQogICAgfSwNCiAgICANCiAgICANCiAgICBoaWRlOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLmhpZGRlbiA9IHRydWU7DQogICAgICAgIHRoaXMudGQuc3R5bGUuZGlzcGxheSA9ICJub25lIjsNCiAgICB9DQp9KTsNCg0KCkV4dC5Ub29sYmFyLk1lbnVCdXR0b24gPSBFeHQuVG9vbGJhci5TcGxpdEJ1dHRvbjsKCkV4dC5QYWdpbmdUb29sYmFyID0gZnVuY3Rpb24oZWwsIGRzLCBjb25maWcpewogICAgRXh0LlBhZ2luZ1Rvb2xiYXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIGVsLCBudWxsLCBjb25maWcpOwogICAgdGhpcy5kcyA9IGRzOwogICAgdGhpcy5jdXJzb3IgPSAwOwogICAgdGhpcy5yZW5kZXJCdXR0b25zKHRoaXMuZWwpOwogICAgdGhpcy5iaW5kKGRzKTsKfTsKCkV4dC5leHRlbmQoRXh0LlBhZ2luZ1Rvb2xiYXIsIEV4dC5Ub29sYmFyLCB7CiAgICAKICAgIAogICAgcGFnZVNpemU6IDIwLAogICAgCiAgICBkaXNwbGF5TXNnIDogJ0Rpc3BsYXlpbmcgezB9IC0gezF9IG9mIHsyfScsCiAgICAKICAgIGVtcHR5TXNnIDogJ05vIGRhdGEgdG8gZGlzcGxheScsCiAgICAKICAgIGJlZm9yZVBhZ2VUZXh0IDogIlBhZ2UiLAogICAgCiAgICBhZnRlclBhZ2VUZXh0IDogIm9mIHswfSIsCiAgICAKICAgIGZpcnN0VGV4dCA6ICJGaXJzdCBQYWdlIiwKICAgIAogICAgcHJldlRleHQgOiAiUHJldmlvdXMgUGFnZSIsCiAgICAKICAgIG5leHRUZXh0IDogIk5leHQgUGFnZSIsCiAgICAKICAgIGxhc3RUZXh0IDogIkxhc3QgUGFnZSIsCiAgICAKICAgIHJlZnJlc2hUZXh0IDogIlJlZnJlc2giLAoKICAgICAgICByZW5kZXJCdXR0b25zIDogZnVuY3Rpb24oZWwpewogICAgICAgIEV4dC5QYWdpbmdUb29sYmFyLnN1cGVyY2xhc3MucmVuZGVyLmNhbGwodGhpcywgZWwpOwogICAgICAgIHRoaXMuZmlyc3QgPSB0aGlzLmFkZEJ1dHRvbih7CiAgICAgICAgICAgIHRvb2x0aXA6IHRoaXMuZmlyc3RUZXh0LAogICAgICAgICAgICBjbHM6ICJ4LWJ0bi1pY29uIHgtZ3JpZC1wYWdlLWZpcnN0IiwKICAgICAgICAgICAgZGlzYWJsZWQ6IHRydWUsCiAgICAgICAgICAgIGhhbmRsZXI6IHRoaXMub25DbGljay5jcmVhdGVEZWxlZ2F0ZSh0aGlzLCBbImZpcnN0Il0pCiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5wcmV2ID0gdGhpcy5hZGRCdXR0b24oewogICAgICAgICAgICB0b29sdGlwOiB0aGlzLnByZXZUZXh0LAogICAgICAgICAgICBjbHM6ICJ4LWJ0bi1pY29uIHgtZ3JpZC1wYWdlLXByZXYiLAogICAgICAgICAgICBkaXNhYmxlZDogdHJ1ZSwKICAgICAgICAgICAgaGFuZGxlcjogdGhpcy5vbkNsaWNrLmNyZWF0ZURlbGVnYXRlKHRoaXMsIFsicHJldiJdKQogICAgICAgIH0pOwogICAgICAgIHRoaXMuYWRkU2VwYXJhdG9yKCk7CiAgICAgICAgdGhpcy5hZGQodGhpcy5iZWZvcmVQYWdlVGV4dCk7CiAgICAgICAgdGhpcy5maWVsZCA9IEV4dC5nZXQodGhpcy5hZGREb20oewogICAgICAgICAgIHRhZzogImlucHV0IiwKICAgICAgICAgICB0eXBlOiAidGV4dCIsCiAgICAgICAgICAgc2l6ZTogIjMiLAogICAgICAgICAgIHZhbHVlOiAiMSIsCiAgICAgICAgICAgY2xzOiAieC1ncmlkLXBhZ2UtbnVtYmVyIgogICAgICAgIH0pLmVsKTsKICAgICAgICB0aGlzLmZpZWxkLm9uKCJrZXlkb3duIiwgdGhpcy5vblBhZ2luZ0tleWRvd24sIHRoaXMpOwogICAgICAgIHRoaXMuZmllbGQub24oImZvY3VzIiwgZnVuY3Rpb24oKXt0aGlzLmRvbS5zZWxlY3QoKTt9KTsKICAgICAgICB0aGlzLmFmdGVyVGV4dEVsID0gdGhpcy5hZGRUZXh0KFN0cmluZy5mb3JtYXQodGhpcy5hZnRlclBhZ2VUZXh0LCAxKSk7CiAgICAgICAgdGhpcy5maWVsZC5zZXRIZWlnaHQoMTgpOwogICAgICAgIHRoaXMuYWRkU2VwYXJhdG9yKCk7CiAgICAgICAgdGhpcy5uZXh0ID0gdGhpcy5hZGRCdXR0b24oewogICAgICAgICAgICB0b29sdGlwOiB0aGlzLm5leHRUZXh0LAogICAgICAgICAgICBjbHM6ICJ4LWJ0bi1pY29uIHgtZ3JpZC1wYWdlLW5leHQiLAogICAgICAgICAgICBkaXNhYmxlZDogdHJ1ZSwKICAgICAgICAgICAgaGFuZGxlcjogdGhpcy5vbkNsaWNrLmNyZWF0ZURlbGVnYXRlKHRoaXMsIFsibmV4dCJdKQogICAgICAgIH0pOwogICAgICAgIHRoaXMubGFzdCA9IHRoaXMuYWRkQnV0dG9uKHsKICAgICAgICAgICAgdG9vbHRpcDogdGhpcy5sYXN0VGV4dCwKICAgICAgICAgICAgY2xzOiAieC1idG4taWNvbiB4LWdyaWQtcGFnZS1sYXN0IiwKICAgICAgICAgICAgZGlzYWJsZWQ6IHRydWUsCiAgICAgICAgICAgIGhhbmRsZXI6IHRoaXMub25DbGljay5jcmVhdGVEZWxlZ2F0ZSh0aGlzLCBbImxhc3QiXSkKICAgICAgICB9KTsKICAgICAgICB0aGlzLmFkZFNlcGFyYXRvcigpOwogICAgICAgIHRoaXMubG9hZGluZyA9IHRoaXMuYWRkQnV0dG9uKHsKICAgICAgICAgICAgdG9vbHRpcDogdGhpcy5yZWZyZXNoVGV4dCwKICAgICAgICAgICAgY2xzOiAieC1idG4taWNvbiB4LWdyaWQtbG9hZGluZyIsCiAgICAgICAgICAgIGhhbmRsZXI6IHRoaXMub25DbGljay5jcmVhdGVEZWxlZ2F0ZSh0aGlzLCBbInJlZnJlc2giXSkKICAgICAgICB9KTsKCiAgICAgICAgaWYodGhpcy5kaXNwbGF5SW5mbyl7CiAgICAgICAgICAgIHRoaXMuZGlzcGxheUVsID0gRXh0LmZseSh0aGlzLmVsLmRvbS5maXJzdENoaWxkKS5jcmVhdGVDaGlsZCh7Y2xzOid4LXBhZ2luZy1pbmZvJ30pOwogICAgICAgIH0KICAgIH0sCgogICAgICAgIHVwZGF0ZUluZm8gOiBmdW5jdGlvbigpewogICAgICAgIGlmKHRoaXMuZGlzcGxheUVsKXsKICAgICAgICAgICAgdmFyIGNvdW50ID0gdGhpcy5kcy5nZXRDb3VudCgpOwogICAgICAgICAgICB2YXIgbXNnID0gY291bnQgPT0gMCA/CiAgICAgICAgICAgICAgICB0aGlzLmVtcHR5TXNnIDoKICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5TXNnLAogICAgICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yKzEsIHRoaXMuY3Vyc29yK2NvdW50LCB0aGlzLmRzLmdldFRvdGFsQ291bnQoKSAgICAKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIHRoaXMuZGlzcGxheUVsLnVwZGF0ZShtc2cpOwogICAgICAgIH0KICAgIH0sCgogICAgICAgIG9uTG9hZCA6IGZ1bmN0aW9uKGRzLCByLCBvKXsKICAgICAgIHRoaXMuY3Vyc29yID0gby5wYXJhbXMgPyBvLnBhcmFtcy5zdGFydCA6IDA7CiAgICAgICB2YXIgZCA9IHRoaXMuZ2V0UGFnZURhdGEoKSwgYXAgPSBkLmFjdGl2ZVBhZ2UsIHBzID0gZC5wYWdlczsKCiAgICAgICB0aGlzLmFmdGVyVGV4dEVsLmVsLmlubmVySFRNTCA9IFN0cmluZy5mb3JtYXQodGhpcy5hZnRlclBhZ2VUZXh0LCBkLnBhZ2VzKTsKICAgICAgIHRoaXMuZmllbGQuZG9tLnZhbHVlID0gYXA7CiAgICAgICB0aGlzLmZpcnN0LnNldERpc2FibGVkKGFwID09IDEpOwogICAgICAgdGhpcy5wcmV2LnNldERpc2FibGVkKGFwID09IDEpOwogICAgICAgdGhpcy5uZXh0LnNldERpc2FibGVkKGFwID09IHBzKTsKICAgICAgIHRoaXMubGFzdC5zZXREaXNhYmxlZChhcCA9PSBwcyk7CiAgICAgICB0aGlzLmxvYWRpbmcuZW5hYmxlKCk7CiAgICAgICB0aGlzLnVwZGF0ZUluZm8oKTsKICAgIH0sCgogICAgICAgIGdldFBhZ2VEYXRhIDogZnVuY3Rpb24oKXsKICAgICAgICB2YXIgdG90YWwgPSB0aGlzLmRzLmdldFRvdGFsQ291bnQoKTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0b3RhbCA6IHRvdGFsLAogICAgICAgICAgICBhY3RpdmVQYWdlIDogTWF0aC5jZWlsKCh0aGlzLmN1cnNvcit0aGlzLnBhZ2VTaXplKS90aGlzLnBhZ2VTaXplKSwKICAgICAgICAgICAgcGFnZXMgOiAgdG90YWwgPCB0aGlzLnBhZ2VTaXplID8gMSA6IE1hdGguY2VpbCh0b3RhbC90aGlzLnBhZ2VTaXplKQogICAgICAgIH07CiAgICB9LAoKICAgICAgICBvbkxvYWRFcnJvciA6IGZ1bmN0aW9uKCl7CiAgICAgICAgdGhpcy5sb2FkaW5nLmVuYWJsZSgpOwogICAgfSwKCiAgICAgICAgb25QYWdpbmdLZXlkb3duIDogZnVuY3Rpb24oZSl7CiAgICAgICAgdmFyIGsgPSBlLmdldEtleSgpOwogICAgICAgIHZhciBkID0gdGhpcy5nZXRQYWdlRGF0YSgpOwogICAgICAgIGlmKGsgPT0gZS5SRVRVUk4pewogICAgICAgICAgICB2YXIgdiA9IHRoaXMuZmllbGQuZG9tLnZhbHVlLCBwYWdlTnVtOwogICAgICAgICAgICBpZighdiB8fCBpc05hTihwYWdlTnVtID0gcGFyc2VJbnQodiwgMTApKSl7CiAgICAgICAgICAgICAgICB0aGlzLmZpZWxkLmRvbS52YWx1ZSA9IGQuYWN0aXZlUGFnZTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBwYWdlTnVtID0gTWF0aC5taW4oTWF0aC5tYXgoMSwgcGFnZU51bSksIGQucGFnZXMpIC0gMTsKICAgICAgICAgICAgdGhpcy5kcy5sb2FkKHtwYXJhbXM6e3N0YXJ0OiBwYWdlTnVtICogdGhpcy5wYWdlU2l6ZSwgbGltaXQ6IHRoaXMucGFnZVNpemV9fSk7CiAgICAgICAgICAgIGUuc3RvcEV2ZW50KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoayA9PSBlLkhPTUUgfHwgKGsgPT0gZS5VUCAmJiBlLmN0cmxLZXkpIHx8IChrID09IGUuUEFHRVVQICYmIGUuY3RybEtleSkgfHwgKGsgPT0gZS5SSUdIVCAmJiBlLmN0cmxLZXkpIHx8IGsgPT0gZS5FTkQgfHwgKGsgPT0gZS5ET1dOICYmIGUuY3RybEtleSkgfHwgKGsgPT0gZS5MRUZUICYmIGUuY3RybEtleSkgfHwgKGsgPT0gZS5QQUdFRE9XTiAmJiBlLmN0cmxLZXkpKQogICAgICAgIHsKICAgICAgICAgIHZhciBwYWdlTnVtID0gKGsgPT0gZS5IT01FIHx8IChrID09IGUuRE9XTiAmJiBlLmN0cmxLZXkpIHx8IChrID09IGUuTEVGVCAmJiBlLmN0cmxLZXkpIHx8IChrID09IGUuUEFHRURPV04gJiYgZS5jdHJsS2V5KSkgPyAxIDogZC5wYWdlczsKICAgICAgICAgIHRoaXMuZmllbGQuZG9tLnZhbHVlID0gcGFnZU51bTsKICAgICAgICAgIHRoaXMuZHMubG9hZCh7cGFyYW1zOntzdGFydDogKHBhZ2VOdW0gLSAxKSAqIHRoaXMucGFnZVNpemUsIGxpbWl0OiB0aGlzLnBhZ2VTaXplfX0pOwogICAgICAgICAgZS5zdG9wRXZlbnQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZihrID09IGUuVVAgfHwgayA9PSBlLlJJR0hUIHx8IGsgPT0gZS5QQUdFVVAgfHwgayA9PSBlLkRPV04gfHwgayA9PSBlLkxFRlQgfHwgayA9PSBlLlBBR0VET1dOKQogICAgICAgIHsKICAgICAgICAgIHZhciB2ID0gdGhpcy5maWVsZC5kb20udmFsdWUsIHBhZ2VOdW07IAogICAgICAgICAgdmFyIGluY3JlbWVudCA9IChlLnNoaWZ0S2V5KSA/IDEwIDogMTsKICAgICAgICAgIGlmKGsgPT0gZS5ET1dOIHx8IGsgPT0gZS5MRUZUIHx8IGsgPT0gZS5QQUdFRE9XTikKICAgICAgICAgICAgaW5jcmVtZW50ICo9IC0xOwogICAgICAgICAgaWYoIXYgfHwgaXNOYU4ocGFnZU51bSA9IHBhcnNlSW50KHYsIDEwKSkpIHsKICAgICAgICAgICAgdGhpcy5maWVsZC5kb20udmFsdWUgPSBkLmFjdGl2ZVBhZ2U7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgaWYocGFyc2VJbnQodiwgMTApICsgaW5jcmVtZW50ID49IDEgJiBwYXJzZUludCh2LCAxMCkgKyBpbmNyZW1lbnQgPD0gZC5wYWdlcykKICAgICAgICAgIHsKICAgICAgICAgICAgdGhpcy5maWVsZC5kb20udmFsdWUgPSBwYXJzZUludCh2LCAxMCkgKyBpbmNyZW1lbnQ7CiAgICAgICAgICAgIHBhZ2VOdW0gPSBNYXRoLm1pbihNYXRoLm1heCgxLCBwYWdlTnVtICsgaW5jcmVtZW50KSwgZC5wYWdlcykgLSAxOwogICAgICAgICAgICB0aGlzLmRzLmxvYWQoe3BhcmFtczp7c3RhcnQ6IHBhZ2VOdW0gKiB0aGlzLnBhZ2VTaXplLCBsaW1pdDogdGhpcy5wYWdlU2l6ZX19KTsKICAgICAgICAgIH0KICAgICAgICAgIGUuc3RvcEV2ZW50KCk7CiAgICAgICAgfQogICAgfSwKCiAgICAgICAgYmVmb3JlTG9hZCA6IGZ1bmN0aW9uKCl7CiAgICAgICAgaWYodGhpcy5sb2FkaW5nKXsKICAgICAgICAgICAgdGhpcy5sb2FkaW5nLmRpc2FibGUoKTsKICAgICAgICB9CiAgICB9LAoKICAgICAgICBvbkNsaWNrIDogZnVuY3Rpb24od2hpY2gpewogICAgICAgIHZhciBkcyA9IHRoaXMuZHM7CiAgICAgICAgc3dpdGNoKHdoaWNoKXsKICAgICAgICAgICAgY2FzZSAiZmlyc3QiOgogICAgICAgICAgICAgICAgZHMubG9hZCh7cGFyYW1zOntzdGFydDogMCwgbGltaXQ6IHRoaXMucGFnZVNpemV9fSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJwcmV2IjoKICAgICAgICAgICAgICAgIGRzLmxvYWQoe3BhcmFtczp7c3RhcnQ6IE1hdGgubWF4KDAsIHRoaXMuY3Vyc29yLXRoaXMucGFnZVNpemUpLCBsaW1pdDogdGhpcy5wYWdlU2l6ZX19KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgIm5leHQiOgogICAgICAgICAgICAgICAgZHMubG9hZCh7cGFyYW1zOntzdGFydDogdGhpcy5jdXJzb3IrdGhpcy5wYWdlU2l6ZSwgbGltaXQ6IHRoaXMucGFnZVNpemV9fSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJsYXN0IjoKICAgICAgICAgICAgICAgIHZhciB0b3RhbCA9IGRzLmdldFRvdGFsQ291bnQoKTsKICAgICAgICAgICAgICAgIHZhciBleHRyYSA9IHRvdGFsICUgdGhpcy5wYWdlU2l6ZTsKICAgICAgICAgICAgICAgIHZhciBsYXN0U3RhcnQgPSBleHRyYSA/ICh0b3RhbCAtIGV4dHJhKSA6IHRvdGFsLXRoaXMucGFnZVNpemU7CiAgICAgICAgICAgICAgICBkcy5sb2FkKHtwYXJhbXM6e3N0YXJ0OiBsYXN0U3RhcnQsIGxpbWl0OiB0aGlzLnBhZ2VTaXplfX0pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAicmVmcmVzaCI6CiAgICAgICAgICAgICAgICBkcy5sb2FkKHtwYXJhbXM6e3N0YXJ0OiB0aGlzLmN1cnNvciwgbGltaXQ6IHRoaXMucGFnZVNpemV9fSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0sCgogICAgCiAgICB1bmJpbmQgOiBmdW5jdGlvbihkcyl7CiAgICAgICAgZHMudW4oImJlZm9yZWxvYWQiLCB0aGlzLmJlZm9yZUxvYWQsIHRoaXMpOwogICAgICAgIGRzLnVuKCJsb2FkIiwgdGhpcy5vbkxvYWQsIHRoaXMpOwogICAgICAgIGRzLnVuKCJsb2FkZXhjZXB0aW9uIiwgdGhpcy5vbkxvYWRFcnJvciwgdGhpcyk7CiAgICAgICAgdGhpcy5kcyA9IHVuZGVmaW5lZDsKICAgIH0sCgogICAgCiAgICBiaW5kIDogZnVuY3Rpb24oZHMpewogICAgICAgIGRzLm9uKCJiZWZvcmVsb2FkIiwgdGhpcy5iZWZvcmVMb2FkLCB0aGlzKTsKICAgICAgICBkcy5vbigibG9hZCIsIHRoaXMub25Mb2FkLCB0aGlzKTsKICAgICAgICBkcy5vbigibG9hZGV4Y2VwdGlvbiIsIHRoaXMub25Mb2FkRXJyb3IsIHRoaXMpOwogICAgICAgIHRoaXMuZHMgPSBkczsKICAgIH0KfSk7Cg1FeHQuUmVzaXphYmxlID0gZnVuY3Rpb24oZWwsIGNvbmZpZyl7DSAgICB0aGlzLmVsID0gRXh0LmdldChlbCk7DQ0gICAgaWYoY29uZmlnICYmIGNvbmZpZy53cmFwKXsNICAgICAgICBjb25maWcucmVzaXplQ2hpbGQgPSB0aGlzLmVsOw0gICAgICAgIHRoaXMuZWwgPSB0aGlzLmVsLndyYXAodHlwZW9mIGNvbmZpZy53cmFwID09ICJvYmplY3QiID8gY29uZmlnLndyYXAgOiB7Y2xzOiJ4cmVzaXphYmxlLXdyYXAifSk7DSAgICAgICAgdGhpcy5lbC5pZCA9IHRoaXMuZWwuZG9tLmlkID0gY29uZmlnLnJlc2l6ZUNoaWxkLmlkICsgIi1yendyYXAiOw0gICAgICAgIHRoaXMuZWwuc2V0U3R5bGUoIm92ZXJmbG93IiwgImhpZGRlbiIpOw0gICAgICAgIHRoaXMuZWwuc2V0UG9zaXRpb25pbmcoY29uZmlnLnJlc2l6ZUNoaWxkLmdldFBvc2l0aW9uaW5nKCkpOw0gICAgICAgIGNvbmZpZy5yZXNpemVDaGlsZC5jbGVhclBvc2l0aW9uaW5nKCk7DSAgICAgICAgaWYoIWNvbmZpZy53aWR0aCB8fCAhY29uZmlnLmhlaWdodCl7DSAgICAgICAgICAgIHZhciBjc2l6ZSA9IGNvbmZpZy5yZXNpemVDaGlsZC5nZXRTaXplKCk7DSAgICAgICAgICAgIHRoaXMuZWwuc2V0U2l6ZShjc2l6ZS53aWR0aCwgY3NpemUuaGVpZ2h0KTsNICAgICAgICB9DSAgICAgICAgaWYoY29uZmlnLnBpbm5lZCAmJiAhY29uZmlnLmFkanVzdG1lbnRzKXsNICAgICAgICAgICAgY29uZmlnLmFkanVzdG1lbnRzID0gImF1dG8iOw0gICAgICAgIH0NICAgIH0NDSAgICB0aGlzLnByb3h5ID0gdGhpcy5lbC5jcmVhdGVQcm94eSh7dGFnOiAiZGl2IiwgY2xzOiAieC1yZXNpemFibGUtcHJveHkiLCBpZDogdGhpcy5lbC5pZCArICItcnpwcm94eSJ9KTsNICAgIHRoaXMucHJveHkudW5zZWxlY3RhYmxlKCk7DSAgICB0aGlzLnByb3h5LmVuYWJsZURpc3BsYXlNb2RlKCdibG9jaycpOw0NICAgIEV4dC5hcHBseSh0aGlzLCBjb25maWcpOw0NICAgIGlmKHRoaXMucGlubmVkKXsNICAgICAgICB0aGlzLmRpc2FibGVUcmFja092ZXIgPSB0cnVlOw0gICAgICAgIHRoaXMuZWwuYWRkQ2xhc3MoIngtcmVzaXphYmxlLXBpbm5lZCIpOw0gICAgfQ0gICAgICAgIHZhciBwb3NpdGlvbiA9IHRoaXMuZWwuZ2V0U3R5bGUoInBvc2l0aW9uIik7DSAgICBpZihwb3NpdGlvbiAhPSAiYWJzb2x1dGUiICYmIHBvc2l0aW9uICE9ICJmaXhlZCIpew0gICAgICAgIHRoaXMuZWwuc2V0U3R5bGUoInBvc2l0aW9uIiwgInJlbGF0aXZlIik7DSAgICB9DSAgICBpZighdGhpcy5oYW5kbGVzKXsgICAgICAgICB0aGlzLmhhbmRsZXMgPSAncyxlLHNlJzsNICAgICAgICBpZih0aGlzLm11bHRpRGlyZWN0aW9uYWwpew0gICAgICAgICAgICB0aGlzLmhhbmRsZXMgKz0gJyxuLHcnOw0gICAgICAgIH0NICAgIH0NICAgIGlmKHRoaXMuaGFuZGxlcyA9PSAiYWxsIil7DSAgICAgICAgdGhpcy5oYW5kbGVzID0gIm4gcyBlIHcgbmUgbncgc2Ugc3ciOw0gICAgfQ0gICAgdmFyIGhzID0gdGhpcy5oYW5kbGVzLnNwbGl0KC9ccyo/Wyw7XVxzKj98IC8pOw0gICAgdmFyIHBzID0gRXh0LlJlc2l6YWJsZS5wb3NpdGlvbnM7DSAgICBmb3IodmFyIGkgPSAwLCBsZW4gPSBocy5sZW5ndGg7IGkgPCBsZW47IGkrKyl7DSAgICAgICAgaWYoaHNbaV0gJiYgcHNbaHNbaV1dKXsNICAgICAgICAgICAgdmFyIHBvcyA9IHBzW2hzW2ldXTsNICAgICAgICAgICAgdGhpc1twb3NdID0gbmV3IEV4dC5SZXNpemFibGUuSGFuZGxlKHRoaXMsIHBvcywgdGhpcy5kaXNhYmxlVHJhY2tPdmVyLCB0aGlzLnRyYW5zcGFyZW50KTsNICAgICAgICB9DSAgICB9DSAgICAgICAgdGhpcy5jb3JuZXIgPSB0aGlzLnNvdXRoZWFzdDsNDSAgICBpZih0aGlzLmhhbmRsZXMuaW5kZXhPZigibiIpICE9IC0xIHx8IHRoaXMuaGFuZGxlcy5pbmRleE9mKCJ3IikgIT0gLTEpew0gICAgICAgIHRoaXMudXBkYXRlQm94ID0gdHJ1ZTsNICAgIH0NDSAgICB0aGlzLmFjdGl2ZUhhbmRsZSA9IG51bGw7DQ0gICAgaWYodGhpcy5yZXNpemVDaGlsZCl7DSAgICAgICAgaWYodHlwZW9mIHRoaXMucmVzaXplQ2hpbGQgPT0gImJvb2xlYW4iKXsNICAgICAgICAgICAgdGhpcy5yZXNpemVDaGlsZCA9IEV4dC5nZXQodGhpcy5lbC5kb20uZmlyc3RDaGlsZCwgdHJ1ZSk7DSAgICAgICAgfWVsc2V7DSAgICAgICAgICAgIHRoaXMucmVzaXplQ2hpbGQgPSBFeHQuZ2V0KHRoaXMucmVzaXplQ2hpbGQsIHRydWUpOw0gICAgICAgIH0NICAgIH0NDSAgICBpZih0aGlzLmFkanVzdG1lbnRzID09ICJhdXRvIil7DSAgICAgICAgdmFyIHJjID0gdGhpcy5yZXNpemVDaGlsZDsNICAgICAgICB2YXIgaHcgPSB0aGlzLndlc3QsIGhlID0gdGhpcy5lYXN0LCBobiA9IHRoaXMubm9ydGgsIGhzID0gdGhpcy5zb3V0aDsNICAgICAgICBpZihyYyAmJiAoaHcgfHwgaG4pKXsNICAgICAgICAgICAgcmMucG9zaXRpb24oInJlbGF0aXZlIik7DSAgICAgICAgICAgIHJjLnNldExlZnQoaHcgPyBody5lbC5nZXRXaWR0aCgpIDogMCk7DSAgICAgICAgICAgIHJjLnNldFRvcChobiA/IGhuLmVsLmdldEhlaWdodCgpIDogMCk7DSAgICAgICAgfQ0gICAgICAgIHRoaXMuYWRqdXN0bWVudHMgPSBbDSAgICAgICAgICAgIChoZSA/IC1oZS5lbC5nZXRXaWR0aCgpIDogMCkgKyAoaHcgPyAtaHcuZWwuZ2V0V2lkdGgoKSA6IDApLA0gICAgICAgICAgICAoaG4gPyAtaG4uZWwuZ2V0SGVpZ2h0KCkgOiAwKSArIChocyA/IC1ocy5lbC5nZXRIZWlnaHQoKSA6IDApIC0xDSAgICAgICAgXTsNICAgIH0NDSAgICBpZih0aGlzLmRyYWdnYWJsZSl7DSAgICAgICAgdGhpcy5kZCA9IHRoaXMuZHluYW1pYyA/DSAgICAgICAgICAgIHRoaXMuZWwuaW5pdEREKG51bGwpIDogdGhpcy5lbC5pbml0RERQcm94eShudWxsLCB7ZHJhZ0VsSWQ6IHRoaXMucHJveHkuaWR9KTsNICAgICAgICB0aGlzLmRkLnNldEhhbmRsZUVsSWQodGhpcy5yZXNpemVDaGlsZCA/IHRoaXMucmVzaXplQ2hpbGQuaWQgOiB0aGlzLmVsLmlkKTsNICAgIH0NDSAgICAgICAgdGhpcy5hZGRFdmVudHMoew0gICAgICAgIA0gICAgICAgICJiZWZvcmVyZXNpemUiIDogdHJ1ZSwNICAgICAgICANICAgICAgICAicmVzaXplIiA6IHRydWUNICAgIH0pOw0NICAgIGlmKHRoaXMud2lkdGggIT09IG51bGwgJiYgdGhpcy5oZWlnaHQgIT09IG51bGwpew0gICAgICAgIHRoaXMucmVzaXplVG8odGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpOw0gICAgfWVsc2V7DSAgICAgICAgdGhpcy51cGRhdGVDaGlsZFNpemUoKTsNICAgIH0NICAgIGlmKEV4dC5pc0lFKXsNICAgICAgICB0aGlzLmVsLmRvbS5zdHlsZS56b29tID0gMTsNICAgIH0NICAgIEV4dC5SZXNpemFibGUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpOw19Ow0NRXh0LmV4dGVuZChFeHQuUmVzaXphYmxlLCBFeHQudXRpbC5PYnNlcnZhYmxlLCB7DSAgICAgICAgcmVzaXplQ2hpbGQgOiBmYWxzZSwNICAgICAgICBhZGp1c3RtZW50cyA6IFswLCAwXSwNICAgICAgICBtaW5XaWR0aCA6IDUsDSAgICAgICAgbWluSGVpZ2h0IDogNSwNICAgICAgICBtYXhXaWR0aCA6IDEwMDAwLA0gICAgICAgIG1heEhlaWdodCA6IDEwMDAwLA0gICAgICAgIGVuYWJsZWQgOiB0cnVlLA0gICAgICAgIGFuaW1hdGUgOiBmYWxzZSwNICAgICAgICBkdXJhdGlvbiA6IC4zNSwNICAgICAgICBkeW5hbWljIDogZmFsc2UsDSAgICAgICAgaGFuZGxlcyA6IGZhbHNlLA0gICAgICAgIG11bHRpRGlyZWN0aW9uYWwgOiBmYWxzZSwNICAgICAgICBkaXNhYmxlVHJhY2tPdmVyIDogZmFsc2UsDSAgICAgICAgZWFzaW5nIDogJ2Vhc2VPdXRTdHJvbmcnLA0gICAgICAgIHdpZHRoSW5jcmVtZW50IDogMCwNICAgICAgICBoZWlnaHRJbmNyZW1lbnQgOiAwLA0gICAgICAgIHBpbm5lZCA6IGZhbHNlLA0gICAgICAgIHdpZHRoIDogbnVsbCwNICAgICAgICBoZWlnaHQgOiBudWxsLA0gICAgICAgIHByZXNlcnZlUmF0aW8gOiBmYWxzZSwNICAgICAgICB0cmFuc3BhcmVudDogZmFsc2UsDSAgICAgICAgbWluWDogMCwNICAgICAgICBtaW5ZOiAwLA0gICAgICAgIGRyYWdnYWJsZTogZmFsc2UsDQ0gICAgICAgIA0gICAgICAgIGNvbnN0cmFpblRvOiB1bmRlZmluZWQsDSAgICAgICAgDSAgICAgICAgcmVzaXplUmVnaW9uOiB1bmRlZmluZWQsDQ0NICAgIA0gICAgcmVzaXplVG8gOiBmdW5jdGlvbih3aWR0aCwgaGVpZ2h0KXsNICAgICAgICB0aGlzLmVsLnNldFNpemUod2lkdGgsIGhlaWdodCk7DSAgICAgICAgdGhpcy51cGRhdGVDaGlsZFNpemUoKTsNICAgICAgICB0aGlzLmZpcmVFdmVudCgicmVzaXplIiwgdGhpcywgd2lkdGgsIGhlaWdodCwgbnVsbCk7DSAgICB9LA0NICAgICAgICBzdGFydFNpemluZyA6IGZ1bmN0aW9uKGUsIGhhbmRsZSl7DSAgICAgICAgdGhpcy5maXJlRXZlbnQoImJlZm9yZXJlc2l6ZSIsIHRoaXMsIGUpOw0gICAgICAgIGlmKHRoaXMuZW5hYmxlZCl7IA0gICAgICAgICAgICBpZighdGhpcy5vdmVybGF5KXsNICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheSA9IHRoaXMuZWwuY3JlYXRlUHJveHkoe3RhZzogImRpdiIsIGNsczogIngtcmVzaXphYmxlLW92ZXJsYXkiLCBodG1sOiAiJiMxNjA7In0pOw0gICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5LnVuc2VsZWN0YWJsZSgpOw0gICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5LmVuYWJsZURpc3BsYXlNb2RlKCJibG9jayIpOw0gICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5Lm9uKCJtb3VzZW1vdmUiLCB0aGlzLm9uTW91c2VNb3ZlLCB0aGlzKTsNICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheS5vbigibW91c2V1cCIsIHRoaXMub25Nb3VzZVVwLCB0aGlzKTsNICAgICAgICAgICAgfQ0gICAgICAgICAgICB0aGlzLm92ZXJsYXkuc2V0U3R5bGUoImN1cnNvciIsIGhhbmRsZS5lbC5nZXRTdHlsZSgiY3Vyc29yIikpOw0NICAgICAgICAgICAgdGhpcy5yZXNpemluZyA9IHRydWU7DSAgICAgICAgICAgIHRoaXMuc3RhcnRCb3ggPSB0aGlzLmVsLmdldEJveCgpOw0gICAgICAgICAgICB0aGlzLnN0YXJ0UG9pbnQgPSBlLmdldFhZKCk7DSAgICAgICAgICAgIHRoaXMub2Zmc2V0cyA9IFsodGhpcy5zdGFydEJveC54ICsgdGhpcy5zdGFydEJveC53aWR0aCkgLSB0aGlzLnN0YXJ0UG9pbnRbMF0sDSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5zdGFydEJveC55ICsgdGhpcy5zdGFydEJveC5oZWlnaHQpIC0gdGhpcy5zdGFydFBvaW50WzFdXTsNDSAgICAgICAgICAgIHRoaXMub3ZlcmxheS5zZXRTaXplKEV4dC5saWIuRG9tLmdldFZpZXdXaWR0aCh0cnVlKSwgRXh0LmxpYi5Eb20uZ2V0Vmlld0hlaWdodCh0cnVlKSk7DSAgICAgICAgICAgIHRoaXMub3ZlcmxheS5zaG93KCk7DQ0gICAgICAgICAgICBpZih0aGlzLmNvbnN0cmFpblRvKSB7DSAgICAgICAgICAgICAgICB2YXIgY3QgPSBFeHQuZ2V0KHRoaXMuY29uc3RyYWluVG8pOw0gICAgICAgICAgICAgICAgdGhpcy5yZXNpemVSZWdpb24gPSBjdC5nZXRSZWdpb24oKS5hZGp1c3QoDSAgICAgICAgICAgICAgICAgICAgY3QuZ2V0RnJhbWVXaWR0aCgndCcpLA0gICAgICAgICAgICAgICAgICAgIGN0LmdldEZyYW1lV2lkdGgoJ2wnKSwNICAgICAgICAgICAgICAgICAgICAtY3QuZ2V0RnJhbWVXaWR0aCgnYicpLA0gICAgICAgICAgICAgICAgICAgIC1jdC5nZXRGcmFtZVdpZHRoKCdyJykNICAgICAgICAgICAgICAgICk7DSAgICAgICAgICAgIH0NDSAgICAgICAgICAgIHRoaXMucHJveHkuc2V0U3R5bGUoJ3Zpc2liaWxpdHknLCAnaGlkZGVuJyk7ICAgICAgICAgICAgIHRoaXMucHJveHkuc2hvdygpOw0gICAgICAgICAgICB0aGlzLnByb3h5LnNldEJveCh0aGlzLnN0YXJ0Qm94KTsNICAgICAgICAgICAgaWYoIXRoaXMuZHluYW1pYyl7DSAgICAgICAgICAgICAgICB0aGlzLnByb3h5LnNldFN0eWxlKCd2aXNpYmlsaXR5JywgJ3Zpc2libGUnKTsNICAgICAgICAgICAgfQ0gICAgICAgIH0NICAgIH0sDQ0gICAgICAgIG9uTW91c2VEb3duIDogZnVuY3Rpb24oaGFuZGxlLCBlKXsNICAgICAgICBpZih0aGlzLmVuYWJsZWQpew0gICAgICAgICAgICBlLnN0b3BFdmVudCgpOw0gICAgICAgICAgICB0aGlzLmFjdGl2ZUhhbmRsZSA9IGhhbmRsZTsNICAgICAgICAgICAgdGhpcy5zdGFydFNpemluZyhlLCBoYW5kbGUpOw0gICAgICAgIH0NICAgIH0sDQ0gICAgICAgIG9uTW91c2VVcCA6IGZ1bmN0aW9uKGUpew0gICAgICAgIHZhciBzaXplID0gdGhpcy5yZXNpemVFbGVtZW50KCk7DSAgICAgICAgdGhpcy5yZXNpemluZyA9IGZhbHNlOw0gICAgICAgIHRoaXMuaGFuZGxlT3V0KCk7DSAgICAgICAgdGhpcy5vdmVybGF5LmhpZGUoKTsNICAgICAgICB0aGlzLnByb3h5LmhpZGUoKTsNICAgICAgICB0aGlzLmZpcmVFdmVudCgicmVzaXplIiwgdGhpcywgc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQsIGUpOw0gICAgfSwNDSAgICAgICAgdXBkYXRlQ2hpbGRTaXplIDogZnVuY3Rpb24oKXsNICAgICAgICBpZih0aGlzLnJlc2l6ZUNoaWxkKXsNICAgICAgICAgICAgdmFyIGVsID0gdGhpcy5lbDsNICAgICAgICAgICAgdmFyIGNoaWxkID0gdGhpcy5yZXNpemVDaGlsZDsNICAgICAgICAgICAgdmFyIGFkaiA9IHRoaXMuYWRqdXN0bWVudHM7DSAgICAgICAgICAgIGlmKGVsLmRvbS5vZmZzZXRXaWR0aCl7DSAgICAgICAgICAgICAgICB2YXIgYiA9IGVsLmdldFNpemUodHJ1ZSk7DSAgICAgICAgICAgICAgICBjaGlsZC5zZXRTaXplKGIud2lkdGgrYWRqWzBdLCBiLmhlaWdodCthZGpbMV0pOw0gICAgICAgICAgICB9DSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKEV4dC5pc0lFKXsNICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsNICAgICAgICAgICAgICAgICAgICBpZihlbC5kb20ub2Zmc2V0V2lkdGgpew0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IGVsLmdldFNpemUodHJ1ZSk7DSAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnNldFNpemUoYi53aWR0aCthZGpbMF0sIGIuaGVpZ2h0K2FkalsxXSk7DSAgICAgICAgICAgICAgICAgICAgfQ0gICAgICAgICAgICAgICAgfSwgMTApOw0gICAgICAgICAgICB9DSAgICAgICAgfQ0gICAgfSwNDSAgICAgICAgc25hcCA6IGZ1bmN0aW9uKHZhbHVlLCBpbmMsIG1pbil7DSAgICAgICAgaWYoIWluYyB8fCAhdmFsdWUpIHJldHVybiB2YWx1ZTsNICAgICAgICB2YXIgbmV3VmFsdWUgPSB2YWx1ZTsNICAgICAgICB2YXIgbSA9IHZhbHVlICUgaW5jOw0gICAgICAgIGlmKG0gPiAwKXsNICAgICAgICAgICAgaWYobSA+IChpbmMvMikpew0gICAgICAgICAgICAgICAgbmV3VmFsdWUgPSB2YWx1ZSArIChpbmMtbSk7DSAgICAgICAgICAgIH1lbHNlew0gICAgICAgICAgICAgICAgbmV3VmFsdWUgPSB2YWx1ZSAtIG07DSAgICAgICAgICAgIH0NICAgICAgICB9DSAgICAgICAgcmV0dXJuIE1hdGgubWF4KG1pbiwgbmV3VmFsdWUpOw0gICAgfSwNDSAgICAgICAgcmVzaXplRWxlbWVudCA6IGZ1bmN0aW9uKCl7DSAgICAgICAgdmFyIGJveCA9IHRoaXMucHJveHkuZ2V0Qm94KCk7DSAgICAgICAgaWYodGhpcy51cGRhdGVCb3gpew0gICAgICAgICAgICB0aGlzLmVsLnNldEJveChib3gsIGZhbHNlLCB0aGlzLmFuaW1hdGUsIHRoaXMuZHVyYXRpb24sIG51bGwsIHRoaXMuZWFzaW5nKTsNICAgICAgICB9ZWxzZXsNICAgICAgICAgICAgdGhpcy5lbC5zZXRTaXplKGJveC53aWR0aCwgYm94LmhlaWdodCwgdGhpcy5hbmltYXRlLCB0aGlzLmR1cmF0aW9uLCBudWxsLCB0aGlzLmVhc2luZyk7DSAgICAgICAgfQ0gICAgICAgIHRoaXMudXBkYXRlQ2hpbGRTaXplKCk7DSAgICAgICAgaWYoIXRoaXMuZHluYW1pYyl7DSAgICAgICAgICAgIHRoaXMucHJveHkuaGlkZSgpOw0gICAgICAgIH0NICAgICAgICByZXR1cm4gYm94Ow0gICAgfSwNDSAgICAgICAgY29uc3RyYWluIDogZnVuY3Rpb24odiwgZGlmZiwgbSwgbXgpew0gICAgICAgIGlmKHYgLSBkaWZmIDwgbSl7DSAgICAgICAgICAgIGRpZmYgPSB2IC0gbTsNICAgICAgICB9ZWxzZSBpZih2IC0gZGlmZiA+IG14KXsNICAgICAgICAgICAgZGlmZiA9IG14IC0gdjsNICAgICAgICB9DSAgICAgICAgcmV0dXJuIGRpZmY7DSAgICB9LA0NICAgICAgICBvbk1vdXNlTW92ZSA6IGZ1bmN0aW9uKGUpew0gICAgICAgIGlmKHRoaXMuZW5hYmxlZCl7DSAgICAgICAgICAgIHRyeXsNICAgICAgICAgICAgaWYodGhpcy5yZXNpemVSZWdpb24gJiYgIXRoaXMucmVzaXplUmVnaW9uLmNvbnRhaW5zKGUuZ2V0UG9pbnQoKSkpIHsNICAgICAgICAgICAgCXJldHVybjsNICAgICAgICAgICAgfQ0NICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN1clNpemUgPSB0aGlzLmN1clNpemUgfHwgdGhpcy5zdGFydEJveDsNICAgICAgICAgICAgdmFyIHggPSB0aGlzLnN0YXJ0Qm94LngsIHkgPSB0aGlzLnN0YXJ0Qm94Lnk7DSAgICAgICAgICAgIHZhciBveCA9IHgsIG95ID0geTsNICAgICAgICAgICAgdmFyIHcgPSBjdXJTaXplLndpZHRoLCBoID0gY3VyU2l6ZS5oZWlnaHQ7DSAgICAgICAgICAgIHZhciBvdyA9IHcsIG9oID0gaDsNICAgICAgICAgICAgdmFyIG13ID0gdGhpcy5taW5XaWR0aCwgbWggPSB0aGlzLm1pbkhlaWdodDsNICAgICAgICAgICAgdmFyIG14dyA9IHRoaXMubWF4V2lkdGgsIG14aCA9IHRoaXMubWF4SGVpZ2h0Ow0gICAgICAgICAgICB2YXIgd2kgPSB0aGlzLndpZHRoSW5jcmVtZW50Ow0gICAgICAgICAgICB2YXIgaGkgPSB0aGlzLmhlaWdodEluY3JlbWVudDsNDSAgICAgICAgICAgIHZhciBldmVudFhZID0gZS5nZXRYWSgpOw0gICAgICAgICAgICB2YXIgZGlmZlggPSAtKHRoaXMuc3RhcnRQb2ludFswXSAtIE1hdGgubWF4KHRoaXMubWluWCwgZXZlbnRYWVswXSkpOw0gICAgICAgICAgICB2YXIgZGlmZlkgPSAtKHRoaXMuc3RhcnRQb2ludFsxXSAtIE1hdGgubWF4KHRoaXMubWluWSwgZXZlbnRYWVsxXSkpOw0NICAgICAgICAgICAgdmFyIHBvcyA9IHRoaXMuYWN0aXZlSGFuZGxlLnBvc2l0aW9uOw0NICAgICAgICAgICAgc3dpdGNoKHBvcyl7DSAgICAgICAgICAgICAgICBjYXNlICJlYXN0IjoNICAgICAgICAgICAgICAgICAgICB3ICs9IGRpZmZYOw0gICAgICAgICAgICAgICAgICAgIHcgPSBNYXRoLm1pbihNYXRoLm1heChtdywgdyksIG14dyk7DSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DSAgICAgICAgICAgICAgICBjYXNlICJzb3V0aCI6DSAgICAgICAgICAgICAgICAgICAgaCArPSBkaWZmWTsNICAgICAgICAgICAgICAgICAgICBoID0gTWF0aC5taW4oTWF0aC5tYXgobWgsIGgpLCBteGgpOw0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0gICAgICAgICAgICAgICAgY2FzZSAic291dGhlYXN0IjoNICAgICAgICAgICAgICAgICAgICB3ICs9IGRpZmZYOw0gICAgICAgICAgICAgICAgICAgIGggKz0gZGlmZlk7DSAgICAgICAgICAgICAgICAgICAgdyA9IE1hdGgubWluKE1hdGgubWF4KG13LCB3KSwgbXh3KTsNICAgICAgICAgICAgICAgICAgICBoID0gTWF0aC5taW4oTWF0aC5tYXgobWgsIGgpLCBteGgpOw0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0gICAgICAgICAgICAgICAgY2FzZSAibm9ydGgiOg0gICAgICAgICAgICAgICAgICAgIGRpZmZZID0gdGhpcy5jb25zdHJhaW4oaCwgZGlmZlksIG1oLCBteGgpOw0gICAgICAgICAgICAgICAgICAgIHkgKz0gZGlmZlk7DSAgICAgICAgICAgICAgICAgICAgaCAtPSBkaWZmWTsNICAgICAgICAgICAgICAgICAgICBicmVhazsNICAgICAgICAgICAgICAgIGNhc2UgIndlc3QiOg0gICAgICAgICAgICAgICAgICAgIGRpZmZYID0gdGhpcy5jb25zdHJhaW4odywgZGlmZlgsIG13LCBteHcpOw0gICAgICAgICAgICAgICAgICAgIHggKz0gZGlmZlg7DSAgICAgICAgICAgICAgICAgICAgdyAtPSBkaWZmWDsNICAgICAgICAgICAgICAgICAgICBicmVhazsNICAgICAgICAgICAgICAgIGNhc2UgIm5vcnRoZWFzdCI6DSAgICAgICAgICAgICAgICAgICAgdyArPSBkaWZmWDsNICAgICAgICAgICAgICAgICAgICB3ID0gTWF0aC5taW4oTWF0aC5tYXgobXcsIHcpLCBteHcpOw0gICAgICAgICAgICAgICAgICAgIGRpZmZZID0gdGhpcy5jb25zdHJhaW4oaCwgZGlmZlksIG1oLCBteGgpOw0gICAgICAgICAgICAgICAgICAgIHkgKz0gZGlmZlk7DSAgICAgICAgICAgICAgICAgICAgaCAtPSBkaWZmWTsNICAgICAgICAgICAgICAgICAgICBicmVhazsNICAgICAgICAgICAgICAgIGNhc2UgIm5vcnRod2VzdCI6DSAgICAgICAgICAgICAgICAgICAgZGlmZlggPSB0aGlzLmNvbnN0cmFpbih3LCBkaWZmWCwgbXcsIG14dyk7DSAgICAgICAgICAgICAgICAgICAgZGlmZlkgPSB0aGlzLmNvbnN0cmFpbihoLCBkaWZmWSwgbWgsIG14aCk7DSAgICAgICAgICAgICAgICAgICAgeSArPSBkaWZmWTsNICAgICAgICAgICAgICAgICAgICBoIC09IGRpZmZZOw0gICAgICAgICAgICAgICAgICAgIHggKz0gZGlmZlg7DSAgICAgICAgICAgICAgICAgICAgdyAtPSBkaWZmWDsNICAgICAgICAgICAgICAgICAgICBicmVhazsNICAgICAgICAgICAgICAgY2FzZSAic291dGh3ZXN0IjoNICAgICAgICAgICAgICAgICAgICBkaWZmWCA9IHRoaXMuY29uc3RyYWluKHcsIGRpZmZYLCBtdywgbXh3KTsNICAgICAgICAgICAgICAgICAgICBoICs9IGRpZmZZOw0gICAgICAgICAgICAgICAgICAgIGggPSBNYXRoLm1pbihNYXRoLm1heChtaCwgaCksIG14aCk7DSAgICAgICAgICAgICAgICAgICAgeCArPSBkaWZmWDsNICAgICAgICAgICAgICAgICAgICB3IC09IGRpZmZYOw0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0gICAgICAgICAgICB9DQ0gICAgICAgICAgICB2YXIgc3cgPSB0aGlzLnNuYXAodywgd2ksIG13KTsNICAgICAgICAgICAgdmFyIHNoID0gdGhpcy5zbmFwKGgsIGhpLCBtaCk7DSAgICAgICAgICAgIGlmKHN3ICE9IHcgfHwgc2ggIT0gaCl7DSAgICAgICAgICAgICAgICBzd2l0Y2gocG9zKXsNICAgICAgICAgICAgICAgICAgICBjYXNlICJub3J0aGVhc3QiOg0gICAgICAgICAgICAgICAgICAgICAgICB5IC09IHNoIC0gaDsNICAgICAgICAgICAgICAgICAgICBicmVhazsNICAgICAgICAgICAgICAgICAgICBjYXNlICJub3J0aCI6DSAgICAgICAgICAgICAgICAgICAgICAgIHkgLT0gc2ggLSBoOw0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNICAgICAgICAgICAgICAgICAgICBjYXNlICJzb3V0aHdlc3QiOg0gICAgICAgICAgICAgICAgICAgICAgICB4IC09IHN3IC0gdzsNICAgICAgICAgICAgICAgICAgICBicmVhazsNICAgICAgICAgICAgICAgICAgICBjYXNlICJ3ZXN0IjoNICAgICAgICAgICAgICAgICAgICAgICAgeCAtPSBzdyAtIHc7DSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0gICAgICAgICAgICAgICAgICAgIGNhc2UgIm5vcnRod2VzdCI6DSAgICAgICAgICAgICAgICAgICAgICAgIHggLT0gc3cgLSB3Ow0gICAgICAgICAgICAgICAgICAgICAgICB5IC09IHNoIC0gaDsNICAgICAgICAgICAgICAgICAgICBicmVhazsNICAgICAgICAgICAgICAgIH0NICAgICAgICAgICAgICAgIHcgPSBzdzsNICAgICAgICAgICAgICAgIGggPSBzaDsNICAgICAgICAgICAgfQ0NICAgICAgICAgICAgaWYodGhpcy5wcmVzZXJ2ZVJhdGlvKXsNICAgICAgICAgICAgICAgIHN3aXRjaChwb3Mpew0gICAgICAgICAgICAgICAgICAgIGNhc2UgInNvdXRoZWFzdCI6DSAgICAgICAgICAgICAgICAgICAgY2FzZSAiZWFzdCI6DSAgICAgICAgICAgICAgICAgICAgICAgIGggPSBvaCAqICh3L293KTsNICAgICAgICAgICAgICAgICAgICAgICAgaCA9IE1hdGgubWluKE1hdGgubWF4KG1oLCBoKSwgbXhoKTsNICAgICAgICAgICAgICAgICAgICAgICAgdyA9IG93ICogKGgvb2gpOw0gICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0gICAgICAgICAgICAgICAgICAgIGNhc2UgInNvdXRoIjoNICAgICAgICAgICAgICAgICAgICAgICAgdyA9IG93ICogKGgvb2gpOw0gICAgICAgICAgICAgICAgICAgICAgICB3ID0gTWF0aC5taW4oTWF0aC5tYXgobXcsIHcpLCBteHcpOw0gICAgICAgICAgICAgICAgICAgICAgICBoID0gb2ggKiAody9vdyk7DSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0gICAgICAgICAgICAgICAgICAgIGNhc2UgIm5vcnRoZWFzdCI6DSAgICAgICAgICAgICAgICAgICAgICAgIHcgPSBvdyAqIChoL29oKTsNICAgICAgICAgICAgICAgICAgICAgICAgdyA9IE1hdGgubWluKE1hdGgubWF4KG13LCB3KSwgbXh3KTsNICAgICAgICAgICAgICAgICAgICAgICAgaCA9IG9oICogKHcvb3cpOw0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0gICAgICAgICAgICAgICAgICAgIGNhc2UgIm5vcnRoIjoNICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHR3ID0gdzsNICAgICAgICAgICAgICAgICAgICAgICAgdyA9IG93ICogKGgvb2gpOw0gICAgICAgICAgICAgICAgICAgICAgICB3ID0gTWF0aC5taW4oTWF0aC5tYXgobXcsIHcpLCBteHcpOw0gICAgICAgICAgICAgICAgICAgICAgICBoID0gb2ggKiAody9vdyk7DSAgICAgICAgICAgICAgICAgICAgICAgIHggKz0gKHR3IC0gdykgLyAyOw0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNICAgICAgICAgICAgICAgICAgICBjYXNlICJzb3V0aHdlc3QiOg0gICAgICAgICAgICAgICAgICAgICAgICBoID0gb2ggKiAody9vdyk7DSAgICAgICAgICAgICAgICAgICAgICAgIGggPSBNYXRoLm1pbihNYXRoLm1heChtaCwgaCksIG14aCk7DSAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0dyA9IHc7DSAgICAgICAgICAgICAgICAgICAgICAgIHcgPSBvdyAqIChoL29oKTsNICAgICAgICAgICAgICAgICAgICAgICAgeCArPSB0dyAtIHc7DSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0gICAgICAgICAgICAgICAgICAgIGNhc2UgIndlc3QiOg0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGggPSBoOw0gICAgICAgICAgICAgICAgICAgICAgICBoID0gb2ggKiAody9vdyk7DSAgICAgICAgICAgICAgICAgICAgICAgIGggPSBNYXRoLm1pbihNYXRoLm1heChtaCwgaCksIG14aCk7DSAgICAgICAgICAgICAgICAgICAgICAgIHkgKz0gKHRoIC0gaCkgLyAyOw0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdHcgPSB3Ow0gICAgICAgICAgICAgICAgICAgICAgICB3ID0gb3cgKiAoaC9vaCk7DSAgICAgICAgICAgICAgICAgICAgICAgIHggKz0gdHcgLSB3Ow0gICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0gICAgICAgICAgICAgICAgICAgIGNhc2UgIm5vcnRod2VzdCI6DSAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0dyA9IHc7DSAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0aCA9IGg7DSAgICAgICAgICAgICAgICAgICAgICAgIGggPSBvaCAqICh3L293KTsNICAgICAgICAgICAgICAgICAgICAgICAgaCA9IE1hdGgubWluKE1hdGgubWF4KG1oLCBoKSwgbXhoKTsNICAgICAgICAgICAgICAgICAgICAgICAgdyA9IG93ICogKGgvb2gpOw0gICAgICAgICAgICAgICAgICAgICAgICB5ICs9IHRoIC0gaDsNICAgICAgICAgICAgICAgICAgICAgICAgIHggKz0gdHcgLSB3Ow0gICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0NICAgICAgICAgICAgICAgIH0NICAgICAgICAgICAgfQ0gICAgICAgICAgICB0aGlzLnByb3h5LnNldEJvdW5kcyh4LCB5LCB3LCBoKTsNICAgICAgICAgICAgaWYodGhpcy5keW5hbWljKXsNICAgICAgICAgICAgICAgIHRoaXMucmVzaXplRWxlbWVudCgpOw0gICAgICAgICAgICB9DSAgICAgICAgICAgIH1jYXRjaChlKXt9DSAgICAgICAgfQ0gICAgfSwNDSAgICAgICAgaGFuZGxlT3ZlciA6IGZ1bmN0aW9uKCl7DSAgICAgICAgaWYodGhpcy5lbmFibGVkKXsNICAgICAgICAgICAgdGhpcy5lbC5hZGRDbGFzcygieC1yZXNpemFibGUtb3ZlciIpOw0gICAgICAgIH0NICAgIH0sDQ0gICAgICAgIGhhbmRsZU91dCA6IGZ1bmN0aW9uKCl7DSAgICAgICAgaWYoIXRoaXMucmVzaXppbmcpew0gICAgICAgICAgICB0aGlzLmVsLnJlbW92ZUNsYXNzKCJ4LXJlc2l6YWJsZS1vdmVyIik7DSAgICAgICAgfQ0gICAgfSwNDSAgICANICAgIGdldEVsIDogZnVuY3Rpb24oKXsNICAgICAgICByZXR1cm4gdGhpcy5lbDsNICAgIH0sDQ0gICAgDSAgICBnZXRSZXNpemVDaGlsZCA6IGZ1bmN0aW9uKCl7DSAgICAgICAgcmV0dXJuIHRoaXMucmVzaXplQ2hpbGQ7DSAgICB9LA0NICAgIA0gICAgZGVzdHJveSA6IGZ1bmN0aW9uKHJlbW92ZUVsKXsNICAgICAgICB0aGlzLnByb3h5LnJlbW92ZSgpOw0gICAgICAgIGlmKHRoaXMub3ZlcmxheSl7DSAgICAgICAgICAgIHRoaXMub3ZlcmxheS5yZW1vdmVBbGxMaXN0ZW5lcnMoKTsNICAgICAgICAgICAgdGhpcy5vdmVybGF5LnJlbW92ZSgpOw0gICAgICAgIH0NICAgICAgICB2YXIgcHMgPSBFeHQuUmVzaXphYmxlLnBvc2l0aW9uczsNICAgICAgICBmb3IodmFyIGsgaW4gcHMpew0gICAgICAgICAgICBpZih0eXBlb2YgcHNba10gIT0gImZ1bmN0aW9uIiAmJiB0aGlzW3BzW2tdXSl7DSAgICAgICAgICAgICAgICB2YXIgaCA9IHRoaXNbcHNba11dOw0gICAgICAgICAgICAgICAgaC5lbC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTsNICAgICAgICAgICAgICAgIGguZWwucmVtb3ZlKCk7DSAgICAgICAgICAgIH0NICAgICAgICB9DSAgICAgICAgaWYocmVtb3ZlRWwpew0gICAgICAgICAgICB0aGlzLmVsLnVwZGF0ZSgiIik7DSAgICAgICAgICAgIHRoaXMuZWwucmVtb3ZlKCk7DSAgICAgICAgfQ0gICAgfQ19KTsNDUV4dC5SZXNpemFibGUucG9zaXRpb25zID0gew0gICAgbjogIm5vcnRoIiwgczogInNvdXRoIiwgZTogImVhc3QiLCB3OiAid2VzdCIsIHNlOiAic291dGhlYXN0Iiwgc3c6ICJzb3V0aHdlc3QiLCBudzogIm5vcnRod2VzdCIsIG5lOiAibm9ydGhlYXN0Ig19Ow0NRXh0LlJlc2l6YWJsZS5IYW5kbGUgPSBmdW5jdGlvbihyeiwgcG9zLCBkaXNhYmxlVHJhY2tPdmVyLCB0cmFuc3BhcmVudCl7DSAgICBpZighdGhpcy50cGwpew0gICAgICAgICAgICAgICAgdmFyIHRwbCA9IEV4dC5Eb21IZWxwZXIuY3JlYXRlVGVtcGxhdGUoDSAgICAgICAgICAgIHt0YWc6ICJkaXYiLCBjbHM6ICJ4LXJlc2l6YWJsZS1oYW5kbGUgeC1yZXNpemFibGUtaGFuZGxlLXswfSJ9DSAgICAgICAgKTsNICAgICAgICB0cGwuY29tcGlsZSgpOw0gICAgICAgIEV4dC5SZXNpemFibGUuSGFuZGxlLnByb3RvdHlwZS50cGwgPSB0cGw7DSAgICB9DSAgICB0aGlzLnBvc2l0aW9uID0gcG9zOw0gICAgdGhpcy5yeiA9IHJ6Ow0gICAgdGhpcy5lbCA9IHRoaXMudHBsLmFwcGVuZChyei5lbC5kb20sIFt0aGlzLnBvc2l0aW9uXSwgdHJ1ZSk7DSAgICB0aGlzLmVsLnVuc2VsZWN0YWJsZSgpOw0gICAgaWYodHJhbnNwYXJlbnQpew0gICAgICAgIHRoaXMuZWwuc2V0T3BhY2l0eSgwKTsNICAgIH0NICAgIHRoaXMuZWwub24oIm1vdXNlZG93biIsIHRoaXMub25Nb3VzZURvd24sIHRoaXMpOw0gICAgaWYoIWRpc2FibGVUcmFja092ZXIpew0gICAgICAgIHRoaXMuZWwub24oIm1vdXNlb3ZlciIsIHRoaXMub25Nb3VzZU92ZXIsIHRoaXMpOw0gICAgICAgIHRoaXMuZWwub24oIm1vdXNlb3V0IiwgdGhpcy5vbk1vdXNlT3V0LCB0aGlzKTsNICAgIH0NfTsNDUV4dC5SZXNpemFibGUuSGFuZGxlLnByb3RvdHlwZSA9IHsNICAgIGFmdGVyUmVzaXplIDogZnVuY3Rpb24ocnopew0gICAgICAgICAgICB9LA0gICAgICAgIG9uTW91c2VEb3duIDogZnVuY3Rpb24oZSl7DSAgICAgICAgdGhpcy5yei5vbk1vdXNlRG93bih0aGlzLCBlKTsNICAgIH0sDSAgICAgICAgb25Nb3VzZU92ZXIgOiBmdW5jdGlvbihlKXsNICAgICAgICB0aGlzLnJ6LmhhbmRsZU92ZXIodGhpcywgZSk7DSAgICB9LA0gICAgICAgIG9uTW91c2VPdXQgOiBmdW5jdGlvbihlKXsNICAgICAgICB0aGlzLnJ6LmhhbmRsZU91dCh0aGlzLCBlKTsNICAgIH0NfTsKCkV4dC5FZGl0b3IgPSBmdW5jdGlvbihmaWVsZCwgY29uZmlnKXsKICAgIEV4dC5FZGl0b3Iuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIGNvbmZpZyk7CiAgICB0aGlzLmZpZWxkID0gZmllbGQ7CiAgICB0aGlzLmFkZEV2ZW50cyh7CiAgICAgICAgCiAgICAgICAgImJlZm9yZXN0YXJ0ZWRpdCIgOiB0cnVlLAogICAgICAgIAogICAgICAgICJzdGFydGVkaXQiIDogdHJ1ZSwKICAgICAgICAKICAgICAgICAiYmVmb3JlY29tcGxldGUiIDogdHJ1ZSwKICAgICAgICAKICAgICAgICAiY29tcGxldGUiIDogdHJ1ZSwKICAgICAgICAKICAgICAgICAic3BlY2lhbGtleSIgOiB0cnVlCiAgICB9KTsKfTsKCkV4dC5leHRlbmQoRXh0LkVkaXRvciwgRXh0LkNvbXBvbmVudCwgewogICAgCiAgICAKICAgIAogICAgCiAgICAKICAgIHZhbHVlIDogIiIsCiAgICAKICAgIGFsaWdubWVudDogImMtYz8iLAogICAgCiAgICBzaGFkb3cgOiAiZnJhbWUiLAogICAgCiAgICBjb25zdHJhaW4gOiBmYWxzZSwKICAgIAogICAgY29tcGxldGVPbkVudGVyIDogZmFsc2UsCiAgICAKICAgIGNhbmNlbE9uRXNjIDogZmFsc2UsCiAgICAKICAgIHVwZGF0ZUVsIDogZmFsc2UsCgogICAgICAgIG9uUmVuZGVyIDogZnVuY3Rpb24oY3QsIHBvc2l0aW9uKXsKICAgICAgICB0aGlzLmVsID0gbmV3IEV4dC5MYXllcih7CiAgICAgICAgICAgIHNoYWRvdzogdGhpcy5zaGFkb3csCiAgICAgICAgICAgIGNsczogIngtZWRpdG9yIiwKICAgICAgICAgICAgcGFyZW50RWwgOiBjdCwKICAgICAgICAgICAgc2hpbSA6IHRoaXMuc2hpbSwKICAgICAgICAgICAgc2hhZG93T2Zmc2V0OjQsCiAgICAgICAgICAgIGlkOiB0aGlzLmlkLAogICAgICAgICAgICBjb25zdHJhaW46IHRoaXMuY29uc3RyYWluCiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5lbC5zZXRTdHlsZSgib3ZlcmZsb3ciLCBFeHQuaXNHZWNrbyA/ICJhdXRvIiA6ICJoaWRkZW4iKTsKICAgICAgICBpZih0aGlzLmZpZWxkLm1zZ1RhcmdldCAhPSAndGl0bGUnKXsKICAgICAgICAgICAgdGhpcy5maWVsZC5tc2dUYXJnZXQgPSAncXRpcCc7CiAgICAgICAgfQogICAgICAgIHRoaXMuZmllbGQucmVuZGVyKHRoaXMuZWwpOwogICAgICAgIGlmKEV4dC5pc0dlY2tvKXsKICAgICAgICAgICAgdGhpcy5maWVsZC5lbC5kb20uc2V0QXR0cmlidXRlKCdhdXRvY29tcGxldGUnLCAnb2ZmJyk7CiAgICAgICAgfQogICAgICAgIHRoaXMuZmllbGQub24oInNwZWNpYWxrZXkiLCB0aGlzLm9uU3BlY2lhbEtleSwgdGhpcyk7CiAgICAgICAgaWYodGhpcy5zd2FsbG93S2V5cyl7CiAgICAgICAgICAgIHRoaXMuZmllbGQuZWwuc3dhbGxvd0V2ZW50KFsna2V5ZG93bicsJ2tleXByZXNzJ10pOwogICAgICAgIH0KICAgICAgICB0aGlzLmZpZWxkLnNob3coKTsKICAgICAgICB0aGlzLmZpZWxkLm9uKCJibHVyIiwgdGhpcy5vbkJsdXIsIHRoaXMpOwogICAgICAgIGlmKHRoaXMuZmllbGQuZ3Jvdyl7CiAgICAgICAgICAgIHRoaXMuZmllbGQub24oImF1dG9zaXplIiwgdGhpcy5lbC5zeW5jLCAgdGhpcy5lbCwge2RlbGF5OjF9KTsKICAgICAgICB9CiAgICB9LAoKICAgIG9uU3BlY2lhbEtleSA6IGZ1bmN0aW9uKGZpZWxkLCBlKXsKICAgICAgICBpZih0aGlzLmNvbXBsZXRlT25FbnRlciAmJiBlLmdldEtleSgpID09IGUuRU5URVIpewogICAgICAgICAgICBlLnN0b3BFdmVudCgpOwogICAgICAgICAgICB0aGlzLmNvbXBsZXRlRWRpdCgpOwogICAgICAgIH1lbHNlIGlmKHRoaXMuY2FuY2VsT25Fc2MgJiYgZS5nZXRLZXkoKSA9PSBlLkVTQyl7CiAgICAgICAgICAgIHRoaXMuY2FuY2VsRWRpdCgpOwogICAgICAgIH1lbHNlewogICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgnc3BlY2lhbGtleScsIGZpZWxkLCBlKTsKICAgICAgICB9CiAgICB9LAoKICAgIAogICAgc3RhcnRFZGl0IDogZnVuY3Rpb24oZWwsIHZhbHVlKXsKICAgICAgICBpZih0aGlzLmVkaXRpbmcpewogICAgICAgICAgICB0aGlzLmNvbXBsZXRlRWRpdCgpOwogICAgICAgIH0KICAgICAgICB0aGlzLmJvdW5kRWwgPSBFeHQuZ2V0KGVsKTsKICAgICAgICB2YXIgdiA9IHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHRoaXMuYm91bmRFbC5kb20uaW5uZXJIVE1MOwogICAgICAgIGlmKCF0aGlzLnJlbmRlcmVkKXsKICAgICAgICAgICAgdGhpcy5yZW5kZXIodGhpcy5wYXJlbnRFbCB8fCBkb2N1bWVudC5ib2R5KTsKICAgICAgICB9CiAgICAgICAgaWYodGhpcy5maXJlRXZlbnQoImJlZm9yZXN0YXJ0ZWRpdCIsIHRoaXMsIHRoaXMuYm91bmRFbCwgdikgPT09IGZhbHNlKXsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLnN0YXJ0VmFsdWUgPSB2OwogICAgICAgIHRoaXMuZmllbGQuc2V0VmFsdWUodik7CiAgICAgICAgaWYodGhpcy5hdXRvU2l6ZSl7CiAgICAgICAgICAgIHZhciBzeiA9IHRoaXMuYm91bmRFbC5nZXRTaXplKCk7CiAgICAgICAgICAgIHN3aXRjaCh0aGlzLmF1dG9TaXplKXsKICAgICAgICAgICAgICAgIGNhc2UgIndpZHRoIjoKICAgICAgICAgICAgICAgIHRoaXMuc2V0U2l6ZShzei53aWR0aCwgICIiKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAiaGVpZ2h0IjoKICAgICAgICAgICAgICAgIHRoaXMuc2V0U2l6ZSgiIiwgIHN6LmhlaWdodCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICB0aGlzLnNldFNpemUoc3oud2lkdGgsICBzei5oZWlnaHQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuZWwuYWxpZ25Ubyh0aGlzLmJvdW5kRWwsIHRoaXMuYWxpZ25tZW50KTsKICAgICAgICB0aGlzLmVkaXRpbmcgPSB0cnVlOwogICAgICAgIGlmKEV4dC5RdWlja1RpcHMpewogICAgICAgICAgICBFeHQuUXVpY2tUaXBzLmRpc2FibGUoKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5zaG93KCk7CiAgICB9LAoKICAgIAogICAgc2V0U2l6ZSA6IGZ1bmN0aW9uKHcsIGgpewogICAgICAgIHRoaXMuZmllbGQuc2V0U2l6ZSh3LCBoKTsKICAgICAgICBpZih0aGlzLmVsKXsKICAgICAgICAgICAgdGhpcy5lbC5zeW5jKCk7CiAgICAgICAgfQogICAgfSwKCiAgICAKICAgIHJlYWxpZ24gOiBmdW5jdGlvbigpewogICAgICAgIHRoaXMuZWwuYWxpZ25Ubyh0aGlzLmJvdW5kRWwsIHRoaXMuYWxpZ25tZW50KTsKICAgIH0sCgogICAgCiAgICBjb21wbGV0ZUVkaXQgOiBmdW5jdGlvbihyZW1haW5WaXNpYmxlKXsKICAgICAgICBpZighdGhpcy5lZGl0aW5nKXsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgdiA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICBpZih0aGlzLnJldmVydEludmFsaWQgIT09IGZhbHNlICYmICF0aGlzLmZpZWxkLmlzVmFsaWQoKSl7CiAgICAgICAgICAgIHYgPSB0aGlzLnN0YXJ0VmFsdWU7CiAgICAgICAgICAgIHRoaXMuY2FuY2VsRWRpdCh0cnVlKTsKICAgICAgICB9CiAgICAgICAgaWYoU3RyaW5nKHYpID09PSBTdHJpbmcodGhpcy5zdGFydFZhbHVlKSAmJiB0aGlzLmlnbm9yZU5vQ2hhbmdlKXsKICAgICAgICAgICAgdGhpcy5lZGl0aW5nID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuaGlkZSgpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmKHRoaXMuZmlyZUV2ZW50KCJiZWZvcmVjb21wbGV0ZSIsIHRoaXMsIHYsIHRoaXMuc3RhcnRWYWx1ZSkgIT09IGZhbHNlKXsKICAgICAgICAgICAgdGhpcy5lZGl0aW5nID0gZmFsc2U7CiAgICAgICAgICAgIGlmKHRoaXMudXBkYXRlRWwgJiYgdGhpcy5ib3VuZEVsKXsKICAgICAgICAgICAgICAgIHRoaXMuYm91bmRFbC51cGRhdGUodik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYocmVtYWluVmlzaWJsZSAhPT0gdHJ1ZSl7CiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgiY29tcGxldGUiLCB0aGlzLCB2LCB0aGlzLnN0YXJ0VmFsdWUpOwogICAgICAgIH0KICAgIH0sCgogICAgICAgIG9uU2hvdyA6IGZ1bmN0aW9uKCl7CiAgICAgICAgdGhpcy5lbC5zaG93KCk7CiAgICAgICAgaWYodGhpcy5oaWRlRWwgIT09IGZhbHNlKXsKICAgICAgICAgICAgdGhpcy5ib3VuZEVsLmhpZGUoKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5maWVsZC5zaG93KCk7CiAgICAgICAgaWYoRXh0LmlzSUUgJiYgIXRoaXMuZml4SUVGb2N1cyl7ICAgICAgICAgICAgIHRoaXMuZml4SUVGb2N1cyA9IHRydWU7CiAgICAgICAgICAgIHRoaXMuZGVmZXJyZWRGb2N1cy5kZWZlcig1MCwgdGhpcyk7CiAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIHRoaXMuZmllbGQuZm9jdXMoKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5maXJlRXZlbnQoInN0YXJ0ZWRpdCIsIHRoaXMuYm91bmRFbCwgdGhpcy5zdGFydFZhbHVlKTsKICAgIH0sCgogICAgZGVmZXJyZWRGb2N1cyA6IGZ1bmN0aW9uKCl7CiAgICAgICAgaWYodGhpcy5lZGl0aW5nKXsKICAgICAgICAgICAgdGhpcy5maWVsZC5mb2N1cygpOwogICAgICAgIH0KICAgIH0sCgogICAgCiAgICBjYW5jZWxFZGl0IDogZnVuY3Rpb24ocmVtYWluVmlzaWJsZSl7CiAgICAgICAgaWYodGhpcy5lZGl0aW5nKXsKICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZSh0aGlzLnN0YXJ0VmFsdWUpOwogICAgICAgICAgICBpZihyZW1haW5WaXNpYmxlICE9PSB0cnVlKXsKICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSwKCiAgICAgICAgb25CbHVyIDogZnVuY3Rpb24oKXsKICAgICAgICBpZih0aGlzLmFsbG93Qmx1ciAhPT0gdHJ1ZSAmJiB0aGlzLmVkaXRpbmcpewogICAgICAgICAgICB0aGlzLmNvbXBsZXRlRWRpdCgpOwogICAgICAgIH0KICAgIH0sCgogICAgICAgIG9uSGlkZSA6IGZ1bmN0aW9uKCl7CiAgICAgICAgaWYodGhpcy5lZGl0aW5nKXsKICAgICAgICAgICAgdGhpcy5jb21wbGV0ZUVkaXQoKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLmZpZWxkLmJsdXIoKTsKICAgICAgICBpZih0aGlzLmZpZWxkLmNvbGxhcHNlKXsKICAgICAgICAgICAgdGhpcy5maWVsZC5jb2xsYXBzZSgpOwogICAgICAgIH0KICAgICAgICB0aGlzLmVsLmhpZGUoKTsKICAgICAgICBpZih0aGlzLmhpZGVFbCAhPT0gZmFsc2UpewogICAgICAgICAgICB0aGlzLmJvdW5kRWwuc2hvdygpOwogICAgICAgIH0KICAgICAgICBpZihFeHQuUXVpY2tUaXBzKXsKICAgICAgICAgICAgRXh0LlF1aWNrVGlwcy5lbmFibGUoKTsKICAgICAgICB9CiAgICB9LAoKICAgIAogICAgc2V0VmFsdWUgOiBmdW5jdGlvbih2KXsKICAgICAgICB0aGlzLmZpZWxkLnNldFZhbHVlKHYpOwogICAgfSwKCiAgICAKICAgIGdldFZhbHVlIDogZnVuY3Rpb24oKXsKICAgICAgICByZXR1cm4gdGhpcy5maWVsZC5nZXRWYWx1ZSgpOwogICAgfQp9KTsKDQpFeHQuQmFzaWNEaWFsb2cgPSBmdW5jdGlvbihlbCwgY29uZmlnKXsNCiAgICB0aGlzLmVsID0gRXh0LmdldChlbCk7DQogICAgdmFyIGRoID0gRXh0LkRvbUhlbHBlcjsNCiAgICBpZighdGhpcy5lbCAmJiBjb25maWcgJiYgY29uZmlnLmF1dG9DcmVhdGUpew0KICAgICAgICBpZih0eXBlb2YgY29uZmlnLmF1dG9DcmVhdGUgPT0gIm9iamVjdCIpew0KICAgICAgICAgICAgaWYoIWNvbmZpZy5hdXRvQ3JlYXRlLmlkKXsNCiAgICAgICAgICAgICAgICBjb25maWcuYXV0b0NyZWF0ZS5pZCA9IGVsOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5lbCA9IGRoLmFwcGVuZChkb2N1bWVudC5ib2R5LA0KICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmF1dG9DcmVhdGUsIHRydWUpOw0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIHRoaXMuZWwgPSBkaC5hcHBlbmQoZG9jdW1lbnQuYm9keSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHt0YWc6ICJkaXYiLCBpZDogZWwsIHN0eWxlOid2aXNpYmlsaXR5OmhpZGRlbjsnfSwgdHJ1ZSk7DQogICAgICAgIH0NCiAgICB9DQogICAgZWwgPSB0aGlzLmVsOw0KICAgIGVsLnNldERpc3BsYXllZCh0cnVlKTsNCiAgICBlbC5oaWRlID0gdGhpcy5oaWRlQWN0aW9uOw0KICAgIHRoaXMuaWQgPSBlbC5pZDsNCiAgICBlbC5hZGRDbGFzcygieC1kbGciKTsNCg0KICAgIEV4dC5hcHBseSh0aGlzLCBjb25maWcpOw0KDQogICAgdGhpcy5wcm94eSA9IGVsLmNyZWF0ZVByb3h5KCJ4LWRsZy1wcm94eSIpOw0KICAgIHRoaXMucHJveHkuaGlkZSA9IHRoaXMuaGlkZUFjdGlvbjsNCiAgICB0aGlzLnByb3h5LnNldE9wYWNpdHkoLjUpOw0KICAgIHRoaXMucHJveHkuaGlkZSgpOw0KDQogICAgaWYoY29uZmlnLndpZHRoKXsNCiAgICAgICAgZWwuc2V0V2lkdGgoY29uZmlnLndpZHRoKTsNCiAgICB9DQogICAgaWYoY29uZmlnLmhlaWdodCl7DQogICAgICAgIGVsLnNldEhlaWdodChjb25maWcuaGVpZ2h0KTsNCiAgICB9DQogICAgdGhpcy5zaXplID0gZWwuZ2V0U2l6ZSgpOw0KICAgIGlmKHR5cGVvZiBjb25maWcueCAhPSAidW5kZWZpbmVkIiAmJiB0eXBlb2YgY29uZmlnLnkgIT0gInVuZGVmaW5lZCIpew0KICAgICAgICB0aGlzLnh5ID0gW2NvbmZpZy54LGNvbmZpZy55XTsNCiAgICB9ZWxzZXsNCiAgICAgICAgdGhpcy54eSA9IGVsLmdldENlbnRlclhZKHRydWUpOw0KICAgIH0NCiAgICANCiAgICB0aGlzLmhlYWRlciA9IGVsLmNoaWxkKCI+IC54LWRsZy1oZCIpOw0KICAgIA0KICAgIHRoaXMuYm9keSA9IGVsLmNoaWxkKCI+IC54LWRsZy1iZCIpOw0KICAgIA0KICAgIHRoaXMuZm9vdGVyID0gZWwuY2hpbGQoIj4gLngtZGxnLWZ0Iik7DQoNCiAgICBpZighdGhpcy5oZWFkZXIpew0KICAgICAgICB0aGlzLmhlYWRlciA9IGVsLmNyZWF0ZUNoaWxkKHt0YWc6ICJkaXYiLCBjbHM6IngtZGxnLWhkIiwgaHRtbDogIiYjMTYwOyJ9LCB0aGlzLmJvZHkgPyB0aGlzLmJvZHkuZG9tIDogbnVsbCk7DQogICAgfQ0KICAgIGlmKCF0aGlzLmJvZHkpew0KICAgICAgICB0aGlzLmJvZHkgPSBlbC5jcmVhdGVDaGlsZCh7dGFnOiAiZGl2IiwgY2xzOiJ4LWRsZy1iZCJ9KTsNCiAgICB9DQoNCiAgICB0aGlzLmhlYWRlci51bnNlbGVjdGFibGUoKTsNCiAgICBpZih0aGlzLnRpdGxlKXsNCiAgICAgICAgdGhpcy5oZWFkZXIudXBkYXRlKHRoaXMudGl0bGUpOw0KICAgIH0NCiAgICAKICAgIHRoaXMuZm9jdXNFbCA9IGVsLmNyZWF0ZUNoaWxkKHt0YWc6ICJhIiwgaHJlZjoiIyIsIGNsczoieC1kbGctZm9jdXMiLCB0YWJJbmRleDoiLTEifSk7DQogICAgdGhpcy5mb2N1c0VsLnN3YWxsb3dFdmVudCgiY2xpY2siLCB0cnVlKTsNCg0KICAgIHRoaXMuaGVhZGVyLndyYXAoe2NsczoieC1kbGctaGQtcmlnaHQifSkud3JhcCh7Y2xzOiJ4LWRsZy1oZC1sZWZ0In0sIHRydWUpOw0KDQogICAgCiAgICB0aGlzLmJ3cmFwID0gdGhpcy5ib2R5LndyYXAoe3RhZzogImRpdiIsIGNsczoieC1kbGctZGxnLWJvZHkifSk7DQogICAgaWYodGhpcy5mb290ZXIpew0KICAgICAgICB0aGlzLmJ3cmFwLmRvbS5hcHBlbmRDaGlsZCh0aGlzLmZvb3Rlci5kb20pOw0KICAgIH0NCg0KICAgIHRoaXMuYmcgPSB0aGlzLmVsLmNyZWF0ZUNoaWxkKHsNCiAgICAgICAgdGFnOiAiZGl2IiwgY2xzOiJ4LWRsZy1iZyIsDQogICAgICAgIGh0bWw6ICc8ZGl2IGNsYXNzPSJ4LWRsZy1iZy1sZWZ0Ij48ZGl2IGNsYXNzPSJ4LWRsZy1iZy1yaWdodCI+PGRpdiBjbGFzcz0ieC1kbGctYmctY2VudGVyIj4mIzE2MDs8L2Rpdj48L2Rpdj48L2Rpdj4nDQogICAgfSk7DQogICAgdGhpcy5jZW50ZXJCZyA9IHRoaXMuYmcuY2hpbGQoImRpdi54LWRsZy1iZy1jZW50ZXIiKTsNCg0KDQogICAgaWYodGhpcy5hdXRvU2Nyb2xsICE9PSBmYWxzZSAmJiAhdGhpcy5hdXRvVGFicyl7DQogICAgICAgIHRoaXMuYm9keS5zZXRTdHlsZSgib3ZlcmZsb3ciLCAiYXV0byIpOw0KICAgIH0NCg0KICAgIHRoaXMudG9vbGJveCA9IHRoaXMuZWwuY3JlYXRlQ2hpbGQoe2NsczogIngtZGxnLXRvb2xib3gifSk7DQoNCiAgICBpZih0aGlzLmNsb3NhYmxlICE9PSBmYWxzZSl7DQogICAgICAgIHRoaXMuZWwuYWRkQ2xhc3MoIngtZGxnLWNsb3NhYmxlIik7DQogICAgICAgIHRoaXMuY2xvc2UgPSB0aGlzLnRvb2xib3guY3JlYXRlQ2hpbGQoe2NsczoieC1kbGctY2xvc2UifSk7DQogICAgICAgIHRoaXMuY2xvc2Uub24oImNsaWNrIiwgdGhpcy5jbG9zZUNsaWNrLCB0aGlzKTsNCiAgICAgICAgdGhpcy5jbG9zZS5hZGRDbGFzc09uT3ZlcigieC1kbGctY2xvc2Utb3ZlciIpOw0KICAgIH0NCiAgICBpZih0aGlzLmNvbGxhcHNpYmxlICE9PSBmYWxzZSl7DQogICAgICAgIHRoaXMuY29sbGFwc2VCdG4gPSB0aGlzLnRvb2xib3guY3JlYXRlQ2hpbGQoe2NsczoieC1kbGctY29sbGFwc2UifSk7DQogICAgICAgIHRoaXMuY29sbGFwc2VCdG4ub24oImNsaWNrIiwgdGhpcy5jb2xsYXBzZUNsaWNrLCB0aGlzKTsNCiAgICAgICAgdGhpcy5jb2xsYXBzZUJ0bi5hZGRDbGFzc09uT3ZlcigieC1kbGctY29sbGFwc2Utb3ZlciIpOw0KICAgICAgICB0aGlzLmhlYWRlci5vbigiZGJsY2xpY2siLCB0aGlzLmNvbGxhcHNlQ2xpY2ssIHRoaXMpOw0KICAgIH0NCiAgICBpZih0aGlzLnJlc2l6YWJsZSAhPT0gZmFsc2Upew0KICAgICAgICB0aGlzLmVsLmFkZENsYXNzKCJ4LWRsZy1yZXNpemFibGUiKTsNCiAgICAgICAgdGhpcy5yZXNpemVyID0gbmV3IEV4dC5SZXNpemFibGUoZWwsIHsNCiAgICAgICAgICAgIG1pbldpZHRoOiB0aGlzLm1pbldpZHRoIHx8IDgwLA0KICAgICAgICAgICAgbWluSGVpZ2h0OnRoaXMubWluSGVpZ2h0IHx8IDgwLA0KICAgICAgICAgICAgaGFuZGxlczogdGhpcy5yZXNpemVIYW5kbGVzIHx8ICJhbGwiLA0KICAgICAgICAgICAgcGlubmVkOiB0cnVlDQogICAgICAgIH0pOw0KICAgICAgICB0aGlzLnJlc2l6ZXIub24oImJlZm9yZXJlc2l6ZSIsIHRoaXMuYmVmb3JlUmVzaXplLCB0aGlzKTsNCiAgICAgICAgdGhpcy5yZXNpemVyLm9uKCJyZXNpemUiLCB0aGlzLm9uUmVzaXplLCB0aGlzKTsNCiAgICB9DQogICAgaWYodGhpcy5kcmFnZ2FibGUgIT09IGZhbHNlKXsNCiAgICAgICAgZWwuYWRkQ2xhc3MoIngtZGxnLWRyYWdnYWJsZSIpOw0KICAgICAgICBpZiAoIXRoaXMucHJveHlEcmFnKSB7DQogICAgICAgICAgICB2YXIgZGQgPSBuZXcgRXh0LmRkLkREKGVsLmRvbS5pZCwgIldpbmRvd0RyYWciKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIHZhciBkZCA9IG5ldyBFeHQuZGQuRERQcm94eShlbC5kb20uaWQsICJXaW5kb3dEcmFnIiwge2RyYWdFbElkOiB0aGlzLnByb3h5LmlkfSk7DQogICAgICAgIH0NCiAgICAgICAgZGQuc2V0SGFuZGxlRWxJZCh0aGlzLmhlYWRlci5pZCk7DQogICAgICAgIGRkLmVuZERyYWcgPSB0aGlzLmVuZE1vdmUuY3JlYXRlRGVsZWdhdGUodGhpcyk7DQogICAgICAgIGRkLnN0YXJ0RHJhZyA9IHRoaXMuc3RhcnRNb3ZlLmNyZWF0ZURlbGVnYXRlKHRoaXMpOw0KICAgICAgICBkZC5vbkRyYWcgPSB0aGlzLm9uRHJhZy5jcmVhdGVEZWxlZ2F0ZSh0aGlzKTsNCiAgICAgICAgZGQuc2Nyb2xsID0gZmFsc2U7DQogICAgICAgIHRoaXMuZGQgPSBkZDsNCiAgICB9DQogICAgaWYodGhpcy5tb2RhbCl7DQogICAgICAgIHRoaXMubWFzayA9IGRoLmFwcGVuZChkb2N1bWVudC5ib2R5LCB7dGFnOiAiZGl2IiwgY2xzOiJ4LWRsZy1tYXNrIn0sIHRydWUpOw0KICAgICAgICB0aGlzLm1hc2suZW5hYmxlRGlzcGxheU1vZGUoImJsb2NrIik7DQogICAgICAgIHRoaXMubWFzay5oaWRlKCk7DQogICAgICAgIHRoaXMuZWwuYWRkQ2xhc3MoIngtZGxnLW1vZGFsIik7DQogICAgfQ0KICAgIGlmKHRoaXMuc2hhZG93KXsNCiAgICAgICAgdGhpcy5zaGFkb3cgPSBuZXcgRXh0LlNoYWRvdyh7DQogICAgICAgICAgICBtb2RlIDogdHlwZW9mIHRoaXMuc2hhZG93ID09ICJzdHJpbmciID8gdGhpcy5zaGFkb3cgOiAic2lkZXMiLA0KICAgICAgICAgICAgb2Zmc2V0IDogdGhpcy5zaGFkb3dPZmZzZXQNCiAgICAgICAgfSk7DQogICAgfWVsc2V7DQogICAgICAgIHRoaXMuc2hhZG93T2Zmc2V0ID0gMDsNCiAgICB9DQogICAgaWYoRXh0LnVzZVNoaW1zICYmIHRoaXMuc2hpbSAhPT0gZmFsc2Upew0KICAgICAgICB0aGlzLnNoaW0gPSB0aGlzLmVsLmNyZWF0ZVNoaW0oKTsNCiAgICAgICAgdGhpcy5zaGltLmhpZGUgPSB0aGlzLmhpZGVBY3Rpb247DQogICAgICAgIHRoaXMuc2hpbS5oaWRlKCk7DQogICAgfWVsc2V7DQogICAgICAgIHRoaXMuc2hpbSA9IGZhbHNlOw0KICAgIH0NCiAgICBpZih0aGlzLmF1dG9UYWJzKXsNCiAgICAgICAgdGhpcy5pbml0VGFicygpOw0KICAgIH0NCiAgICB0aGlzLmFkZEV2ZW50cyh7DQogICAgICAgIA0KICAgICAgICAia2V5ZG93biIgOiB0cnVlLA0KICAgICAgICANCiAgICAgICAgIm1vdmUiIDogdHJ1ZSwNCiAgICAgICAgDQogICAgICAgICJyZXNpemUiIDogdHJ1ZSwNCiAgICAgICAgDQogICAgICAgICJiZWZvcmVoaWRlIiA6IHRydWUsDQogICAgICAgIA0KICAgICAgICAiaGlkZSIgOiB0cnVlLA0KICAgICAgICANCiAgICAgICAgImJlZm9yZXNob3ciIDogdHJ1ZSwNCiAgICAgICAgDQogICAgICAgICJzaG93IiA6IHRydWUNCiAgICB9KTsNCiAgICBlbC5vbigia2V5ZG93biIsIHRoaXMub25LZXlEb3duLCB0aGlzKTsNCiAgICBlbC5vbigibW91c2Vkb3duIiwgdGhpcy50b0Zyb250LCB0aGlzKTsNCiAgICBFeHQuRXZlbnRNYW5hZ2VyLm9uV2luZG93UmVzaXplKHRoaXMuYWRqdXN0Vmlld3BvcnQsIHRoaXMsIHRydWUpOw0KICAgIHRoaXMuZWwuaGlkZSgpOw0KICAgIEV4dC5EaWFsb2dNYW5hZ2VyLnJlZ2lzdGVyKHRoaXMpOw0KICAgIEV4dC5CYXNpY0RpYWxvZy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7DQp9Ow0KDQpFeHQuZXh0ZW5kKEV4dC5CYXNpY0RpYWxvZywgRXh0LnV0aWwuT2JzZXJ2YWJsZSwgew0KICAgIHNoYWRvd09mZnNldDogRXh0LmlzSUUgPyA2IDogNSwNCiAgICBtaW5IZWlnaHQ6IDgwLA0KICAgIG1pbldpZHRoOiAyMDAsDQogICAgbWluQnV0dG9uV2lkdGg6IDc1LA0KICAgIGRlZmF1bHRCdXR0b246IG51bGwsDQogICAgYnV0dG9uQWxpZ246ICJyaWdodCIsDQogICAgdGFiVGFnOiAnZGl2JywNCiAgICBmaXJzdFNob3c6IHRydWUsDQoNCiAgICANCiAgICBzZXRUaXRsZSA6IGZ1bmN0aW9uKHRleHQpew0KICAgICAgICB0aGlzLmhlYWRlci51cGRhdGUodGV4dCk7DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0sDQoNCiAgICAKICAgIGNsb3NlQ2xpY2sgOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLmhpZGUoKTsNCiAgICB9LA0KDQogICAgCiAgICBjb2xsYXBzZUNsaWNrIDogZnVuY3Rpb24oKXsNCiAgICAgICAgdGhpc1t0aGlzLmNvbGxhcHNlZCA/ICJleHBhbmQiIDogImNvbGxhcHNlIl0oKTsNCiAgICB9LA0KDQogICAgDQogICAgY29sbGFwc2UgOiBmdW5jdGlvbigpew0KICAgICAgICBpZighdGhpcy5jb2xsYXBzZWQpew0KICAgICAgICAgICAgdGhpcy5jb2xsYXBzZWQgPSB0cnVlOw0KICAgICAgICAgICAgdGhpcy5lbC5hZGRDbGFzcygieC1kbGctY29sbGFwc2VkIik7DQogICAgICAgICAgICB0aGlzLnJlc3RvcmVIZWlnaHQgPSB0aGlzLmVsLmdldEhlaWdodCgpOw0KICAgICAgICAgICAgdGhpcy5yZXNpemVUbyh0aGlzLmVsLmdldFdpZHRoKCksIHRoaXMuaGVhZGVyLmdldEhlaWdodCgpKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICANCiAgICBleHBhbmQgOiBmdW5jdGlvbigpew0KICAgICAgICBpZih0aGlzLmNvbGxhcHNlZCl7DQogICAgICAgICAgICB0aGlzLmNvbGxhcHNlZCA9IGZhbHNlOw0KICAgICAgICAgICAgdGhpcy5lbC5yZW1vdmVDbGFzcygieC1kbGctY29sbGFwc2VkIik7DQogICAgICAgICAgICB0aGlzLnJlc2l6ZVRvKHRoaXMuZWwuZ2V0V2lkdGgoKSwgdGhpcy5yZXN0b3JlSGVpZ2h0KTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICANCiAgICBpbml0VGFicyA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHZhciB0YWJzID0gdGhpcy5nZXRUYWJzKCk7DQogICAgICAgIHdoaWxlKHRhYnMuZ2V0VGFiKDApKXsNCiAgICAgICAgICAgIHRhYnMucmVtb3ZlVGFiKDApOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuZWwuc2VsZWN0KHRoaXMudGFiVGFnKycueC1kbGctdGFiJykuZWFjaChmdW5jdGlvbihlbCl7DQogICAgICAgICAgICB2YXIgZG9tID0gZWwuZG9tOw0KICAgICAgICAgICAgdGFicy5hZGRUYWIoRXh0LmlkKGRvbSksIGRvbS50aXRsZSk7DQogICAgICAgICAgICBkb20udGl0bGUgPSAiIjsNCiAgICAgICAgfSk7DQogICAgICAgIHRhYnMuYWN0aXZhdGUoMCk7DQogICAgICAgIHJldHVybiB0YWJzOw0KICAgIH0sDQoNCiAgICAKICAgIGJlZm9yZVJlc2l6ZSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHRoaXMucmVzaXplci5taW5IZWlnaHQgPSBNYXRoLm1heCh0aGlzLm1pbkhlaWdodCwgdGhpcy5nZXRIZWFkZXJGb290ZXJIZWlnaHQodHJ1ZSkrNDApOw0KICAgIH0sDQoNCiAgICAKICAgIG9uUmVzaXplIDogZnVuY3Rpb24oKXsNCiAgICAgICAgdGhpcy5yZWZyZXNoU2l6ZSgpOw0KICAgICAgICB0aGlzLnN5bmNCb2R5SGVpZ2h0KCk7DQogICAgICAgIHRoaXMuYWRqdXN0QXNzZXRzKCk7DQogICAgICAgIHRoaXMuZm9jdXMoKTsNCiAgICAgICAgdGhpcy5maXJlRXZlbnQoInJlc2l6ZSIsIHRoaXMsIHRoaXMuc2l6ZS53aWR0aCwgdGhpcy5zaXplLmhlaWdodCk7DQogICAgfSwNCg0KICAgIAogICAgb25LZXlEb3duIDogZnVuY3Rpb24oZSl7DQogICAgICAgIGlmKHRoaXMuaXNWaXNpYmxlKCkpew0KICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoImtleWRvd24iLCB0aGlzLCBlKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICANCiAgICByZXNpemVUbyA6IGZ1bmN0aW9uKHdpZHRoLCBoZWlnaHQpew0KICAgICAgICB0aGlzLmVsLnNldFNpemUod2lkdGgsIGhlaWdodCk7DQogICAgICAgIHRoaXMuc2l6ZSA9IHt3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0fTsNCiAgICAgICAgdGhpcy5zeW5jQm9keUhlaWdodCgpOw0KICAgICAgICBpZih0aGlzLmZpeGVkY2VudGVyKXsNCiAgICAgICAgICAgIHRoaXMuY2VudGVyKCk7DQogICAgICAgIH0NCiAgICAgICAgaWYodGhpcy5pc1Zpc2libGUoKSl7DQogICAgICAgICAgICB0aGlzLmNvbnN0cmFpblhZKCk7DQogICAgICAgICAgICB0aGlzLmFkanVzdEFzc2V0cygpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuZmlyZUV2ZW50KCJyZXNpemUiLCB0aGlzLCB3aWR0aCwgaGVpZ2h0KTsNCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSwNCg0KDQogICAgDQogICAgc2V0Q29udGVudFNpemUgOiBmdW5jdGlvbih3LCBoKXsNCiAgICAgICAgaCArPSB0aGlzLmdldEhlYWRlckZvb3RlckhlaWdodCgpICsgdGhpcy5ib2R5LmdldE1hcmdpbnMoInRiIik7DQogICAgICAgIHcgKz0gdGhpcy5ib2R5LmdldE1hcmdpbnMoImxyIikgKyB0aGlzLmJ3cmFwLmdldE1hcmdpbnMoImxyIikgKyB0aGlzLmNlbnRlckJnLmdldFBhZGRpbmcoImxyIik7DQogICAgICAgIAogICAgICAgICAgICBoICs9ICB0aGlzLmJvZHkuZ2V0UGFkZGluZygidGIiKSArIHRoaXMuYndyYXAuZ2V0Qm9yZGVyV2lkdGgoInRiIikgKyB0aGlzLmJvZHkuZ2V0Qm9yZGVyV2lkdGgoInRiIikgKyB0aGlzLmVsLmdldEJvcmRlcldpZHRoKCJ0YiIpOw0KICAgICAgICAgICAgdyArPSB0aGlzLmJvZHkuZ2V0UGFkZGluZygibHIiKSArIHRoaXMuYndyYXAuZ2V0Qm9yZGVyV2lkdGgoImxyIikgKyB0aGlzLmJvZHkuZ2V0Qm9yZGVyV2lkdGgoImxyIikgKyB0aGlzLmJ3cmFwLmdldFBhZGRpbmcoImxyIikgKyB0aGlzLmVsLmdldEJvcmRlcldpZHRoKCJsciIpOw0KICAgICAgICAKICAgICAgICBpZih0aGlzLnRhYnMpew0KICAgICAgICAgICAgaCArPSB0aGlzLnRhYnMuc3RyaXBXcmFwLmdldEhlaWdodCgpICsgdGhpcy50YWJzLmJvZHlFbC5nZXRNYXJnaW5zKCJ0YiIpICsgdGhpcy50YWJzLmJvZHlFbC5nZXRQYWRkaW5nKCJ0YiIpOw0KICAgICAgICAgICAgdyArPSB0aGlzLnRhYnMuYm9keUVsLmdldE1hcmdpbnMoImxyIikgKyB0aGlzLnRhYnMuYm9keUVsLmdldFBhZGRpbmcoImxyIik7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5yZXNpemVUbyh3LCBoKTsNCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSwNCg0KICAgIA0KICAgIGFkZEtleUxpc3RlbmVyIDogZnVuY3Rpb24oa2V5LCBmbiwgc2NvcGUpew0KICAgICAgICB2YXIga2V5Q29kZSwgc2hpZnQsIGN0cmwsIGFsdDsNCiAgICAgICAgaWYodHlwZW9mIGtleSA9PSAib2JqZWN0IiAmJiAhKGtleSBpbnN0YW5jZW9mIEFycmF5KSl7DQogICAgICAgICAgICBrZXlDb2RlID0ga2V5WyJrZXkiXTsNCiAgICAgICAgICAgIHNoaWZ0ID0ga2V5WyJzaGlmdCJdOw0KICAgICAgICAgICAgY3RybCA9IGtleVsiY3RybCJdOw0KICAgICAgICAgICAgYWx0ID0ga2V5WyJhbHQiXTsNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICBrZXlDb2RlID0ga2V5Ow0KICAgICAgICB9DQogICAgICAgIHZhciBoYW5kbGVyID0gZnVuY3Rpb24oZGxnLCBlKXsNCiAgICAgICAgICAgIGlmKCghc2hpZnQgfHwgZS5zaGlmdEtleSkgJiYgKCFjdHJsIHx8IGUuY3RybEtleSkgJiYgICghYWx0IHx8IGUuYWx0S2V5KSl7DQogICAgICAgICAgICAgICAgdmFyIGsgPSBlLmdldEtleSgpOw0KICAgICAgICAgICAgICAgIGlmKGtleUNvZGUgaW5zdGFuY2VvZiBBcnJheSl7DQogICAgICAgICAgICAgICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IGtleUNvZGUubGVuZ3RoOyBpIDwgbGVuOyBpKyspew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoa2V5Q29kZVtpXSA9PSBrKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgZm4uY2FsbChzY29wZSB8fCB3aW5kb3csIGRsZywgaywgZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgICAgICBpZihrID09IGtleUNvZGUpew0KICAgICAgICAgICAgICAgICAgICAgICAgZm4uY2FsbChzY29wZSB8fCB3aW5kb3csIGRsZywgaywgZSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgICAgIHRoaXMub24oImtleWRvd24iLCBoYW5kbGVyKTsNCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSwNCg0KICAgIA0KICAgIGdldFRhYnMgOiBmdW5jdGlvbigpew0KICAgICAgICBpZighdGhpcy50YWJzKXsNCiAgICAgICAgICAgIHRoaXMuZWwuYWRkQ2xhc3MoIngtZGxnLWF1dG8tdGFicyIpOw0KICAgICAgICAgICAgdGhpcy5ib2R5LmFkZENsYXNzKHRoaXMudGFiUG9zaXRpb24gPT0gImJvdHRvbSIgPyAieC10YWJzLWJvdHRvbSIgOiAieC10YWJzLXRvcCIpOw0KICAgICAgICAgICAgdGhpcy50YWJzID0gbmV3IEV4dC5UYWJQYW5lbCh0aGlzLmJvZHkuZG9tLCB0aGlzLnRhYlBvc2l0aW9uID09ICJib3R0b20iKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdGhpcy50YWJzOw0KICAgIH0sDQoNCiAgICANCiAgICBhZGRCdXR0b24gOiBmdW5jdGlvbihjb25maWcsIGhhbmRsZXIsIHNjb3BlKXsNCiAgICAgICAgdmFyIGRoID0gRXh0LkRvbUhlbHBlcjsNCiAgICAgICAgaWYoIXRoaXMuZm9vdGVyKXsNCiAgICAgICAgICAgIHRoaXMuZm9vdGVyID0gZGguYXBwZW5kKHRoaXMuYndyYXAsIHt0YWc6ICJkaXYiLCBjbHM6IngtZGxnLWZ0In0sIHRydWUpOw0KICAgICAgICB9DQogICAgICAgIGlmKCF0aGlzLmJ0bkNvbnRhaW5lcil7DQogICAgICAgICAgICB2YXIgdGIgPSB0aGlzLmZvb3Rlci5jcmVhdGVDaGlsZCh7DQoNCiAgICAgICAgICAgICAgICBjbHM6IngtZGxnLWJ0bnMgeC1kbGctYnRucy0iK3RoaXMuYnV0dG9uQWxpZ24sDQogICAgICAgICAgICAgICAgaHRtbDonPHRhYmxlIGNlbGxzcGFjaW5nPSIwIj48dGJvZHk+PHRyPjwvdHI+PC90Ym9keT48L3RhYmxlPjxkaXYgY2xhc3M9IngtY2xlYXIiPjwvZGl2PicNCiAgICAgICAgICAgIH0sIG51bGwsIHRydWUpOw0KICAgICAgICAgICAgdGhpcy5idG5Db250YWluZXIgPSB0Yi5maXJzdENoaWxkLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZDsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgYmNvbmZpZyA9IHsNCiAgICAgICAgICAgIGhhbmRsZXI6IGhhbmRsZXIsDQogICAgICAgICAgICBzY29wZTogc2NvcGUsDQogICAgICAgICAgICBtaW5XaWR0aDogdGhpcy5taW5CdXR0b25XaWR0aCwNCiAgICAgICAgICAgIGhpZGVQYXJlbnQ6dHJ1ZQ0KICAgICAgICB9Ow0KICAgICAgICBpZih0eXBlb2YgY29uZmlnID09ICJzdHJpbmciKXsNCiAgICAgICAgICAgIGJjb25maWcudGV4dCA9IGNvbmZpZzsNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICBpZihjb25maWcudGFnKXsNCiAgICAgICAgICAgICAgICBiY29uZmlnLmRoY29uZmlnID0gY29uZmlnOw0KICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgRXh0LmFwcGx5KGJjb25maWcsIGNvbmZpZyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgdmFyIGJ0biA9IG5ldyBFeHQuQnV0dG9uKA0KICAgICAgICAgICAgdGhpcy5idG5Db250YWluZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKSksDQogICAgICAgICAgICBiY29uZmlnDQogICAgICAgICk7DQogICAgICAgIHRoaXMuc3luY0JvZHlIZWlnaHQoKTsNCiAgICAgICAgaWYoIXRoaXMuYnV0dG9ucyl7DQogICAgICAgICAgICANCiAgICAgICAgICAgIHRoaXMuYnV0dG9ucyA9IFtdOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuYnV0dG9ucy5wdXNoKGJ0bik7DQogICAgICAgIHJldHVybiBidG47DQogICAgfSwNCg0KICAgIA0KICAgIHNldERlZmF1bHRCdXR0b24gOiBmdW5jdGlvbihidG4pew0KICAgICAgICB0aGlzLmRlZmF1bHRCdXR0b24gPSBidG47DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0sDQoNCiAgICAKICAgIGdldEhlYWRlckZvb3RlckhlaWdodCA6IGZ1bmN0aW9uKHNhZmUpew0KICAgICAgICB2YXIgaGVpZ2h0ID0gMDsNCiAgICAgICAgaWYodGhpcy5oZWFkZXIpew0KICAgICAgICAgICBoZWlnaHQgKz0gdGhpcy5oZWFkZXIuZ2V0SGVpZ2h0KCk7DQogICAgICAgIH0NCiAgICAgICAgaWYodGhpcy5mb290ZXIpew0KICAgICAgICAgICB2YXIgZm0gPSB0aGlzLmZvb3Rlci5nZXRNYXJnaW5zKCk7DQogICAgICAgICAgICBoZWlnaHQgKz0gKHRoaXMuZm9vdGVyLmdldEhlaWdodCgpK2ZtLnRvcCtmbS5ib3R0b20pOw0KICAgICAgICB9DQogICAgICAgIGhlaWdodCArPSB0aGlzLmJ3cmFwLmdldFBhZGRpbmcoInRiIikrdGhpcy5id3JhcC5nZXRCb3JkZXJXaWR0aCgidGIiKTsNCiAgICAgICAgaGVpZ2h0ICs9IHRoaXMuY2VudGVyQmcuZ2V0UGFkZGluZygidGIiKTsNCiAgICAgICAgcmV0dXJuIGhlaWdodDsNCiAgICB9LA0KDQogICAgCiAgICBzeW5jQm9keUhlaWdodCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHZhciBiZCA9IHRoaXMuYm9keSwgY2IgPSB0aGlzLmNlbnRlckJnLCBidyA9IHRoaXMuYndyYXA7DQogICAgICAgIHZhciBoZWlnaHQgPSB0aGlzLnNpemUuaGVpZ2h0IC0gdGhpcy5nZXRIZWFkZXJGb290ZXJIZWlnaHQoZmFsc2UpOw0KICAgICAgICBiZC5zZXRIZWlnaHQoaGVpZ2h0LWJkLmdldE1hcmdpbnMoInRiIikpOw0KICAgICAgICB2YXIgaGggPSB0aGlzLmhlYWRlci5nZXRIZWlnaHQoKTsNCiAgICAgICAgdmFyIGggPSB0aGlzLnNpemUuaGVpZ2h0LWhoOw0KICAgICAgICBjYi5zZXRIZWlnaHQoaCk7DQogICAgICAgIGJ3LnNldExlZnRUb3AoY2IuZ2V0UGFkZGluZygibCIpLCBoaCtjYi5nZXRQYWRkaW5nKCJ0IikpOw0KICAgICAgICBidy5zZXRIZWlnaHQoaC1jYi5nZXRQYWRkaW5nKCJ0YiIpKTsNCiAgICAgICAgYncuc2V0V2lkdGgodGhpcy5lbC5nZXRXaWR0aCh0cnVlKS1jYi5nZXRQYWRkaW5nKCJsciIpKTsNCiAgICAgICAgYmQuc2V0V2lkdGgoYncuZ2V0V2lkdGgodHJ1ZSkpOw0KICAgICAgICBpZih0aGlzLnRhYnMpew0KICAgICAgICAgICAgdGhpcy50YWJzLnN5bmNIZWlnaHQoKTsNCiAgICAgICAgICAgIGlmKEV4dC5pc0lFKXsNCiAgICAgICAgICAgICAgICB0aGlzLnRhYnMuZWwucmVwYWludCgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIHJlc3RvcmVTdGF0ZSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHZhciBib3ggPSBFeHQuc3RhdGUuTWFuYWdlci5nZXQodGhpcy5zdGF0ZUlkIHx8ICh0aGlzLmVsLmlkICsgIi1zdGF0ZSIpKTsNCiAgICAgICAgaWYoYm94ICYmIGJveC53aWR0aCl7DQogICAgICAgICAgICB0aGlzLnh5ID0gW2JveC54LCBib3gueV07DQogICAgICAgICAgICB0aGlzLnJlc2l6ZVRvKGJveC53aWR0aCwgYm94LmhlaWdodCk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSwNCg0KICAgIAogICAgYmVmb3JlU2hvdyA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHRoaXMuZXhwYW5kKCk7DQogICAgICAgIGlmKHRoaXMuZml4ZWRjZW50ZXIpew0KICAgICAgICAgICAgdGhpcy54eSA9IHRoaXMuZWwuZ2V0Q2VudGVyWFkodHJ1ZSk7DQogICAgICAgIH0NCiAgICAgICAgaWYodGhpcy5tb2RhbCl7DQogICAgICAgICAgICBFeHQuZ2V0KGRvY3VtZW50LmJvZHkpLmFkZENsYXNzKCJ4LWJvZHktbWFza2VkIik7DQogICAgICAgICAgICB0aGlzLm1hc2suc2V0U2l6ZShFeHQubGliLkRvbS5nZXRWaWV3V2lkdGgodHJ1ZSksIEV4dC5saWIuRG9tLmdldFZpZXdIZWlnaHQodHJ1ZSkpOw0KICAgICAgICAgICAgdGhpcy5tYXNrLnNob3coKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmNvbnN0cmFpblhZKCk7DQogICAgfSwNCg0KICAgIAogICAgYW5pbVNob3cgOiBmdW5jdGlvbigpew0KICAgICAgICB2YXIgYiA9IEV4dC5nZXQodGhpcy5hbmltYXRlVGFyZ2V0LCB0cnVlKS5nZXRCb3goKTsNCiAgICAgICAgdGhpcy5wcm94eS5zZXRTaXplKGIud2lkdGgsIGIuaGVpZ2h0KTsNCiAgICAgICAgdGhpcy5wcm94eS5zZXRMb2NhdGlvbihiLngsIGIueSk7DQogICAgICAgIHRoaXMucHJveHkuc2hvdygpOw0KICAgICAgICB0aGlzLnByb3h5LnNldEJvdW5kcyh0aGlzLnh5WzBdLCB0aGlzLnh5WzFdLCB0aGlzLnNpemUud2lkdGgsIHRoaXMuc2l6ZS5oZWlnaHQsDQogICAgICAgICAgICAgICAgICAgIHRydWUsIC4zNSwgdGhpcy5zaG93RWwuY3JlYXRlRGVsZWdhdGUodGhpcykpOw0KICAgIH0sDQoNCiAgICANCiAgICBzaG93IDogZnVuY3Rpb24oYW5pbWF0ZVRhcmdldCl7DQogICAgICAgIGlmICh0aGlzLmZpcmVFdmVudCgiYmVmb3Jlc2hvdyIsIHRoaXMpID09PSBmYWxzZSl7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICAgICAgaWYodGhpcy5zeW5jSGVpZ2h0QmVmb3JlU2hvdyl7DQogICAgICAgICAgICB0aGlzLnN5bmNCb2R5SGVpZ2h0KCk7DQogICAgICAgIH1lbHNlIGlmKHRoaXMuZmlyc3RTaG93KXsNCiAgICAgICAgICAgIHRoaXMuZmlyc3RTaG93ID0gZmFsc2U7DQogICAgICAgICAgICB0aGlzLnN5bmNCb2R5SGVpZ2h0KCk7IAogICAgICAgIH0NCiAgICAgICAgdGhpcy5hbmltYXRlVGFyZ2V0ID0gYW5pbWF0ZVRhcmdldCB8fCB0aGlzLmFuaW1hdGVUYXJnZXQ7DQogICAgICAgIGlmKCF0aGlzLmVsLmlzVmlzaWJsZSgpKXsNCiAgICAgICAgICAgIHRoaXMuYmVmb3JlU2hvdygpOw0KICAgICAgICAgICAgaWYodGhpcy5hbmltYXRlVGFyZ2V0KXsNCiAgICAgICAgICAgICAgICB0aGlzLmFuaW1TaG93KCk7DQogICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICB0aGlzLnNob3dFbCgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0sDQoNCiAgICAKICAgIHNob3dFbCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHRoaXMucHJveHkuaGlkZSgpOw0KICAgICAgICB0aGlzLmVsLnNldFhZKHRoaXMueHkpOw0KICAgICAgICB0aGlzLmVsLnNob3coKTsNCiAgICAgICAgdGhpcy5hZGp1c3RBc3NldHModHJ1ZSk7DQogICAgICAgIHRoaXMudG9Gcm9udCgpOw0KICAgICAgICB0aGlzLmZvY3VzKCk7DQogICAgICAgIAogICAgICAgIGlmKEV4dC5pc0lFKXsNCiAgICAgICAgICAgIHRoaXMuZWwucmVwYWludCgpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuZmlyZUV2ZW50KCJzaG93IiwgdGhpcyk7DQogICAgfSwNCg0KICAgIA0KICAgIGZvY3VzIDogZnVuY3Rpb24oKXsNCiAgICAgICAgaWYodGhpcy5kZWZhdWx0QnV0dG9uKXsNCiAgICAgICAgICAgIHRoaXMuZGVmYXVsdEJ1dHRvbi5mb2N1cygpOw0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIHRoaXMuZm9jdXNFbC5mb2N1cygpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIAogICAgY29uc3RyYWluWFkgOiBmdW5jdGlvbigpew0KICAgICAgICBpZih0aGlzLmNvbnN0cmFpbnRvdmlld3BvcnQgIT09IGZhbHNlKXsNCiAgICAgICAgICAgIGlmKCF0aGlzLnZpZXdTaXplKXsNCiAgICAgICAgICAgICAgICBpZih0aGlzLmNvbnRhaW5lcil7DQogICAgICAgICAgICAgICAgICAgIHZhciBzID0gdGhpcy5jb250YWluZXIuZ2V0U2l6ZSgpOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdTaXplID0gW3Mud2lkdGgsIHMuaGVpZ2h0XTsNCiAgICAgICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3U2l6ZSA9IFtFeHQubGliLkRvbS5nZXRWaWV3V2lkdGgoKSxFeHQubGliLkRvbS5nZXRWaWV3SGVpZ2h0KCldOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHZhciBzID0gRXh0LmdldCh0aGlzLmNvbnRhaW5lcnx8ZG9jdW1lbnQpLmdldFNjcm9sbCgpOw0KDQogICAgICAgICAgICB2YXIgeCA9IHRoaXMueHlbMF0sIHkgPSB0aGlzLnh5WzFdOw0KICAgICAgICAgICAgdmFyIHcgPSB0aGlzLnNpemUud2lkdGgsIGggPSB0aGlzLnNpemUuaGVpZ2h0Ow0KICAgICAgICAgICAgdmFyIHZ3ID0gdGhpcy52aWV3U2l6ZVswXSwgdmggPSB0aGlzLnZpZXdTaXplWzFdOw0KICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBtb3ZlZCA9IGZhbHNlOw0KICAgICAgICAgICAgCiAgICAgICAgICAgIGlmKHggKyB3ID4gdncrcy5sZWZ0KXsNCiAgICAgICAgICAgICAgICB4ID0gdncgLSB3Ow0KICAgICAgICAgICAgICAgIG1vdmVkID0gdHJ1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKHkgKyBoID4gdmgrcy50b3Apew0KICAgICAgICAgICAgICAgIHkgPSB2aCAtIGg7DQogICAgICAgICAgICAgICAgbW92ZWQgPSB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgCiAgICAgICAgICAgIGlmKHggPCBzLmxlZnQpew0KICAgICAgICAgICAgICAgIHggPSBzLmxlZnQ7DQogICAgICAgICAgICAgICAgbW92ZWQgPSB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYoeSA8IHMudG9wKXsNCiAgICAgICAgICAgICAgICB5ID0gcy50b3A7DQogICAgICAgICAgICAgICAgbW92ZWQgPSB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYobW92ZWQpew0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdGhpcy54eSA9IFt4LCB5XTsNCiAgICAgICAgICAgICAgICBpZih0aGlzLmlzVmlzaWJsZSgpKXsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbC5zZXRMb2NhdGlvbih4LCB5KTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGp1c3RBc3NldHMoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgCiAgICBvbkRyYWcgOiBmdW5jdGlvbigpew0KICAgICAgICBpZighdGhpcy5wcm94eURyYWcpew0KICAgICAgICAgICAgdGhpcy54eSA9IHRoaXMuZWwuZ2V0WFkoKTsNCiAgICAgICAgICAgIHRoaXMuYWRqdXN0QXNzZXRzKCk7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgCiAgICBhZGp1c3RBc3NldHMgOiBmdW5jdGlvbihkb1Nob3cpew0KICAgICAgICB2YXIgeCA9IHRoaXMueHlbMF0sIHkgPSB0aGlzLnh5WzFdOw0KICAgICAgICB2YXIgdyA9IHRoaXMuc2l6ZS53aWR0aCwgaCA9IHRoaXMuc2l6ZS5oZWlnaHQ7DQogICAgICAgIGlmKGRvU2hvdyA9PT0gdHJ1ZSl7DQogICAgICAgICAgICBpZih0aGlzLnNoYWRvdyl7DQogICAgICAgICAgICAgICAgdGhpcy5zaGFkb3cuc2hvdyh0aGlzLmVsKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKHRoaXMuc2hpbSl7DQogICAgICAgICAgICAgICAgdGhpcy5zaGltLnNob3coKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZih0aGlzLnNoYWRvdyAmJiB0aGlzLnNoYWRvdy5pc1Zpc2libGUoKSl7DQogICAgICAgICAgICB0aGlzLnNoYWRvdy5zaG93KHRoaXMuZWwpOw0KICAgICAgICB9DQogICAgICAgIGlmKHRoaXMuc2hpbSAmJiB0aGlzLnNoaW0uaXNWaXNpYmxlKCkpew0KICAgICAgICAgICAgdGhpcy5zaGltLnNldEJvdW5kcyh4LCB5LCB3LCBoKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICAKICAgIGFkanVzdFZpZXdwb3J0IDogZnVuY3Rpb24odywgaCl7DQogICAgICAgIGlmKCF3IHx8ICFoKXsNCiAgICAgICAgICAgIHcgPSBFeHQubGliLkRvbS5nZXRWaWV3V2lkdGgoKTsNCiAgICAgICAgICAgIGggPSBFeHQubGliLkRvbS5nZXRWaWV3SGVpZ2h0KCk7DQogICAgICAgIH0NCiAgICAgICAgCiAgICAgICAgdGhpcy52aWV3U2l6ZSA9IFt3LCBoXTsNCiAgICAgICAgaWYodGhpcy5tb2RhbCAmJiB0aGlzLm1hc2suaXNWaXNpYmxlKCkpew0KICAgICAgICAgICAgdGhpcy5tYXNrLnNldFNpemUodywgaCk7IAogICAgICAgICAgICB0aGlzLm1hc2suc2V0U2l6ZShFeHQubGliLkRvbS5nZXRWaWV3V2lkdGgodHJ1ZSksIEV4dC5saWIuRG9tLmdldFZpZXdIZWlnaHQodHJ1ZSkpOw0KICAgICAgICB9DQogICAgICAgIGlmKHRoaXMuaXNWaXNpYmxlKCkpew0KICAgICAgICAgICAgdGhpcy5jb25zdHJhaW5YWSgpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIGRlc3Ryb3kgOiBmdW5jdGlvbihyZW1vdmVFbCl7DQogICAgICAgIGlmKHRoaXMuaXNWaXNpYmxlKCkpew0KICAgICAgICAgICAgdGhpcy5hbmltYXRlVGFyZ2V0ID0gbnVsbDsNCiAgICAgICAgICAgIHRoaXMuaGlkZSgpOw0KICAgICAgICB9DQogICAgICAgIEV4dC5FdmVudE1hbmFnZXIucmVtb3ZlUmVzaXplTGlzdGVuZXIodGhpcy5hZGp1c3RWaWV3cG9ydCwgdGhpcyk7DQogICAgICAgIGlmKHRoaXMudGFicyl7DQogICAgICAgICAgICB0aGlzLnRhYnMuZGVzdHJveShyZW1vdmVFbCk7DQogICAgICAgIH0NCiAgICAgICAgRXh0LmRlc3Ryb3koDQogICAgICAgICAgICAgdGhpcy5zaGltLA0KICAgICAgICAgICAgIHRoaXMucHJveHksDQogICAgICAgICAgICAgdGhpcy5yZXNpemVyLA0KICAgICAgICAgICAgIHRoaXMuY2xvc2UsDQogICAgICAgICAgICAgdGhpcy5tYXNrDQogICAgICAgICk7DQogICAgICAgIGlmKHRoaXMuZGQpew0KICAgICAgICAgICAgdGhpcy5kZC51bnJlZygpOw0KICAgICAgICB9DQogICAgICAgIGlmKHRoaXMuYnV0dG9ucyl7DQogICAgICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IHRoaXMuYnV0dG9ucy5sZW5ndGg7IGkgPCBsZW47IGkrKyl7DQogICAgICAgICAgICAgICB0aGlzLmJ1dHRvbnNbaV0uZGVzdHJveSgpOw0KICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5lbC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTsNCiAgICAgICAgaWYocmVtb3ZlRWwgPT09IHRydWUpew0KICAgICAgICAgICAgdGhpcy5lbC51cGRhdGUoIiIpOw0KICAgICAgICAgICAgdGhpcy5lbC5yZW1vdmUoKTsNCiAgICAgICAgfQ0KICAgICAgICBFeHQuRGlhbG9nTWFuYWdlci51bnJlZ2lzdGVyKHRoaXMpOw0KICAgIH0sDQoNCiAgICAKICAgIHN0YXJ0TW92ZSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIGlmKHRoaXMucHJveHlEcmFnKXsNCiAgICAgICAgICAgIHRoaXMucHJveHkuc2hvdygpOw0KICAgICAgICB9DQogICAgICAgIGlmKHRoaXMuY29uc3RyYWludG92aWV3cG9ydCAhPT0gZmFsc2Upew0KICAgICAgICAgICAgdGhpcy5kZC5jb25zdHJhaW5Ubyhkb2N1bWVudC5ib2R5LCB7cmlnaHQ6IHRoaXMuc2hhZG93T2Zmc2V0LCBib3R0b206IHRoaXMuc2hhZG93T2Zmc2V0fSk7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgCiAgICBlbmRNb3ZlIDogZnVuY3Rpb24oKXsNCiAgICAgICAgaWYoIXRoaXMucHJveHlEcmFnKXsNCiAgICAgICAgICAgIEV4dC5kZC5ERC5wcm90b3R5cGUuZW5kRHJhZy5hcHBseSh0aGlzLmRkLCBhcmd1bWVudHMpOw0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIEV4dC5kZC5ERFByb3h5LnByb3RvdHlwZS5lbmREcmFnLmFwcGx5KHRoaXMuZGQsIGFyZ3VtZW50cyk7DQogICAgICAgICAgICB0aGlzLnByb3h5LmhpZGUoKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLnJlZnJlc2hTaXplKCk7DQogICAgICAgIHRoaXMuYWRqdXN0QXNzZXRzKCk7DQogICAgICAgIHRoaXMuZm9jdXMoKTsNCiAgICAgICAgdGhpcy5maXJlRXZlbnQoIm1vdmUiLCB0aGlzLCB0aGlzLnh5WzBdLCB0aGlzLnh5WzFdKTsNCiAgICB9LA0KDQogICAgDQogICAgdG9Gcm9udCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIEV4dC5EaWFsb2dNYW5hZ2VyLmJyaW5nVG9Gcm9udCh0aGlzKTsNCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSwNCg0KICAgIA0KICAgIHRvQmFjayA6IGZ1bmN0aW9uKCl7DQogICAgICAgIEV4dC5EaWFsb2dNYW5hZ2VyLnNlbmRUb0JhY2sodGhpcyk7DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0sDQoNCiAgICANCiAgICBjZW50ZXIgOiBmdW5jdGlvbigpew0KICAgICAgICB2YXIgeHkgPSB0aGlzLmVsLmdldENlbnRlclhZKHRydWUpOw0KICAgICAgICB0aGlzLm1vdmVUbyh4eVswXSwgeHlbMV0pOw0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9LA0KDQogICAgDQogICAgbW92ZVRvIDogZnVuY3Rpb24oeCwgeSl7DQogICAgICAgIHRoaXMueHkgPSBbeCx5XTsNCiAgICAgICAgaWYodGhpcy5pc1Zpc2libGUoKSl7DQogICAgICAgICAgICB0aGlzLmVsLnNldFhZKHRoaXMueHkpOw0KICAgICAgICAgICAgdGhpcy5hZGp1c3RBc3NldHMoKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9LA0KDQogICAgDQogICAgYWxpZ25UbyA6IGZ1bmN0aW9uKGVsZW1lbnQsIHBvc2l0aW9uLCBvZmZzZXRzKXsNCiAgICAgICAgdGhpcy54eSA9IHRoaXMuZWwuZ2V0QWxpZ25Ub1hZKGVsZW1lbnQsIHBvc2l0aW9uLCBvZmZzZXRzKTsNCiAgICAgICAgaWYodGhpcy5pc1Zpc2libGUoKSl7DQogICAgICAgICAgICB0aGlzLmVsLnNldFhZKHRoaXMueHkpOw0KICAgICAgICAgICAgdGhpcy5hZGp1c3RBc3NldHMoKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9LA0KDQogICAgDQogICAgYW5jaG9yVG8gOiBmdW5jdGlvbihlbCwgYWxpZ25tZW50LCBvZmZzZXRzLCBtb25pdG9yU2Nyb2xsKXsNCiAgICAgICAgdmFyIGFjdGlvbiA9IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICB0aGlzLmFsaWduVG8oZWwsIGFsaWdubWVudCwgb2Zmc2V0cyk7DQogICAgICAgIH07DQogICAgICAgIEV4dC5FdmVudE1hbmFnZXIub25XaW5kb3dSZXNpemUoYWN0aW9uLCB0aGlzKTsNCiAgICAgICAgdmFyIHRtID0gdHlwZW9mIG1vbml0b3JTY3JvbGw7DQogICAgICAgIGlmKHRtICE9ICd1bmRlZmluZWQnKXsNCiAgICAgICAgICAgIEV4dC5FdmVudE1hbmFnZXIub24od2luZG93LCAnc2Nyb2xsJywgYWN0aW9uLCB0aGlzLA0KICAgICAgICAgICAgICAgIHtidWZmZXI6IHRtID09ICdudW1iZXInID8gbW9uaXRvclNjcm9sbCA6IDUwfSk7DQogICAgICAgIH0NCiAgICAgICAgYWN0aW9uLmNhbGwodGhpcyk7DQogICAgICAgIHJldHVybiB0aGlzOw0KICAgIH0sDQoNCiAgICANCiAgICBpc1Zpc2libGUgOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gdGhpcy5lbC5pc1Zpc2libGUoKTsNCiAgICB9LA0KDQogICAgCiAgICBhbmltSGlkZSA6IGZ1bmN0aW9uKGNhbGxiYWNrKXsNCiAgICAgICAgdmFyIGIgPSBFeHQuZ2V0KHRoaXMuYW5pbWF0ZVRhcmdldCkuZ2V0Qm94KCk7DQogICAgICAgIHRoaXMucHJveHkuc2hvdygpOw0KICAgICAgICB0aGlzLnByb3h5LnNldEJvdW5kcyh0aGlzLnh5WzBdLCB0aGlzLnh5WzFdLCB0aGlzLnNpemUud2lkdGgsIHRoaXMuc2l6ZS5oZWlnaHQpOw0KICAgICAgICB0aGlzLmVsLmhpZGUoKTsNCiAgICAgICAgdGhpcy5wcm94eS5zZXRCb3VuZHMoYi54LCBiLnksIGIud2lkdGgsIGIuaGVpZ2h0LCB0cnVlLCAuMzUsDQogICAgICAgICAgICAgICAgICAgIHRoaXMuaGlkZUVsLmNyZWF0ZURlbGVnYXRlKHRoaXMsIFtjYWxsYmFja10pKTsNCiAgICB9LA0KDQogICAgDQogICAgaGlkZSA6IGZ1bmN0aW9uKGNhbGxiYWNrKXsNCiAgICAgICAgaWYgKHRoaXMuZmlyZUV2ZW50KCJiZWZvcmVoaWRlIiwgdGhpcykgPT09IGZhbHNlKXsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KICAgICAgICBpZih0aGlzLnNoYWRvdyl7DQogICAgICAgICAgICB0aGlzLnNoYWRvdy5oaWRlKCk7DQogICAgICAgIH0NCiAgICAgICAgaWYodGhpcy5zaGltKSB7DQogICAgICAgICAgdGhpcy5zaGltLmhpZGUoKTsNCiAgICAgICAgfQ0KICAgICAgICBpZih0aGlzLmFuaW1hdGVUYXJnZXQpew0KICAgICAgICAgICB0aGlzLmFuaW1IaWRlKGNhbGxiYWNrKTsNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICB0aGlzLmVsLmhpZGUoKTsNCiAgICAgICAgICAgIHRoaXMuaGlkZUVsKGNhbGxiYWNrKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9LA0KDQogICAgCiAgICBoaWRlRWwgOiBmdW5jdGlvbihjYWxsYmFjayl7DQogICAgICAgIHRoaXMucHJveHkuaGlkZSgpOw0KICAgICAgICBpZih0aGlzLm1vZGFsKXsNCiAgICAgICAgICAgIHRoaXMubWFzay5oaWRlKCk7DQogICAgICAgICAgICBFeHQuZ2V0KGRvY3VtZW50LmJvZHkpLnJlbW92ZUNsYXNzKCJ4LWJvZHktbWFza2VkIik7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5maXJlRXZlbnQoImhpZGUiLCB0aGlzKTsNCiAgICAgICAgaWYodHlwZW9mIGNhbGxiYWNrID09ICJmdW5jdGlvbiIpew0KICAgICAgICAgICAgY2FsbGJhY2soKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICAKICAgIGhpZGVBY3Rpb24gOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLnNldExlZnQoIi0xMDAwMHB4Iik7DQogICAgICAgIHRoaXMuc2V0VG9wKCItMTAwMDBweCIpOw0KICAgICAgICB0aGlzLnNldFN0eWxlKCJ2aXNpYmlsaXR5IiwgImhpZGRlbiIpOw0KICAgIH0sDQoNCiAgICAKICAgIHJlZnJlc2hTaXplIDogZnVuY3Rpb24oKXsNCiAgICAgICAgdGhpcy5zaXplID0gdGhpcy5lbC5nZXRTaXplKCk7DQogICAgICAgIHRoaXMueHkgPSB0aGlzLmVsLmdldFhZKCk7DQogICAgICAgIEV4dC5zdGF0ZS5NYW5hZ2VyLnNldCh0aGlzLnN0YXRlSWQgfHwgdGhpcy5lbC5pZCArICItc3RhdGUiLCB0aGlzLmVsLmdldEJveCgpKTsNCiAgICB9LA0KDQogICAgCiAgICAKICAgIHNldFpJbmRleCA6IGZ1bmN0aW9uKGluZGV4KXsNCiAgICAgICAgaWYodGhpcy5tb2RhbCl7DQogICAgICAgICAgICB0aGlzLm1hc2suc2V0U3R5bGUoInotaW5kZXgiLCBpbmRleCk7DQogICAgICAgIH0NCiAgICAgICAgaWYodGhpcy5zaGltKXsNCiAgICAgICAgICAgIHRoaXMuc2hpbS5zZXRTdHlsZSgiei1pbmRleCIsICsraW5kZXgpOw0KICAgICAgICB9DQogICAgICAgIGlmKHRoaXMuc2hhZG93KXsNCiAgICAgICAgICAgIHRoaXMuc2hhZG93LnNldFpJbmRleCgrK2luZGV4KTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmVsLnNldFN0eWxlKCJ6LWluZGV4IiwgKytpbmRleCk7DQogICAgICAgIGlmKHRoaXMucHJveHkpew0KICAgICAgICAgICAgdGhpcy5wcm94eS5zZXRTdHlsZSgiei1pbmRleCIsICsraW5kZXgpOw0KICAgICAgICB9DQogICAgICAgIGlmKHRoaXMucmVzaXplcil7DQogICAgICAgICAgICB0aGlzLnJlc2l6ZXIucHJveHkuc2V0U3R5bGUoInotaW5kZXgiLCArK2luZGV4KTsNCiAgICAgICAgfQ0KDQogICAgICAgIHRoaXMubGFzdFpJbmRleCA9IGluZGV4Ow0KICAgIH0sDQoNCiAgICANCiAgICBnZXRFbCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLmVsOw0KICAgIH0NCn0pOw0KDQoNCkV4dC5EaWFsb2dNYW5hZ2VyID0gZnVuY3Rpb24oKXsNCiAgICB2YXIgbGlzdCA9IHt9Ow0KICAgIHZhciBhY2Nlc3NMaXN0ID0gW107DQogICAgdmFyIGZyb250ID0gbnVsbDsNCg0KICAgIAogICAgdmFyIHNvcnREaWFsb2dzID0gZnVuY3Rpb24oZDEsIGQyKXsNCiAgICAgICAgcmV0dXJuICghZDEuX2xhc3RBY2Nlc3MgfHwgZDEuX2xhc3RBY2Nlc3MgPCBkMi5fbGFzdEFjY2VzcykgPyAtMSA6IDE7DQogICAgfTsNCg0KICAgIAogICAgdmFyIG9yZGVyRGlhbG9ncyA9IGZ1bmN0aW9uKCl7DQogICAgICAgIGFjY2Vzc0xpc3Quc29ydChzb3J0RGlhbG9ncyk7DQogICAgICAgIHZhciBzZWVkID0gRXh0LkRpYWxvZ01hbmFnZXIuenNlZWQ7DQogICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IGFjY2Vzc0xpc3QubGVuZ3RoOyBpIDwgbGVuOyBpKyspew0KICAgICAgICAgICAgdmFyIGRsZyA9IGFjY2Vzc0xpc3RbaV07DQogICAgICAgICAgICBpZihkbGcpew0KICAgICAgICAgICAgICAgIGRsZy5zZXRaSW5kZXgoc2VlZCArIChpKjEwKSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgcmV0dXJuIHsNCiAgICAgICAgDQogICAgICAgIHpzZWVkIDogOTAwMCwNCg0KICAgICAgICAKICAgICAgICByZWdpc3RlciA6IGZ1bmN0aW9uKGRsZyl7DQogICAgICAgICAgICBsaXN0W2RsZy5pZF0gPSBkbGc7DQogICAgICAgICAgICBhY2Nlc3NMaXN0LnB1c2goZGxnKTsNCiAgICAgICAgfSwNCg0KICAgICAgICAKICAgICAgICB1bnJlZ2lzdGVyIDogZnVuY3Rpb24oZGxnKXsNCiAgICAgICAgICAgIGRlbGV0ZSBsaXN0W2RsZy5pZF07DQogICAgICAgICAgICBpZighYWNjZXNzTGlzdC5pbmRleE9mKXsNCiAgICAgICAgICAgICAgICBmb3IodmFyIGkgPSAwLCBsZW4gPSBhY2Nlc3NMaXN0Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKXsNCiAgICAgICAgICAgICAgICAgICAgaWYoYWNjZXNzTGlzdFtpXSA9PSBkbGcpew0KICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzTGlzdC5zcGxpY2UoaSwgMSk7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICB2YXIgaSA9IGFjY2Vzc0xpc3QuaW5kZXhPZihkbGcpOw0KICAgICAgICAgICAgICAgIGlmKGkgIT0gLTEpew0KICAgICAgICAgICAgICAgICAgICBhY2Nlc3NMaXN0LnNwbGljZShpLCAxKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0sDQoNCiAgICAgICAgDQogICAgICAgIGdldCA6IGZ1bmN0aW9uKGlkKXsNCiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgaWQgPT0gIm9iamVjdCIgPyBpZCA6IGxpc3RbaWRdOw0KICAgICAgICB9LA0KDQogICAgICAgIA0KICAgICAgICBicmluZ1RvRnJvbnQgOiBmdW5jdGlvbihkbGcpew0KICAgICAgICAgICAgZGxnID0gdGhpcy5nZXQoZGxnKTsNCiAgICAgICAgICAgIGlmKGRsZyAhPSBmcm9udCl7DQogICAgICAgICAgICAgICAgZnJvbnQgPSBkbGc7DQogICAgICAgICAgICAgICAgZGxnLl9sYXN0QWNjZXNzID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7DQogICAgICAgICAgICAgICAgb3JkZXJEaWFsb2dzKCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gZGxnOw0KICAgICAgICB9LA0KDQogICAgICAgIA0KICAgICAgICBzZW5kVG9CYWNrIDogZnVuY3Rpb24oZGxnKXsNCiAgICAgICAgICAgIGRsZyA9IHRoaXMuZ2V0KGRsZyk7DQogICAgICAgICAgICBkbGcuX2xhc3RBY2Nlc3MgPSAtKG5ldyBEYXRlKCkuZ2V0VGltZSgpKTsNCiAgICAgICAgICAgIG9yZGVyRGlhbG9ncygpOw0KICAgICAgICAgICAgcmV0dXJuIGRsZzsNCiAgICAgICAgfSwNCg0KICAgICAgICANCiAgICAgICAgaGlkZUFsbCA6IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICBmb3IodmFyIGlkIGluIGxpc3Qpew0KICAgICAgICAgICAgICAgIGlmKGxpc3RbaWRdICYmIHR5cGVvZiBsaXN0W2lkXSAhPSAiZnVuY3Rpb24iICYmIGxpc3RbaWRdLmlzVmlzaWJsZSgpKXsNCiAgICAgICAgICAgICAgICAgICAgbGlzdFtpZF0uaGlkZSgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH07DQp9KCk7DQoNCg0KRXh0LkxheW91dERpYWxvZyA9IGZ1bmN0aW9uKGVsLCBjb25maWcpew0KICAgIGNvbmZpZy5hdXRvVGFicyA9IGZhbHNlOw0KICAgIEV4dC5MYXlvdXREaWFsb2cuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIGVsLCBjb25maWcpOw0KICAgIHRoaXMuYm9keS5zZXRTdHlsZSh7b3ZlcmZsb3c6ImhpZGRlbiIsIHBvc2l0aW9uOiJyZWxhdGl2ZSJ9KTsNCiAgICB0aGlzLmxheW91dCA9IG5ldyBFeHQuQm9yZGVyTGF5b3V0KHRoaXMuYm9keS5kb20sIGNvbmZpZyk7DQogICAgdGhpcy5sYXlvdXQubW9uaXRvcldpbmRvd1Jlc2l6ZSA9IGZhbHNlOw0KICAgIHRoaXMuZWwuYWRkQ2xhc3MoIngtZGxnLWF1dG8tbGF5b3V0Iik7DQogICAgCiAgICB0aGlzLmNlbnRlciA9IEV4dC5CYXNpY0RpYWxvZy5wcm90b3R5cGUuY2VudGVyOw0KICAgIHRoaXMub24oInNob3ciLCB0aGlzLmxheW91dC5sYXlvdXQsIHRoaXMubGF5b3V0LCB0cnVlKTsNCn07DQpFeHQuZXh0ZW5kKEV4dC5MYXlvdXREaWFsb2csIEV4dC5CYXNpY0RpYWxvZywgew0KICAgIA0KICAgIGVuZFVwZGF0ZSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHRoaXMubGF5b3V0LmVuZFVwZGF0ZSgpOw0KICAgIH0sDQoNCiAgICANCiAgICBiZWdpblVwZGF0ZSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHRoaXMubGF5b3V0LmJlZ2luVXBkYXRlKCk7DQogICAgfSwNCg0KICAgIA0KICAgIGdldExheW91dCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLmxheW91dDsNCiAgICB9LA0KDQogICAgc2hvd0VsIDogZnVuY3Rpb24oKXsNCiAgICAgICAgRXh0LkxheW91dERpYWxvZy5zdXBlcmNsYXNzLnNob3dFbC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOw0KICAgICAgICBpZihFeHQuaXNJRTcpew0KICAgICAgICAgICAgdGhpcy5sYXlvdXQubGF5b3V0KCk7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgCiAgICAKICAgIHN5bmNCb2R5SGVpZ2h0IDogZnVuY3Rpb24oKXsNCiAgICAgICAgRXh0LkxheW91dERpYWxvZy5zdXBlcmNsYXNzLnN5bmNCb2R5SGVpZ2h0LmNhbGwodGhpcyk7DQogICAgICAgIGlmKHRoaXMubGF5b3V0KXt0aGlzLmxheW91dC5sYXlvdXQoKTt9DQogICAgfQ0KfSk7Cg0KRXh0Lk1lc3NhZ2VCb3ggPSBmdW5jdGlvbigpew0KICAgIHZhciBkbGcsIG9wdCwgbWFzaywgd2FpdFRpbWVyOw0KICAgIHZhciBib2R5RWwsIG1zZ0VsLCB0ZXh0Ym94RWwsIHRleHRhcmVhRWwsIHByb2dyZXNzRWwsIHBwOw0KICAgIHZhciBidXR0b25zLCBhY3RpdmVUZXh0RWwsIGJ3aWR0aDsNCg0KICAgIAogICAgdmFyIGhhbmRsZUJ1dHRvbiA9IGZ1bmN0aW9uKGJ1dHRvbil7DQogICAgICAgIGRsZy5oaWRlKCk7DQogICAgICAgIEV4dC5jYWxsYmFjayhvcHQuZm4sIG9wdC5zY29wZXx8d2luZG93LCBbYnV0dG9uLCBhY3RpdmVUZXh0RWwuZG9tLnZhbHVlXSwgMSk7DQogICAgfTsNCg0KICAgIAogICAgdmFyIGhhbmRsZUhpZGUgPSBmdW5jdGlvbigpew0KICAgICAgICBpZihvcHQgJiYgb3B0LmNscyl7DQogICAgICAgICAgICBkbGcuZWwucmVtb3ZlQ2xhc3Mob3B0LmNscyk7DQogICAgICAgIH0NCiAgICAgICAgaWYod2FpdFRpbWVyKXsNCiAgICAgICAgICAgIEV4dC5UYXNrTWdyLnN0b3Aod2FpdFRpbWVyKTsNCiAgICAgICAgICAgIHdhaXRUaW1lciA9IG51bGw7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgCiAgICB2YXIgdXBkYXRlQnV0dG9ucyA9IGZ1bmN0aW9uKGIpew0KICAgICAgICB2YXIgd2lkdGggPSAwOw0KICAgICAgICBpZighYil7DQogICAgICAgICAgICBidXR0b25zWyJvayJdLmhpZGUoKTsNCiAgICAgICAgICAgIGJ1dHRvbnNbImNhbmNlbCJdLmhpZGUoKTsNCiAgICAgICAgICAgIGJ1dHRvbnNbInllcyJdLmhpZGUoKTsNCiAgICAgICAgICAgIGJ1dHRvbnNbIm5vIl0uaGlkZSgpOw0KICAgICAgICAgICAgZGxnLmZvb3Rlci5kb20uc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCiAgICAgICAgICAgIHJldHVybiB3aWR0aDsNCiAgICAgICAgfQ0KICAgICAgICBkbGcuZm9vdGVyLmRvbS5zdHlsZS5kaXNwbGF5ID0gJyc7DQogICAgICAgIGZvcih2YXIgayBpbiBidXR0b25zKXsNCiAgICAgICAgICAgIGlmKHR5cGVvZiBidXR0b25zW2tdICE9ICJmdW5jdGlvbiIpew0KICAgICAgICAgICAgICAgIGlmKGJba10pew0KICAgICAgICAgICAgICAgICAgICBidXR0b25zW2tdLnNob3coKTsNCiAgICAgICAgICAgICAgICAgICAgYnV0dG9uc1trXS5zZXRUZXh0KHR5cGVvZiBiW2tdID09ICJzdHJpbmciID8gYltrXSA6IEV4dC5NZXNzYWdlQm94LmJ1dHRvblRleHRba10pOw0KICAgICAgICAgICAgICAgICAgICB3aWR0aCArPSBidXR0b25zW2tdLmVsLmdldFdpZHRoKCkrMTU7DQogICAgICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgICAgIGJ1dHRvbnNba10uaGlkZSgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gd2lkdGg7DQogICAgfTsNCg0KICAgIAogICAgdmFyIGhhbmRsZUVzYyA9IGZ1bmN0aW9uKGQsIGssIGUpew0KICAgICAgICBpZihvcHQgJiYgb3B0LmNsb3NhYmxlICE9PSBmYWxzZSl7DQogICAgICAgICAgICBkbGcuaGlkZSgpOw0KICAgICAgICB9DQogICAgICAgIGlmKGUpew0KICAgICAgICAgICAgZS5zdG9wRXZlbnQoKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICByZXR1cm4gew0KICAgICAgICANCiAgICAgICAgZ2V0RGlhbG9nIDogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgaWYoIWRsZyl7DQogICAgICAgICAgICAgICAgZGxnID0gbmV3IEV4dC5CYXNpY0RpYWxvZygieC1tc2ctYm94Iiwgew0KICAgICAgICAgICAgICAgICAgICBhdXRvQ3JlYXRlIDogdHJ1ZSwNCiAgICAgICAgICAgICAgICAgICAgc2hhZG93OiB0cnVlLA0KICAgICAgICAgICAgICAgICAgICBkcmFnZ2FibGU6IHRydWUsDQogICAgICAgICAgICAgICAgICAgIHJlc2l6YWJsZTpmYWxzZSwNCiAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludG92aWV3cG9ydDpmYWxzZSwNCiAgICAgICAgICAgICAgICAgICAgZml4ZWRjZW50ZXI6dHJ1ZSwNCiAgICAgICAgICAgICAgICAgICAgY29sbGFwc2libGUgOiBmYWxzZSwNCiAgICAgICAgICAgICAgICAgICAgc2hpbTp0cnVlLA0KICAgICAgICAgICAgICAgICAgICBtb2RhbDogdHJ1ZSwNCiAgICAgICAgICAgICAgICAgICAgd2lkdGg6NDAwLCBoZWlnaHQ6MTAwLA0KICAgICAgICAgICAgICAgICAgICBidXR0b25BbGlnbjoiY2VudGVyIiwNCiAgICAgICAgICAgICAgICAgICAgY2xvc2VDbGljayA6IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICAgICAgICAgICBpZihvcHQgJiYgb3B0LmJ1dHRvbnMgJiYgb3B0LmJ1dHRvbnMubm8gJiYgIW9wdC5idXR0b25zLmNhbmNlbCl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQnV0dG9uKCJubyIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQnV0dG9uKCJjYW5jZWwiKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgIGRsZy5vbigiaGlkZSIsIGhhbmRsZUhpZGUpOw0KICAgICAgICAgICAgICAgIG1hc2sgPSBkbGcubWFzazsNCiAgICAgICAgICAgICAgICBkbGcuYWRkS2V5TGlzdGVuZXIoMjcsIGhhbmRsZUVzYyk7DQogICAgICAgICAgICAgICAgYnV0dG9ucyA9IHt9Ow0KICAgICAgICAgICAgICAgIHZhciBidCA9IHRoaXMuYnV0dG9uVGV4dDsNCiAgICAgICAgICAgICAgICBidXR0b25zWyJvayJdID0gZGxnLmFkZEJ1dHRvbihidFsib2siXSwgaGFuZGxlQnV0dG9uLmNyZWF0ZUNhbGxiYWNrKCJvayIpKTsNCiAgICAgICAgICAgICAgICBidXR0b25zWyJ5ZXMiXSA9IGRsZy5hZGRCdXR0b24oYnRbInllcyJdLCBoYW5kbGVCdXR0b24uY3JlYXRlQ2FsbGJhY2soInllcyIpKTsNCiAgICAgICAgICAgICAgICBidXR0b25zWyJubyJdID0gZGxnLmFkZEJ1dHRvbihidFsibm8iXSwgaGFuZGxlQnV0dG9uLmNyZWF0ZUNhbGxiYWNrKCJubyIpKTsNCiAgICAgICAgICAgICAgICBidXR0b25zWyJjYW5jZWwiXSA9IGRsZy5hZGRCdXR0b24oYnRbImNhbmNlbCJdLCBoYW5kbGVCdXR0b24uY3JlYXRlQ2FsbGJhY2soImNhbmNlbCIpKTsNCiAgICAgICAgICAgICAgICBib2R5RWwgPSBkbGcuYm9keS5jcmVhdGVDaGlsZCh7DQoNCiAgICAgICAgICAgICAgICAgICAgaHRtbDonPHNwYW4gY2xhc3M9ImV4dC1tYi10ZXh0Ij48L3NwYW4+PGJyIC8+PGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJleHQtbWItaW5wdXQiIC8+PHRleHRhcmVhIGNsYXNzPSJleHQtbWItdGV4dGFyZWEiPjwvdGV4dGFyZWE+PGRpdiBjbGFzcz0iZXh0LW1iLXByb2dyZXNzLXdyYXAiPjxkaXYgY2xhc3M9ImV4dC1tYi1wcm9ncmVzcyI+PGRpdiBjbGFzcz0iZXh0LW1iLXByb2dyZXNzLWJhciI+JiMxNjA7PC9kaXY+PC9kaXY+PC9kaXY+Jw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgIG1zZ0VsID0gYm9keUVsLmRvbS5maXJzdENoaWxkOw0KICAgICAgICAgICAgICAgIHRleHRib3hFbCA9IEV4dC5nZXQoYm9keUVsLmRvbS5jaGlsZE5vZGVzWzJdKTsNCiAgICAgICAgICAgICAgICB0ZXh0Ym94RWwuZW5hYmxlRGlzcGxheU1vZGUoKTsNCiAgICAgICAgICAgICAgICB0ZXh0Ym94RWwuYWRkS2V5TGlzdGVuZXIoWzEwLDEzXSwgZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICAgICAgICAgaWYoZGxnLmlzVmlzaWJsZSgpICYmIG9wdCAmJiBvcHQuYnV0dG9ucyl7DQogICAgICAgICAgICAgICAgICAgICAgICBpZihvcHQuYnV0dG9ucy5vayl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQnV0dG9uKCJvayIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYob3B0LmJ1dHRvbnMueWVzKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVCdXR0b24oInllcyIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgdGV4dGFyZWFFbCA9IEV4dC5nZXQoYm9keUVsLmRvbS5jaGlsZE5vZGVzWzNdKTsNCiAgICAgICAgICAgICAgICB0ZXh0YXJlYUVsLmVuYWJsZURpc3BsYXlNb2RlKCk7DQogICAgICAgICAgICAgICAgcHJvZ3Jlc3NFbCA9IEV4dC5nZXQoYm9keUVsLmRvbS5jaGlsZE5vZGVzWzRdKTsNCiAgICAgICAgICAgICAgICBwcm9ncmVzc0VsLmVuYWJsZURpc3BsYXlNb2RlKCk7DQogICAgICAgICAgICAgICAgdmFyIHBmID0gcHJvZ3Jlc3NFbC5kb20uZmlyc3RDaGlsZDsNCiAgICAgICAgICAgICAgICBwcCA9IEV4dC5nZXQocGYuZmlyc3RDaGlsZCk7DQogICAgICAgICAgICAgICAgcHAuc2V0SGVpZ2h0KHBmLm9mZnNldEhlaWdodCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gZGxnOw0KICAgICAgICB9LA0KDQogICAgICAgIA0KICAgICAgICB1cGRhdGVUZXh0IDogZnVuY3Rpb24odGV4dCl7DQogICAgICAgICAgICBpZighZGxnLmlzVmlzaWJsZSgpICYmICFvcHQud2lkdGgpew0KICAgICAgICAgICAgICAgIGRsZy5yZXNpemVUbyh0aGlzLm1heFdpZHRoLCAxMDApOyAKICAgICAgICAgICAgfQ0KICAgICAgICAgICAgbXNnRWwuaW5uZXJIVE1MID0gdGV4dCB8fCAnJiMxNjA7JzsNCiAgICAgICAgICAgIHZhciB3ID0gTWF0aC5tYXgoTWF0aC5taW4ob3B0LndpZHRoIHx8IG1zZ0VsLm9mZnNldFdpZHRoLCB0aGlzLm1heFdpZHRoKSwgDQogICAgICAgICAgICAgICAgICAgICAgICBNYXRoLm1heChvcHQubWluV2lkdGggfHwgdGhpcy5taW5XaWR0aCwgYndpZHRoKSk7DQogICAgICAgICAgICBpZihvcHQucHJvbXB0KXsNCiAgICAgICAgICAgICAgICBhY3RpdmVUZXh0RWwuc2V0V2lkdGgodyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZihkbGcuaXNWaXNpYmxlKCkpew0KICAgICAgICAgICAgICAgIGRsZy5maXhlZGNlbnRlciA9IGZhbHNlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZGxnLnNldENvbnRlbnRTaXplKHcsIGJvZHlFbC5nZXRIZWlnaHQoKSk7DQogICAgICAgICAgICBpZihkbGcuaXNWaXNpYmxlKCkpew0KICAgICAgICAgICAgICAgIGRsZy5maXhlZGNlbnRlciA9IHRydWU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gdGhpczsNCiAgICAgICAgfSwNCg0KICAgICAgICANCiAgICAgICAgdXBkYXRlUHJvZ3Jlc3MgOiBmdW5jdGlvbih2YWx1ZSwgdGV4dCl7DQogICAgICAgICAgICBpZih0ZXh0KXsNCiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVRleHQodGV4dCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBwcC5zZXRXaWR0aChNYXRoLmZsb29yKHZhbHVlKnByb2dyZXNzRWwuZG9tLmZpcnN0Q2hpbGQub2Zmc2V0V2lkdGgpKTsNCiAgICAgICAgICAgIHJldHVybiB0aGlzOw0KICAgICAgICB9LCAgICAgICAgDQoNCiAgICAgICAgDQogICAgICAgIGlzVmlzaWJsZSA6IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICByZXR1cm4gZGxnICYmIGRsZy5pc1Zpc2libGUoKTsgIA0KICAgICAgICB9LA0KDQogICAgICAgIA0KICAgICAgICBoaWRlIDogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgIGlmKHRoaXMuaXNWaXNpYmxlKCkpew0KICAgICAgICAgICAgICAgIGRsZy5oaWRlKCk7DQogICAgICAgICAgICB9ICANCiAgICAgICAgfSwNCg0KICAgICAgICANCiAgICAgICAgc2hvdyA6IGZ1bmN0aW9uKG9wdGlvbnMpew0KICAgICAgICAgICAgaWYodGhpcy5pc1Zpc2libGUoKSl7DQogICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgZCA9IHRoaXMuZ2V0RGlhbG9nKCk7DQogICAgICAgICAgICBvcHQgPSBvcHRpb25zOw0KICAgICAgICAgICAgZC5zZXRUaXRsZShvcHQudGl0bGUgfHwgIiYjMTYwOyIpOw0KICAgICAgICAgICAgZC5jbG9zZS5zZXREaXNwbGF5ZWQob3B0LmNsb3NhYmxlICE9PSBmYWxzZSk7DQogICAgICAgICAgICBhY3RpdmVUZXh0RWwgPSB0ZXh0Ym94RWw7DQogICAgICAgICAgICBvcHQucHJvbXB0ID0gb3B0LnByb21wdCB8fCAob3B0Lm11bHRpbGluZSA/IHRydWUgOiBmYWxzZSk7DQogICAgICAgICAgICBpZihvcHQucHJvbXB0KXsNCiAgICAgICAgICAgICAgICBpZihvcHQubXVsdGlsaW5lKXsNCiAgICAgICAgICAgICAgICAgICAgdGV4dGJveEVsLmhpZGUoKTsNCiAgICAgICAgICAgICAgICAgICAgdGV4dGFyZWFFbC5zaG93KCk7DQogICAgICAgICAgICAgICAgICAgIHRleHRhcmVhRWwuc2V0SGVpZ2h0KHR5cGVvZiBvcHQubXVsdGlsaW5lID09ICJudW1iZXIiID8NCiAgICAgICAgICAgICAgICAgICAgICAgIG9wdC5tdWx0aWxpbmUgOiB0aGlzLmRlZmF1bHRUZXh0SGVpZ2h0KTsNCiAgICAgICAgICAgICAgICAgICAgYWN0aXZlVGV4dEVsID0gdGV4dGFyZWFFbDsNCiAgICAgICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICAgICAgdGV4dGJveEVsLnNob3coKTsNCiAgICAgICAgICAgICAgICAgICAgdGV4dGFyZWFFbC5oaWRlKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgdGV4dGJveEVsLmhpZGUoKTsNCiAgICAgICAgICAgICAgICB0ZXh0YXJlYUVsLmhpZGUoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHByb2dyZXNzRWwuc2V0RGlzcGxheWVkKG9wdC5wcm9ncmVzcyA9PT0gdHJ1ZSk7DQogICAgICAgICAgICB0aGlzLnVwZGF0ZVByb2dyZXNzKDApOw0KICAgICAgICAgICAgYWN0aXZlVGV4dEVsLmRvbS52YWx1ZSA9IG9wdC52YWx1ZSB8fCAiIjsNCiAgICAgICAgICAgIGlmKG9wdC5wcm9tcHQpew0KICAgICAgICAgICAgICAgIGRsZy5zZXREZWZhdWx0QnV0dG9uKGFjdGl2ZVRleHRFbCk7DQogICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICB2YXIgYnMgPSBvcHQuYnV0dG9uczsNCiAgICAgICAgICAgICAgICB2YXIgZGIgPSBudWxsOw0KICAgICAgICAgICAgICAgIGlmKGJzICYmIGJzLm9rKXsNCiAgICAgICAgICAgICAgICAgICAgZGIgPSBidXR0b25zWyJvayJdOw0KICAgICAgICAgICAgICAgIH1lbHNlIGlmKGJzICYmIGJzLnllcyl7DQogICAgICAgICAgICAgICAgICAgIGRiID0gYnV0dG9uc1sieWVzIl07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGRsZy5zZXREZWZhdWx0QnV0dG9uKGRiKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGJ3aWR0aCA9IHVwZGF0ZUJ1dHRvbnMob3B0LmJ1dHRvbnMpOw0KICAgICAgICAgICAgdGhpcy51cGRhdGVUZXh0KG9wdC5tc2cpOw0KICAgICAgICAgICAgaWYob3B0LmNscyl7DQogICAgICAgICAgICAgICAgZC5lbC5hZGRDbGFzcyhvcHQuY2xzKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGQucHJveHlEcmFnID0gb3B0LnByb3h5RHJhZyA9PT0gdHJ1ZTsNCiAgICAgICAgICAgIGQubW9kYWwgPSBvcHQubW9kYWwgIT09IGZhbHNlOw0KICAgICAgICAgICAgZC5tYXNrID0gb3B0Lm1vZGFsICE9PSBmYWxzZSA/IG1hc2sgOiBmYWxzZTsNCiAgICAgICAgICAgIGlmKCFkLmlzVmlzaWJsZSgpKXsNCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGxnLmVsLmRvbSk7DQogICAgICAgICAgICAgICAgZC5hbmltYXRlVGFyZ2V0ID0gbnVsbDsNCiAgICAgICAgICAgICAgICBkLnNob3cob3B0aW9ucy5hbmltRWwpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgICAgIH0sDQoNCiAgICAgICAgDQogICAgICAgIHByb2dyZXNzIDogZnVuY3Rpb24odGl0bGUsIG1zZyl7DQogICAgICAgICAgICB0aGlzLnNob3coew0KICAgICAgICAgICAgICAgIHRpdGxlIDogdGl0bGUsDQogICAgICAgICAgICAgICAgbXNnIDogbXNnLA0KICAgICAgICAgICAgICAgIGJ1dHRvbnM6IGZhbHNlLA0KICAgICAgICAgICAgICAgIHByb2dyZXNzOnRydWUsDQogICAgICAgICAgICAgICAgY2xvc2FibGU6ZmFsc2UsDQogICAgICAgICAgICAgICAgbWluV2lkdGg6IHRoaXMubWluUHJvZ3Jlc3NXaWR0aA0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICByZXR1cm4gdGhpczsNCiAgICAgICAgfSwNCg0KICAgICAgICANCiAgICAgICAgYWxlcnQgOiBmdW5jdGlvbih0aXRsZSwgbXNnLCBmbiwgc2NvcGUpew0KICAgICAgICAgICAgdGhpcy5zaG93KHsNCiAgICAgICAgICAgICAgICB0aXRsZSA6IHRpdGxlLA0KICAgICAgICAgICAgICAgIG1zZyA6IG1zZywNCiAgICAgICAgICAgICAgICBidXR0b25zOiB0aGlzLk9LLA0KICAgICAgICAgICAgICAgIGZuOiBmbiwNCiAgICAgICAgICAgICAgICBzY29wZSA6IHNjb3BlDQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIHJldHVybiB0aGlzOw0KICAgICAgICB9LA0KDQogICAgICAgIA0KICAgICAgICB3YWl0IDogZnVuY3Rpb24obXNnLCB0aXRsZSl7DQogICAgICAgICAgICB0aGlzLnNob3coew0KICAgICAgICAgICAgICAgIHRpdGxlIDogdGl0bGUsDQogICAgICAgICAgICAgICAgbXNnIDogbXNnLA0KICAgICAgICAgICAgICAgIGJ1dHRvbnM6IGZhbHNlLA0KICAgICAgICAgICAgICAgIGNsb3NhYmxlOmZhbHNlLA0KICAgICAgICAgICAgICAgIHByb2dyZXNzOnRydWUsDQogICAgICAgICAgICAgICAgbW9kYWw6dHJ1ZSwNCiAgICAgICAgICAgICAgICB3aWR0aDozMDAsDQogICAgICAgICAgICAgICAgd2FpdDp0cnVlDQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIHdhaXRUaW1lciA9IEV4dC5UYXNrTWdyLnN0YXJ0KHsNCiAgICAgICAgICAgICAgICBydW46IGZ1bmN0aW9uKGkpew0KICAgICAgICAgICAgICAgICAgICBFeHQuTWVzc2FnZUJveC51cGRhdGVQcm9ncmVzcygoKCgoaSsyMCklMjApKzEpKjUpKi4wMSk7DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICBpbnRlcnZhbDogMTAwMA0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICByZXR1cm4gdGhpczsNCiAgICAgICAgfSwNCg0KICAgICAgICANCiAgICAgICAgY29uZmlybSA6IGZ1bmN0aW9uKHRpdGxlLCBtc2csIGZuLCBzY29wZSl7DQogICAgICAgICAgICB0aGlzLnNob3coew0KICAgICAgICAgICAgICAgIHRpdGxlIDogdGl0bGUsDQogICAgICAgICAgICAgICAgbXNnIDogbXNnLA0KICAgICAgICAgICAgICAgIGJ1dHRvbnM6IHRoaXMuWUVTTk8sDQogICAgICAgICAgICAgICAgZm46IGZuLA0KICAgICAgICAgICAgICAgIHNjb3BlIDogc2NvcGUNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgICAgIH0sDQoNCiAgICAgICAgDQogICAgICAgIHByb21wdCA6IGZ1bmN0aW9uKHRpdGxlLCBtc2csIGZuLCBzY29wZSwgbXVsdGlsaW5lKXsNCiAgICAgICAgICAgIHRoaXMuc2hvdyh7DQogICAgICAgICAgICAgICAgdGl0bGUgOiB0aXRsZSwNCiAgICAgICAgICAgICAgICBtc2cgOiBtc2csDQogICAgICAgICAgICAgICAgYnV0dG9uczogdGhpcy5PS0NBTkNFTCwNCiAgICAgICAgICAgICAgICBmbjogZm4sDQogICAgICAgICAgICAgICAgbWluV2lkdGg6MjUwLA0KICAgICAgICAgICAgICAgIHNjb3BlIDogc2NvcGUsDQogICAgICAgICAgICAgICAgcHJvbXB0OnRydWUsDQogICAgICAgICAgICAgICAgbXVsdGlsaW5lOiBtdWx0aWxpbmUNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgICAgIH0sDQoNCiAgICAgICAgDQogICAgICAgIE9LIDoge29rOnRydWV9LA0KICAgICAgICANCiAgICAgICAgWUVTTk8gOiB7eWVzOnRydWUsIG5vOnRydWV9LA0KICAgICAgICANCiAgICAgICAgT0tDQU5DRUwgOiB7b2s6dHJ1ZSwgY2FuY2VsOnRydWV9LA0KICAgICAgICANCiAgICAgICAgWUVTTk9DQU5DRUwgOiB7eWVzOnRydWUsIG5vOnRydWUsIGNhbmNlbDp0cnVlfSwNCg0KICAgICAgICANCiAgICAgICAgZGVmYXVsdFRleHRIZWlnaHQgOiA3NSwNCiAgICAgICAgDQogICAgICAgIG1heFdpZHRoIDogNjAwLA0KICAgICAgICANCiAgICAgICAgbWluV2lkdGggOiAxMDAsDQogICAgICAgIA0KICAgICAgICBtaW5Qcm9ncmVzc1dpZHRoIDogMjUwLA0KICAgICAgICANCiAgICAgICAgYnV0dG9uVGV4dCA6IHsNCiAgICAgICAgICAgIG9rIDogIk9LIiwNCiAgICAgICAgICAgIGNhbmNlbCA6ICJDYW5jZWwiLA0KICAgICAgICAgICAgeWVzIDogIlllcyIsDQogICAgICAgICAgICBubyA6ICJObyINCiAgICAgICAgfQ0KICAgIH07DQp9KCk7DQoNCg0KRXh0Lk1zZyA9IEV4dC5NZXNzYWdlQm94OwoNCkV4dC5RdWlja1RpcHMgPSBmdW5jdGlvbigpew0KICAgIHZhciBlbCwgdGlwQm9keSwgdGlwQm9keVRleHQsIHRpcFRpdGxlLCB0bSwgY2ZnLCBjbG9zZSwgdGFnRWxzID0ge30sIGVzYywgcmVtb3ZlQ2xzID0gbnVsbCwgYmRMZWZ0LCBiZFJpZ2h0Ow0KICAgIHZhciBjZSwgYmQsIHh5LCBkZDsNCiAgICB2YXIgdmlzaWJsZSA9IGZhbHNlLCBkaXNhYmxlZCA9IHRydWUsIGluaXRlZCA9IGZhbHNlOw0KICAgIHZhciBzaG93UHJvYyA9IDEsIGhpZGVQcm9jID0gMSwgZGlzbWlzc1Byb2MgPSAxLCBsb2NrcyA9IFtdOw0KICAgIA0KICAgIHZhciBvbk92ZXIgPSBmdW5jdGlvbihlKXsNCiAgICAgICAgaWYoZGlzYWJsZWQpew0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQogICAgICAgIHZhciB0ID0gZS5nZXRUYXJnZXQoKTsNCiAgICAgICAgaWYoIXQgfHwgdC5ub2RlVHlwZSAhPT0gMSB8fCB0ID09IGRvY3VtZW50IHx8IHQgPT0gZG9jdW1lbnQuYm9keSl7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICAgICAgaWYoY2UgJiYgdCA9PSBjZS5lbCl7DQogICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlkZVByb2MpOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQogICAgICAgIGlmKHQgJiYgdGFnRWxzW3QuaWRdKXsNCiAgICAgICAgICAgIHRhZ0Vsc1t0LmlkXS5lbCA9IHQ7DQogICAgICAgICAgICBzaG93UHJvYyA9IHNob3cuZGVmZXIodG0uc2hvd0RlbGF5LCB0bSwgW3RhZ0Vsc1t0LmlkXV0pOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQogICAgICAgIHZhciB0dHAsIGV0ID0gRXh0LmZseSh0KTsNCiAgICAgICAgdmFyIG5zID0gY2ZnLm5hbWVzcGFjZTsNCiAgICAgICAgaWYodG0uaW50ZXJjZXB0VGl0bGVzICYmIHQudGl0bGUpew0KICAgICAgICAgICAgdHRwID0gdC50aXRsZTsNCiAgICAgICAgICAgIHQucXRpcCA9IHR0cDsNCiAgICAgICAgICAgIHQucmVtb3ZlQXR0cmlidXRlKCJ0aXRsZSIpOw0KICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOw0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIHR0cCA9IHQucXRpcCB8fCBldC5nZXRBdHRyaWJ1dGVOUyhucywgY2ZnLmF0dHJpYnV0ZSk7DQogICAgICAgIH0NCiAgICAgICAgaWYodHRwKXsNCiAgICAgICAgICAgIHNob3dQcm9jID0gc2hvdy5kZWZlcih0bS5zaG93RGVsYXksIHRtLCBbew0KICAgICAgICAgICAgICAgIGVsOiB0LCANCiAgICAgICAgICAgICAgICB0ZXh0OiB0dHAsIA0KICAgICAgICAgICAgICAgIHdpZHRoOiBldC5nZXRBdHRyaWJ1dGVOUyhucywgY2ZnLndpZHRoKSwNCiAgICAgICAgICAgICAgICBhdXRvSGlkZTogZXQuZ2V0QXR0cmlidXRlTlMobnMsIGNmZy5oaWRlKSAhPSAidXNlciIsDQogICAgICAgICAgICAgICAgdGl0bGU6IGV0LmdldEF0dHJpYnV0ZU5TKG5zLCBjZmcudGl0bGUpLA0KICAgICAgICAgICAJICAgIGNsczogZXQuZ2V0QXR0cmlidXRlTlMobnMsIGNmZy5jbHMpDQogICAgICAgICAgICB9XSk7DQogICAgICAgIH0NCiAgICB9Ow0KICAgIA0KICAgIHZhciBvbk91dCA9IGZ1bmN0aW9uKGUpew0KICAgICAgICBjbGVhclRpbWVvdXQoc2hvd1Byb2MpOw0KICAgICAgICB2YXIgdCA9IGUuZ2V0VGFyZ2V0KCk7DQogICAgICAgIGlmKHQgJiYgY2UgJiYgY2UuZWwgPT0gdCAmJiAodG0uYXV0b0hpZGUgJiYgY2UuYXV0b0hpZGUgIT09IGZhbHNlKSl7DQogICAgICAgICAgICBoaWRlUHJvYyA9IHNldFRpbWVvdXQoaGlkZSwgdG0uaGlkZURlbGF5KTsNCiAgICAgICAgfQ0KICAgIH07DQogICAgDQogICAgdmFyIG9uTW92ZSA9IGZ1bmN0aW9uKGUpew0KICAgICAgICBpZihkaXNhYmxlZCl7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICAgICAgeHkgPSBlLmdldFhZKCk7DQogICAgICAgIHh5WzFdICs9IDE4Ow0KICAgICAgICBpZih0bS50cmFja01vdXNlICYmIGNlKXsNCiAgICAgICAgICAgIGVsLnNldFhZKHh5KTsNCiAgICAgICAgfQ0KICAgIH07DQogICAgDQogICAgdmFyIG9uRG93biA9IGZ1bmN0aW9uKGUpew0KICAgICAgICBjbGVhclRpbWVvdXQoc2hvd1Byb2MpOw0KICAgICAgICBjbGVhclRpbWVvdXQoaGlkZVByb2MpOw0KICAgICAgICBpZighZS53aXRoaW4oZWwpKXsNCiAgICAgICAgICAgIGlmKHRtLmhpZGVPbkNsaWNrKXsNCiAgICAgICAgICAgICAgICBoaWRlKCk7DQogICAgICAgICAgICAgICAgdG0uZGlzYWJsZSgpOw0KICAgICAgICAgICAgICAgIHRtLmVuYWJsZS5kZWZlcigxMDAsIHRtKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH07DQogICAgDQogICAgdmFyIGdldFBhZCA9IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiBiZExlZnQuZ2V0UGFkZGluZygnbCcpK2JkUmlnaHQuZ2V0UGFkZGluZygncicpOw0KICAgIH07DQoNCiAgICB2YXIgc2hvdyA9IGZ1bmN0aW9uKG8pew0KICAgICAgICBpZihkaXNhYmxlZCl7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICAgICAgY2xlYXJUaW1lb3V0KGRpc21pc3NQcm9jKTsNCiAgICAgICAgY2UgPSBvOw0KICAgICAgICBpZihyZW1vdmVDbHMpeyAKICAgICAgICAgICAgZWwucmVtb3ZlQ2xhc3MocmVtb3ZlQ2xzKTsNCiAgICAgICAgICAgIHJlbW92ZUNscyA9IG51bGw7DQogICAgICAgIH0NCiAgICAgICAgaWYoY2UuY2xzKXsNCiAgICAgICAgICAgIGVsLmFkZENsYXNzKGNlLmNscyk7DQogICAgICAgICAgICByZW1vdmVDbHMgPSBjZS5jbHM7DQogICAgICAgIH0NCiAgICAgICAgaWYoY2UudGl0bGUpew0KICAgICAgICAgICAgdGlwVGl0bGUudXBkYXRlKGNlLnRpdGxlKTsNCiAgICAgICAgICAgIHRpcFRpdGxlLnNob3coKTsNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICB0aXBUaXRsZS51cGRhdGUoJycpOw0KICAgICAgICAgICAgdGlwVGl0bGUuaGlkZSgpOw0KICAgICAgICB9DQogICAgICAgIGVsLmRvbS5zdHlsZS53aWR0aCAgPSB0bS5tYXhXaWR0aCsncHgnOw0KICAgICAgICAKICAgICAgICB0aXBCb2R5VGV4dC51cGRhdGUoby50ZXh0KTsNCiAgICAgICAgdmFyIHAgPSBnZXRQYWQoKSwgdyA9IGNlLndpZHRoOw0KICAgICAgICBpZighdyl7DQogICAgICAgICAgICB2YXIgdGQgPSB0aXBCb2R5VGV4dC5kb207DQogICAgICAgICAgICB2YXIgYXcgPSBNYXRoLm1heCh0ZC5vZmZzZXRXaWR0aCwgdGQuY2xpZW50V2lkdGgsIHRkLnNjcm9sbFdpZHRoKTsNCiAgICAgICAgICAgIGlmKGF3ID4gdG0ubWF4V2lkdGgpew0KICAgICAgICAgICAgICAgIHcgPSB0bS5tYXhXaWR0aDsNCiAgICAgICAgICAgIH1lbHNlIGlmKGF3IDwgdG0ubWluV2lkdGgpew0KICAgICAgICAgICAgICAgIHcgPSB0bS5taW5XaWR0aDsNCiAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgIHcgPSBhdzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICAKICAgICAgICBlbC5zZXRXaWR0aChwYXJzZUludCh3LCAxMCkgKyBwKTsNCiAgICAgICAgaWYoY2UuYXV0b0hpZGUgPT09IGZhbHNlKXsNCiAgICAgICAgICAgIGNsb3NlLnNldERpc3BsYXllZCh0cnVlKTsNCiAgICAgICAgICAgIGlmKGRkKXsNCiAgICAgICAgICAgICAgICBkZC51bmxvY2soKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICBjbG9zZS5zZXREaXNwbGF5ZWQoZmFsc2UpOw0KICAgICAgICAgICAgaWYoZGQpew0KICAgICAgICAgICAgICAgIGRkLmxvY2soKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZih4eSl7DQogICAgICAgICAgICBlbC5hdm9pZFkgPSB4eVsxXS0xODsNCiAgICAgICAgICAgIGVsLnNldFhZKHh5KTsNCiAgICAgICAgfQ0KICAgICAgICBpZih0bS5hbmltYXRlKXsNCiAgICAgICAgICAgIGVsLnNldE9wYWNpdHkoLjEpOw0KICAgICAgICAgICAgZWwuc2V0U3R5bGUoInZpc2liaWxpdHkiLCAidmlzaWJsZSIpOw0KICAgICAgICAgICAgZWwuZmFkZUluKHtjYWxsYmFjazogYWZ0ZXJTaG93fSk7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgYWZ0ZXJTaG93KCk7DQogICAgICAgIH0NCiAgICB9Ow0KICAgIA0KICAgIHZhciBhZnRlclNob3cgPSBmdW5jdGlvbigpew0KICAgICAgICBpZihjZSl7DQogICAgICAgICAgICBlbC5zaG93KCk7DQogICAgICAgICAgICBlc2MuZW5hYmxlKCk7DQogICAgICAgICAgICBpZih0bS5hdXRvRGlzbWlzcyAmJiBjZS5hdXRvSGlkZSAhPT0gZmFsc2Upew0KICAgICAgICAgICAgICAgIGRpc21pc3NQcm9jID0gc2V0VGltZW91dChoaWRlLCB0bS5hdXRvRGlzbWlzc0RlbGF5KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH07DQogICAgDQogICAgdmFyIGhpZGUgPSBmdW5jdGlvbihub2FuaW0pew0KICAgICAgICBjbGVhclRpbWVvdXQoZGlzbWlzc1Byb2MpOw0KICAgICAgICBjbGVhclRpbWVvdXQoaGlkZVByb2MpOw0KICAgICAgICBjZSA9IG51bGw7DQogICAgICAgIGlmKGVsLmlzVmlzaWJsZSgpKXsNCiAgICAgICAgICAgIGVzYy5kaXNhYmxlKCk7DQogICAgICAgICAgICBpZihub2FuaW0gIT09IHRydWUgJiYgdG0uYW5pbWF0ZSl7DQogICAgICAgICAgICAgICAgZWwuZmFkZU91dCh7Y2FsbGJhY2s6IGFmdGVySGlkZX0pOw0KICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgYWZ0ZXJIaWRlKCk7DQogICAgICAgICAgICB9IA0KICAgICAgICB9DQogICAgfTsNCiAgICANCiAgICB2YXIgYWZ0ZXJIaWRlID0gZnVuY3Rpb24oKXsNCiAgICAgICAgZWwuaGlkZSgpOw0KICAgICAgICBpZihyZW1vdmVDbHMpew0KICAgICAgICAgICAgZWwucmVtb3ZlQ2xhc3MocmVtb3ZlQ2xzKTsNCiAgICAgICAgICAgIHJlbW92ZUNscyA9IG51bGw7DQogICAgICAgIH0NCiAgICB9Ow0KICAgIA0KICAgIHJldHVybiB7DQogICAgICAgIA0KICAgICAgIG1pbldpZHRoIDogNDAsDQogICAgICAgIA0KICAgICAgIG1heFdpZHRoIDogMzAwLA0KICAgICAgICANCiAgICAgICBpbnRlcmNlcHRUaXRsZXMgOiBmYWxzZSwNCiAgICAgICAgDQogICAgICAgdHJhY2tNb3VzZSA6IGZhbHNlLA0KICAgICAgICANCiAgICAgICBoaWRlT25DbGljayA6IHRydWUsDQogICAgICAgIA0KICAgICAgIHNob3dEZWxheSA6IDUwMCwNCiAgICAgICAgDQogICAgICAgaGlkZURlbGF5IDogMjAwLA0KICAgICAgICANCiAgICAgICBhdXRvSGlkZSA6IHRydWUsDQogICAgICAgIA0KICAgICAgIGF1dG9EaXNtaXNzIDogdHJ1ZSwNCiAgICAgICAgDQogICAgICAgYXV0b0Rpc21pc3NEZWxheSA6IDUwMDAsDQogICAgICAgDQogICAgICAgYW5pbWF0ZSA6IGZhbHNlLA0KDQogICAgICAgDQogICAgICAgDQogICAgICAgDQogICAgICAgDQoNCiAgICANCiAgICAgICBpbml0IDogZnVuY3Rpb24oKXsNCiAgICAgICAgICB0bSA9IEV4dC5RdWlja1RpcHM7DQogICAgICAgICAgY2ZnID0gdG0udGFnQ29uZmlnOw0KICAgICAgICAgIGlmKCFpbml0ZWQpew0KICAgICAgICAgICAgICBpZighRXh0LmlzUmVhZHkpeyAKICAgICAgICAgICAgICAgICAgRXh0Lm9uUmVhZHkoRXh0LlF1aWNrVGlwcy5pbml0LCBFeHQuUXVpY2tUaXBzKTsNCiAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICBlbCA9IG5ldyBFeHQuTGF5ZXIoe2NsczoieC10aXAiLCBzaGFkb3c6ImRyb3AiLCBzaGltOiB0cnVlLCBjb25zdHJhaW46dHJ1ZSwgc2hhZG93T2Zmc2V0OjR9KTsNCiAgICAgICAgICAgICAgZWwuZnhEZWZhdWx0cyA9IHtzdG9wRng6IHRydWV9Ow0KICAgICAgICAgICAgICAKICAgICAgICAgICAgICBlbC51cGRhdGUoJzxkaXYgY2xhc3M9IngtdGlwLXRvcC1sZWZ0Ij48ZGl2IGNsYXNzPSJ4LXRpcC10b3AtcmlnaHQiPjxkaXYgY2xhc3M9IngtdGlwLXRvcCI+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0ieC10aXAtYmQtbGVmdCI+PGRpdiBjbGFzcz0ieC10aXAtYmQtcmlnaHQiPjxkaXYgY2xhc3M9IngtdGlwLWJkIj48ZGl2IGNsYXNzPSJ4LXRpcC1jbG9zZSI+PC9kaXY+PGgzPjwvaDM+PGRpdiBjbGFzcz0ieC10aXAtYmQtaW5uZXIiPjwvZGl2PjxkaXYgY2xhc3M9IngtY2xlYXIiPjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9IngtdGlwLWZ0LWxlZnQiPjxkaXYgY2xhc3M9IngtdGlwLWZ0LXJpZ2h0Ij48ZGl2IGNsYXNzPSJ4LXRpcC1mdCI+PC9kaXY+PC9kaXY+PC9kaXY+Jyk7DQogICAgICAgICAgICAgIHRpcFRpdGxlID0gZWwuY2hpbGQoJ2gzJyk7DQogICAgICAgICAgICAgIHRpcFRpdGxlLmVuYWJsZURpc3BsYXlNb2RlKCJibG9jayIpOw0KICAgICAgICAgICAgICB0aXBCb2R5ID0gZWwuY2hpbGQoJ2Rpdi54LXRpcC1iZCcpOw0KICAgICAgICAgICAgICB0aXBCb2R5VGV4dCA9IGVsLmNoaWxkKCdkaXYueC10aXAtYmQtaW5uZXInKTsNCiAgICAgICAgICAgICAgYmRMZWZ0ID0gZWwuY2hpbGQoJ2Rpdi54LXRpcC1iZC1sZWZ0Jyk7DQogICAgICAgICAgICAgIGJkUmlnaHQgPSBlbC5jaGlsZCgnZGl2LngtdGlwLWJkLXJpZ2h0Jyk7DQogICAgICAgICAgICAgIGNsb3NlID0gZWwuY2hpbGQoJ2Rpdi54LXRpcC1jbG9zZScpOw0KICAgICAgICAgICAgICBjbG9zZS5lbmFibGVEaXNwbGF5TW9kZSgiYmxvY2siKTsNCiAgICAgICAgICAgICAgY2xvc2Uub24oImNsaWNrIiwgaGlkZSk7DQogICAgICAgICAgICAgIHZhciBkID0gRXh0LmdldChkb2N1bWVudCk7DQogICAgICAgICAgICAgIGQub24oIm1vdXNlZG93biIsIG9uRG93bik7DQogICAgICAgICAgICAgIGQub24oIm1vdXNlb3ZlciIsIG9uT3Zlcik7DQogICAgICAgICAgICAgIGQub24oIm1vdXNlb3V0Iiwgb25PdXQpOw0KICAgICAgICAgICAgICBkLm9uKCJtb3VzZW1vdmUiLCBvbk1vdmUpOw0KICAgICAgICAgICAgICBlc2MgPSBkLmFkZEtleUxpc3RlbmVyKDI3LCBoaWRlKTsNCiAgICAgICAgICAgICAgZXNjLmRpc2FibGUoKTsNCiAgICAgICAgICAgICAgaWYoRXh0LmRkLkREKXsNCiAgICAgICAgICAgICAgICAgIGRkID0gZWwuaW5pdEREKCJkZWZhdWx0IiwgbnVsbCwgew0KICAgICAgICAgICAgICAgICAgICAgIG9uRHJhZyA6IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICAgICAgICAgICAgIGVsLnN5bmMoKTsgIA0KICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgICAgZGQuc2V0SGFuZGxlRWxJZCh0aXBUaXRsZS5pZCk7DQogICAgICAgICAgICAgICAgICBkZC5sb2NrKCk7DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgaW5pdGVkID0gdHJ1ZTsNCiAgICAgICAgICB9DQogICAgICAgICAgdGhpcy5lbmFibGUoKTsgDQogICAgICAgfSwNCg0KICAgIA0KICAgICAgIHJlZ2lzdGVyIDogZnVuY3Rpb24oY29uZmlnKXsNCiAgICAgICAgICAgdmFyIGNzID0gY29uZmlnIGluc3RhbmNlb2YgQXJyYXkgPyBjb25maWcgOiBhcmd1bWVudHM7DQogICAgICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IGNzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7DQogICAgICAgICAgICAgICB2YXIgYyA9IGNzW2ldOw0KICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IGMudGFyZ2V0Ow0KICAgICAgICAgICAgICAgaWYodGFyZ2V0KXsNCiAgICAgICAgICAgICAgICAgICBpZih0YXJnZXQgaW5zdGFuY2VvZiBBcnJheSl7DQogICAgICAgICAgICAgICAgICAgICAgIGZvcih2YXIgaiA9IDAsIGpsZW4gPSB0YXJnZXQubGVuZ3RoOyBqIDwgamxlbjsgaisrKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ0Vsc1t0YXJnZXRbal1dID0gYzsNCiAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgICAgICAgICB0YWdFbHNbdHlwZW9mIHRhcmdldCA9PSAnc3RyaW5nJyA/IHRhcmdldCA6IEV4dC5pZCh0YXJnZXQpXSA9IGM7DQogICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICB9DQogICAgICAgfSwNCg0KICAgIA0KICAgICAgIHVucmVnaXN0ZXIgOiBmdW5jdGlvbihlbCl7DQogICAgICAgICAgIGRlbGV0ZSB0YWdFbHNbRXh0LmlkKGVsKV07DQogICAgICAgfSwNCg0KICAgIA0KICAgICAgIGVuYWJsZSA6IGZ1bmN0aW9uKCl7DQogICAgICAgICAgIGlmKGluaXRlZCAmJiBkaXNhYmxlZCl7DQogICAgICAgICAgICAgICBsb2Nrcy5wb3AoKTsNCiAgICAgICAgICAgICAgIGlmKGxvY2tzLmxlbmd0aCA8IDEpew0KICAgICAgICAgICAgICAgICAgIGRpc2FibGVkID0gZmFsc2U7DQogICAgICAgICAgICAgICB9DQogICAgICAgICAgIH0NCiAgICAgICB9LA0KDQogICAgDQogICAgICAgZGlzYWJsZSA6IGZ1bmN0aW9uKCl7DQogICAgICAgICAgZGlzYWJsZWQgPSB0cnVlOw0KICAgICAgICAgIGNsZWFyVGltZW91dChzaG93UHJvYyk7DQogICAgICAgICAgY2xlYXJUaW1lb3V0KGhpZGVQcm9jKTsNCiAgICAgICAgICBjbGVhclRpbWVvdXQoZGlzbWlzc1Byb2MpOw0KICAgICAgICAgIGlmKGNlKXsNCiAgICAgICAgICAgICAgaGlkZSh0cnVlKTsNCiAgICAgICAgICB9DQogICAgICAgICAgbG9ja3MucHVzaCgxKTsNCiAgICAgICB9LA0KDQogICAgDQogICAgICAgaXNFbmFibGVkIDogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgIHJldHVybiAhZGlzYWJsZWQ7DQogICAgICAgfSwNCg0KICAgICAgICAKICAgICAgIHRhZ0NvbmZpZyA6IHsNCiAgICAgICAgICAgbmFtZXNwYWNlIDogImV4dCIsDQogICAgICAgICAgIGF0dHJpYnV0ZSA6ICJxdGlwIiwNCiAgICAgICAgICAgd2lkdGggOiAid2lkdGgiLA0KICAgICAgICAgICB0YXJnZXQgOiAidGFyZ2V0IiwNCiAgICAgICAgICAgdGl0bGUgOiAicXRpdGxlIiwNCiAgICAgICAgICAgaGlkZSA6ICJoaWRlIiwNCiAgICAgICAgICAgY2xzIDogInFjbGFzcyINCiAgICAgICB9DQogICB9Ow0KfSgpOw0KDQoKRXh0LlF1aWNrVGlwcy50aXBzID0gRXh0LlF1aWNrVGlwcy5yZWdpc3RlcjsKDQpFeHQudHJlZS5UcmVlUGFuZWwgPSBmdW5jdGlvbihlbCwgY29uZmlnKXsNCiAgIEV4dC5hcHBseSh0aGlzLCBjb25maWcpOw0KICAgRXh0LnRyZWUuVHJlZVBhbmVsLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTsNCiAgIHRoaXMuZWwgPSBFeHQuZ2V0KGVsKTsNCiAgICB0aGlzLmVsLmFkZENsYXNzKCd4LXRyZWUnKTsNCiAgIA0KICAgdGhpcy5pZCA9IHRoaXMuZWwuaWQ7DQogICB0aGlzLmFkZEV2ZW50cyh7DQogICAgICAgIA0KICAgICAgICAiYmVmb3JlbG9hZCIgOiB0cnVlLA0KICAgICAgICANCiAgICAgICAgImxvYWQiIDogdHJ1ZSwNCiAgICAgICAgDQogICAgICAgICJ0ZXh0Y2hhbmdlIiA6IHRydWUsDQogICAgICAgIA0KICAgICAgICAiYmVmb3JlZXhwYW5kIiA6IHRydWUsDQogICAgICAgIA0KICAgICAgICAiYmVmb3JlY29sbGFwc2UiIDogdHJ1ZSwNCiAgICAgICAgDQogICAgICAgICJleHBhbmQiIDogdHJ1ZSwNCiAgICAgICAgDQogICAgICAgICJkaXNhYmxlZGNoYW5nZSIgOiB0cnVlLA0KICAgICAgICANCiAgICAgICAgImNvbGxhcHNlIiA6IHRydWUsDQogICAgICAgIA0KICAgICAgICAiYmVmb3JlY2xpY2siOnRydWUsDQogICAgICAgIA0KICAgICAgICAiY2hlY2tjaGFuZ2UiOnRydWUsDQogICAgICAgIA0KICAgICAgICAiY2xpY2siOnRydWUsDQogICAgICAgIA0KICAgICAgICAiZGJsY2xpY2siOnRydWUsDQogICAgICAgIA0KICAgICAgICAiY29udGV4dG1lbnUiOnRydWUsDQogICAgICAgIA0KICAgICAgICAiYmVmb3JlY2hpbGRyZW5yZW5kZXJlZCI6dHJ1ZSwNCiAgICAgICANCgkgICAgInN0YXJ0ZHJhZyIgOiB0cnVlLA0KCSAgICANCgkgICAgImVuZGRyYWciIDogdHJ1ZSwNCgkgICAgDQoJICAgICJkcmFnZHJvcCIgOiB0cnVlLA0KCSAgICANCgkgICAgImJlZm9yZW5vZGVkcm9wIiA6IHRydWUsDQoJICAgIA0KCSAgICAibm9kZWRyb3AiIDogdHJ1ZSwNCgkgICAgIA0KCSAgICAibm9kZWRyYWdvdmVyIiA6IHRydWUNCiAgIH0pOw0KICAgaWYodGhpcy5zaW5nbGVFeHBhbmQpew0KICAgICAgIHRoaXMub24oImJlZm9yZWV4cGFuZCIsIHRoaXMucmVzdHJpY3RFeHBhbmQsIHRoaXMpOw0KICAgfQ0KfTsNCkV4dC5leHRlbmQoRXh0LnRyZWUuVHJlZVBhbmVsLCBFeHQuZGF0YS5UcmVlLCB7DQogICAgcm9vdFZpc2libGUgOiB0cnVlLA0KICAgIGFuaW1hdGU6IEV4dC5lbmFibGVGeCwNCiAgICBsaW5lcyA6IHRydWUsDQogICAgZW5hYmxlREQgOiBmYWxzZSwNCiAgICBobERyb3AgOiBFeHQuZW5hYmxlRngsDQoNCiAgICAKICAgIHJlc3RyaWN0RXhwYW5kIDogZnVuY3Rpb24obm9kZSl7DQogICAgICAgIHZhciBwID0gbm9kZS5wYXJlbnROb2RlOw0KICAgICAgICBpZihwKXsNCiAgICAgICAgICAgIGlmKHAuZXhwYW5kZWRDaGlsZCAmJiBwLmV4cGFuZGVkQ2hpbGQucGFyZW50Tm9kZSA9PSBwKXsNCiAgICAgICAgICAgICAgICBwLmV4cGFuZGVkQ2hpbGQuY29sbGFwc2UoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHAuZXhwYW5kZWRDaGlsZCA9IG5vZGU7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgCiAgICBzZXRSb290Tm9kZSA6IGZ1bmN0aW9uKG5vZGUpew0KICAgICAgICBFeHQudHJlZS5UcmVlUGFuZWwuc3VwZXJjbGFzcy5zZXRSb290Tm9kZS5jYWxsKHRoaXMsIG5vZGUpOw0KICAgICAgICBpZighdGhpcy5yb290VmlzaWJsZSl7DQogICAgICAgICAgICBub2RlLnVpID0gbmV3IEV4dC50cmVlLlJvb3RUcmVlTm9kZVVJKG5vZGUpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBub2RlOw0KICAgIH0sDQoNCiAgICANCiAgICBnZXRFbCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLmVsOw0KICAgIH0sDQoNCiAgICANCiAgICBnZXRMb2FkZXIgOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gdGhpcy5sb2FkZXI7DQogICAgfSwNCg0KICAgIA0KICAgIGV4cGFuZEFsbCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHRoaXMucm9vdC5leHBhbmQodHJ1ZSk7DQogICAgfSwNCg0KICAgIA0KICAgIGNvbGxhcHNlQWxsIDogZnVuY3Rpb24oKXsNCiAgICAgICAgdGhpcy5yb290LmNvbGxhcHNlKHRydWUpOw0KICAgIH0sDQoNCiAgICANCiAgICBnZXRTZWxlY3Rpb25Nb2RlbCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIGlmKCF0aGlzLnNlbE1vZGVsKXsNCiAgICAgICAgICAgIHRoaXMuc2VsTW9kZWwgPSBuZXcgRXh0LnRyZWUuRGVmYXVsdFNlbGVjdGlvbk1vZGVsKCk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHRoaXMuc2VsTW9kZWw7DQogICAgfSwNCg0KICAgIA0KICAgIGdldENoZWNrZWQgOiBmdW5jdGlvbihhLCBzdGFydE5vZGUpew0KICAgICAgICBzdGFydE5vZGUgPSBzdGFydE5vZGUgfHwgdGhpcy5yb290Ow0KICAgICAgICB2YXIgciA9IFtdOw0KICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICBpZih0aGlzLmF0dHJpYnV0ZXMuY2hlY2tlZCl7DQogICAgICAgICAgICAgICAgci5wdXNoKCFhID8gdGhpcyA6IChhID09ICdpZCcgPyB0aGlzLmlkIDogdGhpcy5hdHRyaWJ1dGVzW2FdKSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgc3RhcnROb2RlLmNhc2NhZGUoZik7DQogICAgICAgIHJldHVybiByOw0KICAgIH0sDQoNCiAgICANCiAgICBleHBhbmRQYXRoIDogZnVuY3Rpb24ocGF0aCwgYXR0ciwgY2FsbGJhY2spew0KICAgICAgICBhdHRyID0gYXR0ciB8fCAiaWQiOw0KICAgICAgICB2YXIga2V5cyA9IHBhdGguc3BsaXQodGhpcy5wYXRoU2VwYXJhdG9yKTsNCiAgICAgICAgdmFyIGN1ck5vZGUgPSB0aGlzLnJvb3Q7DQogICAgICAgIGlmKGN1ck5vZGUuYXR0cmlidXRlc1thdHRyXSAhPSBrZXlzWzFdKXsgCiAgICAgICAgICAgIGlmKGNhbGxiYWNrKXsNCiAgICAgICAgICAgICAgICBjYWxsYmFjayhmYWxzZSwgbnVsbCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICAgICAgdmFyIGluZGV4ID0gMTsNCiAgICAgICAgdmFyIGYgPSBmdW5jdGlvbigpew0KICAgICAgICAgICAgaWYoKytpbmRleCA9PSBrZXlzLmxlbmd0aCl7DQogICAgICAgICAgICAgICAgaWYoY2FsbGJhY2spew0KICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh0cnVlLCBjdXJOb2RlKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIGMgPSBjdXJOb2RlLmZpbmRDaGlsZChhdHRyLCBrZXlzW2luZGV4XSk7DQogICAgICAgICAgICBpZighYyl7DQogICAgICAgICAgICAgICAgaWYoY2FsbGJhY2spew0KICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhmYWxzZSwgY3VyTm9kZSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGN1ck5vZGUgPSBjOw0KICAgICAgICAgICAgYy5leHBhbmQoZmFsc2UsIGZhbHNlLCBmKTsNCiAgICAgICAgfTsNCiAgICAgICAgY3VyTm9kZS5leHBhbmQoZmFsc2UsIGZhbHNlLCBmKTsNCiAgICB9LA0KDQogICAgDQogICAgc2VsZWN0UGF0aCA6IGZ1bmN0aW9uKHBhdGgsIGF0dHIsIGNhbGxiYWNrKXsNCiAgICAgICAgYXR0ciA9IGF0dHIgfHwgImlkIjsNCiAgICAgICAgdmFyIGtleXMgPSBwYXRoLnNwbGl0KHRoaXMucGF0aFNlcGFyYXRvcik7DQogICAgICAgIHZhciB2ID0ga2V5cy5wb3AoKTsNCiAgICAgICAgaWYoa2V5cy5sZW5ndGggPiAwKXsNCiAgICAgICAgICAgIHZhciBmID0gZnVuY3Rpb24oc3VjY2Vzcywgbm9kZSl7DQogICAgICAgICAgICAgICAgaWYoc3VjY2VzcyAmJiBub2RlKXsNCiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBub2RlLmZpbmRDaGlsZChhdHRyLCB2KTsNCiAgICAgICAgICAgICAgICAgICAgaWYobil7DQogICAgICAgICAgICAgICAgICAgICAgICBuLnNlbGVjdCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2FsbGJhY2spew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHRydWUsIG4pOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihjYWxsYmFjayl7DQogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhmYWxzZSwgbik7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICAgICAgaWYoY2FsbGJhY2spew0KICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZmFsc2UsIG4pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIHRoaXMuZXhwYW5kUGF0aChrZXlzLmpvaW4odGhpcy5wYXRoU2VwYXJhdG9yKSwgYXR0ciwgZik7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgdGhpcy5yb290LnNlbGVjdCgpOw0KICAgICAgICAgICAgaWYoY2FsbGJhY2spew0KICAgICAgICAgICAgICAgIGNhbGxiYWNrKHRydWUsIHRoaXMucm9vdCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgZ2V0VHJlZUVsIDogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIHRoaXMuZWw7DQogICAgfSwNCg0KICAgIA0KICAgIHJlbmRlciA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHRoaXMuaW5uZXJDdCA9IHRoaXMuZWwuY3JlYXRlQ2hpbGQoe3RhZzoidWwiLA0KICAgICAgICAgICAgICAgY2xzOiJ4LXRyZWUtcm9vdC1jdCAiICsNCiAgICAgICAgICAgICAgICh0aGlzLmxpbmVzID8gIngtdHJlZS1saW5lcyIgOiAieC10cmVlLW5vLWxpbmVzIil9KTsNCg0KICAgICAgICBpZih0aGlzLmNvbnRhaW5lclNjcm9sbCl7DQogICAgICAgICAgICBFeHQuZGQuU2Nyb2xsTWFuYWdlci5yZWdpc3Rlcih0aGlzLmVsKTsNCiAgICAgICAgfQ0KICAgICAgICBpZigodGhpcy5lbmFibGVERCB8fCB0aGlzLmVuYWJsZURyb3ApICYmICF0aGlzLmRyb3Bab25lKXsNCiAgICAgICAgICAgDQogICAgICAgICAgICAgdGhpcy5kcm9wWm9uZSA9IG5ldyBFeHQudHJlZS5UcmVlRHJvcFpvbmUodGhpcywgdGhpcy5kcm9wQ29uZmlnIHx8IHsNCiAgICAgICAgICAgICAgIGRkR3JvdXA6IHRoaXMuZGRHcm91cCB8fCAiVHJlZUREIiwgYXBwZW5kT25seTogdGhpcy5kZEFwcGVuZE9ubHkgPT09IHRydWUNCiAgICAgICAgICAgfSk7DQogICAgICAgIH0NCiAgICAgICAgaWYoKHRoaXMuZW5hYmxlREQgfHwgdGhpcy5lbmFibGVEcmFnKSAmJiAhdGhpcy5kcmFnWm9uZSl7DQogICAgICAgICAgIA0KICAgICAgICAgICAgdGhpcy5kcmFnWm9uZSA9IG5ldyBFeHQudHJlZS5UcmVlRHJhZ1pvbmUodGhpcywgdGhpcy5kcmFnQ29uZmlnIHx8IHsNCiAgICAgICAgICAgICAgIGRkR3JvdXA6IHRoaXMuZGRHcm91cCB8fCAiVHJlZUREIiwNCiAgICAgICAgICAgICAgIHNjcm9sbDogdGhpcy5kZFNjcm9sbA0KICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmdldFNlbGVjdGlvbk1vZGVsKCkuaW5pdCh0aGlzKTsNCiAgICAgICAgdGhpcy5yb290LnJlbmRlcigpOw0KICAgICAgICBpZighdGhpcy5yb290VmlzaWJsZSl7DQogICAgICAgICAgICB0aGlzLnJvb3QucmVuZGVyQ2hpbGRyZW4oKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9DQp9KTsKDQpFeHQudHJlZS5EZWZhdWx0U2VsZWN0aW9uTW9kZWwgPSBmdW5jdGlvbigpew0KICAgdGhpcy5zZWxOb2RlID0gbnVsbDsNCiAgIA0KICAgdGhpcy5hZGRFdmVudHMoew0KICAgICAgIA0KICAgICAgICJzZWxlY3Rpb25jaGFuZ2UiIDogdHJ1ZSwNCg0KICAgICAgIA0KICAgICAgICJiZWZvcmVzZWxlY3QiIDogdHJ1ZQ0KICAgfSk7DQp9Ow0KDQpFeHQuZXh0ZW5kKEV4dC50cmVlLkRlZmF1bHRTZWxlY3Rpb25Nb2RlbCwgRXh0LnV0aWwuT2JzZXJ2YWJsZSwgew0KICAgIGluaXQgOiBmdW5jdGlvbih0cmVlKXsNCiAgICAgICAgdGhpcy50cmVlID0gdHJlZTsNCiAgICAgICAgdHJlZS5nZXRUcmVlRWwoKS5vbigia2V5ZG93biIsIHRoaXMub25LZXlEb3duLCB0aGlzKTsNCiAgICAgICAgdHJlZS5vbigiY2xpY2siLCB0aGlzLm9uTm9kZUNsaWNrLCB0aGlzKTsNCiAgICB9LA0KICAgIA0KICAgIG9uTm9kZUNsaWNrIDogZnVuY3Rpb24obm9kZSwgZSl7DQogICAgICAgIHRoaXMuc2VsZWN0KG5vZGUpOw0KICAgIH0sDQogICAgDQogICAgDQogICAgc2VsZWN0IDogZnVuY3Rpb24obm9kZSl7DQogICAgICAgIHZhciBsYXN0ID0gdGhpcy5zZWxOb2RlOw0KICAgICAgICBpZihsYXN0ICE9IG5vZGUgJiYgdGhpcy5maXJlRXZlbnQoJ2JlZm9yZXNlbGVjdCcsIHRoaXMsIG5vZGUsIGxhc3QpICE9PSBmYWxzZSl7DQogICAgICAgICAgICBpZihsYXN0KXsNCiAgICAgICAgICAgICAgICBsYXN0LnVpLm9uU2VsZWN0ZWRDaGFuZ2UoZmFsc2UpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5zZWxOb2RlID0gbm9kZTsNCiAgICAgICAgICAgIG5vZGUudWkub25TZWxlY3RlZENoYW5nZSh0cnVlKTsNCiAgICAgICAgICAgIHRoaXMuZmlyZUV2ZW50KCJzZWxlY3Rpb25jaGFuZ2UiLCB0aGlzLCBub2RlLCBsYXN0KTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gbm9kZTsNCiAgICB9LA0KICAgIA0KICAgIA0KICAgIHVuc2VsZWN0IDogZnVuY3Rpb24obm9kZSl7DQogICAgICAgIGlmKHRoaXMuc2VsTm9kZSA9PSBub2RlKXsNCiAgICAgICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb25zKCk7DQogICAgICAgIH0gICAgDQogICAgfSwNCiAgICANCiAgICANCiAgICBjbGVhclNlbGVjdGlvbnMgOiBmdW5jdGlvbigpew0KICAgICAgICB2YXIgbiA9IHRoaXMuc2VsTm9kZTsNCiAgICAgICAgaWYobil7DQogICAgICAgICAgICBuLnVpLm9uU2VsZWN0ZWRDaGFuZ2UoZmFsc2UpOw0KICAgICAgICAgICAgdGhpcy5zZWxOb2RlID0gbnVsbDsNCiAgICAgICAgICAgIHRoaXMuZmlyZUV2ZW50KCJzZWxlY3Rpb25jaGFuZ2UiLCB0aGlzLCBudWxsKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gbjsNCiAgICB9LA0KICAgIA0KICAgIA0KICAgIGdldFNlbGVjdGVkTm9kZSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLnNlbE5vZGU7ICAgIA0KICAgIH0sDQogICAgDQogICAgDQogICAgaXNTZWxlY3RlZCA6IGZ1bmN0aW9uKG5vZGUpew0KICAgICAgICByZXR1cm4gdGhpcy5zZWxOb2RlID09IG5vZGU7ICANCiAgICB9LA0KDQogICAgDQogICAgc2VsZWN0UHJldmlvdXMgOiBmdW5jdGlvbigpew0KICAgICAgICB2YXIgcyA9IHRoaXMuc2VsTm9kZSB8fCB0aGlzLmxhc3RTZWxOb2RlOw0KICAgICAgICBpZighcyl7DQogICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgcHMgPSBzLnByZXZpb3VzU2libGluZzsNCiAgICAgICAgaWYocHMpew0KICAgICAgICAgICAgaWYoIXBzLmlzRXhwYW5kZWQoKSB8fCBwcy5jaGlsZE5vZGVzLmxlbmd0aCA8IDEpew0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdChwcyk7DQogICAgICAgICAgICB9IGVsc2V7DQogICAgICAgICAgICAgICAgdmFyIGxjID0gcHMubGFzdENoaWxkOw0KICAgICAgICAgICAgICAgIHdoaWxlKGxjICYmIGxjLmlzRXhwYW5kZWQoKSAmJiBsYy5jaGlsZE5vZGVzLmxlbmd0aCA+IDApew0KICAgICAgICAgICAgICAgICAgICBsYyA9IGxjLmxhc3RDaGlsZDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0KGxjKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmKHMucGFyZW50Tm9kZSAmJiAodGhpcy50cmVlLnJvb3RWaXNpYmxlIHx8ICFzLnBhcmVudE5vZGUuaXNSb290KSl7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Qocy5wYXJlbnROb2RlKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICB9LA0KDQogICAgDQogICAgc2VsZWN0TmV4dCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHZhciBzID0gdGhpcy5zZWxOb2RlIHx8IHRoaXMubGFzdFNlbE5vZGU7DQogICAgICAgIGlmKCFzKXsNCiAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICB9DQogICAgICAgIGlmKHMuZmlyc3RDaGlsZCAmJiBzLmlzRXhwYW5kZWQoKSl7DQogICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0KHMuZmlyc3RDaGlsZCk7DQogICAgICAgICB9ZWxzZSBpZihzLm5leHRTaWJsaW5nKXsNCiAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Qocy5uZXh0U2libGluZyk7DQogICAgICAgICB9ZWxzZSBpZihzLnBhcmVudE5vZGUpew0KICAgICAgICAgICAgdmFyIG5ld1MgPSBudWxsOw0KICAgICAgICAgICAgcy5wYXJlbnROb2RlLmJ1YmJsZShmdW5jdGlvbigpew0KICAgICAgICAgICAgICAgIGlmKHRoaXMubmV4dFNpYmxpbmcpew0KICAgICAgICAgICAgICAgICAgICBuZXdTID0gdGhpcy5nZXRPd25lclRyZWUoKS5zZWxNb2RlbC5zZWxlY3QodGhpcy5uZXh0U2libGluZyk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIHJldHVybiBuZXdTOw0KICAgICAgICAgfQ0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICB9LA0KDQogICAgb25LZXlEb3duIDogZnVuY3Rpb24oZSl7DQogICAgICAgIHZhciBzID0gdGhpcy5zZWxOb2RlIHx8IHRoaXMubGFzdFNlbE5vZGU7DQogICAgICAgIAogICAgICAgIHZhciBzbSA9IHRoaXM7DQogICAgICAgIGlmKCFzKXsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgayA9IGUuZ2V0S2V5KCk7DQogICAgICAgIHN3aXRjaChrKXsNCiAgICAgICAgICAgICBjYXNlIGUuRE9XTjoNCiAgICAgICAgICAgICAgICAgZS5zdG9wRXZlbnQoKTsNCiAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3ROZXh0KCk7DQogICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgY2FzZSBlLlVQOg0KICAgICAgICAgICAgICAgICBlLnN0b3BFdmVudCgpOw0KICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdFByZXZpb3VzKCk7DQogICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgY2FzZSBlLlJJR0hUOg0KICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7DQogICAgICAgICAgICAgICAgIGlmKHMuaGFzQ2hpbGROb2RlcygpKXsNCiAgICAgICAgICAgICAgICAgICAgIGlmKCFzLmlzRXhwYW5kZWQoKSl7DQogICAgICAgICAgICAgICAgICAgICAgICAgcy5leHBhbmQoKTsNCiAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKHMuZmlyc3RDaGlsZCl7DQogICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Qocy5maXJzdENoaWxkLCBlKTsNCiAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgIGNhc2UgZS5MRUZUOg0KICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7DQogICAgICAgICAgICAgICAgIGlmKHMuaGFzQ2hpbGROb2RlcygpICYmIHMuaXNFeHBhbmRlZCgpKXsNCiAgICAgICAgICAgICAgICAgICAgIHMuY29sbGFwc2UoKTsNCiAgICAgICAgICAgICAgICAgfWVsc2UgaWYocy5wYXJlbnROb2RlICYmICh0aGlzLnRyZWUucm9vdFZpc2libGUgfHwgcy5wYXJlbnROb2RlICE9IHRoaXMudHJlZS5nZXRSb290Tm9kZSgpKSl7DQogICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdChzLnBhcmVudE5vZGUsIGUpOw0KICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH07DQogICAgfQ0KfSk7DQoNCg0KRXh0LnRyZWUuTXVsdGlTZWxlY3Rpb25Nb2RlbCA9IGZ1bmN0aW9uKCl7DQogICB0aGlzLnNlbE5vZGVzID0gW107DQogICB0aGlzLnNlbE1hcCA9IHt9Ow0KICAgdGhpcy5hZGRFdmVudHMoew0KICAgICAgIA0KICAgICAgICJzZWxlY3Rpb25jaGFuZ2UiIDogdHJ1ZQ0KICAgfSk7DQp9Ow0KDQpFeHQuZXh0ZW5kKEV4dC50cmVlLk11bHRpU2VsZWN0aW9uTW9kZWwsIEV4dC51dGlsLk9ic2VydmFibGUsIHsNCiAgICBpbml0IDogZnVuY3Rpb24odHJlZSl7DQogICAgICAgIHRoaXMudHJlZSA9IHRyZWU7DQogICAgICAgIHRyZWUuZ2V0VHJlZUVsKCkub24oImtleWRvd24iLCB0aGlzLm9uS2V5RG93biwgdGhpcyk7DQogICAgICAgIHRyZWUub24oImNsaWNrIiwgdGhpcy5vbk5vZGVDbGljaywgdGhpcyk7DQogICAgfSwNCiAgICANCiAgICBvbk5vZGVDbGljayA6IGZ1bmN0aW9uKG5vZGUsIGUpew0KICAgICAgICB0aGlzLnNlbGVjdChub2RlLCBlLCBlLmN0cmxLZXkpOw0KICAgIH0sDQogICAgDQogICAgDQogICAgc2VsZWN0IDogZnVuY3Rpb24obm9kZSwgZSwga2VlcEV4aXN0aW5nKXsNCiAgICAgICAgaWYoa2VlcEV4aXN0aW5nICE9PSB0cnVlKXsNCiAgICAgICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb25zKHRydWUpOw0KICAgICAgICB9DQogICAgICAgIGlmKHRoaXMuaXNTZWxlY3RlZChub2RlKSl7DQogICAgICAgICAgICB0aGlzLmxhc3RTZWxOb2RlID0gbm9kZTsNCiAgICAgICAgICAgIHJldHVybiBub2RlOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuc2VsTm9kZXMucHVzaChub2RlKTsNCiAgICAgICAgdGhpcy5zZWxNYXBbbm9kZS5pZF0gPSBub2RlOw0KICAgICAgICB0aGlzLmxhc3RTZWxOb2RlID0gbm9kZTsNCiAgICAgICAgbm9kZS51aS5vblNlbGVjdGVkQ2hhbmdlKHRydWUpOw0KICAgICAgICB0aGlzLmZpcmVFdmVudCgic2VsZWN0aW9uY2hhbmdlIiwgdGhpcywgdGhpcy5zZWxOb2Rlcyk7DQogICAgICAgIHJldHVybiBub2RlOw0KICAgIH0sDQogICAgDQogICAgDQogICAgdW5zZWxlY3QgOiBmdW5jdGlvbihub2RlKXsNCiAgICAgICAgaWYodGhpcy5zZWxNYXBbbm9kZS5pZF0pew0KICAgICAgICAgICAgbm9kZS51aS5vblNlbGVjdGVkQ2hhbmdlKGZhbHNlKTsNCiAgICAgICAgICAgIHZhciBzbiA9IHRoaXMuc2VsTm9kZXM7DQogICAgICAgICAgICB2YXIgaW5kZXggPSAtMTsNCiAgICAgICAgICAgIGlmKHNuLmluZGV4T2Ypew0KICAgICAgICAgICAgICAgIGluZGV4ID0gc24uaW5kZXhPZihub2RlKTsNCiAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IHNuLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXsNCiAgICAgICAgICAgICAgICAgICAgaWYoc25baV0gPT0gbm9kZSl7DQogICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKGluZGV4ICE9IC0xKXsNCiAgICAgICAgICAgICAgICB0aGlzLnNlbE5vZGVzLnNwbGljZShpbmRleCwgMSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBkZWxldGUgdGhpcy5zZWxNYXBbbm9kZS5pZF07DQogICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgic2VsZWN0aW9uY2hhbmdlIiwgdGhpcywgdGhpcy5zZWxOb2Rlcyk7DQogICAgICAgIH0NCiAgICB9LA0KICAgIA0KICAgIA0KICAgIGNsZWFyU2VsZWN0aW9ucyA6IGZ1bmN0aW9uKHN1cHByZXNzRXZlbnQpew0KICAgICAgICB2YXIgc24gPSB0aGlzLnNlbE5vZGVzOw0KICAgICAgICBpZihzbi5sZW5ndGggPiAwKXsNCiAgICAgICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IHNuLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXsNCiAgICAgICAgICAgICAgICBzbltpXS51aS5vblNlbGVjdGVkQ2hhbmdlKGZhbHNlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMuc2VsTm9kZXMgPSBbXTsNCiAgICAgICAgICAgIHRoaXMuc2VsTWFwID0ge307DQogICAgICAgICAgICBpZihzdXBwcmVzc0V2ZW50ICE9PSB0cnVlKXsNCiAgICAgICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgic2VsZWN0aW9uY2hhbmdlIiwgdGhpcywgdGhpcy5zZWxOb2Rlcyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9LA0KICAgIA0KICAgIA0KICAgIGlzU2VsZWN0ZWQgOiBmdW5jdGlvbihub2RlKXsNCiAgICAgICAgcmV0dXJuIHRoaXMuc2VsTWFwW25vZGUuaWRdID8gdHJ1ZSA6IGZhbHNlOyAgDQogICAgfSwNCiAgICANCiAgICANCiAgICBnZXRTZWxlY3RlZE5vZGVzIDogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIHRoaXMuc2VsTm9kZXM7ICAgIA0KICAgIH0sDQoNCiAgICBvbktleURvd24gOiBFeHQudHJlZS5EZWZhdWx0U2VsZWN0aW9uTW9kZWwucHJvdG90eXBlLm9uS2V5RG93biwNCg0KICAgIHNlbGVjdE5leHQgOiBFeHQudHJlZS5EZWZhdWx0U2VsZWN0aW9uTW9kZWwucHJvdG90eXBlLnNlbGVjdE5leHQsDQoNCiAgICBzZWxlY3RQcmV2aW91cyA6IEV4dC50cmVlLkRlZmF1bHRTZWxlY3Rpb25Nb2RlbC5wcm90b3R5cGUuc2VsZWN0UHJldmlvdXMNCn0pOwoNCkV4dC50cmVlLlRyZWVOb2RlID0gZnVuY3Rpb24oYXR0cmlidXRlcyl7DQogICAgYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXMgfHwge307DQogICAgaWYodHlwZW9mIGF0dHJpYnV0ZXMgPT0gInN0cmluZyIpew0KICAgICAgICBhdHRyaWJ1dGVzID0ge3RleHQ6IGF0dHJpYnV0ZXN9Ow0KICAgIH0NCiAgICB0aGlzLmNoaWxkcmVuUmVuZGVyZWQgPSBmYWxzZTsNCiAgICB0aGlzLnJlbmRlcmVkID0gZmFsc2U7DQogICAgRXh0LnRyZWUuVHJlZU5vZGUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIGF0dHJpYnV0ZXMpOw0KICAgIHRoaXMuZXhwYW5kZWQgPSBhdHRyaWJ1dGVzLmV4cGFuZGVkID09PSB0cnVlOw0KICAgIHRoaXMuaXNUYXJnZXQgPSBhdHRyaWJ1dGVzLmlzVGFyZ2V0ICE9PSBmYWxzZTsNCiAgICB0aGlzLmRyYWdnYWJsZSA9IGF0dHJpYnV0ZXMuZHJhZ2dhYmxlICE9PSBmYWxzZSAmJiBhdHRyaWJ1dGVzLmFsbG93RHJhZyAhPT0gZmFsc2U7DQogICAgdGhpcy5hbGxvd0NoaWxkcmVuID0gYXR0cmlidXRlcy5hbGxvd0NoaWxkcmVuICE9PSBmYWxzZSAmJiBhdHRyaWJ1dGVzLmFsbG93RHJvcCAhPT0gZmFsc2U7DQoNCiAgICANCiAgICB0aGlzLnRleHQgPSBhdHRyaWJ1dGVzLnRleHQ7DQogICAgDQogICAgdGhpcy5kaXNhYmxlZCA9IGF0dHJpYnV0ZXMuZGlzYWJsZWQgPT09IHRydWU7DQoNCiAgICB0aGlzLmFkZEV2ZW50cyh7DQogICAgICAgIA0KICAgICAgICAidGV4dGNoYW5nZSIgOiB0cnVlLA0KICAgICAgICANCiAgICAgICAgImJlZm9yZWV4cGFuZCIgOiB0cnVlLA0KICAgICAgICANCiAgICAgICAgImJlZm9yZWNvbGxhcHNlIiA6IHRydWUsDQogICAgICAgIA0KICAgICAgICAiZXhwYW5kIiA6IHRydWUsDQogICAgICAgIA0KICAgICAgICAiZGlzYWJsZWRjaGFuZ2UiIDogdHJ1ZSwNCiAgICAgICAgDQogICAgICAgICJjb2xsYXBzZSIgOiB0cnVlLA0KICAgICAgICANCiAgICAgICAgImJlZm9yZWNsaWNrIjp0cnVlLA0KICAgICAgICANCiAgICAgICAgImNoZWNrY2hhbmdlIjp0cnVlLA0KICAgICAgICANCiAgICAgICAgImNsaWNrIjp0cnVlLA0KICAgICAgICANCiAgICAgICAgImRibGNsaWNrIjp0cnVlLA0KICAgICAgICANCiAgICAgICAgImNvbnRleHRtZW51Ijp0cnVlLA0KICAgICAgICANCiAgICAgICAgImJlZm9yZWNoaWxkcmVucmVuZGVyZWQiOnRydWUNCiAgICB9KTsNCg0KICAgIHZhciB1aUNsYXNzID0gdGhpcy5hdHRyaWJ1dGVzLnVpUHJvdmlkZXIgfHwgRXh0LnRyZWUuVHJlZU5vZGVVSTsNCg0KICAgIA0KICAgIHRoaXMudWkgPSBuZXcgdWlDbGFzcyh0aGlzKTsNCn07DQpFeHQuZXh0ZW5kKEV4dC50cmVlLlRyZWVOb2RlLCBFeHQuZGF0YS5Ob2RlLCB7DQogICAgcHJldmVudEhTY3JvbGw6IHRydWUsDQogICAgDQogICAgaXNFeHBhbmRlZCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLmV4cGFuZGVkOw0KICAgIH0sDQoNCiAgICANCiAgICBnZXRVSSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLnVpOw0KICAgIH0sDQoNCiAgICAKICAgIHNldEZpcnN0Q2hpbGQgOiBmdW5jdGlvbihub2RlKXsNCiAgICAgICAgdmFyIG9mID0gdGhpcy5maXJzdENoaWxkOw0KICAgICAgICBFeHQudHJlZS5UcmVlTm9kZS5zdXBlcmNsYXNzLnNldEZpcnN0Q2hpbGQuY2FsbCh0aGlzLCBub2RlKTsNCiAgICAgICAgaWYodGhpcy5jaGlsZHJlblJlbmRlcmVkICYmIG9mICYmIG5vZGUgIT0gb2Ypew0KICAgICAgICAgICAgb2YucmVuZGVySW5kZW50KHRydWUsIHRydWUpOw0KICAgICAgICB9DQogICAgICAgIGlmKHRoaXMucmVuZGVyZWQpew0KICAgICAgICAgICAgdGhpcy5yZW5kZXJJbmRlbnQodHJ1ZSwgdHJ1ZSk7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgCiAgICBzZXRMYXN0Q2hpbGQgOiBmdW5jdGlvbihub2RlKXsNCiAgICAgICAgdmFyIG9sID0gdGhpcy5sYXN0Q2hpbGQ7DQogICAgICAgIEV4dC50cmVlLlRyZWVOb2RlLnN1cGVyY2xhc3Muc2V0TGFzdENoaWxkLmNhbGwodGhpcywgbm9kZSk7DQogICAgICAgIGlmKHRoaXMuY2hpbGRyZW5SZW5kZXJlZCAmJiBvbCAmJiBub2RlICE9IG9sKXsNCiAgICAgICAgICAgIG9sLnJlbmRlckluZGVudCh0cnVlLCB0cnVlKTsNCiAgICAgICAgfQ0KICAgICAgICBpZih0aGlzLnJlbmRlcmVkKXsNCiAgICAgICAgICAgIHRoaXMucmVuZGVySW5kZW50KHRydWUsIHRydWUpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIAogICAgCiAgICBhcHBlbmRDaGlsZCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHZhciBub2RlID0gRXh0LnRyZWUuVHJlZU5vZGUuc3VwZXJjbGFzcy5hcHBlbmRDaGlsZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOw0KICAgICAgICBpZihub2RlICYmIHRoaXMuY2hpbGRyZW5SZW5kZXJlZCl7DQogICAgICAgICAgICBub2RlLnJlbmRlcigpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMudWkudXBkYXRlRXhwYW5kSWNvbigpOw0KICAgICAgICByZXR1cm4gbm9kZTsNCiAgICB9LA0KDQogICAgCiAgICByZW1vdmVDaGlsZCA6IGZ1bmN0aW9uKG5vZGUpew0KICAgICAgICB0aGlzLm93bmVyVHJlZS5nZXRTZWxlY3Rpb25Nb2RlbCgpLnVuc2VsZWN0KG5vZGUpOw0KICAgICAgICBFeHQudHJlZS5UcmVlTm9kZS5zdXBlcmNsYXNzLnJlbW92ZUNoaWxkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7DQogICAgICAgIAogICAgICAgIGlmKHRoaXMuY2hpbGRyZW5SZW5kZXJlZCl7DQogICAgICAgICAgICBub2RlLnVpLnJlbW92ZSgpOw0KICAgICAgICB9DQogICAgICAgIGlmKHRoaXMuY2hpbGROb2Rlcy5sZW5ndGggPCAxKXsNCiAgICAgICAgICAgIHRoaXMuY29sbGFwc2UoZmFsc2UsIGZhbHNlKTsNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICB0aGlzLnVpLnVwZGF0ZUV4cGFuZEljb24oKTsNCiAgICAgICAgfQ0KICAgICAgICBpZighdGhpcy5maXJzdENoaWxkKSB7DQogICAgICAgICAgICB0aGlzLmNoaWxkcmVuUmVuZGVyZWQgPSBmYWxzZTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gbm9kZTsNCiAgICB9LA0KDQogICAgCiAgICBpbnNlcnRCZWZvcmUgOiBmdW5jdGlvbihub2RlLCByZWZOb2RlKXsNCiAgICAgICAgdmFyIG5ld05vZGUgPSBFeHQudHJlZS5UcmVlTm9kZS5zdXBlcmNsYXNzLmluc2VydEJlZm9yZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOw0KICAgICAgICBpZihuZXdOb2RlICYmIHJlZk5vZGUgJiYgdGhpcy5jaGlsZHJlblJlbmRlcmVkKXsNCiAgICAgICAgICAgIG5vZGUucmVuZGVyKCk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy51aS51cGRhdGVFeHBhbmRJY29uKCk7DQogICAgICAgIHJldHVybiBuZXdOb2RlOw0KICAgIH0sDQoNCiAgICANCiAgICBzZXRUZXh0IDogZnVuY3Rpb24odGV4dCl7DQogICAgICAgIHZhciBvbGRUZXh0ID0gdGhpcy50ZXh0Ow0KICAgICAgICB0aGlzLnRleHQgPSB0ZXh0Ow0KICAgICAgICB0aGlzLmF0dHJpYnV0ZXMudGV4dCA9IHRleHQ7DQogICAgICAgIGlmKHRoaXMucmVuZGVyZWQpeyAKICAgICAgICAgICAgdGhpcy51aS5vblRleHRDaGFuZ2UodGhpcywgdGV4dCwgb2xkVGV4dCk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5maXJlRXZlbnQoInRleHRjaGFuZ2UiLCB0aGlzLCB0ZXh0LCBvbGRUZXh0KTsNCiAgICB9LA0KDQogICAgDQogICAgc2VsZWN0IDogZnVuY3Rpb24oKXsNCiAgICAgICAgdGhpcy5nZXRPd25lclRyZWUoKS5nZXRTZWxlY3Rpb25Nb2RlbCgpLnNlbGVjdCh0aGlzKTsNCiAgICB9LA0KDQogICAgDQogICAgdW5zZWxlY3QgOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLmdldE93bmVyVHJlZSgpLmdldFNlbGVjdGlvbk1vZGVsKCkudW5zZWxlY3QodGhpcyk7DQogICAgfSwNCg0KICAgIA0KICAgIGlzU2VsZWN0ZWQgOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gdGhpcy5nZXRPd25lclRyZWUoKS5nZXRTZWxlY3Rpb25Nb2RlbCgpLmlzU2VsZWN0ZWQodGhpcyk7DQogICAgfSwNCg0KICAgIA0KICAgIGV4cGFuZCA6IGZ1bmN0aW9uKGRlZXAsIGFuaW0sIGNhbGxiYWNrKXsNCiAgICAgICAgaWYoIXRoaXMuZXhwYW5kZWQpew0KICAgICAgICAgICAgaWYodGhpcy5maXJlRXZlbnQoImJlZm9yZWV4cGFuZCIsIHRoaXMsIGRlZXAsIGFuaW0pID09PSBmYWxzZSl7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYoIXRoaXMuY2hpbGRyZW5SZW5kZXJlZCl7DQogICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJDaGlsZHJlbigpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5leHBhbmRlZCA9IHRydWU7DQogICAgICAgICAgICBpZighdGhpcy5pc0hpZGRlblJvb3QoKSAmJiAodGhpcy5nZXRPd25lclRyZWUoKS5hbmltYXRlICYmIGFuaW0gIT09IGZhbHNlKSB8fCBhbmltKXsNCiAgICAgICAgICAgICAgICB0aGlzLnVpLmFuaW1FeHBhbmQoZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoImV4cGFuZCIsIHRoaXMpOw0KICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YgY2FsbGJhY2sgPT0gImZ1bmN0aW9uIil7DQogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh0aGlzKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZihkZWVwID09PSB0cnVlKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwYW5kQ2hpbGROb2Rlcyh0cnVlKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0uY3JlYXRlRGVsZWdhdGUodGhpcykpOw0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgIHRoaXMudWkuZXhwYW5kKCk7DQogICAgICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoImV4cGFuZCIsIHRoaXMpOw0KICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBjYWxsYmFjayA9PSAiZnVuY3Rpb24iKXsNCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sodGhpcyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgaWYodHlwZW9mIGNhbGxiYWNrID09ICJmdW5jdGlvbiIpew0KICAgICAgICAgICAgICAgY2FsbGJhY2sodGhpcyk7DQogICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZihkZWVwID09PSB0cnVlKXsNCiAgICAgICAgICAgIHRoaXMuZXhwYW5kQ2hpbGROb2Rlcyh0cnVlKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICBpc0hpZGRlblJvb3QgOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gdGhpcy5pc1Jvb3QgJiYgIXRoaXMuZ2V0T3duZXJUcmVlKCkucm9vdFZpc2libGU7DQogICAgfSwNCg0KICAgIA0KICAgIGNvbGxhcHNlIDogZnVuY3Rpb24oZGVlcCwgYW5pbSl7DQogICAgICAgIGlmKHRoaXMuZXhwYW5kZWQgJiYgIXRoaXMuaXNIaWRkZW5Sb290KCkpew0KICAgICAgICAgICAgaWYodGhpcy5maXJlRXZlbnQoImJlZm9yZWNvbGxhcHNlIiwgdGhpcywgZGVlcCwgYW5pbSkgPT09IGZhbHNlKXsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLmV4cGFuZGVkID0gZmFsc2U7DQogICAgICAgICAgICBpZigodGhpcy5nZXRPd25lclRyZWUoKS5hbmltYXRlICYmIGFuaW0gIT09IGZhbHNlKSB8fCBhbmltKXsNCiAgICAgICAgICAgICAgICB0aGlzLnVpLmFuaW1Db2xsYXBzZShmdW5jdGlvbigpew0KICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgiY29sbGFwc2UiLCB0aGlzKTsNCiAgICAgICAgICAgICAgICAgICAgaWYoZGVlcCA9PT0gdHJ1ZSl7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbGxhcHNlQ2hpbGROb2Rlcyh0cnVlKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0uY3JlYXRlRGVsZWdhdGUodGhpcykpOw0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgIHRoaXMudWkuY29sbGFwc2UoKTsNCiAgICAgICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgiY29sbGFwc2UiLCB0aGlzKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZihkZWVwID09PSB0cnVlKXsNCiAgICAgICAgICAgIHZhciBjcyA9IHRoaXMuY2hpbGROb2RlczsNCiAgICAgICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IGNzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7DQogICAgICAgICAgICAJY3NbaV0uY29sbGFwc2UodHJ1ZSwgZmFsc2UpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSwNCg0KICAgIAogICAgZGVsYXllZEV4cGFuZCA6IGZ1bmN0aW9uKGRlbGF5KXsNCiAgICAgICAgaWYoIXRoaXMuZXhwYW5kUHJvY0lkKXsNCiAgICAgICAgICAgIHRoaXMuZXhwYW5kUHJvY0lkID0gdGhpcy5leHBhbmQuZGVmZXIoZGVsYXksIHRoaXMpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIAogICAgY2FuY2VsRXhwYW5kIDogZnVuY3Rpb24oKXsNCiAgICAgICAgaWYodGhpcy5leHBhbmRQcm9jSWQpew0KICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZXhwYW5kUHJvY0lkKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmV4cGFuZFByb2NJZCA9IGZhbHNlOw0KICAgIH0sDQoNCiAgICANCiAgICB0b2dnbGUgOiBmdW5jdGlvbigpew0KICAgICAgICBpZih0aGlzLmV4cGFuZGVkKXsNCiAgICAgICAgICAgIHRoaXMuY29sbGFwc2UoKTsNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICB0aGlzLmV4cGFuZCgpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIGVuc3VyZVZpc2libGUgOiBmdW5jdGlvbihjYWxsYmFjayl7DQogICAgICAgIHZhciB0cmVlID0gdGhpcy5nZXRPd25lclRyZWUoKTsNCiAgICAgICAgdHJlZS5leHBhbmRQYXRoKHRoaXMucGFyZW50Tm9kZS5nZXRQYXRoKCksIGZhbHNlLCBmdW5jdGlvbigpew0KICAgICAgICAgICAgdHJlZS5nZXRUcmVlRWwoKS5zY3JvbGxDaGlsZEludG9WaWV3KHRoaXMudWkuYW5jaG9yKTsNCiAgICAgICAgICAgIEV4dC5jYWxsYmFjayhjYWxsYmFjayk7DQogICAgICAgIH0uY3JlYXRlRGVsZWdhdGUodGhpcykpOw0KICAgIH0sDQoNCiAgICANCiAgICBleHBhbmRDaGlsZE5vZGVzIDogZnVuY3Rpb24oZGVlcCl7DQogICAgICAgIHZhciBjcyA9IHRoaXMuY2hpbGROb2RlczsNCiAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gY3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsNCiAgICAgICAgCWNzW2ldLmV4cGFuZChkZWVwKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICANCiAgICBjb2xsYXBzZUNoaWxkTm9kZXMgOiBmdW5jdGlvbihkZWVwKXsNCiAgICAgICAgdmFyIGNzID0gdGhpcy5jaGlsZE5vZGVzOw0KICAgICAgICBmb3IodmFyIGkgPSAwLCBsZW4gPSBjcy5sZW5ndGg7IGkgPCBsZW47IGkrKykgew0KICAgICAgICAJY3NbaV0uY29sbGFwc2UoZGVlcCk7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgDQogICAgZGlzYWJsZSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHRoaXMuZGlzYWJsZWQgPSB0cnVlOw0KICAgICAgICB0aGlzLnVuc2VsZWN0KCk7DQogICAgICAgIGlmKHRoaXMucmVuZGVyZWQgJiYgdGhpcy51aS5vbkRpc2FibGVDaGFuZ2UpeyAKICAgICAgICAgICAgdGhpcy51aS5vbkRpc2FibGVDaGFuZ2UodGhpcywgdHJ1ZSk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5maXJlRXZlbnQoImRpc2FibGVkY2hhbmdlIiwgdGhpcywgdHJ1ZSk7DQogICAgfSwNCg0KICAgIA0KICAgIGVuYWJsZSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHRoaXMuZGlzYWJsZWQgPSBmYWxzZTsNCiAgICAgICAgaWYodGhpcy5yZW5kZXJlZCAmJiB0aGlzLnVpLm9uRGlzYWJsZUNoYW5nZSl7IAogICAgICAgICAgICB0aGlzLnVpLm9uRGlzYWJsZUNoYW5nZSh0aGlzLCBmYWxzZSk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5maXJlRXZlbnQoImRpc2FibGVkY2hhbmdlIiwgdGhpcywgZmFsc2UpOw0KICAgIH0sDQoNCiAgICAKICAgIHJlbmRlckNoaWxkcmVuIDogZnVuY3Rpb24oc3VwcHJlc3NFdmVudCl7DQogICAgICAgIGlmKHN1cHByZXNzRXZlbnQgIT09IGZhbHNlKXsNCiAgICAgICAgICAgIHRoaXMuZmlyZUV2ZW50KCJiZWZvcmVjaGlsZHJlbnJlbmRlcmVkIiwgdGhpcyk7DQogICAgICAgIH0NCiAgICAgICAgdmFyIGNzID0gdGhpcy5jaGlsZE5vZGVzOw0KICAgICAgICBmb3IodmFyIGkgPSAwLCBsZW4gPSBjcy5sZW5ndGg7IGkgPCBsZW47IGkrKyl7DQogICAgICAgICAgICBjc1tpXS5yZW5kZXIodHJ1ZSk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5jaGlsZHJlblJlbmRlcmVkID0gdHJ1ZTsNCiAgICB9LA0KDQogICAgCiAgICBzb3J0IDogZnVuY3Rpb24oZm4sIHNjb3BlKXsNCiAgICAgICAgRXh0LnRyZWUuVHJlZU5vZGUuc3VwZXJjbGFzcy5zb3J0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7DQogICAgICAgIGlmKHRoaXMuY2hpbGRyZW5SZW5kZXJlZCl7DQogICAgICAgICAgICB2YXIgY3MgPSB0aGlzLmNoaWxkTm9kZXM7DQogICAgICAgICAgICBmb3IodmFyIGkgPSAwLCBsZW4gPSBjcy5sZW5ndGg7IGkgPCBsZW47IGkrKyl7DQogICAgICAgICAgICAgICAgY3NbaV0ucmVuZGVyKHRydWUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSwNCg0KICAgIAogICAgcmVuZGVyIDogZnVuY3Rpb24oYnVsa1JlbmRlcil7DQogICAgICAgIHRoaXMudWkucmVuZGVyKGJ1bGtSZW5kZXIpOw0KICAgICAgICBpZighdGhpcy5yZW5kZXJlZCl7DQogICAgICAgICAgICB0aGlzLnJlbmRlcmVkID0gdHJ1ZTsNCiAgICAgICAgICAgIGlmKHRoaXMuZXhwYW5kZWQpew0KICAgICAgICAgICAgICAgIHRoaXMuZXhwYW5kZWQgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICB0aGlzLmV4cGFuZChmYWxzZSwgZmFsc2UpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSwNCg0KICAgIAogICAgcmVuZGVySW5kZW50IDogZnVuY3Rpb24oZGVlcCwgcmVmcmVzaCl7DQogICAgICAgIGlmKHJlZnJlc2gpew0KICAgICAgICAgICAgdGhpcy51aS5jaGlsZEluZGVudCA9IG51bGw7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy51aS5yZW5kZXJJbmRlbnQoKTsNCiAgICAgICAgaWYoZGVlcCA9PT0gdHJ1ZSAmJiB0aGlzLmNoaWxkcmVuUmVuZGVyZWQpew0KICAgICAgICAgICAgdmFyIGNzID0gdGhpcy5jaGlsZE5vZGVzOw0KICAgICAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gY3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspew0KICAgICAgICAgICAgICAgIGNzW2ldLnJlbmRlckluZGVudCh0cnVlLCByZWZyZXNoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0pOwoNCiBFeHQudHJlZS5Bc3luY1RyZWVOb2RlID0gZnVuY3Rpb24oY29uZmlnKXsNCiAgICB0aGlzLmxvYWRlZCA9IGZhbHNlOw0KICAgIHRoaXMubG9hZGluZyA9IGZhbHNlOw0KICAgIEV4dC50cmVlLkFzeW5jVHJlZU5vZGUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOw0KICAgIA0KICAgIHRoaXMuYWRkRXZlbnRzKHsnYmVmb3JlbG9hZCc6dHJ1ZSwgJ2xvYWQnOiB0cnVlfSk7DQogICAgDQogICAgDQp9Ow0KRXh0LmV4dGVuZChFeHQudHJlZS5Bc3luY1RyZWVOb2RlLCBFeHQudHJlZS5UcmVlTm9kZSwgew0KICAgIGV4cGFuZCA6IGZ1bmN0aW9uKGRlZXAsIGFuaW0sIGNhbGxiYWNrKXsNCiAgICAgICAgaWYodGhpcy5sb2FkaW5nKXsgCiAgICAgICAgICAgIHZhciB0aW1lcjsNCiAgICAgICAgICAgIHZhciBmID0gZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICAgICBpZighdGhpcy5sb2FkaW5nKXsgCiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwYW5kKGRlZXAsIGFuaW0sIGNhbGxiYWNrKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9LmNyZWF0ZURlbGVnYXRlKHRoaXMpOw0KICAgICAgICAgICAgdGltZXIgPSBzZXRJbnRlcnZhbChmLCAyMDApOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQogICAgICAgIGlmKCF0aGlzLmxvYWRlZCl7DQogICAgICAgICAgICBpZih0aGlzLmZpcmVFdmVudCgiYmVmb3JlbG9hZCIsIHRoaXMpID09PSBmYWxzZSl7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTsNCiAgICAgICAgICAgIHRoaXMudWkuYmVmb3JlTG9hZCh0aGlzKTsNCiAgICAgICAgICAgIHZhciBsb2FkZXIgPSB0aGlzLmxvYWRlciB8fCB0aGlzLmF0dHJpYnV0ZXMubG9hZGVyIHx8IHRoaXMuZ2V0T3duZXJUcmVlKCkuZ2V0TG9hZGVyKCk7DQogICAgICAgICAgICBpZihsb2FkZXIpew0KICAgICAgICAgICAgICAgIGxvYWRlci5sb2FkKHRoaXMsIHRoaXMubG9hZENvbXBsZXRlLmNyZWF0ZURlbGVnYXRlKHRoaXMsIFtkZWVwLCBhbmltLCBjYWxsYmFja10pKTsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgRXh0LnRyZWUuQXN5bmNUcmVlTm9kZS5zdXBlcmNsYXNzLmV4cGFuZC5jYWxsKHRoaXMsIGRlZXAsIGFuaW0sIGNhbGxiYWNrKTsNCiAgICB9LA0KICAgIA0KICAgIA0KICAgIGlzTG9hZGluZyA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLmxvYWRpbmc7ICANCiAgICB9LA0KICAgIA0KICAgIGxvYWRDb21wbGV0ZSA6IGZ1bmN0aW9uKGRlZXAsIGFuaW0sIGNhbGxiYWNrKXsNCiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7DQogICAgICAgIHRoaXMubG9hZGVkID0gdHJ1ZTsNCiAgICAgICAgdGhpcy51aS5hZnRlckxvYWQodGhpcyk7DQogICAgICAgIHRoaXMuZmlyZUV2ZW50KCJsb2FkIiwgdGhpcyk7DQogICAgICAgIHRoaXMuZXhwYW5kKGRlZXAsIGFuaW0sIGNhbGxiYWNrKTsNCiAgICB9LA0KICAgIA0KICAgIA0KICAgIGlzTG9hZGVkIDogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGVkOw0KICAgIH0sDQogICAgDQogICAgaGFzQ2hpbGROb2RlcyA6IGZ1bmN0aW9uKCl7DQogICAgICAgIGlmKCF0aGlzLmlzTGVhZigpICYmICF0aGlzLmxvYWRlZCl7DQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICByZXR1cm4gRXh0LnRyZWUuQXN5bmNUcmVlTm9kZS5zdXBlcmNsYXNzLmhhc0NoaWxkTm9kZXMuY2FsbCh0aGlzKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICANCiAgICByZWxvYWQgOiBmdW5jdGlvbihjYWxsYmFjayl7DQogICAgICAgIHRoaXMuY29sbGFwc2UoZmFsc2UsIGZhbHNlKTsNCiAgICAgICAgd2hpbGUodGhpcy5maXJzdENoaWxkKXsNCiAgICAgICAgICAgIHRoaXMucmVtb3ZlQ2hpbGQodGhpcy5maXJzdENoaWxkKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmNoaWxkcmVuUmVuZGVyZWQgPSBmYWxzZTsNCiAgICAgICAgdGhpcy5sb2FkZWQgPSBmYWxzZTsNCiAgICAgICAgaWYodGhpcy5pc0hpZGRlblJvb3QoKSl7DQogICAgICAgICAgICB0aGlzLmV4cGFuZGVkID0gZmFsc2U7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5leHBhbmQoZmFsc2UsIGZhbHNlLCBjYWxsYmFjayk7DQogICAgfQ0KfSk7Cg0KRXh0LnRyZWUuVHJlZU5vZGVVSSA9IGZ1bmN0aW9uKG5vZGUpew0KICAgIHRoaXMubm9kZSA9IG5vZGU7DQogICAgdGhpcy5yZW5kZXJlZCA9IGZhbHNlOw0KICAgIHRoaXMuYW5pbWF0aW5nID0gZmFsc2U7DQogICAgdGhpcy5lbXB0eUljb24gPSBFeHQuQkxBTktfSU1BR0VfVVJMOw0KfTsNCg0KRXh0LnRyZWUuVHJlZU5vZGVVSS5wcm90b3R5cGUgPSB7DQogICAgcmVtb3ZlQ2hpbGQgOiBmdW5jdGlvbihub2RlKXsNCiAgICAgICAgaWYodGhpcy5yZW5kZXJlZCl7DQogICAgICAgICAgICB0aGlzLmN0Tm9kZS5yZW1vdmVDaGlsZChub2RlLnVpLmdldEVsKCkpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIGJlZm9yZUxvYWQgOiBmdW5jdGlvbigpew0KICAgICAgICAgdGhpcy5hZGRDbGFzcygieC10cmVlLW5vZGUtbG9hZGluZyIpOw0KICAgIH0sDQoNCiAgICBhZnRlckxvYWQgOiBmdW5jdGlvbigpew0KICAgICAgICAgdGhpcy5yZW1vdmVDbGFzcygieC10cmVlLW5vZGUtbG9hZGluZyIpOw0KICAgIH0sDQoNCiAgICBvblRleHRDaGFuZ2UgOiBmdW5jdGlvbihub2RlLCB0ZXh0LCBvbGRUZXh0KXsNCiAgICAgICAgaWYodGhpcy5yZW5kZXJlZCl7DQogICAgICAgICAgICB0aGlzLnRleHROb2RlLmlubmVySFRNTCA9IHRleHQ7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgb25EaXNhYmxlQ2hhbmdlIDogZnVuY3Rpb24obm9kZSwgc3RhdGUpew0KICAgICAgICB0aGlzLmRpc2FibGVkID0gc3RhdGU7DQogICAgICAgIGlmKHN0YXRlKXsNCiAgICAgICAgICAgIHRoaXMuYWRkQ2xhc3MoIngtdHJlZS1ub2RlLWRpc2FibGVkIik7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgdGhpcy5yZW1vdmVDbGFzcygieC10cmVlLW5vZGUtZGlzYWJsZWQiKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICBvblNlbGVjdGVkQ2hhbmdlIDogZnVuY3Rpb24oc3RhdGUpew0KICAgICAgICBpZihzdGF0ZSl7DQogICAgICAgICAgICB0aGlzLmZvY3VzKCk7DQogICAgICAgICAgICB0aGlzLmFkZENsYXNzKCJ4LXRyZWUtc2VsZWN0ZWQiKTsNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAKICAgICAgICAgICAgdGhpcy5yZW1vdmVDbGFzcygieC10cmVlLXNlbGVjdGVkIik7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgb25Nb3ZlIDogZnVuY3Rpb24odHJlZSwgbm9kZSwgb2xkUGFyZW50LCBuZXdQYXJlbnQsIGluZGV4LCByZWZOb2RlKXsNCiAgICAgICAgdGhpcy5jaGlsZEluZGVudCA9IG51bGw7DQogICAgICAgIGlmKHRoaXMucmVuZGVyZWQpew0KICAgICAgICAgICAgdmFyIHRhcmdldE5vZGUgPSBuZXdQYXJlbnQudWkuZ2V0Q29udGFpbmVyKCk7DQogICAgICAgICAgICBpZighdGFyZ2V0Tm9kZSl7CiAgICAgICAgICAgICAgICB0aGlzLmhvbGRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KICAgICAgICAgICAgICAgIHRoaXMuaG9sZGVyLmFwcGVuZENoaWxkKHRoaXMud3JhcCk7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIGluc2VydEJlZm9yZSA9IHJlZk5vZGUgPyByZWZOb2RlLnVpLmdldEVsKCkgOiBudWxsOw0KICAgICAgICAgICAgaWYoaW5zZXJ0QmVmb3JlKXsNCiAgICAgICAgICAgICAgICB0YXJnZXROb2RlLmluc2VydEJlZm9yZSh0aGlzLndyYXAsIGluc2VydEJlZm9yZSk7DQogICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICB0YXJnZXROb2RlLmFwcGVuZENoaWxkKHRoaXMud3JhcCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLm5vZGUucmVuZGVySW5kZW50KHRydWUpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIGFkZENsYXNzIDogZnVuY3Rpb24oY2xzKXsNCiAgICAgICAgaWYodGhpcy5lbE5vZGUpew0KICAgICAgICAgICAgRXh0LmZseSh0aGlzLmVsTm9kZSkuYWRkQ2xhc3MoY2xzKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICByZW1vdmVDbGFzcyA6IGZ1bmN0aW9uKGNscyl7DQogICAgICAgIGlmKHRoaXMuZWxOb2RlKXsNCiAgICAgICAgICAgIEV4dC5mbHkodGhpcy5lbE5vZGUpLnJlbW92ZUNsYXNzKGNscyk7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgcmVtb3ZlIDogZnVuY3Rpb24oKXsNCiAgICAgICAgaWYodGhpcy5yZW5kZXJlZCl7DQogICAgICAgICAgICB0aGlzLmhvbGRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KICAgICAgICAgICAgdGhpcy5ob2xkZXIuYXBwZW5kQ2hpbGQodGhpcy53cmFwKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICBmaXJlRXZlbnQgOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gdGhpcy5ub2RlLmZpcmVFdmVudC5hcHBseSh0aGlzLm5vZGUsIGFyZ3VtZW50cyk7DQogICAgfSwNCg0KICAgIGluaXRFdmVudHMgOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLm5vZGUub24oIm1vdmUiLCB0aGlzLm9uTW92ZSwgdGhpcyk7DQogICAgICAgIHZhciBFID0gRXh0LkV2ZW50TWFuYWdlcjsNCiAgICAgICAgdmFyIGEgPSB0aGlzLmFuY2hvcjsNCg0KICAgICAgICB2YXIgZWwgPSBFeHQuZmx5KGEsICdfdHJlZXVpJyk7DQoNCiAgICAgICAgaWYoRXh0LmlzT3BlcmEpeyAKICAgICAgICAgICAgZWwuc2V0U3R5bGUoInRleHQtZGVjb3JhdGlvbiIsICJub25lIik7DQogICAgICAgIH0NCg0KICAgICAgICBlbC5vbigiY2xpY2siLCB0aGlzLm9uQ2xpY2ssIHRoaXMpOw0KICAgICAgICBlbC5vbigiZGJsY2xpY2siLCB0aGlzLm9uRGJsQ2xpY2ssIHRoaXMpOw0KDQogICAgICAgIGlmKHRoaXMuY2hlY2tib3gpew0KICAgICAgICAgICAgRXh0LkV2ZW50TWFuYWdlci5vbih0aGlzLmNoZWNrYm94LA0KICAgICAgICAgICAgICAgICAgICBFeHQuaXNJRSA/ICdjbGljaycgOiAnY2hhbmdlJywgdGhpcy5vbkNoZWNrQ2hhbmdlLCB0aGlzKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGVsLm9uKCJjb250ZXh0bWVudSIsIHRoaXMub25Db250ZXh0TWVudSwgdGhpcyk7DQoNCiAgICAgICAgdmFyIGljb24gPSBFeHQuZmx5KHRoaXMuaWNvbk5vZGUpOw0KICAgICAgICBpY29uLm9uKCJjbGljayIsIHRoaXMub25DbGljaywgdGhpcyk7DQogICAgICAgIGljb24ub24oImRibGNsaWNrIiwgdGhpcy5vbkRibENsaWNrLCB0aGlzKTsNCiAgICAgICAgaWNvbi5vbigiY29udGV4dG1lbnUiLCB0aGlzLm9uQ29udGV4dE1lbnUsIHRoaXMpOw0KICAgICAgICBFLm9uKHRoaXMuZWNOb2RlLCAiY2xpY2siLCB0aGlzLmVjQ2xpY2ssIHRoaXMsIHRydWUpOw0KDQogICAgICAgIGlmKHRoaXMubm9kZS5kaXNhYmxlZCl7DQogICAgICAgICAgICB0aGlzLmFkZENsYXNzKCJ4LXRyZWUtbm9kZS1kaXNhYmxlZCIpOw0KICAgICAgICB9DQogICAgICAgIGlmKHRoaXMubm9kZS5oaWRkZW4pew0KICAgICAgICAgICAgdGhpcy5hZGRDbGFzcygieC10cmVlLW5vZGUtZGlzYWJsZWQiKTsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgb3QgPSB0aGlzLm5vZGUuZ2V0T3duZXJUcmVlKCk7DQogICAgICAgIHZhciBkZCA9IG90LmVuYWJsZUREIHx8IG90LmVuYWJsZURyYWcgfHwgb3QuZW5hYmxlRHJvcDsNCiAgICAgICAgaWYoZGQgJiYgKCF0aGlzLm5vZGUuaXNSb290IHx8IG90LnJvb3RWaXNpYmxlKSl7DQogICAgICAgICAgICBFeHQuZGQuUmVnaXN0cnkucmVnaXN0ZXIodGhpcy5lbE5vZGUsIHsNCiAgICAgICAgICAgICAgICBub2RlOiB0aGlzLm5vZGUsDQogICAgICAgICAgICAgICAgaGFuZGxlczogdGhpcy5nZXREREhhbmRsZXMoKSwNCiAgICAgICAgICAgICAgICBpc0hhbmRsZTogZmFsc2UNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIGdldERESGFuZGxlcyA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiBbdGhpcy5pY29uTm9kZSwgdGhpcy50ZXh0Tm9kZV07DQogICAgfSwNCg0KICAgIGhpZGUgOiBmdW5jdGlvbigpew0KICAgICAgICBpZih0aGlzLnJlbmRlcmVkKXsNCiAgICAgICAgICAgIHRoaXMud3JhcC5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIHNob3cgOiBmdW5jdGlvbigpew0KICAgICAgICBpZih0aGlzLnJlbmRlcmVkKXsNCiAgICAgICAgICAgIHRoaXMud3JhcC5zdHlsZS5kaXNwbGF5ID0gIiI7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgb25Db250ZXh0TWVudSA6IGZ1bmN0aW9uKGUpew0KICAgICAgICBpZiAodGhpcy5ub2RlLmhhc0xpc3RlbmVyKCJjb250ZXh0bWVudSIpIHx8IHRoaXMubm9kZS5nZXRPd25lclRyZWUoKS5oYXNMaXN0ZW5lcigiY29udGV4dG1lbnUiKSkgew0KICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOw0KICAgICAgICAgICAgdGhpcy5mb2N1cygpOw0KICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoImNvbnRleHRtZW51IiwgdGhpcy5ub2RlLCBlKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICBvbkNsaWNrIDogZnVuY3Rpb24oZSl7DQogICAgICAgIGlmKHRoaXMuZHJvcHBpbmcpew0KICAgICAgICAgICAgZS5zdG9wRXZlbnQoKTsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KICAgICAgICBpZih0aGlzLmZpcmVFdmVudCgiYmVmb3JlY2xpY2siLCB0aGlzLm5vZGUsIGUpICE9PSBmYWxzZSl7DQogICAgICAgICAgICBpZighdGhpcy5kaXNhYmxlZCAmJiB0aGlzLm5vZGUuYXR0cmlidXRlcy5ocmVmKXsNCiAgICAgICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgiY2xpY2siLCB0aGlzLm5vZGUsIGUpOw0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsNCiAgICAgICAgICAgIGlmKHRoaXMuZGlzYWJsZWQpew0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYodGhpcy5ub2RlLmF0dHJpYnV0ZXMuc2luZ2xlQ2xpY2tFeHBhbmQgJiYgIXRoaXMuYW5pbWF0aW5nICYmIHRoaXMubm9kZS5oYXNDaGlsZE5vZGVzKCkpew0KICAgICAgICAgICAgICAgIHRoaXMubm9kZS50b2dnbGUoKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoImNsaWNrIiwgdGhpcy5ub2RlLCBlKTsNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICBlLnN0b3BFdmVudCgpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIG9uRGJsQ2xpY2sgOiBmdW5jdGlvbihlKXsNCiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOw0KICAgICAgICBpZih0aGlzLmRpc2FibGVkKXsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KICAgICAgICBpZih0aGlzLmNoZWNrYm94KXsNCiAgICAgICAgICAgIHRoaXMudG9nZ2xlQ2hlY2soKTsNCiAgICAgICAgfQ0KICAgICAgICBpZighdGhpcy5hbmltYXRpbmcgJiYgdGhpcy5ub2RlLmhhc0NoaWxkTm9kZXMoKSl7DQogICAgICAgICAgICB0aGlzLm5vZGUudG9nZ2xlKCk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5maXJlRXZlbnQoImRibGNsaWNrIiwgdGhpcy5ub2RlLCBlKTsNCiAgICB9LA0KDQogICAgb25DaGVja0NoYW5nZSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHZhciBjaGVja2VkID0gdGhpcy5jaGVja2JveC5jaGVja2VkOw0KICAgICAgICB0aGlzLm5vZGUuYXR0cmlidXRlcy5jaGVja2VkID0gY2hlY2tlZDsNCiAgICAgICAgdGhpcy5maXJlRXZlbnQoJ2NoZWNrY2hhbmdlJywgdGhpcy5ub2RlLCBjaGVja2VkKTsNCiAgICB9LA0KDQogICAgZWNDbGljayA6IGZ1bmN0aW9uKGUpew0KICAgICAgICBpZighdGhpcy5hbmltYXRpbmcgJiYgdGhpcy5ub2RlLmhhc0NoaWxkTm9kZXMoKSl7DQogICAgICAgICAgICB0aGlzLm5vZGUudG9nZ2xlKCk7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgc3RhcnREcm9wIDogZnVuY3Rpb24oKXsNCiAgICAgICAgdGhpcy5kcm9wcGluZyA9IHRydWU7DQogICAgfSwNCg0KICAgIAogICAgZW5kRHJvcCA6IGZ1bmN0aW9uKCl7DQogICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpew0KICAgICAgICAgICB0aGlzLmRyb3BwaW5nID0gZmFsc2U7DQogICAgICAgfS5jcmVhdGVEZWxlZ2F0ZSh0aGlzKSwgNTApOw0KICAgIH0sDQoNCiAgICBleHBhbmQgOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLnVwZGF0ZUV4cGFuZEljb24oKTsNCiAgICAgICAgdGhpcy5jdE5vZGUuc3R5bGUuZGlzcGxheSA9ICIiOw0KICAgIH0sDQoNCiAgICBmb2N1cyA6IGZ1bmN0aW9uKCl7DQogICAgICAgIGlmKCF0aGlzLm5vZGUucHJldmVudEhTY3JvbGwpew0KICAgICAgICAgICAgdHJ5e3RoaXMuYW5jaG9yLmZvY3VzKCk7DQogICAgICAgICAgICB9Y2F0Y2goZSl7fQ0KICAgICAgICB9ZWxzZSBpZighRXh0LmlzSUUpew0KICAgICAgICAgICAgdHJ5ew0KICAgICAgICAgICAgICAgIHZhciBub3Njcm9sbCA9IHRoaXMubm9kZS5nZXRPd25lclRyZWUoKS5nZXRUcmVlRWwoKS5kb207DQogICAgICAgICAgICAgICAgdmFyIGwgPSBub3Njcm9sbC5zY3JvbGxMZWZ0Ow0KICAgICAgICAgICAgICAgIHRoaXMuYW5jaG9yLmZvY3VzKCk7DQogICAgICAgICAgICAgICAgbm9zY3JvbGwuc2Nyb2xsTGVmdCA9IGw7DQogICAgICAgICAgICB9Y2F0Y2goZSl7fQ0KICAgICAgICB9DQogICAgfSwNCg0KICAgIHRvZ2dsZUNoZWNrIDogZnVuY3Rpb24odmFsdWUpew0KICAgICAgICB2YXIgY2IgPSB0aGlzLmNoZWNrYm94Ow0KICAgICAgICBpZihjYil7DQogICAgICAgICAgICBjYi5jaGVja2VkID0gKHZhbHVlID09PSB1bmRlZmluZWQgPyAhY2IuY2hlY2tlZCA6IHZhbHVlKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICBibHVyIDogZnVuY3Rpb24oKXsNCiAgICAgICAgdHJ5ew0KICAgICAgICAgICAgdGhpcy5hbmNob3IuYmx1cigpOw0KICAgICAgICB9Y2F0Y2goZSl7fQ0KICAgIH0sDQoNCiAgICBhbmltRXhwYW5kIDogZnVuY3Rpb24oY2FsbGJhY2spew0KICAgICAgICB2YXIgY3QgPSBFeHQuZ2V0KHRoaXMuY3ROb2RlKTsNCiAgICAgICAgY3Quc3RvcEZ4KCk7DQogICAgICAgIGlmKCF0aGlzLm5vZGUuaGFzQ2hpbGROb2RlcygpKXsNCiAgICAgICAgICAgIHRoaXMudXBkYXRlRXhwYW5kSWNvbigpOw0KICAgICAgICAgICAgdGhpcy5jdE5vZGUuc3R5bGUuZGlzcGxheSA9ICIiOw0KICAgICAgICAgICAgRXh0LmNhbGxiYWNrKGNhbGxiYWNrKTsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmFuaW1hdGluZyA9IHRydWU7DQogICAgICAgIHRoaXMudXBkYXRlRXhwYW5kSWNvbigpOw0KDQogICAgICAgIGN0LnNsaWRlSW4oJ3QnLCB7DQogICAgICAgICAgIGNhbGxiYWNrIDogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICAgIHRoaXMuYW5pbWF0aW5nID0gZmFsc2U7DQogICAgICAgICAgICAgICBFeHQuY2FsbGJhY2soY2FsbGJhY2spOw0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHNjb3BlOiB0aGlzLA0KICAgICAgICAgICAgZHVyYXRpb246IHRoaXMubm9kZS5vd25lclRyZWUuZHVyYXRpb24gfHwgLjI1DQogICAgICAgIH0pOw0KICAgIH0sDQoNCiAgICBoaWdobGlnaHQgOiBmdW5jdGlvbigpew0KICAgICAgICB2YXIgdHJlZSA9IHRoaXMubm9kZS5nZXRPd25lclRyZWUoKTsNCiAgICAgICAgRXh0LmZseSh0aGlzLndyYXApLmhpZ2hsaWdodCgNCiAgICAgICAgICAgIHRyZWUuaGxDb2xvciB8fCAiQzNEQUY5IiwNCiAgICAgICAgICAgIHtlbmRDb2xvcjogdHJlZS5obEJhc2VDb2xvcn0NCiAgICAgICAgKTsNCiAgICB9LA0KDQogICAgY29sbGFwc2UgOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLnVwZGF0ZUV4cGFuZEljb24oKTsNCiAgICAgICAgdGhpcy5jdE5vZGUuc3R5bGUuZGlzcGxheSA9ICJub25lIjsNCiAgICB9LA0KDQogICAgYW5pbUNvbGxhcHNlIDogZnVuY3Rpb24oY2FsbGJhY2spew0KICAgICAgICB2YXIgY3QgPSBFeHQuZ2V0KHRoaXMuY3ROb2RlKTsNCiAgICAgICAgY3QuZW5hYmxlRGlzcGxheU1vZGUoJ2Jsb2NrJyk7DQogICAgICAgIGN0LnN0b3BGeCgpOw0KDQogICAgICAgIHRoaXMuYW5pbWF0aW5nID0gdHJ1ZTsNCiAgICAgICAgdGhpcy51cGRhdGVFeHBhbmRJY29uKCk7DQoNCiAgICAgICAgY3Quc2xpZGVPdXQoJ3QnLCB7DQogICAgICAgICAgICBjYWxsYmFjayA6IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICB0aGlzLmFuaW1hdGluZyA9IGZhbHNlOw0KICAgICAgICAgICAgICAgRXh0LmNhbGxiYWNrKGNhbGxiYWNrKTsNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBzY29wZTogdGhpcywNCiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLm5vZGUub3duZXJUcmVlLmR1cmF0aW9uIHx8IC4yNQ0KICAgICAgICB9KTsNCiAgICB9LA0KDQogICAgZ2V0Q29udGFpbmVyIDogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIHRoaXMuY3ROb2RlOw0KICAgIH0sDQoNCiAgICBnZXRFbCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLndyYXA7DQogICAgfSwNCg0KICAgIGFwcGVuZERER2hvc3QgOiBmdW5jdGlvbihnaG9zdE5vZGUpew0KICAgICAgICBnaG9zdE5vZGUuYXBwZW5kQ2hpbGQodGhpcy5lbE5vZGUuY2xvbmVOb2RlKHRydWUpKTsNCiAgICB9LA0KDQogICAgZ2V0RERSZXBhaXJYWSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiBFeHQubGliLkRvbS5nZXRYWSh0aGlzLmljb25Ob2RlKTsNCiAgICB9LA0KDQogICAgb25SZW5kZXIgOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLnJlbmRlcigpOw0KICAgIH0sDQoNCiAgICByZW5kZXIgOiBmdW5jdGlvbihidWxrUmVuZGVyKXsNCiAgICAgICAgdmFyIG4gPSB0aGlzLm5vZGUsIGEgPSBuLmF0dHJpYnV0ZXM7DQogICAgICAgIHZhciB0YXJnZXROb2RlID0gbi5wYXJlbnROb2RlID8NCiAgICAgICAgICAgICAgbi5wYXJlbnROb2RlLnVpLmdldENvbnRhaW5lcigpIDogbi5vd25lclRyZWUuaW5uZXJDdC5kb207DQoNCiAgICAgICAgaWYoIXRoaXMucmVuZGVyZWQpew0KICAgICAgICAgICAgdGhpcy5yZW5kZXJlZCA9IHRydWU7DQoNCiAgICAgICAgICAgIHRoaXMucmVuZGVyRWxlbWVudHMobiwgYSwgdGFyZ2V0Tm9kZSwgYnVsa1JlbmRlcik7DQoNCiAgICAgICAgICAgIGlmKGEucXRpcCl7DQogICAgICAgICAgICAgICBpZih0aGlzLnRleHROb2RlLnNldEF0dHJpYnV0ZU5TKXsNCiAgICAgICAgICAgICAgICAgICB0aGlzLnRleHROb2RlLnNldEF0dHJpYnV0ZU5TKCJleHQiLCAicXRpcCIsIGEucXRpcCk7DQogICAgICAgICAgICAgICAgICAgaWYoYS5xdGlwVGl0bGUpew0KICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHROb2RlLnNldEF0dHJpYnV0ZU5TKCJleHQiLCAicXRpdGxlIiwgYS5xdGlwVGl0bGUpOw0KICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dE5vZGUuc2V0QXR0cmlidXRlKCJleHQ6cXRpcCIsIGEucXRpcCk7DQogICAgICAgICAgICAgICAgICAgaWYoYS5xdGlwVGl0bGUpew0KICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHROb2RlLnNldEF0dHJpYnV0ZSgiZXh0OnF0aXRsZSIsIGEucXRpcFRpdGxlKTsNCiAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9ZWxzZSBpZihhLnF0aXBDZmcpew0KICAgICAgICAgICAgICAgIGEucXRpcENmZy50YXJnZXQgPSBFeHQuaWQodGhpcy50ZXh0Tm9kZSk7DQogICAgICAgICAgICAgICAgRXh0LlF1aWNrVGlwcy5yZWdpc3RlcihhLnF0aXBDZmcpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5pbml0RXZlbnRzKCk7DQogICAgICAgICAgICBpZighdGhpcy5ub2RlLmV4cGFuZGVkKXsNCiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUV4cGFuZEljb24oKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICBpZihidWxrUmVuZGVyID09PSB0cnVlKSB7DQogICAgICAgICAgICAgICAgdGFyZ2V0Tm9kZS5hcHBlbmRDaGlsZCh0aGlzLndyYXApOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSwNCg0KICAgIHJlbmRlckVsZW1lbnRzIDogZnVuY3Rpb24obiwgYSwgdGFyZ2V0Tm9kZSwgYnVsa1JlbmRlcil7DQogICAgICAgIAogICAgICAgIHRoaXMuaW5kZW50TWFya3VwID0gbi5wYXJlbnROb2RlID8gbi5wYXJlbnROb2RlLnVpLmdldENoaWxkSW5kZW50KCkgOiAnJzsNCg0KICAgICAgICB2YXIgY2IgPSB0eXBlb2YgYS5jaGVja2VkID09ICdib29sZWFuJzsNCiAgICAgICAgdmFyIGhyZWYgPSBhLmhyZWYgPyBhLmhyZWYgOiBFeHQuaXNHZWNrbyA/ICIiIDogIiMiOw0KICAgICAgICB2YXIgYnVmID0gWyc8bGkgY2xhc3M9IngtdHJlZS1ub2RlIj48ZGl2IGNsYXNzPSJ4LXRyZWUtbm9kZS1lbCAnLCBhLmNscywnIj4nLA0KICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJ4LXRyZWUtbm9kZS1pbmRlbnQiPicsdGhpcy5pbmRlbnRNYXJrdXAsIjwvc3Bhbj4iLA0KICAgICAgICAgICAgJzxpbWcgc3JjPSInLCB0aGlzLmVtcHR5SWNvbiwgJyIgY2xhc3M9IngtdHJlZS1lYy1pY29uIiAvPicsDQogICAgICAgICAgICAnPGltZyBzcmM9IicsIGEuaWNvbiB8fCB0aGlzLmVtcHR5SWNvbiwgJyIgY2xhc3M9IngtdHJlZS1ub2RlLWljb24nLChhLmljb24gPyAiIHgtdHJlZS1ub2RlLWlubGluZS1pY29uIiA6ICIiKSwoYS5pY29uQ2xzID8gIiAiK2EuaWNvbkNscyA6ICIiKSwnIiB1bnNlbGVjdGFibGU9Im9uIiAvPicsDQogICAgICAgICAgICBjYiA/ICgnPGlucHV0IGNsYXNzPSJ4LXRyZWUtbm9kZS1jYiIgdHlwZT0iY2hlY2tib3giICcgKyAoYS5jaGVja2VkID8gJ2NoZWNrZWQ9ImNoZWNrZWQiIC8+JyA6ICcgLz4nKSkgOiAnJywNCiAgICAgICAgICAgICc8YSBoaWRlZm9jdXM9Im9uIiBocmVmPSInLGhyZWYsJyIgdGFiSW5kZXg9IjEiICcsDQogICAgICAgICAgICAgYS5ocmVmVGFyZ2V0ID8gJyB0YXJnZXQ9IicrYS5ocmVmVGFyZ2V0KyciJyA6ICIiLCAnPjxzcGFuIHVuc2VsZWN0YWJsZT0ib24iPicsbi50ZXh0LCI8L3NwYW4+PC9hPjwvZGl2PiIsDQogICAgICAgICAgICAnPHVsIGNsYXNzPSJ4LXRyZWUtbm9kZS1jdCIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPjwvdWw+JywNCiAgICAgICAgICAgICI8L2xpPiJdOw0KDQogICAgICAgIGlmKGJ1bGtSZW5kZXIgIT09IHRydWUgJiYgbi5uZXh0U2libGluZyAmJiBuLm5leHRTaWJsaW5nLnVpLmdldEVsKCkpew0KICAgICAgICAgICAgdGhpcy53cmFwID0gRXh0LkRvbUhlbHBlci5pbnNlcnRIdG1sKCJiZWZvcmVCZWdpbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4ubmV4dFNpYmxpbmcudWkuZ2V0RWwoKSwgYnVmLmpvaW4oIiIpKTsNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICB0aGlzLndyYXAgPSBFeHQuRG9tSGVscGVyLmluc2VydEh0bWwoImJlZm9yZUVuZCIsIHRhcmdldE5vZGUsIGJ1Zi5qb2luKCIiKSk7DQogICAgICAgIH0NCg0KICAgICAgICB0aGlzLmVsTm9kZSA9IHRoaXMud3JhcC5jaGlsZE5vZGVzWzBdOw0KICAgICAgICB0aGlzLmN0Tm9kZSA9IHRoaXMud3JhcC5jaGlsZE5vZGVzWzFdOw0KICAgICAgICB2YXIgY3MgPSB0aGlzLmVsTm9kZS5jaGlsZE5vZGVzOw0KICAgICAgICB0aGlzLmluZGVudE5vZGUgPSBjc1swXTsNCiAgICAgICAgdGhpcy5lY05vZGUgPSBjc1sxXTsNCiAgICAgICAgdGhpcy5pY29uTm9kZSA9IGNzWzJdOw0KICAgICAgICB2YXIgaW5kZXggPSAzOw0KICAgICAgICBpZihjYil7DQogICAgICAgICAgICB0aGlzLmNoZWNrYm94ID0gY3NbM107DQogICAgICAgICAgICBpbmRleCsrOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuYW5jaG9yID0gY3NbaW5kZXhdOw0KICAgICAgICB0aGlzLnRleHROb2RlID0gY3NbaW5kZXhdLmZpcnN0Q2hpbGQ7DQogICAgfSwNCg0KICAgIGdldEFuY2hvciA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLmFuY2hvcjsNCiAgICB9LA0KDQogICAgZ2V0VGV4dEVsIDogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIHRoaXMudGV4dE5vZGU7DQogICAgfSwNCg0KICAgIGdldEljb25FbCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLmljb25Ob2RlOw0KICAgIH0sDQoNCiAgICBpc0NoZWNrZWQgOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gdGhpcy5jaGVja2JveCA/IHRoaXMuY2hlY2tib3guY2hlY2tlZCA6IGZhbHNlOw0KICAgIH0sDQoNCiAgICB1cGRhdGVFeHBhbmRJY29uIDogZnVuY3Rpb24oKXsNCiAgICAgICAgaWYodGhpcy5yZW5kZXJlZCl7DQogICAgICAgICAgICB2YXIgbiA9IHRoaXMubm9kZSwgYzEsIGMyOw0KICAgICAgICAgICAgdmFyIGNscyA9IG4uaXNMYXN0KCkgPyAieC10cmVlLWVsYm93LWVuZCIgOiAieC10cmVlLWVsYm93IjsNCiAgICAgICAgICAgIHZhciBoYXNDaGlsZCA9IG4uaGFzQ2hpbGROb2RlcygpOw0KICAgICAgICAgICAgaWYoaGFzQ2hpbGQpew0KICAgICAgICAgICAgICAgIGlmKG4uZXhwYW5kZWQpew0KICAgICAgICAgICAgICAgICAgICBjbHMgKz0gIi1taW51cyI7DQogICAgICAgICAgICAgICAgICAgIGMxID0gIngtdHJlZS1ub2RlLWNvbGxhcHNlZCI7DQogICAgICAgICAgICAgICAgICAgIGMyID0gIngtdHJlZS1ub2RlLWV4cGFuZGVkIjsNCiAgICAgICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICAgICAgY2xzICs9ICItcGx1cyI7DQogICAgICAgICAgICAgICAgICAgIGMxID0gIngtdHJlZS1ub2RlLWV4cGFuZGVkIjsNCiAgICAgICAgICAgICAgICAgICAgYzIgPSAieC10cmVlLW5vZGUtY29sbGFwc2VkIjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYodGhpcy53YXNMZWFmKXsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVDbGFzcygieC10cmVlLW5vZGUtbGVhZiIpOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLndhc0xlYWYgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYodGhpcy5jMSAhPSBjMSB8fCB0aGlzLmMyICE9IGMyKXsNCiAgICAgICAgICAgICAgICAgICAgRXh0LmZseSh0aGlzLmVsTm9kZSkucmVwbGFjZUNsYXNzKGMxLCBjMik7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuYzEgPSBjMTsgdGhpcy5jMiA9IGMyOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgIGlmKCF0aGlzLndhc0xlYWYpew0KICAgICAgICAgICAgICAgICAgICBFeHQuZmx5KHRoaXMuZWxOb2RlKS5yZXBsYWNlQ2xhc3MoIngtdHJlZS1ub2RlLWV4cGFuZGVkIiwgIngtdHJlZS1ub2RlLWxlYWYiKTsNCiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuYzE7DQogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmMyOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLndhc0xlYWYgPSB0cnVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHZhciBlY2MgPSAieC10cmVlLWVjLWljb24gIitjbHM7DQogICAgICAgICAgICBpZih0aGlzLmVjYyAhPSBlY2Mpew0KICAgICAgICAgICAgICAgIHRoaXMuZWNOb2RlLmNsYXNzTmFtZSA9IGVjYzsNCiAgICAgICAgICAgICAgICB0aGlzLmVjYyA9IGVjYzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICBnZXRDaGlsZEluZGVudCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIGlmKCF0aGlzLmNoaWxkSW5kZW50KXsNCiAgICAgICAgICAgIHZhciBidWYgPSBbXTsNCiAgICAgICAgICAgIHZhciBwID0gdGhpcy5ub2RlOw0KICAgICAgICAgICAgd2hpbGUocCl7DQogICAgICAgICAgICAgICAgaWYoIXAuaXNSb290IHx8IChwLmlzUm9vdCAmJiBwLm93bmVyVHJlZS5yb290VmlzaWJsZSkpew0KICAgICAgICAgICAgICAgICAgICBpZighcC5pc0xhc3QoKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgYnVmLnVuc2hpZnQoJzxpbWcgc3JjPSInK3RoaXMuZW1wdHlJY29uKyciIGNsYXNzPSJ4LXRyZWUtZWxib3ctbGluZSIgLz4nKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi51bnNoaWZ0KCc8aW1nIHNyYz0iJyt0aGlzLmVtcHR5SWNvbisnIiBjbGFzcz0ieC10cmVlLWljb24iIC8+Jyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcCA9IHAucGFyZW50Tm9kZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMuY2hpbGRJbmRlbnQgPSBidWYuam9pbigiIik7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRJbmRlbnQ7DQogICAgfSwNCg0KICAgIHJlbmRlckluZGVudCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIGlmKHRoaXMucmVuZGVyZWQpew0KICAgICAgICAgICAgdmFyIGluZGVudCA9ICIiOw0KICAgICAgICAgICAgdmFyIHAgPSB0aGlzLm5vZGUucGFyZW50Tm9kZTsNCiAgICAgICAgICAgIGlmKHApew0KICAgICAgICAgICAgICAgIGluZGVudCA9IHAudWkuZ2V0Q2hpbGRJbmRlbnQoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKHRoaXMuaW5kZW50TWFya3VwICE9IGluZGVudCl7IAogICAgICAgICAgICAgICAgdGhpcy5pbmRlbnROb2RlLmlubmVySFRNTCA9IGluZGVudDsNCiAgICAgICAgICAgICAgICB0aGlzLmluZGVudE1hcmt1cCA9IGluZGVudDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMudXBkYXRlRXhwYW5kSWNvbigpOw0KICAgICAgICB9DQogICAgfQ0KfTsNCg0KRXh0LnRyZWUuUm9vdFRyZWVOb2RlVUkgPSBmdW5jdGlvbigpew0KICAgIEV4dC50cmVlLlJvb3RUcmVlTm9kZVVJLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCn07DQpFeHQuZXh0ZW5kKEV4dC50cmVlLlJvb3RUcmVlTm9kZVVJLCBFeHQudHJlZS5UcmVlTm9kZVVJLCB7DQogICAgcmVuZGVyIDogZnVuY3Rpb24oKXsNCiAgICAgICAgaWYoIXRoaXMucmVuZGVyZWQpew0KICAgICAgICAgICAgdmFyIHRhcmdldE5vZGUgPSB0aGlzLm5vZGUub3duZXJUcmVlLmlubmVyQ3QuZG9tOw0KICAgICAgICAgICAgdGhpcy5ub2RlLmV4cGFuZGVkID0gdHJ1ZTsNCiAgICAgICAgICAgIHRhcmdldE5vZGUuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9IngtdHJlZS1yb290LW5vZGUiPjwvZGl2Pic7DQogICAgICAgICAgICB0aGlzLndyYXAgPSB0aGlzLmN0Tm9kZSA9IHRhcmdldE5vZGUuZmlyc3RDaGlsZDsNCiAgICAgICAgfQ0KICAgIH0sDQogICAgY29sbGFwc2UgOiBmdW5jdGlvbigpew0KICAgIH0sDQogICAgZXhwYW5kIDogZnVuY3Rpb24oKXsNCiAgICB9DQp9KTsKDQpFeHQudHJlZS5UcmVlTG9hZGVyID0gZnVuY3Rpb24oY29uZmlnKXsNCiAgICB0aGlzLmJhc2VQYXJhbXMgPSB7fTsNCiAgICB0aGlzLnJlcXVlc3RNZXRob2QgPSAiUE9TVCI7DQogICAgRXh0LmFwcGx5KHRoaXMsIGNvbmZpZyk7DQoNCiAgICB0aGlzLmFkZEV2ZW50cyh7DQogICAgICAgIA0KICAgICAgICAiYmVmb3JlbG9hZCIgOiB0cnVlLA0KICAgICAgICANCiAgICAgICAgImxvYWQiIDogdHJ1ZSwNCiAgICAgICAgDQogICAgICAgICJsb2FkZXhjZXB0aW9uIiA6IHRydWUNCiAgICB9KTsNCg0KICAgIEV4dC50cmVlLlRyZWVMb2FkZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpOw0KfTsNCg0KRXh0LmV4dGVuZChFeHQudHJlZS5UcmVlTG9hZGVyLCBFeHQudXRpbC5PYnNlcnZhYmxlLCB7DQogICAgDQogICAgDQogICAgDQogICAgDQogICAgdWlQcm92aWRlcnMgOiB7fSwNCg0KICAgIA0KICAgIGNsZWFyT25Mb2FkIDogdHJ1ZSwNCg0KICAgIA0KICAgIGxvYWQgOiBmdW5jdGlvbihub2RlLCBjYWxsYmFjayl7DQogICAgICAgIGlmKHRoaXMuY2xlYXJPbkxvYWQpew0KICAgICAgICAgICAgd2hpbGUobm9kZS5maXJzdENoaWxkKXsNCiAgICAgICAgICAgICAgICBub2RlLnJlbW92ZUNoaWxkKG5vZGUuZmlyc3RDaGlsZCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgaWYobm9kZS5hdHRyaWJ1dGVzLmNoaWxkcmVuKXsgCiAgICAgICAgICAgIHZhciBjcyA9IG5vZGUuYXR0cmlidXRlcy5jaGlsZHJlbjsNCiAgICAgICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IGNzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXsNCiAgICAgICAgICAgICAgICBub2RlLmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlTm9kZShjc1tpXSkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYodHlwZW9mIGNhbGxiYWNrID09ICJmdW5jdGlvbiIpew0KICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7DQogICAgICAgICAgICB9DQogICAgICAgIH1lbHNlIGlmKHRoaXMuZGF0YVVybCl7DQogICAgICAgICAgICB0aGlzLnJlcXVlc3REYXRhKG5vZGUsIGNhbGxiYWNrKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICBnZXRQYXJhbXM6IGZ1bmN0aW9uKG5vZGUpew0KICAgICAgICB2YXIgYnVmID0gW10sIGJwID0gdGhpcy5iYXNlUGFyYW1zOw0KICAgICAgICBmb3IodmFyIGtleSBpbiBicCl7DQogICAgICAgICAgICBpZih0eXBlb2YgYnBba2V5XSAhPSAiZnVuY3Rpb24iKXsNCiAgICAgICAgICAgICAgICBidWYucHVzaChlbmNvZGVVUklDb21wb25lbnQoa2V5KSwgIj0iLCBlbmNvZGVVUklDb21wb25lbnQoYnBba2V5XSksICImIik7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgYnVmLnB1c2goIm5vZGU9IiwgZW5jb2RlVVJJQ29tcG9uZW50KG5vZGUuaWQpKTsNCiAgICAgICAgcmV0dXJuIGJ1Zi5qb2luKCIiKTsNCiAgICB9LA0KDQogICAgcmVxdWVzdERhdGEgOiBmdW5jdGlvbihub2RlLCBjYWxsYmFjayl7DQogICAgICAgIGlmKHRoaXMuZmlyZUV2ZW50KCJiZWZvcmVsb2FkIiwgdGhpcywgbm9kZSwgY2FsbGJhY2spICE9PSBmYWxzZSl7DQogICAgICAgICAgICB0aGlzLnRyYW5zSWQgPSBFeHQuQWpheC5yZXF1ZXN0KHsNCiAgICAgICAgICAgICAgICBtZXRob2Q6dGhpcy5yZXF1ZXN0TWV0aG9kLA0KICAgICAgICAgICAgICAgIHVybDogdGhpcy5kYXRhVXJsfHx0aGlzLnVybCwNCiAgICAgICAgICAgICAgICBzdWNjZXNzOiB0aGlzLmhhbmRsZVJlc3BvbnNlLA0KICAgICAgICAgICAgICAgIGZhaWx1cmU6IHRoaXMuaGFuZGxlRmFpbHVyZSwNCiAgICAgICAgICAgICAgICBzY29wZTogdGhpcywNCiAgICAgICAgICAgICAgICBhcmd1bWVudDoge2NhbGxiYWNrOiBjYWxsYmFjaywgbm9kZTogbm9kZX0sDQogICAgICAgICAgICAgICAgcGFyYW1zOiB0aGlzLmdldFBhcmFtcyhub2RlKQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICBpZih0eXBlb2YgY2FsbGJhY2sgPT0gImZ1bmN0aW9uIil7DQogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICBpc0xvYWRpbmcgOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gdGhpcy50cmFuc0lkID8gdHJ1ZSA6IGZhbHNlOw0KICAgIH0sDQoNCiAgICBhYm9ydCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIGlmKHRoaXMuaXNMb2FkaW5nKCkpew0KICAgICAgICAgICAgRXh0LkFqYXguYWJvcnQodGhpcy50cmFuc0lkKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICANCiAgICBjcmVhdGVOb2RlIDogZnVuY3Rpb24oYXR0cil7DQogICAgICAgIAogICAgICAgIGlmKHRoaXMuYmFzZUF0dHJzKXsNCiAgICAgICAgICAgIEV4dC5hcHBseUlmKGF0dHIsIHRoaXMuYmFzZUF0dHJzKTsNCiAgICAgICAgfQ0KICAgICAgICBpZih0aGlzLmFwcGx5TG9hZGVyICE9PSBmYWxzZSl7DQogICAgICAgICAgICBhdHRyLmxvYWRlciA9IHRoaXM7DQogICAgICAgIH0NCiAgICAgICAgaWYodHlwZW9mIGF0dHIudWlQcm92aWRlciA9PSAnc3RyaW5nJyl7DQogICAgICAgICAgIGF0dHIudWlQcm92aWRlciA9IHRoaXMudWlQcm92aWRlcnNbYXR0ci51aVByb3ZpZGVyXSB8fCBldmFsKGF0dHIudWlQcm92aWRlcik7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuKGF0dHIubGVhZiA/DQogICAgICAgICAgICAgICAgICAgICAgICBuZXcgRXh0LnRyZWUuVHJlZU5vZGUoYXR0cikgOg0KICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEV4dC50cmVlLkFzeW5jVHJlZU5vZGUoYXR0cikpOw0KICAgIH0sDQoNCiAgICBwcm9jZXNzUmVzcG9uc2UgOiBmdW5jdGlvbihyZXNwb25zZSwgbm9kZSwgY2FsbGJhY2spew0KICAgICAgICB2YXIganNvbiA9IHJlc3BvbnNlLnJlc3BvbnNlVGV4dDsNCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgIHZhciBvID0gZXZhbCgiKCIranNvbisiKSIpOw0KICAgICAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gby5sZW5ndGg7IGkgPCBsZW47IGkrKyl7DQogICAgICAgICAgICAgICAgdmFyIG4gPSB0aGlzLmNyZWF0ZU5vZGUob1tpXSk7DQogICAgICAgICAgICAgICAgaWYobil7DQogICAgICAgICAgICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQobik7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYodHlwZW9mIGNhbGxiYWNrID09ICJmdW5jdGlvbiIpew0KICAgICAgICAgICAgICAgIGNhbGxiYWNrKHRoaXMsIG5vZGUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9Y2F0Y2goZSl7DQogICAgICAgICAgICB0aGlzLmhhbmRsZUZhaWx1cmUocmVzcG9uc2UpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIGhhbmRsZVJlc3BvbnNlIDogZnVuY3Rpb24ocmVzcG9uc2Upew0KICAgICAgICB0aGlzLnRyYW5zSWQgPSBmYWxzZTsNCiAgICAgICAgdmFyIGEgPSByZXNwb25zZS5hcmd1bWVudDsNCiAgICAgICAgdGhpcy5wcm9jZXNzUmVzcG9uc2UocmVzcG9uc2UsIGEubm9kZSwgYS5jYWxsYmFjayk7DQogICAgICAgIHRoaXMuZmlyZUV2ZW50KCJsb2FkIiwgdGhpcywgYS5ub2RlLCByZXNwb25zZSk7DQogICAgfSwNCg0KICAgIGhhbmRsZUZhaWx1cmUgOiBmdW5jdGlvbihyZXNwb25zZSl7DQogICAgICAgIHRoaXMudHJhbnNJZCA9IGZhbHNlOw0KICAgICAgICB2YXIgYSA9IHJlc3BvbnNlLmFyZ3VtZW50Ow0KICAgICAgICB0aGlzLmZpcmVFdmVudCgibG9hZGV4Y2VwdGlvbiIsIHRoaXMsIGEubm9kZSwgcmVzcG9uc2UpOw0KICAgICAgICBpZih0eXBlb2YgYS5jYWxsYmFjayA9PSAiZnVuY3Rpb24iKXsNCiAgICAgICAgICAgIGEuY2FsbGJhY2sodGhpcywgYS5ub2RlKTsNCiAgICAgICAgfQ0KICAgIH0NCn0pOwoNCkV4dC50cmVlLlRyZWVGaWx0ZXIgPSBmdW5jdGlvbih0cmVlLCBjb25maWcpew0KICAgIHRoaXMudHJlZSA9IHRyZWU7DQogICAgdGhpcy5maWx0ZXJlZCA9IHt9Ow0KICAgIEV4dC5hcHBseSh0aGlzLCBjb25maWcpOw0KfTsNCg0KRXh0LnRyZWUuVHJlZUZpbHRlci5wcm90b3R5cGUgPSB7DQogICAgY2xlYXJCbGFuazpmYWxzZSwNCiAgICByZXZlcnNlOmZhbHNlLA0KICAgIGF1dG9DbGVhcjpmYWxzZSwNCiAgICByZW1vdmU6ZmFsc2UsDQoNCiAgICAgDQogICAgZmlsdGVyIDogZnVuY3Rpb24odmFsdWUsIGF0dHIsIHN0YXJ0Tm9kZSl7DQogICAgICAgIGF0dHIgPSBhdHRyIHx8ICJ0ZXh0IjsNCiAgICAgICAgdmFyIGY7DQogICAgICAgIGlmKHR5cGVvZiB2YWx1ZSA9PSAic3RyaW5nIil7DQogICAgICAgICAgICB2YXIgdmxlbiA9IHZhbHVlLmxlbmd0aDsNCiAgICAgICAgICAgIAogICAgICAgICAgICBpZih2bGVuID09IDAgJiYgdGhpcy5jbGVhckJsYW5rKXsNCiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyKCk7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpOw0KICAgICAgICAgICAgZiA9IGZ1bmN0aW9uKG4pew0KICAgICAgICAgICAgICAgIHJldHVybiBuLmF0dHJpYnV0ZXNbYXR0cl0uc3Vic3RyKDAsIHZsZW4pLnRvTG93ZXJDYXNlKCkgPT0gdmFsdWU7DQogICAgICAgICAgICB9Ow0KICAgICAgICB9ZWxzZSBpZih2YWx1ZS5leGVjKXsgCiAgICAgICAgICAgIGYgPSBmdW5jdGlvbihuKXsNCiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUudGVzdChuLmF0dHJpYnV0ZXNbYXR0cl0pOw0KICAgICAgICAgICAgfTsNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICB0aHJvdyAnSWxsZWdhbCBmaWx0ZXIgdHlwZSwgbXVzdCBiZSBzdHJpbmcgb3IgcmVnZXgnOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuZmlsdGVyQnkoZiwgbnVsbCwgc3RhcnROb2RlKTsNCgl9LA0KDQogICAgDQogICAgZmlsdGVyQnkgOiBmdW5jdGlvbihmbiwgc2NvcGUsIHN0YXJ0Tm9kZSl7DQogICAgICAgIHN0YXJ0Tm9kZSA9IHN0YXJ0Tm9kZSB8fCB0aGlzLnRyZWUucm9vdDsNCiAgICAgICAgaWYodGhpcy5hdXRvQ2xlYXIpew0KICAgICAgICAgICAgdGhpcy5jbGVhcigpOw0KICAgICAgICB9DQogICAgICAgIHZhciBhZiA9IHRoaXMuZmlsdGVyZWQsIHJ2ID0gdGhpcy5yZXZlcnNlOw0KICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uKG4pew0KICAgICAgICAgICAgaWYobiA9PSBzdGFydE5vZGUpew0KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYoYWZbbi5pZF0pew0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHZhciBtID0gZm4uY2FsbChzY29wZSB8fCBuLCBuKTsNCiAgICAgICAgICAgIGlmKCFtIHx8IHJ2KXsNCiAgICAgICAgICAgICAgICBhZltuLmlkXSA9IG47DQogICAgICAgICAgICAgICAgbi51aS5oaWRlKCk7DQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgIH07DQogICAgICAgIHN0YXJ0Tm9kZS5jYXNjYWRlKGYpOw0KICAgICAgICBpZih0aGlzLnJlbW92ZSl7DQogICAgICAgICAgIGZvcih2YXIgaWQgaW4gYWYpew0KICAgICAgICAgICAgICAgaWYodHlwZW9mIGlkICE9ICJmdW5jdGlvbiIpew0KICAgICAgICAgICAgICAgICAgIHZhciBuID0gYWZbaWRdOw0KICAgICAgICAgICAgICAgICAgIGlmKG4gJiYgbi5wYXJlbnROb2RlKXsNCiAgICAgICAgICAgICAgICAgICAgICAgbi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG4pOw0KICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIGNsZWFyIDogZnVuY3Rpb24oKXsNCiAgICAgICAgdmFyIHQgPSB0aGlzLnRyZWU7DQogICAgICAgIHZhciBhZiA9IHRoaXMuZmlsdGVyZWQ7DQogICAgICAgIGZvcih2YXIgaWQgaW4gYWYpew0KICAgICAgICAgICAgaWYodHlwZW9mIGlkICE9ICJmdW5jdGlvbiIpew0KICAgICAgICAgICAgICAgIHZhciBuID0gYWZbaWRdOw0KICAgICAgICAgICAgICAgIGlmKG4pew0KICAgICAgICAgICAgICAgICAgICBuLnVpLnNob3coKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5maWx0ZXJlZCA9IHt9Ow0KICAgIH0NCn07DQoKDQpFeHQudHJlZS5UcmVlU29ydGVyID0gZnVuY3Rpb24odHJlZSwgY29uZmlnKXsNCiAgICBFeHQuYXBwbHkodGhpcywgY29uZmlnKTsNCiAgICB0cmVlLm9uKCJiZWZvcmVjaGlsZHJlbnJlbmRlcmVkIiwgdGhpcy5kb1NvcnQsIHRoaXMpOw0KICAgIHRyZWUub24oImFwcGVuZCIsIHRoaXMudXBkYXRlU29ydCwgdGhpcyk7DQogICAgdHJlZS5vbigiaW5zZXJ0IiwgdGhpcy51cGRhdGVTb3J0LCB0aGlzKTsNCiAgICANCiAgICB2YXIgZHNjID0gdGhpcy5kaXIgJiYgdGhpcy5kaXIudG9Mb3dlckNhc2UoKSA9PSAiZGVzYyI7DQogICAgdmFyIHAgPSB0aGlzLnByb3BlcnR5IHx8ICJ0ZXh0IjsNCiAgICB2YXIgc29ydFR5cGUgPSB0aGlzLnNvcnRUeXBlOw0KICAgIHZhciBmcyA9IHRoaXMuZm9sZGVyU29ydDsNCiAgICB2YXIgY3MgPSB0aGlzLmNhc2VTZW5zaXRpdmUgPT09IHRydWU7DQogICAgdmFyIGxlYWZBdHRyID0gdGhpcy5sZWFmQXR0ciB8fCAnbGVhZic7DQoNCiAgICB0aGlzLnNvcnRGbiA9IGZ1bmN0aW9uKG4xLCBuMil7DQogICAgICAgIGlmKGZzKXsNCiAgICAgICAgICAgIGlmKG4xLmF0dHJpYnV0ZXNbbGVhZkF0dHJdICYmICFuMi5hdHRyaWJ1dGVzW2xlYWZBdHRyXSl7DQogICAgICAgICAgICAgICAgcmV0dXJuIDE7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZighbjEuYXR0cmlidXRlc1tsZWFmQXR0cl0gJiYgbjIuYXR0cmlidXRlc1tsZWFmQXR0cl0pew0KICAgICAgICAgICAgICAgIHJldHVybiAtMTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIAl2YXIgdjEgPSBzb3J0VHlwZSA/IHNvcnRUeXBlKG4xKSA6IChjcyA/IG4xLmF0dHJpYnV0ZXNbcF0gOiBuMS5hdHRyaWJ1dGVzW3BdLnRvVXBwZXJDYXNlKCkpOw0KICAgIAl2YXIgdjIgPSBzb3J0VHlwZSA/IHNvcnRUeXBlKG4yKSA6IChjcyA/IG4yLmF0dHJpYnV0ZXNbcF0gOiBuMi5hdHRyaWJ1dGVzW3BdLnRvVXBwZXJDYXNlKCkpOw0KICAgIAlpZih2MSA8IHYyKXsNCgkJCXJldHVybiBkc2MgPyArMSA6IC0xOw0KCQl9ZWxzZSBpZih2MSA+IHYyKXsNCgkJCXJldHVybiBkc2MgPyAtMSA6ICsxOw0KICAgICAgICB9ZWxzZXsNCgkgICAgCXJldHVybiAwOw0KICAgICAgICB9DQogICAgfTsNCn07DQoNCkV4dC50cmVlLlRyZWVTb3J0ZXIucHJvdG90eXBlID0gew0KICAgIGRvU29ydCA6IGZ1bmN0aW9uKG5vZGUpew0KICAgICAgICBub2RlLnNvcnQodGhpcy5zb3J0Rm4pOw0KICAgIH0sDQogICAgDQogICAgY29tcGFyZU5vZGVzIDogZnVuY3Rpb24objEsIG4yKXsNCiAgICAgICAgcmV0dXJuIChuMS50ZXh0LnRvVXBwZXJDYXNlKCkgPiBuMi50ZXh0LnRvVXBwZXJDYXNlKCkgPyAxIDogLTEpOw0KICAgIH0sDQogICAgDQogICAgdXBkYXRlU29ydCA6IGZ1bmN0aW9uKHRyZWUsIG5vZGUpew0KICAgICAgICBpZihub2RlLmNoaWxkcmVuUmVuZGVyZWQpew0KICAgICAgICAgICAgdGhpcy5kb1NvcnQuZGVmZXIoMSwgdGhpcywgW25vZGVdKTsNCiAgICAgICAgfQ0KICAgIH0NCn07CmlmKEV4dC5kZC5Ecm9wWm9uZSl7DQogICAgDQpFeHQudHJlZS5UcmVlRHJvcFpvbmUgPSBmdW5jdGlvbih0cmVlLCBjb25maWcpew0KICAgIHRoaXMuYWxsb3dQYXJlbnRJbnNlcnQgPSBmYWxzZTsNCiAgICB0aGlzLmFsbG93Q29udGFpbmVyRHJvcCA9IGZhbHNlOw0KICAgIHRoaXMuYXBwZW5kT25seSA9IGZhbHNlOw0KICAgIEV4dC50cmVlLlRyZWVEcm9wWm9uZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgdHJlZS5pbm5lckN0LCBjb25maWcpOw0KICAgIHRoaXMudHJlZSA9IHRyZWU7DQogICAgdGhpcy5sYXN0SW5zZXJ0Q2xhc3MgPSAieC10cmVlLW5vLXN0YXR1cyI7DQogICAgdGhpcy5kcmFnT3ZlckRhdGEgPSB7fTsNCn07DQoNCkV4dC5leHRlbmQoRXh0LnRyZWUuVHJlZURyb3Bab25lLCBFeHQuZGQuRHJvcFpvbmUsIHsNCiAgICBkZEdyb3VwIDogIlRyZWVERCIsDQogICAgDQogICAgZXhwYW5kRGVsYXkgOiAxMDAwLA0KICAgIA0KICAgIGV4cGFuZE5vZGUgOiBmdW5jdGlvbihub2RlKXsNCiAgICAgICAgaWYobm9kZS5oYXNDaGlsZE5vZGVzKCkgJiYgIW5vZGUuaXNFeHBhbmRlZCgpKXsNCiAgICAgICAgICAgIG5vZGUuZXhwYW5kKGZhbHNlLCBudWxsLCB0aGlzLnRyaWdnZXJDYWNoZVJlZnJlc2guY3JlYXRlRGVsZWdhdGUodGhpcykpOw0KICAgICAgICB9DQogICAgfSwNCiAgICANCiAgICBxdWV1ZUV4cGFuZCA6IGZ1bmN0aW9uKG5vZGUpew0KICAgICAgICB0aGlzLmV4cGFuZFByb2NJZCA9IHRoaXMuZXhwYW5kTm9kZS5kZWZlcih0aGlzLmV4cGFuZERlbGF5LCB0aGlzLCBbbm9kZV0pOw0KICAgIH0sDQogICAgDQogICAgY2FuY2VsRXhwYW5kIDogZnVuY3Rpb24oKXsNCiAgICAgICAgaWYodGhpcy5leHBhbmRQcm9jSWQpew0KICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZXhwYW5kUHJvY0lkKTsNCiAgICAgICAgICAgIHRoaXMuZXhwYW5kUHJvY0lkID0gZmFsc2U7DQogICAgICAgIH0NCiAgICB9LA0KICAgIA0KICAgIGlzVmFsaWREcm9wUG9pbnQgOiBmdW5jdGlvbihuLCBwdCwgZGQsIGUsIGRhdGEpew0KICAgICAgICBpZighbiB8fCAhZGF0YSl7IHJldHVybiBmYWxzZTsgfQ0KICAgICAgICB2YXIgdGFyZ2V0Tm9kZSA9IG4ubm9kZTsNCiAgICAgICAgdmFyIGRyb3BOb2RlID0gZGF0YS5ub2RlOw0KICAgICAgICAKICAgICAgICBpZighKHRhcmdldE5vZGUgJiYgdGFyZ2V0Tm9kZS5pc1RhcmdldCAmJiBwdCkpew0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9DQogICAgICAgIGlmKHB0ID09ICJhcHBlbmQiICYmIHRhcmdldE5vZGUuYWxsb3dDaGlsZHJlbiA9PT0gZmFsc2Upew0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9DQogICAgICAgIGlmKChwdCA9PSAiYWJvdmUiIHx8IHB0ID09ICJiZWxvdyIpICYmICh0YXJnZXROb2RlLnBhcmVudE5vZGUgJiYgdGFyZ2V0Tm9kZS5wYXJlbnROb2RlLmFsbG93Q2hpbGRyZW4gPT09IGZhbHNlKSl7DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCiAgICAgICAgaWYoZHJvcE5vZGUgJiYgKHRhcmdldE5vZGUgPT0gZHJvcE5vZGUgfHwgZHJvcE5vZGUuY29udGFpbnModGFyZ2V0Tm9kZSkpKXsNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfQ0KICAgICAgICAKICAgICAgICB2YXIgb3ZlckV2ZW50ID0gdGhpcy5kcmFnT3ZlckRhdGE7DQogICAgICAgIG92ZXJFdmVudC50cmVlID0gdGhpcy50cmVlOw0KICAgICAgICBvdmVyRXZlbnQudGFyZ2V0ID0gdGFyZ2V0Tm9kZTsNCiAgICAgICAgb3ZlckV2ZW50LmRhdGEgPSBkYXRhOw0KICAgICAgICBvdmVyRXZlbnQucG9pbnQgPSBwdDsNCiAgICAgICAgb3ZlckV2ZW50LnNvdXJjZSA9IGRkOw0KICAgICAgICBvdmVyRXZlbnQucmF3RXZlbnQgPSBlOw0KICAgICAgICBvdmVyRXZlbnQuZHJvcE5vZGUgPSBkcm9wTm9kZTsNCiAgICAgICAgb3ZlckV2ZW50LmNhbmNlbCA9IGZhbHNlOyAgDQogICAgICAgIHZhciByZXN1bHQgPSB0aGlzLnRyZWUuZmlyZUV2ZW50KCJub2RlZHJhZ292ZXIiLCBvdmVyRXZlbnQpOw0KICAgICAgICByZXR1cm4gb3ZlckV2ZW50LmNhbmNlbCA9PT0gZmFsc2UgJiYgcmVzdWx0ICE9PSBmYWxzZTsNCiAgICB9LA0KICAgIA0KICAgIGdldERyb3BQb2ludCA6IGZ1bmN0aW9uKGUsIG4sIGRkKXsNCiAgICAgICAgdmFyIHRuID0gbi5ub2RlOw0KICAgICAgICBpZih0bi5pc1Jvb3Qpew0KICAgICAgICAgICAgcmV0dXJuIHRuLmFsbG93Q2hpbGRyZW4gIT09IGZhbHNlID8gImFwcGVuZCIgOiBmYWxzZTsgCiAgICAgICAgfQ0KICAgICAgICB2YXIgZHJhZ0VsID0gbi5kZGVsOw0KICAgICAgICB2YXIgdCA9IEV4dC5saWIuRG9tLmdldFkoZHJhZ0VsKSwgYiA9IHQgKyBkcmFnRWwub2Zmc2V0SGVpZ2h0Ow0KICAgICAgICB2YXIgeSA9IEV4dC5saWIuRXZlbnQuZ2V0UGFnZVkoZSk7DQogICAgICAgIHZhciBub0FwcGVuZCA9IHRuLmFsbG93Q2hpbGRyZW4gPT09IGZhbHNlIHx8IHRuLmlzTGVhZigpOw0KICAgICAgICBpZih0aGlzLmFwcGVuZE9ubHkgfHwgdG4ucGFyZW50Tm9kZS5hbGxvd0NoaWxkcmVuID09PSBmYWxzZSl7DQogICAgICAgICAgICByZXR1cm4gbm9BcHBlbmQgPyBmYWxzZSA6ICJhcHBlbmQiOw0KICAgICAgICB9DQogICAgICAgIHZhciBub0JlbG93ID0gZmFsc2U7DQogICAgICAgIGlmKCF0aGlzLmFsbG93UGFyZW50SW5zZXJ0KXsNCiAgICAgICAgICAgIG5vQmVsb3cgPSB0bi5oYXNDaGlsZE5vZGVzKCkgJiYgdG4uaXNFeHBhbmRlZCgpOw0KICAgICAgICB9DQogICAgICAgIHZhciBxID0gKGIgLSB0KSAvIChub0FwcGVuZCA/IDIgOiAzKTsNCiAgICAgICAgaWYoeSA+PSB0ICYmIHkgPCAodCArIHEpKXsNCiAgICAgICAgICAgIHJldHVybiAiYWJvdmUiOw0KICAgICAgICB9ZWxzZSBpZighbm9CZWxvdyAmJiAobm9BcHBlbmQgfHwgeSA+PSBiLXEgJiYgeSA8PSBiKSl7DQogICAgICAgICAgICByZXR1cm4gImJlbG93IjsNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICByZXR1cm4gImFwcGVuZCI7DQogICAgICAgIH0NCiAgICB9LA0KICAgIA0KICAgIG9uTm9kZUVudGVyIDogZnVuY3Rpb24obiwgZGQsIGUsIGRhdGEpew0KICAgICAgICB0aGlzLmNhbmNlbEV4cGFuZCgpOw0KICAgIH0sDQogICAgDQogICAgb25Ob2RlT3ZlciA6IGZ1bmN0aW9uKG4sIGRkLCBlLCBkYXRhKXsNCiAgICAgICAgdmFyIHB0ID0gdGhpcy5nZXREcm9wUG9pbnQoZSwgbiwgZGQpOw0KICAgICAgICB2YXIgbm9kZSA9IG4ubm9kZTsNCiAgICAgICAgDQogICAgICAgIAogICAgICAgIGlmKCF0aGlzLmV4cGFuZFByb2NJZCAmJiBwdCA9PSAiYXBwZW5kIiAmJiBub2RlLmhhc0NoaWxkTm9kZXMoKSAmJiAhbi5ub2RlLmlzRXhwYW5kZWQoKSl7DQogICAgICAgICAgICB0aGlzLnF1ZXVlRXhwYW5kKG5vZGUpOw0KICAgICAgICB9ZWxzZSBpZihwdCAhPSAiYXBwZW5kIil7DQogICAgICAgICAgICB0aGlzLmNhbmNlbEV4cGFuZCgpOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAKICAgICAgICB2YXIgcmV0dXJuQ2xzID0gdGhpcy5kcm9wTm90QWxsb3dlZDsNCiAgICAgICAgaWYodGhpcy5pc1ZhbGlkRHJvcFBvaW50KG4sIHB0LCBkZCwgZSwgZGF0YSkpew0KICAgICAgICAgICBpZihwdCl7DQogICAgICAgICAgICAgICB2YXIgZWwgPSBuLmRkZWw7DQogICAgICAgICAgICAgICB2YXIgY2xzOw0KICAgICAgICAgICAgICAgaWYocHQgPT0gImFib3ZlIil7DQogICAgICAgICAgICAgICAgICAgcmV0dXJuQ2xzID0gbi5ub2RlLmlzRmlyc3QoKSA/ICJ4LXRyZWUtZHJvcC1vay1hYm92ZSIgOiAieC10cmVlLWRyb3Atb2stYmV0d2VlbiI7DQogICAgICAgICAgICAgICAgICAgY2xzID0gIngtdHJlZS1kcmFnLWluc2VydC1hYm92ZSI7DQogICAgICAgICAgICAgICB9ZWxzZSBpZihwdCA9PSAiYmVsb3ciKXsNCiAgICAgICAgICAgICAgICAgICByZXR1cm5DbHMgPSBuLm5vZGUuaXNMYXN0KCkgPyAieC10cmVlLWRyb3Atb2stYmVsb3ciIDogIngtdHJlZS1kcm9wLW9rLWJldHdlZW4iOw0KICAgICAgICAgICAgICAgICAgIGNscyA9ICJ4LXRyZWUtZHJhZy1pbnNlcnQtYmVsb3ciOw0KICAgICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgICAgcmV0dXJuQ2xzID0gIngtdHJlZS1kcm9wLW9rLWFwcGVuZCI7DQogICAgICAgICAgICAgICAgICAgY2xzID0gIngtdHJlZS1kcmFnLWFwcGVuZCI7DQogICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICBpZih0aGlzLmxhc3RJbnNlcnRDbGFzcyAhPSBjbHMpew0KICAgICAgICAgICAgICAgICAgIEV4dC5mbHkoZWwpLnJlcGxhY2VDbGFzcyh0aGlzLmxhc3RJbnNlcnRDbGFzcywgY2xzKTsNCiAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RJbnNlcnRDbGFzcyA9IGNsczsNCiAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgfQ0KICAgICAgIH0NCiAgICAgICByZXR1cm4gcmV0dXJuQ2xzOw0KICAgIH0sDQogICAgDQogICAgb25Ob2RlT3V0IDogZnVuY3Rpb24obiwgZGQsIGUsIGRhdGEpew0KICAgICAgICB0aGlzLmNhbmNlbEV4cGFuZCgpOw0KICAgICAgICB0aGlzLnJlbW92ZURyb3BJbmRpY2F0b3JzKG4pOw0KICAgIH0sDQogICAgDQogICAgb25Ob2RlRHJvcCA6IGZ1bmN0aW9uKG4sIGRkLCBlLCBkYXRhKXsNCiAgICAgICAgdmFyIHBvaW50ID0gdGhpcy5nZXREcm9wUG9pbnQoZSwgbiwgZGQpOw0KICAgICAgICB2YXIgdGFyZ2V0Tm9kZSA9IG4ubm9kZTsNCiAgICAgICAgdGFyZ2V0Tm9kZS51aS5zdGFydERyb3AoKTsNCiAgICAgICAgaWYoIXRoaXMuaXNWYWxpZERyb3BQb2ludChuLCBwb2ludCwgZGQsIGUsIGRhdGEpKXsNCiAgICAgICAgICAgIHRhcmdldE5vZGUudWkuZW5kRHJvcCgpOw0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9DQogICAgICAgIAogICAgICAgIHZhciBkcm9wTm9kZSA9IGRhdGEubm9kZSB8fCAoZGQuZ2V0VHJlZU5vZGUgPyBkZC5nZXRUcmVlTm9kZShkYXRhLCB0YXJnZXROb2RlLCBwb2ludCwgZSkgOiBudWxsKTsNCiAgICAgICAgdmFyIGRyb3BFdmVudCA9IHsNCiAgICAgICAgICAgIHRyZWUgOiB0aGlzLnRyZWUsDQogICAgICAgICAgICB0YXJnZXQ6IHRhcmdldE5vZGUsDQogICAgICAgICAgICBkYXRhOiBkYXRhLA0KICAgICAgICAgICAgcG9pbnQ6IHBvaW50LA0KICAgICAgICAgICAgc291cmNlOiBkZCwNCiAgICAgICAgICAgIHJhd0V2ZW50OiBlLA0KICAgICAgICAgICAgZHJvcE5vZGU6IGRyb3BOb2RlLA0KICAgICAgICAgICAgY2FuY2VsOiAhZHJvcE5vZGUgICANCiAgICAgICAgfTsNCiAgICAgICAgdmFyIHJldHZhbCA9IHRoaXMudHJlZS5maXJlRXZlbnQoImJlZm9yZW5vZGVkcm9wIiwgZHJvcEV2ZW50KTsNCiAgICAgICAgaWYocmV0dmFsID09PSBmYWxzZSB8fCBkcm9wRXZlbnQuY2FuY2VsID09PSB0cnVlIHx8ICFkcm9wRXZlbnQuZHJvcE5vZGUpew0KICAgICAgICAgICAgdGFyZ2V0Tm9kZS51aS5lbmREcm9wKCk7DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCiAgICAgICAgCiAgICAgICAgdGFyZ2V0Tm9kZSA9IGRyb3BFdmVudC50YXJnZXQ7DQogICAgICAgIGlmKHBvaW50ID09ICJhcHBlbmQiICYmICF0YXJnZXROb2RlLmlzRXhwYW5kZWQoKSl7DQogICAgICAgICAgICB0YXJnZXROb2RlLmV4cGFuZChmYWxzZSwgbnVsbCwgZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlRHJvcChkcm9wRXZlbnQpOw0KICAgICAgICAgICAgfS5jcmVhdGVEZWxlZ2F0ZSh0aGlzKSk7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgdGhpcy5jb21wbGV0ZURyb3AoZHJvcEV2ZW50KTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9LA0KICAgIA0KICAgIGNvbXBsZXRlRHJvcCA6IGZ1bmN0aW9uKGRlKXsNCiAgICAgICAgdmFyIG5zID0gZGUuZHJvcE5vZGUsIHAgPSBkZS5wb2ludCwgdCA9IGRlLnRhcmdldDsNCiAgICAgICAgaWYoIShucyBpbnN0YW5jZW9mIEFycmF5KSl7DQogICAgICAgICAgICBucyA9IFtuc107DQogICAgICAgIH0NCiAgICAgICAgdmFyIG47DQogICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IG5zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXsNCiAgICAgICAgICAgIG4gPSBuc1tpXTsNCiAgICAgICAgICAgIGlmKHAgPT0gImFib3ZlIil7DQogICAgICAgICAgICAgICAgdC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShuLCB0KTsNCiAgICAgICAgICAgIH1lbHNlIGlmKHAgPT0gImJlbG93Iil7DQogICAgICAgICAgICAgICAgdC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShuLCB0Lm5leHRTaWJsaW5nKTsNCiAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgIHQuYXBwZW5kQ2hpbGQobik7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgbi51aS5mb2N1cygpOw0KICAgICAgICBpZih0aGlzLnRyZWUuaGxEcm9wKXsNCiAgICAgICAgICAgIG4udWkuaGlnaGxpZ2h0KCk7DQogICAgICAgIH0NCiAgICAgICAgdC51aS5lbmREcm9wKCk7DQogICAgICAgIHRoaXMudHJlZS5maXJlRXZlbnQoIm5vZGVkcm9wIiwgZGUpOw0KICAgIH0sDQogICAgDQogICAgYWZ0ZXJOb2RlTW92ZWQgOiBmdW5jdGlvbihkZCwgZGF0YSwgZSwgdGFyZ2V0Tm9kZSwgZHJvcE5vZGUpew0KICAgICAgICBpZih0aGlzLnRyZWUuaGxEcm9wKXsNCiAgICAgICAgICAgIGRyb3BOb2RlLnVpLmZvY3VzKCk7DQogICAgICAgICAgICBkcm9wTm9kZS51aS5oaWdobGlnaHQoKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLnRyZWUuZmlyZUV2ZW50KCJub2RlZHJvcCIsIHRoaXMudHJlZSwgdGFyZ2V0Tm9kZSwgZGF0YSwgZGQsIGUpOw0KICAgIH0sDQogICAgDQogICAgZ2V0VHJlZSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLnRyZWU7DQogICAgfSwNCiAgICANCiAgICByZW1vdmVEcm9wSW5kaWNhdG9ycyA6IGZ1bmN0aW9uKG4pew0KICAgICAgICBpZihuICYmIG4uZGRlbCl7DQogICAgICAgICAgICB2YXIgZWwgPSBuLmRkZWw7DQogICAgICAgICAgICBFeHQuZmx5KGVsKS5yZW1vdmVDbGFzcyhbDQogICAgICAgICAgICAgICAgICAgICJ4LXRyZWUtZHJhZy1pbnNlcnQtYWJvdmUiLA0KICAgICAgICAgICAgICAgICAgICAieC10cmVlLWRyYWctaW5zZXJ0LWJlbG93IiwNCiAgICAgICAgICAgICAgICAgICAgIngtdHJlZS1kcmFnLWFwcGVuZCJdKTsNCiAgICAgICAgICAgIHRoaXMubGFzdEluc2VydENsYXNzID0gIl9ub2NsYXNzIjsNCiAgICAgICAgfQ0KICAgIH0sDQogICAgDQogICAgYmVmb3JlRHJhZ0Ryb3AgOiBmdW5jdGlvbih0YXJnZXQsIGUsIGlkKXsNCiAgICAgICAgdGhpcy5jYW5jZWxFeHBhbmQoKTsNCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgfSwNCiAgICANCiAgICBhZnRlclJlcGFpciA6IGZ1bmN0aW9uKGRhdGEpew0KICAgICAgICBpZihkYXRhICYmIEV4dC5lbmFibGVGeCl7DQogICAgICAgICAgICBkYXRhLm5vZGUudWkuaGlnaGxpZ2h0KCk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5oaWRlUHJveHkoKTsNCiAgICB9ICAgIA0KfSk7DQoNCn0KaWYoRXh0LmRkLkRyYWdab25lKXsNCkV4dC50cmVlLlRyZWVEcmFnWm9uZSA9IGZ1bmN0aW9uKHRyZWUsIGNvbmZpZyl7DQogICAgRXh0LnRyZWUuVHJlZURyYWdab25lLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLCB0cmVlLmdldFRyZWVFbCgpLCBjb25maWcpOw0KICAgIHRoaXMudHJlZSA9IHRyZWU7DQp9Ow0KDQpFeHQuZXh0ZW5kKEV4dC50cmVlLlRyZWVEcmFnWm9uZSwgRXh0LmRkLkRyYWdab25lLCB7DQogICAgZGRHcm91cCA6ICJUcmVlREQiLA0KICAgIA0KICAgIG9uQmVmb3JlRHJhZyA6IGZ1bmN0aW9uKGRhdGEsIGUpew0KICAgICAgICB2YXIgbiA9IGRhdGEubm9kZTsNCiAgICAgICAgcmV0dXJuIG4gJiYgbi5kcmFnZ2FibGUgJiYgIW4uZGlzYWJsZWQ7DQogICAgfSwNCiAgICANCiAgICBvbkluaXREcmFnIDogZnVuY3Rpb24oZSl7DQogICAgICAgIHZhciBkYXRhID0gdGhpcy5kcmFnRGF0YTsNCiAgICAgICAgdGhpcy50cmVlLmdldFNlbGVjdGlvbk1vZGVsKCkuc2VsZWN0KGRhdGEubm9kZSk7DQogICAgICAgIHRoaXMucHJveHkudXBkYXRlKCIiKTsNCiAgICAgICAgZGF0YS5ub2RlLnVpLmFwcGVuZERER2hvc3QodGhpcy5wcm94eS5naG9zdC5kb20pOw0KICAgICAgICB0aGlzLnRyZWUuZmlyZUV2ZW50KCJzdGFydGRyYWciLCB0aGlzLnRyZWUsIGRhdGEubm9kZSwgZSk7DQogICAgfSwNCiAgICANCiAgICBnZXRSZXBhaXJYWSA6IGZ1bmN0aW9uKGUsIGRhdGEpew0KICAgICAgICByZXR1cm4gZGF0YS5ub2RlLnVpLmdldEREUmVwYWlyWFkoKTsNCiAgICB9LA0KICAgIA0KICAgIG9uRW5kRHJhZyA6IGZ1bmN0aW9uKGRhdGEsIGUpew0KICAgICAgICB0aGlzLnRyZWUuZmlyZUV2ZW50KCJlbmRkcmFnIiwgdGhpcy50cmVlLCBkYXRhLm5vZGUsIGUpOw0KICAgIH0sDQogICAgDQogICAgb25WYWxpZERyb3AgOiBmdW5jdGlvbihkZCwgZSwgaWQpew0KICAgICAgICB0aGlzLnRyZWUuZmlyZUV2ZW50KCJkcmFnZHJvcCIsIHRoaXMudHJlZSwgdGhpcy5kcmFnRGF0YS5ub2RlLCBkZCwgZSk7DQogICAgICAgIHRoaXMuaGlkZVByb3h5KCk7DQogICAgfSwNCiAgICANCiAgICBiZWZvcmVJbnZhbGlkRHJvcCA6IGZ1bmN0aW9uKGUsIGlkKXsNCiAgICAgICAgCiAgICAgICAgdmFyIHNtID0gdGhpcy50cmVlLmdldFNlbGVjdGlvbk1vZGVsKCk7DQogICAgICAgIHNtLmNsZWFyU2VsZWN0aW9ucygpOw0KICAgICAgICBzbS5zZWxlY3QodGhpcy5kcmFnRGF0YS5ub2RlKTsNCiAgICB9DQp9KTsNCn0KCkV4dC50cmVlLlRyZWVFZGl0b3IgPSBmdW5jdGlvbih0cmVlLCBjb25maWcpewogICAgY29uZmlnID0gY29uZmlnIHx8IHt9OwogICAgdmFyIGZpZWxkID0gY29uZmlnLmV2ZW50cyA/IGNvbmZpZyA6IG5ldyBFeHQuZm9ybS5UZXh0RmllbGQoY29uZmlnKTsKICAgIEV4dC50cmVlLlRyZWVFZGl0b3Iuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIGZpZWxkKTsKCiAgICB0aGlzLnRyZWUgPSB0cmVlOwoKICAgIHRyZWUub24oJ2JlZm9yZWNsaWNrJywgdGhpcy5iZWZvcmVOb2RlQ2xpY2ssIHRoaXMpOwogICAgdHJlZS5nZXRUcmVlRWwoKS5vbignbW91c2Vkb3duJywgdGhpcy5oaWRlLCB0aGlzKTsKICAgIHRoaXMub24oJ2NvbXBsZXRlJywgdGhpcy51cGRhdGVOb2RlLCB0aGlzKTsKICAgIHRoaXMub24oJ2JlZm9yZXN0YXJ0ZWRpdCcsIHRoaXMuZml0VG9UcmVlLCB0aGlzKTsKICAgIHRoaXMub24oJ3N0YXJ0ZWRpdCcsIHRoaXMuYmluZFNjcm9sbCwgdGhpcywge2RlbGF5OjEwfSk7CiAgICB0aGlzLm9uKCdzcGVjaWFsa2V5JywgdGhpcy5vblNwZWNpYWxLZXksIHRoaXMpOwp9OwoKRXh0LmV4dGVuZChFeHQudHJlZS5UcmVlRWRpdG9yLCBFeHQuRWRpdG9yLCB7CiAgICAKICAgIGFsaWdubWVudDogImwtbCIsCiAgICAgICAgYXV0b1NpemU6IGZhbHNlLAogICAgCiAgICBoaWRlRWwgOiBmYWxzZSwKICAgIAogICAgY2xzOiAieC1zbWFsbC1lZGl0b3IgeC10cmVlLWVkaXRvciIsCiAgICAKICAgIHNoaW06ZmFsc2UsCiAgICAgICAgc2hhZG93OiJmcmFtZSIsCiAgICAKICAgIG1heFdpZHRoOiAyNTAsCgogICAgZWRpdERlbGF5IDogMzUwLAoKICAgICAgICBmaXRUb1RyZWUgOiBmdW5jdGlvbihlZCwgZWwpewogICAgICAgIHZhciB0ZCA9IHRoaXMudHJlZS5nZXRUcmVlRWwoKS5kb20sIG5kID0gZWwuZG9tOwogICAgICAgIGlmKHRkLnNjcm9sbExlZnQgPiAgbmQub2Zmc2V0TGVmdCl7ICAgICAgICAgICAgIHRkLnNjcm9sbExlZnQgPSBuZC5vZmZzZXRMZWZ0OwogICAgICAgIH0KICAgICAgICB2YXIgdyA9IE1hdGgubWluKAogICAgICAgICAgICAgICAgdGhpcy5tYXhXaWR0aCwKICAgICAgICAgICAgICAgICh0ZC5jbGllbnRXaWR0aCA+IDIwID8gdGQuY2xpZW50V2lkdGggOiB0ZC5vZmZzZXRXaWR0aCkgLSBNYXRoLm1heCgwLCBuZC5vZmZzZXRMZWZ0LXRkLnNjcm9sbExlZnQpIC0gNSk7CiAgICAgICAgdGhpcy5zZXRTaXplKHcsICcnKTsKICAgIH0sCgogICAgICAgIHRyaWdnZXJFZGl0IDogZnVuY3Rpb24obm9kZSl7CiAgICAgICAgdGhpcy5jb21wbGV0ZUVkaXQoKTsKICAgICAgICB0aGlzLmVkaXROb2RlID0gbm9kZTsKICAgICAgICB0aGlzLnN0YXJ0RWRpdChub2RlLnVpLnRleHROb2RlLCBub2RlLnRleHQpOwogICAgfSwKCiAgICAgICAgYmluZFNjcm9sbCA6IGZ1bmN0aW9uKCl7CiAgICAgICAgdGhpcy50cmVlLmdldFRyZWVFbCgpLm9uKCdzY3JvbGwnLCB0aGlzLmNhbmNlbEVkaXQsIHRoaXMpOwogICAgfSwKCiAgICAgICAgYmVmb3JlTm9kZUNsaWNrIDogZnVuY3Rpb24obm9kZSwgZSl7CiAgICAgICAgdmFyIHNpbmNlTGFzdCA9ICh0aGlzLmxhc3RDbGljayA/IHRoaXMubGFzdENsaWNrLmdldEVsYXBzZWQoKSA6IDApOwogICAgICAgIHRoaXMubGFzdENsaWNrID0gbmV3IERhdGUoKTsKICAgICAgICBpZihzaW5jZUxhc3QgPiB0aGlzLmVkaXREZWxheSAmJiB0aGlzLnRyZWUuZ2V0U2VsZWN0aW9uTW9kZWwoKS5pc1NlbGVjdGVkKG5vZGUpKXsKICAgICAgICAgICAgZS5zdG9wRXZlbnQoKTsKICAgICAgICAgICAgdGhpcy50cmlnZ2VyRWRpdChub2RlKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0sCgogICAgICAgIHVwZGF0ZU5vZGUgOiBmdW5jdGlvbihlZCwgdmFsdWUpewogICAgICAgIHRoaXMudHJlZS5nZXRUcmVlRWwoKS51bignc2Nyb2xsJywgdGhpcy5jYW5jZWxFZGl0LCB0aGlzKTsKICAgICAgICB0aGlzLmVkaXROb2RlLnNldFRleHQodmFsdWUpOwogICAgfSwKCiAgICAgICAgb25IaWRlIDogZnVuY3Rpb24oKXsKICAgICAgICBFeHQudHJlZS5UcmVlRWRpdG9yLnN1cGVyY2xhc3Mub25IaWRlLmNhbGwodGhpcyk7CiAgICAgICAgaWYodGhpcy5lZGl0Tm9kZSl7CiAgICAgICAgICAgIHRoaXMuZWRpdE5vZGUudWkuZm9jdXMoKTsKICAgICAgICB9CiAgICB9LAoKICAgICAgICBvblNwZWNpYWxLZXkgOiBmdW5jdGlvbihmaWVsZCwgZSl7CiAgICAgICAgdmFyIGsgPSBlLmdldEtleSgpOwogICAgICAgIGlmKGsgPT0gZS5FU0MpewogICAgICAgICAgICBlLnN0b3BFdmVudCgpOwogICAgICAgICAgICB0aGlzLmNhbmNlbEVkaXQoKTsKICAgICAgICB9ZWxzZSBpZihrID09IGUuRU5URVIgJiYgIWUuaGFzTW9kaWZpZXIoKSl7CiAgICAgICAgICAgIGUuc3RvcEV2ZW50KCk7CiAgICAgICAgICAgIHRoaXMuY29tcGxldGVFZGl0KCk7CiAgICAgICAgfQogICAgfQp9KTsKCkV4dC5tZW51Lk1lbnUgPSBmdW5jdGlvbihjb25maWcpewogICAgRXh0LmFwcGx5KHRoaXMsIGNvbmZpZyk7CiAgICB0aGlzLmlkID0gdGhpcy5pZCB8fCBFeHQuaWQoKTsKICAgIHRoaXMuYWRkRXZlbnRzKHsKICAgICAgICAKICAgICAgICBiZWZvcmVzaG93IDogdHJ1ZSwKICAgICAgICAKICAgICAgICBiZWZvcmVoaWRlIDogdHJ1ZSwKICAgICAgICAKICAgICAgICBzaG93IDogdHJ1ZSwKICAgICAgICAKICAgICAgICBoaWRlIDogdHJ1ZSwKICAgICAgICAKICAgICAgICBjbGljayA6IHRydWUsCiAgICAgICAgCiAgICAgICAgbW91c2VvdmVyIDogdHJ1ZSwKICAgICAgICAKICAgICAgICBtb3VzZW91dCA6IHRydWUsCiAgICAgICAgCiAgICAgICAgaXRlbWNsaWNrOiB0cnVlCiAgICB9KTsKICAgIEV4dC5tZW51Lk1lbnVNZ3IucmVnaXN0ZXIodGhpcyk7CiAgICB2YXIgbWlzID0gdGhpcy5pdGVtczsKICAgIHRoaXMuaXRlbXMgPSBuZXcgRXh0LnV0aWwuTWl4ZWRDb2xsZWN0aW9uKCk7CiAgICBpZihtaXMpewogICAgICAgIHRoaXMuYWRkLmFwcGx5KHRoaXMsIG1pcyk7CiAgICB9Cn07CgpFeHQuZXh0ZW5kKEV4dC5tZW51Lk1lbnUsIEV4dC51dGlsLk9ic2VydmFibGUsIHsKICAgIAogICAgbWluV2lkdGggOiAxMjAsCiAgICAKICAgIHNoYWRvdyA6ICJzaWRlcyIsCiAgICAKICAgIHN1Yk1lbnVBbGlnbiA6ICJ0bC10cj8iLAogICAgCiAgICBkZWZhdWx0QWxpZ24gOiAidGwtYmw/IiwKICAgIAogICAgYWxsb3dPdGhlck1lbnVzIDogZmFsc2UsCgogICAgaGlkZGVuOnRydWUsCgogICAgICAgIHJlbmRlciA6IGZ1bmN0aW9uKCl7CiAgICAgICAgaWYodGhpcy5lbCl7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdmFyIGVsID0gdGhpcy5lbCA9IG5ldyBFeHQuTGF5ZXIoewogICAgICAgICAgICBjbHM6ICJ4LW1lbnUiLAogICAgICAgICAgICBzaGFkb3c6dGhpcy5zaGFkb3csCiAgICAgICAgICAgIGNvbnN0cmFpbjogZmFsc2UsCiAgICAgICAgICAgIHBhcmVudEVsOiB0aGlzLnBhcmVudEVsIHx8IGRvY3VtZW50LmJvZHksCiAgICAgICAgICAgIHppbmRleDoxNTAwMAogICAgICAgIH0pOwoKICAgICAgICB0aGlzLmtleU5hdiA9IG5ldyBFeHQubWVudS5NZW51TmF2KHRoaXMpOwoKICAgICAgICBpZih0aGlzLnBsYWluKXsKICAgICAgICAgICAgZWwuYWRkQ2xhc3MoIngtbWVudS1wbGFpbiIpOwogICAgICAgIH0KICAgICAgICBpZih0aGlzLmNscyl7CiAgICAgICAgICAgIGVsLmFkZENsYXNzKHRoaXMuY2xzKTsKICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzRWwgPSBlbC5jcmVhdGVDaGlsZCh7CiAgICAgICAgICAgIHRhZzogImEiLCBjbHM6ICJ4LW1lbnUtZm9jdXMiLCBocmVmOiAiIyIsIG9uY2xpY2s6ICJyZXR1cm4gZmFsc2U7IiwgdGFiSW5kZXg6Ii0xIgogICAgICAgIH0pOwogICAgICAgIHZhciB1bCA9IGVsLmNyZWF0ZUNoaWxkKHt0YWc6ICJ1bCIsIGNsczogIngtbWVudS1saXN0In0pOwogICAgICAgIHVsLm9uKCJjbGljayIsIHRoaXMub25DbGljaywgdGhpcyk7CiAgICAgICAgdWwub24oIm1vdXNlb3ZlciIsIHRoaXMub25Nb3VzZU92ZXIsIHRoaXMpOwogICAgICAgIHVsLm9uKCJtb3VzZW91dCIsIHRoaXMub25Nb3VzZU91dCwgdGhpcyk7CiAgICAgICAgdGhpcy5pdGVtcy5lYWNoKGZ1bmN0aW9uKGl0ZW0pewogICAgICAgICAgICB2YXIgbGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsaSIpOwogICAgICAgICAgICBsaS5jbGFzc05hbWUgPSAieC1tZW51LWxpc3QtaXRlbSI7CiAgICAgICAgICAgIHVsLmRvbS5hcHBlbmRDaGlsZChsaSk7CiAgICAgICAgICAgIGl0ZW0ucmVuZGVyKGxpLCB0aGlzKTsKICAgICAgICB9LCB0aGlzKTsKICAgICAgICB0aGlzLnVsID0gdWw7CiAgICAgICAgdGhpcy5hdXRvV2lkdGgoKTsKICAgIH0sCgogICAgICAgIGF1dG9XaWR0aCA6IGZ1bmN0aW9uKCl7CiAgICAgICAgdmFyIGVsID0gdGhpcy5lbCwgdWwgPSB0aGlzLnVsOwogICAgICAgIGlmKCFlbCl7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdmFyIHcgPSB0aGlzLndpZHRoOwogICAgICAgIGlmKHcpewogICAgICAgICAgICBlbC5zZXRXaWR0aCh3KTsKICAgICAgICB9ZWxzZSBpZihFeHQuaXNJRSl7CiAgICAgICAgICAgIGVsLnNldFdpZHRoKHRoaXMubWluV2lkdGgpOwogICAgICAgICAgICB2YXIgdCA9IGVsLmRvbS5vZmZzZXRXaWR0aDsgICAgICAgICAgICAgZWwuc2V0V2lkdGgodWwuZ2V0V2lkdGgoKStlbC5nZXRGcmFtZVdpZHRoKCJsciIpKTsKICAgICAgICB9CiAgICB9LAoKICAgICAgICBkZWxheUF1dG9XaWR0aCA6IGZ1bmN0aW9uKCl7CiAgICAgICAgaWYodGhpcy5yZW5kZXJlZCl7CiAgICAgICAgICAgIGlmKCF0aGlzLmF3VGFzayl7CiAgICAgICAgICAgICAgICB0aGlzLmF3VGFzayA9IG5ldyBFeHQudXRpbC5EZWxheWVkVGFzayh0aGlzLmF1dG9XaWR0aCwgdGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5hd1Rhc2suZGVsYXkoMjApOwogICAgICAgIH0KICAgIH0sCgogICAgICAgIGZpbmRUYXJnZXRJdGVtIDogZnVuY3Rpb24oZSl7CiAgICAgICAgdmFyIHQgPSBlLmdldFRhcmdldCgiLngtbWVudS1saXN0LWl0ZW0iLCB0aGlzLnVsLCAgdHJ1ZSk7CiAgICAgICAgaWYodCAmJiB0Lm1lbnVJdGVtSWQpewogICAgICAgICAgICByZXR1cm4gdGhpcy5pdGVtcy5nZXQodC5tZW51SXRlbUlkKTsKICAgICAgICB9CiAgICB9LAoKICAgICAgICBvbkNsaWNrIDogZnVuY3Rpb24oZSl7CiAgICAgICAgdmFyIHQ7CiAgICAgICAgaWYodCA9IHRoaXMuZmluZFRhcmdldEl0ZW0oZSkpewogICAgICAgICAgICB0Lm9uQ2xpY2soZSk7CiAgICAgICAgICAgIHRoaXMuZmlyZUV2ZW50KCJjbGljayIsIHRoaXMsIHQsIGUpOwogICAgICAgIH0KICAgIH0sCgogICAgICAgIHNldEFjdGl2ZUl0ZW0gOiBmdW5jdGlvbihpdGVtLCBhdXRvRXhwYW5kKXsKICAgICAgICBpZihpdGVtICE9IHRoaXMuYWN0aXZlSXRlbSl7CiAgICAgICAgICAgIGlmKHRoaXMuYWN0aXZlSXRlbSl7CiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZUl0ZW0uZGVhY3RpdmF0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuYWN0aXZlSXRlbSA9IGl0ZW07CiAgICAgICAgICAgIGl0ZW0uYWN0aXZhdGUoYXV0b0V4cGFuZCk7CiAgICAgICAgfWVsc2UgaWYoYXV0b0V4cGFuZCl7CiAgICAgICAgICAgIGl0ZW0uZXhwYW5kTWVudSgpOwogICAgICAgIH0KICAgIH0sCgogICAgICAgIHRyeUFjdGl2YXRlIDogZnVuY3Rpb24oc3RhcnQsIHN0ZXApewogICAgICAgIHZhciBpdGVtcyA9IHRoaXMuaXRlbXM7CiAgICAgICAgZm9yKHZhciBpID0gc3RhcnQsIGxlbiA9IGl0ZW1zLmxlbmd0aDsgaSA+PSAwICYmIGkgPCBsZW47IGkrPSBzdGVwKXsKICAgICAgICAgICAgdmFyIGl0ZW0gPSBpdGVtcy5nZXQoaSk7CiAgICAgICAgICAgIGlmKCFpdGVtLmRpc2FibGVkICYmIGl0ZW0uY2FuQWN0aXZhdGUpewogICAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVJdGVtKGl0ZW0sIGZhbHNlKTsKICAgICAgICAgICAgICAgIHJldHVybiBpdGVtOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0sCgogICAgICAgIG9uTW91c2VPdmVyIDogZnVuY3Rpb24oZSl7CiAgICAgICAgdmFyIHQ7CiAgICAgICAgaWYodCA9IHRoaXMuZmluZFRhcmdldEl0ZW0oZSkpewogICAgICAgICAgICBpZih0LmNhbkFjdGl2YXRlICYmICF0LmRpc2FibGVkKXsKICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlSXRlbSh0LCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLmZpcmVFdmVudCgibW91c2VvdmVyIiwgdGhpcywgZSwgdCk7CiAgICB9LAoKICAgICAgICBvbk1vdXNlT3V0IDogZnVuY3Rpb24oZSl7CiAgICAgICAgdmFyIHQ7CiAgICAgICAgaWYodCA9IHRoaXMuZmluZFRhcmdldEl0ZW0oZSkpewogICAgICAgICAgICBpZih0ID09IHRoaXMuYWN0aXZlSXRlbSAmJiB0LnNob3VsZERlYWN0aXZhdGUoZSkpewogICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVJdGVtLmRlYWN0aXZhdGUoKTsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmFjdGl2ZUl0ZW07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5maXJlRXZlbnQoIm1vdXNlb3V0IiwgdGhpcywgZSwgdCk7CiAgICB9LAoKICAgIAogICAgaXNWaXNpYmxlIDogZnVuY3Rpb24oKXsKICAgICAgICByZXR1cm4gdGhpcy5lbCAmJiAhdGhpcy5oaWRkZW47CiAgICB9LAoKICAgIAogICAgc2hvdyA6IGZ1bmN0aW9uKGVsLCBwb3MsIHBhcmVudE1lbnUpewogICAgICAgIHRoaXMucGFyZW50TWVudSA9IHBhcmVudE1lbnU7CiAgICAgICAgaWYoIXRoaXMuZWwpewogICAgICAgICAgICB0aGlzLnJlbmRlcigpOwogICAgICAgIH0KICAgICAgICB0aGlzLmZpcmVFdmVudCgiYmVmb3Jlc2hvdyIsIHRoaXMpOwogICAgICAgIHRoaXMuc2hvd0F0KHRoaXMuZWwuZ2V0QWxpZ25Ub1hZKGVsLCBwb3MgfHwgdGhpcy5kZWZhdWx0QWxpZ24pLCBwYXJlbnRNZW51LCBmYWxzZSk7CiAgICB9LAoKICAgIAogICAgc2hvd0F0IDogZnVuY3Rpb24oeHksIHBhcmVudE1lbnUsIF9lKXsKICAgICAgICB0aGlzLnBhcmVudE1lbnUgPSBwYXJlbnRNZW51OwogICAgICAgIGlmKCF0aGlzLmVsKXsKICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTsKICAgICAgICB9CiAgICAgICAgaWYoX2UgIT09IGZhbHNlKXsKICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoImJlZm9yZXNob3ciLCB0aGlzKTsKICAgICAgICAgICAgeHkgPSB0aGlzLmVsLmFkanVzdEZvckNvbnN0cmFpbnRzKHh5KTsKICAgICAgICB9CiAgICAgICAgdGhpcy5lbC5zZXRYWSh4eSk7CiAgICAgICAgdGhpcy5lbC5zaG93KCk7CiAgICAgICAgdGhpcy5oaWRkZW4gPSBmYWxzZTsKICAgICAgICB0aGlzLmZvY3VzKCk7CiAgICAgICAgdGhpcy5maXJlRXZlbnQoInNob3ciLCB0aGlzKTsKICAgIH0sCgogICAgZm9jdXMgOiBmdW5jdGlvbigpewogICAgICAgIGlmKCF0aGlzLmhpZGRlbil7CiAgICAgICAgICAgIHRoaXMuZG9Gb2N1cy5kZWZlcig1MCwgdGhpcyk7CiAgICAgICAgfQogICAgfSwKCiAgICBkb0ZvY3VzIDogZnVuY3Rpb24oKXsKICAgICAgICBpZighdGhpcy5oaWRkZW4pewogICAgICAgICAgICB0aGlzLmZvY3VzRWwuZm9jdXMoKTsKICAgICAgICB9CiAgICB9LAoKICAgIAogICAgaGlkZSA6IGZ1bmN0aW9uKGRlZXApewogICAgICAgIGlmKHRoaXMuZWwgJiYgdGhpcy5pc1Zpc2libGUoKSl7CiAgICAgICAgICAgIHRoaXMuZmlyZUV2ZW50KCJiZWZvcmVoaWRlIiwgdGhpcyk7CiAgICAgICAgICAgIGlmKHRoaXMuYWN0aXZlSXRlbSl7CiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZUl0ZW0uZGVhY3RpdmF0ZSgpOwogICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVJdGVtID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmVsLmhpZGUoKTsKICAgICAgICAgICAgdGhpcy5oaWRkZW4gPSB0cnVlOwogICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgiaGlkZSIsIHRoaXMpOwogICAgICAgIH0KICAgICAgICBpZihkZWVwID09PSB0cnVlICYmIHRoaXMucGFyZW50TWVudSl7CiAgICAgICAgICAgIHRoaXMucGFyZW50TWVudS5oaWRlKHRydWUpOwogICAgICAgIH0KICAgIH0sCgogICAgCiAgICBhZGQgOiBmdW5jdGlvbigpewogICAgICAgIHZhciBhID0gYXJndW1lbnRzLCBsID0gYS5sZW5ndGgsIGl0ZW07CiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGw7IGkrKyl7CiAgICAgICAgICAgIHZhciBlbCA9IGFbaV07CiAgICAgICAgICAgIGlmKGVsLnJlbmRlcil7ICAgICAgICAgICAgICAgICBpdGVtID0gdGhpcy5hZGRJdGVtKGVsKTsKICAgICAgICAgICAgfWVsc2UgaWYodHlwZW9mIGVsID09ICJzdHJpbmciKXsgICAgICAgICAgICAgICAgIGlmKGVsID09ICJzZXBhcmF0b3IiIHx8IGVsID09ICItIil7CiAgICAgICAgICAgICAgICAgICAgaXRlbSA9IHRoaXMuYWRkU2VwYXJhdG9yKCk7CiAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICBpdGVtID0gdGhpcy5hZGRUZXh0KGVsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfWVsc2UgaWYoZWwudGFnTmFtZSB8fCBlbC5lbCl7ICAgICAgICAgICAgICAgICBpdGVtID0gdGhpcy5hZGRFbGVtZW50KGVsKTsKICAgICAgICAgICAgfWVsc2UgaWYodHlwZW9mIGVsID09ICJvYmplY3QiKXsgICAgICAgICAgICAgICAgIGl0ZW0gPSB0aGlzLmFkZE1lbnVJdGVtKGVsKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gaXRlbTsKICAgIH0sCgogICAgCiAgICBnZXRFbCA6IGZ1bmN0aW9uKCl7CiAgICAgICAgaWYoIXRoaXMuZWwpewogICAgICAgICAgICB0aGlzLnJlbmRlcigpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5lbDsKICAgIH0sCgogICAgCiAgICBhZGRTZXBhcmF0b3IgOiBmdW5jdGlvbigpewogICAgICAgIHJldHVybiB0aGlzLmFkZEl0ZW0obmV3IEV4dC5tZW51LlNlcGFyYXRvcigpKTsKICAgIH0sCgogICAgCiAgICBhZGRFbGVtZW50IDogZnVuY3Rpb24oZWwpewogICAgICAgIHJldHVybiB0aGlzLmFkZEl0ZW0obmV3IEV4dC5tZW51LkJhc2VJdGVtKGVsKSk7CiAgICB9LAoKICAgIAogICAgYWRkSXRlbSA6IGZ1bmN0aW9uKGl0ZW0pewogICAgICAgIHRoaXMuaXRlbXMuYWRkKGl0ZW0pOwogICAgICAgIGlmKHRoaXMudWwpewogICAgICAgICAgICB2YXIgbGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsaSIpOwogICAgICAgICAgICBsaS5jbGFzc05hbWUgPSAieC1tZW51LWxpc3QtaXRlbSI7CiAgICAgICAgICAgIHRoaXMudWwuZG9tLmFwcGVuZENoaWxkKGxpKTsKICAgICAgICAgICAgaXRlbS5yZW5kZXIobGksIHRoaXMpOwogICAgICAgICAgICB0aGlzLmRlbGF5QXV0b1dpZHRoKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpdGVtOwogICAgfSwKCiAgICAKICAgIGFkZE1lbnVJdGVtIDogZnVuY3Rpb24oY29uZmlnKXsKICAgICAgICBpZighKGNvbmZpZyBpbnN0YW5jZW9mIEV4dC5tZW51Lkl0ZW0pKXsKICAgICAgICAgICAgaWYodHlwZW9mIGNvbmZpZy5jaGVja2VkID09ICJib29sZWFuIil7ICAgICAgICAgICAgICAgICBjb25maWcgPSBuZXcgRXh0Lm1lbnUuQ2hlY2tJdGVtKGNvbmZpZyk7CiAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgY29uZmlnID0gbmV3IEV4dC5tZW51Lkl0ZW0oY29uZmlnKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5hZGRJdGVtKGNvbmZpZyk7CiAgICB9LAoKICAgIAogICAgYWRkVGV4dCA6IGZ1bmN0aW9uKHRleHQpewogICAgICAgIHJldHVybiB0aGlzLmFkZEl0ZW0obmV3IEV4dC5tZW51LlRleHRJdGVtKHRleHQpKTsKICAgIH0sCgogICAgCiAgICBpbnNlcnQgOiBmdW5jdGlvbihpbmRleCwgaXRlbSl7CiAgICAgICAgdGhpcy5pdGVtcy5pbnNlcnQoaW5kZXgsIGl0ZW0pOwogICAgICAgIGlmKHRoaXMudWwpewogICAgICAgICAgICB2YXIgbGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsaSIpOwogICAgICAgICAgICBsaS5jbGFzc05hbWUgPSAieC1tZW51LWxpc3QtaXRlbSI7CiAgICAgICAgICAgIHRoaXMudWwuZG9tLmluc2VydEJlZm9yZShsaSwgdGhpcy51bC5kb20uY2hpbGROb2Rlc1tpbmRleF0pOwogICAgICAgICAgICBpdGVtLnJlbmRlcihsaSwgdGhpcyk7CiAgICAgICAgICAgIHRoaXMuZGVsYXlBdXRvV2lkdGgoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGl0ZW07CiAgICB9LAoKICAgIAogICAgcmVtb3ZlIDogZnVuY3Rpb24oaXRlbSl7CiAgICAgICAgdGhpcy5pdGVtcy5yZW1vdmVLZXkoaXRlbS5pZCk7CiAgICAgICAgaXRlbS5kZXN0cm95KCk7CiAgICB9LAoKICAgIAogICAgcmVtb3ZlQWxsIDogZnVuY3Rpb24oKXsKICAgICAgICB2YXIgZjsKICAgICAgICB3aGlsZShmID0gdGhpcy5pdGVtcy5maXJzdCgpKXsKICAgICAgICAgICAgdGhpcy5yZW1vdmUoZik7CiAgICAgICAgfQogICAgfQp9KTsKCkV4dC5tZW51Lk1lbnVOYXYgPSBmdW5jdGlvbihtZW51KXsKICAgIEV4dC5tZW51Lk1lbnVOYXYuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIG1lbnUuZWwpOwogICAgdGhpcy5zY29wZSA9IHRoaXMubWVudSA9IG1lbnU7Cn07CgpFeHQuZXh0ZW5kKEV4dC5tZW51Lk1lbnVOYXYsIEV4dC5LZXlOYXYsIHsKICAgIGRvUmVsYXkgOiBmdW5jdGlvbihlLCBoKXsKICAgICAgICB2YXIgayA9IGUuZ2V0S2V5KCk7CiAgICAgICAgaWYoIXRoaXMubWVudS5hY3RpdmVJdGVtICYmIGUuaXNOYXZLZXlQcmVzcygpICYmIGsgIT0gZS5TUEFDRSAmJiBrICE9IGUuUkVUVVJOKXsKICAgICAgICAgICAgdGhpcy5tZW51LnRyeUFjdGl2YXRlKDAsIDEpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiBoLmNhbGwodGhpcy5zY29wZSB8fCB0aGlzLCBlLCB0aGlzLm1lbnUpOwogICAgfSwKCiAgICB1cCA6IGZ1bmN0aW9uKGUsIG0pewogICAgICAgIGlmKCFtLnRyeUFjdGl2YXRlKG0uaXRlbXMuaW5kZXhPZihtLmFjdGl2ZUl0ZW0pLTEsIC0xKSl7CiAgICAgICAgICAgIG0udHJ5QWN0aXZhdGUobS5pdGVtcy5sZW5ndGgtMSwgLTEpOwogICAgICAgIH0KICAgIH0sCgogICAgZG93biA6IGZ1bmN0aW9uKGUsIG0pewogICAgICAgIGlmKCFtLnRyeUFjdGl2YXRlKG0uaXRlbXMuaW5kZXhPZihtLmFjdGl2ZUl0ZW0pKzEsIDEpKXsKICAgICAgICAgICAgbS50cnlBY3RpdmF0ZSgwLCAxKTsKICAgICAgICB9CiAgICB9LAoKICAgIHJpZ2h0IDogZnVuY3Rpb24oZSwgbSl7CiAgICAgICAgaWYobS5hY3RpdmVJdGVtKXsKICAgICAgICAgICAgbS5hY3RpdmVJdGVtLmV4cGFuZE1lbnUodHJ1ZSk7CiAgICAgICAgfQogICAgfSwKCiAgICBsZWZ0IDogZnVuY3Rpb24oZSwgbSl7CiAgICAgICAgbS5oaWRlKCk7CiAgICAgICAgaWYobS5wYXJlbnRNZW51ICYmIG0ucGFyZW50TWVudS5hY3RpdmVJdGVtKXsKICAgICAgICAgICAgbS5wYXJlbnRNZW51LmFjdGl2ZUl0ZW0uYWN0aXZhdGUoKTsKICAgICAgICB9CiAgICB9LAoKICAgIGVudGVyIDogZnVuY3Rpb24oZSwgbSl7CiAgICAgICAgaWYobS5hY3RpdmVJdGVtKXsKICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgbS5hY3RpdmVJdGVtLm9uQ2xpY2soZSk7CiAgICAgICAgICAgIG0uZmlyZUV2ZW50KCJjbGljayIsIHRoaXMsIG0uYWN0aXZlSXRlbSk7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgIH0KfSk7CgpFeHQubWVudS5NZW51TWdyID0gZnVuY3Rpb24oKXsKICAgdmFyIG1lbnVzLCBhY3RpdmUsIGdyb3VwcyA9IHt9LCBhdHRhY2hlZCA9IGZhbHNlLCBsYXN0U2hvdyA9IG5ldyBEYXRlKCk7CgogICAgICBmdW5jdGlvbiBpbml0KCl7CiAgICAgICBtZW51cyA9IHt9OwogICAgICAgYWN0aXZlID0gbmV3IEV4dC51dGlsLk1peGVkQ29sbGVjdGlvbigpOwogICAgICAgRXh0LmdldChkb2N1bWVudCkuYWRkS2V5TGlzdGVuZXIoMjcsIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgaWYoYWN0aXZlLmxlbmd0aCA+IDApewogICAgICAgICAgICAgICBoaWRlQWxsKCk7CiAgICAgICAgICAgfQogICAgICAgfSk7CiAgIH0KCiAgICAgIGZ1bmN0aW9uIGhpZGVBbGwoKXsKICAgICAgIGlmKGFjdGl2ZSAmJiBhY3RpdmUubGVuZ3RoID4gMCl7CiAgICAgICAgICAgdmFyIGMgPSBhY3RpdmUuY2xvbmUoKTsKICAgICAgICAgICBjLmVhY2goZnVuY3Rpb24obSl7CiAgICAgICAgICAgICAgIG0uaGlkZSgpOwogICAgICAgICAgIH0pOwogICAgICAgfQogICB9CgogICAgICBmdW5jdGlvbiBvbkhpZGUobSl7CiAgICAgICBhY3RpdmUucmVtb3ZlKG0pOwogICAgICAgaWYoYWN0aXZlLmxlbmd0aCA8IDEpewogICAgICAgICAgIEV4dC5nZXQoZG9jdW1lbnQpLnVuKCJtb3VzZWRvd24iLCBvbk1vdXNlRG93bik7CiAgICAgICAgICAgYXR0YWNoZWQgPSBmYWxzZTsKICAgICAgIH0KICAgfQoKICAgICAgZnVuY3Rpb24gb25TaG93KG0pewogICAgICAgdmFyIGxhc3QgPSBhY3RpdmUubGFzdCgpOwogICAgICAgbGFzdFNob3cgPSBuZXcgRGF0ZSgpOwogICAgICAgYWN0aXZlLmFkZChtKTsKICAgICAgIGlmKCFhdHRhY2hlZCl7CiAgICAgICAgICAgRXh0LmdldChkb2N1bWVudCkub24oIm1vdXNlZG93biIsIG9uTW91c2VEb3duKTsKICAgICAgICAgICBhdHRhY2hlZCA9IHRydWU7CiAgICAgICB9CiAgICAgICBpZihtLnBhcmVudE1lbnUpewogICAgICAgICAgbS5nZXRFbCgpLnNldFpJbmRleChwYXJzZUludChtLnBhcmVudE1lbnUuZ2V0RWwoKS5nZXRTdHlsZSgiei1pbmRleCIpLCAxMCkgKyAzKTsKICAgICAgICAgIG0ucGFyZW50TWVudS5hY3RpdmVDaGlsZCA9IG07CiAgICAgICB9ZWxzZSBpZihsYXN0ICYmIGxhc3QuaXNWaXNpYmxlKCkpewogICAgICAgICAgbS5nZXRFbCgpLnNldFpJbmRleChwYXJzZUludChsYXN0LmdldEVsKCkuZ2V0U3R5bGUoInotaW5kZXgiKSwgMTApICsgMyk7CiAgICAgICB9CiAgIH0KCiAgICAgIGZ1bmN0aW9uIG9uQmVmb3JlSGlkZShtKXsKICAgICAgIGlmKG0uYWN0aXZlQ2hpbGQpewogICAgICAgICAgIG0uYWN0aXZlQ2hpbGQuaGlkZSgpOwogICAgICAgfQogICAgICAgaWYobS5hdXRvSGlkZVRpbWVyKXsKICAgICAgICAgICBjbGVhclRpbWVvdXQobS5hdXRvSGlkZVRpbWVyKTsKICAgICAgICAgICBkZWxldGUgbS5hdXRvSGlkZVRpbWVyOwogICAgICAgfQogICB9CgogICAgICBmdW5jdGlvbiBvbkJlZm9yZVNob3cobSl7CiAgICAgICB2YXIgcG0gPSBtLnBhcmVudE1lbnU7CiAgICAgICBpZighcG0gJiYgIW0uYWxsb3dPdGhlck1lbnVzKXsKICAgICAgICAgICBoaWRlQWxsKCk7CiAgICAgICB9ZWxzZSBpZihwbSAmJiBwbS5hY3RpdmVDaGlsZCl7CiAgICAgICAgICAgcG0uYWN0aXZlQ2hpbGQuaGlkZSgpOwogICAgICAgfQogICB9CgogICAgICBmdW5jdGlvbiBvbk1vdXNlRG93bihlKXsKICAgICAgIGlmKGxhc3RTaG93LmdldEVsYXBzZWQoKSA+IDUwICYmIGFjdGl2ZS5sZW5ndGggPiAwICYmICFlLmdldFRhcmdldCgiLngtbWVudSIpKXsKICAgICAgICAgICBoaWRlQWxsKCk7CiAgICAgICB9CiAgIH0KCiAgICAgIGZ1bmN0aW9uIG9uQmVmb3JlQ2hlY2sobWksIHN0YXRlKXsKICAgICAgIGlmKHN0YXRlKXsKICAgICAgICAgICB2YXIgZyA9IGdyb3Vwc1ttaS5ncm91cF07CiAgICAgICAgICAgZm9yKHZhciBpID0gMCwgbCA9IGcubGVuZ3RoOyBpIDwgbDsgaSsrKXsKICAgICAgICAgICAgICAgaWYoZ1tpXSAhPSBtaSl7CiAgICAgICAgICAgICAgICAgICBnW2ldLnNldENoZWNrZWQoZmFsc2UpOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgfQogICB9CgogICByZXR1cm4gewoKICAgICAgIAogICAgICAgaGlkZUFsbCA6IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIGhpZGVBbGwoKTsgIAogICAgICAgfSwKCiAgICAgICAgICAgICAgcmVnaXN0ZXIgOiBmdW5jdGlvbihtZW51KXsKICAgICAgICAgICBpZighbWVudXMpewogICAgICAgICAgICAgICBpbml0KCk7CiAgICAgICAgICAgfQogICAgICAgICAgIG1lbnVzW21lbnUuaWRdID0gbWVudTsKICAgICAgICAgICBtZW51Lm9uKCJiZWZvcmVoaWRlIiwgb25CZWZvcmVIaWRlKTsKICAgICAgICAgICBtZW51Lm9uKCJoaWRlIiwgb25IaWRlKTsKICAgICAgICAgICBtZW51Lm9uKCJiZWZvcmVzaG93Iiwgb25CZWZvcmVTaG93KTsKICAgICAgICAgICBtZW51Lm9uKCJzaG93Iiwgb25TaG93KTsKICAgICAgICAgICB2YXIgZyA9IG1lbnUuZ3JvdXA7CiAgICAgICAgICAgaWYoZyAmJiBtZW51LmV2ZW50c1siY2hlY2tjaGFuZ2UiXSl7CiAgICAgICAgICAgICAgIGlmKCFncm91cHNbZ10pewogICAgICAgICAgICAgICAgICAgZ3JvdXBzW2ddID0gW107CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgZ3JvdXBzW2ddLnB1c2gobWVudSk7CiAgICAgICAgICAgICAgIG1lbnUub24oImNoZWNrY2hhbmdlIiwgb25DaGVjayk7CiAgICAgICAgICAgfQogICAgICAgfSwKCiAgICAgICAgCiAgICAgICBnZXQgOiBmdW5jdGlvbihtZW51KXsKICAgICAgICAgICBpZih0eXBlb2YgbWVudSA9PSAic3RyaW5nIil7ICAgICAgICAgICAgICAgIHJldHVybiBtZW51c1ttZW51XTsKICAgICAgICAgICB9ZWxzZSBpZihtZW51LmV2ZW50cyl7ICAgICAgICAgICAgICAgICByZXR1cm4gbWVudTsKICAgICAgICAgICB9ZWxzZSBpZih0eXBlb2YgbWVudS5sZW5ndGggPT0gJ251bWJlcicpeyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4dC5tZW51Lk1lbnUoe2l0ZW1zOm1lbnV9KTsKICAgICAgICAgICB9ZWxzZXsgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHQubWVudS5NZW51KG1lbnUpOwogICAgICAgICAgIH0KICAgICAgIH0sCgogICAgICAgICAgICAgIHVucmVnaXN0ZXIgOiBmdW5jdGlvbihtZW51KXsKICAgICAgICAgICBkZWxldGUgbWVudXNbbWVudS5pZF07CiAgICAgICAgICAgbWVudS51bigiYmVmb3JlaGlkZSIsIG9uQmVmb3JlSGlkZSk7CiAgICAgICAgICAgbWVudS51bigiaGlkZSIsIG9uSGlkZSk7CiAgICAgICAgICAgbWVudS51bigiYmVmb3Jlc2hvdyIsIG9uQmVmb3JlU2hvdyk7CiAgICAgICAgICAgbWVudS51bigic2hvdyIsIG9uU2hvdyk7CiAgICAgICAgICAgdmFyIGcgPSBtZW51Lmdyb3VwOwogICAgICAgICAgIGlmKGcgJiYgbWVudS5ldmVudHNbImNoZWNrY2hhbmdlIl0pewogICAgICAgICAgICAgICBncm91cHNbZ10ucmVtb3ZlKG1lbnUpOwogICAgICAgICAgICAgICBtZW51LnVuKCJjaGVja2NoYW5nZSIsIG9uQ2hlY2spOwogICAgICAgICAgIH0KICAgICAgIH0sCgogICAgICAgICAgICAgIHJlZ2lzdGVyQ2hlY2thYmxlIDogZnVuY3Rpb24obWVudUl0ZW0pewogICAgICAgICAgIHZhciBnID0gbWVudUl0ZW0uZ3JvdXA7CiAgICAgICAgICAgaWYoZyl7CiAgICAgICAgICAgICAgIGlmKCFncm91cHNbZ10pewogICAgICAgICAgICAgICAgICAgZ3JvdXBzW2ddID0gW107CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgZ3JvdXBzW2ddLnB1c2gobWVudUl0ZW0pOwogICAgICAgICAgICAgICBtZW51SXRlbS5vbigiYmVmb3JlY2hlY2tjaGFuZ2UiLCBvbkJlZm9yZUNoZWNrKTsKICAgICAgICAgICB9CiAgICAgICB9LAoKICAgICAgICAgICAgICB1bnJlZ2lzdGVyQ2hlY2thYmxlIDogZnVuY3Rpb24obWVudUl0ZW0pewogICAgICAgICAgIHZhciBnID0gbWVudUl0ZW0uZ3JvdXA7CiAgICAgICAgICAgaWYoZyl7CiAgICAgICAgICAgICAgIGdyb3Vwc1tnXS5yZW1vdmUobWVudUl0ZW0pOwogICAgICAgICAgICAgICBtZW51SXRlbS51bigiYmVmb3JlY2hlY2tjaGFuZ2UiLCBvbkJlZm9yZUNoZWNrKTsKICAgICAgICAgICB9CiAgICAgICB9CiAgIH07Cn0oKTsKCgpFeHQubWVudS5CYXNlSXRlbSA9IGZ1bmN0aW9uKGNvbmZpZyl7CiAgICBFeHQubWVudS5CYXNlSXRlbS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgY29uZmlnKTsKCiAgICB0aGlzLmFkZEV2ZW50cyh7CiAgICAgICAgCiAgICAgICAgY2xpY2s6IHRydWUsCiAgICAgICAgCiAgICAgICAgYWN0aXZhdGUgOiB0cnVlLAogICAgICAgIAogICAgICAgIGRlYWN0aXZhdGUgOiB0cnVlCiAgICB9KTsKCiAgICBpZih0aGlzLmhhbmRsZXIpewogICAgICAgIHRoaXMub24oImNsaWNrIiwgdGhpcy5oYW5kbGVyLCB0aGlzLnNjb3BlLCB0cnVlKTsKICAgIH0KfTsKCkV4dC5leHRlbmQoRXh0Lm1lbnUuQmFzZUl0ZW0sIEV4dC5Db21wb25lbnQsIHsKICAgIAogICAgCiAgICBjYW5BY3RpdmF0ZSA6IGZhbHNlLAogICAgCiAgICBhY3RpdmVDbGFzcyA6ICJ4LW1lbnUtaXRlbS1hY3RpdmUiLAogICAgCiAgICBoaWRlT25DbGljayA6IHRydWUsCiAgICAKICAgIGhpZGVEZWxheSA6IDEwMCwKCiAgICAgICAgY3R5cGU6ICJFeHQubWVudS5CYXNlSXRlbSIsCgogICAgICAgIGFjdGlvbk1vZGUgOiAiY29udGFpbmVyIiwKCiAgICAgICAgcmVuZGVyIDogZnVuY3Rpb24oY29udGFpbmVyLCBwYXJlbnRNZW51KXsKICAgICAgICB0aGlzLnBhcmVudE1lbnUgPSBwYXJlbnRNZW51OwogICAgICAgIEV4dC5tZW51LkJhc2VJdGVtLnN1cGVyY2xhc3MucmVuZGVyLmNhbGwodGhpcywgY29udGFpbmVyKTsKICAgICAgICB0aGlzLmNvbnRhaW5lci5tZW51SXRlbUlkID0gdGhpcy5pZDsKICAgIH0sCgogICAgICAgIG9uUmVuZGVyIDogZnVuY3Rpb24oY29udGFpbmVyLCBwb3NpdGlvbil7CiAgICAgICAgdGhpcy5lbCA9IEV4dC5nZXQodGhpcy5lbCk7CiAgICAgICAgY29udGFpbmVyLmRvbS5hcHBlbmRDaGlsZCh0aGlzLmVsLmRvbSk7CiAgICB9LAoKICAgICAgICBvbkNsaWNrIDogZnVuY3Rpb24oZSl7CiAgICAgICAgaWYoIXRoaXMuZGlzYWJsZWQgJiYgdGhpcy5maXJlRXZlbnQoImNsaWNrIiwgdGhpcywgZSkgIT09IGZhbHNlCiAgICAgICAgICAgICAgICAmJiB0aGlzLnBhcmVudE1lbnUuZmlyZUV2ZW50KCJpdGVtY2xpY2siLCB0aGlzLCBlKSAhPT0gZmFsc2UpewogICAgICAgICAgICB0aGlzLmhhbmRsZUNsaWNrKGUpOwogICAgICAgIH1lbHNlewogICAgICAgICAgICBlLnN0b3BFdmVudCgpOwogICAgICAgIH0KICAgIH0sCgogICAgICAgIGFjdGl2YXRlIDogZnVuY3Rpb24oKXsKICAgICAgICBpZih0aGlzLmRpc2FibGVkKXsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICB2YXIgbGkgPSB0aGlzLmNvbnRhaW5lcjsKICAgICAgICBsaS5hZGRDbGFzcyh0aGlzLmFjdGl2ZUNsYXNzKTsKICAgICAgICB0aGlzLnJlZ2lvbiA9IGxpLmdldFJlZ2lvbigpLmFkanVzdCgyLCAyLCAtMiwgLTIpOwogICAgICAgIHRoaXMuZmlyZUV2ZW50KCJhY3RpdmF0ZSIsIHRoaXMpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfSwKCiAgICAgICAgZGVhY3RpdmF0ZSA6IGZ1bmN0aW9uKCl7CiAgICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlQ2xhc3ModGhpcy5hY3RpdmVDbGFzcyk7CiAgICAgICAgdGhpcy5maXJlRXZlbnQoImRlYWN0aXZhdGUiLCB0aGlzKTsKICAgIH0sCgogICAgICAgIHNob3VsZERlYWN0aXZhdGUgOiBmdW5jdGlvbihlKXsKICAgICAgICByZXR1cm4gIXRoaXMucmVnaW9uIHx8ICF0aGlzLnJlZ2lvbi5jb250YWlucyhlLmdldFBvaW50KCkpOwogICAgfSwKCiAgICAgICAgaGFuZGxlQ2xpY2sgOiBmdW5jdGlvbihlKXsKICAgICAgICBpZih0aGlzLmhpZGVPbkNsaWNrKXsKICAgICAgICAgICAgdGhpcy5wYXJlbnRNZW51LmhpZGUuZGVmZXIodGhpcy5oaWRlRGVsYXksIHRoaXMucGFyZW50TWVudSwgW3RydWVdKTsKICAgICAgICB9CiAgICB9LAoKICAgICAgICBleHBhbmRNZW51IDogZnVuY3Rpb24oYXV0b0FjdGl2YXRlKXsKICAgICAgICAgICAgfSwKCiAgICAgICAgaGlkZU1lbnUgOiBmdW5jdGlvbigpewogICAgICAgICAgICB9Cn0pOwoKRXh0Lm1lbnUuVGV4dEl0ZW0gPSBmdW5jdGlvbih0ZXh0KXsKICAgIHRoaXMudGV4dCA9IHRleHQ7CiAgICBFeHQubWVudS5UZXh0SXRlbS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7Cn07CgpFeHQuZXh0ZW5kKEV4dC5tZW51LlRleHRJdGVtLCBFeHQubWVudS5CYXNlSXRlbSwgewogICAgCiAgICBoaWRlT25DbGljayA6IGZhbHNlLAogICAgCiAgICBpdGVtQ2xzIDogIngtbWVudS10ZXh0IiwKCiAgICAgICAgb25SZW5kZXIgOiBmdW5jdGlvbigpewogICAgICAgIHZhciBzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOwogICAgICAgIHMuY2xhc3NOYW1lID0gdGhpcy5pdGVtQ2xzOwogICAgICAgIHMuaW5uZXJIVE1MID0gdGhpcy50ZXh0OwogICAgICAgIHRoaXMuZWwgPSBzOwogICAgICAgIEV4dC5tZW51LlRleHRJdGVtLnN1cGVyY2xhc3Mub25SZW5kZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIH0KfSk7CgpFeHQubWVudS5TZXBhcmF0b3IgPSBmdW5jdGlvbihjb25maWcpewogICAgRXh0Lm1lbnUuU2VwYXJhdG9yLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBjb25maWcpOwp9OwoKRXh0LmV4dGVuZChFeHQubWVudS5TZXBhcmF0b3IsIEV4dC5tZW51LkJhc2VJdGVtLCB7CiAgICAKICAgIGl0ZW1DbHMgOiAieC1tZW51LXNlcCIsCiAgICAKICAgIGhpZGVPbkNsaWNrIDogZmFsc2UsCgogICAgICAgIG9uUmVuZGVyIDogZnVuY3Rpb24obGkpewogICAgICAgIHZhciBzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOwogICAgICAgIHMuY2xhc3NOYW1lID0gdGhpcy5pdGVtQ2xzOwogICAgICAgIHMuaW5uZXJIVE1MID0gIiYjMTYwOyI7CiAgICAgICAgdGhpcy5lbCA9IHM7CiAgICAgICAgbGkuYWRkQ2xhc3MoIngtbWVudS1zZXAtbGkiKTsKICAgICAgICBFeHQubWVudS5TZXBhcmF0b3Iuc3VwZXJjbGFzcy5vblJlbmRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfQp9KTsKCkV4dC5tZW51Lkl0ZW0gPSBmdW5jdGlvbihjb25maWcpewogICAgRXh0Lm1lbnUuSXRlbS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgY29uZmlnKTsKICAgIGlmKHRoaXMubWVudSl7CiAgICAgICAgdGhpcy5tZW51ID0gRXh0Lm1lbnUuTWVudU1nci5nZXQodGhpcy5tZW51KTsKICAgIH0KfTsKRXh0LmV4dGVuZChFeHQubWVudS5JdGVtLCBFeHQubWVudS5CYXNlSXRlbSwgewogICAgCiAgICAKICAgIGl0ZW1DbHMgOiAieC1tZW51LWl0ZW0iLAogICAgCiAgICBjYW5BY3RpdmF0ZSA6IHRydWUsCiAgICAKICAgIHNob3dEZWxheTogMjAwLAogICAgICAgIGhpZGVEZWxheTogMjAwLAoKICAgICAgICBjdHlwZTogIkV4dC5tZW51Lkl0ZW0iLAogICAgCiAgICAgICAgb25SZW5kZXIgOiBmdW5jdGlvbihjb250YWluZXIsIHBvc2l0aW9uKXsKICAgICAgICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7CiAgICAgICAgZWwuaGlkZUZvY3VzID0gdHJ1ZTsKICAgICAgICBlbC51bnNlbGVjdGFibGUgPSAib24iOwogICAgICAgIGVsLmhyZWYgPSB0aGlzLmhyZWYgfHwgIiMiOwogICAgICAgIGlmKHRoaXMuaHJlZlRhcmdldCl7CiAgICAgICAgICAgIGVsLnRhcmdldCA9IHRoaXMuaHJlZlRhcmdldDsKICAgICAgICB9CiAgICAgICAgZWwuY2xhc3NOYW1lID0gdGhpcy5pdGVtQ2xzICsgKHRoaXMubWVudSA/ICAiIHgtbWVudS1pdGVtLWFycm93IiA6ICIiKSArICh0aGlzLmNscyA/ICAiICIgKyB0aGlzLmNscyA6ICIiKTsKICAgICAgICBlbC5pbm5lckhUTUwgPSBTdHJpbmcuZm9ybWF0KAogICAgICAgICAgICAgICAgJzxpbWcgc3JjPSJ7MH0iIGNsYXNzPSJ4LW1lbnUtaXRlbS1pY29uIHsyfSIgLz57MX0nLAogICAgICAgICAgICAgICAgdGhpcy5pY29uIHx8IEV4dC5CTEFOS19JTUFHRV9VUkwsIHRoaXMudGV4dCwgdGhpcy5pY29uQ2xzIHx8ICcnKTsKICAgICAgICB0aGlzLmVsID0gZWw7CiAgICAgICAgRXh0Lm1lbnUuSXRlbS5zdXBlcmNsYXNzLm9uUmVuZGVyLmNhbGwodGhpcywgY29udGFpbmVyLCBwb3NpdGlvbik7CiAgICB9LAoKICAgIAogICAgc2V0VGV4dCA6IGZ1bmN0aW9uKHRleHQpewogICAgICAgIHRoaXMudGV4dCA9IHRleHQ7CiAgICAgICAgaWYodGhpcy5yZW5kZXJlZCl7CiAgICAgICAgICAgIHRoaXMuZWwudXBkYXRlKFN0cmluZy5mb3JtYXQoCiAgICAgICAgICAgICAgICAnPGltZyBzcmM9InswfSIgY2xhc3M9IngtbWVudS1pdGVtLWljb24gezJ9Ij57MX0nLAogICAgICAgICAgICAgICAgdGhpcy5pY29uIHx8IEV4dC5CTEFOS19JTUFHRV9VUkwsIHRoaXMudGV4dCwgdGhpcy5pY29uQ2xzIHx8ICcnKSk7CiAgICAgICAgICAgIHRoaXMucGFyZW50TWVudS5hdXRvV2lkdGgoKTsKICAgICAgICB9CiAgICB9LAoKICAgICAgICBoYW5kbGVDbGljayA6IGZ1bmN0aW9uKGUpewogICAgICAgIGlmKCF0aGlzLmhyZWYpeyAgICAgICAgICAgICBlLnN0b3BFdmVudCgpOwogICAgICAgIH0KICAgICAgICBFeHQubWVudS5JdGVtLnN1cGVyY2xhc3MuaGFuZGxlQ2xpY2suYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIH0sCgogICAgICAgIGFjdGl2YXRlIDogZnVuY3Rpb24oYXV0b0V4cGFuZCl7CiAgICAgICAgaWYoRXh0Lm1lbnUuSXRlbS5zdXBlcmNsYXNzLmFjdGl2YXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpewogICAgICAgICAgICB0aGlzLmZvY3VzKCk7CiAgICAgICAgICAgIGlmKGF1dG9FeHBhbmQpewogICAgICAgICAgICAgICAgdGhpcy5leHBhbmRNZW51KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9LAoKICAgICAgICBzaG91bGREZWFjdGl2YXRlIDogZnVuY3Rpb24oZSl7CiAgICAgICAgaWYoRXh0Lm1lbnUuSXRlbS5zdXBlcmNsYXNzLnNob3VsZERlYWN0aXZhdGUuY2FsbCh0aGlzLCBlKSl7CiAgICAgICAgICAgIGlmKHRoaXMubWVudSAmJiB0aGlzLm1lbnUuaXNWaXNpYmxlKCkpewogICAgICAgICAgICAgICAgcmV0dXJuICF0aGlzLm1lbnUuZ2V0RWwoKS5nZXRSZWdpb24oKS5jb250YWlucyhlLmdldFBvaW50KCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9LAoKICAgICAgICBkZWFjdGl2YXRlIDogZnVuY3Rpb24oKXsKICAgICAgICBFeHQubWVudS5JdGVtLnN1cGVyY2xhc3MuZGVhY3RpdmF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIHRoaXMuaGlkZU1lbnUoKTsKICAgIH0sCgogICAgICAgIGV4cGFuZE1lbnUgOiBmdW5jdGlvbihhdXRvQWN0aXZhdGUpewogICAgICAgIGlmKCF0aGlzLmRpc2FibGVkICYmIHRoaXMubWVudSl7CiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmhpZGVUaW1lcik7CiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmhpZGVUaW1lcjsKICAgICAgICAgICAgaWYoIXRoaXMubWVudS5pc1Zpc2libGUoKSAmJiAhdGhpcy5zaG93VGltZXIpewogICAgICAgICAgICAgICAgdGhpcy5zaG93VGltZXIgPSB0aGlzLmRlZmVyRXhwYW5kLmRlZmVyKHRoaXMuc2hvd0RlbGF5LCB0aGlzLCBbYXV0b0FjdGl2YXRlXSk7CiAgICAgICAgICAgIH1lbHNlIGlmICh0aGlzLm1lbnUuaXNWaXNpYmxlKCkgJiYgYXV0b0FjdGl2YXRlKXsKICAgICAgICAgICAgICAgIHRoaXMubWVudS50cnlBY3RpdmF0ZSgwLCAxKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0sCgogICAgICAgIGRlZmVyRXhwYW5kIDogZnVuY3Rpb24oYXV0b0FjdGl2YXRlKXsKICAgICAgICBkZWxldGUgdGhpcy5zaG93VGltZXI7CiAgICAgICAgdGhpcy5tZW51LnNob3codGhpcy5jb250YWluZXIsIHRoaXMucGFyZW50TWVudS5zdWJNZW51QWxpZ24gfHwgInRsLXRyPyIsIHRoaXMucGFyZW50TWVudSk7CiAgICAgICAgaWYoYXV0b0FjdGl2YXRlKXsKICAgICAgICAgICAgdGhpcy5tZW51LnRyeUFjdGl2YXRlKDAsIDEpOwogICAgICAgIH0KICAgIH0sCgogICAgICAgIGhpZGVNZW51IDogZnVuY3Rpb24oKXsKICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5zaG93VGltZXIpOwogICAgICAgIGRlbGV0ZSB0aGlzLnNob3dUaW1lcjsKICAgICAgICBpZighdGhpcy5oaWRlVGltZXIgJiYgdGhpcy5tZW51ICYmIHRoaXMubWVudS5pc1Zpc2libGUoKSl7CiAgICAgICAgICAgIHRoaXMuaGlkZVRpbWVyID0gdGhpcy5kZWZlckhpZGUuZGVmZXIodGhpcy5oaWRlRGVsYXksIHRoaXMpOwogICAgICAgIH0KICAgIH0sCgogICAgICAgIGRlZmVySGlkZSA6IGZ1bmN0aW9uKCl7CiAgICAgICAgZGVsZXRlIHRoaXMuaGlkZVRpbWVyOwogICAgICAgIHRoaXMubWVudS5oaWRlKCk7CiAgICB9Cn0pOwoKRXh0Lm1lbnUuQ2hlY2tJdGVtID0gZnVuY3Rpb24oY29uZmlnKXsKICAgIEV4dC5tZW51LkNoZWNrSXRlbS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgY29uZmlnKTsKICAgIHRoaXMuYWRkRXZlbnRzKHsKICAgICAgICAKICAgICAgICAiYmVmb3JlY2hlY2tjaGFuZ2UiIDogdHJ1ZSwKICAgICAgICAKICAgICAgICAiY2hlY2tjaGFuZ2UiIDogdHJ1ZQogICAgfSk7CiAgICBpZih0aGlzLmNoZWNrSGFuZGxlcil7CiAgICAgICAgdGhpcy5vbignY2hlY2tjaGFuZ2UnLCB0aGlzLmNoZWNrSGFuZGxlciwgdGhpcy5zY29wZSk7CiAgICB9Cn07CkV4dC5leHRlbmQoRXh0Lm1lbnUuQ2hlY2tJdGVtLCBFeHQubWVudS5JdGVtLCB7CiAgICAKICAgIAogICAgaXRlbUNscyA6ICJ4LW1lbnUtaXRlbSB4LW1lbnUtY2hlY2staXRlbSIsCiAgICAKICAgIGdyb3VwQ2xhc3MgOiAieC1tZW51LWdyb3VwLWl0ZW0iLAoKICAgIAogICAgY2hlY2tlZDogZmFsc2UsCgogICAgICAgIGN0eXBlOiAiRXh0Lm1lbnUuQ2hlY2tJdGVtIiwKCiAgICAgICAgb25SZW5kZXIgOiBmdW5jdGlvbihjKXsKICAgICAgICBFeHQubWVudS5DaGVja0l0ZW0uc3VwZXJjbGFzcy5vblJlbmRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIGlmKHRoaXMuZ3JvdXApewogICAgICAgICAgICB0aGlzLmVsLmFkZENsYXNzKHRoaXMuZ3JvdXBDbGFzcyk7CiAgICAgICAgfQogICAgICAgIEV4dC5tZW51Lk1lbnVNZ3IucmVnaXN0ZXJDaGVja2FibGUodGhpcyk7CiAgICAgICAgaWYodGhpcy5jaGVja2VkKXsKICAgICAgICAgICAgdGhpcy5jaGVja2VkID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuc2V0Q2hlY2tlZCh0cnVlLCB0cnVlKTsKICAgICAgICB9CiAgICB9LAoKICAgICAgICBkZXN0cm95IDogZnVuY3Rpb24oKXsKICAgICAgICBpZih0aGlzLnJlbmRlcmVkKXsKICAgICAgICAgICAgRXh0Lm1lbnUuTWVudU1nci51bnJlZ2lzdGVyQ2hlY2thYmxlKHRoaXMpOwogICAgICAgIH0KICAgICAgICBFeHQubWVudS5DaGVja0l0ZW0uc3VwZXJjbGFzcy5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9LAoKICAgIAogICAgc2V0Q2hlY2tlZCA6IGZ1bmN0aW9uKHN0YXRlLCBzdXBwcmVzc0V2ZW50KXsKICAgICAgICBpZih0aGlzLmNoZWNrZWQgIT0gc3RhdGUgJiYgdGhpcy5maXJlRXZlbnQoImJlZm9yZWNoZWNrY2hhbmdlIiwgdGhpcywgc3RhdGUpICE9PSBmYWxzZSl7CiAgICAgICAgICAgIGlmKHRoaXMuY29udGFpbmVyKXsKICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyW3N0YXRlID8gImFkZENsYXNzIiA6ICJyZW1vdmVDbGFzcyJdKCJ4LW1lbnUtaXRlbS1jaGVja2VkIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5jaGVja2VkID0gc3RhdGU7CiAgICAgICAgICAgIGlmKHN1cHByZXNzRXZlbnQgIT09IHRydWUpewogICAgICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoImNoZWNrY2hhbmdlIiwgdGhpcywgc3RhdGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSwKCiAgICAgICAgaGFuZGxlQ2xpY2sgOiBmdW5jdGlvbihlKXsKICAgICAgIGlmKCF0aGlzLmRpc2FibGVkICYmICEodGhpcy5jaGVja2VkICYmIHRoaXMuZ3JvdXApKXsgICAgICAgICAgIHRoaXMuc2V0Q2hlY2tlZCghdGhpcy5jaGVja2VkKTsKICAgICAgIH0KICAgICAgIEV4dC5tZW51LkNoZWNrSXRlbS5zdXBlcmNsYXNzLmhhbmRsZUNsaWNrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9Cn0pOwoKRXh0Lm1lbnUuQWRhcHRlciA9IGZ1bmN0aW9uKGNvbXBvbmVudCwgY29uZmlnKXsKICAgIEV4dC5tZW51LkFkYXB0ZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIGNvbmZpZyk7CiAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDsKfTsKRXh0LmV4dGVuZChFeHQubWVudS5BZGFwdGVyLCBFeHQubWVudS5CYXNlSXRlbSwgewogICAgICAgIGNhbkFjdGl2YXRlIDogdHJ1ZSwKCiAgICAgICAgb25SZW5kZXIgOiBmdW5jdGlvbihjb250YWluZXIsIHBvc2l0aW9uKXsKICAgICAgICB0aGlzLmNvbXBvbmVudC5yZW5kZXIoY29udGFpbmVyKTsKICAgICAgICB0aGlzLmVsID0gdGhpcy5jb21wb25lbnQuZ2V0RWwoKTsKICAgIH0sCgogICAgICAgIGFjdGl2YXRlIDogZnVuY3Rpb24oKXsKICAgICAgICBpZih0aGlzLmRpc2FibGVkKXsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICB0aGlzLmNvbXBvbmVudC5mb2N1cygpOwogICAgICAgIHRoaXMuZmlyZUV2ZW50KCJhY3RpdmF0ZSIsIHRoaXMpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfSwKCiAgICAgICAgZGVhY3RpdmF0ZSA6IGZ1bmN0aW9uKCl7CiAgICAgICAgdGhpcy5maXJlRXZlbnQoImRlYWN0aXZhdGUiLCB0aGlzKTsKICAgIH0sCgogICAgICAgIGRpc2FibGUgOiBmdW5jdGlvbigpewogICAgICAgIHRoaXMuY29tcG9uZW50LmRpc2FibGUoKTsKICAgICAgICBFeHQubWVudS5BZGFwdGVyLnN1cGVyY2xhc3MuZGlzYWJsZS5jYWxsKHRoaXMpOwogICAgfSwKCiAgICAgICAgZW5hYmxlIDogZnVuY3Rpb24oKXsKICAgICAgICB0aGlzLmNvbXBvbmVudC5lbmFibGUoKTsKICAgICAgICBFeHQubWVudS5BZGFwdGVyLnN1cGVyY2xhc3MuZW5hYmxlLmNhbGwodGhpcyk7CiAgICB9Cn0pOwoKRXh0Lm1lbnUuRGF0ZUl0ZW0gPSBmdW5jdGlvbihjb25maWcpewogICAgRXh0Lm1lbnUuRGF0ZUl0ZW0uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIG5ldyBFeHQuRGF0ZVBpY2tlcihjb25maWcpLCBjb25maWcpOwogICAgCiAgICB0aGlzLnBpY2tlciA9IHRoaXMuY29tcG9uZW50OwogICAgdGhpcy5hZGRFdmVudHMoe3NlbGVjdDogdHJ1ZX0pOwogICAgCiAgICB0aGlzLnBpY2tlci5vbigicmVuZGVyIiwgZnVuY3Rpb24ocGlja2VyKXsKICAgICAgICBwaWNrZXIuZ2V0RWwoKS5zd2FsbG93RXZlbnQoImNsaWNrIik7CiAgICAgICAgcGlja2VyLmNvbnRhaW5lci5hZGRDbGFzcygieC1tZW51LWRhdGUtaXRlbSIpOwogICAgfSk7CgogICAgdGhpcy5waWNrZXIub24oInNlbGVjdCIsIHRoaXMub25TZWxlY3QsIHRoaXMpOwp9OwoKRXh0LmV4dGVuZChFeHQubWVudS5EYXRlSXRlbSwgRXh0Lm1lbnUuQWRhcHRlciwgewogICAgICAgIG9uU2VsZWN0IDogZnVuY3Rpb24ocGlja2VyLCBkYXRlKXsKICAgICAgICB0aGlzLmZpcmVFdmVudCgic2VsZWN0IiwgdGhpcywgZGF0ZSwgcGlja2VyKTsKICAgICAgICBFeHQubWVudS5EYXRlSXRlbS5zdXBlcmNsYXNzLmhhbmRsZUNsaWNrLmNhbGwodGhpcyk7CiAgICB9Cn0pOwoKRXh0Lm1lbnUuQ29sb3JJdGVtID0gZnVuY3Rpb24oY29uZmlnKXsKICAgIEV4dC5tZW51LkNvbG9ySXRlbS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgbmV3IEV4dC5Db2xvclBhbGV0dGUoY29uZmlnKSwgY29uZmlnKTsKICAgIAogICAgdGhpcy5wYWxldHRlID0gdGhpcy5jb21wb25lbnQ7CiAgICB0aGlzLnJlbGF5RXZlbnRzKHRoaXMucGFsZXR0ZSwgWyJzZWxlY3QiXSk7CiAgICBpZih0aGlzLnNlbGVjdEhhbmRsZXIpewogICAgICAgIHRoaXMub24oJ3NlbGVjdCcsIHRoaXMuc2VsZWN0SGFuZGxlciwgdGhpcy5zY29wZSk7CiAgICB9Cn07CkV4dC5leHRlbmQoRXh0Lm1lbnUuQ29sb3JJdGVtLCBFeHQubWVudS5BZGFwdGVyKTsKCkV4dC5tZW51LkRhdGVNZW51ID0gZnVuY3Rpb24oY29uZmlnKXsKICAgIEV4dC5tZW51LkRhdGVNZW51LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBjb25maWcpOwogICAgdGhpcy5wbGFpbiA9IHRydWU7CiAgICB2YXIgZGkgPSBuZXcgRXh0Lm1lbnUuRGF0ZUl0ZW0oY29uZmlnKTsKICAgIHRoaXMuYWRkKGRpKTsKICAgIAogICAgdGhpcy5waWNrZXIgPSBkaS5waWNrZXI7CiAgICAKICAgIHRoaXMucmVsYXlFdmVudHMoZGksIFsic2VsZWN0Il0pOwoKICAgIHRoaXMub24oJ2JlZm9yZXNob3cnLCBmdW5jdGlvbigpewogICAgICAgIGlmKHRoaXMucGlja2VyKXsKICAgICAgICAgICAgdGhpcy5waWNrZXIuaGlkZU1vbnRoUGlja2VyKHRydWUpOwogICAgICAgIH0KICAgIH0sIHRoaXMpOwp9OwpFeHQuZXh0ZW5kKEV4dC5tZW51LkRhdGVNZW51LCBFeHQubWVudS5NZW51LCB7CiAgICBjbHM6J3gtZGF0ZS1tZW51Jwp9KTsKCkV4dC5tZW51LkNvbG9yTWVudSA9IGZ1bmN0aW9uKGNvbmZpZyl7CiAgICBFeHQubWVudS5Db2xvck1lbnUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIGNvbmZpZyk7CiAgICB0aGlzLnBsYWluID0gdHJ1ZTsKICAgIHZhciBjaSA9IG5ldyBFeHQubWVudS5Db2xvckl0ZW0oY29uZmlnKTsKICAgIHRoaXMuYWRkKGNpKTsKICAgIAogICAgdGhpcy5wYWxldHRlID0gY2kucGFsZXR0ZTsKICAgIAogICAgdGhpcy5yZWxheUV2ZW50cyhjaSwgWyJzZWxlY3QiXSk7Cn07CkV4dC5leHRlbmQoRXh0Lm1lbnUuQ29sb3JNZW51LCBFeHQubWVudS5NZW51KTsKCkV4dC5mb3JtLkZpZWxkID0gZnVuY3Rpb24oY29uZmlnKXsKICAgIEV4dC5mb3JtLkZpZWxkLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBjb25maWcpOwp9OwoKRXh0LmV4dGVuZChFeHQuZm9ybS5GaWVsZCwgRXh0LkJveENvbXBvbmVudCwgIHsKICAgIAogICAgaW52YWxpZENsYXNzIDogIngtZm9ybS1pbnZhbGlkIiwKICAgIAogICAgaW52YWxpZFRleHQgOiAiVGhlIHZhbHVlIGluIHRoaXMgZmllbGQgaXMgaW52YWxpZCIsCiAgICAKICAgIGZvY3VzQ2xhc3MgOiAieC1mb3JtLWZvY3VzIiwKICAgIAogICAgdmFsaWRhdGlvbkV2ZW50IDogImtleXVwIiwKICAgIAogICAgdmFsaWRhdGVPbkJsdXIgOiB0cnVlLAogICAgCiAgICB2YWxpZGF0aW9uRGVsYXkgOiAyNTAsCiAgICAKICAgIGRlZmF1bHRBdXRvQ3JlYXRlIDoge3RhZzogImlucHV0IiwgdHlwZTogInRleHQiLCBzaXplOiAiMjAiLCBhdXRvY29tcGxldGU6ICJvZmYifSwKICAgIAogICAgZmllbGRDbGFzcyA6ICJ4LWZvcm0tZmllbGQiLAogICAgCiAgICBtc2dUYXJnZXQgOiAncXRpcCcsCiAgICAKICAgIG1zZ0Z4IDogJ25vcm1hbCcsCgogICAgCiAgICByZWFkT25seSA6IGZhbHNlLAoKICAgIAogICAgZGlzYWJsZWQgOiBmYWxzZSwKCiAgICAKICAgIGlucHV0VHlwZSA6IHVuZGVmaW5lZCwKICAgIAogICAgCgl0YWJJbmRleCA6IHVuZGVmaW5lZCwKCQogICAgICAgIGlzRm9ybUZpZWxkIDogdHJ1ZSwKCiAgICAgICAgaGFzRm9jdXMgOiBmYWxzZSwKCiAgICAKICAgIHZhbHVlIDogdW5kZWZpbmVkLAoKICAgIAogICAgCgoJCWluaXRDb21wb25lbnQgOiBmdW5jdGlvbigpewogICAgICAgIEV4dC5mb3JtLkZpZWxkLnN1cGVyY2xhc3MuaW5pdENvbXBvbmVudC5jYWxsKHRoaXMpOwogICAgICAgIHRoaXMuYWRkRXZlbnRzKHsKICAgICAgICAgICAgCiAgICAgICAgICAgIGZvY3VzIDogdHJ1ZSwKICAgICAgICAgICAgCiAgICAgICAgICAgIGJsdXIgOiB0cnVlLAogICAgICAgICAgICAKICAgICAgICAgICAgc3BlY2lhbGtleSA6IHRydWUsCiAgICAgICAgICAgIAogICAgICAgICAgICBjaGFuZ2UgOiB0cnVlLAogICAgICAgICAgICAKICAgICAgICAgICAgaW52YWxpZCA6IHRydWUsCiAgICAgICAgICAgIAogICAgICAgICAgICB2YWxpZCA6IHRydWUKICAgICAgICB9KTsKICAgIH0sCgogICAgCiAgICBnZXROYW1lOiBmdW5jdGlvbigpewogICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJlZCAmJiB0aGlzLmVsLmRvbS5uYW1lID8gdGhpcy5lbC5kb20ubmFtZSA6ICh0aGlzLmhpZGRlbk5hbWUgfHwgJycpOwogICAgfSwKCiAgICAgICAgb25SZW5kZXIgOiBmdW5jdGlvbihjdCwgcG9zaXRpb24pewogICAgICAgIEV4dC5mb3JtLkZpZWxkLnN1cGVyY2xhc3Mub25SZW5kZXIuY2FsbCh0aGlzLCBjdCwgcG9zaXRpb24pOwogICAgICAgIGlmKCF0aGlzLmVsKXsKICAgICAgICAgICAgdmFyIGNmZyA9IHRoaXMuZ2V0QXV0b0NyZWF0ZSgpOwogICAgICAgICAgICBpZighY2ZnLm5hbWUpewogICAgICAgICAgICAgICAgY2ZnLm5hbWUgPSB0aGlzLm5hbWUgfHwgdGhpcy5pZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZih0aGlzLmlucHV0VHlwZSl7CiAgICAgICAgICAgICAgICBjZmcudHlwZSA9IHRoaXMuaW5wdXRUeXBlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuZWwgPSBjdC5jcmVhdGVDaGlsZChjZmcsIHBvc2l0aW9uKTsKICAgICAgICB9CiAgICAgICAgdmFyIHR5cGUgPSB0aGlzLmVsLmRvbS50eXBlOwogICAgICAgIGlmKHR5cGUpewogICAgICAgICAgICBpZih0eXBlID09ICdwYXNzd29yZCcpewogICAgICAgICAgICAgICAgdHlwZSA9ICd0ZXh0JzsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmVsLmFkZENsYXNzKCd4LWZvcm0tJyt0eXBlKTsKICAgICAgICB9CiAgICAgICAgaWYodGhpcy5yZWFkT25seSl7CiAgICAgICAgICAgIHRoaXMuZWwuZG9tLnJlYWRPbmx5ID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYodGhpcy50YWJJbmRleCAhPT0gdW5kZWZpbmVkKXsKICAgICAgICAgICAgdGhpcy5lbC5kb20uc2V0QXR0cmlidXRlKCd0YWJJbmRleCcsIHRoaXMudGFiSW5kZXgpOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5lbC5hZGRDbGFzcyhbdGhpcy5maWVsZENsYXNzLCB0aGlzLmNsc10pOwogICAgICAgIHRoaXMuaW5pdFZhbHVlKCk7CiAgICB9LAoKICAgIAogICAgYXBwbHlUbyA6IGZ1bmN0aW9uKHRhcmdldCl7CiAgICAgICAgdGhpcy5hbGxvd0RvbU1vdmUgPSBmYWxzZTsKICAgICAgICB0aGlzLmVsID0gRXh0LmdldCh0YXJnZXQpOwogICAgICAgIHRoaXMucmVuZGVyKHRoaXMuZWwuZG9tLnBhcmVudE5vZGUpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfSwKCiAgICAgICAgaW5pdFZhbHVlIDogZnVuY3Rpb24oKXsKICAgICAgICBpZih0aGlzLnZhbHVlICE9PSB1bmRlZmluZWQpewogICAgICAgICAgICB0aGlzLnNldFZhbHVlKHRoaXMudmFsdWUpOwogICAgICAgIH1lbHNlIGlmKHRoaXMuZWwuZG9tLnZhbHVlLmxlbmd0aCA+IDApewogICAgICAgICAgICB0aGlzLnNldFZhbHVlKHRoaXMuZWwuZG9tLnZhbHVlKTsKICAgICAgICB9CiAgICB9LAoKICAgIAogICAgaXNEaXJ0eSA6IGZ1bmN0aW9uKCkgewogICAgICAgIGlmKHRoaXMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gU3RyaW5nKHRoaXMuZ2V0VmFsdWUoKSkgIT09IFN0cmluZyh0aGlzLm9yaWdpbmFsVmFsdWUpOwogICAgfSwKCiAgICAgICAgYWZ0ZXJSZW5kZXIgOiBmdW5jdGlvbigpewogICAgICAgIEV4dC5mb3JtLkZpZWxkLnN1cGVyY2xhc3MuYWZ0ZXJSZW5kZXIuY2FsbCh0aGlzKTsKICAgICAgICB0aGlzLmluaXRFdmVudHMoKTsKICAgIH0sCgogICAgICAgIGZpcmVLZXkgOiBmdW5jdGlvbihlKXsKICAgICAgICBpZihlLmlzTmF2S2V5UHJlc3MoKSl7CiAgICAgICAgICAgIHRoaXMuZmlyZUV2ZW50KCJzcGVjaWFsa2V5IiwgdGhpcywgZSk7CiAgICAgICAgfQogICAgfSwKCiAgICAKICAgIHJlc2V0IDogZnVuY3Rpb24oKXsKICAgICAgICB0aGlzLnNldFZhbHVlKHRoaXMub3JpZ2luYWxWYWx1ZSk7CiAgICAgICAgdGhpcy5jbGVhckludmFsaWQoKTsKICAgIH0sCgogICAgICAgIGluaXRFdmVudHMgOiBmdW5jdGlvbigpewogICAgICAgIHRoaXMuZWwub24oRXh0LmlzSUUgPyAia2V5ZG93biIgOiAia2V5cHJlc3MiLCB0aGlzLmZpcmVLZXksICB0aGlzKTsKICAgICAgICB0aGlzLmVsLm9uKCJmb2N1cyIsIHRoaXMub25Gb2N1cywgIHRoaXMpOwogICAgICAgIHRoaXMuZWwub24oImJsdXIiLCB0aGlzLm9uQmx1ciwgIHRoaXMpOwoKICAgICAgICAgICAgICAgIHRoaXMub3JpZ2luYWxWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgIH0sCgogICAgICAgIG9uRm9jdXMgOiBmdW5jdGlvbigpewogICAgICAgIGlmKCFFeHQuaXNPcGVyYSAmJiB0aGlzLmZvY3VzQ2xhc3MpeyAgICAgICAgICAgICB0aGlzLmVsLmFkZENsYXNzKHRoaXMuZm9jdXNDbGFzcyk7CiAgICAgICAgfQogICAgICAgIGlmKCF0aGlzLmhhc0ZvY3VzKXsKICAgICAgICAgICAgdGhpcy5oYXNGb2N1cyA9IHRydWU7CiAgICAgICAgICAgIHRoaXMuc3RhcnRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoImZvY3VzIiwgdGhpcyk7CiAgICAgICAgfQogICAgfSwKCiAgICBiZWZvcmVCbHVyIDogRXh0LmVtcHR5Rm4sCgogICAgICAgIG9uQmx1ciA6IGZ1bmN0aW9uKCl7CiAgICAgICAgdGhpcy5iZWZvcmVCbHVyKCk7CiAgICAgICAgaWYoIUV4dC5pc09wZXJhICYmIHRoaXMuZm9jdXNDbGFzcyl7ICAgICAgICAgICAgIHRoaXMuZWwucmVtb3ZlQ2xhc3ModGhpcy5mb2N1c0NsYXNzKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5oYXNGb2N1cyA9IGZhbHNlOwogICAgICAgIGlmKHRoaXMudmFsaWRhdGlvbkV2ZW50ICE9PSBmYWxzZSAmJiB0aGlzLnZhbGlkYXRlT25CbHVyICYmIHRoaXMudmFsaWRhdGlvbkV2ZW50ICE9ICJibHVyIil7CiAgICAgICAgICAgIHRoaXMudmFsaWRhdGUoKTsKICAgICAgICB9CiAgICAgICAgdmFyIHYgPSB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgaWYoU3RyaW5nKHYpICE9PSBTdHJpbmcodGhpcy5zdGFydFZhbHVlKSl7CiAgICAgICAgICAgIHRoaXMuZmlyZUV2ZW50KCdjaGFuZ2UnLCB0aGlzLCB2LCB0aGlzLnN0YXJ0VmFsdWUpOwogICAgICAgIH0KICAgICAgICB0aGlzLmZpcmVFdmVudCgiYmx1ciIsIHRoaXMpOwogICAgfSwKCiAgICAKICAgIGlzVmFsaWQgOiBmdW5jdGlvbihwcmV2ZW50TWFyayl7CiAgICAgICAgaWYodGhpcy5kaXNhYmxlZCl7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICB2YXIgcmVzdG9yZSA9IHRoaXMucHJldmVudE1hcms7CiAgICAgICAgdGhpcy5wcmV2ZW50TWFyayA9IHByZXZlbnRNYXJrID09PSB0cnVlOwogICAgICAgIHZhciB2ID0gdGhpcy52YWxpZGF0ZVZhbHVlKHRoaXMucHJvY2Vzc1ZhbHVlKHRoaXMuZ2V0UmF3VmFsdWUoKSkpOwogICAgICAgIHRoaXMucHJldmVudE1hcmsgPSByZXN0b3JlOwogICAgICAgIHJldHVybiB2OwogICAgfSwKCiAgICAKICAgIHZhbGlkYXRlIDogZnVuY3Rpb24oKXsKICAgICAgICBpZih0aGlzLmRpc2FibGVkIHx8IHRoaXMudmFsaWRhdGVWYWx1ZSh0aGlzLnByb2Nlc3NWYWx1ZSh0aGlzLmdldFJhd1ZhbHVlKCkpKSl7CiAgICAgICAgICAgIHRoaXMuY2xlYXJJbnZhbGlkKCk7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9LAoKICAgIHByb2Nlc3NWYWx1ZSA6IGZ1bmN0aW9uKHZhbHVlKXsKICAgICAgICByZXR1cm4gdmFsdWU7CiAgICB9LAoKICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZSA6IGZ1bmN0aW9uKHZhbHVlKXsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0sCgogICAgCiAgICBtYXJrSW52YWxpZCA6IGZ1bmN0aW9uKG1zZyl7CiAgICAgICAgaWYoIXRoaXMucmVuZGVyZWQgfHwgdGhpcy5wcmV2ZW50TWFyayl7ICAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5lbC5hZGRDbGFzcyh0aGlzLmludmFsaWRDbGFzcyk7CiAgICAgICAgbXNnID0gbXNnIHx8IHRoaXMuaW52YWxpZFRleHQ7CiAgICAgICAgc3dpdGNoKHRoaXMubXNnVGFyZ2V0KXsKICAgICAgICAgICAgY2FzZSAncXRpcCc6CiAgICAgICAgICAgICAgICB0aGlzLmVsLmRvbS5xdGlwID0gbXNnOwogICAgICAgICAgICAgICAgdGhpcy5lbC5kb20ucWNsYXNzID0gJ3gtZm9ybS1pbnZhbGlkLXRpcCc7CiAgICAgICAgICAgICAgICBpZihFeHQuUXVpY2tUaXBzKXsgICAgICAgICAgICAgICAgICAgICBFeHQuUXVpY2tUaXBzLmVuYWJsZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3RpdGxlJzoKICAgICAgICAgICAgICAgIHRoaXMuZWwuZG9tLnRpdGxlID0gbXNnOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3VuZGVyJzoKICAgICAgICAgICAgICAgIGlmKCF0aGlzLmVycm9yRWwpewogICAgICAgICAgICAgICAgICAgIHZhciBlbHAgPSB0aGlzLmVsLmZpbmRQYXJlbnQoJy54LWZvcm0tZWxlbWVudCcsIDUsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JFbCA9IGVscC5jcmVhdGVDaGlsZCh7Y2xzOid4LWZvcm0taW52YWxpZC1tc2cnfSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvckVsLnNldFdpZHRoKGVscC5nZXRXaWR0aCh0cnVlKS0yMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLmVycm9yRWwudXBkYXRlKG1zZyk7CiAgICAgICAgICAgICAgICBFeHQuZm9ybS5GaWVsZC5tc2dGeFt0aGlzLm1zZ0Z4XS5zaG93KHRoaXMuZXJyb3JFbCwgdGhpcyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnc2lkZSc6CiAgICAgICAgICAgICAgICBpZighdGhpcy5lcnJvckljb24pewogICAgICAgICAgICAgICAgICAgIHZhciBlbHAgPSB0aGlzLmVsLmZpbmRQYXJlbnQoJy54LWZvcm0tZWxlbWVudCcsIDUsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JJY29uID0gZWxwLmNyZWF0ZUNoaWxkKHtjbHM6J3gtZm9ybS1pbnZhbGlkLWljb24nfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLmFsaWduRXJyb3JJY29uKCk7CiAgICAgICAgICAgICAgICB0aGlzLmVycm9ySWNvbi5kb20ucXRpcCA9IG1zZzsKICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JJY29uLmRvbS5xY2xhc3MgPSAneC1mb3JtLWludmFsaWQtdGlwJzsKICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JJY29uLnNob3coKTsKICAgICAgICAgICAgICAgIHRoaXMub24oJ3Jlc2l6ZScsIHRoaXMuYWxpZ25FcnJvckljb24sIHRoaXMpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICB2YXIgdCA9IEV4dC5nZXREb20odGhpcy5tc2dUYXJnZXQpOwogICAgICAgICAgICAgICAgdC5pbm5lckhUTUwgPSBtc2c7CiAgICAgICAgICAgICAgICB0LnN0eWxlLmRpc3BsYXkgPSB0aGlzLm1zZ0Rpc3BsYXk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgdGhpcy5maXJlRXZlbnQoJ2ludmFsaWQnLCB0aGlzLCBtc2cpOwogICAgfSwKCiAgICAgICAgYWxpZ25FcnJvckljb24gOiBmdW5jdGlvbigpewogICAgICAgIHRoaXMuZXJyb3JJY29uLmFsaWduVG8odGhpcy5lbCwgJ3RsLXRyJywgWzIsIDBdKTsKICAgIH0sCgogICAgCiAgICBjbGVhckludmFsaWQgOiBmdW5jdGlvbigpewogICAgICAgIGlmKCF0aGlzLnJlbmRlcmVkIHx8IHRoaXMucHJldmVudE1hcmspeyAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMuZWwucmVtb3ZlQ2xhc3ModGhpcy5pbnZhbGlkQ2xhc3MpOwogICAgICAgIHN3aXRjaCh0aGlzLm1zZ1RhcmdldCl7CiAgICAgICAgICAgIGNhc2UgJ3F0aXAnOgogICAgICAgICAgICAgICAgdGhpcy5lbC5kb20ucXRpcCA9ICcnOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3RpdGxlJzoKICAgICAgICAgICAgICAgIHRoaXMuZWwuZG9tLnRpdGxlID0gJyc7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAndW5kZXInOgogICAgICAgICAgICAgICAgaWYodGhpcy5lcnJvckVsKXsKICAgICAgICAgICAgICAgICAgICBFeHQuZm9ybS5GaWVsZC5tc2dGeFt0aGlzLm1zZ0Z4XS5oaWRlKHRoaXMuZXJyb3JFbCwgdGhpcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnc2lkZSc6CiAgICAgICAgICAgICAgICBpZih0aGlzLmVycm9ySWNvbil7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvckljb24uZG9tLnF0aXAgPSAnJzsKICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9ySWNvbi5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy51bigncmVzaXplJywgdGhpcy5hbGlnbkVycm9ySWNvbiwgdGhpcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHZhciB0ID0gRXh0LmdldERvbSh0aGlzLm1zZ1RhcmdldCk7CiAgICAgICAgICAgICAgICB0LmlubmVySFRNTCA9ICcnOwogICAgICAgICAgICAgICAgdC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHRoaXMuZmlyZUV2ZW50KCd2YWxpZCcsIHRoaXMpOwogICAgfSwKCiAgICAKICAgIGdldFJhd1ZhbHVlIDogZnVuY3Rpb24oKXsKICAgICAgICB2YXIgdiA9IHRoaXMuZWwuZ2V0VmFsdWUoKTsKICAgICAgICBpZih2ID09PSB0aGlzLmVtcHR5VGV4dCl7CiAgICAgICAgICAgIHYgPSAnJzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHY7CiAgICB9LAoKICAgIAogICAgZ2V0VmFsdWUgOiBmdW5jdGlvbigpewogICAgICAgIHZhciB2ID0gdGhpcy5lbC5nZXRWYWx1ZSgpOwogICAgICAgIGlmKHYgPT09IHRoaXMuZW1wdHlUZXh0IHx8IHYgPT09IHVuZGVmaW5lZCl7CiAgICAgICAgICAgIHYgPSAnJzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHY7CiAgICB9LAoKICAgIAogICAgc2V0UmF3VmFsdWUgOiBmdW5jdGlvbih2KXsKICAgICAgICByZXR1cm4gdGhpcy5lbC5kb20udmFsdWUgPSAodiA9PT0gbnVsbCB8fCB2ID09PSB1bmRlZmluZWQgPyAnJyA6IHYpOwogICAgfSwKCiAgICAKICAgIHNldFZhbHVlIDogZnVuY3Rpb24odil7CiAgICAgICAgdGhpcy52YWx1ZSA9IHY7CiAgICAgICAgaWYodGhpcy5yZW5kZXJlZCl7CiAgICAgICAgICAgIHRoaXMuZWwuZG9tLnZhbHVlID0gKHYgPT09IG51bGwgfHwgdiA9PT0gdW5kZWZpbmVkID8gJycgOiB2KTsKICAgICAgICAgICAgdGhpcy52YWxpZGF0ZSgpOwogICAgICAgIH0KICAgIH0sCgogICAgYWRqdXN0U2l6ZSA6IGZ1bmN0aW9uKHcsIGgpewogICAgICAgIHZhciBzID0gRXh0LmZvcm0uRmllbGQuc3VwZXJjbGFzcy5hZGp1c3RTaXplLmNhbGwodGhpcywgdywgaCk7CiAgICAgICAgcy53aWR0aCA9IHRoaXMuYWRqdXN0V2lkdGgodGhpcy5lbC5kb20udGFnTmFtZSwgcy53aWR0aCk7CiAgICAgICAgcmV0dXJuIHM7CiAgICB9LAoKICAgIGFkanVzdFdpZHRoIDogZnVuY3Rpb24odGFnLCB3KXsKICAgICAgICB0YWcgPSB0YWcudG9Mb3dlckNhc2UoKTsKICAgICAgICBpZih0eXBlb2YgdyA9PSAnbnVtYmVyJyAmJiBFeHQuaXNTdHJpY3QgJiYgIUV4dC5pc1NhZmFyaSl7CiAgICAgICAgICAgIGlmKEV4dC5pc0lFICYmICh0YWcgPT0gJ2lucHV0JyB8fCB0YWcgPT0gJ3RleHRhcmVhJykpewogICAgICAgICAgICAgICAgaWYodGFnID09ICdpbnB1dCcpewogICAgICAgICAgICAgICAgICAgIHJldHVybiB3ICsgMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmKHRhZyA9ICd0ZXh0YXJlYScpewogICAgICAgICAgICAgICAgICAgIHJldHVybiB3LTI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH1lbHNlIGlmKEV4dC5pc09wZXJhKXsKICAgICAgICAgICAgICAgIGlmKHRhZyA9PSAnaW5wdXQnKXsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdyArIDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZih0YWcgPSAndGV4dGFyZWEnKXsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdy0yOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB3OwogICAgfQp9KTsKCgpFeHQuZm9ybS5GaWVsZC5tc2dGeCA9IHsKICAgIG5vcm1hbCA6IHsKICAgICAgICBzaG93OiBmdW5jdGlvbihtc2dFbCwgZil7CiAgICAgICAgICAgIG1zZ0VsLnNldERpc3BsYXllZCgnYmxvY2snKTsKICAgICAgICB9LAoKICAgICAgICBoaWRlIDogZnVuY3Rpb24obXNnRWwsIGYpewogICAgICAgICAgICBtc2dFbC5zZXREaXNwbGF5ZWQoZmFsc2UpLnVwZGF0ZSgnJyk7CiAgICAgICAgfQogICAgfSwKCiAgICBzbGlkZSA6IHsKICAgICAgICBzaG93OiBmdW5jdGlvbihtc2dFbCwgZil7CiAgICAgICAgICAgIG1zZ0VsLnNsaWRlSW4oJ3QnLCB7c3RvcEZ4OnRydWV9KTsKICAgICAgICB9LAoKICAgICAgICBoaWRlIDogZnVuY3Rpb24obXNnRWwsIGYpewogICAgICAgICAgICBtc2dFbC5zbGlkZU91dCgndCcsIHtzdG9wRng6dHJ1ZSx1c2VEaXNwbGF5OnRydWV9KTsKICAgICAgICB9CiAgICB9LAoKICAgIHNsaWRlUmlnaHQgOiB7CiAgICAgICAgc2hvdzogZnVuY3Rpb24obXNnRWwsIGYpewogICAgICAgICAgICBtc2dFbC5maXhEaXNwbGF5KCk7CiAgICAgICAgICAgIG1zZ0VsLmFsaWduVG8oZi5lbCwgJ3RsLXRyJyk7CiAgICAgICAgICAgIG1zZ0VsLnNsaWRlSW4oJ2wnLCB7c3RvcEZ4OnRydWV9KTsKICAgICAgICB9LAoKICAgICAgICBoaWRlIDogZnVuY3Rpb24obXNnRWwsIGYpewogICAgICAgICAgICBtc2dFbC5zbGlkZU91dCgnbCcsIHtzdG9wRng6dHJ1ZSx1c2VEaXNwbGF5OnRydWV9KTsKICAgICAgICB9CiAgICB9Cn07CgpFeHQuZm9ybS5UZXh0RmllbGQgPSBmdW5jdGlvbihjb25maWcpewogICAgRXh0LmZvcm0uVGV4dEZpZWxkLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBjb25maWcpOwogICAgdGhpcy5hZGRFdmVudHMoewogICAgICAgIAogICAgICAgIGF1dG9zaXplIDogdHJ1ZQogICAgfSk7Cn07CgpFeHQuZXh0ZW5kKEV4dC5mb3JtLlRleHRGaWVsZCwgRXh0LmZvcm0uRmllbGQsICB7CiAgICAKICAgIGdyb3cgOiBmYWxzZSwKICAgIAogICAgZ3Jvd01pbiA6IDMwLAogICAgCiAgICBncm93TWF4IDogODAwLAogICAgCiAgICB2dHlwZSA6IG51bGwsCiAgICAKICAgIG1hc2tSZSA6IG51bGwsCiAgICAKICAgIGRpc2FibGVLZXlGaWx0ZXIgOiBmYWxzZSwKICAgIAogICAgYWxsb3dCbGFuayA6IHRydWUsCiAgICAKICAgIG1pbkxlbmd0aCA6IDAsCiAgICAKICAgIG1heExlbmd0aCA6IE51bWJlci5NQVhfVkFMVUUsCiAgICAKICAgIG1pbkxlbmd0aFRleHQgOiAiVGhlIG1pbmltdW0gbGVuZ3RoIGZvciB0aGlzIGZpZWxkIGlzIHswfSIsCiAgICAKICAgIG1heExlbmd0aFRleHQgOiAiVGhlIG1heGltdW0gbGVuZ3RoIGZvciB0aGlzIGZpZWxkIGlzIHswfSIsCiAgICAKICAgIHNlbGVjdE9uRm9jdXMgOiBmYWxzZSwKICAgIAogICAgYmxhbmtUZXh0IDogIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQiLAogICAgCiAgICB2YWxpZGF0b3IgOiBudWxsLAogICAgCiAgICByZWdleCA6IG51bGwsCiAgICAKICAgIHJlZ2V4VGV4dCA6ICIiLAogICAgCiAgICBlbXB0eVRleHQgOiBudWxsLAogICAgCiAgICBlbXB0eUNsYXNzIDogJ3gtZm9ybS1lbXB0eS1maWVsZCcsCgogICAgICAgIGluaXRFdmVudHMgOiBmdW5jdGlvbigpewogICAgICAgIEV4dC5mb3JtLlRleHRGaWVsZC5zdXBlcmNsYXNzLmluaXRFdmVudHMuY2FsbCh0aGlzKTsKICAgICAgICBpZih0aGlzLnZhbGlkYXRpb25FdmVudCA9PSAna2V5dXAnKXsKICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uVGFzayA9IG5ldyBFeHQudXRpbC5EZWxheWVkVGFzayh0aGlzLnZhbGlkYXRlLCB0aGlzKTsKICAgICAgICAgICAgdGhpcy5lbC5vbigna2V5dXAnLCB0aGlzLmZpbHRlclZhbGlkYXRpb24sIHRoaXMpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmKHRoaXMudmFsaWRhdGlvbkV2ZW50ICE9PSBmYWxzZSl7CiAgICAgICAgICAgIHRoaXMuZWwub24odGhpcy52YWxpZGF0aW9uRXZlbnQsIHRoaXMudmFsaWRhdGUsIHRoaXMsIHtidWZmZXI6IHRoaXMudmFsaWRhdGlvbkRlbGF5fSk7CiAgICAgICAgfQogICAgICAgIGlmKHRoaXMuc2VsZWN0T25Gb2N1cyB8fCB0aGlzLmVtcHR5VGV4dCl7CiAgICAgICAgICAgIHRoaXMub24oImZvY3VzIiwgdGhpcy5wcmVGb2N1cywgdGhpcyk7CiAgICAgICAgICAgIGlmKHRoaXMuZW1wdHlUZXh0KXsKICAgICAgICAgICAgICAgIHRoaXMub24oJ2JsdXInLCB0aGlzLnBvc3RCbHVyLCB0aGlzKTsKICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlFbXB0eVRleHQoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZih0aGlzLm1hc2tSZSB8fCAodGhpcy52dHlwZSAmJiB0aGlzLmRpc2FibGVLZXlGaWx0ZXIgIT09IHRydWUgJiYgKHRoaXMubWFza1JlID0gRXh0LmZvcm0uVlR5cGVzW3RoaXMudnR5cGUrJ01hc2snXSkpKXsKICAgICAgICAgICAgdGhpcy5lbC5vbigia2V5cHJlc3MiLCB0aGlzLmZpbHRlcktleXMsIHRoaXMpOwogICAgICAgIH0KICAgICAgICBpZih0aGlzLmdyb3cpewogICAgICAgICAgICB0aGlzLmVsLm9uKCJrZXl1cCIsIHRoaXMub25LZXlVcCwgIHRoaXMsIHtidWZmZXI6NTB9KTsKICAgICAgICAgICAgdGhpcy5lbC5vbigiY2xpY2siLCB0aGlzLmF1dG9TaXplLCAgdGhpcyk7CiAgICAgICAgfQogICAgfSwKCiAgICBwcm9jZXNzVmFsdWUgOiBmdW5jdGlvbih2YWx1ZSl7CiAgICAgICAgaWYodGhpcy5zdHJpcENoYXJzUmUpewogICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSB2YWx1ZS5yZXBsYWNlKHRoaXMuc3RyaXBDaGFyc1JlLCAnJyk7CiAgICAgICAgICAgIGlmKG5ld1ZhbHVlICE9PSB2YWx1ZSl7CiAgICAgICAgICAgICAgICB0aGlzLnNldFJhd1ZhbHVlKG5ld1ZhbHVlKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXdWYWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdmFsdWU7CiAgICB9LAoKICAgIGZpbHRlclZhbGlkYXRpb24gOiBmdW5jdGlvbihlKXsKICAgICAgICBpZighZS5pc05hdktleVByZXNzKCkpewogICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25UYXNrLmRlbGF5KHRoaXMudmFsaWRhdGlvbkRlbGF5KTsKICAgICAgICB9CiAgICB9LAoKICAgICAgICBvbktleVVwIDogZnVuY3Rpb24oZSl7CiAgICAgICAgaWYoIWUuaXNOYXZLZXlQcmVzcygpKXsKICAgICAgICAgICAgdGhpcy5hdXRvU2l6ZSgpOwogICAgICAgIH0KICAgIH0sCgogICAgCiAgICByZXNldCA6IGZ1bmN0aW9uKCl7CiAgICAgICAgRXh0LmZvcm0uVGV4dEZpZWxkLnN1cGVyY2xhc3MucmVzZXQuY2FsbCh0aGlzKTsKICAgICAgICB0aGlzLmFwcGx5RW1wdHlUZXh0KCk7CiAgICB9LAoKICAgIGFwcGx5RW1wdHlUZXh0IDogZnVuY3Rpb24oKXsKICAgICAgICBpZih0aGlzLnJlbmRlcmVkICYmIHRoaXMuZW1wdHlUZXh0ICYmIHRoaXMuZ2V0UmF3VmFsdWUoKS5sZW5ndGggPCAxKXsKICAgICAgICAgICAgdGhpcy5zZXRSYXdWYWx1ZSh0aGlzLmVtcHR5VGV4dCk7CiAgICAgICAgICAgIHRoaXMuZWwuYWRkQ2xhc3ModGhpcy5lbXB0eUNsYXNzKTsKICAgICAgICB9CiAgICB9LAoKICAgICAgICBwcmVGb2N1cyA6IGZ1bmN0aW9uKCl7CiAgICAgICAgaWYodGhpcy5lbXB0eVRleHQpewogICAgICAgICAgICBpZih0aGlzLmVsLmRvbS52YWx1ZSA9PSB0aGlzLmVtcHR5VGV4dCl7CiAgICAgICAgICAgICAgICB0aGlzLnNldFJhd1ZhbHVlKCcnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmVsLnJlbW92ZUNsYXNzKHRoaXMuZW1wdHlDbGFzcyk7CiAgICAgICAgfQogICAgICAgIGlmKHRoaXMuc2VsZWN0T25Gb2N1cyl7CiAgICAgICAgICAgIHRoaXMuZWwuZG9tLnNlbGVjdCgpOwogICAgICAgIH0KICAgIH0sCgogICAgICAgIHBvc3RCbHVyIDogZnVuY3Rpb24oKXsKICAgICAgICB0aGlzLmFwcGx5RW1wdHlUZXh0KCk7CiAgICB9LAoKICAgICAgICBmaWx0ZXJLZXlzIDogZnVuY3Rpb24oZSl7CiAgICAgICAgdmFyIGsgPSBlLmdldEtleSgpOwogICAgICAgIGlmKCFFeHQuaXNJRSAmJiAoZS5pc05hdktleVByZXNzKCkgfHwgayA9PSBlLkJBQ0tTUEFDRSB8fCAoayA9PSBlLkRFTEVURSAmJiBlLmJ1dHRvbiA9PSAtMSkpKXsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgYyA9IGUuZ2V0Q2hhckNvZGUoKSwgY2MgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpOwogICAgICAgIGlmKEV4dC5pc0lFICYmIChlLmlzU3BlY2lhbEtleSgpIHx8ICFjYykpewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmKCF0aGlzLm1hc2tSZS50ZXN0KGNjKSl7CiAgICAgICAgICAgIGUuc3RvcEV2ZW50KCk7CiAgICAgICAgfQogICAgfSwKCiAgICBzZXRWYWx1ZSA6IGZ1bmN0aW9uKHYpewogICAgICAgIGlmKHRoaXMuZW1wdHlUZXh0ICYmIHRoaXMuZWwgJiYgdiAhPT0gdW5kZWZpbmVkICYmIHYgIT09IG51bGwgJiYgdiAhPT0gJycpewogICAgICAgICAgICB0aGlzLmVsLnJlbW92ZUNsYXNzKHRoaXMuZW1wdHlDbGFzcyk7CiAgICAgICAgfQogICAgICAgIEV4dC5mb3JtLlRleHRGaWVsZC5zdXBlcmNsYXNzLnNldFZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgdGhpcy5hcHBseUVtcHR5VGV4dCgpOwogICAgICAgIHRoaXMuYXV0b1NpemUoKTsKICAgIH0sCgogICAgCiAgICB2YWxpZGF0ZVZhbHVlIDogZnVuY3Rpb24odmFsdWUpewogICAgICAgIGlmKHZhbHVlLmxlbmd0aCA8IDEgfHwgdmFsdWUgPT09IHRoaXMuZW1wdHlUZXh0KXsgICAgICAgICAgICAgIGlmKHRoaXMuYWxsb3dCbGFuayl7CiAgICAgICAgICAgICAgICAgdGhpcy5jbGVhckludmFsaWQoKTsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgIHRoaXMubWFya0ludmFsaWQodGhpcy5ibGFua1RleHQpOwogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYodmFsdWUubGVuZ3RoIDwgdGhpcy5taW5MZW5ndGgpewogICAgICAgICAgICB0aGlzLm1hcmtJbnZhbGlkKFN0cmluZy5mb3JtYXQodGhpcy5taW5MZW5ndGhUZXh0LCB0aGlzLm1pbkxlbmd0aCkpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmKHZhbHVlLmxlbmd0aCA+IHRoaXMubWF4TGVuZ3RoKXsKICAgICAgICAgICAgdGhpcy5tYXJrSW52YWxpZChTdHJpbmcuZm9ybWF0KHRoaXMubWF4TGVuZ3RoVGV4dCwgdGhpcy5tYXhMZW5ndGgpKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBpZih0aGlzLnZ0eXBlKXsKICAgICAgICAgICAgdmFyIHZ0ID0gRXh0LmZvcm0uVlR5cGVzOwogICAgICAgICAgICBpZighdnRbdGhpcy52dHlwZV0odmFsdWUsIHRoaXMpKXsKICAgICAgICAgICAgICAgIHRoaXMubWFya0ludmFsaWQodGhpcy52dHlwZVRleHQgfHwgdnRbdGhpcy52dHlwZSArJ1RleHQnXSk7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYodHlwZW9mIHRoaXMudmFsaWRhdG9yID09ICJmdW5jdGlvbiIpewogICAgICAgICAgICB2YXIgbXNnID0gdGhpcy52YWxpZGF0b3IodmFsdWUpOwogICAgICAgICAgICBpZihtc2cgIT09IHRydWUpewogICAgICAgICAgICAgICAgdGhpcy5tYXJrSW52YWxpZChtc2cpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmKHRoaXMucmVnZXggJiYgIXRoaXMucmVnZXgudGVzdCh2YWx1ZSkpewogICAgICAgICAgICB0aGlzLm1hcmtJbnZhbGlkKHRoaXMucmVnZXhUZXh0KTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0sCgogICAgCiAgICBzZWxlY3RUZXh0IDogZnVuY3Rpb24oc3RhcnQsIGVuZCl7CiAgICAgICAgdmFyIHYgPSB0aGlzLmdldFJhd1ZhbHVlKCk7CiAgICAgICAgaWYodi5sZW5ndGggPiAwKXsKICAgICAgICAgICAgc3RhcnQgPSBzdGFydCA9PT0gdW5kZWZpbmVkID8gMCA6IHN0YXJ0OwogICAgICAgICAgICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IHYubGVuZ3RoIDogZW5kOwogICAgICAgICAgICB2YXIgZCA9IHRoaXMuZWwuZG9tOwogICAgICAgICAgICBpZihkLnNldFNlbGVjdGlvblJhbmdlKXsKICAgICAgICAgICAgICAgIGQuc2V0U2VsZWN0aW9uUmFuZ2Uoc3RhcnQsIGVuZCk7CiAgICAgICAgICAgIH1lbHNlIGlmKGQuY3JlYXRlVGV4dFJhbmdlKXsKICAgICAgICAgICAgICAgIHZhciByYW5nZSA9IGQuY3JlYXRlVGV4dFJhbmdlKCk7CiAgICAgICAgICAgICAgICByYW5nZS5tb3ZlU3RhcnQoImNoYXJhY3RlciIsIHN0YXJ0KTsKICAgICAgICAgICAgICAgIHJhbmdlLm1vdmVFbmQoImNoYXJhY3RlciIsIHYubGVuZ3RoLWVuZCk7CiAgICAgICAgICAgICAgICByYW5nZS5zZWxlY3QoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0sCgogICAgCiAgICBhdXRvU2l6ZSA6IGZ1bmN0aW9uKCl7CiAgICAgICAgaWYoIXRoaXMuZ3JvdyB8fCAhdGhpcy5yZW5kZXJlZCl7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYoIXRoaXMubWV0cmljcyl7CiAgICAgICAgICAgIHRoaXMubWV0cmljcyA9IEV4dC51dGlsLlRleHRNZXRyaWNzLmNyZWF0ZUluc3RhbmNlKHRoaXMuZWwpOwogICAgICAgIH0KICAgICAgICB2YXIgZWwgPSB0aGlzLmVsOwogICAgICAgIHZhciB2ID0gZWwuZG9tLnZhbHVlOwogICAgICAgIHZhciBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgZC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh2KSk7CiAgICAgICAgdiA9IGQuaW5uZXJIVE1MOwogICAgICAgIGQgPSBudWxsOwogICAgICAgIHYgKz0gIiYjMTYwOyI7CiAgICAgICAgdmFyIHcgPSBNYXRoLm1pbih0aGlzLmdyb3dNYXgsIE1hdGgubWF4KHRoaXMubWV0cmljcy5nZXRXaWR0aCh2KSArICAxMCwgdGhpcy5ncm93TWluKSk7CiAgICAgICAgdGhpcy5lbC5zZXRXaWR0aCh3KTsKICAgICAgICB0aGlzLmZpcmVFdmVudCgiYXV0b3NpemUiLCB0aGlzLCB3KTsKICAgIH0KfSk7CgpFeHQuZm9ybS5UcmlnZ2VyRmllbGQgPSBmdW5jdGlvbihjb25maWcpewogICAgdGhpcy5taW1pY2luZyA9IGZhbHNlOwogICAgRXh0LmZvcm0uVHJpZ2dlckZpZWxkLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBjb25maWcpOwp9OwoKRXh0LmV4dGVuZChFeHQuZm9ybS5UcmlnZ2VyRmllbGQsIEV4dC5mb3JtLlRleHRGaWVsZCwgIHsKICAgIAogICAgCiAgICBkZWZhdWx0QXV0b0NyZWF0ZSA6IHt0YWc6ICJpbnB1dCIsIHR5cGU6ICJ0ZXh0Iiwgc2l6ZTogIjE2IiwgYXV0b2NvbXBsZXRlOiAib2ZmIn0sCiAgICAKICAgIGhpZGVUcmlnZ2VyOmZhbHNlLAoKICAgIAogICAgCiAgICAKCiAgICAKICAgIGF1dG9TaXplOiBFeHQuZW1wdHlGbiwKICAgICAgICBtb25pdG9yVGFiIDogdHJ1ZSwKICAgICAgICBkZWZlckhlaWdodCA6IHRydWUsCgogICAgICAgIG9uUmVzaXplIDogZnVuY3Rpb24odywgaCl7CiAgICAgICAgRXh0LmZvcm0uVHJpZ2dlckZpZWxkLnN1cGVyY2xhc3Mub25SZXNpemUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICBpZih0eXBlb2YgdyA9PSAnbnVtYmVyJyl7CiAgICAgICAgICAgIHRoaXMuZWwuc2V0V2lkdGgodGhpcy5hZGp1c3RXaWR0aCgnaW5wdXQnLCB3IC0gdGhpcy50cmlnZ2VyLmdldFdpZHRoKCkpKTsKICAgICAgICB9CiAgICB9LAoKICAgICAgICBhZGp1c3RTaXplIDogRXh0LkJveENvbXBvbmVudC5wcm90b3R5cGUuYWRqdXN0U2l6ZSwKCiAgICAgICAgZ2V0UmVzaXplRWwgOiBmdW5jdGlvbigpewogICAgICAgIHJldHVybiB0aGlzLndyYXA7CiAgICB9LAoKICAgICAgICBnZXRQb3NpdGlvbkVsIDogZnVuY3Rpb24oKXsKICAgICAgICByZXR1cm4gdGhpcy53cmFwOwogICAgfSwKCiAgICAgICAgYWxpZ25FcnJvckljb24gOiBmdW5jdGlvbigpewogICAgICAgIHRoaXMuZXJyb3JJY29uLmFsaWduVG8odGhpcy53cmFwLCAndGwtdHInLCBbMiwgMF0pOwogICAgfSwKCiAgICAgICAgb25SZW5kZXIgOiBmdW5jdGlvbihjdCwgcG9zaXRpb24pewogICAgICAgIEV4dC5mb3JtLlRyaWdnZXJGaWVsZC5zdXBlcmNsYXNzLm9uUmVuZGVyLmNhbGwodGhpcywgY3QsIHBvc2l0aW9uKTsKICAgICAgICB0aGlzLndyYXAgPSB0aGlzLmVsLndyYXAoe2NsczogIngtZm9ybS1maWVsZC13cmFwIn0pOwogICAgICAgIHRoaXMudHJpZ2dlciA9IHRoaXMud3JhcC5jcmVhdGVDaGlsZCh0aGlzLnRyaWdnZXJDb25maWcgfHwKICAgICAgICAgICAgICAgIHt0YWc6ICJpbWciLCBzcmM6IEV4dC5CTEFOS19JTUFHRV9VUkwsIGNsczogIngtZm9ybS10cmlnZ2VyICIgKyB0aGlzLnRyaWdnZXJDbGFzc30pOwogICAgICAgIGlmKHRoaXMuaGlkZVRyaWdnZXIpewogICAgICAgICAgICB0aGlzLnRyaWdnZXIuc2V0RGlzcGxheWVkKGZhbHNlKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5pbml0VHJpZ2dlcigpOwogICAgICAgIGlmKCF0aGlzLndpZHRoKXsKICAgICAgICAgICAgdGhpcy53cmFwLnNldFdpZHRoKHRoaXMuZWwuZ2V0V2lkdGgoKSt0aGlzLnRyaWdnZXIuZ2V0V2lkdGgoKSk7CiAgICAgICAgfQogICAgfSwKCiAgICAgICAgaW5pdFRyaWdnZXIgOiBmdW5jdGlvbigpewogICAgICAgIHRoaXMudHJpZ2dlci5vbigiY2xpY2siLCB0aGlzLm9uVHJpZ2dlckNsaWNrLCB0aGlzLCB7cHJldmVudERlZmF1bHQ6dHJ1ZX0pOwogICAgICAgIHRoaXMudHJpZ2dlci5hZGRDbGFzc09uT3ZlcigneC1mb3JtLXRyaWdnZXItb3ZlcicpOwogICAgICAgIHRoaXMudHJpZ2dlci5hZGRDbGFzc09uQ2xpY2soJ3gtZm9ybS10cmlnZ2VyLWNsaWNrJyk7CiAgICB9LAoKICAgICAgICBvbkRlc3Ryb3kgOiBmdW5jdGlvbigpewogICAgICAgIGlmKHRoaXMudHJpZ2dlcil7CiAgICAgICAgICAgIHRoaXMudHJpZ2dlci5yZW1vdmVBbGxMaXN0ZW5lcnMoKTsKICAgICAgICAgICAgdGhpcy50cmlnZ2VyLnJlbW92ZSgpOwogICAgICAgIH0KICAgICAgICBpZih0aGlzLndyYXApewogICAgICAgICAgICB0aGlzLndyYXAucmVtb3ZlKCk7CiAgICAgICAgfQogICAgICAgIEV4dC5mb3JtLlRyaWdnZXJGaWVsZC5zdXBlcmNsYXNzLm9uRGVzdHJveS5jYWxsKHRoaXMpOwogICAgfSwKCiAgICAgICAgb25Gb2N1cyA6IGZ1bmN0aW9uKCl7CiAgICAgICAgRXh0LmZvcm0uVHJpZ2dlckZpZWxkLnN1cGVyY2xhc3Mub25Gb2N1cy5jYWxsKHRoaXMpOwogICAgICAgIGlmKCF0aGlzLm1pbWljaW5nKXsKICAgICAgICAgICAgdGhpcy53cmFwLmFkZENsYXNzKCd4LXRyaWdnZXItd3JhcC1mb2N1cycpOwogICAgICAgICAgICB0aGlzLm1pbWljaW5nID0gdHJ1ZTsKICAgICAgICAgICAgRXh0LmdldChFeHQuaXNJRSA/IGRvY3VtZW50LmJvZHkgOiBkb2N1bWVudCkub24oIm1vdXNlZG93biIsIHRoaXMubWltaWNCbHVyLCB0aGlzKTsKICAgICAgICAgICAgaWYodGhpcy5tb25pdG9yVGFiKXsKICAgICAgICAgICAgICAgIHRoaXMuZWwub24oImtleWRvd24iLCB0aGlzLmNoZWNrVGFiLCB0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0sCgogICAgICAgIGNoZWNrVGFiIDogZnVuY3Rpb24oZSl7CiAgICAgICAgaWYoZS5nZXRLZXkoKSA9PSBlLlRBQil7CiAgICAgICAgICAgIHRoaXMudHJpZ2dlckJsdXIoKTsKICAgICAgICB9CiAgICB9LAoKICAgICAgICBvbkJsdXIgOiBmdW5jdGlvbigpewogICAgICAgICAgICB9LAoKICAgICAgICBtaW1pY0JsdXIgOiBmdW5jdGlvbihlLCB0KXsKICAgICAgICBpZighdGhpcy53cmFwLmNvbnRhaW5zKHQpICYmIHRoaXMudmFsaWRhdGVCbHVyKCkpewogICAgICAgICAgICB0aGlzLnRyaWdnZXJCbHVyKCk7CiAgICAgICAgfQogICAgfSwKCiAgICAgICAgdHJpZ2dlckJsdXIgOiBmdW5jdGlvbigpewogICAgICAgIHRoaXMubWltaWNpbmcgPSBmYWxzZTsKICAgICAgICBFeHQuZ2V0KEV4dC5pc0lFID8gZG9jdW1lbnQuYm9keSA6IGRvY3VtZW50KS51bigibW91c2Vkb3duIiwgdGhpcy5taW1pY0JsdXIpOwogICAgICAgIGlmKHRoaXMubW9uaXRvclRhYil7CiAgICAgICAgICAgIHRoaXMuZWwudW4oImtleWRvd24iLCB0aGlzLmNoZWNrVGFiLCB0aGlzKTsKICAgICAgICB9CiAgICAgICAgdGhpcy53cmFwLnJlbW92ZUNsYXNzKCd4LXRyaWdnZXItd3JhcC1mb2N1cycpOwogICAgICAgIEV4dC5mb3JtLlRyaWdnZXJGaWVsZC5zdXBlcmNsYXNzLm9uQmx1ci5jYWxsKHRoaXMpOwogICAgfSwKCiAgICAgICAgICAgIHZhbGlkYXRlQmx1ciA6IGZ1bmN0aW9uKGUsIHQpewogICAgICAgIHJldHVybiB0cnVlOwogICAgfSwKCiAgICAgICAgb25EaXNhYmxlIDogZnVuY3Rpb24oKXsKICAgICAgICBFeHQuZm9ybS5UcmlnZ2VyRmllbGQuc3VwZXJjbGFzcy5vbkRpc2FibGUuY2FsbCh0aGlzKTsKICAgICAgICBpZih0aGlzLndyYXApewogICAgICAgICAgICB0aGlzLndyYXAuYWRkQ2xhc3MoJ3gtaXRlbS1kaXNhYmxlZCcpOwogICAgICAgIH0KICAgIH0sCgogICAgICAgIG9uRW5hYmxlIDogZnVuY3Rpb24oKXsKICAgICAgICBFeHQuZm9ybS5UcmlnZ2VyRmllbGQuc3VwZXJjbGFzcy5vbkVuYWJsZS5jYWxsKHRoaXMpOwogICAgICAgIGlmKHRoaXMud3JhcCl7CiAgICAgICAgICAgIHRoaXMud3JhcC5yZW1vdmVDbGFzcygneC1pdGVtLWRpc2FibGVkJyk7CiAgICAgICAgfQogICAgfSwKCiAgICAgICAgb25TaG93IDogZnVuY3Rpb24oKXsKICAgICAgICBpZih0aGlzLndyYXApewogICAgICAgICAgICB0aGlzLndyYXAuZG9tLnN0eWxlLmRpc3BsYXkgPSAnJzsKICAgICAgICAgICAgdGhpcy53cmFwLmRvbS5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnOwogICAgICAgIH0KICAgIH0sCgogICAgICAgIG9uSGlkZSA6IGZ1bmN0aW9uKCl7CiAgICAgICAgdGhpcy53cmFwLmRvbS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgfSwKCiAgICAKICAgIG9uVHJpZ2dlckNsaWNrIDogRXh0LmVtcHR5Rm4KfSk7CgpFeHQuZm9ybS5Ud2luVHJpZ2dlckZpZWxkID0gRXh0LmV4dGVuZChFeHQuZm9ybS5UcmlnZ2VyRmllbGQsIHsKICAgIGluaXRDb21wb25lbnQgOiBmdW5jdGlvbigpewogICAgICAgIEV4dC5mb3JtLlR3aW5UcmlnZ2VyRmllbGQuc3VwZXJjbGFzcy5pbml0Q29tcG9uZW50LmNhbGwodGhpcyk7CgogICAgICAgIHRoaXMudHJpZ2dlckNvbmZpZyA9IHsKICAgICAgICAgICAgdGFnOidzcGFuJywgY2xzOid4LWZvcm0tdHdpbi10cmlnZ2VycycsIGNuOlsKICAgICAgICAgICAge3RhZzogImltZyIsIHNyYzogRXh0LkJMQU5LX0lNQUdFX1VSTCwgY2xzOiAieC1mb3JtLXRyaWdnZXIgIiArIHRoaXMudHJpZ2dlcjFDbGFzc30sCiAgICAgICAgICAgIHt0YWc6ICJpbWciLCBzcmM6IEV4dC5CTEFOS19JTUFHRV9VUkwsIGNsczogIngtZm9ybS10cmlnZ2VyICIgKyB0aGlzLnRyaWdnZXIyQ2xhc3N9CiAgICAgICAgXX07CiAgICB9LAoKICAgIGdldFRyaWdnZXIgOiBmdW5jdGlvbihpbmRleCl7CiAgICAgICAgcmV0dXJuIHRoaXMudHJpZ2dlcnNbaW5kZXhdOwogICAgfSwKCiAgICBpbml0VHJpZ2dlciA6IGZ1bmN0aW9uKCl7CiAgICAgICAgdmFyIHRzID0gdGhpcy50cmlnZ2VyLnNlbGVjdCgnLngtZm9ybS10cmlnZ2VyJywgdHJ1ZSk7CiAgICAgICAgdGhpcy53cmFwLnNldFN0eWxlKCdvdmVyZmxvdycsICdoaWRkZW4nKTsKICAgICAgICB2YXIgdHJpZ2dlckZpZWxkID0gdGhpczsKICAgICAgICB0cy5lYWNoKGZ1bmN0aW9uKHQsIGFsbCwgaW5kZXgpewogICAgICAgICAgICB0LmhpZGUgPSBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgdmFyIHcgPSB0cmlnZ2VyRmllbGQud3JhcC5nZXRXaWR0aCgpOwogICAgICAgICAgICAgICAgdGhpcy5kb20uc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgICAgIHRyaWdnZXJGaWVsZC5lbC5zZXRXaWR0aCh3LXRyaWdnZXJGaWVsZC50cmlnZ2VyLmdldFdpZHRoKCkpOwogICAgICAgICAgICB9OwogICAgICAgICAgICB0LnNob3cgPSBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgdmFyIHcgPSB0cmlnZ2VyRmllbGQud3JhcC5nZXRXaWR0aCgpOwogICAgICAgICAgICAgICAgdGhpcy5kb20uc3R5bGUuZGlzcGxheSA9ICcnOwogICAgICAgICAgICAgICAgdHJpZ2dlckZpZWxkLmVsLnNldFdpZHRoKHctdHJpZ2dlckZpZWxkLnRyaWdnZXIuZ2V0V2lkdGgoKSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciB0cmlnZ2VySW5kZXggPSAnVHJpZ2dlcicrKGluZGV4KzEpOwoKICAgICAgICAgICAgaWYodGhpc1snaGlkZScrdHJpZ2dlckluZGV4XSl7CiAgICAgICAgICAgICAgICB0LmRvbS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHQub24oImNsaWNrIiwgdGhpc1snb24nK3RyaWdnZXJJbmRleCsnQ2xpY2snXSwgdGhpcywge3ByZXZlbnREZWZhdWx0OnRydWV9KTsKICAgICAgICAgICAgdC5hZGRDbGFzc09uT3ZlcigneC1mb3JtLXRyaWdnZXItb3ZlcicpOwogICAgICAgICAgICB0LmFkZENsYXNzT25DbGljaygneC1mb3JtLXRyaWdnZXItY2xpY2snKTsKICAgICAgICB9LCB0aGlzKTsKICAgICAgICB0aGlzLnRyaWdnZXJzID0gdHMuZWxlbWVudHM7CiAgICB9LAoKICAgIG9uVHJpZ2dlcjFDbGljayA6IEV4dC5lbXB0eUZuLAogICAgb25UcmlnZ2VyMkNsaWNrIDogRXh0LmVtcHR5Rm4KfSk7CgpFeHQuZm9ybS5UZXh0QXJlYSA9IGZ1bmN0aW9uKGNvbmZpZyl7CiAgICBFeHQuZm9ybS5UZXh0QXJlYS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgY29uZmlnKTsKICAgICAgICAgICAgICAgIGlmKHRoaXMubWluSGVpZ2h0ICE9PSB1bmRlZmluZWQpewogICAgICAgIHRoaXMuZ3Jvd01pbiA9IHRoaXMubWluSGVpZ2h0OwogICAgfQogICAgaWYodGhpcy5tYXhIZWlnaHQgIT09IHVuZGVmaW5lZCl7CiAgICAgICAgdGhpcy5ncm93TWF4ID0gdGhpcy5tYXhIZWlnaHQ7CiAgICB9Cn07CgpFeHQuZXh0ZW5kKEV4dC5mb3JtLlRleHRBcmVhLCBFeHQuZm9ybS5UZXh0RmllbGQsICB7CiAgICAKICAgIGdyb3dNaW4gOiA2MCwKICAgIAogICAgZ3Jvd01heDogMTAwMCwKICAgIAogICAgcHJldmVudFNjcm9sbGJhcnM6IGZhbHNlLAogICAgCgogICAgICAgIG9uUmVuZGVyIDogZnVuY3Rpb24oY3QsIHBvc2l0aW9uKXsKICAgICAgICBpZighdGhpcy5lbCl7CiAgICAgICAgICAgIHRoaXMuZGVmYXVsdEF1dG9DcmVhdGUgPSB7CiAgICAgICAgICAgICAgICB0YWc6ICJ0ZXh0YXJlYSIsCiAgICAgICAgICAgICAgICBzdHlsZToid2lkdGg6MzAwcHg7aGVpZ2h0OjYwcHg7IiwKICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZTogIm9mZiIKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgRXh0LmZvcm0uVGV4dEFyZWEuc3VwZXJjbGFzcy5vblJlbmRlci5jYWxsKHRoaXMsIGN0LCBwb3NpdGlvbik7CiAgICAgICAgaWYodGhpcy5ncm93KXsKICAgICAgICAgICAgdGhpcy50ZXh0U2l6ZUVsID0gRXh0LkRvbUhlbHBlci5hcHBlbmQoZG9jdW1lbnQuYm9keSwgewogICAgICAgICAgICAgICAgdGFnOiAicHJlIiwgY2xzOiAieC1mb3JtLWdyb3ctc2l6ZXIiCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZih0aGlzLnByZXZlbnRTY3JvbGxiYXJzKXsKICAgICAgICAgICAgICAgIHRoaXMuZWwuc2V0U3R5bGUoIm92ZXJmbG93IiwgImhpZGRlbiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuZWwuc2V0SGVpZ2h0KHRoaXMuZ3Jvd01pbik7CiAgICAgICAgfQogICAgfSwKCiAgICBvbkRlc3Ryb3kgOiBmdW5jdGlvbigpewogICAgICAgIGlmKHRoaXMudGV4dFNpemVFbCl7CiAgICAgICAgICAgIHRoaXMudGV4dFNpemVFbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMudGV4dFNpemVFbCk7CiAgICAgICAgfQogICAgICAgIEV4dC5mb3JtLlRleHRBcmVhLnN1cGVyY2xhc3Mub25EZXN0cm95LmNhbGwodGhpcyk7CiAgICB9LAoKICAgICAgICBvbktleVVwIDogZnVuY3Rpb24oZSl7CiAgICAgICAgaWYoIWUuaXNOYXZLZXlQcmVzcygpIHx8IGUuZ2V0S2V5KCkgPT0gZS5FTlRFUil7CiAgICAgICAgICAgIHRoaXMuYXV0b1NpemUoKTsKICAgICAgICB9CiAgICB9LAoKICAgIAogICAgYXV0b1NpemUgOiBmdW5jdGlvbigpewogICAgICAgIGlmKCF0aGlzLmdyb3cgfHwgIXRoaXMudGV4dFNpemVFbCl7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdmFyIGVsID0gdGhpcy5lbDsKICAgICAgICB2YXIgdiA9IGVsLmRvbS52YWx1ZTsKICAgICAgICB2YXIgdHMgPSB0aGlzLnRleHRTaXplRWw7CgogICAgICAgIHRzLmlubmVySFRNTCA9ICcnOwogICAgICAgIHRzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHYpKTsKICAgICAgICB2ID0gdHMuaW5uZXJIVE1MOwoKICAgICAgICBFeHQuZmx5KHRzKS5zZXRXaWR0aCh0aGlzLmVsLmdldFdpZHRoKCkpOwogICAgICAgIGlmKHYubGVuZ3RoIDwgMSl7CiAgICAgICAgICAgIHYgPSAiJiMxNjA7JiMxNjA7IjsKICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgaWYoRXh0LmlzSUUpewogICAgICAgICAgICAgICAgdiA9IHYucmVwbGFjZSgvXG4vZywgJzxwPiYjMTYwOzwvcD4nKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2ICs9ICImIzE2MDtcbiYjMTYwOyI7CiAgICAgICAgfQogICAgICAgIHRzLmlubmVySFRNTCA9IHY7CiAgICAgICAgdmFyIGggPSBNYXRoLm1pbih0aGlzLmdyb3dNYXgsIE1hdGgubWF4KHRzLm9mZnNldEhlaWdodCwgdGhpcy5ncm93TWluKSk7CiAgICAgICAgaWYoaCAhPSB0aGlzLmxhc3RIZWlnaHQpewogICAgICAgICAgICB0aGlzLmxhc3RIZWlnaHQgPSBoOwogICAgICAgICAgICB0aGlzLmVsLnNldEhlaWdodChoKTsKICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoImF1dG9zaXplIiwgdGhpcywgaCk7CiAgICAgICAgfQogICAgfQp9KTsKCkV4dC5mb3JtLk51bWJlckZpZWxkID0gZnVuY3Rpb24oY29uZmlnKXsKICAgIEV4dC5mb3JtLk51bWJlckZpZWxkLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBjb25maWcpOwp9OwoKRXh0LmV4dGVuZChFeHQuZm9ybS5OdW1iZXJGaWVsZCwgRXh0LmZvcm0uVGV4dEZpZWxkLCAgewogICAgCiAgICBmaWVsZENsYXNzOiAieC1mb3JtLWZpZWxkIHgtZm9ybS1udW0tZmllbGQiLAogICAgCiAgICBhbGxvd0RlY2ltYWxzIDogdHJ1ZSwKICAgIAogICAgZGVjaW1hbFNlcGFyYXRvciA6ICIuIiwKICAgIAogICAgZGVjaW1hbFByZWNpc2lvbiA6IDIsCiAgICAKICAgIGFsbG93TmVnYXRpdmUgOiB0cnVlLAogICAgCiAgICBtaW5WYWx1ZSA6IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSwKICAgIAogICAgbWF4VmFsdWUgOiBOdW1iZXIuTUFYX1ZBTFVFLAogICAgCiAgICBtaW5UZXh0IDogIlRoZSBtaW5pbXVtIHZhbHVlIGZvciB0aGlzIGZpZWxkIGlzIHswfSIsCiAgICAKICAgIG1heFRleHQgOiAiVGhlIG1heGltdW0gdmFsdWUgZm9yIHRoaXMgZmllbGQgaXMgezB9IiwKICAgIAogICAgbmFuVGV4dCA6ICJ7MH0gaXMgbm90IGEgdmFsaWQgbnVtYmVyIiwKCiAgICAgICAgaW5pdEV2ZW50cyA6IGZ1bmN0aW9uKCl7CiAgICAgICAgRXh0LmZvcm0uTnVtYmVyRmllbGQuc3VwZXJjbGFzcy5pbml0RXZlbnRzLmNhbGwodGhpcyk7CiAgICAgICAgdmFyIGFsbG93ZWQgPSAiMDEyMzQ1Njc4OSI7CiAgICAgICAgaWYodGhpcy5hbGxvd0RlY2ltYWxzKXsKICAgICAgICAgICAgYWxsb3dlZCArPSB0aGlzLmRlY2ltYWxTZXBhcmF0b3I7CiAgICAgICAgfQogICAgICAgIGlmKHRoaXMuYWxsb3dOZWdhdGl2ZSl7CiAgICAgICAgICAgIGFsbG93ZWQgKz0gIi0iOwogICAgICAgIH0KICAgICAgICB0aGlzLnN0cmlwQ2hhcnNSZSA9IG5ldyBSZWdFeHAoJ1teJythbGxvd2VkKyddJywgJ2dpJyk7CiAgICAgICAgdmFyIGtleVByZXNzID0gZnVuY3Rpb24oZSl7CiAgICAgICAgICAgIHZhciBrID0gZS5nZXRLZXkoKTsKICAgICAgICAgICAgaWYoIUV4dC5pc0lFICYmIChlLmlzU3BlY2lhbEtleSgpIHx8IGsgPT0gZS5CQUNLU1BBQ0UgfHwgayA9PSBlLkRFTEVURSkpewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBjID0gZS5nZXRDaGFyQ29kZSgpOwogICAgICAgICAgICBpZihhbGxvd2VkLmluZGV4T2YoU3RyaW5nLmZyb21DaGFyQ29kZShjKSkgPT09IC0xKXsKICAgICAgICAgICAgICAgIGUuc3RvcEV2ZW50KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHRoaXMuZWwub24oImtleXByZXNzIiwga2V5UHJlc3MsIHRoaXMpOwogICAgfSwKCiAgICAgICAgdmFsaWRhdGVWYWx1ZSA6IGZ1bmN0aW9uKHZhbHVlKXsKICAgICAgICBpZighRXh0LmZvcm0uTnVtYmVyRmllbGQuc3VwZXJjbGFzcy52YWxpZGF0ZVZhbHVlLmNhbGwodGhpcywgdmFsdWUpKXsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBpZih2YWx1ZS5sZW5ndGggPCAxKXsgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICB2YXIgbnVtID0gdGhpcy5wYXJzZVZhbHVlKHZhbHVlKTsKICAgICAgICBpZihpc05hTihudW0pKXsKICAgICAgICAgICAgdGhpcy5tYXJrSW52YWxpZChTdHJpbmcuZm9ybWF0KHRoaXMubmFuVGV4dCwgdmFsdWUpKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBpZihudW0gPCB0aGlzLm1pblZhbHVlKXsKICAgICAgICAgICAgdGhpcy5tYXJrSW52YWxpZChTdHJpbmcuZm9ybWF0KHRoaXMubWluVGV4dCwgdGhpcy5taW5WYWx1ZSkpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmKG51bSA+IHRoaXMubWF4VmFsdWUpewogICAgICAgICAgICB0aGlzLm1hcmtJbnZhbGlkKFN0cmluZy5mb3JtYXQodGhpcy5tYXhUZXh0LCB0aGlzLm1heFZhbHVlKSk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9LAoKICAgIGdldFZhbHVlIDogZnVuY3Rpb24oKXsKICAgICAgICByZXR1cm4gdGhpcy5maXhQcmVjaXNpb24odGhpcy5wYXJzZVZhbHVlKEV4dC5mb3JtLk51bWJlckZpZWxkLnN1cGVyY2xhc3MuZ2V0VmFsdWUuY2FsbCh0aGlzKSkpOwogICAgfSwKCiAgICAgICAgcGFyc2VWYWx1ZSA6IGZ1bmN0aW9uKHZhbHVlKXsKICAgICAgICB2YWx1ZSA9IHBhcnNlRmxvYXQoU3RyaW5nKHZhbHVlKS5yZXBsYWNlKHRoaXMuZGVjaW1hbFNlcGFyYXRvciwgIi4iKSk7CiAgICAgICAgcmV0dXJuIGlzTmFOKHZhbHVlKSA/ICcnIDogdmFsdWU7CiAgICB9LAoKICAgICAgICBmaXhQcmVjaXNpb24gOiBmdW5jdGlvbih2YWx1ZSl7CiAgICAgICAgdmFyIG5hbiA9IGlzTmFOKHZhbHVlKTsKICAgICAgICBpZighdGhpcy5hbGxvd0RlY2ltYWxzIHx8IHRoaXMuZGVjaW1hbFByZWNpc2lvbiA9PSAtMSB8fCBuYW4gfHwgIXZhbHVlKXsKICAgICAgICAgICAgcmV0dXJuIG5hbiA/ICcnIDogdmFsdWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlKS50b0ZpeGVkKHRoaXMuZGVjaW1hbFByZWNpc2lvbik7CiAgICB9LAoKICAgIHNldFZhbHVlIDogZnVuY3Rpb24odil7CiAgICAgICAgRXh0LmZvcm0uTnVtYmVyRmllbGQuc3VwZXJjbGFzcy5zZXRWYWx1ZS5jYWxsKHRoaXMsIFN0cmluZyh2KS5yZXBsYWNlKCIuIiwgdGhpcy5kZWNpbWFsU2VwYXJhdG9yKSk7CiAgICB9LAoKICAgICAgICBkZWNpbWFsUHJlY2lzaW9uRmNuIDogZnVuY3Rpb24odil7CiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3Iodik7CiAgICB9LAoKICAgIGJlZm9yZUJsdXIgOiBmdW5jdGlvbigpewogICAgICAgIHZhciB2ID0gdGhpcy5wYXJzZVZhbHVlKHRoaXMuZ2V0UmF3VmFsdWUoKSk7CiAgICAgICAgaWYodil7CiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5maXhQcmVjaXNpb24odikpOwogICAgICAgIH0KICAgIH0KfSk7CgpFeHQuZm9ybS5EYXRlRmllbGQgPSBmdW5jdGlvbihjb25maWcpewogICAgRXh0LmZvcm0uRGF0ZUZpZWxkLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBjb25maWcpOwogICAgaWYodHlwZW9mIHRoaXMubWluVmFsdWUgPT0gInN0cmluZyIpIHRoaXMubWluVmFsdWUgPSB0aGlzLnBhcnNlRGF0ZSh0aGlzLm1pblZhbHVlKTsKICAgIGlmKHR5cGVvZiB0aGlzLm1heFZhbHVlID09ICJzdHJpbmciKSB0aGlzLm1heFZhbHVlID0gdGhpcy5wYXJzZURhdGUodGhpcy5tYXhWYWx1ZSk7CiAgICB0aGlzLmRkTWF0Y2ggPSBudWxsOwogICAgaWYodGhpcy5kaXNhYmxlZERhdGVzKXsKICAgICAgICB2YXIgZGQgPSB0aGlzLmRpc2FibGVkRGF0ZXM7CiAgICAgICAgdmFyIHJlID0gIig/OiI7CiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGRkLmxlbmd0aDsgaSsrKXsKICAgICAgICAgICAgcmUgKz0gZGRbaV07CiAgICAgICAgICAgIGlmKGkgIT0gZGQubGVuZ3RoLTEpIHJlICs9ICJ8IjsKICAgICAgICB9CiAgICAgICAgdGhpcy5kZE1hdGNoID0gbmV3IFJlZ0V4cChyZSArICIpIik7CiAgICB9Cn07CgpFeHQuZXh0ZW5kKEV4dC5mb3JtLkRhdGVGaWVsZCwgRXh0LmZvcm0uVHJpZ2dlckZpZWxkLCAgewogICAgCiAgICBmb3JtYXQgOiAibS9kL3kiLAogICAgCiAgICBhbHRGb3JtYXRzIDogIm0vZC9ZfG0tZC15fG0tZC1ZfG0vZHxtLWR8bWR8bWR5fG1kWXxkIiwKICAgIAogICAgZGlzYWJsZWREYXlzIDogbnVsbCwKICAgIAogICAgZGlzYWJsZWREYXlzVGV4dCA6ICJEaXNhYmxlZCIsCiAgICAKICAgIGRpc2FibGVkRGF0ZXMgOiBudWxsLAogICAgCiAgICBkaXNhYmxlZERhdGVzVGV4dCA6ICJEaXNhYmxlZCIsCiAgICAKICAgIG1pblZhbHVlIDogbnVsbCwKICAgIAogICAgbWF4VmFsdWUgOiBudWxsLAogICAgCiAgICBtaW5UZXh0IDogIlRoZSBkYXRlIGluIHRoaXMgZmllbGQgbXVzdCBiZSBlcXVhbCB0byBvciBhZnRlciB7MH0iLAogICAgCiAgICBtYXhUZXh0IDogIlRoZSBkYXRlIGluIHRoaXMgZmllbGQgbXVzdCBiZSBlcXVhbCB0byBvciBiZWZvcmUgezB9IiwKICAgIAogICAgaW52YWxpZFRleHQgOiAiezB9IGlzIG5vdCBhIHZhbGlkIGRhdGUgLSBpdCBtdXN0IGJlIGluIHRoZSBmb3JtYXQgezF9IiwKICAgIAogICAgdHJpZ2dlckNsYXNzIDogJ3gtZm9ybS1kYXRlLXRyaWdnZXInLAogICAgCgogICAgICAgIGRlZmF1bHRBdXRvQ3JlYXRlIDoge3RhZzogImlucHV0IiwgdHlwZTogInRleHQiLCBzaXplOiAiMTAiLCBhdXRvY29tcGxldGU6ICJvZmYifSwKCiAgICAgICAgdmFsaWRhdGVWYWx1ZSA6IGZ1bmN0aW9uKHZhbHVlKXsKICAgICAgICB2YWx1ZSA9IHRoaXMuZm9ybWF0RGF0ZSh2YWx1ZSk7CiAgICAgICAgaWYoIUV4dC5mb3JtLkRhdGVGaWVsZC5zdXBlcmNsYXNzLnZhbGlkYXRlVmFsdWUuY2FsbCh0aGlzLCB2YWx1ZSkpewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmKHZhbHVlLmxlbmd0aCA8IDEpeyAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHZhciBzdmFsdWUgPSB2YWx1ZTsKICAgICAgICB2YWx1ZSA9IHRoaXMucGFyc2VEYXRlKHZhbHVlKTsKICAgICAgICBpZighdmFsdWUpewogICAgICAgICAgICB0aGlzLm1hcmtJbnZhbGlkKFN0cmluZy5mb3JtYXQodGhpcy5pbnZhbGlkVGV4dCwgc3ZhbHVlLCB0aGlzLmZvcm1hdCkpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHZhciB0aW1lID0gdmFsdWUuZ2V0VGltZSgpOwogICAgICAgIGlmKHRoaXMubWluVmFsdWUgJiYgdGltZSA8IHRoaXMubWluVmFsdWUuZ2V0VGltZSgpKXsKICAgICAgICAgICAgdGhpcy5tYXJrSW52YWxpZChTdHJpbmcuZm9ybWF0KHRoaXMubWluVGV4dCwgdGhpcy5mb3JtYXREYXRlKHRoaXMubWluVmFsdWUpKSk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYodGhpcy5tYXhWYWx1ZSAmJiB0aW1lID4gdGhpcy5tYXhWYWx1ZS5nZXRUaW1lKCkpewogICAgICAgICAgICB0aGlzLm1hcmtJbnZhbGlkKFN0cmluZy5mb3JtYXQodGhpcy5tYXhUZXh0LCB0aGlzLmZvcm1hdERhdGUodGhpcy5tYXhWYWx1ZSkpKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBpZih0aGlzLmRpc2FibGVkRGF5cyl7CiAgICAgICAgICAgIHZhciBkYXkgPSB2YWx1ZS5nZXREYXkoKTsKICAgICAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuZGlzYWJsZWREYXlzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIAlpZihkYXkgPT09IHRoaXMuZGlzYWJsZWREYXlzW2ldKXsKICAgICAgICAgICAgCSAgICB0aGlzLm1hcmtJbnZhbGlkKHRoaXMuZGlzYWJsZWREYXlzVGV4dCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAJfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhciBmdmFsdWUgPSB0aGlzLmZvcm1hdERhdGUodmFsdWUpOwogICAgICAgIGlmKHRoaXMuZGRNYXRjaCAmJiB0aGlzLmRkTWF0Y2gudGVzdChmdmFsdWUpKXsKICAgICAgICAgICAgdGhpcy5tYXJrSW52YWxpZChTdHJpbmcuZm9ybWF0KHRoaXMuZGlzYWJsZWREYXRlc1RleHQsIGZ2YWx1ZSkpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgfSwKCiAgICAgICAgICAgIHZhbGlkYXRlQmx1ciA6IGZ1bmN0aW9uKCl7CiAgICAgICAgcmV0dXJuICF0aGlzLm1lbnUgfHwgIXRoaXMubWVudS5pc1Zpc2libGUoKTsKICAgIH0sCgogICAgCiAgICBnZXRWYWx1ZSA6IGZ1bmN0aW9uKCl7CiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VEYXRlKEV4dC5mb3JtLkRhdGVGaWVsZC5zdXBlcmNsYXNzLmdldFZhbHVlLmNhbGwodGhpcykpIHx8ICIiOwogICAgfSwKCiAgICAKICAgIHNldFZhbHVlIDogZnVuY3Rpb24oZGF0ZSl7CiAgICAgICAgRXh0LmZvcm0uRGF0ZUZpZWxkLnN1cGVyY2xhc3Muc2V0VmFsdWUuY2FsbCh0aGlzLCB0aGlzLmZvcm1hdERhdGUodGhpcy5wYXJzZURhdGUoZGF0ZSkpKTsKICAgIH0sCgogICAgICAgIHBhcnNlRGF0ZSA6IGZ1bmN0aW9uKHZhbHVlKXsKICAgICAgICBpZighdmFsdWUgfHwgdmFsdWUgaW5zdGFuY2VvZiBEYXRlKXsKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0KICAgICAgICB2YXIgdiA9IERhdGUucGFyc2VEYXRlKHZhbHVlLCB0aGlzLmZvcm1hdCk7CiAgICAgICAgaWYoIXYgJiYgdGhpcy5hbHRGb3JtYXRzKXsKICAgICAgICAgICAgaWYoIXRoaXMuYWx0Rm9ybWF0c0FycmF5KXsKICAgICAgICAgICAgICAgIHRoaXMuYWx0Rm9ybWF0c0FycmF5ID0gdGhpcy5hbHRGb3JtYXRzLnNwbGl0KCJ8Iik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gdGhpcy5hbHRGb3JtYXRzQXJyYXkubGVuZ3RoOyBpIDwgbGVuICYmICF2OyBpKyspewogICAgICAgICAgICAgICAgdiA9IERhdGUucGFyc2VEYXRlKHZhbHVlLCB0aGlzLmFsdEZvcm1hdHNBcnJheVtpXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHY7CiAgICB9LAoKICAgICAgICBmb3JtYXREYXRlIDogZnVuY3Rpb24oZGF0ZSl7CiAgICAgICAgcmV0dXJuICghZGF0ZSB8fCAhKGRhdGUgaW5zdGFuY2VvZiBEYXRlKSkgPwogICAgICAgICAgICAgICBkYXRlIDogZGF0ZS5kYXRlRm9ybWF0KHRoaXMuZm9ybWF0KTsKICAgIH0sCgogICAgICAgIG1lbnVMaXN0ZW5lcnMgOiB7CiAgICAgICAgc2VsZWN0OiBmdW5jdGlvbihtLCBkKXsKICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShkKTsKICAgICAgICB9LAogICAgICAgIHNob3cgOiBmdW5jdGlvbigpeyAgICAgICAgICAgICB0aGlzLm9uRm9jdXMoKTsKICAgICAgICB9LAogICAgICAgIGhpZGUgOiBmdW5jdGlvbigpewogICAgICAgICAgICB0aGlzLmZvY3VzLmRlZmVyKDEwLCB0aGlzKTsKICAgICAgICAgICAgdmFyIG1sID0gdGhpcy5tZW51TGlzdGVuZXJzOwogICAgICAgICAgICB0aGlzLm1lbnUudW4oInNlbGVjdCIsIG1sLnNlbGVjdCwgIHRoaXMpOwogICAgICAgICAgICB0aGlzLm1lbnUudW4oInNob3ciLCBtbC5zaG93LCAgdGhpcyk7CiAgICAgICAgICAgIHRoaXMubWVudS51bigiaGlkZSIsIG1sLmhpZGUsICB0aGlzKTsKICAgICAgICB9CiAgICB9LAoKICAgICAgICAgICAgb25UcmlnZ2VyQ2xpY2sgOiBmdW5jdGlvbigpewogICAgICAgIGlmKHRoaXMuZGlzYWJsZWQpewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmKHRoaXMubWVudSA9PSBudWxsKXsKICAgICAgICAgICAgdGhpcy5tZW51ID0gbmV3IEV4dC5tZW51LkRhdGVNZW51KCk7CiAgICAgICAgfQogICAgICAgIEV4dC5hcHBseSh0aGlzLm1lbnUucGlja2VyLCAgewogICAgICAgICAgICBtaW5EYXRlIDogdGhpcy5taW5WYWx1ZSwKICAgICAgICAgICAgbWF4RGF0ZSA6IHRoaXMubWF4VmFsdWUsCiAgICAgICAgICAgIGRpc2FibGVkRGF0ZXNSRSA6IHRoaXMuZGRNYXRjaCwKICAgICAgICAgICAgZGlzYWJsZWREYXRlc1RleHQgOiB0aGlzLmRpc2FibGVkRGF0ZXNUZXh0LAogICAgICAgICAgICBkaXNhYmxlZERheXMgOiB0aGlzLmRpc2FibGVkRGF5cywKICAgICAgICAgICAgZGlzYWJsZWREYXlzVGV4dCA6IHRoaXMuZGlzYWJsZWREYXlzVGV4dCwKICAgICAgICAgICAgZm9ybWF0IDogdGhpcy5mb3JtYXQsCiAgICAgICAgICAgIG1pblRleHQgOiBTdHJpbmcuZm9ybWF0KHRoaXMubWluVGV4dCwgdGhpcy5mb3JtYXREYXRlKHRoaXMubWluVmFsdWUpKSwKICAgICAgICAgICAgbWF4VGV4dCA6IFN0cmluZy5mb3JtYXQodGhpcy5tYXhUZXh0LCB0aGlzLmZvcm1hdERhdGUodGhpcy5tYXhWYWx1ZSkpCiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5tZW51Lm9uKEV4dC5hcHBseSh7fSwgdGhpcy5tZW51TGlzdGVuZXJzLCB7CiAgICAgICAgICAgIHNjb3BlOnRoaXMKICAgICAgICB9KSk7CiAgICAgICAgdGhpcy5tZW51LnBpY2tlci5zZXRWYWx1ZSh0aGlzLmdldFZhbHVlKCkgfHwgbmV3IERhdGUoKSk7CiAgICAgICAgdGhpcy5tZW51LnNob3codGhpcy5lbCwgInRsLWJsPyIpOwogICAgfSwKCiAgICBiZWZvcmVCbHVyIDogZnVuY3Rpb24oKXsKICAgICAgICB2YXIgdiA9IHRoaXMucGFyc2VEYXRlKHRoaXMuZ2V0UmF3VmFsdWUoKSk7CiAgICAgICAgaWYodil7CiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUodik7CiAgICAgICAgfQogICAgfQoKICAgIAogICAgCiAgICAKICAgIAp9KTsKCkV4dC5mb3JtLkNvbWJvQm94ID0gZnVuY3Rpb24oY29uZmlnKXsKICAgIEV4dC5mb3JtLkNvbWJvQm94LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBjb25maWcpOwogICAgdGhpcy5hZGRFdmVudHMoewogICAgICAgIAogICAgICAgICdleHBhbmQnIDogdHJ1ZSwKICAgICAgICAKICAgICAgICAnY29sbGFwc2UnIDogdHJ1ZSwKICAgICAgICAKICAgICAgICAnYmVmb3Jlc2VsZWN0JyA6IHRydWUsCiAgICAgICAgCiAgICAgICAgJ3NlbGVjdCcgOiB0cnVlLAogICAgICAgIAogICAgICAgICdiZWZvcmVxdWVyeSc6IHRydWUKICAgIH0pOwogICAgaWYodGhpcy50cmFuc2Zvcm0pewogICAgICAgIHRoaXMuYWxsb3dEb21Nb3ZlID0gZmFsc2U7CiAgICAgICAgdmFyIHMgPSBFeHQuZ2V0RG9tKHRoaXMudHJhbnNmb3JtKTsKICAgICAgICBpZighdGhpcy5oaWRkZW5OYW1lKXsKICAgICAgICAgICAgdGhpcy5oaWRkZW5OYW1lID0gcy5uYW1lOwogICAgICAgIH0KICAgICAgICBpZighdGhpcy5zdG9yZSl7CiAgICAgICAgICAgIHRoaXMubW9kZSA9ICdsb2NhbCc7CiAgICAgICAgICAgIHZhciBkID0gW10sIG9wdHMgPSBzLm9wdGlvbnM7CiAgICAgICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IG9wdHMubGVuZ3RoO2kgPCBsZW47IGkrKyl7CiAgICAgICAgICAgICAgICB2YXIgbyA9IG9wdHNbaV07CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSAoRXh0LmlzSUUgPyBvLmdldEF0dHJpYnV0ZU5vZGUoJ3ZhbHVlJykuc3BlY2lmaWVkIDogby5oYXNBdHRyaWJ1dGUoJ3ZhbHVlJykpID8gby52YWx1ZSA6IG8udGV4dDsKICAgICAgICAgICAgICAgIGlmKG8uc2VsZWN0ZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkLnB1c2goW3ZhbHVlLCBvLnRleHRdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnN0b3JlID0gbmV3IEV4dC5kYXRhLlNpbXBsZVN0b3JlKHsKICAgICAgICAgICAgICAgICdpZCc6IDAsCiAgICAgICAgICAgICAgICBmaWVsZHM6IFsndmFsdWUnLCAndGV4dCddLAogICAgICAgICAgICAgICAgZGF0YSA6IGQKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRoaXMudmFsdWVGaWVsZCA9ICd2YWx1ZSc7CiAgICAgICAgICAgIHRoaXMuZGlzcGxheUZpZWxkID0gJ3RleHQnOwogICAgICAgIH0KICAgICAgICBzLm5hbWUgPSBFeHQuaWQoKTsgICAgICAgICBpZighdGhpcy5sYXp5UmVuZGVyKXsKICAgICAgICAgICAgdGhpcy50YXJnZXQgPSB0cnVlOwogICAgICAgICAgICB0aGlzLmVsID0gRXh0LkRvbUhlbHBlci5pbnNlcnRCZWZvcmUocywgdGhpcy5hdXRvQ3JlYXRlIHx8IHRoaXMuZGVmYXVsdEF1dG9DcmVhdGUpOwogICAgICAgICAgICBzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocyk7ICAgICAgICAgICAgIHRoaXMucmVuZGVyKHRoaXMuZWwucGFyZW50Tm9kZSk7CiAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIHMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzKTsgICAgICAgICB9CgogICAgfQogICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gLTE7CiAgICBpZih0aGlzLm1vZGUgPT0gJ2xvY2FsJyl7CiAgICAgICAgaWYoY29uZmlnLnF1ZXJ5RGVsYXkgPT09IHVuZGVmaW5lZCl7CiAgICAgICAgICAgIHRoaXMucXVlcnlEZWxheSA9IDEwOwogICAgICAgIH0KICAgICAgICBpZihjb25maWcubWluQ2hhcnMgPT09IHVuZGVmaW5lZCl7CiAgICAgICAgICAgIHRoaXMubWluQ2hhcnMgPSAwOwogICAgICAgIH0KICAgIH0KfTsKCkV4dC5leHRlbmQoRXh0LmZvcm0uQ29tYm9Cb3gsIEV4dC5mb3JtLlRyaWdnZXJGaWVsZCwgewogICAgCiAgICAKICAgIAogICAgCiAgICAKCiAgICAgICAgZGVmYXVsdEF1dG9DcmVhdGUgOiB7dGFnOiAiaW5wdXQiLCB0eXBlOiAidGV4dCIsIHNpemU6ICIyNCIsIGF1dG9jb21wbGV0ZTogIm9mZiJ9LAogICAgCiAgICBsaXN0V2lkdGg6IHVuZGVmaW5lZCwKICAgIAogICAgZGlzcGxheUZpZWxkOiB1bmRlZmluZWQsCiAgICAKICAgIHZhbHVlRmllbGQ6IHVuZGVmaW5lZCwKICAgIAogICAgaGlkZGVuTmFtZTogdW5kZWZpbmVkLAogICAgCiAgICBsaXN0Q2xhc3M6ICcnLAogICAgCiAgICBzZWxlY3RlZENsYXNzOiAneC1jb21iby1zZWxlY3RlZCcsCiAgICAKICAgIHRyaWdnZXJDbGFzcyA6ICd4LWZvcm0tYXJyb3ctdHJpZ2dlcicsCiAgICAKICAgIHNoYWRvdzonc2lkZXMnLAogICAgCiAgICBsaXN0QWxpZ246ICd0bC1ibD8nLAogICAgCiAgICBtYXhIZWlnaHQ6IDMwMCwKICAgIAogICAgdHJpZ2dlckFjdGlvbjogJ3F1ZXJ5JywKICAgIAogICAgbWluQ2hhcnMgOiA0LAogICAgCiAgICB0eXBlQWhlYWQ6IGZhbHNlLAogICAgCiAgICBxdWVyeURlbGF5OiA1MDAsCiAgICAKICAgIHBhZ2VTaXplOiAwLAogICAgCiAgICBzZWxlY3RPbkZvY3VzOmZhbHNlLAogICAgCiAgICBxdWVyeVBhcmFtOiAncXVlcnknLAogICAgCiAgICBsb2FkaW5nVGV4dDogJ0xvYWRpbmcuLi4nLAogICAgCiAgICByZXNpemFibGU6IGZhbHNlLAogICAgCiAgICBoYW5kbGVIZWlnaHQgOiA4LAogICAgCiAgICBlZGl0YWJsZTogdHJ1ZSwKICAgIAogICAgYWxsUXVlcnk6ICcnLAogICAgCiAgICBtb2RlOiAncmVtb3RlJywKICAgIAogICAgbWluTGlzdFdpZHRoIDogNzAsCiAgICAKICAgIGZvcmNlU2VsZWN0aW9uOmZhbHNlLAogICAgCiAgICB0eXBlQWhlYWREZWxheSA6IDI1MCwKICAgIAogICAgdmFsdWVOb3RGb3VuZFRleHQgOiB1bmRlZmluZWQsCgogICAgICAgIG9uUmVuZGVyIDogZnVuY3Rpb24oY3QsIHBvc2l0aW9uKXsKICAgICAgICBFeHQuZm9ybS5Db21ib0JveC5zdXBlcmNsYXNzLm9uUmVuZGVyLmNhbGwodGhpcywgY3QsIHBvc2l0aW9uKTsKICAgICAgICBpZih0aGlzLmhpZGRlbk5hbWUpewogICAgICAgICAgICB0aGlzLmhpZGRlbkZpZWxkID0gdGhpcy5lbC5pbnNlcnRTaWJsaW5nKHt0YWc6J2lucHV0JywgdHlwZTonaGlkZGVuJywgbmFtZTogdGhpcy5oaWRkZW5OYW1lLCBpZDogICh0aGlzLmhpZGRlbklkfHx0aGlzLmhpZGRlbk5hbWUpfSwKICAgICAgICAgICAgICAgICAgICAnYmVmb3JlJywgdHJ1ZSk7CiAgICAgICAgICAgIHRoaXMuaGlkZGVuRmllbGQudmFsdWUgPQogICAgICAgICAgICAgICAgdGhpcy5oaWRkZW5WYWx1ZSAhPT0gdW5kZWZpbmVkID8gdGhpcy5oaWRkZW5WYWx1ZSA6CiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlICE9PSB1bmRlZmluZWQgPyB0aGlzLnZhbHVlIDogJyc7CgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVsLmRvbS5yZW1vdmVBdHRyaWJ1dGUoJ25hbWUnKTsKICAgICAgICB9CiAgICAgICAgaWYoRXh0LmlzR2Vja28pewogICAgICAgICAgICB0aGlzLmVsLmRvbS5zZXRBdHRyaWJ1dGUoJ2F1dG9jb21wbGV0ZScsICdvZmYnKTsKICAgICAgICB9CgogICAgICAgIHZhciBjbHMgPSAneC1jb21iby1saXN0JzsKCiAgICAgICAgdGhpcy5saXN0ID0gbmV3IEV4dC5MYXllcih7CiAgICAgICAgICAgIHNoYWRvdzogdGhpcy5zaGFkb3csIGNsczogW2NscywgdGhpcy5saXN0Q2xhc3NdLmpvaW4oJyAnKSwgY29uc3RyYWluOmZhbHNlCiAgICAgICAgfSk7CgogICAgICAgIHZhciBsdyA9IHRoaXMubGlzdFdpZHRoIHx8IE1hdGgubWF4KHRoaXMud3JhcC5nZXRXaWR0aCgpLCB0aGlzLm1pbkxpc3RXaWR0aCk7CiAgICAgICAgdGhpcy5saXN0LnNldFdpZHRoKGx3KTsKICAgICAgICB0aGlzLmxpc3Quc3dhbGxvd0V2ZW50KCdtb3VzZXdoZWVsJyk7CiAgICAgICAgdGhpcy5hc3NldEhlaWdodCA9IDA7CgogICAgICAgIGlmKHRoaXMudGl0bGUpewogICAgICAgICAgICB0aGlzLmhlYWRlciA9IHRoaXMubGlzdC5jcmVhdGVDaGlsZCh7Y2xzOmNscysnLWhkJywgaHRtbDogdGhpcy50aXRsZX0pOwogICAgICAgICAgICB0aGlzLmFzc2V0SGVpZ2h0ICs9IHRoaXMuaGVhZGVyLmdldEhlaWdodCgpOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5pbm5lckxpc3QgPSB0aGlzLmxpc3QuY3JlYXRlQ2hpbGQoe2NsczpjbHMrJy1pbm5lcid9KTsKICAgICAgICB0aGlzLmlubmVyTGlzdC5vbignbW91c2VvdmVyJywgdGhpcy5vblZpZXdPdmVyLCB0aGlzKTsKICAgICAgICB0aGlzLmlubmVyTGlzdC5vbignbW91c2Vtb3ZlJywgdGhpcy5vblZpZXdNb3ZlLCB0aGlzKTsKICAgICAgICB0aGlzLmlubmVyTGlzdC5zZXRXaWR0aChsdyAtIHRoaXMubGlzdC5nZXRGcmFtZVdpZHRoKCdscicpKQoKICAgICAgICBpZih0aGlzLnBhZ2VTaXplKXsKICAgICAgICAgICAgdGhpcy5mb290ZXIgPSB0aGlzLmxpc3QuY3JlYXRlQ2hpbGQoe2NsczpjbHMrJy1mdCd9KTsKICAgICAgICAgICAgdGhpcy5wYWdlVGIgPSBuZXcgRXh0LlBhZ2luZ1Rvb2xiYXIodGhpcy5mb290ZXIsIHRoaXMuc3RvcmUsCiAgICAgICAgICAgICAgICAgICAge3BhZ2VTaXplOiB0aGlzLnBhZ2VTaXplfSk7CiAgICAgICAgICAgIHRoaXMuYXNzZXRIZWlnaHQgKz0gdGhpcy5mb290ZXIuZ2V0SGVpZ2h0KCk7CiAgICAgICAgfQoKICAgICAgICBpZighdGhpcy50cGwpewogICAgICAgICAgICB0aGlzLnRwbCA9ICc8ZGl2IGNsYXNzPSInK2NscysnLWl0ZW0iPnsnICsgdGhpcy5kaXNwbGF5RmllbGQgKyAnfTwvZGl2Pic7CiAgICAgICAgfQoKICAgICAgICB0aGlzLnZpZXcgPSBuZXcgRXh0LlZpZXcodGhpcy5pbm5lckxpc3QsIHRoaXMudHBsLCB7CiAgICAgICAgICAgIHNpbmdsZVNlbGVjdDp0cnVlLCBzdG9yZTogdGhpcy5zdG9yZSwgc2VsZWN0ZWRDbGFzczogdGhpcy5zZWxlY3RlZENsYXNzCiAgICAgICAgfSk7CgogICAgICAgIHRoaXMudmlldy5vbignY2xpY2snLCB0aGlzLm9uVmlld0NsaWNrLCB0aGlzKTsKCiAgICAgICAgdGhpcy5zdG9yZS5vbignYmVmb3JlbG9hZCcsIHRoaXMub25CZWZvcmVMb2FkLCB0aGlzKTsKICAgICAgICB0aGlzLnN0b3JlLm9uKCdsb2FkJywgdGhpcy5vbkxvYWQsIHRoaXMpOwogICAgICAgIHRoaXMuc3RvcmUub24oJ2xvYWRleGNlcHRpb24nLCB0aGlzLmNvbGxhcHNlLCB0aGlzKTsKCiAgICAgICAgaWYodGhpcy5yZXNpemFibGUpewogICAgICAgICAgICB0aGlzLnJlc2l6ZXIgPSBuZXcgRXh0LlJlc2l6YWJsZSh0aGlzLmxpc3QsICB7CiAgICAgICAgICAgICAgIHBpbm5lZDp0cnVlLCBoYW5kbGVzOidzZScKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRoaXMucmVzaXplci5vbigncmVzaXplJywgZnVuY3Rpb24ociwgdywgaCl7CiAgICAgICAgICAgICAgICB0aGlzLm1heEhlaWdodCA9IGgtdGhpcy5oYW5kbGVIZWlnaHQtdGhpcy5saXN0LmdldEZyYW1lV2lkdGgoJ3RiJyktdGhpcy5hc3NldEhlaWdodDsKICAgICAgICAgICAgICAgIHRoaXMubGlzdFdpZHRoID0gdzsKICAgICAgICAgICAgICAgIHRoaXMuaW5uZXJMaXN0LnNldFdpZHRoKHcgLSB0aGlzLmxpc3QuZ2V0RnJhbWVXaWR0aCgnbHInKSk7CiAgICAgICAgICAgICAgICB0aGlzLnJlc3RyaWN0SGVpZ2h0KCk7CiAgICAgICAgICAgIH0sIHRoaXMpOwogICAgICAgICAgICB0aGlzW3RoaXMucGFnZVNpemU/J2Zvb3Rlcic6J2lubmVyTGlzdCddLnNldFN0eWxlKCdtYXJnaW4tYm90dG9tJywgdGhpcy5oYW5kbGVIZWlnaHQrJ3B4Jyk7CiAgICAgICAgfQogICAgICAgIGlmKCF0aGlzLmVkaXRhYmxlKXsKICAgICAgICAgICAgdGhpcy5lZGl0YWJsZSA9IHRydWU7CiAgICAgICAgICAgIHRoaXMuc2V0RWRpdGFibGUoZmFsc2UpOwogICAgICAgIH0KICAgIH0sCgogICAgICAgIGluaXRFdmVudHMgOiBmdW5jdGlvbigpewogICAgICAgIEV4dC5mb3JtLkNvbWJvQm94LnN1cGVyY2xhc3MuaW5pdEV2ZW50cy5jYWxsKHRoaXMpOwoKICAgICAgICB0aGlzLmtleU5hdiA9IG5ldyBFeHQuS2V5TmF2KHRoaXMuZWwsIHsKICAgICAgICAgICAgInVwIiA6IGZ1bmN0aW9uKGUpewogICAgICAgICAgICAgICAgdGhpcy5pbktleU1vZGUgPSB0cnVlOwogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RQcmV2KCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAiZG93biIgOiBmdW5jdGlvbihlKXsKICAgICAgICAgICAgICAgIGlmKCF0aGlzLmlzRXhwYW5kZWQoKSl7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vblRyaWdnZXJDbGljaygpOwogICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbktleU1vZGUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0TmV4dCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgImVudGVyIiA6IGZ1bmN0aW9uKGUpewogICAgICAgICAgICAgICAgdGhpcy5vblZpZXdDbGljaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICJlc2MiIDogZnVuY3Rpb24oZSl7CiAgICAgICAgICAgICAgICB0aGlzLmNvbGxhcHNlKCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAidGFiIiA6IGZ1bmN0aW9uKGUpewogICAgICAgICAgICAgICAgdGhpcy5vblZpZXdDbGljayhmYWxzZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIHNjb3BlIDogdGhpcywKCiAgICAgICAgICAgIGRvUmVsYXkgOiBmdW5jdGlvbihmb28sIGJhciwgaG5hbWUpewogICAgICAgICAgICAgICAgaWYoaG5hbWUgPT0gJ2Rvd24nIHx8IHRoaXMuc2NvcGUuaXNFeHBhbmRlZCgpKXsKICAgICAgICAgICAgICAgICAgIHJldHVybiBFeHQuS2V5TmF2LnByb3RvdHlwZS5kb1JlbGF5LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGZvcmNlS2V5RG93bjogdHJ1ZQogICAgICAgIH0pOwogICAgICAgIHRoaXMucXVlcnlEZWxheSA9IE1hdGgubWF4KHRoaXMucXVlcnlEZWxheSB8fCAxMCwKICAgICAgICAgICAgICAgIHRoaXMubW9kZSA9PSAnbG9jYWwnID8gMTAgOiAyNTApOwogICAgICAgIHRoaXMuZHFUYXNrID0gbmV3IEV4dC51dGlsLkRlbGF5ZWRUYXNrKHRoaXMuaW5pdFF1ZXJ5LCB0aGlzKTsKICAgICAgICBpZih0aGlzLnR5cGVBaGVhZCl7CiAgICAgICAgICAgIHRoaXMudGFUYXNrID0gbmV3IEV4dC51dGlsLkRlbGF5ZWRUYXNrKHRoaXMub25UeXBlQWhlYWQsIHRoaXMpOwogICAgICAgIH0KICAgICAgICBpZih0aGlzLmVkaXRhYmxlICE9PSBmYWxzZSl7CiAgICAgICAgICAgIHRoaXMuZWwub24oImtleXVwIiwgdGhpcy5vbktleVVwLCB0aGlzKTsKICAgICAgICB9CiAgICAgICAgaWYodGhpcy5mb3JjZVNlbGVjdGlvbil7CiAgICAgICAgICAgIHRoaXMub24oJ2JsdXInLCB0aGlzLmRvRm9yY2UsIHRoaXMpOwogICAgICAgIH0KICAgIH0sCgogICAgb25EZXN0cm95IDogZnVuY3Rpb24oKXsKICAgICAgICBpZih0aGlzLnZpZXcpewogICAgICAgICAgICB0aGlzLnZpZXcuc2V0U3RvcmUobnVsbCk7CiAgICAgICAgICAgIHRoaXMudmlldy5lbC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTsKICAgICAgICAgICAgdGhpcy52aWV3LmVsLnJlbW92ZSgpOwogICAgICAgICAgICB0aGlzLnZpZXcucHVyZ2VMaXN0ZW5lcnMoKTsKICAgICAgICB9CiAgICAgICAgaWYodGhpcy5saXN0KXsKICAgICAgICAgICAgdGhpcy5saXN0LmRlc3Ryb3koKTsKICAgICAgICB9CiAgICAgICAgaWYodGhpcy5zdG9yZSl7CiAgICAgICAgICAgIHRoaXMuc3RvcmUudW4oJ2JlZm9yZWxvYWQnLCB0aGlzLm9uQmVmb3JlTG9hZCwgdGhpcyk7CiAgICAgICAgICAgIHRoaXMuc3RvcmUudW4oJ2xvYWQnLCB0aGlzLm9uTG9hZCwgdGhpcyk7CiAgICAgICAgICAgIHRoaXMuc3RvcmUudW4oJ2xvYWRleGNlcHRpb24nLCB0aGlzLmNvbGxhcHNlLCB0aGlzKTsKICAgICAgICB9CiAgICAgICAgRXh0LmZvcm0uQ29tYm9Cb3guc3VwZXJjbGFzcy5vbkRlc3Ryb3kuY2FsbCh0aGlzKTsKICAgIH0sCgogICAgICAgIGZpcmVLZXkgOiBmdW5jdGlvbihlKXsKICAgICAgICBpZihlLmlzTmF2S2V5UHJlc3MoKSAmJiAhdGhpcy5saXN0LmlzVmlzaWJsZSgpKXsKICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoInNwZWNpYWxrZXkiLCB0aGlzLCBlKTsKICAgICAgICB9CiAgICB9LAoKICAgICAgICBvblJlc2l6ZTogZnVuY3Rpb24odywgaCl7CiAgICAgICAgRXh0LmZvcm0uQ29tYm9Cb3guc3VwZXJjbGFzcy5vblJlc2l6ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIGlmKHRoaXMubGlzdCAmJiB0aGlzLmxpc3RXaWR0aCA9PT0gdW5kZWZpbmVkKXsKICAgICAgICAgICAgdmFyIGx3ID0gTWF0aC5tYXgodywgdGhpcy5taW5MaXN0V2lkdGgpOwogICAgICAgICAgICB0aGlzLmxpc3Quc2V0V2lkdGgobHcpOwogICAgICAgICAgICB0aGlzLmlubmVyTGlzdC5zZXRXaWR0aChsdyAtIHRoaXMubGlzdC5nZXRGcmFtZVdpZHRoKCdscicpKTsKICAgICAgICB9CiAgICB9LAoKICAgIAogICAgc2V0RWRpdGFibGUgOiBmdW5jdGlvbih2YWx1ZSl7CiAgICAgICAgaWYodmFsdWUgPT0gdGhpcy5lZGl0YWJsZSl7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5lZGl0YWJsZSA9IHZhbHVlOwogICAgICAgIGlmKCF2YWx1ZSl7CiAgICAgICAgICAgIHRoaXMuZWwuZG9tLnNldEF0dHJpYnV0ZSgncmVhZE9ubHknLCB0cnVlKTsKICAgICAgICAgICAgdGhpcy5lbC5vbignbW91c2Vkb3duJywgdGhpcy5vblRyaWdnZXJDbGljaywgIHRoaXMpOwogICAgICAgICAgICB0aGlzLmVsLmFkZENsYXNzKCd4LWNvbWJvLW5vZWRpdCcpOwogICAgICAgIH1lbHNlewogICAgICAgICAgICB0aGlzLmVsLmRvbS5zZXRBdHRyaWJ1dGUoJ3JlYWRPbmx5JywgZmFsc2UpOwogICAgICAgICAgICB0aGlzLmVsLnVuKCdtb3VzZWRvd24nLCB0aGlzLm9uVHJpZ2dlckNsaWNrLCAgdGhpcyk7CiAgICAgICAgICAgIHRoaXMuZWwucmVtb3ZlQ2xhc3MoJ3gtY29tYm8tbm9lZGl0Jyk7CiAgICAgICAgfQogICAgfSwKCiAgICAgICAgb25CZWZvcmVMb2FkIDogZnVuY3Rpb24oKXsKICAgICAgICBpZighdGhpcy5oYXNGb2N1cyl7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5pbm5lckxpc3QudXBkYXRlKHRoaXMubG9hZGluZ1RleHQgPwogICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0ibG9hZGluZy1pbmRpY2F0b3IiPicrdGhpcy5sb2FkaW5nVGV4dCsnPC9kaXY+JyA6ICcnKTsKICAgICAgICB0aGlzLnJlc3RyaWN0SGVpZ2h0KCk7CiAgICAgICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gLTE7CiAgICB9LAoKICAgICAgICBvbkxvYWQgOiBmdW5jdGlvbigpewogICAgICAgIGlmKCF0aGlzLmhhc0ZvY3VzKXsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZih0aGlzLnN0b3JlLmdldENvdW50KCkgPiAwKXsKICAgICAgICAgICAgdGhpcy5leHBhbmQoKTsKICAgICAgICAgICAgdGhpcy5yZXN0cmljdEhlaWdodCgpOwogICAgICAgICAgICBpZih0aGlzLmxhc3RRdWVyeSA9PSB0aGlzLmFsbFF1ZXJ5KXsKICAgICAgICAgICAgICAgIGlmKHRoaXMuZWRpdGFibGUpewogICAgICAgICAgICAgICAgICAgIHRoaXMuZWwuZG9tLnNlbGVjdCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYoIXRoaXMuc2VsZWN0QnlWYWx1ZSh0aGlzLnZhbHVlLCB0cnVlKSl7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3QoMCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3ROZXh0KCk7CiAgICAgICAgICAgICAgICBpZih0aGlzLnR5cGVBaGVhZCAmJiB0aGlzLmxhc3RLZXkgIT0gRXh0LkV2ZW50T2JqZWN0LkJBQ0tTUEFDRSAmJiB0aGlzLmxhc3RLZXkgIT0gRXh0LkV2ZW50T2JqZWN0LkRFTEVURSl7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50YVRhc2suZGVsYXkodGhpcy50eXBlQWhlYWREZWxheSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgdGhpcy5vbkVtcHR5UmVzdWx0cygpOwogICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgb25UeXBlQWhlYWQgOiBmdW5jdGlvbigpewogICAgICAgIGlmKHRoaXMuc3RvcmUuZ2V0Q291bnQoKSA+IDApewogICAgICAgICAgICB2YXIgciA9IHRoaXMuc3RvcmUuZ2V0QXQoMCk7CiAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IHIuZGF0YVt0aGlzLmRpc3BsYXlGaWVsZF07CiAgICAgICAgICAgIHZhciBsZW4gPSBuZXdWYWx1ZS5sZW5ndGg7CiAgICAgICAgICAgIHZhciBzZWxTdGFydCA9IHRoaXMuZ2V0UmF3VmFsdWUoKS5sZW5ndGg7CiAgICAgICAgICAgIGlmKHNlbFN0YXJ0ICE9IGxlbil7CiAgICAgICAgICAgICAgICB0aGlzLnNldFJhd1ZhbHVlKG5ld1ZhbHVlKTsKICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0VGV4dChzZWxTdGFydCwgbmV3VmFsdWUubGVuZ3RoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0sCgogICAgICAgIG9uU2VsZWN0IDogZnVuY3Rpb24ocmVjb3JkLCBpbmRleCl7CiAgICAgICAgaWYodGhpcy5maXJlRXZlbnQoJ2JlZm9yZXNlbGVjdCcsIHRoaXMsIHJlY29yZCwgaW5kZXgpICE9PSBmYWxzZSl7CiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUocmVjb3JkLmRhdGFbdGhpcy52YWx1ZUZpZWxkIHx8IHRoaXMuZGlzcGxheUZpZWxkXSk7CiAgICAgICAgICAgIHRoaXMuY29sbGFwc2UoKTsKICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoJ3NlbGVjdCcsIHRoaXMsIHJlY29yZCwgaW5kZXgpOwogICAgICAgIH0KICAgIH0sCgogICAgCiAgICBnZXRWYWx1ZSA6IGZ1bmN0aW9uKCl7CiAgICAgICAgaWYodGhpcy52YWx1ZUZpZWxkKXsKICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB0aGlzLnZhbHVlICE9ICd1bmRlZmluZWQnID8gdGhpcy52YWx1ZSA6ICcnOwogICAgICAgIH1lbHNlewogICAgICAgICAgICByZXR1cm4gRXh0LmZvcm0uQ29tYm9Cb3guc3VwZXJjbGFzcy5nZXRWYWx1ZS5jYWxsKHRoaXMpOwogICAgICAgIH0KICAgIH0sCgogICAgCiAgICBjbGVhclZhbHVlIDogZnVuY3Rpb24oKXsKICAgICAgICBpZih0aGlzLmhpZGRlbkZpZWxkKXsKICAgICAgICAgICAgdGhpcy5oaWRkZW5GaWVsZC52YWx1ZSA9ICcnOwogICAgICAgIH0KICAgICAgICB0aGlzLnNldFJhd1ZhbHVlKCcnKTsKICAgICAgICB0aGlzLmxhc3RTZWxlY3Rpb25UZXh0ID0gJyc7CiAgICAgICAgdGhpcy5hcHBseUVtcHR5VGV4dCgpOwogICAgfSwKCiAgICAKICAgIHNldFZhbHVlIDogZnVuY3Rpb24odil7CiAgICAgICAgdmFyIHRleHQgPSB2OwogICAgICAgIGlmKHRoaXMudmFsdWVGaWVsZCl7CiAgICAgICAgICAgIHZhciByID0gdGhpcy5maW5kUmVjb3JkKHRoaXMudmFsdWVGaWVsZCwgdik7CiAgICAgICAgICAgIGlmKHIpewogICAgICAgICAgICAgICAgdGV4dCA9IHIuZGF0YVt0aGlzLmRpc3BsYXlGaWVsZF07CiAgICAgICAgICAgIH1lbHNlIGlmKHRoaXMudmFsdWVOb3RGb3VuZFRleHQgIT09IHVuZGVmaW5lZCl7CiAgICAgICAgICAgICAgICB0ZXh0ID0gdGhpcy52YWx1ZU5vdEZvdW5kVGV4dDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLmxhc3RTZWxlY3Rpb25UZXh0ID0gdGV4dDsKICAgICAgICBpZih0aGlzLmhpZGRlbkZpZWxkKXsKICAgICAgICAgICAgdGhpcy5oaWRkZW5GaWVsZC52YWx1ZSA9IHY7CiAgICAgICAgfQogICAgICAgIEV4dC5mb3JtLkNvbWJvQm94LnN1cGVyY2xhc3Muc2V0VmFsdWUuY2FsbCh0aGlzLCB0ZXh0KTsKICAgICAgICB0aGlzLnZhbHVlID0gdjsKICAgIH0sCgogICAgICAgIGZpbmRSZWNvcmQgOiBmdW5jdGlvbihwcm9wLCB2YWx1ZSl7CiAgICAgICAgdmFyIHJlY29yZDsKICAgICAgICBpZih0aGlzLnN0b3JlLmdldENvdW50KCkgPiAwKXsKICAgICAgICAgICAgdGhpcy5zdG9yZS5lYWNoKGZ1bmN0aW9uKHIpewogICAgICAgICAgICAgICAgaWYoci5kYXRhW3Byb3BdID09IHZhbHVlKXsKICAgICAgICAgICAgICAgICAgICByZWNvcmQgPSByOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZWNvcmQ7CiAgICB9LAoKICAgICAgICBvblZpZXdNb3ZlIDogZnVuY3Rpb24oZSwgdCl7CiAgICAgICAgdGhpcy5pbktleU1vZGUgPSBmYWxzZTsKICAgIH0sCgogICAgICAgIG9uVmlld092ZXIgOiBmdW5jdGlvbihlLCB0KXsKICAgICAgICBpZih0aGlzLmluS2V5TW9kZSl7ICAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLnZpZXcuZmluZEl0ZW1Gcm9tQ2hpbGQodCk7CiAgICAgICAgaWYoaXRlbSl7CiAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMudmlldy5pbmRleE9mKGl0ZW0pOwogICAgICAgICAgICB0aGlzLnNlbGVjdChpbmRleCwgZmFsc2UpOwogICAgICAgIH0KICAgIH0sCgogICAgICAgIG9uVmlld0NsaWNrIDogZnVuY3Rpb24oZG9Gb2N1cyl7CiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy52aWV3LmdldFNlbGVjdGVkSW5kZXhlcygpWzBdOwogICAgICAgIHZhciByID0gdGhpcy5zdG9yZS5nZXRBdChpbmRleCk7CiAgICAgICAgaWYocil7CiAgICAgICAgICAgIHRoaXMub25TZWxlY3QociwgaW5kZXgpOwogICAgICAgIH0KICAgICAgICBpZihkb0ZvY3VzICE9PSBmYWxzZSl7CiAgICAgICAgICAgIHRoaXMuZWwuZm9jdXMoKTsKICAgICAgICB9CiAgICB9LAoKICAgICAgICByZXN0cmljdEhlaWdodCA6IGZ1bmN0aW9uKCl7CiAgICAgICAgdGhpcy5pbm5lckxpc3QuZG9tLnN0eWxlLmhlaWdodCA9ICcnOwogICAgICAgIHZhciBpbm5lciA9IHRoaXMuaW5uZXJMaXN0LmRvbTsKICAgICAgICB2YXIgaCA9IE1hdGgubWF4KGlubmVyLmNsaWVudEhlaWdodCwgaW5uZXIub2Zmc2V0SGVpZ2h0LCBpbm5lci5zY3JvbGxIZWlnaHQpOwogICAgICAgIHRoaXMuaW5uZXJMaXN0LnNldEhlaWdodChoIDwgdGhpcy5tYXhIZWlnaHQgPyAnYXV0bycgOiB0aGlzLm1heEhlaWdodCk7CiAgICAgICAgdGhpcy5saXN0LmJlZ2luVXBkYXRlKCk7CiAgICAgICAgdGhpcy5saXN0LnNldEhlaWdodCh0aGlzLmlubmVyTGlzdC5nZXRIZWlnaHQoKSt0aGlzLmxpc3QuZ2V0RnJhbWVXaWR0aCgndGInKSsodGhpcy5yZXNpemFibGU/dGhpcy5oYW5kbGVIZWlnaHQ6MCkrdGhpcy5hc3NldEhlaWdodCk7CiAgICAgICAgdGhpcy5saXN0LmFsaWduVG8odGhpcy5lbCwgdGhpcy5saXN0QWxpZ24pOwogICAgICAgIHRoaXMubGlzdC5lbmRVcGRhdGUoKTsKICAgIH0sCgogICAgICAgIG9uRW1wdHlSZXN1bHRzIDogZnVuY3Rpb24oKXsKICAgICAgICB0aGlzLmNvbGxhcHNlKCk7CiAgICB9LAoKICAgIAogICAgaXNFeHBhbmRlZCA6IGZ1bmN0aW9uKCl7CiAgICAgICAgcmV0dXJuIHRoaXMubGlzdC5pc1Zpc2libGUoKTsKICAgIH0sCgogICAgCiAgICBzZWxlY3RCeVZhbHVlIDogZnVuY3Rpb24odiwgc2Nyb2xsSW50b1ZpZXcpewogICAgICAgIGlmKHYgIT09IHVuZGVmaW5lZCAmJiB2ICE9PSBudWxsKXsKICAgICAgICAgICAgdmFyIHIgPSB0aGlzLmZpbmRSZWNvcmQodGhpcy52YWx1ZUZpZWxkIHx8IHRoaXMuZGlzcGxheUZpZWxkLCB2KTsKICAgICAgICAgICAgaWYocil7CiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdCh0aGlzLnN0b3JlLmluZGV4T2YociksIHNjcm9sbEludG9WaWV3KTsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0sCgogICAgCiAgICBzZWxlY3QgOiBmdW5jdGlvbihpbmRleCwgc2Nyb2xsSW50b1ZpZXcpewogICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IGluZGV4OwogICAgICAgIHRoaXMudmlldy5zZWxlY3QoaW5kZXgpOwogICAgICAgIGlmKHNjcm9sbEludG9WaWV3ICE9PSBmYWxzZSl7CiAgICAgICAgICAgIHZhciBlbCA9IHRoaXMudmlldy5nZXROb2RlKGluZGV4KTsKICAgICAgICAgICAgaWYoZWwpewogICAgICAgICAgICAgICAgdGhpcy5pbm5lckxpc3Quc2Nyb2xsQ2hpbGRJbnRvVmlldyhlbCwgZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSwKCiAgICAgICAgc2VsZWN0TmV4dCA6IGZ1bmN0aW9uKCl7CiAgICAgICAgdmFyIGN0ID0gdGhpcy5zdG9yZS5nZXRDb3VudCgpOwogICAgICAgIGlmKGN0ID4gMCl7CiAgICAgICAgICAgIGlmKHRoaXMuc2VsZWN0ZWRJbmRleCA9PSAtMSl7CiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdCgwKTsKICAgICAgICAgICAgfWVsc2UgaWYodGhpcy5zZWxlY3RlZEluZGV4IDwgY3QtMSl7CiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdCh0aGlzLnNlbGVjdGVkSW5kZXgrMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9LAoKICAgICAgICBzZWxlY3RQcmV2IDogZnVuY3Rpb24oKXsKICAgICAgICB2YXIgY3QgPSB0aGlzLnN0b3JlLmdldENvdW50KCk7CiAgICAgICAgaWYoY3QgPiAwKXsKICAgICAgICAgICAgaWYodGhpcy5zZWxlY3RlZEluZGV4ID09IC0xKXsKICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0KDApOwogICAgICAgICAgICB9ZWxzZSBpZih0aGlzLnNlbGVjdGVkSW5kZXggIT0gMCl7CiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdCh0aGlzLnNlbGVjdGVkSW5kZXgtMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9LAoKICAgICAgICBvbktleVVwIDogZnVuY3Rpb24oZSl7CiAgICAgICAgaWYodGhpcy5lZGl0YWJsZSAhPT0gZmFsc2UgJiYgIWUuaXNTcGVjaWFsS2V5KCkpewogICAgICAgICAgICB0aGlzLmxhc3RLZXkgPSBlLmdldEtleSgpOwogICAgICAgICAgICB0aGlzLmRxVGFzay5kZWxheSh0aGlzLnF1ZXJ5RGVsYXkpOwogICAgICAgIH0KICAgIH0sCgogICAgICAgIHZhbGlkYXRlQmx1ciA6IGZ1bmN0aW9uKCl7CiAgICAgICAgcmV0dXJuICF0aGlzLmxpc3QgfHwgIXRoaXMubGlzdC5pc1Zpc2libGUoKTsgICAKICAgIH0sCgogICAgICAgIGluaXRRdWVyeSA6IGZ1bmN0aW9uKCl7CiAgICAgICAgdGhpcy5kb1F1ZXJ5KHRoaXMuZ2V0UmF3VmFsdWUoKSk7CiAgICB9LAoKICAgICAgICBkb0ZvcmNlIDogZnVuY3Rpb24oKXsKICAgICAgICBpZih0aGlzLmVsLmRvbS52YWx1ZS5sZW5ndGggPiAwKXsKICAgICAgICAgICAgdGhpcy5lbC5kb20udmFsdWUgPQogICAgICAgICAgICAgICAgdGhpcy5sYXN0U2VsZWN0aW9uVGV4dCA9PT0gdW5kZWZpbmVkID8gJycgOiB0aGlzLmxhc3RTZWxlY3Rpb25UZXh0OwogICAgICAgICAgICB0aGlzLmFwcGx5RW1wdHlUZXh0KCk7CiAgICAgICAgfQogICAgfSwKCiAgICAKICAgIGRvUXVlcnkgOiBmdW5jdGlvbihxLCBmb3JjZUFsbCl7CiAgICAgICAgaWYocSA9PT0gdW5kZWZpbmVkIHx8IHEgPT09IG51bGwpewogICAgICAgICAgICBxID0gJyc7CiAgICAgICAgfQogICAgICAgIHZhciBxZSA9IHsKICAgICAgICAgICAgcXVlcnk6IHEsCiAgICAgICAgICAgIGZvcmNlQWxsOiBmb3JjZUFsbCwKICAgICAgICAgICAgY29tYm86IHRoaXMsCiAgICAgICAgICAgIGNhbmNlbDpmYWxzZQogICAgICAgIH07CiAgICAgICAgaWYodGhpcy5maXJlRXZlbnQoJ2JlZm9yZXF1ZXJ5JywgcWUpPT09ZmFsc2UgfHwgcWUuY2FuY2VsKXsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBxID0gcWUucXVlcnk7CiAgICAgICAgZm9yY2VBbGwgPSBxZS5mb3JjZUFsbDsKICAgICAgICBpZihmb3JjZUFsbCA9PT0gdHJ1ZSB8fCAocS5sZW5ndGggPj0gdGhpcy5taW5DaGFycykpewogICAgICAgICAgICBpZih0aGlzLmxhc3RRdWVyeSAhPSBxKXsKICAgICAgICAgICAgICAgIHRoaXMubGFzdFF1ZXJ5ID0gcTsKICAgICAgICAgICAgICAgIGlmKHRoaXMubW9kZSA9PSAnbG9jYWwnKXsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSW5kZXggPSAtMTsKICAgICAgICAgICAgICAgICAgICBpZihmb3JjZUFsbCl7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuY2xlYXJGaWx0ZXIoKTsKICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5maWx0ZXIodGhpcy5kaXNwbGF5RmllbGQsIHEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0aGlzLm9uTG9hZCgpOwogICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5iYXNlUGFyYW1zW3RoaXMucXVlcnlQYXJhbV0gPSBxOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUubG9hZCh7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczogdGhpcy5nZXRQYXJhbXMocSkKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cGFuZCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IC0xOwogICAgICAgICAgICAgICAgdGhpcy5vbkxvYWQoKTsgICAKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0sCgogICAgICAgIGdldFBhcmFtcyA6IGZ1bmN0aW9uKHEpewogICAgICAgIHZhciBwID0ge307CiAgICAgICAgICAgICAgICBpZih0aGlzLnBhZ2VTaXplKXsKICAgICAgICAgICAgcC5zdGFydCA9IDA7CiAgICAgICAgICAgIHAubGltaXQgPSB0aGlzLnBhZ2VTaXplOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcDsKICAgIH0sCgogICAgCiAgICBjb2xsYXBzZSA6IGZ1bmN0aW9uKCl7CiAgICAgICAgaWYoIXRoaXMuaXNFeHBhbmRlZCgpKXsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLmxpc3QuaGlkZSgpOwogICAgICAgIEV4dC5nZXQoZG9jdW1lbnQpLnVuKCdtb3VzZWRvd24nLCB0aGlzLmNvbGxhcHNlSWYsIHRoaXMpOwogICAgICAgIEV4dC5nZXQoZG9jdW1lbnQpLnVuKCdtb3VzZXdoZWVsJywgdGhpcy5jb2xsYXBzZUlmLCB0aGlzKTsKICAgICAgICB0aGlzLmZpcmVFdmVudCgnY29sbGFwc2UnLCB0aGlzKTsKICAgIH0sCgogICAgICAgIGNvbGxhcHNlSWYgOiBmdW5jdGlvbihlKXsKICAgICAgICBpZighZS53aXRoaW4odGhpcy53cmFwKSAmJiAhZS53aXRoaW4odGhpcy5saXN0KSl7CiAgICAgICAgICAgIHRoaXMuY29sbGFwc2UoKTsKICAgICAgICB9CiAgICB9LAoKICAgIAogICAgZXhwYW5kIDogZnVuY3Rpb24oKXsKICAgICAgICBpZih0aGlzLmlzRXhwYW5kZWQoKSB8fCAhdGhpcy5oYXNGb2N1cyl7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5saXN0LmFsaWduVG8odGhpcy5lbCwgdGhpcy5saXN0QWxpZ24pOwogICAgICAgIHRoaXMubGlzdC5zaG93KCk7CiAgICAgICAgRXh0LmdldChkb2N1bWVudCkub24oJ21vdXNlZG93bicsIHRoaXMuY29sbGFwc2VJZiwgdGhpcyk7CiAgICAgICAgRXh0LmdldChkb2N1bWVudCkub24oJ21vdXNld2hlZWwnLCB0aGlzLmNvbGxhcHNlSWYsIHRoaXMpOwogICAgICAgIHRoaXMuZmlyZUV2ZW50KCdleHBhbmQnLCB0aGlzKTsKICAgIH0sCgogICAgICAgICAgICBvblRyaWdnZXJDbGljayA6IGZ1bmN0aW9uKCl7CiAgICAgICAgaWYodGhpcy5kaXNhYmxlZCl7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYodGhpcy5pc0V4cGFuZGVkKCkpewogICAgICAgICAgICB0aGlzLmNvbGxhcHNlKCk7CiAgICAgICAgICAgIHRoaXMuZWwuZm9jdXMoKTsKICAgICAgICB9ZWxzZSB7CiAgICAgICAgICAgIHRoaXMuaGFzRm9jdXMgPSB0cnVlOwogICAgICAgICAgICBpZih0aGlzLnRyaWdnZXJBY3Rpb24gPT0gJ2FsbCcpIHsKICAgICAgICAgICAgICAgIHRoaXMuZG9RdWVyeSh0aGlzLmFsbFF1ZXJ5LCB0cnVlKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuZG9RdWVyeSh0aGlzLmdldFJhd1ZhbHVlKCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuZWwuZm9jdXMoKTsKICAgICAgICB9CiAgICB9CgogICAgCiAgICAKICAgIAogICAgCn0pOwoKRXh0LmZvcm0uQ2hlY2tib3ggPSBmdW5jdGlvbihjb25maWcpewogICAgRXh0LmZvcm0uQ2hlY2tib3guc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIGNvbmZpZyk7CiAgICB0aGlzLmFkZEV2ZW50cyh7CiAgICAgICAgCiAgICAgICAgY2hlY2sgOiB0cnVlCiAgICB9KTsKfTsKCkV4dC5leHRlbmQoRXh0LmZvcm0uQ2hlY2tib3gsIEV4dC5mb3JtLkZpZWxkLCAgewogICAgCiAgICBmb2N1c0NsYXNzIDogdW5kZWZpbmVkLAogICAgCiAgICBmaWVsZENsYXNzOiAieC1mb3JtLWZpZWxkIiwKICAgIAogICAgY2hlY2tlZDogZmFsc2UsCiAgICAKICAgIGRlZmF1bHRBdXRvQ3JlYXRlIDogeyB0YWc6ICJpbnB1dCIsIHR5cGU6ICdjaGVja2JveCcsIGF1dG9jb21wbGV0ZTogIm9mZiJ9LAogICAgCiAgICBib3hMYWJlbCA6IHVuZGVmaW5lZCwKICAgIAogICAgICAgIG9uUmVzaXplIDogZnVuY3Rpb24oKXsKICAgICAgICBFeHQuZm9ybS5DaGVja2JveC5zdXBlcmNsYXNzLm9uUmVzaXplLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgaWYoIXRoaXMuYm94TGFiZWwpewogICAgICAgICAgICB0aGlzLmVsLmFsaWduVG8odGhpcy53cmFwLCAnYy1jJyk7CiAgICAgICAgfQogICAgfSwKCiAgICBpbml0RXZlbnRzIDogZnVuY3Rpb24oKXsKICAgICAgICBFeHQuZm9ybS5DaGVja2JveC5zdXBlcmNsYXNzLmluaXRFdmVudHMuY2FsbCh0aGlzKTsKICAgICAgICB0aGlzLmVsLm9uKCJjbGljayIsIHRoaXMub25DbGljaywgIHRoaXMpOwogICAgICAgIHRoaXMuZWwub24oImNoYW5nZSIsIHRoaXMub25DbGljaywgIHRoaXMpOwogICAgfSwKCgogICAgZ2V0UmVzaXplRWwgOiBmdW5jdGlvbigpewogICAgICAgIHJldHVybiB0aGlzLndyYXA7CiAgICB9LAoKICAgIGdldFBvc2l0aW9uRWwgOiBmdW5jdGlvbigpewogICAgICAgIHJldHVybiB0aGlzLndyYXA7CiAgICB9LAoKICAgICAgICBvblJlbmRlciA6IGZ1bmN0aW9uKGN0LCBwb3NpdGlvbil7CiAgICAgICAgRXh0LmZvcm0uQ2hlY2tib3guc3VwZXJjbGFzcy5vblJlbmRlci5jYWxsKHRoaXMsIGN0LCBwb3NpdGlvbik7CiAgICAgICAgaWYodGhpcy5pbnB1dFZhbHVlICE9PSB1bmRlZmluZWQpewogICAgICAgICAgICB0aGlzLmVsLmRvbS52YWx1ZSA9IHRoaXMuaW5wdXRWYWx1ZTsKICAgICAgICB9CiAgICAgICAgdGhpcy53cmFwID0gdGhpcy5lbC53cmFwKHtjbHM6ICJ4LWZvcm0tY2hlY2std3JhcCJ9KTsKICAgICAgICBpZih0aGlzLmJveExhYmVsKXsKICAgICAgICAgICAgdGhpcy53cmFwLmNyZWF0ZUNoaWxkKHt0YWc6ICdsYWJlbCcsIGh0bWxGb3I6IHRoaXMuZWwuaWQsIGNsczogJ3gtZm9ybS1jYi1sYWJlbCcsIGh0bWw6IHRoaXMuYm94TGFiZWx9KTsKICAgICAgICB9CiAgICAgICAgaWYodGhpcy5jaGVja2VkKXsKICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZSh0cnVlKTsKICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgdGhpcy5jaGVja2VkID0gdGhpcy5lbC5kb20uY2hlY2tlZDsKICAgICAgICB9CiAgICB9LAoKICAgICAgICBpbml0VmFsdWUgOiBFeHQuZW1wdHlGbiwKCiAgICAKICAgIGdldFZhbHVlIDogZnVuY3Rpb24oKXsKICAgICAgICBpZih0aGlzLnJlbmRlcmVkKXsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWwuZG9tLmNoZWNrZWQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0sCgoJICAgIG9uQ2xpY2sgOiBmdW5jdGlvbigpewogICAgICAgIGlmKHRoaXMuZWwuZG9tLmNoZWNrZWQgIT0gdGhpcy5jaGVja2VkKXsKICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZSh0aGlzLmVsLmRvbS5jaGVja2VkKTsKICAgICAgICB9CiAgICB9LAoKICAgIAogICAgc2V0VmFsdWUgOiBmdW5jdGlvbih2KXsKICAgICAgICB0aGlzLmNoZWNrZWQgPSAodiA9PT0gdHJ1ZSB8fCB2ID09PSAndHJ1ZScgfHwgdiA9PSAnMScgfHwgU3RyaW5nKHYpLnRvTG93ZXJDYXNlKCkgPT0gJ29uJyk7CiAgICAgICAgaWYodGhpcy5lbCAmJiB0aGlzLmVsLmRvbSl7CiAgICAgICAgICAgIHRoaXMuZWwuZG9tLmNoZWNrZWQgPSB0aGlzLmNoZWNrZWQ7CiAgICAgICAgICAgIHRoaXMuZWwuZG9tLmRlZmF1bHRDaGVja2VkID0gdGhpcy5jaGVja2VkOwogICAgICAgIH0KICAgICAgICB0aGlzLmZpcmVFdmVudCgiY2hlY2siLCB0aGlzLCB0aGlzLmNoZWNrZWQpOwogICAgfQp9KTsKCkV4dC5mb3JtLlJhZGlvID0gZnVuY3Rpb24oKXsKICAgIEV4dC5mb3JtLlJhZGlvLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKfTsKRXh0LmV4dGVuZChFeHQuZm9ybS5SYWRpbywgRXh0LmZvcm0uQ2hlY2tib3gsIHsKICAgIGlucHV0VHlwZTogJ3JhZGlvJywKCiAgICAKICAgIGdldEdyb3VwVmFsdWUgOiBmdW5jdGlvbigpewogICAgICAgIHJldHVybiB0aGlzLmVsLnVwKCdmb3JtJykuY2hpbGQoJ2lucHV0W25hbWU9Jyt0aGlzLmVsLmRvbS5uYW1lKyddOmNoZWNrZWQnLCB0cnVlKS52YWx1ZTsKICAgIH0KfSk7Cg0KRXh0LmZvcm0uSHRtbEVkaXRvciA9IEV4dC5leHRlbmQoRXh0LmZvcm0uRmllbGQsIHsNCiAgICANCiAgICBlbmFibGVGb3JtYXQgOiB0cnVlLA0KICAgIA0KICAgIGVuYWJsZUZvbnRTaXplIDogdHJ1ZSwNCiAgICANCiAgICBlbmFibGVDb2xvcnMgOiB0cnVlLA0KICAgIA0KICAgIGVuYWJsZUFsaWdubWVudHMgOiB0cnVlLA0KICAgIA0KICAgIGVuYWJsZUxpc3RzIDogdHJ1ZSwNCiAgICANCiAgICBlbmFibGVTb3VyY2VFZGl0IDogdHJ1ZSwNCiAgICANCiAgICBlbmFibGVMaW5rcyA6IHRydWUsDQogICAgDQogICAgZW5hYmxlRm9udCA6IHRydWUsDQogICAgDQogICAgY3JlYXRlTGlua1RleHQgOiAnUGxlYXNlIGVudGVyIHRoZSBVUkwgZm9yIHRoZSBsaW5rOicsDQogICAgDQogICAgZGVmYXVsdExpbmtWYWx1ZSA6ICdodHRwOi8nKycvJywNCiAgICANCiAgICBmb250RmFtaWxpZXMgOiBbDQogICAgICAgICdBcmlhbCcsDQogICAgICAgICdDb3VyaWVyIE5ldycsDQogICAgICAgICdUYWhvbWEnLA0KICAgICAgICAnVGltZXMgTmV3IFJvbWFuJywNCiAgICAgICAgJ1ZlcmRhbmEnDQogICAgXSwNCiAgICBkZWZhdWx0Rm9udDogJ3RhaG9tYScsDQoNCiAgICAKICAgIHZhbGlkYXRpb25FdmVudCA6IGZhbHNlLA0KICAgIGRlZmVySGVpZ2h0OiB0cnVlLA0KICAgIGluaXRpYWxpemVkIDogZmFsc2UsDQogICAgYWN0aXZhdGVkIDogZmFsc2UsDQogICAgc291cmNlRWRpdE1vZGUgOiBmYWxzZSwNCiAgICBvbkZvY3VzIDogRXh0LmVtcHR5Rm4sDQogICAgaWZyYW1lUGFkOjMsDQogICAgaGlkZU1vZGU6J29mZnNldHMnLA0KICAgIGRlZmF1bHRBdXRvQ3JlYXRlIDogew0KICAgICAgICB0YWc6ICJ0ZXh0YXJlYSIsDQogICAgICAgIHN0eWxlOiJ3aWR0aDo1MDBweDtoZWlnaHQ6MzAwcHg7IiwNCiAgICAgICAgYXV0b2NvbXBsZXRlOiAib2ZmIg0KICAgIH0sDQoNCiAgICAKICAgIGluaXRDb21wb25lbnQgOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLmFkZEV2ZW50cyh7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGluaXRpYWxpemU6IHRydWUsDQogICAgICAgICAgICANCiAgICAgICAgICAgIGFjdGl2YXRlOiB0cnVlLA0KICAgICAgICAgICAgIA0KICAgICAgICAgICAgYmVmb3Jlc3luYzogdHJ1ZSwNCiAgICAgICAgICAgICANCiAgICAgICAgICAgIGJlZm9yZXB1c2g6IHRydWUsDQogICAgICAgICAgICAgDQogICAgICAgICAgICBzeW5jOiB0cnVlLA0KICAgICAgICAgICAgIA0KICAgICAgICAgICAgcHVzaDogdHJ1ZSwNCiAgICAgICAgICAgICANCiAgICAgICAgICAgIGVkaXRtb2RlY2hhbmdlOiB0cnVlDQogICAgICAgIH0pDQogICAgfSwNCg0KICAgIGNyZWF0ZUZvbnRPcHRpb25zIDogZnVuY3Rpb24oKXsNCiAgICAgICAgdmFyIGJ1ZiA9IFtdLCBmcyA9IHRoaXMuZm9udEZhbWlsaWVzLCBmZiwgbGM7DQogICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IGZzLmxlbmd0aDsgaTwgbGVuOyBpKyspew0KICAgICAgICAgICAgZmYgPSBmc1tpXTsNCiAgICAgICAgICAgIGxjID0gZmYudG9Mb3dlckNhc2UoKTsNCiAgICAgICAgICAgIGJ1Zi5wdXNoKA0KICAgICAgICAgICAgICAgICc8b3B0aW9uIHZhbHVlPSInLGxjLCciIHN0eWxlPSJmb250LWZhbWlseTonLGZmLCc7IicsDQogICAgICAgICAgICAgICAgICAgICh0aGlzLmRlZmF1bHRGb250ID09IGxjID8gJyBzZWxlY3RlZD0idHJ1ZSI+JyA6ICc+JyksDQogICAgICAgICAgICAgICAgICAgIGZmLA0KICAgICAgICAgICAgICAgICc8L29wdGlvbj4nDQogICAgICAgICAgICApOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBidWYuam9pbignJyk7DQogICAgfSwNCiAgICANCiAgICBjcmVhdGVUb29sYmFyIDogZnVuY3Rpb24oZWRpdG9yKXsNCg0KICAgICAgICBmdW5jdGlvbiBidG4oaWQsIHRvZ2dsZSwgaGFuZGxlcil7DQogICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgIGlkIDogaWQsDQogICAgICAgICAgICAgICAgY2xzIDogJ3gtYnRuLWljb24geC1lZGl0LScraWQsDQogICAgICAgICAgICAgICAgZW5hYmxlVG9nZ2xlOnRvZ2dsZSAhPT0gZmFsc2UsDQogICAgICAgICAgICAgICAgc2NvcGU6IGVkaXRvciwNCiAgICAgICAgICAgICAgICBoYW5kbGVyOmhhbmRsZXJ8fGVkaXRvci5yZWxheUJ0bkNtZCwNCiAgICAgICAgICAgICAgICBjbGlja0V2ZW50Oidtb3VzZWRvd24nLA0KICAgICAgICAgICAgICAgIHRvb2x0aXA6IGVkaXRvci5idXR0b25UaXBzW2lkXSB8fCB1bmRlZmluZWQsDQogICAgICAgICAgICAgICAgdGFiSW5kZXg6LTENCiAgICAgICAgICAgIH07DQogICAgICAgIH0NCg0KICAgICAgICAKICAgICAgICB2YXIgdGIgPSBuZXcgRXh0LlRvb2xiYXIodGhpcy53cmFwLmRvbS5maXJzdENoaWxkKTsNCg0KICAgICAgICAKICAgICAgICB0Yi5lbC5vbignY2xpY2snLCBmdW5jdGlvbihlKXsNCiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgaWYodGhpcy5lbmFibGVGb250ICYmICFFeHQuaXNTYWZhcmkpew0KICAgICAgICAgICAgdGhpcy5mb250U2VsZWN0ID0gdGIuZWwuY3JlYXRlQ2hpbGQoew0KICAgICAgICAgICAgICAgIHRhZzonc2VsZWN0JywNCiAgICAgICAgICAgICAgICB0YWJJbmRleDogLTEsDQogICAgICAgICAgICAgICAgY2xzOid4LWZvbnQtc2VsZWN0JywNCiAgICAgICAgICAgICAgICBodG1sOiB0aGlzLmNyZWF0ZUZvbnRPcHRpb25zKCkNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgdGhpcy5mb250U2VsZWN0Lm9uKCdjaGFuZ2UnLCBmdW5jdGlvbigpew0KICAgICAgICAgICAgICAgIHZhciBmb250ID0gdGhpcy5mb250U2VsZWN0LmRvbS52YWx1ZTsNCiAgICAgICAgICAgICAgICB0aGlzLnJlbGF5Q21kKCdmb250bmFtZScsIGZvbnQpOw0KICAgICAgICAgICAgICAgIHRoaXMuZGVmZXJGb2N1cygpOw0KICAgICAgICAgICAgfSwgdGhpcyk7DQogICAgICAgICAgICB0Yi5hZGQoDQogICAgICAgICAgICAgICAgdGhpcy5mb250U2VsZWN0LmRvbSwNCiAgICAgICAgICAgICAgICAnLScNCiAgICAgICAgICAgICk7DQogICAgICAgIH07DQoNCiAgICAgICAgaWYodGhpcy5lbmFibGVGb3JtYXQpew0KICAgICAgICAgICAgdGIuYWRkKA0KICAgICAgICAgICAgICAgIGJ0bignYm9sZCcpLA0KICAgICAgICAgICAgICAgIGJ0bignaXRhbGljJyksDQogICAgICAgICAgICAgICAgYnRuKCd1bmRlcmxpbmUnKQ0KICAgICAgICAgICAgKTsNCiAgICAgICAgfTsNCg0KICAgICAgICBpZih0aGlzLmVuYWJsZUZvbnRTaXplKXsNCiAgICAgICAgICAgIHRiLmFkZCgNCiAgICAgICAgICAgICAgICAnLScsDQogICAgICAgICAgICAgICAgYnRuKCdpbmNyZWFzZWZvbnRzaXplJywgZmFsc2UsIHRoaXMuYWRqdXN0Rm9udCksDQogICAgICAgICAgICAgICAgYnRuKCdkZWNyZWFzZWZvbnRzaXplJywgZmFsc2UsIHRoaXMuYWRqdXN0Rm9udCkNCiAgICAgICAgICAgICk7DQogICAgICAgIH07DQoNCiAgICAgICAgaWYodGhpcy5lbmFibGVDb2xvcnMpew0KICAgICAgICAgICAgdGIuYWRkKA0KICAgICAgICAgICAgICAgICctJywgew0KICAgICAgICAgICAgICAgICAgICBpZDonZm9yZWNvbG9yJywNCiAgICAgICAgICAgICAgICAgICAgY2xzOid4LWJ0bi1pY29uIHgtZWRpdC1mb3JlY29sb3InLA0KICAgICAgICAgICAgICAgICAgICBjbGlja0V2ZW50Oidtb3VzZWRvd24nLA0KICAgICAgICAgICAgICAgICAgICB0b29sdGlwOiBlZGl0b3IuYnV0dG9uVGlwc1snZm9yZWNvbG9yJ10gfHwgdW5kZWZpbmVkLA0KICAgICAgICAgICAgICAgICAgICB0YWJJbmRleDotMSwNCiAgICAgICAgICAgICAgICAgICAgbWVudSA6IG5ldyBFeHQubWVudS5Db2xvck1lbnUoew0KICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dSZXNlbGVjdDogdHJ1ZSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGZvY3VzOiBFeHQuZW1wdHlGbiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOicwMDAwMDAnLA0KICAgICAgICAgICAgICAgICAgICAgICAgcGxhaW46dHJ1ZSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdEhhbmRsZXI6IGZ1bmN0aW9uKGNwLCBjb2xvcil7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leGVjQ21kKCdmb3JlY29sb3InLCBFeHQuaXNTYWZhcmkgfHwgRXh0LmlzSUUgPyAnIycrY29sb3IgOiBjb2xvcik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZlckZvY3VzKCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGU6IHRoaXMsDQogICAgICAgICAgICAgICAgICAgICAgICBjbGlja0V2ZW50Oidtb3VzZWRvd24nDQogICAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgICAgICBpZDonYmFja2NvbG9yJywNCiAgICAgICAgICAgICAgICAgICAgY2xzOid4LWJ0bi1pY29uIHgtZWRpdC1iYWNrY29sb3InLA0KICAgICAgICAgICAgICAgICAgICBjbGlja0V2ZW50Oidtb3VzZWRvd24nLA0KICAgICAgICAgICAgICAgICAgICB0b29sdGlwOiBlZGl0b3IuYnV0dG9uVGlwc1snYmFja2NvbG9yJ10gfHwgdW5kZWZpbmVkLA0KICAgICAgICAgICAgICAgICAgICB0YWJJbmRleDotMSwNCiAgICAgICAgICAgICAgICAgICAgbWVudSA6IG5ldyBFeHQubWVudS5Db2xvck1lbnUoew0KICAgICAgICAgICAgICAgICAgICAgICAgZm9jdXM6IEV4dC5lbXB0eUZuLA0KICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6J0ZGRkZGRicsDQogICAgICAgICAgICAgICAgICAgICAgICBwbGFpbjp0cnVlLA0KICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dSZXNlbGVjdDogdHJ1ZSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdEhhbmRsZXI6IGZ1bmN0aW9uKGNwLCBjb2xvcil7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoRXh0LmlzR2Vja28pew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4ZWNDbWQoJ3VzZUNTUycsIGZhbHNlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leGVjQ21kKCdoaWxpdGVjb2xvcicsIGNvbG9yKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leGVjQ21kKCd1c2VDU1MnLCB0cnVlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZlckZvY3VzKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhlY0NtZChFeHQuaXNPcGVyYSA/ICdoaWxpdGVjb2xvcicgOiAnYmFja2NvbG9yJywgRXh0LmlzU2FmYXJpIHx8IEV4dC5pc0lFID8gJyMnK2NvbG9yIDogY29sb3IpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmVyRm9jdXMoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGU6dGhpcywNCiAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrRXZlbnQ6J21vdXNlZG93bicNCiAgICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICApOw0KICAgICAgICB9Ow0KDQogICAgICAgIGlmKHRoaXMuZW5hYmxlQWxpZ25tZW50cyl7DQogICAgICAgICAgICB0Yi5hZGQoDQogICAgICAgICAgICAgICAgJy0nLA0KICAgICAgICAgICAgICAgIGJ0bignanVzdGlmeWxlZnQnKSwNCiAgICAgICAgICAgICAgICBidG4oJ2p1c3RpZnljZW50ZXInKSwNCiAgICAgICAgICAgICAgICBidG4oJ2p1c3RpZnlyaWdodCcpDQogICAgICAgICAgICApOw0KICAgICAgICB9Ow0KDQogICAgICAgIGlmKCFFeHQuaXNTYWZhcmkpew0KICAgICAgICAgICAgaWYodGhpcy5lbmFibGVMaW5rcyl7DQogICAgICAgICAgICAgICAgdGIuYWRkKA0KICAgICAgICAgICAgICAgICAgICAnLScsDQogICAgICAgICAgICAgICAgICAgIGJ0bignY3JlYXRlbGluaycsIGZhbHNlLCB0aGlzLmNyZWF0ZUxpbmspDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgIGlmKHRoaXMuZW5hYmxlTGlzdHMpew0KICAgICAgICAgICAgICAgIHRiLmFkZCgNCiAgICAgICAgICAgICAgICAgICAgJy0nLA0KICAgICAgICAgICAgICAgICAgICBidG4oJ2luc2VydG9yZGVyZWRsaXN0JyksDQogICAgICAgICAgICAgICAgICAgIGJ0bignaW5zZXJ0dW5vcmRlcmVkbGlzdCcpDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKHRoaXMuZW5hYmxlU291cmNlRWRpdCl7DQogICAgICAgICAgICAgICAgdGIuYWRkKA0KICAgICAgICAgICAgICAgICAgICAnLScsDQogICAgICAgICAgICAgICAgICAgIGJ0bignc291cmNlZWRpdCcsIHRydWUsIGZ1bmN0aW9uKGJ0bil7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZVNvdXJjZUVkaXQoYnRuLnByZXNzZWQpOw0KICAgICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICB0aGlzLnRiID0gdGI7DQogICAgfSwNCg0KICAgIA0KICAgIGdldERvY01hcmt1cCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiAnPGh0bWw+PGhlYWQ+PHN0eWxlIHR5cGU9InRleHQvY3NzIj5ib2R5e2JvcmRlcjowO21hcmdpbjowO3BhZGRpbmc6M3B4O2hlaWdodDo5OCU7Y3Vyc29yOnRleHQ7fTwvc3R5bGU+PC9oZWFkPjxib2R5PjwvYm9keT48L2h0bWw+JzsNCiAgICB9LA0KDQogICAgCiAgICBvblJlbmRlciA6IGZ1bmN0aW9uKGN0LCBwb3NpdGlvbil7DQogICAgICAgIEV4dC5mb3JtLkh0bWxFZGl0b3Iuc3VwZXJjbGFzcy5vblJlbmRlci5jYWxsKHRoaXMsIGN0LCBwb3NpdGlvbik7DQogICAgICAgIHRoaXMuZWwuZG9tLnN0eWxlLmJvcmRlciA9ICcwIG5vbmUnOw0KICAgICAgICB0aGlzLmVsLmRvbS5zZXRBdHRyaWJ1dGUoJ3RhYkluZGV4JywgLTEpOw0KICAgICAgICB0aGlzLmVsLmFkZENsYXNzKCd4LWhpZGRlbicpOw0KICAgICAgICBpZihFeHQuaXNJRSl7IAogICAgICAgICAgICB0aGlzLmVsLmFwcGx5U3R5bGVzKCdtYXJnaW4tdG9wOi0xcHg7bWFyZ2luLWJvdHRvbTotMXB4OycpDQogICAgICAgIH0NCiAgICAgICAgdGhpcy53cmFwID0gdGhpcy5lbC53cmFwKHsNCiAgICAgICAgICAgIGNsczoneC1odG1sLWVkaXRvci13cmFwJywgY246e2NsczoneC1odG1sLWVkaXRvci10Yid9DQogICAgICAgIH0pOw0KDQoNCiAgICAgICAgdGhpcy5jcmVhdGVUb29sYmFyKHRoaXMpOw0KDQogICAgICAgIHRoaXMudGIuaXRlbXMuZWFjaChmdW5jdGlvbihpdGVtKXsNCiAgICAgICAgICAgaWYoaXRlbS5pZCAhPSAnc291cmNlZWRpdCcpew0KICAgICAgICAgICAgICAgIGl0ZW0uZGlzYWJsZSgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCg0KICAgICAgICB2YXIgaWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7DQogICAgICAgIGlmcmFtZS5uYW1lID0gRXh0LmlkKCk7DQogICAgICAgIGlmcmFtZS5mcmFtZUJvcmRlciA9ICdubyc7DQoNCiAgICAgICAgaWZyYW1lLnNyYyA9IChFeHQuU1NMX1NFQ1VSRV9VUkwgfHwgImphdmFzY3JpcHQ6ZmFsc2UiKTsNCg0KICAgICAgICB0aGlzLndyYXAuZG9tLmFwcGVuZENoaWxkKGlmcmFtZSk7DQoNCiAgICAgICAgdGhpcy5pZnJhbWUgPSBpZnJhbWU7DQoNCiAgICAgICAgaWYoRXh0LmlzSUUpew0KICAgICAgICAgICAgdGhpcy5kb2MgPSBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDsNCiAgICAgICAgICAgIHRoaXMud2luID0gaWZyYW1lLmNvbnRlbnRXaW5kb3c7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB0aGlzLmRvYyA9IChpZnJhbWUuY29udGVudERvY3VtZW50IHx8IHdpbmRvdy5mcmFtZXNbaWZyYW1lLm5hbWVdLmRvY3VtZW50KTsNCiAgICAgICAgICAgIHRoaXMud2luID0gd2luZG93LmZyYW1lc1tpZnJhbWUubmFtZV07DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5kb2MuZGVzaWduTW9kZSA9ICdvbic7DQogICAgICAgIHRoaXMuZG9jLm9wZW4oKTsNCiAgICAgICAgdGhpcy5kb2Mud3JpdGUodGhpcy5nZXREb2NNYXJrdXAoKSkNCiAgICAgICAgdGhpcy5kb2MuY2xvc2UoKTsNCg0KICAgICAgICB2YXIgdGFzayA9IHsgCiAgICAgICAgICAgIHJ1biA6IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICAgaWYodGhpcy5kb2MuYm9keSB8fCB0aGlzLmRvYy5yZWFkeVN0YXRlID09ICdjb21wbGV0ZScpew0KICAgICAgICAgICAgICAgICAgICB0aGlzLmRvYy5kZXNpZ25Nb2RlPSJvbiI7DQogICAgICAgICAgICAgICAgICAgIEV4dC5UYXNrTWdyLnN0b3AodGFzayk7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdEVkaXRvci5kZWZlcigxMCwgdGhpcyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIGludGVydmFsIDogMTAsDQogICAgICAgICAgICBkdXJhdGlvbjoxMDAwMCwNCiAgICAgICAgICAgIHNjb3BlOiB0aGlzDQogICAgICAgIH07DQogICAgICAgIEV4dC5UYXNrTWdyLnN0YXJ0KHRhc2spOw0KDQogICAgICAgIGlmKCF0aGlzLndpZHRoKXsNCiAgICAgICAgICAgIHRoaXMuc2V0U2l6ZSh0aGlzLmVsLmdldFNpemUoKSk7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgCiAgICBvblJlc2l6ZSA6IGZ1bmN0aW9uKHcsIGgpew0KICAgICAgICBFeHQuZm9ybS5IdG1sRWRpdG9yLnN1cGVyY2xhc3Mub25SZXNpemUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCiAgICAgICAgaWYodGhpcy5lbCAmJiB0aGlzLmlmcmFtZSl7DQogICAgICAgICAgICBpZih0eXBlb2YgdyA9PSAnbnVtYmVyJyl7DQogICAgICAgICAgICAgICAgdmFyIGF3ID0gdyAtIHRoaXMud3JhcC5nZXRGcmFtZVdpZHRoKCdscicpOw0KICAgICAgICAgICAgICAgIHRoaXMuZWwuc2V0V2lkdGgodGhpcy5hZGp1c3RXaWR0aCgndGV4dGFyZWEnLCBhdykpOw0KICAgICAgICAgICAgICAgIHRoaXMuaWZyYW1lLnN0eWxlLndpZHRoID0gYXcgKyAncHgnOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYodHlwZW9mIGggPT0gJ251bWJlcicpew0KICAgICAgICAgICAgICAgIHZhciBhaCA9IGggLSB0aGlzLndyYXAuZ2V0RnJhbWVXaWR0aCgndGInKSAtIHRoaXMudGIuZWwuZ2V0SGVpZ2h0KCk7DQogICAgICAgICAgICAgICAgdGhpcy5lbC5zZXRIZWlnaHQodGhpcy5hZGp1c3RXaWR0aCgndGV4dGFyZWEnLCBhaCkpOw0KICAgICAgICAgICAgICAgIHRoaXMuaWZyYW1lLnN0eWxlLmhlaWdodCA9IGFoICsgJ3B4JzsNCiAgICAgICAgICAgICAgICBpZih0aGlzLmRvYyl7DQogICAgICAgICAgICAgICAgICAgICh0aGlzLmRvYy5ib2R5IHx8IHRoaXMuZG9jLmRvY3VtZW50RWxlbWVudCkuc3R5bGUuaGVpZ2h0ID0gKGFoIC0gKHRoaXMuaWZyYW1lUGFkKjIpKSArICdweCc7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIHRvZ2dsZVNvdXJjZUVkaXQgOiBmdW5jdGlvbihzb3VyY2VFZGl0TW9kZSl7DQogICAgICAgIGlmKHNvdXJjZUVkaXRNb2RlID09PSB1bmRlZmluZWQpew0KICAgICAgICAgICAgc291cmNlRWRpdE1vZGUgPSAhdGhpcy5zb3VyY2VFZGl0TW9kZTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLnNvdXJjZUVkaXRNb2RlID0gc291cmNlRWRpdE1vZGUgPT09IHRydWU7DQogICAgICAgIHZhciBidG4gPSB0aGlzLnRiLml0ZW1zLmdldCgnc291cmNlZWRpdCcpOw0KICAgICAgICBpZihidG4ucHJlc3NlZCAhPT0gdGhpcy5zb3VyY2VFZGl0TW9kZSl7DQogICAgICAgICAgICBidG4udG9nZ2xlKHRoaXMuc291cmNlRWRpdE1vZGUpOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQogICAgICAgIGlmKHRoaXMuc291cmNlRWRpdE1vZGUpew0KICAgICAgICAgICAgdGhpcy50Yi5pdGVtcy5lYWNoKGZ1bmN0aW9uKGl0ZW0pew0KICAgICAgICAgICAgICAgIGlmKGl0ZW0uaWQgIT0gJ3NvdXJjZWVkaXQnKXsNCiAgICAgICAgICAgICAgICAgICAgaXRlbS5kaXNhYmxlKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB0aGlzLnN5bmNWYWx1ZSgpOw0KICAgICAgICAgICAgdGhpcy5pZnJhbWUuY2xhc3NOYW1lID0gJ3gtaGlkZGVuJzsNCiAgICAgICAgICAgIHRoaXMuZWwucmVtb3ZlQ2xhc3MoJ3gtaGlkZGVuJyk7DQogICAgICAgICAgICB0aGlzLmVsLmRvbS5yZW1vdmVBdHRyaWJ1dGUoJ3RhYkluZGV4Jyk7DQogICAgICAgICAgICB0aGlzLmVsLmZvY3VzKCk7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgaWYodGhpcy5pbml0aWFsaXplZCl7DQogICAgICAgICAgICAgICAgdGhpcy50Yi5pdGVtcy5lYWNoKGZ1bmN0aW9uKGl0ZW0pew0KICAgICAgICAgICAgICAgICAgICBpdGVtLmVuYWJsZSgpOw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5wdXNoVmFsdWUoKTsNCiAgICAgICAgICAgIHRoaXMuaWZyYW1lLmNsYXNzTmFtZSA9ICcnOw0KICAgICAgICAgICAgdGhpcy5lbC5hZGRDbGFzcygneC1oaWRkZW4nKTsNCiAgICAgICAgICAgIHRoaXMuZWwuZG9tLnNldEF0dHJpYnV0ZSgndGFiSW5kZXgnLCAtMSk7DQogICAgICAgICAgICB0aGlzLmRlZmVyRm9jdXMoKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLnNldFNpemUodGhpcy53cmFwLmdldFNpemUoKSk7DQogICAgICAgIHRoaXMuZmlyZUV2ZW50KCdlZGl0bW9kZWNoYW5nZScsIHRoaXMsIHRoaXMuc291cmNlRWRpdE1vZGUpOw0KICAgIH0sDQoNCiAgICAKICAgIGNyZWF0ZUxpbmsgOiBmdW5jdGlvbigpew0KICAgICAgICB2YXIgdXJsID0gcHJvbXB0KHRoaXMuY3JlYXRlTGlua1RleHQsIHRoaXMuZGVmYXVsdExpbmtWYWx1ZSk7DQogICAgICAgIGlmKHVybCAmJiB1cmwgIT0gJ2h0dHA6LycrJy8nKXsNCiAgICAgICAgICAgIHRoaXMucmVsYXlDbWQoJ2NyZWF0ZWxpbmsnLCB1cmwpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIAogICAgYWRqdXN0U2l6ZSA6IEV4dC5Cb3hDb21wb25lbnQucHJvdG90eXBlLmFkanVzdFNpemUsDQoNCiAgICAKICAgIGdldFJlc2l6ZUVsIDogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIHRoaXMud3JhcDsNCiAgICB9LA0KDQogICAgCiAgICBnZXRQb3NpdGlvbkVsIDogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIHRoaXMud3JhcDsNCiAgICB9LA0KDQogICAgCiAgICBpbml0RXZlbnRzIDogZnVuY3Rpb24oKXsNCiAgICAgICAgdGhpcy5vcmlnaW5hbFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOw0KICAgIH0sDQoNCiAgICANCiAgICBtYXJrSW52YWxpZCA6IEV4dC5lbXB0eUZuLA0KICAgIA0KICAgIGNsZWFySW52YWxpZCA6IEV4dC5lbXB0eUZuLA0KDQogICAgc2V0VmFsdWUgOiBmdW5jdGlvbih2KXsNCiAgICAgICAgRXh0LmZvcm0uSHRtbEVkaXRvci5zdXBlcmNsYXNzLnNldFZhbHVlLmNhbGwodGhpcywgdik7DQogICAgICAgIHRoaXMucHVzaFZhbHVlKCk7DQogICAgfSwNCg0KICAgIA0KICAgIGNsZWFuSHRtbCA6IGZ1bmN0aW9uKGh0bWwpew0KICAgICAgICBodG1sID0gU3RyaW5nKGh0bWwpOw0KICAgICAgICBpZihodG1sLmxlbmd0aCA+IDUpew0KICAgICAgICAgICAgaWYoRXh0LmlzU2FmYXJpKXsgCiAgICAgICAgICAgICAgICBodG1sID0gaHRtbC5yZXBsYWNlKC9cc2NsYXNzPSIoPzpBcHBsZS1zdHlsZS1zcGFufGtodG1sLWJsb2NrLXBsYWNlaG9sZGVyKSIvZ2ksICcnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZihodG1sID09ICcmbmJzcDsnKXsNCiAgICAgICAgICAgIGh0bWwgPSAnJzsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gaHRtbDsNCiAgICB9LA0KDQogICAgDQogICAgc3luY1ZhbHVlIDogZnVuY3Rpb24oKXsNCiAgICAgICAgaWYodGhpcy5pbml0aWFsaXplZCl7DQogICAgICAgICAgICB2YXIgYmQgPSAodGhpcy5kb2MuYm9keSB8fCB0aGlzLmRvYy5kb2N1bWVudEVsZW1lbnQpOw0KICAgICAgICAgICAgdmFyIGh0bWwgPSBiZC5pbm5lckhUTUw7DQogICAgICAgICAgICBpZihFeHQuaXNTYWZhcmkpew0KICAgICAgICAgICAgICAgIHZhciBicyA9IGJkLmdldEF0dHJpYnV0ZSgnc3R5bGUnKTsgCiAgICAgICAgICAgICAgICB2YXIgbSA9IGJzLm1hdGNoKC90ZXh0LWFsaWduOiguKj8pOy9pKTsNCiAgICAgICAgICAgICAgICBpZihtICYmIG1bMV0pew0KICAgICAgICAgICAgICAgICAgICBodG1sID0gJzxkaXYgc3R5bGU9IicrbVswXSsnIj4nICsgaHRtbCArICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGh0bWwgPSB0aGlzLmNsZWFuSHRtbChodG1sKTsNCiAgICAgICAgICAgIGlmKHRoaXMuZmlyZUV2ZW50KCdiZWZvcmVzeW5jJywgdGhpcywgaHRtbCkgIT09IGZhbHNlKXsNCiAgICAgICAgICAgICAgICB0aGlzLmVsLmRvbS52YWx1ZSA9IGh0bWw7DQogICAgICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoJ3N5bmMnLCB0aGlzLCBodG1sKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICANCiAgICBwdXNoVmFsdWUgOiBmdW5jdGlvbigpew0KICAgICAgICBpZih0aGlzLmluaXRpYWxpemVkKXsNCiAgICAgICAgICAgIHZhciB2ID0gdGhpcy5lbC5kb20udmFsdWU7DQogICAgICAgICAgICBpZih2Lmxlbmd0aCA8IDEpew0KICAgICAgICAgICAgICAgIHYgPSAnJm5ic3A7JzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKHRoaXMuZmlyZUV2ZW50KCdiZWZvcmVwdXNoJywgdGhpcywgdikgIT09IGZhbHNlKXsNCiAgICAgICAgICAgICAgICAodGhpcy5kb2MuYm9keSB8fCB0aGlzLmRvYy5kb2N1bWVudEVsZW1lbnQpLmlubmVySFRNTCA9IHY7DQogICAgICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoJ3B1c2gnLCB0aGlzLCB2KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICAKICAgIGRlZmVyRm9jdXMgOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLmZvY3VzLmRlZmVyKDEwLCB0aGlzKTsNCiAgICB9LA0KDQogICAgCiAgICBmb2N1cyA6IGZ1bmN0aW9uKCl7DQogICAgICAgIGlmKHRoaXMud2luICYmICF0aGlzLnNvdXJjZUVkaXRNb2RlKXsNCiAgICAgICAgICAgIHRoaXMud2luLmZvY3VzKCk7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgdGhpcy5lbC5mb2N1cygpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIAogICAgaW5pdEVkaXRvciA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHZhciBkYm9keSA9ICh0aGlzLmRvYy5ib2R5IHx8IHRoaXMuZG9jLmRvY3VtZW50RWxlbWVudCk7DQogICAgICAgIHZhciBzcyA9IHRoaXMuZWwuZ2V0U3R5bGVzKCdmb250LXNpemUnLCAnZm9udC1mYW1pbHknLCAnYmFja2dyb3VuZC1pbWFnZScsICdiYWNrZ3JvdW5kLXJlcGVhdCcpOw0KICAgICAgICBzc1snYmFja2dyb3VuZC1hdHRhY2htZW50J10gPSAnZml4ZWQnOyAKICAgICAgICBkYm9keS5iZ1Byb3BlcnRpZXMgPSAnZml4ZWQnOyAKICAgICAgICBFeHQuRG9tSGVscGVyLmFwcGx5U3R5bGVzKGRib2R5LCBzcyk7DQogICAgICAgIEV4dC5FdmVudE1hbmFnZXIub24odGhpcy5kb2MsIHsNCiAgICAgICAgICAgICdtb3VzZWRvd24nOiB0aGlzLm9uRWRpdG9yRXZlbnQsDQogICAgICAgICAgICAnZGJsY2xpY2snOiB0aGlzLm9uRWRpdG9yRXZlbnQsDQogICAgICAgICAgICAnY2xpY2snOiB0aGlzLm9uRWRpdG9yRXZlbnQsDQogICAgICAgICAgICAna2V5dXAnOiB0aGlzLm9uRWRpdG9yRXZlbnQsDQogICAgICAgICAgICBidWZmZXI6MTAwLA0KICAgICAgICAgICAgc2NvcGU6IHRoaXMNCiAgICAgICAgfSk7DQogICAgICAgIGlmKEV4dC5pc0dlY2tvKXsNCiAgICAgICAgICAgIEV4dC5FdmVudE1hbmFnZXIub24odGhpcy5kb2MsICdrZXlwcmVzcycsIHRoaXMuYXBwbHlDb21tYW5kLCB0aGlzKTsNCiAgICAgICAgfQ0KICAgICAgICBpZihFeHQuaXNJRSB8fCBFeHQuaXNTYWZhcmkgfHwgRXh0LmlzT3BlcmEpew0KICAgICAgICAgICAgRXh0LkV2ZW50TWFuYWdlci5vbih0aGlzLmRvYywgJ2tleWRvd24nLCB0aGlzLmZpeEtleXMsIHRoaXMpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlOw0KDQogICAgICAgIHRoaXMuZmlyZUV2ZW50KCdpbml0aWFsaXplJywgdGhpcyk7DQogICAgICAgIHRoaXMucHVzaFZhbHVlKCk7DQogICAgfSwNCg0KICAgIAogICAgb25EZXN0cm95IDogZnVuY3Rpb24oKXsNCiAgICAgICAgaWYodGhpcy5yZW5kZXJlZCl7DQogICAgICAgICAgICB0aGlzLnRiLml0ZW1zLmVhY2goZnVuY3Rpb24oaXRlbSl7DQogICAgICAgICAgICAgICAgaWYoaXRlbS5tZW51KXsNCiAgICAgICAgICAgICAgICAgICAgaXRlbS5tZW51LnJlbW92ZUFsbCgpOw0KICAgICAgICAgICAgICAgICAgICBpZihpdGVtLm1lbnUuZWwpew0KICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5tZW51LmVsLmRlc3Ryb3koKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpdGVtLmRlc3Ryb3koKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgdGhpcy53cmFwLmRvbS5pbm5lckhUTUwgPSAnJzsNCiAgICAgICAgICAgIHRoaXMud3JhcC5yZW1vdmUoKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICAKICAgIG9uRmlyc3RGb2N1cyA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHRoaXMuYWN0aXZhdGVkID0gdHJ1ZTsNCiAgICAgICAgdGhpcy50Yi5pdGVtcy5lYWNoKGZ1bmN0aW9uKGl0ZW0pew0KICAgICAgICAgICBpdGVtLmVuYWJsZSgpOw0KICAgICAgICB9KTsNCiAgICAgICAgaWYoRXh0LmlzR2Vja28peyAKICAgICAgICAgICAgdGhpcy53aW4uZm9jdXMoKTsNCiAgICAgICAgICAgIHZhciBzID0gdGhpcy53aW4uZ2V0U2VsZWN0aW9uKCk7DQogICAgICAgICAgICBpZighcy5mb2N1c05vZGUgfHwgcy5mb2N1c05vZGUubm9kZVR5cGUgIT0gMyl7DQogICAgICAgICAgICAgICAgdmFyIHIgPSBzLmdldFJhbmdlQXQoMCk7DQogICAgICAgICAgICAgICAgci5zZWxlY3ROb2RlQ29udGVudHMoKHRoaXMuZG9jLmJvZHkgfHwgdGhpcy5kb2MuZG9jdW1lbnRFbGVtZW50KSk7DQogICAgICAgICAgICAgICAgci5jb2xsYXBzZSh0cnVlKTsNCiAgICAgICAgICAgICAgICB0aGlzLmRlZmVyRm9jdXMoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRyeXsNCiAgICAgICAgICAgICAgICB0aGlzLmV4ZWNDbWQoJ3VzZUNTUycsIHRydWUpOw0KICAgICAgICAgICAgICAgIHRoaXMuZXhlY0NtZCgnc3R5bGVXaXRoQ1NTJywgZmFsc2UpOw0KICAgICAgICAgICAgfWNhdGNoKGUpe30NCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmZpcmVFdmVudCgnYWN0aXZhdGUnLCB0aGlzKTsNCiAgICB9LA0KDQogICAgCiAgICBhZGp1c3RGb250OiBmdW5jdGlvbihidG4pew0KICAgICAgICB2YXIgYWRqdXN0ID0gYnRuLmlkID09ICdpbmNyZWFzZWZvbnRzaXplJyA/IDEgOiAtMTsNCiAgICAgICAgaWYoRXh0LmlzU2FmYXJpKXsgCiAgICAgICAgICAgIGFkanVzdCAqPSAyOw0KICAgICAgICB9DQogICAgICAgIHZhciB2ID0gcGFyc2VJbnQodGhpcy5kb2MucXVlcnlDb21tYW5kVmFsdWUoJ0ZvbnRTaXplJyl8fCAzLCAxMCk7DQogICAgICAgIHYgPSBNYXRoLm1heCgxLCB2K2FkanVzdCk7DQogICAgICAgIHRoaXMuZXhlY0NtZCgnRm9udFNpemUnLCB2ICsgKEV4dC5pc1NhZmFyaSA/ICdweCcgOiAwKSk7DQogICAgfSwNCg0KICAgIG9uRWRpdG9yRXZlbnQgOiBmdW5jdGlvbihlKXsNCiAgICAgICAgdGhpcy51cGRhdGVUb29sYmFyKCk7DQogICAgfSwNCg0KDQogICAgDQogICAgdXBkYXRlVG9vbGJhcjogZnVuY3Rpb24oKXsNCg0KICAgICAgICBpZighdGhpcy5hY3RpdmF0ZWQpew0KICAgICAgICAgICAgdGhpcy5vbkZpcnN0Rm9jdXMoKTsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBidG5zID0gdGhpcy50Yi5pdGVtcy5tYXAsIGRvYyA9IHRoaXMuZG9jOw0KDQogICAgICAgIGlmKHRoaXMuZW5hYmxlRm9udCAmJiAhRXh0LmlzU2FmYXJpKXsNCiAgICAgICAgICAgIHZhciBuYW1lID0gKHRoaXMuZG9jLnF1ZXJ5Q29tbWFuZFZhbHVlKCdGb250TmFtZScpfHx0aGlzLmRlZmF1bHRGb250KS50b0xvd2VyQ2FzZSgpOw0KICAgICAgICAgICAgaWYobmFtZSAhPSB0aGlzLmZvbnRTZWxlY3QuZG9tLnZhbHVlKXsNCiAgICAgICAgICAgICAgICB0aGlzLmZvbnRTZWxlY3QuZG9tLnZhbHVlID0gbmFtZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZih0aGlzLmVuYWJsZUZvcm1hdCl7DQogICAgICAgICAgICBidG5zLmJvbGQudG9nZ2xlKGRvYy5xdWVyeUNvbW1hbmRTdGF0ZSgnYm9sZCcpKTsNCiAgICAgICAgICAgIGJ0bnMuaXRhbGljLnRvZ2dsZShkb2MucXVlcnlDb21tYW5kU3RhdGUoJ2l0YWxpYycpKTsNCiAgICAgICAgICAgIGJ0bnMudW5kZXJsaW5lLnRvZ2dsZShkb2MucXVlcnlDb21tYW5kU3RhdGUoJ3VuZGVybGluZScpKTsNCiAgICAgICAgfQ0KICAgICAgICBpZih0aGlzLmVuYWJsZUFsaWdubWVudHMpew0KICAgICAgICAgICAgYnRucy5qdXN0aWZ5bGVmdC50b2dnbGUoZG9jLnF1ZXJ5Q29tbWFuZFN0YXRlKCdqdXN0aWZ5bGVmdCcpKTsNCiAgICAgICAgICAgIGJ0bnMuanVzdGlmeWNlbnRlci50b2dnbGUoZG9jLnF1ZXJ5Q29tbWFuZFN0YXRlKCdqdXN0aWZ5Y2VudGVyJykpOw0KICAgICAgICAgICAgYnRucy5qdXN0aWZ5cmlnaHQudG9nZ2xlKGRvYy5xdWVyeUNvbW1hbmRTdGF0ZSgnanVzdGlmeXJpZ2h0JykpOw0KICAgICAgICB9DQogICAgICAgIGlmKCFFeHQuaXNTYWZhcmkgJiYgdGhpcy5lbmFibGVMaXN0cyl7DQogICAgICAgICAgICBidG5zLmluc2VydG9yZGVyZWRsaXN0LnRvZ2dsZShkb2MucXVlcnlDb21tYW5kU3RhdGUoJ2luc2VydG9yZGVyZWRsaXN0JykpOw0KICAgICAgICAgICAgYnRucy5pbnNlcnR1bm9yZGVyZWRsaXN0LnRvZ2dsZShkb2MucXVlcnlDb21tYW5kU3RhdGUoJ2luc2VydHVub3JkZXJlZGxpc3QnKSk7DQogICAgICAgIH0NCiAgICAgICAgRXh0Lm1lbnUuTWVudU1nci5oaWRlQWxsKCk7DQoNCiAgICAgICAgdGhpcy5zeW5jVmFsdWUoKTsNCiAgICB9LA0KDQogICAgCiAgICByZWxheUJ0bkNtZCA6IGZ1bmN0aW9uKGJ0bil7DQogICAgICAgIHRoaXMucmVsYXlDbWQoYnRuLmlkKTsNCiAgICB9LA0KDQogICAgDQogICAgcmVsYXlDbWQgOiBmdW5jdGlvbihjbWQsIHZhbHVlKXsNCiAgICAgICAgdGhpcy53aW4uZm9jdXMoKTsNCiAgICAgICAgdGhpcy5leGVjQ21kKGNtZCwgdmFsdWUpOw0KICAgICAgICB0aGlzLnVwZGF0ZVRvb2xiYXIoKTsNCiAgICAgICAgdGhpcy5kZWZlckZvY3VzKCk7DQogICAgfSwNCg0KICAgIA0KICAgIGV4ZWNDbWQgOiBmdW5jdGlvbihjbWQsIHZhbHVlKXsNCiAgICAgICAgdGhpcy5kb2MuZXhlY0NvbW1hbmQoY21kLCBmYWxzZSwgdmFsdWUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiB2YWx1ZSk7DQogICAgICAgIHRoaXMuc3luY1ZhbHVlKCk7DQogICAgfSwNCg0KICAgIAogICAgYXBwbHlDb21tYW5kIDogZnVuY3Rpb24oZSl7DQogICAgICAgIGlmKGUuY3RybEtleSl7DQogICAgICAgICAgICB2YXIgYyA9IGUuZ2V0Q2hhckNvZGUoKSwgY21kOw0KICAgICAgICAgICAgaWYoYyA+IDApew0KICAgICAgICAgICAgICAgIGMgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpOw0KICAgICAgICAgICAgICAgIHN3aXRjaChjKXsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYic6DQogICAgICAgICAgICAgICAgICAgICAgICBjbWQgPSAnYm9sZCc7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICBjYXNlICdpJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGNtZCA9ICdpdGFsaWMnOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAndSc6DQogICAgICAgICAgICAgICAgICAgICAgICBjbWQgPSAndW5kZXJsaW5lJzsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmKGNtZCl7DQogICAgICAgICAgICAgICAgICAgIHRoaXMud2luLmZvY3VzKCk7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuZXhlY0NtZChjbWQpOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmVyRm9jdXMoKTsNCiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICANCiAgICBpbnNlcnRBdEN1cnNvciA6IGZ1bmN0aW9uKHRleHQpew0KICAgICAgICBpZighdGhpcy5hY3RpdmF0ZWQpew0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQogICAgICAgIGlmKEV4dC5pc0lFKXsNCiAgICAgICAgICAgIHRoaXMud2luLmZvY3VzKCk7DQogICAgICAgICAgICB2YXIgciA9IHRoaXMuZG9jLnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpOw0KICAgICAgICAgICAgaWYocil7DQogICAgICAgICAgICAgICAgci5jb2xsYXBzZSh0cnVlKTsNCiAgICAgICAgICAgICAgICByLnBhc3RlSFRNTCh0ZXh0KTsNCiAgICAgICAgICAgICAgICB0aGlzLnN5bmNWYWx1ZSgpOw0KICAgICAgICAgICAgICAgIHRoaXMuZGVmZXJGb2N1cygpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9ZWxzZSBpZihFeHQuaXNHZWNrbyB8fCBFeHQuaXNPcGVyYSl7DQogICAgICAgICAgICB0aGlzLndpbi5mb2N1cygpOw0KICAgICAgICAgICAgdGhpcy5leGVjQ21kKCdJbnNlcnRIVE1MJywgdGV4dCk7DQogICAgICAgICAgICB0aGlzLmRlZmVyRm9jdXMoKTsNCiAgICAgICAgfWVsc2UgaWYoRXh0LmlzU2FmYXJpKXsNCiAgICAgICAgICAgIHRoaXMuZXhlY0NtZCgnSW5zZXJ0VGV4dCcsIHRleHQpOw0KICAgICAgICAgICAgdGhpcy5kZWZlckZvY3VzKCk7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgCiAgICBmaXhLZXlzIDogZnVuY3Rpb24oKXsgCiAgICAgICAgaWYoRXh0LmlzSUUpew0KICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGUpew0KICAgICAgICAgICAgICAgIHZhciBrID0gZS5nZXRLZXkoKSwgcjsNCiAgICAgICAgICAgICAgICBpZihrID09IGUuVEFCKXsNCiAgICAgICAgICAgICAgICAgICAgZS5zdG9wRXZlbnQoKTsNCiAgICAgICAgICAgICAgICAgICAgciA9IHRoaXMuZG9jLnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpOw0KICAgICAgICAgICAgICAgICAgICBpZihyKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHIuY29sbGFwc2UodHJ1ZSk7DQogICAgICAgICAgICAgICAgICAgICAgICByLnBhc3RlSFRNTCgnJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmVyRm9jdXMoKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH1lbHNlIGlmKGsgPT0gZS5FTlRFUil7DQogICAgICAgICAgICAgICAgICAgIHIgPSB0aGlzLmRvYy5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTsNCiAgICAgICAgICAgICAgICAgICAgaWYocil7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gci5wYXJlbnRFbGVtZW50KCk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZighdGFyZ2V0IHx8IHRhcmdldC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgIT0gJ2xpJyl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wRXZlbnQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnBhc3RlSFRNTCgnPGJyIC8+Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgci5jb2xsYXBzZShmYWxzZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgci5zZWxlY3QoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH07DQogICAgICAgIH1lbHNlIGlmKEV4dC5pc09wZXJhKXsNCiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihlKXsNCiAgICAgICAgICAgICAgICB2YXIgayA9IGUuZ2V0S2V5KCk7DQogICAgICAgICAgICAgICAgaWYoayA9PSBlLlRBQil7DQogICAgICAgICAgICAgICAgICAgIGUuc3RvcEV2ZW50KCk7DQogICAgICAgICAgICAgICAgICAgIHRoaXMud2luLmZvY3VzKCk7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuZXhlY0NtZCgnSW5zZXJ0SFRNTCcsJyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOycpOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmVyRm9jdXMoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9Ow0KICAgICAgICB9ZWxzZSBpZihFeHQuaXNTYWZhcmkpew0KICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGUpew0KICAgICAgICAgICAgICAgIHZhciBrID0gZS5nZXRLZXkoKTsNCiAgICAgICAgICAgICAgICBpZihrID09IGUuVEFCKXsNCiAgICAgICAgICAgICAgICAgICAgZS5zdG9wRXZlbnQoKTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5leGVjQ21kKCdJbnNlcnRUZXh0JywnXHQnKTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZlckZvY3VzKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgIH07DQogICAgICAgIH0NCiAgICB9KCksDQoNCiAgICANCiAgICBnZXRUb29sYmFyIDogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIHRoaXMudGI7DQogICAgfSwNCg0KICAgIA0KICAgIGJ1dHRvblRpcHMgOiB7DQogICAgICAgIGJvbGQgOiB7DQogICAgICAgICAgICB0aXRsZTogJ0JvbGQgKEN0cmwrQiknLA0KICAgICAgICAgICAgdGV4dDogJ01ha2UgdGhlIHNlbGVjdGVkIHRleHQgYm9sZC4nLA0KICAgICAgICAgICAgY2xzOiAneC1odG1sLWVkaXRvci10aXAnDQogICAgICAgIH0sDQogICAgICAgIGl0YWxpYyA6IHsNCiAgICAgICAgICAgIHRpdGxlOiAnSXRhbGljIChDdHJsK0kpJywNCiAgICAgICAgICAgIHRleHQ6ICdNYWtlIHRoZSBzZWxlY3RlZCB0ZXh0IGl0YWxpYy4nLA0KICAgICAgICAgICAgY2xzOiAneC1odG1sLWVkaXRvci10aXAnDQogICAgICAgIH0sDQogICAgICAgIHVuZGVybGluZSA6IHsNCiAgICAgICAgICAgIHRpdGxlOiAnVW5kZXJsaW5lIChDdHJsK1UpJywNCiAgICAgICAgICAgIHRleHQ6ICdVbmRlcmxpbmUgdGhlIHNlbGVjdGVkIHRleHQuJywNCiAgICAgICAgICAgIGNsczogJ3gtaHRtbC1lZGl0b3ItdGlwJw0KICAgICAgICB9LA0KICAgICAgICBpbmNyZWFzZWZvbnRzaXplIDogew0KICAgICAgICAgICAgdGl0bGU6ICdHcm93IFRleHQnLA0KICAgICAgICAgICAgdGV4dDogJ0luY3JlYXNlIHRoZSBmb250IHNpemUuJywNCiAgICAgICAgICAgIGNsczogJ3gtaHRtbC1lZGl0b3ItdGlwJw0KICAgICAgICB9LA0KICAgICAgICBkZWNyZWFzZWZvbnRzaXplIDogew0KICAgICAgICAgICAgdGl0bGU6ICdTaHJpbmsgVGV4dCcsDQogICAgICAgICAgICB0ZXh0OiAnRGVjcmVhc2UgdGhlIGZvbnQgc2l6ZS4nLA0KICAgICAgICAgICAgY2xzOiAneC1odG1sLWVkaXRvci10aXAnDQogICAgICAgIH0sDQogICAgICAgIGJhY2tjb2xvciA6IHsNCiAgICAgICAgICAgIHRpdGxlOiAnVGV4dCBIaWdobGlnaHQgQ29sb3InLA0KICAgICAgICAgICAgdGV4dDogJ0NoYW5nZSB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4nLA0KICAgICAgICAgICAgY2xzOiAneC1odG1sLWVkaXRvci10aXAnDQogICAgICAgIH0sDQogICAgICAgIGZvcmVjb2xvciA6IHsNCiAgICAgICAgICAgIHRpdGxlOiAnRm9udCBDb2xvcicsDQogICAgICAgICAgICB0ZXh0OiAnQ2hhbmdlIHRoZSBjb2xvciBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4nLA0KICAgICAgICAgICAgY2xzOiAneC1odG1sLWVkaXRvci10aXAnDQogICAgICAgIH0sDQogICAgICAgIGp1c3RpZnlsZWZ0IDogew0KICAgICAgICAgICAgdGl0bGU6ICdBbGlnbiBUZXh0IExlZnQnLA0KICAgICAgICAgICAgdGV4dDogJ0FsaWduIHRleHQgdG8gdGhlIGxlZnQuJywNCiAgICAgICAgICAgIGNsczogJ3gtaHRtbC1lZGl0b3ItdGlwJw0KICAgICAgICB9LA0KICAgICAgICBqdXN0aWZ5Y2VudGVyIDogew0KICAgICAgICAgICAgdGl0bGU6ICdDZW50ZXIgVGV4dCcsDQogICAgICAgICAgICB0ZXh0OiAnQ2VudGVyIHRleHQgaW4gdGhlIGVkaXRvci4nLA0KICAgICAgICAgICAgY2xzOiAneC1odG1sLWVkaXRvci10aXAnDQogICAgICAgIH0sDQogICAgICAgIGp1c3RpZnlyaWdodCA6IHsNCiAgICAgICAgICAgIHRpdGxlOiAnQWxpZ24gVGV4dCBSaWdodCcsDQogICAgICAgICAgICB0ZXh0OiAnQWxpZ24gdGV4dCB0byB0aGUgcmlnaHQuJywNCiAgICAgICAgICAgIGNsczogJ3gtaHRtbC1lZGl0b3ItdGlwJw0KICAgICAgICB9LA0KICAgICAgICBpbnNlcnR1bm9yZGVyZWRsaXN0IDogew0KICAgICAgICAgICAgdGl0bGU6ICdCdWxsZXQgTGlzdCcsDQogICAgICAgICAgICB0ZXh0OiAnU3RhcnQgYSBidWxsZXRlZCBsaXN0LicsDQogICAgICAgICAgICBjbHM6ICd4LWh0bWwtZWRpdG9yLXRpcCcNCiAgICAgICAgfSwNCiAgICAgICAgaW5zZXJ0b3JkZXJlZGxpc3QgOiB7DQogICAgICAgICAgICB0aXRsZTogJ051bWJlcmVkIExpc3QnLA0KICAgICAgICAgICAgdGV4dDogJ1N0YXJ0IGEgbnVtYmVyZWQgbGlzdC4nLA0KICAgICAgICAgICAgY2xzOiAneC1odG1sLWVkaXRvci10aXAnDQogICAgICAgIH0sDQogICAgICAgIGNyZWF0ZWxpbmsgOiB7DQogICAgICAgICAgICB0aXRsZTogJ0h5cGVybGluaycsDQogICAgICAgICAgICB0ZXh0OiAnTWFrZSB0aGUgc2VsZWN0ZWQgdGV4dCBhIGh5cGVybGluay4nLA0KICAgICAgICAgICAgY2xzOiAneC1odG1sLWVkaXRvci10aXAnDQogICAgICAgIH0sDQogICAgICAgIHNvdXJjZWVkaXQgOiB7DQogICAgICAgICAgICB0aXRsZTogJ1NvdXJjZSBFZGl0JywNCiAgICAgICAgICAgIHRleHQ6ICdTd2l0Y2ggdG8gc291cmNlIGVkaXRpbmcgbW9kZS4nLA0KICAgICAgICAgICAgY2xzOiAneC1odG1sLWVkaXRvci10aXAnDQogICAgICAgIH0NCiAgICB9DQoNCiAgICAKICAgIA0KICAgIA0KICAgIA0KICAgIA0KICAgIA0KICAgIA0KICAgIA0KICAgIA0KICAgIA0KICAgIA0KICAgIA0KICAgIA0KfSk7CgpFeHQuZm9ybS5CYXNpY0Zvcm0gPSBmdW5jdGlvbihlbCwgY29uZmlnKXsKICAgIEV4dC5hcHBseSh0aGlzLCBjb25maWcpOwogICAgCiAgICB0aGlzLml0ZW1zID0gbmV3IEV4dC51dGlsLk1peGVkQ29sbGVjdGlvbihmYWxzZSwgZnVuY3Rpb24obyl7CiAgICAgICAgcmV0dXJuIG8uaWQgfHwgKG8uaWQgPSBFeHQuaWQoKSk7CiAgICB9KTsKICAgIHRoaXMuYWRkRXZlbnRzKHsKICAgICAgICAKICAgICAgICBiZWZvcmVhY3Rpb246IHRydWUsCiAgICAgICAgCiAgICAgICAgYWN0aW9uZmFpbGVkIDogdHJ1ZSwKICAgICAgICAKICAgICAgICBhY3Rpb25jb21wbGV0ZSA6IHRydWUKICAgIH0pOwogICAgaWYoZWwpewogICAgICAgIHRoaXMuaW5pdEVsKGVsKTsKICAgIH0KICAgIEV4dC5mb3JtLkJhc2ljRm9ybS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7Cn07CgpFeHQuZXh0ZW5kKEV4dC5mb3JtLkJhc2ljRm9ybSwgRXh0LnV0aWwuT2JzZXJ2YWJsZSwgewogICAgCiAgICAKICAgIAogICAgCiAgICAKICAgIAogICAgCiAgICB0aW1lb3V0OiAzMCwKCiAgICAgICAgYWN0aXZlQWN0aW9uIDogbnVsbCwKCiAgICAKICAgIHRyYWNrUmVzZXRPbkxvYWQgOiBmYWxzZSwKCiAgICAKICAgIHdhaXRNc2dUYXJnZXQgOiB1bmRlZmluZWQsCgogICAgICAgIGluaXRFbCA6IGZ1bmN0aW9uKGVsKXsKICAgICAgICB0aGlzLmVsID0gRXh0LmdldChlbCk7CiAgICAgICAgdGhpcy5pZCA9IHRoaXMuZWwuaWQgfHwgRXh0LmlkKCk7CiAgICAgICAgdGhpcy5lbC5vbignc3VibWl0JywgdGhpcy5vblN1Ym1pdCwgdGhpcyk7CiAgICAgICAgdGhpcy5lbC5hZGRDbGFzcygneC1mb3JtJyk7CiAgICB9LAoKICAgICAgICBvblN1Ym1pdCA6IGZ1bmN0aW9uKGUpewogICAgICAgIGUuc3RvcEV2ZW50KCk7CiAgICB9LAoKICAgIAogICAgaXNWYWxpZCA6IGZ1bmN0aW9uKCl7CiAgICAgICAgdmFyIHZhbGlkID0gdHJ1ZTsKICAgICAgICB0aGlzLml0ZW1zLmVhY2goZnVuY3Rpb24oZil7CiAgICAgICAgICAgaWYoIWYudmFsaWRhdGUoKSl7CiAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHJldHVybiB2YWxpZDsKICAgIH0sCgogICAgCiAgICBpc0RpcnR5IDogZnVuY3Rpb24oKXsKICAgICAgICB2YXIgZGlydHkgPSBmYWxzZTsKICAgICAgICB0aGlzLml0ZW1zLmVhY2goZnVuY3Rpb24oZil7CiAgICAgICAgICAgaWYoZi5pc0RpcnR5KCkpewogICAgICAgICAgICAgICBkaXJ0eSA9IHRydWU7CiAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGRpcnR5OwogICAgfSwKCiAgICAKICAgIGRvQWN0aW9uIDogZnVuY3Rpb24oYWN0aW9uLCBvcHRpb25zKXsKICAgICAgICBpZih0eXBlb2YgYWN0aW9uID09ICdzdHJpbmcnKXsKICAgICAgICAgICAgYWN0aW9uID0gbmV3IEV4dC5mb3JtLkFjdGlvbi5BQ1RJT05fVFlQRVNbYWN0aW9uXSh0aGlzLCBvcHRpb25zKTsKICAgICAgICB9CiAgICAgICAgaWYodGhpcy5maXJlRXZlbnQoJ2JlZm9yZWFjdGlvbicsIHRoaXMsIGFjdGlvbikgIT09IGZhbHNlKXsKICAgICAgICAgICAgdGhpcy5iZWZvcmVBY3Rpb24oYWN0aW9uKTsKICAgICAgICAgICAgYWN0aW9uLnJ1bi5kZWZlcigxMDAsIGFjdGlvbik7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzOwogICAgfSwKCiAgICAKICAgIHN1Ym1pdCA6IGZ1bmN0aW9uKG9wdGlvbnMpewogICAgICAgIHRoaXMuZG9BY3Rpb24oJ3N1Ym1pdCcsIG9wdGlvbnMpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfSwKCiAgICAKICAgIGxvYWQgOiBmdW5jdGlvbihvcHRpb25zKXsKICAgICAgICB0aGlzLmRvQWN0aW9uKCdsb2FkJywgb3B0aW9ucyk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAoKICAgIAogICAgdXBkYXRlUmVjb3JkIDogZnVuY3Rpb24ocmVjb3JkKXsKICAgICAgICByZWNvcmQuYmVnaW5FZGl0KCk7CiAgICAgICAgdmFyIGZzID0gcmVjb3JkLmZpZWxkczsKICAgICAgICBmcy5lYWNoKGZ1bmN0aW9uKGYpewogICAgICAgICAgICB2YXIgZmllbGQgPSB0aGlzLmZpbmRGaWVsZChmLm5hbWUpOwogICAgICAgICAgICBpZihmaWVsZCl7CiAgICAgICAgICAgICAgICByZWNvcmQuc2V0KGYubmFtZSwgZmllbGQuZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LCB0aGlzKTsKICAgICAgICByZWNvcmQuZW5kRWRpdCgpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfSwKCiAgICAKICAgIGxvYWRSZWNvcmQgOiBmdW5jdGlvbihyZWNvcmQpewogICAgICAgIHRoaXMuc2V0VmFsdWVzKHJlY29yZC5kYXRhKTsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0sCgogICAgICAgIGJlZm9yZUFjdGlvbiA6IGZ1bmN0aW9uKGFjdGlvbil7CiAgICAgICAgdmFyIG8gPSBhY3Rpb24ub3B0aW9uczsKICAgICAgICBpZihvLndhaXRNc2cpewogICAgICAgICAgICBpZih0aGlzLndhaXRNc2dUYXJnZXQgPT09IHRydWUpewogICAgICAgICAgICAgICAgdGhpcy5lbC5tYXNrKG8ud2FpdE1zZywgJ3gtbWFzay1sb2FkaW5nJyk7CiAgICAgICAgICAgIH1lbHNlIGlmKHRoaXMud2FpdE1zZ1RhcmdldCl7CiAgICAgICAgICAgICAgICB0aGlzLndhaXRNc2dUYXJnZXQgPSBFeHQuZ2V0KHRoaXMud2FpdE1zZ1RhcmdldCk7CiAgICAgICAgICAgICAgICB0aGlzLndhaXRNc2dUYXJnZXQubWFzayhvLndhaXRNc2csICd4LW1hc2stbG9hZGluZycpOwogICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgIEV4dC5NZXNzYWdlQm94LndhaXQoby53YWl0TXNnLCBvLndhaXRUaXRsZSB8fCB0aGlzLndhaXRUaXRsZSB8fCAnUGxlYXNlIFdhaXQuLi4nKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0sCgogICAgICAgIGFmdGVyQWN0aW9uIDogZnVuY3Rpb24oYWN0aW9uLCBzdWNjZXNzKXsKICAgICAgICB0aGlzLmFjdGl2ZUFjdGlvbiA9IG51bGw7CiAgICAgICAgdmFyIG8gPSBhY3Rpb24ub3B0aW9uczsKICAgICAgICBpZihvLndhaXRNc2cpewogICAgICAgICAgICBpZih0aGlzLndhaXRNc2dUYXJnZXQgPT09IHRydWUpewogICAgICAgICAgICAgICAgdGhpcy5lbC51bm1hc2soKTsKICAgICAgICAgICAgfWVsc2UgaWYodGhpcy53YWl0TXNnVGFyZ2V0KXsKICAgICAgICAgICAgICAgIHRoaXMud2FpdE1zZ1RhcmdldC51bm1hc2soKTsKICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICBFeHQuTWVzc2FnZUJveC51cGRhdGVQcm9ncmVzcygxKTsKICAgICAgICAgICAgICAgIEV4dC5NZXNzYWdlQm94LmhpZGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZihzdWNjZXNzKXsKICAgICAgICAgICAgaWYoby5yZXNldCl7CiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgRXh0LmNhbGxiYWNrKG8uc3VjY2Vzcywgby5zY29wZSwgW3RoaXMsIGFjdGlvbl0pOwogICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgnYWN0aW9uY29tcGxldGUnLCB0aGlzLCBhY3Rpb24pOwogICAgICAgIH1lbHNlewogICAgICAgICAgICBFeHQuY2FsbGJhY2soby5mYWlsdXJlLCBvLnNjb3BlLCBbdGhpcywgYWN0aW9uXSk7CiAgICAgICAgICAgIHRoaXMuZmlyZUV2ZW50KCdhY3Rpb25mYWlsZWQnLCB0aGlzLCBhY3Rpb24pOwogICAgICAgIH0KICAgIH0sCgogICAgCiAgICBmaW5kRmllbGQgOiBmdW5jdGlvbihpZCl7CiAgICAgICAgdmFyIGZpZWxkID0gdGhpcy5pdGVtcy5nZXQoaWQpOwogICAgICAgIGlmKCFmaWVsZCl7CiAgICAgICAgICAgIHRoaXMuaXRlbXMuZWFjaChmdW5jdGlvbihmKXsKICAgICAgICAgICAgICAgIGlmKGYuaXNGb3JtRmllbGQgJiYgKGYuZGF0YUluZGV4ID09IGlkIHx8IGYuaWQgPT0gaWQgfHwgZi5nZXROYW1lKCkgPT0gaWQpKXsKICAgICAgICAgICAgICAgICAgICBmaWVsZCA9IGY7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZpZWxkIHx8IG51bGw7CiAgICB9LAoKCiAgICAKICAgIG1hcmtJbnZhbGlkIDogZnVuY3Rpb24oZXJyb3JzKXsKICAgICAgICBpZihlcnJvcnMgaW5zdGFuY2VvZiBBcnJheSl7CiAgICAgICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IGVycm9ycy5sZW5ndGg7IGkgPCBsZW47IGkrKyl7CiAgICAgICAgICAgICAgICB2YXIgZmllbGRFcnJvciA9IGVycm9yc1tpXTsKICAgICAgICAgICAgICAgIHZhciBmID0gdGhpcy5maW5kRmllbGQoZmllbGRFcnJvci5pZCk7CiAgICAgICAgICAgICAgICBpZihmKXsKICAgICAgICAgICAgICAgICAgICBmLm1hcmtJbnZhbGlkKGZpZWxkRXJyb3IubXNnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH1lbHNlewogICAgICAgICAgICB2YXIgZmllbGQsIGlkOwogICAgICAgICAgICBmb3IoaWQgaW4gZXJyb3JzKXsKICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBlcnJvcnNbaWRdICE9ICdmdW5jdGlvbicgJiYgKGZpZWxkID0gdGhpcy5maW5kRmllbGQoaWQpKSl7CiAgICAgICAgICAgICAgICAgICAgZmllbGQubWFya0ludmFsaWQoZXJyb3JzW2lkXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAoKICAgIAogICAgc2V0VmFsdWVzIDogZnVuY3Rpb24odmFsdWVzKXsKICAgICAgICBpZih2YWx1ZXMgaW5zdGFuY2VvZiBBcnJheSl7ICAgICAgICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IHZhbHVlcy5sZW5ndGg7IGkgPCBsZW47IGkrKyl7CiAgICAgICAgICAgICAgICB2YXIgdiA9IHZhbHVlc1tpXTsKICAgICAgICAgICAgICAgIHZhciBmID0gdGhpcy5maW5kRmllbGQodi5pZCk7CiAgICAgICAgICAgICAgICBpZihmKXsKICAgICAgICAgICAgICAgICAgICBmLnNldFZhbHVlKHYudmFsdWUpOwogICAgICAgICAgICAgICAgICAgIGlmKHRoaXMudHJhY2tSZXNldE9uTG9hZCl7CiAgICAgICAgICAgICAgICAgICAgICAgIGYub3JpZ2luYWxWYWx1ZSA9IGYuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9ZWxzZXsgICAgICAgICAgICAgdmFyIGZpZWxkLCBpZDsKICAgICAgICAgICAgZm9yKGlkIGluIHZhbHVlcyl7CiAgICAgICAgICAgICAgICBpZih0eXBlb2YgdmFsdWVzW2lkXSAhPSAnZnVuY3Rpb24nICYmIChmaWVsZCA9IHRoaXMuZmluZEZpZWxkKGlkKSkpewogICAgICAgICAgICAgICAgICAgIGZpZWxkLnNldFZhbHVlKHZhbHVlc1tpZF0pOwogICAgICAgICAgICAgICAgICAgIGlmKHRoaXMudHJhY2tSZXNldE9uTG9hZCl7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLm9yaWdpbmFsVmFsdWUgPSBmaWVsZC5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpczsKICAgIH0sCgogICAgCiAgICBnZXRWYWx1ZXMgOiBmdW5jdGlvbihhc1N0cmluZyl7CiAgICAgICAgdmFyIGZzID0gRXh0LmxpYi5BamF4LnNlcmlhbGl6ZUZvcm0odGhpcy5lbC5kb20pOwogICAgICAgIGlmKGFzU3RyaW5nID09PSB0cnVlKXsKICAgICAgICAgICAgcmV0dXJuIGZzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gRXh0LnVybERlY29kZShmcyk7CiAgICB9LAoKICAgIAogICAgY2xlYXJJbnZhbGlkIDogZnVuY3Rpb24oKXsKICAgICAgICB0aGlzLml0ZW1zLmVhY2goZnVuY3Rpb24oZil7CiAgICAgICAgICAgZi5jbGVhckludmFsaWQoKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0sCgogICAgCiAgICByZXNldCA6IGZ1bmN0aW9uKCl7CiAgICAgICAgdGhpcy5pdGVtcy5lYWNoKGZ1bmN0aW9uKGYpewogICAgICAgICAgICBmLnJlc2V0KCk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAoKICAgIAogICAgYWRkIDogZnVuY3Rpb24oKXsKICAgICAgICB0aGlzLml0ZW1zLmFkZEFsbChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApKTsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0sCgoKICAgIAogICAgcmVtb3ZlIDogZnVuY3Rpb24oZmllbGQpewogICAgICAgIHRoaXMuaXRlbXMucmVtb3ZlKGZpZWxkKTsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0sCgogICAgCiAgICByZW5kZXIgOiBmdW5jdGlvbigpewogICAgICAgIHRoaXMuaXRlbXMuZWFjaChmdW5jdGlvbihmKXsKICAgICAgICAgICAgaWYoZi5pc0Zvcm1GaWVsZCAmJiAhZi5yZW5kZXJlZCAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChmLmlkKSl7ICAgICAgICAgICAgICAgICBmLmFwcGx5VG8oZi5pZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0sCgogICAgCiAgICBhcHBseVRvRmllbGRzIDogZnVuY3Rpb24obyl7CiAgICAgICAgdGhpcy5pdGVtcy5lYWNoKGZ1bmN0aW9uKGYpewogICAgICAgICAgIEV4dC5hcHBseShmLCBvKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0sCgogICAgCiAgICBhcHBseUlmVG9GaWVsZHMgOiBmdW5jdGlvbihvKXsKICAgICAgICB0aGlzLml0ZW1zLmVhY2goZnVuY3Rpb24oZil7CiAgICAgICAgICAgRXh0LmFwcGx5SWYoZiwgbyk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9Cn0pOwoKRXh0LkJhc2ljRm9ybSA9IEV4dC5mb3JtLkJhc2ljRm9ybTsKCkV4dC5mb3JtLkZvcm0gPSBmdW5jdGlvbihjb25maWcpewogICAgRXh0LmZvcm0uRm9ybS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgbnVsbCwgY29uZmlnKTsKICAgIHRoaXMudXJsID0gdGhpcy51cmwgfHwgdGhpcy5hY3Rpb247CiAgICBpZighdGhpcy5yb290KXsKICAgICAgICB0aGlzLnJvb3QgPSBuZXcgRXh0LmZvcm0uTGF5b3V0KEV4dC5hcHBseUlmKHsKICAgICAgICAgICAgaWQ6IEV4dC5pZCgpCiAgICAgICAgfSwgY29uZmlnKSk7CiAgICB9CiAgICB0aGlzLmFjdGl2ZSA9IHRoaXMucm9vdDsKICAgIAogICAgdGhpcy5idXR0b25zID0gW107CiAgICB0aGlzLmFkZEV2ZW50cyh7CiAgICAgICAgCiAgICAgICAgY2xpZW50dmFsaWRhdGlvbjogdHJ1ZQogICAgfSk7Cn07CgpFeHQuZXh0ZW5kKEV4dC5mb3JtLkZvcm0sIEV4dC5mb3JtLkJhc2ljRm9ybSwgewogICAgCiAgICAKICAgIAogICAgYnV0dG9uQWxpZ246J2NlbnRlcicsCgogICAgCiAgICBtaW5CdXR0b25XaWR0aDo3NSwKCiAgICAKICAgIGxhYmVsQWxpZ246J2xlZnQnLAoKICAgIAogICAgbW9uaXRvclZhbGlkIDogZmFsc2UsCgogICAgCiAgICBtb25pdG9yUG9sbCA6IDIwMCwKCiAgICAKICAgIGNvbHVtbiA6IGZ1bmN0aW9uKGMpewogICAgICAgIHZhciBjb2wgPSBuZXcgRXh0LmZvcm0uQ29sdW1uKGMpOwogICAgICAgIHRoaXMuc3RhcnQoY29sKTsKICAgICAgICBpZihhcmd1bWVudHMubGVuZ3RoID4gMSl7ICAgICAgICAgICAgIHRoaXMuYWRkLmFwcGx5KHRoaXMsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpOwogICAgICAgICAgICB0aGlzLmVuZCgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY29sOwogICAgfSwKCiAgICAKICAgIGZpZWxkc2V0IDogZnVuY3Rpb24oYyl7CiAgICAgICAgdmFyIGZzID0gbmV3IEV4dC5mb3JtLkZpZWxkU2V0KGMpOwogICAgICAgIHRoaXMuc3RhcnQoZnMpOwogICAgICAgIGlmKGFyZ3VtZW50cy5sZW5ndGggPiAxKXsgICAgICAgICAgICAgdGhpcy5hZGQuYXBwbHkodGhpcywgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7CiAgICAgICAgICAgIHRoaXMuZW5kKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmczsKICAgIH0sCgogICAgCiAgICBjb250YWluZXIgOiBmdW5jdGlvbihjKXsKICAgICAgICB2YXIgbCA9IG5ldyBFeHQuZm9ybS5MYXlvdXQoYyk7CiAgICAgICAgdGhpcy5zdGFydChsKTsKICAgICAgICBpZihhcmd1bWVudHMubGVuZ3RoID4gMSl7ICAgICAgICAgICAgIHRoaXMuYWRkLmFwcGx5KHRoaXMsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpOwogICAgICAgICAgICB0aGlzLmVuZCgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbDsKICAgIH0sCgogICAgCiAgICBzdGFydCA6IGZ1bmN0aW9uKGMpewogICAgICAgICAgICAgICAgRXh0LmFwcGx5SWYoYywgeydsYWJlbEFsaWduJzogdGhpcy5hY3RpdmUubGFiZWxBbGlnbiwgJ2xhYmVsV2lkdGgnOiB0aGlzLmFjdGl2ZS5sYWJlbFdpZHRoLCAnaXRlbUNscyc6IHRoaXMuYWN0aXZlLml0ZW1DbHN9KTsKICAgICAgICB0aGlzLmFjdGl2ZS5zdGFjay5wdXNoKGMpOwogICAgICAgIGMub3duZXJDdCA9IHRoaXMuYWN0aXZlOwogICAgICAgIHRoaXMuYWN0aXZlID0gYzsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0sCgogICAgCiAgICBlbmQgOiBmdW5jdGlvbigpewogICAgICAgIGlmKHRoaXMuYWN0aXZlID09IHRoaXMucm9vdCl7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0KICAgICAgICB0aGlzLmFjdGl2ZSA9IHRoaXMuYWN0aXZlLm93bmVyQ3Q7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAoKICAgIAogICAgYWRkIDogZnVuY3Rpb24oKXsKICAgICAgICB0aGlzLmFjdGl2ZS5zdGFjay5wdXNoLmFwcGx5KHRoaXMuYWN0aXZlLnN0YWNrLCBhcmd1bWVudHMpOwogICAgICAgIHZhciByID0gW107CiAgICAgICAgZm9yKHZhciBpID0gMCwgYSA9IGFyZ3VtZW50cywgbGVuID0gYS5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICBpZihhW2ldLmlzRm9ybUZpZWxkKXsKICAgICAgICAgICAgICAgIHIucHVzaChhW2ldKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZihyLmxlbmd0aCA+IDApewogICAgICAgICAgICBFeHQuZm9ybS5Gb3JtLnN1cGVyY2xhc3MuYWRkLmFwcGx5KHRoaXMsIHIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpczsKICAgIH0sCgogICAgCiAgICByZW5kZXIgOiBmdW5jdGlvbihjdCl7CiAgICAgICAgY3QgPSBFeHQuZ2V0KGN0KTsKICAgICAgICB2YXIgbyA9IHRoaXMuYXV0b0NyZWF0ZSB8fCB7CiAgICAgICAgICAgIHRhZzogJ2Zvcm0nLAogICAgICAgICAgICBtZXRob2QgOiB0aGlzLm1ldGhvZCB8fCAnUE9TVCcsCiAgICAgICAgICAgIGlkIDogdGhpcy5pZCB8fCBFeHQuaWQoKQogICAgICAgIH07CiAgICAgICAgdGhpcy5pbml0RWwoY3QuY3JlYXRlQ2hpbGQobykpOwoKICAgICAgICB0aGlzLnJvb3QucmVuZGVyKHRoaXMuZWwpOwoKICAgICAgICB0aGlzLml0ZW1zLmVhY2goZnVuY3Rpb24oZil7CiAgICAgICAgICAgIGYucmVuZGVyKCd4LWZvcm0tZWwtJytmLmlkKTsKICAgICAgICB9KTsKCiAgICAgICAgaWYodGhpcy5idXR0b25zLmxlbmd0aCA+IDApewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGIgPSB0aGlzLmVsLmNyZWF0ZUNoaWxkKHtjbHM6J3gtZm9ybS1idG5zLWN0JywgY246IHsKICAgICAgICAgICAgICAgIGNsczoieC1mb3JtLWJ0bnMgeC1mb3JtLWJ0bnMtIit0aGlzLmJ1dHRvbkFsaWduLAogICAgICAgICAgICAgICAgaHRtbDonPHRhYmxlIGNlbGxzcGFjaW5nPSIwIj48dGJvZHk+PHRyPjwvdHI+PC90Ym9keT48L3RhYmxlPjxkaXYgY2xhc3M9IngtY2xlYXIiPjwvZGl2PicKICAgICAgICAgICAgfX0sIG51bGwsIHRydWUpOwogICAgICAgICAgICB2YXIgdHIgPSB0Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgndHInKVswXTsKICAgICAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gdGhpcy5idXR0b25zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgICAgICB2YXIgYiA9IHRoaXMuYnV0dG9uc1tpXTsKICAgICAgICAgICAgICAgIHZhciB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CiAgICAgICAgICAgICAgICB0ZC5jbGFzc05hbWUgPSAneC1mb3JtLWJ0bi10ZCc7CiAgICAgICAgICAgICAgICBiLnJlbmRlcih0ci5hcHBlbmRDaGlsZCh0ZCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmKHRoaXMubW9uaXRvclZhbGlkKXsgICAgICAgICAgICAgdGhpcy5zdGFydE1vbml0b3JpbmcoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAoKICAgIAogICAgYWRkQnV0dG9uIDogZnVuY3Rpb24oY29uZmlnLCBoYW5kbGVyLCBzY29wZSl7CiAgICAgICAgdmFyIGJjID0gewogICAgICAgICAgICBoYW5kbGVyOiBoYW5kbGVyLAogICAgICAgICAgICBzY29wZTogc2NvcGUsCiAgICAgICAgICAgIG1pbldpZHRoOiB0aGlzLm1pbkJ1dHRvbldpZHRoLAogICAgICAgICAgICBoaWRlUGFyZW50OnRydWUKICAgICAgICB9OwogICAgICAgIGlmKHR5cGVvZiBjb25maWcgPT0gInN0cmluZyIpewogICAgICAgICAgICBiYy50ZXh0ID0gY29uZmlnOwogICAgICAgIH1lbHNlewogICAgICAgICAgICBFeHQuYXBwbHkoYmMsIGNvbmZpZyk7CiAgICAgICAgfQogICAgICAgIHZhciBidG4gPSBuZXcgRXh0LkJ1dHRvbihudWxsLCBiYyk7CiAgICAgICAgdGhpcy5idXR0b25zLnB1c2goYnRuKTsKICAgICAgICByZXR1cm4gYnRuOwogICAgfSwKCiAgICAKICAgIHN0YXJ0TW9uaXRvcmluZyA6IGZ1bmN0aW9uKCl7CiAgICAgICAgaWYoIXRoaXMuYm91bmQpewogICAgICAgICAgICB0aGlzLmJvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgRXh0LlRhc2tNZ3Iuc3RhcnQoewogICAgICAgICAgICAgICAgcnVuIDogdGhpcy5iaW5kSGFuZGxlciwKICAgICAgICAgICAgICAgIGludGVydmFsIDogdGhpcy5tb25pdG9yUG9sbCB8fCAyMDAsCiAgICAgICAgICAgICAgICBzY29wZTogdGhpcwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9LAoKICAgIAogICAgc3RvcE1vbml0b3JpbmcgOiBmdW5jdGlvbigpewogICAgICAgIHRoaXMuYm91bmQgPSBmYWxzZTsKICAgIH0sCgogICAgICAgIGJpbmRIYW5kbGVyIDogZnVuY3Rpb24oKXsKICAgICAgICBpZighdGhpcy5ib3VuZCl7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAgICAgICB9CiAgICAgICAgdmFyIHZhbGlkID0gdHJ1ZTsKICAgICAgICB0aGlzLml0ZW1zLmVhY2goZnVuY3Rpb24oZil7CiAgICAgICAgICAgIGlmKCFmLmlzVmFsaWQodHJ1ZSkpewogICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IHRoaXMuYnV0dG9ucy5sZW5ndGg7IGkgPCBsZW47IGkrKyl7CiAgICAgICAgICAgIHZhciBidG4gPSB0aGlzLmJ1dHRvbnNbaV07CiAgICAgICAgICAgIGlmKGJ0bi5mb3JtQmluZCA9PT0gdHJ1ZSAmJiBidG4uZGlzYWJsZWQgPT09IHZhbGlkKXsKICAgICAgICAgICAgICAgIGJ0bi5zZXREaXNhYmxlZCghdmFsaWQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuZmlyZUV2ZW50KCdjbGllbnR2YWxpZGF0aW9uJywgdGhpcywgdmFsaWQpOwogICAgfQp9KTsKCgpFeHQuRm9ybSA9IEV4dC5mb3JtLkZvcm07CgoKRXh0LmZvcm0uQWN0aW9uID0gZnVuY3Rpb24oZm9ybSwgb3B0aW9ucyl7CiAgICB0aGlzLmZvcm0gPSBmb3JtOwogICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKfTsKCkV4dC5mb3JtLkFjdGlvbi5DTElFTlRfSU5WQUxJRCA9ICdjbGllbnQnOwpFeHQuZm9ybS5BY3Rpb24uU0VSVkVSX0lOVkFMSUQgPSAnc2VydmVyJzsKRXh0LmZvcm0uQWN0aW9uLkNPTk5FQ1RfRkFJTFVSRSA9ICdjb25uZWN0JzsKRXh0LmZvcm0uQWN0aW9uLkxPQURfRkFJTFVSRSA9ICdsb2FkJzsKCkV4dC5mb3JtLkFjdGlvbi5wcm90b3R5cGUgPSB7CiAgICB0eXBlIDogJ2RlZmF1bHQnLAogICAgZmFpbHVyZVR5cGUgOiB1bmRlZmluZWQsCiAgICByZXNwb25zZSA6IHVuZGVmaW5lZCwKICAgIHJlc3VsdCA6IHVuZGVmaW5lZCwKCiAgICAgICAgcnVuIDogZnVuY3Rpb24ob3B0aW9ucyl7CgogICAgfSwKCiAgICAgICAgc3VjY2VzcyA6IGZ1bmN0aW9uKHJlc3BvbnNlKXsKCiAgICB9LAoKICAgICAgICBoYW5kbGVSZXNwb25zZSA6IGZ1bmN0aW9uKHJlc3BvbnNlKXsKCiAgICB9LAoKICAgICAgICBmYWlsdXJlIDogZnVuY3Rpb24ocmVzcG9uc2UpewogICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTsKICAgICAgICB0aGlzLmZhaWx1cmVUeXBlID0gRXh0LmZvcm0uQWN0aW9uLkNPTk5FQ1RfRkFJTFVSRTsKICAgICAgICB0aGlzLmZvcm0uYWZ0ZXJBY3Rpb24odGhpcywgZmFsc2UpOwogICAgfSwKCiAgICBwcm9jZXNzUmVzcG9uc2UgOiBmdW5jdGlvbihyZXNwb25zZSl7CiAgICAgICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlOwogICAgICAgIGlmKCFyZXNwb25zZS5yZXNwb25zZVRleHQpewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgdGhpcy5yZXN1bHQgPSB0aGlzLmhhbmRsZVJlc3BvbnNlKHJlc3BvbnNlKTsKICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHQ7CiAgICB9LAoKICAgICAgICBnZXRVcmwgOiBmdW5jdGlvbihhcHBlbmRQYXJhbXMpewogICAgICAgIHZhciB1cmwgPSB0aGlzLm9wdGlvbnMudXJsIHx8IHRoaXMuZm9ybS51cmwgfHwgdGhpcy5mb3JtLmVsLmRvbS5hY3Rpb247CiAgICAgICAgaWYoYXBwZW5kUGFyYW1zKXsKICAgICAgICAgICAgdmFyIHAgPSB0aGlzLmdldFBhcmFtcygpOwogICAgICAgICAgICBpZihwKXsKICAgICAgICAgICAgICAgIHVybCArPSAodXJsLmluZGV4T2YoJz8nKSAhPSAtMSA/ICcmJyA6ICc/JykgKyBwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB1cmw7CiAgICB9LAoKICAgIGdldE1ldGhvZCA6IGZ1bmN0aW9uKCl7CiAgICAgICAgcmV0dXJuICh0aGlzLm9wdGlvbnMubWV0aG9kIHx8IHRoaXMuZm9ybS5tZXRob2QgfHwgdGhpcy5mb3JtLmVsLmRvbS5tZXRob2QgfHwgJ1BPU1QnKS50b1VwcGVyQ2FzZSgpOwogICAgfSwKCiAgICBnZXRQYXJhbXMgOiBmdW5jdGlvbigpewogICAgICAgIHZhciBicCA9IHRoaXMuZm9ybS5iYXNlUGFyYW1zOwogICAgICAgIHZhciBwID0gdGhpcy5vcHRpb25zLnBhcmFtczsKICAgICAgICBpZihwKXsKICAgICAgICAgICAgaWYodHlwZW9mIHAgPT0gIm9iamVjdCIpewogICAgICAgICAgICAgICAgcCA9IEV4dC51cmxFbmNvZGUoRXh0LmFwcGx5SWYocCwgYnApKTsKICAgICAgICAgICAgfWVsc2UgaWYodHlwZW9mIHAgPT0gJ3N0cmluZycgJiYgYnApewogICAgICAgICAgICAgICAgcCArPSAnJicgKyBFeHQudXJsRW5jb2RlKGJwKTsKICAgICAgICAgICAgfQogICAgICAgIH1lbHNlIGlmKGJwKXsKICAgICAgICAgICAgcCA9IEV4dC51cmxFbmNvZGUoYnApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcDsKICAgIH0sCgogICAgY3JlYXRlQ2FsbGJhY2sgOiBmdW5jdGlvbigpewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHN1Y2Nlc3M6IHRoaXMuc3VjY2VzcywKICAgICAgICAgICAgZmFpbHVyZTogdGhpcy5mYWlsdXJlLAogICAgICAgICAgICBzY29wZTogdGhpcywKICAgICAgICAgICAgdGltZW91dDogKHRoaXMuZm9ybS50aW1lb3V0KjEwMDApLAogICAgICAgICAgICB1cGxvYWQ6IHRoaXMuZm9ybS5maWxlVXBsb2FkID8gdGhpcy5zdWNjZXNzIDogdW5kZWZpbmVkCiAgICAgICAgfTsKICAgIH0KfTsKCkV4dC5mb3JtLkFjdGlvbi5TdWJtaXQgPSBmdW5jdGlvbihmb3JtLCBvcHRpb25zKXsKICAgIEV4dC5mb3JtLkFjdGlvbi5TdWJtaXQuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIGZvcm0sIG9wdGlvbnMpOwp9OwoKRXh0LmV4dGVuZChFeHQuZm9ybS5BY3Rpb24uU3VibWl0LCBFeHQuZm9ybS5BY3Rpb24sIHsKICAgIHR5cGUgOiAnc3VibWl0JywKCiAgICBydW4gOiBmdW5jdGlvbigpewogICAgICAgIHZhciBvID0gdGhpcy5vcHRpb25zOwogICAgICAgIHZhciBtZXRob2QgPSB0aGlzLmdldE1ldGhvZCgpOwogICAgICAgIHZhciBpc1Bvc3QgPSBtZXRob2QgPT0gJ1BPU1QnOwogICAgICAgIGlmKG8uY2xpZW50VmFsaWRhdGlvbiA9PT0gZmFsc2UgfHwgdGhpcy5mb3JtLmlzVmFsaWQoKSl7CiAgICAgICAgICAgIEV4dC5BamF4LnJlcXVlc3QoRXh0LmFwcGx5KHRoaXMuY3JlYXRlQ2FsbGJhY2soKSwgewogICAgICAgICAgICAgICAgZm9ybTp0aGlzLmZvcm0uZWwuZG9tLAogICAgICAgICAgICAgICAgdXJsOnRoaXMuZ2V0VXJsKCFpc1Bvc3QpLAogICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsCiAgICAgICAgICAgICAgICBwYXJhbXM6aXNQb3N0ID8gdGhpcy5nZXRQYXJhbXMoKSA6IG51bGwsCiAgICAgICAgICAgICAgICBpc1VwbG9hZDogdGhpcy5mb3JtLmZpbGVVcGxvYWQKICAgICAgICAgICAgfSkpOwoKICAgICAgICB9ZWxzZSBpZiAoby5jbGllbnRWYWxpZGF0aW9uICE9PSBmYWxzZSl7ICAgICAgICAgICAgIHRoaXMuZmFpbHVyZVR5cGUgPSBFeHQuZm9ybS5BY3Rpb24uQ0xJRU5UX0lOVkFMSUQ7CiAgICAgICAgICAgIHRoaXMuZm9ybS5hZnRlckFjdGlvbih0aGlzLCBmYWxzZSk7CiAgICAgICAgfQogICAgfSwKCiAgICBzdWNjZXNzIDogZnVuY3Rpb24ocmVzcG9uc2UpewogICAgICAgIHZhciByZXN1bHQgPSB0aGlzLnByb2Nlc3NSZXNwb25zZShyZXNwb25zZSk7CiAgICAgICAgaWYocmVzdWx0ID09PSB0cnVlIHx8IHJlc3VsdC5zdWNjZXNzKXsKICAgICAgICAgICAgdGhpcy5mb3JtLmFmdGVyQWN0aW9uKHRoaXMsIHRydWUpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmKHJlc3VsdC5lcnJvcnMpewogICAgICAgICAgICB0aGlzLmZvcm0ubWFya0ludmFsaWQocmVzdWx0LmVycm9ycyk7CiAgICAgICAgICAgIHRoaXMuZmFpbHVyZVR5cGUgPSBFeHQuZm9ybS5BY3Rpb24uU0VSVkVSX0lOVkFMSUQ7CiAgICAgICAgfQogICAgICAgIHRoaXMuZm9ybS5hZnRlckFjdGlvbih0aGlzLCBmYWxzZSk7CiAgICB9LAoKICAgIGhhbmRsZVJlc3BvbnNlIDogZnVuY3Rpb24ocmVzcG9uc2UpewogICAgICAgIGlmKHRoaXMuZm9ybS5lcnJvclJlYWRlcil7CiAgICAgICAgICAgIHZhciBycyA9IHRoaXMuZm9ybS5lcnJvclJlYWRlci5yZWFkKHJlc3BvbnNlKTsKICAgICAgICAgICAgdmFyIGVycm9ycyA9IFtdOwogICAgICAgICAgICBpZihycy5yZWNvcmRzKXsKICAgICAgICAgICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IHJzLnJlY29yZHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHJzLnJlY29yZHNbaV07CiAgICAgICAgICAgICAgICAgICAgZXJyb3JzW2ldID0gci5kYXRhOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKGVycm9ycy5sZW5ndGggPCAxKXsKICAgICAgICAgICAgICAgIGVycm9ycyA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHN1Y2Nlc3MgOiBycy5zdWNjZXNzLAogICAgICAgICAgICAgICAgZXJyb3JzIDogZXJyb3JzCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiBFeHQuZGVjb2RlKHJlc3BvbnNlLnJlc3BvbnNlVGV4dCk7CiAgICB9Cn0pOwoKCkV4dC5mb3JtLkFjdGlvbi5Mb2FkID0gZnVuY3Rpb24oZm9ybSwgb3B0aW9ucyl7CiAgICBFeHQuZm9ybS5BY3Rpb24uTG9hZC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgZm9ybSwgb3B0aW9ucyk7CiAgICB0aGlzLnJlYWRlciA9IHRoaXMuZm9ybS5yZWFkZXI7Cn07CgpFeHQuZXh0ZW5kKEV4dC5mb3JtLkFjdGlvbi5Mb2FkLCBFeHQuZm9ybS5BY3Rpb24sIHsKICAgIHR5cGUgOiAnbG9hZCcsCgogICAgcnVuIDogZnVuY3Rpb24oKXsKICAgICAgICBFeHQuQWpheC5yZXF1ZXN0KEV4dC5hcHBseSgKICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlQ2FsbGJhY2soKSwgewogICAgICAgICAgICAgICAgICAgIG1ldGhvZDp0aGlzLmdldE1ldGhvZCgpLAogICAgICAgICAgICAgICAgICAgIHVybDp0aGlzLmdldFVybChmYWxzZSksCiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOnRoaXMuZ2V0UGFyYW1zKCkKICAgICAgICB9KSk7CiAgICB9LAoKICAgIHN1Y2Nlc3MgOiBmdW5jdGlvbihyZXNwb25zZSl7CiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMucHJvY2Vzc1Jlc3BvbnNlKHJlc3BvbnNlKTsKICAgICAgICBpZihyZXN1bHQgPT09IHRydWUgfHwgIXJlc3VsdC5zdWNjZXNzIHx8ICFyZXN1bHQuZGF0YSl7CiAgICAgICAgICAgIHRoaXMuZmFpbHVyZVR5cGUgPSBFeHQuZm9ybS5BY3Rpb24uTE9BRF9GQUlMVVJFOwogICAgICAgICAgICB0aGlzLmZvcm0uYWZ0ZXJBY3Rpb24odGhpcywgZmFsc2UpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMuZm9ybS5jbGVhckludmFsaWQoKTsKICAgICAgICB0aGlzLmZvcm0uc2V0VmFsdWVzKHJlc3VsdC5kYXRhKTsKICAgICAgICB0aGlzLmZvcm0uYWZ0ZXJBY3Rpb24odGhpcywgdHJ1ZSk7CiAgICB9LAoKICAgIGhhbmRsZVJlc3BvbnNlIDogZnVuY3Rpb24ocmVzcG9uc2UpewogICAgICAgIGlmKHRoaXMuZm9ybS5yZWFkZXIpewogICAgICAgICAgICB2YXIgcnMgPSB0aGlzLmZvcm0ucmVhZGVyLnJlYWQocmVzcG9uc2UpOwogICAgICAgICAgICB2YXIgZGF0YSA9IHJzLnJlY29yZHMgJiYgcnMucmVjb3Jkc1swXSA/IHJzLnJlY29yZHNbMF0uZGF0YSA6IG51bGw7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBzdWNjZXNzIDogcnMuc3VjY2VzcywKICAgICAgICAgICAgICAgIGRhdGEgOiBkYXRhCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiBFeHQuZGVjb2RlKHJlc3BvbnNlLnJlc3BvbnNlVGV4dCk7CiAgICB9Cn0pOwoKRXh0LmZvcm0uQWN0aW9uLkFDVElPTl9UWVBFUyA9IHsKICAgICdsb2FkJyA6IEV4dC5mb3JtLkFjdGlvbi5Mb2FkLAogICAgJ3N1Ym1pdCcgOiBFeHQuZm9ybS5BY3Rpb24uU3VibWl0Cn07CgoKRXh0LmZvcm0uTGF5b3V0ID0gZnVuY3Rpb24oY29uZmlnKXsKICAgIEV4dC5mb3JtLkxheW91dC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgY29uZmlnKTsKICAgIHRoaXMuc3RhY2sgPSBbXTsKfTsKCkV4dC5leHRlbmQoRXh0LmZvcm0uTGF5b3V0LCBFeHQuQ29tcG9uZW50LCB7CiAgICAKICAgIAogICAgCiAgICAKICAgIAogICAgY2xlYXIgOiB0cnVlLAogICAgCiAgICBsYWJlbFNlcGFyYXRvciA6ICc6JywKICAgIAogICAgaGlkZUxhYmVscyA6IGZhbHNlLAoKICAgICAgICBkZWZhdWx0QXV0b0NyZWF0ZSA6IHt0YWc6ICdkaXYnLCBjbHM6ICd4LWZvcm0tY3QnfSwKCiAgICAgICAgb25SZW5kZXIgOiBmdW5jdGlvbihjdCwgcG9zaXRpb24pewogICAgICAgIGlmKHRoaXMuZWwpeyAgICAgICAgICAgICB0aGlzLmVsID0gRXh0LmdldCh0aGlzLmVsKTsKICAgICAgICB9ZWxzZSB7ICAgICAgICAgICAgICB2YXIgY2ZnID0gdGhpcy5nZXRBdXRvQ3JlYXRlKCk7CiAgICAgICAgICAgIHRoaXMuZWwgPSBjdC5jcmVhdGVDaGlsZChjZmcsIHBvc2l0aW9uKTsKICAgICAgICB9CiAgICAgICAgaWYodGhpcy5zdHlsZSl7CiAgICAgICAgICAgIHRoaXMuZWwuYXBwbHlTdHlsZXModGhpcy5zdHlsZSk7CiAgICAgICAgfQogICAgICAgIGlmKHRoaXMubGFiZWxBbGlnbil7CiAgICAgICAgICAgIHRoaXMuZWwuYWRkQ2xhc3MoJ3gtZm9ybS1sYWJlbC0nK3RoaXMubGFiZWxBbGlnbik7CiAgICAgICAgfQogICAgICAgIGlmKHRoaXMuaGlkZUxhYmVscyl7CiAgICAgICAgICAgIHRoaXMubGFiZWxTdHlsZSA9ICJkaXNwbGF5Om5vbmUiOwogICAgICAgICAgICB0aGlzLmVsZW1lbnRTdHlsZSA9ICJwYWRkaW5nLWxlZnQ6MDsiOwogICAgICAgIH1lbHNlewogICAgICAgICAgICBpZih0eXBlb2YgdGhpcy5sYWJlbFdpZHRoID09ICdudW1iZXInKXsKICAgICAgICAgICAgICAgIHRoaXMubGFiZWxTdHlsZSA9ICJ3aWR0aDoiK3RoaXMubGFiZWxXaWR0aCsicHg7IjsKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudFN0eWxlID0gInBhZGRpbmctbGVmdDoiKygodGhpcy5sYWJlbFdpZHRoKyh0eXBlb2YgdGhpcy5sYWJlbFBhZCA9PSAnbnVtYmVyJyA/IHRoaXMubGFiZWxQYWQgOiA1KSkrJ3B4JykrIjsiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKHRoaXMubGFiZWxBbGlnbiA9PSAndG9wJyl7CiAgICAgICAgICAgICAgICB0aGlzLmxhYmVsU3R5bGUgPSAid2lkdGg6YXV0bzsiOwogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50U3R5bGUgPSAicGFkZGluZy1sZWZ0OjA7IjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YXIgc3RhY2sgPSB0aGlzLnN0YWNrOwogICAgICAgIHZhciBzbGVuID0gc3RhY2subGVuZ3RoOwogICAgICAgIGlmKHNsZW4gPiAwKXsKICAgICAgICAgICAgaWYoIXRoaXMuZmllbGRUcGwpewogICAgICAgICAgICAgICAgdmFyIHQgPSBuZXcgRXh0LlRlbXBsYXRlKAogICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJ4LWZvcm0taXRlbSB7NX0iPicsCiAgICAgICAgICAgICAgICAgICAgICAgICc8bGFiZWwgZm9yPSJ7MH0iIHN0eWxlPSJ7Mn0iPnsxfXs0fTwvbGFiZWw+JywKICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9IngtZm9ybS1lbGVtZW50IiBpZD0ieC1mb3JtLWVsLXswfSIgc3R5bGU9InszfSI+JywKICAgICAgICAgICAgICAgICAgICAgICAgJzwvZGl2PicsCiAgICAgICAgICAgICAgICAgICAgJzwvZGl2PjxkaXYgY2xhc3M9IngtZm9ybS1jbGVhci1sZWZ0Ij48L2Rpdj4nCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgdC5kaXNhYmxlRm9ybWF0cyA9IHRydWU7CiAgICAgICAgICAgICAgICB0LmNvbXBpbGUoKTsKICAgICAgICAgICAgICAgIEV4dC5mb3JtLkxheW91dC5wcm90b3R5cGUuZmllbGRUcGwgPSB0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBzbGVuOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmKHN0YWNrW2ldLmlzRm9ybUZpZWxkKXsKICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlckZpZWxkKHN0YWNrW2ldKTsKICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyQ29tcG9uZW50KHN0YWNrW2ldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZih0aGlzLmNsZWFyKXsKICAgICAgICAgICAgdGhpcy5lbC5jcmVhdGVDaGlsZCh7Y2xzOid4LWZvcm0tY2xlYXInfSk7CiAgICAgICAgfQogICAgfSwKCiAgICAgICAgcmVuZGVyRmllbGQgOiBmdW5jdGlvbihmKXsKICAgICAgIHRoaXMuZmllbGRUcGwuYXBwZW5kKHRoaXMuZWwsIFsKICAgICAgICAgICAgICAgZi5pZCwgZi5maWVsZExhYmVsLAogICAgICAgICAgICAgICBmLmxhYmVsU3R5bGV8fHRoaXMubGFiZWxTdHlsZXx8JycsCiAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudFN0eWxlfHwnJywKICAgICAgICAgICAgICAgdHlwZW9mIGYubGFiZWxTZXBhcmF0b3IgPT0gJ3VuZGVmaW5lZCcgPyB0aGlzLmxhYmVsU2VwYXJhdG9yIDogZi5sYWJlbFNlcGFyYXRvciwKICAgICAgICAgICAgICAgZi5pdGVtQ2xzfHx0aGlzLml0ZW1DbHN8fCcnCiAgICAgICBdKTsKICAgIH0sCgogICAgICAgIHJlbmRlckNvbXBvbmVudCA6IGZ1bmN0aW9uKGMpewogICAgICAgIGMucmVuZGVyKHRoaXMuZWwpOwogICAgfQp9KTsKCgpFeHQuZm9ybS5Db2x1bW4gPSBmdW5jdGlvbihjb25maWcpewogICAgRXh0LmZvcm0uQ29sdW1uLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBjb25maWcpOwp9OwoKRXh0LmV4dGVuZChFeHQuZm9ybS5Db2x1bW4sIEV4dC5mb3JtLkxheW91dCwgewogICAgCiAgICAKCiAgICAgICAgZGVmYXVsdEF1dG9DcmVhdGUgOiB7dGFnOiAnZGl2JywgY2xzOiAneC1mb3JtLWN0IHgtZm9ybS1jb2x1bW4nfSwKCiAgICAgICAgb25SZW5kZXIgOiBmdW5jdGlvbihjdCwgcG9zaXRpb24pewogICAgICAgIEV4dC5mb3JtLkNvbHVtbi5zdXBlcmNsYXNzLm9uUmVuZGVyLmNhbGwodGhpcywgY3QsIHBvc2l0aW9uKTsKICAgICAgICBpZih0aGlzLndpZHRoKXsKICAgICAgICAgICAgdGhpcy5lbC5zZXRXaWR0aCh0aGlzLndpZHRoKTsKICAgICAgICB9CiAgICB9Cn0pOwoKCkV4dC5mb3JtLkZpZWxkU2V0ID0gZnVuY3Rpb24oY29uZmlnKXsKICAgIEV4dC5mb3JtLkZpZWxkU2V0LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBjb25maWcpOwp9OwoKRXh0LmV4dGVuZChFeHQuZm9ybS5GaWVsZFNldCwgRXh0LmZvcm0uTGF5b3V0LCB7CiAgICAKICAgIAoKICAgICAgICBkZWZhdWx0QXV0b0NyZWF0ZSA6IHt0YWc6ICdmaWVsZHNldCcsIGNuOiB7dGFnOidsZWdlbmQnfX0sCgogICAgICAgIG9uUmVuZGVyIDogZnVuY3Rpb24oY3QsIHBvc2l0aW9uKXsKICAgICAgICBFeHQuZm9ybS5GaWVsZFNldC5zdXBlcmNsYXNzLm9uUmVuZGVyLmNhbGwodGhpcywgY3QsIHBvc2l0aW9uKTsKICAgICAgICBpZih0aGlzLmxlZ2VuZCl7CiAgICAgICAgICAgIHRoaXMuc2V0TGVnZW5kKHRoaXMubGVnZW5kKTsKICAgICAgICB9CiAgICB9LAoKICAgICAgICBzZXRMZWdlbmQgOiBmdW5jdGlvbih0ZXh0KXsKICAgICAgICBpZih0aGlzLnJlbmRlcmVkKXsKICAgICAgICAgICAgdGhpcy5lbC5jaGlsZCgnbGVnZW5kJykudXBkYXRlKHRleHQpOwogICAgICAgIH0KICAgIH0KfSk7CgpFeHQuZm9ybS5WVHlwZXMgPSBmdW5jdGlvbigpewogICAgICAgIHZhciBhbHBoYSA9IC9eW2EtekEtWl9dKyQvOwogICAgdmFyIGFscGhhbnVtID0gL15bYS16QS1aMC05X10rJC87CiAgICB2YXIgZW1haWwgPSAvXihbXHddKykoLltcd10rKSpAKFtcdy1dK1wuKXsxLDV9KFtBLVphLXpdKXsyLDR9JC87CiAgICB2YXIgdXJsID0gLygoKGh0dHBzPyl8KGZ0cCkpOlwvXC8oW1wtXHddK1wuKStcd3syLDN9KFwvWyVcLVx3XSsoXC5cd3syLH0pPykqKChbXHdcLVwuXD9cXFwvK0AmIztgfj0lIV0qKShcLlx3ezIsfSk/KSpcLz8pL2k7CgogICAgICAgIHJldHVybiB7CiAgICAgICAgCiAgICAgICAgJ2VtYWlsJyA6IGZ1bmN0aW9uKHYpewogICAgICAgICAgICByZXR1cm4gZW1haWwudGVzdCh2KTsKICAgICAgICB9LAogICAgICAgIAogICAgICAgICdlbWFpbFRleHQnIDogJ1RoaXMgZmllbGQgc2hvdWxkIGJlIGFuIGUtbWFpbCBhZGRyZXNzIGluIHRoZSBmb3JtYXQgInVzZXJAZG9tYWluLmNvbSInLAogICAgICAgIAogICAgICAgICdlbWFpbE1hc2snIDogL1thLXowLTlfXC5cLUBdL2ksCgogICAgICAgIAogICAgICAgICd1cmwnIDogZnVuY3Rpb24odil7CiAgICAgICAgICAgIHJldHVybiB1cmwudGVzdCh2KTsKICAgICAgICB9LAogICAgICAgIAogICAgICAgICd1cmxUZXh0JyA6ICdUaGlzIGZpZWxkIHNob3VsZCBiZSBhIFVSTCBpbiB0aGUgZm9ybWF0ICJodHRwOi8nKycvd3d3LmRvbWFpbi5jb20iJywKICAgICAgICAKICAgICAgICAKICAgICAgICAnYWxwaGEnIDogZnVuY3Rpb24odil7CiAgICAgICAgICAgIHJldHVybiBhbHBoYS50ZXN0KHYpOwogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgJ2FscGhhVGV4dCcgOiAnVGhpcyBmaWVsZCBzaG91bGQgb25seSBjb250YWluIGxldHRlcnMgYW5kIF8nLAogICAgICAgIAogICAgICAgICdhbHBoYU1hc2snIDogL1thLXpfXS9pLAoKICAgICAgICAKICAgICAgICAnYWxwaGFudW0nIDogZnVuY3Rpb24odil7CiAgICAgICAgICAgIHJldHVybiBhbHBoYW51bS50ZXN0KHYpOwogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgJ2FscGhhbnVtVGV4dCcgOiAnVGhpcyBmaWVsZCBzaG91bGQgb25seSBjb250YWluIGxldHRlcnMsIG51bWJlcnMgYW5kIF8nLAogICAgICAgIAogICAgICAgICdhbHBoYW51bU1hc2snIDogL1thLXowLTlfXS9pCiAgICB9Owp9KCk7Cg0KRXh0LkxheW91dE1hbmFnZXIgPSBmdW5jdGlvbihjb250YWluZXIsIGNvbmZpZyl7DQogICAgRXh0LkxheW91dE1hbmFnZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpOw0KICAgIHRoaXMuZWwgPSBFeHQuZ2V0KGNvbnRhaW5lcik7DQogICAgCiAgICBpZih0aGlzLmVsLmRvbSA9PSBkb2N1bWVudC5ib2R5ICYmIEV4dC5pc0lFICYmICFjb25maWcuYWxsb3dTY3JvbGwpew0KICAgICAgICBkb2N1bWVudC5ib2R5LnNjcm9sbCA9ICJubyI7DQogICAgfWVsc2UgaWYodGhpcy5lbC5kb20gIT0gZG9jdW1lbnQuYm9keSAmJiB0aGlzLmVsLmdldFN0eWxlKCdwb3NpdGlvbicpID09ICdzdGF0aWMnKXsNCiAgICAgICAgdGhpcy5lbC5wb3NpdGlvbigncmVsYXRpdmUnKTsNCiAgICB9DQogICAgdGhpcy5pZCA9IHRoaXMuZWwuaWQ7DQogICAgdGhpcy5lbC5hZGRDbGFzcygieC1sYXlvdXQtY29udGFpbmVyIik7DQogICAgDQogICAgdGhpcy5tb25pdG9yV2luZG93UmVzaXplID0gdHJ1ZTsNCiAgICB0aGlzLnJlZ2lvbnMgPSB7fTsNCiAgICB0aGlzLmFkZEV2ZW50cyh7DQogICAgICAgIA0KICAgICAgICAibGF5b3V0IiA6IHRydWUsDQogICAgICAgIA0KICAgICAgICAicmVnaW9ucmVzaXplZCIgOiB0cnVlLA0KICAgICAgICANCiAgICAgICAgInJlZ2lvbmNvbGxhcHNlZCIgOiB0cnVlLA0KICAgICAgICANCiAgICAgICAgInJlZ2lvbmV4cGFuZGVkIiA6IHRydWUNCiAgICB9KTsNCiAgICB0aGlzLnVwZGF0aW5nID0gZmFsc2U7DQogICAgRXh0LkV2ZW50TWFuYWdlci5vbldpbmRvd1Jlc2l6ZSh0aGlzLm9uV2luZG93UmVzaXplLCB0aGlzLCB0cnVlKTsNCn07DQoNCkV4dC5leHRlbmQoRXh0LkxheW91dE1hbmFnZXIsIEV4dC51dGlsLk9ic2VydmFibGUsIHsNCiAgICANCiAgICBpc1VwZGF0aW5nIDogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRpbmc7IA0KICAgIH0sDQogICAgDQogICAgDQogICAgYmVnaW5VcGRhdGUgOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLnVwZGF0aW5nID0gdHJ1ZTsgICAgDQogICAgfSwNCiAgICANCiAgICANCiAgICBlbmRVcGRhdGUgOiBmdW5jdGlvbihub0xheW91dCl7DQogICAgICAgIHRoaXMudXBkYXRpbmcgPSBmYWxzZTsNCiAgICAgICAgaWYoIW5vTGF5b3V0KXsNCiAgICAgICAgICAgIHRoaXMubGF5b3V0KCk7DQogICAgICAgIH0gICAgDQogICAgfSwNCiAgICANCiAgICBsYXlvdXQ6IGZ1bmN0aW9uKCl7DQogICAgICAgIA0KICAgIH0sDQogICAgDQogICAgb25SZWdpb25SZXNpemVkIDogZnVuY3Rpb24ocmVnaW9uLCBuZXdTaXplKXsNCiAgICAgICAgdGhpcy5maXJlRXZlbnQoInJlZ2lvbnJlc2l6ZWQiLCByZWdpb24sIG5ld1NpemUpOw0KICAgICAgICB0aGlzLmxheW91dCgpOw0KICAgIH0sDQogICAgDQogICAgb25SZWdpb25Db2xsYXBzZWQgOiBmdW5jdGlvbihyZWdpb24pew0KICAgICAgICB0aGlzLmZpcmVFdmVudCgicmVnaW9uY29sbGFwc2VkIiwgcmVnaW9uKTsNCiAgICB9LA0KICAgIA0KICAgIG9uUmVnaW9uRXhwYW5kZWQgOiBmdW5jdGlvbihyZWdpb24pew0KICAgICAgICB0aGlzLmZpcmVFdmVudCgicmVnaW9uZXhwYW5kZWQiLCByZWdpb24pOw0KICAgIH0sDQogICAgICAgIA0KICAgIA0KICAgIGdldFZpZXdTaXplIDogZnVuY3Rpb24oKXsNCiAgICAgICAgdmFyIHNpemU7DQogICAgICAgIGlmKHRoaXMuZWwuZG9tICE9IGRvY3VtZW50LmJvZHkpew0KICAgICAgICAgICAgc2l6ZSA9IHRoaXMuZWwuZ2V0U2l6ZSgpOw0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIHNpemUgPSB7d2lkdGg6IEV4dC5saWIuRG9tLmdldFZpZXdXaWR0aCgpLCBoZWlnaHQ6IEV4dC5saWIuRG9tLmdldFZpZXdIZWlnaHQoKX07DQogICAgICAgIH0NCiAgICAgICAgc2l6ZS53aWR0aCAtPSB0aGlzLmVsLmdldEJvcmRlcldpZHRoKCJsciIpLXRoaXMuZWwuZ2V0UGFkZGluZygibHIiKTsNCiAgICAgICAgc2l6ZS5oZWlnaHQgLT0gdGhpcy5lbC5nZXRCb3JkZXJXaWR0aCgidGIiKS10aGlzLmVsLmdldFBhZGRpbmcoInRiIik7DQogICAgICAgIHJldHVybiBzaXplOw0KICAgIH0sDQogICAgDQogICAgDQogICAgZ2V0RWwgOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gdGhpcy5lbDsNCiAgICB9LA0KICAgIA0KICAgIA0KICAgIGdldFJlZ2lvbiA6IGZ1bmN0aW9uKHRhcmdldCl7DQogICAgICAgIHJldHVybiB0aGlzLnJlZ2lvbnNbdGFyZ2V0LnRvTG93ZXJDYXNlKCldOw0KICAgIH0sDQogICAgDQogICAgb25XaW5kb3dSZXNpemUgOiBmdW5jdGlvbigpew0KICAgICAgICBpZih0aGlzLm1vbml0b3JXaW5kb3dSZXNpemUpew0KICAgICAgICAgICAgdGhpcy5sYXlvdXQoKTsNCiAgICAgICAgfQ0KICAgIH0NCn0pOwoNCkV4dC5Cb3JkZXJMYXlvdXQgPSBmdW5jdGlvbihjb250YWluZXIsIGNvbmZpZyl7DQogICAgY29uZmlnID0gY29uZmlnIHx8IHt9Ow0KICAgIEV4dC5Cb3JkZXJMYXlvdXQuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIGNvbnRhaW5lciwgY29uZmlnKTsNCiAgICB0aGlzLmZhY3RvcnkgPSBjb25maWcuZmFjdG9yeSB8fCBFeHQuQm9yZGVyTGF5b3V0LlJlZ2lvbkZhY3Rvcnk7DQogICAgZm9yKHZhciBpID0gMCwgbGVuID0gdGhpcy5mYWN0b3J5LnZhbGlkUmVnaW9ucy5sZW5ndGg7IGkgPCBsZW47IGkrKykgew0KICAgIAl2YXIgdGFyZ2V0ID0gdGhpcy5mYWN0b3J5LnZhbGlkUmVnaW9uc1tpXTsNCiAgICAJaWYoY29uZmlnW3RhcmdldF0pew0KICAgIAkgICAgdGhpcy5hZGRSZWdpb24odGFyZ2V0LCBjb25maWdbdGFyZ2V0XSk7DQogICAgCX0NCiAgICB9DQp9Ow0KDQpFeHQuZXh0ZW5kKEV4dC5Cb3JkZXJMYXlvdXQsIEV4dC5MYXlvdXRNYW5hZ2VyLCB7DQogICAgDQogICAgYWRkUmVnaW9uIDogZnVuY3Rpb24odGFyZ2V0LCBjb25maWcpew0KICAgICAgICBpZighdGhpcy5yZWdpb25zW3RhcmdldF0pew0KICAgICAgICAgICAgdmFyIHIgPSB0aGlzLmZhY3RvcnkuY3JlYXRlKHRhcmdldCwgdGhpcywgY29uZmlnKTsNCiAgICAJICAgIHRoaXMuYmluZFJlZ2lvbih0YXJnZXQsIHIpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0aGlzLnJlZ2lvbnNbdGFyZ2V0XTsNCiAgICB9LA0KDQogICAgCiAgICBiaW5kUmVnaW9uIDogZnVuY3Rpb24obmFtZSwgcil7DQogICAgICAgIHRoaXMucmVnaW9uc1tuYW1lXSA9IHI7DQogICAgICAgIHIub24oInZpc2liaWxpdHljaGFuZ2UiLCB0aGlzLmxheW91dCwgdGhpcyk7DQogICAgICAgIHIub24oInBhbmVsYWRkZWQiLCB0aGlzLmxheW91dCwgdGhpcyk7DQogICAgICAgIHIub24oInBhbmVscmVtb3ZlZCIsIHRoaXMubGF5b3V0LCB0aGlzKTsNCiAgICAgICAgci5vbigiaW52YWxpZGF0ZWQiLCB0aGlzLmxheW91dCwgdGhpcyk7DQogICAgICAgIHIub24oInJlc2l6ZWQiLCB0aGlzLm9uUmVnaW9uUmVzaXplZCwgdGhpcyk7DQogICAgICAgIHIub24oImNvbGxhcHNlZCIsIHRoaXMub25SZWdpb25Db2xsYXBzZWQsIHRoaXMpOw0KICAgICAgICByLm9uKCJleHBhbmRlZCIsIHRoaXMub25SZWdpb25FeHBhbmRlZCwgdGhpcyk7DQogICAgfSwNCg0KICAgIA0KICAgIGxheW91dCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIGlmKHRoaXMudXBkYXRpbmcpIHJldHVybjsNCiAgICAgICAgdmFyIHNpemUgPSB0aGlzLmdldFZpZXdTaXplKCk7DQogICAgICAgIHZhciB3ID0gc2l6ZS53aWR0aCwgaCA9IHNpemUuaGVpZ2h0Ow0KICAgICAgICB2YXIgY2VudGVyVyA9IHcsIGNlbnRlckggPSBoLCBjZW50ZXJZID0gMCwgY2VudGVyWCA9IDA7DQogICAgICAgIAoNCiAgICAgICAgdmFyIHJzID0gdGhpcy5yZWdpb25zOw0KICAgICAgICB2YXIgbiA9IHJzWyJub3J0aCJdLCBzID0gcnNbInNvdXRoIl0sIHdlc3QgPSByc1sid2VzdCJdLCBlID0gcnNbImVhc3QiXSwgYyA9IHJzWyJjZW50ZXIiXTsNCiAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIGlmKG4gJiYgbi5pc1Zpc2libGUoKSl7DQogICAgICAgICAgICB2YXIgYiA9IG4uZ2V0Qm94KCk7DQogICAgICAgICAgICB2YXIgbSA9IG4uZ2V0TWFyZ2lucygpOw0KICAgICAgICAgICAgYi53aWR0aCA9IHcgLSAobS5sZWZ0K20ucmlnaHQpOw0KICAgICAgICAgICAgYi54ID0gbS5sZWZ0Ow0KICAgICAgICAgICAgYi55ID0gbS50b3A7DQogICAgICAgICAgICBjZW50ZXJZID0gYi5oZWlnaHQgKyBiLnkgKyBtLmJvdHRvbTsNCiAgICAgICAgICAgIGNlbnRlckggLT0gY2VudGVyWTsNCiAgICAgICAgICAgIG4udXBkYXRlQm94KHRoaXMuc2FmZUJveChiKSk7DQogICAgICAgIH0NCiAgICAgICAgaWYocyAmJiBzLmlzVmlzaWJsZSgpKXsNCiAgICAgICAgICAgIHZhciBiID0gcy5nZXRCb3goKTsNCiAgICAgICAgICAgIHZhciBtID0gcy5nZXRNYXJnaW5zKCk7DQogICAgICAgICAgICBiLndpZHRoID0gdyAtIChtLmxlZnQrbS5yaWdodCk7DQogICAgICAgICAgICBiLnggPSBtLmxlZnQ7DQogICAgICAgICAgICB2YXIgdG90YWxIZWlnaHQgPSAoYi5oZWlnaHQgKyBtLnRvcCArIG0uYm90dG9tKTsNCiAgICAgICAgICAgIGIueSA9IGggLSB0b3RhbEhlaWdodCArIG0udG9wOw0KICAgICAgICAgICAgY2VudGVySCAtPSB0b3RhbEhlaWdodDsNCiAgICAgICAgICAgIHMudXBkYXRlQm94KHRoaXMuc2FmZUJveChiKSk7DQogICAgICAgIH0NCiAgICAgICAgaWYod2VzdCAmJiB3ZXN0LmlzVmlzaWJsZSgpKXsNCiAgICAgICAgICAgIHZhciBiID0gd2VzdC5nZXRCb3goKTsNCiAgICAgICAgICAgIHZhciBtID0gd2VzdC5nZXRNYXJnaW5zKCk7DQogICAgICAgICAgICBiLmhlaWdodCA9IGNlbnRlckggLSAobS50b3ArbS5ib3R0b20pOw0KICAgICAgICAgICAgYi54ID0gbS5sZWZ0Ow0KICAgICAgICAgICAgYi55ID0gY2VudGVyWSArIG0udG9wOw0KICAgICAgICAgICAgdmFyIHRvdGFsV2lkdGggPSAoYi53aWR0aCArIG0ubGVmdCArIG0ucmlnaHQpOw0KICAgICAgICAgICAgY2VudGVyWCArPSB0b3RhbFdpZHRoOw0KICAgICAgICAgICAgY2VudGVyVyAtPSB0b3RhbFdpZHRoOw0KICAgICAgICAgICAgd2VzdC51cGRhdGVCb3godGhpcy5zYWZlQm94KGIpKTsNCiAgICAgICAgfQ0KICAgICAgICBpZihlICYmIGUuaXNWaXNpYmxlKCkpew0KICAgICAgICAgICAgdmFyIGIgPSBlLmdldEJveCgpOw0KICAgICAgICAgICAgdmFyIG0gPSBlLmdldE1hcmdpbnMoKTsNCiAgICAgICAgICAgIGIuaGVpZ2h0ID0gY2VudGVySCAtIChtLnRvcCttLmJvdHRvbSk7DQogICAgICAgICAgICB2YXIgdG90YWxXaWR0aCA9IChiLndpZHRoICsgbS5sZWZ0ICsgbS5yaWdodCk7DQogICAgICAgICAgICBiLnggPSB3IC0gdG90YWxXaWR0aCArIG0ubGVmdDsNCiAgICAgICAgICAgIGIueSA9IGNlbnRlclkgKyBtLnRvcDsNCiAgICAgICAgICAgIGNlbnRlclcgLT0gdG90YWxXaWR0aDsNCiAgICAgICAgICAgIGUudXBkYXRlQm94KHRoaXMuc2FmZUJveChiKSk7DQogICAgICAgIH0NCiAgICAgICAgaWYoYyl7DQogICAgICAgICAgICB2YXIgbSA9IGMuZ2V0TWFyZ2lucygpOw0KICAgICAgICAgICAgdmFyIGNlbnRlckJveCA9IHsNCiAgICAgICAgICAgICAgICB4OiBjZW50ZXJYICsgbS5sZWZ0LA0KICAgICAgICAgICAgICAgIHk6IGNlbnRlclkgKyBtLnRvcCwNCiAgICAgICAgICAgICAgICB3aWR0aDogY2VudGVyVyAtIChtLmxlZnQrbS5yaWdodCksDQogICAgICAgICAgICAgICAgaGVpZ2h0OiBjZW50ZXJIIC0gKG0udG9wK20uYm90dG9tKQ0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICBjLnVwZGF0ZUJveCh0aGlzLnNhZmVCb3goY2VudGVyQm94KSk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5lbC5yZXBhaW50KCk7DQogICAgICAgIHRoaXMuZmlyZUV2ZW50KCJsYXlvdXQiLCB0aGlzKTsNCiAgICB9LA0KDQogICAgCiAgICBzYWZlQm94IDogZnVuY3Rpb24oYm94KXsNCiAgICAgICAgYm94LndpZHRoID0gTWF0aC5tYXgoMCwgYm94LndpZHRoKTsNCiAgICAgICAgYm94LmhlaWdodCA9IE1hdGgubWF4KDAsIGJveC5oZWlnaHQpOw0KICAgICAgICByZXR1cm4gYm94Ow0KICAgIH0sDQoNCiAgICANCiAgICBhZGQgOiBmdW5jdGlvbih0YXJnZXQsIHBhbmVsKXsNCiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnRvTG93ZXJDYXNlKCk7DQogICAgICAgIHJldHVybiB0aGlzLnJlZ2lvbnNbdGFyZ2V0XS5hZGQocGFuZWwpOw0KICAgIH0sDQoNCiAgICANCiAgICByZW1vdmUgOiBmdW5jdGlvbih0YXJnZXQsIHBhbmVsKXsNCiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnRvTG93ZXJDYXNlKCk7DQogICAgICAgIHJldHVybiB0aGlzLnJlZ2lvbnNbdGFyZ2V0XS5yZW1vdmUocGFuZWwpOw0KICAgIH0sDQoNCiAgICANCiAgICBmaW5kUGFuZWwgOiBmdW5jdGlvbihwYW5lbElkKXsNCiAgICAgICAgdmFyIHJzID0gdGhpcy5yZWdpb25zOw0KICAgICAgICBmb3IodmFyIHRhcmdldCBpbiBycyl7DQogICAgICAgICAgICBpZih0eXBlb2YgcnNbdGFyZ2V0XSAhPSAiZnVuY3Rpb24iKXsNCiAgICAgICAgICAgICAgICB2YXIgcCA9IHJzW3RhcmdldF0uZ2V0UGFuZWwocGFuZWxJZCk7DQogICAgICAgICAgICAgICAgaWYocCl7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBwOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICB9LA0KDQogICAgDQogICAgc2hvd1BhbmVsIDogZnVuY3Rpb24ocGFuZWxJZCkgew0KICAgICAgdmFyIHJzID0gdGhpcy5yZWdpb25zOw0KICAgICAgZm9yKHZhciB0YXJnZXQgaW4gcnMpew0KICAgICAgICAgdmFyIHIgPSByc1t0YXJnZXRdOw0KICAgICAgICAgaWYodHlwZW9mIHIgIT0gImZ1bmN0aW9uIil7DQogICAgICAgICAgICBpZihyLmhhc1BhbmVsKHBhbmVsSWQpKXsNCiAgICAgICAgICAgICAgIHJldHVybiByLnNob3dQYW5lbChwYW5lbElkKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgIH0NCiAgICAgIH0NCiAgICAgIHJldHVybiBudWxsOw0KICAgfSwNCg0KICAgDQogICAgcmVzdG9yZVN0YXRlIDogZnVuY3Rpb24ocHJvdmlkZXIpew0KICAgICAgICBpZighcHJvdmlkZXIpew0KICAgICAgICAgICAgcHJvdmlkZXIgPSBFeHQuc3RhdGUuTWFuYWdlcjsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgc20gPSBuZXcgRXh0LkxheW91dFN0YXRlTWFuYWdlcigpOw0KICAgICAgICBzbS5pbml0KHRoaXMsIHByb3ZpZGVyKTsNCiAgICB9LA0KDQogICAgDQogICAgYmF0Y2hBZGQgOiBmdW5jdGlvbihyZWdpb25zKXsNCiAgICAgICAgdGhpcy5iZWdpblVwZGF0ZSgpOw0KICAgICAgICBmb3IodmFyIHJuYW1lIGluIHJlZ2lvbnMpew0KICAgICAgICAgICAgdmFyIGxyID0gdGhpcy5yZWdpb25zW3JuYW1lXTsNCiAgICAgICAgICAgIGlmKGxyKXsNCiAgICAgICAgICAgICAgICB0aGlzLmFkZFR5cGVkUGFuZWxzKGxyLCByZWdpb25zW3JuYW1lXSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5lbmRVcGRhdGUoKTsNCiAgICB9LA0KDQogICAgCiAgICBhZGRUeXBlZFBhbmVscyA6IGZ1bmN0aW9uKGxyLCBwcyl7DQogICAgICAgIGlmKHR5cGVvZiBwcyA9PSAnc3RyaW5nJyl7DQogICAgICAgICAgICBsci5hZGQobmV3IEV4dC5Db250ZW50UGFuZWwocHMpKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmKHBzIGluc3RhbmNlb2YgQXJyYXkpew0KICAgICAgICAgICAgZm9yKHZhciBpID0wLCBsZW4gPSBwcy5sZW5ndGg7IGkgPCBsZW47IGkrKyl7DQogICAgICAgICAgICAgICAgdGhpcy5hZGRUeXBlZFBhbmVscyhsciwgcHNbaV0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2UgaWYoIXBzLmV2ZW50cyl7IAogICAgICAgICAgICB2YXIgZWwgPSBwcy5lbDsNCiAgICAgICAgICAgIGRlbGV0ZSBwcy5lbDsgCiAgICAgICAgICAgIGxyLmFkZChuZXcgRXh0LkNvbnRlbnRQYW5lbChlbCB8fCBFeHQuaWQoKSwgcHMpKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsgIAogICAgICAgICAgICBsci5hZGQocHMpOw0KICAgICAgICB9DQogICAgfQ0KfSk7DQoNCg0KRXh0LkJvcmRlckxheW91dC5jcmVhdGUgPSBmdW5jdGlvbihjb25maWcsIHRhcmdldEVsKXsNCiAgICB2YXIgbGF5b3V0ID0gbmV3IEV4dC5Cb3JkZXJMYXlvdXQodGFyZ2V0RWwgfHwgZG9jdW1lbnQuYm9keSwgY29uZmlnKTsNCiAgICBsYXlvdXQuYmVnaW5VcGRhdGUoKTsNCiAgICB2YXIgcmVnaW9ucyA9IEV4dC5Cb3JkZXJMYXlvdXQuUmVnaW9uRmFjdG9yeS52YWxpZFJlZ2lvbnM7DQogICAgZm9yKHZhciBqID0gMCwgamxlbiA9IHJlZ2lvbnMubGVuZ3RoOyBqIDwgamxlbjsgaisrKXsNCiAgICAgICAgdmFyIGxyID0gcmVnaW9uc1tqXTsNCiAgICAgICAgaWYobGF5b3V0LnJlZ2lvbnNbbHJdICYmIGNvbmZpZ1tscl0ucGFuZWxzKXsNCiAgICAgICAgICAgIHZhciByID0gbGF5b3V0LnJlZ2lvbnNbbHJdOw0KICAgICAgICAgICAgdmFyIHBzID0gY29uZmlnW2xyXS5wYW5lbHM7DQogICAgICAgICAgICBsYXlvdXQuYWRkVHlwZWRQYW5lbHMociwgcHMpOw0KICAgICAgICB9DQogICAgfQ0KICAgIGxheW91dC5lbmRVcGRhdGUoKTsNCiAgICByZXR1cm4gbGF5b3V0Ow0KfTsNCg0KCkV4dC5Cb3JkZXJMYXlvdXQuUmVnaW9uRmFjdG9yeSA9IHsNCiAgICAKICAgIHZhbGlkUmVnaW9ucyA6IFsibm9ydGgiLCJzb3V0aCIsImVhc3QiLCJ3ZXN0IiwiY2VudGVyIl0sDQoNCiAgICAKICAgIGNyZWF0ZSA6IGZ1bmN0aW9uKHRhcmdldCwgbWdyLCBjb25maWcpew0KICAgICAgICB0YXJnZXQgPSB0YXJnZXQudG9Mb3dlckNhc2UoKTsNCiAgICAgICAgaWYoY29uZmlnLmxpZ2h0d2VpZ2h0IHx8IGNvbmZpZy5iYXNpYyl7DQogICAgICAgICAgICByZXR1cm4gbmV3IEV4dC5CYXNpY0xheW91dFJlZ2lvbihtZ3IsIGNvbmZpZywgdGFyZ2V0KTsNCiAgICAgICAgfQ0KICAgICAgICBzd2l0Y2godGFyZ2V0KXsNCiAgICAgICAgICAgIGNhc2UgIm5vcnRoIjoNCiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4dC5Ob3J0aExheW91dFJlZ2lvbihtZ3IsIGNvbmZpZyk7DQogICAgICAgICAgICBjYXNlICJzb3V0aCI6DQogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHQuU291dGhMYXlvdXRSZWdpb24obWdyLCBjb25maWcpOw0KICAgICAgICAgICAgY2FzZSAiZWFzdCI6DQogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHQuRWFzdExheW91dFJlZ2lvbihtZ3IsIGNvbmZpZyk7DQogICAgICAgICAgICBjYXNlICJ3ZXN0IjoNCiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4dC5XZXN0TGF5b3V0UmVnaW9uKG1nciwgY29uZmlnKTsNCiAgICAgICAgICAgIGNhc2UgImNlbnRlciI6DQogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHQuQ2VudGVyTGF5b3V0UmVnaW9uKG1nciwgY29uZmlnKTsNCiAgICAgICAgfQ0KICAgICAgICB0aHJvdyAnTGF5b3V0IHJlZ2lvbiAiJyt0YXJnZXQrJyIgbm90IHN1cHBvcnRlZC4nOw0KICAgIH0NCn07Cg0KRXh0LkJhc2ljTGF5b3V0UmVnaW9uID0gZnVuY3Rpb24obWdyLCBjb25maWcsIHBvcywgc2tpcENvbmZpZyl7DQogICAgdGhpcy5tZ3IgPSBtZ3I7DQogICAgdGhpcy5wb3NpdGlvbiAgPSBwb3M7DQogICAgdGhpcy5ldmVudHMgPSB7DQogICAgICAgIA0KICAgICAgICAiYmVmb3JlcmVtb3ZlIiA6IHRydWUsDQogICAgICAgIA0KICAgICAgICAiaW52YWxpZGF0ZWQiIDogdHJ1ZSwNCiAgICAgICAgDQogICAgICAgICJ2aXNpYmlsaXR5Y2hhbmdlIiA6IHRydWUsDQogICAgICAgIA0KICAgICAgICAicGFuZWxhZGRlZCIgOiB0cnVlLA0KICAgICAgICANCiAgICAgICAgInBhbmVscmVtb3ZlZCIgOiB0cnVlLA0KICAgICAgICANCiAgICAgICAgImNvbGxhcHNlZCIgOiB0cnVlLA0KICAgICAgICANCiAgICAgICAgImV4cGFuZGVkIiA6IHRydWUsDQogICAgICAgIA0KICAgICAgICAic2xpZGVzaG93IiA6IHRydWUsDQogICAgICAgIA0KICAgICAgICAic2xpZGVoaWRlIiA6IHRydWUsDQogICAgICAgIA0KICAgICAgICAicGFuZWxhY3RpdmF0ZWQiIDogdHJ1ZSwNCiAgICAgICAgDQogICAgICAgICJyZXNpemVkIiA6IHRydWUNCiAgICB9Ow0KICAgIA0KICAgIHRoaXMucGFuZWxzID0gbmV3IEV4dC51dGlsLk1peGVkQ29sbGVjdGlvbigpOw0KICAgIHRoaXMucGFuZWxzLmdldEtleSA9IHRoaXMuZ2V0UGFuZWxJZC5jcmVhdGVEZWxlZ2F0ZSh0aGlzKTsNCiAgICB0aGlzLmJveCA9IG51bGw7DQogICAgdGhpcy5hY3RpdmVQYW5lbCA9IG51bGw7DQogICAgaWYoc2tpcENvbmZpZyAhPT0gdHJ1ZSl7DQogICAgICAgIHRoaXMuYXBwbHlDb25maWcoY29uZmlnKTsNCiAgICB9DQp9Ow0KDQpFeHQuZXh0ZW5kKEV4dC5CYXNpY0xheW91dFJlZ2lvbiwgRXh0LnV0aWwuT2JzZXJ2YWJsZSwgew0KICAgIGdldFBhbmVsSWQgOiBmdW5jdGlvbihwKXsNCiAgICAgICAgcmV0dXJuIHAuZ2V0SWQoKTsNCiAgICB9LA0KICAgIA0KICAgIGFwcGx5Q29uZmlnIDogZnVuY3Rpb24oY29uZmlnKXsNCiAgICAgICAgdGhpcy5tYXJnaW5zID0gY29uZmlnLm1hcmdpbnMgfHwgdGhpcy5tYXJnaW5zIHx8IHt0b3A6IDAsIGxlZnQ6IDAsIHJpZ2h0OjAsIGJvdHRvbTogMH07DQogICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnOw0KICAgIH0sDQogICAgDQogICAgDQogICAgcmVzaXplVG8gOiBmdW5jdGlvbihuZXdTaXplKXsNCiAgICAgICAgdmFyIGVsID0gdGhpcy5lbCA/IHRoaXMuZWwgOg0KICAgICAgICAgICAgICAgICAodGhpcy5hY3RpdmVQYW5lbCA/IHRoaXMuYWN0aXZlUGFuZWwuZ2V0RWwoKSA6IG51bGwpOw0KICAgICAgICBpZihlbCl7DQogICAgICAgICAgICBzd2l0Y2godGhpcy5wb3NpdGlvbil7DQogICAgICAgICAgICAgICAgY2FzZSAiZWFzdCI6DQogICAgICAgICAgICAgICAgY2FzZSAid2VzdCI6DQogICAgICAgICAgICAgICAgICAgIGVsLnNldFdpZHRoKG5ld1NpemUpOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgicmVzaXplZCIsIHRoaXMsIG5ld1NpemUpOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgIm5vcnRoIjoNCiAgICAgICAgICAgICAgICBjYXNlICJzb3V0aCI6DQogICAgICAgICAgICAgICAgICAgIGVsLnNldEhlaWdodChuZXdTaXplKTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoInJlc2l6ZWQiLCB0aGlzLCBuZXdTaXplKTsNCiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgDQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9LA0KICAgIA0KICAgIGdldEJveCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZVBhbmVsID8gdGhpcy5hY3RpdmVQYW5lbC5nZXRFbCgpLmdldEJveChmYWxzZSwgdHJ1ZSkgOiBudWxsOw0KICAgIH0sDQogICAgDQogICAgZ2V0TWFyZ2lucyA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLm1hcmdpbnM7DQogICAgfSwNCiAgICANCiAgICB1cGRhdGVCb3ggOiBmdW5jdGlvbihib3gpew0KICAgICAgICB0aGlzLmJveCA9IGJveDsNCiAgICAgICAgdmFyIGVsID0gdGhpcy5hY3RpdmVQYW5lbC5nZXRFbCgpOw0KICAgICAgICBlbC5kb20uc3R5bGUubGVmdCA9IGJveC54ICsgInB4IjsNCiAgICAgICAgZWwuZG9tLnN0eWxlLnRvcCA9IGJveC55ICsgInB4IjsNCiAgICAgICAgdGhpcy5hY3RpdmVQYW5lbC5zZXRTaXplKGJveC53aWR0aCwgYm94LmhlaWdodCk7DQogICAgfSwNCiAgICANCiAgICANCiAgICBnZXRFbCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZVBhbmVsOw0KICAgIH0sDQogICAgDQogICAgDQogICAgaXNWaXNpYmxlIDogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlUGFuZWwgPyB0cnVlIDogZmFsc2U7DQogICAgfSwNCiAgICANCiAgICBzZXRBY3RpdmVQYW5lbCA6IGZ1bmN0aW9uKHBhbmVsKXsNCiAgICAgICAgcGFuZWwgPSB0aGlzLmdldFBhbmVsKHBhbmVsKTsNCiAgICAgICAgaWYodGhpcy5hY3RpdmVQYW5lbCAmJiB0aGlzLmFjdGl2ZVBhbmVsICE9IHBhbmVsKXsNCiAgICAgICAgICAgIHRoaXMuYWN0aXZlUGFuZWwuc2V0QWN0aXZlU3RhdGUoZmFsc2UpOw0KICAgICAgICAgICAgdGhpcy5hY3RpdmVQYW5lbC5nZXRFbCgpLnNldExlZnRUb3AoLTEwMDAwLC0xMDAwMCk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5hY3RpdmVQYW5lbCA9IHBhbmVsOw0KICAgICAgICBwYW5lbC5zZXRBY3RpdmVTdGF0ZSh0cnVlKTsNCiAgICAgICAgaWYodGhpcy5ib3gpew0KICAgICAgICAgICAgcGFuZWwuc2V0U2l6ZSh0aGlzLmJveC53aWR0aCwgdGhpcy5ib3guaGVpZ2h0KTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmZpcmVFdmVudCgicGFuZWxhY3RpdmF0ZWQiLCB0aGlzLCBwYW5lbCk7DQogICAgICAgIHRoaXMuZmlyZUV2ZW50KCJpbnZhbGlkYXRlZCIpOw0KICAgIH0sDQogICAgDQogICAgDQogICAgc2hvd1BhbmVsIDogZnVuY3Rpb24ocGFuZWwpew0KICAgICAgICBpZihwYW5lbCA9IHRoaXMuZ2V0UGFuZWwocGFuZWwpKXsNCiAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlUGFuZWwocGFuZWwpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBwYW5lbDsNCiAgICB9LA0KICAgIA0KICAgIA0KICAgIGdldEFjdGl2ZVBhbmVsIDogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlUGFuZWw7DQogICAgfSwNCiAgICANCiAgICANCiAgICBhZGQgOiBmdW5jdGlvbihwYW5lbCl7DQogICAgICAgIGlmKGFyZ3VtZW50cy5sZW5ndGggPiAxKXsNCiAgICAgICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykgew0KICAgICAgICAgICAgCXRoaXMuYWRkKGFyZ3VtZW50c1tpXSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgfQ0KICAgICAgICBpZih0aGlzLmhhc1BhbmVsKHBhbmVsKSl7DQogICAgICAgICAgICB0aGlzLnNob3dQYW5lbChwYW5lbCk7DQogICAgICAgICAgICByZXR1cm4gcGFuZWw7DQogICAgICAgIH0NCiAgICAgICAgdmFyIGVsID0gcGFuZWwuZ2V0RWwoKTsNCiAgICAgICAgaWYoZWwuZG9tLnBhcmVudE5vZGUgIT0gdGhpcy5tZ3IuZWwuZG9tKXsNCiAgICAgICAgICAgIHRoaXMubWdyLmVsLmRvbS5hcHBlbmRDaGlsZChlbC5kb20pOw0KICAgICAgICB9DQogICAgICAgIGlmKHBhbmVsLnNldFJlZ2lvbil7DQogICAgICAgICAgICBwYW5lbC5zZXRSZWdpb24odGhpcyk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5wYW5lbHMuYWRkKHBhbmVsKTsNCiAgICAgICAgZWwuc2V0U3R5bGUoInBvc2l0aW9uIiwgImFic29sdXRlIik7DQogICAgICAgIGlmKCFwYW5lbC5iYWNrZ3JvdW5kKXsNCiAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlUGFuZWwocGFuZWwpOw0KICAgICAgICAgICAgaWYodGhpcy5jb25maWcuaW5pdGlhbFNpemUgJiYgdGhpcy5wYW5lbHMuZ2V0Q291bnQoKT09MSl7DQogICAgICAgICAgICAgICAgdGhpcy5yZXNpemVUbyh0aGlzLmNvbmZpZy5pbml0aWFsU2l6ZSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5maXJlRXZlbnQoInBhbmVsYWRkZWQiLCB0aGlzLCBwYW5lbCk7DQogICAgICAgIHJldHVybiBwYW5lbDsNCiAgICB9LA0KICAgIA0KICAgIA0KICAgIGhhc1BhbmVsIDogZnVuY3Rpb24ocGFuZWwpew0KICAgICAgICBpZih0eXBlb2YgcGFuZWwgPT0gIm9iamVjdCIpeyAKICAgICAgICAgICAgcGFuZWwgPSBwYW5lbC5nZXRJZCgpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0aGlzLmdldFBhbmVsKHBhbmVsKSA/IHRydWUgOiBmYWxzZTsNCiAgICB9LA0KICAgIA0KICAgIA0KICAgIHJlbW92ZSA6IGZ1bmN0aW9uKHBhbmVsLCBwcmVzZXJ2ZVBhbmVsKXsNCiAgICAgICAgcGFuZWwgPSB0aGlzLmdldFBhbmVsKHBhbmVsKTsNCiAgICAgICAgaWYoIXBhbmVsKXsNCiAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICB9DQogICAgICAgIHZhciBlID0ge307DQogICAgICAgIHRoaXMuZmlyZUV2ZW50KCJiZWZvcmVyZW1vdmUiLCB0aGlzLCBwYW5lbCwgZSk7DQogICAgICAgIGlmKGUuY2FuY2VsID09PSB0cnVlKXsNCiAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICB9DQogICAgICAgIHZhciBwYW5lbElkID0gcGFuZWwuZ2V0SWQoKTsNCiAgICAgICAgdGhpcy5wYW5lbHMucmVtb3ZlS2V5KHBhbmVsSWQpOw0KICAgICAgICByZXR1cm4gcGFuZWw7DQogICAgfSwNCiAgICANCiAgICANCiAgICBnZXRQYW5lbCA6IGZ1bmN0aW9uKGlkKXsNCiAgICAgICAgaWYodHlwZW9mIGlkID09ICJvYmplY3QiKXsgCiAgICAgICAgICAgIHJldHVybiBpZDsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdGhpcy5wYW5lbHMuZ2V0KGlkKTsNCiAgICB9LA0KICAgIA0KICAgIA0KICAgIGdldFBvc2l0aW9uOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gdGhpcy5wb3NpdGlvbjsgICAgDQogICAgfQ0KfSk7Cg0KRXh0LkxheW91dFJlZ2lvbiA9IGZ1bmN0aW9uKG1nciwgY29uZmlnLCBwb3Mpew0KICAgIEV4dC5MYXlvdXRSZWdpb24uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIG1nciwgY29uZmlnLCBwb3MsIHRydWUpOw0KICAgIHZhciBkaCA9IEV4dC5Eb21IZWxwZXI7DQogICAgDQogICAgdGhpcy5lbCA9IGRoLmFwcGVuZChtZ3IuZWwuZG9tLCB7dGFnOiAiZGl2IiwgY2xzOiAieC1sYXlvdXQtcGFuZWwgeC1sYXlvdXQtcGFuZWwtIiArIHRoaXMucG9zaXRpb259LCB0cnVlKTsNCiAgICANCg0KICAgIHRoaXMudGl0bGVFbCA9IGRoLmFwcGVuZCh0aGlzLmVsLmRvbSwge3RhZzogImRpdiIsIHVuc2VsZWN0YWJsZTogIm9uIiwgY2xzOiAieC11bnNlbGVjdGFibGUgeC1sYXlvdXQtcGFuZWwtaGQgeC1sYXlvdXQtdGl0bGUtIit0aGlzLnBvc2l0aW9uLCBjaGlsZHJlbjpbDQogICAgICAgIHt0YWc6ICJzcGFuIiwgY2xzOiAieC11bnNlbGVjdGFibGUgeC1sYXlvdXQtcGFuZWwtaGQtdGV4dCIsIHVuc2VsZWN0YWJsZTogIm9uIiwgaHRtbDogIiYjMTYwOyJ9LA0KICAgICAgICB7dGFnOiAiZGl2IiwgY2xzOiAieC11bnNlbGVjdGFibGUgeC1sYXlvdXQtcGFuZWwtaGQtdG9vbHMiLCB1bnNlbGVjdGFibGU6ICJvbiJ9DQogICAgXX0sIHRydWUpOw0KICAgIHRoaXMudGl0bGVFbC5lbmFibGVEaXNwbGF5TW9kZSgpOw0KICAgIA0KICAgIHRoaXMudGl0bGVUZXh0RWwgPSB0aGlzLnRpdGxlRWwuZG9tLmZpcnN0Q2hpbGQ7DQogICAgdGhpcy50b29scyA9IEV4dC5nZXQodGhpcy50aXRsZUVsLmRvbS5jaGlsZE5vZGVzWzFdLCB0cnVlKTsNCiAgICB0aGlzLmNsb3NlQnRuID0gdGhpcy5jcmVhdGVUb29sKHRoaXMudG9vbHMuZG9tLCAieC1sYXlvdXQtY2xvc2UiKTsNCiAgICB0aGlzLmNsb3NlQnRuLmVuYWJsZURpc3BsYXlNb2RlKCk7DQogICAgdGhpcy5jbG9zZUJ0bi5vbigiY2xpY2siLCB0aGlzLmNsb3NlQ2xpY2tlZCwgdGhpcyk7DQogICAgdGhpcy5jbG9zZUJ0bi5oaWRlKCk7DQoNCiAgICB0aGlzLmNyZWF0ZUJvZHkoY29uZmlnKTsNCiAgICB0aGlzLnZpc2libGUgPSB0cnVlOw0KICAgIHRoaXMuY29sbGFwc2VkID0gZmFsc2U7DQoNCiAgICBpZihjb25maWcuaGlkZVdoZW5FbXB0eSl7DQogICAgICAgIHRoaXMuaGlkZSgpOw0KICAgICAgICB0aGlzLm9uKCJwYW5lbGFkZGVkIiwgdGhpcy52YWxpZGF0ZVZpc2liaWxpdHksIHRoaXMpOw0KICAgICAgICB0aGlzLm9uKCJwYW5lbHJlbW92ZWQiLCB0aGlzLnZhbGlkYXRlVmlzaWJpbGl0eSwgdGhpcyk7DQogICAgfQ0KICAgIHRoaXMuYXBwbHlDb25maWcoY29uZmlnKTsNCn07DQoNCkV4dC5leHRlbmQoRXh0LkxheW91dFJlZ2lvbiwgRXh0LkJhc2ljTGF5b3V0UmVnaW9uLCB7DQoNCiAgICBjcmVhdGVCb2R5IDogZnVuY3Rpb24oKXsNCiAgICAgICAgDQogICAgICAgIHRoaXMuYm9keUVsID0gdGhpcy5lbC5jcmVhdGVDaGlsZCh7dGFnOiAiZGl2IiwgY2xzOiAieC1sYXlvdXQtcGFuZWwtYm9keSJ9KTsNCiAgICB9LA0KDQogICAgYXBwbHlDb25maWcgOiBmdW5jdGlvbihjKXsNCiAgICAgICAgaWYoYy5jb2xsYXBzaWJsZSAmJiB0aGlzLnBvc2l0aW9uICE9ICJjZW50ZXIiICYmICF0aGlzLmNvbGxhcHNlZEVsKXsNCiAgICAgICAgICAgIHZhciBkaCA9IEV4dC5Eb21IZWxwZXI7DQogICAgICAgICAgICBpZihjLnRpdGxlYmFyICE9PSBmYWxzZSl7DQogICAgICAgICAgICAgICAgdGhpcy5jb2xsYXBzZUJ0biA9IHRoaXMuY3JlYXRlVG9vbCh0aGlzLnRvb2xzLmRvbSwgIngtbGF5b3V0LWNvbGxhcHNlLSIrdGhpcy5wb3NpdGlvbik7DQogICAgICAgICAgICAgICAgdGhpcy5jb2xsYXBzZUJ0bi5vbigiY2xpY2siLCB0aGlzLmNvbGxhcHNlLCB0aGlzKTsNCiAgICAgICAgICAgICAgICB0aGlzLmNvbGxhcHNlQnRuLmVuYWJsZURpc3BsYXlNb2RlKCk7DQoNCiAgICAgICAgICAgICAgICBpZihjLnNob3dQaW4gPT09IHRydWUgfHwgdGhpcy5zaG93UGluKXsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGlja0J0biA9IHRoaXMuY3JlYXRlVG9vbCh0aGlzLnRvb2xzLmRvbSwgIngtbGF5b3V0LXN0aWNrIik7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuc3RpY2tCdG4uZW5hYmxlRGlzcGxheU1vZGUoKTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGlja0J0bi5vbigiY2xpY2siLCB0aGlzLmV4cGFuZCwgdGhpcyk7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuc3RpY2tCdG4uaGlkZSgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgdGhpcy5jb2xsYXBzZWRFbCA9IGRoLmFwcGVuZCh0aGlzLm1nci5lbC5kb20sIHtjbHM6ICJ4LWxheW91dC1jb2xsYXBzZWQgeC1sYXlvdXQtY29sbGFwc2VkLSIrdGhpcy5wb3NpdGlvbiwgY2hpbGRyZW46Ww0KICAgICAgICAgICAgICAgIHtjbHM6ICJ4LWxheW91dC1jb2xsYXBzZWQtdG9vbHMiLCBjaGlsZHJlbjpbe2NsczogIngtbGF5b3V0LWN0b29scy1pbm5lciJ9XX0NCiAgICAgICAgICAgIF19LCB0cnVlKTsNCiAgICAgICAgICAgIGlmKGMuZmxvYXRhYmxlICE9PSBmYWxzZSl7DQogICAgICAgICAgICAgICB0aGlzLmNvbGxhcHNlZEVsLmFkZENsYXNzT25PdmVyKCJ4LWxheW91dC1jb2xsYXBzZWQtb3ZlciIpOw0KICAgICAgICAgICAgICAgdGhpcy5jb2xsYXBzZWRFbC5vbigiY2xpY2siLCB0aGlzLmNvbGxhcHNlQ2xpY2ssIHRoaXMpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZihjLmNvbGxhcHNlZFRpdGxlICYmICh0aGlzLnBvc2l0aW9uID09ICJub3J0aCIgfHwgdGhpcy5wb3NpdGlvbj09ICJzb3V0aCIpKSB7DQogICAgICAgICAgICAgICAgdGhpcy5jb2xsYXBzZWRUaXRsZVRleHRFbCA9IGRoLmFwcGVuZCh0aGlzLmNvbGxhcHNlZEVsLmRvbSwge3RhZzogImRpdiIsIGNsczogIngtdW5zZWxlY3RhYmxlIHgtbGF5b3V0LXBhbmVsLWhkLXRleHQiLA0KICAgICAgICAgICAgICAgICAgIGlkOiAibWVzc2FnZSIsIHVuc2VsZWN0YWJsZTogIm9uIiwgc3R5bGU6eyJmbG9hdCI6ImxlZnQifX0pOw0KICAgICAgICAgICAgICAgdGhpcy5jb2xsYXBzZWRUaXRsZVRleHRFbC5pbm5lckhUTUwgPSBjLmNvbGxhcHNlZFRpdGxlOw0KICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMuZXhwYW5kQnRuID0gdGhpcy5jcmVhdGVUb29sKHRoaXMuY29sbGFwc2VkRWwuZG9tLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZCwgIngtbGF5b3V0LWV4cGFuZC0iK3RoaXMucG9zaXRpb24pOw0KICAgICAgICAgICAgdGhpcy5leHBhbmRCdG4ub24oImNsaWNrIiwgdGhpcy5leHBhbmQsIHRoaXMpOw0KICAgICAgICB9DQogICAgICAgIGlmKHRoaXMuY29sbGFwc2VCdG4pew0KICAgICAgICAgICAgdGhpcy5jb2xsYXBzZUJ0bi5zZXRWaXNpYmxlKGMuY29sbGFwc2libGUgPT0gdHJ1ZSk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5jbWFyZ2lucyA9IGMuY21hcmdpbnMgfHwgdGhpcy5jbWFyZ2lucyB8fA0KICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLnBvc2l0aW9uID09ICJ3ZXN0IiB8fCB0aGlzLnBvc2l0aW9uID09ICJlYXN0IiA/DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0b3A6IDAsIGxlZnQ6IDIsIHJpZ2h0OjIsIGJvdHRvbTogMH0gOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dG9wOiAyLCBsZWZ0OiAwLCByaWdodDowLCBib3R0b206IDJ9KTsNCiAgICAgICAgdGhpcy5tYXJnaW5zID0gYy5tYXJnaW5zIHx8IHRoaXMubWFyZ2lucyB8fCB7dG9wOiAwLCBsZWZ0OiAwLCByaWdodDowLCBib3R0b206IDB9Ow0KICAgICAgICB0aGlzLmJvdHRvbVRhYnMgPSBjLnRhYlBvc2l0aW9uICE9ICJ0b3AiOw0KICAgICAgICB0aGlzLmF1dG9TY3JvbGwgPSBjLmF1dG9TY3JvbGwgfHwgZmFsc2U7DQogICAgICAgIGlmKHRoaXMuYXV0b1Njcm9sbCl7DQogICAgICAgICAgICB0aGlzLmJvZHlFbC5zZXRTdHlsZSgib3ZlcmZsb3ciLCAiYXV0byIpOw0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIHRoaXMuYm9keUVsLnNldFN0eWxlKCJvdmVyZmxvdyIsICJoaWRkZW4iKTsNCiAgICAgICAgfQ0KICAgICAgICAKICAgICAgICAgICAgaWYoKCFjLnRpdGxlYmFyICYmICFjLnRpdGxlKSB8fCBjLnRpdGxlYmFyID09PSBmYWxzZSl7DQogICAgICAgICAgICAgICAgdGhpcy50aXRsZUVsLmhpZGUoKTsNCiAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgIHRoaXMudGl0bGVFbC5zaG93KCk7DQogICAgICAgICAgICAgICAgaWYoYy50aXRsZSl7DQogICAgICAgICAgICAgICAgICAgIHRoaXMudGl0bGVUZXh0RWwuaW5uZXJIVE1MID0gYy50aXRsZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIAogICAgICAgIHRoaXMuZHVyYXRpb24gPSBjLmR1cmF0aW9uIHx8IC4zMDsNCiAgICAgICAgdGhpcy5zbGlkZUR1cmF0aW9uID0gYy5zbGlkZUR1cmF0aW9uIHx8IC40NTsNCiAgICAgICAgdGhpcy5jb25maWcgPSBjOw0KICAgICAgICBpZihjLmNvbGxhcHNlZCl7DQogICAgICAgICAgICB0aGlzLmNvbGxhcHNlKHRydWUpOw0KICAgICAgICB9DQogICAgICAgIGlmKGMuaGlkZGVuKXsNCiAgICAgICAgICAgIHRoaXMuaGlkZSgpOw0KICAgICAgICB9DQogICAgfSwNCiAgICANCiAgICBpc1Zpc2libGUgOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gdGhpcy52aXNpYmxlOw0KICAgIH0sDQoNCiAgICANCiAgICBzZXRDb2xsYXBzZWRUaXRsZSA6IGZ1bmN0aW9uKHRpdGxlKXsNCiAgICAgICAgdGl0bGUgPSB0aXRsZSB8fCAiJiMxNjA7IjsNCiAgICAgICAgaWYodGhpcy5jb2xsYXBzZWRUaXRsZVRleHRFbCl7DQogICAgICAgICAgICB0aGlzLmNvbGxhcHNlZFRpdGxlVGV4dEVsLmlubmVySFRNTCA9IHRpdGxlOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIGdldEJveCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHZhciBiOw0KICAgICAgICBpZighdGhpcy5jb2xsYXBzZWQpew0KICAgICAgICAgICAgYiA9IHRoaXMuZWwuZ2V0Qm94KGZhbHNlLCB0cnVlKTsNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICBiID0gdGhpcy5jb2xsYXBzZWRFbC5nZXRCb3goZmFsc2UsIHRydWUpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBiOw0KICAgIH0sDQoNCiAgICBnZXRNYXJnaW5zIDogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIHRoaXMuY29sbGFwc2VkID8gdGhpcy5jbWFyZ2lucyA6IHRoaXMubWFyZ2luczsNCiAgICB9LA0KDQogICAgaGlnaGxpZ2h0IDogZnVuY3Rpb24oKXsNCiAgICAgICAgdGhpcy5lbC5hZGRDbGFzcygieC1sYXlvdXQtcGFuZWwtZHJhZ292ZXIiKTsNCiAgICB9LA0KDQogICAgdW5oaWdobGlnaHQgOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLmVsLnJlbW92ZUNsYXNzKCJ4LWxheW91dC1wYW5lbC1kcmFnb3ZlciIpOw0KICAgIH0sDQoNCiAgICB1cGRhdGVCb3ggOiBmdW5jdGlvbihib3gpew0KICAgICAgICB0aGlzLmJveCA9IGJveDsNCiAgICAgICAgaWYoIXRoaXMuY29sbGFwc2VkKXsNCiAgICAgICAgICAgIHRoaXMuZWwuZG9tLnN0eWxlLmxlZnQgPSBib3gueCArICJweCI7DQogICAgICAgICAgICB0aGlzLmVsLmRvbS5zdHlsZS50b3AgPSBib3gueSArICJweCI7DQogICAgICAgICAgICB0aGlzLnVwZGF0ZUJvZHkoYm94LndpZHRoLCBib3guaGVpZ2h0KTsNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICB0aGlzLmNvbGxhcHNlZEVsLmRvbS5zdHlsZS5sZWZ0ID0gYm94LnggKyAicHgiOw0KICAgICAgICAgICAgdGhpcy5jb2xsYXBzZWRFbC5kb20uc3R5bGUudG9wID0gYm94LnkgKyAicHgiOw0KICAgICAgICAgICAgdGhpcy5jb2xsYXBzZWRFbC5zZXRTaXplKGJveC53aWR0aCwgYm94LmhlaWdodCk7DQogICAgICAgIH0NCiAgICAgICAgaWYodGhpcy50YWJzKXsNCiAgICAgICAgICAgIHRoaXMudGFicy5hdXRvU2l6ZVRhYnMoKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICB1cGRhdGVCb2R5IDogZnVuY3Rpb24odywgaCl7DQogICAgICAgIGlmKHcgIT09IG51bGwpew0KICAgICAgICAgICAgdGhpcy5lbC5zZXRXaWR0aCh3KTsNCiAgICAgICAgICAgIHcgLT0gdGhpcy5lbC5nZXRCb3JkZXJXaWR0aCgicmwiKTsNCiAgICAgICAgICAgIGlmKHRoaXMuY29uZmlnLmFkanVzdG1lbnRzKXsNCiAgICAgICAgICAgICAgICB3ICs9IHRoaXMuY29uZmlnLmFkanVzdG1lbnRzWzBdOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmKGggIT09IG51bGwpew0KICAgICAgICAgICAgdGhpcy5lbC5zZXRIZWlnaHQoaCk7DQogICAgICAgICAgICBoID0gdGhpcy50aXRsZUVsICYmIHRoaXMudGl0bGVFbC5pc0Rpc3BsYXllZCgpID8gaCAtICh0aGlzLnRpdGxlRWwuZ2V0SGVpZ2h0KCl8fDApIDogaDsNCiAgICAgICAgICAgIGggLT0gdGhpcy5lbC5nZXRCb3JkZXJXaWR0aCgidGIiKTsNCiAgICAgICAgICAgIGlmKHRoaXMuY29uZmlnLmFkanVzdG1lbnRzKXsNCiAgICAgICAgICAgICAgICBoICs9IHRoaXMuY29uZmlnLmFkanVzdG1lbnRzWzFdOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5ib2R5RWwuc2V0SGVpZ2h0KGgpOw0KICAgICAgICAgICAgaWYodGhpcy50YWJzKXsNCiAgICAgICAgICAgICAgICBoID0gdGhpcy50YWJzLnN5bmNIZWlnaHQoaCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgaWYodGhpcy5wYW5lbFNpemUpew0KICAgICAgICAgICAgdyA9IHcgIT09IG51bGwgPyB3IDogdGhpcy5wYW5lbFNpemUud2lkdGg7DQogICAgICAgICAgICBoID0gaCAhPT0gbnVsbCA/IGggOiB0aGlzLnBhbmVsU2l6ZS5oZWlnaHQ7DQogICAgICAgIH0NCiAgICAgICAgaWYodGhpcy5hY3RpdmVQYW5lbCl7DQogICAgICAgICAgICB2YXIgZWwgPSB0aGlzLmFjdGl2ZVBhbmVsLmdldEVsKCk7DQogICAgICAgICAgICB3ID0gdyAhPT0gbnVsbCA/IHcgOiBlbC5nZXRXaWR0aCgpOw0KICAgICAgICAgICAgaCA9IGggIT09IG51bGwgPyBoIDogZWwuZ2V0SGVpZ2h0KCk7DQogICAgICAgICAgICB0aGlzLnBhbmVsU2l6ZSA9IHt3aWR0aDogdywgaGVpZ2h0OiBofTsNCiAgICAgICAgICAgIHRoaXMuYWN0aXZlUGFuZWwuc2V0U2l6ZSh3LCBoKTsNCiAgICAgICAgfQ0KICAgICAgICBpZihFeHQuaXNJRSAmJiB0aGlzLnRhYnMpew0KICAgICAgICAgICAgdGhpcy50YWJzLmVsLnJlcGFpbnQoKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICANCiAgICBnZXRFbCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLmVsOw0KICAgIH0sDQoNCiAgICANCiAgICBoaWRlIDogZnVuY3Rpb24oKXsNCiAgICAgICAgaWYoIXRoaXMuY29sbGFwc2VkKXsNCiAgICAgICAgICAgIHRoaXMuZWwuZG9tLnN0eWxlLmxlZnQgPSAiLTIwMDBweCI7DQogICAgICAgICAgICB0aGlzLmVsLmhpZGUoKTsNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICB0aGlzLmNvbGxhcHNlZEVsLmRvbS5zdHlsZS5sZWZ0ID0gIi0yMDAwcHgiOw0KICAgICAgICAgICAgdGhpcy5jb2xsYXBzZWRFbC5oaWRlKCk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy52aXNpYmxlID0gZmFsc2U7DQogICAgICAgIHRoaXMuZmlyZUV2ZW50KCJ2aXNpYmlsaXR5Y2hhbmdlIiwgdGhpcywgZmFsc2UpOw0KICAgIH0sDQoNCiAgICANCiAgICBzaG93IDogZnVuY3Rpb24oKXsNCiAgICAgICAgaWYoIXRoaXMuY29sbGFwc2VkKXsNCiAgICAgICAgICAgIHRoaXMuZWwuc2hvdygpOw0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIHRoaXMuY29sbGFwc2VkRWwuc2hvdygpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMudmlzaWJsZSA9IHRydWU7DQogICAgICAgIHRoaXMuZmlyZUV2ZW50KCJ2aXNpYmlsaXR5Y2hhbmdlIiwgdGhpcywgdHJ1ZSk7DQogICAgfSwNCg0KICAgIGNsb3NlQ2xpY2tlZCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIGlmKHRoaXMuYWN0aXZlUGFuZWwpew0KICAgICAgICAgICAgdGhpcy5yZW1vdmUodGhpcy5hY3RpdmVQYW5lbCk7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgY29sbGFwc2VDbGljayA6IGZ1bmN0aW9uKGUpew0KICAgICAgICBpZih0aGlzLmlzU2xpZCl7DQogICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7DQogICAgICAgICAgIHRoaXMuc2xpZGVJbigpOw0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsNCiAgICAgICAgICAgdGhpcy5zbGlkZU91dCgpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIGNvbGxhcHNlIDogZnVuY3Rpb24oc2tpcEFuaW0pew0KICAgICAgICBpZih0aGlzLmNvbGxhcHNlZCkgcmV0dXJuOw0KICAgICAgICB0aGlzLmNvbGxhcHNlZCA9IHRydWU7DQogICAgICAgIGlmKHRoaXMuc3BsaXQpew0KICAgICAgICAgICAgdGhpcy5zcGxpdC5lbC5oaWRlKCk7DQogICAgICAgIH0NCiAgICAgICAgaWYodGhpcy5jb25maWcuYW5pbWF0ZSAmJiBza2lwQW5pbSAhPT0gdHJ1ZSl7DQogICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgiaW52YWxpZGF0ZWQiLCB0aGlzKTsNCiAgICAgICAgICAgIHRoaXMuYW5pbWF0ZUNvbGxhcHNlKCk7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgdGhpcy5lbC5zZXRMb2NhdGlvbigtMjAwMDAsLTIwMDAwKTsNCiAgICAgICAgICAgIHRoaXMuZWwuaGlkZSgpOw0KICAgICAgICAgICAgdGhpcy5jb2xsYXBzZWRFbC5zaG93KCk7DQogICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgiY29sbGFwc2VkIiwgdGhpcyk7DQogICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgiaW52YWxpZGF0ZWQiLCB0aGlzKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICBhbmltYXRlQ29sbGFwc2UgOiBmdW5jdGlvbigpew0KICAgICAgICAKICAgIH0sDQoNCiAgICANCiAgICBleHBhbmQgOiBmdW5jdGlvbihlLCBza2lwQW5pbSl7DQogICAgICAgIGlmKGUpIGUuc3RvcFByb3BhZ2F0aW9uKCk7DQogICAgICAgIGlmKCF0aGlzLmNvbGxhcHNlZCB8fCB0aGlzLmVsLmhhc0FjdGl2ZUZ4KCkpIHJldHVybjsNCiAgICAgICAgaWYodGhpcy5pc1NsaWQpew0KICAgICAgICAgICAgdGhpcy5hZnRlclNsaWRlSW4oKTsNCiAgICAgICAgICAgIHNraXBBbmltID0gdHJ1ZTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmNvbGxhcHNlZCA9IGZhbHNlOw0KICAgICAgICBpZih0aGlzLmNvbmZpZy5hbmltYXRlICYmIHNraXBBbmltICE9PSB0cnVlKXsNCiAgICAgICAgICAgIHRoaXMuYW5pbWF0ZUV4cGFuZCgpOw0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIHRoaXMuZWwuc2hvdygpOw0KICAgICAgICAgICAgaWYodGhpcy5zcGxpdCl7DQogICAgICAgICAgICAgICAgdGhpcy5zcGxpdC5lbC5zaG93KCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLmNvbGxhcHNlZEVsLnNldExvY2F0aW9uKC0yMDAwLC0yMDAwKTsNCiAgICAgICAgICAgIHRoaXMuY29sbGFwc2VkRWwuaGlkZSgpOw0KICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoImludmFsaWRhdGVkIiwgdGhpcyk7DQogICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgiZXhwYW5kZWQiLCB0aGlzKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICBhbmltYXRlRXhwYW5kIDogZnVuY3Rpb24oKXsNCiAgICAgICAgCiAgICB9LA0KDQogICAgaW5pdFRhYnMgOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLmJvZHlFbC5zZXRTdHlsZSgib3ZlcmZsb3ciLCAiaGlkZGVuIik7DQogICAgICAgIHZhciB0cyA9IG5ldyBFeHQuVGFiUGFuZWwodGhpcy5ib2R5RWwuZG9tLCB7DQogICAgICAgICAgICB0YWJQb3NpdGlvbjogdGhpcy5ib3R0b21UYWJzID8gJ2JvdHRvbScgOiAndG9wJywNCiAgICAgICAgICAgIGRpc2FibGVUb29sdGlwczogdGhpcy5jb25maWcuZGlzYWJsZVRhYlRpcHMNCiAgICAgICAgfSk7DQogICAgICAgIGlmKHRoaXMuY29uZmlnLmhpZGVUYWJzKXsNCiAgICAgICAgICAgIHRzLnN0cmlwV3JhcC5zZXREaXNwbGF5ZWQoZmFsc2UpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMudGFicyA9IHRzOw0KICAgICAgICB0cy5yZXNpemVUYWJzID0gdGhpcy5jb25maWcucmVzaXplVGFicyA9PT0gdHJ1ZTsNCiAgICAgICAgdHMubWluVGFiV2lkdGggPSB0aGlzLmNvbmZpZy5taW5UYWJXaWR0aCB8fCA0MDsNCiAgICAgICAgdHMubWF4VGFiV2lkdGggPSB0aGlzLmNvbmZpZy5tYXhUYWJXaWR0aCB8fCAyNTA7DQogICAgICAgIHRzLnByZWZlcnJlZFRhYldpZHRoID0gdGhpcy5jb25maWcucHJlZmVycmVkVGFiV2lkdGggfHwgMTUwOw0KICAgICAgICB0cy5tb25pdG9yUmVzaXplID0gZmFsc2U7DQogICAgICAgIHRzLmJvZHlFbC5zZXRTdHlsZSgib3ZlcmZsb3ciLCB0aGlzLmNvbmZpZy5hdXRvU2Nyb2xsID8gImF1dG8iIDogImhpZGRlbiIpOw0KICAgICAgICB0cy5ib2R5RWwuYWRkQ2xhc3MoJ3gtbGF5b3V0LXRhYnMtYm9keScpOw0KICAgICAgICB0aGlzLnBhbmVscy5lYWNoKHRoaXMuaW5pdFBhbmVsQXNUYWIsIHRoaXMpOw0KICAgIH0sDQoNCiAgICBpbml0UGFuZWxBc1RhYiA6IGZ1bmN0aW9uKHBhbmVsKXsNCiAgICAgICAgdmFyIHRpID0gdGhpcy50YWJzLmFkZFRhYihwYW5lbC5nZXRFbCgpLmlkLCBwYW5lbC5nZXRUaXRsZSgpLCBudWxsLA0KICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5jbG9zZU9uVGFiICYmIHBhbmVsLmlzQ2xvc2FibGUoKSk7DQogICAgICAgIGlmKHBhbmVsLnRhYlRpcCAhPT0gdW5kZWZpbmVkKXsNCiAgICAgICAgICAgIHRpLnNldFRvb2x0aXAocGFuZWwudGFiVGlwKTsNCiAgICAgICAgfQ0KICAgICAgICB0aS5vbigiYWN0aXZhdGUiLCBmdW5jdGlvbigpew0KICAgICAgICAgICAgICB0aGlzLnNldEFjdGl2ZVBhbmVsKHBhbmVsKTsNCiAgICAgICAgfSwgdGhpcyk7DQogICAgICAgIGlmKHRoaXMuY29uZmlnLmNsb3NlT25UYWIpew0KICAgICAgICAgICAgdGkub24oImJlZm9yZWNsb3NlIiwgZnVuY3Rpb24odCwgZSl7DQogICAgICAgICAgICAgICAgZS5jYW5jZWwgPSB0cnVlOw0KICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlKHBhbmVsKTsNCiAgICAgICAgICAgIH0sIHRoaXMpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0aTsNCiAgICB9LA0KDQogICAgdXBkYXRlUGFuZWxUaXRsZSA6IGZ1bmN0aW9uKHBhbmVsLCB0aXRsZSl7DQogICAgICAgIGlmKHRoaXMuYWN0aXZlUGFuZWwgPT0gcGFuZWwpew0KICAgICAgICAgICAgdGhpcy51cGRhdGVUaXRsZSh0aXRsZSk7DQogICAgICAgIH0NCiAgICAgICAgaWYodGhpcy50YWJzKXsNCiAgICAgICAgICAgIHZhciB0aSA9IHRoaXMudGFicy5nZXRUYWIocGFuZWwuZ2V0RWwoKS5pZCk7DQogICAgICAgICAgICB0aS5zZXRUZXh0KHRpdGxlKTsNCiAgICAgICAgICAgIGlmKHBhbmVsLnRhYlRpcCAhPT0gdW5kZWZpbmVkKXsNCiAgICAgICAgICAgICAgICB0aS5zZXRUb29sdGlwKHBhbmVsLnRhYlRpcCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgdXBkYXRlVGl0bGUgOiBmdW5jdGlvbih0aXRsZSl7DQogICAgICAgIGlmKHRoaXMudGl0bGVUZXh0RWwgJiYgIXRoaXMuY29uZmlnLnRpdGxlKXsNCiAgICAgICAgICAgIHRoaXMudGl0bGVUZXh0RWwuaW5uZXJIVE1MID0gKHR5cGVvZiB0aXRsZSAhPSAidW5kZWZpbmVkIiAmJiB0aXRsZS5sZW5ndGggPiAwID8gdGl0bGUgOiAiJiMxNjA7Iik7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgc2V0QWN0aXZlUGFuZWwgOiBmdW5jdGlvbihwYW5lbCl7DQogICAgICAgIHBhbmVsID0gdGhpcy5nZXRQYW5lbChwYW5lbCk7DQogICAgICAgIGlmKHRoaXMuYWN0aXZlUGFuZWwgJiYgdGhpcy5hY3RpdmVQYW5lbCAhPSBwYW5lbCl7DQogICAgICAgICAgICB0aGlzLmFjdGl2ZVBhbmVsLnNldEFjdGl2ZVN0YXRlKGZhbHNlKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmFjdGl2ZVBhbmVsID0gcGFuZWw7DQogICAgICAgIHBhbmVsLnNldEFjdGl2ZVN0YXRlKHRydWUpOw0KICAgICAgICBpZih0aGlzLnBhbmVsU2l6ZSl7DQogICAgICAgICAgICBwYW5lbC5zZXRTaXplKHRoaXMucGFuZWxTaXplLndpZHRoLCB0aGlzLnBhbmVsU2l6ZS5oZWlnaHQpOw0KICAgICAgICB9DQogICAgICAgIGlmKHRoaXMuY2xvc2VCdG4pew0KICAgICAgICAgICAgdGhpcy5jbG9zZUJ0bi5zZXRWaXNpYmxlKCF0aGlzLmNvbmZpZy5jbG9zZU9uVGFiICYmICF0aGlzLmlzU2xpZCAmJiBwYW5lbC5pc0Nsb3NhYmxlKCkpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMudXBkYXRlVGl0bGUocGFuZWwuZ2V0VGl0bGUoKSk7DQogICAgICAgIGlmKHRoaXMudGFicyl7DQogICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgiaW52YWxpZGF0ZWQiLCB0aGlzKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmZpcmVFdmVudCgicGFuZWxhY3RpdmF0ZWQiLCB0aGlzLCBwYW5lbCk7DQogICAgfSwNCg0KICAgIA0KICAgIHNob3dQYW5lbCA6IGZ1bmN0aW9uKHBhbmVsKXsNCiAgICAgICAgaWYocGFuZWwgPSB0aGlzLmdldFBhbmVsKHBhbmVsKSl7DQogICAgICAgICAgICBpZih0aGlzLnRhYnMpew0KICAgICAgICAgICAgICAgIHZhciB0YWIgPSB0aGlzLnRhYnMuZ2V0VGFiKHBhbmVsLmdldEVsKCkuaWQpOw0KICAgICAgICAgICAgICAgIGlmKHRhYi5pc0hpZGRlbigpKXsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJzLnVuaGlkZVRhYih0YWIuaWQpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB0YWIuYWN0aXZhdGUoKTsNCiAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlUGFuZWwocGFuZWwpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiBwYW5lbDsNCiAgICB9LA0KDQogICAgDQogICAgZ2V0QWN0aXZlUGFuZWwgOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVQYW5lbDsNCiAgICB9LA0KDQogICAgdmFsaWRhdGVWaXNpYmlsaXR5IDogZnVuY3Rpb24oKXsNCiAgICAgICAgaWYodGhpcy5wYW5lbHMuZ2V0Q291bnQoKSA8IDEpew0KICAgICAgICAgICAgdGhpcy51cGRhdGVUaXRsZSgiJiMxNjA7Iik7DQogICAgICAgICAgICB0aGlzLmNsb3NlQnRuLmhpZGUoKTsNCiAgICAgICAgICAgIHRoaXMuaGlkZSgpOw0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIGlmKCF0aGlzLmlzVmlzaWJsZSgpKXsNCiAgICAgICAgICAgICAgICB0aGlzLnNob3coKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICANCiAgICBhZGQgOiBmdW5jdGlvbihwYW5lbCl7DQogICAgICAgIGlmKGFyZ3VtZW50cy5sZW5ndGggPiAxKXsNCiAgICAgICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykgew0KICAgICAgICAgICAgICAgIHRoaXMuYWRkKGFyZ3VtZW50c1tpXSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgfQ0KICAgICAgICBpZih0aGlzLmhhc1BhbmVsKHBhbmVsKSl7DQogICAgICAgICAgICB0aGlzLnNob3dQYW5lbChwYW5lbCk7DQogICAgICAgICAgICByZXR1cm4gcGFuZWw7DQogICAgICAgIH0NCiAgICAgICAgcGFuZWwuc2V0UmVnaW9uKHRoaXMpOw0KICAgICAgICB0aGlzLnBhbmVscy5hZGQocGFuZWwpOw0KICAgICAgICBpZih0aGlzLnBhbmVscy5nZXRDb3VudCgpID09IDEgJiYgIXRoaXMuY29uZmlnLmFsd2F5c1Nob3dUYWJzKXsNCiAgICAgICAgICAgIHRoaXMuYm9keUVsLmRvbS5hcHBlbmRDaGlsZChwYW5lbC5nZXRFbCgpLmRvbSk7DQogICAgICAgICAgICBpZihwYW5lbC5iYWNrZ3JvdW5kICE9PSB0cnVlKXsNCiAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGl2ZVBhbmVsKHBhbmVsKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMuZmlyZUV2ZW50KCJwYW5lbGFkZGVkIiwgdGhpcywgcGFuZWwpOw0KICAgICAgICAgICAgcmV0dXJuIHBhbmVsOw0KICAgICAgICB9DQogICAgICAgIGlmKCF0aGlzLnRhYnMpew0KICAgICAgICAgICAgdGhpcy5pbml0VGFicygpOw0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIHRoaXMuaW5pdFBhbmVsQXNUYWIocGFuZWwpOw0KICAgICAgICB9DQogICAgICAgIGlmKHBhbmVsLmJhY2tncm91bmQgIT09IHRydWUpew0KICAgICAgICAgICAgdGhpcy50YWJzLmFjdGl2YXRlKHBhbmVsLmdldEVsKCkuaWQpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuZmlyZUV2ZW50KCJwYW5lbGFkZGVkIiwgdGhpcywgcGFuZWwpOw0KICAgICAgICByZXR1cm4gcGFuZWw7DQogICAgfSwNCg0KICAgIA0KICAgIGhpZGVQYW5lbCA6IGZ1bmN0aW9uKHBhbmVsKXsNCiAgICAgICAgaWYodGhpcy50YWJzICYmIChwYW5lbCA9IHRoaXMuZ2V0UGFuZWwocGFuZWwpKSl7DQogICAgICAgICAgICB0aGlzLnRhYnMuaGlkZVRhYihwYW5lbC5nZXRFbCgpLmlkKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICANCiAgICB1bmhpZGVQYW5lbCA6IGZ1bmN0aW9uKHBhbmVsKXsNCiAgICAgICAgaWYodGhpcy50YWJzICYmIChwYW5lbCA9IHRoaXMuZ2V0UGFuZWwocGFuZWwpKSl7DQogICAgICAgICAgICB0aGlzLnRhYnMudW5oaWRlVGFiKHBhbmVsLmdldEVsKCkuaWQpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIGNsZWFyUGFuZWxzIDogZnVuY3Rpb24oKXsNCiAgICAgICAgd2hpbGUodGhpcy5wYW5lbHMuZ2V0Q291bnQoKSA+IDApew0KICAgICAgICAgICAgIHRoaXMucmVtb3ZlKHRoaXMucGFuZWxzLmZpcnN0KCkpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIHJlbW92ZSA6IGZ1bmN0aW9uKHBhbmVsLCBwcmVzZXJ2ZVBhbmVsKXsNCiAgICAgICAgcGFuZWwgPSB0aGlzLmdldFBhbmVsKHBhbmVsKTsNCiAgICAgICAgaWYoIXBhbmVsKXsNCiAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICB9DQogICAgICAgIHZhciBlID0ge307DQogICAgICAgIHRoaXMuZmlyZUV2ZW50KCJiZWZvcmVyZW1vdmUiLCB0aGlzLCBwYW5lbCwgZSk7DQogICAgICAgIGlmKGUuY2FuY2VsID09PSB0cnVlKXsNCiAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICB9DQogICAgICAgIHByZXNlcnZlUGFuZWwgPSAodHlwZW9mIHByZXNlcnZlUGFuZWwgIT0gInVuZGVmaW5lZCIgPyBwcmVzZXJ2ZVBhbmVsIDogKHRoaXMuY29uZmlnLnByZXNlcnZlUGFuZWxzID09PSB0cnVlIHx8IHBhbmVsLnByZXNlcnZlID09PSB0cnVlKSk7DQogICAgICAgIHZhciBwYW5lbElkID0gcGFuZWwuZ2V0SWQoKTsNCiAgICAgICAgdGhpcy5wYW5lbHMucmVtb3ZlS2V5KHBhbmVsSWQpOw0KICAgICAgICBpZihwcmVzZXJ2ZVBhbmVsKXsNCiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocGFuZWwuZ2V0RWwoKS5kb20pOw0KICAgICAgICB9DQogICAgICAgIGlmKHRoaXMudGFicyl7DQogICAgICAgICAgICB0aGlzLnRhYnMucmVtb3ZlVGFiKHBhbmVsLmdldEVsKCkuaWQpOw0KICAgICAgICB9ZWxzZSBpZiAoIXByZXNlcnZlUGFuZWwpew0KICAgICAgICAgICAgdGhpcy5ib2R5RWwuZG9tLnJlbW92ZUNoaWxkKHBhbmVsLmdldEVsKCkuZG9tKTsNCiAgICAgICAgfQ0KICAgICAgICBpZih0aGlzLnBhbmVscy5nZXRDb3VudCgpID09IDEgJiYgdGhpcy50YWJzICYmICF0aGlzLmNvbmZpZy5hbHdheXNTaG93VGFicyl7DQogICAgICAgICAgICB2YXIgcCA9IHRoaXMucGFuZWxzLmZpcnN0KCk7DQogICAgICAgICAgICB2YXIgdGVtcEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7IAogICAgICAgICAgICB0ZW1wRWwuYXBwZW5kQ2hpbGQocC5nZXRFbCgpLmRvbSk7DQogICAgICAgICAgICB0aGlzLmJvZHlFbC51cGRhdGUoIiIpOw0KICAgICAgICAgICAgdGhpcy5ib2R5RWwuZG9tLmFwcGVuZENoaWxkKHAuZ2V0RWwoKS5kb20pOw0KICAgICAgICAgICAgdGVtcEVsID0gbnVsbDsNCiAgICAgICAgICAgIHRoaXMudXBkYXRlVGl0bGUocC5nZXRUaXRsZSgpKTsNCiAgICAgICAgICAgIHRoaXMudGFicyA9IG51bGw7DQogICAgICAgICAgICB0aGlzLmJvZHlFbC5zZXRTdHlsZSgib3ZlcmZsb3ciLCB0aGlzLmNvbmZpZy5hdXRvU2Nyb2xsID8gImF1dG8iIDogImhpZGRlbiIpOw0KICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVQYW5lbChwKTsNCiAgICAgICAgfQ0KICAgICAgICBwYW5lbC5zZXRSZWdpb24obnVsbCk7DQogICAgICAgIGlmKHRoaXMuYWN0aXZlUGFuZWwgPT0gcGFuZWwpew0KICAgICAgICAgICAgdGhpcy5hY3RpdmVQYW5lbCA9IG51bGw7DQogICAgICAgIH0NCiAgICAgICAgaWYodGhpcy5jb25maWcuYXV0b0Rlc3Ryb3kgIT09IGZhbHNlICYmIHByZXNlcnZlUGFuZWwgIT09IHRydWUpew0KICAgICAgICAgICAgdHJ5e3BhbmVsLmRlc3Ryb3koKTt9Y2F0Y2goZSl7fQ0KICAgICAgICB9DQogICAgICAgIHRoaXMuZmlyZUV2ZW50KCJwYW5lbHJlbW92ZWQiLCB0aGlzLCBwYW5lbCk7DQogICAgICAgIHJldHVybiBwYW5lbDsNCiAgICB9LA0KDQogICAgDQogICAgZ2V0VGFicyA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLnRhYnM7DQogICAgfSwNCg0KICAgIGNyZWF0ZVRvb2wgOiBmdW5jdGlvbihwYXJlbnRFbCwgY2xhc3NOYW1lKXsNCiAgICAgICAgdmFyIGJ0biA9IEV4dC5Eb21IZWxwZXIuYXBwZW5kKHBhcmVudEVsLCB7dGFnOiAiZGl2IiwgY2xzOiAieC1sYXlvdXQtdG9vbHMtYnV0dG9uIiwNCiAgICAgICAgICAgIGNoaWxkcmVuOiBbe3RhZzogImRpdiIsIGNsczogIngtbGF5b3V0LXRvb2xzLWJ1dHRvbi1pbm5lciAiICsgY2xhc3NOYW1lLCBodG1sOiAiJiMxNjA7In1dfSwgdHJ1ZSk7DQogICAgICAgIGJ0bi5hZGRDbGFzc09uT3ZlcigieC1sYXlvdXQtdG9vbHMtYnV0dG9uLW92ZXIiKTsNCiAgICAgICAgcmV0dXJuIGJ0bjsNCiAgICB9DQp9KTsKDQpFeHQuU3BsaXRMYXlvdXRSZWdpb24gPSBmdW5jdGlvbihtZ3IsIGNvbmZpZywgcG9zLCBjdXJzb3Ipew0KICAgIHRoaXMuY3Vyc29yID0gY3Vyc29yOw0KICAgIEV4dC5TcGxpdExheW91dFJlZ2lvbi5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgbWdyLCBjb25maWcsIHBvcyk7DQp9Ow0KDQpFeHQuZXh0ZW5kKEV4dC5TcGxpdExheW91dFJlZ2lvbiwgRXh0LkxheW91dFJlZ2lvbiwgew0KICAgIHNwbGl0VGlwIDogIkRyYWcgdG8gcmVzaXplLiIsDQogICAgY29sbGFwc2libGVTcGxpdFRpcCA6ICJEcmFnIHRvIHJlc2l6ZS4gRG91YmxlIGNsaWNrIHRvIGhpZGUuIiwNCiAgICB1c2VTcGxpdFRpcHMgOiBmYWxzZSwNCg0KICAgIGFwcGx5Q29uZmlnIDogZnVuY3Rpb24oY29uZmlnKXsNCiAgICAgICAgRXh0LlNwbGl0TGF5b3V0UmVnaW9uLnN1cGVyY2xhc3MuYXBwbHlDb25maWcuY2FsbCh0aGlzLCBjb25maWcpOw0KICAgICAgICBpZihjb25maWcuc3BsaXQpew0KICAgICAgICAgICAgaWYoIXRoaXMuc3BsaXQpew0KICAgICAgICAgICAgICAgIHZhciBzcGxpdEVsID0gRXh0LkRvbUhlbHBlci5hcHBlbmQodGhpcy5tZ3IuZWwuZG9tLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHt0YWc6ICJkaXYiLCBpZDogdGhpcy5lbC5pZCArICItc3BsaXQiLCBjbHM6ICJ4LWxheW91dC1zcGxpdCB4LWxheW91dC1zcGxpdC0iK3RoaXMucG9zaXRpb24sIGh0bWw6ICImIzE2MDsifSk7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdGhpcy5zcGxpdCA9IG5ldyBFeHQuU3BsaXRCYXIoc3BsaXRFbCwgdGhpcy5lbCwgdGhpcy5vcmllbnRhdGlvbik7DQogICAgICAgICAgICAgICAgdGhpcy5zcGxpdC5vbigibW92ZWQiLCB0aGlzLm9uU3BsaXRNb3ZlLCB0aGlzKTsNCiAgICAgICAgICAgICAgICB0aGlzLnNwbGl0LnVzZVNoaW0gPSBjb25maWcudXNlU2hpbSA9PT0gdHJ1ZTsNCiAgICAgICAgICAgICAgICB0aGlzLnNwbGl0LmdldE1heGltdW1TaXplID0gdGhpc1t0aGlzLnBvc2l0aW9uID09ICdub3J0aCcgfHwgdGhpcy5wb3NpdGlvbiA9PSAnc291dGgnID8gJ2dldFZNYXhTaXplJyA6ICdnZXRITWF4U2l6ZSddLmNyZWF0ZURlbGVnYXRlKHRoaXMpOw0KICAgICAgICAgICAgICAgIGlmKHRoaXMudXNlU3BsaXRUaXBzKXsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGxpdC5lbC5kb20udGl0bGUgPSBjb25maWcuY29sbGFwc2libGUgPyB0aGlzLmNvbGxhcHNpYmxlU3BsaXRUaXAgOiB0aGlzLnNwbGl0VGlwOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZihjb25maWcuY29sbGFwc2libGUpew0KICAgICAgICAgICAgICAgICAgICB0aGlzLnNwbGl0LmVsLm9uKCJkYmxjbGljayIsIHRoaXMuY29sbGFwc2UsICB0aGlzKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZih0eXBlb2YgY29uZmlnLm1pblNpemUgIT0gInVuZGVmaW5lZCIpew0KICAgICAgICAgICAgICAgIHRoaXMuc3BsaXQubWluU2l6ZSA9IGNvbmZpZy5taW5TaXplOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYodHlwZW9mIGNvbmZpZy5tYXhTaXplICE9ICJ1bmRlZmluZWQiKXsNCiAgICAgICAgICAgICAgICB0aGlzLnNwbGl0Lm1heFNpemUgPSBjb25maWcubWF4U2l6ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKGNvbmZpZy5oaWRlV2hlbkVtcHR5IHx8IGNvbmZpZy5oaWRkZW4gfHwgY29uZmlnLmNvbGxhcHNlZCl7DQogICAgICAgICAgICAgICAgdGhpcy5oaWRlU3BsaXR0ZXIoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICBnZXRITWF4U2l6ZSA6IGZ1bmN0aW9uKCl7DQogICAgICAgICB2YXIgY21heCA9IHRoaXMuY29uZmlnLm1heFNpemUgfHwgMTAwMDA7DQogICAgICAgICB2YXIgY2VudGVyID0gdGhpcy5tZ3IuZ2V0UmVnaW9uKCJjZW50ZXIiKTsNCiAgICAgICAgIHJldHVybiBNYXRoLm1pbihjbWF4LCAodGhpcy5lbC5nZXRXaWR0aCgpK2NlbnRlci5nZXRFbCgpLmdldFdpZHRoKCkpLWNlbnRlci5nZXRNaW5XaWR0aCgpKTsNCiAgICB9LA0KDQogICAgZ2V0Vk1heFNpemUgOiBmdW5jdGlvbigpew0KICAgICAgICAgdmFyIGNtYXggPSB0aGlzLmNvbmZpZy5tYXhTaXplIHx8IDEwMDAwOw0KICAgICAgICAgdmFyIGNlbnRlciA9IHRoaXMubWdyLmdldFJlZ2lvbigiY2VudGVyIik7DQogICAgICAgICByZXR1cm4gTWF0aC5taW4oY21heCwgKHRoaXMuZWwuZ2V0SGVpZ2h0KCkrY2VudGVyLmdldEVsKCkuZ2V0SGVpZ2h0KCkpLWNlbnRlci5nZXRNaW5IZWlnaHQoKSk7DQogICAgfSwNCg0KICAgIG9uU3BsaXRNb3ZlIDogZnVuY3Rpb24oc3BsaXQsIG5ld1NpemUpew0KICAgICAgICB0aGlzLmZpcmVFdmVudCgicmVzaXplZCIsIHRoaXMsIG5ld1NpemUpOw0KICAgIH0sDQogICAgDQogICAgDQogICAgZ2V0U3BsaXRCYXIgOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gdGhpcy5zcGxpdDsNCiAgICB9LA0KICAgIA0KICAgIGhpZGUgOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLmhpZGVTcGxpdHRlcigpOw0KICAgICAgICBFeHQuU3BsaXRMYXlvdXRSZWdpb24uc3VwZXJjbGFzcy5oaWRlLmNhbGwodGhpcyk7DQogICAgfSwNCg0KICAgIGhpZGVTcGxpdHRlciA6IGZ1bmN0aW9uKCl7DQogICAgICAgIGlmKHRoaXMuc3BsaXQpew0KICAgICAgICAgICAgdGhpcy5zcGxpdC5lbC5zZXRMb2NhdGlvbigtMjAwMCwtMjAwMCk7DQogICAgICAgICAgICB0aGlzLnNwbGl0LmVsLmhpZGUoKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICBzaG93IDogZnVuY3Rpb24oKXsNCiAgICAgICAgaWYodGhpcy5zcGxpdCl7DQogICAgICAgICAgICB0aGlzLnNwbGl0LmVsLnNob3coKTsNCiAgICAgICAgfQ0KICAgICAgICBFeHQuU3BsaXRMYXlvdXRSZWdpb24uc3VwZXJjbGFzcy5zaG93LmNhbGwodGhpcyk7DQogICAgfSwNCiAgICANCiAgICBiZWZvcmVTbGlkZTogZnVuY3Rpb24oKXsNCiAgICAgICAgaWYoRXh0LmlzR2Vja28pewogICAgICAgICAgICB0aGlzLmJvZHlFbC5jbGlwKCk7DQogICAgICAgICAgICBpZih0aGlzLnRhYnMpIHRoaXMudGFicy5ib2R5RWwuY2xpcCgpOw0KICAgICAgICAgICAgaWYodGhpcy5hY3RpdmVQYW5lbCl7DQogICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVQYW5lbC5nZXRFbCgpLmNsaXAoKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBpZih0aGlzLmFjdGl2ZVBhbmVsLmJlZm9yZVNsaWRlKXsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVQYW5lbC5iZWZvcmVTbGlkZSgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0sDQogICAgDQogICAgYWZ0ZXJTbGlkZSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIGlmKEV4dC5pc0dlY2tvKXsKICAgICAgICAgICAgdGhpcy5ib2R5RWwudW5jbGlwKCk7DQogICAgICAgICAgICBpZih0aGlzLnRhYnMpIHRoaXMudGFicy5ib2R5RWwudW5jbGlwKCk7DQogICAgICAgICAgICBpZih0aGlzLmFjdGl2ZVBhbmVsKXsNCiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVBhbmVsLmdldEVsKCkudW5jbGlwKCk7DQogICAgICAgICAgICAgICAgaWYodGhpcy5hY3RpdmVQYW5lbC5hZnRlclNsaWRlKXsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVQYW5lbC5hZnRlclNsaWRlKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSwNCg0KICAgIGluaXRBdXRvSGlkZSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIGlmKHRoaXMuYXV0b0hpZGUgIT09IGZhbHNlKXsNCiAgICAgICAgICAgIGlmKCF0aGlzLmF1dG9IaWRlSGQpew0KICAgICAgICAgICAgICAgIHZhciBzdCA9IG5ldyBFeHQudXRpbC5EZWxheWVkVGFzayh0aGlzLnNsaWRlSW4sIHRoaXMpOw0KICAgICAgICAgICAgICAgIHRoaXMuYXV0b0hpZGVIZCA9IHsNCiAgICAgICAgICAgICAgICAgICAgIm1vdXNlb3V0IjogZnVuY3Rpb24oZSl7DQogICAgICAgICAgICAgICAgICAgICAgICBpZighZS53aXRoaW4odGhpcy5lbCwgdHJ1ZSkpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LmRlbGF5KDUwMCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgICAgICJtb3VzZW92ZXIiIDogZnVuY3Rpb24oZSl7DQogICAgICAgICAgICAgICAgICAgICAgICBzdC5jYW5jZWwoKTsNCiAgICAgICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAgICAgc2NvcGUgOiB0aGlzDQogICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMuZWwub24odGhpcy5hdXRvSGlkZUhkKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICBjbGVhckF1dG9IaWRlIDogZnVuY3Rpb24oKXsNCiAgICAgICAgaWYodGhpcy5hdXRvSGlkZSAhPT0gZmFsc2Upew0KICAgICAgICAgICAgdGhpcy5lbC51bigibW91c2VvdXQiLCB0aGlzLmF1dG9IaWRlSGQubW91c2VvdXQpOw0KICAgICAgICAgICAgdGhpcy5lbC51bigibW91c2VvdmVyIiwgdGhpcy5hdXRvSGlkZUhkLm1vdXNlb3Zlcik7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgY2xlYXJNb25pdG9yIDogZnVuY3Rpb24oKXsNCiAgICAgICAgRXh0LmdldChkb2N1bWVudCkudW4oImNsaWNrIiwgdGhpcy5zbGlkZUluSWYsIHRoaXMpOw0KICAgIH0sDQoNCiAgICAKICAgIHNsaWRlT3V0IDogZnVuY3Rpb24oKXsNCiAgICAgICAgaWYodGhpcy5pc1NsaWQgfHwgdGhpcy5lbC5oYXNBY3RpdmVGeCgpKXsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmlzU2xpZCA9IHRydWU7DQogICAgICAgIGlmKHRoaXMuY29sbGFwc2VCdG4pew0KICAgICAgICAgICAgdGhpcy5jb2xsYXBzZUJ0bi5oaWRlKCk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5jbG9zZUJ0blN0YXRlID0gdGhpcy5jbG9zZUJ0bi5nZXRTdHlsZSgnZGlzcGxheScpOw0KICAgICAgICB0aGlzLmNsb3NlQnRuLmhpZGUoKTsNCiAgICAgICAgaWYodGhpcy5zdGlja0J0bil7DQogICAgICAgICAgICB0aGlzLnN0aWNrQnRuLnNob3coKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmVsLnNob3coKTsNCiAgICAgICAgdGhpcy5lbC5hbGlnblRvKHRoaXMuY29sbGFwc2VkRWwsIHRoaXMuZ2V0Q29sbGFwc2VBbmNob3IoKSk7DQogICAgICAgIHRoaXMuYmVmb3JlU2xpZGUoKTsNCiAgICAgICAgdGhpcy5lbC5zZXRTdHlsZSgiei1pbmRleCIsIDEwMDAxKTsNCiAgICAgICAgdGhpcy5lbC5zbGlkZUluKHRoaXMuZ2V0U2xpZGVBbmNob3IoKSwgew0KICAgICAgICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICAgdGhpcy5hZnRlclNsaWRlKCk7DQogICAgICAgICAgICAgICAgdGhpcy5pbml0QXV0b0hpZGUoKTsNCiAgICAgICAgICAgICAgICBFeHQuZ2V0KGRvY3VtZW50KS5vbigiY2xpY2siLCB0aGlzLnNsaWRlSW5JZiwgdGhpcyk7DQogICAgICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoInNsaWRlc2hvdyIsIHRoaXMpOw0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHNjb3BlOiB0aGlzLA0KICAgICAgICAgICAgYmxvY2s6IHRydWUNCiAgICAgICAgfSk7DQogICAgfSwNCg0KICAgIGFmdGVyU2xpZGVJbiA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHRoaXMuY2xlYXJBdXRvSGlkZSgpOw0KICAgICAgICB0aGlzLmlzU2xpZCA9IGZhbHNlOw0KICAgICAgICB0aGlzLmNsZWFyTW9uaXRvcigpOw0KICAgICAgICB0aGlzLmVsLnNldFN0eWxlKCJ6LWluZGV4IiwgIiIpOw0KICAgICAgICBpZih0aGlzLmNvbGxhcHNlQnRuKXsNCiAgICAgICAgICAgIHRoaXMuY29sbGFwc2VCdG4uc2hvdygpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuY2xvc2VCdG4uc2V0U3R5bGUoJ2Rpc3BsYXknLCB0aGlzLmNsb3NlQnRuU3RhdGUpOw0KICAgICAgICBpZih0aGlzLnN0aWNrQnRuKXsNCiAgICAgICAgICAgIHRoaXMuc3RpY2tCdG4uaGlkZSgpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuZmlyZUV2ZW50KCJzbGlkZWhpZGUiLCB0aGlzKTsNCiAgICB9LA0KDQogICAgc2xpZGVJbiA6IGZ1bmN0aW9uKGNiKXsNCiAgICAgICAgaWYoIXRoaXMuaXNTbGlkIHx8IHRoaXMuZWwuaGFzQWN0aXZlRngoKSl7DQogICAgICAgICAgICBFeHQuY2FsbGJhY2soY2IpOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuaXNTbGlkID0gZmFsc2U7DQogICAgICAgIHRoaXMuYmVmb3JlU2xpZGUoKTsNCiAgICAgICAgdGhpcy5lbC5zbGlkZU91dCh0aGlzLmdldFNsaWRlQW5jaG9yKCksIHsNCiAgICAgICAgICAgIGNhbGxiYWNrOiBmdW5jdGlvbigpew0KICAgICAgICAgICAgICAgIHRoaXMuZWwuc2V0TGVmdFRvcCgtMTAwMDAsIC0xMDAwMCk7DQogICAgICAgICAgICAgICAgdGhpcy5hZnRlclNsaWRlKCk7DQogICAgICAgICAgICAgICAgdGhpcy5hZnRlclNsaWRlSW4oKTsNCiAgICAgICAgICAgICAgICBFeHQuY2FsbGJhY2soY2IpOw0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHNjb3BlOiB0aGlzLA0KICAgICAgICAgICAgYmxvY2s6IHRydWUNCiAgICAgICAgfSk7DQogICAgfSwNCiAgICANCiAgICBzbGlkZUluSWYgOiBmdW5jdGlvbihlKXsNCiAgICAgICAgaWYoIWUud2l0aGluKHRoaXMuZWwpKXsNCiAgICAgICAgICAgIHRoaXMuc2xpZGVJbigpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIGFuaW1hdGVDb2xsYXBzZSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHRoaXMuYmVmb3JlU2xpZGUoKTsNCiAgICAgICAgdGhpcy5lbC5zZXRTdHlsZSgiei1pbmRleCIsIDIwMDAwKTsNCiAgICAgICAgdmFyIGFuY2hvciA9IHRoaXMuZ2V0U2xpZGVBbmNob3IoKTsNCiAgICAgICAgdGhpcy5lbC5zbGlkZU91dChhbmNob3IsIHsNCiAgICAgICAgICAgIGNhbGxiYWNrIDogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICAgICB0aGlzLmVsLnNldFN0eWxlKCJ6LWluZGV4IiwgIiIpOw0KICAgICAgICAgICAgICAgIHRoaXMuY29sbGFwc2VkRWwuc2xpZGVJbihhbmNob3IsIHtkdXJhdGlvbjouM30pOw0KICAgICAgICAgICAgICAgIHRoaXMuYWZ0ZXJTbGlkZSgpOw0KICAgICAgICAgICAgICAgIHRoaXMuZWwuc2V0TG9jYXRpb24oLTEwMDAwLC0xMDAwMCk7DQogICAgICAgICAgICAgICAgdGhpcy5lbC5oaWRlKCk7DQogICAgICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoImNvbGxhcHNlZCIsIHRoaXMpOw0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHNjb3BlOiB0aGlzLA0KICAgICAgICAgICAgYmxvY2s6IHRydWUNCiAgICAgICAgfSk7DQogICAgfSwNCg0KICAgIGFuaW1hdGVFeHBhbmQgOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLmJlZm9yZVNsaWRlKCk7DQogICAgICAgIHRoaXMuZWwuYWxpZ25Ubyh0aGlzLmNvbGxhcHNlZEVsLCB0aGlzLmdldENvbGxhcHNlQW5jaG9yKCksIHRoaXMuZ2V0RXhwYW5kQWRqKCkpOw0KICAgICAgICB0aGlzLmVsLnNldFN0eWxlKCJ6LWluZGV4IiwgMjAwMDApOw0KICAgICAgICB0aGlzLmNvbGxhcHNlZEVsLmhpZGUoew0KICAgICAgICAgICAgZHVyYXRpb246LjENCiAgICAgICAgfSk7DQogICAgICAgIHRoaXMuZWwuc2xpZGVJbih0aGlzLmdldFNsaWRlQW5jaG9yKCksIHsNCiAgICAgICAgICAgIGNhbGxiYWNrIDogZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICAgICB0aGlzLmVsLnNldFN0eWxlKCJ6LWluZGV4IiwgIiIpOw0KICAgICAgICAgICAgICAgIHRoaXMuYWZ0ZXJTbGlkZSgpOw0KICAgICAgICAgICAgICAgIGlmKHRoaXMuc3BsaXQpew0KICAgICAgICAgICAgICAgICAgICB0aGlzLnNwbGl0LmVsLnNob3coKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoImludmFsaWRhdGVkIiwgdGhpcyk7DQogICAgICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoImV4cGFuZGVkIiwgdGhpcyk7DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgc2NvcGU6IHRoaXMsDQogICAgICAgICAgICBibG9jazogdHJ1ZQ0KICAgICAgICB9KTsNCiAgICB9LA0KDQogICAgYW5jaG9ycyA6IHsNCiAgICAgICAgIndlc3QiIDogImxlZnQiLA0KICAgICAgICAiZWFzdCIgOiAicmlnaHQiLA0KICAgICAgICAibm9ydGgiIDogInRvcCIsDQogICAgICAgICJzb3V0aCIgOiAiYm90dG9tIg0KICAgIH0sDQoNCiAgICBzYW5jaG9ycyA6IHsNCiAgICAgICAgIndlc3QiIDogImwiLA0KICAgICAgICAiZWFzdCIgOiAiciIsDQogICAgICAgICJub3J0aCIgOiAidCIsDQogICAgICAgICJzb3V0aCIgOiAiYiINCiAgICB9LA0KDQogICAgY2FuY2hvcnMgOiB7DQogICAgICAgICJ3ZXN0IiA6ICJ0bC10ciIsDQogICAgICAgICJlYXN0IiA6ICJ0ci10bCIsDQogICAgICAgICJub3J0aCIgOiAidGwtYmwiLA0KICAgICAgICAic291dGgiIDogImJsLXRsIg0KICAgIH0sDQoNCiAgICBnZXRBbmNob3IgOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gdGhpcy5hbmNob3JzW3RoaXMucG9zaXRpb25dOw0KICAgIH0sDQoNCiAgICBnZXRDb2xsYXBzZUFuY2hvciA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLmNhbmNob3JzW3RoaXMucG9zaXRpb25dOw0KICAgIH0sDQoNCiAgICBnZXRTbGlkZUFuY2hvciA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLnNhbmNob3JzW3RoaXMucG9zaXRpb25dOw0KICAgIH0sDQoNCiAgICBnZXRBbGlnbkFkaiA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHZhciBjbSA9IHRoaXMuY21hcmdpbnM7DQogICAgICAgIHN3aXRjaCh0aGlzLnBvc2l0aW9uKXsNCiAgICAgICAgICAgIGNhc2UgIndlc3QiOg0KICAgICAgICAgICAgICAgIHJldHVybiBbMCwgMF07DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGNhc2UgImVhc3QiOg0KICAgICAgICAgICAgICAgIHJldHVybiBbMCwgMF07DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGNhc2UgIm5vcnRoIjoNCiAgICAgICAgICAgICAgICByZXR1cm4gWzAsIDBdOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBjYXNlICJzb3V0aCI6DQogICAgICAgICAgICAgICAgcmV0dXJuIFswLCAwXTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIGdldEV4cGFuZEFkaiA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHZhciBjID0gdGhpcy5jb2xsYXBzZWRFbCwgY20gPSB0aGlzLmNtYXJnaW5zOw0KICAgICAgICBzd2l0Y2godGhpcy5wb3NpdGlvbil7DQogICAgICAgICAgICBjYXNlICJ3ZXN0IjoNCiAgICAgICAgICAgICAgICByZXR1cm4gWy0oY20ucmlnaHQrYy5nZXRXaWR0aCgpK2NtLmxlZnQpLCAwXTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAiZWFzdCI6DQogICAgICAgICAgICAgICAgcmV0dXJuIFtjbS5yaWdodCtjLmdldFdpZHRoKCkrY20ubGVmdCwgMF07DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGNhc2UgIm5vcnRoIjoNCiAgICAgICAgICAgICAgICByZXR1cm4gWzAsIC0oY20udG9wK2NtLmJvdHRvbStjLmdldEhlaWdodCgpKV07DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGNhc2UgInNvdXRoIjoNCiAgICAgICAgICAgICAgICByZXR1cm4gWzAsIGNtLnRvcCtjbS5ib3R0b20rYy5nZXRIZWlnaHQoKV07DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgIH0NCn0pOwoNCkV4dC5DZW50ZXJMYXlvdXRSZWdpb24gPSBmdW5jdGlvbihtZ3IsIGNvbmZpZyl7DQogICAgRXh0LkNlbnRlckxheW91dFJlZ2lvbi5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgbWdyLCBjb25maWcsICJjZW50ZXIiKTsNCiAgICB0aGlzLnZpc2libGUgPSB0cnVlOw0KICAgIHRoaXMubWluV2lkdGggPSBjb25maWcubWluV2lkdGggfHwgMjA7DQogICAgdGhpcy5taW5IZWlnaHQgPSBjb25maWcubWluSGVpZ2h0IHx8IDIwOw0KfTsNCg0KRXh0LmV4dGVuZChFeHQuQ2VudGVyTGF5b3V0UmVnaW9uLCBFeHQuTGF5b3V0UmVnaW9uLCB7DQogICAgaGlkZSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIAogICAgfSwNCiAgICANCiAgICBzaG93IDogZnVuY3Rpb24oKXsNCiAgICAgICAgCiAgICB9LA0KICAgIA0KICAgIGdldE1pbldpZHRoOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gdGhpcy5taW5XaWR0aDsNCiAgICB9LA0KICAgIA0KICAgIGdldE1pbkhlaWdodDogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIHRoaXMubWluSGVpZ2h0Ow0KICAgIH0NCn0pOw0KDQoNCkV4dC5Ob3J0aExheW91dFJlZ2lvbiA9IGZ1bmN0aW9uKG1nciwgY29uZmlnKXsNCiAgICBFeHQuTm9ydGhMYXlvdXRSZWdpb24uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIG1nciwgY29uZmlnLCAibm9ydGgiLCAibi1yZXNpemUiKTsNCiAgICBpZih0aGlzLnNwbGl0KXsNCiAgICAgICAgdGhpcy5zcGxpdC5wbGFjZW1lbnQgPSBFeHQuU3BsaXRCYXIuVE9QOw0KICAgICAgICB0aGlzLnNwbGl0Lm9yaWVudGF0aW9uID0gRXh0LlNwbGl0QmFyLlZFUlRJQ0FMOw0KICAgICAgICB0aGlzLnNwbGl0LmVsLmFkZENsYXNzKCJ4LWxheW91dC1zcGxpdC12Iik7DQogICAgfQ0KICAgIHZhciBzaXplID0gY29uZmlnLmluaXRpYWxTaXplIHx8IGNvbmZpZy5oZWlnaHQ7DQogICAgaWYodHlwZW9mIHNpemUgIT0gInVuZGVmaW5lZCIpew0KICAgICAgICB0aGlzLmVsLnNldEhlaWdodChzaXplKTsNCiAgICB9DQp9Ow0KRXh0LmV4dGVuZChFeHQuTm9ydGhMYXlvdXRSZWdpb24sIEV4dC5TcGxpdExheW91dFJlZ2lvbiwgew0KICAgIG9yaWVudGF0aW9uOiBFeHQuU3BsaXRCYXIuVkVSVElDQUwsDQogICAgZ2V0Qm94IDogZnVuY3Rpb24oKXsNCiAgICAgICAgaWYodGhpcy5jb2xsYXBzZWQpew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29sbGFwc2VkRWwuZ2V0Qm94KCk7DQogICAgICAgIH0NCiAgICAgICAgdmFyIGJveCA9IHRoaXMuZWwuZ2V0Qm94KCk7DQogICAgICAgIGlmKHRoaXMuc3BsaXQpew0KICAgICAgICAgICAgYm94LmhlaWdodCArPSB0aGlzLnNwbGl0LmVsLmdldEhlaWdodCgpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBib3g7DQogICAgfSwNCiAgICANCiAgICB1cGRhdGVCb3ggOiBmdW5jdGlvbihib3gpew0KICAgICAgICBpZih0aGlzLnNwbGl0ICYmICF0aGlzLmNvbGxhcHNlZCl7DQogICAgICAgICAgICBib3guaGVpZ2h0IC09IHRoaXMuc3BsaXQuZWwuZ2V0SGVpZ2h0KCk7DQogICAgICAgICAgICB0aGlzLnNwbGl0LmVsLnNldExlZnQoYm94LngpOw0KICAgICAgICAgICAgdGhpcy5zcGxpdC5lbC5zZXRUb3AoYm94LnkrYm94LmhlaWdodCk7DQogICAgICAgICAgICB0aGlzLnNwbGl0LmVsLnNldFdpZHRoKGJveC53aWR0aCk7DQogICAgICAgIH0NCiAgICAgICAgaWYodGhpcy5jb2xsYXBzZWQpew0KICAgICAgICAgICAgdGhpcy51cGRhdGVCb2R5KGJveC53aWR0aCwgbnVsbCk7DQogICAgICAgIH0NCiAgICAgICAgRXh0Lk5vcnRoTGF5b3V0UmVnaW9uLnN1cGVyY2xhc3MudXBkYXRlQm94LmNhbGwodGhpcywgYm94KTsNCiAgICB9DQp9KTsNCg0KRXh0LlNvdXRoTGF5b3V0UmVnaW9uID0gZnVuY3Rpb24obWdyLCBjb25maWcpew0KICAgIEV4dC5Tb3V0aExheW91dFJlZ2lvbi5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgbWdyLCBjb25maWcsICJzb3V0aCIsICJzLXJlc2l6ZSIpOw0KICAgIGlmKHRoaXMuc3BsaXQpew0KICAgICAgICB0aGlzLnNwbGl0LnBsYWNlbWVudCA9IEV4dC5TcGxpdEJhci5CT1RUT007DQogICAgICAgIHRoaXMuc3BsaXQub3JpZW50YXRpb24gPSBFeHQuU3BsaXRCYXIuVkVSVElDQUw7DQogICAgICAgIHRoaXMuc3BsaXQuZWwuYWRkQ2xhc3MoIngtbGF5b3V0LXNwbGl0LXYiKTsNCiAgICB9DQogICAgdmFyIHNpemUgPSBjb25maWcuaW5pdGlhbFNpemUgfHwgY29uZmlnLmhlaWdodDsNCiAgICBpZih0eXBlb2Ygc2l6ZSAhPSAidW5kZWZpbmVkIil7DQogICAgICAgIHRoaXMuZWwuc2V0SGVpZ2h0KHNpemUpOw0KICAgIH0NCn07DQpFeHQuZXh0ZW5kKEV4dC5Tb3V0aExheW91dFJlZ2lvbiwgRXh0LlNwbGl0TGF5b3V0UmVnaW9uLCB7DQogICAgb3JpZW50YXRpb246IEV4dC5TcGxpdEJhci5WRVJUSUNBTCwNCiAgICBnZXRCb3ggOiBmdW5jdGlvbigpew0KICAgICAgICBpZih0aGlzLmNvbGxhcHNlZCl7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5jb2xsYXBzZWRFbC5nZXRCb3goKTsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgYm94ID0gdGhpcy5lbC5nZXRCb3goKTsNCiAgICAgICAgaWYodGhpcy5zcGxpdCl7DQogICAgICAgICAgICB2YXIgc2ggPSB0aGlzLnNwbGl0LmVsLmdldEhlaWdodCgpOw0KICAgICAgICAgICAgYm94LmhlaWdodCArPSBzaDsNCiAgICAgICAgICAgIGJveC55IC09IHNoOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBib3g7DQogICAgfSwNCiAgICANCiAgICB1cGRhdGVCb3ggOiBmdW5jdGlvbihib3gpew0KICAgICAgICBpZih0aGlzLnNwbGl0ICYmICF0aGlzLmNvbGxhcHNlZCl7DQogICAgICAgICAgICB2YXIgc2ggPSB0aGlzLnNwbGl0LmVsLmdldEhlaWdodCgpOw0KICAgICAgICAgICAgYm94LmhlaWdodCAtPSBzaDsNCiAgICAgICAgICAgIGJveC55ICs9IHNoOw0KICAgICAgICAgICAgdGhpcy5zcGxpdC5lbC5zZXRMZWZ0KGJveC54KTsNCiAgICAgICAgICAgIHRoaXMuc3BsaXQuZWwuc2V0VG9wKGJveC55LXNoKTsNCiAgICAgICAgICAgIHRoaXMuc3BsaXQuZWwuc2V0V2lkdGgoYm94LndpZHRoKTsNCiAgICAgICAgfQ0KICAgICAgICBpZih0aGlzLmNvbGxhcHNlZCl7DQogICAgICAgICAgICB0aGlzLnVwZGF0ZUJvZHkoYm94LndpZHRoLCBudWxsKTsNCiAgICAgICAgfQ0KICAgICAgICBFeHQuU291dGhMYXlvdXRSZWdpb24uc3VwZXJjbGFzcy51cGRhdGVCb3guY2FsbCh0aGlzLCBib3gpOw0KICAgIH0NCn0pOw0KDQpFeHQuRWFzdExheW91dFJlZ2lvbiA9IGZ1bmN0aW9uKG1nciwgY29uZmlnKXsNCiAgICBFeHQuRWFzdExheW91dFJlZ2lvbi5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgbWdyLCBjb25maWcsICJlYXN0IiwgImUtcmVzaXplIik7DQogICAgaWYodGhpcy5zcGxpdCl7DQogICAgICAgIHRoaXMuc3BsaXQucGxhY2VtZW50ID0gRXh0LlNwbGl0QmFyLlJJR0hUOw0KICAgICAgICB0aGlzLnNwbGl0Lm9yaWVudGF0aW9uID0gRXh0LlNwbGl0QmFyLkhPUklaT05UQUw7DQogICAgICAgIHRoaXMuc3BsaXQuZWwuYWRkQ2xhc3MoIngtbGF5b3V0LXNwbGl0LWgiKTsNCiAgICB9DQogICAgdmFyIHNpemUgPSBjb25maWcuaW5pdGlhbFNpemUgfHwgY29uZmlnLndpZHRoOw0KICAgIGlmKHR5cGVvZiBzaXplICE9ICJ1bmRlZmluZWQiKXsNCiAgICAgICAgdGhpcy5lbC5zZXRXaWR0aChzaXplKTsNCiAgICB9DQp9Ow0KRXh0LmV4dGVuZChFeHQuRWFzdExheW91dFJlZ2lvbiwgRXh0LlNwbGl0TGF5b3V0UmVnaW9uLCB7DQogICAgb3JpZW50YXRpb246IEV4dC5TcGxpdEJhci5IT1JJWk9OVEFMLA0KICAgIGdldEJveCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIGlmKHRoaXMuY29sbGFwc2VkKXsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbGxhcHNlZEVsLmdldEJveCgpOw0KICAgICAgICB9DQogICAgICAgIHZhciBib3ggPSB0aGlzLmVsLmdldEJveCgpOw0KICAgICAgICBpZih0aGlzLnNwbGl0KXsNCiAgICAgICAgICAgIHZhciBzdyA9IHRoaXMuc3BsaXQuZWwuZ2V0V2lkdGgoKTsNCiAgICAgICAgICAgIGJveC53aWR0aCArPSBzdzsNCiAgICAgICAgICAgIGJveC54IC09IHN3Ow0KICAgICAgICB9DQogICAgICAgIHJldHVybiBib3g7DQogICAgfSwNCg0KICAgIHVwZGF0ZUJveCA6IGZ1bmN0aW9uKGJveCl7DQogICAgICAgIGlmKHRoaXMuc3BsaXQgJiYgIXRoaXMuY29sbGFwc2VkKXsNCiAgICAgICAgICAgIHZhciBzdyA9IHRoaXMuc3BsaXQuZWwuZ2V0V2lkdGgoKTsNCiAgICAgICAgICAgIGJveC53aWR0aCAtPSBzdzsNCiAgICAgICAgICAgIHRoaXMuc3BsaXQuZWwuc2V0TGVmdChib3gueCk7DQogICAgICAgICAgICB0aGlzLnNwbGl0LmVsLnNldFRvcChib3gueSk7DQogICAgICAgICAgICB0aGlzLnNwbGl0LmVsLnNldEhlaWdodChib3guaGVpZ2h0KTsNCiAgICAgICAgICAgIGJveC54ICs9IHN3Ow0KICAgICAgICB9DQogICAgICAgIGlmKHRoaXMuY29sbGFwc2VkKXsNCiAgICAgICAgICAgIHRoaXMudXBkYXRlQm9keShudWxsLCBib3guaGVpZ2h0KTsNCiAgICAgICAgfQ0KICAgICAgICBFeHQuRWFzdExheW91dFJlZ2lvbi5zdXBlcmNsYXNzLnVwZGF0ZUJveC5jYWxsKHRoaXMsIGJveCk7DQogICAgfQ0KfSk7DQoNCkV4dC5XZXN0TGF5b3V0UmVnaW9uID0gZnVuY3Rpb24obWdyLCBjb25maWcpew0KICAgIEV4dC5XZXN0TGF5b3V0UmVnaW9uLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBtZ3IsIGNvbmZpZywgIndlc3QiLCAidy1yZXNpemUiKTsNCiAgICBpZih0aGlzLnNwbGl0KXsNCiAgICAgICAgdGhpcy5zcGxpdC5wbGFjZW1lbnQgPSBFeHQuU3BsaXRCYXIuTEVGVDsNCiAgICAgICAgdGhpcy5zcGxpdC5vcmllbnRhdGlvbiA9IEV4dC5TcGxpdEJhci5IT1JJWk9OVEFMOw0KICAgICAgICB0aGlzLnNwbGl0LmVsLmFkZENsYXNzKCJ4LWxheW91dC1zcGxpdC1oIik7DQogICAgfQ0KICAgIHZhciBzaXplID0gY29uZmlnLmluaXRpYWxTaXplIHx8IGNvbmZpZy53aWR0aDsNCiAgICBpZih0eXBlb2Ygc2l6ZSAhPSAidW5kZWZpbmVkIil7DQogICAgICAgIHRoaXMuZWwuc2V0V2lkdGgoc2l6ZSk7DQogICAgfQ0KfTsNCkV4dC5leHRlbmQoRXh0Lldlc3RMYXlvdXRSZWdpb24sIEV4dC5TcGxpdExheW91dFJlZ2lvbiwgew0KICAgIG9yaWVudGF0aW9uOiBFeHQuU3BsaXRCYXIuSE9SSVpPTlRBTCwNCiAgICBnZXRCb3ggOiBmdW5jdGlvbigpew0KICAgICAgICBpZih0aGlzLmNvbGxhcHNlZCl7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5jb2xsYXBzZWRFbC5nZXRCb3goKTsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgYm94ID0gdGhpcy5lbC5nZXRCb3goKTsNCiAgICAgICAgaWYodGhpcy5zcGxpdCl7DQogICAgICAgICAgICBib3gud2lkdGggKz0gdGhpcy5zcGxpdC5lbC5nZXRXaWR0aCgpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBib3g7DQogICAgfSwNCiAgICANCiAgICB1cGRhdGVCb3ggOiBmdW5jdGlvbihib3gpew0KICAgICAgICBpZih0aGlzLnNwbGl0ICYmICF0aGlzLmNvbGxhcHNlZCl7DQogICAgICAgICAgICB2YXIgc3cgPSB0aGlzLnNwbGl0LmVsLmdldFdpZHRoKCk7DQogICAgICAgICAgICBib3gud2lkdGggLT0gc3c7DQogICAgICAgICAgICB0aGlzLnNwbGl0LmVsLnNldExlZnQoYm94LngrYm94LndpZHRoKTsNCiAgICAgICAgICAgIHRoaXMuc3BsaXQuZWwuc2V0VG9wKGJveC55KTsNCiAgICAgICAgICAgIHRoaXMuc3BsaXQuZWwuc2V0SGVpZ2h0KGJveC5oZWlnaHQpOw0KICAgICAgICB9DQogICAgICAgIGlmKHRoaXMuY29sbGFwc2VkKXsNCiAgICAgICAgICAgIHRoaXMudXBkYXRlQm9keShudWxsLCBib3guaGVpZ2h0KTsNCiAgICAgICAgfQ0KICAgICAgICBFeHQuV2VzdExheW91dFJlZ2lvbi5zdXBlcmNsYXNzLnVwZGF0ZUJveC5jYWxsKHRoaXMsIGJveCk7DQogICAgfQ0KfSk7DQoKDQpFeHQuTGF5b3V0U3RhdGVNYW5hZ2VyID0gZnVuY3Rpb24obGF5b3V0KXsNCiAgICAgCiAgICAgdGhpcy5zdGF0ZSA9IHsNCiAgICAgICAgbm9ydGg6IHt9LA0KICAgICAgICBzb3V0aDoge30sDQogICAgICAgIGVhc3Q6IHt9LA0KICAgICAgICB3ZXN0OiB7fSAgICAgICANCiAgICB9Ow0KfTsNCg0KRXh0LkxheW91dFN0YXRlTWFuYWdlci5wcm90b3R5cGUgPSB7DQogICAgaW5pdCA6IGZ1bmN0aW9uKGxheW91dCwgcHJvdmlkZXIpew0KICAgICAgICB0aGlzLnByb3ZpZGVyID0gcHJvdmlkZXI7DQogICAgICAgIHZhciBzdGF0ZSA9IHByb3ZpZGVyLmdldChsYXlvdXQuaWQrIi1sYXlvdXQtc3RhdGUiKTsNCiAgICAgICAgaWYoc3RhdGUpew0KICAgICAgICAgICAgdmFyIHdhc1VwZGF0aW5nID0gbGF5b3V0LmlzVXBkYXRpbmcoKTsNCiAgICAgICAgICAgIGlmKCF3YXNVcGRhdGluZyl7DQogICAgICAgICAgICAgICAgbGF5b3V0LmJlZ2luVXBkYXRlKCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBmb3IodmFyIGtleSBpbiBzdGF0ZSl7DQogICAgICAgICAgICAgICAgaWYodHlwZW9mIHN0YXRlW2tleV0gIT0gImZ1bmN0aW9uIil7DQogICAgICAgICAgICAgICAgICAgIHZhciByc3RhdGUgPSBzdGF0ZVtrZXldOw0KICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGxheW91dC5nZXRSZWdpb24oa2V5KTsNCiAgICAgICAgICAgICAgICAgICAgaWYociAmJiByc3RhdGUpew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYocnN0YXRlLnNpemUpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIucmVzaXplVG8ocnN0YXRlLnNpemUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYocnN0YXRlLmNvbGxhcHNlZCA9PSB0cnVlKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmNvbGxhcHNlKHRydWUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgci5leHBhbmQobnVsbCwgdHJ1ZSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZighd2FzVXBkYXRpbmcpew0KICAgICAgICAgICAgICAgIGxheW91dC5lbmRVcGRhdGUoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsgDQogICAgICAgIH0NCiAgICAgICAgdGhpcy5sYXlvdXQgPSBsYXlvdXQ7DQogICAgICAgIGxheW91dC5vbigicmVnaW9ucmVzaXplZCIsIHRoaXMub25SZWdpb25SZXNpemVkLCB0aGlzKTsNCiAgICAgICAgbGF5b3V0Lm9uKCJyZWdpb25jb2xsYXBzZWQiLCB0aGlzLm9uUmVnaW9uQ29sbGFwc2VkLCB0aGlzKTsNCiAgICAgICAgbGF5b3V0Lm9uKCJyZWdpb25leHBhbmRlZCIsIHRoaXMub25SZWdpb25FeHBhbmRlZCwgdGhpcyk7DQogICAgfSwNCiAgICANCiAgICBzdG9yZVN0YXRlIDogZnVuY3Rpb24oKXsNCiAgICAgICAgdGhpcy5wcm92aWRlci5zZXQodGhpcy5sYXlvdXQuaWQrIi1sYXlvdXQtc3RhdGUiLCB0aGlzLnN0YXRlKTsNCiAgICB9LA0KICAgIA0KICAgIG9uUmVnaW9uUmVzaXplZCA6IGZ1bmN0aW9uKHJlZ2lvbiwgbmV3U2l6ZSl7DQogICAgICAgIHRoaXMuc3RhdGVbcmVnaW9uLmdldFBvc2l0aW9uKCldLnNpemUgPSBuZXdTaXplOw0KICAgICAgICB0aGlzLnN0b3JlU3RhdGUoKTsNCiAgICB9LA0KICAgIA0KICAgIG9uUmVnaW9uQ29sbGFwc2VkIDogZnVuY3Rpb24ocmVnaW9uKXsNCiAgICAgICAgdGhpcy5zdGF0ZVtyZWdpb24uZ2V0UG9zaXRpb24oKV0uY29sbGFwc2VkID0gdHJ1ZTsNCiAgICAgICAgdGhpcy5zdG9yZVN0YXRlKCk7DQogICAgfSwNCiAgICANCiAgICBvblJlZ2lvbkV4cGFuZGVkIDogZnVuY3Rpb24ocmVnaW9uKXsNCiAgICAgICAgdGhpcy5zdGF0ZVtyZWdpb24uZ2V0UG9zaXRpb24oKV0uY29sbGFwc2VkID0gZmFsc2U7DQogICAgICAgIHRoaXMuc3RvcmVTdGF0ZSgpOw0KICAgIH0NCn07Cg0KRXh0LkNvbnRlbnRQYW5lbCA9IGZ1bmN0aW9uKGVsLCBjb25maWcsIGNvbnRlbnQpew0KICAgIGlmKGVsLmF1dG9DcmVhdGUpew0KICAgICAgICBjb25maWcgPSBlbDsNCiAgICAgICAgZWwgPSBFeHQuaWQoKTsNCiAgICB9DQogICAgdGhpcy5lbCA9IEV4dC5nZXQoZWwpOw0KICAgIGlmKCF0aGlzLmVsICYmIGNvbmZpZyAmJiBjb25maWcuYXV0b0NyZWF0ZSl7DQogICAgICAgIGlmKHR5cGVvZiBjb25maWcuYXV0b0NyZWF0ZSA9PSAib2JqZWN0Iil7DQogICAgICAgICAgICBpZighY29uZmlnLmF1dG9DcmVhdGUuaWQpew0KICAgICAgICAgICAgICAgIGNvbmZpZy5hdXRvQ3JlYXRlLmlkID0gY29uZmlnLmlkfHxlbDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMuZWwgPSBFeHQuRG9tSGVscGVyLmFwcGVuZChkb2N1bWVudC5ib2R5LA0KICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmF1dG9DcmVhdGUsIHRydWUpOw0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIHRoaXMuZWwgPSBFeHQuRG9tSGVscGVyLmFwcGVuZChkb2N1bWVudC5ib2R5LA0KICAgICAgICAgICAgICAgICAgICAgICAge3RhZzogImRpdiIsIGNsczogIngtbGF5b3V0LWluYWN0aXZlLWNvbnRlbnQiLCBpZDogY29uZmlnLmlkfHxlbH0sIHRydWUpOw0KICAgICAgICB9DQogICAgfQ0KICAgIHRoaXMuY2xvc2FibGUgPSBmYWxzZTsNCiAgICB0aGlzLmxvYWRlZCA9IGZhbHNlOw0KICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7DQogICAgaWYodHlwZW9mIGNvbmZpZyA9PSAic3RyaW5nIil7DQogICAgICAgIHRoaXMudGl0bGUgPSBjb25maWc7DQogICAgfWVsc2V7DQogICAgICAgIEV4dC5hcHBseSh0aGlzLCBjb25maWcpOw0KICAgIH0NCiAgICBpZih0aGlzLnJlc2l6ZUVsKXsNCiAgICAgICAgdGhpcy5yZXNpemVFbCA9IEV4dC5nZXQodGhpcy5yZXNpemVFbCwgdHJ1ZSk7DQogICAgfWVsc2V7DQogICAgICAgIHRoaXMucmVzaXplRWwgPSB0aGlzLmVsOw0KICAgIH0NCiAgICB0aGlzLmFkZEV2ZW50cyh7DQogICAgICAgIA0KICAgICAgICAiYWN0aXZhdGUiIDogdHJ1ZSwNCiAgICAgICAgDQogICAgICAgICJkZWFjdGl2YXRlIiA6IHRydWUsDQoNCiAgICAgICAgDQogICAgICAgICJyZXNpemUiIDogdHJ1ZQ0KICAgIH0pOw0KICAgIGlmKHRoaXMuYXV0b1Njcm9sbCl7DQogICAgICAgIHRoaXMucmVzaXplRWwuc2V0U3R5bGUoIm92ZXJmbG93IiwgImF1dG8iKTsNCiAgICB9DQogICAgY29udGVudCA9IGNvbnRlbnQgfHwgdGhpcy5jb250ZW50Ow0KICAgIGlmKGNvbnRlbnQpew0KICAgICAgICB0aGlzLnNldENvbnRlbnQoY29udGVudCk7DQogICAgfQ0KICAgIGlmKGNvbmZpZyAmJiBjb25maWcudXJsKXsNCiAgICAgICAgdGhpcy5zZXRVcmwodGhpcy51cmwsIHRoaXMucGFyYW1zLCB0aGlzLmxvYWRPbmNlKTsNCiAgICB9DQogICAgRXh0LkNvbnRlbnRQYW5lbC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7DQp9Ow0KDQpFeHQuZXh0ZW5kKEV4dC5Db250ZW50UGFuZWwsIEV4dC51dGlsLk9ic2VydmFibGUsIHsNCiAgICB0YWJUaXA6JycsDQogICAgc2V0UmVnaW9uIDogZnVuY3Rpb24ocmVnaW9uKXsNCiAgICAgICAgdGhpcy5yZWdpb24gPSByZWdpb247DQogICAgICAgIGlmKHJlZ2lvbil7DQogICAgICAgICAgIHRoaXMuZWwucmVwbGFjZUNsYXNzKCJ4LWxheW91dC1pbmFjdGl2ZS1jb250ZW50IiwgIngtbGF5b3V0LWFjdGl2ZS1jb250ZW50Iik7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICB0aGlzLmVsLnJlcGxhY2VDbGFzcygieC1sYXlvdXQtYWN0aXZlLWNvbnRlbnQiLCAieC1sYXlvdXQtaW5hY3RpdmUtY29udGVudCIpOw0KICAgICAgICB9IA0KICAgIH0sDQogICAgDQogICAgDQogICAgZ2V0VG9vbGJhciA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLnRvb2xiYXI7DQogICAgfSwNCiAgICANCiAgICBzZXRBY3RpdmVTdGF0ZSA6IGZ1bmN0aW9uKGFjdGl2ZSl7DQogICAgICAgIHRoaXMuYWN0aXZlID0gYWN0aXZlOw0KICAgICAgICBpZighYWN0aXZlKXsNCiAgICAgICAgICAgIHRoaXMuZmlyZUV2ZW50KCJkZWFjdGl2YXRlIiwgdGhpcyk7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoImFjdGl2YXRlIiwgdGhpcyk7DQogICAgICAgIH0NCiAgICB9LA0KICAgIA0KICAgIHNldENvbnRlbnQgOiBmdW5jdGlvbihjb250ZW50LCBsb2FkU2NyaXB0cyl7DQogICAgICAgIHRoaXMuZWwudXBkYXRlKGNvbnRlbnQsIGxvYWRTY3JpcHRzKTsNCiAgICB9LA0KDQogICAgaWdub3JlUmVzaXplIDogZnVuY3Rpb24odywgaCl7DQogICAgICAgIGlmKHRoaXMubGFzdFNpemUgJiYgdGhpcy5sYXN0U2l6ZS53aWR0aCA9PSB3ICYmIHRoaXMubGFzdFNpemUuaGVpZ2h0ID09IGgpew0KICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgdGhpcy5sYXN0U2l6ZSA9IHt3aWR0aDogdywgaGVpZ2h0OiBofTsNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfQ0KICAgIH0sDQogICAgDQogICAgZ2V0VXBkYXRlTWFuYWdlciA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLmVsLmdldFVwZGF0ZU1hbmFnZXIoKTsNCiAgICB9LA0KICAgICANCiAgICBsb2FkIDogZnVuY3Rpb24oKXsNCiAgICAgICAgdmFyIHVtID0gdGhpcy5lbC5nZXRVcGRhdGVNYW5hZ2VyKCk7DQogICAgICAgIHVtLnVwZGF0ZS5hcHBseSh1bSwgYXJndW1lbnRzKTsNCiAgICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSwNCg0KDQogICAgDQogICAgc2V0VXJsIDogZnVuY3Rpb24odXJsLCBwYXJhbXMsIGxvYWRPbmNlKXsNCiAgICAgICAgaWYodGhpcy5yZWZyZXNoRGVsZWdhdGUpew0KICAgICAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcigiYWN0aXZhdGUiLCB0aGlzLnJlZnJlc2hEZWxlZ2F0ZSk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5yZWZyZXNoRGVsZWdhdGUgPSB0aGlzLl9oYW5kbGVSZWZyZXNoLmNyZWF0ZURlbGVnYXRlKHRoaXMsIFt1cmwsIHBhcmFtcywgbG9hZE9uY2VdKTsNCiAgICAgICAgdGhpcy5vbigiYWN0aXZhdGUiLCB0aGlzLnJlZnJlc2hEZWxlZ2F0ZSk7DQogICAgICAgIHJldHVybiB0aGlzLmVsLmdldFVwZGF0ZU1hbmFnZXIoKTsNCiAgICB9LA0KICAgIA0KICAgIF9oYW5kbGVSZWZyZXNoIDogZnVuY3Rpb24odXJsLCBwYXJhbXMsIGxvYWRPbmNlKXsNCiAgICAgICAgaWYoIWxvYWRPbmNlIHx8ICF0aGlzLmxvYWRlZCl7DQogICAgICAgICAgICB2YXIgdXBkYXRlciA9IHRoaXMuZWwuZ2V0VXBkYXRlTWFuYWdlcigpOw0KICAgICAgICAgICAgdXBkYXRlci51cGRhdGUodXJsLCBwYXJhbXMsIHRoaXMuX3NldExvYWRlZC5jcmVhdGVEZWxlZ2F0ZSh0aGlzKSk7DQogICAgICAgIH0NCiAgICB9LA0KICAgIA0KICAgIF9zZXRMb2FkZWQgOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLmxvYWRlZCA9IHRydWU7DQogICAgfSwgDQogICAgDQogICAgDQogICAgZ2V0SWQgOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gdGhpcy5lbC5pZDsNCiAgICB9LA0KICAgIA0KICAgIA0KICAgIGdldEVsIDogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIHRoaXMuZWw7DQogICAgfSwNCiAgICANCiAgICBhZGp1c3RGb3JDb21wb25lbnRzIDogZnVuY3Rpb24od2lkdGgsIGhlaWdodCl7DQogICAgICAgIGlmKHRoaXMucmVzaXplRWwgIT0gdGhpcy5lbCl7DQogICAgICAgICAgICB3aWR0aCAtPSB0aGlzLmVsLmdldEZyYW1lV2lkdGgoJ2xyJyk7DQogICAgICAgICAgICBoZWlnaHQgLT0gdGhpcy5lbC5nZXRGcmFtZVdpZHRoKCd0YicpOw0KICAgICAgICB9DQogICAgICAgIGlmKHRoaXMudG9vbGJhcil7DQogICAgICAgICAgICB2YXIgdGUgPSB0aGlzLnRvb2xiYXIuZ2V0RWwoKTsNCiAgICAgICAgICAgIGhlaWdodCAtPSB0ZS5nZXRIZWlnaHQoKTsNCiAgICAgICAgICAgIHRlLnNldFdpZHRoKHdpZHRoKTsNCiAgICAgICAgfQ0KICAgICAgICBpZih0aGlzLmFkanVzdG1lbnRzKXsNCiAgICAgICAgICAgIHdpZHRoICs9IHRoaXMuYWRqdXN0bWVudHNbMF07DQogICAgICAgICAgICBoZWlnaHQgKz0gdGhpcy5hZGp1c3RtZW50c1sxXTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4geyJ3aWR0aCI6IHdpZHRoLCAiaGVpZ2h0IjogaGVpZ2h0fTsNCiAgICB9LA0KICAgIA0KICAgIHNldFNpemUgOiBmdW5jdGlvbih3aWR0aCwgaGVpZ2h0KXsNCiAgICAgICAgaWYodGhpcy5maXRUb0ZyYW1lICYmICF0aGlzLmlnbm9yZVJlc2l6ZSh3aWR0aCwgaGVpZ2h0KSl7DQogICAgICAgICAgICBpZih0aGlzLmZpdENvbnRhaW5lciAmJiB0aGlzLnJlc2l6ZUVsICE9IHRoaXMuZWwpew0KICAgICAgICAgICAgICAgIHRoaXMuZWwuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHZhciBzaXplID0gdGhpcy5hZGp1c3RGb3JDb21wb25lbnRzKHdpZHRoLCBoZWlnaHQpOw0KICAgICAgICAgICAgdGhpcy5yZXNpemVFbC5zZXRTaXplKHRoaXMuYXV0b1dpZHRoID8gImF1dG8iIDogc2l6ZS53aWR0aCwgdGhpcy5hdXRvSGVpZ2h0ID8gImF1dG8iIDogc2l6ZS5oZWlnaHQpOw0KICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoJ3Jlc2l6ZScsIHRoaXMsIHNpemUud2lkdGgsIHNpemUuaGVpZ2h0KTsNCiAgICAgICAgfQ0KICAgIH0sDQogICAgDQogICAgDQogICAgZ2V0VGl0bGUgOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gdGhpcy50aXRsZTsNCiAgICB9LA0KICAgIA0KICAgIA0KICAgIHNldFRpdGxlIDogZnVuY3Rpb24odGl0bGUpew0KICAgICAgICB0aGlzLnRpdGxlID0gdGl0bGU7DQogICAgICAgIGlmKHRoaXMucmVnaW9uKXsNCiAgICAgICAgICAgIHRoaXMucmVnaW9uLnVwZGF0ZVBhbmVsVGl0bGUodGhpcywgdGl0bGUpOw0KICAgICAgICB9DQogICAgfSwNCiAgICANCiAgICANCiAgICBpc0Nsb3NhYmxlIDogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIHRoaXMuY2xvc2FibGU7DQogICAgfSwNCiAgICANCiAgICBiZWZvcmVTbGlkZSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHRoaXMuZWwuY2xpcCgpOw0KICAgICAgICB0aGlzLnJlc2l6ZUVsLmNsaXAoKTsNCiAgICB9LA0KICAgIA0KICAgIGFmdGVyU2xpZGUgOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLmVsLnVuY2xpcCgpOw0KICAgICAgICB0aGlzLnJlc2l6ZUVsLnVuY2xpcCgpOw0KICAgIH0sDQogICAgDQogICAgDQogICAgcmVmcmVzaCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIGlmKHRoaXMucmVmcmVzaERlbGVnYXRlKXsNCiAgICAgICAgICAgdGhpcy5sb2FkZWQgPSBmYWxzZTsNCiAgICAgICAgICAgdGhpcy5yZWZyZXNoRGVsZWdhdGUoKTsNCiAgICAgICAgfQ0KICAgIH0sDQogICAgDQogICAgDQogICAgZGVzdHJveSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHRoaXMuZWwucmVtb3ZlQWxsTGlzdGVuZXJzKCk7DQogICAgICAgIHZhciB0ZW1wRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7DQogICAgICAgIHRlbXBFbC5hcHBlbmRDaGlsZCh0aGlzLmVsLmRvbSk7DQogICAgICAgIHRlbXBFbC5pbm5lckhUTUwgPSAiIjsNCiAgICAgICAgdGhpcy5lbC5yZW1vdmUoKTsNCiAgICAgICAgdGhpcy5lbCA9IG51bGw7DQogICAgfQ0KfSk7DQoNCg0KRXh0LkdyaWRQYW5lbCA9IGZ1bmN0aW9uKGdyaWQsIGNvbmZpZyl7DQogICAgdGhpcy53cmFwcGVyID0gRXh0LkRvbUhlbHBlci5hcHBlbmQoZG9jdW1lbnQuYm9keSwgCiAgICAgICAge3RhZzogImRpdiIsIGNsczogIngtbGF5b3V0LWdyaWQtd3JhcHBlciB4LWxheW91dC1pbmFjdGl2ZS1jb250ZW50In0sIHRydWUpOw0KICAgIHRoaXMud3JhcHBlci5kb20uYXBwZW5kQ2hpbGQoZ3JpZC5nZXRHcmlkRWwoKS5kb20pOw0KICAgIEV4dC5HcmlkUGFuZWwuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHRoaXMud3JhcHBlciwgY29uZmlnKTsNCiAgICBpZih0aGlzLnRvb2xiYXIpew0KICAgICAgICB0aGlzLnRvb2xiYXIuZWwuaW5zZXJ0QmVmb3JlKHRoaXMud3JhcHBlci5kb20uZmlyc3RDaGlsZCk7DQogICAgfQ0KICAgIGdyaWQubW9uaXRvcldpbmRvd1Jlc2l6ZSA9IGZhbHNlOyAKICAgIGdyaWQuYXV0b0hlaWdodCA9IGZhbHNlOw0KICAgIGdyaWQuYXV0b1dpZHRoID0gZmFsc2U7DQogICAgdGhpcy5ncmlkID0gZ3JpZDsNCiAgICB0aGlzLmdyaWQuZ2V0R3JpZEVsKCkucmVwbGFjZUNsYXNzKCJ4LWxheW91dC1pbmFjdGl2ZS1jb250ZW50IiwgIngtbGF5b3V0LWNvbXBvbmVudC1wYW5lbCIpOw0KfTsNCg0KRXh0LmV4dGVuZChFeHQuR3JpZFBhbmVsLCBFeHQuQ29udGVudFBhbmVsLCB7DQogICAgZ2V0SWQgOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gdGhpcy5ncmlkLmlkOw0KICAgIH0sDQogICAgDQogICAgDQogICAgZ2V0R3JpZCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLmdyaWQ7ICAgIA0KICAgIH0sDQogICAgDQogICAgc2V0U2l6ZSA6IGZ1bmN0aW9uKHdpZHRoLCBoZWlnaHQpew0KICAgICAgICBpZighdGhpcy5pZ25vcmVSZXNpemUod2lkdGgsIGhlaWdodCkpew0KICAgICAgICAgICAgdmFyIGdyaWQgPSB0aGlzLmdyaWQ7DQogICAgICAgICAgICB2YXIgc2l6ZSA9IHRoaXMuYWRqdXN0Rm9yQ29tcG9uZW50cyh3aWR0aCwgaGVpZ2h0KTsNCiAgICAgICAgICAgIGdyaWQuZ2V0R3JpZEVsKCkuc2V0U2l6ZShzaXplLndpZHRoLCBzaXplLmhlaWdodCk7DQogICAgICAgICAgICBncmlkLmF1dG9TaXplKCk7DQogICAgICAgIH0NCiAgICB9LA0KICAgIA0KICAgIGJlZm9yZVNsaWRlIDogZnVuY3Rpb24oKXsNCiAgICAgICAgdGhpcy5ncmlkLmdldFZpZXcoKS5zY3JvbGxlci5jbGlwKCk7DQogICAgfSwNCiAgICANCiAgICBhZnRlclNsaWRlIDogZnVuY3Rpb24oKXsNCiAgICAgICAgdGhpcy5ncmlkLmdldFZpZXcoKS5zY3JvbGxlci51bmNsaXAoKTsNCiAgICB9LA0KICAgIA0KICAgIGRlc3Ryb3kgOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLmdyaWQuZGVzdHJveSgpOw0KICAgICAgICBkZWxldGUgdGhpcy5ncmlkOw0KICAgICAgICBFeHQuR3JpZFBhbmVsLnN1cGVyY2xhc3MuZGVzdHJveS5jYWxsKHRoaXMpOyANCiAgICB9DQp9KTsNCg0KDQoNCkV4dC5OZXN0ZWRMYXlvdXRQYW5lbCA9IGZ1bmN0aW9uKGxheW91dCwgY29uZmlnKXsNCiAgICBFeHQuTmVzdGVkTGF5b3V0UGFuZWwuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIGxheW91dC5nZXRFbCgpLCBjb25maWcpOw0KICAgIGxheW91dC5tb25pdG9yV2luZG93UmVzaXplID0gZmFsc2U7IAogICAgdGhpcy5sYXlvdXQgPSBsYXlvdXQ7DQogICAgdGhpcy5sYXlvdXQuZ2V0RWwoKS5hZGRDbGFzcygieC1sYXlvdXQtbmVzdGVkLWxheW91dCIpOw0KfTsNCg0KRXh0LmV4dGVuZChFeHQuTmVzdGVkTGF5b3V0UGFuZWwsIEV4dC5Db250ZW50UGFuZWwsIHsNCg0KICAgIHNldFNpemUgOiBmdW5jdGlvbih3aWR0aCwgaGVpZ2h0KXsNCiAgICAgICAgaWYoIXRoaXMuaWdub3JlUmVzaXplKHdpZHRoLCBoZWlnaHQpKXsNCiAgICAgICAgICAgIHZhciBzaXplID0gdGhpcy5hZGp1c3RGb3JDb21wb25lbnRzKHdpZHRoLCBoZWlnaHQpOw0KICAgICAgICAgICAgdmFyIGVsID0gdGhpcy5sYXlvdXQuZ2V0RWwoKTsNCiAgICAgICAgICAgIGVsLnNldFNpemUoc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQpOw0KICAgICAgICAgICAgdmFyIHRvdWNoID0gZWwuZG9tLm9mZnNldFdpZHRoOw0KICAgICAgICAgICAgdGhpcy5sYXlvdXQubGF5b3V0KCk7DQogICAgICAgICAgICAKICAgICAgICAgICAgaWYoRXh0LmlzSUUgJiYgIXRoaXMuaW5pdGlhbGl6ZWQpew0KICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlOw0KICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0LmxheW91dCgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSwNCiAgICANCiAgICANCiAgICBnZXRMYXlvdXQgOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gdGhpcy5sYXlvdXQ7DQogICAgfQ0KfSk7DQoNCkV4dC5TY3JvbGxQYW5lbCA9IGZ1bmN0aW9uKGVsLCBjb25maWcsIGNvbnRlbnQpew0KICAgIGNvbmZpZyA9IGNvbmZpZyB8fCB7fTsNCiAgICBjb25maWcuZml0VG9GcmFtZSA9IHRydWU7DQogICAgRXh0LlNjcm9sbFBhbmVsLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBlbCwgY29uZmlnLCBjb250ZW50KTsNCiAgICANCiAgICB0aGlzLmVsLmRvbS5zdHlsZS5vdmVyZmxvdyA9ICJoaWRkZW4iOw0KICAgIHZhciB3cmFwID0gdGhpcy5lbC53cmFwKHtjbHM6ICJ4LXNjcm9sbGVyIHgtbGF5b3V0LWluYWN0aXZlLWNvbnRlbnQifSk7DQogICAgdGhpcy5lbC5yZW1vdmVDbGFzcygieC1sYXlvdXQtaW5hY3RpdmUtY29udGVudCIpOw0KICAgIHRoaXMuZWwub24oIm1vdXNld2hlZWwiLCB0aGlzLm9uV2hlZWwsIHRoaXMpOw0KDQogICAgdmFyIHVwID0gd3JhcC5jcmVhdGVDaGlsZCh7Y2xzOiAieC1zY3JvbGxlci11cCIsIGh0bWw6ICImIzE2MDsifSwgdGhpcy5lbC5kb20pOw0KICAgIHZhciBkb3duID0gd3JhcC5jcmVhdGVDaGlsZCh7Y2xzOiAieC1zY3JvbGxlci1kb3duIiwgaHRtbDogIiYjMTYwOyJ9KTsNCiAgICB1cC51bnNlbGVjdGFibGUoKTsgZG93bi51bnNlbGVjdGFibGUoKTsNCiAgICB1cC5vbigiY2xpY2siLCB0aGlzLnNjcm9sbFVwLCB0aGlzKTsNCiAgICBkb3duLm9uKCJjbGljayIsIHRoaXMuc2Nyb2xsRG93biwgdGhpcyk7DQogICAgdXAuYWRkQ2xhc3NPbk92ZXIoIngtc2Nyb2xsZXItYnRuLW92ZXIiKTsNCiAgICBkb3duLmFkZENsYXNzT25PdmVyKCJ4LXNjcm9sbGVyLWJ0bi1vdmVyIik7DQogICAgdXAuYWRkQ2xhc3NPbkNsaWNrKCJ4LXNjcm9sbGVyLWJ0bi1jbGljayIpOw0KICAgIGRvd24uYWRkQ2xhc3NPbkNsaWNrKCJ4LXNjcm9sbGVyLWJ0bi1jbGljayIpOw0KICAgIHRoaXMuYWRqdXN0bWVudHMgPSBbMCwgLSh1cC5nZXRIZWlnaHQoKSArIGRvd24uZ2V0SGVpZ2h0KCkpXTsNCg0KICAgIHRoaXMucmVzaXplRWwgPSB0aGlzLmVsOw0KICAgIHRoaXMuZWwgPSB3cmFwOyB0aGlzLnVwID0gdXA7IHRoaXMuZG93biA9IGRvd247DQp9Ow0KDQpFeHQuZXh0ZW5kKEV4dC5TY3JvbGxQYW5lbCwgRXh0LkNvbnRlbnRQYW5lbCwgew0KICAgIGluY3JlbWVudCA6IDEwMCwNCiAgICB3aGVlbEluY3JlbWVudCA6IDUsDQogICAgc2Nyb2xsVXAgOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLnJlc2l6ZUVsLnNjcm9sbCgidXAiLCB0aGlzLmluY3JlbWVudCwge2NhbGxiYWNrOiB0aGlzLmFmdGVyU2Nyb2xsLCBzY29wZTogdGhpc30pOw0KICAgIH0sDQoNCiAgICBzY3JvbGxEb3duIDogZnVuY3Rpb24oKXsNCiAgICAgICAgdGhpcy5yZXNpemVFbC5zY3JvbGwoImRvd24iLCB0aGlzLmluY3JlbWVudCwge2NhbGxiYWNrOiB0aGlzLmFmdGVyU2Nyb2xsLCBzY29wZTogdGhpc30pOw0KICAgIH0sDQoNCiAgICBhZnRlclNjcm9sbCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHZhciBlbCA9IHRoaXMucmVzaXplRWw7DQogICAgICAgIHZhciB0ID0gZWwuZG9tLnNjcm9sbFRvcCwgaCA9IGVsLmRvbS5zY3JvbGxIZWlnaHQsIGNoID0gZWwuZG9tLmNsaWVudEhlaWdodDsNCiAgICAgICAgdGhpcy51cFt0ID09IDAgPyAiYWRkQ2xhc3MiIDogInJlbW92ZUNsYXNzIl0oIngtc2Nyb2xsZXItYnRuLWRpc2FibGVkIik7DQogICAgICAgIHRoaXMuZG93bltoIC0gdCA8PSBjaCA/ICJhZGRDbGFzcyIgOiAicmVtb3ZlQ2xhc3MiXSgieC1zY3JvbGxlci1idG4tZGlzYWJsZWQiKTsNCiAgICB9LA0KDQogICAgc2V0U2l6ZSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIEV4dC5TY3JvbGxQYW5lbC5zdXBlcmNsYXNzLnNldFNpemUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCiAgICAgICAgdGhpcy5hZnRlclNjcm9sbCgpOw0KICAgIH0sDQoNCiAgICBvbldoZWVsIDogZnVuY3Rpb24oZSl7DQogICAgICAgIHZhciBkID0gZS5nZXRXaGVlbERlbHRhKCk7DQogICAgICAgIHRoaXMucmVzaXplRWwuZG9tLnNjcm9sbFRvcCAtPSAoZCp0aGlzLndoZWVsSW5jcmVtZW50KTsNCiAgICAgICAgdGhpcy5hZnRlclNjcm9sbCgpOw0KICAgICAgICBlLnN0b3BFdmVudCgpOw0KICAgIH0sDQoNCiAgICBzZXRDb250ZW50IDogZnVuY3Rpb24oY29udGVudCwgbG9hZFNjcmlwdHMpew0KICAgICAgICB0aGlzLnJlc2l6ZUVsLnVwZGF0ZShjb250ZW50LCBsb2FkU2NyaXB0cyk7DQogICAgfQ0KDQp9KTsKCkV4dC5SZWFkZXJMYXlvdXQgPSBmdW5jdGlvbihjb25maWcsIHJlbmRlclRvKXsKICAgIHZhciBjID0gY29uZmlnIHx8IHtzaXplOnt9fTsKICAgIEV4dC5SZWFkZXJMYXlvdXQuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHJlbmRlclRvIHx8IGRvY3VtZW50LmJvZHksIHsKICAgICAgICBub3J0aDogYy5ub3J0aCAhPT0gZmFsc2UgPyBFeHQuYXBwbHkoewogICAgICAgICAgICBzcGxpdDpmYWxzZSwKICAgICAgICAgICAgaW5pdGlhbFNpemU6IDMyLAogICAgICAgICAgICB0aXRsZWJhcjogZmFsc2UKICAgICAgICB9LCBjLm5vcnRoKSA6IGZhbHNlLAogICAgICAgIHdlc3Q6IGMud2VzdCAhPT0gZmFsc2UgPyBFeHQuYXBwbHkoewogICAgICAgICAgICBzcGxpdDp0cnVlLAogICAgICAgICAgICBpbml0aWFsU2l6ZTogMjAwLAogICAgICAgICAgICBtaW5TaXplOiAxNzUsCiAgICAgICAgICAgIG1heFNpemU6IDQwMCwKICAgICAgICAgICAgdGl0bGViYXI6IHRydWUsCiAgICAgICAgICAgIGNvbGxhcHNpYmxlOiB0cnVlLAogICAgICAgICAgICBhbmltYXRlOiB0cnVlLAogICAgICAgICAgICBtYXJnaW5zOntsZWZ0OjUscmlnaHQ6MCxib3R0b206NSx0b3A6NX0sCiAgICAgICAgICAgIGNtYXJnaW5zOntsZWZ0OjUscmlnaHQ6NSxib3R0b206NSx0b3A6NX0KICAgICAgICB9LCBjLndlc3QpIDogZmFsc2UsCiAgICAgICAgZWFzdDogYy5lYXN0ICE9PSBmYWxzZSA/IEV4dC5hcHBseSh7CiAgICAgICAgICAgIHNwbGl0OnRydWUsCiAgICAgICAgICAgIGluaXRpYWxTaXplOiAyMDAsCiAgICAgICAgICAgIG1pblNpemU6IDE3NSwKICAgICAgICAgICAgbWF4U2l6ZTogNDAwLAogICAgICAgICAgICB0aXRsZWJhcjogdHJ1ZSwKICAgICAgICAgICAgY29sbGFwc2libGU6IHRydWUsCiAgICAgICAgICAgIGFuaW1hdGU6IHRydWUsCiAgICAgICAgICAgIG1hcmdpbnM6e2xlZnQ6MCxyaWdodDo1LGJvdHRvbTo1LHRvcDo1fSwKICAgICAgICAgICAgY21hcmdpbnM6e2xlZnQ6NSxyaWdodDo1LGJvdHRvbTo1LHRvcDo1fQogICAgICAgIH0sIGMuZWFzdCkgOiBmYWxzZSwKICAgICAgICBjZW50ZXI6IEV4dC5hcHBseSh7CiAgICAgICAgICAgIHRhYlBvc2l0aW9uOiAndG9wJywKICAgICAgICAgICAgYXV0b1Njcm9sbDpmYWxzZSwKICAgICAgICAgICAgY2xvc2VPblRhYjogdHJ1ZSwKICAgICAgICAgICAgdGl0bGViYXI6ZmFsc2UsCiAgICAgICAgICAgIG1hcmdpbnM6e2xlZnQ6Yy53ZXN0IT09ZmFsc2UgPyAwIDogNSxyaWdodDpjLmVhc3QhPT1mYWxzZSA/IDAgOiA1LGJvdHRvbTo1LHRvcDoyfQogICAgICAgIH0sIGMuY2VudGVyKQogICAgfSk7CgogICAgdGhpcy5lbC5hZGRDbGFzcygneC1yZWFkZXInKTsKCiAgICB0aGlzLmJlZ2luVXBkYXRlKCk7CgogICAgdmFyIGlubmVyID0gbmV3IEV4dC5Cb3JkZXJMYXlvdXQoRXh0LmdldChkb2N1bWVudC5ib2R5KS5jcmVhdGVDaGlsZCgpLCB7CiAgICAgICAgc291dGg6IGMucHJldmlldyAhPT0gZmFsc2UgPyBFeHQuYXBwbHkoewogICAgICAgICAgICBzcGxpdDp0cnVlLAogICAgICAgICAgICBpbml0aWFsU2l6ZTogMjAwLAogICAgICAgICAgICBtaW5TaXplOiAxMDAsCiAgICAgICAgICAgIGF1dG9TY3JvbGw6dHJ1ZSwKICAgICAgICAgICAgY29sbGFwc2libGU6dHJ1ZSwKICAgICAgICAgICAgdGl0bGViYXI6IHRydWUsCiAgICAgICAgICAgIGNtYXJnaW5zOnt0b3A6NSxsZWZ0OjAsIHJpZ2h0OjAsIGJvdHRvbTowfQogICAgICAgIH0sIGMucHJldmlldykgOiBmYWxzZSwKICAgICAgICBjZW50ZXI6IEV4dC5hcHBseSh7CiAgICAgICAgICAgIGF1dG9TY3JvbGw6ZmFsc2UsCiAgICAgICAgICAgIHRpdGxlYmFyOmZhbHNlLAogICAgICAgICAgICBtaW5IZWlnaHQ6MjAwCiAgICAgICAgfSwgYy5saXN0VmlldykKICAgIH0pOwogICAgdGhpcy5hZGQoJ2NlbnRlcicsIG5ldyBFeHQuTmVzdGVkTGF5b3V0UGFuZWwoaW5uZXIsCiAgICAgICAgICAgIEV4dC5hcHBseSh7dGl0bGU6IGMubWFpblRpdGxlIHx8ICcnLHRhYlRpcDonJ30sYy5pbm5lclBhbmVsQ2ZnKSkpOwoKICAgIHRoaXMuZW5kVXBkYXRlKCk7CgogICAgdGhpcy5yZWdpb25zLnByZXZpZXcgPSBpbm5lci5nZXRSZWdpb24oJ3NvdXRoJyk7CiAgICB0aGlzLnJlZ2lvbnMubGlzdFZpZXcgPSBpbm5lci5nZXRSZWdpb24oJ2NlbnRlcicpOwp9OwoKRXh0LmV4dGVuZChFeHQuUmVhZGVyTGF5b3V0LCBFeHQuQm9yZGVyTGF5b3V0KTsKDQpFeHQuZ3JpZC5HcmlkID0gZnVuY3Rpb24oY29udGFpbmVyLCBjb25maWcpew0KCQoJdGhpcy5jb250YWluZXIgPSBFeHQuZ2V0KGNvbnRhaW5lcik7DQoJdGhpcy5jb250YWluZXIudXBkYXRlKCIiKTsNCgl0aGlzLmNvbnRhaW5lci5zZXRTdHlsZSgib3ZlcmZsb3ciLCAiaGlkZGVuIik7DQogICAgdGhpcy5jb250YWluZXIuYWRkQ2xhc3MoJ3gtZ3JpZC1jb250YWluZXInKTsNCg0KICAgIHRoaXMuaWQgPSB0aGlzLmNvbnRhaW5lci5pZDsNCg0KICAgIEV4dC5hcHBseSh0aGlzLCBjb25maWcpOw0KICAgIAogICAgaWYodGhpcy5kcyl7DQogICAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IHRoaXMuZHM7DQogICAgICAgIGRlbGV0ZSB0aGlzLmRzOw0KICAgIH0NCiAgICBpZih0aGlzLmNtKXsNCiAgICAgICAgdGhpcy5jb2xNb2RlbCA9IHRoaXMuY207DQogICAgICAgIGRlbGV0ZSB0aGlzLmNtOw0KICAgIH0NCiAgICBpZih0aGlzLnNtKXsNCiAgICAgICAgdGhpcy5zZWxNb2RlbCA9IHRoaXMuc207DQogICAgICAgIGRlbGV0ZSB0aGlzLnNtOw0KICAgIH0NCg0KICAgIGlmKHRoaXMud2lkdGgpew0KICAgICAgICB0aGlzLmNvbnRhaW5lci5zZXRXaWR0aCh0aGlzLndpZHRoKTsNCiAgICB9DQoNCiAgICBpZih0aGlzLmhlaWdodCl7DQogICAgICAgIHRoaXMuY29udGFpbmVyLnNldEhlaWdodCh0aGlzLmhlaWdodCk7DQogICAgfQ0KICAgIA0KCXRoaXMuYWRkRXZlbnRzKHsNCgkgICAgCgkgICAgDQoJICAgICJjbGljayIgOiB0cnVlLA0KCSAgICANCgkgICAgImRibGNsaWNrIiA6IHRydWUsDQoJICAgIA0KCSAgICAiY29udGV4dG1lbnUiIDogdHJ1ZSwNCgkgICAgDQoJICAgICJtb3VzZWRvd24iIDogdHJ1ZSwNCgkgICAgDQoJICAgICJtb3VzZXVwIiA6IHRydWUsDQoJICAgIA0KCSAgICAibW91c2VvdmVyIiA6IHRydWUsDQoJICAgIA0KCSAgICAibW91c2VvdXQiIDogdHJ1ZSwNCgkgICAgDQoJICAgICJrZXlwcmVzcyIgOiB0cnVlLA0KCSAgICANCgkgICAgImtleWRvd24iIDogdHJ1ZSwNCg0KCSAgICAKDQoJICAgIA0KCSAgICAiY2VsbGNsaWNrIiA6IHRydWUsDQoJICAgIA0KCSAgICAiY2VsbGRibGNsaWNrIiA6IHRydWUsDQoJICAgIA0KCSAgICAicm93Y2xpY2siIDogdHJ1ZSwNCgkgICAgDQoJICAgICJyb3dkYmxjbGljayIgOiB0cnVlLA0KCSAgICANCgkgICAgImhlYWRlcmNsaWNrIiA6IHRydWUsDQoJICAgIA0KCSAgICAiaGVhZGVyZGJsY2xpY2siIDogdHJ1ZSwNCgkgICAgDQoJICAgICJyb3djb250ZXh0bWVudSIgOiB0cnVlLA0KCSAgICANCiAgICAgICAgICJjZWxsY29udGV4dG1lbnUiIDogdHJ1ZSwNCgkgICAgDQoJICAgICJoZWFkZXJjb250ZXh0bWVudSIgOiB0cnVlLA0KCSAgICANCgkgICAgImJvZHlzY3JvbGwiIDogdHJ1ZSwNCgkgICAgDQoJICAgICJjb2x1bW5yZXNpemUiIDogdHJ1ZSwNCgkgICAgDQoJICAgICJjb2x1bW5tb3ZlIiA6IHRydWUsDQoJICAgIA0KCSAgICAic3RhcnRkcmFnIiA6IHRydWUsDQoJICAgIA0KCSAgICAiZW5kZHJhZyIgOiB0cnVlLA0KCSAgICANCgkgICAgImRyYWdkcm9wIiA6IHRydWUsDQoJICAgIA0KCSAgICAiZHJhZ292ZXIiIDogdHJ1ZSwNCgkgICAgDQoJICAgICJkcmFnZW50ZXIiIDogdHJ1ZSwNCgkgICAgDQoJICAgICJkcmFnb3V0IiA6IHRydWUsDQogICAgICAgIA0KICAgICAgICByZW5kZXIgOiB0cnVlDQogICAgfSk7DQoNCiAgICBFeHQuZ3JpZC5HcmlkLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTsNCn07DQpFeHQuZXh0ZW5kKEV4dC5ncmlkLkdyaWQsIEV4dC51dGlsLk9ic2VydmFibGUsIHsNCiAgICANCgltaW5Db2x1bW5XaWR0aCA6IDI1LA0KDQogICAgDQoJYXV0b1NpemVDb2x1bW5zIDogZmFsc2UsDQoNCgkNCglhdXRvU2l6ZUhlYWRlcnMgOiB0cnVlLA0KDQoJDQoJbW9uaXRvcldpbmRvd1Jlc2l6ZSA6IHRydWUsDQoNCgkNCgltYXhSb3dzVG9NZWFzdXJlIDogMCwNCg0KCQ0KCXRyYWNrTW91c2VPdmVyIDogdHJ1ZSwNCg0KCQ0KCWVuYWJsZURyYWdEcm9wIDogZmFsc2UsDQoNCgkNCgllbmFibGVDb2x1bW5Nb3ZlIDogdHJ1ZSwNCg0KCQ0KCWVuYWJsZUNvbHVtbkhpZGUgOiB0cnVlLA0KDQoJDQoJZW5hYmxlUm93SGVpZ2h0U3luYyA6IGZhbHNlLA0KDQoJDQoJc3RyaXBlUm93cyA6IHRydWUsDQoNCgkNCglhdXRvSGVpZ2h0IDogZmFsc2UsDQoNCiAgICANCiAgICBhdXRvRXhwYW5kQ29sdW1uIDogZmFsc2UsDQoNCiAgICANCiAgICBhdXRvRXhwYW5kTWluIDogNTAsDQoNCiAgICANCiAgICBhdXRvRXhwYW5kTWF4IDogMTAwMCwNCg0KICAgIA0KCXZpZXcgOiBudWxsLA0KDQoJDQoJbG9hZE1hc2sgOiBmYWxzZSwNCg0KICAgIAogICAgcmVuZGVyZWQgOiBmYWxzZSwNCg0KICAgIA0KICAgIA0KICAgIA0KICAgIHJlbmRlciA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHZhciBjID0gdGhpcy5jb250YWluZXI7DQogICAgICAgIAogICAgICAgIGlmKCghYy5kb20ub2Zmc2V0SGVpZ2h0IHx8IGMuZG9tLm9mZnNldEhlaWdodCA8IDIwKSB8fCBjLmdldFN0eWxlKCJoZWlnaHQiKSA9PSAiYXV0byIpew0KICAgIAkgICAgdGhpcy5hdXRvSGVpZ2h0ID0gdHJ1ZTsNCiAgICAJfQ0KICAgIAl2YXIgdmlldyA9IHRoaXMuZ2V0VmlldygpOw0KICAgICAgICB2aWV3LmluaXQodGhpcyk7DQoNCiAgICAgICAgYy5vbigiY2xpY2siLCB0aGlzLm9uQ2xpY2ssIHRoaXMpOw0KICAgICAgICBjLm9uKCJkYmxjbGljayIsIHRoaXMub25EYmxDbGljaywgdGhpcyk7DQogICAgICAgIGMub24oImNvbnRleHRtZW51IiwgdGhpcy5vbkNvbnRleHRNZW51LCB0aGlzKTsNCiAgICAgICAgYy5vbigia2V5ZG93biIsIHRoaXMub25LZXlEb3duLCB0aGlzKTsNCg0KICAgICAgICB0aGlzLnJlbGF5RXZlbnRzKGMsIFsibW91c2Vkb3duIiwibW91c2V1cCIsIm1vdXNlb3ZlciIsIm1vdXNlb3V0Iiwia2V5cHJlc3MiXSk7DQoNCiAgICAgICAgdGhpcy5nZXRTZWxlY3Rpb25Nb2RlbCgpLmluaXQodGhpcyk7DQoNCiAgICAgICAgdmlldy5yZW5kZXIoKTsNCg0KICAgICAgICBpZih0aGlzLmxvYWRNYXNrKXsNCiAgICAgICAgICAgIHRoaXMubG9hZE1hc2sgPSBuZXcgRXh0LkxvYWRNYXNrKHRoaXMuY29udGFpbmVyLA0KICAgICAgICAgICAgICAgICAgICBFeHQuYXBwbHkoe3N0b3JlOnRoaXMuZGF0YVNvdXJjZX0sIHRoaXMubG9hZE1hc2spKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLnJlbmRlcmVkID0gdHJ1ZTsNCiAgICAgICAgdGhpcy5maXJlRXZlbnQoJ3JlbmRlcicsIHRoaXMpOw0KICAgICAgICByZXR1cm4gdGhpczsNCiAgICB9LA0KDQoJDQogICAgcmVjb25maWd1cmUgOiBmdW5jdGlvbihkYXRhU291cmNlLCBjb2xNb2RlbCl7DQogICAgICAgIGlmKHRoaXMubG9hZE1hc2spew0KICAgICAgICAgICAgdGhpcy5sb2FkTWFzay5kZXN0cm95KCk7DQogICAgICAgICAgICB0aGlzLmxvYWRNYXNrID0gbmV3IEV4dC5Mb2FkTWFzayh0aGlzLmNvbnRhaW5lciwNCiAgICAgICAgICAgICAgICAgICAgRXh0LmFwcGx5KHtzdG9yZTpkYXRhU291cmNlfSwgdGhpcy5sb2FkTWFzaykpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMudmlldy5iaW5kKGRhdGFTb3VyY2UsIGNvbE1vZGVsKTsNCiAgICAgICAgdGhpcy5kYXRhU291cmNlID0gZGF0YVNvdXJjZTsNCiAgICAgICAgdGhpcy5jb2xNb2RlbCA9IGNvbE1vZGVsOw0KICAgICAgICB0aGlzLnZpZXcucmVmcmVzaCh0cnVlKTsNCiAgICB9LA0KDQogICAgCiAgICBvbktleURvd24gOiBmdW5jdGlvbihlKXsNCiAgICAgICAgdGhpcy5maXJlRXZlbnQoImtleWRvd24iLCBlKTsNCiAgICB9LA0KDQogICAgDQogICAgZGVzdHJveSA6IGZ1bmN0aW9uKHJlbW92ZUVsLCBrZWVwTGlzdGVuZXJzKXsNCiAgICAgICAgaWYodGhpcy5sb2FkTWFzayl7DQogICAgICAgICAgICB0aGlzLmxvYWRNYXNrLmRlc3Ryb3koKTsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgYyA9IHRoaXMuY29udGFpbmVyOw0KICAgICAgICBjLnJlbW92ZUFsbExpc3RlbmVycygpOw0KICAgICAgICB0aGlzLnZpZXcuZGVzdHJveSgpOw0KICAgICAgICB0aGlzLmNvbE1vZGVsLnB1cmdlTGlzdGVuZXJzKCk7DQogICAgICAgIGlmKCFrZWVwTGlzdGVuZXJzKXsNCiAgICAgICAgICAgIHRoaXMucHVyZ2VMaXN0ZW5lcnMoKTsNCiAgICAgICAgfQ0KICAgICAgICBjLnVwZGF0ZSgiIik7DQogICAgICAgIGlmKHJlbW92ZUVsID09PSB0cnVlKXsNCiAgICAgICAgICAgIGMucmVtb3ZlKCk7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgCiAgICBwcm9jZXNzRXZlbnQgOiBmdW5jdGlvbihuYW1lLCBlKXsNCiAgICAgICAgdGhpcy5maXJlRXZlbnQobmFtZSwgZSk7DQogICAgICAgIHZhciB0ID0gZS5nZXRUYXJnZXQoKTsNCiAgICAgICAgdmFyIHYgPSB0aGlzLnZpZXc7DQogICAgICAgIHZhciBoZWFkZXIgPSB2LmZpbmRIZWFkZXJJbmRleCh0KTsNCiAgICAgICAgaWYoaGVhZGVyICE9PSBmYWxzZSl7DQogICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgiaGVhZGVyIiArIG5hbWUsIHRoaXMsIGhlYWRlciwgZSk7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgdmFyIHJvdyA9IHYuZmluZFJvd0luZGV4KHQpOw0KICAgICAgICAgICAgdmFyIGNlbGwgPSB2LmZpbmRDZWxsSW5kZXgodCk7DQogICAgICAgICAgICBpZihyb3cgIT09IGZhbHNlKXsNCiAgICAgICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgicm93IiArIG5hbWUsIHRoaXMsIHJvdywgZSk7DQogICAgICAgICAgICAgICAgaWYoY2VsbCAhPT0gZmFsc2Upew0KICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgiY2VsbCIgKyBuYW1lLCB0aGlzLCByb3csIGNlbGwsIGUpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICAKICAgIG9uQ2xpY2sgOiBmdW5jdGlvbihlKXsNCiAgICAgICAgdGhpcy5wcm9jZXNzRXZlbnQoImNsaWNrIiwgZSk7DQogICAgfSwNCg0KICAgIAogICAgb25Db250ZXh0TWVudSA6IGZ1bmN0aW9uKGUsIHQpew0KICAgICAgICB0aGlzLnByb2Nlc3NFdmVudCgiY29udGV4dG1lbnUiLCBlKTsNCiAgICB9LA0KDQogICAgCiAgICBvbkRibENsaWNrIDogZnVuY3Rpb24oZSl7DQogICAgICAgIHRoaXMucHJvY2Vzc0V2ZW50KCJkYmxjbGljayIsIGUpOw0KICAgIH0sDQoNCiAgICAKICAgIHdhbGtDZWxscyA6IGZ1bmN0aW9uKHJvdywgY29sLCBzdGVwLCBmbiwgc2NvcGUpew0KICAgICAgICB2YXIgY20gPSB0aGlzLmNvbE1vZGVsLCBjbGVuID0gY20uZ2V0Q29sdW1uQ291bnQoKTsNCiAgICAgICAgdmFyIGRzID0gdGhpcy5kYXRhU291cmNlLCBybGVuID0gZHMuZ2V0Q291bnQoKSwgZmlyc3QgPSB0cnVlOw0KICAgICAgICBpZihzdGVwIDwgMCl7DQogICAgICAgICAgICBpZihjb2wgPCAwKXsNCiAgICAgICAgICAgICAgICByb3ctLTsNCiAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgd2hpbGUocm93ID49IDApew0KICAgICAgICAgICAgICAgIGlmKCFmaXJzdCl7DQogICAgICAgICAgICAgICAgICAgIGNvbCA9IGNsZW4tMTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICB3aGlsZShjb2wgPj0gMCl7DQogICAgICAgICAgICAgICAgICAgIGlmKGZuLmNhbGwoc2NvcGUgfHwgdGhpcywgcm93LCBjb2wsIGNtKSA9PT0gdHJ1ZSl7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3JvdywgY29sXTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBjb2wtLTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcm93LS07DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBpZihjb2wgPj0gY2xlbil7DQogICAgICAgICAgICAgICAgcm93Kys7DQogICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHdoaWxlKHJvdyA8IHJsZW4pew0KICAgICAgICAgICAgICAgIGlmKCFmaXJzdCl7DQogICAgICAgICAgICAgICAgICAgIGNvbCA9IDA7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7DQogICAgICAgICAgICAgICAgd2hpbGUoY29sIDwgY2xlbil7DQogICAgICAgICAgICAgICAgICAgIGlmKGZuLmNhbGwoc2NvcGUgfHwgdGhpcywgcm93LCBjb2wsIGNtKSA9PT0gdHJ1ZSl7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3JvdywgY29sXTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBjb2wrKzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcm93Kys7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfSwNCg0KICAgIAogICAgZ2V0U2VsZWN0aW9ucyA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLnNlbE1vZGVsLmdldFNlbGVjdGlvbnMoKTsNCiAgICB9LA0KDQogICAgDQogICAgYXV0b1NpemUgOiBmdW5jdGlvbigpew0KICAgICAgICBpZih0aGlzLnJlbmRlcmVkKXsNCiAgICAgICAgICAgIHRoaXMudmlldy5sYXlvdXQoKTsNCiAgICAgICAgICAgIGlmKHRoaXMudmlldy5hZGp1c3RGb3JTY3JvbGwpew0KICAgICAgICAgICAgICAgIHRoaXMudmlldy5hZGp1c3RGb3JTY3JvbGwoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICANCiAgICBnZXRHcmlkRWwgOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7DQogICAgfSwNCg0KICAgIAogICAgc3RvcEVkaXRpbmcgOiBmdW5jdGlvbigpe30sDQoNCiAgICANCiAgICBnZXRTZWxlY3Rpb25Nb2RlbCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIGlmKCF0aGlzLnNlbE1vZGVsKXsNCiAgICAgICAgICAgIHRoaXMuc2VsTW9kZWwgPSBuZXcgRXh0LmdyaWQuUm93U2VsZWN0aW9uTW9kZWwoKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdGhpcy5zZWxNb2RlbDsNCiAgICB9LA0KDQogICAgDQogICAgZ2V0RGF0YVNvdXJjZSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLmRhdGFTb3VyY2U7DQogICAgfSwNCg0KICAgIA0KICAgIGdldENvbHVtbk1vZGVsIDogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIHRoaXMuY29sTW9kZWw7DQogICAgfSwNCg0KICAgIA0KICAgIGdldFZpZXcgOiBmdW5jdGlvbigpew0KICAgICAgICBpZighdGhpcy52aWV3KXsNCiAgICAgICAgICAgIHRoaXMudmlldyA9IG5ldyBFeHQuZ3JpZC5HcmlkVmlldyh0aGlzLnZpZXdDb25maWcpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0aGlzLnZpZXc7DQogICAgfSwNCiAgICANCiAgICBnZXREcmFnRHJvcFRleHQgOiBmdW5jdGlvbigpew0KICAgICAgICB2YXIgY291bnQgPSB0aGlzLnNlbE1vZGVsLmdldENvdW50KCk7DQogICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KHRoaXMuZGRUZXh0LCBjb3VudCwgY291bnQgPT0gMSA/ICcnIDogJ3MnKTsNCiAgICB9DQp9KTsNCg0KRXh0LmdyaWQuR3JpZC5wcm90b3R5cGUuZGRUZXh0ID0gInswfSBzZWxlY3RlZCByb3d7MX0iOwpFeHQuZ3JpZC5BYnN0cmFjdEdyaWRWaWV3ID0gZnVuY3Rpb24oKXsNCgl0aGlzLmdyaWQgPSBudWxsOw0KCQ0KCXRoaXMuZXZlbnRzID0gew0KCSAgICAiYmVmb3Jlcm93cmVtb3ZlZCIgOiB0cnVlLA0KCSAgICAiYmVmb3Jlcm93c2luc2VydGVkIiA6IHRydWUsDQoJICAgICJiZWZvcmVyZWZyZXNoIiA6IHRydWUsDQoJICAgICJyb3dyZW1vdmVkIiA6IHRydWUsDQoJICAgICJyb3dzaW5zZXJ0ZWQiIDogdHJ1ZSwNCgkgICAgInJvd3VwZGF0ZWQiIDogdHJ1ZSwNCgkgICAgInJlZnJlc2giIDogdHJ1ZQ0KCX07DQogICAgRXh0LmdyaWQuQWJzdHJhY3RHcmlkVmlldy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7DQp9Ow0KDQpFeHQuZXh0ZW5kKEV4dC5ncmlkLkFic3RyYWN0R3JpZFZpZXcsIEV4dC51dGlsLk9ic2VydmFibGUsIHsNCiAgICByb3dDbGFzcyA6ICJ4LWdyaWQtcm93IiwNCiAgICBjZWxsQ2xhc3MgOiAieC1ncmlkLWNlbGwiLA0KICAgIHRkQ2xhc3MgOiAieC1ncmlkLXRkIiwNCiAgICBoZENsYXNzIDogIngtZ3JpZC1oZCIsDQogICAgc3BsaXRDbGFzcyA6ICJ4LWdyaWQtaGQtc3BsaXQiLA0KICAgIA0KCWluaXQ6IGZ1bmN0aW9uKGdyaWQpew0KICAgICAgICB0aGlzLmdyaWQgPSBncmlkOw0KCQl2YXIgY2lkID0gdGhpcy5ncmlkLmdldEdyaWRFbCgpLmlkOw0KICAgICAgICB0aGlzLmNvbFNlbGVjdG9yID0gIiMiICsgY2lkICsgIiAuIiArIHRoaXMuY2VsbENsYXNzICsgIi0iOw0KICAgICAgICB0aGlzLnRkU2VsZWN0b3IgPSAiIyIgKyBjaWQgKyAiIC4iICsgdGhpcy50ZENsYXNzICsgIi0iOw0KICAgICAgICB0aGlzLmhkU2VsZWN0b3IgPSAiIyIgKyBjaWQgKyAiIC4iICsgdGhpcy5oZENsYXNzICsgIi0iOw0KICAgICAgICB0aGlzLnNwbGl0U2VsZWN0b3IgPSAiIyIgKyBjaWQgKyAiIC4iICsgdGhpcy5zcGxpdENsYXNzICsgIi0iOw0KCX0sDQoJDQoJZ2V0Q29sdW1uUmVuZGVyZXJzIDogZnVuY3Rpb24oKXsNCiAgICAJdmFyIHJlbmRlcmVycyA9IFtdOw0KICAgIAl2YXIgY20gPSB0aGlzLmdyaWQuY29sTW9kZWw7DQogICAgICAgIHZhciBjb2xDb3VudCA9IGNtLmdldENvbHVtbkNvdW50KCk7DQogICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBjb2xDb3VudDsgaSsrKXsNCiAgICAgICAgICAgIHJlbmRlcmVyc1tpXSA9IGNtLmdldFJlbmRlcmVyKGkpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiByZW5kZXJlcnM7DQogICAgfSwNCiAgICANCiAgICBnZXRDb2x1bW5JZHMgOiBmdW5jdGlvbigpew0KICAgIAl2YXIgaWRzID0gW107DQogICAgCXZhciBjbSA9IHRoaXMuZ3JpZC5jb2xNb2RlbDsNCiAgICAgICAgdmFyIGNvbENvdW50ID0gY20uZ2V0Q29sdW1uQ291bnQoKTsNCiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGNvbENvdW50OyBpKyspew0KICAgICAgICAgICAgaWRzW2ldID0gY20uZ2V0Q29sdW1uSWQoaSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGlkczsNCiAgICB9LA0KICAgIA0KICAgIGdldERhdGFJbmRleGVzIDogZnVuY3Rpb24oKXsNCiAgICAJaWYoIXRoaXMuaW5kZXhNYXApew0KICAgICAgICAgICAgdGhpcy5pbmRleE1hcCA9IHRoaXMuYnVpbGRJbmRleE1hcCgpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0aGlzLmluZGV4TWFwLmNvbFRvRGF0YTsNCiAgICB9LA0KICAgIA0KICAgIGdldENvbHVtbkluZGV4QnlEYXRhSW5kZXggOiBmdW5jdGlvbihkYXRhSW5kZXgpew0KICAgICAgICBpZighdGhpcy5pbmRleE1hcCl7DQogICAgICAgICAgICB0aGlzLmluZGV4TWFwID0gdGhpcy5idWlsZEluZGV4TWFwKCk7DQogICAgICAgIH0NCiAgICAJcmV0dXJuIHRoaXMuaW5kZXhNYXAuZGF0YVRvQ29sW2RhdGFJbmRleF07DQogICAgfSwNCiAgICANCiAgICANCiAgICBzZXRDU1NTdHlsZSA6IGZ1bmN0aW9uKGNvbEluZGV4LCBuYW1lLCB2YWx1ZSl7DQogICAgICAgIHZhciBzZWxlY3RvciA9ICIjIiArIHRoaXMuZ3JpZC5pZCArICIgLngtZ3JpZC1jb2wtIiArIGNvbEluZGV4Ow0KICAgICAgICBFeHQudXRpbC5DU1MudXBkYXRlUnVsZShzZWxlY3RvciwgbmFtZSwgdmFsdWUpOw0KICAgIH0sDQogICAgDQogICAgZ2VuZXJhdGVSdWxlcyA6IGZ1bmN0aW9uKGNtKXsNCiAgICAgICAgdmFyIHJ1bGVCdWYgPSBbXSwgcnVsZXNJZCA9IHRoaXMuZ3JpZC5pZCArICctY3NzcnVsZXMnOw0KICAgICAgICBFeHQudXRpbC5DU1MucmVtb3ZlU3R5bGVTaGVldChydWxlc0lkKTsNCiAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gY20uZ2V0Q29sdW1uQ291bnQoKTsgaSA8IGxlbjsgaSsrKXsNCiAgICAgICAgICAgIHZhciBjaWQgPSBjbS5nZXRDb2x1bW5JZChpKTsNCiAgICAgICAgICAgIHJ1bGVCdWYucHVzaCh0aGlzLmNvbFNlbGVjdG9yLCBjaWQsICIge1xuIiwgY20uY29uZmlnW2ldLmNzcywgIn1cbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50ZFNlbGVjdG9yLCBjaWQsICIge1xufVxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhkU2VsZWN0b3IsIGNpZCwgIiB7XG59XG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3BsaXRTZWxlY3RvciwgY2lkLCAiIHtcbn1cbiIpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBFeHQudXRpbC5DU1MuY3JlYXRlU3R5bGVTaGVldChydWxlQnVmLmpvaW4oIiIpLCBydWxlc0lkKTsNCiAgICB9DQp9KTsKDQpFeHQuZ3JpZC5HcmlkVmlldyA9IGZ1bmN0aW9uKGNvbmZpZyl7DQogICAgRXh0LmdyaWQuR3JpZFZpZXcuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpOw0KICAgIHRoaXMuZWwgPSBudWxsOw0KDQogICAgRXh0LmFwcGx5KHRoaXMsIGNvbmZpZyk7DQp9Ow0KDQpFeHQuZXh0ZW5kKEV4dC5ncmlkLkdyaWRWaWV3LCBFeHQuZ3JpZC5BYnN0cmFjdEdyaWRWaWV3LCB7DQoNCiAgICANCiAgICByb3dDbGFzcyA6ICJ4LWdyaWQtcm93IiwNCg0KICAgIGNlbGxDbGFzcyA6ICJ4LWdyaWQtY29sIiwNCg0KICAgIHRkQ2xhc3MgOiAieC1ncmlkLXRkIiwNCg0KICAgIGhkQ2xhc3MgOiAieC1ncmlkLWhkIiwNCg0KICAgIHNwbGl0Q2xhc3MgOiAieC1ncmlkLXNwbGl0IiwNCg0KICAgIHNvcnRDbGFzc2VzIDogWyJzb3J0LWFzYyIsICJzb3J0LWRlc2MiXSwNCg0KICAgIGVuYWJsZU1vdmVBbmltIDogZmFsc2UsDQoNCiAgICBobENvbG9yOiAiQzNEQUY5IiwNCg0KICAgIGRoIDogRXh0LkRvbUhlbHBlciwNCg0KICAgIGZseSA6IEV4dC5FbGVtZW50LmZseSwNCg0KICAgIGNzcyA6IEV4dC51dGlsLkNTUywNCg0KICAgIGJvcmRlcldpZHRoOiAxLA0KDQogICAgc3BsaXRPZmZzZXQ6IDMsDQoNCiAgICBzY3JvbGxJbmNyZW1lbnQgOiAyMiwNCg0KICAgIGNlbGxSRTogLyg/Oi4qPyl4LWdyaWQtKD86aGR8Y2VsbHxjc3BsaXQpLSg/OltcZF0rKS0oW1xkXSspKD86Lio/KS8sDQoNCiAgICBmaW5kUkU6IC9ccz8oPzp4LWdyaWQtaGR8eC1ncmlkLWNvbHx4LWdyaWQtY3NwbGl0KVxzLywNCg0KICAgIGJpbmQgOiBmdW5jdGlvbihkcywgY20pew0KICAgICAgICBpZih0aGlzLmRzKXsNCiAgICAgICAgICAgIHRoaXMuZHMudW4oImxvYWQiLCB0aGlzLm9uTG9hZCwgdGhpcyk7DQogICAgICAgICAgICB0aGlzLmRzLnVuKCJkYXRhY2hhbmdlZCIsIHRoaXMub25EYXRhQ2hhbmdlLCB0aGlzKTsNCiAgICAgICAgICAgIHRoaXMuZHMudW4oImFkZCIsIHRoaXMub25BZGQsIHRoaXMpOw0KICAgICAgICAgICAgdGhpcy5kcy51bigicmVtb3ZlIiwgdGhpcy5vblJlbW92ZSwgdGhpcyk7DQogICAgICAgICAgICB0aGlzLmRzLnVuKCJ1cGRhdGUiLCB0aGlzLm9uVXBkYXRlLCB0aGlzKTsNCiAgICAgICAgICAgIHRoaXMuZHMudW4oImNsZWFyIiwgdGhpcy5vbkNsZWFyLCB0aGlzKTsNCiAgICAgICAgfQ0KICAgICAgICBpZihkcyl7DQogICAgICAgICAgICBkcy5vbigibG9hZCIsIHRoaXMub25Mb2FkLCB0aGlzKTsNCiAgICAgICAgICAgIGRzLm9uKCJkYXRhY2hhbmdlZCIsIHRoaXMub25EYXRhQ2hhbmdlLCB0aGlzKTsNCiAgICAgICAgICAgIGRzLm9uKCJhZGQiLCB0aGlzLm9uQWRkLCB0aGlzKTsNCiAgICAgICAgICAgIGRzLm9uKCJyZW1vdmUiLCB0aGlzLm9uUmVtb3ZlLCB0aGlzKTsNCiAgICAgICAgICAgIGRzLm9uKCJ1cGRhdGUiLCB0aGlzLm9uVXBkYXRlLCB0aGlzKTsNCiAgICAgICAgICAgIGRzLm9uKCJjbGVhciIsIHRoaXMub25DbGVhciwgdGhpcyk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5kcyA9IGRzOw0KDQogICAgICAgIGlmKHRoaXMuY20pew0KICAgICAgICAgICAgdGhpcy5jbS51bigid2lkdGhjaGFuZ2UiLCB0aGlzLm9uQ29sV2lkdGhDaGFuZ2UsIHRoaXMpOw0KICAgICAgICAgICAgdGhpcy5jbS51bigiaGVhZGVyY2hhbmdlIiwgdGhpcy5vbkhlYWRlckNoYW5nZSwgdGhpcyk7DQogICAgICAgICAgICB0aGlzLmNtLnVuKCJoaWRkZW5jaGFuZ2UiLCB0aGlzLm9uSGlkZGVuQ2hhbmdlLCB0aGlzKTsNCiAgICAgICAgICAgIHRoaXMuY20udW4oImNvbHVtbm1vdmVkIiwgdGhpcy5vbkNvbHVtbk1vdmUsIHRoaXMpOw0KICAgICAgICAgICAgdGhpcy5jbS51bigiY29sdW1ubG9ja2NoYW5nZSIsIHRoaXMub25Db2x1bW5Mb2NrLCB0aGlzKTsNCiAgICAgICAgfQ0KICAgICAgICBpZihjbSl7DQogICAgICAgICAgICB0aGlzLmdlbmVyYXRlUnVsZXMoY20pOw0KICAgICAgICAgICAgY20ub24oIndpZHRoY2hhbmdlIiwgdGhpcy5vbkNvbFdpZHRoQ2hhbmdlLCB0aGlzKTsNCiAgICAgICAgICAgIGNtLm9uKCJoZWFkZXJjaGFuZ2UiLCB0aGlzLm9uSGVhZGVyQ2hhbmdlLCB0aGlzKTsNCiAgICAgICAgICAgIGNtLm9uKCJoaWRkZW5jaGFuZ2UiLCB0aGlzLm9uSGlkZGVuQ2hhbmdlLCB0aGlzKTsNCiAgICAgICAgICAgIGNtLm9uKCJjb2x1bW5tb3ZlZCIsIHRoaXMub25Db2x1bW5Nb3ZlLCB0aGlzKTsNCiAgICAgICAgICAgIGNtLm9uKCJjb2x1bW5sb2NrY2hhbmdlIiwgdGhpcy5vbkNvbHVtbkxvY2ssIHRoaXMpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuY20gPSBjbTsNCiAgICB9LA0KDQogICAgaW5pdDogZnVuY3Rpb24oZ3JpZCl7DQoJCUV4dC5ncmlkLkdyaWRWaWV3LnN1cGVyY2xhc3MuaW5pdC5jYWxsKHRoaXMsIGdyaWQpOw0KDQoJCXRoaXMuYmluZChncmlkLmRhdGFTb3VyY2UsIGdyaWQuY29sTW9kZWwpOw0KDQoJICAgIGdyaWQub24oImhlYWRlcmNsaWNrIiwgdGhpcy5oYW5kbGVIZWFkZXJDbGljaywgdGhpcyk7DQoNCiAgICAgICAgaWYoZ3JpZC50cmFja01vdXNlT3Zlcil7DQogICAgICAgICAgICBncmlkLm9uKCJtb3VzZW92ZXIiLCB0aGlzLm9uUm93T3ZlciwgdGhpcyk7DQoJICAgICAgICBncmlkLm9uKCJtb3VzZW91dCIsIHRoaXMub25Sb3dPdXQsIHRoaXMpOw0KCSAgICB9DQoJICAgIGdyaWQuY2FuY2VsVGV4dFNlbGVjdGlvbiA9IGZ1bmN0aW9uKCl7fTsNCgkJdGhpcy5ncmlkSWQgPSBncmlkLmlkOw0KDQoJCXZhciB0cGxzID0gdGhpcy50ZW1wbGF0ZXMgfHwge307DQoNCgkJaWYoIXRwbHMubWFzdGVyKXsNCgkJICAgIHRwbHMubWFzdGVyID0gbmV3IEV4dC5UZW1wbGF0ZSgNCgkJICAgICAgICc8ZGl2IGNsYXNzPSJ4LWdyaWQiIGhpZGVmb2N1cz0idHJ1ZSI+JywNCgkJICAgICAgICAgICc8ZGl2IGNsYXNzPSJ4LWdyaWQtdG9wYmFyIj48L2Rpdj4nLA0KCQkgICAgICAgICAgJzxkaXYgY2xhc3M9IngtZ3JpZC1zY3JvbGxlciI+PGRpdj48L2Rpdj48L2Rpdj4nLA0KCQkgICAgICAgICAgJzxkaXYgY2xhc3M9IngtZ3JpZC1sb2NrZWQiPicsDQoJCSAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9IngtZ3JpZC1oZWFkZXIiPntsb2NrZWRIZWFkZXJ9PC9kaXY+JywNCgkJICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0ieC1ncmlkLWJvZHkiPntsb2NrZWRCb2R5fTwvZGl2PicsDQoJCSAgICAgICAgICAiPC9kaXY+IiwNCgkJICAgICAgICAgICc8ZGl2IGNsYXNzPSJ4LWdyaWQtdmlld3BvcnQiPicsDQoJCSAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9IngtZ3JpZC1oZWFkZXIiPntoZWFkZXJ9PC9kaXY+JywNCgkJICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0ieC1ncmlkLWJvZHkiPntib2R5fTwvZGl2PicsDQoJCSAgICAgICAgICAiPC9kaXY+IiwNCgkJICAgICAgICAgICc8ZGl2IGNsYXNzPSJ4LWdyaWQtYm90dG9tYmFyIj48L2Rpdj4nLA0KCQkgICAgICAgICAgJzxhIGhyZWY9IiMiIGNsYXNzPSJ4LWdyaWQtZm9jdXMiIHRhYkluZGV4PSItMSI+PC9hPicsDQoJCSAgICAgICAgICAnPGRpdiBjbGFzcz0ieC1ncmlkLXJlc2l6ZS1wcm94eSI+JiMxNjA7PC9kaXY+JywNCgkJICAgICAgICI8L2Rpdj4iDQoJCSAgICApOw0KCQkgICAgdHBscy5tYXN0ZXIuZGlzYWJsZWZvcm1hdHMgPSB0cnVlOw0KCQl9DQoNCgkJaWYoIXRwbHMuaGVhZGVyKXsNCgkJICAgIHRwbHMuaGVhZGVyID0gbmV3IEV4dC5UZW1wbGF0ZSgNCgkJICAgICAgICc8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPicsDQoJCSAgICAgICAnPHRib2R5Pjx0ciBjbGFzcz0ieC1ncmlkLWhkLXJvdyI+e2NlbGxzfTwvdHI+PC90Ym9keT4nLA0KCQkgICAgICAgIjwvdGFibGU+e3NwbGl0c30iDQoJCSAgICApOw0KCQkgICAgdHBscy5oZWFkZXIuZGlzYWJsZWZvcm1hdHMgPSB0cnVlOw0KCQl9DQoJCXRwbHMuaGVhZGVyLmNvbXBpbGUoKTsNCg0KCQlpZighdHBscy5oY2VsbCl7DQoJCSAgICB0cGxzLmhjZWxsID0gbmV3IEV4dC5UZW1wbGF0ZSgNCgkJICAgICAgICAnPHRkIGNsYXNzPSJ4LWdyaWQtaGQgeC1ncmlkLXRkLXtpZH0ge2NlbGxJZH0iPjxkaXYgdGl0bGU9Int0aXRsZX0iIGNsYXNzPSJ4LWdyaWQtaGQtaW5uZXIgeC1ncmlkLWhkLXtpZH0iPicsDQoJCSAgICAgICAgJzxkaXYgY2xhc3M9IngtZ3JpZC1oZC10ZXh0IiB1bnNlbGVjdGFibGU9Im9uIj57dmFsdWV9PGltZyBjbGFzcz0ieC1ncmlkLXNvcnQtaWNvbiIgc3JjPSInLCBFeHQuQkxBTktfSU1BR0VfVVJMLCAnIiAvPjwvZGl2PicsDQoJCSAgICAgICAgIjwvZGl2PjwvdGQ+Ig0KCQkgICAgICk7DQoJCSAgICAgdHBscy5oY2VsbC5kaXNhYmxlRm9ybWF0cyA9IHRydWU7DQoJCX0NCgkJdHBscy5oY2VsbC5jb21waWxlKCk7DQoNCgkJaWYoIXRwbHMuaHNwbGl0KXsNCgkJICAgIHRwbHMuaHNwbGl0ID0gbmV3IEV4dC5UZW1wbGF0ZSgnPGRpdiBjbGFzcz0ieC1ncmlkLXNwbGl0IHtzcGxpdElkfSB4LWdyaWQtc3BsaXQte2lkfSIgc3R5bGU9IntzdHlsZX0iIHVuc2VsZWN0YWJsZT0ib24iPiYjMTYwOzwvZGl2PicpOw0KCQkgICAgdHBscy5oc3BsaXQuZGlzYWJsZUZvcm1hdHMgPSB0cnVlOw0KCQl9DQoJCXRwbHMuaHNwbGl0LmNvbXBpbGUoKTsNCg0KCQlpZighdHBscy5ib2R5KXsNCgkJICAgIHRwbHMuYm9keSA9IG5ldyBFeHQuVGVtcGxhdGUoDQoJCSAgICAgICAnPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4nLA0KCQkgICAgICAgIjx0Ym9keT57cm93c308L3Rib2R5PiIsDQoJCSAgICAgICAiPC90YWJsZT4iDQoJCSAgICApOw0KCQkgICAgdHBscy5ib2R5LmRpc2FibGVGb3JtYXRzID0gdHJ1ZTsNCgkJfQ0KCQl0cGxzLmJvZHkuY29tcGlsZSgpOw0KDQoJCWlmKCF0cGxzLnJvdyl7DQoJCSAgICB0cGxzLnJvdyA9IG5ldyBFeHQuVGVtcGxhdGUoJzx0ciBjbGFzcz0ieC1ncmlkLXJvdyB7YWx0fSI+e2NlbGxzfTwvdHI+Jyk7DQoJCSAgICB0cGxzLnJvdy5kaXNhYmxlRm9ybWF0cyA9IHRydWU7DQoJCX0NCgkJdHBscy5yb3cuY29tcGlsZSgpOw0KDQoJCWlmKCF0cGxzLmNlbGwpew0KCQkgICAgdHBscy5jZWxsID0gbmV3IEV4dC5UZW1wbGF0ZSgNCgkJICAgICAgICAnPHRkIGNsYXNzPSJ4LWdyaWQtY29sIHgtZ3JpZC10ZC17aWR9IHtjZWxsSWR9IHtjc3N9IiB0YWJJbmRleD0iMCI+JywNCgkJICAgICAgICAnPGRpdiBjbGFzcz0ieC1ncmlkLWNvbC17aWR9IHgtZ3JpZC1jZWxsLWlubmVyIj48ZGl2IGNsYXNzPSJ4LWdyaWQtY2VsbC10ZXh0IiB1bnNlbGVjdGFibGU9Im9uIiB7YXR0cn0+e3ZhbHVlfTwvZGl2PjwvZGl2PicsDQoJCSAgICAgICAgIjwvdGQ+Ig0KCQkgICAgKTsNCiAgICAgICAgICAgIHRwbHMuY2VsbC5kaXNhYmxlRm9ybWF0cyA9IHRydWU7DQogICAgICAgIH0NCgkJdHBscy5jZWxsLmNvbXBpbGUoKTsNCg0KCQl0aGlzLnRlbXBsYXRlcyA9IHRwbHM7DQoJfSwNCg0KCQogICAgb25Db2xXaWR0aENoYW5nZSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHRoaXMudXBkYXRlQ29sdW1ucy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOw0KICAgIH0sDQogICAgb25IZWFkZXJDaGFuZ2UgOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLnVwZGF0ZUhlYWRlcnMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCiAgICB9LCANCiAgICBvbkhpZGRlbkNoYW5nZSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHRoaXMuaGFuZGxlSGlkZGVuQ2hhbmdlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7DQogICAgfSwNCiAgICBvbkNvbHVtbk1vdmUgOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLmhhbmRsZUNvbHVtbk1vdmUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCiAgICB9LA0KICAgIG9uQ29sdW1uTG9jayA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHRoaXMuaGFuZGxlTG9ja0NoYW5nZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOw0KICAgIH0sDQoNCiAgICBvbkRhdGFDaGFuZ2UgOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLnJlZnJlc2goKTsNCiAgICAgICAgdGhpcy51cGRhdGVIZWFkZXJTb3J0U3RhdGUoKTsNCiAgICB9LA0KDQoJb25DbGVhciA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHRoaXMucmVmcmVzaCgpOw0KICAgIH0sDQoNCglvblVwZGF0ZSA6IGZ1bmN0aW9uKGRzLCByZWNvcmQpew0KICAgICAgICB0aGlzLnJlZnJlc2hSb3cocmVjb3JkKTsNCiAgICB9LA0KDQogICAgcmVmcmVzaFJvdyA6IGZ1bmN0aW9uKHJlY29yZCl7DQogICAgICAgIHZhciBkcyA9IHRoaXMuZHMsIGluZGV4Ow0KICAgICAgICBpZih0eXBlb2YgcmVjb3JkID09ICdudW1iZXInKXsNCiAgICAgICAgICAgIGluZGV4ID0gcmVjb3JkOw0KICAgICAgICAgICAgcmVjb3JkID0gZHMuZ2V0QXQoaW5kZXgpOw0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIGluZGV4ID0gZHMuaW5kZXhPZihyZWNvcmQpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuaW5zZXJ0Um93cyhkcywgaW5kZXgsIGluZGV4LCB0cnVlKTsNCiAgICAgICAgdGhpcy5vblJlbW92ZShkcywgcmVjb3JkLCBpbmRleCsxLCB0cnVlKTsNCiAgICAgICAgdGhpcy5zeW5jUm93SGVpZ2h0cyhpbmRleCwgaW5kZXgpOw0KICAgICAgICB0aGlzLmxheW91dCgpOw0KICAgICAgICB0aGlzLmZpcmVFdmVudCgicm93dXBkYXRlZCIsIHRoaXMsIGluZGV4LCByZWNvcmQpOw0KICAgIH0sDQoNCiAgICBvbkFkZCA6IGZ1bmN0aW9uKGRzLCByZWNvcmRzLCBpbmRleCl7DQogICAgICAgIHRoaXMuaW5zZXJ0Um93cyhkcywgaW5kZXgsIGluZGV4ICsgKHJlY29yZHMubGVuZ3RoLTEpKTsNCiAgICB9LA0KDQogICAgb25SZW1vdmUgOiBmdW5jdGlvbihkcywgcmVjb3JkLCBpbmRleCwgaXNVcGRhdGUpew0KICAgICAgICBpZihpc1VwZGF0ZSAhPT0gdHJ1ZSl7DQogICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgiYmVmb3Jlcm93cmVtb3ZlZCIsIHRoaXMsIGluZGV4LCByZWNvcmQpOw0KICAgICAgICB9DQogICAgICAgIHZhciBidCA9IHRoaXMuZ2V0Qm9keVRhYmxlKCksIGx0ID0gdGhpcy5nZXRMb2NrZWRUYWJsZSgpOw0KICAgICAgICBpZihidC5yb3dzW2luZGV4XSl7DQogICAgICAgICAgICBidC5maXJzdENoaWxkLnJlbW92ZUNoaWxkKGJ0LnJvd3NbaW5kZXhdKTsNCiAgICAgICAgfQ0KICAgICAgICBpZihsdC5yb3dzW2luZGV4XSl7DQogICAgICAgICAgICBsdC5maXJzdENoaWxkLnJlbW92ZUNoaWxkKGx0LnJvd3NbaW5kZXhdKTsNCiAgICAgICAgfQ0KICAgICAgICBpZihpc1VwZGF0ZSAhPT0gdHJ1ZSl7DQogICAgICAgICAgICB0aGlzLnN0cmlwZVJvd3MoaW5kZXgpOw0KICAgICAgICAgICAgdGhpcy5zeW5jUm93SGVpZ2h0cyhpbmRleCwgaW5kZXgpOw0KICAgICAgICAgICAgdGhpcy5sYXlvdXQoKTsNCiAgICAgICAgICAgIHRoaXMuZmlyZUV2ZW50KCJyb3dyZW1vdmVkIiwgdGhpcywgaW5kZXgsIHJlY29yZCk7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgb25Mb2FkIDogZnVuY3Rpb24oKXsNCiAgICAgICAgdGhpcy5zY3JvbGxUb1RvcCgpOw0KICAgIH0sDQoNCiAgICANCiAgICBzY3JvbGxUb1RvcCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIGlmKHRoaXMuc2Nyb2xsZXIpew0KICAgICAgICAgICAgdGhpcy5zY3JvbGxlci5kb20uc2Nyb2xsVG9wID0gMDsNCiAgICAgICAgICAgIHRoaXMuc3luY1Njcm9sbCgpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIGdldEhlYWRlclBhbmVsIDogZnVuY3Rpb24oZG9TaG93KXsNCiAgICAgICAgaWYoZG9TaG93KXsNCiAgICAgICAgICAgIHRoaXMuaGVhZGVyUGFuZWwuc2hvdygpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0aGlzLmhlYWRlclBhbmVsOw0KCX0sDQoNCgkNCiAgICBnZXRGb290ZXJQYW5lbCA6IGZ1bmN0aW9uKGRvU2hvdyl7DQogICAgICAgIGlmKGRvU2hvdyl7DQogICAgICAgICAgICB0aGlzLmZvb3RlclBhbmVsLnNob3coKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdGhpcy5mb290ZXJQYW5lbDsNCgl9LA0KDQoJaW5pdEVsZW1lbnRzIDogZnVuY3Rpb24oKXsNCgkgICAgdmFyIEUgPSBFeHQuRWxlbWVudDsNCgkgICAgdmFyIGVsID0gdGhpcy5ncmlkLmdldEdyaWRFbCgpLmRvbS5maXJzdENoaWxkOw0KCSAgICB2YXIgY3MgPSBlbC5jaGlsZE5vZGVzOw0KDQoJICAgIHRoaXMuZWwgPSBuZXcgRShlbCk7DQoJICAgIHRoaXMuaGVhZGVyUGFuZWwgPSBuZXcgRShlbC5maXJzdENoaWxkKTsNCgkgICAgdGhpcy5oZWFkZXJQYW5lbC5lbmFibGVEaXNwbGF5TW9kZSgiYmxvY2siKTsNCg0KICAgICAgICB0aGlzLnNjcm9sbGVyID0gbmV3IEUoY3NbMV0pOw0KCSAgICB0aGlzLnNjcm9sbFNpemVyID0gbmV3IEUodGhpcy5zY3JvbGxlci5kb20uZmlyc3RDaGlsZCk7DQoNCgkgICAgdGhpcy5sb2NrZWRXcmFwID0gbmV3IEUoY3NbMl0pOw0KCSAgICB0aGlzLmxvY2tlZEhkID0gbmV3IEUodGhpcy5sb2NrZWRXcmFwLmRvbS5maXJzdENoaWxkKTsNCgkgICAgdGhpcy5sb2NrZWRCb2R5ID0gbmV3IEUodGhpcy5sb2NrZWRXcmFwLmRvbS5jaGlsZE5vZGVzWzFdKTsNCg0KCSAgICB0aGlzLm1haW5XcmFwID0gbmV3IEUoY3NbM10pOw0KCSAgICB0aGlzLm1haW5IZCA9IG5ldyBFKHRoaXMubWFpbldyYXAuZG9tLmZpcnN0Q2hpbGQpOw0KCSAgICB0aGlzLm1haW5Cb2R5ID0gbmV3IEUodGhpcy5tYWluV3JhcC5kb20uY2hpbGROb2Rlc1sxXSk7DQoNCgkgICAgdGhpcy5mb290ZXJQYW5lbCA9IG5ldyBFKGNzWzRdKTsNCgkgICAgdGhpcy5mb290ZXJQYW5lbC5lbmFibGVEaXNwbGF5TW9kZSgiYmxvY2siKTsNCg0KICAgICAgICB0aGlzLmZvY3VzRWwgPSBuZXcgRShjc1s1XSk7DQogICAgICAgIHRoaXMuZm9jdXNFbC5zd2FsbG93RXZlbnQoImNsaWNrIiwgdHJ1ZSk7DQogICAgICAgIHRoaXMucmVzaXplUHJveHkgPSBuZXcgRShjc1s2XSk7DQoNCgkgICAgdGhpcy5oZWFkZXJTZWxlY3RvciA9IFN0cmluZy5mb3JtYXQoDQoJICAgICAgICcjezB9IHRkLngtZ3JpZC1oZCwgI3sxfSB0ZC54LWdyaWQtaGQnLA0KCSAgICAgICB0aGlzLmxvY2tlZEhkLmlkLCB0aGlzLm1haW5IZC5pZA0KCSAgICApOw0KDQoJICAgIHRoaXMuc3BsaXR0ZXJTZWxlY3RvciA9IFN0cmluZy5mb3JtYXQoDQoJICAgICAgICcjezB9IGRpdi54LWdyaWQtc3BsaXQsICN7MX0gZGl2LngtZ3JpZC1zcGxpdCcsDQoJICAgICAgIHRoaXMubG9ja2VkSGQuaWQsIHRoaXMubWFpbkhkLmlkDQoJICAgICk7DQogICAgfSwNCg0KCWdldEhlYWRlckNlbGwgOiBmdW5jdGlvbihpbmRleCl7DQoJICAgIHJldHVybiBFeHQuRG9tUXVlcnkuc2VsZWN0KHRoaXMuaGVhZGVyU2VsZWN0b3IpW2luZGV4XTsNCgl9LA0KDQoJZ2V0SGVhZGVyQ2VsbE1lYXN1cmUgOiBmdW5jdGlvbihpbmRleCl7DQoJICAgIHJldHVybiB0aGlzLmdldEhlYWRlckNlbGwoaW5kZXgpLmZpcnN0Q2hpbGQ7DQoJfSwNCg0KCWdldEhlYWRlckNlbGxUZXh0IDogZnVuY3Rpb24oaW5kZXgpew0KCSAgICByZXR1cm4gdGhpcy5nZXRIZWFkZXJDZWxsKGluZGV4KS5maXJzdENoaWxkLmZpcnN0Q2hpbGQ7DQoJfSwNCg0KCWdldExvY2tlZFRhYmxlIDogZnVuY3Rpb24oKXsNCgkgICAgcmV0dXJuIHRoaXMubG9ja2VkQm9keS5kb20uZmlyc3RDaGlsZDsNCgl9LA0KDQoJZ2V0Qm9keVRhYmxlIDogZnVuY3Rpb24oKXsNCgkgICAgcmV0dXJuIHRoaXMubWFpbkJvZHkuZG9tLmZpcnN0Q2hpbGQ7DQoJfSwNCg0KCWdldExvY2tlZFJvdyA6IGZ1bmN0aW9uKGluZGV4KXsNCgkgICAgcmV0dXJuIHRoaXMuZ2V0TG9ja2VkVGFibGUoKS5yb3dzW2luZGV4XTsNCgl9LA0KDQoJZ2V0Um93IDogZnVuY3Rpb24oaW5kZXgpew0KCSAgICByZXR1cm4gdGhpcy5nZXRCb2R5VGFibGUoKS5yb3dzW2luZGV4XTsNCgl9LA0KDQoJZ2V0Um93Q29tcG9zaXRlIDogZnVuY3Rpb24oaW5kZXgpew0KCSAgICBpZighdGhpcy5yb3dFbCl7DQoJICAgICAgICB0aGlzLnJvd0VsID0gbmV3IEV4dC5Db21wb3NpdGVFbGVtZW50TGl0ZSgpOw0KCSAgICB9DQogICAgICAgIHZhciBlbHMgPSBbXSwgbHJvdywgbXJvdzsNCiAgICAgICAgaWYobHJvdyA9IHRoaXMuZ2V0TG9ja2VkUm93KGluZGV4KSl7DQogICAgICAgICAgICBlbHMucHVzaChscm93KTsNCiAgICAgICAgfQ0KICAgICAgICBpZihtcm93ID0gdGhpcy5nZXRSb3coaW5kZXgpKXsNCiAgICAgICAgICAgIGVscy5wdXNoKG1yb3cpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMucm93RWwuZWxlbWVudHMgPSBlbHM7DQoJICAgIHJldHVybiB0aGlzLnJvd0VsOw0KCX0sDQoNCglnZXRDZWxsIDogZnVuY3Rpb24ocm93SW5kZXgsIGNvbEluZGV4KXsNCgkgICAgdmFyIGxvY2tlZCA9IHRoaXMuY20uZ2V0TG9ja2VkQ291bnQoKTsNCgkgICAgdmFyIHNvdXJjZTsNCgkgICAgaWYoY29sSW5kZXggPCBsb2NrZWQpew0KCSAgICAgICAgc291cmNlID0gdGhpcy5sb2NrZWRCb2R5LmRvbS5maXJzdENoaWxkOw0KCSAgICB9ZWxzZXsNCgkgICAgICAgIHNvdXJjZSA9IHRoaXMubWFpbkJvZHkuZG9tLmZpcnN0Q2hpbGQ7DQoJICAgICAgICBjb2xJbmRleCAtPSBsb2NrZWQ7DQoJICAgIH0NCiAgICAgICAgcmV0dXJuIHNvdXJjZS5yb3dzW3Jvd0luZGV4XS5jaGlsZE5vZGVzW2NvbEluZGV4XTsNCgl9LA0KDQoJZ2V0Q2VsbFRleHQgOiBmdW5jdGlvbihyb3dJbmRleCwgY29sSW5kZXgpew0KCSAgICByZXR1cm4gdGhpcy5nZXRDZWxsKHJvd0luZGV4LCBjb2xJbmRleCkuZmlyc3RDaGlsZC5maXJzdENoaWxkOw0KCX0sDQoNCglnZXRDZWxsQm94IDogZnVuY3Rpb24oY2VsbCl7DQoJICAgIHZhciBiID0gdGhpcy5mbHkoY2VsbCkuZ2V0Qm94KCk7DQogICAgICAgIGlmKEV4dC5pc09wZXJhKXsgCiAgICAgICAgICAgIGIueSA9IGNlbGwub2Zmc2V0VG9wICsgdGhpcy5tYWluQm9keS5nZXRZKCk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGI7DQogICAgfSwNCg0KICAgIGdldENlbGxJbmRleCA6IGZ1bmN0aW9uKGNlbGwpew0KICAgICAgICB2YXIgaWQgPSBTdHJpbmcoY2VsbC5jbGFzc05hbWUpLm1hdGNoKHRoaXMuY2VsbFJFKTsNCiAgICAgICAgaWYoaWQpew0KICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KGlkWzFdLCAxMCk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIDA7DQogICAgfSwNCg0KICAgIGZpbmRIZWFkZXJJbmRleCA6IGZ1bmN0aW9uKG4pew0KICAgICAgICB2YXIgciA9IEV4dC5mbHkobikuZmluZFBhcmVudCgidGQuIiArIHRoaXMuaGRDbGFzcywgNik7DQogICAgICAgIHJldHVybiByID8gdGhpcy5nZXRDZWxsSW5kZXgocikgOiBmYWxzZTsNCiAgICB9LA0KDQogICAgZmluZEhlYWRlckNlbGwgOiBmdW5jdGlvbihuKXsNCiAgICAgICAgdmFyIHIgPSBFeHQuZmx5KG4pLmZpbmRQYXJlbnQoInRkLiIgKyB0aGlzLmhkQ2xhc3MsIDYpOw0KICAgICAgICByZXR1cm4gciA/IHIgOiBmYWxzZTsNCiAgICB9LA0KDQogICAgZmluZFJvd0luZGV4IDogZnVuY3Rpb24obil7DQogICAgICAgIGlmKCFuKXsNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgciA9IEV4dC5mbHkobikuZmluZFBhcmVudCgidHIuIiArIHRoaXMucm93Q2xhc3MsIDYpOw0KICAgICAgICByZXR1cm4gciA/IHIucm93SW5kZXggOiBmYWxzZTsNCiAgICB9LA0KDQogICAgZmluZENlbGxJbmRleCA6IGZ1bmN0aW9uKG5vZGUpew0KICAgICAgICB2YXIgc3RvcCA9IHRoaXMuZWwuZG9tOw0KICAgICAgICB3aGlsZShub2RlICYmIG5vZGUgIT0gc3RvcCl7DQogICAgICAgICAgICBpZih0aGlzLmZpbmRSRS50ZXN0KG5vZGUuY2xhc3NOYW1lKSl7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2VsbEluZGV4KG5vZGUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfSwNCg0KICAgIGdldENvbHVtbklkIDogZnVuY3Rpb24oaW5kZXgpew0KCSAgICByZXR1cm4gdGhpcy5jbS5nZXRDb2x1bW5JZChpbmRleCk7DQoJfSwNCg0KCWdldFNwbGl0dGVycyA6IGZ1bmN0aW9uKCl7DQoJICAgIGlmKHRoaXMuc3BsaXR0ZXJTZWxlY3Rvcil7DQoJICAgICAgIHJldHVybiBFeHQuRG9tUXVlcnkuc2VsZWN0KHRoaXMuc3BsaXR0ZXJTZWxlY3Rvcik7DQoJICAgIH1lbHNlew0KCSAgICAgICAgcmV0dXJuIG51bGw7DQoJICAgIH0NCgl9LA0KDQoJZ2V0U3BsaXR0ZXIgOiBmdW5jdGlvbihpbmRleCl7DQoJICAgIHJldHVybiB0aGlzLmdldFNwbGl0dGVycygpW2luZGV4XTsNCgl9LA0KDQogICAgb25Sb3dPdmVyIDogZnVuY3Rpb24oZSwgdCl7DQogICAgICAgIHZhciByb3c7DQogICAgICAgIGlmKChyb3cgPSB0aGlzLmZpbmRSb3dJbmRleCh0KSkgIT09IGZhbHNlKXsNCiAgICAgICAgICAgIHRoaXMuZ2V0Um93Q29tcG9zaXRlKHJvdykuYWRkQ2xhc3MoIngtZ3JpZC1yb3ctb3ZlciIpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIG9uUm93T3V0IDogZnVuY3Rpb24oZSwgdCl7DQogICAgICAgIHZhciByb3c7DQogICAgICAgIGlmKChyb3cgPSB0aGlzLmZpbmRSb3dJbmRleCh0KSkgIT09IGZhbHNlICYmIHJvdyAhPT0gdGhpcy5maW5kUm93SW5kZXgoZS5nZXRSZWxhdGVkVGFyZ2V0KCkpKXsNCiAgICAgICAgICAgIHRoaXMuZ2V0Um93Q29tcG9zaXRlKHJvdykucmVtb3ZlQ2xhc3MoIngtZ3JpZC1yb3ctb3ZlciIpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIHJlbmRlckhlYWRlcnMgOiBmdW5jdGlvbigpew0KCSAgICB2YXIgY20gPSB0aGlzLmNtOw0KICAgICAgICB2YXIgY3QgPSB0aGlzLnRlbXBsYXRlcy5oY2VsbCwgaHQgPSB0aGlzLnRlbXBsYXRlcy5oZWFkZXIsIHN0ID0gdGhpcy50ZW1wbGF0ZXMuaHNwbGl0Ow0KICAgICAgICB2YXIgY2IgPSBbXSwgbGIgPSBbXSwgc2IgPSBbXSwgbHNiID0gW10sIHAgPSB7fTsNCiAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gY20uZ2V0Q29sdW1uQ291bnQoKTsgaSA8IGxlbjsgaSsrKXsNCiAgICAgICAgICAgIHAuY2VsbElkID0gIngtZ3JpZC1oZC0wLSIgKyBpOw0KICAgICAgICAgICAgcC5zcGxpdElkID0gIngtZ3JpZC1jc3BsaXQtMC0iICsgaTsNCiAgICAgICAgICAgIHAuaWQgPSBjbS5nZXRDb2x1bW5JZChpKTsNCiAgICAgICAgICAgIHAudGl0bGUgPSBjbS5nZXRDb2x1bW5Ub29sdGlwKGkpIHx8ICIiOw0KICAgICAgICAgICAgcC52YWx1ZSA9IGNtLmdldENvbHVtbkhlYWRlcihpKSB8fCAiIjsNCiAgICAgICAgICAgIHAuc3R5bGUgPSAodGhpcy5ncmlkLmVuYWJsZUNvbHVtblJlc2l6ZSA9PT0gZmFsc2UgfHwgIWNtLmlzUmVzaXphYmxlKGkpIHx8IGNtLmlzRml4ZWQoaSkpID8gJ2N1cnNvcjpkZWZhdWx0JyA6ICcnOw0KICAgICAgICAgICAgaWYoIWNtLmlzTG9ja2VkKGkpKXsNCiAgICAgICAgICAgICAgICBjYltjYi5sZW5ndGhdID0gY3QuYXBwbHkocCk7DQogICAgICAgICAgICAgICAgc2Jbc2IubGVuZ3RoXSA9IHN0LmFwcGx5KHApOw0KICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgbGJbbGIubGVuZ3RoXSA9IGN0LmFwcGx5KHApOw0KICAgICAgICAgICAgICAgIGxzYltsc2IubGVuZ3RoXSA9IHN0LmFwcGx5KHApOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiBbaHQuYXBwbHkoe2NlbGxzOiBsYi5qb2luKCIiKSwgc3BsaXRzOmxzYi5qb2luKCIiKX0pLA0KICAgICAgICAgICAgICAgIGh0LmFwcGx5KHtjZWxsczogY2Iuam9pbigiIiksIHNwbGl0czpzYi5qb2luKCIiKX0pXTsNCgl9LA0KDQoJdXBkYXRlSGVhZGVycyA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHZhciBodG1sID0gdGhpcy5yZW5kZXJIZWFkZXJzKCk7DQogICAgICAgIHRoaXMubG9ja2VkSGQudXBkYXRlKGh0bWxbMF0pOw0KICAgICAgICB0aGlzLm1haW5IZC51cGRhdGUoaHRtbFsxXSk7DQogICAgfSwNCg0KICAgIA0KICAgIGZvY3VzUm93IDogZnVuY3Rpb24ocm93KXsNCiAgICAgICAgdmFyIHggPSB0aGlzLnNjcm9sbGVyLmRvbS5zY3JvbGxMZWZ0Ow0KICAgICAgICB0aGlzLmZvY3VzQ2VsbChyb3csIDAsIGZhbHNlKTsNCiAgICAgICAgdGhpcy5zY3JvbGxlci5kb20uc2Nyb2xsTGVmdCA9IHg7DQogICAgfSwNCg0KICAgIA0KICAgIGZvY3VzQ2VsbCA6IGZ1bmN0aW9uKHJvdywgY29sLCBoc2Nyb2xsKXsNCiAgICAgICAgdmFyIGVsID0gdGhpcy5lbnN1cmVWaXNpYmxlKHJvdywgY29sLCBoc2Nyb2xsKTsNCiAgICAgICAgdGhpcy5mb2N1c0VsLmFsaWduVG8oZWwsICJ0bC10bCIpOw0KICAgICAgICBpZihFeHQuaXNHZWNrbyl7DQogICAgICAgICAgICB0aGlzLmZvY3VzRWwuZm9jdXMoKTsNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICB0aGlzLmZvY3VzRWwuZm9jdXMuZGVmZXIoMSwgdGhpcy5mb2N1c0VsKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICANCiAgICBlbnN1cmVWaXNpYmxlIDogZnVuY3Rpb24ocm93LCBjb2wsIGhzY3JvbGwpew0KICAgICAgICBpZih0eXBlb2Ygcm93ICE9ICJudW1iZXIiKXsNCiAgICAgICAgICAgIHJvdyA9IHJvdy5yb3dJbmRleDsNCiAgICAgICAgfQ0KICAgICAgICBpZihyb3cgPCAwICYmIHJvdyA+PSB0aGlzLmRzLmdldENvdW50KCkpew0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQogICAgICAgIGNvbCA9IChjb2wgIT09IHVuZGVmaW5lZCA/IGNvbCA6IDApOw0KICAgICAgICB2YXIgY20gPSB0aGlzLmdyaWQuY29sTW9kZWw7DQogICAgICAgIHdoaWxlKGNtLmlzSGlkZGVuKGNvbCkpew0KICAgICAgICAgICAgY29sKys7DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgZWwgPSB0aGlzLmdldENlbGwocm93LCBjb2wpOw0KICAgICAgICBpZighZWwpew0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQogICAgICAgIHZhciBjID0gdGhpcy5zY3JvbGxlci5kb207DQoNCiAgICAgICAgdmFyIGN0b3AgPSBwYXJzZUludChlbC5vZmZzZXRUb3AsIDEwKTsNCiAgICAgICAgdmFyIGNsZWZ0ID0gcGFyc2VJbnQoZWwub2Zmc2V0TGVmdCwgMTApOw0KICAgICAgICB2YXIgY2JvdCA9IGN0b3AgKyBlbC5vZmZzZXRIZWlnaHQ7DQogICAgICAgIHZhciBjcmlnaHQgPSBjbGVmdCArIGVsLm9mZnNldFdpZHRoOw0KDQogICAgICAgIHZhciBjaCA9IGMuY2xpZW50SGVpZ2h0IC0gdGhpcy5tYWluSGQuZG9tLm9mZnNldEhlaWdodDsNCiAgICAgICAgdmFyIHN0b3AgPSBwYXJzZUludChjLnNjcm9sbFRvcCwgMTApOw0KICAgICAgICB2YXIgc2xlZnQgPSBwYXJzZUludChjLnNjcm9sbExlZnQsIDEwKTsNCiAgICAgICAgdmFyIHNib3QgPSBzdG9wICsgY2g7DQogICAgICAgIHZhciBzcmlnaHQgPSBzbGVmdCArIGMuY2xpZW50V2lkdGg7DQoNCiAgICAgICAgaWYoY3RvcCA8IHN0b3Apew0KICAgICAgICAJYy5zY3JvbGxUb3AgPSBjdG9wOw0KICAgICAgICB9ZWxzZSBpZihjYm90ID4gc2JvdCl7DQogICAgICAgICAgICBjLnNjcm9sbFRvcCA9IGNib3QtY2g7DQogICAgICAgIH0NCg0KICAgICAgICBpZihoc2Nyb2xsICE9PSBmYWxzZSl7DQogICAgICAgICAgICBpZihjbGVmdCA8IHNsZWZ0KXsNCiAgICAgICAgICAgICAgICBjLnNjcm9sbExlZnQgPSBjbGVmdDsNCiAgICAgICAgICAgIH1lbHNlIGlmKGNyaWdodCA+IHNyaWdodCl7DQogICAgICAgICAgICAgICAgYy5zY3JvbGxMZWZ0ID0gY3JpZ2h0LWMuY2xpZW50V2lkdGg7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGVsOw0KICAgIH0sDQoNCiAgICB1cGRhdGVDb2x1bW5zIDogZnVuY3Rpb24oKXsNCiAgICAgICAgdGhpcy5ncmlkLnN0b3BFZGl0aW5nKCk7DQogICAgICAgIHZhciBjbSA9IHRoaXMuZ3JpZC5jb2xNb2RlbCwgY29sSWRzID0gdGhpcy5nZXRDb2x1bW5JZHMoKTsNCiAgICAgICAgCiAgICAgICAgdmFyIHBvcyA9IDA7DQogICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IGNtLmdldENvbHVtbkNvdW50KCk7IGkgPCBsZW47IGkrKyl7DQogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHcgPSBjbS5nZXRDb2x1bW5XaWR0aChpKTsNCiAgICAgICAgICAgIHRoaXMuY3NzLnVwZGF0ZVJ1bGUodGhpcy5jb2xTZWxlY3Rvcitjb2xJZHNbaV0sICJ3aWR0aCIsICh3IC0gdGhpcy5ib3JkZXJXaWR0aCkgKyAicHgiKTsNCiAgICAgICAgICAgIHRoaXMuY3NzLnVwZGF0ZVJ1bGUodGhpcy5oZFNlbGVjdG9yK2NvbElkc1tpXSwgIndpZHRoIiwgKHcgLSB0aGlzLmJvcmRlcldpZHRoKSArICJweCIpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMudXBkYXRlU3BsaXR0ZXJzKCk7DQogICAgfSwNCg0KICAgIGdlbmVyYXRlUnVsZXMgOiBmdW5jdGlvbihjbSl7DQogICAgICAgIHZhciBydWxlQnVmID0gW10sIHJ1bGVzSWQgPSB0aGlzLmdyaWQuaWQgKyAnLWNzc3J1bGVzJzsNCiAgICAgICAgRXh0LnV0aWwuQ1NTLnJlbW92ZVN0eWxlU2hlZXQocnVsZXNJZCk7DQogICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IGNtLmdldENvbHVtbkNvdW50KCk7IGkgPCBsZW47IGkrKyl7DQogICAgICAgICAgICB2YXIgY2lkID0gY20uZ2V0Q29sdW1uSWQoaSk7DQogICAgICAgICAgICB2YXIgYWxpZ24gPSAnJzsNCiAgICAgICAgICAgIGlmKGNtLmNvbmZpZ1tpXS5hbGlnbil7DQogICAgICAgICAgICAgICAgYWxpZ24gPSAndGV4dC1hbGlnbjonK2NtLmNvbmZpZ1tpXS5hbGlnbisnOyc7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgaGlkZGVuID0gJyc7DQogICAgICAgICAgICBpZihjbS5pc0hpZGRlbihpKSl7DQogICAgICAgICAgICAgICAgaGlkZGVuID0gJ2Rpc3BsYXk6bm9uZTsnOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIHdpZHRoID0gIndpZHRoOiIgKyAoY20uZ2V0Q29sdW1uV2lkdGgoaSkgLSB0aGlzLmJvcmRlcldpZHRoKSArICJweDsiOw0KICAgICAgICAgICAgcnVsZUJ1Zi5wdXNoKA0KICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbFNlbGVjdG9yLCBjaWQsICIge1xuIiwgY20uY29uZmlnW2ldLmNzcywgYWxpZ24sIHdpZHRoLCAiXG59XG4iLA0KICAgICAgICAgICAgICAgICAgICB0aGlzLmhkU2VsZWN0b3IsIGNpZCwgIiB7XG4iLCBhbGlnbiwgd2lkdGgsICJ9XG4iLA0KICAgICAgICAgICAgICAgICAgICB0aGlzLnRkU2VsZWN0b3IsIGNpZCwgIiB7XG4iLGhpZGRlbiwiXG59XG4iLA0KICAgICAgICAgICAgICAgICAgICB0aGlzLnNwbGl0U2VsZWN0b3IsIGNpZCwgIiB7XG4iLCBoaWRkZW4gLCAiXG59XG4iKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gRXh0LnV0aWwuQ1NTLmNyZWF0ZVN0eWxlU2hlZXQocnVsZUJ1Zi5qb2luKCIiKSwgcnVsZXNJZCk7DQogICAgfSwNCg0KICAgIHVwZGF0ZVNwbGl0dGVycyA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHZhciBjbSA9IHRoaXMuY20sIHMgPSB0aGlzLmdldFNwbGl0dGVycygpOw0KICAgICAgICBpZihzKXsgCiAgICAgICAgICAgIHZhciBwb3MgPSAwLCBsb2NrZWQgPSB0cnVlOw0KICAgICAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gY20uZ2V0Q29sdW1uQ291bnQoKTsgaSA8IGxlbjsgaSsrKXsNCiAgICAgICAgICAgICAgICBpZihjbS5pc0hpZGRlbihpKSkgY29udGludWU7DQogICAgICAgICAgICAgICAgdmFyIHcgPSBjbS5nZXRDb2x1bW5XaWR0aChpKTsNCiAgICAgICAgICAgICAgICBpZighY20uaXNMb2NrZWQoaSkgJiYgbG9ja2VkKXsNCiAgICAgICAgICAgICAgICAgICAgcG9zID0gMDsNCiAgICAgICAgICAgICAgICAgICAgbG9ja2VkID0gZmFsc2U7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHBvcyArPSB3Ow0KICAgICAgICAgICAgICAgIHNbaV0uc3R5bGUubGVmdCA9IChwb3MtdGhpcy5zcGxpdE9mZnNldCkgKyAicHgiOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSwNCg0KICAgIGhhbmRsZUhpZGRlbkNoYW5nZSA6IGZ1bmN0aW9uKGNvbE1vZGVsLCBjb2xJbmRleCwgaGlkZGVuKXsNCiAgICAgICAgaWYoaGlkZGVuKXsNCiAgICAgICAgICAgIHRoaXMuaGlkZUNvbHVtbihjb2xJbmRleCk7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgdGhpcy51bmhpZGVDb2x1bW4oY29sSW5kZXgpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIGhpZGVDb2x1bW4gOiBmdW5jdGlvbihjb2xJbmRleCl7DQogICAgICAgIHZhciBjaWQgPSB0aGlzLmdldENvbHVtbklkKGNvbEluZGV4KTsNCiAgICAgICAgdGhpcy5jc3MudXBkYXRlUnVsZSh0aGlzLnRkU2VsZWN0b3IrY2lkLCAiZGlzcGxheSIsICJub25lIik7DQogICAgICAgIHRoaXMuY3NzLnVwZGF0ZVJ1bGUodGhpcy5zcGxpdFNlbGVjdG9yK2NpZCwgImRpc3BsYXkiLCAibm9uZSIpOw0KICAgICAgICBpZihFeHQuaXNTYWZhcmkpew0KICAgICAgICAgICAgdGhpcy51cGRhdGVIZWFkZXJzKCk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy51cGRhdGVTcGxpdHRlcnMoKTsNCiAgICAgICAgdGhpcy5sYXlvdXQoKTsNCiAgICB9LA0KDQogICAgdW5oaWRlQ29sdW1uIDogZnVuY3Rpb24oY29sSW5kZXgpew0KICAgICAgICB2YXIgY2lkID0gdGhpcy5nZXRDb2x1bW5JZChjb2xJbmRleCk7DQogICAgICAgIHRoaXMuY3NzLnVwZGF0ZVJ1bGUodGhpcy50ZFNlbGVjdG9yK2NpZCwgImRpc3BsYXkiLCAiIik7DQogICAgICAgIHRoaXMuY3NzLnVwZGF0ZVJ1bGUodGhpcy5zcGxpdFNlbGVjdG9yK2NpZCwgImRpc3BsYXkiLCAiIik7DQoNCiAgICAgICAgaWYoRXh0LmlzU2FmYXJpKXsNCiAgICAgICAgICAgIHRoaXMudXBkYXRlSGVhZGVycygpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMudXBkYXRlU3BsaXR0ZXJzKCk7DQogICAgICAgIHRoaXMubGF5b3V0KCk7DQogICAgfSwNCg0KICAgIGluc2VydFJvd3MgOiBmdW5jdGlvbihkbSwgZmlyc3RSb3csIGxhc3RSb3csIGlzVXBkYXRlKXsNCiAgICAgICAgaWYoZmlyc3RSb3cgPT0gMCAmJiBsYXN0Um93ID09IGRtLmdldENvdW50KCktMSl7DQogICAgICAgICAgICB0aGlzLnJlZnJlc2goKTsNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICBpZighaXNVcGRhdGUpew0KICAgICAgICAgICAgICAgIHRoaXMuZmlyZUV2ZW50KCJiZWZvcmVyb3dzaW5zZXJ0ZWQiLCB0aGlzLCBmaXJzdFJvdywgbGFzdFJvdyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgcyA9IHRoaXMuZ2V0U2Nyb2xsU3RhdGUoKTsNCiAgICAgICAgICAgIHZhciBtYXJrdXAgPSB0aGlzLnJlbmRlclJvd3MoZmlyc3RSb3csIGxhc3RSb3cpOw0KICAgICAgICAgICAgdGhpcy5idWZmZXJSb3dzKG1hcmt1cFswXSwgdGhpcy5nZXRMb2NrZWRUYWJsZSgpLCBmaXJzdFJvdyk7DQogICAgICAgICAgICB0aGlzLmJ1ZmZlclJvd3MobWFya3VwWzFdLCB0aGlzLmdldEJvZHlUYWJsZSgpLCBmaXJzdFJvdyk7DQogICAgICAgICAgICB0aGlzLnJlc3RvcmVTY3JvbGwocyk7DQogICAgICAgICAgICBpZighaXNVcGRhdGUpew0KICAgICAgICAgICAgICAgIHRoaXMuZmlyZUV2ZW50KCJyb3dzaW5zZXJ0ZWQiLCB0aGlzLCBmaXJzdFJvdywgbGFzdFJvdyk7DQogICAgICAgICAgICAgICAgdGhpcy5zeW5jUm93SGVpZ2h0cyhmaXJzdFJvdywgbGFzdFJvdyk7DQogICAgICAgICAgICAgICAgdGhpcy5zdHJpcGVSb3dzKGZpcnN0Um93KTsNCiAgICAgICAgICAgICAgICB0aGlzLmxheW91dCgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSwNCg0KICAgIGJ1ZmZlclJvd3MgOiBmdW5jdGlvbihtYXJrdXAsIHRhcmdldCwgaW5kZXgpew0KICAgICAgICB2YXIgYmVmb3JlID0gbnVsbCwgdHJvd3MgPSB0YXJnZXQucm93cywgdGJvZHkgPSB0YXJnZXQudEJvZGllc1swXTsNCiAgICAgICAgaWYoaW5kZXggPCB0cm93cy5sZW5ndGgpew0KICAgICAgICAgICAgYmVmb3JlID0gdHJvd3NbaW5kZXhdOw0KICAgICAgICB9DQogICAgICAgIHZhciBiID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQogICAgICAgIGIuaW5uZXJIVE1MID0gIjx0YWJsZT48dGJvZHk+IittYXJrdXArIjwvdGJvZHk+PC90YWJsZT4iOw0KICAgICAgICB2YXIgcm93cyA9IGIuZmlyc3RDaGlsZC5yb3dzOw0KICAgICAgICBmb3IodmFyIGkgPSAwLCBsZW4gPSByb3dzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXsNCiAgICAgICAgICAgIGlmKGJlZm9yZSl7DQogICAgICAgICAgICAgICAgdGJvZHkuaW5zZXJ0QmVmb3JlKHJvd3NbMF0sIGJlZm9yZSk7DQogICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICB0Ym9keS5hcHBlbmRDaGlsZChyb3dzWzBdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBiLmlubmVySFRNTCA9ICIiOw0KICAgICAgICBiID0gbnVsbDsNCiAgICB9LA0KDQogICAgZGVsZXRlUm93cyA6IGZ1bmN0aW9uKGRtLCBmaXJzdFJvdywgbGFzdFJvdyl7DQogICAgICAgIGlmKGRtLmdldFJvd0NvdW50KCk8MSl7DQogICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgiYmVmb3JlcmVmcmVzaCIsIHRoaXMpOw0KICAgICAgICAgICAgdGhpcy5tYWluQm9keS51cGRhdGUoIiIpOw0KICAgICAgICAgICAgdGhpcy5sb2NrZWRCb2R5LnVwZGF0ZSgiIik7DQogICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgicmVmcmVzaCIsIHRoaXMpOw0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIHRoaXMuZmlyZUV2ZW50KCJiZWZvcmVyb3dzZGVsZXRlZCIsIHRoaXMsIGZpcnN0Um93LCBsYXN0Um93KTsNCiAgICAgICAgICAgIHZhciBidCA9IHRoaXMuZ2V0Qm9keVRhYmxlKCk7DQogICAgICAgICAgICB2YXIgdGJvZHkgPSBidC5maXJzdENoaWxkOw0KICAgICAgICAgICAgdmFyIHJvd3MgPSBidC5yb3dzOw0KICAgICAgICAgICAgZm9yKHZhciByb3dJbmRleCA9IGZpcnN0Um93OyByb3dJbmRleCA8PSBsYXN0Um93OyByb3dJbmRleCsrKXsNCiAgICAgICAgICAgICAgICB0Ym9keS5yZW1vdmVDaGlsZChyb3dzW2ZpcnN0Um93XSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLnN0cmlwZVJvd3MoZmlyc3RSb3cpOw0KICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoInJvd3NkZWxldGVkIiwgdGhpcywgZmlyc3RSb3csIGxhc3RSb3cpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIHVwZGF0ZVJvd3MgOiBmdW5jdGlvbihkYXRhU291cmNlLCBmaXJzdFJvdywgbGFzdFJvdyl7DQogICAgICAgIHZhciBzID0gdGhpcy5nZXRTY3JvbGxTdGF0ZSgpOw0KICAgICAgICB0aGlzLnJlZnJlc2goKTsNCiAgICAgICAgdGhpcy5yZXN0b3JlU2Nyb2xsKHMpOw0KICAgIH0sDQoNCiAgICBoYW5kbGVTb3J0IDogZnVuY3Rpb24oZGF0YVNvdXJjZSwgc29ydENvbHVtbkluZGV4LCBzb3J0RGlyLCBub1JlZnJlc2gpew0KICAgICAgICBpZighbm9SZWZyZXNoKXsNCiAgICAgICAgICAgdGhpcy5yZWZyZXNoKCk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy51cGRhdGVIZWFkZXJTb3J0U3RhdGUoKTsNCiAgICB9LA0KDQogICAgZ2V0U2Nyb2xsU3RhdGUgOiBmdW5jdGlvbigpew0KICAgICAgICB2YXIgc2IgPSB0aGlzLnNjcm9sbGVyLmRvbTsNCiAgICAgICAgcmV0dXJuIHtsZWZ0OiBzYi5zY3JvbGxMZWZ0LCB0b3A6IHNiLnNjcm9sbFRvcH07DQogICAgfSwNCg0KICAgIHN0cmlwZVJvd3MgOiBmdW5jdGlvbihzdGFydFJvdyl7DQogICAgICAgIGlmKCF0aGlzLmdyaWQuc3RyaXBlUm93cyB8fCB0aGlzLmRzLmdldENvdW50KCkgPCAxKXsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KICAgICAgICBzdGFydFJvdyA9IHN0YXJ0Um93IHx8IDA7DQogICAgICAgIHZhciByb3dzID0gdGhpcy5nZXRCb2R5VGFibGUoKS5yb3dzOw0KICAgICAgICB2YXIgbHJvd3MgPSB0aGlzLmdldExvY2tlZFRhYmxlKCkucm93czsNCiAgICAgICAgdmFyIGNscyA9ICcgeC1ncmlkLXJvdy1hbHQgJzsNCiAgICAgICAgZm9yKHZhciBpID0gc3RhcnRSb3csIGxlbiA9IHJvd3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspew0KICAgICAgICAgICAgdmFyIHJvdyA9IHJvd3NbaV0sIGxyb3cgPSBscm93c1tpXTsNCiAgICAgICAgICAgIHZhciBpc0FsdCA9ICgoaSsxKSAlIDIgPT0gMCk7DQogICAgICAgICAgICB2YXIgaGFzQWx0ID0gKCcgJytyb3cuY2xhc3NOYW1lICsgJyAnKS5pbmRleE9mKGNscykgIT0gLTE7DQogICAgICAgICAgICBpZihpc0FsdCA9PSBoYXNBbHQpew0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYoaXNBbHQpew0KICAgICAgICAgICAgICAgIHJvdy5jbGFzc05hbWUgKz0gIiB4LWdyaWQtcm93LWFsdCI7DQogICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICByb3cuY2xhc3NOYW1lID0gcm93LmNsYXNzTmFtZS5yZXBsYWNlKCJ4LWdyaWQtcm93LWFsdCIsICIiKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKGxyb3cpew0KICAgICAgICAgICAgICAgIGxyb3cuY2xhc3NOYW1lID0gcm93LmNsYXNzTmFtZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICByZXN0b3JlU2Nyb2xsIDogZnVuY3Rpb24oc3RhdGUpew0KICAgICAgICB2YXIgc2IgPSB0aGlzLnNjcm9sbGVyLmRvbTsNCiAgICAgICAgc2Iuc2Nyb2xsTGVmdCA9IHN0YXRlLmxlZnQ7DQogICAgICAgIHNiLnNjcm9sbFRvcCA9IHN0YXRlLnRvcDsNCiAgICAgICAgdGhpcy5zeW5jU2Nyb2xsKCk7DQogICAgfSwNCg0KICAgIHN5bmNTY3JvbGwgOiBmdW5jdGlvbigpew0KICAgICAgICB2YXIgc2IgPSB0aGlzLnNjcm9sbGVyLmRvbTsNCiAgICAgICAgdmFyIHNoID0gdGhpcy5tYWluSGQuZG9tOw0KICAgICAgICB2YXIgYnMgPSB0aGlzLm1haW5Cb2R5LmRvbTsNCiAgICAgICAgdmFyIGx2ID0gdGhpcy5sb2NrZWRCb2R5LmRvbTsNCiAgICAgICAgc2guc2Nyb2xsTGVmdCA9IGJzLnNjcm9sbExlZnQgPSBzYi5zY3JvbGxMZWZ0Ow0KICAgICAgICBsdi5zY3JvbGxUb3AgPSBicy5zY3JvbGxUb3AgPSBzYi5zY3JvbGxUb3A7DQogICAgfSwNCg0KICAgIGhhbmRsZVNjcm9sbCA6IGZ1bmN0aW9uKGUpew0KICAgICAgICB0aGlzLnN5bmNTY3JvbGwoKTsNCiAgICAgICAgdmFyIHNiID0gdGhpcy5zY3JvbGxlci5kb207DQogICAgICAgIHRoaXMuZ3JpZC5maXJlRXZlbnQoImJvZHlzY3JvbGwiLCBzYi5zY3JvbGxMZWZ0LCBzYi5zY3JvbGxUb3ApOw0KICAgICAgICBlLnN0b3BFdmVudCgpOw0KICAgIH0sDQoNCiAgICBoYW5kbGVXaGVlbCA6IGZ1bmN0aW9uKGUpew0KICAgICAgICB2YXIgZCA9IGUuZ2V0V2hlZWxEZWx0YSgpOw0KICAgICAgICB0aGlzLnNjcm9sbGVyLmRvbS5zY3JvbGxUb3AgLT0gZCoyMjsNCiAgICAgICAgCiAgICAgICAgdGhpcy5sb2NrZWRCb2R5LmRvbS5zY3JvbGxUb3AgPSB0aGlzLm1haW5Cb2R5LmRvbS5zY3JvbGxUb3AgPSB0aGlzLnNjcm9sbGVyLmRvbS5zY3JvbGxUb3A7DQogICAgICAgIGUuc3RvcEV2ZW50KCk7DQogICAgfSwNCg0KICAgIHJlbmRlclJvd3MgOiBmdW5jdGlvbihzdGFydFJvdywgZW5kUm93KXsNCiAgICAgICAgCiAgICAgICAgdmFyIGcgPSB0aGlzLmdyaWQsIGNtID0gZy5jb2xNb2RlbCwgZHMgPSBnLmRhdGFTb3VyY2UsIHN0cmlwZSA9IGcuc3RyaXBlUm93czsNCiAgICAgICAgdmFyIGNvbENvdW50ID0gY20uZ2V0Q29sdW1uQ291bnQoKTsNCg0KICAgICAgICBpZihkcy5nZXRDb3VudCgpIDwgMSl7DQogICAgICAgICAgICByZXR1cm4gWyIiLCAiIl07DQogICAgICAgIH0NCg0KICAgICAgICAKICAgICAgICB2YXIgY3MgPSBbXTsNCiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGNvbENvdW50OyBpKyspew0KICAgICAgICAgICAgdmFyIG5hbWUgPSBjbS5nZXREYXRhSW5kZXgoaSk7DQogICAgICAgICAgICBjc1tpXSA9IHsNCiAgICAgICAgICAgICAgICBuYW1lIDogdHlwZW9mIG5hbWUgPT0gJ3VuZGVmaW5lZCcgPyBkcy5maWVsZHMuZ2V0KGkpLm5hbWUgOiBuYW1lLA0KICAgICAgICAgICAgICAgIHJlbmRlcmVyIDogY20uZ2V0UmVuZGVyZXIoaSksDQogICAgICAgICAgICAgICAgaWQgOiBjbS5nZXRDb2x1bW5JZChpKSwNCiAgICAgICAgICAgICAgICBsb2NrZWQgOiBjbS5pc0xvY2tlZChpKQ0KICAgICAgICAgICAgfTsNCiAgICAgICAgfQ0KDQogICAgICAgIHN0YXJ0Um93ID0gc3RhcnRSb3cgfHwgMDsNCiAgICAgICAgZW5kUm93ID0gdHlwZW9mIGVuZFJvdyA9PSAidW5kZWZpbmVkIj8gZHMuZ2V0Q291bnQoKS0xIDogZW5kUm93Ow0KDQogICAgICAgIAogICAgICAgIHZhciBycyA9IGRzLmdldFJhbmdlKHN0YXJ0Um93LCBlbmRSb3cpOw0KDQogICAgICAgIHJldHVybiB0aGlzLmRvUmVuZGVyKGNzLCBycywgZHMsIHN0YXJ0Um93LCBjb2xDb3VudCwgc3RyaXBlKTsNCiAgICB9LA0KDQogICAgCiAgICAKICAgIAogICAgZG9SZW5kZXIgOiBFeHQuaXNHZWNrbyA/DQogICAgICAgICAgICBmdW5jdGlvbihjcywgcnMsIGRzLCBzdGFydFJvdywgY29sQ291bnQsIHN0cmlwZSl7DQogICAgICAgICAgICAgICAgdmFyIHRzID0gdGhpcy50ZW1wbGF0ZXMsIGN0ID0gdHMuY2VsbCwgcnQgPSB0cy5yb3c7DQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgYnVmID0gIiIsIGxidWYgPSAiIiwgY2IsIGxjYiwgYywgcCA9IHt9LCBycCA9IHt9LCByLCByb3dJbmRleDsNCiAgICAgICAgICAgICAgICBmb3IodmFyIGogPSAwLCBsZW4gPSBycy5sZW5ndGg7IGogPCBsZW47IGorKyl7DQogICAgICAgICAgICAgICAgICAgIHIgPSByc1tqXTsgY2IgPSAiIjsgbGNiID0gIiI7IHJvd0luZGV4ID0gKGorc3RhcnRSb3cpOw0KICAgICAgICAgICAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgY29sQ291bnQ7IGkrKyl7DQogICAgICAgICAgICAgICAgICAgICAgICBjID0gY3NbaV07DQogICAgICAgICAgICAgICAgICAgICAgICBwLmNlbGxJZCA9ICJ4LWdyaWQtY2VsbC0iICsgcm93SW5kZXggKyAiLSIgKyBpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcC5pZCA9IGMuaWQ7DQogICAgICAgICAgICAgICAgICAgICAgICBwLmNzcyA9IHAuYXR0ciA9ICIiOw0KICAgICAgICAgICAgICAgICAgICAgICAgcC52YWx1ZSA9IGMucmVuZGVyZXIoci5kYXRhW2MubmFtZV0sIHAsIHIsIHJvd0luZGV4LCBpLCBkcyk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZihwLnZhbHVlID09IHVuZGVmaW5lZCB8fCBwLnZhbHVlID09PSAiIikgcC52YWx1ZSA9ICImIzE2MDsiOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoci5kaXJ0eSAmJiB0eXBlb2Ygci5tb2RpZmllZFtjLm5hbWVdICE9PSAndW5kZWZpbmVkJyl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5jc3MgKz0gcC5jc3MgPyAnIHgtZ3JpZC1kaXJ0eS1jZWxsJyA6ICd4LWdyaWQtZGlydHktY2VsbCc7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWFya3VwID0gY3QuYXBwbHkocCk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZighYy5sb2NrZWQpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiKz0gbWFya3VwOw0KICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGNiKz0gbWFya3VwOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHZhciBhbHQgPSBbXTsNCiAgICAgICAgICAgICAgICAgICAgaWYoc3RyaXBlICYmICgocm93SW5kZXgrMSkgJSAyID09IDApKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIGFsdFswXSA9ICJ4LWdyaWQtcm93LWFsdCI7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYoci5kaXJ0eSl7DQogICAgICAgICAgICAgICAgICAgICAgICBhbHRbMV0gPSAiIHgtZ3JpZC1kaXJ0eS1yb3ciOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHJwLmNlbGxzID0gbGNiOw0KICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmdldFJvd0NsYXNzKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIGFsdFsyXSA9IHRoaXMuZ2V0Um93Q2xhc3Mociwgcm93SW5kZXgpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHJwLmFsdCA9IGFsdC5qb2luKCIgIik7DQogICAgICAgICAgICAgICAgICAgIGxidWYrPSBydC5hcHBseShycCk7DQogICAgICAgICAgICAgICAgICAgIHJwLmNlbGxzID0gY2I7DQogICAgICAgICAgICAgICAgICAgIGJ1Zis9ICBydC5hcHBseShycCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHJldHVybiBbbGJ1ZiwgYnVmXTsNCiAgICAgICAgICAgIH0gOg0KICAgICAgICAgICAgZnVuY3Rpb24oY3MsIHJzLCBkcywgc3RhcnRSb3csIGNvbENvdW50LCBzdHJpcGUpew0KICAgICAgICAgICAgICAgIHZhciB0cyA9IHRoaXMudGVtcGxhdGVzLCBjdCA9IHRzLmNlbGwsIHJ0ID0gdHMucm93Ow0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJ1ZiA9IFtdLCBsYnVmID0gW10sIGNiLCBsY2IsIGMsIHAgPSB7fSwgcnAgPSB7fSwgciwgcm93SW5kZXg7DQogICAgICAgICAgICAgICAgZm9yKHZhciBqID0gMCwgbGVuID0gcnMubGVuZ3RoOyBqIDwgbGVuOyBqKyspew0KICAgICAgICAgICAgICAgICAgICByID0gcnNbal07IGNiID0gW107IGxjYiA9IFtdOyByb3dJbmRleCA9IChqK3N0YXJ0Um93KTsNCiAgICAgICAgICAgICAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGNvbENvdW50OyBpKyspew0KICAgICAgICAgICAgICAgICAgICAgICAgYyA9IGNzW2ldOw0KICAgICAgICAgICAgICAgICAgICAgICAgcC5jZWxsSWQgPSAieC1ncmlkLWNlbGwtIiArIHJvd0luZGV4ICsgIi0iICsgaTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHAuaWQgPSBjLmlkOw0KICAgICAgICAgICAgICAgICAgICAgICAgcC5jc3MgPSBwLmF0dHIgPSAiIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIHAudmFsdWUgPSBjLnJlbmRlcmVyKHIuZGF0YVtjLm5hbWVdLCBwLCByLCByb3dJbmRleCwgaSwgZHMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYocC52YWx1ZSA9PSB1bmRlZmluZWQgfHwgcC52YWx1ZSA9PT0gIiIpIHAudmFsdWUgPSAiJiMxNjA7IjsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHIuZGlydHkgJiYgdHlwZW9mIHIubW9kaWZpZWRbYy5uYW1lXSAhPT0gJ3VuZGVmaW5lZCcpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuY3NzICs9IHAuY3NzID8gJyB4LWdyaWQtZGlydHktY2VsbCcgOiAneC1ncmlkLWRpcnR5LWNlbGwnOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hcmt1cCA9IGN0LmFwcGx5KHApOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWMubG9ja2VkKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYltjYi5sZW5ndGhdID0gbWFya3VwOw0KICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGNiW2xjYi5sZW5ndGhdID0gbWFya3VwOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHZhciBhbHQgPSBbXTsNCiAgICAgICAgICAgICAgICAgICAgaWYoc3RyaXBlICYmICgocm93SW5kZXgrMSkgJSAyID09IDApKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIGFsdFswXSA9ICJ4LWdyaWQtcm93LWFsdCI7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYoci5kaXJ0eSl7DQogICAgICAgICAgICAgICAgICAgICAgICBhbHRbMV0gPSAiIHgtZ3JpZC1kaXJ0eS1yb3ciOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHJwLmNlbGxzID0gbGNiOw0KICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmdldFJvd0NsYXNzKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIGFsdFsyXSA9IHRoaXMuZ2V0Um93Q2xhc3Mociwgcm93SW5kZXgpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHJwLmFsdCA9IGFsdC5qb2luKCIgIik7DQogICAgICAgICAgICAgICAgICAgIHJwLmNlbGxzID0gbGNiLmpvaW4oIiIpOw0KICAgICAgICAgICAgICAgICAgICBsYnVmW2xidWYubGVuZ3RoXSA9IHJ0LmFwcGx5KHJwKTsNCiAgICAgICAgICAgICAgICAgICAgcnAuY2VsbHMgPSBjYi5qb2luKCIiKTsNCiAgICAgICAgICAgICAgICAgICAgYnVmW2J1Zi5sZW5ndGhdID0gIHJ0LmFwcGx5KHJwKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuIFtsYnVmLmpvaW4oIiIpLCBidWYuam9pbigiIildOw0KICAgICAgICAgICAgfSwNCg0KICAgIHJlbmRlckJvZHkgOiBmdW5jdGlvbigpew0KICAgICAgICB2YXIgbWFya3VwID0gdGhpcy5yZW5kZXJSb3dzKCk7DQogICAgICAgIHZhciBidCA9IHRoaXMudGVtcGxhdGVzLmJvZHk7DQogICAgICAgIHJldHVybiBbYnQuYXBwbHkoe3Jvd3M6IG1hcmt1cFswXX0pLCBidC5hcHBseSh7cm93czogbWFya3VwWzFdfSldOw0KICAgIH0sDQoNCiAgICANCiAgICByZWZyZXNoIDogZnVuY3Rpb24oaGVhZGVyc1Rvbyl7DQogICAgICAgIHRoaXMuZmlyZUV2ZW50KCJiZWZvcmVyZWZyZXNoIiwgdGhpcyk7DQogICAgICAgIHRoaXMuZ3JpZC5zdG9wRWRpdGluZygpOw0KICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5yZW5kZXJCb2R5KCk7DQogICAgICAgIHRoaXMubG9ja2VkQm9keS51cGRhdGUocmVzdWx0WzBdKTsNCiAgICAgICAgdGhpcy5tYWluQm9keS51cGRhdGUocmVzdWx0WzFdKTsNCiAgICAgICAgaWYoaGVhZGVyc1RvbyA9PT0gdHJ1ZSl7DQogICAgICAgICAgICB0aGlzLnVwZGF0ZUhlYWRlcnMoKTsNCiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29sdW1ucygpOw0KICAgICAgICAgICAgdGhpcy51cGRhdGVTcGxpdHRlcnMoKTsNCiAgICAgICAgICAgIHRoaXMudXBkYXRlSGVhZGVyU29ydFN0YXRlKCk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5zeW5jUm93SGVpZ2h0cygpOw0KICAgICAgICB0aGlzLmxheW91dCgpOw0KICAgICAgICB0aGlzLmZpcmVFdmVudCgicmVmcmVzaCIsIHRoaXMpOw0KICAgIH0sDQoNCiAgICBoYW5kbGVDb2x1bW5Nb3ZlIDogZnVuY3Rpb24oY20sIG9sZEluZGV4LCBuZXdJbmRleCl7DQogICAgICAgIHRoaXMuaW5kZXhNYXAgPSBudWxsOw0KICAgICAgICB2YXIgcyA9IHRoaXMuZ2V0U2Nyb2xsU3RhdGUoKTsNCiAgICAgICAgdGhpcy5yZWZyZXNoKHRydWUpOw0KICAgICAgICB0aGlzLnJlc3RvcmVTY3JvbGwocyk7DQogICAgICAgIHRoaXMuYWZ0ZXJNb3ZlKG5ld0luZGV4KTsNCiAgICB9LA0KDQogICAgYWZ0ZXJNb3ZlIDogZnVuY3Rpb24oY29sSW5kZXgpew0KICAgICAgICBpZih0aGlzLmVuYWJsZU1vdmVBbmltICYmIEV4dC5lbmFibGVGeCl7DQogICAgICAgICAgICB0aGlzLmZseSh0aGlzLmdldEhlYWRlckNlbGwoY29sSW5kZXgpLmZpcnN0Q2hpbGQpLmhpZ2hsaWdodCh0aGlzLmhsQ29sb3IpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIHVwZGF0ZUNlbGwgOiBmdW5jdGlvbihkbSwgcm93SW5kZXgsIGRhdGFJbmRleCl7DQogICAgICAgIHZhciBjb2xJbmRleCA9IHRoaXMuZ2V0Q29sdW1uSW5kZXhCeURhdGFJbmRleChkYXRhSW5kZXgpOw0KICAgICAgICBpZih0eXBlb2YgY29sSW5kZXggPT0gInVuZGVmaW5lZCIpeyAKICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQogICAgICAgIHZhciBjbSA9IHRoaXMuZ3JpZC5jb2xNb2RlbDsNCiAgICAgICAgdmFyIGNlbGwgPSB0aGlzLmdldENlbGwocm93SW5kZXgsIGNvbEluZGV4KTsNCiAgICAgICAgdmFyIGNlbGxUZXh0ID0gdGhpcy5nZXRDZWxsVGV4dChyb3dJbmRleCwgY29sSW5kZXgpOw0KDQogICAgICAgIHZhciBwID0gew0KICAgICAgICAgICAgY2VsbElkIDogIngtZ3JpZC1jZWxsLSIgKyByb3dJbmRleCArICItIiArIGNvbEluZGV4LA0KICAgICAgICAgICAgaWQgOiBjbS5nZXRDb2x1bW5JZChjb2xJbmRleCksDQogICAgICAgICAgICBjc3M6IGNvbEluZGV4ID09IGNtLmdldENvbHVtbkNvdW50KCktMSA/ICJ4LWdyaWQtY29sLWxhc3QiIDogIiINCiAgICAgICAgfTsNCiAgICAgICAgdmFyIHJlbmRlcmVyID0gY20uZ2V0UmVuZGVyZXIoY29sSW5kZXgpOw0KICAgICAgICB2YXIgdmFsID0gcmVuZGVyZXIoZG0uZ2V0VmFsdWVBdChyb3dJbmRleCwgZGF0YUluZGV4KSwgcCwgcm93SW5kZXgsIGNvbEluZGV4LCBkbSk7DQogICAgICAgIGlmKHR5cGVvZiB2YWwgPT0gInVuZGVmaW5lZCIgfHwgdmFsID09PSAiIikgdmFsID0gIiYjMTYwOyI7DQogICAgICAgIGNlbGxUZXh0LmlubmVySFRNTCA9IHZhbDsNCiAgICAgICAgY2VsbC5jbGFzc05hbWUgPSB0aGlzLmNlbGxDbGFzcyArICIgIiArIHAuY2VsbElkICsgIiAiICsgcC5jc3M7DQogICAgICAgIHRoaXMuc3luY1Jvd0hlaWdodHMocm93SW5kZXgsIHJvd0luZGV4KTsNCiAgICB9LA0KDQogICAgY2FsY0NvbHVtbldpZHRoIDogZnVuY3Rpb24oY29sSW5kZXgsIG1heFJvd3NUb01lYXN1cmUpew0KICAgICAgICB2YXIgbWF4V2lkdGggPSAwOw0KICAgICAgICBpZih0aGlzLmdyaWQuYXV0b1NpemVIZWFkZXJzKXsNCiAgICAgICAgICAgIHZhciBoID0gdGhpcy5nZXRIZWFkZXJDZWxsTWVhc3VyZShjb2xJbmRleCk7DQogICAgICAgICAgICBtYXhXaWR0aCA9IE1hdGgubWF4KG1heFdpZHRoLCBoLnNjcm9sbFdpZHRoKTsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgdGIsIGluZGV4Ow0KICAgICAgICBpZih0aGlzLmNtLmlzTG9ja2VkKGNvbEluZGV4KSl7DQogICAgICAgICAgICB0YiA9IHRoaXMuZ2V0TG9ja2VkVGFibGUoKTsNCiAgICAgICAgICAgIGluZGV4ID0gY29sSW5kZXg7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgdGIgPSB0aGlzLmdldEJvZHlUYWJsZSgpOw0KICAgICAgICAgICAgaW5kZXggPSBjb2xJbmRleCAtIHRoaXMuY20uZ2V0TG9ja2VkQ291bnQoKTsNCiAgICAgICAgfQ0KICAgICAgICBpZih0YiAmJiB0Yi5yb3dzKXsNCiAgICAgICAgICAgIHZhciByb3dzID0gdGIucm93czsNCiAgICAgICAgICAgIHZhciBzdG9wSW5kZXggPSBNYXRoLm1pbihtYXhSb3dzVG9NZWFzdXJlIHx8IHJvd3MubGVuZ3RoLCByb3dzLmxlbmd0aCk7DQogICAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgc3RvcEluZGV4OyBpKyspew0KICAgICAgICAgICAgICAgIHZhciBjZWxsID0gcm93c1tpXS5jaGlsZE5vZGVzW2luZGV4XS5maXJzdENoaWxkOw0KICAgICAgICAgICAgICAgIG1heFdpZHRoID0gTWF0aC5tYXgobWF4V2lkdGgsIGNlbGwuc2Nyb2xsV2lkdGgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiBtYXhXaWR0aCArICA1Ow0KICAgIH0sDQogICAgDQogICAgIGF1dG9TaXplQ29sdW1uIDogZnVuY3Rpb24oY29sSW5kZXgsIGZvcmNlTWluU2l6ZSwgc3VwcHJlc3NFdmVudCl7DQogICAgICAgICBpZih0aGlzLmNtLmlzSGlkZGVuKGNvbEluZGV4KSl7DQogICAgICAgICAgICAgcmV0dXJuOyAKICAgICAgICAgfQ0KICAgICAgICBpZihmb3JjZU1pblNpemUpew0KICAgICAgICAgICAgdmFyIGNpZCA9IHRoaXMuY20uZ2V0Q29sdW1uSWQoY29sSW5kZXgpOw0KICAgICAgICAgICAgdGhpcy5jc3MudXBkYXRlUnVsZSh0aGlzLmNvbFNlbGVjdG9yICsgY2lkLCAid2lkdGgiLCB0aGlzLmdyaWQubWluQ29sdW1uV2lkdGggKyAicHgiKTsNCiAgICAgICAgICAgaWYodGhpcy5ncmlkLmF1dG9TaXplSGVhZGVycyl7DQogICAgICAgICAgICAgICB0aGlzLmNzcy51cGRhdGVSdWxlKHRoaXMuaGRTZWxlY3RvciArIGNpZCwgIndpZHRoIiwgdGhpcy5ncmlkLm1pbkNvbHVtbldpZHRoICsgInB4Iik7DQogICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICB2YXIgbmV3V2lkdGggPSB0aGlzLmNhbGNDb2x1bW5XaWR0aChjb2xJbmRleCk7DQogICAgICAgIHRoaXMuY20uc2V0Q29sdW1uV2lkdGgoY29sSW5kZXgsDQogICAgICAgICAgICBNYXRoLm1heCh0aGlzLmdyaWQubWluQ29sdW1uV2lkdGgsIG5ld1dpZHRoKSwgc3VwcHJlc3NFdmVudCk7DQogICAgICAgIGlmKCFzdXBwcmVzc0V2ZW50KXsNCiAgICAgICAgICAgIHRoaXMuZ3JpZC5maXJlRXZlbnQoImNvbHVtbnJlc2l6ZSIsIGNvbEluZGV4LCBuZXdXaWR0aCk7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgDQogICAgIGF1dG9TaXplQ29sdW1ucyA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHZhciBjbSA9IHRoaXMuZ3JpZC5jb2xNb2RlbDsNCiAgICAgICAgdmFyIGNvbENvdW50ID0gY20uZ2V0Q29sdW1uQ291bnQoKTsNCiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGNvbENvdW50OyBpKyspew0KICAgICAgICAgICAgdGhpcy5hdXRvU2l6ZUNvbHVtbihpLCB0cnVlLCB0cnVlKTsNCiAgICAgICAgfQ0KICAgICAgICBpZihjbS5nZXRUb3RhbFdpZHRoKCkgPCB0aGlzLnNjcm9sbGVyLmRvbS5jbGllbnRXaWR0aCl7DQogICAgICAgICAgICB0aGlzLmZpdENvbHVtbnMoKTsNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbHVtbnMoKTsNCiAgICAgICAgICAgIHRoaXMubGF5b3V0KCk7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgDQogICAgZml0Q29sdW1ucyA6IGZ1bmN0aW9uKHJlc2VydmVTY3JvbGxTcGFjZSl7DQogICAgICAgIHZhciBjbSA9IHRoaXMuZ3JpZC5jb2xNb2RlbDsNCiAgICAgICAgdmFyIGNvbENvdW50ID0gY20uZ2V0Q29sdW1uQ291bnQoKTsNCiAgICAgICAgdmFyIGNvbHMgPSBbXTsNCiAgICAgICAgdmFyIHdpZHRoID0gMDsNCiAgICAgICAgdmFyIGksIHc7DQogICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb2xDb3VudDsgaSsrKXsNCiAgICAgICAgICAgIGlmKCFjbS5pc0hpZGRlbihpKSAmJiAhY20uaXNGaXhlZChpKSl7DQogICAgICAgICAgICAgICAgdyA9IGNtLmdldENvbHVtbldpZHRoKGkpOw0KICAgICAgICAgICAgICAgIGNvbHMucHVzaChpKTsNCiAgICAgICAgICAgICAgICBjb2xzLnB1c2godyk7DQogICAgICAgICAgICAgICAgd2lkdGggKz0gdzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICB2YXIgYXZhaWwgPSBNYXRoLm1pbih0aGlzLnNjcm9sbGVyLmRvbS5jbGllbnRXaWR0aCwgdGhpcy5lbC5nZXRXaWR0aCgpKTsNCiAgICAgICAgaWYocmVzZXJ2ZVNjcm9sbFNwYWNlKXsNCiAgICAgICAgICAgIGF2YWlsIC09IDE3Ow0KICAgICAgICB9DQogICAgICAgIHZhciBmcmFjID0gKGF2YWlsIC0gY20uZ2V0VG90YWxXaWR0aCgpKS93aWR0aDsNCiAgICAgICAgd2hpbGUgKGNvbHMubGVuZ3RoKXsNCiAgICAgICAgICAgIHcgPSBjb2xzLnBvcCgpOw0KICAgICAgICAgICAgaSA9IGNvbHMucG9wKCk7DQogICAgICAgICAgICBjbS5zZXRDb2x1bW5XaWR0aChpLCBNYXRoLmZsb29yKHcgKyB3KmZyYWMpLCB0cnVlKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLnVwZGF0ZUNvbHVtbnMoKTsNCiAgICAgICAgdGhpcy5sYXlvdXQoKTsNCiAgICB9LA0KDQogICAgb25Sb3dTZWxlY3QgOiBmdW5jdGlvbihyb3dJbmRleCl7DQogICAgICAgIHZhciByb3cgPSB0aGlzLmdldFJvd0NvbXBvc2l0ZShyb3dJbmRleCk7DQogICAgICAgIHJvdy5hZGRDbGFzcygieC1ncmlkLXJvdy1zZWxlY3RlZCIpOw0KICAgIH0sDQoNCiAgICBvblJvd0Rlc2VsZWN0IDogZnVuY3Rpb24ocm93SW5kZXgpew0KICAgICAgICB2YXIgcm93ID0gdGhpcy5nZXRSb3dDb21wb3NpdGUocm93SW5kZXgpOw0KICAgICAgICByb3cucmVtb3ZlQ2xhc3MoIngtZ3JpZC1yb3ctc2VsZWN0ZWQiKTsNCiAgICB9LA0KDQogICAgb25DZWxsU2VsZWN0IDogZnVuY3Rpb24ocm93LCBjb2wpew0KICAgICAgICB2YXIgY2VsbCA9IHRoaXMuZ2V0Q2VsbChyb3csIGNvbCk7DQogICAgICAgIGlmKGNlbGwpew0KICAgICAgICAgICAgRXh0LmZseShjZWxsKS5hZGRDbGFzcygieC1ncmlkLWNlbGwtc2VsZWN0ZWQiKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICBvbkNlbGxEZXNlbGVjdCA6IGZ1bmN0aW9uKHJvdywgY29sKXsNCiAgICAgICAgdmFyIGNlbGwgPSB0aGlzLmdldENlbGwocm93LCBjb2wpOw0KICAgICAgICBpZihjZWxsKXsNCiAgICAgICAgICAgIEV4dC5mbHkoY2VsbCkucmVtb3ZlQ2xhc3MoIngtZ3JpZC1jZWxsLXNlbGVjdGVkIik7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgdXBkYXRlSGVhZGVyU29ydFN0YXRlIDogZnVuY3Rpb24oKXsNCiAgICAgICAgdmFyIHN0YXRlID0gdGhpcy5kcy5nZXRTb3J0U3RhdGUoKTsNCiAgICAgICAgaWYoIXN0YXRlKXsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLnNvcnRTdGF0ZSA9IHN0YXRlOw0KICAgICAgICB2YXIgc29ydENvbHVtbiA9IHRoaXMuY20uZmluZENvbHVtbkluZGV4KHN0YXRlLmZpZWxkKTsNCiAgICAgICAgaWYoc29ydENvbHVtbiAhPSAtMSl7DQogICAgICAgICAgICB2YXIgc29ydERpciA9IHN0YXRlLmRpcmVjdGlvbjsNCiAgICAgICAgICAgIHZhciBzYyA9IHRoaXMuc29ydENsYXNzZXM7DQogICAgICAgICAgICB2YXIgaGRzID0gdGhpcy5lbC5zZWxlY3QodGhpcy5oZWFkZXJTZWxlY3RvcikucmVtb3ZlQ2xhc3Moc2MpOw0KICAgICAgICAgICAgaGRzLml0ZW0oc29ydENvbHVtbikuYWRkQ2xhc3Moc2Nbc29ydERpciA9PSAiREVTQyIgPyAxIDogMF0pOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIGhhbmRsZUhlYWRlckNsaWNrIDogZnVuY3Rpb24oZywgaW5kZXgpew0KICAgICAgICBpZih0aGlzLmhlYWRlcnNEaXNhYmxlZCl7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICAgICAgdmFyIGRtID0gZy5kYXRhU291cmNlLCBjbSA9IGcuY29sTW9kZWw7DQoJICAgIGlmKCFjbS5pc1NvcnRhYmxlKGluZGV4KSl7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCgkgICAgZy5zdG9wRWRpdGluZygpOw0KICAgICAgICBkbS5zb3J0KGNtLmdldERhdGFJbmRleChpbmRleCkpOw0KICAgIH0sDQoNCg0KICAgIGRlc3Ryb3kgOiBmdW5jdGlvbigpew0KICAgICAgICBpZih0aGlzLmNvbE1lbnUpew0KICAgICAgICAgICAgdGhpcy5jb2xNZW51LnJlbW92ZUFsbCgpOw0KICAgICAgICAgICAgRXh0Lm1lbnUuTWVudU1nci51bnJlZ2lzdGVyKHRoaXMuY29sTWVudSk7DQogICAgICAgICAgICB0aGlzLmNvbE1lbnUuZ2V0RWwoKS5yZW1vdmUoKTsNCiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvbE1lbnU7DQogICAgICAgIH0NCiAgICAgICAgaWYodGhpcy5obWVudSl7DQogICAgICAgICAgICB0aGlzLmhtZW51LnJlbW92ZUFsbCgpOw0KICAgICAgICAgICAgRXh0Lm1lbnUuTWVudU1nci51bnJlZ2lzdGVyKHRoaXMuaG1lbnUpOw0KICAgICAgICAgICAgdGhpcy5obWVudS5nZXRFbCgpLnJlbW92ZSgpOw0KICAgICAgICAgICAgZGVsZXRlIHRoaXMuaG1lbnU7DQogICAgICAgIH0NCiAgICAgICAgaWYodGhpcy5ncmlkLmVuYWJsZUNvbHVtbk1vdmUpew0KICAgICAgICAgICAgdmFyIGRkcyA9IEV4dC5kZC5ERE0uaWRzWydncmlkSGVhZGVyJyArIHRoaXMuZ3JpZC5nZXRHcmlkRWwoKS5pZF07DQogICAgICAgICAgICBpZihkZHMpew0KICAgICAgICAgICAgICAgIGZvcih2YXIgZGQgaW4gZGRzKXsNCiAgICAgICAgICAgICAgICAgICAgaWYoIWRkc1tkZF0uY29uZmlnLmlzVGFyZ2V0ICYmIGRkc1tkZF0uZHJhZ0VsSWQpew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVsaWQgPSBkZHNbZGRdLmRyYWdFbElkOw0KICAgICAgICAgICAgICAgICAgICAgICAgZGRzW2RkXS51bnJlZygpOw0KICAgICAgICAgICAgICAgICAgICAgICAgRXh0LmdldChlbGlkKS5yZW1vdmUoKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKGRkc1tkZF0uY29uZmlnLmlzVGFyZ2V0KXsNCiAgICAgICAgICAgICAgICAgICAgICAgIGRkc1tkZF0ucHJveHlUb3AucmVtb3ZlKCk7DQogICAgICAgICAgICAgICAgICAgICAgICBkZHNbZGRdLnByb3h5Qm90dG9tLnJlbW92ZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgZGRzW2RkXS51bnJlZygpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmKEV4dC5kZC5ERE0ubG9jYXRpb25DYWNoZVtkZF0pew0KICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIEV4dC5kZC5ERE0ubG9jYXRpb25DYWNoZVtkZF07DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZGVsZXRlIEV4dC5kZC5ERE0uaWRzWydncmlkSGVhZGVyJyArIHRoaXMuZ3JpZC5nZXRHcmlkRWwoKS5pZF07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgRXh0LnV0aWwuQ1NTLnJlbW92ZVN0eWxlU2hlZXQodGhpcy5ncmlkLmlkICsgJy1jc3NydWxlcycpOw0KICAgICAgICB0aGlzLmJpbmQobnVsbCwgbnVsbCk7DQogICAgICAgIEV4dC5FdmVudE1hbmFnZXIucmVtb3ZlUmVzaXplTGlzdGVuZXIodGhpcy5vbldpbmRvd1Jlc2l6ZSwgdGhpcyk7DQogICAgfSwNCg0KICAgIGhhbmRsZUxvY2tDaGFuZ2UgOiBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLnJlZnJlc2godHJ1ZSk7DQogICAgfSwNCg0KICAgIG9uRGVueUNvbHVtbkxvY2sgOiBmdW5jdGlvbigpew0KDQogICAgfSwNCg0KICAgIG9uRGVueUNvbHVtbkhpZGUgOiBmdW5jdGlvbigpew0KDQogICAgfSwNCg0KICAgIGhhbmRsZUhkTWVudUNsaWNrIDogZnVuY3Rpb24oaXRlbSl7DQogICAgICAgIHZhciBpbmRleCA9IHRoaXMuaGRDdHhJbmRleDsNCiAgICAgICAgdmFyIGNtID0gdGhpcy5jbSwgZHMgPSB0aGlzLmRzOw0KICAgICAgICBzd2l0Y2goaXRlbS5pZCl7DQogICAgICAgICAgICBjYXNlICJhc2MiOg0KICAgICAgICAgICAgICAgIGRzLnNvcnQoY20uZ2V0RGF0YUluZGV4KGluZGV4KSwgIkFTQyIpOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAiZGVzYyI6DQogICAgICAgICAgICAgICAgZHMuc29ydChjbS5nZXREYXRhSW5kZXgoaW5kZXgpLCAiREVTQyIpOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAibG9jayI6DQogICAgICAgICAgICAgICAgdmFyIGxjID0gY20uZ2V0TG9ja2VkQ291bnQoKTsNCiAgICAgICAgICAgICAgICBpZihjbS5nZXRDb2x1bW5Db3VudCh0cnVlKSA8PSBsYysxKXsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkRlbnlDb2x1bW5Mb2NrKCk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYobGMgIT0gaW5kZXgpew0KICAgICAgICAgICAgICAgICAgICBjbS5zZXRMb2NrZWQoaW5kZXgsIHRydWUsIHRydWUpOw0KICAgICAgICAgICAgICAgICAgICBjbS5tb3ZlQ29sdW1uKGluZGV4LCBsYyk7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5maXJlRXZlbnQoImNvbHVtbm1vdmUiLCBpbmRleCwgbGMpOw0KICAgICAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgICAgICBjbS5zZXRMb2NrZWQoaW5kZXgsIHRydWUpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAidW5sb2NrIjoNCiAgICAgICAgICAgICAgICB2YXIgbGMgPSBjbS5nZXRMb2NrZWRDb3VudCgpOw0KICAgICAgICAgICAgICAgIGlmKChsYy0xKSAhPSBpbmRleCl7DQogICAgICAgICAgICAgICAgICAgIGNtLnNldExvY2tlZChpbmRleCwgZmFsc2UsIHRydWUpOw0KICAgICAgICAgICAgICAgICAgICBjbS5tb3ZlQ29sdW1uKGluZGV4LCBsYy0xKTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkLmZpcmVFdmVudCgiY29sdW1ubW92ZSIsIGluZGV4LCBsYy0xKTsNCiAgICAgICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICAgICAgY20uc2V0TG9ja2VkKGluZGV4LCBmYWxzZSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgIGluZGV4ID0gY20uZ2V0SW5kZXhCeUlkKGl0ZW0uaWQuc3Vic3RyKDQpKTsNCiAgICAgICAgICAgICAgICBpZihpbmRleCAhPSAtMSl7DQogICAgICAgICAgICAgICAgICAgIGlmKGl0ZW0uY2hlY2tlZCAmJiBjbS5nZXRDb2x1bW5Db3VudCh0cnVlKSA8PSAxKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25EZW55Q29sdW1uSGlkZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGNtLnNldEhpZGRlbihpbmRleCwgaXRlbS5jaGVja2VkKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgfSwNCg0KICAgIGJlZm9yZUNvbE1lbnVTaG93IDogZnVuY3Rpb24oKXsNCiAgICAgICAgdmFyIGNtID0gdGhpcy5jbSwgIGNvbENvdW50ID0gY20uZ2V0Q29sdW1uQ291bnQoKTsNCiAgICAgICAgdGhpcy5jb2xNZW51LnJlbW92ZUFsbCgpOw0KICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgY29sQ291bnQ7IGkrKyl7DQogICAgICAgICAgICB0aGlzLmNvbE1lbnUuYWRkKG5ldyBFeHQubWVudS5DaGVja0l0ZW0oew0KICAgICAgICAgICAgICAgIGlkOiAiY29sLSIrY20uZ2V0Q29sdW1uSWQoaSksDQogICAgICAgICAgICAgICAgdGV4dDogY20uZ2V0Q29sdW1uSGVhZGVyKGkpLA0KICAgICAgICAgICAgICAgIGNoZWNrZWQ6ICFjbS5pc0hpZGRlbihpKSwNCiAgICAgICAgICAgICAgICBoaWRlT25DbGljazpmYWxzZQ0KICAgICAgICAgICAgfSkpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIGhhbmRsZUhkQ3R4IDogZnVuY3Rpb24oZywgaW5kZXgsIGUpew0KICAgICAgICBlLnN0b3BFdmVudCgpOw0KICAgICAgICB2YXIgaGQgPSB0aGlzLmdldEhlYWRlckNlbGwoaW5kZXgpOw0KICAgICAgICB0aGlzLmhkQ3R4SW5kZXggPSBpbmRleDsNCiAgICAgICAgdmFyIG1zID0gdGhpcy5obWVudS5pdGVtcywgY20gPSB0aGlzLmNtOw0KICAgICAgICBtcy5nZXQoImFzYyIpLnNldERpc2FibGVkKCFjbS5pc1NvcnRhYmxlKGluZGV4KSk7DQogICAgICAgIG1zLmdldCgiZGVzYyIpLnNldERpc2FibGVkKCFjbS5pc1NvcnRhYmxlKGluZGV4KSk7DQogICAgICAgIGlmKHRoaXMuZ3JpZC5lbmFibGVDb2xMb2NrICE9PSBmYWxzZSl7DQogICAgICAgICAgICBtcy5nZXQoImxvY2siKS5zZXREaXNhYmxlZChjbS5pc0xvY2tlZChpbmRleCkpOw0KICAgICAgICAgICAgbXMuZ2V0KCJ1bmxvY2siKS5zZXREaXNhYmxlZCghY20uaXNMb2NrZWQoaW5kZXgpKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmhtZW51LnNob3coaGQsICJ0bC1ibCIpOw0KICAgIH0sDQoNCiAgICBoYW5kbGVIZE92ZXIgOiBmdW5jdGlvbihlKXsNCiAgICAgICAgdmFyIGhkID0gdGhpcy5maW5kSGVhZGVyQ2VsbChlLmdldFRhcmdldCgpKTsNCiAgICAgICAgaWYoaGQgJiYgIXRoaXMuaGVhZGVyc0Rpc2FibGVkKXsNCiAgICAgICAgICAgIGlmKHRoaXMuZ3JpZC5jb2xNb2RlbC5pc1NvcnRhYmxlKHRoaXMuZ2V0Q2VsbEluZGV4KGhkKSkpew0KICAgICAgICAgICAgICAgdGhpcy5mbHkoaGQpLmFkZENsYXNzKCJ4LWdyaWQtaGQtb3ZlciIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSwNCg0KICAgIGhhbmRsZUhkT3V0IDogZnVuY3Rpb24oZSl7DQogICAgICAgIHZhciBoZCA9IHRoaXMuZmluZEhlYWRlckNlbGwoZS5nZXRUYXJnZXQoKSk7DQogICAgICAgIGlmKGhkKXsNCiAgICAgICAgICAgIHRoaXMuZmx5KGhkKS5yZW1vdmVDbGFzcygieC1ncmlkLWhkLW92ZXIiKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICBoYW5kbGVTcGxpdERibENsaWNrIDogZnVuY3Rpb24oZSwgdCl7DQogICAgICAgIHZhciBpID0gdGhpcy5nZXRDZWxsSW5kZXgodCk7DQogICAgICAgIGlmKHRoaXMuZ3JpZC5lbmFibGVDb2x1bW5SZXNpemUgIT09IGZhbHNlICYmIHRoaXMuY20uaXNSZXNpemFibGUoaSkgJiYgIXRoaXMuY20uaXNGaXhlZChpKSl7DQogICAgICAgICAgICB0aGlzLmF1dG9TaXplQ29sdW1uKGksIHRydWUpOw0KICAgICAgICAgICAgdGhpcy5sYXlvdXQoKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICByZW5kZXIgOiBmdW5jdGlvbigpew0KDQogICAgICAgIHZhciBjbSA9IHRoaXMuY207DQogICAgICAgIHZhciBjb2xDb3VudCA9IGNtLmdldENvbHVtbkNvdW50KCk7DQoNCiAgICAgICAgaWYodGhpcy5ncmlkLm1vbml0b3JXaW5kb3dSZXNpemUgPT09IHRydWUpew0KICAgICAgICAgICAgRXh0LkV2ZW50TWFuYWdlci5vbldpbmRvd1Jlc2l6ZSh0aGlzLm9uV2luZG93UmVzaXplLCB0aGlzLCB0cnVlKTsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgaGVhZGVyID0gdGhpcy5yZW5kZXJIZWFkZXJzKCk7DQogICAgICAgIHZhciBib2R5ID0gdGhpcy50ZW1wbGF0ZXMuYm9keS5hcHBseSh7cm93czoiIn0pOw0KICAgICAgICB2YXIgaHRtbCA9IHRoaXMudGVtcGxhdGVzLm1hc3Rlci5hcHBseSh7DQogICAgICAgICAgICBsb2NrZWRCb2R5OiBib2R5LA0KICAgICAgICAgICAgYm9keTogYm9keSwNCiAgICAgICAgICAgIGxvY2tlZEhlYWRlcjogaGVhZGVyWzBdLA0KICAgICAgICAgICAgaGVhZGVyOiBoZWFkZXJbMV0NCiAgICAgICAgfSk7DQoNCiAgICAgICAgCg0KICAgICAgICB0aGlzLmdyaWQuZ2V0R3JpZEVsKCkuZG9tLmlubmVySFRNTCA9IGh0bWw7DQoNCiAgICAgICAgdGhpcy5pbml0RWxlbWVudHMoKTsNCg0KICAgICAgICB0aGlzLnNjcm9sbGVyLm9uKCJzY3JvbGwiLCB0aGlzLmhhbmRsZVNjcm9sbCwgdGhpcyk7DQogICAgICAgIHRoaXMubG9ja2VkQm9keS5vbigibW91c2V3aGVlbCIsIHRoaXMuaGFuZGxlV2hlZWwsIHRoaXMpOw0KICAgICAgICB0aGlzLm1haW5Cb2R5Lm9uKCJtb3VzZXdoZWVsIiwgdGhpcy5oYW5kbGVXaGVlbCwgdGhpcyk7DQoNCiAgICAgICAgdGhpcy5tYWluSGQub24oIm1vdXNlb3ZlciIsIHRoaXMuaGFuZGxlSGRPdmVyLCB0aGlzKTsNCiAgICAgICAgdGhpcy5tYWluSGQub24oIm1vdXNlb3V0IiwgdGhpcy5oYW5kbGVIZE91dCwgdGhpcyk7DQogICAgICAgIHRoaXMubWFpbkhkLm9uKCJkYmxjbGljayIsIHRoaXMuaGFuZGxlU3BsaXREYmxDbGljaywgdGhpcywNCiAgICAgICAgICAgICAgICB7ZGVsZWdhdGU6ICIuIit0aGlzLnNwbGl0Q2xhc3N9KTsNCg0KICAgICAgICB0aGlzLmxvY2tlZEhkLm9uKCJtb3VzZW92ZXIiLCB0aGlzLmhhbmRsZUhkT3ZlciwgdGhpcyk7DQogICAgICAgIHRoaXMubG9ja2VkSGQub24oIm1vdXNlb3V0IiwgdGhpcy5oYW5kbGVIZE91dCwgdGhpcyk7DQogICAgICAgIHRoaXMubG9ja2VkSGQub24oImRibGNsaWNrIiwgdGhpcy5oYW5kbGVTcGxpdERibENsaWNrLCB0aGlzLA0KICAgICAgICAgICAgICAgIHtkZWxlZ2F0ZTogIi4iK3RoaXMuc3BsaXRDbGFzc30pOw0KDQogICAgICAgIGlmKHRoaXMuZ3JpZC5lbmFibGVDb2x1bW5SZXNpemUgIT09IGZhbHNlICYmIEV4dC5ncmlkLlNwbGl0RHJhZ1pvbmUpew0KICAgICAgICAgICAgbmV3IEV4dC5ncmlkLlNwbGl0RHJhZ1pvbmUodGhpcy5ncmlkLCB0aGlzLmxvY2tlZEhkLmRvbSwgdGhpcy5tYWluSGQuZG9tKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHRoaXMudXBkYXRlU3BsaXR0ZXJzKCk7DQoNCiAgICAgICAgaWYodGhpcy5ncmlkLmVuYWJsZUNvbHVtbk1vdmUgJiYgRXh0LmdyaWQuSGVhZGVyRHJhZ1pvbmUpew0KICAgICAgICAgICAgbmV3IEV4dC5ncmlkLkhlYWRlckRyYWdab25lKHRoaXMuZ3JpZCwgdGhpcy5sb2NrZWRIZC5kb20sIHRoaXMubWFpbkhkLmRvbSk7DQogICAgICAgICAgICBuZXcgRXh0LmdyaWQuSGVhZGVyRHJvcFpvbmUodGhpcy5ncmlkLCB0aGlzLmxvY2tlZEhkLmRvbSwgdGhpcy5tYWluSGQuZG9tKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmKHRoaXMuZ3JpZC5lbmFibGVDdHhNZW51ICE9PSBmYWxzZSAmJiBFeHQubWVudS5NZW51KXsNCiAgICAgICAgICAgIHRoaXMuaG1lbnUgPSBuZXcgRXh0Lm1lbnUuTWVudSh7aWQ6IHRoaXMuZ3JpZC5pZCArICItaGN0eCJ9KTsNCiAgICAgICAgICAgIHRoaXMuaG1lbnUuYWRkKA0KICAgICAgICAgICAgICAgIHtpZDoiYXNjIiwgdGV4dDogdGhpcy5zb3J0QXNjVGV4dCwgY2xzOiAieGctaG1lbnUtc29ydC1hc2MifSwNCiAgICAgICAgICAgICAgICB7aWQ6ImRlc2MiLCB0ZXh0OiB0aGlzLnNvcnREZXNjVGV4dCwgY2xzOiAieGctaG1lbnUtc29ydC1kZXNjIn0NCiAgICAgICAgICAgICk7DQogICAgICAgICAgICBpZih0aGlzLmdyaWQuZW5hYmxlQ29sTG9jayAhPT0gZmFsc2Upew0KICAgICAgICAgICAgICAgIHRoaXMuaG1lbnUuYWRkKCctJywNCiAgICAgICAgICAgICAgICAgICAge2lkOiJsb2NrIiwgdGV4dDogdGhpcy5sb2NrVGV4dCwgY2xzOiAieGctaG1lbnUtbG9jayJ9LA0KICAgICAgICAgICAgICAgICAgICB7aWQ6InVubG9jayIsIHRleHQ6IHRoaXMudW5sb2NrVGV4dCwgY2xzOiAieGctaG1lbnUtdW5sb2NrIn0NCiAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYodGhpcy5ncmlkLmVuYWJsZUNvbHVtbkhpZGUgIT09IGZhbHNlKXsNCg0KICAgICAgICAgICAgICAgIHRoaXMuY29sTWVudSA9IG5ldyBFeHQubWVudS5NZW51KHtpZDp0aGlzLmdyaWQuaWQgKyAiLWhjb2xzLW1lbnUifSk7DQogICAgICAgICAgICAgICAgdGhpcy5jb2xNZW51Lm9uKCJiZWZvcmVzaG93IiwgdGhpcy5iZWZvcmVDb2xNZW51U2hvdywgdGhpcyk7DQogICAgICAgICAgICAgICAgdGhpcy5jb2xNZW51Lm9uKCJpdGVtY2xpY2siLCB0aGlzLmhhbmRsZUhkTWVudUNsaWNrLCB0aGlzKTsNCg0KICAgICAgICAgICAgICAgIHRoaXMuaG1lbnUuYWRkKCctJywNCiAgICAgICAgICAgICAgICAgICAge2lkOiJjb2x1bW5zIiwgdGV4dDogdGhpcy5jb2x1bW5zVGV4dCwgbWVudTogdGhpcy5jb2xNZW51fQ0KICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLmhtZW51Lm9uKCJpdGVtY2xpY2siLCB0aGlzLmhhbmRsZUhkTWVudUNsaWNrLCB0aGlzKTsNCg0KICAgICAgICAgICAgdGhpcy5ncmlkLm9uKCJoZWFkZXJjb250ZXh0bWVudSIsIHRoaXMuaGFuZGxlSGRDdHgsIHRoaXMpOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYoKHRoaXMuZ3JpZC5lbmFibGVEcmFnRHJvcCB8fCB0aGlzLmdyaWQuZW5hYmxlRHJhZykgJiYgRXh0LmdyaWQuR3JpZERyYWdab25lKXsNCiAgICAgICAgICAgIHRoaXMuZGQgPSBuZXcgRXh0LmdyaWQuR3JpZERyYWdab25lKHRoaXMuZ3JpZCwgew0KICAgICAgICAgICAgICAgIGRkR3JvdXAgOiB0aGlzLmdyaWQuZGRHcm91cCB8fCAnR3JpZEREJw0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0NCg0KICAgICAgICANCiAgICAgICAgDQogICAgICAgIHRoaXMudXBkYXRlSGVhZGVyU29ydFN0YXRlKCk7DQoNCiAgICAgICAgdGhpcy5iZWZvcmVJbml0aWFsUmVzaXplKCk7DQogICAgICAgIHRoaXMubGF5b3V0KHRydWUpOw0KDQogICAgICAgIAogICAgICAgIHRoaXMucmVuZGVyUGhhc2UyLmRlZmVyKDEsIHRoaXMpOw0KICAgIH0sDQoNCiAgICByZW5kZXJQaGFzZTIgOiBmdW5jdGlvbigpew0KICAgICAgICAKICAgICAgICB0aGlzLnJlZnJlc2goKTsNCiAgICAgICAgaWYodGhpcy5ncmlkLmF1dG9TaXplQ29sdW1ucyl7DQogICAgICAgICAgICB0aGlzLmF1dG9TaXplQ29sdW1ucygpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIGJlZm9yZUluaXRpYWxSZXNpemUgOiBmdW5jdGlvbigpew0KDQogICAgfSwNCg0KICAgIG9uQ29sdW1uU3BsaXR0ZXJNb3ZlZCA6IGZ1bmN0aW9uKGksIHcpew0KICAgICAgICB0aGlzLnVzZXJSZXNpemVkID0gdHJ1ZTsNCiAgICAgICAgdmFyIGNtID0gdGhpcy5ncmlkLmNvbE1vZGVsOw0KICAgICAgICBjbS5zZXRDb2x1bW5XaWR0aChpLCB3LCB0cnVlKTsNCiAgICAgICAgdmFyIGNpZCA9IGNtLmdldENvbHVtbklkKGkpOw0KICAgICAgICB0aGlzLmNzcy51cGRhdGVSdWxlKHRoaXMuY29sU2VsZWN0b3IgKyBjaWQsICJ3aWR0aCIsICh3LXRoaXMuYm9yZGVyV2lkdGgpICsgInB4Iik7DQogICAgICAgIHRoaXMuY3NzLnVwZGF0ZVJ1bGUodGhpcy5oZFNlbGVjdG9yICsgY2lkLCAid2lkdGgiLCAody10aGlzLmJvcmRlcldpZHRoKSArICJweCIpOw0KICAgICAgICB0aGlzLnVwZGF0ZVNwbGl0dGVycygpOw0KICAgICAgICB0aGlzLmxheW91dCgpOw0KICAgICAgICB0aGlzLmdyaWQuZmlyZUV2ZW50KCJjb2x1bW5yZXNpemUiLCBpLCB3KTsNCiAgICB9LA0KDQogICAgc3luY1Jvd0hlaWdodHMgOiBmdW5jdGlvbihzdGFydEluZGV4LCBlbmRJbmRleCl7DQogICAgICAgIGlmKHRoaXMuZ3JpZC5lbmFibGVSb3dIZWlnaHRTeW5jID09PSB0cnVlICYmIHRoaXMuY20uZ2V0TG9ja2VkQ291bnQoKSA+IDApew0KICAgICAgICAgICAgc3RhcnRJbmRleCA9IHN0YXJ0SW5kZXggfHwgMDsNCiAgICAgICAgICAgIHZhciBtcm93cyA9IHRoaXMuZ2V0Qm9keVRhYmxlKCkucm93czsNCiAgICAgICAgICAgIHZhciBscm93cyA9IHRoaXMuZ2V0TG9ja2VkVGFibGUoKS5yb3dzOw0KICAgICAgICAgICAgdmFyIGxlbiA9IG1yb3dzLmxlbmd0aC0xOw0KICAgICAgICAgICAgZW5kSW5kZXggPSBNYXRoLm1pbihlbmRJbmRleCB8fCBsZW4sIGxlbik7DQogICAgICAgICAgICBmb3IodmFyIGkgPSBzdGFydEluZGV4OyBpIDw9IGVuZEluZGV4OyBpKyspew0KICAgICAgICAgICAgICAgIHZhciBtID0gbXJvd3NbaV0sIGwgPSBscm93c1tpXTsNCiAgICAgICAgICAgICAgICB2YXIgaCA9IE1hdGgubWF4KG0ub2Zmc2V0SGVpZ2h0LCBsLm9mZnNldEhlaWdodCk7DQogICAgICAgICAgICAgICAgbS5zdHlsZS5oZWlnaHQgPSBsLnN0eWxlLmhlaWdodCA9IGggKyAicHgiOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSwNCg0KICAgIGxheW91dCA6IGZ1bmN0aW9uKGluaXRpYWxSZW5kZXIsIGlzMm5kUGFzcyl7DQogICAgICAgIHZhciBnID0gdGhpcy5ncmlkOw0KICAgICAgICB2YXIgYXV0byA9IGcuYXV0b0hlaWdodDsNCiAgICAgICAgdmFyIHNjcm9sbE9mZnNldCA9IDE2Ow0KICAgICAgICB2YXIgYyA9IGcuZ2V0R3JpZEVsKCksIGNtID0gdGhpcy5jbSwNCiAgICAgICAgICAgICAgICBleHBhbmRDb2wgPSBnLmF1dG9FeHBhbmRDb2x1bW4sDQogICAgICAgICAgICAgICAgZ3YgPSB0aGlzOw0KICAgICAgICAKDQogICAgICAgIGlmKCFjLmRvbS5vZmZzZXRXaWR0aCl7IAogICAgICAgICAgICBpZihpbml0aWFsUmVuZGVyKXsNCiAgICAgICAgICAgICAgICB0aGlzLmxvY2tlZFdyYXAuc2hvdygpOw0KICAgICAgICAgICAgICAgIHRoaXMubWFpbldyYXAuc2hvdygpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIGhhc0xvY2sgPSB0aGlzLmNtLmlzTG9ja2VkKDApOw0KDQogICAgICAgIHZhciB0YmggPSB0aGlzLmhlYWRlclBhbmVsLmdldEhlaWdodCgpOw0KICAgICAgICB2YXIgYmJoID0gdGhpcy5mb290ZXJQYW5lbC5nZXRIZWlnaHQoKTsNCg0KICAgICAgICBpZihhdXRvKXsNCiAgICAgICAgICAgIHZhciBjaCA9IHRoaXMuZ2V0Qm9keVRhYmxlKCkub2Zmc2V0SGVpZ2h0ICsgdGJoICsgYmJoICsgdGhpcy5tYWluSGQuZ2V0SGVpZ2h0KCk7DQogICAgICAgICAgICB2YXIgbmV3SGVpZ2h0ID0gY2ggKyBjLmdldEJvcmRlcldpZHRoKCJ0YiIpOw0KICAgICAgICAgICAgaWYoZy5tYXhIZWlnaHQpew0KICAgICAgICAgICAgICAgIG5ld0hlaWdodCA9IE1hdGgubWluKGcubWF4SGVpZ2h0LCBuZXdIZWlnaHQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgYy5zZXRIZWlnaHQobmV3SGVpZ2h0KTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmKGcuYXV0b1dpZHRoKXsNCiAgICAgICAgICAgIGMuc2V0V2lkdGgoY20uZ2V0VG90YWxXaWR0aCgpK2MuZ2V0Qm9yZGVyV2lkdGgoJ2xyJykpOw0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIHMgPSB0aGlzLnNjcm9sbGVyOw0KDQogICAgICAgIHZhciBjc2l6ZSA9IGMuZ2V0U2l6ZSh0cnVlKTsNCg0KICAgICAgICB0aGlzLmVsLnNldFNpemUoY3NpemUud2lkdGgsIGNzaXplLmhlaWdodCk7DQoNCiAgICAgICAgdGhpcy5oZWFkZXJQYW5lbC5zZXRXaWR0aChjc2l6ZS53aWR0aCk7DQogICAgICAgIHRoaXMuZm9vdGVyUGFuZWwuc2V0V2lkdGgoY3NpemUud2lkdGgpOw0KDQogICAgICAgIHZhciBoZEhlaWdodCA9IHRoaXMubWFpbkhkLmdldEhlaWdodCgpOw0KICAgICAgICB2YXIgdncgPSBjc2l6ZS53aWR0aDsNCiAgICAgICAgdmFyIHZoID0gY3NpemUuaGVpZ2h0IC0gKHRiaCArIGJiaCk7DQoNCiAgICAgICAgcy5zZXRTaXplKHZ3LCB2aCk7DQoNCiAgICAgICAgdmFyIGJ0ID0gdGhpcy5nZXRCb2R5VGFibGUoKTsNCiAgICAgICAgdmFyIGx0V2lkdGggPSBoYXNMb2NrID8NCiAgICAgICAgICAgICAgICAgICAgICBNYXRoLm1heCh0aGlzLmdldExvY2tlZFRhYmxlKCkub2Zmc2V0V2lkdGgsIHRoaXMubG9ja2VkSGQuZG9tLmZpcnN0Q2hpbGQub2Zmc2V0V2lkdGgpIDogMDsNCg0KICAgICAgICB2YXIgc2Nyb2xsSGVpZ2h0ID0gYnQub2Zmc2V0SGVpZ2h0Ow0KICAgICAgICB2YXIgc2Nyb2xsV2lkdGggPSBsdFdpZHRoICsgYnQub2Zmc2V0V2lkdGg7DQogICAgICAgIHZhciB2c2Nyb2xsID0gZmFsc2UsIGhzY3JvbGwgPSBmYWxzZTsNCg0KICAgICAgICB0aGlzLnNjcm9sbFNpemVyLnNldFNpemUoc2Nyb2xsV2lkdGgsIHNjcm9sbEhlaWdodCtoZEhlaWdodCk7DQoNCiAgICAgICAgdmFyIGx3ID0gdGhpcy5sb2NrZWRXcmFwLCBtdyA9IHRoaXMubWFpbldyYXA7DQogICAgICAgIHZhciBsYiA9IHRoaXMubG9ja2VkQm9keSwgbWIgPSB0aGlzLm1haW5Cb2R5Ow0KDQogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsNCiAgICAgICAgICAgIHZhciB0ID0gcy5kb20ub2Zmc2V0VG9wOw0KICAgICAgICAgICAgdmFyIHcgPSBzLmRvbS5jbGllbnRXaWR0aCwNCiAgICAgICAgICAgICAgICBoID0gcy5kb20uY2xpZW50SGVpZ2h0Ow0KDQogICAgICAgICAgICBsdy5zZXRUb3AodCk7DQogICAgICAgICAgICBsdy5zZXRTaXplKGx0V2lkdGgsIGgpOw0KDQogICAgICAgICAgICBtdy5zZXRMZWZ0VG9wKGx0V2lkdGgsIHQpOw0KICAgICAgICAgICAgbXcuc2V0U2l6ZSh3LWx0V2lkdGgsIGgpOw0KDQogICAgICAgICAgICBsYi5zZXRIZWlnaHQoaC1oZEhlaWdodCk7DQogICAgICAgICAgICBtYi5zZXRIZWlnaHQoaC1oZEhlaWdodCk7DQoNCiAgICAgICAgICAgIGlmKGlzMm5kUGFzcyAhPT0gdHJ1ZSAmJiAhZ3YudXNlclJlc2l6ZWQgJiYgZXhwYW5kQ29sKXsNCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBjaSA9IGNtLmdldEluZGV4QnlJZChleHBhbmRDb2wpOw0KICAgICAgICAgICAgICAgIHZhciB0dyA9IGNtLmdldFRvdGFsV2lkdGgoZmFsc2UpOw0KICAgICAgICAgICAgICAgIHZhciBjdXJyZW50V2lkdGggPSBjbS5nZXRDb2x1bW5XaWR0aChjaSk7DQogICAgICAgICAgICAgICAgdmFyIGN3ID0gTWF0aC5taW4oTWF0aC5tYXgoKCh3LXR3KStjdXJyZW50V2lkdGgtMiktKHcgPD0gcy5kb20ub2Zmc2V0V2lkdGggPyAwIDogMTgpLCBnLmF1dG9FeHBhbmRNaW4pLCBnLmF1dG9FeHBhbmRNYXgpOw0KICAgICAgICAgICAgICAgIGlmKGN1cnJlbnRXaWR0aCAhPSBjdyl7DQogICAgICAgICAgICAgICAgICAgIGNtLnNldENvbHVtbldpZHRoKGNpLCBjdywgdHJ1ZSk7DQogICAgICAgICAgICAgICAgICAgIGd2LmNzcy51cGRhdGVSdWxlKGd2LmNvbFNlbGVjdG9yK2V4cGFuZENvbCwgIndpZHRoIiwgKGN3IC0gZ3YuYm9yZGVyV2lkdGgpICsgInB4Iik7DQogICAgICAgICAgICAgICAgICAgIGd2LmNzcy51cGRhdGVSdWxlKGd2LmhkU2VsZWN0b3IrZXhwYW5kQ29sLCAid2lkdGgiLCAoY3cgLSBndi5ib3JkZXJXaWR0aCkgKyAicHgiKTsNCiAgICAgICAgICAgICAgICAgICAgZ3YudXBkYXRlU3BsaXR0ZXJzKCk7DQogICAgICAgICAgICAgICAgICAgIGd2LmxheW91dChmYWxzZSwgdHJ1ZSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZihpbml0aWFsUmVuZGVyKXsNCiAgICAgICAgICAgICAgICBsdy5zaG93KCk7DQogICAgICAgICAgICAgICAgbXcuc2hvdygpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgCiAgICAgICAgfSwgMTApOw0KICAgIH0sDQoNCiAgICBvbldpbmRvd1Jlc2l6ZSA6IGZ1bmN0aW9uKCl7DQogICAgICAgIGlmKCF0aGlzLmdyaWQubW9uaXRvcldpbmRvd1Jlc2l6ZSB8fCB0aGlzLmdyaWQuYXV0b0hlaWdodCl7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5sYXlvdXQoKTsNCiAgICB9LA0KDQogICAgYXBwZW5kRm9vdGVyIDogZnVuY3Rpb24ocGFyZW50RWwpew0KICAgICAgICByZXR1cm4gbnVsbDsNCiAgICB9LA0KDQogICAgc29ydEFzY1RleHQgOiAiU29ydCBBc2NlbmRpbmciLA0KICAgIHNvcnREZXNjVGV4dCA6ICJTb3J0IERlc2NlbmRpbmciLA0KICAgIGxvY2tUZXh0IDogIkxvY2sgQ29sdW1uIiwNCiAgICB1bmxvY2tUZXh0IDogIlVubG9jayBDb2x1bW4iLA0KICAgIGNvbHVtbnNUZXh0IDogIkNvbHVtbnMiDQp9KTsKCgpFeHQuZ3JpZC5IZWFkZXJEcmFnWm9uZSA9IGZ1bmN0aW9uKGdyaWQsIGhkLCBoZDIpew0KICAgIHRoaXMuZ3JpZCA9IGdyaWQ7DQogICAgdGhpcy52aWV3ID0gZ3JpZC5nZXRWaWV3KCk7DQogICAgdGhpcy5kZEdyb3VwID0gImdyaWRIZWFkZXIiICsgdGhpcy5ncmlkLmdldEdyaWRFbCgpLmlkOw0KICAgIEV4dC5ncmlkLkhlYWRlckRyYWdab25lLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBoZCk7DQogICAgaWYoaGQyKXsNCiAgICAgICAgdGhpcy5zZXRIYW5kbGVFbElkKEV4dC5pZChoZCkpOw0KICAgICAgICB0aGlzLnNldE91dGVySGFuZGxlRWxJZChFeHQuaWQoaGQyKSk7DQogICAgfQ0KICAgIHRoaXMuc2Nyb2xsID0gZmFsc2U7DQp9Ow0KRXh0LmV4dGVuZChFeHQuZ3JpZC5IZWFkZXJEcmFnWm9uZSwgRXh0LmRkLkRyYWdab25lLCB7DQogICAgbWF4RHJhZ1dpZHRoOiAxMjAsDQogICAgZ2V0RHJhZ0RhdGEgOiBmdW5jdGlvbihlKXsNCiAgICAgICAgdmFyIHQgPSBFeHQubGliLkV2ZW50LmdldFRhcmdldChlKTsNCiAgICAgICAgdmFyIGggPSB0aGlzLnZpZXcuZmluZEhlYWRlckNlbGwodCk7DQogICAgICAgIGlmKGgpew0KICAgICAgICAgICAgcmV0dXJuIHtkZGVsOiBoLmZpcnN0Q2hpbGQsIGhlYWRlcjpofTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfSwNCg0KICAgIG9uSW5pdERyYWcgOiBmdW5jdGlvbihlKXsNCiAgICAgICAgdGhpcy52aWV3LmhlYWRlcnNEaXNhYmxlZCA9IHRydWU7DQogICAgICAgIHZhciBjbG9uZSA9IHRoaXMuZHJhZ0RhdGEuZGRlbC5jbG9uZU5vZGUodHJ1ZSk7DQogICAgICAgIGNsb25lLmlkID0gRXh0LmlkKCk7DQogICAgICAgIGNsb25lLnN0eWxlLndpZHRoID0gTWF0aC5taW4odGhpcy5kcmFnRGF0YS5oZWFkZXIub2Zmc2V0V2lkdGgsdGhpcy5tYXhEcmFnV2lkdGgpICsgInB4IjsNCiAgICAgICAgdGhpcy5wcm94eS51cGRhdGUoY2xvbmUpOw0KICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9LA0KDQogICAgYWZ0ZXJWYWxpZERyb3AgOiBmdW5jdGlvbigpew0KICAgICAgICB2YXIgdiA9IHRoaXMudmlldzsNCiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpew0KICAgICAgICAgICAgdi5oZWFkZXJzRGlzYWJsZWQgPSBmYWxzZTsNCiAgICAgICAgfSwgNTApOw0KICAgIH0sDQoNCiAgICBhZnRlckludmFsaWREcm9wIDogZnVuY3Rpb24oKXsNCiAgICAgICAgdmFyIHYgPSB0aGlzLnZpZXc7DQogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsNCiAgICAgICAgICAgIHYuaGVhZGVyc0Rpc2FibGVkID0gZmFsc2U7DQogICAgICAgIH0sIDUwKTsNCiAgICB9DQp9KTsNCg0KCgpFeHQuZ3JpZC5IZWFkZXJEcm9wWm9uZSA9IGZ1bmN0aW9uKGdyaWQsIGhkLCBoZDIpew0KICAgIHRoaXMuZ3JpZCA9IGdyaWQ7DQogICAgdGhpcy52aWV3ID0gZ3JpZC5nZXRWaWV3KCk7DQogICAgCiAgICB0aGlzLnByb3h5VG9wID0gRXh0LkRvbUhlbHBlci5hcHBlbmQoZG9jdW1lbnQuYm9keSwgew0KICAgICAgICBjbHM6ImNvbC1tb3ZlLXRvcCIsIGh0bWw6IiYjMTYwOyINCiAgICB9LCB0cnVlKTsNCiAgICB0aGlzLnByb3h5Qm90dG9tID0gRXh0LkRvbUhlbHBlci5hcHBlbmQoZG9jdW1lbnQuYm9keSwgew0KICAgICAgICBjbHM6ImNvbC1tb3ZlLWJvdHRvbSIsIGh0bWw6IiYjMTYwOyINCiAgICB9LCB0cnVlKTsNCiAgICB0aGlzLnByb3h5VG9wLmhpZGUgPSB0aGlzLnByb3h5Qm90dG9tLmhpZGUgPSBmdW5jdGlvbigpew0KICAgICAgICB0aGlzLnNldExlZnRUb3AoLTEwMCwtMTAwKTsNCiAgICAgICAgdGhpcy5zZXRTdHlsZSgidmlzaWJpbGl0eSIsICJoaWRkZW4iKTsNCiAgICB9Ow0KICAgIHRoaXMuZGRHcm91cCA9ICJncmlkSGVhZGVyIiArIHRoaXMuZ3JpZC5nZXRHcmlkRWwoKS5pZDsNCiAgICAKICAgIAogICAgRXh0LmdyaWQuSGVhZGVyRHJvcFpvbmUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIGdyaWQuZ2V0R3JpZEVsKCkuZG9tKTsNCn07DQpFeHQuZXh0ZW5kKEV4dC5ncmlkLkhlYWRlckRyb3Bab25lLCBFeHQuZGQuRHJvcFpvbmUsIHsNCiAgICBwcm94eU9mZnNldHMgOiBbLTQsIC05XSwNCiAgICBmbHk6IEV4dC5FbGVtZW50LmZseSwNCg0KICAgIGdldFRhcmdldEZyb21FdmVudCA6IGZ1bmN0aW9uKGUpew0KICAgICAgICB2YXIgdCA9IEV4dC5saWIuRXZlbnQuZ2V0VGFyZ2V0KGUpOw0KICAgICAgICB2YXIgY2luZGV4ID0gdGhpcy52aWV3LmZpbmRDZWxsSW5kZXgodCk7DQogICAgICAgIGlmKGNpbmRleCAhPT0gZmFsc2Upew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMudmlldy5nZXRIZWFkZXJDZWxsKGNpbmRleCk7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgbmV4dFZpc2libGUgOiBmdW5jdGlvbihoKXsNCiAgICAgICAgdmFyIHYgPSB0aGlzLnZpZXcsIGNtID0gdGhpcy5ncmlkLmNvbE1vZGVsOw0KICAgICAgICBoID0gaC5uZXh0U2libGluZzsNCiAgICAgICAgd2hpbGUoaCl7DQogICAgICAgICAgICBpZighY20uaXNIaWRkZW4odi5nZXRDZWxsSW5kZXgoaCkpKXsNCiAgICAgICAgICAgICAgICByZXR1cm4gaDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGggPSBoLm5leHRTaWJsaW5nOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBudWxsOw0KICAgIH0sDQoNCiAgICBwcmV2VmlzaWJsZSA6IGZ1bmN0aW9uKGgpew0KICAgICAgICB2YXIgdiA9IHRoaXMudmlldywgY20gPSB0aGlzLmdyaWQuY29sTW9kZWw7DQogICAgICAgIGggPSBoLnByZXZTaWJsaW5nOw0KICAgICAgICB3aGlsZShoKXsNCiAgICAgICAgICAgIGlmKCFjbS5pc0hpZGRlbih2LmdldENlbGxJbmRleChoKSkpew0KICAgICAgICAgICAgICAgIHJldHVybiBoOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaCA9IGgucHJldlNpYmxpbmc7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfSwNCg0KICAgIHBvc2l0aW9uSW5kaWNhdG9yIDogZnVuY3Rpb24oaCwgbiwgZSl7DQogICAgICAgIHZhciB4ID0gRXh0LmxpYi5FdmVudC5nZXRQYWdlWChlKTsNCiAgICAgICAgdmFyIHIgPSBFeHQubGliLkRvbS5nZXRSZWdpb24obi5maXJzdENoaWxkKTsNCiAgICAgICAgdmFyIHB4LCBwdCwgcHkgPSByLnRvcCArIHRoaXMucHJveHlPZmZzZXRzWzFdOw0KICAgICAgICBpZigoci5yaWdodCAtIHgpIDw9IChyLnJpZ2h0LXIubGVmdCkvMil7DQogICAgICAgICAgICBweCA9IHIucmlnaHQrdGhpcy52aWV3LmJvcmRlcldpZHRoOw0KICAgICAgICAgICAgcHQgPSAiYWZ0ZXIiOw0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIHB4ID0gci5sZWZ0Ow0KICAgICAgICAgICAgcHQgPSAiYmVmb3JlIjsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgb2xkSW5kZXggPSB0aGlzLnZpZXcuZ2V0Q2VsbEluZGV4KGgpOw0KICAgICAgICB2YXIgbmV3SW5kZXggPSB0aGlzLnZpZXcuZ2V0Q2VsbEluZGV4KG4pOw0KDQogICAgICAgIGlmKHRoaXMuZ3JpZC5jb2xNb2RlbC5pc0ZpeGVkKG5ld0luZGV4KSl7DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgbG9ja2VkID0gdGhpcy5ncmlkLmNvbE1vZGVsLmlzTG9ja2VkKG5ld0luZGV4KTsNCg0KICAgICAgICBpZihwdCA9PSAiYWZ0ZXIiKXsNCiAgICAgICAgICAgIG5ld0luZGV4Kys7DQogICAgICAgIH0NCiAgICAgICAgaWYob2xkSW5kZXggPCBuZXdJbmRleCl7DQogICAgICAgICAgICBuZXdJbmRleC0tOw0KICAgICAgICB9DQogICAgICAgIGlmKG9sZEluZGV4ID09IG5ld0luZGV4ICYmIChsb2NrZWQgPT0gdGhpcy5ncmlkLmNvbE1vZGVsLmlzTG9ja2VkKG9sZEluZGV4KSkpew0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9DQogICAgICAgIHB4ICs9ICB0aGlzLnByb3h5T2Zmc2V0c1swXTsNCiAgICAgICAgdGhpcy5wcm94eVRvcC5zZXRMZWZ0VG9wKHB4LCBweSk7DQogICAgICAgIHRoaXMucHJveHlUb3Auc2hvdygpOw0KICAgICAgICBpZighdGhpcy5ib3R0b21PZmZzZXQpew0KICAgICAgICAgICAgdGhpcy5ib3R0b21PZmZzZXQgPSB0aGlzLnZpZXcubWFpbkhkLmdldEhlaWdodCgpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMucHJveHlCb3R0b20uc2V0TGVmdFRvcChweCwgcHkrdGhpcy5wcm94eVRvcC5kb20ub2Zmc2V0SGVpZ2h0K3RoaXMuYm90dG9tT2Zmc2V0KTsNCiAgICAgICAgdGhpcy5wcm94eUJvdHRvbS5zaG93KCk7DQogICAgICAgIHJldHVybiBwdDsNCiAgICB9LA0KDQogICAgb25Ob2RlRW50ZXIgOiBmdW5jdGlvbihuLCBkZCwgZSwgZGF0YSl7DQogICAgICAgIGlmKGRhdGEuaGVhZGVyICE9IG4pew0KICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkluZGljYXRvcihkYXRhLmhlYWRlciwgbiwgZSk7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgb25Ob2RlT3ZlciA6IGZ1bmN0aW9uKG4sIGRkLCBlLCBkYXRhKXsNCiAgICAgICAgdmFyIHJlc3VsdCA9IGZhbHNlOw0KICAgICAgICBpZihkYXRhLmhlYWRlciAhPSBuKXsNCiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMucG9zaXRpb25JbmRpY2F0b3IoZGF0YS5oZWFkZXIsIG4sIGUpOw0KICAgICAgICB9DQogICAgICAgIGlmKCFyZXN1bHQpew0KICAgICAgICAgICAgdGhpcy5wcm94eVRvcC5oaWRlKCk7DQogICAgICAgICAgICB0aGlzLnByb3h5Qm90dG9tLmhpZGUoKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gcmVzdWx0ID8gdGhpcy5kcm9wQWxsb3dlZCA6IHRoaXMuZHJvcE5vdEFsbG93ZWQ7DQogICAgfSwNCg0KICAgIG9uTm9kZU91dCA6IGZ1bmN0aW9uKG4sIGRkLCBlLCBkYXRhKXsNCiAgICAgICAgdGhpcy5wcm94eVRvcC5oaWRlKCk7DQogICAgICAgIHRoaXMucHJveHlCb3R0b20uaGlkZSgpOw0KICAgIH0sDQoNCiAgICBvbk5vZGVEcm9wIDogZnVuY3Rpb24obiwgZGQsIGUsIGRhdGEpew0KICAgICAgICB2YXIgaCA9IGRhdGEuaGVhZGVyOw0KICAgICAgICBpZihoICE9IG4pew0KICAgICAgICAgICAgdmFyIGNtID0gdGhpcy5ncmlkLmNvbE1vZGVsOw0KICAgICAgICAgICAgdmFyIHggPSBFeHQubGliLkV2ZW50LmdldFBhZ2VYKGUpOw0KICAgICAgICAgICAgdmFyIHIgPSBFeHQubGliLkRvbS5nZXRSZWdpb24obi5maXJzdENoaWxkKTsNCiAgICAgICAgICAgIHZhciBwdCA9IChyLnJpZ2h0IC0geCkgPD0gKChyLnJpZ2h0LXIubGVmdCkvMikgPyAiYWZ0ZXIiIDogImJlZm9yZSI7DQogICAgICAgICAgICB2YXIgb2xkSW5kZXggPSB0aGlzLnZpZXcuZ2V0Q2VsbEluZGV4KGgpOw0KICAgICAgICAgICAgdmFyIG5ld0luZGV4ID0gdGhpcy52aWV3LmdldENlbGxJbmRleChuKTsNCiAgICAgICAgICAgIHZhciBsb2NrZWQgPSBjbS5pc0xvY2tlZChuZXdJbmRleCk7DQogICAgICAgICAgICBpZihwdCA9PSAiYWZ0ZXIiKXsNCiAgICAgICAgICAgICAgICBuZXdJbmRleCsrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYob2xkSW5kZXggPCBuZXdJbmRleCl7DQogICAgICAgICAgICAgICAgbmV3SW5kZXgtLTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKG9sZEluZGV4ID09IG5ld0luZGV4ICYmIChsb2NrZWQgPT0gY20uaXNMb2NrZWQob2xkSW5kZXgpKSl7DQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY20uc2V0TG9ja2VkKG9sZEluZGV4LCBsb2NrZWQsIHRydWUpOw0KICAgICAgICAgICAgY20ubW92ZUNvbHVtbihvbGRJbmRleCwgbmV3SW5kZXgpOw0KICAgICAgICAgICAgdGhpcy5ncmlkLmZpcmVFdmVudCgiY29sdW1ubW92ZSIsIG9sZEluZGV4LCBuZXdJbmRleCk7DQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfQ0KfSk7DQoNCg0KRXh0LmdyaWQuR3JpZFZpZXcuQ29sdW1uRHJhZ1pvbmUgPSBmdW5jdGlvbihncmlkLCBoZCl7DQogICAgRXh0LmdyaWQuR3JpZFZpZXcuQ29sdW1uRHJhZ1pvbmUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIGdyaWQsIGhkLCBudWxsKTsNCiAgICB0aGlzLnByb3h5LmVsLmFkZENsYXNzKCd4LWdyaWQzLWNvbC1kZCcpOw0KfTsNCg0KRXh0LmV4dGVuZChFeHQuZ3JpZC5HcmlkVmlldy5Db2x1bW5EcmFnWm9uZSwgRXh0LmdyaWQuSGVhZGVyRHJhZ1pvbmUsIHsNCiAgICBoYW5kbGVNb3VzZURvd24gOiBmdW5jdGlvbihlKXsNCg0KICAgIH0sDQoNCiAgICBjYWxsSGFuZGxlTW91c2VEb3duIDogZnVuY3Rpb24oZSl7DQogICAgICAgIEV4dC5ncmlkLkdyaWRWaWV3LkNvbHVtbkRyYWdab25lLnN1cGVyY2xhc3MuaGFuZGxlTW91c2VEb3duLmNhbGwodGhpcywgZSk7DQogICAgfQ0KfSk7CkV4dC5ncmlkLlNwbGl0RHJhZ1pvbmUgPSBmdW5jdGlvbihncmlkLCBoZCwgaGQyKXsKICAgIHRoaXMuZ3JpZCA9IGdyaWQ7CiAgICB0aGlzLnZpZXcgPSBncmlkLmdldFZpZXcoKTsKICAgIHRoaXMucHJveHkgPSB0aGlzLnZpZXcucmVzaXplUHJveHk7CiAgICBFeHQuZ3JpZC5TcGxpdERyYWdab25lLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBoZCwKICAgICAgICAiZ3JpZFNwbGl0dGVycyIgKyB0aGlzLmdyaWQuZ2V0R3JpZEVsKCkuaWQsIHsKICAgICAgICBkcmFnRWxJZCA6IEV4dC5pZCh0aGlzLnByb3h5LmRvbSksIHJlc2l6ZUZyYW1lOmZhbHNlCiAgICB9KTsKICAgIHRoaXMuc2V0SGFuZGxlRWxJZChFeHQuaWQoaGQpKTsKICAgIHRoaXMuc2V0T3V0ZXJIYW5kbGVFbElkKEV4dC5pZChoZDIpKTsKICAgIHRoaXMuc2Nyb2xsID0gZmFsc2U7Cn07CkV4dC5leHRlbmQoRXh0LmdyaWQuU3BsaXREcmFnWm9uZSwgRXh0LmRkLkREUHJveHksIHsKICAgIGZseTogRXh0LkVsZW1lbnQuZmx5LAoKICAgIGI0U3RhcnREcmFnIDogZnVuY3Rpb24oeCwgeSl7CiAgICAgICAgdGhpcy52aWV3LmhlYWRlcnNEaXNhYmxlZCA9IHRydWU7CiAgICAgICAgdGhpcy5wcm94eS5zZXRIZWlnaHQodGhpcy52aWV3Lm1haW5XcmFwLmdldEhlaWdodCgpKTsKICAgICAgICB2YXIgdyA9IHRoaXMuY20uZ2V0Q29sdW1uV2lkdGgodGhpcy5jZWxsSW5kZXgpOwogICAgICAgIHZhciBtaW53ID0gTWF0aC5tYXgody10aGlzLmdyaWQubWluQ29sdW1uV2lkdGgsIDApOwogICAgICAgIHRoaXMucmVzZXRDb25zdHJhaW50cygpOwogICAgICAgIHRoaXMuc2V0WENvbnN0cmFpbnQobWludywgMTAwMCk7CiAgICAgICAgdGhpcy5zZXRZQ29uc3RyYWludCgwLCAwKTsKICAgICAgICB0aGlzLm1pblggPSB4IC0gbWludzsKICAgICAgICB0aGlzLm1heFggPSB4ICsgMTAwMDsKICAgICAgICB0aGlzLnN0YXJ0UG9zID0geDsKICAgICAgICBFeHQuZGQuRERQcm94eS5wcm90b3R5cGUuYjRTdGFydERyYWcuY2FsbCh0aGlzLCB4LCB5KTsKICAgIH0sCgoKICAgIGhhbmRsZU1vdXNlRG93biA6IGZ1bmN0aW9uKGUpewogICAgICAgIGV2ID0gRXh0LkV2ZW50T2JqZWN0LnNldEV2ZW50KGUpOwogICAgICAgIHZhciB0ID0gdGhpcy5mbHkoZXYuZ2V0VGFyZ2V0KCkpOwogICAgICAgIGlmKHQuaGFzQ2xhc3MoIngtZ3JpZC1zcGxpdCIpKXsKICAgICAgICAgICAgdGhpcy5jZWxsSW5kZXggPSB0aGlzLnZpZXcuZ2V0Q2VsbEluZGV4KHQuZG9tKTsKICAgICAgICAgICAgdGhpcy5zcGxpdCA9IHQuZG9tOwogICAgICAgICAgICB0aGlzLmNtID0gdGhpcy5ncmlkLmNvbE1vZGVsOwogICAgICAgICAgICBpZih0aGlzLmNtLmlzUmVzaXphYmxlKHRoaXMuY2VsbEluZGV4KSAmJiAhdGhpcy5jbS5pc0ZpeGVkKHRoaXMuY2VsbEluZGV4KSl7CiAgICAgICAgICAgICAgICBFeHQuZ3JpZC5TcGxpdERyYWdab25lLnN1cGVyY2xhc3MuaGFuZGxlTW91c2VEb3duLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9LAoKICAgIGVuZERyYWcgOiBmdW5jdGlvbihlKXsKICAgICAgICB0aGlzLnZpZXcuaGVhZGVyc0Rpc2FibGVkID0gZmFsc2U7CiAgICAgICAgdmFyIGVuZFggPSBNYXRoLm1heCh0aGlzLm1pblgsIEV4dC5saWIuRXZlbnQuZ2V0UGFnZVgoZSkpOwogICAgICAgIHZhciBkaWZmID0gZW5kWCAtIHRoaXMuc3RhcnRQb3M7CiAgICAgICAgdGhpcy52aWV3Lm9uQ29sdW1uU3BsaXR0ZXJNb3ZlZCh0aGlzLmNlbGxJbmRleCwgdGhpcy5jbS5nZXRDb2x1bW5XaWR0aCh0aGlzLmNlbGxJbmRleCkrZGlmZik7CiAgICB9LAoKICAgIGF1dG9PZmZzZXQgOiBmdW5jdGlvbigpewogICAgICAgIHRoaXMuc2V0RGVsdGEoMCwwKTsKICAgIH0KfSk7CkV4dC5ncmlkLkdyaWREcmFnWm9uZSA9IGZ1bmN0aW9uKGdyaWQsIGNvbmZpZyl7CiAgICB0aGlzLnZpZXcgPSBncmlkLmdldFZpZXcoKTsKICAgIEV4dC5ncmlkLkdyaWREcmFnWm9uZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgdGhpcy52aWV3Lm1haW5Cb2R5LmRvbSwgY29uZmlnKTsKICAgIGlmKHRoaXMudmlldy5sb2NrZWRCb2R5KXsKICAgICAgICB0aGlzLnNldEhhbmRsZUVsSWQoRXh0LmlkKHRoaXMudmlldy5tYWluQm9keS5kb20pKTsKICAgICAgICB0aGlzLnNldE91dGVySGFuZGxlRWxJZChFeHQuaWQodGhpcy52aWV3LmxvY2tlZEJvZHkuZG9tKSk7CiAgICB9CiAgICB0aGlzLnNjcm9sbCA9IGZhbHNlOwogICAgdGhpcy5ncmlkID0gZ3JpZDsKICAgIHRoaXMuZGRlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgdGhpcy5kZGVsLmNsYXNzTmFtZSA9ICd4LWdyaWQtZGQtd3JhcCc7Cn07CgpFeHQuZXh0ZW5kKEV4dC5ncmlkLkdyaWREcmFnWm9uZSwgRXh0LmRkLkRyYWdab25lLCB7CiAgICBkZEdyb3VwIDogIkdyaWRERCIsCgogICAgZ2V0RHJhZ0RhdGEgOiBmdW5jdGlvbihlKXsKICAgICAgICB2YXIgdCA9IEV4dC5saWIuRXZlbnQuZ2V0VGFyZ2V0KGUpOwogICAgICAgIHZhciByb3dJbmRleCA9IHRoaXMudmlldy5maW5kUm93SW5kZXgodCk7CiAgICAgICAgaWYocm93SW5kZXggIT09IGZhbHNlKXsKICAgICAgICAgICAgdmFyIHNtID0gdGhpcy5ncmlkLnNlbE1vZGVsOwogICAgICAgICAgICBpZighc20uaXNTZWxlY3RlZChyb3dJbmRleCkgfHwgZS5oYXNNb2RpZmllcigpKXsKICAgICAgICAgICAgICAgIHNtLmhhbmRsZU1vdXNlRG93bihlLCB0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4ge2dyaWQ6IHRoaXMuZ3JpZCwgZGRlbDogdGhpcy5kZGVsLCByb3dJbmRleDogcm93SW5kZXgsIHNlbGVjdGlvbnM6c20uZ2V0U2VsZWN0aW9ucygpfTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSwKCiAgICBvbkluaXREcmFnIDogZnVuY3Rpb24oZSl7CiAgICAgICAgdmFyIGRhdGEgPSB0aGlzLmRyYWdEYXRhOwogICAgICAgIHRoaXMuZGRlbC5pbm5lckhUTUwgPSB0aGlzLmdyaWQuZ2V0RHJhZ0Ryb3BUZXh0KCk7CiAgICAgICAgdGhpcy5wcm94eS51cGRhdGUodGhpcy5kZGVsKTsKICAgICAgICAgICAgfSwKCiAgICBhZnRlclJlcGFpciA6IGZ1bmN0aW9uKCl7CiAgICAgICAgdGhpcy5kcmFnZ2luZyA9IGZhbHNlOwogICAgfSwKCiAgICBnZXRSZXBhaXJYWSA6IGZ1bmN0aW9uKGUsIGRhdGEpewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0sCgogICAgb25FbmREcmFnIDogZnVuY3Rpb24oZGF0YSwgZSl7CiAgICAgICAgICAgIH0sCgogICAgb25WYWxpZERyb3AgOiBmdW5jdGlvbihkZCwgZSwgaWQpewogICAgICAgICAgICAgICAgdGhpcy5oaWRlUHJveHkoKTsKICAgIH0sCgogICAgYmVmb3JlSW52YWxpZERyb3AgOiBmdW5jdGlvbihlLCBpZCl7CgogICAgfQp9KTsKDQpFeHQuZ3JpZC5Db2x1bW5Nb2RlbCA9IGZ1bmN0aW9uKGNvbmZpZyl7DQoJDQogICAgdGhpcy5jb25maWcgPSBjb25maWc7DQogICAgdGhpcy5sb29rdXAgPSB7fTsNCg0KICAgIAogICAgCiAgICAKICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IGNvbmZpZy5sZW5ndGg7IGkgPCBsZW47IGkrKyl7DQogICAgICAgIHZhciBjID0gY29uZmlnW2ldOw0KICAgICAgICBpZih0eXBlb2YgYy5kYXRhSW5kZXggPT0gInVuZGVmaW5lZCIpew0KICAgICAgICAgICAgYy5kYXRhSW5kZXggPSBpOw0KICAgICAgICB9DQogICAgICAgIGlmKHR5cGVvZiBjLnJlbmRlcmVyID09ICJzdHJpbmciKXsNCiAgICAgICAgICAgIGMucmVuZGVyZXIgPSBFeHQudXRpbC5Gb3JtYXRbYy5yZW5kZXJlcl07DQogICAgICAgIH0NCiAgICAgICAgaWYodHlwZW9mIGMuaWQgPT0gInVuZGVmaW5lZCIpew0KICAgICAgICAgICAgYy5pZCA9IGk7DQogICAgICAgIH0NCiAgICAgICAgaWYoYy5lZGl0b3IgJiYgYy5lZGl0b3IuaXNGb3JtRmllbGQpew0KICAgICAgICAgICAgYy5lZGl0b3IgPSBuZXcgRXh0LmdyaWQuR3JpZEVkaXRvcihjLmVkaXRvcik7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5sb29rdXBbYy5pZF0gPSBjOw0KICAgIH0NCg0KICAgIA0KICAgIHRoaXMuZGVmYXVsdFdpZHRoID0gMTAwOw0KDQogICAgDQogICAgdGhpcy5kZWZhdWx0U29ydGFibGUgPSBmYWxzZTsNCg0KICAgIHRoaXMuYWRkRXZlbnRzKHsNCiAgICAgICAgDQoJICAgICJ3aWR0aGNoYW5nZSI6IHRydWUsDQogICAgICAgIA0KCSAgICAiaGVhZGVyY2hhbmdlIjogdHJ1ZSwNCiAgICAgICAgDQoJICAgICJoaWRkZW5jaGFuZ2UiOiB0cnVlLA0KCSAgICANCiAgICAgICAgImNvbHVtbm1vdmVkIiA6IHRydWUsDQogICAgICAgIA0KICAgICAgICAiY29sdW1ubG9ja2NoYW5nZSIgOiB0cnVlDQogICAgfSk7DQogICAgRXh0LmdyaWQuQ29sdW1uTW9kZWwuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpOw0KfTsNCkV4dC5leHRlbmQoRXh0LmdyaWQuQ29sdW1uTW9kZWwsIEV4dC51dGlsLk9ic2VydmFibGUsIHsNCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCiAgICANCg0KICAgIA0KICAgIGdldENvbHVtbklkIDogZnVuY3Rpb24oaW5kZXgpew0KICAgICAgICByZXR1cm4gdGhpcy5jb25maWdbaW5kZXhdLmlkOw0KICAgIH0sDQoNCiAgICANCiAgICBnZXRDb2x1bW5CeUlkIDogZnVuY3Rpb24oaWQpew0KICAgICAgICByZXR1cm4gdGhpcy5sb29rdXBbaWRdOw0KICAgIH0sDQoNCiAgICANCiAgICBnZXRJbmRleEJ5SWQgOiBmdW5jdGlvbihpZCl7DQogICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IHRoaXMuY29uZmlnLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXsNCiAgICAgICAgICAgIGlmKHRoaXMuY29uZmlnW2ldLmlkID09IGlkKXsNCiAgICAgICAgICAgICAgICByZXR1cm4gaTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gLTE7DQogICAgfSwNCg0KICAgIG1vdmVDb2x1bW4gOiBmdW5jdGlvbihvbGRJbmRleCwgbmV3SW5kZXgpew0KICAgICAgICB2YXIgYyA9IHRoaXMuY29uZmlnW29sZEluZGV4XTsNCiAgICAgICAgdGhpcy5jb25maWcuc3BsaWNlKG9sZEluZGV4LCAxKTsNCiAgICAgICAgdGhpcy5jb25maWcuc3BsaWNlKG5ld0luZGV4LCAwLCBjKTsNCiAgICAgICAgdGhpcy5kYXRhTWFwID0gbnVsbDsNCiAgICAgICAgdGhpcy5maXJlRXZlbnQoImNvbHVtbm1vdmVkIiwgdGhpcywgb2xkSW5kZXgsIG5ld0luZGV4KTsNCiAgICB9LA0KDQogICAgaXNMb2NrZWQgOiBmdW5jdGlvbihjb2xJbmRleCl7DQogICAgICAgIHJldHVybiB0aGlzLmNvbmZpZ1tjb2xJbmRleF0ubG9ja2VkID09PSB0cnVlOw0KICAgIH0sDQoNCiAgICBzZXRMb2NrZWQgOiBmdW5jdGlvbihjb2xJbmRleCwgdmFsdWUsIHN1cHByZXNzRXZlbnQpew0KICAgICAgICBpZih0aGlzLmlzTG9ja2VkKGNvbEluZGV4KSA9PSB2YWx1ZSl7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5jb25maWdbY29sSW5kZXhdLmxvY2tlZCA9IHZhbHVlOw0KICAgICAgICBpZighc3VwcHJlc3NFdmVudCl7DQogICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgiY29sdW1ubG9ja2NoYW5nZSIsIHRoaXMsIGNvbEluZGV4LCB2YWx1ZSk7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgZ2V0VG90YWxMb2NrZWRXaWR0aCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHZhciB0b3RhbFdpZHRoID0gMDsNCiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuY29uZmlnLmxlbmd0aDsgaSsrKXsNCiAgICAgICAgICAgIGlmKHRoaXMuaXNMb2NrZWQoaSkgJiYgIXRoaXMuaXNIaWRkZW4oaSkpew0KICAgICAgICAgICAgICAgIHRoaXMudG90YWxXaWR0aCArPSB0aGlzLmdldENvbHVtbldpZHRoKGkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0b3RhbFdpZHRoOw0KICAgIH0sDQoNCiAgICBnZXRMb2NrZWRDb3VudCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IHRoaXMuY29uZmlnLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXsNCiAgICAgICAgICAgIGlmKCF0aGlzLmlzTG9ja2VkKGkpKXsNCiAgICAgICAgICAgICAgICByZXR1cm4gaTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICANCiAgICBnZXRDb2x1bW5Db3VudCA6IGZ1bmN0aW9uKHZpc2libGVPbmx5KXsNCiAgICAgICAgaWYodmlzaWJsZU9ubHkgPT09IHRydWUpew0KICAgICAgICAgICAgdmFyIGMgPSAwOw0KICAgICAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gdGhpcy5jb25maWcubGVuZ3RoOyBpIDwgbGVuOyBpKyspew0KICAgICAgICAgICAgICAgIGlmKCF0aGlzLmlzSGlkZGVuKGkpKXsNCiAgICAgICAgICAgICAgICAgICAgYysrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBjOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5sZW5ndGg7DQogICAgfSwNCg0KICAgIA0KICAgIGdldENvbHVtbnNCeSA6IGZ1bmN0aW9uKGZuLCBzY29wZSl7DQogICAgICAgIHZhciByID0gW107DQogICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IHRoaXMuY29uZmlnLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXsNCiAgICAgICAgICAgIHZhciBjID0gdGhpcy5jb25maWdbaV07DQogICAgICAgICAgICBpZihmbi5jYWxsKHNjb3BlfHx0aGlzLCBjLCBpKSA9PT0gdHJ1ZSl7DQogICAgICAgICAgICAgICAgcltyLmxlbmd0aF0gPSBjOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiByOw0KICAgIH0sDQoNCiAgICANCiAgICBpc1NvcnRhYmxlIDogZnVuY3Rpb24oY29sKXsNCiAgICAgICAgaWYodHlwZW9mIHRoaXMuY29uZmlnW2NvbF0uc29ydGFibGUgPT0gInVuZGVmaW5lZCIpew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdFNvcnRhYmxlOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0aGlzLmNvbmZpZ1tjb2xdLnNvcnRhYmxlOw0KICAgIH0sDQoNCiAgICANCiAgICBnZXRSZW5kZXJlciA6IGZ1bmN0aW9uKGNvbCl7DQogICAgICAgIGlmKCF0aGlzLmNvbmZpZ1tjb2xdLnJlbmRlcmVyKXsNCiAgICAgICAgICAgIHJldHVybiBFeHQuZ3JpZC5Db2x1bW5Nb2RlbC5kZWZhdWx0UmVuZGVyZXI7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnW2NvbF0ucmVuZGVyZXI7DQogICAgfSwNCg0KICAgIA0KICAgIHNldFJlbmRlcmVyIDogZnVuY3Rpb24oY29sLCBmbil7DQogICAgICAgIHRoaXMuY29uZmlnW2NvbF0ucmVuZGVyZXIgPSBmbjsNCiAgICB9LA0KDQogICAgDQogICAgZ2V0Q29sdW1uV2lkdGggOiBmdW5jdGlvbihjb2wpew0KICAgICAgICByZXR1cm4gdGhpcy5jb25maWdbY29sXS53aWR0aCB8fCB0aGlzLmRlZmF1bHRXaWR0aDsNCiAgICB9LA0KDQogICAgDQogICAgc2V0Q29sdW1uV2lkdGggOiBmdW5jdGlvbihjb2wsIHdpZHRoLCBzdXBwcmVzc0V2ZW50KXsNCiAgICAgICAgdGhpcy5jb25maWdbY29sXS53aWR0aCA9IHdpZHRoOw0KICAgICAgICB0aGlzLnRvdGFsV2lkdGggPSBudWxsOw0KICAgICAgICBpZighc3VwcHJlc3NFdmVudCl7DQogICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoIndpZHRoY2hhbmdlIiwgdGhpcywgY29sLCB3aWR0aCk7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgDQogICAgZ2V0VG90YWxXaWR0aCA6IGZ1bmN0aW9uKGluY2x1ZGVIaWRkZW4pew0KICAgICAgICBpZighdGhpcy50b3RhbFdpZHRoKXsNCiAgICAgICAgICAgIHRoaXMudG90YWxXaWR0aCA9IDA7DQogICAgICAgICAgICBmb3IodmFyIGkgPSAwLCBsZW4gPSB0aGlzLmNvbmZpZy5sZW5ndGg7IGkgPCBsZW47IGkrKyl7DQogICAgICAgICAgICAgICAgaWYoaW5jbHVkZUhpZGRlbiB8fCAhdGhpcy5pc0hpZGRlbihpKSl7DQogICAgICAgICAgICAgICAgICAgIHRoaXMudG90YWxXaWR0aCArPSB0aGlzLmdldENvbHVtbldpZHRoKGkpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdGhpcy50b3RhbFdpZHRoOw0KICAgIH0sDQoNCiAgICANCiAgICBnZXRDb2x1bW5IZWFkZXIgOiBmdW5jdGlvbihjb2wpew0KICAgICAgICByZXR1cm4gdGhpcy5jb25maWdbY29sXS5oZWFkZXI7DQogICAgfSwNCg0KICAgIA0KICAgIHNldENvbHVtbkhlYWRlciA6IGZ1bmN0aW9uKGNvbCwgaGVhZGVyKXsNCiAgICAgICAgdGhpcy5jb25maWdbY29sXS5oZWFkZXIgPSBoZWFkZXI7DQogICAgICAgIHRoaXMuZmlyZUV2ZW50KCJoZWFkZXJjaGFuZ2UiLCB0aGlzLCBjb2wsIGhlYWRlcik7DQogICAgfSwNCg0KICAgIA0KICAgIGdldENvbHVtblRvb2x0aXAgOiBmdW5jdGlvbihjb2wpew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnW2NvbF0udG9vbHRpcDsNCiAgICB9LA0KICAgIA0KICAgIHNldENvbHVtblRvb2x0aXAgOiBmdW5jdGlvbihjb2wsIHRvb2x0aXApew0KICAgICAgICAgICAgdGhpcy5jb25maWdbY29sXS50b29sdGlwID0gdG9vbHRpcDsNCiAgICB9LA0KDQogICAgDQogICAgZ2V0RGF0YUluZGV4IDogZnVuY3Rpb24oY29sKXsNCiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnW2NvbF0uZGF0YUluZGV4Ow0KICAgIH0sDQoNCiAgICANCiAgICBzZXREYXRhSW5kZXggOiBmdW5jdGlvbihjb2wsIGRhdGFJbmRleCl7DQogICAgICAgIHRoaXMuY29uZmlnW2NvbF0uZGF0YUluZGV4ID0gZGF0YUluZGV4Ow0KICAgIH0sDQoNCiAgICBmaW5kQ29sdW1uSW5kZXggOiBmdW5jdGlvbihkYXRhSW5kZXgpew0KICAgICAgICB2YXIgYyA9IHRoaXMuY29uZmlnOw0KICAgICAgICBmb3IodmFyIGkgPSAwLCBsZW4gPSBjLmxlbmd0aDsgaSA8IGxlbjsgaSsrKXsNCiAgICAgICAgICAgIGlmKGNbaV0uZGF0YUluZGV4ID09IGRhdGFJbmRleCl7DQogICAgICAgICAgICAgICAgcmV0dXJuIGk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIC0xOw0KICAgIH0sDQoNCiAgICANCiAgICBpc0NlbGxFZGl0YWJsZSA6IGZ1bmN0aW9uKGNvbEluZGV4LCByb3dJbmRleCl7DQogICAgICAgIHJldHVybiAodGhpcy5jb25maWdbY29sSW5kZXhdLmVkaXRhYmxlIHx8ICh0eXBlb2YgdGhpcy5jb25maWdbY29sSW5kZXhdLmVkaXRhYmxlID09ICJ1bmRlZmluZWQiICYmIHRoaXMuY29uZmlnW2NvbEluZGV4XS5lZGl0b3IpKSA/IHRydWUgOiBmYWxzZTsNCiAgICB9LA0KDQogICAgDQogICAgZ2V0Q2VsbEVkaXRvciA6IGZ1bmN0aW9uKGNvbEluZGV4LCByb3dJbmRleCl7DQogICAgICAgIHJldHVybiB0aGlzLmNvbmZpZ1tjb2xJbmRleF0uZWRpdG9yOw0KICAgIH0sDQoNCiAgICANCiAgICBzZXRFZGl0YWJsZSA6IGZ1bmN0aW9uKGNvbCwgZWRpdGFibGUpew0KICAgICAgICB0aGlzLmNvbmZpZ1tjb2xdLmVkaXRhYmxlID0gZWRpdGFibGU7DQogICAgfSwNCg0KDQogICAgDQogICAgaXNIaWRkZW4gOiBmdW5jdGlvbihjb2xJbmRleCl7DQogICAgICAgIHJldHVybiB0aGlzLmNvbmZpZ1tjb2xJbmRleF0uaGlkZGVuOw0KICAgIH0sDQoNCg0KICAgIA0KICAgIGlzRml4ZWQgOiBmdW5jdGlvbihjb2xJbmRleCl7DQogICAgICAgIHJldHVybiB0aGlzLmNvbmZpZ1tjb2xJbmRleF0uZml4ZWQ7DQogICAgfSwNCg0KICAgIA0KICAgIGlzUmVzaXphYmxlIDogZnVuY3Rpb24oY29sSW5kZXgpew0KICAgICAgICByZXR1cm4gY29sSW5kZXggPj0gMCAmJiB0aGlzLmNvbmZpZ1tjb2xJbmRleF0ucmVzaXphYmxlICE9PSBmYWxzZSAmJiB0aGlzLmNvbmZpZ1tjb2xJbmRleF0uZml4ZWQgIT09IHRydWU7DQogICAgfSwNCiAgICANCiAgICBzZXRIaWRkZW4gOiBmdW5jdGlvbihjb2xJbmRleCwgaGlkZGVuKXsNCiAgICAgICAgdGhpcy5jb25maWdbY29sSW5kZXhdLmhpZGRlbiA9IGhpZGRlbjsNCiAgICAgICAgdGhpcy50b3RhbFdpZHRoID0gbnVsbDsNCiAgICAgICAgdGhpcy5maXJlRXZlbnQoImhpZGRlbmNoYW5nZSIsIHRoaXMsIGNvbEluZGV4LCBoaWRkZW4pOw0KICAgIH0sDQoNCiAgICANCiAgICBzZXRFZGl0b3IgOiBmdW5jdGlvbihjb2wsIGVkaXRvcil7DQogICAgICAgIHRoaXMuY29uZmlnW2NvbF0uZWRpdG9yID0gZWRpdG9yOw0KICAgIH0NCn0pOw0KDQpFeHQuZ3JpZC5Db2x1bW5Nb2RlbC5kZWZhdWx0UmVuZGVyZXIgPSBmdW5jdGlvbih2YWx1ZSl7DQoJaWYodHlwZW9mIHZhbHVlID09ICJzdHJpbmciICYmIHZhbHVlLmxlbmd0aCA8IDEpew0KCSAgICByZXR1cm4gIiYjMTYwOyI7DQoJfQ0KCXJldHVybiB2YWx1ZTsNCn07DQoNCgpFeHQuZ3JpZC5EZWZhdWx0Q29sdW1uTW9kZWwgPSBFeHQuZ3JpZC5Db2x1bW5Nb2RlbDsNCgoNCkV4dC5ncmlkLkFic3RyYWN0U2VsZWN0aW9uTW9kZWwgPSBmdW5jdGlvbigpew0KICAgIHRoaXMubG9ja2VkID0gZmFsc2U7DQogICAgRXh0LmdyaWQuQWJzdHJhY3RTZWxlY3Rpb25Nb2RlbC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7DQp9Ow0KDQpFeHQuZXh0ZW5kKEV4dC5ncmlkLkFic3RyYWN0U2VsZWN0aW9uTW9kZWwsIEV4dC51dGlsLk9ic2VydmFibGUsICB7DQogICAgDQogICAgaW5pdCA6IGZ1bmN0aW9uKGdyaWQpew0KICAgICAgICB0aGlzLmdyaWQgPSBncmlkOw0KICAgICAgICB0aGlzLmluaXRFdmVudHMoKTsNCiAgICB9LA0KDQogICAgDQogICAgbG9jayA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHRoaXMubG9ja2VkID0gdHJ1ZTsNCiAgICB9LA0KDQogICAgDQogICAgdW5sb2NrIDogZnVuY3Rpb24oKXsNCiAgICAgICAgdGhpcy5sb2NrZWQgPSBmYWxzZTsNCiAgICB9LA0KDQogICAgDQogICAgaXNMb2NrZWQgOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gdGhpcy5sb2NrZWQ7DQogICAgfQ0KfSk7Cg0KRXh0LmdyaWQuUm93U2VsZWN0aW9uTW9kZWwgPSBmdW5jdGlvbihjb25maWcpew0KICAgIEV4dC5hcHBseSh0aGlzLCBjb25maWcpOw0KICAgIHRoaXMuc2VsZWN0aW9ucyA9IG5ldyBFeHQudXRpbC5NaXhlZENvbGxlY3Rpb24oZmFsc2UsIGZ1bmN0aW9uKG8pew0KICAgICAgICByZXR1cm4gby5pZDsNCiAgICB9KTsNCg0KICAgIHRoaXMubGFzdCA9IGZhbHNlOw0KICAgIHRoaXMubGFzdEFjdGl2ZSA9IGZhbHNlOw0KDQogICAgdGhpcy5hZGRFdmVudHMoew0KICAgICAgICANCgkgICAgInNlbGVjdGlvbmNoYW5nZSIgOiB0cnVlLA0KICAgICAgICANCgkgICAgImJlZm9yZXJvd3NlbGVjdCIgOiB0cnVlLA0KICAgICAgICANCgkgICAgInJvd3NlbGVjdCIgOiB0cnVlLA0KICAgICAgICANCiAgICAgICAgInJvd2Rlc2VsZWN0IiA6IHRydWUNCiAgICB9KTsNCg0KICAgIHRoaXMubG9ja2VkID0gZmFsc2U7DQp9Ow0KDQpFeHQuZXh0ZW5kKEV4dC5ncmlkLlJvd1NlbGVjdGlvbk1vZGVsLCBFeHQuZ3JpZC5BYnN0cmFjdFNlbGVjdGlvbk1vZGVsLCAgew0KICAgIA0KICAgIHNpbmdsZVNlbGVjdCA6IGZhbHNlLA0KDQogICAgCiAgICBpbml0RXZlbnRzIDogZnVuY3Rpb24oKXsNCg0KICAgICAgICBpZighdGhpcy5ncmlkLmVuYWJsZURyYWdEcm9wICYmICF0aGlzLmdyaWQuZW5hYmxlRHJhZyl7DQogICAgICAgICAgICB0aGlzLmdyaWQub24oIm1vdXNlZG93biIsIHRoaXMuaGFuZGxlTW91c2VEb3duLCB0aGlzKTsNCiAgICAgICAgfWVsc2V7IAogICAgICAgICAgICB0aGlzLmdyaWQub24oInJvd2NsaWNrIiwgZnVuY3Rpb24oZ3JpZCwgcm93SW5kZXgsIGUpIHsNCiAgICAgICAgICAgICAgICBpZihlLmJ1dHRvbiA9PT0gMCAmJiAhZS5zaGlmdEtleSAmJiAhZS5jdHJsS2V5KSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0Um93KHJvd0luZGV4LCBmYWxzZSk7DQogICAgICAgICAgICAgICAgICAgIGdyaWQudmlldy5mb2N1c1Jvdyhyb3dJbmRleCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSwgdGhpcyk7DQogICAgICAgIH0NCg0KICAgICAgICB0aGlzLnJvd05hdiA9IG5ldyBFeHQuS2V5TmF2KHRoaXMuZ3JpZC5nZXRHcmlkRWwoKSwgew0KICAgICAgICAgICAgInVwIiA6IGZ1bmN0aW9uKGUpew0KICAgICAgICAgICAgICAgIGlmKCFlLnNoaWZ0S2V5KXsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RQcmV2aW91cyhlLnNoaWZ0S2V5KTsNCiAgICAgICAgICAgICAgICB9ZWxzZSBpZih0aGlzLmxhc3QgIT09IGZhbHNlICYmIHRoaXMubGFzdEFjdGl2ZSAhPT0gZmFsc2Upew0KICAgICAgICAgICAgICAgICAgICB2YXIgbGFzdCA9IHRoaXMubGFzdDsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RSYW5nZSh0aGlzLmxhc3QsICB0aGlzLmxhc3RBY3RpdmUtMSk7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5nZXRWaWV3KCkuZm9jdXNSb3codGhpcy5sYXN0QWN0aXZlKTsNCiAgICAgICAgICAgICAgICAgICAgaWYobGFzdCAhPT0gZmFsc2Upew0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXN0ID0gbGFzdDsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEZpcnN0Um93KCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICJkb3duIiA6IGZ1bmN0aW9uKGUpew0KICAgICAgICAgICAgICAgIGlmKCFlLnNoaWZ0S2V5KXsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3ROZXh0KGUuc2hpZnRLZXkpOw0KICAgICAgICAgICAgICAgIH1lbHNlIGlmKHRoaXMubGFzdCAhPT0gZmFsc2UgJiYgdGhpcy5sYXN0QWN0aXZlICE9PSBmYWxzZSl7DQogICAgICAgICAgICAgICAgICAgIHZhciBsYXN0ID0gdGhpcy5sYXN0Ow0KICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdFJhbmdlKHRoaXMubGFzdCwgIHRoaXMubGFzdEFjdGl2ZSsxKTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkLmdldFZpZXcoKS5mb2N1c1Jvdyh0aGlzLmxhc3RBY3RpdmUpOw0KICAgICAgICAgICAgICAgICAgICBpZihsYXN0ICE9PSBmYWxzZSl7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3QgPSBsYXN0Ow0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0Rmlyc3RSb3coKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgc2NvcGU6IHRoaXMNCiAgICAgICAgfSk7DQoNCiAgICAgICAgdmFyIHZpZXcgPSB0aGlzLmdyaWQudmlldzsNCiAgICAgICAgdmlldy5vbigicmVmcmVzaCIsIHRoaXMub25SZWZyZXNoLCB0aGlzKTsNCiAgICAgICAgdmlldy5vbigicm93dXBkYXRlZCIsIHRoaXMub25Sb3dVcGRhdGVkLCB0aGlzKTsNCiAgICAgICAgdmlldy5vbigicm93cmVtb3ZlZCIsIHRoaXMub25SZW1vdmUsIHRoaXMpOw0KICAgIH0sDQoNCiAgICAKICAgIG9uUmVmcmVzaCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHZhciBkcyA9IHRoaXMuZ3JpZC5kYXRhU291cmNlLCBpLCB2ID0gdGhpcy5ncmlkLnZpZXc7DQogICAgICAgIHZhciBzID0gdGhpcy5zZWxlY3Rpb25zOw0KICAgICAgICBzLmVhY2goZnVuY3Rpb24ocil7DQogICAgICAgICAgICBpZigoaSA9IGRzLmluZGV4T2ZJZChyLmlkKSkgIT0gLTEpew0KICAgICAgICAgICAgICAgIHYub25Sb3dTZWxlY3QoaSk7DQogICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICBzLnJlbW92ZShyKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgfSwNCg0KICAgIAogICAgb25SZW1vdmUgOiBmdW5jdGlvbih2LCBpbmRleCwgcil7DQogICAgICAgIHRoaXMuc2VsZWN0aW9ucy5yZW1vdmUocik7DQogICAgfSwNCg0KICAgIAogICAgb25Sb3dVcGRhdGVkIDogZnVuY3Rpb24odiwgaW5kZXgsIHIpew0KICAgICAgICBpZih0aGlzLmlzU2VsZWN0ZWQocikpew0KICAgICAgICAgICAgdi5vblJvd1NlbGVjdChpbmRleCk7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgDQogICAgc2VsZWN0UmVjb3JkcyA6IGZ1bmN0aW9uKHJlY29yZHMsIGtlZXBFeGlzdGluZyl7DQogICAgICAgIGlmKCFrZWVwRXhpc3Rpbmcpew0KICAgICAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbnMoKTsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgZHMgPSB0aGlzLmdyaWQuZGF0YVNvdXJjZTsNCiAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gcmVjb3Jkcy5sZW5ndGg7IGkgPCBsZW47IGkrKyl7DQogICAgICAgICAgICB0aGlzLnNlbGVjdFJvdyhkcy5pbmRleE9mKHJlY29yZHNbaV0pLCB0cnVlKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICANCiAgICBnZXRDb3VudCA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbnMubGVuZ3RoOw0KICAgIH0sDQoNCiAgICANCiAgICBzZWxlY3RGaXJzdFJvdyA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHRoaXMuc2VsZWN0Um93KDApOw0KICAgIH0sDQoNCiAgICANCiAgICBzZWxlY3RMYXN0Um93IDogZnVuY3Rpb24oa2VlcEV4aXN0aW5nKXsNCiAgICAgICAgdGhpcy5zZWxlY3RSb3codGhpcy5ncmlkLmRhdGFTb3VyY2UuZ2V0Q291bnQoKSAtIDEsIGtlZXBFeGlzdGluZyk7DQogICAgfSwNCg0KICAgIA0KICAgIHNlbGVjdE5leHQgOiBmdW5jdGlvbihrZWVwRXhpc3Rpbmcpew0KICAgICAgICBpZih0aGlzLmxhc3QgIT09IGZhbHNlICYmICh0aGlzLmxhc3QrMSkgPCB0aGlzLmdyaWQuZGF0YVNvdXJjZS5nZXRDb3VudCgpKXsNCiAgICAgICAgICAgIHRoaXMuc2VsZWN0Um93KHRoaXMubGFzdCsxLCBrZWVwRXhpc3RpbmcpOw0KICAgICAgICAgICAgdGhpcy5ncmlkLmdldFZpZXcoKS5mb2N1c1Jvdyh0aGlzLmxhc3QpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIHNlbGVjdFByZXZpb3VzIDogZnVuY3Rpb24oa2VlcEV4aXN0aW5nKXsNCiAgICAgICAgaWYodGhpcy5sYXN0KXsNCiAgICAgICAgICAgIHRoaXMuc2VsZWN0Um93KHRoaXMubGFzdC0xLCBrZWVwRXhpc3RpbmcpOw0KICAgICAgICAgICAgdGhpcy5ncmlkLmdldFZpZXcoKS5mb2N1c1Jvdyh0aGlzLmxhc3QpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIGdldFNlbGVjdGlvbnMgOiBmdW5jdGlvbigpew0KICAgICAgICByZXR1cm4gW10uY29uY2F0KHRoaXMuc2VsZWN0aW9ucy5pdGVtcyk7DQogICAgfSwNCg0KICAgIA0KICAgIGdldFNlbGVjdGVkIDogZnVuY3Rpb24oKXsNCiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9ucy5pdGVtQXQoMCk7DQogICAgfSwNCg0KDQogICAgDQogICAgY2xlYXJTZWxlY3Rpb25zIDogZnVuY3Rpb24oZmFzdCl7DQogICAgICAgIGlmKHRoaXMubG9ja2VkKSByZXR1cm47DQogICAgICAgIGlmKGZhc3QgIT09IHRydWUpew0KICAgICAgICAgICAgdmFyIGRzID0gdGhpcy5ncmlkLmRhdGFTb3VyY2U7DQogICAgICAgICAgICB2YXIgcyA9IHRoaXMuc2VsZWN0aW9uczsNCiAgICAgICAgICAgIHMuZWFjaChmdW5jdGlvbihyKXsNCiAgICAgICAgICAgICAgICB0aGlzLmRlc2VsZWN0Um93KGRzLmluZGV4T2ZJZChyLmlkKSk7DQogICAgICAgICAgICB9LCB0aGlzKTsNCiAgICAgICAgICAgIHMuY2xlYXIoKTsNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICB0aGlzLnNlbGVjdGlvbnMuY2xlYXIoKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmxhc3QgPSBmYWxzZTsNCiAgICB9LA0KDQoNCiAgICANCiAgICBzZWxlY3RBbGwgOiBmdW5jdGlvbigpew0KICAgICAgICBpZih0aGlzLmxvY2tlZCkgcmV0dXJuOw0KICAgICAgICB0aGlzLnNlbGVjdGlvbnMuY2xlYXIoKTsNCiAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gdGhpcy5ncmlkLmRhdGFTb3VyY2UuZ2V0Q291bnQoKTsgaSA8IGxlbjsgaSsrKXsNCiAgICAgICAgICAgIHRoaXMuc2VsZWN0Um93KGksIHRydWUpOw0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIGhhc1NlbGVjdGlvbiA6IGZ1bmN0aW9uKCl7DQogICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbnMubGVuZ3RoID4gMDsNCiAgICB9LA0KDQogICAgDQogICAgaXNTZWxlY3RlZCA6IGZ1bmN0aW9uKGluZGV4KXsNCiAgICAgICAgdmFyIHIgPSB0eXBlb2YgaW5kZXggPT0gIm51bWJlciIgPyB0aGlzLmdyaWQuZGF0YVNvdXJjZS5nZXRBdChpbmRleCkgOiBpbmRleDsNCiAgICAgICAgcmV0dXJuIChyICYmIHRoaXMuc2VsZWN0aW9ucy5rZXkoci5pZCkgPyB0cnVlIDogZmFsc2UpOw0KICAgIH0sDQoNCiAgICANCiAgICBpc0lkU2VsZWN0ZWQgOiBmdW5jdGlvbihpZCl7DQogICAgICAgIHJldHVybiAodGhpcy5zZWxlY3Rpb25zLmtleShpZCkgPyB0cnVlIDogZmFsc2UpOw0KICAgIH0sDQoNCiAgICAKICAgIGhhbmRsZU1vdXNlRG93biA6IGZ1bmN0aW9uKGUsIHQpew0KICAgICAgICB2YXIgdmlldyA9IHRoaXMuZ3JpZC5nZXRWaWV3KCksIHJvd0luZGV4Ow0KICAgICAgICBpZih0aGlzLmlzTG9ja2VkKCkgfHwgKHJvd0luZGV4ID0gdmlldy5maW5kUm93SW5kZXgodCkpID09PSBmYWxzZSl7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH07DQogICAgICAgIGlmKGUuc2hpZnRLZXkgJiYgdGhpcy5sYXN0ICE9PSBmYWxzZSl7DQogICAgICAgICAgICB2YXIgbGFzdCA9IHRoaXMubGFzdDsNCiAgICAgICAgICAgIHRoaXMuc2VsZWN0UmFuZ2UobGFzdCwgcm93SW5kZXgsIGUuY3RybEtleSk7DQogICAgICAgICAgICB0aGlzLmxhc3QgPSBsYXN0OyAKICAgICAgICAgICAgdmlldy5mb2N1c1Jvdyhyb3dJbmRleCk7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgdmFyIGlzU2VsZWN0ZWQgPSB0aGlzLmlzU2VsZWN0ZWQocm93SW5kZXgpOw0KICAgICAgICAgICAgaWYoZS5idXR0b24gIT09IDAgJiYgaXNTZWxlY3RlZCl7DQogICAgICAgICAgICAgICAgdmlldy5mb2N1c1Jvdyhyb3dJbmRleCk7DQogICAgICAgICAgICB9ZWxzZSBpZihlLmN0cmxLZXkgJiYgaXNTZWxlY3RlZCl7DQogICAgICAgICAgICAgICAgdGhpcy5kZXNlbGVjdFJvdyhyb3dJbmRleCk7DQogICAgICAgICAgICB9ZWxzZSBpZighaXNTZWxlY3RlZCl7DQogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RSb3cocm93SW5kZXgsIGUuYnV0dG9uID09PSAwICYmIChlLmN0cmxLZXkgfHwgZS5zaGlmdEtleSkpOw0KICAgICAgICAgICAgICAgIHZpZXcuZm9jdXNSb3cocm93SW5kZXgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSwNCg0KICAgIA0KICAgIHNlbGVjdFJvd3MgOiBmdW5jdGlvbihyb3dzLCBrZWVwRXhpc3Rpbmcpew0KICAgICAgICBpZigha2VlcEV4aXN0aW5nKXsNCiAgICAgICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb25zKCk7DQogICAgICAgIH0NCiAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gcm93cy5sZW5ndGg7IGkgPCBsZW47IGkrKyl7DQogICAgICAgICAgICB0aGlzLnNlbGVjdFJvdyhyb3dzW2ldLCB0cnVlKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICANCiAgICBzZWxlY3RSYW5nZSA6IGZ1bmN0aW9uKHN0YXJ0Um93LCBlbmRSb3csIGtlZXBFeGlzdGluZyl7DQogICAgICAgIGlmKHRoaXMubG9ja2VkKSByZXR1cm47DQogICAgICAgIGlmKCFrZWVwRXhpc3Rpbmcpew0KICAgICAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbnMoKTsNCiAgICAgICAgfQ0KICAgICAgICBpZihzdGFydFJvdyA8PSBlbmRSb3cpew0KICAgICAgICAgICAgZm9yKHZhciBpID0gc3RhcnRSb3c7IGkgPD0gZW5kUm93OyBpKyspew0KICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0Um93KGksIHRydWUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIGZvcih2YXIgaSA9IHN0YXJ0Um93OyBpID49IGVuZFJvdzsgaS0tKXsNCiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdFJvdyhpLCB0cnVlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICANCiAgICBkZXNlbGVjdFJhbmdlIDogZnVuY3Rpb24oc3RhcnRSb3csIGVuZFJvdywgcHJldmVudFZpZXdOb3RpZnkpew0KICAgICAgICBpZih0aGlzLmxvY2tlZCkgcmV0dXJuOw0KICAgICAgICBmb3IodmFyIGkgPSBzdGFydFJvdzsgaSA8PSBlbmRSb3c7IGkrKyl7DQogICAgICAgICAgICB0aGlzLmRlc2VsZWN0Um93KGksIHByZXZlbnRWaWV3Tm90aWZ5KTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICANCiAgICBzZWxlY3RSb3cgOiBmdW5jdGlvbihpbmRleCwga2VlcEV4aXN0aW5nLCBwcmV2ZW50Vmlld05vdGlmeSl7DQogICAgICAgIGlmKHRoaXMubG9ja2VkIHx8IChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5ncmlkLmRhdGFTb3VyY2UuZ2V0Q291bnQoKSkpIHJldHVybjsNCiAgICAgICAgaWYodGhpcy5maXJlRXZlbnQoImJlZm9yZXJvd3NlbGVjdCIsIHRoaXMsIGluZGV4LCBrZWVwRXhpc3RpbmcpICE9PSBmYWxzZSl7DQogICAgICAgICAgICBpZigha2VlcEV4aXN0aW5nIHx8IHRoaXMuc2luZ2xlU2VsZWN0KXsNCiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9ucygpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIHIgPSB0aGlzLmdyaWQuZGF0YVNvdXJjZS5nZXRBdChpbmRleCk7DQogICAgICAgICAgICB0aGlzLnNlbGVjdGlvbnMuYWRkKHIpOw0KICAgICAgICAgICAgdGhpcy5sYXN0ID0gdGhpcy5sYXN0QWN0aXZlID0gaW5kZXg7DQogICAgICAgICAgICBpZighcHJldmVudFZpZXdOb3RpZnkpew0KICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5nZXRWaWV3KCkub25Sb3dTZWxlY3QoaW5kZXgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoInJvd3NlbGVjdCIsIHRoaXMsIGluZGV4LCByKTsNCiAgICAgICAgICAgIHRoaXMuZmlyZUV2ZW50KCJzZWxlY3Rpb25jaGFuZ2UiLCB0aGlzKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICANCiAgICBkZXNlbGVjdFJvdyA6IGZ1bmN0aW9uKGluZGV4LCBwcmV2ZW50Vmlld05vdGlmeSl7DQogICAgICAgIGlmKHRoaXMubG9ja2VkKSByZXR1cm47DQogICAgICAgIGlmKHRoaXMubGFzdCA9PSBpbmRleCl7DQogICAgICAgICAgICB0aGlzLmxhc3QgPSBmYWxzZTsNCiAgICAgICAgfQ0KICAgICAgICBpZih0aGlzLmxhc3RBY3RpdmUgPT0gaW5kZXgpew0KICAgICAgICAgICAgdGhpcy5sYXN0QWN0aXZlID0gZmFsc2U7DQogICAgICAgIH0NCiAgICAgICAgdmFyIHIgPSB0aGlzLmdyaWQuZGF0YVNvdXJjZS5nZXRBdChpbmRleCk7DQogICAgICAgIHRoaXMuc2VsZWN0aW9ucy5yZW1vdmUocik7DQogICAgICAgIGlmKCFwcmV2ZW50Vmlld05vdGlmeSl7DQogICAgICAgICAgICB0aGlzLmdyaWQuZ2V0VmlldygpLm9uUm93RGVzZWxlY3QoaW5kZXgpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuZmlyZUV2ZW50KCJyb3dkZXNlbGVjdCIsIHRoaXMsIGluZGV4KTsNCiAgICAgICAgdGhpcy5maXJlRXZlbnQoInNlbGVjdGlvbmNoYW5nZSIsIHRoaXMpOw0KICAgIH0sDQoNCiAgICAKICAgIHJlc3RvcmVMYXN0IDogZnVuY3Rpb24oKXsNCiAgICAgICAgaWYodGhpcy5fbGFzdCl7DQogICAgICAgICAgICB0aGlzLmxhc3QgPSB0aGlzLl9sYXN0Ow0KICAgICAgICB9DQogICAgfSwNCg0KICAgIAogICAgYWNjZXB0c05hdiA6IGZ1bmN0aW9uKHJvdywgY29sLCBjbSl7DQogICAgICAgIHJldHVybiAhY20uaXNIaWRkZW4oY29sKSAmJiBjbS5pc0NlbGxFZGl0YWJsZShjb2wsIHJvdyk7DQogICAgfSwNCg0KICAgIAogICAgb25FZGl0b3JLZXkgOiBmdW5jdGlvbihmaWVsZCwgZSl7DQogICAgICAgIHZhciBrID0gZS5nZXRLZXkoKSwgbmV3Q2VsbCwgZyA9IHRoaXMuZ3JpZCwgZWQgPSBnLmFjdGl2ZUVkaXRvcjsNCiAgICAgICAgaWYoayA9PSBlLlRBQil7DQogICAgICAgICAgICBlLnN0b3BFdmVudCgpOw0KICAgICAgICAgICAgZWQuY29tcGxldGVFZGl0KCk7DQogICAgICAgICAgICBpZihlLnNoaWZ0S2V5KXsNCiAgICAgICAgICAgICAgICBuZXdDZWxsID0gZy53YWxrQ2VsbHMoZWQucm93LCBlZC5jb2wtMSwgLTEsIHRoaXMuYWNjZXB0c05hdiwgdGhpcyk7DQogICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICBuZXdDZWxsID0gZy53YWxrQ2VsbHMoZWQucm93LCBlZC5jb2wrMSwgMSwgdGhpcy5hY2NlcHRzTmF2LCB0aGlzKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfWVsc2UgaWYoayA9PSBlLkVOVEVSICYmICFlLmN0cmxLZXkpew0KICAgICAgICAgICAgZS5zdG9wRXZlbnQoKTsNCiAgICAgICAgICAgIGVkLmNvbXBsZXRlRWRpdCgpOw0KICAgICAgICAgICAgaWYoZS5zaGlmdEtleSl7DQogICAgICAgICAgICAgICAgbmV3Q2VsbCA9IGcud2Fsa0NlbGxzKGVkLnJvdy0xLCBlZC5jb2wsIC0xLCB0aGlzLmFjY2VwdHNOYXYsIHRoaXMpOw0KICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgbmV3Q2VsbCA9IGcud2Fsa0NlbGxzKGVkLnJvdysxLCBlZC5jb2wsIDEsIHRoaXMuYWNjZXB0c05hdiwgdGhpcyk7DQogICAgICAgICAgICB9DQogICAgICAgIH1lbHNlIGlmKGsgPT0gZS5FU0Mpew0KICAgICAgICAgICAgZWQuY2FuY2VsRWRpdCgpOw0KICAgICAgICB9DQogICAgICAgIGlmKG5ld0NlbGwpew0KICAgICAgICAgICAgZy5zdGFydEVkaXRpbmcobmV3Q2VsbFswXSwgbmV3Q2VsbFsxXSk7DQogICAgICAgIH0NCiAgICB9DQp9KTsKCkV4dC5ncmlkLkNlbGxTZWxlY3Rpb25Nb2RlbCA9IGZ1bmN0aW9uKGNvbmZpZyl7CiAgICBFeHQuYXBwbHkodGhpcywgY29uZmlnKTsKCiAgICB0aGlzLnNlbGVjdGlvbiA9IG51bGw7CgogICAgdGhpcy5hZGRFdmVudHMoewogICAgICAgIAoJICAgICJiZWZvcmVjZWxsc2VsZWN0IiA6IHRydWUsCiAgICAgICAgCgkgICAgImNlbGxzZWxlY3QiIDogdHJ1ZSwKICAgICAgICAKCSAgICAic2VsZWN0aW9uY2hhbmdlIiA6IHRydWUKICAgIH0pOwp9OwoKRXh0LmV4dGVuZChFeHQuZ3JpZC5DZWxsU2VsZWN0aW9uTW9kZWwsIEV4dC5ncmlkLkFic3RyYWN0U2VsZWN0aW9uTW9kZWwsICB7CgogICAgCiAgICBpbml0RXZlbnRzIDogZnVuY3Rpb24oKXsKICAgICAgICB0aGlzLmdyaWQub24oIm1vdXNlZG93biIsIHRoaXMuaGFuZGxlTW91c2VEb3duLCB0aGlzKTsKICAgICAgICB0aGlzLmdyaWQuZ2V0R3JpZEVsKCkub24oRXh0LmlzSUUgPyAia2V5ZG93biIgOiAia2V5cHJlc3MiLCB0aGlzLmhhbmRsZUtleURvd24sIHRoaXMpOwogICAgICAgIHZhciB2aWV3ID0gdGhpcy5ncmlkLnZpZXc7CiAgICAgICAgdmlldy5vbigicmVmcmVzaCIsIHRoaXMub25WaWV3Q2hhbmdlLCB0aGlzKTsKICAgICAgICB2aWV3Lm9uKCJyb3d1cGRhdGVkIiwgdGhpcy5vblJvd1VwZGF0ZWQsIHRoaXMpOwogICAgICAgIHZpZXcub24oImJlZm9yZXJvd3JlbW92ZWQiLCB0aGlzLmNsZWFyU2VsZWN0aW9ucywgdGhpcyk7CiAgICAgICAgdmlldy5vbigiYmVmb3Jlcm93c2luc2VydGVkIiwgdGhpcy5jbGVhclNlbGVjdGlvbnMsIHRoaXMpOwogICAgICAgIGlmKHRoaXMuZ3JpZC5pc0VkaXRvcil7CiAgICAgICAgICAgIHRoaXMuZ3JpZC5vbigiYmVmb3JlZWRpdCIsIHRoaXMuYmVmb3JlRWRpdCwgIHRoaXMpOwogICAgICAgIH0KICAgIH0sCgoJICAgIGJlZm9yZUVkaXQgOiBmdW5jdGlvbihlKXsKICAgICAgICB0aGlzLnNlbGVjdChlLnJvdywgZS5jb2x1bW4sIGZhbHNlLCB0cnVlLCBlLnJlY29yZCk7CiAgICB9LAoKCSAgICBvblJvd1VwZGF0ZWQgOiBmdW5jdGlvbih2LCBpbmRleCwgcil7CiAgICAgICAgaWYodGhpcy5zZWxlY3Rpb24gJiYgdGhpcy5zZWxlY3Rpb24ucmVjb3JkID09IHIpewogICAgICAgICAgICB2Lm9uQ2VsbFNlbGVjdChpbmRleCwgdGhpcy5zZWxlY3Rpb24uY2VsbFsxXSk7CiAgICAgICAgfQogICAgfSwKCgkgICAgb25WaWV3Q2hhbmdlIDogZnVuY3Rpb24oKXsKICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9ucyh0cnVlKTsKICAgIH0sCgoJCiAgICBnZXRTZWxlY3RlZENlbGwgOiBmdW5jdGlvbigpewogICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbiA/IHRoaXMuc2VsZWN0aW9uLmNlbGwgOiBudWxsOwogICAgfSwKCiAgICAKICAgIGNsZWFyU2VsZWN0aW9ucyA6IGZ1bmN0aW9uKHByZXZlbnROb3RpZnkpewogICAgICAgIHZhciBzID0gdGhpcy5zZWxlY3Rpb247CiAgICAgICAgaWYocyl7CiAgICAgICAgICAgIGlmKHByZXZlbnROb3RpZnkgIT09IHRydWUpewogICAgICAgICAgICAgICAgdGhpcy5ncmlkLnZpZXcub25DZWxsRGVzZWxlY3Qocy5jZWxsWzBdLCBzLmNlbGxbMV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoInNlbGVjdGlvbmNoYW5nZSIsIHRoaXMsIG51bGwpOwogICAgICAgIH0KICAgIH0sCgogICAgCiAgICBoYXNTZWxlY3Rpb24gOiBmdW5jdGlvbigpewogICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbiA/IHRydWUgOiBmYWxzZTsKICAgIH0sCgogICAgCiAgICBoYW5kbGVNb3VzZURvd24gOiBmdW5jdGlvbihlLCB0KXsKICAgICAgICB2YXIgdiA9IHRoaXMuZ3JpZC5nZXRWaWV3KCk7CiAgICAgICAgaWYodGhpcy5pc0xvY2tlZCgpKXsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH07CiAgICAgICAgdmFyIHJvdyA9IHYuZmluZFJvd0luZGV4KHQpOwogICAgICAgIHZhciBjZWxsID0gdi5maW5kQ2VsbEluZGV4KHQpOwogICAgICAgIGlmKHJvdyAhPT0gZmFsc2UgJiYgY2VsbCAhPT0gZmFsc2UpewogICAgICAgICAgICB0aGlzLnNlbGVjdChyb3csIGNlbGwpOwogICAgICAgIH0KICAgIH0sCgogICAgCiAgICBzZWxlY3QgOiBmdW5jdGlvbihyb3dJbmRleCwgY29sSW5kZXgsIHByZXZlbnRWaWV3Tm90aWZ5LCBwcmV2ZW50Rm9jdXMsICByKXsKICAgICAgICBpZih0aGlzLmZpcmVFdmVudCgiYmVmb3JlY2VsbHNlbGVjdCIsIHRoaXMsIHJvd0luZGV4LCBjb2xJbmRleCkgIT09IGZhbHNlKXsKICAgICAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbnMoKTsKICAgICAgICAgICAgciA9IHIgfHwgdGhpcy5ncmlkLmRhdGFTb3VyY2UuZ2V0QXQocm93SW5kZXgpOwogICAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHsKICAgICAgICAgICAgICAgIHJlY29yZCA6IHIsCiAgICAgICAgICAgICAgICBjZWxsIDogW3Jvd0luZGV4LCBjb2xJbmRleF0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYoIXByZXZlbnRWaWV3Tm90aWZ5KXsKICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5ncmlkLmdldFZpZXcoKTsKICAgICAgICAgICAgICAgIHYub25DZWxsU2VsZWN0KHJvd0luZGV4LCBjb2xJbmRleCk7CiAgICAgICAgICAgICAgICBpZihwcmV2ZW50Rm9jdXMgIT09IHRydWUpewogICAgICAgICAgICAgICAgICAgIHYuZm9jdXNDZWxsKHJvd0luZGV4LCBjb2xJbmRleCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoImNlbGxzZWxlY3QiLCB0aGlzLCByb3dJbmRleCwgY29sSW5kZXgpOwogICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgic2VsZWN0aW9uY2hhbmdlIiwgdGhpcywgdGhpcy5zZWxlY3Rpb24pOwogICAgICAgIH0KICAgIH0sCgoJICAgIGlzU2VsZWN0YWJsZSA6IGZ1bmN0aW9uKHJvd0luZGV4LCBjb2xJbmRleCwgY20pewogICAgICAgIHJldHVybiAhY20uaXNIaWRkZW4oY29sSW5kZXgpOwogICAgfSwKCiAgICAKICAgIGhhbmRsZUtleURvd24gOiBmdW5jdGlvbihlKXsKICAgICAgICBpZighZS5pc05hdktleVByZXNzKCkpewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHZhciBnID0gdGhpcy5ncmlkLCBzID0gdGhpcy5zZWxlY3Rpb247CiAgICAgICAgaWYoIXMpewogICAgICAgICAgICBlLnN0b3BFdmVudCgpOwogICAgICAgICAgICB2YXIgY2VsbCA9IGcud2Fsa0NlbGxzKDAsIDAsIDEsIHRoaXMuaXNTZWxlY3RhYmxlLCAgdGhpcyk7CiAgICAgICAgICAgIGlmKGNlbGwpewogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3QoY2VsbFswXSwgY2VsbFsxXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgc20gPSB0aGlzOwogICAgICAgIHZhciB3YWxrID0gZnVuY3Rpb24ocm93LCBjb2wsIHN0ZXApewogICAgICAgICAgICByZXR1cm4gZy53YWxrQ2VsbHMocm93LCBjb2wsIHN0ZXAsIHNtLmlzU2VsZWN0YWJsZSwgIHNtKTsKICAgICAgICB9OwogICAgICAgIHZhciBrID0gZS5nZXRLZXkoKSwgciA9IHMuY2VsbFswXSwgYyA9IHMuY2VsbFsxXTsKICAgICAgICB2YXIgbmV3Q2VsbDsKCiAgICAgICAgc3dpdGNoKGspewogICAgICAgICAgICAgY2FzZSBlLlRBQjoKICAgICAgICAgICAgICAgICBpZihlLnNoaWZ0S2V5KXsKICAgICAgICAgICAgICAgICAgICAgbmV3Q2VsbCA9IHdhbGsociwgYy0xLCAtMSk7CiAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgIG5ld0NlbGwgPSB3YWxrKHIsIGMrMSwgMSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIGUuRE9XTjoKICAgICAgICAgICAgICAgICBuZXdDZWxsID0gd2FsayhyKzEsIGMsIDEpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIGUuVVA6CiAgICAgICAgICAgICAgICAgbmV3Q2VsbCA9IHdhbGsoci0xLCBjLCAtMSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgZS5SSUdIVDoKICAgICAgICAgICAgICAgICBuZXdDZWxsID0gd2FsayhyLCBjKzEsIDEpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIGUuTEVGVDoKICAgICAgICAgICAgICAgICBuZXdDZWxsID0gd2FsayhyLCBjLTEsIC0xKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBlLkVOVEVSOgogICAgICAgICAgICAgICAgIGlmKGcuaXNFZGl0b3IgJiYgIWcuZWRpdGluZyl7CiAgICAgICAgICAgICAgICAgICAgZy5zdGFydEVkaXRpbmcociwgYyk7CiAgICAgICAgICAgICAgICAgICAgZS5zdG9wRXZlbnQoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICB9OwogICAgICAgIGlmKG5ld0NlbGwpewogICAgICAgICAgICB0aGlzLnNlbGVjdChuZXdDZWxsWzBdLCBuZXdDZWxsWzFdKTsKICAgICAgICAgICAgZS5zdG9wRXZlbnQoKTsKICAgICAgICB9CiAgICB9LAoKICAgIGFjY2VwdHNOYXYgOiBmdW5jdGlvbihyb3csIGNvbCwgY20pewogICAgICAgIHJldHVybiAhY20uaXNIaWRkZW4oY29sKSAmJiBjbS5pc0NlbGxFZGl0YWJsZShjb2wsIHJvdyk7CiAgICB9LAoKICAgIG9uRWRpdG9yS2V5IDogZnVuY3Rpb24oZmllbGQsIGUpewogICAgICAgIHZhciBrID0gZS5nZXRLZXkoKSwgbmV3Q2VsbCwgZyA9IHRoaXMuZ3JpZCwgZWQgPSBnLmFjdGl2ZUVkaXRvcjsKICAgICAgICBpZihrID09IGUuVEFCKXsKICAgICAgICAgICAgaWYoZS5zaGlmdEtleSl7CiAgICAgICAgICAgICAgICBuZXdDZWxsID0gZy53YWxrQ2VsbHMoZWQucm93LCBlZC5jb2wtMSwgLTEsIHRoaXMuYWNjZXB0c05hdiwgdGhpcyk7CiAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgbmV3Q2VsbCA9IGcud2Fsa0NlbGxzKGVkLnJvdywgZWQuY29sKzEsIDEsIHRoaXMuYWNjZXB0c05hdiwgdGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZS5zdG9wRXZlbnQoKTsKICAgICAgICB9ZWxzZSBpZihrID09IGUuRU5URVIgJiYgIWUuY3RybEtleSl7CiAgICAgICAgICAgIGVkLmNvbXBsZXRlRWRpdCgpOwogICAgICAgICAgICBlLnN0b3BFdmVudCgpOwogICAgICAgIH1lbHNlIGlmKGsgPT0gZS5FU0MpewogICAgICAgICAgICBlZC5jYW5jZWxFZGl0KCk7CiAgICAgICAgfQogICAgICAgIGlmKG5ld0NlbGwpewogICAgICAgICAgICBnLnN0YXJ0RWRpdGluZyhuZXdDZWxsWzBdLCBuZXdDZWxsWzFdKTsKICAgICAgICB9CiAgICB9Cn0pOwoNCkV4dC5ncmlkLkVkaXRvckdyaWQgPSBmdW5jdGlvbihjb250YWluZXIsIGNvbmZpZyl7DQogICAgRXh0LmdyaWQuRWRpdG9yR3JpZC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgY29udGFpbmVyLCBjb25maWcpOw0KICAgIHRoaXMuZ2V0R3JpZEVsKCkuYWRkQ2xhc3MoInhlZGl0LWdyaWQiKTsNCg0KICAgIGlmKCF0aGlzLnNlbE1vZGVsKXsNCiAgICAgICAgdGhpcy5zZWxNb2RlbCA9IG5ldyBFeHQuZ3JpZC5DZWxsU2VsZWN0aW9uTW9kZWwoKTsNCiAgICB9DQoNCiAgICB0aGlzLmFjdGl2ZUVkaXRvciA9IG51bGw7DQoNCgl0aGlzLmFkZEV2ZW50cyh7DQoJICAgIA0KCSAgICAiYmVmb3JlZWRpdCIgOiB0cnVlLA0KCSAgICANCgkgICAgImFmdGVyZWRpdCIgOiB0cnVlLA0KCSAgICANCgkgICAgInZhbGlkYXRlZWRpdCIgOiB0cnVlDQoJfSk7DQogICAgdGhpcy5vbigiYm9keXNjcm9sbCIsIHRoaXMuc3RvcEVkaXRpbmcsICB0aGlzKTsNCiAgICB0aGlzLm9uKHRoaXMuY2xpY2tzVG9FZGl0ID09IDEgPyAiY2VsbGNsaWNrIiA6ICJjZWxsZGJsY2xpY2siLCB0aGlzLm9uQ2VsbERibENsaWNrLCAgdGhpcyk7DQp9Ow0KDQpFeHQuZXh0ZW5kKEV4dC5ncmlkLkVkaXRvckdyaWQsIEV4dC5ncmlkLkdyaWQsIHsNCiAgICANCiAgICBjbGlja3NUb0VkaXQ6IDIsDQoNCiAgICAKICAgIGlzRWRpdG9yIDogdHJ1ZSwNCiAgICAKICAgIHRyYWNrTW91c2VPdmVyOiBmYWxzZSwgCg0KICAgIG9uQ2VsbERibENsaWNrIDogZnVuY3Rpb24oZywgcm93LCBjb2wpew0KICAgICAgICB0aGlzLnN0YXJ0RWRpdGluZyhyb3csIGNvbCk7DQogICAgfSwNCg0KICAgIG9uRWRpdENvbXBsZXRlIDogZnVuY3Rpb24oZWQsIHZhbHVlLCBzdGFydFZhbHVlKXsNCiAgICAgICAgdGhpcy5lZGl0aW5nID0gZmFsc2U7DQogICAgICAgIHRoaXMuYWN0aXZlRWRpdG9yID0gbnVsbDsNCiAgICAgICAgZWQudW4oInNwZWNpYWxrZXkiLCB0aGlzLnNlbE1vZGVsLm9uRWRpdG9yS2V5LCB0aGlzLnNlbE1vZGVsKTsNCiAgICAgICAgaWYoU3RyaW5nKHZhbHVlKSAhPT0gU3RyaW5nKHN0YXJ0VmFsdWUpKXsNCiAgICAgICAgICAgIHZhciByID0gZWQucmVjb3JkOw0KICAgICAgICAgICAgdmFyIGZpZWxkID0gdGhpcy5jb2xNb2RlbC5nZXREYXRhSW5kZXgoZWQuY29sKTsNCiAgICAgICAgICAgIHZhciBlID0gew0KICAgICAgICAgICAgICAgIGdyaWQ6IHRoaXMsDQogICAgICAgICAgICAgICAgcmVjb3JkOiByLA0KICAgICAgICAgICAgICAgIGZpZWxkOiBmaWVsZCwNCiAgICAgICAgICAgICAgICBvcmlnaW5hbFZhbHVlOiBzdGFydFZhbHVlLA0KICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSwNCiAgICAgICAgICAgICAgICByb3c6IGVkLnJvdywNCiAgICAgICAgICAgICAgICBjb2x1bW46IGVkLmNvbCwNCiAgICAgICAgICAgICAgICBjYW5jZWw6ZmFsc2UNCiAgICAgICAgICAgIH07DQogICAgICAgICAgICBpZih0aGlzLmZpcmVFdmVudCgidmFsaWRhdGVlZGl0IiwgZSkgIT09IGZhbHNlICYmICFlLmNhbmNlbCl7DQogICAgICAgICAgICAgICAgci5zZXQoZmllbGQsIGUudmFsdWUpOw0KICAgICAgICAgICAgICAgIGRlbGV0ZSBlLmNhbmNlbDsNCiAgICAgICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgiYWZ0ZXJlZGl0IiwgZSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgdGhpcy52aWV3LmZvY3VzQ2VsbChlZC5yb3csIGVkLmNvbCk7DQogICAgfSwNCg0KICAgIA0KICAgIHN0YXJ0RWRpdGluZyA6IGZ1bmN0aW9uKHJvdywgY29sKXsNCiAgICAgICAgdGhpcy5zdG9wRWRpdGluZygpOw0KICAgICAgICBpZih0aGlzLmNvbE1vZGVsLmlzQ2VsbEVkaXRhYmxlKGNvbCwgcm93KSl7DQogICAgICAgICAgICB0aGlzLnZpZXcuZW5zdXJlVmlzaWJsZShyb3csIGNvbCwgdHJ1ZSk7DQogICAgICAgICAgICB2YXIgciA9IHRoaXMuZGF0YVNvdXJjZS5nZXRBdChyb3cpOw0KICAgICAgICAgICAgdmFyIGZpZWxkID0gdGhpcy5jb2xNb2RlbC5nZXREYXRhSW5kZXgoY29sKTsNCiAgICAgICAgICAgIHZhciBlID0gew0KICAgICAgICAgICAgICAgIGdyaWQ6IHRoaXMsDQogICAgICAgICAgICAgICAgcmVjb3JkOiByLA0KICAgICAgICAgICAgICAgIGZpZWxkOiBmaWVsZCwNCiAgICAgICAgICAgICAgICB2YWx1ZTogci5kYXRhW2ZpZWxkXSwNCiAgICAgICAgICAgICAgICByb3c6IHJvdywNCiAgICAgICAgICAgICAgICBjb2x1bW46IGNvbCwNCiAgICAgICAgICAgICAgICBjYW5jZWw6ZmFsc2UNCiAgICAgICAgICAgIH07DQogICAgICAgICAgICBpZih0aGlzLmZpcmVFdmVudCgiYmVmb3JlZWRpdCIsIGUpICE9PSBmYWxzZSAmJiAhZS5jYW5jZWwpew0KICAgICAgICAgICAgICAgIHRoaXMuZWRpdGluZyA9IHRydWU7DQogICAgICAgICAgICAgICAgdmFyIGVkID0gdGhpcy5jb2xNb2RlbC5nZXRDZWxsRWRpdG9yKGNvbCwgcm93KTsNCiAgICAgICAgICAgICAgICBpZighZWQucmVuZGVyZWQpew0KICAgICAgICAgICAgICAgICAgICBlZC5yZW5kZXIoZWQucGFyZW50RWwgfHwgZG9jdW1lbnQuYm9keSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIChmdW5jdGlvbigpeyAKICAgICAgICAgICAgICAgICAgICBlZC5yb3cgPSByb3c7DQogICAgICAgICAgICAgICAgICAgIGVkLmNvbCA9IGNvbDsNCiAgICAgICAgICAgICAgICAgICAgZWQucmVjb3JkID0gcjsNCiAgICAgICAgICAgICAgICAgICAgZWQub24oImNvbXBsZXRlIiwgdGhpcy5vbkVkaXRDb21wbGV0ZSwgdGhpcywge3NpbmdsZTogdHJ1ZX0pOw0KICAgICAgICAgICAgICAgICAgICBlZC5vbigic3BlY2lhbGtleSIsIHRoaXMuc2VsTW9kZWwub25FZGl0b3JLZXksIHRoaXMuc2VsTW9kZWwpOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZUVkaXRvciA9IGVkOw0KICAgICAgICAgICAgICAgICAgICB2YXIgdiA9IHIuZGF0YVtmaWVsZF07DQogICAgICAgICAgICAgICAgICAgIGVkLnN0YXJ0RWRpdCh0aGlzLnZpZXcuZ2V0Q2VsbChyb3csIGNvbCksIHYpOw0KICAgICAgICAgICAgICAgIH0pLmRlZmVyKDUwLCB0aGlzKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0sDQogICAgICAgIA0KICAgIA0KICAgIHN0b3BFZGl0aW5nIDogZnVuY3Rpb24oKXsNCiAgICAgICAgaWYodGhpcy5hY3RpdmVFZGl0b3Ipew0KICAgICAgICAgICAgdGhpcy5hY3RpdmVFZGl0b3IuY29tcGxldGVFZGl0KCk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5hY3RpdmVFZGl0b3IgPSBudWxsOw0KICAgIH0NCn0pOwpFeHQuZ3JpZC5HcmlkRWRpdG9yID0gZnVuY3Rpb24oZmllbGQsIGNvbmZpZyl7CiAgICBFeHQuZ3JpZC5HcmlkRWRpdG9yLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBmaWVsZCwgY29uZmlnKTsKICAgIGZpZWxkLm1vbml0b3JUYWIgPSBmYWxzZTsKfTsKCkV4dC5leHRlbmQoRXh0LmdyaWQuR3JpZEVkaXRvciwgRXh0LkVkaXRvciwgewogICAgYWxpZ25tZW50OiAidGwtdGwiLAogICAgYXV0b1NpemU6ICJ3aWR0aCIsCiAgICBoaWRlRWwgOiBmYWxzZSwKICAgIGNsczogIngtc21hbGwtZWRpdG9yIHgtZ3JpZC1lZGl0b3IiLAogICAgc2hpbTpmYWxzZSwKICAgIHNoYWRvdzoiZnJhbWUiCn0pOwpFeHQuZ3JpZC5Qcm9wZXJ0eVJlY29yZCA9IEV4dC5kYXRhLlJlY29yZC5jcmVhdGUoWwogICAge25hbWU6J25hbWUnLHR5cGU6J3N0cmluZyd9LCAndmFsdWUnCl0pOwoKRXh0LmdyaWQuUHJvcGVydHlTdG9yZSA9IGZ1bmN0aW9uKGdyaWQsIHNvdXJjZSl7CiAgICB0aGlzLmdyaWQgPSBncmlkOwogICAgdGhpcy5zdG9yZSA9IG5ldyBFeHQuZGF0YS5TdG9yZSh7CiAgICAgICAgcmVjb3JkVHlwZSA6IEV4dC5ncmlkLlByb3BlcnR5UmVjb3JkCiAgICB9KTsKICAgIHRoaXMuc3RvcmUub24oJ3VwZGF0ZScsIHRoaXMub25VcGRhdGUsICB0aGlzKTsKICAgIGlmKHNvdXJjZSl7CiAgICAgICAgdGhpcy5zZXRTb3VyY2Uoc291cmNlKTsKICAgIH0KICAgIEV4dC5ncmlkLlByb3BlcnR5U3RvcmUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpOwp9OwpFeHQuZXh0ZW5kKEV4dC5ncmlkLlByb3BlcnR5U3RvcmUsIEV4dC51dGlsLk9ic2VydmFibGUsIHsKICAgIHNldFNvdXJjZSA6IGZ1bmN0aW9uKG8pewogICAgICAgIHRoaXMuc291cmNlID0gbzsKICAgICAgICB0aGlzLnN0b3JlLnJlbW92ZUFsbCgpOwogICAgICAgIHZhciBkYXRhID0gW107CiAgICAgICAgZm9yKHZhciBrIGluIG8pewogICAgICAgICAgICBpZih0aGlzLmlzRWRpdGFibGVWYWx1ZShvW2tdKSl7CiAgICAgICAgICAgICAgICBkYXRhLnB1c2gobmV3IEV4dC5ncmlkLlByb3BlcnR5UmVjb3JkKHtuYW1lOiBrLCB2YWx1ZTogb1trXX0sIGspKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLnN0b3JlLmxvYWRSZWNvcmRzKHtyZWNvcmRzOiBkYXRhfSwge30sIHRydWUpOwogICAgfSwKCiAgICBvblVwZGF0ZSA6IGZ1bmN0aW9uKGRzLCByZWNvcmQsIHR5cGUpewogICAgICAgIGlmKHR5cGUgPT0gRXh0LmRhdGEuUmVjb3JkLkVESVQpewogICAgICAgICAgICB2YXIgdiA9IHJlY29yZC5kYXRhWyd2YWx1ZSddOwogICAgICAgICAgICB2YXIgb2xkVmFsdWUgPSByZWNvcmQubW9kaWZpZWRbJ3ZhbHVlJ107CiAgICAgICAgICAgIGlmKHRoaXMuZ3JpZC5maXJlRXZlbnQoJ2JlZm9yZXByb3BlcnR5Y2hhbmdlJywgdGhpcy5zb3VyY2UsIHJlY29yZC5pZCwgdiwgb2xkVmFsdWUpICE9PSBmYWxzZSl7CiAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZVtyZWNvcmQuaWRdID0gdjsKICAgICAgICAgICAgICAgIHJlY29yZC5jb21taXQoKTsKICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5maXJlRXZlbnQoJ3Byb3BlcnR5Y2hhbmdlJywgdGhpcy5zb3VyY2UsIHJlY29yZC5pZCwgdiwgb2xkVmFsdWUpOwogICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgIHJlY29yZC5yZWplY3QoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0sCgogICAgZ2V0UHJvcGVydHkgOiBmdW5jdGlvbihyb3cpewogICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0QXQocm93KTsKICAgIH0sCgogICAgaXNFZGl0YWJsZVZhbHVlOiBmdW5jdGlvbih2YWwpewogICAgICAgIGlmKHZhbCAmJiB2YWwgaW5zdGFuY2VvZiBEYXRlKXsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfWVsc2UgaWYodHlwZW9mIHZhbCA9PSAnb2JqZWN0JyB8fCB0eXBlb2YgdmFsID09ICdmdW5jdGlvbicpewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgfSwKCiAgICBzZXRWYWx1ZSA6IGZ1bmN0aW9uKHByb3AsIHZhbHVlKXsKICAgICAgICB0aGlzLnNvdXJjZVtwcm9wXSA9IHZhbHVlOwogICAgICAgIHRoaXMuc3RvcmUuZ2V0QnlJZChwcm9wKS5zZXQoJ3ZhbHVlJywgdmFsdWUpOwogICAgfSwKCiAgICBnZXRTb3VyY2UgOiBmdW5jdGlvbigpewogICAgICAgIHJldHVybiB0aGlzLnNvdXJjZTsKICAgIH0KfSk7CgpFeHQuZ3JpZC5Qcm9wZXJ0eUNvbHVtbk1vZGVsID0gZnVuY3Rpb24oZ3JpZCwgc3RvcmUpewogICAgdGhpcy5ncmlkID0gZ3JpZDsKICAgIHZhciBnID0gRXh0LmdyaWQ7CiAgICBnLlByb3BlcnR5Q29sdW1uTW9kZWwuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIFsKICAgICAgICB7aGVhZGVyOiB0aGlzLm5hbWVUZXh0LCBzb3J0YWJsZTogdHJ1ZSwgZGF0YUluZGV4OiduYW1lJywgaWQ6ICduYW1lJ30sCiAgICAgICAge2hlYWRlcjogdGhpcy52YWx1ZVRleHQsIHJlc2l6YWJsZTpmYWxzZSwgZGF0YUluZGV4OiAndmFsdWUnLCBpZDogJ3ZhbHVlJ30KICAgIF0pOwogICAgdGhpcy5zdG9yZSA9IHN0b3JlOwogICAgdGhpcy5ic2VsZWN0ID0gRXh0LkRvbUhlbHBlci5hcHBlbmQoZG9jdW1lbnQuYm9keSwgewogICAgICAgIHRhZzogJ3NlbGVjdCcsIHN0eWxlOidkaXNwbGF5Om5vbmUnLCBjbHM6ICd4LWdyaWQtZWRpdG9yJywgY2hpbGRyZW46IFsKICAgICAgICAgICAge3RhZzogJ29wdGlvbicsIHZhbHVlOiAndHJ1ZScsIGh0bWw6ICd0cnVlJ30sCiAgICAgICAgICAgIHt0YWc6ICdvcHRpb24nLCB2YWx1ZTogJ2ZhbHNlJywgaHRtbDogJ2ZhbHNlJ30KICAgICAgICBdCiAgICB9KTsKICAgIEV4dC5pZCh0aGlzLmJzZWxlY3QpOwogICAgdmFyIGYgPSBFeHQuZm9ybTsKICAgIHRoaXMuZWRpdG9ycyA9IHsKICAgICAgICAnZGF0ZScgOiBuZXcgZy5HcmlkRWRpdG9yKG5ldyBmLkRhdGVGaWVsZCh7c2VsZWN0T25Gb2N1czp0cnVlfSkpLAogICAgICAgICdzdHJpbmcnIDogbmV3IGcuR3JpZEVkaXRvcihuZXcgZi5UZXh0RmllbGQoe3NlbGVjdE9uRm9jdXM6dHJ1ZX0pKSwKICAgICAgICAnbnVtYmVyJyA6IG5ldyBnLkdyaWRFZGl0b3IobmV3IGYuTnVtYmVyRmllbGQoe3NlbGVjdE9uRm9jdXM6dHJ1ZSwgc3R5bGU6J3RleHQtYWxpZ246bGVmdDsnfSkpLAogICAgICAgICdib29sZWFuJyA6IG5ldyBnLkdyaWRFZGl0b3IobmV3IGYuRmllbGQoe2VsOnRoaXMuYnNlbGVjdCxzZWxlY3RPbkZvY3VzOnRydWV9KSkKICAgIH07CiAgICB0aGlzLnJlbmRlckNlbGxEZWxlZ2F0ZSA9IHRoaXMucmVuZGVyQ2VsbC5jcmVhdGVEZWxlZ2F0ZSh0aGlzKTsKICAgIHRoaXMucmVuZGVyUHJvcERlbGVnYXRlID0gdGhpcy5yZW5kZXJQcm9wLmNyZWF0ZURlbGVnYXRlKHRoaXMpOwp9OwoKRXh0LmV4dGVuZChFeHQuZ3JpZC5Qcm9wZXJ0eUNvbHVtbk1vZGVsLCBFeHQuZ3JpZC5Db2x1bW5Nb2RlbCwgewogICAgbmFtZVRleHQgOiAnTmFtZScsCiAgICB2YWx1ZVRleHQgOiAnVmFsdWUnLAogICAgZGF0ZUZvcm1hdCA6ICdtL2ovWScsCiAgICByZW5kZXJEYXRlIDogZnVuY3Rpb24oZGF0ZVZhbCl7CiAgICAgICAgcmV0dXJuIGRhdGVWYWwuZGF0ZUZvcm1hdCh0aGlzLmRhdGVGb3JtYXQpOwogICAgfSwKCiAgICByZW5kZXJCb29sIDogZnVuY3Rpb24oYlZhbCl7CiAgICAgICAgcmV0dXJuIGJWYWwgPyAndHJ1ZScgOiAnZmFsc2UnOwogICAgfSwKCiAgICBpc0NlbGxFZGl0YWJsZSA6IGZ1bmN0aW9uKGNvbEluZGV4LCByb3dJbmRleCl7CiAgICAgICAgcmV0dXJuIGNvbEluZGV4ID09IDE7CiAgICB9LAoKICAgIGdldFJlbmRlcmVyIDogZnVuY3Rpb24oY29sKXsKICAgICAgICByZXR1cm4gY29sID09IDEgPwogICAgICAgICAgICB0aGlzLnJlbmRlckNlbGxEZWxlZ2F0ZSA6IHRoaXMucmVuZGVyUHJvcERlbGVnYXRlOwogICAgfSwKCiAgICByZW5kZXJQcm9wIDogZnVuY3Rpb24odil7CiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlOYW1lKHYpOwogICAgfSwKCiAgICByZW5kZXJDZWxsIDogZnVuY3Rpb24odmFsKXsKICAgICAgICB2YXIgcnYgPSB2YWw7CiAgICAgICAgaWYodmFsIGluc3RhbmNlb2YgRGF0ZSl7CiAgICAgICAgICAgIHJ2ID0gdGhpcy5yZW5kZXJEYXRlKHZhbCk7CiAgICAgICAgfWVsc2UgaWYodHlwZW9mIHZhbCA9PSAnYm9vbGVhbicpewogICAgICAgICAgICBydiA9IHRoaXMucmVuZGVyQm9vbCh2YWwpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gRXh0LnV0aWwuRm9ybWF0Lmh0bWxFbmNvZGUocnYpOwogICAgfSwKCiAgICBnZXRQcm9wZXJ0eU5hbWUgOiBmdW5jdGlvbihuYW1lKXsKICAgICAgICB2YXIgcG4gPSB0aGlzLmdyaWQucHJvcGVydHlOYW1lczsKICAgICAgICByZXR1cm4gcG4gJiYgcG5bbmFtZV0gPyBwbltuYW1lXSA6IG5hbWU7CiAgICB9LAoKICAgIGdldENlbGxFZGl0b3IgOiBmdW5jdGlvbihjb2xJbmRleCwgcm93SW5kZXgpewogICAgICAgIHZhciBwID0gdGhpcy5zdG9yZS5nZXRQcm9wZXJ0eShyb3dJbmRleCk7CiAgICAgICAgdmFyIG4gPSBwLmRhdGFbJ25hbWUnXSwgdmFsID0gcC5kYXRhWyd2YWx1ZSddOwogICAgICAgIGlmKHRoaXMuZ3JpZC5jdXN0b21FZGl0b3JzW25dKXsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZC5jdXN0b21FZGl0b3JzW25dOwogICAgICAgIH0KICAgICAgICBpZih2YWwgaW5zdGFuY2VvZiBEYXRlKXsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yc1snZGF0ZSddOwogICAgICAgIH1lbHNlIGlmKHR5cGVvZiB2YWwgPT0gJ251bWJlcicpewogICAgICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JzWydudW1iZXInXTsKICAgICAgICB9ZWxzZSBpZih0eXBlb2YgdmFsID09ICdib29sZWFuJyl7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmVkaXRvcnNbJ2Jvb2xlYW4nXTsKICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yc1snc3RyaW5nJ107CiAgICAgICAgfQogICAgfQp9KTsKCkV4dC5ncmlkLlByb3BlcnR5R3JpZCA9IGZ1bmN0aW9uKGNvbnRhaW5lciwgY29uZmlnKXsKICAgIGNvbmZpZyA9IGNvbmZpZyB8fCB7fTsKICAgIHZhciBzdG9yZSA9IG5ldyBFeHQuZ3JpZC5Qcm9wZXJ0eVN0b3JlKHRoaXMpOwogICAgdGhpcy5zdG9yZSA9IHN0b3JlOwogICAgdmFyIGNtID0gbmV3IEV4dC5ncmlkLlByb3BlcnR5Q29sdW1uTW9kZWwodGhpcywgc3RvcmUpOwogICAgc3RvcmUuc3RvcmUuc29ydCgnbmFtZScsICdBU0MnKTsKICAgIEV4dC5ncmlkLlByb3BlcnR5R3JpZC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgY29udGFpbmVyLCBFeHQuYXBwbHkoewogICAgICAgIGRzOiBzdG9yZS5zdG9yZSwKICAgICAgICBjbTogY20sCiAgICAgICAgZW5hYmxlQ29sTG9jazpmYWxzZSwKICAgICAgICBlbmFibGVDb2x1bW5Nb3ZlOmZhbHNlLAogICAgICAgIHN0cmlwZVJvd3M6ZmFsc2UsCiAgICAgICAgdHJhY2tNb3VzZU92ZXI6IGZhbHNlLAogICAgICAgIGNsaWNrc1RvRWRpdDoxCiAgICB9LCBjb25maWcpKTsKICAgIHRoaXMuZ2V0R3JpZEVsKCkuYWRkQ2xhc3MoJ3gtcHJvcHMtZ3JpZCcpOwogICAgdGhpcy5sYXN0RWRpdFJvdyA9IG51bGw7CiAgICB0aGlzLm9uKCdjb2x1bW5yZXNpemUnLCB0aGlzLm9uQ29sdW1uUmVzaXplLCB0aGlzKTsKICAgIHRoaXMuYWRkRXZlbnRzKHsKICAgICAgICBiZWZvcmVwcm9wZXJ0eWNoYW5nZTogdHJ1ZSwKICAgICAgICBwcm9wZXJ0eWNoYW5nZTogdHJ1ZQogICAgfSk7CiAgICB0aGlzLmN1c3RvbUVkaXRvcnMgPSB0aGlzLmN1c3RvbUVkaXRvcnMgfHwge307Cn07CkV4dC5leHRlbmQoRXh0LmdyaWQuUHJvcGVydHlHcmlkLCBFeHQuZ3JpZC5FZGl0b3JHcmlkLCB7CiAgICByZW5kZXIgOiBmdW5jdGlvbigpewogICAgICAgIEV4dC5ncmlkLlByb3BlcnR5R3JpZC5zdXBlcmNsYXNzLnJlbmRlci5jYWxsKHRoaXMpOwogICAgICAgIHRoaXMuYXV0b1NpemUuZGVmZXIoMTAwLCB0aGlzKTsKICAgIH0sCgogICAgYXV0b1NpemUgOiBmdW5jdGlvbigpewogICAgICAgIEV4dC5ncmlkLlByb3BlcnR5R3JpZC5zdXBlcmNsYXNzLmF1dG9TaXplLmNhbGwodGhpcyk7CiAgICAgICAgaWYodGhpcy52aWV3KXsKICAgICAgICAgICAgdGhpcy52aWV3LmZpdENvbHVtbnMoKTsKICAgICAgICB9CiAgICB9LAoKICAgIG9uQ29sdW1uUmVzaXplIDogZnVuY3Rpb24oKXsKICAgICAgICB0aGlzLmNvbE1vZGVsLnNldENvbHVtbldpZHRoKDEsIHRoaXMuY29udGFpbmVyLmdldFdpZHRoKHRydWUpLXRoaXMuY29sTW9kZWwuZ2V0Q29sdW1uV2lkdGgoMCkpOwogICAgICAgIHRoaXMuYXV0b1NpemUoKTsKICAgIH0sCgogICAgc2V0U291cmNlIDogZnVuY3Rpb24oc291cmNlKXsKICAgICAgICB0aGlzLnN0b3JlLnNldFNvdXJjZShzb3VyY2UpOwogICAgICAgICAgICB9LAoKICAgIGdldFNvdXJjZSA6IGZ1bmN0aW9uKCl7CiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0U291cmNlKCk7CiAgICB9Cn0pOwoKRXh0LkxvYWRNYXNrID0gZnVuY3Rpb24oZWwsIGNvbmZpZyl7CiAgICB0aGlzLmVsID0gRXh0LmdldChlbCk7CiAgICBFeHQuYXBwbHkodGhpcywgY29uZmlnKTsKICAgIGlmKHRoaXMuc3RvcmUpewogICAgICAgIHRoaXMuc3RvcmUub24oJ2JlZm9yZWxvYWQnLCB0aGlzLm9uQmVmb3JlTG9hZCwgdGhpcyk7CiAgICAgICAgdGhpcy5zdG9yZS5vbignbG9hZCcsIHRoaXMub25Mb2FkLCB0aGlzKTsKICAgICAgICB0aGlzLnN0b3JlLm9uKCdsb2FkZXhjZXB0aW9uJywgdGhpcy5vbkxvYWQsIHRoaXMpOwogICAgICAgIHRoaXMucmVtb3ZlTWFzayA9IGZhbHNlOwogICAgfWVsc2V7CiAgICAgICAgdmFyIHVtID0gdGhpcy5lbC5nZXRVcGRhdGVNYW5hZ2VyKCk7CiAgICAgICAgdW0uc2hvd0xvYWRJbmRpY2F0b3IgPSBmYWxzZTsgICAgICAgICB1bS5vbignYmVmb3JldXBkYXRlJywgdGhpcy5vbkJlZm9yZUxvYWQsIHRoaXMpOwogICAgICAgIHVtLm9uKCd1cGRhdGUnLCB0aGlzLm9uTG9hZCwgdGhpcyk7CiAgICAgICAgdW0ub24oJ2ZhaWx1cmUnLCB0aGlzLm9uTG9hZCwgdGhpcyk7CiAgICAgICAgdGhpcy5yZW1vdmVNYXNrID0gdHJ1ZTsKICAgIH0KfTsKCkV4dC5Mb2FkTWFzay5wcm90b3R5cGUgPSB7CiAgICAKICAgIAogICAgbXNnIDogJ0xvYWRpbmcuLi4nLAogICAgCiAgICBtc2dDbHMgOiAneC1tYXNrLWxvYWRpbmcnLAoKICAgIAogICAgZGlzYWJsZWQ6IGZhbHNlLAoKICAgIAogICAgZGlzYWJsZSA6IGZ1bmN0aW9uKCl7CiAgICAgICB0aGlzLmRpc2FibGVkID0gdHJ1ZTsKICAgIH0sCgogICAgCiAgICBlbmFibGUgOiBmdW5jdGlvbigpewogICAgICAgIHRoaXMuZGlzYWJsZWQgPSBmYWxzZTsKICAgIH0sCgogICAgICAgIG9uTG9hZCA6IGZ1bmN0aW9uKCl7CiAgICAgICAgdGhpcy5lbC51bm1hc2sodGhpcy5yZW1vdmVNYXNrKTsKICAgIH0sCgogICAgICAgIG9uQmVmb3JlTG9hZCA6IGZ1bmN0aW9uKCl7CiAgICAgICAgaWYoIXRoaXMuZGlzYWJsZWQpewogICAgICAgICAgICB0aGlzLmVsLm1hc2sodGhpcy5tc2csIHRoaXMubXNnQ2xzKTsKICAgICAgICB9CiAgICB9LAoKICAgICAgICBkZXN0cm95IDogZnVuY3Rpb24oKXsKICAgICAgICBpZih0aGlzLnN0b3JlKXsKICAgICAgICAgICAgdGhpcy5zdG9yZS51bignYmVmb3JlbG9hZCcsIHRoaXMub25CZWZvcmVMb2FkLCB0aGlzKTsKICAgICAgICAgICAgdGhpcy5zdG9yZS51bignbG9hZCcsIHRoaXMub25Mb2FkLCB0aGlzKTsKICAgICAgICAgICAgdGhpcy5zdG9yZS51bignbG9hZGV4Y2VwdGlvbicsIHRoaXMub25Mb2FkLCB0aGlzKTsKICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgdmFyIHVtID0gdGhpcy5lbC5nZXRVcGRhdGVNYW5hZ2VyKCk7CiAgICAgICAgICAgIHVtLnVuKCdiZWZvcmV1cGRhdGUnLCB0aGlzLm9uQmVmb3JlTG9hZCwgdGhpcyk7CiAgICAgICAgICAgIHVtLnVuKCd1cGRhdGUnLCB0aGlzLm9uTG9hZCwgdGhpcyk7CiAgICAgICAgICAgIHVtLnVuKCdmYWlsdXJlJywgdGhpcy5vbkxvYWQsIHRoaXMpOwogICAgICAgIH0KICAgIH0KfTsKRXh0LmRlYnVnID0gewogICAgaW5pdCA6IGZ1bmN0aW9uKCl7CiAgICAgICAgdmFyIENQID0gRXh0LkNvbnRlbnRQYW5lbDsKICAgICAgICB2YXIgYmQgPSBFeHQuZ2V0KGRvY3VtZW50LmJvZHkpOwoKICAgICAgICAgICAgICAgIHZhciBkbGcgPSBuZXcgRXh0LkxheW91dERpYWxvZygneC1kZWJ1Zy1icm93c2VyJywgewogICAgICAgICAgICBhdXRvQ3JlYXRlOnRydWUsCiAgICAgICAgICAgIHdpZHRoOjgwMCwKICAgICAgICAgICAgaGVpZ2h0OjQ1MCwKICAgICAgICAgICAgdGl0bGU6ICdFeHQgRGVidWcgQ29uc29sZSAmYW1wOyBJbnNwZWN0b3InLAogICAgICAgICAgICBwcm94eURyYWc6dHJ1ZSwKICAgICAgICAgICAgc2hhZG93OnRydWUsCiAgICAgICAgICAgIGNlbnRlcjp7YWx3YXlzU2hvd1RhYnM6dHJ1ZX0sCiAgICAgICAgICAgIGNvbnN0cmFpbnRvdmlld3BvcnQ6ZmFsc2UKICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBkbGcuZWwuc3dhbGxvd0V2ZW50KCdjbGljaycpOwoKICAgICAgICAgICAgICAgIHZhciBtYWluTGF5b3V0ID0gZGxnLmdldExheW91dCgpOwogICAgICAgIG1haW5MYXlvdXQuYmVnaW5VcGRhdGUoKTsKCiAgICAgICAgICAgICAgICB2YXIgY2xheW91dCA9IG1haW5MYXlvdXQuYWRkKCdjZW50ZXInLAogICAgICAgICAgICBuZXcgRXh0LmRlYnVnLklubmVyTGF5b3V0KCd4LWRlYnVnLWNvbnNvbGUnLCA0MDAsIHsKICAgICAgICAgICAgICAgIHRpdGxlOiAnRGVidWcgQ29uc29sZScKICAgICAgICAgICAgfQogICAgICAgICkpOwoKICAgICAgICB2YXIgaWxheW91dCA9IG1haW5MYXlvdXQuYWRkKCdjZW50ZXInLAogICAgICAgICAgICBuZXcgRXh0LmRlYnVnLklubmVyTGF5b3V0KCd4LWRlYnVnLWluc3BlY3RvcicsIDI1MCwgewogICAgICAgICAgICAgICAgdGl0bGU6ICdET00gSW5zcGVjdG9yJwogICAgICAgICAgICB9CiAgICAgICAgKSk7CgogICAgICAgIHZhciBzY3JpcHRQYW5lbCA9IGNsYXlvdXQuYWRkKCdlYXN0JywgbmV3IENQKHsKICAgICAgICAgICAgYXV0b0NyZWF0ZTp7CiAgICAgICAgICAgICAgICB0YWc6ICdkaXYnLCBjaGlsZHJlbjogWwogICAgICAgICAgICAgICAgICAgIHt0YWc6ICdkaXYnfSwKICAgICAgICAgICAgICAgICAgICB7dGFnOid0ZXh0YXJlYSd9CiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZpdENvbnRhaW5lcjp0cnVlLAogICAgICAgICAgICBmaXRUb0ZyYW1lOnRydWUsCiAgICAgICAgICAgIHRpdGxlOidTY3JpcHQgQ29uc29sZScsCiAgICAgICAgICAgIGF1dG9TY3JvbGw6IEV4dC5pc0dlY2tvLCAgICAgICAgICAgICBzZXRTaXplIDogZnVuY3Rpb24odywgaCl7CiAgICAgICAgICAgICAgICBFeHQuQ29udGVudFBhbmVsLnByb3RvdHlwZS5zZXRTaXplLmNhbGwodGhpcywgdywgaCk7CiAgICAgICAgICAgICAgICBpZihFeHQuaXNHZWNrbyAmJiBFeHQuaXNTdHJpY3QpewogICAgICAgICAgICAgICAgICAgIHZhciBzID0gdGhpcy5hZGp1c3RGb3JDb21wb25lbnRzKHcsIGgpOwogICAgICAgICAgICAgICAgICAgIHRoaXMucmVzaXplRWwuc2V0U2l6ZShzLndpZHRoLTIsIHMuaGVpZ2h0LTIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSkpOwogICAgICAgIHZhciBzZWwgPSBzY3JpcHRQYW5lbC5lbDsKICAgICAgICB2YXIgc2NyaXB0ID0gc2VsLmNoaWxkKCd0ZXh0YXJlYScpOwogICAgICAgIHNjcmlwdFBhbmVsLnJlc2l6ZUVsID0gc2NyaXB0OwogICAgICAgIHZhciBzY3RiID0gc2NyaXB0UGFuZWwudG9vbGJhciA9IG5ldyBFeHQuVG9vbGJhcihzZWwuY2hpbGQoJ2RpdicpKTsKICAgICAgICBzY3RiLmFkZCh7CiAgICAgICAgICAgIHRleHQ6ICdSdW4nLAogICAgICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgdmFyIHMgPSBzY3JpcHQuZG9tLnZhbHVlOwogICAgICAgICAgICAgICAgaWYodHJhcC5jaGVja2VkKXsKICAgICAgICAgICAgICAgICAgICB0cnl7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBydCA9IGV2YWwocyk7CiAgICAgICAgICAgICAgICAgICAgICAgIEV4dC5kZWJ1Zy5kdW1wKHJ0ID09PSB1bmRlZmluZWQ/ICcobm8gcmV0dXJuKScgOiBydCk7CiAgICAgICAgICAgICAgICAgICAgfWNhdGNoKGUpewogICAgICAgICAgICAgICAgICAgICAgICBFeHQuZGVidWcubG9nKGUubWVzc2FnZSB8fCBlLmRlc2NyaXB0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICB2YXIgcnQgPSBldmFsKHMpOwogICAgICAgICAgICAgICAgICAgIEV4dC5kZWJ1Zy5kdW1wKHJ0ID09PSB1bmRlZmluZWQ/ICcobm8gcmV0dXJuKScgOiBydCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LCB7CiAgICAgICAgICAgIHRleHQ6ICdDbGVhcicsCiAgICAgICAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICBzY3JpcHQuZG9tLnZhbHVlID0gJyc7CiAgICAgICAgICAgICAgICBzY3JpcHQuZG9tLmZvY3VzKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgdmFyIHRyYXAgPSBFeHQuRG9tSGVscGVyLmFwcGVuZChzY3RiLmVsLCB7dGFnOidpbnB1dCcsIHR5cGU6J2NoZWNrYm94JywgY2hlY2tlZDogJ2NoZWNrZWQnfSk7CiAgICAgICAgdHJhcC5jaGVja2VkID0gdHJ1ZTsKICAgICAgICBzY3RiLmFkZCgnLScsIHRyYXAsICdUcmFwIEVycm9ycycpOwoKCiAgICAgICAgdmFyIHN0eWxlc0dyaWQgPSBuZXcgRXh0LmdyaWQuUHJvcGVydHlHcmlkKGJkLmNyZWF0ZUNoaWxkKCksIHsKICAgICAgICAgICAgbmFtZVRleHQ6ICdTdHlsZScsCiAgICAgICAgICAgIGVuYWJsZUhkTWVudTogZmFsc2UsCiAgICAgICAgICAgIGVuYWJsZUNvbHVtblJlc2l6ZTogZmFsc2UKICAgICAgICB9KTsKCiAgICAgICAgdmFyIHN0eWxlUGFuZWwgPSBpbGF5b3V0LmFkZCgnZWFzdCcsIG5ldyBFeHQuR3JpZFBhbmVsKHN0eWxlc0dyaWQsCiAgICAgICAgICAgIHt0aXRsZTogJyhObyBlbGVtZW50IHNlbGVjdGVkKSd9KSk7CgogICAgICAgIHN0eWxlc0dyaWQucmVuZGVyKCk7CgogICAgICAgICAgICAgICAgc3R5bGVzR3JpZC5nZXRWaWV3KCkubWFpbkhkLnNldERpc3BsYXllZChmYWxzZSk7CgogICAgICAgIGNsYXlvdXQudGJhci5hZGQoewogICAgICAgICAgICB0ZXh0OiAnQ2xlYXInLAogICAgICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgRXh0LmRlYnVnLmNvbnNvbGUuanNvbkRhdGEgPSBbXTsKICAgICAgICAgICAgICAgIEV4dC5kZWJ1Zy5jb25zb2xlLnJlZnJlc2goKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICB2YXIgdHJlZUVsID0gaWxheW91dC5tYWluLmdldEVsKCk7CiAgICAgICAgICAgICAgICB2YXIgdGIgPSBpbGF5b3V0LnRiYXI7CgogICAgICAgIHZhciBpbnNwZWN0SWdub3JlLCBpbnNwZWN0aW5nOwoKICAgICAgICBmdW5jdGlvbiBpbnNwZWN0TGlzdGVuZXIoZSwgdCl7CiAgICAgICAgICAgIGlmKCFpbnNwZWN0SWdub3JlLmNvbnRhaW5zKGUuZ2V0UG9pbnQoKSkpewogICAgICAgICAgICAgICAgZmluZE5vZGUodCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHN0b3BJbnNwZWN0aW5nKGUsIHQpewogICAgICAgICAgICBpZighaW5zcGVjdElnbm9yZS5jb250YWlucyhlLmdldFBvaW50KCkpKXsKICAgICAgICAgICAgICAgIGluc3BlY3QudG9nZ2xlKGZhbHNlKTsKICAgICAgICAgICAgICAgIGlmKGZpbmROb2RlKHQpICE9PSBmYWxzZSl7CiAgICAgICAgICAgICAgICAgICAgZS5zdG9wRXZlbnQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gc3RvcEluc3BlY3RpbmdFc2MoZSwgdCl7CiAgICAgICAgICAgIGlmKGUuZ2V0S2V5KCkgPT0gZS5FU0MpewogICAgICAgICAgICAgICAgaW5zcGVjdC50b2dnbGUoZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2YXIgaW5zcGVjdCA9IHRiLmFkZEJ1dHRvbih7CiAgICAgICAgICAgIHRleHQ6ICdJbnNwZWN0JywKICAgICAgICAgICAgZW5hYmxlVG9nZ2xlOiB0cnVlLAogICAgICAgICAgICBwcmVzc2VkOmZhbHNlLAogICAgICAgICAgICB0b2dnbGVIYW5kbGVyOiBmdW5jdGlvbihuLCBwcmVzc2VkKXsKICAgICAgICAgICAgICAgIHZhciBkID0gRXh0LmdldChkb2N1bWVudCk7CiAgICAgICAgICAgICAgICBpZihwcmVzc2VkKXsKICAgICAgICAgICAgICAgICAgICBkLm9uKCdtb3VzZW92ZXInLCBpbnNwZWN0TGlzdGVuZXIsIHdpbmRvdywge2J1ZmZlcjo1MH0pOwogICAgICAgICAgICAgICAgICAgIGQub24oJ21vdXNlZG93bicsIHN0b3BJbnNwZWN0aW5nKTsKICAgICAgICAgICAgICAgICAgICBkLm9uKCdrZXlkb3duJywgc3RvcEluc3BlY3RpbmdFc2MpOwogICAgICAgICAgICAgICAgICAgIGluc3BlY3RJZ25vcmUgPSBkbGcuZWwuZ2V0UmVnaW9uKCk7CiAgICAgICAgICAgICAgICAgICAgaW5zcGVjdGluZyA9IHRydWU7CiAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICBkLnVuKCdtb3VzZW92ZXInLCBpbnNwZWN0TGlzdGVuZXIpOwogICAgICAgICAgICAgICAgICAgIGQudW4oJ21vdXNlZG93bicsIHN0b3BJbnNwZWN0aW5nKTsKICAgICAgICAgICAgICAgICAgICBkLm9uKCdrZXlkb3duJywgc3RvcEluc3BlY3RpbmdFc2MpOwogICAgICAgICAgICAgICAgICAgIGluc3BlY3RpbmcgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHRyZWUuZ2V0U2VsZWN0aW9uTW9kZWwoKS5nZXRTZWxlY3RlZE5vZGUoKTsKICAgICAgICAgICAgICAgICAgICBpZihuICYmIG4uaHRtbE5vZGUpewogICAgICAgICAgICAgICAgICAgICAgICBvbk5vZGVTZWxlY3QodHJlZSwgbiwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICB0Yi5hZGRTZXBhcmF0b3IoKTsKCiAgICAgICAgdmFyIGZyYW1lRWwgPSB0Yi5hZGRCdXR0b24oewogICAgICAgICAgICB0ZXh0OiAnSGlnaGxpZ2h0IFNlbGVjdGlvbicsCiAgICAgICAgICAgIGVuYWJsZVRvZ2dsZTogdHJ1ZSwKICAgICAgICAgICAgcHJlc3NlZDpmYWxzZSwKICAgICAgICAgICAgdG9nZ2xlSGFuZGxlcjogZnVuY3Rpb24obiwgcHJlc3NlZCl7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHRyZWUuZ2V0U2VsZWN0aW9uTW9kZWwoKS5nZXRTZWxlY3RlZE5vZGUoKTsKICAgICAgICAgICAgICAgIGlmKG4gJiYgbi5odG1sTm9kZSl7CiAgICAgICAgICAgICAgICAgICAgbltwcmVzc2VkID8gJ2ZyYW1lJyA6ICd1bmZyYW1lJ10oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICB0Yi5hZGRTZXBhcmF0b3IoKTsKCiAgICAgICAgdmFyIHJlbG9hZCA9IHRiLmFkZEJ1dHRvbih7CiAgICAgICAgICAgIHRleHQ6ICdSZWZyZXNoIENoaWxkcmVuJywKICAgICAgICAgICAgZGlzYWJsZWQ6dHJ1ZSwKICAgICAgICAgICAgaGFuZGxlcjogZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIHZhciBuID0gdHJlZS5nZXRTZWxlY3Rpb25Nb2RlbCgpLmdldFNlbGVjdGVkTm9kZSgpOwogICAgICAgICAgICAgICAgaWYobiAmJiBuLnJlbG9hZCl7CiAgICAgICAgICAgICAgICAgICAgbi5yZWxvYWQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICB0Yi5hZGQoICctJywgewogICAgICAgICAgICB0ZXh0OiAnQ29sbGFwc2UgQWxsJywKICAgICAgICAgICAgaGFuZGxlcjogZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIHRyZWUucm9vdC5jb2xsYXBzZSh0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIG1haW5MYXlvdXQuZW5kVXBkYXRlKCk7CgogICAgICAgIG1haW5MYXlvdXQuZ2V0UmVnaW9uKCdjZW50ZXInKS5zaG93UGFuZWwoMCk7CgogICAgICAgIHN0eWxlc0dyaWQub24oJ3Byb3BlcnR5Y2hhbmdlJywgZnVuY3Rpb24ocywgbmFtZSwgdmFsdWUpewogICAgICAgICAgICB2YXIgbm9kZSA9IHN0eWxlc0dyaWQudHJlZU5vZGU7CiAgICAgICAgICAgIGlmKHN0eWxlcyl7CiAgICAgICAgICAgICAgICBub2RlLmh0bWxOb2RlLnN0eWxlW25hbWVdID0gdmFsdWU7CiAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgbm9kZS5odG1sTm9kZVtuYW1lXSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5vZGUucmVmcmVzaCh0cnVlKTsKICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB2YXIgc3RiID0gbmV3IEV4dC5Ub29sYmFyKHN0eWxlc0dyaWQudmlldy5nZXRIZWFkZXJQYW5lbCh0cnVlKSk7CgogICAgICAgIHZhciBzd2FwID0gc3RiLmFkZEJ1dHRvbih7CiAgICAgICAgICAgIHRleHQ6ICdET00gQXR0cmlidXRlcycsCiAgICAgICAgICAgIG1lbnU6IHsKICAgICAgICAgICAgICAgIGl0ZW1zOiBbCiAgICAgICAgICAgICAgICAgICAgbmV3IEV4dC5tZW51LkNoZWNrSXRlbSh7aWQ6J2RvbScsIHRleHQ6J0RPTSBBdHRyaWJ1dGVzJywgY2hlY2tlZDogdHJ1ZSwgZ3JvdXA6J3hkYi1zdHlsZXMnfSksCiAgICAgICAgICAgICAgICAgICAgbmV3IEV4dC5tZW51LkNoZWNrSXRlbSh7aWQ6J3N0eWxlcycsIHRleHQ6J0NTUyBQcm9wZXJ0aWVzJywgZ3JvdXA6J3hkYi1zdHlsZXMnfSkKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICBzd2FwLm1lbnUub24oJ2NsaWNrJywgZnVuY3Rpb24oKXsKICAgICAgICAgICAgc3R5bGVzID0gc3dhcC5tZW51Lml0ZW1zLmdldCgnc3R5bGVzJykuY2hlY2tlZDsKICAgICAgICAgICAgc2hvd0FsbFtzdHlsZXM/ICdzaG93JyA6ICdoaWRlJ10oKTsKICAgICAgICAgICAgc3dhcC5zZXRUZXh0KHN0eWxlcyA/ICdDU1MgUHJvcGVydGllcycgOiAnRE9NIEF0dHJpYnV0ZXMnKTsKICAgICAgICAgICAgdmFyIG4gPSB0cmVlLmdldFNlbGVjdGlvbk1vZGVsKCkuZ2V0U2VsZWN0ZWROb2RlKCk7CiAgICAgICAgICAgIGlmKG4pewogICAgICAgICAgICAgICAgb25Ob2RlU2VsZWN0KHRyZWUsIG4pOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgCiAgICAgICAgdmFyIGFkZFN0eWxlID0gc3RiLmFkZEJ1dHRvbih7CiAgICAgICAgICAgIHRleHQ6ICdBZGQnLAogICAgICAgICAgICBkaXNhYmxlZDogdHJ1ZSwKICAgICAgICAgICAgaGFuZGxlcjogZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIEV4dC5NZXNzYWdlQm94LnByb21wdCgnQWRkIFByb3BlcnR5JywgJ1Byb3BlcnR5IE5hbWU6JywgZnVuY3Rpb24oYnRuLCB2KXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdG9yZSA9IHN0eWxlc0dyaWQuc3RvcmUuc3RvcmU7CiAgICAgICAgICAgICAgICAgICAgaWYoYnRuID09ICdvaycgJiYgdiAmJiAhc3RvcmUuZ2V0QnlJZCh2KSl7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gbmV3IEV4dC5ncmlkLlByb3BlcnR5UmVjb3JkKHtuYW1lOnYsIHZhbHVlOiAnJ30sIHYpOwogICAgICAgICAgICAgICAgICAgICAgICBzdG9yZS5hZGQocik7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlc0dyaWQuc3RhcnRFZGl0aW5nKHN0b3JlLmdldENvdW50KCktMSwgMSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgdmFyIHNob3dBbGwgPSBzdGIuYWRkQnV0dG9uKHsKICAgICAgICAgICAgdGV4dDogJ0NvbXB1dGVkIFN0eWxlcycsCiAgICAgICAgICAgIGhpZGRlbjogdHJ1ZSwKICAgICAgICAgICAgcHJlc3NlZDogZmFsc2UsCiAgICAgICAgICAgIGVuYWJsZVRvZ2dsZTogdHJ1ZSwKICAgICAgICAgICAgdG9nZ2xlSGFuZGxlcjogZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIHZhciBuID0gdHJlZS5nZXRTZWxlY3Rpb25Nb2RlbCgpLmdldFNlbGVjdGVkTm9kZSgpOwogICAgICAgICAgICAgICAgaWYobil7CiAgICAgICAgICAgICAgICAgICAgb25Ob2RlU2VsZWN0KHRyZWUsIG4pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgdmFyIHN0eWxlcyA9IGZhbHNlLCBobm9kZTsKICAgICAgICB2YXIgbm9uU3BhY2UgPSAvXlxzKiQvOwogICAgICAgIHZhciBodG1sID0gRXh0LnV0aWwuRm9ybWF0Lmh0bWxFbmNvZGU7CiAgICAgICAgdmFyIGVsbGlwc2lzID0gRXh0LnV0aWwuRm9ybWF0LmVsbGlwc2lzOwogICAgICAgIHZhciBzdHlsZVJlID0gL1xzPyhbYS16XC1dKilcOihbXjtdKikoPzpbO1xzXG5ccl0qKS9naTsKCiAgICAgICAgZnVuY3Rpb24gZmluZE5vZGUobil7CiAgICAgICAgICAgIGlmKCFuIHx8IG4ubm9kZVR5cGUgIT0gMSB8fCBuID09IGRvY3VtZW50LmJvZHkgfHwgbiA9PSBkb2N1bWVudCl7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHBuID0gW25dLCBwID0gbjsKICAgICAgICAgICAgd2hpbGUoKHAgPSBwLnBhcmVudE5vZGUpICYmIHAubm9kZVR5cGUgPT0gMSAmJiBwLnRhZ05hbWUudG9VcHBlckNhc2UoKSAhPSAnSFRNTCcpewogICAgICAgICAgICAgICAgcG4udW5zaGlmdChwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgY24gPSBobm9kZTsKICAgICAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gcG4ubGVuZ3RoOyBpIDwgbGVuOyBpKyspewogICAgICAgICAgICAgICAgY24uZXhwYW5kKCk7CiAgICAgICAgICAgICAgICBjbiA9IGNuLmZpbmRDaGlsZCgnaHRtbE5vZGUnLCBwbltpXSk7CiAgICAgICAgICAgICAgICBpZighY24peyAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjbi5zZWxlY3QoKTsKICAgICAgICAgICAgdmFyIGEgPSBjbi51aS5hbmNob3I7CiAgICAgICAgICAgIHRyZWVFbC5kb20uc2Nyb2xsVG9wID0gTWF0aC5tYXgoMCAsYS5vZmZzZXRUb3AtMTApOwogICAgICAgICAgICAgICAgICAgICAgICBjbi5oaWdobGlnaHQoKTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBub2RlVGl0bGUobil7CiAgICAgICAgICAgIHZhciBzID0gbi50YWdOYW1lOwogICAgICAgICAgICBpZihuLmlkKXsKICAgICAgICAgICAgICAgIHMgKz0gJyMnK24uaWQ7CiAgICAgICAgICAgIH1lbHNlIGlmKG4uY2xhc3NOYW1lKXsKICAgICAgICAgICAgICAgIHMgKz0gJy4nK24uY2xhc3NOYW1lOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gb25Ob2RlU2VsZWN0KHQsIG4sIGxhc3QpewogICAgICAgICAgICBpZihsYXN0ICYmIGxhc3QudW5mcmFtZSl7CiAgICAgICAgICAgICAgICBsYXN0LnVuZnJhbWUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcHJvcHMgPSB7fTsKICAgICAgICAgICAgaWYobiAmJiBuLmh0bWxOb2RlKXsKICAgICAgICAgICAgICAgIGlmKGZyYW1lRWwucHJlc3NlZCl7CiAgICAgICAgICAgICAgICAgICAgbi5mcmFtZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYoaW5zcGVjdGluZyl7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYWRkU3R5bGUuZW5hYmxlKCk7CiAgICAgICAgICAgICAgICByZWxvYWQuc2V0RGlzYWJsZWQobi5sZWFmKTsKICAgICAgICAgICAgICAgIHZhciBkb20gPSBuLmh0bWxOb2RlOwogICAgICAgICAgICAgICAgc3R5bGVQYW5lbC5zZXRUaXRsZShub2RlVGl0bGUoZG9tKSk7CiAgICAgICAgICAgICAgICBpZihzdHlsZXMgJiYgIXNob3dBbGwucHJlc3NlZCl7CiAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBkb20uc3R5bGUgPyBkb20uc3R5bGUuY3NzVGV4dCA6ICcnOwogICAgICAgICAgICAgICAgICAgIGlmKHMpewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbTsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChtID0gc3R5bGVSZS5leGVjKHMpKSAhPSBudWxsKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzW21bMV0udG9Mb3dlckNhc2UoKV0gPSBtWzJdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfWVsc2UgaWYoc3R5bGVzKXsKICAgICAgICAgICAgICAgICAgICB2YXIgY2wgPSBFeHQuZGVidWcuY3NzTGlzdDsKICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IGRvbS5zdHlsZSwgZmx5ID0gRXh0LmZseShkb20pOwogICAgICAgICAgICAgICAgICAgIGlmKHMpewogICAgICAgICAgICAgICAgICAgICAgICBmb3IodmFyIGkgPSAwLCBsZW4gPSBjbC5sZW5ndGg7IGk8bGVuOyBpKyspewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0ID0gY2xbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdiA9IHNbc3RdIHx8IGZseS5nZXRTdHlsZShzdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih2ICE9IHVuZGVmaW5lZCAmJiB2ICE9PSBudWxsICYmIHYgIT09ICcnKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wc1tzdF0gPSB2OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgZm9yKHZhciBhIGluIGRvbSl7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2ID0gZG9tW2FdOwogICAgICAgICAgICAgICAgICAgICAgICBpZigoaXNOYU4oYSsxMCkpICYmIHYgIT0gdW5kZWZpbmVkICYmIHYgIT09IG51bGwgJiYgdiAhPT0gJycgJiYgIShFeHQuaXNHZWNrbyAmJiBhWzBdID09IGFbMF0udG9VcHBlckNhc2UoKSkpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHNbYV0gPSB2OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgIGlmKGluc3BlY3RpbmcpewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGFkZFN0eWxlLmRpc2FibGUoKTsKICAgICAgICAgICAgICAgIHJlbG9hZC5kaXNhYmxlZCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0eWxlc0dyaWQuc2V0U291cmNlKHByb3BzKTsKICAgICAgICAgICAgc3R5bGVzR3JpZC50cmVlTm9kZSA9IG47CiAgICAgICAgICAgIHN0eWxlc0dyaWQudmlldy5maXRDb2x1bW5zKCk7CiAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpbHRlcklkcyA9ICdeKD86JzsKICAgICAgICB2YXIgZWRzID0gc3R5bGVzR3JpZC5jb2xNb2RlbC5lZGl0b3JzOwogICAgICAgIGZvcih2YXIgZWRUeXBlIGluIGVkcyl7CiAgICAgICAgICAgIGZpbHRlcklkcyArPSBlZHNbZWRUeXBlXS5pZCArJ3wnOwogICAgICAgIH0KICAgICAgICBFeHQuZWFjaChbZGxnLnNoaW0/IGRsZy5zaGltLmlkIDogJ25vc2hpbScsIGRsZy5wcm94eURyYWcuaWRdLCBmdW5jdGlvbihpZCl7CiAgICAgICAgICAgICBmaWx0ZXJJZHMgKz0gaWQgKyd8JzsKICAgICAgICB9KTsKICAgICAgICBmaWx0ZXJJZHMgKz0gZGxnLmVsLmlkOwogICAgICAgIGZpbHRlcklkcyArPSAnKSQnOwogICAgICAgIHZhciBmaWx0ZXJSZSA9IG5ldyBSZWdFeHAoZmlsdGVySWRzKTsKCiAgICAgICAgdmFyIGxvYWRlciA9IG5ldyBFeHQudHJlZS5UcmVlTG9hZGVyKCk7CiAgICAgICAgbG9hZGVyLmxvYWQgPSBmdW5jdGlvbihuLCBjYil7CiAgICAgICAgICAgIHZhciBpc0JvZHkgPSBuLmh0bWxOb2RlID09IGJkLmRvbTsKICAgICAgICAgICAgdmFyIGNuID0gbi5odG1sTm9kZS5jaGlsZE5vZGVzOwogICAgICAgICAgICBmb3IodmFyIGkgPSAwLCBjOyBjID0gY25baV07IGkrKyl7CiAgICAgICAgICAgICAgICBpZihpc0JvZHkgJiYgZmlsdGVyUmUudGVzdChjLmlkKSl7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZihjLm5vZGVUeXBlID09IDEpewogICAgICAgICAgICAgICAgICAgIG4uYXBwZW5kQ2hpbGQobmV3IEV4dC5kZWJ1Zy5IdG1sTm9kZShjKSk7CiAgICAgICAgICAgICAgICB9ZWxzZSBpZihjLm5vZGVUeXBlID09IDMgJiYgIW5vblNwYWNlLnRlc3QoYy5ub2RlVmFsdWUpKXsKICAgICAgICAgICAgICAgICAgICBuLmFwcGVuZENoaWxkKG5ldyBFeHQudHJlZS5UcmVlTm9kZSh7CiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6JzxlbT4nICsgZWxsaXBzaXMoaHRtbChTdHJpbmcoYy5ub2RlVmFsdWUpKSwgMzUpICsgJzwvZW0+JywKICAgICAgICAgICAgICAgICAgICAgICAgY2xzOiAneC10cmVlLW5vaWNvbicKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2IoKTsKICAgICAgICB9OwoKICAgICAgICB2YXIgdHJlZSA9IG5ldyBFeHQudHJlZS5UcmVlUGFuZWwodHJlZUVsLCB7CiAgICAgICAgICAgIGVuYWJsZUREOmZhbHNlICwKICAgICAgICAgICAgbG9hZGVyOiBsb2FkZXIsCiAgICAgICAgICAgIGxpbmVzOmZhbHNlLAogICAgICAgICAgICByb290VmlzaWJsZTpmYWxzZSwKICAgICAgICAgICAgYW5pbWF0ZTpmYWxzZSwKICAgICAgICAgICAgaGxDb2xvcjonZmZmZjljJwogICAgICAgIH0pOwogICAgICAgIHRyZWUuZ2V0U2VsZWN0aW9uTW9kZWwoKS5vbignc2VsZWN0aW9uY2hhbmdlJywgb25Ob2RlU2VsZWN0LCBudWxsLCB7YnVmZmVyOjI1MH0pOwoKICAgICAgICB2YXIgcm9vdCA9IHRyZWUuc2V0Um9vdE5vZGUobmV3IEV4dC50cmVlLlRyZWVOb2RlKCdFeHQnKSk7CgogICAgICAgIGhub2RlID0gcm9vdC5hcHBlbmRDaGlsZChuZXcgRXh0LmRlYnVnLkh0bWxOb2RlKAogICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2h0bWwnKVswXQogICAgICAgICkpOwoKICAgICAgICB0cmVlLnJlbmRlcigpOwoKICAgICAgICBFeHQuZGVidWcuY29uc29sZSA9IG5ldyBFeHQuSnNvblZpZXcoY2xheW91dC5tYWluLmdldEVsKCksCiAgICAgICAgICAgICAgICAnPHByZT48eG1wPj4ge21zZ308L3htcD48L3ByZT4nKTsKICAgICAgICBFeHQuZGVidWcuY29uc29sZS5qc29uRGF0YSA9IFtdOwoKICAgICAgICBFeHQuZGVidWcuZGlhbG9nID0gZGxnOwogICAgfSwKCiAgICBzaG93IDogZnVuY3Rpb24oKXsKICAgICAgICB2YXIgZCA9IEV4dC5kZWJ1ZzsKICAgICAgICBpZighZC5kaWFsb2cpewogICAgICAgICAgICBkLmluaXQoKTsKICAgICAgICB9CiAgICAgICAgaWYoIWQuZGlhbG9nLmlzVmlzaWJsZSgpKXsKICAgICAgICAgICAgZC5kaWFsb2cuc2hvdygpOwogICAgICAgIH0KICAgIH0sCgogICAgaGlkZSA6IGZ1bmN0aW9uKCl7CiAgICAgICAgaWYoRXh0LmRlYnVnLmRpYWxvZyl7CiAgICAgICAgICAgIEV4dC5kZWJ1Zy5kaWFsb2cuaGlkZSgpOwogICAgICAgIH0KICAgIH0sCgogICAgCiAgICBsb2cgOiBmdW5jdGlvbihhcmcxLCBhcmcyLCBldGMpewogICAgICAgRXh0LmRlYnVnLnNob3coKTsKICAgICAgICB2YXIgbSA9ICIiOwogICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKyl7CiAgICAgICAgICAgIG0gKz0gKGkgPT0gMCA/ICIiIDogIiwgIikgKyBhcmd1bWVudHNbaV07CiAgICAgICAgfQogICAgICAgIHZhciBjbiA9IEV4dC5kZWJ1Zy5jb25zb2xlOwogICAgICAgIGNuLmpzb25EYXRhLnVuc2hpZnQoe21zZzogbX0pOwogICAgICAgIGNuLnJlZnJlc2goKTsKICAgIH0sCgogICAgCiAgICBsb2dmIDogZnVuY3Rpb24oZm9ybWF0LCBhcmcxLCBhcmcyLCBldGMpewogICAgICAgIEV4dC5kZWJ1Zy5sb2coU3RyaW5nLmZvcm1hdC5hcHBseShTdHJpbmcsIGFyZ3VtZW50cykpOwogICAgfSwKCiAgICAKICAgIGR1bXAgOiBmdW5jdGlvbihvKXsKICAgICAgICBpZih0eXBlb2YgbyA9PSAnc3RyaW5nJyB8fCB0eXBlb2YgbyA9PSAnbnVtYmVyJyB8fCB0eXBlb2YgbyA9PSAndW5kZWZpbmVkJyB8fCBvIGluc3RhbmNlb2YgRGF0ZSl7CiAgICAgICAgICAgIEV4dC5kZWJ1Zy5sb2cobyk7CiAgICAgICAgfWVsc2UgaWYoIW8pewogICAgICAgICAgICBFeHQuZGVidWcubG9nKCJudWxsIik7CiAgICAgICAgfWVsc2UgaWYodHlwZW9mIG8gIT0gIm9iamVjdCIpewogICAgICAgICAgICBFeHQuZGVidWcubG9nKCdVbmtub3duIHJldHVybiB0eXBlJyk7CiAgICAgICAgfWVsc2UgaWYobyBpbnN0YW5jZW9mIEFycmF5KXsKICAgICAgICAgICAgRXh0LmRlYnVnLmxvZygnWycrby5qb2luKCcsJykrJ10nKTsKICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgdmFyIGIgPSBbIntcbiJdOwogICAgICAgICAgICBmb3IodmFyIGtleSBpbiBvKXsKICAgICAgICAgICAgICAgIHZhciB0byA9IHR5cGVvZiBvW2tleV07CiAgICAgICAgICAgICAgICBpZih0byAhPSAiZnVuY3Rpb24iICYmIHRvICE9ICJvYmplY3QiKXsKICAgICAgICAgICAgICAgICAgICBiLnB1c2goU3RyaW5nLmZvcm1hdCgiICB7MH06IHsxfSxcbiIsIGtleSwgb1trZXldKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHMgPSBiLmpvaW4oIiIpOwogICAgICAgICAgICBpZihzLmxlbmd0aCA+IDMpewogICAgICAgICAgICAgICAgcyA9IHMuc3Vic3RyKDAsIHMubGVuZ3RoLTIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIEV4dC5kZWJ1Zy5sb2cocyArICJcbn0iKTsKICAgICAgICB9CiAgICB9LAoKICAgIF90aW1lcnMgOiB7fSwKICAgIAogICAgdGltZSA6IGZ1bmN0aW9uKG5hbWUpewogICAgICAgIG5hbWUgPSBuYW1lIHx8ICJkZWYiOwogICAgICAgIEV4dC5kZWJ1Zy5fdGltZXJzW25hbWVdID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICB9LAoKICAgIAogICAgdGltZUVuZCA6IGZ1bmN0aW9uKG5hbWUsIHByaW50UmVzdWx0cyl7CiAgICAgICAgdmFyIHQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKICAgICAgICBuYW1lID0gbmFtZSB8fCAiZGVmIjsKICAgICAgICB2YXIgdiA9IFN0cmluZy5mb3JtYXQoInswfSBtcyIsIHQtRXh0LmRlYnVnLl90aW1lcnNbbmFtZV0pOwogICAgICAgIEV4dC5kZWJ1Zy5fdGltZXJzW25hbWVdID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICAgICAgaWYocHJpbnRSZXN1bHRzICE9PSBmYWxzZSl7CiAgICAgICAgICAgIEV4dC5kZWJ1Zy5sb2coJ1RpbWVyICcgKyAobmFtZSA9PSAiZGVmIiA/IHYgOiBuYW1lICsgIjogIiArIHYpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHY7CiAgICB9Cn07CgpFeHQuZGVidWcuSHRtbE5vZGUgPSBmdW5jdGlvbigpewogICAgdmFyIGh0bWwgPSBFeHQudXRpbC5Gb3JtYXQuaHRtbEVuY29kZTsKICAgIHZhciBlbGxpcHNpcyA9IEV4dC51dGlsLkZvcm1hdC5lbGxpcHNpczsKICAgIHZhciBub25TcGFjZSA9IC9eXHMqJC87CgogICAgdmFyIGF0dHJzID0gWwogICAgICAgIHtuOiAnaWQnLCB2OiAnaWQnfSwKICAgICAgICB7bjogJ2NsYXNzTmFtZScsIHY6ICdjbGFzcyd9LAogICAgICAgIHtuOiAnbmFtZScsIHY6ICduYW1lJ30sCiAgICAgICAge246ICd0eXBlJywgdjogJ3R5cGUnfSwKICAgICAgICB7bjogJ3NyYycsIHY6ICdzcmMnfSwKICAgICAgICB7bjogJ2hyZWYnLCB2OiAnaHJlZid9CiAgICBdOwoKICAgIGZ1bmN0aW9uIGhhc0NoaWxkKG4pewogICAgICAgIGZvcih2YXIgaSA9IDAsIGM7IGMgPSBuLmNoaWxkTm9kZXNbaV07IGkrKyl7CiAgICAgICAgICAgIGlmKGMubm9kZVR5cGUgPT0gMSl7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgZnVuY3Rpb24gcmVuZGVyTm9kZShuLCBsZWFmKXsKICAgICAgICB2YXIgdGFnID0gbi50YWdOYW1lLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgdmFyIHMgPSAnJmx0OycgKyB0YWc7CiAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gYXR0cnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspewogICAgICAgICAgICB2YXIgYSA9IGF0dHJzW2ldOwogICAgICAgICAgICB2YXIgdiA9IG5bYS5uXTsKICAgICAgICAgICAgaWYodiAmJiAhbm9uU3BhY2UudGVzdCh2KSl7CiAgICAgICAgICAgICAgICBzICs9ICcgJyArIGEudiArICc9JnF1b3Q7PGk+JyArIGh0bWwodikgKyc8L2k+JnF1b3Q7JzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YXIgc3R5bGUgPSBuLnN0eWxlID8gbi5zdHlsZS5jc3NUZXh0IDogJyc7CiAgICAgICAgaWYoc3R5bGUpewogICAgICAgICAgICBzICs9ICcgc3R5bGU9JnF1b3Q7PGk+JyArIGh0bWwoc3R5bGUudG9Mb3dlckNhc2UoKSkgKyc8L2k+JnF1b3Q7JzsKICAgICAgICB9CiAgICAgICAgaWYobGVhZiAmJiBuLmNoaWxkTm9kZXMubGVuZ3RoID4gMCl7CiAgICAgICAgICAgIHMrPScmZ3Q7PGVtPicgKyBlbGxpcHNpcyhodG1sKFN0cmluZyhuLmlubmVySFRNTCkpLCAzNSkgKyAnPC9lbT4mbHQ7LycrdGFnKycmZ3Q7JzsKICAgICAgICB9ZWxzZSBpZihsZWFmKXsKICAgICAgICAgICAgcyArPSAnIC8mZ3Q7JzsKICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgcyArPSAnJmd0Oyc7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzOwogICAgfQoKICAgIHZhciBIdG1sTm9kZSA9IGZ1bmN0aW9uKG4pewogICAgICAgIHZhciBsZWFmID0gIWhhc0NoaWxkKG4pOwogICAgICAgIHRoaXMuaHRtbE5vZGUgPSBuOwogICAgICAgIHRoaXMudGFnTmFtZSA9IG4udGFnTmFtZS50b0xvd2VyQ2FzZSgpOwogICAgICAgIHZhciBhdHRyID0gewogICAgICAgICAgICB0ZXh0IDogcmVuZGVyTm9kZShuLCBsZWFmKSwKICAgICAgICAgICAgbGVhZiA6IGxlYWYsCiAgICAgICAgICAgIGNsczogJ3gtdHJlZS1ub2ljb24nCiAgICAgICAgfTsKICAgICAgICBIdG1sTm9kZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgYXR0cik7CiAgICAgICAgdGhpcy5hdHRyaWJ1dGVzLmh0bWxOb2RlID0gbjsgICAgICAgICBpZighbGVhZil7CiAgICAgICAgICAgIHRoaXMub24oJ2V4cGFuZCcsIHRoaXMub25FeHBhbmQsICB0aGlzKTsKICAgICAgICAgICAgdGhpcy5vbignY29sbGFwc2UnLCB0aGlzLm9uQ29sbGFwc2UsICB0aGlzKTsKICAgICAgICB9CiAgICB9OwoKCiAgICBFeHQuZXh0ZW5kKEh0bWxOb2RlLCBFeHQudHJlZS5Bc3luY1RyZWVOb2RlLCB7CiAgICAgICAgY2xzOiAneC10cmVlLW5vaWNvbicsCiAgICAgICAgcHJldmVudEhTY3JvbGw6IHRydWUsCiAgICAgICAgcmVmcmVzaCA6IGZ1bmN0aW9uKGhpZ2hsaWdodCl7CiAgICAgICAgICAgIHZhciBsZWFmID0gIWhhc0NoaWxkKHRoaXMuaHRtbE5vZGUpOwogICAgICAgICAgICB0aGlzLnNldFRleHQocmVuZGVyTm9kZSh0aGlzLmh0bWxOb2RlLCBsZWFmKSk7CiAgICAgICAgICAgIGlmKGhpZ2hsaWdodCl7CiAgICAgICAgICAgICAgICBFeHQuZmx5KHRoaXMudWkudGV4dE5vZGUpLmhpZ2hsaWdodCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgb25FeHBhbmQgOiBmdW5jdGlvbigpewogICAgICAgICAgICBpZighdGhpcy5jbG9zZU5vZGUgJiYgdGhpcy5wYXJlbnROb2RlKXsKICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VOb2RlID0gdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShuZXcgRXh0LnRyZWUuVHJlZU5vZGUoewogICAgICAgICAgICAgICAgICAgIHRleHQ6JyZsdDsvJyArIHRoaXMudGFnTmFtZSArICcmZ3Q7JywKICAgICAgICAgICAgICAgICAgICBjbHM6ICd4LXRyZWUtbm9pY29uJwogICAgICAgICAgICAgICAgfSksIHRoaXMubmV4dFNpYmxpbmcpOwogICAgICAgICAgICB9ZWxzZSBpZih0aGlzLmNsb3NlTm9kZSl7CiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlTm9kZS51aS5zaG93KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBvbkNvbGxhcHNlIDogZnVuY3Rpb24oKXsKICAgICAgICAgICAgaWYodGhpcy5jbG9zZU5vZGUpewogICAgICAgICAgICAgICAgdGhpcy5jbG9zZU5vZGUudWkuaGlkZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcmVuZGVyIDogZnVuY3Rpb24oYnVsa1JlbmRlcil7CiAgICAgICAgICAgIEh0bWxOb2RlLnN1cGVyY2xhc3MucmVuZGVyLmNhbGwodGhpcywgYnVsa1JlbmRlcik7CiAgICAgICAgfSwKCiAgICAgICAgaGlnaGxpZ2h0Tm9kZSA6IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgfSwKCiAgICAgICAgaGlnaGxpZ2h0IDogZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICBmcmFtZSA6IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIHRoaXMuaHRtbE5vZGUuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCAjMDAwMGZmJzsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICB1bmZyYW1lIDogZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5odG1sTm9kZS5zdHlsZS5ib3JkZXIgPSAnJzsKICAgICAgICB9CiAgICB9KTsKCiAgICByZXR1cm4gSHRtbE5vZGU7Cn0oKTsKCkV4dC5kZWJ1Zy5Jbm5lckxheW91dCA9IGZ1bmN0aW9uKGlkLCB3LCBjZmcpewogICAgICAgIHZhciBlbCA9IEV4dC5Eb21IZWxwZXIuYXBwZW5kKGRvY3VtZW50LmJvZHksIHtpZDppZH0pOwogICAgdmFyIGxheW91dCA9IG5ldyBFeHQuQm9yZGVyTGF5b3V0KGVsLCB7CiAgICAgICAgbm9ydGg6IHsKICAgICAgICAgICAgaW5pdGlhbFNpemU6MjgKICAgICAgICB9LAogICAgICAgIGNlbnRlcjogewogICAgICAgICAgICB0aXRsZWJhcjogZmFsc2UKICAgICAgICB9LAogICAgICAgIGVhc3Q6IHsKICAgICAgICAgICAgc3BsaXQ6dHJ1ZSwKICAgICAgICAgICAgaW5pdGlhbFNpemU6dywKICAgICAgICAgICAgdGl0bGViYXI6dHJ1ZQogICAgICAgIH0KICAgIH0pOwogICAgRXh0LmRlYnVnLklubmVyTGF5b3V0LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBsYXlvdXQsIGNmZyk7CgogICAgbGF5b3V0LmJlZ2luVXBkYXRlKCk7CgogICAgdmFyIHRiUGFuZWwgPSBsYXlvdXQuYWRkKCdub3J0aCcsIG5ldyBFeHQuQ29udGVudFBhbmVsKHsKICAgICAgICAgICAgYXV0b0NyZWF0ZTp0cnVlLCBmaXRUb0ZyYW1lOnRydWV9KSk7CgogICAgdGhpcy5tYWluID0gbGF5b3V0LmFkZCgnY2VudGVyJywgbmV3IEV4dC5Db250ZW50UGFuZWwoewogICAgICAgICAgICBhdXRvQ3JlYXRlOnRydWUsIGZpdFRvRnJhbWU6dHJ1ZSwgYXV0b1Njcm9sbDp0cnVlfSkpOwoKICAgIHRoaXMudGJhciA9IG5ldyBFeHQuVG9vbGJhcih0YlBhbmVsLmVsKTsKCiAgICB2YXIgbXRiRWwgPSB0YlBhbmVsLnJlc2l6ZUVsID0gdGJQYW5lbC5lbC5jaGlsZCgnZGl2LngtdG9vbGJhcicpOwogICAgbXRiRWwuc2V0U3R5bGUoJ2JvcmRlci1ib3R0b20nLCAnMCBub25lJyk7CiAgICBsYXlvdXQuZW5kVXBkYXRlKHRydWUpOwp9OwoKRXh0LmV4dGVuZChFeHQuZGVidWcuSW5uZXJMYXlvdXQsIEV4dC5OZXN0ZWRMYXlvdXRQYW5lbCwgewogICAgYWRkIDogZnVuY3Rpb24oKXsKICAgICAgICByZXR1cm4gdGhpcy5sYXlvdXQuYWRkLmFwcGx5KHRoaXMubGF5b3V0LCBhcmd1bWVudHMpOwogICAgfQp9KTsKCkV4dC5kZWJ1Zy5jc3NMaXN0ID0gWydiYWNrZ3JvdW5kLWNvbG9yJywnYm9yZGVyJywnYm9yZGVyLWNvbG9yJywnYm9yZGVyLXNwYWNpbmcnLAonYm9yZGVyLXN0eWxlJywnYm9yZGVyLXRvcCcsJ2JvcmRlci1yaWdodCcsJ2JvcmRlci1ib3R0b20nLCdib3JkZXItbGVmdCcsJ2JvcmRlci10b3AtY29sb3InLAonYm9yZGVyLXJpZ2h0LWNvbG9yJywnYm9yZGVyLWJvdHRvbS1jb2xvcicsJ2JvcmRlci1sZWZ0LWNvbG9yJywnYm9yZGVyLXRvcC13aWR0aCcsJ2JvcmRlci1yaWdodC13aWR0aCcsCidib3JkZXItYm90dG9tLXdpZHRoJywnYm9yZGVyLWxlZnQtd2lkdGgnLCdib3JkZXItd2lkdGgnLCdib3R0b20nLCdjb2xvcicsJ2ZvbnQtc2l6ZScsJ2ZvbnQtc2l6ZS1hZGp1c3QnLAonZm9udC1zdHJldGNoJywnZm9udC1zdHlsZScsJ2hlaWdodCcsJ2xlZnQnLCdsZXR0ZXItc3BhY2luZycsJ2xpbmUtaGVpZ2h0JywnbWFyZ2luJywnbWFyZ2luLXRvcCcsCidtYXJnaW4tcmlnaHQnLCdtYXJnaW4tYm90dG9tJywnbWFyZ2luLWxlZnQnLCdtYXJrZXItb2Zmc2V0JywnbWF4LWhlaWdodCcsJ21heC13aWR0aCcsJ21pbi1oZWlnaHQnLAonbWluLXdpZHRoJywnb3JwaGFucycsJ291dGxpbmUnLCdvdXRsaW5lLWNvbG9yJywnb3V0bGluZS1zdHlsZScsJ291dGxpbmUtd2lkdGgnLCdvdmVyZmxvdycsJ3BhZGRpbmcnLAoncGFkZGluZy10b3AnLCdwYWRkaW5nLXJpZ2h0JywncGFkZGluZy1ib3R0b20nLCdwYWRkaW5nLWxlZnQnLCdxdW90ZXMnLCdyaWdodCcsJ3NpemUnLCd0ZXh0LWluZGVudCcsCid0b3AnLCd3aWR0aCcsJ3dvcmQtc3BhY2luZycsJ3otaW5kZXgnLCdvcGFjaXR5Jywnb3V0bGluZS1vZmZzZXQnXTsKCmlmKHR5cGVvZiBjb25zb2xlID09ICd1bmRlZmluZWQnKXsKICAgIGNvbnNvbGUgPSBFeHQuZGVidWc7Cn0KCgpFeHQuRXZlbnRNYW5hZ2VyLm9uKHdpbmRvdywgJ2xvYWQnLCBmdW5jdGlvbigpewogICAgRXh0LmdldChkb2N1bWVudCkub24oJ2tleWRvd24nLCBmdW5jdGlvbihlKXsKICAgICAgICBpZihlLmN0cmxLZXkgJiYgZS5zaGlmdEtleSAmJiBlLmdldEtleSgpID09IGUuSE9NRSl7CiAgICAgICAgICAgIEV4dC5kZWJ1Zy5zaG93KCk7CiAgICAgICAgfQogICAgfSk7Cn0pOwoKRXh0LnByaW50ID0gRXh0LmxvZyA9IEV4dC5kZWJ1Zy5sb2c7CkV4dC5wcmludGYgPSBFeHQubG9nZiA9IEV4dC5kZWJ1Zy5sb2dmOwpFeHQuZHVtcCA9IEV4dC5kZWJ1Zy5kdW1wOwpFeHQudGltZXIgPSBFeHQuZGVidWcudGltZTsKRXh0LnRpbWVyRW5kID0gRXh0LmRlYnVnLnRpbWVFbmQ7Cgo=]]></data>
	</file>
	<file>
	  <filename>/test/prototype.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogIFByb3RvdHlwZSBKYXZhU2NyaXB0IGZyYW1ld29yaywgdmVyc2lvbiAxLjUuMQ0KICogIChjKSAyMDA1LTIwMDcgU2FtIFN0ZXBoZW5zb24NCiAqDQogKiAgUHJvdG90eXBlIGlzIGZyZWVseSBkaXN0cmlidXRhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiBhbiBNSVQtc3R5bGUgbGljZW5zZS4NCiAqICBGb3IgZGV0YWlscywgc2VlIHRoZSBQcm90b3R5cGUgd2ViIHNpdGU6IGh0dHA6Ly93d3cucHJvdG90eXBlanMub3JnLw0KICoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQp2YXIgUHJvdG90eXBlID0gew0KICBWZXJzaW9uOiAnMS41LjEnLA0KDQogIEJyb3dzZXI6IHsNCiAgICBJRTogICAgICEhKHdpbmRvdy5hdHRhY2hFdmVudCAmJiAhd2luZG93Lm9wZXJhKSwNCiAgICBPcGVyYTogICEhd2luZG93Lm9wZXJhLA0KICAgIFdlYktpdDogbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdBcHBsZVdlYktpdC8nKSA+IC0xLA0KICAgIEdlY2tvOiAgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdHZWNrbycpID4gLTEgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdLSFRNTCcpID09IC0xDQogIH0sDQoNCiAgQnJvd3NlckZlYXR1cmVzOiB7DQogICAgWFBhdGg6ICEhZG9jdW1lbnQuZXZhbHVhdGUsDQogICAgRWxlbWVudEV4dGVuc2lvbnM6ICEhd2luZG93LkhUTUxFbGVtZW50LA0KICAgIFNwZWNpZmljRWxlbWVudEV4dGVuc2lvbnM6DQogICAgICAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykuX19wcm90b19fICE9PQ0KICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Zvcm0nKS5fX3Byb3RvX18pDQogIH0sDQoNCiAgU2NyaXB0RnJhZ21lbnQ6ICc8c2NyaXB0W14+XSo+KFtcdTAwMDEtXHVGRkZGXSo/KTwvc2NyaXB0PicsDQogIEpTT05GaWx0ZXI6IC9eXC9cKi1zZWN1cmUtXHMqKC4qKVxzKlwqXC9ccyokLywNCg0KICBlbXB0eUZ1bmN0aW9uOiBmdW5jdGlvbigpIHsgfSwNCiAgSzogZnVuY3Rpb24oeCkgeyByZXR1cm4geCB9DQp9DQoNCnZhciBDbGFzcyA9IHsNCiAgY3JlYXRlOiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgICB0aGlzLmluaXRpYWxpemUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCiAgICB9DQogIH0NCn0NCg0KdmFyIEFic3RyYWN0ID0gbmV3IE9iamVjdCgpOw0KDQpPYmplY3QuZXh0ZW5kID0gZnVuY3Rpb24oZGVzdGluYXRpb24sIHNvdXJjZSkgew0KICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBzb3VyY2UpIHsNCiAgICBkZXN0aW5hdGlvbltwcm9wZXJ0eV0gPSBzb3VyY2VbcHJvcGVydHldOw0KICB9DQogIHJldHVybiBkZXN0aW5hdGlvbjsNCn0NCg0KT2JqZWN0LmV4dGVuZChPYmplY3QsIHsNCiAgaW5zcGVjdDogZnVuY3Rpb24ob2JqZWN0KSB7DQogICAgdHJ5IHsNCiAgICAgIGlmIChvYmplY3QgPT09IHVuZGVmaW5lZCkgcmV0dXJuICd1bmRlZmluZWQnOw0KICAgICAgaWYgKG9iamVjdCA9PT0gbnVsbCkgcmV0dXJuICdudWxsJzsNCiAgICAgIHJldHVybiBvYmplY3QuaW5zcGVjdCA/IG9iamVjdC5pbnNwZWN0KCkgOiBvYmplY3QudG9TdHJpbmcoKTsNCiAgICB9IGNhdGNoIChlKSB7DQogICAgICBpZiAoZSBpbnN0YW5jZW9mIFJhbmdlRXJyb3IpIHJldHVybiAnLi4uJzsNCiAgICAgIHRocm93IGU7DQogICAgfQ0KICB9LA0KDQogIHRvSlNPTjogZnVuY3Rpb24ob2JqZWN0KSB7DQogICAgdmFyIHR5cGUgPSB0eXBlb2Ygb2JqZWN0Ow0KICAgIHN3aXRjaCh0eXBlKSB7DQogICAgICBjYXNlICd1bmRlZmluZWQnOg0KICAgICAgY2FzZSAnZnVuY3Rpb24nOg0KICAgICAgY2FzZSAndW5rbm93bic6IHJldHVybjsNCiAgICAgIGNhc2UgJ2Jvb2xlYW4nOiByZXR1cm4gb2JqZWN0LnRvU3RyaW5nKCk7DQogICAgfQ0KICAgIGlmIChvYmplY3QgPT09IG51bGwpIHJldHVybiAnbnVsbCc7DQogICAgaWYgKG9iamVjdC50b0pTT04pIHJldHVybiBvYmplY3QudG9KU09OKCk7DQogICAgaWYgKG9iamVjdC5vd25lckRvY3VtZW50ID09PSBkb2N1bWVudCkgcmV0dXJuOw0KICAgIHZhciByZXN1bHRzID0gW107DQogICAgZm9yICh2YXIgcHJvcGVydHkgaW4gb2JqZWN0KSB7DQogICAgICB2YXIgdmFsdWUgPSBPYmplY3QudG9KU09OKG9iamVjdFtwcm9wZXJ0eV0pOw0KICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpDQogICAgICAgIHJlc3VsdHMucHVzaChwcm9wZXJ0eS50b0pTT04oKSArICc6ICcgKyB2YWx1ZSk7DQogICAgfQ0KICAgIHJldHVybiAneycgKyByZXN1bHRzLmpvaW4oJywgJykgKyAnfSc7DQogIH0sDQoNCiAga2V5czogZnVuY3Rpb24ob2JqZWN0KSB7DQogICAgdmFyIGtleXMgPSBbXTsNCiAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBvYmplY3QpDQogICAgICBrZXlzLnB1c2gocHJvcGVydHkpOw0KICAgIHJldHVybiBrZXlzOw0KICB9LA0KDQogIHZhbHVlczogZnVuY3Rpb24ob2JqZWN0KSB7DQogICAgdmFyIHZhbHVlcyA9IFtdOw0KICAgIGZvciAodmFyIHByb3BlcnR5IGluIG9iamVjdCkNCiAgICAgIHZhbHVlcy5wdXNoKG9iamVjdFtwcm9wZXJ0eV0pOw0KICAgIHJldHVybiB2YWx1ZXM7DQogIH0sDQoNCiAgY2xvbmU6IGZ1bmN0aW9uKG9iamVjdCkgew0KICAgIHJldHVybiBPYmplY3QuZXh0ZW5kKHt9LCBvYmplY3QpOw0KICB9DQp9KTsNCg0KRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbigpIHsNCiAgdmFyIF9fbWV0aG9kID0gdGhpcywgYXJncyA9ICRBKGFyZ3VtZW50cyksIG9iamVjdCA9IGFyZ3Muc2hpZnQoKTsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiBfX21ldGhvZC5hcHBseShvYmplY3QsIGFyZ3MuY29uY2F0KCRBKGFyZ3VtZW50cykpKTsNCiAgfQ0KfQ0KDQpGdW5jdGlvbi5wcm90b3R5cGUuYmluZEFzRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKG9iamVjdCkgew0KICB2YXIgX19tZXRob2QgPSB0aGlzLCBhcmdzID0gJEEoYXJndW1lbnRzKSwgb2JqZWN0ID0gYXJncy5zaGlmdCgpOw0KICByZXR1cm4gZnVuY3Rpb24oZXZlbnQpIHsNCiAgICByZXR1cm4gX19tZXRob2QuYXBwbHkob2JqZWN0LCBbZXZlbnQgfHwgd2luZG93LmV2ZW50XS5jb25jYXQoYXJncykpOw0KICB9DQp9DQoNCk9iamVjdC5leHRlbmQoTnVtYmVyLnByb3RvdHlwZSwgew0KICB0b0NvbG9yUGFydDogZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIHRoaXMudG9QYWRkZWRTdHJpbmcoMiwgMTYpOw0KICB9LA0KDQogIHN1Y2M6IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB0aGlzICsgMTsNCiAgfSwNCg0KICB0aW1lczogZnVuY3Rpb24oaXRlcmF0b3IpIHsNCiAgICAkUigwLCB0aGlzLCB0cnVlKS5lYWNoKGl0ZXJhdG9yKTsNCiAgICByZXR1cm4gdGhpczsNCiAgfSwNCg0KICB0b1BhZGRlZFN0cmluZzogZnVuY3Rpb24obGVuZ3RoLCByYWRpeCkgew0KICAgIHZhciBzdHJpbmcgPSB0aGlzLnRvU3RyaW5nKHJhZGl4IHx8IDEwKTsNCiAgICByZXR1cm4gJzAnLnRpbWVzKGxlbmd0aCAtIHN0cmluZy5sZW5ndGgpICsgc3RyaW5nOw0KICB9LA0KDQogIHRvSlNPTjogZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIGlzRmluaXRlKHRoaXMpID8gdGhpcy50b1N0cmluZygpIDogJ251bGwnOw0KICB9DQp9KTsNCg0KRGF0ZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24oKSB7DQogIHJldHVybiAnIicgKyB0aGlzLmdldEZ1bGxZZWFyKCkgKyAnLScgKw0KICAgICh0aGlzLmdldE1vbnRoKCkgKyAxKS50b1BhZGRlZFN0cmluZygyKSArICctJyArDQogICAgdGhpcy5nZXREYXRlKCkudG9QYWRkZWRTdHJpbmcoMikgKyAnVCcgKw0KICAgIHRoaXMuZ2V0SG91cnMoKS50b1BhZGRlZFN0cmluZygyKSArICc6JyArDQogICAgdGhpcy5nZXRNaW51dGVzKCkudG9QYWRkZWRTdHJpbmcoMikgKyAnOicgKw0KICAgIHRoaXMuZ2V0U2Vjb25kcygpLnRvUGFkZGVkU3RyaW5nKDIpICsgJyInOw0KfTsNCg0KdmFyIFRyeSA9IHsNCiAgdGhlc2U6IGZ1bmN0aW9uKCkgew0KICAgIHZhciByZXR1cm5WYWx1ZTsNCg0KICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgIHZhciBsYW1iZGEgPSBhcmd1bWVudHNbaV07DQogICAgICB0cnkgew0KICAgICAgICByZXR1cm5WYWx1ZSA9IGxhbWJkYSgpOw0KICAgICAgICBicmVhazsNCiAgICAgIH0gY2F0Y2ggKGUpIHt9DQogICAgfQ0KDQogICAgcmV0dXJuIHJldHVyblZhbHVlOw0KICB9DQp9DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQp2YXIgUGVyaW9kaWNhbEV4ZWN1dGVyID0gQ2xhc3MuY3JlYXRlKCk7DQpQZXJpb2RpY2FsRXhlY3V0ZXIucHJvdG90eXBlID0gew0KICBpbml0aWFsaXplOiBmdW5jdGlvbihjYWxsYmFjaywgZnJlcXVlbmN5KSB7DQogICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrOw0KICAgIHRoaXMuZnJlcXVlbmN5ID0gZnJlcXVlbmN5Ow0KICAgIHRoaXMuY3VycmVudGx5RXhlY3V0aW5nID0gZmFsc2U7DQoNCiAgICB0aGlzLnJlZ2lzdGVyQ2FsbGJhY2soKTsNCiAgfSwNCg0KICByZWdpc3RlckNhbGxiYWNrOiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLnRpbWVyID0gc2V0SW50ZXJ2YWwodGhpcy5vblRpbWVyRXZlbnQuYmluZCh0aGlzKSwgdGhpcy5mcmVxdWVuY3kgKiAxMDAwKTsNCiAgfSwNCg0KICBzdG9wOiBmdW5jdGlvbigpIHsNCiAgICBpZiAoIXRoaXMudGltZXIpIHJldHVybjsNCiAgICBjbGVhckludGVydmFsKHRoaXMudGltZXIpOw0KICAgIHRoaXMudGltZXIgPSBudWxsOw0KICB9LA0KDQogIG9uVGltZXJFdmVudDogZnVuY3Rpb24oKSB7DQogICAgaWYgKCF0aGlzLmN1cnJlbnRseUV4ZWN1dGluZykgew0KICAgICAgdHJ5IHsNCiAgICAgICAgdGhpcy5jdXJyZW50bHlFeGVjdXRpbmcgPSB0cnVlOw0KICAgICAgICB0aGlzLmNhbGxiYWNrKHRoaXMpOw0KICAgICAgfSBmaW5hbGx5IHsNCiAgICAgICAgdGhpcy5jdXJyZW50bHlFeGVjdXRpbmcgPSBmYWxzZTsNCiAgICAgIH0NCiAgICB9DQogIH0NCn0NCk9iamVjdC5leHRlbmQoU3RyaW5nLCB7DQogIGludGVycHJldDogZnVuY3Rpb24odmFsdWUpIHsNCiAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICcnIDogU3RyaW5nKHZhbHVlKTsNCiAgfSwNCiAgc3BlY2lhbENoYXI6IHsNCiAgICAnXGInOiAnXFxiJywNCiAgICAnXHQnOiAnXFx0JywNCiAgICAnXG4nOiAnXFxuJywNCiAgICAnXGYnOiAnXFxmJywNCiAgICAnXHInOiAnXFxyJywNCiAgICAnXFwnOiAnXFxcXCcNCiAgfQ0KfSk7DQoNCk9iamVjdC5leHRlbmQoU3RyaW5nLnByb3RvdHlwZSwgew0KICBnc3ViOiBmdW5jdGlvbihwYXR0ZXJuLCByZXBsYWNlbWVudCkgew0KICAgIHZhciByZXN1bHQgPSAnJywgc291cmNlID0gdGhpcywgbWF0Y2g7DQogICAgcmVwbGFjZW1lbnQgPSBhcmd1bWVudHMuY2FsbGVlLnByZXBhcmVSZXBsYWNlbWVudChyZXBsYWNlbWVudCk7DQoNCiAgICB3aGlsZSAoc291cmNlLmxlbmd0aCA+IDApIHsNCiAgICAgIGlmIChtYXRjaCA9IHNvdXJjZS5tYXRjaChwYXR0ZXJuKSkgew0KICAgICAgICByZXN1bHQgKz0gc291cmNlLnNsaWNlKDAsIG1hdGNoLmluZGV4KTsNCiAgICAgICAgcmVzdWx0ICs9IFN0cmluZy5pbnRlcnByZXQocmVwbGFjZW1lbnQobWF0Y2gpKTsNCiAgICAgICAgc291cmNlICA9IHNvdXJjZS5zbGljZShtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICByZXN1bHQgKz0gc291cmNlLCBzb3VyY2UgPSAnJzsNCiAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIHJlc3VsdDsNCiAgfSwNCg0KICBzdWI6IGZ1bmN0aW9uKHBhdHRlcm4sIHJlcGxhY2VtZW50LCBjb3VudCkgew0KICAgIHJlcGxhY2VtZW50ID0gdGhpcy5nc3ViLnByZXBhcmVSZXBsYWNlbWVudChyZXBsYWNlbWVudCk7DQogICAgY291bnQgPSBjb3VudCA9PT0gdW5kZWZpbmVkID8gMSA6IGNvdW50Ow0KDQogICAgcmV0dXJuIHRoaXMuZ3N1YihwYXR0ZXJuLCBmdW5jdGlvbihtYXRjaCkgew0KICAgICAgaWYgKC0tY291bnQgPCAwKSByZXR1cm4gbWF0Y2hbMF07DQogICAgICByZXR1cm4gcmVwbGFjZW1lbnQobWF0Y2gpOw0KICAgIH0pOw0KICB9LA0KDQogIHNjYW46IGZ1bmN0aW9uKHBhdHRlcm4sIGl0ZXJhdG9yKSB7DQogICAgdGhpcy5nc3ViKHBhdHRlcm4sIGl0ZXJhdG9yKTsNCiAgICByZXR1cm4gdGhpczsNCiAgfSwNCg0KICB0cnVuY2F0ZTogZnVuY3Rpb24obGVuZ3RoLCB0cnVuY2F0aW9uKSB7DQogICAgbGVuZ3RoID0gbGVuZ3RoIHx8IDMwOw0KICAgIHRydW5jYXRpb24gPSB0cnVuY2F0aW9uID09PSB1bmRlZmluZWQgPyAnLi4uJyA6IHRydW5jYXRpb247DQogICAgcmV0dXJuIHRoaXMubGVuZ3RoID4gbGVuZ3RoID8NCiAgICAgIHRoaXMuc2xpY2UoMCwgbGVuZ3RoIC0gdHJ1bmNhdGlvbi5sZW5ndGgpICsgdHJ1bmNhdGlvbiA6IHRoaXM7DQogIH0sDQoNCiAgc3RyaXA6IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB0aGlzLnJlcGxhY2UoL15ccysvLCAnJykucmVwbGFjZSgvXHMrJC8sICcnKTsNCiAgfSwNCg0KICBzdHJpcFRhZ3M6IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB0aGlzLnJlcGxhY2UoLzxcLz9bXj5dKz4vZ2ksICcnKTsNCiAgfSwNCg0KICBzdHJpcFNjcmlwdHM6IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB0aGlzLnJlcGxhY2UobmV3IFJlZ0V4cChQcm90b3R5cGUuU2NyaXB0RnJhZ21lbnQsICdpbWcnKSwgJycpOw0KICB9LA0KDQogIGV4dHJhY3RTY3JpcHRzOiBmdW5jdGlvbigpIHsNCiAgICB2YXIgbWF0Y2hBbGwgPSBuZXcgUmVnRXhwKFByb3RvdHlwZS5TY3JpcHRGcmFnbWVudCwgJ2ltZycpOw0KICAgIHZhciBtYXRjaE9uZSA9IG5ldyBSZWdFeHAoUHJvdG90eXBlLlNjcmlwdEZyYWdtZW50LCAnaW0nKTsNCiAgICByZXR1cm4gKHRoaXMubWF0Y2gobWF0Y2hBbGwpIHx8IFtdKS5tYXAoZnVuY3Rpb24oc2NyaXB0VGFnKSB7DQogICAgICByZXR1cm4gKHNjcmlwdFRhZy5tYXRjaChtYXRjaE9uZSkgfHwgWycnLCAnJ10pWzFdOw0KICAgIH0pOw0KICB9LA0KDQogIGV2YWxTY3JpcHRzOiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gdGhpcy5leHRyYWN0U2NyaXB0cygpLm1hcChmdW5jdGlvbihzY3JpcHQpIHsgcmV0dXJuIGV2YWwoc2NyaXB0KSB9KTsNCiAgfSwNCg0KICBlc2NhcGVIVE1MOiBmdW5jdGlvbigpIHsNCiAgICB2YXIgc2VsZiA9IGFyZ3VtZW50cy5jYWxsZWU7DQogICAgc2VsZi50ZXh0LmRhdGEgPSB0aGlzOw0KICAgIHJldHVybiBzZWxmLmRpdi5pbm5lckhUTUw7DQogIH0sDQoNCiAgdW5lc2NhcGVIVE1MOiBmdW5jdGlvbigpIHsNCiAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7DQogICAgZGl2LmlubmVySFRNTCA9IHRoaXMuc3RyaXBUYWdzKCk7DQogICAgcmV0dXJuIGRpdi5jaGlsZE5vZGVzWzBdID8gKGRpdi5jaGlsZE5vZGVzLmxlbmd0aCA+IDEgPw0KICAgICAgJEEoZGl2LmNoaWxkTm9kZXMpLmluamVjdCgnJywgZnVuY3Rpb24obWVtbywgbm9kZSkgeyByZXR1cm4gbWVtbytub2RlLm5vZGVWYWx1ZSB9KSA6DQogICAgICBkaXYuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWUpIDogJyc7DQogIH0sDQoNCiAgdG9RdWVyeVBhcmFtczogZnVuY3Rpb24oc2VwYXJhdG9yKSB7DQogICAgdmFyIG1hdGNoID0gdGhpcy5zdHJpcCgpLm1hdGNoKC8oW14/I10qKSgjLiopPyQvKTsNCiAgICBpZiAoIW1hdGNoKSByZXR1cm4ge307DQoNCiAgICByZXR1cm4gbWF0Y2hbMV0uc3BsaXQoc2VwYXJhdG9yIHx8ICcmJykuaW5qZWN0KHt9LCBmdW5jdGlvbihoYXNoLCBwYWlyKSB7DQogICAgICBpZiAoKHBhaXIgPSBwYWlyLnNwbGl0KCc9JykpWzBdKSB7DQogICAgICAgIHZhciBrZXkgPSBkZWNvZGVVUklDb21wb25lbnQocGFpci5zaGlmdCgpKTsNCiAgICAgICAgdmFyIHZhbHVlID0gcGFpci5sZW5ndGggPiAxID8gcGFpci5qb2luKCc9JykgOiBwYWlyWzBdOw0KICAgICAgICBpZiAodmFsdWUgIT0gdW5kZWZpbmVkKSB2YWx1ZSA9IGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7DQoNCiAgICAgICAgaWYgKGtleSBpbiBoYXNoKSB7DQogICAgICAgICAgaWYgKGhhc2hba2V5XS5jb25zdHJ1Y3RvciAhPSBBcnJheSkgaGFzaFtrZXldID0gW2hhc2hba2V5XV07DQogICAgICAgICAgaGFzaFtrZXldLnB1c2godmFsdWUpOw0KICAgICAgICB9DQogICAgICAgIGVsc2UgaGFzaFtrZXldID0gdmFsdWU7DQogICAgICB9DQogICAgICByZXR1cm4gaGFzaDsNCiAgICB9KTsNCiAgfSwNCg0KICB0b0FycmF5OiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gdGhpcy5zcGxpdCgnJyk7DQogIH0sDQoNCiAgc3VjYzogZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIHRoaXMuc2xpY2UoMCwgdGhpcy5sZW5ndGggLSAxKSArDQogICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMuY2hhckNvZGVBdCh0aGlzLmxlbmd0aCAtIDEpICsgMSk7DQogIH0sDQoNCiAgdGltZXM6IGZ1bmN0aW9uKGNvdW50KSB7DQogICAgdmFyIHJlc3VsdCA9ICcnOw0KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgcmVzdWx0ICs9IHRoaXM7DQogICAgcmV0dXJuIHJlc3VsdDsNCiAgfSwNCg0KICBjYW1lbGl6ZTogZnVuY3Rpb24oKSB7DQogICAgdmFyIHBhcnRzID0gdGhpcy5zcGxpdCgnLScpLCBsZW4gPSBwYXJ0cy5sZW5ndGg7DQogICAgaWYgKGxlbiA9PSAxKSByZXR1cm4gcGFydHNbMF07DQoNCiAgICB2YXIgY2FtZWxpemVkID0gdGhpcy5jaGFyQXQoMCkgPT0gJy0nDQogICAgICA/IHBhcnRzWzBdLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcGFydHNbMF0uc3Vic3RyaW5nKDEpDQogICAgICA6IHBhcnRzWzBdOw0KDQogICAgZm9yICh2YXIgaSA9IDE7IGkgPCBsZW47IGkrKykNCiAgICAgIGNhbWVsaXplZCArPSBwYXJ0c1tpXS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHBhcnRzW2ldLnN1YnN0cmluZygxKTsNCg0KICAgIHJldHVybiBjYW1lbGl6ZWQ7DQogIH0sDQoNCiAgY2FwaXRhbGl6ZTogZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIHRoaXMuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0aGlzLnN1YnN0cmluZygxKS50b0xvd2VyQ2FzZSgpOw0KICB9LA0KDQogIHVuZGVyc2NvcmU6IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB0aGlzLmdzdWIoLzo6LywgJy8nKS5nc3ViKC8oW0EtWl0rKShbQS1aXVthLXpdKS8sJyN7MX1fI3syfScpLmdzdWIoLyhbYS16XGRdKShbQS1aXSkvLCcjezF9XyN7Mn0nKS5nc3ViKC8tLywnXycpLnRvTG93ZXJDYXNlKCk7DQogIH0sDQoNCiAgZGFzaGVyaXplOiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gdGhpcy5nc3ViKC9fLywnLScpOw0KICB9LA0KDQogIGluc3BlY3Q6IGZ1bmN0aW9uKHVzZURvdWJsZVF1b3Rlcykgew0KICAgIHZhciBlc2NhcGVkU3RyaW5nID0gdGhpcy5nc3ViKC9bXHgwMC1ceDFmXFxdLywgZnVuY3Rpb24obWF0Y2gpIHsNCiAgICAgIHZhciBjaGFyYWN0ZXIgPSBTdHJpbmcuc3BlY2lhbENoYXJbbWF0Y2hbMF1dOw0KICAgICAgcmV0dXJuIGNoYXJhY3RlciA/IGNoYXJhY3RlciA6ICdcXHUwMCcgKyBtYXRjaFswXS5jaGFyQ29kZUF0KCkudG9QYWRkZWRTdHJpbmcoMiwgMTYpOw0KICAgIH0pOw0KICAgIGlmICh1c2VEb3VibGVRdW90ZXMpIHJldHVybiAnIicgKyBlc2NhcGVkU3RyaW5nLnJlcGxhY2UoLyIvZywgJ1xcIicpICsgJyInOw0KICAgIHJldHVybiAiJyIgKyBlc2NhcGVkU3RyaW5nLnJlcGxhY2UoLycvZywgJ1xcXCcnKSArICInIjsNCiAgfSwNCg0KICB0b0pTT046IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB0aGlzLmluc3BlY3QodHJ1ZSk7DQogIH0sDQoNCiAgdW5maWx0ZXJKU09OOiBmdW5jdGlvbihmaWx0ZXIpIHsNCiAgICByZXR1cm4gdGhpcy5zdWIoZmlsdGVyIHx8IFByb3RvdHlwZS5KU09ORmlsdGVyLCAnI3sxfScpOw0KICB9LA0KDQogIGV2YWxKU09OOiBmdW5jdGlvbihzYW5pdGl6ZSkgew0KICAgIHZhciBqc29uID0gdGhpcy51bmZpbHRlckpTT04oKTsNCiAgICB0cnkgew0KICAgICAgaWYgKCFzYW5pdGl6ZSB8fCAoL14oIihcXC58W14iXFxcblxyXSkqPyJ8Wyw6e31cW1xdMC05LlwtK0VhZWZsbnItdSBcblxyXHRdKSs/JC8udGVzdChqc29uKSkpDQogICAgICAgIHJldHVybiBldmFsKCcoJyArIGpzb24gKyAnKScpOw0KICAgIH0gY2F0Y2ggKGUpIHsgfQ0KICAgIHRocm93IG5ldyBTeW50YXhFcnJvcignQmFkbHkgZm9ybWVkIEpTT04gc3RyaW5nOiAnICsgdGhpcy5pbnNwZWN0KCkpOw0KICB9LA0KDQogIGluY2x1ZGU6IGZ1bmN0aW9uKHBhdHRlcm4pIHsNCiAgICByZXR1cm4gdGhpcy5pbmRleE9mKHBhdHRlcm4pID4gLTE7DQogIH0sDQoNCiAgc3RhcnRzV2l0aDogZnVuY3Rpb24ocGF0dGVybikgew0KICAgIHJldHVybiB0aGlzLmluZGV4T2YocGF0dGVybikgPT09IDA7DQogIH0sDQoNCiAgZW5kc1dpdGg6IGZ1bmN0aW9uKHBhdHRlcm4pIHsNCiAgICB2YXIgZCA9IHRoaXMubGVuZ3RoIC0gcGF0dGVybi5sZW5ndGg7DQogICAgcmV0dXJuIGQgPj0gMCAmJiB0aGlzLmxhc3RJbmRleE9mKHBhdHRlcm4pID09PSBkOw0KICB9LA0KDQogIGVtcHR5OiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gdGhpcyA9PSAnJzsNCiAgfSwNCg0KICBibGFuazogZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIC9eXHMqJC8udGVzdCh0aGlzKTsNCiAgfQ0KfSk7DQoNCmlmIChQcm90b3R5cGUuQnJvd3Nlci5XZWJLaXQgfHwgUHJvdG90eXBlLkJyb3dzZXIuSUUpIE9iamVjdC5leHRlbmQoU3RyaW5nLnByb3RvdHlwZSwgew0KICBlc2NhcGVIVE1MOiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gdGhpcy5yZXBsYWNlKC8mL2csJyZhbXA7JykucmVwbGFjZSgvPC9nLCcmbHQ7JykucmVwbGFjZSgvPi9nLCcmZ3Q7Jyk7DQogIH0sDQogIHVuZXNjYXBlSFRNTDogZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIHRoaXMucmVwbGFjZSgvJmFtcDsvZywnJicpLnJlcGxhY2UoLyZsdDsvZywnPCcpLnJlcGxhY2UoLyZndDsvZywnPicpOw0KICB9DQp9KTsNCg0KU3RyaW5nLnByb3RvdHlwZS5nc3ViLnByZXBhcmVSZXBsYWNlbWVudCA9IGZ1bmN0aW9uKHJlcGxhY2VtZW50KSB7DQogIGlmICh0eXBlb2YgcmVwbGFjZW1lbnQgPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHJlcGxhY2VtZW50Ow0KICB2YXIgdGVtcGxhdGUgPSBuZXcgVGVtcGxhdGUocmVwbGFjZW1lbnQpOw0KICByZXR1cm4gZnVuY3Rpb24obWF0Y2gpIHsgcmV0dXJuIHRlbXBsYXRlLmV2YWx1YXRlKG1hdGNoKSB9Ow0KfQ0KDQpTdHJpbmcucHJvdG90eXBlLnBhcnNlUXVlcnkgPSBTdHJpbmcucHJvdG90eXBlLnRvUXVlcnlQYXJhbXM7DQoNCk9iamVjdC5leHRlbmQoU3RyaW5nLnByb3RvdHlwZS5lc2NhcGVIVE1MLCB7DQogIGRpdjogIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLA0KICB0ZXh0OiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJykNCn0pOw0KDQp3aXRoIChTdHJpbmcucHJvdG90eXBlLmVzY2FwZUhUTUwpIGRpdi5hcHBlbmRDaGlsZCh0ZXh0KTsNCg0KdmFyIFRlbXBsYXRlID0gQ2xhc3MuY3JlYXRlKCk7DQpUZW1wbGF0ZS5QYXR0ZXJuID0gLyhefC58XHJ8XG4pKCNceyguKj8pXH0pLzsNClRlbXBsYXRlLnByb3RvdHlwZSA9IHsNCiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24odGVtcGxhdGUsIHBhdHRlcm4pIHsNCiAgICB0aGlzLnRlbXBsYXRlID0gdGVtcGxhdGUudG9TdHJpbmcoKTsNCiAgICB0aGlzLnBhdHRlcm4gID0gcGF0dGVybiB8fCBUZW1wbGF0ZS5QYXR0ZXJuOw0KICB9LA0KDQogIGV2YWx1YXRlOiBmdW5jdGlvbihvYmplY3QpIHsNCiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZS5nc3ViKHRoaXMucGF0dGVybiwgZnVuY3Rpb24obWF0Y2gpIHsNCiAgICAgIHZhciBiZWZvcmUgPSBtYXRjaFsxXTsNCiAgICAgIGlmIChiZWZvcmUgPT0gJ1xcJykgcmV0dXJuIG1hdGNoWzJdOw0KICAgICAgcmV0dXJuIGJlZm9yZSArIFN0cmluZy5pbnRlcnByZXQob2JqZWN0W21hdGNoWzNdXSk7DQogICAgfSk7DQogIH0NCn0NCg0KdmFyICRicmVhayA9IHt9LCAkY29udGludWUgPSBuZXcgRXJyb3IoJyJ0aHJvdyAkY29udGludWUiIGlzIGRlcHJlY2F0ZWQsIHVzZSAicmV0dXJuIiBpbnN0ZWFkJyk7DQoNCnZhciBFbnVtZXJhYmxlID0gew0KICBlYWNoOiBmdW5jdGlvbihpdGVyYXRvcikgew0KICAgIHZhciBpbmRleCA9IDA7DQogICAgdHJ5IHsNCiAgICAgIHRoaXMuX2VhY2goZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgaXRlcmF0b3IodmFsdWUsIGluZGV4KyspOw0KICAgICAgfSk7DQogICAgfSBjYXRjaCAoZSkgew0KICAgICAgaWYgKGUgIT0gJGJyZWFrKSB0aHJvdyBlOw0KICAgIH0NCiAgICByZXR1cm4gdGhpczsNCiAgfSwNCg0KICBlYWNoU2xpY2U6IGZ1bmN0aW9uKG51bWJlciwgaXRlcmF0b3IpIHsNCiAgICB2YXIgaW5kZXggPSAtbnVtYmVyLCBzbGljZXMgPSBbXSwgYXJyYXkgPSB0aGlzLnRvQXJyYXkoKTsNCiAgICB3aGlsZSAoKGluZGV4ICs9IG51bWJlcikgPCBhcnJheS5sZW5ndGgpDQogICAgICBzbGljZXMucHVzaChhcnJheS5zbGljZShpbmRleCwgaW5kZXgrbnVtYmVyKSk7DQogICAgcmV0dXJuIHNsaWNlcy5tYXAoaXRlcmF0b3IpOw0KICB9LA0KDQogIGFsbDogZnVuY3Rpb24oaXRlcmF0b3IpIHsNCiAgICB2YXIgcmVzdWx0ID0gdHJ1ZTsNCiAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7DQogICAgICByZXN1bHQgPSByZXN1bHQgJiYgISEoaXRlcmF0b3IgfHwgUHJvdG90eXBlLkspKHZhbHVlLCBpbmRleCk7DQogICAgICBpZiAoIXJlc3VsdCkgdGhyb3cgJGJyZWFrOw0KICAgIH0pOw0KICAgIHJldHVybiByZXN1bHQ7DQogIH0sDQoNCiAgYW55OiBmdW5jdGlvbihpdGVyYXRvcikgew0KICAgIHZhciByZXN1bHQgPSBmYWxzZTsNCiAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7DQogICAgICBpZiAocmVzdWx0ID0gISEoaXRlcmF0b3IgfHwgUHJvdG90eXBlLkspKHZhbHVlLCBpbmRleCkpDQogICAgICAgIHRocm93ICRicmVhazsNCiAgICB9KTsNCiAgICByZXR1cm4gcmVzdWx0Ow0KICB9LA0KDQogIGNvbGxlY3Q6IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7DQogICAgdmFyIHJlc3VsdHMgPSBbXTsNCiAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7DQogICAgICByZXN1bHRzLnB1c2goKGl0ZXJhdG9yIHx8IFByb3RvdHlwZS5LKSh2YWx1ZSwgaW5kZXgpKTsNCiAgICB9KTsNCiAgICByZXR1cm4gcmVzdWx0czsNCiAgfSwNCg0KICBkZXRlY3Q6IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7DQogICAgdmFyIHJlc3VsdDsNCiAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7DQogICAgICBpZiAoaXRlcmF0b3IodmFsdWUsIGluZGV4KSkgew0KICAgICAgICByZXN1bHQgPSB2YWx1ZTsNCiAgICAgICAgdGhyb3cgJGJyZWFrOw0KICAgICAgfQ0KICAgIH0pOw0KICAgIHJldHVybiByZXN1bHQ7DQogIH0sDQoNCiAgZmluZEFsbDogZnVuY3Rpb24oaXRlcmF0b3IpIHsNCiAgICB2YXIgcmVzdWx0cyA9IFtdOw0KICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsNCiAgICAgIGlmIChpdGVyYXRvcih2YWx1ZSwgaW5kZXgpKQ0KICAgICAgICByZXN1bHRzLnB1c2godmFsdWUpOw0KICAgIH0pOw0KICAgIHJldHVybiByZXN1bHRzOw0KICB9LA0KDQogIGdyZXA6IGZ1bmN0aW9uKHBhdHRlcm4sIGl0ZXJhdG9yKSB7DQogICAgdmFyIHJlc3VsdHMgPSBbXTsNCiAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7DQogICAgICB2YXIgc3RyaW5nVmFsdWUgPSB2YWx1ZS50b1N0cmluZygpOw0KICAgICAgaWYgKHN0cmluZ1ZhbHVlLm1hdGNoKHBhdHRlcm4pKQ0KICAgICAgICByZXN1bHRzLnB1c2goKGl0ZXJhdG9yIHx8IFByb3RvdHlwZS5LKSh2YWx1ZSwgaW5kZXgpKTsNCiAgICB9KQ0KICAgIHJldHVybiByZXN1bHRzOw0KICB9LA0KDQogIGluY2x1ZGU6IGZ1bmN0aW9uKG9iamVjdCkgew0KICAgIHZhciBmb3VuZCA9IGZhbHNlOw0KICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSkgew0KICAgICAgaWYgKHZhbHVlID09IG9iamVjdCkgew0KICAgICAgICBmb3VuZCA9IHRydWU7DQogICAgICAgIHRocm93ICRicmVhazsNCiAgICAgIH0NCiAgICB9KTsNCiAgICByZXR1cm4gZm91bmQ7DQogIH0sDQoNCiAgaW5Hcm91cHNPZjogZnVuY3Rpb24obnVtYmVyLCBmaWxsV2l0aCkgew0KICAgIGZpbGxXaXRoID0gZmlsbFdpdGggPT09IHVuZGVmaW5lZCA/IG51bGwgOiBmaWxsV2l0aDsNCiAgICByZXR1cm4gdGhpcy5lYWNoU2xpY2UobnVtYmVyLCBmdW5jdGlvbihzbGljZSkgew0KICAgICAgd2hpbGUoc2xpY2UubGVuZ3RoIDwgbnVtYmVyKSBzbGljZS5wdXNoKGZpbGxXaXRoKTsNCiAgICAgIHJldHVybiBzbGljZTsNCiAgICB9KTsNCiAgfSwNCg0KICBpbmplY3Q6IGZ1bmN0aW9uKG1lbW8sIGl0ZXJhdG9yKSB7DQogICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgew0KICAgICAgbWVtbyA9IGl0ZXJhdG9yKG1lbW8sIHZhbHVlLCBpbmRleCk7DQogICAgfSk7DQogICAgcmV0dXJuIG1lbW87DQogIH0sDQoNCiAgaW52b2tlOiBmdW5jdGlvbihtZXRob2QpIHsNCiAgICB2YXIgYXJncyA9ICRBKGFyZ3VtZW50cykuc2xpY2UoMSk7DQogICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgICByZXR1cm4gdmFsdWVbbWV0aG9kXS5hcHBseSh2YWx1ZSwgYXJncyk7DQogICAgfSk7DQogIH0sDQoNCiAgbWF4OiBmdW5jdGlvbihpdGVyYXRvcikgew0KICAgIHZhciByZXN1bHQ7DQogICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgew0KICAgICAgdmFsdWUgPSAoaXRlcmF0b3IgfHwgUHJvdG90eXBlLkspKHZhbHVlLCBpbmRleCk7DQogICAgICBpZiAocmVzdWx0ID09IHVuZGVmaW5lZCB8fCB2YWx1ZSA+PSByZXN1bHQpDQogICAgICAgIHJlc3VsdCA9IHZhbHVlOw0KICAgIH0pOw0KICAgIHJldHVybiByZXN1bHQ7DQogIH0sDQoNCiAgbWluOiBmdW5jdGlvbihpdGVyYXRvcikgew0KICAgIHZhciByZXN1bHQ7DQogICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgew0KICAgICAgdmFsdWUgPSAoaXRlcmF0b3IgfHwgUHJvdG90eXBlLkspKHZhbHVlLCBpbmRleCk7DQogICAgICBpZiAocmVzdWx0ID09IHVuZGVmaW5lZCB8fCB2YWx1ZSA8IHJlc3VsdCkNCiAgICAgICAgcmVzdWx0ID0gdmFsdWU7DQogICAgfSk7DQogICAgcmV0dXJuIHJlc3VsdDsNCiAgfSwNCg0KICBwYXJ0aXRpb246IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7DQogICAgdmFyIHRydWVzID0gW10sIGZhbHNlcyA9IFtdOw0KICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsNCiAgICAgICgoaXRlcmF0b3IgfHwgUHJvdG90eXBlLkspKHZhbHVlLCBpbmRleCkgPw0KICAgICAgICB0cnVlcyA6IGZhbHNlcykucHVzaCh2YWx1ZSk7DQogICAgfSk7DQogICAgcmV0dXJuIFt0cnVlcywgZmFsc2VzXTsNCiAgfSwNCg0KICBwbHVjazogZnVuY3Rpb24ocHJvcGVydHkpIHsNCiAgICB2YXIgcmVzdWx0cyA9IFtdOw0KICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsNCiAgICAgIHJlc3VsdHMucHVzaCh2YWx1ZVtwcm9wZXJ0eV0pOw0KICAgIH0pOw0KICAgIHJldHVybiByZXN1bHRzOw0KICB9LA0KDQogIHJlamVjdDogZnVuY3Rpb24oaXRlcmF0b3IpIHsNCiAgICB2YXIgcmVzdWx0cyA9IFtdOw0KICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsNCiAgICAgIGlmICghaXRlcmF0b3IodmFsdWUsIGluZGV4KSkNCiAgICAgICAgcmVzdWx0cy5wdXNoKHZhbHVlKTsNCiAgICB9KTsNCiAgICByZXR1cm4gcmVzdWx0czsNCiAgfSwNCg0KICBzb3J0Qnk6IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7DQogICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgew0KICAgICAgcmV0dXJuIHt2YWx1ZTogdmFsdWUsIGNyaXRlcmlhOiBpdGVyYXRvcih2YWx1ZSwgaW5kZXgpfTsNCiAgICB9KS5zb3J0KGZ1bmN0aW9uKGxlZnQsIHJpZ2h0KSB7DQogICAgICB2YXIgYSA9IGxlZnQuY3JpdGVyaWEsIGIgPSByaWdodC5jcml0ZXJpYTsNCiAgICAgIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMDsNCiAgICB9KS5wbHVjaygndmFsdWUnKTsNCiAgfSwNCg0KICB0b0FycmF5OiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gdGhpcy5tYXAoKTsNCiAgfSwNCg0KICB6aXA6IGZ1bmN0aW9uKCkgew0KICAgIHZhciBpdGVyYXRvciA9IFByb3RvdHlwZS5LLCBhcmdzID0gJEEoYXJndW1lbnRzKTsNCiAgICBpZiAodHlwZW9mIGFyZ3MubGFzdCgpID09ICdmdW5jdGlvbicpDQogICAgICBpdGVyYXRvciA9IGFyZ3MucG9wKCk7DQoNCiAgICB2YXIgY29sbGVjdGlvbnMgPSBbdGhpc10uY29uY2F0KGFyZ3MpLm1hcCgkQSk7DQogICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgew0KICAgICAgcmV0dXJuIGl0ZXJhdG9yKGNvbGxlY3Rpb25zLnBsdWNrKGluZGV4KSk7DQogICAgfSk7DQogIH0sDQoNCiAgc2l6ZTogZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIHRoaXMudG9BcnJheSgpLmxlbmd0aDsNCiAgfSwNCg0KICBpbnNwZWN0OiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gJyM8RW51bWVyYWJsZTonICsgdGhpcy50b0FycmF5KCkuaW5zcGVjdCgpICsgJz4nOw0KICB9DQp9DQoNCk9iamVjdC5leHRlbmQoRW51bWVyYWJsZSwgew0KICBtYXA6ICAgICBFbnVtZXJhYmxlLmNvbGxlY3QsDQogIGZpbmQ6ICAgIEVudW1lcmFibGUuZGV0ZWN0LA0KICBzZWxlY3Q6ICBFbnVtZXJhYmxlLmZpbmRBbGwsDQogIG1lbWJlcjogIEVudW1lcmFibGUuaW5jbHVkZSwNCiAgZW50cmllczogRW51bWVyYWJsZS50b0FycmF5DQp9KTsNCnZhciAkQSA9IEFycmF5LmZyb20gPSBmdW5jdGlvbihpdGVyYWJsZSkgew0KICBpZiAoIWl0ZXJhYmxlKSByZXR1cm4gW107DQogIGlmIChpdGVyYWJsZS50b0FycmF5KSB7DQogICAgcmV0dXJuIGl0ZXJhYmxlLnRvQXJyYXkoKTsNCiAgfSBlbHNlIHsNCiAgICB2YXIgcmVzdWx0cyA9IFtdOw0KICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBpdGVyYWJsZS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykNCiAgICAgIHJlc3VsdHMucHVzaChpdGVyYWJsZVtpXSk7DQogICAgcmV0dXJuIHJlc3VsdHM7DQogIH0NCn0NCg0KaWYgKFByb3RvdHlwZS5Ccm93c2VyLldlYktpdCkgew0KICAkQSA9IEFycmF5LmZyb20gPSBmdW5jdGlvbihpdGVyYWJsZSkgew0KICAgIGlmICghaXRlcmFibGUpIHJldHVybiBbXTsNCiAgICBpZiAoISh0eXBlb2YgaXRlcmFibGUgPT0gJ2Z1bmN0aW9uJyAmJiBpdGVyYWJsZSA9PSAnW29iamVjdCBOb2RlTGlzdF0nKSAmJg0KICAgICAgaXRlcmFibGUudG9BcnJheSkgew0KICAgICAgcmV0dXJuIGl0ZXJhYmxlLnRvQXJyYXkoKTsNCiAgICB9IGVsc2Ugew0KICAgICAgdmFyIHJlc3VsdHMgPSBbXTsNCiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBpdGVyYWJsZS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykNCiAgICAgICAgcmVzdWx0cy5wdXNoKGl0ZXJhYmxlW2ldKTsNCiAgICAgIHJldHVybiByZXN1bHRzOw0KICAgIH0NCiAgfQ0KfQ0KDQpPYmplY3QuZXh0ZW5kKEFycmF5LnByb3RvdHlwZSwgRW51bWVyYWJsZSk7DQoNCmlmICghQXJyYXkucHJvdG90eXBlLl9yZXZlcnNlKQ0KICBBcnJheS5wcm90b3R5cGUuX3JldmVyc2UgPSBBcnJheS5wcm90b3R5cGUucmV2ZXJzZTsNCg0KT2JqZWN0LmV4dGVuZChBcnJheS5wcm90b3R5cGUsIHsNCiAgX2VhY2g6IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7DQogICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHRoaXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspDQogICAgICBpdGVyYXRvcih0aGlzW2ldKTsNCiAgfSwNCg0KICBjbGVhcjogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5sZW5ndGggPSAwOw0KICAgIHJldHVybiB0aGlzOw0KICB9LA0KDQogIGZpcnN0OiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gdGhpc1swXTsNCiAgfSwNCg0KICBsYXN0OiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gdGhpc1t0aGlzLmxlbmd0aCAtIDFdOw0KICB9LA0KDQogIGNvbXBhY3Q6IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbih2YWx1ZSkgew0KICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGw7DQogICAgfSk7DQogIH0sDQoNCiAgZmxhdHRlbjogZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIHRoaXMuaW5qZWN0KFtdLCBmdW5jdGlvbihhcnJheSwgdmFsdWUpIHsNCiAgICAgIHJldHVybiBhcnJheS5jb25jYXQodmFsdWUgJiYgdmFsdWUuY29uc3RydWN0b3IgPT0gQXJyYXkgPw0KICAgICAgICB2YWx1ZS5mbGF0dGVuKCkgOiBbdmFsdWVdKTsNCiAgICB9KTsNCiAgfSwNCg0KICB3aXRob3V0OiBmdW5jdGlvbigpIHsNCiAgICB2YXIgdmFsdWVzID0gJEEoYXJndW1lbnRzKTsNCiAgICByZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgIHJldHVybiAhdmFsdWVzLmluY2x1ZGUodmFsdWUpOw0KICAgIH0pOw0KICB9LA0KDQogIGluZGV4T2Y6IGZ1bmN0aW9uKG9iamVjdCkgew0KICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSB0aGlzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQ0KICAgICAgaWYgKHRoaXNbaV0gPT0gb2JqZWN0KSByZXR1cm4gaTsNCiAgICByZXR1cm4gLTE7DQogIH0sDQoNCiAgcmV2ZXJzZTogZnVuY3Rpb24oaW5saW5lKSB7DQogICAgcmV0dXJuIChpbmxpbmUgIT09IGZhbHNlID8gdGhpcyA6IHRoaXMudG9BcnJheSgpKS5fcmV2ZXJzZSgpOw0KICB9LA0KDQogIHJlZHVjZTogZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIHRoaXMubGVuZ3RoID4gMSA/IHRoaXMgOiB0aGlzWzBdOw0KICB9LA0KDQogIHVuaXE6IGZ1bmN0aW9uKHNvcnRlZCkgew0KICAgIHJldHVybiB0aGlzLmluamVjdChbXSwgZnVuY3Rpb24oYXJyYXksIHZhbHVlLCBpbmRleCkgew0KICAgICAgaWYgKDAgPT0gaW5kZXggfHwgKHNvcnRlZCA/IGFycmF5Lmxhc3QoKSAhPSB2YWx1ZSA6ICFhcnJheS5pbmNsdWRlKHZhbHVlKSkpDQogICAgICAgIGFycmF5LnB1c2godmFsdWUpOw0KICAgICAgcmV0dXJuIGFycmF5Ow0KICAgIH0pOw0KICB9LA0KDQogIGNsb25lOiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gW10uY29uY2F0KHRoaXMpOw0KICB9LA0KDQogIHNpemU6IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB0aGlzLmxlbmd0aDsNCiAgfSwNCg0KICBpbnNwZWN0OiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gJ1snICsgdGhpcy5tYXAoT2JqZWN0Lmluc3BlY3QpLmpvaW4oJywgJykgKyAnXSc7DQogIH0sDQoNCiAgdG9KU09OOiBmdW5jdGlvbigpIHsNCiAgICB2YXIgcmVzdWx0cyA9IFtdOw0KICAgIHRoaXMuZWFjaChmdW5jdGlvbihvYmplY3QpIHsNCiAgICAgIHZhciB2YWx1ZSA9IE9iamVjdC50b0pTT04ob2JqZWN0KTsNCiAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSByZXN1bHRzLnB1c2godmFsdWUpOw0KICAgIH0pOw0KICAgIHJldHVybiAnWycgKyByZXN1bHRzLmpvaW4oJywgJykgKyAnXSc7DQogIH0NCn0pOw0KDQpBcnJheS5wcm90b3R5cGUudG9BcnJheSA9IEFycmF5LnByb3RvdHlwZS5jbG9uZTsNCg0KZnVuY3Rpb24gJHcoc3RyaW5nKSB7DQogIHN0cmluZyA9IHN0cmluZy5zdHJpcCgpOw0KICByZXR1cm4gc3RyaW5nID8gc3RyaW5nLnNwbGl0KC9ccysvKSA6IFtdOw0KfQ0KDQppZiAoUHJvdG90eXBlLkJyb3dzZXIuT3BlcmEpew0KICBBcnJheS5wcm90b3R5cGUuY29uY2F0ID0gZnVuY3Rpb24oKSB7DQogICAgdmFyIGFycmF5ID0gW107DQogICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHRoaXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIGFycmF5LnB1c2godGhpc1tpXSk7DQogICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgew0KICAgICAgaWYgKGFyZ3VtZW50c1tpXS5jb25zdHJ1Y3RvciA9PSBBcnJheSkgew0KICAgICAgICBmb3IgKHZhciBqID0gMCwgYXJyYXlMZW5ndGggPSBhcmd1bWVudHNbaV0ubGVuZ3RoOyBqIDwgYXJyYXlMZW5ndGg7IGorKykNCiAgICAgICAgICBhcnJheS5wdXNoKGFyZ3VtZW50c1tpXVtqXSk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICBhcnJheS5wdXNoKGFyZ3VtZW50c1tpXSk7DQogICAgICB9DQogICAgfQ0KICAgIHJldHVybiBhcnJheTsNCiAgfQ0KfQ0KdmFyIEhhc2ggPSBmdW5jdGlvbihvYmplY3QpIHsNCiAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEhhc2gpIHRoaXMubWVyZ2Uob2JqZWN0KTsNCiAgZWxzZSBPYmplY3QuZXh0ZW5kKHRoaXMsIG9iamVjdCB8fCB7fSk7DQp9Ow0KDQpPYmplY3QuZXh0ZW5kKEhhc2gsIHsNCiAgdG9RdWVyeVN0cmluZzogZnVuY3Rpb24ob2JqKSB7DQogICAgdmFyIHBhcnRzID0gW107DQogICAgcGFydHMuYWRkID0gYXJndW1lbnRzLmNhbGxlZS5hZGRQYWlyOw0KDQogICAgdGhpcy5wcm90b3R5cGUuX2VhY2guY2FsbChvYmosIGZ1bmN0aW9uKHBhaXIpIHsNCiAgICAgIGlmICghcGFpci5rZXkpIHJldHVybjsNCiAgICAgIHZhciB2YWx1ZSA9IHBhaXIudmFsdWU7DQoNCiAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcpIHsNCiAgICAgICAgaWYgKHZhbHVlLmNvbnN0cnVjdG9yID09IEFycmF5KSB2YWx1ZS5lYWNoKGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgICAgICAgcGFydHMuYWRkKHBhaXIua2V5LCB2YWx1ZSk7DQogICAgICAgIH0pOw0KICAgICAgICByZXR1cm47DQogICAgICB9DQogICAgICBwYXJ0cy5hZGQocGFpci5rZXksIHZhbHVlKTsNCiAgICB9KTsNCg0KICAgIHJldHVybiBwYXJ0cy5qb2luKCcmJyk7DQogIH0sDQoNCiAgdG9KU09OOiBmdW5jdGlvbihvYmplY3QpIHsNCiAgICB2YXIgcmVzdWx0cyA9IFtdOw0KICAgIHRoaXMucHJvdG90eXBlLl9lYWNoLmNhbGwob2JqZWN0LCBmdW5jdGlvbihwYWlyKSB7DQogICAgICB2YXIgdmFsdWUgPSBPYmplY3QudG9KU09OKHBhaXIudmFsdWUpOw0KICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHJlc3VsdHMucHVzaChwYWlyLmtleS50b0pTT04oKSArICc6ICcgKyB2YWx1ZSk7DQogICAgfSk7DQogICAgcmV0dXJuICd7JyArIHJlc3VsdHMuam9pbignLCAnKSArICd9JzsNCiAgfQ0KfSk7DQoNCkhhc2gudG9RdWVyeVN0cmluZy5hZGRQYWlyID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSwgcHJlZml4KSB7DQogIGtleSA9IGVuY29kZVVSSUNvbXBvbmVudChrZXkpOw0KICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgdGhpcy5wdXNoKGtleSk7DQogIGVsc2UgdGhpcy5wdXNoKGtleSArICc9JyArICh2YWx1ZSA9PSBudWxsID8gJycgOiBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpKSk7DQp9DQoNCk9iamVjdC5leHRlbmQoSGFzaC5wcm90b3R5cGUsIEVudW1lcmFibGUpOw0KT2JqZWN0LmV4dGVuZChIYXNoLnByb3RvdHlwZSwgew0KICBfZWFjaDogZnVuY3Rpb24oaXRlcmF0b3IpIHsNCiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcykgew0KICAgICAgdmFyIHZhbHVlID0gdGhpc1trZXldOw0KICAgICAgaWYgKHZhbHVlICYmIHZhbHVlID09IEhhc2gucHJvdG90eXBlW2tleV0pIGNvbnRpbnVlOw0KDQogICAgICB2YXIgcGFpciA9IFtrZXksIHZhbHVlXTsNCiAgICAgIHBhaXIua2V5ID0ga2V5Ow0KICAgICAgcGFpci52YWx1ZSA9IHZhbHVlOw0KICAgICAgaXRlcmF0b3IocGFpcik7DQogICAgfQ0KICB9LA0KDQogIGtleXM6IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB0aGlzLnBsdWNrKCdrZXknKTsNCiAgfSwNCg0KICB2YWx1ZXM6IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB0aGlzLnBsdWNrKCd2YWx1ZScpOw0KICB9LA0KDQogIG1lcmdlOiBmdW5jdGlvbihoYXNoKSB7DQogICAgcmV0dXJuICRIKGhhc2gpLmluamVjdCh0aGlzLCBmdW5jdGlvbihtZXJnZWRIYXNoLCBwYWlyKSB7DQogICAgICBtZXJnZWRIYXNoW3BhaXIua2V5XSA9IHBhaXIudmFsdWU7DQogICAgICByZXR1cm4gbWVyZ2VkSGFzaDsNCiAgICB9KTsNCiAgfSwNCg0KICByZW1vdmU6IGZ1bmN0aW9uKCkgew0KICAgIHZhciByZXN1bHQ7DQogICAgZm9yKHZhciBpID0gMCwgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7DQogICAgICB2YXIgdmFsdWUgPSB0aGlzW2FyZ3VtZW50c1tpXV07DQogICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCl7DQogICAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkgcmVzdWx0ID0gdmFsdWU7DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgIGlmIChyZXN1bHQuY29uc3RydWN0b3IgIT0gQXJyYXkpIHJlc3VsdCA9IFtyZXN1bHRdOw0KICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKQ0KICAgICAgICB9DQogICAgICB9DQogICAgICBkZWxldGUgdGhpc1thcmd1bWVudHNbaV1dOw0KICAgIH0NCiAgICByZXR1cm4gcmVzdWx0Ow0KICB9LA0KDQogIHRvUXVlcnlTdHJpbmc6IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiBIYXNoLnRvUXVlcnlTdHJpbmcodGhpcyk7DQogIH0sDQoNCiAgaW5zcGVjdDogZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuICcjPEhhc2g6eycgKyB0aGlzLm1hcChmdW5jdGlvbihwYWlyKSB7DQogICAgICByZXR1cm4gcGFpci5tYXAoT2JqZWN0Lmluc3BlY3QpLmpvaW4oJzogJyk7DQogICAgfSkuam9pbignLCAnKSArICd9Pic7DQogIH0sDQoNCiAgdG9KU09OOiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gSGFzaC50b0pTT04odGhpcyk7DQogIH0NCn0pOw0KDQpmdW5jdGlvbiAkSChvYmplY3QpIHsNCiAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEhhc2gpIHJldHVybiBvYmplY3Q7DQogIHJldHVybiBuZXcgSGFzaChvYmplY3QpOw0KfTsNCg0KLy8gU2FmYXJpIGl0ZXJhdGVzIG92ZXIgc2hhZG93ZWQgcHJvcGVydGllcw0KaWYgKGZ1bmN0aW9uKCkgew0KICB2YXIgaSA9IDAsIFRlc3QgPSBmdW5jdGlvbih2YWx1ZSkgeyB0aGlzLmtleSA9IHZhbHVlIH07DQogIFRlc3QucHJvdG90eXBlLmtleSA9ICdmb28nOw0KICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBuZXcgVGVzdCgnYmFyJykpIGkrKzsNCiAgcmV0dXJuIGkgPiAxOw0KfSgpKSBIYXNoLnByb3RvdHlwZS5fZWFjaCA9IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7DQogIHZhciBjYWNoZSA9IFtdOw0KICBmb3IgKHZhciBrZXkgaW4gdGhpcykgew0KICAgIHZhciB2YWx1ZSA9IHRoaXNba2V5XTsNCiAgICBpZiAoKHZhbHVlICYmIHZhbHVlID09IEhhc2gucHJvdG90eXBlW2tleV0pIHx8IGNhY2hlLmluY2x1ZGUoa2V5KSkgY29udGludWU7DQogICAgY2FjaGUucHVzaChrZXkpOw0KICAgIHZhciBwYWlyID0gW2tleSwgdmFsdWVdOw0KICAgIHBhaXIua2V5ID0ga2V5Ow0KICAgIHBhaXIudmFsdWUgPSB2YWx1ZTsNCiAgICBpdGVyYXRvcihwYWlyKTsNCiAgfQ0KfTsNCk9iamVjdFJhbmdlID0gQ2xhc3MuY3JlYXRlKCk7DQpPYmplY3QuZXh0ZW5kKE9iamVjdFJhbmdlLnByb3RvdHlwZSwgRW51bWVyYWJsZSk7DQpPYmplY3QuZXh0ZW5kKE9iamVjdFJhbmdlLnByb3RvdHlwZSwgew0KICBpbml0aWFsaXplOiBmdW5jdGlvbihzdGFydCwgZW5kLCBleGNsdXNpdmUpIHsNCiAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7DQogICAgdGhpcy5lbmQgPSBlbmQ7DQogICAgdGhpcy5leGNsdXNpdmUgPSBleGNsdXNpdmU7DQogIH0sDQoNCiAgX2VhY2g6IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7DQogICAgdmFyIHZhbHVlID0gdGhpcy5zdGFydDsNCiAgICB3aGlsZSAodGhpcy5pbmNsdWRlKHZhbHVlKSkgew0KICAgICAgaXRlcmF0b3IodmFsdWUpOw0KICAgICAgdmFsdWUgPSB2YWx1ZS5zdWNjKCk7DQogICAgfQ0KICB9LA0KDQogIGluY2x1ZGU6IGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgaWYgKHZhbHVlIDwgdGhpcy5zdGFydCkNCiAgICAgIHJldHVybiBmYWxzZTsNCiAgICBpZiAodGhpcy5leGNsdXNpdmUpDQogICAgICByZXR1cm4gdmFsdWUgPCB0aGlzLmVuZDsNCiAgICByZXR1cm4gdmFsdWUgPD0gdGhpcy5lbmQ7DQogIH0NCn0pOw0KDQp2YXIgJFIgPSBmdW5jdGlvbihzdGFydCwgZW5kLCBleGNsdXNpdmUpIHsNCiAgcmV0dXJuIG5ldyBPYmplY3RSYW5nZShzdGFydCwgZW5kLCBleGNsdXNpdmUpOw0KfQ0KDQp2YXIgQWpheCA9IHsNCiAgZ2V0VHJhbnNwb3J0OiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gVHJ5LnRoZXNlKA0KICAgICAgZnVuY3Rpb24oKSB7cmV0dXJuIG5ldyBYTUxIdHRwUmVxdWVzdCgpfSwNCiAgICAgIGZ1bmN0aW9uKCkge3JldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTXN4bWwyLlhNTEhUVFAnKX0sDQogICAgICBmdW5jdGlvbigpIHtyZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ01pY3Jvc29mdC5YTUxIVFRQJyl9DQogICAgKSB8fCBmYWxzZTsNCiAgfSwNCg0KICBhY3RpdmVSZXF1ZXN0Q291bnQ6IDANCn0NCg0KQWpheC5SZXNwb25kZXJzID0gew0KICByZXNwb25kZXJzOiBbXSwNCg0KICBfZWFjaDogZnVuY3Rpb24oaXRlcmF0b3IpIHsNCiAgICB0aGlzLnJlc3BvbmRlcnMuX2VhY2goaXRlcmF0b3IpOw0KICB9LA0KDQogIHJlZ2lzdGVyOiBmdW5jdGlvbihyZXNwb25kZXIpIHsNCiAgICBpZiAoIXRoaXMuaW5jbHVkZShyZXNwb25kZXIpKQ0KICAgICAgdGhpcy5yZXNwb25kZXJzLnB1c2gocmVzcG9uZGVyKTsNCiAgfSwNCg0KICB1bnJlZ2lzdGVyOiBmdW5jdGlvbihyZXNwb25kZXIpIHsNCiAgICB0aGlzLnJlc3BvbmRlcnMgPSB0aGlzLnJlc3BvbmRlcnMud2l0aG91dChyZXNwb25kZXIpOw0KICB9LA0KDQogIGRpc3BhdGNoOiBmdW5jdGlvbihjYWxsYmFjaywgcmVxdWVzdCwgdHJhbnNwb3J0LCBqc29uKSB7DQogICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHJlc3BvbmRlcikgew0KICAgICAgaWYgKHR5cGVvZiByZXNwb25kZXJbY2FsbGJhY2tdID09ICdmdW5jdGlvbicpIHsNCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICByZXNwb25kZXJbY2FsbGJhY2tdLmFwcGx5KHJlc3BvbmRlciwgW3JlcXVlc3QsIHRyYW5zcG9ydCwganNvbl0pOw0KICAgICAgICB9IGNhdGNoIChlKSB7fQ0KICAgICAgfQ0KICAgIH0pOw0KICB9DQp9Ow0KDQpPYmplY3QuZXh0ZW5kKEFqYXguUmVzcG9uZGVycywgRW51bWVyYWJsZSk7DQoNCkFqYXguUmVzcG9uZGVycy5yZWdpc3Rlcih7DQogIG9uQ3JlYXRlOiBmdW5jdGlvbigpIHsNCiAgICBBamF4LmFjdGl2ZVJlcXVlc3RDb3VudCsrOw0KICB9LA0KICBvbkNvbXBsZXRlOiBmdW5jdGlvbigpIHsNCiAgICBBamF4LmFjdGl2ZVJlcXVlc3RDb3VudC0tOw0KICB9DQp9KTsNCg0KQWpheC5CYXNlID0gZnVuY3Rpb24oKSB7fTsNCkFqYXguQmFzZS5wcm90b3R5cGUgPSB7DQogIHNldE9wdGlvbnM6IGZ1bmN0aW9uKG9wdGlvbnMpIHsNCiAgICB0aGlzLm9wdGlvbnMgPSB7DQogICAgICBtZXRob2Q6ICAgICAgICdwb3N0JywNCiAgICAgIGFzeW5jaHJvbm91czogdHJ1ZSwNCiAgICAgIGNvbnRlbnRUeXBlOiAgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsDQogICAgICBlbmNvZGluZzogICAgICdVVEYtOCcsDQogICAgICBwYXJhbWV0ZXJzOiAgICcnDQogICAgfQ0KICAgIE9iamVjdC5leHRlbmQodGhpcy5vcHRpb25zLCBvcHRpb25zIHx8IHt9KTsNCg0KICAgIHRoaXMub3B0aW9ucy5tZXRob2QgPSB0aGlzLm9wdGlvbnMubWV0aG9kLnRvTG93ZXJDYXNlKCk7DQogICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMucGFyYW1ldGVycyA9PSAnc3RyaW5nJykNCiAgICAgIHRoaXMub3B0aW9ucy5wYXJhbWV0ZXJzID0gdGhpcy5vcHRpb25zLnBhcmFtZXRlcnMudG9RdWVyeVBhcmFtcygpOw0KICB9DQp9DQoNCkFqYXguUmVxdWVzdCA9IENsYXNzLmNyZWF0ZSgpOw0KQWpheC5SZXF1ZXN0LkV2ZW50cyA9DQogIFsnVW5pbml0aWFsaXplZCcsICdMb2FkaW5nJywgJ0xvYWRlZCcsICdJbnRlcmFjdGl2ZScsICdDb21wbGV0ZSddOw0KDQpBamF4LlJlcXVlc3QucHJvdG90eXBlID0gT2JqZWN0LmV4dGVuZChuZXcgQWpheC5CYXNlKCksIHsNCiAgX2NvbXBsZXRlOiBmYWxzZSwNCg0KICBpbml0aWFsaXplOiBmdW5jdGlvbih1cmwsIG9wdGlvbnMpIHsNCiAgICB0aGlzLnRyYW5zcG9ydCA9IEFqYXguZ2V0VHJhbnNwb3J0KCk7DQogICAgdGhpcy5zZXRPcHRpb25zKG9wdGlvbnMpOw0KICAgIHRoaXMucmVxdWVzdCh1cmwpOw0KICB9LA0KDQogIHJlcXVlc3Q6IGZ1bmN0aW9uKHVybCkgew0KICAgIHRoaXMudXJsID0gdXJsOw0KICAgIHRoaXMubWV0aG9kID0gdGhpcy5vcHRpb25zLm1ldGhvZDsNCiAgICB2YXIgcGFyYW1zID0gT2JqZWN0LmNsb25lKHRoaXMub3B0aW9ucy5wYXJhbWV0ZXJzKTsNCg0KICAgIGlmICghWydnZXQnLCAncG9zdCddLmluY2x1ZGUodGhpcy5tZXRob2QpKSB7DQogICAgICAvLyBzaW11bGF0ZSBvdGhlciB2ZXJicyBvdmVyIHBvc3QNCiAgICAgIHBhcmFtc1snX21ldGhvZCddID0gdGhpcy5tZXRob2Q7DQogICAgICB0aGlzLm1ldGhvZCA9ICdwb3N0JzsNCiAgICB9DQoNCiAgICB0aGlzLnBhcmFtZXRlcnMgPSBwYXJhbXM7DQoNCiAgICBpZiAocGFyYW1zID0gSGFzaC50b1F1ZXJ5U3RyaW5nKHBhcmFtcykpIHsNCiAgICAgIC8vIHdoZW4gR0VULCBhcHBlbmQgcGFyYW1ldGVycyB0byBVUkwNCiAgICAgIGlmICh0aGlzLm1ldGhvZCA9PSAnZ2V0JykNCiAgICAgICAgdGhpcy51cmwgKz0gKHRoaXMudXJsLmluY2x1ZGUoJz8nKSA/ICcmJyA6ICc/JykgKyBwYXJhbXM7DQogICAgICBlbHNlIGlmICgvS29ucXVlcm9yfFNhZmFyaXxLSFRNTC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSkNCiAgICAgICAgcGFyYW1zICs9ICcmXz0nOw0KICAgIH0NCg0KICAgIHRyeSB7DQogICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JlYXRlKSB0aGlzLm9wdGlvbnMub25DcmVhdGUodGhpcy50cmFuc3BvcnQpOw0KICAgICAgQWpheC5SZXNwb25kZXJzLmRpc3BhdGNoKCdvbkNyZWF0ZScsIHRoaXMsIHRoaXMudHJhbnNwb3J0KTsNCg0KICAgICAgdGhpcy50cmFuc3BvcnQub3Blbih0aGlzLm1ldGhvZC50b1VwcGVyQ2FzZSgpLCB0aGlzLnVybCwNCiAgICAgICAgdGhpcy5vcHRpb25zLmFzeW5jaHJvbm91cyk7DQoNCiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXN5bmNocm9ub3VzKQ0KICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB0aGlzLnJlc3BvbmRUb1JlYWR5U3RhdGUoMSkgfS5iaW5kKHRoaXMpLCAxMCk7DQoNCiAgICAgIHRoaXMudHJhbnNwb3J0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IHRoaXMub25TdGF0ZUNoYW5nZS5iaW5kKHRoaXMpOw0KICAgICAgdGhpcy5zZXRSZXF1ZXN0SGVhZGVycygpOw0KDQogICAgICB0aGlzLmJvZHkgPSB0aGlzLm1ldGhvZCA9PSAncG9zdCcgPyAodGhpcy5vcHRpb25zLnBvc3RCb2R5IHx8IHBhcmFtcykgOiBudWxsOw0KICAgICAgdGhpcy50cmFuc3BvcnQuc2VuZCh0aGlzLmJvZHkpOw0KDQogICAgICAvKiBGb3JjZSBGaXJlZm94IHRvIGhhbmRsZSByZWFkeSBzdGF0ZSA0IGZvciBzeW5jaHJvbm91cyByZXF1ZXN0cyAqLw0KICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYXN5bmNocm9ub3VzICYmIHRoaXMudHJhbnNwb3J0Lm92ZXJyaWRlTWltZVR5cGUpDQogICAgICAgIHRoaXMub25TdGF0ZUNoYW5nZSgpOw0KDQogICAgfQ0KICAgIGNhdGNoIChlKSB7DQogICAgICB0aGlzLmRpc3BhdGNoRXhjZXB0aW9uKGUpOw0KICAgIH0NCiAgfSwNCg0KICBvblN0YXRlQ2hhbmdlOiBmdW5jdGlvbigpIHsNCiAgICB2YXIgcmVhZHlTdGF0ZSA9IHRoaXMudHJhbnNwb3J0LnJlYWR5U3RhdGU7DQogICAgaWYgKHJlYWR5U3RhdGUgPiAxICYmICEoKHJlYWR5U3RhdGUgPT0gNCkgJiYgdGhpcy5fY29tcGxldGUpKQ0KICAgICAgdGhpcy5yZXNwb25kVG9SZWFkeVN0YXRlKHRoaXMudHJhbnNwb3J0LnJlYWR5U3RhdGUpOw0KICB9LA0KDQogIHNldFJlcXVlc3RIZWFkZXJzOiBmdW5jdGlvbigpIHsNCiAgICB2YXIgaGVhZGVycyA9IHsNCiAgICAgICdYLVJlcXVlc3RlZC1XaXRoJzogJ1hNTEh0dHBSZXF1ZXN0JywNCiAgICAgICdYLVByb3RvdHlwZS1WZXJzaW9uJzogUHJvdG90eXBlLlZlcnNpb24sDQogICAgICAnQWNjZXB0JzogJ3RleHQvamF2YXNjcmlwdCwgdGV4dC9odG1sLCBhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sLCAqLyonDQogICAgfTsNCg0KICAgIGlmICh0aGlzLm1ldGhvZCA9PSAncG9zdCcpIHsNCiAgICAgIGhlYWRlcnNbJ0NvbnRlbnQtdHlwZSddID0gdGhpcy5vcHRpb25zLmNvbnRlbnRUeXBlICsNCiAgICAgICAgKHRoaXMub3B0aW9ucy5lbmNvZGluZyA/ICc7IGNoYXJzZXQ9JyArIHRoaXMub3B0aW9ucy5lbmNvZGluZyA6ICcnKTsNCg0KICAgICAgLyogRm9yY2UgIkNvbm5lY3Rpb246IGNsb3NlIiBmb3Igb2xkZXIgTW96aWxsYSBicm93c2VycyB0byB3b3JrDQogICAgICAgKiBhcm91bmQgYSBidWcgd2hlcmUgWE1MSHR0cFJlcXVlc3Qgc2VuZHMgYW4gaW5jb3JyZWN0DQogICAgICAgKiBDb250ZW50LWxlbmd0aCBoZWFkZXIuIFNlZSBNb3ppbGxhIEJ1Z3ppbGxhICMyNDY2NTEuDQogICAgICAgKi8NCiAgICAgIGlmICh0aGlzLnRyYW5zcG9ydC5vdmVycmlkZU1pbWVUeXBlICYmDQogICAgICAgICAgKG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0dlY2tvXC8oXGR7NH0pLykgfHwgWzAsMjAwNV0pWzFdIDwgMjAwNSkNCiAgICAgICAgICAgIGhlYWRlcnNbJ0Nvbm5lY3Rpb24nXSA9ICdjbG9zZSc7DQogICAgfQ0KDQogICAgLy8gdXNlci1kZWZpbmVkIGhlYWRlcnMNCiAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5yZXF1ZXN0SGVhZGVycyA9PSAnb2JqZWN0Jykgew0KICAgICAgdmFyIGV4dHJhcyA9IHRoaXMub3B0aW9ucy5yZXF1ZXN0SGVhZGVyczsNCg0KICAgICAgaWYgKHR5cGVvZiBleHRyYXMucHVzaCA9PSAnZnVuY3Rpb24nKQ0KICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gZXh0cmFzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSArPSAyKQ0KICAgICAgICAgIGhlYWRlcnNbZXh0cmFzW2ldXSA9IGV4dHJhc1tpKzFdOw0KICAgICAgZWxzZQ0KICAgICAgICAkSChleHRyYXMpLmVhY2goZnVuY3Rpb24ocGFpcikgeyBoZWFkZXJzW3BhaXIua2V5XSA9IHBhaXIudmFsdWUgfSk7DQogICAgfQ0KDQogICAgZm9yICh2YXIgbmFtZSBpbiBoZWFkZXJzKQ0KICAgICAgdGhpcy50cmFuc3BvcnQuc2V0UmVxdWVzdEhlYWRlcihuYW1lLCBoZWFkZXJzW25hbWVdKTsNCiAgfSwNCg0KICBzdWNjZXNzOiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gIXRoaXMudHJhbnNwb3J0LnN0YXR1cw0KICAgICAgICB8fCAodGhpcy50cmFuc3BvcnQuc3RhdHVzID49IDIwMCAmJiB0aGlzLnRyYW5zcG9ydC5zdGF0dXMgPCAzMDApOw0KICB9LA0KDQogIHJlc3BvbmRUb1JlYWR5U3RhdGU6IGZ1bmN0aW9uKHJlYWR5U3RhdGUpIHsNCiAgICB2YXIgc3RhdGUgPSBBamF4LlJlcXVlc3QuRXZlbnRzW3JlYWR5U3RhdGVdOw0KICAgIHZhciB0cmFuc3BvcnQgPSB0aGlzLnRyYW5zcG9ydCwganNvbiA9IHRoaXMuZXZhbEpTT04oKTsNCg0KICAgIGlmIChzdGF0ZSA9PSAnQ29tcGxldGUnKSB7DQogICAgICB0cnkgew0KICAgICAgICB0aGlzLl9jb21wbGV0ZSA9IHRydWU7DQogICAgICAgICh0aGlzLm9wdGlvbnNbJ29uJyArIHRoaXMudHJhbnNwb3J0LnN0YXR1c10NCiAgICAgICAgIHx8IHRoaXMub3B0aW9uc1snb24nICsgKHRoaXMuc3VjY2VzcygpID8gJ1N1Y2Nlc3MnIDogJ0ZhaWx1cmUnKV0NCiAgICAgICAgIHx8IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uKSh0cmFuc3BvcnQsIGpzb24pOw0KICAgICAgfSBjYXRjaCAoZSkgew0KICAgICAgICB0aGlzLmRpc3BhdGNoRXhjZXB0aW9uKGUpOw0KICAgICAgfQ0KDQogICAgICB2YXIgY29udGVudFR5cGUgPSB0aGlzLmdldEhlYWRlcignQ29udGVudC10eXBlJyk7DQogICAgICBpZiAoY29udGVudFR5cGUgJiYgY29udGVudFR5cGUuc3RyaXAoKS4NCiAgICAgICAgbWF0Y2goL14odGV4dHxhcHBsaWNhdGlvbilcLyh4LSk/KGphdmF8ZWNtYSlzY3JpcHQoOy4qKT8kL2kpKQ0KICAgICAgICAgIHRoaXMuZXZhbFJlc3BvbnNlKCk7DQogICAgfQ0KDQogICAgdHJ5IHsNCiAgICAgICh0aGlzLm9wdGlvbnNbJ29uJyArIHN0YXRlXSB8fCBQcm90b3R5cGUuZW1wdHlGdW5jdGlvbikodHJhbnNwb3J0LCBqc29uKTsNCiAgICAgIEFqYXguUmVzcG9uZGVycy5kaXNwYXRjaCgnb24nICsgc3RhdGUsIHRoaXMsIHRyYW5zcG9ydCwganNvbik7DQogICAgfSBjYXRjaCAoZSkgew0KICAgICAgdGhpcy5kaXNwYXRjaEV4Y2VwdGlvbihlKTsNCiAgICB9DQoNCiAgICBpZiAoc3RhdGUgPT0gJ0NvbXBsZXRlJykgew0KICAgICAgLy8gYXZvaWQgbWVtb3J5IGxlYWsgaW4gTVNJRTogY2xlYW4gdXANCiAgICAgIHRoaXMudHJhbnNwb3J0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uOw0KICAgIH0NCiAgfSwNCg0KICBnZXRIZWFkZXI6IGZ1bmN0aW9uKG5hbWUpIHsNCiAgICB0cnkgew0KICAgICAgcmV0dXJuIHRoaXMudHJhbnNwb3J0LmdldFJlc3BvbnNlSGVhZGVyKG5hbWUpOw0KICAgIH0gY2F0Y2ggKGUpIHsgcmV0dXJuIG51bGwgfQ0KICB9LA0KDQogIGV2YWxKU09OOiBmdW5jdGlvbigpIHsNCiAgICB0cnkgew0KICAgICAgdmFyIGpzb24gPSB0aGlzLmdldEhlYWRlcignWC1KU09OJyk7DQogICAgICByZXR1cm4ganNvbiA/IGpzb24uZXZhbEpTT04oKSA6IG51bGw7DQogICAgfSBjYXRjaCAoZSkgeyByZXR1cm4gbnVsbCB9DQogIH0sDQoNCiAgZXZhbFJlc3BvbnNlOiBmdW5jdGlvbigpIHsNCiAgICB0cnkgew0KICAgICAgcmV0dXJuIGV2YWwoKHRoaXMudHJhbnNwb3J0LnJlc3BvbnNlVGV4dCB8fCAnJykudW5maWx0ZXJKU09OKCkpOw0KICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgIHRoaXMuZGlzcGF0Y2hFeGNlcHRpb24oZSk7DQogICAgfQ0KICB9LA0KDQogIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbihleGNlcHRpb24pIHsNCiAgICAodGhpcy5vcHRpb25zLm9uRXhjZXB0aW9uIHx8IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uKSh0aGlzLCBleGNlcHRpb24pOw0KICAgIEFqYXguUmVzcG9uZGVycy5kaXNwYXRjaCgnb25FeGNlcHRpb24nLCB0aGlzLCBleGNlcHRpb24pOw0KICB9DQp9KTsNCg0KQWpheC5VcGRhdGVyID0gQ2xhc3MuY3JlYXRlKCk7DQoNCk9iamVjdC5leHRlbmQoT2JqZWN0LmV4dGVuZChBamF4LlVwZGF0ZXIucHJvdG90eXBlLCBBamF4LlJlcXVlc3QucHJvdG90eXBlKSwgew0KICBpbml0aWFsaXplOiBmdW5jdGlvbihjb250YWluZXIsIHVybCwgb3B0aW9ucykgew0KICAgIHRoaXMuY29udGFpbmVyID0gew0KICAgICAgc3VjY2VzczogKGNvbnRhaW5lci5zdWNjZXNzIHx8IGNvbnRhaW5lciksDQogICAgICBmYWlsdXJlOiAoY29udGFpbmVyLmZhaWx1cmUgfHwgKGNvbnRhaW5lci5zdWNjZXNzID8gbnVsbCA6IGNvbnRhaW5lcikpDQogICAgfQ0KDQogICAgdGhpcy50cmFuc3BvcnQgPSBBamF4LmdldFRyYW5zcG9ydCgpOw0KICAgIHRoaXMuc2V0T3B0aW9ucyhvcHRpb25zKTsNCg0KICAgIHZhciBvbkNvbXBsZXRlID0gdGhpcy5vcHRpb25zLm9uQ29tcGxldGUgfHwgUHJvdG90eXBlLmVtcHR5RnVuY3Rpb247DQogICAgdGhpcy5vcHRpb25zLm9uQ29tcGxldGUgPSAoZnVuY3Rpb24odHJhbnNwb3J0LCBwYXJhbSkgew0KICAgICAgdGhpcy51cGRhdGVDb250ZW50KCk7DQogICAgICBvbkNvbXBsZXRlKHRyYW5zcG9ydCwgcGFyYW0pOw0KICAgIH0pLmJpbmQodGhpcyk7DQoNCiAgICB0aGlzLnJlcXVlc3QodXJsKTsNCiAgfSwNCg0KICB1cGRhdGVDb250ZW50OiBmdW5jdGlvbigpIHsNCiAgICB2YXIgcmVjZWl2ZXIgPSB0aGlzLmNvbnRhaW5lclt0aGlzLnN1Y2Nlc3MoKSA/ICdzdWNjZXNzJyA6ICdmYWlsdXJlJ107DQogICAgdmFyIHJlc3BvbnNlID0gdGhpcy50cmFuc3BvcnQucmVzcG9uc2VUZXh0Ow0KDQogICAgaWYgKCF0aGlzLm9wdGlvbnMuZXZhbFNjcmlwdHMpIHJlc3BvbnNlID0gcmVzcG9uc2Uuc3RyaXBTY3JpcHRzKCk7DQoNCiAgICBpZiAocmVjZWl2ZXIgPSAkKHJlY2VpdmVyKSkgew0KICAgICAgaWYgKHRoaXMub3B0aW9ucy5pbnNlcnRpb24pDQogICAgICAgIG5ldyB0aGlzLm9wdGlvbnMuaW5zZXJ0aW9uKHJlY2VpdmVyLCByZXNwb25zZSk7DQogICAgICBlbHNlDQogICAgICAgIHJlY2VpdmVyLnVwZGF0ZShyZXNwb25zZSk7DQogICAgfQ0KDQogICAgaWYgKHRoaXMuc3VjY2VzcygpKSB7DQogICAgICBpZiAodGhpcy5vbkNvbXBsZXRlKQ0KICAgICAgICBzZXRUaW1lb3V0KHRoaXMub25Db21wbGV0ZS5iaW5kKHRoaXMpLCAxMCk7DQogICAgfQ0KICB9DQp9KTsNCg0KQWpheC5QZXJpb2RpY2FsVXBkYXRlciA9IENsYXNzLmNyZWF0ZSgpOw0KQWpheC5QZXJpb2RpY2FsVXBkYXRlci5wcm90b3R5cGUgPSBPYmplY3QuZXh0ZW5kKG5ldyBBamF4LkJhc2UoKSwgew0KICBpbml0aWFsaXplOiBmdW5jdGlvbihjb250YWluZXIsIHVybCwgb3B0aW9ucykgew0KICAgIHRoaXMuc2V0T3B0aW9ucyhvcHRpb25zKTsNCiAgICB0aGlzLm9uQ29tcGxldGUgPSB0aGlzLm9wdGlvbnMub25Db21wbGV0ZTsNCg0KICAgIHRoaXMuZnJlcXVlbmN5ID0gKHRoaXMub3B0aW9ucy5mcmVxdWVuY3kgfHwgMik7DQogICAgdGhpcy5kZWNheSA9ICh0aGlzLm9wdGlvbnMuZGVjYXkgfHwgMSk7DQoNCiAgICB0aGlzLnVwZGF0ZXIgPSB7fTsNCiAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsNCiAgICB0aGlzLnVybCA9IHVybDsNCg0KICAgIHRoaXMuc3RhcnQoKTsNCiAgfSwNCg0KICBzdGFydDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5vcHRpb25zLm9uQ29tcGxldGUgPSB0aGlzLnVwZGF0ZUNvbXBsZXRlLmJpbmQodGhpcyk7DQogICAgdGhpcy5vblRpbWVyRXZlbnQoKTsNCiAgfSwNCg0KICBzdG9wOiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLnVwZGF0ZXIub3B0aW9ucy5vbkNvbXBsZXRlID0gdW5kZWZpbmVkOw0KICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKTsNCiAgICAodGhpcy5vbkNvbXBsZXRlIHx8IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOw0KICB9LA0KDQogIHVwZGF0ZUNvbXBsZXRlOiBmdW5jdGlvbihyZXF1ZXN0KSB7DQogICAgaWYgKHRoaXMub3B0aW9ucy5kZWNheSkgew0KICAgICAgdGhpcy5kZWNheSA9IChyZXF1ZXN0LnJlc3BvbnNlVGV4dCA9PSB0aGlzLmxhc3RUZXh0ID8NCiAgICAgICAgdGhpcy5kZWNheSAqIHRoaXMub3B0aW9ucy5kZWNheSA6IDEpOw0KDQogICAgICB0aGlzLmxhc3RUZXh0ID0gcmVxdWVzdC5yZXNwb25zZVRleHQ7DQogICAgfQ0KICAgIHRoaXMudGltZXIgPSBzZXRUaW1lb3V0KHRoaXMub25UaW1lckV2ZW50LmJpbmQodGhpcyksDQogICAgICB0aGlzLmRlY2F5ICogdGhpcy5mcmVxdWVuY3kgKiAxMDAwKTsNCiAgfSwNCg0KICBvblRpbWVyRXZlbnQ6IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMudXBkYXRlciA9IG5ldyBBamF4LlVwZGF0ZXIodGhpcy5jb250YWluZXIsIHRoaXMudXJsLCB0aGlzLm9wdGlvbnMpOw0KICB9DQp9KTsNCmZ1bmN0aW9uICQoZWxlbWVudCkgew0KICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHsNCiAgICBmb3IgKHZhciBpID0gMCwgZWxlbWVudHMgPSBbXSwgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQ0KICAgICAgZWxlbWVudHMucHVzaCgkKGFyZ3VtZW50c1tpXSkpOw0KICAgIHJldHVybiBlbGVtZW50czsNCiAgfQ0KICBpZiAodHlwZW9mIGVsZW1lbnQgPT0gJ3N0cmluZycpDQogICAgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnQpOw0KICByZXR1cm4gRWxlbWVudC5leHRlbmQoZWxlbWVudCk7DQp9DQoNCmlmIChQcm90b3R5cGUuQnJvd3NlckZlYXR1cmVzLlhQYXRoKSB7DQogIGRvY3VtZW50Ll9nZXRFbGVtZW50c0J5WFBhdGggPSBmdW5jdGlvbihleHByZXNzaW9uLCBwYXJlbnRFbGVtZW50KSB7DQogICAgdmFyIHJlc3VsdHMgPSBbXTsNCiAgICB2YXIgcXVlcnkgPSBkb2N1bWVudC5ldmFsdWF0ZShleHByZXNzaW9uLCAkKHBhcmVudEVsZW1lbnQpIHx8IGRvY3VtZW50LA0KICAgICAgbnVsbCwgWFBhdGhSZXN1bHQuT1JERVJFRF9OT0RFX1NOQVBTSE9UX1RZUEUsIG51bGwpOw0KICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBxdWVyeS5zbmFwc2hvdExlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQ0KICAgICAgcmVzdWx0cy5wdXNoKHF1ZXJ5LnNuYXBzaG90SXRlbShpKSk7DQogICAgcmV0dXJuIHJlc3VsdHM7DQogIH07DQoNCiAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSA9IGZ1bmN0aW9uKGNsYXNzTmFtZSwgcGFyZW50RWxlbWVudCkgew0KICAgIHZhciBxID0gIi4vLypbY29udGFpbnMoY29uY2F0KCcgJywgQGNsYXNzLCAnICcpLCAnICIgKyBjbGFzc05hbWUgKyAiICcpXSI7DQogICAgcmV0dXJuIGRvY3VtZW50Ll9nZXRFbGVtZW50c0J5WFBhdGgocSwgcGFyZW50RWxlbWVudCk7DQogIH0NCg0KfSBlbHNlIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBmdW5jdGlvbihjbGFzc05hbWUsIHBhcmVudEVsZW1lbnQpIHsNCiAgdmFyIGNoaWxkcmVuID0gKCQocGFyZW50RWxlbWVudCkgfHwgZG9jdW1lbnQuYm9keSkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJyonKTsNCiAgdmFyIGVsZW1lbnRzID0gW10sIGNoaWxkOw0KICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICBjaGlsZCA9IGNoaWxkcmVuW2ldOw0KICAgIGlmIChFbGVtZW50Lmhhc0NsYXNzTmFtZShjaGlsZCwgY2xhc3NOYW1lKSkNCiAgICAgIGVsZW1lbnRzLnB1c2goRWxlbWVudC5leHRlbmQoY2hpbGQpKTsNCiAgfQ0KICByZXR1cm4gZWxlbWVudHM7DQp9Ow0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KaWYgKCF3aW5kb3cuRWxlbWVudCkgdmFyIEVsZW1lbnQgPSB7fTsNCg0KRWxlbWVudC5leHRlbmQgPSBmdW5jdGlvbihlbGVtZW50KSB7DQogIHZhciBGID0gUHJvdG90eXBlLkJyb3dzZXJGZWF0dXJlczsNCiAgaWYgKCFlbGVtZW50IHx8ICFlbGVtZW50LnRhZ05hbWUgfHwgZWxlbWVudC5ub2RlVHlwZSA9PSAzIHx8DQogICBlbGVtZW50Ll9leHRlbmRlZCB8fCBGLlNwZWNpZmljRWxlbWVudEV4dGVuc2lvbnMgfHwgZWxlbWVudCA9PSB3aW5kb3cpDQogICAgcmV0dXJuIGVsZW1lbnQ7DQoNCiAgdmFyIG1ldGhvZHMgPSB7fSwgdGFnTmFtZSA9IGVsZW1lbnQudGFnTmFtZSwgY2FjaGUgPSBFbGVtZW50LmV4dGVuZC5jYWNoZSwNCiAgIFQgPSBFbGVtZW50Lk1ldGhvZHMuQnlUYWc7DQoNCiAgLy8gZXh0ZW5kIG1ldGhvZHMgZm9yIGFsbCB0YWdzIChTYWZhcmkgZG9lc24ndCBuZWVkIHRoaXMpDQogIGlmICghRi5FbGVtZW50RXh0ZW5zaW9ucykgew0KICAgIE9iamVjdC5leHRlbmQobWV0aG9kcywgRWxlbWVudC5NZXRob2RzKSwNCiAgICBPYmplY3QuZXh0ZW5kKG1ldGhvZHMsIEVsZW1lbnQuTWV0aG9kcy5TaW11bGF0ZWQpOw0KICB9DQoNCiAgLy8gZXh0ZW5kIG1ldGhvZHMgZm9yIHNwZWNpZmljIHRhZ3MNCiAgaWYgKFRbdGFnTmFtZV0pIE9iamVjdC5leHRlbmQobWV0aG9kcywgVFt0YWdOYW1lXSk7DQoNCiAgZm9yICh2YXIgcHJvcGVydHkgaW4gbWV0aG9kcykgew0KICAgIHZhciB2YWx1ZSA9IG1ldGhvZHNbcHJvcGVydHldOw0KICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJyAmJiAhKHByb3BlcnR5IGluIGVsZW1lbnQpKQ0KICAgICAgZWxlbWVudFtwcm9wZXJ0eV0gPSBjYWNoZS5maW5kT3JTdG9yZSh2YWx1ZSk7DQogIH0NCg0KICBlbGVtZW50Ll9leHRlbmRlZCA9IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uOw0KICByZXR1cm4gZWxlbWVudDsNCn07DQoNCkVsZW1lbnQuZXh0ZW5kLmNhY2hlID0gew0KICBmaW5kT3JTdG9yZTogZnVuY3Rpb24odmFsdWUpIHsNCiAgICByZXR1cm4gdGhpc1t2YWx1ZV0gPSB0aGlzW3ZhbHVlXSB8fCBmdW5jdGlvbigpIHsNCiAgICAgIHJldHVybiB2YWx1ZS5hcHBseShudWxsLCBbdGhpc10uY29uY2F0KCRBKGFyZ3VtZW50cykpKTsNCiAgICB9DQogIH0NCn07DQoNCkVsZW1lbnQuTWV0aG9kcyA9IHsNCiAgdmlzaWJsZTogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgIHJldHVybiAkKGVsZW1lbnQpLnN0eWxlLmRpc3BsYXkgIT0gJ25vbmUnOw0KICB9LA0KDQogIHRvZ2dsZTogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KICAgIEVsZW1lbnRbRWxlbWVudC52aXNpYmxlKGVsZW1lbnQpID8gJ2hpZGUnIDogJ3Nob3cnXShlbGVtZW50KTsNCiAgICByZXR1cm4gZWxlbWVudDsNCiAgfSwNCg0KICBoaWRlOiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgJChlbGVtZW50KS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KICAgIHJldHVybiBlbGVtZW50Ow0KICB9LA0KDQogIHNob3c6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICAkKGVsZW1lbnQpLnN0eWxlLmRpc3BsYXkgPSAnJzsNCiAgICByZXR1cm4gZWxlbWVudDsNCiAgfSwNCg0KICByZW1vdmU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsNCiAgICBlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlbWVudCk7DQogICAgcmV0dXJuIGVsZW1lbnQ7DQogIH0sDQoNCiAgdXBkYXRlOiBmdW5jdGlvbihlbGVtZW50LCBodG1sKSB7DQogICAgaHRtbCA9IHR5cGVvZiBodG1sID09ICd1bmRlZmluZWQnID8gJycgOiBodG1sLnRvU3RyaW5nKCk7DQogICAgJChlbGVtZW50KS5pbm5lckhUTUwgPSBodG1sLnN0cmlwU2NyaXB0cygpOw0KICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7aHRtbC5ldmFsU2NyaXB0cygpfSwgMTApOw0KICAgIHJldHVybiBlbGVtZW50Ow0KICB9LA0KDQogIHJlcGxhY2U6IGZ1bmN0aW9uKGVsZW1lbnQsIGh0bWwpIHsNCiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsNCiAgICBodG1sID0gdHlwZW9mIGh0bWwgPT0gJ3VuZGVmaW5lZCcgPyAnJyA6IGh0bWwudG9TdHJpbmcoKTsNCiAgICBpZiAoZWxlbWVudC5vdXRlckhUTUwpIHsNCiAgICAgIGVsZW1lbnQub3V0ZXJIVE1MID0gaHRtbC5zdHJpcFNjcmlwdHMoKTsNCiAgICB9IGVsc2Ugew0KICAgICAgdmFyIHJhbmdlID0gZWxlbWVudC5vd25lckRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7DQogICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWxlbWVudCk7DQogICAgICBlbGVtZW50LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKA0KICAgICAgICByYW5nZS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoaHRtbC5zdHJpcFNjcmlwdHMoKSksIGVsZW1lbnQpOw0KICAgIH0NCiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge2h0bWwuZXZhbFNjcmlwdHMoKX0sIDEwKTsNCiAgICByZXR1cm4gZWxlbWVudDsNCiAgfSwNCg0KICBpbnNwZWN0OiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogICAgdmFyIHJlc3VsdCA9ICc8JyArIGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpOw0KICAgICRIKHsnaWQnOiAnaWQnLCAnY2xhc3NOYW1lJzogJ2NsYXNzJ30pLmVhY2goZnVuY3Rpb24ocGFpcikgew0KICAgICAgdmFyIHByb3BlcnR5ID0gcGFpci5maXJzdCgpLCBhdHRyaWJ1dGUgPSBwYWlyLmxhc3QoKTsNCiAgICAgIHZhciB2YWx1ZSA9IChlbGVtZW50W3Byb3BlcnR5XSB8fCAnJykudG9TdHJpbmcoKTsNCiAgICAgIGlmICh2YWx1ZSkgcmVzdWx0ICs9ICcgJyArIGF0dHJpYnV0ZSArICc9JyArIHZhbHVlLmluc3BlY3QodHJ1ZSk7DQogICAgfSk7DQogICAgcmV0dXJuIHJlc3VsdCArICc+JzsNCiAgfSwNCg0KICByZWN1cnNpdmVseUNvbGxlY3Q6IGZ1bmN0aW9uKGVsZW1lbnQsIHByb3BlcnR5KSB7DQogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogICAgdmFyIGVsZW1lbnRzID0gW107DQogICAgd2hpbGUgKGVsZW1lbnQgPSBlbGVtZW50W3Byb3BlcnR5XSkNCiAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09IDEpDQogICAgICAgIGVsZW1lbnRzLnB1c2goRWxlbWVudC5leHRlbmQoZWxlbWVudCkpOw0KICAgIHJldHVybiBlbGVtZW50czsNCiAgfSwNCg0KICBhbmNlc3RvcnM6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICByZXR1cm4gJChlbGVtZW50KS5yZWN1cnNpdmVseUNvbGxlY3QoJ3BhcmVudE5vZGUnKTsNCiAgfSwNCg0KICBkZXNjZW5kYW50czogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgIHJldHVybiAkQSgkKGVsZW1lbnQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCcqJykpLmVhY2goRWxlbWVudC5leHRlbmQpOw0KICB9LA0KDQogIGZpcnN0RGVzY2VuZGFudDogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpLmZpcnN0Q2hpbGQ7DQogICAgd2hpbGUgKGVsZW1lbnQgJiYgZWxlbWVudC5ub2RlVHlwZSAhPSAxKSBlbGVtZW50ID0gZWxlbWVudC5uZXh0U2libGluZzsNCiAgICByZXR1cm4gJChlbGVtZW50KTsNCiAgfSwNCg0KICBpbW1lZGlhdGVEZXNjZW5kYW50czogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgIGlmICghKGVsZW1lbnQgPSAkKGVsZW1lbnQpLmZpcnN0Q2hpbGQpKSByZXR1cm4gW107DQogICAgd2hpbGUgKGVsZW1lbnQgJiYgZWxlbWVudC5ub2RlVHlwZSAhPSAxKSBlbGVtZW50ID0gZWxlbWVudC5uZXh0U2libGluZzsNCiAgICBpZiAoZWxlbWVudCkgcmV0dXJuIFtlbGVtZW50XS5jb25jYXQoJChlbGVtZW50KS5uZXh0U2libGluZ3MoKSk7DQogICAgcmV0dXJuIFtdOw0KICB9LA0KDQogIHByZXZpb3VzU2libGluZ3M6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICByZXR1cm4gJChlbGVtZW50KS5yZWN1cnNpdmVseUNvbGxlY3QoJ3ByZXZpb3VzU2libGluZycpOw0KICB9LA0KDQogIG5leHRTaWJsaW5nczogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgIHJldHVybiAkKGVsZW1lbnQpLnJlY3Vyc2l2ZWx5Q29sbGVjdCgnbmV4dFNpYmxpbmcnKTsNCiAgfSwNCg0KICBzaWJsaW5nczogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KICAgIHJldHVybiBlbGVtZW50LnByZXZpb3VzU2libGluZ3MoKS5yZXZlcnNlKCkuY29uY2F0KGVsZW1lbnQubmV4dFNpYmxpbmdzKCkpOw0KICB9LA0KDQogIG1hdGNoOiBmdW5jdGlvbihlbGVtZW50LCBzZWxlY3Rvcikgew0KICAgIGlmICh0eXBlb2Ygc2VsZWN0b3IgPT0gJ3N0cmluZycpDQogICAgICBzZWxlY3RvciA9IG5ldyBTZWxlY3RvcihzZWxlY3Rvcik7DQogICAgcmV0dXJuIHNlbGVjdG9yLm1hdGNoKCQoZWxlbWVudCkpOw0KICB9LA0KDQogIHVwOiBmdW5jdGlvbihlbGVtZW50LCBleHByZXNzaW9uLCBpbmRleCkgew0KICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHJldHVybiAkKGVsZW1lbnQucGFyZW50Tm9kZSk7DQogICAgdmFyIGFuY2VzdG9ycyA9IGVsZW1lbnQuYW5jZXN0b3JzKCk7DQogICAgcmV0dXJuIGV4cHJlc3Npb24gPyBTZWxlY3Rvci5maW5kRWxlbWVudChhbmNlc3RvcnMsIGV4cHJlc3Npb24sIGluZGV4KSA6DQogICAgICBhbmNlc3RvcnNbaW5kZXggfHwgMF07DQogIH0sDQoNCiAgZG93bjogZnVuY3Rpb24oZWxlbWVudCwgZXhwcmVzc2lvbiwgaW5kZXgpIHsNCiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsNCiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSByZXR1cm4gZWxlbWVudC5maXJzdERlc2NlbmRhbnQoKTsNCiAgICB2YXIgZGVzY2VuZGFudHMgPSBlbGVtZW50LmRlc2NlbmRhbnRzKCk7DQogICAgcmV0dXJuIGV4cHJlc3Npb24gPyBTZWxlY3Rvci5maW5kRWxlbWVudChkZXNjZW5kYW50cywgZXhwcmVzc2lvbiwgaW5kZXgpIDoNCiAgICAgIGRlc2NlbmRhbnRzW2luZGV4IHx8IDBdOw0KICB9LA0KDQogIHByZXZpb3VzOiBmdW5jdGlvbihlbGVtZW50LCBleHByZXNzaW9uLCBpbmRleCkgew0KICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHJldHVybiAkKFNlbGVjdG9yLmhhbmRsZXJzLnByZXZpb3VzRWxlbWVudFNpYmxpbmcoZWxlbWVudCkpOw0KICAgIHZhciBwcmV2aW91c1NpYmxpbmdzID0gZWxlbWVudC5wcmV2aW91c1NpYmxpbmdzKCk7DQogICAgcmV0dXJuIGV4cHJlc3Npb24gPyBTZWxlY3Rvci5maW5kRWxlbWVudChwcmV2aW91c1NpYmxpbmdzLCBleHByZXNzaW9uLCBpbmRleCkgOg0KICAgICAgcHJldmlvdXNTaWJsaW5nc1tpbmRleCB8fCAwXTsNCiAgfSwNCg0KICBuZXh0OiBmdW5jdGlvbihlbGVtZW50LCBleHByZXNzaW9uLCBpbmRleCkgew0KICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHJldHVybiAkKFNlbGVjdG9yLmhhbmRsZXJzLm5leHRFbGVtZW50U2libGluZyhlbGVtZW50KSk7DQogICAgdmFyIG5leHRTaWJsaW5ncyA9IGVsZW1lbnQubmV4dFNpYmxpbmdzKCk7DQogICAgcmV0dXJuIGV4cHJlc3Npb24gPyBTZWxlY3Rvci5maW5kRWxlbWVudChuZXh0U2libGluZ3MsIGV4cHJlc3Npb24sIGluZGV4KSA6DQogICAgICBuZXh0U2libGluZ3NbaW5kZXggfHwgMF07DQogIH0sDQoNCiAgZ2V0RWxlbWVudHNCeVNlbGVjdG9yOiBmdW5jdGlvbigpIHsNCiAgICB2YXIgYXJncyA9ICRBKGFyZ3VtZW50cyksIGVsZW1lbnQgPSAkKGFyZ3Muc2hpZnQoKSk7DQogICAgcmV0dXJuIFNlbGVjdG9yLmZpbmRDaGlsZEVsZW1lbnRzKGVsZW1lbnQsIGFyZ3MpOw0KICB9LA0KDQogIGdldEVsZW1lbnRzQnlDbGFzc05hbWU6IGZ1bmN0aW9uKGVsZW1lbnQsIGNsYXNzTmFtZSkgew0KICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGNsYXNzTmFtZSwgZWxlbWVudCk7DQogIH0sDQoNCiAgcmVhZEF0dHJpYnV0ZTogZnVuY3Rpb24oZWxlbWVudCwgbmFtZSkgew0KICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KICAgIGlmIChQcm90b3R5cGUuQnJvd3Nlci5JRSkgew0KICAgICAgaWYgKCFlbGVtZW50LmF0dHJpYnV0ZXMpIHJldHVybiBudWxsOw0KICAgICAgdmFyIHQgPSBFbGVtZW50Ll9hdHRyaWJ1dGVUcmFuc2xhdGlvbnM7DQogICAgICBpZiAodC52YWx1ZXNbbmFtZV0pIHJldHVybiB0LnZhbHVlc1tuYW1lXShlbGVtZW50LCBuYW1lKTsNCiAgICAgIGlmICh0Lm5hbWVzW25hbWVdKSAgbmFtZSA9IHQubmFtZXNbbmFtZV07DQogICAgICB2YXIgYXR0cmlidXRlID0gZWxlbWVudC5hdHRyaWJ1dGVzW25hbWVdOw0KICAgICAgcmV0dXJuIGF0dHJpYnV0ZSA/IGF0dHJpYnV0ZS5ub2RlVmFsdWUgOiBudWxsOw0KICAgIH0NCiAgICByZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUobmFtZSk7DQogIH0sDQoNCiAgZ2V0SGVpZ2h0OiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgcmV0dXJuICQoZWxlbWVudCkuZ2V0RGltZW5zaW9ucygpLmhlaWdodDsNCiAgfSwNCg0KICBnZXRXaWR0aDogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgIHJldHVybiAkKGVsZW1lbnQpLmdldERpbWVuc2lvbnMoKS53aWR0aDsNCiAgfSwNCg0KICBjbGFzc05hbWVzOiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgcmV0dXJuIG5ldyBFbGVtZW50LkNsYXNzTmFtZXMoZWxlbWVudCk7DQogIH0sDQoNCiAgaGFzQ2xhc3NOYW1lOiBmdW5jdGlvbihlbGVtZW50LCBjbGFzc05hbWUpIHsNCiAgICBpZiAoIShlbGVtZW50ID0gJChlbGVtZW50KSkpIHJldHVybjsNCiAgICB2YXIgZWxlbWVudENsYXNzTmFtZSA9IGVsZW1lbnQuY2xhc3NOYW1lOw0KICAgIGlmIChlbGVtZW50Q2xhc3NOYW1lLmxlbmd0aCA9PSAwKSByZXR1cm4gZmFsc2U7DQogICAgaWYgKGVsZW1lbnRDbGFzc05hbWUgPT0gY2xhc3NOYW1lIHx8DQogICAgICAgIGVsZW1lbnRDbGFzc05hbWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58XFxzKSIgKyBjbGFzc05hbWUgKyAiKFxcc3wkKSIpKSkNCiAgICAgIHJldHVybiB0cnVlOw0KICAgIHJldHVybiBmYWxzZTsNCiAgfSwNCg0KICBhZGRDbGFzc05hbWU6IGZ1bmN0aW9uKGVsZW1lbnQsIGNsYXNzTmFtZSkgew0KICAgIGlmICghKGVsZW1lbnQgPSAkKGVsZW1lbnQpKSkgcmV0dXJuOw0KICAgIEVsZW1lbnQuY2xhc3NOYW1lcyhlbGVtZW50KS5hZGQoY2xhc3NOYW1lKTsNCiAgICByZXR1cm4gZWxlbWVudDsNCiAgfSwNCg0KICByZW1vdmVDbGFzc05hbWU6IGZ1bmN0aW9uKGVsZW1lbnQsIGNsYXNzTmFtZSkgew0KICAgIGlmICghKGVsZW1lbnQgPSAkKGVsZW1lbnQpKSkgcmV0dXJuOw0KICAgIEVsZW1lbnQuY2xhc3NOYW1lcyhlbGVtZW50KS5yZW1vdmUoY2xhc3NOYW1lKTsNCiAgICByZXR1cm4gZWxlbWVudDsNCiAgfSwNCg0KICB0b2dnbGVDbGFzc05hbWU6IGZ1bmN0aW9uKGVsZW1lbnQsIGNsYXNzTmFtZSkgew0KICAgIGlmICghKGVsZW1lbnQgPSAkKGVsZW1lbnQpKSkgcmV0dXJuOw0KICAgIEVsZW1lbnQuY2xhc3NOYW1lcyhlbGVtZW50KVtlbGVtZW50Lmhhc0NsYXNzTmFtZShjbGFzc05hbWUpID8gJ3JlbW92ZScgOiAnYWRkJ10oY2xhc3NOYW1lKTsNCiAgICByZXR1cm4gZWxlbWVudDsNCiAgfSwNCg0KICBvYnNlcnZlOiBmdW5jdGlvbigpIHsNCiAgICBFdmVudC5vYnNlcnZlLmFwcGx5KEV2ZW50LCBhcmd1bWVudHMpOw0KICAgIHJldHVybiAkQShhcmd1bWVudHMpLmZpcnN0KCk7DQogIH0sDQoNCiAgc3RvcE9ic2VydmluZzogZnVuY3Rpb24oKSB7DQogICAgRXZlbnQuc3RvcE9ic2VydmluZy5hcHBseShFdmVudCwgYXJndW1lbnRzKTsNCiAgICByZXR1cm4gJEEoYXJndW1lbnRzKS5maXJzdCgpOw0KICB9LA0KDQogIC8vIHJlbW92ZXMgd2hpdGVzcGFjZS1vbmx5IHRleHQgbm9kZSBjaGlsZHJlbg0KICBjbGVhbldoaXRlc3BhY2U6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsNCiAgICB2YXIgbm9kZSA9IGVsZW1lbnQuZmlyc3RDaGlsZDsNCiAgICB3aGlsZSAobm9kZSkgew0KICAgICAgdmFyIG5leHROb2RlID0gbm9kZS5uZXh0U2libGluZzsNCiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDMgJiYgIS9cUy8udGVzdChub2RlLm5vZGVWYWx1ZSkpDQogICAgICAgIGVsZW1lbnQucmVtb3ZlQ2hpbGQobm9kZSk7DQogICAgICBub2RlID0gbmV4dE5vZGU7DQogICAgfQ0KICAgIHJldHVybiBlbGVtZW50Ow0KICB9LA0KDQogIGVtcHR5OiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgcmV0dXJuICQoZWxlbWVudCkuaW5uZXJIVE1MLmJsYW5rKCk7DQogIH0sDQoNCiAgZGVzY2VuZGFudE9mOiBmdW5jdGlvbihlbGVtZW50LCBhbmNlc3Rvcikgew0KICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpLCBhbmNlc3RvciA9ICQoYW5jZXN0b3IpOw0KICAgIHdoaWxlIChlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlKQ0KICAgICAgaWYgKGVsZW1lbnQgPT0gYW5jZXN0b3IpIHJldHVybiB0cnVlOw0KICAgIHJldHVybiBmYWxzZTsNCiAgfSwNCg0KICBzY3JvbGxUbzogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KICAgIHZhciBwb3MgPSBQb3NpdGlvbi5jdW11bGF0aXZlT2Zmc2V0KGVsZW1lbnQpOw0KICAgIHdpbmRvdy5zY3JvbGxUbyhwb3NbMF0sIHBvc1sxXSk7DQogICAgcmV0dXJuIGVsZW1lbnQ7DQogIH0sDQoNCiAgZ2V0U3R5bGU6IGZ1bmN0aW9uKGVsZW1lbnQsIHN0eWxlKSB7DQogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogICAgc3R5bGUgPSBzdHlsZSA9PSAnZmxvYXQnID8gJ2Nzc0Zsb2F0JyA6IHN0eWxlLmNhbWVsaXplKCk7DQogICAgdmFyIHZhbHVlID0gZWxlbWVudC5zdHlsZVtzdHlsZV07DQogICAgaWYgKCF2YWx1ZSkgew0KICAgICAgdmFyIGNzcyA9IGRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCwgbnVsbCk7DQogICAgICB2YWx1ZSA9IGNzcyA/IGNzc1tzdHlsZV0gOiBudWxsOw0KICAgIH0NCiAgICBpZiAoc3R5bGUgPT0gJ29wYWNpdHknKSByZXR1cm4gdmFsdWUgPyBwYXJzZUZsb2F0KHZhbHVlKSA6IDEuMDsNCiAgICByZXR1cm4gdmFsdWUgPT0gJ2F1dG8nID8gbnVsbCA6IHZhbHVlOw0KICB9LA0KDQogIGdldE9wYWNpdHk6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICByZXR1cm4gJChlbGVtZW50KS5nZXRTdHlsZSgnb3BhY2l0eScpOw0KICB9LA0KDQogIHNldFN0eWxlOiBmdW5jdGlvbihlbGVtZW50LCBzdHlsZXMsIGNhbWVsaXplZCkgew0KICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KICAgIHZhciBlbGVtZW50U3R5bGUgPSBlbGVtZW50LnN0eWxlOw0KDQogICAgZm9yICh2YXIgcHJvcGVydHkgaW4gc3R5bGVzKQ0KICAgICAgaWYgKHByb3BlcnR5ID09ICdvcGFjaXR5JykgZWxlbWVudC5zZXRPcGFjaXR5KHN0eWxlc1twcm9wZXJ0eV0pDQogICAgICBlbHNlDQogICAgICAgIGVsZW1lbnRTdHlsZVsocHJvcGVydHkgPT0gJ2Zsb2F0JyB8fCBwcm9wZXJ0eSA9PSAnY3NzRmxvYXQnKSA/DQogICAgICAgICAgKGVsZW1lbnRTdHlsZS5zdHlsZUZsb2F0ID09PSB1bmRlZmluZWQgPyAnY3NzRmxvYXQnIDogJ3N0eWxlRmxvYXQnKSA6DQogICAgICAgICAgKGNhbWVsaXplZCA/IHByb3BlcnR5IDogcHJvcGVydHkuY2FtZWxpemUoKSldID0gc3R5bGVzW3Byb3BlcnR5XTsNCg0KICAgIHJldHVybiBlbGVtZW50Ow0KICB9LA0KDQogIHNldE9wYWNpdHk6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlKSB7DQogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogICAgZWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gKHZhbHVlID09IDEgfHwgdmFsdWUgPT09ICcnKSA/ICcnIDoNCiAgICAgICh2YWx1ZSA8IDAuMDAwMDEpID8gMCA6IHZhbHVlOw0KICAgIHJldHVybiBlbGVtZW50Ow0KICB9LA0KDQogIGdldERpbWVuc2lvbnM6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsNCiAgICB2YXIgZGlzcGxheSA9ICQoZWxlbWVudCkuZ2V0U3R5bGUoJ2Rpc3BsYXknKTsNCiAgICBpZiAoZGlzcGxheSAhPSAnbm9uZScgJiYgZGlzcGxheSAhPSBudWxsKSAvLyBTYWZhcmkgYnVnDQogICAgICByZXR1cm4ge3dpZHRoOiBlbGVtZW50Lm9mZnNldFdpZHRoLCBoZWlnaHQ6IGVsZW1lbnQub2Zmc2V0SGVpZ2h0fTsNCg0KICAgIC8vIEFsbCAqV2lkdGggYW5kICpIZWlnaHQgcHJvcGVydGllcyBnaXZlIDAgb24gZWxlbWVudHMgd2l0aCBkaXNwbGF5IG5vbmUsDQogICAgLy8gc28gZW5hYmxlIHRoZSBlbGVtZW50IHRlbXBvcmFyaWx5DQogICAgdmFyIGVscyA9IGVsZW1lbnQuc3R5bGU7DQogICAgdmFyIG9yaWdpbmFsVmlzaWJpbGl0eSA9IGVscy52aXNpYmlsaXR5Ow0KICAgIHZhciBvcmlnaW5hbFBvc2l0aW9uID0gZWxzLnBvc2l0aW9uOw0KICAgIHZhciBvcmlnaW5hbERpc3BsYXkgPSBlbHMuZGlzcGxheTsNCiAgICBlbHMudmlzaWJpbGl0eSA9ICdoaWRkZW4nOw0KICAgIGVscy5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7DQogICAgZWxzLmRpc3BsYXkgPSAnYmxvY2snOw0KICAgIHZhciBvcmlnaW5hbFdpZHRoID0gZWxlbWVudC5jbGllbnRXaWR0aDsNCiAgICB2YXIgb3JpZ2luYWxIZWlnaHQgPSBlbGVtZW50LmNsaWVudEhlaWdodDsNCiAgICBlbHMuZGlzcGxheSA9IG9yaWdpbmFsRGlzcGxheTsNCiAgICBlbHMucG9zaXRpb24gPSBvcmlnaW5hbFBvc2l0aW9uOw0KICAgIGVscy52aXNpYmlsaXR5ID0gb3JpZ2luYWxWaXNpYmlsaXR5Ow0KICAgIHJldHVybiB7d2lkdGg6IG9yaWdpbmFsV2lkdGgsIGhlaWdodDogb3JpZ2luYWxIZWlnaHR9Ow0KICB9LA0KDQogIG1ha2VQb3NpdGlvbmVkOiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogICAgdmFyIHBvcyA9IEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwgJ3Bvc2l0aW9uJyk7DQogICAgaWYgKHBvcyA9PSAnc3RhdGljJyB8fCAhcG9zKSB7DQogICAgICBlbGVtZW50Ll9tYWRlUG9zaXRpb25lZCA9IHRydWU7DQogICAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJzsNCiAgICAgIC8vIE9wZXJhIHJldHVybnMgdGhlIG9mZnNldCByZWxhdGl2ZSB0byB0aGUgcG9zaXRpb25pbmcgY29udGV4dCwgd2hlbiBhbg0KICAgICAgLy8gZWxlbWVudCBpcyBwb3NpdGlvbiByZWxhdGl2ZSBidXQgdG9wIGFuZCBsZWZ0IGhhdmUgbm90IGJlZW4gZGVmaW5lZA0KICAgICAgaWYgKHdpbmRvdy5vcGVyYSkgew0KICAgICAgICBlbGVtZW50LnN0eWxlLnRvcCA9IDA7DQogICAgICAgIGVsZW1lbnQuc3R5bGUubGVmdCA9IDA7DQogICAgICB9DQogICAgfQ0KICAgIHJldHVybiBlbGVtZW50Ow0KICB9LA0KDQogIHVuZG9Qb3NpdGlvbmVkOiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogICAgaWYgKGVsZW1lbnQuX21hZGVQb3NpdGlvbmVkKSB7DQogICAgICBlbGVtZW50Ll9tYWRlUG9zaXRpb25lZCA9IHVuZGVmaW5lZDsNCiAgICAgIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPQ0KICAgICAgICBlbGVtZW50LnN0eWxlLnRvcCA9DQogICAgICAgIGVsZW1lbnQuc3R5bGUubGVmdCA9DQogICAgICAgIGVsZW1lbnQuc3R5bGUuYm90dG9tID0NCiAgICAgICAgZWxlbWVudC5zdHlsZS5yaWdodCA9ICcnOw0KICAgIH0NCiAgICByZXR1cm4gZWxlbWVudDsNCiAgfSwNCg0KICBtYWtlQ2xpcHBpbmc6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsNCiAgICBpZiAoZWxlbWVudC5fb3ZlcmZsb3cpIHJldHVybiBlbGVtZW50Ow0KICAgIGVsZW1lbnQuX292ZXJmbG93ID0gZWxlbWVudC5zdHlsZS5vdmVyZmxvdyB8fCAnYXV0byc7DQogICAgaWYgKChFbGVtZW50LmdldFN0eWxlKGVsZW1lbnQsICdvdmVyZmxvdycpIHx8ICd2aXNpYmxlJykgIT0gJ2hpZGRlbicpDQogICAgICBlbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7DQogICAgcmV0dXJuIGVsZW1lbnQ7DQogIH0sDQoNCiAgdW5kb0NsaXBwaW5nOiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogICAgaWYgKCFlbGVtZW50Ll9vdmVyZmxvdykgcmV0dXJuIGVsZW1lbnQ7DQogICAgZWxlbWVudC5zdHlsZS5vdmVyZmxvdyA9IGVsZW1lbnQuX292ZXJmbG93ID09ICdhdXRvJyA/ICcnIDogZWxlbWVudC5fb3ZlcmZsb3c7DQogICAgZWxlbWVudC5fb3ZlcmZsb3cgPSBudWxsOw0KICAgIHJldHVybiBlbGVtZW50Ow0KICB9DQp9Ow0KDQpPYmplY3QuZXh0ZW5kKEVsZW1lbnQuTWV0aG9kcywgew0KICBjaGlsZE9mOiBFbGVtZW50Lk1ldGhvZHMuZGVzY2VuZGFudE9mLA0KICBjaGlsZEVsZW1lbnRzOiBFbGVtZW50Lk1ldGhvZHMuaW1tZWRpYXRlRGVzY2VuZGFudHMNCn0pOw0KDQppZiAoUHJvdG90eXBlLkJyb3dzZXIuT3BlcmEpIHsNCiAgRWxlbWVudC5NZXRob2RzLl9nZXRTdHlsZSA9IEVsZW1lbnQuTWV0aG9kcy5nZXRTdHlsZTsNCiAgRWxlbWVudC5NZXRob2RzLmdldFN0eWxlID0gZnVuY3Rpb24oZWxlbWVudCwgc3R5bGUpIHsNCiAgICBzd2l0Y2goc3R5bGUpIHsNCiAgICAgIGNhc2UgJ2xlZnQnOg0KICAgICAgY2FzZSAndG9wJzoNCiAgICAgIGNhc2UgJ3JpZ2h0JzoNCiAgICAgIGNhc2UgJ2JvdHRvbSc6DQogICAgICAgIGlmIChFbGVtZW50Ll9nZXRTdHlsZShlbGVtZW50LCAncG9zaXRpb24nKSA9PSAnc3RhdGljJykgcmV0dXJuIG51bGw7DQogICAgICBkZWZhdWx0OiByZXR1cm4gRWxlbWVudC5fZ2V0U3R5bGUoZWxlbWVudCwgc3R5bGUpOw0KICAgIH0NCiAgfTsNCn0NCmVsc2UgaWYgKFByb3RvdHlwZS5Ccm93c2VyLklFKSB7DQogIEVsZW1lbnQuTWV0aG9kcy5nZXRTdHlsZSA9IGZ1bmN0aW9uKGVsZW1lbnQsIHN0eWxlKSB7DQogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogICAgc3R5bGUgPSAoc3R5bGUgPT0gJ2Zsb2F0JyB8fCBzdHlsZSA9PSAnY3NzRmxvYXQnKSA/ICdzdHlsZUZsb2F0JyA6IHN0eWxlLmNhbWVsaXplKCk7DQogICAgdmFyIHZhbHVlID0gZWxlbWVudC5zdHlsZVtzdHlsZV07DQogICAgaWYgKCF2YWx1ZSAmJiBlbGVtZW50LmN1cnJlbnRTdHlsZSkgdmFsdWUgPSBlbGVtZW50LmN1cnJlbnRTdHlsZVtzdHlsZV07DQoNCiAgICBpZiAoc3R5bGUgPT0gJ29wYWNpdHknKSB7DQogICAgICBpZiAodmFsdWUgPSAoZWxlbWVudC5nZXRTdHlsZSgnZmlsdGVyJykgfHwgJycpLm1hdGNoKC9hbHBoYVwob3BhY2l0eT0oLiopXCkvKSkNCiAgICAgICAgaWYgKHZhbHVlWzFdKSByZXR1cm4gcGFyc2VGbG9hdCh2YWx1ZVsxXSkgLyAxMDA7DQogICAgICByZXR1cm4gMS4wOw0KICAgIH0NCg0KICAgIGlmICh2YWx1ZSA9PSAnYXV0bycpIHsNCiAgICAgIGlmICgoc3R5bGUgPT0gJ3dpZHRoJyB8fCBzdHlsZSA9PSAnaGVpZ2h0JykgJiYgKGVsZW1lbnQuZ2V0U3R5bGUoJ2Rpc3BsYXknKSAhPSAnbm9uZScpKQ0KICAgICAgICByZXR1cm4gZWxlbWVudFsnb2Zmc2V0JytzdHlsZS5jYXBpdGFsaXplKCldICsgJ3B4JzsNCiAgICAgIHJldHVybiBudWxsOw0KICAgIH0NCiAgICByZXR1cm4gdmFsdWU7DQogIH07DQoNCiAgRWxlbWVudC5NZXRob2RzLnNldE9wYWNpdHkgPSBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZSkgew0KICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KICAgIHZhciBmaWx0ZXIgPSBlbGVtZW50LmdldFN0eWxlKCdmaWx0ZXInKSwgc3R5bGUgPSBlbGVtZW50LnN0eWxlOw0KICAgIGlmICh2YWx1ZSA9PSAxIHx8IHZhbHVlID09PSAnJykgew0KICAgICAgc3R5bGUuZmlsdGVyID0gZmlsdGVyLnJlcGxhY2UoL2FscGhhXChbXlwpXSpcKS9naSwnJyk7DQogICAgICByZXR1cm4gZWxlbWVudDsNCiAgICB9IGVsc2UgaWYgKHZhbHVlIDwgMC4wMDAwMSkgdmFsdWUgPSAwOw0KICAgIHN0eWxlLmZpbHRlciA9IGZpbHRlci5yZXBsYWNlKC9hbHBoYVwoW15cKV0qXCkvZ2ksICcnKSArDQogICAgICAnYWxwaGEob3BhY2l0eT0nICsgKHZhbHVlICogMTAwKSArICcpJzsNCiAgICByZXR1cm4gZWxlbWVudDsNCiAgfTsNCg0KICAvLyBJRSBpcyBtaXNzaW5nIC5pbm5lckhUTUwgc3VwcG9ydCBmb3IgVEFCTEUtcmVsYXRlZCBlbGVtZW50cw0KICBFbGVtZW50Lk1ldGhvZHMudXBkYXRlID0gZnVuY3Rpb24oZWxlbWVudCwgaHRtbCkgew0KICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KICAgIGh0bWwgPSB0eXBlb2YgaHRtbCA9PSAndW5kZWZpbmVkJyA/ICcnIDogaHRtbC50b1N0cmluZygpOw0KICAgIHZhciB0YWdOYW1lID0gZWxlbWVudC50YWdOYW1lLnRvVXBwZXJDYXNlKCk7DQogICAgaWYgKFsnVEhFQUQnLCdUQk9EWScsJ1RSJywnVEQnXS5pbmNsdWRlKHRhZ05hbWUpKSB7DQogICAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7DQogICAgICBzd2l0Y2ggKHRhZ05hbWUpIHsNCiAgICAgICAgY2FzZSAnVEhFQUQnOg0KICAgICAgICBjYXNlICdUQk9EWSc6DQogICAgICAgICAgZGl2LmlubmVySFRNTCA9ICc8dGFibGU+PHRib2R5PicgKyAgaHRtbC5zdHJpcFNjcmlwdHMoKSArICc8L3Rib2R5PjwvdGFibGU+JzsNCiAgICAgICAgICBkZXB0aCA9IDI7DQogICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgJ1RSJzoNCiAgICAgICAgICBkaXYuaW5uZXJIVE1MID0gJzx0YWJsZT48dGJvZHk+PHRyPicgKyAgaHRtbC5zdHJpcFNjcmlwdHMoKSArICc8L3RyPjwvdGJvZHk+PC90YWJsZT4nOw0KICAgICAgICAgIGRlcHRoID0gMzsNCiAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAnVEQnOg0KICAgICAgICAgIGRpdi5pbm5lckhUTUwgPSAnPHRhYmxlPjx0Ym9keT48dHI+PHRkPicgKyAgaHRtbC5zdHJpcFNjcmlwdHMoKSArICc8L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPic7DQogICAgICAgICAgZGVwdGggPSA0Ow0KICAgICAgfQ0KICAgICAgJEEoZWxlbWVudC5jaGlsZE5vZGVzKS5lYWNoKGZ1bmN0aW9uKG5vZGUpIHsgZWxlbWVudC5yZW1vdmVDaGlsZChub2RlKSB9KTsNCiAgICAgIGRlcHRoLnRpbWVzKGZ1bmN0aW9uKCkgeyBkaXYgPSBkaXYuZmlyc3RDaGlsZCB9KTsNCiAgICAgICRBKGRpdi5jaGlsZE5vZGVzKS5lYWNoKGZ1bmN0aW9uKG5vZGUpIHsgZWxlbWVudC5hcHBlbmRDaGlsZChub2RlKSB9KTsNCiAgICB9IGVsc2Ugew0KICAgICAgZWxlbWVudC5pbm5lckhUTUwgPSBodG1sLnN0cmlwU2NyaXB0cygpOw0KICAgIH0NCiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBodG1sLmV2YWxTY3JpcHRzKCkgfSwgMTApOw0KICAgIHJldHVybiBlbGVtZW50Ow0KICB9DQp9DQplbHNlIGlmIChQcm90b3R5cGUuQnJvd3Nlci5HZWNrbykgew0KICBFbGVtZW50Lk1ldGhvZHMuc2V0T3BhY2l0eSA9IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlKSB7DQogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogICAgZWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gKHZhbHVlID09IDEpID8gMC45OTk5OTkgOg0KICAgICAgKHZhbHVlID09PSAnJykgPyAnJyA6ICh2YWx1ZSA8IDAuMDAwMDEpID8gMCA6IHZhbHVlOw0KICAgIHJldHVybiBlbGVtZW50Ow0KICB9Ow0KfQ0KDQpFbGVtZW50Ll9hdHRyaWJ1dGVUcmFuc2xhdGlvbnMgPSB7DQogIG5hbWVzOiB7DQogICAgY29sc3BhbjogICAiY29sU3BhbiIsDQogICAgcm93c3BhbjogICAicm93U3BhbiIsDQogICAgdmFsaWduOiAgICAidkFsaWduIiwNCiAgICBkYXRldGltZTogICJkYXRlVGltZSIsDQogICAgYWNjZXNza2V5OiAiYWNjZXNzS2V5IiwNCiAgICB0YWJpbmRleDogICJ0YWJJbmRleCIsDQogICAgZW5jdHlwZTogICAiZW5jVHlwZSIsDQogICAgbWF4bGVuZ3RoOiAibWF4TGVuZ3RoIiwNCiAgICByZWFkb25seTogICJyZWFkT25seSIsDQogICAgbG9uZ2Rlc2M6ICAibG9uZ0Rlc2MiDQogIH0sDQogIHZhbHVlczogew0KICAgIF9nZXRBdHRyOiBmdW5jdGlvbihlbGVtZW50LCBhdHRyaWJ1dGUpIHsNCiAgICAgIHJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIDIpOw0KICAgIH0sDQogICAgX2ZsYWc6IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHJpYnV0ZSkgew0KICAgICAgcmV0dXJuICQoZWxlbWVudCkuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZSkgPyBhdHRyaWJ1dGUgOiBudWxsOw0KICAgIH0sDQogICAgc3R5bGU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICAgIHJldHVybiBlbGVtZW50LnN0eWxlLmNzc1RleHQudG9Mb3dlckNhc2UoKTsNCiAgICB9LA0KICAgIHRpdGxlOiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgICB2YXIgbm9kZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZSgndGl0bGUnKTsNCiAgICAgIHJldHVybiBub2RlLnNwZWNpZmllZCA/IG5vZGUubm9kZVZhbHVlIDogbnVsbDsNCiAgICB9DQogIH0NCn07DQoNCihmdW5jdGlvbigpIHsNCiAgT2JqZWN0LmV4dGVuZCh0aGlzLCB7DQogICAgaHJlZjogdGhpcy5fZ2V0QXR0ciwNCiAgICBzcmM6ICB0aGlzLl9nZXRBdHRyLA0KICAgIHR5cGU6IHRoaXMuX2dldEF0dHIsDQogICAgZGlzYWJsZWQ6IHRoaXMuX2ZsYWcsDQogICAgY2hlY2tlZDogIHRoaXMuX2ZsYWcsDQogICAgcmVhZG9ubHk6IHRoaXMuX2ZsYWcsDQogICAgbXVsdGlwbGU6IHRoaXMuX2ZsYWcNCiAgfSk7DQp9KS5jYWxsKEVsZW1lbnQuX2F0dHJpYnV0ZVRyYW5zbGF0aW9ucy52YWx1ZXMpOw0KDQpFbGVtZW50Lk1ldGhvZHMuU2ltdWxhdGVkID0gew0KICBoYXNBdHRyaWJ1dGU6IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHJpYnV0ZSkgew0KICAgIHZhciB0ID0gRWxlbWVudC5fYXR0cmlidXRlVHJhbnNsYXRpb25zLCBub2RlOw0KICAgIGF0dHJpYnV0ZSA9IHQubmFtZXNbYXR0cmlidXRlXSB8fCBhdHRyaWJ1dGU7DQogICAgbm9kZSA9ICQoZWxlbWVudCkuZ2V0QXR0cmlidXRlTm9kZShhdHRyaWJ1dGUpOw0KICAgIHJldHVybiBub2RlICYmIG5vZGUuc3BlY2lmaWVkOw0KICB9DQp9Ow0KDQpFbGVtZW50Lk1ldGhvZHMuQnlUYWcgPSB7fTsNCg0KT2JqZWN0LmV4dGVuZChFbGVtZW50LCBFbGVtZW50Lk1ldGhvZHMpOw0KDQppZiAoIVByb3RvdHlwZS5Ccm93c2VyRmVhdHVyZXMuRWxlbWVudEV4dGVuc2lvbnMgJiYNCiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKS5fX3Byb3RvX18pIHsNCiAgd2luZG93LkhUTUxFbGVtZW50ID0ge307DQogIHdpbmRvdy5IVE1MRWxlbWVudC5wcm90b3R5cGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKS5fX3Byb3RvX187DQogIFByb3RvdHlwZS5Ccm93c2VyRmVhdHVyZXMuRWxlbWVudEV4dGVuc2lvbnMgPSB0cnVlOw0KfQ0KDQpFbGVtZW50Lmhhc0F0dHJpYnV0ZSA9IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHJpYnV0ZSkgew0KICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUpIHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGUpOw0KICByZXR1cm4gRWxlbWVudC5NZXRob2RzLlNpbXVsYXRlZC5oYXNBdHRyaWJ1dGUoZWxlbWVudCwgYXR0cmlidXRlKTsNCn07DQoNCkVsZW1lbnQuYWRkTWV0aG9kcyA9IGZ1bmN0aW9uKG1ldGhvZHMpIHsNCiAgdmFyIEYgPSBQcm90b3R5cGUuQnJvd3NlckZlYXR1cmVzLCBUID0gRWxlbWVudC5NZXRob2RzLkJ5VGFnOw0KDQogIGlmICghbWV0aG9kcykgew0KICAgIE9iamVjdC5leHRlbmQoRm9ybSwgRm9ybS5NZXRob2RzKTsNCiAgICBPYmplY3QuZXh0ZW5kKEZvcm0uRWxlbWVudCwgRm9ybS5FbGVtZW50Lk1ldGhvZHMpOw0KICAgIE9iamVjdC5leHRlbmQoRWxlbWVudC5NZXRob2RzLkJ5VGFnLCB7DQogICAgICAiRk9STSI6ICAgICBPYmplY3QuY2xvbmUoRm9ybS5NZXRob2RzKSwNCiAgICAgICJJTlBVVCI6ICAgIE9iamVjdC5jbG9uZShGb3JtLkVsZW1lbnQuTWV0aG9kcyksDQogICAgICAiU0VMRUNUIjogICBPYmplY3QuY2xvbmUoRm9ybS5FbGVtZW50Lk1ldGhvZHMpLA0KICAgICAgIlRFWFRBUkVBIjogT2JqZWN0LmNsb25lKEZvcm0uRWxlbWVudC5NZXRob2RzKQ0KICAgIH0pOw0KICB9DQoNCiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikgew0KICAgIHZhciB0YWdOYW1lID0gbWV0aG9kczsNCiAgICBtZXRob2RzID0gYXJndW1lbnRzWzFdOw0KICB9DQoNCiAgaWYgKCF0YWdOYW1lKSBPYmplY3QuZXh0ZW5kKEVsZW1lbnQuTWV0aG9kcywgbWV0aG9kcyB8fCB7fSk7DQogIGVsc2Ugew0KICAgIGlmICh0YWdOYW1lLmNvbnN0cnVjdG9yID09IEFycmF5KSB0YWdOYW1lLmVhY2goZXh0ZW5kKTsNCiAgICBlbHNlIGV4dGVuZCh0YWdOYW1lKTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGV4dGVuZCh0YWdOYW1lKSB7DQogICAgdGFnTmFtZSA9IHRhZ05hbWUudG9VcHBlckNhc2UoKTsNCiAgICBpZiAoIUVsZW1lbnQuTWV0aG9kcy5CeVRhZ1t0YWdOYW1lXSkNCiAgICAgIEVsZW1lbnQuTWV0aG9kcy5CeVRhZ1t0YWdOYW1lXSA9IHt9Ow0KICAgIE9iamVjdC5leHRlbmQoRWxlbWVudC5NZXRob2RzLkJ5VGFnW3RhZ05hbWVdLCBtZXRob2RzKTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGNvcHkobWV0aG9kcywgZGVzdGluYXRpb24sIG9ubHlJZkFic2VudCkgew0KICAgIG9ubHlJZkFic2VudCA9IG9ubHlJZkFic2VudCB8fCBmYWxzZTsNCiAgICB2YXIgY2FjaGUgPSBFbGVtZW50LmV4dGVuZC5jYWNoZTsNCiAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBtZXRob2RzKSB7DQogICAgICB2YXIgdmFsdWUgPSBtZXRob2RzW3Byb3BlcnR5XTsNCiAgICAgIGlmICghb25seUlmQWJzZW50IHx8ICEocHJvcGVydHkgaW4gZGVzdGluYXRpb24pKQ0KICAgICAgICBkZXN0aW5hdGlvbltwcm9wZXJ0eV0gPSBjYWNoZS5maW5kT3JTdG9yZSh2YWx1ZSk7DQogICAgfQ0KICB9DQoNCiAgZnVuY3Rpb24gZmluZERPTUNsYXNzKHRhZ05hbWUpIHsNCiAgICB2YXIga2xhc3M7DQogICAgdmFyIHRyYW5zID0gew0KICAgICAgIk9QVEdST1VQIjogIk9wdEdyb3VwIiwgIlRFWFRBUkVBIjogIlRleHRBcmVhIiwgIlAiOiAiUGFyYWdyYXBoIiwNCiAgICAgICJGSUVMRFNFVCI6ICJGaWVsZFNldCIsICJVTCI6ICJVTGlzdCIsICJPTCI6ICJPTGlzdCIsICJETCI6ICJETGlzdCIsDQogICAgICAiRElSIjogIkRpcmVjdG9yeSIsICJIMSI6ICJIZWFkaW5nIiwgIkgyIjogIkhlYWRpbmciLCAiSDMiOiAiSGVhZGluZyIsDQogICAgICAiSDQiOiAiSGVhZGluZyIsICJINSI6ICJIZWFkaW5nIiwgIkg2IjogIkhlYWRpbmciLCAiUSI6ICJRdW90ZSIsDQogICAgICAiSU5TIjogIk1vZCIsICJERUwiOiAiTW9kIiwgIkEiOiAiQW5jaG9yIiwgIklNRyI6ICJJbWFnZSIsICJDQVBUSU9OIjoNCiAgICAgICJUYWJsZUNhcHRpb24iLCAiQ09MIjogIlRhYmxlQ29sIiwgIkNPTEdST1VQIjogIlRhYmxlQ29sIiwgIlRIRUFEIjoNCiAgICAgICJUYWJsZVNlY3Rpb24iLCAiVEZPT1QiOiAiVGFibGVTZWN0aW9uIiwgIlRCT0RZIjogIlRhYmxlU2VjdGlvbiIsICJUUiI6DQogICAgICAiVGFibGVSb3ciLCAiVEgiOiAiVGFibGVDZWxsIiwgIlREIjogIlRhYmxlQ2VsbCIsICJGUkFNRVNFVCI6DQogICAgICAiRnJhbWVTZXQiLCAiSUZSQU1FIjogIklGcmFtZSINCiAgICB9Ow0KICAgIGlmICh0cmFuc1t0YWdOYW1lXSkga2xhc3MgPSAnSFRNTCcgKyB0cmFuc1t0YWdOYW1lXSArICdFbGVtZW50JzsNCiAgICBpZiAod2luZG93W2tsYXNzXSkgcmV0dXJuIHdpbmRvd1trbGFzc107DQogICAga2xhc3MgPSAnSFRNTCcgKyB0YWdOYW1lICsgJ0VsZW1lbnQnOw0KICAgIGlmICh3aW5kb3dba2xhc3NdKSByZXR1cm4gd2luZG93W2tsYXNzXTsNCiAgICBrbGFzcyA9ICdIVE1MJyArIHRhZ05hbWUuY2FwaXRhbGl6ZSgpICsgJ0VsZW1lbnQnOw0KICAgIGlmICh3aW5kb3dba2xhc3NdKSByZXR1cm4gd2luZG93W2tsYXNzXTsNCg0KICAgIHdpbmRvd1trbGFzc10gPSB7fTsNCiAgICB3aW5kb3dba2xhc3NdLnByb3RvdHlwZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSkuX19wcm90b19fOw0KICAgIHJldHVybiB3aW5kb3dba2xhc3NdOw0KICB9DQoNCiAgaWYgKEYuRWxlbWVudEV4dGVuc2lvbnMpIHsNCiAgICBjb3B5KEVsZW1lbnQuTWV0aG9kcywgSFRNTEVsZW1lbnQucHJvdG90eXBlKTsNCiAgICBjb3B5KEVsZW1lbnQuTWV0aG9kcy5TaW11bGF0ZWQsIEhUTUxFbGVtZW50LnByb3RvdHlwZSwgdHJ1ZSk7DQogIH0NCg0KICBpZiAoRi5TcGVjaWZpY0VsZW1lbnRFeHRlbnNpb25zKSB7DQogICAgZm9yICh2YXIgdGFnIGluIEVsZW1lbnQuTWV0aG9kcy5CeVRhZykgew0KICAgICAgdmFyIGtsYXNzID0gZmluZERPTUNsYXNzKHRhZyk7DQogICAgICBpZiAodHlwZW9mIGtsYXNzID09ICJ1bmRlZmluZWQiKSBjb250aW51ZTsNCiAgICAgIGNvcHkoVFt0YWddLCBrbGFzcy5wcm90b3R5cGUpOw0KICAgIH0NCiAgfQ0KDQogIE9iamVjdC5leHRlbmQoRWxlbWVudCwgRWxlbWVudC5NZXRob2RzKTsNCiAgZGVsZXRlIEVsZW1lbnQuQnlUYWc7DQp9Ow0KDQp2YXIgVG9nZ2xlID0geyBkaXNwbGF5OiBFbGVtZW50LnRvZ2dsZSB9Ow0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KQWJzdHJhY3QuSW5zZXJ0aW9uID0gZnVuY3Rpb24oYWRqYWNlbmN5KSB7DQogIHRoaXMuYWRqYWNlbmN5ID0gYWRqYWNlbmN5Ow0KfQ0KDQpBYnN0cmFjdC5JbnNlcnRpb24ucHJvdG90eXBlID0gew0KICBpbml0aWFsaXplOiBmdW5jdGlvbihlbGVtZW50LCBjb250ZW50KSB7DQogICAgdGhpcy5lbGVtZW50ID0gJChlbGVtZW50KTsNCiAgICB0aGlzLmNvbnRlbnQgPSBjb250ZW50LnN0cmlwU2NyaXB0cygpOw0KDQogICAgaWYgKHRoaXMuYWRqYWNlbmN5ICYmIHRoaXMuZWxlbWVudC5pbnNlcnRBZGphY2VudEhUTUwpIHsNCiAgICAgIHRyeSB7DQogICAgICAgIHRoaXMuZWxlbWVudC5pbnNlcnRBZGphY2VudEhUTUwodGhpcy5hZGphY2VuY3ksIHRoaXMuY29udGVudCk7DQogICAgICB9IGNhdGNoIChlKSB7DQogICAgICAgIHZhciB0YWdOYW1lID0gdGhpcy5lbGVtZW50LnRhZ05hbWUudG9VcHBlckNhc2UoKTsNCiAgICAgICAgaWYgKFsnVEJPRFknLCAnVFInXS5pbmNsdWRlKHRhZ05hbWUpKSB7DQogICAgICAgICAgdGhpcy5pbnNlcnRDb250ZW50KHRoaXMuY29udGVudEZyb21Bbm9ueW1vdXNUYWJsZSgpKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICB0aHJvdyBlOw0KICAgICAgICB9DQogICAgICB9DQogICAgfSBlbHNlIHsNCiAgICAgIHRoaXMucmFuZ2UgPSB0aGlzLmVsZW1lbnQub3duZXJEb2N1bWVudC5jcmVhdGVSYW5nZSgpOw0KICAgICAgaWYgKHRoaXMuaW5pdGlhbGl6ZVJhbmdlKSB0aGlzLmluaXRpYWxpemVSYW5nZSgpOw0KICAgICAgdGhpcy5pbnNlcnRDb250ZW50KFt0aGlzLnJhbmdlLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCh0aGlzLmNvbnRlbnQpXSk7DQogICAgfQ0KDQogICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtjb250ZW50LmV2YWxTY3JpcHRzKCl9LCAxMCk7DQogIH0sDQoNCiAgY29udGVudEZyb21Bbm9ueW1vdXNUYWJsZTogZnVuY3Rpb24oKSB7DQogICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOw0KICAgIGRpdi5pbm5lckhUTUwgPSAnPHRhYmxlPjx0Ym9keT4nICsgdGhpcy5jb250ZW50ICsgJzwvdGJvZHk+PC90YWJsZT4nOw0KICAgIHJldHVybiAkQShkaXYuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXMpOw0KICB9DQp9DQoNCnZhciBJbnNlcnRpb24gPSBuZXcgT2JqZWN0KCk7DQoNCkluc2VydGlvbi5CZWZvcmUgPSBDbGFzcy5jcmVhdGUoKTsNCkluc2VydGlvbi5CZWZvcmUucHJvdG90eXBlID0gT2JqZWN0LmV4dGVuZChuZXcgQWJzdHJhY3QuSW5zZXJ0aW9uKCdiZWZvcmVCZWdpbicpLCB7DQogIGluaXRpYWxpemVSYW5nZTogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5yYW5nZS5zZXRTdGFydEJlZm9yZSh0aGlzLmVsZW1lbnQpOw0KICB9LA0KDQogIGluc2VydENvbnRlbnQ6IGZ1bmN0aW9uKGZyYWdtZW50cykgew0KICAgIGZyYWdtZW50cy5lYWNoKChmdW5jdGlvbihmcmFnbWVudCkgew0KICAgICAgdGhpcy5lbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGZyYWdtZW50LCB0aGlzLmVsZW1lbnQpOw0KICAgIH0pLmJpbmQodGhpcykpOw0KICB9DQp9KTsNCg0KSW5zZXJ0aW9uLlRvcCA9IENsYXNzLmNyZWF0ZSgpOw0KSW5zZXJ0aW9uLlRvcC5wcm90b3R5cGUgPSBPYmplY3QuZXh0ZW5kKG5ldyBBYnN0cmFjdC5JbnNlcnRpb24oJ2FmdGVyQmVnaW4nKSwgew0KICBpbml0aWFsaXplUmFuZ2U6IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMucmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKHRoaXMuZWxlbWVudCk7DQogICAgdGhpcy5yYW5nZS5jb2xsYXBzZSh0cnVlKTsNCiAgfSwNCg0KICBpbnNlcnRDb250ZW50OiBmdW5jdGlvbihmcmFnbWVudHMpIHsNCiAgICBmcmFnbWVudHMucmV2ZXJzZShmYWxzZSkuZWFjaCgoZnVuY3Rpb24oZnJhZ21lbnQpIHsNCiAgICAgIHRoaXMuZWxlbWVudC5pbnNlcnRCZWZvcmUoZnJhZ21lbnQsIHRoaXMuZWxlbWVudC5maXJzdENoaWxkKTsNCiAgICB9KS5iaW5kKHRoaXMpKTsNCiAgfQ0KfSk7DQoNCkluc2VydGlvbi5Cb3R0b20gPSBDbGFzcy5jcmVhdGUoKTsNCkluc2VydGlvbi5Cb3R0b20ucHJvdG90eXBlID0gT2JqZWN0LmV4dGVuZChuZXcgQWJzdHJhY3QuSW5zZXJ0aW9uKCdiZWZvcmVFbmQnKSwgew0KICBpbml0aWFsaXplUmFuZ2U6IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMucmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKHRoaXMuZWxlbWVudCk7DQogICAgdGhpcy5yYW5nZS5jb2xsYXBzZSh0aGlzLmVsZW1lbnQpOw0KICB9LA0KDQogIGluc2VydENvbnRlbnQ6IGZ1bmN0aW9uKGZyYWdtZW50cykgew0KICAgIGZyYWdtZW50cy5lYWNoKChmdW5jdGlvbihmcmFnbWVudCkgew0KICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKGZyYWdtZW50KTsNCiAgICB9KS5iaW5kKHRoaXMpKTsNCiAgfQ0KfSk7DQoNCkluc2VydGlvbi5BZnRlciA9IENsYXNzLmNyZWF0ZSgpOw0KSW5zZXJ0aW9uLkFmdGVyLnByb3RvdHlwZSA9IE9iamVjdC5leHRlbmQobmV3IEFic3RyYWN0Lkluc2VydGlvbignYWZ0ZXJFbmQnKSwgew0KICBpbml0aWFsaXplUmFuZ2U6IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMucmFuZ2Uuc2V0U3RhcnRBZnRlcih0aGlzLmVsZW1lbnQpOw0KICB9LA0KDQogIGluc2VydENvbnRlbnQ6IGZ1bmN0aW9uKGZyYWdtZW50cykgew0KICAgIGZyYWdtZW50cy5lYWNoKChmdW5jdGlvbihmcmFnbWVudCkgew0KICAgICAgdGhpcy5lbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGZyYWdtZW50LA0KICAgICAgICB0aGlzLmVsZW1lbnQubmV4dFNpYmxpbmcpOw0KICAgIH0pLmJpbmQodGhpcykpOw0KICB9DQp9KTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCkVsZW1lbnQuQ2xhc3NOYW1lcyA9IENsYXNzLmNyZWF0ZSgpOw0KRWxlbWVudC5DbGFzc05hbWVzLnByb3RvdHlwZSA9IHsNCiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgIHRoaXMuZWxlbWVudCA9ICQoZWxlbWVudCk7DQogIH0sDQoNCiAgX2VhY2g6IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7DQogICAgdGhpcy5lbGVtZW50LmNsYXNzTmFtZS5zcGxpdCgvXHMrLykuc2VsZWN0KGZ1bmN0aW9uKG5hbWUpIHsNCiAgICAgIHJldHVybiBuYW1lLmxlbmd0aCA+IDA7DQogICAgfSkuX2VhY2goaXRlcmF0b3IpOw0KICB9LA0KDQogIHNldDogZnVuY3Rpb24oY2xhc3NOYW1lKSB7DQogICAgdGhpcy5lbGVtZW50LmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsNCiAgfSwNCg0KICBhZGQ6IGZ1bmN0aW9uKGNsYXNzTmFtZVRvQWRkKSB7DQogICAgaWYgKHRoaXMuaW5jbHVkZShjbGFzc05hbWVUb0FkZCkpIHJldHVybjsNCiAgICB0aGlzLnNldCgkQSh0aGlzKS5jb25jYXQoY2xhc3NOYW1lVG9BZGQpLmpvaW4oJyAnKSk7DQogIH0sDQoNCiAgcmVtb3ZlOiBmdW5jdGlvbihjbGFzc05hbWVUb1JlbW92ZSkgew0KICAgIGlmICghdGhpcy5pbmNsdWRlKGNsYXNzTmFtZVRvUmVtb3ZlKSkgcmV0dXJuOw0KICAgIHRoaXMuc2V0KCRBKHRoaXMpLndpdGhvdXQoY2xhc3NOYW1lVG9SZW1vdmUpLmpvaW4oJyAnKSk7DQogIH0sDQoNCiAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiAkQSh0aGlzKS5qb2luKCcgJyk7DQogIH0NCn07DQoNCk9iamVjdC5leHRlbmQoRWxlbWVudC5DbGFzc05hbWVzLnByb3RvdHlwZSwgRW51bWVyYWJsZSk7DQovKiBQb3J0aW9ucyBvZiB0aGUgU2VsZWN0b3IgY2xhc3MgYXJlIGRlcml2ZWQgZnJvbSBKYWNrIFNsb2N1beKAmXMgRG9tUXVlcnksDQogKiBwYXJ0IG9mIFlVSS1FeHQgdmVyc2lvbiAwLjQwLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYW4gTUlULXN0eWxlDQogKiBsaWNlbnNlLiAgUGxlYXNlIHNlZSBodHRwOi8vd3d3Lnl1aS1leHQuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gKi8NCg0KdmFyIFNlbGVjdG9yID0gQ2xhc3MuY3JlYXRlKCk7DQoNClNlbGVjdG9yLnByb3RvdHlwZSA9IHsNCiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZXhwcmVzc2lvbikgew0KICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24uc3RyaXAoKTsNCiAgICB0aGlzLmNvbXBpbGVNYXRjaGVyKCk7DQogIH0sDQoNCiAgY29tcGlsZU1hdGNoZXI6IGZ1bmN0aW9uKCkgew0KICAgIC8vIFNlbGVjdG9ycyB3aXRoIG5hbWVzcGFjZWQgYXR0cmlidXRlcyBjYW4ndCB1c2UgdGhlIFhQYXRoIHZlcnNpb24NCiAgICBpZiAoUHJvdG90eXBlLkJyb3dzZXJGZWF0dXJlcy5YUGF0aCAmJiAhKC9cW1tcdy1dKj86LykudGVzdCh0aGlzLmV4cHJlc3Npb24pKQ0KICAgICAgcmV0dXJuIHRoaXMuY29tcGlsZVhQYXRoTWF0Y2hlcigpOw0KDQogICAgdmFyIGUgPSB0aGlzLmV4cHJlc3Npb24sIHBzID0gU2VsZWN0b3IucGF0dGVybnMsIGggPSBTZWxlY3Rvci5oYW5kbGVycywNCiAgICAgICAgYyA9IFNlbGVjdG9yLmNyaXRlcmlhLCBsZSwgcCwgbTsNCg0KICAgIGlmIChTZWxlY3Rvci5fY2FjaGVbZV0pIHsNCiAgICAgIHRoaXMubWF0Y2hlciA9IFNlbGVjdG9yLl9jYWNoZVtlXTsgcmV0dXJuOw0KICAgIH0NCiAgICB0aGlzLm1hdGNoZXIgPSBbInRoaXMubWF0Y2hlciA9IGZ1bmN0aW9uKHJvb3QpIHsiLA0KICAgICAgICAgICAgICAgICAgICAidmFyIHIgPSByb290LCBoID0gU2VsZWN0b3IuaGFuZGxlcnMsIGMgPSBmYWxzZSwgbjsiXTsNCg0KICAgIHdoaWxlIChlICYmIGxlICE9IGUgJiYgKC9cUy8pLnRlc3QoZSkpIHsNCiAgICAgIGxlID0gZTsNCiAgICAgIGZvciAodmFyIGkgaW4gcHMpIHsNCiAgICAgICAgcCA9IHBzW2ldOw0KICAgICAgICBpZiAobSA9IGUubWF0Y2gocCkpIHsNCiAgICAgICAgICB0aGlzLm1hdGNoZXIucHVzaCh0eXBlb2YgY1tpXSA9PSAnZnVuY3Rpb24nID8gY1tpXShtKSA6DQogICAgCSAgICAgIG5ldyBUZW1wbGF0ZShjW2ldKS5ldmFsdWF0ZShtKSk7DQogICAgICAgICAgZSA9IGUucmVwbGFjZShtWzBdLCAnJyk7DQogICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQoNCiAgICB0aGlzLm1hdGNoZXIucHVzaCgicmV0dXJuIGgudW5pcXVlKG4pO1xufSIpOw0KICAgIGV2YWwodGhpcy5tYXRjaGVyLmpvaW4oJ1xuJykpOw0KICAgIFNlbGVjdG9yLl9jYWNoZVt0aGlzLmV4cHJlc3Npb25dID0gdGhpcy5tYXRjaGVyOw0KICB9LA0KDQogIGNvbXBpbGVYUGF0aE1hdGNoZXI6IGZ1bmN0aW9uKCkgew0KICAgIHZhciBlID0gdGhpcy5leHByZXNzaW9uLCBwcyA9IFNlbGVjdG9yLnBhdHRlcm5zLA0KICAgICAgICB4ID0gU2VsZWN0b3IueHBhdGgsIGxlLCAgbTsNCg0KICAgIGlmIChTZWxlY3Rvci5fY2FjaGVbZV0pIHsNCiAgICAgIHRoaXMueHBhdGggPSBTZWxlY3Rvci5fY2FjaGVbZV07IHJldHVybjsNCiAgICB9DQoNCiAgICB0aGlzLm1hdGNoZXIgPSBbJy4vLyonXTsNCiAgICB3aGlsZSAoZSAmJiBsZSAhPSBlICYmICgvXFMvKS50ZXN0KGUpKSB7DQogICAgICBsZSA9IGU7DQogICAgICBmb3IgKHZhciBpIGluIHBzKSB7DQogICAgICAgIGlmIChtID0gZS5tYXRjaChwc1tpXSkpIHsNCiAgICAgICAgICB0aGlzLm1hdGNoZXIucHVzaCh0eXBlb2YgeFtpXSA9PSAnZnVuY3Rpb24nID8geFtpXShtKSA6DQogICAgICAgICAgICBuZXcgVGVtcGxhdGUoeFtpXSkuZXZhbHVhdGUobSkpOw0KICAgICAgICAgIGUgPSBlLnJlcGxhY2UobVswXSwgJycpOw0KICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgICB9DQogICAgfQ0KDQogICAgdGhpcy54cGF0aCA9IHRoaXMubWF0Y2hlci5qb2luKCcnKTsNCiAgICBTZWxlY3Rvci5fY2FjaGVbdGhpcy5leHByZXNzaW9uXSA9IHRoaXMueHBhdGg7DQogIH0sDQoNCiAgZmluZEVsZW1lbnRzOiBmdW5jdGlvbihyb290KSB7DQogICAgcm9vdCA9IHJvb3QgfHwgZG9jdW1lbnQ7DQogICAgaWYgKHRoaXMueHBhdGgpIHJldHVybiBkb2N1bWVudC5fZ2V0RWxlbWVudHNCeVhQYXRoKHRoaXMueHBhdGgsIHJvb3QpOw0KICAgIHJldHVybiB0aGlzLm1hdGNoZXIocm9vdCk7DQogIH0sDQoNCiAgbWF0Y2g6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICByZXR1cm4gdGhpcy5maW5kRWxlbWVudHMoZG9jdW1lbnQpLmluY2x1ZGUoZWxlbWVudCk7DQogIH0sDQoNCiAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb247DQogIH0sDQoNCiAgaW5zcGVjdDogZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuICIjPFNlbGVjdG9yOiIgKyB0aGlzLmV4cHJlc3Npb24uaW5zcGVjdCgpICsgIj4iOw0KICB9DQp9Ow0KDQpPYmplY3QuZXh0ZW5kKFNlbGVjdG9yLCB7DQogIF9jYWNoZToge30sDQoNCiAgeHBhdGg6IHsNCiAgICBkZXNjZW5kYW50OiAgICIvLyoiLA0KICAgIGNoaWxkOiAgICAgICAgIi8qIiwNCiAgICBhZGphY2VudDogICAgICIvZm9sbG93aW5nLXNpYmxpbmc6OipbMV0iLA0KICAgIGxhdGVyU2libGluZzogJy9mb2xsb3dpbmctc2libGluZzo6KicsDQogICAgdGFnTmFtZTogICAgICBmdW5jdGlvbihtKSB7DQogICAgICBpZiAobVsxXSA9PSAnKicpIHJldHVybiAnJzsNCiAgICAgIHJldHVybiAiW2xvY2FsLW5hbWUoKT0nIiArIG1bMV0udG9Mb3dlckNhc2UoKSArDQogICAgICAgICAgICAgIicgb3IgbG9jYWwtbmFtZSgpPSciICsgbVsxXS50b1VwcGVyQ2FzZSgpICsgIiddIjsNCiAgICB9LA0KICAgIGNsYXNzTmFtZTogICAgIltjb250YWlucyhjb25jYXQoJyAnLCBAY2xhc3MsICcgJyksICcgI3sxfSAnKV0iLA0KICAgIGlkOiAgICAgICAgICAgIltAaWQ9JyN7MX0nXSIsDQogICAgYXR0clByZXNlbmNlOiAiW0AjezF9XSIsDQogICAgYXR0cjogZnVuY3Rpb24obSkgew0KICAgICAgbVszXSA9IG1bNV0gfHwgbVs2XTsNCiAgICAgIHJldHVybiBuZXcgVGVtcGxhdGUoU2VsZWN0b3IueHBhdGgub3BlcmF0b3JzW21bMl1dKS5ldmFsdWF0ZShtKTsNCiAgICB9LA0KICAgIHBzZXVkbzogZnVuY3Rpb24obSkgew0KICAgICAgdmFyIGggPSBTZWxlY3Rvci54cGF0aC5wc2V1ZG9zW21bMV1dOw0KICAgICAgaWYgKCFoKSByZXR1cm4gJyc7DQogICAgICBpZiAodHlwZW9mIGggPT09ICdmdW5jdGlvbicpIHJldHVybiBoKG0pOw0KICAgICAgcmV0dXJuIG5ldyBUZW1wbGF0ZShTZWxlY3Rvci54cGF0aC5wc2V1ZG9zW21bMV1dKS5ldmFsdWF0ZShtKTsNCiAgICB9LA0KICAgIG9wZXJhdG9yczogew0KICAgICAgJz0nOiAgIltAI3sxfT0nI3szfSddIiwNCiAgICAgICchPSc6ICJbQCN7MX0hPScjezN9J10iLA0KICAgICAgJ149JzogIltzdGFydHMtd2l0aChAI3sxfSwgJyN7M30nKV0iLA0KICAgICAgJyQ9JzogIltzdWJzdHJpbmcoQCN7MX0sIChzdHJpbmctbGVuZ3RoKEAjezF9KSAtIHN0cmluZy1sZW5ndGgoJyN7M30nKSArIDEpKT0nI3szfSddIiwNCiAgICAgICcqPSc6ICJbY29udGFpbnMoQCN7MX0sICcjezN9JyldIiwNCiAgICAgICd+PSc6ICJbY29udGFpbnMoY29uY2F0KCcgJywgQCN7MX0sICcgJyksICcgI3szfSAnKV0iLA0KICAgICAgJ3w9JzogIltjb250YWlucyhjb25jYXQoJy0nLCBAI3sxfSwgJy0nKSwgJy0jezN9LScpXSINCiAgICB9LA0KICAgIHBzZXVkb3M6IHsNCiAgICAgICdmaXJzdC1jaGlsZCc6ICdbbm90KHByZWNlZGluZy1zaWJsaW5nOjoqKV0nLA0KICAgICAgJ2xhc3QtY2hpbGQnOiAgJ1tub3QoZm9sbG93aW5nLXNpYmxpbmc6OiopXScsDQogICAgICAnb25seS1jaGlsZCc6ICAnW25vdChwcmVjZWRpbmctc2libGluZzo6KiBvciBmb2xsb3dpbmctc2libGluZzo6KildJywNCiAgICAgICdlbXB0eSc6ICAgICAgICJbY291bnQoKikgPSAwIGFuZCAoY291bnQodGV4dCgpKSA9IDAgb3IgdHJhbnNsYXRlKHRleHQoKSwgJyBcdFxyXG4nLCAnJykgPSAnJyldIiwNCiAgICAgICdjaGVja2VkJzogICAgICJbQGNoZWNrZWRdIiwNCiAgICAgICdkaXNhYmxlZCc6ICAgICJbQGRpc2FibGVkXSIsDQogICAgICAnZW5hYmxlZCc6ICAgICAiW25vdChAZGlzYWJsZWQpXSIsDQogICAgICAnbm90JzogZnVuY3Rpb24obSkgew0KICAgICAgICB2YXIgZSA9IG1bNl0sIHAgPSBTZWxlY3Rvci5wYXR0ZXJucywNCiAgICAgICAgICAgIHggPSBTZWxlY3Rvci54cGF0aCwgbGUsIG0sIHY7DQoNCiAgICAgICAgdmFyIGV4Y2x1c2lvbiA9IFtdOw0KICAgICAgICB3aGlsZSAoZSAmJiBsZSAhPSBlICYmICgvXFMvKS50ZXN0KGUpKSB7DQogICAgICAgICAgbGUgPSBlOw0KICAgICAgICAgIGZvciAodmFyIGkgaW4gcCkgew0KICAgICAgICAgICAgaWYgKG0gPSBlLm1hdGNoKHBbaV0pKSB7DQogICAgICAgICAgICAgIHYgPSB0eXBlb2YgeFtpXSA9PSAnZnVuY3Rpb24nID8geFtpXShtKSA6IG5ldyBUZW1wbGF0ZSh4W2ldKS5ldmFsdWF0ZShtKTsNCiAgICAgICAgICAgICAgZXhjbHVzaW9uLnB1c2goIigiICsgdi5zdWJzdHJpbmcoMSwgdi5sZW5ndGggLSAxKSArICIpIik7DQogICAgICAgICAgICAgIGUgPSBlLnJlcGxhY2UobVswXSwgJycpOw0KICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuICJbbm90KCIgKyBleGNsdXNpb24uam9pbigiIGFuZCAiKSArICIpXSI7DQogICAgICB9LA0KICAgICAgJ250aC1jaGlsZCc6ICAgICAgZnVuY3Rpb24obSkgew0KICAgICAgICByZXR1cm4gU2VsZWN0b3IueHBhdGgucHNldWRvcy5udGgoIihjb3VudCguL3ByZWNlZGluZy1zaWJsaW5nOjoqKSArIDEpICIsIG0pOw0KICAgICAgfSwNCiAgICAgICdudGgtbGFzdC1jaGlsZCc6IGZ1bmN0aW9uKG0pIHsNCiAgICAgICAgcmV0dXJuIFNlbGVjdG9yLnhwYXRoLnBzZXVkb3MubnRoKCIoY291bnQoLi9mb2xsb3dpbmctc2libGluZzo6KikgKyAxKSAiLCBtKTsNCiAgICAgIH0sDQogICAgICAnbnRoLW9mLXR5cGUnOiAgICBmdW5jdGlvbihtKSB7DQogICAgICAgIHJldHVybiBTZWxlY3Rvci54cGF0aC5wc2V1ZG9zLm50aCgicG9zaXRpb24oKSAiLCBtKTsNCiAgICAgIH0sDQogICAgICAnbnRoLWxhc3Qtb2YtdHlwZSc6IGZ1bmN0aW9uKG0pIHsNCiAgICAgICAgcmV0dXJuIFNlbGVjdG9yLnhwYXRoLnBzZXVkb3MubnRoKCIobGFzdCgpICsgMSAtIHBvc2l0aW9uKCkpICIsIG0pOw0KICAgICAgfSwNCiAgICAgICdmaXJzdC1vZi10eXBlJzogIGZ1bmN0aW9uKG0pIHsNCiAgICAgICAgbVs2XSA9ICIxIjsgcmV0dXJuIFNlbGVjdG9yLnhwYXRoLnBzZXVkb3NbJ250aC1vZi10eXBlJ10obSk7DQogICAgICB9LA0KICAgICAgJ2xhc3Qtb2YtdHlwZSc6ICAgZnVuY3Rpb24obSkgew0KICAgICAgICBtWzZdID0gIjEiOyByZXR1cm4gU2VsZWN0b3IueHBhdGgucHNldWRvc1snbnRoLWxhc3Qtb2YtdHlwZSddKG0pOw0KICAgICAgfSwNCiAgICAgICdvbmx5LW9mLXR5cGUnOiAgIGZ1bmN0aW9uKG0pIHsNCiAgICAgICAgdmFyIHAgPSBTZWxlY3Rvci54cGF0aC5wc2V1ZG9zOyByZXR1cm4gcFsnZmlyc3Qtb2YtdHlwZSddKG0pICsgcFsnbGFzdC1vZi10eXBlJ10obSk7DQogICAgICB9LA0KICAgICAgbnRoOiBmdW5jdGlvbihmcmFnbWVudCwgbSkgew0KICAgICAgICB2YXIgbW0sIGZvcm11bGEgPSBtWzZdLCBwcmVkaWNhdGU7DQogICAgICAgIGlmIChmb3JtdWxhID09ICdldmVuJykgZm9ybXVsYSA9ICcybiswJzsNCiAgICAgICAgaWYgKGZvcm11bGEgPT0gJ29kZCcpICBmb3JtdWxhID0gJzJuKzEnOw0KICAgICAgICBpZiAobW0gPSBmb3JtdWxhLm1hdGNoKC9eKFxkKykkLykpIC8vIGRpZ2l0IG9ubHkNCiAgICAgICAgICByZXR1cm4gJ1snICsgZnJhZ21lbnQgKyAiPSAiICsgbW1bMV0gKyAnXSc7DQogICAgICAgIGlmIChtbSA9IGZvcm11bGEubWF0Y2goL14oLT9cZCopP24oKFsrLV0pKFxkKykpPy8pKSB7IC8vIGFuK2INCiAgICAgICAgICBpZiAobW1bMV0gPT0gIi0iKSBtbVsxXSA9IC0xOw0KICAgICAgICAgIHZhciBhID0gbW1bMV0gPyBOdW1iZXIobW1bMV0pIDogMTsNCiAgICAgICAgICB2YXIgYiA9IG1tWzJdID8gTnVtYmVyKG1tWzJdKSA6IDA7DQogICAgICAgICAgcHJlZGljYXRlID0gIlsoKCN7ZnJhZ21lbnR9IC0gI3tifSkgbW9kICN7YX0gPSAwKSBhbmQgIiArDQogICAgICAgICAgIigoI3tmcmFnbWVudH0gLSAje2J9KSBkaXYgI3thfSA+PSAwKV0iOw0KICAgICAgICAgIHJldHVybiBuZXcgVGVtcGxhdGUocHJlZGljYXRlKS5ldmFsdWF0ZSh7DQogICAgICAgICAgICBmcmFnbWVudDogZnJhZ21lbnQsIGE6IGEsIGI6IGIgfSk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogIH0sDQoNCiAgY3JpdGVyaWE6IHsNCiAgICB0YWdOYW1lOiAgICAgICduID0gaC50YWdOYW1lKG4sIHIsICIjezF9IiwgYyk7ICAgYyA9IGZhbHNlOycsDQogICAgY2xhc3NOYW1lOiAgICAnbiA9IGguY2xhc3NOYW1lKG4sIHIsICIjezF9IiwgYyk7IGMgPSBmYWxzZTsnLA0KICAgIGlkOiAgICAgICAgICAgJ24gPSBoLmlkKG4sIHIsICIjezF9IiwgYyk7ICAgICAgICBjID0gZmFsc2U7JywNCiAgICBhdHRyUHJlc2VuY2U6ICduID0gaC5hdHRyUHJlc2VuY2UobiwgciwgIiN7MX0iKTsgYyA9IGZhbHNlOycsDQogICAgYXR0cjogZnVuY3Rpb24obSkgew0KICAgICAgbVszXSA9IChtWzVdIHx8IG1bNl0pOw0KICAgICAgcmV0dXJuIG5ldyBUZW1wbGF0ZSgnbiA9IGguYXR0cihuLCByLCAiI3sxfSIsICIjezN9IiwgIiN7Mn0iKTsgYyA9IGZhbHNlOycpLmV2YWx1YXRlKG0pOw0KICAgIH0sDQogICAgcHNldWRvOiAgICAgICBmdW5jdGlvbihtKSB7DQogICAgICBpZiAobVs2XSkgbVs2XSA9IG1bNl0ucmVwbGFjZSgvIi9nLCAnXFwiJyk7DQogICAgICByZXR1cm4gbmV3IFRlbXBsYXRlKCduID0gaC5wc2V1ZG8obiwgIiN7MX0iLCAiI3s2fSIsIHIsIGMpOyBjID0gZmFsc2U7JykuZXZhbHVhdGUobSk7DQogICAgfSwNCiAgICBkZXNjZW5kYW50OiAgICdjID0gImRlc2NlbmRhbnQiOycsDQogICAgY2hpbGQ6ICAgICAgICAnYyA9ICJjaGlsZCI7JywNCiAgICBhZGphY2VudDogICAgICdjID0gImFkamFjZW50IjsnLA0KICAgIGxhdGVyU2libGluZzogJ2MgPSAibGF0ZXJTaWJsaW5nIjsnDQogIH0sDQoNCiAgcGF0dGVybnM6IHsNCiAgICAvLyBjb21iaW5hdG9ycyBtdXN0IGJlIGxpc3RlZCBmaXJzdA0KICAgIC8vIChhbmQgZGVzY2VuZGFudCBuZWVkcyB0byBiZSBsYXN0IGNvbWJpbmF0b3IpDQogICAgbGF0ZXJTaWJsaW5nOiAvXlxzKn5ccyovLA0KICAgIGNoaWxkOiAgICAgICAgL15ccyo+XHMqLywNCiAgICBhZGphY2VudDogICAgIC9eXHMqXCtccyovLA0KICAgIGRlc2NlbmRhbnQ6ICAgL15ccy8sDQoNCiAgICAvLyBzZWxlY3RvcnMgZm9sbG93DQogICAgdGFnTmFtZTogICAgICAvXlxzKihcKnxbXHdcLV0rKShcYnwkKT8vLA0KICAgIGlkOiAgICAgICAgICAgL14jKFtcd1wtXCpdKykoXGJ8JCkvLA0KICAgIGNsYXNzTmFtZTogICAgL15cLihbXHdcLVwqXSspKFxifCQpLywNCiAgICBwc2V1ZG86ICAgICAgIC9eOigoZmlyc3R8bGFzdHxudGh8bnRoLWxhc3R8b25seSkoLWNoaWxkfC1vZi10eXBlKXxlbXB0eXxjaGVja2VkfChlbnxkaXMpYWJsZWR8bm90KShcKCguKj8pXCkpPyhcYnwkfFxzfCg/PTopKS8sDQogICAgYXR0clByZXNlbmNlOiAvXlxbKFtcd10rKVxdLywNCiAgICBhdHRyOiAgICAgICAgIC9cWygoPzpbXHctXSo6KT9bXHctXSspXHMqKD86KFshXiQqfnxdPz0pXHMqKChbJyJdKShbXlxdXSo/KVw0fChbXiciXVteXF1dKj8pKSk/XF0vDQogIH0sDQoNCiAgaGFuZGxlcnM6IHsNCiAgICAvLyBVVElMSVRZIEZVTkNUSU9OUw0KICAgIC8vIGpvaW5zIHR3byBjb2xsZWN0aW9ucw0KICAgIGNvbmNhdDogZnVuY3Rpb24oYSwgYikgew0KICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBiW2ldOyBpKyspDQogICAgICAgIGEucHVzaChub2RlKTsNCiAgICAgIHJldHVybiBhOw0KICAgIH0sDQoNCiAgICAvLyBtYXJrcyBhbiBhcnJheSBvZiBub2RlcyBmb3IgY291bnRpbmcNCiAgICBtYXJrOiBmdW5jdGlvbihub2Rlcykgew0KICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQ0KICAgICAgICBub2RlLl9jb3VudGVkID0gdHJ1ZTsNCiAgICAgIHJldHVybiBub2RlczsNCiAgICB9LA0KDQogICAgdW5tYXJrOiBmdW5jdGlvbihub2Rlcykgew0KICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQ0KICAgICAgICBub2RlLl9jb3VudGVkID0gdW5kZWZpbmVkOw0KICAgICAgcmV0dXJuIG5vZGVzOw0KICAgIH0sDQoNCiAgICAvLyBtYXJrIGVhY2ggY2hpbGQgbm9kZSB3aXRoIGl0cyBwb3NpdGlvbiAoZm9yIG50aCBjYWxscykNCiAgICAvLyAib2ZUeXBlIiBmbGFnIGluZGljYXRlcyB3aGV0aGVyIHdlJ3JlIGluZGV4aW5nIGZvciBudGgtb2YtdHlwZQ0KICAgIC8vIHJhdGhlciB0aGFuIG50aC1jaGlsZA0KICAgIGluZGV4OiBmdW5jdGlvbihwYXJlbnROb2RlLCByZXZlcnNlLCBvZlR5cGUpIHsNCiAgICAgIHBhcmVudE5vZGUuX2NvdW50ZWQgPSB0cnVlOw0KICAgICAgaWYgKHJldmVyc2UpIHsNCiAgICAgICAgZm9yICh2YXIgbm9kZXMgPSBwYXJlbnROb2RlLmNoaWxkTm9kZXMsIGkgPSBub2Rlcy5sZW5ndGggLSAxLCBqID0gMTsgaSA+PSAwOyBpLS0pIHsNCiAgICAgICAgICBub2RlID0gbm9kZXNbaV07DQogICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSAmJiAoIW9mVHlwZSB8fCBub2RlLl9jb3VudGVkKSkgbm9kZS5ub2RlSW5kZXggPSBqKys7DQogICAgICAgIH0NCiAgICAgIH0gZWxzZSB7DQogICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gMSwgbm9kZXMgPSBwYXJlbnROb2RlLmNoaWxkTm9kZXM7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQ0KICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDEgJiYgKCFvZlR5cGUgfHwgbm9kZS5fY291bnRlZCkpIG5vZGUubm9kZUluZGV4ID0gaisrOw0KICAgICAgfQ0KICAgIH0sDQoNCiAgICAvLyBmaWx0ZXJzIG91dCBkdXBsaWNhdGVzIGFuZCBleHRlbmRzIGFsbCBub2Rlcw0KICAgIHVuaXF1ZTogZnVuY3Rpb24obm9kZXMpIHsNCiAgICAgIGlmIChub2Rlcy5sZW5ndGggPT0gMCkgcmV0dXJuIG5vZGVzOw0KICAgICAgdmFyIHJlc3VsdHMgPSBbXSwgbjsNCiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gbm9kZXMubGVuZ3RoOyBpIDwgbDsgaSsrKQ0KICAgICAgICBpZiAoIShuID0gbm9kZXNbaV0pLl9jb3VudGVkKSB7DQogICAgICAgICAgbi5fY291bnRlZCA9IHRydWU7DQogICAgICAgICAgcmVzdWx0cy5wdXNoKEVsZW1lbnQuZXh0ZW5kKG4pKTsNCiAgICAgICAgfQ0KICAgICAgcmV0dXJuIFNlbGVjdG9yLmhhbmRsZXJzLnVubWFyayhyZXN1bHRzKTsNCiAgICB9LA0KDQogICAgLy8gQ09NQklOQVRPUiBGVU5DVElPTlMNCiAgICBkZXNjZW5kYW50OiBmdW5jdGlvbihub2Rlcykgew0KICAgICAgdmFyIGggPSBTZWxlY3Rvci5oYW5kbGVyczsNCiAgICAgIGZvciAodmFyIGkgPSAwLCByZXN1bHRzID0gW10sIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQ0KICAgICAgICBoLmNvbmNhdChyZXN1bHRzLCBub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCcqJykpOw0KICAgICAgcmV0dXJuIHJlc3VsdHM7DQogICAgfSwNCg0KICAgIGNoaWxkOiBmdW5jdGlvbihub2Rlcykgew0KICAgICAgdmFyIGggPSBTZWxlY3Rvci5oYW5kbGVyczsNCiAgICAgIGZvciAodmFyIGkgPSAwLCByZXN1bHRzID0gW10sIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKSB7DQogICAgICAgIGZvciAodmFyIGogPSAwLCBjaGlsZHJlbiA9IFtdLCBjaGlsZDsgY2hpbGQgPSBub2RlLmNoaWxkTm9kZXNbal07IGorKykNCiAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT0gMSAmJiBjaGlsZC50YWdOYW1lICE9ICchJykgcmVzdWx0cy5wdXNoKGNoaWxkKTsNCiAgICAgIH0NCiAgICAgIHJldHVybiByZXN1bHRzOw0KICAgIH0sDQoNCiAgICBhZGphY2VudDogZnVuY3Rpb24obm9kZXMpIHsNCiAgICAgIGZvciAodmFyIGkgPSAwLCByZXN1bHRzID0gW10sIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKSB7DQogICAgICAgIHZhciBuZXh0ID0gdGhpcy5uZXh0RWxlbWVudFNpYmxpbmcobm9kZSk7DQogICAgICAgIGlmIChuZXh0KSByZXN1bHRzLnB1c2gobmV4dCk7DQogICAgICB9DQogICAgICByZXR1cm4gcmVzdWx0czsNCiAgICB9LA0KDQogICAgbGF0ZXJTaWJsaW5nOiBmdW5jdGlvbihub2Rlcykgew0KICAgICAgdmFyIGggPSBTZWxlY3Rvci5oYW5kbGVyczsNCiAgICAgIGZvciAodmFyIGkgPSAwLCByZXN1bHRzID0gW10sIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQ0KICAgICAgICBoLmNvbmNhdChyZXN1bHRzLCBFbGVtZW50Lm5leHRTaWJsaW5ncyhub2RlKSk7DQogICAgICByZXR1cm4gcmVzdWx0czsNCiAgICB9LA0KDQogICAgbmV4dEVsZW1lbnRTaWJsaW5nOiBmdW5jdGlvbihub2RlKSB7DQogICAgICB3aGlsZSAobm9kZSA9IG5vZGUubmV4dFNpYmxpbmcpDQoJICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSkgcmV0dXJuIG5vZGU7DQogICAgICByZXR1cm4gbnVsbDsNCiAgICB9LA0KDQogICAgcHJldmlvdXNFbGVtZW50U2libGluZzogZnVuY3Rpb24obm9kZSkgew0KICAgICAgd2hpbGUgKG5vZGUgPSBub2RlLnByZXZpb3VzU2libGluZykNCiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSkgcmV0dXJuIG5vZGU7DQogICAgICByZXR1cm4gbnVsbDsNCiAgICB9LA0KDQogICAgLy8gVE9LRU4gRlVOQ1RJT05TDQogICAgdGFnTmFtZTogZnVuY3Rpb24obm9kZXMsIHJvb3QsIHRhZ05hbWUsIGNvbWJpbmF0b3IpIHsNCiAgICAgIHRhZ05hbWUgPSB0YWdOYW1lLnRvVXBwZXJDYXNlKCk7DQogICAgICB2YXIgcmVzdWx0cyA9IFtdLCBoID0gU2VsZWN0b3IuaGFuZGxlcnM7DQogICAgICBpZiAobm9kZXMpIHsNCiAgICAgICAgaWYgKGNvbWJpbmF0b3IpIHsNCiAgICAgICAgICAvLyBmYXN0bGFuZSBmb3Igb3JkaW5hcnkgZGVzY2VuZGFudCBjb21iaW5hdG9ycw0KICAgICAgICAgIGlmIChjb21iaW5hdG9yID09ICJkZXNjZW5kYW50Iikgew0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQ0KICAgICAgICAgICAgICBoLmNvbmNhdChyZXN1bHRzLCBub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUpKTsNCiAgICAgICAgICAgIHJldHVybiByZXN1bHRzOw0KICAgICAgICAgIH0gZWxzZSBub2RlcyA9IHRoaXNbY29tYmluYXRvcl0obm9kZXMpOw0KICAgICAgICAgIGlmICh0YWdOYW1lID09ICIqIikgcmV0dXJuIG5vZGVzOw0KICAgICAgICB9DQogICAgICAgIGZvciAodmFyIGkgPSAwLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykNCiAgICAgICAgICBpZiAobm9kZS50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT0gdGFnTmFtZSkgcmVzdWx0cy5wdXNoKG5vZGUpOw0KICAgICAgICByZXR1cm4gcmVzdWx0czsNCiAgICAgIH0gZWxzZSByZXR1cm4gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdOYW1lKTsNCiAgICB9LA0KDQogICAgaWQ6IGZ1bmN0aW9uKG5vZGVzLCByb290LCBpZCwgY29tYmluYXRvcikgew0KICAgICAgdmFyIHRhcmdldE5vZGUgPSAkKGlkKSwgaCA9IFNlbGVjdG9yLmhhbmRsZXJzOw0KICAgICAgaWYgKCFub2RlcyAmJiByb290ID09IGRvY3VtZW50KSByZXR1cm4gdGFyZ2V0Tm9kZSA/IFt0YXJnZXROb2RlXSA6IFtdOw0KICAgICAgaWYgKG5vZGVzKSB7DQogICAgICAgIGlmIChjb21iaW5hdG9yKSB7DQogICAgICAgICAgaWYgKGNvbWJpbmF0b3IgPT0gJ2NoaWxkJykgew0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQ0KICAgICAgICAgICAgICBpZiAodGFyZ2V0Tm9kZS5wYXJlbnROb2RlID09IG5vZGUpIHJldHVybiBbdGFyZ2V0Tm9kZV07DQogICAgICAgICAgfSBlbHNlIGlmIChjb21iaW5hdG9yID09ICdkZXNjZW5kYW50Jykgew0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQ0KICAgICAgICAgICAgICBpZiAoRWxlbWVudC5kZXNjZW5kYW50T2YodGFyZ2V0Tm9kZSwgbm9kZSkpIHJldHVybiBbdGFyZ2V0Tm9kZV07DQogICAgICAgICAgfSBlbHNlIGlmIChjb21iaW5hdG9yID09ICdhZGphY2VudCcpIHsNCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykNCiAgICAgICAgICAgICAgaWYgKFNlbGVjdG9yLmhhbmRsZXJzLnByZXZpb3VzRWxlbWVudFNpYmxpbmcodGFyZ2V0Tm9kZSkgPT0gbm9kZSkNCiAgICAgICAgICAgICAgICByZXR1cm4gW3RhcmdldE5vZGVdOw0KICAgICAgICAgIH0gZWxzZSBub2RlcyA9IGhbY29tYmluYXRvcl0obm9kZXMpOw0KICAgICAgICB9DQogICAgICAgIGZvciAodmFyIGkgPSAwLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykNCiAgICAgICAgICBpZiAobm9kZSA9PSB0YXJnZXROb2RlKSByZXR1cm4gW3RhcmdldE5vZGVdOw0KICAgICAgICByZXR1cm4gW107DQogICAgICB9DQogICAgICByZXR1cm4gKHRhcmdldE5vZGUgJiYgRWxlbWVudC5kZXNjZW5kYW50T2YodGFyZ2V0Tm9kZSwgcm9vdCkpID8gW3RhcmdldE5vZGVdIDogW107DQogICAgfSwNCg0KICAgIGNsYXNzTmFtZTogZnVuY3Rpb24obm9kZXMsIHJvb3QsIGNsYXNzTmFtZSwgY29tYmluYXRvcikgew0KICAgICAgaWYgKG5vZGVzICYmIGNvbWJpbmF0b3IpIG5vZGVzID0gdGhpc1tjb21iaW5hdG9yXShub2Rlcyk7DQogICAgICByZXR1cm4gU2VsZWN0b3IuaGFuZGxlcnMuYnlDbGFzc05hbWUobm9kZXMsIHJvb3QsIGNsYXNzTmFtZSk7DQogICAgfSwNCg0KICAgIGJ5Q2xhc3NOYW1lOiBmdW5jdGlvbihub2Rlcywgcm9vdCwgY2xhc3NOYW1lKSB7DQogICAgICBpZiAoIW5vZGVzKSBub2RlcyA9IFNlbGVjdG9yLmhhbmRsZXJzLmRlc2NlbmRhbnQoW3Jvb3RdKTsNCiAgICAgIHZhciBuZWVkbGUgPSAnICcgKyBjbGFzc05hbWUgKyAnICc7DQogICAgICBmb3IgKHZhciBpID0gMCwgcmVzdWx0cyA9IFtdLCBub2RlLCBub2RlQ2xhc3NOYW1lOyBub2RlID0gbm9kZXNbaV07IGkrKykgew0KICAgICAgICBub2RlQ2xhc3NOYW1lID0gbm9kZS5jbGFzc05hbWU7DQogICAgICAgIGlmIChub2RlQ2xhc3NOYW1lLmxlbmd0aCA9PSAwKSBjb250aW51ZTsNCiAgICAgICAgaWYgKG5vZGVDbGFzc05hbWUgPT0gY2xhc3NOYW1lIHx8ICgnICcgKyBub2RlQ2xhc3NOYW1lICsgJyAnKS5pbmNsdWRlKG5lZWRsZSkpDQogICAgICAgICAgcmVzdWx0cy5wdXNoKG5vZGUpOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIHJlc3VsdHM7DQogICAgfSwNCg0KICAgIGF0dHJQcmVzZW5jZTogZnVuY3Rpb24obm9kZXMsIHJvb3QsIGF0dHIpIHsNCiAgICAgIHZhciByZXN1bHRzID0gW107DQogICAgICBmb3IgKHZhciBpID0gMCwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspDQogICAgICAgIGlmIChFbGVtZW50Lmhhc0F0dHJpYnV0ZShub2RlLCBhdHRyKSkgcmVzdWx0cy5wdXNoKG5vZGUpOw0KICAgICAgcmV0dXJuIHJlc3VsdHM7DQogICAgfSwNCg0KICAgIGF0dHI6IGZ1bmN0aW9uKG5vZGVzLCByb290LCBhdHRyLCB2YWx1ZSwgb3BlcmF0b3IpIHsNCiAgICAgIGlmICghbm9kZXMpIG5vZGVzID0gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOw0KICAgICAgdmFyIGhhbmRsZXIgPSBTZWxlY3Rvci5vcGVyYXRvcnNbb3BlcmF0b3JdLCByZXN1bHRzID0gW107DQogICAgICBmb3IgKHZhciBpID0gMCwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspIHsNCiAgICAgICAgdmFyIG5vZGVWYWx1ZSA9IEVsZW1lbnQucmVhZEF0dHJpYnV0ZShub2RlLCBhdHRyKTsNCiAgICAgICAgaWYgKG5vZGVWYWx1ZSA9PT0gbnVsbCkgY29udGludWU7DQogICAgICAgIGlmIChoYW5kbGVyKG5vZGVWYWx1ZSwgdmFsdWUpKSByZXN1bHRzLnB1c2gobm9kZSk7DQogICAgICB9DQogICAgICByZXR1cm4gcmVzdWx0czsNCiAgICB9LA0KDQogICAgcHNldWRvOiBmdW5jdGlvbihub2RlcywgbmFtZSwgdmFsdWUsIHJvb3QsIGNvbWJpbmF0b3IpIHsNCiAgICAgIGlmIChub2RlcyAmJiBjb21iaW5hdG9yKSBub2RlcyA9IHRoaXNbY29tYmluYXRvcl0obm9kZXMpOw0KICAgICAgaWYgKCFub2Rlcykgbm9kZXMgPSByb290LmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7DQogICAgICByZXR1cm4gU2VsZWN0b3IucHNldWRvc1tuYW1lXShub2RlcywgdmFsdWUsIHJvb3QpOw0KICAgIH0NCiAgfSwNCg0KICBwc2V1ZG9zOiB7DQogICAgJ2ZpcnN0LWNoaWxkJzogZnVuY3Rpb24obm9kZXMsIHZhbHVlLCByb290KSB7DQogICAgICBmb3IgKHZhciBpID0gMCwgcmVzdWx0cyA9IFtdLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykgew0KICAgICAgICBpZiAoU2VsZWN0b3IuaGFuZGxlcnMucHJldmlvdXNFbGVtZW50U2libGluZyhub2RlKSkgY29udGludWU7DQogICAgICAgICAgcmVzdWx0cy5wdXNoKG5vZGUpOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIHJlc3VsdHM7DQogICAgfSwNCiAgICAnbGFzdC1jaGlsZCc6IGZ1bmN0aW9uKG5vZGVzLCB2YWx1ZSwgcm9vdCkgew0KICAgICAgZm9yICh2YXIgaSA9IDAsIHJlc3VsdHMgPSBbXSwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspIHsNCiAgICAgICAgaWYgKFNlbGVjdG9yLmhhbmRsZXJzLm5leHRFbGVtZW50U2libGluZyhub2RlKSkgY29udGludWU7DQogICAgICAgICAgcmVzdWx0cy5wdXNoKG5vZGUpOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIHJlc3VsdHM7DQogICAgfSwNCiAgICAnb25seS1jaGlsZCc6IGZ1bmN0aW9uKG5vZGVzLCB2YWx1ZSwgcm9vdCkgew0KICAgICAgdmFyIGggPSBTZWxlY3Rvci5oYW5kbGVyczsNCiAgICAgIGZvciAodmFyIGkgPSAwLCByZXN1bHRzID0gW10sIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQ0KICAgICAgICBpZiAoIWgucHJldmlvdXNFbGVtZW50U2libGluZyhub2RlKSAmJiAhaC5uZXh0RWxlbWVudFNpYmxpbmcobm9kZSkpDQogICAgICAgICAgcmVzdWx0cy5wdXNoKG5vZGUpOw0KICAgICAgcmV0dXJuIHJlc3VsdHM7DQogICAgfSwNCiAgICAnbnRoLWNoaWxkJzogICAgICAgIGZ1bmN0aW9uKG5vZGVzLCBmb3JtdWxhLCByb290KSB7DQogICAgICByZXR1cm4gU2VsZWN0b3IucHNldWRvcy5udGgobm9kZXMsIGZvcm11bGEsIHJvb3QpOw0KICAgIH0sDQogICAgJ250aC1sYXN0LWNoaWxkJzogICBmdW5jdGlvbihub2RlcywgZm9ybXVsYSwgcm9vdCkgew0KICAgICAgcmV0dXJuIFNlbGVjdG9yLnBzZXVkb3MubnRoKG5vZGVzLCBmb3JtdWxhLCByb290LCB0cnVlKTsNCiAgICB9LA0KICAgICdudGgtb2YtdHlwZSc6ICAgICAgZnVuY3Rpb24obm9kZXMsIGZvcm11bGEsIHJvb3QpIHsNCiAgICAgIHJldHVybiBTZWxlY3Rvci5wc2V1ZG9zLm50aChub2RlcywgZm9ybXVsYSwgcm9vdCwgZmFsc2UsIHRydWUpOw0KICAgIH0sDQogICAgJ250aC1sYXN0LW9mLXR5cGUnOiBmdW5jdGlvbihub2RlcywgZm9ybXVsYSwgcm9vdCkgew0KICAgICAgcmV0dXJuIFNlbGVjdG9yLnBzZXVkb3MubnRoKG5vZGVzLCBmb3JtdWxhLCByb290LCB0cnVlLCB0cnVlKTsNCiAgICB9LA0KICAgICdmaXJzdC1vZi10eXBlJzogICAgZnVuY3Rpb24obm9kZXMsIGZvcm11bGEsIHJvb3QpIHsNCiAgICAgIHJldHVybiBTZWxlY3Rvci5wc2V1ZG9zLm50aChub2RlcywgIjEiLCByb290LCBmYWxzZSwgdHJ1ZSk7DQogICAgfSwNCiAgICAnbGFzdC1vZi10eXBlJzogICAgIGZ1bmN0aW9uKG5vZGVzLCBmb3JtdWxhLCByb290KSB7DQogICAgICByZXR1cm4gU2VsZWN0b3IucHNldWRvcy5udGgobm9kZXMsICIxIiwgcm9vdCwgdHJ1ZSwgdHJ1ZSk7DQogICAgfSwNCiAgICAnb25seS1vZi10eXBlJzogICAgIGZ1bmN0aW9uKG5vZGVzLCBmb3JtdWxhLCByb290KSB7DQogICAgICB2YXIgcCA9IFNlbGVjdG9yLnBzZXVkb3M7DQogICAgICByZXR1cm4gcFsnbGFzdC1vZi10eXBlJ10ocFsnZmlyc3Qtb2YtdHlwZSddKG5vZGVzLCBmb3JtdWxhLCByb290KSwgZm9ybXVsYSwgcm9vdCk7DQogICAgfSwNCg0KICAgIC8vIGhhbmRsZXMgdGhlIGFuK2IgbG9naWMNCiAgICBnZXRJbmRpY2VzOiBmdW5jdGlvbihhLCBiLCB0b3RhbCkgew0KICAgICAgaWYgKGEgPT0gMCkgcmV0dXJuIGIgPiAwID8gW2JdIDogW107DQogICAgICByZXR1cm4gJFIoMSwgdG90YWwpLmluamVjdChbXSwgZnVuY3Rpb24obWVtbywgaSkgew0KICAgICAgICBpZiAoMCA9PSAoaSAtIGIpICUgYSAmJiAoaSAtIGIpIC8gYSA+PSAwKSBtZW1vLnB1c2goaSk7DQogICAgICAgIHJldHVybiBtZW1vOw0KICAgICAgfSk7DQogICAgfSwNCg0KICAgIC8vIGhhbmRsZXMgbnRoKC1sYXN0KS1jaGlsZCwgbnRoKC1sYXN0KS1vZi10eXBlLCBhbmQgKGZpcnN0fGxhc3QpLW9mLXR5cGUNCiAgICBudGg6IGZ1bmN0aW9uKG5vZGVzLCBmb3JtdWxhLCByb290LCByZXZlcnNlLCBvZlR5cGUpIHsNCiAgICAgIGlmIChub2Rlcy5sZW5ndGggPT0gMCkgcmV0dXJuIFtdOw0KICAgICAgaWYgKGZvcm11bGEgPT0gJ2V2ZW4nKSBmb3JtdWxhID0gJzJuKzAnOw0KICAgICAgaWYgKGZvcm11bGEgPT0gJ29kZCcpICBmb3JtdWxhID0gJzJuKzEnOw0KICAgICAgdmFyIGggPSBTZWxlY3Rvci5oYW5kbGVycywgcmVzdWx0cyA9IFtdLCBpbmRleGVkID0gW10sIG07DQogICAgICBoLm1hcmsobm9kZXMpOw0KICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKSB7DQogICAgICAgIGlmICghbm9kZS5wYXJlbnROb2RlLl9jb3VudGVkKSB7DQogICAgICAgICAgaC5pbmRleChub2RlLnBhcmVudE5vZGUsIHJldmVyc2UsIG9mVHlwZSk7DQogICAgICAgICAgaW5kZXhlZC5wdXNoKG5vZGUucGFyZW50Tm9kZSk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIGlmIChmb3JtdWxhLm1hdGNoKC9eXGQrJC8pKSB7IC8vIGp1c3QgYSBudW1iZXINCiAgICAgICAgZm9ybXVsYSA9IE51bWJlcihmb3JtdWxhKTsNCiAgICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQ0KICAgICAgICAgIGlmIChub2RlLm5vZGVJbmRleCA9PSBmb3JtdWxhKSByZXN1bHRzLnB1c2gobm9kZSk7DQogICAgICB9IGVsc2UgaWYgKG0gPSBmb3JtdWxhLm1hdGNoKC9eKC0/XGQqKT9uKChbKy1dKShcZCspKT8vKSkgeyAvLyBhbitiDQogICAgICAgIGlmIChtWzFdID09ICItIikgbVsxXSA9IC0xOw0KICAgICAgICB2YXIgYSA9IG1bMV0gPyBOdW1iZXIobVsxXSkgOiAxOw0KICAgICAgICB2YXIgYiA9IG1bMl0gPyBOdW1iZXIobVsyXSkgOiAwOw0KICAgICAgICB2YXIgaW5kaWNlcyA9IFNlbGVjdG9yLnBzZXVkb3MuZ2V0SW5kaWNlcyhhLCBiLCBub2Rlcy5sZW5ndGgpOw0KICAgICAgICBmb3IgKHZhciBpID0gMCwgbm9kZSwgbCA9IGluZGljZXMubGVuZ3RoOyBub2RlID0gbm9kZXNbaV07IGkrKykgew0KICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbDsgaisrKQ0KICAgICAgICAgICAgaWYgKG5vZGUubm9kZUluZGV4ID09IGluZGljZXNbal0pIHJlc3VsdHMucHVzaChub2RlKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgaC51bm1hcmsobm9kZXMpOw0KICAgICAgaC51bm1hcmsoaW5kZXhlZCk7DQogICAgICByZXR1cm4gcmVzdWx0czsNCiAgICB9LA0KDQogICAgJ2VtcHR5JzogZnVuY3Rpb24obm9kZXMsIHZhbHVlLCByb290KSB7DQogICAgICBmb3IgKHZhciBpID0gMCwgcmVzdWx0cyA9IFtdLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykgew0KICAgICAgICAvLyBJRSB0cmVhdHMgY29tbWVudHMgYXMgZWxlbWVudCBub2Rlcw0KICAgICAgICBpZiAobm9kZS50YWdOYW1lID09ICchJyB8fCAobm9kZS5maXJzdENoaWxkICYmICFub2RlLmlubmVySFRNTC5tYXRjaCgvXlxzKiQvKSkpIGNvbnRpbnVlOw0KICAgICAgICByZXN1bHRzLnB1c2gobm9kZSk7DQogICAgICB9DQogICAgICByZXR1cm4gcmVzdWx0czsNCiAgICB9LA0KDQogICAgJ25vdCc6IGZ1bmN0aW9uKG5vZGVzLCBzZWxlY3Rvciwgcm9vdCkgew0KICAgICAgdmFyIGggPSBTZWxlY3Rvci5oYW5kbGVycywgc2VsZWN0b3JUeXBlLCBtOw0KICAgICAgdmFyIGV4Y2x1c2lvbnMgPSBuZXcgU2VsZWN0b3Ioc2VsZWN0b3IpLmZpbmRFbGVtZW50cyhyb290KTsNCiAgICAgIGgubWFyayhleGNsdXNpb25zKTsNCiAgICAgIGZvciAodmFyIGkgPSAwLCByZXN1bHRzID0gW10sIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQ0KICAgICAgICBpZiAoIW5vZGUuX2NvdW50ZWQpIHJlc3VsdHMucHVzaChub2RlKTsNCiAgICAgIGgudW5tYXJrKGV4Y2x1c2lvbnMpOw0KICAgICAgcmV0dXJuIHJlc3VsdHM7DQogICAgfSwNCg0KICAgICdlbmFibGVkJzogZnVuY3Rpb24obm9kZXMsIHZhbHVlLCByb290KSB7DQogICAgICBmb3IgKHZhciBpID0gMCwgcmVzdWx0cyA9IFtdLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykNCiAgICAgICAgaWYgKCFub2RlLmRpc2FibGVkKSByZXN1bHRzLnB1c2gobm9kZSk7DQogICAgICByZXR1cm4gcmVzdWx0czsNCiAgICB9LA0KDQogICAgJ2Rpc2FibGVkJzogZnVuY3Rpb24obm9kZXMsIHZhbHVlLCByb290KSB7DQogICAgICBmb3IgKHZhciBpID0gMCwgcmVzdWx0cyA9IFtdLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykNCiAgICAgICAgaWYgKG5vZGUuZGlzYWJsZWQpIHJlc3VsdHMucHVzaChub2RlKTsNCiAgICAgIHJldHVybiByZXN1bHRzOw0KICAgIH0sDQoNCiAgICAnY2hlY2tlZCc6IGZ1bmN0aW9uKG5vZGVzLCB2YWx1ZSwgcm9vdCkgew0KICAgICAgZm9yICh2YXIgaSA9IDAsIHJlc3VsdHMgPSBbXSwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspDQogICAgICAgIGlmIChub2RlLmNoZWNrZWQpIHJlc3VsdHMucHVzaChub2RlKTsNCiAgICAgIHJldHVybiByZXN1bHRzOw0KICAgIH0NCiAgfSwNCg0KICBvcGVyYXRvcnM6IHsNCiAgICAnPSc6ICBmdW5jdGlvbihudiwgdikgeyByZXR1cm4gbnYgPT0gdjsgfSwNCiAgICAnIT0nOiBmdW5jdGlvbihudiwgdikgeyByZXR1cm4gbnYgIT0gdjsgfSwNCiAgICAnXj0nOiBmdW5jdGlvbihudiwgdikgeyByZXR1cm4gbnYuc3RhcnRzV2l0aCh2KTsgfSwNCiAgICAnJD0nOiBmdW5jdGlvbihudiwgdikgeyByZXR1cm4gbnYuZW5kc1dpdGgodik7IH0sDQogICAgJyo9JzogZnVuY3Rpb24obnYsIHYpIHsgcmV0dXJuIG52LmluY2x1ZGUodik7IH0sDQogICAgJ349JzogZnVuY3Rpb24obnYsIHYpIHsgcmV0dXJuICgnICcgKyBudiArICcgJykuaW5jbHVkZSgnICcgKyB2ICsgJyAnKTsgfSwNCiAgICAnfD0nOiBmdW5jdGlvbihudiwgdikgeyByZXR1cm4gKCctJyArIG52LnRvVXBwZXJDYXNlKCkgKyAnLScpLmluY2x1ZGUoJy0nICsgdi50b1VwcGVyQ2FzZSgpICsgJy0nKTsgfQ0KICB9LA0KDQogIG1hdGNoRWxlbWVudHM6IGZ1bmN0aW9uKGVsZW1lbnRzLCBleHByZXNzaW9uKSB7DQogICAgdmFyIG1hdGNoZXMgPSBuZXcgU2VsZWN0b3IoZXhwcmVzc2lvbikuZmluZEVsZW1lbnRzKCksIGggPSBTZWxlY3Rvci5oYW5kbGVyczsNCiAgICBoLm1hcmsobWF0Y2hlcyk7DQogICAgZm9yICh2YXIgaSA9IDAsIHJlc3VsdHMgPSBbXSwgZWxlbWVudDsgZWxlbWVudCA9IGVsZW1lbnRzW2ldOyBpKyspDQogICAgICBpZiAoZWxlbWVudC5fY291bnRlZCkgcmVzdWx0cy5wdXNoKGVsZW1lbnQpOw0KICAgIGgudW5tYXJrKG1hdGNoZXMpOw0KICAgIHJldHVybiByZXN1bHRzOw0KICB9LA0KDQogIGZpbmRFbGVtZW50OiBmdW5jdGlvbihlbGVtZW50cywgZXhwcmVzc2lvbiwgaW5kZXgpIHsNCiAgICBpZiAodHlwZW9mIGV4cHJlc3Npb24gPT0gJ251bWJlcicpIHsNCiAgICAgIGluZGV4ID0gZXhwcmVzc2lvbjsgZXhwcmVzc2lvbiA9IGZhbHNlOw0KICAgIH0NCiAgICByZXR1cm4gU2VsZWN0b3IubWF0Y2hFbGVtZW50cyhlbGVtZW50cywgZXhwcmVzc2lvbiB8fCAnKicpW2luZGV4IHx8IDBdOw0KICB9LA0KDQogIGZpbmRDaGlsZEVsZW1lbnRzOiBmdW5jdGlvbihlbGVtZW50LCBleHByZXNzaW9ucykgew0KICAgIHZhciBleHBycyA9IGV4cHJlc3Npb25zLmpvaW4oJywnKSwgZXhwcmVzc2lvbnMgPSBbXTsNCiAgICBleHBycy5zY2FuKC8oKFtcdyM6Ln4+KygpXHMtXSt8XCp8XFsuKj9cXSkrKVxzKigsfCQpLywgZnVuY3Rpb24obSkgew0KICAgICAgZXhwcmVzc2lvbnMucHVzaChtWzFdLnN0cmlwKCkpOw0KICAgIH0pOw0KICAgIHZhciByZXN1bHRzID0gW10sIGggPSBTZWxlY3Rvci5oYW5kbGVyczsNCiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGV4cHJlc3Npb25zLmxlbmd0aCwgc2VsZWN0b3I7IGkgPCBsOyBpKyspIHsNCiAgICAgIHNlbGVjdG9yID0gbmV3IFNlbGVjdG9yKGV4cHJlc3Npb25zW2ldLnN0cmlwKCkpOw0KICAgICAgaC5jb25jYXQocmVzdWx0cywgc2VsZWN0b3IuZmluZEVsZW1lbnRzKGVsZW1lbnQpKTsNCiAgICB9DQogICAgcmV0dXJuIChsID4gMSkgPyBoLnVuaXF1ZShyZXN1bHRzKSA6IHJlc3VsdHM7DQogIH0NCn0pOw0KDQpmdW5jdGlvbiAkJCgpIHsNCiAgcmV0dXJuIFNlbGVjdG9yLmZpbmRDaGlsZEVsZW1lbnRzKGRvY3VtZW50LCAkQShhcmd1bWVudHMpKTsNCn0NCnZhciBGb3JtID0gew0KICByZXNldDogZnVuY3Rpb24oZm9ybSkgew0KICAgICQoZm9ybSkucmVzZXQoKTsNCiAgICByZXR1cm4gZm9ybTsNCiAgfSwNCg0KICBzZXJpYWxpemVFbGVtZW50czogZnVuY3Rpb24oZWxlbWVudHMsIGdldEhhc2gpIHsNCiAgICB2YXIgZGF0YSA9IGVsZW1lbnRzLmluamVjdCh7fSwgZnVuY3Rpb24ocmVzdWx0LCBlbGVtZW50KSB7DQogICAgICBpZiAoIWVsZW1lbnQuZGlzYWJsZWQgJiYgZWxlbWVudC5uYW1lKSB7DQogICAgICAgIHZhciBrZXkgPSBlbGVtZW50Lm5hbWUsIHZhbHVlID0gJChlbGVtZW50KS5nZXRWYWx1ZSgpOw0KICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgew0KICAgICAgICAgCWlmIChrZXkgaW4gcmVzdWx0KSB7DQogICAgICAgICAgICBpZiAocmVzdWx0W2tleV0uY29uc3RydWN0b3IgIT0gQXJyYXkpIHJlc3VsdFtrZXldID0gW3Jlc3VsdFtrZXldXTsNCiAgICAgICAgICAgIHJlc3VsdFtrZXldLnB1c2godmFsdWUpOw0KICAgICAgICAgIH0NCiAgICAgICAgICBlbHNlIHJlc3VsdFtrZXldID0gdmFsdWU7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIHJldHVybiByZXN1bHQ7DQogICAgfSk7DQoNCiAgICByZXR1cm4gZ2V0SGFzaCA/IGRhdGEgOiBIYXNoLnRvUXVlcnlTdHJpbmcoZGF0YSk7DQogIH0NCn07DQoNCkZvcm0uTWV0aG9kcyA9IHsNCiAgc2VyaWFsaXplOiBmdW5jdGlvbihmb3JtLCBnZXRIYXNoKSB7DQogICAgcmV0dXJuIEZvcm0uc2VyaWFsaXplRWxlbWVudHMoRm9ybS5nZXRFbGVtZW50cyhmb3JtKSwgZ2V0SGFzaCk7DQogIH0sDQoNCiAgZ2V0RWxlbWVudHM6IGZ1bmN0aW9uKGZvcm0pIHsNCiAgICByZXR1cm4gJEEoJChmb3JtKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnKicpKS5pbmplY3QoW10sDQogICAgICBmdW5jdGlvbihlbGVtZW50cywgY2hpbGQpIHsNCiAgICAgICAgaWYgKEZvcm0uRWxlbWVudC5TZXJpYWxpemVyc1tjaGlsZC50YWdOYW1lLnRvTG93ZXJDYXNlKCldKQ0KICAgICAgICAgIGVsZW1lbnRzLnB1c2goRWxlbWVudC5leHRlbmQoY2hpbGQpKTsNCiAgICAgICAgcmV0dXJuIGVsZW1lbnRzOw0KICAgICAgfQ0KICAgICk7DQogIH0sDQoNCiAgZ2V0SW5wdXRzOiBmdW5jdGlvbihmb3JtLCB0eXBlTmFtZSwgbmFtZSkgew0KICAgIGZvcm0gPSAkKGZvcm0pOw0KICAgIHZhciBpbnB1dHMgPSBmb3JtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbnB1dCcpOw0KDQogICAgaWYgKCF0eXBlTmFtZSAmJiAhbmFtZSkgcmV0dXJuICRBKGlucHV0cykubWFwKEVsZW1lbnQuZXh0ZW5kKTsNCg0KICAgIGZvciAodmFyIGkgPSAwLCBtYXRjaGluZ0lucHV0cyA9IFtdLCBsZW5ndGggPSBpbnB1dHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgIHZhciBpbnB1dCA9IGlucHV0c1tpXTsNCiAgICAgIGlmICgodHlwZU5hbWUgJiYgaW5wdXQudHlwZSAhPSB0eXBlTmFtZSkgfHwgKG5hbWUgJiYgaW5wdXQubmFtZSAhPSBuYW1lKSkNCiAgICAgICAgY29udGludWU7DQogICAgICBtYXRjaGluZ0lucHV0cy5wdXNoKEVsZW1lbnQuZXh0ZW5kKGlucHV0KSk7DQogICAgfQ0KDQogICAgcmV0dXJuIG1hdGNoaW5nSW5wdXRzOw0KICB9LA0KDQogIGRpc2FibGU6IGZ1bmN0aW9uKGZvcm0pIHsNCiAgICBmb3JtID0gJChmb3JtKTsNCiAgICBGb3JtLmdldEVsZW1lbnRzKGZvcm0pLmludm9rZSgnZGlzYWJsZScpOw0KICAgIHJldHVybiBmb3JtOw0KICB9LA0KDQogIGVuYWJsZTogZnVuY3Rpb24oZm9ybSkgew0KICAgIGZvcm0gPSAkKGZvcm0pOw0KICAgIEZvcm0uZ2V0RWxlbWVudHMoZm9ybSkuaW52b2tlKCdlbmFibGUnKTsNCiAgICByZXR1cm4gZm9ybTsNCiAgfSwNCg0KICBmaW5kRmlyc3RFbGVtZW50OiBmdW5jdGlvbihmb3JtKSB7DQogICAgcmV0dXJuICQoZm9ybSkuZ2V0RWxlbWVudHMoKS5maW5kKGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICAgIHJldHVybiBlbGVtZW50LnR5cGUgIT0gJ2hpZGRlbicgJiYgIWVsZW1lbnQuZGlzYWJsZWQgJiYNCiAgICAgICAgWydpbnB1dCcsICdzZWxlY3QnLCAndGV4dGFyZWEnXS5pbmNsdWRlKGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpKTsNCiAgICB9KTsNCiAgfSwNCg0KICBmb2N1c0ZpcnN0RWxlbWVudDogZnVuY3Rpb24oZm9ybSkgew0KICAgIGZvcm0gPSAkKGZvcm0pOw0KICAgIGZvcm0uZmluZEZpcnN0RWxlbWVudCgpLmFjdGl2YXRlKCk7DQogICAgcmV0dXJuIGZvcm07DQogIH0sDQoNCiAgcmVxdWVzdDogZnVuY3Rpb24oZm9ybSwgb3B0aW9ucykgew0KICAgIGZvcm0gPSAkKGZvcm0pLCBvcHRpb25zID0gT2JqZWN0LmNsb25lKG9wdGlvbnMgfHwge30pOw0KDQogICAgdmFyIHBhcmFtcyA9IG9wdGlvbnMucGFyYW1ldGVyczsNCiAgICBvcHRpb25zLnBhcmFtZXRlcnMgPSBmb3JtLnNlcmlhbGl6ZSh0cnVlKTsNCg0KICAgIGlmIChwYXJhbXMpIHsNCiAgICAgIGlmICh0eXBlb2YgcGFyYW1zID09ICdzdHJpbmcnKSBwYXJhbXMgPSBwYXJhbXMudG9RdWVyeVBhcmFtcygpOw0KICAgICAgT2JqZWN0LmV4dGVuZChvcHRpb25zLnBhcmFtZXRlcnMsIHBhcmFtcyk7DQogICAgfQ0KDQogICAgaWYgKGZvcm0uaGFzQXR0cmlidXRlKCdtZXRob2QnKSAmJiAhb3B0aW9ucy5tZXRob2QpDQogICAgICBvcHRpb25zLm1ldGhvZCA9IGZvcm0ubWV0aG9kOw0KDQogICAgcmV0dXJuIG5ldyBBamF4LlJlcXVlc3QoZm9ybS5yZWFkQXR0cmlidXRlKCdhY3Rpb24nKSwgb3B0aW9ucyk7DQogIH0NCn0NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCkZvcm0uRWxlbWVudCA9IHsNCiAgZm9jdXM6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICAkKGVsZW1lbnQpLmZvY3VzKCk7DQogICAgcmV0dXJuIGVsZW1lbnQ7DQogIH0sDQoNCiAgc2VsZWN0OiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgJChlbGVtZW50KS5zZWxlY3QoKTsNCiAgICByZXR1cm4gZWxlbWVudDsNCiAgfQ0KfQ0KDQpGb3JtLkVsZW1lbnQuTWV0aG9kcyA9IHsNCiAgc2VyaWFsaXplOiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogICAgaWYgKCFlbGVtZW50LmRpc2FibGVkICYmIGVsZW1lbnQubmFtZSkgew0KICAgICAgdmFyIHZhbHVlID0gZWxlbWVudC5nZXRWYWx1ZSgpOw0KICAgICAgaWYgKHZhbHVlICE9IHVuZGVmaW5lZCkgew0KICAgICAgICB2YXIgcGFpciA9IHt9Ow0KICAgICAgICBwYWlyW2VsZW1lbnQubmFtZV0gPSB2YWx1ZTsNCiAgICAgICAgcmV0dXJuIEhhc2gudG9RdWVyeVN0cmluZyhwYWlyKTsNCiAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuICcnOw0KICB9LA0KDQogIGdldFZhbHVlOiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogICAgdmFyIG1ldGhvZCA9IGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpOw0KICAgIHJldHVybiBGb3JtLkVsZW1lbnQuU2VyaWFsaXplcnNbbWV0aG9kXShlbGVtZW50KTsNCiAgfSwNCg0KICBjbGVhcjogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgICQoZWxlbWVudCkudmFsdWUgPSAnJzsNCiAgICByZXR1cm4gZWxlbWVudDsNCiAgfSwNCg0KICBwcmVzZW50OiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgcmV0dXJuICQoZWxlbWVudCkudmFsdWUgIT0gJyc7DQogIH0sDQoNCiAgYWN0aXZhdGU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsNCiAgICB0cnkgew0KICAgICAgZWxlbWVudC5mb2N1cygpOw0KICAgICAgaWYgKGVsZW1lbnQuc2VsZWN0ICYmIChlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPSAnaW5wdXQnIHx8DQogICAgICAgICFbJ2J1dHRvbicsICdyZXNldCcsICdzdWJtaXQnXS5pbmNsdWRlKGVsZW1lbnQudHlwZSkpKQ0KICAgICAgICBlbGVtZW50LnNlbGVjdCgpOw0KICAgIH0gY2F0Y2ggKGUpIHt9DQogICAgcmV0dXJuIGVsZW1lbnQ7DQogIH0sDQoNCiAgZGlzYWJsZTogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KICAgIGVsZW1lbnQuYmx1cigpOw0KICAgIGVsZW1lbnQuZGlzYWJsZWQgPSB0cnVlOw0KICAgIHJldHVybiBlbGVtZW50Ow0KICB9LA0KDQogIGVuYWJsZTogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KICAgIGVsZW1lbnQuZGlzYWJsZWQgPSBmYWxzZTsNCiAgICByZXR1cm4gZWxlbWVudDsNCiAgfQ0KfQ0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KdmFyIEZpZWxkID0gRm9ybS5FbGVtZW50Ow0KdmFyICRGID0gRm9ybS5FbGVtZW50Lk1ldGhvZHMuZ2V0VmFsdWU7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQpGb3JtLkVsZW1lbnQuU2VyaWFsaXplcnMgPSB7DQogIGlucHV0OiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgc3dpdGNoIChlbGVtZW50LnR5cGUudG9Mb3dlckNhc2UoKSkgew0KICAgICAgY2FzZSAnY2hlY2tib3gnOg0KICAgICAgY2FzZSAncmFkaW8nOg0KICAgICAgICByZXR1cm4gRm9ybS5FbGVtZW50LlNlcmlhbGl6ZXJzLmlucHV0U2VsZWN0b3IoZWxlbWVudCk7DQogICAgICBkZWZhdWx0Og0KICAgICAgICByZXR1cm4gRm9ybS5FbGVtZW50LlNlcmlhbGl6ZXJzLnRleHRhcmVhKGVsZW1lbnQpOw0KICAgIH0NCiAgfSwNCg0KICBpbnB1dFNlbGVjdG9yOiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgcmV0dXJuIGVsZW1lbnQuY2hlY2tlZCA/IGVsZW1lbnQudmFsdWUgOiBudWxsOw0KICB9LA0KDQogIHRleHRhcmVhOiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgcmV0dXJuIGVsZW1lbnQudmFsdWU7DQogIH0sDQoNCiAgc2VsZWN0OiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgcmV0dXJuIHRoaXNbZWxlbWVudC50eXBlID09ICdzZWxlY3Qtb25lJyA/DQogICAgICAnc2VsZWN0T25lJyA6ICdzZWxlY3RNYW55J10oZWxlbWVudCk7DQogIH0sDQoNCiAgc2VsZWN0T25lOiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgdmFyIGluZGV4ID0gZWxlbWVudC5zZWxlY3RlZEluZGV4Ow0KICAgIHJldHVybiBpbmRleCA+PSAwID8gdGhpcy5vcHRpb25WYWx1ZShlbGVtZW50Lm9wdGlvbnNbaW5kZXhdKSA6IG51bGw7DQogIH0sDQoNCiAgc2VsZWN0TWFueTogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgIHZhciB2YWx1ZXMsIGxlbmd0aCA9IGVsZW1lbnQubGVuZ3RoOw0KICAgIGlmICghbGVuZ3RoKSByZXR1cm4gbnVsbDsNCg0KICAgIGZvciAodmFyIGkgPSAwLCB2YWx1ZXMgPSBbXTsgaSA8IGxlbmd0aDsgaSsrKSB7DQogICAgICB2YXIgb3B0ID0gZWxlbWVudC5vcHRpb25zW2ldOw0KICAgICAgaWYgKG9wdC5zZWxlY3RlZCkgdmFsdWVzLnB1c2godGhpcy5vcHRpb25WYWx1ZShvcHQpKTsNCiAgICB9DQogICAgcmV0dXJuIHZhbHVlczsNCiAgfSwNCg0KICBvcHRpb25WYWx1ZTogZnVuY3Rpb24ob3B0KSB7DQogICAgLy8gZXh0ZW5kIGVsZW1lbnQgYmVjYXVzZSBoYXNBdHRyaWJ1dGUgbWF5IG5vdCBiZSBuYXRpdmUNCiAgICByZXR1cm4gRWxlbWVudC5leHRlbmQob3B0KS5oYXNBdHRyaWJ1dGUoJ3ZhbHVlJykgPyBvcHQudmFsdWUgOiBvcHQudGV4dDsNCiAgfQ0KfQ0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KQWJzdHJhY3QuVGltZWRPYnNlcnZlciA9IGZ1bmN0aW9uKCkge30NCkFic3RyYWN0LlRpbWVkT2JzZXJ2ZXIucHJvdG90eXBlID0gew0KICBpbml0aWFsaXplOiBmdW5jdGlvbihlbGVtZW50LCBmcmVxdWVuY3ksIGNhbGxiYWNrKSB7DQogICAgdGhpcy5mcmVxdWVuY3kgPSBmcmVxdWVuY3k7DQogICAgdGhpcy5lbGVtZW50ICAgPSAkKGVsZW1lbnQpOw0KICAgIHRoaXMuY2FsbGJhY2sgID0gY2FsbGJhY2s7DQoNCiAgICB0aGlzLmxhc3RWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsNCiAgICB0aGlzLnJlZ2lzdGVyQ2FsbGJhY2soKTsNCiAgfSwNCg0KICByZWdpc3RlckNhbGxiYWNrOiBmdW5jdGlvbigpIHsNCiAgICBzZXRJbnRlcnZhbCh0aGlzLm9uVGltZXJFdmVudC5iaW5kKHRoaXMpLCB0aGlzLmZyZXF1ZW5jeSAqIDEwMDApOw0KICB9LA0KDQogIG9uVGltZXJFdmVudDogZnVuY3Rpb24oKSB7DQogICAgdmFyIHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOw0KICAgIHZhciBjaGFuZ2VkID0gKCdzdHJpbmcnID09IHR5cGVvZiB0aGlzLmxhc3RWYWx1ZSAmJiAnc3RyaW5nJyA9PSB0eXBlb2YgdmFsdWUNCiAgICAgID8gdGhpcy5sYXN0VmFsdWUgIT0gdmFsdWUgOiBTdHJpbmcodGhpcy5sYXN0VmFsdWUpICE9IFN0cmluZyh2YWx1ZSkpOw0KICAgIGlmIChjaGFuZ2VkKSB7DQogICAgICB0aGlzLmNhbGxiYWNrKHRoaXMuZWxlbWVudCwgdmFsdWUpOw0KICAgICAgdGhpcy5sYXN0VmFsdWUgPSB2YWx1ZTsNCiAgICB9DQogIH0NCn0NCg0KRm9ybS5FbGVtZW50Lk9ic2VydmVyID0gQ2xhc3MuY3JlYXRlKCk7DQpGb3JtLkVsZW1lbnQuT2JzZXJ2ZXIucHJvdG90eXBlID0gT2JqZWN0LmV4dGVuZChuZXcgQWJzdHJhY3QuVGltZWRPYnNlcnZlcigpLCB7DQogIGdldFZhbHVlOiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gRm9ybS5FbGVtZW50LmdldFZhbHVlKHRoaXMuZWxlbWVudCk7DQogIH0NCn0pOw0KDQpGb3JtLk9ic2VydmVyID0gQ2xhc3MuY3JlYXRlKCk7DQpGb3JtLk9ic2VydmVyLnByb3RvdHlwZSA9IE9iamVjdC5leHRlbmQobmV3IEFic3RyYWN0LlRpbWVkT2JzZXJ2ZXIoKSwgew0KICBnZXRWYWx1ZTogZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIEZvcm0uc2VyaWFsaXplKHRoaXMuZWxlbWVudCk7DQogIH0NCn0pOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KQWJzdHJhY3QuRXZlbnRPYnNlcnZlciA9IGZ1bmN0aW9uKCkge30NCkFic3RyYWN0LkV2ZW50T2JzZXJ2ZXIucHJvdG90eXBlID0gew0KICBpbml0aWFsaXplOiBmdW5jdGlvbihlbGVtZW50LCBjYWxsYmFjaykgew0KICAgIHRoaXMuZWxlbWVudCAgPSAkKGVsZW1lbnQpOw0KICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjazsNCg0KICAgIHRoaXMubGFzdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOw0KICAgIGlmICh0aGlzLmVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09ICdmb3JtJykNCiAgICAgIHRoaXMucmVnaXN0ZXJGb3JtQ2FsbGJhY2tzKCk7DQogICAgZWxzZQ0KICAgICAgdGhpcy5yZWdpc3RlckNhbGxiYWNrKHRoaXMuZWxlbWVudCk7DQogIH0sDQoNCiAgb25FbGVtZW50RXZlbnQ6IGZ1bmN0aW9uKCkgew0KICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsNCiAgICBpZiAodGhpcy5sYXN0VmFsdWUgIT0gdmFsdWUpIHsNCiAgICAgIHRoaXMuY2FsbGJhY2sodGhpcy5lbGVtZW50LCB2YWx1ZSk7DQogICAgICB0aGlzLmxhc3RWYWx1ZSA9IHZhbHVlOw0KICAgIH0NCiAgfSwNCg0KICByZWdpc3RlckZvcm1DYWxsYmFja3M6IGZ1bmN0aW9uKCkgew0KICAgIEZvcm0uZ2V0RWxlbWVudHModGhpcy5lbGVtZW50KS5lYWNoKHRoaXMucmVnaXN0ZXJDYWxsYmFjay5iaW5kKHRoaXMpKTsNCiAgfSwNCg0KICByZWdpc3RlckNhbGxiYWNrOiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgaWYgKGVsZW1lbnQudHlwZSkgew0KICAgICAgc3dpdGNoIChlbGVtZW50LnR5cGUudG9Mb3dlckNhc2UoKSkgew0KICAgICAgICBjYXNlICdjaGVja2JveCc6DQogICAgICAgIGNhc2UgJ3JhZGlvJzoNCiAgICAgICAgICBFdmVudC5vYnNlcnZlKGVsZW1lbnQsICdjbGljaycsIHRoaXMub25FbGVtZW50RXZlbnQuYmluZCh0aGlzKSk7DQogICAgICAgICAgYnJlYWs7DQogICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgRXZlbnQub2JzZXJ2ZShlbGVtZW50LCAnY2hhbmdlJywgdGhpcy5vbkVsZW1lbnRFdmVudC5iaW5kKHRoaXMpKTsNCiAgICAgICAgICBicmVhazsNCiAgICAgIH0NCiAgICB9DQogIH0NCn0NCg0KRm9ybS5FbGVtZW50LkV2ZW50T2JzZXJ2ZXIgPSBDbGFzcy5jcmVhdGUoKTsNCkZvcm0uRWxlbWVudC5FdmVudE9ic2VydmVyLnByb3RvdHlwZSA9IE9iamVjdC5leHRlbmQobmV3IEFic3RyYWN0LkV2ZW50T2JzZXJ2ZXIoKSwgew0KICBnZXRWYWx1ZTogZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIEZvcm0uRWxlbWVudC5nZXRWYWx1ZSh0aGlzLmVsZW1lbnQpOw0KICB9DQp9KTsNCg0KRm9ybS5FdmVudE9ic2VydmVyID0gQ2xhc3MuY3JlYXRlKCk7DQpGb3JtLkV2ZW50T2JzZXJ2ZXIucHJvdG90eXBlID0gT2JqZWN0LmV4dGVuZChuZXcgQWJzdHJhY3QuRXZlbnRPYnNlcnZlcigpLCB7DQogIGdldFZhbHVlOiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gRm9ybS5zZXJpYWxpemUodGhpcy5lbGVtZW50KTsNCiAgfQ0KfSk7DQppZiAoIXdpbmRvdy5FdmVudCkgew0KICB2YXIgRXZlbnQgPSBuZXcgT2JqZWN0KCk7DQp9DQoNCk9iamVjdC5leHRlbmQoRXZlbnQsIHsNCiAgS0VZX0JBQ0tTUEFDRTogOCwNCiAgS0VZX1RBQjogICAgICAgOSwNCiAgS0VZX1JFVFVSTjogICAxMywNCiAgS0VZX0VTQzogICAgICAyNywNCiAgS0VZX0xFRlQ6ICAgICAzNywNCiAgS0VZX1VQOiAgICAgICAzOCwNCiAgS0VZX1JJR0hUOiAgICAzOSwNCiAgS0VZX0RPV046ICAgICA0MCwNCiAgS0VZX0RFTEVURTogICA0NiwNCiAgS0VZX0hPTUU6ICAgICAzNiwNCiAgS0VZX0VORDogICAgICAzNSwNCiAgS0VZX1BBR0VVUDogICAzMywNCiAgS0VZX1BBR0VET1dOOiAzNCwNCg0KICBlbGVtZW50OiBmdW5jdGlvbihldmVudCkgew0KICAgIHJldHVybiAkKGV2ZW50LnRhcmdldCB8fCBldmVudC5zcmNFbGVtZW50KTsNCiAgfSwNCg0KICBpc0xlZnRDbGljazogZnVuY3Rpb24oZXZlbnQpIHsNCiAgICByZXR1cm4gKCgoZXZlbnQud2hpY2gpICYmIChldmVudC53aGljaCA9PSAxKSkgfHwNCiAgICAgICAgICAgICgoZXZlbnQuYnV0dG9uKSAmJiAoZXZlbnQuYnV0dG9uID09IDEpKSk7DQogIH0sDQoNCiAgcG9pbnRlclg6IGZ1bmN0aW9uKGV2ZW50KSB7DQogICAgcmV0dXJuIGV2ZW50LnBhZ2VYIHx8IChldmVudC5jbGllbnRYICsNCiAgICAgIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQpKTsNCiAgfSwNCg0KICBwb2ludGVyWTogZnVuY3Rpb24oZXZlbnQpIHsNCiAgICByZXR1cm4gZXZlbnQucGFnZVkgfHwgKGV2ZW50LmNsaWVudFkgKw0KICAgICAgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ApKTsNCiAgfSwNCg0KICBzdG9wOiBmdW5jdGlvbihldmVudCkgew0KICAgIGlmIChldmVudC5wcmV2ZW50RGVmYXVsdCkgew0KICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsNCiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOw0KICAgIH0gZWxzZSB7DQogICAgICBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlOw0KICAgICAgZXZlbnQuY2FuY2VsQnViYmxlID0gdHJ1ZTsNCiAgICB9DQogIH0sDQoNCiAgLy8gZmluZCB0aGUgZmlyc3Qgbm9kZSB3aXRoIHRoZSBnaXZlbiB0YWdOYW1lLCBzdGFydGluZyBmcm9tIHRoZQ0KICAvLyBub2RlIHRoZSBldmVudCB3YXMgdHJpZ2dlcmVkIG9uOyB0cmF2ZXJzZXMgdGhlIERPTSB1cHdhcmRzDQogIGZpbmRFbGVtZW50OiBmdW5jdGlvbihldmVudCwgdGFnTmFtZSkgew0KICAgIHZhciBlbGVtZW50ID0gRXZlbnQuZWxlbWVudChldmVudCk7DQogICAgd2hpbGUgKGVsZW1lbnQucGFyZW50Tm9kZSAmJiAoIWVsZW1lbnQudGFnTmFtZSB8fA0KICAgICAgICAoZWxlbWVudC50YWdOYW1lLnRvVXBwZXJDYXNlKCkgIT0gdGFnTmFtZS50b1VwcGVyQ2FzZSgpKSkpDQogICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlOw0KICAgIHJldHVybiBlbGVtZW50Ow0KICB9LA0KDQogIG9ic2VydmVyczogZmFsc2UsDQoNCiAgX29ic2VydmVBbmRDYWNoZTogZnVuY3Rpb24oZWxlbWVudCwgbmFtZSwgb2JzZXJ2ZXIsIHVzZUNhcHR1cmUpIHsNCiAgICBpZiAoIXRoaXMub2JzZXJ2ZXJzKSB0aGlzLm9ic2VydmVycyA9IFtdOw0KICAgIGlmIChlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIpIHsNCiAgICAgIHRoaXMub2JzZXJ2ZXJzLnB1c2goW2VsZW1lbnQsIG5hbWUsIG9ic2VydmVyLCB1c2VDYXB0dXJlXSk7DQogICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgb2JzZXJ2ZXIsIHVzZUNhcHR1cmUpOw0KICAgIH0gZWxzZSBpZiAoZWxlbWVudC5hdHRhY2hFdmVudCkgew0KICAgICAgdGhpcy5vYnNlcnZlcnMucHVzaChbZWxlbWVudCwgbmFtZSwgb2JzZXJ2ZXIsIHVzZUNhcHR1cmVdKTsNCiAgICAgIGVsZW1lbnQuYXR0YWNoRXZlbnQoJ29uJyArIG5hbWUsIG9ic2VydmVyKTsNCiAgICB9DQogIH0sDQoNCiAgdW5sb2FkQ2FjaGU6IGZ1bmN0aW9uKCkgew0KICAgIGlmICghRXZlbnQub2JzZXJ2ZXJzKSByZXR1cm47DQogICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IEV2ZW50Lm9ic2VydmVycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgew0KICAgICAgRXZlbnQuc3RvcE9ic2VydmluZy5hcHBseSh0aGlzLCBFdmVudC5vYnNlcnZlcnNbaV0pOw0KICAgICAgRXZlbnQub2JzZXJ2ZXJzW2ldWzBdID0gbnVsbDsNCiAgICB9DQogICAgRXZlbnQub2JzZXJ2ZXJzID0gZmFsc2U7DQogIH0sDQoNCiAgb2JzZXJ2ZTogZnVuY3Rpb24oZWxlbWVudCwgbmFtZSwgb2JzZXJ2ZXIsIHVzZUNhcHR1cmUpIHsNCiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsNCiAgICB1c2VDYXB0dXJlID0gdXNlQ2FwdHVyZSB8fCBmYWxzZTsNCg0KICAgIGlmIChuYW1lID09ICdrZXlwcmVzcycgJiYNCiAgICAgIChQcm90b3R5cGUuQnJvd3Nlci5XZWJLaXQgfHwgZWxlbWVudC5hdHRhY2hFdmVudCkpDQogICAgICBuYW1lID0gJ2tleWRvd24nOw0KDQogICAgRXZlbnQuX29ic2VydmVBbmRDYWNoZShlbGVtZW50LCBuYW1lLCBvYnNlcnZlciwgdXNlQ2FwdHVyZSk7DQogIH0sDQoNCiAgc3RvcE9ic2VydmluZzogZnVuY3Rpb24oZWxlbWVudCwgbmFtZSwgb2JzZXJ2ZXIsIHVzZUNhcHR1cmUpIHsNCiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsNCiAgICB1c2VDYXB0dXJlID0gdXNlQ2FwdHVyZSB8fCBmYWxzZTsNCg0KICAgIGlmIChuYW1lID09ICdrZXlwcmVzcycgJiYNCiAgICAgICAgKFByb3RvdHlwZS5Ccm93c2VyLldlYktpdCB8fCBlbGVtZW50LmF0dGFjaEV2ZW50KSkNCiAgICAgIG5hbWUgPSAna2V5ZG93bic7DQoNCiAgICBpZiAoZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKSB7DQogICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgb2JzZXJ2ZXIsIHVzZUNhcHR1cmUpOw0KICAgIH0gZWxzZSBpZiAoZWxlbWVudC5kZXRhY2hFdmVudCkgew0KICAgICAgdHJ5IHsNCiAgICAgICAgZWxlbWVudC5kZXRhY2hFdmVudCgnb24nICsgbmFtZSwgb2JzZXJ2ZXIpOw0KICAgICAgfSBjYXRjaCAoZSkge30NCiAgICB9DQogIH0NCn0pOw0KDQovKiBwcmV2ZW50IG1lbW9yeSBsZWFrcyBpbiBJRSAqLw0KaWYgKFByb3RvdHlwZS5Ccm93c2VyLklFKQ0KICBFdmVudC5vYnNlcnZlKHdpbmRvdywgJ3VubG9hZCcsIEV2ZW50LnVubG9hZENhY2hlLCBmYWxzZSk7DQp2YXIgUG9zaXRpb24gPSB7DQogIC8vIHNldCB0byB0cnVlIGlmIG5lZWRlZCwgd2FybmluZzogZmlyZWZveCBwZXJmb3JtYW5jZSBwcm9ibGVtcw0KICAvLyBOT1QgbmVlZWRlZCBmb3IgcGFnZSBzY3JvbGxpbmcsIG9ubHkgaWYgZHJhZ2dhYmxlIGNvbnRhaW5lZCBpbg0KICAvLyBzY3JvbGxhYmxlIGVsZW1lbnRzDQogIGluY2x1ZGVTY3JvbGxPZmZzZXRzOiBmYWxzZSwNCg0KICAvLyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyB3aXRoaW5JbmNsdWRpbmdTY3JvbGxvZmZzZXQsIGV2ZXJ5IHRpbWUgdGhlDQogIC8vIHBhZ2UgaXMgc2Nyb2xsZWQNCiAgcHJlcGFyZTogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5kZWx0YVggPSAgd2luZG93LnBhZ2VYT2Zmc2V0DQogICAgICAgICAgICAgICAgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQNCiAgICAgICAgICAgICAgICB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQNCiAgICAgICAgICAgICAgICB8fCAwOw0KICAgIHRoaXMuZGVsdGFZID0gIHdpbmRvdy5wYWdlWU9mZnNldA0KICAgICAgICAgICAgICAgIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3ANCiAgICAgICAgICAgICAgICB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcA0KICAgICAgICAgICAgICAgIHx8IDA7DQogIH0sDQoNCiAgcmVhbE9mZnNldDogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgIHZhciB2YWx1ZVQgPSAwLCB2YWx1ZUwgPSAwOw0KICAgIGRvIHsNCiAgICAgIHZhbHVlVCArPSBlbGVtZW50LnNjcm9sbFRvcCAgfHwgMDsNCiAgICAgIHZhbHVlTCArPSBlbGVtZW50LnNjcm9sbExlZnQgfHwgMDsNCiAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7DQogICAgfSB3aGlsZSAoZWxlbWVudCk7DQogICAgcmV0dXJuIFt2YWx1ZUwsIHZhbHVlVF07DQogIH0sDQoNCiAgY3VtdWxhdGl2ZU9mZnNldDogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgIHZhciB2YWx1ZVQgPSAwLCB2YWx1ZUwgPSAwOw0KICAgIGRvIHsNCiAgICAgIHZhbHVlVCArPSBlbGVtZW50Lm9mZnNldFRvcCAgfHwgMDsNCiAgICAgIHZhbHVlTCArPSBlbGVtZW50Lm9mZnNldExlZnQgfHwgMDsNCiAgICAgIGVsZW1lbnQgPSBlbGVtZW50Lm9mZnNldFBhcmVudDsNCiAgICB9IHdoaWxlIChlbGVtZW50KTsNCiAgICByZXR1cm4gW3ZhbHVlTCwgdmFsdWVUXTsNCiAgfSwNCg0KICBwb3NpdGlvbmVkT2Zmc2V0OiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgdmFyIHZhbHVlVCA9IDAsIHZhbHVlTCA9IDA7DQogICAgZG8gew0KICAgICAgdmFsdWVUICs9IGVsZW1lbnQub2Zmc2V0VG9wICB8fCAwOw0KICAgICAgdmFsdWVMICs9IGVsZW1lbnQub2Zmc2V0TGVmdCB8fCAwOw0KICAgICAgZWxlbWVudCA9IGVsZW1lbnQub2Zmc2V0UGFyZW50Ow0KICAgICAgaWYgKGVsZW1lbnQpIHsNCiAgICAgICAgaWYoZWxlbWVudC50YWdOYW1lPT0nQk9EWScpIGJyZWFrOw0KICAgICAgICB2YXIgcCA9IEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwgJ3Bvc2l0aW9uJyk7DQogICAgICAgIGlmIChwID09ICdyZWxhdGl2ZScgfHwgcCA9PSAnYWJzb2x1dGUnKSBicmVhazsNCiAgICAgIH0NCiAgICB9IHdoaWxlIChlbGVtZW50KTsNCiAgICByZXR1cm4gW3ZhbHVlTCwgdmFsdWVUXTsNCiAgfSwNCg0KICBvZmZzZXRQYXJlbnQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICBpZiAoZWxlbWVudC5vZmZzZXRQYXJlbnQpIHJldHVybiBlbGVtZW50Lm9mZnNldFBhcmVudDsNCiAgICBpZiAoZWxlbWVudCA9PSBkb2N1bWVudC5ib2R5KSByZXR1cm4gZWxlbWVudDsNCg0KICAgIHdoaWxlICgoZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSkgJiYgZWxlbWVudCAhPSBkb2N1bWVudC5ib2R5KQ0KICAgICAgaWYgKEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwgJ3Bvc2l0aW9uJykgIT0gJ3N0YXRpYycpDQogICAgICAgIHJldHVybiBlbGVtZW50Ow0KDQogICAgcmV0dXJuIGRvY3VtZW50LmJvZHk7DQogIH0sDQoNCiAgLy8gY2FjaGVzIHgveSBjb29yZGluYXRlIHBhaXIgdG8gdXNlIHdpdGggb3ZlcmxhcA0KICB3aXRoaW46IGZ1bmN0aW9uKGVsZW1lbnQsIHgsIHkpIHsNCiAgICBpZiAodGhpcy5pbmNsdWRlU2Nyb2xsT2Zmc2V0cykNCiAgICAgIHJldHVybiB0aGlzLndpdGhpbkluY2x1ZGluZ1Njcm9sbG9mZnNldHMoZWxlbWVudCwgeCwgeSk7DQogICAgdGhpcy54Y29tcCA9IHg7DQogICAgdGhpcy55Y29tcCA9IHk7DQogICAgdGhpcy5vZmZzZXQgPSB0aGlzLmN1bXVsYXRpdmVPZmZzZXQoZWxlbWVudCk7DQoNCiAgICByZXR1cm4gKHkgPj0gdGhpcy5vZmZzZXRbMV0gJiYNCiAgICAgICAgICAgIHkgPCAgdGhpcy5vZmZzZXRbMV0gKyBlbGVtZW50Lm9mZnNldEhlaWdodCAmJg0KICAgICAgICAgICAgeCA+PSB0aGlzLm9mZnNldFswXSAmJg0KICAgICAgICAgICAgeCA8ICB0aGlzLm9mZnNldFswXSArIGVsZW1lbnQub2Zmc2V0V2lkdGgpOw0KICB9LA0KDQogIHdpdGhpbkluY2x1ZGluZ1Njcm9sbG9mZnNldHM6IGZ1bmN0aW9uKGVsZW1lbnQsIHgsIHkpIHsNCiAgICB2YXIgb2Zmc2V0Y2FjaGUgPSB0aGlzLnJlYWxPZmZzZXQoZWxlbWVudCk7DQoNCiAgICB0aGlzLnhjb21wID0geCArIG9mZnNldGNhY2hlWzBdIC0gdGhpcy5kZWx0YVg7DQogICAgdGhpcy55Y29tcCA9IHkgKyBvZmZzZXRjYWNoZVsxXSAtIHRoaXMuZGVsdGFZOw0KICAgIHRoaXMub2Zmc2V0ID0gdGhpcy5jdW11bGF0aXZlT2Zmc2V0KGVsZW1lbnQpOw0KDQogICAgcmV0dXJuICh0aGlzLnljb21wID49IHRoaXMub2Zmc2V0WzFdICYmDQogICAgICAgICAgICB0aGlzLnljb21wIDwgIHRoaXMub2Zmc2V0WzFdICsgZWxlbWVudC5vZmZzZXRIZWlnaHQgJiYNCiAgICAgICAgICAgIHRoaXMueGNvbXAgPj0gdGhpcy5vZmZzZXRbMF0gJiYNCiAgICAgICAgICAgIHRoaXMueGNvbXAgPCAgdGhpcy5vZmZzZXRbMF0gKyBlbGVtZW50Lm9mZnNldFdpZHRoKTsNCiAgfSwNCg0KICAvLyB3aXRoaW4gbXVzdCBiZSBjYWxsZWQgZGlyZWN0bHkgYmVmb3JlDQogIG92ZXJsYXA6IGZ1bmN0aW9uKG1vZGUsIGVsZW1lbnQpIHsNCiAgICBpZiAoIW1vZGUpIHJldHVybiAwOw0KICAgIGlmIChtb2RlID09ICd2ZXJ0aWNhbCcpDQogICAgICByZXR1cm4gKCh0aGlzLm9mZnNldFsxXSArIGVsZW1lbnQub2Zmc2V0SGVpZ2h0KSAtIHRoaXMueWNvbXApIC8NCiAgICAgICAgZWxlbWVudC5vZmZzZXRIZWlnaHQ7DQogICAgaWYgKG1vZGUgPT0gJ2hvcml6b250YWwnKQ0KICAgICAgcmV0dXJuICgodGhpcy5vZmZzZXRbMF0gKyBlbGVtZW50Lm9mZnNldFdpZHRoKSAtIHRoaXMueGNvbXApIC8NCiAgICAgICAgZWxlbWVudC5vZmZzZXRXaWR0aDsNCiAgfSwNCg0KICBwYWdlOiBmdW5jdGlvbihmb3JFbGVtZW50KSB7DQogICAgdmFyIHZhbHVlVCA9IDAsIHZhbHVlTCA9IDA7DQoNCiAgICB2YXIgZWxlbWVudCA9IGZvckVsZW1lbnQ7DQogICAgZG8gew0KICAgICAgdmFsdWVUICs9IGVsZW1lbnQub2Zmc2V0VG9wICB8fCAwOw0KICAgICAgdmFsdWVMICs9IGVsZW1lbnQub2Zmc2V0TGVmdCB8fCAwOw0KDQogICAgICAvLyBTYWZhcmkgZml4DQogICAgICBpZiAoZWxlbWVudC5vZmZzZXRQYXJlbnQgPT0gZG9jdW1lbnQuYm9keSkNCiAgICAgICAgaWYgKEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwncG9zaXRpb24nKT09J2Fic29sdXRlJykgYnJlYWs7DQoNCiAgICB9IHdoaWxlIChlbGVtZW50ID0gZWxlbWVudC5vZmZzZXRQYXJlbnQpOw0KDQogICAgZWxlbWVudCA9IGZvckVsZW1lbnQ7DQogICAgZG8gew0KICAgICAgaWYgKCF3aW5kb3cub3BlcmEgfHwgZWxlbWVudC50YWdOYW1lPT0nQk9EWScpIHsNCiAgICAgICAgdmFsdWVUIC09IGVsZW1lbnQuc2Nyb2xsVG9wICB8fCAwOw0KICAgICAgICB2YWx1ZUwgLT0gZWxlbWVudC5zY3JvbGxMZWZ0IHx8IDA7DQogICAgICB9DQogICAgfSB3aGlsZSAoZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSk7DQoNCiAgICByZXR1cm4gW3ZhbHVlTCwgdmFsdWVUXTsNCiAgfSwNCg0KICBjbG9uZTogZnVuY3Rpb24oc291cmNlLCB0YXJnZXQpIHsNCiAgICB2YXIgb3B0aW9ucyA9IE9iamVjdC5leHRlbmQoew0KICAgICAgc2V0TGVmdDogICAgdHJ1ZSwNCiAgICAgIHNldFRvcDogICAgIHRydWUsDQogICAgICBzZXRXaWR0aDogICB0cnVlLA0KICAgICAgc2V0SGVpZ2h0OiAgdHJ1ZSwNCiAgICAgIG9mZnNldFRvcDogIDAsDQogICAgICBvZmZzZXRMZWZ0OiAwDQogICAgfSwgYXJndW1lbnRzWzJdIHx8IHt9KQ0KDQogICAgLy8gZmluZCBwYWdlIHBvc2l0aW9uIG9mIHNvdXJjZQ0KICAgIHNvdXJjZSA9ICQoc291cmNlKTsNCiAgICB2YXIgcCA9IFBvc2l0aW9uLnBhZ2Uoc291cmNlKTsNCg0KICAgIC8vIGZpbmQgY29vcmRpbmF0ZSBzeXN0ZW0gdG8gdXNlDQogICAgdGFyZ2V0ID0gJCh0YXJnZXQpOw0KICAgIHZhciBkZWx0YSA9IFswLCAwXTsNCiAgICB2YXIgcGFyZW50ID0gbnVsbDsNCiAgICAvLyBkZWx0YSBbMCwwXSB3aWxsIGRvIGZpbmUgd2l0aCBwb3NpdGlvbjogZml4ZWQgZWxlbWVudHMsDQogICAgLy8gcG9zaXRpb246YWJzb2x1dGUgbmVlZHMgb2Zmc2V0UGFyZW50IGRlbHRhcw0KICAgIGlmIChFbGVtZW50LmdldFN0eWxlKHRhcmdldCwncG9zaXRpb24nKSA9PSAnYWJzb2x1dGUnKSB7DQogICAgICBwYXJlbnQgPSBQb3NpdGlvbi5vZmZzZXRQYXJlbnQodGFyZ2V0KTsNCiAgICAgIGRlbHRhID0gUG9zaXRpb24ucGFnZShwYXJlbnQpOw0KICAgIH0NCg0KICAgIC8vIGNvcnJlY3QgYnkgYm9keSBvZmZzZXRzIChmaXhlcyBTYWZhcmkpDQogICAgaWYgKHBhcmVudCA9PSBkb2N1bWVudC5ib2R5KSB7DQogICAgICBkZWx0YVswXSAtPSBkb2N1bWVudC5ib2R5Lm9mZnNldExlZnQ7DQogICAgICBkZWx0YVsxXSAtPSBkb2N1bWVudC5ib2R5Lm9mZnNldFRvcDsNCiAgICB9DQoNCiAgICAvLyBzZXQgcG9zaXRpb24NCiAgICBpZihvcHRpb25zLnNldExlZnQpICAgdGFyZ2V0LnN0eWxlLmxlZnQgID0gKHBbMF0gLSBkZWx0YVswXSArIG9wdGlvbnMub2Zmc2V0TGVmdCkgKyAncHgnOw0KICAgIGlmKG9wdGlvbnMuc2V0VG9wKSAgICB0YXJnZXQuc3R5bGUudG9wICAgPSAocFsxXSAtIGRlbHRhWzFdICsgb3B0aW9ucy5vZmZzZXRUb3ApICsgJ3B4JzsNCiAgICBpZihvcHRpb25zLnNldFdpZHRoKSAgdGFyZ2V0LnN0eWxlLndpZHRoID0gc291cmNlLm9mZnNldFdpZHRoICsgJ3B4JzsNCiAgICBpZihvcHRpb25zLnNldEhlaWdodCkgdGFyZ2V0LnN0eWxlLmhlaWdodCA9IHNvdXJjZS5vZmZzZXRIZWlnaHQgKyAncHgnOw0KICB9LA0KDQogIGFic29sdXRpemU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsNCiAgICBpZiAoZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9PSAnYWJzb2x1dGUnKSByZXR1cm47DQogICAgUG9zaXRpb24ucHJlcGFyZSgpOw0KDQogICAgdmFyIG9mZnNldHMgPSBQb3NpdGlvbi5wb3NpdGlvbmVkT2Zmc2V0KGVsZW1lbnQpOw0KICAgIHZhciB0b3AgICAgID0gb2Zmc2V0c1sxXTsNCiAgICB2YXIgbGVmdCAgICA9IG9mZnNldHNbMF07DQogICAgdmFyIHdpZHRoICAgPSBlbGVtZW50LmNsaWVudFdpZHRoOw0KICAgIHZhciBoZWlnaHQgID0gZWxlbWVudC5jbGllbnRIZWlnaHQ7DQoNCiAgICBlbGVtZW50Ll9vcmlnaW5hbExlZnQgICA9IGxlZnQgLSBwYXJzZUZsb2F0KGVsZW1lbnQuc3R5bGUubGVmdCAgfHwgMCk7DQogICAgZWxlbWVudC5fb3JpZ2luYWxUb3AgICAgPSB0b3AgIC0gcGFyc2VGbG9hdChlbGVtZW50LnN0eWxlLnRvcCB8fCAwKTsNCiAgICBlbGVtZW50Ll9vcmlnaW5hbFdpZHRoICA9IGVsZW1lbnQuc3R5bGUud2lkdGg7DQogICAgZWxlbWVudC5fb3JpZ2luYWxIZWlnaHQgPSBlbGVtZW50LnN0eWxlLmhlaWdodDsNCg0KICAgIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnOw0KICAgIGVsZW1lbnQuc3R5bGUudG9wICAgID0gdG9wICsgJ3B4JzsNCiAgICBlbGVtZW50LnN0eWxlLmxlZnQgICA9IGxlZnQgKyAncHgnOw0KICAgIGVsZW1lbnQuc3R5bGUud2lkdGggID0gd2lkdGggKyAncHgnOw0KICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JzsNCiAgfSwNCg0KICByZWxhdGl2aXplOiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogICAgaWYgKGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPT0gJ3JlbGF0aXZlJykgcmV0dXJuOw0KICAgIFBvc2l0aW9uLnByZXBhcmUoKTsNCg0KICAgIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnOw0KICAgIHZhciB0b3AgID0gcGFyc2VGbG9hdChlbGVtZW50LnN0eWxlLnRvcCAgfHwgMCkgLSAoZWxlbWVudC5fb3JpZ2luYWxUb3AgfHwgMCk7DQogICAgdmFyIGxlZnQgPSBwYXJzZUZsb2F0KGVsZW1lbnQuc3R5bGUubGVmdCB8fCAwKSAtIChlbGVtZW50Ll9vcmlnaW5hbExlZnQgfHwgMCk7DQoNCiAgICBlbGVtZW50LnN0eWxlLnRvcCAgICA9IHRvcCArICdweCc7DQogICAgZWxlbWVudC5zdHlsZS5sZWZ0ICAgPSBsZWZ0ICsgJ3B4JzsNCiAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9IGVsZW1lbnQuX29yaWdpbmFsSGVpZ2h0Ow0KICAgIGVsZW1lbnQuc3R5bGUud2lkdGggID0gZWxlbWVudC5fb3JpZ2luYWxXaWR0aDsNCiAgfQ0KfQ0KDQovLyBTYWZhcmkgcmV0dXJucyBtYXJnaW5zIG9uIGJvZHkgd2hpY2ggaXMgaW5jb3JyZWN0IGlmIHRoZSBjaGlsZCBpcyBhYnNvbHV0ZWx5DQovLyBwb3NpdGlvbmVkLiAgRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHJlZGVmaW5lIFBvc2l0aW9uLmN1bXVsYXRpdmVPZmZzZXQgZm9yDQovLyBLSFRNTC9XZWJLaXQgb25seS4NCmlmIChQcm90b3R5cGUuQnJvd3Nlci5XZWJLaXQpIHsNCiAgUG9zaXRpb24uY3VtdWxhdGl2ZU9mZnNldCA9IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICB2YXIgdmFsdWVUID0gMCwgdmFsdWVMID0gMDsNCiAgICBkbyB7DQogICAgICB2YWx1ZVQgKz0gZWxlbWVudC5vZmZzZXRUb3AgIHx8IDA7DQogICAgICB2YWx1ZUwgKz0gZWxlbWVudC5vZmZzZXRMZWZ0IHx8IDA7DQogICAgICBpZiAoZWxlbWVudC5vZmZzZXRQYXJlbnQgPT0gZG9jdW1lbnQuYm9keSkNCiAgICAgICAgaWYgKEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwgJ3Bvc2l0aW9uJykgPT0gJ2Fic29sdXRlJykgYnJlYWs7DQoNCiAgICAgIGVsZW1lbnQgPSBlbGVtZW50Lm9mZnNldFBhcmVudDsNCiAgICB9IHdoaWxlIChlbGVtZW50KTsNCg0KICAgIHJldHVybiBbdmFsdWVMLCB2YWx1ZVRdOw0KICB9DQp9DQoNCkVsZW1lbnQuYWRkTWV0aG9kcygpOw==]]></data>
	</file>
	<file>
	  <filename>/test/test.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCmVycm9yX3JlcG9ydGluZyhFX1NUUklDVCk7DQoNCmZ3cml0ZShTVERFUlIsIG1lbW9yeV9nZXRfcGVha191c2FnZSh0cnVlKS4iXG4iKTsNCg0KcmVxdWlyZSAnLi4vanNtaW4ucGhwJzsNCmVjaG8gSlNNaW46Om1pbmlmeShmaWxlX2dldF9jb250ZW50cygncHJvdG90eXBlLmpzJykpOw0KDQpmd3JpdGUoU1RERVJSLCBtZW1vcnlfZ2V0X3BlYWtfdXNhZ2UodHJ1ZSkuIlxuIik7DQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/UDT/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/UDT/orig_PPBM_Example_Email_UDT.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8vLy8vLy8vDQovLy8vDQovLy8vIExldCdzIGdldCB0aG9zZSB2YXJzIGZyb20gdGhlIHBheXBhbCBwb3N0DQovLy8vDQovLy8vLy8vLw0KLy9wcmludF9yKCRfUE9TVCk7DQovL2VjaG8iPGJyLz48YnIvPiI7DQovL3ByaW50X3IoJF9HRVQpOw0KDQoNCmdsb2JhbCAkZ0NtczsNCgkkY2NNRT0gJF9QT1NUWydwYXllcl9lbWFpbCddOyAgLy8vIFVzZXINCiAgICAkZnJvbUVtYWlsPSJ3ZXJlIGlzIGl0IGZyb20iOyAgLy8vIE1vc3Qgd291bGQgd2FudCB0byBoYXZlICAtLUFERCBDTVNNYWlsZXIgQWRkcmVzcy0tDQogICAgJFVwbG9hZGVkdG9vID0gJ3lvdXIgZW1haWwgJzsgIC8vLyBBZGQgYW4gZW1haWwgdGhhdCB0aGUgbWFpbiBpcyBzdWJtaXRlZCB0by4NCiAgICANCiAgICAkc3VtbWFyeT0gJ1lvdSBoYXZlIHNpZ25lZCB1cCBmb3IgYSBvbmxpbmUgY2xhc3MnOw0KDQogICAgJGRlc2NyaXB0aW9uID0gJF9QT1NUWydpdGVtX25hbWUnXTsNCiAgICANCiAgICAkTWFpbGluZ0FERD0kX1BPU1RbJ2FkZHJlc3NfbmFtZSddLic8YnIvPic7DQogICAgJE1haWxpbmdBREQuPSRfUE9TVFsnYWRkcmVzc19zdHJlZXQnXS4nPGJyLz4nOw0KICAgICRNYWlsaW5nQURELj0kX1BPU1RbJ2FkZHJlc3NfY2l0eSddLicgJy4kX1BPU1RbJ2FkZHJlc3Nfc3RhdGUnXS4nLCAnLiRfUE9TVFsnYWRkcmVzc196aXAnXS4nPGJyLz4nOw0KICAgIA0KICAgICAgICAgICAgJENDdGV4dCA9ICI8aDM+V2VsY29tZSBGcm9tIFNKUk1DLm9yZzwvaDM+IjsNCiAgICAgICAgICAgICRUT3RleHQgPSAnPGgzPlRoZXJlIGlzIGEgTmV3IG9yZGVyIGZyb20gPGEgaHJlZj0ibWFpbHRvOicuJGNjTUUuJz9zdWJqZWN0PUZhbGxvdyBVcCBvbiBvbmxpbmUgQ2xhc3MiPicuJF9QT1NUWydmaXJzdF9uYW1lJ10uJyAnLiRfUE9TVFsnbGFzdF9uYW1lJ10uJzwvYT48L2gzPjxici8+PGg0PkNvbnRhY3QgaW5mb3JtYXRpb248L2g0PiBNYWlsaW5nOjxici8+Jy4kTWFpbGluZ0FERC4nPGJyLz5FbWFpbDo8YnIvPicuJGNjTUUuJyc7DQoNCiAgICAkYm9keXRleHQgPSAnPGJyLz4NCiAgICA8YnIvPjxici8+DQogICAgPGJyLz4NCiAgICA8YnIvPjxoMj5Zb3UgaGF2ZSBzaWduZWQgdXAgZm9yPC9oMj4nLiRkZXNjcmlwdGlvbi4nPGJyLz48YnIvPjxkaXYgYWxpZ249bGVmdD48c3Bhbj5UaGUgdXBsb2FkZXJzIElQIGlzICcuJGlwLic8YnIvPjxzcGFuIA0KICAgIHN0eWxlPSJGT05ULVdFSUdIVDogODAwOyBGT05ULVNJWkU6IDlweCI+DQogICAgPGhyLz4NCiAgICBDT05GSURFTlRJQUxJVFkgTk9USUNFOiBUaGlzIGVtYWlsIG1lc3NhZ2UgYW5kIGFueSBhY2NvbXBhbnlpbmcgZGF0YSBvciBmaWxlcyBpcyBjb25maWRlbnRpYWwgYW5kIG1heQ0KY29udGFpbiBwcml2aWxlZ2VkIGluZm9ybWF0aW9uIGludGVuZGVkIG9ubHkgZm9yIHRoZSBuYW1lZCByZWNpcGllbnQocykuIElmIHlvdSBhcmUgbm90IHRoZSBpbnRlbmRlZCByZWNpcGllbnQocyksIHlvdSBhcmUgaGVyZWJ5IG5vdGlmaWVkIHRoYXQgdGhlIGRpc3NlbWluYXRpb24sIGRpc3RyaWJ1dGlvbiwgYW5kIG9yIGNvcHlpbmcgb2YgdGhpcyBtZXNzYWdlIGlzIHN0cmljdGx5IHByb2hpYml0ZWQuIElmIHlvdSByZWNlaXZlIHRoaXMgbWVzc2FnZSBpbiBlcnJvciwgb3IgYXJlIG5vdCB0aGUgbmFtZWQgcmVjaXBpZW50KHMpLCBwbGVhc2Ugbm90aWZ5IHRoZSBzZW5kZXIgYXQgdGhlIGVtYWlsIGFkZHJlc3MgYWJvdmUsIGRlbGV0ZSB0aGlzIGVtYWlsIGZyb20geW91ciBjb21wdXRlciwgYW5kIGRlc3Ryb3kgYW55IGNvcGllcyBpbiBhbnkgZm9ybSBpbW1lZGlhdGVseS5SZWNlaXB0IGJ5IGFueW9uZSBvdGhlciB0aGFuIHRoZSBuYW1lZCByZWNpcGllbnQocykgaXMgbm90IGEgd2FpdmVyIG9mIGFueSBhdHRvcm5leS1jbGllbnQsIHdvcmsgcHJvZHVjdCwgb3Igb3RoZXIgYXBwbGljYWJsZSBwcml2aWxlZ2UuDQogDQogICAgPGJyLz48YnIvPg0KICAgIDxoci8+DQogICAgPC9zcGFuPjwvc3Bhbj48L2Rpdj4NCiAgICAnOw0KICAgIA0KICAgICRjbXNtYWlsZXIgPSYgJGdDbXMtPm1vZHVsZXNbJ0NNU01haWxlciddWydvYmplY3QnXTsNCiAgICANCiAgICAkYWRkcmVzc2VzID0gYXJyYXkoKTsNCiAgICAkYWRkcmVzc2VzWzBdID0gJGNjTUU7DQoJJGFkZHJlc3Nlc1sxXSA9ICRVcGxvYWRlZHRvbzsNCg0KICAgIC8vJGFkZHJlc3Nlc1syXSA9ICIqIjsNCiAgICAvLyRhZGRyZXNzZXNbM10gPSAiKiI7DQogICAgDQogICAgZm9yZWFjaCgkYWRkcmVzc2VzIGFzICRvbmVfYWRkcmVzcyl7DQogICAgDQogICAgICAgICRjbXNtYWlsZXItPkFkZEFkZHJlc3MoJG9uZV9hZGRyZXNzKTsNCiAgICAgICAgDQogICAgICAgIGlmICgkYWRkcmVzc2VzWzBdPT0kb25lX2FkZHJlc3Mpew0KICAgICAgICAJJGNtc21haWxlci0+U2V0Qm9keSgkQ0N0ZXh0LiRib2R5dGV4dCk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgIAkkY21zbWFpbGVyLT5TZXRCb2R5KCRUT3RleHQuJGJvZHl0ZXh0KTsNCiAgICAgICAgfQ0KDQogICAgICAgICRjbXNtYWlsZXItPklzSFRNTCh0cnVlKTsNCiAgICAgICAgJGNtc21haWxlci0+U2V0U3ViamVjdCgnQ2xhc3Mgbm90aWZpY2F0aW9uLS0nLiRzdW1tYXJ5LicnKTsNCiAgICAgICAgJGNtc21haWxlci0+U2VuZCgpOw0KICAgICAgICAkY21zbWFpbGVyLT5DbGVhckFkZHJlc3NlcygpOw0KICAgIH0NCiAgICBlY2hvIk1haWwgc2VudCA8YnIvPiI7]]></data>
	</file>
</module>
